Merge tag 'upstream-go1.21.4'

Test: builds
Change-Id: I51ebec3387045e2d403ed4cb8d29e890930c802a
diff --git a/.github/SUPPORT.md b/.github/SUPPORT.md
index 2ec957a..d1fb277 100644
--- a/.github/SUPPORT.md
+++ b/.github/SUPPORT.md
@@ -1,5 +1,5 @@
 Unlike many projects on GitHub, the Go project does not use its bug tracker for general discussion or asking questions.
-We only use our bug tracker for tracking bugs and tracking proposals going through the [Proposal Process](https://golang.org/s/proposal-process).
+We only use our bug tracker for tracking bugs and tracking proposals going through the [Proposal Process](https://go.dev/s/proposal-process).
 
 For asking questions, see:
 
diff --git a/.gitignore b/.gitignore
index aa62a9f..7978d68 100644
--- a/.gitignore
+++ b/.gitignore
@@ -33,13 +33,13 @@
 /src/cmd/cgo/zdefaultcc.go
 /src/cmd/dist/dist
 /src/cmd/go/internal/cfg/zdefaultcc.go
-/src/cmd/go/internal/cfg/zosarch.go
 /src/cmd/internal/objabi/zbootstrap.go
 /src/go/build/zcgo.go
 /src/go/doc/headscan
 /src/internal/buildcfg/zbootstrap.go
 /src/runtime/internal/sys/zversion.go
 /src/unicode/maketables
+/src/time/tzdata/zzipdata.go
 /test.out
 /test/garbage/*.out
 /test/pass.out
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 7c1dd54..4cd76c2 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -24,7 +24,7 @@
 4. What did you expect to see?
 5. What did you see instead?
 
-For change proposals, see [Proposing Changes To Go](https://github.com/golang/proposal/).
+For change proposals, see [Proposing Changes To Go](https://go.dev/s/proposal-process).
 
 ## Contributing code
 
diff --git a/METADATA b/METADATA
index 822603c..f2874e4 100644
--- a/METADATA
+++ b/METADATA
@@ -10,7 +10,7 @@
     type: GIT
     value: "https://github.com/golang/go"
   }
-  version: "go1.20.2"
-  last_upgrade_date { year: 2023 month: 3 day: 15 }
+  version: "go1.21.4"
+  last_upgrade_date { year: 2023 month: 11 day: 8 }
   license_type: NOTICE
 }
diff --git a/VERSION b/VERSION
index 3acbb8f..74f07e5 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1,2 @@
-go1.20.2
\ No newline at end of file
+go1.21.4
+time 2023-11-01T20:46:39Z
diff --git a/api/except.txt b/api/except.txt
index efd00a9..5acc4d7 100644
--- a/api/except.txt
+++ b/api/except.txt
@@ -1,3 +1,4 @@
+pkg crypto/tls, type ConnectionState struct, TLSUnique //deprecated
 pkg debug/elf, const R_PPC64_SECTOFF_LO_DS = 61
 pkg encoding/json, method (*RawMessage) MarshalJSON() ([]uint8, error)
 pkg math, const MaxFloat64 = 1.79769e+308  // 179769313486231570814527423731704356798100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
@@ -501,6 +502,7 @@
 pkg unicode, const Version = "10.0.0"
 pkg unicode, const Version = "11.0.0"
 pkg unicode, const Version = "12.0.0"
+pkg unicode, const Version = "13.0.0"
 pkg unicode, const Version = "6.2.0"
 pkg unicode, const Version = "6.3.0"
 pkg unicode, const Version = "7.0.0"
@@ -574,3 +576,25 @@
 pkg syscall (freebsd-arm-cgo), const SYS_STAT = 188
 pkg syscall (freebsd-arm-cgo), const SYS_STAT ideal-int
 pkg syscall (freebsd-arm-cgo), const SYS_STATFS = 396
+pkg syscall (freebsd-arm64), const SYS_FSTAT = 189
+pkg syscall (freebsd-arm64), const SYS_FSTATAT = 493
+pkg syscall (freebsd-arm64), const SYS_FSTATFS = 397
+pkg syscall (freebsd-arm64), const SYS_GETDIRENTRIES = 196
+pkg syscall (freebsd-arm64), const SYS_GETFSSTAT = 395
+pkg syscall (freebsd-arm64), const SYS_LSTAT = 190
+pkg syscall (freebsd-arm64), const SYS_LSTAT ideal-int
+pkg syscall (freebsd-arm64), const SYS_MKNODAT = 498
+pkg syscall (freebsd-arm64), const SYS_STAT = 188
+pkg syscall (freebsd-arm64), const SYS_STAT ideal-int
+pkg syscall (freebsd-arm64), const SYS_STATFS = 396
+pkg syscall (freebsd-arm64-cgo), const SYS_FSTAT = 189
+pkg syscall (freebsd-arm64-cgo), const SYS_FSTATAT = 493
+pkg syscall (freebsd-arm64-cgo), const SYS_FSTATFS = 397
+pkg syscall (freebsd-arm64-cgo), const SYS_GETDIRENTRIES = 196
+pkg syscall (freebsd-arm64-cgo), const SYS_GETFSSTAT = 395
+pkg syscall (freebsd-arm64-cgo), const SYS_LSTAT = 190
+pkg syscall (freebsd-arm64-cgo), const SYS_LSTAT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_MKNODAT = 498
+pkg syscall (freebsd-arm64-cgo), const SYS_STAT = 188
+pkg syscall (freebsd-arm64-cgo), const SYS_STAT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_STATFS = 396
diff --git a/api/go1.14.txt b/api/go1.14.txt
index 3af0fee..0374649 100644
--- a/api/go1.14.txt
+++ b/api/go1.14.txt
@@ -195,3 +195,8720 @@
 pkg unicode, var Nandinagari *RangeTable
 pkg unicode, var Nyiakeng_Puachue_Hmong *RangeTable
 pkg unicode, var Wancho *RangeTable
+# freebsd arm64 port
+pkg log/syslog (freebsd-arm64), const LOG_ALERT = 1
+pkg log/syslog (freebsd-arm64), const LOG_ALERT Priority
+pkg log/syslog (freebsd-arm64), const LOG_AUTH = 32
+pkg log/syslog (freebsd-arm64), const LOG_AUTH Priority
+pkg log/syslog (freebsd-arm64), const LOG_AUTHPRIV = 80
+pkg log/syslog (freebsd-arm64), const LOG_AUTHPRIV Priority
+pkg log/syslog (freebsd-arm64), const LOG_CRIT = 2
+pkg log/syslog (freebsd-arm64), const LOG_CRIT Priority
+pkg log/syslog (freebsd-arm64), const LOG_CRON = 72
+pkg log/syslog (freebsd-arm64), const LOG_CRON Priority
+pkg log/syslog (freebsd-arm64), const LOG_DAEMON = 24
+pkg log/syslog (freebsd-arm64), const LOG_DAEMON Priority
+pkg log/syslog (freebsd-arm64), const LOG_DEBUG = 7
+pkg log/syslog (freebsd-arm64), const LOG_DEBUG Priority
+pkg log/syslog (freebsd-arm64), const LOG_EMERG = 0
+pkg log/syslog (freebsd-arm64), const LOG_EMERG Priority
+pkg log/syslog (freebsd-arm64), const LOG_ERR = 3
+pkg log/syslog (freebsd-arm64), const LOG_ERR Priority
+pkg log/syslog (freebsd-arm64), const LOG_FTP = 88
+pkg log/syslog (freebsd-arm64), const LOG_FTP Priority
+pkg log/syslog (freebsd-arm64), const LOG_INFO = 6
+pkg log/syslog (freebsd-arm64), const LOG_INFO Priority
+pkg log/syslog (freebsd-arm64), const LOG_KERN = 0
+pkg log/syslog (freebsd-arm64), const LOG_KERN Priority
+pkg log/syslog (freebsd-arm64), const LOG_LOCAL0 = 128
+pkg log/syslog (freebsd-arm64), const LOG_LOCAL0 Priority
+pkg log/syslog (freebsd-arm64), const LOG_LOCAL1 = 136
+pkg log/syslog (freebsd-arm64), const LOG_LOCAL1 Priority
+pkg log/syslog (freebsd-arm64), const LOG_LOCAL2 = 144
+pkg log/syslog (freebsd-arm64), const LOG_LOCAL2 Priority
+pkg log/syslog (freebsd-arm64), const LOG_LOCAL3 = 152
+pkg log/syslog (freebsd-arm64), const LOG_LOCAL3 Priority
+pkg log/syslog (freebsd-arm64), const LOG_LOCAL4 = 160
+pkg log/syslog (freebsd-arm64), const LOG_LOCAL4 Priority
+pkg log/syslog (freebsd-arm64), const LOG_LOCAL5 = 168
+pkg log/syslog (freebsd-arm64), const LOG_LOCAL5 Priority
+pkg log/syslog (freebsd-arm64), const LOG_LOCAL6 = 176
+pkg log/syslog (freebsd-arm64), const LOG_LOCAL6 Priority
+pkg log/syslog (freebsd-arm64), const LOG_LOCAL7 = 184
+pkg log/syslog (freebsd-arm64), const LOG_LOCAL7 Priority
+pkg log/syslog (freebsd-arm64), const LOG_LPR = 48
+pkg log/syslog (freebsd-arm64), const LOG_LPR Priority
+pkg log/syslog (freebsd-arm64), const LOG_MAIL = 16
+pkg log/syslog (freebsd-arm64), const LOG_MAIL Priority
+pkg log/syslog (freebsd-arm64), const LOG_NEWS = 56
+pkg log/syslog (freebsd-arm64), const LOG_NEWS Priority
+pkg log/syslog (freebsd-arm64), const LOG_NOTICE = 5
+pkg log/syslog (freebsd-arm64), const LOG_NOTICE Priority
+pkg log/syslog (freebsd-arm64), const LOG_SYSLOG = 40
+pkg log/syslog (freebsd-arm64), const LOG_SYSLOG Priority
+pkg log/syslog (freebsd-arm64), const LOG_USER = 8
+pkg log/syslog (freebsd-arm64), const LOG_USER Priority
+pkg log/syslog (freebsd-arm64), const LOG_UUCP = 64
+pkg log/syslog (freebsd-arm64), const LOG_UUCP Priority
+pkg log/syslog (freebsd-arm64), const LOG_WARNING = 4
+pkg log/syslog (freebsd-arm64), const LOG_WARNING Priority
+pkg log/syslog (freebsd-arm64), func Dial(string, string, Priority, string) (*Writer, error)
+pkg log/syslog (freebsd-arm64), func New(Priority, string) (*Writer, error)
+pkg log/syslog (freebsd-arm64), func NewLogger(Priority, int) (*log.Logger, error)
+pkg log/syslog (freebsd-arm64), method (*Writer) Alert(string) error
+pkg log/syslog (freebsd-arm64), method (*Writer) Close() error
+pkg log/syslog (freebsd-arm64), method (*Writer) Crit(string) error
+pkg log/syslog (freebsd-arm64), method (*Writer) Debug(string) error
+pkg log/syslog (freebsd-arm64), method (*Writer) Emerg(string) error
+pkg log/syslog (freebsd-arm64), method (*Writer) Err(string) error
+pkg log/syslog (freebsd-arm64), method (*Writer) Info(string) error
+pkg log/syslog (freebsd-arm64), method (*Writer) Notice(string) error
+pkg log/syslog (freebsd-arm64), method (*Writer) Warning(string) error
+pkg log/syslog (freebsd-arm64), method (*Writer) Write([]uint8) (int, error)
+pkg log/syslog (freebsd-arm64), type Priority int
+pkg log/syslog (freebsd-arm64), type Writer struct
+pkg log/syslog (freebsd-arm64-cgo), const LOG_ALERT = 1
+pkg log/syslog (freebsd-arm64-cgo), const LOG_ALERT Priority
+pkg log/syslog (freebsd-arm64-cgo), const LOG_AUTH = 32
+pkg log/syslog (freebsd-arm64-cgo), const LOG_AUTH Priority
+pkg log/syslog (freebsd-arm64-cgo), const LOG_AUTHPRIV = 80
+pkg log/syslog (freebsd-arm64-cgo), const LOG_AUTHPRIV Priority
+pkg log/syslog (freebsd-arm64-cgo), const LOG_CRIT = 2
+pkg log/syslog (freebsd-arm64-cgo), const LOG_CRIT Priority
+pkg log/syslog (freebsd-arm64-cgo), const LOG_CRON = 72
+pkg log/syslog (freebsd-arm64-cgo), const LOG_CRON Priority
+pkg log/syslog (freebsd-arm64-cgo), const LOG_DAEMON = 24
+pkg log/syslog (freebsd-arm64-cgo), const LOG_DAEMON Priority
+pkg log/syslog (freebsd-arm64-cgo), const LOG_DEBUG = 7
+pkg log/syslog (freebsd-arm64-cgo), const LOG_DEBUG Priority
+pkg log/syslog (freebsd-arm64-cgo), const LOG_EMERG = 0
+pkg log/syslog (freebsd-arm64-cgo), const LOG_EMERG Priority
+pkg log/syslog (freebsd-arm64-cgo), const LOG_ERR = 3
+pkg log/syslog (freebsd-arm64-cgo), const LOG_ERR Priority
+pkg log/syslog (freebsd-arm64-cgo), const LOG_FTP = 88
+pkg log/syslog (freebsd-arm64-cgo), const LOG_FTP Priority
+pkg log/syslog (freebsd-arm64-cgo), const LOG_INFO = 6
+pkg log/syslog (freebsd-arm64-cgo), const LOG_INFO Priority
+pkg log/syslog (freebsd-arm64-cgo), const LOG_KERN = 0
+pkg log/syslog (freebsd-arm64-cgo), const LOG_KERN Priority
+pkg log/syslog (freebsd-arm64-cgo), const LOG_LOCAL0 = 128
+pkg log/syslog (freebsd-arm64-cgo), const LOG_LOCAL0 Priority
+pkg log/syslog (freebsd-arm64-cgo), const LOG_LOCAL1 = 136
+pkg log/syslog (freebsd-arm64-cgo), const LOG_LOCAL1 Priority
+pkg log/syslog (freebsd-arm64-cgo), const LOG_LOCAL2 = 144
+pkg log/syslog (freebsd-arm64-cgo), const LOG_LOCAL2 Priority
+pkg log/syslog (freebsd-arm64-cgo), const LOG_LOCAL3 = 152
+pkg log/syslog (freebsd-arm64-cgo), const LOG_LOCAL3 Priority
+pkg log/syslog (freebsd-arm64-cgo), const LOG_LOCAL4 = 160
+pkg log/syslog (freebsd-arm64-cgo), const LOG_LOCAL4 Priority
+pkg log/syslog (freebsd-arm64-cgo), const LOG_LOCAL5 = 168
+pkg log/syslog (freebsd-arm64-cgo), const LOG_LOCAL5 Priority
+pkg log/syslog (freebsd-arm64-cgo), const LOG_LOCAL6 = 176
+pkg log/syslog (freebsd-arm64-cgo), const LOG_LOCAL6 Priority
+pkg log/syslog (freebsd-arm64-cgo), const LOG_LOCAL7 = 184
+pkg log/syslog (freebsd-arm64-cgo), const LOG_LOCAL7 Priority
+pkg log/syslog (freebsd-arm64-cgo), const LOG_LPR = 48
+pkg log/syslog (freebsd-arm64-cgo), const LOG_LPR Priority
+pkg log/syslog (freebsd-arm64-cgo), const LOG_MAIL = 16
+pkg log/syslog (freebsd-arm64-cgo), const LOG_MAIL Priority
+pkg log/syslog (freebsd-arm64-cgo), const LOG_NEWS = 56
+pkg log/syslog (freebsd-arm64-cgo), const LOG_NEWS Priority
+pkg log/syslog (freebsd-arm64-cgo), const LOG_NOTICE = 5
+pkg log/syslog (freebsd-arm64-cgo), const LOG_NOTICE Priority
+pkg log/syslog (freebsd-arm64-cgo), const LOG_SYSLOG = 40
+pkg log/syslog (freebsd-arm64-cgo), const LOG_SYSLOG Priority
+pkg log/syslog (freebsd-arm64-cgo), const LOG_USER = 8
+pkg log/syslog (freebsd-arm64-cgo), const LOG_USER Priority
+pkg log/syslog (freebsd-arm64-cgo), const LOG_UUCP = 64
+pkg log/syslog (freebsd-arm64-cgo), const LOG_UUCP Priority
+pkg log/syslog (freebsd-arm64-cgo), const LOG_WARNING = 4
+pkg log/syslog (freebsd-arm64-cgo), const LOG_WARNING Priority
+pkg log/syslog (freebsd-arm64-cgo), func Dial(string, string, Priority, string) (*Writer, error)
+pkg log/syslog (freebsd-arm64-cgo), func New(Priority, string) (*Writer, error)
+pkg log/syslog (freebsd-arm64-cgo), func NewLogger(Priority, int) (*log.Logger, error)
+pkg log/syslog (freebsd-arm64-cgo), method (*Writer) Alert(string) error
+pkg log/syslog (freebsd-arm64-cgo), method (*Writer) Close() error
+pkg log/syslog (freebsd-arm64-cgo), method (*Writer) Crit(string) error
+pkg log/syslog (freebsd-arm64-cgo), method (*Writer) Debug(string) error
+pkg log/syslog (freebsd-arm64-cgo), method (*Writer) Emerg(string) error
+pkg log/syslog (freebsd-arm64-cgo), method (*Writer) Err(string) error
+pkg log/syslog (freebsd-arm64-cgo), method (*Writer) Info(string) error
+pkg log/syslog (freebsd-arm64-cgo), method (*Writer) Notice(string) error
+pkg log/syslog (freebsd-arm64-cgo), method (*Writer) Warning(string) error
+pkg log/syslog (freebsd-arm64-cgo), method (*Writer) Write([]uint8) (int, error)
+pkg log/syslog (freebsd-arm64-cgo), type Priority int
+pkg log/syslog (freebsd-arm64-cgo), type Writer struct
+pkg math/bits (freebsd-arm64), const UintSize = 64
+pkg math/bits (freebsd-arm64-cgo), const UintSize = 64
+pkg os (freebsd-arm64), const DevNull = "/dev/null"
+pkg os (freebsd-arm64), const O_APPEND = 8
+pkg os (freebsd-arm64), const O_CREATE = 512
+pkg os (freebsd-arm64), const O_EXCL = 2048
+pkg os (freebsd-arm64), const O_SYNC = 128
+pkg os (freebsd-arm64), const O_TRUNC = 1024
+pkg os (freebsd-arm64), const PathListSeparator = 58
+pkg os (freebsd-arm64), const PathSeparator = 47
+pkg os (freebsd-arm64-cgo), const DevNull = "/dev/null"
+pkg os (freebsd-arm64-cgo), const O_APPEND = 8
+pkg os (freebsd-arm64-cgo), const O_CREATE = 512
+pkg os (freebsd-arm64-cgo), const O_EXCL = 2048
+pkg os (freebsd-arm64-cgo), const O_SYNC = 128
+pkg os (freebsd-arm64-cgo), const O_TRUNC = 1024
+pkg os (freebsd-arm64-cgo), const PathListSeparator = 58
+pkg os (freebsd-arm64-cgo), const PathSeparator = 47
+pkg path/filepath (freebsd-arm64), const ListSeparator = 58
+pkg path/filepath (freebsd-arm64), const Separator = 47
+pkg path/filepath (freebsd-arm64-cgo), const ListSeparator = 58
+pkg path/filepath (freebsd-arm64-cgo), const Separator = 47
+pkg runtime (freebsd-arm64), const GOARCH = "arm64"
+pkg runtime (freebsd-arm64), const GOOS = "freebsd"
+pkg runtime (freebsd-arm64-cgo), const GOARCH = "arm64"
+pkg runtime (freebsd-arm64-cgo), const GOOS = "freebsd"
+pkg strconv (freebsd-arm64), const IntSize = 64
+pkg strconv (freebsd-arm64-cgo), const IntSize = 64
+pkg syscall (freebsd-arm64), const AF_APPLETALK = 16
+pkg syscall (freebsd-arm64), const AF_APPLETALK ideal-int
+pkg syscall (freebsd-arm64), const AF_ARP = 35
+pkg syscall (freebsd-arm64), const AF_ARP ideal-int
+pkg syscall (freebsd-arm64), const AF_ATM = 30
+pkg syscall (freebsd-arm64), const AF_ATM ideal-int
+pkg syscall (freebsd-arm64), const AF_BLUETOOTH = 36
+pkg syscall (freebsd-arm64), const AF_BLUETOOTH ideal-int
+pkg syscall (freebsd-arm64), const AF_CCITT = 10
+pkg syscall (freebsd-arm64), const AF_CCITT ideal-int
+pkg syscall (freebsd-arm64), const AF_CHAOS = 5
+pkg syscall (freebsd-arm64), const AF_CHAOS ideal-int
+pkg syscall (freebsd-arm64), const AF_CNT = 21
+pkg syscall (freebsd-arm64), const AF_CNT ideal-int
+pkg syscall (freebsd-arm64), const AF_COIP = 20
+pkg syscall (freebsd-arm64), const AF_COIP ideal-int
+pkg syscall (freebsd-arm64), const AF_DATAKIT = 9
+pkg syscall (freebsd-arm64), const AF_DATAKIT ideal-int
+pkg syscall (freebsd-arm64), const AF_DECnet = 12
+pkg syscall (freebsd-arm64), const AF_DECnet ideal-int
+pkg syscall (freebsd-arm64), const AF_DLI = 13
+pkg syscall (freebsd-arm64), const AF_DLI ideal-int
+pkg syscall (freebsd-arm64), const AF_E164 = 26
+pkg syscall (freebsd-arm64), const AF_E164 ideal-int
+pkg syscall (freebsd-arm64), const AF_ECMA = 8
+pkg syscall (freebsd-arm64), const AF_ECMA ideal-int
+pkg syscall (freebsd-arm64), const AF_HYLINK = 15
+pkg syscall (freebsd-arm64), const AF_HYLINK ideal-int
+pkg syscall (freebsd-arm64), const AF_IEEE80211 = 37
+pkg syscall (freebsd-arm64), const AF_IEEE80211 ideal-int
+pkg syscall (freebsd-arm64), const AF_IMPLINK = 3
+pkg syscall (freebsd-arm64), const AF_IMPLINK ideal-int
+pkg syscall (freebsd-arm64), const AF_INET_SDP = 40
+pkg syscall (freebsd-arm64), const AF_INET_SDP ideal-int
+pkg syscall (freebsd-arm64), const AF_INET6 = 28
+pkg syscall (freebsd-arm64), const AF_INET6_SDP = 42
+pkg syscall (freebsd-arm64), const AF_INET6_SDP ideal-int
+pkg syscall (freebsd-arm64), const AF_IPX = 23
+pkg syscall (freebsd-arm64), const AF_IPX ideal-int
+pkg syscall (freebsd-arm64), const AF_ISDN = 26
+pkg syscall (freebsd-arm64), const AF_ISDN ideal-int
+pkg syscall (freebsd-arm64), const AF_ISO = 7
+pkg syscall (freebsd-arm64), const AF_ISO ideal-int
+pkg syscall (freebsd-arm64), const AF_LAT = 14
+pkg syscall (freebsd-arm64), const AF_LAT ideal-int
+pkg syscall (freebsd-arm64), const AF_LINK = 18
+pkg syscall (freebsd-arm64), const AF_LINK ideal-int
+pkg syscall (freebsd-arm64), const AF_LOCAL = 1
+pkg syscall (freebsd-arm64), const AF_LOCAL ideal-int
+pkg syscall (freebsd-arm64), const AF_MAX = 42
+pkg syscall (freebsd-arm64), const AF_MAX ideal-int
+pkg syscall (freebsd-arm64), const AF_NATM = 29
+pkg syscall (freebsd-arm64), const AF_NATM ideal-int
+pkg syscall (freebsd-arm64), const AF_NETBIOS = 6
+pkg syscall (freebsd-arm64), const AF_NETBIOS ideal-int
+pkg syscall (freebsd-arm64), const AF_NETGRAPH = 32
+pkg syscall (freebsd-arm64), const AF_NETGRAPH ideal-int
+pkg syscall (freebsd-arm64), const AF_OSI = 7
+pkg syscall (freebsd-arm64), const AF_OSI ideal-int
+pkg syscall (freebsd-arm64), const AF_PUP = 4
+pkg syscall (freebsd-arm64), const AF_PUP ideal-int
+pkg syscall (freebsd-arm64), const AF_ROUTE = 17
+pkg syscall (freebsd-arm64), const AF_ROUTE ideal-int
+pkg syscall (freebsd-arm64), const AF_SCLUSTER = 34
+pkg syscall (freebsd-arm64), const AF_SCLUSTER ideal-int
+pkg syscall (freebsd-arm64), const AF_SIP = 24
+pkg syscall (freebsd-arm64), const AF_SIP ideal-int
+pkg syscall (freebsd-arm64), const AF_SLOW = 33
+pkg syscall (freebsd-arm64), const AF_SLOW ideal-int
+pkg syscall (freebsd-arm64), const AF_SNA = 11
+pkg syscall (freebsd-arm64), const AF_SNA ideal-int
+pkg syscall (freebsd-arm64), const AF_VENDOR00 = 39
+pkg syscall (freebsd-arm64), const AF_VENDOR00 ideal-int
+pkg syscall (freebsd-arm64), const AF_VENDOR01 = 41
+pkg syscall (freebsd-arm64), const AF_VENDOR01 ideal-int
+pkg syscall (freebsd-arm64), const AF_VENDOR02 = 43
+pkg syscall (freebsd-arm64), const AF_VENDOR02 ideal-int
+pkg syscall (freebsd-arm64), const AF_VENDOR03 = 45
+pkg syscall (freebsd-arm64), const AF_VENDOR03 ideal-int
+pkg syscall (freebsd-arm64), const AF_VENDOR04 = 47
+pkg syscall (freebsd-arm64), const AF_VENDOR04 ideal-int
+pkg syscall (freebsd-arm64), const AF_VENDOR05 = 49
+pkg syscall (freebsd-arm64), const AF_VENDOR05 ideal-int
+pkg syscall (freebsd-arm64), const AF_VENDOR06 = 51
+pkg syscall (freebsd-arm64), const AF_VENDOR06 ideal-int
+pkg syscall (freebsd-arm64), const AF_VENDOR07 = 53
+pkg syscall (freebsd-arm64), const AF_VENDOR07 ideal-int
+pkg syscall (freebsd-arm64), const AF_VENDOR08 = 55
+pkg syscall (freebsd-arm64), const AF_VENDOR08 ideal-int
+pkg syscall (freebsd-arm64), const AF_VENDOR09 = 57
+pkg syscall (freebsd-arm64), const AF_VENDOR09 ideal-int
+pkg syscall (freebsd-arm64), const AF_VENDOR10 = 59
+pkg syscall (freebsd-arm64), const AF_VENDOR10 ideal-int
+pkg syscall (freebsd-arm64), const AF_VENDOR11 = 61
+pkg syscall (freebsd-arm64), const AF_VENDOR11 ideal-int
+pkg syscall (freebsd-arm64), const AF_VENDOR12 = 63
+pkg syscall (freebsd-arm64), const AF_VENDOR12 ideal-int
+pkg syscall (freebsd-arm64), const AF_VENDOR13 = 65
+pkg syscall (freebsd-arm64), const AF_VENDOR13 ideal-int
+pkg syscall (freebsd-arm64), const AF_VENDOR14 = 67
+pkg syscall (freebsd-arm64), const AF_VENDOR14 ideal-int
+pkg syscall (freebsd-arm64), const AF_VENDOR15 = 69
+pkg syscall (freebsd-arm64), const AF_VENDOR15 ideal-int
+pkg syscall (freebsd-arm64), const AF_VENDOR16 = 71
+pkg syscall (freebsd-arm64), const AF_VENDOR16 ideal-int
+pkg syscall (freebsd-arm64), const AF_VENDOR17 = 73
+pkg syscall (freebsd-arm64), const AF_VENDOR17 ideal-int
+pkg syscall (freebsd-arm64), const AF_VENDOR18 = 75
+pkg syscall (freebsd-arm64), const AF_VENDOR18 ideal-int
+pkg syscall (freebsd-arm64), const AF_VENDOR19 = 77
+pkg syscall (freebsd-arm64), const AF_VENDOR19 ideal-int
+pkg syscall (freebsd-arm64), const AF_VENDOR20 = 79
+pkg syscall (freebsd-arm64), const AF_VENDOR20 ideal-int
+pkg syscall (freebsd-arm64), const AF_VENDOR21 = 81
+pkg syscall (freebsd-arm64), const AF_VENDOR21 ideal-int
+pkg syscall (freebsd-arm64), const AF_VENDOR22 = 83
+pkg syscall (freebsd-arm64), const AF_VENDOR22 ideal-int
+pkg syscall (freebsd-arm64), const AF_VENDOR23 = 85
+pkg syscall (freebsd-arm64), const AF_VENDOR23 ideal-int
+pkg syscall (freebsd-arm64), const AF_VENDOR24 = 87
+pkg syscall (freebsd-arm64), const AF_VENDOR24 ideal-int
+pkg syscall (freebsd-arm64), const AF_VENDOR25 = 89
+pkg syscall (freebsd-arm64), const AF_VENDOR25 ideal-int
+pkg syscall (freebsd-arm64), const AF_VENDOR26 = 91
+pkg syscall (freebsd-arm64), const AF_VENDOR26 ideal-int
+pkg syscall (freebsd-arm64), const AF_VENDOR27 = 93
+pkg syscall (freebsd-arm64), const AF_VENDOR27 ideal-int
+pkg syscall (freebsd-arm64), const AF_VENDOR28 = 95
+pkg syscall (freebsd-arm64), const AF_VENDOR28 ideal-int
+pkg syscall (freebsd-arm64), const AF_VENDOR29 = 97
+pkg syscall (freebsd-arm64), const AF_VENDOR29 ideal-int
+pkg syscall (freebsd-arm64), const AF_VENDOR30 = 99
+pkg syscall (freebsd-arm64), const AF_VENDOR30 ideal-int
+pkg syscall (freebsd-arm64), const AF_VENDOR31 = 101
+pkg syscall (freebsd-arm64), const AF_VENDOR31 ideal-int
+pkg syscall (freebsd-arm64), const AF_VENDOR32 = 103
+pkg syscall (freebsd-arm64), const AF_VENDOR32 ideal-int
+pkg syscall (freebsd-arm64), const AF_VENDOR33 = 105
+pkg syscall (freebsd-arm64), const AF_VENDOR33 ideal-int
+pkg syscall (freebsd-arm64), const AF_VENDOR34 = 107
+pkg syscall (freebsd-arm64), const AF_VENDOR34 ideal-int
+pkg syscall (freebsd-arm64), const AF_VENDOR35 = 109
+pkg syscall (freebsd-arm64), const AF_VENDOR35 ideal-int
+pkg syscall (freebsd-arm64), const AF_VENDOR36 = 111
+pkg syscall (freebsd-arm64), const AF_VENDOR36 ideal-int
+pkg syscall (freebsd-arm64), const AF_VENDOR37 = 113
+pkg syscall (freebsd-arm64), const AF_VENDOR37 ideal-int
+pkg syscall (freebsd-arm64), const AF_VENDOR38 = 115
+pkg syscall (freebsd-arm64), const AF_VENDOR38 ideal-int
+pkg syscall (freebsd-arm64), const AF_VENDOR39 = 117
+pkg syscall (freebsd-arm64), const AF_VENDOR39 ideal-int
+pkg syscall (freebsd-arm64), const AF_VENDOR40 = 119
+pkg syscall (freebsd-arm64), const AF_VENDOR40 ideal-int
+pkg syscall (freebsd-arm64), const AF_VENDOR41 = 121
+pkg syscall (freebsd-arm64), const AF_VENDOR41 ideal-int
+pkg syscall (freebsd-arm64), const AF_VENDOR42 = 123
+pkg syscall (freebsd-arm64), const AF_VENDOR42 ideal-int
+pkg syscall (freebsd-arm64), const AF_VENDOR43 = 125
+pkg syscall (freebsd-arm64), const AF_VENDOR43 ideal-int
+pkg syscall (freebsd-arm64), const AF_VENDOR44 = 127
+pkg syscall (freebsd-arm64), const AF_VENDOR44 ideal-int
+pkg syscall (freebsd-arm64), const AF_VENDOR45 = 129
+pkg syscall (freebsd-arm64), const AF_VENDOR45 ideal-int
+pkg syscall (freebsd-arm64), const AF_VENDOR46 = 131
+pkg syscall (freebsd-arm64), const AF_VENDOR46 ideal-int
+pkg syscall (freebsd-arm64), const AF_VENDOR47 = 133
+pkg syscall (freebsd-arm64), const AF_VENDOR47 ideal-int
+pkg syscall (freebsd-arm64), const B0 = 0
+pkg syscall (freebsd-arm64), const B0 ideal-int
+pkg syscall (freebsd-arm64), const B110 = 110
+pkg syscall (freebsd-arm64), const B110 ideal-int
+pkg syscall (freebsd-arm64), const B115200 = 115200
+pkg syscall (freebsd-arm64), const B115200 ideal-int
+pkg syscall (freebsd-arm64), const B1200 = 1200
+pkg syscall (freebsd-arm64), const B1200 ideal-int
+pkg syscall (freebsd-arm64), const B134 = 134
+pkg syscall (freebsd-arm64), const B134 ideal-int
+pkg syscall (freebsd-arm64), const B14400 = 14400
+pkg syscall (freebsd-arm64), const B14400 ideal-int
+pkg syscall (freebsd-arm64), const B150 = 150
+pkg syscall (freebsd-arm64), const B150 ideal-int
+pkg syscall (freebsd-arm64), const B1800 = 1800
+pkg syscall (freebsd-arm64), const B1800 ideal-int
+pkg syscall (freebsd-arm64), const B19200 = 19200
+pkg syscall (freebsd-arm64), const B19200 ideal-int
+pkg syscall (freebsd-arm64), const B200 = 200
+pkg syscall (freebsd-arm64), const B200 ideal-int
+pkg syscall (freebsd-arm64), const B230400 = 230400
+pkg syscall (freebsd-arm64), const B230400 ideal-int
+pkg syscall (freebsd-arm64), const B2400 = 2400
+pkg syscall (freebsd-arm64), const B2400 ideal-int
+pkg syscall (freebsd-arm64), const B28800 = 28800
+pkg syscall (freebsd-arm64), const B28800 ideal-int
+pkg syscall (freebsd-arm64), const B300 = 300
+pkg syscall (freebsd-arm64), const B300 ideal-int
+pkg syscall (freebsd-arm64), const B38400 = 38400
+pkg syscall (freebsd-arm64), const B38400 ideal-int
+pkg syscall (freebsd-arm64), const B460800 = 460800
+pkg syscall (freebsd-arm64), const B460800 ideal-int
+pkg syscall (freebsd-arm64), const B4800 = 4800
+pkg syscall (freebsd-arm64), const B4800 ideal-int
+pkg syscall (freebsd-arm64), const B50 = 50
+pkg syscall (freebsd-arm64), const B50 ideal-int
+pkg syscall (freebsd-arm64), const B57600 = 57600
+pkg syscall (freebsd-arm64), const B57600 ideal-int
+pkg syscall (freebsd-arm64), const B600 = 600
+pkg syscall (freebsd-arm64), const B600 ideal-int
+pkg syscall (freebsd-arm64), const B7200 = 7200
+pkg syscall (freebsd-arm64), const B7200 ideal-int
+pkg syscall (freebsd-arm64), const B75 = 75
+pkg syscall (freebsd-arm64), const B75 ideal-int
+pkg syscall (freebsd-arm64), const B76800 = 76800
+pkg syscall (freebsd-arm64), const B76800 ideal-int
+pkg syscall (freebsd-arm64), const B921600 = 921600
+pkg syscall (freebsd-arm64), const B921600 ideal-int
+pkg syscall (freebsd-arm64), const B9600 = 9600
+pkg syscall (freebsd-arm64), const B9600 ideal-int
+pkg syscall (freebsd-arm64), const BIOCFEEDBACK = 2147762812
+pkg syscall (freebsd-arm64), const BIOCFEEDBACK ideal-int
+pkg syscall (freebsd-arm64), const BIOCFLUSH = 536887912
+pkg syscall (freebsd-arm64), const BIOCFLUSH ideal-int
+pkg syscall (freebsd-arm64), const BIOCGBLEN = 1074020966
+pkg syscall (freebsd-arm64), const BIOCGBLEN ideal-int
+pkg syscall (freebsd-arm64), const BIOCGDIRECTION = 1074020982
+pkg syscall (freebsd-arm64), const BIOCGDIRECTION ideal-int
+pkg syscall (freebsd-arm64), const BIOCGDLT = 1074020970
+pkg syscall (freebsd-arm64), const BIOCGDLT ideal-int
+pkg syscall (freebsd-arm64), const BIOCGDLTLIST = 3222291065
+pkg syscall (freebsd-arm64), const BIOCGDLTLIST ideal-int
+pkg syscall (freebsd-arm64), const BIOCGETBUFMODE = 1074020989
+pkg syscall (freebsd-arm64), const BIOCGETBUFMODE ideal-int
+pkg syscall (freebsd-arm64), const BIOCGETIF = 1075855979
+pkg syscall (freebsd-arm64), const BIOCGETIF ideal-int
+pkg syscall (freebsd-arm64), const BIOCGETZMAX = 1074283135
+pkg syscall (freebsd-arm64), const BIOCGETZMAX ideal-int
+pkg syscall (freebsd-arm64), const BIOCGHDRCMPLT = 1074020980
+pkg syscall (freebsd-arm64), const BIOCGHDRCMPLT ideal-int
+pkg syscall (freebsd-arm64), const BIOCGRSIG = 1074020978
+pkg syscall (freebsd-arm64), const BIOCGRSIG ideal-int
+pkg syscall (freebsd-arm64), const BIOCGRTIMEOUT = 1074807406
+pkg syscall (freebsd-arm64), const BIOCGRTIMEOUT ideal-int
+pkg syscall (freebsd-arm64), const BIOCGSEESENT = 1074020982
+pkg syscall (freebsd-arm64), const BIOCGSEESENT ideal-int
+pkg syscall (freebsd-arm64), const BIOCGSTATS = 1074283119
+pkg syscall (freebsd-arm64), const BIOCGSTATS ideal-int
+pkg syscall (freebsd-arm64), const BIOCGTSTAMP = 1074020995
+pkg syscall (freebsd-arm64), const BIOCGTSTAMP ideal-int
+pkg syscall (freebsd-arm64), const BIOCIMMEDIATE = 2147762800
+pkg syscall (freebsd-arm64), const BIOCIMMEDIATE ideal-int
+pkg syscall (freebsd-arm64), const BIOCLOCK = 536887930
+pkg syscall (freebsd-arm64), const BIOCLOCK ideal-int
+pkg syscall (freebsd-arm64), const BIOCPROMISC = 536887913
+pkg syscall (freebsd-arm64), const BIOCPROMISC ideal-int
+pkg syscall (freebsd-arm64), const BIOCROTZBUF = 1075331712
+pkg syscall (freebsd-arm64), const BIOCROTZBUF ideal-int
+pkg syscall (freebsd-arm64), const BIOCSBLEN = 3221504614
+pkg syscall (freebsd-arm64), const BIOCSBLEN ideal-int
+pkg syscall (freebsd-arm64), const BIOCSDIRECTION = 2147762807
+pkg syscall (freebsd-arm64), const BIOCSDIRECTION ideal-int
+pkg syscall (freebsd-arm64), const BIOCSDLT = 2147762808
+pkg syscall (freebsd-arm64), const BIOCSDLT ideal-int
+pkg syscall (freebsd-arm64), const BIOCSETBUFMODE = 2147762814
+pkg syscall (freebsd-arm64), const BIOCSETBUFMODE ideal-int
+pkg syscall (freebsd-arm64), const BIOCSETF = 2148549223
+pkg syscall (freebsd-arm64), const BIOCSETF ideal-int
+pkg syscall (freebsd-arm64), const BIOCSETFNR = 2148549250
+pkg syscall (freebsd-arm64), const BIOCSETFNR ideal-int
+pkg syscall (freebsd-arm64), const BIOCSETIF = 2149597804
+pkg syscall (freebsd-arm64), const BIOCSETIF ideal-int
+pkg syscall (freebsd-arm64), const BIOCSETWF = 2148549243
+pkg syscall (freebsd-arm64), const BIOCSETWF ideal-int
+pkg syscall (freebsd-arm64), const BIOCSETZBUF = 2149073537
+pkg syscall (freebsd-arm64), const BIOCSETZBUF ideal-int
+pkg syscall (freebsd-arm64), const BIOCSHDRCMPLT = 2147762805
+pkg syscall (freebsd-arm64), const BIOCSHDRCMPLT ideal-int
+pkg syscall (freebsd-arm64), const BIOCSRSIG = 2147762803
+pkg syscall (freebsd-arm64), const BIOCSRSIG ideal-int
+pkg syscall (freebsd-arm64), const BIOCSRTIMEOUT = 2148549229
+pkg syscall (freebsd-arm64), const BIOCSRTIMEOUT ideal-int
+pkg syscall (freebsd-arm64), const BIOCSSEESENT = 2147762807
+pkg syscall (freebsd-arm64), const BIOCSSEESENT ideal-int
+pkg syscall (freebsd-arm64), const BIOCSTSTAMP = 2147762820
+pkg syscall (freebsd-arm64), const BIOCSTSTAMP ideal-int
+pkg syscall (freebsd-arm64), const BIOCVERSION = 1074020977
+pkg syscall (freebsd-arm64), const BIOCVERSION ideal-int
+pkg syscall (freebsd-arm64), const BPF_A = 16
+pkg syscall (freebsd-arm64), const BPF_A ideal-int
+pkg syscall (freebsd-arm64), const BPF_ABS = 32
+pkg syscall (freebsd-arm64), const BPF_ABS ideal-int
+pkg syscall (freebsd-arm64), const BPF_ADD = 0
+pkg syscall (freebsd-arm64), const BPF_ADD ideal-int
+pkg syscall (freebsd-arm64), const BPF_ALIGNMENT = 8
+pkg syscall (freebsd-arm64), const BPF_ALIGNMENT ideal-int
+pkg syscall (freebsd-arm64), const BPF_ALU = 4
+pkg syscall (freebsd-arm64), const BPF_ALU ideal-int
+pkg syscall (freebsd-arm64), const BPF_AND = 80
+pkg syscall (freebsd-arm64), const BPF_AND ideal-int
+pkg syscall (freebsd-arm64), const BPF_B = 16
+pkg syscall (freebsd-arm64), const BPF_B ideal-int
+pkg syscall (freebsd-arm64), const BPF_BUFMODE_BUFFER = 1
+pkg syscall (freebsd-arm64), const BPF_BUFMODE_BUFFER ideal-int
+pkg syscall (freebsd-arm64), const BPF_BUFMODE_ZBUF = 2
+pkg syscall (freebsd-arm64), const BPF_BUFMODE_ZBUF ideal-int
+pkg syscall (freebsd-arm64), const BPF_DIV = 48
+pkg syscall (freebsd-arm64), const BPF_DIV ideal-int
+pkg syscall (freebsd-arm64), const BPF_H = 8
+pkg syscall (freebsd-arm64), const BPF_H ideal-int
+pkg syscall (freebsd-arm64), const BPF_IMM = 0
+pkg syscall (freebsd-arm64), const BPF_IMM ideal-int
+pkg syscall (freebsd-arm64), const BPF_IND = 64
+pkg syscall (freebsd-arm64), const BPF_IND ideal-int
+pkg syscall (freebsd-arm64), const BPF_JA = 0
+pkg syscall (freebsd-arm64), const BPF_JA ideal-int
+pkg syscall (freebsd-arm64), const BPF_JEQ = 16
+pkg syscall (freebsd-arm64), const BPF_JEQ ideal-int
+pkg syscall (freebsd-arm64), const BPF_JGE = 48
+pkg syscall (freebsd-arm64), const BPF_JGE ideal-int
+pkg syscall (freebsd-arm64), const BPF_JGT = 32
+pkg syscall (freebsd-arm64), const BPF_JGT ideal-int
+pkg syscall (freebsd-arm64), const BPF_JMP = 5
+pkg syscall (freebsd-arm64), const BPF_JMP ideal-int
+pkg syscall (freebsd-arm64), const BPF_JSET = 64
+pkg syscall (freebsd-arm64), const BPF_JSET ideal-int
+pkg syscall (freebsd-arm64), const BPF_K = 0
+pkg syscall (freebsd-arm64), const BPF_K ideal-int
+pkg syscall (freebsd-arm64), const BPF_LD = 0
+pkg syscall (freebsd-arm64), const BPF_LD ideal-int
+pkg syscall (freebsd-arm64), const BPF_LDX = 1
+pkg syscall (freebsd-arm64), const BPF_LDX ideal-int
+pkg syscall (freebsd-arm64), const BPF_LEN = 128
+pkg syscall (freebsd-arm64), const BPF_LEN ideal-int
+pkg syscall (freebsd-arm64), const BPF_LSH = 96
+pkg syscall (freebsd-arm64), const BPF_LSH ideal-int
+pkg syscall (freebsd-arm64), const BPF_MAJOR_VERSION = 1
+pkg syscall (freebsd-arm64), const BPF_MAJOR_VERSION ideal-int
+pkg syscall (freebsd-arm64), const BPF_MAXBUFSIZE = 524288
+pkg syscall (freebsd-arm64), const BPF_MAXBUFSIZE ideal-int
+pkg syscall (freebsd-arm64), const BPF_MAXINSNS = 512
+pkg syscall (freebsd-arm64), const BPF_MAXINSNS ideal-int
+pkg syscall (freebsd-arm64), const BPF_MEM = 96
+pkg syscall (freebsd-arm64), const BPF_MEM ideal-int
+pkg syscall (freebsd-arm64), const BPF_MEMWORDS = 16
+pkg syscall (freebsd-arm64), const BPF_MEMWORDS ideal-int
+pkg syscall (freebsd-arm64), const BPF_MINBUFSIZE = 32
+pkg syscall (freebsd-arm64), const BPF_MINBUFSIZE ideal-int
+pkg syscall (freebsd-arm64), const BPF_MINOR_VERSION = 1
+pkg syscall (freebsd-arm64), const BPF_MINOR_VERSION ideal-int
+pkg syscall (freebsd-arm64), const BPF_MISC = 7
+pkg syscall (freebsd-arm64), const BPF_MISC ideal-int
+pkg syscall (freebsd-arm64), const BPF_MSH = 160
+pkg syscall (freebsd-arm64), const BPF_MSH ideal-int
+pkg syscall (freebsd-arm64), const BPF_MUL = 32
+pkg syscall (freebsd-arm64), const BPF_MUL ideal-int
+pkg syscall (freebsd-arm64), const BPF_NEG = 128
+pkg syscall (freebsd-arm64), const BPF_NEG ideal-int
+pkg syscall (freebsd-arm64), const BPF_OR = 64
+pkg syscall (freebsd-arm64), const BPF_OR ideal-int
+pkg syscall (freebsd-arm64), const BPF_RELEASE = 199606
+pkg syscall (freebsd-arm64), const BPF_RELEASE ideal-int
+pkg syscall (freebsd-arm64), const BPF_RET = 6
+pkg syscall (freebsd-arm64), const BPF_RET ideal-int
+pkg syscall (freebsd-arm64), const BPF_RSH = 112
+pkg syscall (freebsd-arm64), const BPF_RSH ideal-int
+pkg syscall (freebsd-arm64), const BPF_ST = 2
+pkg syscall (freebsd-arm64), const BPF_ST ideal-int
+pkg syscall (freebsd-arm64), const BPF_STX = 3
+pkg syscall (freebsd-arm64), const BPF_STX ideal-int
+pkg syscall (freebsd-arm64), const BPF_SUB = 16
+pkg syscall (freebsd-arm64), const BPF_SUB ideal-int
+pkg syscall (freebsd-arm64), const BPF_T_BINTIME = 2
+pkg syscall (freebsd-arm64), const BPF_T_BINTIME ideal-int
+pkg syscall (freebsd-arm64), const BPF_T_BINTIME_FAST = 258
+pkg syscall (freebsd-arm64), const BPF_T_BINTIME_FAST ideal-int
+pkg syscall (freebsd-arm64), const BPF_T_BINTIME_MONOTONIC = 514
+pkg syscall (freebsd-arm64), const BPF_T_BINTIME_MONOTONIC ideal-int
+pkg syscall (freebsd-arm64), const BPF_T_BINTIME_MONOTONIC_FAST = 770
+pkg syscall (freebsd-arm64), const BPF_T_BINTIME_MONOTONIC_FAST ideal-int
+pkg syscall (freebsd-arm64), const BPF_T_FAST = 256
+pkg syscall (freebsd-arm64), const BPF_T_FAST ideal-int
+pkg syscall (freebsd-arm64), const BPF_T_FLAG_MASK = 768
+pkg syscall (freebsd-arm64), const BPF_T_FLAG_MASK ideal-int
+pkg syscall (freebsd-arm64), const BPF_T_FORMAT_MASK = 3
+pkg syscall (freebsd-arm64), const BPF_T_FORMAT_MASK ideal-int
+pkg syscall (freebsd-arm64), const BPF_T_MICROTIME = 0
+pkg syscall (freebsd-arm64), const BPF_T_MICROTIME ideal-int
+pkg syscall (freebsd-arm64), const BPF_T_MICROTIME_FAST = 256
+pkg syscall (freebsd-arm64), const BPF_T_MICROTIME_FAST ideal-int
+pkg syscall (freebsd-arm64), const BPF_T_MICROTIME_MONOTONIC = 512
+pkg syscall (freebsd-arm64), const BPF_T_MICROTIME_MONOTONIC ideal-int
+pkg syscall (freebsd-arm64), const BPF_T_MICROTIME_MONOTONIC_FAST = 768
+pkg syscall (freebsd-arm64), const BPF_T_MICROTIME_MONOTONIC_FAST ideal-int
+pkg syscall (freebsd-arm64), const BPF_T_MONOTONIC = 512
+pkg syscall (freebsd-arm64), const BPF_T_MONOTONIC ideal-int
+pkg syscall (freebsd-arm64), const BPF_T_MONOTONIC_FAST = 768
+pkg syscall (freebsd-arm64), const BPF_T_MONOTONIC_FAST ideal-int
+pkg syscall (freebsd-arm64), const BPF_T_NANOTIME = 1
+pkg syscall (freebsd-arm64), const BPF_T_NANOTIME ideal-int
+pkg syscall (freebsd-arm64), const BPF_T_NANOTIME_FAST = 257
+pkg syscall (freebsd-arm64), const BPF_T_NANOTIME_FAST ideal-int
+pkg syscall (freebsd-arm64), const BPF_T_NANOTIME_MONOTONIC = 513
+pkg syscall (freebsd-arm64), const BPF_T_NANOTIME_MONOTONIC ideal-int
+pkg syscall (freebsd-arm64), const BPF_T_NANOTIME_MONOTONIC_FAST = 769
+pkg syscall (freebsd-arm64), const BPF_T_NANOTIME_MONOTONIC_FAST ideal-int
+pkg syscall (freebsd-arm64), const BPF_T_NONE = 3
+pkg syscall (freebsd-arm64), const BPF_T_NONE ideal-int
+pkg syscall (freebsd-arm64), const BPF_T_NORMAL = 0
+pkg syscall (freebsd-arm64), const BPF_T_NORMAL ideal-int
+pkg syscall (freebsd-arm64), const BPF_TAX = 0
+pkg syscall (freebsd-arm64), const BPF_TAX ideal-int
+pkg syscall (freebsd-arm64), const BPF_TXA = 128
+pkg syscall (freebsd-arm64), const BPF_TXA ideal-int
+pkg syscall (freebsd-arm64), const BPF_W = 0
+pkg syscall (freebsd-arm64), const BPF_W ideal-int
+pkg syscall (freebsd-arm64), const BPF_X = 8
+pkg syscall (freebsd-arm64), const BPF_X ideal-int
+pkg syscall (freebsd-arm64), const BRKINT = 2
+pkg syscall (freebsd-arm64), const BRKINT ideal-int
+pkg syscall (freebsd-arm64), const CFLUSH = 15
+pkg syscall (freebsd-arm64), const CFLUSH ideal-int
+pkg syscall (freebsd-arm64), const CLOCAL = 32768
+pkg syscall (freebsd-arm64), const CLOCAL ideal-int
+pkg syscall (freebsd-arm64), const CREAD = 2048
+pkg syscall (freebsd-arm64), const CREAD ideal-int
+pkg syscall (freebsd-arm64), const CS5 = 0
+pkg syscall (freebsd-arm64), const CS5 ideal-int
+pkg syscall (freebsd-arm64), const CS6 = 256
+pkg syscall (freebsd-arm64), const CS6 ideal-int
+pkg syscall (freebsd-arm64), const CS7 = 512
+pkg syscall (freebsd-arm64), const CS7 ideal-int
+pkg syscall (freebsd-arm64), const CS8 = 768
+pkg syscall (freebsd-arm64), const CS8 ideal-int
+pkg syscall (freebsd-arm64), const CSIZE = 768
+pkg syscall (freebsd-arm64), const CSIZE ideal-int
+pkg syscall (freebsd-arm64), const CSTART = 17
+pkg syscall (freebsd-arm64), const CSTART ideal-int
+pkg syscall (freebsd-arm64), const CSTATUS = 20
+pkg syscall (freebsd-arm64), const CSTATUS ideal-int
+pkg syscall (freebsd-arm64), const CSTOP = 19
+pkg syscall (freebsd-arm64), const CSTOP ideal-int
+pkg syscall (freebsd-arm64), const CSTOPB = 1024
+pkg syscall (freebsd-arm64), const CSTOPB ideal-int
+pkg syscall (freebsd-arm64), const CSUSP = 26
+pkg syscall (freebsd-arm64), const CSUSP ideal-int
+pkg syscall (freebsd-arm64), const CTL_MAXNAME = 24
+pkg syscall (freebsd-arm64), const CTL_MAXNAME ideal-int
+pkg syscall (freebsd-arm64), const CTL_NET = 4
+pkg syscall (freebsd-arm64), const CTL_NET ideal-int
+pkg syscall (freebsd-arm64), const DLT_A429 = 184
+pkg syscall (freebsd-arm64), const DLT_A429 ideal-int
+pkg syscall (freebsd-arm64), const DLT_A653_ICM = 185
+pkg syscall (freebsd-arm64), const DLT_A653_ICM ideal-int
+pkg syscall (freebsd-arm64), const DLT_AIRONET_HEADER = 120
+pkg syscall (freebsd-arm64), const DLT_AIRONET_HEADER ideal-int
+pkg syscall (freebsd-arm64), const DLT_AOS = 222
+pkg syscall (freebsd-arm64), const DLT_AOS ideal-int
+pkg syscall (freebsd-arm64), const DLT_APPLE_IP_OVER_IEEE1394 = 138
+pkg syscall (freebsd-arm64), const DLT_APPLE_IP_OVER_IEEE1394 ideal-int
+pkg syscall (freebsd-arm64), const DLT_ARCNET = 7
+pkg syscall (freebsd-arm64), const DLT_ARCNET ideal-int
+pkg syscall (freebsd-arm64), const DLT_ARCNET_LINUX = 129
+pkg syscall (freebsd-arm64), const DLT_ARCNET_LINUX ideal-int
+pkg syscall (freebsd-arm64), const DLT_ATM_CLIP = 19
+pkg syscall (freebsd-arm64), const DLT_ATM_CLIP ideal-int
+pkg syscall (freebsd-arm64), const DLT_ATM_RFC1483 = 11
+pkg syscall (freebsd-arm64), const DLT_ATM_RFC1483 ideal-int
+pkg syscall (freebsd-arm64), const DLT_AURORA = 126
+pkg syscall (freebsd-arm64), const DLT_AURORA ideal-int
+pkg syscall (freebsd-arm64), const DLT_AX25 = 3
+pkg syscall (freebsd-arm64), const DLT_AX25 ideal-int
+pkg syscall (freebsd-arm64), const DLT_AX25_KISS = 202
+pkg syscall (freebsd-arm64), const DLT_AX25_KISS ideal-int
+pkg syscall (freebsd-arm64), const DLT_BACNET_MS_TP = 165
+pkg syscall (freebsd-arm64), const DLT_BACNET_MS_TP ideal-int
+pkg syscall (freebsd-arm64), const DLT_BLUETOOTH_HCI_H4 = 187
+pkg syscall (freebsd-arm64), const DLT_BLUETOOTH_HCI_H4 ideal-int
+pkg syscall (freebsd-arm64), const DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 201
+pkg syscall (freebsd-arm64), const DLT_BLUETOOTH_HCI_H4_WITH_PHDR ideal-int
+pkg syscall (freebsd-arm64), const DLT_C_HDLC = 104
+pkg syscall (freebsd-arm64), const DLT_C_HDLC ideal-int
+pkg syscall (freebsd-arm64), const DLT_C_HDLC_WITH_DIR = 205
+pkg syscall (freebsd-arm64), const DLT_C_HDLC_WITH_DIR ideal-int
+pkg syscall (freebsd-arm64), const DLT_CAN_SOCKETCAN = 227
+pkg syscall (freebsd-arm64), const DLT_CAN_SOCKETCAN ideal-int
+pkg syscall (freebsd-arm64), const DLT_CAN20B = 190
+pkg syscall (freebsd-arm64), const DLT_CAN20B ideal-int
+pkg syscall (freebsd-arm64), const DLT_CHAOS = 5
+pkg syscall (freebsd-arm64), const DLT_CHAOS ideal-int
+pkg syscall (freebsd-arm64), const DLT_CHDLC = 104
+pkg syscall (freebsd-arm64), const DLT_CHDLC ideal-int
+pkg syscall (freebsd-arm64), const DLT_CISCO_IOS = 118
+pkg syscall (freebsd-arm64), const DLT_CISCO_IOS ideal-int
+pkg syscall (freebsd-arm64), const DLT_DBUS = 231
+pkg syscall (freebsd-arm64), const DLT_DBUS ideal-int
+pkg syscall (freebsd-arm64), const DLT_DECT = 221
+pkg syscall (freebsd-arm64), const DLT_DECT ideal-int
+pkg syscall (freebsd-arm64), const DLT_DOCSIS = 143
+pkg syscall (freebsd-arm64), const DLT_DOCSIS ideal-int
+pkg syscall (freebsd-arm64), const DLT_DVB_CI = 235
+pkg syscall (freebsd-arm64), const DLT_DVB_CI ideal-int
+pkg syscall (freebsd-arm64), const DLT_ECONET = 115
+pkg syscall (freebsd-arm64), const DLT_ECONET ideal-int
+pkg syscall (freebsd-arm64), const DLT_EN10MB = 1
+pkg syscall (freebsd-arm64), const DLT_EN10MB ideal-int
+pkg syscall (freebsd-arm64), const DLT_EN3MB = 2
+pkg syscall (freebsd-arm64), const DLT_EN3MB ideal-int
+pkg syscall (freebsd-arm64), const DLT_ENC = 109
+pkg syscall (freebsd-arm64), const DLT_ENC ideal-int
+pkg syscall (freebsd-arm64), const DLT_ERF = 197
+pkg syscall (freebsd-arm64), const DLT_ERF ideal-int
+pkg syscall (freebsd-arm64), const DLT_ERF_ETH = 175
+pkg syscall (freebsd-arm64), const DLT_ERF_ETH ideal-int
+pkg syscall (freebsd-arm64), const DLT_ERF_POS = 176
+pkg syscall (freebsd-arm64), const DLT_ERF_POS ideal-int
+pkg syscall (freebsd-arm64), const DLT_FC_2 = 224
+pkg syscall (freebsd-arm64), const DLT_FC_2 ideal-int
+pkg syscall (freebsd-arm64), const DLT_FC_2_WITH_FRAME_DELIMS = 225
+pkg syscall (freebsd-arm64), const DLT_FC_2_WITH_FRAME_DELIMS ideal-int
+pkg syscall (freebsd-arm64), const DLT_FDDI = 10
+pkg syscall (freebsd-arm64), const DLT_FDDI ideal-int
+pkg syscall (freebsd-arm64), const DLT_FLEXRAY = 210
+pkg syscall (freebsd-arm64), const DLT_FLEXRAY ideal-int
+pkg syscall (freebsd-arm64), const DLT_FRELAY = 107
+pkg syscall (freebsd-arm64), const DLT_FRELAY ideal-int
+pkg syscall (freebsd-arm64), const DLT_FRELAY_WITH_DIR = 206
+pkg syscall (freebsd-arm64), const DLT_FRELAY_WITH_DIR ideal-int
+pkg syscall (freebsd-arm64), const DLT_GCOM_SERIAL = 173
+pkg syscall (freebsd-arm64), const DLT_GCOM_SERIAL ideal-int
+pkg syscall (freebsd-arm64), const DLT_GCOM_T1E1 = 172
+pkg syscall (freebsd-arm64), const DLT_GCOM_T1E1 ideal-int
+pkg syscall (freebsd-arm64), const DLT_GPF_F = 171
+pkg syscall (freebsd-arm64), const DLT_GPF_F ideal-int
+pkg syscall (freebsd-arm64), const DLT_GPF_T = 170
+pkg syscall (freebsd-arm64), const DLT_GPF_T ideal-int
+pkg syscall (freebsd-arm64), const DLT_GPRS_LLC = 169
+pkg syscall (freebsd-arm64), const DLT_GPRS_LLC ideal-int
+pkg syscall (freebsd-arm64), const DLT_GSMTAP_ABIS = 218
+pkg syscall (freebsd-arm64), const DLT_GSMTAP_ABIS ideal-int
+pkg syscall (freebsd-arm64), const DLT_GSMTAP_UM = 217
+pkg syscall (freebsd-arm64), const DLT_GSMTAP_UM ideal-int
+pkg syscall (freebsd-arm64), const DLT_HHDLC = 121
+pkg syscall (freebsd-arm64), const DLT_HHDLC ideal-int
+pkg syscall (freebsd-arm64), const DLT_IBM_SN = 146
+pkg syscall (freebsd-arm64), const DLT_IBM_SN ideal-int
+pkg syscall (freebsd-arm64), const DLT_IBM_SP = 145
+pkg syscall (freebsd-arm64), const DLT_IBM_SP ideal-int
+pkg syscall (freebsd-arm64), const DLT_IEEE802 = 6
+pkg syscall (freebsd-arm64), const DLT_IEEE802 ideal-int
+pkg syscall (freebsd-arm64), const DLT_IEEE802_11 = 105
+pkg syscall (freebsd-arm64), const DLT_IEEE802_11 ideal-int
+pkg syscall (freebsd-arm64), const DLT_IEEE802_11_RADIO = 127
+pkg syscall (freebsd-arm64), const DLT_IEEE802_11_RADIO ideal-int
+pkg syscall (freebsd-arm64), const DLT_IEEE802_11_RADIO_AVS = 163
+pkg syscall (freebsd-arm64), const DLT_IEEE802_11_RADIO_AVS ideal-int
+pkg syscall (freebsd-arm64), const DLT_IEEE802_15_4 = 195
+pkg syscall (freebsd-arm64), const DLT_IEEE802_15_4 ideal-int
+pkg syscall (freebsd-arm64), const DLT_IEEE802_15_4_LINUX = 191
+pkg syscall (freebsd-arm64), const DLT_IEEE802_15_4_LINUX ideal-int
+pkg syscall (freebsd-arm64), const DLT_IEEE802_15_4_NOFCS = 230
+pkg syscall (freebsd-arm64), const DLT_IEEE802_15_4_NOFCS ideal-int
+pkg syscall (freebsd-arm64), const DLT_IEEE802_15_4_NONASK_PHY = 215
+pkg syscall (freebsd-arm64), const DLT_IEEE802_15_4_NONASK_PHY ideal-int
+pkg syscall (freebsd-arm64), const DLT_IEEE802_16_MAC_CPS = 188
+pkg syscall (freebsd-arm64), const DLT_IEEE802_16_MAC_CPS ideal-int
+pkg syscall (freebsd-arm64), const DLT_IEEE802_16_MAC_CPS_RADIO = 193
+pkg syscall (freebsd-arm64), const DLT_IEEE802_16_MAC_CPS_RADIO ideal-int
+pkg syscall (freebsd-arm64), const DLT_IP_OVER_FC = 122
+pkg syscall (freebsd-arm64), const DLT_IP_OVER_FC ideal-int
+pkg syscall (freebsd-arm64), const DLT_IPFILTER = 116
+pkg syscall (freebsd-arm64), const DLT_IPFILTER ideal-int
+pkg syscall (freebsd-arm64), const DLT_IPMB = 199
+pkg syscall (freebsd-arm64), const DLT_IPMB ideal-int
+pkg syscall (freebsd-arm64), const DLT_IPMB_LINUX = 209
+pkg syscall (freebsd-arm64), const DLT_IPMB_LINUX ideal-int
+pkg syscall (freebsd-arm64), const DLT_IPNET = 226
+pkg syscall (freebsd-arm64), const DLT_IPNET ideal-int
+pkg syscall (freebsd-arm64), const DLT_IPOIB = 242
+pkg syscall (freebsd-arm64), const DLT_IPOIB ideal-int
+pkg syscall (freebsd-arm64), const DLT_IPV4 = 228
+pkg syscall (freebsd-arm64), const DLT_IPV4 ideal-int
+pkg syscall (freebsd-arm64), const DLT_IPV6 = 229
+pkg syscall (freebsd-arm64), const DLT_IPV6 ideal-int
+pkg syscall (freebsd-arm64), const DLT_JUNIPER_ATM_CEMIC = 238
+pkg syscall (freebsd-arm64), const DLT_JUNIPER_ATM_CEMIC ideal-int
+pkg syscall (freebsd-arm64), const DLT_JUNIPER_ATM1 = 137
+pkg syscall (freebsd-arm64), const DLT_JUNIPER_ATM1 ideal-int
+pkg syscall (freebsd-arm64), const DLT_JUNIPER_ATM2 = 135
+pkg syscall (freebsd-arm64), const DLT_JUNIPER_ATM2 ideal-int
+pkg syscall (freebsd-arm64), const DLT_JUNIPER_CHDLC = 181
+pkg syscall (freebsd-arm64), const DLT_JUNIPER_CHDLC ideal-int
+pkg syscall (freebsd-arm64), const DLT_JUNIPER_ES = 132
+pkg syscall (freebsd-arm64), const DLT_JUNIPER_ES ideal-int
+pkg syscall (freebsd-arm64), const DLT_JUNIPER_ETHER = 178
+pkg syscall (freebsd-arm64), const DLT_JUNIPER_ETHER ideal-int
+pkg syscall (freebsd-arm64), const DLT_JUNIPER_FIBRECHANNEL = 234
+pkg syscall (freebsd-arm64), const DLT_JUNIPER_FIBRECHANNEL ideal-int
+pkg syscall (freebsd-arm64), const DLT_JUNIPER_FRELAY = 180
+pkg syscall (freebsd-arm64), const DLT_JUNIPER_FRELAY ideal-int
+pkg syscall (freebsd-arm64), const DLT_JUNIPER_GGSN = 133
+pkg syscall (freebsd-arm64), const DLT_JUNIPER_GGSN ideal-int
+pkg syscall (freebsd-arm64), const DLT_JUNIPER_ISM = 194
+pkg syscall (freebsd-arm64), const DLT_JUNIPER_ISM ideal-int
+pkg syscall (freebsd-arm64), const DLT_JUNIPER_MFR = 134
+pkg syscall (freebsd-arm64), const DLT_JUNIPER_MFR ideal-int
+pkg syscall (freebsd-arm64), const DLT_JUNIPER_MLFR = 131
+pkg syscall (freebsd-arm64), const DLT_JUNIPER_MLFR ideal-int
+pkg syscall (freebsd-arm64), const DLT_JUNIPER_MLPPP = 130
+pkg syscall (freebsd-arm64), const DLT_JUNIPER_MLPPP ideal-int
+pkg syscall (freebsd-arm64), const DLT_JUNIPER_MONITOR = 164
+pkg syscall (freebsd-arm64), const DLT_JUNIPER_MONITOR ideal-int
+pkg syscall (freebsd-arm64), const DLT_JUNIPER_PIC_PEER = 174
+pkg syscall (freebsd-arm64), const DLT_JUNIPER_PIC_PEER ideal-int
+pkg syscall (freebsd-arm64), const DLT_JUNIPER_PPP = 179
+pkg syscall (freebsd-arm64), const DLT_JUNIPER_PPP ideal-int
+pkg syscall (freebsd-arm64), const DLT_JUNIPER_PPPOE = 167
+pkg syscall (freebsd-arm64), const DLT_JUNIPER_PPPOE ideal-int
+pkg syscall (freebsd-arm64), const DLT_JUNIPER_PPPOE_ATM = 168
+pkg syscall (freebsd-arm64), const DLT_JUNIPER_PPPOE_ATM ideal-int
+pkg syscall (freebsd-arm64), const DLT_JUNIPER_SERVICES = 136
+pkg syscall (freebsd-arm64), const DLT_JUNIPER_SERVICES ideal-int
+pkg syscall (freebsd-arm64), const DLT_JUNIPER_SRX_E2E = 233
+pkg syscall (freebsd-arm64), const DLT_JUNIPER_SRX_E2E ideal-int
+pkg syscall (freebsd-arm64), const DLT_JUNIPER_ST = 200
+pkg syscall (freebsd-arm64), const DLT_JUNIPER_ST ideal-int
+pkg syscall (freebsd-arm64), const DLT_JUNIPER_VP = 183
+pkg syscall (freebsd-arm64), const DLT_JUNIPER_VP ideal-int
+pkg syscall (freebsd-arm64), const DLT_JUNIPER_VS = 232
+pkg syscall (freebsd-arm64), const DLT_JUNIPER_VS ideal-int
+pkg syscall (freebsd-arm64), const DLT_LAPB_WITH_DIR = 207
+pkg syscall (freebsd-arm64), const DLT_LAPB_WITH_DIR ideal-int
+pkg syscall (freebsd-arm64), const DLT_LAPD = 203
+pkg syscall (freebsd-arm64), const DLT_LAPD ideal-int
+pkg syscall (freebsd-arm64), const DLT_LIN = 212
+pkg syscall (freebsd-arm64), const DLT_LIN ideal-int
+pkg syscall (freebsd-arm64), const DLT_LINUX_EVDEV = 216
+pkg syscall (freebsd-arm64), const DLT_LINUX_EVDEV ideal-int
+pkg syscall (freebsd-arm64), const DLT_LINUX_IRDA = 144
+pkg syscall (freebsd-arm64), const DLT_LINUX_IRDA ideal-int
+pkg syscall (freebsd-arm64), const DLT_LINUX_LAPD = 177
+pkg syscall (freebsd-arm64), const DLT_LINUX_LAPD ideal-int
+pkg syscall (freebsd-arm64), const DLT_LINUX_PPP_WITHDIRECTION = 166
+pkg syscall (freebsd-arm64), const DLT_LINUX_PPP_WITHDIRECTION ideal-int
+pkg syscall (freebsd-arm64), const DLT_LINUX_SLL = 113
+pkg syscall (freebsd-arm64), const DLT_LINUX_SLL ideal-int
+pkg syscall (freebsd-arm64), const DLT_LOOP = 108
+pkg syscall (freebsd-arm64), const DLT_LOOP ideal-int
+pkg syscall (freebsd-arm64), const DLT_LTALK = 114
+pkg syscall (freebsd-arm64), const DLT_LTALK ideal-int
+pkg syscall (freebsd-arm64), const DLT_MATCHING_MAX = 246
+pkg syscall (freebsd-arm64), const DLT_MATCHING_MAX ideal-int
+pkg syscall (freebsd-arm64), const DLT_MATCHING_MIN = 104
+pkg syscall (freebsd-arm64), const DLT_MATCHING_MIN ideal-int
+pkg syscall (freebsd-arm64), const DLT_MFR = 182
+pkg syscall (freebsd-arm64), const DLT_MFR ideal-int
+pkg syscall (freebsd-arm64), const DLT_MOST = 211
+pkg syscall (freebsd-arm64), const DLT_MOST ideal-int
+pkg syscall (freebsd-arm64), const DLT_MPEG_2_TS = 243
+pkg syscall (freebsd-arm64), const DLT_MPEG_2_TS ideal-int
+pkg syscall (freebsd-arm64), const DLT_MPLS = 219
+pkg syscall (freebsd-arm64), const DLT_MPLS ideal-int
+pkg syscall (freebsd-arm64), const DLT_MTP2 = 140
+pkg syscall (freebsd-arm64), const DLT_MTP2 ideal-int
+pkg syscall (freebsd-arm64), const DLT_MTP2_WITH_PHDR = 139
+pkg syscall (freebsd-arm64), const DLT_MTP2_WITH_PHDR ideal-int
+pkg syscall (freebsd-arm64), const DLT_MTP3 = 141
+pkg syscall (freebsd-arm64), const DLT_MTP3 ideal-int
+pkg syscall (freebsd-arm64), const DLT_MUX27010 = 236
+pkg syscall (freebsd-arm64), const DLT_MUX27010 ideal-int
+pkg syscall (freebsd-arm64), const DLT_NETANALYZER = 240
+pkg syscall (freebsd-arm64), const DLT_NETANALYZER ideal-int
+pkg syscall (freebsd-arm64), const DLT_NETANALYZER_TRANSPARENT = 241
+pkg syscall (freebsd-arm64), const DLT_NETANALYZER_TRANSPARENT ideal-int
+pkg syscall (freebsd-arm64), const DLT_NFC_LLCP = 245
+pkg syscall (freebsd-arm64), const DLT_NFC_LLCP ideal-int
+pkg syscall (freebsd-arm64), const DLT_NFLOG = 239
+pkg syscall (freebsd-arm64), const DLT_NFLOG ideal-int
+pkg syscall (freebsd-arm64), const DLT_NG40 = 244
+pkg syscall (freebsd-arm64), const DLT_NG40 ideal-int
+pkg syscall (freebsd-arm64), const DLT_NULL = 0
+pkg syscall (freebsd-arm64), const DLT_NULL ideal-int
+pkg syscall (freebsd-arm64), const DLT_PCI_EXP = 125
+pkg syscall (freebsd-arm64), const DLT_PCI_EXP ideal-int
+pkg syscall (freebsd-arm64), const DLT_PFLOG = 117
+pkg syscall (freebsd-arm64), const DLT_PFLOG ideal-int
+pkg syscall (freebsd-arm64), const DLT_PFSYNC = 121
+pkg syscall (freebsd-arm64), const DLT_PFSYNC ideal-int
+pkg syscall (freebsd-arm64), const DLT_PPI = 192
+pkg syscall (freebsd-arm64), const DLT_PPI ideal-int
+pkg syscall (freebsd-arm64), const DLT_PPP = 9
+pkg syscall (freebsd-arm64), const DLT_PPP ideal-int
+pkg syscall (freebsd-arm64), const DLT_PPP_BSDOS = 16
+pkg syscall (freebsd-arm64), const DLT_PPP_BSDOS ideal-int
+pkg syscall (freebsd-arm64), const DLT_PPP_ETHER = 51
+pkg syscall (freebsd-arm64), const DLT_PPP_ETHER ideal-int
+pkg syscall (freebsd-arm64), const DLT_PPP_PPPD = 166
+pkg syscall (freebsd-arm64), const DLT_PPP_PPPD ideal-int
+pkg syscall (freebsd-arm64), const DLT_PPP_SERIAL = 50
+pkg syscall (freebsd-arm64), const DLT_PPP_SERIAL ideal-int
+pkg syscall (freebsd-arm64), const DLT_PPP_WITH_DIR = 204
+pkg syscall (freebsd-arm64), const DLT_PPP_WITH_DIR ideal-int
+pkg syscall (freebsd-arm64), const DLT_PPP_WITH_DIRECTION = 166
+pkg syscall (freebsd-arm64), const DLT_PPP_WITH_DIRECTION ideal-int
+pkg syscall (freebsd-arm64), const DLT_PRISM_HEADER = 119
+pkg syscall (freebsd-arm64), const DLT_PRISM_HEADER ideal-int
+pkg syscall (freebsd-arm64), const DLT_PRONET = 4
+pkg syscall (freebsd-arm64), const DLT_PRONET ideal-int
+pkg syscall (freebsd-arm64), const DLT_RAIF1 = 198
+pkg syscall (freebsd-arm64), const DLT_RAIF1 ideal-int
+pkg syscall (freebsd-arm64), const DLT_RAW = 12
+pkg syscall (freebsd-arm64), const DLT_RAW ideal-int
+pkg syscall (freebsd-arm64), const DLT_RIO = 124
+pkg syscall (freebsd-arm64), const DLT_RIO ideal-int
+pkg syscall (freebsd-arm64), const DLT_SCCP = 142
+pkg syscall (freebsd-arm64), const DLT_SCCP ideal-int
+pkg syscall (freebsd-arm64), const DLT_SITA = 196
+pkg syscall (freebsd-arm64), const DLT_SITA ideal-int
+pkg syscall (freebsd-arm64), const DLT_SLIP = 8
+pkg syscall (freebsd-arm64), const DLT_SLIP ideal-int
+pkg syscall (freebsd-arm64), const DLT_SLIP_BSDOS = 15
+pkg syscall (freebsd-arm64), const DLT_SLIP_BSDOS ideal-int
+pkg syscall (freebsd-arm64), const DLT_STANAG_5066_D_PDU = 237
+pkg syscall (freebsd-arm64), const DLT_STANAG_5066_D_PDU ideal-int
+pkg syscall (freebsd-arm64), const DLT_SUNATM = 123
+pkg syscall (freebsd-arm64), const DLT_SUNATM ideal-int
+pkg syscall (freebsd-arm64), const DLT_SYMANTEC_FIREWALL = 99
+pkg syscall (freebsd-arm64), const DLT_SYMANTEC_FIREWALL ideal-int
+pkg syscall (freebsd-arm64), const DLT_TZSP = 128
+pkg syscall (freebsd-arm64), const DLT_TZSP ideal-int
+pkg syscall (freebsd-arm64), const DLT_USB = 186
+pkg syscall (freebsd-arm64), const DLT_USB ideal-int
+pkg syscall (freebsd-arm64), const DLT_USB_LINUX = 189
+pkg syscall (freebsd-arm64), const DLT_USB_LINUX ideal-int
+pkg syscall (freebsd-arm64), const DLT_USB_LINUX_MMAPPED = 220
+pkg syscall (freebsd-arm64), const DLT_USB_LINUX_MMAPPED ideal-int
+pkg syscall (freebsd-arm64), const DLT_USER0 = 147
+pkg syscall (freebsd-arm64), const DLT_USER0 ideal-int
+pkg syscall (freebsd-arm64), const DLT_USER1 = 148
+pkg syscall (freebsd-arm64), const DLT_USER1 ideal-int
+pkg syscall (freebsd-arm64), const DLT_USER10 = 157
+pkg syscall (freebsd-arm64), const DLT_USER10 ideal-int
+pkg syscall (freebsd-arm64), const DLT_USER11 = 158
+pkg syscall (freebsd-arm64), const DLT_USER11 ideal-int
+pkg syscall (freebsd-arm64), const DLT_USER12 = 159
+pkg syscall (freebsd-arm64), const DLT_USER12 ideal-int
+pkg syscall (freebsd-arm64), const DLT_USER13 = 160
+pkg syscall (freebsd-arm64), const DLT_USER13 ideal-int
+pkg syscall (freebsd-arm64), const DLT_USER14 = 161
+pkg syscall (freebsd-arm64), const DLT_USER14 ideal-int
+pkg syscall (freebsd-arm64), const DLT_USER15 = 162
+pkg syscall (freebsd-arm64), const DLT_USER15 ideal-int
+pkg syscall (freebsd-arm64), const DLT_USER2 = 149
+pkg syscall (freebsd-arm64), const DLT_USER2 ideal-int
+pkg syscall (freebsd-arm64), const DLT_USER3 = 150
+pkg syscall (freebsd-arm64), const DLT_USER3 ideal-int
+pkg syscall (freebsd-arm64), const DLT_USER4 = 151
+pkg syscall (freebsd-arm64), const DLT_USER4 ideal-int
+pkg syscall (freebsd-arm64), const DLT_USER5 = 152
+pkg syscall (freebsd-arm64), const DLT_USER5 ideal-int
+pkg syscall (freebsd-arm64), const DLT_USER6 = 153
+pkg syscall (freebsd-arm64), const DLT_USER6 ideal-int
+pkg syscall (freebsd-arm64), const DLT_USER7 = 154
+pkg syscall (freebsd-arm64), const DLT_USER7 ideal-int
+pkg syscall (freebsd-arm64), const DLT_USER8 = 155
+pkg syscall (freebsd-arm64), const DLT_USER8 ideal-int
+pkg syscall (freebsd-arm64), const DLT_USER9 = 156
+pkg syscall (freebsd-arm64), const DLT_USER9 ideal-int
+pkg syscall (freebsd-arm64), const DLT_WIHART = 223
+pkg syscall (freebsd-arm64), const DLT_WIHART ideal-int
+pkg syscall (freebsd-arm64), const DLT_X2E_SERIAL = 213
+pkg syscall (freebsd-arm64), const DLT_X2E_SERIAL ideal-int
+pkg syscall (freebsd-arm64), const DLT_X2E_XORAYA = 214
+pkg syscall (freebsd-arm64), const DLT_X2E_XORAYA ideal-int
+pkg syscall (freebsd-arm64), const DT_BLK = 6
+pkg syscall (freebsd-arm64), const DT_BLK ideal-int
+pkg syscall (freebsd-arm64), const DT_CHR = 2
+pkg syscall (freebsd-arm64), const DT_CHR ideal-int
+pkg syscall (freebsd-arm64), const DT_DIR = 4
+pkg syscall (freebsd-arm64), const DT_DIR ideal-int
+pkg syscall (freebsd-arm64), const DT_FIFO = 1
+pkg syscall (freebsd-arm64), const DT_FIFO ideal-int
+pkg syscall (freebsd-arm64), const DT_LNK = 10
+pkg syscall (freebsd-arm64), const DT_LNK ideal-int
+pkg syscall (freebsd-arm64), const DT_REG = 8
+pkg syscall (freebsd-arm64), const DT_REG ideal-int
+pkg syscall (freebsd-arm64), const DT_SOCK = 12
+pkg syscall (freebsd-arm64), const DT_SOCK ideal-int
+pkg syscall (freebsd-arm64), const DT_UNKNOWN = 0
+pkg syscall (freebsd-arm64), const DT_UNKNOWN ideal-int
+pkg syscall (freebsd-arm64), const DT_WHT = 14
+pkg syscall (freebsd-arm64), const DT_WHT ideal-int
+pkg syscall (freebsd-arm64), const E2BIG = 7
+pkg syscall (freebsd-arm64), const EACCES = 13
+pkg syscall (freebsd-arm64), const EADDRINUSE = 48
+pkg syscall (freebsd-arm64), const EADDRNOTAVAIL = 49
+pkg syscall (freebsd-arm64), const EAFNOSUPPORT = 47
+pkg syscall (freebsd-arm64), const EAGAIN = 35
+pkg syscall (freebsd-arm64), const EALREADY = 37
+pkg syscall (freebsd-arm64), const EAUTH = 80
+pkg syscall (freebsd-arm64), const EAUTH Errno
+pkg syscall (freebsd-arm64), const EBADF = 9
+pkg syscall (freebsd-arm64), const EBADMSG = 89
+pkg syscall (freebsd-arm64), const EBADMSG Errno
+pkg syscall (freebsd-arm64), const EBADRPC = 72
+pkg syscall (freebsd-arm64), const EBADRPC Errno
+pkg syscall (freebsd-arm64), const EBUSY = 16
+pkg syscall (freebsd-arm64), const ECANCELED = 85
+pkg syscall (freebsd-arm64), const ECAPMODE = 94
+pkg syscall (freebsd-arm64), const ECAPMODE Errno
+pkg syscall (freebsd-arm64), const ECHILD = 10
+pkg syscall (freebsd-arm64), const ECHO = 8
+pkg syscall (freebsd-arm64), const ECHO ideal-int
+pkg syscall (freebsd-arm64), const ECHOCTL = 64
+pkg syscall (freebsd-arm64), const ECHOCTL ideal-int
+pkg syscall (freebsd-arm64), const ECHOE = 2
+pkg syscall (freebsd-arm64), const ECHOE ideal-int
+pkg syscall (freebsd-arm64), const ECHOK = 4
+pkg syscall (freebsd-arm64), const ECHOK ideal-int
+pkg syscall (freebsd-arm64), const ECHOKE = 1
+pkg syscall (freebsd-arm64), const ECHOKE ideal-int
+pkg syscall (freebsd-arm64), const ECHONL = 16
+pkg syscall (freebsd-arm64), const ECHONL ideal-int
+pkg syscall (freebsd-arm64), const ECHOPRT = 32
+pkg syscall (freebsd-arm64), const ECHOPRT ideal-int
+pkg syscall (freebsd-arm64), const ECONNABORTED = 53
+pkg syscall (freebsd-arm64), const ECONNREFUSED = 61
+pkg syscall (freebsd-arm64), const ECONNRESET = 54
+pkg syscall (freebsd-arm64), const EDEADLK = 11
+pkg syscall (freebsd-arm64), const EDESTADDRREQ = 39
+pkg syscall (freebsd-arm64), const EDOM = 33
+pkg syscall (freebsd-arm64), const EDOOFUS = 88
+pkg syscall (freebsd-arm64), const EDOOFUS Errno
+pkg syscall (freebsd-arm64), const EDQUOT = 69
+pkg syscall (freebsd-arm64), const EEXIST = 17
+pkg syscall (freebsd-arm64), const EFAULT = 14
+pkg syscall (freebsd-arm64), const EFBIG = 27
+pkg syscall (freebsd-arm64), const EFTYPE = 79
+pkg syscall (freebsd-arm64), const EFTYPE Errno
+pkg syscall (freebsd-arm64), const EHOSTDOWN = 64
+pkg syscall (freebsd-arm64), const EHOSTUNREACH = 65
+pkg syscall (freebsd-arm64), const EIDRM = 82
+pkg syscall (freebsd-arm64), const EILSEQ = 86
+pkg syscall (freebsd-arm64), const EINPROGRESS = 36
+pkg syscall (freebsd-arm64), const EINTR = 4
+pkg syscall (freebsd-arm64), const EINVAL = 22
+pkg syscall (freebsd-arm64), const EIO = 5
+pkg syscall (freebsd-arm64), const EISCONN = 56
+pkg syscall (freebsd-arm64), const EISDIR = 21
+pkg syscall (freebsd-arm64), const ELAST = 96
+pkg syscall (freebsd-arm64), const ELAST Errno
+pkg syscall (freebsd-arm64), const ELOOP = 62
+pkg syscall (freebsd-arm64), const EMFILE = 24
+pkg syscall (freebsd-arm64), const EMLINK = 31
+pkg syscall (freebsd-arm64), const EMSGSIZE = 40
+pkg syscall (freebsd-arm64), const EMULTIHOP = 90
+pkg syscall (freebsd-arm64), const EMULTIHOP Errno
+pkg syscall (freebsd-arm64), const ENAMETOOLONG = 63
+pkg syscall (freebsd-arm64), const ENEEDAUTH = 81
+pkg syscall (freebsd-arm64), const ENEEDAUTH Errno
+pkg syscall (freebsd-arm64), const ENETDOWN = 50
+pkg syscall (freebsd-arm64), const ENETRESET = 52
+pkg syscall (freebsd-arm64), const ENETUNREACH = 51
+pkg syscall (freebsd-arm64), const ENFILE = 23
+pkg syscall (freebsd-arm64), const ENOATTR = 87
+pkg syscall (freebsd-arm64), const ENOATTR Errno
+pkg syscall (freebsd-arm64), const ENOBUFS = 55
+pkg syscall (freebsd-arm64), const ENODEV = 19
+pkg syscall (freebsd-arm64), const ENOEXEC = 8
+pkg syscall (freebsd-arm64), const ENOLCK = 77
+pkg syscall (freebsd-arm64), const ENOLINK = 91
+pkg syscall (freebsd-arm64), const ENOLINK Errno
+pkg syscall (freebsd-arm64), const ENOMEM = 12
+pkg syscall (freebsd-arm64), const ENOMSG = 83
+pkg syscall (freebsd-arm64), const ENOPROTOOPT = 42
+pkg syscall (freebsd-arm64), const ENOSPC = 28
+pkg syscall (freebsd-arm64), const ENOSYS = 78
+pkg syscall (freebsd-arm64), const ENOTBLK = 15
+pkg syscall (freebsd-arm64), const ENOTCAPABLE = 93
+pkg syscall (freebsd-arm64), const ENOTCAPABLE Errno
+pkg syscall (freebsd-arm64), const ENOTCONN = 57
+pkg syscall (freebsd-arm64), const ENOTDIR = 20
+pkg syscall (freebsd-arm64), const ENOTEMPTY = 66
+pkg syscall (freebsd-arm64), const ENOTRECOVERABLE = 95
+pkg syscall (freebsd-arm64), const ENOTRECOVERABLE Errno
+pkg syscall (freebsd-arm64), const ENOTSOCK = 38
+pkg syscall (freebsd-arm64), const ENOTSUP = 45
+pkg syscall (freebsd-arm64), const ENOTTY = 25
+pkg syscall (freebsd-arm64), const ENXIO = 6
+pkg syscall (freebsd-arm64), const EOPNOTSUPP = 45
+pkg syscall (freebsd-arm64), const EOVERFLOW = 84
+pkg syscall (freebsd-arm64), const EOWNERDEAD = 96
+pkg syscall (freebsd-arm64), const EOWNERDEAD Errno
+pkg syscall (freebsd-arm64), const EPERM = 1
+pkg syscall (freebsd-arm64), const EPFNOSUPPORT = 46
+pkg syscall (freebsd-arm64), const EPIPE = 32
+pkg syscall (freebsd-arm64), const EPROCLIM = 67
+pkg syscall (freebsd-arm64), const EPROCLIM Errno
+pkg syscall (freebsd-arm64), const EPROCUNAVAIL = 76
+pkg syscall (freebsd-arm64), const EPROCUNAVAIL Errno
+pkg syscall (freebsd-arm64), const EPROGMISMATCH = 75
+pkg syscall (freebsd-arm64), const EPROGMISMATCH Errno
+pkg syscall (freebsd-arm64), const EPROGUNAVAIL = 74
+pkg syscall (freebsd-arm64), const EPROGUNAVAIL Errno
+pkg syscall (freebsd-arm64), const EPROTO = 92
+pkg syscall (freebsd-arm64), const EPROTO Errno
+pkg syscall (freebsd-arm64), const EPROTONOSUPPORT = 43
+pkg syscall (freebsd-arm64), const EPROTOTYPE = 41
+pkg syscall (freebsd-arm64), const ERANGE = 34
+pkg syscall (freebsd-arm64), const EREMOTE = 71
+pkg syscall (freebsd-arm64), const EROFS = 30
+pkg syscall (freebsd-arm64), const ERPCMISMATCH = 73
+pkg syscall (freebsd-arm64), const ERPCMISMATCH Errno
+pkg syscall (freebsd-arm64), const ESHUTDOWN = 58
+pkg syscall (freebsd-arm64), const ESOCKTNOSUPPORT = 44
+pkg syscall (freebsd-arm64), const ESPIPE = 29
+pkg syscall (freebsd-arm64), const ESRCH = 3
+pkg syscall (freebsd-arm64), const ESTALE = 70
+pkg syscall (freebsd-arm64), const ETIMEDOUT = 60
+pkg syscall (freebsd-arm64), const ETOOMANYREFS = 59
+pkg syscall (freebsd-arm64), const ETXTBSY = 26
+pkg syscall (freebsd-arm64), const EUSERS = 68
+pkg syscall (freebsd-arm64), const EV_ADD = 1
+pkg syscall (freebsd-arm64), const EV_ADD ideal-int
+pkg syscall (freebsd-arm64), const EV_CLEAR = 32
+pkg syscall (freebsd-arm64), const EV_CLEAR ideal-int
+pkg syscall (freebsd-arm64), const EV_DELETE = 2
+pkg syscall (freebsd-arm64), const EV_DELETE ideal-int
+pkg syscall (freebsd-arm64), const EV_DISABLE = 8
+pkg syscall (freebsd-arm64), const EV_DISABLE ideal-int
+pkg syscall (freebsd-arm64), const EV_DISPATCH = 128
+pkg syscall (freebsd-arm64), const EV_DISPATCH ideal-int
+pkg syscall (freebsd-arm64), const EV_DROP = 4096
+pkg syscall (freebsd-arm64), const EV_DROP ideal-int
+pkg syscall (freebsd-arm64), const EV_ENABLE = 4
+pkg syscall (freebsd-arm64), const EV_ENABLE ideal-int
+pkg syscall (freebsd-arm64), const EV_EOF = 32768
+pkg syscall (freebsd-arm64), const EV_EOF ideal-int
+pkg syscall (freebsd-arm64), const EV_ERROR = 16384
+pkg syscall (freebsd-arm64), const EV_ERROR ideal-int
+pkg syscall (freebsd-arm64), const EV_FLAG1 = 8192
+pkg syscall (freebsd-arm64), const EV_FLAG1 ideal-int
+pkg syscall (freebsd-arm64), const EV_ONESHOT = 16
+pkg syscall (freebsd-arm64), const EV_ONESHOT ideal-int
+pkg syscall (freebsd-arm64), const EV_RECEIPT = 64
+pkg syscall (freebsd-arm64), const EV_RECEIPT ideal-int
+pkg syscall (freebsd-arm64), const EV_SYSFLAGS = 61440
+pkg syscall (freebsd-arm64), const EV_SYSFLAGS ideal-int
+pkg syscall (freebsd-arm64), const EVFILT_AIO = -3
+pkg syscall (freebsd-arm64), const EVFILT_AIO ideal-int
+pkg syscall (freebsd-arm64), const EVFILT_FS = -9
+pkg syscall (freebsd-arm64), const EVFILT_FS ideal-int
+pkg syscall (freebsd-arm64), const EVFILT_LIO = -10
+pkg syscall (freebsd-arm64), const EVFILT_LIO ideal-int
+pkg syscall (freebsd-arm64), const EVFILT_PROC = -5
+pkg syscall (freebsd-arm64), const EVFILT_PROC ideal-int
+pkg syscall (freebsd-arm64), const EVFILT_READ = -1
+pkg syscall (freebsd-arm64), const EVFILT_READ ideal-int
+pkg syscall (freebsd-arm64), const EVFILT_SIGNAL = -6
+pkg syscall (freebsd-arm64), const EVFILT_SIGNAL ideal-int
+pkg syscall (freebsd-arm64), const EVFILT_SYSCOUNT = 11
+pkg syscall (freebsd-arm64), const EVFILT_SYSCOUNT ideal-int
+pkg syscall (freebsd-arm64), const EVFILT_TIMER = -7
+pkg syscall (freebsd-arm64), const EVFILT_TIMER ideal-int
+pkg syscall (freebsd-arm64), const EVFILT_USER = -11
+pkg syscall (freebsd-arm64), const EVFILT_USER ideal-int
+pkg syscall (freebsd-arm64), const EVFILT_VNODE = -4
+pkg syscall (freebsd-arm64), const EVFILT_VNODE ideal-int
+pkg syscall (freebsd-arm64), const EVFILT_WRITE = -2
+pkg syscall (freebsd-arm64), const EVFILT_WRITE ideal-int
+pkg syscall (freebsd-arm64), const EWOULDBLOCK = 35
+pkg syscall (freebsd-arm64), const EXDEV = 18
+pkg syscall (freebsd-arm64), const EXTA = 19200
+pkg syscall (freebsd-arm64), const EXTA ideal-int
+pkg syscall (freebsd-arm64), const EXTB = 38400
+pkg syscall (freebsd-arm64), const EXTB ideal-int
+pkg syscall (freebsd-arm64), const EXTPROC = 2048
+pkg syscall (freebsd-arm64), const EXTPROC ideal-int
+pkg syscall (freebsd-arm64), const F_CANCEL = 5
+pkg syscall (freebsd-arm64), const F_CANCEL ideal-int
+pkg syscall (freebsd-arm64), const F_DUP2FD = 10
+pkg syscall (freebsd-arm64), const F_DUP2FD ideal-int
+pkg syscall (freebsd-arm64), const F_DUP2FD_CLOEXEC = 18
+pkg syscall (freebsd-arm64), const F_DUP2FD_CLOEXEC ideal-int
+pkg syscall (freebsd-arm64), const F_DUPFD = 0
+pkg syscall (freebsd-arm64), const F_DUPFD ideal-int
+pkg syscall (freebsd-arm64), const F_DUPFD_CLOEXEC = 17
+pkg syscall (freebsd-arm64), const F_DUPFD_CLOEXEC ideal-int
+pkg syscall (freebsd-arm64), const F_GETFD = 1
+pkg syscall (freebsd-arm64), const F_GETFD ideal-int
+pkg syscall (freebsd-arm64), const F_GETFL = 3
+pkg syscall (freebsd-arm64), const F_GETFL ideal-int
+pkg syscall (freebsd-arm64), const F_GETLK = 11
+pkg syscall (freebsd-arm64), const F_GETLK ideal-int
+pkg syscall (freebsd-arm64), const F_GETOWN = 5
+pkg syscall (freebsd-arm64), const F_GETOWN ideal-int
+pkg syscall (freebsd-arm64), const F_OGETLK = 7
+pkg syscall (freebsd-arm64), const F_OGETLK ideal-int
+pkg syscall (freebsd-arm64), const F_OK = 0
+pkg syscall (freebsd-arm64), const F_OK ideal-int
+pkg syscall (freebsd-arm64), const F_OSETLK = 8
+pkg syscall (freebsd-arm64), const F_OSETLK ideal-int
+pkg syscall (freebsd-arm64), const F_OSETLKW = 9
+pkg syscall (freebsd-arm64), const F_OSETLKW ideal-int
+pkg syscall (freebsd-arm64), const F_RDAHEAD = 16
+pkg syscall (freebsd-arm64), const F_RDAHEAD ideal-int
+pkg syscall (freebsd-arm64), const F_RDLCK = 1
+pkg syscall (freebsd-arm64), const F_RDLCK ideal-int
+pkg syscall (freebsd-arm64), const F_READAHEAD = 15
+pkg syscall (freebsd-arm64), const F_READAHEAD ideal-int
+pkg syscall (freebsd-arm64), const F_SETFD = 2
+pkg syscall (freebsd-arm64), const F_SETFD ideal-int
+pkg syscall (freebsd-arm64), const F_SETFL = 4
+pkg syscall (freebsd-arm64), const F_SETFL ideal-int
+pkg syscall (freebsd-arm64), const F_SETLK = 12
+pkg syscall (freebsd-arm64), const F_SETLK ideal-int
+pkg syscall (freebsd-arm64), const F_SETLK_REMOTE = 14
+pkg syscall (freebsd-arm64), const F_SETLK_REMOTE ideal-int
+pkg syscall (freebsd-arm64), const F_SETLKW = 13
+pkg syscall (freebsd-arm64), const F_SETLKW ideal-int
+pkg syscall (freebsd-arm64), const F_SETOWN = 6
+pkg syscall (freebsd-arm64), const F_SETOWN ideal-int
+pkg syscall (freebsd-arm64), const F_UNLCK = 2
+pkg syscall (freebsd-arm64), const F_UNLCK ideal-int
+pkg syscall (freebsd-arm64), const F_UNLCKSYS = 4
+pkg syscall (freebsd-arm64), const F_UNLCKSYS ideal-int
+pkg syscall (freebsd-arm64), const F_WRLCK = 3
+pkg syscall (freebsd-arm64), const F_WRLCK ideal-int
+pkg syscall (freebsd-arm64), const FD_CLOEXEC = 1
+pkg syscall (freebsd-arm64), const FD_CLOEXEC ideal-int
+pkg syscall (freebsd-arm64), const FD_SETSIZE = 1024
+pkg syscall (freebsd-arm64), const FD_SETSIZE ideal-int
+pkg syscall (freebsd-arm64), const FLUSHO = 8388608
+pkg syscall (freebsd-arm64), const FLUSHO ideal-int
+pkg syscall (freebsd-arm64), const HUPCL = 16384
+pkg syscall (freebsd-arm64), const HUPCL ideal-int
+pkg syscall (freebsd-arm64), const ICANON = 256
+pkg syscall (freebsd-arm64), const ICANON ideal-int
+pkg syscall (freebsd-arm64), const ICMP6_FILTER = 18
+pkg syscall (freebsd-arm64), const ICMP6_FILTER ideal-int
+pkg syscall (freebsd-arm64), const ICRNL = 256
+pkg syscall (freebsd-arm64), const ICRNL ideal-int
+pkg syscall (freebsd-arm64), const IEXTEN = 1024
+pkg syscall (freebsd-arm64), const IEXTEN ideal-int
+pkg syscall (freebsd-arm64), const IFAN_ARRIVAL = 0
+pkg syscall (freebsd-arm64), const IFAN_ARRIVAL ideal-int
+pkg syscall (freebsd-arm64), const IFAN_DEPARTURE = 1
+pkg syscall (freebsd-arm64), const IFAN_DEPARTURE ideal-int
+pkg syscall (freebsd-arm64), const IFF_ALLMULTI = 512
+pkg syscall (freebsd-arm64), const IFF_ALLMULTI ideal-int
+pkg syscall (freebsd-arm64), const IFF_ALTPHYS = 16384
+pkg syscall (freebsd-arm64), const IFF_ALTPHYS ideal-int
+pkg syscall (freebsd-arm64), const IFF_CANTCHANGE = 2199410
+pkg syscall (freebsd-arm64), const IFF_CANTCHANGE ideal-int
+pkg syscall (freebsd-arm64), const IFF_CANTCONFIG = 65536
+pkg syscall (freebsd-arm64), const IFF_CANTCONFIG ideal-int
+pkg syscall (freebsd-arm64), const IFF_DEBUG = 4
+pkg syscall (freebsd-arm64), const IFF_DEBUG ideal-int
+pkg syscall (freebsd-arm64), const IFF_DRV_OACTIVE = 1024
+pkg syscall (freebsd-arm64), const IFF_DRV_OACTIVE ideal-int
+pkg syscall (freebsd-arm64), const IFF_DRV_RUNNING = 64
+pkg syscall (freebsd-arm64), const IFF_DRV_RUNNING ideal-int
+pkg syscall (freebsd-arm64), const IFF_DYING = 2097152
+pkg syscall (freebsd-arm64), const IFF_DYING ideal-int
+pkg syscall (freebsd-arm64), const IFF_LINK0 = 4096
+pkg syscall (freebsd-arm64), const IFF_LINK0 ideal-int
+pkg syscall (freebsd-arm64), const IFF_LINK1 = 8192
+pkg syscall (freebsd-arm64), const IFF_LINK1 ideal-int
+pkg syscall (freebsd-arm64), const IFF_LINK2 = 16384
+pkg syscall (freebsd-arm64), const IFF_LINK2 ideal-int
+pkg syscall (freebsd-arm64), const IFF_LOOPBACK = 8
+pkg syscall (freebsd-arm64), const IFF_MONITOR = 262144
+pkg syscall (freebsd-arm64), const IFF_MONITOR ideal-int
+pkg syscall (freebsd-arm64), const IFF_MULTICAST = 32768
+pkg syscall (freebsd-arm64), const IFF_NOARP = 128
+pkg syscall (freebsd-arm64), const IFF_NOARP ideal-int
+pkg syscall (freebsd-arm64), const IFF_OACTIVE = 1024
+pkg syscall (freebsd-arm64), const IFF_OACTIVE ideal-int
+pkg syscall (freebsd-arm64), const IFF_POINTOPOINT = 16
+pkg syscall (freebsd-arm64), const IFF_POINTOPOINT ideal-int
+pkg syscall (freebsd-arm64), const IFF_PPROMISC = 131072
+pkg syscall (freebsd-arm64), const IFF_PPROMISC ideal-int
+pkg syscall (freebsd-arm64), const IFF_PROMISC = 256
+pkg syscall (freebsd-arm64), const IFF_PROMISC ideal-int
+pkg syscall (freebsd-arm64), const IFF_RENAMING = 4194304
+pkg syscall (freebsd-arm64), const IFF_RENAMING ideal-int
+pkg syscall (freebsd-arm64), const IFF_RUNNING = 64
+pkg syscall (freebsd-arm64), const IFF_RUNNING ideal-int
+pkg syscall (freebsd-arm64), const IFF_SIMPLEX = 2048
+pkg syscall (freebsd-arm64), const IFF_SIMPLEX ideal-int
+pkg syscall (freebsd-arm64), const IFF_SMART = 32
+pkg syscall (freebsd-arm64), const IFF_SMART ideal-int
+pkg syscall (freebsd-arm64), const IFF_STATICARP = 524288
+pkg syscall (freebsd-arm64), const IFF_STATICARP ideal-int
+pkg syscall (freebsd-arm64), const IFNAMSIZ = 16
+pkg syscall (freebsd-arm64), const IFNAMSIZ ideal-int
+pkg syscall (freebsd-arm64), const IFT_1822 = 2
+pkg syscall (freebsd-arm64), const IFT_1822 ideal-int
+pkg syscall (freebsd-arm64), const IFT_A12MPPSWITCH = 130
+pkg syscall (freebsd-arm64), const IFT_A12MPPSWITCH ideal-int
+pkg syscall (freebsd-arm64), const IFT_AAL2 = 187
+pkg syscall (freebsd-arm64), const IFT_AAL2 ideal-int
+pkg syscall (freebsd-arm64), const IFT_AAL5 = 49
+pkg syscall (freebsd-arm64), const IFT_AAL5 ideal-int
+pkg syscall (freebsd-arm64), const IFT_ADSL = 94
+pkg syscall (freebsd-arm64), const IFT_ADSL ideal-int
+pkg syscall (freebsd-arm64), const IFT_AFLANE8023 = 59
+pkg syscall (freebsd-arm64), const IFT_AFLANE8023 ideal-int
+pkg syscall (freebsd-arm64), const IFT_AFLANE8025 = 60
+pkg syscall (freebsd-arm64), const IFT_AFLANE8025 ideal-int
+pkg syscall (freebsd-arm64), const IFT_ARAP = 88
+pkg syscall (freebsd-arm64), const IFT_ARAP ideal-int
+pkg syscall (freebsd-arm64), const IFT_ARCNET = 35
+pkg syscall (freebsd-arm64), const IFT_ARCNET ideal-int
+pkg syscall (freebsd-arm64), const IFT_ARCNETPLUS = 36
+pkg syscall (freebsd-arm64), const IFT_ARCNETPLUS ideal-int
+pkg syscall (freebsd-arm64), const IFT_ASYNC = 84
+pkg syscall (freebsd-arm64), const IFT_ASYNC ideal-int
+pkg syscall (freebsd-arm64), const IFT_ATM = 37
+pkg syscall (freebsd-arm64), const IFT_ATM ideal-int
+pkg syscall (freebsd-arm64), const IFT_ATMDXI = 105
+pkg syscall (freebsd-arm64), const IFT_ATMDXI ideal-int
+pkg syscall (freebsd-arm64), const IFT_ATMFUNI = 106
+pkg syscall (freebsd-arm64), const IFT_ATMFUNI ideal-int
+pkg syscall (freebsd-arm64), const IFT_ATMIMA = 107
+pkg syscall (freebsd-arm64), const IFT_ATMIMA ideal-int
+pkg syscall (freebsd-arm64), const IFT_ATMLOGICAL = 80
+pkg syscall (freebsd-arm64), const IFT_ATMLOGICAL ideal-int
+pkg syscall (freebsd-arm64), const IFT_ATMRADIO = 189
+pkg syscall (freebsd-arm64), const IFT_ATMRADIO ideal-int
+pkg syscall (freebsd-arm64), const IFT_ATMSUBINTERFACE = 134
+pkg syscall (freebsd-arm64), const IFT_ATMSUBINTERFACE ideal-int
+pkg syscall (freebsd-arm64), const IFT_ATMVCIENDPT = 194
+pkg syscall (freebsd-arm64), const IFT_ATMVCIENDPT ideal-int
+pkg syscall (freebsd-arm64), const IFT_ATMVIRTUAL = 149
+pkg syscall (freebsd-arm64), const IFT_ATMVIRTUAL ideal-int
+pkg syscall (freebsd-arm64), const IFT_BGPPOLICYACCOUNTING = 162
+pkg syscall (freebsd-arm64), const IFT_BGPPOLICYACCOUNTING ideal-int
+pkg syscall (freebsd-arm64), const IFT_BRIDGE = 209
+pkg syscall (freebsd-arm64), const IFT_BRIDGE ideal-int
+pkg syscall (freebsd-arm64), const IFT_BSC = 83
+pkg syscall (freebsd-arm64), const IFT_BSC ideal-int
+pkg syscall (freebsd-arm64), const IFT_CARP = 248
+pkg syscall (freebsd-arm64), const IFT_CARP ideal-int
+pkg syscall (freebsd-arm64), const IFT_CCTEMUL = 61
+pkg syscall (freebsd-arm64), const IFT_CCTEMUL ideal-int
+pkg syscall (freebsd-arm64), const IFT_CEPT = 19
+pkg syscall (freebsd-arm64), const IFT_CEPT ideal-int
+pkg syscall (freebsd-arm64), const IFT_CES = 133
+pkg syscall (freebsd-arm64), const IFT_CES ideal-int
+pkg syscall (freebsd-arm64), const IFT_CHANNEL = 70
+pkg syscall (freebsd-arm64), const IFT_CHANNEL ideal-int
+pkg syscall (freebsd-arm64), const IFT_CNR = 85
+pkg syscall (freebsd-arm64), const IFT_CNR ideal-int
+pkg syscall (freebsd-arm64), const IFT_COFFEE = 132
+pkg syscall (freebsd-arm64), const IFT_COFFEE ideal-int
+pkg syscall (freebsd-arm64), const IFT_COMPOSITELINK = 155
+pkg syscall (freebsd-arm64), const IFT_COMPOSITELINK ideal-int
+pkg syscall (freebsd-arm64), const IFT_DCN = 141
+pkg syscall (freebsd-arm64), const IFT_DCN ideal-int
+pkg syscall (freebsd-arm64), const IFT_DIGITALPOWERLINE = 138
+pkg syscall (freebsd-arm64), const IFT_DIGITALPOWERLINE ideal-int
+pkg syscall (freebsd-arm64), const IFT_DIGITALWRAPPEROVERHEADCHANNEL = 186
+pkg syscall (freebsd-arm64), const IFT_DIGITALWRAPPEROVERHEADCHANNEL ideal-int
+pkg syscall (freebsd-arm64), const IFT_DLSW = 74
+pkg syscall (freebsd-arm64), const IFT_DLSW ideal-int
+pkg syscall (freebsd-arm64), const IFT_DOCSCABLEDOWNSTREAM = 128
+pkg syscall (freebsd-arm64), const IFT_DOCSCABLEDOWNSTREAM ideal-int
+pkg syscall (freebsd-arm64), const IFT_DOCSCABLEMACLAYER = 127
+pkg syscall (freebsd-arm64), const IFT_DOCSCABLEMACLAYER ideal-int
+pkg syscall (freebsd-arm64), const IFT_DOCSCABLEUPSTREAM = 129
+pkg syscall (freebsd-arm64), const IFT_DOCSCABLEUPSTREAM ideal-int
+pkg syscall (freebsd-arm64), const IFT_DS0 = 81
+pkg syscall (freebsd-arm64), const IFT_DS0 ideal-int
+pkg syscall (freebsd-arm64), const IFT_DS0BUNDLE = 82
+pkg syscall (freebsd-arm64), const IFT_DS0BUNDLE ideal-int
+pkg syscall (freebsd-arm64), const IFT_DS1FDL = 170
+pkg syscall (freebsd-arm64), const IFT_DS1FDL ideal-int
+pkg syscall (freebsd-arm64), const IFT_DS3 = 30
+pkg syscall (freebsd-arm64), const IFT_DS3 ideal-int
+pkg syscall (freebsd-arm64), const IFT_DTM = 140
+pkg syscall (freebsd-arm64), const IFT_DTM ideal-int
+pkg syscall (freebsd-arm64), const IFT_DVBASILN = 172
+pkg syscall (freebsd-arm64), const IFT_DVBASILN ideal-int
+pkg syscall (freebsd-arm64), const IFT_DVBASIOUT = 173
+pkg syscall (freebsd-arm64), const IFT_DVBASIOUT ideal-int
+pkg syscall (freebsd-arm64), const IFT_DVBRCCDOWNSTREAM = 147
+pkg syscall (freebsd-arm64), const IFT_DVBRCCDOWNSTREAM ideal-int
+pkg syscall (freebsd-arm64), const IFT_DVBRCCMACLAYER = 146
+pkg syscall (freebsd-arm64), const IFT_DVBRCCMACLAYER ideal-int
+pkg syscall (freebsd-arm64), const IFT_DVBRCCUPSTREAM = 148
+pkg syscall (freebsd-arm64), const IFT_DVBRCCUPSTREAM ideal-int
+pkg syscall (freebsd-arm64), const IFT_ENC = 244
+pkg syscall (freebsd-arm64), const IFT_ENC ideal-int
+pkg syscall (freebsd-arm64), const IFT_EON = 25
+pkg syscall (freebsd-arm64), const IFT_EON ideal-int
+pkg syscall (freebsd-arm64), const IFT_EPLRS = 87
+pkg syscall (freebsd-arm64), const IFT_EPLRS ideal-int
+pkg syscall (freebsd-arm64), const IFT_ESCON = 73
+pkg syscall (freebsd-arm64), const IFT_ESCON ideal-int
+pkg syscall (freebsd-arm64), const IFT_ETHER = 6
+pkg syscall (freebsd-arm64), const IFT_ETHER ideal-int
+pkg syscall (freebsd-arm64), const IFT_FAITH = 242
+pkg syscall (freebsd-arm64), const IFT_FAITH ideal-int
+pkg syscall (freebsd-arm64), const IFT_FAST = 125
+pkg syscall (freebsd-arm64), const IFT_FAST ideal-int
+pkg syscall (freebsd-arm64), const IFT_FASTETHER = 62
+pkg syscall (freebsd-arm64), const IFT_FASTETHER ideal-int
+pkg syscall (freebsd-arm64), const IFT_FASTETHERFX = 69
+pkg syscall (freebsd-arm64), const IFT_FASTETHERFX ideal-int
+pkg syscall (freebsd-arm64), const IFT_FDDI = 15
+pkg syscall (freebsd-arm64), const IFT_FDDI ideal-int
+pkg syscall (freebsd-arm64), const IFT_FIBRECHANNEL = 56
+pkg syscall (freebsd-arm64), const IFT_FIBRECHANNEL ideal-int
+pkg syscall (freebsd-arm64), const IFT_FRAMERELAYINTERCONNECT = 58
+pkg syscall (freebsd-arm64), const IFT_FRAMERELAYINTERCONNECT ideal-int
+pkg syscall (freebsd-arm64), const IFT_FRAMERELAYMPI = 92
+pkg syscall (freebsd-arm64), const IFT_FRAMERELAYMPI ideal-int
+pkg syscall (freebsd-arm64), const IFT_FRDLCIENDPT = 193
+pkg syscall (freebsd-arm64), const IFT_FRDLCIENDPT ideal-int
+pkg syscall (freebsd-arm64), const IFT_FRELAY = 32
+pkg syscall (freebsd-arm64), const IFT_FRELAY ideal-int
+pkg syscall (freebsd-arm64), const IFT_FRELAYDCE = 44
+pkg syscall (freebsd-arm64), const IFT_FRELAYDCE ideal-int
+pkg syscall (freebsd-arm64), const IFT_FRF16MFRBUNDLE = 163
+pkg syscall (freebsd-arm64), const IFT_FRF16MFRBUNDLE ideal-int
+pkg syscall (freebsd-arm64), const IFT_FRFORWARD = 158
+pkg syscall (freebsd-arm64), const IFT_FRFORWARD ideal-int
+pkg syscall (freebsd-arm64), const IFT_G703AT2MB = 67
+pkg syscall (freebsd-arm64), const IFT_G703AT2MB ideal-int
+pkg syscall (freebsd-arm64), const IFT_G703AT64K = 66
+pkg syscall (freebsd-arm64), const IFT_G703AT64K ideal-int
+pkg syscall (freebsd-arm64), const IFT_GIF = 240
+pkg syscall (freebsd-arm64), const IFT_GIF ideal-int
+pkg syscall (freebsd-arm64), const IFT_GIGABITETHERNET = 117
+pkg syscall (freebsd-arm64), const IFT_GIGABITETHERNET ideal-int
+pkg syscall (freebsd-arm64), const IFT_GR303IDT = 178
+pkg syscall (freebsd-arm64), const IFT_GR303IDT ideal-int
+pkg syscall (freebsd-arm64), const IFT_GR303RDT = 177
+pkg syscall (freebsd-arm64), const IFT_GR303RDT ideal-int
+pkg syscall (freebsd-arm64), const IFT_H323GATEKEEPER = 164
+pkg syscall (freebsd-arm64), const IFT_H323GATEKEEPER ideal-int
+pkg syscall (freebsd-arm64), const IFT_H323PROXY = 165
+pkg syscall (freebsd-arm64), const IFT_H323PROXY ideal-int
+pkg syscall (freebsd-arm64), const IFT_HDH1822 = 3
+pkg syscall (freebsd-arm64), const IFT_HDH1822 ideal-int
+pkg syscall (freebsd-arm64), const IFT_HDLC = 118
+pkg syscall (freebsd-arm64), const IFT_HDLC ideal-int
+pkg syscall (freebsd-arm64), const IFT_HDSL2 = 168
+pkg syscall (freebsd-arm64), const IFT_HDSL2 ideal-int
+pkg syscall (freebsd-arm64), const IFT_HIPERLAN2 = 183
+pkg syscall (freebsd-arm64), const IFT_HIPERLAN2 ideal-int
+pkg syscall (freebsd-arm64), const IFT_HIPPI = 47
+pkg syscall (freebsd-arm64), const IFT_HIPPI ideal-int
+pkg syscall (freebsd-arm64), const IFT_HIPPIINTERFACE = 57
+pkg syscall (freebsd-arm64), const IFT_HIPPIINTERFACE ideal-int
+pkg syscall (freebsd-arm64), const IFT_HOSTPAD = 90
+pkg syscall (freebsd-arm64), const IFT_HOSTPAD ideal-int
+pkg syscall (freebsd-arm64), const IFT_HSSI = 46
+pkg syscall (freebsd-arm64), const IFT_HSSI ideal-int
+pkg syscall (freebsd-arm64), const IFT_HY = 14
+pkg syscall (freebsd-arm64), const IFT_HY ideal-int
+pkg syscall (freebsd-arm64), const IFT_IBM370PARCHAN = 72
+pkg syscall (freebsd-arm64), const IFT_IBM370PARCHAN ideal-int
+pkg syscall (freebsd-arm64), const IFT_IDSL = 154
+pkg syscall (freebsd-arm64), const IFT_IDSL ideal-int
+pkg syscall (freebsd-arm64), const IFT_IEEE1394 = 144
+pkg syscall (freebsd-arm64), const IFT_IEEE1394 ideal-int
+pkg syscall (freebsd-arm64), const IFT_IEEE80211 = 71
+pkg syscall (freebsd-arm64), const IFT_IEEE80211 ideal-int
+pkg syscall (freebsd-arm64), const IFT_IEEE80212 = 55
+pkg syscall (freebsd-arm64), const IFT_IEEE80212 ideal-int
+pkg syscall (freebsd-arm64), const IFT_IEEE8023ADLAG = 161
+pkg syscall (freebsd-arm64), const IFT_IEEE8023ADLAG ideal-int
+pkg syscall (freebsd-arm64), const IFT_IFGSN = 145
+pkg syscall (freebsd-arm64), const IFT_IFGSN ideal-int
+pkg syscall (freebsd-arm64), const IFT_IMT = 190
+pkg syscall (freebsd-arm64), const IFT_IMT ideal-int
+pkg syscall (freebsd-arm64), const IFT_INFINIBAND = 199
+pkg syscall (freebsd-arm64), const IFT_INFINIBAND ideal-int
+pkg syscall (freebsd-arm64), const IFT_INTERLEAVE = 124
+pkg syscall (freebsd-arm64), const IFT_INTERLEAVE ideal-int
+pkg syscall (freebsd-arm64), const IFT_IP = 126
+pkg syscall (freebsd-arm64), const IFT_IP ideal-int
+pkg syscall (freebsd-arm64), const IFT_IPFORWARD = 142
+pkg syscall (freebsd-arm64), const IFT_IPFORWARD ideal-int
+pkg syscall (freebsd-arm64), const IFT_IPOVERATM = 114
+pkg syscall (freebsd-arm64), const IFT_IPOVERATM ideal-int
+pkg syscall (freebsd-arm64), const IFT_IPOVERCDLC = 109
+pkg syscall (freebsd-arm64), const IFT_IPOVERCDLC ideal-int
+pkg syscall (freebsd-arm64), const IFT_IPOVERCLAW = 110
+pkg syscall (freebsd-arm64), const IFT_IPOVERCLAW ideal-int
+pkg syscall (freebsd-arm64), const IFT_IPSWITCH = 78
+pkg syscall (freebsd-arm64), const IFT_IPSWITCH ideal-int
+pkg syscall (freebsd-arm64), const IFT_IPXIP = 249
+pkg syscall (freebsd-arm64), const IFT_IPXIP ideal-int
+pkg syscall (freebsd-arm64), const IFT_ISDN = 63
+pkg syscall (freebsd-arm64), const IFT_ISDN ideal-int
+pkg syscall (freebsd-arm64), const IFT_ISDNBASIC = 20
+pkg syscall (freebsd-arm64), const IFT_ISDNBASIC ideal-int
+pkg syscall (freebsd-arm64), const IFT_ISDNPRIMARY = 21
+pkg syscall (freebsd-arm64), const IFT_ISDNPRIMARY ideal-int
+pkg syscall (freebsd-arm64), const IFT_ISDNS = 75
+pkg syscall (freebsd-arm64), const IFT_ISDNS ideal-int
+pkg syscall (freebsd-arm64), const IFT_ISDNU = 76
+pkg syscall (freebsd-arm64), const IFT_ISDNU ideal-int
+pkg syscall (freebsd-arm64), const IFT_ISO88022LLC = 41
+pkg syscall (freebsd-arm64), const IFT_ISO88022LLC ideal-int
+pkg syscall (freebsd-arm64), const IFT_ISO88023 = 7
+pkg syscall (freebsd-arm64), const IFT_ISO88023 ideal-int
+pkg syscall (freebsd-arm64), const IFT_ISO88024 = 8
+pkg syscall (freebsd-arm64), const IFT_ISO88024 ideal-int
+pkg syscall (freebsd-arm64), const IFT_ISO88025 = 9
+pkg syscall (freebsd-arm64), const IFT_ISO88025 ideal-int
+pkg syscall (freebsd-arm64), const IFT_ISO88025CRFPINT = 98
+pkg syscall (freebsd-arm64), const IFT_ISO88025CRFPINT ideal-int
+pkg syscall (freebsd-arm64), const IFT_ISO88025DTR = 86
+pkg syscall (freebsd-arm64), const IFT_ISO88025DTR ideal-int
+pkg syscall (freebsd-arm64), const IFT_ISO88025FIBER = 115
+pkg syscall (freebsd-arm64), const IFT_ISO88025FIBER ideal-int
+pkg syscall (freebsd-arm64), const IFT_ISO88026 = 10
+pkg syscall (freebsd-arm64), const IFT_ISO88026 ideal-int
+pkg syscall (freebsd-arm64), const IFT_ISUP = 179
+pkg syscall (freebsd-arm64), const IFT_ISUP ideal-int
+pkg syscall (freebsd-arm64), const IFT_L2VLAN = 135
+pkg syscall (freebsd-arm64), const IFT_L2VLAN ideal-int
+pkg syscall (freebsd-arm64), const IFT_L3IPVLAN = 136
+pkg syscall (freebsd-arm64), const IFT_L3IPVLAN ideal-int
+pkg syscall (freebsd-arm64), const IFT_L3IPXVLAN = 137
+pkg syscall (freebsd-arm64), const IFT_L3IPXVLAN ideal-int
+pkg syscall (freebsd-arm64), const IFT_LAPB = 16
+pkg syscall (freebsd-arm64), const IFT_LAPB ideal-int
+pkg syscall (freebsd-arm64), const IFT_LAPD = 77
+pkg syscall (freebsd-arm64), const IFT_LAPD ideal-int
+pkg syscall (freebsd-arm64), const IFT_LAPF = 119
+pkg syscall (freebsd-arm64), const IFT_LAPF ideal-int
+pkg syscall (freebsd-arm64), const IFT_LOCALTALK = 42
+pkg syscall (freebsd-arm64), const IFT_LOCALTALK ideal-int
+pkg syscall (freebsd-arm64), const IFT_LOOP = 24
+pkg syscall (freebsd-arm64), const IFT_LOOP ideal-int
+pkg syscall (freebsd-arm64), const IFT_MEDIAMAILOVERIP = 139
+pkg syscall (freebsd-arm64), const IFT_MEDIAMAILOVERIP ideal-int
+pkg syscall (freebsd-arm64), const IFT_MFSIGLINK = 167
+pkg syscall (freebsd-arm64), const IFT_MFSIGLINK ideal-int
+pkg syscall (freebsd-arm64), const IFT_MIOX25 = 38
+pkg syscall (freebsd-arm64), const IFT_MIOX25 ideal-int
+pkg syscall (freebsd-arm64), const IFT_MODEM = 48
+pkg syscall (freebsd-arm64), const IFT_MODEM ideal-int
+pkg syscall (freebsd-arm64), const IFT_MPC = 113
+pkg syscall (freebsd-arm64), const IFT_MPC ideal-int
+pkg syscall (freebsd-arm64), const IFT_MPLS = 166
+pkg syscall (freebsd-arm64), const IFT_MPLS ideal-int
+pkg syscall (freebsd-arm64), const IFT_MPLSTUNNEL = 150
+pkg syscall (freebsd-arm64), const IFT_MPLSTUNNEL ideal-int
+pkg syscall (freebsd-arm64), const IFT_MSDSL = 143
+pkg syscall (freebsd-arm64), const IFT_MSDSL ideal-int
+pkg syscall (freebsd-arm64), const IFT_MVL = 191
+pkg syscall (freebsd-arm64), const IFT_MVL ideal-int
+pkg syscall (freebsd-arm64), const IFT_MYRINET = 99
+pkg syscall (freebsd-arm64), const IFT_MYRINET ideal-int
+pkg syscall (freebsd-arm64), const IFT_NFAS = 175
+pkg syscall (freebsd-arm64), const IFT_NFAS ideal-int
+pkg syscall (freebsd-arm64), const IFT_NSIP = 27
+pkg syscall (freebsd-arm64), const IFT_NSIP ideal-int
+pkg syscall (freebsd-arm64), const IFT_OPTICALCHANNEL = 195
+pkg syscall (freebsd-arm64), const IFT_OPTICALCHANNEL ideal-int
+pkg syscall (freebsd-arm64), const IFT_OPTICALTRANSPORT = 196
+pkg syscall (freebsd-arm64), const IFT_OPTICALTRANSPORT ideal-int
+pkg syscall (freebsd-arm64), const IFT_OTHER = 1
+pkg syscall (freebsd-arm64), const IFT_OTHER ideal-int
+pkg syscall (freebsd-arm64), const IFT_P10 = 12
+pkg syscall (freebsd-arm64), const IFT_P10 ideal-int
+pkg syscall (freebsd-arm64), const IFT_P80 = 13
+pkg syscall (freebsd-arm64), const IFT_P80 ideal-int
+pkg syscall (freebsd-arm64), const IFT_PARA = 34
+pkg syscall (freebsd-arm64), const IFT_PARA ideal-int
+pkg syscall (freebsd-arm64), const IFT_PFLOG = 246
+pkg syscall (freebsd-arm64), const IFT_PFLOG ideal-int
+pkg syscall (freebsd-arm64), const IFT_PFSYNC = 247
+pkg syscall (freebsd-arm64), const IFT_PFSYNC ideal-int
+pkg syscall (freebsd-arm64), const IFT_PLC = 174
+pkg syscall (freebsd-arm64), const IFT_PLC ideal-int
+pkg syscall (freebsd-arm64), const IFT_POS = 171
+pkg syscall (freebsd-arm64), const IFT_POS ideal-int
+pkg syscall (freebsd-arm64), const IFT_PPP = 23
+pkg syscall (freebsd-arm64), const IFT_PPP ideal-int
+pkg syscall (freebsd-arm64), const IFT_PPPMULTILINKBUNDLE = 108
+pkg syscall (freebsd-arm64), const IFT_PPPMULTILINKBUNDLE ideal-int
+pkg syscall (freebsd-arm64), const IFT_PROPBWAP2MP = 184
+pkg syscall (freebsd-arm64), const IFT_PROPBWAP2MP ideal-int
+pkg syscall (freebsd-arm64), const IFT_PROPCNLS = 89
+pkg syscall (freebsd-arm64), const IFT_PROPCNLS ideal-int
+pkg syscall (freebsd-arm64), const IFT_PROPDOCSWIRELESSDOWNSTREAM = 181
+pkg syscall (freebsd-arm64), const IFT_PROPDOCSWIRELESSDOWNSTREAM ideal-int
+pkg syscall (freebsd-arm64), const IFT_PROPDOCSWIRELESSMACLAYER = 180
+pkg syscall (freebsd-arm64), const IFT_PROPDOCSWIRELESSMACLAYER ideal-int
+pkg syscall (freebsd-arm64), const IFT_PROPDOCSWIRELESSUPSTREAM = 182
+pkg syscall (freebsd-arm64), const IFT_PROPDOCSWIRELESSUPSTREAM ideal-int
+pkg syscall (freebsd-arm64), const IFT_PROPMUX = 54
+pkg syscall (freebsd-arm64), const IFT_PROPMUX ideal-int
+pkg syscall (freebsd-arm64), const IFT_PROPVIRTUAL = 53
+pkg syscall (freebsd-arm64), const IFT_PROPVIRTUAL ideal-int
+pkg syscall (freebsd-arm64), const IFT_PROPWIRELESSP2P = 157
+pkg syscall (freebsd-arm64), const IFT_PROPWIRELESSP2P ideal-int
+pkg syscall (freebsd-arm64), const IFT_PTPSERIAL = 22
+pkg syscall (freebsd-arm64), const IFT_PTPSERIAL ideal-int
+pkg syscall (freebsd-arm64), const IFT_PVC = 241
+pkg syscall (freebsd-arm64), const IFT_PVC ideal-int
+pkg syscall (freebsd-arm64), const IFT_QLLC = 68
+pkg syscall (freebsd-arm64), const IFT_QLLC ideal-int
+pkg syscall (freebsd-arm64), const IFT_RADIOMAC = 188
+pkg syscall (freebsd-arm64), const IFT_RADIOMAC ideal-int
+pkg syscall (freebsd-arm64), const IFT_RADSL = 95
+pkg syscall (freebsd-arm64), const IFT_RADSL ideal-int
+pkg syscall (freebsd-arm64), const IFT_REACHDSL = 192
+pkg syscall (freebsd-arm64), const IFT_REACHDSL ideal-int
+pkg syscall (freebsd-arm64), const IFT_RFC1483 = 159
+pkg syscall (freebsd-arm64), const IFT_RFC1483 ideal-int
+pkg syscall (freebsd-arm64), const IFT_RS232 = 33
+pkg syscall (freebsd-arm64), const IFT_RS232 ideal-int
+pkg syscall (freebsd-arm64), const IFT_RSRB = 79
+pkg syscall (freebsd-arm64), const IFT_RSRB ideal-int
+pkg syscall (freebsd-arm64), const IFT_SDLC = 17
+pkg syscall (freebsd-arm64), const IFT_SDLC ideal-int
+pkg syscall (freebsd-arm64), const IFT_SDSL = 96
+pkg syscall (freebsd-arm64), const IFT_SDSL ideal-int
+pkg syscall (freebsd-arm64), const IFT_SHDSL = 169
+pkg syscall (freebsd-arm64), const IFT_SHDSL ideal-int
+pkg syscall (freebsd-arm64), const IFT_SIP = 31
+pkg syscall (freebsd-arm64), const IFT_SIP ideal-int
+pkg syscall (freebsd-arm64), const IFT_SLIP = 28
+pkg syscall (freebsd-arm64), const IFT_SLIP ideal-int
+pkg syscall (freebsd-arm64), const IFT_SMDSDXI = 43
+pkg syscall (freebsd-arm64), const IFT_SMDSDXI ideal-int
+pkg syscall (freebsd-arm64), const IFT_SMDSICIP = 52
+pkg syscall (freebsd-arm64), const IFT_SMDSICIP ideal-int
+pkg syscall (freebsd-arm64), const IFT_SONET = 39
+pkg syscall (freebsd-arm64), const IFT_SONET ideal-int
+pkg syscall (freebsd-arm64), const IFT_SONETOVERHEADCHANNEL = 185
+pkg syscall (freebsd-arm64), const IFT_SONETOVERHEADCHANNEL ideal-int
+pkg syscall (freebsd-arm64), const IFT_SONETPATH = 50
+pkg syscall (freebsd-arm64), const IFT_SONETPATH ideal-int
+pkg syscall (freebsd-arm64), const IFT_SONETVT = 51
+pkg syscall (freebsd-arm64), const IFT_SONETVT ideal-int
+pkg syscall (freebsd-arm64), const IFT_SRP = 151
+pkg syscall (freebsd-arm64), const IFT_SRP ideal-int
+pkg syscall (freebsd-arm64), const IFT_SS7SIGLINK = 156
+pkg syscall (freebsd-arm64), const IFT_SS7SIGLINK ideal-int
+pkg syscall (freebsd-arm64), const IFT_STACKTOSTACK = 111
+pkg syscall (freebsd-arm64), const IFT_STACKTOSTACK ideal-int
+pkg syscall (freebsd-arm64), const IFT_STARLAN = 11
+pkg syscall (freebsd-arm64), const IFT_STARLAN ideal-int
+pkg syscall (freebsd-arm64), const IFT_STF = 215
+pkg syscall (freebsd-arm64), const IFT_STF ideal-int
+pkg syscall (freebsd-arm64), const IFT_T1 = 18
+pkg syscall (freebsd-arm64), const IFT_T1 ideal-int
+pkg syscall (freebsd-arm64), const IFT_TDLC = 116
+pkg syscall (freebsd-arm64), const IFT_TDLC ideal-int
+pkg syscall (freebsd-arm64), const IFT_TERMPAD = 91
+pkg syscall (freebsd-arm64), const IFT_TERMPAD ideal-int
+pkg syscall (freebsd-arm64), const IFT_TR008 = 176
+pkg syscall (freebsd-arm64), const IFT_TR008 ideal-int
+pkg syscall (freebsd-arm64), const IFT_TRANSPHDLC = 123
+pkg syscall (freebsd-arm64), const IFT_TRANSPHDLC ideal-int
+pkg syscall (freebsd-arm64), const IFT_TUNNEL = 131
+pkg syscall (freebsd-arm64), const IFT_TUNNEL ideal-int
+pkg syscall (freebsd-arm64), const IFT_ULTRA = 29
+pkg syscall (freebsd-arm64), const IFT_ULTRA ideal-int
+pkg syscall (freebsd-arm64), const IFT_USB = 160
+pkg syscall (freebsd-arm64), const IFT_USB ideal-int
+pkg syscall (freebsd-arm64), const IFT_V11 = 64
+pkg syscall (freebsd-arm64), const IFT_V11 ideal-int
+pkg syscall (freebsd-arm64), const IFT_V35 = 45
+pkg syscall (freebsd-arm64), const IFT_V35 ideal-int
+pkg syscall (freebsd-arm64), const IFT_V36 = 65
+pkg syscall (freebsd-arm64), const IFT_V36 ideal-int
+pkg syscall (freebsd-arm64), const IFT_V37 = 120
+pkg syscall (freebsd-arm64), const IFT_V37 ideal-int
+pkg syscall (freebsd-arm64), const IFT_VDSL = 97
+pkg syscall (freebsd-arm64), const IFT_VDSL ideal-int
+pkg syscall (freebsd-arm64), const IFT_VIRTUALIPADDRESS = 112
+pkg syscall (freebsd-arm64), const IFT_VIRTUALIPADDRESS ideal-int
+pkg syscall (freebsd-arm64), const IFT_VOICEEM = 100
+pkg syscall (freebsd-arm64), const IFT_VOICEEM ideal-int
+pkg syscall (freebsd-arm64), const IFT_VOICEENCAP = 103
+pkg syscall (freebsd-arm64), const IFT_VOICEENCAP ideal-int
+pkg syscall (freebsd-arm64), const IFT_VOICEFXO = 101
+pkg syscall (freebsd-arm64), const IFT_VOICEFXO ideal-int
+pkg syscall (freebsd-arm64), const IFT_VOICEFXS = 102
+pkg syscall (freebsd-arm64), const IFT_VOICEFXS ideal-int
+pkg syscall (freebsd-arm64), const IFT_VOICEOVERATM = 152
+pkg syscall (freebsd-arm64), const IFT_VOICEOVERATM ideal-int
+pkg syscall (freebsd-arm64), const IFT_VOICEOVERFRAMERELAY = 153
+pkg syscall (freebsd-arm64), const IFT_VOICEOVERFRAMERELAY ideal-int
+pkg syscall (freebsd-arm64), const IFT_VOICEOVERIP = 104
+pkg syscall (freebsd-arm64), const IFT_VOICEOVERIP ideal-int
+pkg syscall (freebsd-arm64), const IFT_X213 = 93
+pkg syscall (freebsd-arm64), const IFT_X213 ideal-int
+pkg syscall (freebsd-arm64), const IFT_X25 = 5
+pkg syscall (freebsd-arm64), const IFT_X25 ideal-int
+pkg syscall (freebsd-arm64), const IFT_X25DDN = 4
+pkg syscall (freebsd-arm64), const IFT_X25DDN ideal-int
+pkg syscall (freebsd-arm64), const IFT_X25HUNTGROUP = 122
+pkg syscall (freebsd-arm64), const IFT_X25HUNTGROUP ideal-int
+pkg syscall (freebsd-arm64), const IFT_X25MLP = 121
+pkg syscall (freebsd-arm64), const IFT_X25MLP ideal-int
+pkg syscall (freebsd-arm64), const IFT_X25PLE = 40
+pkg syscall (freebsd-arm64), const IFT_X25PLE ideal-int
+pkg syscall (freebsd-arm64), const IFT_XETHER = 26
+pkg syscall (freebsd-arm64), const IFT_XETHER ideal-int
+pkg syscall (freebsd-arm64), const IGNBRK = 1
+pkg syscall (freebsd-arm64), const IGNBRK ideal-int
+pkg syscall (freebsd-arm64), const IGNCR = 128
+pkg syscall (freebsd-arm64), const IGNCR ideal-int
+pkg syscall (freebsd-arm64), const IGNPAR = 4
+pkg syscall (freebsd-arm64), const IGNPAR ideal-int
+pkg syscall (freebsd-arm64), const IMAXBEL = 8192
+pkg syscall (freebsd-arm64), const IMAXBEL ideal-int
+pkg syscall (freebsd-arm64), const IN_CLASSA_HOST = 16777215
+pkg syscall (freebsd-arm64), const IN_CLASSA_HOST ideal-int
+pkg syscall (freebsd-arm64), const IN_CLASSA_MAX = 128
+pkg syscall (freebsd-arm64), const IN_CLASSA_MAX ideal-int
+pkg syscall (freebsd-arm64), const IN_CLASSA_NET = 4278190080
+pkg syscall (freebsd-arm64), const IN_CLASSA_NET ideal-int
+pkg syscall (freebsd-arm64), const IN_CLASSA_NSHIFT = 24
+pkg syscall (freebsd-arm64), const IN_CLASSA_NSHIFT ideal-int
+pkg syscall (freebsd-arm64), const IN_CLASSB_HOST = 65535
+pkg syscall (freebsd-arm64), const IN_CLASSB_HOST ideal-int
+pkg syscall (freebsd-arm64), const IN_CLASSB_MAX = 65536
+pkg syscall (freebsd-arm64), const IN_CLASSB_MAX ideal-int
+pkg syscall (freebsd-arm64), const IN_CLASSB_NET = 4294901760
+pkg syscall (freebsd-arm64), const IN_CLASSB_NET ideal-int
+pkg syscall (freebsd-arm64), const IN_CLASSB_NSHIFT = 16
+pkg syscall (freebsd-arm64), const IN_CLASSB_NSHIFT ideal-int
+pkg syscall (freebsd-arm64), const IN_CLASSC_HOST = 255
+pkg syscall (freebsd-arm64), const IN_CLASSC_HOST ideal-int
+pkg syscall (freebsd-arm64), const IN_CLASSC_NET = 4294967040
+pkg syscall (freebsd-arm64), const IN_CLASSC_NET ideal-int
+pkg syscall (freebsd-arm64), const IN_CLASSC_NSHIFT = 8
+pkg syscall (freebsd-arm64), const IN_CLASSC_NSHIFT ideal-int
+pkg syscall (freebsd-arm64), const IN_CLASSD_HOST = 268435455
+pkg syscall (freebsd-arm64), const IN_CLASSD_HOST ideal-int
+pkg syscall (freebsd-arm64), const IN_CLASSD_NET = 4026531840
+pkg syscall (freebsd-arm64), const IN_CLASSD_NET ideal-int
+pkg syscall (freebsd-arm64), const IN_CLASSD_NSHIFT = 28
+pkg syscall (freebsd-arm64), const IN_CLASSD_NSHIFT ideal-int
+pkg syscall (freebsd-arm64), const IN_LOOPBACKNET = 127
+pkg syscall (freebsd-arm64), const IN_LOOPBACKNET ideal-int
+pkg syscall (freebsd-arm64), const IN_RFC3021_MASK = 4294967294
+pkg syscall (freebsd-arm64), const IN_RFC3021_MASK ideal-int
+pkg syscall (freebsd-arm64), const INLCR = 64
+pkg syscall (freebsd-arm64), const INLCR ideal-int
+pkg syscall (freebsd-arm64), const INPCK = 16
+pkg syscall (freebsd-arm64), const INPCK ideal-int
+pkg syscall (freebsd-arm64), const IP_ADD_MEMBERSHIP = 12
+pkg syscall (freebsd-arm64), const IP_ADD_SOURCE_MEMBERSHIP = 70
+pkg syscall (freebsd-arm64), const IP_ADD_SOURCE_MEMBERSHIP ideal-int
+pkg syscall (freebsd-arm64), const IP_BINDANY = 24
+pkg syscall (freebsd-arm64), const IP_BINDANY ideal-int
+pkg syscall (freebsd-arm64), const IP_BLOCK_SOURCE = 72
+pkg syscall (freebsd-arm64), const IP_BLOCK_SOURCE ideal-int
+pkg syscall (freebsd-arm64), const IP_DEFAULT_MULTICAST_LOOP = 1
+pkg syscall (freebsd-arm64), const IP_DEFAULT_MULTICAST_LOOP ideal-int
+pkg syscall (freebsd-arm64), const IP_DEFAULT_MULTICAST_TTL = 1
+pkg syscall (freebsd-arm64), const IP_DEFAULT_MULTICAST_TTL ideal-int
+pkg syscall (freebsd-arm64), const IP_DF = 16384
+pkg syscall (freebsd-arm64), const IP_DF ideal-int
+pkg syscall (freebsd-arm64), const IP_DONTFRAG = 67
+pkg syscall (freebsd-arm64), const IP_DONTFRAG ideal-int
+pkg syscall (freebsd-arm64), const IP_DROP_MEMBERSHIP = 13
+pkg syscall (freebsd-arm64), const IP_DROP_SOURCE_MEMBERSHIP = 71
+pkg syscall (freebsd-arm64), const IP_DROP_SOURCE_MEMBERSHIP ideal-int
+pkg syscall (freebsd-arm64), const IP_DUMMYNET_CONFIGURE = 60
+pkg syscall (freebsd-arm64), const IP_DUMMYNET_CONFIGURE ideal-int
+pkg syscall (freebsd-arm64), const IP_DUMMYNET_DEL = 61
+pkg syscall (freebsd-arm64), const IP_DUMMYNET_DEL ideal-int
+pkg syscall (freebsd-arm64), const IP_DUMMYNET_FLUSH = 62
+pkg syscall (freebsd-arm64), const IP_DUMMYNET_FLUSH ideal-int
+pkg syscall (freebsd-arm64), const IP_DUMMYNET_GET = 64
+pkg syscall (freebsd-arm64), const IP_DUMMYNET_GET ideal-int
+pkg syscall (freebsd-arm64), const IP_DUMMYNET3 = 49
+pkg syscall (freebsd-arm64), const IP_DUMMYNET3 ideal-int
+pkg syscall (freebsd-arm64), const IP_FAITH = 22
+pkg syscall (freebsd-arm64), const IP_FAITH ideal-int
+pkg syscall (freebsd-arm64), const IP_FW_ADD = 50
+pkg syscall (freebsd-arm64), const IP_FW_ADD ideal-int
+pkg syscall (freebsd-arm64), const IP_FW_DEL = 51
+pkg syscall (freebsd-arm64), const IP_FW_DEL ideal-int
+pkg syscall (freebsd-arm64), const IP_FW_FLUSH = 52
+pkg syscall (freebsd-arm64), const IP_FW_FLUSH ideal-int
+pkg syscall (freebsd-arm64), const IP_FW_GET = 54
+pkg syscall (freebsd-arm64), const IP_FW_GET ideal-int
+pkg syscall (freebsd-arm64), const IP_FW_NAT_CFG = 56
+pkg syscall (freebsd-arm64), const IP_FW_NAT_CFG ideal-int
+pkg syscall (freebsd-arm64), const IP_FW_NAT_DEL = 57
+pkg syscall (freebsd-arm64), const IP_FW_NAT_DEL ideal-int
+pkg syscall (freebsd-arm64), const IP_FW_NAT_GET_CONFIG = 58
+pkg syscall (freebsd-arm64), const IP_FW_NAT_GET_CONFIG ideal-int
+pkg syscall (freebsd-arm64), const IP_FW_NAT_GET_LOG = 59
+pkg syscall (freebsd-arm64), const IP_FW_NAT_GET_LOG ideal-int
+pkg syscall (freebsd-arm64), const IP_FW_RESETLOG = 55
+pkg syscall (freebsd-arm64), const IP_FW_RESETLOG ideal-int
+pkg syscall (freebsd-arm64), const IP_FW_TABLE_ADD = 40
+pkg syscall (freebsd-arm64), const IP_FW_TABLE_ADD ideal-int
+pkg syscall (freebsd-arm64), const IP_FW_TABLE_DEL = 41
+pkg syscall (freebsd-arm64), const IP_FW_TABLE_DEL ideal-int
+pkg syscall (freebsd-arm64), const IP_FW_TABLE_FLUSH = 42
+pkg syscall (freebsd-arm64), const IP_FW_TABLE_FLUSH ideal-int
+pkg syscall (freebsd-arm64), const IP_FW_TABLE_GETSIZE = 43
+pkg syscall (freebsd-arm64), const IP_FW_TABLE_GETSIZE ideal-int
+pkg syscall (freebsd-arm64), const IP_FW_TABLE_LIST = 44
+pkg syscall (freebsd-arm64), const IP_FW_TABLE_LIST ideal-int
+pkg syscall (freebsd-arm64), const IP_FW_ZERO = 53
+pkg syscall (freebsd-arm64), const IP_FW_ZERO ideal-int
+pkg syscall (freebsd-arm64), const IP_FW3 = 48
+pkg syscall (freebsd-arm64), const IP_FW3 ideal-int
+pkg syscall (freebsd-arm64), const IP_HDRINCL = 2
+pkg syscall (freebsd-arm64), const IP_HDRINCL ideal-int
+pkg syscall (freebsd-arm64), const IP_IPSEC_POLICY = 21
+pkg syscall (freebsd-arm64), const IP_IPSEC_POLICY ideal-int
+pkg syscall (freebsd-arm64), const IP_MAX_GROUP_SRC_FILTER = 512
+pkg syscall (freebsd-arm64), const IP_MAX_GROUP_SRC_FILTER ideal-int
+pkg syscall (freebsd-arm64), const IP_MAX_MEMBERSHIPS = 4095
+pkg syscall (freebsd-arm64), const IP_MAX_MEMBERSHIPS ideal-int
+pkg syscall (freebsd-arm64), const IP_MAX_SOCK_MUTE_FILTER = 128
+pkg syscall (freebsd-arm64), const IP_MAX_SOCK_MUTE_FILTER ideal-int
+pkg syscall (freebsd-arm64), const IP_MAX_SOCK_SRC_FILTER = 128
+pkg syscall (freebsd-arm64), const IP_MAX_SOCK_SRC_FILTER ideal-int
+pkg syscall (freebsd-arm64), const IP_MAX_SOURCE_FILTER = 1024
+pkg syscall (freebsd-arm64), const IP_MAX_SOURCE_FILTER ideal-int
+pkg syscall (freebsd-arm64), const IP_MAXPACKET = 65535
+pkg syscall (freebsd-arm64), const IP_MAXPACKET ideal-int
+pkg syscall (freebsd-arm64), const IP_MF = 8192
+pkg syscall (freebsd-arm64), const IP_MF ideal-int
+pkg syscall (freebsd-arm64), const IP_MIN_MEMBERSHIPS = 31
+pkg syscall (freebsd-arm64), const IP_MIN_MEMBERSHIPS ideal-int
+pkg syscall (freebsd-arm64), const IP_MINTTL = 66
+pkg syscall (freebsd-arm64), const IP_MINTTL ideal-int
+pkg syscall (freebsd-arm64), const IP_MSFILTER = 74
+pkg syscall (freebsd-arm64), const IP_MSFILTER ideal-int
+pkg syscall (freebsd-arm64), const IP_MSS = 576
+pkg syscall (freebsd-arm64), const IP_MSS ideal-int
+pkg syscall (freebsd-arm64), const IP_MULTICAST_IF = 9
+pkg syscall (freebsd-arm64), const IP_MULTICAST_LOOP = 11
+pkg syscall (freebsd-arm64), const IP_MULTICAST_TTL = 10
+pkg syscall (freebsd-arm64), const IP_MULTICAST_VIF = 14
+pkg syscall (freebsd-arm64), const IP_MULTICAST_VIF ideal-int
+pkg syscall (freebsd-arm64), const IP_OFFMASK = 8191
+pkg syscall (freebsd-arm64), const IP_OFFMASK ideal-int
+pkg syscall (freebsd-arm64), const IP_ONESBCAST = 23
+pkg syscall (freebsd-arm64), const IP_ONESBCAST ideal-int
+pkg syscall (freebsd-arm64), const IP_OPTIONS = 1
+pkg syscall (freebsd-arm64), const IP_OPTIONS ideal-int
+pkg syscall (freebsd-arm64), const IP_PORTRANGE = 19
+pkg syscall (freebsd-arm64), const IP_PORTRANGE ideal-int
+pkg syscall (freebsd-arm64), const IP_PORTRANGE_DEFAULT = 0
+pkg syscall (freebsd-arm64), const IP_PORTRANGE_DEFAULT ideal-int
+pkg syscall (freebsd-arm64), const IP_PORTRANGE_HIGH = 1
+pkg syscall (freebsd-arm64), const IP_PORTRANGE_HIGH ideal-int
+pkg syscall (freebsd-arm64), const IP_PORTRANGE_LOW = 2
+pkg syscall (freebsd-arm64), const IP_PORTRANGE_LOW ideal-int
+pkg syscall (freebsd-arm64), const IP_RECVDSTADDR = 7
+pkg syscall (freebsd-arm64), const IP_RECVDSTADDR ideal-int
+pkg syscall (freebsd-arm64), const IP_RECVIF = 20
+pkg syscall (freebsd-arm64), const IP_RECVIF ideal-int
+pkg syscall (freebsd-arm64), const IP_RECVOPTS = 5
+pkg syscall (freebsd-arm64), const IP_RECVOPTS ideal-int
+pkg syscall (freebsd-arm64), const IP_RECVRETOPTS = 6
+pkg syscall (freebsd-arm64), const IP_RECVRETOPTS ideal-int
+pkg syscall (freebsd-arm64), const IP_RECVTOS = 68
+pkg syscall (freebsd-arm64), const IP_RECVTOS ideal-int
+pkg syscall (freebsd-arm64), const IP_RECVTTL = 65
+pkg syscall (freebsd-arm64), const IP_RECVTTL ideal-int
+pkg syscall (freebsd-arm64), const IP_RETOPTS = 8
+pkg syscall (freebsd-arm64), const IP_RETOPTS ideal-int
+pkg syscall (freebsd-arm64), const IP_RF = 32768
+pkg syscall (freebsd-arm64), const IP_RF ideal-int
+pkg syscall (freebsd-arm64), const IP_RSVP_OFF = 16
+pkg syscall (freebsd-arm64), const IP_RSVP_OFF ideal-int
+pkg syscall (freebsd-arm64), const IP_RSVP_ON = 15
+pkg syscall (freebsd-arm64), const IP_RSVP_ON ideal-int
+pkg syscall (freebsd-arm64), const IP_RSVP_VIF_OFF = 18
+pkg syscall (freebsd-arm64), const IP_RSVP_VIF_OFF ideal-int
+pkg syscall (freebsd-arm64), const IP_RSVP_VIF_ON = 17
+pkg syscall (freebsd-arm64), const IP_RSVP_VIF_ON ideal-int
+pkg syscall (freebsd-arm64), const IP_SENDSRCADDR = 7
+pkg syscall (freebsd-arm64), const IP_SENDSRCADDR ideal-int
+pkg syscall (freebsd-arm64), const IP_TOS = 3
+pkg syscall (freebsd-arm64), const IP_TTL = 4
+pkg syscall (freebsd-arm64), const IP_UNBLOCK_SOURCE = 73
+pkg syscall (freebsd-arm64), const IP_UNBLOCK_SOURCE ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_3PC = 34
+pkg syscall (freebsd-arm64), const IPPROTO_3PC ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_ADFS = 68
+pkg syscall (freebsd-arm64), const IPPROTO_ADFS ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_AH = 51
+pkg syscall (freebsd-arm64), const IPPROTO_AH ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_AHIP = 61
+pkg syscall (freebsd-arm64), const IPPROTO_AHIP ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_APES = 99
+pkg syscall (freebsd-arm64), const IPPROTO_APES ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_ARGUS = 13
+pkg syscall (freebsd-arm64), const IPPROTO_ARGUS ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_AX25 = 93
+pkg syscall (freebsd-arm64), const IPPROTO_AX25 ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_BHA = 49
+pkg syscall (freebsd-arm64), const IPPROTO_BHA ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_BLT = 30
+pkg syscall (freebsd-arm64), const IPPROTO_BLT ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_BRSATMON = 76
+pkg syscall (freebsd-arm64), const IPPROTO_BRSATMON ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_CARP = 112
+pkg syscall (freebsd-arm64), const IPPROTO_CARP ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_CFTP = 62
+pkg syscall (freebsd-arm64), const IPPROTO_CFTP ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_CHAOS = 16
+pkg syscall (freebsd-arm64), const IPPROTO_CHAOS ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_CMTP = 38
+pkg syscall (freebsd-arm64), const IPPROTO_CMTP ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_CPHB = 73
+pkg syscall (freebsd-arm64), const IPPROTO_CPHB ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_CPNX = 72
+pkg syscall (freebsd-arm64), const IPPROTO_CPNX ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_DDP = 37
+pkg syscall (freebsd-arm64), const IPPROTO_DDP ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_DGP = 86
+pkg syscall (freebsd-arm64), const IPPROTO_DGP ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_DIVERT = 258
+pkg syscall (freebsd-arm64), const IPPROTO_DIVERT ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_DONE = 257
+pkg syscall (freebsd-arm64), const IPPROTO_DONE ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_DSTOPTS = 60
+pkg syscall (freebsd-arm64), const IPPROTO_DSTOPTS ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_EGP = 8
+pkg syscall (freebsd-arm64), const IPPROTO_EGP ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_EMCON = 14
+pkg syscall (freebsd-arm64), const IPPROTO_EMCON ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_ENCAP = 98
+pkg syscall (freebsd-arm64), const IPPROTO_ENCAP ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_EON = 80
+pkg syscall (freebsd-arm64), const IPPROTO_EON ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_ESP = 50
+pkg syscall (freebsd-arm64), const IPPROTO_ESP ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_ETHERIP = 97
+pkg syscall (freebsd-arm64), const IPPROTO_ETHERIP ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_FRAGMENT = 44
+pkg syscall (freebsd-arm64), const IPPROTO_FRAGMENT ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_GGP = 3
+pkg syscall (freebsd-arm64), const IPPROTO_GGP ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_GMTP = 100
+pkg syscall (freebsd-arm64), const IPPROTO_GMTP ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_GRE = 47
+pkg syscall (freebsd-arm64), const IPPROTO_GRE ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_HELLO = 63
+pkg syscall (freebsd-arm64), const IPPROTO_HELLO ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_HMP = 20
+pkg syscall (freebsd-arm64), const IPPROTO_HMP ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_HOPOPTS = 0
+pkg syscall (freebsd-arm64), const IPPROTO_HOPOPTS ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_ICMP = 1
+pkg syscall (freebsd-arm64), const IPPROTO_ICMP ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_ICMPV6 = 58
+pkg syscall (freebsd-arm64), const IPPROTO_ICMPV6 ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_IDP = 22
+pkg syscall (freebsd-arm64), const IPPROTO_IDP ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_IDPR = 35
+pkg syscall (freebsd-arm64), const IPPROTO_IDPR ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_IDRP = 45
+pkg syscall (freebsd-arm64), const IPPROTO_IDRP ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_IGMP = 2
+pkg syscall (freebsd-arm64), const IPPROTO_IGMP ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_IGP = 85
+pkg syscall (freebsd-arm64), const IPPROTO_IGP ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_IGRP = 88
+pkg syscall (freebsd-arm64), const IPPROTO_IGRP ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_IL = 40
+pkg syscall (freebsd-arm64), const IPPROTO_IL ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_INLSP = 52
+pkg syscall (freebsd-arm64), const IPPROTO_INLSP ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_INP = 32
+pkg syscall (freebsd-arm64), const IPPROTO_INP ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_IPCOMP = 108
+pkg syscall (freebsd-arm64), const IPPROTO_IPCOMP ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_IPCV = 71
+pkg syscall (freebsd-arm64), const IPPROTO_IPCV ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_IPEIP = 94
+pkg syscall (freebsd-arm64), const IPPROTO_IPEIP ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_IPIP = 4
+pkg syscall (freebsd-arm64), const IPPROTO_IPIP ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_IPPC = 67
+pkg syscall (freebsd-arm64), const IPPROTO_IPPC ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_IPV4 = 4
+pkg syscall (freebsd-arm64), const IPPROTO_IPV4 ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_IRTP = 28
+pkg syscall (freebsd-arm64), const IPPROTO_IRTP ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_KRYPTOLAN = 65
+pkg syscall (freebsd-arm64), const IPPROTO_KRYPTOLAN ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_LARP = 91
+pkg syscall (freebsd-arm64), const IPPROTO_LARP ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_LEAF1 = 25
+pkg syscall (freebsd-arm64), const IPPROTO_LEAF1 ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_LEAF2 = 26
+pkg syscall (freebsd-arm64), const IPPROTO_LEAF2 ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_MAX = 256
+pkg syscall (freebsd-arm64), const IPPROTO_MAX ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_MAXID = 52
+pkg syscall (freebsd-arm64), const IPPROTO_MAXID ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_MEAS = 19
+pkg syscall (freebsd-arm64), const IPPROTO_MEAS ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_MH = 135
+pkg syscall (freebsd-arm64), const IPPROTO_MH ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_MHRP = 48
+pkg syscall (freebsd-arm64), const IPPROTO_MHRP ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_MICP = 95
+pkg syscall (freebsd-arm64), const IPPROTO_MICP ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_MOBILE = 55
+pkg syscall (freebsd-arm64), const IPPROTO_MOBILE ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_MPLS = 137
+pkg syscall (freebsd-arm64), const IPPROTO_MPLS ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_MTP = 92
+pkg syscall (freebsd-arm64), const IPPROTO_MTP ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_MUX = 18
+pkg syscall (freebsd-arm64), const IPPROTO_MUX ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_ND = 77
+pkg syscall (freebsd-arm64), const IPPROTO_ND ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_NHRP = 54
+pkg syscall (freebsd-arm64), const IPPROTO_NHRP ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_NONE = 59
+pkg syscall (freebsd-arm64), const IPPROTO_NONE ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_NSP = 31
+pkg syscall (freebsd-arm64), const IPPROTO_NSP ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_NVPII = 11
+pkg syscall (freebsd-arm64), const IPPROTO_NVPII ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_OLD_DIVERT = 254
+pkg syscall (freebsd-arm64), const IPPROTO_OLD_DIVERT ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_OSPFIGP = 89
+pkg syscall (freebsd-arm64), const IPPROTO_OSPFIGP ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_PFSYNC = 240
+pkg syscall (freebsd-arm64), const IPPROTO_PFSYNC ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_PGM = 113
+pkg syscall (freebsd-arm64), const IPPROTO_PGM ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_PIGP = 9
+pkg syscall (freebsd-arm64), const IPPROTO_PIGP ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_PIM = 103
+pkg syscall (freebsd-arm64), const IPPROTO_PIM ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_PRM = 21
+pkg syscall (freebsd-arm64), const IPPROTO_PRM ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_PUP = 12
+pkg syscall (freebsd-arm64), const IPPROTO_PUP ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_PVP = 75
+pkg syscall (freebsd-arm64), const IPPROTO_PVP ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_RAW = 255
+pkg syscall (freebsd-arm64), const IPPROTO_RAW ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_RCCMON = 10
+pkg syscall (freebsd-arm64), const IPPROTO_RCCMON ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_RDP = 27
+pkg syscall (freebsd-arm64), const IPPROTO_RDP ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_ROUTING = 43
+pkg syscall (freebsd-arm64), const IPPROTO_ROUTING ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_RSVP = 46
+pkg syscall (freebsd-arm64), const IPPROTO_RSVP ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_RVD = 66
+pkg syscall (freebsd-arm64), const IPPROTO_RVD ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_SATEXPAK = 64
+pkg syscall (freebsd-arm64), const IPPROTO_SATEXPAK ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_SATMON = 69
+pkg syscall (freebsd-arm64), const IPPROTO_SATMON ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_SCCSP = 96
+pkg syscall (freebsd-arm64), const IPPROTO_SCCSP ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_SCTP = 132
+pkg syscall (freebsd-arm64), const IPPROTO_SCTP ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_SDRP = 42
+pkg syscall (freebsd-arm64), const IPPROTO_SDRP ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_SEND = 259
+pkg syscall (freebsd-arm64), const IPPROTO_SEND ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_SEP = 33
+pkg syscall (freebsd-arm64), const IPPROTO_SEP ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_SKIP = 57
+pkg syscall (freebsd-arm64), const IPPROTO_SKIP ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_SPACER = 32767
+pkg syscall (freebsd-arm64), const IPPROTO_SPACER ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_SRPC = 90
+pkg syscall (freebsd-arm64), const IPPROTO_SRPC ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_ST = 7
+pkg syscall (freebsd-arm64), const IPPROTO_ST ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_SVMTP = 82
+pkg syscall (freebsd-arm64), const IPPROTO_SVMTP ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_SWIPE = 53
+pkg syscall (freebsd-arm64), const IPPROTO_SWIPE ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_TCF = 87
+pkg syscall (freebsd-arm64), const IPPROTO_TCF ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_TLSP = 56
+pkg syscall (freebsd-arm64), const IPPROTO_TLSP ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_TP = 29
+pkg syscall (freebsd-arm64), const IPPROTO_TP ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_TPXX = 39
+pkg syscall (freebsd-arm64), const IPPROTO_TPXX ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_TRUNK1 = 23
+pkg syscall (freebsd-arm64), const IPPROTO_TRUNK1 ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_TRUNK2 = 24
+pkg syscall (freebsd-arm64), const IPPROTO_TRUNK2 ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_TTP = 84
+pkg syscall (freebsd-arm64), const IPPROTO_TTP ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_VINES = 83
+pkg syscall (freebsd-arm64), const IPPROTO_VINES ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_VISA = 70
+pkg syscall (freebsd-arm64), const IPPROTO_VISA ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_VMTP = 81
+pkg syscall (freebsd-arm64), const IPPROTO_VMTP ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_WBEXPAK = 79
+pkg syscall (freebsd-arm64), const IPPROTO_WBEXPAK ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_WBMON = 78
+pkg syscall (freebsd-arm64), const IPPROTO_WBMON ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_WSN = 74
+pkg syscall (freebsd-arm64), const IPPROTO_WSN ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_XNET = 15
+pkg syscall (freebsd-arm64), const IPPROTO_XNET ideal-int
+pkg syscall (freebsd-arm64), const IPPROTO_XTP = 36
+pkg syscall (freebsd-arm64), const IPPROTO_XTP ideal-int
+pkg syscall (freebsd-arm64), const IPV6_AUTOFLOWLABEL = 59
+pkg syscall (freebsd-arm64), const IPV6_AUTOFLOWLABEL ideal-int
+pkg syscall (freebsd-arm64), const IPV6_BINDANY = 64
+pkg syscall (freebsd-arm64), const IPV6_BINDANY ideal-int
+pkg syscall (freebsd-arm64), const IPV6_BINDV6ONLY = 27
+pkg syscall (freebsd-arm64), const IPV6_BINDV6ONLY ideal-int
+pkg syscall (freebsd-arm64), const IPV6_CHECKSUM = 26
+pkg syscall (freebsd-arm64), const IPV6_CHECKSUM ideal-int
+pkg syscall (freebsd-arm64), const IPV6_DEFAULT_MULTICAST_HOPS = 1
+pkg syscall (freebsd-arm64), const IPV6_DEFAULT_MULTICAST_HOPS ideal-int
+pkg syscall (freebsd-arm64), const IPV6_DEFAULT_MULTICAST_LOOP = 1
+pkg syscall (freebsd-arm64), const IPV6_DEFAULT_MULTICAST_LOOP ideal-int
+pkg syscall (freebsd-arm64), const IPV6_DEFHLIM = 64
+pkg syscall (freebsd-arm64), const IPV6_DEFHLIM ideal-int
+pkg syscall (freebsd-arm64), const IPV6_DONTFRAG = 62
+pkg syscall (freebsd-arm64), const IPV6_DONTFRAG ideal-int
+pkg syscall (freebsd-arm64), const IPV6_DSTOPTS = 50
+pkg syscall (freebsd-arm64), const IPV6_DSTOPTS ideal-int
+pkg syscall (freebsd-arm64), const IPV6_FAITH = 29
+pkg syscall (freebsd-arm64), const IPV6_FAITH ideal-int
+pkg syscall (freebsd-arm64), const IPV6_FLOWINFO_MASK = 4294967055
+pkg syscall (freebsd-arm64), const IPV6_FLOWINFO_MASK ideal-int
+pkg syscall (freebsd-arm64), const IPV6_FLOWLABEL_MASK = 4294905600
+pkg syscall (freebsd-arm64), const IPV6_FLOWLABEL_MASK ideal-int
+pkg syscall (freebsd-arm64), const IPV6_FRAGTTL = 120
+pkg syscall (freebsd-arm64), const IPV6_FRAGTTL ideal-int
+pkg syscall (freebsd-arm64), const IPV6_FW_ADD = 30
+pkg syscall (freebsd-arm64), const IPV6_FW_ADD ideal-int
+pkg syscall (freebsd-arm64), const IPV6_FW_DEL = 31
+pkg syscall (freebsd-arm64), const IPV6_FW_DEL ideal-int
+pkg syscall (freebsd-arm64), const IPV6_FW_FLUSH = 32
+pkg syscall (freebsd-arm64), const IPV6_FW_FLUSH ideal-int
+pkg syscall (freebsd-arm64), const IPV6_FW_GET = 34
+pkg syscall (freebsd-arm64), const IPV6_FW_GET ideal-int
+pkg syscall (freebsd-arm64), const IPV6_FW_ZERO = 33
+pkg syscall (freebsd-arm64), const IPV6_FW_ZERO ideal-int
+pkg syscall (freebsd-arm64), const IPV6_HLIMDEC = 1
+pkg syscall (freebsd-arm64), const IPV6_HLIMDEC ideal-int
+pkg syscall (freebsd-arm64), const IPV6_HOPLIMIT = 47
+pkg syscall (freebsd-arm64), const IPV6_HOPLIMIT ideal-int
+pkg syscall (freebsd-arm64), const IPV6_HOPOPTS = 49
+pkg syscall (freebsd-arm64), const IPV6_HOPOPTS ideal-int
+pkg syscall (freebsd-arm64), const IPV6_IPSEC_POLICY = 28
+pkg syscall (freebsd-arm64), const IPV6_IPSEC_POLICY ideal-int
+pkg syscall (freebsd-arm64), const IPV6_JOIN_GROUP = 12
+pkg syscall (freebsd-arm64), const IPV6_LEAVE_GROUP = 13
+pkg syscall (freebsd-arm64), const IPV6_MAX_GROUP_SRC_FILTER = 512
+pkg syscall (freebsd-arm64), const IPV6_MAX_GROUP_SRC_FILTER ideal-int
+pkg syscall (freebsd-arm64), const IPV6_MAX_MEMBERSHIPS = 4095
+pkg syscall (freebsd-arm64), const IPV6_MAX_MEMBERSHIPS ideal-int
+pkg syscall (freebsd-arm64), const IPV6_MAX_SOCK_SRC_FILTER = 128
+pkg syscall (freebsd-arm64), const IPV6_MAX_SOCK_SRC_FILTER ideal-int
+pkg syscall (freebsd-arm64), const IPV6_MAXHLIM = 255
+pkg syscall (freebsd-arm64), const IPV6_MAXHLIM ideal-int
+pkg syscall (freebsd-arm64), const IPV6_MAXOPTHDR = 2048
+pkg syscall (freebsd-arm64), const IPV6_MAXOPTHDR ideal-int
+pkg syscall (freebsd-arm64), const IPV6_MAXPACKET = 65535
+pkg syscall (freebsd-arm64), const IPV6_MAXPACKET ideal-int
+pkg syscall (freebsd-arm64), const IPV6_MIN_MEMBERSHIPS = 31
+pkg syscall (freebsd-arm64), const IPV6_MIN_MEMBERSHIPS ideal-int
+pkg syscall (freebsd-arm64), const IPV6_MMTU = 1280
+pkg syscall (freebsd-arm64), const IPV6_MMTU ideal-int
+pkg syscall (freebsd-arm64), const IPV6_MSFILTER = 74
+pkg syscall (freebsd-arm64), const IPV6_MSFILTER ideal-int
+pkg syscall (freebsd-arm64), const IPV6_MULTICAST_HOPS = 10
+pkg syscall (freebsd-arm64), const IPV6_MULTICAST_IF = 9
+pkg syscall (freebsd-arm64), const IPV6_MULTICAST_LOOP = 11
+pkg syscall (freebsd-arm64), const IPV6_NEXTHOP = 48
+pkg syscall (freebsd-arm64), const IPV6_NEXTHOP ideal-int
+pkg syscall (freebsd-arm64), const IPV6_PATHMTU = 44
+pkg syscall (freebsd-arm64), const IPV6_PATHMTU ideal-int
+pkg syscall (freebsd-arm64), const IPV6_PKTINFO = 46
+pkg syscall (freebsd-arm64), const IPV6_PKTINFO ideal-int
+pkg syscall (freebsd-arm64), const IPV6_PORTRANGE = 14
+pkg syscall (freebsd-arm64), const IPV6_PORTRANGE ideal-int
+pkg syscall (freebsd-arm64), const IPV6_PORTRANGE_DEFAULT = 0
+pkg syscall (freebsd-arm64), const IPV6_PORTRANGE_DEFAULT ideal-int
+pkg syscall (freebsd-arm64), const IPV6_PORTRANGE_HIGH = 1
+pkg syscall (freebsd-arm64), const IPV6_PORTRANGE_HIGH ideal-int
+pkg syscall (freebsd-arm64), const IPV6_PORTRANGE_LOW = 2
+pkg syscall (freebsd-arm64), const IPV6_PORTRANGE_LOW ideal-int
+pkg syscall (freebsd-arm64), const IPV6_PREFER_TEMPADDR = 63
+pkg syscall (freebsd-arm64), const IPV6_PREFER_TEMPADDR ideal-int
+pkg syscall (freebsd-arm64), const IPV6_RECVDSTOPTS = 40
+pkg syscall (freebsd-arm64), const IPV6_RECVDSTOPTS ideal-int
+pkg syscall (freebsd-arm64), const IPV6_RECVHOPLIMIT = 37
+pkg syscall (freebsd-arm64), const IPV6_RECVHOPLIMIT ideal-int
+pkg syscall (freebsd-arm64), const IPV6_RECVHOPOPTS = 39
+pkg syscall (freebsd-arm64), const IPV6_RECVHOPOPTS ideal-int
+pkg syscall (freebsd-arm64), const IPV6_RECVPATHMTU = 43
+pkg syscall (freebsd-arm64), const IPV6_RECVPATHMTU ideal-int
+pkg syscall (freebsd-arm64), const IPV6_RECVPKTINFO = 36
+pkg syscall (freebsd-arm64), const IPV6_RECVPKTINFO ideal-int
+pkg syscall (freebsd-arm64), const IPV6_RECVRTHDR = 38
+pkg syscall (freebsd-arm64), const IPV6_RECVRTHDR ideal-int
+pkg syscall (freebsd-arm64), const IPV6_RECVTCLASS = 57
+pkg syscall (freebsd-arm64), const IPV6_RECVTCLASS ideal-int
+pkg syscall (freebsd-arm64), const IPV6_RTHDR = 51
+pkg syscall (freebsd-arm64), const IPV6_RTHDR ideal-int
+pkg syscall (freebsd-arm64), const IPV6_RTHDR_LOOSE = 0
+pkg syscall (freebsd-arm64), const IPV6_RTHDR_LOOSE ideal-int
+pkg syscall (freebsd-arm64), const IPV6_RTHDR_STRICT = 1
+pkg syscall (freebsd-arm64), const IPV6_RTHDR_STRICT ideal-int
+pkg syscall (freebsd-arm64), const IPV6_RTHDR_TYPE_0 = 0
+pkg syscall (freebsd-arm64), const IPV6_RTHDR_TYPE_0 ideal-int
+pkg syscall (freebsd-arm64), const IPV6_RTHDRDSTOPTS = 35
+pkg syscall (freebsd-arm64), const IPV6_RTHDRDSTOPTS ideal-int
+pkg syscall (freebsd-arm64), const IPV6_SOCKOPT_RESERVED1 = 3
+pkg syscall (freebsd-arm64), const IPV6_SOCKOPT_RESERVED1 ideal-int
+pkg syscall (freebsd-arm64), const IPV6_TCLASS = 61
+pkg syscall (freebsd-arm64), const IPV6_TCLASS ideal-int
+pkg syscall (freebsd-arm64), const IPV6_UNICAST_HOPS = 4
+pkg syscall (freebsd-arm64), const IPV6_USE_MIN_MTU = 42
+pkg syscall (freebsd-arm64), const IPV6_USE_MIN_MTU ideal-int
+pkg syscall (freebsd-arm64), const IPV6_V6ONLY = 27
+pkg syscall (freebsd-arm64), const IPV6_VERSION = 96
+pkg syscall (freebsd-arm64), const IPV6_VERSION ideal-int
+pkg syscall (freebsd-arm64), const IPV6_VERSION_MASK = 240
+pkg syscall (freebsd-arm64), const IPV6_VERSION_MASK ideal-int
+pkg syscall (freebsd-arm64), const ISIG = 128
+pkg syscall (freebsd-arm64), const ISIG ideal-int
+pkg syscall (freebsd-arm64), const ISTRIP = 32
+pkg syscall (freebsd-arm64), const ISTRIP ideal-int
+pkg syscall (freebsd-arm64), const IXANY = 2048
+pkg syscall (freebsd-arm64), const IXANY ideal-int
+pkg syscall (freebsd-arm64), const IXOFF = 1024
+pkg syscall (freebsd-arm64), const IXOFF ideal-int
+pkg syscall (freebsd-arm64), const IXON = 512
+pkg syscall (freebsd-arm64), const IXON ideal-int
+pkg syscall (freebsd-arm64), const LOCK_EX = 2
+pkg syscall (freebsd-arm64), const LOCK_EX ideal-int
+pkg syscall (freebsd-arm64), const LOCK_NB = 4
+pkg syscall (freebsd-arm64), const LOCK_NB ideal-int
+pkg syscall (freebsd-arm64), const LOCK_SH = 1
+pkg syscall (freebsd-arm64), const LOCK_SH ideal-int
+pkg syscall (freebsd-arm64), const LOCK_UN = 8
+pkg syscall (freebsd-arm64), const LOCK_UN ideal-int
+pkg syscall (freebsd-arm64), const MADV_AUTOSYNC = 7
+pkg syscall (freebsd-arm64), const MADV_AUTOSYNC ideal-int
+pkg syscall (freebsd-arm64), const MADV_CORE = 9
+pkg syscall (freebsd-arm64), const MADV_CORE ideal-int
+pkg syscall (freebsd-arm64), const MADV_DONTNEED = 4
+pkg syscall (freebsd-arm64), const MADV_DONTNEED ideal-int
+pkg syscall (freebsd-arm64), const MADV_FREE = 5
+pkg syscall (freebsd-arm64), const MADV_FREE ideal-int
+pkg syscall (freebsd-arm64), const MADV_NOCORE = 8
+pkg syscall (freebsd-arm64), const MADV_NOCORE ideal-int
+pkg syscall (freebsd-arm64), const MADV_NORMAL = 0
+pkg syscall (freebsd-arm64), const MADV_NORMAL ideal-int
+pkg syscall (freebsd-arm64), const MADV_NOSYNC = 6
+pkg syscall (freebsd-arm64), const MADV_NOSYNC ideal-int
+pkg syscall (freebsd-arm64), const MADV_PROTECT = 10
+pkg syscall (freebsd-arm64), const MADV_PROTECT ideal-int
+pkg syscall (freebsd-arm64), const MADV_RANDOM = 1
+pkg syscall (freebsd-arm64), const MADV_RANDOM ideal-int
+pkg syscall (freebsd-arm64), const MADV_SEQUENTIAL = 2
+pkg syscall (freebsd-arm64), const MADV_SEQUENTIAL ideal-int
+pkg syscall (freebsd-arm64), const MADV_WILLNEED = 3
+pkg syscall (freebsd-arm64), const MADV_WILLNEED ideal-int
+pkg syscall (freebsd-arm64), const MAP_32BIT = 524288
+pkg syscall (freebsd-arm64), const MAP_32BIT ideal-int
+pkg syscall (freebsd-arm64), const MAP_ALIGNED_SUPER = 16777216
+pkg syscall (freebsd-arm64), const MAP_ALIGNED_SUPER ideal-int
+pkg syscall (freebsd-arm64), const MAP_ALIGNMENT_MASK = -16777216
+pkg syscall (freebsd-arm64), const MAP_ALIGNMENT_MASK ideal-int
+pkg syscall (freebsd-arm64), const MAP_ALIGNMENT_SHIFT = 24
+pkg syscall (freebsd-arm64), const MAP_ALIGNMENT_SHIFT ideal-int
+pkg syscall (freebsd-arm64), const MAP_ANON = 4096
+pkg syscall (freebsd-arm64), const MAP_ANON ideal-int
+pkg syscall (freebsd-arm64), const MAP_ANONYMOUS = 4096
+pkg syscall (freebsd-arm64), const MAP_ANONYMOUS ideal-int
+pkg syscall (freebsd-arm64), const MAP_COPY = 2
+pkg syscall (freebsd-arm64), const MAP_COPY ideal-int
+pkg syscall (freebsd-arm64), const MAP_FILE = 0
+pkg syscall (freebsd-arm64), const MAP_FILE ideal-int
+pkg syscall (freebsd-arm64), const MAP_FIXED = 16
+pkg syscall (freebsd-arm64), const MAP_FIXED ideal-int
+pkg syscall (freebsd-arm64), const MAP_HASSEMAPHORE = 512
+pkg syscall (freebsd-arm64), const MAP_HASSEMAPHORE ideal-int
+pkg syscall (freebsd-arm64), const MAP_NOCORE = 131072
+pkg syscall (freebsd-arm64), const MAP_NOCORE ideal-int
+pkg syscall (freebsd-arm64), const MAP_NORESERVE = 64
+pkg syscall (freebsd-arm64), const MAP_NORESERVE ideal-int
+pkg syscall (freebsd-arm64), const MAP_NOSYNC = 2048
+pkg syscall (freebsd-arm64), const MAP_NOSYNC ideal-int
+pkg syscall (freebsd-arm64), const MAP_PREFAULT_READ = 262144
+pkg syscall (freebsd-arm64), const MAP_PREFAULT_READ ideal-int
+pkg syscall (freebsd-arm64), const MAP_PRIVATE = 2
+pkg syscall (freebsd-arm64), const MAP_PRIVATE ideal-int
+pkg syscall (freebsd-arm64), const MAP_RENAME = 32
+pkg syscall (freebsd-arm64), const MAP_RENAME ideal-int
+pkg syscall (freebsd-arm64), const MAP_RESERVED0080 = 128
+pkg syscall (freebsd-arm64), const MAP_RESERVED0080 ideal-int
+pkg syscall (freebsd-arm64), const MAP_RESERVED0100 = 256
+pkg syscall (freebsd-arm64), const MAP_RESERVED0100 ideal-int
+pkg syscall (freebsd-arm64), const MAP_SHARED = 1
+pkg syscall (freebsd-arm64), const MAP_SHARED ideal-int
+pkg syscall (freebsd-arm64), const MAP_STACK = 1024
+pkg syscall (freebsd-arm64), const MAP_STACK ideal-int
+pkg syscall (freebsd-arm64), const MCL_CURRENT = 1
+pkg syscall (freebsd-arm64), const MCL_CURRENT ideal-int
+pkg syscall (freebsd-arm64), const MCL_FUTURE = 2
+pkg syscall (freebsd-arm64), const MCL_FUTURE ideal-int
+pkg syscall (freebsd-arm64), const MS_ASYNC = 1
+pkg syscall (freebsd-arm64), const MS_ASYNC ideal-int
+pkg syscall (freebsd-arm64), const MS_INVALIDATE = 2
+pkg syscall (freebsd-arm64), const MS_INVALIDATE ideal-int
+pkg syscall (freebsd-arm64), const MS_SYNC = 0
+pkg syscall (freebsd-arm64), const MS_SYNC ideal-int
+pkg syscall (freebsd-arm64), const MSG_CMSG_CLOEXEC = 262144
+pkg syscall (freebsd-arm64), const MSG_CMSG_CLOEXEC ideal-int
+pkg syscall (freebsd-arm64), const MSG_COMPAT = 32768
+pkg syscall (freebsd-arm64), const MSG_COMPAT ideal-int
+pkg syscall (freebsd-arm64), const MSG_CTRUNC = 32
+pkg syscall (freebsd-arm64), const MSG_CTRUNC ideal-int
+pkg syscall (freebsd-arm64), const MSG_DONTROUTE = 4
+pkg syscall (freebsd-arm64), const MSG_DONTROUTE ideal-int
+pkg syscall (freebsd-arm64), const MSG_DONTWAIT = 128
+pkg syscall (freebsd-arm64), const MSG_DONTWAIT ideal-int
+pkg syscall (freebsd-arm64), const MSG_EOF = 256
+pkg syscall (freebsd-arm64), const MSG_EOF ideal-int
+pkg syscall (freebsd-arm64), const MSG_EOR = 8
+pkg syscall (freebsd-arm64), const MSG_EOR ideal-int
+pkg syscall (freebsd-arm64), const MSG_NBIO = 16384
+pkg syscall (freebsd-arm64), const MSG_NBIO ideal-int
+pkg syscall (freebsd-arm64), const MSG_NOSIGNAL = 131072
+pkg syscall (freebsd-arm64), const MSG_NOSIGNAL ideal-int
+pkg syscall (freebsd-arm64), const MSG_NOTIFICATION = 8192
+pkg syscall (freebsd-arm64), const MSG_NOTIFICATION ideal-int
+pkg syscall (freebsd-arm64), const MSG_OOB = 1
+pkg syscall (freebsd-arm64), const MSG_OOB ideal-int
+pkg syscall (freebsd-arm64), const MSG_PEEK = 2
+pkg syscall (freebsd-arm64), const MSG_PEEK ideal-int
+pkg syscall (freebsd-arm64), const MSG_TRUNC = 16
+pkg syscall (freebsd-arm64), const MSG_TRUNC ideal-int
+pkg syscall (freebsd-arm64), const MSG_WAITALL = 64
+pkg syscall (freebsd-arm64), const MSG_WAITALL ideal-int
+pkg syscall (freebsd-arm64), const NAME_MAX = 255
+pkg syscall (freebsd-arm64), const NAME_MAX ideal-int
+pkg syscall (freebsd-arm64), const NET_RT_DUMP = 1
+pkg syscall (freebsd-arm64), const NET_RT_DUMP ideal-int
+pkg syscall (freebsd-arm64), const NET_RT_FLAGS = 2
+pkg syscall (freebsd-arm64), const NET_RT_FLAGS ideal-int
+pkg syscall (freebsd-arm64), const NET_RT_IFLIST = 3
+pkg syscall (freebsd-arm64), const NET_RT_IFLIST ideal-int
+pkg syscall (freebsd-arm64), const NET_RT_IFLISTL = 5
+pkg syscall (freebsd-arm64), const NET_RT_IFLISTL ideal-int
+pkg syscall (freebsd-arm64), const NET_RT_IFMALIST = 4
+pkg syscall (freebsd-arm64), const NET_RT_IFMALIST ideal-int
+pkg syscall (freebsd-arm64), const NET_RT_MAXID = 6
+pkg syscall (freebsd-arm64), const NET_RT_MAXID ideal-int
+pkg syscall (freebsd-arm64), const NOFLSH = 2147483648
+pkg syscall (freebsd-arm64), const NOFLSH ideal-int
+pkg syscall (freebsd-arm64), const NOTE_ATTRIB = 8
+pkg syscall (freebsd-arm64), const NOTE_ATTRIB ideal-int
+pkg syscall (freebsd-arm64), const NOTE_CHILD = 4
+pkg syscall (freebsd-arm64), const NOTE_CHILD ideal-int
+pkg syscall (freebsd-arm64), const NOTE_DELETE = 1
+pkg syscall (freebsd-arm64), const NOTE_DELETE ideal-int
+pkg syscall (freebsd-arm64), const NOTE_EXEC = 536870912
+pkg syscall (freebsd-arm64), const NOTE_EXEC ideal-int
+pkg syscall (freebsd-arm64), const NOTE_EXIT = 2147483648
+pkg syscall (freebsd-arm64), const NOTE_EXIT ideal-int
+pkg syscall (freebsd-arm64), const NOTE_EXTEND = 4
+pkg syscall (freebsd-arm64), const NOTE_EXTEND ideal-int
+pkg syscall (freebsd-arm64), const NOTE_FFAND = 1073741824
+pkg syscall (freebsd-arm64), const NOTE_FFAND ideal-int
+pkg syscall (freebsd-arm64), const NOTE_FFCOPY = 3221225472
+pkg syscall (freebsd-arm64), const NOTE_FFCOPY ideal-int
+pkg syscall (freebsd-arm64), const NOTE_FFCTRLMASK = 3221225472
+pkg syscall (freebsd-arm64), const NOTE_FFCTRLMASK ideal-int
+pkg syscall (freebsd-arm64), const NOTE_FFLAGSMASK = 16777215
+pkg syscall (freebsd-arm64), const NOTE_FFLAGSMASK ideal-int
+pkg syscall (freebsd-arm64), const NOTE_FFNOP = 0
+pkg syscall (freebsd-arm64), const NOTE_FFNOP ideal-int
+pkg syscall (freebsd-arm64), const NOTE_FFOR = 2147483648
+pkg syscall (freebsd-arm64), const NOTE_FFOR ideal-int
+pkg syscall (freebsd-arm64), const NOTE_FORK = 1073741824
+pkg syscall (freebsd-arm64), const NOTE_FORK ideal-int
+pkg syscall (freebsd-arm64), const NOTE_LINK = 16
+pkg syscall (freebsd-arm64), const NOTE_LINK ideal-int
+pkg syscall (freebsd-arm64), const NOTE_LOWAT = 1
+pkg syscall (freebsd-arm64), const NOTE_LOWAT ideal-int
+pkg syscall (freebsd-arm64), const NOTE_PCTRLMASK = 4026531840
+pkg syscall (freebsd-arm64), const NOTE_PCTRLMASK ideal-int
+pkg syscall (freebsd-arm64), const NOTE_PDATAMASK = 1048575
+pkg syscall (freebsd-arm64), const NOTE_PDATAMASK ideal-int
+pkg syscall (freebsd-arm64), const NOTE_RENAME = 32
+pkg syscall (freebsd-arm64), const NOTE_RENAME ideal-int
+pkg syscall (freebsd-arm64), const NOTE_REVOKE = 64
+pkg syscall (freebsd-arm64), const NOTE_REVOKE ideal-int
+pkg syscall (freebsd-arm64), const NOTE_TRACK = 1
+pkg syscall (freebsd-arm64), const NOTE_TRACK ideal-int
+pkg syscall (freebsd-arm64), const NOTE_TRACKERR = 2
+pkg syscall (freebsd-arm64), const NOTE_TRACKERR ideal-int
+pkg syscall (freebsd-arm64), const NOTE_TRIGGER = 16777216
+pkg syscall (freebsd-arm64), const NOTE_TRIGGER ideal-int
+pkg syscall (freebsd-arm64), const NOTE_WRITE = 2
+pkg syscall (freebsd-arm64), const NOTE_WRITE ideal-int
+pkg syscall (freebsd-arm64), const O_ACCMODE = 3
+pkg syscall (freebsd-arm64), const O_ACCMODE ideal-int
+pkg syscall (freebsd-arm64), const O_APPEND = 8
+pkg syscall (freebsd-arm64), const O_ASYNC = 64
+pkg syscall (freebsd-arm64), const O_CLOEXEC = 1048576
+pkg syscall (freebsd-arm64), const O_CREAT = 512
+pkg syscall (freebsd-arm64), const O_DIRECT = 65536
+pkg syscall (freebsd-arm64), const O_DIRECT ideal-int
+pkg syscall (freebsd-arm64), const O_DIRECTORY = 131072
+pkg syscall (freebsd-arm64), const O_DIRECTORY ideal-int
+pkg syscall (freebsd-arm64), const O_EXCL = 2048
+pkg syscall (freebsd-arm64), const O_EXEC = 262144
+pkg syscall (freebsd-arm64), const O_EXEC ideal-int
+pkg syscall (freebsd-arm64), const O_EXLOCK = 32
+pkg syscall (freebsd-arm64), const O_EXLOCK ideal-int
+pkg syscall (freebsd-arm64), const O_FSYNC = 128
+pkg syscall (freebsd-arm64), const O_FSYNC ideal-int
+pkg syscall (freebsd-arm64), const O_NDELAY = 4
+pkg syscall (freebsd-arm64), const O_NDELAY ideal-int
+pkg syscall (freebsd-arm64), const O_NOCTTY = 32768
+pkg syscall (freebsd-arm64), const O_NOFOLLOW = 256
+pkg syscall (freebsd-arm64), const O_NOFOLLOW ideal-int
+pkg syscall (freebsd-arm64), const O_NONBLOCK = 4
+pkg syscall (freebsd-arm64), const O_SHLOCK = 16
+pkg syscall (freebsd-arm64), const O_SHLOCK ideal-int
+pkg syscall (freebsd-arm64), const O_SYNC = 128
+pkg syscall (freebsd-arm64), const O_TRUNC = 1024
+pkg syscall (freebsd-arm64), const O_TTY_INIT = 524288
+pkg syscall (freebsd-arm64), const O_TTY_INIT ideal-int
+pkg syscall (freebsd-arm64), const OCRNL = 16
+pkg syscall (freebsd-arm64), const OCRNL ideal-int
+pkg syscall (freebsd-arm64), const ONLCR = 2
+pkg syscall (freebsd-arm64), const ONLCR ideal-int
+pkg syscall (freebsd-arm64), const ONLRET = 64
+pkg syscall (freebsd-arm64), const ONLRET ideal-int
+pkg syscall (freebsd-arm64), const ONOCR = 32
+pkg syscall (freebsd-arm64), const ONOCR ideal-int
+pkg syscall (freebsd-arm64), const ONOEOT = 8
+pkg syscall (freebsd-arm64), const ONOEOT ideal-int
+pkg syscall (freebsd-arm64), const OPOST = 1
+pkg syscall (freebsd-arm64), const OPOST ideal-int
+pkg syscall (freebsd-arm64), const PARENB = 4096
+pkg syscall (freebsd-arm64), const PARENB ideal-int
+pkg syscall (freebsd-arm64), const PARMRK = 8
+pkg syscall (freebsd-arm64), const PARMRK ideal-int
+pkg syscall (freebsd-arm64), const PARODD = 8192
+pkg syscall (freebsd-arm64), const PARODD ideal-int
+pkg syscall (freebsd-arm64), const PENDIN = 536870912
+pkg syscall (freebsd-arm64), const PENDIN ideal-int
+pkg syscall (freebsd-arm64), const PRIO_PGRP = 1
+pkg syscall (freebsd-arm64), const PRIO_PGRP ideal-int
+pkg syscall (freebsd-arm64), const PRIO_PROCESS = 0
+pkg syscall (freebsd-arm64), const PRIO_PROCESS ideal-int
+pkg syscall (freebsd-arm64), const PRIO_USER = 2
+pkg syscall (freebsd-arm64), const PRIO_USER ideal-int
+pkg syscall (freebsd-arm64), const PROT_EXEC = 4
+pkg syscall (freebsd-arm64), const PROT_EXEC ideal-int
+pkg syscall (freebsd-arm64), const PROT_NONE = 0
+pkg syscall (freebsd-arm64), const PROT_NONE ideal-int
+pkg syscall (freebsd-arm64), const PROT_READ = 1
+pkg syscall (freebsd-arm64), const PROT_READ ideal-int
+pkg syscall (freebsd-arm64), const PROT_WRITE = 2
+pkg syscall (freebsd-arm64), const PROT_WRITE ideal-int
+pkg syscall (freebsd-arm64), const PTRACE_CONT = 7
+pkg syscall (freebsd-arm64), const PTRACE_CONT ideal-int
+pkg syscall (freebsd-arm64), const PTRACE_KILL = 8
+pkg syscall (freebsd-arm64), const PTRACE_KILL ideal-int
+pkg syscall (freebsd-arm64), const PTRACE_TRACEME = 0
+pkg syscall (freebsd-arm64), const PTRACE_TRACEME ideal-int
+pkg syscall (freebsd-arm64), const RLIM_INFINITY = 9223372036854775807
+pkg syscall (freebsd-arm64), const RLIM_INFINITY ideal-int
+pkg syscall (freebsd-arm64), const RLIMIT_AS = 10
+pkg syscall (freebsd-arm64), const RLIMIT_AS ideal-int
+pkg syscall (freebsd-arm64), const RLIMIT_CORE = 4
+pkg syscall (freebsd-arm64), const RLIMIT_CORE ideal-int
+pkg syscall (freebsd-arm64), const RLIMIT_CPU = 0
+pkg syscall (freebsd-arm64), const RLIMIT_CPU ideal-int
+pkg syscall (freebsd-arm64), const RLIMIT_DATA = 2
+pkg syscall (freebsd-arm64), const RLIMIT_DATA ideal-int
+pkg syscall (freebsd-arm64), const RLIMIT_FSIZE = 1
+pkg syscall (freebsd-arm64), const RLIMIT_FSIZE ideal-int
+pkg syscall (freebsd-arm64), const RLIMIT_NOFILE = 8
+pkg syscall (freebsd-arm64), const RLIMIT_NOFILE ideal-int
+pkg syscall (freebsd-arm64), const RLIMIT_STACK = 3
+pkg syscall (freebsd-arm64), const RLIMIT_STACK ideal-int
+pkg syscall (freebsd-arm64), const RT_CACHING_CONTEXT = 1
+pkg syscall (freebsd-arm64), const RT_CACHING_CONTEXT ideal-int
+pkg syscall (freebsd-arm64), const RT_DEFAULT_FIB = 0
+pkg syscall (freebsd-arm64), const RT_DEFAULT_FIB ideal-int
+pkg syscall (freebsd-arm64), const RT_NORTREF = 2
+pkg syscall (freebsd-arm64), const RT_NORTREF ideal-int
+pkg syscall (freebsd-arm64), const RTA_AUTHOR = 64
+pkg syscall (freebsd-arm64), const RTA_AUTHOR ideal-int
+pkg syscall (freebsd-arm64), const RTA_BRD = 128
+pkg syscall (freebsd-arm64), const RTA_BRD ideal-int
+pkg syscall (freebsd-arm64), const RTA_DST = 1
+pkg syscall (freebsd-arm64), const RTA_DST ideal-int
+pkg syscall (freebsd-arm64), const RTA_GATEWAY = 2
+pkg syscall (freebsd-arm64), const RTA_GATEWAY ideal-int
+pkg syscall (freebsd-arm64), const RTA_GENMASK = 8
+pkg syscall (freebsd-arm64), const RTA_GENMASK ideal-int
+pkg syscall (freebsd-arm64), const RTA_IFA = 32
+pkg syscall (freebsd-arm64), const RTA_IFA ideal-int
+pkg syscall (freebsd-arm64), const RTA_IFP = 16
+pkg syscall (freebsd-arm64), const RTA_IFP ideal-int
+pkg syscall (freebsd-arm64), const RTA_NETMASK = 4
+pkg syscall (freebsd-arm64), const RTA_NETMASK ideal-int
+pkg syscall (freebsd-arm64), const RTAX_AUTHOR = 6
+pkg syscall (freebsd-arm64), const RTAX_AUTHOR ideal-int
+pkg syscall (freebsd-arm64), const RTAX_BRD = 7
+pkg syscall (freebsd-arm64), const RTAX_BRD ideal-int
+pkg syscall (freebsd-arm64), const RTAX_DST = 0
+pkg syscall (freebsd-arm64), const RTAX_DST ideal-int
+pkg syscall (freebsd-arm64), const RTAX_GATEWAY = 1
+pkg syscall (freebsd-arm64), const RTAX_GATEWAY ideal-int
+pkg syscall (freebsd-arm64), const RTAX_GENMASK = 3
+pkg syscall (freebsd-arm64), const RTAX_GENMASK ideal-int
+pkg syscall (freebsd-arm64), const RTAX_IFA = 5
+pkg syscall (freebsd-arm64), const RTAX_IFA ideal-int
+pkg syscall (freebsd-arm64), const RTAX_IFP = 4
+pkg syscall (freebsd-arm64), const RTAX_IFP ideal-int
+pkg syscall (freebsd-arm64), const RTAX_MAX = 8
+pkg syscall (freebsd-arm64), const RTAX_MAX ideal-int
+pkg syscall (freebsd-arm64), const RTAX_NETMASK = 2
+pkg syscall (freebsd-arm64), const RTAX_NETMASK ideal-int
+pkg syscall (freebsd-arm64), const RTF_BLACKHOLE = 4096
+pkg syscall (freebsd-arm64), const RTF_BLACKHOLE ideal-int
+pkg syscall (freebsd-arm64), const RTF_BROADCAST = 4194304
+pkg syscall (freebsd-arm64), const RTF_BROADCAST ideal-int
+pkg syscall (freebsd-arm64), const RTF_DONE = 64
+pkg syscall (freebsd-arm64), const RTF_DONE ideal-int
+pkg syscall (freebsd-arm64), const RTF_DYNAMIC = 16
+pkg syscall (freebsd-arm64), const RTF_DYNAMIC ideal-int
+pkg syscall (freebsd-arm64), const RTF_FMASK = 268752904
+pkg syscall (freebsd-arm64), const RTF_FMASK ideal-int
+pkg syscall (freebsd-arm64), const RTF_GATEWAY = 2
+pkg syscall (freebsd-arm64), const RTF_GATEWAY ideal-int
+pkg syscall (freebsd-arm64), const RTF_GWFLAG_COMPAT = 2147483648
+pkg syscall (freebsd-arm64), const RTF_GWFLAG_COMPAT ideal-int
+pkg syscall (freebsd-arm64), const RTF_HOST = 4
+pkg syscall (freebsd-arm64), const RTF_HOST ideal-int
+pkg syscall (freebsd-arm64), const RTF_LLDATA = 1024
+pkg syscall (freebsd-arm64), const RTF_LLDATA ideal-int
+pkg syscall (freebsd-arm64), const RTF_LLINFO = 1024
+pkg syscall (freebsd-arm64), const RTF_LLINFO ideal-int
+pkg syscall (freebsd-arm64), const RTF_LOCAL = 2097152
+pkg syscall (freebsd-arm64), const RTF_LOCAL ideal-int
+pkg syscall (freebsd-arm64), const RTF_MODIFIED = 32
+pkg syscall (freebsd-arm64), const RTF_MODIFIED ideal-int
+pkg syscall (freebsd-arm64), const RTF_MULTICAST = 8388608
+pkg syscall (freebsd-arm64), const RTF_MULTICAST ideal-int
+pkg syscall (freebsd-arm64), const RTF_PINNED = 1048576
+pkg syscall (freebsd-arm64), const RTF_PINNED ideal-int
+pkg syscall (freebsd-arm64), const RTF_PRCLONING = 65536
+pkg syscall (freebsd-arm64), const RTF_PRCLONING ideal-int
+pkg syscall (freebsd-arm64), const RTF_PROTO1 = 32768
+pkg syscall (freebsd-arm64), const RTF_PROTO1 ideal-int
+pkg syscall (freebsd-arm64), const RTF_PROTO2 = 16384
+pkg syscall (freebsd-arm64), const RTF_PROTO2 ideal-int
+pkg syscall (freebsd-arm64), const RTF_PROTO3 = 262144
+pkg syscall (freebsd-arm64), const RTF_PROTO3 ideal-int
+pkg syscall (freebsd-arm64), const RTF_REJECT = 8
+pkg syscall (freebsd-arm64), const RTF_REJECT ideal-int
+pkg syscall (freebsd-arm64), const RTF_RNH_LOCKED = 1073741824
+pkg syscall (freebsd-arm64), const RTF_RNH_LOCKED ideal-int
+pkg syscall (freebsd-arm64), const RTF_STATIC = 2048
+pkg syscall (freebsd-arm64), const RTF_STATIC ideal-int
+pkg syscall (freebsd-arm64), const RTF_STICKY = 268435456
+pkg syscall (freebsd-arm64), const RTF_STICKY ideal-int
+pkg syscall (freebsd-arm64), const RTF_UP = 1
+pkg syscall (freebsd-arm64), const RTF_UP ideal-int
+pkg syscall (freebsd-arm64), const RTF_XRESOLVE = 512
+pkg syscall (freebsd-arm64), const RTF_XRESOLVE ideal-int
+pkg syscall (freebsd-arm64), const RTM_ADD = 1
+pkg syscall (freebsd-arm64), const RTM_ADD ideal-int
+pkg syscall (freebsd-arm64), const RTM_CHANGE = 3
+pkg syscall (freebsd-arm64), const RTM_CHANGE ideal-int
+pkg syscall (freebsd-arm64), const RTM_DELADDR = 13
+pkg syscall (freebsd-arm64), const RTM_DELADDR ideal-int
+pkg syscall (freebsd-arm64), const RTM_DELETE = 2
+pkg syscall (freebsd-arm64), const RTM_DELETE ideal-int
+pkg syscall (freebsd-arm64), const RTM_DELMADDR = 16
+pkg syscall (freebsd-arm64), const RTM_DELMADDR ideal-int
+pkg syscall (freebsd-arm64), const RTM_GET = 4
+pkg syscall (freebsd-arm64), const RTM_GET ideal-int
+pkg syscall (freebsd-arm64), const RTM_IEEE80211 = 18
+pkg syscall (freebsd-arm64), const RTM_IEEE80211 ideal-int
+pkg syscall (freebsd-arm64), const RTM_IFANNOUNCE = 17
+pkg syscall (freebsd-arm64), const RTM_IFANNOUNCE ideal-int
+pkg syscall (freebsd-arm64), const RTM_IFINFO = 14
+pkg syscall (freebsd-arm64), const RTM_IFINFO ideal-int
+pkg syscall (freebsd-arm64), const RTM_LOCK = 8
+pkg syscall (freebsd-arm64), const RTM_LOCK ideal-int
+pkg syscall (freebsd-arm64), const RTM_LOSING = 5
+pkg syscall (freebsd-arm64), const RTM_LOSING ideal-int
+pkg syscall (freebsd-arm64), const RTM_MISS = 7
+pkg syscall (freebsd-arm64), const RTM_MISS ideal-int
+pkg syscall (freebsd-arm64), const RTM_NEWADDR = 12
+pkg syscall (freebsd-arm64), const RTM_NEWADDR ideal-int
+pkg syscall (freebsd-arm64), const RTM_NEWMADDR = 15
+pkg syscall (freebsd-arm64), const RTM_NEWMADDR ideal-int
+pkg syscall (freebsd-arm64), const RTM_OLDADD = 9
+pkg syscall (freebsd-arm64), const RTM_OLDADD ideal-int
+pkg syscall (freebsd-arm64), const RTM_OLDDEL = 10
+pkg syscall (freebsd-arm64), const RTM_OLDDEL ideal-int
+pkg syscall (freebsd-arm64), const RTM_REDIRECT = 6
+pkg syscall (freebsd-arm64), const RTM_REDIRECT ideal-int
+pkg syscall (freebsd-arm64), const RTM_RESOLVE = 11
+pkg syscall (freebsd-arm64), const RTM_RESOLVE ideal-int
+pkg syscall (freebsd-arm64), const RTM_RTTUNIT = 1000000
+pkg syscall (freebsd-arm64), const RTM_RTTUNIT ideal-int
+pkg syscall (freebsd-arm64), const RTM_VERSION = 5
+pkg syscall (freebsd-arm64), const RTM_VERSION ideal-int
+pkg syscall (freebsd-arm64), const RTV_EXPIRE = 4
+pkg syscall (freebsd-arm64), const RTV_EXPIRE ideal-int
+pkg syscall (freebsd-arm64), const RTV_HOPCOUNT = 2
+pkg syscall (freebsd-arm64), const RTV_HOPCOUNT ideal-int
+pkg syscall (freebsd-arm64), const RTV_MTU = 1
+pkg syscall (freebsd-arm64), const RTV_MTU ideal-int
+pkg syscall (freebsd-arm64), const RTV_RPIPE = 8
+pkg syscall (freebsd-arm64), const RTV_RPIPE ideal-int
+pkg syscall (freebsd-arm64), const RTV_RTT = 64
+pkg syscall (freebsd-arm64), const RTV_RTT ideal-int
+pkg syscall (freebsd-arm64), const RTV_RTTVAR = 128
+pkg syscall (freebsd-arm64), const RTV_RTTVAR ideal-int
+pkg syscall (freebsd-arm64), const RTV_SPIPE = 16
+pkg syscall (freebsd-arm64), const RTV_SPIPE ideal-int
+pkg syscall (freebsd-arm64), const RTV_SSTHRESH = 32
+pkg syscall (freebsd-arm64), const RTV_SSTHRESH ideal-int
+pkg syscall (freebsd-arm64), const RTV_WEIGHT = 256
+pkg syscall (freebsd-arm64), const RTV_WEIGHT ideal-int
+pkg syscall (freebsd-arm64), const RUSAGE_CHILDREN = -1
+pkg syscall (freebsd-arm64), const RUSAGE_CHILDREN ideal-int
+pkg syscall (freebsd-arm64), const RUSAGE_SELF = 0
+pkg syscall (freebsd-arm64), const RUSAGE_SELF ideal-int
+pkg syscall (freebsd-arm64), const RUSAGE_THREAD = 1
+pkg syscall (freebsd-arm64), const RUSAGE_THREAD ideal-int
+pkg syscall (freebsd-arm64), const S_IFMT = 61440
+pkg syscall (freebsd-arm64), const S_IRWXG = 56
+pkg syscall (freebsd-arm64), const S_IRWXG ideal-int
+pkg syscall (freebsd-arm64), const S_IRWXO = 7
+pkg syscall (freebsd-arm64), const S_IRWXO ideal-int
+pkg syscall (freebsd-arm64), const SCM_BINTIME = 4
+pkg syscall (freebsd-arm64), const SCM_BINTIME ideal-int
+pkg syscall (freebsd-arm64), const SCM_CREDS = 3
+pkg syscall (freebsd-arm64), const SCM_CREDS ideal-int
+pkg syscall (freebsd-arm64), const SCM_RIGHTS = 1
+pkg syscall (freebsd-arm64), const SCM_RIGHTS ideal-int
+pkg syscall (freebsd-arm64), const SCM_TIMESTAMP = 2
+pkg syscall (freebsd-arm64), const SCM_TIMESTAMP ideal-int
+pkg syscall (freebsd-arm64), const SIGBUS = 10
+pkg syscall (freebsd-arm64), const SIGCHLD = 20
+pkg syscall (freebsd-arm64), const SIGCHLD Signal
+pkg syscall (freebsd-arm64), const SIGCONT = 19
+pkg syscall (freebsd-arm64), const SIGCONT Signal
+pkg syscall (freebsd-arm64), const SIGEMT = 7
+pkg syscall (freebsd-arm64), const SIGEMT Signal
+pkg syscall (freebsd-arm64), const SIGINFO = 29
+pkg syscall (freebsd-arm64), const SIGINFO Signal
+pkg syscall (freebsd-arm64), const SIGIO = 23
+pkg syscall (freebsd-arm64), const SIGIO Signal
+pkg syscall (freebsd-arm64), const SIGIOT = 6
+pkg syscall (freebsd-arm64), const SIGIOT Signal
+pkg syscall (freebsd-arm64), const SIGLIBRT = 33
+pkg syscall (freebsd-arm64), const SIGLIBRT Signal
+pkg syscall (freebsd-arm64), const SIGLWP = 32
+pkg syscall (freebsd-arm64), const SIGLWP Signal
+pkg syscall (freebsd-arm64), const SIGPROF = 27
+pkg syscall (freebsd-arm64), const SIGPROF Signal
+pkg syscall (freebsd-arm64), const SIGSTOP = 17
+pkg syscall (freebsd-arm64), const SIGSTOP Signal
+pkg syscall (freebsd-arm64), const SIGSYS = 12
+pkg syscall (freebsd-arm64), const SIGSYS Signal
+pkg syscall (freebsd-arm64), const SIGTHR = 32
+pkg syscall (freebsd-arm64), const SIGTHR Signal
+pkg syscall (freebsd-arm64), const SIGTSTP = 18
+pkg syscall (freebsd-arm64), const SIGTSTP Signal
+pkg syscall (freebsd-arm64), const SIGTTIN = 21
+pkg syscall (freebsd-arm64), const SIGTTIN Signal
+pkg syscall (freebsd-arm64), const SIGTTOU = 22
+pkg syscall (freebsd-arm64), const SIGTTOU Signal
+pkg syscall (freebsd-arm64), const SIGURG = 16
+pkg syscall (freebsd-arm64), const SIGURG Signal
+pkg syscall (freebsd-arm64), const SIGUSR1 = 30
+pkg syscall (freebsd-arm64), const SIGUSR1 Signal
+pkg syscall (freebsd-arm64), const SIGUSR2 = 31
+pkg syscall (freebsd-arm64), const SIGUSR2 Signal
+pkg syscall (freebsd-arm64), const SIGVTALRM = 26
+pkg syscall (freebsd-arm64), const SIGVTALRM Signal
+pkg syscall (freebsd-arm64), const SIGWINCH = 28
+pkg syscall (freebsd-arm64), const SIGWINCH Signal
+pkg syscall (freebsd-arm64), const SIGXCPU = 24
+pkg syscall (freebsd-arm64), const SIGXCPU Signal
+pkg syscall (freebsd-arm64), const SIGXFSZ = 25
+pkg syscall (freebsd-arm64), const SIGXFSZ Signal
+pkg syscall (freebsd-arm64), const SIOCADDMULTI = 2149607729
+pkg syscall (freebsd-arm64), const SIOCADDMULTI ideal-int
+pkg syscall (freebsd-arm64), const SIOCADDRT = 2151707146
+pkg syscall (freebsd-arm64), const SIOCADDRT ideal-int
+pkg syscall (freebsd-arm64), const SIOCAIFADDR = 2151704858
+pkg syscall (freebsd-arm64), const SIOCAIFADDR ideal-int
+pkg syscall (freebsd-arm64), const SIOCAIFGROUP = 2150132103
+pkg syscall (freebsd-arm64), const SIOCAIFGROUP ideal-int
+pkg syscall (freebsd-arm64), const SIOCALIFADDR = 2165860635
+pkg syscall (freebsd-arm64), const SIOCALIFADDR ideal-int
+pkg syscall (freebsd-arm64), const SIOCATMARK = 1074033415
+pkg syscall (freebsd-arm64), const SIOCATMARK ideal-int
+pkg syscall (freebsd-arm64), const SIOCDELMULTI = 2149607730
+pkg syscall (freebsd-arm64), const SIOCDELMULTI ideal-int
+pkg syscall (freebsd-arm64), const SIOCDELRT = 2151707147
+pkg syscall (freebsd-arm64), const SIOCDELRT ideal-int
+pkg syscall (freebsd-arm64), const SIOCDIFADDR = 2149607705
+pkg syscall (freebsd-arm64), const SIOCDIFADDR ideal-int
+pkg syscall (freebsd-arm64), const SIOCDIFGROUP = 2150132105
+pkg syscall (freebsd-arm64), const SIOCDIFGROUP ideal-int
+pkg syscall (freebsd-arm64), const SIOCDIFPHYADDR = 2149607753
+pkg syscall (freebsd-arm64), const SIOCDIFPHYADDR ideal-int
+pkg syscall (freebsd-arm64), const SIOCDLIFADDR = 2165860637
+pkg syscall (freebsd-arm64), const SIOCDLIFADDR ideal-int
+pkg syscall (freebsd-arm64), const SIOCGDRVSPEC = 3223873915
+pkg syscall (freebsd-arm64), const SIOCGDRVSPEC ideal-int
+pkg syscall (freebsd-arm64), const SIOCGETSGCNT = 3223351824
+pkg syscall (freebsd-arm64), const SIOCGETSGCNT ideal-int
+pkg syscall (freebsd-arm64), const SIOCGETVIFCNT = 3223876111
+pkg syscall (freebsd-arm64), const SIOCGETVIFCNT ideal-int
+pkg syscall (freebsd-arm64), const SIOCGHIWAT = 1074033409
+pkg syscall (freebsd-arm64), const SIOCGHIWAT ideal-int
+pkg syscall (freebsd-arm64), const SIOCGIFADDR = 3223349537
+pkg syscall (freebsd-arm64), const SIOCGIFADDR ideal-int
+pkg syscall (freebsd-arm64), const SIOCGIFBRDADDR = 3223349539
+pkg syscall (freebsd-arm64), const SIOCGIFBRDADDR ideal-int
+pkg syscall (freebsd-arm64), const SIOCGIFCAP = 3223349535
+pkg syscall (freebsd-arm64), const SIOCGIFCAP ideal-int
+pkg syscall (freebsd-arm64), const SIOCGIFCONF = 3222300964
+pkg syscall (freebsd-arm64), const SIOCGIFCONF ideal-int
+pkg syscall (freebsd-arm64), const SIOCGIFDESCR = 3223349546
+pkg syscall (freebsd-arm64), const SIOCGIFDESCR ideal-int
+pkg syscall (freebsd-arm64), const SIOCGIFDSTADDR = 3223349538
+pkg syscall (freebsd-arm64), const SIOCGIFDSTADDR ideal-int
+pkg syscall (freebsd-arm64), const SIOCGIFFIB = 3223349596
+pkg syscall (freebsd-arm64), const SIOCGIFFIB ideal-int
+pkg syscall (freebsd-arm64), const SIOCGIFFLAGS = 3223349521
+pkg syscall (freebsd-arm64), const SIOCGIFFLAGS ideal-int
+pkg syscall (freebsd-arm64), const SIOCGIFGENERIC = 3223349562
+pkg syscall (freebsd-arm64), const SIOCGIFGENERIC ideal-int
+pkg syscall (freebsd-arm64), const SIOCGIFGMEMB = 3223873930
+pkg syscall (freebsd-arm64), const SIOCGIFGMEMB ideal-int
+pkg syscall (freebsd-arm64), const SIOCGIFGROUP = 3223873928
+pkg syscall (freebsd-arm64), const SIOCGIFGROUP ideal-int
+pkg syscall (freebsd-arm64), const SIOCGIFINDEX = 3223349536
+pkg syscall (freebsd-arm64), const SIOCGIFINDEX ideal-int
+pkg syscall (freebsd-arm64), const SIOCGIFMAC = 3223349542
+pkg syscall (freebsd-arm64), const SIOCGIFMAC ideal-int
+pkg syscall (freebsd-arm64), const SIOCGIFMEDIA = 3224398136
+pkg syscall (freebsd-arm64), const SIOCGIFMEDIA ideal-int
+pkg syscall (freebsd-arm64), const SIOCGIFMETRIC = 3223349527
+pkg syscall (freebsd-arm64), const SIOCGIFMETRIC ideal-int
+pkg syscall (freebsd-arm64), const SIOCGIFMTU = 3223349555
+pkg syscall (freebsd-arm64), const SIOCGIFMTU ideal-int
+pkg syscall (freebsd-arm64), const SIOCGIFNETMASK = 3223349541
+pkg syscall (freebsd-arm64), const SIOCGIFNETMASK ideal-int
+pkg syscall (freebsd-arm64), const SIOCGIFPDSTADDR = 3223349576
+pkg syscall (freebsd-arm64), const SIOCGIFPDSTADDR ideal-int
+pkg syscall (freebsd-arm64), const SIOCGIFPHYS = 3223349557
+pkg syscall (freebsd-arm64), const SIOCGIFPHYS ideal-int
+pkg syscall (freebsd-arm64), const SIOCGIFPSRCADDR = 3223349575
+pkg syscall (freebsd-arm64), const SIOCGIFPSRCADDR ideal-int
+pkg syscall (freebsd-arm64), const SIOCGIFSTATUS = 3274795323
+pkg syscall (freebsd-arm64), const SIOCGIFSTATUS ideal-int
+pkg syscall (freebsd-arm64), const SIOCGLIFADDR = 3239602460
+pkg syscall (freebsd-arm64), const SIOCGLIFADDR ideal-int
+pkg syscall (freebsd-arm64), const SIOCGLIFPHYADDR = 3239602507
+pkg syscall (freebsd-arm64), const SIOCGLIFPHYADDR ideal-int
+pkg syscall (freebsd-arm64), const SIOCGLOWAT = 1074033411
+pkg syscall (freebsd-arm64), const SIOCGLOWAT ideal-int
+pkg syscall (freebsd-arm64), const SIOCGPGRP = 1074033417
+pkg syscall (freebsd-arm64), const SIOCGPGRP ideal-int
+pkg syscall (freebsd-arm64), const SIOCGPRIVATE_0 = 3223349584
+pkg syscall (freebsd-arm64), const SIOCGPRIVATE_0 ideal-int
+pkg syscall (freebsd-arm64), const SIOCGPRIVATE_1 = 3223349585
+pkg syscall (freebsd-arm64), const SIOCGPRIVATE_1 ideal-int
+pkg syscall (freebsd-arm64), const SIOCIFCREATE = 3223349626
+pkg syscall (freebsd-arm64), const SIOCIFCREATE ideal-int
+pkg syscall (freebsd-arm64), const SIOCIFCREATE2 = 3223349628
+pkg syscall (freebsd-arm64), const SIOCIFCREATE2 ideal-int
+pkg syscall (freebsd-arm64), const SIOCIFDESTROY = 2149607801
+pkg syscall (freebsd-arm64), const SIOCIFDESTROY ideal-int
+pkg syscall (freebsd-arm64), const SIOCIFGCLONERS = 3222301048
+pkg syscall (freebsd-arm64), const SIOCIFGCLONERS ideal-int
+pkg syscall (freebsd-arm64), const SIOCSDRVSPEC = 2150132091
+pkg syscall (freebsd-arm64), const SIOCSDRVSPEC ideal-int
+pkg syscall (freebsd-arm64), const SIOCSHIWAT = 2147775232
+pkg syscall (freebsd-arm64), const SIOCSHIWAT ideal-int
+pkg syscall (freebsd-arm64), const SIOCSIFADDR = 2149607692
+pkg syscall (freebsd-arm64), const SIOCSIFADDR ideal-int
+pkg syscall (freebsd-arm64), const SIOCSIFBRDADDR = 2149607699
+pkg syscall (freebsd-arm64), const SIOCSIFBRDADDR ideal-int
+pkg syscall (freebsd-arm64), const SIOCSIFCAP = 2149607710
+pkg syscall (freebsd-arm64), const SIOCSIFCAP ideal-int
+pkg syscall (freebsd-arm64), const SIOCSIFDESCR = 2149607721
+pkg syscall (freebsd-arm64), const SIOCSIFDESCR ideal-int
+pkg syscall (freebsd-arm64), const SIOCSIFDSTADDR = 2149607694
+pkg syscall (freebsd-arm64), const SIOCSIFDSTADDR ideal-int
+pkg syscall (freebsd-arm64), const SIOCSIFFIB = 2149607773
+pkg syscall (freebsd-arm64), const SIOCSIFFIB ideal-int
+pkg syscall (freebsd-arm64), const SIOCSIFFLAGS = 2149607696
+pkg syscall (freebsd-arm64), const SIOCSIFFLAGS ideal-int
+pkg syscall (freebsd-arm64), const SIOCSIFGENERIC = 2149607737
+pkg syscall (freebsd-arm64), const SIOCSIFGENERIC ideal-int
+pkg syscall (freebsd-arm64), const SIOCSIFLLADDR = 2149607740
+pkg syscall (freebsd-arm64), const SIOCSIFLLADDR ideal-int
+pkg syscall (freebsd-arm64), const SIOCSIFMAC = 2149607719
+pkg syscall (freebsd-arm64), const SIOCSIFMAC ideal-int
+pkg syscall (freebsd-arm64), const SIOCSIFMEDIA = 3223349559
+pkg syscall (freebsd-arm64), const SIOCSIFMEDIA ideal-int
+pkg syscall (freebsd-arm64), const SIOCSIFMETRIC = 2149607704
+pkg syscall (freebsd-arm64), const SIOCSIFMETRIC ideal-int
+pkg syscall (freebsd-arm64), const SIOCSIFMTU = 2149607732
+pkg syscall (freebsd-arm64), const SIOCSIFMTU ideal-int
+pkg syscall (freebsd-arm64), const SIOCSIFNAME = 2149607720
+pkg syscall (freebsd-arm64), const SIOCSIFNAME ideal-int
+pkg syscall (freebsd-arm64), const SIOCSIFNETMASK = 2149607702
+pkg syscall (freebsd-arm64), const SIOCSIFNETMASK ideal-int
+pkg syscall (freebsd-arm64), const SIOCSIFPHYADDR = 2151704902
+pkg syscall (freebsd-arm64), const SIOCSIFPHYADDR ideal-int
+pkg syscall (freebsd-arm64), const SIOCSIFPHYS = 2149607734
+pkg syscall (freebsd-arm64), const SIOCSIFPHYS ideal-int
+pkg syscall (freebsd-arm64), const SIOCSIFRVNET = 3223349595
+pkg syscall (freebsd-arm64), const SIOCSIFRVNET ideal-int
+pkg syscall (freebsd-arm64), const SIOCSIFVNET = 3223349594
+pkg syscall (freebsd-arm64), const SIOCSIFVNET ideal-int
+pkg syscall (freebsd-arm64), const SIOCSLIFPHYADDR = 2165860682
+pkg syscall (freebsd-arm64), const SIOCSLIFPHYADDR ideal-int
+pkg syscall (freebsd-arm64), const SIOCSLOWAT = 2147775234
+pkg syscall (freebsd-arm64), const SIOCSLOWAT ideal-int
+pkg syscall (freebsd-arm64), const SIOCSPGRP = 2147775240
+pkg syscall (freebsd-arm64), const SIOCSPGRP ideal-int
+pkg syscall (freebsd-arm64), const SizeofBpfHdr = 32
+pkg syscall (freebsd-arm64), const SizeofBpfHdr ideal-int
+pkg syscall (freebsd-arm64), const SizeofBpfInsn = 8
+pkg syscall (freebsd-arm64), const SizeofBpfInsn ideal-int
+pkg syscall (freebsd-arm64), const SizeofBpfProgram = 16
+pkg syscall (freebsd-arm64), const SizeofBpfProgram ideal-int
+pkg syscall (freebsd-arm64), const SizeofBpfStat = 8
+pkg syscall (freebsd-arm64), const SizeofBpfStat ideal-int
+pkg syscall (freebsd-arm64), const SizeofBpfVersion = 4
+pkg syscall (freebsd-arm64), const SizeofBpfVersion ideal-int
+pkg syscall (freebsd-arm64), const SizeofBpfZbuf = 24
+pkg syscall (freebsd-arm64), const SizeofBpfZbuf ideal-int
+pkg syscall (freebsd-arm64), const SizeofBpfZbufHeader = 32
+pkg syscall (freebsd-arm64), const SizeofBpfZbufHeader ideal-int
+pkg syscall (freebsd-arm64), const SizeofCmsghdr = 12
+pkg syscall (freebsd-arm64), const SizeofCmsghdr ideal-int
+pkg syscall (freebsd-arm64), const SizeofICMPv6Filter = 32
+pkg syscall (freebsd-arm64), const SizeofICMPv6Filter ideal-int
+pkg syscall (freebsd-arm64), const SizeofIfaMsghdr = 20
+pkg syscall (freebsd-arm64), const SizeofIfaMsghdr ideal-int
+pkg syscall (freebsd-arm64), const SizeofIfAnnounceMsghdr = 24
+pkg syscall (freebsd-arm64), const SizeofIfAnnounceMsghdr ideal-int
+pkg syscall (freebsd-arm64), const SizeofIfData = 152
+pkg syscall (freebsd-arm64), const SizeofIfData ideal-int
+pkg syscall (freebsd-arm64), const SizeofIfmaMsghdr = 16
+pkg syscall (freebsd-arm64), const SizeofIfmaMsghdr ideal-int
+pkg syscall (freebsd-arm64), const SizeofIfMsghdr = 168
+pkg syscall (freebsd-arm64), const SizeofIfMsghdr ideal-int
+pkg syscall (freebsd-arm64), const SizeofInet6Pktinfo = 20
+pkg syscall (freebsd-arm64), const SizeofInet6Pktinfo ideal-int
+pkg syscall (freebsd-arm64), const SizeofIPMreq = 8
+pkg syscall (freebsd-arm64), const SizeofIPMreq ideal-int
+pkg syscall (freebsd-arm64), const SizeofIPMreqn = 12
+pkg syscall (freebsd-arm64), const SizeofIPMreqn ideal-int
+pkg syscall (freebsd-arm64), const SizeofIPv6Mreq = 20
+pkg syscall (freebsd-arm64), const SizeofIPv6Mreq ideal-int
+pkg syscall (freebsd-arm64), const SizeofIPv6MTUInfo = 32
+pkg syscall (freebsd-arm64), const SizeofIPv6MTUInfo ideal-int
+pkg syscall (freebsd-arm64), const SizeofLinger = 8
+pkg syscall (freebsd-arm64), const SizeofLinger ideal-int
+pkg syscall (freebsd-arm64), const SizeofMsghdr = 48
+pkg syscall (freebsd-arm64), const SizeofMsghdr ideal-int
+pkg syscall (freebsd-arm64), const SizeofRtMetrics = 112
+pkg syscall (freebsd-arm64), const SizeofRtMetrics ideal-int
+pkg syscall (freebsd-arm64), const SizeofRtMsghdr = 152
+pkg syscall (freebsd-arm64), const SizeofRtMsghdr ideal-int
+pkg syscall (freebsd-arm64), const SizeofSockaddrAny = 108
+pkg syscall (freebsd-arm64), const SizeofSockaddrAny ideal-int
+pkg syscall (freebsd-arm64), const SizeofSockaddrDatalink = 54
+pkg syscall (freebsd-arm64), const SizeofSockaddrDatalink ideal-int
+pkg syscall (freebsd-arm64), const SizeofSockaddrInet4 = 16
+pkg syscall (freebsd-arm64), const SizeofSockaddrInet4 ideal-int
+pkg syscall (freebsd-arm64), const SizeofSockaddrInet6 = 28
+pkg syscall (freebsd-arm64), const SizeofSockaddrInet6 ideal-int
+pkg syscall (freebsd-arm64), const SizeofSockaddrUnix = 106
+pkg syscall (freebsd-arm64), const SizeofSockaddrUnix ideal-int
+pkg syscall (freebsd-arm64), const SO_ACCEPTCONN = 2
+pkg syscall (freebsd-arm64), const SO_ACCEPTCONN ideal-int
+pkg syscall (freebsd-arm64), const SO_ACCEPTFILTER = 4096
+pkg syscall (freebsd-arm64), const SO_ACCEPTFILTER ideal-int
+pkg syscall (freebsd-arm64), const SO_BINTIME = 8192
+pkg syscall (freebsd-arm64), const SO_BINTIME ideal-int
+pkg syscall (freebsd-arm64), const SO_BROADCAST = 32
+pkg syscall (freebsd-arm64), const SO_DEBUG = 1
+pkg syscall (freebsd-arm64), const SO_DEBUG ideal-int
+pkg syscall (freebsd-arm64), const SO_DONTROUTE = 16
+pkg syscall (freebsd-arm64), const SO_ERROR = 4103
+pkg syscall (freebsd-arm64), const SO_ERROR ideal-int
+pkg syscall (freebsd-arm64), const SO_KEEPALIVE = 8
+pkg syscall (freebsd-arm64), const SO_LABEL = 4105
+pkg syscall (freebsd-arm64), const SO_LABEL ideal-int
+pkg syscall (freebsd-arm64), const SO_LINGER = 128
+pkg syscall (freebsd-arm64), const SO_LISTENINCQLEN = 4115
+pkg syscall (freebsd-arm64), const SO_LISTENINCQLEN ideal-int
+pkg syscall (freebsd-arm64), const SO_LISTENQLEN = 4114
+pkg syscall (freebsd-arm64), const SO_LISTENQLEN ideal-int
+pkg syscall (freebsd-arm64), const SO_LISTENQLIMIT = 4113
+pkg syscall (freebsd-arm64), const SO_LISTENQLIMIT ideal-int
+pkg syscall (freebsd-arm64), const SO_NO_DDP = 32768
+pkg syscall (freebsd-arm64), const SO_NO_DDP ideal-int
+pkg syscall (freebsd-arm64), const SO_NO_OFFLOAD = 16384
+pkg syscall (freebsd-arm64), const SO_NO_OFFLOAD ideal-int
+pkg syscall (freebsd-arm64), const SO_NOSIGPIPE = 2048
+pkg syscall (freebsd-arm64), const SO_NOSIGPIPE ideal-int
+pkg syscall (freebsd-arm64), const SO_OOBINLINE = 256
+pkg syscall (freebsd-arm64), const SO_OOBINLINE ideal-int
+pkg syscall (freebsd-arm64), const SO_PEERLABEL = 4112
+pkg syscall (freebsd-arm64), const SO_PEERLABEL ideal-int
+pkg syscall (freebsd-arm64), const SO_PROTOCOL = 4118
+pkg syscall (freebsd-arm64), const SO_PROTOCOL ideal-int
+pkg syscall (freebsd-arm64), const SO_PROTOTYPE = 4118
+pkg syscall (freebsd-arm64), const SO_PROTOTYPE ideal-int
+pkg syscall (freebsd-arm64), const SO_RCVBUF = 4098
+pkg syscall (freebsd-arm64), const SO_RCVLOWAT = 4100
+pkg syscall (freebsd-arm64), const SO_RCVLOWAT ideal-int
+pkg syscall (freebsd-arm64), const SO_RCVTIMEO = 4102
+pkg syscall (freebsd-arm64), const SO_RCVTIMEO ideal-int
+pkg syscall (freebsd-arm64), const SO_REUSEADDR = 4
+pkg syscall (freebsd-arm64), const SO_REUSEPORT = 512
+pkg syscall (freebsd-arm64), const SO_REUSEPORT ideal-int
+pkg syscall (freebsd-arm64), const SO_SETFIB = 4116
+pkg syscall (freebsd-arm64), const SO_SETFIB ideal-int
+pkg syscall (freebsd-arm64), const SO_SNDBUF = 4097
+pkg syscall (freebsd-arm64), const SO_SNDLOWAT = 4099
+pkg syscall (freebsd-arm64), const SO_SNDLOWAT ideal-int
+pkg syscall (freebsd-arm64), const SO_SNDTIMEO = 4101
+pkg syscall (freebsd-arm64), const SO_SNDTIMEO ideal-int
+pkg syscall (freebsd-arm64), const SO_TIMESTAMP = 1024
+pkg syscall (freebsd-arm64), const SO_TIMESTAMP ideal-int
+pkg syscall (freebsd-arm64), const SO_TYPE = 4104
+pkg syscall (freebsd-arm64), const SO_TYPE ideal-int
+pkg syscall (freebsd-arm64), const SO_USELOOPBACK = 64
+pkg syscall (freebsd-arm64), const SO_USELOOPBACK ideal-int
+pkg syscall (freebsd-arm64), const SO_USER_COOKIE = 4117
+pkg syscall (freebsd-arm64), const SO_USER_COOKIE ideal-int
+pkg syscall (freebsd-arm64), const SO_VENDOR = 2147483648
+pkg syscall (freebsd-arm64), const SO_VENDOR ideal-int
+pkg syscall (freebsd-arm64), const SOCK_CLOEXEC = 268435456
+pkg syscall (freebsd-arm64), const SOCK_CLOEXEC ideal-int
+pkg syscall (freebsd-arm64), const SOCK_MAXADDRLEN = 255
+pkg syscall (freebsd-arm64), const SOCK_MAXADDRLEN ideal-int
+pkg syscall (freebsd-arm64), const SOCK_NONBLOCK = 536870912
+pkg syscall (freebsd-arm64), const SOCK_NONBLOCK ideal-int
+pkg syscall (freebsd-arm64), const SOCK_RDM = 4
+pkg syscall (freebsd-arm64), const SOCK_RDM ideal-int
+pkg syscall (freebsd-arm64), const SOL_SOCKET = 65535
+pkg syscall (freebsd-arm64), const SOMAXCONN = 128
+pkg syscall (freebsd-arm64), const SYS___ACL_ACLCHECK_FD = 354
+pkg syscall (freebsd-arm64), const SYS___ACL_ACLCHECK_FD ideal-int
+pkg syscall (freebsd-arm64), const SYS___ACL_ACLCHECK_FILE = 353
+pkg syscall (freebsd-arm64), const SYS___ACL_ACLCHECK_FILE ideal-int
+pkg syscall (freebsd-arm64), const SYS___ACL_ACLCHECK_LINK = 428
+pkg syscall (freebsd-arm64), const SYS___ACL_ACLCHECK_LINK ideal-int
+pkg syscall (freebsd-arm64), const SYS___ACL_DELETE_FD = 352
+pkg syscall (freebsd-arm64), const SYS___ACL_DELETE_FD ideal-int
+pkg syscall (freebsd-arm64), const SYS___ACL_DELETE_FILE = 351
+pkg syscall (freebsd-arm64), const SYS___ACL_DELETE_FILE ideal-int
+pkg syscall (freebsd-arm64), const SYS___ACL_DELETE_LINK = 427
+pkg syscall (freebsd-arm64), const SYS___ACL_DELETE_LINK ideal-int
+pkg syscall (freebsd-arm64), const SYS___ACL_GET_FD = 349
+pkg syscall (freebsd-arm64), const SYS___ACL_GET_FD ideal-int
+pkg syscall (freebsd-arm64), const SYS___ACL_GET_FILE = 347
+pkg syscall (freebsd-arm64), const SYS___ACL_GET_FILE ideal-int
+pkg syscall (freebsd-arm64), const SYS___ACL_GET_LINK = 425
+pkg syscall (freebsd-arm64), const SYS___ACL_GET_LINK ideal-int
+pkg syscall (freebsd-arm64), const SYS___ACL_SET_FD = 350
+pkg syscall (freebsd-arm64), const SYS___ACL_SET_FD ideal-int
+pkg syscall (freebsd-arm64), const SYS___ACL_SET_FILE = 348
+pkg syscall (freebsd-arm64), const SYS___ACL_SET_FILE ideal-int
+pkg syscall (freebsd-arm64), const SYS___ACL_SET_LINK = 426
+pkg syscall (freebsd-arm64), const SYS___ACL_SET_LINK ideal-int
+pkg syscall (freebsd-arm64), const SYS___CAP_RIGHTS_GET = 515
+pkg syscall (freebsd-arm64), const SYS___CAP_RIGHTS_GET ideal-int
+pkg syscall (freebsd-arm64), const SYS___GETCWD = 326
+pkg syscall (freebsd-arm64), const SYS___GETCWD ideal-int
+pkg syscall (freebsd-arm64), const SYS___MAC_EXECVE = 415
+pkg syscall (freebsd-arm64), const SYS___MAC_EXECVE ideal-int
+pkg syscall (freebsd-arm64), const SYS___MAC_GET_FD = 386
+pkg syscall (freebsd-arm64), const SYS___MAC_GET_FD ideal-int
+pkg syscall (freebsd-arm64), const SYS___MAC_GET_FILE = 387
+pkg syscall (freebsd-arm64), const SYS___MAC_GET_FILE ideal-int
+pkg syscall (freebsd-arm64), const SYS___MAC_GET_LINK = 410
+pkg syscall (freebsd-arm64), const SYS___MAC_GET_LINK ideal-int
+pkg syscall (freebsd-arm64), const SYS___MAC_GET_PID = 409
+pkg syscall (freebsd-arm64), const SYS___MAC_GET_PID ideal-int
+pkg syscall (freebsd-arm64), const SYS___MAC_GET_PROC = 384
+pkg syscall (freebsd-arm64), const SYS___MAC_GET_PROC ideal-int
+pkg syscall (freebsd-arm64), const SYS___MAC_SET_FD = 388
+pkg syscall (freebsd-arm64), const SYS___MAC_SET_FD ideal-int
+pkg syscall (freebsd-arm64), const SYS___MAC_SET_FILE = 389
+pkg syscall (freebsd-arm64), const SYS___MAC_SET_FILE ideal-int
+pkg syscall (freebsd-arm64), const SYS___MAC_SET_LINK = 411
+pkg syscall (freebsd-arm64), const SYS___MAC_SET_LINK ideal-int
+pkg syscall (freebsd-arm64), const SYS___MAC_SET_PROC = 385
+pkg syscall (freebsd-arm64), const SYS___MAC_SET_PROC ideal-int
+pkg syscall (freebsd-arm64), const SYS___SEMCTL = 510
+pkg syscall (freebsd-arm64), const SYS___SEMCTL ideal-int
+pkg syscall (freebsd-arm64), const SYS___SETUGID = 374
+pkg syscall (freebsd-arm64), const SYS___SETUGID ideal-int
+pkg syscall (freebsd-arm64), const SYS___SYSCTL = 202
+pkg syscall (freebsd-arm64), const SYS___SYSCTL ideal-int
+pkg syscall (freebsd-arm64), const SYS__UMTX_OP = 454
+pkg syscall (freebsd-arm64), const SYS__UMTX_OP ideal-int
+pkg syscall (freebsd-arm64), const SYS_ABORT2 = 463
+pkg syscall (freebsd-arm64), const SYS_ABORT2 ideal-int
+pkg syscall (freebsd-arm64), const SYS_ACCEPT = 30
+pkg syscall (freebsd-arm64), const SYS_ACCEPT ideal-int
+pkg syscall (freebsd-arm64), const SYS_ACCEPT4 = 541
+pkg syscall (freebsd-arm64), const SYS_ACCEPT4 ideal-int
+pkg syscall (freebsd-arm64), const SYS_ACCESS = 33
+pkg syscall (freebsd-arm64), const SYS_ACCESS ideal-int
+pkg syscall (freebsd-arm64), const SYS_ACCT = 51
+pkg syscall (freebsd-arm64), const SYS_ACCT ideal-int
+pkg syscall (freebsd-arm64), const SYS_ADJTIME = 140
+pkg syscall (freebsd-arm64), const SYS_ADJTIME ideal-int
+pkg syscall (freebsd-arm64), const SYS_AIO_CANCEL = 316
+pkg syscall (freebsd-arm64), const SYS_AIO_CANCEL ideal-int
+pkg syscall (freebsd-arm64), const SYS_AIO_ERROR = 317
+pkg syscall (freebsd-arm64), const SYS_AIO_ERROR ideal-int
+pkg syscall (freebsd-arm64), const SYS_AIO_FSYNC = 465
+pkg syscall (freebsd-arm64), const SYS_AIO_FSYNC ideal-int
+pkg syscall (freebsd-arm64), const SYS_AIO_MLOCK = 543
+pkg syscall (freebsd-arm64), const SYS_AIO_MLOCK ideal-int
+pkg syscall (freebsd-arm64), const SYS_AIO_READ = 255
+pkg syscall (freebsd-arm64), const SYS_AIO_READ ideal-int
+pkg syscall (freebsd-arm64), const SYS_AIO_RETURN = 314
+pkg syscall (freebsd-arm64), const SYS_AIO_RETURN ideal-int
+pkg syscall (freebsd-arm64), const SYS_AIO_SUSPEND = 315
+pkg syscall (freebsd-arm64), const SYS_AIO_SUSPEND ideal-int
+pkg syscall (freebsd-arm64), const SYS_AIO_WAITCOMPLETE = 359
+pkg syscall (freebsd-arm64), const SYS_AIO_WAITCOMPLETE ideal-int
+pkg syscall (freebsd-arm64), const SYS_AIO_WRITE = 256
+pkg syscall (freebsd-arm64), const SYS_AIO_WRITE ideal-int
+pkg syscall (freebsd-arm64), const SYS_AUDIT = 445
+pkg syscall (freebsd-arm64), const SYS_AUDIT ideal-int
+pkg syscall (freebsd-arm64), const SYS_AUDITCTL = 453
+pkg syscall (freebsd-arm64), const SYS_AUDITCTL ideal-int
+pkg syscall (freebsd-arm64), const SYS_AUDITON = 446
+pkg syscall (freebsd-arm64), const SYS_AUDITON ideal-int
+pkg syscall (freebsd-arm64), const SYS_BIND = 104
+pkg syscall (freebsd-arm64), const SYS_BIND ideal-int
+pkg syscall (freebsd-arm64), const SYS_BINDAT = 538
+pkg syscall (freebsd-arm64), const SYS_BINDAT ideal-int
+pkg syscall (freebsd-arm64), const SYS_CAP_ENTER = 516
+pkg syscall (freebsd-arm64), const SYS_CAP_ENTER ideal-int
+pkg syscall (freebsd-arm64), const SYS_CAP_FCNTLS_GET = 537
+pkg syscall (freebsd-arm64), const SYS_CAP_FCNTLS_GET ideal-int
+pkg syscall (freebsd-arm64), const SYS_CAP_FCNTLS_LIMIT = 536
+pkg syscall (freebsd-arm64), const SYS_CAP_FCNTLS_LIMIT ideal-int
+pkg syscall (freebsd-arm64), const SYS_CAP_GETMODE = 517
+pkg syscall (freebsd-arm64), const SYS_CAP_GETMODE ideal-int
+pkg syscall (freebsd-arm64), const SYS_CAP_IOCTLS_GET = 535
+pkg syscall (freebsd-arm64), const SYS_CAP_IOCTLS_GET ideal-int
+pkg syscall (freebsd-arm64), const SYS_CAP_IOCTLS_LIMIT = 534
+pkg syscall (freebsd-arm64), const SYS_CAP_IOCTLS_LIMIT ideal-int
+pkg syscall (freebsd-arm64), const SYS_CAP_RIGHTS_LIMIT = 533
+pkg syscall (freebsd-arm64), const SYS_CAP_RIGHTS_LIMIT ideal-int
+pkg syscall (freebsd-arm64), const SYS_CHDIR = 12
+pkg syscall (freebsd-arm64), const SYS_CHDIR ideal-int
+pkg syscall (freebsd-arm64), const SYS_CHFLAGS = 34
+pkg syscall (freebsd-arm64), const SYS_CHFLAGS ideal-int
+pkg syscall (freebsd-arm64), const SYS_CHFLAGSAT = 540
+pkg syscall (freebsd-arm64), const SYS_CHFLAGSAT ideal-int
+pkg syscall (freebsd-arm64), const SYS_CHMOD = 15
+pkg syscall (freebsd-arm64), const SYS_CHMOD ideal-int
+pkg syscall (freebsd-arm64), const SYS_CHOWN = 16
+pkg syscall (freebsd-arm64), const SYS_CHOWN ideal-int
+pkg syscall (freebsd-arm64), const SYS_CHROOT = 61
+pkg syscall (freebsd-arm64), const SYS_CHROOT ideal-int
+pkg syscall (freebsd-arm64), const SYS_CLOCK_GETCPUCLOCKID2 = 247
+pkg syscall (freebsd-arm64), const SYS_CLOCK_GETCPUCLOCKID2 ideal-int
+pkg syscall (freebsd-arm64), const SYS_CLOCK_GETRES = 234
+pkg syscall (freebsd-arm64), const SYS_CLOCK_GETRES ideal-int
+pkg syscall (freebsd-arm64), const SYS_CLOCK_GETTIME = 232
+pkg syscall (freebsd-arm64), const SYS_CLOCK_GETTIME ideal-int
+pkg syscall (freebsd-arm64), const SYS_CLOCK_NANOSLEEP = 244
+pkg syscall (freebsd-arm64), const SYS_CLOCK_NANOSLEEP ideal-int
+pkg syscall (freebsd-arm64), const SYS_CLOCK_SETTIME = 233
+pkg syscall (freebsd-arm64), const SYS_CLOCK_SETTIME ideal-int
+pkg syscall (freebsd-arm64), const SYS_CLOSE = 6
+pkg syscall (freebsd-arm64), const SYS_CLOSE ideal-int
+pkg syscall (freebsd-arm64), const SYS_CLOSEFROM = 509
+pkg syscall (freebsd-arm64), const SYS_CLOSEFROM ideal-int
+pkg syscall (freebsd-arm64), const SYS_CONNECT = 98
+pkg syscall (freebsd-arm64), const SYS_CONNECT ideal-int
+pkg syscall (freebsd-arm64), const SYS_CONNECTAT = 539
+pkg syscall (freebsd-arm64), const SYS_CONNECTAT ideal-int
+pkg syscall (freebsd-arm64), const SYS_CPUSET = 484
+pkg syscall (freebsd-arm64), const SYS_CPUSET ideal-int
+pkg syscall (freebsd-arm64), const SYS_CPUSET_GETAFFINITY = 487
+pkg syscall (freebsd-arm64), const SYS_CPUSET_GETAFFINITY ideal-int
+pkg syscall (freebsd-arm64), const SYS_CPUSET_GETID = 486
+pkg syscall (freebsd-arm64), const SYS_CPUSET_GETID ideal-int
+pkg syscall (freebsd-arm64), const SYS_CPUSET_SETAFFINITY = 488
+pkg syscall (freebsd-arm64), const SYS_CPUSET_SETAFFINITY ideal-int
+pkg syscall (freebsd-arm64), const SYS_CPUSET_SETID = 485
+pkg syscall (freebsd-arm64), const SYS_CPUSET_SETID ideal-int
+pkg syscall (freebsd-arm64), const SYS_DUP = 41
+pkg syscall (freebsd-arm64), const SYS_DUP ideal-int
+pkg syscall (freebsd-arm64), const SYS_DUP2 = 90
+pkg syscall (freebsd-arm64), const SYS_DUP2 ideal-int
+pkg syscall (freebsd-arm64), const SYS_EACCESS = 376
+pkg syscall (freebsd-arm64), const SYS_EACCESS ideal-int
+pkg syscall (freebsd-arm64), const SYS_EXECVE = 59
+pkg syscall (freebsd-arm64), const SYS_EXECVE ideal-int
+pkg syscall (freebsd-arm64), const SYS_EXIT = 1
+pkg syscall (freebsd-arm64), const SYS_EXIT ideal-int
+pkg syscall (freebsd-arm64), const SYS_EXTATTR_DELETE_FD = 373
+pkg syscall (freebsd-arm64), const SYS_EXTATTR_DELETE_FD ideal-int
+pkg syscall (freebsd-arm64), const SYS_EXTATTR_DELETE_FILE = 358
+pkg syscall (freebsd-arm64), const SYS_EXTATTR_DELETE_FILE ideal-int
+pkg syscall (freebsd-arm64), const SYS_EXTATTR_DELETE_LINK = 414
+pkg syscall (freebsd-arm64), const SYS_EXTATTR_DELETE_LINK ideal-int
+pkg syscall (freebsd-arm64), const SYS_EXTATTR_GET_FD = 372
+pkg syscall (freebsd-arm64), const SYS_EXTATTR_GET_FD ideal-int
+pkg syscall (freebsd-arm64), const SYS_EXTATTR_GET_FILE = 357
+pkg syscall (freebsd-arm64), const SYS_EXTATTR_GET_FILE ideal-int
+pkg syscall (freebsd-arm64), const SYS_EXTATTR_GET_LINK = 413
+pkg syscall (freebsd-arm64), const SYS_EXTATTR_GET_LINK ideal-int
+pkg syscall (freebsd-arm64), const SYS_EXTATTR_LIST_FD = 437
+pkg syscall (freebsd-arm64), const SYS_EXTATTR_LIST_FD ideal-int
+pkg syscall (freebsd-arm64), const SYS_EXTATTR_LIST_FILE = 438
+pkg syscall (freebsd-arm64), const SYS_EXTATTR_LIST_FILE ideal-int
+pkg syscall (freebsd-arm64), const SYS_EXTATTR_LIST_LINK = 439
+pkg syscall (freebsd-arm64), const SYS_EXTATTR_LIST_LINK ideal-int
+pkg syscall (freebsd-arm64), const SYS_EXTATTR_SET_FD = 371
+pkg syscall (freebsd-arm64), const SYS_EXTATTR_SET_FD ideal-int
+pkg syscall (freebsd-arm64), const SYS_EXTATTR_SET_FILE = 356
+pkg syscall (freebsd-arm64), const SYS_EXTATTR_SET_FILE ideal-int
+pkg syscall (freebsd-arm64), const SYS_EXTATTR_SET_LINK = 412
+pkg syscall (freebsd-arm64), const SYS_EXTATTR_SET_LINK ideal-int
+pkg syscall (freebsd-arm64), const SYS_EXTATTRCTL = 355
+pkg syscall (freebsd-arm64), const SYS_EXTATTRCTL ideal-int
+pkg syscall (freebsd-arm64), const SYS_FACCESSAT = 489
+pkg syscall (freebsd-arm64), const SYS_FACCESSAT ideal-int
+pkg syscall (freebsd-arm64), const SYS_FCHDIR = 13
+pkg syscall (freebsd-arm64), const SYS_FCHDIR ideal-int
+pkg syscall (freebsd-arm64), const SYS_FCHFLAGS = 35
+pkg syscall (freebsd-arm64), const SYS_FCHFLAGS ideal-int
+pkg syscall (freebsd-arm64), const SYS_FCHMOD = 124
+pkg syscall (freebsd-arm64), const SYS_FCHMOD ideal-int
+pkg syscall (freebsd-arm64), const SYS_FCHMODAT = 490
+pkg syscall (freebsd-arm64), const SYS_FCHMODAT ideal-int
+pkg syscall (freebsd-arm64), const SYS_FCHOWN = 123
+pkg syscall (freebsd-arm64), const SYS_FCHOWN ideal-int
+pkg syscall (freebsd-arm64), const SYS_FCHOWNAT = 491
+pkg syscall (freebsd-arm64), const SYS_FCHOWNAT ideal-int
+pkg syscall (freebsd-arm64), const SYS_FCNTL = 92
+pkg syscall (freebsd-arm64), const SYS_FCNTL ideal-int
+pkg syscall (freebsd-arm64), const SYS_FDATASYNC = 550
+pkg syscall (freebsd-arm64), const SYS_FDATASYNC ideal-int
+pkg syscall (freebsd-arm64), const SYS_FEXECVE = 492
+pkg syscall (freebsd-arm64), const SYS_FEXECVE ideal-int
+pkg syscall (freebsd-arm64), const SYS_FFCLOCK_GETCOUNTER = 241
+pkg syscall (freebsd-arm64), const SYS_FFCLOCK_GETCOUNTER ideal-int
+pkg syscall (freebsd-arm64), const SYS_FFCLOCK_GETESTIMATE = 243
+pkg syscall (freebsd-arm64), const SYS_FFCLOCK_GETESTIMATE ideal-int
+pkg syscall (freebsd-arm64), const SYS_FFCLOCK_SETESTIMATE = 242
+pkg syscall (freebsd-arm64), const SYS_FFCLOCK_SETESTIMATE ideal-int
+pkg syscall (freebsd-arm64), const SYS_FHOPEN = 298
+pkg syscall (freebsd-arm64), const SYS_FHOPEN ideal-int
+pkg syscall (freebsd-arm64), const SYS_FHSTAT = 299
+pkg syscall (freebsd-arm64), const SYS_FHSTAT ideal-int
+pkg syscall (freebsd-arm64), const SYS_FHSTATFS = 398
+pkg syscall (freebsd-arm64), const SYS_FHSTATFS ideal-int
+pkg syscall (freebsd-arm64), const SYS_FLOCK = 131
+pkg syscall (freebsd-arm64), const SYS_FLOCK ideal-int
+pkg syscall (freebsd-arm64), const SYS_FORK = 2
+pkg syscall (freebsd-arm64), const SYS_FORK ideal-int
+pkg syscall (freebsd-arm64), const SYS_FPATHCONF = 192
+pkg syscall (freebsd-arm64), const SYS_FPATHCONF ideal-int
+pkg syscall (freebsd-arm64), const SYS_FSTAT = 189
+pkg syscall (freebsd-arm64), const SYS_FSTAT ideal-int
+pkg syscall (freebsd-arm64), const SYS_FSTATAT = 493
+pkg syscall (freebsd-arm64), const SYS_FSTATAT ideal-int
+pkg syscall (freebsd-arm64), const SYS_FSTATFS = 397
+pkg syscall (freebsd-arm64), const SYS_FSTATFS ideal-int
+pkg syscall (freebsd-arm64), const SYS_FSYNC = 95
+pkg syscall (freebsd-arm64), const SYS_FSYNC ideal-int
+pkg syscall (freebsd-arm64), const SYS_FTRUNCATE = 480
+pkg syscall (freebsd-arm64), const SYS_FTRUNCATE ideal-int
+pkg syscall (freebsd-arm64), const SYS_FUTIMENS = 546
+pkg syscall (freebsd-arm64), const SYS_FUTIMENS ideal-int
+pkg syscall (freebsd-arm64), const SYS_FUTIMES = 206
+pkg syscall (freebsd-arm64), const SYS_FUTIMES ideal-int
+pkg syscall (freebsd-arm64), const SYS_FUTIMESAT = 494
+pkg syscall (freebsd-arm64), const SYS_FUTIMESAT ideal-int
+pkg syscall (freebsd-arm64), const SYS_GETAUDIT = 449
+pkg syscall (freebsd-arm64), const SYS_GETAUDIT ideal-int
+pkg syscall (freebsd-arm64), const SYS_GETAUDIT_ADDR = 451
+pkg syscall (freebsd-arm64), const SYS_GETAUDIT_ADDR ideal-int
+pkg syscall (freebsd-arm64), const SYS_GETAUID = 447
+pkg syscall (freebsd-arm64), const SYS_GETAUID ideal-int
+pkg syscall (freebsd-arm64), const SYS_GETCONTEXT = 421
+pkg syscall (freebsd-arm64), const SYS_GETCONTEXT ideal-int
+pkg syscall (freebsd-arm64), const SYS_GETDENTS = 272
+pkg syscall (freebsd-arm64), const SYS_GETDENTS ideal-int
+pkg syscall (freebsd-arm64), const SYS_GETDIRENTRIES = 196
+pkg syscall (freebsd-arm64), const SYS_GETDIRENTRIES ideal-int
+pkg syscall (freebsd-arm64), const SYS_GETDTABLESIZE = 89
+pkg syscall (freebsd-arm64), const SYS_GETDTABLESIZE ideal-int
+pkg syscall (freebsd-arm64), const SYS_GETEGID = 43
+pkg syscall (freebsd-arm64), const SYS_GETEGID ideal-int
+pkg syscall (freebsd-arm64), const SYS_GETEUID = 25
+pkg syscall (freebsd-arm64), const SYS_GETEUID ideal-int
+pkg syscall (freebsd-arm64), const SYS_GETFH = 161
+pkg syscall (freebsd-arm64), const SYS_GETFH ideal-int
+pkg syscall (freebsd-arm64), const SYS_GETFSSTAT = 395
+pkg syscall (freebsd-arm64), const SYS_GETFSSTAT ideal-int
+pkg syscall (freebsd-arm64), const SYS_GETGID = 47
+pkg syscall (freebsd-arm64), const SYS_GETGID ideal-int
+pkg syscall (freebsd-arm64), const SYS_GETGROUPS = 79
+pkg syscall (freebsd-arm64), const SYS_GETGROUPS ideal-int
+pkg syscall (freebsd-arm64), const SYS_GETITIMER = 86
+pkg syscall (freebsd-arm64), const SYS_GETITIMER ideal-int
+pkg syscall (freebsd-arm64), const SYS_GETLOGIN = 49
+pkg syscall (freebsd-arm64), const SYS_GETLOGIN ideal-int
+pkg syscall (freebsd-arm64), const SYS_GETLOGINCLASS = 523
+pkg syscall (freebsd-arm64), const SYS_GETLOGINCLASS ideal-int
+pkg syscall (freebsd-arm64), const SYS_GETPEERNAME = 31
+pkg syscall (freebsd-arm64), const SYS_GETPEERNAME ideal-int
+pkg syscall (freebsd-arm64), const SYS_GETPGID = 207
+pkg syscall (freebsd-arm64), const SYS_GETPGID ideal-int
+pkg syscall (freebsd-arm64), const SYS_GETPGRP = 81
+pkg syscall (freebsd-arm64), const SYS_GETPGRP ideal-int
+pkg syscall (freebsd-arm64), const SYS_GETPID = 20
+pkg syscall (freebsd-arm64), const SYS_GETPID ideal-int
+pkg syscall (freebsd-arm64), const SYS_GETPPID = 39
+pkg syscall (freebsd-arm64), const SYS_GETPPID ideal-int
+pkg syscall (freebsd-arm64), const SYS_GETPRIORITY = 100
+pkg syscall (freebsd-arm64), const SYS_GETPRIORITY ideal-int
+pkg syscall (freebsd-arm64), const SYS_GETRESGID = 361
+pkg syscall (freebsd-arm64), const SYS_GETRESGID ideal-int
+pkg syscall (freebsd-arm64), const SYS_GETRESUID = 360
+pkg syscall (freebsd-arm64), const SYS_GETRESUID ideal-int
+pkg syscall (freebsd-arm64), const SYS_GETRLIMIT = 194
+pkg syscall (freebsd-arm64), const SYS_GETRLIMIT ideal-int
+pkg syscall (freebsd-arm64), const SYS_GETRUSAGE = 117
+pkg syscall (freebsd-arm64), const SYS_GETRUSAGE ideal-int
+pkg syscall (freebsd-arm64), const SYS_GETSID = 310
+pkg syscall (freebsd-arm64), const SYS_GETSID ideal-int
+pkg syscall (freebsd-arm64), const SYS_GETSOCKNAME = 32
+pkg syscall (freebsd-arm64), const SYS_GETSOCKNAME ideal-int
+pkg syscall (freebsd-arm64), const SYS_GETSOCKOPT = 118
+pkg syscall (freebsd-arm64), const SYS_GETSOCKOPT ideal-int
+pkg syscall (freebsd-arm64), const SYS_GETTIMEOFDAY = 116
+pkg syscall (freebsd-arm64), const SYS_GETTIMEOFDAY ideal-int
+pkg syscall (freebsd-arm64), const SYS_GETUID = 24
+pkg syscall (freebsd-arm64), const SYS_GETUID ideal-int
+pkg syscall (freebsd-arm64), const SYS_GSSD_SYSCALL = 505
+pkg syscall (freebsd-arm64), const SYS_GSSD_SYSCALL ideal-int
+pkg syscall (freebsd-arm64), const SYS_IOCTL = 54
+pkg syscall (freebsd-arm64), const SYS_IOCTL ideal-int
+pkg syscall (freebsd-arm64), const SYS_ISSETUGID = 253
+pkg syscall (freebsd-arm64), const SYS_ISSETUGID ideal-int
+pkg syscall (freebsd-arm64), const SYS_JAIL = 338
+pkg syscall (freebsd-arm64), const SYS_JAIL ideal-int
+pkg syscall (freebsd-arm64), const SYS_JAIL_ATTACH = 436
+pkg syscall (freebsd-arm64), const SYS_JAIL_ATTACH ideal-int
+pkg syscall (freebsd-arm64), const SYS_JAIL_GET = 506
+pkg syscall (freebsd-arm64), const SYS_JAIL_GET ideal-int
+pkg syscall (freebsd-arm64), const SYS_JAIL_REMOVE = 508
+pkg syscall (freebsd-arm64), const SYS_JAIL_REMOVE ideal-int
+pkg syscall (freebsd-arm64), const SYS_JAIL_SET = 507
+pkg syscall (freebsd-arm64), const SYS_JAIL_SET ideal-int
+pkg syscall (freebsd-arm64), const SYS_KENV = 390
+pkg syscall (freebsd-arm64), const SYS_KENV ideal-int
+pkg syscall (freebsd-arm64), const SYS_KEVENT = 363
+pkg syscall (freebsd-arm64), const SYS_KEVENT ideal-int
+pkg syscall (freebsd-arm64), const SYS_KILL = 37
+pkg syscall (freebsd-arm64), const SYS_KILL ideal-int
+pkg syscall (freebsd-arm64), const SYS_KLDFIND = 306
+pkg syscall (freebsd-arm64), const SYS_KLDFIND ideal-int
+pkg syscall (freebsd-arm64), const SYS_KLDFIRSTMOD = 309
+pkg syscall (freebsd-arm64), const SYS_KLDFIRSTMOD ideal-int
+pkg syscall (freebsd-arm64), const SYS_KLDLOAD = 304
+pkg syscall (freebsd-arm64), const SYS_KLDLOAD ideal-int
+pkg syscall (freebsd-arm64), const SYS_KLDNEXT = 307
+pkg syscall (freebsd-arm64), const SYS_KLDNEXT ideal-int
+pkg syscall (freebsd-arm64), const SYS_KLDSTAT = 308
+pkg syscall (freebsd-arm64), const SYS_KLDSTAT ideal-int
+pkg syscall (freebsd-arm64), const SYS_KLDSYM = 337
+pkg syscall (freebsd-arm64), const SYS_KLDSYM ideal-int
+pkg syscall (freebsd-arm64), const SYS_KLDUNLOAD = 305
+pkg syscall (freebsd-arm64), const SYS_KLDUNLOAD ideal-int
+pkg syscall (freebsd-arm64), const SYS_KLDUNLOADF = 444
+pkg syscall (freebsd-arm64), const SYS_KLDUNLOADF ideal-int
+pkg syscall (freebsd-arm64), const SYS_KMQ_NOTIFY = 461
+pkg syscall (freebsd-arm64), const SYS_KMQ_NOTIFY ideal-int
+pkg syscall (freebsd-arm64), const SYS_KMQ_OPEN = 457
+pkg syscall (freebsd-arm64), const SYS_KMQ_OPEN ideal-int
+pkg syscall (freebsd-arm64), const SYS_KMQ_SETATTR = 458
+pkg syscall (freebsd-arm64), const SYS_KMQ_SETATTR ideal-int
+pkg syscall (freebsd-arm64), const SYS_KMQ_TIMEDRECEIVE = 459
+pkg syscall (freebsd-arm64), const SYS_KMQ_TIMEDRECEIVE ideal-int
+pkg syscall (freebsd-arm64), const SYS_KMQ_TIMEDSEND = 460
+pkg syscall (freebsd-arm64), const SYS_KMQ_TIMEDSEND ideal-int
+pkg syscall (freebsd-arm64), const SYS_KMQ_UNLINK = 462
+pkg syscall (freebsd-arm64), const SYS_KMQ_UNLINK ideal-int
+pkg syscall (freebsd-arm64), const SYS_KQUEUE = 362
+pkg syscall (freebsd-arm64), const SYS_KQUEUE ideal-int
+pkg syscall (freebsd-arm64), const SYS_KSEM_CLOSE = 400
+pkg syscall (freebsd-arm64), const SYS_KSEM_CLOSE ideal-int
+pkg syscall (freebsd-arm64), const SYS_KSEM_DESTROY = 408
+pkg syscall (freebsd-arm64), const SYS_KSEM_DESTROY ideal-int
+pkg syscall (freebsd-arm64), const SYS_KSEM_GETVALUE = 407
+pkg syscall (freebsd-arm64), const SYS_KSEM_GETVALUE ideal-int
+pkg syscall (freebsd-arm64), const SYS_KSEM_INIT = 404
+pkg syscall (freebsd-arm64), const SYS_KSEM_INIT ideal-int
+pkg syscall (freebsd-arm64), const SYS_KSEM_OPEN = 405
+pkg syscall (freebsd-arm64), const SYS_KSEM_OPEN ideal-int
+pkg syscall (freebsd-arm64), const SYS_KSEM_POST = 401
+pkg syscall (freebsd-arm64), const SYS_KSEM_POST ideal-int
+pkg syscall (freebsd-arm64), const SYS_KSEM_TIMEDWAIT = 441
+pkg syscall (freebsd-arm64), const SYS_KSEM_TIMEDWAIT ideal-int
+pkg syscall (freebsd-arm64), const SYS_KSEM_TRYWAIT = 403
+pkg syscall (freebsd-arm64), const SYS_KSEM_TRYWAIT ideal-int
+pkg syscall (freebsd-arm64), const SYS_KSEM_UNLINK = 406
+pkg syscall (freebsd-arm64), const SYS_KSEM_UNLINK ideal-int
+pkg syscall (freebsd-arm64), const SYS_KSEM_WAIT = 402
+pkg syscall (freebsd-arm64), const SYS_KSEM_WAIT ideal-int
+pkg syscall (freebsd-arm64), const SYS_KTIMER_CREATE = 235
+pkg syscall (freebsd-arm64), const SYS_KTIMER_CREATE ideal-int
+pkg syscall (freebsd-arm64), const SYS_KTIMER_DELETE = 236
+pkg syscall (freebsd-arm64), const SYS_KTIMER_DELETE ideal-int
+pkg syscall (freebsd-arm64), const SYS_KTIMER_GETOVERRUN = 239
+pkg syscall (freebsd-arm64), const SYS_KTIMER_GETOVERRUN ideal-int
+pkg syscall (freebsd-arm64), const SYS_KTIMER_GETTIME = 238
+pkg syscall (freebsd-arm64), const SYS_KTIMER_GETTIME ideal-int
+pkg syscall (freebsd-arm64), const SYS_KTIMER_SETTIME = 237
+pkg syscall (freebsd-arm64), const SYS_KTIMER_SETTIME ideal-int
+pkg syscall (freebsd-arm64), const SYS_KTRACE = 45
+pkg syscall (freebsd-arm64), const SYS_KTRACE ideal-int
+pkg syscall (freebsd-arm64), const SYS_LCHFLAGS = 391
+pkg syscall (freebsd-arm64), const SYS_LCHFLAGS ideal-int
+pkg syscall (freebsd-arm64), const SYS_LCHMOD = 274
+pkg syscall (freebsd-arm64), const SYS_LCHMOD ideal-int
+pkg syscall (freebsd-arm64), const SYS_LCHOWN = 254
+pkg syscall (freebsd-arm64), const SYS_LCHOWN ideal-int
+pkg syscall (freebsd-arm64), const SYS_LGETFH = 160
+pkg syscall (freebsd-arm64), const SYS_LGETFH ideal-int
+pkg syscall (freebsd-arm64), const SYS_LINK = 9
+pkg syscall (freebsd-arm64), const SYS_LINK ideal-int
+pkg syscall (freebsd-arm64), const SYS_LINKAT = 495
+pkg syscall (freebsd-arm64), const SYS_LINKAT ideal-int
+pkg syscall (freebsd-arm64), const SYS_LIO_LISTIO = 257
+pkg syscall (freebsd-arm64), const SYS_LIO_LISTIO ideal-int
+pkg syscall (freebsd-arm64), const SYS_LISTEN = 106
+pkg syscall (freebsd-arm64), const SYS_LISTEN ideal-int
+pkg syscall (freebsd-arm64), const SYS_LPATHCONF = 513
+pkg syscall (freebsd-arm64), const SYS_LPATHCONF ideal-int
+pkg syscall (freebsd-arm64), const SYS_LSEEK = 478
+pkg syscall (freebsd-arm64), const SYS_LSEEK ideal-int
+pkg syscall (freebsd-arm64), const SYS_LSTAT = 190
+pkg syscall (freebsd-arm64), const SYS_LSTAT ideal-int
+pkg syscall (freebsd-arm64), const SYS_LUTIMES = 276
+pkg syscall (freebsd-arm64), const SYS_LUTIMES ideal-int
+pkg syscall (freebsd-arm64), const SYS_MAC_SYSCALL = 394
+pkg syscall (freebsd-arm64), const SYS_MAC_SYSCALL ideal-int
+pkg syscall (freebsd-arm64), const SYS_MADVISE = 75
+pkg syscall (freebsd-arm64), const SYS_MADVISE ideal-int
+pkg syscall (freebsd-arm64), const SYS_MINCORE = 78
+pkg syscall (freebsd-arm64), const SYS_MINCORE ideal-int
+pkg syscall (freebsd-arm64), const SYS_MINHERIT = 250
+pkg syscall (freebsd-arm64), const SYS_MINHERIT ideal-int
+pkg syscall (freebsd-arm64), const SYS_MKDIR = 136
+pkg syscall (freebsd-arm64), const SYS_MKDIR ideal-int
+pkg syscall (freebsd-arm64), const SYS_MKDIRAT = 496
+pkg syscall (freebsd-arm64), const SYS_MKDIRAT ideal-int
+pkg syscall (freebsd-arm64), const SYS_MKFIFO = 132
+pkg syscall (freebsd-arm64), const SYS_MKFIFO ideal-int
+pkg syscall (freebsd-arm64), const SYS_MKFIFOAT = 497
+pkg syscall (freebsd-arm64), const SYS_MKFIFOAT ideal-int
+pkg syscall (freebsd-arm64), const SYS_MKNOD = 14
+pkg syscall (freebsd-arm64), const SYS_MKNOD ideal-int
+pkg syscall (freebsd-arm64), const SYS_MKNODAT = 498
+pkg syscall (freebsd-arm64), const SYS_MKNODAT ideal-int
+pkg syscall (freebsd-arm64), const SYS_MLOCK = 203
+pkg syscall (freebsd-arm64), const SYS_MLOCK ideal-int
+pkg syscall (freebsd-arm64), const SYS_MLOCKALL = 324
+pkg syscall (freebsd-arm64), const SYS_MLOCKALL ideal-int
+pkg syscall (freebsd-arm64), const SYS_MMAP = 477
+pkg syscall (freebsd-arm64), const SYS_MMAP ideal-int
+pkg syscall (freebsd-arm64), const SYS_MODFIND = 303
+pkg syscall (freebsd-arm64), const SYS_MODFIND ideal-int
+pkg syscall (freebsd-arm64), const SYS_MODFNEXT = 302
+pkg syscall (freebsd-arm64), const SYS_MODFNEXT ideal-int
+pkg syscall (freebsd-arm64), const SYS_MODNEXT = 300
+pkg syscall (freebsd-arm64), const SYS_MODNEXT ideal-int
+pkg syscall (freebsd-arm64), const SYS_MODSTAT = 301
+pkg syscall (freebsd-arm64), const SYS_MODSTAT ideal-int
+pkg syscall (freebsd-arm64), const SYS_MOUNT = 21
+pkg syscall (freebsd-arm64), const SYS_MOUNT ideal-int
+pkg syscall (freebsd-arm64), const SYS_MPROTECT = 74
+pkg syscall (freebsd-arm64), const SYS_MPROTECT ideal-int
+pkg syscall (freebsd-arm64), const SYS_MSGCTL = 511
+pkg syscall (freebsd-arm64), const SYS_MSGCTL ideal-int
+pkg syscall (freebsd-arm64), const SYS_MSGGET = 225
+pkg syscall (freebsd-arm64), const SYS_MSGGET ideal-int
+pkg syscall (freebsd-arm64), const SYS_MSGRCV = 227
+pkg syscall (freebsd-arm64), const SYS_MSGRCV ideal-int
+pkg syscall (freebsd-arm64), const SYS_MSGSND = 226
+pkg syscall (freebsd-arm64), const SYS_MSGSND ideal-int
+pkg syscall (freebsd-arm64), const SYS_MSGSYS = 170
+pkg syscall (freebsd-arm64), const SYS_MSGSYS ideal-int
+pkg syscall (freebsd-arm64), const SYS_MSYNC = 65
+pkg syscall (freebsd-arm64), const SYS_MSYNC ideal-int
+pkg syscall (freebsd-arm64), const SYS_MUNLOCK = 204
+pkg syscall (freebsd-arm64), const SYS_MUNLOCK ideal-int
+pkg syscall (freebsd-arm64), const SYS_MUNLOCKALL = 325
+pkg syscall (freebsd-arm64), const SYS_MUNLOCKALL ideal-int
+pkg syscall (freebsd-arm64), const SYS_MUNMAP = 73
+pkg syscall (freebsd-arm64), const SYS_MUNMAP ideal-int
+pkg syscall (freebsd-arm64), const SYS_NANOSLEEP = 240
+pkg syscall (freebsd-arm64), const SYS_NANOSLEEP ideal-int
+pkg syscall (freebsd-arm64), const SYS_NFSSVC = 155
+pkg syscall (freebsd-arm64), const SYS_NFSSVC ideal-int
+pkg syscall (freebsd-arm64), const SYS_NFSTAT = 279
+pkg syscall (freebsd-arm64), const SYS_NFSTAT ideal-int
+pkg syscall (freebsd-arm64), const SYS_NLM_SYSCALL = 154
+pkg syscall (freebsd-arm64), const SYS_NLM_SYSCALL ideal-int
+pkg syscall (freebsd-arm64), const SYS_NLSTAT = 280
+pkg syscall (freebsd-arm64), const SYS_NLSTAT ideal-int
+pkg syscall (freebsd-arm64), const SYS_NMOUNT = 378
+pkg syscall (freebsd-arm64), const SYS_NMOUNT ideal-int
+pkg syscall (freebsd-arm64), const SYS_NSTAT = 278
+pkg syscall (freebsd-arm64), const SYS_NSTAT ideal-int
+pkg syscall (freebsd-arm64), const SYS_NTP_ADJTIME = 176
+pkg syscall (freebsd-arm64), const SYS_NTP_ADJTIME ideal-int
+pkg syscall (freebsd-arm64), const SYS_NTP_GETTIME = 248
+pkg syscall (freebsd-arm64), const SYS_NTP_GETTIME ideal-int
+pkg syscall (freebsd-arm64), const SYS_NUMA_GETAFFINITY = 548
+pkg syscall (freebsd-arm64), const SYS_NUMA_GETAFFINITY ideal-int
+pkg syscall (freebsd-arm64), const SYS_NUMA_SETAFFINITY = 549
+pkg syscall (freebsd-arm64), const SYS_NUMA_SETAFFINITY ideal-int
+pkg syscall (freebsd-arm64), const SYS_OBREAK = 17
+pkg syscall (freebsd-arm64), const SYS_OBREAK ideal-int
+pkg syscall (freebsd-arm64), const SYS_OPEN = 5
+pkg syscall (freebsd-arm64), const SYS_OPEN ideal-int
+pkg syscall (freebsd-arm64), const SYS_OPENAT = 499
+pkg syscall (freebsd-arm64), const SYS_OPENAT ideal-int
+pkg syscall (freebsd-arm64), const SYS_OPENBSD_POLL = 252
+pkg syscall (freebsd-arm64), const SYS_OPENBSD_POLL ideal-int
+pkg syscall (freebsd-arm64), const SYS_OVADVISE = 72
+pkg syscall (freebsd-arm64), const SYS_OVADVISE ideal-int
+pkg syscall (freebsd-arm64), const SYS_PATHCONF = 191
+pkg syscall (freebsd-arm64), const SYS_PATHCONF ideal-int
+pkg syscall (freebsd-arm64), const SYS_PDFORK = 518
+pkg syscall (freebsd-arm64), const SYS_PDFORK ideal-int
+pkg syscall (freebsd-arm64), const SYS_PDGETPID = 520
+pkg syscall (freebsd-arm64), const SYS_PDGETPID ideal-int
+pkg syscall (freebsd-arm64), const SYS_PDKILL = 519
+pkg syscall (freebsd-arm64), const SYS_PDKILL ideal-int
+pkg syscall (freebsd-arm64), const SYS_PIPE = 42
+pkg syscall (freebsd-arm64), const SYS_PIPE ideal-int
+pkg syscall (freebsd-arm64), const SYS_PIPE2 = 542
+pkg syscall (freebsd-arm64), const SYS_PIPE2 ideal-int
+pkg syscall (freebsd-arm64), const SYS_POLL = 209
+pkg syscall (freebsd-arm64), const SYS_POLL ideal-int
+pkg syscall (freebsd-arm64), const SYS_POSIX_FADVISE = 531
+pkg syscall (freebsd-arm64), const SYS_POSIX_FADVISE ideal-int
+pkg syscall (freebsd-arm64), const SYS_POSIX_FALLOCATE = 530
+pkg syscall (freebsd-arm64), const SYS_POSIX_FALLOCATE ideal-int
+pkg syscall (freebsd-arm64), const SYS_POSIX_OPENPT = 504
+pkg syscall (freebsd-arm64), const SYS_POSIX_OPENPT ideal-int
+pkg syscall (freebsd-arm64), const SYS_PPOLL = 545
+pkg syscall (freebsd-arm64), const SYS_PPOLL ideal-int
+pkg syscall (freebsd-arm64), const SYS_PREAD = 475
+pkg syscall (freebsd-arm64), const SYS_PREAD ideal-int
+pkg syscall (freebsd-arm64), const SYS_PREADV = 289
+pkg syscall (freebsd-arm64), const SYS_PREADV ideal-int
+pkg syscall (freebsd-arm64), const SYS_PROCCTL = 544
+pkg syscall (freebsd-arm64), const SYS_PROCCTL ideal-int
+pkg syscall (freebsd-arm64), const SYS_PROFIL = 44
+pkg syscall (freebsd-arm64), const SYS_PROFIL ideal-int
+pkg syscall (freebsd-arm64), const SYS_PSELECT = 522
+pkg syscall (freebsd-arm64), const SYS_PSELECT ideal-int
+pkg syscall (freebsd-arm64), const SYS_PTRACE = 26
+pkg syscall (freebsd-arm64), const SYS_PTRACE ideal-int
+pkg syscall (freebsd-arm64), const SYS_PWRITE = 476
+pkg syscall (freebsd-arm64), const SYS_PWRITE ideal-int
+pkg syscall (freebsd-arm64), const SYS_PWRITEV = 290
+pkg syscall (freebsd-arm64), const SYS_PWRITEV ideal-int
+pkg syscall (freebsd-arm64), const SYS_QUOTACTL = 148
+pkg syscall (freebsd-arm64), const SYS_QUOTACTL ideal-int
+pkg syscall (freebsd-arm64), const SYS_RCTL_ADD_RULE = 528
+pkg syscall (freebsd-arm64), const SYS_RCTL_ADD_RULE ideal-int
+pkg syscall (freebsd-arm64), const SYS_RCTL_GET_LIMITS = 527
+pkg syscall (freebsd-arm64), const SYS_RCTL_GET_LIMITS ideal-int
+pkg syscall (freebsd-arm64), const SYS_RCTL_GET_RACCT = 525
+pkg syscall (freebsd-arm64), const SYS_RCTL_GET_RACCT ideal-int
+pkg syscall (freebsd-arm64), const SYS_RCTL_GET_RULES = 526
+pkg syscall (freebsd-arm64), const SYS_RCTL_GET_RULES ideal-int
+pkg syscall (freebsd-arm64), const SYS_RCTL_REMOVE_RULE = 529
+pkg syscall (freebsd-arm64), const SYS_RCTL_REMOVE_RULE ideal-int
+pkg syscall (freebsd-arm64), const SYS_READ = 3
+pkg syscall (freebsd-arm64), const SYS_READ ideal-int
+pkg syscall (freebsd-arm64), const SYS_READLINK = 58
+pkg syscall (freebsd-arm64), const SYS_READLINK ideal-int
+pkg syscall (freebsd-arm64), const SYS_READLINKAT = 500
+pkg syscall (freebsd-arm64), const SYS_READLINKAT ideal-int
+pkg syscall (freebsd-arm64), const SYS_READV = 120
+pkg syscall (freebsd-arm64), const SYS_READV ideal-int
+pkg syscall (freebsd-arm64), const SYS_REBOOT = 55
+pkg syscall (freebsd-arm64), const SYS_REBOOT ideal-int
+pkg syscall (freebsd-arm64), const SYS_RECVFROM = 29
+pkg syscall (freebsd-arm64), const SYS_RECVFROM ideal-int
+pkg syscall (freebsd-arm64), const SYS_RECVMSG = 27
+pkg syscall (freebsd-arm64), const SYS_RECVMSG ideal-int
+pkg syscall (freebsd-arm64), const SYS_RENAME = 128
+pkg syscall (freebsd-arm64), const SYS_RENAME ideal-int
+pkg syscall (freebsd-arm64), const SYS_RENAMEAT = 501
+pkg syscall (freebsd-arm64), const SYS_RENAMEAT ideal-int
+pkg syscall (freebsd-arm64), const SYS_REVOKE = 56
+pkg syscall (freebsd-arm64), const SYS_REVOKE ideal-int
+pkg syscall (freebsd-arm64), const SYS_RFORK = 251
+pkg syscall (freebsd-arm64), const SYS_RFORK ideal-int
+pkg syscall (freebsd-arm64), const SYS_RMDIR = 137
+pkg syscall (freebsd-arm64), const SYS_RMDIR ideal-int
+pkg syscall (freebsd-arm64), const SYS_RTPRIO = 166
+pkg syscall (freebsd-arm64), const SYS_RTPRIO ideal-int
+pkg syscall (freebsd-arm64), const SYS_RTPRIO_THREAD = 466
+pkg syscall (freebsd-arm64), const SYS_RTPRIO_THREAD ideal-int
+pkg syscall (freebsd-arm64), const SYS_SBRK = 69
+pkg syscall (freebsd-arm64), const SYS_SBRK ideal-int
+pkg syscall (freebsd-arm64), const SYS_SCHED_GET_PRIORITY_MAX = 332
+pkg syscall (freebsd-arm64), const SYS_SCHED_GET_PRIORITY_MAX ideal-int
+pkg syscall (freebsd-arm64), const SYS_SCHED_GET_PRIORITY_MIN = 333
+pkg syscall (freebsd-arm64), const SYS_SCHED_GET_PRIORITY_MIN ideal-int
+pkg syscall (freebsd-arm64), const SYS_SCHED_GETPARAM = 328
+pkg syscall (freebsd-arm64), const SYS_SCHED_GETPARAM ideal-int
+pkg syscall (freebsd-arm64), const SYS_SCHED_GETSCHEDULER = 330
+pkg syscall (freebsd-arm64), const SYS_SCHED_GETSCHEDULER ideal-int
+pkg syscall (freebsd-arm64), const SYS_SCHED_RR_GET_INTERVAL = 334
+pkg syscall (freebsd-arm64), const SYS_SCHED_RR_GET_INTERVAL ideal-int
+pkg syscall (freebsd-arm64), const SYS_SCHED_SETPARAM = 327
+pkg syscall (freebsd-arm64), const SYS_SCHED_SETPARAM ideal-int
+pkg syscall (freebsd-arm64), const SYS_SCHED_SETSCHEDULER = 329
+pkg syscall (freebsd-arm64), const SYS_SCHED_SETSCHEDULER ideal-int
+pkg syscall (freebsd-arm64), const SYS_SCHED_YIELD = 331
+pkg syscall (freebsd-arm64), const SYS_SCHED_YIELD ideal-int
+pkg syscall (freebsd-arm64), const SYS_SCTP_GENERIC_RECVMSG = 474
+pkg syscall (freebsd-arm64), const SYS_SCTP_GENERIC_RECVMSG ideal-int
+pkg syscall (freebsd-arm64), const SYS_SCTP_GENERIC_SENDMSG = 472
+pkg syscall (freebsd-arm64), const SYS_SCTP_GENERIC_SENDMSG ideal-int
+pkg syscall (freebsd-arm64), const SYS_SCTP_GENERIC_SENDMSG_IOV = 473
+pkg syscall (freebsd-arm64), const SYS_SCTP_GENERIC_SENDMSG_IOV ideal-int
+pkg syscall (freebsd-arm64), const SYS_SCTP_PEELOFF = 471
+pkg syscall (freebsd-arm64), const SYS_SCTP_PEELOFF ideal-int
+pkg syscall (freebsd-arm64), const SYS_SELECT = 93
+pkg syscall (freebsd-arm64), const SYS_SELECT ideal-int
+pkg syscall (freebsd-arm64), const SYS_SEMGET = 221
+pkg syscall (freebsd-arm64), const SYS_SEMGET ideal-int
+pkg syscall (freebsd-arm64), const SYS_SEMOP = 222
+pkg syscall (freebsd-arm64), const SYS_SEMOP ideal-int
+pkg syscall (freebsd-arm64), const SYS_SEMSYS = 169
+pkg syscall (freebsd-arm64), const SYS_SEMSYS ideal-int
+pkg syscall (freebsd-arm64), const SYS_SENDFILE = 393
+pkg syscall (freebsd-arm64), const SYS_SENDFILE ideal-int
+pkg syscall (freebsd-arm64), const SYS_SENDMSG = 28
+pkg syscall (freebsd-arm64), const SYS_SENDMSG ideal-int
+pkg syscall (freebsd-arm64), const SYS_SENDTO = 133
+pkg syscall (freebsd-arm64), const SYS_SENDTO ideal-int
+pkg syscall (freebsd-arm64), const SYS_SETAUDIT = 450
+pkg syscall (freebsd-arm64), const SYS_SETAUDIT ideal-int
+pkg syscall (freebsd-arm64), const SYS_SETAUDIT_ADDR = 452
+pkg syscall (freebsd-arm64), const SYS_SETAUDIT_ADDR ideal-int
+pkg syscall (freebsd-arm64), const SYS_SETAUID = 448
+pkg syscall (freebsd-arm64), const SYS_SETAUID ideal-int
+pkg syscall (freebsd-arm64), const SYS_SETCONTEXT = 422
+pkg syscall (freebsd-arm64), const SYS_SETCONTEXT ideal-int
+pkg syscall (freebsd-arm64), const SYS_SETEGID = 182
+pkg syscall (freebsd-arm64), const SYS_SETEGID ideal-int
+pkg syscall (freebsd-arm64), const SYS_SETEUID = 183
+pkg syscall (freebsd-arm64), const SYS_SETEUID ideal-int
+pkg syscall (freebsd-arm64), const SYS_SETFIB = 175
+pkg syscall (freebsd-arm64), const SYS_SETFIB ideal-int
+pkg syscall (freebsd-arm64), const SYS_SETGID = 181
+pkg syscall (freebsd-arm64), const SYS_SETGID ideal-int
+pkg syscall (freebsd-arm64), const SYS_SETGROUPS = 80
+pkg syscall (freebsd-arm64), const SYS_SETGROUPS ideal-int
+pkg syscall (freebsd-arm64), const SYS_SETITIMER = 83
+pkg syscall (freebsd-arm64), const SYS_SETITIMER ideal-int
+pkg syscall (freebsd-arm64), const SYS_SETLOGIN = 50
+pkg syscall (freebsd-arm64), const SYS_SETLOGIN ideal-int
+pkg syscall (freebsd-arm64), const SYS_SETLOGINCLASS = 524
+pkg syscall (freebsd-arm64), const SYS_SETLOGINCLASS ideal-int
+pkg syscall (freebsd-arm64), const SYS_SETPGID = 82
+pkg syscall (freebsd-arm64), const SYS_SETPGID ideal-int
+pkg syscall (freebsd-arm64), const SYS_SETPRIORITY = 96
+pkg syscall (freebsd-arm64), const SYS_SETPRIORITY ideal-int
+pkg syscall (freebsd-arm64), const SYS_SETREGID = 127
+pkg syscall (freebsd-arm64), const SYS_SETREGID ideal-int
+pkg syscall (freebsd-arm64), const SYS_SETRESGID = 312
+pkg syscall (freebsd-arm64), const SYS_SETRESGID ideal-int
+pkg syscall (freebsd-arm64), const SYS_SETRESUID = 311
+pkg syscall (freebsd-arm64), const SYS_SETRESUID ideal-int
+pkg syscall (freebsd-arm64), const SYS_SETREUID = 126
+pkg syscall (freebsd-arm64), const SYS_SETREUID ideal-int
+pkg syscall (freebsd-arm64), const SYS_SETRLIMIT = 195
+pkg syscall (freebsd-arm64), const SYS_SETRLIMIT ideal-int
+pkg syscall (freebsd-arm64), const SYS_SETSID = 147
+pkg syscall (freebsd-arm64), const SYS_SETSID ideal-int
+pkg syscall (freebsd-arm64), const SYS_SETSOCKOPT = 105
+pkg syscall (freebsd-arm64), const SYS_SETSOCKOPT ideal-int
+pkg syscall (freebsd-arm64), const SYS_SETTIMEOFDAY = 122
+pkg syscall (freebsd-arm64), const SYS_SETTIMEOFDAY ideal-int
+pkg syscall (freebsd-arm64), const SYS_SETUID = 23
+pkg syscall (freebsd-arm64), const SYS_SETUID ideal-int
+pkg syscall (freebsd-arm64), const SYS_SHM_OPEN = 482
+pkg syscall (freebsd-arm64), const SYS_SHM_OPEN ideal-int
+pkg syscall (freebsd-arm64), const SYS_SHM_UNLINK = 483
+pkg syscall (freebsd-arm64), const SYS_SHM_UNLINK ideal-int
+pkg syscall (freebsd-arm64), const SYS_SHMAT = 228
+pkg syscall (freebsd-arm64), const SYS_SHMAT ideal-int
+pkg syscall (freebsd-arm64), const SYS_SHMCTL = 512
+pkg syscall (freebsd-arm64), const SYS_SHMCTL ideal-int
+pkg syscall (freebsd-arm64), const SYS_SHMDT = 230
+pkg syscall (freebsd-arm64), const SYS_SHMDT ideal-int
+pkg syscall (freebsd-arm64), const SYS_SHMGET = 231
+pkg syscall (freebsd-arm64), const SYS_SHMGET ideal-int
+pkg syscall (freebsd-arm64), const SYS_SHMSYS = 171
+pkg syscall (freebsd-arm64), const SYS_SHMSYS ideal-int
+pkg syscall (freebsd-arm64), const SYS_SHUTDOWN = 134
+pkg syscall (freebsd-arm64), const SYS_SHUTDOWN ideal-int
+pkg syscall (freebsd-arm64), const SYS_SIGACTION = 416
+pkg syscall (freebsd-arm64), const SYS_SIGACTION ideal-int
+pkg syscall (freebsd-arm64), const SYS_SIGALTSTACK = 53
+pkg syscall (freebsd-arm64), const SYS_SIGALTSTACK ideal-int
+pkg syscall (freebsd-arm64), const SYS_SIGPENDING = 343
+pkg syscall (freebsd-arm64), const SYS_SIGPENDING ideal-int
+pkg syscall (freebsd-arm64), const SYS_SIGPROCMASK = 340
+pkg syscall (freebsd-arm64), const SYS_SIGPROCMASK ideal-int
+pkg syscall (freebsd-arm64), const SYS_SIGQUEUE = 456
+pkg syscall (freebsd-arm64), const SYS_SIGQUEUE ideal-int
+pkg syscall (freebsd-arm64), const SYS_SIGRETURN = 417
+pkg syscall (freebsd-arm64), const SYS_SIGRETURN ideal-int
+pkg syscall (freebsd-arm64), const SYS_SIGSUSPEND = 341
+pkg syscall (freebsd-arm64), const SYS_SIGSUSPEND ideal-int
+pkg syscall (freebsd-arm64), const SYS_SIGTIMEDWAIT = 345
+pkg syscall (freebsd-arm64), const SYS_SIGTIMEDWAIT ideal-int
+pkg syscall (freebsd-arm64), const SYS_SIGWAIT = 429
+pkg syscall (freebsd-arm64), const SYS_SIGWAIT ideal-int
+pkg syscall (freebsd-arm64), const SYS_SIGWAITINFO = 346
+pkg syscall (freebsd-arm64), const SYS_SIGWAITINFO ideal-int
+pkg syscall (freebsd-arm64), const SYS_SOCKET = 97
+pkg syscall (freebsd-arm64), const SYS_SOCKET ideal-int
+pkg syscall (freebsd-arm64), const SYS_SOCKETPAIR = 135
+pkg syscall (freebsd-arm64), const SYS_SOCKETPAIR ideal-int
+pkg syscall (freebsd-arm64), const SYS_SSTK = 70
+pkg syscall (freebsd-arm64), const SYS_SSTK ideal-int
+pkg syscall (freebsd-arm64), const SYS_STAT = 188
+pkg syscall (freebsd-arm64), const SYS_STAT ideal-int
+pkg syscall (freebsd-arm64), const SYS_STATFS = 396
+pkg syscall (freebsd-arm64), const SYS_STATFS ideal-int
+pkg syscall (freebsd-arm64), const SYS_SWAPCONTEXT = 423
+pkg syscall (freebsd-arm64), const SYS_SWAPCONTEXT ideal-int
+pkg syscall (freebsd-arm64), const SYS_SWAPOFF = 424
+pkg syscall (freebsd-arm64), const SYS_SWAPOFF ideal-int
+pkg syscall (freebsd-arm64), const SYS_SWAPON = 85
+pkg syscall (freebsd-arm64), const SYS_SWAPON ideal-int
+pkg syscall (freebsd-arm64), const SYS_SYMLINK = 57
+pkg syscall (freebsd-arm64), const SYS_SYMLINK ideal-int
+pkg syscall (freebsd-arm64), const SYS_SYMLINKAT = 502
+pkg syscall (freebsd-arm64), const SYS_SYMLINKAT ideal-int
+pkg syscall (freebsd-arm64), const SYS_SYNC = 36
+pkg syscall (freebsd-arm64), const SYS_SYNC ideal-int
+pkg syscall (freebsd-arm64), const SYS_SYSARCH = 165
+pkg syscall (freebsd-arm64), const SYS_SYSARCH ideal-int
+pkg syscall (freebsd-arm64), const SYS_THR_CREATE = 430
+pkg syscall (freebsd-arm64), const SYS_THR_CREATE ideal-int
+pkg syscall (freebsd-arm64), const SYS_THR_EXIT = 431
+pkg syscall (freebsd-arm64), const SYS_THR_EXIT ideal-int
+pkg syscall (freebsd-arm64), const SYS_THR_KILL = 433
+pkg syscall (freebsd-arm64), const SYS_THR_KILL ideal-int
+pkg syscall (freebsd-arm64), const SYS_THR_KILL2 = 481
+pkg syscall (freebsd-arm64), const SYS_THR_KILL2 ideal-int
+pkg syscall (freebsd-arm64), const SYS_THR_NEW = 455
+pkg syscall (freebsd-arm64), const SYS_THR_NEW ideal-int
+pkg syscall (freebsd-arm64), const SYS_THR_SELF = 432
+pkg syscall (freebsd-arm64), const SYS_THR_SELF ideal-int
+pkg syscall (freebsd-arm64), const SYS_THR_SET_NAME = 464
+pkg syscall (freebsd-arm64), const SYS_THR_SET_NAME ideal-int
+pkg syscall (freebsd-arm64), const SYS_THR_SUSPEND = 442
+pkg syscall (freebsd-arm64), const SYS_THR_SUSPEND ideal-int
+pkg syscall (freebsd-arm64), const SYS_THR_WAKE = 443
+pkg syscall (freebsd-arm64), const SYS_THR_WAKE ideal-int
+pkg syscall (freebsd-arm64), const SYS_TRUNCATE = 479
+pkg syscall (freebsd-arm64), const SYS_TRUNCATE ideal-int
+pkg syscall (freebsd-arm64), const SYS_UMASK = 60
+pkg syscall (freebsd-arm64), const SYS_UMASK ideal-int
+pkg syscall (freebsd-arm64), const SYS_UNDELETE = 205
+pkg syscall (freebsd-arm64), const SYS_UNDELETE ideal-int
+pkg syscall (freebsd-arm64), const SYS_UNLINK = 10
+pkg syscall (freebsd-arm64), const SYS_UNLINK ideal-int
+pkg syscall (freebsd-arm64), const SYS_UNLINKAT = 503
+pkg syscall (freebsd-arm64), const SYS_UNLINKAT ideal-int
+pkg syscall (freebsd-arm64), const SYS_UNMOUNT = 22
+pkg syscall (freebsd-arm64), const SYS_UNMOUNT ideal-int
+pkg syscall (freebsd-arm64), const SYS_UTIMENSAT = 547
+pkg syscall (freebsd-arm64), const SYS_UTIMENSAT ideal-int
+pkg syscall (freebsd-arm64), const SYS_UTIMES = 138
+pkg syscall (freebsd-arm64), const SYS_UTIMES ideal-int
+pkg syscall (freebsd-arm64), const SYS_UTRACE = 335
+pkg syscall (freebsd-arm64), const SYS_UTRACE ideal-int
+pkg syscall (freebsd-arm64), const SYS_UUIDGEN = 392
+pkg syscall (freebsd-arm64), const SYS_UUIDGEN ideal-int
+pkg syscall (freebsd-arm64), const SYS_VFORK = 66
+pkg syscall (freebsd-arm64), const SYS_VFORK ideal-int
+pkg syscall (freebsd-arm64), const SYS_WAIT4 = 7
+pkg syscall (freebsd-arm64), const SYS_WAIT4 ideal-int
+pkg syscall (freebsd-arm64), const SYS_WAIT6 = 532
+pkg syscall (freebsd-arm64), const SYS_WAIT6 ideal-int
+pkg syscall (freebsd-arm64), const SYS_WRITE = 4
+pkg syscall (freebsd-arm64), const SYS_WRITE ideal-int
+pkg syscall (freebsd-arm64), const SYS_WRITEV = 121
+pkg syscall (freebsd-arm64), const SYS_WRITEV ideal-int
+pkg syscall (freebsd-arm64), const SYS_YIELD = 321
+pkg syscall (freebsd-arm64), const SYS_YIELD ideal-int
+pkg syscall (freebsd-arm64), const TCIFLUSH = 1
+pkg syscall (freebsd-arm64), const TCIFLUSH ideal-int
+pkg syscall (freebsd-arm64), const TCIOFLUSH = 3
+pkg syscall (freebsd-arm64), const TCIOFLUSH ideal-int
+pkg syscall (freebsd-arm64), const TCOFLUSH = 2
+pkg syscall (freebsd-arm64), const TCOFLUSH ideal-int
+pkg syscall (freebsd-arm64), const TCP_CA_NAME_MAX = 16
+pkg syscall (freebsd-arm64), const TCP_CA_NAME_MAX ideal-int
+pkg syscall (freebsd-arm64), const TCP_CONGESTION = 64
+pkg syscall (freebsd-arm64), const TCP_CONGESTION ideal-int
+pkg syscall (freebsd-arm64), const TCP_INFO = 32
+pkg syscall (freebsd-arm64), const TCP_INFO ideal-int
+pkg syscall (freebsd-arm64), const TCP_KEEPCNT = 1024
+pkg syscall (freebsd-arm64), const TCP_KEEPCNT ideal-int
+pkg syscall (freebsd-arm64), const TCP_KEEPIDLE = 256
+pkg syscall (freebsd-arm64), const TCP_KEEPIDLE ideal-int
+pkg syscall (freebsd-arm64), const TCP_KEEPINIT = 128
+pkg syscall (freebsd-arm64), const TCP_KEEPINIT ideal-int
+pkg syscall (freebsd-arm64), const TCP_KEEPINTVL = 512
+pkg syscall (freebsd-arm64), const TCP_KEEPINTVL ideal-int
+pkg syscall (freebsd-arm64), const TCP_MAX_SACK = 4
+pkg syscall (freebsd-arm64), const TCP_MAX_SACK ideal-int
+pkg syscall (freebsd-arm64), const TCP_MAX_WINSHIFT = 14
+pkg syscall (freebsd-arm64), const TCP_MAX_WINSHIFT ideal-int
+pkg syscall (freebsd-arm64), const TCP_MAXBURST = 4
+pkg syscall (freebsd-arm64), const TCP_MAXBURST ideal-int
+pkg syscall (freebsd-arm64), const TCP_MAXHLEN = 60
+pkg syscall (freebsd-arm64), const TCP_MAXHLEN ideal-int
+pkg syscall (freebsd-arm64), const TCP_MAXOLEN = 40
+pkg syscall (freebsd-arm64), const TCP_MAXOLEN ideal-int
+pkg syscall (freebsd-arm64), const TCP_MAXSEG = 2
+pkg syscall (freebsd-arm64), const TCP_MAXSEG ideal-int
+pkg syscall (freebsd-arm64), const TCP_MAXWIN = 65535
+pkg syscall (freebsd-arm64), const TCP_MAXWIN ideal-int
+pkg syscall (freebsd-arm64), const TCP_MD5SIG = 16
+pkg syscall (freebsd-arm64), const TCP_MD5SIG ideal-int
+pkg syscall (freebsd-arm64), const TCP_MINMSS = 216
+pkg syscall (freebsd-arm64), const TCP_MINMSS ideal-int
+pkg syscall (freebsd-arm64), const TCP_MSS = 536
+pkg syscall (freebsd-arm64), const TCP_MSS ideal-int
+pkg syscall (freebsd-arm64), const TCP_NOOPT = 8
+pkg syscall (freebsd-arm64), const TCP_NOOPT ideal-int
+pkg syscall (freebsd-arm64), const TCP_NOPUSH = 4
+pkg syscall (freebsd-arm64), const TCP_NOPUSH ideal-int
+pkg syscall (freebsd-arm64), const TCP_VENDOR = 2147483648
+pkg syscall (freebsd-arm64), const TCP_VENDOR ideal-int
+pkg syscall (freebsd-arm64), const TCSAFLUSH = 2
+pkg syscall (freebsd-arm64), const TCSAFLUSH ideal-int
+pkg syscall (freebsd-arm64), const TIOCCBRK = 536900730
+pkg syscall (freebsd-arm64), const TIOCCBRK ideal-int
+pkg syscall (freebsd-arm64), const TIOCCDTR = 536900728
+pkg syscall (freebsd-arm64), const TIOCCDTR ideal-int
+pkg syscall (freebsd-arm64), const TIOCCONS = 2147775586
+pkg syscall (freebsd-arm64), const TIOCCONS ideal-int
+pkg syscall (freebsd-arm64), const TIOCDRAIN = 536900702
+pkg syscall (freebsd-arm64), const TIOCDRAIN ideal-int
+pkg syscall (freebsd-arm64), const TIOCEXCL = 536900621
+pkg syscall (freebsd-arm64), const TIOCEXCL ideal-int
+pkg syscall (freebsd-arm64), const TIOCEXT = 2147775584
+pkg syscall (freebsd-arm64), const TIOCEXT ideal-int
+pkg syscall (freebsd-arm64), const TIOCFLUSH = 2147775504
+pkg syscall (freebsd-arm64), const TIOCFLUSH ideal-int
+pkg syscall (freebsd-arm64), const TIOCGDRAINWAIT = 1074033750
+pkg syscall (freebsd-arm64), const TIOCGDRAINWAIT ideal-int
+pkg syscall (freebsd-arm64), const TIOCGETA = 1076655123
+pkg syscall (freebsd-arm64), const TIOCGETA ideal-int
+pkg syscall (freebsd-arm64), const TIOCGETD = 1074033690
+pkg syscall (freebsd-arm64), const TIOCGETD ideal-int
+pkg syscall (freebsd-arm64), const TIOCGPGRP = 1074033783
+pkg syscall (freebsd-arm64), const TIOCGPGRP ideal-int
+pkg syscall (freebsd-arm64), const TIOCGPTN = 1074033679
+pkg syscall (freebsd-arm64), const TIOCGPTN ideal-int
+pkg syscall (freebsd-arm64), const TIOCGSID = 1074033763
+pkg syscall (freebsd-arm64), const TIOCGSID ideal-int
+pkg syscall (freebsd-arm64), const TIOCGWINSZ = 1074295912
+pkg syscall (freebsd-arm64), const TIOCGWINSZ ideal-int
+pkg syscall (freebsd-arm64), const TIOCM_CAR = 64
+pkg syscall (freebsd-arm64), const TIOCM_CAR ideal-int
+pkg syscall (freebsd-arm64), const TIOCM_CD = 64
+pkg syscall (freebsd-arm64), const TIOCM_CD ideal-int
+pkg syscall (freebsd-arm64), const TIOCM_CTS = 32
+pkg syscall (freebsd-arm64), const TIOCM_CTS ideal-int
+pkg syscall (freebsd-arm64), const TIOCM_DCD = 64
+pkg syscall (freebsd-arm64), const TIOCM_DCD ideal-int
+pkg syscall (freebsd-arm64), const TIOCM_DSR = 256
+pkg syscall (freebsd-arm64), const TIOCM_DSR ideal-int
+pkg syscall (freebsd-arm64), const TIOCM_DTR = 2
+pkg syscall (freebsd-arm64), const TIOCM_DTR ideal-int
+pkg syscall (freebsd-arm64), const TIOCM_LE = 1
+pkg syscall (freebsd-arm64), const TIOCM_LE ideal-int
+pkg syscall (freebsd-arm64), const TIOCM_RI = 128
+pkg syscall (freebsd-arm64), const TIOCM_RI ideal-int
+pkg syscall (freebsd-arm64), const TIOCM_RNG = 128
+pkg syscall (freebsd-arm64), const TIOCM_RNG ideal-int
+pkg syscall (freebsd-arm64), const TIOCM_RTS = 4
+pkg syscall (freebsd-arm64), const TIOCM_RTS ideal-int
+pkg syscall (freebsd-arm64), const TIOCM_SR = 16
+pkg syscall (freebsd-arm64), const TIOCM_SR ideal-int
+pkg syscall (freebsd-arm64), const TIOCM_ST = 8
+pkg syscall (freebsd-arm64), const TIOCM_ST ideal-int
+pkg syscall (freebsd-arm64), const TIOCMBIC = 2147775595
+pkg syscall (freebsd-arm64), const TIOCMBIC ideal-int
+pkg syscall (freebsd-arm64), const TIOCMBIS = 2147775596
+pkg syscall (freebsd-arm64), const TIOCMBIS ideal-int
+pkg syscall (freebsd-arm64), const TIOCMGDTRWAIT = 1074033754
+pkg syscall (freebsd-arm64), const TIOCMGDTRWAIT ideal-int
+pkg syscall (freebsd-arm64), const TIOCMGET = 1074033770
+pkg syscall (freebsd-arm64), const TIOCMGET ideal-int
+pkg syscall (freebsd-arm64), const TIOCMSDTRWAIT = 2147775579
+pkg syscall (freebsd-arm64), const TIOCMSDTRWAIT ideal-int
+pkg syscall (freebsd-arm64), const TIOCMSET = 2147775597
+pkg syscall (freebsd-arm64), const TIOCMSET ideal-int
+pkg syscall (freebsd-arm64), const TIOCNOTTY = 536900721
+pkg syscall (freebsd-arm64), const TIOCNOTTY ideal-int
+pkg syscall (freebsd-arm64), const TIOCNXCL = 536900622
+pkg syscall (freebsd-arm64), const TIOCNXCL ideal-int
+pkg syscall (freebsd-arm64), const TIOCOUTQ = 1074033779
+pkg syscall (freebsd-arm64), const TIOCOUTQ ideal-int
+pkg syscall (freebsd-arm64), const TIOCPKT = 2147775600
+pkg syscall (freebsd-arm64), const TIOCPKT ideal-int
+pkg syscall (freebsd-arm64), const TIOCPKT_DATA = 0
+pkg syscall (freebsd-arm64), const TIOCPKT_DATA ideal-int
+pkg syscall (freebsd-arm64), const TIOCPKT_DOSTOP = 32
+pkg syscall (freebsd-arm64), const TIOCPKT_DOSTOP ideal-int
+pkg syscall (freebsd-arm64), const TIOCPKT_FLUSHREAD = 1
+pkg syscall (freebsd-arm64), const TIOCPKT_FLUSHREAD ideal-int
+pkg syscall (freebsd-arm64), const TIOCPKT_FLUSHWRITE = 2
+pkg syscall (freebsd-arm64), const TIOCPKT_FLUSHWRITE ideal-int
+pkg syscall (freebsd-arm64), const TIOCPKT_IOCTL = 64
+pkg syscall (freebsd-arm64), const TIOCPKT_IOCTL ideal-int
+pkg syscall (freebsd-arm64), const TIOCPKT_NOSTOP = 16
+pkg syscall (freebsd-arm64), const TIOCPKT_NOSTOP ideal-int
+pkg syscall (freebsd-arm64), const TIOCPKT_START = 8
+pkg syscall (freebsd-arm64), const TIOCPKT_START ideal-int
+pkg syscall (freebsd-arm64), const TIOCPKT_STOP = 4
+pkg syscall (freebsd-arm64), const TIOCPKT_STOP ideal-int
+pkg syscall (freebsd-arm64), const TIOCPTMASTER = 536900636
+pkg syscall (freebsd-arm64), const TIOCPTMASTER ideal-int
+pkg syscall (freebsd-arm64), const TIOCSBRK = 536900731
+pkg syscall (freebsd-arm64), const TIOCSBRK ideal-int
+pkg syscall (freebsd-arm64), const TIOCSCTTY = 536900705
+pkg syscall (freebsd-arm64), const TIOCSCTTY ideal-int
+pkg syscall (freebsd-arm64), const TIOCSDRAINWAIT = 2147775575
+pkg syscall (freebsd-arm64), const TIOCSDRAINWAIT ideal-int
+pkg syscall (freebsd-arm64), const TIOCSDTR = 536900729
+pkg syscall (freebsd-arm64), const TIOCSDTR ideal-int
+pkg syscall (freebsd-arm64), const TIOCSETA = 2150396948
+pkg syscall (freebsd-arm64), const TIOCSETA ideal-int
+pkg syscall (freebsd-arm64), const TIOCSETAF = 2150396950
+pkg syscall (freebsd-arm64), const TIOCSETAF ideal-int
+pkg syscall (freebsd-arm64), const TIOCSETAW = 2150396949
+pkg syscall (freebsd-arm64), const TIOCSETAW ideal-int
+pkg syscall (freebsd-arm64), const TIOCSETD = 2147775515
+pkg syscall (freebsd-arm64), const TIOCSETD ideal-int
+pkg syscall (freebsd-arm64), const TIOCSIG = 537162847
+pkg syscall (freebsd-arm64), const TIOCSIG ideal-int
+pkg syscall (freebsd-arm64), const TIOCSPGRP = 2147775606
+pkg syscall (freebsd-arm64), const TIOCSPGRP ideal-int
+pkg syscall (freebsd-arm64), const TIOCSTART = 536900718
+pkg syscall (freebsd-arm64), const TIOCSTART ideal-int
+pkg syscall (freebsd-arm64), const TIOCSTAT = 536900709
+pkg syscall (freebsd-arm64), const TIOCSTAT ideal-int
+pkg syscall (freebsd-arm64), const TIOCSTI = 2147578994
+pkg syscall (freebsd-arm64), const TIOCSTI ideal-int
+pkg syscall (freebsd-arm64), const TIOCSTOP = 536900719
+pkg syscall (freebsd-arm64), const TIOCSTOP ideal-int
+pkg syscall (freebsd-arm64), const TIOCSWINSZ = 2148037735
+pkg syscall (freebsd-arm64), const TIOCSWINSZ ideal-int
+pkg syscall (freebsd-arm64), const TIOCTIMESTAMP = 1074820185
+pkg syscall (freebsd-arm64), const TIOCTIMESTAMP ideal-int
+pkg syscall (freebsd-arm64), const TIOCUCNTL = 2147775590
+pkg syscall (freebsd-arm64), const TIOCUCNTL ideal-int
+pkg syscall (freebsd-arm64), const TOSTOP = 4194304
+pkg syscall (freebsd-arm64), const TOSTOP ideal-int
+pkg syscall (freebsd-arm64), const VDISCARD = 15
+pkg syscall (freebsd-arm64), const VDISCARD ideal-int
+pkg syscall (freebsd-arm64), const VDSUSP = 11
+pkg syscall (freebsd-arm64), const VDSUSP ideal-int
+pkg syscall (freebsd-arm64), const VEOF = 0
+pkg syscall (freebsd-arm64), const VEOF ideal-int
+pkg syscall (freebsd-arm64), const VEOL = 1
+pkg syscall (freebsd-arm64), const VEOL ideal-int
+pkg syscall (freebsd-arm64), const VEOL2 = 2
+pkg syscall (freebsd-arm64), const VEOL2 ideal-int
+pkg syscall (freebsd-arm64), const VERASE = 3
+pkg syscall (freebsd-arm64), const VERASE ideal-int
+pkg syscall (freebsd-arm64), const VERASE2 = 7
+pkg syscall (freebsd-arm64), const VERASE2 ideal-int
+pkg syscall (freebsd-arm64), const VINTR = 8
+pkg syscall (freebsd-arm64), const VINTR ideal-int
+pkg syscall (freebsd-arm64), const VKILL = 5
+pkg syscall (freebsd-arm64), const VKILL ideal-int
+pkg syscall (freebsd-arm64), const VLNEXT = 14
+pkg syscall (freebsd-arm64), const VLNEXT ideal-int
+pkg syscall (freebsd-arm64), const VMIN = 16
+pkg syscall (freebsd-arm64), const VMIN ideal-int
+pkg syscall (freebsd-arm64), const VQUIT = 9
+pkg syscall (freebsd-arm64), const VQUIT ideal-int
+pkg syscall (freebsd-arm64), const VREPRINT = 6
+pkg syscall (freebsd-arm64), const VREPRINT ideal-int
+pkg syscall (freebsd-arm64), const VSTART = 12
+pkg syscall (freebsd-arm64), const VSTART ideal-int
+pkg syscall (freebsd-arm64), const VSTATUS = 18
+pkg syscall (freebsd-arm64), const VSTATUS ideal-int
+pkg syscall (freebsd-arm64), const VSTOP = 13
+pkg syscall (freebsd-arm64), const VSTOP ideal-int
+pkg syscall (freebsd-arm64), const VSUSP = 10
+pkg syscall (freebsd-arm64), const VSUSP ideal-int
+pkg syscall (freebsd-arm64), const VTIME = 17
+pkg syscall (freebsd-arm64), const VTIME ideal-int
+pkg syscall (freebsd-arm64), const VWERASE = 4
+pkg syscall (freebsd-arm64), const VWERASE ideal-int
+pkg syscall (freebsd-arm64), const WCONTINUED = 4
+pkg syscall (freebsd-arm64), const WCONTINUED ideal-int
+pkg syscall (freebsd-arm64), const WCOREFLAG = 128
+pkg syscall (freebsd-arm64), const WCOREFLAG ideal-int
+pkg syscall (freebsd-arm64), const WEXITED = 16
+pkg syscall (freebsd-arm64), const WEXITED ideal-int
+pkg syscall (freebsd-arm64), const WLINUXCLONE = 2147483648
+pkg syscall (freebsd-arm64), const WLINUXCLONE ideal-int
+pkg syscall (freebsd-arm64), const WNOHANG = 1
+pkg syscall (freebsd-arm64), const WNOHANG ideal-int
+pkg syscall (freebsd-arm64), const WNOWAIT = 8
+pkg syscall (freebsd-arm64), const WNOWAIT ideal-int
+pkg syscall (freebsd-arm64), const WSTOPPED = 2
+pkg syscall (freebsd-arm64), const WSTOPPED ideal-int
+pkg syscall (freebsd-arm64), const WTRAPPED = 32
+pkg syscall (freebsd-arm64), const WTRAPPED ideal-int
+pkg syscall (freebsd-arm64), const WUNTRACED = 2
+pkg syscall (freebsd-arm64), const WUNTRACED ideal-int
+pkg syscall (freebsd-arm64), func Accept(int) (int, Sockaddr, error)
+pkg syscall (freebsd-arm64), func Accept4(int, int) (int, Sockaddr, error)
+pkg syscall (freebsd-arm64), func Access(string, uint32) error
+pkg syscall (freebsd-arm64), func Adjtime(*Timeval, *Timeval) error
+pkg syscall (freebsd-arm64), func Bind(int, Sockaddr) error
+pkg syscall (freebsd-arm64), func BpfBuflen //deprecated
+pkg syscall (freebsd-arm64), func BpfBuflen(int) (int, error)
+pkg syscall (freebsd-arm64), func BpfDatalink //deprecated
+pkg syscall (freebsd-arm64), func BpfDatalink(int) (int, error)
+pkg syscall (freebsd-arm64), func BpfHeadercmpl //deprecated
+pkg syscall (freebsd-arm64), func BpfHeadercmpl(int) (int, error)
+pkg syscall (freebsd-arm64), func BpfInterface //deprecated
+pkg syscall (freebsd-arm64), func BpfInterface(int, string) (string, error)
+pkg syscall (freebsd-arm64), func BpfJump //deprecated
+pkg syscall (freebsd-arm64), func BpfJump(int, int, int, int) *BpfInsn
+pkg syscall (freebsd-arm64), func BpfStats //deprecated
+pkg syscall (freebsd-arm64), func BpfStats(int) (*BpfStat, error)
+pkg syscall (freebsd-arm64), func BpfStmt //deprecated
+pkg syscall (freebsd-arm64), func BpfStmt(int, int) *BpfInsn
+pkg syscall (freebsd-arm64), func BpfTimeout //deprecated
+pkg syscall (freebsd-arm64), func BpfTimeout(int) (*Timeval, error)
+pkg syscall (freebsd-arm64), func CheckBpfVersion //deprecated
+pkg syscall (freebsd-arm64), func CheckBpfVersion(int) error
+pkg syscall (freebsd-arm64), func Chflags(string, int) error
+pkg syscall (freebsd-arm64), func Chroot(string) error
+pkg syscall (freebsd-arm64), func Close(int) error
+pkg syscall (freebsd-arm64), func CloseOnExec(int)
+pkg syscall (freebsd-arm64), func CmsgLen(int) int
+pkg syscall (freebsd-arm64), func CmsgSpace(int) int
+pkg syscall (freebsd-arm64), func Connect(int, Sockaddr) error
+pkg syscall (freebsd-arm64), func Dup(int) (int, error)
+pkg syscall (freebsd-arm64), func Dup2(int, int) error
+pkg syscall (freebsd-arm64), func Fchdir(int) error
+pkg syscall (freebsd-arm64), func Fchflags(int, int) error
+pkg syscall (freebsd-arm64), func Fchmod(int, uint32) error
+pkg syscall (freebsd-arm64), func Fchown(int, int, int) error
+pkg syscall (freebsd-arm64), func FcntlFlock(uintptr, int, *Flock_t) error
+pkg syscall (freebsd-arm64), func Flock(int, int) error
+pkg syscall (freebsd-arm64), func FlushBpf //deprecated
+pkg syscall (freebsd-arm64), func FlushBpf(int) error
+pkg syscall (freebsd-arm64), func ForkExec(string, []string, *ProcAttr) (int, error)
+pkg syscall (freebsd-arm64), func Fpathconf(int, int) (int, error)
+pkg syscall (freebsd-arm64), func Fstat(int, *Stat_t) error
+pkg syscall (freebsd-arm64), func Fstatat(int, string, *Stat_t, int) error
+pkg syscall (freebsd-arm64), func Fstatfs(int, *Statfs_t) error
+pkg syscall (freebsd-arm64), func Fsync(int) error
+pkg syscall (freebsd-arm64), func Ftruncate(int, int64) error
+pkg syscall (freebsd-arm64), func Futimes(int, []Timeval) error
+pkg syscall (freebsd-arm64), func Getdirentries(int, []uint8, *uintptr) (int, error)
+pkg syscall (freebsd-arm64), func Getdtablesize() int
+pkg syscall (freebsd-arm64), func Getfsstat([]Statfs_t, int) (int, error)
+pkg syscall (freebsd-arm64), func Getpeername(int) (Sockaddr, error)
+pkg syscall (freebsd-arm64), func Getpgid(int) (int, error)
+pkg syscall (freebsd-arm64), func Getpgrp() int
+pkg syscall (freebsd-arm64), func Getpriority(int, int) (int, error)
+pkg syscall (freebsd-arm64), func Getrlimit(int, *Rlimit) error
+pkg syscall (freebsd-arm64), func Getrusage(int, *Rusage) error
+pkg syscall (freebsd-arm64), func Getsid(int) (int, error)
+pkg syscall (freebsd-arm64), func Getsockname(int) (Sockaddr, error)
+pkg syscall (freebsd-arm64), func GetsockoptByte(int, int, int) (uint8, error)
+pkg syscall (freebsd-arm64), func GetsockoptICMPv6Filter(int, int, int) (*ICMPv6Filter, error)
+pkg syscall (freebsd-arm64), func GetsockoptInet4Addr(int, int, int) ([4]uint8, error)
+pkg syscall (freebsd-arm64), func GetsockoptInt(int, int, int) (int, error)
+pkg syscall (freebsd-arm64), func GetsockoptIPMreq(int, int, int) (*IPMreq, error)
+pkg syscall (freebsd-arm64), func GetsockoptIPMreqn(int, int, int) (*IPMreqn, error)
+pkg syscall (freebsd-arm64), func GetsockoptIPv6Mreq(int, int, int) (*IPv6Mreq, error)
+pkg syscall (freebsd-arm64), func GetsockoptIPv6MTUInfo(int, int, int) (*IPv6MTUInfo, error)
+pkg syscall (freebsd-arm64), func Issetugid() bool
+pkg syscall (freebsd-arm64), func Kevent(int, []Kevent_t, []Kevent_t, *Timespec) (int, error)
+pkg syscall (freebsd-arm64), func Kill(int, Signal) error
+pkg syscall (freebsd-arm64), func Kqueue() (int, error)
+pkg syscall (freebsd-arm64), func Listen(int, int) error
+pkg syscall (freebsd-arm64), func Lstat(string, *Stat_t) error
+pkg syscall (freebsd-arm64), func Mkfifo(string, uint32) error
+pkg syscall (freebsd-arm64), func Mknod(string, uint32, uint64) error
+pkg syscall (freebsd-arm64), func Mmap(int, int64, int, int, int) ([]uint8, error)
+pkg syscall (freebsd-arm64), func Munmap([]uint8) error
+pkg syscall (freebsd-arm64), func Nanosleep(*Timespec, *Timespec) error
+pkg syscall (freebsd-arm64), func Open(string, int, uint32) (int, error)
+pkg syscall (freebsd-arm64), func ParseDirent([]uint8, int, []string) (int, int, []string)
+pkg syscall (freebsd-arm64), func ParseRoutingMessage //deprecated
+pkg syscall (freebsd-arm64), func ParseRoutingMessage([]uint8) ([]RoutingMessage, error)
+pkg syscall (freebsd-arm64), func ParseRoutingSockaddr //deprecated
+pkg syscall (freebsd-arm64), func ParseRoutingSockaddr(RoutingMessage) ([]Sockaddr, error)
+pkg syscall (freebsd-arm64), func ParseSocketControlMessage([]uint8) ([]SocketControlMessage, error)
+pkg syscall (freebsd-arm64), func ParseUnixRights(*SocketControlMessage) ([]int, error)
+pkg syscall (freebsd-arm64), func Pathconf(string, int) (int, error)
+pkg syscall (freebsd-arm64), func Pipe([]int) error
+pkg syscall (freebsd-arm64), func Pipe2([]int, int) error
+pkg syscall (freebsd-arm64), func Pread(int, []uint8, int64) (int, error)
+pkg syscall (freebsd-arm64), func Pwrite(int, []uint8, int64) (int, error)
+pkg syscall (freebsd-arm64), func RawSyscall(uintptr, uintptr, uintptr, uintptr) (uintptr, uintptr, Errno)
+pkg syscall (freebsd-arm64), func RawSyscall6(uintptr, uintptr, uintptr, uintptr, uintptr, uintptr, uintptr) (uintptr, uintptr, Errno)
+pkg syscall (freebsd-arm64), func Read(int, []uint8) (int, error)
+pkg syscall (freebsd-arm64), func ReadDirent(int, []uint8) (int, error)
+pkg syscall (freebsd-arm64), func Recvfrom(int, []uint8, int) (int, Sockaddr, error)
+pkg syscall (freebsd-arm64), func Recvmsg(int, []uint8, []uint8, int) (int, int, int, Sockaddr, error)
+pkg syscall (freebsd-arm64), func Revoke(string) error
+pkg syscall (freebsd-arm64), func RouteRIB //deprecated
+pkg syscall (freebsd-arm64), func RouteRIB(int, int) ([]uint8, error)
+pkg syscall (freebsd-arm64), func Seek(int, int64, int) (int64, error)
+pkg syscall (freebsd-arm64), func Select(int, *FdSet, *FdSet, *FdSet, *Timeval) error
+pkg syscall (freebsd-arm64), func Sendfile(int, int, *int64, int) (int, error)
+pkg syscall (freebsd-arm64), func Sendmsg(int, []uint8, []uint8, Sockaddr, int) error
+pkg syscall (freebsd-arm64), func SendmsgN(int, []uint8, []uint8, Sockaddr, int) (int, error)
+pkg syscall (freebsd-arm64), func Sendto(int, []uint8, int, Sockaddr) error
+pkg syscall (freebsd-arm64), func SetBpf //deprecated
+pkg syscall (freebsd-arm64), func SetBpf(int, []BpfInsn) error
+pkg syscall (freebsd-arm64), func SetBpfBuflen //deprecated
+pkg syscall (freebsd-arm64), func SetBpfBuflen(int, int) (int, error)
+pkg syscall (freebsd-arm64), func SetBpfDatalink //deprecated
+pkg syscall (freebsd-arm64), func SetBpfDatalink(int, int) (int, error)
+pkg syscall (freebsd-arm64), func SetBpfHeadercmpl //deprecated
+pkg syscall (freebsd-arm64), func SetBpfHeadercmpl(int, int) error
+pkg syscall (freebsd-arm64), func SetBpfImmediate //deprecated
+pkg syscall (freebsd-arm64), func SetBpfImmediate(int, int) error
+pkg syscall (freebsd-arm64), func SetBpfInterface //deprecated
+pkg syscall (freebsd-arm64), func SetBpfInterface(int, string) error
+pkg syscall (freebsd-arm64), func SetBpfPromisc //deprecated
+pkg syscall (freebsd-arm64), func SetBpfPromisc(int, int) error
+pkg syscall (freebsd-arm64), func SetBpfTimeout //deprecated
+pkg syscall (freebsd-arm64), func SetBpfTimeout(int, *Timeval) error
+pkg syscall (freebsd-arm64), func Setegid(int) error
+pkg syscall (freebsd-arm64), func Seteuid(int) error
+pkg syscall (freebsd-arm64), func Setgid(int) error
+pkg syscall (freebsd-arm64), func Setgroups([]int) error
+pkg syscall (freebsd-arm64), func SetKevent(*Kevent_t, int, int, int)
+pkg syscall (freebsd-arm64), func Setlogin(string) error
+pkg syscall (freebsd-arm64), func SetNonblock(int, bool) error
+pkg syscall (freebsd-arm64), func Setpgid(int, int) error
+pkg syscall (freebsd-arm64), func Setpriority(int, int, int) error
+pkg syscall (freebsd-arm64), func Setregid(int, int) error
+pkg syscall (freebsd-arm64), func Setreuid(int, int) error
+pkg syscall (freebsd-arm64), func Setrlimit(int, *Rlimit) error
+pkg syscall (freebsd-arm64), func Setsid() (int, error)
+pkg syscall (freebsd-arm64), func SetsockoptByte(int, int, int, uint8) error
+pkg syscall (freebsd-arm64), func SetsockoptICMPv6Filter(int, int, int, *ICMPv6Filter) error
+pkg syscall (freebsd-arm64), func SetsockoptInet4Addr(int, int, int, [4]uint8) error
+pkg syscall (freebsd-arm64), func SetsockoptInt(int, int, int, int) error
+pkg syscall (freebsd-arm64), func SetsockoptIPMreq(int, int, int, *IPMreq) error
+pkg syscall (freebsd-arm64), func SetsockoptIPMreqn(int, int, int, *IPMreqn) error
+pkg syscall (freebsd-arm64), func SetsockoptIPv6Mreq(int, int, int, *IPv6Mreq) error
+pkg syscall (freebsd-arm64), func SetsockoptLinger(int, int, int, *Linger) error
+pkg syscall (freebsd-arm64), func SetsockoptString(int, int, int, string) error
+pkg syscall (freebsd-arm64), func SetsockoptTimeval(int, int, int, *Timeval) error
+pkg syscall (freebsd-arm64), func Settimeofday(*Timeval) error
+pkg syscall (freebsd-arm64), func Setuid(int) error
+pkg syscall (freebsd-arm64), func Shutdown(int, int) error
+pkg syscall (freebsd-arm64), func SlicePtrFromStrings([]string) ([]*uint8, error)
+pkg syscall (freebsd-arm64), func Socket(int, int, int) (int, error)
+pkg syscall (freebsd-arm64), func Socketpair(int, int, int) ([2]int, error)
+pkg syscall (freebsd-arm64), func Stat(string, *Stat_t) error
+pkg syscall (freebsd-arm64), func Statfs(string, *Statfs_t) error
+pkg syscall (freebsd-arm64), func StringSlicePtr //deprecated
+pkg syscall (freebsd-arm64), func StringSlicePtr([]string) []*uint8
+pkg syscall (freebsd-arm64), func Sync() error
+pkg syscall (freebsd-arm64), func Syscall(uintptr, uintptr, uintptr, uintptr) (uintptr, uintptr, Errno)
+pkg syscall (freebsd-arm64), func Syscall6(uintptr, uintptr, uintptr, uintptr, uintptr, uintptr, uintptr) (uintptr, uintptr, Errno)
+pkg syscall (freebsd-arm64), func Syscall9(uintptr, uintptr, uintptr, uintptr, uintptr, uintptr, uintptr, uintptr, uintptr, uintptr) (uintptr, uintptr, Errno)
+pkg syscall (freebsd-arm64), func Sysctl(string) (string, error)
+pkg syscall (freebsd-arm64), func SysctlUint32(string) (uint32, error)
+pkg syscall (freebsd-arm64), func TimevalToNsec(Timeval) int64
+pkg syscall (freebsd-arm64), func Truncate(string, int64) error
+pkg syscall (freebsd-arm64), func Umask(int) int
+pkg syscall (freebsd-arm64), func Undelete(string) error
+pkg syscall (freebsd-arm64), func UnixRights(...int) []uint8
+pkg syscall (freebsd-arm64), func Unmount(string, int) error
+pkg syscall (freebsd-arm64), func Wait4(int, *WaitStatus, int, *Rusage) (int, error)
+pkg syscall (freebsd-arm64), func Write(int, []uint8) (int, error)
+pkg syscall (freebsd-arm64), method (*Cmsghdr) SetLen(int)
+pkg syscall (freebsd-arm64), method (*Iovec) SetLen(int)
+pkg syscall (freebsd-arm64), method (*Msghdr) SetControllen(int)
+pkg syscall (freebsd-arm64), type BpfHdr struct
+pkg syscall (freebsd-arm64), type BpfHdr struct, Caplen uint32
+pkg syscall (freebsd-arm64), type BpfHdr struct, Datalen uint32
+pkg syscall (freebsd-arm64), type BpfHdr struct, Hdrlen uint16
+pkg syscall (freebsd-arm64), type BpfHdr struct, Pad_cgo_0 [6]uint8
+pkg syscall (freebsd-arm64), type BpfHdr struct, Tstamp Timeval
+pkg syscall (freebsd-arm64), type BpfInsn struct
+pkg syscall (freebsd-arm64), type BpfInsn struct, Code uint16
+pkg syscall (freebsd-arm64), type BpfInsn struct, Jf uint8
+pkg syscall (freebsd-arm64), type BpfInsn struct, Jt uint8
+pkg syscall (freebsd-arm64), type BpfInsn struct, K uint32
+pkg syscall (freebsd-arm64), type BpfProgram struct
+pkg syscall (freebsd-arm64), type BpfProgram struct, Insns *BpfInsn
+pkg syscall (freebsd-arm64), type BpfProgram struct, Len uint32
+pkg syscall (freebsd-arm64), type BpfProgram struct, Pad_cgo_0 [4]uint8
+pkg syscall (freebsd-arm64), type BpfStat struct
+pkg syscall (freebsd-arm64), type BpfStat struct, Drop uint32
+pkg syscall (freebsd-arm64), type BpfStat struct, Recv uint32
+pkg syscall (freebsd-arm64), type BpfVersion struct
+pkg syscall (freebsd-arm64), type BpfVersion struct, Major uint16
+pkg syscall (freebsd-arm64), type BpfVersion struct, Minor uint16
+pkg syscall (freebsd-arm64), type BpfZbuf struct
+pkg syscall (freebsd-arm64), type BpfZbuf struct, Bufa *uint8
+pkg syscall (freebsd-arm64), type BpfZbuf struct, Bufb *uint8
+pkg syscall (freebsd-arm64), type BpfZbuf struct, Buflen uint64
+pkg syscall (freebsd-arm64), type BpfZbufHeader struct
+pkg syscall (freebsd-arm64), type BpfZbufHeader struct, Kernel_gen uint32
+pkg syscall (freebsd-arm64), type BpfZbufHeader struct, Kernel_len uint32
+pkg syscall (freebsd-arm64), type BpfZbufHeader struct, User_gen uint32
+pkg syscall (freebsd-arm64), type BpfZbufHeader struct, X_bzh_pad [5]uint32
+pkg syscall (freebsd-arm64), type Cmsghdr struct
+pkg syscall (freebsd-arm64), type Cmsghdr struct, Len uint32
+pkg syscall (freebsd-arm64), type Cmsghdr struct, Level int32
+pkg syscall (freebsd-arm64), type Cmsghdr struct, Type int32
+pkg syscall (freebsd-arm64), type Credential struct
+pkg syscall (freebsd-arm64), type Credential struct, Gid uint32
+pkg syscall (freebsd-arm64), type Credential struct, Groups []uint32
+pkg syscall (freebsd-arm64), type Credential struct, NoSetGroups bool
+pkg syscall (freebsd-arm64), type Credential struct, Uid uint32
+pkg syscall (freebsd-arm64), type Dirent struct
+pkg syscall (freebsd-arm64), type Dirent struct, Fileno uint64
+pkg syscall (freebsd-arm64), type Dirent struct, Name [256]int8
+pkg syscall (freebsd-arm64), type Dirent struct, Namlen uint16
+pkg syscall (freebsd-arm64), type Dirent struct, Off int64
+pkg syscall (freebsd-arm64), type Dirent struct, Pad0 uint8
+pkg syscall (freebsd-arm64), type Dirent struct, Pad1 uint16
+pkg syscall (freebsd-arm64), type Dirent struct, Reclen uint16
+pkg syscall (freebsd-arm64), type Dirent struct, Type uint8
+pkg syscall (freebsd-arm64), type FdSet struct
+pkg syscall (freebsd-arm64), type FdSet struct, X__fds_bits [16]uint64
+pkg syscall (freebsd-arm64), type Flock_t struct
+pkg syscall (freebsd-arm64), type Flock_t struct, Len int64
+pkg syscall (freebsd-arm64), type Flock_t struct, Pad_cgo_0 [4]uint8
+pkg syscall (freebsd-arm64), type Flock_t struct, Pid int32
+pkg syscall (freebsd-arm64), type Flock_t struct, Start int64
+pkg syscall (freebsd-arm64), type Flock_t struct, Sysid int32
+pkg syscall (freebsd-arm64), type Flock_t struct, Type int16
+pkg syscall (freebsd-arm64), type Flock_t struct, Whence int16
+pkg syscall (freebsd-arm64), type Fsid struct
+pkg syscall (freebsd-arm64), type Fsid struct, Val [2]int32
+pkg syscall (freebsd-arm64), type ICMPv6Filter struct
+pkg syscall (freebsd-arm64), type ICMPv6Filter struct, Filt [8]uint32
+pkg syscall (freebsd-arm64), type IfaMsghdr struct
+pkg syscall (freebsd-arm64), type IfaMsghdr struct, Addrs int32
+pkg syscall (freebsd-arm64), type IfaMsghdr struct, Flags int32
+pkg syscall (freebsd-arm64), type IfaMsghdr struct, Index uint16
+pkg syscall (freebsd-arm64), type IfaMsghdr struct, Metric int32
+pkg syscall (freebsd-arm64), type IfaMsghdr struct, Msglen uint16
+pkg syscall (freebsd-arm64), type IfaMsghdr struct, Pad_cgo_0 [2]uint8
+pkg syscall (freebsd-arm64), type IfaMsghdr struct, Type uint8
+pkg syscall (freebsd-arm64), type IfaMsghdr struct, Version uint8
+pkg syscall (freebsd-arm64), type IfAnnounceMsghdr struct
+pkg syscall (freebsd-arm64), type IfAnnounceMsghdr struct, Index uint16
+pkg syscall (freebsd-arm64), type IfAnnounceMsghdr struct, Msglen uint16
+pkg syscall (freebsd-arm64), type IfAnnounceMsghdr struct, Name [16]int8
+pkg syscall (freebsd-arm64), type IfAnnounceMsghdr struct, Type uint8
+pkg syscall (freebsd-arm64), type IfAnnounceMsghdr struct, Version uint8
+pkg syscall (freebsd-arm64), type IfAnnounceMsghdr struct, What uint16
+pkg syscall (freebsd-arm64), type IfData struct
+pkg syscall (freebsd-arm64), type IfData struct, Addrlen uint8
+pkg syscall (freebsd-arm64), type IfData struct, Baudrate uint64
+pkg syscall (freebsd-arm64), type IfData struct, Collisions uint64
+pkg syscall (freebsd-arm64), type IfData struct, Datalen uint8
+pkg syscall (freebsd-arm64), type IfData struct, Epoch int64
+pkg syscall (freebsd-arm64), type IfData struct, Hdrlen uint8
+pkg syscall (freebsd-arm64), type IfData struct, Hwassist uint64
+pkg syscall (freebsd-arm64), type IfData struct, Ibytes uint64
+pkg syscall (freebsd-arm64), type IfData struct, Ierrors uint64
+pkg syscall (freebsd-arm64), type IfData struct, Imcasts uint64
+pkg syscall (freebsd-arm64), type IfData struct, Ipackets uint64
+pkg syscall (freebsd-arm64), type IfData struct, Iqdrops uint64
+pkg syscall (freebsd-arm64), type IfData struct, Lastchange Timeval
+pkg syscall (freebsd-arm64), type IfData struct, Link_state uint8
+pkg syscall (freebsd-arm64), type IfData struct, Metric uint64
+pkg syscall (freebsd-arm64), type IfData struct, Mtu uint64
+pkg syscall (freebsd-arm64), type IfData struct, Noproto uint64
+pkg syscall (freebsd-arm64), type IfData struct, Obytes uint64
+pkg syscall (freebsd-arm64), type IfData struct, Oerrors uint64
+pkg syscall (freebsd-arm64), type IfData struct, Omcasts uint64
+pkg syscall (freebsd-arm64), type IfData struct, Opackets uint64
+pkg syscall (freebsd-arm64), type IfData struct, Physical uint8
+pkg syscall (freebsd-arm64), type IfData struct, Spare_char1 uint8
+pkg syscall (freebsd-arm64), type IfData struct, Spare_char2 uint8
+pkg syscall (freebsd-arm64), type IfData struct, Type uint8
+pkg syscall (freebsd-arm64), type IfmaMsghdr struct
+pkg syscall (freebsd-arm64), type IfmaMsghdr struct, Addrs int32
+pkg syscall (freebsd-arm64), type IfmaMsghdr struct, Flags int32
+pkg syscall (freebsd-arm64), type IfmaMsghdr struct, Index uint16
+pkg syscall (freebsd-arm64), type IfmaMsghdr struct, Msglen uint16
+pkg syscall (freebsd-arm64), type IfmaMsghdr struct, Pad_cgo_0 [2]uint8
+pkg syscall (freebsd-arm64), type IfmaMsghdr struct, Type uint8
+pkg syscall (freebsd-arm64), type IfmaMsghdr struct, Version uint8
+pkg syscall (freebsd-arm64), type IfMsghdr struct
+pkg syscall (freebsd-arm64), type IfMsghdr struct, Addrs int32
+pkg syscall (freebsd-arm64), type IfMsghdr struct, Data IfData
+pkg syscall (freebsd-arm64), type IfMsghdr struct, Flags int32
+pkg syscall (freebsd-arm64), type IfMsghdr struct, Index uint16
+pkg syscall (freebsd-arm64), type IfMsghdr struct, Msglen uint16
+pkg syscall (freebsd-arm64), type IfMsghdr struct, Pad_cgo_0 [2]uint8
+pkg syscall (freebsd-arm64), type IfMsghdr struct, Type uint8
+pkg syscall (freebsd-arm64), type IfMsghdr struct, Version uint8
+pkg syscall (freebsd-arm64), type Inet6Pktinfo struct
+pkg syscall (freebsd-arm64), type Inet6Pktinfo struct, Addr [16]uint8
+pkg syscall (freebsd-arm64), type Inet6Pktinfo struct, Ifindex uint32
+pkg syscall (freebsd-arm64), type InterfaceAddrMessage //deprecated
+pkg syscall (freebsd-arm64), type InterfaceAddrMessage struct
+pkg syscall (freebsd-arm64), type InterfaceAddrMessage struct, Data []uint8
+pkg syscall (freebsd-arm64), type InterfaceAddrMessage struct, Header IfaMsghdr
+pkg syscall (freebsd-arm64), type InterfaceAnnounceMessage //deprecated
+pkg syscall (freebsd-arm64), type InterfaceAnnounceMessage struct
+pkg syscall (freebsd-arm64), type InterfaceAnnounceMessage struct, Header IfAnnounceMsghdr
+pkg syscall (freebsd-arm64), type InterfaceMessage //deprecated
+pkg syscall (freebsd-arm64), type InterfaceMessage struct
+pkg syscall (freebsd-arm64), type InterfaceMessage struct, Data []uint8
+pkg syscall (freebsd-arm64), type InterfaceMessage struct, Header IfMsghdr
+pkg syscall (freebsd-arm64), type InterfaceMulticastAddrMessage //deprecated
+pkg syscall (freebsd-arm64), type InterfaceMulticastAddrMessage struct
+pkg syscall (freebsd-arm64), type InterfaceMulticastAddrMessage struct, Data []uint8
+pkg syscall (freebsd-arm64), type InterfaceMulticastAddrMessage struct, Header IfmaMsghdr
+pkg syscall (freebsd-arm64), type Iovec struct
+pkg syscall (freebsd-arm64), type Iovec struct, Base *uint8
+pkg syscall (freebsd-arm64), type Iovec struct, Len uint64
+pkg syscall (freebsd-arm64), type IPMreqn struct
+pkg syscall (freebsd-arm64), type IPMreqn struct, Address [4]uint8
+pkg syscall (freebsd-arm64), type IPMreqn struct, Ifindex int32
+pkg syscall (freebsd-arm64), type IPMreqn struct, Multiaddr [4]uint8
+pkg syscall (freebsd-arm64), type IPv6MTUInfo struct
+pkg syscall (freebsd-arm64), type IPv6MTUInfo struct, Addr RawSockaddrInet6
+pkg syscall (freebsd-arm64), type IPv6MTUInfo struct, Mtu uint32
+pkg syscall (freebsd-arm64), type Kevent_t struct
+pkg syscall (freebsd-arm64), type Kevent_t struct, Data int64
+pkg syscall (freebsd-arm64), type Kevent_t struct, Fflags uint32
+pkg syscall (freebsd-arm64), type Kevent_t struct, Filter int16
+pkg syscall (freebsd-arm64), type Kevent_t struct, Flags uint16
+pkg syscall (freebsd-arm64), type Kevent_t struct, Ident uint64
+pkg syscall (freebsd-arm64), type Kevent_t struct, Udata *uint8
+pkg syscall (freebsd-arm64), type Msghdr struct
+pkg syscall (freebsd-arm64), type Msghdr struct, Control *uint8
+pkg syscall (freebsd-arm64), type Msghdr struct, Controllen uint32
+pkg syscall (freebsd-arm64), type Msghdr struct, Flags int32
+pkg syscall (freebsd-arm64), type Msghdr struct, Iov *Iovec
+pkg syscall (freebsd-arm64), type Msghdr struct, Iovlen int32
+pkg syscall (freebsd-arm64), type Msghdr struct, Name *uint8
+pkg syscall (freebsd-arm64), type Msghdr struct, Namelen uint32
+pkg syscall (freebsd-arm64), type Msghdr struct, Pad_cgo_0 [4]uint8
+pkg syscall (freebsd-arm64), type Msghdr struct, Pad_cgo_1 [4]uint8
+pkg syscall (freebsd-arm64), type RawSockaddr struct, Data [14]int8
+pkg syscall (freebsd-arm64), type RawSockaddr struct, Family uint8
+pkg syscall (freebsd-arm64), type RawSockaddr struct, Len uint8
+pkg syscall (freebsd-arm64), type RawSockaddrAny struct, Pad [92]int8
+pkg syscall (freebsd-arm64), type RawSockaddrDatalink struct
+pkg syscall (freebsd-arm64), type RawSockaddrDatalink struct, Alen uint8
+pkg syscall (freebsd-arm64), type RawSockaddrDatalink struct, Data [46]int8
+pkg syscall (freebsd-arm64), type RawSockaddrDatalink struct, Family uint8
+pkg syscall (freebsd-arm64), type RawSockaddrDatalink struct, Index uint16
+pkg syscall (freebsd-arm64), type RawSockaddrDatalink struct, Len uint8
+pkg syscall (freebsd-arm64), type RawSockaddrDatalink struct, Nlen uint8
+pkg syscall (freebsd-arm64), type RawSockaddrDatalink struct, Slen uint8
+pkg syscall (freebsd-arm64), type RawSockaddrDatalink struct, Type uint8
+pkg syscall (freebsd-arm64), type RawSockaddrInet4 struct, Family uint8
+pkg syscall (freebsd-arm64), type RawSockaddrInet4 struct, Len uint8
+pkg syscall (freebsd-arm64), type RawSockaddrInet4 struct, Zero [8]int8
+pkg syscall (freebsd-arm64), type RawSockaddrInet6 struct, Family uint8
+pkg syscall (freebsd-arm64), type RawSockaddrInet6 struct, Len uint8
+pkg syscall (freebsd-arm64), type RawSockaddrUnix struct, Family uint8
+pkg syscall (freebsd-arm64), type RawSockaddrUnix struct, Len uint8
+pkg syscall (freebsd-arm64), type RawSockaddrUnix struct, Path [104]int8
+pkg syscall (freebsd-arm64), type Rlimit struct
+pkg syscall (freebsd-arm64), type Rlimit struct, Cur int64
+pkg syscall (freebsd-arm64), type Rlimit struct, Max int64
+pkg syscall (freebsd-arm64), type RouteMessage //deprecated
+pkg syscall (freebsd-arm64), type RouteMessage struct
+pkg syscall (freebsd-arm64), type RouteMessage struct, Data []uint8
+pkg syscall (freebsd-arm64), type RouteMessage struct, Header RtMsghdr
+pkg syscall (freebsd-arm64), type RoutingMessage //deprecated
+pkg syscall (freebsd-arm64), type RoutingMessage interface, unexported methods
+pkg syscall (freebsd-arm64), type RtMetrics struct
+pkg syscall (freebsd-arm64), type RtMetrics struct, Expire uint64
+pkg syscall (freebsd-arm64), type RtMetrics struct, Filler [3]uint64
+pkg syscall (freebsd-arm64), type RtMetrics struct, Hopcount uint64
+pkg syscall (freebsd-arm64), type RtMetrics struct, Locks uint64
+pkg syscall (freebsd-arm64), type RtMetrics struct, Mtu uint64
+pkg syscall (freebsd-arm64), type RtMetrics struct, Pksent uint64
+pkg syscall (freebsd-arm64), type RtMetrics struct, Recvpipe uint64
+pkg syscall (freebsd-arm64), type RtMetrics struct, Rtt uint64
+pkg syscall (freebsd-arm64), type RtMetrics struct, Rttvar uint64
+pkg syscall (freebsd-arm64), type RtMetrics struct, Sendpipe uint64
+pkg syscall (freebsd-arm64), type RtMetrics struct, Ssthresh uint64
+pkg syscall (freebsd-arm64), type RtMetrics struct, Weight uint64
+pkg syscall (freebsd-arm64), type RtMsghdr struct
+pkg syscall (freebsd-arm64), type RtMsghdr struct, Addrs int32
+pkg syscall (freebsd-arm64), type RtMsghdr struct, Errno int32
+pkg syscall (freebsd-arm64), type RtMsghdr struct, Flags int32
+pkg syscall (freebsd-arm64), type RtMsghdr struct, Fmask int32
+pkg syscall (freebsd-arm64), type RtMsghdr struct, Index uint16
+pkg syscall (freebsd-arm64), type RtMsghdr struct, Inits uint64
+pkg syscall (freebsd-arm64), type RtMsghdr struct, Msglen uint16
+pkg syscall (freebsd-arm64), type RtMsghdr struct, Pad_cgo_0 [2]uint8
+pkg syscall (freebsd-arm64), type RtMsghdr struct, Pid int32
+pkg syscall (freebsd-arm64), type RtMsghdr struct, Rmx RtMetrics
+pkg syscall (freebsd-arm64), type RtMsghdr struct, Seq int32
+pkg syscall (freebsd-arm64), type RtMsghdr struct, Type uint8
+pkg syscall (freebsd-arm64), type RtMsghdr struct, Version uint8
+pkg syscall (freebsd-arm64), type Rusage struct, Idrss int64
+pkg syscall (freebsd-arm64), type Rusage struct, Inblock int64
+pkg syscall (freebsd-arm64), type Rusage struct, Isrss int64
+pkg syscall (freebsd-arm64), type Rusage struct, Ixrss int64
+pkg syscall (freebsd-arm64), type Rusage struct, Majflt int64
+pkg syscall (freebsd-arm64), type Rusage struct, Maxrss int64
+pkg syscall (freebsd-arm64), type Rusage struct, Minflt int64
+pkg syscall (freebsd-arm64), type Rusage struct, Msgrcv int64
+pkg syscall (freebsd-arm64), type Rusage struct, Msgsnd int64
+pkg syscall (freebsd-arm64), type Rusage struct, Nivcsw int64
+pkg syscall (freebsd-arm64), type Rusage struct, Nsignals int64
+pkg syscall (freebsd-arm64), type Rusage struct, Nswap int64
+pkg syscall (freebsd-arm64), type Rusage struct, Nvcsw int64
+pkg syscall (freebsd-arm64), type Rusage struct, Oublock int64
+pkg syscall (freebsd-arm64), type Rusage struct, Stime Timeval
+pkg syscall (freebsd-arm64), type Rusage struct, Utime Timeval
+pkg syscall (freebsd-arm64), type SockaddrDatalink struct
+pkg syscall (freebsd-arm64), type SockaddrDatalink struct, Alen uint8
+pkg syscall (freebsd-arm64), type SockaddrDatalink struct, Data [46]int8
+pkg syscall (freebsd-arm64), type SockaddrDatalink struct, Family uint8
+pkg syscall (freebsd-arm64), type SockaddrDatalink struct, Index uint16
+pkg syscall (freebsd-arm64), type SockaddrDatalink struct, Len uint8
+pkg syscall (freebsd-arm64), type SockaddrDatalink struct, Nlen uint8
+pkg syscall (freebsd-arm64), type SockaddrDatalink struct, Slen uint8
+pkg syscall (freebsd-arm64), type SockaddrDatalink struct, Type uint8
+pkg syscall (freebsd-arm64), type SocketControlMessage struct
+pkg syscall (freebsd-arm64), type SocketControlMessage struct, Data []uint8
+pkg syscall (freebsd-arm64), type SocketControlMessage struct, Header Cmsghdr
+pkg syscall (freebsd-arm64), type Stat_t struct
+pkg syscall (freebsd-arm64), type Stat_t struct, Atimespec Timespec
+pkg syscall (freebsd-arm64), type Stat_t struct, Birthtimespec Timespec
+pkg syscall (freebsd-arm64), type Stat_t struct, Blksize int32
+pkg syscall (freebsd-arm64), type Stat_t struct, Blocks int64
+pkg syscall (freebsd-arm64), type Stat_t struct, Ctimespec Timespec
+pkg syscall (freebsd-arm64), type Stat_t struct, Dev uint64
+pkg syscall (freebsd-arm64), type Stat_t struct, Flags uint32
+pkg syscall (freebsd-arm64), type Stat_t struct, Gen uint64
+pkg syscall (freebsd-arm64), type Stat_t struct, Gid uint32
+pkg syscall (freebsd-arm64), type Stat_t struct, Ino uint64
+pkg syscall (freebsd-arm64), type Stat_t struct, Mode uint16
+pkg syscall (freebsd-arm64), type Stat_t struct, Mtimespec Timespec
+pkg syscall (freebsd-arm64), type Stat_t struct, Nlink uint64
+pkg syscall (freebsd-arm64), type Stat_t struct, Padding0 int16
+pkg syscall (freebsd-arm64), type Stat_t struct, Padding1 int32
+pkg syscall (freebsd-arm64), type Stat_t struct, Rdev uint64
+pkg syscall (freebsd-arm64), type Stat_t struct, Size int64
+pkg syscall (freebsd-arm64), type Stat_t struct, Spare [10]uint64
+pkg syscall (freebsd-arm64), type Stat_t struct, Uid uint32
+pkg syscall (freebsd-arm64), type Statfs_t struct
+pkg syscall (freebsd-arm64), type Statfs_t struct, Asyncreads uint64
+pkg syscall (freebsd-arm64), type Statfs_t struct, Asyncwrites uint64
+pkg syscall (freebsd-arm64), type Statfs_t struct, Bavail int64
+pkg syscall (freebsd-arm64), type Statfs_t struct, Bfree uint64
+pkg syscall (freebsd-arm64), type Statfs_t struct, Blocks uint64
+pkg syscall (freebsd-arm64), type Statfs_t struct, Bsize uint64
+pkg syscall (freebsd-arm64), type Statfs_t struct, Charspare [80]int8
+pkg syscall (freebsd-arm64), type Statfs_t struct, Ffree int64
+pkg syscall (freebsd-arm64), type Statfs_t struct, Files uint64
+pkg syscall (freebsd-arm64), type Statfs_t struct, Flags uint64
+pkg syscall (freebsd-arm64), type Statfs_t struct, Fsid Fsid
+pkg syscall (freebsd-arm64), type Statfs_t struct, Fstypename [16]int8
+pkg syscall (freebsd-arm64), type Statfs_t struct, Iosize uint64
+pkg syscall (freebsd-arm64), type Statfs_t struct, Mntfromname [1024]int8
+pkg syscall (freebsd-arm64), type Statfs_t struct, Mntonname [1024]int8
+pkg syscall (freebsd-arm64), type Statfs_t struct, Namemax uint32
+pkg syscall (freebsd-arm64), type Statfs_t struct, Owner uint32
+pkg syscall (freebsd-arm64), type Statfs_t struct, Spare [10]uint64
+pkg syscall (freebsd-arm64), type Statfs_t struct, Syncreads uint64
+pkg syscall (freebsd-arm64), type Statfs_t struct, Syncwrites uint64
+pkg syscall (freebsd-arm64), type Statfs_t struct, Type uint32
+pkg syscall (freebsd-arm64), type Statfs_t struct, Version uint32
+pkg syscall (freebsd-arm64), type SysProcAttr struct, Chroot string
+pkg syscall (freebsd-arm64), type SysProcAttr struct, Credential *Credential
+pkg syscall (freebsd-arm64), type SysProcAttr struct, Ctty int
+pkg syscall (freebsd-arm64), type SysProcAttr struct, Foreground bool
+pkg syscall (freebsd-arm64), type SysProcAttr struct, Noctty bool
+pkg syscall (freebsd-arm64), type SysProcAttr struct, Pgid int
+pkg syscall (freebsd-arm64), type SysProcAttr struct, Ptrace bool
+pkg syscall (freebsd-arm64), type SysProcAttr struct, Setctty bool
+pkg syscall (freebsd-arm64), type SysProcAttr struct, Setpgid bool
+pkg syscall (freebsd-arm64), type SysProcAttr struct, Setsid bool
+pkg syscall (freebsd-arm64), type Termios struct
+pkg syscall (freebsd-arm64), type Termios struct, Cc [20]uint8
+pkg syscall (freebsd-arm64), type Termios struct, Cflag uint32
+pkg syscall (freebsd-arm64), type Termios struct, Iflag uint32
+pkg syscall (freebsd-arm64), type Termios struct, Ispeed uint32
+pkg syscall (freebsd-arm64), type Termios struct, Lflag uint32
+pkg syscall (freebsd-arm64), type Termios struct, Oflag uint32
+pkg syscall (freebsd-arm64), type Termios struct, Ospeed uint32
+pkg syscall (freebsd-arm64), type Timespec struct, Nsec int64
+pkg syscall (freebsd-arm64), type Timespec struct, Sec int64
+pkg syscall (freebsd-arm64), type Timeval struct, Sec int64
+pkg syscall (freebsd-arm64), type Timeval struct, Usec int64
+pkg syscall (freebsd-arm64), type WaitStatus uint32
+pkg syscall (freebsd-arm64), var Stderr int
+pkg syscall (freebsd-arm64), var Stdin int
+pkg syscall (freebsd-arm64), var Stdout int
+pkg syscall (freebsd-arm64-cgo), const AF_APPLETALK = 16
+pkg syscall (freebsd-arm64-cgo), const AF_APPLETALK ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_ARP = 35
+pkg syscall (freebsd-arm64-cgo), const AF_ARP ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_ATM = 30
+pkg syscall (freebsd-arm64-cgo), const AF_ATM ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_BLUETOOTH = 36
+pkg syscall (freebsd-arm64-cgo), const AF_BLUETOOTH ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_CCITT = 10
+pkg syscall (freebsd-arm64-cgo), const AF_CCITT ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_CHAOS = 5
+pkg syscall (freebsd-arm64-cgo), const AF_CHAOS ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_CNT = 21
+pkg syscall (freebsd-arm64-cgo), const AF_CNT ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_COIP = 20
+pkg syscall (freebsd-arm64-cgo), const AF_COIP ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_DATAKIT = 9
+pkg syscall (freebsd-arm64-cgo), const AF_DATAKIT ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_DECnet = 12
+pkg syscall (freebsd-arm64-cgo), const AF_DECnet ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_DLI = 13
+pkg syscall (freebsd-arm64-cgo), const AF_DLI ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_E164 = 26
+pkg syscall (freebsd-arm64-cgo), const AF_E164 ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_ECMA = 8
+pkg syscall (freebsd-arm64-cgo), const AF_ECMA ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_HYLINK = 15
+pkg syscall (freebsd-arm64-cgo), const AF_HYLINK ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_IEEE80211 = 37
+pkg syscall (freebsd-arm64-cgo), const AF_IEEE80211 ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_IMPLINK = 3
+pkg syscall (freebsd-arm64-cgo), const AF_IMPLINK ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_INET_SDP = 40
+pkg syscall (freebsd-arm64-cgo), const AF_INET_SDP ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_INET6 = 28
+pkg syscall (freebsd-arm64-cgo), const AF_INET6_SDP = 42
+pkg syscall (freebsd-arm64-cgo), const AF_INET6_SDP ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_IPX = 23
+pkg syscall (freebsd-arm64-cgo), const AF_IPX ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_ISDN = 26
+pkg syscall (freebsd-arm64-cgo), const AF_ISDN ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_ISO = 7
+pkg syscall (freebsd-arm64-cgo), const AF_ISO ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_LAT = 14
+pkg syscall (freebsd-arm64-cgo), const AF_LAT ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_LINK = 18
+pkg syscall (freebsd-arm64-cgo), const AF_LINK ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_LOCAL = 1
+pkg syscall (freebsd-arm64-cgo), const AF_LOCAL ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_MAX = 42
+pkg syscall (freebsd-arm64-cgo), const AF_MAX ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_NATM = 29
+pkg syscall (freebsd-arm64-cgo), const AF_NATM ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_NETBIOS = 6
+pkg syscall (freebsd-arm64-cgo), const AF_NETBIOS ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_NETGRAPH = 32
+pkg syscall (freebsd-arm64-cgo), const AF_NETGRAPH ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_OSI = 7
+pkg syscall (freebsd-arm64-cgo), const AF_OSI ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_PUP = 4
+pkg syscall (freebsd-arm64-cgo), const AF_PUP ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_ROUTE = 17
+pkg syscall (freebsd-arm64-cgo), const AF_ROUTE ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_SCLUSTER = 34
+pkg syscall (freebsd-arm64-cgo), const AF_SCLUSTER ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_SIP = 24
+pkg syscall (freebsd-arm64-cgo), const AF_SIP ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_SLOW = 33
+pkg syscall (freebsd-arm64-cgo), const AF_SLOW ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_SNA = 11
+pkg syscall (freebsd-arm64-cgo), const AF_SNA ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR00 = 39
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR00 ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR01 = 41
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR01 ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR02 = 43
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR02 ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR03 = 45
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR03 ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR04 = 47
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR04 ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR05 = 49
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR05 ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR06 = 51
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR06 ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR07 = 53
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR07 ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR08 = 55
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR08 ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR09 = 57
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR09 ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR10 = 59
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR10 ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR11 = 61
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR11 ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR12 = 63
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR12 ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR13 = 65
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR13 ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR14 = 67
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR14 ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR15 = 69
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR15 ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR16 = 71
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR16 ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR17 = 73
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR17 ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR18 = 75
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR18 ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR19 = 77
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR19 ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR20 = 79
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR20 ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR21 = 81
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR21 ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR22 = 83
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR22 ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR23 = 85
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR23 ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR24 = 87
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR24 ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR25 = 89
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR25 ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR26 = 91
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR26 ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR27 = 93
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR27 ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR28 = 95
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR28 ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR29 = 97
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR29 ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR30 = 99
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR30 ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR31 = 101
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR31 ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR32 = 103
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR32 ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR33 = 105
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR33 ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR34 = 107
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR34 ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR35 = 109
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR35 ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR36 = 111
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR36 ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR37 = 113
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR37 ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR38 = 115
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR38 ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR39 = 117
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR39 ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR40 = 119
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR40 ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR41 = 121
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR41 ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR42 = 123
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR42 ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR43 = 125
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR43 ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR44 = 127
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR44 ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR45 = 129
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR45 ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR46 = 131
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR46 ideal-int
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR47 = 133
+pkg syscall (freebsd-arm64-cgo), const AF_VENDOR47 ideal-int
+pkg syscall (freebsd-arm64-cgo), const B0 = 0
+pkg syscall (freebsd-arm64-cgo), const B0 ideal-int
+pkg syscall (freebsd-arm64-cgo), const B110 = 110
+pkg syscall (freebsd-arm64-cgo), const B110 ideal-int
+pkg syscall (freebsd-arm64-cgo), const B115200 = 115200
+pkg syscall (freebsd-arm64-cgo), const B115200 ideal-int
+pkg syscall (freebsd-arm64-cgo), const B1200 = 1200
+pkg syscall (freebsd-arm64-cgo), const B1200 ideal-int
+pkg syscall (freebsd-arm64-cgo), const B134 = 134
+pkg syscall (freebsd-arm64-cgo), const B134 ideal-int
+pkg syscall (freebsd-arm64-cgo), const B14400 = 14400
+pkg syscall (freebsd-arm64-cgo), const B14400 ideal-int
+pkg syscall (freebsd-arm64-cgo), const B150 = 150
+pkg syscall (freebsd-arm64-cgo), const B150 ideal-int
+pkg syscall (freebsd-arm64-cgo), const B1800 = 1800
+pkg syscall (freebsd-arm64-cgo), const B1800 ideal-int
+pkg syscall (freebsd-arm64-cgo), const B19200 = 19200
+pkg syscall (freebsd-arm64-cgo), const B19200 ideal-int
+pkg syscall (freebsd-arm64-cgo), const B200 = 200
+pkg syscall (freebsd-arm64-cgo), const B200 ideal-int
+pkg syscall (freebsd-arm64-cgo), const B230400 = 230400
+pkg syscall (freebsd-arm64-cgo), const B230400 ideal-int
+pkg syscall (freebsd-arm64-cgo), const B2400 = 2400
+pkg syscall (freebsd-arm64-cgo), const B2400 ideal-int
+pkg syscall (freebsd-arm64-cgo), const B28800 = 28800
+pkg syscall (freebsd-arm64-cgo), const B28800 ideal-int
+pkg syscall (freebsd-arm64-cgo), const B300 = 300
+pkg syscall (freebsd-arm64-cgo), const B300 ideal-int
+pkg syscall (freebsd-arm64-cgo), const B38400 = 38400
+pkg syscall (freebsd-arm64-cgo), const B38400 ideal-int
+pkg syscall (freebsd-arm64-cgo), const B460800 = 460800
+pkg syscall (freebsd-arm64-cgo), const B460800 ideal-int
+pkg syscall (freebsd-arm64-cgo), const B4800 = 4800
+pkg syscall (freebsd-arm64-cgo), const B4800 ideal-int
+pkg syscall (freebsd-arm64-cgo), const B50 = 50
+pkg syscall (freebsd-arm64-cgo), const B50 ideal-int
+pkg syscall (freebsd-arm64-cgo), const B57600 = 57600
+pkg syscall (freebsd-arm64-cgo), const B57600 ideal-int
+pkg syscall (freebsd-arm64-cgo), const B600 = 600
+pkg syscall (freebsd-arm64-cgo), const B600 ideal-int
+pkg syscall (freebsd-arm64-cgo), const B7200 = 7200
+pkg syscall (freebsd-arm64-cgo), const B7200 ideal-int
+pkg syscall (freebsd-arm64-cgo), const B75 = 75
+pkg syscall (freebsd-arm64-cgo), const B75 ideal-int
+pkg syscall (freebsd-arm64-cgo), const B76800 = 76800
+pkg syscall (freebsd-arm64-cgo), const B76800 ideal-int
+pkg syscall (freebsd-arm64-cgo), const B921600 = 921600
+pkg syscall (freebsd-arm64-cgo), const B921600 ideal-int
+pkg syscall (freebsd-arm64-cgo), const B9600 = 9600
+pkg syscall (freebsd-arm64-cgo), const B9600 ideal-int
+pkg syscall (freebsd-arm64-cgo), const BIOCFEEDBACK = 2147762812
+pkg syscall (freebsd-arm64-cgo), const BIOCFEEDBACK ideal-int
+pkg syscall (freebsd-arm64-cgo), const BIOCFLUSH = 536887912
+pkg syscall (freebsd-arm64-cgo), const BIOCFLUSH ideal-int
+pkg syscall (freebsd-arm64-cgo), const BIOCGBLEN = 1074020966
+pkg syscall (freebsd-arm64-cgo), const BIOCGBLEN ideal-int
+pkg syscall (freebsd-arm64-cgo), const BIOCGDIRECTION = 1074020982
+pkg syscall (freebsd-arm64-cgo), const BIOCGDIRECTION ideal-int
+pkg syscall (freebsd-arm64-cgo), const BIOCGDLT = 1074020970
+pkg syscall (freebsd-arm64-cgo), const BIOCGDLT ideal-int
+pkg syscall (freebsd-arm64-cgo), const BIOCGDLTLIST = 3222291065
+pkg syscall (freebsd-arm64-cgo), const BIOCGDLTLIST ideal-int
+pkg syscall (freebsd-arm64-cgo), const BIOCGETBUFMODE = 1074020989
+pkg syscall (freebsd-arm64-cgo), const BIOCGETBUFMODE ideal-int
+pkg syscall (freebsd-arm64-cgo), const BIOCGETIF = 1075855979
+pkg syscall (freebsd-arm64-cgo), const BIOCGETIF ideal-int
+pkg syscall (freebsd-arm64-cgo), const BIOCGETZMAX = 1074283135
+pkg syscall (freebsd-arm64-cgo), const BIOCGETZMAX ideal-int
+pkg syscall (freebsd-arm64-cgo), const BIOCGHDRCMPLT = 1074020980
+pkg syscall (freebsd-arm64-cgo), const BIOCGHDRCMPLT ideal-int
+pkg syscall (freebsd-arm64-cgo), const BIOCGRSIG = 1074020978
+pkg syscall (freebsd-arm64-cgo), const BIOCGRSIG ideal-int
+pkg syscall (freebsd-arm64-cgo), const BIOCGRTIMEOUT = 1074807406
+pkg syscall (freebsd-arm64-cgo), const BIOCGRTIMEOUT ideal-int
+pkg syscall (freebsd-arm64-cgo), const BIOCGSEESENT = 1074020982
+pkg syscall (freebsd-arm64-cgo), const BIOCGSEESENT ideal-int
+pkg syscall (freebsd-arm64-cgo), const BIOCGSTATS = 1074283119
+pkg syscall (freebsd-arm64-cgo), const BIOCGSTATS ideal-int
+pkg syscall (freebsd-arm64-cgo), const BIOCGTSTAMP = 1074020995
+pkg syscall (freebsd-arm64-cgo), const BIOCGTSTAMP ideal-int
+pkg syscall (freebsd-arm64-cgo), const BIOCIMMEDIATE = 2147762800
+pkg syscall (freebsd-arm64-cgo), const BIOCIMMEDIATE ideal-int
+pkg syscall (freebsd-arm64-cgo), const BIOCLOCK = 536887930
+pkg syscall (freebsd-arm64-cgo), const BIOCLOCK ideal-int
+pkg syscall (freebsd-arm64-cgo), const BIOCPROMISC = 536887913
+pkg syscall (freebsd-arm64-cgo), const BIOCPROMISC ideal-int
+pkg syscall (freebsd-arm64-cgo), const BIOCROTZBUF = 1075331712
+pkg syscall (freebsd-arm64-cgo), const BIOCROTZBUF ideal-int
+pkg syscall (freebsd-arm64-cgo), const BIOCSBLEN = 3221504614
+pkg syscall (freebsd-arm64-cgo), const BIOCSBLEN ideal-int
+pkg syscall (freebsd-arm64-cgo), const BIOCSDIRECTION = 2147762807
+pkg syscall (freebsd-arm64-cgo), const BIOCSDIRECTION ideal-int
+pkg syscall (freebsd-arm64-cgo), const BIOCSDLT = 2147762808
+pkg syscall (freebsd-arm64-cgo), const BIOCSDLT ideal-int
+pkg syscall (freebsd-arm64-cgo), const BIOCSETBUFMODE = 2147762814
+pkg syscall (freebsd-arm64-cgo), const BIOCSETBUFMODE ideal-int
+pkg syscall (freebsd-arm64-cgo), const BIOCSETF = 2148549223
+pkg syscall (freebsd-arm64-cgo), const BIOCSETF ideal-int
+pkg syscall (freebsd-arm64-cgo), const BIOCSETFNR = 2148549250
+pkg syscall (freebsd-arm64-cgo), const BIOCSETFNR ideal-int
+pkg syscall (freebsd-arm64-cgo), const BIOCSETIF = 2149597804
+pkg syscall (freebsd-arm64-cgo), const BIOCSETIF ideal-int
+pkg syscall (freebsd-arm64-cgo), const BIOCSETWF = 2148549243
+pkg syscall (freebsd-arm64-cgo), const BIOCSETWF ideal-int
+pkg syscall (freebsd-arm64-cgo), const BIOCSETZBUF = 2149073537
+pkg syscall (freebsd-arm64-cgo), const BIOCSETZBUF ideal-int
+pkg syscall (freebsd-arm64-cgo), const BIOCSHDRCMPLT = 2147762805
+pkg syscall (freebsd-arm64-cgo), const BIOCSHDRCMPLT ideal-int
+pkg syscall (freebsd-arm64-cgo), const BIOCSRSIG = 2147762803
+pkg syscall (freebsd-arm64-cgo), const BIOCSRSIG ideal-int
+pkg syscall (freebsd-arm64-cgo), const BIOCSRTIMEOUT = 2148549229
+pkg syscall (freebsd-arm64-cgo), const BIOCSRTIMEOUT ideal-int
+pkg syscall (freebsd-arm64-cgo), const BIOCSSEESENT = 2147762807
+pkg syscall (freebsd-arm64-cgo), const BIOCSSEESENT ideal-int
+pkg syscall (freebsd-arm64-cgo), const BIOCSTSTAMP = 2147762820
+pkg syscall (freebsd-arm64-cgo), const BIOCSTSTAMP ideal-int
+pkg syscall (freebsd-arm64-cgo), const BIOCVERSION = 1074020977
+pkg syscall (freebsd-arm64-cgo), const BIOCVERSION ideal-int
+pkg syscall (freebsd-arm64-cgo), const BPF_A = 16
+pkg syscall (freebsd-arm64-cgo), const BPF_A ideal-int
+pkg syscall (freebsd-arm64-cgo), const BPF_ABS = 32
+pkg syscall (freebsd-arm64-cgo), const BPF_ABS ideal-int
+pkg syscall (freebsd-arm64-cgo), const BPF_ADD = 0
+pkg syscall (freebsd-arm64-cgo), const BPF_ADD ideal-int
+pkg syscall (freebsd-arm64-cgo), const BPF_ALIGNMENT = 8
+pkg syscall (freebsd-arm64-cgo), const BPF_ALIGNMENT ideal-int
+pkg syscall (freebsd-arm64-cgo), const BPF_ALU = 4
+pkg syscall (freebsd-arm64-cgo), const BPF_ALU ideal-int
+pkg syscall (freebsd-arm64-cgo), const BPF_AND = 80
+pkg syscall (freebsd-arm64-cgo), const BPF_AND ideal-int
+pkg syscall (freebsd-arm64-cgo), const BPF_B = 16
+pkg syscall (freebsd-arm64-cgo), const BPF_B ideal-int
+pkg syscall (freebsd-arm64-cgo), const BPF_BUFMODE_BUFFER = 1
+pkg syscall (freebsd-arm64-cgo), const BPF_BUFMODE_BUFFER ideal-int
+pkg syscall (freebsd-arm64-cgo), const BPF_BUFMODE_ZBUF = 2
+pkg syscall (freebsd-arm64-cgo), const BPF_BUFMODE_ZBUF ideal-int
+pkg syscall (freebsd-arm64-cgo), const BPF_DIV = 48
+pkg syscall (freebsd-arm64-cgo), const BPF_DIV ideal-int
+pkg syscall (freebsd-arm64-cgo), const BPF_H = 8
+pkg syscall (freebsd-arm64-cgo), const BPF_H ideal-int
+pkg syscall (freebsd-arm64-cgo), const BPF_IMM = 0
+pkg syscall (freebsd-arm64-cgo), const BPF_IMM ideal-int
+pkg syscall (freebsd-arm64-cgo), const BPF_IND = 64
+pkg syscall (freebsd-arm64-cgo), const BPF_IND ideal-int
+pkg syscall (freebsd-arm64-cgo), const BPF_JA = 0
+pkg syscall (freebsd-arm64-cgo), const BPF_JA ideal-int
+pkg syscall (freebsd-arm64-cgo), const BPF_JEQ = 16
+pkg syscall (freebsd-arm64-cgo), const BPF_JEQ ideal-int
+pkg syscall (freebsd-arm64-cgo), const BPF_JGE = 48
+pkg syscall (freebsd-arm64-cgo), const BPF_JGE ideal-int
+pkg syscall (freebsd-arm64-cgo), const BPF_JGT = 32
+pkg syscall (freebsd-arm64-cgo), const BPF_JGT ideal-int
+pkg syscall (freebsd-arm64-cgo), const BPF_JMP = 5
+pkg syscall (freebsd-arm64-cgo), const BPF_JMP ideal-int
+pkg syscall (freebsd-arm64-cgo), const BPF_JSET = 64
+pkg syscall (freebsd-arm64-cgo), const BPF_JSET ideal-int
+pkg syscall (freebsd-arm64-cgo), const BPF_K = 0
+pkg syscall (freebsd-arm64-cgo), const BPF_K ideal-int
+pkg syscall (freebsd-arm64-cgo), const BPF_LD = 0
+pkg syscall (freebsd-arm64-cgo), const BPF_LD ideal-int
+pkg syscall (freebsd-arm64-cgo), const BPF_LDX = 1
+pkg syscall (freebsd-arm64-cgo), const BPF_LDX ideal-int
+pkg syscall (freebsd-arm64-cgo), const BPF_LEN = 128
+pkg syscall (freebsd-arm64-cgo), const BPF_LEN ideal-int
+pkg syscall (freebsd-arm64-cgo), const BPF_LSH = 96
+pkg syscall (freebsd-arm64-cgo), const BPF_LSH ideal-int
+pkg syscall (freebsd-arm64-cgo), const BPF_MAJOR_VERSION = 1
+pkg syscall (freebsd-arm64-cgo), const BPF_MAJOR_VERSION ideal-int
+pkg syscall (freebsd-arm64-cgo), const BPF_MAXBUFSIZE = 524288
+pkg syscall (freebsd-arm64-cgo), const BPF_MAXBUFSIZE ideal-int
+pkg syscall (freebsd-arm64-cgo), const BPF_MAXINSNS = 512
+pkg syscall (freebsd-arm64-cgo), const BPF_MAXINSNS ideal-int
+pkg syscall (freebsd-arm64-cgo), const BPF_MEM = 96
+pkg syscall (freebsd-arm64-cgo), const BPF_MEM ideal-int
+pkg syscall (freebsd-arm64-cgo), const BPF_MEMWORDS = 16
+pkg syscall (freebsd-arm64-cgo), const BPF_MEMWORDS ideal-int
+pkg syscall (freebsd-arm64-cgo), const BPF_MINBUFSIZE = 32
+pkg syscall (freebsd-arm64-cgo), const BPF_MINBUFSIZE ideal-int
+pkg syscall (freebsd-arm64-cgo), const BPF_MINOR_VERSION = 1
+pkg syscall (freebsd-arm64-cgo), const BPF_MINOR_VERSION ideal-int
+pkg syscall (freebsd-arm64-cgo), const BPF_MISC = 7
+pkg syscall (freebsd-arm64-cgo), const BPF_MISC ideal-int
+pkg syscall (freebsd-arm64-cgo), const BPF_MSH = 160
+pkg syscall (freebsd-arm64-cgo), const BPF_MSH ideal-int
+pkg syscall (freebsd-arm64-cgo), const BPF_MUL = 32
+pkg syscall (freebsd-arm64-cgo), const BPF_MUL ideal-int
+pkg syscall (freebsd-arm64-cgo), const BPF_NEG = 128
+pkg syscall (freebsd-arm64-cgo), const BPF_NEG ideal-int
+pkg syscall (freebsd-arm64-cgo), const BPF_OR = 64
+pkg syscall (freebsd-arm64-cgo), const BPF_OR ideal-int
+pkg syscall (freebsd-arm64-cgo), const BPF_RELEASE = 199606
+pkg syscall (freebsd-arm64-cgo), const BPF_RELEASE ideal-int
+pkg syscall (freebsd-arm64-cgo), const BPF_RET = 6
+pkg syscall (freebsd-arm64-cgo), const BPF_RET ideal-int
+pkg syscall (freebsd-arm64-cgo), const BPF_RSH = 112
+pkg syscall (freebsd-arm64-cgo), const BPF_RSH ideal-int
+pkg syscall (freebsd-arm64-cgo), const BPF_ST = 2
+pkg syscall (freebsd-arm64-cgo), const BPF_ST ideal-int
+pkg syscall (freebsd-arm64-cgo), const BPF_STX = 3
+pkg syscall (freebsd-arm64-cgo), const BPF_STX ideal-int
+pkg syscall (freebsd-arm64-cgo), const BPF_SUB = 16
+pkg syscall (freebsd-arm64-cgo), const BPF_SUB ideal-int
+pkg syscall (freebsd-arm64-cgo), const BPF_T_BINTIME = 2
+pkg syscall (freebsd-arm64-cgo), const BPF_T_BINTIME ideal-int
+pkg syscall (freebsd-arm64-cgo), const BPF_T_BINTIME_FAST = 258
+pkg syscall (freebsd-arm64-cgo), const BPF_T_BINTIME_FAST ideal-int
+pkg syscall (freebsd-arm64-cgo), const BPF_T_BINTIME_MONOTONIC = 514
+pkg syscall (freebsd-arm64-cgo), const BPF_T_BINTIME_MONOTONIC ideal-int
+pkg syscall (freebsd-arm64-cgo), const BPF_T_BINTIME_MONOTONIC_FAST = 770
+pkg syscall (freebsd-arm64-cgo), const BPF_T_BINTIME_MONOTONIC_FAST ideal-int
+pkg syscall (freebsd-arm64-cgo), const BPF_T_FAST = 256
+pkg syscall (freebsd-arm64-cgo), const BPF_T_FAST ideal-int
+pkg syscall (freebsd-arm64-cgo), const BPF_T_FLAG_MASK = 768
+pkg syscall (freebsd-arm64-cgo), const BPF_T_FLAG_MASK ideal-int
+pkg syscall (freebsd-arm64-cgo), const BPF_T_FORMAT_MASK = 3
+pkg syscall (freebsd-arm64-cgo), const BPF_T_FORMAT_MASK ideal-int
+pkg syscall (freebsd-arm64-cgo), const BPF_T_MICROTIME = 0
+pkg syscall (freebsd-arm64-cgo), const BPF_T_MICROTIME ideal-int
+pkg syscall (freebsd-arm64-cgo), const BPF_T_MICROTIME_FAST = 256
+pkg syscall (freebsd-arm64-cgo), const BPF_T_MICROTIME_FAST ideal-int
+pkg syscall (freebsd-arm64-cgo), const BPF_T_MICROTIME_MONOTONIC = 512
+pkg syscall (freebsd-arm64-cgo), const BPF_T_MICROTIME_MONOTONIC ideal-int
+pkg syscall (freebsd-arm64-cgo), const BPF_T_MICROTIME_MONOTONIC_FAST = 768
+pkg syscall (freebsd-arm64-cgo), const BPF_T_MICROTIME_MONOTONIC_FAST ideal-int
+pkg syscall (freebsd-arm64-cgo), const BPF_T_MONOTONIC = 512
+pkg syscall (freebsd-arm64-cgo), const BPF_T_MONOTONIC ideal-int
+pkg syscall (freebsd-arm64-cgo), const BPF_T_MONOTONIC_FAST = 768
+pkg syscall (freebsd-arm64-cgo), const BPF_T_MONOTONIC_FAST ideal-int
+pkg syscall (freebsd-arm64-cgo), const BPF_T_NANOTIME = 1
+pkg syscall (freebsd-arm64-cgo), const BPF_T_NANOTIME ideal-int
+pkg syscall (freebsd-arm64-cgo), const BPF_T_NANOTIME_FAST = 257
+pkg syscall (freebsd-arm64-cgo), const BPF_T_NANOTIME_FAST ideal-int
+pkg syscall (freebsd-arm64-cgo), const BPF_T_NANOTIME_MONOTONIC = 513
+pkg syscall (freebsd-arm64-cgo), const BPF_T_NANOTIME_MONOTONIC ideal-int
+pkg syscall (freebsd-arm64-cgo), const BPF_T_NANOTIME_MONOTONIC_FAST = 769
+pkg syscall (freebsd-arm64-cgo), const BPF_T_NANOTIME_MONOTONIC_FAST ideal-int
+pkg syscall (freebsd-arm64-cgo), const BPF_T_NONE = 3
+pkg syscall (freebsd-arm64-cgo), const BPF_T_NONE ideal-int
+pkg syscall (freebsd-arm64-cgo), const BPF_T_NORMAL = 0
+pkg syscall (freebsd-arm64-cgo), const BPF_T_NORMAL ideal-int
+pkg syscall (freebsd-arm64-cgo), const BPF_TAX = 0
+pkg syscall (freebsd-arm64-cgo), const BPF_TAX ideal-int
+pkg syscall (freebsd-arm64-cgo), const BPF_TXA = 128
+pkg syscall (freebsd-arm64-cgo), const BPF_TXA ideal-int
+pkg syscall (freebsd-arm64-cgo), const BPF_W = 0
+pkg syscall (freebsd-arm64-cgo), const BPF_W ideal-int
+pkg syscall (freebsd-arm64-cgo), const BPF_X = 8
+pkg syscall (freebsd-arm64-cgo), const BPF_X ideal-int
+pkg syscall (freebsd-arm64-cgo), const BRKINT = 2
+pkg syscall (freebsd-arm64-cgo), const BRKINT ideal-int
+pkg syscall (freebsd-arm64-cgo), const CFLUSH = 15
+pkg syscall (freebsd-arm64-cgo), const CFLUSH ideal-int
+pkg syscall (freebsd-arm64-cgo), const CLOCAL = 32768
+pkg syscall (freebsd-arm64-cgo), const CLOCAL ideal-int
+pkg syscall (freebsd-arm64-cgo), const CREAD = 2048
+pkg syscall (freebsd-arm64-cgo), const CREAD ideal-int
+pkg syscall (freebsd-arm64-cgo), const CS5 = 0
+pkg syscall (freebsd-arm64-cgo), const CS5 ideal-int
+pkg syscall (freebsd-arm64-cgo), const CS6 = 256
+pkg syscall (freebsd-arm64-cgo), const CS6 ideal-int
+pkg syscall (freebsd-arm64-cgo), const CS7 = 512
+pkg syscall (freebsd-arm64-cgo), const CS7 ideal-int
+pkg syscall (freebsd-arm64-cgo), const CS8 = 768
+pkg syscall (freebsd-arm64-cgo), const CS8 ideal-int
+pkg syscall (freebsd-arm64-cgo), const CSIZE = 768
+pkg syscall (freebsd-arm64-cgo), const CSIZE ideal-int
+pkg syscall (freebsd-arm64-cgo), const CSTART = 17
+pkg syscall (freebsd-arm64-cgo), const CSTART ideal-int
+pkg syscall (freebsd-arm64-cgo), const CSTATUS = 20
+pkg syscall (freebsd-arm64-cgo), const CSTATUS ideal-int
+pkg syscall (freebsd-arm64-cgo), const CSTOP = 19
+pkg syscall (freebsd-arm64-cgo), const CSTOP ideal-int
+pkg syscall (freebsd-arm64-cgo), const CSTOPB = 1024
+pkg syscall (freebsd-arm64-cgo), const CSTOPB ideal-int
+pkg syscall (freebsd-arm64-cgo), const CSUSP = 26
+pkg syscall (freebsd-arm64-cgo), const CSUSP ideal-int
+pkg syscall (freebsd-arm64-cgo), const CTL_MAXNAME = 24
+pkg syscall (freebsd-arm64-cgo), const CTL_MAXNAME ideal-int
+pkg syscall (freebsd-arm64-cgo), const CTL_NET = 4
+pkg syscall (freebsd-arm64-cgo), const CTL_NET ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_A429 = 184
+pkg syscall (freebsd-arm64-cgo), const DLT_A429 ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_A653_ICM = 185
+pkg syscall (freebsd-arm64-cgo), const DLT_A653_ICM ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_AIRONET_HEADER = 120
+pkg syscall (freebsd-arm64-cgo), const DLT_AIRONET_HEADER ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_AOS = 222
+pkg syscall (freebsd-arm64-cgo), const DLT_AOS ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_APPLE_IP_OVER_IEEE1394 = 138
+pkg syscall (freebsd-arm64-cgo), const DLT_APPLE_IP_OVER_IEEE1394 ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_ARCNET = 7
+pkg syscall (freebsd-arm64-cgo), const DLT_ARCNET ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_ARCNET_LINUX = 129
+pkg syscall (freebsd-arm64-cgo), const DLT_ARCNET_LINUX ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_ATM_CLIP = 19
+pkg syscall (freebsd-arm64-cgo), const DLT_ATM_CLIP ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_ATM_RFC1483 = 11
+pkg syscall (freebsd-arm64-cgo), const DLT_ATM_RFC1483 ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_AURORA = 126
+pkg syscall (freebsd-arm64-cgo), const DLT_AURORA ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_AX25 = 3
+pkg syscall (freebsd-arm64-cgo), const DLT_AX25 ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_AX25_KISS = 202
+pkg syscall (freebsd-arm64-cgo), const DLT_AX25_KISS ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_BACNET_MS_TP = 165
+pkg syscall (freebsd-arm64-cgo), const DLT_BACNET_MS_TP ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_BLUETOOTH_HCI_H4 = 187
+pkg syscall (freebsd-arm64-cgo), const DLT_BLUETOOTH_HCI_H4 ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 201
+pkg syscall (freebsd-arm64-cgo), const DLT_BLUETOOTH_HCI_H4_WITH_PHDR ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_C_HDLC = 104
+pkg syscall (freebsd-arm64-cgo), const DLT_C_HDLC ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_C_HDLC_WITH_DIR = 205
+pkg syscall (freebsd-arm64-cgo), const DLT_C_HDLC_WITH_DIR ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_CAN_SOCKETCAN = 227
+pkg syscall (freebsd-arm64-cgo), const DLT_CAN_SOCKETCAN ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_CAN20B = 190
+pkg syscall (freebsd-arm64-cgo), const DLT_CAN20B ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_CHAOS = 5
+pkg syscall (freebsd-arm64-cgo), const DLT_CHAOS ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_CHDLC = 104
+pkg syscall (freebsd-arm64-cgo), const DLT_CHDLC ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_CISCO_IOS = 118
+pkg syscall (freebsd-arm64-cgo), const DLT_CISCO_IOS ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_DBUS = 231
+pkg syscall (freebsd-arm64-cgo), const DLT_DBUS ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_DECT = 221
+pkg syscall (freebsd-arm64-cgo), const DLT_DECT ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_DOCSIS = 143
+pkg syscall (freebsd-arm64-cgo), const DLT_DOCSIS ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_DVB_CI = 235
+pkg syscall (freebsd-arm64-cgo), const DLT_DVB_CI ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_ECONET = 115
+pkg syscall (freebsd-arm64-cgo), const DLT_ECONET ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_EN10MB = 1
+pkg syscall (freebsd-arm64-cgo), const DLT_EN10MB ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_EN3MB = 2
+pkg syscall (freebsd-arm64-cgo), const DLT_EN3MB ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_ENC = 109
+pkg syscall (freebsd-arm64-cgo), const DLT_ENC ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_ERF = 197
+pkg syscall (freebsd-arm64-cgo), const DLT_ERF ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_ERF_ETH = 175
+pkg syscall (freebsd-arm64-cgo), const DLT_ERF_ETH ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_ERF_POS = 176
+pkg syscall (freebsd-arm64-cgo), const DLT_ERF_POS ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_FC_2 = 224
+pkg syscall (freebsd-arm64-cgo), const DLT_FC_2 ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_FC_2_WITH_FRAME_DELIMS = 225
+pkg syscall (freebsd-arm64-cgo), const DLT_FC_2_WITH_FRAME_DELIMS ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_FDDI = 10
+pkg syscall (freebsd-arm64-cgo), const DLT_FDDI ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_FLEXRAY = 210
+pkg syscall (freebsd-arm64-cgo), const DLT_FLEXRAY ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_FRELAY = 107
+pkg syscall (freebsd-arm64-cgo), const DLT_FRELAY ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_FRELAY_WITH_DIR = 206
+pkg syscall (freebsd-arm64-cgo), const DLT_FRELAY_WITH_DIR ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_GCOM_SERIAL = 173
+pkg syscall (freebsd-arm64-cgo), const DLT_GCOM_SERIAL ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_GCOM_T1E1 = 172
+pkg syscall (freebsd-arm64-cgo), const DLT_GCOM_T1E1 ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_GPF_F = 171
+pkg syscall (freebsd-arm64-cgo), const DLT_GPF_F ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_GPF_T = 170
+pkg syscall (freebsd-arm64-cgo), const DLT_GPF_T ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_GPRS_LLC = 169
+pkg syscall (freebsd-arm64-cgo), const DLT_GPRS_LLC ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_GSMTAP_ABIS = 218
+pkg syscall (freebsd-arm64-cgo), const DLT_GSMTAP_ABIS ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_GSMTAP_UM = 217
+pkg syscall (freebsd-arm64-cgo), const DLT_GSMTAP_UM ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_HHDLC = 121
+pkg syscall (freebsd-arm64-cgo), const DLT_HHDLC ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_IBM_SN = 146
+pkg syscall (freebsd-arm64-cgo), const DLT_IBM_SN ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_IBM_SP = 145
+pkg syscall (freebsd-arm64-cgo), const DLT_IBM_SP ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_IEEE802 = 6
+pkg syscall (freebsd-arm64-cgo), const DLT_IEEE802 ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_IEEE802_11 = 105
+pkg syscall (freebsd-arm64-cgo), const DLT_IEEE802_11 ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_IEEE802_11_RADIO = 127
+pkg syscall (freebsd-arm64-cgo), const DLT_IEEE802_11_RADIO ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_IEEE802_11_RADIO_AVS = 163
+pkg syscall (freebsd-arm64-cgo), const DLT_IEEE802_11_RADIO_AVS ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_IEEE802_15_4 = 195
+pkg syscall (freebsd-arm64-cgo), const DLT_IEEE802_15_4 ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_IEEE802_15_4_LINUX = 191
+pkg syscall (freebsd-arm64-cgo), const DLT_IEEE802_15_4_LINUX ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_IEEE802_15_4_NOFCS = 230
+pkg syscall (freebsd-arm64-cgo), const DLT_IEEE802_15_4_NOFCS ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_IEEE802_15_4_NONASK_PHY = 215
+pkg syscall (freebsd-arm64-cgo), const DLT_IEEE802_15_4_NONASK_PHY ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_IEEE802_16_MAC_CPS = 188
+pkg syscall (freebsd-arm64-cgo), const DLT_IEEE802_16_MAC_CPS ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_IEEE802_16_MAC_CPS_RADIO = 193
+pkg syscall (freebsd-arm64-cgo), const DLT_IEEE802_16_MAC_CPS_RADIO ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_IP_OVER_FC = 122
+pkg syscall (freebsd-arm64-cgo), const DLT_IP_OVER_FC ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_IPFILTER = 116
+pkg syscall (freebsd-arm64-cgo), const DLT_IPFILTER ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_IPMB = 199
+pkg syscall (freebsd-arm64-cgo), const DLT_IPMB ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_IPMB_LINUX = 209
+pkg syscall (freebsd-arm64-cgo), const DLT_IPMB_LINUX ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_IPNET = 226
+pkg syscall (freebsd-arm64-cgo), const DLT_IPNET ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_IPOIB = 242
+pkg syscall (freebsd-arm64-cgo), const DLT_IPOIB ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_IPV4 = 228
+pkg syscall (freebsd-arm64-cgo), const DLT_IPV4 ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_IPV6 = 229
+pkg syscall (freebsd-arm64-cgo), const DLT_IPV6 ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_JUNIPER_ATM_CEMIC = 238
+pkg syscall (freebsd-arm64-cgo), const DLT_JUNIPER_ATM_CEMIC ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_JUNIPER_ATM1 = 137
+pkg syscall (freebsd-arm64-cgo), const DLT_JUNIPER_ATM1 ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_JUNIPER_ATM2 = 135
+pkg syscall (freebsd-arm64-cgo), const DLT_JUNIPER_ATM2 ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_JUNIPER_CHDLC = 181
+pkg syscall (freebsd-arm64-cgo), const DLT_JUNIPER_CHDLC ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_JUNIPER_ES = 132
+pkg syscall (freebsd-arm64-cgo), const DLT_JUNIPER_ES ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_JUNIPER_ETHER = 178
+pkg syscall (freebsd-arm64-cgo), const DLT_JUNIPER_ETHER ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_JUNIPER_FIBRECHANNEL = 234
+pkg syscall (freebsd-arm64-cgo), const DLT_JUNIPER_FIBRECHANNEL ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_JUNIPER_FRELAY = 180
+pkg syscall (freebsd-arm64-cgo), const DLT_JUNIPER_FRELAY ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_JUNIPER_GGSN = 133
+pkg syscall (freebsd-arm64-cgo), const DLT_JUNIPER_GGSN ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_JUNIPER_ISM = 194
+pkg syscall (freebsd-arm64-cgo), const DLT_JUNIPER_ISM ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_JUNIPER_MFR = 134
+pkg syscall (freebsd-arm64-cgo), const DLT_JUNIPER_MFR ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_JUNIPER_MLFR = 131
+pkg syscall (freebsd-arm64-cgo), const DLT_JUNIPER_MLFR ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_JUNIPER_MLPPP = 130
+pkg syscall (freebsd-arm64-cgo), const DLT_JUNIPER_MLPPP ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_JUNIPER_MONITOR = 164
+pkg syscall (freebsd-arm64-cgo), const DLT_JUNIPER_MONITOR ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_JUNIPER_PIC_PEER = 174
+pkg syscall (freebsd-arm64-cgo), const DLT_JUNIPER_PIC_PEER ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_JUNIPER_PPP = 179
+pkg syscall (freebsd-arm64-cgo), const DLT_JUNIPER_PPP ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_JUNIPER_PPPOE = 167
+pkg syscall (freebsd-arm64-cgo), const DLT_JUNIPER_PPPOE ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_JUNIPER_PPPOE_ATM = 168
+pkg syscall (freebsd-arm64-cgo), const DLT_JUNIPER_PPPOE_ATM ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_JUNIPER_SERVICES = 136
+pkg syscall (freebsd-arm64-cgo), const DLT_JUNIPER_SERVICES ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_JUNIPER_SRX_E2E = 233
+pkg syscall (freebsd-arm64-cgo), const DLT_JUNIPER_SRX_E2E ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_JUNIPER_ST = 200
+pkg syscall (freebsd-arm64-cgo), const DLT_JUNIPER_ST ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_JUNIPER_VP = 183
+pkg syscall (freebsd-arm64-cgo), const DLT_JUNIPER_VP ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_JUNIPER_VS = 232
+pkg syscall (freebsd-arm64-cgo), const DLT_JUNIPER_VS ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_LAPB_WITH_DIR = 207
+pkg syscall (freebsd-arm64-cgo), const DLT_LAPB_WITH_DIR ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_LAPD = 203
+pkg syscall (freebsd-arm64-cgo), const DLT_LAPD ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_LIN = 212
+pkg syscall (freebsd-arm64-cgo), const DLT_LIN ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_LINUX_EVDEV = 216
+pkg syscall (freebsd-arm64-cgo), const DLT_LINUX_EVDEV ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_LINUX_IRDA = 144
+pkg syscall (freebsd-arm64-cgo), const DLT_LINUX_IRDA ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_LINUX_LAPD = 177
+pkg syscall (freebsd-arm64-cgo), const DLT_LINUX_LAPD ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_LINUX_PPP_WITHDIRECTION = 166
+pkg syscall (freebsd-arm64-cgo), const DLT_LINUX_PPP_WITHDIRECTION ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_LINUX_SLL = 113
+pkg syscall (freebsd-arm64-cgo), const DLT_LINUX_SLL ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_LOOP = 108
+pkg syscall (freebsd-arm64-cgo), const DLT_LOOP ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_LTALK = 114
+pkg syscall (freebsd-arm64-cgo), const DLT_LTALK ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_MATCHING_MAX = 246
+pkg syscall (freebsd-arm64-cgo), const DLT_MATCHING_MAX ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_MATCHING_MIN = 104
+pkg syscall (freebsd-arm64-cgo), const DLT_MATCHING_MIN ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_MFR = 182
+pkg syscall (freebsd-arm64-cgo), const DLT_MFR ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_MOST = 211
+pkg syscall (freebsd-arm64-cgo), const DLT_MOST ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_MPEG_2_TS = 243
+pkg syscall (freebsd-arm64-cgo), const DLT_MPEG_2_TS ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_MPLS = 219
+pkg syscall (freebsd-arm64-cgo), const DLT_MPLS ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_MTP2 = 140
+pkg syscall (freebsd-arm64-cgo), const DLT_MTP2 ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_MTP2_WITH_PHDR = 139
+pkg syscall (freebsd-arm64-cgo), const DLT_MTP2_WITH_PHDR ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_MTP3 = 141
+pkg syscall (freebsd-arm64-cgo), const DLT_MTP3 ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_MUX27010 = 236
+pkg syscall (freebsd-arm64-cgo), const DLT_MUX27010 ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_NETANALYZER = 240
+pkg syscall (freebsd-arm64-cgo), const DLT_NETANALYZER ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_NETANALYZER_TRANSPARENT = 241
+pkg syscall (freebsd-arm64-cgo), const DLT_NETANALYZER_TRANSPARENT ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_NFC_LLCP = 245
+pkg syscall (freebsd-arm64-cgo), const DLT_NFC_LLCP ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_NFLOG = 239
+pkg syscall (freebsd-arm64-cgo), const DLT_NFLOG ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_NG40 = 244
+pkg syscall (freebsd-arm64-cgo), const DLT_NG40 ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_NULL = 0
+pkg syscall (freebsd-arm64-cgo), const DLT_NULL ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_PCI_EXP = 125
+pkg syscall (freebsd-arm64-cgo), const DLT_PCI_EXP ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_PFLOG = 117
+pkg syscall (freebsd-arm64-cgo), const DLT_PFLOG ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_PFSYNC = 121
+pkg syscall (freebsd-arm64-cgo), const DLT_PFSYNC ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_PPI = 192
+pkg syscall (freebsd-arm64-cgo), const DLT_PPI ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_PPP = 9
+pkg syscall (freebsd-arm64-cgo), const DLT_PPP ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_PPP_BSDOS = 16
+pkg syscall (freebsd-arm64-cgo), const DLT_PPP_BSDOS ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_PPP_ETHER = 51
+pkg syscall (freebsd-arm64-cgo), const DLT_PPP_ETHER ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_PPP_PPPD = 166
+pkg syscall (freebsd-arm64-cgo), const DLT_PPP_PPPD ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_PPP_SERIAL = 50
+pkg syscall (freebsd-arm64-cgo), const DLT_PPP_SERIAL ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_PPP_WITH_DIR = 204
+pkg syscall (freebsd-arm64-cgo), const DLT_PPP_WITH_DIR ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_PPP_WITH_DIRECTION = 166
+pkg syscall (freebsd-arm64-cgo), const DLT_PPP_WITH_DIRECTION ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_PRISM_HEADER = 119
+pkg syscall (freebsd-arm64-cgo), const DLT_PRISM_HEADER ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_PRONET = 4
+pkg syscall (freebsd-arm64-cgo), const DLT_PRONET ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_RAIF1 = 198
+pkg syscall (freebsd-arm64-cgo), const DLT_RAIF1 ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_RAW = 12
+pkg syscall (freebsd-arm64-cgo), const DLT_RAW ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_RIO = 124
+pkg syscall (freebsd-arm64-cgo), const DLT_RIO ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_SCCP = 142
+pkg syscall (freebsd-arm64-cgo), const DLT_SCCP ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_SITA = 196
+pkg syscall (freebsd-arm64-cgo), const DLT_SITA ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_SLIP = 8
+pkg syscall (freebsd-arm64-cgo), const DLT_SLIP ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_SLIP_BSDOS = 15
+pkg syscall (freebsd-arm64-cgo), const DLT_SLIP_BSDOS ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_STANAG_5066_D_PDU = 237
+pkg syscall (freebsd-arm64-cgo), const DLT_STANAG_5066_D_PDU ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_SUNATM = 123
+pkg syscall (freebsd-arm64-cgo), const DLT_SUNATM ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_SYMANTEC_FIREWALL = 99
+pkg syscall (freebsd-arm64-cgo), const DLT_SYMANTEC_FIREWALL ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_TZSP = 128
+pkg syscall (freebsd-arm64-cgo), const DLT_TZSP ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_USB = 186
+pkg syscall (freebsd-arm64-cgo), const DLT_USB ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_USB_LINUX = 189
+pkg syscall (freebsd-arm64-cgo), const DLT_USB_LINUX ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_USB_LINUX_MMAPPED = 220
+pkg syscall (freebsd-arm64-cgo), const DLT_USB_LINUX_MMAPPED ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_USER0 = 147
+pkg syscall (freebsd-arm64-cgo), const DLT_USER0 ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_USER1 = 148
+pkg syscall (freebsd-arm64-cgo), const DLT_USER1 ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_USER10 = 157
+pkg syscall (freebsd-arm64-cgo), const DLT_USER10 ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_USER11 = 158
+pkg syscall (freebsd-arm64-cgo), const DLT_USER11 ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_USER12 = 159
+pkg syscall (freebsd-arm64-cgo), const DLT_USER12 ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_USER13 = 160
+pkg syscall (freebsd-arm64-cgo), const DLT_USER13 ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_USER14 = 161
+pkg syscall (freebsd-arm64-cgo), const DLT_USER14 ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_USER15 = 162
+pkg syscall (freebsd-arm64-cgo), const DLT_USER15 ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_USER2 = 149
+pkg syscall (freebsd-arm64-cgo), const DLT_USER2 ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_USER3 = 150
+pkg syscall (freebsd-arm64-cgo), const DLT_USER3 ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_USER4 = 151
+pkg syscall (freebsd-arm64-cgo), const DLT_USER4 ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_USER5 = 152
+pkg syscall (freebsd-arm64-cgo), const DLT_USER5 ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_USER6 = 153
+pkg syscall (freebsd-arm64-cgo), const DLT_USER6 ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_USER7 = 154
+pkg syscall (freebsd-arm64-cgo), const DLT_USER7 ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_USER8 = 155
+pkg syscall (freebsd-arm64-cgo), const DLT_USER8 ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_USER9 = 156
+pkg syscall (freebsd-arm64-cgo), const DLT_USER9 ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_WIHART = 223
+pkg syscall (freebsd-arm64-cgo), const DLT_WIHART ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_X2E_SERIAL = 213
+pkg syscall (freebsd-arm64-cgo), const DLT_X2E_SERIAL ideal-int
+pkg syscall (freebsd-arm64-cgo), const DLT_X2E_XORAYA = 214
+pkg syscall (freebsd-arm64-cgo), const DLT_X2E_XORAYA ideal-int
+pkg syscall (freebsd-arm64-cgo), const DT_BLK = 6
+pkg syscall (freebsd-arm64-cgo), const DT_BLK ideal-int
+pkg syscall (freebsd-arm64-cgo), const DT_CHR = 2
+pkg syscall (freebsd-arm64-cgo), const DT_CHR ideal-int
+pkg syscall (freebsd-arm64-cgo), const DT_DIR = 4
+pkg syscall (freebsd-arm64-cgo), const DT_DIR ideal-int
+pkg syscall (freebsd-arm64-cgo), const DT_FIFO = 1
+pkg syscall (freebsd-arm64-cgo), const DT_FIFO ideal-int
+pkg syscall (freebsd-arm64-cgo), const DT_LNK = 10
+pkg syscall (freebsd-arm64-cgo), const DT_LNK ideal-int
+pkg syscall (freebsd-arm64-cgo), const DT_REG = 8
+pkg syscall (freebsd-arm64-cgo), const DT_REG ideal-int
+pkg syscall (freebsd-arm64-cgo), const DT_SOCK = 12
+pkg syscall (freebsd-arm64-cgo), const DT_SOCK ideal-int
+pkg syscall (freebsd-arm64-cgo), const DT_UNKNOWN = 0
+pkg syscall (freebsd-arm64-cgo), const DT_UNKNOWN ideal-int
+pkg syscall (freebsd-arm64-cgo), const DT_WHT = 14
+pkg syscall (freebsd-arm64-cgo), const DT_WHT ideal-int
+pkg syscall (freebsd-arm64-cgo), const E2BIG = 7
+pkg syscall (freebsd-arm64-cgo), const EACCES = 13
+pkg syscall (freebsd-arm64-cgo), const EADDRINUSE = 48
+pkg syscall (freebsd-arm64-cgo), const EADDRNOTAVAIL = 49
+pkg syscall (freebsd-arm64-cgo), const EAFNOSUPPORT = 47
+pkg syscall (freebsd-arm64-cgo), const EAGAIN = 35
+pkg syscall (freebsd-arm64-cgo), const EALREADY = 37
+pkg syscall (freebsd-arm64-cgo), const EAUTH = 80
+pkg syscall (freebsd-arm64-cgo), const EAUTH Errno
+pkg syscall (freebsd-arm64-cgo), const EBADF = 9
+pkg syscall (freebsd-arm64-cgo), const EBADMSG = 89
+pkg syscall (freebsd-arm64-cgo), const EBADMSG Errno
+pkg syscall (freebsd-arm64-cgo), const EBADRPC = 72
+pkg syscall (freebsd-arm64-cgo), const EBADRPC Errno
+pkg syscall (freebsd-arm64-cgo), const EBUSY = 16
+pkg syscall (freebsd-arm64-cgo), const ECANCELED = 85
+pkg syscall (freebsd-arm64-cgo), const ECAPMODE = 94
+pkg syscall (freebsd-arm64-cgo), const ECAPMODE Errno
+pkg syscall (freebsd-arm64-cgo), const ECHILD = 10
+pkg syscall (freebsd-arm64-cgo), const ECHO = 8
+pkg syscall (freebsd-arm64-cgo), const ECHO ideal-int
+pkg syscall (freebsd-arm64-cgo), const ECHOCTL = 64
+pkg syscall (freebsd-arm64-cgo), const ECHOCTL ideal-int
+pkg syscall (freebsd-arm64-cgo), const ECHOE = 2
+pkg syscall (freebsd-arm64-cgo), const ECHOE ideal-int
+pkg syscall (freebsd-arm64-cgo), const ECHOK = 4
+pkg syscall (freebsd-arm64-cgo), const ECHOK ideal-int
+pkg syscall (freebsd-arm64-cgo), const ECHOKE = 1
+pkg syscall (freebsd-arm64-cgo), const ECHOKE ideal-int
+pkg syscall (freebsd-arm64-cgo), const ECHONL = 16
+pkg syscall (freebsd-arm64-cgo), const ECHONL ideal-int
+pkg syscall (freebsd-arm64-cgo), const ECHOPRT = 32
+pkg syscall (freebsd-arm64-cgo), const ECHOPRT ideal-int
+pkg syscall (freebsd-arm64-cgo), const ECONNABORTED = 53
+pkg syscall (freebsd-arm64-cgo), const ECONNREFUSED = 61
+pkg syscall (freebsd-arm64-cgo), const ECONNRESET = 54
+pkg syscall (freebsd-arm64-cgo), const EDEADLK = 11
+pkg syscall (freebsd-arm64-cgo), const EDESTADDRREQ = 39
+pkg syscall (freebsd-arm64-cgo), const EDOM = 33
+pkg syscall (freebsd-arm64-cgo), const EDOOFUS = 88
+pkg syscall (freebsd-arm64-cgo), const EDOOFUS Errno
+pkg syscall (freebsd-arm64-cgo), const EDQUOT = 69
+pkg syscall (freebsd-arm64-cgo), const EEXIST = 17
+pkg syscall (freebsd-arm64-cgo), const EFAULT = 14
+pkg syscall (freebsd-arm64-cgo), const EFBIG = 27
+pkg syscall (freebsd-arm64-cgo), const EFTYPE = 79
+pkg syscall (freebsd-arm64-cgo), const EFTYPE Errno
+pkg syscall (freebsd-arm64-cgo), const EHOSTDOWN = 64
+pkg syscall (freebsd-arm64-cgo), const EHOSTUNREACH = 65
+pkg syscall (freebsd-arm64-cgo), const EIDRM = 82
+pkg syscall (freebsd-arm64-cgo), const EILSEQ = 86
+pkg syscall (freebsd-arm64-cgo), const EINPROGRESS = 36
+pkg syscall (freebsd-arm64-cgo), const EINTR = 4
+pkg syscall (freebsd-arm64-cgo), const EINVAL = 22
+pkg syscall (freebsd-arm64-cgo), const EIO = 5
+pkg syscall (freebsd-arm64-cgo), const EISCONN = 56
+pkg syscall (freebsd-arm64-cgo), const EISDIR = 21
+pkg syscall (freebsd-arm64-cgo), const ELAST = 96
+pkg syscall (freebsd-arm64-cgo), const ELAST Errno
+pkg syscall (freebsd-arm64-cgo), const ELOOP = 62
+pkg syscall (freebsd-arm64-cgo), const EMFILE = 24
+pkg syscall (freebsd-arm64-cgo), const EMLINK = 31
+pkg syscall (freebsd-arm64-cgo), const EMSGSIZE = 40
+pkg syscall (freebsd-arm64-cgo), const EMULTIHOP = 90
+pkg syscall (freebsd-arm64-cgo), const EMULTIHOP Errno
+pkg syscall (freebsd-arm64-cgo), const ENAMETOOLONG = 63
+pkg syscall (freebsd-arm64-cgo), const ENEEDAUTH = 81
+pkg syscall (freebsd-arm64-cgo), const ENEEDAUTH Errno
+pkg syscall (freebsd-arm64-cgo), const ENETDOWN = 50
+pkg syscall (freebsd-arm64-cgo), const ENETRESET = 52
+pkg syscall (freebsd-arm64-cgo), const ENETUNREACH = 51
+pkg syscall (freebsd-arm64-cgo), const ENFILE = 23
+pkg syscall (freebsd-arm64-cgo), const ENOATTR = 87
+pkg syscall (freebsd-arm64-cgo), const ENOATTR Errno
+pkg syscall (freebsd-arm64-cgo), const ENOBUFS = 55
+pkg syscall (freebsd-arm64-cgo), const ENODEV = 19
+pkg syscall (freebsd-arm64-cgo), const ENOEXEC = 8
+pkg syscall (freebsd-arm64-cgo), const ENOLCK = 77
+pkg syscall (freebsd-arm64-cgo), const ENOLINK = 91
+pkg syscall (freebsd-arm64-cgo), const ENOLINK Errno
+pkg syscall (freebsd-arm64-cgo), const ENOMEM = 12
+pkg syscall (freebsd-arm64-cgo), const ENOMSG = 83
+pkg syscall (freebsd-arm64-cgo), const ENOPROTOOPT = 42
+pkg syscall (freebsd-arm64-cgo), const ENOSPC = 28
+pkg syscall (freebsd-arm64-cgo), const ENOSYS = 78
+pkg syscall (freebsd-arm64-cgo), const ENOTBLK = 15
+pkg syscall (freebsd-arm64-cgo), const ENOTCAPABLE = 93
+pkg syscall (freebsd-arm64-cgo), const ENOTCAPABLE Errno
+pkg syscall (freebsd-arm64-cgo), const ENOTCONN = 57
+pkg syscall (freebsd-arm64-cgo), const ENOTDIR = 20
+pkg syscall (freebsd-arm64-cgo), const ENOTEMPTY = 66
+pkg syscall (freebsd-arm64-cgo), const ENOTRECOVERABLE = 95
+pkg syscall (freebsd-arm64-cgo), const ENOTRECOVERABLE Errno
+pkg syscall (freebsd-arm64-cgo), const ENOTSOCK = 38
+pkg syscall (freebsd-arm64-cgo), const ENOTSUP = 45
+pkg syscall (freebsd-arm64-cgo), const ENOTTY = 25
+pkg syscall (freebsd-arm64-cgo), const ENXIO = 6
+pkg syscall (freebsd-arm64-cgo), const EOPNOTSUPP = 45
+pkg syscall (freebsd-arm64-cgo), const EOVERFLOW = 84
+pkg syscall (freebsd-arm64-cgo), const EOWNERDEAD = 96
+pkg syscall (freebsd-arm64-cgo), const EOWNERDEAD Errno
+pkg syscall (freebsd-arm64-cgo), const EPERM = 1
+pkg syscall (freebsd-arm64-cgo), const EPFNOSUPPORT = 46
+pkg syscall (freebsd-arm64-cgo), const EPIPE = 32
+pkg syscall (freebsd-arm64-cgo), const EPROCLIM = 67
+pkg syscall (freebsd-arm64-cgo), const EPROCLIM Errno
+pkg syscall (freebsd-arm64-cgo), const EPROCUNAVAIL = 76
+pkg syscall (freebsd-arm64-cgo), const EPROCUNAVAIL Errno
+pkg syscall (freebsd-arm64-cgo), const EPROGMISMATCH = 75
+pkg syscall (freebsd-arm64-cgo), const EPROGMISMATCH Errno
+pkg syscall (freebsd-arm64-cgo), const EPROGUNAVAIL = 74
+pkg syscall (freebsd-arm64-cgo), const EPROGUNAVAIL Errno
+pkg syscall (freebsd-arm64-cgo), const EPROTO = 92
+pkg syscall (freebsd-arm64-cgo), const EPROTO Errno
+pkg syscall (freebsd-arm64-cgo), const EPROTONOSUPPORT = 43
+pkg syscall (freebsd-arm64-cgo), const EPROTOTYPE = 41
+pkg syscall (freebsd-arm64-cgo), const ERANGE = 34
+pkg syscall (freebsd-arm64-cgo), const EREMOTE = 71
+pkg syscall (freebsd-arm64-cgo), const EROFS = 30
+pkg syscall (freebsd-arm64-cgo), const ERPCMISMATCH = 73
+pkg syscall (freebsd-arm64-cgo), const ERPCMISMATCH Errno
+pkg syscall (freebsd-arm64-cgo), const ESHUTDOWN = 58
+pkg syscall (freebsd-arm64-cgo), const ESOCKTNOSUPPORT = 44
+pkg syscall (freebsd-arm64-cgo), const ESPIPE = 29
+pkg syscall (freebsd-arm64-cgo), const ESRCH = 3
+pkg syscall (freebsd-arm64-cgo), const ESTALE = 70
+pkg syscall (freebsd-arm64-cgo), const ETIMEDOUT = 60
+pkg syscall (freebsd-arm64-cgo), const ETOOMANYREFS = 59
+pkg syscall (freebsd-arm64-cgo), const ETXTBSY = 26
+pkg syscall (freebsd-arm64-cgo), const EUSERS = 68
+pkg syscall (freebsd-arm64-cgo), const EV_ADD = 1
+pkg syscall (freebsd-arm64-cgo), const EV_ADD ideal-int
+pkg syscall (freebsd-arm64-cgo), const EV_CLEAR = 32
+pkg syscall (freebsd-arm64-cgo), const EV_CLEAR ideal-int
+pkg syscall (freebsd-arm64-cgo), const EV_DELETE = 2
+pkg syscall (freebsd-arm64-cgo), const EV_DELETE ideal-int
+pkg syscall (freebsd-arm64-cgo), const EV_DISABLE = 8
+pkg syscall (freebsd-arm64-cgo), const EV_DISABLE ideal-int
+pkg syscall (freebsd-arm64-cgo), const EV_DISPATCH = 128
+pkg syscall (freebsd-arm64-cgo), const EV_DISPATCH ideal-int
+pkg syscall (freebsd-arm64-cgo), const EV_DROP = 4096
+pkg syscall (freebsd-arm64-cgo), const EV_DROP ideal-int
+pkg syscall (freebsd-arm64-cgo), const EV_ENABLE = 4
+pkg syscall (freebsd-arm64-cgo), const EV_ENABLE ideal-int
+pkg syscall (freebsd-arm64-cgo), const EV_EOF = 32768
+pkg syscall (freebsd-arm64-cgo), const EV_EOF ideal-int
+pkg syscall (freebsd-arm64-cgo), const EV_ERROR = 16384
+pkg syscall (freebsd-arm64-cgo), const EV_ERROR ideal-int
+pkg syscall (freebsd-arm64-cgo), const EV_FLAG1 = 8192
+pkg syscall (freebsd-arm64-cgo), const EV_FLAG1 ideal-int
+pkg syscall (freebsd-arm64-cgo), const EV_ONESHOT = 16
+pkg syscall (freebsd-arm64-cgo), const EV_ONESHOT ideal-int
+pkg syscall (freebsd-arm64-cgo), const EV_RECEIPT = 64
+pkg syscall (freebsd-arm64-cgo), const EV_RECEIPT ideal-int
+pkg syscall (freebsd-arm64-cgo), const EV_SYSFLAGS = 61440
+pkg syscall (freebsd-arm64-cgo), const EV_SYSFLAGS ideal-int
+pkg syscall (freebsd-arm64-cgo), const EVFILT_AIO = -3
+pkg syscall (freebsd-arm64-cgo), const EVFILT_AIO ideal-int
+pkg syscall (freebsd-arm64-cgo), const EVFILT_FS = -9
+pkg syscall (freebsd-arm64-cgo), const EVFILT_FS ideal-int
+pkg syscall (freebsd-arm64-cgo), const EVFILT_LIO = -10
+pkg syscall (freebsd-arm64-cgo), const EVFILT_LIO ideal-int
+pkg syscall (freebsd-arm64-cgo), const EVFILT_PROC = -5
+pkg syscall (freebsd-arm64-cgo), const EVFILT_PROC ideal-int
+pkg syscall (freebsd-arm64-cgo), const EVFILT_READ = -1
+pkg syscall (freebsd-arm64-cgo), const EVFILT_READ ideal-int
+pkg syscall (freebsd-arm64-cgo), const EVFILT_SIGNAL = -6
+pkg syscall (freebsd-arm64-cgo), const EVFILT_SIGNAL ideal-int
+pkg syscall (freebsd-arm64-cgo), const EVFILT_SYSCOUNT = 11
+pkg syscall (freebsd-arm64-cgo), const EVFILT_SYSCOUNT ideal-int
+pkg syscall (freebsd-arm64-cgo), const EVFILT_TIMER = -7
+pkg syscall (freebsd-arm64-cgo), const EVFILT_TIMER ideal-int
+pkg syscall (freebsd-arm64-cgo), const EVFILT_USER = -11
+pkg syscall (freebsd-arm64-cgo), const EVFILT_USER ideal-int
+pkg syscall (freebsd-arm64-cgo), const EVFILT_VNODE = -4
+pkg syscall (freebsd-arm64-cgo), const EVFILT_VNODE ideal-int
+pkg syscall (freebsd-arm64-cgo), const EVFILT_WRITE = -2
+pkg syscall (freebsd-arm64-cgo), const EVFILT_WRITE ideal-int
+pkg syscall (freebsd-arm64-cgo), const EWOULDBLOCK = 35
+pkg syscall (freebsd-arm64-cgo), const EXDEV = 18
+pkg syscall (freebsd-arm64-cgo), const EXTA = 19200
+pkg syscall (freebsd-arm64-cgo), const EXTA ideal-int
+pkg syscall (freebsd-arm64-cgo), const EXTB = 38400
+pkg syscall (freebsd-arm64-cgo), const EXTB ideal-int
+pkg syscall (freebsd-arm64-cgo), const EXTPROC = 2048
+pkg syscall (freebsd-arm64-cgo), const EXTPROC ideal-int
+pkg syscall (freebsd-arm64-cgo), const F_CANCEL = 5
+pkg syscall (freebsd-arm64-cgo), const F_CANCEL ideal-int
+pkg syscall (freebsd-arm64-cgo), const F_DUP2FD = 10
+pkg syscall (freebsd-arm64-cgo), const F_DUP2FD ideal-int
+pkg syscall (freebsd-arm64-cgo), const F_DUP2FD_CLOEXEC = 18
+pkg syscall (freebsd-arm64-cgo), const F_DUP2FD_CLOEXEC ideal-int
+pkg syscall (freebsd-arm64-cgo), const F_DUPFD = 0
+pkg syscall (freebsd-arm64-cgo), const F_DUPFD ideal-int
+pkg syscall (freebsd-arm64-cgo), const F_DUPFD_CLOEXEC = 17
+pkg syscall (freebsd-arm64-cgo), const F_DUPFD_CLOEXEC ideal-int
+pkg syscall (freebsd-arm64-cgo), const F_GETFD = 1
+pkg syscall (freebsd-arm64-cgo), const F_GETFD ideal-int
+pkg syscall (freebsd-arm64-cgo), const F_GETFL = 3
+pkg syscall (freebsd-arm64-cgo), const F_GETFL ideal-int
+pkg syscall (freebsd-arm64-cgo), const F_GETLK = 11
+pkg syscall (freebsd-arm64-cgo), const F_GETLK ideal-int
+pkg syscall (freebsd-arm64-cgo), const F_GETOWN = 5
+pkg syscall (freebsd-arm64-cgo), const F_GETOWN ideal-int
+pkg syscall (freebsd-arm64-cgo), const F_OGETLK = 7
+pkg syscall (freebsd-arm64-cgo), const F_OGETLK ideal-int
+pkg syscall (freebsd-arm64-cgo), const F_OK = 0
+pkg syscall (freebsd-arm64-cgo), const F_OK ideal-int
+pkg syscall (freebsd-arm64-cgo), const F_OSETLK = 8
+pkg syscall (freebsd-arm64-cgo), const F_OSETLK ideal-int
+pkg syscall (freebsd-arm64-cgo), const F_OSETLKW = 9
+pkg syscall (freebsd-arm64-cgo), const F_OSETLKW ideal-int
+pkg syscall (freebsd-arm64-cgo), const F_RDAHEAD = 16
+pkg syscall (freebsd-arm64-cgo), const F_RDAHEAD ideal-int
+pkg syscall (freebsd-arm64-cgo), const F_RDLCK = 1
+pkg syscall (freebsd-arm64-cgo), const F_RDLCK ideal-int
+pkg syscall (freebsd-arm64-cgo), const F_READAHEAD = 15
+pkg syscall (freebsd-arm64-cgo), const F_READAHEAD ideal-int
+pkg syscall (freebsd-arm64-cgo), const F_SETFD = 2
+pkg syscall (freebsd-arm64-cgo), const F_SETFD ideal-int
+pkg syscall (freebsd-arm64-cgo), const F_SETFL = 4
+pkg syscall (freebsd-arm64-cgo), const F_SETFL ideal-int
+pkg syscall (freebsd-arm64-cgo), const F_SETLK = 12
+pkg syscall (freebsd-arm64-cgo), const F_SETLK ideal-int
+pkg syscall (freebsd-arm64-cgo), const F_SETLK_REMOTE = 14
+pkg syscall (freebsd-arm64-cgo), const F_SETLK_REMOTE ideal-int
+pkg syscall (freebsd-arm64-cgo), const F_SETLKW = 13
+pkg syscall (freebsd-arm64-cgo), const F_SETLKW ideal-int
+pkg syscall (freebsd-arm64-cgo), const F_SETOWN = 6
+pkg syscall (freebsd-arm64-cgo), const F_SETOWN ideal-int
+pkg syscall (freebsd-arm64-cgo), const F_UNLCK = 2
+pkg syscall (freebsd-arm64-cgo), const F_UNLCK ideal-int
+pkg syscall (freebsd-arm64-cgo), const F_UNLCKSYS = 4
+pkg syscall (freebsd-arm64-cgo), const F_UNLCKSYS ideal-int
+pkg syscall (freebsd-arm64-cgo), const F_WRLCK = 3
+pkg syscall (freebsd-arm64-cgo), const F_WRLCK ideal-int
+pkg syscall (freebsd-arm64-cgo), const FD_CLOEXEC = 1
+pkg syscall (freebsd-arm64-cgo), const FD_CLOEXEC ideal-int
+pkg syscall (freebsd-arm64-cgo), const FD_SETSIZE = 1024
+pkg syscall (freebsd-arm64-cgo), const FD_SETSIZE ideal-int
+pkg syscall (freebsd-arm64-cgo), const FLUSHO = 8388608
+pkg syscall (freebsd-arm64-cgo), const FLUSHO ideal-int
+pkg syscall (freebsd-arm64-cgo), const HUPCL = 16384
+pkg syscall (freebsd-arm64-cgo), const HUPCL ideal-int
+pkg syscall (freebsd-arm64-cgo), const ICANON = 256
+pkg syscall (freebsd-arm64-cgo), const ICANON ideal-int
+pkg syscall (freebsd-arm64-cgo), const ICMP6_FILTER = 18
+pkg syscall (freebsd-arm64-cgo), const ICMP6_FILTER ideal-int
+pkg syscall (freebsd-arm64-cgo), const ICRNL = 256
+pkg syscall (freebsd-arm64-cgo), const ICRNL ideal-int
+pkg syscall (freebsd-arm64-cgo), const IEXTEN = 1024
+pkg syscall (freebsd-arm64-cgo), const IEXTEN ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFAN_ARRIVAL = 0
+pkg syscall (freebsd-arm64-cgo), const IFAN_ARRIVAL ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFAN_DEPARTURE = 1
+pkg syscall (freebsd-arm64-cgo), const IFAN_DEPARTURE ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFF_ALLMULTI = 512
+pkg syscall (freebsd-arm64-cgo), const IFF_ALLMULTI ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFF_ALTPHYS = 16384
+pkg syscall (freebsd-arm64-cgo), const IFF_ALTPHYS ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFF_CANTCHANGE = 2199410
+pkg syscall (freebsd-arm64-cgo), const IFF_CANTCHANGE ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFF_CANTCONFIG = 65536
+pkg syscall (freebsd-arm64-cgo), const IFF_CANTCONFIG ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFF_DEBUG = 4
+pkg syscall (freebsd-arm64-cgo), const IFF_DEBUG ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFF_DRV_OACTIVE = 1024
+pkg syscall (freebsd-arm64-cgo), const IFF_DRV_OACTIVE ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFF_DRV_RUNNING = 64
+pkg syscall (freebsd-arm64-cgo), const IFF_DRV_RUNNING ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFF_DYING = 2097152
+pkg syscall (freebsd-arm64-cgo), const IFF_DYING ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFF_LINK0 = 4096
+pkg syscall (freebsd-arm64-cgo), const IFF_LINK0 ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFF_LINK1 = 8192
+pkg syscall (freebsd-arm64-cgo), const IFF_LINK1 ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFF_LINK2 = 16384
+pkg syscall (freebsd-arm64-cgo), const IFF_LINK2 ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFF_LOOPBACK = 8
+pkg syscall (freebsd-arm64-cgo), const IFF_MONITOR = 262144
+pkg syscall (freebsd-arm64-cgo), const IFF_MONITOR ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFF_MULTICAST = 32768
+pkg syscall (freebsd-arm64-cgo), const IFF_NOARP = 128
+pkg syscall (freebsd-arm64-cgo), const IFF_NOARP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFF_OACTIVE = 1024
+pkg syscall (freebsd-arm64-cgo), const IFF_OACTIVE ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFF_POINTOPOINT = 16
+pkg syscall (freebsd-arm64-cgo), const IFF_POINTOPOINT ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFF_PPROMISC = 131072
+pkg syscall (freebsd-arm64-cgo), const IFF_PPROMISC ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFF_PROMISC = 256
+pkg syscall (freebsd-arm64-cgo), const IFF_PROMISC ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFF_RENAMING = 4194304
+pkg syscall (freebsd-arm64-cgo), const IFF_RENAMING ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFF_RUNNING = 64
+pkg syscall (freebsd-arm64-cgo), const IFF_RUNNING ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFF_SIMPLEX = 2048
+pkg syscall (freebsd-arm64-cgo), const IFF_SIMPLEX ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFF_SMART = 32
+pkg syscall (freebsd-arm64-cgo), const IFF_SMART ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFF_STATICARP = 524288
+pkg syscall (freebsd-arm64-cgo), const IFF_STATICARP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFNAMSIZ = 16
+pkg syscall (freebsd-arm64-cgo), const IFNAMSIZ ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_1822 = 2
+pkg syscall (freebsd-arm64-cgo), const IFT_1822 ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_A12MPPSWITCH = 130
+pkg syscall (freebsd-arm64-cgo), const IFT_A12MPPSWITCH ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_AAL2 = 187
+pkg syscall (freebsd-arm64-cgo), const IFT_AAL2 ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_AAL5 = 49
+pkg syscall (freebsd-arm64-cgo), const IFT_AAL5 ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_ADSL = 94
+pkg syscall (freebsd-arm64-cgo), const IFT_ADSL ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_AFLANE8023 = 59
+pkg syscall (freebsd-arm64-cgo), const IFT_AFLANE8023 ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_AFLANE8025 = 60
+pkg syscall (freebsd-arm64-cgo), const IFT_AFLANE8025 ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_ARAP = 88
+pkg syscall (freebsd-arm64-cgo), const IFT_ARAP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_ARCNET = 35
+pkg syscall (freebsd-arm64-cgo), const IFT_ARCNET ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_ARCNETPLUS = 36
+pkg syscall (freebsd-arm64-cgo), const IFT_ARCNETPLUS ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_ASYNC = 84
+pkg syscall (freebsd-arm64-cgo), const IFT_ASYNC ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_ATM = 37
+pkg syscall (freebsd-arm64-cgo), const IFT_ATM ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_ATMDXI = 105
+pkg syscall (freebsd-arm64-cgo), const IFT_ATMDXI ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_ATMFUNI = 106
+pkg syscall (freebsd-arm64-cgo), const IFT_ATMFUNI ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_ATMIMA = 107
+pkg syscall (freebsd-arm64-cgo), const IFT_ATMIMA ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_ATMLOGICAL = 80
+pkg syscall (freebsd-arm64-cgo), const IFT_ATMLOGICAL ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_ATMRADIO = 189
+pkg syscall (freebsd-arm64-cgo), const IFT_ATMRADIO ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_ATMSUBINTERFACE = 134
+pkg syscall (freebsd-arm64-cgo), const IFT_ATMSUBINTERFACE ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_ATMVCIENDPT = 194
+pkg syscall (freebsd-arm64-cgo), const IFT_ATMVCIENDPT ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_ATMVIRTUAL = 149
+pkg syscall (freebsd-arm64-cgo), const IFT_ATMVIRTUAL ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_BGPPOLICYACCOUNTING = 162
+pkg syscall (freebsd-arm64-cgo), const IFT_BGPPOLICYACCOUNTING ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_BRIDGE = 209
+pkg syscall (freebsd-arm64-cgo), const IFT_BRIDGE ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_BSC = 83
+pkg syscall (freebsd-arm64-cgo), const IFT_BSC ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_CARP = 248
+pkg syscall (freebsd-arm64-cgo), const IFT_CARP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_CCTEMUL = 61
+pkg syscall (freebsd-arm64-cgo), const IFT_CCTEMUL ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_CEPT = 19
+pkg syscall (freebsd-arm64-cgo), const IFT_CEPT ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_CES = 133
+pkg syscall (freebsd-arm64-cgo), const IFT_CES ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_CHANNEL = 70
+pkg syscall (freebsd-arm64-cgo), const IFT_CHANNEL ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_CNR = 85
+pkg syscall (freebsd-arm64-cgo), const IFT_CNR ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_COFFEE = 132
+pkg syscall (freebsd-arm64-cgo), const IFT_COFFEE ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_COMPOSITELINK = 155
+pkg syscall (freebsd-arm64-cgo), const IFT_COMPOSITELINK ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_DCN = 141
+pkg syscall (freebsd-arm64-cgo), const IFT_DCN ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_DIGITALPOWERLINE = 138
+pkg syscall (freebsd-arm64-cgo), const IFT_DIGITALPOWERLINE ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_DIGITALWRAPPEROVERHEADCHANNEL = 186
+pkg syscall (freebsd-arm64-cgo), const IFT_DIGITALWRAPPEROVERHEADCHANNEL ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_DLSW = 74
+pkg syscall (freebsd-arm64-cgo), const IFT_DLSW ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_DOCSCABLEDOWNSTREAM = 128
+pkg syscall (freebsd-arm64-cgo), const IFT_DOCSCABLEDOWNSTREAM ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_DOCSCABLEMACLAYER = 127
+pkg syscall (freebsd-arm64-cgo), const IFT_DOCSCABLEMACLAYER ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_DOCSCABLEUPSTREAM = 129
+pkg syscall (freebsd-arm64-cgo), const IFT_DOCSCABLEUPSTREAM ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_DS0 = 81
+pkg syscall (freebsd-arm64-cgo), const IFT_DS0 ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_DS0BUNDLE = 82
+pkg syscall (freebsd-arm64-cgo), const IFT_DS0BUNDLE ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_DS1FDL = 170
+pkg syscall (freebsd-arm64-cgo), const IFT_DS1FDL ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_DS3 = 30
+pkg syscall (freebsd-arm64-cgo), const IFT_DS3 ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_DTM = 140
+pkg syscall (freebsd-arm64-cgo), const IFT_DTM ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_DVBASILN = 172
+pkg syscall (freebsd-arm64-cgo), const IFT_DVBASILN ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_DVBASIOUT = 173
+pkg syscall (freebsd-arm64-cgo), const IFT_DVBASIOUT ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_DVBRCCDOWNSTREAM = 147
+pkg syscall (freebsd-arm64-cgo), const IFT_DVBRCCDOWNSTREAM ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_DVBRCCMACLAYER = 146
+pkg syscall (freebsd-arm64-cgo), const IFT_DVBRCCMACLAYER ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_DVBRCCUPSTREAM = 148
+pkg syscall (freebsd-arm64-cgo), const IFT_DVBRCCUPSTREAM ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_ENC = 244
+pkg syscall (freebsd-arm64-cgo), const IFT_ENC ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_EON = 25
+pkg syscall (freebsd-arm64-cgo), const IFT_EON ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_EPLRS = 87
+pkg syscall (freebsd-arm64-cgo), const IFT_EPLRS ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_ESCON = 73
+pkg syscall (freebsd-arm64-cgo), const IFT_ESCON ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_ETHER = 6
+pkg syscall (freebsd-arm64-cgo), const IFT_ETHER ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_FAITH = 242
+pkg syscall (freebsd-arm64-cgo), const IFT_FAITH ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_FAST = 125
+pkg syscall (freebsd-arm64-cgo), const IFT_FAST ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_FASTETHER = 62
+pkg syscall (freebsd-arm64-cgo), const IFT_FASTETHER ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_FASTETHERFX = 69
+pkg syscall (freebsd-arm64-cgo), const IFT_FASTETHERFX ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_FDDI = 15
+pkg syscall (freebsd-arm64-cgo), const IFT_FDDI ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_FIBRECHANNEL = 56
+pkg syscall (freebsd-arm64-cgo), const IFT_FIBRECHANNEL ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_FRAMERELAYINTERCONNECT = 58
+pkg syscall (freebsd-arm64-cgo), const IFT_FRAMERELAYINTERCONNECT ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_FRAMERELAYMPI = 92
+pkg syscall (freebsd-arm64-cgo), const IFT_FRAMERELAYMPI ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_FRDLCIENDPT = 193
+pkg syscall (freebsd-arm64-cgo), const IFT_FRDLCIENDPT ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_FRELAY = 32
+pkg syscall (freebsd-arm64-cgo), const IFT_FRELAY ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_FRELAYDCE = 44
+pkg syscall (freebsd-arm64-cgo), const IFT_FRELAYDCE ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_FRF16MFRBUNDLE = 163
+pkg syscall (freebsd-arm64-cgo), const IFT_FRF16MFRBUNDLE ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_FRFORWARD = 158
+pkg syscall (freebsd-arm64-cgo), const IFT_FRFORWARD ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_G703AT2MB = 67
+pkg syscall (freebsd-arm64-cgo), const IFT_G703AT2MB ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_G703AT64K = 66
+pkg syscall (freebsd-arm64-cgo), const IFT_G703AT64K ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_GIF = 240
+pkg syscall (freebsd-arm64-cgo), const IFT_GIF ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_GIGABITETHERNET = 117
+pkg syscall (freebsd-arm64-cgo), const IFT_GIGABITETHERNET ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_GR303IDT = 178
+pkg syscall (freebsd-arm64-cgo), const IFT_GR303IDT ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_GR303RDT = 177
+pkg syscall (freebsd-arm64-cgo), const IFT_GR303RDT ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_H323GATEKEEPER = 164
+pkg syscall (freebsd-arm64-cgo), const IFT_H323GATEKEEPER ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_H323PROXY = 165
+pkg syscall (freebsd-arm64-cgo), const IFT_H323PROXY ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_HDH1822 = 3
+pkg syscall (freebsd-arm64-cgo), const IFT_HDH1822 ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_HDLC = 118
+pkg syscall (freebsd-arm64-cgo), const IFT_HDLC ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_HDSL2 = 168
+pkg syscall (freebsd-arm64-cgo), const IFT_HDSL2 ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_HIPERLAN2 = 183
+pkg syscall (freebsd-arm64-cgo), const IFT_HIPERLAN2 ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_HIPPI = 47
+pkg syscall (freebsd-arm64-cgo), const IFT_HIPPI ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_HIPPIINTERFACE = 57
+pkg syscall (freebsd-arm64-cgo), const IFT_HIPPIINTERFACE ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_HOSTPAD = 90
+pkg syscall (freebsd-arm64-cgo), const IFT_HOSTPAD ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_HSSI = 46
+pkg syscall (freebsd-arm64-cgo), const IFT_HSSI ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_HY = 14
+pkg syscall (freebsd-arm64-cgo), const IFT_HY ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_IBM370PARCHAN = 72
+pkg syscall (freebsd-arm64-cgo), const IFT_IBM370PARCHAN ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_IDSL = 154
+pkg syscall (freebsd-arm64-cgo), const IFT_IDSL ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_IEEE1394 = 144
+pkg syscall (freebsd-arm64-cgo), const IFT_IEEE1394 ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_IEEE80211 = 71
+pkg syscall (freebsd-arm64-cgo), const IFT_IEEE80211 ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_IEEE80212 = 55
+pkg syscall (freebsd-arm64-cgo), const IFT_IEEE80212 ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_IEEE8023ADLAG = 161
+pkg syscall (freebsd-arm64-cgo), const IFT_IEEE8023ADLAG ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_IFGSN = 145
+pkg syscall (freebsd-arm64-cgo), const IFT_IFGSN ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_IMT = 190
+pkg syscall (freebsd-arm64-cgo), const IFT_IMT ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_INFINIBAND = 199
+pkg syscall (freebsd-arm64-cgo), const IFT_INFINIBAND ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_INTERLEAVE = 124
+pkg syscall (freebsd-arm64-cgo), const IFT_INTERLEAVE ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_IP = 126
+pkg syscall (freebsd-arm64-cgo), const IFT_IP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_IPFORWARD = 142
+pkg syscall (freebsd-arm64-cgo), const IFT_IPFORWARD ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_IPOVERATM = 114
+pkg syscall (freebsd-arm64-cgo), const IFT_IPOVERATM ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_IPOVERCDLC = 109
+pkg syscall (freebsd-arm64-cgo), const IFT_IPOVERCDLC ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_IPOVERCLAW = 110
+pkg syscall (freebsd-arm64-cgo), const IFT_IPOVERCLAW ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_IPSWITCH = 78
+pkg syscall (freebsd-arm64-cgo), const IFT_IPSWITCH ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_IPXIP = 249
+pkg syscall (freebsd-arm64-cgo), const IFT_IPXIP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_ISDN = 63
+pkg syscall (freebsd-arm64-cgo), const IFT_ISDN ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_ISDNBASIC = 20
+pkg syscall (freebsd-arm64-cgo), const IFT_ISDNBASIC ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_ISDNPRIMARY = 21
+pkg syscall (freebsd-arm64-cgo), const IFT_ISDNPRIMARY ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_ISDNS = 75
+pkg syscall (freebsd-arm64-cgo), const IFT_ISDNS ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_ISDNU = 76
+pkg syscall (freebsd-arm64-cgo), const IFT_ISDNU ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_ISO88022LLC = 41
+pkg syscall (freebsd-arm64-cgo), const IFT_ISO88022LLC ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_ISO88023 = 7
+pkg syscall (freebsd-arm64-cgo), const IFT_ISO88023 ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_ISO88024 = 8
+pkg syscall (freebsd-arm64-cgo), const IFT_ISO88024 ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_ISO88025 = 9
+pkg syscall (freebsd-arm64-cgo), const IFT_ISO88025 ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_ISO88025CRFPINT = 98
+pkg syscall (freebsd-arm64-cgo), const IFT_ISO88025CRFPINT ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_ISO88025DTR = 86
+pkg syscall (freebsd-arm64-cgo), const IFT_ISO88025DTR ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_ISO88025FIBER = 115
+pkg syscall (freebsd-arm64-cgo), const IFT_ISO88025FIBER ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_ISO88026 = 10
+pkg syscall (freebsd-arm64-cgo), const IFT_ISO88026 ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_ISUP = 179
+pkg syscall (freebsd-arm64-cgo), const IFT_ISUP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_L2VLAN = 135
+pkg syscall (freebsd-arm64-cgo), const IFT_L2VLAN ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_L3IPVLAN = 136
+pkg syscall (freebsd-arm64-cgo), const IFT_L3IPVLAN ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_L3IPXVLAN = 137
+pkg syscall (freebsd-arm64-cgo), const IFT_L3IPXVLAN ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_LAPB = 16
+pkg syscall (freebsd-arm64-cgo), const IFT_LAPB ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_LAPD = 77
+pkg syscall (freebsd-arm64-cgo), const IFT_LAPD ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_LAPF = 119
+pkg syscall (freebsd-arm64-cgo), const IFT_LAPF ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_LOCALTALK = 42
+pkg syscall (freebsd-arm64-cgo), const IFT_LOCALTALK ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_LOOP = 24
+pkg syscall (freebsd-arm64-cgo), const IFT_LOOP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_MEDIAMAILOVERIP = 139
+pkg syscall (freebsd-arm64-cgo), const IFT_MEDIAMAILOVERIP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_MFSIGLINK = 167
+pkg syscall (freebsd-arm64-cgo), const IFT_MFSIGLINK ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_MIOX25 = 38
+pkg syscall (freebsd-arm64-cgo), const IFT_MIOX25 ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_MODEM = 48
+pkg syscall (freebsd-arm64-cgo), const IFT_MODEM ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_MPC = 113
+pkg syscall (freebsd-arm64-cgo), const IFT_MPC ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_MPLS = 166
+pkg syscall (freebsd-arm64-cgo), const IFT_MPLS ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_MPLSTUNNEL = 150
+pkg syscall (freebsd-arm64-cgo), const IFT_MPLSTUNNEL ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_MSDSL = 143
+pkg syscall (freebsd-arm64-cgo), const IFT_MSDSL ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_MVL = 191
+pkg syscall (freebsd-arm64-cgo), const IFT_MVL ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_MYRINET = 99
+pkg syscall (freebsd-arm64-cgo), const IFT_MYRINET ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_NFAS = 175
+pkg syscall (freebsd-arm64-cgo), const IFT_NFAS ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_NSIP = 27
+pkg syscall (freebsd-arm64-cgo), const IFT_NSIP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_OPTICALCHANNEL = 195
+pkg syscall (freebsd-arm64-cgo), const IFT_OPTICALCHANNEL ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_OPTICALTRANSPORT = 196
+pkg syscall (freebsd-arm64-cgo), const IFT_OPTICALTRANSPORT ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_OTHER = 1
+pkg syscall (freebsd-arm64-cgo), const IFT_OTHER ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_P10 = 12
+pkg syscall (freebsd-arm64-cgo), const IFT_P10 ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_P80 = 13
+pkg syscall (freebsd-arm64-cgo), const IFT_P80 ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_PARA = 34
+pkg syscall (freebsd-arm64-cgo), const IFT_PARA ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_PFLOG = 246
+pkg syscall (freebsd-arm64-cgo), const IFT_PFLOG ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_PFSYNC = 247
+pkg syscall (freebsd-arm64-cgo), const IFT_PFSYNC ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_PLC = 174
+pkg syscall (freebsd-arm64-cgo), const IFT_PLC ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_POS = 171
+pkg syscall (freebsd-arm64-cgo), const IFT_POS ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_PPP = 23
+pkg syscall (freebsd-arm64-cgo), const IFT_PPP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_PPPMULTILINKBUNDLE = 108
+pkg syscall (freebsd-arm64-cgo), const IFT_PPPMULTILINKBUNDLE ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_PROPBWAP2MP = 184
+pkg syscall (freebsd-arm64-cgo), const IFT_PROPBWAP2MP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_PROPCNLS = 89
+pkg syscall (freebsd-arm64-cgo), const IFT_PROPCNLS ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_PROPDOCSWIRELESSDOWNSTREAM = 181
+pkg syscall (freebsd-arm64-cgo), const IFT_PROPDOCSWIRELESSDOWNSTREAM ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_PROPDOCSWIRELESSMACLAYER = 180
+pkg syscall (freebsd-arm64-cgo), const IFT_PROPDOCSWIRELESSMACLAYER ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_PROPDOCSWIRELESSUPSTREAM = 182
+pkg syscall (freebsd-arm64-cgo), const IFT_PROPDOCSWIRELESSUPSTREAM ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_PROPMUX = 54
+pkg syscall (freebsd-arm64-cgo), const IFT_PROPMUX ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_PROPVIRTUAL = 53
+pkg syscall (freebsd-arm64-cgo), const IFT_PROPVIRTUAL ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_PROPWIRELESSP2P = 157
+pkg syscall (freebsd-arm64-cgo), const IFT_PROPWIRELESSP2P ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_PTPSERIAL = 22
+pkg syscall (freebsd-arm64-cgo), const IFT_PTPSERIAL ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_PVC = 241
+pkg syscall (freebsd-arm64-cgo), const IFT_PVC ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_QLLC = 68
+pkg syscall (freebsd-arm64-cgo), const IFT_QLLC ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_RADIOMAC = 188
+pkg syscall (freebsd-arm64-cgo), const IFT_RADIOMAC ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_RADSL = 95
+pkg syscall (freebsd-arm64-cgo), const IFT_RADSL ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_REACHDSL = 192
+pkg syscall (freebsd-arm64-cgo), const IFT_REACHDSL ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_RFC1483 = 159
+pkg syscall (freebsd-arm64-cgo), const IFT_RFC1483 ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_RS232 = 33
+pkg syscall (freebsd-arm64-cgo), const IFT_RS232 ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_RSRB = 79
+pkg syscall (freebsd-arm64-cgo), const IFT_RSRB ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_SDLC = 17
+pkg syscall (freebsd-arm64-cgo), const IFT_SDLC ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_SDSL = 96
+pkg syscall (freebsd-arm64-cgo), const IFT_SDSL ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_SHDSL = 169
+pkg syscall (freebsd-arm64-cgo), const IFT_SHDSL ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_SIP = 31
+pkg syscall (freebsd-arm64-cgo), const IFT_SIP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_SLIP = 28
+pkg syscall (freebsd-arm64-cgo), const IFT_SLIP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_SMDSDXI = 43
+pkg syscall (freebsd-arm64-cgo), const IFT_SMDSDXI ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_SMDSICIP = 52
+pkg syscall (freebsd-arm64-cgo), const IFT_SMDSICIP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_SONET = 39
+pkg syscall (freebsd-arm64-cgo), const IFT_SONET ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_SONETOVERHEADCHANNEL = 185
+pkg syscall (freebsd-arm64-cgo), const IFT_SONETOVERHEADCHANNEL ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_SONETPATH = 50
+pkg syscall (freebsd-arm64-cgo), const IFT_SONETPATH ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_SONETVT = 51
+pkg syscall (freebsd-arm64-cgo), const IFT_SONETVT ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_SRP = 151
+pkg syscall (freebsd-arm64-cgo), const IFT_SRP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_SS7SIGLINK = 156
+pkg syscall (freebsd-arm64-cgo), const IFT_SS7SIGLINK ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_STACKTOSTACK = 111
+pkg syscall (freebsd-arm64-cgo), const IFT_STACKTOSTACK ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_STARLAN = 11
+pkg syscall (freebsd-arm64-cgo), const IFT_STARLAN ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_STF = 215
+pkg syscall (freebsd-arm64-cgo), const IFT_STF ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_T1 = 18
+pkg syscall (freebsd-arm64-cgo), const IFT_T1 ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_TDLC = 116
+pkg syscall (freebsd-arm64-cgo), const IFT_TDLC ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_TERMPAD = 91
+pkg syscall (freebsd-arm64-cgo), const IFT_TERMPAD ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_TR008 = 176
+pkg syscall (freebsd-arm64-cgo), const IFT_TR008 ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_TRANSPHDLC = 123
+pkg syscall (freebsd-arm64-cgo), const IFT_TRANSPHDLC ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_TUNNEL = 131
+pkg syscall (freebsd-arm64-cgo), const IFT_TUNNEL ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_ULTRA = 29
+pkg syscall (freebsd-arm64-cgo), const IFT_ULTRA ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_USB = 160
+pkg syscall (freebsd-arm64-cgo), const IFT_USB ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_V11 = 64
+pkg syscall (freebsd-arm64-cgo), const IFT_V11 ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_V35 = 45
+pkg syscall (freebsd-arm64-cgo), const IFT_V35 ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_V36 = 65
+pkg syscall (freebsd-arm64-cgo), const IFT_V36 ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_V37 = 120
+pkg syscall (freebsd-arm64-cgo), const IFT_V37 ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_VDSL = 97
+pkg syscall (freebsd-arm64-cgo), const IFT_VDSL ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_VIRTUALIPADDRESS = 112
+pkg syscall (freebsd-arm64-cgo), const IFT_VIRTUALIPADDRESS ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_VOICEEM = 100
+pkg syscall (freebsd-arm64-cgo), const IFT_VOICEEM ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_VOICEENCAP = 103
+pkg syscall (freebsd-arm64-cgo), const IFT_VOICEENCAP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_VOICEFXO = 101
+pkg syscall (freebsd-arm64-cgo), const IFT_VOICEFXO ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_VOICEFXS = 102
+pkg syscall (freebsd-arm64-cgo), const IFT_VOICEFXS ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_VOICEOVERATM = 152
+pkg syscall (freebsd-arm64-cgo), const IFT_VOICEOVERATM ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_VOICEOVERFRAMERELAY = 153
+pkg syscall (freebsd-arm64-cgo), const IFT_VOICEOVERFRAMERELAY ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_VOICEOVERIP = 104
+pkg syscall (freebsd-arm64-cgo), const IFT_VOICEOVERIP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_X213 = 93
+pkg syscall (freebsd-arm64-cgo), const IFT_X213 ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_X25 = 5
+pkg syscall (freebsd-arm64-cgo), const IFT_X25 ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_X25DDN = 4
+pkg syscall (freebsd-arm64-cgo), const IFT_X25DDN ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_X25HUNTGROUP = 122
+pkg syscall (freebsd-arm64-cgo), const IFT_X25HUNTGROUP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_X25MLP = 121
+pkg syscall (freebsd-arm64-cgo), const IFT_X25MLP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_X25PLE = 40
+pkg syscall (freebsd-arm64-cgo), const IFT_X25PLE ideal-int
+pkg syscall (freebsd-arm64-cgo), const IFT_XETHER = 26
+pkg syscall (freebsd-arm64-cgo), const IFT_XETHER ideal-int
+pkg syscall (freebsd-arm64-cgo), const IGNBRK = 1
+pkg syscall (freebsd-arm64-cgo), const IGNBRK ideal-int
+pkg syscall (freebsd-arm64-cgo), const IGNCR = 128
+pkg syscall (freebsd-arm64-cgo), const IGNCR ideal-int
+pkg syscall (freebsd-arm64-cgo), const IGNPAR = 4
+pkg syscall (freebsd-arm64-cgo), const IGNPAR ideal-int
+pkg syscall (freebsd-arm64-cgo), const IMAXBEL = 8192
+pkg syscall (freebsd-arm64-cgo), const IMAXBEL ideal-int
+pkg syscall (freebsd-arm64-cgo), const IN_CLASSA_HOST = 16777215
+pkg syscall (freebsd-arm64-cgo), const IN_CLASSA_HOST ideal-int
+pkg syscall (freebsd-arm64-cgo), const IN_CLASSA_MAX = 128
+pkg syscall (freebsd-arm64-cgo), const IN_CLASSA_MAX ideal-int
+pkg syscall (freebsd-arm64-cgo), const IN_CLASSA_NET = 4278190080
+pkg syscall (freebsd-arm64-cgo), const IN_CLASSA_NET ideal-int
+pkg syscall (freebsd-arm64-cgo), const IN_CLASSA_NSHIFT = 24
+pkg syscall (freebsd-arm64-cgo), const IN_CLASSA_NSHIFT ideal-int
+pkg syscall (freebsd-arm64-cgo), const IN_CLASSB_HOST = 65535
+pkg syscall (freebsd-arm64-cgo), const IN_CLASSB_HOST ideal-int
+pkg syscall (freebsd-arm64-cgo), const IN_CLASSB_MAX = 65536
+pkg syscall (freebsd-arm64-cgo), const IN_CLASSB_MAX ideal-int
+pkg syscall (freebsd-arm64-cgo), const IN_CLASSB_NET = 4294901760
+pkg syscall (freebsd-arm64-cgo), const IN_CLASSB_NET ideal-int
+pkg syscall (freebsd-arm64-cgo), const IN_CLASSB_NSHIFT = 16
+pkg syscall (freebsd-arm64-cgo), const IN_CLASSB_NSHIFT ideal-int
+pkg syscall (freebsd-arm64-cgo), const IN_CLASSC_HOST = 255
+pkg syscall (freebsd-arm64-cgo), const IN_CLASSC_HOST ideal-int
+pkg syscall (freebsd-arm64-cgo), const IN_CLASSC_NET = 4294967040
+pkg syscall (freebsd-arm64-cgo), const IN_CLASSC_NET ideal-int
+pkg syscall (freebsd-arm64-cgo), const IN_CLASSC_NSHIFT = 8
+pkg syscall (freebsd-arm64-cgo), const IN_CLASSC_NSHIFT ideal-int
+pkg syscall (freebsd-arm64-cgo), const IN_CLASSD_HOST = 268435455
+pkg syscall (freebsd-arm64-cgo), const IN_CLASSD_HOST ideal-int
+pkg syscall (freebsd-arm64-cgo), const IN_CLASSD_NET = 4026531840
+pkg syscall (freebsd-arm64-cgo), const IN_CLASSD_NET ideal-int
+pkg syscall (freebsd-arm64-cgo), const IN_CLASSD_NSHIFT = 28
+pkg syscall (freebsd-arm64-cgo), const IN_CLASSD_NSHIFT ideal-int
+pkg syscall (freebsd-arm64-cgo), const IN_LOOPBACKNET = 127
+pkg syscall (freebsd-arm64-cgo), const IN_LOOPBACKNET ideal-int
+pkg syscall (freebsd-arm64-cgo), const IN_RFC3021_MASK = 4294967294
+pkg syscall (freebsd-arm64-cgo), const IN_RFC3021_MASK ideal-int
+pkg syscall (freebsd-arm64-cgo), const INLCR = 64
+pkg syscall (freebsd-arm64-cgo), const INLCR ideal-int
+pkg syscall (freebsd-arm64-cgo), const INPCK = 16
+pkg syscall (freebsd-arm64-cgo), const INPCK ideal-int
+pkg syscall (freebsd-arm64-cgo), const IP_ADD_MEMBERSHIP = 12
+pkg syscall (freebsd-arm64-cgo), const IP_ADD_SOURCE_MEMBERSHIP = 70
+pkg syscall (freebsd-arm64-cgo), const IP_ADD_SOURCE_MEMBERSHIP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IP_BINDANY = 24
+pkg syscall (freebsd-arm64-cgo), const IP_BINDANY ideal-int
+pkg syscall (freebsd-arm64-cgo), const IP_BLOCK_SOURCE = 72
+pkg syscall (freebsd-arm64-cgo), const IP_BLOCK_SOURCE ideal-int
+pkg syscall (freebsd-arm64-cgo), const IP_DEFAULT_MULTICAST_LOOP = 1
+pkg syscall (freebsd-arm64-cgo), const IP_DEFAULT_MULTICAST_LOOP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IP_DEFAULT_MULTICAST_TTL = 1
+pkg syscall (freebsd-arm64-cgo), const IP_DEFAULT_MULTICAST_TTL ideal-int
+pkg syscall (freebsd-arm64-cgo), const IP_DF = 16384
+pkg syscall (freebsd-arm64-cgo), const IP_DF ideal-int
+pkg syscall (freebsd-arm64-cgo), const IP_DONTFRAG = 67
+pkg syscall (freebsd-arm64-cgo), const IP_DONTFRAG ideal-int
+pkg syscall (freebsd-arm64-cgo), const IP_DROP_MEMBERSHIP = 13
+pkg syscall (freebsd-arm64-cgo), const IP_DROP_SOURCE_MEMBERSHIP = 71
+pkg syscall (freebsd-arm64-cgo), const IP_DROP_SOURCE_MEMBERSHIP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IP_DUMMYNET_CONFIGURE = 60
+pkg syscall (freebsd-arm64-cgo), const IP_DUMMYNET_CONFIGURE ideal-int
+pkg syscall (freebsd-arm64-cgo), const IP_DUMMYNET_DEL = 61
+pkg syscall (freebsd-arm64-cgo), const IP_DUMMYNET_DEL ideal-int
+pkg syscall (freebsd-arm64-cgo), const IP_DUMMYNET_FLUSH = 62
+pkg syscall (freebsd-arm64-cgo), const IP_DUMMYNET_FLUSH ideal-int
+pkg syscall (freebsd-arm64-cgo), const IP_DUMMYNET_GET = 64
+pkg syscall (freebsd-arm64-cgo), const IP_DUMMYNET_GET ideal-int
+pkg syscall (freebsd-arm64-cgo), const IP_DUMMYNET3 = 49
+pkg syscall (freebsd-arm64-cgo), const IP_DUMMYNET3 ideal-int
+pkg syscall (freebsd-arm64-cgo), const IP_FAITH = 22
+pkg syscall (freebsd-arm64-cgo), const IP_FAITH ideal-int
+pkg syscall (freebsd-arm64-cgo), const IP_FW_ADD = 50
+pkg syscall (freebsd-arm64-cgo), const IP_FW_ADD ideal-int
+pkg syscall (freebsd-arm64-cgo), const IP_FW_DEL = 51
+pkg syscall (freebsd-arm64-cgo), const IP_FW_DEL ideal-int
+pkg syscall (freebsd-arm64-cgo), const IP_FW_FLUSH = 52
+pkg syscall (freebsd-arm64-cgo), const IP_FW_FLUSH ideal-int
+pkg syscall (freebsd-arm64-cgo), const IP_FW_GET = 54
+pkg syscall (freebsd-arm64-cgo), const IP_FW_GET ideal-int
+pkg syscall (freebsd-arm64-cgo), const IP_FW_NAT_CFG = 56
+pkg syscall (freebsd-arm64-cgo), const IP_FW_NAT_CFG ideal-int
+pkg syscall (freebsd-arm64-cgo), const IP_FW_NAT_DEL = 57
+pkg syscall (freebsd-arm64-cgo), const IP_FW_NAT_DEL ideal-int
+pkg syscall (freebsd-arm64-cgo), const IP_FW_NAT_GET_CONFIG = 58
+pkg syscall (freebsd-arm64-cgo), const IP_FW_NAT_GET_CONFIG ideal-int
+pkg syscall (freebsd-arm64-cgo), const IP_FW_NAT_GET_LOG = 59
+pkg syscall (freebsd-arm64-cgo), const IP_FW_NAT_GET_LOG ideal-int
+pkg syscall (freebsd-arm64-cgo), const IP_FW_RESETLOG = 55
+pkg syscall (freebsd-arm64-cgo), const IP_FW_RESETLOG ideal-int
+pkg syscall (freebsd-arm64-cgo), const IP_FW_TABLE_ADD = 40
+pkg syscall (freebsd-arm64-cgo), const IP_FW_TABLE_ADD ideal-int
+pkg syscall (freebsd-arm64-cgo), const IP_FW_TABLE_DEL = 41
+pkg syscall (freebsd-arm64-cgo), const IP_FW_TABLE_DEL ideal-int
+pkg syscall (freebsd-arm64-cgo), const IP_FW_TABLE_FLUSH = 42
+pkg syscall (freebsd-arm64-cgo), const IP_FW_TABLE_FLUSH ideal-int
+pkg syscall (freebsd-arm64-cgo), const IP_FW_TABLE_GETSIZE = 43
+pkg syscall (freebsd-arm64-cgo), const IP_FW_TABLE_GETSIZE ideal-int
+pkg syscall (freebsd-arm64-cgo), const IP_FW_TABLE_LIST = 44
+pkg syscall (freebsd-arm64-cgo), const IP_FW_TABLE_LIST ideal-int
+pkg syscall (freebsd-arm64-cgo), const IP_FW_ZERO = 53
+pkg syscall (freebsd-arm64-cgo), const IP_FW_ZERO ideal-int
+pkg syscall (freebsd-arm64-cgo), const IP_FW3 = 48
+pkg syscall (freebsd-arm64-cgo), const IP_FW3 ideal-int
+pkg syscall (freebsd-arm64-cgo), const IP_HDRINCL = 2
+pkg syscall (freebsd-arm64-cgo), const IP_HDRINCL ideal-int
+pkg syscall (freebsd-arm64-cgo), const IP_IPSEC_POLICY = 21
+pkg syscall (freebsd-arm64-cgo), const IP_IPSEC_POLICY ideal-int
+pkg syscall (freebsd-arm64-cgo), const IP_MAX_GROUP_SRC_FILTER = 512
+pkg syscall (freebsd-arm64-cgo), const IP_MAX_GROUP_SRC_FILTER ideal-int
+pkg syscall (freebsd-arm64-cgo), const IP_MAX_MEMBERSHIPS = 4095
+pkg syscall (freebsd-arm64-cgo), const IP_MAX_MEMBERSHIPS ideal-int
+pkg syscall (freebsd-arm64-cgo), const IP_MAX_SOCK_MUTE_FILTER = 128
+pkg syscall (freebsd-arm64-cgo), const IP_MAX_SOCK_MUTE_FILTER ideal-int
+pkg syscall (freebsd-arm64-cgo), const IP_MAX_SOCK_SRC_FILTER = 128
+pkg syscall (freebsd-arm64-cgo), const IP_MAX_SOCK_SRC_FILTER ideal-int
+pkg syscall (freebsd-arm64-cgo), const IP_MAX_SOURCE_FILTER = 1024
+pkg syscall (freebsd-arm64-cgo), const IP_MAX_SOURCE_FILTER ideal-int
+pkg syscall (freebsd-arm64-cgo), const IP_MAXPACKET = 65535
+pkg syscall (freebsd-arm64-cgo), const IP_MAXPACKET ideal-int
+pkg syscall (freebsd-arm64-cgo), const IP_MF = 8192
+pkg syscall (freebsd-arm64-cgo), const IP_MF ideal-int
+pkg syscall (freebsd-arm64-cgo), const IP_MIN_MEMBERSHIPS = 31
+pkg syscall (freebsd-arm64-cgo), const IP_MIN_MEMBERSHIPS ideal-int
+pkg syscall (freebsd-arm64-cgo), const IP_MINTTL = 66
+pkg syscall (freebsd-arm64-cgo), const IP_MINTTL ideal-int
+pkg syscall (freebsd-arm64-cgo), const IP_MSFILTER = 74
+pkg syscall (freebsd-arm64-cgo), const IP_MSFILTER ideal-int
+pkg syscall (freebsd-arm64-cgo), const IP_MSS = 576
+pkg syscall (freebsd-arm64-cgo), const IP_MSS ideal-int
+pkg syscall (freebsd-arm64-cgo), const IP_MULTICAST_IF = 9
+pkg syscall (freebsd-arm64-cgo), const IP_MULTICAST_LOOP = 11
+pkg syscall (freebsd-arm64-cgo), const IP_MULTICAST_TTL = 10
+pkg syscall (freebsd-arm64-cgo), const IP_MULTICAST_VIF = 14
+pkg syscall (freebsd-arm64-cgo), const IP_MULTICAST_VIF ideal-int
+pkg syscall (freebsd-arm64-cgo), const IP_OFFMASK = 8191
+pkg syscall (freebsd-arm64-cgo), const IP_OFFMASK ideal-int
+pkg syscall (freebsd-arm64-cgo), const IP_ONESBCAST = 23
+pkg syscall (freebsd-arm64-cgo), const IP_ONESBCAST ideal-int
+pkg syscall (freebsd-arm64-cgo), const IP_OPTIONS = 1
+pkg syscall (freebsd-arm64-cgo), const IP_OPTIONS ideal-int
+pkg syscall (freebsd-arm64-cgo), const IP_PORTRANGE = 19
+pkg syscall (freebsd-arm64-cgo), const IP_PORTRANGE ideal-int
+pkg syscall (freebsd-arm64-cgo), const IP_PORTRANGE_DEFAULT = 0
+pkg syscall (freebsd-arm64-cgo), const IP_PORTRANGE_DEFAULT ideal-int
+pkg syscall (freebsd-arm64-cgo), const IP_PORTRANGE_HIGH = 1
+pkg syscall (freebsd-arm64-cgo), const IP_PORTRANGE_HIGH ideal-int
+pkg syscall (freebsd-arm64-cgo), const IP_PORTRANGE_LOW = 2
+pkg syscall (freebsd-arm64-cgo), const IP_PORTRANGE_LOW ideal-int
+pkg syscall (freebsd-arm64-cgo), const IP_RECVDSTADDR = 7
+pkg syscall (freebsd-arm64-cgo), const IP_RECVDSTADDR ideal-int
+pkg syscall (freebsd-arm64-cgo), const IP_RECVIF = 20
+pkg syscall (freebsd-arm64-cgo), const IP_RECVIF ideal-int
+pkg syscall (freebsd-arm64-cgo), const IP_RECVOPTS = 5
+pkg syscall (freebsd-arm64-cgo), const IP_RECVOPTS ideal-int
+pkg syscall (freebsd-arm64-cgo), const IP_RECVRETOPTS = 6
+pkg syscall (freebsd-arm64-cgo), const IP_RECVRETOPTS ideal-int
+pkg syscall (freebsd-arm64-cgo), const IP_RECVTOS = 68
+pkg syscall (freebsd-arm64-cgo), const IP_RECVTOS ideal-int
+pkg syscall (freebsd-arm64-cgo), const IP_RECVTTL = 65
+pkg syscall (freebsd-arm64-cgo), const IP_RECVTTL ideal-int
+pkg syscall (freebsd-arm64-cgo), const IP_RETOPTS = 8
+pkg syscall (freebsd-arm64-cgo), const IP_RETOPTS ideal-int
+pkg syscall (freebsd-arm64-cgo), const IP_RF = 32768
+pkg syscall (freebsd-arm64-cgo), const IP_RF ideal-int
+pkg syscall (freebsd-arm64-cgo), const IP_RSVP_OFF = 16
+pkg syscall (freebsd-arm64-cgo), const IP_RSVP_OFF ideal-int
+pkg syscall (freebsd-arm64-cgo), const IP_RSVP_ON = 15
+pkg syscall (freebsd-arm64-cgo), const IP_RSVP_ON ideal-int
+pkg syscall (freebsd-arm64-cgo), const IP_RSVP_VIF_OFF = 18
+pkg syscall (freebsd-arm64-cgo), const IP_RSVP_VIF_OFF ideal-int
+pkg syscall (freebsd-arm64-cgo), const IP_RSVP_VIF_ON = 17
+pkg syscall (freebsd-arm64-cgo), const IP_RSVP_VIF_ON ideal-int
+pkg syscall (freebsd-arm64-cgo), const IP_SENDSRCADDR = 7
+pkg syscall (freebsd-arm64-cgo), const IP_SENDSRCADDR ideal-int
+pkg syscall (freebsd-arm64-cgo), const IP_TOS = 3
+pkg syscall (freebsd-arm64-cgo), const IP_TTL = 4
+pkg syscall (freebsd-arm64-cgo), const IP_UNBLOCK_SOURCE = 73
+pkg syscall (freebsd-arm64-cgo), const IP_UNBLOCK_SOURCE ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_3PC = 34
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_3PC ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_ADFS = 68
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_ADFS ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_AH = 51
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_AH ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_AHIP = 61
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_AHIP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_APES = 99
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_APES ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_ARGUS = 13
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_ARGUS ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_AX25 = 93
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_AX25 ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_BHA = 49
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_BHA ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_BLT = 30
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_BLT ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_BRSATMON = 76
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_BRSATMON ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_CARP = 112
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_CARP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_CFTP = 62
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_CFTP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_CHAOS = 16
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_CHAOS ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_CMTP = 38
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_CMTP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_CPHB = 73
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_CPHB ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_CPNX = 72
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_CPNX ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_DDP = 37
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_DDP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_DGP = 86
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_DGP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_DIVERT = 258
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_DIVERT ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_DONE = 257
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_DONE ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_DSTOPTS = 60
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_DSTOPTS ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_EGP = 8
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_EGP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_EMCON = 14
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_EMCON ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_ENCAP = 98
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_ENCAP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_EON = 80
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_EON ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_ESP = 50
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_ESP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_ETHERIP = 97
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_ETHERIP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_FRAGMENT = 44
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_FRAGMENT ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_GGP = 3
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_GGP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_GMTP = 100
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_GMTP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_GRE = 47
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_GRE ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_HELLO = 63
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_HELLO ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_HMP = 20
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_HMP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_HOPOPTS = 0
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_HOPOPTS ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_ICMP = 1
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_ICMP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_ICMPV6 = 58
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_ICMPV6 ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_IDP = 22
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_IDP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_IDPR = 35
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_IDPR ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_IDRP = 45
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_IDRP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_IGMP = 2
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_IGMP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_IGP = 85
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_IGP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_IGRP = 88
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_IGRP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_IL = 40
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_IL ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_INLSP = 52
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_INLSP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_INP = 32
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_INP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_IPCOMP = 108
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_IPCOMP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_IPCV = 71
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_IPCV ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_IPEIP = 94
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_IPEIP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_IPIP = 4
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_IPIP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_IPPC = 67
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_IPPC ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_IPV4 = 4
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_IPV4 ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_IRTP = 28
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_IRTP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_KRYPTOLAN = 65
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_KRYPTOLAN ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_LARP = 91
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_LARP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_LEAF1 = 25
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_LEAF1 ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_LEAF2 = 26
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_LEAF2 ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_MAX = 256
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_MAX ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_MAXID = 52
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_MAXID ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_MEAS = 19
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_MEAS ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_MH = 135
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_MH ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_MHRP = 48
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_MHRP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_MICP = 95
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_MICP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_MOBILE = 55
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_MOBILE ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_MPLS = 137
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_MPLS ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_MTP = 92
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_MTP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_MUX = 18
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_MUX ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_ND = 77
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_ND ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_NHRP = 54
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_NHRP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_NONE = 59
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_NONE ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_NSP = 31
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_NSP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_NVPII = 11
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_NVPII ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_OLD_DIVERT = 254
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_OLD_DIVERT ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_OSPFIGP = 89
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_OSPFIGP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_PFSYNC = 240
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_PFSYNC ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_PGM = 113
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_PGM ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_PIGP = 9
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_PIGP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_PIM = 103
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_PIM ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_PRM = 21
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_PRM ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_PUP = 12
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_PUP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_PVP = 75
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_PVP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_RAW = 255
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_RAW ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_RCCMON = 10
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_RCCMON ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_RDP = 27
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_RDP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_ROUTING = 43
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_ROUTING ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_RSVP = 46
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_RSVP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_RVD = 66
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_RVD ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_SATEXPAK = 64
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_SATEXPAK ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_SATMON = 69
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_SATMON ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_SCCSP = 96
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_SCCSP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_SCTP = 132
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_SCTP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_SDRP = 42
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_SDRP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_SEND = 259
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_SEND ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_SEP = 33
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_SEP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_SKIP = 57
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_SKIP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_SPACER = 32767
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_SPACER ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_SRPC = 90
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_SRPC ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_ST = 7
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_ST ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_SVMTP = 82
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_SVMTP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_SWIPE = 53
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_SWIPE ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_TCF = 87
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_TCF ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_TLSP = 56
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_TLSP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_TP = 29
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_TP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_TPXX = 39
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_TPXX ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_TRUNK1 = 23
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_TRUNK1 ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_TRUNK2 = 24
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_TRUNK2 ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_TTP = 84
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_TTP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_VINES = 83
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_VINES ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_VISA = 70
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_VISA ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_VMTP = 81
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_VMTP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_WBEXPAK = 79
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_WBEXPAK ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_WBMON = 78
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_WBMON ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_WSN = 74
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_WSN ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_XNET = 15
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_XNET ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_XTP = 36
+pkg syscall (freebsd-arm64-cgo), const IPPROTO_XTP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPV6_AUTOFLOWLABEL = 59
+pkg syscall (freebsd-arm64-cgo), const IPV6_AUTOFLOWLABEL ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPV6_BINDANY = 64
+pkg syscall (freebsd-arm64-cgo), const IPV6_BINDANY ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPV6_BINDV6ONLY = 27
+pkg syscall (freebsd-arm64-cgo), const IPV6_BINDV6ONLY ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPV6_CHECKSUM = 26
+pkg syscall (freebsd-arm64-cgo), const IPV6_CHECKSUM ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPV6_DEFAULT_MULTICAST_HOPS = 1
+pkg syscall (freebsd-arm64-cgo), const IPV6_DEFAULT_MULTICAST_HOPS ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPV6_DEFAULT_MULTICAST_LOOP = 1
+pkg syscall (freebsd-arm64-cgo), const IPV6_DEFAULT_MULTICAST_LOOP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPV6_DEFHLIM = 64
+pkg syscall (freebsd-arm64-cgo), const IPV6_DEFHLIM ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPV6_DONTFRAG = 62
+pkg syscall (freebsd-arm64-cgo), const IPV6_DONTFRAG ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPV6_DSTOPTS = 50
+pkg syscall (freebsd-arm64-cgo), const IPV6_DSTOPTS ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPV6_FAITH = 29
+pkg syscall (freebsd-arm64-cgo), const IPV6_FAITH ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPV6_FLOWINFO_MASK = 4294967055
+pkg syscall (freebsd-arm64-cgo), const IPV6_FLOWINFO_MASK ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPV6_FLOWLABEL_MASK = 4294905600
+pkg syscall (freebsd-arm64-cgo), const IPV6_FLOWLABEL_MASK ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPV6_FRAGTTL = 120
+pkg syscall (freebsd-arm64-cgo), const IPV6_FRAGTTL ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPV6_FW_ADD = 30
+pkg syscall (freebsd-arm64-cgo), const IPV6_FW_ADD ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPV6_FW_DEL = 31
+pkg syscall (freebsd-arm64-cgo), const IPV6_FW_DEL ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPV6_FW_FLUSH = 32
+pkg syscall (freebsd-arm64-cgo), const IPV6_FW_FLUSH ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPV6_FW_GET = 34
+pkg syscall (freebsd-arm64-cgo), const IPV6_FW_GET ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPV6_FW_ZERO = 33
+pkg syscall (freebsd-arm64-cgo), const IPV6_FW_ZERO ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPV6_HLIMDEC = 1
+pkg syscall (freebsd-arm64-cgo), const IPV6_HLIMDEC ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPV6_HOPLIMIT = 47
+pkg syscall (freebsd-arm64-cgo), const IPV6_HOPLIMIT ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPV6_HOPOPTS = 49
+pkg syscall (freebsd-arm64-cgo), const IPV6_HOPOPTS ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPV6_IPSEC_POLICY = 28
+pkg syscall (freebsd-arm64-cgo), const IPV6_IPSEC_POLICY ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPV6_JOIN_GROUP = 12
+pkg syscall (freebsd-arm64-cgo), const IPV6_LEAVE_GROUP = 13
+pkg syscall (freebsd-arm64-cgo), const IPV6_MAX_GROUP_SRC_FILTER = 512
+pkg syscall (freebsd-arm64-cgo), const IPV6_MAX_GROUP_SRC_FILTER ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPV6_MAX_MEMBERSHIPS = 4095
+pkg syscall (freebsd-arm64-cgo), const IPV6_MAX_MEMBERSHIPS ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPV6_MAX_SOCK_SRC_FILTER = 128
+pkg syscall (freebsd-arm64-cgo), const IPV6_MAX_SOCK_SRC_FILTER ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPV6_MAXHLIM = 255
+pkg syscall (freebsd-arm64-cgo), const IPV6_MAXHLIM ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPV6_MAXOPTHDR = 2048
+pkg syscall (freebsd-arm64-cgo), const IPV6_MAXOPTHDR ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPV6_MAXPACKET = 65535
+pkg syscall (freebsd-arm64-cgo), const IPV6_MAXPACKET ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPV6_MIN_MEMBERSHIPS = 31
+pkg syscall (freebsd-arm64-cgo), const IPV6_MIN_MEMBERSHIPS ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPV6_MMTU = 1280
+pkg syscall (freebsd-arm64-cgo), const IPV6_MMTU ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPV6_MSFILTER = 74
+pkg syscall (freebsd-arm64-cgo), const IPV6_MSFILTER ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPV6_MULTICAST_HOPS = 10
+pkg syscall (freebsd-arm64-cgo), const IPV6_MULTICAST_IF = 9
+pkg syscall (freebsd-arm64-cgo), const IPV6_MULTICAST_LOOP = 11
+pkg syscall (freebsd-arm64-cgo), const IPV6_NEXTHOP = 48
+pkg syscall (freebsd-arm64-cgo), const IPV6_NEXTHOP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPV6_PATHMTU = 44
+pkg syscall (freebsd-arm64-cgo), const IPV6_PATHMTU ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPV6_PKTINFO = 46
+pkg syscall (freebsd-arm64-cgo), const IPV6_PKTINFO ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPV6_PORTRANGE = 14
+pkg syscall (freebsd-arm64-cgo), const IPV6_PORTRANGE ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPV6_PORTRANGE_DEFAULT = 0
+pkg syscall (freebsd-arm64-cgo), const IPV6_PORTRANGE_DEFAULT ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPV6_PORTRANGE_HIGH = 1
+pkg syscall (freebsd-arm64-cgo), const IPV6_PORTRANGE_HIGH ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPV6_PORTRANGE_LOW = 2
+pkg syscall (freebsd-arm64-cgo), const IPV6_PORTRANGE_LOW ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPV6_PREFER_TEMPADDR = 63
+pkg syscall (freebsd-arm64-cgo), const IPV6_PREFER_TEMPADDR ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPV6_RECVDSTOPTS = 40
+pkg syscall (freebsd-arm64-cgo), const IPV6_RECVDSTOPTS ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPV6_RECVHOPLIMIT = 37
+pkg syscall (freebsd-arm64-cgo), const IPV6_RECVHOPLIMIT ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPV6_RECVHOPOPTS = 39
+pkg syscall (freebsd-arm64-cgo), const IPV6_RECVHOPOPTS ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPV6_RECVPATHMTU = 43
+pkg syscall (freebsd-arm64-cgo), const IPV6_RECVPATHMTU ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPV6_RECVPKTINFO = 36
+pkg syscall (freebsd-arm64-cgo), const IPV6_RECVPKTINFO ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPV6_RECVRTHDR = 38
+pkg syscall (freebsd-arm64-cgo), const IPV6_RECVRTHDR ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPV6_RECVTCLASS = 57
+pkg syscall (freebsd-arm64-cgo), const IPV6_RECVTCLASS ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPV6_RTHDR = 51
+pkg syscall (freebsd-arm64-cgo), const IPV6_RTHDR ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPV6_RTHDR_LOOSE = 0
+pkg syscall (freebsd-arm64-cgo), const IPV6_RTHDR_LOOSE ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPV6_RTHDR_STRICT = 1
+pkg syscall (freebsd-arm64-cgo), const IPV6_RTHDR_STRICT ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPV6_RTHDR_TYPE_0 = 0
+pkg syscall (freebsd-arm64-cgo), const IPV6_RTHDR_TYPE_0 ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPV6_RTHDRDSTOPTS = 35
+pkg syscall (freebsd-arm64-cgo), const IPV6_RTHDRDSTOPTS ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPV6_SOCKOPT_RESERVED1 = 3
+pkg syscall (freebsd-arm64-cgo), const IPV6_SOCKOPT_RESERVED1 ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPV6_TCLASS = 61
+pkg syscall (freebsd-arm64-cgo), const IPV6_TCLASS ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPV6_UNICAST_HOPS = 4
+pkg syscall (freebsd-arm64-cgo), const IPV6_USE_MIN_MTU = 42
+pkg syscall (freebsd-arm64-cgo), const IPV6_USE_MIN_MTU ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPV6_V6ONLY = 27
+pkg syscall (freebsd-arm64-cgo), const IPV6_VERSION = 96
+pkg syscall (freebsd-arm64-cgo), const IPV6_VERSION ideal-int
+pkg syscall (freebsd-arm64-cgo), const IPV6_VERSION_MASK = 240
+pkg syscall (freebsd-arm64-cgo), const IPV6_VERSION_MASK ideal-int
+pkg syscall (freebsd-arm64-cgo), const ISIG = 128
+pkg syscall (freebsd-arm64-cgo), const ISIG ideal-int
+pkg syscall (freebsd-arm64-cgo), const ISTRIP = 32
+pkg syscall (freebsd-arm64-cgo), const ISTRIP ideal-int
+pkg syscall (freebsd-arm64-cgo), const IXANY = 2048
+pkg syscall (freebsd-arm64-cgo), const IXANY ideal-int
+pkg syscall (freebsd-arm64-cgo), const IXOFF = 1024
+pkg syscall (freebsd-arm64-cgo), const IXOFF ideal-int
+pkg syscall (freebsd-arm64-cgo), const IXON = 512
+pkg syscall (freebsd-arm64-cgo), const IXON ideal-int
+pkg syscall (freebsd-arm64-cgo), const LOCK_EX = 2
+pkg syscall (freebsd-arm64-cgo), const LOCK_EX ideal-int
+pkg syscall (freebsd-arm64-cgo), const LOCK_NB = 4
+pkg syscall (freebsd-arm64-cgo), const LOCK_NB ideal-int
+pkg syscall (freebsd-arm64-cgo), const LOCK_SH = 1
+pkg syscall (freebsd-arm64-cgo), const LOCK_SH ideal-int
+pkg syscall (freebsd-arm64-cgo), const LOCK_UN = 8
+pkg syscall (freebsd-arm64-cgo), const LOCK_UN ideal-int
+pkg syscall (freebsd-arm64-cgo), const MADV_AUTOSYNC = 7
+pkg syscall (freebsd-arm64-cgo), const MADV_AUTOSYNC ideal-int
+pkg syscall (freebsd-arm64-cgo), const MADV_CORE = 9
+pkg syscall (freebsd-arm64-cgo), const MADV_CORE ideal-int
+pkg syscall (freebsd-arm64-cgo), const MADV_DONTNEED = 4
+pkg syscall (freebsd-arm64-cgo), const MADV_DONTNEED ideal-int
+pkg syscall (freebsd-arm64-cgo), const MADV_FREE = 5
+pkg syscall (freebsd-arm64-cgo), const MADV_FREE ideal-int
+pkg syscall (freebsd-arm64-cgo), const MADV_NOCORE = 8
+pkg syscall (freebsd-arm64-cgo), const MADV_NOCORE ideal-int
+pkg syscall (freebsd-arm64-cgo), const MADV_NORMAL = 0
+pkg syscall (freebsd-arm64-cgo), const MADV_NORMAL ideal-int
+pkg syscall (freebsd-arm64-cgo), const MADV_NOSYNC = 6
+pkg syscall (freebsd-arm64-cgo), const MADV_NOSYNC ideal-int
+pkg syscall (freebsd-arm64-cgo), const MADV_PROTECT = 10
+pkg syscall (freebsd-arm64-cgo), const MADV_PROTECT ideal-int
+pkg syscall (freebsd-arm64-cgo), const MADV_RANDOM = 1
+pkg syscall (freebsd-arm64-cgo), const MADV_RANDOM ideal-int
+pkg syscall (freebsd-arm64-cgo), const MADV_SEQUENTIAL = 2
+pkg syscall (freebsd-arm64-cgo), const MADV_SEQUENTIAL ideal-int
+pkg syscall (freebsd-arm64-cgo), const MADV_WILLNEED = 3
+pkg syscall (freebsd-arm64-cgo), const MADV_WILLNEED ideal-int
+pkg syscall (freebsd-arm64-cgo), const MAP_32BIT = 524288
+pkg syscall (freebsd-arm64-cgo), const MAP_32BIT ideal-int
+pkg syscall (freebsd-arm64-cgo), const MAP_ALIGNED_SUPER = 16777216
+pkg syscall (freebsd-arm64-cgo), const MAP_ALIGNED_SUPER ideal-int
+pkg syscall (freebsd-arm64-cgo), const MAP_ALIGNMENT_MASK = -16777216
+pkg syscall (freebsd-arm64-cgo), const MAP_ALIGNMENT_MASK ideal-int
+pkg syscall (freebsd-arm64-cgo), const MAP_ALIGNMENT_SHIFT = 24
+pkg syscall (freebsd-arm64-cgo), const MAP_ALIGNMENT_SHIFT ideal-int
+pkg syscall (freebsd-arm64-cgo), const MAP_ANON = 4096
+pkg syscall (freebsd-arm64-cgo), const MAP_ANON ideal-int
+pkg syscall (freebsd-arm64-cgo), const MAP_ANONYMOUS = 4096
+pkg syscall (freebsd-arm64-cgo), const MAP_ANONYMOUS ideal-int
+pkg syscall (freebsd-arm64-cgo), const MAP_COPY = 2
+pkg syscall (freebsd-arm64-cgo), const MAP_COPY ideal-int
+pkg syscall (freebsd-arm64-cgo), const MAP_FILE = 0
+pkg syscall (freebsd-arm64-cgo), const MAP_FILE ideal-int
+pkg syscall (freebsd-arm64-cgo), const MAP_FIXED = 16
+pkg syscall (freebsd-arm64-cgo), const MAP_FIXED ideal-int
+pkg syscall (freebsd-arm64-cgo), const MAP_HASSEMAPHORE = 512
+pkg syscall (freebsd-arm64-cgo), const MAP_HASSEMAPHORE ideal-int
+pkg syscall (freebsd-arm64-cgo), const MAP_NOCORE = 131072
+pkg syscall (freebsd-arm64-cgo), const MAP_NOCORE ideal-int
+pkg syscall (freebsd-arm64-cgo), const MAP_NORESERVE = 64
+pkg syscall (freebsd-arm64-cgo), const MAP_NORESERVE ideal-int
+pkg syscall (freebsd-arm64-cgo), const MAP_NOSYNC = 2048
+pkg syscall (freebsd-arm64-cgo), const MAP_NOSYNC ideal-int
+pkg syscall (freebsd-arm64-cgo), const MAP_PREFAULT_READ = 262144
+pkg syscall (freebsd-arm64-cgo), const MAP_PREFAULT_READ ideal-int
+pkg syscall (freebsd-arm64-cgo), const MAP_PRIVATE = 2
+pkg syscall (freebsd-arm64-cgo), const MAP_PRIVATE ideal-int
+pkg syscall (freebsd-arm64-cgo), const MAP_RENAME = 32
+pkg syscall (freebsd-arm64-cgo), const MAP_RENAME ideal-int
+pkg syscall (freebsd-arm64-cgo), const MAP_RESERVED0080 = 128
+pkg syscall (freebsd-arm64-cgo), const MAP_RESERVED0080 ideal-int
+pkg syscall (freebsd-arm64-cgo), const MAP_RESERVED0100 = 256
+pkg syscall (freebsd-arm64-cgo), const MAP_RESERVED0100 ideal-int
+pkg syscall (freebsd-arm64-cgo), const MAP_SHARED = 1
+pkg syscall (freebsd-arm64-cgo), const MAP_SHARED ideal-int
+pkg syscall (freebsd-arm64-cgo), const MAP_STACK = 1024
+pkg syscall (freebsd-arm64-cgo), const MAP_STACK ideal-int
+pkg syscall (freebsd-arm64-cgo), const MCL_CURRENT = 1
+pkg syscall (freebsd-arm64-cgo), const MCL_CURRENT ideal-int
+pkg syscall (freebsd-arm64-cgo), const MCL_FUTURE = 2
+pkg syscall (freebsd-arm64-cgo), const MCL_FUTURE ideal-int
+pkg syscall (freebsd-arm64-cgo), const MS_ASYNC = 1
+pkg syscall (freebsd-arm64-cgo), const MS_ASYNC ideal-int
+pkg syscall (freebsd-arm64-cgo), const MS_INVALIDATE = 2
+pkg syscall (freebsd-arm64-cgo), const MS_INVALIDATE ideal-int
+pkg syscall (freebsd-arm64-cgo), const MS_SYNC = 0
+pkg syscall (freebsd-arm64-cgo), const MS_SYNC ideal-int
+pkg syscall (freebsd-arm64-cgo), const MSG_CMSG_CLOEXEC = 262144
+pkg syscall (freebsd-arm64-cgo), const MSG_CMSG_CLOEXEC ideal-int
+pkg syscall (freebsd-arm64-cgo), const MSG_COMPAT = 32768
+pkg syscall (freebsd-arm64-cgo), const MSG_COMPAT ideal-int
+pkg syscall (freebsd-arm64-cgo), const MSG_CTRUNC = 32
+pkg syscall (freebsd-arm64-cgo), const MSG_CTRUNC ideal-int
+pkg syscall (freebsd-arm64-cgo), const MSG_DONTROUTE = 4
+pkg syscall (freebsd-arm64-cgo), const MSG_DONTROUTE ideal-int
+pkg syscall (freebsd-arm64-cgo), const MSG_DONTWAIT = 128
+pkg syscall (freebsd-arm64-cgo), const MSG_DONTWAIT ideal-int
+pkg syscall (freebsd-arm64-cgo), const MSG_EOF = 256
+pkg syscall (freebsd-arm64-cgo), const MSG_EOF ideal-int
+pkg syscall (freebsd-arm64-cgo), const MSG_EOR = 8
+pkg syscall (freebsd-arm64-cgo), const MSG_EOR ideal-int
+pkg syscall (freebsd-arm64-cgo), const MSG_NBIO = 16384
+pkg syscall (freebsd-arm64-cgo), const MSG_NBIO ideal-int
+pkg syscall (freebsd-arm64-cgo), const MSG_NOSIGNAL = 131072
+pkg syscall (freebsd-arm64-cgo), const MSG_NOSIGNAL ideal-int
+pkg syscall (freebsd-arm64-cgo), const MSG_NOTIFICATION = 8192
+pkg syscall (freebsd-arm64-cgo), const MSG_NOTIFICATION ideal-int
+pkg syscall (freebsd-arm64-cgo), const MSG_OOB = 1
+pkg syscall (freebsd-arm64-cgo), const MSG_OOB ideal-int
+pkg syscall (freebsd-arm64-cgo), const MSG_PEEK = 2
+pkg syscall (freebsd-arm64-cgo), const MSG_PEEK ideal-int
+pkg syscall (freebsd-arm64-cgo), const MSG_TRUNC = 16
+pkg syscall (freebsd-arm64-cgo), const MSG_TRUNC ideal-int
+pkg syscall (freebsd-arm64-cgo), const MSG_WAITALL = 64
+pkg syscall (freebsd-arm64-cgo), const MSG_WAITALL ideal-int
+pkg syscall (freebsd-arm64-cgo), const NAME_MAX = 255
+pkg syscall (freebsd-arm64-cgo), const NAME_MAX ideal-int
+pkg syscall (freebsd-arm64-cgo), const NET_RT_DUMP = 1
+pkg syscall (freebsd-arm64-cgo), const NET_RT_DUMP ideal-int
+pkg syscall (freebsd-arm64-cgo), const NET_RT_FLAGS = 2
+pkg syscall (freebsd-arm64-cgo), const NET_RT_FLAGS ideal-int
+pkg syscall (freebsd-arm64-cgo), const NET_RT_IFLIST = 3
+pkg syscall (freebsd-arm64-cgo), const NET_RT_IFLIST ideal-int
+pkg syscall (freebsd-arm64-cgo), const NET_RT_IFLISTL = 5
+pkg syscall (freebsd-arm64-cgo), const NET_RT_IFLISTL ideal-int
+pkg syscall (freebsd-arm64-cgo), const NET_RT_IFMALIST = 4
+pkg syscall (freebsd-arm64-cgo), const NET_RT_IFMALIST ideal-int
+pkg syscall (freebsd-arm64-cgo), const NET_RT_MAXID = 6
+pkg syscall (freebsd-arm64-cgo), const NET_RT_MAXID ideal-int
+pkg syscall (freebsd-arm64-cgo), const NOFLSH = 2147483648
+pkg syscall (freebsd-arm64-cgo), const NOFLSH ideal-int
+pkg syscall (freebsd-arm64-cgo), const NOTE_ATTRIB = 8
+pkg syscall (freebsd-arm64-cgo), const NOTE_ATTRIB ideal-int
+pkg syscall (freebsd-arm64-cgo), const NOTE_CHILD = 4
+pkg syscall (freebsd-arm64-cgo), const NOTE_CHILD ideal-int
+pkg syscall (freebsd-arm64-cgo), const NOTE_DELETE = 1
+pkg syscall (freebsd-arm64-cgo), const NOTE_DELETE ideal-int
+pkg syscall (freebsd-arm64-cgo), const NOTE_EXEC = 536870912
+pkg syscall (freebsd-arm64-cgo), const NOTE_EXEC ideal-int
+pkg syscall (freebsd-arm64-cgo), const NOTE_EXIT = 2147483648
+pkg syscall (freebsd-arm64-cgo), const NOTE_EXIT ideal-int
+pkg syscall (freebsd-arm64-cgo), const NOTE_EXTEND = 4
+pkg syscall (freebsd-arm64-cgo), const NOTE_EXTEND ideal-int
+pkg syscall (freebsd-arm64-cgo), const NOTE_FFAND = 1073741824
+pkg syscall (freebsd-arm64-cgo), const NOTE_FFAND ideal-int
+pkg syscall (freebsd-arm64-cgo), const NOTE_FFCOPY = 3221225472
+pkg syscall (freebsd-arm64-cgo), const NOTE_FFCOPY ideal-int
+pkg syscall (freebsd-arm64-cgo), const NOTE_FFCTRLMASK = 3221225472
+pkg syscall (freebsd-arm64-cgo), const NOTE_FFCTRLMASK ideal-int
+pkg syscall (freebsd-arm64-cgo), const NOTE_FFLAGSMASK = 16777215
+pkg syscall (freebsd-arm64-cgo), const NOTE_FFLAGSMASK ideal-int
+pkg syscall (freebsd-arm64-cgo), const NOTE_FFNOP = 0
+pkg syscall (freebsd-arm64-cgo), const NOTE_FFNOP ideal-int
+pkg syscall (freebsd-arm64-cgo), const NOTE_FFOR = 2147483648
+pkg syscall (freebsd-arm64-cgo), const NOTE_FFOR ideal-int
+pkg syscall (freebsd-arm64-cgo), const NOTE_FORK = 1073741824
+pkg syscall (freebsd-arm64-cgo), const NOTE_FORK ideal-int
+pkg syscall (freebsd-arm64-cgo), const NOTE_LINK = 16
+pkg syscall (freebsd-arm64-cgo), const NOTE_LINK ideal-int
+pkg syscall (freebsd-arm64-cgo), const NOTE_LOWAT = 1
+pkg syscall (freebsd-arm64-cgo), const NOTE_LOWAT ideal-int
+pkg syscall (freebsd-arm64-cgo), const NOTE_PCTRLMASK = 4026531840
+pkg syscall (freebsd-arm64-cgo), const NOTE_PCTRLMASK ideal-int
+pkg syscall (freebsd-arm64-cgo), const NOTE_PDATAMASK = 1048575
+pkg syscall (freebsd-arm64-cgo), const NOTE_PDATAMASK ideal-int
+pkg syscall (freebsd-arm64-cgo), const NOTE_RENAME = 32
+pkg syscall (freebsd-arm64-cgo), const NOTE_RENAME ideal-int
+pkg syscall (freebsd-arm64-cgo), const NOTE_REVOKE = 64
+pkg syscall (freebsd-arm64-cgo), const NOTE_REVOKE ideal-int
+pkg syscall (freebsd-arm64-cgo), const NOTE_TRACK = 1
+pkg syscall (freebsd-arm64-cgo), const NOTE_TRACK ideal-int
+pkg syscall (freebsd-arm64-cgo), const NOTE_TRACKERR = 2
+pkg syscall (freebsd-arm64-cgo), const NOTE_TRACKERR ideal-int
+pkg syscall (freebsd-arm64-cgo), const NOTE_TRIGGER = 16777216
+pkg syscall (freebsd-arm64-cgo), const NOTE_TRIGGER ideal-int
+pkg syscall (freebsd-arm64-cgo), const NOTE_WRITE = 2
+pkg syscall (freebsd-arm64-cgo), const NOTE_WRITE ideal-int
+pkg syscall (freebsd-arm64-cgo), const O_ACCMODE = 3
+pkg syscall (freebsd-arm64-cgo), const O_ACCMODE ideal-int
+pkg syscall (freebsd-arm64-cgo), const O_APPEND = 8
+pkg syscall (freebsd-arm64-cgo), const O_ASYNC = 64
+pkg syscall (freebsd-arm64-cgo), const O_CLOEXEC = 1048576
+pkg syscall (freebsd-arm64-cgo), const O_CREAT = 512
+pkg syscall (freebsd-arm64-cgo), const O_DIRECT = 65536
+pkg syscall (freebsd-arm64-cgo), const O_DIRECT ideal-int
+pkg syscall (freebsd-arm64-cgo), const O_DIRECTORY = 131072
+pkg syscall (freebsd-arm64-cgo), const O_DIRECTORY ideal-int
+pkg syscall (freebsd-arm64-cgo), const O_EXCL = 2048
+pkg syscall (freebsd-arm64-cgo), const O_EXEC = 262144
+pkg syscall (freebsd-arm64-cgo), const O_EXEC ideal-int
+pkg syscall (freebsd-arm64-cgo), const O_EXLOCK = 32
+pkg syscall (freebsd-arm64-cgo), const O_EXLOCK ideal-int
+pkg syscall (freebsd-arm64-cgo), const O_FSYNC = 128
+pkg syscall (freebsd-arm64-cgo), const O_FSYNC ideal-int
+pkg syscall (freebsd-arm64-cgo), const O_NDELAY = 4
+pkg syscall (freebsd-arm64-cgo), const O_NDELAY ideal-int
+pkg syscall (freebsd-arm64-cgo), const O_NOCTTY = 32768
+pkg syscall (freebsd-arm64-cgo), const O_NOFOLLOW = 256
+pkg syscall (freebsd-arm64-cgo), const O_NOFOLLOW ideal-int
+pkg syscall (freebsd-arm64-cgo), const O_NONBLOCK = 4
+pkg syscall (freebsd-arm64-cgo), const O_SHLOCK = 16
+pkg syscall (freebsd-arm64-cgo), const O_SHLOCK ideal-int
+pkg syscall (freebsd-arm64-cgo), const O_SYNC = 128
+pkg syscall (freebsd-arm64-cgo), const O_TRUNC = 1024
+pkg syscall (freebsd-arm64-cgo), const O_TTY_INIT = 524288
+pkg syscall (freebsd-arm64-cgo), const O_TTY_INIT ideal-int
+pkg syscall (freebsd-arm64-cgo), const OCRNL = 16
+pkg syscall (freebsd-arm64-cgo), const OCRNL ideal-int
+pkg syscall (freebsd-arm64-cgo), const ONLCR = 2
+pkg syscall (freebsd-arm64-cgo), const ONLCR ideal-int
+pkg syscall (freebsd-arm64-cgo), const ONLRET = 64
+pkg syscall (freebsd-arm64-cgo), const ONLRET ideal-int
+pkg syscall (freebsd-arm64-cgo), const ONOCR = 32
+pkg syscall (freebsd-arm64-cgo), const ONOCR ideal-int
+pkg syscall (freebsd-arm64-cgo), const ONOEOT = 8
+pkg syscall (freebsd-arm64-cgo), const ONOEOT ideal-int
+pkg syscall (freebsd-arm64-cgo), const OPOST = 1
+pkg syscall (freebsd-arm64-cgo), const OPOST ideal-int
+pkg syscall (freebsd-arm64-cgo), const PARENB = 4096
+pkg syscall (freebsd-arm64-cgo), const PARENB ideal-int
+pkg syscall (freebsd-arm64-cgo), const PARMRK = 8
+pkg syscall (freebsd-arm64-cgo), const PARMRK ideal-int
+pkg syscall (freebsd-arm64-cgo), const PARODD = 8192
+pkg syscall (freebsd-arm64-cgo), const PARODD ideal-int
+pkg syscall (freebsd-arm64-cgo), const PENDIN = 536870912
+pkg syscall (freebsd-arm64-cgo), const PENDIN ideal-int
+pkg syscall (freebsd-arm64-cgo), const PRIO_PGRP = 1
+pkg syscall (freebsd-arm64-cgo), const PRIO_PGRP ideal-int
+pkg syscall (freebsd-arm64-cgo), const PRIO_PROCESS = 0
+pkg syscall (freebsd-arm64-cgo), const PRIO_PROCESS ideal-int
+pkg syscall (freebsd-arm64-cgo), const PRIO_USER = 2
+pkg syscall (freebsd-arm64-cgo), const PRIO_USER ideal-int
+pkg syscall (freebsd-arm64-cgo), const PROT_EXEC = 4
+pkg syscall (freebsd-arm64-cgo), const PROT_EXEC ideal-int
+pkg syscall (freebsd-arm64-cgo), const PROT_NONE = 0
+pkg syscall (freebsd-arm64-cgo), const PROT_NONE ideal-int
+pkg syscall (freebsd-arm64-cgo), const PROT_READ = 1
+pkg syscall (freebsd-arm64-cgo), const PROT_READ ideal-int
+pkg syscall (freebsd-arm64-cgo), const PROT_WRITE = 2
+pkg syscall (freebsd-arm64-cgo), const PROT_WRITE ideal-int
+pkg syscall (freebsd-arm64-cgo), const PTRACE_CONT = 7
+pkg syscall (freebsd-arm64-cgo), const PTRACE_CONT ideal-int
+pkg syscall (freebsd-arm64-cgo), const PTRACE_KILL = 8
+pkg syscall (freebsd-arm64-cgo), const PTRACE_KILL ideal-int
+pkg syscall (freebsd-arm64-cgo), const PTRACE_TRACEME = 0
+pkg syscall (freebsd-arm64-cgo), const PTRACE_TRACEME ideal-int
+pkg syscall (freebsd-arm64-cgo), const RLIM_INFINITY = 9223372036854775807
+pkg syscall (freebsd-arm64-cgo), const RLIM_INFINITY ideal-int
+pkg syscall (freebsd-arm64-cgo), const RLIMIT_AS = 10
+pkg syscall (freebsd-arm64-cgo), const RLIMIT_AS ideal-int
+pkg syscall (freebsd-arm64-cgo), const RLIMIT_CORE = 4
+pkg syscall (freebsd-arm64-cgo), const RLIMIT_CORE ideal-int
+pkg syscall (freebsd-arm64-cgo), const RLIMIT_CPU = 0
+pkg syscall (freebsd-arm64-cgo), const RLIMIT_CPU ideal-int
+pkg syscall (freebsd-arm64-cgo), const RLIMIT_DATA = 2
+pkg syscall (freebsd-arm64-cgo), const RLIMIT_DATA ideal-int
+pkg syscall (freebsd-arm64-cgo), const RLIMIT_FSIZE = 1
+pkg syscall (freebsd-arm64-cgo), const RLIMIT_FSIZE ideal-int
+pkg syscall (freebsd-arm64-cgo), const RLIMIT_NOFILE = 8
+pkg syscall (freebsd-arm64-cgo), const RLIMIT_NOFILE ideal-int
+pkg syscall (freebsd-arm64-cgo), const RLIMIT_STACK = 3
+pkg syscall (freebsd-arm64-cgo), const RLIMIT_STACK ideal-int
+pkg syscall (freebsd-arm64-cgo), const RT_CACHING_CONTEXT = 1
+pkg syscall (freebsd-arm64-cgo), const RT_CACHING_CONTEXT ideal-int
+pkg syscall (freebsd-arm64-cgo), const RT_DEFAULT_FIB = 0
+pkg syscall (freebsd-arm64-cgo), const RT_DEFAULT_FIB ideal-int
+pkg syscall (freebsd-arm64-cgo), const RT_NORTREF = 2
+pkg syscall (freebsd-arm64-cgo), const RT_NORTREF ideal-int
+pkg syscall (freebsd-arm64-cgo), const RTA_AUTHOR = 64
+pkg syscall (freebsd-arm64-cgo), const RTA_AUTHOR ideal-int
+pkg syscall (freebsd-arm64-cgo), const RTA_BRD = 128
+pkg syscall (freebsd-arm64-cgo), const RTA_BRD ideal-int
+pkg syscall (freebsd-arm64-cgo), const RTA_DST = 1
+pkg syscall (freebsd-arm64-cgo), const RTA_DST ideal-int
+pkg syscall (freebsd-arm64-cgo), const RTA_GATEWAY = 2
+pkg syscall (freebsd-arm64-cgo), const RTA_GATEWAY ideal-int
+pkg syscall (freebsd-arm64-cgo), const RTA_GENMASK = 8
+pkg syscall (freebsd-arm64-cgo), const RTA_GENMASK ideal-int
+pkg syscall (freebsd-arm64-cgo), const RTA_IFA = 32
+pkg syscall (freebsd-arm64-cgo), const RTA_IFA ideal-int
+pkg syscall (freebsd-arm64-cgo), const RTA_IFP = 16
+pkg syscall (freebsd-arm64-cgo), const RTA_IFP ideal-int
+pkg syscall (freebsd-arm64-cgo), const RTA_NETMASK = 4
+pkg syscall (freebsd-arm64-cgo), const RTA_NETMASK ideal-int
+pkg syscall (freebsd-arm64-cgo), const RTAX_AUTHOR = 6
+pkg syscall (freebsd-arm64-cgo), const RTAX_AUTHOR ideal-int
+pkg syscall (freebsd-arm64-cgo), const RTAX_BRD = 7
+pkg syscall (freebsd-arm64-cgo), const RTAX_BRD ideal-int
+pkg syscall (freebsd-arm64-cgo), const RTAX_DST = 0
+pkg syscall (freebsd-arm64-cgo), const RTAX_DST ideal-int
+pkg syscall (freebsd-arm64-cgo), const RTAX_GATEWAY = 1
+pkg syscall (freebsd-arm64-cgo), const RTAX_GATEWAY ideal-int
+pkg syscall (freebsd-arm64-cgo), const RTAX_GENMASK = 3
+pkg syscall (freebsd-arm64-cgo), const RTAX_GENMASK ideal-int
+pkg syscall (freebsd-arm64-cgo), const RTAX_IFA = 5
+pkg syscall (freebsd-arm64-cgo), const RTAX_IFA ideal-int
+pkg syscall (freebsd-arm64-cgo), const RTAX_IFP = 4
+pkg syscall (freebsd-arm64-cgo), const RTAX_IFP ideal-int
+pkg syscall (freebsd-arm64-cgo), const RTAX_MAX = 8
+pkg syscall (freebsd-arm64-cgo), const RTAX_MAX ideal-int
+pkg syscall (freebsd-arm64-cgo), const RTAX_NETMASK = 2
+pkg syscall (freebsd-arm64-cgo), const RTAX_NETMASK ideal-int
+pkg syscall (freebsd-arm64-cgo), const RTF_BLACKHOLE = 4096
+pkg syscall (freebsd-arm64-cgo), const RTF_BLACKHOLE ideal-int
+pkg syscall (freebsd-arm64-cgo), const RTF_BROADCAST = 4194304
+pkg syscall (freebsd-arm64-cgo), const RTF_BROADCAST ideal-int
+pkg syscall (freebsd-arm64-cgo), const RTF_DONE = 64
+pkg syscall (freebsd-arm64-cgo), const RTF_DONE ideal-int
+pkg syscall (freebsd-arm64-cgo), const RTF_DYNAMIC = 16
+pkg syscall (freebsd-arm64-cgo), const RTF_DYNAMIC ideal-int
+pkg syscall (freebsd-arm64-cgo), const RTF_FMASK = 268752904
+pkg syscall (freebsd-arm64-cgo), const RTF_FMASK ideal-int
+pkg syscall (freebsd-arm64-cgo), const RTF_GATEWAY = 2
+pkg syscall (freebsd-arm64-cgo), const RTF_GATEWAY ideal-int
+pkg syscall (freebsd-arm64-cgo), const RTF_GWFLAG_COMPAT = 2147483648
+pkg syscall (freebsd-arm64-cgo), const RTF_GWFLAG_COMPAT ideal-int
+pkg syscall (freebsd-arm64-cgo), const RTF_HOST = 4
+pkg syscall (freebsd-arm64-cgo), const RTF_HOST ideal-int
+pkg syscall (freebsd-arm64-cgo), const RTF_LLDATA = 1024
+pkg syscall (freebsd-arm64-cgo), const RTF_LLDATA ideal-int
+pkg syscall (freebsd-arm64-cgo), const RTF_LLINFO = 1024
+pkg syscall (freebsd-arm64-cgo), const RTF_LLINFO ideal-int
+pkg syscall (freebsd-arm64-cgo), const RTF_LOCAL = 2097152
+pkg syscall (freebsd-arm64-cgo), const RTF_LOCAL ideal-int
+pkg syscall (freebsd-arm64-cgo), const RTF_MODIFIED = 32
+pkg syscall (freebsd-arm64-cgo), const RTF_MODIFIED ideal-int
+pkg syscall (freebsd-arm64-cgo), const RTF_MULTICAST = 8388608
+pkg syscall (freebsd-arm64-cgo), const RTF_MULTICAST ideal-int
+pkg syscall (freebsd-arm64-cgo), const RTF_PINNED = 1048576
+pkg syscall (freebsd-arm64-cgo), const RTF_PINNED ideal-int
+pkg syscall (freebsd-arm64-cgo), const RTF_PRCLONING = 65536
+pkg syscall (freebsd-arm64-cgo), const RTF_PRCLONING ideal-int
+pkg syscall (freebsd-arm64-cgo), const RTF_PROTO1 = 32768
+pkg syscall (freebsd-arm64-cgo), const RTF_PROTO1 ideal-int
+pkg syscall (freebsd-arm64-cgo), const RTF_PROTO2 = 16384
+pkg syscall (freebsd-arm64-cgo), const RTF_PROTO2 ideal-int
+pkg syscall (freebsd-arm64-cgo), const RTF_PROTO3 = 262144
+pkg syscall (freebsd-arm64-cgo), const RTF_PROTO3 ideal-int
+pkg syscall (freebsd-arm64-cgo), const RTF_REJECT = 8
+pkg syscall (freebsd-arm64-cgo), const RTF_REJECT ideal-int
+pkg syscall (freebsd-arm64-cgo), const RTF_RNH_LOCKED = 1073741824
+pkg syscall (freebsd-arm64-cgo), const RTF_RNH_LOCKED ideal-int
+pkg syscall (freebsd-arm64-cgo), const RTF_STATIC = 2048
+pkg syscall (freebsd-arm64-cgo), const RTF_STATIC ideal-int
+pkg syscall (freebsd-arm64-cgo), const RTF_STICKY = 268435456
+pkg syscall (freebsd-arm64-cgo), const RTF_STICKY ideal-int
+pkg syscall (freebsd-arm64-cgo), const RTF_UP = 1
+pkg syscall (freebsd-arm64-cgo), const RTF_UP ideal-int
+pkg syscall (freebsd-arm64-cgo), const RTF_XRESOLVE = 512
+pkg syscall (freebsd-arm64-cgo), const RTF_XRESOLVE ideal-int
+pkg syscall (freebsd-arm64-cgo), const RTM_ADD = 1
+pkg syscall (freebsd-arm64-cgo), const RTM_ADD ideal-int
+pkg syscall (freebsd-arm64-cgo), const RTM_CHANGE = 3
+pkg syscall (freebsd-arm64-cgo), const RTM_CHANGE ideal-int
+pkg syscall (freebsd-arm64-cgo), const RTM_DELADDR = 13
+pkg syscall (freebsd-arm64-cgo), const RTM_DELADDR ideal-int
+pkg syscall (freebsd-arm64-cgo), const RTM_DELETE = 2
+pkg syscall (freebsd-arm64-cgo), const RTM_DELETE ideal-int
+pkg syscall (freebsd-arm64-cgo), const RTM_DELMADDR = 16
+pkg syscall (freebsd-arm64-cgo), const RTM_DELMADDR ideal-int
+pkg syscall (freebsd-arm64-cgo), const RTM_GET = 4
+pkg syscall (freebsd-arm64-cgo), const RTM_GET ideal-int
+pkg syscall (freebsd-arm64-cgo), const RTM_IEEE80211 = 18
+pkg syscall (freebsd-arm64-cgo), const RTM_IEEE80211 ideal-int
+pkg syscall (freebsd-arm64-cgo), const RTM_IFANNOUNCE = 17
+pkg syscall (freebsd-arm64-cgo), const RTM_IFANNOUNCE ideal-int
+pkg syscall (freebsd-arm64-cgo), const RTM_IFINFO = 14
+pkg syscall (freebsd-arm64-cgo), const RTM_IFINFO ideal-int
+pkg syscall (freebsd-arm64-cgo), const RTM_LOCK = 8
+pkg syscall (freebsd-arm64-cgo), const RTM_LOCK ideal-int
+pkg syscall (freebsd-arm64-cgo), const RTM_LOSING = 5
+pkg syscall (freebsd-arm64-cgo), const RTM_LOSING ideal-int
+pkg syscall (freebsd-arm64-cgo), const RTM_MISS = 7
+pkg syscall (freebsd-arm64-cgo), const RTM_MISS ideal-int
+pkg syscall (freebsd-arm64-cgo), const RTM_NEWADDR = 12
+pkg syscall (freebsd-arm64-cgo), const RTM_NEWADDR ideal-int
+pkg syscall (freebsd-arm64-cgo), const RTM_NEWMADDR = 15
+pkg syscall (freebsd-arm64-cgo), const RTM_NEWMADDR ideal-int
+pkg syscall (freebsd-arm64-cgo), const RTM_OLDADD = 9
+pkg syscall (freebsd-arm64-cgo), const RTM_OLDADD ideal-int
+pkg syscall (freebsd-arm64-cgo), const RTM_OLDDEL = 10
+pkg syscall (freebsd-arm64-cgo), const RTM_OLDDEL ideal-int
+pkg syscall (freebsd-arm64-cgo), const RTM_REDIRECT = 6
+pkg syscall (freebsd-arm64-cgo), const RTM_REDIRECT ideal-int
+pkg syscall (freebsd-arm64-cgo), const RTM_RESOLVE = 11
+pkg syscall (freebsd-arm64-cgo), const RTM_RESOLVE ideal-int
+pkg syscall (freebsd-arm64-cgo), const RTM_RTTUNIT = 1000000
+pkg syscall (freebsd-arm64-cgo), const RTM_RTTUNIT ideal-int
+pkg syscall (freebsd-arm64-cgo), const RTM_VERSION = 5
+pkg syscall (freebsd-arm64-cgo), const RTM_VERSION ideal-int
+pkg syscall (freebsd-arm64-cgo), const RTV_EXPIRE = 4
+pkg syscall (freebsd-arm64-cgo), const RTV_EXPIRE ideal-int
+pkg syscall (freebsd-arm64-cgo), const RTV_HOPCOUNT = 2
+pkg syscall (freebsd-arm64-cgo), const RTV_HOPCOUNT ideal-int
+pkg syscall (freebsd-arm64-cgo), const RTV_MTU = 1
+pkg syscall (freebsd-arm64-cgo), const RTV_MTU ideal-int
+pkg syscall (freebsd-arm64-cgo), const RTV_RPIPE = 8
+pkg syscall (freebsd-arm64-cgo), const RTV_RPIPE ideal-int
+pkg syscall (freebsd-arm64-cgo), const RTV_RTT = 64
+pkg syscall (freebsd-arm64-cgo), const RTV_RTT ideal-int
+pkg syscall (freebsd-arm64-cgo), const RTV_RTTVAR = 128
+pkg syscall (freebsd-arm64-cgo), const RTV_RTTVAR ideal-int
+pkg syscall (freebsd-arm64-cgo), const RTV_SPIPE = 16
+pkg syscall (freebsd-arm64-cgo), const RTV_SPIPE ideal-int
+pkg syscall (freebsd-arm64-cgo), const RTV_SSTHRESH = 32
+pkg syscall (freebsd-arm64-cgo), const RTV_SSTHRESH ideal-int
+pkg syscall (freebsd-arm64-cgo), const RTV_WEIGHT = 256
+pkg syscall (freebsd-arm64-cgo), const RTV_WEIGHT ideal-int
+pkg syscall (freebsd-arm64-cgo), const RUSAGE_CHILDREN = -1
+pkg syscall (freebsd-arm64-cgo), const RUSAGE_CHILDREN ideal-int
+pkg syscall (freebsd-arm64-cgo), const RUSAGE_SELF = 0
+pkg syscall (freebsd-arm64-cgo), const RUSAGE_SELF ideal-int
+pkg syscall (freebsd-arm64-cgo), const RUSAGE_THREAD = 1
+pkg syscall (freebsd-arm64-cgo), const RUSAGE_THREAD ideal-int
+pkg syscall (freebsd-arm64-cgo), const S_IFMT = 61440
+pkg syscall (freebsd-arm64-cgo), const S_IRWXG = 56
+pkg syscall (freebsd-arm64-cgo), const S_IRWXG ideal-int
+pkg syscall (freebsd-arm64-cgo), const S_IRWXO = 7
+pkg syscall (freebsd-arm64-cgo), const S_IRWXO ideal-int
+pkg syscall (freebsd-arm64-cgo), const SCM_BINTIME = 4
+pkg syscall (freebsd-arm64-cgo), const SCM_BINTIME ideal-int
+pkg syscall (freebsd-arm64-cgo), const SCM_CREDS = 3
+pkg syscall (freebsd-arm64-cgo), const SCM_CREDS ideal-int
+pkg syscall (freebsd-arm64-cgo), const SCM_RIGHTS = 1
+pkg syscall (freebsd-arm64-cgo), const SCM_RIGHTS ideal-int
+pkg syscall (freebsd-arm64-cgo), const SCM_TIMESTAMP = 2
+pkg syscall (freebsd-arm64-cgo), const SCM_TIMESTAMP ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIGBUS = 10
+pkg syscall (freebsd-arm64-cgo), const SIGCHLD = 20
+pkg syscall (freebsd-arm64-cgo), const SIGCHLD Signal
+pkg syscall (freebsd-arm64-cgo), const SIGCONT = 19
+pkg syscall (freebsd-arm64-cgo), const SIGCONT Signal
+pkg syscall (freebsd-arm64-cgo), const SIGEMT = 7
+pkg syscall (freebsd-arm64-cgo), const SIGEMT Signal
+pkg syscall (freebsd-arm64-cgo), const SIGINFO = 29
+pkg syscall (freebsd-arm64-cgo), const SIGINFO Signal
+pkg syscall (freebsd-arm64-cgo), const SIGIO = 23
+pkg syscall (freebsd-arm64-cgo), const SIGIO Signal
+pkg syscall (freebsd-arm64-cgo), const SIGIOT = 6
+pkg syscall (freebsd-arm64-cgo), const SIGIOT Signal
+pkg syscall (freebsd-arm64-cgo), const SIGLIBRT = 33
+pkg syscall (freebsd-arm64-cgo), const SIGLIBRT Signal
+pkg syscall (freebsd-arm64-cgo), const SIGLWP = 32
+pkg syscall (freebsd-arm64-cgo), const SIGLWP Signal
+pkg syscall (freebsd-arm64-cgo), const SIGPROF = 27
+pkg syscall (freebsd-arm64-cgo), const SIGPROF Signal
+pkg syscall (freebsd-arm64-cgo), const SIGSTOP = 17
+pkg syscall (freebsd-arm64-cgo), const SIGSTOP Signal
+pkg syscall (freebsd-arm64-cgo), const SIGSYS = 12
+pkg syscall (freebsd-arm64-cgo), const SIGSYS Signal
+pkg syscall (freebsd-arm64-cgo), const SIGTHR = 32
+pkg syscall (freebsd-arm64-cgo), const SIGTHR Signal
+pkg syscall (freebsd-arm64-cgo), const SIGTSTP = 18
+pkg syscall (freebsd-arm64-cgo), const SIGTSTP Signal
+pkg syscall (freebsd-arm64-cgo), const SIGTTIN = 21
+pkg syscall (freebsd-arm64-cgo), const SIGTTIN Signal
+pkg syscall (freebsd-arm64-cgo), const SIGTTOU = 22
+pkg syscall (freebsd-arm64-cgo), const SIGTTOU Signal
+pkg syscall (freebsd-arm64-cgo), const SIGURG = 16
+pkg syscall (freebsd-arm64-cgo), const SIGURG Signal
+pkg syscall (freebsd-arm64-cgo), const SIGUSR1 = 30
+pkg syscall (freebsd-arm64-cgo), const SIGUSR1 Signal
+pkg syscall (freebsd-arm64-cgo), const SIGUSR2 = 31
+pkg syscall (freebsd-arm64-cgo), const SIGUSR2 Signal
+pkg syscall (freebsd-arm64-cgo), const SIGVTALRM = 26
+pkg syscall (freebsd-arm64-cgo), const SIGVTALRM Signal
+pkg syscall (freebsd-arm64-cgo), const SIGWINCH = 28
+pkg syscall (freebsd-arm64-cgo), const SIGWINCH Signal
+pkg syscall (freebsd-arm64-cgo), const SIGXCPU = 24
+pkg syscall (freebsd-arm64-cgo), const SIGXCPU Signal
+pkg syscall (freebsd-arm64-cgo), const SIGXFSZ = 25
+pkg syscall (freebsd-arm64-cgo), const SIGXFSZ Signal
+pkg syscall (freebsd-arm64-cgo), const SIOCADDMULTI = 2149607729
+pkg syscall (freebsd-arm64-cgo), const SIOCADDMULTI ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIOCADDRT = 2151707146
+pkg syscall (freebsd-arm64-cgo), const SIOCADDRT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIOCAIFADDR = 2151704858
+pkg syscall (freebsd-arm64-cgo), const SIOCAIFADDR ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIOCAIFGROUP = 2150132103
+pkg syscall (freebsd-arm64-cgo), const SIOCAIFGROUP ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIOCALIFADDR = 2165860635
+pkg syscall (freebsd-arm64-cgo), const SIOCALIFADDR ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIOCATMARK = 1074033415
+pkg syscall (freebsd-arm64-cgo), const SIOCATMARK ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIOCDELMULTI = 2149607730
+pkg syscall (freebsd-arm64-cgo), const SIOCDELMULTI ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIOCDELRT = 2151707147
+pkg syscall (freebsd-arm64-cgo), const SIOCDELRT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIOCDIFADDR = 2149607705
+pkg syscall (freebsd-arm64-cgo), const SIOCDIFADDR ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIOCDIFGROUP = 2150132105
+pkg syscall (freebsd-arm64-cgo), const SIOCDIFGROUP ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIOCDIFPHYADDR = 2149607753
+pkg syscall (freebsd-arm64-cgo), const SIOCDIFPHYADDR ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIOCDLIFADDR = 2165860637
+pkg syscall (freebsd-arm64-cgo), const SIOCDLIFADDR ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIOCGDRVSPEC = 3223873915
+pkg syscall (freebsd-arm64-cgo), const SIOCGDRVSPEC ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIOCGETSGCNT = 3223351824
+pkg syscall (freebsd-arm64-cgo), const SIOCGETSGCNT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIOCGETVIFCNT = 3223876111
+pkg syscall (freebsd-arm64-cgo), const SIOCGETVIFCNT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIOCGHIWAT = 1074033409
+pkg syscall (freebsd-arm64-cgo), const SIOCGHIWAT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIOCGIFADDR = 3223349537
+pkg syscall (freebsd-arm64-cgo), const SIOCGIFADDR ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIOCGIFBRDADDR = 3223349539
+pkg syscall (freebsd-arm64-cgo), const SIOCGIFBRDADDR ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIOCGIFCAP = 3223349535
+pkg syscall (freebsd-arm64-cgo), const SIOCGIFCAP ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIOCGIFCONF = 3222300964
+pkg syscall (freebsd-arm64-cgo), const SIOCGIFCONF ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIOCGIFDESCR = 3223349546
+pkg syscall (freebsd-arm64-cgo), const SIOCGIFDESCR ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIOCGIFDSTADDR = 3223349538
+pkg syscall (freebsd-arm64-cgo), const SIOCGIFDSTADDR ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIOCGIFFIB = 3223349596
+pkg syscall (freebsd-arm64-cgo), const SIOCGIFFIB ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIOCGIFFLAGS = 3223349521
+pkg syscall (freebsd-arm64-cgo), const SIOCGIFFLAGS ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIOCGIFGENERIC = 3223349562
+pkg syscall (freebsd-arm64-cgo), const SIOCGIFGENERIC ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIOCGIFGMEMB = 3223873930
+pkg syscall (freebsd-arm64-cgo), const SIOCGIFGMEMB ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIOCGIFGROUP = 3223873928
+pkg syscall (freebsd-arm64-cgo), const SIOCGIFGROUP ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIOCGIFINDEX = 3223349536
+pkg syscall (freebsd-arm64-cgo), const SIOCGIFINDEX ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIOCGIFMAC = 3223349542
+pkg syscall (freebsd-arm64-cgo), const SIOCGIFMAC ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIOCGIFMEDIA = 3224398136
+pkg syscall (freebsd-arm64-cgo), const SIOCGIFMEDIA ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIOCGIFMETRIC = 3223349527
+pkg syscall (freebsd-arm64-cgo), const SIOCGIFMETRIC ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIOCGIFMTU = 3223349555
+pkg syscall (freebsd-arm64-cgo), const SIOCGIFMTU ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIOCGIFNETMASK = 3223349541
+pkg syscall (freebsd-arm64-cgo), const SIOCGIFNETMASK ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIOCGIFPDSTADDR = 3223349576
+pkg syscall (freebsd-arm64-cgo), const SIOCGIFPDSTADDR ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIOCGIFPHYS = 3223349557
+pkg syscall (freebsd-arm64-cgo), const SIOCGIFPHYS ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIOCGIFPSRCADDR = 3223349575
+pkg syscall (freebsd-arm64-cgo), const SIOCGIFPSRCADDR ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIOCGIFSTATUS = 3274795323
+pkg syscall (freebsd-arm64-cgo), const SIOCGIFSTATUS ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIOCGLIFADDR = 3239602460
+pkg syscall (freebsd-arm64-cgo), const SIOCGLIFADDR ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIOCGLIFPHYADDR = 3239602507
+pkg syscall (freebsd-arm64-cgo), const SIOCGLIFPHYADDR ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIOCGLOWAT = 1074033411
+pkg syscall (freebsd-arm64-cgo), const SIOCGLOWAT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIOCGPGRP = 1074033417
+pkg syscall (freebsd-arm64-cgo), const SIOCGPGRP ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIOCGPRIVATE_0 = 3223349584
+pkg syscall (freebsd-arm64-cgo), const SIOCGPRIVATE_0 ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIOCGPRIVATE_1 = 3223349585
+pkg syscall (freebsd-arm64-cgo), const SIOCGPRIVATE_1 ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIOCIFCREATE = 3223349626
+pkg syscall (freebsd-arm64-cgo), const SIOCIFCREATE ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIOCIFCREATE2 = 3223349628
+pkg syscall (freebsd-arm64-cgo), const SIOCIFCREATE2 ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIOCIFDESTROY = 2149607801
+pkg syscall (freebsd-arm64-cgo), const SIOCIFDESTROY ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIOCIFGCLONERS = 3222301048
+pkg syscall (freebsd-arm64-cgo), const SIOCIFGCLONERS ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIOCSDRVSPEC = 2150132091
+pkg syscall (freebsd-arm64-cgo), const SIOCSDRVSPEC ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIOCSHIWAT = 2147775232
+pkg syscall (freebsd-arm64-cgo), const SIOCSHIWAT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIOCSIFADDR = 2149607692
+pkg syscall (freebsd-arm64-cgo), const SIOCSIFADDR ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIOCSIFBRDADDR = 2149607699
+pkg syscall (freebsd-arm64-cgo), const SIOCSIFBRDADDR ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIOCSIFCAP = 2149607710
+pkg syscall (freebsd-arm64-cgo), const SIOCSIFCAP ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIOCSIFDESCR = 2149607721
+pkg syscall (freebsd-arm64-cgo), const SIOCSIFDESCR ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIOCSIFDSTADDR = 2149607694
+pkg syscall (freebsd-arm64-cgo), const SIOCSIFDSTADDR ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIOCSIFFIB = 2149607773
+pkg syscall (freebsd-arm64-cgo), const SIOCSIFFIB ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIOCSIFFLAGS = 2149607696
+pkg syscall (freebsd-arm64-cgo), const SIOCSIFFLAGS ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIOCSIFGENERIC = 2149607737
+pkg syscall (freebsd-arm64-cgo), const SIOCSIFGENERIC ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIOCSIFLLADDR = 2149607740
+pkg syscall (freebsd-arm64-cgo), const SIOCSIFLLADDR ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIOCSIFMAC = 2149607719
+pkg syscall (freebsd-arm64-cgo), const SIOCSIFMAC ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIOCSIFMEDIA = 3223349559
+pkg syscall (freebsd-arm64-cgo), const SIOCSIFMEDIA ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIOCSIFMETRIC = 2149607704
+pkg syscall (freebsd-arm64-cgo), const SIOCSIFMETRIC ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIOCSIFMTU = 2149607732
+pkg syscall (freebsd-arm64-cgo), const SIOCSIFMTU ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIOCSIFNAME = 2149607720
+pkg syscall (freebsd-arm64-cgo), const SIOCSIFNAME ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIOCSIFNETMASK = 2149607702
+pkg syscall (freebsd-arm64-cgo), const SIOCSIFNETMASK ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIOCSIFPHYADDR = 2151704902
+pkg syscall (freebsd-arm64-cgo), const SIOCSIFPHYADDR ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIOCSIFPHYS = 2149607734
+pkg syscall (freebsd-arm64-cgo), const SIOCSIFPHYS ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIOCSIFRVNET = 3223349595
+pkg syscall (freebsd-arm64-cgo), const SIOCSIFRVNET ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIOCSIFVNET = 3223349594
+pkg syscall (freebsd-arm64-cgo), const SIOCSIFVNET ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIOCSLIFPHYADDR = 2165860682
+pkg syscall (freebsd-arm64-cgo), const SIOCSLIFPHYADDR ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIOCSLOWAT = 2147775234
+pkg syscall (freebsd-arm64-cgo), const SIOCSLOWAT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SIOCSPGRP = 2147775240
+pkg syscall (freebsd-arm64-cgo), const SIOCSPGRP ideal-int
+pkg syscall (freebsd-arm64-cgo), const SizeofBpfHdr = 32
+pkg syscall (freebsd-arm64-cgo), const SizeofBpfHdr ideal-int
+pkg syscall (freebsd-arm64-cgo), const SizeofBpfInsn = 8
+pkg syscall (freebsd-arm64-cgo), const SizeofBpfInsn ideal-int
+pkg syscall (freebsd-arm64-cgo), const SizeofBpfProgram = 16
+pkg syscall (freebsd-arm64-cgo), const SizeofBpfProgram ideal-int
+pkg syscall (freebsd-arm64-cgo), const SizeofBpfStat = 8
+pkg syscall (freebsd-arm64-cgo), const SizeofBpfStat ideal-int
+pkg syscall (freebsd-arm64-cgo), const SizeofBpfVersion = 4
+pkg syscall (freebsd-arm64-cgo), const SizeofBpfVersion ideal-int
+pkg syscall (freebsd-arm64-cgo), const SizeofBpfZbuf = 24
+pkg syscall (freebsd-arm64-cgo), const SizeofBpfZbuf ideal-int
+pkg syscall (freebsd-arm64-cgo), const SizeofBpfZbufHeader = 32
+pkg syscall (freebsd-arm64-cgo), const SizeofBpfZbufHeader ideal-int
+pkg syscall (freebsd-arm64-cgo), const SizeofCmsghdr = 12
+pkg syscall (freebsd-arm64-cgo), const SizeofCmsghdr ideal-int
+pkg syscall (freebsd-arm64-cgo), const SizeofICMPv6Filter = 32
+pkg syscall (freebsd-arm64-cgo), const SizeofICMPv6Filter ideal-int
+pkg syscall (freebsd-arm64-cgo), const SizeofIfaMsghdr = 20
+pkg syscall (freebsd-arm64-cgo), const SizeofIfaMsghdr ideal-int
+pkg syscall (freebsd-arm64-cgo), const SizeofIfAnnounceMsghdr = 24
+pkg syscall (freebsd-arm64-cgo), const SizeofIfAnnounceMsghdr ideal-int
+pkg syscall (freebsd-arm64-cgo), const SizeofIfData = 152
+pkg syscall (freebsd-arm64-cgo), const SizeofIfData ideal-int
+pkg syscall (freebsd-arm64-cgo), const SizeofIfmaMsghdr = 16
+pkg syscall (freebsd-arm64-cgo), const SizeofIfmaMsghdr ideal-int
+pkg syscall (freebsd-arm64-cgo), const SizeofIfMsghdr = 168
+pkg syscall (freebsd-arm64-cgo), const SizeofIfMsghdr ideal-int
+pkg syscall (freebsd-arm64-cgo), const SizeofInet6Pktinfo = 20
+pkg syscall (freebsd-arm64-cgo), const SizeofInet6Pktinfo ideal-int
+pkg syscall (freebsd-arm64-cgo), const SizeofIPMreq = 8
+pkg syscall (freebsd-arm64-cgo), const SizeofIPMreq ideal-int
+pkg syscall (freebsd-arm64-cgo), const SizeofIPMreqn = 12
+pkg syscall (freebsd-arm64-cgo), const SizeofIPMreqn ideal-int
+pkg syscall (freebsd-arm64-cgo), const SizeofIPv6Mreq = 20
+pkg syscall (freebsd-arm64-cgo), const SizeofIPv6Mreq ideal-int
+pkg syscall (freebsd-arm64-cgo), const SizeofIPv6MTUInfo = 32
+pkg syscall (freebsd-arm64-cgo), const SizeofIPv6MTUInfo ideal-int
+pkg syscall (freebsd-arm64-cgo), const SizeofLinger = 8
+pkg syscall (freebsd-arm64-cgo), const SizeofLinger ideal-int
+pkg syscall (freebsd-arm64-cgo), const SizeofMsghdr = 48
+pkg syscall (freebsd-arm64-cgo), const SizeofMsghdr ideal-int
+pkg syscall (freebsd-arm64-cgo), const SizeofRtMetrics = 112
+pkg syscall (freebsd-arm64-cgo), const SizeofRtMetrics ideal-int
+pkg syscall (freebsd-arm64-cgo), const SizeofRtMsghdr = 152
+pkg syscall (freebsd-arm64-cgo), const SizeofRtMsghdr ideal-int
+pkg syscall (freebsd-arm64-cgo), const SizeofSockaddrAny = 108
+pkg syscall (freebsd-arm64-cgo), const SizeofSockaddrAny ideal-int
+pkg syscall (freebsd-arm64-cgo), const SizeofSockaddrDatalink = 54
+pkg syscall (freebsd-arm64-cgo), const SizeofSockaddrDatalink ideal-int
+pkg syscall (freebsd-arm64-cgo), const SizeofSockaddrInet4 = 16
+pkg syscall (freebsd-arm64-cgo), const SizeofSockaddrInet4 ideal-int
+pkg syscall (freebsd-arm64-cgo), const SizeofSockaddrInet6 = 28
+pkg syscall (freebsd-arm64-cgo), const SizeofSockaddrInet6 ideal-int
+pkg syscall (freebsd-arm64-cgo), const SizeofSockaddrUnix = 106
+pkg syscall (freebsd-arm64-cgo), const SizeofSockaddrUnix ideal-int
+pkg syscall (freebsd-arm64-cgo), const SO_ACCEPTCONN = 2
+pkg syscall (freebsd-arm64-cgo), const SO_ACCEPTCONN ideal-int
+pkg syscall (freebsd-arm64-cgo), const SO_ACCEPTFILTER = 4096
+pkg syscall (freebsd-arm64-cgo), const SO_ACCEPTFILTER ideal-int
+pkg syscall (freebsd-arm64-cgo), const SO_BINTIME = 8192
+pkg syscall (freebsd-arm64-cgo), const SO_BINTIME ideal-int
+pkg syscall (freebsd-arm64-cgo), const SO_BROADCAST = 32
+pkg syscall (freebsd-arm64-cgo), const SO_DEBUG = 1
+pkg syscall (freebsd-arm64-cgo), const SO_DEBUG ideal-int
+pkg syscall (freebsd-arm64-cgo), const SO_DONTROUTE = 16
+pkg syscall (freebsd-arm64-cgo), const SO_ERROR = 4103
+pkg syscall (freebsd-arm64-cgo), const SO_ERROR ideal-int
+pkg syscall (freebsd-arm64-cgo), const SO_KEEPALIVE = 8
+pkg syscall (freebsd-arm64-cgo), const SO_LABEL = 4105
+pkg syscall (freebsd-arm64-cgo), const SO_LABEL ideal-int
+pkg syscall (freebsd-arm64-cgo), const SO_LINGER = 128
+pkg syscall (freebsd-arm64-cgo), const SO_LISTENINCQLEN = 4115
+pkg syscall (freebsd-arm64-cgo), const SO_LISTENINCQLEN ideal-int
+pkg syscall (freebsd-arm64-cgo), const SO_LISTENQLEN = 4114
+pkg syscall (freebsd-arm64-cgo), const SO_LISTENQLEN ideal-int
+pkg syscall (freebsd-arm64-cgo), const SO_LISTENQLIMIT = 4113
+pkg syscall (freebsd-arm64-cgo), const SO_LISTENQLIMIT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SO_NO_DDP = 32768
+pkg syscall (freebsd-arm64-cgo), const SO_NO_DDP ideal-int
+pkg syscall (freebsd-arm64-cgo), const SO_NO_OFFLOAD = 16384
+pkg syscall (freebsd-arm64-cgo), const SO_NO_OFFLOAD ideal-int
+pkg syscall (freebsd-arm64-cgo), const SO_NOSIGPIPE = 2048
+pkg syscall (freebsd-arm64-cgo), const SO_NOSIGPIPE ideal-int
+pkg syscall (freebsd-arm64-cgo), const SO_OOBINLINE = 256
+pkg syscall (freebsd-arm64-cgo), const SO_OOBINLINE ideal-int
+pkg syscall (freebsd-arm64-cgo), const SO_PEERLABEL = 4112
+pkg syscall (freebsd-arm64-cgo), const SO_PEERLABEL ideal-int
+pkg syscall (freebsd-arm64-cgo), const SO_PROTOCOL = 4118
+pkg syscall (freebsd-arm64-cgo), const SO_PROTOCOL ideal-int
+pkg syscall (freebsd-arm64-cgo), const SO_PROTOTYPE = 4118
+pkg syscall (freebsd-arm64-cgo), const SO_PROTOTYPE ideal-int
+pkg syscall (freebsd-arm64-cgo), const SO_RCVBUF = 4098
+pkg syscall (freebsd-arm64-cgo), const SO_RCVLOWAT = 4100
+pkg syscall (freebsd-arm64-cgo), const SO_RCVLOWAT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SO_RCVTIMEO = 4102
+pkg syscall (freebsd-arm64-cgo), const SO_RCVTIMEO ideal-int
+pkg syscall (freebsd-arm64-cgo), const SO_REUSEADDR = 4
+pkg syscall (freebsd-arm64-cgo), const SO_REUSEPORT = 512
+pkg syscall (freebsd-arm64-cgo), const SO_REUSEPORT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SO_SETFIB = 4116
+pkg syscall (freebsd-arm64-cgo), const SO_SETFIB ideal-int
+pkg syscall (freebsd-arm64-cgo), const SO_SNDBUF = 4097
+pkg syscall (freebsd-arm64-cgo), const SO_SNDLOWAT = 4099
+pkg syscall (freebsd-arm64-cgo), const SO_SNDLOWAT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SO_SNDTIMEO = 4101
+pkg syscall (freebsd-arm64-cgo), const SO_SNDTIMEO ideal-int
+pkg syscall (freebsd-arm64-cgo), const SO_TIMESTAMP = 1024
+pkg syscall (freebsd-arm64-cgo), const SO_TIMESTAMP ideal-int
+pkg syscall (freebsd-arm64-cgo), const SO_TYPE = 4104
+pkg syscall (freebsd-arm64-cgo), const SO_TYPE ideal-int
+pkg syscall (freebsd-arm64-cgo), const SO_USELOOPBACK = 64
+pkg syscall (freebsd-arm64-cgo), const SO_USELOOPBACK ideal-int
+pkg syscall (freebsd-arm64-cgo), const SO_USER_COOKIE = 4117
+pkg syscall (freebsd-arm64-cgo), const SO_USER_COOKIE ideal-int
+pkg syscall (freebsd-arm64-cgo), const SO_VENDOR = 2147483648
+pkg syscall (freebsd-arm64-cgo), const SO_VENDOR ideal-int
+pkg syscall (freebsd-arm64-cgo), const SOCK_CLOEXEC = 268435456
+pkg syscall (freebsd-arm64-cgo), const SOCK_CLOEXEC ideal-int
+pkg syscall (freebsd-arm64-cgo), const SOCK_MAXADDRLEN = 255
+pkg syscall (freebsd-arm64-cgo), const SOCK_MAXADDRLEN ideal-int
+pkg syscall (freebsd-arm64-cgo), const SOCK_NONBLOCK = 536870912
+pkg syscall (freebsd-arm64-cgo), const SOCK_NONBLOCK ideal-int
+pkg syscall (freebsd-arm64-cgo), const SOCK_RDM = 4
+pkg syscall (freebsd-arm64-cgo), const SOCK_RDM ideal-int
+pkg syscall (freebsd-arm64-cgo), const SOL_SOCKET = 65535
+pkg syscall (freebsd-arm64-cgo), const SOMAXCONN = 128
+pkg syscall (freebsd-arm64-cgo), const SYS___ACL_ACLCHECK_FD = 354
+pkg syscall (freebsd-arm64-cgo), const SYS___ACL_ACLCHECK_FD ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS___ACL_ACLCHECK_FILE = 353
+pkg syscall (freebsd-arm64-cgo), const SYS___ACL_ACLCHECK_FILE ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS___ACL_ACLCHECK_LINK = 428
+pkg syscall (freebsd-arm64-cgo), const SYS___ACL_ACLCHECK_LINK ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS___ACL_DELETE_FD = 352
+pkg syscall (freebsd-arm64-cgo), const SYS___ACL_DELETE_FD ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS___ACL_DELETE_FILE = 351
+pkg syscall (freebsd-arm64-cgo), const SYS___ACL_DELETE_FILE ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS___ACL_DELETE_LINK = 427
+pkg syscall (freebsd-arm64-cgo), const SYS___ACL_DELETE_LINK ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS___ACL_GET_FD = 349
+pkg syscall (freebsd-arm64-cgo), const SYS___ACL_GET_FD ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS___ACL_GET_FILE = 347
+pkg syscall (freebsd-arm64-cgo), const SYS___ACL_GET_FILE ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS___ACL_GET_LINK = 425
+pkg syscall (freebsd-arm64-cgo), const SYS___ACL_GET_LINK ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS___ACL_SET_FD = 350
+pkg syscall (freebsd-arm64-cgo), const SYS___ACL_SET_FD ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS___ACL_SET_FILE = 348
+pkg syscall (freebsd-arm64-cgo), const SYS___ACL_SET_FILE ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS___ACL_SET_LINK = 426
+pkg syscall (freebsd-arm64-cgo), const SYS___ACL_SET_LINK ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS___CAP_RIGHTS_GET = 515
+pkg syscall (freebsd-arm64-cgo), const SYS___CAP_RIGHTS_GET ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS___GETCWD = 326
+pkg syscall (freebsd-arm64-cgo), const SYS___GETCWD ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS___MAC_EXECVE = 415
+pkg syscall (freebsd-arm64-cgo), const SYS___MAC_EXECVE ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS___MAC_GET_FD = 386
+pkg syscall (freebsd-arm64-cgo), const SYS___MAC_GET_FD ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS___MAC_GET_FILE = 387
+pkg syscall (freebsd-arm64-cgo), const SYS___MAC_GET_FILE ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS___MAC_GET_LINK = 410
+pkg syscall (freebsd-arm64-cgo), const SYS___MAC_GET_LINK ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS___MAC_GET_PID = 409
+pkg syscall (freebsd-arm64-cgo), const SYS___MAC_GET_PID ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS___MAC_GET_PROC = 384
+pkg syscall (freebsd-arm64-cgo), const SYS___MAC_GET_PROC ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS___MAC_SET_FD = 388
+pkg syscall (freebsd-arm64-cgo), const SYS___MAC_SET_FD ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS___MAC_SET_FILE = 389
+pkg syscall (freebsd-arm64-cgo), const SYS___MAC_SET_FILE ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS___MAC_SET_LINK = 411
+pkg syscall (freebsd-arm64-cgo), const SYS___MAC_SET_LINK ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS___MAC_SET_PROC = 385
+pkg syscall (freebsd-arm64-cgo), const SYS___MAC_SET_PROC ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS___SEMCTL = 510
+pkg syscall (freebsd-arm64-cgo), const SYS___SEMCTL ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS___SETUGID = 374
+pkg syscall (freebsd-arm64-cgo), const SYS___SETUGID ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS___SYSCTL = 202
+pkg syscall (freebsd-arm64-cgo), const SYS___SYSCTL ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS__UMTX_OP = 454
+pkg syscall (freebsd-arm64-cgo), const SYS__UMTX_OP ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_ABORT2 = 463
+pkg syscall (freebsd-arm64-cgo), const SYS_ABORT2 ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_ACCEPT = 30
+pkg syscall (freebsd-arm64-cgo), const SYS_ACCEPT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_ACCEPT4 = 541
+pkg syscall (freebsd-arm64-cgo), const SYS_ACCEPT4 ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_ACCESS = 33
+pkg syscall (freebsd-arm64-cgo), const SYS_ACCESS ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_ACCT = 51
+pkg syscall (freebsd-arm64-cgo), const SYS_ACCT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_ADJTIME = 140
+pkg syscall (freebsd-arm64-cgo), const SYS_ADJTIME ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_AIO_CANCEL = 316
+pkg syscall (freebsd-arm64-cgo), const SYS_AIO_CANCEL ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_AIO_ERROR = 317
+pkg syscall (freebsd-arm64-cgo), const SYS_AIO_ERROR ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_AIO_FSYNC = 465
+pkg syscall (freebsd-arm64-cgo), const SYS_AIO_FSYNC ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_AIO_MLOCK = 543
+pkg syscall (freebsd-arm64-cgo), const SYS_AIO_MLOCK ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_AIO_READ = 255
+pkg syscall (freebsd-arm64-cgo), const SYS_AIO_READ ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_AIO_RETURN = 314
+pkg syscall (freebsd-arm64-cgo), const SYS_AIO_RETURN ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_AIO_SUSPEND = 315
+pkg syscall (freebsd-arm64-cgo), const SYS_AIO_SUSPEND ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_AIO_WAITCOMPLETE = 359
+pkg syscall (freebsd-arm64-cgo), const SYS_AIO_WAITCOMPLETE ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_AIO_WRITE = 256
+pkg syscall (freebsd-arm64-cgo), const SYS_AIO_WRITE ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_AUDIT = 445
+pkg syscall (freebsd-arm64-cgo), const SYS_AUDIT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_AUDITCTL = 453
+pkg syscall (freebsd-arm64-cgo), const SYS_AUDITCTL ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_AUDITON = 446
+pkg syscall (freebsd-arm64-cgo), const SYS_AUDITON ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_BIND = 104
+pkg syscall (freebsd-arm64-cgo), const SYS_BIND ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_BINDAT = 538
+pkg syscall (freebsd-arm64-cgo), const SYS_BINDAT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_CAP_ENTER = 516
+pkg syscall (freebsd-arm64-cgo), const SYS_CAP_ENTER ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_CAP_FCNTLS_GET = 537
+pkg syscall (freebsd-arm64-cgo), const SYS_CAP_FCNTLS_GET ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_CAP_FCNTLS_LIMIT = 536
+pkg syscall (freebsd-arm64-cgo), const SYS_CAP_FCNTLS_LIMIT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_CAP_GETMODE = 517
+pkg syscall (freebsd-arm64-cgo), const SYS_CAP_GETMODE ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_CAP_IOCTLS_GET = 535
+pkg syscall (freebsd-arm64-cgo), const SYS_CAP_IOCTLS_GET ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_CAP_IOCTLS_LIMIT = 534
+pkg syscall (freebsd-arm64-cgo), const SYS_CAP_IOCTLS_LIMIT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_CAP_RIGHTS_LIMIT = 533
+pkg syscall (freebsd-arm64-cgo), const SYS_CAP_RIGHTS_LIMIT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_CHDIR = 12
+pkg syscall (freebsd-arm64-cgo), const SYS_CHDIR ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_CHFLAGS = 34
+pkg syscall (freebsd-arm64-cgo), const SYS_CHFLAGS ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_CHFLAGSAT = 540
+pkg syscall (freebsd-arm64-cgo), const SYS_CHFLAGSAT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_CHMOD = 15
+pkg syscall (freebsd-arm64-cgo), const SYS_CHMOD ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_CHOWN = 16
+pkg syscall (freebsd-arm64-cgo), const SYS_CHOWN ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_CHROOT = 61
+pkg syscall (freebsd-arm64-cgo), const SYS_CHROOT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_CLOCK_GETCPUCLOCKID2 = 247
+pkg syscall (freebsd-arm64-cgo), const SYS_CLOCK_GETCPUCLOCKID2 ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_CLOCK_GETRES = 234
+pkg syscall (freebsd-arm64-cgo), const SYS_CLOCK_GETRES ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_CLOCK_GETTIME = 232
+pkg syscall (freebsd-arm64-cgo), const SYS_CLOCK_GETTIME ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_CLOCK_NANOSLEEP = 244
+pkg syscall (freebsd-arm64-cgo), const SYS_CLOCK_NANOSLEEP ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_CLOCK_SETTIME = 233
+pkg syscall (freebsd-arm64-cgo), const SYS_CLOCK_SETTIME ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_CLOSE = 6
+pkg syscall (freebsd-arm64-cgo), const SYS_CLOSE ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_CLOSEFROM = 509
+pkg syscall (freebsd-arm64-cgo), const SYS_CLOSEFROM ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_CONNECT = 98
+pkg syscall (freebsd-arm64-cgo), const SYS_CONNECT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_CONNECTAT = 539
+pkg syscall (freebsd-arm64-cgo), const SYS_CONNECTAT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_CPUSET = 484
+pkg syscall (freebsd-arm64-cgo), const SYS_CPUSET ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_CPUSET_GETAFFINITY = 487
+pkg syscall (freebsd-arm64-cgo), const SYS_CPUSET_GETAFFINITY ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_CPUSET_GETID = 486
+pkg syscall (freebsd-arm64-cgo), const SYS_CPUSET_GETID ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_CPUSET_SETAFFINITY = 488
+pkg syscall (freebsd-arm64-cgo), const SYS_CPUSET_SETAFFINITY ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_CPUSET_SETID = 485
+pkg syscall (freebsd-arm64-cgo), const SYS_CPUSET_SETID ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_DUP = 41
+pkg syscall (freebsd-arm64-cgo), const SYS_DUP ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_DUP2 = 90
+pkg syscall (freebsd-arm64-cgo), const SYS_DUP2 ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_EACCESS = 376
+pkg syscall (freebsd-arm64-cgo), const SYS_EACCESS ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_EXECVE = 59
+pkg syscall (freebsd-arm64-cgo), const SYS_EXECVE ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_EXIT = 1
+pkg syscall (freebsd-arm64-cgo), const SYS_EXIT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_EXTATTR_DELETE_FD = 373
+pkg syscall (freebsd-arm64-cgo), const SYS_EXTATTR_DELETE_FD ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_EXTATTR_DELETE_FILE = 358
+pkg syscall (freebsd-arm64-cgo), const SYS_EXTATTR_DELETE_FILE ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_EXTATTR_DELETE_LINK = 414
+pkg syscall (freebsd-arm64-cgo), const SYS_EXTATTR_DELETE_LINK ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_EXTATTR_GET_FD = 372
+pkg syscall (freebsd-arm64-cgo), const SYS_EXTATTR_GET_FD ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_EXTATTR_GET_FILE = 357
+pkg syscall (freebsd-arm64-cgo), const SYS_EXTATTR_GET_FILE ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_EXTATTR_GET_LINK = 413
+pkg syscall (freebsd-arm64-cgo), const SYS_EXTATTR_GET_LINK ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_EXTATTR_LIST_FD = 437
+pkg syscall (freebsd-arm64-cgo), const SYS_EXTATTR_LIST_FD ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_EXTATTR_LIST_FILE = 438
+pkg syscall (freebsd-arm64-cgo), const SYS_EXTATTR_LIST_FILE ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_EXTATTR_LIST_LINK = 439
+pkg syscall (freebsd-arm64-cgo), const SYS_EXTATTR_LIST_LINK ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_EXTATTR_SET_FD = 371
+pkg syscall (freebsd-arm64-cgo), const SYS_EXTATTR_SET_FD ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_EXTATTR_SET_FILE = 356
+pkg syscall (freebsd-arm64-cgo), const SYS_EXTATTR_SET_FILE ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_EXTATTR_SET_LINK = 412
+pkg syscall (freebsd-arm64-cgo), const SYS_EXTATTR_SET_LINK ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_EXTATTRCTL = 355
+pkg syscall (freebsd-arm64-cgo), const SYS_EXTATTRCTL ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_FACCESSAT = 489
+pkg syscall (freebsd-arm64-cgo), const SYS_FACCESSAT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_FCHDIR = 13
+pkg syscall (freebsd-arm64-cgo), const SYS_FCHDIR ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_FCHFLAGS = 35
+pkg syscall (freebsd-arm64-cgo), const SYS_FCHFLAGS ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_FCHMOD = 124
+pkg syscall (freebsd-arm64-cgo), const SYS_FCHMOD ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_FCHMODAT = 490
+pkg syscall (freebsd-arm64-cgo), const SYS_FCHMODAT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_FCHOWN = 123
+pkg syscall (freebsd-arm64-cgo), const SYS_FCHOWN ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_FCHOWNAT = 491
+pkg syscall (freebsd-arm64-cgo), const SYS_FCHOWNAT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_FCNTL = 92
+pkg syscall (freebsd-arm64-cgo), const SYS_FCNTL ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_FDATASYNC = 550
+pkg syscall (freebsd-arm64-cgo), const SYS_FDATASYNC ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_FEXECVE = 492
+pkg syscall (freebsd-arm64-cgo), const SYS_FEXECVE ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_FFCLOCK_GETCOUNTER = 241
+pkg syscall (freebsd-arm64-cgo), const SYS_FFCLOCK_GETCOUNTER ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_FFCLOCK_GETESTIMATE = 243
+pkg syscall (freebsd-arm64-cgo), const SYS_FFCLOCK_GETESTIMATE ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_FFCLOCK_SETESTIMATE = 242
+pkg syscall (freebsd-arm64-cgo), const SYS_FFCLOCK_SETESTIMATE ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_FHOPEN = 298
+pkg syscall (freebsd-arm64-cgo), const SYS_FHOPEN ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_FHSTAT = 299
+pkg syscall (freebsd-arm64-cgo), const SYS_FHSTAT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_FHSTATFS = 398
+pkg syscall (freebsd-arm64-cgo), const SYS_FHSTATFS ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_FLOCK = 131
+pkg syscall (freebsd-arm64-cgo), const SYS_FLOCK ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_FORK = 2
+pkg syscall (freebsd-arm64-cgo), const SYS_FORK ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_FPATHCONF = 192
+pkg syscall (freebsd-arm64-cgo), const SYS_FPATHCONF ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_FSTAT = 189
+pkg syscall (freebsd-arm64-cgo), const SYS_FSTAT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_FSTATAT = 493
+pkg syscall (freebsd-arm64-cgo), const SYS_FSTATAT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_FSTATFS = 397
+pkg syscall (freebsd-arm64-cgo), const SYS_FSTATFS ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_FSYNC = 95
+pkg syscall (freebsd-arm64-cgo), const SYS_FSYNC ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_FTRUNCATE = 480
+pkg syscall (freebsd-arm64-cgo), const SYS_FTRUNCATE ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_FUTIMENS = 546
+pkg syscall (freebsd-arm64-cgo), const SYS_FUTIMENS ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_FUTIMES = 206
+pkg syscall (freebsd-arm64-cgo), const SYS_FUTIMES ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_FUTIMESAT = 494
+pkg syscall (freebsd-arm64-cgo), const SYS_FUTIMESAT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_GETAUDIT = 449
+pkg syscall (freebsd-arm64-cgo), const SYS_GETAUDIT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_GETAUDIT_ADDR = 451
+pkg syscall (freebsd-arm64-cgo), const SYS_GETAUDIT_ADDR ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_GETAUID = 447
+pkg syscall (freebsd-arm64-cgo), const SYS_GETAUID ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_GETCONTEXT = 421
+pkg syscall (freebsd-arm64-cgo), const SYS_GETCONTEXT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_GETDENTS = 272
+pkg syscall (freebsd-arm64-cgo), const SYS_GETDENTS ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_GETDIRENTRIES = 196
+pkg syscall (freebsd-arm64-cgo), const SYS_GETDIRENTRIES ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_GETDTABLESIZE = 89
+pkg syscall (freebsd-arm64-cgo), const SYS_GETDTABLESIZE ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_GETEGID = 43
+pkg syscall (freebsd-arm64-cgo), const SYS_GETEGID ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_GETEUID = 25
+pkg syscall (freebsd-arm64-cgo), const SYS_GETEUID ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_GETFH = 161
+pkg syscall (freebsd-arm64-cgo), const SYS_GETFH ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_GETFSSTAT = 395
+pkg syscall (freebsd-arm64-cgo), const SYS_GETFSSTAT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_GETGID = 47
+pkg syscall (freebsd-arm64-cgo), const SYS_GETGID ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_GETGROUPS = 79
+pkg syscall (freebsd-arm64-cgo), const SYS_GETGROUPS ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_GETITIMER = 86
+pkg syscall (freebsd-arm64-cgo), const SYS_GETITIMER ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_GETLOGIN = 49
+pkg syscall (freebsd-arm64-cgo), const SYS_GETLOGIN ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_GETLOGINCLASS = 523
+pkg syscall (freebsd-arm64-cgo), const SYS_GETLOGINCLASS ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_GETPEERNAME = 31
+pkg syscall (freebsd-arm64-cgo), const SYS_GETPEERNAME ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_GETPGID = 207
+pkg syscall (freebsd-arm64-cgo), const SYS_GETPGID ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_GETPGRP = 81
+pkg syscall (freebsd-arm64-cgo), const SYS_GETPGRP ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_GETPID = 20
+pkg syscall (freebsd-arm64-cgo), const SYS_GETPID ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_GETPPID = 39
+pkg syscall (freebsd-arm64-cgo), const SYS_GETPPID ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_GETPRIORITY = 100
+pkg syscall (freebsd-arm64-cgo), const SYS_GETPRIORITY ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_GETRESGID = 361
+pkg syscall (freebsd-arm64-cgo), const SYS_GETRESGID ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_GETRESUID = 360
+pkg syscall (freebsd-arm64-cgo), const SYS_GETRESUID ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_GETRLIMIT = 194
+pkg syscall (freebsd-arm64-cgo), const SYS_GETRLIMIT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_GETRUSAGE = 117
+pkg syscall (freebsd-arm64-cgo), const SYS_GETRUSAGE ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_GETSID = 310
+pkg syscall (freebsd-arm64-cgo), const SYS_GETSID ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_GETSOCKNAME = 32
+pkg syscall (freebsd-arm64-cgo), const SYS_GETSOCKNAME ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_GETSOCKOPT = 118
+pkg syscall (freebsd-arm64-cgo), const SYS_GETSOCKOPT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_GETTIMEOFDAY = 116
+pkg syscall (freebsd-arm64-cgo), const SYS_GETTIMEOFDAY ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_GETUID = 24
+pkg syscall (freebsd-arm64-cgo), const SYS_GETUID ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_GSSD_SYSCALL = 505
+pkg syscall (freebsd-arm64-cgo), const SYS_GSSD_SYSCALL ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_IOCTL = 54
+pkg syscall (freebsd-arm64-cgo), const SYS_IOCTL ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_ISSETUGID = 253
+pkg syscall (freebsd-arm64-cgo), const SYS_ISSETUGID ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_JAIL = 338
+pkg syscall (freebsd-arm64-cgo), const SYS_JAIL ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_JAIL_ATTACH = 436
+pkg syscall (freebsd-arm64-cgo), const SYS_JAIL_ATTACH ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_JAIL_GET = 506
+pkg syscall (freebsd-arm64-cgo), const SYS_JAIL_GET ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_JAIL_REMOVE = 508
+pkg syscall (freebsd-arm64-cgo), const SYS_JAIL_REMOVE ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_JAIL_SET = 507
+pkg syscall (freebsd-arm64-cgo), const SYS_JAIL_SET ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_KENV = 390
+pkg syscall (freebsd-arm64-cgo), const SYS_KENV ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_KEVENT = 363
+pkg syscall (freebsd-arm64-cgo), const SYS_KEVENT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_KILL = 37
+pkg syscall (freebsd-arm64-cgo), const SYS_KILL ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_KLDFIND = 306
+pkg syscall (freebsd-arm64-cgo), const SYS_KLDFIND ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_KLDFIRSTMOD = 309
+pkg syscall (freebsd-arm64-cgo), const SYS_KLDFIRSTMOD ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_KLDLOAD = 304
+pkg syscall (freebsd-arm64-cgo), const SYS_KLDLOAD ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_KLDNEXT = 307
+pkg syscall (freebsd-arm64-cgo), const SYS_KLDNEXT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_KLDSTAT = 308
+pkg syscall (freebsd-arm64-cgo), const SYS_KLDSTAT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_KLDSYM = 337
+pkg syscall (freebsd-arm64-cgo), const SYS_KLDSYM ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_KLDUNLOAD = 305
+pkg syscall (freebsd-arm64-cgo), const SYS_KLDUNLOAD ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_KLDUNLOADF = 444
+pkg syscall (freebsd-arm64-cgo), const SYS_KLDUNLOADF ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_KMQ_NOTIFY = 461
+pkg syscall (freebsd-arm64-cgo), const SYS_KMQ_NOTIFY ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_KMQ_OPEN = 457
+pkg syscall (freebsd-arm64-cgo), const SYS_KMQ_OPEN ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_KMQ_SETATTR = 458
+pkg syscall (freebsd-arm64-cgo), const SYS_KMQ_SETATTR ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_KMQ_TIMEDRECEIVE = 459
+pkg syscall (freebsd-arm64-cgo), const SYS_KMQ_TIMEDRECEIVE ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_KMQ_TIMEDSEND = 460
+pkg syscall (freebsd-arm64-cgo), const SYS_KMQ_TIMEDSEND ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_KMQ_UNLINK = 462
+pkg syscall (freebsd-arm64-cgo), const SYS_KMQ_UNLINK ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_KQUEUE = 362
+pkg syscall (freebsd-arm64-cgo), const SYS_KQUEUE ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_KSEM_CLOSE = 400
+pkg syscall (freebsd-arm64-cgo), const SYS_KSEM_CLOSE ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_KSEM_DESTROY = 408
+pkg syscall (freebsd-arm64-cgo), const SYS_KSEM_DESTROY ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_KSEM_GETVALUE = 407
+pkg syscall (freebsd-arm64-cgo), const SYS_KSEM_GETVALUE ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_KSEM_INIT = 404
+pkg syscall (freebsd-arm64-cgo), const SYS_KSEM_INIT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_KSEM_OPEN = 405
+pkg syscall (freebsd-arm64-cgo), const SYS_KSEM_OPEN ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_KSEM_POST = 401
+pkg syscall (freebsd-arm64-cgo), const SYS_KSEM_POST ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_KSEM_TIMEDWAIT = 441
+pkg syscall (freebsd-arm64-cgo), const SYS_KSEM_TIMEDWAIT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_KSEM_TRYWAIT = 403
+pkg syscall (freebsd-arm64-cgo), const SYS_KSEM_TRYWAIT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_KSEM_UNLINK = 406
+pkg syscall (freebsd-arm64-cgo), const SYS_KSEM_UNLINK ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_KSEM_WAIT = 402
+pkg syscall (freebsd-arm64-cgo), const SYS_KSEM_WAIT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_KTIMER_CREATE = 235
+pkg syscall (freebsd-arm64-cgo), const SYS_KTIMER_CREATE ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_KTIMER_DELETE = 236
+pkg syscall (freebsd-arm64-cgo), const SYS_KTIMER_DELETE ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_KTIMER_GETOVERRUN = 239
+pkg syscall (freebsd-arm64-cgo), const SYS_KTIMER_GETOVERRUN ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_KTIMER_GETTIME = 238
+pkg syscall (freebsd-arm64-cgo), const SYS_KTIMER_GETTIME ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_KTIMER_SETTIME = 237
+pkg syscall (freebsd-arm64-cgo), const SYS_KTIMER_SETTIME ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_KTRACE = 45
+pkg syscall (freebsd-arm64-cgo), const SYS_KTRACE ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_LCHFLAGS = 391
+pkg syscall (freebsd-arm64-cgo), const SYS_LCHFLAGS ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_LCHMOD = 274
+pkg syscall (freebsd-arm64-cgo), const SYS_LCHMOD ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_LCHOWN = 254
+pkg syscall (freebsd-arm64-cgo), const SYS_LCHOWN ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_LGETFH = 160
+pkg syscall (freebsd-arm64-cgo), const SYS_LGETFH ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_LINK = 9
+pkg syscall (freebsd-arm64-cgo), const SYS_LINK ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_LINKAT = 495
+pkg syscall (freebsd-arm64-cgo), const SYS_LINKAT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_LIO_LISTIO = 257
+pkg syscall (freebsd-arm64-cgo), const SYS_LIO_LISTIO ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_LISTEN = 106
+pkg syscall (freebsd-arm64-cgo), const SYS_LISTEN ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_LPATHCONF = 513
+pkg syscall (freebsd-arm64-cgo), const SYS_LPATHCONF ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_LSEEK = 478
+pkg syscall (freebsd-arm64-cgo), const SYS_LSEEK ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_LSTAT = 190
+pkg syscall (freebsd-arm64-cgo), const SYS_LSTAT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_LUTIMES = 276
+pkg syscall (freebsd-arm64-cgo), const SYS_LUTIMES ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_MAC_SYSCALL = 394
+pkg syscall (freebsd-arm64-cgo), const SYS_MAC_SYSCALL ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_MADVISE = 75
+pkg syscall (freebsd-arm64-cgo), const SYS_MADVISE ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_MINCORE = 78
+pkg syscall (freebsd-arm64-cgo), const SYS_MINCORE ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_MINHERIT = 250
+pkg syscall (freebsd-arm64-cgo), const SYS_MINHERIT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_MKDIR = 136
+pkg syscall (freebsd-arm64-cgo), const SYS_MKDIR ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_MKDIRAT = 496
+pkg syscall (freebsd-arm64-cgo), const SYS_MKDIRAT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_MKFIFO = 132
+pkg syscall (freebsd-arm64-cgo), const SYS_MKFIFO ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_MKFIFOAT = 497
+pkg syscall (freebsd-arm64-cgo), const SYS_MKFIFOAT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_MKNOD = 14
+pkg syscall (freebsd-arm64-cgo), const SYS_MKNOD ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_MKNODAT = 498
+pkg syscall (freebsd-arm64-cgo), const SYS_MKNODAT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_MLOCK = 203
+pkg syscall (freebsd-arm64-cgo), const SYS_MLOCK ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_MLOCKALL = 324
+pkg syscall (freebsd-arm64-cgo), const SYS_MLOCKALL ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_MMAP = 477
+pkg syscall (freebsd-arm64-cgo), const SYS_MMAP ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_MODFIND = 303
+pkg syscall (freebsd-arm64-cgo), const SYS_MODFIND ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_MODFNEXT = 302
+pkg syscall (freebsd-arm64-cgo), const SYS_MODFNEXT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_MODNEXT = 300
+pkg syscall (freebsd-arm64-cgo), const SYS_MODNEXT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_MODSTAT = 301
+pkg syscall (freebsd-arm64-cgo), const SYS_MODSTAT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_MOUNT = 21
+pkg syscall (freebsd-arm64-cgo), const SYS_MOUNT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_MPROTECT = 74
+pkg syscall (freebsd-arm64-cgo), const SYS_MPROTECT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_MSGCTL = 511
+pkg syscall (freebsd-arm64-cgo), const SYS_MSGCTL ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_MSGGET = 225
+pkg syscall (freebsd-arm64-cgo), const SYS_MSGGET ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_MSGRCV = 227
+pkg syscall (freebsd-arm64-cgo), const SYS_MSGRCV ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_MSGSND = 226
+pkg syscall (freebsd-arm64-cgo), const SYS_MSGSND ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_MSGSYS = 170
+pkg syscall (freebsd-arm64-cgo), const SYS_MSGSYS ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_MSYNC = 65
+pkg syscall (freebsd-arm64-cgo), const SYS_MSYNC ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_MUNLOCK = 204
+pkg syscall (freebsd-arm64-cgo), const SYS_MUNLOCK ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_MUNLOCKALL = 325
+pkg syscall (freebsd-arm64-cgo), const SYS_MUNLOCKALL ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_MUNMAP = 73
+pkg syscall (freebsd-arm64-cgo), const SYS_MUNMAP ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_NANOSLEEP = 240
+pkg syscall (freebsd-arm64-cgo), const SYS_NANOSLEEP ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_NFSSVC = 155
+pkg syscall (freebsd-arm64-cgo), const SYS_NFSSVC ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_NFSTAT = 279
+pkg syscall (freebsd-arm64-cgo), const SYS_NFSTAT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_NLM_SYSCALL = 154
+pkg syscall (freebsd-arm64-cgo), const SYS_NLM_SYSCALL ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_NLSTAT = 280
+pkg syscall (freebsd-arm64-cgo), const SYS_NLSTAT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_NMOUNT = 378
+pkg syscall (freebsd-arm64-cgo), const SYS_NMOUNT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_NSTAT = 278
+pkg syscall (freebsd-arm64-cgo), const SYS_NSTAT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_NTP_ADJTIME = 176
+pkg syscall (freebsd-arm64-cgo), const SYS_NTP_ADJTIME ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_NTP_GETTIME = 248
+pkg syscall (freebsd-arm64-cgo), const SYS_NTP_GETTIME ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_NUMA_GETAFFINITY = 548
+pkg syscall (freebsd-arm64-cgo), const SYS_NUMA_GETAFFINITY ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_NUMA_SETAFFINITY = 549
+pkg syscall (freebsd-arm64-cgo), const SYS_NUMA_SETAFFINITY ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_OBREAK = 17
+pkg syscall (freebsd-arm64-cgo), const SYS_OBREAK ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_OPEN = 5
+pkg syscall (freebsd-arm64-cgo), const SYS_OPEN ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_OPENAT = 499
+pkg syscall (freebsd-arm64-cgo), const SYS_OPENAT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_OPENBSD_POLL = 252
+pkg syscall (freebsd-arm64-cgo), const SYS_OPENBSD_POLL ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_OVADVISE = 72
+pkg syscall (freebsd-arm64-cgo), const SYS_OVADVISE ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_PATHCONF = 191
+pkg syscall (freebsd-arm64-cgo), const SYS_PATHCONF ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_PDFORK = 518
+pkg syscall (freebsd-arm64-cgo), const SYS_PDFORK ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_PDGETPID = 520
+pkg syscall (freebsd-arm64-cgo), const SYS_PDGETPID ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_PDKILL = 519
+pkg syscall (freebsd-arm64-cgo), const SYS_PDKILL ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_PIPE = 42
+pkg syscall (freebsd-arm64-cgo), const SYS_PIPE ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_PIPE2 = 542
+pkg syscall (freebsd-arm64-cgo), const SYS_PIPE2 ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_POLL = 209
+pkg syscall (freebsd-arm64-cgo), const SYS_POLL ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_POSIX_FADVISE = 531
+pkg syscall (freebsd-arm64-cgo), const SYS_POSIX_FADVISE ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_POSIX_FALLOCATE = 530
+pkg syscall (freebsd-arm64-cgo), const SYS_POSIX_FALLOCATE ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_POSIX_OPENPT = 504
+pkg syscall (freebsd-arm64-cgo), const SYS_POSIX_OPENPT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_PPOLL = 545
+pkg syscall (freebsd-arm64-cgo), const SYS_PPOLL ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_PREAD = 475
+pkg syscall (freebsd-arm64-cgo), const SYS_PREAD ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_PREADV = 289
+pkg syscall (freebsd-arm64-cgo), const SYS_PREADV ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_PROCCTL = 544
+pkg syscall (freebsd-arm64-cgo), const SYS_PROCCTL ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_PROFIL = 44
+pkg syscall (freebsd-arm64-cgo), const SYS_PROFIL ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_PSELECT = 522
+pkg syscall (freebsd-arm64-cgo), const SYS_PSELECT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_PTRACE = 26
+pkg syscall (freebsd-arm64-cgo), const SYS_PTRACE ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_PWRITE = 476
+pkg syscall (freebsd-arm64-cgo), const SYS_PWRITE ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_PWRITEV = 290
+pkg syscall (freebsd-arm64-cgo), const SYS_PWRITEV ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_QUOTACTL = 148
+pkg syscall (freebsd-arm64-cgo), const SYS_QUOTACTL ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_RCTL_ADD_RULE = 528
+pkg syscall (freebsd-arm64-cgo), const SYS_RCTL_ADD_RULE ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_RCTL_GET_LIMITS = 527
+pkg syscall (freebsd-arm64-cgo), const SYS_RCTL_GET_LIMITS ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_RCTL_GET_RACCT = 525
+pkg syscall (freebsd-arm64-cgo), const SYS_RCTL_GET_RACCT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_RCTL_GET_RULES = 526
+pkg syscall (freebsd-arm64-cgo), const SYS_RCTL_GET_RULES ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_RCTL_REMOVE_RULE = 529
+pkg syscall (freebsd-arm64-cgo), const SYS_RCTL_REMOVE_RULE ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_READ = 3
+pkg syscall (freebsd-arm64-cgo), const SYS_READ ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_READLINK = 58
+pkg syscall (freebsd-arm64-cgo), const SYS_READLINK ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_READLINKAT = 500
+pkg syscall (freebsd-arm64-cgo), const SYS_READLINKAT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_READV = 120
+pkg syscall (freebsd-arm64-cgo), const SYS_READV ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_REBOOT = 55
+pkg syscall (freebsd-arm64-cgo), const SYS_REBOOT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_RECVFROM = 29
+pkg syscall (freebsd-arm64-cgo), const SYS_RECVFROM ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_RECVMSG = 27
+pkg syscall (freebsd-arm64-cgo), const SYS_RECVMSG ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_RENAME = 128
+pkg syscall (freebsd-arm64-cgo), const SYS_RENAME ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_RENAMEAT = 501
+pkg syscall (freebsd-arm64-cgo), const SYS_RENAMEAT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_REVOKE = 56
+pkg syscall (freebsd-arm64-cgo), const SYS_REVOKE ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_RFORK = 251
+pkg syscall (freebsd-arm64-cgo), const SYS_RFORK ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_RMDIR = 137
+pkg syscall (freebsd-arm64-cgo), const SYS_RMDIR ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_RTPRIO = 166
+pkg syscall (freebsd-arm64-cgo), const SYS_RTPRIO ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_RTPRIO_THREAD = 466
+pkg syscall (freebsd-arm64-cgo), const SYS_RTPRIO_THREAD ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SBRK = 69
+pkg syscall (freebsd-arm64-cgo), const SYS_SBRK ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SCHED_GET_PRIORITY_MAX = 332
+pkg syscall (freebsd-arm64-cgo), const SYS_SCHED_GET_PRIORITY_MAX ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SCHED_GET_PRIORITY_MIN = 333
+pkg syscall (freebsd-arm64-cgo), const SYS_SCHED_GET_PRIORITY_MIN ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SCHED_GETPARAM = 328
+pkg syscall (freebsd-arm64-cgo), const SYS_SCHED_GETPARAM ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SCHED_GETSCHEDULER = 330
+pkg syscall (freebsd-arm64-cgo), const SYS_SCHED_GETSCHEDULER ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SCHED_RR_GET_INTERVAL = 334
+pkg syscall (freebsd-arm64-cgo), const SYS_SCHED_RR_GET_INTERVAL ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SCHED_SETPARAM = 327
+pkg syscall (freebsd-arm64-cgo), const SYS_SCHED_SETPARAM ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SCHED_SETSCHEDULER = 329
+pkg syscall (freebsd-arm64-cgo), const SYS_SCHED_SETSCHEDULER ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SCHED_YIELD = 331
+pkg syscall (freebsd-arm64-cgo), const SYS_SCHED_YIELD ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SCTP_GENERIC_RECVMSG = 474
+pkg syscall (freebsd-arm64-cgo), const SYS_SCTP_GENERIC_RECVMSG ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SCTP_GENERIC_SENDMSG = 472
+pkg syscall (freebsd-arm64-cgo), const SYS_SCTP_GENERIC_SENDMSG ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SCTP_GENERIC_SENDMSG_IOV = 473
+pkg syscall (freebsd-arm64-cgo), const SYS_SCTP_GENERIC_SENDMSG_IOV ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SCTP_PEELOFF = 471
+pkg syscall (freebsd-arm64-cgo), const SYS_SCTP_PEELOFF ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SELECT = 93
+pkg syscall (freebsd-arm64-cgo), const SYS_SELECT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SEMGET = 221
+pkg syscall (freebsd-arm64-cgo), const SYS_SEMGET ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SEMOP = 222
+pkg syscall (freebsd-arm64-cgo), const SYS_SEMOP ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SEMSYS = 169
+pkg syscall (freebsd-arm64-cgo), const SYS_SEMSYS ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SENDFILE = 393
+pkg syscall (freebsd-arm64-cgo), const SYS_SENDFILE ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SENDMSG = 28
+pkg syscall (freebsd-arm64-cgo), const SYS_SENDMSG ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SENDTO = 133
+pkg syscall (freebsd-arm64-cgo), const SYS_SENDTO ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SETAUDIT = 450
+pkg syscall (freebsd-arm64-cgo), const SYS_SETAUDIT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SETAUDIT_ADDR = 452
+pkg syscall (freebsd-arm64-cgo), const SYS_SETAUDIT_ADDR ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SETAUID = 448
+pkg syscall (freebsd-arm64-cgo), const SYS_SETAUID ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SETCONTEXT = 422
+pkg syscall (freebsd-arm64-cgo), const SYS_SETCONTEXT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SETEGID = 182
+pkg syscall (freebsd-arm64-cgo), const SYS_SETEGID ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SETEUID = 183
+pkg syscall (freebsd-arm64-cgo), const SYS_SETEUID ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SETFIB = 175
+pkg syscall (freebsd-arm64-cgo), const SYS_SETFIB ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SETGID = 181
+pkg syscall (freebsd-arm64-cgo), const SYS_SETGID ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SETGROUPS = 80
+pkg syscall (freebsd-arm64-cgo), const SYS_SETGROUPS ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SETITIMER = 83
+pkg syscall (freebsd-arm64-cgo), const SYS_SETITIMER ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SETLOGIN = 50
+pkg syscall (freebsd-arm64-cgo), const SYS_SETLOGIN ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SETLOGINCLASS = 524
+pkg syscall (freebsd-arm64-cgo), const SYS_SETLOGINCLASS ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SETPGID = 82
+pkg syscall (freebsd-arm64-cgo), const SYS_SETPGID ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SETPRIORITY = 96
+pkg syscall (freebsd-arm64-cgo), const SYS_SETPRIORITY ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SETREGID = 127
+pkg syscall (freebsd-arm64-cgo), const SYS_SETREGID ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SETRESGID = 312
+pkg syscall (freebsd-arm64-cgo), const SYS_SETRESGID ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SETRESUID = 311
+pkg syscall (freebsd-arm64-cgo), const SYS_SETRESUID ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SETREUID = 126
+pkg syscall (freebsd-arm64-cgo), const SYS_SETREUID ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SETRLIMIT = 195
+pkg syscall (freebsd-arm64-cgo), const SYS_SETRLIMIT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SETSID = 147
+pkg syscall (freebsd-arm64-cgo), const SYS_SETSID ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SETSOCKOPT = 105
+pkg syscall (freebsd-arm64-cgo), const SYS_SETSOCKOPT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SETTIMEOFDAY = 122
+pkg syscall (freebsd-arm64-cgo), const SYS_SETTIMEOFDAY ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SETUID = 23
+pkg syscall (freebsd-arm64-cgo), const SYS_SETUID ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SHM_OPEN = 482
+pkg syscall (freebsd-arm64-cgo), const SYS_SHM_OPEN ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SHM_UNLINK = 483
+pkg syscall (freebsd-arm64-cgo), const SYS_SHM_UNLINK ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SHMAT = 228
+pkg syscall (freebsd-arm64-cgo), const SYS_SHMAT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SHMCTL = 512
+pkg syscall (freebsd-arm64-cgo), const SYS_SHMCTL ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SHMDT = 230
+pkg syscall (freebsd-arm64-cgo), const SYS_SHMDT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SHMGET = 231
+pkg syscall (freebsd-arm64-cgo), const SYS_SHMGET ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SHMSYS = 171
+pkg syscall (freebsd-arm64-cgo), const SYS_SHMSYS ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SHUTDOWN = 134
+pkg syscall (freebsd-arm64-cgo), const SYS_SHUTDOWN ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SIGACTION = 416
+pkg syscall (freebsd-arm64-cgo), const SYS_SIGACTION ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SIGALTSTACK = 53
+pkg syscall (freebsd-arm64-cgo), const SYS_SIGALTSTACK ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SIGPENDING = 343
+pkg syscall (freebsd-arm64-cgo), const SYS_SIGPENDING ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SIGPROCMASK = 340
+pkg syscall (freebsd-arm64-cgo), const SYS_SIGPROCMASK ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SIGQUEUE = 456
+pkg syscall (freebsd-arm64-cgo), const SYS_SIGQUEUE ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SIGRETURN = 417
+pkg syscall (freebsd-arm64-cgo), const SYS_SIGRETURN ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SIGSUSPEND = 341
+pkg syscall (freebsd-arm64-cgo), const SYS_SIGSUSPEND ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SIGTIMEDWAIT = 345
+pkg syscall (freebsd-arm64-cgo), const SYS_SIGTIMEDWAIT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SIGWAIT = 429
+pkg syscall (freebsd-arm64-cgo), const SYS_SIGWAIT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SIGWAITINFO = 346
+pkg syscall (freebsd-arm64-cgo), const SYS_SIGWAITINFO ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SOCKET = 97
+pkg syscall (freebsd-arm64-cgo), const SYS_SOCKET ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SOCKETPAIR = 135
+pkg syscall (freebsd-arm64-cgo), const SYS_SOCKETPAIR ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SSTK = 70
+pkg syscall (freebsd-arm64-cgo), const SYS_SSTK ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_STAT = 188
+pkg syscall (freebsd-arm64-cgo), const SYS_STAT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_STATFS = 396
+pkg syscall (freebsd-arm64-cgo), const SYS_STATFS ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SWAPCONTEXT = 423
+pkg syscall (freebsd-arm64-cgo), const SYS_SWAPCONTEXT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SWAPOFF = 424
+pkg syscall (freebsd-arm64-cgo), const SYS_SWAPOFF ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SWAPON = 85
+pkg syscall (freebsd-arm64-cgo), const SYS_SWAPON ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SYMLINK = 57
+pkg syscall (freebsd-arm64-cgo), const SYS_SYMLINK ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SYMLINKAT = 502
+pkg syscall (freebsd-arm64-cgo), const SYS_SYMLINKAT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SYNC = 36
+pkg syscall (freebsd-arm64-cgo), const SYS_SYNC ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_SYSARCH = 165
+pkg syscall (freebsd-arm64-cgo), const SYS_SYSARCH ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_THR_CREATE = 430
+pkg syscall (freebsd-arm64-cgo), const SYS_THR_CREATE ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_THR_EXIT = 431
+pkg syscall (freebsd-arm64-cgo), const SYS_THR_EXIT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_THR_KILL = 433
+pkg syscall (freebsd-arm64-cgo), const SYS_THR_KILL ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_THR_KILL2 = 481
+pkg syscall (freebsd-arm64-cgo), const SYS_THR_KILL2 ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_THR_NEW = 455
+pkg syscall (freebsd-arm64-cgo), const SYS_THR_NEW ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_THR_SELF = 432
+pkg syscall (freebsd-arm64-cgo), const SYS_THR_SELF ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_THR_SET_NAME = 464
+pkg syscall (freebsd-arm64-cgo), const SYS_THR_SET_NAME ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_THR_SUSPEND = 442
+pkg syscall (freebsd-arm64-cgo), const SYS_THR_SUSPEND ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_THR_WAKE = 443
+pkg syscall (freebsd-arm64-cgo), const SYS_THR_WAKE ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_TRUNCATE = 479
+pkg syscall (freebsd-arm64-cgo), const SYS_TRUNCATE ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_UMASK = 60
+pkg syscall (freebsd-arm64-cgo), const SYS_UMASK ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_UNDELETE = 205
+pkg syscall (freebsd-arm64-cgo), const SYS_UNDELETE ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_UNLINK = 10
+pkg syscall (freebsd-arm64-cgo), const SYS_UNLINK ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_UNLINKAT = 503
+pkg syscall (freebsd-arm64-cgo), const SYS_UNLINKAT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_UNMOUNT = 22
+pkg syscall (freebsd-arm64-cgo), const SYS_UNMOUNT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_UTIMENSAT = 547
+pkg syscall (freebsd-arm64-cgo), const SYS_UTIMENSAT ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_UTIMES = 138
+pkg syscall (freebsd-arm64-cgo), const SYS_UTIMES ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_UTRACE = 335
+pkg syscall (freebsd-arm64-cgo), const SYS_UTRACE ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_UUIDGEN = 392
+pkg syscall (freebsd-arm64-cgo), const SYS_UUIDGEN ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_VFORK = 66
+pkg syscall (freebsd-arm64-cgo), const SYS_VFORK ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_WAIT4 = 7
+pkg syscall (freebsd-arm64-cgo), const SYS_WAIT4 ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_WAIT6 = 532
+pkg syscall (freebsd-arm64-cgo), const SYS_WAIT6 ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_WRITE = 4
+pkg syscall (freebsd-arm64-cgo), const SYS_WRITE ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_WRITEV = 121
+pkg syscall (freebsd-arm64-cgo), const SYS_WRITEV ideal-int
+pkg syscall (freebsd-arm64-cgo), const SYS_YIELD = 321
+pkg syscall (freebsd-arm64-cgo), const SYS_YIELD ideal-int
+pkg syscall (freebsd-arm64-cgo), const TCIFLUSH = 1
+pkg syscall (freebsd-arm64-cgo), const TCIFLUSH ideal-int
+pkg syscall (freebsd-arm64-cgo), const TCIOFLUSH = 3
+pkg syscall (freebsd-arm64-cgo), const TCIOFLUSH ideal-int
+pkg syscall (freebsd-arm64-cgo), const TCOFLUSH = 2
+pkg syscall (freebsd-arm64-cgo), const TCOFLUSH ideal-int
+pkg syscall (freebsd-arm64-cgo), const TCP_CA_NAME_MAX = 16
+pkg syscall (freebsd-arm64-cgo), const TCP_CA_NAME_MAX ideal-int
+pkg syscall (freebsd-arm64-cgo), const TCP_CONGESTION = 64
+pkg syscall (freebsd-arm64-cgo), const TCP_CONGESTION ideal-int
+pkg syscall (freebsd-arm64-cgo), const TCP_INFO = 32
+pkg syscall (freebsd-arm64-cgo), const TCP_INFO ideal-int
+pkg syscall (freebsd-arm64-cgo), const TCP_KEEPCNT = 1024
+pkg syscall (freebsd-arm64-cgo), const TCP_KEEPCNT ideal-int
+pkg syscall (freebsd-arm64-cgo), const TCP_KEEPIDLE = 256
+pkg syscall (freebsd-arm64-cgo), const TCP_KEEPIDLE ideal-int
+pkg syscall (freebsd-arm64-cgo), const TCP_KEEPINIT = 128
+pkg syscall (freebsd-arm64-cgo), const TCP_KEEPINIT ideal-int
+pkg syscall (freebsd-arm64-cgo), const TCP_KEEPINTVL = 512
+pkg syscall (freebsd-arm64-cgo), const TCP_KEEPINTVL ideal-int
+pkg syscall (freebsd-arm64-cgo), const TCP_MAX_SACK = 4
+pkg syscall (freebsd-arm64-cgo), const TCP_MAX_SACK ideal-int
+pkg syscall (freebsd-arm64-cgo), const TCP_MAX_WINSHIFT = 14
+pkg syscall (freebsd-arm64-cgo), const TCP_MAX_WINSHIFT ideal-int
+pkg syscall (freebsd-arm64-cgo), const TCP_MAXBURST = 4
+pkg syscall (freebsd-arm64-cgo), const TCP_MAXBURST ideal-int
+pkg syscall (freebsd-arm64-cgo), const TCP_MAXHLEN = 60
+pkg syscall (freebsd-arm64-cgo), const TCP_MAXHLEN ideal-int
+pkg syscall (freebsd-arm64-cgo), const TCP_MAXOLEN = 40
+pkg syscall (freebsd-arm64-cgo), const TCP_MAXOLEN ideal-int
+pkg syscall (freebsd-arm64-cgo), const TCP_MAXSEG = 2
+pkg syscall (freebsd-arm64-cgo), const TCP_MAXSEG ideal-int
+pkg syscall (freebsd-arm64-cgo), const TCP_MAXWIN = 65535
+pkg syscall (freebsd-arm64-cgo), const TCP_MAXWIN ideal-int
+pkg syscall (freebsd-arm64-cgo), const TCP_MD5SIG = 16
+pkg syscall (freebsd-arm64-cgo), const TCP_MD5SIG ideal-int
+pkg syscall (freebsd-arm64-cgo), const TCP_MINMSS = 216
+pkg syscall (freebsd-arm64-cgo), const TCP_MINMSS ideal-int
+pkg syscall (freebsd-arm64-cgo), const TCP_MSS = 536
+pkg syscall (freebsd-arm64-cgo), const TCP_MSS ideal-int
+pkg syscall (freebsd-arm64-cgo), const TCP_NOOPT = 8
+pkg syscall (freebsd-arm64-cgo), const TCP_NOOPT ideal-int
+pkg syscall (freebsd-arm64-cgo), const TCP_NOPUSH = 4
+pkg syscall (freebsd-arm64-cgo), const TCP_NOPUSH ideal-int
+pkg syscall (freebsd-arm64-cgo), const TCP_VENDOR = 2147483648
+pkg syscall (freebsd-arm64-cgo), const TCP_VENDOR ideal-int
+pkg syscall (freebsd-arm64-cgo), const TCSAFLUSH = 2
+pkg syscall (freebsd-arm64-cgo), const TCSAFLUSH ideal-int
+pkg syscall (freebsd-arm64-cgo), const TIOCCBRK = 536900730
+pkg syscall (freebsd-arm64-cgo), const TIOCCBRK ideal-int
+pkg syscall (freebsd-arm64-cgo), const TIOCCDTR = 536900728
+pkg syscall (freebsd-arm64-cgo), const TIOCCDTR ideal-int
+pkg syscall (freebsd-arm64-cgo), const TIOCCONS = 2147775586
+pkg syscall (freebsd-arm64-cgo), const TIOCCONS ideal-int
+pkg syscall (freebsd-arm64-cgo), const TIOCDRAIN = 536900702
+pkg syscall (freebsd-arm64-cgo), const TIOCDRAIN ideal-int
+pkg syscall (freebsd-arm64-cgo), const TIOCEXCL = 536900621
+pkg syscall (freebsd-arm64-cgo), const TIOCEXCL ideal-int
+pkg syscall (freebsd-arm64-cgo), const TIOCEXT = 2147775584
+pkg syscall (freebsd-arm64-cgo), const TIOCEXT ideal-int
+pkg syscall (freebsd-arm64-cgo), const TIOCFLUSH = 2147775504
+pkg syscall (freebsd-arm64-cgo), const TIOCFLUSH ideal-int
+pkg syscall (freebsd-arm64-cgo), const TIOCGDRAINWAIT = 1074033750
+pkg syscall (freebsd-arm64-cgo), const TIOCGDRAINWAIT ideal-int
+pkg syscall (freebsd-arm64-cgo), const TIOCGETA = 1076655123
+pkg syscall (freebsd-arm64-cgo), const TIOCGETA ideal-int
+pkg syscall (freebsd-arm64-cgo), const TIOCGETD = 1074033690
+pkg syscall (freebsd-arm64-cgo), const TIOCGETD ideal-int
+pkg syscall (freebsd-arm64-cgo), const TIOCGPGRP = 1074033783
+pkg syscall (freebsd-arm64-cgo), const TIOCGPGRP ideal-int
+pkg syscall (freebsd-arm64-cgo), const TIOCGPTN = 1074033679
+pkg syscall (freebsd-arm64-cgo), const TIOCGPTN ideal-int
+pkg syscall (freebsd-arm64-cgo), const TIOCGSID = 1074033763
+pkg syscall (freebsd-arm64-cgo), const TIOCGSID ideal-int
+pkg syscall (freebsd-arm64-cgo), const TIOCGWINSZ = 1074295912
+pkg syscall (freebsd-arm64-cgo), const TIOCGWINSZ ideal-int
+pkg syscall (freebsd-arm64-cgo), const TIOCM_CAR = 64
+pkg syscall (freebsd-arm64-cgo), const TIOCM_CAR ideal-int
+pkg syscall (freebsd-arm64-cgo), const TIOCM_CD = 64
+pkg syscall (freebsd-arm64-cgo), const TIOCM_CD ideal-int
+pkg syscall (freebsd-arm64-cgo), const TIOCM_CTS = 32
+pkg syscall (freebsd-arm64-cgo), const TIOCM_CTS ideal-int
+pkg syscall (freebsd-arm64-cgo), const TIOCM_DCD = 64
+pkg syscall (freebsd-arm64-cgo), const TIOCM_DCD ideal-int
+pkg syscall (freebsd-arm64-cgo), const TIOCM_DSR = 256
+pkg syscall (freebsd-arm64-cgo), const TIOCM_DSR ideal-int
+pkg syscall (freebsd-arm64-cgo), const TIOCM_DTR = 2
+pkg syscall (freebsd-arm64-cgo), const TIOCM_DTR ideal-int
+pkg syscall (freebsd-arm64-cgo), const TIOCM_LE = 1
+pkg syscall (freebsd-arm64-cgo), const TIOCM_LE ideal-int
+pkg syscall (freebsd-arm64-cgo), const TIOCM_RI = 128
+pkg syscall (freebsd-arm64-cgo), const TIOCM_RI ideal-int
+pkg syscall (freebsd-arm64-cgo), const TIOCM_RNG = 128
+pkg syscall (freebsd-arm64-cgo), const TIOCM_RNG ideal-int
+pkg syscall (freebsd-arm64-cgo), const TIOCM_RTS = 4
+pkg syscall (freebsd-arm64-cgo), const TIOCM_RTS ideal-int
+pkg syscall (freebsd-arm64-cgo), const TIOCM_SR = 16
+pkg syscall (freebsd-arm64-cgo), const TIOCM_SR ideal-int
+pkg syscall (freebsd-arm64-cgo), const TIOCM_ST = 8
+pkg syscall (freebsd-arm64-cgo), const TIOCM_ST ideal-int
+pkg syscall (freebsd-arm64-cgo), const TIOCMBIC = 2147775595
+pkg syscall (freebsd-arm64-cgo), const TIOCMBIC ideal-int
+pkg syscall (freebsd-arm64-cgo), const TIOCMBIS = 2147775596
+pkg syscall (freebsd-arm64-cgo), const TIOCMBIS ideal-int
+pkg syscall (freebsd-arm64-cgo), const TIOCMGDTRWAIT = 1074033754
+pkg syscall (freebsd-arm64-cgo), const TIOCMGDTRWAIT ideal-int
+pkg syscall (freebsd-arm64-cgo), const TIOCMGET = 1074033770
+pkg syscall (freebsd-arm64-cgo), const TIOCMGET ideal-int
+pkg syscall (freebsd-arm64-cgo), const TIOCMSDTRWAIT = 2147775579
+pkg syscall (freebsd-arm64-cgo), const TIOCMSDTRWAIT ideal-int
+pkg syscall (freebsd-arm64-cgo), const TIOCMSET = 2147775597
+pkg syscall (freebsd-arm64-cgo), const TIOCMSET ideal-int
+pkg syscall (freebsd-arm64-cgo), const TIOCNOTTY = 536900721
+pkg syscall (freebsd-arm64-cgo), const TIOCNOTTY ideal-int
+pkg syscall (freebsd-arm64-cgo), const TIOCNXCL = 536900622
+pkg syscall (freebsd-arm64-cgo), const TIOCNXCL ideal-int
+pkg syscall (freebsd-arm64-cgo), const TIOCOUTQ = 1074033779
+pkg syscall (freebsd-arm64-cgo), const TIOCOUTQ ideal-int
+pkg syscall (freebsd-arm64-cgo), const TIOCPKT = 2147775600
+pkg syscall (freebsd-arm64-cgo), const TIOCPKT ideal-int
+pkg syscall (freebsd-arm64-cgo), const TIOCPKT_DATA = 0
+pkg syscall (freebsd-arm64-cgo), const TIOCPKT_DATA ideal-int
+pkg syscall (freebsd-arm64-cgo), const TIOCPKT_DOSTOP = 32
+pkg syscall (freebsd-arm64-cgo), const TIOCPKT_DOSTOP ideal-int
+pkg syscall (freebsd-arm64-cgo), const TIOCPKT_FLUSHREAD = 1
+pkg syscall (freebsd-arm64-cgo), const TIOCPKT_FLUSHREAD ideal-int
+pkg syscall (freebsd-arm64-cgo), const TIOCPKT_FLUSHWRITE = 2
+pkg syscall (freebsd-arm64-cgo), const TIOCPKT_FLUSHWRITE ideal-int
+pkg syscall (freebsd-arm64-cgo), const TIOCPKT_IOCTL = 64
+pkg syscall (freebsd-arm64-cgo), const TIOCPKT_IOCTL ideal-int
+pkg syscall (freebsd-arm64-cgo), const TIOCPKT_NOSTOP = 16
+pkg syscall (freebsd-arm64-cgo), const TIOCPKT_NOSTOP ideal-int
+pkg syscall (freebsd-arm64-cgo), const TIOCPKT_START = 8
+pkg syscall (freebsd-arm64-cgo), const TIOCPKT_START ideal-int
+pkg syscall (freebsd-arm64-cgo), const TIOCPKT_STOP = 4
+pkg syscall (freebsd-arm64-cgo), const TIOCPKT_STOP ideal-int
+pkg syscall (freebsd-arm64-cgo), const TIOCPTMASTER = 536900636
+pkg syscall (freebsd-arm64-cgo), const TIOCPTMASTER ideal-int
+pkg syscall (freebsd-arm64-cgo), const TIOCSBRK = 536900731
+pkg syscall (freebsd-arm64-cgo), const TIOCSBRK ideal-int
+pkg syscall (freebsd-arm64-cgo), const TIOCSCTTY = 536900705
+pkg syscall (freebsd-arm64-cgo), const TIOCSCTTY ideal-int
+pkg syscall (freebsd-arm64-cgo), const TIOCSDRAINWAIT = 2147775575
+pkg syscall (freebsd-arm64-cgo), const TIOCSDRAINWAIT ideal-int
+pkg syscall (freebsd-arm64-cgo), const TIOCSDTR = 536900729
+pkg syscall (freebsd-arm64-cgo), const TIOCSDTR ideal-int
+pkg syscall (freebsd-arm64-cgo), const TIOCSETA = 2150396948
+pkg syscall (freebsd-arm64-cgo), const TIOCSETA ideal-int
+pkg syscall (freebsd-arm64-cgo), const TIOCSETAF = 2150396950
+pkg syscall (freebsd-arm64-cgo), const TIOCSETAF ideal-int
+pkg syscall (freebsd-arm64-cgo), const TIOCSETAW = 2150396949
+pkg syscall (freebsd-arm64-cgo), const TIOCSETAW ideal-int
+pkg syscall (freebsd-arm64-cgo), const TIOCSETD = 2147775515
+pkg syscall (freebsd-arm64-cgo), const TIOCSETD ideal-int
+pkg syscall (freebsd-arm64-cgo), const TIOCSIG = 537162847
+pkg syscall (freebsd-arm64-cgo), const TIOCSIG ideal-int
+pkg syscall (freebsd-arm64-cgo), const TIOCSPGRP = 2147775606
+pkg syscall (freebsd-arm64-cgo), const TIOCSPGRP ideal-int
+pkg syscall (freebsd-arm64-cgo), const TIOCSTART = 536900718
+pkg syscall (freebsd-arm64-cgo), const TIOCSTART ideal-int
+pkg syscall (freebsd-arm64-cgo), const TIOCSTAT = 536900709
+pkg syscall (freebsd-arm64-cgo), const TIOCSTAT ideal-int
+pkg syscall (freebsd-arm64-cgo), const TIOCSTI = 2147578994
+pkg syscall (freebsd-arm64-cgo), const TIOCSTI ideal-int
+pkg syscall (freebsd-arm64-cgo), const TIOCSTOP = 536900719
+pkg syscall (freebsd-arm64-cgo), const TIOCSTOP ideal-int
+pkg syscall (freebsd-arm64-cgo), const TIOCSWINSZ = 2148037735
+pkg syscall (freebsd-arm64-cgo), const TIOCSWINSZ ideal-int
+pkg syscall (freebsd-arm64-cgo), const TIOCTIMESTAMP = 1074820185
+pkg syscall (freebsd-arm64-cgo), const TIOCTIMESTAMP ideal-int
+pkg syscall (freebsd-arm64-cgo), const TIOCUCNTL = 2147775590
+pkg syscall (freebsd-arm64-cgo), const TIOCUCNTL ideal-int
+pkg syscall (freebsd-arm64-cgo), const TOSTOP = 4194304
+pkg syscall (freebsd-arm64-cgo), const TOSTOP ideal-int
+pkg syscall (freebsd-arm64-cgo), const VDISCARD = 15
+pkg syscall (freebsd-arm64-cgo), const VDISCARD ideal-int
+pkg syscall (freebsd-arm64-cgo), const VDSUSP = 11
+pkg syscall (freebsd-arm64-cgo), const VDSUSP ideal-int
+pkg syscall (freebsd-arm64-cgo), const VEOF = 0
+pkg syscall (freebsd-arm64-cgo), const VEOF ideal-int
+pkg syscall (freebsd-arm64-cgo), const VEOL = 1
+pkg syscall (freebsd-arm64-cgo), const VEOL ideal-int
+pkg syscall (freebsd-arm64-cgo), const VEOL2 = 2
+pkg syscall (freebsd-arm64-cgo), const VEOL2 ideal-int
+pkg syscall (freebsd-arm64-cgo), const VERASE = 3
+pkg syscall (freebsd-arm64-cgo), const VERASE ideal-int
+pkg syscall (freebsd-arm64-cgo), const VERASE2 = 7
+pkg syscall (freebsd-arm64-cgo), const VERASE2 ideal-int
+pkg syscall (freebsd-arm64-cgo), const VINTR = 8
+pkg syscall (freebsd-arm64-cgo), const VINTR ideal-int
+pkg syscall (freebsd-arm64-cgo), const VKILL = 5
+pkg syscall (freebsd-arm64-cgo), const VKILL ideal-int
+pkg syscall (freebsd-arm64-cgo), const VLNEXT = 14
+pkg syscall (freebsd-arm64-cgo), const VLNEXT ideal-int
+pkg syscall (freebsd-arm64-cgo), const VMIN = 16
+pkg syscall (freebsd-arm64-cgo), const VMIN ideal-int
+pkg syscall (freebsd-arm64-cgo), const VQUIT = 9
+pkg syscall (freebsd-arm64-cgo), const VQUIT ideal-int
+pkg syscall (freebsd-arm64-cgo), const VREPRINT = 6
+pkg syscall (freebsd-arm64-cgo), const VREPRINT ideal-int
+pkg syscall (freebsd-arm64-cgo), const VSTART = 12
+pkg syscall (freebsd-arm64-cgo), const VSTART ideal-int
+pkg syscall (freebsd-arm64-cgo), const VSTATUS = 18
+pkg syscall (freebsd-arm64-cgo), const VSTATUS ideal-int
+pkg syscall (freebsd-arm64-cgo), const VSTOP = 13
+pkg syscall (freebsd-arm64-cgo), const VSTOP ideal-int
+pkg syscall (freebsd-arm64-cgo), const VSUSP = 10
+pkg syscall (freebsd-arm64-cgo), const VSUSP ideal-int
+pkg syscall (freebsd-arm64-cgo), const VTIME = 17
+pkg syscall (freebsd-arm64-cgo), const VTIME ideal-int
+pkg syscall (freebsd-arm64-cgo), const VWERASE = 4
+pkg syscall (freebsd-arm64-cgo), const VWERASE ideal-int
+pkg syscall (freebsd-arm64-cgo), const WCONTINUED = 4
+pkg syscall (freebsd-arm64-cgo), const WCONTINUED ideal-int
+pkg syscall (freebsd-arm64-cgo), const WCOREFLAG = 128
+pkg syscall (freebsd-arm64-cgo), const WCOREFLAG ideal-int
+pkg syscall (freebsd-arm64-cgo), const WEXITED = 16
+pkg syscall (freebsd-arm64-cgo), const WEXITED ideal-int
+pkg syscall (freebsd-arm64-cgo), const WLINUXCLONE = 2147483648
+pkg syscall (freebsd-arm64-cgo), const WLINUXCLONE ideal-int
+pkg syscall (freebsd-arm64-cgo), const WNOHANG = 1
+pkg syscall (freebsd-arm64-cgo), const WNOHANG ideal-int
+pkg syscall (freebsd-arm64-cgo), const WNOWAIT = 8
+pkg syscall (freebsd-arm64-cgo), const WNOWAIT ideal-int
+pkg syscall (freebsd-arm64-cgo), const WSTOPPED = 2
+pkg syscall (freebsd-arm64-cgo), const WSTOPPED ideal-int
+pkg syscall (freebsd-arm64-cgo), const WTRAPPED = 32
+pkg syscall (freebsd-arm64-cgo), const WTRAPPED ideal-int
+pkg syscall (freebsd-arm64-cgo), const WUNTRACED = 2
+pkg syscall (freebsd-arm64-cgo), const WUNTRACED ideal-int
+pkg syscall (freebsd-arm64-cgo), func Accept(int) (int, Sockaddr, error)
+pkg syscall (freebsd-arm64-cgo), func Accept4(int, int) (int, Sockaddr, error)
+pkg syscall (freebsd-arm64-cgo), func Access(string, uint32) error
+pkg syscall (freebsd-arm64-cgo), func Adjtime(*Timeval, *Timeval) error
+pkg syscall (freebsd-arm64-cgo), func Bind(int, Sockaddr) error
+pkg syscall (freebsd-arm64-cgo), func BpfBuflen //deprecated
+pkg syscall (freebsd-arm64-cgo), func BpfBuflen(int) (int, error)
+pkg syscall (freebsd-arm64-cgo), func BpfDatalink //deprecated
+pkg syscall (freebsd-arm64-cgo), func BpfDatalink(int) (int, error)
+pkg syscall (freebsd-arm64-cgo), func BpfHeadercmpl //deprecated
+pkg syscall (freebsd-arm64-cgo), func BpfHeadercmpl(int) (int, error)
+pkg syscall (freebsd-arm64-cgo), func BpfInterface //deprecated
+pkg syscall (freebsd-arm64-cgo), func BpfInterface(int, string) (string, error)
+pkg syscall (freebsd-arm64-cgo), func BpfJump //deprecated
+pkg syscall (freebsd-arm64-cgo), func BpfJump(int, int, int, int) *BpfInsn
+pkg syscall (freebsd-arm64-cgo), func BpfStats //deprecated
+pkg syscall (freebsd-arm64-cgo), func BpfStats(int) (*BpfStat, error)
+pkg syscall (freebsd-arm64-cgo), func BpfStmt //deprecated
+pkg syscall (freebsd-arm64-cgo), func BpfStmt(int, int) *BpfInsn
+pkg syscall (freebsd-arm64-cgo), func BpfTimeout //deprecated
+pkg syscall (freebsd-arm64-cgo), func BpfTimeout(int) (*Timeval, error)
+pkg syscall (freebsd-arm64-cgo), func CheckBpfVersion //deprecated
+pkg syscall (freebsd-arm64-cgo), func CheckBpfVersion(int) error
+pkg syscall (freebsd-arm64-cgo), func Chflags(string, int) error
+pkg syscall (freebsd-arm64-cgo), func Chroot(string) error
+pkg syscall (freebsd-arm64-cgo), func Close(int) error
+pkg syscall (freebsd-arm64-cgo), func CloseOnExec(int)
+pkg syscall (freebsd-arm64-cgo), func CmsgLen(int) int
+pkg syscall (freebsd-arm64-cgo), func CmsgSpace(int) int
+pkg syscall (freebsd-arm64-cgo), func Connect(int, Sockaddr) error
+pkg syscall (freebsd-arm64-cgo), func Dup(int) (int, error)
+pkg syscall (freebsd-arm64-cgo), func Dup2(int, int) error
+pkg syscall (freebsd-arm64-cgo), func Fchdir(int) error
+pkg syscall (freebsd-arm64-cgo), func Fchflags(int, int) error
+pkg syscall (freebsd-arm64-cgo), func Fchmod(int, uint32) error
+pkg syscall (freebsd-arm64-cgo), func Fchown(int, int, int) error
+pkg syscall (freebsd-arm64-cgo), func FcntlFlock(uintptr, int, *Flock_t) error
+pkg syscall (freebsd-arm64-cgo), func Flock(int, int) error
+pkg syscall (freebsd-arm64-cgo), func FlushBpf //deprecated
+pkg syscall (freebsd-arm64-cgo), func FlushBpf(int) error
+pkg syscall (freebsd-arm64-cgo), func ForkExec(string, []string, *ProcAttr) (int, error)
+pkg syscall (freebsd-arm64-cgo), func Fpathconf(int, int) (int, error)
+pkg syscall (freebsd-arm64-cgo), func Fstat(int, *Stat_t) error
+pkg syscall (freebsd-arm64-cgo), func Fstatat(int, string, *Stat_t, int) error
+pkg syscall (freebsd-arm64-cgo), func Fstatfs(int, *Statfs_t) error
+pkg syscall (freebsd-arm64-cgo), func Fsync(int) error
+pkg syscall (freebsd-arm64-cgo), func Ftruncate(int, int64) error
+pkg syscall (freebsd-arm64-cgo), func Futimes(int, []Timeval) error
+pkg syscall (freebsd-arm64-cgo), func Getdirentries(int, []uint8, *uintptr) (int, error)
+pkg syscall (freebsd-arm64-cgo), func Getdtablesize() int
+pkg syscall (freebsd-arm64-cgo), func Getfsstat([]Statfs_t, int) (int, error)
+pkg syscall (freebsd-arm64-cgo), func Getpeername(int) (Sockaddr, error)
+pkg syscall (freebsd-arm64-cgo), func Getpgid(int) (int, error)
+pkg syscall (freebsd-arm64-cgo), func Getpgrp() int
+pkg syscall (freebsd-arm64-cgo), func Getpriority(int, int) (int, error)
+pkg syscall (freebsd-arm64-cgo), func Getrlimit(int, *Rlimit) error
+pkg syscall (freebsd-arm64-cgo), func Getrusage(int, *Rusage) error
+pkg syscall (freebsd-arm64-cgo), func Getsid(int) (int, error)
+pkg syscall (freebsd-arm64-cgo), func Getsockname(int) (Sockaddr, error)
+pkg syscall (freebsd-arm64-cgo), func GetsockoptByte(int, int, int) (uint8, error)
+pkg syscall (freebsd-arm64-cgo), func GetsockoptICMPv6Filter(int, int, int) (*ICMPv6Filter, error)
+pkg syscall (freebsd-arm64-cgo), func GetsockoptInet4Addr(int, int, int) ([4]uint8, error)
+pkg syscall (freebsd-arm64-cgo), func GetsockoptInt(int, int, int) (int, error)
+pkg syscall (freebsd-arm64-cgo), func GetsockoptIPMreq(int, int, int) (*IPMreq, error)
+pkg syscall (freebsd-arm64-cgo), func GetsockoptIPMreqn(int, int, int) (*IPMreqn, error)
+pkg syscall (freebsd-arm64-cgo), func GetsockoptIPv6Mreq(int, int, int) (*IPv6Mreq, error)
+pkg syscall (freebsd-arm64-cgo), func GetsockoptIPv6MTUInfo(int, int, int) (*IPv6MTUInfo, error)
+pkg syscall (freebsd-arm64-cgo), func Issetugid() bool
+pkg syscall (freebsd-arm64-cgo), func Kevent(int, []Kevent_t, []Kevent_t, *Timespec) (int, error)
+pkg syscall (freebsd-arm64-cgo), func Kill(int, Signal) error
+pkg syscall (freebsd-arm64-cgo), func Kqueue() (int, error)
+pkg syscall (freebsd-arm64-cgo), func Listen(int, int) error
+pkg syscall (freebsd-arm64-cgo), func Lstat(string, *Stat_t) error
+pkg syscall (freebsd-arm64-cgo), func Mkfifo(string, uint32) error
+pkg syscall (freebsd-arm64-cgo), func Mknod(string, uint32, uint64) error
+pkg syscall (freebsd-arm64-cgo), func Mmap(int, int64, int, int, int) ([]uint8, error)
+pkg syscall (freebsd-arm64-cgo), func Munmap([]uint8) error
+pkg syscall (freebsd-arm64-cgo), func Nanosleep(*Timespec, *Timespec) error
+pkg syscall (freebsd-arm64-cgo), func Open(string, int, uint32) (int, error)
+pkg syscall (freebsd-arm64-cgo), func ParseDirent([]uint8, int, []string) (int, int, []string)
+pkg syscall (freebsd-arm64-cgo), func ParseRoutingMessage //deprecated
+pkg syscall (freebsd-arm64-cgo), func ParseRoutingMessage([]uint8) ([]RoutingMessage, error)
+pkg syscall (freebsd-arm64-cgo), func ParseRoutingSockaddr //deprecated
+pkg syscall (freebsd-arm64-cgo), func ParseRoutingSockaddr(RoutingMessage) ([]Sockaddr, error)
+pkg syscall (freebsd-arm64-cgo), func ParseSocketControlMessage([]uint8) ([]SocketControlMessage, error)
+pkg syscall (freebsd-arm64-cgo), func ParseUnixRights(*SocketControlMessage) ([]int, error)
+pkg syscall (freebsd-arm64-cgo), func Pathconf(string, int) (int, error)
+pkg syscall (freebsd-arm64-cgo), func Pipe([]int) error
+pkg syscall (freebsd-arm64-cgo), func Pipe2([]int, int) error
+pkg syscall (freebsd-arm64-cgo), func Pread(int, []uint8, int64) (int, error)
+pkg syscall (freebsd-arm64-cgo), func Pwrite(int, []uint8, int64) (int, error)
+pkg syscall (freebsd-arm64-cgo), func RawSyscall(uintptr, uintptr, uintptr, uintptr) (uintptr, uintptr, Errno)
+pkg syscall (freebsd-arm64-cgo), func RawSyscall6(uintptr, uintptr, uintptr, uintptr, uintptr, uintptr, uintptr) (uintptr, uintptr, Errno)
+pkg syscall (freebsd-arm64-cgo), func Read(int, []uint8) (int, error)
+pkg syscall (freebsd-arm64-cgo), func ReadDirent(int, []uint8) (int, error)
+pkg syscall (freebsd-arm64-cgo), func Recvfrom(int, []uint8, int) (int, Sockaddr, error)
+pkg syscall (freebsd-arm64-cgo), func Recvmsg(int, []uint8, []uint8, int) (int, int, int, Sockaddr, error)
+pkg syscall (freebsd-arm64-cgo), func Revoke(string) error
+pkg syscall (freebsd-arm64-cgo), func RouteRIB //deprecated
+pkg syscall (freebsd-arm64-cgo), func RouteRIB(int, int) ([]uint8, error)
+pkg syscall (freebsd-arm64-cgo), func Seek(int, int64, int) (int64, error)
+pkg syscall (freebsd-arm64-cgo), func Select(int, *FdSet, *FdSet, *FdSet, *Timeval) error
+pkg syscall (freebsd-arm64-cgo), func Sendfile(int, int, *int64, int) (int, error)
+pkg syscall (freebsd-arm64-cgo), func Sendmsg(int, []uint8, []uint8, Sockaddr, int) error
+pkg syscall (freebsd-arm64-cgo), func SendmsgN(int, []uint8, []uint8, Sockaddr, int) (int, error)
+pkg syscall (freebsd-arm64-cgo), func Sendto(int, []uint8, int, Sockaddr) error
+pkg syscall (freebsd-arm64-cgo), func SetBpf //deprecated
+pkg syscall (freebsd-arm64-cgo), func SetBpf(int, []BpfInsn) error
+pkg syscall (freebsd-arm64-cgo), func SetBpfBuflen //deprecated
+pkg syscall (freebsd-arm64-cgo), func SetBpfBuflen(int, int) (int, error)
+pkg syscall (freebsd-arm64-cgo), func SetBpfDatalink //deprecated
+pkg syscall (freebsd-arm64-cgo), func SetBpfDatalink(int, int) (int, error)
+pkg syscall (freebsd-arm64-cgo), func SetBpfHeadercmpl //deprecated
+pkg syscall (freebsd-arm64-cgo), func SetBpfHeadercmpl(int, int) error
+pkg syscall (freebsd-arm64-cgo), func SetBpfImmediate //deprecated
+pkg syscall (freebsd-arm64-cgo), func SetBpfImmediate(int, int) error
+pkg syscall (freebsd-arm64-cgo), func SetBpfInterface //deprecated
+pkg syscall (freebsd-arm64-cgo), func SetBpfInterface(int, string) error
+pkg syscall (freebsd-arm64-cgo), func SetBpfPromisc //deprecated
+pkg syscall (freebsd-arm64-cgo), func SetBpfPromisc(int, int) error
+pkg syscall (freebsd-arm64-cgo), func SetBpfTimeout //deprecated
+pkg syscall (freebsd-arm64-cgo), func SetBpfTimeout(int, *Timeval) error
+pkg syscall (freebsd-arm64-cgo), func Setegid(int) error
+pkg syscall (freebsd-arm64-cgo), func Seteuid(int) error
+pkg syscall (freebsd-arm64-cgo), func Setgid(int) error
+pkg syscall (freebsd-arm64-cgo), func Setgroups([]int) error
+pkg syscall (freebsd-arm64-cgo), func SetKevent(*Kevent_t, int, int, int)
+pkg syscall (freebsd-arm64-cgo), func Setlogin(string) error
+pkg syscall (freebsd-arm64-cgo), func SetNonblock(int, bool) error
+pkg syscall (freebsd-arm64-cgo), func Setpgid(int, int) error
+pkg syscall (freebsd-arm64-cgo), func Setpriority(int, int, int) error
+pkg syscall (freebsd-arm64-cgo), func Setregid(int, int) error
+pkg syscall (freebsd-arm64-cgo), func Setreuid(int, int) error
+pkg syscall (freebsd-arm64-cgo), func Setrlimit(int, *Rlimit) error
+pkg syscall (freebsd-arm64-cgo), func Setsid() (int, error)
+pkg syscall (freebsd-arm64-cgo), func SetsockoptByte(int, int, int, uint8) error
+pkg syscall (freebsd-arm64-cgo), func SetsockoptICMPv6Filter(int, int, int, *ICMPv6Filter) error
+pkg syscall (freebsd-arm64-cgo), func SetsockoptInet4Addr(int, int, int, [4]uint8) error
+pkg syscall (freebsd-arm64-cgo), func SetsockoptInt(int, int, int, int) error
+pkg syscall (freebsd-arm64-cgo), func SetsockoptIPMreq(int, int, int, *IPMreq) error
+pkg syscall (freebsd-arm64-cgo), func SetsockoptIPMreqn(int, int, int, *IPMreqn) error
+pkg syscall (freebsd-arm64-cgo), func SetsockoptIPv6Mreq(int, int, int, *IPv6Mreq) error
+pkg syscall (freebsd-arm64-cgo), func SetsockoptLinger(int, int, int, *Linger) error
+pkg syscall (freebsd-arm64-cgo), func SetsockoptString(int, int, int, string) error
+pkg syscall (freebsd-arm64-cgo), func SetsockoptTimeval(int, int, int, *Timeval) error
+pkg syscall (freebsd-arm64-cgo), func Settimeofday(*Timeval) error
+pkg syscall (freebsd-arm64-cgo), func Setuid(int) error
+pkg syscall (freebsd-arm64-cgo), func Shutdown(int, int) error
+pkg syscall (freebsd-arm64-cgo), func SlicePtrFromStrings([]string) ([]*uint8, error)
+pkg syscall (freebsd-arm64-cgo), func Socket(int, int, int) (int, error)
+pkg syscall (freebsd-arm64-cgo), func Socketpair(int, int, int) ([2]int, error)
+pkg syscall (freebsd-arm64-cgo), func Stat(string, *Stat_t) error
+pkg syscall (freebsd-arm64-cgo), func Statfs(string, *Statfs_t) error
+pkg syscall (freebsd-arm64-cgo), func StringSlicePtr //deprecated
+pkg syscall (freebsd-arm64-cgo), func StringSlicePtr([]string) []*uint8
+pkg syscall (freebsd-arm64-cgo), func Sync() error
+pkg syscall (freebsd-arm64-cgo), func Syscall(uintptr, uintptr, uintptr, uintptr) (uintptr, uintptr, Errno)
+pkg syscall (freebsd-arm64-cgo), func Syscall6(uintptr, uintptr, uintptr, uintptr, uintptr, uintptr, uintptr) (uintptr, uintptr, Errno)
+pkg syscall (freebsd-arm64-cgo), func Syscall9(uintptr, uintptr, uintptr, uintptr, uintptr, uintptr, uintptr, uintptr, uintptr, uintptr) (uintptr, uintptr, Errno)
+pkg syscall (freebsd-arm64-cgo), func Sysctl(string) (string, error)
+pkg syscall (freebsd-arm64-cgo), func SysctlUint32(string) (uint32, error)
+pkg syscall (freebsd-arm64-cgo), func TimevalToNsec(Timeval) int64
+pkg syscall (freebsd-arm64-cgo), func Truncate(string, int64) error
+pkg syscall (freebsd-arm64-cgo), func Umask(int) int
+pkg syscall (freebsd-arm64-cgo), func Undelete(string) error
+pkg syscall (freebsd-arm64-cgo), func UnixRights(...int) []uint8
+pkg syscall (freebsd-arm64-cgo), func Unmount(string, int) error
+pkg syscall (freebsd-arm64-cgo), func Wait4(int, *WaitStatus, int, *Rusage) (int, error)
+pkg syscall (freebsd-arm64-cgo), func Write(int, []uint8) (int, error)
+pkg syscall (freebsd-arm64-cgo), method (*Cmsghdr) SetLen(int)
+pkg syscall (freebsd-arm64-cgo), method (*Iovec) SetLen(int)
+pkg syscall (freebsd-arm64-cgo), method (*Msghdr) SetControllen(int)
+pkg syscall (freebsd-arm64-cgo), type BpfHdr struct
+pkg syscall (freebsd-arm64-cgo), type BpfHdr struct, Caplen uint32
+pkg syscall (freebsd-arm64-cgo), type BpfHdr struct, Datalen uint32
+pkg syscall (freebsd-arm64-cgo), type BpfHdr struct, Hdrlen uint16
+pkg syscall (freebsd-arm64-cgo), type BpfHdr struct, Pad_cgo_0 [6]uint8
+pkg syscall (freebsd-arm64-cgo), type BpfHdr struct, Tstamp Timeval
+pkg syscall (freebsd-arm64-cgo), type BpfInsn struct
+pkg syscall (freebsd-arm64-cgo), type BpfInsn struct, Code uint16
+pkg syscall (freebsd-arm64-cgo), type BpfInsn struct, Jf uint8
+pkg syscall (freebsd-arm64-cgo), type BpfInsn struct, Jt uint8
+pkg syscall (freebsd-arm64-cgo), type BpfInsn struct, K uint32
+pkg syscall (freebsd-arm64-cgo), type BpfProgram struct
+pkg syscall (freebsd-arm64-cgo), type BpfProgram struct, Insns *BpfInsn
+pkg syscall (freebsd-arm64-cgo), type BpfProgram struct, Len uint32
+pkg syscall (freebsd-arm64-cgo), type BpfProgram struct, Pad_cgo_0 [4]uint8
+pkg syscall (freebsd-arm64-cgo), type BpfStat struct
+pkg syscall (freebsd-arm64-cgo), type BpfStat struct, Drop uint32
+pkg syscall (freebsd-arm64-cgo), type BpfStat struct, Recv uint32
+pkg syscall (freebsd-arm64-cgo), type BpfVersion struct
+pkg syscall (freebsd-arm64-cgo), type BpfVersion struct, Major uint16
+pkg syscall (freebsd-arm64-cgo), type BpfVersion struct, Minor uint16
+pkg syscall (freebsd-arm64-cgo), type BpfZbuf struct
+pkg syscall (freebsd-arm64-cgo), type BpfZbuf struct, Bufa *uint8
+pkg syscall (freebsd-arm64-cgo), type BpfZbuf struct, Bufb *uint8
+pkg syscall (freebsd-arm64-cgo), type BpfZbuf struct, Buflen uint64
+pkg syscall (freebsd-arm64-cgo), type BpfZbufHeader struct
+pkg syscall (freebsd-arm64-cgo), type BpfZbufHeader struct, Kernel_gen uint32
+pkg syscall (freebsd-arm64-cgo), type BpfZbufHeader struct, Kernel_len uint32
+pkg syscall (freebsd-arm64-cgo), type BpfZbufHeader struct, User_gen uint32
+pkg syscall (freebsd-arm64-cgo), type BpfZbufHeader struct, X_bzh_pad [5]uint32
+pkg syscall (freebsd-arm64-cgo), type Cmsghdr struct
+pkg syscall (freebsd-arm64-cgo), type Cmsghdr struct, Len uint32
+pkg syscall (freebsd-arm64-cgo), type Cmsghdr struct, Level int32
+pkg syscall (freebsd-arm64-cgo), type Cmsghdr struct, Type int32
+pkg syscall (freebsd-arm64-cgo), type Credential struct
+pkg syscall (freebsd-arm64-cgo), type Credential struct, Gid uint32
+pkg syscall (freebsd-arm64-cgo), type Credential struct, Groups []uint32
+pkg syscall (freebsd-arm64-cgo), type Credential struct, NoSetGroups bool
+pkg syscall (freebsd-arm64-cgo), type Credential struct, Uid uint32
+pkg syscall (freebsd-arm64-cgo), type Dirent struct
+pkg syscall (freebsd-arm64-cgo), type Dirent struct, Fileno uint64
+pkg syscall (freebsd-arm64-cgo), type Dirent struct, Name [256]int8
+pkg syscall (freebsd-arm64-cgo), type Dirent struct, Namlen uint16
+pkg syscall (freebsd-arm64-cgo), type Dirent struct, Off int64
+pkg syscall (freebsd-arm64-cgo), type Dirent struct, Pad0 uint8
+pkg syscall (freebsd-arm64-cgo), type Dirent struct, Pad1 uint16
+pkg syscall (freebsd-arm64-cgo), type Dirent struct, Reclen uint16
+pkg syscall (freebsd-arm64-cgo), type Dirent struct, Type uint8
+pkg syscall (freebsd-arm64-cgo), type FdSet struct
+pkg syscall (freebsd-arm64-cgo), type FdSet struct, X__fds_bits [16]uint64
+pkg syscall (freebsd-arm64-cgo), type Flock_t struct
+pkg syscall (freebsd-arm64-cgo), type Flock_t struct, Len int64
+pkg syscall (freebsd-arm64-cgo), type Flock_t struct, Pad_cgo_0 [4]uint8
+pkg syscall (freebsd-arm64-cgo), type Flock_t struct, Pid int32
+pkg syscall (freebsd-arm64-cgo), type Flock_t struct, Start int64
+pkg syscall (freebsd-arm64-cgo), type Flock_t struct, Sysid int32
+pkg syscall (freebsd-arm64-cgo), type Flock_t struct, Type int16
+pkg syscall (freebsd-arm64-cgo), type Flock_t struct, Whence int16
+pkg syscall (freebsd-arm64-cgo), type Fsid struct
+pkg syscall (freebsd-arm64-cgo), type Fsid struct, Val [2]int32
+pkg syscall (freebsd-arm64-cgo), type ICMPv6Filter struct
+pkg syscall (freebsd-arm64-cgo), type ICMPv6Filter struct, Filt [8]uint32
+pkg syscall (freebsd-arm64-cgo), type IfaMsghdr struct
+pkg syscall (freebsd-arm64-cgo), type IfaMsghdr struct, Addrs int32
+pkg syscall (freebsd-arm64-cgo), type IfaMsghdr struct, Flags int32
+pkg syscall (freebsd-arm64-cgo), type IfaMsghdr struct, Index uint16
+pkg syscall (freebsd-arm64-cgo), type IfaMsghdr struct, Metric int32
+pkg syscall (freebsd-arm64-cgo), type IfaMsghdr struct, Msglen uint16
+pkg syscall (freebsd-arm64-cgo), type IfaMsghdr struct, Pad_cgo_0 [2]uint8
+pkg syscall (freebsd-arm64-cgo), type IfaMsghdr struct, Type uint8
+pkg syscall (freebsd-arm64-cgo), type IfaMsghdr struct, Version uint8
+pkg syscall (freebsd-arm64-cgo), type IfAnnounceMsghdr struct
+pkg syscall (freebsd-arm64-cgo), type IfAnnounceMsghdr struct, Index uint16
+pkg syscall (freebsd-arm64-cgo), type IfAnnounceMsghdr struct, Msglen uint16
+pkg syscall (freebsd-arm64-cgo), type IfAnnounceMsghdr struct, Name [16]int8
+pkg syscall (freebsd-arm64-cgo), type IfAnnounceMsghdr struct, Type uint8
+pkg syscall (freebsd-arm64-cgo), type IfAnnounceMsghdr struct, Version uint8
+pkg syscall (freebsd-arm64-cgo), type IfAnnounceMsghdr struct, What uint16
+pkg syscall (freebsd-arm64-cgo), type IfData struct
+pkg syscall (freebsd-arm64-cgo), type IfData struct, Addrlen uint8
+pkg syscall (freebsd-arm64-cgo), type IfData struct, Baudrate uint64
+pkg syscall (freebsd-arm64-cgo), type IfData struct, Collisions uint64
+pkg syscall (freebsd-arm64-cgo), type IfData struct, Datalen uint8
+pkg syscall (freebsd-arm64-cgo), type IfData struct, Epoch int64
+pkg syscall (freebsd-arm64-cgo), type IfData struct, Hdrlen uint8
+pkg syscall (freebsd-arm64-cgo), type IfData struct, Hwassist uint64
+pkg syscall (freebsd-arm64-cgo), type IfData struct, Ibytes uint64
+pkg syscall (freebsd-arm64-cgo), type IfData struct, Ierrors uint64
+pkg syscall (freebsd-arm64-cgo), type IfData struct, Imcasts uint64
+pkg syscall (freebsd-arm64-cgo), type IfData struct, Ipackets uint64
+pkg syscall (freebsd-arm64-cgo), type IfData struct, Iqdrops uint64
+pkg syscall (freebsd-arm64-cgo), type IfData struct, Lastchange Timeval
+pkg syscall (freebsd-arm64-cgo), type IfData struct, Link_state uint8
+pkg syscall (freebsd-arm64-cgo), type IfData struct, Metric uint64
+pkg syscall (freebsd-arm64-cgo), type IfData struct, Mtu uint64
+pkg syscall (freebsd-arm64-cgo), type IfData struct, Noproto uint64
+pkg syscall (freebsd-arm64-cgo), type IfData struct, Obytes uint64
+pkg syscall (freebsd-arm64-cgo), type IfData struct, Oerrors uint64
+pkg syscall (freebsd-arm64-cgo), type IfData struct, Omcasts uint64
+pkg syscall (freebsd-arm64-cgo), type IfData struct, Opackets uint64
+pkg syscall (freebsd-arm64-cgo), type IfData struct, Physical uint8
+pkg syscall (freebsd-arm64-cgo), type IfData struct, Spare_char1 uint8
+pkg syscall (freebsd-arm64-cgo), type IfData struct, Spare_char2 uint8
+pkg syscall (freebsd-arm64-cgo), type IfData struct, Type uint8
+pkg syscall (freebsd-arm64-cgo), type IfmaMsghdr struct
+pkg syscall (freebsd-arm64-cgo), type IfmaMsghdr struct, Addrs int32
+pkg syscall (freebsd-arm64-cgo), type IfmaMsghdr struct, Flags int32
+pkg syscall (freebsd-arm64-cgo), type IfmaMsghdr struct, Index uint16
+pkg syscall (freebsd-arm64-cgo), type IfmaMsghdr struct, Msglen uint16
+pkg syscall (freebsd-arm64-cgo), type IfmaMsghdr struct, Pad_cgo_0 [2]uint8
+pkg syscall (freebsd-arm64-cgo), type IfmaMsghdr struct, Type uint8
+pkg syscall (freebsd-arm64-cgo), type IfmaMsghdr struct, Version uint8
+pkg syscall (freebsd-arm64-cgo), type IfMsghdr struct
+pkg syscall (freebsd-arm64-cgo), type IfMsghdr struct, Addrs int32
+pkg syscall (freebsd-arm64-cgo), type IfMsghdr struct, Data IfData
+pkg syscall (freebsd-arm64-cgo), type IfMsghdr struct, Flags int32
+pkg syscall (freebsd-arm64-cgo), type IfMsghdr struct, Index uint16
+pkg syscall (freebsd-arm64-cgo), type IfMsghdr struct, Msglen uint16
+pkg syscall (freebsd-arm64-cgo), type IfMsghdr struct, Pad_cgo_0 [2]uint8
+pkg syscall (freebsd-arm64-cgo), type IfMsghdr struct, Type uint8
+pkg syscall (freebsd-arm64-cgo), type IfMsghdr struct, Version uint8
+pkg syscall (freebsd-arm64-cgo), type Inet6Pktinfo struct
+pkg syscall (freebsd-arm64-cgo), type Inet6Pktinfo struct, Addr [16]uint8
+pkg syscall (freebsd-arm64-cgo), type Inet6Pktinfo struct, Ifindex uint32
+pkg syscall (freebsd-arm64-cgo), type InterfaceAddrMessage //deprecated
+pkg syscall (freebsd-arm64-cgo), type InterfaceAddrMessage struct
+pkg syscall (freebsd-arm64-cgo), type InterfaceAddrMessage struct, Data []uint8
+pkg syscall (freebsd-arm64-cgo), type InterfaceAddrMessage struct, Header IfaMsghdr
+pkg syscall (freebsd-arm64-cgo), type InterfaceAnnounceMessage //deprecated
+pkg syscall (freebsd-arm64-cgo), type InterfaceAnnounceMessage struct
+pkg syscall (freebsd-arm64-cgo), type InterfaceAnnounceMessage struct, Header IfAnnounceMsghdr
+pkg syscall (freebsd-arm64-cgo), type InterfaceMessage //deprecated
+pkg syscall (freebsd-arm64-cgo), type InterfaceMessage struct
+pkg syscall (freebsd-arm64-cgo), type InterfaceMessage struct, Data []uint8
+pkg syscall (freebsd-arm64-cgo), type InterfaceMessage struct, Header IfMsghdr
+pkg syscall (freebsd-arm64-cgo), type InterfaceMulticastAddrMessage //deprecated
+pkg syscall (freebsd-arm64-cgo), type InterfaceMulticastAddrMessage struct
+pkg syscall (freebsd-arm64-cgo), type InterfaceMulticastAddrMessage struct, Data []uint8
+pkg syscall (freebsd-arm64-cgo), type InterfaceMulticastAddrMessage struct, Header IfmaMsghdr
+pkg syscall (freebsd-arm64-cgo), type Iovec struct
+pkg syscall (freebsd-arm64-cgo), type Iovec struct, Base *uint8
+pkg syscall (freebsd-arm64-cgo), type Iovec struct, Len uint64
+pkg syscall (freebsd-arm64-cgo), type IPMreqn struct
+pkg syscall (freebsd-arm64-cgo), type IPMreqn struct, Address [4]uint8
+pkg syscall (freebsd-arm64-cgo), type IPMreqn struct, Ifindex int32
+pkg syscall (freebsd-arm64-cgo), type IPMreqn struct, Multiaddr [4]uint8
+pkg syscall (freebsd-arm64-cgo), type IPv6MTUInfo struct
+pkg syscall (freebsd-arm64-cgo), type IPv6MTUInfo struct, Addr RawSockaddrInet6
+pkg syscall (freebsd-arm64-cgo), type IPv6MTUInfo struct, Mtu uint32
+pkg syscall (freebsd-arm64-cgo), type Kevent_t struct
+pkg syscall (freebsd-arm64-cgo), type Kevent_t struct, Data int64
+pkg syscall (freebsd-arm64-cgo), type Kevent_t struct, Fflags uint32
+pkg syscall (freebsd-arm64-cgo), type Kevent_t struct, Filter int16
+pkg syscall (freebsd-arm64-cgo), type Kevent_t struct, Flags uint16
+pkg syscall (freebsd-arm64-cgo), type Kevent_t struct, Ident uint64
+pkg syscall (freebsd-arm64-cgo), type Kevent_t struct, Udata *uint8
+pkg syscall (freebsd-arm64-cgo), type Msghdr struct
+pkg syscall (freebsd-arm64-cgo), type Msghdr struct, Control *uint8
+pkg syscall (freebsd-arm64-cgo), type Msghdr struct, Controllen uint32
+pkg syscall (freebsd-arm64-cgo), type Msghdr struct, Flags int32
+pkg syscall (freebsd-arm64-cgo), type Msghdr struct, Iov *Iovec
+pkg syscall (freebsd-arm64-cgo), type Msghdr struct, Iovlen int32
+pkg syscall (freebsd-arm64-cgo), type Msghdr struct, Name *uint8
+pkg syscall (freebsd-arm64-cgo), type Msghdr struct, Namelen uint32
+pkg syscall (freebsd-arm64-cgo), type Msghdr struct, Pad_cgo_0 [4]uint8
+pkg syscall (freebsd-arm64-cgo), type Msghdr struct, Pad_cgo_1 [4]uint8
+pkg syscall (freebsd-arm64-cgo), type RawSockaddr struct, Data [14]int8
+pkg syscall (freebsd-arm64-cgo), type RawSockaddr struct, Family uint8
+pkg syscall (freebsd-arm64-cgo), type RawSockaddr struct, Len uint8
+pkg syscall (freebsd-arm64-cgo), type RawSockaddrAny struct, Pad [92]int8
+pkg syscall (freebsd-arm64-cgo), type RawSockaddrDatalink struct
+pkg syscall (freebsd-arm64-cgo), type RawSockaddrDatalink struct, Alen uint8
+pkg syscall (freebsd-arm64-cgo), type RawSockaddrDatalink struct, Data [46]int8
+pkg syscall (freebsd-arm64-cgo), type RawSockaddrDatalink struct, Family uint8
+pkg syscall (freebsd-arm64-cgo), type RawSockaddrDatalink struct, Index uint16
+pkg syscall (freebsd-arm64-cgo), type RawSockaddrDatalink struct, Len uint8
+pkg syscall (freebsd-arm64-cgo), type RawSockaddrDatalink struct, Nlen uint8
+pkg syscall (freebsd-arm64-cgo), type RawSockaddrDatalink struct, Slen uint8
+pkg syscall (freebsd-arm64-cgo), type RawSockaddrDatalink struct, Type uint8
+pkg syscall (freebsd-arm64-cgo), type RawSockaddrInet4 struct, Family uint8
+pkg syscall (freebsd-arm64-cgo), type RawSockaddrInet4 struct, Len uint8
+pkg syscall (freebsd-arm64-cgo), type RawSockaddrInet4 struct, Zero [8]int8
+pkg syscall (freebsd-arm64-cgo), type RawSockaddrInet6 struct, Family uint8
+pkg syscall (freebsd-arm64-cgo), type RawSockaddrInet6 struct, Len uint8
+pkg syscall (freebsd-arm64-cgo), type RawSockaddrUnix struct, Family uint8
+pkg syscall (freebsd-arm64-cgo), type RawSockaddrUnix struct, Len uint8
+pkg syscall (freebsd-arm64-cgo), type RawSockaddrUnix struct, Path [104]int8
+pkg syscall (freebsd-arm64-cgo), type Rlimit struct
+pkg syscall (freebsd-arm64-cgo), type Rlimit struct, Cur int64
+pkg syscall (freebsd-arm64-cgo), type Rlimit struct, Max int64
+pkg syscall (freebsd-arm64-cgo), type RouteMessage //deprecated
+pkg syscall (freebsd-arm64-cgo), type RouteMessage struct
+pkg syscall (freebsd-arm64-cgo), type RouteMessage struct, Data []uint8
+pkg syscall (freebsd-arm64-cgo), type RouteMessage struct, Header RtMsghdr
+pkg syscall (freebsd-arm64-cgo), type RoutingMessage //deprecated
+pkg syscall (freebsd-arm64-cgo), type RoutingMessage interface, unexported methods
+pkg syscall (freebsd-arm64-cgo), type RtMetrics struct
+pkg syscall (freebsd-arm64-cgo), type RtMetrics struct, Expire uint64
+pkg syscall (freebsd-arm64-cgo), type RtMetrics struct, Filler [3]uint64
+pkg syscall (freebsd-arm64-cgo), type RtMetrics struct, Hopcount uint64
+pkg syscall (freebsd-arm64-cgo), type RtMetrics struct, Locks uint64
+pkg syscall (freebsd-arm64-cgo), type RtMetrics struct, Mtu uint64
+pkg syscall (freebsd-arm64-cgo), type RtMetrics struct, Pksent uint64
+pkg syscall (freebsd-arm64-cgo), type RtMetrics struct, Recvpipe uint64
+pkg syscall (freebsd-arm64-cgo), type RtMetrics struct, Rtt uint64
+pkg syscall (freebsd-arm64-cgo), type RtMetrics struct, Rttvar uint64
+pkg syscall (freebsd-arm64-cgo), type RtMetrics struct, Sendpipe uint64
+pkg syscall (freebsd-arm64-cgo), type RtMetrics struct, Ssthresh uint64
+pkg syscall (freebsd-arm64-cgo), type RtMetrics struct, Weight uint64
+pkg syscall (freebsd-arm64-cgo), type RtMsghdr struct
+pkg syscall (freebsd-arm64-cgo), type RtMsghdr struct, Addrs int32
+pkg syscall (freebsd-arm64-cgo), type RtMsghdr struct, Errno int32
+pkg syscall (freebsd-arm64-cgo), type RtMsghdr struct, Flags int32
+pkg syscall (freebsd-arm64-cgo), type RtMsghdr struct, Fmask int32
+pkg syscall (freebsd-arm64-cgo), type RtMsghdr struct, Index uint16
+pkg syscall (freebsd-arm64-cgo), type RtMsghdr struct, Inits uint64
+pkg syscall (freebsd-arm64-cgo), type RtMsghdr struct, Msglen uint16
+pkg syscall (freebsd-arm64-cgo), type RtMsghdr struct, Pad_cgo_0 [2]uint8
+pkg syscall (freebsd-arm64-cgo), type RtMsghdr struct, Pid int32
+pkg syscall (freebsd-arm64-cgo), type RtMsghdr struct, Rmx RtMetrics
+pkg syscall (freebsd-arm64-cgo), type RtMsghdr struct, Seq int32
+pkg syscall (freebsd-arm64-cgo), type RtMsghdr struct, Type uint8
+pkg syscall (freebsd-arm64-cgo), type RtMsghdr struct, Version uint8
+pkg syscall (freebsd-arm64-cgo), type Rusage struct, Idrss int64
+pkg syscall (freebsd-arm64-cgo), type Rusage struct, Inblock int64
+pkg syscall (freebsd-arm64-cgo), type Rusage struct, Isrss int64
+pkg syscall (freebsd-arm64-cgo), type Rusage struct, Ixrss int64
+pkg syscall (freebsd-arm64-cgo), type Rusage struct, Majflt int64
+pkg syscall (freebsd-arm64-cgo), type Rusage struct, Maxrss int64
+pkg syscall (freebsd-arm64-cgo), type Rusage struct, Minflt int64
+pkg syscall (freebsd-arm64-cgo), type Rusage struct, Msgrcv int64
+pkg syscall (freebsd-arm64-cgo), type Rusage struct, Msgsnd int64
+pkg syscall (freebsd-arm64-cgo), type Rusage struct, Nivcsw int64
+pkg syscall (freebsd-arm64-cgo), type Rusage struct, Nsignals int64
+pkg syscall (freebsd-arm64-cgo), type Rusage struct, Nswap int64
+pkg syscall (freebsd-arm64-cgo), type Rusage struct, Nvcsw int64
+pkg syscall (freebsd-arm64-cgo), type Rusage struct, Oublock int64
+pkg syscall (freebsd-arm64-cgo), type Rusage struct, Stime Timeval
+pkg syscall (freebsd-arm64-cgo), type Rusage struct, Utime Timeval
+pkg syscall (freebsd-arm64-cgo), type SockaddrDatalink struct
+pkg syscall (freebsd-arm64-cgo), type SockaddrDatalink struct, Alen uint8
+pkg syscall (freebsd-arm64-cgo), type SockaddrDatalink struct, Data [46]int8
+pkg syscall (freebsd-arm64-cgo), type SockaddrDatalink struct, Family uint8
+pkg syscall (freebsd-arm64-cgo), type SockaddrDatalink struct, Index uint16
+pkg syscall (freebsd-arm64-cgo), type SockaddrDatalink struct, Len uint8
+pkg syscall (freebsd-arm64-cgo), type SockaddrDatalink struct, Nlen uint8
+pkg syscall (freebsd-arm64-cgo), type SockaddrDatalink struct, Slen uint8
+pkg syscall (freebsd-arm64-cgo), type SockaddrDatalink struct, Type uint8
+pkg syscall (freebsd-arm64-cgo), type SocketControlMessage struct
+pkg syscall (freebsd-arm64-cgo), type SocketControlMessage struct, Data []uint8
+pkg syscall (freebsd-arm64-cgo), type SocketControlMessage struct, Header Cmsghdr
+pkg syscall (freebsd-arm64-cgo), type Stat_t struct
+pkg syscall (freebsd-arm64-cgo), type Stat_t struct, Atimespec Timespec
+pkg syscall (freebsd-arm64-cgo), type Stat_t struct, Birthtimespec Timespec
+pkg syscall (freebsd-arm64-cgo), type Stat_t struct, Blksize int32
+pkg syscall (freebsd-arm64-cgo), type Stat_t struct, Blocks int64
+pkg syscall (freebsd-arm64-cgo), type Stat_t struct, Ctimespec Timespec
+pkg syscall (freebsd-arm64-cgo), type Stat_t struct, Dev uint64
+pkg syscall (freebsd-arm64-cgo), type Stat_t struct, Flags uint32
+pkg syscall (freebsd-arm64-cgo), type Stat_t struct, Gen uint64
+pkg syscall (freebsd-arm64-cgo), type Stat_t struct, Gid uint32
+pkg syscall (freebsd-arm64-cgo), type Stat_t struct, Ino uint64
+pkg syscall (freebsd-arm64-cgo), type Stat_t struct, Mode uint16
+pkg syscall (freebsd-arm64-cgo), type Stat_t struct, Mtimespec Timespec
+pkg syscall (freebsd-arm64-cgo), type Stat_t struct, Nlink uint64
+pkg syscall (freebsd-arm64-cgo), type Stat_t struct, Padding0 int16
+pkg syscall (freebsd-arm64-cgo), type Stat_t struct, Padding1 int32
+pkg syscall (freebsd-arm64-cgo), type Stat_t struct, Rdev uint64
+pkg syscall (freebsd-arm64-cgo), type Stat_t struct, Size int64
+pkg syscall (freebsd-arm64-cgo), type Stat_t struct, Spare [10]uint64
+pkg syscall (freebsd-arm64-cgo), type Stat_t struct, Uid uint32
+pkg syscall (freebsd-arm64-cgo), type Statfs_t struct
+pkg syscall (freebsd-arm64-cgo), type Statfs_t struct, Asyncreads uint64
+pkg syscall (freebsd-arm64-cgo), type Statfs_t struct, Asyncwrites uint64
+pkg syscall (freebsd-arm64-cgo), type Statfs_t struct, Bavail int64
+pkg syscall (freebsd-arm64-cgo), type Statfs_t struct, Bfree uint64
+pkg syscall (freebsd-arm64-cgo), type Statfs_t struct, Blocks uint64
+pkg syscall (freebsd-arm64-cgo), type Statfs_t struct, Bsize uint64
+pkg syscall (freebsd-arm64-cgo), type Statfs_t struct, Charspare [80]int8
+pkg syscall (freebsd-arm64-cgo), type Statfs_t struct, Ffree int64
+pkg syscall (freebsd-arm64-cgo), type Statfs_t struct, Files uint64
+pkg syscall (freebsd-arm64-cgo), type Statfs_t struct, Flags uint64
+pkg syscall (freebsd-arm64-cgo), type Statfs_t struct, Fsid Fsid
+pkg syscall (freebsd-arm64-cgo), type Statfs_t struct, Fstypename [16]int8
+pkg syscall (freebsd-arm64-cgo), type Statfs_t struct, Iosize uint64
+pkg syscall (freebsd-arm64-cgo), type Statfs_t struct, Mntfromname [1024]int8
+pkg syscall (freebsd-arm64-cgo), type Statfs_t struct, Mntonname [1024]int8
+pkg syscall (freebsd-arm64-cgo), type Statfs_t struct, Namemax uint32
+pkg syscall (freebsd-arm64-cgo), type Statfs_t struct, Owner uint32
+pkg syscall (freebsd-arm64-cgo), type Statfs_t struct, Spare [10]uint64
+pkg syscall (freebsd-arm64-cgo), type Statfs_t struct, Syncreads uint64
+pkg syscall (freebsd-arm64-cgo), type Statfs_t struct, Syncwrites uint64
+pkg syscall (freebsd-arm64-cgo), type Statfs_t struct, Type uint32
+pkg syscall (freebsd-arm64-cgo), type Statfs_t struct, Version uint32
+pkg syscall (freebsd-arm64-cgo), type SysProcAttr struct, Chroot string
+pkg syscall (freebsd-arm64-cgo), type SysProcAttr struct, Credential *Credential
+pkg syscall (freebsd-arm64-cgo), type SysProcAttr struct, Ctty int
+pkg syscall (freebsd-arm64-cgo), type SysProcAttr struct, Foreground bool
+pkg syscall (freebsd-arm64-cgo), type SysProcAttr struct, Noctty bool
+pkg syscall (freebsd-arm64-cgo), type SysProcAttr struct, Pgid int
+pkg syscall (freebsd-arm64-cgo), type SysProcAttr struct, Ptrace bool
+pkg syscall (freebsd-arm64-cgo), type SysProcAttr struct, Setctty bool
+pkg syscall (freebsd-arm64-cgo), type SysProcAttr struct, Setpgid bool
+pkg syscall (freebsd-arm64-cgo), type SysProcAttr struct, Setsid bool
+pkg syscall (freebsd-arm64-cgo), type Termios struct
+pkg syscall (freebsd-arm64-cgo), type Termios struct, Cc [20]uint8
+pkg syscall (freebsd-arm64-cgo), type Termios struct, Cflag uint32
+pkg syscall (freebsd-arm64-cgo), type Termios struct, Iflag uint32
+pkg syscall (freebsd-arm64-cgo), type Termios struct, Ispeed uint32
+pkg syscall (freebsd-arm64-cgo), type Termios struct, Lflag uint32
+pkg syscall (freebsd-arm64-cgo), type Termios struct, Oflag uint32
+pkg syscall (freebsd-arm64-cgo), type Termios struct, Ospeed uint32
+pkg syscall (freebsd-arm64-cgo), type Timespec struct, Nsec int64
+pkg syscall (freebsd-arm64-cgo), type Timespec struct, Sec int64
+pkg syscall (freebsd-arm64-cgo), type Timeval struct, Sec int64
+pkg syscall (freebsd-arm64-cgo), type Timeval struct, Usec int64
+pkg syscall (freebsd-arm64-cgo), type WaitStatus uint32
+pkg syscall (freebsd-arm64-cgo), var Stderr int
+pkg syscall (freebsd-arm64-cgo), var Stdin int
+pkg syscall (freebsd-arm64-cgo), var Stdout int
diff --git a/api/go1.17.txt b/api/go1.17.txt
index ea0a694..a31cec9 100644
--- a/api/go1.17.txt
+++ b/api/go1.17.txt
@@ -93,6 +93,12 @@
 pkg math (freebsd-arm-cgo), const MaxInt = 2147483647
 pkg math (freebsd-arm-cgo), const MaxUint = 4294967295
 pkg math (freebsd-arm-cgo), const MinInt = -2147483648
+pkg math (freebsd-arm64), const MaxInt = 9223372036854775807
+pkg math (freebsd-arm64), const MaxUint = 18446744073709551615
+pkg math (freebsd-arm64), const MinInt = -9223372036854775808
+pkg math (freebsd-arm64-cgo), const MaxInt = 9223372036854775807
+pkg math (freebsd-arm64-cgo), const MaxUint = 18446744073709551615
+pkg math (freebsd-arm64-cgo), const MinInt = -9223372036854775808
 pkg math (linux-386), const MaxInt = 2147483647
 pkg math (linux-386), const MaxUint = 4294967295
 pkg math (linux-386), const MinInt = -2147483648
@@ -189,6 +195,10 @@
 pkg runtime/cgo (freebsd-arm-cgo), method (Handle) Delete()
 pkg runtime/cgo (freebsd-arm-cgo), method (Handle) Value() interface{}
 pkg runtime/cgo (freebsd-arm-cgo), type Handle uintptr
+pkg runtime/cgo (freebsd-arm64-cgo), func NewHandle(interface{}) Handle
+pkg runtime/cgo (freebsd-arm64-cgo), method (Handle) Delete()
+pkg runtime/cgo (freebsd-arm64-cgo), method (Handle) Value() interface{}
+pkg runtime/cgo (freebsd-arm64-cgo), type Handle uintptr
 pkg runtime/cgo (linux-386-cgo), func NewHandle(interface{}) Handle
 pkg runtime/cgo (linux-386-cgo), method (Handle) Delete()
 pkg runtime/cgo (linux-386-cgo), method (Handle) Value() interface{}
diff --git a/api/go1.18.txt b/api/go1.18.txt
index a9f1993..5040c95 100644
--- a/api/go1.18.txt
+++ b/api/go1.18.txt
@@ -189,6 +189,8 @@
 pkg syscall (freebsd-amd64-cgo), type SysProcAttr struct, Pdeathsig Signal
 pkg syscall (freebsd-arm), type SysProcAttr struct, Pdeathsig Signal
 pkg syscall (freebsd-arm-cgo), type SysProcAttr struct, Pdeathsig Signal
+pkg syscall (freebsd-arm64), type SysProcAttr struct, Pdeathsig Signal
+pkg syscall (freebsd-arm64-cgo), type SysProcAttr struct, Pdeathsig Signal
 pkg syscall (windows-386), func Syscall //deprecated
 pkg syscall (windows-386), func Syscall12 //deprecated
 pkg syscall (windows-386), func Syscall15 //deprecated
diff --git a/api/go1.20.txt b/api/go1.20.txt
index fd6800e..8deb435 100644
--- a/api/go1.20.txt
+++ b/api/go1.20.txt
@@ -284,6 +284,7 @@
 pkg runtime/cgo (freebsd-386-cgo), type Incomplete struct #46731
 pkg runtime/cgo (freebsd-amd64-cgo), type Incomplete struct #46731
 pkg runtime/cgo (freebsd-arm-cgo), type Incomplete struct #46731
+pkg runtime/cgo (freebsd-arm64-cgo), type Incomplete struct #46731
 pkg runtime/cgo (linux-386-cgo), type Incomplete struct #46731
 pkg runtime/cgo (linux-amd64-cgo), type Incomplete struct #46731
 pkg runtime/cgo (linux-arm-cgo), type Incomplete struct #46731
@@ -345,6 +346,20 @@
 pkg syscall (freebsd-arm), const SYS_GETFSSTAT = 557 #53280
 pkg syscall (freebsd-arm), const SYS_MKNODAT = 559 #53280
 pkg syscall (freebsd-arm), const SYS_STATFS = 555 #53280
+pkg syscall (freebsd-arm64), const SYS_FSTAT = 551 #53280
+pkg syscall (freebsd-arm64), const SYS_FSTATAT = 552 #53280
+pkg syscall (freebsd-arm64), const SYS_FSTATFS = 556 #53280
+pkg syscall (freebsd-arm64), const SYS_GETDIRENTRIES = 554 #53280
+pkg syscall (freebsd-arm64), const SYS_GETFSSTAT = 557 #53280
+pkg syscall (freebsd-arm64), const SYS_MKNODAT = 559 #53280
+pkg syscall (freebsd-arm64), const SYS_STATFS = 555 #53280
+pkg syscall (freebsd-arm64-cgo), const SYS_FSTAT = 551 #53280
+pkg syscall (freebsd-arm64-cgo), const SYS_FSTATAT = 552 #53280
+pkg syscall (freebsd-arm64-cgo), const SYS_FSTATFS = 556 #53280
+pkg syscall (freebsd-arm64-cgo), const SYS_GETDIRENTRIES = 554 #53280
+pkg syscall (freebsd-arm64-cgo), const SYS_GETFSSTAT = 557 #53280
+pkg syscall (freebsd-arm64-cgo), const SYS_MKNODAT = 559 #53280
+pkg syscall (freebsd-arm64-cgo), const SYS_STATFS = 555 #53280
 pkg syscall (linux-386-cgo), const CLONE_CLEAR_SIGHAND = 4294967296 #51246
 pkg syscall (linux-386-cgo), const CLONE_CLEAR_SIGHAND ideal-int #51246
 pkg syscall (linux-386-cgo), const CLONE_INTO_CGROUP = 8589934592 #51246
@@ -426,3 +441,8725 @@
 pkg time, const TimeOnly ideal-string #52746
 pkg time, method (Time) Compare(Time) int #50770
 pkg unicode/utf16, func AppendRune([]uint16, int32) []uint16 #51896
+# freebsd riscv64 port
+pkg log/syslog (freebsd-riscv64), const LOG_ALERT = 1 #53466
+pkg log/syslog (freebsd-riscv64), const LOG_ALERT Priority #53466
+pkg log/syslog (freebsd-riscv64), const LOG_AUTH = 32 #53466
+pkg log/syslog (freebsd-riscv64), const LOG_AUTH Priority #53466
+pkg log/syslog (freebsd-riscv64), const LOG_AUTHPRIV = 80 #53466
+pkg log/syslog (freebsd-riscv64), const LOG_AUTHPRIV Priority #53466
+pkg log/syslog (freebsd-riscv64), const LOG_CRIT = 2 #53466
+pkg log/syslog (freebsd-riscv64), const LOG_CRIT Priority #53466
+pkg log/syslog (freebsd-riscv64), const LOG_CRON = 72 #53466
+pkg log/syslog (freebsd-riscv64), const LOG_CRON Priority #53466
+pkg log/syslog (freebsd-riscv64), const LOG_DAEMON = 24 #53466
+pkg log/syslog (freebsd-riscv64), const LOG_DAEMON Priority #53466
+pkg log/syslog (freebsd-riscv64), const LOG_DEBUG = 7 #53466
+pkg log/syslog (freebsd-riscv64), const LOG_DEBUG Priority #53466
+pkg log/syslog (freebsd-riscv64), const LOG_EMERG = 0 #53466
+pkg log/syslog (freebsd-riscv64), const LOG_EMERG Priority #53466
+pkg log/syslog (freebsd-riscv64), const LOG_ERR = 3 #53466
+pkg log/syslog (freebsd-riscv64), const LOG_ERR Priority #53466
+pkg log/syslog (freebsd-riscv64), const LOG_FTP = 88 #53466
+pkg log/syslog (freebsd-riscv64), const LOG_FTP Priority #53466
+pkg log/syslog (freebsd-riscv64), const LOG_INFO = 6 #53466
+pkg log/syslog (freebsd-riscv64), const LOG_INFO Priority #53466
+pkg log/syslog (freebsd-riscv64), const LOG_KERN = 0 #53466
+pkg log/syslog (freebsd-riscv64), const LOG_KERN Priority #53466
+pkg log/syslog (freebsd-riscv64), const LOG_LOCAL0 = 128 #53466
+pkg log/syslog (freebsd-riscv64), const LOG_LOCAL0 Priority #53466
+pkg log/syslog (freebsd-riscv64), const LOG_LOCAL1 = 136 #53466
+pkg log/syslog (freebsd-riscv64), const LOG_LOCAL1 Priority #53466
+pkg log/syslog (freebsd-riscv64), const LOG_LOCAL2 = 144 #53466
+pkg log/syslog (freebsd-riscv64), const LOG_LOCAL2 Priority #53466
+pkg log/syslog (freebsd-riscv64), const LOG_LOCAL3 = 152 #53466
+pkg log/syslog (freebsd-riscv64), const LOG_LOCAL3 Priority #53466
+pkg log/syslog (freebsd-riscv64), const LOG_LOCAL4 = 160 #53466
+pkg log/syslog (freebsd-riscv64), const LOG_LOCAL4 Priority #53466
+pkg log/syslog (freebsd-riscv64), const LOG_LOCAL5 = 168 #53466
+pkg log/syslog (freebsd-riscv64), const LOG_LOCAL5 Priority #53466
+pkg log/syslog (freebsd-riscv64), const LOG_LOCAL6 = 176 #53466
+pkg log/syslog (freebsd-riscv64), const LOG_LOCAL6 Priority #53466
+pkg log/syslog (freebsd-riscv64), const LOG_LOCAL7 = 184 #53466
+pkg log/syslog (freebsd-riscv64), const LOG_LOCAL7 Priority #53466
+pkg log/syslog (freebsd-riscv64), const LOG_LPR = 48 #53466
+pkg log/syslog (freebsd-riscv64), const LOG_LPR Priority #53466
+pkg log/syslog (freebsd-riscv64), const LOG_MAIL = 16 #53466
+pkg log/syslog (freebsd-riscv64), const LOG_MAIL Priority #53466
+pkg log/syslog (freebsd-riscv64), const LOG_NEWS = 56 #53466
+pkg log/syslog (freebsd-riscv64), const LOG_NEWS Priority #53466
+pkg log/syslog (freebsd-riscv64), const LOG_NOTICE = 5 #53466
+pkg log/syslog (freebsd-riscv64), const LOG_NOTICE Priority #53466
+pkg log/syslog (freebsd-riscv64), const LOG_SYSLOG = 40 #53466
+pkg log/syslog (freebsd-riscv64), const LOG_SYSLOG Priority #53466
+pkg log/syslog (freebsd-riscv64), const LOG_USER = 8 #53466
+pkg log/syslog (freebsd-riscv64), const LOG_USER Priority #53466
+pkg log/syslog (freebsd-riscv64), const LOG_UUCP = 64 #53466
+pkg log/syslog (freebsd-riscv64), const LOG_UUCP Priority #53466
+pkg log/syslog (freebsd-riscv64), const LOG_WARNING = 4 #53466
+pkg log/syslog (freebsd-riscv64), const LOG_WARNING Priority #53466
+pkg log/syslog (freebsd-riscv64), func Dial(string, string, Priority, string) (*Writer, error) #53466
+pkg log/syslog (freebsd-riscv64), func New(Priority, string) (*Writer, error) #53466
+pkg log/syslog (freebsd-riscv64), func NewLogger(Priority, int) (*log.Logger, error) #53466
+pkg log/syslog (freebsd-riscv64), method (*Writer) Alert(string) error #53466
+pkg log/syslog (freebsd-riscv64), method (*Writer) Close() error #53466
+pkg log/syslog (freebsd-riscv64), method (*Writer) Crit(string) error #53466
+pkg log/syslog (freebsd-riscv64), method (*Writer) Debug(string) error #53466
+pkg log/syslog (freebsd-riscv64), method (*Writer) Emerg(string) error #53466
+pkg log/syslog (freebsd-riscv64), method (*Writer) Err(string) error #53466
+pkg log/syslog (freebsd-riscv64), method (*Writer) Info(string) error #53466
+pkg log/syslog (freebsd-riscv64), method (*Writer) Notice(string) error #53466
+pkg log/syslog (freebsd-riscv64), method (*Writer) Warning(string) error #53466
+pkg log/syslog (freebsd-riscv64), method (*Writer) Write([]uint8) (int, error) #53466
+pkg log/syslog (freebsd-riscv64), type Priority int #53466
+pkg log/syslog (freebsd-riscv64), type Writer struct #53466
+pkg log/syslog (freebsd-riscv64-cgo), const LOG_ALERT = 1 #53466
+pkg log/syslog (freebsd-riscv64-cgo), const LOG_ALERT Priority #53466
+pkg log/syslog (freebsd-riscv64-cgo), const LOG_AUTH = 32 #53466
+pkg log/syslog (freebsd-riscv64-cgo), const LOG_AUTH Priority #53466
+pkg log/syslog (freebsd-riscv64-cgo), const LOG_AUTHPRIV = 80 #53466
+pkg log/syslog (freebsd-riscv64-cgo), const LOG_AUTHPRIV Priority #53466
+pkg log/syslog (freebsd-riscv64-cgo), const LOG_CRIT = 2 #53466
+pkg log/syslog (freebsd-riscv64-cgo), const LOG_CRIT Priority #53466
+pkg log/syslog (freebsd-riscv64-cgo), const LOG_CRON = 72 #53466
+pkg log/syslog (freebsd-riscv64-cgo), const LOG_CRON Priority #53466
+pkg log/syslog (freebsd-riscv64-cgo), const LOG_DAEMON = 24 #53466
+pkg log/syslog (freebsd-riscv64-cgo), const LOG_DAEMON Priority #53466
+pkg log/syslog (freebsd-riscv64-cgo), const LOG_DEBUG = 7 #53466
+pkg log/syslog (freebsd-riscv64-cgo), const LOG_DEBUG Priority #53466
+pkg log/syslog (freebsd-riscv64-cgo), const LOG_EMERG = 0 #53466
+pkg log/syslog (freebsd-riscv64-cgo), const LOG_EMERG Priority #53466
+pkg log/syslog (freebsd-riscv64-cgo), const LOG_ERR = 3 #53466
+pkg log/syslog (freebsd-riscv64-cgo), const LOG_ERR Priority #53466
+pkg log/syslog (freebsd-riscv64-cgo), const LOG_FTP = 88 #53466
+pkg log/syslog (freebsd-riscv64-cgo), const LOG_FTP Priority #53466
+pkg log/syslog (freebsd-riscv64-cgo), const LOG_INFO = 6 #53466
+pkg log/syslog (freebsd-riscv64-cgo), const LOG_INFO Priority #53466
+pkg log/syslog (freebsd-riscv64-cgo), const LOG_KERN = 0 #53466
+pkg log/syslog (freebsd-riscv64-cgo), const LOG_KERN Priority #53466
+pkg log/syslog (freebsd-riscv64-cgo), const LOG_LOCAL0 = 128 #53466
+pkg log/syslog (freebsd-riscv64-cgo), const LOG_LOCAL0 Priority #53466
+pkg log/syslog (freebsd-riscv64-cgo), const LOG_LOCAL1 = 136 #53466
+pkg log/syslog (freebsd-riscv64-cgo), const LOG_LOCAL1 Priority #53466
+pkg log/syslog (freebsd-riscv64-cgo), const LOG_LOCAL2 = 144 #53466
+pkg log/syslog (freebsd-riscv64-cgo), const LOG_LOCAL2 Priority #53466
+pkg log/syslog (freebsd-riscv64-cgo), const LOG_LOCAL3 = 152 #53466
+pkg log/syslog (freebsd-riscv64-cgo), const LOG_LOCAL3 Priority #53466
+pkg log/syslog (freebsd-riscv64-cgo), const LOG_LOCAL4 = 160 #53466
+pkg log/syslog (freebsd-riscv64-cgo), const LOG_LOCAL4 Priority #53466
+pkg log/syslog (freebsd-riscv64-cgo), const LOG_LOCAL5 = 168 #53466
+pkg log/syslog (freebsd-riscv64-cgo), const LOG_LOCAL5 Priority #53466
+pkg log/syslog (freebsd-riscv64-cgo), const LOG_LOCAL6 = 176 #53466
+pkg log/syslog (freebsd-riscv64-cgo), const LOG_LOCAL6 Priority #53466
+pkg log/syslog (freebsd-riscv64-cgo), const LOG_LOCAL7 = 184 #53466
+pkg log/syslog (freebsd-riscv64-cgo), const LOG_LOCAL7 Priority #53466
+pkg log/syslog (freebsd-riscv64-cgo), const LOG_LPR = 48 #53466
+pkg log/syslog (freebsd-riscv64-cgo), const LOG_LPR Priority #53466
+pkg log/syslog (freebsd-riscv64-cgo), const LOG_MAIL = 16 #53466
+pkg log/syslog (freebsd-riscv64-cgo), const LOG_MAIL Priority #53466
+pkg log/syslog (freebsd-riscv64-cgo), const LOG_NEWS = 56 #53466
+pkg log/syslog (freebsd-riscv64-cgo), const LOG_NEWS Priority #53466
+pkg log/syslog (freebsd-riscv64-cgo), const LOG_NOTICE = 5 #53466
+pkg log/syslog (freebsd-riscv64-cgo), const LOG_NOTICE Priority #53466
+pkg log/syslog (freebsd-riscv64-cgo), const LOG_SYSLOG = 40 #53466
+pkg log/syslog (freebsd-riscv64-cgo), const LOG_SYSLOG Priority #53466
+pkg log/syslog (freebsd-riscv64-cgo), const LOG_USER = 8 #53466
+pkg log/syslog (freebsd-riscv64-cgo), const LOG_USER Priority #53466
+pkg log/syslog (freebsd-riscv64-cgo), const LOG_UUCP = 64 #53466
+pkg log/syslog (freebsd-riscv64-cgo), const LOG_UUCP Priority #53466
+pkg log/syslog (freebsd-riscv64-cgo), const LOG_WARNING = 4 #53466
+pkg log/syslog (freebsd-riscv64-cgo), const LOG_WARNING Priority #53466
+pkg log/syslog (freebsd-riscv64-cgo), func Dial(string, string, Priority, string) (*Writer, error) #53466
+pkg log/syslog (freebsd-riscv64-cgo), func New(Priority, string) (*Writer, error) #53466
+pkg log/syslog (freebsd-riscv64-cgo), func NewLogger(Priority, int) (*log.Logger, error) #53466
+pkg log/syslog (freebsd-riscv64-cgo), method (*Writer) Alert(string) error #53466
+pkg log/syslog (freebsd-riscv64-cgo), method (*Writer) Close() error #53466
+pkg log/syslog (freebsd-riscv64-cgo), method (*Writer) Crit(string) error #53466
+pkg log/syslog (freebsd-riscv64-cgo), method (*Writer) Debug(string) error #53466
+pkg log/syslog (freebsd-riscv64-cgo), method (*Writer) Emerg(string) error #53466
+pkg log/syslog (freebsd-riscv64-cgo), method (*Writer) Err(string) error #53466
+pkg log/syslog (freebsd-riscv64-cgo), method (*Writer) Info(string) error #53466
+pkg log/syslog (freebsd-riscv64-cgo), method (*Writer) Notice(string) error #53466
+pkg log/syslog (freebsd-riscv64-cgo), method (*Writer) Warning(string) error #53466
+pkg log/syslog (freebsd-riscv64-cgo), method (*Writer) Write([]uint8) (int, error) #53466
+pkg log/syslog (freebsd-riscv64-cgo), type Priority int #53466
+pkg log/syslog (freebsd-riscv64-cgo), type Writer struct #53466
+pkg math (freebsd-riscv64), const MaxInt = 9223372036854775807 #53466
+pkg math (freebsd-riscv64), const MaxUint = 18446744073709551615 #53466
+pkg math (freebsd-riscv64), const MinInt = -9223372036854775808 #53466
+pkg math (freebsd-riscv64-cgo), const MaxInt = 9223372036854775807 #53466
+pkg math (freebsd-riscv64-cgo), const MaxUint = 18446744073709551615 #53466
+pkg math (freebsd-riscv64-cgo), const MinInt = -9223372036854775808 #53466
+pkg math/bits (freebsd-riscv64), const UintSize = 64 #53466
+pkg math/bits (freebsd-riscv64-cgo), const UintSize = 64 #53466
+pkg os (freebsd-riscv64), const DevNull = "/dev/null" #53466
+pkg os (freebsd-riscv64), const O_APPEND = 8 #53466
+pkg os (freebsd-riscv64), const O_CREATE = 512 #53466
+pkg os (freebsd-riscv64), const O_EXCL = 2048 #53466
+pkg os (freebsd-riscv64), const O_SYNC = 128 #53466
+pkg os (freebsd-riscv64), const O_TRUNC = 1024 #53466
+pkg os (freebsd-riscv64), const PathListSeparator = 58 #53466
+pkg os (freebsd-riscv64), const PathSeparator = 47 #53466
+pkg os (freebsd-riscv64-cgo), const DevNull = "/dev/null" #53466
+pkg os (freebsd-riscv64-cgo), const O_APPEND = 8 #53466
+pkg os (freebsd-riscv64-cgo), const O_CREATE = 512 #53466
+pkg os (freebsd-riscv64-cgo), const O_EXCL = 2048 #53466
+pkg os (freebsd-riscv64-cgo), const O_SYNC = 128 #53466
+pkg os (freebsd-riscv64-cgo), const O_TRUNC = 1024 #53466
+pkg os (freebsd-riscv64-cgo), const PathListSeparator = 58 #53466
+pkg os (freebsd-riscv64-cgo), const PathSeparator = 47 #53466
+pkg path/filepath (freebsd-riscv64), const ListSeparator = 58 #53466
+pkg path/filepath (freebsd-riscv64), const Separator = 47 #53466
+pkg path/filepath (freebsd-riscv64-cgo), const ListSeparator = 58 #53466
+pkg path/filepath (freebsd-riscv64-cgo), const Separator = 47 #53466
+pkg runtime (freebsd-riscv64), const GOARCH = "riscv64" #53466
+pkg runtime (freebsd-riscv64), const GOOS = "freebsd" #53466
+pkg runtime (freebsd-riscv64-cgo), const GOARCH = "riscv64" #53466
+pkg runtime (freebsd-riscv64-cgo), const GOOS = "freebsd" #53466
+pkg runtime/cgo (freebsd-riscv64-cgo), func NewHandle(interface{}) Handle #53466
+pkg runtime/cgo (freebsd-riscv64-cgo), method (Handle) Delete() #53466
+pkg runtime/cgo (freebsd-riscv64-cgo), method (Handle) Value() interface{} #53466
+pkg runtime/cgo (freebsd-riscv64-cgo), type Handle uintptr #53466
+pkg runtime/cgo (freebsd-riscv64-cgo), type Incomplete struct #53466
+pkg strconv (freebsd-riscv64), const IntSize = 64 #53466
+pkg strconv (freebsd-riscv64-cgo), const IntSize = 64 #53466
+pkg syscall (freebsd-riscv64), const AF_APPLETALK = 16 #53466
+pkg syscall (freebsd-riscv64), const AF_APPLETALK ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_ARP = 35 #53466
+pkg syscall (freebsd-riscv64), const AF_ARP ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_ATM = 30 #53466
+pkg syscall (freebsd-riscv64), const AF_ATM ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_BLUETOOTH = 36 #53466
+pkg syscall (freebsd-riscv64), const AF_BLUETOOTH ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_CCITT = 10 #53466
+pkg syscall (freebsd-riscv64), const AF_CCITT ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_CHAOS = 5 #53466
+pkg syscall (freebsd-riscv64), const AF_CHAOS ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_CNT = 21 #53466
+pkg syscall (freebsd-riscv64), const AF_CNT ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_COIP = 20 #53466
+pkg syscall (freebsd-riscv64), const AF_COIP ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_DATAKIT = 9 #53466
+pkg syscall (freebsd-riscv64), const AF_DATAKIT ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_DECnet = 12 #53466
+pkg syscall (freebsd-riscv64), const AF_DECnet ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_DLI = 13 #53466
+pkg syscall (freebsd-riscv64), const AF_DLI ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_E164 = 26 #53466
+pkg syscall (freebsd-riscv64), const AF_E164 ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_ECMA = 8 #53466
+pkg syscall (freebsd-riscv64), const AF_ECMA ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_HYLINK = 15 #53466
+pkg syscall (freebsd-riscv64), const AF_HYLINK ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_IEEE80211 = 37 #53466
+pkg syscall (freebsd-riscv64), const AF_IEEE80211 ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_IMPLINK = 3 #53466
+pkg syscall (freebsd-riscv64), const AF_IMPLINK ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_INET6 = 28 #53466
+pkg syscall (freebsd-riscv64), const AF_INET6_SDP = 42 #53466
+pkg syscall (freebsd-riscv64), const AF_INET6_SDP ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_INET_SDP = 40 #53466
+pkg syscall (freebsd-riscv64), const AF_INET_SDP ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_IPX = 23 #53466
+pkg syscall (freebsd-riscv64), const AF_IPX ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_ISDN = 26 #53466
+pkg syscall (freebsd-riscv64), const AF_ISDN ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_ISO = 7 #53466
+pkg syscall (freebsd-riscv64), const AF_ISO ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_LAT = 14 #53466
+pkg syscall (freebsd-riscv64), const AF_LAT ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_LINK = 18 #53466
+pkg syscall (freebsd-riscv64), const AF_LINK ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_LOCAL = 1 #53466
+pkg syscall (freebsd-riscv64), const AF_LOCAL ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_MAX = 42 #53466
+pkg syscall (freebsd-riscv64), const AF_MAX ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_NATM = 29 #53466
+pkg syscall (freebsd-riscv64), const AF_NATM ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_NETBIOS = 6 #53466
+pkg syscall (freebsd-riscv64), const AF_NETBIOS ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_NETGRAPH = 32 #53466
+pkg syscall (freebsd-riscv64), const AF_NETGRAPH ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_OSI = 7 #53466
+pkg syscall (freebsd-riscv64), const AF_OSI ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_PUP = 4 #53466
+pkg syscall (freebsd-riscv64), const AF_PUP ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_ROUTE = 17 #53466
+pkg syscall (freebsd-riscv64), const AF_ROUTE ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_SCLUSTER = 34 #53466
+pkg syscall (freebsd-riscv64), const AF_SCLUSTER ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_SIP = 24 #53466
+pkg syscall (freebsd-riscv64), const AF_SIP ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_SLOW = 33 #53466
+pkg syscall (freebsd-riscv64), const AF_SLOW ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_SNA = 11 #53466
+pkg syscall (freebsd-riscv64), const AF_SNA ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR00 = 39 #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR00 ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR01 = 41 #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR01 ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR02 = 43 #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR02 ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR03 = 45 #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR03 ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR04 = 47 #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR04 ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR05 = 49 #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR05 ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR06 = 51 #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR06 ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR07 = 53 #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR07 ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR08 = 55 #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR08 ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR09 = 57 #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR09 ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR10 = 59 #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR10 ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR11 = 61 #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR11 ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR12 = 63 #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR12 ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR13 = 65 #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR13 ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR14 = 67 #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR14 ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR15 = 69 #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR15 ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR16 = 71 #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR16 ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR17 = 73 #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR17 ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR18 = 75 #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR18 ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR19 = 77 #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR19 ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR20 = 79 #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR20 ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR21 = 81 #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR21 ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR22 = 83 #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR22 ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR23 = 85 #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR23 ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR24 = 87 #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR24 ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR25 = 89 #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR25 ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR26 = 91 #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR26 ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR27 = 93 #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR27 ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR28 = 95 #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR28 ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR29 = 97 #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR29 ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR30 = 99 #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR30 ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR31 = 101 #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR31 ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR32 = 103 #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR32 ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR33 = 105 #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR33 ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR34 = 107 #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR34 ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR35 = 109 #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR35 ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR36 = 111 #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR36 ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR37 = 113 #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR37 ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR38 = 115 #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR38 ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR39 = 117 #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR39 ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR40 = 119 #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR40 ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR41 = 121 #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR41 ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR42 = 123 #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR42 ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR43 = 125 #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR43 ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR44 = 127 #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR44 ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR45 = 129 #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR45 ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR46 = 131 #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR46 ideal-int #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR47 = 133 #53466
+pkg syscall (freebsd-riscv64), const AF_VENDOR47 ideal-int #53466
+pkg syscall (freebsd-riscv64), const B0 = 0 #53466
+pkg syscall (freebsd-riscv64), const B0 ideal-int #53466
+pkg syscall (freebsd-riscv64), const B110 = 110 #53466
+pkg syscall (freebsd-riscv64), const B110 ideal-int #53466
+pkg syscall (freebsd-riscv64), const B115200 = 115200 #53466
+pkg syscall (freebsd-riscv64), const B115200 ideal-int #53466
+pkg syscall (freebsd-riscv64), const B1200 = 1200 #53466
+pkg syscall (freebsd-riscv64), const B1200 ideal-int #53466
+pkg syscall (freebsd-riscv64), const B134 = 134 #53466
+pkg syscall (freebsd-riscv64), const B134 ideal-int #53466
+pkg syscall (freebsd-riscv64), const B14400 = 14400 #53466
+pkg syscall (freebsd-riscv64), const B14400 ideal-int #53466
+pkg syscall (freebsd-riscv64), const B150 = 150 #53466
+pkg syscall (freebsd-riscv64), const B150 ideal-int #53466
+pkg syscall (freebsd-riscv64), const B1800 = 1800 #53466
+pkg syscall (freebsd-riscv64), const B1800 ideal-int #53466
+pkg syscall (freebsd-riscv64), const B19200 = 19200 #53466
+pkg syscall (freebsd-riscv64), const B19200 ideal-int #53466
+pkg syscall (freebsd-riscv64), const B200 = 200 #53466
+pkg syscall (freebsd-riscv64), const B200 ideal-int #53466
+pkg syscall (freebsd-riscv64), const B230400 = 230400 #53466
+pkg syscall (freebsd-riscv64), const B230400 ideal-int #53466
+pkg syscall (freebsd-riscv64), const B2400 = 2400 #53466
+pkg syscall (freebsd-riscv64), const B2400 ideal-int #53466
+pkg syscall (freebsd-riscv64), const B28800 = 28800 #53466
+pkg syscall (freebsd-riscv64), const B28800 ideal-int #53466
+pkg syscall (freebsd-riscv64), const B300 = 300 #53466
+pkg syscall (freebsd-riscv64), const B300 ideal-int #53466
+pkg syscall (freebsd-riscv64), const B38400 = 38400 #53466
+pkg syscall (freebsd-riscv64), const B38400 ideal-int #53466
+pkg syscall (freebsd-riscv64), const B460800 = 460800 #53466
+pkg syscall (freebsd-riscv64), const B460800 ideal-int #53466
+pkg syscall (freebsd-riscv64), const B4800 = 4800 #53466
+pkg syscall (freebsd-riscv64), const B4800 ideal-int #53466
+pkg syscall (freebsd-riscv64), const B50 = 50 #53466
+pkg syscall (freebsd-riscv64), const B50 ideal-int #53466
+pkg syscall (freebsd-riscv64), const B57600 = 57600 #53466
+pkg syscall (freebsd-riscv64), const B57600 ideal-int #53466
+pkg syscall (freebsd-riscv64), const B600 = 600 #53466
+pkg syscall (freebsd-riscv64), const B600 ideal-int #53466
+pkg syscall (freebsd-riscv64), const B7200 = 7200 #53466
+pkg syscall (freebsd-riscv64), const B7200 ideal-int #53466
+pkg syscall (freebsd-riscv64), const B75 = 75 #53466
+pkg syscall (freebsd-riscv64), const B75 ideal-int #53466
+pkg syscall (freebsd-riscv64), const B76800 = 76800 #53466
+pkg syscall (freebsd-riscv64), const B76800 ideal-int #53466
+pkg syscall (freebsd-riscv64), const B921600 = 921600 #53466
+pkg syscall (freebsd-riscv64), const B921600 ideal-int #53466
+pkg syscall (freebsd-riscv64), const B9600 = 9600 #53466
+pkg syscall (freebsd-riscv64), const B9600 ideal-int #53466
+pkg syscall (freebsd-riscv64), const BIOCFEEDBACK = 2147762812 #53466
+pkg syscall (freebsd-riscv64), const BIOCFEEDBACK ideal-int #53466
+pkg syscall (freebsd-riscv64), const BIOCFLUSH = 536887912 #53466
+pkg syscall (freebsd-riscv64), const BIOCFLUSH ideal-int #53466
+pkg syscall (freebsd-riscv64), const BIOCGBLEN = 1074020966 #53466
+pkg syscall (freebsd-riscv64), const BIOCGBLEN ideal-int #53466
+pkg syscall (freebsd-riscv64), const BIOCGDIRECTION = 1074020982 #53466
+pkg syscall (freebsd-riscv64), const BIOCGDIRECTION ideal-int #53466
+pkg syscall (freebsd-riscv64), const BIOCGDLT = 1074020970 #53466
+pkg syscall (freebsd-riscv64), const BIOCGDLT ideal-int #53466
+pkg syscall (freebsd-riscv64), const BIOCGDLTLIST = 3222291065 #53466
+pkg syscall (freebsd-riscv64), const BIOCGDLTLIST ideal-int #53466
+pkg syscall (freebsd-riscv64), const BIOCGETBUFMODE = 1074020989 #53466
+pkg syscall (freebsd-riscv64), const BIOCGETBUFMODE ideal-int #53466
+pkg syscall (freebsd-riscv64), const BIOCGETIF = 1075855979 #53466
+pkg syscall (freebsd-riscv64), const BIOCGETIF ideal-int #53466
+pkg syscall (freebsd-riscv64), const BIOCGETZMAX = 1074283135 #53466
+pkg syscall (freebsd-riscv64), const BIOCGETZMAX ideal-int #53466
+pkg syscall (freebsd-riscv64), const BIOCGHDRCMPLT = 1074020980 #53466
+pkg syscall (freebsd-riscv64), const BIOCGHDRCMPLT ideal-int #53466
+pkg syscall (freebsd-riscv64), const BIOCGRSIG = 1074020978 #53466
+pkg syscall (freebsd-riscv64), const BIOCGRSIG ideal-int #53466
+pkg syscall (freebsd-riscv64), const BIOCGRTIMEOUT = 1074807406 #53466
+pkg syscall (freebsd-riscv64), const BIOCGRTIMEOUT ideal-int #53466
+pkg syscall (freebsd-riscv64), const BIOCGSEESENT = 1074020982 #53466
+pkg syscall (freebsd-riscv64), const BIOCGSEESENT ideal-int #53466
+pkg syscall (freebsd-riscv64), const BIOCGSTATS = 1074283119 #53466
+pkg syscall (freebsd-riscv64), const BIOCGSTATS ideal-int #53466
+pkg syscall (freebsd-riscv64), const BIOCGTSTAMP = 1074020995 #53466
+pkg syscall (freebsd-riscv64), const BIOCGTSTAMP ideal-int #53466
+pkg syscall (freebsd-riscv64), const BIOCIMMEDIATE = 2147762800 #53466
+pkg syscall (freebsd-riscv64), const BIOCIMMEDIATE ideal-int #53466
+pkg syscall (freebsd-riscv64), const BIOCLOCK = 536887930 #53466
+pkg syscall (freebsd-riscv64), const BIOCLOCK ideal-int #53466
+pkg syscall (freebsd-riscv64), const BIOCPROMISC = 536887913 #53466
+pkg syscall (freebsd-riscv64), const BIOCPROMISC ideal-int #53466
+pkg syscall (freebsd-riscv64), const BIOCROTZBUF = 1075331712 #53466
+pkg syscall (freebsd-riscv64), const BIOCROTZBUF ideal-int #53466
+pkg syscall (freebsd-riscv64), const BIOCSBLEN = 3221504614 #53466
+pkg syscall (freebsd-riscv64), const BIOCSBLEN ideal-int #53466
+pkg syscall (freebsd-riscv64), const BIOCSDIRECTION = 2147762807 #53466
+pkg syscall (freebsd-riscv64), const BIOCSDIRECTION ideal-int #53466
+pkg syscall (freebsd-riscv64), const BIOCSDLT = 2147762808 #53466
+pkg syscall (freebsd-riscv64), const BIOCSDLT ideal-int #53466
+pkg syscall (freebsd-riscv64), const BIOCSETBUFMODE = 2147762814 #53466
+pkg syscall (freebsd-riscv64), const BIOCSETBUFMODE ideal-int #53466
+pkg syscall (freebsd-riscv64), const BIOCSETF = 2148549223 #53466
+pkg syscall (freebsd-riscv64), const BIOCSETF ideal-int #53466
+pkg syscall (freebsd-riscv64), const BIOCSETFNR = 2148549250 #53466
+pkg syscall (freebsd-riscv64), const BIOCSETFNR ideal-int #53466
+pkg syscall (freebsd-riscv64), const BIOCSETIF = 2149597804 #53466
+pkg syscall (freebsd-riscv64), const BIOCSETIF ideal-int #53466
+pkg syscall (freebsd-riscv64), const BIOCSETWF = 2148549243 #53466
+pkg syscall (freebsd-riscv64), const BIOCSETWF ideal-int #53466
+pkg syscall (freebsd-riscv64), const BIOCSETZBUF = 2149073537 #53466
+pkg syscall (freebsd-riscv64), const BIOCSETZBUF ideal-int #53466
+pkg syscall (freebsd-riscv64), const BIOCSHDRCMPLT = 2147762805 #53466
+pkg syscall (freebsd-riscv64), const BIOCSHDRCMPLT ideal-int #53466
+pkg syscall (freebsd-riscv64), const BIOCSRSIG = 2147762803 #53466
+pkg syscall (freebsd-riscv64), const BIOCSRSIG ideal-int #53466
+pkg syscall (freebsd-riscv64), const BIOCSRTIMEOUT = 2148549229 #53466
+pkg syscall (freebsd-riscv64), const BIOCSRTIMEOUT ideal-int #53466
+pkg syscall (freebsd-riscv64), const BIOCSSEESENT = 2147762807 #53466
+pkg syscall (freebsd-riscv64), const BIOCSSEESENT ideal-int #53466
+pkg syscall (freebsd-riscv64), const BIOCSTSTAMP = 2147762820 #53466
+pkg syscall (freebsd-riscv64), const BIOCSTSTAMP ideal-int #53466
+pkg syscall (freebsd-riscv64), const BIOCVERSION = 1074020977 #53466
+pkg syscall (freebsd-riscv64), const BIOCVERSION ideal-int #53466
+pkg syscall (freebsd-riscv64), const BPF_A = 16 #53466
+pkg syscall (freebsd-riscv64), const BPF_A ideal-int #53466
+pkg syscall (freebsd-riscv64), const BPF_ABS = 32 #53466
+pkg syscall (freebsd-riscv64), const BPF_ABS ideal-int #53466
+pkg syscall (freebsd-riscv64), const BPF_ADD = 0 #53466
+pkg syscall (freebsd-riscv64), const BPF_ADD ideal-int #53466
+pkg syscall (freebsd-riscv64), const BPF_ALIGNMENT = 8 #53466
+pkg syscall (freebsd-riscv64), const BPF_ALIGNMENT ideal-int #53466
+pkg syscall (freebsd-riscv64), const BPF_ALU = 4 #53466
+pkg syscall (freebsd-riscv64), const BPF_ALU ideal-int #53466
+pkg syscall (freebsd-riscv64), const BPF_AND = 80 #53466
+pkg syscall (freebsd-riscv64), const BPF_AND ideal-int #53466
+pkg syscall (freebsd-riscv64), const BPF_B = 16 #53466
+pkg syscall (freebsd-riscv64), const BPF_B ideal-int #53466
+pkg syscall (freebsd-riscv64), const BPF_BUFMODE_BUFFER = 1 #53466
+pkg syscall (freebsd-riscv64), const BPF_BUFMODE_BUFFER ideal-int #53466
+pkg syscall (freebsd-riscv64), const BPF_BUFMODE_ZBUF = 2 #53466
+pkg syscall (freebsd-riscv64), const BPF_BUFMODE_ZBUF ideal-int #53466
+pkg syscall (freebsd-riscv64), const BPF_DIV = 48 #53466
+pkg syscall (freebsd-riscv64), const BPF_DIV ideal-int #53466
+pkg syscall (freebsd-riscv64), const BPF_H = 8 #53466
+pkg syscall (freebsd-riscv64), const BPF_H ideal-int #53466
+pkg syscall (freebsd-riscv64), const BPF_IMM = 0 #53466
+pkg syscall (freebsd-riscv64), const BPF_IMM ideal-int #53466
+pkg syscall (freebsd-riscv64), const BPF_IND = 64 #53466
+pkg syscall (freebsd-riscv64), const BPF_IND ideal-int #53466
+pkg syscall (freebsd-riscv64), const BPF_JA = 0 #53466
+pkg syscall (freebsd-riscv64), const BPF_JA ideal-int #53466
+pkg syscall (freebsd-riscv64), const BPF_JEQ = 16 #53466
+pkg syscall (freebsd-riscv64), const BPF_JEQ ideal-int #53466
+pkg syscall (freebsd-riscv64), const BPF_JGE = 48 #53466
+pkg syscall (freebsd-riscv64), const BPF_JGE ideal-int #53466
+pkg syscall (freebsd-riscv64), const BPF_JGT = 32 #53466
+pkg syscall (freebsd-riscv64), const BPF_JGT ideal-int #53466
+pkg syscall (freebsd-riscv64), const BPF_JMP = 5 #53466
+pkg syscall (freebsd-riscv64), const BPF_JMP ideal-int #53466
+pkg syscall (freebsd-riscv64), const BPF_JSET = 64 #53466
+pkg syscall (freebsd-riscv64), const BPF_JSET ideal-int #53466
+pkg syscall (freebsd-riscv64), const BPF_K = 0 #53466
+pkg syscall (freebsd-riscv64), const BPF_K ideal-int #53466
+pkg syscall (freebsd-riscv64), const BPF_LD = 0 #53466
+pkg syscall (freebsd-riscv64), const BPF_LD ideal-int #53466
+pkg syscall (freebsd-riscv64), const BPF_LDX = 1 #53466
+pkg syscall (freebsd-riscv64), const BPF_LDX ideal-int #53466
+pkg syscall (freebsd-riscv64), const BPF_LEN = 128 #53466
+pkg syscall (freebsd-riscv64), const BPF_LEN ideal-int #53466
+pkg syscall (freebsd-riscv64), const BPF_LSH = 96 #53466
+pkg syscall (freebsd-riscv64), const BPF_LSH ideal-int #53466
+pkg syscall (freebsd-riscv64), const BPF_MAJOR_VERSION = 1 #53466
+pkg syscall (freebsd-riscv64), const BPF_MAJOR_VERSION ideal-int #53466
+pkg syscall (freebsd-riscv64), const BPF_MAXBUFSIZE = 524288 #53466
+pkg syscall (freebsd-riscv64), const BPF_MAXBUFSIZE ideal-int #53466
+pkg syscall (freebsd-riscv64), const BPF_MAXINSNS = 512 #53466
+pkg syscall (freebsd-riscv64), const BPF_MAXINSNS ideal-int #53466
+pkg syscall (freebsd-riscv64), const BPF_MEM = 96 #53466
+pkg syscall (freebsd-riscv64), const BPF_MEM ideal-int #53466
+pkg syscall (freebsd-riscv64), const BPF_MEMWORDS = 16 #53466
+pkg syscall (freebsd-riscv64), const BPF_MEMWORDS ideal-int #53466
+pkg syscall (freebsd-riscv64), const BPF_MINBUFSIZE = 32 #53466
+pkg syscall (freebsd-riscv64), const BPF_MINBUFSIZE ideal-int #53466
+pkg syscall (freebsd-riscv64), const BPF_MINOR_VERSION = 1 #53466
+pkg syscall (freebsd-riscv64), const BPF_MINOR_VERSION ideal-int #53466
+pkg syscall (freebsd-riscv64), const BPF_MISC = 7 #53466
+pkg syscall (freebsd-riscv64), const BPF_MISC ideal-int #53466
+pkg syscall (freebsd-riscv64), const BPF_MSH = 160 #53466
+pkg syscall (freebsd-riscv64), const BPF_MSH ideal-int #53466
+pkg syscall (freebsd-riscv64), const BPF_MUL = 32 #53466
+pkg syscall (freebsd-riscv64), const BPF_MUL ideal-int #53466
+pkg syscall (freebsd-riscv64), const BPF_NEG = 128 #53466
+pkg syscall (freebsd-riscv64), const BPF_NEG ideal-int #53466
+pkg syscall (freebsd-riscv64), const BPF_OR = 64 #53466
+pkg syscall (freebsd-riscv64), const BPF_OR ideal-int #53466
+pkg syscall (freebsd-riscv64), const BPF_RELEASE = 199606 #53466
+pkg syscall (freebsd-riscv64), const BPF_RELEASE ideal-int #53466
+pkg syscall (freebsd-riscv64), const BPF_RET = 6 #53466
+pkg syscall (freebsd-riscv64), const BPF_RET ideal-int #53466
+pkg syscall (freebsd-riscv64), const BPF_RSH = 112 #53466
+pkg syscall (freebsd-riscv64), const BPF_RSH ideal-int #53466
+pkg syscall (freebsd-riscv64), const BPF_ST = 2 #53466
+pkg syscall (freebsd-riscv64), const BPF_ST ideal-int #53466
+pkg syscall (freebsd-riscv64), const BPF_STX = 3 #53466
+pkg syscall (freebsd-riscv64), const BPF_STX ideal-int #53466
+pkg syscall (freebsd-riscv64), const BPF_SUB = 16 #53466
+pkg syscall (freebsd-riscv64), const BPF_SUB ideal-int #53466
+pkg syscall (freebsd-riscv64), const BPF_TAX = 0 #53466
+pkg syscall (freebsd-riscv64), const BPF_TAX ideal-int #53466
+pkg syscall (freebsd-riscv64), const BPF_TXA = 128 #53466
+pkg syscall (freebsd-riscv64), const BPF_TXA ideal-int #53466
+pkg syscall (freebsd-riscv64), const BPF_T_BINTIME = 2 #53466
+pkg syscall (freebsd-riscv64), const BPF_T_BINTIME ideal-int #53466
+pkg syscall (freebsd-riscv64), const BPF_T_BINTIME_FAST = 258 #53466
+pkg syscall (freebsd-riscv64), const BPF_T_BINTIME_FAST ideal-int #53466
+pkg syscall (freebsd-riscv64), const BPF_T_BINTIME_MONOTONIC = 514 #53466
+pkg syscall (freebsd-riscv64), const BPF_T_BINTIME_MONOTONIC ideal-int #53466
+pkg syscall (freebsd-riscv64), const BPF_T_BINTIME_MONOTONIC_FAST = 770 #53466
+pkg syscall (freebsd-riscv64), const BPF_T_BINTIME_MONOTONIC_FAST ideal-int #53466
+pkg syscall (freebsd-riscv64), const BPF_T_FAST = 256 #53466
+pkg syscall (freebsd-riscv64), const BPF_T_FAST ideal-int #53466
+pkg syscall (freebsd-riscv64), const BPF_T_FLAG_MASK = 768 #53466
+pkg syscall (freebsd-riscv64), const BPF_T_FLAG_MASK ideal-int #53466
+pkg syscall (freebsd-riscv64), const BPF_T_FORMAT_MASK = 3 #53466
+pkg syscall (freebsd-riscv64), const BPF_T_FORMAT_MASK ideal-int #53466
+pkg syscall (freebsd-riscv64), const BPF_T_MICROTIME = 0 #53466
+pkg syscall (freebsd-riscv64), const BPF_T_MICROTIME ideal-int #53466
+pkg syscall (freebsd-riscv64), const BPF_T_MICROTIME_FAST = 256 #53466
+pkg syscall (freebsd-riscv64), const BPF_T_MICROTIME_FAST ideal-int #53466
+pkg syscall (freebsd-riscv64), const BPF_T_MICROTIME_MONOTONIC = 512 #53466
+pkg syscall (freebsd-riscv64), const BPF_T_MICROTIME_MONOTONIC ideal-int #53466
+pkg syscall (freebsd-riscv64), const BPF_T_MICROTIME_MONOTONIC_FAST = 768 #53466
+pkg syscall (freebsd-riscv64), const BPF_T_MICROTIME_MONOTONIC_FAST ideal-int #53466
+pkg syscall (freebsd-riscv64), const BPF_T_MONOTONIC = 512 #53466
+pkg syscall (freebsd-riscv64), const BPF_T_MONOTONIC ideal-int #53466
+pkg syscall (freebsd-riscv64), const BPF_T_MONOTONIC_FAST = 768 #53466
+pkg syscall (freebsd-riscv64), const BPF_T_MONOTONIC_FAST ideal-int #53466
+pkg syscall (freebsd-riscv64), const BPF_T_NANOTIME = 1 #53466
+pkg syscall (freebsd-riscv64), const BPF_T_NANOTIME ideal-int #53466
+pkg syscall (freebsd-riscv64), const BPF_T_NANOTIME_FAST = 257 #53466
+pkg syscall (freebsd-riscv64), const BPF_T_NANOTIME_FAST ideal-int #53466
+pkg syscall (freebsd-riscv64), const BPF_T_NANOTIME_MONOTONIC = 513 #53466
+pkg syscall (freebsd-riscv64), const BPF_T_NANOTIME_MONOTONIC ideal-int #53466
+pkg syscall (freebsd-riscv64), const BPF_T_NANOTIME_MONOTONIC_FAST = 769 #53466
+pkg syscall (freebsd-riscv64), const BPF_T_NANOTIME_MONOTONIC_FAST ideal-int #53466
+pkg syscall (freebsd-riscv64), const BPF_T_NONE = 3 #53466
+pkg syscall (freebsd-riscv64), const BPF_T_NONE ideal-int #53466
+pkg syscall (freebsd-riscv64), const BPF_T_NORMAL = 0 #53466
+pkg syscall (freebsd-riscv64), const BPF_T_NORMAL ideal-int #53466
+pkg syscall (freebsd-riscv64), const BPF_W = 0 #53466
+pkg syscall (freebsd-riscv64), const BPF_W ideal-int #53466
+pkg syscall (freebsd-riscv64), const BPF_X = 8 #53466
+pkg syscall (freebsd-riscv64), const BPF_X ideal-int #53466
+pkg syscall (freebsd-riscv64), const BRKINT = 2 #53466
+pkg syscall (freebsd-riscv64), const BRKINT ideal-int #53466
+pkg syscall (freebsd-riscv64), const CFLUSH = 15 #53466
+pkg syscall (freebsd-riscv64), const CFLUSH ideal-int #53466
+pkg syscall (freebsd-riscv64), const CLOCAL = 32768 #53466
+pkg syscall (freebsd-riscv64), const CLOCAL ideal-int #53466
+pkg syscall (freebsd-riscv64), const CREAD = 2048 #53466
+pkg syscall (freebsd-riscv64), const CREAD ideal-int #53466
+pkg syscall (freebsd-riscv64), const CS5 = 0 #53466
+pkg syscall (freebsd-riscv64), const CS5 ideal-int #53466
+pkg syscall (freebsd-riscv64), const CS6 = 256 #53466
+pkg syscall (freebsd-riscv64), const CS6 ideal-int #53466
+pkg syscall (freebsd-riscv64), const CS7 = 512 #53466
+pkg syscall (freebsd-riscv64), const CS7 ideal-int #53466
+pkg syscall (freebsd-riscv64), const CS8 = 768 #53466
+pkg syscall (freebsd-riscv64), const CS8 ideal-int #53466
+pkg syscall (freebsd-riscv64), const CSIZE = 768 #53466
+pkg syscall (freebsd-riscv64), const CSIZE ideal-int #53466
+pkg syscall (freebsd-riscv64), const CSTART = 17 #53466
+pkg syscall (freebsd-riscv64), const CSTART ideal-int #53466
+pkg syscall (freebsd-riscv64), const CSTATUS = 20 #53466
+pkg syscall (freebsd-riscv64), const CSTATUS ideal-int #53466
+pkg syscall (freebsd-riscv64), const CSTOP = 19 #53466
+pkg syscall (freebsd-riscv64), const CSTOP ideal-int #53466
+pkg syscall (freebsd-riscv64), const CSTOPB = 1024 #53466
+pkg syscall (freebsd-riscv64), const CSTOPB ideal-int #53466
+pkg syscall (freebsd-riscv64), const CSUSP = 26 #53466
+pkg syscall (freebsd-riscv64), const CSUSP ideal-int #53466
+pkg syscall (freebsd-riscv64), const CTL_MAXNAME = 24 #53466
+pkg syscall (freebsd-riscv64), const CTL_MAXNAME ideal-int #53466
+pkg syscall (freebsd-riscv64), const CTL_NET = 4 #53466
+pkg syscall (freebsd-riscv64), const CTL_NET ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_A429 = 184 #53466
+pkg syscall (freebsd-riscv64), const DLT_A429 ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_A653_ICM = 185 #53466
+pkg syscall (freebsd-riscv64), const DLT_A653_ICM ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_AIRONET_HEADER = 120 #53466
+pkg syscall (freebsd-riscv64), const DLT_AIRONET_HEADER ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_AOS = 222 #53466
+pkg syscall (freebsd-riscv64), const DLT_AOS ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_APPLE_IP_OVER_IEEE1394 = 138 #53466
+pkg syscall (freebsd-riscv64), const DLT_APPLE_IP_OVER_IEEE1394 ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_ARCNET = 7 #53466
+pkg syscall (freebsd-riscv64), const DLT_ARCNET ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_ARCNET_LINUX = 129 #53466
+pkg syscall (freebsd-riscv64), const DLT_ARCNET_LINUX ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_ATM_CLIP = 19 #53466
+pkg syscall (freebsd-riscv64), const DLT_ATM_CLIP ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_ATM_RFC1483 = 11 #53466
+pkg syscall (freebsd-riscv64), const DLT_ATM_RFC1483 ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_AURORA = 126 #53466
+pkg syscall (freebsd-riscv64), const DLT_AURORA ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_AX25 = 3 #53466
+pkg syscall (freebsd-riscv64), const DLT_AX25 ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_AX25_KISS = 202 #53466
+pkg syscall (freebsd-riscv64), const DLT_AX25_KISS ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_BACNET_MS_TP = 165 #53466
+pkg syscall (freebsd-riscv64), const DLT_BACNET_MS_TP ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_BLUETOOTH_HCI_H4 = 187 #53466
+pkg syscall (freebsd-riscv64), const DLT_BLUETOOTH_HCI_H4 ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 201 #53466
+pkg syscall (freebsd-riscv64), const DLT_BLUETOOTH_HCI_H4_WITH_PHDR ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_CAN20B = 190 #53466
+pkg syscall (freebsd-riscv64), const DLT_CAN20B ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_CAN_SOCKETCAN = 227 #53466
+pkg syscall (freebsd-riscv64), const DLT_CAN_SOCKETCAN ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_CHAOS = 5 #53466
+pkg syscall (freebsd-riscv64), const DLT_CHAOS ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_CHDLC = 104 #53466
+pkg syscall (freebsd-riscv64), const DLT_CHDLC ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_CISCO_IOS = 118 #53466
+pkg syscall (freebsd-riscv64), const DLT_CISCO_IOS ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_C_HDLC = 104 #53466
+pkg syscall (freebsd-riscv64), const DLT_C_HDLC ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_C_HDLC_WITH_DIR = 205 #53466
+pkg syscall (freebsd-riscv64), const DLT_C_HDLC_WITH_DIR ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_DBUS = 231 #53466
+pkg syscall (freebsd-riscv64), const DLT_DBUS ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_DECT = 221 #53466
+pkg syscall (freebsd-riscv64), const DLT_DECT ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_DOCSIS = 143 #53466
+pkg syscall (freebsd-riscv64), const DLT_DOCSIS ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_DVB_CI = 235 #53466
+pkg syscall (freebsd-riscv64), const DLT_DVB_CI ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_ECONET = 115 #53466
+pkg syscall (freebsd-riscv64), const DLT_ECONET ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_EN10MB = 1 #53466
+pkg syscall (freebsd-riscv64), const DLT_EN10MB ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_EN3MB = 2 #53466
+pkg syscall (freebsd-riscv64), const DLT_EN3MB ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_ENC = 109 #53466
+pkg syscall (freebsd-riscv64), const DLT_ENC ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_ERF = 197 #53466
+pkg syscall (freebsd-riscv64), const DLT_ERF ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_ERF_ETH = 175 #53466
+pkg syscall (freebsd-riscv64), const DLT_ERF_ETH ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_ERF_POS = 176 #53466
+pkg syscall (freebsd-riscv64), const DLT_ERF_POS ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_FC_2 = 224 #53466
+pkg syscall (freebsd-riscv64), const DLT_FC_2 ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_FC_2_WITH_FRAME_DELIMS = 225 #53466
+pkg syscall (freebsd-riscv64), const DLT_FC_2_WITH_FRAME_DELIMS ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_FDDI = 10 #53466
+pkg syscall (freebsd-riscv64), const DLT_FDDI ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_FLEXRAY = 210 #53466
+pkg syscall (freebsd-riscv64), const DLT_FLEXRAY ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_FRELAY = 107 #53466
+pkg syscall (freebsd-riscv64), const DLT_FRELAY ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_FRELAY_WITH_DIR = 206 #53466
+pkg syscall (freebsd-riscv64), const DLT_FRELAY_WITH_DIR ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_GCOM_SERIAL = 173 #53466
+pkg syscall (freebsd-riscv64), const DLT_GCOM_SERIAL ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_GCOM_T1E1 = 172 #53466
+pkg syscall (freebsd-riscv64), const DLT_GCOM_T1E1 ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_GPF_F = 171 #53466
+pkg syscall (freebsd-riscv64), const DLT_GPF_F ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_GPF_T = 170 #53466
+pkg syscall (freebsd-riscv64), const DLT_GPF_T ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_GPRS_LLC = 169 #53466
+pkg syscall (freebsd-riscv64), const DLT_GPRS_LLC ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_GSMTAP_ABIS = 218 #53466
+pkg syscall (freebsd-riscv64), const DLT_GSMTAP_ABIS ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_GSMTAP_UM = 217 #53466
+pkg syscall (freebsd-riscv64), const DLT_GSMTAP_UM ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_HHDLC = 121 #53466
+pkg syscall (freebsd-riscv64), const DLT_HHDLC ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_IBM_SN = 146 #53466
+pkg syscall (freebsd-riscv64), const DLT_IBM_SN ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_IBM_SP = 145 #53466
+pkg syscall (freebsd-riscv64), const DLT_IBM_SP ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_IEEE802 = 6 #53466
+pkg syscall (freebsd-riscv64), const DLT_IEEE802 ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_IEEE802_11 = 105 #53466
+pkg syscall (freebsd-riscv64), const DLT_IEEE802_11 ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_IEEE802_11_RADIO = 127 #53466
+pkg syscall (freebsd-riscv64), const DLT_IEEE802_11_RADIO ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_IEEE802_11_RADIO_AVS = 163 #53466
+pkg syscall (freebsd-riscv64), const DLT_IEEE802_11_RADIO_AVS ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_IEEE802_15_4 = 195 #53466
+pkg syscall (freebsd-riscv64), const DLT_IEEE802_15_4 ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_IEEE802_15_4_LINUX = 191 #53466
+pkg syscall (freebsd-riscv64), const DLT_IEEE802_15_4_LINUX ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_IEEE802_15_4_NOFCS = 230 #53466
+pkg syscall (freebsd-riscv64), const DLT_IEEE802_15_4_NOFCS ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_IEEE802_15_4_NONASK_PHY = 215 #53466
+pkg syscall (freebsd-riscv64), const DLT_IEEE802_15_4_NONASK_PHY ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_IEEE802_16_MAC_CPS = 188 #53466
+pkg syscall (freebsd-riscv64), const DLT_IEEE802_16_MAC_CPS ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_IEEE802_16_MAC_CPS_RADIO = 193 #53466
+pkg syscall (freebsd-riscv64), const DLT_IEEE802_16_MAC_CPS_RADIO ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_IPFILTER = 116 #53466
+pkg syscall (freebsd-riscv64), const DLT_IPFILTER ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_IPMB = 199 #53466
+pkg syscall (freebsd-riscv64), const DLT_IPMB ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_IPMB_LINUX = 209 #53466
+pkg syscall (freebsd-riscv64), const DLT_IPMB_LINUX ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_IPNET = 226 #53466
+pkg syscall (freebsd-riscv64), const DLT_IPNET ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_IPOIB = 242 #53466
+pkg syscall (freebsd-riscv64), const DLT_IPOIB ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_IPV4 = 228 #53466
+pkg syscall (freebsd-riscv64), const DLT_IPV4 ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_IPV6 = 229 #53466
+pkg syscall (freebsd-riscv64), const DLT_IPV6 ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_IP_OVER_FC = 122 #53466
+pkg syscall (freebsd-riscv64), const DLT_IP_OVER_FC ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_JUNIPER_ATM1 = 137 #53466
+pkg syscall (freebsd-riscv64), const DLT_JUNIPER_ATM1 ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_JUNIPER_ATM2 = 135 #53466
+pkg syscall (freebsd-riscv64), const DLT_JUNIPER_ATM2 ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_JUNIPER_ATM_CEMIC = 238 #53466
+pkg syscall (freebsd-riscv64), const DLT_JUNIPER_ATM_CEMIC ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_JUNIPER_CHDLC = 181 #53466
+pkg syscall (freebsd-riscv64), const DLT_JUNIPER_CHDLC ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_JUNIPER_ES = 132 #53466
+pkg syscall (freebsd-riscv64), const DLT_JUNIPER_ES ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_JUNIPER_ETHER = 178 #53466
+pkg syscall (freebsd-riscv64), const DLT_JUNIPER_ETHER ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_JUNIPER_FIBRECHANNEL = 234 #53466
+pkg syscall (freebsd-riscv64), const DLT_JUNIPER_FIBRECHANNEL ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_JUNIPER_FRELAY = 180 #53466
+pkg syscall (freebsd-riscv64), const DLT_JUNIPER_FRELAY ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_JUNIPER_GGSN = 133 #53466
+pkg syscall (freebsd-riscv64), const DLT_JUNIPER_GGSN ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_JUNIPER_ISM = 194 #53466
+pkg syscall (freebsd-riscv64), const DLT_JUNIPER_ISM ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_JUNIPER_MFR = 134 #53466
+pkg syscall (freebsd-riscv64), const DLT_JUNIPER_MFR ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_JUNIPER_MLFR = 131 #53466
+pkg syscall (freebsd-riscv64), const DLT_JUNIPER_MLFR ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_JUNIPER_MLPPP = 130 #53466
+pkg syscall (freebsd-riscv64), const DLT_JUNIPER_MLPPP ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_JUNIPER_MONITOR = 164 #53466
+pkg syscall (freebsd-riscv64), const DLT_JUNIPER_MONITOR ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_JUNIPER_PIC_PEER = 174 #53466
+pkg syscall (freebsd-riscv64), const DLT_JUNIPER_PIC_PEER ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_JUNIPER_PPP = 179 #53466
+pkg syscall (freebsd-riscv64), const DLT_JUNIPER_PPP ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_JUNIPER_PPPOE = 167 #53466
+pkg syscall (freebsd-riscv64), const DLT_JUNIPER_PPPOE ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_JUNIPER_PPPOE_ATM = 168 #53466
+pkg syscall (freebsd-riscv64), const DLT_JUNIPER_PPPOE_ATM ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_JUNIPER_SERVICES = 136 #53466
+pkg syscall (freebsd-riscv64), const DLT_JUNIPER_SERVICES ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_JUNIPER_SRX_E2E = 233 #53466
+pkg syscall (freebsd-riscv64), const DLT_JUNIPER_SRX_E2E ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_JUNIPER_ST = 200 #53466
+pkg syscall (freebsd-riscv64), const DLT_JUNIPER_ST ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_JUNIPER_VP = 183 #53466
+pkg syscall (freebsd-riscv64), const DLT_JUNIPER_VP ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_JUNIPER_VS = 232 #53466
+pkg syscall (freebsd-riscv64), const DLT_JUNIPER_VS ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_LAPB_WITH_DIR = 207 #53466
+pkg syscall (freebsd-riscv64), const DLT_LAPB_WITH_DIR ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_LAPD = 203 #53466
+pkg syscall (freebsd-riscv64), const DLT_LAPD ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_LIN = 212 #53466
+pkg syscall (freebsd-riscv64), const DLT_LIN ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_LINUX_EVDEV = 216 #53466
+pkg syscall (freebsd-riscv64), const DLT_LINUX_EVDEV ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_LINUX_IRDA = 144 #53466
+pkg syscall (freebsd-riscv64), const DLT_LINUX_IRDA ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_LINUX_LAPD = 177 #53466
+pkg syscall (freebsd-riscv64), const DLT_LINUX_LAPD ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_LINUX_PPP_WITHDIRECTION = 166 #53466
+pkg syscall (freebsd-riscv64), const DLT_LINUX_PPP_WITHDIRECTION ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_LINUX_SLL = 113 #53466
+pkg syscall (freebsd-riscv64), const DLT_LINUX_SLL ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_LOOP = 108 #53466
+pkg syscall (freebsd-riscv64), const DLT_LOOP ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_LTALK = 114 #53466
+pkg syscall (freebsd-riscv64), const DLT_LTALK ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_MATCHING_MAX = 246 #53466
+pkg syscall (freebsd-riscv64), const DLT_MATCHING_MAX ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_MATCHING_MIN = 104 #53466
+pkg syscall (freebsd-riscv64), const DLT_MATCHING_MIN ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_MFR = 182 #53466
+pkg syscall (freebsd-riscv64), const DLT_MFR ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_MOST = 211 #53466
+pkg syscall (freebsd-riscv64), const DLT_MOST ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_MPEG_2_TS = 243 #53466
+pkg syscall (freebsd-riscv64), const DLT_MPEG_2_TS ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_MPLS = 219 #53466
+pkg syscall (freebsd-riscv64), const DLT_MPLS ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_MTP2 = 140 #53466
+pkg syscall (freebsd-riscv64), const DLT_MTP2 ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_MTP2_WITH_PHDR = 139 #53466
+pkg syscall (freebsd-riscv64), const DLT_MTP2_WITH_PHDR ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_MTP3 = 141 #53466
+pkg syscall (freebsd-riscv64), const DLT_MTP3 ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_MUX27010 = 236 #53466
+pkg syscall (freebsd-riscv64), const DLT_MUX27010 ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_NETANALYZER = 240 #53466
+pkg syscall (freebsd-riscv64), const DLT_NETANALYZER ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_NETANALYZER_TRANSPARENT = 241 #53466
+pkg syscall (freebsd-riscv64), const DLT_NETANALYZER_TRANSPARENT ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_NFC_LLCP = 245 #53466
+pkg syscall (freebsd-riscv64), const DLT_NFC_LLCP ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_NFLOG = 239 #53466
+pkg syscall (freebsd-riscv64), const DLT_NFLOG ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_NG40 = 244 #53466
+pkg syscall (freebsd-riscv64), const DLT_NG40 ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_NULL = 0 #53466
+pkg syscall (freebsd-riscv64), const DLT_NULL ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_PCI_EXP = 125 #53466
+pkg syscall (freebsd-riscv64), const DLT_PCI_EXP ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_PFLOG = 117 #53466
+pkg syscall (freebsd-riscv64), const DLT_PFLOG ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_PFSYNC = 121 #53466
+pkg syscall (freebsd-riscv64), const DLT_PFSYNC ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_PPI = 192 #53466
+pkg syscall (freebsd-riscv64), const DLT_PPI ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_PPP = 9 #53466
+pkg syscall (freebsd-riscv64), const DLT_PPP ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_PPP_BSDOS = 16 #53466
+pkg syscall (freebsd-riscv64), const DLT_PPP_BSDOS ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_PPP_ETHER = 51 #53466
+pkg syscall (freebsd-riscv64), const DLT_PPP_ETHER ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_PPP_PPPD = 166 #53466
+pkg syscall (freebsd-riscv64), const DLT_PPP_PPPD ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_PPP_SERIAL = 50 #53466
+pkg syscall (freebsd-riscv64), const DLT_PPP_SERIAL ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_PPP_WITH_DIR = 204 #53466
+pkg syscall (freebsd-riscv64), const DLT_PPP_WITH_DIR ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_PPP_WITH_DIRECTION = 166 #53466
+pkg syscall (freebsd-riscv64), const DLT_PPP_WITH_DIRECTION ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_PRISM_HEADER = 119 #53466
+pkg syscall (freebsd-riscv64), const DLT_PRISM_HEADER ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_PRONET = 4 #53466
+pkg syscall (freebsd-riscv64), const DLT_PRONET ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_RAIF1 = 198 #53466
+pkg syscall (freebsd-riscv64), const DLT_RAIF1 ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_RAW = 12 #53466
+pkg syscall (freebsd-riscv64), const DLT_RAW ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_RIO = 124 #53466
+pkg syscall (freebsd-riscv64), const DLT_RIO ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_SCCP = 142 #53466
+pkg syscall (freebsd-riscv64), const DLT_SCCP ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_SITA = 196 #53466
+pkg syscall (freebsd-riscv64), const DLT_SITA ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_SLIP = 8 #53466
+pkg syscall (freebsd-riscv64), const DLT_SLIP ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_SLIP_BSDOS = 15 #53466
+pkg syscall (freebsd-riscv64), const DLT_SLIP_BSDOS ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_STANAG_5066_D_PDU = 237 #53466
+pkg syscall (freebsd-riscv64), const DLT_STANAG_5066_D_PDU ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_SUNATM = 123 #53466
+pkg syscall (freebsd-riscv64), const DLT_SUNATM ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_SYMANTEC_FIREWALL = 99 #53466
+pkg syscall (freebsd-riscv64), const DLT_SYMANTEC_FIREWALL ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_TZSP = 128 #53466
+pkg syscall (freebsd-riscv64), const DLT_TZSP ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_USB = 186 #53466
+pkg syscall (freebsd-riscv64), const DLT_USB ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_USB_LINUX = 189 #53466
+pkg syscall (freebsd-riscv64), const DLT_USB_LINUX ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_USB_LINUX_MMAPPED = 220 #53466
+pkg syscall (freebsd-riscv64), const DLT_USB_LINUX_MMAPPED ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_USER0 = 147 #53466
+pkg syscall (freebsd-riscv64), const DLT_USER0 ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_USER1 = 148 #53466
+pkg syscall (freebsd-riscv64), const DLT_USER1 ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_USER10 = 157 #53466
+pkg syscall (freebsd-riscv64), const DLT_USER10 ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_USER11 = 158 #53466
+pkg syscall (freebsd-riscv64), const DLT_USER11 ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_USER12 = 159 #53466
+pkg syscall (freebsd-riscv64), const DLT_USER12 ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_USER13 = 160 #53466
+pkg syscall (freebsd-riscv64), const DLT_USER13 ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_USER14 = 161 #53466
+pkg syscall (freebsd-riscv64), const DLT_USER14 ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_USER15 = 162 #53466
+pkg syscall (freebsd-riscv64), const DLT_USER15 ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_USER2 = 149 #53466
+pkg syscall (freebsd-riscv64), const DLT_USER2 ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_USER3 = 150 #53466
+pkg syscall (freebsd-riscv64), const DLT_USER3 ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_USER4 = 151 #53466
+pkg syscall (freebsd-riscv64), const DLT_USER4 ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_USER5 = 152 #53466
+pkg syscall (freebsd-riscv64), const DLT_USER5 ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_USER6 = 153 #53466
+pkg syscall (freebsd-riscv64), const DLT_USER6 ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_USER7 = 154 #53466
+pkg syscall (freebsd-riscv64), const DLT_USER7 ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_USER8 = 155 #53466
+pkg syscall (freebsd-riscv64), const DLT_USER8 ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_USER9 = 156 #53466
+pkg syscall (freebsd-riscv64), const DLT_USER9 ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_WIHART = 223 #53466
+pkg syscall (freebsd-riscv64), const DLT_WIHART ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_X2E_SERIAL = 213 #53466
+pkg syscall (freebsd-riscv64), const DLT_X2E_SERIAL ideal-int #53466
+pkg syscall (freebsd-riscv64), const DLT_X2E_XORAYA = 214 #53466
+pkg syscall (freebsd-riscv64), const DLT_X2E_XORAYA ideal-int #53466
+pkg syscall (freebsd-riscv64), const DT_BLK = 6 #53466
+pkg syscall (freebsd-riscv64), const DT_BLK ideal-int #53466
+pkg syscall (freebsd-riscv64), const DT_CHR = 2 #53466
+pkg syscall (freebsd-riscv64), const DT_CHR ideal-int #53466
+pkg syscall (freebsd-riscv64), const DT_DIR = 4 #53466
+pkg syscall (freebsd-riscv64), const DT_DIR ideal-int #53466
+pkg syscall (freebsd-riscv64), const DT_FIFO = 1 #53466
+pkg syscall (freebsd-riscv64), const DT_FIFO ideal-int #53466
+pkg syscall (freebsd-riscv64), const DT_LNK = 10 #53466
+pkg syscall (freebsd-riscv64), const DT_LNK ideal-int #53466
+pkg syscall (freebsd-riscv64), const DT_REG = 8 #53466
+pkg syscall (freebsd-riscv64), const DT_REG ideal-int #53466
+pkg syscall (freebsd-riscv64), const DT_SOCK = 12 #53466
+pkg syscall (freebsd-riscv64), const DT_SOCK ideal-int #53466
+pkg syscall (freebsd-riscv64), const DT_UNKNOWN = 0 #53466
+pkg syscall (freebsd-riscv64), const DT_UNKNOWN ideal-int #53466
+pkg syscall (freebsd-riscv64), const DT_WHT = 14 #53466
+pkg syscall (freebsd-riscv64), const DT_WHT ideal-int #53466
+pkg syscall (freebsd-riscv64), const E2BIG = 7 #53466
+pkg syscall (freebsd-riscv64), const EACCES = 13 #53466
+pkg syscall (freebsd-riscv64), const EADDRINUSE = 48 #53466
+pkg syscall (freebsd-riscv64), const EADDRNOTAVAIL = 49 #53466
+pkg syscall (freebsd-riscv64), const EAFNOSUPPORT = 47 #53466
+pkg syscall (freebsd-riscv64), const EAGAIN = 35 #53466
+pkg syscall (freebsd-riscv64), const EALREADY = 37 #53466
+pkg syscall (freebsd-riscv64), const EAUTH = 80 #53466
+pkg syscall (freebsd-riscv64), const EAUTH Errno #53466
+pkg syscall (freebsd-riscv64), const EBADF = 9 #53466
+pkg syscall (freebsd-riscv64), const EBADMSG = 89 #53466
+pkg syscall (freebsd-riscv64), const EBADMSG Errno #53466
+pkg syscall (freebsd-riscv64), const EBADRPC = 72 #53466
+pkg syscall (freebsd-riscv64), const EBADRPC Errno #53466
+pkg syscall (freebsd-riscv64), const EBUSY = 16 #53466
+pkg syscall (freebsd-riscv64), const ECANCELED = 85 #53466
+pkg syscall (freebsd-riscv64), const ECAPMODE = 94 #53466
+pkg syscall (freebsd-riscv64), const ECAPMODE Errno #53466
+pkg syscall (freebsd-riscv64), const ECHILD = 10 #53466
+pkg syscall (freebsd-riscv64), const ECHO = 8 #53466
+pkg syscall (freebsd-riscv64), const ECHO ideal-int #53466
+pkg syscall (freebsd-riscv64), const ECHOCTL = 64 #53466
+pkg syscall (freebsd-riscv64), const ECHOCTL ideal-int #53466
+pkg syscall (freebsd-riscv64), const ECHOE = 2 #53466
+pkg syscall (freebsd-riscv64), const ECHOE ideal-int #53466
+pkg syscall (freebsd-riscv64), const ECHOK = 4 #53466
+pkg syscall (freebsd-riscv64), const ECHOK ideal-int #53466
+pkg syscall (freebsd-riscv64), const ECHOKE = 1 #53466
+pkg syscall (freebsd-riscv64), const ECHOKE ideal-int #53466
+pkg syscall (freebsd-riscv64), const ECHONL = 16 #53466
+pkg syscall (freebsd-riscv64), const ECHONL ideal-int #53466
+pkg syscall (freebsd-riscv64), const ECHOPRT = 32 #53466
+pkg syscall (freebsd-riscv64), const ECHOPRT ideal-int #53466
+pkg syscall (freebsd-riscv64), const ECONNABORTED = 53 #53466
+pkg syscall (freebsd-riscv64), const ECONNREFUSED = 61 #53466
+pkg syscall (freebsd-riscv64), const ECONNRESET = 54 #53466
+pkg syscall (freebsd-riscv64), const EDEADLK = 11 #53466
+pkg syscall (freebsd-riscv64), const EDESTADDRREQ = 39 #53466
+pkg syscall (freebsd-riscv64), const EDOM = 33 #53466
+pkg syscall (freebsd-riscv64), const EDOOFUS = 88 #53466
+pkg syscall (freebsd-riscv64), const EDOOFUS Errno #53466
+pkg syscall (freebsd-riscv64), const EDQUOT = 69 #53466
+pkg syscall (freebsd-riscv64), const EEXIST = 17 #53466
+pkg syscall (freebsd-riscv64), const EFAULT = 14 #53466
+pkg syscall (freebsd-riscv64), const EFBIG = 27 #53466
+pkg syscall (freebsd-riscv64), const EFTYPE = 79 #53466
+pkg syscall (freebsd-riscv64), const EFTYPE Errno #53466
+pkg syscall (freebsd-riscv64), const EHOSTDOWN = 64 #53466
+pkg syscall (freebsd-riscv64), const EHOSTUNREACH = 65 #53466
+pkg syscall (freebsd-riscv64), const EIDRM = 82 #53466
+pkg syscall (freebsd-riscv64), const EILSEQ = 86 #53466
+pkg syscall (freebsd-riscv64), const EINPROGRESS = 36 #53466
+pkg syscall (freebsd-riscv64), const EINTR = 4 #53466
+pkg syscall (freebsd-riscv64), const EINVAL = 22 #53466
+pkg syscall (freebsd-riscv64), const EIO = 5 #53466
+pkg syscall (freebsd-riscv64), const EISCONN = 56 #53466
+pkg syscall (freebsd-riscv64), const EISDIR = 21 #53466
+pkg syscall (freebsd-riscv64), const ELAST = 96 #53466
+pkg syscall (freebsd-riscv64), const ELAST Errno #53466
+pkg syscall (freebsd-riscv64), const ELOOP = 62 #53466
+pkg syscall (freebsd-riscv64), const EMFILE = 24 #53466
+pkg syscall (freebsd-riscv64), const EMLINK = 31 #53466
+pkg syscall (freebsd-riscv64), const EMSGSIZE = 40 #53466
+pkg syscall (freebsd-riscv64), const EMULTIHOP = 90 #53466
+pkg syscall (freebsd-riscv64), const EMULTIHOP Errno #53466
+pkg syscall (freebsd-riscv64), const ENAMETOOLONG = 63 #53466
+pkg syscall (freebsd-riscv64), const ENEEDAUTH = 81 #53466
+pkg syscall (freebsd-riscv64), const ENEEDAUTH Errno #53466
+pkg syscall (freebsd-riscv64), const ENETDOWN = 50 #53466
+pkg syscall (freebsd-riscv64), const ENETRESET = 52 #53466
+pkg syscall (freebsd-riscv64), const ENETUNREACH = 51 #53466
+pkg syscall (freebsd-riscv64), const ENFILE = 23 #53466
+pkg syscall (freebsd-riscv64), const ENOATTR = 87 #53466
+pkg syscall (freebsd-riscv64), const ENOATTR Errno #53466
+pkg syscall (freebsd-riscv64), const ENOBUFS = 55 #53466
+pkg syscall (freebsd-riscv64), const ENODEV = 19 #53466
+pkg syscall (freebsd-riscv64), const ENOEXEC = 8 #53466
+pkg syscall (freebsd-riscv64), const ENOLCK = 77 #53466
+pkg syscall (freebsd-riscv64), const ENOLINK = 91 #53466
+pkg syscall (freebsd-riscv64), const ENOLINK Errno #53466
+pkg syscall (freebsd-riscv64), const ENOMEM = 12 #53466
+pkg syscall (freebsd-riscv64), const ENOMSG = 83 #53466
+pkg syscall (freebsd-riscv64), const ENOPROTOOPT = 42 #53466
+pkg syscall (freebsd-riscv64), const ENOSPC = 28 #53466
+pkg syscall (freebsd-riscv64), const ENOSYS = 78 #53466
+pkg syscall (freebsd-riscv64), const ENOTBLK = 15 #53466
+pkg syscall (freebsd-riscv64), const ENOTCAPABLE = 93 #53466
+pkg syscall (freebsd-riscv64), const ENOTCAPABLE Errno #53466
+pkg syscall (freebsd-riscv64), const ENOTCONN = 57 #53466
+pkg syscall (freebsd-riscv64), const ENOTDIR = 20 #53466
+pkg syscall (freebsd-riscv64), const ENOTEMPTY = 66 #53466
+pkg syscall (freebsd-riscv64), const ENOTRECOVERABLE = 95 #53466
+pkg syscall (freebsd-riscv64), const ENOTRECOVERABLE Errno #53466
+pkg syscall (freebsd-riscv64), const ENOTSOCK = 38 #53466
+pkg syscall (freebsd-riscv64), const ENOTSUP = 45 #53466
+pkg syscall (freebsd-riscv64), const ENOTTY = 25 #53466
+pkg syscall (freebsd-riscv64), const ENXIO = 6 #53466
+pkg syscall (freebsd-riscv64), const EOPNOTSUPP = 45 #53466
+pkg syscall (freebsd-riscv64), const EOVERFLOW = 84 #53466
+pkg syscall (freebsd-riscv64), const EOWNERDEAD = 96 #53466
+pkg syscall (freebsd-riscv64), const EOWNERDEAD Errno #53466
+pkg syscall (freebsd-riscv64), const EPERM = 1 #53466
+pkg syscall (freebsd-riscv64), const EPFNOSUPPORT = 46 #53466
+pkg syscall (freebsd-riscv64), const EPIPE = 32 #53466
+pkg syscall (freebsd-riscv64), const EPROCLIM = 67 #53466
+pkg syscall (freebsd-riscv64), const EPROCLIM Errno #53466
+pkg syscall (freebsd-riscv64), const EPROCUNAVAIL = 76 #53466
+pkg syscall (freebsd-riscv64), const EPROCUNAVAIL Errno #53466
+pkg syscall (freebsd-riscv64), const EPROGMISMATCH = 75 #53466
+pkg syscall (freebsd-riscv64), const EPROGMISMATCH Errno #53466
+pkg syscall (freebsd-riscv64), const EPROGUNAVAIL = 74 #53466
+pkg syscall (freebsd-riscv64), const EPROGUNAVAIL Errno #53466
+pkg syscall (freebsd-riscv64), const EPROTO = 92 #53466
+pkg syscall (freebsd-riscv64), const EPROTO Errno #53466
+pkg syscall (freebsd-riscv64), const EPROTONOSUPPORT = 43 #53466
+pkg syscall (freebsd-riscv64), const EPROTOTYPE = 41 #53466
+pkg syscall (freebsd-riscv64), const ERANGE = 34 #53466
+pkg syscall (freebsd-riscv64), const EREMOTE = 71 #53466
+pkg syscall (freebsd-riscv64), const EROFS = 30 #53466
+pkg syscall (freebsd-riscv64), const ERPCMISMATCH = 73 #53466
+pkg syscall (freebsd-riscv64), const ERPCMISMATCH Errno #53466
+pkg syscall (freebsd-riscv64), const ESHUTDOWN = 58 #53466
+pkg syscall (freebsd-riscv64), const ESOCKTNOSUPPORT = 44 #53466
+pkg syscall (freebsd-riscv64), const ESPIPE = 29 #53466
+pkg syscall (freebsd-riscv64), const ESRCH = 3 #53466
+pkg syscall (freebsd-riscv64), const ESTALE = 70 #53466
+pkg syscall (freebsd-riscv64), const ETIMEDOUT = 60 #53466
+pkg syscall (freebsd-riscv64), const ETOOMANYREFS = 59 #53466
+pkg syscall (freebsd-riscv64), const ETXTBSY = 26 #53466
+pkg syscall (freebsd-riscv64), const EUSERS = 68 #53466
+pkg syscall (freebsd-riscv64), const EVFILT_AIO = -3 #53466
+pkg syscall (freebsd-riscv64), const EVFILT_AIO ideal-int #53466
+pkg syscall (freebsd-riscv64), const EVFILT_FS = -9 #53466
+pkg syscall (freebsd-riscv64), const EVFILT_FS ideal-int #53466
+pkg syscall (freebsd-riscv64), const EVFILT_LIO = -10 #53466
+pkg syscall (freebsd-riscv64), const EVFILT_LIO ideal-int #53466
+pkg syscall (freebsd-riscv64), const EVFILT_PROC = -5 #53466
+pkg syscall (freebsd-riscv64), const EVFILT_PROC ideal-int #53466
+pkg syscall (freebsd-riscv64), const EVFILT_READ = -1 #53466
+pkg syscall (freebsd-riscv64), const EVFILT_READ ideal-int #53466
+pkg syscall (freebsd-riscv64), const EVFILT_SIGNAL = -6 #53466
+pkg syscall (freebsd-riscv64), const EVFILT_SIGNAL ideal-int #53466
+pkg syscall (freebsd-riscv64), const EVFILT_SYSCOUNT = 11 #53466
+pkg syscall (freebsd-riscv64), const EVFILT_SYSCOUNT ideal-int #53466
+pkg syscall (freebsd-riscv64), const EVFILT_TIMER = -7 #53466
+pkg syscall (freebsd-riscv64), const EVFILT_TIMER ideal-int #53466
+pkg syscall (freebsd-riscv64), const EVFILT_USER = -11 #53466
+pkg syscall (freebsd-riscv64), const EVFILT_USER ideal-int #53466
+pkg syscall (freebsd-riscv64), const EVFILT_VNODE = -4 #53466
+pkg syscall (freebsd-riscv64), const EVFILT_VNODE ideal-int #53466
+pkg syscall (freebsd-riscv64), const EVFILT_WRITE = -2 #53466
+pkg syscall (freebsd-riscv64), const EVFILT_WRITE ideal-int #53466
+pkg syscall (freebsd-riscv64), const EV_ADD = 1 #53466
+pkg syscall (freebsd-riscv64), const EV_ADD ideal-int #53466
+pkg syscall (freebsd-riscv64), const EV_CLEAR = 32 #53466
+pkg syscall (freebsd-riscv64), const EV_CLEAR ideal-int #53466
+pkg syscall (freebsd-riscv64), const EV_DELETE = 2 #53466
+pkg syscall (freebsd-riscv64), const EV_DELETE ideal-int #53466
+pkg syscall (freebsd-riscv64), const EV_DISABLE = 8 #53466
+pkg syscall (freebsd-riscv64), const EV_DISABLE ideal-int #53466
+pkg syscall (freebsd-riscv64), const EV_DISPATCH = 128 #53466
+pkg syscall (freebsd-riscv64), const EV_DISPATCH ideal-int #53466
+pkg syscall (freebsd-riscv64), const EV_DROP = 4096 #53466
+pkg syscall (freebsd-riscv64), const EV_DROP ideal-int #53466
+pkg syscall (freebsd-riscv64), const EV_ENABLE = 4 #53466
+pkg syscall (freebsd-riscv64), const EV_ENABLE ideal-int #53466
+pkg syscall (freebsd-riscv64), const EV_EOF = 32768 #53466
+pkg syscall (freebsd-riscv64), const EV_EOF ideal-int #53466
+pkg syscall (freebsd-riscv64), const EV_ERROR = 16384 #53466
+pkg syscall (freebsd-riscv64), const EV_ERROR ideal-int #53466
+pkg syscall (freebsd-riscv64), const EV_FLAG1 = 8192 #53466
+pkg syscall (freebsd-riscv64), const EV_FLAG1 ideal-int #53466
+pkg syscall (freebsd-riscv64), const EV_ONESHOT = 16 #53466
+pkg syscall (freebsd-riscv64), const EV_ONESHOT ideal-int #53466
+pkg syscall (freebsd-riscv64), const EV_RECEIPT = 64 #53466
+pkg syscall (freebsd-riscv64), const EV_RECEIPT ideal-int #53466
+pkg syscall (freebsd-riscv64), const EV_SYSFLAGS = 61440 #53466
+pkg syscall (freebsd-riscv64), const EV_SYSFLAGS ideal-int #53466
+pkg syscall (freebsd-riscv64), const EWOULDBLOCK = 35 #53466
+pkg syscall (freebsd-riscv64), const EXDEV = 18 #53466
+pkg syscall (freebsd-riscv64), const EXTA = 19200 #53466
+pkg syscall (freebsd-riscv64), const EXTA ideal-int #53466
+pkg syscall (freebsd-riscv64), const EXTB = 38400 #53466
+pkg syscall (freebsd-riscv64), const EXTB ideal-int #53466
+pkg syscall (freebsd-riscv64), const EXTPROC = 2048 #53466
+pkg syscall (freebsd-riscv64), const EXTPROC ideal-int #53466
+pkg syscall (freebsd-riscv64), const FD_CLOEXEC = 1 #53466
+pkg syscall (freebsd-riscv64), const FD_CLOEXEC ideal-int #53466
+pkg syscall (freebsd-riscv64), const FD_SETSIZE = 1024 #53466
+pkg syscall (freebsd-riscv64), const FD_SETSIZE ideal-int #53466
+pkg syscall (freebsd-riscv64), const FLUSHO = 8388608 #53466
+pkg syscall (freebsd-riscv64), const FLUSHO ideal-int #53466
+pkg syscall (freebsd-riscv64), const F_CANCEL = 5 #53466
+pkg syscall (freebsd-riscv64), const F_CANCEL ideal-int #53466
+pkg syscall (freebsd-riscv64), const F_DUP2FD = 10 #53466
+pkg syscall (freebsd-riscv64), const F_DUP2FD ideal-int #53466
+pkg syscall (freebsd-riscv64), const F_DUP2FD_CLOEXEC = 18 #53466
+pkg syscall (freebsd-riscv64), const F_DUP2FD_CLOEXEC ideal-int #53466
+pkg syscall (freebsd-riscv64), const F_DUPFD = 0 #53466
+pkg syscall (freebsd-riscv64), const F_DUPFD ideal-int #53466
+pkg syscall (freebsd-riscv64), const F_DUPFD_CLOEXEC = 17 #53466
+pkg syscall (freebsd-riscv64), const F_DUPFD_CLOEXEC ideal-int #53466
+pkg syscall (freebsd-riscv64), const F_GETFD = 1 #53466
+pkg syscall (freebsd-riscv64), const F_GETFD ideal-int #53466
+pkg syscall (freebsd-riscv64), const F_GETFL = 3 #53466
+pkg syscall (freebsd-riscv64), const F_GETFL ideal-int #53466
+pkg syscall (freebsd-riscv64), const F_GETLK = 11 #53466
+pkg syscall (freebsd-riscv64), const F_GETLK ideal-int #53466
+pkg syscall (freebsd-riscv64), const F_GETOWN = 5 #53466
+pkg syscall (freebsd-riscv64), const F_GETOWN ideal-int #53466
+pkg syscall (freebsd-riscv64), const F_OGETLK = 7 #53466
+pkg syscall (freebsd-riscv64), const F_OGETLK ideal-int #53466
+pkg syscall (freebsd-riscv64), const F_OK = 0 #53466
+pkg syscall (freebsd-riscv64), const F_OK ideal-int #53466
+pkg syscall (freebsd-riscv64), const F_OSETLK = 8 #53466
+pkg syscall (freebsd-riscv64), const F_OSETLK ideal-int #53466
+pkg syscall (freebsd-riscv64), const F_OSETLKW = 9 #53466
+pkg syscall (freebsd-riscv64), const F_OSETLKW ideal-int #53466
+pkg syscall (freebsd-riscv64), const F_RDAHEAD = 16 #53466
+pkg syscall (freebsd-riscv64), const F_RDAHEAD ideal-int #53466
+pkg syscall (freebsd-riscv64), const F_RDLCK = 1 #53466
+pkg syscall (freebsd-riscv64), const F_RDLCK ideal-int #53466
+pkg syscall (freebsd-riscv64), const F_READAHEAD = 15 #53466
+pkg syscall (freebsd-riscv64), const F_READAHEAD ideal-int #53466
+pkg syscall (freebsd-riscv64), const F_SETFD = 2 #53466
+pkg syscall (freebsd-riscv64), const F_SETFD ideal-int #53466
+pkg syscall (freebsd-riscv64), const F_SETFL = 4 #53466
+pkg syscall (freebsd-riscv64), const F_SETFL ideal-int #53466
+pkg syscall (freebsd-riscv64), const F_SETLK = 12 #53466
+pkg syscall (freebsd-riscv64), const F_SETLK ideal-int #53466
+pkg syscall (freebsd-riscv64), const F_SETLKW = 13 #53466
+pkg syscall (freebsd-riscv64), const F_SETLKW ideal-int #53466
+pkg syscall (freebsd-riscv64), const F_SETLK_REMOTE = 14 #53466
+pkg syscall (freebsd-riscv64), const F_SETLK_REMOTE ideal-int #53466
+pkg syscall (freebsd-riscv64), const F_SETOWN = 6 #53466
+pkg syscall (freebsd-riscv64), const F_SETOWN ideal-int #53466
+pkg syscall (freebsd-riscv64), const F_UNLCK = 2 #53466
+pkg syscall (freebsd-riscv64), const F_UNLCK ideal-int #53466
+pkg syscall (freebsd-riscv64), const F_UNLCKSYS = 4 #53466
+pkg syscall (freebsd-riscv64), const F_UNLCKSYS ideal-int #53466
+pkg syscall (freebsd-riscv64), const F_WRLCK = 3 #53466
+pkg syscall (freebsd-riscv64), const F_WRLCK ideal-int #53466
+pkg syscall (freebsd-riscv64), const HUPCL = 16384 #53466
+pkg syscall (freebsd-riscv64), const HUPCL ideal-int #53466
+pkg syscall (freebsd-riscv64), const ICANON = 256 #53466
+pkg syscall (freebsd-riscv64), const ICANON ideal-int #53466
+pkg syscall (freebsd-riscv64), const ICMP6_FILTER = 18 #53466
+pkg syscall (freebsd-riscv64), const ICMP6_FILTER ideal-int #53466
+pkg syscall (freebsd-riscv64), const ICRNL = 256 #53466
+pkg syscall (freebsd-riscv64), const ICRNL ideal-int #53466
+pkg syscall (freebsd-riscv64), const IEXTEN = 1024 #53466
+pkg syscall (freebsd-riscv64), const IEXTEN ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFAN_ARRIVAL = 0 #53466
+pkg syscall (freebsd-riscv64), const IFAN_ARRIVAL ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFAN_DEPARTURE = 1 #53466
+pkg syscall (freebsd-riscv64), const IFAN_DEPARTURE ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFF_ALLMULTI = 512 #53466
+pkg syscall (freebsd-riscv64), const IFF_ALLMULTI ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFF_ALTPHYS = 16384 #53466
+pkg syscall (freebsd-riscv64), const IFF_ALTPHYS ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFF_CANTCHANGE = 2199410 #53466
+pkg syscall (freebsd-riscv64), const IFF_CANTCHANGE ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFF_CANTCONFIG = 65536 #53466
+pkg syscall (freebsd-riscv64), const IFF_CANTCONFIG ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFF_DEBUG = 4 #53466
+pkg syscall (freebsd-riscv64), const IFF_DEBUG ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFF_DRV_OACTIVE = 1024 #53466
+pkg syscall (freebsd-riscv64), const IFF_DRV_OACTIVE ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFF_DRV_RUNNING = 64 #53466
+pkg syscall (freebsd-riscv64), const IFF_DRV_RUNNING ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFF_DYING = 2097152 #53466
+pkg syscall (freebsd-riscv64), const IFF_DYING ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFF_LINK0 = 4096 #53466
+pkg syscall (freebsd-riscv64), const IFF_LINK0 ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFF_LINK1 = 8192 #53466
+pkg syscall (freebsd-riscv64), const IFF_LINK1 ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFF_LINK2 = 16384 #53466
+pkg syscall (freebsd-riscv64), const IFF_LINK2 ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFF_LOOPBACK = 8 #53466
+pkg syscall (freebsd-riscv64), const IFF_MONITOR = 262144 #53466
+pkg syscall (freebsd-riscv64), const IFF_MONITOR ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFF_MULTICAST = 32768 #53466
+pkg syscall (freebsd-riscv64), const IFF_NOARP = 128 #53466
+pkg syscall (freebsd-riscv64), const IFF_NOARP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFF_OACTIVE = 1024 #53466
+pkg syscall (freebsd-riscv64), const IFF_OACTIVE ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFF_POINTOPOINT = 16 #53466
+pkg syscall (freebsd-riscv64), const IFF_POINTOPOINT ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFF_PPROMISC = 131072 #53466
+pkg syscall (freebsd-riscv64), const IFF_PPROMISC ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFF_PROMISC = 256 #53466
+pkg syscall (freebsd-riscv64), const IFF_PROMISC ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFF_RENAMING = 4194304 #53466
+pkg syscall (freebsd-riscv64), const IFF_RENAMING ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFF_RUNNING = 64 #53466
+pkg syscall (freebsd-riscv64), const IFF_RUNNING ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFF_SIMPLEX = 2048 #53466
+pkg syscall (freebsd-riscv64), const IFF_SIMPLEX ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFF_SMART = 32 #53466
+pkg syscall (freebsd-riscv64), const IFF_SMART ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFF_STATICARP = 524288 #53466
+pkg syscall (freebsd-riscv64), const IFF_STATICARP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFNAMSIZ = 16 #53466
+pkg syscall (freebsd-riscv64), const IFNAMSIZ ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_1822 = 2 #53466
+pkg syscall (freebsd-riscv64), const IFT_1822 ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_A12MPPSWITCH = 130 #53466
+pkg syscall (freebsd-riscv64), const IFT_A12MPPSWITCH ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_AAL2 = 187 #53466
+pkg syscall (freebsd-riscv64), const IFT_AAL2 ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_AAL5 = 49 #53466
+pkg syscall (freebsd-riscv64), const IFT_AAL5 ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_ADSL = 94 #53466
+pkg syscall (freebsd-riscv64), const IFT_ADSL ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_AFLANE8023 = 59 #53466
+pkg syscall (freebsd-riscv64), const IFT_AFLANE8023 ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_AFLANE8025 = 60 #53466
+pkg syscall (freebsd-riscv64), const IFT_AFLANE8025 ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_ARAP = 88 #53466
+pkg syscall (freebsd-riscv64), const IFT_ARAP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_ARCNET = 35 #53466
+pkg syscall (freebsd-riscv64), const IFT_ARCNET ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_ARCNETPLUS = 36 #53466
+pkg syscall (freebsd-riscv64), const IFT_ARCNETPLUS ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_ASYNC = 84 #53466
+pkg syscall (freebsd-riscv64), const IFT_ASYNC ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_ATM = 37 #53466
+pkg syscall (freebsd-riscv64), const IFT_ATM ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_ATMDXI = 105 #53466
+pkg syscall (freebsd-riscv64), const IFT_ATMDXI ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_ATMFUNI = 106 #53466
+pkg syscall (freebsd-riscv64), const IFT_ATMFUNI ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_ATMIMA = 107 #53466
+pkg syscall (freebsd-riscv64), const IFT_ATMIMA ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_ATMLOGICAL = 80 #53466
+pkg syscall (freebsd-riscv64), const IFT_ATMLOGICAL ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_ATMRADIO = 189 #53466
+pkg syscall (freebsd-riscv64), const IFT_ATMRADIO ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_ATMSUBINTERFACE = 134 #53466
+pkg syscall (freebsd-riscv64), const IFT_ATMSUBINTERFACE ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_ATMVCIENDPT = 194 #53466
+pkg syscall (freebsd-riscv64), const IFT_ATMVCIENDPT ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_ATMVIRTUAL = 149 #53466
+pkg syscall (freebsd-riscv64), const IFT_ATMVIRTUAL ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_BGPPOLICYACCOUNTING = 162 #53466
+pkg syscall (freebsd-riscv64), const IFT_BGPPOLICYACCOUNTING ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_BRIDGE = 209 #53466
+pkg syscall (freebsd-riscv64), const IFT_BRIDGE ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_BSC = 83 #53466
+pkg syscall (freebsd-riscv64), const IFT_BSC ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_CARP = 248 #53466
+pkg syscall (freebsd-riscv64), const IFT_CARP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_CCTEMUL = 61 #53466
+pkg syscall (freebsd-riscv64), const IFT_CCTEMUL ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_CEPT = 19 #53466
+pkg syscall (freebsd-riscv64), const IFT_CEPT ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_CES = 133 #53466
+pkg syscall (freebsd-riscv64), const IFT_CES ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_CHANNEL = 70 #53466
+pkg syscall (freebsd-riscv64), const IFT_CHANNEL ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_CNR = 85 #53466
+pkg syscall (freebsd-riscv64), const IFT_CNR ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_COFFEE = 132 #53466
+pkg syscall (freebsd-riscv64), const IFT_COFFEE ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_COMPOSITELINK = 155 #53466
+pkg syscall (freebsd-riscv64), const IFT_COMPOSITELINK ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_DCN = 141 #53466
+pkg syscall (freebsd-riscv64), const IFT_DCN ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_DIGITALPOWERLINE = 138 #53466
+pkg syscall (freebsd-riscv64), const IFT_DIGITALPOWERLINE ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_DIGITALWRAPPEROVERHEADCHANNEL = 186 #53466
+pkg syscall (freebsd-riscv64), const IFT_DIGITALWRAPPEROVERHEADCHANNEL ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_DLSW = 74 #53466
+pkg syscall (freebsd-riscv64), const IFT_DLSW ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_DOCSCABLEDOWNSTREAM = 128 #53466
+pkg syscall (freebsd-riscv64), const IFT_DOCSCABLEDOWNSTREAM ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_DOCSCABLEMACLAYER = 127 #53466
+pkg syscall (freebsd-riscv64), const IFT_DOCSCABLEMACLAYER ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_DOCSCABLEUPSTREAM = 129 #53466
+pkg syscall (freebsd-riscv64), const IFT_DOCSCABLEUPSTREAM ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_DS0 = 81 #53466
+pkg syscall (freebsd-riscv64), const IFT_DS0 ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_DS0BUNDLE = 82 #53466
+pkg syscall (freebsd-riscv64), const IFT_DS0BUNDLE ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_DS1FDL = 170 #53466
+pkg syscall (freebsd-riscv64), const IFT_DS1FDL ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_DS3 = 30 #53466
+pkg syscall (freebsd-riscv64), const IFT_DS3 ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_DTM = 140 #53466
+pkg syscall (freebsd-riscv64), const IFT_DTM ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_DVBASILN = 172 #53466
+pkg syscall (freebsd-riscv64), const IFT_DVBASILN ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_DVBASIOUT = 173 #53466
+pkg syscall (freebsd-riscv64), const IFT_DVBASIOUT ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_DVBRCCDOWNSTREAM = 147 #53466
+pkg syscall (freebsd-riscv64), const IFT_DVBRCCDOWNSTREAM ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_DVBRCCMACLAYER = 146 #53466
+pkg syscall (freebsd-riscv64), const IFT_DVBRCCMACLAYER ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_DVBRCCUPSTREAM = 148 #53466
+pkg syscall (freebsd-riscv64), const IFT_DVBRCCUPSTREAM ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_ENC = 244 #53466
+pkg syscall (freebsd-riscv64), const IFT_ENC ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_EON = 25 #53466
+pkg syscall (freebsd-riscv64), const IFT_EON ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_EPLRS = 87 #53466
+pkg syscall (freebsd-riscv64), const IFT_EPLRS ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_ESCON = 73 #53466
+pkg syscall (freebsd-riscv64), const IFT_ESCON ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_ETHER = 6 #53466
+pkg syscall (freebsd-riscv64), const IFT_ETHER ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_FAITH = 242 #53466
+pkg syscall (freebsd-riscv64), const IFT_FAITH ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_FAST = 125 #53466
+pkg syscall (freebsd-riscv64), const IFT_FAST ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_FASTETHER = 62 #53466
+pkg syscall (freebsd-riscv64), const IFT_FASTETHER ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_FASTETHERFX = 69 #53466
+pkg syscall (freebsd-riscv64), const IFT_FASTETHERFX ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_FDDI = 15 #53466
+pkg syscall (freebsd-riscv64), const IFT_FDDI ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_FIBRECHANNEL = 56 #53466
+pkg syscall (freebsd-riscv64), const IFT_FIBRECHANNEL ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_FRAMERELAYINTERCONNECT = 58 #53466
+pkg syscall (freebsd-riscv64), const IFT_FRAMERELAYINTERCONNECT ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_FRAMERELAYMPI = 92 #53466
+pkg syscall (freebsd-riscv64), const IFT_FRAMERELAYMPI ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_FRDLCIENDPT = 193 #53466
+pkg syscall (freebsd-riscv64), const IFT_FRDLCIENDPT ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_FRELAY = 32 #53466
+pkg syscall (freebsd-riscv64), const IFT_FRELAY ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_FRELAYDCE = 44 #53466
+pkg syscall (freebsd-riscv64), const IFT_FRELAYDCE ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_FRF16MFRBUNDLE = 163 #53466
+pkg syscall (freebsd-riscv64), const IFT_FRF16MFRBUNDLE ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_FRFORWARD = 158 #53466
+pkg syscall (freebsd-riscv64), const IFT_FRFORWARD ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_G703AT2MB = 67 #53466
+pkg syscall (freebsd-riscv64), const IFT_G703AT2MB ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_G703AT64K = 66 #53466
+pkg syscall (freebsd-riscv64), const IFT_G703AT64K ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_GIF = 240 #53466
+pkg syscall (freebsd-riscv64), const IFT_GIF ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_GIGABITETHERNET = 117 #53466
+pkg syscall (freebsd-riscv64), const IFT_GIGABITETHERNET ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_GR303IDT = 178 #53466
+pkg syscall (freebsd-riscv64), const IFT_GR303IDT ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_GR303RDT = 177 #53466
+pkg syscall (freebsd-riscv64), const IFT_GR303RDT ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_H323GATEKEEPER = 164 #53466
+pkg syscall (freebsd-riscv64), const IFT_H323GATEKEEPER ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_H323PROXY = 165 #53466
+pkg syscall (freebsd-riscv64), const IFT_H323PROXY ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_HDH1822 = 3 #53466
+pkg syscall (freebsd-riscv64), const IFT_HDH1822 ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_HDLC = 118 #53466
+pkg syscall (freebsd-riscv64), const IFT_HDLC ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_HDSL2 = 168 #53466
+pkg syscall (freebsd-riscv64), const IFT_HDSL2 ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_HIPERLAN2 = 183 #53466
+pkg syscall (freebsd-riscv64), const IFT_HIPERLAN2 ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_HIPPI = 47 #53466
+pkg syscall (freebsd-riscv64), const IFT_HIPPI ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_HIPPIINTERFACE = 57 #53466
+pkg syscall (freebsd-riscv64), const IFT_HIPPIINTERFACE ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_HOSTPAD = 90 #53466
+pkg syscall (freebsd-riscv64), const IFT_HOSTPAD ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_HSSI = 46 #53466
+pkg syscall (freebsd-riscv64), const IFT_HSSI ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_HY = 14 #53466
+pkg syscall (freebsd-riscv64), const IFT_HY ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_IBM370PARCHAN = 72 #53466
+pkg syscall (freebsd-riscv64), const IFT_IBM370PARCHAN ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_IDSL = 154 #53466
+pkg syscall (freebsd-riscv64), const IFT_IDSL ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_IEEE1394 = 144 #53466
+pkg syscall (freebsd-riscv64), const IFT_IEEE1394 ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_IEEE80211 = 71 #53466
+pkg syscall (freebsd-riscv64), const IFT_IEEE80211 ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_IEEE80212 = 55 #53466
+pkg syscall (freebsd-riscv64), const IFT_IEEE80212 ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_IEEE8023ADLAG = 161 #53466
+pkg syscall (freebsd-riscv64), const IFT_IEEE8023ADLAG ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_IFGSN = 145 #53466
+pkg syscall (freebsd-riscv64), const IFT_IFGSN ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_IMT = 190 #53466
+pkg syscall (freebsd-riscv64), const IFT_IMT ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_INFINIBAND = 199 #53466
+pkg syscall (freebsd-riscv64), const IFT_INFINIBAND ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_INTERLEAVE = 124 #53466
+pkg syscall (freebsd-riscv64), const IFT_INTERLEAVE ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_IP = 126 #53466
+pkg syscall (freebsd-riscv64), const IFT_IP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_IPFORWARD = 142 #53466
+pkg syscall (freebsd-riscv64), const IFT_IPFORWARD ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_IPOVERATM = 114 #53466
+pkg syscall (freebsd-riscv64), const IFT_IPOVERATM ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_IPOVERCDLC = 109 #53466
+pkg syscall (freebsd-riscv64), const IFT_IPOVERCDLC ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_IPOVERCLAW = 110 #53466
+pkg syscall (freebsd-riscv64), const IFT_IPOVERCLAW ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_IPSWITCH = 78 #53466
+pkg syscall (freebsd-riscv64), const IFT_IPSWITCH ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_IPXIP = 249 #53466
+pkg syscall (freebsd-riscv64), const IFT_IPXIP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_ISDN = 63 #53466
+pkg syscall (freebsd-riscv64), const IFT_ISDN ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_ISDNBASIC = 20 #53466
+pkg syscall (freebsd-riscv64), const IFT_ISDNBASIC ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_ISDNPRIMARY = 21 #53466
+pkg syscall (freebsd-riscv64), const IFT_ISDNPRIMARY ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_ISDNS = 75 #53466
+pkg syscall (freebsd-riscv64), const IFT_ISDNS ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_ISDNU = 76 #53466
+pkg syscall (freebsd-riscv64), const IFT_ISDNU ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_ISO88022LLC = 41 #53466
+pkg syscall (freebsd-riscv64), const IFT_ISO88022LLC ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_ISO88023 = 7 #53466
+pkg syscall (freebsd-riscv64), const IFT_ISO88023 ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_ISO88024 = 8 #53466
+pkg syscall (freebsd-riscv64), const IFT_ISO88024 ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_ISO88025 = 9 #53466
+pkg syscall (freebsd-riscv64), const IFT_ISO88025 ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_ISO88025CRFPINT = 98 #53466
+pkg syscall (freebsd-riscv64), const IFT_ISO88025CRFPINT ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_ISO88025DTR = 86 #53466
+pkg syscall (freebsd-riscv64), const IFT_ISO88025DTR ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_ISO88025FIBER = 115 #53466
+pkg syscall (freebsd-riscv64), const IFT_ISO88025FIBER ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_ISO88026 = 10 #53466
+pkg syscall (freebsd-riscv64), const IFT_ISO88026 ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_ISUP = 179 #53466
+pkg syscall (freebsd-riscv64), const IFT_ISUP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_L2VLAN = 135 #53466
+pkg syscall (freebsd-riscv64), const IFT_L2VLAN ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_L3IPVLAN = 136 #53466
+pkg syscall (freebsd-riscv64), const IFT_L3IPVLAN ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_L3IPXVLAN = 137 #53466
+pkg syscall (freebsd-riscv64), const IFT_L3IPXVLAN ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_LAPB = 16 #53466
+pkg syscall (freebsd-riscv64), const IFT_LAPB ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_LAPD = 77 #53466
+pkg syscall (freebsd-riscv64), const IFT_LAPD ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_LAPF = 119 #53466
+pkg syscall (freebsd-riscv64), const IFT_LAPF ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_LOCALTALK = 42 #53466
+pkg syscall (freebsd-riscv64), const IFT_LOCALTALK ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_LOOP = 24 #53466
+pkg syscall (freebsd-riscv64), const IFT_LOOP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_MEDIAMAILOVERIP = 139 #53466
+pkg syscall (freebsd-riscv64), const IFT_MEDIAMAILOVERIP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_MFSIGLINK = 167 #53466
+pkg syscall (freebsd-riscv64), const IFT_MFSIGLINK ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_MIOX25 = 38 #53466
+pkg syscall (freebsd-riscv64), const IFT_MIOX25 ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_MODEM = 48 #53466
+pkg syscall (freebsd-riscv64), const IFT_MODEM ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_MPC = 113 #53466
+pkg syscall (freebsd-riscv64), const IFT_MPC ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_MPLS = 166 #53466
+pkg syscall (freebsd-riscv64), const IFT_MPLS ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_MPLSTUNNEL = 150 #53466
+pkg syscall (freebsd-riscv64), const IFT_MPLSTUNNEL ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_MSDSL = 143 #53466
+pkg syscall (freebsd-riscv64), const IFT_MSDSL ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_MVL = 191 #53466
+pkg syscall (freebsd-riscv64), const IFT_MVL ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_MYRINET = 99 #53466
+pkg syscall (freebsd-riscv64), const IFT_MYRINET ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_NFAS = 175 #53466
+pkg syscall (freebsd-riscv64), const IFT_NFAS ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_NSIP = 27 #53466
+pkg syscall (freebsd-riscv64), const IFT_NSIP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_OPTICALCHANNEL = 195 #53466
+pkg syscall (freebsd-riscv64), const IFT_OPTICALCHANNEL ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_OPTICALTRANSPORT = 196 #53466
+pkg syscall (freebsd-riscv64), const IFT_OPTICALTRANSPORT ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_OTHER = 1 #53466
+pkg syscall (freebsd-riscv64), const IFT_OTHER ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_P10 = 12 #53466
+pkg syscall (freebsd-riscv64), const IFT_P10 ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_P80 = 13 #53466
+pkg syscall (freebsd-riscv64), const IFT_P80 ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_PARA = 34 #53466
+pkg syscall (freebsd-riscv64), const IFT_PARA ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_PFLOG = 246 #53466
+pkg syscall (freebsd-riscv64), const IFT_PFLOG ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_PFSYNC = 247 #53466
+pkg syscall (freebsd-riscv64), const IFT_PFSYNC ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_PLC = 174 #53466
+pkg syscall (freebsd-riscv64), const IFT_PLC ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_POS = 171 #53466
+pkg syscall (freebsd-riscv64), const IFT_POS ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_PPP = 23 #53466
+pkg syscall (freebsd-riscv64), const IFT_PPP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_PPPMULTILINKBUNDLE = 108 #53466
+pkg syscall (freebsd-riscv64), const IFT_PPPMULTILINKBUNDLE ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_PROPBWAP2MP = 184 #53466
+pkg syscall (freebsd-riscv64), const IFT_PROPBWAP2MP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_PROPCNLS = 89 #53466
+pkg syscall (freebsd-riscv64), const IFT_PROPCNLS ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_PROPDOCSWIRELESSDOWNSTREAM = 181 #53466
+pkg syscall (freebsd-riscv64), const IFT_PROPDOCSWIRELESSDOWNSTREAM ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_PROPDOCSWIRELESSMACLAYER = 180 #53466
+pkg syscall (freebsd-riscv64), const IFT_PROPDOCSWIRELESSMACLAYER ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_PROPDOCSWIRELESSUPSTREAM = 182 #53466
+pkg syscall (freebsd-riscv64), const IFT_PROPDOCSWIRELESSUPSTREAM ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_PROPMUX = 54 #53466
+pkg syscall (freebsd-riscv64), const IFT_PROPMUX ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_PROPVIRTUAL = 53 #53466
+pkg syscall (freebsd-riscv64), const IFT_PROPVIRTUAL ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_PROPWIRELESSP2P = 157 #53466
+pkg syscall (freebsd-riscv64), const IFT_PROPWIRELESSP2P ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_PTPSERIAL = 22 #53466
+pkg syscall (freebsd-riscv64), const IFT_PTPSERIAL ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_PVC = 241 #53466
+pkg syscall (freebsd-riscv64), const IFT_PVC ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_QLLC = 68 #53466
+pkg syscall (freebsd-riscv64), const IFT_QLLC ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_RADIOMAC = 188 #53466
+pkg syscall (freebsd-riscv64), const IFT_RADIOMAC ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_RADSL = 95 #53466
+pkg syscall (freebsd-riscv64), const IFT_RADSL ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_REACHDSL = 192 #53466
+pkg syscall (freebsd-riscv64), const IFT_REACHDSL ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_RFC1483 = 159 #53466
+pkg syscall (freebsd-riscv64), const IFT_RFC1483 ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_RS232 = 33 #53466
+pkg syscall (freebsd-riscv64), const IFT_RS232 ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_RSRB = 79 #53466
+pkg syscall (freebsd-riscv64), const IFT_RSRB ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_SDLC = 17 #53466
+pkg syscall (freebsd-riscv64), const IFT_SDLC ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_SDSL = 96 #53466
+pkg syscall (freebsd-riscv64), const IFT_SDSL ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_SHDSL = 169 #53466
+pkg syscall (freebsd-riscv64), const IFT_SHDSL ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_SIP = 31 #53466
+pkg syscall (freebsd-riscv64), const IFT_SIP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_SLIP = 28 #53466
+pkg syscall (freebsd-riscv64), const IFT_SLIP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_SMDSDXI = 43 #53466
+pkg syscall (freebsd-riscv64), const IFT_SMDSDXI ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_SMDSICIP = 52 #53466
+pkg syscall (freebsd-riscv64), const IFT_SMDSICIP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_SONET = 39 #53466
+pkg syscall (freebsd-riscv64), const IFT_SONET ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_SONETOVERHEADCHANNEL = 185 #53466
+pkg syscall (freebsd-riscv64), const IFT_SONETOVERHEADCHANNEL ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_SONETPATH = 50 #53466
+pkg syscall (freebsd-riscv64), const IFT_SONETPATH ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_SONETVT = 51 #53466
+pkg syscall (freebsd-riscv64), const IFT_SONETVT ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_SRP = 151 #53466
+pkg syscall (freebsd-riscv64), const IFT_SRP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_SS7SIGLINK = 156 #53466
+pkg syscall (freebsd-riscv64), const IFT_SS7SIGLINK ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_STACKTOSTACK = 111 #53466
+pkg syscall (freebsd-riscv64), const IFT_STACKTOSTACK ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_STARLAN = 11 #53466
+pkg syscall (freebsd-riscv64), const IFT_STARLAN ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_STF = 215 #53466
+pkg syscall (freebsd-riscv64), const IFT_STF ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_T1 = 18 #53466
+pkg syscall (freebsd-riscv64), const IFT_T1 ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_TDLC = 116 #53466
+pkg syscall (freebsd-riscv64), const IFT_TDLC ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_TERMPAD = 91 #53466
+pkg syscall (freebsd-riscv64), const IFT_TERMPAD ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_TR008 = 176 #53466
+pkg syscall (freebsd-riscv64), const IFT_TR008 ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_TRANSPHDLC = 123 #53466
+pkg syscall (freebsd-riscv64), const IFT_TRANSPHDLC ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_TUNNEL = 131 #53466
+pkg syscall (freebsd-riscv64), const IFT_TUNNEL ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_ULTRA = 29 #53466
+pkg syscall (freebsd-riscv64), const IFT_ULTRA ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_USB = 160 #53466
+pkg syscall (freebsd-riscv64), const IFT_USB ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_V11 = 64 #53466
+pkg syscall (freebsd-riscv64), const IFT_V11 ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_V35 = 45 #53466
+pkg syscall (freebsd-riscv64), const IFT_V35 ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_V36 = 65 #53466
+pkg syscall (freebsd-riscv64), const IFT_V36 ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_V37 = 120 #53466
+pkg syscall (freebsd-riscv64), const IFT_V37 ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_VDSL = 97 #53466
+pkg syscall (freebsd-riscv64), const IFT_VDSL ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_VIRTUALIPADDRESS = 112 #53466
+pkg syscall (freebsd-riscv64), const IFT_VIRTUALIPADDRESS ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_VOICEEM = 100 #53466
+pkg syscall (freebsd-riscv64), const IFT_VOICEEM ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_VOICEENCAP = 103 #53466
+pkg syscall (freebsd-riscv64), const IFT_VOICEENCAP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_VOICEFXO = 101 #53466
+pkg syscall (freebsd-riscv64), const IFT_VOICEFXO ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_VOICEFXS = 102 #53466
+pkg syscall (freebsd-riscv64), const IFT_VOICEFXS ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_VOICEOVERATM = 152 #53466
+pkg syscall (freebsd-riscv64), const IFT_VOICEOVERATM ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_VOICEOVERFRAMERELAY = 153 #53466
+pkg syscall (freebsd-riscv64), const IFT_VOICEOVERFRAMERELAY ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_VOICEOVERIP = 104 #53466
+pkg syscall (freebsd-riscv64), const IFT_VOICEOVERIP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_X213 = 93 #53466
+pkg syscall (freebsd-riscv64), const IFT_X213 ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_X25 = 5 #53466
+pkg syscall (freebsd-riscv64), const IFT_X25 ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_X25DDN = 4 #53466
+pkg syscall (freebsd-riscv64), const IFT_X25DDN ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_X25HUNTGROUP = 122 #53466
+pkg syscall (freebsd-riscv64), const IFT_X25HUNTGROUP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_X25MLP = 121 #53466
+pkg syscall (freebsd-riscv64), const IFT_X25MLP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_X25PLE = 40 #53466
+pkg syscall (freebsd-riscv64), const IFT_X25PLE ideal-int #53466
+pkg syscall (freebsd-riscv64), const IFT_XETHER = 26 #53466
+pkg syscall (freebsd-riscv64), const IFT_XETHER ideal-int #53466
+pkg syscall (freebsd-riscv64), const IGNBRK = 1 #53466
+pkg syscall (freebsd-riscv64), const IGNBRK ideal-int #53466
+pkg syscall (freebsd-riscv64), const IGNCR = 128 #53466
+pkg syscall (freebsd-riscv64), const IGNCR ideal-int #53466
+pkg syscall (freebsd-riscv64), const IGNPAR = 4 #53466
+pkg syscall (freebsd-riscv64), const IGNPAR ideal-int #53466
+pkg syscall (freebsd-riscv64), const IMAXBEL = 8192 #53466
+pkg syscall (freebsd-riscv64), const IMAXBEL ideal-int #53466
+pkg syscall (freebsd-riscv64), const INLCR = 64 #53466
+pkg syscall (freebsd-riscv64), const INLCR ideal-int #53466
+pkg syscall (freebsd-riscv64), const INPCK = 16 #53466
+pkg syscall (freebsd-riscv64), const INPCK ideal-int #53466
+pkg syscall (freebsd-riscv64), const IN_CLASSA_HOST = 16777215 #53466
+pkg syscall (freebsd-riscv64), const IN_CLASSA_HOST ideal-int #53466
+pkg syscall (freebsd-riscv64), const IN_CLASSA_MAX = 128 #53466
+pkg syscall (freebsd-riscv64), const IN_CLASSA_MAX ideal-int #53466
+pkg syscall (freebsd-riscv64), const IN_CLASSA_NET = 4278190080 #53466
+pkg syscall (freebsd-riscv64), const IN_CLASSA_NET ideal-int #53466
+pkg syscall (freebsd-riscv64), const IN_CLASSA_NSHIFT = 24 #53466
+pkg syscall (freebsd-riscv64), const IN_CLASSA_NSHIFT ideal-int #53466
+pkg syscall (freebsd-riscv64), const IN_CLASSB_HOST = 65535 #53466
+pkg syscall (freebsd-riscv64), const IN_CLASSB_HOST ideal-int #53466
+pkg syscall (freebsd-riscv64), const IN_CLASSB_MAX = 65536 #53466
+pkg syscall (freebsd-riscv64), const IN_CLASSB_MAX ideal-int #53466
+pkg syscall (freebsd-riscv64), const IN_CLASSB_NET = 4294901760 #53466
+pkg syscall (freebsd-riscv64), const IN_CLASSB_NET ideal-int #53466
+pkg syscall (freebsd-riscv64), const IN_CLASSB_NSHIFT = 16 #53466
+pkg syscall (freebsd-riscv64), const IN_CLASSB_NSHIFT ideal-int #53466
+pkg syscall (freebsd-riscv64), const IN_CLASSC_HOST = 255 #53466
+pkg syscall (freebsd-riscv64), const IN_CLASSC_HOST ideal-int #53466
+pkg syscall (freebsd-riscv64), const IN_CLASSC_NET = 4294967040 #53466
+pkg syscall (freebsd-riscv64), const IN_CLASSC_NET ideal-int #53466
+pkg syscall (freebsd-riscv64), const IN_CLASSC_NSHIFT = 8 #53466
+pkg syscall (freebsd-riscv64), const IN_CLASSC_NSHIFT ideal-int #53466
+pkg syscall (freebsd-riscv64), const IN_CLASSD_HOST = 268435455 #53466
+pkg syscall (freebsd-riscv64), const IN_CLASSD_HOST ideal-int #53466
+pkg syscall (freebsd-riscv64), const IN_CLASSD_NET = 4026531840 #53466
+pkg syscall (freebsd-riscv64), const IN_CLASSD_NET ideal-int #53466
+pkg syscall (freebsd-riscv64), const IN_CLASSD_NSHIFT = 28 #53466
+pkg syscall (freebsd-riscv64), const IN_CLASSD_NSHIFT ideal-int #53466
+pkg syscall (freebsd-riscv64), const IN_LOOPBACKNET = 127 #53466
+pkg syscall (freebsd-riscv64), const IN_LOOPBACKNET ideal-int #53466
+pkg syscall (freebsd-riscv64), const IN_RFC3021_MASK = 4294967294 #53466
+pkg syscall (freebsd-riscv64), const IN_RFC3021_MASK ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_3PC = 34 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_3PC ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_ADFS = 68 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_ADFS ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_AH = 51 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_AH ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_AHIP = 61 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_AHIP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_APES = 99 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_APES ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_ARGUS = 13 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_ARGUS ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_AX25 = 93 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_AX25 ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_BHA = 49 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_BHA ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_BLT = 30 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_BLT ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_BRSATMON = 76 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_BRSATMON ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_CARP = 112 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_CARP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_CFTP = 62 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_CFTP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_CHAOS = 16 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_CHAOS ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_CMTP = 38 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_CMTP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_CPHB = 73 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_CPHB ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_CPNX = 72 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_CPNX ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_DDP = 37 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_DDP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_DGP = 86 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_DGP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_DIVERT = 258 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_DIVERT ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_DONE = 257 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_DONE ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_DSTOPTS = 60 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_DSTOPTS ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_EGP = 8 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_EGP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_EMCON = 14 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_EMCON ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_ENCAP = 98 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_ENCAP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_EON = 80 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_EON ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_ESP = 50 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_ESP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_ETHERIP = 97 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_ETHERIP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_FRAGMENT = 44 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_FRAGMENT ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_GGP = 3 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_GGP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_GMTP = 100 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_GMTP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_GRE = 47 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_GRE ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_HELLO = 63 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_HELLO ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_HMP = 20 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_HMP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_HOPOPTS = 0 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_HOPOPTS ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_ICMP = 1 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_ICMP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_ICMPV6 = 58 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_ICMPV6 ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_IDP = 22 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_IDP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_IDPR = 35 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_IDPR ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_IDRP = 45 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_IDRP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_IGMP = 2 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_IGMP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_IGP = 85 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_IGP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_IGRP = 88 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_IGRP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_IL = 40 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_IL ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_INLSP = 52 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_INLSP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_INP = 32 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_INP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_IPCOMP = 108 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_IPCOMP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_IPCV = 71 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_IPCV ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_IPEIP = 94 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_IPEIP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_IPIP = 4 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_IPIP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_IPPC = 67 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_IPPC ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_IPV4 = 4 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_IPV4 ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_IRTP = 28 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_IRTP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_KRYPTOLAN = 65 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_KRYPTOLAN ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_LARP = 91 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_LARP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_LEAF1 = 25 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_LEAF1 ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_LEAF2 = 26 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_LEAF2 ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_MAX = 256 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_MAX ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_MAXID = 52 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_MAXID ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_MEAS = 19 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_MEAS ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_MH = 135 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_MH ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_MHRP = 48 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_MHRP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_MICP = 95 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_MICP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_MOBILE = 55 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_MOBILE ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_MPLS = 137 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_MPLS ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_MTP = 92 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_MTP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_MUX = 18 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_MUX ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_ND = 77 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_ND ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_NHRP = 54 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_NHRP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_NONE = 59 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_NONE ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_NSP = 31 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_NSP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_NVPII = 11 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_NVPII ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_OLD_DIVERT = 254 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_OLD_DIVERT ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_OSPFIGP = 89 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_OSPFIGP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_PFSYNC = 240 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_PFSYNC ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_PGM = 113 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_PGM ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_PIGP = 9 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_PIGP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_PIM = 103 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_PIM ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_PRM = 21 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_PRM ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_PUP = 12 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_PUP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_PVP = 75 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_PVP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_RAW = 255 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_RAW ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_RCCMON = 10 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_RCCMON ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_RDP = 27 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_RDP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_ROUTING = 43 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_ROUTING ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_RSVP = 46 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_RSVP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_RVD = 66 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_RVD ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_SATEXPAK = 64 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_SATEXPAK ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_SATMON = 69 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_SATMON ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_SCCSP = 96 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_SCCSP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_SCTP = 132 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_SCTP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_SDRP = 42 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_SDRP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_SEND = 259 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_SEND ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_SEP = 33 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_SEP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_SKIP = 57 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_SKIP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_SPACER = 32767 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_SPACER ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_SRPC = 90 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_SRPC ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_ST = 7 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_ST ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_SVMTP = 82 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_SVMTP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_SWIPE = 53 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_SWIPE ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_TCF = 87 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_TCF ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_TLSP = 56 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_TLSP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_TP = 29 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_TP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_TPXX = 39 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_TPXX ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_TRUNK1 = 23 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_TRUNK1 ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_TRUNK2 = 24 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_TRUNK2 ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_TTP = 84 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_TTP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_VINES = 83 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_VINES ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_VISA = 70 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_VISA ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_VMTP = 81 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_VMTP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_WBEXPAK = 79 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_WBEXPAK ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_WBMON = 78 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_WBMON ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_WSN = 74 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_WSN ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_XNET = 15 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_XNET ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_XTP = 36 #53466
+pkg syscall (freebsd-riscv64), const IPPROTO_XTP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPV6_AUTOFLOWLABEL = 59 #53466
+pkg syscall (freebsd-riscv64), const IPV6_AUTOFLOWLABEL ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPV6_BINDANY = 64 #53466
+pkg syscall (freebsd-riscv64), const IPV6_BINDANY ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPV6_BINDV6ONLY = 27 #53466
+pkg syscall (freebsd-riscv64), const IPV6_BINDV6ONLY ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPV6_CHECKSUM = 26 #53466
+pkg syscall (freebsd-riscv64), const IPV6_CHECKSUM ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPV6_DEFAULT_MULTICAST_HOPS = 1 #53466
+pkg syscall (freebsd-riscv64), const IPV6_DEFAULT_MULTICAST_HOPS ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPV6_DEFAULT_MULTICAST_LOOP = 1 #53466
+pkg syscall (freebsd-riscv64), const IPV6_DEFAULT_MULTICAST_LOOP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPV6_DEFHLIM = 64 #53466
+pkg syscall (freebsd-riscv64), const IPV6_DEFHLIM ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPV6_DONTFRAG = 62 #53466
+pkg syscall (freebsd-riscv64), const IPV6_DONTFRAG ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPV6_DSTOPTS = 50 #53466
+pkg syscall (freebsd-riscv64), const IPV6_DSTOPTS ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPV6_FAITH = 29 #53466
+pkg syscall (freebsd-riscv64), const IPV6_FAITH ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPV6_FLOWINFO_MASK = 4294967055 #53466
+pkg syscall (freebsd-riscv64), const IPV6_FLOWINFO_MASK ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPV6_FLOWLABEL_MASK = 4294905600 #53466
+pkg syscall (freebsd-riscv64), const IPV6_FLOWLABEL_MASK ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPV6_FRAGTTL = 120 #53466
+pkg syscall (freebsd-riscv64), const IPV6_FRAGTTL ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPV6_FW_ADD = 30 #53466
+pkg syscall (freebsd-riscv64), const IPV6_FW_ADD ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPV6_FW_DEL = 31 #53466
+pkg syscall (freebsd-riscv64), const IPV6_FW_DEL ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPV6_FW_FLUSH = 32 #53466
+pkg syscall (freebsd-riscv64), const IPV6_FW_FLUSH ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPV6_FW_GET = 34 #53466
+pkg syscall (freebsd-riscv64), const IPV6_FW_GET ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPV6_FW_ZERO = 33 #53466
+pkg syscall (freebsd-riscv64), const IPV6_FW_ZERO ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPV6_HLIMDEC = 1 #53466
+pkg syscall (freebsd-riscv64), const IPV6_HLIMDEC ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPV6_HOPLIMIT = 47 #53466
+pkg syscall (freebsd-riscv64), const IPV6_HOPLIMIT ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPV6_HOPOPTS = 49 #53466
+pkg syscall (freebsd-riscv64), const IPV6_HOPOPTS ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPV6_IPSEC_POLICY = 28 #53466
+pkg syscall (freebsd-riscv64), const IPV6_IPSEC_POLICY ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPV6_JOIN_GROUP = 12 #53466
+pkg syscall (freebsd-riscv64), const IPV6_LEAVE_GROUP = 13 #53466
+pkg syscall (freebsd-riscv64), const IPV6_MAXHLIM = 255 #53466
+pkg syscall (freebsd-riscv64), const IPV6_MAXHLIM ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPV6_MAXOPTHDR = 2048 #53466
+pkg syscall (freebsd-riscv64), const IPV6_MAXOPTHDR ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPV6_MAXPACKET = 65535 #53466
+pkg syscall (freebsd-riscv64), const IPV6_MAXPACKET ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPV6_MAX_GROUP_SRC_FILTER = 512 #53466
+pkg syscall (freebsd-riscv64), const IPV6_MAX_GROUP_SRC_FILTER ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPV6_MAX_MEMBERSHIPS = 4095 #53466
+pkg syscall (freebsd-riscv64), const IPV6_MAX_MEMBERSHIPS ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPV6_MAX_SOCK_SRC_FILTER = 128 #53466
+pkg syscall (freebsd-riscv64), const IPV6_MAX_SOCK_SRC_FILTER ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPV6_MIN_MEMBERSHIPS = 31 #53466
+pkg syscall (freebsd-riscv64), const IPV6_MIN_MEMBERSHIPS ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPV6_MMTU = 1280 #53466
+pkg syscall (freebsd-riscv64), const IPV6_MMTU ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPV6_MSFILTER = 74 #53466
+pkg syscall (freebsd-riscv64), const IPV6_MSFILTER ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPV6_MULTICAST_HOPS = 10 #53466
+pkg syscall (freebsd-riscv64), const IPV6_MULTICAST_IF = 9 #53466
+pkg syscall (freebsd-riscv64), const IPV6_MULTICAST_LOOP = 11 #53466
+pkg syscall (freebsd-riscv64), const IPV6_NEXTHOP = 48 #53466
+pkg syscall (freebsd-riscv64), const IPV6_NEXTHOP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPV6_PATHMTU = 44 #53466
+pkg syscall (freebsd-riscv64), const IPV6_PATHMTU ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPV6_PKTINFO = 46 #53466
+pkg syscall (freebsd-riscv64), const IPV6_PKTINFO ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPV6_PORTRANGE = 14 #53466
+pkg syscall (freebsd-riscv64), const IPV6_PORTRANGE ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPV6_PORTRANGE_DEFAULT = 0 #53466
+pkg syscall (freebsd-riscv64), const IPV6_PORTRANGE_DEFAULT ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPV6_PORTRANGE_HIGH = 1 #53466
+pkg syscall (freebsd-riscv64), const IPV6_PORTRANGE_HIGH ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPV6_PORTRANGE_LOW = 2 #53466
+pkg syscall (freebsd-riscv64), const IPV6_PORTRANGE_LOW ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPV6_PREFER_TEMPADDR = 63 #53466
+pkg syscall (freebsd-riscv64), const IPV6_PREFER_TEMPADDR ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPV6_RECVDSTOPTS = 40 #53466
+pkg syscall (freebsd-riscv64), const IPV6_RECVDSTOPTS ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPV6_RECVHOPLIMIT = 37 #53466
+pkg syscall (freebsd-riscv64), const IPV6_RECVHOPLIMIT ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPV6_RECVHOPOPTS = 39 #53466
+pkg syscall (freebsd-riscv64), const IPV6_RECVHOPOPTS ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPV6_RECVPATHMTU = 43 #53466
+pkg syscall (freebsd-riscv64), const IPV6_RECVPATHMTU ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPV6_RECVPKTINFO = 36 #53466
+pkg syscall (freebsd-riscv64), const IPV6_RECVPKTINFO ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPV6_RECVRTHDR = 38 #53466
+pkg syscall (freebsd-riscv64), const IPV6_RECVRTHDR ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPV6_RECVTCLASS = 57 #53466
+pkg syscall (freebsd-riscv64), const IPV6_RECVTCLASS ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPV6_RTHDR = 51 #53466
+pkg syscall (freebsd-riscv64), const IPV6_RTHDR ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPV6_RTHDRDSTOPTS = 35 #53466
+pkg syscall (freebsd-riscv64), const IPV6_RTHDRDSTOPTS ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPV6_RTHDR_LOOSE = 0 #53466
+pkg syscall (freebsd-riscv64), const IPV6_RTHDR_LOOSE ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPV6_RTHDR_STRICT = 1 #53466
+pkg syscall (freebsd-riscv64), const IPV6_RTHDR_STRICT ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPV6_RTHDR_TYPE_0 = 0 #53466
+pkg syscall (freebsd-riscv64), const IPV6_RTHDR_TYPE_0 ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPV6_SOCKOPT_RESERVED1 = 3 #53466
+pkg syscall (freebsd-riscv64), const IPV6_SOCKOPT_RESERVED1 ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPV6_TCLASS = 61 #53466
+pkg syscall (freebsd-riscv64), const IPV6_TCLASS ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPV6_UNICAST_HOPS = 4 #53466
+pkg syscall (freebsd-riscv64), const IPV6_USE_MIN_MTU = 42 #53466
+pkg syscall (freebsd-riscv64), const IPV6_USE_MIN_MTU ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPV6_V6ONLY = 27 #53466
+pkg syscall (freebsd-riscv64), const IPV6_VERSION = 96 #53466
+pkg syscall (freebsd-riscv64), const IPV6_VERSION ideal-int #53466
+pkg syscall (freebsd-riscv64), const IPV6_VERSION_MASK = 240 #53466
+pkg syscall (freebsd-riscv64), const IPV6_VERSION_MASK ideal-int #53466
+pkg syscall (freebsd-riscv64), const IP_ADD_MEMBERSHIP = 12 #53466
+pkg syscall (freebsd-riscv64), const IP_ADD_SOURCE_MEMBERSHIP = 70 #53466
+pkg syscall (freebsd-riscv64), const IP_ADD_SOURCE_MEMBERSHIP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IP_BINDANY = 24 #53466
+pkg syscall (freebsd-riscv64), const IP_BINDANY ideal-int #53466
+pkg syscall (freebsd-riscv64), const IP_BLOCK_SOURCE = 72 #53466
+pkg syscall (freebsd-riscv64), const IP_BLOCK_SOURCE ideal-int #53466
+pkg syscall (freebsd-riscv64), const IP_DEFAULT_MULTICAST_LOOP = 1 #53466
+pkg syscall (freebsd-riscv64), const IP_DEFAULT_MULTICAST_LOOP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IP_DEFAULT_MULTICAST_TTL = 1 #53466
+pkg syscall (freebsd-riscv64), const IP_DEFAULT_MULTICAST_TTL ideal-int #53466
+pkg syscall (freebsd-riscv64), const IP_DF = 16384 #53466
+pkg syscall (freebsd-riscv64), const IP_DF ideal-int #53466
+pkg syscall (freebsd-riscv64), const IP_DONTFRAG = 67 #53466
+pkg syscall (freebsd-riscv64), const IP_DONTFRAG ideal-int #53466
+pkg syscall (freebsd-riscv64), const IP_DROP_MEMBERSHIP = 13 #53466
+pkg syscall (freebsd-riscv64), const IP_DROP_SOURCE_MEMBERSHIP = 71 #53466
+pkg syscall (freebsd-riscv64), const IP_DROP_SOURCE_MEMBERSHIP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IP_DUMMYNET3 = 49 #53466
+pkg syscall (freebsd-riscv64), const IP_DUMMYNET3 ideal-int #53466
+pkg syscall (freebsd-riscv64), const IP_DUMMYNET_CONFIGURE = 60 #53466
+pkg syscall (freebsd-riscv64), const IP_DUMMYNET_CONFIGURE ideal-int #53466
+pkg syscall (freebsd-riscv64), const IP_DUMMYNET_DEL = 61 #53466
+pkg syscall (freebsd-riscv64), const IP_DUMMYNET_DEL ideal-int #53466
+pkg syscall (freebsd-riscv64), const IP_DUMMYNET_FLUSH = 62 #53466
+pkg syscall (freebsd-riscv64), const IP_DUMMYNET_FLUSH ideal-int #53466
+pkg syscall (freebsd-riscv64), const IP_DUMMYNET_GET = 64 #53466
+pkg syscall (freebsd-riscv64), const IP_DUMMYNET_GET ideal-int #53466
+pkg syscall (freebsd-riscv64), const IP_FAITH = 22 #53466
+pkg syscall (freebsd-riscv64), const IP_FAITH ideal-int #53466
+pkg syscall (freebsd-riscv64), const IP_FW3 = 48 #53466
+pkg syscall (freebsd-riscv64), const IP_FW3 ideal-int #53466
+pkg syscall (freebsd-riscv64), const IP_FW_ADD = 50 #53466
+pkg syscall (freebsd-riscv64), const IP_FW_ADD ideal-int #53466
+pkg syscall (freebsd-riscv64), const IP_FW_DEL = 51 #53466
+pkg syscall (freebsd-riscv64), const IP_FW_DEL ideal-int #53466
+pkg syscall (freebsd-riscv64), const IP_FW_FLUSH = 52 #53466
+pkg syscall (freebsd-riscv64), const IP_FW_FLUSH ideal-int #53466
+pkg syscall (freebsd-riscv64), const IP_FW_GET = 54 #53466
+pkg syscall (freebsd-riscv64), const IP_FW_GET ideal-int #53466
+pkg syscall (freebsd-riscv64), const IP_FW_NAT_CFG = 56 #53466
+pkg syscall (freebsd-riscv64), const IP_FW_NAT_CFG ideal-int #53466
+pkg syscall (freebsd-riscv64), const IP_FW_NAT_DEL = 57 #53466
+pkg syscall (freebsd-riscv64), const IP_FW_NAT_DEL ideal-int #53466
+pkg syscall (freebsd-riscv64), const IP_FW_NAT_GET_CONFIG = 58 #53466
+pkg syscall (freebsd-riscv64), const IP_FW_NAT_GET_CONFIG ideal-int #53466
+pkg syscall (freebsd-riscv64), const IP_FW_NAT_GET_LOG = 59 #53466
+pkg syscall (freebsd-riscv64), const IP_FW_NAT_GET_LOG ideal-int #53466
+pkg syscall (freebsd-riscv64), const IP_FW_RESETLOG = 55 #53466
+pkg syscall (freebsd-riscv64), const IP_FW_RESETLOG ideal-int #53466
+pkg syscall (freebsd-riscv64), const IP_FW_TABLE_ADD = 40 #53466
+pkg syscall (freebsd-riscv64), const IP_FW_TABLE_ADD ideal-int #53466
+pkg syscall (freebsd-riscv64), const IP_FW_TABLE_DEL = 41 #53466
+pkg syscall (freebsd-riscv64), const IP_FW_TABLE_DEL ideal-int #53466
+pkg syscall (freebsd-riscv64), const IP_FW_TABLE_FLUSH = 42 #53466
+pkg syscall (freebsd-riscv64), const IP_FW_TABLE_FLUSH ideal-int #53466
+pkg syscall (freebsd-riscv64), const IP_FW_TABLE_GETSIZE = 43 #53466
+pkg syscall (freebsd-riscv64), const IP_FW_TABLE_GETSIZE ideal-int #53466
+pkg syscall (freebsd-riscv64), const IP_FW_TABLE_LIST = 44 #53466
+pkg syscall (freebsd-riscv64), const IP_FW_TABLE_LIST ideal-int #53466
+pkg syscall (freebsd-riscv64), const IP_FW_ZERO = 53 #53466
+pkg syscall (freebsd-riscv64), const IP_FW_ZERO ideal-int #53466
+pkg syscall (freebsd-riscv64), const IP_HDRINCL = 2 #53466
+pkg syscall (freebsd-riscv64), const IP_HDRINCL ideal-int #53466
+pkg syscall (freebsd-riscv64), const IP_IPSEC_POLICY = 21 #53466
+pkg syscall (freebsd-riscv64), const IP_IPSEC_POLICY ideal-int #53466
+pkg syscall (freebsd-riscv64), const IP_MAXPACKET = 65535 #53466
+pkg syscall (freebsd-riscv64), const IP_MAXPACKET ideal-int #53466
+pkg syscall (freebsd-riscv64), const IP_MAX_GROUP_SRC_FILTER = 512 #53466
+pkg syscall (freebsd-riscv64), const IP_MAX_GROUP_SRC_FILTER ideal-int #53466
+pkg syscall (freebsd-riscv64), const IP_MAX_MEMBERSHIPS = 4095 #53466
+pkg syscall (freebsd-riscv64), const IP_MAX_MEMBERSHIPS ideal-int #53466
+pkg syscall (freebsd-riscv64), const IP_MAX_SOCK_MUTE_FILTER = 128 #53466
+pkg syscall (freebsd-riscv64), const IP_MAX_SOCK_MUTE_FILTER ideal-int #53466
+pkg syscall (freebsd-riscv64), const IP_MAX_SOCK_SRC_FILTER = 128 #53466
+pkg syscall (freebsd-riscv64), const IP_MAX_SOCK_SRC_FILTER ideal-int #53466
+pkg syscall (freebsd-riscv64), const IP_MAX_SOURCE_FILTER = 1024 #53466
+pkg syscall (freebsd-riscv64), const IP_MAX_SOURCE_FILTER ideal-int #53466
+pkg syscall (freebsd-riscv64), const IP_MF = 8192 #53466
+pkg syscall (freebsd-riscv64), const IP_MF ideal-int #53466
+pkg syscall (freebsd-riscv64), const IP_MINTTL = 66 #53466
+pkg syscall (freebsd-riscv64), const IP_MINTTL ideal-int #53466
+pkg syscall (freebsd-riscv64), const IP_MIN_MEMBERSHIPS = 31 #53466
+pkg syscall (freebsd-riscv64), const IP_MIN_MEMBERSHIPS ideal-int #53466
+pkg syscall (freebsd-riscv64), const IP_MSFILTER = 74 #53466
+pkg syscall (freebsd-riscv64), const IP_MSFILTER ideal-int #53466
+pkg syscall (freebsd-riscv64), const IP_MSS = 576 #53466
+pkg syscall (freebsd-riscv64), const IP_MSS ideal-int #53466
+pkg syscall (freebsd-riscv64), const IP_MULTICAST_IF = 9 #53466
+pkg syscall (freebsd-riscv64), const IP_MULTICAST_LOOP = 11 #53466
+pkg syscall (freebsd-riscv64), const IP_MULTICAST_TTL = 10 #53466
+pkg syscall (freebsd-riscv64), const IP_MULTICAST_VIF = 14 #53466
+pkg syscall (freebsd-riscv64), const IP_MULTICAST_VIF ideal-int #53466
+pkg syscall (freebsd-riscv64), const IP_OFFMASK = 8191 #53466
+pkg syscall (freebsd-riscv64), const IP_OFFMASK ideal-int #53466
+pkg syscall (freebsd-riscv64), const IP_ONESBCAST = 23 #53466
+pkg syscall (freebsd-riscv64), const IP_ONESBCAST ideal-int #53466
+pkg syscall (freebsd-riscv64), const IP_OPTIONS = 1 #53466
+pkg syscall (freebsd-riscv64), const IP_OPTIONS ideal-int #53466
+pkg syscall (freebsd-riscv64), const IP_PORTRANGE = 19 #53466
+pkg syscall (freebsd-riscv64), const IP_PORTRANGE ideal-int #53466
+pkg syscall (freebsd-riscv64), const IP_PORTRANGE_DEFAULT = 0 #53466
+pkg syscall (freebsd-riscv64), const IP_PORTRANGE_DEFAULT ideal-int #53466
+pkg syscall (freebsd-riscv64), const IP_PORTRANGE_HIGH = 1 #53466
+pkg syscall (freebsd-riscv64), const IP_PORTRANGE_HIGH ideal-int #53466
+pkg syscall (freebsd-riscv64), const IP_PORTRANGE_LOW = 2 #53466
+pkg syscall (freebsd-riscv64), const IP_PORTRANGE_LOW ideal-int #53466
+pkg syscall (freebsd-riscv64), const IP_RECVDSTADDR = 7 #53466
+pkg syscall (freebsd-riscv64), const IP_RECVDSTADDR ideal-int #53466
+pkg syscall (freebsd-riscv64), const IP_RECVIF = 20 #53466
+pkg syscall (freebsd-riscv64), const IP_RECVIF ideal-int #53466
+pkg syscall (freebsd-riscv64), const IP_RECVOPTS = 5 #53466
+pkg syscall (freebsd-riscv64), const IP_RECVOPTS ideal-int #53466
+pkg syscall (freebsd-riscv64), const IP_RECVRETOPTS = 6 #53466
+pkg syscall (freebsd-riscv64), const IP_RECVRETOPTS ideal-int #53466
+pkg syscall (freebsd-riscv64), const IP_RECVTOS = 68 #53466
+pkg syscall (freebsd-riscv64), const IP_RECVTOS ideal-int #53466
+pkg syscall (freebsd-riscv64), const IP_RECVTTL = 65 #53466
+pkg syscall (freebsd-riscv64), const IP_RECVTTL ideal-int #53466
+pkg syscall (freebsd-riscv64), const IP_RETOPTS = 8 #53466
+pkg syscall (freebsd-riscv64), const IP_RETOPTS ideal-int #53466
+pkg syscall (freebsd-riscv64), const IP_RF = 32768 #53466
+pkg syscall (freebsd-riscv64), const IP_RF ideal-int #53466
+pkg syscall (freebsd-riscv64), const IP_RSVP_OFF = 16 #53466
+pkg syscall (freebsd-riscv64), const IP_RSVP_OFF ideal-int #53466
+pkg syscall (freebsd-riscv64), const IP_RSVP_ON = 15 #53466
+pkg syscall (freebsd-riscv64), const IP_RSVP_ON ideal-int #53466
+pkg syscall (freebsd-riscv64), const IP_RSVP_VIF_OFF = 18 #53466
+pkg syscall (freebsd-riscv64), const IP_RSVP_VIF_OFF ideal-int #53466
+pkg syscall (freebsd-riscv64), const IP_RSVP_VIF_ON = 17 #53466
+pkg syscall (freebsd-riscv64), const IP_RSVP_VIF_ON ideal-int #53466
+pkg syscall (freebsd-riscv64), const IP_SENDSRCADDR = 7 #53466
+pkg syscall (freebsd-riscv64), const IP_SENDSRCADDR ideal-int #53466
+pkg syscall (freebsd-riscv64), const IP_TOS = 3 #53466
+pkg syscall (freebsd-riscv64), const IP_TTL = 4 #53466
+pkg syscall (freebsd-riscv64), const IP_UNBLOCK_SOURCE = 73 #53466
+pkg syscall (freebsd-riscv64), const IP_UNBLOCK_SOURCE ideal-int #53466
+pkg syscall (freebsd-riscv64), const ISIG = 128 #53466
+pkg syscall (freebsd-riscv64), const ISIG ideal-int #53466
+pkg syscall (freebsd-riscv64), const ISTRIP = 32 #53466
+pkg syscall (freebsd-riscv64), const ISTRIP ideal-int #53466
+pkg syscall (freebsd-riscv64), const IXANY = 2048 #53466
+pkg syscall (freebsd-riscv64), const IXANY ideal-int #53466
+pkg syscall (freebsd-riscv64), const IXOFF = 1024 #53466
+pkg syscall (freebsd-riscv64), const IXOFF ideal-int #53466
+pkg syscall (freebsd-riscv64), const IXON = 512 #53466
+pkg syscall (freebsd-riscv64), const IXON ideal-int #53466
+pkg syscall (freebsd-riscv64), const LOCK_EX = 2 #53466
+pkg syscall (freebsd-riscv64), const LOCK_EX ideal-int #53466
+pkg syscall (freebsd-riscv64), const LOCK_NB = 4 #53466
+pkg syscall (freebsd-riscv64), const LOCK_NB ideal-int #53466
+pkg syscall (freebsd-riscv64), const LOCK_SH = 1 #53466
+pkg syscall (freebsd-riscv64), const LOCK_SH ideal-int #53466
+pkg syscall (freebsd-riscv64), const LOCK_UN = 8 #53466
+pkg syscall (freebsd-riscv64), const LOCK_UN ideal-int #53466
+pkg syscall (freebsd-riscv64), const MADV_AUTOSYNC = 7 #53466
+pkg syscall (freebsd-riscv64), const MADV_AUTOSYNC ideal-int #53466
+pkg syscall (freebsd-riscv64), const MADV_CORE = 9 #53466
+pkg syscall (freebsd-riscv64), const MADV_CORE ideal-int #53466
+pkg syscall (freebsd-riscv64), const MADV_DONTNEED = 4 #53466
+pkg syscall (freebsd-riscv64), const MADV_DONTNEED ideal-int #53466
+pkg syscall (freebsd-riscv64), const MADV_FREE = 5 #53466
+pkg syscall (freebsd-riscv64), const MADV_FREE ideal-int #53466
+pkg syscall (freebsd-riscv64), const MADV_NOCORE = 8 #53466
+pkg syscall (freebsd-riscv64), const MADV_NOCORE ideal-int #53466
+pkg syscall (freebsd-riscv64), const MADV_NORMAL = 0 #53466
+pkg syscall (freebsd-riscv64), const MADV_NORMAL ideal-int #53466
+pkg syscall (freebsd-riscv64), const MADV_NOSYNC = 6 #53466
+pkg syscall (freebsd-riscv64), const MADV_NOSYNC ideal-int #53466
+pkg syscall (freebsd-riscv64), const MADV_PROTECT = 10 #53466
+pkg syscall (freebsd-riscv64), const MADV_PROTECT ideal-int #53466
+pkg syscall (freebsd-riscv64), const MADV_RANDOM = 1 #53466
+pkg syscall (freebsd-riscv64), const MADV_RANDOM ideal-int #53466
+pkg syscall (freebsd-riscv64), const MADV_SEQUENTIAL = 2 #53466
+pkg syscall (freebsd-riscv64), const MADV_SEQUENTIAL ideal-int #53466
+pkg syscall (freebsd-riscv64), const MADV_WILLNEED = 3 #53466
+pkg syscall (freebsd-riscv64), const MADV_WILLNEED ideal-int #53466
+pkg syscall (freebsd-riscv64), const MAP_32BIT = 524288 #53466
+pkg syscall (freebsd-riscv64), const MAP_32BIT ideal-int #53466
+pkg syscall (freebsd-riscv64), const MAP_ALIGNED_SUPER = 16777216 #53466
+pkg syscall (freebsd-riscv64), const MAP_ALIGNED_SUPER ideal-int #53466
+pkg syscall (freebsd-riscv64), const MAP_ALIGNMENT_MASK = -16777216 #53466
+pkg syscall (freebsd-riscv64), const MAP_ALIGNMENT_MASK ideal-int #53466
+pkg syscall (freebsd-riscv64), const MAP_ALIGNMENT_SHIFT = 24 #53466
+pkg syscall (freebsd-riscv64), const MAP_ALIGNMENT_SHIFT ideal-int #53466
+pkg syscall (freebsd-riscv64), const MAP_ANON = 4096 #53466
+pkg syscall (freebsd-riscv64), const MAP_ANON ideal-int #53466
+pkg syscall (freebsd-riscv64), const MAP_ANONYMOUS = 4096 #53466
+pkg syscall (freebsd-riscv64), const MAP_ANONYMOUS ideal-int #53466
+pkg syscall (freebsd-riscv64), const MAP_COPY = 2 #53466
+pkg syscall (freebsd-riscv64), const MAP_COPY ideal-int #53466
+pkg syscall (freebsd-riscv64), const MAP_FILE = 0 #53466
+pkg syscall (freebsd-riscv64), const MAP_FILE ideal-int #53466
+pkg syscall (freebsd-riscv64), const MAP_FIXED = 16 #53466
+pkg syscall (freebsd-riscv64), const MAP_FIXED ideal-int #53466
+pkg syscall (freebsd-riscv64), const MAP_HASSEMAPHORE = 512 #53466
+pkg syscall (freebsd-riscv64), const MAP_HASSEMAPHORE ideal-int #53466
+pkg syscall (freebsd-riscv64), const MAP_NOCORE = 131072 #53466
+pkg syscall (freebsd-riscv64), const MAP_NOCORE ideal-int #53466
+pkg syscall (freebsd-riscv64), const MAP_NORESERVE = 64 #53466
+pkg syscall (freebsd-riscv64), const MAP_NORESERVE ideal-int #53466
+pkg syscall (freebsd-riscv64), const MAP_NOSYNC = 2048 #53466
+pkg syscall (freebsd-riscv64), const MAP_NOSYNC ideal-int #53466
+pkg syscall (freebsd-riscv64), const MAP_PREFAULT_READ = 262144 #53466
+pkg syscall (freebsd-riscv64), const MAP_PREFAULT_READ ideal-int #53466
+pkg syscall (freebsd-riscv64), const MAP_PRIVATE = 2 #53466
+pkg syscall (freebsd-riscv64), const MAP_PRIVATE ideal-int #53466
+pkg syscall (freebsd-riscv64), const MAP_RENAME = 32 #53466
+pkg syscall (freebsd-riscv64), const MAP_RENAME ideal-int #53466
+pkg syscall (freebsd-riscv64), const MAP_RESERVED0080 = 128 #53466
+pkg syscall (freebsd-riscv64), const MAP_RESERVED0080 ideal-int #53466
+pkg syscall (freebsd-riscv64), const MAP_RESERVED0100 = 256 #53466
+pkg syscall (freebsd-riscv64), const MAP_RESERVED0100 ideal-int #53466
+pkg syscall (freebsd-riscv64), const MAP_SHARED = 1 #53466
+pkg syscall (freebsd-riscv64), const MAP_SHARED ideal-int #53466
+pkg syscall (freebsd-riscv64), const MAP_STACK = 1024 #53466
+pkg syscall (freebsd-riscv64), const MAP_STACK ideal-int #53466
+pkg syscall (freebsd-riscv64), const MCL_CURRENT = 1 #53466
+pkg syscall (freebsd-riscv64), const MCL_CURRENT ideal-int #53466
+pkg syscall (freebsd-riscv64), const MCL_FUTURE = 2 #53466
+pkg syscall (freebsd-riscv64), const MCL_FUTURE ideal-int #53466
+pkg syscall (freebsd-riscv64), const MSG_CMSG_CLOEXEC = 262144 #53466
+pkg syscall (freebsd-riscv64), const MSG_CMSG_CLOEXEC ideal-int #53466
+pkg syscall (freebsd-riscv64), const MSG_COMPAT = 32768 #53466
+pkg syscall (freebsd-riscv64), const MSG_COMPAT ideal-int #53466
+pkg syscall (freebsd-riscv64), const MSG_CTRUNC = 32 #53466
+pkg syscall (freebsd-riscv64), const MSG_CTRUNC ideal-int #53466
+pkg syscall (freebsd-riscv64), const MSG_DONTROUTE = 4 #53466
+pkg syscall (freebsd-riscv64), const MSG_DONTROUTE ideal-int #53466
+pkg syscall (freebsd-riscv64), const MSG_DONTWAIT = 128 #53466
+pkg syscall (freebsd-riscv64), const MSG_DONTWAIT ideal-int #53466
+pkg syscall (freebsd-riscv64), const MSG_EOF = 256 #53466
+pkg syscall (freebsd-riscv64), const MSG_EOF ideal-int #53466
+pkg syscall (freebsd-riscv64), const MSG_EOR = 8 #53466
+pkg syscall (freebsd-riscv64), const MSG_EOR ideal-int #53466
+pkg syscall (freebsd-riscv64), const MSG_NBIO = 16384 #53466
+pkg syscall (freebsd-riscv64), const MSG_NBIO ideal-int #53466
+pkg syscall (freebsd-riscv64), const MSG_NOSIGNAL = 131072 #53466
+pkg syscall (freebsd-riscv64), const MSG_NOSIGNAL ideal-int #53466
+pkg syscall (freebsd-riscv64), const MSG_NOTIFICATION = 8192 #53466
+pkg syscall (freebsd-riscv64), const MSG_NOTIFICATION ideal-int #53466
+pkg syscall (freebsd-riscv64), const MSG_OOB = 1 #53466
+pkg syscall (freebsd-riscv64), const MSG_OOB ideal-int #53466
+pkg syscall (freebsd-riscv64), const MSG_PEEK = 2 #53466
+pkg syscall (freebsd-riscv64), const MSG_PEEK ideal-int #53466
+pkg syscall (freebsd-riscv64), const MSG_TRUNC = 16 #53466
+pkg syscall (freebsd-riscv64), const MSG_TRUNC ideal-int #53466
+pkg syscall (freebsd-riscv64), const MSG_WAITALL = 64 #53466
+pkg syscall (freebsd-riscv64), const MSG_WAITALL ideal-int #53466
+pkg syscall (freebsd-riscv64), const MS_ASYNC = 1 #53466
+pkg syscall (freebsd-riscv64), const MS_ASYNC ideal-int #53466
+pkg syscall (freebsd-riscv64), const MS_INVALIDATE = 2 #53466
+pkg syscall (freebsd-riscv64), const MS_INVALIDATE ideal-int #53466
+pkg syscall (freebsd-riscv64), const MS_SYNC = 0 #53466
+pkg syscall (freebsd-riscv64), const MS_SYNC ideal-int #53466
+pkg syscall (freebsd-riscv64), const NAME_MAX = 255 #53466
+pkg syscall (freebsd-riscv64), const NAME_MAX ideal-int #53466
+pkg syscall (freebsd-riscv64), const NET_RT_DUMP = 1 #53466
+pkg syscall (freebsd-riscv64), const NET_RT_DUMP ideal-int #53466
+pkg syscall (freebsd-riscv64), const NET_RT_FLAGS = 2 #53466
+pkg syscall (freebsd-riscv64), const NET_RT_FLAGS ideal-int #53466
+pkg syscall (freebsd-riscv64), const NET_RT_IFLIST = 3 #53466
+pkg syscall (freebsd-riscv64), const NET_RT_IFLIST ideal-int #53466
+pkg syscall (freebsd-riscv64), const NET_RT_IFLISTL = 5 #53466
+pkg syscall (freebsd-riscv64), const NET_RT_IFLISTL ideal-int #53466
+pkg syscall (freebsd-riscv64), const NET_RT_IFMALIST = 4 #53466
+pkg syscall (freebsd-riscv64), const NET_RT_IFMALIST ideal-int #53466
+pkg syscall (freebsd-riscv64), const NET_RT_MAXID = 6 #53466
+pkg syscall (freebsd-riscv64), const NET_RT_MAXID ideal-int #53466
+pkg syscall (freebsd-riscv64), const NOFLSH = 2147483648 #53466
+pkg syscall (freebsd-riscv64), const NOFLSH ideal-int #53466
+pkg syscall (freebsd-riscv64), const NOTE_ATTRIB = 8 #53466
+pkg syscall (freebsd-riscv64), const NOTE_ATTRIB ideal-int #53466
+pkg syscall (freebsd-riscv64), const NOTE_CHILD = 4 #53466
+pkg syscall (freebsd-riscv64), const NOTE_CHILD ideal-int #53466
+pkg syscall (freebsd-riscv64), const NOTE_DELETE = 1 #53466
+pkg syscall (freebsd-riscv64), const NOTE_DELETE ideal-int #53466
+pkg syscall (freebsd-riscv64), const NOTE_EXEC = 536870912 #53466
+pkg syscall (freebsd-riscv64), const NOTE_EXEC ideal-int #53466
+pkg syscall (freebsd-riscv64), const NOTE_EXIT = 2147483648 #53466
+pkg syscall (freebsd-riscv64), const NOTE_EXIT ideal-int #53466
+pkg syscall (freebsd-riscv64), const NOTE_EXTEND = 4 #53466
+pkg syscall (freebsd-riscv64), const NOTE_EXTEND ideal-int #53466
+pkg syscall (freebsd-riscv64), const NOTE_FFAND = 1073741824 #53466
+pkg syscall (freebsd-riscv64), const NOTE_FFAND ideal-int #53466
+pkg syscall (freebsd-riscv64), const NOTE_FFCOPY = 3221225472 #53466
+pkg syscall (freebsd-riscv64), const NOTE_FFCOPY ideal-int #53466
+pkg syscall (freebsd-riscv64), const NOTE_FFCTRLMASK = 3221225472 #53466
+pkg syscall (freebsd-riscv64), const NOTE_FFCTRLMASK ideal-int #53466
+pkg syscall (freebsd-riscv64), const NOTE_FFLAGSMASK = 16777215 #53466
+pkg syscall (freebsd-riscv64), const NOTE_FFLAGSMASK ideal-int #53466
+pkg syscall (freebsd-riscv64), const NOTE_FFNOP = 0 #53466
+pkg syscall (freebsd-riscv64), const NOTE_FFNOP ideal-int #53466
+pkg syscall (freebsd-riscv64), const NOTE_FFOR = 2147483648 #53466
+pkg syscall (freebsd-riscv64), const NOTE_FFOR ideal-int #53466
+pkg syscall (freebsd-riscv64), const NOTE_FORK = 1073741824 #53466
+pkg syscall (freebsd-riscv64), const NOTE_FORK ideal-int #53466
+pkg syscall (freebsd-riscv64), const NOTE_LINK = 16 #53466
+pkg syscall (freebsd-riscv64), const NOTE_LINK ideal-int #53466
+pkg syscall (freebsd-riscv64), const NOTE_LOWAT = 1 #53466
+pkg syscall (freebsd-riscv64), const NOTE_LOWAT ideal-int #53466
+pkg syscall (freebsd-riscv64), const NOTE_PCTRLMASK = 4026531840 #53466
+pkg syscall (freebsd-riscv64), const NOTE_PCTRLMASK ideal-int #53466
+pkg syscall (freebsd-riscv64), const NOTE_PDATAMASK = 1048575 #53466
+pkg syscall (freebsd-riscv64), const NOTE_PDATAMASK ideal-int #53466
+pkg syscall (freebsd-riscv64), const NOTE_RENAME = 32 #53466
+pkg syscall (freebsd-riscv64), const NOTE_RENAME ideal-int #53466
+pkg syscall (freebsd-riscv64), const NOTE_REVOKE = 64 #53466
+pkg syscall (freebsd-riscv64), const NOTE_REVOKE ideal-int #53466
+pkg syscall (freebsd-riscv64), const NOTE_TRACK = 1 #53466
+pkg syscall (freebsd-riscv64), const NOTE_TRACK ideal-int #53466
+pkg syscall (freebsd-riscv64), const NOTE_TRACKERR = 2 #53466
+pkg syscall (freebsd-riscv64), const NOTE_TRACKERR ideal-int #53466
+pkg syscall (freebsd-riscv64), const NOTE_TRIGGER = 16777216 #53466
+pkg syscall (freebsd-riscv64), const NOTE_TRIGGER ideal-int #53466
+pkg syscall (freebsd-riscv64), const NOTE_WRITE = 2 #53466
+pkg syscall (freebsd-riscv64), const NOTE_WRITE ideal-int #53466
+pkg syscall (freebsd-riscv64), const OCRNL = 16 #53466
+pkg syscall (freebsd-riscv64), const OCRNL ideal-int #53466
+pkg syscall (freebsd-riscv64), const ONLCR = 2 #53466
+pkg syscall (freebsd-riscv64), const ONLCR ideal-int #53466
+pkg syscall (freebsd-riscv64), const ONLRET = 64 #53466
+pkg syscall (freebsd-riscv64), const ONLRET ideal-int #53466
+pkg syscall (freebsd-riscv64), const ONOCR = 32 #53466
+pkg syscall (freebsd-riscv64), const ONOCR ideal-int #53466
+pkg syscall (freebsd-riscv64), const ONOEOT = 8 #53466
+pkg syscall (freebsd-riscv64), const ONOEOT ideal-int #53466
+pkg syscall (freebsd-riscv64), const OPOST = 1 #53466
+pkg syscall (freebsd-riscv64), const OPOST ideal-int #53466
+pkg syscall (freebsd-riscv64), const O_ACCMODE = 3 #53466
+pkg syscall (freebsd-riscv64), const O_ACCMODE ideal-int #53466
+pkg syscall (freebsd-riscv64), const O_APPEND = 8 #53466
+pkg syscall (freebsd-riscv64), const O_ASYNC = 64 #53466
+pkg syscall (freebsd-riscv64), const O_CLOEXEC = 1048576 #53466
+pkg syscall (freebsd-riscv64), const O_CREAT = 512 #53466
+pkg syscall (freebsd-riscv64), const O_DIRECT = 65536 #53466
+pkg syscall (freebsd-riscv64), const O_DIRECT ideal-int #53466
+pkg syscall (freebsd-riscv64), const O_DIRECTORY = 131072 #53466
+pkg syscall (freebsd-riscv64), const O_DIRECTORY ideal-int #53466
+pkg syscall (freebsd-riscv64), const O_EXCL = 2048 #53466
+pkg syscall (freebsd-riscv64), const O_EXEC = 262144 #53466
+pkg syscall (freebsd-riscv64), const O_EXEC ideal-int #53466
+pkg syscall (freebsd-riscv64), const O_EXLOCK = 32 #53466
+pkg syscall (freebsd-riscv64), const O_EXLOCK ideal-int #53466
+pkg syscall (freebsd-riscv64), const O_FSYNC = 128 #53466
+pkg syscall (freebsd-riscv64), const O_FSYNC ideal-int #53466
+pkg syscall (freebsd-riscv64), const O_NDELAY = 4 #53466
+pkg syscall (freebsd-riscv64), const O_NDELAY ideal-int #53466
+pkg syscall (freebsd-riscv64), const O_NOCTTY = 32768 #53466
+pkg syscall (freebsd-riscv64), const O_NOFOLLOW = 256 #53466
+pkg syscall (freebsd-riscv64), const O_NOFOLLOW ideal-int #53466
+pkg syscall (freebsd-riscv64), const O_NONBLOCK = 4 #53466
+pkg syscall (freebsd-riscv64), const O_SHLOCK = 16 #53466
+pkg syscall (freebsd-riscv64), const O_SHLOCK ideal-int #53466
+pkg syscall (freebsd-riscv64), const O_SYNC = 128 #53466
+pkg syscall (freebsd-riscv64), const O_TRUNC = 1024 #53466
+pkg syscall (freebsd-riscv64), const O_TTY_INIT = 524288 #53466
+pkg syscall (freebsd-riscv64), const O_TTY_INIT ideal-int #53466
+pkg syscall (freebsd-riscv64), const PARENB = 4096 #53466
+pkg syscall (freebsd-riscv64), const PARENB ideal-int #53466
+pkg syscall (freebsd-riscv64), const PARMRK = 8 #53466
+pkg syscall (freebsd-riscv64), const PARMRK ideal-int #53466
+pkg syscall (freebsd-riscv64), const PARODD = 8192 #53466
+pkg syscall (freebsd-riscv64), const PARODD ideal-int #53466
+pkg syscall (freebsd-riscv64), const PENDIN = 536870912 #53466
+pkg syscall (freebsd-riscv64), const PENDIN ideal-int #53466
+pkg syscall (freebsd-riscv64), const PRIO_PGRP = 1 #53466
+pkg syscall (freebsd-riscv64), const PRIO_PGRP ideal-int #53466
+pkg syscall (freebsd-riscv64), const PRIO_PROCESS = 0 #53466
+pkg syscall (freebsd-riscv64), const PRIO_PROCESS ideal-int #53466
+pkg syscall (freebsd-riscv64), const PRIO_USER = 2 #53466
+pkg syscall (freebsd-riscv64), const PRIO_USER ideal-int #53466
+pkg syscall (freebsd-riscv64), const PROT_EXEC = 4 #53466
+pkg syscall (freebsd-riscv64), const PROT_EXEC ideal-int #53466
+pkg syscall (freebsd-riscv64), const PROT_NONE = 0 #53466
+pkg syscall (freebsd-riscv64), const PROT_NONE ideal-int #53466
+pkg syscall (freebsd-riscv64), const PROT_READ = 1 #53466
+pkg syscall (freebsd-riscv64), const PROT_READ ideal-int #53466
+pkg syscall (freebsd-riscv64), const PROT_WRITE = 2 #53466
+pkg syscall (freebsd-riscv64), const PROT_WRITE ideal-int #53466
+pkg syscall (freebsd-riscv64), const PTRACE_CONT = 7 #53466
+pkg syscall (freebsd-riscv64), const PTRACE_CONT ideal-int #53466
+pkg syscall (freebsd-riscv64), const PTRACE_KILL = 8 #53466
+pkg syscall (freebsd-riscv64), const PTRACE_KILL ideal-int #53466
+pkg syscall (freebsd-riscv64), const PTRACE_TRACEME = 0 #53466
+pkg syscall (freebsd-riscv64), const PTRACE_TRACEME ideal-int #53466
+pkg syscall (freebsd-riscv64), const RLIMIT_AS = 10 #53466
+pkg syscall (freebsd-riscv64), const RLIMIT_AS ideal-int #53466
+pkg syscall (freebsd-riscv64), const RLIMIT_CORE = 4 #53466
+pkg syscall (freebsd-riscv64), const RLIMIT_CORE ideal-int #53466
+pkg syscall (freebsd-riscv64), const RLIMIT_CPU = 0 #53466
+pkg syscall (freebsd-riscv64), const RLIMIT_CPU ideal-int #53466
+pkg syscall (freebsd-riscv64), const RLIMIT_DATA = 2 #53466
+pkg syscall (freebsd-riscv64), const RLIMIT_DATA ideal-int #53466
+pkg syscall (freebsd-riscv64), const RLIMIT_FSIZE = 1 #53466
+pkg syscall (freebsd-riscv64), const RLIMIT_FSIZE ideal-int #53466
+pkg syscall (freebsd-riscv64), const RLIMIT_NOFILE = 8 #53466
+pkg syscall (freebsd-riscv64), const RLIMIT_NOFILE ideal-int #53466
+pkg syscall (freebsd-riscv64), const RLIMIT_STACK = 3 #53466
+pkg syscall (freebsd-riscv64), const RLIMIT_STACK ideal-int #53466
+pkg syscall (freebsd-riscv64), const RLIM_INFINITY = 9223372036854775807 #53466
+pkg syscall (freebsd-riscv64), const RLIM_INFINITY ideal-int #53466
+pkg syscall (freebsd-riscv64), const RTAX_AUTHOR = 6 #53466
+pkg syscall (freebsd-riscv64), const RTAX_AUTHOR ideal-int #53466
+pkg syscall (freebsd-riscv64), const RTAX_BRD = 7 #53466
+pkg syscall (freebsd-riscv64), const RTAX_BRD ideal-int #53466
+pkg syscall (freebsd-riscv64), const RTAX_DST = 0 #53466
+pkg syscall (freebsd-riscv64), const RTAX_DST ideal-int #53466
+pkg syscall (freebsd-riscv64), const RTAX_GATEWAY = 1 #53466
+pkg syscall (freebsd-riscv64), const RTAX_GATEWAY ideal-int #53466
+pkg syscall (freebsd-riscv64), const RTAX_GENMASK = 3 #53466
+pkg syscall (freebsd-riscv64), const RTAX_GENMASK ideal-int #53466
+pkg syscall (freebsd-riscv64), const RTAX_IFA = 5 #53466
+pkg syscall (freebsd-riscv64), const RTAX_IFA ideal-int #53466
+pkg syscall (freebsd-riscv64), const RTAX_IFP = 4 #53466
+pkg syscall (freebsd-riscv64), const RTAX_IFP ideal-int #53466
+pkg syscall (freebsd-riscv64), const RTAX_MAX = 8 #53466
+pkg syscall (freebsd-riscv64), const RTAX_MAX ideal-int #53466
+pkg syscall (freebsd-riscv64), const RTAX_NETMASK = 2 #53466
+pkg syscall (freebsd-riscv64), const RTAX_NETMASK ideal-int #53466
+pkg syscall (freebsd-riscv64), const RTA_AUTHOR = 64 #53466
+pkg syscall (freebsd-riscv64), const RTA_AUTHOR ideal-int #53466
+pkg syscall (freebsd-riscv64), const RTA_BRD = 128 #53466
+pkg syscall (freebsd-riscv64), const RTA_BRD ideal-int #53466
+pkg syscall (freebsd-riscv64), const RTA_DST = 1 #53466
+pkg syscall (freebsd-riscv64), const RTA_DST ideal-int #53466
+pkg syscall (freebsd-riscv64), const RTA_GATEWAY = 2 #53466
+pkg syscall (freebsd-riscv64), const RTA_GATEWAY ideal-int #53466
+pkg syscall (freebsd-riscv64), const RTA_GENMASK = 8 #53466
+pkg syscall (freebsd-riscv64), const RTA_GENMASK ideal-int #53466
+pkg syscall (freebsd-riscv64), const RTA_IFA = 32 #53466
+pkg syscall (freebsd-riscv64), const RTA_IFA ideal-int #53466
+pkg syscall (freebsd-riscv64), const RTA_IFP = 16 #53466
+pkg syscall (freebsd-riscv64), const RTA_IFP ideal-int #53466
+pkg syscall (freebsd-riscv64), const RTA_NETMASK = 4 #53466
+pkg syscall (freebsd-riscv64), const RTA_NETMASK ideal-int #53466
+pkg syscall (freebsd-riscv64), const RTF_BLACKHOLE = 4096 #53466
+pkg syscall (freebsd-riscv64), const RTF_BLACKHOLE ideal-int #53466
+pkg syscall (freebsd-riscv64), const RTF_BROADCAST = 4194304 #53466
+pkg syscall (freebsd-riscv64), const RTF_BROADCAST ideal-int #53466
+pkg syscall (freebsd-riscv64), const RTF_DONE = 64 #53466
+pkg syscall (freebsd-riscv64), const RTF_DONE ideal-int #53466
+pkg syscall (freebsd-riscv64), const RTF_DYNAMIC = 16 #53466
+pkg syscall (freebsd-riscv64), const RTF_DYNAMIC ideal-int #53466
+pkg syscall (freebsd-riscv64), const RTF_FMASK = 268752904 #53466
+pkg syscall (freebsd-riscv64), const RTF_FMASK ideal-int #53466
+pkg syscall (freebsd-riscv64), const RTF_GATEWAY = 2 #53466
+pkg syscall (freebsd-riscv64), const RTF_GATEWAY ideal-int #53466
+pkg syscall (freebsd-riscv64), const RTF_GWFLAG_COMPAT = 2147483648 #53466
+pkg syscall (freebsd-riscv64), const RTF_GWFLAG_COMPAT ideal-int #53466
+pkg syscall (freebsd-riscv64), const RTF_HOST = 4 #53466
+pkg syscall (freebsd-riscv64), const RTF_HOST ideal-int #53466
+pkg syscall (freebsd-riscv64), const RTF_LLDATA = 1024 #53466
+pkg syscall (freebsd-riscv64), const RTF_LLDATA ideal-int #53466
+pkg syscall (freebsd-riscv64), const RTF_LLINFO = 1024 #53466
+pkg syscall (freebsd-riscv64), const RTF_LLINFO ideal-int #53466
+pkg syscall (freebsd-riscv64), const RTF_LOCAL = 2097152 #53466
+pkg syscall (freebsd-riscv64), const RTF_LOCAL ideal-int #53466
+pkg syscall (freebsd-riscv64), const RTF_MODIFIED = 32 #53466
+pkg syscall (freebsd-riscv64), const RTF_MODIFIED ideal-int #53466
+pkg syscall (freebsd-riscv64), const RTF_MULTICAST = 8388608 #53466
+pkg syscall (freebsd-riscv64), const RTF_MULTICAST ideal-int #53466
+pkg syscall (freebsd-riscv64), const RTF_PINNED = 1048576 #53466
+pkg syscall (freebsd-riscv64), const RTF_PINNED ideal-int #53466
+pkg syscall (freebsd-riscv64), const RTF_PRCLONING = 65536 #53466
+pkg syscall (freebsd-riscv64), const RTF_PRCLONING ideal-int #53466
+pkg syscall (freebsd-riscv64), const RTF_PROTO1 = 32768 #53466
+pkg syscall (freebsd-riscv64), const RTF_PROTO1 ideal-int #53466
+pkg syscall (freebsd-riscv64), const RTF_PROTO2 = 16384 #53466
+pkg syscall (freebsd-riscv64), const RTF_PROTO2 ideal-int #53466
+pkg syscall (freebsd-riscv64), const RTF_PROTO3 = 262144 #53466
+pkg syscall (freebsd-riscv64), const RTF_PROTO3 ideal-int #53466
+pkg syscall (freebsd-riscv64), const RTF_REJECT = 8 #53466
+pkg syscall (freebsd-riscv64), const RTF_REJECT ideal-int #53466
+pkg syscall (freebsd-riscv64), const RTF_RNH_LOCKED = 1073741824 #53466
+pkg syscall (freebsd-riscv64), const RTF_RNH_LOCKED ideal-int #53466
+pkg syscall (freebsd-riscv64), const RTF_STATIC = 2048 #53466
+pkg syscall (freebsd-riscv64), const RTF_STATIC ideal-int #53466
+pkg syscall (freebsd-riscv64), const RTF_STICKY = 268435456 #53466
+pkg syscall (freebsd-riscv64), const RTF_STICKY ideal-int #53466
+pkg syscall (freebsd-riscv64), const RTF_UP = 1 #53466
+pkg syscall (freebsd-riscv64), const RTF_UP ideal-int #53466
+pkg syscall (freebsd-riscv64), const RTF_XRESOLVE = 512 #53466
+pkg syscall (freebsd-riscv64), const RTF_XRESOLVE ideal-int #53466
+pkg syscall (freebsd-riscv64), const RTM_ADD = 1 #53466
+pkg syscall (freebsd-riscv64), const RTM_ADD ideal-int #53466
+pkg syscall (freebsd-riscv64), const RTM_CHANGE = 3 #53466
+pkg syscall (freebsd-riscv64), const RTM_CHANGE ideal-int #53466
+pkg syscall (freebsd-riscv64), const RTM_DELADDR = 13 #53466
+pkg syscall (freebsd-riscv64), const RTM_DELADDR ideal-int #53466
+pkg syscall (freebsd-riscv64), const RTM_DELETE = 2 #53466
+pkg syscall (freebsd-riscv64), const RTM_DELETE ideal-int #53466
+pkg syscall (freebsd-riscv64), const RTM_DELMADDR = 16 #53466
+pkg syscall (freebsd-riscv64), const RTM_DELMADDR ideal-int #53466
+pkg syscall (freebsd-riscv64), const RTM_GET = 4 #53466
+pkg syscall (freebsd-riscv64), const RTM_GET ideal-int #53466
+pkg syscall (freebsd-riscv64), const RTM_IEEE80211 = 18 #53466
+pkg syscall (freebsd-riscv64), const RTM_IEEE80211 ideal-int #53466
+pkg syscall (freebsd-riscv64), const RTM_IFANNOUNCE = 17 #53466
+pkg syscall (freebsd-riscv64), const RTM_IFANNOUNCE ideal-int #53466
+pkg syscall (freebsd-riscv64), const RTM_IFINFO = 14 #53466
+pkg syscall (freebsd-riscv64), const RTM_IFINFO ideal-int #53466
+pkg syscall (freebsd-riscv64), const RTM_LOCK = 8 #53466
+pkg syscall (freebsd-riscv64), const RTM_LOCK ideal-int #53466
+pkg syscall (freebsd-riscv64), const RTM_LOSING = 5 #53466
+pkg syscall (freebsd-riscv64), const RTM_LOSING ideal-int #53466
+pkg syscall (freebsd-riscv64), const RTM_MISS = 7 #53466
+pkg syscall (freebsd-riscv64), const RTM_MISS ideal-int #53466
+pkg syscall (freebsd-riscv64), const RTM_NEWADDR = 12 #53466
+pkg syscall (freebsd-riscv64), const RTM_NEWADDR ideal-int #53466
+pkg syscall (freebsd-riscv64), const RTM_NEWMADDR = 15 #53466
+pkg syscall (freebsd-riscv64), const RTM_NEWMADDR ideal-int #53466
+pkg syscall (freebsd-riscv64), const RTM_OLDADD = 9 #53466
+pkg syscall (freebsd-riscv64), const RTM_OLDADD ideal-int #53466
+pkg syscall (freebsd-riscv64), const RTM_OLDDEL = 10 #53466
+pkg syscall (freebsd-riscv64), const RTM_OLDDEL ideal-int #53466
+pkg syscall (freebsd-riscv64), const RTM_REDIRECT = 6 #53466
+pkg syscall (freebsd-riscv64), const RTM_REDIRECT ideal-int #53466
+pkg syscall (freebsd-riscv64), const RTM_RESOLVE = 11 #53466
+pkg syscall (freebsd-riscv64), const RTM_RESOLVE ideal-int #53466
+pkg syscall (freebsd-riscv64), const RTM_RTTUNIT = 1000000 #53466
+pkg syscall (freebsd-riscv64), const RTM_RTTUNIT ideal-int #53466
+pkg syscall (freebsd-riscv64), const RTM_VERSION = 5 #53466
+pkg syscall (freebsd-riscv64), const RTM_VERSION ideal-int #53466
+pkg syscall (freebsd-riscv64), const RTV_EXPIRE = 4 #53466
+pkg syscall (freebsd-riscv64), const RTV_EXPIRE ideal-int #53466
+pkg syscall (freebsd-riscv64), const RTV_HOPCOUNT = 2 #53466
+pkg syscall (freebsd-riscv64), const RTV_HOPCOUNT ideal-int #53466
+pkg syscall (freebsd-riscv64), const RTV_MTU = 1 #53466
+pkg syscall (freebsd-riscv64), const RTV_MTU ideal-int #53466
+pkg syscall (freebsd-riscv64), const RTV_RPIPE = 8 #53466
+pkg syscall (freebsd-riscv64), const RTV_RPIPE ideal-int #53466
+pkg syscall (freebsd-riscv64), const RTV_RTT = 64 #53466
+pkg syscall (freebsd-riscv64), const RTV_RTT ideal-int #53466
+pkg syscall (freebsd-riscv64), const RTV_RTTVAR = 128 #53466
+pkg syscall (freebsd-riscv64), const RTV_RTTVAR ideal-int #53466
+pkg syscall (freebsd-riscv64), const RTV_SPIPE = 16 #53466
+pkg syscall (freebsd-riscv64), const RTV_SPIPE ideal-int #53466
+pkg syscall (freebsd-riscv64), const RTV_SSTHRESH = 32 #53466
+pkg syscall (freebsd-riscv64), const RTV_SSTHRESH ideal-int #53466
+pkg syscall (freebsd-riscv64), const RTV_WEIGHT = 256 #53466
+pkg syscall (freebsd-riscv64), const RTV_WEIGHT ideal-int #53466
+pkg syscall (freebsd-riscv64), const RT_CACHING_CONTEXT = 1 #53466
+pkg syscall (freebsd-riscv64), const RT_CACHING_CONTEXT ideal-int #53466
+pkg syscall (freebsd-riscv64), const RT_DEFAULT_FIB = 0 #53466
+pkg syscall (freebsd-riscv64), const RT_DEFAULT_FIB ideal-int #53466
+pkg syscall (freebsd-riscv64), const RT_NORTREF = 2 #53466
+pkg syscall (freebsd-riscv64), const RT_NORTREF ideal-int #53466
+pkg syscall (freebsd-riscv64), const RUSAGE_CHILDREN = -1 #53466
+pkg syscall (freebsd-riscv64), const RUSAGE_CHILDREN ideal-int #53466
+pkg syscall (freebsd-riscv64), const RUSAGE_SELF = 0 #53466
+pkg syscall (freebsd-riscv64), const RUSAGE_SELF ideal-int #53466
+pkg syscall (freebsd-riscv64), const RUSAGE_THREAD = 1 #53466
+pkg syscall (freebsd-riscv64), const RUSAGE_THREAD ideal-int #53466
+pkg syscall (freebsd-riscv64), const SCM_BINTIME = 4 #53466
+pkg syscall (freebsd-riscv64), const SCM_BINTIME ideal-int #53466
+pkg syscall (freebsd-riscv64), const SCM_CREDS = 3 #53466
+pkg syscall (freebsd-riscv64), const SCM_CREDS ideal-int #53466
+pkg syscall (freebsd-riscv64), const SCM_RIGHTS = 1 #53466
+pkg syscall (freebsd-riscv64), const SCM_RIGHTS ideal-int #53466
+pkg syscall (freebsd-riscv64), const SCM_TIMESTAMP = 2 #53466
+pkg syscall (freebsd-riscv64), const SCM_TIMESTAMP ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIGBUS = 10 #53466
+pkg syscall (freebsd-riscv64), const SIGCHLD = 20 #53466
+pkg syscall (freebsd-riscv64), const SIGCHLD Signal #53466
+pkg syscall (freebsd-riscv64), const SIGCONT = 19 #53466
+pkg syscall (freebsd-riscv64), const SIGCONT Signal #53466
+pkg syscall (freebsd-riscv64), const SIGEMT = 7 #53466
+pkg syscall (freebsd-riscv64), const SIGEMT Signal #53466
+pkg syscall (freebsd-riscv64), const SIGINFO = 29 #53466
+pkg syscall (freebsd-riscv64), const SIGINFO Signal #53466
+pkg syscall (freebsd-riscv64), const SIGIO = 23 #53466
+pkg syscall (freebsd-riscv64), const SIGIO Signal #53466
+pkg syscall (freebsd-riscv64), const SIGIOT = 6 #53466
+pkg syscall (freebsd-riscv64), const SIGIOT Signal #53466
+pkg syscall (freebsd-riscv64), const SIGLIBRT = 33 #53466
+pkg syscall (freebsd-riscv64), const SIGLIBRT Signal #53466
+pkg syscall (freebsd-riscv64), const SIGLWP = 32 #53466
+pkg syscall (freebsd-riscv64), const SIGLWP Signal #53466
+pkg syscall (freebsd-riscv64), const SIGPROF = 27 #53466
+pkg syscall (freebsd-riscv64), const SIGPROF Signal #53466
+pkg syscall (freebsd-riscv64), const SIGSTOP = 17 #53466
+pkg syscall (freebsd-riscv64), const SIGSTOP Signal #53466
+pkg syscall (freebsd-riscv64), const SIGSYS = 12 #53466
+pkg syscall (freebsd-riscv64), const SIGSYS Signal #53466
+pkg syscall (freebsd-riscv64), const SIGTHR = 32 #53466
+pkg syscall (freebsd-riscv64), const SIGTHR Signal #53466
+pkg syscall (freebsd-riscv64), const SIGTSTP = 18 #53466
+pkg syscall (freebsd-riscv64), const SIGTSTP Signal #53466
+pkg syscall (freebsd-riscv64), const SIGTTIN = 21 #53466
+pkg syscall (freebsd-riscv64), const SIGTTIN Signal #53466
+pkg syscall (freebsd-riscv64), const SIGTTOU = 22 #53466
+pkg syscall (freebsd-riscv64), const SIGTTOU Signal #53466
+pkg syscall (freebsd-riscv64), const SIGURG = 16 #53466
+pkg syscall (freebsd-riscv64), const SIGURG Signal #53466
+pkg syscall (freebsd-riscv64), const SIGUSR1 = 30 #53466
+pkg syscall (freebsd-riscv64), const SIGUSR1 Signal #53466
+pkg syscall (freebsd-riscv64), const SIGUSR2 = 31 #53466
+pkg syscall (freebsd-riscv64), const SIGUSR2 Signal #53466
+pkg syscall (freebsd-riscv64), const SIGVTALRM = 26 #53466
+pkg syscall (freebsd-riscv64), const SIGVTALRM Signal #53466
+pkg syscall (freebsd-riscv64), const SIGWINCH = 28 #53466
+pkg syscall (freebsd-riscv64), const SIGWINCH Signal #53466
+pkg syscall (freebsd-riscv64), const SIGXCPU = 24 #53466
+pkg syscall (freebsd-riscv64), const SIGXCPU Signal #53466
+pkg syscall (freebsd-riscv64), const SIGXFSZ = 25 #53466
+pkg syscall (freebsd-riscv64), const SIGXFSZ Signal #53466
+pkg syscall (freebsd-riscv64), const SIOCADDMULTI = 2149607729 #53466
+pkg syscall (freebsd-riscv64), const SIOCADDMULTI ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIOCADDRT = 2151707146 #53466
+pkg syscall (freebsd-riscv64), const SIOCADDRT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIOCAIFADDR = 2151704858 #53466
+pkg syscall (freebsd-riscv64), const SIOCAIFADDR ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIOCAIFGROUP = 2150132103 #53466
+pkg syscall (freebsd-riscv64), const SIOCAIFGROUP ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIOCALIFADDR = 2165860635 #53466
+pkg syscall (freebsd-riscv64), const SIOCALIFADDR ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIOCATMARK = 1074033415 #53466
+pkg syscall (freebsd-riscv64), const SIOCATMARK ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIOCDELMULTI = 2149607730 #53466
+pkg syscall (freebsd-riscv64), const SIOCDELMULTI ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIOCDELRT = 2151707147 #53466
+pkg syscall (freebsd-riscv64), const SIOCDELRT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIOCDIFADDR = 2149607705 #53466
+pkg syscall (freebsd-riscv64), const SIOCDIFADDR ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIOCDIFGROUP = 2150132105 #53466
+pkg syscall (freebsd-riscv64), const SIOCDIFGROUP ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIOCDIFPHYADDR = 2149607753 #53466
+pkg syscall (freebsd-riscv64), const SIOCDIFPHYADDR ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIOCDLIFADDR = 2165860637 #53466
+pkg syscall (freebsd-riscv64), const SIOCDLIFADDR ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIOCGDRVSPEC = 3223873915 #53466
+pkg syscall (freebsd-riscv64), const SIOCGDRVSPEC ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIOCGETSGCNT = 3223351824 #53466
+pkg syscall (freebsd-riscv64), const SIOCGETSGCNT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIOCGETVIFCNT = 3223876111 #53466
+pkg syscall (freebsd-riscv64), const SIOCGETVIFCNT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIOCGHIWAT = 1074033409 #53466
+pkg syscall (freebsd-riscv64), const SIOCGHIWAT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIOCGIFADDR = 3223349537 #53466
+pkg syscall (freebsd-riscv64), const SIOCGIFADDR ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIOCGIFBRDADDR = 3223349539 #53466
+pkg syscall (freebsd-riscv64), const SIOCGIFBRDADDR ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIOCGIFCAP = 3223349535 #53466
+pkg syscall (freebsd-riscv64), const SIOCGIFCAP ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIOCGIFCONF = 3222300964 #53466
+pkg syscall (freebsd-riscv64), const SIOCGIFCONF ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIOCGIFDESCR = 3223349546 #53466
+pkg syscall (freebsd-riscv64), const SIOCGIFDESCR ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIOCGIFDSTADDR = 3223349538 #53466
+pkg syscall (freebsd-riscv64), const SIOCGIFDSTADDR ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIOCGIFFIB = 3223349596 #53466
+pkg syscall (freebsd-riscv64), const SIOCGIFFIB ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIOCGIFFLAGS = 3223349521 #53466
+pkg syscall (freebsd-riscv64), const SIOCGIFFLAGS ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIOCGIFGENERIC = 3223349562 #53466
+pkg syscall (freebsd-riscv64), const SIOCGIFGENERIC ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIOCGIFGMEMB = 3223873930 #53466
+pkg syscall (freebsd-riscv64), const SIOCGIFGMEMB ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIOCGIFGROUP = 3223873928 #53466
+pkg syscall (freebsd-riscv64), const SIOCGIFGROUP ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIOCGIFINDEX = 3223349536 #53466
+pkg syscall (freebsd-riscv64), const SIOCGIFINDEX ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIOCGIFMAC = 3223349542 #53466
+pkg syscall (freebsd-riscv64), const SIOCGIFMAC ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIOCGIFMEDIA = 3224398136 #53466
+pkg syscall (freebsd-riscv64), const SIOCGIFMEDIA ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIOCGIFMETRIC = 3223349527 #53466
+pkg syscall (freebsd-riscv64), const SIOCGIFMETRIC ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIOCGIFMTU = 3223349555 #53466
+pkg syscall (freebsd-riscv64), const SIOCGIFMTU ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIOCGIFNETMASK = 3223349541 #53466
+pkg syscall (freebsd-riscv64), const SIOCGIFNETMASK ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIOCGIFPDSTADDR = 3223349576 #53466
+pkg syscall (freebsd-riscv64), const SIOCGIFPDSTADDR ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIOCGIFPHYS = 3223349557 #53466
+pkg syscall (freebsd-riscv64), const SIOCGIFPHYS ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIOCGIFPSRCADDR = 3223349575 #53466
+pkg syscall (freebsd-riscv64), const SIOCGIFPSRCADDR ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIOCGIFSTATUS = 3274795323 #53466
+pkg syscall (freebsd-riscv64), const SIOCGIFSTATUS ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIOCGLIFADDR = 3239602460 #53466
+pkg syscall (freebsd-riscv64), const SIOCGLIFADDR ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIOCGLIFPHYADDR = 3239602507 #53466
+pkg syscall (freebsd-riscv64), const SIOCGLIFPHYADDR ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIOCGLOWAT = 1074033411 #53466
+pkg syscall (freebsd-riscv64), const SIOCGLOWAT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIOCGPGRP = 1074033417 #53466
+pkg syscall (freebsd-riscv64), const SIOCGPGRP ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIOCGPRIVATE_0 = 3223349584 #53466
+pkg syscall (freebsd-riscv64), const SIOCGPRIVATE_0 ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIOCGPRIVATE_1 = 3223349585 #53466
+pkg syscall (freebsd-riscv64), const SIOCGPRIVATE_1 ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIOCIFCREATE = 3223349626 #53466
+pkg syscall (freebsd-riscv64), const SIOCIFCREATE ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIOCIFCREATE2 = 3223349628 #53466
+pkg syscall (freebsd-riscv64), const SIOCIFCREATE2 ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIOCIFDESTROY = 2149607801 #53466
+pkg syscall (freebsd-riscv64), const SIOCIFDESTROY ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIOCIFGCLONERS = 3222301048 #53466
+pkg syscall (freebsd-riscv64), const SIOCIFGCLONERS ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIOCSDRVSPEC = 2150132091 #53466
+pkg syscall (freebsd-riscv64), const SIOCSDRVSPEC ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIOCSHIWAT = 2147775232 #53466
+pkg syscall (freebsd-riscv64), const SIOCSHIWAT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIOCSIFADDR = 2149607692 #53466
+pkg syscall (freebsd-riscv64), const SIOCSIFADDR ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIOCSIFBRDADDR = 2149607699 #53466
+pkg syscall (freebsd-riscv64), const SIOCSIFBRDADDR ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIOCSIFCAP = 2149607710 #53466
+pkg syscall (freebsd-riscv64), const SIOCSIFCAP ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIOCSIFDESCR = 2149607721 #53466
+pkg syscall (freebsd-riscv64), const SIOCSIFDESCR ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIOCSIFDSTADDR = 2149607694 #53466
+pkg syscall (freebsd-riscv64), const SIOCSIFDSTADDR ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIOCSIFFIB = 2149607773 #53466
+pkg syscall (freebsd-riscv64), const SIOCSIFFIB ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIOCSIFFLAGS = 2149607696 #53466
+pkg syscall (freebsd-riscv64), const SIOCSIFFLAGS ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIOCSIFGENERIC = 2149607737 #53466
+pkg syscall (freebsd-riscv64), const SIOCSIFGENERIC ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIOCSIFLLADDR = 2149607740 #53466
+pkg syscall (freebsd-riscv64), const SIOCSIFLLADDR ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIOCSIFMAC = 2149607719 #53466
+pkg syscall (freebsd-riscv64), const SIOCSIFMAC ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIOCSIFMEDIA = 3223349559 #53466
+pkg syscall (freebsd-riscv64), const SIOCSIFMEDIA ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIOCSIFMETRIC = 2149607704 #53466
+pkg syscall (freebsd-riscv64), const SIOCSIFMETRIC ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIOCSIFMTU = 2149607732 #53466
+pkg syscall (freebsd-riscv64), const SIOCSIFMTU ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIOCSIFNAME = 2149607720 #53466
+pkg syscall (freebsd-riscv64), const SIOCSIFNAME ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIOCSIFNETMASK = 2149607702 #53466
+pkg syscall (freebsd-riscv64), const SIOCSIFNETMASK ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIOCSIFPHYADDR = 2151704902 #53466
+pkg syscall (freebsd-riscv64), const SIOCSIFPHYADDR ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIOCSIFPHYS = 2149607734 #53466
+pkg syscall (freebsd-riscv64), const SIOCSIFPHYS ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIOCSIFRVNET = 3223349595 #53466
+pkg syscall (freebsd-riscv64), const SIOCSIFRVNET ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIOCSIFVNET = 3223349594 #53466
+pkg syscall (freebsd-riscv64), const SIOCSIFVNET ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIOCSLIFPHYADDR = 2165860682 #53466
+pkg syscall (freebsd-riscv64), const SIOCSLIFPHYADDR ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIOCSLOWAT = 2147775234 #53466
+pkg syscall (freebsd-riscv64), const SIOCSLOWAT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SIOCSPGRP = 2147775240 #53466
+pkg syscall (freebsd-riscv64), const SIOCSPGRP ideal-int #53466
+pkg syscall (freebsd-riscv64), const SOCK_CLOEXEC = 268435456 #53466
+pkg syscall (freebsd-riscv64), const SOCK_CLOEXEC ideal-int #53466
+pkg syscall (freebsd-riscv64), const SOCK_MAXADDRLEN = 255 #53466
+pkg syscall (freebsd-riscv64), const SOCK_MAXADDRLEN ideal-int #53466
+pkg syscall (freebsd-riscv64), const SOCK_NONBLOCK = 536870912 #53466
+pkg syscall (freebsd-riscv64), const SOCK_NONBLOCK ideal-int #53466
+pkg syscall (freebsd-riscv64), const SOCK_RDM = 4 #53466
+pkg syscall (freebsd-riscv64), const SOCK_RDM ideal-int #53466
+pkg syscall (freebsd-riscv64), const SOL_SOCKET = 65535 #53466
+pkg syscall (freebsd-riscv64), const SOMAXCONN = 128 #53466
+pkg syscall (freebsd-riscv64), const SO_ACCEPTCONN = 2 #53466
+pkg syscall (freebsd-riscv64), const SO_ACCEPTCONN ideal-int #53466
+pkg syscall (freebsd-riscv64), const SO_ACCEPTFILTER = 4096 #53466
+pkg syscall (freebsd-riscv64), const SO_ACCEPTFILTER ideal-int #53466
+pkg syscall (freebsd-riscv64), const SO_BINTIME = 8192 #53466
+pkg syscall (freebsd-riscv64), const SO_BINTIME ideal-int #53466
+pkg syscall (freebsd-riscv64), const SO_BROADCAST = 32 #53466
+pkg syscall (freebsd-riscv64), const SO_DEBUG = 1 #53466
+pkg syscall (freebsd-riscv64), const SO_DEBUG ideal-int #53466
+pkg syscall (freebsd-riscv64), const SO_DONTROUTE = 16 #53466
+pkg syscall (freebsd-riscv64), const SO_ERROR = 4103 #53466
+pkg syscall (freebsd-riscv64), const SO_ERROR ideal-int #53466
+pkg syscall (freebsd-riscv64), const SO_KEEPALIVE = 8 #53466
+pkg syscall (freebsd-riscv64), const SO_LABEL = 4105 #53466
+pkg syscall (freebsd-riscv64), const SO_LABEL ideal-int #53466
+pkg syscall (freebsd-riscv64), const SO_LINGER = 128 #53466
+pkg syscall (freebsd-riscv64), const SO_LISTENINCQLEN = 4115 #53466
+pkg syscall (freebsd-riscv64), const SO_LISTENINCQLEN ideal-int #53466
+pkg syscall (freebsd-riscv64), const SO_LISTENQLEN = 4114 #53466
+pkg syscall (freebsd-riscv64), const SO_LISTENQLEN ideal-int #53466
+pkg syscall (freebsd-riscv64), const SO_LISTENQLIMIT = 4113 #53466
+pkg syscall (freebsd-riscv64), const SO_LISTENQLIMIT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SO_NOSIGPIPE = 2048 #53466
+pkg syscall (freebsd-riscv64), const SO_NOSIGPIPE ideal-int #53466
+pkg syscall (freebsd-riscv64), const SO_NO_DDP = 32768 #53466
+pkg syscall (freebsd-riscv64), const SO_NO_DDP ideal-int #53466
+pkg syscall (freebsd-riscv64), const SO_NO_OFFLOAD = 16384 #53466
+pkg syscall (freebsd-riscv64), const SO_NO_OFFLOAD ideal-int #53466
+pkg syscall (freebsd-riscv64), const SO_OOBINLINE = 256 #53466
+pkg syscall (freebsd-riscv64), const SO_OOBINLINE ideal-int #53466
+pkg syscall (freebsd-riscv64), const SO_PEERLABEL = 4112 #53466
+pkg syscall (freebsd-riscv64), const SO_PEERLABEL ideal-int #53466
+pkg syscall (freebsd-riscv64), const SO_PROTOCOL = 4118 #53466
+pkg syscall (freebsd-riscv64), const SO_PROTOCOL ideal-int #53466
+pkg syscall (freebsd-riscv64), const SO_PROTOTYPE = 4118 #53466
+pkg syscall (freebsd-riscv64), const SO_PROTOTYPE ideal-int #53466
+pkg syscall (freebsd-riscv64), const SO_RCVBUF = 4098 #53466
+pkg syscall (freebsd-riscv64), const SO_RCVLOWAT = 4100 #53466
+pkg syscall (freebsd-riscv64), const SO_RCVLOWAT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SO_RCVTIMEO = 4102 #53466
+pkg syscall (freebsd-riscv64), const SO_RCVTIMEO ideal-int #53466
+pkg syscall (freebsd-riscv64), const SO_REUSEADDR = 4 #53466
+pkg syscall (freebsd-riscv64), const SO_REUSEPORT = 512 #53466
+pkg syscall (freebsd-riscv64), const SO_REUSEPORT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SO_SETFIB = 4116 #53466
+pkg syscall (freebsd-riscv64), const SO_SETFIB ideal-int #53466
+pkg syscall (freebsd-riscv64), const SO_SNDBUF = 4097 #53466
+pkg syscall (freebsd-riscv64), const SO_SNDLOWAT = 4099 #53466
+pkg syscall (freebsd-riscv64), const SO_SNDLOWAT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SO_SNDTIMEO = 4101 #53466
+pkg syscall (freebsd-riscv64), const SO_SNDTIMEO ideal-int #53466
+pkg syscall (freebsd-riscv64), const SO_TIMESTAMP = 1024 #53466
+pkg syscall (freebsd-riscv64), const SO_TIMESTAMP ideal-int #53466
+pkg syscall (freebsd-riscv64), const SO_TYPE = 4104 #53466
+pkg syscall (freebsd-riscv64), const SO_TYPE ideal-int #53466
+pkg syscall (freebsd-riscv64), const SO_USELOOPBACK = 64 #53466
+pkg syscall (freebsd-riscv64), const SO_USELOOPBACK ideal-int #53466
+pkg syscall (freebsd-riscv64), const SO_USER_COOKIE = 4117 #53466
+pkg syscall (freebsd-riscv64), const SO_USER_COOKIE ideal-int #53466
+pkg syscall (freebsd-riscv64), const SO_VENDOR = 2147483648 #53466
+pkg syscall (freebsd-riscv64), const SO_VENDOR ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_ABORT2 = 463 #53466
+pkg syscall (freebsd-riscv64), const SYS_ABORT2 ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_ACCEPT = 30 #53466
+pkg syscall (freebsd-riscv64), const SYS_ACCEPT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_ACCEPT4 = 541 #53466
+pkg syscall (freebsd-riscv64), const SYS_ACCEPT4 ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_ACCESS = 33 #53466
+pkg syscall (freebsd-riscv64), const SYS_ACCESS ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_ACCT = 51 #53466
+pkg syscall (freebsd-riscv64), const SYS_ACCT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_ADJTIME = 140 #53466
+pkg syscall (freebsd-riscv64), const SYS_ADJTIME ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_AIO_CANCEL = 316 #53466
+pkg syscall (freebsd-riscv64), const SYS_AIO_CANCEL ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_AIO_ERROR = 317 #53466
+pkg syscall (freebsd-riscv64), const SYS_AIO_ERROR ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_AIO_FSYNC = 465 #53466
+pkg syscall (freebsd-riscv64), const SYS_AIO_FSYNC ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_AIO_MLOCK = 543 #53466
+pkg syscall (freebsd-riscv64), const SYS_AIO_MLOCK ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_AIO_READ = 255 #53466
+pkg syscall (freebsd-riscv64), const SYS_AIO_READ ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_AIO_RETURN = 314 #53466
+pkg syscall (freebsd-riscv64), const SYS_AIO_RETURN ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_AIO_SUSPEND = 315 #53466
+pkg syscall (freebsd-riscv64), const SYS_AIO_SUSPEND ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_AIO_WAITCOMPLETE = 359 #53466
+pkg syscall (freebsd-riscv64), const SYS_AIO_WAITCOMPLETE ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_AIO_WRITE = 256 #53466
+pkg syscall (freebsd-riscv64), const SYS_AIO_WRITE ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_AUDIT = 445 #53466
+pkg syscall (freebsd-riscv64), const SYS_AUDIT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_AUDITCTL = 453 #53466
+pkg syscall (freebsd-riscv64), const SYS_AUDITCTL ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_AUDITON = 446 #53466
+pkg syscall (freebsd-riscv64), const SYS_AUDITON ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_BIND = 104 #53466
+pkg syscall (freebsd-riscv64), const SYS_BIND ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_BINDAT = 538 #53466
+pkg syscall (freebsd-riscv64), const SYS_BINDAT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_CAP_ENTER = 516 #53466
+pkg syscall (freebsd-riscv64), const SYS_CAP_ENTER ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_CAP_FCNTLS_GET = 537 #53466
+pkg syscall (freebsd-riscv64), const SYS_CAP_FCNTLS_GET ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_CAP_FCNTLS_LIMIT = 536 #53466
+pkg syscall (freebsd-riscv64), const SYS_CAP_FCNTLS_LIMIT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_CAP_GETMODE = 517 #53466
+pkg syscall (freebsd-riscv64), const SYS_CAP_GETMODE ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_CAP_IOCTLS_GET = 535 #53466
+pkg syscall (freebsd-riscv64), const SYS_CAP_IOCTLS_GET ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_CAP_IOCTLS_LIMIT = 534 #53466
+pkg syscall (freebsd-riscv64), const SYS_CAP_IOCTLS_LIMIT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_CAP_RIGHTS_LIMIT = 533 #53466
+pkg syscall (freebsd-riscv64), const SYS_CAP_RIGHTS_LIMIT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_CHDIR = 12 #53466
+pkg syscall (freebsd-riscv64), const SYS_CHDIR ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_CHFLAGS = 34 #53466
+pkg syscall (freebsd-riscv64), const SYS_CHFLAGS ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_CHFLAGSAT = 540 #53466
+pkg syscall (freebsd-riscv64), const SYS_CHFLAGSAT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_CHMOD = 15 #53466
+pkg syscall (freebsd-riscv64), const SYS_CHMOD ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_CHOWN = 16 #53466
+pkg syscall (freebsd-riscv64), const SYS_CHOWN ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_CHROOT = 61 #53466
+pkg syscall (freebsd-riscv64), const SYS_CHROOT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_CLOCK_GETCPUCLOCKID2 = 247 #53466
+pkg syscall (freebsd-riscv64), const SYS_CLOCK_GETCPUCLOCKID2 ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_CLOCK_GETRES = 234 #53466
+pkg syscall (freebsd-riscv64), const SYS_CLOCK_GETRES ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_CLOCK_GETTIME = 232 #53466
+pkg syscall (freebsd-riscv64), const SYS_CLOCK_GETTIME ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_CLOCK_NANOSLEEP = 244 #53466
+pkg syscall (freebsd-riscv64), const SYS_CLOCK_NANOSLEEP ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_CLOCK_SETTIME = 233 #53466
+pkg syscall (freebsd-riscv64), const SYS_CLOCK_SETTIME ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_CLOSE = 6 #53466
+pkg syscall (freebsd-riscv64), const SYS_CLOSE ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_CLOSEFROM = 509 #53466
+pkg syscall (freebsd-riscv64), const SYS_CLOSEFROM ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_CONNECT = 98 #53466
+pkg syscall (freebsd-riscv64), const SYS_CONNECT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_CONNECTAT = 539 #53466
+pkg syscall (freebsd-riscv64), const SYS_CONNECTAT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_CPUSET = 484 #53466
+pkg syscall (freebsd-riscv64), const SYS_CPUSET ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_CPUSET_GETAFFINITY = 487 #53466
+pkg syscall (freebsd-riscv64), const SYS_CPUSET_GETAFFINITY ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_CPUSET_GETID = 486 #53466
+pkg syscall (freebsd-riscv64), const SYS_CPUSET_GETID ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_CPUSET_SETAFFINITY = 488 #53466
+pkg syscall (freebsd-riscv64), const SYS_CPUSET_SETAFFINITY ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_CPUSET_SETID = 485 #53466
+pkg syscall (freebsd-riscv64), const SYS_CPUSET_SETID ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_DUP = 41 #53466
+pkg syscall (freebsd-riscv64), const SYS_DUP ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_DUP2 = 90 #53466
+pkg syscall (freebsd-riscv64), const SYS_DUP2 ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_EACCESS = 376 #53466
+pkg syscall (freebsd-riscv64), const SYS_EACCESS ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_EXECVE = 59 #53466
+pkg syscall (freebsd-riscv64), const SYS_EXECVE ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_EXIT = 1 #53466
+pkg syscall (freebsd-riscv64), const SYS_EXIT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_EXTATTRCTL = 355 #53466
+pkg syscall (freebsd-riscv64), const SYS_EXTATTRCTL ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_EXTATTR_DELETE_FD = 373 #53466
+pkg syscall (freebsd-riscv64), const SYS_EXTATTR_DELETE_FD ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_EXTATTR_DELETE_FILE = 358 #53466
+pkg syscall (freebsd-riscv64), const SYS_EXTATTR_DELETE_FILE ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_EXTATTR_DELETE_LINK = 414 #53466
+pkg syscall (freebsd-riscv64), const SYS_EXTATTR_DELETE_LINK ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_EXTATTR_GET_FD = 372 #53466
+pkg syscall (freebsd-riscv64), const SYS_EXTATTR_GET_FD ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_EXTATTR_GET_FILE = 357 #53466
+pkg syscall (freebsd-riscv64), const SYS_EXTATTR_GET_FILE ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_EXTATTR_GET_LINK = 413 #53466
+pkg syscall (freebsd-riscv64), const SYS_EXTATTR_GET_LINK ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_EXTATTR_LIST_FD = 437 #53466
+pkg syscall (freebsd-riscv64), const SYS_EXTATTR_LIST_FD ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_EXTATTR_LIST_FILE = 438 #53466
+pkg syscall (freebsd-riscv64), const SYS_EXTATTR_LIST_FILE ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_EXTATTR_LIST_LINK = 439 #53466
+pkg syscall (freebsd-riscv64), const SYS_EXTATTR_LIST_LINK ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_EXTATTR_SET_FD = 371 #53466
+pkg syscall (freebsd-riscv64), const SYS_EXTATTR_SET_FD ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_EXTATTR_SET_FILE = 356 #53466
+pkg syscall (freebsd-riscv64), const SYS_EXTATTR_SET_FILE ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_EXTATTR_SET_LINK = 412 #53466
+pkg syscall (freebsd-riscv64), const SYS_EXTATTR_SET_LINK ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_FACCESSAT = 489 #53466
+pkg syscall (freebsd-riscv64), const SYS_FACCESSAT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_FCHDIR = 13 #53466
+pkg syscall (freebsd-riscv64), const SYS_FCHDIR ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_FCHFLAGS = 35 #53466
+pkg syscall (freebsd-riscv64), const SYS_FCHFLAGS ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_FCHMOD = 124 #53466
+pkg syscall (freebsd-riscv64), const SYS_FCHMOD ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_FCHMODAT = 490 #53466
+pkg syscall (freebsd-riscv64), const SYS_FCHMODAT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_FCHOWN = 123 #53466
+pkg syscall (freebsd-riscv64), const SYS_FCHOWN ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_FCHOWNAT = 491 #53466
+pkg syscall (freebsd-riscv64), const SYS_FCHOWNAT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_FCNTL = 92 #53466
+pkg syscall (freebsd-riscv64), const SYS_FCNTL ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_FDATASYNC = 550 #53466
+pkg syscall (freebsd-riscv64), const SYS_FDATASYNC ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_FEXECVE = 492 #53466
+pkg syscall (freebsd-riscv64), const SYS_FEXECVE ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_FFCLOCK_GETCOUNTER = 241 #53466
+pkg syscall (freebsd-riscv64), const SYS_FFCLOCK_GETCOUNTER ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_FFCLOCK_GETESTIMATE = 243 #53466
+pkg syscall (freebsd-riscv64), const SYS_FFCLOCK_GETESTIMATE ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_FFCLOCK_SETESTIMATE = 242 #53466
+pkg syscall (freebsd-riscv64), const SYS_FFCLOCK_SETESTIMATE ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_FHOPEN = 298 #53466
+pkg syscall (freebsd-riscv64), const SYS_FHOPEN ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_FHSTAT = 299 #53466
+pkg syscall (freebsd-riscv64), const SYS_FHSTAT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_FHSTATFS = 398 #53466
+pkg syscall (freebsd-riscv64), const SYS_FHSTATFS ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_FLOCK = 131 #53466
+pkg syscall (freebsd-riscv64), const SYS_FLOCK ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_FORK = 2 #53466
+pkg syscall (freebsd-riscv64), const SYS_FORK ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_FPATHCONF = 192 #53466
+pkg syscall (freebsd-riscv64), const SYS_FPATHCONF ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_FSTAT = 551 #53466
+pkg syscall (freebsd-riscv64), const SYS_FSTAT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_FSTATAT = 552 #53466
+pkg syscall (freebsd-riscv64), const SYS_FSTATAT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_FSTATFS = 556 #53466
+pkg syscall (freebsd-riscv64), const SYS_FSTATFS ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_FSYNC = 95 #53466
+pkg syscall (freebsd-riscv64), const SYS_FSYNC ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_FTRUNCATE = 480 #53466
+pkg syscall (freebsd-riscv64), const SYS_FTRUNCATE ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_FUTIMENS = 546 #53466
+pkg syscall (freebsd-riscv64), const SYS_FUTIMENS ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_FUTIMES = 206 #53466
+pkg syscall (freebsd-riscv64), const SYS_FUTIMES ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_FUTIMESAT = 494 #53466
+pkg syscall (freebsd-riscv64), const SYS_FUTIMESAT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_GETAUDIT = 449 #53466
+pkg syscall (freebsd-riscv64), const SYS_GETAUDIT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_GETAUDIT_ADDR = 451 #53466
+pkg syscall (freebsd-riscv64), const SYS_GETAUDIT_ADDR ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_GETAUID = 447 #53466
+pkg syscall (freebsd-riscv64), const SYS_GETAUID ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_GETCONTEXT = 421 #53466
+pkg syscall (freebsd-riscv64), const SYS_GETCONTEXT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_GETDENTS = 272 #53466
+pkg syscall (freebsd-riscv64), const SYS_GETDENTS ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_GETDIRENTRIES = 554 #53466
+pkg syscall (freebsd-riscv64), const SYS_GETDIRENTRIES ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_GETDTABLESIZE = 89 #53466
+pkg syscall (freebsd-riscv64), const SYS_GETDTABLESIZE ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_GETEGID = 43 #53466
+pkg syscall (freebsd-riscv64), const SYS_GETEGID ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_GETEUID = 25 #53466
+pkg syscall (freebsd-riscv64), const SYS_GETEUID ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_GETFH = 161 #53466
+pkg syscall (freebsd-riscv64), const SYS_GETFH ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_GETFSSTAT = 557 #53466
+pkg syscall (freebsd-riscv64), const SYS_GETFSSTAT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_GETGID = 47 #53466
+pkg syscall (freebsd-riscv64), const SYS_GETGID ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_GETGROUPS = 79 #53466
+pkg syscall (freebsd-riscv64), const SYS_GETGROUPS ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_GETITIMER = 86 #53466
+pkg syscall (freebsd-riscv64), const SYS_GETITIMER ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_GETLOGIN = 49 #53466
+pkg syscall (freebsd-riscv64), const SYS_GETLOGIN ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_GETLOGINCLASS = 523 #53466
+pkg syscall (freebsd-riscv64), const SYS_GETLOGINCLASS ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_GETPEERNAME = 31 #53466
+pkg syscall (freebsd-riscv64), const SYS_GETPEERNAME ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_GETPGID = 207 #53466
+pkg syscall (freebsd-riscv64), const SYS_GETPGID ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_GETPGRP = 81 #53466
+pkg syscall (freebsd-riscv64), const SYS_GETPGRP ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_GETPID = 20 #53466
+pkg syscall (freebsd-riscv64), const SYS_GETPID ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_GETPPID = 39 #53466
+pkg syscall (freebsd-riscv64), const SYS_GETPPID ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_GETPRIORITY = 100 #53466
+pkg syscall (freebsd-riscv64), const SYS_GETPRIORITY ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_GETRESGID = 361 #53466
+pkg syscall (freebsd-riscv64), const SYS_GETRESGID ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_GETRESUID = 360 #53466
+pkg syscall (freebsd-riscv64), const SYS_GETRESUID ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_GETRLIMIT = 194 #53466
+pkg syscall (freebsd-riscv64), const SYS_GETRLIMIT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_GETRUSAGE = 117 #53466
+pkg syscall (freebsd-riscv64), const SYS_GETRUSAGE ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_GETSID = 310 #53466
+pkg syscall (freebsd-riscv64), const SYS_GETSID ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_GETSOCKNAME = 32 #53466
+pkg syscall (freebsd-riscv64), const SYS_GETSOCKNAME ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_GETSOCKOPT = 118 #53466
+pkg syscall (freebsd-riscv64), const SYS_GETSOCKOPT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_GETTIMEOFDAY = 116 #53466
+pkg syscall (freebsd-riscv64), const SYS_GETTIMEOFDAY ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_GETUID = 24 #53466
+pkg syscall (freebsd-riscv64), const SYS_GETUID ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_GSSD_SYSCALL = 505 #53466
+pkg syscall (freebsd-riscv64), const SYS_GSSD_SYSCALL ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_IOCTL = 54 #53466
+pkg syscall (freebsd-riscv64), const SYS_IOCTL ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_ISSETUGID = 253 #53466
+pkg syscall (freebsd-riscv64), const SYS_ISSETUGID ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_JAIL = 338 #53466
+pkg syscall (freebsd-riscv64), const SYS_JAIL ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_JAIL_ATTACH = 436 #53466
+pkg syscall (freebsd-riscv64), const SYS_JAIL_ATTACH ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_JAIL_GET = 506 #53466
+pkg syscall (freebsd-riscv64), const SYS_JAIL_GET ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_JAIL_REMOVE = 508 #53466
+pkg syscall (freebsd-riscv64), const SYS_JAIL_REMOVE ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_JAIL_SET = 507 #53466
+pkg syscall (freebsd-riscv64), const SYS_JAIL_SET ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_KENV = 390 #53466
+pkg syscall (freebsd-riscv64), const SYS_KENV ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_KEVENT = 363 #53466
+pkg syscall (freebsd-riscv64), const SYS_KEVENT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_KILL = 37 #53466
+pkg syscall (freebsd-riscv64), const SYS_KILL ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_KLDFIND = 306 #53466
+pkg syscall (freebsd-riscv64), const SYS_KLDFIND ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_KLDFIRSTMOD = 309 #53466
+pkg syscall (freebsd-riscv64), const SYS_KLDFIRSTMOD ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_KLDLOAD = 304 #53466
+pkg syscall (freebsd-riscv64), const SYS_KLDLOAD ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_KLDNEXT = 307 #53466
+pkg syscall (freebsd-riscv64), const SYS_KLDNEXT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_KLDSTAT = 308 #53466
+pkg syscall (freebsd-riscv64), const SYS_KLDSTAT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_KLDSYM = 337 #53466
+pkg syscall (freebsd-riscv64), const SYS_KLDSYM ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_KLDUNLOAD = 305 #53466
+pkg syscall (freebsd-riscv64), const SYS_KLDUNLOAD ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_KLDUNLOADF = 444 #53466
+pkg syscall (freebsd-riscv64), const SYS_KLDUNLOADF ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_KMQ_NOTIFY = 461 #53466
+pkg syscall (freebsd-riscv64), const SYS_KMQ_NOTIFY ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_KMQ_OPEN = 457 #53466
+pkg syscall (freebsd-riscv64), const SYS_KMQ_OPEN ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_KMQ_SETATTR = 458 #53466
+pkg syscall (freebsd-riscv64), const SYS_KMQ_SETATTR ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_KMQ_TIMEDRECEIVE = 459 #53466
+pkg syscall (freebsd-riscv64), const SYS_KMQ_TIMEDRECEIVE ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_KMQ_TIMEDSEND = 460 #53466
+pkg syscall (freebsd-riscv64), const SYS_KMQ_TIMEDSEND ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_KMQ_UNLINK = 462 #53466
+pkg syscall (freebsd-riscv64), const SYS_KMQ_UNLINK ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_KQUEUE = 362 #53466
+pkg syscall (freebsd-riscv64), const SYS_KQUEUE ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_KSEM_CLOSE = 400 #53466
+pkg syscall (freebsd-riscv64), const SYS_KSEM_CLOSE ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_KSEM_DESTROY = 408 #53466
+pkg syscall (freebsd-riscv64), const SYS_KSEM_DESTROY ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_KSEM_GETVALUE = 407 #53466
+pkg syscall (freebsd-riscv64), const SYS_KSEM_GETVALUE ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_KSEM_INIT = 404 #53466
+pkg syscall (freebsd-riscv64), const SYS_KSEM_INIT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_KSEM_OPEN = 405 #53466
+pkg syscall (freebsd-riscv64), const SYS_KSEM_OPEN ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_KSEM_POST = 401 #53466
+pkg syscall (freebsd-riscv64), const SYS_KSEM_POST ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_KSEM_TIMEDWAIT = 441 #53466
+pkg syscall (freebsd-riscv64), const SYS_KSEM_TIMEDWAIT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_KSEM_TRYWAIT = 403 #53466
+pkg syscall (freebsd-riscv64), const SYS_KSEM_TRYWAIT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_KSEM_UNLINK = 406 #53466
+pkg syscall (freebsd-riscv64), const SYS_KSEM_UNLINK ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_KSEM_WAIT = 402 #53466
+pkg syscall (freebsd-riscv64), const SYS_KSEM_WAIT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_KTIMER_CREATE = 235 #53466
+pkg syscall (freebsd-riscv64), const SYS_KTIMER_CREATE ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_KTIMER_DELETE = 236 #53466
+pkg syscall (freebsd-riscv64), const SYS_KTIMER_DELETE ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_KTIMER_GETOVERRUN = 239 #53466
+pkg syscall (freebsd-riscv64), const SYS_KTIMER_GETOVERRUN ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_KTIMER_GETTIME = 238 #53466
+pkg syscall (freebsd-riscv64), const SYS_KTIMER_GETTIME ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_KTIMER_SETTIME = 237 #53466
+pkg syscall (freebsd-riscv64), const SYS_KTIMER_SETTIME ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_KTRACE = 45 #53466
+pkg syscall (freebsd-riscv64), const SYS_KTRACE ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_LCHFLAGS = 391 #53466
+pkg syscall (freebsd-riscv64), const SYS_LCHFLAGS ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_LCHMOD = 274 #53466
+pkg syscall (freebsd-riscv64), const SYS_LCHMOD ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_LCHOWN = 254 #53466
+pkg syscall (freebsd-riscv64), const SYS_LCHOWN ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_LGETFH = 160 #53466
+pkg syscall (freebsd-riscv64), const SYS_LGETFH ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_LINK = 9 #53466
+pkg syscall (freebsd-riscv64), const SYS_LINK ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_LINKAT = 495 #53466
+pkg syscall (freebsd-riscv64), const SYS_LINKAT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_LIO_LISTIO = 257 #53466
+pkg syscall (freebsd-riscv64), const SYS_LIO_LISTIO ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_LISTEN = 106 #53466
+pkg syscall (freebsd-riscv64), const SYS_LISTEN ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_LPATHCONF = 513 #53466
+pkg syscall (freebsd-riscv64), const SYS_LPATHCONF ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_LSEEK = 478 #53466
+pkg syscall (freebsd-riscv64), const SYS_LSEEK ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_LUTIMES = 276 #53466
+pkg syscall (freebsd-riscv64), const SYS_LUTIMES ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_MAC_SYSCALL = 394 #53466
+pkg syscall (freebsd-riscv64), const SYS_MAC_SYSCALL ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_MADVISE = 75 #53466
+pkg syscall (freebsd-riscv64), const SYS_MADVISE ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_MINCORE = 78 #53466
+pkg syscall (freebsd-riscv64), const SYS_MINCORE ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_MINHERIT = 250 #53466
+pkg syscall (freebsd-riscv64), const SYS_MINHERIT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_MKDIR = 136 #53466
+pkg syscall (freebsd-riscv64), const SYS_MKDIR ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_MKDIRAT = 496 #53466
+pkg syscall (freebsd-riscv64), const SYS_MKDIRAT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_MKFIFO = 132 #53466
+pkg syscall (freebsd-riscv64), const SYS_MKFIFO ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_MKFIFOAT = 497 #53466
+pkg syscall (freebsd-riscv64), const SYS_MKFIFOAT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_MKNOD = 14 #53466
+pkg syscall (freebsd-riscv64), const SYS_MKNOD ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_MKNODAT = 559 #53466
+pkg syscall (freebsd-riscv64), const SYS_MKNODAT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_MLOCK = 203 #53466
+pkg syscall (freebsd-riscv64), const SYS_MLOCK ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_MLOCKALL = 324 #53466
+pkg syscall (freebsd-riscv64), const SYS_MLOCKALL ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_MMAP = 477 #53466
+pkg syscall (freebsd-riscv64), const SYS_MMAP ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_MODFIND = 303 #53466
+pkg syscall (freebsd-riscv64), const SYS_MODFIND ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_MODFNEXT = 302 #53466
+pkg syscall (freebsd-riscv64), const SYS_MODFNEXT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_MODNEXT = 300 #53466
+pkg syscall (freebsd-riscv64), const SYS_MODNEXT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_MODSTAT = 301 #53466
+pkg syscall (freebsd-riscv64), const SYS_MODSTAT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_MOUNT = 21 #53466
+pkg syscall (freebsd-riscv64), const SYS_MOUNT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_MPROTECT = 74 #53466
+pkg syscall (freebsd-riscv64), const SYS_MPROTECT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_MSGCTL = 511 #53466
+pkg syscall (freebsd-riscv64), const SYS_MSGCTL ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_MSGGET = 225 #53466
+pkg syscall (freebsd-riscv64), const SYS_MSGGET ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_MSGRCV = 227 #53466
+pkg syscall (freebsd-riscv64), const SYS_MSGRCV ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_MSGSND = 226 #53466
+pkg syscall (freebsd-riscv64), const SYS_MSGSND ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_MSGSYS = 170 #53466
+pkg syscall (freebsd-riscv64), const SYS_MSGSYS ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_MSYNC = 65 #53466
+pkg syscall (freebsd-riscv64), const SYS_MSYNC ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_MUNLOCK = 204 #53466
+pkg syscall (freebsd-riscv64), const SYS_MUNLOCK ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_MUNLOCKALL = 325 #53466
+pkg syscall (freebsd-riscv64), const SYS_MUNLOCKALL ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_MUNMAP = 73 #53466
+pkg syscall (freebsd-riscv64), const SYS_MUNMAP ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_NANOSLEEP = 240 #53466
+pkg syscall (freebsd-riscv64), const SYS_NANOSLEEP ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_NFSSVC = 155 #53466
+pkg syscall (freebsd-riscv64), const SYS_NFSSVC ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_NFSTAT = 279 #53466
+pkg syscall (freebsd-riscv64), const SYS_NFSTAT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_NLM_SYSCALL = 154 #53466
+pkg syscall (freebsd-riscv64), const SYS_NLM_SYSCALL ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_NLSTAT = 280 #53466
+pkg syscall (freebsd-riscv64), const SYS_NLSTAT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_NMOUNT = 378 #53466
+pkg syscall (freebsd-riscv64), const SYS_NMOUNT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_NSTAT = 278 #53466
+pkg syscall (freebsd-riscv64), const SYS_NSTAT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_NTP_ADJTIME = 176 #53466
+pkg syscall (freebsd-riscv64), const SYS_NTP_ADJTIME ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_NTP_GETTIME = 248 #53466
+pkg syscall (freebsd-riscv64), const SYS_NTP_GETTIME ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_NUMA_GETAFFINITY = 548 #53466
+pkg syscall (freebsd-riscv64), const SYS_NUMA_GETAFFINITY ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_NUMA_SETAFFINITY = 549 #53466
+pkg syscall (freebsd-riscv64), const SYS_NUMA_SETAFFINITY ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_OBREAK = 17 #53466
+pkg syscall (freebsd-riscv64), const SYS_OBREAK ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_OPEN = 5 #53466
+pkg syscall (freebsd-riscv64), const SYS_OPEN ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_OPENAT = 499 #53466
+pkg syscall (freebsd-riscv64), const SYS_OPENAT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_OPENBSD_POLL = 252 #53466
+pkg syscall (freebsd-riscv64), const SYS_OPENBSD_POLL ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_OVADVISE = 72 #53466
+pkg syscall (freebsd-riscv64), const SYS_OVADVISE ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_PATHCONF = 191 #53466
+pkg syscall (freebsd-riscv64), const SYS_PATHCONF ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_PDFORK = 518 #53466
+pkg syscall (freebsd-riscv64), const SYS_PDFORK ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_PDGETPID = 520 #53466
+pkg syscall (freebsd-riscv64), const SYS_PDGETPID ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_PDKILL = 519 #53466
+pkg syscall (freebsd-riscv64), const SYS_PDKILL ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_PIPE = 42 #53466
+pkg syscall (freebsd-riscv64), const SYS_PIPE ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_PIPE2 = 542 #53466
+pkg syscall (freebsd-riscv64), const SYS_PIPE2 ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_POLL = 209 #53466
+pkg syscall (freebsd-riscv64), const SYS_POLL ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_POSIX_FADVISE = 531 #53466
+pkg syscall (freebsd-riscv64), const SYS_POSIX_FADVISE ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_POSIX_FALLOCATE = 530 #53466
+pkg syscall (freebsd-riscv64), const SYS_POSIX_FALLOCATE ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_POSIX_OPENPT = 504 #53466
+pkg syscall (freebsd-riscv64), const SYS_POSIX_OPENPT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_PPOLL = 545 #53466
+pkg syscall (freebsd-riscv64), const SYS_PPOLL ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_PREAD = 475 #53466
+pkg syscall (freebsd-riscv64), const SYS_PREAD ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_PREADV = 289 #53466
+pkg syscall (freebsd-riscv64), const SYS_PREADV ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_PROCCTL = 544 #53466
+pkg syscall (freebsd-riscv64), const SYS_PROCCTL ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_PROFIL = 44 #53466
+pkg syscall (freebsd-riscv64), const SYS_PROFIL ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_PSELECT = 522 #53466
+pkg syscall (freebsd-riscv64), const SYS_PSELECT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_PTRACE = 26 #53466
+pkg syscall (freebsd-riscv64), const SYS_PTRACE ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_PWRITE = 476 #53466
+pkg syscall (freebsd-riscv64), const SYS_PWRITE ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_PWRITEV = 290 #53466
+pkg syscall (freebsd-riscv64), const SYS_PWRITEV ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_QUOTACTL = 148 #53466
+pkg syscall (freebsd-riscv64), const SYS_QUOTACTL ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_RCTL_ADD_RULE = 528 #53466
+pkg syscall (freebsd-riscv64), const SYS_RCTL_ADD_RULE ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_RCTL_GET_LIMITS = 527 #53466
+pkg syscall (freebsd-riscv64), const SYS_RCTL_GET_LIMITS ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_RCTL_GET_RACCT = 525 #53466
+pkg syscall (freebsd-riscv64), const SYS_RCTL_GET_RACCT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_RCTL_GET_RULES = 526 #53466
+pkg syscall (freebsd-riscv64), const SYS_RCTL_GET_RULES ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_RCTL_REMOVE_RULE = 529 #53466
+pkg syscall (freebsd-riscv64), const SYS_RCTL_REMOVE_RULE ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_READ = 3 #53466
+pkg syscall (freebsd-riscv64), const SYS_READ ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_READLINK = 58 #53466
+pkg syscall (freebsd-riscv64), const SYS_READLINK ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_READLINKAT = 500 #53466
+pkg syscall (freebsd-riscv64), const SYS_READLINKAT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_READV = 120 #53466
+pkg syscall (freebsd-riscv64), const SYS_READV ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_REBOOT = 55 #53466
+pkg syscall (freebsd-riscv64), const SYS_REBOOT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_RECVFROM = 29 #53466
+pkg syscall (freebsd-riscv64), const SYS_RECVFROM ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_RECVMSG = 27 #53466
+pkg syscall (freebsd-riscv64), const SYS_RECVMSG ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_RENAME = 128 #53466
+pkg syscall (freebsd-riscv64), const SYS_RENAME ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_RENAMEAT = 501 #53466
+pkg syscall (freebsd-riscv64), const SYS_RENAMEAT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_REVOKE = 56 #53466
+pkg syscall (freebsd-riscv64), const SYS_REVOKE ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_RFORK = 251 #53466
+pkg syscall (freebsd-riscv64), const SYS_RFORK ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_RMDIR = 137 #53466
+pkg syscall (freebsd-riscv64), const SYS_RMDIR ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_RTPRIO = 166 #53466
+pkg syscall (freebsd-riscv64), const SYS_RTPRIO ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_RTPRIO_THREAD = 466 #53466
+pkg syscall (freebsd-riscv64), const SYS_RTPRIO_THREAD ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SBRK = 69 #53466
+pkg syscall (freebsd-riscv64), const SYS_SBRK ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SCHED_GETPARAM = 328 #53466
+pkg syscall (freebsd-riscv64), const SYS_SCHED_GETPARAM ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SCHED_GETSCHEDULER = 330 #53466
+pkg syscall (freebsd-riscv64), const SYS_SCHED_GETSCHEDULER ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SCHED_GET_PRIORITY_MAX = 332 #53466
+pkg syscall (freebsd-riscv64), const SYS_SCHED_GET_PRIORITY_MAX ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SCHED_GET_PRIORITY_MIN = 333 #53466
+pkg syscall (freebsd-riscv64), const SYS_SCHED_GET_PRIORITY_MIN ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SCHED_RR_GET_INTERVAL = 334 #53466
+pkg syscall (freebsd-riscv64), const SYS_SCHED_RR_GET_INTERVAL ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SCHED_SETPARAM = 327 #53466
+pkg syscall (freebsd-riscv64), const SYS_SCHED_SETPARAM ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SCHED_SETSCHEDULER = 329 #53466
+pkg syscall (freebsd-riscv64), const SYS_SCHED_SETSCHEDULER ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SCHED_YIELD = 331 #53466
+pkg syscall (freebsd-riscv64), const SYS_SCHED_YIELD ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SCTP_GENERIC_RECVMSG = 474 #53466
+pkg syscall (freebsd-riscv64), const SYS_SCTP_GENERIC_RECVMSG ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SCTP_GENERIC_SENDMSG = 472 #53466
+pkg syscall (freebsd-riscv64), const SYS_SCTP_GENERIC_SENDMSG ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SCTP_GENERIC_SENDMSG_IOV = 473 #53466
+pkg syscall (freebsd-riscv64), const SYS_SCTP_GENERIC_SENDMSG_IOV ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SCTP_PEELOFF = 471 #53466
+pkg syscall (freebsd-riscv64), const SYS_SCTP_PEELOFF ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SELECT = 93 #53466
+pkg syscall (freebsd-riscv64), const SYS_SELECT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SEMGET = 221 #53466
+pkg syscall (freebsd-riscv64), const SYS_SEMGET ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SEMOP = 222 #53466
+pkg syscall (freebsd-riscv64), const SYS_SEMOP ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SEMSYS = 169 #53466
+pkg syscall (freebsd-riscv64), const SYS_SEMSYS ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SENDFILE = 393 #53466
+pkg syscall (freebsd-riscv64), const SYS_SENDFILE ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SENDMSG = 28 #53466
+pkg syscall (freebsd-riscv64), const SYS_SENDMSG ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SENDTO = 133 #53466
+pkg syscall (freebsd-riscv64), const SYS_SENDTO ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SETAUDIT = 450 #53466
+pkg syscall (freebsd-riscv64), const SYS_SETAUDIT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SETAUDIT_ADDR = 452 #53466
+pkg syscall (freebsd-riscv64), const SYS_SETAUDIT_ADDR ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SETAUID = 448 #53466
+pkg syscall (freebsd-riscv64), const SYS_SETAUID ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SETCONTEXT = 422 #53466
+pkg syscall (freebsd-riscv64), const SYS_SETCONTEXT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SETEGID = 182 #53466
+pkg syscall (freebsd-riscv64), const SYS_SETEGID ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SETEUID = 183 #53466
+pkg syscall (freebsd-riscv64), const SYS_SETEUID ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SETFIB = 175 #53466
+pkg syscall (freebsd-riscv64), const SYS_SETFIB ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SETGID = 181 #53466
+pkg syscall (freebsd-riscv64), const SYS_SETGID ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SETGROUPS = 80 #53466
+pkg syscall (freebsd-riscv64), const SYS_SETGROUPS ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SETITIMER = 83 #53466
+pkg syscall (freebsd-riscv64), const SYS_SETITIMER ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SETLOGIN = 50 #53466
+pkg syscall (freebsd-riscv64), const SYS_SETLOGIN ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SETLOGINCLASS = 524 #53466
+pkg syscall (freebsd-riscv64), const SYS_SETLOGINCLASS ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SETPGID = 82 #53466
+pkg syscall (freebsd-riscv64), const SYS_SETPGID ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SETPRIORITY = 96 #53466
+pkg syscall (freebsd-riscv64), const SYS_SETPRIORITY ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SETREGID = 127 #53466
+pkg syscall (freebsd-riscv64), const SYS_SETREGID ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SETRESGID = 312 #53466
+pkg syscall (freebsd-riscv64), const SYS_SETRESGID ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SETRESUID = 311 #53466
+pkg syscall (freebsd-riscv64), const SYS_SETRESUID ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SETREUID = 126 #53466
+pkg syscall (freebsd-riscv64), const SYS_SETREUID ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SETRLIMIT = 195 #53466
+pkg syscall (freebsd-riscv64), const SYS_SETRLIMIT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SETSID = 147 #53466
+pkg syscall (freebsd-riscv64), const SYS_SETSID ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SETSOCKOPT = 105 #53466
+pkg syscall (freebsd-riscv64), const SYS_SETSOCKOPT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SETTIMEOFDAY = 122 #53466
+pkg syscall (freebsd-riscv64), const SYS_SETTIMEOFDAY ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SETUID = 23 #53466
+pkg syscall (freebsd-riscv64), const SYS_SETUID ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SHMAT = 228 #53466
+pkg syscall (freebsd-riscv64), const SYS_SHMAT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SHMCTL = 512 #53466
+pkg syscall (freebsd-riscv64), const SYS_SHMCTL ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SHMDT = 230 #53466
+pkg syscall (freebsd-riscv64), const SYS_SHMDT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SHMGET = 231 #53466
+pkg syscall (freebsd-riscv64), const SYS_SHMGET ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SHMSYS = 171 #53466
+pkg syscall (freebsd-riscv64), const SYS_SHMSYS ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SHM_OPEN = 482 #53466
+pkg syscall (freebsd-riscv64), const SYS_SHM_OPEN ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SHM_UNLINK = 483 #53466
+pkg syscall (freebsd-riscv64), const SYS_SHM_UNLINK ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SHUTDOWN = 134 #53466
+pkg syscall (freebsd-riscv64), const SYS_SHUTDOWN ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SIGACTION = 416 #53466
+pkg syscall (freebsd-riscv64), const SYS_SIGACTION ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SIGALTSTACK = 53 #53466
+pkg syscall (freebsd-riscv64), const SYS_SIGALTSTACK ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SIGPENDING = 343 #53466
+pkg syscall (freebsd-riscv64), const SYS_SIGPENDING ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SIGPROCMASK = 340 #53466
+pkg syscall (freebsd-riscv64), const SYS_SIGPROCMASK ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SIGQUEUE = 456 #53466
+pkg syscall (freebsd-riscv64), const SYS_SIGQUEUE ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SIGRETURN = 417 #53466
+pkg syscall (freebsd-riscv64), const SYS_SIGRETURN ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SIGSUSPEND = 341 #53466
+pkg syscall (freebsd-riscv64), const SYS_SIGSUSPEND ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SIGTIMEDWAIT = 345 #53466
+pkg syscall (freebsd-riscv64), const SYS_SIGTIMEDWAIT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SIGWAIT = 429 #53466
+pkg syscall (freebsd-riscv64), const SYS_SIGWAIT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SIGWAITINFO = 346 #53466
+pkg syscall (freebsd-riscv64), const SYS_SIGWAITINFO ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SOCKET = 97 #53466
+pkg syscall (freebsd-riscv64), const SYS_SOCKET ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SOCKETPAIR = 135 #53466
+pkg syscall (freebsd-riscv64), const SYS_SOCKETPAIR ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SSTK = 70 #53466
+pkg syscall (freebsd-riscv64), const SYS_SSTK ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_STATFS = 555 #53466
+pkg syscall (freebsd-riscv64), const SYS_STATFS ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SWAPCONTEXT = 423 #53466
+pkg syscall (freebsd-riscv64), const SYS_SWAPCONTEXT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SWAPOFF = 424 #53466
+pkg syscall (freebsd-riscv64), const SYS_SWAPOFF ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SWAPON = 85 #53466
+pkg syscall (freebsd-riscv64), const SYS_SWAPON ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SYMLINK = 57 #53466
+pkg syscall (freebsd-riscv64), const SYS_SYMLINK ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SYMLINKAT = 502 #53466
+pkg syscall (freebsd-riscv64), const SYS_SYMLINKAT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SYNC = 36 #53466
+pkg syscall (freebsd-riscv64), const SYS_SYNC ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_SYSARCH = 165 #53466
+pkg syscall (freebsd-riscv64), const SYS_SYSARCH ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_THR_CREATE = 430 #53466
+pkg syscall (freebsd-riscv64), const SYS_THR_CREATE ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_THR_EXIT = 431 #53466
+pkg syscall (freebsd-riscv64), const SYS_THR_EXIT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_THR_KILL = 433 #53466
+pkg syscall (freebsd-riscv64), const SYS_THR_KILL ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_THR_KILL2 = 481 #53466
+pkg syscall (freebsd-riscv64), const SYS_THR_KILL2 ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_THR_NEW = 455 #53466
+pkg syscall (freebsd-riscv64), const SYS_THR_NEW ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_THR_SELF = 432 #53466
+pkg syscall (freebsd-riscv64), const SYS_THR_SELF ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_THR_SET_NAME = 464 #53466
+pkg syscall (freebsd-riscv64), const SYS_THR_SET_NAME ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_THR_SUSPEND = 442 #53466
+pkg syscall (freebsd-riscv64), const SYS_THR_SUSPEND ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_THR_WAKE = 443 #53466
+pkg syscall (freebsd-riscv64), const SYS_THR_WAKE ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_TRUNCATE = 479 #53466
+pkg syscall (freebsd-riscv64), const SYS_TRUNCATE ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_UMASK = 60 #53466
+pkg syscall (freebsd-riscv64), const SYS_UMASK ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_UNDELETE = 205 #53466
+pkg syscall (freebsd-riscv64), const SYS_UNDELETE ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_UNLINK = 10 #53466
+pkg syscall (freebsd-riscv64), const SYS_UNLINK ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_UNLINKAT = 503 #53466
+pkg syscall (freebsd-riscv64), const SYS_UNLINKAT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_UNMOUNT = 22 #53466
+pkg syscall (freebsd-riscv64), const SYS_UNMOUNT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_UTIMENSAT = 547 #53466
+pkg syscall (freebsd-riscv64), const SYS_UTIMENSAT ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_UTIMES = 138 #53466
+pkg syscall (freebsd-riscv64), const SYS_UTIMES ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_UTRACE = 335 #53466
+pkg syscall (freebsd-riscv64), const SYS_UTRACE ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_UUIDGEN = 392 #53466
+pkg syscall (freebsd-riscv64), const SYS_UUIDGEN ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_VFORK = 66 #53466
+pkg syscall (freebsd-riscv64), const SYS_VFORK ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_WAIT4 = 7 #53466
+pkg syscall (freebsd-riscv64), const SYS_WAIT4 ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_WAIT6 = 532 #53466
+pkg syscall (freebsd-riscv64), const SYS_WAIT6 ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_WRITE = 4 #53466
+pkg syscall (freebsd-riscv64), const SYS_WRITE ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_WRITEV = 121 #53466
+pkg syscall (freebsd-riscv64), const SYS_WRITEV ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS_YIELD = 321 #53466
+pkg syscall (freebsd-riscv64), const SYS_YIELD ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS__UMTX_OP = 454 #53466
+pkg syscall (freebsd-riscv64), const SYS__UMTX_OP ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS___ACL_ACLCHECK_FD = 354 #53466
+pkg syscall (freebsd-riscv64), const SYS___ACL_ACLCHECK_FD ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS___ACL_ACLCHECK_FILE = 353 #53466
+pkg syscall (freebsd-riscv64), const SYS___ACL_ACLCHECK_FILE ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS___ACL_ACLCHECK_LINK = 428 #53466
+pkg syscall (freebsd-riscv64), const SYS___ACL_ACLCHECK_LINK ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS___ACL_DELETE_FD = 352 #53466
+pkg syscall (freebsd-riscv64), const SYS___ACL_DELETE_FD ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS___ACL_DELETE_FILE = 351 #53466
+pkg syscall (freebsd-riscv64), const SYS___ACL_DELETE_FILE ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS___ACL_DELETE_LINK = 427 #53466
+pkg syscall (freebsd-riscv64), const SYS___ACL_DELETE_LINK ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS___ACL_GET_FD = 349 #53466
+pkg syscall (freebsd-riscv64), const SYS___ACL_GET_FD ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS___ACL_GET_FILE = 347 #53466
+pkg syscall (freebsd-riscv64), const SYS___ACL_GET_FILE ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS___ACL_GET_LINK = 425 #53466
+pkg syscall (freebsd-riscv64), const SYS___ACL_GET_LINK ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS___ACL_SET_FD = 350 #53466
+pkg syscall (freebsd-riscv64), const SYS___ACL_SET_FD ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS___ACL_SET_FILE = 348 #53466
+pkg syscall (freebsd-riscv64), const SYS___ACL_SET_FILE ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS___ACL_SET_LINK = 426 #53466
+pkg syscall (freebsd-riscv64), const SYS___ACL_SET_LINK ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS___CAP_RIGHTS_GET = 515 #53466
+pkg syscall (freebsd-riscv64), const SYS___CAP_RIGHTS_GET ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS___GETCWD = 326 #53466
+pkg syscall (freebsd-riscv64), const SYS___GETCWD ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS___MAC_EXECVE = 415 #53466
+pkg syscall (freebsd-riscv64), const SYS___MAC_EXECVE ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS___MAC_GET_FD = 386 #53466
+pkg syscall (freebsd-riscv64), const SYS___MAC_GET_FD ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS___MAC_GET_FILE = 387 #53466
+pkg syscall (freebsd-riscv64), const SYS___MAC_GET_FILE ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS___MAC_GET_LINK = 410 #53466
+pkg syscall (freebsd-riscv64), const SYS___MAC_GET_LINK ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS___MAC_GET_PID = 409 #53466
+pkg syscall (freebsd-riscv64), const SYS___MAC_GET_PID ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS___MAC_GET_PROC = 384 #53466
+pkg syscall (freebsd-riscv64), const SYS___MAC_GET_PROC ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS___MAC_SET_FD = 388 #53466
+pkg syscall (freebsd-riscv64), const SYS___MAC_SET_FD ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS___MAC_SET_FILE = 389 #53466
+pkg syscall (freebsd-riscv64), const SYS___MAC_SET_FILE ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS___MAC_SET_LINK = 411 #53466
+pkg syscall (freebsd-riscv64), const SYS___MAC_SET_LINK ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS___MAC_SET_PROC = 385 #53466
+pkg syscall (freebsd-riscv64), const SYS___MAC_SET_PROC ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS___SEMCTL = 510 #53466
+pkg syscall (freebsd-riscv64), const SYS___SEMCTL ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS___SETUGID = 374 #53466
+pkg syscall (freebsd-riscv64), const SYS___SETUGID ideal-int #53466
+pkg syscall (freebsd-riscv64), const SYS___SYSCTL = 202 #53466
+pkg syscall (freebsd-riscv64), const SYS___SYSCTL ideal-int #53466
+pkg syscall (freebsd-riscv64), const S_IFMT = 61440 #53466
+pkg syscall (freebsd-riscv64), const S_IRWXG = 56 #53466
+pkg syscall (freebsd-riscv64), const S_IRWXG ideal-int #53466
+pkg syscall (freebsd-riscv64), const S_IRWXO = 7 #53466
+pkg syscall (freebsd-riscv64), const S_IRWXO ideal-int #53466
+pkg syscall (freebsd-riscv64), const SizeofBpfHdr = 32 #53466
+pkg syscall (freebsd-riscv64), const SizeofBpfHdr ideal-int #53466
+pkg syscall (freebsd-riscv64), const SizeofBpfInsn = 8 #53466
+pkg syscall (freebsd-riscv64), const SizeofBpfInsn ideal-int #53466
+pkg syscall (freebsd-riscv64), const SizeofBpfProgram = 16 #53466
+pkg syscall (freebsd-riscv64), const SizeofBpfProgram ideal-int #53466
+pkg syscall (freebsd-riscv64), const SizeofBpfStat = 8 #53466
+pkg syscall (freebsd-riscv64), const SizeofBpfStat ideal-int #53466
+pkg syscall (freebsd-riscv64), const SizeofBpfVersion = 4 #53466
+pkg syscall (freebsd-riscv64), const SizeofBpfVersion ideal-int #53466
+pkg syscall (freebsd-riscv64), const SizeofBpfZbuf = 24 #53466
+pkg syscall (freebsd-riscv64), const SizeofBpfZbuf ideal-int #53466
+pkg syscall (freebsd-riscv64), const SizeofBpfZbufHeader = 32 #53466
+pkg syscall (freebsd-riscv64), const SizeofBpfZbufHeader ideal-int #53466
+pkg syscall (freebsd-riscv64), const SizeofCmsghdr = 12 #53466
+pkg syscall (freebsd-riscv64), const SizeofCmsghdr ideal-int #53466
+pkg syscall (freebsd-riscv64), const SizeofICMPv6Filter = 32 #53466
+pkg syscall (freebsd-riscv64), const SizeofICMPv6Filter ideal-int #53466
+pkg syscall (freebsd-riscv64), const SizeofIPMreq = 8 #53466
+pkg syscall (freebsd-riscv64), const SizeofIPMreq ideal-int #53466
+pkg syscall (freebsd-riscv64), const SizeofIPMreqn = 12 #53466
+pkg syscall (freebsd-riscv64), const SizeofIPMreqn ideal-int #53466
+pkg syscall (freebsd-riscv64), const SizeofIPv6MTUInfo = 32 #53466
+pkg syscall (freebsd-riscv64), const SizeofIPv6MTUInfo ideal-int #53466
+pkg syscall (freebsd-riscv64), const SizeofIPv6Mreq = 20 #53466
+pkg syscall (freebsd-riscv64), const SizeofIPv6Mreq ideal-int #53466
+pkg syscall (freebsd-riscv64), const SizeofIfAnnounceMsghdr = 24 #53466
+pkg syscall (freebsd-riscv64), const SizeofIfAnnounceMsghdr ideal-int #53466
+pkg syscall (freebsd-riscv64), const SizeofIfData = 152 #53466
+pkg syscall (freebsd-riscv64), const SizeofIfData ideal-int #53466
+pkg syscall (freebsd-riscv64), const SizeofIfMsghdr = 168 #53466
+pkg syscall (freebsd-riscv64), const SizeofIfMsghdr ideal-int #53466
+pkg syscall (freebsd-riscv64), const SizeofIfaMsghdr = 20 #53466
+pkg syscall (freebsd-riscv64), const SizeofIfaMsghdr ideal-int #53466
+pkg syscall (freebsd-riscv64), const SizeofIfmaMsghdr = 16 #53466
+pkg syscall (freebsd-riscv64), const SizeofIfmaMsghdr ideal-int #53466
+pkg syscall (freebsd-riscv64), const SizeofInet6Pktinfo = 20 #53466
+pkg syscall (freebsd-riscv64), const SizeofInet6Pktinfo ideal-int #53466
+pkg syscall (freebsd-riscv64), const SizeofLinger = 8 #53466
+pkg syscall (freebsd-riscv64), const SizeofLinger ideal-int #53466
+pkg syscall (freebsd-riscv64), const SizeofMsghdr = 48 #53466
+pkg syscall (freebsd-riscv64), const SizeofMsghdr ideal-int #53466
+pkg syscall (freebsd-riscv64), const SizeofRtMetrics = 112 #53466
+pkg syscall (freebsd-riscv64), const SizeofRtMetrics ideal-int #53466
+pkg syscall (freebsd-riscv64), const SizeofRtMsghdr = 152 #53466
+pkg syscall (freebsd-riscv64), const SizeofRtMsghdr ideal-int #53466
+pkg syscall (freebsd-riscv64), const SizeofSockaddrAny = 108 #53466
+pkg syscall (freebsd-riscv64), const SizeofSockaddrAny ideal-int #53466
+pkg syscall (freebsd-riscv64), const SizeofSockaddrDatalink = 54 #53466
+pkg syscall (freebsd-riscv64), const SizeofSockaddrDatalink ideal-int #53466
+pkg syscall (freebsd-riscv64), const SizeofSockaddrInet4 = 16 #53466
+pkg syscall (freebsd-riscv64), const SizeofSockaddrInet4 ideal-int #53466
+pkg syscall (freebsd-riscv64), const SizeofSockaddrInet6 = 28 #53466
+pkg syscall (freebsd-riscv64), const SizeofSockaddrInet6 ideal-int #53466
+pkg syscall (freebsd-riscv64), const SizeofSockaddrUnix = 106 #53466
+pkg syscall (freebsd-riscv64), const SizeofSockaddrUnix ideal-int #53466
+pkg syscall (freebsd-riscv64), const TCIFLUSH = 1 #53466
+pkg syscall (freebsd-riscv64), const TCIFLUSH ideal-int #53466
+pkg syscall (freebsd-riscv64), const TCIOFLUSH = 3 #53466
+pkg syscall (freebsd-riscv64), const TCIOFLUSH ideal-int #53466
+pkg syscall (freebsd-riscv64), const TCOFLUSH = 2 #53466
+pkg syscall (freebsd-riscv64), const TCOFLUSH ideal-int #53466
+pkg syscall (freebsd-riscv64), const TCP_CA_NAME_MAX = 16 #53466
+pkg syscall (freebsd-riscv64), const TCP_CA_NAME_MAX ideal-int #53466
+pkg syscall (freebsd-riscv64), const TCP_CONGESTION = 64 #53466
+pkg syscall (freebsd-riscv64), const TCP_CONGESTION ideal-int #53466
+pkg syscall (freebsd-riscv64), const TCP_INFO = 32 #53466
+pkg syscall (freebsd-riscv64), const TCP_INFO ideal-int #53466
+pkg syscall (freebsd-riscv64), const TCP_KEEPCNT = 1024 #53466
+pkg syscall (freebsd-riscv64), const TCP_KEEPCNT ideal-int #53466
+pkg syscall (freebsd-riscv64), const TCP_KEEPIDLE = 256 #53466
+pkg syscall (freebsd-riscv64), const TCP_KEEPIDLE ideal-int #53466
+pkg syscall (freebsd-riscv64), const TCP_KEEPINIT = 128 #53466
+pkg syscall (freebsd-riscv64), const TCP_KEEPINIT ideal-int #53466
+pkg syscall (freebsd-riscv64), const TCP_KEEPINTVL = 512 #53466
+pkg syscall (freebsd-riscv64), const TCP_KEEPINTVL ideal-int #53466
+pkg syscall (freebsd-riscv64), const TCP_MAXBURST = 4 #53466
+pkg syscall (freebsd-riscv64), const TCP_MAXBURST ideal-int #53466
+pkg syscall (freebsd-riscv64), const TCP_MAXHLEN = 60 #53466
+pkg syscall (freebsd-riscv64), const TCP_MAXHLEN ideal-int #53466
+pkg syscall (freebsd-riscv64), const TCP_MAXOLEN = 40 #53466
+pkg syscall (freebsd-riscv64), const TCP_MAXOLEN ideal-int #53466
+pkg syscall (freebsd-riscv64), const TCP_MAXSEG = 2 #53466
+pkg syscall (freebsd-riscv64), const TCP_MAXSEG ideal-int #53466
+pkg syscall (freebsd-riscv64), const TCP_MAXWIN = 65535 #53466
+pkg syscall (freebsd-riscv64), const TCP_MAXWIN ideal-int #53466
+pkg syscall (freebsd-riscv64), const TCP_MAX_SACK = 4 #53466
+pkg syscall (freebsd-riscv64), const TCP_MAX_SACK ideal-int #53466
+pkg syscall (freebsd-riscv64), const TCP_MAX_WINSHIFT = 14 #53466
+pkg syscall (freebsd-riscv64), const TCP_MAX_WINSHIFT ideal-int #53466
+pkg syscall (freebsd-riscv64), const TCP_MD5SIG = 16 #53466
+pkg syscall (freebsd-riscv64), const TCP_MD5SIG ideal-int #53466
+pkg syscall (freebsd-riscv64), const TCP_MINMSS = 216 #53466
+pkg syscall (freebsd-riscv64), const TCP_MINMSS ideal-int #53466
+pkg syscall (freebsd-riscv64), const TCP_MSS = 536 #53466
+pkg syscall (freebsd-riscv64), const TCP_MSS ideal-int #53466
+pkg syscall (freebsd-riscv64), const TCP_NOOPT = 8 #53466
+pkg syscall (freebsd-riscv64), const TCP_NOOPT ideal-int #53466
+pkg syscall (freebsd-riscv64), const TCP_NOPUSH = 4 #53466
+pkg syscall (freebsd-riscv64), const TCP_NOPUSH ideal-int #53466
+pkg syscall (freebsd-riscv64), const TCP_VENDOR = 2147483648 #53466
+pkg syscall (freebsd-riscv64), const TCP_VENDOR ideal-int #53466
+pkg syscall (freebsd-riscv64), const TCSAFLUSH = 2 #53466
+pkg syscall (freebsd-riscv64), const TCSAFLUSH ideal-int #53466
+pkg syscall (freebsd-riscv64), const TIOCCBRK = 536900730 #53466
+pkg syscall (freebsd-riscv64), const TIOCCBRK ideal-int #53466
+pkg syscall (freebsd-riscv64), const TIOCCDTR = 536900728 #53466
+pkg syscall (freebsd-riscv64), const TIOCCDTR ideal-int #53466
+pkg syscall (freebsd-riscv64), const TIOCCONS = 2147775586 #53466
+pkg syscall (freebsd-riscv64), const TIOCCONS ideal-int #53466
+pkg syscall (freebsd-riscv64), const TIOCDRAIN = 536900702 #53466
+pkg syscall (freebsd-riscv64), const TIOCDRAIN ideal-int #53466
+pkg syscall (freebsd-riscv64), const TIOCEXCL = 536900621 #53466
+pkg syscall (freebsd-riscv64), const TIOCEXCL ideal-int #53466
+pkg syscall (freebsd-riscv64), const TIOCEXT = 2147775584 #53466
+pkg syscall (freebsd-riscv64), const TIOCEXT ideal-int #53466
+pkg syscall (freebsd-riscv64), const TIOCFLUSH = 2147775504 #53466
+pkg syscall (freebsd-riscv64), const TIOCFLUSH ideal-int #53466
+pkg syscall (freebsd-riscv64), const TIOCGDRAINWAIT = 1074033750 #53466
+pkg syscall (freebsd-riscv64), const TIOCGDRAINWAIT ideal-int #53466
+pkg syscall (freebsd-riscv64), const TIOCGETA = 1076655123 #53466
+pkg syscall (freebsd-riscv64), const TIOCGETA ideal-int #53466
+pkg syscall (freebsd-riscv64), const TIOCGETD = 1074033690 #53466
+pkg syscall (freebsd-riscv64), const TIOCGETD ideal-int #53466
+pkg syscall (freebsd-riscv64), const TIOCGPGRP = 1074033783 #53466
+pkg syscall (freebsd-riscv64), const TIOCGPGRP ideal-int #53466
+pkg syscall (freebsd-riscv64), const TIOCGPTN = 1074033679 #53466
+pkg syscall (freebsd-riscv64), const TIOCGPTN ideal-int #53466
+pkg syscall (freebsd-riscv64), const TIOCGSID = 1074033763 #53466
+pkg syscall (freebsd-riscv64), const TIOCGSID ideal-int #53466
+pkg syscall (freebsd-riscv64), const TIOCGWINSZ = 1074295912 #53466
+pkg syscall (freebsd-riscv64), const TIOCGWINSZ ideal-int #53466
+pkg syscall (freebsd-riscv64), const TIOCMBIC = 2147775595 #53466
+pkg syscall (freebsd-riscv64), const TIOCMBIC ideal-int #53466
+pkg syscall (freebsd-riscv64), const TIOCMBIS = 2147775596 #53466
+pkg syscall (freebsd-riscv64), const TIOCMBIS ideal-int #53466
+pkg syscall (freebsd-riscv64), const TIOCMGDTRWAIT = 1074033754 #53466
+pkg syscall (freebsd-riscv64), const TIOCMGDTRWAIT ideal-int #53466
+pkg syscall (freebsd-riscv64), const TIOCMGET = 1074033770 #53466
+pkg syscall (freebsd-riscv64), const TIOCMGET ideal-int #53466
+pkg syscall (freebsd-riscv64), const TIOCMSDTRWAIT = 2147775579 #53466
+pkg syscall (freebsd-riscv64), const TIOCMSDTRWAIT ideal-int #53466
+pkg syscall (freebsd-riscv64), const TIOCMSET = 2147775597 #53466
+pkg syscall (freebsd-riscv64), const TIOCMSET ideal-int #53466
+pkg syscall (freebsd-riscv64), const TIOCM_CAR = 64 #53466
+pkg syscall (freebsd-riscv64), const TIOCM_CAR ideal-int #53466
+pkg syscall (freebsd-riscv64), const TIOCM_CD = 64 #53466
+pkg syscall (freebsd-riscv64), const TIOCM_CD ideal-int #53466
+pkg syscall (freebsd-riscv64), const TIOCM_CTS = 32 #53466
+pkg syscall (freebsd-riscv64), const TIOCM_CTS ideal-int #53466
+pkg syscall (freebsd-riscv64), const TIOCM_DCD = 64 #53466
+pkg syscall (freebsd-riscv64), const TIOCM_DCD ideal-int #53466
+pkg syscall (freebsd-riscv64), const TIOCM_DSR = 256 #53466
+pkg syscall (freebsd-riscv64), const TIOCM_DSR ideal-int #53466
+pkg syscall (freebsd-riscv64), const TIOCM_DTR = 2 #53466
+pkg syscall (freebsd-riscv64), const TIOCM_DTR ideal-int #53466
+pkg syscall (freebsd-riscv64), const TIOCM_LE = 1 #53466
+pkg syscall (freebsd-riscv64), const TIOCM_LE ideal-int #53466
+pkg syscall (freebsd-riscv64), const TIOCM_RI = 128 #53466
+pkg syscall (freebsd-riscv64), const TIOCM_RI ideal-int #53466
+pkg syscall (freebsd-riscv64), const TIOCM_RNG = 128 #53466
+pkg syscall (freebsd-riscv64), const TIOCM_RNG ideal-int #53466
+pkg syscall (freebsd-riscv64), const TIOCM_RTS = 4 #53466
+pkg syscall (freebsd-riscv64), const TIOCM_RTS ideal-int #53466
+pkg syscall (freebsd-riscv64), const TIOCM_SR = 16 #53466
+pkg syscall (freebsd-riscv64), const TIOCM_SR ideal-int #53466
+pkg syscall (freebsd-riscv64), const TIOCM_ST = 8 #53466
+pkg syscall (freebsd-riscv64), const TIOCM_ST ideal-int #53466
+pkg syscall (freebsd-riscv64), const TIOCNOTTY = 536900721 #53466
+pkg syscall (freebsd-riscv64), const TIOCNOTTY ideal-int #53466
+pkg syscall (freebsd-riscv64), const TIOCNXCL = 536900622 #53466
+pkg syscall (freebsd-riscv64), const TIOCNXCL ideal-int #53466
+pkg syscall (freebsd-riscv64), const TIOCOUTQ = 1074033779 #53466
+pkg syscall (freebsd-riscv64), const TIOCOUTQ ideal-int #53466
+pkg syscall (freebsd-riscv64), const TIOCPKT = 2147775600 #53466
+pkg syscall (freebsd-riscv64), const TIOCPKT ideal-int #53466
+pkg syscall (freebsd-riscv64), const TIOCPKT_DATA = 0 #53466
+pkg syscall (freebsd-riscv64), const TIOCPKT_DATA ideal-int #53466
+pkg syscall (freebsd-riscv64), const TIOCPKT_DOSTOP = 32 #53466
+pkg syscall (freebsd-riscv64), const TIOCPKT_DOSTOP ideal-int #53466
+pkg syscall (freebsd-riscv64), const TIOCPKT_FLUSHREAD = 1 #53466
+pkg syscall (freebsd-riscv64), const TIOCPKT_FLUSHREAD ideal-int #53466
+pkg syscall (freebsd-riscv64), const TIOCPKT_FLUSHWRITE = 2 #53466
+pkg syscall (freebsd-riscv64), const TIOCPKT_FLUSHWRITE ideal-int #53466
+pkg syscall (freebsd-riscv64), const TIOCPKT_IOCTL = 64 #53466
+pkg syscall (freebsd-riscv64), const TIOCPKT_IOCTL ideal-int #53466
+pkg syscall (freebsd-riscv64), const TIOCPKT_NOSTOP = 16 #53466
+pkg syscall (freebsd-riscv64), const TIOCPKT_NOSTOP ideal-int #53466
+pkg syscall (freebsd-riscv64), const TIOCPKT_START = 8 #53466
+pkg syscall (freebsd-riscv64), const TIOCPKT_START ideal-int #53466
+pkg syscall (freebsd-riscv64), const TIOCPKT_STOP = 4 #53466
+pkg syscall (freebsd-riscv64), const TIOCPKT_STOP ideal-int #53466
+pkg syscall (freebsd-riscv64), const TIOCPTMASTER = 536900636 #53466
+pkg syscall (freebsd-riscv64), const TIOCPTMASTER ideal-int #53466
+pkg syscall (freebsd-riscv64), const TIOCSBRK = 536900731 #53466
+pkg syscall (freebsd-riscv64), const TIOCSBRK ideal-int #53466
+pkg syscall (freebsd-riscv64), const TIOCSCTTY = 536900705 #53466
+pkg syscall (freebsd-riscv64), const TIOCSCTTY ideal-int #53466
+pkg syscall (freebsd-riscv64), const TIOCSDRAINWAIT = 2147775575 #53466
+pkg syscall (freebsd-riscv64), const TIOCSDRAINWAIT ideal-int #53466
+pkg syscall (freebsd-riscv64), const TIOCSDTR = 536900729 #53466
+pkg syscall (freebsd-riscv64), const TIOCSDTR ideal-int #53466
+pkg syscall (freebsd-riscv64), const TIOCSETA = 2150396948 #53466
+pkg syscall (freebsd-riscv64), const TIOCSETA ideal-int #53466
+pkg syscall (freebsd-riscv64), const TIOCSETAF = 2150396950 #53466
+pkg syscall (freebsd-riscv64), const TIOCSETAF ideal-int #53466
+pkg syscall (freebsd-riscv64), const TIOCSETAW = 2150396949 #53466
+pkg syscall (freebsd-riscv64), const TIOCSETAW ideal-int #53466
+pkg syscall (freebsd-riscv64), const TIOCSETD = 2147775515 #53466
+pkg syscall (freebsd-riscv64), const TIOCSETD ideal-int #53466
+pkg syscall (freebsd-riscv64), const TIOCSIG = 537162847 #53466
+pkg syscall (freebsd-riscv64), const TIOCSIG ideal-int #53466
+pkg syscall (freebsd-riscv64), const TIOCSPGRP = 2147775606 #53466
+pkg syscall (freebsd-riscv64), const TIOCSPGRP ideal-int #53466
+pkg syscall (freebsd-riscv64), const TIOCSTART = 536900718 #53466
+pkg syscall (freebsd-riscv64), const TIOCSTART ideal-int #53466
+pkg syscall (freebsd-riscv64), const TIOCSTAT = 536900709 #53466
+pkg syscall (freebsd-riscv64), const TIOCSTAT ideal-int #53466
+pkg syscall (freebsd-riscv64), const TIOCSTI = 2147578994 #53466
+pkg syscall (freebsd-riscv64), const TIOCSTI ideal-int #53466
+pkg syscall (freebsd-riscv64), const TIOCSTOP = 536900719 #53466
+pkg syscall (freebsd-riscv64), const TIOCSTOP ideal-int #53466
+pkg syscall (freebsd-riscv64), const TIOCSWINSZ = 2148037735 #53466
+pkg syscall (freebsd-riscv64), const TIOCSWINSZ ideal-int #53466
+pkg syscall (freebsd-riscv64), const TIOCTIMESTAMP = 1074820185 #53466
+pkg syscall (freebsd-riscv64), const TIOCTIMESTAMP ideal-int #53466
+pkg syscall (freebsd-riscv64), const TIOCUCNTL = 2147775590 #53466
+pkg syscall (freebsd-riscv64), const TIOCUCNTL ideal-int #53466
+pkg syscall (freebsd-riscv64), const TOSTOP = 4194304 #53466
+pkg syscall (freebsd-riscv64), const TOSTOP ideal-int #53466
+pkg syscall (freebsd-riscv64), const VDISCARD = 15 #53466
+pkg syscall (freebsd-riscv64), const VDISCARD ideal-int #53466
+pkg syscall (freebsd-riscv64), const VDSUSP = 11 #53466
+pkg syscall (freebsd-riscv64), const VDSUSP ideal-int #53466
+pkg syscall (freebsd-riscv64), const VEOF = 0 #53466
+pkg syscall (freebsd-riscv64), const VEOF ideal-int #53466
+pkg syscall (freebsd-riscv64), const VEOL = 1 #53466
+pkg syscall (freebsd-riscv64), const VEOL ideal-int #53466
+pkg syscall (freebsd-riscv64), const VEOL2 = 2 #53466
+pkg syscall (freebsd-riscv64), const VEOL2 ideal-int #53466
+pkg syscall (freebsd-riscv64), const VERASE = 3 #53466
+pkg syscall (freebsd-riscv64), const VERASE ideal-int #53466
+pkg syscall (freebsd-riscv64), const VERASE2 = 7 #53466
+pkg syscall (freebsd-riscv64), const VERASE2 ideal-int #53466
+pkg syscall (freebsd-riscv64), const VINTR = 8 #53466
+pkg syscall (freebsd-riscv64), const VINTR ideal-int #53466
+pkg syscall (freebsd-riscv64), const VKILL = 5 #53466
+pkg syscall (freebsd-riscv64), const VKILL ideal-int #53466
+pkg syscall (freebsd-riscv64), const VLNEXT = 14 #53466
+pkg syscall (freebsd-riscv64), const VLNEXT ideal-int #53466
+pkg syscall (freebsd-riscv64), const VMIN = 16 #53466
+pkg syscall (freebsd-riscv64), const VMIN ideal-int #53466
+pkg syscall (freebsd-riscv64), const VQUIT = 9 #53466
+pkg syscall (freebsd-riscv64), const VQUIT ideal-int #53466
+pkg syscall (freebsd-riscv64), const VREPRINT = 6 #53466
+pkg syscall (freebsd-riscv64), const VREPRINT ideal-int #53466
+pkg syscall (freebsd-riscv64), const VSTART = 12 #53466
+pkg syscall (freebsd-riscv64), const VSTART ideal-int #53466
+pkg syscall (freebsd-riscv64), const VSTATUS = 18 #53466
+pkg syscall (freebsd-riscv64), const VSTATUS ideal-int #53466
+pkg syscall (freebsd-riscv64), const VSTOP = 13 #53466
+pkg syscall (freebsd-riscv64), const VSTOP ideal-int #53466
+pkg syscall (freebsd-riscv64), const VSUSP = 10 #53466
+pkg syscall (freebsd-riscv64), const VSUSP ideal-int #53466
+pkg syscall (freebsd-riscv64), const VTIME = 17 #53466
+pkg syscall (freebsd-riscv64), const VTIME ideal-int #53466
+pkg syscall (freebsd-riscv64), const VWERASE = 4 #53466
+pkg syscall (freebsd-riscv64), const VWERASE ideal-int #53466
+pkg syscall (freebsd-riscv64), const WCONTINUED = 4 #53466
+pkg syscall (freebsd-riscv64), const WCONTINUED ideal-int #53466
+pkg syscall (freebsd-riscv64), const WCOREFLAG = 128 #53466
+pkg syscall (freebsd-riscv64), const WCOREFLAG ideal-int #53466
+pkg syscall (freebsd-riscv64), const WEXITED = 16 #53466
+pkg syscall (freebsd-riscv64), const WEXITED ideal-int #53466
+pkg syscall (freebsd-riscv64), const WLINUXCLONE = 2147483648 #53466
+pkg syscall (freebsd-riscv64), const WLINUXCLONE ideal-int #53466
+pkg syscall (freebsd-riscv64), const WNOHANG = 1 #53466
+pkg syscall (freebsd-riscv64), const WNOHANG ideal-int #53466
+pkg syscall (freebsd-riscv64), const WNOWAIT = 8 #53466
+pkg syscall (freebsd-riscv64), const WNOWAIT ideal-int #53466
+pkg syscall (freebsd-riscv64), const WSTOPPED = 2 #53466
+pkg syscall (freebsd-riscv64), const WSTOPPED ideal-int #53466
+pkg syscall (freebsd-riscv64), const WTRAPPED = 32 #53466
+pkg syscall (freebsd-riscv64), const WTRAPPED ideal-int #53466
+pkg syscall (freebsd-riscv64), const WUNTRACED = 2 #53466
+pkg syscall (freebsd-riscv64), const WUNTRACED ideal-int #53466
+pkg syscall (freebsd-riscv64), func Accept(int) (int, Sockaddr, error) #53466
+pkg syscall (freebsd-riscv64), func Accept4(int, int) (int, Sockaddr, error) #53466
+pkg syscall (freebsd-riscv64), func Access(string, uint32) error #53466
+pkg syscall (freebsd-riscv64), func Adjtime(*Timeval, *Timeval) error #53466
+pkg syscall (freebsd-riscv64), func Bind(int, Sockaddr) error #53466
+pkg syscall (freebsd-riscv64), func BpfBuflen //deprecated #53466
+pkg syscall (freebsd-riscv64), func BpfBuflen(int) (int, error) #53466
+pkg syscall (freebsd-riscv64), func BpfDatalink //deprecated #53466
+pkg syscall (freebsd-riscv64), func BpfDatalink(int) (int, error) #53466
+pkg syscall (freebsd-riscv64), func BpfHeadercmpl //deprecated #53466
+pkg syscall (freebsd-riscv64), func BpfHeadercmpl(int) (int, error) #53466
+pkg syscall (freebsd-riscv64), func BpfInterface //deprecated #53466
+pkg syscall (freebsd-riscv64), func BpfInterface(int, string) (string, error) #53466
+pkg syscall (freebsd-riscv64), func BpfJump //deprecated #53466
+pkg syscall (freebsd-riscv64), func BpfJump(int, int, int, int) *BpfInsn #53466
+pkg syscall (freebsd-riscv64), func BpfStats //deprecated #53466
+pkg syscall (freebsd-riscv64), func BpfStats(int) (*BpfStat, error) #53466
+pkg syscall (freebsd-riscv64), func BpfStmt //deprecated #53466
+pkg syscall (freebsd-riscv64), func BpfStmt(int, int) *BpfInsn #53466
+pkg syscall (freebsd-riscv64), func BpfTimeout //deprecated #53466
+pkg syscall (freebsd-riscv64), func BpfTimeout(int) (*Timeval, error) #53466
+pkg syscall (freebsd-riscv64), func CheckBpfVersion //deprecated #53466
+pkg syscall (freebsd-riscv64), func CheckBpfVersion(int) error #53466
+pkg syscall (freebsd-riscv64), func Chflags(string, int) error #53466
+pkg syscall (freebsd-riscv64), func Chroot(string) error #53466
+pkg syscall (freebsd-riscv64), func Close(int) error #53466
+pkg syscall (freebsd-riscv64), func CloseOnExec(int) #53466
+pkg syscall (freebsd-riscv64), func CmsgLen(int) int #53466
+pkg syscall (freebsd-riscv64), func CmsgSpace(int) int #53466
+pkg syscall (freebsd-riscv64), func Connect(int, Sockaddr) error #53466
+pkg syscall (freebsd-riscv64), func Dup(int) (int, error) #53466
+pkg syscall (freebsd-riscv64), func Dup2(int, int) error #53466
+pkg syscall (freebsd-riscv64), func Fchdir(int) error #53466
+pkg syscall (freebsd-riscv64), func Fchflags(int, int) error #53466
+pkg syscall (freebsd-riscv64), func Fchmod(int, uint32) error #53466
+pkg syscall (freebsd-riscv64), func Fchown(int, int, int) error #53466
+pkg syscall (freebsd-riscv64), func FcntlFlock(uintptr, int, *Flock_t) error #53466
+pkg syscall (freebsd-riscv64), func Flock(int, int) error #53466
+pkg syscall (freebsd-riscv64), func FlushBpf //deprecated #53466
+pkg syscall (freebsd-riscv64), func FlushBpf(int) error #53466
+pkg syscall (freebsd-riscv64), func ForkExec(string, []string, *ProcAttr) (int, error) #53466
+pkg syscall (freebsd-riscv64), func Fpathconf(int, int) (int, error) #53466
+pkg syscall (freebsd-riscv64), func Fstat(int, *Stat_t) error #53466
+pkg syscall (freebsd-riscv64), func Fstatat(int, string, *Stat_t, int) error #53466
+pkg syscall (freebsd-riscv64), func Fstatfs(int, *Statfs_t) error #53466
+pkg syscall (freebsd-riscv64), func Fsync(int) error #53466
+pkg syscall (freebsd-riscv64), func Ftruncate(int, int64) error #53466
+pkg syscall (freebsd-riscv64), func Futimes(int, []Timeval) error #53466
+pkg syscall (freebsd-riscv64), func Getdirentries(int, []uint8, *uintptr) (int, error) #53466
+pkg syscall (freebsd-riscv64), func Getdtablesize() int #53466
+pkg syscall (freebsd-riscv64), func Getfsstat([]Statfs_t, int) (int, error) #53466
+pkg syscall (freebsd-riscv64), func Getpeername(int) (Sockaddr, error) #53466
+pkg syscall (freebsd-riscv64), func Getpgid(int) (int, error) #53466
+pkg syscall (freebsd-riscv64), func Getpgrp() int #53466
+pkg syscall (freebsd-riscv64), func Getpriority(int, int) (int, error) #53466
+pkg syscall (freebsd-riscv64), func Getrlimit(int, *Rlimit) error #53466
+pkg syscall (freebsd-riscv64), func Getrusage(int, *Rusage) error #53466
+pkg syscall (freebsd-riscv64), func Getsid(int) (int, error) #53466
+pkg syscall (freebsd-riscv64), func Getsockname(int) (Sockaddr, error) #53466
+pkg syscall (freebsd-riscv64), func GetsockoptByte(int, int, int) (uint8, error) #53466
+pkg syscall (freebsd-riscv64), func GetsockoptICMPv6Filter(int, int, int) (*ICMPv6Filter, error) #53466
+pkg syscall (freebsd-riscv64), func GetsockoptIPMreq(int, int, int) (*IPMreq, error) #53466
+pkg syscall (freebsd-riscv64), func GetsockoptIPMreqn(int, int, int) (*IPMreqn, error) #53466
+pkg syscall (freebsd-riscv64), func GetsockoptIPv6MTUInfo(int, int, int) (*IPv6MTUInfo, error) #53466
+pkg syscall (freebsd-riscv64), func GetsockoptIPv6Mreq(int, int, int) (*IPv6Mreq, error) #53466
+pkg syscall (freebsd-riscv64), func GetsockoptInet4Addr(int, int, int) ([4]uint8, error) #53466
+pkg syscall (freebsd-riscv64), func GetsockoptInt(int, int, int) (int, error) #53466
+pkg syscall (freebsd-riscv64), func Issetugid() bool #53466
+pkg syscall (freebsd-riscv64), func Kevent(int, []Kevent_t, []Kevent_t, *Timespec) (int, error) #53466
+pkg syscall (freebsd-riscv64), func Kill(int, Signal) error #53466
+pkg syscall (freebsd-riscv64), func Kqueue() (int, error) #53466
+pkg syscall (freebsd-riscv64), func Listen(int, int) error #53466
+pkg syscall (freebsd-riscv64), func Lstat(string, *Stat_t) error #53466
+pkg syscall (freebsd-riscv64), func Mkfifo(string, uint32) error #53466
+pkg syscall (freebsd-riscv64), func Mknod(string, uint32, uint64) error #53466
+pkg syscall (freebsd-riscv64), func Mmap(int, int64, int, int, int) ([]uint8, error) #53466
+pkg syscall (freebsd-riscv64), func Munmap([]uint8) error #53466
+pkg syscall (freebsd-riscv64), func Nanosleep(*Timespec, *Timespec) error #53466
+pkg syscall (freebsd-riscv64), func Open(string, int, uint32) (int, error) #53466
+pkg syscall (freebsd-riscv64), func ParseDirent([]uint8, int, []string) (int, int, []string) #53466
+pkg syscall (freebsd-riscv64), func ParseRoutingMessage //deprecated #53466
+pkg syscall (freebsd-riscv64), func ParseRoutingMessage([]uint8) ([]RoutingMessage, error) #53466
+pkg syscall (freebsd-riscv64), func ParseRoutingSockaddr //deprecated #53466
+pkg syscall (freebsd-riscv64), func ParseRoutingSockaddr(RoutingMessage) ([]Sockaddr, error) #53466
+pkg syscall (freebsd-riscv64), func ParseSocketControlMessage([]uint8) ([]SocketControlMessage, error) #53466
+pkg syscall (freebsd-riscv64), func ParseUnixRights(*SocketControlMessage) ([]int, error) #53466
+pkg syscall (freebsd-riscv64), func Pathconf(string, int) (int, error) #53466
+pkg syscall (freebsd-riscv64), func Pipe([]int) error #53466
+pkg syscall (freebsd-riscv64), func Pipe2([]int, int) error #53466
+pkg syscall (freebsd-riscv64), func Pread(int, []uint8, int64) (int, error) #53466
+pkg syscall (freebsd-riscv64), func Pwrite(int, []uint8, int64) (int, error) #53466
+pkg syscall (freebsd-riscv64), func RawSyscall(uintptr, uintptr, uintptr, uintptr) (uintptr, uintptr, Errno) #53466
+pkg syscall (freebsd-riscv64), func RawSyscall6(uintptr, uintptr, uintptr, uintptr, uintptr, uintptr, uintptr) (uintptr, uintptr, Errno) #53466
+pkg syscall (freebsd-riscv64), func Read(int, []uint8) (int, error) #53466
+pkg syscall (freebsd-riscv64), func ReadDirent(int, []uint8) (int, error) #53466
+pkg syscall (freebsd-riscv64), func Recvfrom(int, []uint8, int) (int, Sockaddr, error) #53466
+pkg syscall (freebsd-riscv64), func Recvmsg(int, []uint8, []uint8, int) (int, int, int, Sockaddr, error) #53466
+pkg syscall (freebsd-riscv64), func Revoke(string) error #53466
+pkg syscall (freebsd-riscv64), func RouteRIB //deprecated #53466
+pkg syscall (freebsd-riscv64), func RouteRIB(int, int) ([]uint8, error) #53466
+pkg syscall (freebsd-riscv64), func Seek(int, int64, int) (int64, error) #53466
+pkg syscall (freebsd-riscv64), func Select(int, *FdSet, *FdSet, *FdSet, *Timeval) error #53466
+pkg syscall (freebsd-riscv64), func Sendfile(int, int, *int64, int) (int, error) #53466
+pkg syscall (freebsd-riscv64), func Sendmsg(int, []uint8, []uint8, Sockaddr, int) error #53466
+pkg syscall (freebsd-riscv64), func SendmsgN(int, []uint8, []uint8, Sockaddr, int) (int, error) #53466
+pkg syscall (freebsd-riscv64), func Sendto(int, []uint8, int, Sockaddr) error #53466
+pkg syscall (freebsd-riscv64), func SetBpf //deprecated #53466
+pkg syscall (freebsd-riscv64), func SetBpf(int, []BpfInsn) error #53466
+pkg syscall (freebsd-riscv64), func SetBpfBuflen //deprecated #53466
+pkg syscall (freebsd-riscv64), func SetBpfBuflen(int, int) (int, error) #53466
+pkg syscall (freebsd-riscv64), func SetBpfDatalink //deprecated #53466
+pkg syscall (freebsd-riscv64), func SetBpfDatalink(int, int) (int, error) #53466
+pkg syscall (freebsd-riscv64), func SetBpfHeadercmpl //deprecated #53466
+pkg syscall (freebsd-riscv64), func SetBpfHeadercmpl(int, int) error #53466
+pkg syscall (freebsd-riscv64), func SetBpfImmediate //deprecated #53466
+pkg syscall (freebsd-riscv64), func SetBpfImmediate(int, int) error #53466
+pkg syscall (freebsd-riscv64), func SetBpfInterface //deprecated #53466
+pkg syscall (freebsd-riscv64), func SetBpfInterface(int, string) error #53466
+pkg syscall (freebsd-riscv64), func SetBpfPromisc //deprecated #53466
+pkg syscall (freebsd-riscv64), func SetBpfPromisc(int, int) error #53466
+pkg syscall (freebsd-riscv64), func SetBpfTimeout //deprecated #53466
+pkg syscall (freebsd-riscv64), func SetBpfTimeout(int, *Timeval) error #53466
+pkg syscall (freebsd-riscv64), func SetKevent(*Kevent_t, int, int, int) #53466
+pkg syscall (freebsd-riscv64), func SetNonblock(int, bool) error #53466
+pkg syscall (freebsd-riscv64), func Setegid(int) error #53466
+pkg syscall (freebsd-riscv64), func Seteuid(int) error #53466
+pkg syscall (freebsd-riscv64), func Setgid(int) error #53466
+pkg syscall (freebsd-riscv64), func Setgroups([]int) error #53466
+pkg syscall (freebsd-riscv64), func Setlogin(string) error #53466
+pkg syscall (freebsd-riscv64), func Setpgid(int, int) error #53466
+pkg syscall (freebsd-riscv64), func Setpriority(int, int, int) error #53466
+pkg syscall (freebsd-riscv64), func Setregid(int, int) error #53466
+pkg syscall (freebsd-riscv64), func Setreuid(int, int) error #53466
+pkg syscall (freebsd-riscv64), func Setrlimit(int, *Rlimit) error #53466
+pkg syscall (freebsd-riscv64), func Setsid() (int, error) #53466
+pkg syscall (freebsd-riscv64), func SetsockoptByte(int, int, int, uint8) error #53466
+pkg syscall (freebsd-riscv64), func SetsockoptICMPv6Filter(int, int, int, *ICMPv6Filter) error #53466
+pkg syscall (freebsd-riscv64), func SetsockoptIPMreq(int, int, int, *IPMreq) error #53466
+pkg syscall (freebsd-riscv64), func SetsockoptIPMreqn(int, int, int, *IPMreqn) error #53466
+pkg syscall (freebsd-riscv64), func SetsockoptIPv6Mreq(int, int, int, *IPv6Mreq) error #53466
+pkg syscall (freebsd-riscv64), func SetsockoptInet4Addr(int, int, int, [4]uint8) error #53466
+pkg syscall (freebsd-riscv64), func SetsockoptInt(int, int, int, int) error #53466
+pkg syscall (freebsd-riscv64), func SetsockoptLinger(int, int, int, *Linger) error #53466
+pkg syscall (freebsd-riscv64), func SetsockoptString(int, int, int, string) error #53466
+pkg syscall (freebsd-riscv64), func SetsockoptTimeval(int, int, int, *Timeval) error #53466
+pkg syscall (freebsd-riscv64), func Settimeofday(*Timeval) error #53466
+pkg syscall (freebsd-riscv64), func Setuid(int) error #53466
+pkg syscall (freebsd-riscv64), func Shutdown(int, int) error #53466
+pkg syscall (freebsd-riscv64), func SlicePtrFromStrings([]string) ([]*uint8, error) #53466
+pkg syscall (freebsd-riscv64), func Socket(int, int, int) (int, error) #53466
+pkg syscall (freebsd-riscv64), func Socketpair(int, int, int) ([2]int, error) #53466
+pkg syscall (freebsd-riscv64), func Stat(string, *Stat_t) error #53466
+pkg syscall (freebsd-riscv64), func Statfs(string, *Statfs_t) error #53466
+pkg syscall (freebsd-riscv64), func StringSlicePtr //deprecated #53466
+pkg syscall (freebsd-riscv64), func StringSlicePtr([]string) []*uint8 #53466
+pkg syscall (freebsd-riscv64), func Sync() error #53466
+pkg syscall (freebsd-riscv64), func Syscall(uintptr, uintptr, uintptr, uintptr) (uintptr, uintptr, Errno) #53466
+pkg syscall (freebsd-riscv64), func Syscall6(uintptr, uintptr, uintptr, uintptr, uintptr, uintptr, uintptr) (uintptr, uintptr, Errno) #53466
+pkg syscall (freebsd-riscv64), func Syscall9(uintptr, uintptr, uintptr, uintptr, uintptr, uintptr, uintptr, uintptr, uintptr, uintptr) (uintptr, uintptr, Errno) #53466
+pkg syscall (freebsd-riscv64), func Sysctl(string) (string, error) #53466
+pkg syscall (freebsd-riscv64), func SysctlUint32(string) (uint32, error) #53466
+pkg syscall (freebsd-riscv64), func TimevalToNsec(Timeval) int64 #53466
+pkg syscall (freebsd-riscv64), func Truncate(string, int64) error #53466
+pkg syscall (freebsd-riscv64), func Umask(int) int #53466
+pkg syscall (freebsd-riscv64), func Undelete(string) error #53466
+pkg syscall (freebsd-riscv64), func UnixRights(...int) []uint8 #53466
+pkg syscall (freebsd-riscv64), func Unmount(string, int) error #53466
+pkg syscall (freebsd-riscv64), func Wait4(int, *WaitStatus, int, *Rusage) (int, error) #53466
+pkg syscall (freebsd-riscv64), func Write(int, []uint8) (int, error) #53466
+pkg syscall (freebsd-riscv64), method (*Cmsghdr) SetLen(int) #53466
+pkg syscall (freebsd-riscv64), method (*Iovec) SetLen(int) #53466
+pkg syscall (freebsd-riscv64), method (*Msghdr) SetControllen(int) #53466
+pkg syscall (freebsd-riscv64), type BpfHdr struct #53466
+pkg syscall (freebsd-riscv64), type BpfHdr struct, Caplen uint32 #53466
+pkg syscall (freebsd-riscv64), type BpfHdr struct, Datalen uint32 #53466
+pkg syscall (freebsd-riscv64), type BpfHdr struct, Hdrlen uint16 #53466
+pkg syscall (freebsd-riscv64), type BpfHdr struct, Pad_cgo_0 [6]uint8 #53466
+pkg syscall (freebsd-riscv64), type BpfHdr struct, Tstamp Timeval #53466
+pkg syscall (freebsd-riscv64), type BpfInsn struct #53466
+pkg syscall (freebsd-riscv64), type BpfInsn struct, Code uint16 #53466
+pkg syscall (freebsd-riscv64), type BpfInsn struct, Jf uint8 #53466
+pkg syscall (freebsd-riscv64), type BpfInsn struct, Jt uint8 #53466
+pkg syscall (freebsd-riscv64), type BpfInsn struct, K uint32 #53466
+pkg syscall (freebsd-riscv64), type BpfProgram struct #53466
+pkg syscall (freebsd-riscv64), type BpfProgram struct, Insns *BpfInsn #53466
+pkg syscall (freebsd-riscv64), type BpfProgram struct, Len uint32 #53466
+pkg syscall (freebsd-riscv64), type BpfProgram struct, Pad_cgo_0 [4]uint8 #53466
+pkg syscall (freebsd-riscv64), type BpfStat struct #53466
+pkg syscall (freebsd-riscv64), type BpfStat struct, Drop uint32 #53466
+pkg syscall (freebsd-riscv64), type BpfStat struct, Recv uint32 #53466
+pkg syscall (freebsd-riscv64), type BpfVersion struct #53466
+pkg syscall (freebsd-riscv64), type BpfVersion struct, Major uint16 #53466
+pkg syscall (freebsd-riscv64), type BpfVersion struct, Minor uint16 #53466
+pkg syscall (freebsd-riscv64), type BpfZbuf struct #53466
+pkg syscall (freebsd-riscv64), type BpfZbuf struct, Bufa *uint8 #53466
+pkg syscall (freebsd-riscv64), type BpfZbuf struct, Bufb *uint8 #53466
+pkg syscall (freebsd-riscv64), type BpfZbuf struct, Buflen uint64 #53466
+pkg syscall (freebsd-riscv64), type BpfZbufHeader struct #53466
+pkg syscall (freebsd-riscv64), type BpfZbufHeader struct, Kernel_gen uint32 #53466
+pkg syscall (freebsd-riscv64), type BpfZbufHeader struct, Kernel_len uint32 #53466
+pkg syscall (freebsd-riscv64), type BpfZbufHeader struct, User_gen uint32 #53466
+pkg syscall (freebsd-riscv64), type BpfZbufHeader struct, X_bzh_pad [5]uint32 #53466
+pkg syscall (freebsd-riscv64), type Cmsghdr struct #53466
+pkg syscall (freebsd-riscv64), type Cmsghdr struct, Len uint32 #53466
+pkg syscall (freebsd-riscv64), type Cmsghdr struct, Level int32 #53466
+pkg syscall (freebsd-riscv64), type Cmsghdr struct, Type int32 #53466
+pkg syscall (freebsd-riscv64), type Credential struct #53466
+pkg syscall (freebsd-riscv64), type Credential struct, Gid uint32 #53466
+pkg syscall (freebsd-riscv64), type Credential struct, Groups []uint32 #53466
+pkg syscall (freebsd-riscv64), type Credential struct, NoSetGroups bool #53466
+pkg syscall (freebsd-riscv64), type Credential struct, Uid uint32 #53466
+pkg syscall (freebsd-riscv64), type Dirent struct #53466
+pkg syscall (freebsd-riscv64), type Dirent struct, Fileno uint64 #53466
+pkg syscall (freebsd-riscv64), type Dirent struct, Name [256]int8 #53466
+pkg syscall (freebsd-riscv64), type Dirent struct, Namlen uint16 #53466
+pkg syscall (freebsd-riscv64), type Dirent struct, Off int64 #53466
+pkg syscall (freebsd-riscv64), type Dirent struct, Pad0 uint8 #53466
+pkg syscall (freebsd-riscv64), type Dirent struct, Pad1 uint16 #53466
+pkg syscall (freebsd-riscv64), type Dirent struct, Reclen uint16 #53466
+pkg syscall (freebsd-riscv64), type Dirent struct, Type uint8 #53466
+pkg syscall (freebsd-riscv64), type FdSet struct #53466
+pkg syscall (freebsd-riscv64), type FdSet struct, X__fds_bits [16]uint64 #53466
+pkg syscall (freebsd-riscv64), type Flock_t struct #53466
+pkg syscall (freebsd-riscv64), type Flock_t struct, Len int64 #53466
+pkg syscall (freebsd-riscv64), type Flock_t struct, Pad_cgo_0 [4]uint8 #53466
+pkg syscall (freebsd-riscv64), type Flock_t struct, Pid int32 #53466
+pkg syscall (freebsd-riscv64), type Flock_t struct, Start int64 #53466
+pkg syscall (freebsd-riscv64), type Flock_t struct, Sysid int32 #53466
+pkg syscall (freebsd-riscv64), type Flock_t struct, Type int16 #53466
+pkg syscall (freebsd-riscv64), type Flock_t struct, Whence int16 #53466
+pkg syscall (freebsd-riscv64), type Fsid struct #53466
+pkg syscall (freebsd-riscv64), type Fsid struct, Val [2]int32 #53466
+pkg syscall (freebsd-riscv64), type ICMPv6Filter struct #53466
+pkg syscall (freebsd-riscv64), type ICMPv6Filter struct, Filt [8]uint32 #53466
+pkg syscall (freebsd-riscv64), type IPMreqn struct #53466
+pkg syscall (freebsd-riscv64), type IPMreqn struct, Address [4]uint8 #53466
+pkg syscall (freebsd-riscv64), type IPMreqn struct, Ifindex int32 #53466
+pkg syscall (freebsd-riscv64), type IPMreqn struct, Multiaddr [4]uint8 #53466
+pkg syscall (freebsd-riscv64), type IPv6MTUInfo struct #53466
+pkg syscall (freebsd-riscv64), type IPv6MTUInfo struct, Addr RawSockaddrInet6 #53466
+pkg syscall (freebsd-riscv64), type IPv6MTUInfo struct, Mtu uint32 #53466
+pkg syscall (freebsd-riscv64), type IfAnnounceMsghdr struct #53466
+pkg syscall (freebsd-riscv64), type IfAnnounceMsghdr struct, Index uint16 #53466
+pkg syscall (freebsd-riscv64), type IfAnnounceMsghdr struct, Msglen uint16 #53466
+pkg syscall (freebsd-riscv64), type IfAnnounceMsghdr struct, Name [16]int8 #53466
+pkg syscall (freebsd-riscv64), type IfAnnounceMsghdr struct, Type uint8 #53466
+pkg syscall (freebsd-riscv64), type IfAnnounceMsghdr struct, Version uint8 #53466
+pkg syscall (freebsd-riscv64), type IfAnnounceMsghdr struct, What uint16 #53466
+pkg syscall (freebsd-riscv64), type IfData struct #53466
+pkg syscall (freebsd-riscv64), type IfData struct, Addrlen uint8 #53466
+pkg syscall (freebsd-riscv64), type IfData struct, Baudrate uint64 #53466
+pkg syscall (freebsd-riscv64), type IfData struct, Collisions uint64 #53466
+pkg syscall (freebsd-riscv64), type IfData struct, Datalen uint8 #53466
+pkg syscall (freebsd-riscv64), type IfData struct, Epoch int64 #53466
+pkg syscall (freebsd-riscv64), type IfData struct, Hdrlen uint8 #53466
+pkg syscall (freebsd-riscv64), type IfData struct, Hwassist uint64 #53466
+pkg syscall (freebsd-riscv64), type IfData struct, Ibytes uint64 #53466
+pkg syscall (freebsd-riscv64), type IfData struct, Ierrors uint64 #53466
+pkg syscall (freebsd-riscv64), type IfData struct, Imcasts uint64 #53466
+pkg syscall (freebsd-riscv64), type IfData struct, Ipackets uint64 #53466
+pkg syscall (freebsd-riscv64), type IfData struct, Iqdrops uint64 #53466
+pkg syscall (freebsd-riscv64), type IfData struct, Lastchange Timeval #53466
+pkg syscall (freebsd-riscv64), type IfData struct, Link_state uint8 #53466
+pkg syscall (freebsd-riscv64), type IfData struct, Metric uint64 #53466
+pkg syscall (freebsd-riscv64), type IfData struct, Mtu uint64 #53466
+pkg syscall (freebsd-riscv64), type IfData struct, Noproto uint64 #53466
+pkg syscall (freebsd-riscv64), type IfData struct, Obytes uint64 #53466
+pkg syscall (freebsd-riscv64), type IfData struct, Oerrors uint64 #53466
+pkg syscall (freebsd-riscv64), type IfData struct, Omcasts uint64 #53466
+pkg syscall (freebsd-riscv64), type IfData struct, Opackets uint64 #53466
+pkg syscall (freebsd-riscv64), type IfData struct, Physical uint8 #53466
+pkg syscall (freebsd-riscv64), type IfData struct, Spare_char1 uint8 #53466
+pkg syscall (freebsd-riscv64), type IfData struct, Spare_char2 uint8 #53466
+pkg syscall (freebsd-riscv64), type IfData struct, Type uint8 #53466
+pkg syscall (freebsd-riscv64), type IfMsghdr struct #53466
+pkg syscall (freebsd-riscv64), type IfMsghdr struct, Addrs int32 #53466
+pkg syscall (freebsd-riscv64), type IfMsghdr struct, Data IfData #53466
+pkg syscall (freebsd-riscv64), type IfMsghdr struct, Flags int32 #53466
+pkg syscall (freebsd-riscv64), type IfMsghdr struct, Index uint16 #53466
+pkg syscall (freebsd-riscv64), type IfMsghdr struct, Msglen uint16 #53466
+pkg syscall (freebsd-riscv64), type IfMsghdr struct, Pad_cgo_0 [2]uint8 #53466
+pkg syscall (freebsd-riscv64), type IfMsghdr struct, Type uint8 #53466
+pkg syscall (freebsd-riscv64), type IfMsghdr struct, Version uint8 #53466
+pkg syscall (freebsd-riscv64), type IfaMsghdr struct #53466
+pkg syscall (freebsd-riscv64), type IfaMsghdr struct, Addrs int32 #53466
+pkg syscall (freebsd-riscv64), type IfaMsghdr struct, Flags int32 #53466
+pkg syscall (freebsd-riscv64), type IfaMsghdr struct, Index uint16 #53466
+pkg syscall (freebsd-riscv64), type IfaMsghdr struct, Metric int32 #53466
+pkg syscall (freebsd-riscv64), type IfaMsghdr struct, Msglen uint16 #53466
+pkg syscall (freebsd-riscv64), type IfaMsghdr struct, Pad_cgo_0 [2]uint8 #53466
+pkg syscall (freebsd-riscv64), type IfaMsghdr struct, Type uint8 #53466
+pkg syscall (freebsd-riscv64), type IfaMsghdr struct, Version uint8 #53466
+pkg syscall (freebsd-riscv64), type IfmaMsghdr struct #53466
+pkg syscall (freebsd-riscv64), type IfmaMsghdr struct, Addrs int32 #53466
+pkg syscall (freebsd-riscv64), type IfmaMsghdr struct, Flags int32 #53466
+pkg syscall (freebsd-riscv64), type IfmaMsghdr struct, Index uint16 #53466
+pkg syscall (freebsd-riscv64), type IfmaMsghdr struct, Msglen uint16 #53466
+pkg syscall (freebsd-riscv64), type IfmaMsghdr struct, Pad_cgo_0 [2]uint8 #53466
+pkg syscall (freebsd-riscv64), type IfmaMsghdr struct, Type uint8 #53466
+pkg syscall (freebsd-riscv64), type IfmaMsghdr struct, Version uint8 #53466
+pkg syscall (freebsd-riscv64), type Inet6Pktinfo struct #53466
+pkg syscall (freebsd-riscv64), type Inet6Pktinfo struct, Addr [16]uint8 #53466
+pkg syscall (freebsd-riscv64), type Inet6Pktinfo struct, Ifindex uint32 #53466
+pkg syscall (freebsd-riscv64), type InterfaceAddrMessage //deprecated #53466
+pkg syscall (freebsd-riscv64), type InterfaceAddrMessage struct #53466
+pkg syscall (freebsd-riscv64), type InterfaceAddrMessage struct, Data []uint8 #53466
+pkg syscall (freebsd-riscv64), type InterfaceAddrMessage struct, Header IfaMsghdr #53466
+pkg syscall (freebsd-riscv64), type InterfaceAnnounceMessage //deprecated #53466
+pkg syscall (freebsd-riscv64), type InterfaceAnnounceMessage struct #53466
+pkg syscall (freebsd-riscv64), type InterfaceAnnounceMessage struct, Header IfAnnounceMsghdr #53466
+pkg syscall (freebsd-riscv64), type InterfaceMessage //deprecated #53466
+pkg syscall (freebsd-riscv64), type InterfaceMessage struct #53466
+pkg syscall (freebsd-riscv64), type InterfaceMessage struct, Data []uint8 #53466
+pkg syscall (freebsd-riscv64), type InterfaceMessage struct, Header IfMsghdr #53466
+pkg syscall (freebsd-riscv64), type InterfaceMulticastAddrMessage //deprecated #53466
+pkg syscall (freebsd-riscv64), type InterfaceMulticastAddrMessage struct #53466
+pkg syscall (freebsd-riscv64), type InterfaceMulticastAddrMessage struct, Data []uint8 #53466
+pkg syscall (freebsd-riscv64), type InterfaceMulticastAddrMessage struct, Header IfmaMsghdr #53466
+pkg syscall (freebsd-riscv64), type Iovec struct #53466
+pkg syscall (freebsd-riscv64), type Iovec struct, Base *uint8 #53466
+pkg syscall (freebsd-riscv64), type Iovec struct, Len uint64 #53466
+pkg syscall (freebsd-riscv64), type Kevent_t struct #53466
+pkg syscall (freebsd-riscv64), type Kevent_t struct, Data int64 #53466
+pkg syscall (freebsd-riscv64), type Kevent_t struct, Fflags uint32 #53466
+pkg syscall (freebsd-riscv64), type Kevent_t struct, Filter int16 #53466
+pkg syscall (freebsd-riscv64), type Kevent_t struct, Flags uint16 #53466
+pkg syscall (freebsd-riscv64), type Kevent_t struct, Ident uint64 #53466
+pkg syscall (freebsd-riscv64), type Kevent_t struct, Udata *uint8 #53466
+pkg syscall (freebsd-riscv64), type Msghdr struct #53466
+pkg syscall (freebsd-riscv64), type Msghdr struct, Control *uint8 #53466
+pkg syscall (freebsd-riscv64), type Msghdr struct, Controllen uint32 #53466
+pkg syscall (freebsd-riscv64), type Msghdr struct, Flags int32 #53466
+pkg syscall (freebsd-riscv64), type Msghdr struct, Iov *Iovec #53466
+pkg syscall (freebsd-riscv64), type Msghdr struct, Iovlen int32 #53466
+pkg syscall (freebsd-riscv64), type Msghdr struct, Name *uint8 #53466
+pkg syscall (freebsd-riscv64), type Msghdr struct, Namelen uint32 #53466
+pkg syscall (freebsd-riscv64), type Msghdr struct, Pad_cgo_0 [4]uint8 #53466
+pkg syscall (freebsd-riscv64), type Msghdr struct, Pad_cgo_1 [4]uint8 #53466
+pkg syscall (freebsd-riscv64), type RawSockaddr struct, Data [14]int8 #53466
+pkg syscall (freebsd-riscv64), type RawSockaddr struct, Family uint8 #53466
+pkg syscall (freebsd-riscv64), type RawSockaddr struct, Len uint8 #53466
+pkg syscall (freebsd-riscv64), type RawSockaddrAny struct, Pad [92]int8 #53466
+pkg syscall (freebsd-riscv64), type RawSockaddrDatalink struct #53466
+pkg syscall (freebsd-riscv64), type RawSockaddrDatalink struct, Alen uint8 #53466
+pkg syscall (freebsd-riscv64), type RawSockaddrDatalink struct, Data [46]int8 #53466
+pkg syscall (freebsd-riscv64), type RawSockaddrDatalink struct, Family uint8 #53466
+pkg syscall (freebsd-riscv64), type RawSockaddrDatalink struct, Index uint16 #53466
+pkg syscall (freebsd-riscv64), type RawSockaddrDatalink struct, Len uint8 #53466
+pkg syscall (freebsd-riscv64), type RawSockaddrDatalink struct, Nlen uint8 #53466
+pkg syscall (freebsd-riscv64), type RawSockaddrDatalink struct, Slen uint8 #53466
+pkg syscall (freebsd-riscv64), type RawSockaddrDatalink struct, Type uint8 #53466
+pkg syscall (freebsd-riscv64), type RawSockaddrInet4 struct, Family uint8 #53466
+pkg syscall (freebsd-riscv64), type RawSockaddrInet4 struct, Len uint8 #53466
+pkg syscall (freebsd-riscv64), type RawSockaddrInet4 struct, Zero [8]int8 #53466
+pkg syscall (freebsd-riscv64), type RawSockaddrInet6 struct, Family uint8 #53466
+pkg syscall (freebsd-riscv64), type RawSockaddrInet6 struct, Len uint8 #53466
+pkg syscall (freebsd-riscv64), type RawSockaddrUnix struct, Family uint8 #53466
+pkg syscall (freebsd-riscv64), type RawSockaddrUnix struct, Len uint8 #53466
+pkg syscall (freebsd-riscv64), type RawSockaddrUnix struct, Path [104]int8 #53466
+pkg syscall (freebsd-riscv64), type Rlimit struct #53466
+pkg syscall (freebsd-riscv64), type Rlimit struct, Cur int64 #53466
+pkg syscall (freebsd-riscv64), type Rlimit struct, Max int64 #53466
+pkg syscall (freebsd-riscv64), type RouteMessage //deprecated #53466
+pkg syscall (freebsd-riscv64), type RouteMessage struct #53466
+pkg syscall (freebsd-riscv64), type RouteMessage struct, Data []uint8 #53466
+pkg syscall (freebsd-riscv64), type RouteMessage struct, Header RtMsghdr #53466
+pkg syscall (freebsd-riscv64), type RoutingMessage //deprecated #53466
+pkg syscall (freebsd-riscv64), type RoutingMessage interface, unexported methods #53466
+pkg syscall (freebsd-riscv64), type RtMetrics struct #53466
+pkg syscall (freebsd-riscv64), type RtMetrics struct, Expire uint64 #53466
+pkg syscall (freebsd-riscv64), type RtMetrics struct, Filler [3]uint64 #53466
+pkg syscall (freebsd-riscv64), type RtMetrics struct, Hopcount uint64 #53466
+pkg syscall (freebsd-riscv64), type RtMetrics struct, Locks uint64 #53466
+pkg syscall (freebsd-riscv64), type RtMetrics struct, Mtu uint64 #53466
+pkg syscall (freebsd-riscv64), type RtMetrics struct, Pksent uint64 #53466
+pkg syscall (freebsd-riscv64), type RtMetrics struct, Recvpipe uint64 #53466
+pkg syscall (freebsd-riscv64), type RtMetrics struct, Rtt uint64 #53466
+pkg syscall (freebsd-riscv64), type RtMetrics struct, Rttvar uint64 #53466
+pkg syscall (freebsd-riscv64), type RtMetrics struct, Sendpipe uint64 #53466
+pkg syscall (freebsd-riscv64), type RtMetrics struct, Ssthresh uint64 #53466
+pkg syscall (freebsd-riscv64), type RtMetrics struct, Weight uint64 #53466
+pkg syscall (freebsd-riscv64), type RtMsghdr struct #53466
+pkg syscall (freebsd-riscv64), type RtMsghdr struct, Addrs int32 #53466
+pkg syscall (freebsd-riscv64), type RtMsghdr struct, Errno int32 #53466
+pkg syscall (freebsd-riscv64), type RtMsghdr struct, Flags int32 #53466
+pkg syscall (freebsd-riscv64), type RtMsghdr struct, Fmask int32 #53466
+pkg syscall (freebsd-riscv64), type RtMsghdr struct, Index uint16 #53466
+pkg syscall (freebsd-riscv64), type RtMsghdr struct, Inits uint64 #53466
+pkg syscall (freebsd-riscv64), type RtMsghdr struct, Msglen uint16 #53466
+pkg syscall (freebsd-riscv64), type RtMsghdr struct, Pad_cgo_0 [2]uint8 #53466
+pkg syscall (freebsd-riscv64), type RtMsghdr struct, Pid int32 #53466
+pkg syscall (freebsd-riscv64), type RtMsghdr struct, Rmx RtMetrics #53466
+pkg syscall (freebsd-riscv64), type RtMsghdr struct, Seq int32 #53466
+pkg syscall (freebsd-riscv64), type RtMsghdr struct, Type uint8 #53466
+pkg syscall (freebsd-riscv64), type RtMsghdr struct, Version uint8 #53466
+pkg syscall (freebsd-riscv64), type Rusage struct, Idrss int64 #53466
+pkg syscall (freebsd-riscv64), type Rusage struct, Inblock int64 #53466
+pkg syscall (freebsd-riscv64), type Rusage struct, Isrss int64 #53466
+pkg syscall (freebsd-riscv64), type Rusage struct, Ixrss int64 #53466
+pkg syscall (freebsd-riscv64), type Rusage struct, Majflt int64 #53466
+pkg syscall (freebsd-riscv64), type Rusage struct, Maxrss int64 #53466
+pkg syscall (freebsd-riscv64), type Rusage struct, Minflt int64 #53466
+pkg syscall (freebsd-riscv64), type Rusage struct, Msgrcv int64 #53466
+pkg syscall (freebsd-riscv64), type Rusage struct, Msgsnd int64 #53466
+pkg syscall (freebsd-riscv64), type Rusage struct, Nivcsw int64 #53466
+pkg syscall (freebsd-riscv64), type Rusage struct, Nsignals int64 #53466
+pkg syscall (freebsd-riscv64), type Rusage struct, Nswap int64 #53466
+pkg syscall (freebsd-riscv64), type Rusage struct, Nvcsw int64 #53466
+pkg syscall (freebsd-riscv64), type Rusage struct, Oublock int64 #53466
+pkg syscall (freebsd-riscv64), type Rusage struct, Stime Timeval #53466
+pkg syscall (freebsd-riscv64), type Rusage struct, Utime Timeval #53466
+pkg syscall (freebsd-riscv64), type SockaddrDatalink struct #53466
+pkg syscall (freebsd-riscv64), type SockaddrDatalink struct, Alen uint8 #53466
+pkg syscall (freebsd-riscv64), type SockaddrDatalink struct, Data [46]int8 #53466
+pkg syscall (freebsd-riscv64), type SockaddrDatalink struct, Family uint8 #53466
+pkg syscall (freebsd-riscv64), type SockaddrDatalink struct, Index uint16 #53466
+pkg syscall (freebsd-riscv64), type SockaddrDatalink struct, Len uint8 #53466
+pkg syscall (freebsd-riscv64), type SockaddrDatalink struct, Nlen uint8 #53466
+pkg syscall (freebsd-riscv64), type SockaddrDatalink struct, Slen uint8 #53466
+pkg syscall (freebsd-riscv64), type SockaddrDatalink struct, Type uint8 #53466
+pkg syscall (freebsd-riscv64), type SocketControlMessage struct #53466
+pkg syscall (freebsd-riscv64), type SocketControlMessage struct, Data []uint8 #53466
+pkg syscall (freebsd-riscv64), type SocketControlMessage struct, Header Cmsghdr #53466
+pkg syscall (freebsd-riscv64), type Stat_t struct #53466
+pkg syscall (freebsd-riscv64), type Stat_t struct, Atimespec Timespec #53466
+pkg syscall (freebsd-riscv64), type Stat_t struct, Birthtimespec Timespec #53466
+pkg syscall (freebsd-riscv64), type Stat_t struct, Blksize int32 #53466
+pkg syscall (freebsd-riscv64), type Stat_t struct, Blocks int64 #53466
+pkg syscall (freebsd-riscv64), type Stat_t struct, Ctimespec Timespec #53466
+pkg syscall (freebsd-riscv64), type Stat_t struct, Dev uint64 #53466
+pkg syscall (freebsd-riscv64), type Stat_t struct, Flags uint32 #53466
+pkg syscall (freebsd-riscv64), type Stat_t struct, Gen uint64 #53466
+pkg syscall (freebsd-riscv64), type Stat_t struct, Gid uint32 #53466
+pkg syscall (freebsd-riscv64), type Stat_t struct, Ino uint64 #53466
+pkg syscall (freebsd-riscv64), type Stat_t struct, Mode uint16 #53466
+pkg syscall (freebsd-riscv64), type Stat_t struct, Mtimespec Timespec #53466
+pkg syscall (freebsd-riscv64), type Stat_t struct, Nlink uint64 #53466
+pkg syscall (freebsd-riscv64), type Stat_t struct, Padding0 int16 #53466
+pkg syscall (freebsd-riscv64), type Stat_t struct, Padding1 int32 #53466
+pkg syscall (freebsd-riscv64), type Stat_t struct, Rdev uint64 #53466
+pkg syscall (freebsd-riscv64), type Stat_t struct, Size int64 #53466
+pkg syscall (freebsd-riscv64), type Stat_t struct, Spare [10]uint64 #53466
+pkg syscall (freebsd-riscv64), type Stat_t struct, Uid uint32 #53466
+pkg syscall (freebsd-riscv64), type Statfs_t struct #53466
+pkg syscall (freebsd-riscv64), type Statfs_t struct, Asyncreads uint64 #53466
+pkg syscall (freebsd-riscv64), type Statfs_t struct, Asyncwrites uint64 #53466
+pkg syscall (freebsd-riscv64), type Statfs_t struct, Bavail int64 #53466
+pkg syscall (freebsd-riscv64), type Statfs_t struct, Bfree uint64 #53466
+pkg syscall (freebsd-riscv64), type Statfs_t struct, Blocks uint64 #53466
+pkg syscall (freebsd-riscv64), type Statfs_t struct, Bsize uint64 #53466
+pkg syscall (freebsd-riscv64), type Statfs_t struct, Charspare [80]int8 #53466
+pkg syscall (freebsd-riscv64), type Statfs_t struct, Ffree int64 #53466
+pkg syscall (freebsd-riscv64), type Statfs_t struct, Files uint64 #53466
+pkg syscall (freebsd-riscv64), type Statfs_t struct, Flags uint64 #53466
+pkg syscall (freebsd-riscv64), type Statfs_t struct, Fsid Fsid #53466
+pkg syscall (freebsd-riscv64), type Statfs_t struct, Fstypename [16]int8 #53466
+pkg syscall (freebsd-riscv64), type Statfs_t struct, Iosize uint64 #53466
+pkg syscall (freebsd-riscv64), type Statfs_t struct, Mntfromname [1024]int8 #53466
+pkg syscall (freebsd-riscv64), type Statfs_t struct, Mntonname [1024]int8 #53466
+pkg syscall (freebsd-riscv64), type Statfs_t struct, Namemax uint32 #53466
+pkg syscall (freebsd-riscv64), type Statfs_t struct, Owner uint32 #53466
+pkg syscall (freebsd-riscv64), type Statfs_t struct, Spare [10]uint64 #53466
+pkg syscall (freebsd-riscv64), type Statfs_t struct, Syncreads uint64 #53466
+pkg syscall (freebsd-riscv64), type Statfs_t struct, Syncwrites uint64 #53466
+pkg syscall (freebsd-riscv64), type Statfs_t struct, Type uint32 #53466
+pkg syscall (freebsd-riscv64), type Statfs_t struct, Version uint32 #53466
+pkg syscall (freebsd-riscv64), type SysProcAttr struct, Chroot string #53466
+pkg syscall (freebsd-riscv64), type SysProcAttr struct, Credential *Credential #53466
+pkg syscall (freebsd-riscv64), type SysProcAttr struct, Ctty int #53466
+pkg syscall (freebsd-riscv64), type SysProcAttr struct, Foreground bool #53466
+pkg syscall (freebsd-riscv64), type SysProcAttr struct, Noctty bool #53466
+pkg syscall (freebsd-riscv64), type SysProcAttr struct, Pdeathsig Signal #53466
+pkg syscall (freebsd-riscv64), type SysProcAttr struct, Pgid int #53466
+pkg syscall (freebsd-riscv64), type SysProcAttr struct, Ptrace bool #53466
+pkg syscall (freebsd-riscv64), type SysProcAttr struct, Setctty bool #53466
+pkg syscall (freebsd-riscv64), type SysProcAttr struct, Setpgid bool #53466
+pkg syscall (freebsd-riscv64), type SysProcAttr struct, Setsid bool #53466
+pkg syscall (freebsd-riscv64), type Termios struct #53466
+pkg syscall (freebsd-riscv64), type Termios struct, Cc [20]uint8 #53466
+pkg syscall (freebsd-riscv64), type Termios struct, Cflag uint32 #53466
+pkg syscall (freebsd-riscv64), type Termios struct, Iflag uint32 #53466
+pkg syscall (freebsd-riscv64), type Termios struct, Ispeed uint32 #53466
+pkg syscall (freebsd-riscv64), type Termios struct, Lflag uint32 #53466
+pkg syscall (freebsd-riscv64), type Termios struct, Oflag uint32 #53466
+pkg syscall (freebsd-riscv64), type Termios struct, Ospeed uint32 #53466
+pkg syscall (freebsd-riscv64), type Timespec struct, Nsec int64 #53466
+pkg syscall (freebsd-riscv64), type Timespec struct, Sec int64 #53466
+pkg syscall (freebsd-riscv64), type Timeval struct, Sec int64 #53466
+pkg syscall (freebsd-riscv64), type Timeval struct, Usec int64 #53466
+pkg syscall (freebsd-riscv64), type WaitStatus uint32 #53466
+pkg syscall (freebsd-riscv64), var Stderr int #53466
+pkg syscall (freebsd-riscv64), var Stdin int #53466
+pkg syscall (freebsd-riscv64), var Stdout int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_APPLETALK = 16 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_APPLETALK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_ARP = 35 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_ARP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_ATM = 30 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_ATM ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_BLUETOOTH = 36 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_BLUETOOTH ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_CCITT = 10 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_CCITT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_CHAOS = 5 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_CHAOS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_CNT = 21 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_CNT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_COIP = 20 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_COIP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_DATAKIT = 9 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_DATAKIT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_DECnet = 12 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_DECnet ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_DLI = 13 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_DLI ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_E164 = 26 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_E164 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_ECMA = 8 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_ECMA ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_HYLINK = 15 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_HYLINK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_IEEE80211 = 37 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_IEEE80211 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_IMPLINK = 3 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_IMPLINK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_INET6 = 28 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_INET6_SDP = 42 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_INET6_SDP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_INET_SDP = 40 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_INET_SDP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_IPX = 23 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_IPX ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_ISDN = 26 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_ISDN ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_ISO = 7 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_ISO ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_LAT = 14 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_LAT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_LINK = 18 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_LINK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_LOCAL = 1 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_LOCAL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_MAX = 42 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_MAX ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_NATM = 29 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_NATM ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_NETBIOS = 6 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_NETBIOS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_NETGRAPH = 32 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_NETGRAPH ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_OSI = 7 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_OSI ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_PUP = 4 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_PUP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_ROUTE = 17 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_ROUTE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_SCLUSTER = 34 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_SCLUSTER ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_SIP = 24 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_SIP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_SLOW = 33 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_SLOW ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_SNA = 11 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_SNA ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR00 = 39 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR00 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR01 = 41 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR01 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR02 = 43 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR02 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR03 = 45 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR03 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR04 = 47 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR04 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR05 = 49 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR05 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR06 = 51 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR06 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR07 = 53 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR07 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR08 = 55 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR08 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR09 = 57 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR09 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR10 = 59 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR10 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR11 = 61 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR11 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR12 = 63 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR12 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR13 = 65 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR13 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR14 = 67 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR14 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR15 = 69 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR15 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR16 = 71 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR16 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR17 = 73 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR17 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR18 = 75 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR18 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR19 = 77 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR19 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR20 = 79 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR20 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR21 = 81 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR21 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR22 = 83 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR22 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR23 = 85 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR23 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR24 = 87 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR24 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR25 = 89 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR25 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR26 = 91 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR26 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR27 = 93 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR27 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR28 = 95 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR28 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR29 = 97 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR29 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR30 = 99 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR30 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR31 = 101 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR31 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR32 = 103 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR32 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR33 = 105 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR33 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR34 = 107 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR34 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR35 = 109 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR35 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR36 = 111 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR36 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR37 = 113 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR37 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR38 = 115 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR38 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR39 = 117 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR39 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR40 = 119 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR40 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR41 = 121 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR41 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR42 = 123 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR42 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR43 = 125 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR43 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR44 = 127 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR44 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR45 = 129 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR45 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR46 = 131 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR46 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR47 = 133 #53466
+pkg syscall (freebsd-riscv64-cgo), const AF_VENDOR47 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const B0 = 0 #53466
+pkg syscall (freebsd-riscv64-cgo), const B0 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const B110 = 110 #53466
+pkg syscall (freebsd-riscv64-cgo), const B110 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const B115200 = 115200 #53466
+pkg syscall (freebsd-riscv64-cgo), const B115200 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const B1200 = 1200 #53466
+pkg syscall (freebsd-riscv64-cgo), const B1200 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const B134 = 134 #53466
+pkg syscall (freebsd-riscv64-cgo), const B134 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const B14400 = 14400 #53466
+pkg syscall (freebsd-riscv64-cgo), const B14400 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const B150 = 150 #53466
+pkg syscall (freebsd-riscv64-cgo), const B150 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const B1800 = 1800 #53466
+pkg syscall (freebsd-riscv64-cgo), const B1800 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const B19200 = 19200 #53466
+pkg syscall (freebsd-riscv64-cgo), const B19200 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const B200 = 200 #53466
+pkg syscall (freebsd-riscv64-cgo), const B200 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const B230400 = 230400 #53466
+pkg syscall (freebsd-riscv64-cgo), const B230400 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const B2400 = 2400 #53466
+pkg syscall (freebsd-riscv64-cgo), const B2400 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const B28800 = 28800 #53466
+pkg syscall (freebsd-riscv64-cgo), const B28800 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const B300 = 300 #53466
+pkg syscall (freebsd-riscv64-cgo), const B300 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const B38400 = 38400 #53466
+pkg syscall (freebsd-riscv64-cgo), const B38400 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const B460800 = 460800 #53466
+pkg syscall (freebsd-riscv64-cgo), const B460800 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const B4800 = 4800 #53466
+pkg syscall (freebsd-riscv64-cgo), const B4800 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const B50 = 50 #53466
+pkg syscall (freebsd-riscv64-cgo), const B50 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const B57600 = 57600 #53466
+pkg syscall (freebsd-riscv64-cgo), const B57600 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const B600 = 600 #53466
+pkg syscall (freebsd-riscv64-cgo), const B600 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const B7200 = 7200 #53466
+pkg syscall (freebsd-riscv64-cgo), const B7200 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const B75 = 75 #53466
+pkg syscall (freebsd-riscv64-cgo), const B75 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const B76800 = 76800 #53466
+pkg syscall (freebsd-riscv64-cgo), const B76800 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const B921600 = 921600 #53466
+pkg syscall (freebsd-riscv64-cgo), const B921600 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const B9600 = 9600 #53466
+pkg syscall (freebsd-riscv64-cgo), const B9600 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BIOCFEEDBACK = 2147762812 #53466
+pkg syscall (freebsd-riscv64-cgo), const BIOCFEEDBACK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BIOCFLUSH = 536887912 #53466
+pkg syscall (freebsd-riscv64-cgo), const BIOCFLUSH ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BIOCGBLEN = 1074020966 #53466
+pkg syscall (freebsd-riscv64-cgo), const BIOCGBLEN ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BIOCGDIRECTION = 1074020982 #53466
+pkg syscall (freebsd-riscv64-cgo), const BIOCGDIRECTION ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BIOCGDLT = 1074020970 #53466
+pkg syscall (freebsd-riscv64-cgo), const BIOCGDLT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BIOCGDLTLIST = 3222291065 #53466
+pkg syscall (freebsd-riscv64-cgo), const BIOCGDLTLIST ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BIOCGETBUFMODE = 1074020989 #53466
+pkg syscall (freebsd-riscv64-cgo), const BIOCGETBUFMODE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BIOCGETIF = 1075855979 #53466
+pkg syscall (freebsd-riscv64-cgo), const BIOCGETIF ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BIOCGETZMAX = 1074283135 #53466
+pkg syscall (freebsd-riscv64-cgo), const BIOCGETZMAX ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BIOCGHDRCMPLT = 1074020980 #53466
+pkg syscall (freebsd-riscv64-cgo), const BIOCGHDRCMPLT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BIOCGRSIG = 1074020978 #53466
+pkg syscall (freebsd-riscv64-cgo), const BIOCGRSIG ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BIOCGRTIMEOUT = 1074807406 #53466
+pkg syscall (freebsd-riscv64-cgo), const BIOCGRTIMEOUT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BIOCGSEESENT = 1074020982 #53466
+pkg syscall (freebsd-riscv64-cgo), const BIOCGSEESENT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BIOCGSTATS = 1074283119 #53466
+pkg syscall (freebsd-riscv64-cgo), const BIOCGSTATS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BIOCGTSTAMP = 1074020995 #53466
+pkg syscall (freebsd-riscv64-cgo), const BIOCGTSTAMP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BIOCIMMEDIATE = 2147762800 #53466
+pkg syscall (freebsd-riscv64-cgo), const BIOCIMMEDIATE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BIOCLOCK = 536887930 #53466
+pkg syscall (freebsd-riscv64-cgo), const BIOCLOCK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BIOCPROMISC = 536887913 #53466
+pkg syscall (freebsd-riscv64-cgo), const BIOCPROMISC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BIOCROTZBUF = 1075331712 #53466
+pkg syscall (freebsd-riscv64-cgo), const BIOCROTZBUF ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BIOCSBLEN = 3221504614 #53466
+pkg syscall (freebsd-riscv64-cgo), const BIOCSBLEN ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BIOCSDIRECTION = 2147762807 #53466
+pkg syscall (freebsd-riscv64-cgo), const BIOCSDIRECTION ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BIOCSDLT = 2147762808 #53466
+pkg syscall (freebsd-riscv64-cgo), const BIOCSDLT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BIOCSETBUFMODE = 2147762814 #53466
+pkg syscall (freebsd-riscv64-cgo), const BIOCSETBUFMODE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BIOCSETF = 2148549223 #53466
+pkg syscall (freebsd-riscv64-cgo), const BIOCSETF ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BIOCSETFNR = 2148549250 #53466
+pkg syscall (freebsd-riscv64-cgo), const BIOCSETFNR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BIOCSETIF = 2149597804 #53466
+pkg syscall (freebsd-riscv64-cgo), const BIOCSETIF ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BIOCSETWF = 2148549243 #53466
+pkg syscall (freebsd-riscv64-cgo), const BIOCSETWF ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BIOCSETZBUF = 2149073537 #53466
+pkg syscall (freebsd-riscv64-cgo), const BIOCSETZBUF ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BIOCSHDRCMPLT = 2147762805 #53466
+pkg syscall (freebsd-riscv64-cgo), const BIOCSHDRCMPLT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BIOCSRSIG = 2147762803 #53466
+pkg syscall (freebsd-riscv64-cgo), const BIOCSRSIG ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BIOCSRTIMEOUT = 2148549229 #53466
+pkg syscall (freebsd-riscv64-cgo), const BIOCSRTIMEOUT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BIOCSSEESENT = 2147762807 #53466
+pkg syscall (freebsd-riscv64-cgo), const BIOCSSEESENT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BIOCSTSTAMP = 2147762820 #53466
+pkg syscall (freebsd-riscv64-cgo), const BIOCSTSTAMP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BIOCVERSION = 1074020977 #53466
+pkg syscall (freebsd-riscv64-cgo), const BIOCVERSION ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_A = 16 #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_A ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_ABS = 32 #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_ABS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_ADD = 0 #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_ADD ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_ALIGNMENT = 8 #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_ALIGNMENT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_ALU = 4 #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_ALU ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_AND = 80 #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_AND ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_B = 16 #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_B ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_BUFMODE_BUFFER = 1 #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_BUFMODE_BUFFER ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_BUFMODE_ZBUF = 2 #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_BUFMODE_ZBUF ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_DIV = 48 #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_DIV ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_H = 8 #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_H ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_IMM = 0 #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_IMM ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_IND = 64 #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_IND ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_JA = 0 #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_JA ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_JEQ = 16 #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_JEQ ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_JGE = 48 #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_JGE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_JGT = 32 #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_JGT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_JMP = 5 #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_JMP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_JSET = 64 #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_JSET ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_K = 0 #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_K ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_LD = 0 #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_LD ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_LDX = 1 #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_LDX ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_LEN = 128 #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_LEN ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_LSH = 96 #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_LSH ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_MAJOR_VERSION = 1 #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_MAJOR_VERSION ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_MAXBUFSIZE = 524288 #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_MAXBUFSIZE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_MAXINSNS = 512 #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_MAXINSNS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_MEM = 96 #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_MEM ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_MEMWORDS = 16 #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_MEMWORDS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_MINBUFSIZE = 32 #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_MINBUFSIZE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_MINOR_VERSION = 1 #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_MINOR_VERSION ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_MISC = 7 #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_MISC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_MSH = 160 #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_MSH ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_MUL = 32 #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_MUL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_NEG = 128 #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_NEG ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_OR = 64 #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_OR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_RELEASE = 199606 #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_RELEASE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_RET = 6 #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_RET ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_RSH = 112 #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_RSH ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_ST = 2 #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_ST ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_STX = 3 #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_STX ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_SUB = 16 #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_SUB ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_TAX = 0 #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_TAX ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_TXA = 128 #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_TXA ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_T_BINTIME = 2 #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_T_BINTIME ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_T_BINTIME_FAST = 258 #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_T_BINTIME_FAST ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_T_BINTIME_MONOTONIC = 514 #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_T_BINTIME_MONOTONIC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_T_BINTIME_MONOTONIC_FAST = 770 #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_T_BINTIME_MONOTONIC_FAST ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_T_FAST = 256 #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_T_FAST ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_T_FLAG_MASK = 768 #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_T_FLAG_MASK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_T_FORMAT_MASK = 3 #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_T_FORMAT_MASK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_T_MICROTIME = 0 #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_T_MICROTIME ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_T_MICROTIME_FAST = 256 #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_T_MICROTIME_FAST ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_T_MICROTIME_MONOTONIC = 512 #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_T_MICROTIME_MONOTONIC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_T_MICROTIME_MONOTONIC_FAST = 768 #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_T_MICROTIME_MONOTONIC_FAST ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_T_MONOTONIC = 512 #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_T_MONOTONIC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_T_MONOTONIC_FAST = 768 #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_T_MONOTONIC_FAST ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_T_NANOTIME = 1 #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_T_NANOTIME ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_T_NANOTIME_FAST = 257 #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_T_NANOTIME_FAST ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_T_NANOTIME_MONOTONIC = 513 #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_T_NANOTIME_MONOTONIC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_T_NANOTIME_MONOTONIC_FAST = 769 #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_T_NANOTIME_MONOTONIC_FAST ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_T_NONE = 3 #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_T_NONE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_T_NORMAL = 0 #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_T_NORMAL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_W = 0 #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_W ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_X = 8 #53466
+pkg syscall (freebsd-riscv64-cgo), const BPF_X ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const BRKINT = 2 #53466
+pkg syscall (freebsd-riscv64-cgo), const BRKINT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const CFLUSH = 15 #53466
+pkg syscall (freebsd-riscv64-cgo), const CFLUSH ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const CLOCAL = 32768 #53466
+pkg syscall (freebsd-riscv64-cgo), const CLOCAL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const CREAD = 2048 #53466
+pkg syscall (freebsd-riscv64-cgo), const CREAD ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const CS5 = 0 #53466
+pkg syscall (freebsd-riscv64-cgo), const CS5 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const CS6 = 256 #53466
+pkg syscall (freebsd-riscv64-cgo), const CS6 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const CS7 = 512 #53466
+pkg syscall (freebsd-riscv64-cgo), const CS7 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const CS8 = 768 #53466
+pkg syscall (freebsd-riscv64-cgo), const CS8 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const CSIZE = 768 #53466
+pkg syscall (freebsd-riscv64-cgo), const CSIZE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const CSTART = 17 #53466
+pkg syscall (freebsd-riscv64-cgo), const CSTART ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const CSTATUS = 20 #53466
+pkg syscall (freebsd-riscv64-cgo), const CSTATUS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const CSTOP = 19 #53466
+pkg syscall (freebsd-riscv64-cgo), const CSTOP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const CSTOPB = 1024 #53466
+pkg syscall (freebsd-riscv64-cgo), const CSTOPB ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const CSUSP = 26 #53466
+pkg syscall (freebsd-riscv64-cgo), const CSUSP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const CTL_MAXNAME = 24 #53466
+pkg syscall (freebsd-riscv64-cgo), const CTL_MAXNAME ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const CTL_NET = 4 #53466
+pkg syscall (freebsd-riscv64-cgo), const CTL_NET ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_A429 = 184 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_A429 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_A653_ICM = 185 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_A653_ICM ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_AIRONET_HEADER = 120 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_AIRONET_HEADER ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_AOS = 222 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_AOS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_APPLE_IP_OVER_IEEE1394 = 138 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_APPLE_IP_OVER_IEEE1394 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_ARCNET = 7 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_ARCNET ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_ARCNET_LINUX = 129 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_ARCNET_LINUX ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_ATM_CLIP = 19 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_ATM_CLIP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_ATM_RFC1483 = 11 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_ATM_RFC1483 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_AURORA = 126 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_AURORA ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_AX25 = 3 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_AX25 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_AX25_KISS = 202 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_AX25_KISS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_BACNET_MS_TP = 165 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_BACNET_MS_TP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_BLUETOOTH_HCI_H4 = 187 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_BLUETOOTH_HCI_H4 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 201 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_BLUETOOTH_HCI_H4_WITH_PHDR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_CAN20B = 190 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_CAN20B ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_CAN_SOCKETCAN = 227 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_CAN_SOCKETCAN ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_CHAOS = 5 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_CHAOS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_CHDLC = 104 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_CHDLC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_CISCO_IOS = 118 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_CISCO_IOS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_C_HDLC = 104 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_C_HDLC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_C_HDLC_WITH_DIR = 205 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_C_HDLC_WITH_DIR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_DBUS = 231 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_DBUS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_DECT = 221 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_DECT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_DOCSIS = 143 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_DOCSIS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_DVB_CI = 235 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_DVB_CI ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_ECONET = 115 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_ECONET ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_EN10MB = 1 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_EN10MB ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_EN3MB = 2 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_EN3MB ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_ENC = 109 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_ENC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_ERF = 197 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_ERF ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_ERF_ETH = 175 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_ERF_ETH ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_ERF_POS = 176 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_ERF_POS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_FC_2 = 224 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_FC_2 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_FC_2_WITH_FRAME_DELIMS = 225 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_FC_2_WITH_FRAME_DELIMS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_FDDI = 10 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_FDDI ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_FLEXRAY = 210 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_FLEXRAY ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_FRELAY = 107 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_FRELAY ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_FRELAY_WITH_DIR = 206 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_FRELAY_WITH_DIR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_GCOM_SERIAL = 173 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_GCOM_SERIAL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_GCOM_T1E1 = 172 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_GCOM_T1E1 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_GPF_F = 171 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_GPF_F ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_GPF_T = 170 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_GPF_T ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_GPRS_LLC = 169 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_GPRS_LLC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_GSMTAP_ABIS = 218 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_GSMTAP_ABIS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_GSMTAP_UM = 217 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_GSMTAP_UM ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_HHDLC = 121 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_HHDLC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_IBM_SN = 146 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_IBM_SN ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_IBM_SP = 145 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_IBM_SP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_IEEE802 = 6 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_IEEE802 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_IEEE802_11 = 105 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_IEEE802_11 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_IEEE802_11_RADIO = 127 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_IEEE802_11_RADIO ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_IEEE802_11_RADIO_AVS = 163 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_IEEE802_11_RADIO_AVS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_IEEE802_15_4 = 195 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_IEEE802_15_4 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_IEEE802_15_4_LINUX = 191 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_IEEE802_15_4_LINUX ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_IEEE802_15_4_NOFCS = 230 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_IEEE802_15_4_NOFCS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_IEEE802_15_4_NONASK_PHY = 215 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_IEEE802_15_4_NONASK_PHY ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_IEEE802_16_MAC_CPS = 188 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_IEEE802_16_MAC_CPS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_IEEE802_16_MAC_CPS_RADIO = 193 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_IEEE802_16_MAC_CPS_RADIO ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_IPFILTER = 116 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_IPFILTER ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_IPMB = 199 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_IPMB ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_IPMB_LINUX = 209 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_IPMB_LINUX ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_IPNET = 226 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_IPNET ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_IPOIB = 242 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_IPOIB ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_IPV4 = 228 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_IPV4 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_IPV6 = 229 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_IPV6 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_IP_OVER_FC = 122 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_IP_OVER_FC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_JUNIPER_ATM1 = 137 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_JUNIPER_ATM1 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_JUNIPER_ATM2 = 135 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_JUNIPER_ATM2 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_JUNIPER_ATM_CEMIC = 238 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_JUNIPER_ATM_CEMIC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_JUNIPER_CHDLC = 181 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_JUNIPER_CHDLC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_JUNIPER_ES = 132 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_JUNIPER_ES ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_JUNIPER_ETHER = 178 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_JUNIPER_ETHER ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_JUNIPER_FIBRECHANNEL = 234 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_JUNIPER_FIBRECHANNEL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_JUNIPER_FRELAY = 180 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_JUNIPER_FRELAY ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_JUNIPER_GGSN = 133 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_JUNIPER_GGSN ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_JUNIPER_ISM = 194 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_JUNIPER_ISM ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_JUNIPER_MFR = 134 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_JUNIPER_MFR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_JUNIPER_MLFR = 131 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_JUNIPER_MLFR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_JUNIPER_MLPPP = 130 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_JUNIPER_MLPPP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_JUNIPER_MONITOR = 164 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_JUNIPER_MONITOR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_JUNIPER_PIC_PEER = 174 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_JUNIPER_PIC_PEER ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_JUNIPER_PPP = 179 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_JUNIPER_PPP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_JUNIPER_PPPOE = 167 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_JUNIPER_PPPOE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_JUNIPER_PPPOE_ATM = 168 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_JUNIPER_PPPOE_ATM ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_JUNIPER_SERVICES = 136 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_JUNIPER_SERVICES ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_JUNIPER_SRX_E2E = 233 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_JUNIPER_SRX_E2E ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_JUNIPER_ST = 200 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_JUNIPER_ST ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_JUNIPER_VP = 183 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_JUNIPER_VP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_JUNIPER_VS = 232 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_JUNIPER_VS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_LAPB_WITH_DIR = 207 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_LAPB_WITH_DIR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_LAPD = 203 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_LAPD ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_LIN = 212 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_LIN ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_LINUX_EVDEV = 216 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_LINUX_EVDEV ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_LINUX_IRDA = 144 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_LINUX_IRDA ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_LINUX_LAPD = 177 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_LINUX_LAPD ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_LINUX_PPP_WITHDIRECTION = 166 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_LINUX_PPP_WITHDIRECTION ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_LINUX_SLL = 113 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_LINUX_SLL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_LOOP = 108 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_LOOP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_LTALK = 114 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_LTALK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_MATCHING_MAX = 246 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_MATCHING_MAX ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_MATCHING_MIN = 104 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_MATCHING_MIN ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_MFR = 182 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_MFR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_MOST = 211 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_MOST ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_MPEG_2_TS = 243 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_MPEG_2_TS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_MPLS = 219 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_MPLS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_MTP2 = 140 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_MTP2 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_MTP2_WITH_PHDR = 139 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_MTP2_WITH_PHDR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_MTP3 = 141 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_MTP3 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_MUX27010 = 236 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_MUX27010 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_NETANALYZER = 240 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_NETANALYZER ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_NETANALYZER_TRANSPARENT = 241 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_NETANALYZER_TRANSPARENT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_NFC_LLCP = 245 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_NFC_LLCP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_NFLOG = 239 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_NFLOG ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_NG40 = 244 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_NG40 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_NULL = 0 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_NULL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_PCI_EXP = 125 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_PCI_EXP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_PFLOG = 117 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_PFLOG ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_PFSYNC = 121 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_PFSYNC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_PPI = 192 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_PPI ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_PPP = 9 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_PPP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_PPP_BSDOS = 16 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_PPP_BSDOS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_PPP_ETHER = 51 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_PPP_ETHER ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_PPP_PPPD = 166 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_PPP_PPPD ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_PPP_SERIAL = 50 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_PPP_SERIAL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_PPP_WITH_DIR = 204 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_PPP_WITH_DIR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_PPP_WITH_DIRECTION = 166 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_PPP_WITH_DIRECTION ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_PRISM_HEADER = 119 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_PRISM_HEADER ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_PRONET = 4 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_PRONET ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_RAIF1 = 198 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_RAIF1 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_RAW = 12 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_RAW ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_RIO = 124 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_RIO ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_SCCP = 142 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_SCCP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_SITA = 196 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_SITA ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_SLIP = 8 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_SLIP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_SLIP_BSDOS = 15 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_SLIP_BSDOS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_STANAG_5066_D_PDU = 237 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_STANAG_5066_D_PDU ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_SUNATM = 123 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_SUNATM ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_SYMANTEC_FIREWALL = 99 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_SYMANTEC_FIREWALL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_TZSP = 128 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_TZSP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_USB = 186 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_USB ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_USB_LINUX = 189 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_USB_LINUX ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_USB_LINUX_MMAPPED = 220 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_USB_LINUX_MMAPPED ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_USER0 = 147 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_USER0 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_USER1 = 148 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_USER1 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_USER10 = 157 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_USER10 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_USER11 = 158 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_USER11 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_USER12 = 159 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_USER12 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_USER13 = 160 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_USER13 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_USER14 = 161 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_USER14 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_USER15 = 162 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_USER15 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_USER2 = 149 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_USER2 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_USER3 = 150 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_USER3 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_USER4 = 151 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_USER4 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_USER5 = 152 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_USER5 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_USER6 = 153 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_USER6 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_USER7 = 154 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_USER7 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_USER8 = 155 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_USER8 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_USER9 = 156 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_USER9 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_WIHART = 223 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_WIHART ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_X2E_SERIAL = 213 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_X2E_SERIAL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_X2E_XORAYA = 214 #53466
+pkg syscall (freebsd-riscv64-cgo), const DLT_X2E_XORAYA ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DT_BLK = 6 #53466
+pkg syscall (freebsd-riscv64-cgo), const DT_BLK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DT_CHR = 2 #53466
+pkg syscall (freebsd-riscv64-cgo), const DT_CHR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DT_DIR = 4 #53466
+pkg syscall (freebsd-riscv64-cgo), const DT_DIR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DT_FIFO = 1 #53466
+pkg syscall (freebsd-riscv64-cgo), const DT_FIFO ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DT_LNK = 10 #53466
+pkg syscall (freebsd-riscv64-cgo), const DT_LNK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DT_REG = 8 #53466
+pkg syscall (freebsd-riscv64-cgo), const DT_REG ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DT_SOCK = 12 #53466
+pkg syscall (freebsd-riscv64-cgo), const DT_SOCK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DT_UNKNOWN = 0 #53466
+pkg syscall (freebsd-riscv64-cgo), const DT_UNKNOWN ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const DT_WHT = 14 #53466
+pkg syscall (freebsd-riscv64-cgo), const DT_WHT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const E2BIG = 7 #53466
+pkg syscall (freebsd-riscv64-cgo), const EACCES = 13 #53466
+pkg syscall (freebsd-riscv64-cgo), const EADDRINUSE = 48 #53466
+pkg syscall (freebsd-riscv64-cgo), const EADDRNOTAVAIL = 49 #53466
+pkg syscall (freebsd-riscv64-cgo), const EAFNOSUPPORT = 47 #53466
+pkg syscall (freebsd-riscv64-cgo), const EAGAIN = 35 #53466
+pkg syscall (freebsd-riscv64-cgo), const EALREADY = 37 #53466
+pkg syscall (freebsd-riscv64-cgo), const EAUTH = 80 #53466
+pkg syscall (freebsd-riscv64-cgo), const EAUTH Errno #53466
+pkg syscall (freebsd-riscv64-cgo), const EBADF = 9 #53466
+pkg syscall (freebsd-riscv64-cgo), const EBADMSG = 89 #53466
+pkg syscall (freebsd-riscv64-cgo), const EBADMSG Errno #53466
+pkg syscall (freebsd-riscv64-cgo), const EBADRPC = 72 #53466
+pkg syscall (freebsd-riscv64-cgo), const EBADRPC Errno #53466
+pkg syscall (freebsd-riscv64-cgo), const EBUSY = 16 #53466
+pkg syscall (freebsd-riscv64-cgo), const ECANCELED = 85 #53466
+pkg syscall (freebsd-riscv64-cgo), const ECAPMODE = 94 #53466
+pkg syscall (freebsd-riscv64-cgo), const ECAPMODE Errno #53466
+pkg syscall (freebsd-riscv64-cgo), const ECHILD = 10 #53466
+pkg syscall (freebsd-riscv64-cgo), const ECHO = 8 #53466
+pkg syscall (freebsd-riscv64-cgo), const ECHO ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const ECHOCTL = 64 #53466
+pkg syscall (freebsd-riscv64-cgo), const ECHOCTL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const ECHOE = 2 #53466
+pkg syscall (freebsd-riscv64-cgo), const ECHOE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const ECHOK = 4 #53466
+pkg syscall (freebsd-riscv64-cgo), const ECHOK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const ECHOKE = 1 #53466
+pkg syscall (freebsd-riscv64-cgo), const ECHOKE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const ECHONL = 16 #53466
+pkg syscall (freebsd-riscv64-cgo), const ECHONL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const ECHOPRT = 32 #53466
+pkg syscall (freebsd-riscv64-cgo), const ECHOPRT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const ECONNABORTED = 53 #53466
+pkg syscall (freebsd-riscv64-cgo), const ECONNREFUSED = 61 #53466
+pkg syscall (freebsd-riscv64-cgo), const ECONNRESET = 54 #53466
+pkg syscall (freebsd-riscv64-cgo), const EDEADLK = 11 #53466
+pkg syscall (freebsd-riscv64-cgo), const EDESTADDRREQ = 39 #53466
+pkg syscall (freebsd-riscv64-cgo), const EDOM = 33 #53466
+pkg syscall (freebsd-riscv64-cgo), const EDOOFUS = 88 #53466
+pkg syscall (freebsd-riscv64-cgo), const EDOOFUS Errno #53466
+pkg syscall (freebsd-riscv64-cgo), const EDQUOT = 69 #53466
+pkg syscall (freebsd-riscv64-cgo), const EEXIST = 17 #53466
+pkg syscall (freebsd-riscv64-cgo), const EFAULT = 14 #53466
+pkg syscall (freebsd-riscv64-cgo), const EFBIG = 27 #53466
+pkg syscall (freebsd-riscv64-cgo), const EFTYPE = 79 #53466
+pkg syscall (freebsd-riscv64-cgo), const EFTYPE Errno #53466
+pkg syscall (freebsd-riscv64-cgo), const EHOSTDOWN = 64 #53466
+pkg syscall (freebsd-riscv64-cgo), const EHOSTUNREACH = 65 #53466
+pkg syscall (freebsd-riscv64-cgo), const EIDRM = 82 #53466
+pkg syscall (freebsd-riscv64-cgo), const EILSEQ = 86 #53466
+pkg syscall (freebsd-riscv64-cgo), const EINPROGRESS = 36 #53466
+pkg syscall (freebsd-riscv64-cgo), const EINTR = 4 #53466
+pkg syscall (freebsd-riscv64-cgo), const EINVAL = 22 #53466
+pkg syscall (freebsd-riscv64-cgo), const EIO = 5 #53466
+pkg syscall (freebsd-riscv64-cgo), const EISCONN = 56 #53466
+pkg syscall (freebsd-riscv64-cgo), const EISDIR = 21 #53466
+pkg syscall (freebsd-riscv64-cgo), const ELAST = 96 #53466
+pkg syscall (freebsd-riscv64-cgo), const ELAST Errno #53466
+pkg syscall (freebsd-riscv64-cgo), const ELOOP = 62 #53466
+pkg syscall (freebsd-riscv64-cgo), const EMFILE = 24 #53466
+pkg syscall (freebsd-riscv64-cgo), const EMLINK = 31 #53466
+pkg syscall (freebsd-riscv64-cgo), const EMSGSIZE = 40 #53466
+pkg syscall (freebsd-riscv64-cgo), const EMULTIHOP = 90 #53466
+pkg syscall (freebsd-riscv64-cgo), const EMULTIHOP Errno #53466
+pkg syscall (freebsd-riscv64-cgo), const ENAMETOOLONG = 63 #53466
+pkg syscall (freebsd-riscv64-cgo), const ENEEDAUTH = 81 #53466
+pkg syscall (freebsd-riscv64-cgo), const ENEEDAUTH Errno #53466
+pkg syscall (freebsd-riscv64-cgo), const ENETDOWN = 50 #53466
+pkg syscall (freebsd-riscv64-cgo), const ENETRESET = 52 #53466
+pkg syscall (freebsd-riscv64-cgo), const ENETUNREACH = 51 #53466
+pkg syscall (freebsd-riscv64-cgo), const ENFILE = 23 #53466
+pkg syscall (freebsd-riscv64-cgo), const ENOATTR = 87 #53466
+pkg syscall (freebsd-riscv64-cgo), const ENOATTR Errno #53466
+pkg syscall (freebsd-riscv64-cgo), const ENOBUFS = 55 #53466
+pkg syscall (freebsd-riscv64-cgo), const ENODEV = 19 #53466
+pkg syscall (freebsd-riscv64-cgo), const ENOEXEC = 8 #53466
+pkg syscall (freebsd-riscv64-cgo), const ENOLCK = 77 #53466
+pkg syscall (freebsd-riscv64-cgo), const ENOLINK = 91 #53466
+pkg syscall (freebsd-riscv64-cgo), const ENOLINK Errno #53466
+pkg syscall (freebsd-riscv64-cgo), const ENOMEM = 12 #53466
+pkg syscall (freebsd-riscv64-cgo), const ENOMSG = 83 #53466
+pkg syscall (freebsd-riscv64-cgo), const ENOPROTOOPT = 42 #53466
+pkg syscall (freebsd-riscv64-cgo), const ENOSPC = 28 #53466
+pkg syscall (freebsd-riscv64-cgo), const ENOSYS = 78 #53466
+pkg syscall (freebsd-riscv64-cgo), const ENOTBLK = 15 #53466
+pkg syscall (freebsd-riscv64-cgo), const ENOTCAPABLE = 93 #53466
+pkg syscall (freebsd-riscv64-cgo), const ENOTCAPABLE Errno #53466
+pkg syscall (freebsd-riscv64-cgo), const ENOTCONN = 57 #53466
+pkg syscall (freebsd-riscv64-cgo), const ENOTDIR = 20 #53466
+pkg syscall (freebsd-riscv64-cgo), const ENOTEMPTY = 66 #53466
+pkg syscall (freebsd-riscv64-cgo), const ENOTRECOVERABLE = 95 #53466
+pkg syscall (freebsd-riscv64-cgo), const ENOTRECOVERABLE Errno #53466
+pkg syscall (freebsd-riscv64-cgo), const ENOTSOCK = 38 #53466
+pkg syscall (freebsd-riscv64-cgo), const ENOTSUP = 45 #53466
+pkg syscall (freebsd-riscv64-cgo), const ENOTTY = 25 #53466
+pkg syscall (freebsd-riscv64-cgo), const ENXIO = 6 #53466
+pkg syscall (freebsd-riscv64-cgo), const EOPNOTSUPP = 45 #53466
+pkg syscall (freebsd-riscv64-cgo), const EOVERFLOW = 84 #53466
+pkg syscall (freebsd-riscv64-cgo), const EOWNERDEAD = 96 #53466
+pkg syscall (freebsd-riscv64-cgo), const EOWNERDEAD Errno #53466
+pkg syscall (freebsd-riscv64-cgo), const EPERM = 1 #53466
+pkg syscall (freebsd-riscv64-cgo), const EPFNOSUPPORT = 46 #53466
+pkg syscall (freebsd-riscv64-cgo), const EPIPE = 32 #53466
+pkg syscall (freebsd-riscv64-cgo), const EPROCLIM = 67 #53466
+pkg syscall (freebsd-riscv64-cgo), const EPROCLIM Errno #53466
+pkg syscall (freebsd-riscv64-cgo), const EPROCUNAVAIL = 76 #53466
+pkg syscall (freebsd-riscv64-cgo), const EPROCUNAVAIL Errno #53466
+pkg syscall (freebsd-riscv64-cgo), const EPROGMISMATCH = 75 #53466
+pkg syscall (freebsd-riscv64-cgo), const EPROGMISMATCH Errno #53466
+pkg syscall (freebsd-riscv64-cgo), const EPROGUNAVAIL = 74 #53466
+pkg syscall (freebsd-riscv64-cgo), const EPROGUNAVAIL Errno #53466
+pkg syscall (freebsd-riscv64-cgo), const EPROTO = 92 #53466
+pkg syscall (freebsd-riscv64-cgo), const EPROTO Errno #53466
+pkg syscall (freebsd-riscv64-cgo), const EPROTONOSUPPORT = 43 #53466
+pkg syscall (freebsd-riscv64-cgo), const EPROTOTYPE = 41 #53466
+pkg syscall (freebsd-riscv64-cgo), const ERANGE = 34 #53466
+pkg syscall (freebsd-riscv64-cgo), const EREMOTE = 71 #53466
+pkg syscall (freebsd-riscv64-cgo), const EROFS = 30 #53466
+pkg syscall (freebsd-riscv64-cgo), const ERPCMISMATCH = 73 #53466
+pkg syscall (freebsd-riscv64-cgo), const ERPCMISMATCH Errno #53466
+pkg syscall (freebsd-riscv64-cgo), const ESHUTDOWN = 58 #53466
+pkg syscall (freebsd-riscv64-cgo), const ESOCKTNOSUPPORT = 44 #53466
+pkg syscall (freebsd-riscv64-cgo), const ESPIPE = 29 #53466
+pkg syscall (freebsd-riscv64-cgo), const ESRCH = 3 #53466
+pkg syscall (freebsd-riscv64-cgo), const ESTALE = 70 #53466
+pkg syscall (freebsd-riscv64-cgo), const ETIMEDOUT = 60 #53466
+pkg syscall (freebsd-riscv64-cgo), const ETOOMANYREFS = 59 #53466
+pkg syscall (freebsd-riscv64-cgo), const ETXTBSY = 26 #53466
+pkg syscall (freebsd-riscv64-cgo), const EUSERS = 68 #53466
+pkg syscall (freebsd-riscv64-cgo), const EVFILT_AIO = -3 #53466
+pkg syscall (freebsd-riscv64-cgo), const EVFILT_AIO ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const EVFILT_FS = -9 #53466
+pkg syscall (freebsd-riscv64-cgo), const EVFILT_FS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const EVFILT_LIO = -10 #53466
+pkg syscall (freebsd-riscv64-cgo), const EVFILT_LIO ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const EVFILT_PROC = -5 #53466
+pkg syscall (freebsd-riscv64-cgo), const EVFILT_PROC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const EVFILT_READ = -1 #53466
+pkg syscall (freebsd-riscv64-cgo), const EVFILT_READ ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const EVFILT_SIGNAL = -6 #53466
+pkg syscall (freebsd-riscv64-cgo), const EVFILT_SIGNAL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const EVFILT_SYSCOUNT = 11 #53466
+pkg syscall (freebsd-riscv64-cgo), const EVFILT_SYSCOUNT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const EVFILT_TIMER = -7 #53466
+pkg syscall (freebsd-riscv64-cgo), const EVFILT_TIMER ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const EVFILT_USER = -11 #53466
+pkg syscall (freebsd-riscv64-cgo), const EVFILT_USER ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const EVFILT_VNODE = -4 #53466
+pkg syscall (freebsd-riscv64-cgo), const EVFILT_VNODE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const EVFILT_WRITE = -2 #53466
+pkg syscall (freebsd-riscv64-cgo), const EVFILT_WRITE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const EV_ADD = 1 #53466
+pkg syscall (freebsd-riscv64-cgo), const EV_ADD ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const EV_CLEAR = 32 #53466
+pkg syscall (freebsd-riscv64-cgo), const EV_CLEAR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const EV_DELETE = 2 #53466
+pkg syscall (freebsd-riscv64-cgo), const EV_DELETE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const EV_DISABLE = 8 #53466
+pkg syscall (freebsd-riscv64-cgo), const EV_DISABLE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const EV_DISPATCH = 128 #53466
+pkg syscall (freebsd-riscv64-cgo), const EV_DISPATCH ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const EV_DROP = 4096 #53466
+pkg syscall (freebsd-riscv64-cgo), const EV_DROP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const EV_ENABLE = 4 #53466
+pkg syscall (freebsd-riscv64-cgo), const EV_ENABLE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const EV_EOF = 32768 #53466
+pkg syscall (freebsd-riscv64-cgo), const EV_EOF ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const EV_ERROR = 16384 #53466
+pkg syscall (freebsd-riscv64-cgo), const EV_ERROR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const EV_FLAG1 = 8192 #53466
+pkg syscall (freebsd-riscv64-cgo), const EV_FLAG1 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const EV_ONESHOT = 16 #53466
+pkg syscall (freebsd-riscv64-cgo), const EV_ONESHOT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const EV_RECEIPT = 64 #53466
+pkg syscall (freebsd-riscv64-cgo), const EV_RECEIPT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const EV_SYSFLAGS = 61440 #53466
+pkg syscall (freebsd-riscv64-cgo), const EV_SYSFLAGS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const EWOULDBLOCK = 35 #53466
+pkg syscall (freebsd-riscv64-cgo), const EXDEV = 18 #53466
+pkg syscall (freebsd-riscv64-cgo), const EXTA = 19200 #53466
+pkg syscall (freebsd-riscv64-cgo), const EXTA ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const EXTB = 38400 #53466
+pkg syscall (freebsd-riscv64-cgo), const EXTB ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const EXTPROC = 2048 #53466
+pkg syscall (freebsd-riscv64-cgo), const EXTPROC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const FD_CLOEXEC = 1 #53466
+pkg syscall (freebsd-riscv64-cgo), const FD_CLOEXEC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const FD_SETSIZE = 1024 #53466
+pkg syscall (freebsd-riscv64-cgo), const FD_SETSIZE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const FLUSHO = 8388608 #53466
+pkg syscall (freebsd-riscv64-cgo), const FLUSHO ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const F_CANCEL = 5 #53466
+pkg syscall (freebsd-riscv64-cgo), const F_CANCEL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const F_DUP2FD = 10 #53466
+pkg syscall (freebsd-riscv64-cgo), const F_DUP2FD ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const F_DUP2FD_CLOEXEC = 18 #53466
+pkg syscall (freebsd-riscv64-cgo), const F_DUP2FD_CLOEXEC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const F_DUPFD = 0 #53466
+pkg syscall (freebsd-riscv64-cgo), const F_DUPFD ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const F_DUPFD_CLOEXEC = 17 #53466
+pkg syscall (freebsd-riscv64-cgo), const F_DUPFD_CLOEXEC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const F_GETFD = 1 #53466
+pkg syscall (freebsd-riscv64-cgo), const F_GETFD ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const F_GETFL = 3 #53466
+pkg syscall (freebsd-riscv64-cgo), const F_GETFL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const F_GETLK = 11 #53466
+pkg syscall (freebsd-riscv64-cgo), const F_GETLK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const F_GETOWN = 5 #53466
+pkg syscall (freebsd-riscv64-cgo), const F_GETOWN ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const F_OGETLK = 7 #53466
+pkg syscall (freebsd-riscv64-cgo), const F_OGETLK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const F_OK = 0 #53466
+pkg syscall (freebsd-riscv64-cgo), const F_OK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const F_OSETLK = 8 #53466
+pkg syscall (freebsd-riscv64-cgo), const F_OSETLK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const F_OSETLKW = 9 #53466
+pkg syscall (freebsd-riscv64-cgo), const F_OSETLKW ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const F_RDAHEAD = 16 #53466
+pkg syscall (freebsd-riscv64-cgo), const F_RDAHEAD ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const F_RDLCK = 1 #53466
+pkg syscall (freebsd-riscv64-cgo), const F_RDLCK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const F_READAHEAD = 15 #53466
+pkg syscall (freebsd-riscv64-cgo), const F_READAHEAD ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const F_SETFD = 2 #53466
+pkg syscall (freebsd-riscv64-cgo), const F_SETFD ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const F_SETFL = 4 #53466
+pkg syscall (freebsd-riscv64-cgo), const F_SETFL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const F_SETLK = 12 #53466
+pkg syscall (freebsd-riscv64-cgo), const F_SETLK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const F_SETLKW = 13 #53466
+pkg syscall (freebsd-riscv64-cgo), const F_SETLKW ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const F_SETLK_REMOTE = 14 #53466
+pkg syscall (freebsd-riscv64-cgo), const F_SETLK_REMOTE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const F_SETOWN = 6 #53466
+pkg syscall (freebsd-riscv64-cgo), const F_SETOWN ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const F_UNLCK = 2 #53466
+pkg syscall (freebsd-riscv64-cgo), const F_UNLCK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const F_UNLCKSYS = 4 #53466
+pkg syscall (freebsd-riscv64-cgo), const F_UNLCKSYS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const F_WRLCK = 3 #53466
+pkg syscall (freebsd-riscv64-cgo), const F_WRLCK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const HUPCL = 16384 #53466
+pkg syscall (freebsd-riscv64-cgo), const HUPCL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const ICANON = 256 #53466
+pkg syscall (freebsd-riscv64-cgo), const ICANON ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const ICMP6_FILTER = 18 #53466
+pkg syscall (freebsd-riscv64-cgo), const ICMP6_FILTER ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const ICRNL = 256 #53466
+pkg syscall (freebsd-riscv64-cgo), const ICRNL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IEXTEN = 1024 #53466
+pkg syscall (freebsd-riscv64-cgo), const IEXTEN ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFAN_ARRIVAL = 0 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFAN_ARRIVAL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFAN_DEPARTURE = 1 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFAN_DEPARTURE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFF_ALLMULTI = 512 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFF_ALLMULTI ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFF_ALTPHYS = 16384 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFF_ALTPHYS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFF_CANTCHANGE = 2199410 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFF_CANTCHANGE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFF_CANTCONFIG = 65536 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFF_CANTCONFIG ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFF_DEBUG = 4 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFF_DEBUG ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFF_DRV_OACTIVE = 1024 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFF_DRV_OACTIVE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFF_DRV_RUNNING = 64 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFF_DRV_RUNNING ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFF_DYING = 2097152 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFF_DYING ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFF_LINK0 = 4096 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFF_LINK0 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFF_LINK1 = 8192 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFF_LINK1 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFF_LINK2 = 16384 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFF_LINK2 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFF_LOOPBACK = 8 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFF_MONITOR = 262144 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFF_MONITOR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFF_MULTICAST = 32768 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFF_NOARP = 128 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFF_NOARP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFF_OACTIVE = 1024 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFF_OACTIVE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFF_POINTOPOINT = 16 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFF_POINTOPOINT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFF_PPROMISC = 131072 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFF_PPROMISC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFF_PROMISC = 256 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFF_PROMISC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFF_RENAMING = 4194304 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFF_RENAMING ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFF_RUNNING = 64 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFF_RUNNING ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFF_SIMPLEX = 2048 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFF_SIMPLEX ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFF_SMART = 32 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFF_SMART ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFF_STATICARP = 524288 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFF_STATICARP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFNAMSIZ = 16 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFNAMSIZ ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_1822 = 2 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_1822 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_A12MPPSWITCH = 130 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_A12MPPSWITCH ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_AAL2 = 187 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_AAL2 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_AAL5 = 49 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_AAL5 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_ADSL = 94 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_ADSL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_AFLANE8023 = 59 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_AFLANE8023 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_AFLANE8025 = 60 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_AFLANE8025 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_ARAP = 88 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_ARAP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_ARCNET = 35 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_ARCNET ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_ARCNETPLUS = 36 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_ARCNETPLUS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_ASYNC = 84 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_ASYNC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_ATM = 37 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_ATM ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_ATMDXI = 105 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_ATMDXI ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_ATMFUNI = 106 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_ATMFUNI ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_ATMIMA = 107 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_ATMIMA ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_ATMLOGICAL = 80 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_ATMLOGICAL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_ATMRADIO = 189 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_ATMRADIO ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_ATMSUBINTERFACE = 134 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_ATMSUBINTERFACE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_ATMVCIENDPT = 194 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_ATMVCIENDPT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_ATMVIRTUAL = 149 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_ATMVIRTUAL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_BGPPOLICYACCOUNTING = 162 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_BGPPOLICYACCOUNTING ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_BRIDGE = 209 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_BRIDGE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_BSC = 83 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_BSC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_CARP = 248 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_CARP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_CCTEMUL = 61 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_CCTEMUL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_CEPT = 19 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_CEPT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_CES = 133 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_CES ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_CHANNEL = 70 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_CHANNEL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_CNR = 85 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_CNR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_COFFEE = 132 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_COFFEE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_COMPOSITELINK = 155 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_COMPOSITELINK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_DCN = 141 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_DCN ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_DIGITALPOWERLINE = 138 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_DIGITALPOWERLINE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_DIGITALWRAPPEROVERHEADCHANNEL = 186 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_DIGITALWRAPPEROVERHEADCHANNEL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_DLSW = 74 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_DLSW ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_DOCSCABLEDOWNSTREAM = 128 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_DOCSCABLEDOWNSTREAM ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_DOCSCABLEMACLAYER = 127 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_DOCSCABLEMACLAYER ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_DOCSCABLEUPSTREAM = 129 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_DOCSCABLEUPSTREAM ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_DS0 = 81 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_DS0 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_DS0BUNDLE = 82 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_DS0BUNDLE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_DS1FDL = 170 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_DS1FDL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_DS3 = 30 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_DS3 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_DTM = 140 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_DTM ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_DVBASILN = 172 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_DVBASILN ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_DVBASIOUT = 173 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_DVBASIOUT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_DVBRCCDOWNSTREAM = 147 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_DVBRCCDOWNSTREAM ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_DVBRCCMACLAYER = 146 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_DVBRCCMACLAYER ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_DVBRCCUPSTREAM = 148 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_DVBRCCUPSTREAM ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_ENC = 244 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_ENC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_EON = 25 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_EON ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_EPLRS = 87 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_EPLRS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_ESCON = 73 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_ESCON ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_ETHER = 6 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_ETHER ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_FAITH = 242 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_FAITH ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_FAST = 125 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_FAST ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_FASTETHER = 62 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_FASTETHER ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_FASTETHERFX = 69 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_FASTETHERFX ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_FDDI = 15 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_FDDI ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_FIBRECHANNEL = 56 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_FIBRECHANNEL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_FRAMERELAYINTERCONNECT = 58 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_FRAMERELAYINTERCONNECT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_FRAMERELAYMPI = 92 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_FRAMERELAYMPI ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_FRDLCIENDPT = 193 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_FRDLCIENDPT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_FRELAY = 32 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_FRELAY ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_FRELAYDCE = 44 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_FRELAYDCE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_FRF16MFRBUNDLE = 163 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_FRF16MFRBUNDLE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_FRFORWARD = 158 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_FRFORWARD ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_G703AT2MB = 67 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_G703AT2MB ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_G703AT64K = 66 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_G703AT64K ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_GIF = 240 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_GIF ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_GIGABITETHERNET = 117 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_GIGABITETHERNET ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_GR303IDT = 178 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_GR303IDT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_GR303RDT = 177 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_GR303RDT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_H323GATEKEEPER = 164 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_H323GATEKEEPER ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_H323PROXY = 165 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_H323PROXY ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_HDH1822 = 3 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_HDH1822 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_HDLC = 118 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_HDLC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_HDSL2 = 168 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_HDSL2 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_HIPERLAN2 = 183 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_HIPERLAN2 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_HIPPI = 47 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_HIPPI ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_HIPPIINTERFACE = 57 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_HIPPIINTERFACE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_HOSTPAD = 90 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_HOSTPAD ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_HSSI = 46 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_HSSI ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_HY = 14 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_HY ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_IBM370PARCHAN = 72 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_IBM370PARCHAN ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_IDSL = 154 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_IDSL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_IEEE1394 = 144 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_IEEE1394 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_IEEE80211 = 71 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_IEEE80211 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_IEEE80212 = 55 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_IEEE80212 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_IEEE8023ADLAG = 161 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_IEEE8023ADLAG ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_IFGSN = 145 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_IFGSN ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_IMT = 190 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_IMT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_INFINIBAND = 199 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_INFINIBAND ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_INTERLEAVE = 124 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_INTERLEAVE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_IP = 126 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_IP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_IPFORWARD = 142 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_IPFORWARD ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_IPOVERATM = 114 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_IPOVERATM ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_IPOVERCDLC = 109 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_IPOVERCDLC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_IPOVERCLAW = 110 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_IPOVERCLAW ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_IPSWITCH = 78 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_IPSWITCH ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_IPXIP = 249 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_IPXIP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_ISDN = 63 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_ISDN ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_ISDNBASIC = 20 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_ISDNBASIC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_ISDNPRIMARY = 21 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_ISDNPRIMARY ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_ISDNS = 75 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_ISDNS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_ISDNU = 76 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_ISDNU ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_ISO88022LLC = 41 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_ISO88022LLC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_ISO88023 = 7 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_ISO88023 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_ISO88024 = 8 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_ISO88024 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_ISO88025 = 9 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_ISO88025 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_ISO88025CRFPINT = 98 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_ISO88025CRFPINT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_ISO88025DTR = 86 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_ISO88025DTR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_ISO88025FIBER = 115 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_ISO88025FIBER ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_ISO88026 = 10 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_ISO88026 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_ISUP = 179 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_ISUP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_L2VLAN = 135 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_L2VLAN ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_L3IPVLAN = 136 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_L3IPVLAN ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_L3IPXVLAN = 137 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_L3IPXVLAN ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_LAPB = 16 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_LAPB ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_LAPD = 77 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_LAPD ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_LAPF = 119 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_LAPF ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_LOCALTALK = 42 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_LOCALTALK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_LOOP = 24 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_LOOP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_MEDIAMAILOVERIP = 139 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_MEDIAMAILOVERIP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_MFSIGLINK = 167 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_MFSIGLINK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_MIOX25 = 38 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_MIOX25 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_MODEM = 48 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_MODEM ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_MPC = 113 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_MPC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_MPLS = 166 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_MPLS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_MPLSTUNNEL = 150 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_MPLSTUNNEL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_MSDSL = 143 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_MSDSL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_MVL = 191 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_MVL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_MYRINET = 99 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_MYRINET ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_NFAS = 175 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_NFAS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_NSIP = 27 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_NSIP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_OPTICALCHANNEL = 195 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_OPTICALCHANNEL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_OPTICALTRANSPORT = 196 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_OPTICALTRANSPORT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_OTHER = 1 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_OTHER ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_P10 = 12 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_P10 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_P80 = 13 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_P80 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_PARA = 34 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_PARA ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_PFLOG = 246 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_PFLOG ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_PFSYNC = 247 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_PFSYNC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_PLC = 174 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_PLC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_POS = 171 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_POS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_PPP = 23 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_PPP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_PPPMULTILINKBUNDLE = 108 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_PPPMULTILINKBUNDLE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_PROPBWAP2MP = 184 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_PROPBWAP2MP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_PROPCNLS = 89 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_PROPCNLS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_PROPDOCSWIRELESSDOWNSTREAM = 181 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_PROPDOCSWIRELESSDOWNSTREAM ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_PROPDOCSWIRELESSMACLAYER = 180 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_PROPDOCSWIRELESSMACLAYER ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_PROPDOCSWIRELESSUPSTREAM = 182 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_PROPDOCSWIRELESSUPSTREAM ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_PROPMUX = 54 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_PROPMUX ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_PROPVIRTUAL = 53 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_PROPVIRTUAL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_PROPWIRELESSP2P = 157 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_PROPWIRELESSP2P ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_PTPSERIAL = 22 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_PTPSERIAL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_PVC = 241 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_PVC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_QLLC = 68 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_QLLC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_RADIOMAC = 188 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_RADIOMAC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_RADSL = 95 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_RADSL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_REACHDSL = 192 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_REACHDSL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_RFC1483 = 159 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_RFC1483 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_RS232 = 33 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_RS232 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_RSRB = 79 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_RSRB ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_SDLC = 17 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_SDLC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_SDSL = 96 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_SDSL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_SHDSL = 169 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_SHDSL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_SIP = 31 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_SIP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_SLIP = 28 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_SLIP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_SMDSDXI = 43 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_SMDSDXI ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_SMDSICIP = 52 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_SMDSICIP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_SONET = 39 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_SONET ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_SONETOVERHEADCHANNEL = 185 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_SONETOVERHEADCHANNEL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_SONETPATH = 50 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_SONETPATH ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_SONETVT = 51 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_SONETVT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_SRP = 151 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_SRP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_SS7SIGLINK = 156 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_SS7SIGLINK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_STACKTOSTACK = 111 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_STACKTOSTACK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_STARLAN = 11 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_STARLAN ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_STF = 215 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_STF ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_T1 = 18 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_T1 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_TDLC = 116 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_TDLC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_TERMPAD = 91 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_TERMPAD ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_TR008 = 176 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_TR008 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_TRANSPHDLC = 123 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_TRANSPHDLC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_TUNNEL = 131 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_TUNNEL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_ULTRA = 29 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_ULTRA ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_USB = 160 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_USB ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_V11 = 64 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_V11 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_V35 = 45 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_V35 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_V36 = 65 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_V36 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_V37 = 120 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_V37 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_VDSL = 97 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_VDSL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_VIRTUALIPADDRESS = 112 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_VIRTUALIPADDRESS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_VOICEEM = 100 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_VOICEEM ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_VOICEENCAP = 103 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_VOICEENCAP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_VOICEFXO = 101 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_VOICEFXO ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_VOICEFXS = 102 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_VOICEFXS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_VOICEOVERATM = 152 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_VOICEOVERATM ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_VOICEOVERFRAMERELAY = 153 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_VOICEOVERFRAMERELAY ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_VOICEOVERIP = 104 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_VOICEOVERIP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_X213 = 93 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_X213 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_X25 = 5 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_X25 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_X25DDN = 4 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_X25DDN ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_X25HUNTGROUP = 122 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_X25HUNTGROUP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_X25MLP = 121 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_X25MLP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_X25PLE = 40 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_X25PLE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_XETHER = 26 #53466
+pkg syscall (freebsd-riscv64-cgo), const IFT_XETHER ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IGNBRK = 1 #53466
+pkg syscall (freebsd-riscv64-cgo), const IGNBRK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IGNCR = 128 #53466
+pkg syscall (freebsd-riscv64-cgo), const IGNCR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IGNPAR = 4 #53466
+pkg syscall (freebsd-riscv64-cgo), const IGNPAR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IMAXBEL = 8192 #53466
+pkg syscall (freebsd-riscv64-cgo), const IMAXBEL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const INLCR = 64 #53466
+pkg syscall (freebsd-riscv64-cgo), const INLCR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const INPCK = 16 #53466
+pkg syscall (freebsd-riscv64-cgo), const INPCK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IN_CLASSA_HOST = 16777215 #53466
+pkg syscall (freebsd-riscv64-cgo), const IN_CLASSA_HOST ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IN_CLASSA_MAX = 128 #53466
+pkg syscall (freebsd-riscv64-cgo), const IN_CLASSA_MAX ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IN_CLASSA_NET = 4278190080 #53466
+pkg syscall (freebsd-riscv64-cgo), const IN_CLASSA_NET ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IN_CLASSA_NSHIFT = 24 #53466
+pkg syscall (freebsd-riscv64-cgo), const IN_CLASSA_NSHIFT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IN_CLASSB_HOST = 65535 #53466
+pkg syscall (freebsd-riscv64-cgo), const IN_CLASSB_HOST ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IN_CLASSB_MAX = 65536 #53466
+pkg syscall (freebsd-riscv64-cgo), const IN_CLASSB_MAX ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IN_CLASSB_NET = 4294901760 #53466
+pkg syscall (freebsd-riscv64-cgo), const IN_CLASSB_NET ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IN_CLASSB_NSHIFT = 16 #53466
+pkg syscall (freebsd-riscv64-cgo), const IN_CLASSB_NSHIFT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IN_CLASSC_HOST = 255 #53466
+pkg syscall (freebsd-riscv64-cgo), const IN_CLASSC_HOST ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IN_CLASSC_NET = 4294967040 #53466
+pkg syscall (freebsd-riscv64-cgo), const IN_CLASSC_NET ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IN_CLASSC_NSHIFT = 8 #53466
+pkg syscall (freebsd-riscv64-cgo), const IN_CLASSC_NSHIFT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IN_CLASSD_HOST = 268435455 #53466
+pkg syscall (freebsd-riscv64-cgo), const IN_CLASSD_HOST ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IN_CLASSD_NET = 4026531840 #53466
+pkg syscall (freebsd-riscv64-cgo), const IN_CLASSD_NET ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IN_CLASSD_NSHIFT = 28 #53466
+pkg syscall (freebsd-riscv64-cgo), const IN_CLASSD_NSHIFT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IN_LOOPBACKNET = 127 #53466
+pkg syscall (freebsd-riscv64-cgo), const IN_LOOPBACKNET ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IN_RFC3021_MASK = 4294967294 #53466
+pkg syscall (freebsd-riscv64-cgo), const IN_RFC3021_MASK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_3PC = 34 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_3PC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_ADFS = 68 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_ADFS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_AH = 51 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_AH ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_AHIP = 61 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_AHIP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_APES = 99 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_APES ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_ARGUS = 13 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_ARGUS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_AX25 = 93 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_AX25 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_BHA = 49 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_BHA ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_BLT = 30 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_BLT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_BRSATMON = 76 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_BRSATMON ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_CARP = 112 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_CARP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_CFTP = 62 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_CFTP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_CHAOS = 16 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_CHAOS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_CMTP = 38 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_CMTP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_CPHB = 73 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_CPHB ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_CPNX = 72 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_CPNX ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_DDP = 37 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_DDP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_DGP = 86 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_DGP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_DIVERT = 258 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_DIVERT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_DONE = 257 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_DONE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_DSTOPTS = 60 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_DSTOPTS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_EGP = 8 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_EGP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_EMCON = 14 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_EMCON ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_ENCAP = 98 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_ENCAP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_EON = 80 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_EON ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_ESP = 50 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_ESP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_ETHERIP = 97 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_ETHERIP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_FRAGMENT = 44 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_FRAGMENT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_GGP = 3 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_GGP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_GMTP = 100 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_GMTP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_GRE = 47 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_GRE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_HELLO = 63 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_HELLO ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_HMP = 20 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_HMP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_HOPOPTS = 0 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_HOPOPTS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_ICMP = 1 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_ICMP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_ICMPV6 = 58 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_ICMPV6 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_IDP = 22 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_IDP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_IDPR = 35 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_IDPR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_IDRP = 45 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_IDRP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_IGMP = 2 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_IGMP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_IGP = 85 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_IGP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_IGRP = 88 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_IGRP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_IL = 40 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_IL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_INLSP = 52 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_INLSP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_INP = 32 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_INP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_IPCOMP = 108 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_IPCOMP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_IPCV = 71 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_IPCV ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_IPEIP = 94 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_IPEIP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_IPIP = 4 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_IPIP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_IPPC = 67 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_IPPC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_IPV4 = 4 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_IPV4 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_IRTP = 28 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_IRTP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_KRYPTOLAN = 65 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_KRYPTOLAN ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_LARP = 91 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_LARP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_LEAF1 = 25 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_LEAF1 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_LEAF2 = 26 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_LEAF2 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_MAX = 256 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_MAX ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_MAXID = 52 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_MAXID ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_MEAS = 19 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_MEAS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_MH = 135 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_MH ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_MHRP = 48 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_MHRP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_MICP = 95 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_MICP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_MOBILE = 55 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_MOBILE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_MPLS = 137 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_MPLS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_MTP = 92 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_MTP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_MUX = 18 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_MUX ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_ND = 77 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_ND ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_NHRP = 54 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_NHRP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_NONE = 59 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_NONE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_NSP = 31 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_NSP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_NVPII = 11 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_NVPII ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_OLD_DIVERT = 254 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_OLD_DIVERT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_OSPFIGP = 89 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_OSPFIGP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_PFSYNC = 240 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_PFSYNC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_PGM = 113 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_PGM ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_PIGP = 9 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_PIGP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_PIM = 103 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_PIM ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_PRM = 21 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_PRM ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_PUP = 12 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_PUP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_PVP = 75 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_PVP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_RAW = 255 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_RAW ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_RCCMON = 10 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_RCCMON ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_RDP = 27 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_RDP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_ROUTING = 43 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_ROUTING ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_RSVP = 46 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_RSVP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_RVD = 66 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_RVD ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_SATEXPAK = 64 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_SATEXPAK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_SATMON = 69 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_SATMON ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_SCCSP = 96 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_SCCSP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_SCTP = 132 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_SCTP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_SDRP = 42 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_SDRP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_SEND = 259 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_SEND ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_SEP = 33 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_SEP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_SKIP = 57 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_SKIP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_SPACER = 32767 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_SPACER ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_SRPC = 90 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_SRPC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_ST = 7 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_ST ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_SVMTP = 82 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_SVMTP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_SWIPE = 53 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_SWIPE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_TCF = 87 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_TCF ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_TLSP = 56 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_TLSP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_TP = 29 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_TP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_TPXX = 39 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_TPXX ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_TRUNK1 = 23 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_TRUNK1 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_TRUNK2 = 24 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_TRUNK2 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_TTP = 84 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_TTP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_VINES = 83 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_VINES ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_VISA = 70 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_VISA ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_VMTP = 81 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_VMTP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_WBEXPAK = 79 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_WBEXPAK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_WBMON = 78 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_WBMON ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_WSN = 74 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_WSN ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_XNET = 15 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_XNET ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_XTP = 36 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPPROTO_XTP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_AUTOFLOWLABEL = 59 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_AUTOFLOWLABEL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_BINDANY = 64 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_BINDANY ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_BINDV6ONLY = 27 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_BINDV6ONLY ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_CHECKSUM = 26 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_CHECKSUM ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_DEFAULT_MULTICAST_HOPS = 1 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_DEFAULT_MULTICAST_HOPS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_DEFAULT_MULTICAST_LOOP = 1 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_DEFAULT_MULTICAST_LOOP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_DEFHLIM = 64 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_DEFHLIM ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_DONTFRAG = 62 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_DONTFRAG ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_DSTOPTS = 50 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_DSTOPTS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_FAITH = 29 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_FAITH ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_FLOWINFO_MASK = 4294967055 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_FLOWINFO_MASK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_FLOWLABEL_MASK = 4294905600 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_FLOWLABEL_MASK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_FRAGTTL = 120 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_FRAGTTL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_FW_ADD = 30 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_FW_ADD ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_FW_DEL = 31 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_FW_DEL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_FW_FLUSH = 32 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_FW_FLUSH ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_FW_GET = 34 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_FW_GET ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_FW_ZERO = 33 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_FW_ZERO ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_HLIMDEC = 1 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_HLIMDEC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_HOPLIMIT = 47 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_HOPLIMIT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_HOPOPTS = 49 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_HOPOPTS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_IPSEC_POLICY = 28 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_IPSEC_POLICY ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_JOIN_GROUP = 12 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_LEAVE_GROUP = 13 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_MAXHLIM = 255 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_MAXHLIM ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_MAXOPTHDR = 2048 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_MAXOPTHDR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_MAXPACKET = 65535 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_MAXPACKET ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_MAX_GROUP_SRC_FILTER = 512 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_MAX_GROUP_SRC_FILTER ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_MAX_MEMBERSHIPS = 4095 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_MAX_MEMBERSHIPS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_MAX_SOCK_SRC_FILTER = 128 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_MAX_SOCK_SRC_FILTER ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_MIN_MEMBERSHIPS = 31 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_MIN_MEMBERSHIPS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_MMTU = 1280 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_MMTU ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_MSFILTER = 74 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_MSFILTER ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_MULTICAST_HOPS = 10 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_MULTICAST_IF = 9 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_MULTICAST_LOOP = 11 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_NEXTHOP = 48 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_NEXTHOP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_PATHMTU = 44 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_PATHMTU ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_PKTINFO = 46 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_PKTINFO ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_PORTRANGE = 14 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_PORTRANGE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_PORTRANGE_DEFAULT = 0 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_PORTRANGE_DEFAULT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_PORTRANGE_HIGH = 1 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_PORTRANGE_HIGH ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_PORTRANGE_LOW = 2 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_PORTRANGE_LOW ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_PREFER_TEMPADDR = 63 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_PREFER_TEMPADDR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_RECVDSTOPTS = 40 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_RECVDSTOPTS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_RECVHOPLIMIT = 37 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_RECVHOPLIMIT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_RECVHOPOPTS = 39 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_RECVHOPOPTS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_RECVPATHMTU = 43 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_RECVPATHMTU ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_RECVPKTINFO = 36 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_RECVPKTINFO ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_RECVRTHDR = 38 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_RECVRTHDR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_RECVTCLASS = 57 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_RECVTCLASS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_RTHDR = 51 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_RTHDR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_RTHDRDSTOPTS = 35 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_RTHDRDSTOPTS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_RTHDR_LOOSE = 0 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_RTHDR_LOOSE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_RTHDR_STRICT = 1 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_RTHDR_STRICT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_RTHDR_TYPE_0 = 0 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_RTHDR_TYPE_0 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_SOCKOPT_RESERVED1 = 3 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_SOCKOPT_RESERVED1 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_TCLASS = 61 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_TCLASS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_UNICAST_HOPS = 4 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_USE_MIN_MTU = 42 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_USE_MIN_MTU ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_V6ONLY = 27 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_VERSION = 96 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_VERSION ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_VERSION_MASK = 240 #53466
+pkg syscall (freebsd-riscv64-cgo), const IPV6_VERSION_MASK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_ADD_MEMBERSHIP = 12 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_ADD_SOURCE_MEMBERSHIP = 70 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_ADD_SOURCE_MEMBERSHIP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_BINDANY = 24 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_BINDANY ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_BLOCK_SOURCE = 72 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_BLOCK_SOURCE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_DEFAULT_MULTICAST_LOOP = 1 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_DEFAULT_MULTICAST_LOOP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_DEFAULT_MULTICAST_TTL = 1 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_DEFAULT_MULTICAST_TTL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_DF = 16384 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_DF ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_DONTFRAG = 67 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_DONTFRAG ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_DROP_MEMBERSHIP = 13 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_DROP_SOURCE_MEMBERSHIP = 71 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_DROP_SOURCE_MEMBERSHIP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_DUMMYNET3 = 49 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_DUMMYNET3 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_DUMMYNET_CONFIGURE = 60 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_DUMMYNET_CONFIGURE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_DUMMYNET_DEL = 61 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_DUMMYNET_DEL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_DUMMYNET_FLUSH = 62 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_DUMMYNET_FLUSH ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_DUMMYNET_GET = 64 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_DUMMYNET_GET ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_FAITH = 22 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_FAITH ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_FW3 = 48 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_FW3 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_FW_ADD = 50 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_FW_ADD ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_FW_DEL = 51 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_FW_DEL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_FW_FLUSH = 52 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_FW_FLUSH ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_FW_GET = 54 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_FW_GET ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_FW_NAT_CFG = 56 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_FW_NAT_CFG ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_FW_NAT_DEL = 57 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_FW_NAT_DEL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_FW_NAT_GET_CONFIG = 58 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_FW_NAT_GET_CONFIG ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_FW_NAT_GET_LOG = 59 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_FW_NAT_GET_LOG ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_FW_RESETLOG = 55 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_FW_RESETLOG ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_FW_TABLE_ADD = 40 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_FW_TABLE_ADD ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_FW_TABLE_DEL = 41 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_FW_TABLE_DEL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_FW_TABLE_FLUSH = 42 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_FW_TABLE_FLUSH ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_FW_TABLE_GETSIZE = 43 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_FW_TABLE_GETSIZE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_FW_TABLE_LIST = 44 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_FW_TABLE_LIST ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_FW_ZERO = 53 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_FW_ZERO ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_HDRINCL = 2 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_HDRINCL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_IPSEC_POLICY = 21 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_IPSEC_POLICY ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_MAXPACKET = 65535 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_MAXPACKET ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_MAX_GROUP_SRC_FILTER = 512 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_MAX_GROUP_SRC_FILTER ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_MAX_MEMBERSHIPS = 4095 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_MAX_MEMBERSHIPS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_MAX_SOCK_MUTE_FILTER = 128 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_MAX_SOCK_MUTE_FILTER ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_MAX_SOCK_SRC_FILTER = 128 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_MAX_SOCK_SRC_FILTER ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_MAX_SOURCE_FILTER = 1024 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_MAX_SOURCE_FILTER ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_MF = 8192 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_MF ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_MINTTL = 66 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_MINTTL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_MIN_MEMBERSHIPS = 31 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_MIN_MEMBERSHIPS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_MSFILTER = 74 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_MSFILTER ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_MSS = 576 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_MSS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_MULTICAST_IF = 9 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_MULTICAST_LOOP = 11 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_MULTICAST_TTL = 10 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_MULTICAST_VIF = 14 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_MULTICAST_VIF ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_OFFMASK = 8191 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_OFFMASK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_ONESBCAST = 23 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_ONESBCAST ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_OPTIONS = 1 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_OPTIONS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_PORTRANGE = 19 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_PORTRANGE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_PORTRANGE_DEFAULT = 0 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_PORTRANGE_DEFAULT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_PORTRANGE_HIGH = 1 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_PORTRANGE_HIGH ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_PORTRANGE_LOW = 2 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_PORTRANGE_LOW ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_RECVDSTADDR = 7 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_RECVDSTADDR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_RECVIF = 20 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_RECVIF ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_RECVOPTS = 5 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_RECVOPTS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_RECVRETOPTS = 6 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_RECVRETOPTS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_RECVTOS = 68 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_RECVTOS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_RECVTTL = 65 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_RECVTTL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_RETOPTS = 8 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_RETOPTS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_RF = 32768 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_RF ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_RSVP_OFF = 16 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_RSVP_OFF ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_RSVP_ON = 15 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_RSVP_ON ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_RSVP_VIF_OFF = 18 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_RSVP_VIF_OFF ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_RSVP_VIF_ON = 17 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_RSVP_VIF_ON ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_SENDSRCADDR = 7 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_SENDSRCADDR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_TOS = 3 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_TTL = 4 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_UNBLOCK_SOURCE = 73 #53466
+pkg syscall (freebsd-riscv64-cgo), const IP_UNBLOCK_SOURCE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const ISIG = 128 #53466
+pkg syscall (freebsd-riscv64-cgo), const ISIG ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const ISTRIP = 32 #53466
+pkg syscall (freebsd-riscv64-cgo), const ISTRIP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IXANY = 2048 #53466
+pkg syscall (freebsd-riscv64-cgo), const IXANY ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IXOFF = 1024 #53466
+pkg syscall (freebsd-riscv64-cgo), const IXOFF ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const IXON = 512 #53466
+pkg syscall (freebsd-riscv64-cgo), const IXON ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const LOCK_EX = 2 #53466
+pkg syscall (freebsd-riscv64-cgo), const LOCK_EX ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const LOCK_NB = 4 #53466
+pkg syscall (freebsd-riscv64-cgo), const LOCK_NB ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const LOCK_SH = 1 #53466
+pkg syscall (freebsd-riscv64-cgo), const LOCK_SH ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const LOCK_UN = 8 #53466
+pkg syscall (freebsd-riscv64-cgo), const LOCK_UN ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const MADV_AUTOSYNC = 7 #53466
+pkg syscall (freebsd-riscv64-cgo), const MADV_AUTOSYNC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const MADV_CORE = 9 #53466
+pkg syscall (freebsd-riscv64-cgo), const MADV_CORE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const MADV_DONTNEED = 4 #53466
+pkg syscall (freebsd-riscv64-cgo), const MADV_DONTNEED ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const MADV_FREE = 5 #53466
+pkg syscall (freebsd-riscv64-cgo), const MADV_FREE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const MADV_NOCORE = 8 #53466
+pkg syscall (freebsd-riscv64-cgo), const MADV_NOCORE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const MADV_NORMAL = 0 #53466
+pkg syscall (freebsd-riscv64-cgo), const MADV_NORMAL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const MADV_NOSYNC = 6 #53466
+pkg syscall (freebsd-riscv64-cgo), const MADV_NOSYNC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const MADV_PROTECT = 10 #53466
+pkg syscall (freebsd-riscv64-cgo), const MADV_PROTECT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const MADV_RANDOM = 1 #53466
+pkg syscall (freebsd-riscv64-cgo), const MADV_RANDOM ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const MADV_SEQUENTIAL = 2 #53466
+pkg syscall (freebsd-riscv64-cgo), const MADV_SEQUENTIAL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const MADV_WILLNEED = 3 #53466
+pkg syscall (freebsd-riscv64-cgo), const MADV_WILLNEED ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const MAP_32BIT = 524288 #53466
+pkg syscall (freebsd-riscv64-cgo), const MAP_32BIT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const MAP_ALIGNED_SUPER = 16777216 #53466
+pkg syscall (freebsd-riscv64-cgo), const MAP_ALIGNED_SUPER ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const MAP_ALIGNMENT_MASK = -16777216 #53466
+pkg syscall (freebsd-riscv64-cgo), const MAP_ALIGNMENT_MASK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const MAP_ALIGNMENT_SHIFT = 24 #53466
+pkg syscall (freebsd-riscv64-cgo), const MAP_ALIGNMENT_SHIFT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const MAP_ANON = 4096 #53466
+pkg syscall (freebsd-riscv64-cgo), const MAP_ANON ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const MAP_ANONYMOUS = 4096 #53466
+pkg syscall (freebsd-riscv64-cgo), const MAP_ANONYMOUS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const MAP_COPY = 2 #53466
+pkg syscall (freebsd-riscv64-cgo), const MAP_COPY ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const MAP_FILE = 0 #53466
+pkg syscall (freebsd-riscv64-cgo), const MAP_FILE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const MAP_FIXED = 16 #53466
+pkg syscall (freebsd-riscv64-cgo), const MAP_FIXED ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const MAP_HASSEMAPHORE = 512 #53466
+pkg syscall (freebsd-riscv64-cgo), const MAP_HASSEMAPHORE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const MAP_NOCORE = 131072 #53466
+pkg syscall (freebsd-riscv64-cgo), const MAP_NOCORE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const MAP_NORESERVE = 64 #53466
+pkg syscall (freebsd-riscv64-cgo), const MAP_NORESERVE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const MAP_NOSYNC = 2048 #53466
+pkg syscall (freebsd-riscv64-cgo), const MAP_NOSYNC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const MAP_PREFAULT_READ = 262144 #53466
+pkg syscall (freebsd-riscv64-cgo), const MAP_PREFAULT_READ ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const MAP_PRIVATE = 2 #53466
+pkg syscall (freebsd-riscv64-cgo), const MAP_PRIVATE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const MAP_RENAME = 32 #53466
+pkg syscall (freebsd-riscv64-cgo), const MAP_RENAME ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const MAP_RESERVED0080 = 128 #53466
+pkg syscall (freebsd-riscv64-cgo), const MAP_RESERVED0080 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const MAP_RESERVED0100 = 256 #53466
+pkg syscall (freebsd-riscv64-cgo), const MAP_RESERVED0100 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const MAP_SHARED = 1 #53466
+pkg syscall (freebsd-riscv64-cgo), const MAP_SHARED ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const MAP_STACK = 1024 #53466
+pkg syscall (freebsd-riscv64-cgo), const MAP_STACK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const MCL_CURRENT = 1 #53466
+pkg syscall (freebsd-riscv64-cgo), const MCL_CURRENT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const MCL_FUTURE = 2 #53466
+pkg syscall (freebsd-riscv64-cgo), const MCL_FUTURE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const MSG_CMSG_CLOEXEC = 262144 #53466
+pkg syscall (freebsd-riscv64-cgo), const MSG_CMSG_CLOEXEC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const MSG_COMPAT = 32768 #53466
+pkg syscall (freebsd-riscv64-cgo), const MSG_COMPAT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const MSG_CTRUNC = 32 #53466
+pkg syscall (freebsd-riscv64-cgo), const MSG_CTRUNC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const MSG_DONTROUTE = 4 #53466
+pkg syscall (freebsd-riscv64-cgo), const MSG_DONTROUTE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const MSG_DONTWAIT = 128 #53466
+pkg syscall (freebsd-riscv64-cgo), const MSG_DONTWAIT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const MSG_EOF = 256 #53466
+pkg syscall (freebsd-riscv64-cgo), const MSG_EOF ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const MSG_EOR = 8 #53466
+pkg syscall (freebsd-riscv64-cgo), const MSG_EOR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const MSG_NBIO = 16384 #53466
+pkg syscall (freebsd-riscv64-cgo), const MSG_NBIO ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const MSG_NOSIGNAL = 131072 #53466
+pkg syscall (freebsd-riscv64-cgo), const MSG_NOSIGNAL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const MSG_NOTIFICATION = 8192 #53466
+pkg syscall (freebsd-riscv64-cgo), const MSG_NOTIFICATION ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const MSG_OOB = 1 #53466
+pkg syscall (freebsd-riscv64-cgo), const MSG_OOB ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const MSG_PEEK = 2 #53466
+pkg syscall (freebsd-riscv64-cgo), const MSG_PEEK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const MSG_TRUNC = 16 #53466
+pkg syscall (freebsd-riscv64-cgo), const MSG_TRUNC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const MSG_WAITALL = 64 #53466
+pkg syscall (freebsd-riscv64-cgo), const MSG_WAITALL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const MS_ASYNC = 1 #53466
+pkg syscall (freebsd-riscv64-cgo), const MS_ASYNC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const MS_INVALIDATE = 2 #53466
+pkg syscall (freebsd-riscv64-cgo), const MS_INVALIDATE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const MS_SYNC = 0 #53466
+pkg syscall (freebsd-riscv64-cgo), const MS_SYNC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const NAME_MAX = 255 #53466
+pkg syscall (freebsd-riscv64-cgo), const NAME_MAX ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const NET_RT_DUMP = 1 #53466
+pkg syscall (freebsd-riscv64-cgo), const NET_RT_DUMP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const NET_RT_FLAGS = 2 #53466
+pkg syscall (freebsd-riscv64-cgo), const NET_RT_FLAGS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const NET_RT_IFLIST = 3 #53466
+pkg syscall (freebsd-riscv64-cgo), const NET_RT_IFLIST ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const NET_RT_IFLISTL = 5 #53466
+pkg syscall (freebsd-riscv64-cgo), const NET_RT_IFLISTL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const NET_RT_IFMALIST = 4 #53466
+pkg syscall (freebsd-riscv64-cgo), const NET_RT_IFMALIST ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const NET_RT_MAXID = 6 #53466
+pkg syscall (freebsd-riscv64-cgo), const NET_RT_MAXID ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const NOFLSH = 2147483648 #53466
+pkg syscall (freebsd-riscv64-cgo), const NOFLSH ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const NOTE_ATTRIB = 8 #53466
+pkg syscall (freebsd-riscv64-cgo), const NOTE_ATTRIB ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const NOTE_CHILD = 4 #53466
+pkg syscall (freebsd-riscv64-cgo), const NOTE_CHILD ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const NOTE_DELETE = 1 #53466
+pkg syscall (freebsd-riscv64-cgo), const NOTE_DELETE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const NOTE_EXEC = 536870912 #53466
+pkg syscall (freebsd-riscv64-cgo), const NOTE_EXEC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const NOTE_EXIT = 2147483648 #53466
+pkg syscall (freebsd-riscv64-cgo), const NOTE_EXIT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const NOTE_EXTEND = 4 #53466
+pkg syscall (freebsd-riscv64-cgo), const NOTE_EXTEND ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const NOTE_FFAND = 1073741824 #53466
+pkg syscall (freebsd-riscv64-cgo), const NOTE_FFAND ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const NOTE_FFCOPY = 3221225472 #53466
+pkg syscall (freebsd-riscv64-cgo), const NOTE_FFCOPY ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const NOTE_FFCTRLMASK = 3221225472 #53466
+pkg syscall (freebsd-riscv64-cgo), const NOTE_FFCTRLMASK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const NOTE_FFLAGSMASK = 16777215 #53466
+pkg syscall (freebsd-riscv64-cgo), const NOTE_FFLAGSMASK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const NOTE_FFNOP = 0 #53466
+pkg syscall (freebsd-riscv64-cgo), const NOTE_FFNOP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const NOTE_FFOR = 2147483648 #53466
+pkg syscall (freebsd-riscv64-cgo), const NOTE_FFOR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const NOTE_FORK = 1073741824 #53466
+pkg syscall (freebsd-riscv64-cgo), const NOTE_FORK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const NOTE_LINK = 16 #53466
+pkg syscall (freebsd-riscv64-cgo), const NOTE_LINK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const NOTE_LOWAT = 1 #53466
+pkg syscall (freebsd-riscv64-cgo), const NOTE_LOWAT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const NOTE_PCTRLMASK = 4026531840 #53466
+pkg syscall (freebsd-riscv64-cgo), const NOTE_PCTRLMASK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const NOTE_PDATAMASK = 1048575 #53466
+pkg syscall (freebsd-riscv64-cgo), const NOTE_PDATAMASK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const NOTE_RENAME = 32 #53466
+pkg syscall (freebsd-riscv64-cgo), const NOTE_RENAME ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const NOTE_REVOKE = 64 #53466
+pkg syscall (freebsd-riscv64-cgo), const NOTE_REVOKE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const NOTE_TRACK = 1 #53466
+pkg syscall (freebsd-riscv64-cgo), const NOTE_TRACK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const NOTE_TRACKERR = 2 #53466
+pkg syscall (freebsd-riscv64-cgo), const NOTE_TRACKERR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const NOTE_TRIGGER = 16777216 #53466
+pkg syscall (freebsd-riscv64-cgo), const NOTE_TRIGGER ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const NOTE_WRITE = 2 #53466
+pkg syscall (freebsd-riscv64-cgo), const NOTE_WRITE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const OCRNL = 16 #53466
+pkg syscall (freebsd-riscv64-cgo), const OCRNL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const ONLCR = 2 #53466
+pkg syscall (freebsd-riscv64-cgo), const ONLCR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const ONLRET = 64 #53466
+pkg syscall (freebsd-riscv64-cgo), const ONLRET ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const ONOCR = 32 #53466
+pkg syscall (freebsd-riscv64-cgo), const ONOCR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const ONOEOT = 8 #53466
+pkg syscall (freebsd-riscv64-cgo), const ONOEOT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const OPOST = 1 #53466
+pkg syscall (freebsd-riscv64-cgo), const OPOST ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const O_ACCMODE = 3 #53466
+pkg syscall (freebsd-riscv64-cgo), const O_ACCMODE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const O_APPEND = 8 #53466
+pkg syscall (freebsd-riscv64-cgo), const O_ASYNC = 64 #53466
+pkg syscall (freebsd-riscv64-cgo), const O_CLOEXEC = 1048576 #53466
+pkg syscall (freebsd-riscv64-cgo), const O_CREAT = 512 #53466
+pkg syscall (freebsd-riscv64-cgo), const O_DIRECT = 65536 #53466
+pkg syscall (freebsd-riscv64-cgo), const O_DIRECT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const O_DIRECTORY = 131072 #53466
+pkg syscall (freebsd-riscv64-cgo), const O_DIRECTORY ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const O_EXCL = 2048 #53466
+pkg syscall (freebsd-riscv64-cgo), const O_EXEC = 262144 #53466
+pkg syscall (freebsd-riscv64-cgo), const O_EXEC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const O_EXLOCK = 32 #53466
+pkg syscall (freebsd-riscv64-cgo), const O_EXLOCK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const O_FSYNC = 128 #53466
+pkg syscall (freebsd-riscv64-cgo), const O_FSYNC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const O_NDELAY = 4 #53466
+pkg syscall (freebsd-riscv64-cgo), const O_NDELAY ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const O_NOCTTY = 32768 #53466
+pkg syscall (freebsd-riscv64-cgo), const O_NOFOLLOW = 256 #53466
+pkg syscall (freebsd-riscv64-cgo), const O_NOFOLLOW ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const O_NONBLOCK = 4 #53466
+pkg syscall (freebsd-riscv64-cgo), const O_SHLOCK = 16 #53466
+pkg syscall (freebsd-riscv64-cgo), const O_SHLOCK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const O_SYNC = 128 #53466
+pkg syscall (freebsd-riscv64-cgo), const O_TRUNC = 1024 #53466
+pkg syscall (freebsd-riscv64-cgo), const O_TTY_INIT = 524288 #53466
+pkg syscall (freebsd-riscv64-cgo), const O_TTY_INIT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const PARENB = 4096 #53466
+pkg syscall (freebsd-riscv64-cgo), const PARENB ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const PARMRK = 8 #53466
+pkg syscall (freebsd-riscv64-cgo), const PARMRK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const PARODD = 8192 #53466
+pkg syscall (freebsd-riscv64-cgo), const PARODD ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const PENDIN = 536870912 #53466
+pkg syscall (freebsd-riscv64-cgo), const PENDIN ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const PRIO_PGRP = 1 #53466
+pkg syscall (freebsd-riscv64-cgo), const PRIO_PGRP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const PRIO_PROCESS = 0 #53466
+pkg syscall (freebsd-riscv64-cgo), const PRIO_PROCESS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const PRIO_USER = 2 #53466
+pkg syscall (freebsd-riscv64-cgo), const PRIO_USER ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const PROT_EXEC = 4 #53466
+pkg syscall (freebsd-riscv64-cgo), const PROT_EXEC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const PROT_NONE = 0 #53466
+pkg syscall (freebsd-riscv64-cgo), const PROT_NONE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const PROT_READ = 1 #53466
+pkg syscall (freebsd-riscv64-cgo), const PROT_READ ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const PROT_WRITE = 2 #53466
+pkg syscall (freebsd-riscv64-cgo), const PROT_WRITE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const PTRACE_CONT = 7 #53466
+pkg syscall (freebsd-riscv64-cgo), const PTRACE_CONT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const PTRACE_KILL = 8 #53466
+pkg syscall (freebsd-riscv64-cgo), const PTRACE_KILL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const PTRACE_TRACEME = 0 #53466
+pkg syscall (freebsd-riscv64-cgo), const PTRACE_TRACEME ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RLIMIT_AS = 10 #53466
+pkg syscall (freebsd-riscv64-cgo), const RLIMIT_AS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RLIMIT_CORE = 4 #53466
+pkg syscall (freebsd-riscv64-cgo), const RLIMIT_CORE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RLIMIT_CPU = 0 #53466
+pkg syscall (freebsd-riscv64-cgo), const RLIMIT_CPU ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RLIMIT_DATA = 2 #53466
+pkg syscall (freebsd-riscv64-cgo), const RLIMIT_DATA ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RLIMIT_FSIZE = 1 #53466
+pkg syscall (freebsd-riscv64-cgo), const RLIMIT_FSIZE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RLIMIT_NOFILE = 8 #53466
+pkg syscall (freebsd-riscv64-cgo), const RLIMIT_NOFILE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RLIMIT_STACK = 3 #53466
+pkg syscall (freebsd-riscv64-cgo), const RLIMIT_STACK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RLIM_INFINITY = 9223372036854775807 #53466
+pkg syscall (freebsd-riscv64-cgo), const RLIM_INFINITY ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RTAX_AUTHOR = 6 #53466
+pkg syscall (freebsd-riscv64-cgo), const RTAX_AUTHOR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RTAX_BRD = 7 #53466
+pkg syscall (freebsd-riscv64-cgo), const RTAX_BRD ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RTAX_DST = 0 #53466
+pkg syscall (freebsd-riscv64-cgo), const RTAX_DST ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RTAX_GATEWAY = 1 #53466
+pkg syscall (freebsd-riscv64-cgo), const RTAX_GATEWAY ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RTAX_GENMASK = 3 #53466
+pkg syscall (freebsd-riscv64-cgo), const RTAX_GENMASK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RTAX_IFA = 5 #53466
+pkg syscall (freebsd-riscv64-cgo), const RTAX_IFA ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RTAX_IFP = 4 #53466
+pkg syscall (freebsd-riscv64-cgo), const RTAX_IFP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RTAX_MAX = 8 #53466
+pkg syscall (freebsd-riscv64-cgo), const RTAX_MAX ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RTAX_NETMASK = 2 #53466
+pkg syscall (freebsd-riscv64-cgo), const RTAX_NETMASK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RTA_AUTHOR = 64 #53466
+pkg syscall (freebsd-riscv64-cgo), const RTA_AUTHOR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RTA_BRD = 128 #53466
+pkg syscall (freebsd-riscv64-cgo), const RTA_BRD ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RTA_DST = 1 #53466
+pkg syscall (freebsd-riscv64-cgo), const RTA_DST ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RTA_GATEWAY = 2 #53466
+pkg syscall (freebsd-riscv64-cgo), const RTA_GATEWAY ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RTA_GENMASK = 8 #53466
+pkg syscall (freebsd-riscv64-cgo), const RTA_GENMASK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RTA_IFA = 32 #53466
+pkg syscall (freebsd-riscv64-cgo), const RTA_IFA ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RTA_IFP = 16 #53466
+pkg syscall (freebsd-riscv64-cgo), const RTA_IFP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RTA_NETMASK = 4 #53466
+pkg syscall (freebsd-riscv64-cgo), const RTA_NETMASK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RTF_BLACKHOLE = 4096 #53466
+pkg syscall (freebsd-riscv64-cgo), const RTF_BLACKHOLE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RTF_BROADCAST = 4194304 #53466
+pkg syscall (freebsd-riscv64-cgo), const RTF_BROADCAST ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RTF_DONE = 64 #53466
+pkg syscall (freebsd-riscv64-cgo), const RTF_DONE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RTF_DYNAMIC = 16 #53466
+pkg syscall (freebsd-riscv64-cgo), const RTF_DYNAMIC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RTF_FMASK = 268752904 #53466
+pkg syscall (freebsd-riscv64-cgo), const RTF_FMASK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RTF_GATEWAY = 2 #53466
+pkg syscall (freebsd-riscv64-cgo), const RTF_GATEWAY ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RTF_GWFLAG_COMPAT = 2147483648 #53466
+pkg syscall (freebsd-riscv64-cgo), const RTF_GWFLAG_COMPAT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RTF_HOST = 4 #53466
+pkg syscall (freebsd-riscv64-cgo), const RTF_HOST ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RTF_LLDATA = 1024 #53466
+pkg syscall (freebsd-riscv64-cgo), const RTF_LLDATA ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RTF_LLINFO = 1024 #53466
+pkg syscall (freebsd-riscv64-cgo), const RTF_LLINFO ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RTF_LOCAL = 2097152 #53466
+pkg syscall (freebsd-riscv64-cgo), const RTF_LOCAL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RTF_MODIFIED = 32 #53466
+pkg syscall (freebsd-riscv64-cgo), const RTF_MODIFIED ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RTF_MULTICAST = 8388608 #53466
+pkg syscall (freebsd-riscv64-cgo), const RTF_MULTICAST ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RTF_PINNED = 1048576 #53466
+pkg syscall (freebsd-riscv64-cgo), const RTF_PINNED ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RTF_PRCLONING = 65536 #53466
+pkg syscall (freebsd-riscv64-cgo), const RTF_PRCLONING ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RTF_PROTO1 = 32768 #53466
+pkg syscall (freebsd-riscv64-cgo), const RTF_PROTO1 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RTF_PROTO2 = 16384 #53466
+pkg syscall (freebsd-riscv64-cgo), const RTF_PROTO2 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RTF_PROTO3 = 262144 #53466
+pkg syscall (freebsd-riscv64-cgo), const RTF_PROTO3 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RTF_REJECT = 8 #53466
+pkg syscall (freebsd-riscv64-cgo), const RTF_REJECT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RTF_RNH_LOCKED = 1073741824 #53466
+pkg syscall (freebsd-riscv64-cgo), const RTF_RNH_LOCKED ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RTF_STATIC = 2048 #53466
+pkg syscall (freebsd-riscv64-cgo), const RTF_STATIC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RTF_STICKY = 268435456 #53466
+pkg syscall (freebsd-riscv64-cgo), const RTF_STICKY ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RTF_UP = 1 #53466
+pkg syscall (freebsd-riscv64-cgo), const RTF_UP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RTF_XRESOLVE = 512 #53466
+pkg syscall (freebsd-riscv64-cgo), const RTF_XRESOLVE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RTM_ADD = 1 #53466
+pkg syscall (freebsd-riscv64-cgo), const RTM_ADD ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RTM_CHANGE = 3 #53466
+pkg syscall (freebsd-riscv64-cgo), const RTM_CHANGE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RTM_DELADDR = 13 #53466
+pkg syscall (freebsd-riscv64-cgo), const RTM_DELADDR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RTM_DELETE = 2 #53466
+pkg syscall (freebsd-riscv64-cgo), const RTM_DELETE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RTM_DELMADDR = 16 #53466
+pkg syscall (freebsd-riscv64-cgo), const RTM_DELMADDR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RTM_GET = 4 #53466
+pkg syscall (freebsd-riscv64-cgo), const RTM_GET ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RTM_IEEE80211 = 18 #53466
+pkg syscall (freebsd-riscv64-cgo), const RTM_IEEE80211 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RTM_IFANNOUNCE = 17 #53466
+pkg syscall (freebsd-riscv64-cgo), const RTM_IFANNOUNCE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RTM_IFINFO = 14 #53466
+pkg syscall (freebsd-riscv64-cgo), const RTM_IFINFO ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RTM_LOCK = 8 #53466
+pkg syscall (freebsd-riscv64-cgo), const RTM_LOCK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RTM_LOSING = 5 #53466
+pkg syscall (freebsd-riscv64-cgo), const RTM_LOSING ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RTM_MISS = 7 #53466
+pkg syscall (freebsd-riscv64-cgo), const RTM_MISS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RTM_NEWADDR = 12 #53466
+pkg syscall (freebsd-riscv64-cgo), const RTM_NEWADDR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RTM_NEWMADDR = 15 #53466
+pkg syscall (freebsd-riscv64-cgo), const RTM_NEWMADDR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RTM_OLDADD = 9 #53466
+pkg syscall (freebsd-riscv64-cgo), const RTM_OLDADD ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RTM_OLDDEL = 10 #53466
+pkg syscall (freebsd-riscv64-cgo), const RTM_OLDDEL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RTM_REDIRECT = 6 #53466
+pkg syscall (freebsd-riscv64-cgo), const RTM_REDIRECT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RTM_RESOLVE = 11 #53466
+pkg syscall (freebsd-riscv64-cgo), const RTM_RESOLVE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RTM_RTTUNIT = 1000000 #53466
+pkg syscall (freebsd-riscv64-cgo), const RTM_RTTUNIT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RTM_VERSION = 5 #53466
+pkg syscall (freebsd-riscv64-cgo), const RTM_VERSION ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RTV_EXPIRE = 4 #53466
+pkg syscall (freebsd-riscv64-cgo), const RTV_EXPIRE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RTV_HOPCOUNT = 2 #53466
+pkg syscall (freebsd-riscv64-cgo), const RTV_HOPCOUNT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RTV_MTU = 1 #53466
+pkg syscall (freebsd-riscv64-cgo), const RTV_MTU ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RTV_RPIPE = 8 #53466
+pkg syscall (freebsd-riscv64-cgo), const RTV_RPIPE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RTV_RTT = 64 #53466
+pkg syscall (freebsd-riscv64-cgo), const RTV_RTT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RTV_RTTVAR = 128 #53466
+pkg syscall (freebsd-riscv64-cgo), const RTV_RTTVAR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RTV_SPIPE = 16 #53466
+pkg syscall (freebsd-riscv64-cgo), const RTV_SPIPE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RTV_SSTHRESH = 32 #53466
+pkg syscall (freebsd-riscv64-cgo), const RTV_SSTHRESH ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RTV_WEIGHT = 256 #53466
+pkg syscall (freebsd-riscv64-cgo), const RTV_WEIGHT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RT_CACHING_CONTEXT = 1 #53466
+pkg syscall (freebsd-riscv64-cgo), const RT_CACHING_CONTEXT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RT_DEFAULT_FIB = 0 #53466
+pkg syscall (freebsd-riscv64-cgo), const RT_DEFAULT_FIB ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RT_NORTREF = 2 #53466
+pkg syscall (freebsd-riscv64-cgo), const RT_NORTREF ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RUSAGE_CHILDREN = -1 #53466
+pkg syscall (freebsd-riscv64-cgo), const RUSAGE_CHILDREN ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RUSAGE_SELF = 0 #53466
+pkg syscall (freebsd-riscv64-cgo), const RUSAGE_SELF ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const RUSAGE_THREAD = 1 #53466
+pkg syscall (freebsd-riscv64-cgo), const RUSAGE_THREAD ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SCM_BINTIME = 4 #53466
+pkg syscall (freebsd-riscv64-cgo), const SCM_BINTIME ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SCM_CREDS = 3 #53466
+pkg syscall (freebsd-riscv64-cgo), const SCM_CREDS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SCM_RIGHTS = 1 #53466
+pkg syscall (freebsd-riscv64-cgo), const SCM_RIGHTS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SCM_TIMESTAMP = 2 #53466
+pkg syscall (freebsd-riscv64-cgo), const SCM_TIMESTAMP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIGBUS = 10 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIGCHLD = 20 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIGCHLD Signal #53466
+pkg syscall (freebsd-riscv64-cgo), const SIGCONT = 19 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIGCONT Signal #53466
+pkg syscall (freebsd-riscv64-cgo), const SIGEMT = 7 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIGEMT Signal #53466
+pkg syscall (freebsd-riscv64-cgo), const SIGINFO = 29 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIGINFO Signal #53466
+pkg syscall (freebsd-riscv64-cgo), const SIGIO = 23 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIGIO Signal #53466
+pkg syscall (freebsd-riscv64-cgo), const SIGIOT = 6 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIGIOT Signal #53466
+pkg syscall (freebsd-riscv64-cgo), const SIGLIBRT = 33 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIGLIBRT Signal #53466
+pkg syscall (freebsd-riscv64-cgo), const SIGLWP = 32 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIGLWP Signal #53466
+pkg syscall (freebsd-riscv64-cgo), const SIGPROF = 27 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIGPROF Signal #53466
+pkg syscall (freebsd-riscv64-cgo), const SIGSTOP = 17 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIGSTOP Signal #53466
+pkg syscall (freebsd-riscv64-cgo), const SIGSYS = 12 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIGSYS Signal #53466
+pkg syscall (freebsd-riscv64-cgo), const SIGTHR = 32 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIGTHR Signal #53466
+pkg syscall (freebsd-riscv64-cgo), const SIGTSTP = 18 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIGTSTP Signal #53466
+pkg syscall (freebsd-riscv64-cgo), const SIGTTIN = 21 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIGTTIN Signal #53466
+pkg syscall (freebsd-riscv64-cgo), const SIGTTOU = 22 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIGTTOU Signal #53466
+pkg syscall (freebsd-riscv64-cgo), const SIGURG = 16 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIGURG Signal #53466
+pkg syscall (freebsd-riscv64-cgo), const SIGUSR1 = 30 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIGUSR1 Signal #53466
+pkg syscall (freebsd-riscv64-cgo), const SIGUSR2 = 31 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIGUSR2 Signal #53466
+pkg syscall (freebsd-riscv64-cgo), const SIGVTALRM = 26 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIGVTALRM Signal #53466
+pkg syscall (freebsd-riscv64-cgo), const SIGWINCH = 28 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIGWINCH Signal #53466
+pkg syscall (freebsd-riscv64-cgo), const SIGXCPU = 24 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIGXCPU Signal #53466
+pkg syscall (freebsd-riscv64-cgo), const SIGXFSZ = 25 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIGXFSZ Signal #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCADDMULTI = 2149607729 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCADDMULTI ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCADDRT = 2151707146 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCADDRT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCAIFADDR = 2151704858 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCAIFADDR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCAIFGROUP = 2150132103 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCAIFGROUP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCALIFADDR = 2165860635 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCALIFADDR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCATMARK = 1074033415 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCATMARK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCDELMULTI = 2149607730 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCDELMULTI ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCDELRT = 2151707147 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCDELRT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCDIFADDR = 2149607705 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCDIFADDR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCDIFGROUP = 2150132105 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCDIFGROUP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCDIFPHYADDR = 2149607753 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCDIFPHYADDR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCDLIFADDR = 2165860637 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCDLIFADDR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCGDRVSPEC = 3223873915 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCGDRVSPEC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCGETSGCNT = 3223351824 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCGETSGCNT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCGETVIFCNT = 3223876111 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCGETVIFCNT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCGHIWAT = 1074033409 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCGHIWAT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCGIFADDR = 3223349537 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCGIFADDR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCGIFBRDADDR = 3223349539 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCGIFBRDADDR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCGIFCAP = 3223349535 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCGIFCAP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCGIFCONF = 3222300964 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCGIFCONF ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCGIFDESCR = 3223349546 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCGIFDESCR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCGIFDSTADDR = 3223349538 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCGIFDSTADDR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCGIFFIB = 3223349596 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCGIFFIB ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCGIFFLAGS = 3223349521 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCGIFFLAGS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCGIFGENERIC = 3223349562 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCGIFGENERIC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCGIFGMEMB = 3223873930 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCGIFGMEMB ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCGIFGROUP = 3223873928 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCGIFGROUP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCGIFINDEX = 3223349536 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCGIFINDEX ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCGIFMAC = 3223349542 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCGIFMAC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCGIFMEDIA = 3224398136 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCGIFMEDIA ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCGIFMETRIC = 3223349527 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCGIFMETRIC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCGIFMTU = 3223349555 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCGIFMTU ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCGIFNETMASK = 3223349541 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCGIFNETMASK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCGIFPDSTADDR = 3223349576 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCGIFPDSTADDR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCGIFPHYS = 3223349557 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCGIFPHYS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCGIFPSRCADDR = 3223349575 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCGIFPSRCADDR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCGIFSTATUS = 3274795323 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCGIFSTATUS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCGLIFADDR = 3239602460 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCGLIFADDR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCGLIFPHYADDR = 3239602507 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCGLIFPHYADDR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCGLOWAT = 1074033411 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCGLOWAT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCGPGRP = 1074033417 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCGPGRP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCGPRIVATE_0 = 3223349584 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCGPRIVATE_0 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCGPRIVATE_1 = 3223349585 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCGPRIVATE_1 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCIFCREATE = 3223349626 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCIFCREATE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCIFCREATE2 = 3223349628 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCIFCREATE2 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCIFDESTROY = 2149607801 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCIFDESTROY ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCIFGCLONERS = 3222301048 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCIFGCLONERS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCSDRVSPEC = 2150132091 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCSDRVSPEC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCSHIWAT = 2147775232 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCSHIWAT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCSIFADDR = 2149607692 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCSIFADDR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCSIFBRDADDR = 2149607699 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCSIFBRDADDR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCSIFCAP = 2149607710 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCSIFCAP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCSIFDESCR = 2149607721 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCSIFDESCR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCSIFDSTADDR = 2149607694 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCSIFDSTADDR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCSIFFIB = 2149607773 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCSIFFIB ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCSIFFLAGS = 2149607696 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCSIFFLAGS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCSIFGENERIC = 2149607737 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCSIFGENERIC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCSIFLLADDR = 2149607740 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCSIFLLADDR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCSIFMAC = 2149607719 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCSIFMAC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCSIFMEDIA = 3223349559 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCSIFMEDIA ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCSIFMETRIC = 2149607704 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCSIFMETRIC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCSIFMTU = 2149607732 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCSIFMTU ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCSIFNAME = 2149607720 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCSIFNAME ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCSIFNETMASK = 2149607702 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCSIFNETMASK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCSIFPHYADDR = 2151704902 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCSIFPHYADDR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCSIFPHYS = 2149607734 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCSIFPHYS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCSIFRVNET = 3223349595 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCSIFRVNET ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCSIFVNET = 3223349594 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCSIFVNET ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCSLIFPHYADDR = 2165860682 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCSLIFPHYADDR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCSLOWAT = 2147775234 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCSLOWAT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCSPGRP = 2147775240 #53466
+pkg syscall (freebsd-riscv64-cgo), const SIOCSPGRP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SOCK_CLOEXEC = 268435456 #53466
+pkg syscall (freebsd-riscv64-cgo), const SOCK_CLOEXEC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SOCK_MAXADDRLEN = 255 #53466
+pkg syscall (freebsd-riscv64-cgo), const SOCK_MAXADDRLEN ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SOCK_NONBLOCK = 536870912 #53466
+pkg syscall (freebsd-riscv64-cgo), const SOCK_NONBLOCK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SOCK_RDM = 4 #53466
+pkg syscall (freebsd-riscv64-cgo), const SOCK_RDM ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SOL_SOCKET = 65535 #53466
+pkg syscall (freebsd-riscv64-cgo), const SOMAXCONN = 128 #53466
+pkg syscall (freebsd-riscv64-cgo), const SO_ACCEPTCONN = 2 #53466
+pkg syscall (freebsd-riscv64-cgo), const SO_ACCEPTCONN ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SO_ACCEPTFILTER = 4096 #53466
+pkg syscall (freebsd-riscv64-cgo), const SO_ACCEPTFILTER ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SO_BINTIME = 8192 #53466
+pkg syscall (freebsd-riscv64-cgo), const SO_BINTIME ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SO_BROADCAST = 32 #53466
+pkg syscall (freebsd-riscv64-cgo), const SO_DEBUG = 1 #53466
+pkg syscall (freebsd-riscv64-cgo), const SO_DEBUG ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SO_DONTROUTE = 16 #53466
+pkg syscall (freebsd-riscv64-cgo), const SO_ERROR = 4103 #53466
+pkg syscall (freebsd-riscv64-cgo), const SO_ERROR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SO_KEEPALIVE = 8 #53466
+pkg syscall (freebsd-riscv64-cgo), const SO_LABEL = 4105 #53466
+pkg syscall (freebsd-riscv64-cgo), const SO_LABEL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SO_LINGER = 128 #53466
+pkg syscall (freebsd-riscv64-cgo), const SO_LISTENINCQLEN = 4115 #53466
+pkg syscall (freebsd-riscv64-cgo), const SO_LISTENINCQLEN ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SO_LISTENQLEN = 4114 #53466
+pkg syscall (freebsd-riscv64-cgo), const SO_LISTENQLEN ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SO_LISTENQLIMIT = 4113 #53466
+pkg syscall (freebsd-riscv64-cgo), const SO_LISTENQLIMIT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SO_NOSIGPIPE = 2048 #53466
+pkg syscall (freebsd-riscv64-cgo), const SO_NOSIGPIPE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SO_NO_DDP = 32768 #53466
+pkg syscall (freebsd-riscv64-cgo), const SO_NO_DDP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SO_NO_OFFLOAD = 16384 #53466
+pkg syscall (freebsd-riscv64-cgo), const SO_NO_OFFLOAD ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SO_OOBINLINE = 256 #53466
+pkg syscall (freebsd-riscv64-cgo), const SO_OOBINLINE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SO_PEERLABEL = 4112 #53466
+pkg syscall (freebsd-riscv64-cgo), const SO_PEERLABEL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SO_PROTOCOL = 4118 #53466
+pkg syscall (freebsd-riscv64-cgo), const SO_PROTOCOL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SO_PROTOTYPE = 4118 #53466
+pkg syscall (freebsd-riscv64-cgo), const SO_PROTOTYPE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SO_RCVBUF = 4098 #53466
+pkg syscall (freebsd-riscv64-cgo), const SO_RCVLOWAT = 4100 #53466
+pkg syscall (freebsd-riscv64-cgo), const SO_RCVLOWAT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SO_RCVTIMEO = 4102 #53466
+pkg syscall (freebsd-riscv64-cgo), const SO_RCVTIMEO ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SO_REUSEADDR = 4 #53466
+pkg syscall (freebsd-riscv64-cgo), const SO_REUSEPORT = 512 #53466
+pkg syscall (freebsd-riscv64-cgo), const SO_REUSEPORT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SO_SETFIB = 4116 #53466
+pkg syscall (freebsd-riscv64-cgo), const SO_SETFIB ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SO_SNDBUF = 4097 #53466
+pkg syscall (freebsd-riscv64-cgo), const SO_SNDLOWAT = 4099 #53466
+pkg syscall (freebsd-riscv64-cgo), const SO_SNDLOWAT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SO_SNDTIMEO = 4101 #53466
+pkg syscall (freebsd-riscv64-cgo), const SO_SNDTIMEO ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SO_TIMESTAMP = 1024 #53466
+pkg syscall (freebsd-riscv64-cgo), const SO_TIMESTAMP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SO_TYPE = 4104 #53466
+pkg syscall (freebsd-riscv64-cgo), const SO_TYPE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SO_USELOOPBACK = 64 #53466
+pkg syscall (freebsd-riscv64-cgo), const SO_USELOOPBACK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SO_USER_COOKIE = 4117 #53466
+pkg syscall (freebsd-riscv64-cgo), const SO_USER_COOKIE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SO_VENDOR = 2147483648 #53466
+pkg syscall (freebsd-riscv64-cgo), const SO_VENDOR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_ABORT2 = 463 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_ABORT2 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_ACCEPT = 30 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_ACCEPT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_ACCEPT4 = 541 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_ACCEPT4 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_ACCESS = 33 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_ACCESS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_ACCT = 51 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_ACCT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_ADJTIME = 140 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_ADJTIME ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_AIO_CANCEL = 316 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_AIO_CANCEL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_AIO_ERROR = 317 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_AIO_ERROR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_AIO_FSYNC = 465 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_AIO_FSYNC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_AIO_MLOCK = 543 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_AIO_MLOCK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_AIO_READ = 255 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_AIO_READ ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_AIO_RETURN = 314 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_AIO_RETURN ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_AIO_SUSPEND = 315 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_AIO_SUSPEND ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_AIO_WAITCOMPLETE = 359 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_AIO_WAITCOMPLETE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_AIO_WRITE = 256 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_AIO_WRITE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_AUDIT = 445 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_AUDIT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_AUDITCTL = 453 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_AUDITCTL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_AUDITON = 446 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_AUDITON ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_BIND = 104 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_BIND ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_BINDAT = 538 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_BINDAT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_CAP_ENTER = 516 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_CAP_ENTER ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_CAP_FCNTLS_GET = 537 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_CAP_FCNTLS_GET ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_CAP_FCNTLS_LIMIT = 536 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_CAP_FCNTLS_LIMIT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_CAP_GETMODE = 517 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_CAP_GETMODE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_CAP_IOCTLS_GET = 535 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_CAP_IOCTLS_GET ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_CAP_IOCTLS_LIMIT = 534 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_CAP_IOCTLS_LIMIT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_CAP_RIGHTS_LIMIT = 533 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_CAP_RIGHTS_LIMIT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_CHDIR = 12 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_CHDIR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_CHFLAGS = 34 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_CHFLAGS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_CHFLAGSAT = 540 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_CHFLAGSAT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_CHMOD = 15 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_CHMOD ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_CHOWN = 16 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_CHOWN ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_CHROOT = 61 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_CHROOT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_CLOCK_GETCPUCLOCKID2 = 247 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_CLOCK_GETCPUCLOCKID2 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_CLOCK_GETRES = 234 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_CLOCK_GETRES ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_CLOCK_GETTIME = 232 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_CLOCK_GETTIME ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_CLOCK_NANOSLEEP = 244 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_CLOCK_NANOSLEEP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_CLOCK_SETTIME = 233 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_CLOCK_SETTIME ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_CLOSE = 6 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_CLOSE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_CLOSEFROM = 509 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_CLOSEFROM ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_CONNECT = 98 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_CONNECT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_CONNECTAT = 539 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_CONNECTAT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_CPUSET = 484 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_CPUSET ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_CPUSET_GETAFFINITY = 487 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_CPUSET_GETAFFINITY ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_CPUSET_GETID = 486 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_CPUSET_GETID ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_CPUSET_SETAFFINITY = 488 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_CPUSET_SETAFFINITY ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_CPUSET_SETID = 485 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_CPUSET_SETID ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_DUP = 41 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_DUP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_DUP2 = 90 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_DUP2 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_EACCESS = 376 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_EACCESS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_EXECVE = 59 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_EXECVE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_EXIT = 1 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_EXIT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_EXTATTRCTL = 355 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_EXTATTRCTL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_EXTATTR_DELETE_FD = 373 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_EXTATTR_DELETE_FD ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_EXTATTR_DELETE_FILE = 358 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_EXTATTR_DELETE_FILE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_EXTATTR_DELETE_LINK = 414 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_EXTATTR_DELETE_LINK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_EXTATTR_GET_FD = 372 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_EXTATTR_GET_FD ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_EXTATTR_GET_FILE = 357 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_EXTATTR_GET_FILE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_EXTATTR_GET_LINK = 413 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_EXTATTR_GET_LINK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_EXTATTR_LIST_FD = 437 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_EXTATTR_LIST_FD ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_EXTATTR_LIST_FILE = 438 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_EXTATTR_LIST_FILE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_EXTATTR_LIST_LINK = 439 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_EXTATTR_LIST_LINK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_EXTATTR_SET_FD = 371 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_EXTATTR_SET_FD ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_EXTATTR_SET_FILE = 356 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_EXTATTR_SET_FILE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_EXTATTR_SET_LINK = 412 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_EXTATTR_SET_LINK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_FACCESSAT = 489 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_FACCESSAT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_FCHDIR = 13 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_FCHDIR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_FCHFLAGS = 35 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_FCHFLAGS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_FCHMOD = 124 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_FCHMOD ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_FCHMODAT = 490 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_FCHMODAT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_FCHOWN = 123 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_FCHOWN ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_FCHOWNAT = 491 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_FCHOWNAT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_FCNTL = 92 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_FCNTL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_FDATASYNC = 550 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_FDATASYNC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_FEXECVE = 492 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_FEXECVE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_FFCLOCK_GETCOUNTER = 241 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_FFCLOCK_GETCOUNTER ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_FFCLOCK_GETESTIMATE = 243 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_FFCLOCK_GETESTIMATE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_FFCLOCK_SETESTIMATE = 242 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_FFCLOCK_SETESTIMATE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_FHOPEN = 298 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_FHOPEN ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_FHSTAT = 299 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_FHSTAT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_FHSTATFS = 398 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_FHSTATFS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_FLOCK = 131 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_FLOCK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_FORK = 2 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_FORK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_FPATHCONF = 192 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_FPATHCONF ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_FSTAT = 551 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_FSTAT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_FSTATAT = 552 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_FSTATAT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_FSTATFS = 556 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_FSTATFS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_FSYNC = 95 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_FSYNC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_FTRUNCATE = 480 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_FTRUNCATE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_FUTIMENS = 546 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_FUTIMENS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_FUTIMES = 206 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_FUTIMES ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_FUTIMESAT = 494 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_FUTIMESAT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_GETAUDIT = 449 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_GETAUDIT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_GETAUDIT_ADDR = 451 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_GETAUDIT_ADDR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_GETAUID = 447 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_GETAUID ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_GETCONTEXT = 421 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_GETCONTEXT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_GETDENTS = 272 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_GETDENTS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_GETDIRENTRIES = 554 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_GETDIRENTRIES ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_GETDTABLESIZE = 89 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_GETDTABLESIZE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_GETEGID = 43 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_GETEGID ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_GETEUID = 25 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_GETEUID ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_GETFH = 161 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_GETFH ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_GETFSSTAT = 557 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_GETFSSTAT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_GETGID = 47 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_GETGID ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_GETGROUPS = 79 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_GETGROUPS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_GETITIMER = 86 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_GETITIMER ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_GETLOGIN = 49 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_GETLOGIN ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_GETLOGINCLASS = 523 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_GETLOGINCLASS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_GETPEERNAME = 31 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_GETPEERNAME ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_GETPGID = 207 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_GETPGID ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_GETPGRP = 81 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_GETPGRP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_GETPID = 20 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_GETPID ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_GETPPID = 39 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_GETPPID ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_GETPRIORITY = 100 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_GETPRIORITY ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_GETRESGID = 361 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_GETRESGID ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_GETRESUID = 360 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_GETRESUID ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_GETRLIMIT = 194 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_GETRLIMIT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_GETRUSAGE = 117 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_GETRUSAGE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_GETSID = 310 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_GETSID ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_GETSOCKNAME = 32 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_GETSOCKNAME ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_GETSOCKOPT = 118 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_GETSOCKOPT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_GETTIMEOFDAY = 116 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_GETTIMEOFDAY ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_GETUID = 24 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_GETUID ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_GSSD_SYSCALL = 505 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_GSSD_SYSCALL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_IOCTL = 54 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_IOCTL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_ISSETUGID = 253 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_ISSETUGID ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_JAIL = 338 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_JAIL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_JAIL_ATTACH = 436 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_JAIL_ATTACH ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_JAIL_GET = 506 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_JAIL_GET ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_JAIL_REMOVE = 508 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_JAIL_REMOVE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_JAIL_SET = 507 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_JAIL_SET ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_KENV = 390 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_KENV ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_KEVENT = 363 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_KEVENT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_KILL = 37 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_KILL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_KLDFIND = 306 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_KLDFIND ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_KLDFIRSTMOD = 309 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_KLDFIRSTMOD ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_KLDLOAD = 304 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_KLDLOAD ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_KLDNEXT = 307 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_KLDNEXT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_KLDSTAT = 308 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_KLDSTAT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_KLDSYM = 337 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_KLDSYM ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_KLDUNLOAD = 305 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_KLDUNLOAD ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_KLDUNLOADF = 444 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_KLDUNLOADF ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_KMQ_NOTIFY = 461 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_KMQ_NOTIFY ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_KMQ_OPEN = 457 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_KMQ_OPEN ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_KMQ_SETATTR = 458 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_KMQ_SETATTR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_KMQ_TIMEDRECEIVE = 459 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_KMQ_TIMEDRECEIVE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_KMQ_TIMEDSEND = 460 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_KMQ_TIMEDSEND ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_KMQ_UNLINK = 462 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_KMQ_UNLINK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_KQUEUE = 362 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_KQUEUE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_KSEM_CLOSE = 400 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_KSEM_CLOSE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_KSEM_DESTROY = 408 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_KSEM_DESTROY ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_KSEM_GETVALUE = 407 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_KSEM_GETVALUE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_KSEM_INIT = 404 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_KSEM_INIT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_KSEM_OPEN = 405 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_KSEM_OPEN ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_KSEM_POST = 401 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_KSEM_POST ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_KSEM_TIMEDWAIT = 441 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_KSEM_TIMEDWAIT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_KSEM_TRYWAIT = 403 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_KSEM_TRYWAIT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_KSEM_UNLINK = 406 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_KSEM_UNLINK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_KSEM_WAIT = 402 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_KSEM_WAIT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_KTIMER_CREATE = 235 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_KTIMER_CREATE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_KTIMER_DELETE = 236 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_KTIMER_DELETE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_KTIMER_GETOVERRUN = 239 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_KTIMER_GETOVERRUN ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_KTIMER_GETTIME = 238 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_KTIMER_GETTIME ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_KTIMER_SETTIME = 237 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_KTIMER_SETTIME ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_KTRACE = 45 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_KTRACE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_LCHFLAGS = 391 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_LCHFLAGS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_LCHMOD = 274 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_LCHMOD ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_LCHOWN = 254 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_LCHOWN ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_LGETFH = 160 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_LGETFH ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_LINK = 9 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_LINK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_LINKAT = 495 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_LINKAT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_LIO_LISTIO = 257 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_LIO_LISTIO ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_LISTEN = 106 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_LISTEN ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_LPATHCONF = 513 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_LPATHCONF ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_LSEEK = 478 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_LSEEK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_LUTIMES = 276 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_LUTIMES ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_MAC_SYSCALL = 394 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_MAC_SYSCALL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_MADVISE = 75 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_MADVISE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_MINCORE = 78 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_MINCORE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_MINHERIT = 250 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_MINHERIT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_MKDIR = 136 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_MKDIR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_MKDIRAT = 496 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_MKDIRAT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_MKFIFO = 132 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_MKFIFO ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_MKFIFOAT = 497 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_MKFIFOAT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_MKNOD = 14 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_MKNOD ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_MKNODAT = 559 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_MKNODAT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_MLOCK = 203 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_MLOCK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_MLOCKALL = 324 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_MLOCKALL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_MMAP = 477 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_MMAP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_MODFIND = 303 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_MODFIND ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_MODFNEXT = 302 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_MODFNEXT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_MODNEXT = 300 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_MODNEXT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_MODSTAT = 301 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_MODSTAT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_MOUNT = 21 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_MOUNT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_MPROTECT = 74 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_MPROTECT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_MSGCTL = 511 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_MSGCTL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_MSGGET = 225 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_MSGGET ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_MSGRCV = 227 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_MSGRCV ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_MSGSND = 226 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_MSGSND ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_MSGSYS = 170 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_MSGSYS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_MSYNC = 65 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_MSYNC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_MUNLOCK = 204 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_MUNLOCK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_MUNLOCKALL = 325 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_MUNLOCKALL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_MUNMAP = 73 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_MUNMAP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_NANOSLEEP = 240 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_NANOSLEEP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_NFSSVC = 155 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_NFSSVC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_NFSTAT = 279 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_NFSTAT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_NLM_SYSCALL = 154 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_NLM_SYSCALL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_NLSTAT = 280 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_NLSTAT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_NMOUNT = 378 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_NMOUNT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_NSTAT = 278 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_NSTAT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_NTP_ADJTIME = 176 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_NTP_ADJTIME ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_NTP_GETTIME = 248 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_NTP_GETTIME ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_NUMA_GETAFFINITY = 548 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_NUMA_GETAFFINITY ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_NUMA_SETAFFINITY = 549 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_NUMA_SETAFFINITY ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_OBREAK = 17 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_OBREAK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_OPEN = 5 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_OPEN ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_OPENAT = 499 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_OPENAT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_OPENBSD_POLL = 252 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_OPENBSD_POLL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_OVADVISE = 72 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_OVADVISE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_PATHCONF = 191 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_PATHCONF ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_PDFORK = 518 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_PDFORK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_PDGETPID = 520 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_PDGETPID ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_PDKILL = 519 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_PDKILL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_PIPE = 42 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_PIPE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_PIPE2 = 542 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_PIPE2 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_POLL = 209 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_POLL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_POSIX_FADVISE = 531 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_POSIX_FADVISE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_POSIX_FALLOCATE = 530 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_POSIX_FALLOCATE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_POSIX_OPENPT = 504 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_POSIX_OPENPT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_PPOLL = 545 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_PPOLL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_PREAD = 475 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_PREAD ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_PREADV = 289 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_PREADV ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_PROCCTL = 544 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_PROCCTL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_PROFIL = 44 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_PROFIL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_PSELECT = 522 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_PSELECT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_PTRACE = 26 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_PTRACE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_PWRITE = 476 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_PWRITE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_PWRITEV = 290 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_PWRITEV ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_QUOTACTL = 148 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_QUOTACTL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_RCTL_ADD_RULE = 528 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_RCTL_ADD_RULE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_RCTL_GET_LIMITS = 527 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_RCTL_GET_LIMITS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_RCTL_GET_RACCT = 525 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_RCTL_GET_RACCT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_RCTL_GET_RULES = 526 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_RCTL_GET_RULES ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_RCTL_REMOVE_RULE = 529 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_RCTL_REMOVE_RULE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_READ = 3 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_READ ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_READLINK = 58 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_READLINK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_READLINKAT = 500 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_READLINKAT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_READV = 120 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_READV ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_REBOOT = 55 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_REBOOT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_RECVFROM = 29 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_RECVFROM ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_RECVMSG = 27 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_RECVMSG ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_RENAME = 128 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_RENAME ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_RENAMEAT = 501 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_RENAMEAT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_REVOKE = 56 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_REVOKE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_RFORK = 251 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_RFORK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_RMDIR = 137 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_RMDIR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_RTPRIO = 166 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_RTPRIO ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_RTPRIO_THREAD = 466 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_RTPRIO_THREAD ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SBRK = 69 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SBRK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SCHED_GETPARAM = 328 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SCHED_GETPARAM ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SCHED_GETSCHEDULER = 330 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SCHED_GETSCHEDULER ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SCHED_GET_PRIORITY_MAX = 332 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SCHED_GET_PRIORITY_MAX ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SCHED_GET_PRIORITY_MIN = 333 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SCHED_GET_PRIORITY_MIN ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SCHED_RR_GET_INTERVAL = 334 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SCHED_RR_GET_INTERVAL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SCHED_SETPARAM = 327 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SCHED_SETPARAM ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SCHED_SETSCHEDULER = 329 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SCHED_SETSCHEDULER ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SCHED_YIELD = 331 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SCHED_YIELD ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SCTP_GENERIC_RECVMSG = 474 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SCTP_GENERIC_RECVMSG ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SCTP_GENERIC_SENDMSG = 472 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SCTP_GENERIC_SENDMSG ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SCTP_GENERIC_SENDMSG_IOV = 473 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SCTP_GENERIC_SENDMSG_IOV ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SCTP_PEELOFF = 471 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SCTP_PEELOFF ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SELECT = 93 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SELECT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SEMGET = 221 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SEMGET ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SEMOP = 222 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SEMOP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SEMSYS = 169 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SEMSYS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SENDFILE = 393 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SENDFILE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SENDMSG = 28 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SENDMSG ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SENDTO = 133 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SENDTO ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SETAUDIT = 450 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SETAUDIT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SETAUDIT_ADDR = 452 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SETAUDIT_ADDR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SETAUID = 448 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SETAUID ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SETCONTEXT = 422 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SETCONTEXT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SETEGID = 182 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SETEGID ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SETEUID = 183 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SETEUID ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SETFIB = 175 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SETFIB ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SETGID = 181 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SETGID ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SETGROUPS = 80 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SETGROUPS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SETITIMER = 83 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SETITIMER ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SETLOGIN = 50 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SETLOGIN ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SETLOGINCLASS = 524 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SETLOGINCLASS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SETPGID = 82 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SETPGID ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SETPRIORITY = 96 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SETPRIORITY ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SETREGID = 127 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SETREGID ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SETRESGID = 312 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SETRESGID ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SETRESUID = 311 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SETRESUID ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SETREUID = 126 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SETREUID ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SETRLIMIT = 195 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SETRLIMIT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SETSID = 147 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SETSID ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SETSOCKOPT = 105 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SETSOCKOPT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SETTIMEOFDAY = 122 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SETTIMEOFDAY ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SETUID = 23 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SETUID ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SHMAT = 228 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SHMAT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SHMCTL = 512 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SHMCTL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SHMDT = 230 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SHMDT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SHMGET = 231 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SHMGET ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SHMSYS = 171 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SHMSYS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SHM_OPEN = 482 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SHM_OPEN ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SHM_UNLINK = 483 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SHM_UNLINK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SHUTDOWN = 134 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SHUTDOWN ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SIGACTION = 416 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SIGACTION ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SIGALTSTACK = 53 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SIGALTSTACK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SIGPENDING = 343 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SIGPENDING ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SIGPROCMASK = 340 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SIGPROCMASK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SIGQUEUE = 456 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SIGQUEUE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SIGRETURN = 417 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SIGRETURN ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SIGSUSPEND = 341 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SIGSUSPEND ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SIGTIMEDWAIT = 345 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SIGTIMEDWAIT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SIGWAIT = 429 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SIGWAIT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SIGWAITINFO = 346 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SIGWAITINFO ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SOCKET = 97 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SOCKET ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SOCKETPAIR = 135 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SOCKETPAIR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SSTK = 70 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SSTK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_STATFS = 555 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_STATFS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SWAPCONTEXT = 423 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SWAPCONTEXT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SWAPOFF = 424 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SWAPOFF ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SWAPON = 85 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SWAPON ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SYMLINK = 57 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SYMLINK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SYMLINKAT = 502 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SYMLINKAT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SYNC = 36 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SYNC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SYSARCH = 165 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_SYSARCH ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_THR_CREATE = 430 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_THR_CREATE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_THR_EXIT = 431 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_THR_EXIT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_THR_KILL = 433 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_THR_KILL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_THR_KILL2 = 481 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_THR_KILL2 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_THR_NEW = 455 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_THR_NEW ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_THR_SELF = 432 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_THR_SELF ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_THR_SET_NAME = 464 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_THR_SET_NAME ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_THR_SUSPEND = 442 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_THR_SUSPEND ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_THR_WAKE = 443 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_THR_WAKE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_TRUNCATE = 479 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_TRUNCATE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_UMASK = 60 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_UMASK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_UNDELETE = 205 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_UNDELETE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_UNLINK = 10 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_UNLINK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_UNLINKAT = 503 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_UNLINKAT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_UNMOUNT = 22 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_UNMOUNT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_UTIMENSAT = 547 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_UTIMENSAT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_UTIMES = 138 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_UTIMES ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_UTRACE = 335 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_UTRACE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_UUIDGEN = 392 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_UUIDGEN ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_VFORK = 66 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_VFORK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_WAIT4 = 7 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_WAIT4 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_WAIT6 = 532 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_WAIT6 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_WRITE = 4 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_WRITE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_WRITEV = 121 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_WRITEV ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_YIELD = 321 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS_YIELD ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS__UMTX_OP = 454 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS__UMTX_OP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS___ACL_ACLCHECK_FD = 354 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS___ACL_ACLCHECK_FD ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS___ACL_ACLCHECK_FILE = 353 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS___ACL_ACLCHECK_FILE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS___ACL_ACLCHECK_LINK = 428 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS___ACL_ACLCHECK_LINK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS___ACL_DELETE_FD = 352 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS___ACL_DELETE_FD ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS___ACL_DELETE_FILE = 351 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS___ACL_DELETE_FILE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS___ACL_DELETE_LINK = 427 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS___ACL_DELETE_LINK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS___ACL_GET_FD = 349 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS___ACL_GET_FD ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS___ACL_GET_FILE = 347 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS___ACL_GET_FILE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS___ACL_GET_LINK = 425 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS___ACL_GET_LINK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS___ACL_SET_FD = 350 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS___ACL_SET_FD ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS___ACL_SET_FILE = 348 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS___ACL_SET_FILE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS___ACL_SET_LINK = 426 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS___ACL_SET_LINK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS___CAP_RIGHTS_GET = 515 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS___CAP_RIGHTS_GET ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS___GETCWD = 326 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS___GETCWD ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS___MAC_EXECVE = 415 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS___MAC_EXECVE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS___MAC_GET_FD = 386 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS___MAC_GET_FD ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS___MAC_GET_FILE = 387 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS___MAC_GET_FILE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS___MAC_GET_LINK = 410 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS___MAC_GET_LINK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS___MAC_GET_PID = 409 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS___MAC_GET_PID ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS___MAC_GET_PROC = 384 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS___MAC_GET_PROC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS___MAC_SET_FD = 388 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS___MAC_SET_FD ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS___MAC_SET_FILE = 389 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS___MAC_SET_FILE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS___MAC_SET_LINK = 411 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS___MAC_SET_LINK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS___MAC_SET_PROC = 385 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS___MAC_SET_PROC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS___SEMCTL = 510 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS___SEMCTL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS___SETUGID = 374 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS___SETUGID ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS___SYSCTL = 202 #53466
+pkg syscall (freebsd-riscv64-cgo), const SYS___SYSCTL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const S_IFMT = 61440 #53466
+pkg syscall (freebsd-riscv64-cgo), const S_IRWXG = 56 #53466
+pkg syscall (freebsd-riscv64-cgo), const S_IRWXG ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const S_IRWXO = 7 #53466
+pkg syscall (freebsd-riscv64-cgo), const S_IRWXO ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SizeofBpfHdr = 32 #53466
+pkg syscall (freebsd-riscv64-cgo), const SizeofBpfHdr ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SizeofBpfInsn = 8 #53466
+pkg syscall (freebsd-riscv64-cgo), const SizeofBpfInsn ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SizeofBpfProgram = 16 #53466
+pkg syscall (freebsd-riscv64-cgo), const SizeofBpfProgram ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SizeofBpfStat = 8 #53466
+pkg syscall (freebsd-riscv64-cgo), const SizeofBpfStat ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SizeofBpfVersion = 4 #53466
+pkg syscall (freebsd-riscv64-cgo), const SizeofBpfVersion ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SizeofBpfZbuf = 24 #53466
+pkg syscall (freebsd-riscv64-cgo), const SizeofBpfZbuf ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SizeofBpfZbufHeader = 32 #53466
+pkg syscall (freebsd-riscv64-cgo), const SizeofBpfZbufHeader ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SizeofCmsghdr = 12 #53466
+pkg syscall (freebsd-riscv64-cgo), const SizeofCmsghdr ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SizeofICMPv6Filter = 32 #53466
+pkg syscall (freebsd-riscv64-cgo), const SizeofICMPv6Filter ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SizeofIPMreq = 8 #53466
+pkg syscall (freebsd-riscv64-cgo), const SizeofIPMreq ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SizeofIPMreqn = 12 #53466
+pkg syscall (freebsd-riscv64-cgo), const SizeofIPMreqn ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SizeofIPv6MTUInfo = 32 #53466
+pkg syscall (freebsd-riscv64-cgo), const SizeofIPv6MTUInfo ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SizeofIPv6Mreq = 20 #53466
+pkg syscall (freebsd-riscv64-cgo), const SizeofIPv6Mreq ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SizeofIfAnnounceMsghdr = 24 #53466
+pkg syscall (freebsd-riscv64-cgo), const SizeofIfAnnounceMsghdr ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SizeofIfData = 152 #53466
+pkg syscall (freebsd-riscv64-cgo), const SizeofIfData ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SizeofIfMsghdr = 168 #53466
+pkg syscall (freebsd-riscv64-cgo), const SizeofIfMsghdr ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SizeofIfaMsghdr = 20 #53466
+pkg syscall (freebsd-riscv64-cgo), const SizeofIfaMsghdr ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SizeofIfmaMsghdr = 16 #53466
+pkg syscall (freebsd-riscv64-cgo), const SizeofIfmaMsghdr ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SizeofInet6Pktinfo = 20 #53466
+pkg syscall (freebsd-riscv64-cgo), const SizeofInet6Pktinfo ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SizeofLinger = 8 #53466
+pkg syscall (freebsd-riscv64-cgo), const SizeofLinger ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SizeofMsghdr = 48 #53466
+pkg syscall (freebsd-riscv64-cgo), const SizeofMsghdr ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SizeofRtMetrics = 112 #53466
+pkg syscall (freebsd-riscv64-cgo), const SizeofRtMetrics ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SizeofRtMsghdr = 152 #53466
+pkg syscall (freebsd-riscv64-cgo), const SizeofRtMsghdr ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SizeofSockaddrAny = 108 #53466
+pkg syscall (freebsd-riscv64-cgo), const SizeofSockaddrAny ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SizeofSockaddrDatalink = 54 #53466
+pkg syscall (freebsd-riscv64-cgo), const SizeofSockaddrDatalink ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SizeofSockaddrInet4 = 16 #53466
+pkg syscall (freebsd-riscv64-cgo), const SizeofSockaddrInet4 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SizeofSockaddrInet6 = 28 #53466
+pkg syscall (freebsd-riscv64-cgo), const SizeofSockaddrInet6 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const SizeofSockaddrUnix = 106 #53466
+pkg syscall (freebsd-riscv64-cgo), const SizeofSockaddrUnix ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TCIFLUSH = 1 #53466
+pkg syscall (freebsd-riscv64-cgo), const TCIFLUSH ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TCIOFLUSH = 3 #53466
+pkg syscall (freebsd-riscv64-cgo), const TCIOFLUSH ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TCOFLUSH = 2 #53466
+pkg syscall (freebsd-riscv64-cgo), const TCOFLUSH ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TCP_CA_NAME_MAX = 16 #53466
+pkg syscall (freebsd-riscv64-cgo), const TCP_CA_NAME_MAX ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TCP_CONGESTION = 64 #53466
+pkg syscall (freebsd-riscv64-cgo), const TCP_CONGESTION ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TCP_INFO = 32 #53466
+pkg syscall (freebsd-riscv64-cgo), const TCP_INFO ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TCP_KEEPCNT = 1024 #53466
+pkg syscall (freebsd-riscv64-cgo), const TCP_KEEPCNT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TCP_KEEPIDLE = 256 #53466
+pkg syscall (freebsd-riscv64-cgo), const TCP_KEEPIDLE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TCP_KEEPINIT = 128 #53466
+pkg syscall (freebsd-riscv64-cgo), const TCP_KEEPINIT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TCP_KEEPINTVL = 512 #53466
+pkg syscall (freebsd-riscv64-cgo), const TCP_KEEPINTVL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TCP_MAXBURST = 4 #53466
+pkg syscall (freebsd-riscv64-cgo), const TCP_MAXBURST ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TCP_MAXHLEN = 60 #53466
+pkg syscall (freebsd-riscv64-cgo), const TCP_MAXHLEN ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TCP_MAXOLEN = 40 #53466
+pkg syscall (freebsd-riscv64-cgo), const TCP_MAXOLEN ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TCP_MAXSEG = 2 #53466
+pkg syscall (freebsd-riscv64-cgo), const TCP_MAXSEG ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TCP_MAXWIN = 65535 #53466
+pkg syscall (freebsd-riscv64-cgo), const TCP_MAXWIN ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TCP_MAX_SACK = 4 #53466
+pkg syscall (freebsd-riscv64-cgo), const TCP_MAX_SACK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TCP_MAX_WINSHIFT = 14 #53466
+pkg syscall (freebsd-riscv64-cgo), const TCP_MAX_WINSHIFT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TCP_MD5SIG = 16 #53466
+pkg syscall (freebsd-riscv64-cgo), const TCP_MD5SIG ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TCP_MINMSS = 216 #53466
+pkg syscall (freebsd-riscv64-cgo), const TCP_MINMSS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TCP_MSS = 536 #53466
+pkg syscall (freebsd-riscv64-cgo), const TCP_MSS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TCP_NOOPT = 8 #53466
+pkg syscall (freebsd-riscv64-cgo), const TCP_NOOPT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TCP_NOPUSH = 4 #53466
+pkg syscall (freebsd-riscv64-cgo), const TCP_NOPUSH ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TCP_VENDOR = 2147483648 #53466
+pkg syscall (freebsd-riscv64-cgo), const TCP_VENDOR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TCSAFLUSH = 2 #53466
+pkg syscall (freebsd-riscv64-cgo), const TCSAFLUSH ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCCBRK = 536900730 #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCCBRK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCCDTR = 536900728 #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCCDTR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCCONS = 2147775586 #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCCONS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCDRAIN = 536900702 #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCDRAIN ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCEXCL = 536900621 #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCEXCL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCEXT = 2147775584 #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCEXT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCFLUSH = 2147775504 #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCFLUSH ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCGDRAINWAIT = 1074033750 #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCGDRAINWAIT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCGETA = 1076655123 #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCGETA ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCGETD = 1074033690 #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCGETD ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCGPGRP = 1074033783 #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCGPGRP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCGPTN = 1074033679 #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCGPTN ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCGSID = 1074033763 #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCGSID ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCGWINSZ = 1074295912 #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCGWINSZ ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCMBIC = 2147775595 #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCMBIC ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCMBIS = 2147775596 #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCMBIS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCMGDTRWAIT = 1074033754 #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCMGDTRWAIT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCMGET = 1074033770 #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCMGET ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCMSDTRWAIT = 2147775579 #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCMSDTRWAIT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCMSET = 2147775597 #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCMSET ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCM_CAR = 64 #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCM_CAR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCM_CD = 64 #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCM_CD ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCM_CTS = 32 #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCM_CTS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCM_DCD = 64 #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCM_DCD ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCM_DSR = 256 #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCM_DSR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCM_DTR = 2 #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCM_DTR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCM_LE = 1 #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCM_LE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCM_RI = 128 #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCM_RI ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCM_RNG = 128 #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCM_RNG ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCM_RTS = 4 #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCM_RTS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCM_SR = 16 #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCM_SR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCM_ST = 8 #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCM_ST ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCNOTTY = 536900721 #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCNOTTY ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCNXCL = 536900622 #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCNXCL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCOUTQ = 1074033779 #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCOUTQ ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCPKT = 2147775600 #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCPKT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCPKT_DATA = 0 #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCPKT_DATA ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCPKT_DOSTOP = 32 #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCPKT_DOSTOP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCPKT_FLUSHREAD = 1 #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCPKT_FLUSHREAD ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCPKT_FLUSHWRITE = 2 #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCPKT_FLUSHWRITE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCPKT_IOCTL = 64 #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCPKT_IOCTL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCPKT_NOSTOP = 16 #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCPKT_NOSTOP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCPKT_START = 8 #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCPKT_START ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCPKT_STOP = 4 #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCPKT_STOP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCPTMASTER = 536900636 #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCPTMASTER ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCSBRK = 536900731 #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCSBRK ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCSCTTY = 536900705 #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCSCTTY ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCSDRAINWAIT = 2147775575 #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCSDRAINWAIT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCSDTR = 536900729 #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCSDTR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCSETA = 2150396948 #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCSETA ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCSETAF = 2150396950 #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCSETAF ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCSETAW = 2150396949 #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCSETAW ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCSETD = 2147775515 #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCSETD ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCSIG = 537162847 #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCSIG ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCSPGRP = 2147775606 #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCSPGRP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCSTART = 536900718 #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCSTART ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCSTAT = 536900709 #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCSTAT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCSTI = 2147578994 #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCSTI ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCSTOP = 536900719 #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCSTOP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCSWINSZ = 2148037735 #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCSWINSZ ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCTIMESTAMP = 1074820185 #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCTIMESTAMP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCUCNTL = 2147775590 #53466
+pkg syscall (freebsd-riscv64-cgo), const TIOCUCNTL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const TOSTOP = 4194304 #53466
+pkg syscall (freebsd-riscv64-cgo), const TOSTOP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const VDISCARD = 15 #53466
+pkg syscall (freebsd-riscv64-cgo), const VDISCARD ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const VDSUSP = 11 #53466
+pkg syscall (freebsd-riscv64-cgo), const VDSUSP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const VEOF = 0 #53466
+pkg syscall (freebsd-riscv64-cgo), const VEOF ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const VEOL = 1 #53466
+pkg syscall (freebsd-riscv64-cgo), const VEOL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const VEOL2 = 2 #53466
+pkg syscall (freebsd-riscv64-cgo), const VEOL2 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const VERASE = 3 #53466
+pkg syscall (freebsd-riscv64-cgo), const VERASE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const VERASE2 = 7 #53466
+pkg syscall (freebsd-riscv64-cgo), const VERASE2 ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const VINTR = 8 #53466
+pkg syscall (freebsd-riscv64-cgo), const VINTR ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const VKILL = 5 #53466
+pkg syscall (freebsd-riscv64-cgo), const VKILL ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const VLNEXT = 14 #53466
+pkg syscall (freebsd-riscv64-cgo), const VLNEXT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const VMIN = 16 #53466
+pkg syscall (freebsd-riscv64-cgo), const VMIN ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const VQUIT = 9 #53466
+pkg syscall (freebsd-riscv64-cgo), const VQUIT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const VREPRINT = 6 #53466
+pkg syscall (freebsd-riscv64-cgo), const VREPRINT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const VSTART = 12 #53466
+pkg syscall (freebsd-riscv64-cgo), const VSTART ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const VSTATUS = 18 #53466
+pkg syscall (freebsd-riscv64-cgo), const VSTATUS ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const VSTOP = 13 #53466
+pkg syscall (freebsd-riscv64-cgo), const VSTOP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const VSUSP = 10 #53466
+pkg syscall (freebsd-riscv64-cgo), const VSUSP ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const VTIME = 17 #53466
+pkg syscall (freebsd-riscv64-cgo), const VTIME ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const VWERASE = 4 #53466
+pkg syscall (freebsd-riscv64-cgo), const VWERASE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const WCONTINUED = 4 #53466
+pkg syscall (freebsd-riscv64-cgo), const WCONTINUED ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const WCOREFLAG = 128 #53466
+pkg syscall (freebsd-riscv64-cgo), const WCOREFLAG ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const WEXITED = 16 #53466
+pkg syscall (freebsd-riscv64-cgo), const WEXITED ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const WLINUXCLONE = 2147483648 #53466
+pkg syscall (freebsd-riscv64-cgo), const WLINUXCLONE ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const WNOHANG = 1 #53466
+pkg syscall (freebsd-riscv64-cgo), const WNOHANG ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const WNOWAIT = 8 #53466
+pkg syscall (freebsd-riscv64-cgo), const WNOWAIT ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const WSTOPPED = 2 #53466
+pkg syscall (freebsd-riscv64-cgo), const WSTOPPED ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const WTRAPPED = 32 #53466
+pkg syscall (freebsd-riscv64-cgo), const WTRAPPED ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), const WUNTRACED = 2 #53466
+pkg syscall (freebsd-riscv64-cgo), const WUNTRACED ideal-int #53466
+pkg syscall (freebsd-riscv64-cgo), func Accept(int) (int, Sockaddr, error) #53466
+pkg syscall (freebsd-riscv64-cgo), func Accept4(int, int) (int, Sockaddr, error) #53466
+pkg syscall (freebsd-riscv64-cgo), func Access(string, uint32) error #53466
+pkg syscall (freebsd-riscv64-cgo), func Adjtime(*Timeval, *Timeval) error #53466
+pkg syscall (freebsd-riscv64-cgo), func Bind(int, Sockaddr) error #53466
+pkg syscall (freebsd-riscv64-cgo), func BpfBuflen //deprecated #53466
+pkg syscall (freebsd-riscv64-cgo), func BpfBuflen(int) (int, error) #53466
+pkg syscall (freebsd-riscv64-cgo), func BpfDatalink //deprecated #53466
+pkg syscall (freebsd-riscv64-cgo), func BpfDatalink(int) (int, error) #53466
+pkg syscall (freebsd-riscv64-cgo), func BpfHeadercmpl //deprecated #53466
+pkg syscall (freebsd-riscv64-cgo), func BpfHeadercmpl(int) (int, error) #53466
+pkg syscall (freebsd-riscv64-cgo), func BpfInterface //deprecated #53466
+pkg syscall (freebsd-riscv64-cgo), func BpfInterface(int, string) (string, error) #53466
+pkg syscall (freebsd-riscv64-cgo), func BpfJump //deprecated #53466
+pkg syscall (freebsd-riscv64-cgo), func BpfJump(int, int, int, int) *BpfInsn #53466
+pkg syscall (freebsd-riscv64-cgo), func BpfStats //deprecated #53466
+pkg syscall (freebsd-riscv64-cgo), func BpfStats(int) (*BpfStat, error) #53466
+pkg syscall (freebsd-riscv64-cgo), func BpfStmt //deprecated #53466
+pkg syscall (freebsd-riscv64-cgo), func BpfStmt(int, int) *BpfInsn #53466
+pkg syscall (freebsd-riscv64-cgo), func BpfTimeout //deprecated #53466
+pkg syscall (freebsd-riscv64-cgo), func BpfTimeout(int) (*Timeval, error) #53466
+pkg syscall (freebsd-riscv64-cgo), func CheckBpfVersion //deprecated #53466
+pkg syscall (freebsd-riscv64-cgo), func CheckBpfVersion(int) error #53466
+pkg syscall (freebsd-riscv64-cgo), func Chflags(string, int) error #53466
+pkg syscall (freebsd-riscv64-cgo), func Chroot(string) error #53466
+pkg syscall (freebsd-riscv64-cgo), func Close(int) error #53466
+pkg syscall (freebsd-riscv64-cgo), func CloseOnExec(int) #53466
+pkg syscall (freebsd-riscv64-cgo), func CmsgLen(int) int #53466
+pkg syscall (freebsd-riscv64-cgo), func CmsgSpace(int) int #53466
+pkg syscall (freebsd-riscv64-cgo), func Connect(int, Sockaddr) error #53466
+pkg syscall (freebsd-riscv64-cgo), func Dup(int) (int, error) #53466
+pkg syscall (freebsd-riscv64-cgo), func Dup2(int, int) error #53466
+pkg syscall (freebsd-riscv64-cgo), func Fchdir(int) error #53466
+pkg syscall (freebsd-riscv64-cgo), func Fchflags(int, int) error #53466
+pkg syscall (freebsd-riscv64-cgo), func Fchmod(int, uint32) error #53466
+pkg syscall (freebsd-riscv64-cgo), func Fchown(int, int, int) error #53466
+pkg syscall (freebsd-riscv64-cgo), func FcntlFlock(uintptr, int, *Flock_t) error #53466
+pkg syscall (freebsd-riscv64-cgo), func Flock(int, int) error #53466
+pkg syscall (freebsd-riscv64-cgo), func FlushBpf //deprecated #53466
+pkg syscall (freebsd-riscv64-cgo), func FlushBpf(int) error #53466
+pkg syscall (freebsd-riscv64-cgo), func ForkExec(string, []string, *ProcAttr) (int, error) #53466
+pkg syscall (freebsd-riscv64-cgo), func Fpathconf(int, int) (int, error) #53466
+pkg syscall (freebsd-riscv64-cgo), func Fstat(int, *Stat_t) error #53466
+pkg syscall (freebsd-riscv64-cgo), func Fstatat(int, string, *Stat_t, int) error #53466
+pkg syscall (freebsd-riscv64-cgo), func Fstatfs(int, *Statfs_t) error #53466
+pkg syscall (freebsd-riscv64-cgo), func Fsync(int) error #53466
+pkg syscall (freebsd-riscv64-cgo), func Ftruncate(int, int64) error #53466
+pkg syscall (freebsd-riscv64-cgo), func Futimes(int, []Timeval) error #53466
+pkg syscall (freebsd-riscv64-cgo), func Getdirentries(int, []uint8, *uintptr) (int, error) #53466
+pkg syscall (freebsd-riscv64-cgo), func Getdtablesize() int #53466
+pkg syscall (freebsd-riscv64-cgo), func Getfsstat([]Statfs_t, int) (int, error) #53466
+pkg syscall (freebsd-riscv64-cgo), func Getpeername(int) (Sockaddr, error) #53466
+pkg syscall (freebsd-riscv64-cgo), func Getpgid(int) (int, error) #53466
+pkg syscall (freebsd-riscv64-cgo), func Getpgrp() int #53466
+pkg syscall (freebsd-riscv64-cgo), func Getpriority(int, int) (int, error) #53466
+pkg syscall (freebsd-riscv64-cgo), func Getrlimit(int, *Rlimit) error #53466
+pkg syscall (freebsd-riscv64-cgo), func Getrusage(int, *Rusage) error #53466
+pkg syscall (freebsd-riscv64-cgo), func Getsid(int) (int, error) #53466
+pkg syscall (freebsd-riscv64-cgo), func Getsockname(int) (Sockaddr, error) #53466
+pkg syscall (freebsd-riscv64-cgo), func GetsockoptByte(int, int, int) (uint8, error) #53466
+pkg syscall (freebsd-riscv64-cgo), func GetsockoptICMPv6Filter(int, int, int) (*ICMPv6Filter, error) #53466
+pkg syscall (freebsd-riscv64-cgo), func GetsockoptIPMreq(int, int, int) (*IPMreq, error) #53466
+pkg syscall (freebsd-riscv64-cgo), func GetsockoptIPMreqn(int, int, int) (*IPMreqn, error) #53466
+pkg syscall (freebsd-riscv64-cgo), func GetsockoptIPv6MTUInfo(int, int, int) (*IPv6MTUInfo, error) #53466
+pkg syscall (freebsd-riscv64-cgo), func GetsockoptIPv6Mreq(int, int, int) (*IPv6Mreq, error) #53466
+pkg syscall (freebsd-riscv64-cgo), func GetsockoptInet4Addr(int, int, int) ([4]uint8, error) #53466
+pkg syscall (freebsd-riscv64-cgo), func GetsockoptInt(int, int, int) (int, error) #53466
+pkg syscall (freebsd-riscv64-cgo), func Issetugid() bool #53466
+pkg syscall (freebsd-riscv64-cgo), func Kevent(int, []Kevent_t, []Kevent_t, *Timespec) (int, error) #53466
+pkg syscall (freebsd-riscv64-cgo), func Kill(int, Signal) error #53466
+pkg syscall (freebsd-riscv64-cgo), func Kqueue() (int, error) #53466
+pkg syscall (freebsd-riscv64-cgo), func Listen(int, int) error #53466
+pkg syscall (freebsd-riscv64-cgo), func Lstat(string, *Stat_t) error #53466
+pkg syscall (freebsd-riscv64-cgo), func Mkfifo(string, uint32) error #53466
+pkg syscall (freebsd-riscv64-cgo), func Mknod(string, uint32, uint64) error #53466
+pkg syscall (freebsd-riscv64-cgo), func Mmap(int, int64, int, int, int) ([]uint8, error) #53466
+pkg syscall (freebsd-riscv64-cgo), func Munmap([]uint8) error #53466
+pkg syscall (freebsd-riscv64-cgo), func Nanosleep(*Timespec, *Timespec) error #53466
+pkg syscall (freebsd-riscv64-cgo), func Open(string, int, uint32) (int, error) #53466
+pkg syscall (freebsd-riscv64-cgo), func ParseDirent([]uint8, int, []string) (int, int, []string) #53466
+pkg syscall (freebsd-riscv64-cgo), func ParseRoutingMessage //deprecated #53466
+pkg syscall (freebsd-riscv64-cgo), func ParseRoutingMessage([]uint8) ([]RoutingMessage, error) #53466
+pkg syscall (freebsd-riscv64-cgo), func ParseRoutingSockaddr //deprecated #53466
+pkg syscall (freebsd-riscv64-cgo), func ParseRoutingSockaddr(RoutingMessage) ([]Sockaddr, error) #53466
+pkg syscall (freebsd-riscv64-cgo), func ParseSocketControlMessage([]uint8) ([]SocketControlMessage, error) #53466
+pkg syscall (freebsd-riscv64-cgo), func ParseUnixRights(*SocketControlMessage) ([]int, error) #53466
+pkg syscall (freebsd-riscv64-cgo), func Pathconf(string, int) (int, error) #53466
+pkg syscall (freebsd-riscv64-cgo), func Pipe([]int) error #53466
+pkg syscall (freebsd-riscv64-cgo), func Pipe2([]int, int) error #53466
+pkg syscall (freebsd-riscv64-cgo), func Pread(int, []uint8, int64) (int, error) #53466
+pkg syscall (freebsd-riscv64-cgo), func Pwrite(int, []uint8, int64) (int, error) #53466
+pkg syscall (freebsd-riscv64-cgo), func RawSyscall(uintptr, uintptr, uintptr, uintptr) (uintptr, uintptr, Errno) #53466
+pkg syscall (freebsd-riscv64-cgo), func RawSyscall6(uintptr, uintptr, uintptr, uintptr, uintptr, uintptr, uintptr) (uintptr, uintptr, Errno) #53466
+pkg syscall (freebsd-riscv64-cgo), func Read(int, []uint8) (int, error) #53466
+pkg syscall (freebsd-riscv64-cgo), func ReadDirent(int, []uint8) (int, error) #53466
+pkg syscall (freebsd-riscv64-cgo), func Recvfrom(int, []uint8, int) (int, Sockaddr, error) #53466
+pkg syscall (freebsd-riscv64-cgo), func Recvmsg(int, []uint8, []uint8, int) (int, int, int, Sockaddr, error) #53466
+pkg syscall (freebsd-riscv64-cgo), func Revoke(string) error #53466
+pkg syscall (freebsd-riscv64-cgo), func RouteRIB //deprecated #53466
+pkg syscall (freebsd-riscv64-cgo), func RouteRIB(int, int) ([]uint8, error) #53466
+pkg syscall (freebsd-riscv64-cgo), func Seek(int, int64, int) (int64, error) #53466
+pkg syscall (freebsd-riscv64-cgo), func Select(int, *FdSet, *FdSet, *FdSet, *Timeval) error #53466
+pkg syscall (freebsd-riscv64-cgo), func Sendfile(int, int, *int64, int) (int, error) #53466
+pkg syscall (freebsd-riscv64-cgo), func Sendmsg(int, []uint8, []uint8, Sockaddr, int) error #53466
+pkg syscall (freebsd-riscv64-cgo), func SendmsgN(int, []uint8, []uint8, Sockaddr, int) (int, error) #53466
+pkg syscall (freebsd-riscv64-cgo), func Sendto(int, []uint8, int, Sockaddr) error #53466
+pkg syscall (freebsd-riscv64-cgo), func SetBpf //deprecated #53466
+pkg syscall (freebsd-riscv64-cgo), func SetBpf(int, []BpfInsn) error #53466
+pkg syscall (freebsd-riscv64-cgo), func SetBpfBuflen //deprecated #53466
+pkg syscall (freebsd-riscv64-cgo), func SetBpfBuflen(int, int) (int, error) #53466
+pkg syscall (freebsd-riscv64-cgo), func SetBpfDatalink //deprecated #53466
+pkg syscall (freebsd-riscv64-cgo), func SetBpfDatalink(int, int) (int, error) #53466
+pkg syscall (freebsd-riscv64-cgo), func SetBpfHeadercmpl //deprecated #53466
+pkg syscall (freebsd-riscv64-cgo), func SetBpfHeadercmpl(int, int) error #53466
+pkg syscall (freebsd-riscv64-cgo), func SetBpfImmediate //deprecated #53466
+pkg syscall (freebsd-riscv64-cgo), func SetBpfImmediate(int, int) error #53466
+pkg syscall (freebsd-riscv64-cgo), func SetBpfInterface //deprecated #53466
+pkg syscall (freebsd-riscv64-cgo), func SetBpfInterface(int, string) error #53466
+pkg syscall (freebsd-riscv64-cgo), func SetBpfPromisc //deprecated #53466
+pkg syscall (freebsd-riscv64-cgo), func SetBpfPromisc(int, int) error #53466
+pkg syscall (freebsd-riscv64-cgo), func SetBpfTimeout //deprecated #53466
+pkg syscall (freebsd-riscv64-cgo), func SetBpfTimeout(int, *Timeval) error #53466
+pkg syscall (freebsd-riscv64-cgo), func SetKevent(*Kevent_t, int, int, int) #53466
+pkg syscall (freebsd-riscv64-cgo), func SetNonblock(int, bool) error #53466
+pkg syscall (freebsd-riscv64-cgo), func Setegid(int) error #53466
+pkg syscall (freebsd-riscv64-cgo), func Seteuid(int) error #53466
+pkg syscall (freebsd-riscv64-cgo), func Setgid(int) error #53466
+pkg syscall (freebsd-riscv64-cgo), func Setgroups([]int) error #53466
+pkg syscall (freebsd-riscv64-cgo), func Setlogin(string) error #53466
+pkg syscall (freebsd-riscv64-cgo), func Setpgid(int, int) error #53466
+pkg syscall (freebsd-riscv64-cgo), func Setpriority(int, int, int) error #53466
+pkg syscall (freebsd-riscv64-cgo), func Setregid(int, int) error #53466
+pkg syscall (freebsd-riscv64-cgo), func Setreuid(int, int) error #53466
+pkg syscall (freebsd-riscv64-cgo), func Setrlimit(int, *Rlimit) error #53466
+pkg syscall (freebsd-riscv64-cgo), func Setsid() (int, error) #53466
+pkg syscall (freebsd-riscv64-cgo), func SetsockoptByte(int, int, int, uint8) error #53466
+pkg syscall (freebsd-riscv64-cgo), func SetsockoptICMPv6Filter(int, int, int, *ICMPv6Filter) error #53466
+pkg syscall (freebsd-riscv64-cgo), func SetsockoptIPMreq(int, int, int, *IPMreq) error #53466
+pkg syscall (freebsd-riscv64-cgo), func SetsockoptIPMreqn(int, int, int, *IPMreqn) error #53466
+pkg syscall (freebsd-riscv64-cgo), func SetsockoptIPv6Mreq(int, int, int, *IPv6Mreq) error #53466
+pkg syscall (freebsd-riscv64-cgo), func SetsockoptInet4Addr(int, int, int, [4]uint8) error #53466
+pkg syscall (freebsd-riscv64-cgo), func SetsockoptInt(int, int, int, int) error #53466
+pkg syscall (freebsd-riscv64-cgo), func SetsockoptLinger(int, int, int, *Linger) error #53466
+pkg syscall (freebsd-riscv64-cgo), func SetsockoptString(int, int, int, string) error #53466
+pkg syscall (freebsd-riscv64-cgo), func SetsockoptTimeval(int, int, int, *Timeval) error #53466
+pkg syscall (freebsd-riscv64-cgo), func Settimeofday(*Timeval) error #53466
+pkg syscall (freebsd-riscv64-cgo), func Setuid(int) error #53466
+pkg syscall (freebsd-riscv64-cgo), func Shutdown(int, int) error #53466
+pkg syscall (freebsd-riscv64-cgo), func SlicePtrFromStrings([]string) ([]*uint8, error) #53466
+pkg syscall (freebsd-riscv64-cgo), func Socket(int, int, int) (int, error) #53466
+pkg syscall (freebsd-riscv64-cgo), func Socketpair(int, int, int) ([2]int, error) #53466
+pkg syscall (freebsd-riscv64-cgo), func Stat(string, *Stat_t) error #53466
+pkg syscall (freebsd-riscv64-cgo), func Statfs(string, *Statfs_t) error #53466
+pkg syscall (freebsd-riscv64-cgo), func StringSlicePtr //deprecated #53466
+pkg syscall (freebsd-riscv64-cgo), func StringSlicePtr([]string) []*uint8 #53466
+pkg syscall (freebsd-riscv64-cgo), func Sync() error #53466
+pkg syscall (freebsd-riscv64-cgo), func Syscall(uintptr, uintptr, uintptr, uintptr) (uintptr, uintptr, Errno) #53466
+pkg syscall (freebsd-riscv64-cgo), func Syscall6(uintptr, uintptr, uintptr, uintptr, uintptr, uintptr, uintptr) (uintptr, uintptr, Errno) #53466
+pkg syscall (freebsd-riscv64-cgo), func Syscall9(uintptr, uintptr, uintptr, uintptr, uintptr, uintptr, uintptr, uintptr, uintptr, uintptr) (uintptr, uintptr, Errno) #53466
+pkg syscall (freebsd-riscv64-cgo), func Sysctl(string) (string, error) #53466
+pkg syscall (freebsd-riscv64-cgo), func SysctlUint32(string) (uint32, error) #53466
+pkg syscall (freebsd-riscv64-cgo), func TimevalToNsec(Timeval) int64 #53466
+pkg syscall (freebsd-riscv64-cgo), func Truncate(string, int64) error #53466
+pkg syscall (freebsd-riscv64-cgo), func Umask(int) int #53466
+pkg syscall (freebsd-riscv64-cgo), func Undelete(string) error #53466
+pkg syscall (freebsd-riscv64-cgo), func UnixRights(...int) []uint8 #53466
+pkg syscall (freebsd-riscv64-cgo), func Unmount(string, int) error #53466
+pkg syscall (freebsd-riscv64-cgo), func Wait4(int, *WaitStatus, int, *Rusage) (int, error) #53466
+pkg syscall (freebsd-riscv64-cgo), func Write(int, []uint8) (int, error) #53466
+pkg syscall (freebsd-riscv64-cgo), method (*Cmsghdr) SetLen(int) #53466
+pkg syscall (freebsd-riscv64-cgo), method (*Iovec) SetLen(int) #53466
+pkg syscall (freebsd-riscv64-cgo), method (*Msghdr) SetControllen(int) #53466
+pkg syscall (freebsd-riscv64-cgo), type BpfHdr struct #53466
+pkg syscall (freebsd-riscv64-cgo), type BpfHdr struct, Caplen uint32 #53466
+pkg syscall (freebsd-riscv64-cgo), type BpfHdr struct, Datalen uint32 #53466
+pkg syscall (freebsd-riscv64-cgo), type BpfHdr struct, Hdrlen uint16 #53466
+pkg syscall (freebsd-riscv64-cgo), type BpfHdr struct, Pad_cgo_0 [6]uint8 #53466
+pkg syscall (freebsd-riscv64-cgo), type BpfHdr struct, Tstamp Timeval #53466
+pkg syscall (freebsd-riscv64-cgo), type BpfInsn struct #53466
+pkg syscall (freebsd-riscv64-cgo), type BpfInsn struct, Code uint16 #53466
+pkg syscall (freebsd-riscv64-cgo), type BpfInsn struct, Jf uint8 #53466
+pkg syscall (freebsd-riscv64-cgo), type BpfInsn struct, Jt uint8 #53466
+pkg syscall (freebsd-riscv64-cgo), type BpfInsn struct, K uint32 #53466
+pkg syscall (freebsd-riscv64-cgo), type BpfProgram struct #53466
+pkg syscall (freebsd-riscv64-cgo), type BpfProgram struct, Insns *BpfInsn #53466
+pkg syscall (freebsd-riscv64-cgo), type BpfProgram struct, Len uint32 #53466
+pkg syscall (freebsd-riscv64-cgo), type BpfProgram struct, Pad_cgo_0 [4]uint8 #53466
+pkg syscall (freebsd-riscv64-cgo), type BpfStat struct #53466
+pkg syscall (freebsd-riscv64-cgo), type BpfStat struct, Drop uint32 #53466
+pkg syscall (freebsd-riscv64-cgo), type BpfStat struct, Recv uint32 #53466
+pkg syscall (freebsd-riscv64-cgo), type BpfVersion struct #53466
+pkg syscall (freebsd-riscv64-cgo), type BpfVersion struct, Major uint16 #53466
+pkg syscall (freebsd-riscv64-cgo), type BpfVersion struct, Minor uint16 #53466
+pkg syscall (freebsd-riscv64-cgo), type BpfZbuf struct #53466
+pkg syscall (freebsd-riscv64-cgo), type BpfZbuf struct, Bufa *uint8 #53466
+pkg syscall (freebsd-riscv64-cgo), type BpfZbuf struct, Bufb *uint8 #53466
+pkg syscall (freebsd-riscv64-cgo), type BpfZbuf struct, Buflen uint64 #53466
+pkg syscall (freebsd-riscv64-cgo), type BpfZbufHeader struct #53466
+pkg syscall (freebsd-riscv64-cgo), type BpfZbufHeader struct, Kernel_gen uint32 #53466
+pkg syscall (freebsd-riscv64-cgo), type BpfZbufHeader struct, Kernel_len uint32 #53466
+pkg syscall (freebsd-riscv64-cgo), type BpfZbufHeader struct, User_gen uint32 #53466
+pkg syscall (freebsd-riscv64-cgo), type BpfZbufHeader struct, X_bzh_pad [5]uint32 #53466
+pkg syscall (freebsd-riscv64-cgo), type Cmsghdr struct #53466
+pkg syscall (freebsd-riscv64-cgo), type Cmsghdr struct, Len uint32 #53466
+pkg syscall (freebsd-riscv64-cgo), type Cmsghdr struct, Level int32 #53466
+pkg syscall (freebsd-riscv64-cgo), type Cmsghdr struct, Type int32 #53466
+pkg syscall (freebsd-riscv64-cgo), type Credential struct #53466
+pkg syscall (freebsd-riscv64-cgo), type Credential struct, Gid uint32 #53466
+pkg syscall (freebsd-riscv64-cgo), type Credential struct, Groups []uint32 #53466
+pkg syscall (freebsd-riscv64-cgo), type Credential struct, NoSetGroups bool #53466
+pkg syscall (freebsd-riscv64-cgo), type Credential struct, Uid uint32 #53466
+pkg syscall (freebsd-riscv64-cgo), type Dirent struct #53466
+pkg syscall (freebsd-riscv64-cgo), type Dirent struct, Fileno uint64 #53466
+pkg syscall (freebsd-riscv64-cgo), type Dirent struct, Name [256]int8 #53466
+pkg syscall (freebsd-riscv64-cgo), type Dirent struct, Namlen uint16 #53466
+pkg syscall (freebsd-riscv64-cgo), type Dirent struct, Off int64 #53466
+pkg syscall (freebsd-riscv64-cgo), type Dirent struct, Pad0 uint8 #53466
+pkg syscall (freebsd-riscv64-cgo), type Dirent struct, Pad1 uint16 #53466
+pkg syscall (freebsd-riscv64-cgo), type Dirent struct, Reclen uint16 #53466
+pkg syscall (freebsd-riscv64-cgo), type Dirent struct, Type uint8 #53466
+pkg syscall (freebsd-riscv64-cgo), type FdSet struct #53466
+pkg syscall (freebsd-riscv64-cgo), type FdSet struct, X__fds_bits [16]uint64 #53466
+pkg syscall (freebsd-riscv64-cgo), type Flock_t struct #53466
+pkg syscall (freebsd-riscv64-cgo), type Flock_t struct, Len int64 #53466
+pkg syscall (freebsd-riscv64-cgo), type Flock_t struct, Pad_cgo_0 [4]uint8 #53466
+pkg syscall (freebsd-riscv64-cgo), type Flock_t struct, Pid int32 #53466
+pkg syscall (freebsd-riscv64-cgo), type Flock_t struct, Start int64 #53466
+pkg syscall (freebsd-riscv64-cgo), type Flock_t struct, Sysid int32 #53466
+pkg syscall (freebsd-riscv64-cgo), type Flock_t struct, Type int16 #53466
+pkg syscall (freebsd-riscv64-cgo), type Flock_t struct, Whence int16 #53466
+pkg syscall (freebsd-riscv64-cgo), type Fsid struct #53466
+pkg syscall (freebsd-riscv64-cgo), type Fsid struct, Val [2]int32 #53466
+pkg syscall (freebsd-riscv64-cgo), type ICMPv6Filter struct #53466
+pkg syscall (freebsd-riscv64-cgo), type ICMPv6Filter struct, Filt [8]uint32 #53466
+pkg syscall (freebsd-riscv64-cgo), type IPMreqn struct #53466
+pkg syscall (freebsd-riscv64-cgo), type IPMreqn struct, Address [4]uint8 #53466
+pkg syscall (freebsd-riscv64-cgo), type IPMreqn struct, Ifindex int32 #53466
+pkg syscall (freebsd-riscv64-cgo), type IPMreqn struct, Multiaddr [4]uint8 #53466
+pkg syscall (freebsd-riscv64-cgo), type IPv6MTUInfo struct #53466
+pkg syscall (freebsd-riscv64-cgo), type IPv6MTUInfo struct, Addr RawSockaddrInet6 #53466
+pkg syscall (freebsd-riscv64-cgo), type IPv6MTUInfo struct, Mtu uint32 #53466
+pkg syscall (freebsd-riscv64-cgo), type IfAnnounceMsghdr struct #53466
+pkg syscall (freebsd-riscv64-cgo), type IfAnnounceMsghdr struct, Index uint16 #53466
+pkg syscall (freebsd-riscv64-cgo), type IfAnnounceMsghdr struct, Msglen uint16 #53466
+pkg syscall (freebsd-riscv64-cgo), type IfAnnounceMsghdr struct, Name [16]int8 #53466
+pkg syscall (freebsd-riscv64-cgo), type IfAnnounceMsghdr struct, Type uint8 #53466
+pkg syscall (freebsd-riscv64-cgo), type IfAnnounceMsghdr struct, Version uint8 #53466
+pkg syscall (freebsd-riscv64-cgo), type IfAnnounceMsghdr struct, What uint16 #53466
+pkg syscall (freebsd-riscv64-cgo), type IfData struct #53466
+pkg syscall (freebsd-riscv64-cgo), type IfData struct, Addrlen uint8 #53466
+pkg syscall (freebsd-riscv64-cgo), type IfData struct, Baudrate uint64 #53466
+pkg syscall (freebsd-riscv64-cgo), type IfData struct, Collisions uint64 #53466
+pkg syscall (freebsd-riscv64-cgo), type IfData struct, Datalen uint8 #53466
+pkg syscall (freebsd-riscv64-cgo), type IfData struct, Epoch int64 #53466
+pkg syscall (freebsd-riscv64-cgo), type IfData struct, Hdrlen uint8 #53466
+pkg syscall (freebsd-riscv64-cgo), type IfData struct, Hwassist uint64 #53466
+pkg syscall (freebsd-riscv64-cgo), type IfData struct, Ibytes uint64 #53466
+pkg syscall (freebsd-riscv64-cgo), type IfData struct, Ierrors uint64 #53466
+pkg syscall (freebsd-riscv64-cgo), type IfData struct, Imcasts uint64 #53466
+pkg syscall (freebsd-riscv64-cgo), type IfData struct, Ipackets uint64 #53466
+pkg syscall (freebsd-riscv64-cgo), type IfData struct, Iqdrops uint64 #53466
+pkg syscall (freebsd-riscv64-cgo), type IfData struct, Lastchange Timeval #53466
+pkg syscall (freebsd-riscv64-cgo), type IfData struct, Link_state uint8 #53466
+pkg syscall (freebsd-riscv64-cgo), type IfData struct, Metric uint64 #53466
+pkg syscall (freebsd-riscv64-cgo), type IfData struct, Mtu uint64 #53466
+pkg syscall (freebsd-riscv64-cgo), type IfData struct, Noproto uint64 #53466
+pkg syscall (freebsd-riscv64-cgo), type IfData struct, Obytes uint64 #53466
+pkg syscall (freebsd-riscv64-cgo), type IfData struct, Oerrors uint64 #53466
+pkg syscall (freebsd-riscv64-cgo), type IfData struct, Omcasts uint64 #53466
+pkg syscall (freebsd-riscv64-cgo), type IfData struct, Opackets uint64 #53466
+pkg syscall (freebsd-riscv64-cgo), type IfData struct, Physical uint8 #53466
+pkg syscall (freebsd-riscv64-cgo), type IfData struct, Spare_char1 uint8 #53466
+pkg syscall (freebsd-riscv64-cgo), type IfData struct, Spare_char2 uint8 #53466
+pkg syscall (freebsd-riscv64-cgo), type IfData struct, Type uint8 #53466
+pkg syscall (freebsd-riscv64-cgo), type IfMsghdr struct #53466
+pkg syscall (freebsd-riscv64-cgo), type IfMsghdr struct, Addrs int32 #53466
+pkg syscall (freebsd-riscv64-cgo), type IfMsghdr struct, Data IfData #53466
+pkg syscall (freebsd-riscv64-cgo), type IfMsghdr struct, Flags int32 #53466
+pkg syscall (freebsd-riscv64-cgo), type IfMsghdr struct, Index uint16 #53466
+pkg syscall (freebsd-riscv64-cgo), type IfMsghdr struct, Msglen uint16 #53466
+pkg syscall (freebsd-riscv64-cgo), type IfMsghdr struct, Pad_cgo_0 [2]uint8 #53466
+pkg syscall (freebsd-riscv64-cgo), type IfMsghdr struct, Type uint8 #53466
+pkg syscall (freebsd-riscv64-cgo), type IfMsghdr struct, Version uint8 #53466
+pkg syscall (freebsd-riscv64-cgo), type IfaMsghdr struct #53466
+pkg syscall (freebsd-riscv64-cgo), type IfaMsghdr struct, Addrs int32 #53466
+pkg syscall (freebsd-riscv64-cgo), type IfaMsghdr struct, Flags int32 #53466
+pkg syscall (freebsd-riscv64-cgo), type IfaMsghdr struct, Index uint16 #53466
+pkg syscall (freebsd-riscv64-cgo), type IfaMsghdr struct, Metric int32 #53466
+pkg syscall (freebsd-riscv64-cgo), type IfaMsghdr struct, Msglen uint16 #53466
+pkg syscall (freebsd-riscv64-cgo), type IfaMsghdr struct, Pad_cgo_0 [2]uint8 #53466
+pkg syscall (freebsd-riscv64-cgo), type IfaMsghdr struct, Type uint8 #53466
+pkg syscall (freebsd-riscv64-cgo), type IfaMsghdr struct, Version uint8 #53466
+pkg syscall (freebsd-riscv64-cgo), type IfmaMsghdr struct #53466
+pkg syscall (freebsd-riscv64-cgo), type IfmaMsghdr struct, Addrs int32 #53466
+pkg syscall (freebsd-riscv64-cgo), type IfmaMsghdr struct, Flags int32 #53466
+pkg syscall (freebsd-riscv64-cgo), type IfmaMsghdr struct, Index uint16 #53466
+pkg syscall (freebsd-riscv64-cgo), type IfmaMsghdr struct, Msglen uint16 #53466
+pkg syscall (freebsd-riscv64-cgo), type IfmaMsghdr struct, Pad_cgo_0 [2]uint8 #53466
+pkg syscall (freebsd-riscv64-cgo), type IfmaMsghdr struct, Type uint8 #53466
+pkg syscall (freebsd-riscv64-cgo), type IfmaMsghdr struct, Version uint8 #53466
+pkg syscall (freebsd-riscv64-cgo), type Inet6Pktinfo struct #53466
+pkg syscall (freebsd-riscv64-cgo), type Inet6Pktinfo struct, Addr [16]uint8 #53466
+pkg syscall (freebsd-riscv64-cgo), type Inet6Pktinfo struct, Ifindex uint32 #53466
+pkg syscall (freebsd-riscv64-cgo), type InterfaceAddrMessage //deprecated #53466
+pkg syscall (freebsd-riscv64-cgo), type InterfaceAddrMessage struct #53466
+pkg syscall (freebsd-riscv64-cgo), type InterfaceAddrMessage struct, Data []uint8 #53466
+pkg syscall (freebsd-riscv64-cgo), type InterfaceAddrMessage struct, Header IfaMsghdr #53466
+pkg syscall (freebsd-riscv64-cgo), type InterfaceAnnounceMessage //deprecated #53466
+pkg syscall (freebsd-riscv64-cgo), type InterfaceAnnounceMessage struct #53466
+pkg syscall (freebsd-riscv64-cgo), type InterfaceAnnounceMessage struct, Header IfAnnounceMsghdr #53466
+pkg syscall (freebsd-riscv64-cgo), type InterfaceMessage //deprecated #53466
+pkg syscall (freebsd-riscv64-cgo), type InterfaceMessage struct #53466
+pkg syscall (freebsd-riscv64-cgo), type InterfaceMessage struct, Data []uint8 #53466
+pkg syscall (freebsd-riscv64-cgo), type InterfaceMessage struct, Header IfMsghdr #53466
+pkg syscall (freebsd-riscv64-cgo), type InterfaceMulticastAddrMessage //deprecated #53466
+pkg syscall (freebsd-riscv64-cgo), type InterfaceMulticastAddrMessage struct #53466
+pkg syscall (freebsd-riscv64-cgo), type InterfaceMulticastAddrMessage struct, Data []uint8 #53466
+pkg syscall (freebsd-riscv64-cgo), type InterfaceMulticastAddrMessage struct, Header IfmaMsghdr #53466
+pkg syscall (freebsd-riscv64-cgo), type Iovec struct #53466
+pkg syscall (freebsd-riscv64-cgo), type Iovec struct, Base *uint8 #53466
+pkg syscall (freebsd-riscv64-cgo), type Iovec struct, Len uint64 #53466
+pkg syscall (freebsd-riscv64-cgo), type Kevent_t struct #53466
+pkg syscall (freebsd-riscv64-cgo), type Kevent_t struct, Data int64 #53466
+pkg syscall (freebsd-riscv64-cgo), type Kevent_t struct, Fflags uint32 #53466
+pkg syscall (freebsd-riscv64-cgo), type Kevent_t struct, Filter int16 #53466
+pkg syscall (freebsd-riscv64-cgo), type Kevent_t struct, Flags uint16 #53466
+pkg syscall (freebsd-riscv64-cgo), type Kevent_t struct, Ident uint64 #53466
+pkg syscall (freebsd-riscv64-cgo), type Kevent_t struct, Udata *uint8 #53466
+pkg syscall (freebsd-riscv64-cgo), type Msghdr struct #53466
+pkg syscall (freebsd-riscv64-cgo), type Msghdr struct, Control *uint8 #53466
+pkg syscall (freebsd-riscv64-cgo), type Msghdr struct, Controllen uint32 #53466
+pkg syscall (freebsd-riscv64-cgo), type Msghdr struct, Flags int32 #53466
+pkg syscall (freebsd-riscv64-cgo), type Msghdr struct, Iov *Iovec #53466
+pkg syscall (freebsd-riscv64-cgo), type Msghdr struct, Iovlen int32 #53466
+pkg syscall (freebsd-riscv64-cgo), type Msghdr struct, Name *uint8 #53466
+pkg syscall (freebsd-riscv64-cgo), type Msghdr struct, Namelen uint32 #53466
+pkg syscall (freebsd-riscv64-cgo), type Msghdr struct, Pad_cgo_0 [4]uint8 #53466
+pkg syscall (freebsd-riscv64-cgo), type Msghdr struct, Pad_cgo_1 [4]uint8 #53466
+pkg syscall (freebsd-riscv64-cgo), type RawSockaddr struct, Data [14]int8 #53466
+pkg syscall (freebsd-riscv64-cgo), type RawSockaddr struct, Family uint8 #53466
+pkg syscall (freebsd-riscv64-cgo), type RawSockaddr struct, Len uint8 #53466
+pkg syscall (freebsd-riscv64-cgo), type RawSockaddrAny struct, Pad [92]int8 #53466
+pkg syscall (freebsd-riscv64-cgo), type RawSockaddrDatalink struct #53466
+pkg syscall (freebsd-riscv64-cgo), type RawSockaddrDatalink struct, Alen uint8 #53466
+pkg syscall (freebsd-riscv64-cgo), type RawSockaddrDatalink struct, Data [46]int8 #53466
+pkg syscall (freebsd-riscv64-cgo), type RawSockaddrDatalink struct, Family uint8 #53466
+pkg syscall (freebsd-riscv64-cgo), type RawSockaddrDatalink struct, Index uint16 #53466
+pkg syscall (freebsd-riscv64-cgo), type RawSockaddrDatalink struct, Len uint8 #53466
+pkg syscall (freebsd-riscv64-cgo), type RawSockaddrDatalink struct, Nlen uint8 #53466
+pkg syscall (freebsd-riscv64-cgo), type RawSockaddrDatalink struct, Slen uint8 #53466
+pkg syscall (freebsd-riscv64-cgo), type RawSockaddrDatalink struct, Type uint8 #53466
+pkg syscall (freebsd-riscv64-cgo), type RawSockaddrInet4 struct, Family uint8 #53466
+pkg syscall (freebsd-riscv64-cgo), type RawSockaddrInet4 struct, Len uint8 #53466
+pkg syscall (freebsd-riscv64-cgo), type RawSockaddrInet4 struct, Zero [8]int8 #53466
+pkg syscall (freebsd-riscv64-cgo), type RawSockaddrInet6 struct, Family uint8 #53466
+pkg syscall (freebsd-riscv64-cgo), type RawSockaddrInet6 struct, Len uint8 #53466
+pkg syscall (freebsd-riscv64-cgo), type RawSockaddrUnix struct, Family uint8 #53466
+pkg syscall (freebsd-riscv64-cgo), type RawSockaddrUnix struct, Len uint8 #53466
+pkg syscall (freebsd-riscv64-cgo), type RawSockaddrUnix struct, Path [104]int8 #53466
+pkg syscall (freebsd-riscv64-cgo), type Rlimit struct #53466
+pkg syscall (freebsd-riscv64-cgo), type Rlimit struct, Cur int64 #53466
+pkg syscall (freebsd-riscv64-cgo), type Rlimit struct, Max int64 #53466
+pkg syscall (freebsd-riscv64-cgo), type RouteMessage //deprecated #53466
+pkg syscall (freebsd-riscv64-cgo), type RouteMessage struct #53466
+pkg syscall (freebsd-riscv64-cgo), type RouteMessage struct, Data []uint8 #53466
+pkg syscall (freebsd-riscv64-cgo), type RouteMessage struct, Header RtMsghdr #53466
+pkg syscall (freebsd-riscv64-cgo), type RoutingMessage //deprecated #53466
+pkg syscall (freebsd-riscv64-cgo), type RoutingMessage interface, unexported methods #53466
+pkg syscall (freebsd-riscv64-cgo), type RtMetrics struct #53466
+pkg syscall (freebsd-riscv64-cgo), type RtMetrics struct, Expire uint64 #53466
+pkg syscall (freebsd-riscv64-cgo), type RtMetrics struct, Filler [3]uint64 #53466
+pkg syscall (freebsd-riscv64-cgo), type RtMetrics struct, Hopcount uint64 #53466
+pkg syscall (freebsd-riscv64-cgo), type RtMetrics struct, Locks uint64 #53466
+pkg syscall (freebsd-riscv64-cgo), type RtMetrics struct, Mtu uint64 #53466
+pkg syscall (freebsd-riscv64-cgo), type RtMetrics struct, Pksent uint64 #53466
+pkg syscall (freebsd-riscv64-cgo), type RtMetrics struct, Recvpipe uint64 #53466
+pkg syscall (freebsd-riscv64-cgo), type RtMetrics struct, Rtt uint64 #53466
+pkg syscall (freebsd-riscv64-cgo), type RtMetrics struct, Rttvar uint64 #53466
+pkg syscall (freebsd-riscv64-cgo), type RtMetrics struct, Sendpipe uint64 #53466
+pkg syscall (freebsd-riscv64-cgo), type RtMetrics struct, Ssthresh uint64 #53466
+pkg syscall (freebsd-riscv64-cgo), type RtMetrics struct, Weight uint64 #53466
+pkg syscall (freebsd-riscv64-cgo), type RtMsghdr struct #53466
+pkg syscall (freebsd-riscv64-cgo), type RtMsghdr struct, Addrs int32 #53466
+pkg syscall (freebsd-riscv64-cgo), type RtMsghdr struct, Errno int32 #53466
+pkg syscall (freebsd-riscv64-cgo), type RtMsghdr struct, Flags int32 #53466
+pkg syscall (freebsd-riscv64-cgo), type RtMsghdr struct, Fmask int32 #53466
+pkg syscall (freebsd-riscv64-cgo), type RtMsghdr struct, Index uint16 #53466
+pkg syscall (freebsd-riscv64-cgo), type RtMsghdr struct, Inits uint64 #53466
+pkg syscall (freebsd-riscv64-cgo), type RtMsghdr struct, Msglen uint16 #53466
+pkg syscall (freebsd-riscv64-cgo), type RtMsghdr struct, Pad_cgo_0 [2]uint8 #53466
+pkg syscall (freebsd-riscv64-cgo), type RtMsghdr struct, Pid int32 #53466
+pkg syscall (freebsd-riscv64-cgo), type RtMsghdr struct, Rmx RtMetrics #53466
+pkg syscall (freebsd-riscv64-cgo), type RtMsghdr struct, Seq int32 #53466
+pkg syscall (freebsd-riscv64-cgo), type RtMsghdr struct, Type uint8 #53466
+pkg syscall (freebsd-riscv64-cgo), type RtMsghdr struct, Version uint8 #53466
+pkg syscall (freebsd-riscv64-cgo), type Rusage struct, Idrss int64 #53466
+pkg syscall (freebsd-riscv64-cgo), type Rusage struct, Inblock int64 #53466
+pkg syscall (freebsd-riscv64-cgo), type Rusage struct, Isrss int64 #53466
+pkg syscall (freebsd-riscv64-cgo), type Rusage struct, Ixrss int64 #53466
+pkg syscall (freebsd-riscv64-cgo), type Rusage struct, Majflt int64 #53466
+pkg syscall (freebsd-riscv64-cgo), type Rusage struct, Maxrss int64 #53466
+pkg syscall (freebsd-riscv64-cgo), type Rusage struct, Minflt int64 #53466
+pkg syscall (freebsd-riscv64-cgo), type Rusage struct, Msgrcv int64 #53466
+pkg syscall (freebsd-riscv64-cgo), type Rusage struct, Msgsnd int64 #53466
+pkg syscall (freebsd-riscv64-cgo), type Rusage struct, Nivcsw int64 #53466
+pkg syscall (freebsd-riscv64-cgo), type Rusage struct, Nsignals int64 #53466
+pkg syscall (freebsd-riscv64-cgo), type Rusage struct, Nswap int64 #53466
+pkg syscall (freebsd-riscv64-cgo), type Rusage struct, Nvcsw int64 #53466
+pkg syscall (freebsd-riscv64-cgo), type Rusage struct, Oublock int64 #53466
+pkg syscall (freebsd-riscv64-cgo), type Rusage struct, Stime Timeval #53466
+pkg syscall (freebsd-riscv64-cgo), type Rusage struct, Utime Timeval #53466
+pkg syscall (freebsd-riscv64-cgo), type SockaddrDatalink struct #53466
+pkg syscall (freebsd-riscv64-cgo), type SockaddrDatalink struct, Alen uint8 #53466
+pkg syscall (freebsd-riscv64-cgo), type SockaddrDatalink struct, Data [46]int8 #53466
+pkg syscall (freebsd-riscv64-cgo), type SockaddrDatalink struct, Family uint8 #53466
+pkg syscall (freebsd-riscv64-cgo), type SockaddrDatalink struct, Index uint16 #53466
+pkg syscall (freebsd-riscv64-cgo), type SockaddrDatalink struct, Len uint8 #53466
+pkg syscall (freebsd-riscv64-cgo), type SockaddrDatalink struct, Nlen uint8 #53466
+pkg syscall (freebsd-riscv64-cgo), type SockaddrDatalink struct, Slen uint8 #53466
+pkg syscall (freebsd-riscv64-cgo), type SockaddrDatalink struct, Type uint8 #53466
+pkg syscall (freebsd-riscv64-cgo), type SocketControlMessage struct #53466
+pkg syscall (freebsd-riscv64-cgo), type SocketControlMessage struct, Data []uint8 #53466
+pkg syscall (freebsd-riscv64-cgo), type SocketControlMessage struct, Header Cmsghdr #53466
+pkg syscall (freebsd-riscv64-cgo), type Stat_t struct #53466
+pkg syscall (freebsd-riscv64-cgo), type Stat_t struct, Atimespec Timespec #53466
+pkg syscall (freebsd-riscv64-cgo), type Stat_t struct, Birthtimespec Timespec #53466
+pkg syscall (freebsd-riscv64-cgo), type Stat_t struct, Blksize int32 #53466
+pkg syscall (freebsd-riscv64-cgo), type Stat_t struct, Blocks int64 #53466
+pkg syscall (freebsd-riscv64-cgo), type Stat_t struct, Ctimespec Timespec #53466
+pkg syscall (freebsd-riscv64-cgo), type Stat_t struct, Dev uint64 #53466
+pkg syscall (freebsd-riscv64-cgo), type Stat_t struct, Flags uint32 #53466
+pkg syscall (freebsd-riscv64-cgo), type Stat_t struct, Gen uint64 #53466
+pkg syscall (freebsd-riscv64-cgo), type Stat_t struct, Gid uint32 #53466
+pkg syscall (freebsd-riscv64-cgo), type Stat_t struct, Ino uint64 #53466
+pkg syscall (freebsd-riscv64-cgo), type Stat_t struct, Mode uint16 #53466
+pkg syscall (freebsd-riscv64-cgo), type Stat_t struct, Mtimespec Timespec #53466
+pkg syscall (freebsd-riscv64-cgo), type Stat_t struct, Nlink uint64 #53466
+pkg syscall (freebsd-riscv64-cgo), type Stat_t struct, Padding0 int16 #53466
+pkg syscall (freebsd-riscv64-cgo), type Stat_t struct, Padding1 int32 #53466
+pkg syscall (freebsd-riscv64-cgo), type Stat_t struct, Rdev uint64 #53466
+pkg syscall (freebsd-riscv64-cgo), type Stat_t struct, Size int64 #53466
+pkg syscall (freebsd-riscv64-cgo), type Stat_t struct, Spare [10]uint64 #53466
+pkg syscall (freebsd-riscv64-cgo), type Stat_t struct, Uid uint32 #53466
+pkg syscall (freebsd-riscv64-cgo), type Statfs_t struct #53466
+pkg syscall (freebsd-riscv64-cgo), type Statfs_t struct, Asyncreads uint64 #53466
+pkg syscall (freebsd-riscv64-cgo), type Statfs_t struct, Asyncwrites uint64 #53466
+pkg syscall (freebsd-riscv64-cgo), type Statfs_t struct, Bavail int64 #53466
+pkg syscall (freebsd-riscv64-cgo), type Statfs_t struct, Bfree uint64 #53466
+pkg syscall (freebsd-riscv64-cgo), type Statfs_t struct, Blocks uint64 #53466
+pkg syscall (freebsd-riscv64-cgo), type Statfs_t struct, Bsize uint64 #53466
+pkg syscall (freebsd-riscv64-cgo), type Statfs_t struct, Charspare [80]int8 #53466
+pkg syscall (freebsd-riscv64-cgo), type Statfs_t struct, Ffree int64 #53466
+pkg syscall (freebsd-riscv64-cgo), type Statfs_t struct, Files uint64 #53466
+pkg syscall (freebsd-riscv64-cgo), type Statfs_t struct, Flags uint64 #53466
+pkg syscall (freebsd-riscv64-cgo), type Statfs_t struct, Fsid Fsid #53466
+pkg syscall (freebsd-riscv64-cgo), type Statfs_t struct, Fstypename [16]int8 #53466
+pkg syscall (freebsd-riscv64-cgo), type Statfs_t struct, Iosize uint64 #53466
+pkg syscall (freebsd-riscv64-cgo), type Statfs_t struct, Mntfromname [1024]int8 #53466
+pkg syscall (freebsd-riscv64-cgo), type Statfs_t struct, Mntonname [1024]int8 #53466
+pkg syscall (freebsd-riscv64-cgo), type Statfs_t struct, Namemax uint32 #53466
+pkg syscall (freebsd-riscv64-cgo), type Statfs_t struct, Owner uint32 #53466
+pkg syscall (freebsd-riscv64-cgo), type Statfs_t struct, Spare [10]uint64 #53466
+pkg syscall (freebsd-riscv64-cgo), type Statfs_t struct, Syncreads uint64 #53466
+pkg syscall (freebsd-riscv64-cgo), type Statfs_t struct, Syncwrites uint64 #53466
+pkg syscall (freebsd-riscv64-cgo), type Statfs_t struct, Type uint32 #53466
+pkg syscall (freebsd-riscv64-cgo), type Statfs_t struct, Version uint32 #53466
+pkg syscall (freebsd-riscv64-cgo), type SysProcAttr struct, Chroot string #53466
+pkg syscall (freebsd-riscv64-cgo), type SysProcAttr struct, Credential *Credential #53466
+pkg syscall (freebsd-riscv64-cgo), type SysProcAttr struct, Ctty int #53466
+pkg syscall (freebsd-riscv64-cgo), type SysProcAttr struct, Foreground bool #53466
+pkg syscall (freebsd-riscv64-cgo), type SysProcAttr struct, Noctty bool #53466
+pkg syscall (freebsd-riscv64-cgo), type SysProcAttr struct, Pdeathsig Signal #53466
+pkg syscall (freebsd-riscv64-cgo), type SysProcAttr struct, Pgid int #53466
+pkg syscall (freebsd-riscv64-cgo), type SysProcAttr struct, Ptrace bool #53466
+pkg syscall (freebsd-riscv64-cgo), type SysProcAttr struct, Setctty bool #53466
+pkg syscall (freebsd-riscv64-cgo), type SysProcAttr struct, Setpgid bool #53466
+pkg syscall (freebsd-riscv64-cgo), type SysProcAttr struct, Setsid bool #53466
+pkg syscall (freebsd-riscv64-cgo), type Termios struct #53466
+pkg syscall (freebsd-riscv64-cgo), type Termios struct, Cc [20]uint8 #53466
+pkg syscall (freebsd-riscv64-cgo), type Termios struct, Cflag uint32 #53466
+pkg syscall (freebsd-riscv64-cgo), type Termios struct, Iflag uint32 #53466
+pkg syscall (freebsd-riscv64-cgo), type Termios struct, Ispeed uint32 #53466
+pkg syscall (freebsd-riscv64-cgo), type Termios struct, Lflag uint32 #53466
+pkg syscall (freebsd-riscv64-cgo), type Termios struct, Oflag uint32 #53466
+pkg syscall (freebsd-riscv64-cgo), type Termios struct, Ospeed uint32 #53466
+pkg syscall (freebsd-riscv64-cgo), type Timespec struct, Nsec int64 #53466
+pkg syscall (freebsd-riscv64-cgo), type Timespec struct, Sec int64 #53466
+pkg syscall (freebsd-riscv64-cgo), type Timeval struct, Sec int64 #53466
+pkg syscall (freebsd-riscv64-cgo), type Timeval struct, Usec int64 #53466
+pkg syscall (freebsd-riscv64-cgo), type WaitStatus uint32 #53466
+pkg syscall (freebsd-riscv64-cgo), var Stderr int #53466
+pkg syscall (freebsd-riscv64-cgo), var Stdin int #53466
+pkg syscall (freebsd-riscv64-cgo), var Stdout int #53466
diff --git a/api/go1.21.txt b/api/go1.21.txt
new file mode 100644
index 0000000..50b6a5c
--- /dev/null
+++ b/api/go1.21.txt
@@ -0,0 +1,421 @@
+pkg bytes, func ContainsFunc([]uint8, func(int32) bool) bool #54386
+pkg bytes, method (*Buffer) AvailableBuffer() []uint8 #53685
+pkg bytes, method (*Buffer) Available() int #53685
+pkg cmp, func Compare[$0 Ordered]($0, $0) int #59488
+pkg cmp, func Less[$0 Ordered]($0, $0) bool #59488
+pkg cmp, type Ordered interface {} #59488
+pkg context, func AfterFunc(Context, func()) func() bool #57928
+pkg context, func WithDeadlineCause(Context, time.Time, error) (Context, CancelFunc) #56661
+pkg context, func WithoutCancel(Context) Context #40221
+pkg context, func WithTimeoutCause(Context, time.Duration, error) (Context, CancelFunc) #56661
+pkg crypto/elliptic, func GenerateKey //deprecated #52221
+pkg crypto/elliptic, func Marshal //deprecated #52221
+pkg crypto/elliptic, func Unmarshal //deprecated #52221
+pkg crypto/elliptic, method (*CurveParams) Add //deprecated #34648
+pkg crypto/elliptic, method (*CurveParams) Double //deprecated #34648
+pkg crypto/elliptic, method (*CurveParams) IsOnCurve //deprecated #34648
+pkg crypto/elliptic, method (*CurveParams) ScalarBaseMult //deprecated #34648
+pkg crypto/elliptic, method (*CurveParams) ScalarMult //deprecated #34648
+pkg crypto/elliptic, type Curve interface, Add //deprecated #52221
+pkg crypto/elliptic, type Curve interface, Double //deprecated #52221
+pkg crypto/elliptic, type Curve interface, IsOnCurve //deprecated #52221
+pkg crypto/elliptic, type Curve interface, ScalarBaseMult //deprecated #52221
+pkg crypto/elliptic, type Curve interface, ScalarMult //deprecated #52221
+pkg crypto/rsa, func GenerateMultiPrimeKey //deprecated #56921
+pkg crypto/rsa, type PrecomputedValues struct, CRTValues //deprecated #56921
+pkg crypto/tls, const QUICEncryptionLevelApplication = 3 #44886
+pkg crypto/tls, const QUICEncryptionLevelApplication QUICEncryptionLevel #44886
+pkg crypto/tls, const QUICEncryptionLevelEarly = 1 #60107
+pkg crypto/tls, const QUICEncryptionLevelEarly QUICEncryptionLevel #60107
+pkg crypto/tls, const QUICEncryptionLevelHandshake = 2 #44886
+pkg crypto/tls, const QUICEncryptionLevelHandshake QUICEncryptionLevel #44886
+pkg crypto/tls, const QUICEncryptionLevelInitial = 0 #44886
+pkg crypto/tls, const QUICEncryptionLevelInitial QUICEncryptionLevel #44886
+pkg crypto/tls, const QUICHandshakeDone = 7 #44886
+pkg crypto/tls, const QUICHandshakeDone QUICEventKind #44886
+pkg crypto/tls, const QUICNoEvent = 0 #44886
+pkg crypto/tls, const QUICNoEvent QUICEventKind #44886
+pkg crypto/tls, const QUICRejectedEarlyData = 6 #60107
+pkg crypto/tls, const QUICRejectedEarlyData QUICEventKind #60107
+pkg crypto/tls, const QUICSetReadSecret = 1 #44886
+pkg crypto/tls, const QUICSetReadSecret QUICEventKind #44886
+pkg crypto/tls, const QUICSetWriteSecret = 2 #44886
+pkg crypto/tls, const QUICSetWriteSecret QUICEventKind #44886
+pkg crypto/tls, const QUICTransportParameters = 4 #44886
+pkg crypto/tls, const QUICTransportParameters QUICEventKind #44886
+pkg crypto/tls, const QUICTransportParametersRequired = 5 #44886
+pkg crypto/tls, const QUICTransportParametersRequired QUICEventKind #44886
+pkg crypto/tls, const QUICWriteData = 3 #44886
+pkg crypto/tls, const QUICWriteData QUICEventKind #44886
+pkg crypto/tls, func NewResumptionState([]uint8, *SessionState) (*ClientSessionState, error) #60105
+pkg crypto/tls, func ParseSessionState([]uint8) (*SessionState, error) #60105
+pkg crypto/tls, func QUICClient(*QUICConfig) *QUICConn #44886
+pkg crypto/tls, func QUICServer(*QUICConfig) *QUICConn #44886
+pkg crypto/tls, func VersionName(uint16) string #46308
+pkg crypto/tls, method (AlertError) Error() string #44886
+pkg crypto/tls, method (*ClientSessionState) ResumptionState() ([]uint8, *SessionState, error) #60105
+pkg crypto/tls, method (*Config) DecryptTicket([]uint8, ConnectionState) (*SessionState, error) #60105
+pkg crypto/tls, method (*Config) EncryptTicket(ConnectionState, *SessionState) ([]uint8, error) #60105
+pkg crypto/tls, method (*QUICConn) Close() error #44886
+pkg crypto/tls, method (*QUICConn) ConnectionState() ConnectionState #44886
+pkg crypto/tls, method (*QUICConn) HandleData(QUICEncryptionLevel, []uint8) error #44886
+pkg crypto/tls, method (*QUICConn) NextEvent() QUICEvent #44886
+pkg crypto/tls, method (*QUICConn) SendSessionTicket(QUICSessionTicketOptions) error #60107
+pkg crypto/tls, type QUICSessionTicketOptions struct #60107
+pkg crypto/tls, type QUICSessionTicketOptions struct, EarlyData bool #60107
+pkg crypto/tls, method (*QUICConn) SetTransportParameters([]uint8) #44886
+pkg crypto/tls, method (*QUICConn) Start(context.Context) error #44886
+pkg crypto/tls, method (QUICEncryptionLevel) String() string #44886
+pkg crypto/tls, method (*SessionState) Bytes() ([]uint8, error) #60105
+pkg crypto/tls, type AlertError uint8 #44886
+pkg crypto/tls, type Config struct, UnwrapSession func([]uint8, ConnectionState) (*SessionState, error) #60105
+pkg crypto/tls, type Config struct, WrapSession func(ConnectionState, *SessionState) ([]uint8, error) #60105
+pkg crypto/tls, type QUICConfig struct #44886
+pkg crypto/tls, type QUICConfig struct, TLSConfig *Config #44886
+pkg crypto/tls, type QUICConn struct #44886
+pkg crypto/tls, type QUICEncryptionLevel int #44886
+pkg crypto/tls, type QUICEventKind int #44886
+pkg crypto/tls, type QUICEvent struct #44886
+pkg crypto/tls, type QUICEvent struct, Data []uint8 #44886
+pkg crypto/tls, type QUICEvent struct, Kind QUICEventKind #44886
+pkg crypto/tls, type QUICEvent struct, Level QUICEncryptionLevel #44886
+pkg crypto/tls, type QUICEvent struct, Suite uint16 #44886
+pkg crypto/tls, type SessionState struct #60105
+pkg crypto/tls, type SessionState struct, EarlyData bool #60107
+pkg crypto/tls, type SessionState struct, Extra [][]uint8 #60539
+pkg crypto/x509, type RevocationListEntry struct #53573
+pkg crypto/x509, type RevocationListEntry struct, Extensions []pkix.Extension #53573
+pkg crypto/x509, type RevocationListEntry struct, ExtraExtensions []pkix.Extension #53573
+pkg crypto/x509, type RevocationListEntry struct, Raw []uint8 #53573
+pkg crypto/x509, type RevocationListEntry struct, ReasonCode int #53573
+pkg crypto/x509, type RevocationListEntry struct, RevocationTime time.Time #53573
+pkg crypto/x509, type RevocationListEntry struct, SerialNumber *big.Int #53573
+pkg crypto/x509, type RevocationList struct, RevokedCertificateEntries []RevocationListEntry #53573
+pkg crypto/x509, type RevocationList struct, RevokedCertificates //deprecated #53573
+pkg debug/elf, const COMPRESS_ZSTD = 2 #55107
+pkg debug/elf, const COMPRESS_ZSTD CompressionType #55107
+pkg debug/elf, const DF_1_CONFALT = 8192 #56887
+pkg debug/elf, const DF_1_CONFALT DynFlag1 #56887
+pkg debug/elf, const DF_1_DIRECT = 256 #56887
+pkg debug/elf, const DF_1_DIRECT DynFlag1 #56887
+pkg debug/elf, const DF_1_DISPRELDNE = 32768 #56887
+pkg debug/elf, const DF_1_DISPRELDNE DynFlag1 #56887
+pkg debug/elf, const DF_1_DISPRELPND = 65536 #56887
+pkg debug/elf, const DF_1_DISPRELPND DynFlag1 #56887
+pkg debug/elf, const DF_1_EDITED = 2097152 #56887
+pkg debug/elf, const DF_1_EDITED DynFlag1 #56887
+pkg debug/elf, const DF_1_ENDFILTEE = 16384 #56887
+pkg debug/elf, const DF_1_ENDFILTEE DynFlag1 #56887
+pkg debug/elf, const DF_1_GLOBAL = 2 #56887
+pkg debug/elf, const DF_1_GLOBAL DynFlag1 #56887
+pkg debug/elf, const DF_1_GLOBAUDIT = 16777216 #56887
+pkg debug/elf, const DF_1_GLOBAUDIT DynFlag1 #56887
+pkg debug/elf, const DF_1_GROUP = 4 #56887
+pkg debug/elf, const DF_1_GROUP DynFlag1 #56887
+pkg debug/elf, const DF_1_IGNMULDEF = 262144 #56887
+pkg debug/elf, const DF_1_IGNMULDEF DynFlag1 #56887
+pkg debug/elf, const DF_1_INITFIRST = 32 #56887
+pkg debug/elf, const DF_1_INITFIRST DynFlag1 #56887
+pkg debug/elf, const DF_1_INTERPOSE = 1024 #56887
+pkg debug/elf, const DF_1_INTERPOSE DynFlag1 #56887
+pkg debug/elf, const DF_1_KMOD = 268435456 #56887
+pkg debug/elf, const DF_1_KMOD DynFlag1 #56887
+pkg debug/elf, const DF_1_LOADFLTR = 16 #56887
+pkg debug/elf, const DF_1_LOADFLTR DynFlag1 #56887
+pkg debug/elf, const DF_1_NOCOMMON = 1073741824 #56887
+pkg debug/elf, const DF_1_NOCOMMON DynFlag1 #56887
+pkg debug/elf, const DF_1_NODEFLIB = 2048 #56887
+pkg debug/elf, const DF_1_NODEFLIB DynFlag1 #56887
+pkg debug/elf, const DF_1_NODELETE = 8 #56887
+pkg debug/elf, const DF_1_NODELETE DynFlag1 #56887
+pkg debug/elf, const DF_1_NODIRECT = 131072 #56887
+pkg debug/elf, const DF_1_NODIRECT DynFlag1 #56887
+pkg debug/elf, const DF_1_NODUMP = 4096 #56887
+pkg debug/elf, const DF_1_NODUMP DynFlag1 #56887
+pkg debug/elf, const DF_1_NOHDR = 1048576 #56887
+pkg debug/elf, const DF_1_NOHDR DynFlag1 #56887
+pkg debug/elf, const DF_1_NOKSYMS = 524288 #56887
+pkg debug/elf, const DF_1_NOKSYMS DynFlag1 #56887
+pkg debug/elf, const DF_1_NOOPEN = 64 #56887
+pkg debug/elf, const DF_1_NOOPEN DynFlag1 #56887
+pkg debug/elf, const DF_1_NORELOC = 4194304 #56887
+pkg debug/elf, const DF_1_NORELOC DynFlag1 #56887
+pkg debug/elf, const DF_1_NOW = 1 #56887
+pkg debug/elf, const DF_1_NOW DynFlag1 #56887
+pkg debug/elf, const DF_1_ORIGIN = 128 #56887
+pkg debug/elf, const DF_1_ORIGIN DynFlag1 #56887
+pkg debug/elf, const DF_1_PIE = 134217728 #56887
+pkg debug/elf, const DF_1_PIE DynFlag1 #56887
+pkg debug/elf, const DF_1_SINGLETON = 33554432 #56887
+pkg debug/elf, const DF_1_SINGLETON DynFlag1 #56887
+pkg debug/elf, const DF_1_STUB = 67108864 #56887
+pkg debug/elf, const DF_1_STUB DynFlag1 #56887
+pkg debug/elf, const DF_1_SYMINTPOSE = 8388608 #56887
+pkg debug/elf, const DF_1_SYMINTPOSE DynFlag1 #56887
+pkg debug/elf, const DF_1_TRANS = 512 #56887
+pkg debug/elf, const DF_1_TRANS DynFlag1 #56887
+pkg debug/elf, const DF_1_WEAKFILTER = 536870912 #56887
+pkg debug/elf, const DF_1_WEAKFILTER DynFlag1 #56887
+pkg debug/elf, const R_PPC64_REL24_P9NOTOC = 124 #60348
+pkg debug/elf, const R_PPC64_REL24_P9NOTOC R_PPC64 #60348
+pkg debug/elf, method (DynFlag1) GoString() string #56887
+pkg debug/elf, method (DynFlag1) String() string #56887
+pkg debug/elf, method (*File) DynValue(DynTag) ([]uint64, error) #56892
+pkg debug/elf, type DynFlag1 uint32 #56887
+pkg encoding/binary, var NativeEndian nativeEndian #57237
+pkg errors, var ErrUnsupported error #41198
+pkg flag, func BoolFunc(string, string, func(string) error) #53747
+pkg flag, method (*FlagSet) BoolFunc(string, string, func(string) error) #53747
+pkg go/ast, func IsGenerated(*File) bool #28089
+pkg go/ast, type File struct, GoVersion string #59033
+pkg go/build/constraint, func GoVersion(Expr) string #59033
+pkg go/build, type Directive struct #56986
+pkg go/build, type Directive struct, Pos token.Position #56986
+pkg go/build, type Directive struct, Text string #56986
+pkg go/build, type Package struct, Directives []Directive #56986
+pkg go/build, type Package struct, TestDirectives []Directive #56986
+pkg go/build, type Package struct, XTestDirectives []Directive #56986
+pkg go/token, method (*File) Lines() []int #57708
+pkg go/types, method (*Package) GoVersion() string #61175
+pkg html/template, const ErrJSTemplate = 12 #59584
+pkg html/template, const ErrJSTemplate ErrorCode #59584
+pkg io/fs, func FormatDirEntry(DirEntry) string #54451
+pkg io/fs, func FormatFileInfo(FileInfo) string #54451
+pkg log/slog, const KindAny = 0 #56345
+pkg log/slog, const KindAny Kind #56345
+pkg log/slog, const KindBool = 1 #56345
+pkg log/slog, const KindBool Kind #56345
+pkg log/slog, const KindDuration = 2 #56345
+pkg log/slog, const KindDuration Kind #56345
+pkg log/slog, const KindFloat64 = 3 #56345
+pkg log/slog, const KindFloat64 Kind #56345
+pkg log/slog, const KindGroup = 8 #56345
+pkg log/slog, const KindGroup Kind #56345
+pkg log/slog, const KindInt64 = 4 #56345
+pkg log/slog, const KindInt64 Kind #56345
+pkg log/slog, const KindLogValuer = 9 #56345
+pkg log/slog, const KindLogValuer Kind #56345
+pkg log/slog, const KindString = 5 #56345
+pkg log/slog, const KindString Kind #56345
+pkg log/slog, const KindTime = 6 #56345
+pkg log/slog, const KindTime Kind #56345
+pkg log/slog, const KindUint64 = 7 #56345
+pkg log/slog, const KindUint64 Kind #56345
+pkg log/slog, const LevelDebug = -4 #56345
+pkg log/slog, const LevelDebug Level #56345
+pkg log/slog, const LevelError = 8 #56345
+pkg log/slog, const LevelError Level #56345
+pkg log/slog, const LevelInfo = 0 #56345
+pkg log/slog, const LevelInfo Level #56345
+pkg log/slog, const LevelKey ideal-string #56345
+pkg log/slog, const LevelKey = "level" #56345
+pkg log/slog, const LevelWarn = 4 #56345
+pkg log/slog, const LevelWarn Level #56345
+pkg log/slog, const MessageKey ideal-string #56345
+pkg log/slog, const MessageKey = "msg" #56345
+pkg log/slog, const SourceKey ideal-string #56345
+pkg log/slog, const SourceKey = "source" #56345
+pkg log/slog, const TimeKey ideal-string #56345
+pkg log/slog, const TimeKey = "time" #56345
+pkg log/slog, func Any(string, interface{}) Attr #56345
+pkg log/slog, func AnyValue(interface{}) Value #56345
+pkg log/slog, func Bool(string, bool) Attr #56345
+pkg log/slog, func BoolValue(bool) Value #56345
+pkg log/slog, func DebugContext(context.Context, string, ...interface{}) #61200
+pkg log/slog, func Debug(string, ...interface{}) #56345
+pkg log/slog, func Default() *Logger #56345
+pkg log/slog, func Duration(string, time.Duration) Attr #56345
+pkg log/slog, func DurationValue(time.Duration) Value #56345
+pkg log/slog, func ErrorContext(context.Context, string, ...interface{}) #61200
+pkg log/slog, func Error(string, ...interface{}) #56345
+pkg log/slog, func Float64(string, float64) Attr #56345
+pkg log/slog, func Float64Value(float64) Value #56345
+pkg log/slog, func Group(string, ...interface{}) Attr #59204
+pkg log/slog, func GroupValue(...Attr) Value #56345
+pkg log/slog, func InfoContext(context.Context, string, ...interface{}) #61200
+pkg log/slog, func Info(string, ...interface{}) #56345
+pkg log/slog, func Int64(string, int64) Attr #56345
+pkg log/slog, func Int64Value(int64) Value #56345
+pkg log/slog, func Int(string, int) Attr #56345
+pkg log/slog, func IntValue(int) Value #56345
+pkg log/slog, func LogAttrs(context.Context, Level, string, ...Attr) #56345
+pkg log/slog, func Log(context.Context, Level, string, ...interface{}) #56345
+pkg log/slog, func New(Handler) *Logger #56345
+pkg log/slog, func NewJSONHandler(io.Writer, *HandlerOptions) *JSONHandler #59339
+pkg log/slog, func NewLogLogger(Handler, Level) *log.Logger #56345
+pkg log/slog, func NewRecord(time.Time, Level, string, uintptr) Record #56345
+pkg log/slog, func NewTextHandler(io.Writer, *HandlerOptions) *TextHandler #59339
+pkg log/slog, func SetDefault(*Logger) #56345
+pkg log/slog, func String(string, string) Attr #56345
+pkg log/slog, func StringValue(string) Value #56345
+pkg log/slog, func Time(string, time.Time) Attr #56345
+pkg log/slog, func TimeValue(time.Time) Value #56345
+pkg log/slog, func Uint64(string, uint64) Attr #56345
+pkg log/slog, func Uint64Value(uint64) Value #56345
+pkg log/slog, func WarnContext(context.Context, string, ...interface{})  #61200
+pkg log/slog, func Warn(string, ...interface{}) #56345
+pkg log/slog, func With(...interface{}) *Logger #56345
+pkg log/slog, method (Attr) Equal(Attr) bool #56345
+pkg log/slog, method (Attr) String() string #56345
+pkg log/slog, method (*JSONHandler) Enabled(context.Context, Level) bool #56345
+pkg log/slog, method (*JSONHandler) Handle(context.Context, Record) error #56345
+pkg log/slog, method (*JSONHandler) WithAttrs([]Attr) Handler #56345
+pkg log/slog, method (*JSONHandler) WithGroup(string) Handler #56345
+pkg log/slog, method (Kind) String() string #56345
+pkg log/slog, method (Level) Level() Level #56345
+pkg log/slog, method (Level) MarshalJSON() ([]uint8, error) #56345
+pkg log/slog, method (Level) MarshalText() ([]uint8, error) #56345
+pkg log/slog, method (Level) String() string #56345
+pkg log/slog, method (*Level) UnmarshalJSON([]uint8) error #56345
+pkg log/slog, method (*Level) UnmarshalText([]uint8) error #56345
+pkg log/slog, method (*LevelVar) Level() Level #56345
+pkg log/slog, method (*LevelVar) MarshalText() ([]uint8, error) #56345
+pkg log/slog, method (*LevelVar) Set(Level) #56345
+pkg log/slog, method (*LevelVar) String() string #56345
+pkg log/slog, method (*LevelVar) UnmarshalText([]uint8) error #56345
+pkg log/slog, method (*Logger) DebugContext(context.Context, string, ...interface{}) #61200
+pkg log/slog, method (*Logger) Debug(string, ...interface{}) #56345
+pkg log/slog, method (*Logger) Enabled(context.Context, Level) bool #56345
+pkg log/slog, method (*Logger) ErrorContext(context.Context, string, ...interface{}) #61200
+pkg log/slog, method (*Logger) Error(string, ...interface{}) #56345
+pkg log/slog, method (*Logger) Handler() Handler #56345
+pkg log/slog, method (*Logger) InfoContext(context.Context, string, ...interface{}) #61200
+pkg log/slog, method (*Logger) Info(string, ...interface{}) #56345
+pkg log/slog, method (*Logger) LogAttrs(context.Context, Level, string, ...Attr) #56345
+pkg log/slog, method (*Logger) Log(context.Context, Level, string, ...interface{}) #56345
+pkg log/slog, method (*Logger) WarnContext(context.Context, string, ...interface{}) #61200
+pkg log/slog, method (*Logger) Warn(string, ...interface{}) #56345
+pkg log/slog, method (*Logger) WithGroup(string) *Logger #56345
+pkg log/slog, method (*Logger) With(...interface{}) *Logger #56345
+pkg log/slog, method (*Record) AddAttrs(...Attr) #56345
+pkg log/slog, method (*Record) Add(...interface{}) #56345
+pkg log/slog, method (Record) Attrs(func(Attr) bool) #59060
+pkg log/slog, method (Record) Clone() Record #56345
+pkg log/slog, method (Record) NumAttrs() int #56345
+pkg log/slog, method (*TextHandler) Enabled(context.Context, Level) bool #56345
+pkg log/slog, method (*TextHandler) Handle(context.Context, Record) error #56345
+pkg log/slog, method (*TextHandler) WithAttrs([]Attr) Handler #56345
+pkg log/slog, method (*TextHandler) WithGroup(string) Handler #56345
+pkg log/slog, method (Value) Any() interface{} #56345
+pkg log/slog, method (Value) Bool() bool #56345
+pkg log/slog, method (Value) Duration() time.Duration #56345
+pkg log/slog, method (Value) Equal(Value) bool #56345
+pkg log/slog, method (Value) Float64() float64 #56345
+pkg log/slog, method (Value) Group() []Attr #56345
+pkg log/slog, method (Value) Int64() int64 #56345
+pkg log/slog, method (Value) Kind() Kind #56345
+pkg log/slog, method (Value) LogValuer() LogValuer #56345
+pkg log/slog, method (Value) Resolve() Value #56345
+pkg log/slog, method (Value) String() string #56345
+pkg log/slog, method (Value) Time() time.Time #56345
+pkg log/slog, method (Value) Uint64() uint64 #56345
+pkg log/slog, type Attr struct #56345
+pkg log/slog, type Attr struct, Key string #56345
+pkg log/slog, type Attr struct, Value Value #56345
+pkg log/slog, type Handler interface, Enabled(context.Context, Level) bool #56345
+pkg log/slog, type Handler interface { Enabled, Handle, WithAttrs, WithGroup } #56345
+pkg log/slog, type Handler interface, Handle(context.Context, Record) error #56345
+pkg log/slog, type Handler interface, WithAttrs([]Attr) Handler #56345
+pkg log/slog, type Handler interface, WithGroup(string) Handler #56345
+pkg log/slog, type HandlerOptions struct #56345
+pkg log/slog, type HandlerOptions struct, AddSource bool #56345
+pkg log/slog, type HandlerOptions struct, Level Leveler #56345
+pkg log/slog, type HandlerOptions struct, ReplaceAttr func([]string, Attr) Attr #56345
+pkg log/slog, type JSONHandler struct #56345
+pkg log/slog, type Kind int #56345
+pkg log/slog, type Leveler interface { Level } #56345
+pkg log/slog, type Leveler interface, Level() Level #56345
+pkg log/slog, type Level int #56345
+pkg log/slog, type LevelVar struct #56345
+pkg log/slog, type Logger struct #56345
+pkg log/slog, type LogValuer interface { LogValue } #56345
+pkg log/slog, type LogValuer interface, LogValue() Value #56345
+pkg log/slog, type Record struct #56345
+pkg log/slog, type Record struct, Level Level #56345
+pkg log/slog, type Record struct, Message string #56345
+pkg log/slog, type Record struct, PC uintptr #56345
+pkg log/slog, type Record struct, Time time.Time #56345
+pkg log/slog, type Source struct #59280
+pkg log/slog, type Source struct, File string #59280
+pkg log/slog, type Source struct, Function string #59280
+pkg log/slog, type Source struct, Line int #59280
+pkg log/slog, type TextHandler struct #56345
+pkg log/slog, type Value struct #56345
+pkg maps, func Clone[$0 interface{ ~map[$1]$2 }, $1 comparable, $2 interface{}]($0) $0 #57436
+pkg maps, func Copy[$0 interface{ ~map[$2]$3 }, $1 interface{ ~map[$2]$3 }, $2 comparable, $3 interface{}]($0, $1) #57436
+pkg maps, func DeleteFunc[$0 interface{ ~map[$1]$2 }, $1 comparable, $2 interface{}]($0, func($1, $2) bool) #57436
+pkg maps, func Equal[$0 interface{ ~map[$2]$3 }, $1 interface{ ~map[$2]$3 }, $2 comparable, $3 comparable]($0, $1) bool #57436
+pkg maps, func EqualFunc[$0 interface{ ~map[$2]$3 }, $1 interface{ ~map[$2]$4 }, $2 comparable, $3 interface{}, $4 interface{}]($0, $1, func($3, $4) bool) bool #57436
+pkg math/big, method (*Int) Float64() (float64, Accuracy) #56984
+pkg net/http, method (*ProtocolError) Is(error) bool #41198
+pkg net/http, method (*ResponseController) EnableFullDuplex() error #57786
+pkg net/http, var ErrSchemeMismatch error #44855
+pkg net, method (*Dialer) MultipathTCP() bool #56539
+pkg net, method (*Dialer) SetMultipathTCP(bool) #56539
+pkg net, method (*ListenConfig) MultipathTCP() bool #56539
+pkg net, method (*ListenConfig) SetMultipathTCP(bool) #56539
+pkg net, method (*TCPConn) MultipathTCP() (bool, error) #59166
+pkg reflect, method (Value) Clear() #55002
+pkg reflect, type SliceHeader //deprecated #56906
+pkg reflect, type StringHeader //deprecated #56906
+pkg regexp, method (*Regexp) MarshalText() ([]uint8, error) #46159
+pkg regexp, method (*Regexp) UnmarshalText([]uint8) error #46159
+pkg runtime, method (*PanicNilError) Error() string #25448
+pkg runtime, method (*PanicNilError) RuntimeError() #25448
+pkg runtime, method (*Pinner) Pin(interface{}) #46787
+pkg runtime, method (*Pinner) Unpin() #46787
+pkg runtime, type PanicNilError struct #25448
+pkg runtime, type Pinner struct #46787
+pkg slices, func BinarySearch[$0 interface{ ~[]$1 }, $1 cmp.Ordered]($0, $1) (int, bool) #60091
+pkg slices, func BinarySearchFunc[$0 interface{ ~[]$1 }, $1 interface{}, $2 interface{}]($0, $2, func($1, $2) int) (int, bool) #60091
+pkg slices, func Clip[$0 interface{ ~[]$1 }, $1 interface{}]($0) $0 #57433
+pkg slices, func Clone[$0 interface{ ~[]$1 }, $1 interface{}]($0) $0 #57433
+pkg slices, func Compact[$0 interface{ ~[]$1 }, $1 comparable]($0) $0 #57433
+pkg slices, func CompactFunc[$0 interface{ ~[]$1 }, $1 interface{}]($0, func($1, $1) bool) $0 #57433
+pkg slices, func Compare[$0 interface{ ~[]$1 }, $1 cmp.Ordered]($0, $0) int #60091
+pkg slices, func CompareFunc[$0 interface{ ~[]$2 }, $1 interface{ ~[]$3 }, $2 interface{}, $3 interface{}]($0, $1, func($2, $3) int) int #60091
+pkg slices, func Contains[$0 interface{ ~[]$1 }, $1 comparable]($0, $1) bool #57433
+pkg slices, func ContainsFunc[$0 interface{ ~[]$1 }, $1 interface{}]($0, func($1) bool) bool #57433
+pkg slices, func Delete[$0 interface{ ~[]$1 }, $1 interface{}]($0, int, int) $0 #57433
+pkg slices, func DeleteFunc[$0 interface{ ~[]$1 }, $1 interface{}]($0, func($1) bool) $0 #54768
+pkg slices, func Equal[$0 interface{ ~[]$1 }, $1 comparable]($0, $0) bool #57433
+pkg slices, func EqualFunc[$0 interface{ ~[]$2 }, $1 interface{ ~[]$3 }, $2 interface{}, $3 interface{}]($0, $1, func($2, $3) bool) bool #57433
+pkg slices, func Grow[$0 interface{ ~[]$1 }, $1 interface{}]($0, int) $0 #57433
+pkg slices, func Index[$0 interface{ ~[]$1 }, $1 comparable]($0, $1) int #57433
+pkg slices, func IndexFunc[$0 interface{ ~[]$1 }, $1 interface{}]($0, func($1) bool) int #57433
+pkg slices, func Insert[$0 interface{ ~[]$1 }, $1 interface{}]($0, int, ...$1) $0 #57433
+pkg slices, func IsSorted[$0 interface{ ~[]$1 }, $1 cmp.Ordered]($0) bool #60091
+pkg slices, func IsSortedFunc[$0 interface{ ~[]$1 }, $1 interface{}]($0, func($1, $1) int) bool #60091
+pkg slices, func Max[$0 interface{ ~[]$1 }, $1 cmp.Ordered]($0) $1 #60091
+pkg slices, func MaxFunc[$0 interface{ ~[]$1 }, $1 interface{}]($0, func($1, $1) int) $1 #60091
+pkg slices, func Min[$0 interface{ ~[]$1 }, $1 cmp.Ordered]($0) $1 #60091
+pkg slices, func MinFunc[$0 interface{ ~[]$1 }, $1 interface{}]($0, func($1, $1) int) $1 #60091
+pkg slices, func Replace[$0 interface{ ~[]$1 }, $1 interface{}]($0, int, int, ...$1) $0 #57433
+pkg slices, func Reverse[$0 interface{ ~[]$1 }, $1 interface{}]($0) #58565
+pkg slices, func Sort[$0 interface{ ~[]$1 }, $1 cmp.Ordered]($0) #60091
+pkg slices, func SortFunc[$0 interface{ ~[]$1 }, $1 interface{}]($0, func($1, $1) int) #60091
+pkg slices, func SortStableFunc[$0 interface{ ~[]$1 }, $1 interface{}]($0, func($1, $1) int) #60091
+pkg strings, func ContainsFunc(string, func(int32) bool) bool #54386
+pkg sync, func OnceFunc(func()) func() #56102
+pkg sync, func OnceValue[$0 interface{}](func() $0) func() $0 #56102
+pkg sync, func OnceValues[$0 interface{}, $1 interface{}](func() ($0, $1)) func() ($0, $1) #56102
+pkg syscall (freebsd-386-cgo), type SysProcAttr struct, Jail int #46259
+pkg syscall (freebsd-386), type SysProcAttr struct, Jail int #46259
+pkg syscall (freebsd-amd64-cgo), type SysProcAttr struct, Jail int #46259
+pkg syscall (freebsd-amd64), type SysProcAttr struct, Jail int #46259
+pkg syscall (freebsd-arm64-cgo), type SysProcAttr struct, Jail int #46259
+pkg syscall (freebsd-arm64), type SysProcAttr struct, Jail int #46259
+pkg syscall (freebsd-arm-cgo), type SysProcAttr struct, Jail int #46259
+pkg syscall (freebsd-arm), type SysProcAttr struct, Jail int #46259
+pkg syscall (freebsd-riscv64-cgo), type SysProcAttr struct, Jail int #46259
+pkg syscall (freebsd-riscv64), type SysProcAttr struct, Jail int #46259
+pkg testing, func Testing() bool #52600
+pkg testing/slogtest, func TestHandler(slog.Handler, func() []map[string]interface{}) error #56345
+pkg unicode, const Version = "15.0.0" #55079
+pkg unicode, var Cypro_Minoan *RangeTable #55079
+pkg unicode, var Kawi *RangeTable #55079
+pkg unicode, var Nag_Mundari *RangeTable #55079
+pkg unicode, var Old_Uyghur *RangeTable #55079
+pkg unicode, var Tangsa *RangeTable #55079
+pkg unicode, var Toto *RangeTable #55079
+pkg unicode, var Vithkuqi *RangeTable #55079
diff --git a/codereview.cfg b/codereview.cfg
index 6e621c3..f5b11bd 100644
--- a/codereview.cfg
+++ b/codereview.cfg
@@ -1,2 +1,2 @@
-branch: release-branch.go1.20
+branch: release-branch.go1.21
 parent-branch: master
diff --git a/doc/go1.20.html b/doc/go1.20.html
deleted file mode 100644
index 1fef452..0000000
--- a/doc/go1.20.html
+++ /dev/null
@@ -1,1246 +0,0 @@
-<!--{
-	"Title": "Go 1.20 Release Notes",
-	"Path":  "/doc/go1.20"
-}-->
-
-<!--
-NOTE: In this document and others in this directory, the convention is to
-set fixed-width phrases with non-fixed-width spaces, as in
-<code>hello</code> <code>world</code>.
-Do not send CLs removing the interior tags from such phrases.
--->
-
-<style>
-  main ul li { margin: 0.5em 0; }
-</style>
-
-<h2 id="introduction">DRAFT RELEASE NOTES — Introduction to Go 1.20</h2>
-
-<p>
-  <strong>
-    Go 1.20 is not yet released. These are work-in-progress
-    release notes. Go 1.20 is expected to be released in February 2023.
-  </strong>
-</p>
-
-<h2 id="language">Changes to the language</h2>
-
-<p>
-  Go 1.20 includes four changes to the language.
-</p>
-
-<p><!-- https://go.dev/issue/46505 -->
-  Go 1.17 added <a href="/ref/spec#Conversions_from_slice_to_array_or_array_pointer">conversions from slice to an array pointer</a>.
-  Go 1.20 extends this to allow conversions from a slice to an array:
-  given a slice <code>x</code>, <code>[4]byte(x)</code> can now be written
-  instead of <code>*(*[4]byte)(x)</code>.
-</p>
-
-<p><!-- https://go.dev/issue/53003 -->
-  The <a href="/ref/spec/#Package_unsafe"><code>unsafe</code> package</a> defines
-  three new functions <code>SliceData</code>, <code>String</code>, and <code>StringData</code>.
-  Along with Go 1.17's <code>Slice</code>, these functions now provide the complete ability to
-  construct and deconstruct slice and string values, without depending on their exact representation.
-</p>
-
-<p><!-- https://go.dev/issue/8606 -->
-  The specification now defines that struct values are compared one field at a time,
-  considering fields in the order they appear in the struct type definition,
-  and stopping at the first mismatch.
-  The specification could previously have been read as if
-  all fields needed to be compared beyond the first mismatch.
-  Similarly, the specification now defines that array values are compared
-  one element at a time, in increasing index order.
-  In both cases, the difference affects whether certain comparisons must panic.
-  Existing programs are unchanged: the new spec wording describes
-  what the implementations have always done.
-</p>
-
-<p><!-- https://go.dev/issue/56548 -->
-  <a href="/ref/spec#Comparison_operators">Comparable types</a> (such as ordinary interfaces)
-  may now satisfy <code>comparable</code> constraints, even if the type arguments
-  are not strictly comparable (comparison may panic at runtime).
-  This makes it possible to instantiate a type parameter constrained by <code>comparable</code>
-  (e.g., a type parameter for a user-defined generic map key) with a non-strictly comparable type argument
-  such as an interface type, or a composite type containing an interface type.
-</p>
-
-<h2 id="ports">Ports</h2>
-
-<h3 id="windows">Windows</h3>
-
-<p><!-- https://go.dev/issue/57003, https://go.dev/issue/57004 -->
-  Go 1.20 is the last release that will run on any release of Windows 7, 8, Server 2008 and Server 2012.
-  Go 1.21 will require at least Windows 10 or Server 2016.
-</p>
-
-<h3 id="darwin">Darwin and iOS</h3>
-
-<p><!-- https://go.dev/issue/23011 -->
-  Go 1.20 is the last release that will run on macOS 10.13 High Sierra or 10.14 Mojave.
-  Go 1.21 will require macOS 10.15 Catalina or later.
-</p>
-
-<h3 id="freebsd-riscv">FreeBSD/RISC-V</h3>
-
-<p><!-- https://go.dev/issue/53466 -->
-  Go 1.20 adds experimental support for FreeBSD on RISC-V (<code>GOOS=freebsd</code>, <code>GOARCH=riscv64</code>).
-</p>
-
-<h2 id="tools">Tools</h2>
-
-<h3 id="go-command">Go command</h3>
-
-<p><!-- CL 432535, https://go.dev/issue/47257 -->
-  The directory <code>$GOROOT/pkg</code> no longer stores
-  pre-compiled package archives for the standard library:
-  <code>go</code> <code>install</code> no longer writes them,
-  the <code>go</code> build no longer checks for them,
-  and the Go distribution no longer ships them.
-  Instead, packages in the standard library are built as needed
-  and cached in the build cache, just like packages outside <code>GOROOT</code>.
-  This change reduces the size of the Go distribution and also
-  avoids C toolchain skew for packages that use cgo.
-</p>
-
-<p><!-- CL 448357: cmd/go: print test2json start events -->
-  The implementation of <code>go</code> <code>test</code> <code>-json</code>
-  has been improved to make it more robust.
-  Programs that run <code>go</code> <code>test</code> <code>-json</code>
-  do not need any updates.
-  Programs that invoke <code>go</code> <code>tool</code> <code>test2json</code>
-  directly should now run the test binary with <code>-v=test2json</code>
-  (for example, <code>go</code> <code>test</code> <code>-v=test2json</code>
-  or <code>./pkg.test</code> <code>-test.v=test2json</code>)
-  instead of plain <code>-v</code>.
-</p>
-
-<p><!-- CL 448357: cmd/go: print test2json start events -->
-  A related change to <code>go</code> <code>test</code> <code>-json</code>
-  is the addition of an event with <code>Action</code> set to <code>start</code>
-  at the beginning of each test program's execution.
-  When running multiple tests using the <code>go</code> command,
-  these start events are guaranteed to be emitted in the same order as
-  the packages named on the command line.
-</p>
-
-<p><!-- https://go.dev/issue/45454, CL 421434 -->
-  The <code>go</code> command now defines
-  architecture feature build tags, such as <code>amd64.v2</code>,
-  to allow selecting a package implementation file based on the presence
-  or absence of a particular architecture feature.
-  See <a href="/cmd/go#hdr-Build_constraints"><code>go</code> <code>help</code> <code>buildconstraint</code></a> for details.
-</p>
-
-<p><!-- https://go.dev/issue/50332 -->
-  The <code>go</code> subcommands now accept
-  <code>-C</code> <code>&lt;dir&gt;</code> to change directory to &lt;dir&gt;
-  before performing the command, which may be useful for scripts that need to
-  execute commands in multiple different modules.
-</p>
-
-<p><!-- https://go.dev/issue/41696, CL 416094 -->
-  The <code>go</code> <code>build</code> and <code>go</code> <code>test</code>
-  commands no longer accept the <code>-i</code> flag,
-  which has been <a href="https://go.dev/issue/41696">deprecated since Go 1.16</a>.
-</p>
-
-<p><!-- https://go.dev/issue/38687, CL 421440 -->
-  The <code>go</code> <code>generate</code> command now accepts
-  <code>-skip</code> <code>&lt;pattern&gt;</code> to skip <code>//go:generate</code> directives
-  matching <code>&lt;pattern&gt;</code>.
-</p>
-
-<p><!-- https://go.dev/issue/41583 -->
-  The <code>go</code> <code>test</code> command now accepts
-  <code>-skip</code> <code>&lt;pattern&gt;</code> to skip tests, subtests, or examples
-  matching <code>&lt;pattern&gt;</code>.
-</p>
-
-<p><!-- https://go.dev/issue/37015 -->
-  When the main module is located within <code>GOPATH/src</code>,
-  <code>go</code> <code>install</code> no longer installs libraries for
-  non-<code>main</code> packages to <code>GOPATH/pkg</code>,
-  and <code>go</code> <code>list</code> no longer reports a <code>Target</code>
-  field for such packages. (In module mode, compiled packages are stored in the
-  <a href="https://pkg.go.dev/cmd/go#hdr-Build_and_test_caching">build cache</a>
-  only, but <a href="https://go.dev/issue/37015">a bug</a> had caused
-  the <code>GOPATH</code> install targets to unexpectedly remain in effect.)
-</p>
-
-<p><!-- https://go.dev/issue/55022 -->
-  The <code>go</code> <code>build</code>, <code>go</code> <code>install</code>,
-  and other build-related commands now support a <code>-pgo</code> flag that enables
-  profile-guided optimization, which is described in more detail in the
-  <a href="#compiler">Compiler</a> section below.
-  The <code>-pgo</code> flag specifies the file path of the profile.
-  Specifying <code>-pgo=auto</code> causes the <code>go</code> command to search
-  for a file named <code>default.pgo</code> in the main package's directory and
-  use it if present.
-  This mode currently requires a single main package to be specified on the
-  command line, but we plan to lift this restriction in a future release.
-  Specifying <code>-pgo=off</code> turns off profile-guided optimization.
-</p>
-
-<p><!-- https://go.dev/issue/51430 -->
-  The <code>go</code> <code>build</code>, <code>go</code> <code>install</code>,
-  and other build-related commands now support a <code>-cover</code>
-  flag that builds the specified target with code coverage instrumentation.
-  This is described in more detail in the
-  <a href="#cover">Cover</a> section below.
-</p>
-
-<h4 id="go-version"><code>go</code> <code>version</code></h4>
-
-<p><!-- https://go.dev/issue/48187 -->
-  The <code>go</code> <code>version</code> <code>-m</code> command
-  now supports reading more types of Go binaries, most notably, Windows DLLs
-  built with <code>go</code> <code>build</code> <code>-buildmode=c-shared</code>
-  and Linux binaries without execute permission.
-</p>
-
-<h3 id="cgo">Cgo</h3>
-
-<p><!-- CL 450739 -->
-  The <code>go</code> command now disables <code>cgo</code> by default
-  on systems without a C toolchain.
-  More specifically, when the <code>CGO_ENABLED</code> environment variable is unset,
-  the <code>CC</code> environment variable is unset,
-  and the default C compiler (typically <code>clang</code> or <code>gcc</code>)
-  is not found in the path,
-  <code>CGO_ENABLED</code> defaults to <code>0</code>.
-  As always, you can override the default by setting <code>CGO_ENABLED</code> explicitly.
-</p>
-
-<p>
-  The most important effect of the default change is that when Go is installed
-  on a system without a C compiler, it will now use pure Go builds for packages
-  in the standard library that use cgo, instead of using pre-distributed package archives
-  (which have been removed, as <a href="#go-command">noted above</a>)
-  or attempting to use cgo and failing.
-  This makes Go work better in some minimal container environments
-  as well as on macOS, where pre-distributed package archives have
-  not been used for cgo-based packages since Go 1.16.
-</p>
-
-<p>
-  The packages in the standard library that use cgo are <a href="/pkg/net/"><code>net</code></a>,
-  <a href="/pkg/os/user/"><code>os/user</code></a>, and
-  <a href="/pkg/plugin/"><code>plugin</code></a>.
-  On macOS, the <code>net</code> and <code>os/user</code> packages have been rewritten not to use cgo:
-  the same code is now used for cgo and non-cgo builds as well as cross-compiled builds.
-  On Windows, the <code>net</code> and <code>os/user</code> packages have never used cgo.
-  On other systems, builds with cgo disabled will use a pure Go version of these packages.
-</p>
-
-<p>
-  On macOS, the race detector has been rewritten not to use cgo:
-  race-detector-enabled programs can be built and run without Xcode.
-  On Linux and other Unix systems, and on Windows, a host C toolchain
-  is required to use the race detector.
-</p>
-
-<h3 id="cover">Cover</h3>
-
-<p><!-- CL 436236, CL 401236, CL 438503 -->
-  Go 1.20 supports collecting code coverage profiles for programs
-  (applications and integration tests), as opposed to just unit tests.
-</p>
-
-<p>
-  To collect coverage data for a program, build it with <code>go</code>
-  <code>build</code>'s <code>-cover</code> flag, then run the resulting
-  binary with the environment variable <code>GOCOVERDIR</code> set
-  to an output directory for coverage profiles.
-  See the
-  <a href="https://go.dev/testing/coverage">'coverage for integration tests' landing page</a> for more on how to get started.
-  For details on the design and implementation, see the
-  <a href="https://golang.org/issue/51430">proposal</a>.
-</p>
-
-<h3 id="vet">Vet</h3>
-
-<h4 id="vet-loopclosure">Improved detection of loop variable capture by nested functions</h4>
-
-<p><!-- CL 447256, https://go.dev/issue/55972: extend the loopclosure analysis to parallel subtests -->
-  The <code>vet</code> tool now reports references to loop variables following
-  a call to <a href="/pkg/testing/#T.Parallel"><code>T.Parallel()</code></a>
-  within subtest function bodies. Such references may observe the value of the
-  variable from a different iteration (typically causing test cases to be
-  skipped) or an invalid state due to unsynchronized concurrent access.
-</p>
-
-<p><!-- CL 452615 -->
-  The tool also detects reference mistakes in more places. Previously it would
-  only consider the last statement of the loop body, but now it recursively
-  inspects the last statements within if, switch, and select statements.
-</p>
-
-<h4 id="vet-timeformat">New diagnostic for incorrect time formats</h4>
-
-<p><!-- CL 354010, https://go.dev/issue/48801: check for time formats with 2006-02-01 -->
-  The vet tool now reports use of the time format 2006-02-01 (yyyy-dd-mm)
-  with <a href="/pkg/time/#Time.Format"><code>Time.Format</code></a> and
-  <a href="/pkg/time/#Parse"><code>time.Parse</code></a>.
-  This format does not appear in common date standards, but is frequently
-  used by mistake when attempting to use the ISO 8601 date format
-  (yyyy-mm-dd).
-</p>
-
-<h2 id="runtime">Runtime</h2>
-
-<p><!-- CL 422634 -->
-  Some of the garbage collector's internal data structures were reorganized to
-  be both more space and CPU efficient.
-  This change reduces memory overheads and improves overall CPU performance by
-  up to 2%.
-</p>
-
-<p><!-- CL 417558, https://go.dev/issue/53892 -->
-  The garbage collector behaves less erratically with respect to goroutine
-  assists in some circumstances.
-</p>
-
-<p><!-- https://go.dev/issue/51430 -->
-  Go 1.20 adds a new <code>runtime/coverage</code> package
-  containing APIs for writing coverage profile data at
-  runtime from long-running and/or server programs that
-  do not terminate via <code>os.Exit()</code>.
-</p>
-
-<h2 id="compiler">Compiler</h2>
-
-<p><!-- https://go.dev/issue/55022 -->
-  Go 1.20 adds preview support for profile-guided optimization (PGO).
-  PGO enables the toolchain to perform application- and workload-specific
-  optimizations based on run-time profile information.
-  Currently, the compiler supports pprof CPU profiles, which can be collected
-  through usual means, such as the <code>runtime/pprof</code> or
-  <code>net/http/pprof</code> packages.
-  To enable PGO, pass the path of a pprof profile file via the
-  <code>-pgo</code> flag to <code>go</code> <code>build</code>,
-  as mentioned <a href="#go-command">above</a>.
-  Go 1.20 uses PGO to more aggressively inline functions at hot call sites.
-  Benchmarks for a representative set of Go programs show enabling
-  profile-guided inlining optimization improves performance about 3–4%.
-  We plan to add more profile-guided optimizations in future releases.
-  Note that profile-guided optimization is a preview, so please use it
-  with appropriate caution.
-</p>
-
-<p>
-  The Go 1.20 compiler upgraded its front-end to use a new way of handling the
-  compiler's internal data, which fixes several generic-types bugs and enables
-  local types in generic functions and methods.
-</p>
-
-<p><!-- https://go.dev/issue/56103, CL 445598 -->
-  The compiler now <a href="https://go.dev/issue/56103">disallows anonymous interface cycles</a>.
-</p>
-
-<p><!-- https://go.dev/issue/49569 -->
-  Go 1.18 and 1.19 saw regressions in build speed, largely due to the addition
-  of support for generics and follow-on work. Go 1.20 improves build speeds by
-  up to 10%, bringing it back in line with Go 1.17.
-  Relative to Go 1.19, generated code performance is also generally slightly improved.
-</p>
-
-<h2 id="linker">Linker</h2>
-
-<p><!-- https://go.dev/issue/54197, CL 420774 -->
-  On Linux, the linker now selects the dynamic interpreter for <code>glibc</code>
-  or <code>musl</code> at link time.
-</p>
-
-<p><!-- https://go.dev/issue/35006 -->
-  On Windows, the Go linker now supports modern LLVM-based C toolchains.
-</p>
-
-<p><!-- https://go.dev/issue/37762, CL 317917 -->
-  Go 1.20 uses <code>go:</code> and <code>type:</code> prefixes for compiler-generated
-  symbols rather than <code>go.</code> and <code>type.</code>.
-  This avoids confusion for user packages whose name starts with <code>go.</code>.
-  The <a href="/pkg/debug/gosym"><code>debug/gosym</code></a> package understands
-  this new naming convention for binaries built with Go 1.20 and newer.
-</p>
-
-<h2 id="bootstrap">Bootstrap</h2>
-
-<p><!-- https://go.dev/issue/44505 -->
-  When building a Go release from source and <code>GOROOT_BOOTSTRAP</code> is not set,
-  previous versions of Go looked for a Go 1.4 or later bootstrap toolchain in the directory
-  <code>$HOME/go1.4</code> (<code>%HOMEDRIVE%%HOMEPATH%\go1.4</code> on Windows).
-  Go 1.18 and Go 1.19 looked first for <code>$HOME/go1.17</code> or <code>$HOME/sdk/go1.17</code>
-  before falling back to <code>$HOME/go1.4</code>,
-  in anticipation of requiring Go 1.17 for use when bootstrapping Go 1.20.
-  Go 1.20 does require a Go 1.17 release for bootstrapping, but we realized that we should
-  adopt the latest point release of the bootstrap toolchain, so it requires Go 1.17.13.
-  Go 1.20 looks for <code>$HOME/go1.17.13</code> or <code>$HOME/sdk/go1.17.13</code>
-  before falling back to <code>$HOME/go1.4</code>
-  (to support systems that hard-coded the path $HOME/go1.4 but have installed
-  a newer Go toolchain there).
-  In the future, we plan to move the bootstrap toolchain forward approximately once a year,
-  and in particular we expect that Go 1.22 will require the final point release of Go 1.20 for bootstrap.
-</p>
-
-<h2 id="library">Core library</h2>
-
-<h3 id="crypto/ecdh">New crypto/ecdh package</h3>
-
-<p><!-- https://go.dev/issue/52221, CL 398914, CL 450335, https://go.dev/issue/56052 -->
-  Go 1.20 adds a new <a href="/pkg/crypto/ecdh/"><code>crypto/ecdh</code></a> package
-  to provide explicit support for Elliptic Curve Diffie-Hellman key exchanges
-  over NIST curves and Curve25519.
-</p>
-<p>
-  Programs should use <code>crypto/ecdh</code> instead of the lower-level functionality in
-  <a href="/pkg/crypto/elliptic/"><code>crypto/elliptic</code></a> for ECDH, and
-  third-party modules for more advanced use cases.
-</p>
-
-<h3 id="errors">Wrapping multiple errors</h3>
-
-<p><!-- CL 432898 -->
-  Go 1.20 expands support for error wrapping to permit an error to
-  wrap multiple other errors.
-</p>
-<p>
-  An error <code>e</code> can wrap more than one error by providing
-  an <code>Unwrap</code> method that returns a <code>[]error</code>.
-</p>
-<p>
-  The <a href="/pkg/errors/#Is"><code>errors.Is</code></a> and
-  <a href="/pkg/errors/#As"><code>errors.As</code></a> functions
-  have been updated to inspect multiply wrapped errors.
-</p>
-<p>
-  The <a href="/pkg/fmt/#Errorf"><code>fmt.Errorf</code></a> function
-  now supports multiple occurrences of the <code>%w</code> format verb,
-  which will cause it to return an error that wraps all of those error operands.
-</p>
-<p>
-  The new function <a href="/pkg/errors/#Join"><code>errors.Join</code></a>
-  returns an error wrapping a list of errors.
-</p>
-
-<h3 id="http_responsecontroller">HTTP ResponseController</h3>
-
-<p><!-- CL 436890, https://go.dev/issue/54136 -->
-  The new
-  <a href="/pkg/net/http/#ResponseController"><code>"net/http".ResponseController</code></a>
-  type provides access to extended per-request functionality not handled by the
-  <a href="/pkg/net/http/#ResponseWriter"><code>"net/http".ResponseWriter</code></a> interface.
-</p>
-
-<p>
-  Previously, we have added new per-request functionality by defining optional
-  interfaces which a <code>ResponseWriter</code> can implement, such as
-  <a href="/pkg/net/http/#Flusher"><code>Flusher</code></a>. These interfaces
-  are not discoverable and clumsy to use.
-</p>
-
-<p>
-  The <code>ResponseController</code> type provides a clearer, more discoverable way
-  to add per-handler controls. Two such controls also added in Go 1.20 are
-  <code>SetReadDeadline</code> and <code>SetWriteDeadline</code>, which allow setting
-  per-request read and write deadlines. For example:
-</p>
-
-<pre>
-func RequestHandler(w ResponseWriter, r *Request) {
-  rc := http.NewResponseController(w)
-  rc.SetWriteDeadline(time.Time{}) // disable Server.WriteTimeout when sending a large response
-  io.Copy(w, bigData)
-}
-</pre>
-
-<h3 id="reverseproxy_rewrite">New ReverseProxy Rewrite hook</h3>
-
-<p><!-- https://go.dev/issue/53002, CL 407214 -->
-  The <a href="/pkg/net/http/httputil/#ReverseProxy"><code>httputil.ReverseProxy</code></a>
-  forwarding proxy includes a new
-  <a href="/pkg/net/http/httputil/#ReverseProxy.Rewrite"><code>Rewrite</code></a>
-  hook function, superseding the
-  previous <code>Director</code> hook.
-</p>
-
-<p>
-  The <code>Rewrite</code> hook accepts a
-  <a href="/pkg/net/http/httputil/#ProxyRequest"><code>ProxyRequest</code></a> parameter,
-  which includes both the inbound request received by the proxy and the outbound
-  request that it will send.
-  Unlike <code>Director</code> hooks, which only operate on the outbound request,
-  this permits <code>Rewrite</code> hooks to avoid certain scenarios where
-  a malicious inbound request may cause headers added by the hook
-  to be removed before forwarding.
-  See <a href="https://go.dev/issue/50580">issue #50580</a>.
-</p>
-
-<p>
-  The <a href="/pkg/net/http/httputil/#ProxyRequest.SetURL"><code>ProxyRequest.SetURL</code></a>
-  method routes the outbound request to a provided destination
-  and supersedes the <code>NewSingleHostReverseProxy</code> function.
-  Unlike <code>NewSingleHostReverseProxy</code>, <code>SetURL</code>
-  also sets the <code>Host</code> header of the outbound request.
-</p>
-
-<p><!-- https://go.dev/issue/50465, CL 407414 -->
-  The
-  <a href="/pkg/net/http/httputil/#ProxyRequest.SetXForwarded"><code>ProxyRequest.SetXForwarded</code></a>
-  method sets the <code>X-Forwarded-For</code>, <code>X-Forwarded-Host</code>,
-  and <code>X-Forwarded-Proto</code> headers of the outbound request.
-  When using a <code>Rewrite</code>, these headers are not added by default.
-</p>
-
-<p>
-  An example of a <code>Rewrite</code> hook using these features is:
-</p>
-
-<pre>
-proxyHandler := &httputil.ReverseProxy{
-  Rewrite: func(r *httputil.ProxyRequest) {
-    r.SetURL(outboundURL) // Forward request to outboundURL.
-    r.SetXForwarded()     // Set X-Forwarded-* headers.
-    r.Out.Header.Set("X-Additional-Header", "header set by the proxy")
-  },
-}
-</pre>
-
-<p><!-- CL 407375 -->
- <a href="/pkg/net/http/httputil/#ReverseProxy"><code>ReverseProxy</code></a> no longer adds a <code>User-Agent</code> header
-  to forwarded requests when the incoming request does not have one.
-</p>
-
-<h3 id="minor_library_changes">Minor changes to the library</h3>
-
-<p>
-  As always, there are various minor changes and updates to the library,
-  made with the Go 1 <a href="/doc/go1compat">promise of compatibility</a>
-  in mind.
-  There are also various performance improvements, not enumerated here.
-</p>
-
-<dl id="archive/tar"><dt><a href="/pkg/archive/tar/">archive/tar</a></dt>
-  <dd>
-    <p><!-- https://go.dev/issue/55356, CL 449937 -->
-      When the <code>GODEBUG=tarinsecurepath=0</code> environment variable is set,
-      <a href="/pkg/archive/tar/#Reader.Next"><code>Reader.Next</code></a> method
-      will now return the error <a href="/pkg/archive/tar/#ErrInsecurePath"><code>ErrInsecurePath</code></a>
-      for an entry with a file name that is an absolute path,
-      refers to a location outside the current directory, contains invalid
-      characters, or (on Windows) is a reserved name such as <code>NUL</code>.
-      A future version of Go may disable insecure paths by default.
-    </p>
-  </dd>
-</dl><!-- archive/tar -->
-
-<dl id="archive/zip"><dt><a href="/pkg/archive/zip/">archive/zip</a></dt>
-  <dd>
-    <p><!-- https://go.dev/issue/55356 -->
-      When the <code>GODEBUG=zipinsecurepath=0</code> environment variable is set,
-      <a href="/pkg/archive/zip/#NewReader"><code>NewReader</code></a> will now return the error
-      <a href="/pkg/archive/zip/#ErrInsecurePath"><code>ErrInsecurePath</code></a>
-      when opening an archive which contains any file name that is an absolute path,
-      refers to a location outside the current directory, contains invalid
-      characters, or (on Windows) is a reserved names such as <code>NUL</code>.
-      A future version of Go may disable insecure paths by default.
-    </p>
-    <p><!-- CL 449955 -->
-      Reading from a directory file that contains file data will now return an error.
-      The zip specification does not permit directory files to contain file data,
-      so this change only affects reading from invalid archives.
-    </p>
-  </dd>
-</dl><!-- archive/zip -->
-
-<dl id="bytes"><dt><a href="/pkg/bytes/">bytes</a></dt>
-  <dd>
-    <p><!-- CL 407176 -->
-      The new
-      <a href="/pkg/bytes/#CutPrefix"><code>CutPrefix</code></a> and
-      <a href="/pkg/bytes/#CutSuffix"><code>CutSuffix</code></a> functions
-      are like <a href="/pkg/bytes/#TrimPrefix"><code>TrimPrefix</code></a>
-      and <a href="/pkg/bytes/#TrimSuffix"><code>TrimSuffix</code></a>
-      but also report whether the string was trimmed.
-    </p>
-
-    <p><!-- CL 359675, https://go.dev/issue/45038 -->
-      The new <a href="/pkg/bytes/#Clone"><code>Clone</code></a> function
-      allocates a copy of a byte slice.
-    </p>
-  </dd>
-</dl><!-- bytes -->
-
-<dl id="context"><dt><a href="/pkg/context/">context</a></dt>
-  <dd>
-    <p><!-- https://go.dev/issue/51365, CL 375977 -->
-      The new <a href="/pkg/context/#WithCancelCause"><code>WithCancelCause</code></a> function
-      provides a way to cancel a context with a given error.
-      That error can be retrieved by calling the new <a href="/pkg/context/#Cause"><code>Cause</code></a> function.
-    </p>
-  </dd>
-</dl><!-- context -->
-
-<dl id="crypto/ecdsa"><dt><a href="/pkg/crypto/ecdsa/">crypto/ecdsa</a></dt>
-  <dd>
-    <p><!-- CL 353849 -->
-      When using supported curves, all operations are now implemented in constant time.
-      This led to an increase in CPU time between 5% and 30%, mostly affecting P-384 and P-521.
-    </p>
-
-    <p><!-- https://go.dev/issue/56088, CL 450816 -->
-      The new <a href="/pkg/crypto/ecdsa/#PrivateKey.ECDH"><code>PrivateKey.ECDH</code></a> method
-      converts an <code>ecdsa.PrivateKey</code> to an <code>ecdh.PrivateKey</code>.
-    </p>
-  </dd>
-</dl><!-- crypto/ecdsa -->
-
-<dl id="crypto/ed25519"><dt><a href="/pkg/crypto/ed25519/">crypto/ed25519</a></dt>
-  <dd>
-    <p><!-- CL 373076, CL 404274, https://go.dev/issue/31804 -->
-      The <a href="/pkg/crypto/ed25519/#PrivateKey.Sign"><code>PrivateKey.Sign</code></a> method
-      and the
-      <a href="/pkg/crypto/ed25519/#VerifyWithOptions"><code>VerifyWithOptions</code></a> function
-      now support signing pre-hashed messages with Ed25519ph,
-      indicated by an
-      <a href="/pkg/crypto/ed25519/#Options.HashFunc"><code>Options.HashFunc</code></a>
-      that returns
-      <a href="/pkg/crypto/#SHA512"><code>crypto.SHA512</code></a>.
-      They also now support Ed25519ctx and Ed25519ph with context,
-      indicated by setting the new
-      <a href="/pkg/crypto/ed25519/#Options.Context"><code>Options.Context</code></a>
-      field.
-    </p>
-  </dd>
-</dl><!-- crypto/ed25519 -->
-
-<dl id="crypto/rsa"><dt><a href="/pkg/crypto/rsa/">crypto/rsa</a></dt>
-  <dd>
-    <p><!-- CL 418874, https://go.dev/issue/19974 -->
-      The new field <a href="/pkg/crypto/rsa/#OAEPOptions.MGFHash"><code>OAEPOptions.MGFHash</code></a>
-      allows configuring the MGF1 hash separately for OAEP decryption.
-    </p>
-
-    <p><!-- https://go.dev/issue/20654 -->
-      crypto/rsa now uses a new, safer, constant-time backend. This causes a CPU
-      runtime increase for decryption operations between approximately 15%
-      (RSA-2048 on amd64) and 45% (RSA-4096 on arm64), and more on 32-bit architectures.
-      Encryption operations are approximately 20x slower than before (but still 5-10x faster than decryption).
-      Performance is expected to improve in future releases.
-      Programs must not modify or manually generate the fields of
-      <a href="/pkg/crypto/rsa/#PrecomputedValues"><code>PrecomputedValues</code></a>.
-    </p>
-  </dd>
-</dl><!-- crypto/rsa -->
-
-<dl id="crypto/subtle"><dt><a href="/pkg/crypto/subtle/">crypto/subtle</a></dt>
-  <dd>
-    <p><!-- https://go.dev/issue/53021, CL 421435 -->
-      The new function <a href="/pkg/crypto/subtle/#XORBytes"><code>XORBytes</code></a>
-      XORs two byte slices together.
-    </p>
-  </dd>
-</dl><!-- crypto/subtle -->
-
-<dl id="crypto/tls"><dt><a href="/pkg/crypto/tls/">crypto/tls</a></dt>
-  <dd>
-    <p><!-- CL 426455, CL 427155, CL 426454, https://go.dev/issue/46035 -->
-      Parsed certificates are now shared across all clients actively using that certificate.
-      The memory savings can be significant in programs that make many concurrent connections to a
-      server or collection of servers sharing any part of their certificate chains.
-    </p>
-
-    <p><!-- https://go.dev/issue/48152, CL 449336 -->
-      For a handshake failure due to a certificate verification failure,
-      the TLS client and server now return an error of the new type
-      <a href="/pkg/crypto/tls/#CertificateVerificationError"><code>CertificateVerificationError</code></a>,
-      which includes the presented certificates.
-    </p>
-  </dd>
-</dl><!-- crypto/tls -->
-
-<dl id="crypto/x509"><dt><a href="/pkg/crypto/x509/">crypto/x509</a></dt>
-  <dd>
-    <p><!-- CL 450816, CL 450815 -->
-      <a href="/pkg/crypto/x509/#ParsePKCS8PrivateKey"><code>ParsePKCS8PrivateKey</code></a>
-      and
-      <a href="/pkg/crypto/x509/#MarshalPKCS8PrivateKey"><code>MarshalPKCS8PrivateKey</code></a>
-      now support keys of type <a href="/pkg/crypto/ecdh.PrivateKey"><code>*crypto/ecdh.PrivateKey</code></a>.
-      <a href="/pkg/crypto/x509/#ParsePKIXPublicKey"><code>ParsePKIXPublicKey</code></a>
-      and
-      <a href="/pkg/crypto/x509/#MarshalPKIXPublicKey"><code>MarshalPKIXPublicKey</code></a>
-      now support keys of type <a href="/pkg/crypto/ecdh.PublicKey"><code>*crypto/ecdh.PublicKey</code></a>.
-      Parsing NIST curve keys still returns values of type
-      <code>*ecdsa.PublicKey</code> and <code>*ecdsa.PrivateKey</code>.
-      Use their new <code>ECDH</code> methods to convert to the <code>crypto/ecdh</code> types.
-    </p>
-    <p><!-- CL 449235 -->
-      The new <a href="/pkg/crypto/x509/#SetFallbackRoots"><code>SetFallbackRoots</code></a>
-      function allows a program to define a set of fallback root certificates in case an
-      operating system verifier or standard platform root bundle is unavailable at runtime.
-      It will most commonly be used with a new package, <a href="/pkg/golang.org/x/crypto/x509roots/fallback">golang.org/x/crypto/x509roots/fallback</a>,
-      which will provide an up to date root bundle.
-    </p>
-  </dd>
-</dl><!-- crypto/x509 -->
-
-<dl id="debug/elf"><dt><a href="/pkg/debug/elf/">debug/elf</a></dt>
-  <dd>
-    <p><!-- CL 429601 -->
-      Attempts to read from a <code>SHT_NOBITS</code> section using
-      <a href="/pkg/debug/elf/#Section.Data"><code>Section.Data</code></a>
-      or the reader returned by <a href="/pkg/debug/elf/#Section.Open"><code>Section.Open</code></a>
-      now return an error.
-    </p>
-    <p><!-- CL 420982 -->
-      Additional <a href="/pkg/debug/elf/#R_LARCH"><code>R_LARCH_*</code></a> constants are defined for use with LoongArch systems.
-    </p>
-    <p><!-- CL 420982, CL 435415, CL 425555 -->
-      Additional <a href="/pkg/debug/elf/#R_PPC64"><code>R_PPC64_*</code></a> constants are defined for use with PPC64 ELFv2 relocations.
-    </p>
-    <p><!-- CL 411915 -->
-      The constant value for <a href="/pkg/debug/elf/#R_PPC64_SECTOFF_LO_DS"><code>R_PPC64_SECTOFF_LO_DS</code></a> is corrected, from 61 to 62.
-    </p>
-  </dd>
-</dl><!-- debug/elf -->
-
-<dl id="debug/gosym"><dt><a href="/pkg/debug/gosym/">debug/gosym</a></dt>
-  <dd>
-    <p><!-- https://go.dev/issue/37762, CL 317917 -->
-      Due to a change of <a href="#linker">Go's symbol naming conventions</a>, tools that
-      process Go binaries should use Go 1.20's <code>debug/gosym</code> package to
-      transparently handle both old and new binaries.
-    </p>
-  </dd>
-</dl><!-- debug/gosym -->
-
-<dl id="debug/pe"><dt><a href="/pkg/debug/pe/">debug/pe</a></dt>
-  <dd>
-    <p><!-- CL 421357 -->
-      Additional <a href="/pkg/debug/pe/#IMAGE_FILE_MACHINE_RISCV128"><code>IMAGE_FILE_MACHINE_RISCV*</code></a> constants are defined for use with RISC-V systems.
-    </p>
-  </dd>
-</dl><!-- debug/pe -->
-
-<dl id="encoding/binary"><dt><a href="/pkg/encoding/binary/">encoding/binary</a></dt>
-  <dd>
-    <p><!-- CL 420274 -->
-      The <a href="/pkg/encoding/binary/#ReadVarint"><code>ReadVarint</code></a> and
-      <a href="/pkg/encoding/binary/#ReadUvarint"><code>ReadUvarint</code></a>
-      functions will now return <code>io.ErrUnexpectedEOF</code> after reading a partial value,
-      rather than <code>io.EOF</code>.
-    </p>
-  </dd>
-</dl><!-- encoding/binary -->
-
-<dl id="encoding/xml"><dt><a href="/pkg/encoding/xml/">encoding/xml</a></dt>
-  <dd>
-    <p><!-- https://go.dev/issue/53346, CL 424777 -->
-      The new <a href="/pkg/encoding/xml/#Encoder.Close"><code>Encoder.Close</code></a> method
-      can be used to check for unclosed elements when finished encoding.
-    </p>
-
-    <p><!-- CL 103875, CL 105636 -->
-      The decoder now rejects element and attribute names with more than one colon,
-      such as <code>&lt;a:b:c&gt;</code>,
-      as well as namespaces that resolve to an empty string, such as <code>xmlns:a=""</code>.
-    </p>
-
-    <p><!-- CL 107255 -->
-      The decoder now rejects elements that use different namespace prefixes in the opening and closing tag,
-      even if those prefixes both denote the same namespace.
-    </p>
-  </dd>
-</dl><!-- encoding/xml -->
-
-<dl id="errors"><dt><a href="/pkg/errors/">errors</a></dt>
-  <dd>
-    <p><!-- https://go.dev/issue/53435 -->
-      The new <a href="/pkg/errors/#Join"><code>Join</code></a> function returns an error wrapping a list of errors.
-    </p>
-  </dd>
-</dl><!-- errors -->
-
-<dl id="fmt"><dt><a href="/pkg/fmt/">fmt</a></dt>
-  <dd>
-    <p><!-- https://go.dev/issue/53435 -->
-      The <a href="/pkg/fmt/#Errorf"><code>Errorf</code></a> function supports multiple occurrences of
-      the <code>%w</code> format verb, returning an error that unwraps to the list of all arguments to <code>%w</code>.
-    </p>
-    <p><!-- https://go.dev/issue/51668, CL 400875 -->
-      The new <a href="/pkg/fmt/#FormatString"><code>FormatString</code></a> function recovers the
-      formatting directive corresponding to a <a href="/pkg/fmt/#State"><code>State</code></a>,
-      which can be useful in <a href="/pkg/fmt/#Formatter"><code>Formatter</code></a>.
-      implementations.
-    </p>
-  </dd>
-</dl><!-- fmt -->
-
-<dl id="go/ast"><dt><a href="/pkg/go/ast/">go/ast</a></dt>
-  <dd>
-    <p><!-- CL 426091, https://go.dev/issue/50429 -->
-      The new <a href="/pkg/go/ast/#RangeStmt.Range"><code>RangeStmt.Range</code></a> field
-      records the position of the <code>range</code> keyword in a range statement.
-    </p>
-    <p><!-- CL 427955, https://go.dev/issue/53202 -->
-      The new <a href="/pkg/go/ast/#File.FileStart"><code>File.FileStart</code></a>
-      and <a href="/pkg/go/ast/#File.FileEnd"><code>File.FileEnd</code></a> fields
-      record the position of the start and end of the entire source file.
-    </p>
-  </dd>
-</dl><!-- go/ast -->
-
-<dl id="go/token"><dt><a href="/pkg/go/token/">go/token</a></dt>
-  <dd>
-    <p><!-- CL 410114, https://go.dev/issue/53200 -->
-      The new <a href="/pkg/go/token/#FileSet.RemoveFile"><code>FileSet.RemoveFile</code></a> method
-      removes a file from a <code>FileSet</code>.
-      Long-running programs can use this to release memory associated
-      with files they no longer need.
-    </p>
-  </dd>
-</dl><!-- go/token -->
-
-<dl id="go/types"><dt><a href="/pkg/go/types/">go/types</a></dt>
-  <dd>
-    <p><!-- CL 454575 -->
-      The new <a href="/pkg/go/types/#Satisfies"><code>Satisfies</code></a> function reports
-      whether a type satisfies a constraint.
-      This change aligns with the <a href="#language">new language semantics</a>
-      that distinguish satisfying a constraint from implementing an interface.
-    </p>
-  </dd>
-</dl><!-- go/types -->
-
-<dl id="io"><dt><a href="/pkg/io/">io</a></dt>
-  <dd>
-    <p><!-- https://go.dev/issue/45899, CL 406776 -->
-      The new <a href="/pkg/io/#OffsetWriter"><code>OffsetWriter</code></a> wraps an underlying
-      <a href="/pkg/io/#WriterAt"><code>WriterAt</code></a>
-      and provides <code>Seek</code>, <code>Write</code>, and <code>WriteAt</code> methods
-      that adjust their effective file offset position by a fixed amount.
-    </p>
-  </dd>
-</dl><!-- io -->
-
-<dl id="io/fs"><dt><a href="/pkg/io/fs/">io/fs</a></dt>
-  <dd>
-    <p><!-- CL 363814, https://go.dev/issue/47209 -->
-      The new error <a href="/pkg/io/fs/#SkipAll"><code>SkipAll</code></a>
-      terminates a <a href="/pkg/io/fs/#WalkDir"><code>WalkDir</code></a>
-      immediately but successfully.
-    </p>
-  </dd>
-</dl><!-- io -->
-
-<dl id="math/big"><dt><a href="/pkg/math/big/">math/big</a></dt>
-  <dd>
-    <p><!-- https://go.dev/issue/52182 -->
-      The <a href="/pkg/math/big/">math/big</a> package's wide scope and
-      input-dependent timing make it ill-suited for implementing cryptography.
-      The cryptography packages in the standard library no longer call non-trivial
-      <a href="/pkg/math/big#Int">Int</a> methods on attacker-controlled inputs.
-      In the future, the determination of whether a bug in math/big is
-      considered a security vulnerability will depend on its wider impact on the
-      standard library.
-    </p>
-  </dd>
-</dl><!-- math/big -->
-
-<dl id="math/rand"><dt><a href="/pkg/math/rand/">math/rand</a></dt>
-  <dd>
-    <p><!-- https://go.dev/issue/54880, CL 436955, https://go.dev/issue/56319 -->
-      The <a href="/pkg/math/rand/">math/rand</a> package now automatically seeds
-      the global random number generator
-      (used by top-level functions like <code>Float64</code> and <code>Int</code>) with a random value,
-      and the top-level <a href="/pkg/math/rand/#Seed"><code>Seed</code></a> function has been deprecated.
-      Programs that need a reproducible sequence of random numbers
-      should prefer to allocate their own random source, using <code>rand.New(rand.NewSource(seed))</code>.
-    </p>
-    <p>
-      Programs that need the earlier consistent global seeding behavior can set
-      <code>GODEBUG=randautoseed=0</code> in their environment.
-    </p>
-    <p><!-- https://go.dev/issue/20661 -->
-      The top-level <a href="/pkg/math/rand/#Read"><code>Read</code></a> function has been deprecated.
-      In almost all cases,  <a href="/pkg/crypto/rand/#Read"><code>crypto/rand.Read</code></a> is more appropriate.
-    </p>
-  </dd>
-</dl><!-- math/rand -->
-
-<dl id="mime"><dt><a href="/pkg/mime/">mime</a></dt>
-  <dd>
-    <p><!-- https://go.dev/issue/48866 -->
-      The <a href="/pkg/mime/#ParseMediaType"><code>ParseMediaType</code></a> function now allows duplicate parameter names,
-      so long as the values of the names are the same.
-    </p>
-  </dd>
-</dl><!-- mime -->
-
-<dl id="mime/multipart"><dt><a href="/pkg/mime/multipart/">mime/multipart</a></dt>
-  <dd>
-    <p><!-- CL 431675 -->
-      Methods of the <a href="/pkg/mime/multipart/#Reader"><code>Reader</code></a> type now wrap errors
-      returned by the underlying <code>io.Reader</code>.
-    </p>
-  </dd>
-</dl><!-- mime/multipart -->
-
-<dl id="net"><dt><a href="/pkg/net/">net</a></dt>
-  <dd>
-    <p><!-- https://go.dev/issue/50101, CL 446179 -->
-      The <a href="/pkg/net/#LookupCNAME"><code>LookupCNAME</code></a>
-      function now consistently returns the contents
-      of a <code>CNAME</code> record when one exists. Previously on Unix systems and
-      when using the pure Go resolver, <code>LookupCNAME</code> would return an error
-      if a <code>CNAME</code> record referred to a name that with no <code>A</code>,
-      <code>AAAA</code>, or <code>CNAME</code> record. This change modifies
-      <code>LookupCNAME</code> to match the previous behavior on Windows,
-      allowing <code>LookupCNAME</code> to succeed whenever a
-      <code>CNAME</code> exists.
-    </p>
-
-    <p><!-- https://go.dev/issue/53482, CL 413454 -->
-      <a href="/pkg/net/#Interface.Flags"><code>Interface.Flags</code></a> now includes the new flag <code>FlagRunning</code>,
-      indicating an operationally active interface. An interface which is administratively
-      configured but not active (for example, because the network cable is not connected)
-      will have <code>FlagUp</code> set but not <code>FlagRunning</code>.
-    </p>
-
-    <p><!-- https://go.dev/issue/55301, CL 444955 -->
-      The new <a href="/pkg/net/#Dialer.ControlContext"><code>Dialer.ControlContext</code></a> field contains a callback function
-      similar to the existing <a href="/pkg/net/#Dialer.Control"><code>Dialer.Control</code></a> hook, that additionally
-      accepts the dial context as a parameter.
-      <code>Control</code> is ignored when <code>ControlContext</code> is not nil.
-    </p>
-
-    <p><!-- CL 428955 -->
-      The Go DNS resolver recognizes the <code>trust-ad</code> resolver option.
-      When <code>options trust-ad</code> is set in <code>resolv.conf</code>,
-      the Go resolver will set the AD bit in DNS queries. The resolver does not
-      make use of the AD bit in responses.
-    </p>
-
-    <p><!-- CL 448075 -->
-      DNS resolution will detect changes to <code>/etc/nsswitch.conf</code>
-      and reload the file when it changes. Checks are made at most once every
-      five seconds, matching the previous handling of <code>/etc/hosts</code>
-      and <code>/etc/resolv.conf</code>.
-    </p>
-  </dd>
-</dl><!-- net -->
-
-<dl id="net/http"><dt><a href="/pkg/net/http/">net/http</a></dt>
-  <dd>
-    <p><!-- https://go.dev/issue/51914 -->
-      The <a href="/pkg/net/http/#ResponseWriter.WriteHeader"><code>ResponseWriter.WriteHeader</code></a> function now supports sending
-      <code>1xx</code> status codes.
-    </p>
-
-    <p><!-- https://go.dev/issue/41773, CL 356410 -->
-      The new <a href="/pkg/net/http/#Server.DisableGeneralOptionsHandler"><code>Server.DisableGeneralOptionsHandler</code></a> configuration setting
-      allows disabling the default <code>OPTIONS *</code> handler.
-    </p>
-
-    <p><!-- https://go.dev/issue/54299, CL 447216 -->
-      The new <a href="/pkg/net/http/#Transport.OnProxyConnectResponse"><code>Transport.OnProxyConnectResponse</code></a> hook is called
-      when a <code>Transport</code> receives an HTTP response from a proxy
-      for a <code>CONNECT</code> request.
-    </p>
-
-    <p><!-- https://go.dev/issue/53960, CL 418614  -->
-      The HTTP server now accepts HEAD requests containing a body,
-      rather than rejecting them as invalid.
-    </p>
-
-    <p><!-- https://go.dev/issue/53896 -->
-      HTTP/2 stream errors returned by <code>net/http</code> functions may be converted
-      to a <a href="/pkg/golang.org/x/net/http2/#StreamError"><code>golang.org/x/net/http2.StreamError</code></a> using
-      <a href="/pkg/errors/#As"><code>errors.As</code></a>.
-    </p>
-
-    <p><!-- https://go.dev/cl/397734 -->
-      Leading and trailing spaces are trimmed from cookie names,
-      rather than being rejected as invalid.
-      For example, a cookie setting of "name =value"
-      is now accepted as setting the cookie "name".
-    </p>
-  </dd>
-</dl><!-- net/http -->
-
-<dl id="net/netip"><dt><a href="/pkg/net/netip/">net/netip</a></dt>
-  <dd>
-    <p><!-- https://go.dev/issue/51766, https://go.dev/issue/51777, CL 412475 -->
-      The new <a href="/pkg/net/netip/#IPv6LinkLocalAllRouters"><code>IPv6LinkLocalAllRouters</code></a>
-      and <a href="/pkg/net/netip/#IPv6Loopback"><code>IPv6Loopback</code></a> functions
-      are the <code>net/netip</code> equivalents of
-      <a href="/pkg/net/#IPv6loopback"><code>net.IPv6loopback</code></a> and
-      <a href="/pkg/net/#IPv6linklocalallrouters"><code>net.IPv6linklocalallrouters</code></a>.
-    </p>
-  </dd>
-</dl><!-- net/netip -->
-
-<dl id="os"><dt><a href="/pkg/os/">os</a></dt>
-  <dd>
-    <p><!-- CL 448897 -->
-      On Windows, the name <code>NUL</code> is no longer treated as a special case in
-      <a href="/pkg/os/#Mkdir"><code>Mkdir</code></a> and
-      <a href="/pkg/os/#Stat"><code>Stat</code></a>.
-    </p>
-    <p><!-- https://go.dev/issue/52747, CL 405275 -->
-      On Windows, <a href="/pkg/os/#File.Stat"><code>File.Stat</code></a>
-      now uses the file handle to retrieve attributes when the file is a directory.
-      Previously it would use the path passed to
-      <a href="/pkg/os/#Open"><code>Open</code></a>, which may no longer be the file
-      represented by the file handle if the file has been moved or replaced.
-      This change modifies <code>Open</code> to open directories without the
-      <code>FILE_SHARE_DELETE</code> access, which match the behavior of regular files.
-    </p>
-    <p><!-- https://go.dev/issue/36019, CL 405275 -->
-      On Windows, <a href="/pkg/os/#File.Seek"><code>File.Seek</code></a> now supports
-      seeking to the beginning of a directory.
-    </p>
-  </dd>
-</dl><!-- os -->
-
-<dl id="os/exec"><dt><a href="/pkg/os/exec/">os/exec</a></dt>
-  <dd>
-    <p><!-- https://go.dev/issue/50436, CL 401835 -->
-      The new <a href="/pkg/os/exec/#Cmd"><code>Cmd</code></a> fields
-      <a href="/pkg/os/exec/#Cmd.Cancel"><code>Cancel</code></a> and
-      <a href="/pkg/os/exec/#Cmd.WaitDelay"><code>WaitDelay</code></a>
-      specify the behavior of the <code>Cmd</code> when its associated
-      <code>Context</code> is canceled or its process exits with I/O pipes still
-      held open by a child process.
-    </p>
-  </dd>
-</dl><!-- os/exec -->
-
-<dl id="path/filepath"><dt><a href="/pkg/path/filepath/">path/filepath</a></dt>
-  <dd>
-    <p><!-- CL 363814, https://go.dev/issue/47209 -->
-      The new error <a href="/pkg/path/filepath/#SkipAll"><code>SkipAll</code></a>
-      terminates a <a href="/pkg/path/filepath/#Walk"><code>Walk</code></a>
-      immediately but successfully.
-    </p>
-    <p><!-- https://go.dev/issue/56219, CL 449239 -->
-      The new <a href="/pkg/path/filepath/#IsLocal"><code>IsLocal</code></a> function reports whether a path is
-      lexically local to a directory.
-      For example, if <code>IsLocal(p)</code> is <code>true</code>,
-      then <code>Open(p)</code> will refer to a file that is lexically
-      within the subtree rooted at the current directory.
-    </p>
-  </dd>
-</dl><!-- io -->
-
-<dl id="reflect"><dt><a href="/pkg/reflect/">reflect</a></dt>
-  <dd>
-    <p><!-- https://go.dev/issue/46746, CL 423794 -->
-      The new <a href="/pkg/reflect/#Value.Comparable"><code>Value.Comparable</code></a> and
-      <a href="/pkg/reflect/#Value.Equal"><code>Value.Equal</code></a> methods
-      can be used to compare two <code>Value</code>s for equality.
-      <code>Comparable</code> reports whether <code>Equal</code> is a valid operation for a given <code>Value</code> receiver.
-    </p>
-
-    <p><!-- https://go.dev/issue/48000, CL 389635 -->
-      The new <a href="/pkg/reflect/#Value.Grow"><code>Value.Grow</code></a> method
-      extends a slice to guarantee space for another <code>n</code> elements.
-    </p>
-
-    <p><!-- https://go.dev/issue/52376, CL 411476 -->
-      The new <a href="/pkg/reflect/#Value.SetZero"><code>Value.SetZero</code></a> method
-      sets a value to be the zero value for its type.
-    </p>
-
-    <p><!-- CL 425184 -->
-      Go 1.18 introduced <a href="/pkg/reflect/#Value.SetIterKey"><code>Value.SetIterKey</code></a>
-      and <a href="/pkg/reflect/#Value.SetIterValue"><code>Value.SetIterValue</code></a> methods.
-      These are optimizations: <code>v.SetIterKey(it)</code> is meant to be equivalent to <code>v.Set(it.Key())</code>.
-      The implementations incorrectly omitted a check for use of unexported fields that was present in the unoptimized forms.
-      Go 1.20 corrects these methods to include the unexported field check.
-    </p>
-  </dd>
-</dl><!-- reflect -->
-
-<dl id="regexp"><dt><a href="/pkg/regexp/">regexp</a></dt>
-  <dd>
-    <p><!-- CL 444817 -->
-      Go 1.19.2 and Go 1.18.7 included a security fix to the regular expression parser,
-      making it reject very large expressions that would consume too much memory.
-      Because Go patch releases do not introduce new API,
-      the parser returned <a href="/pkg/regexp/syntax/#ErrInternalError"><code>syntax.ErrInternalError</code></a> in this case.
-      Go 1.20 adds a more specific error, <a href="/pkg/regexp/syntax/#ErrLarge"><code>syntax.ErrLarge</code></a>,
-      which the parser now returns instead.
-    </p>
-  </dd>
-</dl><!-- regexp -->
-
-<dl id="runtime/cgo"><dt><a href="/pkg/runtime/cgo/">runtime/cgo</a></dt>
-  <dd>
-    <p><!-- https://go.dev/issue/46731, CL 421879 -->
-      Go 1.20 adds new <a href="/pkg/runtime/cgo/#Incomplete"><code>Incomplete</code></a> marker type.
-      Code generated by cgo will use <code>cgo.Incomplete</code> to mark an incomplete C type.
-    </p>
-  </dd>
-</dl><!-- runtime/cgo -->
-
-<dl id="runtime/metrics"><dt><a href="/pkg/runtime/metrics/">runtime/metrics</a></dt>
-  <dd>
-    <p><!-- https://go.dev/issue/47216, https://go.dev/issue/49881 -->
-      Go 1.20 adds new <a href="/pkg/runtime/metrics/#hdr-Supported_metrics">supported metrics</a>,
-      including the current <code>GOMAXPROCS</code> setting (<code>/sched/gomaxprocs:threads</code>),
-      the number of cgo calls executed (<code>/cgo/go-to-c-calls:calls</code>),
-      total mutex block time (<code>/sync/mutex/wait/total</code>), and various measures of time
-      spent in garbage collection.
-    </p>
-
-    <p><!-- CL 427615 -->
-      Time-based histogram metrics are now less precise, but take up much less memory.
-    </p>
-  </dd>
-</dl><!-- runtime/metrics -->
-
-<dl id="runtime/pprof"><dt><a href="/pkg/runtime/pprof/">runtime/pprof</a></dt>
-  <dd>
-    <p><!-- CL 443056 -->
-      Mutex profile samples are now pre-scaled, fixing an issue where old mutex profile
-      samples would be scaled incorrectly if the sampling rate changed during execution.
-    </p>
-
-    <p><!-- CL 416975 -->
-      Profiles collected on Windows now include memory mapping information that fixes
-      symbolization issues for position-independent binaries.
-    </p>
-  </dd>
-</dl><!-- runtime/pprof -->
-
-<dl id="runtime/trace"><dt><a href="/pkg/runtime/trace/">runtime/trace</a></dt>
-  <dd>
-    <p><!-- CL 447135, https://go.dev/issue/55022 -->
-      The garbage collector's background sweeper now yields less frequently,
-      resulting in many fewer extraneous events in execution traces.
-    </p>
-  </dd>
-</dl><!-- runtime/trace -->
-
-<dl id="strings"><dt><a href="/pkg/strings/">strings</a></dt>
-  <dd>
-    <p><!-- CL 407176, https://go.dev/issue/42537 -->
-      The new
-      <a href="/pkg/strings/#CutPrefix"><code>CutPrefix</code></a> and
-      <a href="/pkg/strings/#CutSuffix"><code>CutSuffix</code></a> functions
-      are like <a href="/pkg/strings/#TrimPrefix"><code>TrimPrefix</code></a>
-      and <a href="/pkg/strings/#TrimSuffix"><code>TrimSuffix</code></a>
-      but also report whether the string was trimmed.
-    </p>
-
-    <p><!-- CL 359675, https://go.dev/issue/45038 -->
-      The new <a href="/pkg/strings/#Clone"><code>Clone</code></a> function
-      allocates a copy of a string.
-    </p>
-  </dd>
-</dl><!-- strings -->
-
-<dl id="sync"><dt><a href="/pkg/sync/">sync</a></dt>
-  <dd>
-    <p><!-- CL 399094, https://go.dev/issue/51972 -->
-      The new <a href="/pkg/sync/#Map"><code>Map</code></a> methods <a href="/pkg/sync/#Map.Swap"><code>Swap</code></a>,
-      <a href="/pkg/sync/#Map.CompareAndSwap"><code>CompareAndSwap</code></a>, and
-      <a href="/pkg/sync/#Map.CompareAndDelete"><code>CompareAndDelete</code></a>
-      allow existing map entries to be updated atomically.
-    </p>
-  </dd>
-</dl><!-- sync -->
-
-<dl id="syscall"><dt><a href="/pkg/syscall/">syscall</a></dt>
-  <dd>
-    <p><!-- CL 411596 -->
-      On FreeBSD, compatibility shims needed for FreeBSD 11 and earlier have been removed.
-    </p>
-    <p><!-- CL 407574 -->
-      On Linux, additional <a href="/pkg/syscall/#CLONE_CLEAR_SIGHAND"><code>CLONE_*</code></a> constants
-      are defined for use with the <a href="/pkg/syscall/#SysProcAttr.Cloneflags"><code>SysProcAttr.Cloneflags</code></a> field.
-    </p>
-    <p><!-- CL 417695 -->
-      On Linux, the new <a href="/pkg/syscall/#SysProcAttr.CgroupFD"><code>SysProcAttr.CgroupFD</code></a>
-      and <a href="/pkg/syscall/#SysProcAttr.UseCgroupFD"><code>SysProcAttr.UseCgroupFD</code></a> fields
-      provide a way to place a child process into a specific cgroup.
-    </p>
-  </dd>
-</dl><!-- syscall -->
-
-<dl id="testing"><dt><a href="/pkg/testing/">testing</a></dt>
-  <dd>
-    <p><!-- https://go.dev/issue/43620, CL 420254 -->
-      The new method <a href="/pkg/testing/#B.Elapsed"><code>B.Elapsed</code></a>
-      reports the current elapsed time of the benchmark, which may be useful for
-      calculating rates to report with <code>ReportMetric</code>.
-    </p>
-  </dd>
-</dl><!-- testing -->
-
-<dl id="time"><dt><a href="/pkg/time/">time</a></dt>
-  <dd>
-    <p><!-- https://go.dev/issue/52746, CL 412495 -->
-      The new time layout constants <a href="/pkg/time/#DateTime"><code>DateTime</code></a>,
-      <a href="/pkg/time/#DateOnly"><code>DateOnly</code></a>, and
-      <a href="/pkg/time/#TimeOnly"><code>TimeOnly</code></a>
-      provide names for three of the most common layout strings used in a survey of public Go source code.
-    </p>
-
-    <p><!-- CL 382734, https://go.dev/issue/50770 -->
-      The new <a href="/pkg/time/#Time.Compare"><code>Time.Compare</code></a> method
-      compares two times.
-    </p>
-
-    <p><!-- CL 425037 -->
-      <a href="/pkg/time/#Parse"><code>Parse</code></a>
-      now ignores sub-nanosecond precision in its input,
-      instead of reporting those digits as an error.
-    </p>
-
-    <p><!-- CL 444277 -->
-      The <a href="/pkg/time/#Time.MarshalJSON"><code>Time.MarshalJSON</code></a> method
-      is now more strict about adherence to RFC 3339.
-    </p>
-  </dd>
-</dl><!-- time -->
-
-<dl id="unicode/utf16"><dt><a href="/pkg/unicode/utf16/">unicode/utf16</a></dt>
-  <dd>
-    <p><!-- https://go.dev/issue/51896, CL 409054 -->
-      The new  <a href="/pkg/unicode/utf16/#AppendRune"><code>AppendRune</code></a>
-      function appends the UTF-16 encoding of a given rune to a uint16 slice,
-      analogous to <a href="/pkg/unicode/utf8/#AppendRune"><code>utf8.AppendRune</code></a>.
-    </p>
-  </dd>
-</dl><!-- unicode/utf16 -->
-
-<!-- Silence false positives from x/build/cmd/relnote: -->
-<!-- https://go.dev/issue/45964 was documented in Go 1.18 release notes but closed recently -->
-<!-- https://go.dev/issue/52114 is an accepted proposal to add golang.org/x/net/http2.Transport.DialTLSContext; it's not a part of the Go release -->
-<!-- CL 431335: cmd/api: make check pickier about api/*.txt -->
-<!-- CL 447896 api: add newline to 55301.txt; modified api/next/55301.txt -->
-<!-- CL 449215 api/next/54299: add missing newline; modified api/next/54299.txt -->
-<!-- CL 433057 cmd: update vendored golang.org/x/tools for multiple error wrapping -->
-<!-- CL 423362 crypto/internal/boring: update to newer boringcrypto, add arm64 -->
-<!-- https://go.dev/issue/53481 x/cryptobyte ReadUint64, AddUint64 -->
-<!-- https://go.dev/issue/51994 x/crypto/ssh -->
-<!-- https://go.dev/issue/55358 x/exp/slices -->
-<!-- https://go.dev/issue/54714 x/sys/unix -->
-<!-- https://go.dev/issue/50035 https://go.dev/issue/54237 x/time/rate -->
-<!-- CL 345488 strconv optimization -->
-<!-- CL 428757 reflect deprecation, rolled back -->
-<!-- https://go.dev/issue/49390 compile -l -N is fully supported -->
-<!-- https://go.dev/issue/54619 x/tools -->
-<!-- CL 448898 reverted -->
-<!-- https://go.dev/issue/54850 x/net/http2 Transport.MaxReadFrameSize -->
-<!-- https://go.dev/issue/56054 x/net/http2 SETTINGS_HEADER_TABLE_SIZE -->
-<!-- CL 450375 reverted -->
-<!-- CL 453259 tracking deprecations in api -->
-<!-- CL 453260 tracking darwin port in api -->
-<!-- CL 453615 fix deprecation comment in archive/tar -->
-<!-- CL 453616 fix deprecation comment in archive/zip -->
-<!-- CL 453617 fix deprecation comment in encoding/csv -->
-<!-- https://go.dev/issue/54661 x/tools/go/analysis -->
-<!-- CL 423359, https://go.dev/issue/51317 arena -->
diff --git a/doc/go_spec.html b/doc/go_spec.html
index f93f2ab..c39a442 100644
--- a/doc/go_spec.html
+++ b/doc/go_spec.html
@@ -1,6 +1,6 @@
 <!--{
 	"Title": "The Go Programming Language Specification",
-	"Subtitle": "Version of December 15, 2022",
+	"Subtitle": "Version of Aug 2, 2023",
 	"Path": "/ref/spec"
 }-->
 
@@ -643,6 +643,7 @@
 a <a href="#Constant_expressions">constant expression</a>,
 a <a href="#Conversions">conversion</a> with a result that is a constant, or
 the result value of some built-in functions such as
+<code>min</code> or <code>max</code> applied to constant arguments,
 <code>unsafe.Sizeof</code> applied to <a href="#Package_unsafe">certain values</a>,
 <code>cap</code> or <code>len</code> applied to
 <a href="#Length_and_capacity">some expressions</a>,
@@ -690,7 +691,7 @@
 for instance, in a <a href="#Short_variable_declarations">short variable declaration</a>
 such as <code>i := 0</code> where there is no explicit type.
 The default type of an untyped constant is <code>bool</code>, <code>rune</code>,
-<code>int</code>, <code>float64</code>, <code>complex128</code> or <code>string</code>
+<code>int</code>, <code>float64</code>, <code>complex128</code>, or <code>string</code>
 respectively, depending on whether it is a boolean, rune, integer, floating-point,
 complex, or string constant.
 </p>
@@ -1644,8 +1645,10 @@
 and may change during execution. Elements may be added during execution
 using <a href="#Assignment_statements">assignments</a> and retrieved with
 <a href="#Index_expressions">index expressions</a>; they may be removed with the
-<a href="#Deletion_of_map_elements"><code>delete</code></a> built-in function.
+<a href="#Deletion_of_map_elements"><code>delete</code></a> and
+<a href="#Clear"><code>clear</code></a> built-in function.
 </p>
+
 <p>
 A new, empty map value is made using the built-in
 function <a href="#Making_slices_maps_and_channels"><code>make</code></a>,
@@ -1883,7 +1886,7 @@
 
 <p>
 Note that <code>bytestring</code> is not a real type; it cannot be used to declare
-variables are compose other types. It exists solely to describe the behavior of some
+variables or compose other types. It exists solely to describe the behavior of some
 operations that read from a sequence of bytes, which may be a byte slice or a string.
 </p>
 
@@ -2316,8 +2319,8 @@
 	nil
 
 Functions:
-	append cap close complex copy delete imag len
-	make new panic print println real recover
+	append cap clear close complex copy delete imag len
+	make max min new panic print println real recover
 </pre>
 
 <h3 id="Exported_identifiers">Exported identifiers</h3>
@@ -2508,7 +2511,7 @@
 
 <p>
 A type definition creates a new, distinct type with the same
-<a href="#Types">underlying type</a> and operations as the given type
+<a href="#Underlying_types">underlying type</a> and operations as the given type
 and binds an identifier, the <i>type name</i>, to it.
 </p>
 
@@ -2645,7 +2648,7 @@
 <p>
 All non-blank names in the list must be unique.
 Each name declares a type parameter, which is a new and different <a href="#Types">named type</a>
-that acts as a place holder for an (as of yet) unknown type in the declaration.
+that acts as a placeholder for an (as of yet) unknown type in the declaration.
 The type parameter is replaced with a <i>type argument</i> upon
 <a href="#Instantiations">instantiation</a> of the generic function or type.
 </p>
@@ -2759,7 +2762,7 @@
 int                          // implements comparable (int is strictly comparable)
 []byte                       // does not implement comparable (slices cannot be compared)
 interface{}                  // does not implement comparable (see above)
-interface{ ~int | ~string }  // type parameter only: implements comparable (int, string types are stricly comparable)
+interface{ ~int | ~string }  // type parameter only: implements comparable (int, string types are strictly comparable)
 interface{ comparable }      // type parameter only: implements comparable (comparable implements itself)
 interface{ ~int | ~[]byte }  // type parameter only: does not implement comparable (slices are not comparable)
 interface{ ~struct{ any } }  // type parameter only: does not implement comparable (field any is not strictly comparable)
@@ -2802,7 +2805,7 @@
 type argument      type constraint                // constraint satisfaction
 
 int                interface{ ~int }              // satisfied: int implements interface{ ~int }
-string             comparable                     // satisfied: string implements comparable (string is stricty comparable)
+string             comparable                     // satisfied: string implements comparable (string is strictly comparable)
 []byte             comparable                     // not satisfied: slices are not comparable
 any                interface{ comparable; int }   // not satisfied: any does not implement interface{ int }
 any                comparable                     // satisfied: any is comparable and implements the basic interface any
@@ -4337,24 +4340,46 @@
 </pre>
 
 <p>
-For a generic function, type arguments may be provided explicitly, or they
-may be partially or completely <a href="#Type_inference">inferred</a>.
-A generic function that is <i>not</i> <a href="#Calls">called</a> requires a
-type argument list for instantiation; if the list is partial, all
-remaining type arguments must be inferrable.
-A generic function that is called may provide a (possibly partial) type
-argument list, or may omit it entirely if the omitted type arguments are
-inferrable from the ordinary (non-type) function arguments.
+When using a generic function, type arguments may be provided explicitly,
+or they may be partially or completely <a href="#Type_inference">inferred</a>
+from the context in which the function is used.
+Provided that they can be inferred, type argument lists may be omitted entirely if the function is:
+</p>
+
+<ul>
+<li>
+	<a href="#Calls">called</a> with ordinary arguments,
+</li>
+<li>
+	<a href="#Assignment_statements">assigned</a> to a variable with a known type
+</li>
+<li>
+	<a href="#Calls">passed as an argument</a> to another function, or
+</li>
+<li>
+	<a href="#Return_statements">returned as a result</a>.
+</li>
+</ul>
+
+<p>
+In all other cases, a (possibly partial) type argument list must be present.
+If a type argument list is absent or partial, all missing type arguments
+must be inferrable from the context in which the function is used.
 </p>
 
 <pre>
-func min[T ~int|~float64](x, y T) T { … }
+// sum returns the sum (concatenation, for strings) of its arguments.
+func sum[T ~int | ~float64 | ~string](x... T) T { … }
 
-f := min                   // illegal: min must be instantiated with type arguments when used without being called
-minInt := min[int]         // minInt has type func(x, y int) int
-a := minInt(2, 3)          // a has value 2 of type int
-b := min[float64](2.0, 3)  // b has value 2.0 of type float64
-c := min(b, -1)            // c has value -1.0 of type float64
+x := sum                       // illegal: the type of x is unknown
+intSum := sum[int]             // intSum has type func(x... int) int
+a := intSum(2, 3)              // a has value 5 of type int
+b := sum[float64](2.0, 3)      // b has value 5.0 of type float64
+c := sum(b, -1)                // c has value 4.0 of type float64
+
+type sumFunc func(x... string) string
+var f sumFunc = sum            // same as var f sumFunc = sum[string]
+f = sum                        // same as f = sum[string]
 </pre>
 
 <p>
@@ -4381,398 +4406,323 @@
 <h3 id="Type_inference">Type inference</h3>
 
 <p>
-Missing function type arguments may be <i>inferred</i> by a series of steps, described below.
-Each step attempts to use known information to infer additional type arguments.
-Type inference stops as soon as all type arguments are known.
-After type inference is complete, it is still necessary to substitute all type arguments
-for type parameters and verify that each type argument
-<a href="#Implementing_an_interface">implements</a> the relevant constraint;
-it is possible for an inferred type argument to fail to implement a constraint, in which
-case instantiation fails.
+A use of a generic function may omit some or all type arguments if they can be
+<i>inferred</i> from the context within which the function is used, including
+the constraints of the function's type parameters.
+Type inference succeeds if it can infer the missing type arguments
+and <a href="#Instantiations">instantiation</a> succeeds with the
+inferred type arguments.
+Otherwise, type inference fails and the program is invalid.
 </p>
 
 <p>
-Type inference is based on
+Type inference uses the type relationships between pairs of types for inference:
+For instance, a function argument must be <a href="#Assignability">assignable</a>
+to its respective function parameter; this establishes a relationship between the
+type of the argument and the type of the parameter.
+If either of these two types contains type parameters, type inference looks for the
+type arguments to substitute the type parameters with such that the assignability
+relationship is satisfied.
+Similarly, type inference uses the fact that a type argument must
+<a href="#Satisfying_a_type_constraint">satisfy</a> the constraint of its respective
+type parameter.
+</p>
+
+<p>
+Each such pair of matched types corresponds to a <i>type equation</i> containing
+one or multiple type parameters, from one or possibly multiple generic functions.
+Inferring the missing type arguments means solving the resulting set of type
+equations for the respective type parameters.
+</p>
+
+<p>
+For example, given
+</p>
+
+<pre>
+// dedup returns a copy of the argument slice with any duplicate entries removed.
+func dedup[S ~[]E, E comparable](S) S { … }
+
+type Slice []int
+var s Slice
+s = dedup(s)   // same as s = dedup[Slice, int](s)
+</pre>
+
+<p>
+the variable <code>s</code> of type <code>Slice</code> must be assignable to
+the function parameter type <code>S</code> for the program to be valid.
+To reduce complexity, type inference ignores the directionality of assignments,
+so the type relationship between <code>Slice</code> and <code>S</code> can be
+expressed via the (symmetric) type equation <code>Slice ≡<sub>A</sub> S</code>
+(or <code>S ≡<sub>A</sub> Slice</code> for that matter),
+where the <code><sub>A</sub></code> in <code>≡<sub>A</sub></code>
+indicates that the LHS and RHS types must match per assignability rules
+(see the section on <a href="#Type_unification">type unification</a> for
+details).
+Similarly, the type parameter <code>S</code> must satisfy its constraint
+<code>~[]E</code>. This can be expressed as <code>S ≡<sub>C</sub> ~[]E</code>
+where <code>X ≡<sub>C</sub> Y</code> stands for
+"<code>X</code> satisfies constraint <code>Y</code>".
+These observations lead to a set of two equations
+</p>
+
+<pre>
+	Slice ≡<sub>A</sub> S      (1)
+	S     ≡<sub>C</sub> ~[]E   (2)
+</pre>
+
+<p>
+which now can be solved for the type parameters <code>S</code> and <code>E</code>.
+From (1) a compiler can infer that the type argument for <code>S</code> is <code>Slice</code>.
+Similarly, because the underlying type of <code>Slice</code> is <code>[]int</code>
+and <code>[]int</code> must match <code>[]E</code> of the constraint,
+a compiler can infer that <code>E</code> must be <code>int</code>.
+Thus, for these two equations, type inference infers
+</p>
+
+<pre>
+	S ➞ Slice
+	E ➞ int
+</pre>
+
+<p>
+Given a set of type equations, the type parameters to solve for are
+the type parameters of the functions that need to be instantiated
+and for which no explicit type arguments is provided.
+These type parameters are called <i>bound</i> type parameters.
+For instance, in the <code>dedup</code> example above, the type parameters
+<code>P</code> and <code>E</code> are bound to <code>dedup</code>.
+An argument to a generic function call may be a generic function itself.
+The type parameters of that function are included in the set of bound
+type parameters.
+The types of function arguments may contain type parameters from other
+functions (such as a generic function enclosing a function call).
+Those type parameters may also appear in type equations but they are
+not bound in that context.
+Type equations are always solved for the bound type parameters only.
+</p>
+
+<p>
+Type inference supports calls of generic functions and assignments
+of generic functions to (explicitly function-typed) variables.
+This includes passing generic functions as arguments to other
+(possibly also generic) functions, and returning generic functions
+as results.
+Type inference operates on a set of equations specific to each of
+these cases.
+The equations are as follows (type argument lists are omitted for clarity):
 </p>
 
 <ul>
 <li>
-	a <a href="#Type_parameter_declarations">type parameter list</a>
+	<p>
+	For a function call <code>f(a<sub>0</sub>, a<sub>1</sub>, …)</code> where
+	<code>f</code> or a function argument <code>a<sub>i</sub></code> is
+	a generic function:
+	<br>
+	Each pair <code>(a<sub>i</sub>, p<sub>i</sub>)</code> of corresponding
+	function arguments and parameters where <code>a<sub>i</sub></code> is not an
+	<a href="#Constants">untyped constant</a> yields an equation
+	<code>typeof(p<sub>i</sub>) ≡<sub>A</sub> typeof(a<sub>i</sub>)</code>.
+	<br>
+	If <code>a<sub>i</sub></code> is an untyped constant <code>c<sub>j</sub></code>,
+	and <code>typeof(p<sub>i</sub>)</code> is a bound type parameter <code>P<sub>k</sub></code>,
+	the pair <code>(c<sub>j</sub>, P<sub>k</sub>)</code> is collected separately from
+	the type equations.
+	</p>
 </li>
 <li>
-	a substitution map <i>M</i> initialized with the known type arguments, if any
+	<p>
+	For an assignment <code>v = f</code> of a generic function <code>f</code> to a
+	(non-generic) variable <code>v</code> of function type:
+	<br>
+	<code>typeof(v) ≡<sub>A</sub> typeof(f)</code>.
+	</p>
 </li>
 <li>
-	a (possibly empty) list of ordinary function arguments (in case of a function call only)
+	<p>
+	For a return statement <code>return …, f, … </code> where <code>f</code> is a
+	generic function returned as a result to a (non-generic) result variable
+	<code>r</code> of function type:
+	<br>
+	<code>typeof(r) ≡<sub>A</sub> typeof(f)</code>.
+	</p>
 </li>
 </ul>
 
 <p>
-and then proceeds with the following steps:
+Additionally, each type parameter <code>P<sub>k</sub></code> and corresponding type constraint
+<code>C<sub>k</sub></code> yields the type equation
+<code>P<sub>k</sub> ≡<sub>C</sub> C<sub>k</sub></code>.
+</p>
+
+<p>
+Type inference gives precedence to type information obtained from typed operands
+before considering untyped constants.
+Therefore, inference proceeds in two phases:
 </p>
 
 <ol>
 <li>
-	apply <a href="#Function_argument_type_inference"><i>function argument type inference</i></a>
-	to all <i>typed</i> ordinary function arguments
+	<p>
+	The type equations are solved for the bound
+	type parameters using <a href="#Type_unification">type unification</a>.
+	If unification fails, type inference fails.
+	</p>
 </li>
 <li>
-	apply <a href="#Constraint_type_inference"><i>constraint type inference</i></a>
-</li>
-<li>
-	apply function argument type inference to all <i>untyped</i> ordinary function arguments
-	using the default type for each of the untyped function arguments
-</li>
-<li>
-	apply constraint type inference
+	<p>
+	For each bound type parameter <code>P<sub>k</sub></code> for which no type argument
+	has been inferred yet and for which one or more pairs
+	<code>(c<sub>j</sub>, P<sub>k</sub>)</code> with that same type parameter
+	were collected, determine the <a href="#Constant_expressions">constant kind</a>
+	of the constants <code>c<sub>j</sub></code> in all those pairs the same way as for
+	<a href="#Constant_expressions">constant expressions</a>.
+	The type argument for <code>P<sub>k</sub></code> is the
+	<a href="#Constants">default type</a> for the determined constant kind.
+	If a constant kind cannot be determined due to conflicting constant kinds,
+	type inference fails.
+	</p>
 </li>
 </ol>
 
 <p>
-If there are no ordinary or untyped function arguments, the respective steps are skipped.
-Constraint type inference is skipped if the previous step didn't infer any new type arguments,
-but it is run at least once if there are missing type arguments.
+If not all type arguments have been found after these two phases, type inference fails.
 </p>
 
 <p>
-The substitution map <i>M</i> is carried through all steps, and each step may add entries to <i>M</i>.
-The process stops as soon as <i>M</i> has a type argument for each type parameter or if an inference step fails.
-If an inference step fails, or if <i>M</i> is still missing type arguments after the last step, type inference fails.
+If the two phases are successful, type inference determined a type argument for each
+bound type parameter:
+</p>
+
+<pre>
+	P<sub>k</sub> ➞ A<sub>k</sub>
+</pre>
+
+<p>
+A type argument <code>A<sub>k</sub></code> may be a composite type,
+containing other bound type parameters <code>P<sub>k</sub></code> as element types
+(or even be just another bound type parameter).
+In a process of repeated simplification, the bound type parameters in each type
+argument are substituted with the respective type arguments for those type
+parameters until each type argument is free of bound type parameters.
+</p>
+
+<p>
+If type arguments contain cyclic references to themselves
+through bound type parameters, simplification and thus type
+inference fails.
+Otherwise, type inference succeeds.
 </p>
 
 <h4 id="Type_unification">Type unification</h4>
 
 <p>
-Type inference is based on <i>type unification</i>. A single unification step
-applies to a <a href="#Type_inference">substitution map</a> and two types, either
-or both of which may be or contain type parameters. The substitution map tracks
-the known (explicitly provided or already inferred) type arguments: the map
-contains an entry <code>P</code> &RightArrow; <code>A</code> for each type
-parameter <code>P</code> and corresponding known type argument <code>A</code>.
-During unification, known type arguments take the place of their corresponding type
-parameters when comparing types. Unification is the process of finding substitution
-map entries that make the two types equivalent.
+Type inference solves type equations through <i>type unification</i>.
+Type unification recursively compares the LHS and RHS types of an
+equation, where either or both types may be or contain bound type parameters,
+and looks for type arguments for those type parameters such that the LHS
+and RHS match (become identical or assignment-compatible, depending on
+context).
+To that effect, type inference maintains a map of bound type parameters
+to inferred type arguments; this map is consulted and updated during type unification.
+Initially, the bound type parameters are known but the map is empty.
+During type unification, if a new type argument <code>A</code> is inferred,
+the respective mapping <code>P ➞ A</code> from type parameter to argument
+is added to the map.
+Conversely, when comparing types, a known type argument
+(a type argument for which a map entry already exists)
+takes the place of its corresponding type parameter.
+As type inference progresses, the map is populated more and more
+until all equations have been considered, or until unification fails.
+Type inference succeeds if no unification step fails and the map has
+an entry for each type parameter.
 </p>
 
-<p>
-For unification, two types that don't contain any type parameters from the current type
-parameter list are <i>equivalent</i>
-if they are identical, or if they are channel types that are identical ignoring channel
-direction, or if their underlying types are equivalent.
-</p>
-
-<p>
-Unification works by comparing the structure of pairs of types: their structure
-disregarding type parameters must be identical, and types other than type parameters
-must be equivalent.
-A type parameter in one type may match any complete subtype in the other type;
-each successful match causes an entry to be added to the substitution map.
-If the structure differs, or types other than type parameters are not equivalent,
-unification fails.
-</p>
-
-<!--
-TODO(gri) Somewhere we need to describe the process of adding an entry to the
-          substitution map: if the entry is already present, the type argument
-	  values are themselves unified.
--->
-
-<p>
-For example, if <code>T1</code> and <code>T2</code> are type parameters,
-<code>[]map[int]bool</code> can be unified with any of the following:
+</pre>
+For example, given the type equation with the bound type parameter
+<code>P</code>
 </p>
 
 <pre>
-[]map[int]bool   // types are identical
-T1               // adds T1 &RightArrow; []map[int]bool to substitution map
-[]T1             // adds T1 &RightArrow; map[int]bool to substitution map
-[]map[T1]T2      // adds T1 &RightArrow; int and T2 &RightArrow; bool to substitution map
+	[10]struct{ elem P, list []P } ≡<sub>A</sub> [10]struct{ elem string; list []string }
 </pre>
 
 <p>
-On the other hand, <code>[]map[int]bool</code> cannot be unified with any of
-</p>
-
-<pre>
-int              // int is not a slice
-struct{}         // a struct is not a slice
-[]struct{}       // a struct is not a map
-[]map[T1]string  // map element types don't match
-</pre>
-
-<p>
-As an exception to this general rule, because a <a href="#Type_definitions">defined type</a>
-<code>D</code> and a type literal <code>L</code> are never equivalent,
-unification compares the underlying type of <code>D</code> with <code>L</code> instead.
-For example, given the defined type
-</p>
-
-<pre>
-type Vector []float64
-</pre>
-
-<p>
-and the type literal <code>[]E</code>, unification compares <code>[]float64</code> with
-<code>[]E</code> and adds an entry <code>E</code> &RightArrow; <code>float64</code> to
-the substitution map.
-</p>
-
-<h4 id="Function_argument_type_inference">Function argument type inference</h4>
-
-<!-- In this section and the section on constraint type inference we start with examples
-rather than have the examples follow the rules as is customary elsewhere in spec.
-Hopefully this helps building an intuition and makes the rules easier to follow. -->
-
-<p>
-Function argument type inference infers type arguments from function arguments:
-if a function parameter is declared with a type <code>T</code> that uses
-type parameters,
-<a href="#Type_unification">unifying</a> the type of the corresponding
-function argument with <code>T</code> may infer type arguments for the type
-parameters used by <code>T</code>.
+type inference starts with an empty map.
+Unification first compares the top-level structure of the LHS and RHS
+types.
+Both are arrays of the same length; they unify if the element types unify.
+Both element types are structs; they unify if they have
+the same number of fields with the same names and if the
+field types unify.
+The type argument for <code>P</code> is not known yet (there is no map entry),
+so unifying <code>P</code> with <code>string</code> adds
+the mapping <code>P ➞ string</code> to the map.
+Unifying the types of the <code>list</code> field requires
+unifying <code>[]P</code> and <code>[]string</code> and
+thus <code>P</code> and <code>string</code>.
+Since the type argument for <code>P</code> is known at this point
+(there is a map entry for <code>P</code>), its type argument
+<code>string</code> takes the place of <code>P</code>.
+And since <code>string</code> is identical to <code>string</code>,
+this unification step succeeds as well.
+Unification of the LHS and RHS of the equation is now finished.
+Type inference succeeds because there is only one type equation,
+no unification step failed, and the map is fully populated.
 </p>
 
 <p>
-For instance, given the generic function
-</p>
-
-<pre>
-func scale[Number ~int64|~float64|~complex128](v []Number, s Number) []Number
-</pre>
-
-<p>
-and the call
-</p>
-
-<pre>
-var vector []float64
-scaledVector := scale(vector, 42)
-</pre>
-
-<p>
-the type argument for <code>Number</code> can be inferred from the function argument
-<code>vector</code> by unifying the type of <code>vector</code> with the corresponding
-parameter type: <code>[]float64</code> and <code>[]Number</code>
-match in structure and <code>float64</code> matches with <code>Number</code>.
-This adds the entry <code>Number</code> &RightArrow; <code>float64</code> to the
-<a href="#Type_unification">substitution map</a>.
-Untyped arguments, such as the second function argument <code>42</code> here, are ignored
-in the first round of function argument type inference and only considered if there are
-unresolved type parameters left.
+Unification uses a combination of <i>exact</i> and <i>loose</i>
+unification depending on whether two types have to be
+<a href="#Type_identity">identical</a>,
+<a href="#Assignability">assignment-compatible</a>, or
+only structurally equal.
+The respective <a href="#Type_unification_rules">type unification rules</a>
+are spelled out in detail in the <a href="#Appendix">Appendix</a>.
 </p>
 
 <p>
-Inference happens in two separate phases; each phase operates on a specific list of
-(parameter, argument) pairs:
+For an equation of the form <code>X ≡<sub>A</sub> Y</code>,
+where <code>X</code> and <code>Y</code> are types involved
+in an assignment (including parameter passing and return statements),
+the top-level type structures may unify loosely but element types
+must unify exactly, matching the rules for assignments.
 </p>
 
-<ol>
+<p>
+For an equation of the form <code>P ≡<sub>C</sub> C</code>,
+where <code>P</code> is a type parameter and <code>C</code>
+its corresponding constraint, the unification rules are bit
+more complicated:
+</p>
+
+<ul>
 <li>
-	The list <i>Lt</i> contains all (parameter, argument) pairs where the parameter
-	type uses type parameters and where the function argument is <i>typed</i>.
+	If <code>C</code> has a <a href="#Core_types">core type</a>
+	<code>core(C)</code>
+	and <code>P</code> has a known type argument <code>A</code>,
+	<code>core(C)</code> and <code>A</code> must unify loosely.
+	If <code>P</code> does not have a known type argument
+	and <code>C</code> contains exactly one type term <code>T</code>
+	that is not an underlying (tilde) type, unification adds the
+	mapping <code>P ➞ T</code> to the map.
 </li>
 <li>
-	The list <i>Lu</i> contains all remaining pairs where the parameter type is a single
-	type parameter. In this list, the respective function arguments are untyped.
+	If <code>C</code> does not have a core type
+	and <code>P</code> has a known type argument <code>A</code>,
+	<code>A</code> must have all methods of <code>C</code>, if any,
+	and corresponding method types must unify exactly.
 </li>
-</ol>
+</ul>
 
 <p>
-Any other (parameter, argument) pair is ignored.
-</p>
-
-<p>
-By construction, the arguments of the pairs in <i>Lu</i> are <i>untyped</i> constants
-(or the untyped boolean result of a comparison). And because <a href="#Constants">default types</a>
-of untyped values are always predeclared non-composite types, they can never match against
-a composite type, so it is sufficient to only consider parameter types that are single type
-parameters.
-</p>
-
-<p>
-Each list is processed in a separate phase:
-</p>
-
-<ol>
-<li>
-	In the first phase, the parameter and argument types of each pair in <i>Lt</i>
-	are unified. If unification succeeds for a pair, it may yield new entries that
-	are added to the substitution map <i>M</i>. If unification fails, type inference
-	fails.
-</li>
-<li>
-	The second phase considers the entries of list <i>Lu</i>. Type parameters for
-	which the type argument has already been determined are ignored in this phase.
-	For each remaining pair, the parameter type (which is a single type parameter) and
-	the <a href="#Constants">default type</a> of the corresponding untyped argument is
-	unified. If unification fails, type inference fails.
-</li>
-</ol>
-
-<p>
-While unification is successful, processing of each list continues until all list elements
-are considered, even if all type arguments are inferred before the last list element has
-been processed.
-</p>
-
-<p>
-Example:
-</p>
-
-<pre>
-func min[T ~int|~float64](x, y T) T
-
-var x int
-min(x, 2.0)    // T is int, inferred from typed argument x; 2.0 is assignable to int
-min(1.0, 2.0)  // T is float64, inferred from default type for 1.0 and matches default type for 2.0
-min(1.0, 2)    // illegal: default type float64 (for 1.0) doesn't match default type int (for 2)
-</pre>
-
-<p>
-In the example <code>min(1.0, 2)</code>, processing the function argument <code>1.0</code>
-yields the substitution map entry <code>T</code> &RightArrow; <code>float64</code>. Because
-processing continues until all untyped arguments are considered, an error is reported. This
-ensures that type inference does not depend on the order of the untyped arguments.
-</p>
-
-<h4 id="Constraint_type_inference">Constraint type inference</h4>
-
-<p>
-Constraint type inference infers type arguments by considering type constraints.
-If a type parameter <code>P</code> has a constraint with a
-<a href="#Core_types">core type</a> <code>C</code>,
-<a href="#Type_unification">unifying</a> <code>P</code> with <code>C</code>
-may infer additional type arguments, either the type argument for <code>P</code>,
-or if that is already known, possibly the type arguments for type parameters
-used in <code>C</code>.
-</p>
-
-<p>
-For instance, consider the type parameter list with type parameters <code>List</code> and
-<code>Elem</code>:
-</p>
-
-<pre>
-[List ~[]Elem, Elem any]
-</pre>
-
-<p>
-Constraint type inference can deduce the type of <code>Elem</code> from the type argument
-for <code>List</code> because <code>Elem</code> is a type parameter in the core type
-<code>[]Elem</code> of <code>List</code>.
-If the type argument is <code>Bytes</code>:
-</p>
-
-<pre>
-type Bytes []byte
-</pre>
-
-<p>
-unifying the underlying type of <code>Bytes</code> with the core type means
-unifying <code>[]byte</code> with <code>[]Elem</code>. That unification succeeds and yields
-the <a href="#Type_unification">substitution map</a> entry
-<code>Elem</code> &RightArrow; <code>byte</code>.
-Thus, in this example, constraint type inference can infer the second type argument from the
-first one.
-</p>
-
-<p>
-Using the core type of a constraint may lose some information: In the (unlikely) case that
-the constraint's type set contains a single <a href="#Type_definitions">defined type</a>
-<code>N</code>, the corresponding core type is <code>N</code>'s underlying type rather than
-<code>N</code> itself. In this case, constraint type inference may succeed but instantiation
-will fail because the inferred type is not in the type set of the constraint.
-Thus, constraint type inference uses the <i>adjusted core type</i> of
-a constraint: if the type set contains a single type, use that type; otherwise use the
-constraint's core type.
-</p>
-
-<p>
-Generally, constraint type inference proceeds in two phases: Starting with a given
-substitution map <i>M</i>
-</p>
-
-<ol>
-<li>
-For all type parameters with an adjusted core type, unify the type parameter with that
-type. If any unification fails, constraint type inference fails.
-</li>
-
-<li>
-At this point, some entries in <i>M</i> may map type parameters to other
-type parameters or to types containing type parameters. For each entry
-<code>P</code> &RightArrow; <code>A</code> in <i>M</i> where <code>A</code> is or
-contains type parameters <code>Q</code> for which there exist entries
-<code>Q</code> &RightArrow; <code>B</code> in <i>M</i>, substitute those
-<code>Q</code> with the respective <code>B</code> in <code>A</code>.
-Stop when no further substitution is possible.
-</li>
-</ol>
-
-<p>
-The result of constraint type inference is the final substitution map <i>M</i> from type
-parameters <code>P</code> to type arguments <code>A</code> where no type parameter <code>P</code>
-appears in any of the <code>A</code>.
-</p>
-
-<p>
-For instance, given the type parameter list
-</p>
-
-<pre>
-[A any, B []C, C *A]
-</pre>
-
-<p>
-and the single provided type argument <code>int</code> for type parameter <code>A</code>,
-the initial substitution map <i>M</i> contains the entry <code>A</code> &RightArrow; <code>int</code>.
-</p>
-
-<p>
-In the first phase, the type parameters <code>B</code> and <code>C</code> are unified
-with the core type of their respective constraints. This adds the entries
-<code>B</code> &RightArrow; <code>[]C</code> and <code>C</code> &RightArrow; <code>*A</code>
-to <i>M</i>.
-
-<p>
-At this point there are two entries in <i>M</i> where the right-hand side
-is or contains type parameters for which there exists other entries in <i>M</i>:
-<code>[]C</code> and <code>*A</code>.
-In the second phase, these type parameters are replaced with their respective
-types. It doesn't matter in which order this happens. Starting with the state
-of <i>M</i> after the first phase:
-</p>
-
-<p>
-<code>A</code> &RightArrow; <code>int</code>,
-<code>B</code> &RightArrow; <code>[]C</code>,
-<code>C</code> &RightArrow; <code>*A</code>
-</p>
-
-<p>
-Replace <code>A</code> on the right-hand side of &RightArrow; with <code>int</code>:
-</p>
-
-<p>
-<code>A</code> &RightArrow; <code>int</code>,
-<code>B</code> &RightArrow; <code>[]C</code>,
-<code>C</code> &RightArrow; <code>*int</code>
-</p>
-
-<p>
-Replace <code>C</code> on the right-hand side of &RightArrow; with <code>*int</code>:
-</p>
-
-<p>
-<code>A</code> &RightArrow; <code>int</code>,
-<code>B</code> &RightArrow; <code>[]*int</code>,
-<code>C</code> &RightArrow; <code>*int</code>
-</p>
-
-<p>
-At this point no further substitution is possible and the map is full.
-Therefore, <code>M</code> represents the final map of type parameters
-to type arguments for the given type parameter list.
+When solving type equations from type constraints,
+solving one equation may infer additional type arguments,
+which in turn may enable solving other equations that depend
+on those type arguments.
+Type inference repeats type unification as long as new type
+arguments are inferred.
 </p>
 
 <h3 id="Operators">Operators</h3>
@@ -5450,7 +5400,7 @@
 	ignoring struct tags (see below),
 	<code>x</code>'s type and <code>T</code> are not
 	<a href="#Type_parameter_declarations">type parameters</a> but have
-	<a href="#Type_identity">identical</a> <a href="#Types">underlying types</a>.
+	<a href="#Type_identity">identical</a> <a href="#Underlying_types">underlying types</a>.
 	</li>
 	<li>
 	ignoring struct tags (see below),
@@ -5581,21 +5531,6 @@
 
 <ol>
 <li>
-Converting a signed or unsigned integer value to a string type yields a
-string containing the UTF-8 representation of the integer. Values outside
-the range of valid Unicode code points are converted to <code>"\uFFFD"</code>.
-
-<pre>
-string('a')       // "a"
-string(-1)        // "\ufffd" == "\xef\xbf\xbd"
-string(0xf8)      // "\u00f8" == "ø" == "\xc3\xb8"
-
-type myString string
-myString(0x65e5)  // "\u65e5" == "日" == "\xe6\x97\xa5"
-</pre>
-</li>
-
-<li>
 Converting a slice of bytes to a string type yields
 a string whose successive bytes are the elements of the slice.
 
@@ -5661,6 +5596,31 @@
 []myRune(myString("🌐"))    // []myRune{0x1f310}
 </pre>
 </li>
+
+<li>
+Finally, for historical reasons, an integer value may be converted to a string type.
+This form of conversion yields a string containing the (possibly multi-byte) UTF-8
+representation of the Unicode code point with the given integer value.
+Values outside the range of valid Unicode code points are converted to <code>"\uFFFD"</code>.
+
+<pre>
+string('a')          // "a"
+string(65)           // "A"
+string('\xf8')       // "\u00f8" == "ø" == "\xc3\xb8"
+string(-1)           // "\ufffd" == "\xef\xbf\xbd"
+
+type myString string
+myString('\u65e5')   // "\u65e5" == "日" == "\xe6\x97\xa5"
+</pre>
+
+Note: This form of conversion may eventually be removed from the language.
+The <a href="/pkg/cmd/vet"><code>go vet</code></a> tool flags certain
+integer-to-string conversions as potential errors.
+Library functions such as
+<a href="/pkg/unicode/utf8#AppendRune"><code>utf8.AppendRune</code></a> or
+<a href="/pkg/unicode/utf8#EncodeRune"><code>utf8.EncodeRune</code></a>
+should be used instead.
+</li>
 </ol>
 
 <h4 id="Conversions_from_slice_to_array_or_array_pointer">Conversions from slice to array or array pointer</h4>
@@ -6027,7 +5987,7 @@
 
 <pre>
 append cap complex imag len make new real
-unsafe.Add unsafe.Alignof unsafe.Offsetof unsafe.Sizeof unsafe.Slice
+unsafe.Add unsafe.Alignof unsafe.Offsetof unsafe.Sizeof unsafe.Slice unsafe.SliceData unsafe.String unsafe.StringData
 </pre>
 
 <pre>
@@ -6209,7 +6169,7 @@
 for i, x[i] = range x {  // set i, x[2] = 0, x[0]
 	break
 }
-// after this loop, i == 0 and x == []int{3, 5, 3}
+// after this loop, i == 0 and x is []int{3, 5, 3}
 </pre>
 
 <p>
@@ -7181,176 +7141,6 @@
 they cannot be used as function values.
 </p>
 
-<h3 id="Close">Close</h3>
-
-<p>
-For an argument <code>ch</code> with a <a href="#Core_types">core type</a>
-that is a <a href="#Channel_types">channel</a>, the built-in function <code>close</code>
-records that no more values will be sent on the channel.
-It is an error if <code>ch</code> is a receive-only channel.
-Sending to or closing a closed channel causes a <a href="#Run_time_panics">run-time panic</a>.
-Closing the nil channel also causes a <a href="#Run_time_panics">run-time panic</a>.
-After calling <code>close</code>, and after any previously
-sent values have been received, receive operations will return
-the zero value for the channel's type without blocking.
-The multi-valued <a href="#Receive_operator">receive operation</a>
-returns a received value along with an indication of whether the channel is closed.
-</p>
-
-<h3 id="Length_and_capacity">Length and capacity</h3>
-
-<p>
-The built-in functions <code>len</code> and <code>cap</code> take arguments
-of various types and return a result of type <code>int</code>.
-The implementation guarantees that the result always fits into an <code>int</code>.
-</p>
-
-<pre class="grammar">
-Call      Argument type    Result
-
-len(s)    string type      string length in bytes
-          [n]T, *[n]T      array length (== n)
-          []T              slice length
-          map[K]T          map length (number of defined keys)
-          chan T           number of elements queued in channel buffer
-          type parameter   see below
-
-cap(s)    [n]T, *[n]T      array length (== n)
-          []T              slice capacity
-          chan T           channel buffer capacity
-          type parameter   see below
-</pre>
-
-<p>
-If the argument type is a <a href="#Type_parameter_declarations">type parameter</a> <code>P</code>,
-the call <code>len(e)</code> (or <code>cap(e)</code> respectively) must be valid for
-each type in <code>P</code>'s type set.
-The result is the length (or capacity, respectively) of the argument whose type
-corresponds to the type argument with which <code>P</code> was
-<a href="#Instantiations">instantiated</a>.
-</p>
-
-<p>
-The capacity of a slice is the number of elements for which there is
-space allocated in the underlying array.
-At any time the following relationship holds:
-</p>
-
-<pre>
-0 &lt;= len(s) &lt;= cap(s)
-</pre>
-
-<p>
-The length of a <code>nil</code> slice, map or channel is 0.
-The capacity of a <code>nil</code> slice or channel is 0.
-</p>
-
-<p>
-The expression <code>len(s)</code> is <a href="#Constants">constant</a> if
-<code>s</code> is a string constant. The expressions <code>len(s)</code> and
-<code>cap(s)</code> are constants if the type of <code>s</code> is an array
-or pointer to an array and the expression <code>s</code> does not contain
-<a href="#Receive_operator">channel receives</a> or (non-constant)
-<a href="#Calls">function calls</a>; in this case <code>s</code> is not evaluated.
-Otherwise, invocations of <code>len</code> and <code>cap</code> are not
-constant and <code>s</code> is evaluated.
-</p>
-
-<pre>
-const (
-	c1 = imag(2i)                    // imag(2i) = 2.0 is a constant
-	c2 = len([10]float64{2})         // [10]float64{2} contains no function calls
-	c3 = len([10]float64{c1})        // [10]float64{c1} contains no function calls
-	c4 = len([10]float64{imag(2i)})  // imag(2i) is a constant and no function call is issued
-	c5 = len([10]float64{imag(z)})   // invalid: imag(z) is a (non-constant) function call
-)
-var z complex128
-</pre>
-
-<h3 id="Allocation">Allocation</h3>
-
-<p>
-The built-in function <code>new</code> takes a type <code>T</code>,
-allocates storage for a <a href="#Variables">variable</a> of that type
-at run time, and returns a value of type <code>*T</code>
-<a href="#Pointer_types">pointing</a> to it.
-The variable is initialized as described in the section on
-<a href="#The_zero_value">initial values</a>.
-</p>
-
-<pre class="grammar">
-new(T)
-</pre>
-
-<p>
-For instance
-</p>
-
-<pre>
-type S struct { a int; b float64 }
-new(S)
-</pre>
-
-<p>
-allocates storage for a variable of type <code>S</code>,
-initializes it (<code>a=0</code>, <code>b=0.0</code>),
-and returns a value of type <code>*S</code> containing the address
-of the location.
-</p>
-
-<h3 id="Making_slices_maps_and_channels">Making slices, maps and channels</h3>
-
-<p>
-The built-in function <code>make</code> takes a type <code>T</code>,
-optionally followed by a type-specific list of expressions.
-The <a href="#Core_types">core type</a> of <code>T</code> must
-be a slice, map or channel.
-It returns a value of type <code>T</code> (not <code>*T</code>).
-The memory is initialized as described in the section on
-<a href="#The_zero_value">initial values</a>.
-</p>
-
-<pre class="grammar">
-Call             Core type    Result
-
-make(T, n)       slice        slice of type T with length n and capacity n
-make(T, n, m)    slice        slice of type T with length n and capacity m
-
-make(T)          map          map of type T
-make(T, n)       map          map of type T with initial space for approximately n elements
-
-make(T)          channel      unbuffered channel of type T
-make(T, n)       channel      buffered channel of type T, buffer size n
-</pre>
-
-
-<p>
-Each of the size arguments <code>n</code> and <code>m</code> must be of <a href="#Numeric_types">integer type</a>,
-have a <a href="#Interface_types">type set</a> containing only integer types,
-or be an untyped <a href="#Constants">constant</a>.
-A constant size argument must be non-negative and <a href="#Representability">representable</a>
-by a value of type <code>int</code>; if it is an untyped constant it is given type <code>int</code>.
-If both <code>n</code> and <code>m</code> are provided and are constant, then
-<code>n</code> must be no larger than <code>m</code>.
-For slices and channels, if <code>n</code> is negative or larger than <code>m</code> at run time,
-a <a href="#Run_time_panics">run-time panic</a> occurs.
-</p>
-
-<pre>
-s := make([]int, 10, 100)       // slice with len(s) == 10, cap(s) == 100
-s := make([]int, 1e3)           // slice with len(s) == cap(s) == 1000
-s := make([]int, 1&lt;&lt;63)         // illegal: len(s) is not representable by a value of type int
-s := make([]int, 10, 0)         // illegal: len(s) > cap(s)
-c := make(chan int, 10)         // channel with a buffer size of 10
-m := make(map[string]int, 100)  // map with initial space for approximately 100 elements
-</pre>
-
-<p>
-Calling <code>make</code> with a map type and size hint <code>n</code> will
-create a map with initial space to hold <code>n</code> map elements.
-The precise behavior is implementation-dependent.
-</p>
-
 
 <h3 id="Appending_and_copying_slices">Appending to and copying slices</h3>
 
@@ -7389,16 +7179,16 @@
 
 <pre>
 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}
+s1 := append(s0, 2)                // append a single element     s1 is []int{0, 0, 2}
+s2 := append(s1, 3, 5, 7)          // append multiple elements    s2 is []int{0, 0, 2, 3, 5, 7}
+s3 := append(s2, s0...)            // append a slice              s3 is []int{0, 0, 2, 3, 5, 7, 0, 0}
+s4 := append(s3[3:6], s3[2:]...)   // append overlapping slice    s4 is []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"}
+t = append(t, 42, 3.1415, "foo")   //                             t is []interface{}{42, 3.1415, "foo"}
 
 var b []byte
-b = append(b, "bar"...)            // append string contents      b == []byte{'b', 'a', 'r' }
+b = append(b, "bar"...)            // append string contents      b is []byte{'b', 'a', 'r' }
 </pre>
 
 <p>
@@ -7428,33 +7218,58 @@
 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 := copy(s, a[0:])            // n1 == 6, s is []int{0, 1, 2, 3, 4, 5}
+n2 := copy(s, s[2:])            // n2 == 4, s is []int{2, 3, 4, 5, 4, 5}
+n3 := copy(b, "Hello, World!")  // n3 == 5, b is []byte("Hello")
 </pre>
 
 
-<h3 id="Deletion_of_map_elements">Deletion of map elements</h3>
+<h3 id="Clear">Clear</h3>
 
 <p>
-The built-in function <code>delete</code> removes the element with key
-<code>k</code> from a <a href="#Map_types">map</a> <code>m</code>. The
-value <code>k</code> must be <a href="#Assignability">assignable</a>
-to the key type of <code>m</code>.
+The built-in function <code>clear</code> takes an argument of <a href="#Map_types">map</a>,
+<a href="#Slice_types">slice</a>, or <a href="#Type_parameter_declarations">type parameter</a> type,
+and deletes or zeroes out all elements.
 </p>
 
 <pre class="grammar">
-delete(m, k)  // remove element m[k] from map m
+Call        Argument type     Result
+
+clear(m)    map[K]T           deletes all entries, resulting in an
+                              empty map (len(m) == 0)
+
+clear(s)    []T               sets all elements up to the length of
+                              <code>s</code> to the zero value of T
+
+clear(t)    type parameter    see below
 </pre>
 
 <p>
-If the type of <code>m</code> is a <a href="#Type_parameter_declarations">type parameter</a>,
-all types in that type set must be maps, and they must all have identical key types.
+If the type of the argument to <code>clear</code> is a
+<a href="#Type_parameter_declarations">type parameter</a>,
+all types in its type set must be maps or slices, and <code>clear</code>
+performs the operation corresponding to the actual type argument.
 </p>
 
 <p>
-If the map <code>m</code> is <code>nil</code> or the element <code>m[k]</code>
-does not exist, <code>delete</code> is a no-op.
+If the map or slice is <code>nil</code>, <code>clear</code> is a no-op.
+</p>
+
+
+<h3 id="Close">Close</h3>
+
+<p>
+For an argument <code>ch</code> with a <a href="#Core_types">core type</a>
+that is a <a href="#Channel_types">channel</a>, the built-in function <code>close</code>
+records that no more values will be sent on the channel.
+It is an error if <code>ch</code> is a receive-only channel.
+Sending to or closing a closed channel causes a <a href="#Run_time_panics">run-time panic</a>.
+Closing the nil channel also causes a <a href="#Run_time_panics">run-time panic</a>.
+After calling <code>close</code>, and after any previously
+sent values have been received, receive operations will return
+the zero value for the channel's type without blocking.
+The multi-valued <a href="#Receive_operator">receive operation</a>
+returns a received value along with an indication of whether the channel is closed.
 </p>
 
 
@@ -7526,6 +7341,251 @@
 Arguments of type parameter type are not permitted.
 </p>
 
+
+<h3 id="Deletion_of_map_elements">Deletion of map elements</h3>
+
+<p>
+The built-in function <code>delete</code> removes the element with key
+<code>k</code> from a <a href="#Map_types">map</a> <code>m</code>. The
+value <code>k</code> must be <a href="#Assignability">assignable</a>
+to the key type of <code>m</code>.
+</p>
+
+<pre class="grammar">
+delete(m, k)  // remove element m[k] from map m
+</pre>
+
+<p>
+If the type of <code>m</code> is a <a href="#Type_parameter_declarations">type parameter</a>,
+all types in that type set must be maps, and they must all have identical key types.
+</p>
+
+<p>
+If the map <code>m</code> is <code>nil</code> or the element <code>m[k]</code>
+does not exist, <code>delete</code> is a no-op.
+</p>
+
+
+<h3 id="Length_and_capacity">Length and capacity</h3>
+
+<p>
+The built-in functions <code>len</code> and <code>cap</code> take arguments
+of various types and return a result of type <code>int</code>.
+The implementation guarantees that the result always fits into an <code>int</code>.
+</p>
+
+<pre class="grammar">
+Call      Argument type    Result
+
+len(s)    string type      string length in bytes
+          [n]T, *[n]T      array length (== n)
+          []T              slice length
+          map[K]T          map length (number of defined keys)
+          chan T           number of elements queued in channel buffer
+          type parameter   see below
+
+cap(s)    [n]T, *[n]T      array length (== n)
+          []T              slice capacity
+          chan T           channel buffer capacity
+          type parameter   see below
+</pre>
+
+<p>
+If the argument type is a <a href="#Type_parameter_declarations">type parameter</a> <code>P</code>,
+the call <code>len(e)</code> (or <code>cap(e)</code> respectively) must be valid for
+each type in <code>P</code>'s type set.
+The result is the length (or capacity, respectively) of the argument whose type
+corresponds to the type argument with which <code>P</code> was
+<a href="#Instantiations">instantiated</a>.
+</p>
+
+<p>
+The capacity of a slice is the number of elements for which there is
+space allocated in the underlying array.
+At any time the following relationship holds:
+</p>
+
+<pre>
+0 &lt;= len(s) &lt;= cap(s)
+</pre>
+
+<p>
+The length of a <code>nil</code> slice, map or channel is 0.
+The capacity of a <code>nil</code> slice or channel is 0.
+</p>
+
+<p>
+The expression <code>len(s)</code> is <a href="#Constants">constant</a> if
+<code>s</code> is a string constant. The expressions <code>len(s)</code> and
+<code>cap(s)</code> are constants if the type of <code>s</code> is an array
+or pointer to an array and the expression <code>s</code> does not contain
+<a href="#Receive_operator">channel receives</a> or (non-constant)
+<a href="#Calls">function calls</a>; in this case <code>s</code> is not evaluated.
+Otherwise, invocations of <code>len</code> and <code>cap</code> are not
+constant and <code>s</code> is evaluated.
+</p>
+
+<pre>
+const (
+	c1 = imag(2i)                    // imag(2i) = 2.0 is a constant
+	c2 = len([10]float64{2})         // [10]float64{2} contains no function calls
+	c3 = len([10]float64{c1})        // [10]float64{c1} contains no function calls
+	c4 = len([10]float64{imag(2i)})  // imag(2i) is a constant and no function call is issued
+	c5 = len([10]float64{imag(z)})   // invalid: imag(z) is a (non-constant) function call
+)
+var z complex128
+</pre>
+
+
+<h3 id="Making_slices_maps_and_channels">Making slices, maps and channels</h3>
+
+<p>
+The built-in function <code>make</code> takes a type <code>T</code>,
+optionally followed by a type-specific list of expressions.
+The <a href="#Core_types">core type</a> of <code>T</code> must
+be a slice, map or channel.
+It returns a value of type <code>T</code> (not <code>*T</code>).
+The memory is initialized as described in the section on
+<a href="#The_zero_value">initial values</a>.
+</p>
+
+<pre class="grammar">
+Call             Core type    Result
+
+make(T, n)       slice        slice of type T with length n and capacity n
+make(T, n, m)    slice        slice of type T with length n and capacity m
+
+make(T)          map          map of type T
+make(T, n)       map          map of type T with initial space for approximately n elements
+
+make(T)          channel      unbuffered channel of type T
+make(T, n)       channel      buffered channel of type T, buffer size n
+</pre>
+
+<p>
+Each of the size arguments <code>n</code> and <code>m</code> must be of <a href="#Numeric_types">integer type</a>,
+have a <a href="#Interface_types">type set</a> containing only integer types,
+or be an untyped <a href="#Constants">constant</a>.
+A constant size argument must be non-negative and <a href="#Representability">representable</a>
+by a value of type <code>int</code>; if it is an untyped constant it is given type <code>int</code>.
+If both <code>n</code> and <code>m</code> are provided and are constant, then
+<code>n</code> must be no larger than <code>m</code>.
+For slices and channels, if <code>n</code> is negative or larger than <code>m</code> at run time,
+a <a href="#Run_time_panics">run-time panic</a> occurs.
+</p>
+
+<pre>
+s := make([]int, 10, 100)       // slice with len(s) == 10, cap(s) == 100
+s := make([]int, 1e3)           // slice with len(s) == cap(s) == 1000
+s := make([]int, 1&lt;&lt;63)         // illegal: len(s) is not representable by a value of type int
+s := make([]int, 10, 0)         // illegal: len(s) > cap(s)
+c := make(chan int, 10)         // channel with a buffer size of 10
+m := make(map[string]int, 100)  // map with initial space for approximately 100 elements
+</pre>
+
+<p>
+Calling <code>make</code> with a map type and size hint <code>n</code> will
+create a map with initial space to hold <code>n</code> map elements.
+The precise behavior is implementation-dependent.
+</p>
+
+
+<h3 id="Min_and_max">Min and max</h3>
+
+<p>
+The built-in functions <code>min</code> and <code>max</code> compute the
+smallest&mdash;or largest, respectively&mdash;value of a fixed number of
+arguments of <a href="#Comparison_operators">ordered types</a>.
+There must be at least one argument.
+</p>
+
+<p>
+The same type rules as for <a href="#Operators">operators</a> apply:
+for <a href="#Comparison_operators">ordered</a> arguments <code>x</code> and
+<code>y</code>, <code>min(x, y)</code> is valid if <code>x + y</code> is valid,
+and the type of <code>min(x, y)</code> is the type of <code>x + y</code>
+(and similarly for <code>max</code>).
+If all arguments are constant, the result is constant.
+</p>
+
+<pre>
+var x, y int
+m := min(x)                 // m == x
+m := min(x, y)              // m is the smaller of x and y
+m := max(x, y, 10)          // m is the larger of x and y but at least 10
+c := max(1, 2.0, 10)        // c == 10.0 (floating-point kind)
+f := max(0, float32(x))     // type of f is float32
+var s []string
+_ = min(s...)               // invalid: slice arguments are not permitted
+t := max("", "foo", "bar")  // t == "foo" (string kind)
+</pre>
+
+<p>
+For numeric arguments, assuming all NaNs are equal, <code>min</code> and <code>max</code> are
+commutative and associative:
+</p>
+
+<pre>
+min(x, y)    == min(y, x)
+min(x, y, z) == min(min(x, y), z) == min(x, min(y, z))
+</pre>
+
+<p>
+For floating-point arguments negative zero, NaN, and infinity the following rules apply:
+</p>
+
+<pre>
+   x        y    min(x, y)    max(x, y)
+
+  -0.0    0.0         -0.0          0.0    // negative zero is smaller than (non-negative) zero
+  -Inf      y         -Inf            y    // negative infinity is smaller than any other number
+  +Inf      y            y         +Inf    // positive infinity is larger than any other number
+   NaN      y          NaN          NaN    // if any argument is a NaN, the result is a NaN
+</pre>
+
+<p>
+For string arguments the result for <code>min</code> is the first argument
+with the smallest (or for <code>max</code>, largest) value,
+compared lexically byte-wise:
+</p>
+
+<pre>
+min(x, y)    == if x <= y then x else y
+min(x, y, z) == min(min(x, y), z)
+</pre>
+
+<h3 id="Allocation">Allocation</h3>
+
+<p>
+The built-in function <code>new</code> takes a type <code>T</code>,
+allocates storage for a <a href="#Variables">variable</a> of that type
+at run time, and returns a value of type <code>*T</code>
+<a href="#Pointer_types">pointing</a> to it.
+The variable is initialized as described in the section on
+<a href="#The_zero_value">initial values</a>.
+</p>
+
+<pre class="grammar">
+new(T)
+</pre>
+
+<p>
+For instance
+</p>
+
+<pre>
+type S struct { a int; b float64 }
+new(S)
+</pre>
+
+<p>
+allocates storage for a variable of type <code>S</code>,
+initializes it (<code>a=0</code>, <code>b=0.0</code>),
+and returns a value of type <code>*S</code> containing the address
+of the location.
+</p>
+
+
 <h3 id="Handling_panics">Handling panics</h3>
 
 <p> Two built-in functions, <code>panic</code> and <code>recover</code>,
@@ -7574,19 +7634,13 @@
 </p>
 
 <p>
-The return value of <code>recover</code> is <code>nil</code> if any of the following conditions holds:
+The return value of <code>recover</code> is <code>nil</code> when the
+goroutine is not panicking or <code>recover</code> was not called directly by a deferred function.
+Conversely, if a goroutine is panicking and <code>recover</code> was called directly by a deferred function,
+the return value of <code>recover</code> is guaranteed not to be <code>nil</code>.
+To ensure this, calling <code>panic</code> with a <code>nil</code> interface value (or an untyped <code>nil</code>)
+causes a <a href="#Run_time_panics">run-time panic</a>.
 </p>
-<ul>
-<li>
-<code>panic</code>'s argument was <code>nil</code>;
-</li>
-<li>
-the goroutine is not panicking;
-</li>
-<li>
-<code>recover</code> was not called directly by a deferred function.
-</li>
-</ul>
 
 <p>
 The <code>protect</code> function in the example below invokes
@@ -7629,6 +7683,7 @@
 <a href="#Types">types</a> must be supported.
 </p>
 
+
 <h2 id="Packages">Packages</h2>
 
 <p>
@@ -7902,6 +7957,9 @@
 by the order in which the files are presented to the compiler: Variables
 declared in the first file are declared before any of the variables declared
 in the second file, and so on.
+To ensure reproducible initialization behavior, build systems are encouraged
+to present multiple files belonging to the same package in lexical file name
+order to a compiler.
 </p>
 
 <p>
@@ -8012,15 +8070,30 @@
 </p>
 
 <p>
-A package with no imports is initialized by assigning initial values
-to all its package-level variables followed by calling all <code>init</code>
-functions in the order they appear in the source, possibly in multiple files,
-as presented to the compiler.
+The entire package is initialized by assigning initial values
+to all its package-level variables followed by calling
+all <code>init</code> functions in the order they appear
+in the source, possibly in multiple files, as presented
+to the compiler.
+</p>
+
+<h3 id="Program_initialization">Program initialization</h3>
+
+<p>
+The packages of a complete program are initialized stepwise, one package at a time.
 If a package has imports, the imported packages are initialized
 before initializing the package itself. If multiple packages import
 a package, the imported package will be initialized only once.
 The importing of packages, by construction, guarantees that there
 can be no cyclic initialization dependencies.
+More precisely:
+</p>
+
+<p>
+Given the list of all packages, sorted by import path, in each step the first
+uninitialized package in the list for which all imported packages (if any) are
+already initialized is <a href="#Package_initialization">initialized</a>.
+This step is repeated until all packages are initialized.
 </p>
 
 <p>
@@ -8034,13 +8107,6 @@
 until the previous one has returned.
 </p>
 
-<p>
-To ensure reproducible initialization behavior, build systems are encouraged
-to present multiple files belonging to the same package in lexical file name
-order to a compiler.
-</p>
-
-
 <h3 id="Program_execution">Program execution</h3>
 <p>
 A complete program is created by linking a single, unimported package
@@ -8056,8 +8122,8 @@
 </pre>
 
 <p>
-Program execution begins by initializing the main package and then
-invoking the function <code>main</code>.
+Program execution begins by <a href="#Program_initialization">initializing the program</a>
+and then invoking the function <code>main</code> in package <code>main</code>.
 When that function invocation returns, the program exits.
 It does not wait for other (non-<code>main</code>) goroutines to complete.
 </p>
@@ -8146,7 +8212,7 @@
 <p>
 A <code>Pointer</code> is a <a href="#Pointer_types">pointer type</a> but a <code>Pointer</code>
 value may not be <a href="#Address_operators">dereferenced</a>.
-Any pointer or value of <a href="#Types">underlying type</a> <code>uintptr</code> can be
+Any pointer or value of <a href="#Underlying_types">underlying type</a> <code>uintptr</code> can be
 <a href="#Conversions">converted</a> to a type of underlying type <code>Pointer</code> and vice versa.
 The effect of converting between <code>Pointer</code> and <code>uintptr</code> is implementation-defined.
 </p>
@@ -8294,3 +8360,145 @@
 <p>
 A struct or array type has size zero if it contains no fields (or elements, respectively) that have a size greater than zero. Two distinct zero-size variables may have the same address in memory.
 </p>
+
+<h2 id="Appendix">Appendix</h2>
+
+<h3 id="Type_unification_rules">Type unification rules</h3>
+
+<p>
+The type unification rules describe if and how two types unify.
+The precise details are relevant for Go implementations,
+affect the specifics of error messages (such as whether
+a compiler reports a type inference or other error),
+and may explain why type inference fails in unusual code situations.
+But by and large these rules can be ignored when writing Go code:
+type inference is designed to mostly "work as expected",
+and the unification rules are fine-tuned accordingly.
+</p>
+
+<p>
+Type unification is controlled by a <i>matching mode</i>, which may
+be <i>exact</i> or <i>loose</i>.
+As unification recursively descends a composite type structure,
+the matching mode used for elements of the type, the <i>element matching mode</i>,
+remains the same as the matching mode except when two types are unified for
+<a href="#Assignability">assignability</a> (<code>≡<sub>A</sub></code>):
+in this case, the matching mode is <i>loose</i> at the top level but
+then changes to <i>exact</i> for element types, reflecting the fact
+that types don't have to be identical to be assignable.
+</p>
+
+<p>
+Two types that are not bound type parameters unify exactly if any of
+following conditions is true:
+</p>
+
+<ul>
+<li>
+	Both types are <a href="#Type_identity">identical</a>.
+</li>
+<li>
+	Both types have identical structure and their element types
+	unify exactly.
+</li>
+<li>
+	Exactly one type is an <a href="#Type_inference">unbound</a>
+	type parameter with a <a href="#Core_types">core type</a>,
+	and that core type unifies with the other type per the
+	unification rules for <code>≡<sub>A</sub></code>
+	(loose unification at the top level and exact unification
+	for element types).
+</li>
+</ul>
+
+<p>
+If both types are bound type parameters, they unify per the given
+matching modes if:
+</p>
+
+<ul>
+<li>
+	Both type parameters are identical.
+</li>
+<li>
+	At most one of the type parameters has a known type argument.
+	In this case, the type parameters are <i>joined</i>:
+	they both stand for the same type argument.
+	If neither type parameter has a known type argument yet,
+	a future type argument inferred for one the type parameters
+	is simultaneously inferred for both of them.
+</li>
+<li>
+	Both type parameters have a known type argument
+	and the type arguments unify per the given matching modes.
+</li>
+</ul>
+
+<p>
+A single bound type parameter <code>P</code> and another type <code>T</code> unify
+per the given matching modes if:
+</p>
+
+<ul>
+<li>
+	<code>P</code> doesn't have a known type argument.
+	In this case, <code>T</code> is inferred as the type argument for <code>P</code>.
+</li>
+<li>
+	<code>P</code> does have a known type argument <code>A</code>,
+	<code>A</code> and <code>T</code> unify per the given matching modes,
+	and one of the following conditions is true:
+	<ul>
+	<li>
+		Both <code>A</code> and <code>T</code> are interface types:
+		In this case, if both <code>A</code> and <code>T</code> are
+		also <a href="#Type_definitions">defined</a> types,
+		they must be <a href="#Type_identity">identical</a>.
+		Otherwise, if neither of them is a defined type, they must
+		have the same number of methods
+		(unification of <code>A</code> and <code>T</code> already
+		established that the methods match).
+	</li>
+	<li>
+		Neither <code>A</code> nor <code>T</code> are interface types:
+		In this case, if <code>T</code> is a defined type, <code>T</code>
+		replaces <code>A</code> as the inferred type argument for <code>P</code>.
+	</li>
+	</ul>
+</li>
+</ul>
+
+<p>
+Finally, two types that are not bound type parameters unify loosely
+(and per the element matching mode) if:
+</p>
+
+<ul>
+<li>
+	Both types unify exactly.
+</li>
+<li>
+	One type is a <a href="#Type_definitions">defined type</a>,
+	the other type is a type literal, but not an interface,
+	and their underlying types unify per the element matching mode.
+</li>
+<li>
+	Both types are interfaces (but not type parameters) with
+	identical <a href="#Interface_types">type terms</a>,
+	both or neither embed the predeclared type
+	<a href="#Predeclared_identifiers">comparable</a>,
+	corresponding method types unify per the element matching mode,
+	and the method set of one of the interfaces is a subset of
+	the method set of the other interface.
+</li>
+<li>
+	Only one type is an interface (but not a type parameter),
+	corresponding methods of the two types unify per the element matching mode,
+	and the method set of the interface is a subset of
+	the method set of the other type.
+</li>
+<li>
+	Both types have the same structure and their element types
+	unify per the element matching mode.
+</li>
+</ul>
diff --git a/doc/godebug.md b/doc/godebug.md
new file mode 100644
index 0000000..d265555
--- /dev/null
+++ b/doc/godebug.md
@@ -0,0 +1,213 @@
+---
+title: "Go, Backwards Compatibility, and GODEBUG"
+layout: article
+---
+
+<!--
+This document is kept in the Go repo, not x/website,
+because it documents the full list of known GODEBUG settings,
+which are tied to a specific release.
+-->
+
+## Introduction {#intro}
+
+Go's emphasis on backwards compatibility is one of its key strengths.
+There are, however, times when we cannot maintain complete compatibility.
+If code depends on buggy (including insecure) behavior,
+then fixing the bug will break that code.
+New features can also have similar impacts:
+enabling the HTTP/2 use by the HTTP client broke programs
+connecting to servers with buggy HTTP/2 implementations.
+These kinds of changes are unavoidable and
+[permitted by the Go 1 compatibility rules](/doc/go1compat).
+Even so, Go provides a mechanism called GODEBUG to
+reduce the impact such changes have on Go developers
+using newer toolchains to compile old code.
+
+A GODEBUG setting is a `key=value` pair
+that controls the execution of certain parts of a Go program.
+The environment variable `GODEBUG`
+can hold a comma-separated list of these settings.
+For example, if a Go program is running in an environment that contains
+
+	GODEBUG=http2client=0,http2server=0
+
+then that Go program will disable the use of HTTP/2 by default in both
+the HTTP client and the HTTP server.
+It is also possible to set the default `GODEBUG` for a given program
+(discussed below).
+
+When preparing any change that is permitted by Go 1 compatibility
+but may nonetheless break some existing programs,
+we first engineer the change to keep as many existing programs working as possible.
+For the remaining programs,
+we define a new GODEBUG setting that
+allows individual programs to opt back in to the old behavior.
+A GODEBUG setting may not be added if doing so is infeasible,
+but that should be extremely rare.
+
+GODEBUG settings added for compatibility will be maintained
+for a minimum of two years (four Go releases).
+Some, such as `http2client` and `http2server`,
+will be maintained much longer, even indefinitely.
+
+When possible, each GODEBUG setting has an associated
+[runtime/metrics](/pkg/runtime/metrics/) counter
+named `/godebug/non-default-behavior/<name>:events`
+that counts the number of times a particular program's
+behavior has changed based on a non-default value
+for that setting.
+For example, when `GODEBUG=http2client=0` is set,
+`/godebug/non-default-behavior/http2client:events`
+counts the number of HTTP transports that the program
+has configured without HTTP/2 support.
+
+## Default GODEBUG Values {#default}
+
+When a GODEBUG setting is not listed in the environment variable,
+its value is derived from three sources:
+the defaults for the Go toolchain used to build the program,
+amended to match the Go version listed in `go.mod`,
+and then overridden by explicit `//go:debug` lines in the program.
+
+The [GODEBUG History](#history) gives the exact defaults for each Go toolchain version.
+For example, Go 1.21 introduces the `panicnil` setting,
+controlling whether `panic(nil)` is allowed;
+it defaults to `panicnil=0`, making `panic(nil)` a run-time error.
+Using `panicnil=1` restores the behavior of Go 1.20 and earlier.
+
+When compiling a work module or workspace that declares
+an older Go version, the Go toolchain amends its defaults
+to match that older Go version as closely as possible.
+For example, when a Go 1.21 toolchain compiles a program,
+if the work module's `go.mod` or the workspace's `go.work`
+says `go` `1.20`, then the program defaults to `panicnil=1`,
+matching Go 1.20 instead of Go 1.21.
+
+Because this method of setting GODEBUG defaults was introduced only in Go 1.21,
+programs listing versions of Go earlier than Go 1.20 are configured to match Go 1.20,
+not the older version.
+
+To override these defaults, a main package's source files
+can include one or more `//go:debug` directives at the top of the file
+(preceding the `package` statement).
+Continuing the `panicnil` example, if the module or workspace is updated
+to say `go` `1.21`, the program can opt back into the old `panic(nil)`
+behavior by including this directive:
+
+	//go:debug panicnil=1
+
+Starting in Go 1.21, the Go toolchain treats a `//go:debug` directive
+with an unrecognized GODEBUG setting as an invalid program.
+Programs with more than one `//go:debug` line for a given setting
+are also treated as invalid.
+(Older toolchains ignore `//go:debug` directives entirely.)
+
+The defaults that will be compiled into a main package
+are reported by the command:
+
+{{raw `
+	go list -f '{{.DefaultGODEBUG}}' my/main/package
+`}}
+
+Only differences from the base Go toolchain defaults are reported.
+
+When testing a package, `//go:debug` lines in the `*_test.go`
+files are treated as directives for the test's main package.
+In any other context, `//go:debug` lines are ignored by the toolchain;
+`go` `vet` reports such lines as misplaced.
+
+## GODEBUG History {#history}
+
+This section documents the GODEBUG settings introduced and removed in each major Go release
+for compatibility reasons.
+Packages or programs may define additional settings for internal debugging purposes;
+for example,
+see the [runtime documentation](/pkg/runtime#hdr-Environment_Variables)
+and the [go command documentation](/cmd/go#hdr-Build_and_test_caching).
+
+### Go 1.22
+
+Go 1.22 adds a configurable limit to control the maximum acceptable RSA key size
+that can be used in TLS handshakes, controlled by the [`tlsmaxrsasize`setting](/pkg/crypto/tls#Conn.Handshake).
+The default is tlsmaxrsasize=8192, limiting RSA to 8192-bit keys. To avoid
+denial of service attacks, this setting and default was backported to Go
+1.19.13, Go 1.20.8, and Go 1.21.1.
+
+### Go 1.21
+
+Go 1.21 made it a run-time error to call `panic` with a nil interface value,
+controlled by the [`panicnil` setting](/pkg/builtin/#panic).
+
+Go 1.21 made it an error for html/template actions to appear inside of an ECMAScript 6
+template literal, controlled by the
+[`jstmpllitinterp` setting](/pkg/html/template#hdr-Security_Model).
+This behavior was backported to Go 1.19.8+ and Go 1.20.3+.
+
+Go 1.21 introduced a limit on the maximum number of MIME headers and multipart
+forms, controlled by the
+[`multipartmaxheaders` and `multipartmaxparts` settings](/pkg/mime/multipart#hdr-Limits)
+respectively.
+This behavior was backported to Go 1.19.8+ and Go 1.20.3+.
+
+Go 1.21 adds the support of Multipath TCP but it is only used if the application
+explicitly asked for it. This behavior can be controlled by the
+[`multipathtcp` setting](/pkg/net#Dialer.SetMultipathTCP).
+
+There is no plan to remove any of these settings.
+
+### Go 1.20
+
+Go 1.20 introduced support for rejecting insecure paths in tar and zip archives,
+controlled by the [`tarinsecurepath` setting](/pkg/archive/tar/#Reader.Next)
+and the [`zipinsecurepath` setting](/pkg/archive/zip/#NewReader).
+These default to `tarinsecurepath=1` and `zipinsecurepath=1`,
+preserving the behavior of earlier versions of Go.
+A future version of Go may change the defaults to
+`tarinsecurepath=0` and `zipinsecurepath=0`.
+
+Go 1.20 introduced automatic seeding of the
+[`math/rand`](/pkg/math/rand) global random number generator,
+controlled by the [`randautoseed` setting](/pkg/math/rand/#Seed).
+
+Go 1.20 introduced the concept of fallback roots for use during certificate verification,
+controlled by the [`x509usefallbackroots` setting](/pkg/crypto/x509/#SetFallbackRoots).
+
+Go 1.20 removed the preinstalled `.a` files for the standard library
+from the Go distribution.
+Installations now build and cache the standard library like
+packages in other modules.
+The [`installgoroot` setting](/cmd/go#hdr-Compile_and_install_packages_and_dependencies)
+restores the installation and use of preinstalled `.a` files.
+
+There is no plan to remove any of these settings.
+
+### Go 1.19
+
+Go 1.19 made it an error for path lookups to resolve to binaries in the current directory,
+controlled by the [`execerrdot` setting](/pkg/os/exec#hdr-Executables_in_the_current_directory).
+There is no plan to remove this setting.
+
+### Go 1.18
+
+Go 1.18 removed support for SHA1 in most X.509 certificates,
+controlled by the [`x509sha1` setting](/crypto/x509#InsecureAlgorithmError).
+This setting will be removed in a future release, Go 1.22 at the earliest.
+
+### Go 1.10
+
+Go 1.10 changed how build caching worked and added test caching, along
+with the [`gocacheverify`, `gocachehash`, and `gocachetest` settings](/cmd/go/#hdr-Build_and_test_caching).
+There is no plan to remove these settings.
+
+### Go 1.6
+
+Go 1.6 introduced transparent support for HTTP/2,
+controlled by the [`http2client`, `http2server`, and `http2debug` settings](/pkg/net/http/#hdr-HTTP_2).
+There is no plan to remove these settings.
+
+### Go 1.5
+
+Go 1.5 introduced a pure Go DNS resolver,
+controlled by the [`netdns` setting](/pkg/net/#hdr-Name_Resolution).
+There is no plan to remove this setting.
diff --git a/go.env b/go.env
new file mode 100644
index 0000000..6ff2b92
--- /dev/null
+++ b/go.env
@@ -0,0 +1,12 @@
+# This file contains the initial defaults for go command configuration.
+# Values set by 'go env -w' and written to the user's go/env file override these.
+# The environment overrides everything else.
+
+# Use the Go module mirror and checksum database by default.
+# See https://proxy.golang.org for details.
+GOPROXY=https://proxy.golang.org,direct
+GOSUMDB=sum.golang.org
+
+# Automatically download newer toolchains as directed by go.mod files.
+# See https://go.dev/doc/toolchain for details.
+GOTOOLCHAIN=auto
diff --git a/lib/time/update.bash b/lib/time/update.bash
index 48606b9..605afa7 100755
--- a/lib/time/update.bash
+++ b/lib/time/update.bash
@@ -24,8 +24,8 @@
 # in the CL match the update.bash in the CL.
 
 # Versions to use.
-CODE=2022g
-DATA=2022g
+CODE=2023c
+DATA=2023c
 
 set -e
 
@@ -48,9 +48,8 @@
 cd zoneinfo
 ../mkzip ../../zoneinfo.zip
 cd ../..
-go generate time/tzdata
 
-files="update.bash zoneinfo.zip ../../src/time/tzdata/zipdata.go"
+files="update.bash zoneinfo.zip"
 modified=true
 if git diff --quiet $files; then
 	modified=false
diff --git a/lib/time/zoneinfo.zip b/lib/time/zoneinfo.zip
index 9b31ec1..417ee2b 100644
--- a/lib/time/zoneinfo.zip
+++ b/lib/time/zoneinfo.zip
Binary files differ
diff --git a/misc/android/go_android_exec.go b/misc/android/go_android_exec.go
deleted file mode 100644
index 308daca..0000000
--- a/misc/android/go_android_exec.go
+++ /dev/null
@@ -1,340 +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:build ignore
-// +build ignore
-
-// This program can be used as go_android_GOARCH_exec by the Go tool.
-// It executes binaries on an android device using adb.
-package main
-
-import (
-	"errors"
-	"fmt"
-	"go/build"
-	"io"
-	"log"
-	"os"
-	"os/exec"
-	"os/signal"
-	"path/filepath"
-	"runtime"
-	"strconv"
-	"strings"
-	"syscall"
-)
-
-func run(args ...string) (string, error) {
-	cmd := adbCmd(args...)
-	buf := new(strings.Builder)
-	cmd.Stdout = io.MultiWriter(os.Stdout, buf)
-	// If the adb subprocess somehow hangs, go test will kill this wrapper
-	// and wait for our os.Stderr (and os.Stdout) to close as a result.
-	// However, if the os.Stderr (or os.Stdout) file descriptors are
-	// passed on, the hanging adb subprocess will hold them open and
-	// go test will hang forever.
-	//
-	// Avoid that by wrapping stderr, breaking the short circuit and
-	// forcing cmd.Run to use another pipe and goroutine to pass
-	// along stderr from adb.
-	cmd.Stderr = struct{ io.Writer }{os.Stderr}
-	err := cmd.Run()
-	if err != nil {
-		return "", fmt.Errorf("adb %s: %v", strings.Join(args, " "), err)
-	}
-	return buf.String(), nil
-}
-
-func adb(args ...string) error {
-	if out, err := adbCmd(args...).CombinedOutput(); err != nil {
-		fmt.Fprintf(os.Stderr, "adb %s\n%s", strings.Join(args, " "), out)
-		return err
-	}
-	return nil
-}
-
-func adbCmd(args ...string) *exec.Cmd {
-	if flags := os.Getenv("GOANDROID_ADB_FLAGS"); flags != "" {
-		args = append(strings.Split(flags, " "), args...)
-	}
-	return exec.Command("adb", args...)
-}
-
-const (
-	deviceRoot   = "/data/local/tmp/go_android_exec"
-	deviceGoroot = deviceRoot + "/goroot"
-)
-
-func main() {
-	log.SetFlags(0)
-	log.SetPrefix("go_android_exec: ")
-	exitCode, err := runMain()
-	if err != nil {
-		log.Fatal(err)
-	}
-	os.Exit(exitCode)
-}
-
-func runMain() (int, error) {
-	// Concurrent use of adb is flaky, so serialize adb commands.
-	// See https://github.com/golang/go/issues/23795 or
-	// https://issuetracker.google.com/issues/73230216.
-	lockPath := filepath.Join(os.TempDir(), "go_android_exec-adb-lock")
-	lock, err := os.OpenFile(lockPath, os.O_CREATE|os.O_RDWR, 0666)
-	if err != nil {
-		return 0, err
-	}
-	defer lock.Close()
-	if err := syscall.Flock(int(lock.Fd()), syscall.LOCK_EX); err != nil {
-		return 0, err
-	}
-
-	// In case we're booting a device or emulator alongside all.bash, wait for
-	// it to be ready. adb wait-for-device is not enough, we have to
-	// wait for sys.boot_completed.
-	if err := adb("wait-for-device", "exec-out", "while [[ -z $(getprop sys.boot_completed) ]]; do sleep 1; done;"); err != nil {
-		return 0, err
-	}
-
-	// Done once per make.bash.
-	if err := adbCopyGoroot(); err != nil {
-		return 0, err
-	}
-
-	// Prepare a temporary directory that will be cleaned up at the end.
-	// Binary names can conflict.
-	// E.g. template.test from the {html,text}/template packages.
-	binName := filepath.Base(os.Args[1])
-	deviceGotmp := fmt.Sprintf(deviceRoot+"/%s-%d", binName, os.Getpid())
-	deviceGopath := deviceGotmp + "/gopath"
-	defer adb("exec-out", "rm", "-rf", deviceGotmp) // Clean up.
-
-	// Determine the package by examining the current working
-	// directory, which will look something like
-	// "$GOROOT/src/mime/multipart" or "$GOPATH/src/golang.org/x/mobile".
-	// We extract everything after the $GOROOT or $GOPATH to run on the
-	// same relative directory on the target device.
-	subdir, inGoRoot, err := subdir()
-	if err != nil {
-		return 0, err
-	}
-	deviceCwd := filepath.Join(deviceGopath, subdir)
-	if inGoRoot {
-		deviceCwd = filepath.Join(deviceGoroot, subdir)
-	} else {
-		if err := adb("exec-out", "mkdir", "-p", deviceCwd); err != nil {
-			return 0, err
-		}
-		if err := adbCopyTree(deviceCwd, subdir); err != nil {
-			return 0, err
-		}
-
-		// Copy .go files from the package.
-		goFiles, err := filepath.Glob("*.go")
-		if err != nil {
-			return 0, err
-		}
-		if len(goFiles) > 0 {
-			args := append(append([]string{"push"}, goFiles...), deviceCwd)
-			if err := adb(args...); err != nil {
-				return 0, err
-			}
-		}
-	}
-
-	deviceBin := fmt.Sprintf("%s/%s", deviceGotmp, binName)
-	if err := adb("push", os.Args[1], deviceBin); err != nil {
-		return 0, err
-	}
-
-	// Forward SIGQUIT from the go command to show backtraces from
-	// the binary instead of from this wrapper.
-	quit := make(chan os.Signal, 1)
-	signal.Notify(quit, syscall.SIGQUIT)
-	go func() {
-		for range quit {
-			// We don't have the PID of the running process; use the
-			// binary name instead.
-			adb("exec-out", "killall -QUIT "+binName)
-		}
-	}()
-	// In light of
-	// https://code.google.com/p/android/issues/detail?id=3254
-	// dont trust the exitcode of adb. Instead, append the exitcode to
-	// the output and parse it from there.
-	const exitstr = "exitcode="
-	cmd := `export TMPDIR="` + deviceGotmp + `"` +
-		`; export GOROOT="` + deviceGoroot + `"` +
-		`; export GOPATH="` + deviceGopath + `"` +
-		`; export CGO_ENABLED=0` +
-		`; export GOPROXY=` + os.Getenv("GOPROXY") +
-		`; export GOCACHE="` + deviceRoot + `/gocache"` +
-		`; export PATH=$PATH:"` + deviceGoroot + `/bin"` +
-		`; cd "` + deviceCwd + `"` +
-		"; '" + deviceBin + "' " + strings.Join(os.Args[2:], " ") +
-		"; echo -n " + exitstr + "$?"
-	output, err := run("exec-out", cmd)
-	signal.Reset(syscall.SIGQUIT)
-	close(quit)
-	if err != nil {
-		return 0, err
-	}
-
-	exitIdx := strings.LastIndex(output, exitstr)
-	if exitIdx == -1 {
-		return 0, fmt.Errorf("no exit code: %q", output)
-	}
-	code, err := strconv.Atoi(output[exitIdx+len(exitstr):])
-	if err != nil {
-		return 0, fmt.Errorf("bad exit code: %v", err)
-	}
-	return code, nil
-}
-
-// subdir determines the package based on the current working directory,
-// and returns the path to the package source relative to $GOROOT (or $GOPATH).
-func subdir() (pkgpath string, underGoRoot bool, err error) {
-	cwd, err := os.Getwd()
-	if err != nil {
-		return "", false, err
-	}
-	cwd, err = filepath.EvalSymlinks(cwd)
-	if err != nil {
-		return "", false, err
-	}
-	goroot, err := filepath.EvalSymlinks(runtime.GOROOT())
-	if err != nil {
-		return "", false, err
-	}
-	if subdir, err := filepath.Rel(goroot, cwd); err == nil {
-		if !strings.Contains(subdir, "..") {
-			return subdir, true, nil
-		}
-	}
-
-	for _, p := range filepath.SplitList(build.Default.GOPATH) {
-		pabs, err := filepath.EvalSymlinks(p)
-		if err != nil {
-			return "", false, err
-		}
-		if subdir, err := filepath.Rel(pabs, cwd); err == nil {
-			if !strings.Contains(subdir, "..") {
-				return subdir, false, nil
-			}
-		}
-	}
-	return "", false, fmt.Errorf("the current path %q is not in either GOROOT(%q) or GOPATH(%q)",
-		cwd, runtime.GOROOT(), build.Default.GOPATH)
-}
-
-// adbCopyTree copies testdata, go.mod, go.sum files from subdir
-// and from parent directories all the way up to the root of subdir.
-// go.mod and go.sum files are needed for the go tool modules queries,
-// and the testdata directories for tests.  It is common for tests to
-// reach out into testdata from parent packages.
-func adbCopyTree(deviceCwd, subdir string) error {
-	dir := ""
-	for {
-		for _, path := range []string{"testdata", "go.mod", "go.sum"} {
-			path := filepath.Join(dir, path)
-			if _, err := os.Stat(path); err != nil {
-				continue
-			}
-			devicePath := filepath.Join(deviceCwd, dir)
-			if err := adb("exec-out", "mkdir", "-p", devicePath); err != nil {
-				return err
-			}
-			if err := adb("push", path, devicePath); err != nil {
-				return err
-			}
-		}
-		if subdir == "." {
-			break
-		}
-		subdir = filepath.Dir(subdir)
-		dir = filepath.Join(dir, "..")
-	}
-	return nil
-}
-
-// adbCopyGoroot clears deviceRoot for previous versions of GOROOT, GOPATH
-// and temporary data. Then, it copies relevant parts of GOROOT to the device,
-// including the go tool built for android.
-// A lock file ensures this only happens once, even with concurrent exec
-// wrappers.
-func adbCopyGoroot() error {
-	// Also known by cmd/dist. The bootstrap command deletes the file.
-	statPath := filepath.Join(os.TempDir(), "go_android_exec-adb-sync-status")
-	stat, err := os.OpenFile(statPath, os.O_CREATE|os.O_RDWR, 0666)
-	if err != nil {
-		return err
-	}
-	defer stat.Close()
-	// Serialize check and copying.
-	if err := syscall.Flock(int(stat.Fd()), syscall.LOCK_EX); err != nil {
-		return err
-	}
-	s, err := io.ReadAll(stat)
-	if err != nil {
-		return err
-	}
-	if string(s) == "done" {
-		return nil
-	}
-	// Delete GOROOT, GOPATH and any leftover test data.
-	if err := adb("exec-out", "rm", "-rf", deviceRoot); err != nil {
-		return err
-	}
-	deviceBin := filepath.Join(deviceGoroot, "bin")
-	if err := adb("exec-out", "mkdir", "-p", deviceBin); err != nil {
-		return err
-	}
-	goroot := runtime.GOROOT()
-	// Build go for android.
-	goCmd := filepath.Join(goroot, "bin", "go")
-	tmpGo, err := os.CreateTemp("", "go_android_exec-cmd-go-*")
-	if err != nil {
-		return err
-	}
-	tmpGo.Close()
-	defer os.Remove(tmpGo.Name())
-
-	if out, err := exec.Command(goCmd, "build", "-o", tmpGo.Name(), "cmd/go").CombinedOutput(); err != nil {
-		return fmt.Errorf("failed to build go tool for device: %s\n%v", out, err)
-	}
-	deviceGo := filepath.Join(deviceBin, "go")
-	if err := adb("push", tmpGo.Name(), deviceGo); err != nil {
-		return err
-	}
-	for _, dir := range []string{"src", "test", "lib", "api"} {
-		if err := adb("push", filepath.Join(goroot, dir), filepath.Join(deviceGoroot)); err != nil {
-			return err
-		}
-	}
-
-	// Copy only the relevant from pkg.
-	if err := adb("exec-out", "mkdir", "-p", filepath.Join(deviceGoroot, "pkg", "tool")); err != nil {
-		return err
-	}
-	if err := adb("push", filepath.Join(goroot, "pkg", "include"), filepath.Join(deviceGoroot, "pkg")); err != nil {
-		return err
-	}
-	runtimea, err := exec.Command(goCmd, "list", "-f", "{{.Target}}", "runtime").Output()
-	pkgdir := filepath.Dir(string(runtimea))
-	if pkgdir == "" {
-		return errors.New("could not find android pkg dir")
-	}
-	if err := adb("push", pkgdir, filepath.Join(deviceGoroot, "pkg")); err != nil {
-		return err
-	}
-	tooldir := filepath.Join(goroot, "pkg", "tool", filepath.Base(pkgdir))
-	if err := adb("push", tooldir, filepath.Join(deviceGoroot, "pkg", "tool")); err != nil {
-		return err
-	}
-
-	if _, err := stat.Write([]byte("done")); err != nil {
-		return err
-	}
-	return nil
-}
diff --git a/misc/arm/a b/misc/arm/a
deleted file mode 100755
index 644e775..0000000
--- a/misc/arm/a
+++ /dev/null
@@ -1,58 +0,0 @@
-#!/usr/bin/env bash
-
-# 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 is a small script for executing go binaries on the android platform.
-#
-# example:
-# ./a 5.out foo bar baz
-#
-# The script exports the local values of GOARCH, GOTRACEBACK and GOGC
-# to the android environment.
-#
-# Known issues:
-# The script fails unless the last character output by the program is "\n"
-#
-# TODO(kaib): add gdb bridge support
-
-exp ()
-{
-	if [ ${!1} ]; then
-		echo "export $1=\"${!1}\"; "
-	fi
-}
-
-# adb does not correctly return the exit value of the executed program. use this
-# wrapper to manually extract the exit value
-rloc=/data/local/tmp/retval
-rsize=$(adb shell "ls -l $rloc"|tr -s ' '|cut -d' ' -f4)
-rcheck=38
-if [ "$rsize" != "$rcheck" ]; then
-#	echo "debug: retval size incorrect want $rcheck, got $rsize. uploading"
-	echo  >/tmp/adb.retval '#!/system/bin/sh
-"$@"
-echo RETVAL: $?' 
-	adb push /tmp/adb.retval $rloc >/dev/null 2>&1
-	adb shell chmod 755 $rloc
-fi
-
-# run the main binary
-if [ "-g" == "$1" ]; then
-	adb forward tcp:$2 tcp:$2
-	args=$(echo $*| cut -d' ' -f4-)
-	adb push $3 /data/local/tmp/$3 >/dev/null 2>&1
-	adb shell "$(exp GOARCH) $(exp GOTRACEBACK) $(exp GOGC) \
-		gdbserver :$2 /data/local/tmp/retval /data/local/tmp/$3 $args" \
-		2>&1|tr -d '\r' |tee /tmp/adb.out|grep -v RETVAL
-else
-	if [ "$*" != "$1" ]; then
-		args=$(echo $*| cut -d' ' -f2-)
-	fi
-	adb push $1 /data/local/tmp/$1 >/dev/null 2>&1
-	adb shell "$(exp GOARCH) $(exp GOTRACEBACK) $(exp GOGC) \
-		/data/local/tmp/retval /data/local/tmp/$1 $args" \
-		2>&1|tr -d '\r' |tee /tmp/adb.out|grep -v RETVAL
-fi
-exit $(grep RETVAL /tmp/adb.out|tr -d '\n\r'| cut -d' ' -f2)
diff --git a/misc/cgo/errors/argposition_test.go b/misc/cgo/errors/argposition_test.go
deleted file mode 100644
index dd26663..0000000
--- a/misc/cgo/errors/argposition_test.go
+++ /dev/null
@@ -1,133 +0,0 @@
-// Copyright 2021 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Issue 42580: cmd/cgo: shifting identifier position in ast
-
-package errorstest
-
-import (
-	"bytes"
-	"fmt"
-	"go/ast"
-	"go/parser"
-	"go/token"
-	"os"
-	"os/exec"
-	"path/filepath"
-	"strings"
-	"testing"
-)
-
-type ShortPosition struct {
-	Line    int
-	Column  int
-	Visited bool
-}
-
-type IdentPositionInfo map[string][]ShortPosition
-
-type Visitor struct {
-	identPosInfo IdentPositionInfo
-	fset         *token.FileSet
-	t            *testing.T
-}
-
-func (v *Visitor) Visit(node ast.Node) ast.Visitor {
-	if ident, ok := node.(*ast.Ident); ok {
-		if expectedPositions, ok := v.identPosInfo[ident.Name]; ok {
-			gotMatch := false
-			var errorMessage strings.Builder
-			for caseIndex, expectedPos := range expectedPositions {
-				actualPosition := v.fset.PositionFor(ident.Pos(), true)
-				errorOccured := false
-				if expectedPos.Line != actualPosition.Line {
-					fmt.Fprintf(&errorMessage, "wrong line number for ident %s: expected: %d got: %d\n", ident.Name, expectedPos.Line, actualPosition.Line)
-					errorOccured = true
-				}
-				if expectedPos.Column != actualPosition.Column {
-					fmt.Fprintf(&errorMessage, "wrong column number for ident %s: expected: %d got: %d\n", ident.Name, expectedPos.Column, actualPosition.Column)
-					errorOccured = true
-				}
-				if errorOccured {
-					continue
-				}
-				gotMatch = true
-				expectedPositions[caseIndex].Visited = true
-			}
-
-			if !gotMatch {
-				v.t.Errorf(errorMessage.String())
-			}
-		}
-	}
-	return v
-}
-
-func TestArgumentsPositions(t *testing.T) {
-	testdata, err := filepath.Abs("testdata")
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	tmpPath := t.TempDir()
-
-	dir := filepath.Join(tmpPath, "src", "testpositions")
-	if err := os.MkdirAll(dir, 0755); err != nil {
-		t.Fatal(err)
-	}
-
-	cmd := exec.Command("go", "tool", "cgo",
-		"-srcdir", testdata,
-		"-objdir", dir,
-		"issue42580.go")
-	cmd.Stderr = new(bytes.Buffer)
-
-	err = cmd.Run()
-	if err != nil {
-		t.Fatalf("%s: %v\n%s", cmd, err, cmd.Stderr)
-	}
-	mainProcessed, err := os.ReadFile(filepath.Join(dir, "issue42580.cgo1.go"))
-	if err != nil {
-		t.Fatal(err)
-	}
-	fset := token.NewFileSet()
-	f, err := parser.ParseFile(fset, "", mainProcessed, parser.AllErrors)
-	if err != nil {
-		fmt.Println(err)
-		return
-	}
-
-	expectation := IdentPositionInfo{
-		"checkedPointer": []ShortPosition{
-			ShortPosition{
-				Line:   32,
-				Column: 56,
-			},
-		},
-		"singleInnerPointerChecked": []ShortPosition{
-			ShortPosition{
-				Line:   37,
-				Column: 91,
-			},
-		},
-		"doublePointerChecked": []ShortPosition{
-			ShortPosition{
-				Line:   42,
-				Column: 91,
-			},
-		},
-	}
-	for _, decl := range f.Decls {
-		if fdecl, ok := decl.(*ast.FuncDecl); ok {
-			ast.Walk(&Visitor{expectation, fset, t}, fdecl.Body)
-		}
-	}
-	for ident, positions := range expectation {
-		for _, position := range positions {
-			if !position.Visited {
-				t.Errorf("Position %d:%d missed for %s ident", position.Line, position.Column, ident)
-			}
-		}
-	}
-}
diff --git a/misc/cgo/errors/badsym_test.go b/misc/cgo/errors/badsym_test.go
deleted file mode 100644
index bc3ba2b..0000000
--- a/misc/cgo/errors/badsym_test.go
+++ /dev/null
@@ -1,219 +0,0 @@
-// Copyright 2020 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package errorstest
-
-import (
-	"bytes"
-	"os"
-	"os/exec"
-	"path/filepath"
-	"strings"
-	"testing"
-	"unicode"
-)
-
-// A manually modified object file could pass unexpected characters
-// into the files generated by cgo.
-
-const magicInput = "abcdefghijklmnopqrstuvwxyz0123"
-const magicReplace = "\n//go:cgo_ldflag \"-badflag\"\n//"
-
-const cSymbol = "BadSymbol" + magicInput + "Name"
-const cDefSource = "int " + cSymbol + " = 1;"
-const cRefSource = "extern int " + cSymbol + "; int F() { return " + cSymbol + "; }"
-
-// goSource is the source code for the trivial Go file we use.
-// We will replace TMPDIR with the temporary directory name.
-const goSource = `
-package main
-
-// #cgo LDFLAGS: TMPDIR/cbad.o TMPDIR/cbad.so
-// extern int F();
-import "C"
-
-func main() {
-	println(C.F())
-}
-`
-
-func TestBadSymbol(t *testing.T) {
-	dir := t.TempDir()
-
-	mkdir := func(base string) string {
-		ret := filepath.Join(dir, base)
-		if err := os.Mkdir(ret, 0755); err != nil {
-			t.Fatal(err)
-		}
-		return ret
-	}
-
-	cdir := mkdir("c")
-	godir := mkdir("go")
-
-	makeFile := func(mdir, base, source string) string {
-		ret := filepath.Join(mdir, base)
-		if err := os.WriteFile(ret, []byte(source), 0644); err != nil {
-			t.Fatal(err)
-		}
-		return ret
-	}
-
-	cDefFile := makeFile(cdir, "cdef.c", cDefSource)
-	cRefFile := makeFile(cdir, "cref.c", cRefSource)
-
-	ccCmd := cCompilerCmd(t)
-
-	cCompile := func(arg, base, src string) string {
-		out := filepath.Join(cdir, base)
-		run := append(ccCmd, arg, "-o", out, src)
-		output, err := exec.Command(run[0], run[1:]...).CombinedOutput()
-		if err != nil {
-			t.Log(run)
-			t.Logf("%s", output)
-			t.Fatal(err)
-		}
-		if err := os.Remove(src); err != nil {
-			t.Fatal(err)
-		}
-		return out
-	}
-
-	// Build a shared library that defines a symbol whose name
-	// contains magicInput.
-
-	cShared := cCompile("-shared", "c.so", cDefFile)
-
-	// Build an object file that refers to the symbol whose name
-	// contains magicInput.
-
-	cObj := cCompile("-c", "c.o", cRefFile)
-
-	// Rewrite the shared library and the object file, replacing
-	// magicInput with magicReplace. This will have the effect of
-	// introducing a symbol whose name looks like a cgo command.
-	// The cgo tool will use that name when it generates the
-	// _cgo_import.go file, thus smuggling a magic //go:cgo_ldflag
-	// pragma into a Go file. We used to not check the pragmas in
-	// _cgo_import.go.
-
-	rewrite := func(from, to string) {
-		obj, err := os.ReadFile(from)
-		if err != nil {
-			t.Fatal(err)
-		}
-
-		if bytes.Count(obj, []byte(magicInput)) == 0 {
-			t.Fatalf("%s: did not find magic string", from)
-		}
-
-		if len(magicInput) != len(magicReplace) {
-			t.Fatalf("internal test error: different magic lengths: %d != %d", len(magicInput), len(magicReplace))
-		}
-
-		obj = bytes.ReplaceAll(obj, []byte(magicInput), []byte(magicReplace))
-
-		if err := os.WriteFile(to, obj, 0644); err != nil {
-			t.Fatal(err)
-		}
-	}
-
-	cBadShared := filepath.Join(godir, "cbad.so")
-	rewrite(cShared, cBadShared)
-
-	cBadObj := filepath.Join(godir, "cbad.o")
-	rewrite(cObj, cBadObj)
-
-	goSourceBadObject := strings.ReplaceAll(goSource, "TMPDIR", godir)
-	makeFile(godir, "go.go", goSourceBadObject)
-
-	makeFile(godir, "go.mod", "module badsym")
-
-	// Try to build our little package.
-	cmd := exec.Command("go", "build", "-ldflags=-v")
-	cmd.Dir = godir
-	output, err := cmd.CombinedOutput()
-
-	// The build should fail, but we want it to fail because we
-	// detected the error, not because we passed a bad flag to the
-	// C linker.
-
-	if err == nil {
-		t.Errorf("go build succeeded unexpectedly")
-	}
-
-	t.Logf("%s", output)
-
-	for _, line := range bytes.Split(output, []byte("\n")) {
-		if bytes.Contains(line, []byte("dynamic symbol")) && bytes.Contains(line, []byte("contains unsupported character")) {
-			// This is the error from cgo.
-			continue
-		}
-
-		// We passed -ldflags=-v to see the external linker invocation,
-		// which should not include -badflag.
-		if bytes.Contains(line, []byte("-badflag")) {
-			t.Error("output should not mention -badflag")
-		}
-
-		// Also check for compiler errors, just in case.
-		// GCC says "unrecognized command line option".
-		// clang says "unknown argument".
-		if bytes.Contains(line, []byte("unrecognized")) || bytes.Contains(output, []byte("unknown")) {
-			t.Error("problem should have been caught before invoking C linker")
-		}
-	}
-}
-
-func cCompilerCmd(t *testing.T) []string {
-	cc := []string{goEnv(t, "CC")}
-
-	out := goEnv(t, "GOGCCFLAGS")
-	quote := '\000'
-	start := 0
-	lastSpace := true
-	backslash := false
-	s := string(out)
-	for i, c := range s {
-		if quote == '\000' && unicode.IsSpace(c) {
-			if !lastSpace {
-				cc = append(cc, s[start:i])
-				lastSpace = true
-			}
-		} else {
-			if lastSpace {
-				start = i
-				lastSpace = false
-			}
-			if quote == '\000' && !backslash && (c == '"' || c == '\'') {
-				quote = c
-				backslash = false
-			} else if !backslash && quote == c {
-				quote = '\000'
-			} else if (quote == '\000' || quote == '"') && !backslash && c == '\\' {
-				backslash = true
-			} else {
-				backslash = false
-			}
-		}
-	}
-	if !lastSpace {
-		cc = append(cc, s[start:])
-	}
-
-	// Force reallocation (and avoid aliasing bugs) for tests that append to cc.
-	cc = cc[:len(cc):len(cc)]
-
-	return cc
-}
-
-func goEnv(t *testing.T, key string) string {
-	out, err := exec.Command("go", "env", key).CombinedOutput()
-	if err != nil {
-		t.Logf("go env %s\n", key)
-		t.Logf("%s", out)
-		t.Fatal(err)
-	}
-	return strings.TrimSpace(string(out))
-}
diff --git a/misc/cgo/errors/errors_test.go b/misc/cgo/errors/errors_test.go
deleted file mode 100644
index 9718b7f..0000000
--- a/misc/cgo/errors/errors_test.go
+++ /dev/null
@@ -1,158 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package errorstest
-
-import (
-	"bytes"
-	"fmt"
-	"os"
-	"os/exec"
-	"path/filepath"
-	"regexp"
-	"strconv"
-	"strings"
-	"testing"
-)
-
-func path(file string) string {
-	return filepath.Join("testdata", file)
-}
-
-func check(t *testing.T, file string) {
-	t.Run(file, func(t *testing.T) {
-		t.Parallel()
-
-		contents, err := os.ReadFile(path(file))
-		if err != nil {
-			t.Fatal(err)
-		}
-		var errors []*regexp.Regexp
-		for i, line := range bytes.Split(contents, []byte("\n")) {
-			if bytes.HasSuffix(line, []byte("ERROR HERE")) {
-				re := regexp.MustCompile(regexp.QuoteMeta(fmt.Sprintf("%s:%d:", file, i+1)))
-				errors = append(errors, re)
-				continue
-			}
-
-			_, frag, ok := bytes.Cut(line, []byte("ERROR HERE: "))
-			if !ok {
-				continue
-			}
-			re, err := regexp.Compile(fmt.Sprintf(":%d:.*%s", i+1, frag))
-			if err != nil {
-				t.Errorf("Invalid regexp after `ERROR HERE: `: %#q", frag)
-				continue
-			}
-			errors = append(errors, re)
-		}
-		if len(errors) == 0 {
-			t.Fatalf("cannot find ERROR HERE")
-		}
-		expect(t, file, errors)
-	})
-}
-
-func expect(t *testing.T, file string, errors []*regexp.Regexp) {
-	dir, err := os.MkdirTemp("", filepath.Base(t.Name()))
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer os.RemoveAll(dir)
-
-	dst := filepath.Join(dir, strings.TrimSuffix(file, ".go"))
-	cmd := exec.Command("go", "build", "-gcflags=-L -e", "-o="+dst, path(file)) // TODO(gri) no need for -gcflags=-L if go tool is adjusted
-	out, err := cmd.CombinedOutput()
-	if err == nil {
-		t.Errorf("expected cgo to fail but it succeeded")
-	}
-
-	lines := bytes.Split(out, []byte("\n"))
-	for _, re := range errors {
-		found := false
-		for _, line := range lines {
-			if re.Match(line) {
-				t.Logf("found match for %#q: %q", re, line)
-				found = true
-				break
-			}
-		}
-		if !found {
-			t.Errorf("expected error output to contain %#q", re)
-		}
-	}
-
-	if t.Failed() {
-		t.Logf("actual output:\n%s", out)
-	}
-}
-
-func sizeofLongDouble(t *testing.T) int {
-	cmd := exec.Command("go", "run", path("long_double_size.go"))
-	out, err := cmd.CombinedOutput()
-	if err != nil {
-		t.Fatalf("%#q: %v:\n%s", strings.Join(cmd.Args, " "), err, out)
-	}
-
-	i, err := strconv.Atoi(strings.TrimSpace(string(out)))
-	if err != nil {
-		t.Fatalf("long_double_size.go printed invalid size: %s", out)
-	}
-	return i
-}
-
-func TestReportsTypeErrors(t *testing.T) {
-	for _, file := range []string{
-		"err1.go",
-		"err2.go",
-		"issue11097a.go",
-		"issue11097b.go",
-		"issue18452.go",
-		"issue18889.go",
-		"issue28721.go",
-		"issue33061.go",
-		"issue50710.go",
-	} {
-		check(t, file)
-	}
-
-	if sizeofLongDouble(t) > 8 {
-		for _, file := range []string{
-			"err4.go",
-			"issue28069.go",
-		} {
-			check(t, file)
-		}
-	}
-}
-
-func TestToleratesOptimizationFlag(t *testing.T) {
-	for _, cflags := range []string{
-		"",
-		"-O",
-	} {
-		cflags := cflags
-		t.Run(cflags, func(t *testing.T) {
-			t.Parallel()
-
-			cmd := exec.Command("go", "build", path("issue14669.go"))
-			cmd.Env = append(os.Environ(), "CGO_CFLAGS="+cflags)
-			out, err := cmd.CombinedOutput()
-			if err != nil {
-				t.Errorf("%#q: %v:\n%s", strings.Join(cmd.Args, " "), err, out)
-			}
-		})
-	}
-}
-
-func TestMallocCrashesOnNil(t *testing.T) {
-	t.Parallel()
-
-	cmd := exec.Command("go", "run", path("malloc.go"))
-	out, err := cmd.CombinedOutput()
-	if err == nil {
-		t.Logf("%#q:\n%s", strings.Join(cmd.Args, " "), out)
-		t.Fatalf("succeeded unexpectedly")
-	}
-}
diff --git a/misc/cgo/errors/ptr_test.go b/misc/cgo/errors/ptr_test.go
deleted file mode 100644
index 0f39dc8..0000000
--- a/misc/cgo/errors/ptr_test.go
+++ /dev/null
@@ -1,632 +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 that cgo detects invalid pointer passing at runtime.
-
-package errorstest
-
-import (
-	"bytes"
-	"flag"
-	"fmt"
-	"os"
-	"os/exec"
-	"path/filepath"
-	"strings"
-	"sync/atomic"
-	"testing"
-)
-
-var tmp = flag.String("tmp", "", "use `dir` for temporary files and do not clean up")
-
-// ptrTest is the tests without the boilerplate.
-type ptrTest struct {
-	name      string   // for reporting
-	c         string   // the cgo comment
-	c1        string   // cgo comment forced into non-export cgo file
-	imports   []string // a list of imports
-	support   string   // supporting functions
-	body      string   // the body of the main function
-	extra     []extra  // extra files
-	fail      bool     // whether the test should fail
-	expensive bool     // whether the test requires the expensive check
-}
-
-type extra struct {
-	name     string
-	contents string
-}
-
-var ptrTests = []ptrTest{
-	{
-		// Passing a pointer to a struct that contains a Go pointer.
-		name: "ptr1",
-		c:    `typedef struct s1 { int *p; } s1; void f1(s1 *ps) {}`,
-		body: `C.f1(&C.s1{new(C.int)})`,
-		fail: true,
-	},
-	{
-		// Passing a pointer to a struct that contains a Go pointer.
-		name: "ptr2",
-		c:    `typedef struct s2 { int *p; } s2; void f2(s2 *ps) {}`,
-		body: `p := &C.s2{new(C.int)}; C.f2(p)`,
-		fail: true,
-	},
-	{
-		// Passing a pointer to an int field of a Go struct
-		// that (irrelevantly) contains a Go pointer.
-		name: "ok1",
-		c:    `struct s3 { int i; int *p; }; void f3(int *p) {}`,
-		body: `p := &C.struct_s3{i: 0, p: new(C.int)}; C.f3(&p.i)`,
-		fail: false,
-	},
-	{
-		// Passing a pointer to a pointer field of a Go struct.
-		name: "ptrfield",
-		c:    `struct s4 { int i; int *p; }; void f4(int **p) {}`,
-		body: `p := &C.struct_s4{i: 0, p: new(C.int)}; C.f4(&p.p)`,
-		fail: true,
-	},
-	{
-		// Passing a pointer to a pointer field of a Go
-		// struct, where the field does not contain a Go
-		// pointer, but another field (irrelevantly) does.
-		name: "ptrfieldok",
-		c:    `struct s5 { int *p1; int *p2; }; void f5(int **p) {}`,
-		body: `p := &C.struct_s5{p1: nil, p2: new(C.int)}; C.f5(&p.p1)`,
-		fail: false,
-	},
-	{
-		// Passing the address of a slice with no Go pointers.
-		name:    "sliceok1",
-		c:       `void f6(void **p) {}`,
-		imports: []string{"unsafe"},
-		body:    `s := []unsafe.Pointer{nil}; C.f6(&s[0])`,
-		fail:    false,
-	},
-	{
-		// Passing the address of a slice with a Go pointer.
-		name:    "sliceptr1",
-		c:       `void f7(void **p) {}`,
-		imports: []string{"unsafe"},
-		body:    `i := 0; s := []unsafe.Pointer{unsafe.Pointer(&i)}; C.f7(&s[0])`,
-		fail:    true,
-	},
-	{
-		// Passing the address of a slice with a Go pointer,
-		// where we are passing the address of an element that
-		// is not a Go pointer.
-		name:    "sliceptr2",
-		c:       `void f8(void **p) {}`,
-		imports: []string{"unsafe"},
-		body:    `i := 0; s := []unsafe.Pointer{nil, unsafe.Pointer(&i)}; C.f8(&s[0])`,
-		fail:    true,
-	},
-	{
-		// Passing the address of a slice that is an element
-		// in a struct only looks at the slice.
-		name:    "sliceok2",
-		c:       `void f9(void **p) {}`,
-		imports: []string{"unsafe"},
-		support: `type S9 struct { p *int; s []unsafe.Pointer }`,
-		body:    `i := 0; p := &S9{p:&i, s:[]unsafe.Pointer{nil}}; C.f9(&p.s[0])`,
-		fail:    false,
-	},
-	{
-		// Passing the address of a slice of an array that is
-		// an element in a struct, with a type conversion.
-		name:    "sliceok3",
-		c:       `void f10(void* p) {}`,
-		imports: []string{"unsafe"},
-		support: `type S10 struct { p *int; a [4]byte }`,
-		body:    `i := 0; p := &S10{p:&i}; s := p.a[:]; C.f10(unsafe.Pointer(&s[0]))`,
-		fail:    false,
-	},
-	{
-		// Passing the address of a slice of an array that is
-		// an element in a struct, with a type conversion.
-		name:    "sliceok4",
-		c:       `typedef void* PV11; void f11(PV11 p) {}`,
-		imports: []string{"unsafe"},
-		support: `type S11 struct { p *int; a [4]byte }`,
-		body:    `i := 0; p := &S11{p:&i}; C.f11(C.PV11(unsafe.Pointer(&p.a[0])))`,
-		fail:    false,
-	},
-	{
-		// Passing the address of a static variable with no
-		// pointers doesn't matter.
-		name:    "varok",
-		c:       `void f12(char** parg) {}`,
-		support: `var hello12 = [...]C.char{'h', 'e', 'l', 'l', 'o'}`,
-		body:    `parg := [1]*C.char{&hello12[0]}; C.f12(&parg[0])`,
-		fail:    false,
-	},
-	{
-		// Passing the address of a static variable with
-		// pointers does matter.
-		name:    "var1",
-		c:       `void f13(char*** parg) {}`,
-		support: `var hello13 = [...]*C.char{new(C.char)}`,
-		body:    `parg := [1]**C.char{&hello13[0]}; C.f13(&parg[0])`,
-		fail:    true,
-	},
-	{
-		// Storing a Go pointer into C memory should fail.
-		name: "barrier",
-		c: `#include <stdlib.h>
-		    char **f14a() { return malloc(sizeof(char*)); }
-		    void f14b(char **p) {}`,
-		body:      `p := C.f14a(); *p = new(C.char); C.f14b(p)`,
-		fail:      true,
-		expensive: true,
-	},
-	{
-		// Storing a Go pointer into C memory by assigning a
-		// large value should fail.
-		name: "barrierstruct",
-		c: `#include <stdlib.h>
-		    struct s15 { char *a[10]; };
-		    struct s15 *f15() { return malloc(sizeof(struct s15)); }
-		    void f15b(struct s15 *p) {}`,
-		body:      `p := C.f15(); p.a = [10]*C.char{new(C.char)}; C.f15b(p)`,
-		fail:      true,
-		expensive: true,
-	},
-	{
-		// Storing a Go pointer into C memory using a slice
-		// copy should fail.
-		name: "barrierslice",
-		c: `#include <stdlib.h>
-		    struct s16 { char *a[10]; };
-		    struct s16 *f16() { return malloc(sizeof(struct s16)); }
-		    void f16b(struct s16 *p) {}`,
-		body:      `p := C.f16(); copy(p.a[:], []*C.char{new(C.char)}); C.f16b(p)`,
-		fail:      true,
-		expensive: true,
-	},
-	{
-		// A very large value uses a GC program, which is a
-		// different code path.
-		name: "barriergcprogarray",
-		c: `#include <stdlib.h>
-		    struct s17 { char *a[32769]; };
-		    struct s17 *f17() { return malloc(sizeof(struct s17)); }
-		    void f17b(struct s17 *p) {}`,
-		body:      `p := C.f17(); p.a = [32769]*C.char{new(C.char)}; C.f17b(p)`,
-		fail:      true,
-		expensive: true,
-	},
-	{
-		// Similar case, with a source on the heap.
-		name: "barriergcprogarrayheap",
-		c: `#include <stdlib.h>
-		    struct s18 { char *a[32769]; };
-		    struct s18 *f18() { return malloc(sizeof(struct s18)); }
-		    void f18b(struct s18 *p) {}
-		    void f18c(void *p) {}`,
-		imports:   []string{"unsafe"},
-		body:      `p := C.f18(); n := &[32769]*C.char{new(C.char)}; p.a = *n; C.f18b(p); n[0] = nil; C.f18c(unsafe.Pointer(n))`,
-		fail:      true,
-		expensive: true,
-	},
-	{
-		// A GC program with a struct.
-		name: "barriergcprogstruct",
-		c: `#include <stdlib.h>
-		    struct s19a { char *a[32769]; };
-		    struct s19b { struct s19a f; };
-		    struct s19b *f19() { return malloc(sizeof(struct s19b)); }
-		    void f19b(struct s19b *p) {}`,
-		body:      `p := C.f19(); p.f = C.struct_s19a{[32769]*C.char{new(C.char)}}; C.f19b(p)`,
-		fail:      true,
-		expensive: true,
-	},
-	{
-		// Similar case, with a source on the heap.
-		name: "barriergcprogstructheap",
-		c: `#include <stdlib.h>
-		    struct s20a { char *a[32769]; };
-		    struct s20b { struct s20a f; };
-		    struct s20b *f20() { return malloc(sizeof(struct s20b)); }
-		    void f20b(struct s20b *p) {}
-		    void f20c(void *p) {}`,
-		imports:   []string{"unsafe"},
-		body:      `p := C.f20(); n := &C.struct_s20a{[32769]*C.char{new(C.char)}}; p.f = *n; C.f20b(p); n.a[0] = nil; C.f20c(unsafe.Pointer(n))`,
-		fail:      true,
-		expensive: true,
-	},
-	{
-		// Exported functions may not return Go pointers.
-		name: "export1",
-		c:    `extern unsigned char *GoFn21();`,
-		support: `//export GoFn21
-		          func GoFn21() *byte { return new(byte) }`,
-		body: `C.GoFn21()`,
-		fail: true,
-	},
-	{
-		// Returning a C pointer is fine.
-		name: "exportok",
-		c: `#include <stdlib.h>
-		    extern unsigned char *GoFn22();`,
-		support: `//export GoFn22
-		          func GoFn22() *byte { return (*byte)(C.malloc(1)) }`,
-		body: `C.GoFn22()`,
-	},
-	{
-		// Passing a Go string is fine.
-		name: "passstring",
-		c: `#include <stddef.h>
-		    typedef struct { const char *p; ptrdiff_t n; } gostring23;
-		    gostring23 f23(gostring23 s) { return s; }`,
-		imports: []string{"unsafe"},
-		body:    `s := "a"; r := C.f23(*(*C.gostring23)(unsafe.Pointer(&s))); if *(*string)(unsafe.Pointer(&r)) != s { panic(r) }`,
-	},
-	{
-		// Passing a slice of Go strings fails.
-		name:    "passstringslice",
-		c:       `void f24(void *p) {}`,
-		imports: []string{"strings", "unsafe"},
-		support: `type S24 struct { a [1]string }`,
-		body:    `s := S24{a:[1]string{strings.Repeat("a", 2)}}; C.f24(unsafe.Pointer(&s.a[0]))`,
-		fail:    true,
-	},
-	{
-		// Exported functions may not return strings.
-		name:    "retstring",
-		c:       `extern void f25();`,
-		imports: []string{"strings"},
-		support: `//export GoStr25
-		          func GoStr25() string { return strings.Repeat("a", 2) }`,
-		body: `C.f25()`,
-		c1: `#include <stddef.h>
-		     typedef struct { const char *p; ptrdiff_t n; } gostring25;
-		     extern gostring25 GoStr25();
-		     void f25() { GoStr25(); }`,
-		fail: true,
-	},
-	{
-		// Don't check non-pointer data.
-		// Uses unsafe code to get a pointer we shouldn't check.
-		// Although we use unsafe, the uintptr represents an integer
-		// that happens to have the same representation as a pointer;
-		// that is, we are testing something that is not unsafe.
-		name: "ptrdata1",
-		c: `#include <stdlib.h>
-		    void f26(void* p) {}`,
-		imports: []string{"unsafe"},
-		support: `type S26 struct { p *int; a [8*8]byte; u uintptr }`,
-		body:    `i := 0; p := &S26{u:uintptr(unsafe.Pointer(&i))}; q := (*S26)(C.malloc(C.size_t(unsafe.Sizeof(*p)))); *q = *p; C.f26(unsafe.Pointer(q))`,
-		fail:    false,
-	},
-	{
-		// Like ptrdata1, but with a type that uses a GC program.
-		name: "ptrdata2",
-		c: `#include <stdlib.h>
-		    void f27(void* p) {}`,
-		imports: []string{"unsafe"},
-		support: `type S27 struct { p *int; a [32769*8]byte; q *int; u uintptr }`,
-		body:    `i := 0; p := S27{u:uintptr(unsafe.Pointer(&i))}; q := (*S27)(C.malloc(C.size_t(unsafe.Sizeof(p)))); *q = p; C.f27(unsafe.Pointer(q))`,
-		fail:    false,
-	},
-	{
-		// Check deferred pointers when they are used, not
-		// when the defer statement is run.
-		name: "defer1",
-		c:    `typedef struct s28 { int *p; } s28; void f28(s28 *ps) {}`,
-		body: `p := &C.s28{}; defer C.f28(p); p.p = new(C.int)`,
-		fail: true,
-	},
-	{
-		// Check a pointer to a union if the union has any
-		// pointer fields.
-		name:    "union1",
-		c:       `typedef union { char **p; unsigned long i; } u29; void f29(u29 *pu) {}`,
-		imports: []string{"unsafe"},
-		body:    `var b C.char; p := &b; C.f29((*C.u29)(unsafe.Pointer(&p)))`,
-		fail:    true,
-	},
-	{
-		// Don't check a pointer to a union if the union does
-		// not have any pointer fields.
-		// Like ptrdata1 above, the uintptr represents an
-		// integer that happens to have the same
-		// representation as a pointer.
-		name:    "union2",
-		c:       `typedef union { unsigned long i; } u39; void f39(u39 *pu) {}`,
-		imports: []string{"unsafe"},
-		body:    `var b C.char; p := &b; C.f39((*C.u39)(unsafe.Pointer(&p)))`,
-		fail:    false,
-	},
-	{
-		// Test preemption while entering a cgo call. Issue #21306.
-		name:    "preemptduringcall",
-		c:       `void f30() {}`,
-		imports: []string{"runtime", "sync"},
-		body:    `var wg sync.WaitGroup; wg.Add(100); for i := 0; i < 100; i++ { go func(i int) { for j := 0; j < 100; j++ { C.f30(); runtime.GOMAXPROCS(i) }; wg.Done() }(i) }; wg.Wait()`,
-		fail:    false,
-	},
-	{
-		// Test poller deadline with cgocheck=2.  Issue #23435.
-		name:    "deadline",
-		c:       `#define US31 10`,
-		imports: []string{"os", "time"},
-		body:    `r, _, _ := os.Pipe(); r.SetDeadline(time.Now().Add(C.US31 * time.Microsecond))`,
-		fail:    false,
-	},
-	{
-		// Test for double evaluation of channel receive.
-		name:    "chanrecv",
-		c:       `void f32(char** p) {}`,
-		imports: []string{"time"},
-		body:    `c := make(chan []*C.char, 2); c <- make([]*C.char, 1); go func() { time.Sleep(10 * time.Second); panic("received twice from chan") }(); C.f32(&(<-c)[0]);`,
-		fail:    false,
-	},
-	{
-		// Test that converting the address of a struct field
-		// to unsafe.Pointer still just checks that field.
-		// Issue #25941.
-		name:    "structfield",
-		c:       `void f33(void* p) {}`,
-		imports: []string{"unsafe"},
-		support: `type S33 struct { p *int; a [8]byte; u uintptr }`,
-		body:    `s := &S33{p: new(int)}; C.f33(unsafe.Pointer(&s.a))`,
-		fail:    false,
-	},
-	{
-		// Test that converting multiple struct field
-		// addresses to unsafe.Pointer still just checks those
-		// fields. Issue #25941.
-		name:    "structfield2",
-		c:       `void f34(void* p, int r, void* s) {}`,
-		imports: []string{"unsafe"},
-		support: `type S34 struct { a [8]byte; p *int; b int64; }`,
-		body:    `s := &S34{p: new(int)}; C.f34(unsafe.Pointer(&s.a), 32, unsafe.Pointer(&s.b))`,
-		fail:    false,
-	},
-	{
-		// Test that second argument to cgoCheckPointer is
-		// evaluated when a deferred function is deferred, not
-		// when it is run.
-		name:    "defer2",
-		c:       `void f35(char **pc) {}`,
-		support: `type S35a struct { s []*C.char }; type S35b struct { ps *S35a }`,
-		body:    `p := &S35b{&S35a{[]*C.char{nil}}}; defer C.f35(&p.ps.s[0]); p.ps = nil`,
-		fail:    false,
-	},
-	{
-		// Test that indexing into a function call still
-		// examines only the slice being indexed.
-		name:    "buffer",
-		c:       `void f36(void *p) {}`,
-		imports: []string{"bytes", "unsafe"},
-		body:    `var b bytes.Buffer; b.WriteString("a"); C.f36(unsafe.Pointer(&b.Bytes()[0]))`,
-		fail:    false,
-	},
-	{
-		// Test that bgsweep releasing a finalizer is OK.
-		name:    "finalizer",
-		c:       `// Nothing to declare.`,
-		imports: []string{"os"},
-		support: `func open37() { os.Open(os.Args[0]) }; var G37 [][]byte`,
-		body:    `for i := 0; i < 10000; i++ { G37 = append(G37, make([]byte, 4096)); if i % 100 == 0 { G37 = nil; open37() } }`,
-		fail:    false,
-	},
-	{
-		// Test that converting generated struct to interface is OK.
-		name:    "structof",
-		c:       `// Nothing to declare.`,
-		imports: []string{"reflect"},
-		support: `type MyInt38 int; func (i MyInt38) Get() int { return int(i) }; type Getter38 interface { Get() int }`,
-		body:    `t := reflect.StructOf([]reflect.StructField{{Name: "MyInt38", Type: reflect.TypeOf(MyInt38(0)), Anonymous: true}}); v := reflect.New(t).Elem(); v.Interface().(Getter38).Get()`,
-		fail:    false,
-	},
-	{
-		// Test that a converted address of a struct field results
-		// in a check for just that field and not the whole struct.
-		name:    "structfieldcast",
-		c:       `struct S40i { int i; int* p; }; void f40(struct S40i* p) {}`,
-		support: `type S40 struct { p *int; a C.struct_S40i }`,
-		body:    `s := &S40{p: new(int)}; C.f40((*C.struct_S40i)(&s.a))`,
-		fail:    false,
-	},
-}
-
-func TestPointerChecks(t *testing.T) {
-	dir, exe := buildPtrTests(t)
-
-	// We (TestPointerChecks) return before the parallel subtest functions do,
-	// so we can't just defer os.RemoveAll(dir). Instead we have to wait for
-	// the parallel subtests to finish. This code looks racy but is not:
-	// the add +1 run in serial before testOne blocks. The -1 run in parallel
-	// after testOne finishes.
-	var pending int32
-	for _, pt := range ptrTests {
-		pt := pt
-		t.Run(pt.name, func(t *testing.T) {
-			atomic.AddInt32(&pending, +1)
-			defer func() {
-				if atomic.AddInt32(&pending, -1) == 0 {
-					os.RemoveAll(dir)
-				}
-			}()
-			testOne(t, pt, exe)
-		})
-	}
-}
-
-func buildPtrTests(t *testing.T) (dir, exe string) {
-	var gopath string
-	if *tmp != "" {
-		gopath = *tmp
-		dir = ""
-	} else {
-		d, err := os.MkdirTemp("", filepath.Base(t.Name()))
-		if err != nil {
-			t.Fatal(err)
-		}
-		dir = d
-		gopath = d
-	}
-
-	src := filepath.Join(gopath, "src", "ptrtest")
-	if err := os.MkdirAll(src, 0777); err != nil {
-		t.Fatal(err)
-	}
-	if err := os.WriteFile(filepath.Join(src, "go.mod"), []byte("module ptrtest"), 0666); err != nil {
-		t.Fatal(err)
-	}
-
-	// Prepare two cgo inputs: one for standard cgo and one for //export cgo.
-	// (The latter cannot have C definitions, only declarations.)
-	var cgo1, cgo2 bytes.Buffer
-	fmt.Fprintf(&cgo1, "package main\n\n/*\n")
-	fmt.Fprintf(&cgo2, "package main\n\n/*\n")
-
-	// C code
-	for _, pt := range ptrTests {
-		cgo := &cgo1
-		if strings.Contains(pt.support, "//export") {
-			cgo = &cgo2
-		}
-		fmt.Fprintf(cgo, "%s\n", pt.c)
-		fmt.Fprintf(&cgo1, "%s\n", pt.c1)
-	}
-	fmt.Fprintf(&cgo1, "*/\nimport \"C\"\n\n")
-	fmt.Fprintf(&cgo2, "*/\nimport \"C\"\n\n")
-
-	// Imports
-	did1 := make(map[string]bool)
-	did2 := make(map[string]bool)
-	did1["os"] = true // for ptrTestMain
-	fmt.Fprintf(&cgo1, "import \"os\"\n")
-
-	for _, pt := range ptrTests {
-		did := did1
-		cgo := &cgo1
-		if strings.Contains(pt.support, "//export") {
-			did = did2
-			cgo = &cgo2
-		}
-		for _, imp := range pt.imports {
-			if !did[imp] {
-				did[imp] = true
-				fmt.Fprintf(cgo, "import %q\n", imp)
-			}
-		}
-	}
-
-	// Func support and bodies.
-	for _, pt := range ptrTests {
-		cgo := &cgo1
-		if strings.Contains(pt.support, "//export") {
-			cgo = &cgo2
-		}
-		fmt.Fprintf(cgo, "%s\nfunc %s() {\n%s\n}\n", pt.support, pt.name, pt.body)
-	}
-
-	// Func list and main dispatch.
-	fmt.Fprintf(&cgo1, "var funcs = map[string]func() {\n")
-	for _, pt := range ptrTests {
-		fmt.Fprintf(&cgo1, "\t%q: %s,\n", pt.name, pt.name)
-	}
-	fmt.Fprintf(&cgo1, "}\n\n")
-	fmt.Fprintf(&cgo1, "%s\n", ptrTestMain)
-
-	if err := os.WriteFile(filepath.Join(src, "cgo1.go"), cgo1.Bytes(), 0666); err != nil {
-		t.Fatal(err)
-	}
-	if err := os.WriteFile(filepath.Join(src, "cgo2.go"), cgo2.Bytes(), 0666); err != nil {
-		t.Fatal(err)
-	}
-
-	cmd := exec.Command("go", "build", "-o", "ptrtest.exe")
-	cmd.Dir = src
-	cmd.Env = append(os.Environ(), "GOPATH="+gopath)
-	out, err := cmd.CombinedOutput()
-	if err != nil {
-		t.Fatalf("go build: %v\n%s", err, out)
-	}
-
-	return dir, filepath.Join(src, "ptrtest.exe")
-}
-
-const ptrTestMain = `
-func main() {
-	for _, arg := range os.Args[1:] {
-		f := funcs[arg]
-		if f == nil {
-			panic("missing func "+arg)
-		}
-		f()
-	}
-}
-`
-
-var csem = make(chan bool, 16)
-
-func testOne(t *testing.T, pt ptrTest, exe string) {
-	t.Parallel()
-
-	// Run the tests in parallel, but don't run too many
-	// executions in parallel, to avoid overloading the system.
-	runcmd := func(cgocheck string) ([]byte, error) {
-		csem <- true
-		defer func() { <-csem }()
-		cmd := exec.Command(exe, pt.name)
-		cmd.Env = append(os.Environ(), "GODEBUG=cgocheck="+cgocheck)
-		return cmd.CombinedOutput()
-	}
-
-	if pt.expensive {
-		buf, err := runcmd("1")
-		if err != nil {
-			t.Logf("%s", buf)
-			if pt.fail {
-				t.Fatalf("test marked expensive, but failed when not expensive: %v", err)
-			} else {
-				t.Errorf("failed unexpectedly with GODEBUG=cgocheck=1: %v", err)
-			}
-		}
-
-	}
-
-	cgocheck := ""
-	if pt.expensive {
-		cgocheck = "2"
-	}
-
-	buf, err := runcmd(cgocheck)
-	if pt.fail {
-		if err == nil {
-			t.Logf("%s", buf)
-			t.Fatalf("did not fail as expected")
-		} else if !bytes.Contains(buf, []byte("Go pointer")) {
-			t.Logf("%s", buf)
-			t.Fatalf("did not print expected error (failed with %v)", err)
-		}
-	} else {
-		if err != nil {
-			t.Logf("%s", buf)
-			t.Fatalf("failed unexpectedly: %v", err)
-		}
-
-		if !pt.expensive {
-			// Make sure it passes with the expensive checks.
-			buf, err := runcmd("2")
-			if err != nil {
-				t.Logf("%s", buf)
-				t.Fatalf("failed unexpectedly with expensive checks: %v", err)
-			}
-		}
-	}
-
-	if pt.fail {
-		buf, err := runcmd("0")
-		if err != nil {
-			t.Logf("%s", buf)
-			t.Fatalf("failed unexpectedly with GODEBUG=cgocheck=0: %v", err)
-		}
-	}
-}
diff --git a/misc/cgo/fortran/fortran_test.go b/misc/cgo/fortran/fortran_test.go
deleted file mode 100644
index 4604a4d..0000000
--- a/misc/cgo/fortran/fortran_test.go
+++ /dev/null
@@ -1,81 +0,0 @@
-// Copyright 2022 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package fortran
-
-import (
-	"fmt"
-	"os"
-	"os/exec"
-	"path/filepath"
-	"runtime"
-	"strings"
-	"testing"
-)
-
-func TestFortran(t *testing.T) {
-	// Find the FORTRAN compiler.
-	fc := os.Getenv("FC")
-	if fc == "" {
-		fc, _ = exec.LookPath("gfortran")
-	}
-	if fc == "" {
-		t.Skip("fortran compiler not found (try setting $FC)")
-	}
-
-	var fcExtra []string
-	if strings.Contains(fc, "gfortran") {
-		// TODO: This duplicates but also diverges from logic from cmd/go
-		// itself. For example, cmd/go merely adds -lgfortran without the extra
-		// library path work. If this is what's necessary to run gfortran, we
-		// should reconcile the logic here and in cmd/go.. Maybe this should
-		// become a cmd/go script test to share that logic.
-
-		// Add -m32 if we're targeting 386, in case this is a cross-compile.
-		if runtime.GOARCH == "386" {
-			fcExtra = append(fcExtra, "-m32")
-		}
-
-		// Find libgfortran. If the FORTRAN compiler isn't bundled
-		// with the C linker, this may be in a path the C linker can't
-		// find on its own. (See #14544)
-		libExt := "so"
-		switch runtime.GOOS {
-		case "darwin":
-			libExt = "dylib"
-		case "aix":
-			libExt = "a"
-		}
-		libPath, err := exec.Command(fc, append([]string{"-print-file-name=libgfortran." + libExt}, fcExtra...)...).CombinedOutput()
-		if err != nil {
-			t.Errorf("error invoking %s: %s", fc, err)
-		}
-		libDir := filepath.Dir(string(libPath))
-		cgoLDFlags := os.Getenv("CGO_LDFLAGS")
-		cgoLDFlags += " -L " + libDir
-		if runtime.GOOS != "aix" {
-			cgoLDFlags += " -Wl,-rpath," + libDir
-		}
-		t.Logf("CGO_LDFLAGS=%s", cgoLDFlags)
-		os.Setenv("CGO_LDFLAGS", cgoLDFlags)
-
-	}
-
-	// Do a test build that doesn't involve Go FORTRAN support.
-	fcArgs := append([]string{"helloworld/helloworld.f90", "-o", "/dev/null"}, fcExtra...)
-	t.Logf("%s %s", fc, fcArgs)
-	if err := exec.Command(fc, fcArgs...).Run(); err != nil {
-		t.Skipf("skipping Fortran test: could not build helloworld.f90 with %s: %s", fc, err)
-	}
-
-	// Finally, run the actual test.
-	t.Log("go", "run", "./testdata/testprog")
-	out, err := exec.Command("go", "run", "./testdata/testprog").CombinedOutput()
-	if err == nil && string(out) != "ok\n" {
-		err = fmt.Errorf("expected ok")
-	}
-	if err != nil {
-		t.Errorf("%s\nOutput:\n%s", err, string(out))
-	}
-}
diff --git a/misc/cgo/gmp/fib.go b/misc/cgo/gmp/fib.go
index f453fcf..48b0700 100644
--- a/misc/cgo/gmp/fib.go
+++ b/misc/cgo/gmp/fib.go
@@ -3,7 +3,6 @@
 // license that can be found in the LICENSE file.
 
 //go:build ignore
-// +build ignore
 
 // Compute Fibonacci numbers with two goroutines
 // that pass integers back and forth.  No actual
diff --git a/misc/cgo/gmp/pi.go b/misc/cgo/gmp/pi.go
index 5ea0349..537a426 100644
--- a/misc/cgo/gmp/pi.go
+++ b/misc/cgo/gmp/pi.go
@@ -3,7 +3,6 @@
 // license that can be found in the LICENSE file.
 
 //go:build ignore
-// +build ignore
 
 package main
 
diff --git a/misc/cgo/life/life_test.go b/misc/cgo/life/life_test.go
deleted file mode 100644
index 0becb26..0000000
--- a/misc/cgo/life/life_test.go
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright 2019 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package life_test
-
-import (
-	"bytes"
-	"log"
-	"os"
-	"os/exec"
-	"path/filepath"
-	"strings"
-	"testing"
-)
-
-func TestMain(m *testing.M) {
-	log.SetFlags(log.Lshortfile)
-	os.Exit(testMain(m))
-}
-
-func testMain(m *testing.M) int {
-	GOPATH, err := os.MkdirTemp("", "cgolife")
-	if err != nil {
-		log.Panic(err)
-	}
-	defer os.RemoveAll(GOPATH)
-	os.Setenv("GOPATH", GOPATH)
-
-	// Copy testdata into GOPATH/src/cgolife, along with a go.mod file
-	// declaring the same path.
-	modRoot := filepath.Join(GOPATH, "src", "cgolife")
-	if err := overlayDir(modRoot, "testdata"); err != nil {
-		log.Panic(err)
-	}
-	if err := os.Chdir(modRoot); err != nil {
-		log.Panic(err)
-	}
-	os.Setenv("PWD", modRoot)
-	if err := os.WriteFile("go.mod", []byte("module cgolife\n"), 0666); err != nil {
-		log.Panic(err)
-	}
-
-	return m.Run()
-}
-
-func TestTestRun(t *testing.T) {
-	if os.Getenv("GOOS") == "android" {
-		t.Skip("the go tool runs with CGO_ENABLED=0 on the android device")
-	}
-	out, err := exec.Command("go", "env", "GOROOT").Output()
-	if err != nil {
-		t.Fatal(err)
-	}
-	GOROOT := string(bytes.TrimSpace(out))
-
-	cmd := exec.Command("go", "run", filepath.Join(GOROOT, "test", "run.go"), "-", ".")
-	out, err = cmd.CombinedOutput()
-	if err != nil {
-		t.Fatalf("%s: %s\n%s", strings.Join(cmd.Args, " "), err, out)
-	}
-	t.Logf("%s:\n%s", strings.Join(cmd.Args, " "), out)
-}
diff --git a/misc/cgo/life/overlaydir_test.go b/misc/cgo/life/overlaydir_test.go
deleted file mode 100644
index 034c836..0000000
--- a/misc/cgo/life/overlaydir_test.go
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright 2019 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package life_test
-
-import (
-	"io"
-	"os"
-	"path/filepath"
-	"strings"
-)
-
-// overlayDir makes a minimal-overhead copy of srcRoot in which new files may be added.
-//
-// TODO: Once we no longer need to support the misc module in GOPATH mode,
-// factor this function out into a package to reduce duplication.
-func overlayDir(dstRoot, srcRoot string) error {
-	dstRoot = filepath.Clean(dstRoot)
-	if err := os.MkdirAll(dstRoot, 0777); err != nil {
-		return err
-	}
-
-	srcRoot, err := filepath.Abs(srcRoot)
-	if err != nil {
-		return err
-	}
-
-	return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error {
-		if err != nil || srcPath == srcRoot {
-			return err
-		}
-
-		suffix := strings.TrimPrefix(srcPath, srcRoot)
-		for len(suffix) > 0 && suffix[0] == filepath.Separator {
-			suffix = suffix[1:]
-		}
-		dstPath := filepath.Join(dstRoot, suffix)
-
-		perm := info.Mode() & os.ModePerm
-		if info.Mode()&os.ModeSymlink != 0 {
-			info, err = os.Stat(srcPath)
-			if err != nil {
-				return err
-			}
-			perm = info.Mode() & os.ModePerm
-		}
-
-		// Always copy directories (don't symlink them).
-		// If we add a file in the overlay, we don't want to add it in the original.
-		if info.IsDir() {
-			return os.MkdirAll(dstPath, perm|0200)
-		}
-
-		// If the OS supports symlinks, use them instead of copying bytes.
-		if err := os.Symlink(srcPath, dstPath); err == nil {
-			return nil
-		}
-
-		// Otherwise, copy the bytes.
-		src, err := os.Open(srcPath)
-		if err != nil {
-			return err
-		}
-		defer src.Close()
-
-		dst, err := os.OpenFile(dstPath, os.O_WRONLY|os.O_CREATE|os.O_EXCL, perm)
-		if err != nil {
-			return err
-		}
-
-		_, err = io.Copy(dst, src)
-		if closeErr := dst.Close(); err == nil {
-			err = closeErr
-		}
-		return err
-	})
-}
diff --git a/misc/cgo/life/testdata/life.go b/misc/cgo/life/testdata/life.go
deleted file mode 100644
index 2e0af81..0000000
--- a/misc/cgo/life/testdata/life.go
+++ /dev/null
@@ -1,41 +0,0 @@
-// skip
-
-// 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 cgolife
-
-// #include "life.h"
-import "C"
-
-import "unsafe"
-
-func Run(gen, x, y int, a []int32) {
-	n := make([]int32, x*y)
-	for i := 0; i < gen; i++ {
-		C.Step(C.int(x), C.int(y), (*C.int)(unsafe.Pointer(&a[0])), (*C.int)(unsafe.Pointer(&n[0])))
-		copy(a, n)
-	}
-}
-
-// Keep the channels visible from Go.
-var chans [4]chan bool
-
-//export GoStart
-// Double return value is just for testing.
-func GoStart(i, xdim, ydim, xstart, xend, ystart, yend C.int, a *C.int, n *C.int) (int, int) {
-	c := make(chan bool, int(C.MYCONST))
-	go func() {
-		C.DoStep(xdim, ydim, xstart, xend, ystart, yend, a, n)
-		c <- true
-	}()
-	chans[i] = c
-	return int(i), int(i + 100)
-}
-
-//export GoWait
-func GoWait(i C.int) {
-	<-chans[i]
-	chans[i] = nil
-}
diff --git a/misc/cgo/life/testdata/main.go b/misc/cgo/life/testdata/main.go
deleted file mode 100644
index cc2ca7c..0000000
--- a/misc/cgo/life/testdata/main.go
+++ /dev/null
@@ -1,49 +0,0 @@
-// run -tags=use_go_run
-
-// 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 test_run
-
-// Run the game of life in C using Go for parallelization.
-
-package main
-
-import (
-	"flag"
-	"fmt"
-
-	"cgolife"
-)
-
-const MAXDIM = 100
-
-var dim = flag.Int("dim", 16, "board dimensions")
-var gen = flag.Int("gen", 10, "generations")
-
-func main() {
-	flag.Parse()
-
-	var a [MAXDIM * MAXDIM]int32
-	for i := 2; i < *dim; i += 8 {
-		for j := 2; j < *dim-3; j += 8 {
-			for y := 0; y < 3; y++ {
-				a[i**dim+j+y] = 1
-			}
-		}
-	}
-
-	cgolife.Run(*gen, *dim, *dim, a[:])
-
-	for i := 0; i < *dim; i++ {
-		for j := 0; j < *dim; j++ {
-			if a[i**dim+j] == 0 {
-				fmt.Print(" ")
-			} else {
-				fmt.Print("X")
-			}
-		}
-		fmt.Print("\n")
-	}
-}
diff --git a/misc/cgo/stdio/overlaydir_test.go b/misc/cgo/stdio/overlaydir_test.go
deleted file mode 100644
index 027ebf1..0000000
--- a/misc/cgo/stdio/overlaydir_test.go
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright 2019 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package stdio_test
-
-import (
-	"io"
-	"os"
-	"path/filepath"
-	"strings"
-)
-
-// overlayDir makes a minimal-overhead copy of srcRoot in which new files may be added.
-//
-// TODO: Once we no longer need to support the misc module in GOPATH mode,
-// factor this function out into a package to reduce duplication.
-func overlayDir(dstRoot, srcRoot string) error {
-	dstRoot = filepath.Clean(dstRoot)
-	if err := os.MkdirAll(dstRoot, 0777); err != nil {
-		return err
-	}
-
-	srcRoot, err := filepath.Abs(srcRoot)
-	if err != nil {
-		return err
-	}
-
-	return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error {
-		if err != nil || srcPath == srcRoot {
-			return err
-		}
-
-		suffix := strings.TrimPrefix(srcPath, srcRoot)
-		for len(suffix) > 0 && suffix[0] == filepath.Separator {
-			suffix = suffix[1:]
-		}
-		dstPath := filepath.Join(dstRoot, suffix)
-
-		perm := info.Mode() & os.ModePerm
-		if info.Mode()&os.ModeSymlink != 0 {
-			info, err = os.Stat(srcPath)
-			if err != nil {
-				return err
-			}
-			perm = info.Mode() & os.ModePerm
-		}
-
-		// Always copy directories (don't symlink them).
-		// If we add a file in the overlay, we don't want to add it in the original.
-		if info.IsDir() {
-			return os.MkdirAll(dstPath, perm|0200)
-		}
-
-		// If the OS supports symlinks, use them instead of copying bytes.
-		if err := os.Symlink(srcPath, dstPath); err == nil {
-			return nil
-		}
-
-		// Otherwise, copy the bytes.
-		src, err := os.Open(srcPath)
-		if err != nil {
-			return err
-		}
-		defer src.Close()
-
-		dst, err := os.OpenFile(dstPath, os.O_WRONLY|os.O_CREATE|os.O_EXCL, perm)
-		if err != nil {
-			return err
-		}
-
-		_, err = io.Copy(dst, src)
-		if closeErr := dst.Close(); err == nil {
-			err = closeErr
-		}
-		return err
-	})
-}
diff --git a/misc/cgo/stdio/stdio_test.go b/misc/cgo/stdio/stdio_test.go
deleted file mode 100644
index 675418f..0000000
--- a/misc/cgo/stdio/stdio_test.go
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright 2019 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package stdio_test
-
-import (
-	"bytes"
-	"log"
-	"os"
-	"os/exec"
-	"path/filepath"
-	"strings"
-	"testing"
-)
-
-func TestMain(m *testing.M) {
-	log.SetFlags(log.Lshortfile)
-	os.Exit(testMain(m))
-}
-
-func testMain(m *testing.M) int {
-	GOPATH, err := os.MkdirTemp("", "cgostdio")
-	if err != nil {
-		log.Panic(err)
-	}
-	defer os.RemoveAll(GOPATH)
-	os.Setenv("GOPATH", GOPATH)
-
-	// Copy testdata into GOPATH/src/cgostdio, along with a go.mod file
-	// declaring the same path.
-	modRoot := filepath.Join(GOPATH, "src", "cgostdio")
-	if err := overlayDir(modRoot, "testdata"); err != nil {
-		log.Panic(err)
-	}
-	if err := os.Chdir(modRoot); err != nil {
-		log.Panic(err)
-	}
-	os.Setenv("PWD", modRoot)
-	if err := os.WriteFile("go.mod", []byte("module cgostdio\n"), 0666); err != nil {
-		log.Panic(err)
-	}
-
-	return m.Run()
-}
-
-func TestTestRun(t *testing.T) {
-	if os.Getenv("GOOS") == "android" {
-		t.Skip("subpackage stdio is not available on android")
-	}
-	out, err := exec.Command("go", "env", "GOROOT").Output()
-	if err != nil {
-		t.Fatal(err)
-	}
-	GOROOT := string(bytes.TrimSpace(out))
-
-	cmd := exec.Command("go", "run", filepath.Join(GOROOT, "test", "run.go"), "-", ".")
-	out, err = cmd.CombinedOutput()
-	if err != nil {
-		t.Fatalf("%s: %s\n%s", strings.Join(cmd.Args, " "), err, out)
-	}
-	t.Logf("%s:\n%s", strings.Join(cmd.Args, " "), out)
-}
diff --git a/misc/cgo/stdio/testdata/chain.go b/misc/cgo/stdio/testdata/chain.go
deleted file mode 100644
index 6c3f406..0000000
--- a/misc/cgo/stdio/testdata/chain.go
+++ /dev/null
@@ -1,48 +0,0 @@
-// run -tags=use_go_run
-
-// Copyright 2009 The Go 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 test_run
-
-// Pass numbers along a chain of threads.
-
-package main
-
-import (
-	"runtime"
-	"strconv"
-
-	"cgostdio/stdio"
-)
-
-const N = 10
-const R = 5
-
-func link(left chan<- int, right <-chan int) {
-	// Keep the links in dedicated operating system
-	// threads, so that this program tests coordination
-	// between pthreads and not just goroutines.
-	runtime.LockOSThread()
-	for {
-		v := <-right
-		stdio.Stdout.WriteString(strconv.Itoa(v) + "\n")
-		left <- 1 + v
-	}
-}
-
-func main() {
-	leftmost := make(chan int)
-	var left chan int
-	right := leftmost
-	for i := 0; i < N; i++ {
-		left, right = right, make(chan int)
-		go link(left, right)
-	}
-	for i := 0; i < R; i++ {
-		right <- 0
-		x := <-leftmost
-		stdio.Stdout.WriteString(strconv.Itoa(x) + "\n")
-	}
-}
diff --git a/misc/cgo/stdio/testdata/fib.go b/misc/cgo/stdio/testdata/fib.go
deleted file mode 100644
index 49cb0ea..0000000
--- a/misc/cgo/stdio/testdata/fib.go
+++ /dev/null
@@ -1,52 +0,0 @@
-// run -tags=use_go_run
-
-// Copyright 2009 The Go 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 test_run
-
-// Compute Fibonacci numbers with two goroutines
-// that pass integers back and forth.  No actual
-// concurrency, just threads and synchronization
-// and foreign code on multiple pthreads.
-
-package main
-
-import (
-	"runtime"
-	"strconv"
-
-	"cgostdio/stdio"
-)
-
-func fibber(c, out chan int64, i int64) {
-	// Keep the fibbers in dedicated operating system
-	// threads, so that this program tests coordination
-	// between pthreads and not just goroutines.
-	runtime.LockOSThread()
-
-	if i == 0 {
-		c <- i
-	}
-	for {
-		j := <-c
-		stdio.Stdout.WriteString(strconv.FormatInt(j, 10) + "\n")
-		out <- j
-		<-out
-		i += j
-		c <- i
-	}
-}
-
-func main() {
-	c := make(chan int64)
-	out := make(chan int64)
-	go fibber(c, out, 0)
-	go fibber(c, out, 1)
-	<-out
-	for i := 0; i < 90; i++ {
-		out <- 1
-		<-out
-	}
-}
diff --git a/misc/cgo/stdio/testdata/hello.go b/misc/cgo/stdio/testdata/hello.go
deleted file mode 100644
index 046bfee..0000000
--- a/misc/cgo/stdio/testdata/hello.go
+++ /dev/null
@@ -1,15 +0,0 @@
-// run -tags=use_go_run
-
-// Copyright 2009 The Go 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 test_run
-
-package main
-
-import "cgostdio/stdio"
-
-func main() {
-	stdio.Stdout.WriteString(stdio.Greeting + "\n")
-}
diff --git a/misc/cgo/stdio/testdata/run.out b/misc/cgo/stdio/testdata/run.out
deleted file mode 100644
index c0e4965..0000000
--- a/misc/cgo/stdio/testdata/run.out
+++ /dev/null
@@ -1,150 +0,0 @@
-* hello
-hello, world
-* fib
-0
-1
-1
-2
-3
-5
-8
-13
-21
-34
-55
-89
-144
-233
-377
-610
-987
-1597
-2584
-4181
-6765
-10946
-17711
-28657
-46368
-75025
-121393
-196418
-317811
-514229
-832040
-1346269
-2178309
-3524578
-5702887
-9227465
-14930352
-24157817
-39088169
-63245986
-102334155
-165580141
-267914296
-433494437
-701408733
-1134903170
-1836311903
-2971215073
-4807526976
-7778742049
-12586269025
-20365011074
-32951280099
-53316291173
-86267571272
-139583862445
-225851433717
-365435296162
-591286729879
-956722026041
-1548008755920
-2504730781961
-4052739537881
-6557470319842
-10610209857723
-17167680177565
-27777890035288
-44945570212853
-72723460248141
-117669030460994
-190392490709135
-308061521170129
-498454011879264
-806515533049393
-1304969544928657
-2111485077978050
-3416454622906707
-5527939700884757
-8944394323791464
-14472334024676221
-23416728348467685
-37889062373143906
-61305790721611591
-99194853094755497
-160500643816367088
-259695496911122585
-420196140727489673
-679891637638612258
-1100087778366101931
-1779979416004714189
-2880067194370816120
-* chain
-0
-1
-2
-3
-4
-5
-6
-7
-8
-9
-10
-0
-1
-2
-3
-4
-5
-6
-7
-8
-9
-10
-0
-1
-2
-3
-4
-5
-6
-7
-8
-9
-10
-0
-1
-2
-3
-4
-5
-6
-7
-8
-9
-10
-0
-1
-2
-3
-4
-5
-6
-7
-8
-9
-10
diff --git a/misc/cgo/stdio/testdata/stdio/file.go b/misc/cgo/stdio/testdata/stdio/file.go
deleted file mode 100644
index a024f2c..0000000
--- a/misc/cgo/stdio/testdata/stdio/file.go
+++ /dev/null
@@ -1,44 +0,0 @@
-// skip
-
-// Copyright 2009 The Go 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 trivial example of wrapping a C library in Go.
-For a more complex example and explanation,
-see ../gmp/gmp.go.
-*/
-
-package stdio
-
-/*
-#include <stdio.h>
-#include <stdlib.h>
-#include <sys/stat.h>
-#include <errno.h>
-
-char* greeting = "hello, world";
-*/
-import "C"
-import "unsafe"
-
-type File C.FILE
-
-// Test reference to library symbol.
-// Stdout and stderr are too special to be a reliable test.
-//var  = C.environ
-
-func (f *File) WriteString(s string) {
-	p := C.CString(s)
-	C.fputs(p, (*C.FILE)(f))
-	C.free(unsafe.Pointer(p))
-	f.Flush()
-}
-
-func (f *File) Flush() {
-	C.fflush((*C.FILE)(f))
-}
-
-var Greeting = C.GoString(C.greeting)
-var Gbytes = C.GoBytes(unsafe.Pointer(C.greeting), C.int(len(Greeting)))
diff --git a/misc/cgo/stdio/testdata/stdio/stdio.go b/misc/cgo/stdio/testdata/stdio/stdio.go
deleted file mode 100644
index d216e44..0000000
--- a/misc/cgo/stdio/testdata/stdio/stdio.go
+++ /dev/null
@@ -1,22 +0,0 @@
-// skip
-
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package stdio
-
-/*
-#include <stdio.h>
-
-// on mingw, stderr and stdout are defined as &_iob[FILENO]
-// on netbsd, they are defined as &__sF[FILENO]
-// and cgo doesn't recognize them, so write a function to get them,
-// instead of depending on internals of libc implementation.
-FILE *getStdout(void) { return stdout; }
-FILE *getStderr(void) { return stderr; }
-*/
-import "C"
-
-var Stdout = (*File)(C.getStdout())
-var Stderr = (*File)(C.getStderr())
diff --git a/misc/cgo/test/callback.go b/misc/cgo/test/callback.go
deleted file mode 100644
index 08dd9b3..0000000
--- a/misc/cgo/test/callback.go
+++ /dev/null
@@ -1,1782 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-/*
-void callback(void *f);
-void callGoFoo(void);
-void callGoStackCheck(void);
-void callPanic(void);
-int callGoReturnVal(void);
-int returnAfterGrow(void);
-int returnAfterGrowFromGo(void);
-void callGoWithString(void);
-*/
-import "C"
-
-import (
-	"path"
-	"runtime"
-	"strings"
-	"sync"
-	"testing"
-	"unsafe"
-)
-
-// Pass a func value from nestedCall to goCallback using an integer token.
-var callbackMutex sync.Mutex
-var callbackToken int
-var callbackFuncs = make(map[int]func())
-
-// nestedCall calls into C, back into Go, and finally to f.
-func nestedCall(f func()) {
-	// callback(x) calls goCallback(x)
-	callbackMutex.Lock()
-	callbackToken++
-	i := callbackToken
-	callbackFuncs[i] = f
-	callbackMutex.Unlock()
-
-	// Pass the address of i because the C function was written to
-	// take a pointer.  We could pass an int if we felt like
-	// rewriting the C code.
-	C.callback(unsafe.Pointer(&i))
-
-	callbackMutex.Lock()
-	delete(callbackFuncs, i)
-	callbackMutex.Unlock()
-}
-
-//export goCallback
-func goCallback(p unsafe.Pointer) {
-	i := *(*int)(p)
-
-	callbackMutex.Lock()
-	f := callbackFuncs[i]
-	callbackMutex.Unlock()
-
-	if f == nil {
-		panic("missing callback function")
-	}
-	f()
-}
-
-func testCallback(t *testing.T) {
-	var x = false
-	nestedCall(func() { x = true })
-	if !x {
-		t.Fatal("nestedCall did not call func")
-	}
-}
-
-func testCallbackGC(t *testing.T) {
-	nestedCall(runtime.GC)
-}
-
-func testCallbackPanic(t *testing.T) {
-	// Make sure panic during callback unwinds properly.
-	if lockedOSThread() {
-		t.Fatal("locked OS thread on entry to TestCallbackPanic")
-	}
-	defer func() {
-		s := recover()
-		if s == nil {
-			t.Fatal("did not panic")
-		}
-		if s.(string) != "callback panic" {
-			t.Fatal("wrong panic:", s)
-		}
-		if lockedOSThread() {
-			t.Fatal("locked OS thread on exit from TestCallbackPanic")
-		}
-	}()
-	nestedCall(func() { panic("callback panic") })
-	panic("nestedCall returned")
-}
-
-func testCallbackPanicLoop(t *testing.T) {
-	// Make sure we don't blow out m->g0 stack.
-	for i := 0; i < 100000; i++ {
-		testCallbackPanic(t)
-	}
-}
-
-func testCallbackPanicLocked(t *testing.T) {
-	runtime.LockOSThread()
-	defer runtime.UnlockOSThread()
-
-	if !lockedOSThread() {
-		t.Fatal("runtime.LockOSThread didn't")
-	}
-	defer func() {
-		s := recover()
-		if s == nil {
-			t.Fatal("did not panic")
-		}
-		if s.(string) != "callback panic" {
-			t.Fatal("wrong panic:", s)
-		}
-		if !lockedOSThread() {
-			t.Fatal("lost lock on OS thread after panic")
-		}
-	}()
-	nestedCall(func() { panic("callback panic") })
-	panic("nestedCall returned")
-}
-
-// Callback with zero arguments used to make the stack misaligned,
-// which broke the garbage collector and other things.
-func testZeroArgCallback(t *testing.T) {
-	defer func() {
-		s := recover()
-		if s != nil {
-			t.Fatal("panic during callback:", s)
-		}
-	}()
-	C.callGoFoo()
-}
-
-//export goFoo
-func goFoo() {
-	x := 1
-	for i := 0; i < 10000; i++ {
-		// variadic call mallocs + writes to
-		variadic(x, x, x)
-		if x != 1 {
-			panic("bad x")
-		}
-	}
-}
-
-func variadic(x ...interface{}) {}
-
-func testBlocking(t *testing.T) {
-	c := make(chan int)
-	go func() {
-		for i := 0; i < 10; i++ {
-			c <- <-c
-		}
-	}()
-	nestedCall(func() {
-		for i := 0; i < 10; i++ {
-			c <- i
-			if j := <-c; j != i {
-				t.Errorf("out of sync %d != %d", j, i)
-			}
-		}
-	})
-}
-
-// Test that the stack can be unwound through a call out and call back
-// into Go.
-func testCallbackCallers(t *testing.T) {
-	if runtime.Compiler != "gc" {
-		// The exact function names are not going to be the same.
-		t.Skip("skipping for non-gc toolchain")
-	}
-	pc := make([]uintptr, 100)
-	n := 0
-	name := []string{
-		"runtime.cgocallbackg1",
-		"runtime.cgocallbackg",
-		"runtime.cgocallback",
-		"runtime.systemstack_switch",
-		"runtime.cgocall",
-		"test._Cfunc_callback",
-		"test.nestedCall.func1",
-		"test.nestedCall",
-		"test.testCallbackCallers",
-		"test.TestCallbackCallers",
-		"testing.tRunner",
-		"runtime.goexit",
-	}
-	nestedCall(func() {
-		n = runtime.Callers(4, pc)
-	})
-	if n != len(name) {
-		t.Errorf("expected %d frames, got %d", len(name), n)
-	}
-	for i := 0; i < n; i++ {
-		f := runtime.FuncForPC(pc[i] - 1) // TODO: use runtime.CallersFrames
-		if f == nil {
-			t.Fatalf("expected non-nil Func for pc %d", pc[i])
-		}
-		fname := f.Name()
-		// Remove the prepended pathname from automatically
-		// generated cgo function names.
-		if strings.HasPrefix(fname, "_") {
-			fname = path.Base(f.Name()[1:])
-		}
-		// In module mode, this package has a fully-qualified import path.
-		// Remove it if present.
-		fname = strings.TrimPrefix(fname, "misc/cgo/")
-
-		namei := ""
-		if i < len(name) {
-			namei = name[i]
-		}
-		if fname != namei {
-			t.Errorf("stk[%d] = %q, want %q", i, fname, namei)
-		}
-	}
-}
-
-func testPanicFromC(t *testing.T) {
-	defer func() {
-		r := recover()
-		if r == nil {
-			t.Fatal("did not panic")
-		}
-		if r.(string) != "panic from C" {
-			t.Fatal("wrong panic:", r)
-		}
-	}()
-	C.callPanic()
-}
-
-// Test that C code can return a value if it calls a Go function that
-// causes a stack copy.
-func testReturnAfterGrow(t *testing.T) {
-	// Use a new goroutine so that we get a small stack.
-	c := make(chan int)
-	go func() {
-		c <- int(C.returnAfterGrow())
-	}()
-	if got, want := <-c, 123456; got != want {
-		t.Errorf("got %d want %d", got, want)
-	}
-}
-
-// Test that we can return a value from Go->C->Go if the Go code
-// causes a stack copy.
-func testReturnAfterGrowFromGo(t *testing.T) {
-	// Use a new goroutine so that we get a small stack.
-	c := make(chan int)
-	go func() {
-		c <- int(C.returnAfterGrowFromGo())
-	}()
-	if got, want := <-c, 129*128/2; got != want {
-		t.Errorf("got %d want %d", got, want)
-	}
-}
-
-//export goReturnVal
-func goReturnVal() (r C.int) {
-	// Force a stack copy.
-	var f func(int) int
-	f = func(i int) int {
-		var buf [256]byte
-		use(buf[:])
-		if i == 0 {
-			return 0
-		}
-		return i + f(i-1)
-	}
-	r = C.int(f(128))
-	return
-}
-
-// Test that C can pass in a Go string from a string constant.
-func testCallGoWithString(t *testing.T) {
-	C.callGoWithString()
-	want := "string passed from C to Go"
-	if stringFromGo != want {
-		t.Errorf("string passed through C is %s, want %s", stringFromGo, want)
-	}
-}
-
-var stringFromGo string
-
-//export goWithString
-func goWithString(s string) {
-	stringFromGo = s
-}
-
-func testCallbackStack(t *testing.T) {
-	// Make cgo call and callback with different amount of stack available.
-	// We do not do any explicit checks, just ensure that it does not crash.
-	for _, f := range splitTests {
-		f()
-	}
-}
-
-//export goStackCheck
-func goStackCheck() {
-	// use some stack memory to trigger split stack check
-	var buf [256]byte
-	use(buf[:])
-}
-
-var Used byte
-
-func use(buf []byte) {
-	for _, c := range buf {
-		Used += c
-	}
-}
-
-var splitTests = []func(){
-	// Edit .+1,/^}/-1|seq 4 4 5000 | sed 's/.*/	stack&,/' | fmt
-	stack4, stack8, stack12, stack16, stack20, stack24, stack28,
-	stack32, stack36, stack40, stack44, stack48, stack52, stack56,
-	stack60, stack64, stack68, stack72, stack76, stack80, stack84,
-	stack88, stack92, stack96, stack100, stack104, stack108, stack112,
-	stack116, stack120, stack124, stack128, stack132, stack136,
-	stack140, stack144, stack148, stack152, stack156, stack160,
-	stack164, stack168, stack172, stack176, stack180, stack184,
-	stack188, stack192, stack196, stack200, stack204, stack208,
-	stack212, stack216, stack220, stack224, stack228, stack232,
-	stack236, stack240, stack244, stack248, stack252, stack256,
-	stack260, stack264, stack268, stack272, stack276, stack280,
-	stack284, stack288, stack292, stack296, stack300, stack304,
-	stack308, stack312, stack316, stack320, stack324, stack328,
-	stack332, stack336, stack340, stack344, stack348, stack352,
-	stack356, stack360, stack364, stack368, stack372, stack376,
-	stack380, stack384, stack388, stack392, stack396, stack400,
-	stack404, stack408, stack412, stack416, stack420, stack424,
-	stack428, stack432, stack436, stack440, stack444, stack448,
-	stack452, stack456, stack460, stack464, stack468, stack472,
-	stack476, stack480, stack484, stack488, stack492, stack496,
-	stack500, stack504, stack508, stack512, stack516, stack520,
-	stack524, stack528, stack532, stack536, stack540, stack544,
-	stack548, stack552, stack556, stack560, stack564, stack568,
-	stack572, stack576, stack580, stack584, stack588, stack592,
-	stack596, stack600, stack604, stack608, stack612, stack616,
-	stack620, stack624, stack628, stack632, stack636, stack640,
-	stack644, stack648, stack652, stack656, stack660, stack664,
-	stack668, stack672, stack676, stack680, stack684, stack688,
-	stack692, stack696, stack700, stack704, stack708, stack712,
-	stack716, stack720, stack724, stack728, stack732, stack736,
-	stack740, stack744, stack748, stack752, stack756, stack760,
-	stack764, stack768, stack772, stack776, stack780, stack784,
-	stack788, stack792, stack796, stack800, stack804, stack808,
-	stack812, stack816, stack820, stack824, stack828, stack832,
-	stack836, stack840, stack844, stack848, stack852, stack856,
-	stack860, stack864, stack868, stack872, stack876, stack880,
-	stack884, stack888, stack892, stack896, stack900, stack904,
-	stack908, stack912, stack916, stack920, stack924, stack928,
-	stack932, stack936, stack940, stack944, stack948, stack952,
-	stack956, stack960, stack964, stack968, stack972, stack976,
-	stack980, stack984, stack988, stack992, stack996, stack1000,
-	stack1004, stack1008, stack1012, stack1016, stack1020, stack1024,
-	stack1028, stack1032, stack1036, stack1040, stack1044, stack1048,
-	stack1052, stack1056, stack1060, stack1064, stack1068, stack1072,
-	stack1076, stack1080, stack1084, stack1088, stack1092, stack1096,
-	stack1100, stack1104, stack1108, stack1112, stack1116, stack1120,
-	stack1124, stack1128, stack1132, stack1136, stack1140, stack1144,
-	stack1148, stack1152, stack1156, stack1160, stack1164, stack1168,
-	stack1172, stack1176, stack1180, stack1184, stack1188, stack1192,
-	stack1196, stack1200, stack1204, stack1208, stack1212, stack1216,
-	stack1220, stack1224, stack1228, stack1232, stack1236, stack1240,
-	stack1244, stack1248, stack1252, stack1256, stack1260, stack1264,
-	stack1268, stack1272, stack1276, stack1280, stack1284, stack1288,
-	stack1292, stack1296, stack1300, stack1304, stack1308, stack1312,
-	stack1316, stack1320, stack1324, stack1328, stack1332, stack1336,
-	stack1340, stack1344, stack1348, stack1352, stack1356, stack1360,
-	stack1364, stack1368, stack1372, stack1376, stack1380, stack1384,
-	stack1388, stack1392, stack1396, stack1400, stack1404, stack1408,
-	stack1412, stack1416, stack1420, stack1424, stack1428, stack1432,
-	stack1436, stack1440, stack1444, stack1448, stack1452, stack1456,
-	stack1460, stack1464, stack1468, stack1472, stack1476, stack1480,
-	stack1484, stack1488, stack1492, stack1496, stack1500, stack1504,
-	stack1508, stack1512, stack1516, stack1520, stack1524, stack1528,
-	stack1532, stack1536, stack1540, stack1544, stack1548, stack1552,
-	stack1556, stack1560, stack1564, stack1568, stack1572, stack1576,
-	stack1580, stack1584, stack1588, stack1592, stack1596, stack1600,
-	stack1604, stack1608, stack1612, stack1616, stack1620, stack1624,
-	stack1628, stack1632, stack1636, stack1640, stack1644, stack1648,
-	stack1652, stack1656, stack1660, stack1664, stack1668, stack1672,
-	stack1676, stack1680, stack1684, stack1688, stack1692, stack1696,
-	stack1700, stack1704, stack1708, stack1712, stack1716, stack1720,
-	stack1724, stack1728, stack1732, stack1736, stack1740, stack1744,
-	stack1748, stack1752, stack1756, stack1760, stack1764, stack1768,
-	stack1772, stack1776, stack1780, stack1784, stack1788, stack1792,
-	stack1796, stack1800, stack1804, stack1808, stack1812, stack1816,
-	stack1820, stack1824, stack1828, stack1832, stack1836, stack1840,
-	stack1844, stack1848, stack1852, stack1856, stack1860, stack1864,
-	stack1868, stack1872, stack1876, stack1880, stack1884, stack1888,
-	stack1892, stack1896, stack1900, stack1904, stack1908, stack1912,
-	stack1916, stack1920, stack1924, stack1928, stack1932, stack1936,
-	stack1940, stack1944, stack1948, stack1952, stack1956, stack1960,
-	stack1964, stack1968, stack1972, stack1976, stack1980, stack1984,
-	stack1988, stack1992, stack1996, stack2000, stack2004, stack2008,
-	stack2012, stack2016, stack2020, stack2024, stack2028, stack2032,
-	stack2036, stack2040, stack2044, stack2048, stack2052, stack2056,
-	stack2060, stack2064, stack2068, stack2072, stack2076, stack2080,
-	stack2084, stack2088, stack2092, stack2096, stack2100, stack2104,
-	stack2108, stack2112, stack2116, stack2120, stack2124, stack2128,
-	stack2132, stack2136, stack2140, stack2144, stack2148, stack2152,
-	stack2156, stack2160, stack2164, stack2168, stack2172, stack2176,
-	stack2180, stack2184, stack2188, stack2192, stack2196, stack2200,
-	stack2204, stack2208, stack2212, stack2216, stack2220, stack2224,
-	stack2228, stack2232, stack2236, stack2240, stack2244, stack2248,
-	stack2252, stack2256, stack2260, stack2264, stack2268, stack2272,
-	stack2276, stack2280, stack2284, stack2288, stack2292, stack2296,
-	stack2300, stack2304, stack2308, stack2312, stack2316, stack2320,
-	stack2324, stack2328, stack2332, stack2336, stack2340, stack2344,
-	stack2348, stack2352, stack2356, stack2360, stack2364, stack2368,
-	stack2372, stack2376, stack2380, stack2384, stack2388, stack2392,
-	stack2396, stack2400, stack2404, stack2408, stack2412, stack2416,
-	stack2420, stack2424, stack2428, stack2432, stack2436, stack2440,
-	stack2444, stack2448, stack2452, stack2456, stack2460, stack2464,
-	stack2468, stack2472, stack2476, stack2480, stack2484, stack2488,
-	stack2492, stack2496, stack2500, stack2504, stack2508, stack2512,
-	stack2516, stack2520, stack2524, stack2528, stack2532, stack2536,
-	stack2540, stack2544, stack2548, stack2552, stack2556, stack2560,
-	stack2564, stack2568, stack2572, stack2576, stack2580, stack2584,
-	stack2588, stack2592, stack2596, stack2600, stack2604, stack2608,
-	stack2612, stack2616, stack2620, stack2624, stack2628, stack2632,
-	stack2636, stack2640, stack2644, stack2648, stack2652, stack2656,
-	stack2660, stack2664, stack2668, stack2672, stack2676, stack2680,
-	stack2684, stack2688, stack2692, stack2696, stack2700, stack2704,
-	stack2708, stack2712, stack2716, stack2720, stack2724, stack2728,
-	stack2732, stack2736, stack2740, stack2744, stack2748, stack2752,
-	stack2756, stack2760, stack2764, stack2768, stack2772, stack2776,
-	stack2780, stack2784, stack2788, stack2792, stack2796, stack2800,
-	stack2804, stack2808, stack2812, stack2816, stack2820, stack2824,
-	stack2828, stack2832, stack2836, stack2840, stack2844, stack2848,
-	stack2852, stack2856, stack2860, stack2864, stack2868, stack2872,
-	stack2876, stack2880, stack2884, stack2888, stack2892, stack2896,
-	stack2900, stack2904, stack2908, stack2912, stack2916, stack2920,
-	stack2924, stack2928, stack2932, stack2936, stack2940, stack2944,
-	stack2948, stack2952, stack2956, stack2960, stack2964, stack2968,
-	stack2972, stack2976, stack2980, stack2984, stack2988, stack2992,
-	stack2996, stack3000, stack3004, stack3008, stack3012, stack3016,
-	stack3020, stack3024, stack3028, stack3032, stack3036, stack3040,
-	stack3044, stack3048, stack3052, stack3056, stack3060, stack3064,
-	stack3068, stack3072, stack3076, stack3080, stack3084, stack3088,
-	stack3092, stack3096, stack3100, stack3104, stack3108, stack3112,
-	stack3116, stack3120, stack3124, stack3128, stack3132, stack3136,
-	stack3140, stack3144, stack3148, stack3152, stack3156, stack3160,
-	stack3164, stack3168, stack3172, stack3176, stack3180, stack3184,
-	stack3188, stack3192, stack3196, stack3200, stack3204, stack3208,
-	stack3212, stack3216, stack3220, stack3224, stack3228, stack3232,
-	stack3236, stack3240, stack3244, stack3248, stack3252, stack3256,
-	stack3260, stack3264, stack3268, stack3272, stack3276, stack3280,
-	stack3284, stack3288, stack3292, stack3296, stack3300, stack3304,
-	stack3308, stack3312, stack3316, stack3320, stack3324, stack3328,
-	stack3332, stack3336, stack3340, stack3344, stack3348, stack3352,
-	stack3356, stack3360, stack3364, stack3368, stack3372, stack3376,
-	stack3380, stack3384, stack3388, stack3392, stack3396, stack3400,
-	stack3404, stack3408, stack3412, stack3416, stack3420, stack3424,
-	stack3428, stack3432, stack3436, stack3440, stack3444, stack3448,
-	stack3452, stack3456, stack3460, stack3464, stack3468, stack3472,
-	stack3476, stack3480, stack3484, stack3488, stack3492, stack3496,
-	stack3500, stack3504, stack3508, stack3512, stack3516, stack3520,
-	stack3524, stack3528, stack3532, stack3536, stack3540, stack3544,
-	stack3548, stack3552, stack3556, stack3560, stack3564, stack3568,
-	stack3572, stack3576, stack3580, stack3584, stack3588, stack3592,
-	stack3596, stack3600, stack3604, stack3608, stack3612, stack3616,
-	stack3620, stack3624, stack3628, stack3632, stack3636, stack3640,
-	stack3644, stack3648, stack3652, stack3656, stack3660, stack3664,
-	stack3668, stack3672, stack3676, stack3680, stack3684, stack3688,
-	stack3692, stack3696, stack3700, stack3704, stack3708, stack3712,
-	stack3716, stack3720, stack3724, stack3728, stack3732, stack3736,
-	stack3740, stack3744, stack3748, stack3752, stack3756, stack3760,
-	stack3764, stack3768, stack3772, stack3776, stack3780, stack3784,
-	stack3788, stack3792, stack3796, stack3800, stack3804, stack3808,
-	stack3812, stack3816, stack3820, stack3824, stack3828, stack3832,
-	stack3836, stack3840, stack3844, stack3848, stack3852, stack3856,
-	stack3860, stack3864, stack3868, stack3872, stack3876, stack3880,
-	stack3884, stack3888, stack3892, stack3896, stack3900, stack3904,
-	stack3908, stack3912, stack3916, stack3920, stack3924, stack3928,
-	stack3932, stack3936, stack3940, stack3944, stack3948, stack3952,
-	stack3956, stack3960, stack3964, stack3968, stack3972, stack3976,
-	stack3980, stack3984, stack3988, stack3992, stack3996, stack4000,
-	stack4004, stack4008, stack4012, stack4016, stack4020, stack4024,
-	stack4028, stack4032, stack4036, stack4040, stack4044, stack4048,
-	stack4052, stack4056, stack4060, stack4064, stack4068, stack4072,
-	stack4076, stack4080, stack4084, stack4088, stack4092, stack4096,
-	stack4100, stack4104, stack4108, stack4112, stack4116, stack4120,
-	stack4124, stack4128, stack4132, stack4136, stack4140, stack4144,
-	stack4148, stack4152, stack4156, stack4160, stack4164, stack4168,
-	stack4172, stack4176, stack4180, stack4184, stack4188, stack4192,
-	stack4196, stack4200, stack4204, stack4208, stack4212, stack4216,
-	stack4220, stack4224, stack4228, stack4232, stack4236, stack4240,
-	stack4244, stack4248, stack4252, stack4256, stack4260, stack4264,
-	stack4268, stack4272, stack4276, stack4280, stack4284, stack4288,
-	stack4292, stack4296, stack4300, stack4304, stack4308, stack4312,
-	stack4316, stack4320, stack4324, stack4328, stack4332, stack4336,
-	stack4340, stack4344, stack4348, stack4352, stack4356, stack4360,
-	stack4364, stack4368, stack4372, stack4376, stack4380, stack4384,
-	stack4388, stack4392, stack4396, stack4400, stack4404, stack4408,
-	stack4412, stack4416, stack4420, stack4424, stack4428, stack4432,
-	stack4436, stack4440, stack4444, stack4448, stack4452, stack4456,
-	stack4460, stack4464, stack4468, stack4472, stack4476, stack4480,
-	stack4484, stack4488, stack4492, stack4496, stack4500, stack4504,
-	stack4508, stack4512, stack4516, stack4520, stack4524, stack4528,
-	stack4532, stack4536, stack4540, stack4544, stack4548, stack4552,
-	stack4556, stack4560, stack4564, stack4568, stack4572, stack4576,
-	stack4580, stack4584, stack4588, stack4592, stack4596, stack4600,
-	stack4604, stack4608, stack4612, stack4616, stack4620, stack4624,
-	stack4628, stack4632, stack4636, stack4640, stack4644, stack4648,
-	stack4652, stack4656, stack4660, stack4664, stack4668, stack4672,
-	stack4676, stack4680, stack4684, stack4688, stack4692, stack4696,
-	stack4700, stack4704, stack4708, stack4712, stack4716, stack4720,
-	stack4724, stack4728, stack4732, stack4736, stack4740, stack4744,
-	stack4748, stack4752, stack4756, stack4760, stack4764, stack4768,
-	stack4772, stack4776, stack4780, stack4784, stack4788, stack4792,
-	stack4796, stack4800, stack4804, stack4808, stack4812, stack4816,
-	stack4820, stack4824, stack4828, stack4832, stack4836, stack4840,
-	stack4844, stack4848, stack4852, stack4856, stack4860, stack4864,
-	stack4868, stack4872, stack4876, stack4880, stack4884, stack4888,
-	stack4892, stack4896, stack4900, stack4904, stack4908, stack4912,
-	stack4916, stack4920, stack4924, stack4928, stack4932, stack4936,
-	stack4940, stack4944, stack4948, stack4952, stack4956, stack4960,
-	stack4964, stack4968, stack4972, stack4976, stack4980, stack4984,
-	stack4988, stack4992, stack4996, stack5000,
-}
-
-// Edit .+1,$ | seq 4 4 5000 | sed 's/.*/func stack&() { var buf [&]byte; use(buf[:]); C.callGoStackCheck() }/'
-func stack4()    { var buf [4]byte; use(buf[:]); C.callGoStackCheck() }
-func stack8()    { var buf [8]byte; use(buf[:]); C.callGoStackCheck() }
-func stack12()   { var buf [12]byte; use(buf[:]); C.callGoStackCheck() }
-func stack16()   { var buf [16]byte; use(buf[:]); C.callGoStackCheck() }
-func stack20()   { var buf [20]byte; use(buf[:]); C.callGoStackCheck() }
-func stack24()   { var buf [24]byte; use(buf[:]); C.callGoStackCheck() }
-func stack28()   { var buf [28]byte; use(buf[:]); C.callGoStackCheck() }
-func stack32()   { var buf [32]byte; use(buf[:]); C.callGoStackCheck() }
-func stack36()   { var buf [36]byte; use(buf[:]); C.callGoStackCheck() }
-func stack40()   { var buf [40]byte; use(buf[:]); C.callGoStackCheck() }
-func stack44()   { var buf [44]byte; use(buf[:]); C.callGoStackCheck() }
-func stack48()   { var buf [48]byte; use(buf[:]); C.callGoStackCheck() }
-func stack52()   { var buf [52]byte; use(buf[:]); C.callGoStackCheck() }
-func stack56()   { var buf [56]byte; use(buf[:]); C.callGoStackCheck() }
-func stack60()   { var buf [60]byte; use(buf[:]); C.callGoStackCheck() }
-func stack64()   { var buf [64]byte; use(buf[:]); C.callGoStackCheck() }
-func stack68()   { var buf [68]byte; use(buf[:]); C.callGoStackCheck() }
-func stack72()   { var buf [72]byte; use(buf[:]); C.callGoStackCheck() }
-func stack76()   { var buf [76]byte; use(buf[:]); C.callGoStackCheck() }
-func stack80()   { var buf [80]byte; use(buf[:]); C.callGoStackCheck() }
-func stack84()   { var buf [84]byte; use(buf[:]); C.callGoStackCheck() }
-func stack88()   { var buf [88]byte; use(buf[:]); C.callGoStackCheck() }
-func stack92()   { var buf [92]byte; use(buf[:]); C.callGoStackCheck() }
-func stack96()   { var buf [96]byte; use(buf[:]); C.callGoStackCheck() }
-func stack100()  { var buf [100]byte; use(buf[:]); C.callGoStackCheck() }
-func stack104()  { var buf [104]byte; use(buf[:]); C.callGoStackCheck() }
-func stack108()  { var buf [108]byte; use(buf[:]); C.callGoStackCheck() }
-func stack112()  { var buf [112]byte; use(buf[:]); C.callGoStackCheck() }
-func stack116()  { var buf [116]byte; use(buf[:]); C.callGoStackCheck() }
-func stack120()  { var buf [120]byte; use(buf[:]); C.callGoStackCheck() }
-func stack124()  { var buf [124]byte; use(buf[:]); C.callGoStackCheck() }
-func stack128()  { var buf [128]byte; use(buf[:]); C.callGoStackCheck() }
-func stack132()  { var buf [132]byte; use(buf[:]); C.callGoStackCheck() }
-func stack136()  { var buf [136]byte; use(buf[:]); C.callGoStackCheck() }
-func stack140()  { var buf [140]byte; use(buf[:]); C.callGoStackCheck() }
-func stack144()  { var buf [144]byte; use(buf[:]); C.callGoStackCheck() }
-func stack148()  { var buf [148]byte; use(buf[:]); C.callGoStackCheck() }
-func stack152()  { var buf [152]byte; use(buf[:]); C.callGoStackCheck() }
-func stack156()  { var buf [156]byte; use(buf[:]); C.callGoStackCheck() }
-func stack160()  { var buf [160]byte; use(buf[:]); C.callGoStackCheck() }
-func stack164()  { var buf [164]byte; use(buf[:]); C.callGoStackCheck() }
-func stack168()  { var buf [168]byte; use(buf[:]); C.callGoStackCheck() }
-func stack172()  { var buf [172]byte; use(buf[:]); C.callGoStackCheck() }
-func stack176()  { var buf [176]byte; use(buf[:]); C.callGoStackCheck() }
-func stack180()  { var buf [180]byte; use(buf[:]); C.callGoStackCheck() }
-func stack184()  { var buf [184]byte; use(buf[:]); C.callGoStackCheck() }
-func stack188()  { var buf [188]byte; use(buf[:]); C.callGoStackCheck() }
-func stack192()  { var buf [192]byte; use(buf[:]); C.callGoStackCheck() }
-func stack196()  { var buf [196]byte; use(buf[:]); C.callGoStackCheck() }
-func stack200()  { var buf [200]byte; use(buf[:]); C.callGoStackCheck() }
-func stack204()  { var buf [204]byte; use(buf[:]); C.callGoStackCheck() }
-func stack208()  { var buf [208]byte; use(buf[:]); C.callGoStackCheck() }
-func stack212()  { var buf [212]byte; use(buf[:]); C.callGoStackCheck() }
-func stack216()  { var buf [216]byte; use(buf[:]); C.callGoStackCheck() }
-func stack220()  { var buf [220]byte; use(buf[:]); C.callGoStackCheck() }
-func stack224()  { var buf [224]byte; use(buf[:]); C.callGoStackCheck() }
-func stack228()  { var buf [228]byte; use(buf[:]); C.callGoStackCheck() }
-func stack232()  { var buf [232]byte; use(buf[:]); C.callGoStackCheck() }
-func stack236()  { var buf [236]byte; use(buf[:]); C.callGoStackCheck() }
-func stack240()  { var buf [240]byte; use(buf[:]); C.callGoStackCheck() }
-func stack244()  { var buf [244]byte; use(buf[:]); C.callGoStackCheck() }
-func stack248()  { var buf [248]byte; use(buf[:]); C.callGoStackCheck() }
-func stack252()  { var buf [252]byte; use(buf[:]); C.callGoStackCheck() }
-func stack256()  { var buf [256]byte; use(buf[:]); C.callGoStackCheck() }
-func stack260()  { var buf [260]byte; use(buf[:]); C.callGoStackCheck() }
-func stack264()  { var buf [264]byte; use(buf[:]); C.callGoStackCheck() }
-func stack268()  { var buf [268]byte; use(buf[:]); C.callGoStackCheck() }
-func stack272()  { var buf [272]byte; use(buf[:]); C.callGoStackCheck() }
-func stack276()  { var buf [276]byte; use(buf[:]); C.callGoStackCheck() }
-func stack280()  { var buf [280]byte; use(buf[:]); C.callGoStackCheck() }
-func stack284()  { var buf [284]byte; use(buf[:]); C.callGoStackCheck() }
-func stack288()  { var buf [288]byte; use(buf[:]); C.callGoStackCheck() }
-func stack292()  { var buf [292]byte; use(buf[:]); C.callGoStackCheck() }
-func stack296()  { var buf [296]byte; use(buf[:]); C.callGoStackCheck() }
-func stack300()  { var buf [300]byte; use(buf[:]); C.callGoStackCheck() }
-func stack304()  { var buf [304]byte; use(buf[:]); C.callGoStackCheck() }
-func stack308()  { var buf [308]byte; use(buf[:]); C.callGoStackCheck() }
-func stack312()  { var buf [312]byte; use(buf[:]); C.callGoStackCheck() }
-func stack316()  { var buf [316]byte; use(buf[:]); C.callGoStackCheck() }
-func stack320()  { var buf [320]byte; use(buf[:]); C.callGoStackCheck() }
-func stack324()  { var buf [324]byte; use(buf[:]); C.callGoStackCheck() }
-func stack328()  { var buf [328]byte; use(buf[:]); C.callGoStackCheck() }
-func stack332()  { var buf [332]byte; use(buf[:]); C.callGoStackCheck() }
-func stack336()  { var buf [336]byte; use(buf[:]); C.callGoStackCheck() }
-func stack340()  { var buf [340]byte; use(buf[:]); C.callGoStackCheck() }
-func stack344()  { var buf [344]byte; use(buf[:]); C.callGoStackCheck() }
-func stack348()  { var buf [348]byte; use(buf[:]); C.callGoStackCheck() }
-func stack352()  { var buf [352]byte; use(buf[:]); C.callGoStackCheck() }
-func stack356()  { var buf [356]byte; use(buf[:]); C.callGoStackCheck() }
-func stack360()  { var buf [360]byte; use(buf[:]); C.callGoStackCheck() }
-func stack364()  { var buf [364]byte; use(buf[:]); C.callGoStackCheck() }
-func stack368()  { var buf [368]byte; use(buf[:]); C.callGoStackCheck() }
-func stack372()  { var buf [372]byte; use(buf[:]); C.callGoStackCheck() }
-func stack376()  { var buf [376]byte; use(buf[:]); C.callGoStackCheck() }
-func stack380()  { var buf [380]byte; use(buf[:]); C.callGoStackCheck() }
-func stack384()  { var buf [384]byte; use(buf[:]); C.callGoStackCheck() }
-func stack388()  { var buf [388]byte; use(buf[:]); C.callGoStackCheck() }
-func stack392()  { var buf [392]byte; use(buf[:]); C.callGoStackCheck() }
-func stack396()  { var buf [396]byte; use(buf[:]); C.callGoStackCheck() }
-func stack400()  { var buf [400]byte; use(buf[:]); C.callGoStackCheck() }
-func stack404()  { var buf [404]byte; use(buf[:]); C.callGoStackCheck() }
-func stack408()  { var buf [408]byte; use(buf[:]); C.callGoStackCheck() }
-func stack412()  { var buf [412]byte; use(buf[:]); C.callGoStackCheck() }
-func stack416()  { var buf [416]byte; use(buf[:]); C.callGoStackCheck() }
-func stack420()  { var buf [420]byte; use(buf[:]); C.callGoStackCheck() }
-func stack424()  { var buf [424]byte; use(buf[:]); C.callGoStackCheck() }
-func stack428()  { var buf [428]byte; use(buf[:]); C.callGoStackCheck() }
-func stack432()  { var buf [432]byte; use(buf[:]); C.callGoStackCheck() }
-func stack436()  { var buf [436]byte; use(buf[:]); C.callGoStackCheck() }
-func stack440()  { var buf [440]byte; use(buf[:]); C.callGoStackCheck() }
-func stack444()  { var buf [444]byte; use(buf[:]); C.callGoStackCheck() }
-func stack448()  { var buf [448]byte; use(buf[:]); C.callGoStackCheck() }
-func stack452()  { var buf [452]byte; use(buf[:]); C.callGoStackCheck() }
-func stack456()  { var buf [456]byte; use(buf[:]); C.callGoStackCheck() }
-func stack460()  { var buf [460]byte; use(buf[:]); C.callGoStackCheck() }
-func stack464()  { var buf [464]byte; use(buf[:]); C.callGoStackCheck() }
-func stack468()  { var buf [468]byte; use(buf[:]); C.callGoStackCheck() }
-func stack472()  { var buf [472]byte; use(buf[:]); C.callGoStackCheck() }
-func stack476()  { var buf [476]byte; use(buf[:]); C.callGoStackCheck() }
-func stack480()  { var buf [480]byte; use(buf[:]); C.callGoStackCheck() }
-func stack484()  { var buf [484]byte; use(buf[:]); C.callGoStackCheck() }
-func stack488()  { var buf [488]byte; use(buf[:]); C.callGoStackCheck() }
-func stack492()  { var buf [492]byte; use(buf[:]); C.callGoStackCheck() }
-func stack496()  { var buf [496]byte; use(buf[:]); C.callGoStackCheck() }
-func stack500()  { var buf [500]byte; use(buf[:]); C.callGoStackCheck() }
-func stack504()  { var buf [504]byte; use(buf[:]); C.callGoStackCheck() }
-func stack508()  { var buf [508]byte; use(buf[:]); C.callGoStackCheck() }
-func stack512()  { var buf [512]byte; use(buf[:]); C.callGoStackCheck() }
-func stack516()  { var buf [516]byte; use(buf[:]); C.callGoStackCheck() }
-func stack520()  { var buf [520]byte; use(buf[:]); C.callGoStackCheck() }
-func stack524()  { var buf [524]byte; use(buf[:]); C.callGoStackCheck() }
-func stack528()  { var buf [528]byte; use(buf[:]); C.callGoStackCheck() }
-func stack532()  { var buf [532]byte; use(buf[:]); C.callGoStackCheck() }
-func stack536()  { var buf [536]byte; use(buf[:]); C.callGoStackCheck() }
-func stack540()  { var buf [540]byte; use(buf[:]); C.callGoStackCheck() }
-func stack544()  { var buf [544]byte; use(buf[:]); C.callGoStackCheck() }
-func stack548()  { var buf [548]byte; use(buf[:]); C.callGoStackCheck() }
-func stack552()  { var buf [552]byte; use(buf[:]); C.callGoStackCheck() }
-func stack556()  { var buf [556]byte; use(buf[:]); C.callGoStackCheck() }
-func stack560()  { var buf [560]byte; use(buf[:]); C.callGoStackCheck() }
-func stack564()  { var buf [564]byte; use(buf[:]); C.callGoStackCheck() }
-func stack568()  { var buf [568]byte; use(buf[:]); C.callGoStackCheck() }
-func stack572()  { var buf [572]byte; use(buf[:]); C.callGoStackCheck() }
-func stack576()  { var buf [576]byte; use(buf[:]); C.callGoStackCheck() }
-func stack580()  { var buf [580]byte; use(buf[:]); C.callGoStackCheck() }
-func stack584()  { var buf [584]byte; use(buf[:]); C.callGoStackCheck() }
-func stack588()  { var buf [588]byte; use(buf[:]); C.callGoStackCheck() }
-func stack592()  { var buf [592]byte; use(buf[:]); C.callGoStackCheck() }
-func stack596()  { var buf [596]byte; use(buf[:]); C.callGoStackCheck() }
-func stack600()  { var buf [600]byte; use(buf[:]); C.callGoStackCheck() }
-func stack604()  { var buf [604]byte; use(buf[:]); C.callGoStackCheck() }
-func stack608()  { var buf [608]byte; use(buf[:]); C.callGoStackCheck() }
-func stack612()  { var buf [612]byte; use(buf[:]); C.callGoStackCheck() }
-func stack616()  { var buf [616]byte; use(buf[:]); C.callGoStackCheck() }
-func stack620()  { var buf [620]byte; use(buf[:]); C.callGoStackCheck() }
-func stack624()  { var buf [624]byte; use(buf[:]); C.callGoStackCheck() }
-func stack628()  { var buf [628]byte; use(buf[:]); C.callGoStackCheck() }
-func stack632()  { var buf [632]byte; use(buf[:]); C.callGoStackCheck() }
-func stack636()  { var buf [636]byte; use(buf[:]); C.callGoStackCheck() }
-func stack640()  { var buf [640]byte; use(buf[:]); C.callGoStackCheck() }
-func stack644()  { var buf [644]byte; use(buf[:]); C.callGoStackCheck() }
-func stack648()  { var buf [648]byte; use(buf[:]); C.callGoStackCheck() }
-func stack652()  { var buf [652]byte; use(buf[:]); C.callGoStackCheck() }
-func stack656()  { var buf [656]byte; use(buf[:]); C.callGoStackCheck() }
-func stack660()  { var buf [660]byte; use(buf[:]); C.callGoStackCheck() }
-func stack664()  { var buf [664]byte; use(buf[:]); C.callGoStackCheck() }
-func stack668()  { var buf [668]byte; use(buf[:]); C.callGoStackCheck() }
-func stack672()  { var buf [672]byte; use(buf[:]); C.callGoStackCheck() }
-func stack676()  { var buf [676]byte; use(buf[:]); C.callGoStackCheck() }
-func stack680()  { var buf [680]byte; use(buf[:]); C.callGoStackCheck() }
-func stack684()  { var buf [684]byte; use(buf[:]); C.callGoStackCheck() }
-func stack688()  { var buf [688]byte; use(buf[:]); C.callGoStackCheck() }
-func stack692()  { var buf [692]byte; use(buf[:]); C.callGoStackCheck() }
-func stack696()  { var buf [696]byte; use(buf[:]); C.callGoStackCheck() }
-func stack700()  { var buf [700]byte; use(buf[:]); C.callGoStackCheck() }
-func stack704()  { var buf [704]byte; use(buf[:]); C.callGoStackCheck() }
-func stack708()  { var buf [708]byte; use(buf[:]); C.callGoStackCheck() }
-func stack712()  { var buf [712]byte; use(buf[:]); C.callGoStackCheck() }
-func stack716()  { var buf [716]byte; use(buf[:]); C.callGoStackCheck() }
-func stack720()  { var buf [720]byte; use(buf[:]); C.callGoStackCheck() }
-func stack724()  { var buf [724]byte; use(buf[:]); C.callGoStackCheck() }
-func stack728()  { var buf [728]byte; use(buf[:]); C.callGoStackCheck() }
-func stack732()  { var buf [732]byte; use(buf[:]); C.callGoStackCheck() }
-func stack736()  { var buf [736]byte; use(buf[:]); C.callGoStackCheck() }
-func stack740()  { var buf [740]byte; use(buf[:]); C.callGoStackCheck() }
-func stack744()  { var buf [744]byte; use(buf[:]); C.callGoStackCheck() }
-func stack748()  { var buf [748]byte; use(buf[:]); C.callGoStackCheck() }
-func stack752()  { var buf [752]byte; use(buf[:]); C.callGoStackCheck() }
-func stack756()  { var buf [756]byte; use(buf[:]); C.callGoStackCheck() }
-func stack760()  { var buf [760]byte; use(buf[:]); C.callGoStackCheck() }
-func stack764()  { var buf [764]byte; use(buf[:]); C.callGoStackCheck() }
-func stack768()  { var buf [768]byte; use(buf[:]); C.callGoStackCheck() }
-func stack772()  { var buf [772]byte; use(buf[:]); C.callGoStackCheck() }
-func stack776()  { var buf [776]byte; use(buf[:]); C.callGoStackCheck() }
-func stack780()  { var buf [780]byte; use(buf[:]); C.callGoStackCheck() }
-func stack784()  { var buf [784]byte; use(buf[:]); C.callGoStackCheck() }
-func stack788()  { var buf [788]byte; use(buf[:]); C.callGoStackCheck() }
-func stack792()  { var buf [792]byte; use(buf[:]); C.callGoStackCheck() }
-func stack796()  { var buf [796]byte; use(buf[:]); C.callGoStackCheck() }
-func stack800()  { var buf [800]byte; use(buf[:]); C.callGoStackCheck() }
-func stack804()  { var buf [804]byte; use(buf[:]); C.callGoStackCheck() }
-func stack808()  { var buf [808]byte; use(buf[:]); C.callGoStackCheck() }
-func stack812()  { var buf [812]byte; use(buf[:]); C.callGoStackCheck() }
-func stack816()  { var buf [816]byte; use(buf[:]); C.callGoStackCheck() }
-func stack820()  { var buf [820]byte; use(buf[:]); C.callGoStackCheck() }
-func stack824()  { var buf [824]byte; use(buf[:]); C.callGoStackCheck() }
-func stack828()  { var buf [828]byte; use(buf[:]); C.callGoStackCheck() }
-func stack832()  { var buf [832]byte; use(buf[:]); C.callGoStackCheck() }
-func stack836()  { var buf [836]byte; use(buf[:]); C.callGoStackCheck() }
-func stack840()  { var buf [840]byte; use(buf[:]); C.callGoStackCheck() }
-func stack844()  { var buf [844]byte; use(buf[:]); C.callGoStackCheck() }
-func stack848()  { var buf [848]byte; use(buf[:]); C.callGoStackCheck() }
-func stack852()  { var buf [852]byte; use(buf[:]); C.callGoStackCheck() }
-func stack856()  { var buf [856]byte; use(buf[:]); C.callGoStackCheck() }
-func stack860()  { var buf [860]byte; use(buf[:]); C.callGoStackCheck() }
-func stack864()  { var buf [864]byte; use(buf[:]); C.callGoStackCheck() }
-func stack868()  { var buf [868]byte; use(buf[:]); C.callGoStackCheck() }
-func stack872()  { var buf [872]byte; use(buf[:]); C.callGoStackCheck() }
-func stack876()  { var buf [876]byte; use(buf[:]); C.callGoStackCheck() }
-func stack880()  { var buf [880]byte; use(buf[:]); C.callGoStackCheck() }
-func stack884()  { var buf [884]byte; use(buf[:]); C.callGoStackCheck() }
-func stack888()  { var buf [888]byte; use(buf[:]); C.callGoStackCheck() }
-func stack892()  { var buf [892]byte; use(buf[:]); C.callGoStackCheck() }
-func stack896()  { var buf [896]byte; use(buf[:]); C.callGoStackCheck() }
-func stack900()  { var buf [900]byte; use(buf[:]); C.callGoStackCheck() }
-func stack904()  { var buf [904]byte; use(buf[:]); C.callGoStackCheck() }
-func stack908()  { var buf [908]byte; use(buf[:]); C.callGoStackCheck() }
-func stack912()  { var buf [912]byte; use(buf[:]); C.callGoStackCheck() }
-func stack916()  { var buf [916]byte; use(buf[:]); C.callGoStackCheck() }
-func stack920()  { var buf [920]byte; use(buf[:]); C.callGoStackCheck() }
-func stack924()  { var buf [924]byte; use(buf[:]); C.callGoStackCheck() }
-func stack928()  { var buf [928]byte; use(buf[:]); C.callGoStackCheck() }
-func stack932()  { var buf [932]byte; use(buf[:]); C.callGoStackCheck() }
-func stack936()  { var buf [936]byte; use(buf[:]); C.callGoStackCheck() }
-func stack940()  { var buf [940]byte; use(buf[:]); C.callGoStackCheck() }
-func stack944()  { var buf [944]byte; use(buf[:]); C.callGoStackCheck() }
-func stack948()  { var buf [948]byte; use(buf[:]); C.callGoStackCheck() }
-func stack952()  { var buf [952]byte; use(buf[:]); C.callGoStackCheck() }
-func stack956()  { var buf [956]byte; use(buf[:]); C.callGoStackCheck() }
-func stack960()  { var buf [960]byte; use(buf[:]); C.callGoStackCheck() }
-func stack964()  { var buf [964]byte; use(buf[:]); C.callGoStackCheck() }
-func stack968()  { var buf [968]byte; use(buf[:]); C.callGoStackCheck() }
-func stack972()  { var buf [972]byte; use(buf[:]); C.callGoStackCheck() }
-func stack976()  { var buf [976]byte; use(buf[:]); C.callGoStackCheck() }
-func stack980()  { var buf [980]byte; use(buf[:]); C.callGoStackCheck() }
-func stack984()  { var buf [984]byte; use(buf[:]); C.callGoStackCheck() }
-func stack988()  { var buf [988]byte; use(buf[:]); C.callGoStackCheck() }
-func stack992()  { var buf [992]byte; use(buf[:]); C.callGoStackCheck() }
-func stack996()  { var buf [996]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1000() { var buf [1000]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1004() { var buf [1004]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1008() { var buf [1008]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1012() { var buf [1012]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1016() { var buf [1016]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1020() { var buf [1020]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1024() { var buf [1024]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1028() { var buf [1028]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1032() { var buf [1032]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1036() { var buf [1036]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1040() { var buf [1040]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1044() { var buf [1044]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1048() { var buf [1048]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1052() { var buf [1052]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1056() { var buf [1056]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1060() { var buf [1060]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1064() { var buf [1064]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1068() { var buf [1068]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1072() { var buf [1072]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1076() { var buf [1076]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1080() { var buf [1080]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1084() { var buf [1084]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1088() { var buf [1088]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1092() { var buf [1092]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1096() { var buf [1096]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1100() { var buf [1100]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1104() { var buf [1104]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1108() { var buf [1108]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1112() { var buf [1112]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1116() { var buf [1116]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1120() { var buf [1120]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1124() { var buf [1124]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1128() { var buf [1128]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1132() { var buf [1132]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1136() { var buf [1136]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1140() { var buf [1140]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1144() { var buf [1144]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1148() { var buf [1148]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1152() { var buf [1152]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1156() { var buf [1156]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1160() { var buf [1160]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1164() { var buf [1164]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1168() { var buf [1168]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1172() { var buf [1172]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1176() { var buf [1176]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1180() { var buf [1180]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1184() { var buf [1184]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1188() { var buf [1188]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1192() { var buf [1192]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1196() { var buf [1196]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1200() { var buf [1200]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1204() { var buf [1204]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1208() { var buf [1208]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1212() { var buf [1212]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1216() { var buf [1216]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1220() { var buf [1220]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1224() { var buf [1224]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1228() { var buf [1228]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1232() { var buf [1232]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1236() { var buf [1236]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1240() { var buf [1240]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1244() { var buf [1244]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1248() { var buf [1248]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1252() { var buf [1252]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1256() { var buf [1256]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1260() { var buf [1260]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1264() { var buf [1264]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1268() { var buf [1268]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1272() { var buf [1272]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1276() { var buf [1276]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1280() { var buf [1280]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1284() { var buf [1284]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1288() { var buf [1288]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1292() { var buf [1292]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1296() { var buf [1296]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1300() { var buf [1300]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1304() { var buf [1304]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1308() { var buf [1308]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1312() { var buf [1312]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1316() { var buf [1316]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1320() { var buf [1320]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1324() { var buf [1324]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1328() { var buf [1328]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1332() { var buf [1332]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1336() { var buf [1336]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1340() { var buf [1340]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1344() { var buf [1344]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1348() { var buf [1348]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1352() { var buf [1352]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1356() { var buf [1356]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1360() { var buf [1360]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1364() { var buf [1364]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1368() { var buf [1368]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1372() { var buf [1372]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1376() { var buf [1376]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1380() { var buf [1380]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1384() { var buf [1384]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1388() { var buf [1388]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1392() { var buf [1392]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1396() { var buf [1396]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1400() { var buf [1400]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1404() { var buf [1404]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1408() { var buf [1408]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1412() { var buf [1412]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1416() { var buf [1416]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1420() { var buf [1420]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1424() { var buf [1424]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1428() { var buf [1428]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1432() { var buf [1432]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1436() { var buf [1436]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1440() { var buf [1440]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1444() { var buf [1444]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1448() { var buf [1448]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1452() { var buf [1452]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1456() { var buf [1456]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1460() { var buf [1460]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1464() { var buf [1464]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1468() { var buf [1468]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1472() { var buf [1472]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1476() { var buf [1476]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1480() { var buf [1480]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1484() { var buf [1484]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1488() { var buf [1488]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1492() { var buf [1492]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1496() { var buf [1496]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1500() { var buf [1500]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1504() { var buf [1504]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1508() { var buf [1508]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1512() { var buf [1512]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1516() { var buf [1516]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1520() { var buf [1520]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1524() { var buf [1524]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1528() { var buf [1528]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1532() { var buf [1532]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1536() { var buf [1536]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1540() { var buf [1540]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1544() { var buf [1544]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1548() { var buf [1548]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1552() { var buf [1552]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1556() { var buf [1556]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1560() { var buf [1560]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1564() { var buf [1564]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1568() { var buf [1568]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1572() { var buf [1572]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1576() { var buf [1576]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1580() { var buf [1580]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1584() { var buf [1584]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1588() { var buf [1588]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1592() { var buf [1592]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1596() { var buf [1596]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1600() { var buf [1600]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1604() { var buf [1604]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1608() { var buf [1608]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1612() { var buf [1612]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1616() { var buf [1616]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1620() { var buf [1620]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1624() { var buf [1624]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1628() { var buf [1628]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1632() { var buf [1632]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1636() { var buf [1636]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1640() { var buf [1640]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1644() { var buf [1644]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1648() { var buf [1648]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1652() { var buf [1652]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1656() { var buf [1656]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1660() { var buf [1660]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1664() { var buf [1664]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1668() { var buf [1668]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1672() { var buf [1672]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1676() { var buf [1676]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1680() { var buf [1680]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1684() { var buf [1684]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1688() { var buf [1688]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1692() { var buf [1692]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1696() { var buf [1696]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1700() { var buf [1700]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1704() { var buf [1704]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1708() { var buf [1708]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1712() { var buf [1712]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1716() { var buf [1716]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1720() { var buf [1720]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1724() { var buf [1724]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1728() { var buf [1728]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1732() { var buf [1732]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1736() { var buf [1736]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1740() { var buf [1740]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1744() { var buf [1744]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1748() { var buf [1748]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1752() { var buf [1752]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1756() { var buf [1756]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1760() { var buf [1760]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1764() { var buf [1764]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1768() { var buf [1768]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1772() { var buf [1772]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1776() { var buf [1776]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1780() { var buf [1780]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1784() { var buf [1784]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1788() { var buf [1788]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1792() { var buf [1792]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1796() { var buf [1796]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1800() { var buf [1800]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1804() { var buf [1804]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1808() { var buf [1808]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1812() { var buf [1812]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1816() { var buf [1816]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1820() { var buf [1820]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1824() { var buf [1824]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1828() { var buf [1828]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1832() { var buf [1832]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1836() { var buf [1836]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1840() { var buf [1840]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1844() { var buf [1844]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1848() { var buf [1848]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1852() { var buf [1852]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1856() { var buf [1856]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1860() { var buf [1860]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1864() { var buf [1864]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1868() { var buf [1868]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1872() { var buf [1872]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1876() { var buf [1876]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1880() { var buf [1880]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1884() { var buf [1884]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1888() { var buf [1888]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1892() { var buf [1892]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1896() { var buf [1896]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1900() { var buf [1900]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1904() { var buf [1904]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1908() { var buf [1908]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1912() { var buf [1912]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1916() { var buf [1916]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1920() { var buf [1920]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1924() { var buf [1924]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1928() { var buf [1928]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1932() { var buf [1932]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1936() { var buf [1936]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1940() { var buf [1940]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1944() { var buf [1944]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1948() { var buf [1948]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1952() { var buf [1952]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1956() { var buf [1956]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1960() { var buf [1960]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1964() { var buf [1964]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1968() { var buf [1968]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1972() { var buf [1972]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1976() { var buf [1976]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1980() { var buf [1980]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1984() { var buf [1984]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1988() { var buf [1988]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1992() { var buf [1992]byte; use(buf[:]); C.callGoStackCheck() }
-func stack1996() { var buf [1996]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2000() { var buf [2000]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2004() { var buf [2004]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2008() { var buf [2008]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2012() { var buf [2012]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2016() { var buf [2016]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2020() { var buf [2020]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2024() { var buf [2024]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2028() { var buf [2028]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2032() { var buf [2032]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2036() { var buf [2036]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2040() { var buf [2040]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2044() { var buf [2044]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2048() { var buf [2048]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2052() { var buf [2052]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2056() { var buf [2056]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2060() { var buf [2060]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2064() { var buf [2064]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2068() { var buf [2068]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2072() { var buf [2072]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2076() { var buf [2076]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2080() { var buf [2080]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2084() { var buf [2084]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2088() { var buf [2088]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2092() { var buf [2092]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2096() { var buf [2096]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2100() { var buf [2100]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2104() { var buf [2104]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2108() { var buf [2108]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2112() { var buf [2112]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2116() { var buf [2116]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2120() { var buf [2120]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2124() { var buf [2124]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2128() { var buf [2128]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2132() { var buf [2132]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2136() { var buf [2136]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2140() { var buf [2140]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2144() { var buf [2144]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2148() { var buf [2148]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2152() { var buf [2152]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2156() { var buf [2156]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2160() { var buf [2160]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2164() { var buf [2164]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2168() { var buf [2168]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2172() { var buf [2172]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2176() { var buf [2176]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2180() { var buf [2180]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2184() { var buf [2184]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2188() { var buf [2188]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2192() { var buf [2192]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2196() { var buf [2196]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2200() { var buf [2200]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2204() { var buf [2204]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2208() { var buf [2208]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2212() { var buf [2212]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2216() { var buf [2216]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2220() { var buf [2220]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2224() { var buf [2224]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2228() { var buf [2228]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2232() { var buf [2232]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2236() { var buf [2236]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2240() { var buf [2240]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2244() { var buf [2244]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2248() { var buf [2248]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2252() { var buf [2252]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2256() { var buf [2256]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2260() { var buf [2260]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2264() { var buf [2264]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2268() { var buf [2268]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2272() { var buf [2272]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2276() { var buf [2276]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2280() { var buf [2280]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2284() { var buf [2284]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2288() { var buf [2288]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2292() { var buf [2292]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2296() { var buf [2296]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2300() { var buf [2300]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2304() { var buf [2304]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2308() { var buf [2308]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2312() { var buf [2312]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2316() { var buf [2316]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2320() { var buf [2320]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2324() { var buf [2324]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2328() { var buf [2328]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2332() { var buf [2332]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2336() { var buf [2336]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2340() { var buf [2340]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2344() { var buf [2344]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2348() { var buf [2348]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2352() { var buf [2352]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2356() { var buf [2356]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2360() { var buf [2360]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2364() { var buf [2364]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2368() { var buf [2368]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2372() { var buf [2372]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2376() { var buf [2376]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2380() { var buf [2380]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2384() { var buf [2384]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2388() { var buf [2388]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2392() { var buf [2392]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2396() { var buf [2396]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2400() { var buf [2400]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2404() { var buf [2404]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2408() { var buf [2408]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2412() { var buf [2412]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2416() { var buf [2416]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2420() { var buf [2420]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2424() { var buf [2424]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2428() { var buf [2428]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2432() { var buf [2432]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2436() { var buf [2436]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2440() { var buf [2440]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2444() { var buf [2444]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2448() { var buf [2448]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2452() { var buf [2452]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2456() { var buf [2456]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2460() { var buf [2460]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2464() { var buf [2464]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2468() { var buf [2468]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2472() { var buf [2472]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2476() { var buf [2476]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2480() { var buf [2480]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2484() { var buf [2484]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2488() { var buf [2488]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2492() { var buf [2492]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2496() { var buf [2496]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2500() { var buf [2500]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2504() { var buf [2504]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2508() { var buf [2508]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2512() { var buf [2512]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2516() { var buf [2516]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2520() { var buf [2520]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2524() { var buf [2524]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2528() { var buf [2528]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2532() { var buf [2532]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2536() { var buf [2536]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2540() { var buf [2540]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2544() { var buf [2544]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2548() { var buf [2548]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2552() { var buf [2552]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2556() { var buf [2556]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2560() { var buf [2560]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2564() { var buf [2564]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2568() { var buf [2568]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2572() { var buf [2572]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2576() { var buf [2576]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2580() { var buf [2580]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2584() { var buf [2584]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2588() { var buf [2588]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2592() { var buf [2592]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2596() { var buf [2596]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2600() { var buf [2600]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2604() { var buf [2604]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2608() { var buf [2608]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2612() { var buf [2612]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2616() { var buf [2616]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2620() { var buf [2620]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2624() { var buf [2624]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2628() { var buf [2628]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2632() { var buf [2632]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2636() { var buf [2636]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2640() { var buf [2640]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2644() { var buf [2644]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2648() { var buf [2648]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2652() { var buf [2652]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2656() { var buf [2656]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2660() { var buf [2660]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2664() { var buf [2664]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2668() { var buf [2668]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2672() { var buf [2672]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2676() { var buf [2676]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2680() { var buf [2680]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2684() { var buf [2684]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2688() { var buf [2688]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2692() { var buf [2692]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2696() { var buf [2696]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2700() { var buf [2700]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2704() { var buf [2704]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2708() { var buf [2708]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2712() { var buf [2712]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2716() { var buf [2716]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2720() { var buf [2720]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2724() { var buf [2724]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2728() { var buf [2728]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2732() { var buf [2732]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2736() { var buf [2736]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2740() { var buf [2740]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2744() { var buf [2744]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2748() { var buf [2748]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2752() { var buf [2752]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2756() { var buf [2756]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2760() { var buf [2760]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2764() { var buf [2764]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2768() { var buf [2768]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2772() { var buf [2772]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2776() { var buf [2776]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2780() { var buf [2780]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2784() { var buf [2784]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2788() { var buf [2788]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2792() { var buf [2792]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2796() { var buf [2796]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2800() { var buf [2800]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2804() { var buf [2804]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2808() { var buf [2808]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2812() { var buf [2812]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2816() { var buf [2816]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2820() { var buf [2820]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2824() { var buf [2824]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2828() { var buf [2828]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2832() { var buf [2832]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2836() { var buf [2836]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2840() { var buf [2840]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2844() { var buf [2844]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2848() { var buf [2848]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2852() { var buf [2852]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2856() { var buf [2856]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2860() { var buf [2860]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2864() { var buf [2864]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2868() { var buf [2868]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2872() { var buf [2872]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2876() { var buf [2876]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2880() { var buf [2880]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2884() { var buf [2884]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2888() { var buf [2888]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2892() { var buf [2892]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2896() { var buf [2896]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2900() { var buf [2900]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2904() { var buf [2904]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2908() { var buf [2908]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2912() { var buf [2912]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2916() { var buf [2916]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2920() { var buf [2920]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2924() { var buf [2924]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2928() { var buf [2928]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2932() { var buf [2932]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2936() { var buf [2936]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2940() { var buf [2940]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2944() { var buf [2944]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2948() { var buf [2948]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2952() { var buf [2952]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2956() { var buf [2956]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2960() { var buf [2960]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2964() { var buf [2964]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2968() { var buf [2968]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2972() { var buf [2972]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2976() { var buf [2976]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2980() { var buf [2980]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2984() { var buf [2984]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2988() { var buf [2988]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2992() { var buf [2992]byte; use(buf[:]); C.callGoStackCheck() }
-func stack2996() { var buf [2996]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3000() { var buf [3000]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3004() { var buf [3004]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3008() { var buf [3008]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3012() { var buf [3012]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3016() { var buf [3016]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3020() { var buf [3020]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3024() { var buf [3024]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3028() { var buf [3028]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3032() { var buf [3032]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3036() { var buf [3036]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3040() { var buf [3040]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3044() { var buf [3044]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3048() { var buf [3048]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3052() { var buf [3052]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3056() { var buf [3056]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3060() { var buf [3060]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3064() { var buf [3064]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3068() { var buf [3068]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3072() { var buf [3072]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3076() { var buf [3076]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3080() { var buf [3080]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3084() { var buf [3084]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3088() { var buf [3088]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3092() { var buf [3092]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3096() { var buf [3096]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3100() { var buf [3100]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3104() { var buf [3104]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3108() { var buf [3108]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3112() { var buf [3112]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3116() { var buf [3116]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3120() { var buf [3120]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3124() { var buf [3124]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3128() { var buf [3128]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3132() { var buf [3132]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3136() { var buf [3136]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3140() { var buf [3140]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3144() { var buf [3144]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3148() { var buf [3148]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3152() { var buf [3152]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3156() { var buf [3156]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3160() { var buf [3160]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3164() { var buf [3164]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3168() { var buf [3168]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3172() { var buf [3172]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3176() { var buf [3176]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3180() { var buf [3180]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3184() { var buf [3184]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3188() { var buf [3188]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3192() { var buf [3192]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3196() { var buf [3196]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3200() { var buf [3200]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3204() { var buf [3204]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3208() { var buf [3208]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3212() { var buf [3212]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3216() { var buf [3216]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3220() { var buf [3220]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3224() { var buf [3224]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3228() { var buf [3228]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3232() { var buf [3232]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3236() { var buf [3236]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3240() { var buf [3240]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3244() { var buf [3244]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3248() { var buf [3248]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3252() { var buf [3252]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3256() { var buf [3256]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3260() { var buf [3260]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3264() { var buf [3264]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3268() { var buf [3268]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3272() { var buf [3272]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3276() { var buf [3276]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3280() { var buf [3280]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3284() { var buf [3284]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3288() { var buf [3288]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3292() { var buf [3292]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3296() { var buf [3296]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3300() { var buf [3300]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3304() { var buf [3304]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3308() { var buf [3308]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3312() { var buf [3312]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3316() { var buf [3316]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3320() { var buf [3320]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3324() { var buf [3324]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3328() { var buf [3328]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3332() { var buf [3332]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3336() { var buf [3336]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3340() { var buf [3340]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3344() { var buf [3344]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3348() { var buf [3348]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3352() { var buf [3352]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3356() { var buf [3356]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3360() { var buf [3360]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3364() { var buf [3364]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3368() { var buf [3368]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3372() { var buf [3372]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3376() { var buf [3376]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3380() { var buf [3380]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3384() { var buf [3384]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3388() { var buf [3388]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3392() { var buf [3392]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3396() { var buf [3396]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3400() { var buf [3400]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3404() { var buf [3404]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3408() { var buf [3408]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3412() { var buf [3412]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3416() { var buf [3416]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3420() { var buf [3420]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3424() { var buf [3424]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3428() { var buf [3428]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3432() { var buf [3432]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3436() { var buf [3436]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3440() { var buf [3440]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3444() { var buf [3444]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3448() { var buf [3448]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3452() { var buf [3452]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3456() { var buf [3456]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3460() { var buf [3460]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3464() { var buf [3464]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3468() { var buf [3468]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3472() { var buf [3472]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3476() { var buf [3476]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3480() { var buf [3480]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3484() { var buf [3484]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3488() { var buf [3488]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3492() { var buf [3492]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3496() { var buf [3496]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3500() { var buf [3500]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3504() { var buf [3504]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3508() { var buf [3508]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3512() { var buf [3512]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3516() { var buf [3516]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3520() { var buf [3520]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3524() { var buf [3524]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3528() { var buf [3528]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3532() { var buf [3532]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3536() { var buf [3536]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3540() { var buf [3540]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3544() { var buf [3544]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3548() { var buf [3548]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3552() { var buf [3552]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3556() { var buf [3556]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3560() { var buf [3560]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3564() { var buf [3564]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3568() { var buf [3568]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3572() { var buf [3572]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3576() { var buf [3576]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3580() { var buf [3580]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3584() { var buf [3584]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3588() { var buf [3588]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3592() { var buf [3592]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3596() { var buf [3596]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3600() { var buf [3600]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3604() { var buf [3604]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3608() { var buf [3608]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3612() { var buf [3612]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3616() { var buf [3616]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3620() { var buf [3620]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3624() { var buf [3624]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3628() { var buf [3628]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3632() { var buf [3632]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3636() { var buf [3636]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3640() { var buf [3640]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3644() { var buf [3644]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3648() { var buf [3648]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3652() { var buf [3652]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3656() { var buf [3656]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3660() { var buf [3660]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3664() { var buf [3664]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3668() { var buf [3668]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3672() { var buf [3672]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3676() { var buf [3676]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3680() { var buf [3680]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3684() { var buf [3684]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3688() { var buf [3688]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3692() { var buf [3692]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3696() { var buf [3696]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3700() { var buf [3700]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3704() { var buf [3704]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3708() { var buf [3708]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3712() { var buf [3712]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3716() { var buf [3716]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3720() { var buf [3720]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3724() { var buf [3724]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3728() { var buf [3728]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3732() { var buf [3732]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3736() { var buf [3736]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3740() { var buf [3740]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3744() { var buf [3744]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3748() { var buf [3748]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3752() { var buf [3752]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3756() { var buf [3756]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3760() { var buf [3760]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3764() { var buf [3764]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3768() { var buf [3768]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3772() { var buf [3772]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3776() { var buf [3776]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3780() { var buf [3780]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3784() { var buf [3784]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3788() { var buf [3788]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3792() { var buf [3792]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3796() { var buf [3796]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3800() { var buf [3800]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3804() { var buf [3804]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3808() { var buf [3808]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3812() { var buf [3812]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3816() { var buf [3816]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3820() { var buf [3820]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3824() { var buf [3824]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3828() { var buf [3828]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3832() { var buf [3832]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3836() { var buf [3836]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3840() { var buf [3840]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3844() { var buf [3844]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3848() { var buf [3848]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3852() { var buf [3852]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3856() { var buf [3856]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3860() { var buf [3860]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3864() { var buf [3864]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3868() { var buf [3868]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3872() { var buf [3872]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3876() { var buf [3876]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3880() { var buf [3880]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3884() { var buf [3884]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3888() { var buf [3888]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3892() { var buf [3892]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3896() { var buf [3896]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3900() { var buf [3900]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3904() { var buf [3904]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3908() { var buf [3908]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3912() { var buf [3912]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3916() { var buf [3916]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3920() { var buf [3920]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3924() { var buf [3924]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3928() { var buf [3928]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3932() { var buf [3932]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3936() { var buf [3936]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3940() { var buf [3940]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3944() { var buf [3944]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3948() { var buf [3948]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3952() { var buf [3952]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3956() { var buf [3956]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3960() { var buf [3960]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3964() { var buf [3964]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3968() { var buf [3968]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3972() { var buf [3972]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3976() { var buf [3976]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3980() { var buf [3980]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3984() { var buf [3984]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3988() { var buf [3988]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3992() { var buf [3992]byte; use(buf[:]); C.callGoStackCheck() }
-func stack3996() { var buf [3996]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4000() { var buf [4000]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4004() { var buf [4004]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4008() { var buf [4008]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4012() { var buf [4012]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4016() { var buf [4016]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4020() { var buf [4020]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4024() { var buf [4024]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4028() { var buf [4028]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4032() { var buf [4032]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4036() { var buf [4036]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4040() { var buf [4040]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4044() { var buf [4044]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4048() { var buf [4048]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4052() { var buf [4052]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4056() { var buf [4056]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4060() { var buf [4060]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4064() { var buf [4064]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4068() { var buf [4068]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4072() { var buf [4072]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4076() { var buf [4076]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4080() { var buf [4080]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4084() { var buf [4084]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4088() { var buf [4088]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4092() { var buf [4092]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4096() { var buf [4096]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4100() { var buf [4100]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4104() { var buf [4104]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4108() { var buf [4108]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4112() { var buf [4112]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4116() { var buf [4116]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4120() { var buf [4120]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4124() { var buf [4124]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4128() { var buf [4128]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4132() { var buf [4132]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4136() { var buf [4136]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4140() { var buf [4140]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4144() { var buf [4144]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4148() { var buf [4148]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4152() { var buf [4152]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4156() { var buf [4156]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4160() { var buf [4160]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4164() { var buf [4164]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4168() { var buf [4168]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4172() { var buf [4172]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4176() { var buf [4176]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4180() { var buf [4180]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4184() { var buf [4184]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4188() { var buf [4188]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4192() { var buf [4192]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4196() { var buf [4196]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4200() { var buf [4200]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4204() { var buf [4204]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4208() { var buf [4208]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4212() { var buf [4212]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4216() { var buf [4216]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4220() { var buf [4220]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4224() { var buf [4224]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4228() { var buf [4228]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4232() { var buf [4232]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4236() { var buf [4236]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4240() { var buf [4240]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4244() { var buf [4244]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4248() { var buf [4248]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4252() { var buf [4252]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4256() { var buf [4256]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4260() { var buf [4260]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4264() { var buf [4264]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4268() { var buf [4268]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4272() { var buf [4272]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4276() { var buf [4276]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4280() { var buf [4280]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4284() { var buf [4284]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4288() { var buf [4288]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4292() { var buf [4292]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4296() { var buf [4296]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4300() { var buf [4300]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4304() { var buf [4304]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4308() { var buf [4308]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4312() { var buf [4312]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4316() { var buf [4316]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4320() { var buf [4320]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4324() { var buf [4324]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4328() { var buf [4328]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4332() { var buf [4332]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4336() { var buf [4336]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4340() { var buf [4340]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4344() { var buf [4344]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4348() { var buf [4348]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4352() { var buf [4352]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4356() { var buf [4356]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4360() { var buf [4360]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4364() { var buf [4364]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4368() { var buf [4368]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4372() { var buf [4372]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4376() { var buf [4376]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4380() { var buf [4380]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4384() { var buf [4384]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4388() { var buf [4388]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4392() { var buf [4392]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4396() { var buf [4396]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4400() { var buf [4400]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4404() { var buf [4404]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4408() { var buf [4408]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4412() { var buf [4412]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4416() { var buf [4416]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4420() { var buf [4420]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4424() { var buf [4424]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4428() { var buf [4428]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4432() { var buf [4432]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4436() { var buf [4436]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4440() { var buf [4440]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4444() { var buf [4444]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4448() { var buf [4448]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4452() { var buf [4452]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4456() { var buf [4456]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4460() { var buf [4460]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4464() { var buf [4464]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4468() { var buf [4468]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4472() { var buf [4472]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4476() { var buf [4476]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4480() { var buf [4480]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4484() { var buf [4484]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4488() { var buf [4488]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4492() { var buf [4492]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4496() { var buf [4496]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4500() { var buf [4500]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4504() { var buf [4504]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4508() { var buf [4508]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4512() { var buf [4512]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4516() { var buf [4516]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4520() { var buf [4520]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4524() { var buf [4524]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4528() { var buf [4528]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4532() { var buf [4532]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4536() { var buf [4536]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4540() { var buf [4540]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4544() { var buf [4544]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4548() { var buf [4548]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4552() { var buf [4552]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4556() { var buf [4556]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4560() { var buf [4560]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4564() { var buf [4564]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4568() { var buf [4568]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4572() { var buf [4572]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4576() { var buf [4576]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4580() { var buf [4580]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4584() { var buf [4584]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4588() { var buf [4588]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4592() { var buf [4592]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4596() { var buf [4596]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4600() { var buf [4600]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4604() { var buf [4604]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4608() { var buf [4608]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4612() { var buf [4612]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4616() { var buf [4616]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4620() { var buf [4620]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4624() { var buf [4624]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4628() { var buf [4628]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4632() { var buf [4632]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4636() { var buf [4636]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4640() { var buf [4640]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4644() { var buf [4644]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4648() { var buf [4648]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4652() { var buf [4652]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4656() { var buf [4656]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4660() { var buf [4660]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4664() { var buf [4664]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4668() { var buf [4668]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4672() { var buf [4672]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4676() { var buf [4676]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4680() { var buf [4680]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4684() { var buf [4684]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4688() { var buf [4688]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4692() { var buf [4692]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4696() { var buf [4696]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4700() { var buf [4700]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4704() { var buf [4704]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4708() { var buf [4708]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4712() { var buf [4712]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4716() { var buf [4716]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4720() { var buf [4720]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4724() { var buf [4724]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4728() { var buf [4728]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4732() { var buf [4732]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4736() { var buf [4736]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4740() { var buf [4740]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4744() { var buf [4744]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4748() { var buf [4748]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4752() { var buf [4752]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4756() { var buf [4756]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4760() { var buf [4760]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4764() { var buf [4764]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4768() { var buf [4768]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4772() { var buf [4772]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4776() { var buf [4776]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4780() { var buf [4780]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4784() { var buf [4784]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4788() { var buf [4788]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4792() { var buf [4792]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4796() { var buf [4796]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4800() { var buf [4800]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4804() { var buf [4804]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4808() { var buf [4808]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4812() { var buf [4812]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4816() { var buf [4816]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4820() { var buf [4820]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4824() { var buf [4824]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4828() { var buf [4828]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4832() { var buf [4832]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4836() { var buf [4836]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4840() { var buf [4840]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4844() { var buf [4844]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4848() { var buf [4848]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4852() { var buf [4852]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4856() { var buf [4856]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4860() { var buf [4860]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4864() { var buf [4864]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4868() { var buf [4868]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4872() { var buf [4872]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4876() { var buf [4876]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4880() { var buf [4880]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4884() { var buf [4884]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4888() { var buf [4888]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4892() { var buf [4892]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4896() { var buf [4896]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4900() { var buf [4900]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4904() { var buf [4904]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4908() { var buf [4908]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4912() { var buf [4912]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4916() { var buf [4916]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4920() { var buf [4920]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4924() { var buf [4924]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4928() { var buf [4928]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4932() { var buf [4932]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4936() { var buf [4936]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4940() { var buf [4940]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4944() { var buf [4944]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4948() { var buf [4948]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4952() { var buf [4952]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4956() { var buf [4956]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4960() { var buf [4960]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4964() { var buf [4964]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4968() { var buf [4968]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4972() { var buf [4972]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4976() { var buf [4976]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4980() { var buf [4980]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4984() { var buf [4984]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4988() { var buf [4988]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4992() { var buf [4992]byte; use(buf[:]); C.callGoStackCheck() }
-func stack4996() { var buf [4996]byte; use(buf[:]); C.callGoStackCheck() }
-func stack5000() { var buf [5000]byte; use(buf[:]); C.callGoStackCheck() }
diff --git a/misc/cgo/test/callback_c_gc.c b/misc/cgo/test/callback_c_gc.c
deleted file mode 100644
index eb720eb..0000000
--- a/misc/cgo/test/callback_c_gc.c
+++ /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.
-
-// +build gc
-
-#include "_cgo_export.h"
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-/* Test calling panic from C.  This is what SWIG does.  */
-
-extern void crosscall2(void (*fn)(void *, int), void *, int);
-extern void _cgo_panic(void *, int);
-extern void _cgo_allocate(void *, int);
-
-void
-callPanic(void)
-{
-	struct { const char *p; } a;
-	a.p = "panic from C";
-	crosscall2(_cgo_panic, &a, sizeof a);
-	*(int*)1 = 1;
-}
diff --git a/misc/cgo/test/callback_c_gccgo.c b/misc/cgo/test/callback_c_gccgo.c
deleted file mode 100644
index 4eaa818..0000000
--- a/misc/cgo/test/callback_c_gccgo.c
+++ /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 gccgo
-
-#include "_cgo_export.h"
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-/* Test calling panic from C.  This is what SWIG does.  */
-
-extern void _cgo_panic(const char *);
-extern void *_cgo_allocate(size_t);
-
-void
-callPanic(void)
-{
-	_cgo_panic("panic from C");
-}
diff --git a/misc/cgo/test/cgo_linux_test.go b/misc/cgo/test/cgo_linux_test.go
deleted file mode 100644
index 3a1cf98..0000000
--- a/misc/cgo/test/cgo_linux_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 cgotest
-
-import (
-	"os"
-	"runtime"
-	"testing"
-)
-
-func TestSetgid(t *testing.T) {
-	if runtime.GOOS == "android" {
-		t.Skip("unsupported on Android")
-	}
-	if _, err := os.Stat("/etc/alpine-release"); err == nil {
-		t.Skip("setgid is broken with musl libc - go.dev/issue/39857")
-	}
-	testSetgid(t)
-}
-
-func TestSetgidStress(t *testing.T) {
-	if runtime.GOOS == "android" {
-		t.Skip("unsupported on Android")
-	}
-	if _, err := os.Stat("/etc/alpine-release"); err == nil {
-		t.Skip("setgid is broken with musl libc - go.dev/issue/39857")
-	}
-	testSetgidStress(t)
-}
-
-func Test1435(t *testing.T) { test1435(t) }
-func Test6997(t *testing.T) { test6997(t) }
-
-func Test9400(t *testing.T) {
-	if _, err := os.Stat("/etc/alpine-release"); err == nil {
-		t.Skip("setgid is broken with musl libc - go.dev/issue/39857")
-	}
-	test9400(t)
-}
-
-func TestBuildID(t *testing.T) { testBuildID(t) }
diff --git a/misc/cgo/test/cgo_test.go b/misc/cgo/test/cgo_test.go
deleted file mode 100644
index 5b29895..0000000
--- a/misc/cgo/test/cgo_test.go
+++ /dev/null
@@ -1,109 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-import "testing"
-
-// The actual test functions are in non-_test.go files
-// so that they can use cgo (import "C").
-// These wrappers are here for gotest to find.
-
-func Test1328(t *testing.T)                  { test1328(t) }
-func Test1560(t *testing.T)                  { test1560(t) }
-func Test1635(t *testing.T)                  { test1635(t) }
-func Test3250(t *testing.T)                  { test3250(t) }
-func Test3729(t *testing.T)                  { test3729(t) }
-func Test3775(t *testing.T)                  { test3775(t) }
-func Test4029(t *testing.T)                  { test4029(t) }
-func Test4339(t *testing.T)                  { test4339(t) }
-func Test5227(t *testing.T)                  { test5227(t) }
-func Test5242(t *testing.T)                  { test5242(t) }
-func Test5337(t *testing.T)                  { test5337(t) }
-func Test5548(t *testing.T)                  { test5548(t) }
-func Test5603(t *testing.T)                  { test5603(t) }
-func Test5986(t *testing.T)                  { test5986(t) }
-func Test6390(t *testing.T)                  { test6390(t) }
-func Test6833(t *testing.T)                  { test6833(t) }
-func Test6907(t *testing.T)                  { test6907(t) }
-func Test6907Go(t *testing.T)                { test6907Go(t) }
-func Test7560(t *testing.T)                  { test7560(t) }
-func Test7665(t *testing.T)                  { test7665(t) }
-func Test7978(t *testing.T)                  { test7978(t) }
-func Test8092(t *testing.T)                  { test8092(t) }
-func Test8517(t *testing.T)                  { test8517(t) }
-func Test8694(t *testing.T)                  { test8694(t) }
-func Test8756(t *testing.T)                  { test8756(t) }
-func Test8811(t *testing.T)                  { test8811(t) }
-func Test9026(t *testing.T)                  { test9026(t) }
-func Test9510(t *testing.T)                  { test9510(t) }
-func Test9557(t *testing.T)                  { test9557(t) }
-func Test10303(t *testing.T)                 { test10303(t, 10) }
-func Test11925(t *testing.T)                 { test11925(t) }
-func Test12030(t *testing.T)                 { test12030(t) }
-func Test14838(t *testing.T)                 { test14838(t) }
-func Test17065(t *testing.T)                 { test17065(t) }
-func Test17537(t *testing.T)                 { test17537(t) }
-func Test18126(t *testing.T)                 { test18126(t) }
-func Test18720(t *testing.T)                 { test18720(t) }
-func Test20129(t *testing.T)                 { test20129(t) }
-func Test20266(t *testing.T)                 { test20266(t) }
-func Test20369(t *testing.T)                 { test20369(t) }
-func Test20910(t *testing.T)                 { test20910(t) }
-func Test21708(t *testing.T)                 { test21708(t) }
-func Test21809(t *testing.T)                 { test21809(t) }
-func Test21897(t *testing.T)                 { test21897(t) }
-func Test22906(t *testing.T)                 { test22906(t) }
-func Test23356(t *testing.T)                 { test23356(t) }
-func Test24206(t *testing.T)                 { test24206(t) }
-func Test25143(t *testing.T)                 { test25143(t) }
-func Test26066(t *testing.T)                 { test26066(t) }
-func Test26213(t *testing.T)                 { test26213(t) }
-func Test27660(t *testing.T)                 { test27660(t) }
-func Test28896(t *testing.T)                 { test28896(t) }
-func Test30065(t *testing.T)                 { test30065(t) }
-func Test32579(t *testing.T)                 { test32579(t) }
-func Test31891(t *testing.T)                 { test31891(t) }
-func Test42018(t *testing.T)                 { test42018(t) }
-func Test45451(t *testing.T)                 { test45451(t) }
-func Test49633(t *testing.T)                 { test49633(t) }
-func TestAlign(t *testing.T)                 { testAlign(t) }
-func TestAtol(t *testing.T)                  { testAtol(t) }
-func TestBlocking(t *testing.T)              { testBlocking(t) }
-func TestBoolAlign(t *testing.T)             { testBoolAlign(t) }
-func TestCallGoWithString(t *testing.T)      { testCallGoWithString(t) }
-func TestCallback(t *testing.T)              { testCallback(t) }
-func TestCallbackCallers(t *testing.T)       { testCallbackCallers(t) }
-func TestCallbackGC(t *testing.T)            { testCallbackGC(t) }
-func TestCallbackPanic(t *testing.T)         { testCallbackPanic(t) }
-func TestCallbackPanicLocked(t *testing.T)   { testCallbackPanicLocked(t) }
-func TestCallbackPanicLoop(t *testing.T)     { testCallbackPanicLoop(t) }
-func TestCallbackStack(t *testing.T)         { testCallbackStack(t) }
-func TestCflags(t *testing.T)                { testCflags(t) }
-func TestCheckConst(t *testing.T)            { testCheckConst(t) }
-func TestConst(t *testing.T)                 { testConst(t) }
-func TestCthread(t *testing.T)               { testCthread(t) }
-func TestEnum(t *testing.T)                  { testEnum(t) }
-func TestNamedEnum(t *testing.T)             { testNamedEnum(t) }
-func TestCastToEnum(t *testing.T)            { testCastToEnum(t) }
-func TestErrno(t *testing.T)                 { testErrno(t) }
-func TestFpVar(t *testing.T)                 { testFpVar(t) }
-func TestGCC68255(t *testing.T)              { testGCC68255(t) }
-func TestHandle(t *testing.T)                { testHandle(t) }
-func TestHelpers(t *testing.T)               { testHelpers(t) }
-func TestLibgcc(t *testing.T)                { testLibgcc(t) }
-func TestMultipleAssign(t *testing.T)        { testMultipleAssign(t) }
-func TestNaming(t *testing.T)                { testNaming(t) }
-func TestPanicFromC(t *testing.T)            { testPanicFromC(t) }
-func TestPrintf(t *testing.T)                { testPrintf(t) }
-func TestReturnAfterGrow(t *testing.T)       { testReturnAfterGrow(t) }
-func TestReturnAfterGrowFromGo(t *testing.T) { testReturnAfterGrowFromGo(t) }
-func TestSetEnv(t *testing.T)                { testSetEnv(t) }
-func TestThreadLock(t *testing.T)            { testThreadLockFunc(t) }
-func TestUnsignedInt(t *testing.T)           { testUnsignedInt(t) }
-func TestZeroArgCallback(t *testing.T)       { testZeroArgCallback(t) }
-
-func BenchmarkCgoCall(b *testing.B)     { benchCgoCall(b) }
-func BenchmarkGoString(b *testing.B)    { benchGoString(b) }
-func BenchmarkCGoCallback(b *testing.B) { benchCallback(b) }
diff --git a/misc/cgo/test/cgo_thread_lock.go b/misc/cgo/test/cgo_thread_lock.go
deleted file mode 100644
index 3b9ac84..0000000
--- a/misc/cgo/test/cgo_thread_lock.go
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright 2016 The Go 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:build linux && freebsd && openbsd
-// +build linux,freebsd,openbsd
-
-package cgotest
-
-/*
-#include <unistd.h>
-#include <sys/syscall.h>
-void Gosched(void);
-static int Ctid(void) { Gosched(); return syscall(SYS_gettid); }
-*/
-import "C"
-
-import (
-	"runtime"
-	"syscall"
-	"testing"
-	"time"
-)
-
-//export Gosched
-func Gosched() {
-	runtime.Gosched()
-}
-
-func init() {
-	testThreadLockFunc = testThreadLock
-}
-
-func testThreadLock(t *testing.T) {
-	stop := make(chan int)
-	go func() {
-		// We need the G continue running,
-		// so the M has a chance to run this G.
-		for {
-			select {
-			case <-stop:
-				return
-			case <-time.After(time.Millisecond * 100):
-			}
-		}
-	}()
-	defer close(stop)
-
-	for i := 0; i < 1000; i++ {
-		if C.int(syscall.Gettid()) != C.Ctid() {
-			t.Fatalf("cgo has not locked OS thread")
-		}
-	}
-}
diff --git a/misc/cgo/test/cgo_unix_test.go b/misc/cgo/test/cgo_unix_test.go
deleted file mode 100644
index a324503..0000000
--- a/misc/cgo/test/cgo_unix_test.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.
-
-//go:build !windows
-// +build !windows
-
-package cgotest
-
-import "testing"
-
-func TestSigaltstack(t *testing.T) { testSigaltstack(t) }
-func TestSigprocmask(t *testing.T) { testSigprocmask(t) }
-func Test18146(t *testing.T)       { test18146(t) }
diff --git a/misc/cgo/test/cthread_unix.c b/misc/cgo/test/cthread_unix.c
deleted file mode 100644
index 247d636..0000000
--- a/misc/cgo/test/cthread_unix.c
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2013 The Go 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 aix darwin dragonfly freebsd linux netbsd openbsd solaris
-
-#include <pthread.h>
-#include "_cgo_export.h"
-
-static void*
-addThread(void *p)
-{
-	int i, max;
-	
-	max = *(int*)p;
-	for(i=0; i<max; i++)
-		Add(i);
-	return 0;
-}
-
-void
-doAdd(int max, int nthread)
-{
-	enum { MaxThread = 20 };
-	int i;
-	pthread_t thread_id[MaxThread];
-	
-	if(nthread > MaxThread)
-		nthread = MaxThread;
-	for(i=0; i<nthread; i++)
-		pthread_create(&thread_id[i], 0, addThread, &max);
-	for(i=0; i<nthread; i++)
-		pthread_join(thread_id[i], 0);		
-}
diff --git a/misc/cgo/test/cthread_windows.c b/misc/cgo/test/cthread_windows.c
deleted file mode 100644
index 3a62ddd..0000000
--- a/misc/cgo/test/cthread_windows.c
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-#define WIN32_LEAN_AND_MEAN
-#include <windows.h>
-#include <process.h>
-#include "_cgo_export.h"
-
-__stdcall
-static unsigned int
-addThread(void *p)
-{
-	int i, max;
-	
-	max = *(int*)p;
-	for(i=0; i<max; i++)
-		Add(i);
-	return 0;
-}
-
-void
-doAdd(int max, int nthread)
-{
-	enum { MaxThread = 20 };
-	int i;
-	uintptr_t thread_id[MaxThread];
-	
-	if(nthread > MaxThread)
-		nthread = MaxThread;
-	for(i=0; i<nthread; i++)
-		thread_id[i] = _beginthreadex(0, 0, addThread, &max, 0, 0);
-	for(i=0; i<nthread; i++) {
-		WaitForSingleObject((HANDLE)thread_id[i], INFINITE);
-		CloseHandle((HANDLE)thread_id[i]);
-	}
-}
diff --git a/misc/cgo/test/gcc68255.go b/misc/cgo/test/gcc68255.go
deleted file mode 100644
index 7b25e02..0000000
--- a/misc/cgo/test/gcc68255.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 cgotest
-
-import (
-	"testing"
-
-	"misc/cgo/test/gcc68255"
-)
-
-func testGCC68255(t *testing.T) {
-	if !gcc68255.F() {
-		t.Error("C global variable was not initialized")
-	}
-}
diff --git a/misc/cgo/test/issue1435.go b/misc/cgo/test/issue1435.go
deleted file mode 100644
index 3fb721a..0000000
--- a/misc/cgo/test/issue1435.go
+++ /dev/null
@@ -1,204 +0,0 @@
-// Copyright 2019 The Go 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:build linux && cgo
-// +build linux,cgo
-
-package cgotest
-
-import (
-	"fmt"
-	"os"
-	"runtime"
-	"sort"
-	"strings"
-	"syscall"
-	"testing"
-)
-
-// #include <stdio.h>
-// #include <stdlib.h>
-// #include <pthread.h>
-// #include <unistd.h>
-// #include <sys/types.h>
-//
-// pthread_t *t = NULL;
-// pthread_mutex_t mu;
-// int nts = 0;
-// int all_done = 0;
-//
-// static void *aFn(void *vargp) {
-//   int done = 0;
-//   while (!done) {
-//     usleep(100);
-//     pthread_mutex_lock(&mu);
-//     done = all_done;
-//     pthread_mutex_unlock(&mu);
-//   }
-//   return NULL;
-// }
-//
-// void trial(int argc) {
-//   int i;
-//   nts = argc;
-//   t = calloc(nts, sizeof(pthread_t));
-//   pthread_mutex_init(&mu, NULL);
-//   for (i = 0; i < nts; i++) {
-//     pthread_create(&t[i], NULL, aFn, NULL);
-//   }
-// }
-//
-// void cleanup(void) {
-//   int i;
-//   pthread_mutex_lock(&mu);
-//   all_done = 1;
-//   pthread_mutex_unlock(&mu);
-//   for (i = 0; i < nts; i++) {
-//     pthread_join(t[i], NULL);
-//   }
-//   pthread_mutex_destroy(&mu);
-//   free(t);
-// }
-import "C"
-
-// compareStatus is used to confirm the contents of the thread
-// specific status files match expectations.
-func compareStatus(filter, expect string) error {
-	expected := filter + expect
-	pid := syscall.Getpid()
-	fs, err := os.ReadDir(fmt.Sprintf("/proc/%d/task", pid))
-	if err != nil {
-		return fmt.Errorf("unable to find %d tasks: %v", pid, err)
-	}
-	expectedProc := fmt.Sprintf("Pid:\t%d", pid)
-	foundAThread := false
-	for _, f := range fs {
-		tf := fmt.Sprintf("/proc/%s/status", f.Name())
-		d, err := os.ReadFile(tf)
-		if err != nil {
-			// There are a surprising number of ways this
-			// can error out on linux.  We've seen all of
-			// the following, so treat any error here as
-			// equivalent to the "process is gone":
-			//    os.IsNotExist(err),
-			//    "... : no such process",
-			//    "... : bad file descriptor.
-			continue
-		}
-		lines := strings.Split(string(d), "\n")
-		for _, line := range lines {
-			// Different kernel vintages pad differently.
-			line = strings.TrimSpace(line)
-			if strings.HasPrefix(line, "Pid:\t") {
-				// On loaded systems, it is possible
-				// for a TID to be reused really
-				// quickly. As such, we need to
-				// validate that the thread status
-				// info we just read is a task of the
-				// same process PID as we are
-				// currently running, and not a
-				// recently terminated thread
-				// resurfaced in a different process.
-				if line != expectedProc {
-					break
-				}
-				// Fall through in the unlikely case
-				// that filter at some point is
-				// "Pid:\t".
-			}
-			if strings.HasPrefix(line, filter) {
-				if line == expected {
-					foundAThread = true
-					break
-				}
-				if filter == "Groups:" && strings.HasPrefix(line, "Groups:\t") {
-					// https://github.com/golang/go/issues/46145
-					// Containers don't reliably output this line in sorted order so manually sort and compare that.
-					a := strings.Split(line[8:], " ")
-					sort.Strings(a)
-					got := strings.Join(a, " ")
-					if got == expected[8:] {
-						foundAThread = true
-						break
-					}
-
-				}
-				return fmt.Errorf("%q got:%q want:%q (bad) [pid=%d file:'%s' %v]\n", tf, line, expected, pid, string(d), expectedProc)
-			}
-		}
-	}
-	if !foundAThread {
-		return fmt.Errorf("found no thread /proc/<TID>/status files for process %q", expectedProc)
-	}
-	return nil
-}
-
-// test1435 test 9 glibc implemented setuid/gid syscall functions are
-// mapped.  This test is a slightly more expansive test than that of
-// src/syscall/syscall_linux_test.go:TestSetuidEtc() insofar as it
-// launches concurrent threads from C code via CGo and validates that
-// they are subject to the system calls being tested. For the actual
-// Go functionality being tested here, the syscall_linux_test version
-// is considered authoritative, but non-trivial improvements to that
-// should be mirrored here.
-func test1435(t *testing.T) {
-	if syscall.Getuid() != 0 {
-		t.Skip("skipping root only test")
-	}
-	if runtime.GOOS == "linux" {
-		if _, err := os.Stat("/etc/alpine-release"); err == nil {
-			t.Skip("skipping failing test on alpine - go.dev/issue/19938")
-		}
-	}
-
-	// Launch some threads in C.
-	const cts = 5
-	C.trial(cts)
-	defer C.cleanup()
-
-	vs := []struct {
-		call           string
-		fn             func() error
-		filter, expect string
-	}{
-		{call: "Setegid(1)", fn: func() error { return syscall.Setegid(1) }, filter: "Gid:", expect: "\t0\t1\t0\t1"},
-		{call: "Setegid(0)", fn: func() error { return syscall.Setegid(0) }, filter: "Gid:", expect: "\t0\t0\t0\t0"},
-
-		{call: "Seteuid(1)", fn: func() error { return syscall.Seteuid(1) }, filter: "Uid:", expect: "\t0\t1\t0\t1"},
-		{call: "Setuid(0)", fn: func() error { return syscall.Setuid(0) }, filter: "Uid:", expect: "\t0\t0\t0\t0"},
-
-		{call: "Setgid(1)", fn: func() error { return syscall.Setgid(1) }, filter: "Gid:", expect: "\t1\t1\t1\t1"},
-		{call: "Setgid(0)", fn: func() error { return syscall.Setgid(0) }, filter: "Gid:", expect: "\t0\t0\t0\t0"},
-
-		{call: "Setgroups([]int{0,1,2,3})", fn: func() error { return syscall.Setgroups([]int{0, 1, 2, 3}) }, filter: "Groups:", expect: "\t0 1 2 3"},
-		{call: "Setgroups(nil)", fn: func() error { return syscall.Setgroups(nil) }, filter: "Groups:", expect: ""},
-		{call: "Setgroups([]int{0})", fn: func() error { return syscall.Setgroups([]int{0}) }, filter: "Groups:", expect: "\t0"},
-
-		{call: "Setregid(101,0)", fn: func() error { return syscall.Setregid(101, 0) }, filter: "Gid:", expect: "\t101\t0\t0\t0"},
-		{call: "Setregid(0,102)", fn: func() error { return syscall.Setregid(0, 102) }, filter: "Gid:", expect: "\t0\t102\t102\t102"},
-		{call: "Setregid(0,0)", fn: func() error { return syscall.Setregid(0, 0) }, filter: "Gid:", expect: "\t0\t0\t0\t0"},
-
-		{call: "Setreuid(1,0)", fn: func() error { return syscall.Setreuid(1, 0) }, filter: "Uid:", expect: "\t1\t0\t0\t0"},
-		{call: "Setreuid(0,2)", fn: func() error { return syscall.Setreuid(0, 2) }, filter: "Uid:", expect: "\t0\t2\t2\t2"},
-		{call: "Setreuid(0,0)", fn: func() error { return syscall.Setreuid(0, 0) }, filter: "Uid:", expect: "\t0\t0\t0\t0"},
-
-		{call: "Setresgid(101,0,102)", fn: func() error { return syscall.Setresgid(101, 0, 102) }, filter: "Gid:", expect: "\t101\t0\t102\t0"},
-		{call: "Setresgid(0,102,101)", fn: func() error { return syscall.Setresgid(0, 102, 101) }, filter: "Gid:", expect: "\t0\t102\t101\t102"},
-		{call: "Setresgid(0,0,0)", fn: func() error { return syscall.Setresgid(0, 0, 0) }, filter: "Gid:", expect: "\t0\t0\t0\t0"},
-
-		{call: "Setresuid(1,0,2)", fn: func() error { return syscall.Setresuid(1, 0, 2) }, filter: "Uid:", expect: "\t1\t0\t2\t0"},
-		{call: "Setresuid(0,2,1)", fn: func() error { return syscall.Setresuid(0, 2, 1) }, filter: "Uid:", expect: "\t0\t2\t1\t2"},
-		{call: "Setresuid(0,0,0)", fn: func() error { return syscall.Setresuid(0, 0, 0) }, filter: "Uid:", expect: "\t0\t0\t0\t0"},
-	}
-
-	for i, v := range vs {
-		if err := v.fn(); err != nil {
-			t.Errorf("[%d] %q failed: %v", i, v.call, err)
-			continue
-		}
-		if err := compareStatus(v.filter, v.expect); err != nil {
-			t.Errorf("[%d] %q comparison: %v", i, v.call, err)
-		}
-	}
-}
diff --git a/misc/cgo/test/issue18146.go b/misc/cgo/test/issue18146.go
deleted file mode 100644
index e50f9ae..0000000
--- a/misc/cgo/test/issue18146.go
+++ /dev/null
@@ -1,129 +0,0 @@
-// Copyright 2016 The Go 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:build !windows
-// +build !windows
-
-// Issue 18146: pthread_create failure during syscall.Exec.
-
-package cgotest
-
-import (
-	"bytes"
-	"crypto/md5"
-	"os"
-	"os/exec"
-	"runtime"
-	"syscall"
-	"testing"
-	"time"
-)
-
-func test18146(t *testing.T) {
-	if testing.Short() {
-		t.Skip("skipping in short mode")
-	}
-
-	if runtime.GOOS == "darwin" || runtime.GOOS == "ios" {
-		t.Skipf("skipping flaky test on %s; see golang.org/issue/18202", runtime.GOOS)
-	}
-
-	if runtime.GOARCH == "mips" || runtime.GOARCH == "mips64" {
-		t.Skipf("skipping on %s", runtime.GOARCH)
-	}
-
-	attempts := 1000
-	threads := 4
-
-	// Restrict the number of attempts based on RLIMIT_NPROC.
-	// Tediously, RLIMIT_NPROC was left out of the syscall package,
-	// probably because it is not in POSIX.1, so we define it here.
-	// It is not defined on Solaris.
-	var nproc int
-	setNproc := true
-	switch runtime.GOOS {
-	default:
-		setNproc = false
-	case "aix":
-		nproc = 9
-	case "linux":
-		nproc = 6
-	case "darwin", "dragonfly", "freebsd", "netbsd", "openbsd":
-		nproc = 7
-	}
-	if setNproc {
-		var rlim syscall.Rlimit
-		if syscall.Getrlimit(nproc, &rlim) == nil {
-			max := int(rlim.Cur) / (threads + 5)
-			if attempts > max {
-				t.Logf("lowering attempts from %d to %d for RLIMIT_NPROC", attempts, max)
-				attempts = max
-			}
-		}
-	}
-
-	if os.Getenv("test18146") == "exec" {
-		runtime.GOMAXPROCS(1)
-		for n := threads; n > 0; n-- {
-			go func() {
-				for {
-					_ = md5.Sum([]byte("Hello, !"))
-				}
-			}()
-		}
-		runtime.GOMAXPROCS(threads)
-		argv := append(os.Args, "-test.run=NoSuchTestExists")
-		if err := syscall.Exec(os.Args[0], argv, os.Environ()); err != nil {
-			t.Fatal(err)
-		}
-	}
-
-	var cmds []*exec.Cmd
-	defer func() {
-		for _, cmd := range cmds {
-			cmd.Process.Kill()
-		}
-	}()
-
-	args := append(append([]string(nil), os.Args[1:]...), "-test.run=Test18146")
-	for n := attempts; n > 0; n-- {
-		cmd := exec.Command(os.Args[0], args...)
-		cmd.Env = append(os.Environ(), "test18146=exec")
-		buf := bytes.NewBuffer(nil)
-		cmd.Stdout = buf
-		cmd.Stderr = buf
-		if err := cmd.Start(); err != nil {
-			// We are starting so many processes that on
-			// some systems (problem seen on Darwin,
-			// Dragonfly, OpenBSD) the fork call will fail
-			// with EAGAIN.
-			if pe, ok := err.(*os.PathError); ok {
-				err = pe.Err
-			}
-			if se, ok := err.(syscall.Errno); ok && (se == syscall.EAGAIN || se == syscall.EMFILE) {
-				time.Sleep(time.Millisecond)
-				continue
-			}
-
-			t.Error(err)
-			return
-		}
-		cmds = append(cmds, cmd)
-	}
-
-	failures := 0
-	for _, cmd := range cmds {
-		err := cmd.Wait()
-		if err == nil {
-			continue
-		}
-
-		t.Errorf("syscall.Exec failed: %v\n%s", err, cmd.Stdout)
-		failures++
-	}
-
-	if failures > 0 {
-		t.Logf("Failed %v of %v attempts.", failures, len(cmds))
-	}
-}
diff --git a/misc/cgo/test/issue21897.go b/misc/cgo/test/issue21897.go
deleted file mode 100644
index 8f39252..0000000
--- a/misc/cgo/test/issue21897.go
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright 2017 The Go 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:build darwin && cgo && !internal
-// +build darwin,cgo,!internal
-
-package cgotest
-
-/*
-#cgo LDFLAGS: -framework CoreFoundation
-#include <CoreFoundation/CoreFoundation.h>
-*/
-import "C"
-import (
-	"runtime/debug"
-	"testing"
-	"unsafe"
-)
-
-func test21897(t *testing.T) {
-	// Please write barrier, kick in soon.
-	defer debug.SetGCPercent(debug.SetGCPercent(1))
-
-	for i := 0; i < 10000; i++ {
-		testCFNumberRef()
-		testCFDateRef()
-		testCFBooleanRef()
-		// Allocate some memory, so eventually the write barrier is enabled
-		// and it will see writes of bad pointers in the test* functions below.
-		byteSliceSink = make([]byte, 1024)
-	}
-}
-
-var byteSliceSink []byte
-
-func testCFNumberRef() {
-	var v int64 = 0
-	xCFNumberRef = C.CFNumberCreate(C.kCFAllocatorSystemDefault, C.kCFNumberSInt64Type, unsafe.Pointer(&v))
-	//fmt.Printf("CFNumberRef: %x\n", uintptr(unsafe.Pointer(xCFNumberRef)))
-}
-
-var xCFNumberRef C.CFNumberRef
-
-func testCFDateRef() {
-	xCFDateRef = C.CFDateCreate(C.kCFAllocatorSystemDefault, 0) // 0 value is 1 Jan 2001 00:00:00 GMT
-	//fmt.Printf("CFDateRef: %x\n", uintptr(unsafe.Pointer(xCFDateRef)))
-}
-
-var xCFDateRef C.CFDateRef
-
-func testCFBooleanRef() {
-	xCFBooleanRef = C.kCFBooleanFalse
-	//fmt.Printf("CFBooleanRef: %x\n", uintptr(unsafe.Pointer(xCFBooleanRef)))
-}
-
-var xCFBooleanRef C.CFBooleanRef
diff --git a/misc/cgo/test/issue21897b.go b/misc/cgo/test/issue21897b.go
deleted file mode 100644
index 50aece3..0000000
--- a/misc/cgo/test/issue21897b.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2017 The Go 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:build !darwin || !cgo || internal
-// +build !darwin !cgo internal
-
-package cgotest
-
-import "testing"
-
-func test21897(t *testing.T) {
-	t.Skip("test runs only on darwin+cgo")
-}
diff --git a/misc/cgo/test/issue23555.go b/misc/cgo/test/issue23555.go
deleted file mode 100644
index e84c23c..0000000
--- a/misc/cgo/test/issue23555.go
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2018 The Go 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 we can have two identical cgo packages in a single binary.
-// No runtime test; just make sure it compiles.
-
-package cgotest
-
-import (
-	_ "misc/cgo/test/issue23555a"
-	_ "misc/cgo/test/issue23555b"
-)
diff --git a/misc/cgo/test/issue24161_darwin_test.go b/misc/cgo/test/issue24161_darwin_test.go
deleted file mode 100644
index 7bb2af6..0000000
--- a/misc/cgo/test/issue24161_darwin_test.go
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-import (
-	"testing"
-
-	"misc/cgo/test/issue24161arg"
-	"misc/cgo/test/issue24161e0"
-	"misc/cgo/test/issue24161e1"
-	"misc/cgo/test/issue24161e2"
-	"misc/cgo/test/issue24161res"
-)
-
-func Test24161Arg(t *testing.T) {
-	issue24161arg.Test(t)
-}
-func Test24161Res(t *testing.T) {
-	issue24161res.Test(t)
-}
-func Test24161Example0(t *testing.T) {
-	issue24161e0.Test(t)
-}
-func Test24161Example1(t *testing.T) {
-	issue24161e1.Test(t)
-}
-func Test24161Example2(t *testing.T) {
-	issue24161e2.Test(t)
-}
diff --git a/misc/cgo/test/issue24161arg/def.go b/misc/cgo/test/issue24161arg/def.go
deleted file mode 100644
index d33479a..0000000
--- a/misc/cgo/test/issue24161arg/def.go
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2018 The Go 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 issue24161arg
-
-/*
-#cgo LDFLAGS: -framework CoreFoundation
-#include <CoreFoundation/CoreFoundation.h>
-*/
-import "C"
-
-func test24161array() C.CFArrayRef {
-	return C.CFArrayCreate(0, nil, 0, nil)
-}
diff --git a/misc/cgo/test/issue24161arg/use.go b/misc/cgo/test/issue24161arg/use.go
deleted file mode 100644
index 3e74944..0000000
--- a/misc/cgo/test/issue24161arg/use.go
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright 2018 The Go 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 issue24161arg
-
-/*
-#cgo LDFLAGS: -framework CoreFoundation
-#include <CoreFoundation/CoreFoundation.h>
-*/
-import "C"
-import "testing"
-
-func Test(t *testing.T) {
-	a := test24161array()
-	C.CFArrayCreateCopy(0, a)
-}
diff --git a/misc/cgo/test/issue24161e0/main.go b/misc/cgo/test/issue24161e0/main.go
deleted file mode 100644
index efe5345..0000000
--- a/misc/cgo/test/issue24161e0/main.go
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2018 The Go 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 issue24161e0
-
-/*
-#cgo CFLAGS: -x objective-c
-#cgo LDFLAGS: -framework CoreFoundation -framework Security
-#include <TargetConditionals.h>
-#include <CoreFoundation/CoreFoundation.h>
-#include <Security/Security.h>
-#if TARGET_OS_IPHONE == 0 && __MAC_OS_X_VERSION_MAX_ALLOWED < 101200
-  typedef CFStringRef SecKeyAlgorithm;
-  static CFDataRef SecKeyCreateSignature(SecKeyRef key, SecKeyAlgorithm algorithm, CFDataRef dataToSign, CFErrorRef *error){return NULL;}
-  #define kSecKeyAlgorithmECDSASignatureDigestX962SHA1 foo()
-  static SecKeyAlgorithm foo(void){return NULL;}
-#endif
-*/
-import "C"
-import "testing"
-
-func f1() {
-	C.SecKeyCreateSignature(0, C.kSecKeyAlgorithmECDSASignatureDigestX962SHA1, 0, nil)
-}
-
-func Test(t *testing.T) {}
diff --git a/misc/cgo/test/issue24161e1/main.go b/misc/cgo/test/issue24161e1/main.go
deleted file mode 100644
index 82bf172..0000000
--- a/misc/cgo/test/issue24161e1/main.go
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2018 The Go 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 issue24161e1
-
-/*
-#cgo CFLAGS: -x objective-c
-#cgo LDFLAGS: -framework CoreFoundation -framework Security
-#include <TargetConditionals.h>
-#include <CoreFoundation/CoreFoundation.h>
-#include <Security/Security.h>
-#if TARGET_OS_IPHONE == 0 && __MAC_OS_X_VERSION_MAX_ALLOWED < 101200
-  typedef CFStringRef SecKeyAlgorithm;
-  static CFDataRef SecKeyCreateSignature(SecKeyRef key, SecKeyAlgorithm algorithm, CFDataRef dataToSign, CFErrorRef *error){return NULL;}
-  #define kSecKeyAlgorithmECDSASignatureDigestX962SHA1 foo()
-  static SecKeyAlgorithm foo(void){return NULL;}
-#endif
-*/
-import "C"
-import (
-	"fmt"
-	"testing"
-)
-
-func f1() {
-	C.SecKeyCreateSignature(0, C.kSecKeyAlgorithmECDSASignatureDigestX962SHA1, 0, nil)
-}
-
-func f2(e C.CFErrorRef) {
-	if desc := C.CFErrorCopyDescription(e); desc != 0 {
-		fmt.Println(desc)
-	}
-}
-
-func Test(t *testing.T) {}
diff --git a/misc/cgo/test/issue24161e2/main.go b/misc/cgo/test/issue24161e2/main.go
deleted file mode 100644
index 82d2ec1..0000000
--- a/misc/cgo/test/issue24161e2/main.go
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2018 The Go 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 issue24161e2
-
-/*
-#cgo CFLAGS: -x objective-c
-#cgo LDFLAGS: -framework CoreFoundation -framework Security
-#include <TargetConditionals.h>
-#include <CoreFoundation/CoreFoundation.h>
-#include <Security/Security.h>
-#if TARGET_OS_IPHONE == 0 && __MAC_OS_X_VERSION_MAX_ALLOWED < 101200
-  typedef CFStringRef SecKeyAlgorithm;
-  static CFDataRef SecKeyCreateSignature(SecKeyRef key, SecKeyAlgorithm algorithm, CFDataRef dataToSign, CFErrorRef *error){return NULL;}
-  #define kSecKeyAlgorithmECDSASignatureDigestX962SHA1 foo()
-  static SecKeyAlgorithm foo(void){return NULL;}
-#endif
-*/
-import "C"
-import (
-	"fmt"
-	"testing"
-)
-
-var _ C.CFStringRef
-
-func f1() {
-	C.SecKeyCreateSignature(0, C.kSecKeyAlgorithmECDSASignatureDigestX962SHA1, 0, nil)
-}
-
-func f2(e C.CFErrorRef) {
-	if desc := C.CFErrorCopyDescription(e); desc != 0 {
-		fmt.Println(desc)
-	}
-}
-
-func Test(t *testing.T) {}
diff --git a/misc/cgo/test/issue24161res/restype.go b/misc/cgo/test/issue24161res/restype.go
deleted file mode 100644
index e5719f2..0000000
--- a/misc/cgo/test/issue24161res/restype.go
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2018 The Go 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 issue24161res
-
-/*
-#cgo LDFLAGS: -framework CoreFoundation
-#include <CoreFoundation/CoreFoundation.h>
-*/
-import "C"
-import (
-	"reflect"
-	"testing"
-)
-
-func Test(t *testing.T) {
-	if k := reflect.TypeOf(C.CFArrayCreate(0, nil, 0, nil)).Kind(); k != reflect.Uintptr {
-		t.Fatalf("bad kind %s\n", k)
-	}
-}
diff --git a/misc/cgo/test/issue26430.go b/misc/cgo/test/issue26430.go
deleted file mode 100644
index b551939..0000000
--- a/misc/cgo/test/issue26430.go
+++ /dev/null
@@ -1,10 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Issue 26430: incomplete typedef leads to inconsistent typedefs error.
-// No runtime test; just make sure it compiles.
-
-package cgotest
-
-import _ "misc/cgo/test/issue26430"
diff --git a/misc/cgo/test/issue26743.go b/misc/cgo/test/issue26743.go
deleted file mode 100644
index 716f2e4..0000000
--- a/misc/cgo/test/issue26743.go
+++ /dev/null
@@ -1,10 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Issue 26743: typedef of uint leads to inconsistent typedefs error.
-// No runtime test; just make sure it compiles.
-
-package cgotest
-
-import _ "misc/cgo/test/issue26743"
diff --git a/misc/cgo/test/issue27340.go b/misc/cgo/test/issue27340.go
deleted file mode 100644
index 2c51088..0000000
--- a/misc/cgo/test/issue27340.go
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Failed to resolve typedefs consistently.
-// No runtime test; just make sure it compiles.
-
-package cgotest
-
-import "misc/cgo/test/issue27340"
-
-var issue27340Var = issue27340.Issue27340GoFunc
diff --git a/misc/cgo/test/issue29563.go b/misc/cgo/test/issue29563.go
deleted file mode 100644
index 9f29da4..0000000
--- a/misc/cgo/test/issue29563.go
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2019 The Go 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:build !windows
-// +build !windows
-
-// Issue 29563: internal linker fails on duplicate weak symbols.
-// No runtime test; just make sure it compiles.
-
-package cgotest
-
-import _ "misc/cgo/test/issue29563"
diff --git a/misc/cgo/test/issue30527.go b/misc/cgo/test/issue30527.go
deleted file mode 100644
index e0e18be..0000000
--- a/misc/cgo/test/issue30527.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2019 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Issue 30527: function call rewriting casts untyped
-// constants to int because of ":=" usage.
-
-package cgotest
-
-import "misc/cgo/test/issue30527"
-
-func issue30527G() {
-	issue30527.G(nil)
-}
diff --git a/misc/cgo/test/issue4029.c b/misc/cgo/test/issue4029.c
deleted file mode 100644
index e79c5a7..0000000
--- a/misc/cgo/test/issue4029.c
+++ /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 !windows,!static
-// +build !darwin !internal_pie,!arm64
-
-#include <stdint.h>
-#include <dlfcn.h>
-
-// Write our own versions of dlopen/dlsym/dlclose so that we represent
-// the opaque handle as a Go uintptr rather than a Go pointer to avoid
-// garbage collector confusion.  See issue 23663.
-
-uintptr_t dlopen4029(char* name, int flags) {
-	return (uintptr_t)(dlopen(name, flags));
-}
-
-uintptr_t dlsym4029(uintptr_t handle, char* name) {
-	return (uintptr_t)(dlsym((void*)(handle), name));
-}
-
-int dlclose4029(uintptr_t handle) {
-	return dlclose((void*)(handle));
-}
-
-void call4029(void *arg) {
-	void (*fn)(void) = arg;
-	fn();
-}
diff --git a/misc/cgo/test/issue4029.go b/misc/cgo/test/issue4029.go
deleted file mode 100644
index 90ca08c..0000000
--- a/misc/cgo/test/issue4029.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.
-
-//go:build !windows && !static && (!darwin || (!internal_pie && !arm64))
-// +build !windows
-// +build !static
-// +build !darwin !internal_pie,!arm64
-
-// Excluded in darwin internal linking PIE mode, as dynamic export is not
-// supported.
-// Excluded in internal linking mode on darwin/arm64, as it is always PIE.
-
-package cgotest
-
-/*
-#include <stdint.h>
-#include <dlfcn.h>
-#cgo linux LDFLAGS: -ldl
-
-extern uintptr_t dlopen4029(char*, int);
-extern uintptr_t dlsym4029(uintptr_t, char*);
-extern int dlclose4029(uintptr_t);
-
-extern void call4029(uintptr_t arg);
-*/
-import "C"
-
-import (
-	"testing"
-)
-
-var callbacks int
-
-//export IMPIsOpaque
-func IMPIsOpaque() {
-	callbacks++
-}
-
-//export IMPInitWithFrame
-func IMPInitWithFrame() {
-	callbacks++
-}
-
-//export IMPDrawRect
-func IMPDrawRect() {
-	callbacks++
-}
-
-//export IMPWindowResize
-func IMPWindowResize() {
-	callbacks++
-}
-
-func test4029(t *testing.T) {
-	loadThySelf(t, "IMPWindowResize")
-	loadThySelf(t, "IMPDrawRect")
-	loadThySelf(t, "IMPInitWithFrame")
-	loadThySelf(t, "IMPIsOpaque")
-	if callbacks != 4 {
-		t.Errorf("got %d callbacks, expected 4", callbacks)
-	}
-}
-
-func loadThySelf(t *testing.T, symbol string) {
-	this_process := C.dlopen4029(nil, C.RTLD_NOW)
-	if this_process == 0 {
-		t.Error("dlopen:", C.GoString(C.dlerror()))
-		return
-	}
-	defer C.dlclose4029(this_process)
-
-	symbol_address := C.dlsym4029(this_process, C.CString(symbol))
-	if symbol_address == 0 {
-		t.Error("dlsym:", C.GoString(C.dlerror()))
-		return
-	}
-	t.Log(symbol, symbol_address)
-	C.call4029(symbol_address)
-}
diff --git a/misc/cgo/test/issue4029w.go b/misc/cgo/test/issue4029w.go
deleted file mode 100644
index c2f5948..0000000
--- a/misc/cgo/test/issue4029w.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.
-
-//go:build windows || static || (darwin && internal_pie) || (darwin && arm64)
-// +build windows static darwin,internal_pie darwin,arm64
-
-package cgotest
-
-import "testing"
-
-func test4029(t *testing.T) {
-}
diff --git a/misc/cgo/test/issue41761.go b/misc/cgo/test/issue41761.go
deleted file mode 100644
index ed45b46..0000000
--- a/misc/cgo/test/issue41761.go
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2020 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-/*
-   typedef struct S41761 S41761;
-*/
-import "C"
-
-import (
-	"misc/cgo/test/issue41761a"
-	"testing"
-)
-
-func test41761(t *testing.T) {
-	var x issue41761a.T
-	_ = (*C.struct_S41761)(x.X)
-}
diff --git a/misc/cgo/test/issue42018.go b/misc/cgo/test/issue42018.go
deleted file mode 100644
index fab686a..0000000
--- a/misc/cgo/test/issue42018.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2021 The Go 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:build !windows
-// +build !windows
-
-package cgotest
-
-import "testing"
-
-func test42018(t *testing.T) {
-	t.Skip("skipping Windows-only test")
-}
diff --git a/misc/cgo/test/issue43639.go b/misc/cgo/test/issue43639.go
deleted file mode 100644
index 41e1471..0000000
--- a/misc/cgo/test/issue43639.go
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright 2021 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-// Issue 43639: No runtime test needed, make sure package misc/cgo/test/issue43639 compiles well.
-
-import _ "misc/cgo/test/issue43639"
diff --git a/misc/cgo/test/issue52611.go b/misc/cgo/test/issue52611.go
deleted file mode 100644
index 2b59d52..0000000
--- a/misc/cgo/test/issue52611.go
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2022 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Issue 52611: inconsistent compiler behaviour when compiling a C.struct.
-// No runtime test; just make sure it compiles.
-
-package cgotest
-
-import (
-	_ "misc/cgo/test/issue52611a"
-	_ "misc/cgo/test/issue52611b"
-)
diff --git a/misc/cgo/test/issue6997_linux.c b/misc/cgo/test/issue6997_linux.c
deleted file mode 100644
index de803d2..0000000
--- a/misc/cgo/test/issue6997_linux.c
+++ /dev/null
@@ -1,28 +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 !android
-
-#include <pthread.h>
-#include <stdio.h>
-#include <unistd.h>
-
-static pthread_t thread;
-
-static void* threadfunc(void* dummy) {
-	while(1) {
-		sleep(1);
-	}
-}
-
-int StartThread() {
-	return pthread_create(&thread, NULL, &threadfunc, NULL);
-}
-
-int CancelThread() {
-	void *r;
-	pthread_cancel(thread);
-	pthread_join(thread, &r);
-	return (r == PTHREAD_CANCELED);
-}
diff --git a/misc/cgo/test/issue6997_linux.go b/misc/cgo/test/issue6997_linux.go
deleted file mode 100644
index 4acc8c1..0000000
--- a/misc/cgo/test/issue6997_linux.go
+++ /dev/null
@@ -1,45 +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:build !android
-// +build !android
-
-// Test that pthread_cancel works as expected
-// (NPTL uses SIGRTMIN to implement thread cancellation)
-// See https://golang.org/issue/6997
-package cgotest
-
-/*
-#cgo CFLAGS: -pthread
-#cgo LDFLAGS: -pthread
-extern int StartThread();
-extern int CancelThread();
-*/
-import "C"
-
-import (
-	"testing"
-	"time"
-)
-
-func test6997(t *testing.T) {
-	r := C.StartThread()
-	if r != 0 {
-		t.Error("pthread_create failed")
-	}
-	c := make(chan C.int)
-	go func() {
-		time.Sleep(500 * time.Millisecond)
-		c <- C.CancelThread()
-	}()
-
-	select {
-	case r = <-c:
-		if r == 0 {
-			t.Error("pthread finished but wasn't canceled??")
-		}
-	case <-time.After(30 * time.Second):
-		t.Error("hung in pthread_cancel/pthread_join")
-	}
-}
diff --git a/misc/cgo/test/issue8517.go b/misc/cgo/test/issue8517.go
deleted file mode 100644
index 7316ab0..0000000
--- a/misc/cgo/test/issue8517.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.
-
-//go:build !windows
-// +build !windows
-
-package cgotest
-
-import "testing"
-
-func test8517(t *testing.T) {
-	t.Skip("skipping windows only test")
-}
diff --git a/misc/cgo/test/issue8694.go b/misc/cgo/test/issue8694.go
deleted file mode 100644
index 19071ce..0000000
--- a/misc/cgo/test/issue8694.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.
-
-//go:build !android
-// +build !android
-
-package cgotest
-
-/*
-#include <complex.h>
-
-complex float complexFloatSquared(complex float a) { return a*a; }
-complex double complexDoubleSquared(complex double a) { return a*a; }
-*/
-import "C"
-
-import (
-	"runtime"
-	"testing"
-)
-
-func test8694(t *testing.T) {
-	if runtime.GOARCH == "arm" {
-		t.Skip("test8694 is disabled on ARM because 5l cannot handle thumb library.")
-	}
-	// Really just testing that this compiles, but check answer anyway.
-	x := C.complexfloat(2 + 3i)
-	x2 := x * x
-	cx2 := C.complexFloatSquared(x)
-	if cx2 != x2 {
-		t.Errorf("C.complexFloatSquared(%v) = %v, want %v", x, cx2, x2)
-	}
-
-	y := C.complexdouble(2 + 3i)
-	y2 := y * y
-	cy2 := C.complexDoubleSquared(y)
-	if cy2 != y2 {
-		t.Errorf("C.complexDoubleSquared(%v) = %v, want %v", y, cy2, y2)
-	}
-}
diff --git a/misc/cgo/test/issue8756.go b/misc/cgo/test/issue8756.go
deleted file mode 100644
index 08099dc..0000000
--- a/misc/cgo/test/issue8756.go
+++ /dev/null
@@ -1,17 +0,0 @@
-package cgotest
-
-/*
-#cgo LDFLAGS: -lm
-#include <math.h>
-*/
-import "C"
-import (
-	"testing"
-
-	"misc/cgo/test/issue8756"
-)
-
-func test8756(t *testing.T) {
-	issue8756.Pow()
-	C.pow(1, 2)
-}
diff --git a/misc/cgo/test/issue8756/issue8756.go b/misc/cgo/test/issue8756/issue8756.go
deleted file mode 100644
index 5f6b777..0000000
--- a/misc/cgo/test/issue8756/issue8756.go
+++ /dev/null
@@ -1,11 +0,0 @@
-package issue8756
-
-/*
-#cgo LDFLAGS: -lm
-#include <math.h>
-*/
-import "C"
-
-func Pow() {
-	C.pow(1, 2)
-}
diff --git a/misc/cgo/test/issue8828.go b/misc/cgo/test/issue8828.go
deleted file mode 100644
index 3b5765d..0000000
--- a/misc/cgo/test/issue8828.go
+++ /dev/null
@@ -1,16 +0,0 @@
-// compile
-
-// 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.
-
-// Issue 8828: compiling a file with -compiler=gccgo fails if a .c file
-// has the same name as compiled directory.
-
-package cgotest
-
-import "misc/cgo/test/issue8828"
-
-func p() {
-	issue8828.Bar()
-}
diff --git a/misc/cgo/test/issue9026.go b/misc/cgo/test/issue9026.go
deleted file mode 100644
index a30196c..0000000
--- a/misc/cgo/test/issue9026.go
+++ /dev/null
@@ -1,9 +0,0 @@
-package cgotest
-
-import (
-	"testing"
-
-	"misc/cgo/test/issue9026"
-)
-
-func test9026(t *testing.T) { issue9026.Test(t) }
diff --git a/misc/cgo/test/issue9400/asm_386.s b/misc/cgo/test/issue9400/asm_386.s
deleted file mode 100644
index 96b8b60..0000000
--- a/misc/cgo/test/issue9400/asm_386.s
+++ /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 gc
-
-#include "textflag.h"
-
-TEXT ·RewindAndSetgid(SB),NOSPLIT,$0-0
-	MOVL	$·Baton(SB), BX
-	// Rewind stack pointer so anything that happens on the stack
-	// will clobber the test pattern created by the caller
-	ADDL	$(1024 * 8), SP
-
-	// Ask signaller to setgid
-	MOVL	$1, (BX)
-
-	// Wait for setgid completion
-loop:
-	PAUSE
-	MOVL	(BX), AX
-	CMPL	AX, $0
-	JNE	loop
-
-	// Restore stack
-	SUBL	$(1024 * 8), SP
-	RET
diff --git a/misc/cgo/test/issue9400/asm_amd64x.s b/misc/cgo/test/issue9400/asm_amd64x.s
deleted file mode 100644
index 99509bc..0000000
--- a/misc/cgo/test/issue9400/asm_amd64x.s
+++ /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 amd64 amd64p32
-// +build gc
-
-#include "textflag.h"
-
-TEXT ·RewindAndSetgid(SB),NOSPLIT,$0-0
-	// Rewind stack pointer so anything that happens on the stack
-	// will clobber the test pattern created by the caller
-	ADDQ	$(1024 * 8), SP
-
-	// Ask signaller to setgid
-	MOVL	$1, ·Baton(SB)
-
-	// Wait for setgid completion
-loop:
-	PAUSE
-	MOVL	·Baton(SB), AX
-	CMPL	AX, $0
-	JNE	loop
-
-	// Restore stack
-	SUBQ	$(1024 * 8), SP
-	RET
diff --git a/misc/cgo/test/issue9400/asm_arm.s b/misc/cgo/test/issue9400/asm_arm.s
deleted file mode 100644
index cc92856..0000000
--- a/misc/cgo/test/issue9400/asm_arm.s
+++ /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.
-
-// +build gc
-
-#include "textflag.h"
-
-TEXT cas<>(SB),NOSPLIT,$0
-	MOVW	$0xffff0fc0, R15 // R15 is PC
-
-TEXT ·RewindAndSetgid(SB),NOSPLIT|NOFRAME,$0-0
-	// Save link register
-	MOVW	R14, R4
-
-	// Rewind stack pointer so anything that happens on the stack
-	// will clobber the test pattern created by the caller
-	ADD	$(1024 * 8), R13
-
-	// Ask signaller to setgid
-	MOVW	$·Baton(SB), R2
-storeloop:
-	MOVW	0(R2), R0
-	MOVW	$1, R1
-	BL	cas<>(SB)
-	BCC	storeloop
-
-	// Wait for setgid completion
-loop:
-	MOVW	$0, R0
-	MOVW	$0, R1
-	BL	cas<>(SB)
-	BCC	loop
-
-	// Restore stack
-	SUB	$(1024 * 8), R13
-
-	MOVW	R4, R14
-	RET
diff --git a/misc/cgo/test/issue9400/asm_arm64.s b/misc/cgo/test/issue9400/asm_arm64.s
deleted file mode 100644
index 2565793..0000000
--- a/misc/cgo/test/issue9400/asm_arm64.s
+++ /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.
-
-// +build gc
-
-#include "textflag.h"
-
-TEXT ·RewindAndSetgid(SB),NOSPLIT|NOFRAME,$0-0
-	// Save link register
-	MOVD	R30, R9
-
-	// Rewind stack pointer so anything that happens on the stack
-	// will clobber the test pattern created by the caller
-	ADD	$(1024 * 8), RSP
-
-	// Ask signaller to setgid
-	MOVD	$·Baton(SB), R0
-	MOVD	$1, R1
-storeloop:
-	LDAXRW	(R0), R2
-	STLXRW	R1, (R0), R3
-	CBNZ	R3, storeloop
-
-	// Wait for setgid completion
-	MOVW	$0, R1
-	MOVW	$0, R2
-loop:
-	LDAXRW	(R0), R3
-	CMPW	R1, R3
-	BNE	loop
-	STLXRW	R2, (R0), R3
-	CBNZ	R3, loop
-
-	// Restore stack
-	SUB	$(1024 * 8), RSP
-
-	MOVD	R9, R30
-	RET
diff --git a/misc/cgo/test/issue9400/asm_mips64x.s b/misc/cgo/test/issue9400/asm_mips64x.s
deleted file mode 100644
index 693231d..0000000
--- a/misc/cgo/test/issue9400/asm_mips64x.s
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2016 The Go 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 mips64 mips64le
-// +build gc
-
-#include "textflag.h"
-
-#define SYNC	WORD $0xf
-
-TEXT ·RewindAndSetgid(SB),NOSPLIT|NOFRAME,$0-0
-	// Rewind stack pointer so anything that happens on the stack
-	// will clobber the test pattern created by the caller
-	ADDV	$(1024*8), R29
-
-	// Ask signaller to setgid
-	MOVW	$1, R1
-	SYNC
-	MOVW	R1, ·Baton(SB)
-	SYNC
-
-	// Wait for setgid completion
-loop:
-	SYNC
-	MOVW	·Baton(SB), R1
-	OR	R2, R2, R2	// hint that we're in a spin loop
-	BNE	R1, loop
-	SYNC
-
-	// Restore stack
-	ADDV	$(-1024*8), R29
-	RET
diff --git a/misc/cgo/test/issue9400/asm_mipsx.s b/misc/cgo/test/issue9400/asm_mipsx.s
deleted file mode 100644
index 63261bb..0000000
--- a/misc/cgo/test/issue9400/asm_mipsx.s
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2016 The Go 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 mips mipsle
-// +build gc
-
-#include "textflag.h"
-
-TEXT ·RewindAndSetgid(SB),NOSPLIT|NOFRAME,$0-0
-	// Rewind stack pointer so anything that happens on the stack
-	// will clobber the test pattern created by the caller
-	ADDU	$(1024*8), R29
-
-	// Ask signaller to setgid
-	MOVW	$1, R1
-	SYNC
-	MOVW	R1, ·Baton(SB)
-	SYNC
-
-	// Wait for setgid completion
-loop:
-	SYNC
-	MOVW	·Baton(SB), R1
-	OR	R2, R2, R2	// hint that we're in a spin loop
-	BNE	R1, loop
-	SYNC
-
-	// Restore stack
-	ADDU	$(-1024*8), R29
-	RET
diff --git a/misc/cgo/test/issue9400/asm_ppc64x.s b/misc/cgo/test/issue9400/asm_ppc64x.s
deleted file mode 100644
index b5613fb..0000000
--- a/misc/cgo/test/issue9400/asm_ppc64x.s
+++ /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.
-
-// +build ppc64 ppc64le
-// +build gc
-
-#include "textflag.h"
-
-TEXT ·RewindAndSetgid(SB),NOSPLIT|NOFRAME,$0-0
-	// Rewind stack pointer so anything that happens on the stack
-	// will clobber the test pattern created by the caller
-	ADD	$(1024 * 8), R1
-
-	// Ask signaller to setgid
-	MOVW	$1, R3
-	SYNC
-	MOVW	R3, ·Baton(SB)
-
-	// Wait for setgid completion
-loop:
-	SYNC
-	MOVW	·Baton(SB), R3
-	CMP	R3, $0
-	// Hint that we're in a spin loop
-	OR	R1, R1, R1
-	BNE	loop
-	ISYNC
-
-	// Restore stack
-	SUB	$(1024 * 8), R1
-	RET
diff --git a/misc/cgo/test/issue9400/asm_riscv64.s b/misc/cgo/test/issue9400/asm_riscv64.s
deleted file mode 100644
index 244dada..0000000
--- a/misc/cgo/test/issue9400/asm_riscv64.s
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2020 The Go 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 riscv64
-// +build gc
-
-#include "textflag.h"
-
-TEXT ·RewindAndSetgid(SB),NOSPLIT|NOFRAME,$0-0
-	// Rewind stack pointer so anything that happens on the stack
-	// will clobber the test pattern created by the caller
-	ADD	$(1024*8), X2
-
-	// Ask signaller to setgid
-	MOV	$1, X5
-	FENCE
-	MOVW	X5, ·Baton(SB)
-	FENCE
-
-	// Wait for setgid completion
-loop:
-	FENCE
-	MOVW	·Baton(SB), X5
-	OR	X6, X6, X6	// hint that we're in a spin loop
-	BNE	ZERO, X5, loop
-	FENCE
-
-	// Restore stack
-	ADD	$(-1024*8), X2
-	RET
diff --git a/misc/cgo/test/issue9400/asm_s390x.s b/misc/cgo/test/issue9400/asm_s390x.s
deleted file mode 100644
index 4856492..0000000
--- a/misc/cgo/test/issue9400/asm_s390x.s
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2016 The Go 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 gc
-
-#include "textflag.h"
-
-TEXT ·RewindAndSetgid(SB),NOSPLIT,$0-0
-	// Rewind stack pointer so anything that happens on the stack
-	// will clobber the test pattern created by the caller
-	ADD	$(1024 * 8), R15
-
-	// Ask signaller to setgid
-	MOVD	$·Baton(SB), R5
-	MOVW	$1, 0(R5)
-
-	// Wait for setgid completion
-loop:
-	SYNC
-	MOVW	·Baton(SB), R3
-	CMPBNE	R3, $0, loop
-
-	// Restore stack
-	SUB	$(1024 * 8), R15
-	RET
diff --git a/misc/cgo/test/issue9400/gccgo.go b/misc/cgo/test/issue9400/gccgo.go
deleted file mode 100644
index a9b62b0..0000000
--- a/misc/cgo/test/issue9400/gccgo.go
+++ /dev/null
@@ -1,26 +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 gccgo
-
-package issue9400
-
-import (
-	"runtime"
-	"sync/atomic"
-)
-
-// The test for the gc compiler resets the stack pointer so that the
-// stack gets modified.  We don't have a way to do that for gccgo
-// without writing more assembly code, which we haven't bothered to
-// do.  So this is not much of a test.
-
-var Baton int32
-
-func RewindAndSetgid() {
-	atomic.StoreInt32(&Baton, 1)
-	for atomic.LoadInt32(&Baton) != 0 {
-		runtime.Gosched()
-	}
-}
diff --git a/misc/cgo/test/issue9400/stubs.go b/misc/cgo/test/issue9400/stubs.go
deleted file mode 100644
index e431c5a..0000000
--- a/misc/cgo/test/issue9400/stubs.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 gc
-
-package issue9400
-
-var Baton int32
-
-func RewindAndSetgid()
diff --git a/misc/cgo/test/issue9400_linux.go b/misc/cgo/test/issue9400_linux.go
deleted file mode 100644
index 38fa9dd..0000000
--- a/misc/cgo/test/issue9400_linux.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.
-
-// Test that SIGSETXID runs on signal stack, since it's likely to
-// overflow if it runs on the Go stack.
-
-package cgotest
-
-/*
-#include <sys/types.h>
-#include <unistd.h>
-*/
-import "C"
-
-import (
-	"runtime"
-	"runtime/debug"
-	"sync/atomic"
-	"testing"
-
-	"misc/cgo/test/issue9400"
-)
-
-func test9400(t *testing.T) {
-	// We synchronize through a shared variable, so we need two procs
-	defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(2))
-
-	// Start signaller
-	atomic.StoreInt32(&issue9400.Baton, 0)
-	go func() {
-		// Wait for RewindAndSetgid
-		for atomic.LoadInt32(&issue9400.Baton) == 0 {
-			runtime.Gosched()
-		}
-		// Broadcast SIGSETXID
-		runtime.LockOSThread()
-		C.setgid(0)
-		// Indicate that signalling is done
-		atomic.StoreInt32(&issue9400.Baton, 0)
-	}()
-
-	// Grow the stack and put down a test pattern
-	const pattern = 0x123456789abcdef
-	var big [1024]uint64 // len must match assembly
-	for i := range big {
-		big[i] = pattern
-	}
-
-	// Disable GC for the duration of the test.
-	// This avoids a potential GC deadlock when spinning in uninterruptable ASM below #49695.
-	defer debug.SetGCPercent(debug.SetGCPercent(-1))
-	// SetGCPercent waits until the mark phase is over, but the runtime
-	// also preempts at the start of the sweep phase, so make sure that's
-	// done too. See #49695.
-	runtime.GC()
-
-	// Temporarily rewind the stack and trigger SIGSETXID
-	issue9400.RewindAndSetgid()
-
-	// Check test pattern
-	for i := range big {
-		if big[i] != pattern {
-			t.Fatalf("entry %d of test pattern is wrong; %#x != %#x", i, big[i], uint64(pattern))
-		}
-	}
-}
diff --git a/misc/cgo/test/issue9510.go b/misc/cgo/test/issue9510.go
deleted file mode 100644
index 325b0cf..0000000
--- a/misc/cgo/test/issue9510.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.
-
-// Test that we can link together two different cgo packages that both
-// use the same libgcc function.
-
-package cgotest
-
-import (
-	"runtime"
-	"testing"
-
-	"misc/cgo/test/issue9510a"
-	"misc/cgo/test/issue9510b"
-)
-
-func test9510(t *testing.T) {
-	if runtime.GOARCH == "arm" {
-		t.Skip("skipping because libgcc may be a Thumb library")
-	}
-	issue9510a.F(1, 1)
-	issue9510b.F(1, 1)
-}
diff --git a/misc/cgo/test/sigaltstack.go b/misc/cgo/test/sigaltstack.go
deleted file mode 100644
index 6b37189..0000000
--- a/misc/cgo/test/sigaltstack.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.
-
-//go:build !windows && !android
-// +build !windows,!android
-
-// Test that the Go runtime still works if C code changes the signal stack.
-
-package cgotest
-
-/*
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#ifdef _AIX
-// On AIX, SIGSTKSZ is too small to handle Go sighandler.
-#define CSIGSTKSZ 0x4000
-#else
-#define CSIGSTKSZ SIGSTKSZ
-#endif
-
-static stack_t oss;
-static char signalStack[CSIGSTKSZ];
-
-static void changeSignalStack(void) {
-	stack_t ss;
-	memset(&ss, 0, sizeof ss);
-	ss.ss_sp = signalStack;
-	ss.ss_flags = 0;
-	ss.ss_size = CSIGSTKSZ;
-	if (sigaltstack(&ss, &oss) < 0) {
-		perror("sigaltstack");
-		abort();
-	}
-}
-
-static void restoreSignalStack(void) {
-#if (defined(__x86_64__) || defined(__i386__)) && defined(__APPLE__)
-	// The Darwin C library enforces a minimum that the kernel does not.
-	// This is OK since we allocated this much space in mpreinit,
-	// it was just removed from the buffer by stackalloc.
-	oss.ss_size = MINSIGSTKSZ;
-#endif
-	if (sigaltstack(&oss, NULL) < 0) {
-		perror("sigaltstack restore");
-		abort();
-	}
-}
-
-static int zero(void) {
-	return 0;
-}
-*/
-import "C"
-
-import (
-	"runtime"
-	"testing"
-)
-
-func testSigaltstack(t *testing.T) {
-	switch {
-	case runtime.GOOS == "solaris", runtime.GOOS == "illumos", runtime.GOOS == "ios" && runtime.GOARCH == "arm64":
-		t.Skipf("switching signal stack not implemented on %s/%s", runtime.GOOS, runtime.GOARCH)
-	}
-
-	C.changeSignalStack()
-	defer C.restoreSignalStack()
-	defer func() {
-		if recover() == nil {
-			t.Error("did not see expected panic")
-		}
-	}()
-	v := 1 / int(C.zero())
-	t.Errorf("unexpected success of division by zero == %d", v)
-}
diff --git a/misc/cgo/test/sigprocmask.c b/misc/cgo/test/sigprocmask.c
deleted file mode 100644
index e77ba5b..0000000
--- a/misc/cgo/test/sigprocmask.c
+++ /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 !windows
-
-#include <errno.h>
-#include <signal.h>
-#include <stdlib.h>
-#include <pthread.h>
-#include <stdio.h>
-#include <time.h>
-#include <unistd.h>
-
-extern void IntoGoAndBack();
-
-int CheckBlocked() {
-	sigset_t mask;
-	sigprocmask(SIG_BLOCK, NULL, &mask);
-	return sigismember(&mask, SIGIO);
-}
-
-static void* sigthreadfunc(void* unused) {
-	sigset_t mask;
-	sigemptyset(&mask);
-	sigaddset(&mask, SIGIO);
-	sigprocmask(SIG_BLOCK, &mask, NULL);
-	IntoGoAndBack();
-	return NULL;
-}
-
-int RunSigThread() {
-	int tries;
-	pthread_t thread;
-	int r;
-	struct timespec ts;
-
-	for (tries = 0; tries < 20; tries++) {
-		r = pthread_create(&thread, NULL, &sigthreadfunc, NULL);
-		if (r == 0) {
-			return pthread_join(thread, NULL);
-		}
-		if (r != EAGAIN) {
-			return r;
-		}
-		ts.tv_sec = 0;
-		ts.tv_nsec = (tries + 1) * 1000 * 1000; // Milliseconds.
-		nanosleep(&ts, NULL);
-	}
-	return EAGAIN;
-}
diff --git a/misc/cgo/test/sigprocmask.go b/misc/cgo/test/sigprocmask.go
deleted file mode 100644
index 983734c..0000000
--- a/misc/cgo/test/sigprocmask.go
+++ /dev/null
@@ -1,41 +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:build !windows
-// +build !windows
-
-package cgotest
-
-/*
-#cgo CFLAGS: -pthread
-#cgo LDFLAGS: -pthread
-extern int RunSigThread();
-extern int CheckBlocked();
-*/
-import "C"
-import (
-	"os"
-	"os/signal"
-	"syscall"
-	"testing"
-)
-
-var blocked bool
-
-//export IntoGoAndBack
-func IntoGoAndBack() {
-	// Verify that SIGIO stays blocked on the C thread
-	// even when unblocked for signal.Notify().
-	signal.Notify(make(chan os.Signal), syscall.SIGIO)
-	blocked = C.CheckBlocked() != 0
-}
-
-func testSigprocmask(t *testing.T) {
-	if r := C.RunSigThread(); r != 0 {
-		t.Errorf("pthread_create/pthread_join failed: %d", r)
-	}
-	if !blocked {
-		t.Error("Go runtime unblocked SIGIO")
-	}
-}
diff --git a/misc/cgo/test/test.go b/misc/cgo/test/test.go
deleted file mode 100644
index 9d9b14e..0000000
--- a/misc/cgo/test/test.go
+++ /dev/null
@@ -1,2303 +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.
-
-// Test cases for cgo.
-// Both the import "C" prologue and the main file are sorted by issue number.
-// This file contains C definitions (not just declarations)
-// and so it must NOT contain any //export directives on Go functions.
-// See testx.go for exports.
-
-package cgotest
-
-/*
-#include <complex.h>
-#include <math.h>
-#include <stdarg.h>
-#include <stdbool.h>
-#include <stddef.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <sys/stat.h>
-#include <errno.h>
-#cgo LDFLAGS: -lm
-
-#ifndef WIN32
-#include <pthread.h>
-#include <signal.h>
-#endif
-
-// alignment tests
-
-typedef unsigned char Uint8;
-typedef unsigned short Uint16;
-
-typedef enum {
- MOD1 = 0x0000,
- MODX = 0x8000
-} SDLMod;
-
-typedef enum {
- A1 = 1,
- B1 = 322,
- SDLK_LAST
-} SDLKey;
-
-typedef struct SDL_keysym {
-	Uint8 scancode;
-	SDLKey sym;
-	SDLMod mod;
-	Uint16 unicode;
-} SDL_keysym;
-
-typedef struct SDL_KeyboardEvent {
-	Uint8 typ;
-	Uint8 which;
-	Uint8 state;
-	SDL_keysym keysym;
-} SDL_KeyboardEvent;
-
-void makeEvent(SDL_KeyboardEvent *event) {
- unsigned char *p;
- int i;
-
- p = (unsigned char*)event;
- for (i=0; i<sizeof *event; i++) {
-   p[i] = i;
- }
-}
-
-int same(SDL_KeyboardEvent* e, Uint8 typ, Uint8 which, Uint8 state, Uint8 scan, SDLKey sym, SDLMod mod, Uint16 uni) {
-  return e->typ == typ && e->which == which && e->state == state && e->keysym.scancode == scan && e->keysym.sym == sym && e->keysym.mod == mod && e->keysym.unicode == uni;
-}
-
-void cTest(SDL_KeyboardEvent *event) {
- printf("C: %#x %#x %#x %#x %#x %#x %#x\n", event->typ, event->which, event->state,
-   event->keysym.scancode, event->keysym.sym, event->keysym.mod, event->keysym.unicode);
- fflush(stdout);
-}
-
-// api
-
-const char *greeting = "hello, world";
-
-// basic test cases
-
-#define SHIFT(x, y)  ((x)<<(y))
-#define KILO SHIFT(1, 10)
-#define UINT32VAL 0xc008427bU
-
-enum E {
-	Enum1 = 1,
-	Enum2 = 2,
-};
-
-typedef unsigned char cgo_uuid_t[20];
-
-void uuid_generate(cgo_uuid_t x) {
-	x[0] = 0;
-}
-
-struct S {
-	int x;
-};
-
-const char *cstr = "abcefghijklmnopqrstuvwxyzABCEFGHIJKLMNOPQRSTUVWXYZ1234567890";
-
-extern enum E myConstFunc(struct S* const ctx, int const id, struct S **const filter);
-
-enum E myConstFunc(struct S *const ctx, int const id, struct S **const filter) { return 0; }
-
-int add(int x, int y) {
-	return x+y;
-};
-
-// Following mimicks vulkan complex definitions for benchmarking cgocheck overhead.
-
-typedef uint32_t VkFlags;
-typedef VkFlags  VkDeviceQueueCreateFlags;
-typedef uint32_t VkStructureType;
-
-typedef struct VkDeviceQueueCreateInfo {
-    VkStructureType             sType;
-    const void*                 pNext;
-    VkDeviceQueueCreateFlags    flags;
-    uint32_t                    queueFamilyIndex;
-    uint32_t                    queueCount;
-    const float*                pQueuePriorities;
-} VkDeviceQueueCreateInfo;
-
-typedef struct VkPhysicalDeviceFeatures {
-    uint32_t bools[56];
-} VkPhysicalDeviceFeatures;
-
-typedef struct VkDeviceCreateInfo {
-    VkStructureType                    sType;
-    const void*                        pNext;
-    VkFlags                            flags;
-    uint32_t                           queueCreateInfoCount;
-    const VkDeviceQueueCreateInfo*     pQueueCreateInfos;
-    uint32_t                           enabledLayerCount;
-    const char* const*                 ppEnabledLayerNames;
-    uint32_t                           enabledExtensionCount;
-    const char* const*                 ppEnabledExtensionNames;
-    const VkPhysicalDeviceFeatures*    pEnabledFeatures;
-} VkDeviceCreateInfo;
-
-void handleComplexPointer(VkDeviceCreateInfo *a0) {}
-void handleComplexPointer8(
-	VkDeviceCreateInfo *a0, VkDeviceCreateInfo *a1, VkDeviceCreateInfo *a2, VkDeviceCreateInfo *a3,
-	VkDeviceCreateInfo *a4, VkDeviceCreateInfo *a5, VkDeviceCreateInfo *a6, VkDeviceCreateInfo *a7
-) {}
-
-// complex alignment
-
-struct {
-	float x;
-	_Complex float y;
-} cplxAlign = { 3.14, 2.17 };
-
-// constants and pointer checking
-
-#define CheckConstVal 0
-
-typedef struct {
-	int *p;
-} CheckConstStruct;
-
-static void CheckConstFunc(CheckConstStruct *p, int e) {}
-
-// duplicate symbol
-
-int base_symbol = 0;
-#define alias_one base_symbol
-#define alias_two base_symbol
-
-// function pointer variables
-
-typedef int (*intFunc) ();
-
-int
-bridge_int_func(intFunc f)
-{
-	return f();
-}
-
-int fortytwo()
-{
-	return 42;
-}
-
-// issue 1222
-typedef union {
-	long align;
-} xxpthread_mutex_t;
-struct ibv_async_event {
-	union {
-		int x;
-	} element;
-};
-struct ibv_context {
-	xxpthread_mutex_t mutex;
-};
-
-// issue 1635
-// Mac OS X's gcc will generate scattered relocation 2/1 for
-// this function on Darwin/386, and 8l couldn't handle it.
-// this example is in issue 1635
-void scatter() {
-	void *p = scatter;
-	printf("scatter = %p\n", p);
-}
-
-// Adding this explicit extern declaration makes this a test for
-// https://gcc.gnu.org/PR68072 aka https://golang.org/issue/13344 .
-// It used to cause a cgo error when building with GCC 6.
-extern int hola;
-
-// this example is in issue 3253
-int hola = 0;
-int testHola() { return hola; }
-
-// issue 3250
-#ifdef WIN32
-void testSendSIG() {}
-#else
-static void *thread(void *p) {
-	const int M = 100;
-	int i;
-	(void)p;
-	for (i = 0; i < M; i++) {
-		pthread_kill(pthread_self(), SIGCHLD);
-		usleep(rand() % 20 + 5);
-	}
-	return NULL;
-}
-void testSendSIG() {
-	const int N = 20;
-	int i;
-	pthread_t tid[N];
-	for (i = 0; i < N; i++) {
-		usleep(rand() % 200 + 100);
-		pthread_create(&tid[i], 0, thread, NULL);
-	}
-	for (i = 0; i < N; i++)
-		pthread_join(tid[i], 0);
-}
-#endif
-
-// issue 3261
-// libgcc on ARM might be compiled as thumb code, but our 5l
-// can't handle that, so we have to disable this test on arm.
-#ifdef __ARMEL__
-int vabs(int x) {
-	puts("testLibgcc is disabled on ARM because 5l cannot handle thumb library.");
-	return (x < 0) ? -x : x;
-}
-#elif defined(__arm64__) && defined(__clang__)
-int vabs(int x) {
-	puts("testLibgcc is disabled on ARM64 with clang due to lack of libgcc.");
-	return (x < 0) ? -x : x;
-}
-#else
-int __absvsi2(int); // dummy prototype for libgcc function
-// we shouldn't name the function abs, as gcc might use
-// the builtin one.
-int vabs(int x) { return __absvsi2(x); }
-#endif
-
-
-// issue 3729
-// access errno from void C function
-const char _expA = 0x42;
-const float _expB = 3.14159;
-const short _expC = 0x55aa;
-const int _expD = 0xdeadbeef;
-
-#ifdef WIN32
-void g(void) {}
-void g2(int x, char a, float b, short c, int d) {}
-#else
-
-void g(void) {
-	errno = E2BIG;
-}
-
-// try to pass some non-trivial arguments to function g2
-void g2(int x, char a, float b, short c, int d) {
-	if (a == _expA && b == _expB && c == _expC && d == _expD)
-		errno = x;
-	else
-		errno = -1;
-}
-#endif
-
-// issue 3945
-// Test that cgo reserves enough stack space during cgo call.
-// See https://golang.org/issue/3945 for details.
-void say() {
-	printf("%s from C\n", "hello");
-}
-
-// issue 4054 part 1 - other half in testx.go
-
-typedef enum {
-	A = 0,
-	B,
-	C,
-	D,
-	E,
-	F,
-	G,
-	H,
-	II,
-	J,
-} issue4054a;
-
-// issue 4339
-// We've historically permitted #include <>, so test it here.  Issue 29333.
-// Also see issue 41059.
-#include <issue4339.h>
-
-// issue 4417
-// cmd/cgo: bool alignment/padding issue.
-// bool alignment is wrong and causing wrong arguments when calling functions.
-static int c_bool(bool a, bool b, int c, bool d, bool e)  {
-   return c;
-}
-
-// issue 4857
-#cgo CFLAGS: -Werror
-const struct { int a; } *issue4857() { return (void *)0; }
-
-// issue 5224
-// Test that the #cgo CFLAGS directive works,
-// with and without platform filters.
-#cgo CFLAGS: -DCOMMON_VALUE=123
-#cgo windows CFLAGS: -DIS_WINDOWS=1
-#cgo !windows CFLAGS: -DIS_WINDOWS=0
-int common = COMMON_VALUE;
-int is_windows = IS_WINDOWS;
-
-// issue 5227
-// linker incorrectly treats common symbols and
-// leaves them undefined.
-
-typedef struct {
-        int Count;
-} Fontinfo;
-
-Fontinfo SansTypeface;
-
-extern void init();
-
-Fontinfo loadfont() {
-        Fontinfo f = {0};
-        return f;
-}
-
-void init() {
-        SansTypeface = loadfont();
-}
-
-// issue 5242
-// Cgo incorrectly computed the alignment of structs
-// with no Go accessible fields as 0, and then panicked on
-// modulo-by-zero computations.
-
-// issue 50987
-// disable arm64 GCC warnings
-#cgo CFLAGS: -Wno-psabi -Wno-unknown-warning-option
-
-typedef struct {
-} foo;
-
-typedef struct {
-	int x : 1;
-} bar;
-
-int issue5242(foo f, bar b) {
-	return 5242;
-}
-
-// issue 5337
-// Verify that we can withstand SIGPROF received on foreign threads
-
-#ifdef WIN32
-void test5337() {}
-#else
-static void *thread1(void *p) {
-	(void)p;
-	pthread_kill(pthread_self(), SIGPROF);
-	return NULL;
-}
-void test5337() {
-	pthread_t tid;
-	pthread_create(&tid, 0, thread1, NULL);
-	pthread_join(tid, 0);
-}
-#endif
-
-// issue 5603
-
-const long long issue5603exp = 0x12345678;
-long long issue5603foo0() { return issue5603exp; }
-long long issue5603foo1(void *p) { return issue5603exp; }
-long long issue5603foo2(void *p, void *q) { return issue5603exp; }
-long long issue5603foo3(void *p, void *q, void *r) { return issue5603exp; }
-long long issue5603foo4(void *p, void *q, void *r, void *s) { return issue5603exp; }
-
-// issue 5740
-
-int test5740a(void), test5740b(void);
-
-// issue 5986
-static void output5986()
-{
-    int current_row = 0, row_count = 0;
-    double sum_squares = 0;
-    double d;
-    do {
-        if (current_row == 10) {
-            current_row = 0;
-        }
-        ++row_count;
-    }
-    while (current_row++ != 1);
-    d =  sqrt(sum_squares / row_count);
-    printf("sqrt is: %g\n", d);
-}
-
-// issue 6128
-// Test handling of #defined names in clang.
-// NOTE: Must use hex, or else a shortcut for decimals
-// in cgo avoids trying to pass this to clang.
-#define X 0x1
-
-// issue 6472
-typedef struct
-{
-        struct
-        {
-            int x;
-        } y[16];
-} z;
-
-// issue 6612
-// Test new scheme for deciding whether C.name is an expression, type, constant.
-// Clang silences some warnings when the name is a #defined macro, so test those too
-// (even though we now use errors exclusively, not warnings).
-
-void myfunc(void) {}
-int myvar = 5;
-const char *mytext = "abcdef";
-typedef int mytype;
-enum {
-	myenum = 1234,
-};
-
-#define myfunc_def myfunc
-#define myvar_def myvar
-#define mytext_def mytext
-#define mytype_def mytype
-#define myenum_def myenum
-#define myint_def 12345
-#define myfloat_def 1.5
-#define mystring_def "hello"
-
-// issue 6907
-char* Issue6907CopyString(_GoString_ s) {
-	size_t n;
-	const char *p;
-	char *r;
-
-	n = _GoStringLen(s);
-	p = _GoStringPtr(s);
-	r = malloc(n + 1);
-	memmove(r, p, n);
-	r[n] = '\0';
-	return r;
-}
-
-// issue 7560
-typedef struct {
-	char x;
-	long y;
-} __attribute__((__packed__)) misaligned;
-
-int
-offset7560(void)
-{
-	return (uintptr_t)&((misaligned*)0)->y;
-}
-
-// issue 7786
-// No runtime test, just make sure that typedef and struct/union/class are interchangeable at compile time.
-
-struct test7786;
-typedef struct test7786 typedef_test7786;
-void f7786(struct test7786 *ctx) {}
-void g7786(typedef_test7786 *ctx) {}
-
-typedef struct body7786 typedef_body7786;
-struct body7786 { int x; };
-void b7786(struct body7786 *ctx) {}
-void c7786(typedef_body7786 *ctx) {}
-
-typedef union union7786 typedef_union7786;
-void u7786(union union7786 *ctx) {}
-void v7786(typedef_union7786 *ctx) {}
-
-// issue 8092
-// Test that linker defined symbols (e.g., text, data) don't
-// conflict with C symbols.
-char text[] = "text";
-char data[] = "data";
-char *ctext(void) { return text; }
-char *cdata(void) { return data; }
-
-// issue 8428
-// Cgo inconsistently translated zero size arrays.
-
-struct issue8428one {
-	char b;
-	char rest[];
-};
-
-struct issue8428two {
-	void *p;
-	char b;
-	char rest[0];
-	char pad;
-};
-
-struct issue8428three {
-	char w[1][2][3][0];
-	char x[2][3][0][1];
-	char y[3][0][1][2];
-	char z[0][1][2][3];
-};
-
-// issue 8331 part 1 - part 2 in testx.go
-// A typedef of an unnamed struct is the same struct when
-// #include'd twice.  No runtime test; just make sure it compiles.
-#include "issue8331.h"
-
-// issue 8368 and 8441
-// Recursive struct definitions didn't work.
-// No runtime test; just make sure it compiles.
-typedef struct one one;
-typedef struct two two;
-struct one {
-	two *x;
-};
-struct two {
-	one *x;
-};
-
-// issue 8811
-
-extern int issue8811Initialized;
-extern void issue8811Init();
-
-void issue8811Execute() {
-	if(!issue8811Initialized)
-		issue8811Init();
-}
-
-// issue 8945
-
-typedef void (*PFunc8945)();
-PFunc8945 func8945;
-
-// issue 9557
-
-struct issue9557_t {
-  int a;
-} test9557bar = { 42 };
-struct issue9557_t *issue9557foo = &test9557bar;
-
-// issue 10303
-// Pointers passed to C were not marked as escaping (bug in cgo).
-
-typedef int *intptr;
-
-void setintstar(int *x) {
-	*x = 1;
-}
-
-void setintptr(intptr x) {
-	*x = 1;
-}
-
-void setvoidptr(void *x) {
-	*(int*)x = 1;
-}
-
-typedef struct Struct Struct;
-struct Struct {
-	int *P;
-};
-
-void setstruct(Struct s) {
-	*s.P = 1;
-}
-
-// issue 11925
-// Structs with zero-length trailing fields are now padded by the Go compiler.
-
-struct a11925 {
-	int i;
-	char a[0];
-	char b[0];
-};
-
-struct b11925 {
-	int i;
-	char a[0];
-	char b[];
-};
-
-// issue 12030
-void issue12030conv(char *buf, double x) {
-	sprintf(buf, "d=%g", x);
-}
-
-// issue 14838
-
-int check_cbytes(char *b, size_t l) {
-	int i;
-	for (i = 0; i < l; i++) {
-		if (b[i] != i) {
-			return 0;
-		}
-	}
-	return 1;
-}
-
-// issue 17065
-// Test that C symbols larger than a page play nicely with the race detector.
-int ii[65537];
-
-// issue 17537
-// The void* cast introduced by cgo to avoid problems
-// with const/volatile qualifiers breaks C preprocessor macros that
-// emulate functions.
-
-typedef struct {
-	int i;
-} S17537;
-
-int I17537(S17537 *p);
-
-#define I17537(p) ((p)->i)
-
-// Calling this function used to fail without the cast.
-const int F17537(const char **p) {
-	return **p;
-}
-
-// issue 17723
-// API compatibility checks
-
-typedef char *cstring_pointer;
-static void cstring_pointer_fun(cstring_pointer dummy) { }
-const char *api_hello = "hello!";
-
-// Calling this function used to trigger an error from the C compiler
-// (issue 18298).
-void F18298(const void *const *p) {
-}
-
-// Test that conversions between typedefs work as they used to.
-typedef const void *T18298_1;
-struct S18298 { int i; };
-typedef const struct S18298 *T18298_2;
-void G18298(T18298_1 t) {
-}
-
-// issue 18126
-// cgo check of void function returning errno.
-void Issue18126C(void **p) {}
-
-// issue 18720
-
-#define HELLO "hello"
-#define WORLD "world"
-#define HELLO_WORLD HELLO "\000" WORLD
-
-struct foo { char c; };
-#define SIZE_OF(x) sizeof(x)
-#define SIZE_OF_FOO SIZE_OF(struct foo)
-#define VAR1 VAR
-#define VAR var
-int var = 5;
-
-#define ADDR &var
-
-#define CALL fn()
-int fn(void) {
-	return ++var;
-}
-
-// issue 20129
-
-int issue20129 = 0;
-typedef void issue20129Void;
-issue20129Void issue20129Foo() {
-	issue20129 = 1;
-}
-typedef issue20129Void issue20129Void2;
-issue20129Void2 issue20129Bar() {
-	issue20129 = 2;
-}
-
-// issue 20369
-#define XUINT64_MAX        18446744073709551615ULL
-
-// issue 21668
-// Fail to guess the kind of the constant "x".
-// No runtime test; just make sure it compiles.
-const int x21668 = 42;
-
-// issue 21708
-#define CAST_TO_INT64 (int64_t)(-1)
-
-// issue 21809
-// Compile C `typedef` to go type aliases.
-
-typedef long MySigned_t;
-// tests alias-to-alias
-typedef MySigned_t MySigned2_t;
-long takes_long(long x) { return x * x; }
-MySigned_t takes_typedef(MySigned_t x) { return x * x; }
-
-// issue 22906
-
-// It's going to be hard to include a whole real JVM to test this.
-// So we'll simulate a really easy JVM using just the parts we need.
-// This is the relevant part of jni.h.
-
-struct _jobject;
-
-typedef struct _jobject *jobject;
-typedef jobject jclass;
-typedef jobject jthrowable;
-typedef jobject jstring;
-typedef jobject jarray;
-typedef jarray jbooleanArray;
-typedef jarray jbyteArray;
-typedef jarray jcharArray;
-typedef jarray jshortArray;
-typedef jarray jintArray;
-typedef jarray jlongArray;
-typedef jarray jfloatArray;
-typedef jarray jdoubleArray;
-typedef jarray jobjectArray;
-
-typedef jobject jweak;
-
-// Note: jvalue is already a non-pointer type due to it being a C union.
-
-// issue 22958
-
-typedef struct {
-	unsigned long long f8  : 8;
-	unsigned long long f16 : 16;
-	unsigned long long f24 : 24;
-	unsigned long long f32 : 32;
-	unsigned long long f40 : 40;
-	unsigned long long f48 : 48;
-	unsigned long long f56 : 56;
-	unsigned long long f64 : 64;
-} issue22958Type;
-
-// issue 23356
-int a(void) { return 5; };
-int r(void) { return 3; };
-
-// issue 23720
-typedef int *issue23720A;
-typedef const int *issue23720B;
-void issue23720F(issue23720B a) {}
-
-// issue 24206
-#if defined(__linux__) && defined(__x86_64__)
-#include <sys/mman.h>
-// Returns string with null byte at the last valid address
-char* dangerousString1() {
-	int pageSize = 4096;
-	char *data = mmap(0, 2 * pageSize, PROT_READ|PROT_WRITE, MAP_ANON|MAP_PRIVATE, 0, 0);
-	mprotect(data + pageSize,pageSize,PROT_NONE);
-	int start = pageSize - 123 - 1; // last 123 bytes of first page + 1 null byte
-	int i = start;
-	for (; i < pageSize; i++) {
-	data[i] = 'x';
-	}
-	data[pageSize -1 ] = 0;
-	return data+start;
-}
-
-char* dangerousString2() {
-	int pageSize = 4096;
-	char *data = mmap(0, 3 * pageSize, PROT_READ|PROT_WRITE, MAP_ANON|MAP_PRIVATE, 0, 0);
-	mprotect(data + 2 * pageSize,pageSize,PROT_NONE);
-	int start = pageSize - 123 - 1; // last 123 bytes of first page + 1 null byte
-	int i = start;
-	for (; i < 2 * pageSize; i++) {
-	data[i] = 'x';
-	}
-	data[2*pageSize -1 ] = 0;
-	return data+start;
-}
-#else
-char *dangerousString1() { return NULL; }
-char *dangerousString2() { return NULL; }
-#endif
-
-// issue 26066
-const unsigned long long int issue26066 = (const unsigned long long) -1;
-
-// issue 26517
-// Introduce two pointer types which are distinct, but have the same
-// base type. Make sure that both of those pointer types get resolved
-// correctly. Before the fix for 26517 if one of these pointer types
-// was resolved before the other one was processed, the second one
-// would never be resolved.
-// Before this issue was fixed this test failed on Windows,
-// where va_list expands to a named char* type.
-typedef va_list TypeOne;
-typedef char *TypeTwo;
-
-// issue 28540
-
-static void twoargs1(void *p, int n) {}
-static void *twoargs2() { return 0; }
-static int twoargs3(void * p) { return 0; }
-
-// issue 28545
-// Failed to add type conversion for negative constant.
-
-static void issue28545F(char **p, int n, complex double a) {}
-
-// issue 28772 part 1 - part 2 in testx.go
-// Failed to add type conversion for Go constant set to C constant.
-// No runtime test; just make sure it compiles.
-
-#define issue28772Constant 1
-
-// issue 28896
-// cgo was incorrectly adding padding after a packed struct.
-typedef struct {
-	void *f1;
-	uint32_t f2;
-} __attribute__((__packed__)) innerPacked;
-
-typedef struct {
-	innerPacked g1;
-	uint64_t g2;
-} outerPacked;
-
-typedef struct {
-	void *f1;
-	uint32_t f2;
-} innerUnpacked;
-
-typedef struct {
-	innerUnpacked g1;
-	uint64_t g2;
-} outerUnpacked;
-
-size_t offset(int x) {
-	switch (x) {
-	case 0:
-		return offsetof(innerPacked, f2);
-	case 1:
-		return offsetof(outerPacked, g2);
-	case 2:
-		return offsetof(innerUnpacked, f2);
-	case 3:
-		return offsetof(outerUnpacked, g2);
-	default:
-		abort();
-	}
-}
-
-// issue 29748
-
-typedef struct { char **p; } S29748;
-static int f29748(S29748 *p) { return 0; }
-
-// issue 29781
-// Error with newline inserted into constant expression.
-// Compilation test only, nothing to run.
-
-static void issue29781F(char **p, int n) {}
-#define ISSUE29781C 0
-
-// issue 31093
-static uint16_t issue31093F(uint16_t v) { return v; }
-
-// issue 32579
-typedef struct S32579 { unsigned char data[1]; } S32579;
-
-// issue 37033, cgo.Handle
-extern void GoFunc37033(uintptr_t handle);
-void cFunc37033(uintptr_t handle) { GoFunc37033(handle); }
-
-// issue 38649
-// Test that #define'd type aliases work.
-#define netbsd_gid unsigned int
-
-// issue 40494
-// Inconsistent handling of tagged enum and union types.
-enum Enum40494 { X_40494 };
-union Union40494 { int x; };
-void issue40494(enum Enum40494 e, union Union40494* up) {}
-
-// Issue 45451, bad handling of go:notinheap types.
-typedef struct issue45451Undefined issue45451;
-
-// Issue 49633, example of cgo.Handle with void*.
-extern void GoFunc49633(void*);
-void cfunc49633(void *context) { GoFunc49633(context); }
-
-*/
-import "C"
-
-import (
-	"context"
-	"fmt"
-	"math"
-	"math/rand"
-	"os"
-	"os/signal"
-	"reflect"
-	"runtime"
-	"runtime/cgo"
-	"sync"
-	"syscall"
-	"testing"
-	"time"
-	"unsafe"
-)
-
-// alignment
-
-func testAlign(t *testing.T) {
-	var evt C.SDL_KeyboardEvent
-	C.makeEvent(&evt)
-	if C.same(&evt, evt.typ, evt.which, evt.state, evt.keysym.scancode, evt.keysym.sym, evt.keysym.mod, evt.keysym.unicode) == 0 {
-		t.Error("*** bad alignment")
-		C.cTest(&evt)
-		t.Errorf("Go: %#x %#x %#x %#x %#x %#x %#x\n",
-			evt.typ, evt.which, evt.state, evt.keysym.scancode,
-			evt.keysym.sym, evt.keysym.mod, evt.keysym.unicode)
-		t.Error(evt)
-	}
-}
-
-// api
-
-const greeting = "hello, world"
-
-type testPair struct {
-	Name      string
-	Got, Want interface{}
-}
-
-var testPairs = []testPair{
-	{"GoString", C.GoString(C.greeting), greeting},
-	{"GoStringN", C.GoStringN(C.greeting, 5), greeting[:5]},
-	{"GoBytes", C.GoBytes(unsafe.Pointer(C.greeting), 5), []byte(greeting[:5])},
-}
-
-func testHelpers(t *testing.T) {
-	for _, pair := range testPairs {
-		if !reflect.DeepEqual(pair.Got, pair.Want) {
-			t.Errorf("%s: got %#v, want %#v", pair.Name, pair.Got, pair.Want)
-		}
-	}
-}
-
-// basic test cases
-
-const EINVAL = C.EINVAL /* test #define */
-
-var KILO = C.KILO
-
-func uuidgen() {
-	var uuid C.cgo_uuid_t
-	C.uuid_generate(&uuid[0])
-}
-
-func Strtol(s string, base int) (int, error) {
-	p := C.CString(s)
-	n, err := C.strtol(p, nil, C.int(base))
-	C.free(unsafe.Pointer(p))
-	return int(n), err
-}
-
-func Atol(s string) int {
-	p := C.CString(s)
-	n := C.atol(p)
-	C.free(unsafe.Pointer(p))
-	return int(n)
-}
-
-func testConst(t *testing.T) {
-	C.myConstFunc(nil, 0, nil)
-}
-
-func testEnum(t *testing.T) {
-	if C.Enum1 != 1 || C.Enum2 != 2 {
-		t.Error("bad enum", C.Enum1, C.Enum2)
-	}
-}
-
-func testNamedEnum(t *testing.T) {
-	e := new(C.enum_E)
-
-	*e = C.Enum1
-	if *e != 1 {
-		t.Error("bad enum", C.Enum1)
-	}
-
-	*e = C.Enum2
-	if *e != 2 {
-		t.Error("bad enum", C.Enum2)
-	}
-}
-
-func testCastToEnum(t *testing.T) {
-	e := C.enum_E(C.Enum1)
-	if e != 1 {
-		t.Error("bad enum", C.Enum1)
-	}
-
-	e = C.enum_E(C.Enum2)
-	if e != 2 {
-		t.Error("bad enum", C.Enum2)
-	}
-}
-
-func testAtol(t *testing.T) {
-	l := Atol("123")
-	if l != 123 {
-		t.Error("Atol 123: ", l)
-	}
-}
-
-func testErrno(t *testing.T) {
-	p := C.CString("no-such-file")
-	m := C.CString("r")
-	f, err := C.fopen(p, m)
-	C.free(unsafe.Pointer(p))
-	C.free(unsafe.Pointer(m))
-	if err == nil {
-		C.fclose(f)
-		t.Fatalf("C.fopen: should fail")
-	}
-	if err != syscall.ENOENT {
-		t.Fatalf("C.fopen: unexpected error: %v", err)
-	}
-}
-
-func testMultipleAssign(t *testing.T) {
-	p := C.CString("234")
-	n, m := C.strtol(p, nil, 345), C.strtol(p, nil, 10)
-	if runtime.GOOS == "openbsd" {
-		// Bug in OpenBSD strtol(3) - base > 36 succeeds.
-		if (n != 0 && n != 239089) || m != 234 {
-			t.Fatal("Strtol x2: ", n, m)
-		}
-	} else if n != 0 || m != 234 {
-		t.Fatal("Strtol x2: ", n, m)
-	}
-	C.free(unsafe.Pointer(p))
-}
-
-var (
-	cuint  = (C.uint)(0)
-	culong C.ulong
-	cchar  C.char
-)
-
-type Context struct {
-	ctx *C.struct_ibv_context
-}
-
-func benchCgoCall(b *testing.B) {
-	b.Run("add-int", func(b *testing.B) {
-		const x = C.int(2)
-		const y = C.int(3)
-
-		for i := 0; i < b.N; i++ {
-			C.add(x, y)
-		}
-	})
-
-	b.Run("one-pointer", func(b *testing.B) {
-		var a0 C.VkDeviceCreateInfo
-		for i := 0; i < b.N; i++ {
-			C.handleComplexPointer(&a0)
-		}
-	})
-	b.Run("eight-pointers", func(b *testing.B) {
-		var a0, a1, a2, a3, a4, a5, a6, a7 C.VkDeviceCreateInfo
-		for i := 0; i < b.N; i++ {
-			C.handleComplexPointer8(&a0, &a1, &a2, &a3, &a4, &a5, &a6, &a7)
-		}
-	})
-	b.Run("eight-pointers-nil", func(b *testing.B) {
-		var a0, a1, a2, a3, a4, a5, a6, a7 *C.VkDeviceCreateInfo
-		for i := 0; i < b.N; i++ {
-			C.handleComplexPointer8(a0, a1, a2, a3, a4, a5, a6, a7)
-		}
-	})
-	b.Run("eight-pointers-array", func(b *testing.B) {
-		var a [8]C.VkDeviceCreateInfo
-		for i := 0; i < b.N; i++ {
-			C.handleComplexPointer8(&a[0], &a[1], &a[2], &a[3], &a[4], &a[5], &a[6], &a[7])
-		}
-	})
-	b.Run("eight-pointers-slice", func(b *testing.B) {
-		a := make([]C.VkDeviceCreateInfo, 8)
-		for i := 0; i < b.N; i++ {
-			C.handleComplexPointer8(&a[0], &a[1], &a[2], &a[3], &a[4], &a[5], &a[6], &a[7])
-		}
-	})
-}
-
-// Benchmark measuring overhead from Go to C and back to Go (via a callback)
-func benchCallback(b *testing.B) {
-	var x = false
-	for i := 0; i < b.N; i++ {
-		nestedCall(func() { x = true })
-	}
-	if !x {
-		b.Fatal("nestedCall was not invoked")
-	}
-}
-
-var sinkString string
-
-func benchGoString(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		sinkString = C.GoString(C.cstr)
-	}
-	const want = "abcefghijklmnopqrstuvwxyzABCEFGHIJKLMNOPQRSTUVWXYZ1234567890"
-	if sinkString != want {
-		b.Fatalf("%q != %q", sinkString, want)
-	}
-}
-
-// Static (build-time) test that syntax traversal visits all operands of s[i:j:k].
-func sliceOperands(array [2000]int) {
-	_ = array[C.KILO:C.KILO:C.KILO] // no type error
-}
-
-// set in cgo_thread_lock.go init
-var testThreadLockFunc = func(*testing.T) {}
-
-// complex alignment
-
-func TestComplexAlign(t *testing.T) {
-	if C.cplxAlign.x != 3.14 {
-		t.Errorf("got %v, expected 3.14", C.cplxAlign.x)
-	}
-	if C.cplxAlign.y != 2.17 {
-		t.Errorf("got %v, expected 2.17", C.cplxAlign.y)
-	}
-}
-
-// constants and pointer checking
-
-func testCheckConst(t *testing.T) {
-	// The test is that this compiles successfully.
-	p := C.malloc(C.size_t(unsafe.Sizeof(C.int(0))))
-	defer C.free(p)
-	C.CheckConstFunc(&C.CheckConstStruct{(*C.int)(p)}, C.CheckConstVal)
-}
-
-// duplicate symbol
-
-func duplicateSymbols() {
-	fmt.Printf("%v %v %v\n", C.base_symbol, C.alias_one, C.alias_two)
-}
-
-// environment
-
-// This is really an os package test but here for convenience.
-func testSetEnv(t *testing.T) {
-	if runtime.GOOS == "windows" {
-		// Go uses SetEnvironmentVariable on windows. However,
-		// C runtime takes a *copy* at process startup of the
-		// OS environment, and stores it in environ/envp.
-		// It is this copy that	getenv/putenv manipulate.
-		t.Logf("skipping test")
-		return
-	}
-	const key = "CGO_OS_TEST_KEY"
-	const val = "CGO_OS_TEST_VALUE"
-	os.Setenv(key, val)
-	keyc := C.CString(key)
-	defer C.free(unsafe.Pointer(keyc))
-	v := C.getenv(keyc)
-	if uintptr(unsafe.Pointer(v)) == 0 {
-		t.Fatal("getenv returned NULL")
-	}
-	vs := C.GoString(v)
-	if vs != val {
-		t.Fatalf("getenv() = %q; want %q", vs, val)
-	}
-}
-
-// function pointer variables
-
-func callBridge(f C.intFunc) int {
-	return int(C.bridge_int_func(f))
-}
-
-func callCBridge(f C.intFunc) C.int {
-	return C.bridge_int_func(f)
-}
-
-func testFpVar(t *testing.T) {
-	const expected = 42
-	f := C.intFunc(C.fortytwo)
-	res1 := C.bridge_int_func(f)
-	if r1 := int(res1); r1 != expected {
-		t.Errorf("got %d, want %d", r1, expected)
-	}
-	res2 := callCBridge(f)
-	if r2 := int(res2); r2 != expected {
-		t.Errorf("got %d, want %d", r2, expected)
-	}
-	r3 := callBridge(f)
-	if r3 != expected {
-		t.Errorf("got %d, want %d", r3, expected)
-	}
-}
-
-// issue 1222
-type AsyncEvent struct {
-	event C.struct_ibv_async_event
-}
-
-// issue 1635
-
-func test1635(t *testing.T) {
-	C.scatter()
-	if v := C.hola; v != 0 {
-		t.Fatalf("C.hola is %d, should be 0", v)
-	}
-	if v := C.testHola(); v != 0 {
-		t.Fatalf("C.testHola() is %d, should be 0", v)
-	}
-}
-
-// issue 2470
-
-func testUnsignedInt(t *testing.T) {
-	a := (int64)(C.UINT32VAL)
-	b := (int64)(0xc008427b)
-	if a != b {
-		t.Errorf("Incorrect unsigned int - got %x, want %x", a, b)
-	}
-}
-
-// issue 3250
-
-func test3250(t *testing.T) {
-	if runtime.GOOS == "windows" {
-		t.Skip("not applicable on windows")
-	}
-
-	t.Skip("skipped, see golang.org/issue/5885")
-	var (
-		thres = 1
-		sig   = syscall_dot_SIGCHLD
-	)
-	type result struct {
-		n   int
-		sig os.Signal
-	}
-	var (
-		sigCh     = make(chan os.Signal, 10)
-		waitStart = make(chan struct{})
-		waitDone  = make(chan result)
-	)
-
-	signal.Notify(sigCh, sig)
-
-	go func() {
-		n := 0
-		alarm := time.After(time.Second * 3)
-		for {
-			select {
-			case <-waitStart:
-				waitStart = nil
-			case v := <-sigCh:
-				n++
-				if v != sig || n > thres {
-					waitDone <- result{n, v}
-					return
-				}
-			case <-alarm:
-				waitDone <- result{n, sig}
-				return
-			}
-		}
-	}()
-
-	waitStart <- struct{}{}
-	C.testSendSIG()
-	r := <-waitDone
-	if r.sig != sig {
-		t.Fatalf("received signal %v, but want %v", r.sig, sig)
-	}
-	t.Logf("got %d signals\n", r.n)
-	if r.n <= thres {
-		t.Fatalf("expected more than %d", thres)
-	}
-}
-
-// issue 3261
-
-func testLibgcc(t *testing.T) {
-	var table = []struct {
-		in, out C.int
-	}{
-		{0, 0},
-		{1, 1},
-		{-42, 42},
-		{1000300, 1000300},
-		{1 - 1<<31, 1<<31 - 1},
-	}
-	for _, v := range table {
-		if o := C.vabs(v.in); o != v.out {
-			t.Fatalf("abs(%d) got %d, should be %d", v.in, o, v.out)
-			return
-		}
-	}
-}
-
-// issue 3729
-
-func test3729(t *testing.T) {
-	if runtime.GOOS == "windows" {
-		t.Skip("skipping on windows")
-	}
-
-	_, e := C.g()
-	if e != syscall.E2BIG {
-		t.Errorf("got %q, expect %q", e, syscall.E2BIG)
-	}
-	_, e = C.g2(C.EINVAL, C._expA, C._expB, C._expC, C._expD)
-	if e != syscall.EINVAL {
-		t.Errorf("got %q, expect %q", e, syscall.EINVAL)
-	}
-}
-
-// issue 3945
-
-func testPrintf(t *testing.T) {
-	C.say()
-}
-
-// issue 4054
-
-var issue4054a = []int{C.A, C.B, C.C, C.D, C.E, C.F, C.G, C.H, C.I, C.J}
-
-// issue 4339
-
-func test4339(t *testing.T) {
-	C.handle4339(&C.exported4339)
-}
-
-// issue 4417
-
-func testBoolAlign(t *testing.T) {
-	b := C.c_bool(true, true, 10, true, false)
-	if b != 10 {
-		t.Fatalf("found %d expected 10\n", b)
-	}
-	b = C.c_bool(true, true, 5, true, true)
-	if b != 5 {
-		t.Fatalf("found %d expected 5\n", b)
-	}
-	b = C.c_bool(true, true, 3, true, false)
-	if b != 3 {
-		t.Fatalf("found %d expected 3\n", b)
-	}
-	b = C.c_bool(false, false, 1, true, false)
-	if b != 1 {
-		t.Fatalf("found %d expected 1\n", b)
-	}
-	b = C.c_bool(false, true, 200, true, false)
-	if b != 200 {
-		t.Fatalf("found %d expected 200\n", b)
-	}
-}
-
-// issue 4857
-
-func test4857() {
-	_ = C.issue4857()
-}
-
-// issue 5224
-
-func testCflags(t *testing.T) {
-	is_windows := C.is_windows == 1
-	if is_windows != (runtime.GOOS == "windows") {
-		t.Errorf("is_windows: %v, runtime.GOOS: %s", is_windows, runtime.GOOS)
-	}
-	if C.common != 123 {
-		t.Errorf("common: %v (expected 123)", C.common)
-	}
-}
-
-// issue 5227
-
-func test5227(t *testing.T) {
-	C.init()
-}
-
-func selectfont() C.Fontinfo {
-	return C.SansTypeface
-}
-
-// issue 5242
-
-func test5242(t *testing.T) {
-	if got := C.issue5242(C.foo{}, C.bar{}); got != 5242 {
-		t.Errorf("got %v", got)
-	}
-}
-
-func test5603(t *testing.T) {
-	var x [5]int64
-	exp := int64(C.issue5603exp)
-	x[0] = int64(C.issue5603foo0())
-	x[1] = int64(C.issue5603foo1(nil))
-	x[2] = int64(C.issue5603foo2(nil, nil))
-	x[3] = int64(C.issue5603foo3(nil, nil, nil))
-	x[4] = int64(C.issue5603foo4(nil, nil, nil, nil))
-	for i, v := range x {
-		if v != exp {
-			t.Errorf("issue5603foo%d() returns %v, expected %v", i, v, exp)
-		}
-	}
-}
-
-// issue 5337
-
-func test5337(t *testing.T) {
-	C.test5337()
-}
-
-// issue 5740
-
-func test5740(t *testing.T) {
-	if v := C.test5740a() + C.test5740b(); v != 5 {
-		t.Errorf("expected 5, got %v", v)
-	}
-}
-
-// issue 5986
-
-func test5986(t *testing.T) {
-	C.output5986()
-}
-
-// issue 6128
-
-func test6128() {
-	// nothing to run, just make sure this compiles.
-	_ = C.X
-}
-
-// issue 6390
-
-func test6390(t *testing.T) {
-	p1 := C.malloc(1024)
-	if p1 == nil {
-		t.Fatalf("C.malloc(1024) returned nil")
-	}
-	p2 := C.malloc(0)
-	if p2 == nil {
-		t.Fatalf("C.malloc(0) returned nil")
-	}
-	C.free(p1)
-	C.free(p2)
-}
-
-func test6472() {
-	// nothing to run, just make sure this compiles
-	s := new(C.z)
-	println(s.y[0].x)
-}
-
-// issue 6506
-
-func test6506() {
-	// nothing to run, just make sure this compiles
-	var x C.size_t
-
-	C.calloc(x, x)
-	C.malloc(x)
-	C.realloc(nil, x)
-	C.memcpy(nil, nil, x)
-	C.memcmp(nil, nil, x)
-	C.memmove(nil, nil, x)
-	C.strncpy(nil, nil, x)
-	C.strncmp(nil, nil, x)
-	C.strncat(nil, nil, x)
-	x = C.strxfrm(nil, nil, x)
-	C.memchr(nil, 0, x)
-	x = C.strcspn(nil, nil)
-	x = C.strspn(nil, nil)
-	C.memset(nil, 0, x)
-	x = C.strlen(nil)
-	_ = x
-}
-
-// issue 6612
-
-func testNaming(t *testing.T) {
-	C.myfunc()
-	C.myfunc_def()
-	if v := C.myvar; v != 5 {
-		t.Errorf("C.myvar = %d, want 5", v)
-	}
-	if v := C.myvar_def; v != 5 {
-		t.Errorf("C.myvar_def = %d, want 5", v)
-	}
-	if s := C.GoString(C.mytext); s != "abcdef" {
-		t.Errorf("C.mytext = %q, want %q", s, "abcdef")
-	}
-	if s := C.GoString(C.mytext_def); s != "abcdef" {
-		t.Errorf("C.mytext_def = %q, want %q", s, "abcdef")
-	}
-	if c := C.myenum; c != 1234 {
-		t.Errorf("C.myenum = %v, want 1234", c)
-	}
-	if c := C.myenum_def; c != 1234 {
-		t.Errorf("C.myenum_def = %v, want 1234", c)
-	}
-	{
-		const c = C.myenum
-		if c != 1234 {
-			t.Errorf("C.myenum as const = %v, want 1234", c)
-		}
-	}
-	{
-		const c = C.myenum_def
-		if c != 1234 {
-			t.Errorf("C.myenum as const = %v, want 1234", c)
-		}
-	}
-	if c := C.myint_def; c != 12345 {
-		t.Errorf("C.myint_def = %v, want 12345", c)
-	}
-	{
-		const c = C.myint_def
-		if c != 12345 {
-			t.Errorf("C.myint as const = %v, want 12345", c)
-		}
-	}
-
-	if c := C.myfloat_def; c != 1.5 {
-		t.Errorf("C.myint_def = %v, want 1.5", c)
-	}
-	{
-		const c = C.myfloat_def
-		if c != 1.5 {
-			t.Errorf("C.myint as const = %v, want 1.5", c)
-		}
-	}
-
-	if s := C.mystring_def; s != "hello" {
-		t.Errorf("C.mystring_def = %q, want %q", s, "hello")
-	}
-}
-
-// issue 6907
-
-func test6907(t *testing.T) {
-	want := "yarn"
-	if got := C.GoString(C.Issue6907CopyString(want)); got != want {
-		t.Errorf("C.GoString(C.Issue6907CopyString(%q)) == %q, want %q", want, got, want)
-	}
-}
-
-// issue 7560
-
-func test7560(t *testing.T) {
-	// some mingw don't implement __packed__ correctly.
-	if C.offset7560() != 1 {
-		t.Skip("C compiler did not pack struct")
-	}
-
-	// C.misaligned should have x but then a padding field to get to the end of the struct.
-	// There should not be a field named 'y'.
-	var v C.misaligned
-	rt := reflect.TypeOf(&v).Elem()
-	if rt.NumField() != 2 || rt.Field(0).Name != "x" || rt.Field(1).Name != "_" {
-		t.Errorf("unexpected fields in C.misaligned:\n")
-		for i := 0; i < rt.NumField(); i++ {
-			t.Logf("%+v\n", rt.Field(i))
-		}
-	}
-}
-
-// issue 7786
-
-func f() {
-	var x1 *C.typedef_test7786
-	var x2 *C.struct_test7786
-	x1 = x2
-	x2 = x1
-	C.f7786(x1)
-	C.f7786(x2)
-	C.g7786(x1)
-	C.g7786(x2)
-
-	var b1 *C.typedef_body7786
-	var b2 *C.struct_body7786
-	b1 = b2
-	b2 = b1
-	C.b7786(b1)
-	C.b7786(b2)
-	C.c7786(b1)
-	C.c7786(b2)
-
-	var u1 *C.typedef_union7786
-	var u2 *C.union_union7786
-	u1 = u2
-	u2 = u1
-	C.u7786(u1)
-	C.u7786(u2)
-	C.v7786(u1)
-	C.v7786(u2)
-}
-
-// issue 8092
-
-func test8092(t *testing.T) {
-	tests := []struct {
-		s    string
-		a, b *C.char
-	}{
-		{"text", &C.text[0], C.ctext()},
-		{"data", &C.data[0], C.cdata()},
-	}
-	for _, test := range tests {
-		if test.a != test.b {
-			t.Errorf("%s: pointer mismatch: %v != %v", test.s, test.a, test.b)
-		}
-		if got := C.GoString(test.a); got != test.s {
-			t.Errorf("%s: points at %#v, want %#v", test.s, got, test.s)
-		}
-	}
-}
-
-// issues 8368 and 8441
-
-func issue8368(one *C.struct_one, two *C.struct_two) {
-}
-
-func issue8441(one *C.one, two *C.two) {
-	issue8441(two.x, one.x)
-}
-
-// issue 8428
-
-var _ = C.struct_issue8428one{
-	b: C.char(0),
-	// The trailing rest field is not available in cgo.
-	// See issue 11925.
-	// rest: [0]C.char{},
-}
-
-var _ = C.struct_issue8428two{
-	p:    unsafe.Pointer(nil),
-	b:    C.char(0),
-	rest: [0]C.char{},
-}
-
-var _ = C.struct_issue8428three{
-	w: [1][2][3][0]C.char{},
-	x: [2][3][0][1]C.char{},
-	y: [3][0][1][2]C.char{},
-	z: [0][1][2][3]C.char{},
-}
-
-// issue 8811
-
-func test8811(t *testing.T) {
-	C.issue8811Execute()
-}
-
-// issue 9557
-
-func test9557(t *testing.T) {
-	// implicitly dereference a Go variable
-	foo := C.issue9557foo
-	if v := foo.a; v != 42 {
-		t.Fatalf("foo.a expected 42, but got %d", v)
-	}
-
-	// explicitly dereference a C variable
-	if v := (*C.issue9557foo).a; v != 42 {
-		t.Fatalf("(*C.issue9557foo).a expected 42, but is %d", v)
-	}
-
-	// implicitly dereference a C variable
-	if v := C.issue9557foo.a; v != 42 {
-		t.Fatalf("C.issue9557foo.a expected 42, but is %d", v)
-	}
-}
-
-// issue 8331 part 1
-
-func issue8331a() C.issue8331 {
-	return issue8331Var
-}
-
-// issue 10303
-
-func test10303(t *testing.T, n int) {
-	if runtime.Compiler == "gccgo" {
-		t.Skip("gccgo permits C pointers on the stack")
-	}
-
-	// Run at a few different stack depths just to avoid an unlucky pass
-	// due to variables ending up on different pages.
-	if n > 0 {
-		test10303(t, n-1)
-	}
-	if t.Failed() {
-		return
-	}
-	var x, y, z, v, si C.int
-	var s C.Struct
-	C.setintstar(&x)
-	C.setintptr(&y)
-	C.setvoidptr(unsafe.Pointer(&v))
-	s.P = &si
-	C.setstruct(s)
-
-	if uintptr(unsafe.Pointer(&x))&^0xfff == uintptr(unsafe.Pointer(&z))&^0xfff {
-		t.Error("C int* argument on stack")
-	}
-	if uintptr(unsafe.Pointer(&y))&^0xfff == uintptr(unsafe.Pointer(&z))&^0xfff {
-		t.Error("C intptr argument on stack")
-	}
-	if uintptr(unsafe.Pointer(&v))&^0xfff == uintptr(unsafe.Pointer(&z))&^0xfff {
-		t.Error("C void* argument on stack")
-	}
-	if uintptr(unsafe.Pointer(&si))&^0xfff == uintptr(unsafe.Pointer(&z))&^0xfff {
-		t.Error("C struct field pointer on stack")
-	}
-}
-
-// issue 11925
-
-func test11925(t *testing.T) {
-	if C.sizeof_struct_a11925 != unsafe.Sizeof(C.struct_a11925{}) {
-		t.Errorf("size of a changed: C %d, Go %d", C.sizeof_struct_a11925, unsafe.Sizeof(C.struct_a11925{}))
-	}
-	if C.sizeof_struct_b11925 != unsafe.Sizeof(C.struct_b11925{}) {
-		t.Errorf("size of b changed: C %d, Go %d", C.sizeof_struct_b11925, unsafe.Sizeof(C.struct_b11925{}))
-	}
-}
-
-// issue 12030
-
-func test12030(t *testing.T) {
-	buf := (*C.char)(C.malloc(256))
-	defer C.free(unsafe.Pointer(buf))
-	for _, f := range []float64{1.0, 2.0, 3.14} {
-		C.issue12030conv(buf, C.double(f))
-		got := C.GoString(buf)
-		if want := fmt.Sprintf("d=%g", f); got != want {
-			t.Fatalf("C.sprintf failed for %g: %q != %q", f, got, want)
-		}
-	}
-}
-
-// issue 13402
-
-var _ C.complexfloat
-var _ C.complexdouble
-
-// issue 13930
-// Test that cgo's multiple-value special form for
-// C function calls works in variable declaration statements.
-
-var _, _ = C.abs(0)
-
-// issue 14838
-
-func test14838(t *testing.T) {
-	data := []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
-	cData := C.CBytes(data)
-	defer C.free(cData)
-
-	if C.check_cbytes((*C.char)(cData), C.size_t(len(data))) == 0 {
-		t.Fatalf("mismatched data: expected %v, got %v", data, (*(*[10]byte)(unsafe.Pointer(cData)))[:])
-	}
-}
-
-// issue 17065
-
-var sink C.int
-
-func test17065(t *testing.T) {
-	if runtime.GOOS == "darwin" || runtime.GOOS == "ios" {
-		t.Skip("broken on darwin; issue 17065")
-	}
-	for i := range C.ii {
-		sink = C.ii[i]
-	}
-}
-
-// issue 17537
-
-func test17537(t *testing.T) {
-	v := C.S17537{i: 17537}
-	if got, want := C.I17537(&v), C.int(17537); got != want {
-		t.Errorf("got %d, want %d", got, want)
-	}
-
-	p := (*C.char)(C.malloc(1))
-	*p = 17
-	if got, want := C.F17537(&p), C.int(17); got != want {
-		t.Errorf("got %d, want %d", got, want)
-	}
-
-	C.F18298(nil)
-	var v18298 C.T18298_2
-	C.G18298(C.T18298_1(v18298))
-}
-
-// issue 17723
-
-func testAPI() {
-	var cs *C.char
-	cs = C.CString("hello")
-	defer C.free(unsafe.Pointer(cs))
-	var s string
-	s = C.GoString((*C.char)(C.api_hello))
-	s = C.GoStringN((*C.char)(C.api_hello), C.int(6))
-	var b []byte
-	b = C.GoBytes(unsafe.Pointer(C.api_hello), C.int(6))
-	_, _ = s, b
-	C.cstring_pointer_fun(nil)
-}
-
-// issue 18126
-
-func test18126(t *testing.T) {
-	p := C.malloc(1)
-	_, err := C.Issue18126C(&p)
-	C.free(p)
-	_ = err
-}
-
-// issue 18720
-
-func test18720(t *testing.T) {
-	if got, want := C.HELLO_WORLD, "hello\000world"; got != want {
-		t.Errorf("C.HELLO_WORLD == %q, expected %q", got, want)
-	}
-
-	if got, want := C.VAR1, C.int(5); got != want {
-		t.Errorf("C.VAR1 == %v, expected %v", got, want)
-	}
-
-	if got, want := *C.ADDR, C.int(5); got != want {
-		t.Errorf("*C.ADDR == %v, expected %v", got, want)
-	}
-
-	if got, want := C.CALL, C.int(6); got != want {
-		t.Errorf("C.CALL == %v, expected %v", got, want)
-	}
-
-	if got, want := C.CALL, C.int(7); got != want {
-		t.Errorf("C.CALL == %v, expected %v", got, want)
-	}
-
-	// Issue 20125.
-	if got, want := C.SIZE_OF_FOO, 1; got != want {
-		t.Errorf("C.SIZE_OF_FOO == %v, expected %v", got, want)
-	}
-}
-
-// issue 20129
-
-func test20129(t *testing.T) {
-	if C.issue20129 != 0 {
-		t.Fatal("test is broken")
-	}
-	C.issue20129Foo()
-	if C.issue20129 != 1 {
-		t.Errorf("got %v but expected %v", C.issue20129, 1)
-	}
-	C.issue20129Bar()
-	if C.issue20129 != 2 {
-		t.Errorf("got %v but expected %v", C.issue20129, 2)
-	}
-}
-
-// issue 20369
-
-func test20369(t *testing.T) {
-	if C.XUINT64_MAX != math.MaxUint64 {
-		t.Fatalf("got %v, want %v", uint64(C.XUINT64_MAX), uint64(math.MaxUint64))
-	}
-}
-
-// issue 21668
-
-var issue21668_X = C.x21668
-
-// issue 21708
-
-func test21708(t *testing.T) {
-	if got, want := C.CAST_TO_INT64, -1; got != want {
-		t.Errorf("C.CAST_TO_INT64 == %v, expected %v", got, want)
-	}
-}
-
-// issue 21809
-
-func test21809(t *testing.T) {
-	longVar := C.long(3)
-	typedefVar := C.MySigned_t(4)
-	typedefTypedefVar := C.MySigned2_t(5)
-
-	// all three should be considered identical to `long`
-	if ret := C.takes_long(longVar); ret != 9 {
-		t.Errorf("got %v but expected %v", ret, 9)
-	}
-	if ret := C.takes_long(typedefVar); ret != 16 {
-		t.Errorf("got %v but expected %v", ret, 16)
-	}
-	if ret := C.takes_long(typedefTypedefVar); ret != 25 {
-		t.Errorf("got %v but expected %v", ret, 25)
-	}
-
-	// They should also be identical to the typedef'd type
-	if ret := C.takes_typedef(longVar); ret != 9 {
-		t.Errorf("got %v but expected %v", ret, 9)
-	}
-	if ret := C.takes_typedef(typedefVar); ret != 16 {
-		t.Errorf("got %v but expected %v", ret, 16)
-	}
-	if ret := C.takes_typedef(typedefTypedefVar); ret != 25 {
-		t.Errorf("got %v but expected %v", ret, 25)
-	}
-}
-
-// issue 22906
-
-func test22906(t *testing.T) {
-	var x1 C.jobject = 0 // Note: 0, not nil. That makes sure we use uintptr for these types.
-	_ = x1
-	var x2 C.jclass = 0
-	_ = x2
-	var x3 C.jthrowable = 0
-	_ = x3
-	var x4 C.jstring = 0
-	_ = x4
-	var x5 C.jarray = 0
-	_ = x5
-	var x6 C.jbooleanArray = 0
-	_ = x6
-	var x7 C.jbyteArray = 0
-	_ = x7
-	var x8 C.jcharArray = 0
-	_ = x8
-	var x9 C.jshortArray = 0
-	_ = x9
-	var x10 C.jintArray = 0
-	_ = x10
-	var x11 C.jlongArray = 0
-	_ = x11
-	var x12 C.jfloatArray = 0
-	_ = x12
-	var x13 C.jdoubleArray = 0
-	_ = x13
-	var x14 C.jobjectArray = 0
-	_ = x14
-	var x15 C.jweak = 0
-	_ = x15
-}
-
-// issue 22958
-// Nothing to run, just make sure this compiles.
-var Vissue22958 C.issue22958Type
-
-func test23356(t *testing.T) {
-	if got, want := C.a(), C.int(5); got != want {
-		t.Errorf("C.a() == %v, expected %v", got, want)
-	}
-	if got, want := C.r(), C.int(3); got != want {
-		t.Errorf("C.r() == %v, expected %v", got, want)
-	}
-}
-
-// issue 23720
-
-func Issue23720F() {
-	var x C.issue23720A
-	C.issue23720F(x)
-}
-
-// issue 24206
-
-func test24206(t *testing.T) {
-	if runtime.GOOS != "linux" || runtime.GOARCH != "amd64" {
-		t.Skipf("skipping on %s/%s", runtime.GOOS, runtime.GOARCH)
-	}
-
-	if l := len(C.GoString(C.dangerousString1())); l != 123 {
-		t.Errorf("Incorrect string length - got %d, want 123", l)
-	}
-	if l := len(C.GoString(C.dangerousString2())); l != 4096+123 {
-		t.Errorf("Incorrect string length - got %d, want %d", l, 4096+123)
-	}
-}
-
-// issue 25143
-
-func issue25143sum(ns ...C.int) C.int {
-	total := C.int(0)
-	for _, n := range ns {
-		total += n
-	}
-	return total
-}
-
-func test25143(t *testing.T) {
-	if got, want := issue25143sum(1, 2, 3), C.int(6); got != want {
-		t.Errorf("issue25143sum(1, 2, 3) == %v, expected %v", got, want)
-	}
-}
-
-// issue 26066
-// Wrong type of constant with GCC 8 and newer.
-
-func test26066(t *testing.T) {
-	var i = int64(C.issue26066)
-	if i != -1 {
-		t.Errorf("got %d, want -1", i)
-	}
-}
-
-// issue 26517
-var a C.TypeOne
-var b C.TypeTwo
-
-// issue 27660
-// Stress the interaction between the race detector and cgo in an
-// attempt to reproduce the memory corruption described in #27660.
-// The bug was very timing sensitive; at the time of writing this
-// test would only trigger the bug about once out of every five runs.
-
-func test27660(t *testing.T) {
-	ctx, cancel := context.WithCancel(context.Background())
-	defer cancel()
-	ints := make([]int, 100)
-	locks := make([]sync.Mutex, 100)
-	// Slowly create threads so that ThreadSanitizer is forced to
-	// frequently resize its SyncClocks.
-	for i := 0; i < 100; i++ {
-		go func() {
-			for ctx.Err() == nil {
-				// Sleep in C for long enough that it is likely that the runtime
-				// will retake this goroutine's currently wired P.
-				C.usleep(1000 /* 1ms */)
-				runtime.Gosched() // avoid starvation (see #28701)
-			}
-		}()
-		go func() {
-			// Trigger lots of synchronization and memory reads/writes to
-			// increase the likelihood that the race described in #27660
-			// results in corruption of ThreadSanitizer's internal state
-			// and thus an assertion failure or segfault.
-			i := 0
-			for ctx.Err() == nil {
-				j := rand.Intn(100)
-				locks[j].Lock()
-				ints[j]++
-				locks[j].Unlock()
-				// needed for gccgo, to avoid creation of an
-				// unpreemptible "fast path" in this loop. Choice
-				// of (1<<24) is somewhat arbitrary.
-				if i%(1<<24) == 0 {
-					runtime.Gosched()
-				}
-				i++
-
-			}
-		}()
-		time.Sleep(time.Millisecond)
-	}
-}
-
-// issue 28540
-
-func twoargsF() {
-	v := []string{}
-	C.twoargs1(C.twoargs2(), C.twoargs3(unsafe.Pointer(&v)))
-}
-
-// issue 28545
-
-func issue28545G(p **C.char) {
-	C.issue28545F(p, -1, (0))
-	C.issue28545F(p, 2+3, complex(1, 1))
-	C.issue28545F(p, issue28772Constant, issue28772Constant2)
-}
-
-// issue 28772 part 1 - part 2 in testx.go
-
-const issue28772Constant = C.issue28772Constant
-
-// issue 28896
-
-func offset(i int) uintptr {
-	var pi C.innerPacked
-	var po C.outerPacked
-	var ui C.innerUnpacked
-	var uo C.outerUnpacked
-	switch i {
-	case 0:
-		return unsafe.Offsetof(pi.f2)
-	case 1:
-		return unsafe.Offsetof(po.g2)
-	case 2:
-		return unsafe.Offsetof(ui.f2)
-	case 3:
-		return unsafe.Offsetof(uo.g2)
-	default:
-		panic("can't happen")
-	}
-}
-
-func test28896(t *testing.T) {
-	for i := 0; i < 4; i++ {
-		c := uintptr(C.offset(C.int(i)))
-		g := offset(i)
-		if c != g {
-			t.Errorf("%d: C: %d != Go %d", i, c, g)
-		}
-	}
-}
-
-// issue 29383
-// cgo's /*line*/ comments failed when inserted after '/',
-// because the result looked like a "//" comment.
-// No runtime test; just make sure it compiles.
-
-func Issue29383(n, size uint) int {
-	if ^C.size_t(0)/C.size_t(n) < C.size_t(size) {
-		return 0
-	}
-	return 0
-}
-
-// issue 29748
-// Error handling a struct initializer that requires pointer checking.
-// Compilation test only, nothing to run.
-
-var Vissue29748 = C.f29748(&C.S29748{
-	nil,
-})
-
-func Fissue299748() {
-	C.f29748(&C.S29748{
-		nil,
-	})
-}
-
-// issue 29781
-
-var issue29781X struct{ X int }
-
-func issue29781F(...int) int { return 0 }
-
-func issue29781G() {
-	var p *C.char
-	C.issue29781F(&p, C.ISSUE29781C+1)
-	C.issue29781F(nil, (C.int)(
-		0))
-	C.issue29781F(&p, (C.int)(0))
-	C.issue29781F(&p, (C.int)(
-		0))
-	C.issue29781F(&p, (C.int)(issue29781X.
-		X))
-}
-
-// issue 30065
-
-func test30065(t *testing.T) {
-	var a [256]byte
-	b := []byte("a")
-	C.memcpy(unsafe.Pointer(&a), unsafe.Pointer(&b[0]), 1)
-	if a[0] != 'a' {
-		t.Errorf("&a failed: got %c, want %c", a[0], 'a')
-	}
-
-	b = []byte("b")
-	C.memcpy(unsafe.Pointer(&a[0]), unsafe.Pointer(&b[0]), 1)
-	if a[0] != 'b' {
-		t.Errorf("&a[0] failed: got %c, want %c", a[0], 'b')
-	}
-
-	d := make([]byte, 256)
-	b = []byte("c")
-	C.memcpy(unsafe.Pointer(&d[0]), unsafe.Pointer(&b[0]), 1)
-	if d[0] != 'c' {
-		t.Errorf("&d[0] failed: got %c, want %c", d[0], 'c')
-	}
-}
-
-// issue 31093
-// No runtime test; just make sure it compiles.
-
-func Issue31093() {
-	C.issue31093F(C.ushort(0))
-}
-
-// issue 32579
-
-func test32579(t *testing.T) {
-	var s [1]C.struct_S32579
-	C.memset(unsafe.Pointer(&s[0].data[0]), 1, 1)
-	if s[0].data[0] != 1 {
-		t.Errorf("&s[0].data[0] failed: got %d, want %d", s[0].data[0], 1)
-	}
-}
-
-// issue 37033, check if cgo.Handle works properly
-
-func testHandle(t *testing.T) {
-	ch := make(chan int)
-
-	for i := 0; i < 42; i++ {
-		h := cgo.NewHandle(ch)
-		go func() {
-			C.cFunc37033(C.uintptr_t(h))
-		}()
-		if v := <-ch; issue37033 != v {
-			t.Fatalf("unexpected receiving value: got %d, want %d", v, issue37033)
-		}
-		h.Delete()
-	}
-}
-
-// issue 38649
-
-var issue38649 C.netbsd_gid = 42
-
-// issue 39877
-
-var issue39877 *C.void = nil
-
-// issue 40494
-// No runtime test; just make sure it compiles.
-
-func Issue40494() {
-	C.issue40494(C.enum_Enum40494(C.X_40494), (*C.union_Union40494)(nil))
-}
-
-// Issue 45451.
-func test45451(t *testing.T) {
-	var u *C.issue45451
-	typ := reflect.ValueOf(u).Type().Elem()
-
-	// The type is undefined in C so allocating it should panic.
-	defer func() {
-		if r := recover(); r == nil {
-			t.Error("expected panic")
-		}
-	}()
-
-	_ = reflect.New(typ)
-	t.Errorf("reflect.New(%v) should have panicked", typ)
-}
-
-// issue 52542
-
-func func52542[T ~[]C.int]() {}
-
-type type52542[T ~*C.float] struct{}
diff --git a/misc/cgo/test/test26213.go b/misc/cgo/test/test26213.go
deleted file mode 100644
index f8149cd..0000000
--- a/misc/cgo/test/test26213.go
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-import (
-	"testing"
-
-	"misc/cgo/test/issue26213"
-)
-
-func test26213(t *testing.T) {
-	issue26213.Test26213(t)
-}
diff --git a/misc/cgo/test/test_unix.go b/misc/cgo/test/test_unix.go
deleted file mode 100644
index 831b9ca..0000000
--- a/misc/cgo/test/test_unix.go
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2019 The Go 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:build !windows
-// +build !windows
-
-package cgotest
-
-import "syscall"
-
-var syscall_dot_SIGCHLD = syscall.SIGCHLD
diff --git a/misc/cgo/test/testx.go b/misc/cgo/test/testx.go
deleted file mode 100644
index 6a8e97d..0000000
--- a/misc/cgo/test/testx.go
+++ /dev/null
@@ -1,583 +0,0 @@
-// Copyright 2011 The Go 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 cgo.
-// Both the import "C" prologue and the main file are sorted by issue number.
-// This file contains //export directives on Go functions
-// and so it must NOT contain C definitions (only declarations).
-// See test.go for C definitions.
-
-package cgotest
-
-import (
-	"runtime"
-	"runtime/cgo"
-	"runtime/debug"
-	"strings"
-	"sync"
-	"sync/atomic"
-	"testing"
-	"unsafe"
-)
-
-/*
-// threads
-extern void doAdd(int, int);
-
-// issue 1328
-void IntoC(void);
-
-// issue 1560
-extern void Issue1560InC(void);
-
-// twoSleep returns the absolute start time of the first sleep
-// in ms.
-long long twoSleep(int);
-
-// issue 3775
-void lockOSThreadC(void);
-int usleep(unsigned usec);
-
-// issue 4054 part 2 - part 1 in test.go
-typedef enum {
-	A = 0,
-	B,
-	C,
-	D,
-	E,
-	F,
-	G,
-	H,
-	II,
-	J,
-} issue4054b;
-
-// issue 5548
-
-extern int issue5548_in_c(void);
-
-// issue 6833
-
-extern unsigned long long issue6833Func(unsigned int, unsigned long long);
-
-// issue 6907
-
-extern int CheckIssue6907C(_GoString_);
-
-// issue 7665
-
-extern void f7665(void);
-
-// issue 7978
-// Stack tracing didn't work during cgo code after calling a Go
-// callback.  Make sure GC works and the stack trace is correct.
-
-#include <stdint.h>
-
-// use ugly atomic variable sync since that doesn't require calling back into
-// Go code or OS dependencies
-void issue7978c(uint32_t *sync);
-
-// issue 8331 part 2 - part 1 in test.go
-// A typedef of an unnamed struct is the same struct when
-// #include'd twice.  No runtime test; just make sure it compiles.
-#include "issue8331.h"
-
-// issue 8945
-
-typedef void (*PFunc8945)();
-extern PFunc8945 func8945; // definition is in test.go
-
-// issue 20910
-void callMulti(void);
-
-// issue 28772 part 2 - part 1 in issuex.go
-#define issue28772Constant2 2
-
-
-// issue 31891
-typedef struct {
-	long obj;
-} Issue31891A;
-
-typedef struct {
-	long obj;
-} Issue31891B;
-
-void callIssue31891(void);
-
-typedef struct {
-	int i;
-} Issue38408, *PIssue38408;
-
-extern void cfunc49633(void*); // definition is in test.go
-*/
-import "C"
-
-// exports
-
-//export ReturnIntLong
-func ReturnIntLong() (int, C.long) {
-	return 1, 2
-}
-
-//export gc
-func gc() {
-	runtime.GC()
-}
-
-// threads
-
-var sum struct {
-	sync.Mutex
-	i int
-}
-
-//export Add
-func Add(x int) {
-	defer func() {
-		recover()
-	}()
-	sum.Lock()
-	sum.i += x
-	sum.Unlock()
-	var p *int
-	*p = 2
-}
-
-func testCthread(t *testing.T) {
-	if (runtime.GOOS == "darwin" || runtime.GOOS == "ios") && runtime.GOARCH == "arm64" {
-		t.Skip("the iOS exec wrapper is unable to properly handle the panic from Add")
-	}
-	sum.i = 0
-	C.doAdd(10, 6)
-
-	want := 10 * (10 - 1) / 2 * 6
-	if sum.i != want {
-		t.Fatalf("sum=%d, want %d", sum.i, want)
-	}
-}
-
-// issue 1328
-
-//export BackIntoGo
-func BackIntoGo() {
-	x := 1
-
-	for i := 0; i < 10000; i++ {
-		xvariadic(x)
-		if x != 1 {
-			panic("x is not 1?")
-		}
-	}
-}
-
-func xvariadic(x ...interface{}) {
-}
-
-func test1328(t *testing.T) {
-	C.IntoC()
-}
-
-// issue 1560
-// Test that C functions and Go functions run in parallel.
-
-var (
-	issue1560 int32
-
-	issue1560Ch = make(chan bool, 2)
-)
-
-//export Issue1560FromC
-func Issue1560FromC() {
-	for atomic.LoadInt32(&issue1560) != 1 {
-		runtime.Gosched()
-	}
-	atomic.AddInt32(&issue1560, 1)
-	for atomic.LoadInt32(&issue1560) != 3 {
-		runtime.Gosched()
-	}
-	issue1560Ch <- true
-}
-
-func Issue1560FromGo() {
-	atomic.AddInt32(&issue1560, 1)
-	for atomic.LoadInt32(&issue1560) != 2 {
-		runtime.Gosched()
-	}
-	atomic.AddInt32(&issue1560, 1)
-	issue1560Ch <- true
-}
-
-func test1560(t *testing.T) {
-	go Issue1560FromGo()
-	go C.Issue1560InC()
-	<-issue1560Ch
-	<-issue1560Ch
-}
-
-// issue 2462
-
-//export exportbyte
-func exportbyte() byte {
-	return 0
-}
-
-//export exportbool
-func exportbool() bool {
-	return false
-}
-
-//export exportrune
-func exportrune() rune {
-	return 0
-}
-
-//export exporterror
-func exporterror() error {
-	return nil
-}
-
-//export exportint
-func exportint() int {
-	return 0
-}
-
-//export exportuint
-func exportuint() uint {
-	return 0
-}
-
-//export exportuintptr
-func exportuintptr() uintptr {
-	return (uintptr)(0)
-}
-
-//export exportint8
-func exportint8() int8 {
-	return 0
-}
-
-//export exportuint8
-func exportuint8() uint8 {
-	return 0
-}
-
-//export exportint16
-func exportint16() int16 {
-	return 0
-}
-
-//export exportuint16
-func exportuint16() uint16 {
-	return 0
-}
-
-//export exportint32
-func exportint32() int32 {
-	return 0
-}
-
-//export exportuint32
-func exportuint32() uint32 {
-	return 0
-}
-
-//export exportint64
-func exportint64() int64 {
-	return 0
-}
-
-//export exportuint64
-func exportuint64() uint64 {
-	return 0
-}
-
-//export exportfloat32
-func exportfloat32() float32 {
-	return 0
-}
-
-//export exportfloat64
-func exportfloat64() float64 {
-	return 0
-}
-
-//export exportcomplex64
-func exportcomplex64() complex64 {
-	return 0
-}
-
-//export exportcomplex128
-func exportcomplex128() complex128 {
-	return 0
-}
-
-// issue 3741
-
-//export exportSliceIn
-func exportSliceIn(s []byte) bool {
-	return len(s) == cap(s)
-}
-
-//export exportSliceOut
-func exportSliceOut() []byte {
-	return []byte{1}
-}
-
-//export exportSliceInOut
-func exportSliceInOut(s []byte) []byte {
-	return s
-}
-
-// issue 3775
-
-func init() {
-	if runtime.GOOS == "android" {
-		return
-	}
-	// Same as test3775 but run during init so that
-	// there are two levels of internal runtime lock
-	// (1 for init, 1 for cgo).
-	// This would have been broken by CL 11663043.
-	C.lockOSThreadC()
-}
-
-func test3775(t *testing.T) {
-	if runtime.GOOS == "android" {
-		return
-	}
-	// Used to panic because of the UnlockOSThread below.
-	C.lockOSThreadC()
-}
-
-//export lockOSThreadCallback
-func lockOSThreadCallback() {
-	runtime.LockOSThread()
-	runtime.UnlockOSThread()
-	go C.usleep(10000)
-	runtime.Gosched()
-}
-
-// issue 4054 part 2 - part 1 in test.go
-
-var issue4054b = []int{C.A, C.B, C.C, C.D, C.E, C.F, C.G, C.H, C.II, C.J}
-
-//export issue5548FromC
-func issue5548FromC(s string, i int) int {
-	if len(s) == 4 && s == "test" && i == 42 {
-		return 12345
-	}
-	println("got", len(s), i)
-	return 9876
-}
-
-func test5548(t *testing.T) {
-	if x := C.issue5548_in_c(); x != 12345 {
-		t.Errorf("issue5548_in_c = %d, want %d", x, 12345)
-	}
-}
-
-// issue 6833
-
-//export GoIssue6833Func
-func GoIssue6833Func(aui uint, aui64 uint64) uint64 {
-	return aui64 + uint64(aui)
-}
-
-func test6833(t *testing.T) {
-	ui := 7
-	ull := uint64(0x4000300020001000)
-	v := uint64(C.issue6833Func(C.uint(ui), C.ulonglong(ull)))
-	exp := uint64(ui) + ull
-	if v != exp {
-		t.Errorf("issue6833Func() returns %x, expected %x", v, exp)
-	}
-}
-
-// issue 6907
-
-const CString = "C string"
-
-//export CheckIssue6907Go
-func CheckIssue6907Go(s string) C.int {
-	if s == CString {
-		return 1
-	}
-	return 0
-}
-
-func test6907Go(t *testing.T) {
-	if got := C.CheckIssue6907C(CString); got != 1 {
-		t.Errorf("C.CheckIssue6907C() == %d, want %d", got, 1)
-	}
-}
-
-// issue 7665
-
-var bad7665 unsafe.Pointer = C.f7665
-var good7665 uintptr = uintptr(C.f7665)
-
-func test7665(t *testing.T) {
-	if bad7665 == nil || uintptr(bad7665) != good7665 {
-		t.Errorf("ptrs = %p, %#x, want same non-nil pointer", bad7665, good7665)
-	}
-}
-
-// issue 7978
-
-var issue7978sync uint32
-
-func issue7978check(t *testing.T, wantFunc string, badFunc string, depth int) {
-	runtime.GC()
-	buf := make([]byte, 65536)
-	trace := string(buf[:runtime.Stack(buf, true)])
-	for _, goroutine := range strings.Split(trace, "\n\n") {
-		if strings.Contains(goroutine, "test.issue7978go") {
-			trace := strings.Split(goroutine, "\n")
-			// look for the expected function in the stack
-			for i := 0; i < depth; i++ {
-				if badFunc != "" && strings.Contains(trace[1+2*i], badFunc) {
-					t.Errorf("bad stack: found %s in the stack:\n%s", badFunc, goroutine)
-					return
-				}
-				if strings.Contains(trace[1+2*i], wantFunc) {
-					return
-				}
-			}
-			t.Errorf("bad stack: didn't find %s in the stack:\n%s", wantFunc, goroutine)
-			return
-		}
-	}
-	t.Errorf("bad stack: goroutine not found. Full stack dump:\n%s", trace)
-}
-
-func issue7978wait(store uint32, wait uint32) {
-	if store != 0 {
-		atomic.StoreUint32(&issue7978sync, store)
-	}
-	for atomic.LoadUint32(&issue7978sync) != wait {
-		runtime.Gosched()
-	}
-}
-
-//export issue7978cb
-func issue7978cb() {
-	// Force a stack growth from the callback to put extra
-	// pressure on the runtime. See issue #17785.
-	growStack(64)
-	issue7978wait(3, 4)
-}
-
-func growStack(n int) int {
-	var buf [128]int
-	if n == 0 {
-		return 0
-	}
-	return buf[growStack(n-1)]
-}
-
-func issue7978go() {
-	C.issue7978c((*C.uint32_t)(&issue7978sync))
-	issue7978wait(7, 8)
-}
-
-func test7978(t *testing.T) {
-	if runtime.Compiler == "gccgo" {
-		t.Skip("gccgo can not do stack traces of C code")
-	}
-	debug.SetTraceback("2")
-	issue7978sync = 0
-	go issue7978go()
-	// test in c code, before callback
-	issue7978wait(0, 1)
-	issue7978check(t, "_Cfunc_issue7978c(", "", 1)
-	// test in go code, during callback
-	issue7978wait(2, 3)
-	issue7978check(t, "test.issue7978cb(", "test.issue7978go", 3)
-	// test in c code, after callback
-	issue7978wait(4, 5)
-	issue7978check(t, "_Cfunc_issue7978c(", "_cgoexpwrap", 1)
-	// test in go code, after return from cgo
-	issue7978wait(6, 7)
-	issue7978check(t, "test.issue7978go(", "", 3)
-	atomic.StoreUint32(&issue7978sync, 8)
-}
-
-// issue 8331 part 2
-
-var issue8331Var C.issue8331
-
-// issue 8945
-
-//export Test8945
-func Test8945() {
-	_ = C.func8945
-}
-
-// issue 20910
-
-//export multi
-func multi() (*C.char, C.int) {
-	return C.CString("multi"), 0
-}
-
-func test20910(t *testing.T) {
-	C.callMulti()
-}
-
-// issue 28772 part 2
-
-const issue28772Constant2 = C.issue28772Constant2
-
-// issue 31891
-
-//export useIssue31891A
-func useIssue31891A(c *C.Issue31891A) {}
-
-//export useIssue31891B
-func useIssue31891B(c *C.Issue31891B) {}
-
-func test31891(t *testing.T) {
-	C.callIssue31891()
-}
-
-// issue 37033, check if cgo.Handle works properly
-
-var issue37033 = 42
-
-//export GoFunc37033
-func GoFunc37033(handle C.uintptr_t) {
-	h := cgo.Handle(handle)
-	ch := h.Value().(chan int)
-	ch <- issue37033
-}
-
-// issue 38408
-// A typedef pointer can be used as the element type.
-// No runtime test; just make sure it compiles.
-var _ C.PIssue38408 = &C.Issue38408{i: 1}
-
-// issue 49633, example use of cgo.Handle with void*
-
-type data49633 struct {
-	msg string
-}
-
-//export GoFunc49633
-func GoFunc49633(context unsafe.Pointer) {
-	h := *(*cgo.Handle)(context)
-	v := h.Value().(*data49633)
-	v.msg = "hello"
-}
-
-func test49633(t *testing.T) {
-	v := &data49633{}
-	h := cgo.NewHandle(v)
-	defer h.Delete()
-	C.cfunc49633(unsafe.Pointer(&h))
-	if v.msg != "hello" {
-		t.Errorf("msg = %q, want 'hello'", v.msg)
-	}
-}
diff --git a/misc/cgo/testcarchive/carchive_test.go b/misc/cgo/testcarchive/carchive_test.go
deleted file mode 100644
index 30e12be..0000000
--- a/misc/cgo/testcarchive/carchive_test.go
+++ /dev/null
@@ -1,1240 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package carchive_test
-
-import (
-	"bufio"
-	"bytes"
-	"debug/elf"
-	"flag"
-	"fmt"
-	"io"
-	"log"
-	"os"
-	"os/exec"
-	"path/filepath"
-	"regexp"
-	"runtime"
-	"strconv"
-	"strings"
-	"sync"
-	"syscall"
-	"testing"
-	"time"
-	"unicode"
-)
-
-// Program to run.
-var bin []string
-
-// C compiler with args (from $(go env CC) $(go env GOGCCFLAGS)).
-var cc []string
-
-// ".exe" on Windows.
-var exeSuffix string
-
-var GOOS, GOARCH, GOPATH string
-var libgodir string
-
-var testWork bool // If true, preserve temporary directories.
-
-func TestMain(m *testing.M) {
-	flag.BoolVar(&testWork, "testwork", false, "if true, log and preserve the test's temporary working directory")
-	flag.Parse()
-	if testing.Short() && os.Getenv("GO_BUILDER_NAME") == "" {
-		fmt.Printf("SKIP - short mode and $GO_BUILDER_NAME not set\n")
-		os.Exit(0)
-	}
-	if runtime.GOOS == "linux" {
-		if _, err := os.Stat("/etc/alpine-release"); err == nil {
-			fmt.Printf("SKIP - skipping failing test on alpine - go.dev/issue/19938\n")
-			os.Exit(0)
-		}
-	}
-
-	log.SetFlags(log.Lshortfile)
-	os.Exit(testMain(m))
-}
-
-func testMain(m *testing.M) int {
-	// We need a writable GOPATH in which to run the tests.
-	// Construct one in a temporary directory.
-	var err error
-	GOPATH, err = os.MkdirTemp("", "carchive_test")
-	if err != nil {
-		log.Panic(err)
-	}
-	if testWork {
-		log.Println(GOPATH)
-	} else {
-		defer os.RemoveAll(GOPATH)
-	}
-	os.Setenv("GOPATH", GOPATH)
-
-	// Copy testdata into GOPATH/src/testarchive, along with a go.mod file
-	// declaring the same path.
-	modRoot := filepath.Join(GOPATH, "src", "testcarchive")
-	if err := overlayDir(modRoot, "testdata"); err != nil {
-		log.Panic(err)
-	}
-	if err := os.Chdir(modRoot); err != nil {
-		log.Panic(err)
-	}
-	os.Setenv("PWD", modRoot)
-	if err := os.WriteFile("go.mod", []byte("module testcarchive\n"), 0666); err != nil {
-		log.Panic(err)
-	}
-
-	GOOS = goEnv("GOOS")
-	GOARCH = goEnv("GOARCH")
-	bin = cmdToRun("./testp")
-
-	ccOut := goEnv("CC")
-	cc = []string{string(ccOut)}
-
-	out := goEnv("GOGCCFLAGS")
-	quote := '\000'
-	start := 0
-	lastSpace := true
-	backslash := false
-	s := string(out)
-	for i, c := range s {
-		if quote == '\000' && unicode.IsSpace(c) {
-			if !lastSpace {
-				cc = append(cc, s[start:i])
-				lastSpace = true
-			}
-		} else {
-			if lastSpace {
-				start = i
-				lastSpace = false
-			}
-			if quote == '\000' && !backslash && (c == '"' || c == '\'') {
-				quote = c
-				backslash = false
-			} else if !backslash && quote == c {
-				quote = '\000'
-			} else if (quote == '\000' || quote == '"') && !backslash && c == '\\' {
-				backslash = true
-			} else {
-				backslash = false
-			}
-		}
-	}
-	if !lastSpace {
-		cc = append(cc, s[start:])
-	}
-
-	if GOOS == "aix" {
-		// -Wl,-bnoobjreorder is mandatory to keep the same layout
-		// in .text section.
-		cc = append(cc, "-Wl,-bnoobjreorder")
-	}
-	libbase := GOOS + "_" + GOARCH
-	if runtime.Compiler == "gccgo" {
-		libbase = "gccgo_" + libgodir + "_fPIC"
-	} else {
-		switch GOOS {
-		case "darwin", "ios":
-			if GOARCH == "arm64" {
-				libbase += "_shared"
-			}
-		case "dragonfly", "freebsd", "linux", "netbsd", "openbsd", "solaris", "illumos":
-			libbase += "_shared"
-		}
-	}
-	libgodir = filepath.Join(GOPATH, "pkg", libbase, "testcarchive")
-	cc = append(cc, "-I", libgodir)
-
-	// Force reallocation (and avoid aliasing bugs) for parallel tests that append to cc.
-	cc = cc[:len(cc):len(cc)]
-
-	if GOOS == "windows" {
-		exeSuffix = ".exe"
-	}
-
-	return m.Run()
-}
-
-func goEnv(key string) string {
-	out, err := exec.Command("go", "env", key).Output()
-	if err != nil {
-		if ee, ok := err.(*exec.ExitError); ok {
-			fmt.Fprintf(os.Stderr, "%s", ee.Stderr)
-		}
-		log.Panicf("go env %s failed:\n%s\n", key, err)
-	}
-	return strings.TrimSpace(string(out))
-}
-
-func cmdToRun(name string) []string {
-	execScript := "go_" + goEnv("GOOS") + "_" + goEnv("GOARCH") + "_exec"
-	executor, err := exec.LookPath(execScript)
-	if err != nil {
-		return []string{name}
-	}
-	return []string{executor, name}
-}
-
-// genHeader writes a C header file for the C-exported declarations found in .go
-// source files in dir.
-//
-// TODO(golang.org/issue/35715): This should be simpler.
-func genHeader(t *testing.T, header, dir string) {
-	t.Helper()
-
-	// The 'cgo' command generates a number of additional artifacts,
-	// but we're only interested in the header.
-	// Shunt the rest of the outputs to a temporary directory.
-	objDir, err := os.MkdirTemp(GOPATH, "_obj")
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer os.RemoveAll(objDir)
-
-	files, err := filepath.Glob(filepath.Join(dir, "*.go"))
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	cmd := exec.Command("go", "tool", "cgo",
-		"-objdir", objDir,
-		"-exportheader", header)
-	cmd.Args = append(cmd.Args, files...)
-	t.Log(cmd.Args)
-	if out, err := cmd.CombinedOutput(); err != nil {
-		t.Logf("%s", out)
-		t.Fatal(err)
-	}
-}
-
-func testInstall(t *testing.T, exe, libgoa, libgoh string, buildcmd ...string) {
-	t.Helper()
-	cmd := exec.Command(buildcmd[0], buildcmd[1:]...)
-	cmd.Env = append(cmd.Environ(), "GO111MODULE=off") // 'go install' only works in GOPATH mode
-	t.Log(buildcmd)
-	if out, err := cmd.CombinedOutput(); err != nil {
-		t.Logf("%s", out)
-		t.Fatal(err)
-	}
-	if !testWork {
-		defer func() {
-			os.Remove(libgoa)
-			os.Remove(libgoh)
-		}()
-	}
-
-	ccArgs := append(cc, "-o", exe, "main.c")
-	if GOOS == "windows" {
-		ccArgs = append(ccArgs, "main_windows.c", libgoa, "-lntdll", "-lws2_32", "-lwinmm")
-	} else {
-		ccArgs = append(ccArgs, "main_unix.c", libgoa)
-	}
-	if runtime.Compiler == "gccgo" {
-		ccArgs = append(ccArgs, "-lgo")
-	}
-	t.Log(ccArgs)
-	if out, err := exec.Command(ccArgs[0], ccArgs[1:]...).CombinedOutput(); err != nil {
-		t.Logf("%s", out)
-		t.Fatal(err)
-	}
-	if !testWork {
-		defer os.Remove(exe)
-	}
-
-	binArgs := append(cmdToRun(exe), "arg1", "arg2")
-	cmd = exec.Command(binArgs[0], binArgs[1:]...)
-	if runtime.Compiler == "gccgo" {
-		cmd.Env = append(cmd.Environ(), "GCCGO=1")
-	}
-	if out, err := cmd.CombinedOutput(); err != nil {
-		t.Logf("%s", out)
-		t.Fatal(err)
-	}
-
-	checkLineComments(t, libgoh)
-}
-
-var badLineRegexp = regexp.MustCompile(`(?m)^#line [0-9]+ "/.*$`)
-
-// checkLineComments checks that the export header generated by
-// -buildmode=c-archive doesn't have any absolute paths in the #line
-// comments. We don't want those paths because they are unhelpful for
-// the user and make the files change based on details of the location
-// of GOPATH.
-func checkLineComments(t *testing.T, hdrname string) {
-	hdr, err := os.ReadFile(hdrname)
-	if err != nil {
-		if !os.IsNotExist(err) {
-			t.Error(err)
-		}
-		return
-	}
-	if line := badLineRegexp.Find(hdr); line != nil {
-		t.Errorf("bad #line directive with absolute path in %s: %q", hdrname, line)
-	}
-}
-
-// checkArchive verifies that the created library looks OK.
-// We just check a couple of things now, we can add more checks as needed.
-func checkArchive(t *testing.T, arname string) {
-	t.Helper()
-
-	switch GOOS {
-	case "aix", "darwin", "ios", "windows":
-		// We don't have any checks for non-ELF libraries yet.
-		if _, err := os.Stat(arname); err != nil {
-			t.Errorf("archive %s does not exist: %v", arname, err)
-		}
-	default:
-		checkELFArchive(t, arname)
-	}
-}
-
-// checkELFArchive checks an ELF archive.
-func checkELFArchive(t *testing.T, arname string) {
-	t.Helper()
-
-	f, err := os.Open(arname)
-	if err != nil {
-		t.Errorf("archive %s does not exist: %v", arname, err)
-		return
-	}
-	defer f.Close()
-
-	// TODO(iant): put these in a shared package?  But where?
-	const (
-		magic = "!<arch>\n"
-		fmag  = "`\n"
-
-		namelen = 16
-		datelen = 12
-		uidlen  = 6
-		gidlen  = 6
-		modelen = 8
-		sizelen = 10
-		fmaglen = 2
-		hdrlen  = namelen + datelen + uidlen + gidlen + modelen + sizelen + fmaglen
-	)
-
-	type arhdr struct {
-		name string
-		date string
-		uid  string
-		gid  string
-		mode string
-		size string
-		fmag string
-	}
-
-	var magbuf [len(magic)]byte
-	if _, err := io.ReadFull(f, magbuf[:]); err != nil {
-		t.Errorf("%s: archive too short", arname)
-		return
-	}
-	if string(magbuf[:]) != magic {
-		t.Errorf("%s: incorrect archive magic string %q", arname, magbuf)
-	}
-
-	off := int64(len(magic))
-	for {
-		if off&1 != 0 {
-			var b [1]byte
-			if _, err := f.Read(b[:]); err != nil {
-				if err == io.EOF {
-					break
-				}
-				t.Errorf("%s: error skipping alignment byte at %d: %v", arname, off, err)
-			}
-			off++
-		}
-
-		var hdrbuf [hdrlen]byte
-		if _, err := io.ReadFull(f, hdrbuf[:]); err != nil {
-			if err == io.EOF {
-				break
-			}
-			t.Errorf("%s: error reading archive header at %d: %v", arname, off, err)
-			return
-		}
-
-		var hdr arhdr
-		hdrslice := hdrbuf[:]
-		set := func(len int, ps *string) {
-			*ps = string(bytes.TrimSpace(hdrslice[:len]))
-			hdrslice = hdrslice[len:]
-		}
-		set(namelen, &hdr.name)
-		set(datelen, &hdr.date)
-		set(uidlen, &hdr.uid)
-		set(gidlen, &hdr.gid)
-		set(modelen, &hdr.mode)
-		set(sizelen, &hdr.size)
-		hdr.fmag = string(hdrslice[:fmaglen])
-		hdrslice = hdrslice[fmaglen:]
-		if len(hdrslice) != 0 {
-			t.Fatalf("internal error: len(hdrslice) == %d", len(hdrslice))
-		}
-
-		if hdr.fmag != fmag {
-			t.Errorf("%s: invalid fmagic value %q at %d", arname, hdr.fmag, off)
-			return
-		}
-
-		size, err := strconv.ParseInt(hdr.size, 10, 64)
-		if err != nil {
-			t.Errorf("%s: error parsing size %q at %d: %v", arname, hdr.size, off, err)
-			return
-		}
-
-		off += hdrlen
-
-		switch hdr.name {
-		case "__.SYMDEF", "/", "/SYM64/":
-			// The archive symbol map.
-		case "//", "ARFILENAMES/":
-			// The extended name table.
-		default:
-			// This should be an ELF object.
-			checkELFArchiveObject(t, arname, off, io.NewSectionReader(f, off, size))
-		}
-
-		off += size
-		if _, err := f.Seek(off, io.SeekStart); err != nil {
-			t.Errorf("%s: failed to seek to %d: %v", arname, off, err)
-		}
-	}
-}
-
-// checkELFArchiveObject checks an object in an ELF archive.
-func checkELFArchiveObject(t *testing.T, arname string, off int64, obj io.ReaderAt) {
-	t.Helper()
-
-	ef, err := elf.NewFile(obj)
-	if err != nil {
-		t.Errorf("%s: failed to open ELF file at %d: %v", arname, off, err)
-		return
-	}
-	defer ef.Close()
-
-	// Verify section types.
-	for _, sec := range ef.Sections {
-		want := elf.SHT_NULL
-		switch sec.Name {
-		case ".text", ".data":
-			want = elf.SHT_PROGBITS
-		case ".bss":
-			want = elf.SHT_NOBITS
-		case ".symtab":
-			want = elf.SHT_SYMTAB
-		case ".strtab":
-			want = elf.SHT_STRTAB
-		case ".init_array":
-			want = elf.SHT_INIT_ARRAY
-		case ".fini_array":
-			want = elf.SHT_FINI_ARRAY
-		case ".preinit_array":
-			want = elf.SHT_PREINIT_ARRAY
-		}
-		if want != elf.SHT_NULL && sec.Type != want {
-			t.Errorf("%s: incorrect section type in elf file at %d for section %q: got %v want %v", arname, off, sec.Name, sec.Type, want)
-		}
-	}
-}
-
-func TestInstall(t *testing.T) {
-	if !testWork {
-		defer os.RemoveAll(filepath.Join(GOPATH, "pkg"))
-	}
-
-	libgoa := "libgo.a"
-	if runtime.Compiler == "gccgo" {
-		libgoa = "liblibgo.a"
-	}
-
-	// Generate the p.h header file.
-	//
-	// 'go install -i -buildmode=c-archive ./libgo' would do that too, but that
-	// would also attempt to install transitive standard-library dependencies to
-	// GOROOT, and we cannot assume that GOROOT is writable. (A non-root user may
-	// be running this test in a GOROOT owned by root.)
-	genHeader(t, "p.h", "./p")
-
-	testInstall(t, "./testp1"+exeSuffix,
-		filepath.Join(libgodir, libgoa),
-		filepath.Join(libgodir, "libgo.h"),
-		"go", "install", "-buildmode=c-archive", "./libgo")
-
-	// Test building libgo other than installing it.
-	// Header files are now present.
-	testInstall(t, "./testp2"+exeSuffix, "libgo.a", "libgo.h",
-		"go", "build", "-buildmode=c-archive", filepath.Join(".", "libgo", "libgo.go"))
-
-	testInstall(t, "./testp3"+exeSuffix, "libgo.a", "libgo.h",
-		"go", "build", "-buildmode=c-archive", "-o", "libgo.a", "./libgo")
-}
-
-func TestEarlySignalHandler(t *testing.T) {
-	switch GOOS {
-	case "darwin", "ios":
-		switch GOARCH {
-		case "arm64":
-			t.Skipf("skipping on %s/%s; see https://golang.org/issue/13701", GOOS, GOARCH)
-		}
-	case "windows":
-		t.Skip("skipping signal test on Windows")
-	}
-
-	if !testWork {
-		defer func() {
-			os.Remove("libgo2.a")
-			os.Remove("libgo2.h")
-			os.Remove("testp" + exeSuffix)
-			os.RemoveAll(filepath.Join(GOPATH, "pkg"))
-		}()
-	}
-
-	cmd := exec.Command("go", "build", "-buildmode=c-archive", "-o", "libgo2.a", "./libgo2")
-	if out, err := cmd.CombinedOutput(); err != nil {
-		t.Logf("%s", out)
-		t.Fatal(err)
-	}
-	checkLineComments(t, "libgo2.h")
-	checkArchive(t, "libgo2.a")
-
-	ccArgs := append(cc, "-o", "testp"+exeSuffix, "main2.c", "libgo2.a")
-	if runtime.Compiler == "gccgo" {
-		ccArgs = append(ccArgs, "-lgo")
-	}
-	if out, err := exec.Command(ccArgs[0], ccArgs[1:]...).CombinedOutput(); err != nil {
-		t.Logf("%s", out)
-		t.Fatal(err)
-	}
-
-	darwin := "0"
-	if runtime.GOOS == "darwin" {
-		darwin = "1"
-	}
-	cmd = exec.Command(bin[0], append(bin[1:], darwin)...)
-
-	if out, err := cmd.CombinedOutput(); err != nil {
-		t.Logf("%s", out)
-		t.Fatal(err)
-	}
-}
-
-func TestSignalForwarding(t *testing.T) {
-	checkSignalForwardingTest(t)
-	buildSignalForwardingTest(t)
-
-	cmd := exec.Command(bin[0], append(bin[1:], "1")...)
-
-	out, err := cmd.CombinedOutput()
-	t.Logf("%v\n%s", cmd.Args, out)
-	expectSignal(t, err, syscall.SIGSEGV, 0)
-
-	// SIGPIPE is never forwarded on darwin. See golang.org/issue/33384.
-	if runtime.GOOS != "darwin" && runtime.GOOS != "ios" {
-		// Test SIGPIPE forwarding
-		cmd = exec.Command(bin[0], append(bin[1:], "3")...)
-
-		out, err = cmd.CombinedOutput()
-		if len(out) > 0 {
-			t.Logf("%s", out)
-		}
-		expectSignal(t, err, syscall.SIGPIPE, 0)
-	}
-}
-
-func TestSignalForwardingExternal(t *testing.T) {
-	if GOOS == "freebsd" || GOOS == "aix" {
-		t.Skipf("skipping on %s/%s; signal always goes to the Go runtime", GOOS, GOARCH)
-	} else if GOOS == "darwin" && GOARCH == "amd64" {
-		t.Skipf("skipping on %s/%s: runtime does not permit SI_USER SIGSEGV", GOOS, GOARCH)
-	}
-	checkSignalForwardingTest(t)
-	buildSignalForwardingTest(t)
-
-	// We want to send the process a signal and see if it dies.
-	// Normally the signal goes to the C thread, the Go signal
-	// handler picks it up, sees that it is running in a C thread,
-	// and the program dies. Unfortunately, occasionally the
-	// signal is delivered to a Go thread, which winds up
-	// discarding it because it was sent by another program and
-	// there is no Go handler for it. To avoid this, run the
-	// program several times in the hopes that it will eventually
-	// fail.
-	const tries = 20
-	for i := 0; i < tries; i++ {
-		err := runSignalForwardingTest(t, "2")
-		if err == nil {
-			continue
-		}
-
-		// If the signal is delivered to a C thread, as expected,
-		// the Go signal handler will disable itself and re-raise
-		// the signal, causing the program to die with SIGSEGV.
-		//
-		// It is also possible that the signal will be
-		// delivered to a Go thread, such as a GC thread.
-		// Currently when the Go runtime sees that a SIGSEGV was
-		// sent from a different program, it first tries to send
-		// the signal to the os/signal API. If nothing is looking
-		// for (or explicitly ignoring) SIGSEGV, then it crashes.
-		// Because the Go runtime is invoked via a c-archive,
-		// it treats this as GOTRACEBACK=crash, meaning that it
-		// dumps a stack trace for all goroutines, which it does
-		// by raising SIGQUIT. The effect is that we will see the
-		// program die with SIGQUIT in that case, not SIGSEGV.
-		if expectSignal(t, err, syscall.SIGSEGV, syscall.SIGQUIT) {
-			return
-		}
-	}
-
-	t.Errorf("program succeeded unexpectedly %d times", tries)
-}
-
-func TestSignalForwardingGo(t *testing.T) {
-	// This test fails on darwin-amd64 because of the special
-	// handling of user-generated SIGSEGV signals in fixsigcode in
-	// runtime/signal_darwin_amd64.go.
-	if runtime.GOOS == "darwin" && runtime.GOARCH == "amd64" {
-		t.Skip("not supported on darwin-amd64")
-	}
-
-	checkSignalForwardingTest(t)
-	buildSignalForwardingTest(t)
-	err := runSignalForwardingTest(t, "4")
-
-	// Occasionally the signal will be delivered to a C thread,
-	// and the program will crash with SIGSEGV.
-	expectSignal(t, err, syscall.SIGQUIT, syscall.SIGSEGV)
-}
-
-// checkSignalForwardingTest calls t.Skip if the SignalForwarding test
-// doesn't work on this platform.
-func checkSignalForwardingTest(t *testing.T) {
-	switch GOOS {
-	case "darwin", "ios":
-		switch GOARCH {
-		case "arm64":
-			t.Skipf("skipping on %s/%s; see https://golang.org/issue/13701", GOOS, GOARCH)
-		}
-	case "windows":
-		t.Skip("skipping signal test on Windows")
-	}
-}
-
-// buildSignalForwardingTest builds the executable used by the various
-// signal forwarding tests.
-func buildSignalForwardingTest(t *testing.T) {
-	if !testWork {
-		t.Cleanup(func() {
-			os.Remove("libgo2.a")
-			os.Remove("libgo2.h")
-			os.Remove("testp" + exeSuffix)
-			os.RemoveAll(filepath.Join(GOPATH, "pkg"))
-		})
-	}
-
-	t.Log("go build -buildmode=c-archive -o libgo2.a ./libgo2")
-	cmd := exec.Command("go", "build", "-buildmode=c-archive", "-o", "libgo2.a", "./libgo2")
-	out, err := cmd.CombinedOutput()
-	if len(out) > 0 {
-		t.Logf("%s", out)
-	}
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	checkLineComments(t, "libgo2.h")
-	checkArchive(t, "libgo2.a")
-
-	ccArgs := append(cc, "-o", "testp"+exeSuffix, "main5.c", "libgo2.a")
-	if runtime.Compiler == "gccgo" {
-		ccArgs = append(ccArgs, "-lgo")
-	}
-	t.Log(ccArgs)
-	out, err = exec.Command(ccArgs[0], ccArgs[1:]...).CombinedOutput()
-	if len(out) > 0 {
-		t.Logf("%s", out)
-	}
-	if err != nil {
-		t.Fatal(err)
-	}
-}
-
-func runSignalForwardingTest(t *testing.T, arg string) error {
-	t.Logf("%v %s", bin, arg)
-	cmd := exec.Command(bin[0], append(bin[1:], arg)...)
-
-	var out strings.Builder
-	cmd.Stdout = &out
-
-	stderr, err := cmd.StderrPipe()
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer stderr.Close()
-
-	r := bufio.NewReader(stderr)
-
-	err = cmd.Start()
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	// Wait for trigger to ensure that process is started.
-	ok, err := r.ReadString('\n')
-
-	// Verify trigger.
-	if err != nil || ok != "OK\n" {
-		t.Fatal("Did not receive OK signal")
-	}
-
-	var wg sync.WaitGroup
-	wg.Add(1)
-	var errsb strings.Builder
-	go func() {
-		defer wg.Done()
-		io.Copy(&errsb, r)
-	}()
-
-	// Give the program a chance to enter the function.
-	// If the program doesn't get there the test will still
-	// pass, although it doesn't quite test what we intended.
-	// This is fine as long as the program normally makes it.
-	time.Sleep(time.Millisecond)
-
-	cmd.Process.Signal(syscall.SIGSEGV)
-
-	err = cmd.Wait()
-
-	s := out.String()
-	if len(s) > 0 {
-		t.Log(s)
-	}
-	wg.Wait()
-	s = errsb.String()
-	if len(s) > 0 {
-		t.Log(s)
-	}
-
-	return err
-}
-
-// expectSignal checks that err, the exit status of a test program,
-// shows a failure due to a specific signal or two. Returns whether we
-// found an expected signal.
-func expectSignal(t *testing.T, err error, sig1, sig2 syscall.Signal) bool {
-	t.Helper()
-	if err == nil {
-		t.Error("test program succeeded unexpectedly")
-	} else if ee, ok := err.(*exec.ExitError); !ok {
-		t.Errorf("error (%v) has type %T; expected exec.ExitError", err, err)
-	} else if ws, ok := ee.Sys().(syscall.WaitStatus); !ok {
-		t.Errorf("error.Sys (%v) has type %T; expected syscall.WaitStatus", ee.Sys(), ee.Sys())
-	} else if !ws.Signaled() || (ws.Signal() != sig1 && ws.Signal() != sig2) {
-		if sig2 == 0 {
-			t.Errorf("got %q; expected signal %q", ee, sig1)
-		} else {
-			t.Errorf("got %q; expected signal %q or %q", ee, sig1, sig2)
-		}
-	} else {
-		return true
-	}
-	return false
-}
-
-func TestOsSignal(t *testing.T) {
-	switch GOOS {
-	case "windows":
-		t.Skip("skipping signal test on Windows")
-	}
-
-	if !testWork {
-		defer func() {
-			os.Remove("libgo3.a")
-			os.Remove("libgo3.h")
-			os.Remove("testp" + exeSuffix)
-			os.RemoveAll(filepath.Join(GOPATH, "pkg"))
-		}()
-	}
-
-	cmd := exec.Command("go", "build", "-buildmode=c-archive", "-o", "libgo3.a", "./libgo3")
-	if out, err := cmd.CombinedOutput(); err != nil {
-		t.Logf("%s", out)
-		t.Fatal(err)
-	}
-	checkLineComments(t, "libgo3.h")
-	checkArchive(t, "libgo3.a")
-
-	ccArgs := append(cc, "-o", "testp"+exeSuffix, "main3.c", "libgo3.a")
-	if runtime.Compiler == "gccgo" {
-		ccArgs = append(ccArgs, "-lgo")
-	}
-	if out, err := exec.Command(ccArgs[0], ccArgs[1:]...).CombinedOutput(); err != nil {
-		t.Logf("%s", out)
-		t.Fatal(err)
-	}
-
-	if out, err := exec.Command(bin[0], bin[1:]...).CombinedOutput(); err != nil {
-		t.Logf("%s", out)
-		t.Fatal(err)
-	}
-}
-
-func TestSigaltstack(t *testing.T) {
-	switch GOOS {
-	case "windows":
-		t.Skip("skipping signal test on Windows")
-	}
-
-	if !testWork {
-		defer func() {
-			os.Remove("libgo4.a")
-			os.Remove("libgo4.h")
-			os.Remove("testp" + exeSuffix)
-			os.RemoveAll(filepath.Join(GOPATH, "pkg"))
-		}()
-	}
-
-	cmd := exec.Command("go", "build", "-buildmode=c-archive", "-o", "libgo4.a", "./libgo4")
-	if out, err := cmd.CombinedOutput(); err != nil {
-		t.Logf("%s", out)
-		t.Fatal(err)
-	}
-	checkLineComments(t, "libgo4.h")
-	checkArchive(t, "libgo4.a")
-
-	ccArgs := append(cc, "-o", "testp"+exeSuffix, "main4.c", "libgo4.a")
-	if runtime.Compiler == "gccgo" {
-		ccArgs = append(ccArgs, "-lgo")
-	}
-	if out, err := exec.Command(ccArgs[0], ccArgs[1:]...).CombinedOutput(); err != nil {
-		t.Logf("%s", out)
-		t.Fatal(err)
-	}
-
-	if out, err := exec.Command(bin[0], bin[1:]...).CombinedOutput(); err != nil {
-		t.Logf("%s", out)
-		t.Fatal(err)
-	}
-}
-
-const testar = `#!/usr/bin/env bash
-while [[ $1 == -* ]] >/dev/null; do
-  shift
-done
-echo "testar" > $1
-echo "testar" > PWD/testar.ran
-`
-
-func TestExtar(t *testing.T) {
-	switch GOOS {
-	case "windows":
-		t.Skip("skipping signal test on Windows")
-	}
-	if runtime.Compiler == "gccgo" {
-		t.Skip("skipping -extar test when using gccgo")
-	}
-	if runtime.GOOS == "ios" {
-		t.Skip("shell scripts are not executable on iOS hosts")
-	}
-
-	if !testWork {
-		defer func() {
-			os.Remove("libgo4.a")
-			os.Remove("libgo4.h")
-			os.Remove("testar")
-			os.Remove("testar.ran")
-			os.RemoveAll(filepath.Join(GOPATH, "pkg"))
-		}()
-	}
-
-	os.Remove("testar")
-	dir, err := os.Getwd()
-	if err != nil {
-		t.Fatal(err)
-	}
-	s := strings.Replace(testar, "PWD", dir, 1)
-	if err := os.WriteFile("testar", []byte(s), 0777); err != nil {
-		t.Fatal(err)
-	}
-
-	cmd := exec.Command("go", "build", "-buildmode=c-archive", "-ldflags=-extar="+filepath.Join(dir, "testar"), "-o", "libgo4.a", "./libgo4")
-	if out, err := cmd.CombinedOutput(); err != nil {
-		t.Logf("%s", out)
-		t.Fatal(err)
-	}
-	checkLineComments(t, "libgo4.h")
-
-	if _, err := os.Stat("testar.ran"); err != nil {
-		if os.IsNotExist(err) {
-			t.Error("testar does not exist after go build")
-		} else {
-			t.Errorf("error checking testar: %v", err)
-		}
-	}
-}
-
-func TestPIE(t *testing.T) {
-	switch GOOS {
-	case "windows", "darwin", "ios", "plan9":
-		t.Skipf("skipping PIE test on %s", GOOS)
-	}
-
-	libgoa := "libgo.a"
-	if runtime.Compiler == "gccgo" {
-		libgoa = "liblibgo.a"
-	}
-
-	if !testWork {
-		defer func() {
-			os.Remove("testp" + exeSuffix)
-			os.Remove(libgoa)
-			os.RemoveAll(filepath.Join(GOPATH, "pkg"))
-		}()
-	}
-
-	// Generate the p.h header file.
-	//
-	// 'go install -i -buildmode=c-archive ./libgo' would do that too, but that
-	// would also attempt to install transitive standard-library dependencies to
-	// GOROOT, and we cannot assume that GOROOT is writable. (A non-root user may
-	// be running this test in a GOROOT owned by root.)
-	genHeader(t, "p.h", "./p")
-
-	cmd := exec.Command("go", "build", "-buildmode=c-archive", "./libgo")
-	if out, err := cmd.CombinedOutput(); err != nil {
-		t.Logf("%s", out)
-		t.Fatal(err)
-	}
-
-	ccArgs := append(cc, "-fPIE", "-pie", "-o", "testp"+exeSuffix, "main.c", "main_unix.c", libgoa)
-	if runtime.Compiler == "gccgo" {
-		ccArgs = append(ccArgs, "-lgo")
-	}
-	if out, err := exec.Command(ccArgs[0], ccArgs[1:]...).CombinedOutput(); err != nil {
-		t.Logf("%s", out)
-		t.Fatal(err)
-	}
-
-	binArgs := append(bin, "arg1", "arg2")
-	cmd = exec.Command(binArgs[0], binArgs[1:]...)
-	if runtime.Compiler == "gccgo" {
-		cmd.Env = append(os.Environ(), "GCCGO=1")
-	}
-	if out, err := cmd.CombinedOutput(); err != nil {
-		t.Logf("%s", out)
-		t.Fatal(err)
-	}
-
-	if GOOS != "aix" {
-		f, err := elf.Open("testp" + exeSuffix)
-		if err != nil {
-			t.Fatal("elf.Open failed: ", err)
-		}
-		defer f.Close()
-		if hasDynTag(t, f, elf.DT_TEXTREL) {
-			t.Errorf("%s has DT_TEXTREL flag", "testp"+exeSuffix)
-		}
-	}
-}
-
-func hasDynTag(t *testing.T, f *elf.File, tag elf.DynTag) bool {
-	ds := f.SectionByType(elf.SHT_DYNAMIC)
-	if ds == nil {
-		t.Error("no SHT_DYNAMIC section")
-		return false
-	}
-	d, err := ds.Data()
-	if err != nil {
-		t.Errorf("can't read SHT_DYNAMIC contents: %v", err)
-		return false
-	}
-	for len(d) > 0 {
-		var t elf.DynTag
-		switch f.Class {
-		case elf.ELFCLASS32:
-			t = elf.DynTag(f.ByteOrder.Uint32(d[:4]))
-			d = d[8:]
-		case elf.ELFCLASS64:
-			t = elf.DynTag(f.ByteOrder.Uint64(d[:8]))
-			d = d[16:]
-		}
-		if t == tag {
-			return true
-		}
-	}
-	return false
-}
-
-func TestSIGPROF(t *testing.T) {
-	switch GOOS {
-	case "windows", "plan9":
-		t.Skipf("skipping SIGPROF test on %s", GOOS)
-	case "darwin", "ios":
-		t.Skipf("skipping SIGPROF test on %s; see https://golang.org/issue/19320", GOOS)
-	}
-
-	t.Parallel()
-
-	if !testWork {
-		defer func() {
-			os.Remove("testp6" + exeSuffix)
-			os.Remove("libgo6.a")
-			os.Remove("libgo6.h")
-		}()
-	}
-
-	cmd := exec.Command("go", "build", "-buildmode=c-archive", "-o", "libgo6.a", "./libgo6")
-	out, err := cmd.CombinedOutput()
-	t.Logf("%v\n%s", cmd.Args, out)
-	if err != nil {
-		t.Fatal(err)
-	}
-	checkLineComments(t, "libgo6.h")
-	checkArchive(t, "libgo6.a")
-
-	ccArgs := append(cc, "-o", "testp6"+exeSuffix, "main6.c", "libgo6.a")
-	if runtime.Compiler == "gccgo" {
-		ccArgs = append(ccArgs, "-lgo")
-	}
-	out, err = exec.Command(ccArgs[0], ccArgs[1:]...).CombinedOutput()
-	t.Logf("%v\n%s", ccArgs, out)
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	argv := cmdToRun("./testp6")
-	cmd = exec.Command(argv[0], argv[1:]...)
-	out, err = cmd.CombinedOutput()
-	t.Logf("%v\n%s", argv, out)
-	if err != nil {
-		t.Fatal(err)
-	}
-}
-
-// TestCompileWithoutShared tests that if we compile code without the
-// -shared option, we can put it into an archive. When we use the go
-// tool with -buildmode=c-archive, it passes -shared to the compiler,
-// so we override that. The go tool doesn't work this way, but Bazel
-// will likely do it in the future. And it ought to work. This test
-// was added because at one time it did not work on PPC Linux.
-func TestCompileWithoutShared(t *testing.T) {
-	// For simplicity, reuse the signal forwarding test.
-	checkSignalForwardingTest(t)
-
-	if !testWork {
-		defer func() {
-			os.Remove("libgo2.a")
-			os.Remove("libgo2.h")
-		}()
-	}
-
-	cmd := exec.Command("go", "build", "-buildmode=c-archive", "-gcflags=-shared=false", "-o", "libgo2.a", "./libgo2")
-	out, err := cmd.CombinedOutput()
-	t.Logf("%v\n%s", cmd.Args, out)
-	if err != nil {
-		t.Fatal(err)
-	}
-	checkLineComments(t, "libgo2.h")
-	checkArchive(t, "libgo2.a")
-
-	exe := "./testnoshared" + exeSuffix
-
-	// In some cases, -no-pie is needed here, but not accepted everywhere. First try
-	// if -no-pie is accepted. See #22126.
-	ccArgs := append(cc, "-o", exe, "-no-pie", "main5.c", "libgo2.a")
-	if runtime.Compiler == "gccgo" {
-		ccArgs = append(ccArgs, "-lgo")
-	}
-	out, err = exec.Command(ccArgs[0], ccArgs[1:]...).CombinedOutput()
-	t.Logf("%v\n%s", ccArgs, out)
-
-	// If -no-pie unrecognized, try -nopie if this is possibly clang
-	if err != nil && bytes.Contains(out, []byte("unknown")) && !strings.Contains(cc[0], "gcc") {
-		ccArgs = append(cc, "-o", exe, "-nopie", "main5.c", "libgo2.a")
-		out, err = exec.Command(ccArgs[0], ccArgs[1:]...).CombinedOutput()
-		t.Logf("%v\n%s", ccArgs, out)
-	}
-
-	// Don't use either -no-pie or -nopie
-	if err != nil && bytes.Contains(out, []byte("unrecognized")) {
-		ccArgs = append(cc, "-o", exe, "main5.c", "libgo2.a")
-		out, err = exec.Command(ccArgs[0], ccArgs[1:]...).CombinedOutput()
-		t.Logf("%v\n%s", ccArgs, out)
-	}
-	if err != nil {
-		t.Fatal(err)
-	}
-	if !testWork {
-		defer os.Remove(exe)
-	}
-
-	binArgs := append(cmdToRun(exe), "1")
-	out, err = exec.Command(binArgs[0], binArgs[1:]...).CombinedOutput()
-	t.Logf("%v\n%s", binArgs, out)
-	expectSignal(t, err, syscall.SIGSEGV, 0)
-
-	// SIGPIPE is never forwarded on darwin. See golang.org/issue/33384.
-	if runtime.GOOS != "darwin" && runtime.GOOS != "ios" {
-		binArgs := append(cmdToRun(exe), "3")
-		out, err = exec.Command(binArgs[0], binArgs[1:]...).CombinedOutput()
-		t.Logf("%v\n%s", binArgs, out)
-		expectSignal(t, err, syscall.SIGPIPE, 0)
-	}
-}
-
-// Test that installing a second time recreates the header file.
-func TestCachedInstall(t *testing.T) {
-	if !testWork {
-		defer os.RemoveAll(filepath.Join(GOPATH, "pkg"))
-	}
-
-	h := filepath.Join(libgodir, "libgo.h")
-
-	buildcmd := []string{"go", "install", "-buildmode=c-archive", "./libgo"}
-
-	cmd := exec.Command(buildcmd[0], buildcmd[1:]...)
-	cmd.Env = append(cmd.Environ(), "GO111MODULE=off") // 'go install' only works in GOPATH mode
-	t.Log(buildcmd)
-	if out, err := cmd.CombinedOutput(); err != nil {
-		t.Logf("%s", out)
-		t.Fatal(err)
-	}
-
-	if _, err := os.Stat(h); err != nil {
-		t.Errorf("libgo.h not installed: %v", err)
-	}
-
-	if err := os.Remove(h); err != nil {
-		t.Fatal(err)
-	}
-
-	cmd = exec.Command(buildcmd[0], buildcmd[1:]...)
-	cmd.Env = append(cmd.Environ(), "GO111MODULE=off")
-	t.Log(buildcmd)
-	if out, err := cmd.CombinedOutput(); err != nil {
-		t.Logf("%s", out)
-		t.Fatal(err)
-	}
-
-	if _, err := os.Stat(h); err != nil {
-		t.Errorf("libgo.h not installed in second run: %v", err)
-	}
-}
-
-// Issue 35294.
-func TestManyCalls(t *testing.T) {
-	t.Parallel()
-
-	if !testWork {
-		defer func() {
-			os.Remove("testp7" + exeSuffix)
-			os.Remove("libgo7.a")
-			os.Remove("libgo7.h")
-		}()
-	}
-
-	cmd := exec.Command("go", "build", "-buildmode=c-archive", "-o", "libgo7.a", "./libgo7")
-	out, err := cmd.CombinedOutput()
-	t.Logf("%v\n%s", cmd.Args, out)
-	if err != nil {
-		t.Fatal(err)
-	}
-	checkLineComments(t, "libgo7.h")
-	checkArchive(t, "libgo7.a")
-
-	ccArgs := append(cc, "-o", "testp7"+exeSuffix, "main7.c", "libgo7.a")
-	if runtime.Compiler == "gccgo" {
-		ccArgs = append(ccArgs, "-lgo")
-	}
-	out, err = exec.Command(ccArgs[0], ccArgs[1:]...).CombinedOutput()
-	t.Logf("%v\n%s", ccArgs, out)
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	argv := cmdToRun("./testp7")
-	cmd = exec.Command(argv[0], argv[1:]...)
-	sb := new(strings.Builder)
-	cmd.Stdout = sb
-	cmd.Stderr = sb
-	if err := cmd.Start(); err != nil {
-		t.Fatal(err)
-	}
-
-	timer := time.AfterFunc(time.Minute,
-		func() {
-			t.Error("test program timed out")
-			cmd.Process.Kill()
-		},
-	)
-	defer timer.Stop()
-
-	err = cmd.Wait()
-	t.Logf("%v\n%s", cmd.Args, sb)
-	if err != nil {
-		t.Error(err)
-	}
-}
-
-// Issue 49288.
-func TestPreemption(t *testing.T) {
-	if runtime.Compiler == "gccgo" {
-		t.Skip("skipping asynchronous preemption test with gccgo")
-	}
-
-	t.Parallel()
-
-	if !testWork {
-		defer func() {
-			os.Remove("testp8" + exeSuffix)
-			os.Remove("libgo8.a")
-			os.Remove("libgo8.h")
-		}()
-	}
-
-	cmd := exec.Command("go", "build", "-buildmode=c-archive", "-o", "libgo8.a", "./libgo8")
-	out, err := cmd.CombinedOutput()
-	t.Logf("%v\n%s", cmd.Args, out)
-	if err != nil {
-		t.Fatal(err)
-	}
-	checkLineComments(t, "libgo8.h")
-	checkArchive(t, "libgo8.a")
-
-	ccArgs := append(cc, "-o", "testp8"+exeSuffix, "main8.c", "libgo8.a")
-	out, err = exec.Command(ccArgs[0], ccArgs[1:]...).CombinedOutput()
-	t.Logf("%v\n%s", ccArgs, out)
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	argv := cmdToRun("./testp8")
-	cmd = exec.Command(argv[0], argv[1:]...)
-	sb := new(strings.Builder)
-	cmd.Stdout = sb
-	cmd.Stderr = sb
-	if err := cmd.Start(); err != nil {
-		t.Fatal(err)
-	}
-
-	timer := time.AfterFunc(time.Minute,
-		func() {
-			t.Error("test program timed out")
-			cmd.Process.Kill()
-		},
-	)
-	defer timer.Stop()
-
-	err = cmd.Wait()
-	t.Logf("%v\n%s", cmd.Args, sb)
-	if err != nil {
-		t.Error(err)
-	}
-}
diff --git a/misc/cgo/testcarchive/overlaydir_test.go b/misc/cgo/testcarchive/overlaydir_test.go
deleted file mode 100644
index 67974c5..0000000
--- a/misc/cgo/testcarchive/overlaydir_test.go
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright 2019 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package carchive_test
-
-import (
-	"io"
-	"os"
-	"path/filepath"
-	"strings"
-)
-
-// overlayDir makes a minimal-overhead copy of srcRoot in which new files may be added.
-//
-// TODO: Once we no longer need to support the misc module in GOPATH mode,
-// factor this function out into a package to reduce duplication.
-func overlayDir(dstRoot, srcRoot string) error {
-	dstRoot = filepath.Clean(dstRoot)
-	if err := os.MkdirAll(dstRoot, 0777); err != nil {
-		return err
-	}
-
-	srcRoot, err := filepath.Abs(srcRoot)
-	if err != nil {
-		return err
-	}
-
-	return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error {
-		if err != nil || srcPath == srcRoot {
-			return err
-		}
-
-		suffix := strings.TrimPrefix(srcPath, srcRoot)
-		for len(suffix) > 0 && suffix[0] == filepath.Separator {
-			suffix = suffix[1:]
-		}
-		dstPath := filepath.Join(dstRoot, suffix)
-
-		perm := info.Mode() & os.ModePerm
-		if info.Mode()&os.ModeSymlink != 0 {
-			info, err = os.Stat(srcPath)
-			if err != nil {
-				return err
-			}
-			perm = info.Mode() & os.ModePerm
-		}
-
-		// Always copy directories (don't symlink them).
-		// If we add a file in the overlay, we don't want to add it in the original.
-		if info.IsDir() {
-			return os.MkdirAll(dstPath, perm|0200)
-		}
-
-		// If the OS supports symlinks, use them instead of copying bytes.
-		if err := os.Symlink(srcPath, dstPath); err == nil {
-			return nil
-		}
-
-		// Otherwise, copy the bytes.
-		src, err := os.Open(srcPath)
-		if err != nil {
-			return err
-		}
-		defer src.Close()
-
-		dst, err := os.OpenFile(dstPath, os.O_WRONLY|os.O_CREATE|os.O_EXCL, perm)
-		if err != nil {
-			return err
-		}
-
-		_, err = io.Copy(dst, src)
-		if closeErr := dst.Close(); err == nil {
-			err = closeErr
-		}
-		return err
-	})
-}
diff --git a/misc/cgo/testcarchive/testdata/libgo2/libgo2.go b/misc/cgo/testcarchive/testdata/libgo2/libgo2.go
deleted file mode 100644
index 35c89ae..0000000
--- a/misc/cgo/testcarchive/testdata/libgo2/libgo2.go
+++ /dev/null
@@ -1,86 +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
-
-/*
-#include <signal.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <stdio.h>
-
-// Raise SIGPIPE.
-static void CRaiseSIGPIPE() {
-	int fds[2];
-
-	if (pipe(fds) == -1) {
-		perror("pipe");
-		exit(EXIT_FAILURE);
-	}
-	// Close the reader end
-	close(fds[0]);
-	// Write to the writer end to provoke a SIGPIPE
-	if (write(fds[1], "some data", 9) != -1) {
-		fprintf(stderr, "write to a closed pipe succeeded\n");
-		exit(EXIT_FAILURE);
-	}
-	close(fds[1]);
-}
-*/
-import "C"
-
-import (
-	"fmt"
-	"os"
-	"runtime"
-)
-
-// RunGoroutines starts some goroutines that don't do anything.
-// The idea is to get some threads going, so that a signal will be delivered
-// to a thread started by Go.
-//export RunGoroutines
-func RunGoroutines() {
-	for i := 0; i < 4; i++ {
-		go func() {
-			runtime.LockOSThread()
-			select {}
-		}()
-	}
-}
-
-// Block blocks the current thread while running Go code.
-//export Block
-func Block() {
-	select {}
-}
-
-var P *byte
-
-// TestSEGV makes sure that an invalid address turns into a run-time Go panic.
-//export TestSEGV
-func TestSEGV() {
-	defer func() {
-		if recover() == nil {
-			fmt.Fprintln(os.Stderr, "no panic from segv")
-			os.Exit(1)
-		}
-	}()
-	*P = 0
-	fmt.Fprintln(os.Stderr, "continued after segv")
-	os.Exit(1)
-}
-
-// Noop ensures that the Go runtime is initialized.
-//export Noop
-func Noop() {
-}
-
-// Raise SIGPIPE.
-//export GoRaiseSIGPIPE
-func GoRaiseSIGPIPE() {
-	C.CRaiseSIGPIPE()
-}
-
-func main() {
-}
diff --git a/misc/cgo/testcarchive/testdata/libgo3/libgo3.go b/misc/cgo/testcarchive/testdata/libgo3/libgo3.go
deleted file mode 100644
index 3725f7a..0000000
--- a/misc/cgo/testcarchive/testdata/libgo3/libgo3.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.
-
-package main
-
-import "C"
-
-import (
-	"os"
-	"os/signal"
-	"syscall"
-	"time"
-)
-
-// The channel used to read SIGIO signals.
-var sigioChan chan os.Signal
-
-// CatchSIGIO starts catching SIGIO signals.
-//export CatchSIGIO
-func CatchSIGIO() {
-	sigioChan = make(chan os.Signal, 1)
-	signal.Notify(sigioChan, syscall.SIGIO)
-}
-
-// ResetSIGIO stops catching SIGIO signals.
-//export ResetSIGIO
-func ResetSIGIO() {
-	signal.Reset(syscall.SIGIO)
-}
-
-// SawSIGIO reports whether we saw a SIGIO.
-//export SawSIGIO
-func SawSIGIO() C.int {
-	select {
-	case <-sigioChan:
-		return 1
-	case <-time.After(5 * time.Second):
-		return 0
-	}
-}
-
-// ProvokeSIGPIPE provokes a kernel-initiated SIGPIPE.
-//export ProvokeSIGPIPE
-func ProvokeSIGPIPE() {
-	r, w, err := os.Pipe()
-	if err != nil {
-		panic(err)
-	}
-	r.Close()
-	defer w.Close()
-	w.Write([]byte("some data"))
-}
-
-func main() {
-}
diff --git a/misc/cgo/testcarchive/testdata/libgo4/libgo4.go b/misc/cgo/testcarchive/testdata/libgo4/libgo4.go
deleted file mode 100644
index 8cc1895..0000000
--- a/misc/cgo/testcarchive/testdata/libgo4/libgo4.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.
-
-package main
-
-/*
-#include <signal.h>
-#include <pthread.h>
-
-// Raise SIGIO.
-static void CRaiseSIGIO(pthread_t* p) {
-	pthread_kill(*p, SIGIO);
-}
-*/
-import "C"
-
-import (
-	"os"
-	"os/signal"
-	"sync/atomic"
-	"syscall"
-)
-
-var sigioCount int32
-
-// Catch SIGIO.
-//export GoCatchSIGIO
-func GoCatchSIGIO() {
-	c := make(chan os.Signal, 1)
-	signal.Notify(c, syscall.SIGIO)
-	go func() {
-		for range c {
-			atomic.AddInt32(&sigioCount, 1)
-		}
-	}()
-}
-
-// Raise SIGIO.
-//export GoRaiseSIGIO
-func GoRaiseSIGIO(p *C.pthread_t) {
-	C.CRaiseSIGIO(p)
-}
-
-// Return the number of SIGIO signals seen.
-//export SIGIOCount
-func SIGIOCount() C.int {
-	return C.int(atomic.LoadInt32(&sigioCount))
-}
-
-func main() {
-}
diff --git a/misc/cgo/testcarchive/testdata/main2.c b/misc/cgo/testcarchive/testdata/main2.c
deleted file mode 100644
index da35673..0000000
--- a/misc/cgo/testcarchive/testdata/main2.c
+++ /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.
-
-// Test installing a signal handler before the Go code starts.
-// This is a lot like misc/cgo/testcshared/main4.c.
-
-#include <setjmp.h>
-#include <signal.h>
-#include <stdarg.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <stdint.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-#include <unistd.h>
-#include <sched.h>
-#include <time.h>
-#include <errno.h>
-
-#include "libgo2.h"
-
-static void die(const char* msg) {
-	perror(msg);
-	exit(EXIT_FAILURE);
-}
-
-static volatile sig_atomic_t sigioSeen;
-static volatile sig_atomic_t sigpipeSeen;
-
-// Use up some stack space.
-static void recur(int i, char *p) {
-	char a[1024];
-
-	*p = '\0';
-	if (i > 0) {
-		recur(i - 1, a);
-	}
-}
-
-static void pipeHandler(int signo, siginfo_t* info, void* ctxt) {
-	sigpipeSeen = 1;
-}
-
-// Signal handler that uses up more stack space than a goroutine will have.
-static void ioHandler(int signo, siginfo_t* info, void* ctxt) {
-	char a[1024];
-
-	recur(4, a);
-	sigioSeen = 1;
-}
-
-static jmp_buf jmp;
-static char* nullPointer;
-
-// An arbitrary function which requires proper stack alignment; see
-// http://golang.org/issue/17641.
-static void callWithVarargs(void* dummy, ...) {
-	va_list args;
-	va_start(args, dummy);
-	va_end(args);
-}
-
-// Signal handler for SIGSEGV on a C thread.
-static void segvHandler(int signo, siginfo_t* info, void* ctxt) {
-	sigset_t mask;
-	int i;
-
-	// Call an arbitrary function that requires the stack to be properly aligned.
-	callWithVarargs("dummy arg", 3.1415);
-
-	if (sigemptyset(&mask) < 0) {
-		die("sigemptyset");
-	}
-	if (sigaddset(&mask, SIGSEGV) < 0) {
-		die("sigaddset");
-	}
-	i = sigprocmask(SIG_UNBLOCK, &mask, NULL);
-	if (i != 0) {
-		fprintf(stderr, "sigprocmask: %s\n", strerror(i));
-		exit(EXIT_FAILURE);
-	}
-
-	// Don't try this at home.
-	longjmp(jmp, signo);
-
-	// We should never get here.
-	abort();
-}
-
-// Set up the signal handlers in a high priority constructor,
-// so that they are installed before the Go code starts.
-
-static void init(void) __attribute__ ((constructor (200)));
-
-static void init() {
-	struct sigaction sa;
-
-	memset(&sa, 0, sizeof sa);
-	sa.sa_sigaction = ioHandler;
-	if (sigemptyset(&sa.sa_mask) < 0) {
-		die("sigemptyset");
-	}
-	sa.sa_flags = SA_SIGINFO;
-	if (sigaction(SIGIO, &sa, NULL) < 0) {
-		die("sigaction");
-	}
-
-	sa.sa_sigaction = segvHandler;
-	if (sigaction(SIGSEGV, &sa, NULL) < 0 || sigaction(SIGBUS, &sa, NULL) < 0) {
-		die("sigaction");
-	}
-
-	sa.sa_sigaction = pipeHandler;
-	if (sigaction(SIGPIPE, &sa, NULL) < 0) {
-		die("sigaction");
-	}
-}
-
-int main(int argc, char** argv) {
-	int verbose;
-	sigset_t mask;
-	int i;
-	struct timespec ts;
-	int darwin;
-
-	darwin = atoi(argv[1]);
-
-	verbose = argc > 2;
-
-	setvbuf(stdout, NULL, _IONBF, 0);
-
-	// Call setsid so that we can use kill(0, SIGIO) below.
-	// Don't check the return value so that this works both from
-	// a job control shell and from a shell script.
-	setsid();
-
-	if (verbose) {
-		printf("calling RunGoroutines\n");
-	}
-
-	RunGoroutines();
-
-	// Block SIGIO in this thread to make it more likely that it
-	// will be delivered to a goroutine.
-
-	if (verbose) {
-		printf("calling pthread_sigmask\n");
-	}
-
-	if (sigemptyset(&mask) < 0) {
-		die("sigemptyset");
-	}
-	if (sigaddset(&mask, SIGIO) < 0) {
-		die("sigaddset");
-	}
-	i = pthread_sigmask(SIG_BLOCK, &mask, NULL);
-	if (i != 0) {
-		fprintf(stderr, "pthread_sigmask: %s\n", strerror(i));
-		exit(EXIT_FAILURE);
-	}
-
-	if (verbose) {
-		printf("calling kill\n");
-	}
-
-	if (kill(0, SIGIO) < 0) {
-		die("kill");
-	}
-
-	if (verbose) {
-		printf("waiting for sigioSeen\n");
-	}
-
-	// Wait until the signal has been delivered.
-	i = 0;
-	while (!sigioSeen) {
-		ts.tv_sec = 0;
-		ts.tv_nsec = 1000000;
-		nanosleep(&ts, NULL);
-		i++;
-		if (i > 5000) {
-			fprintf(stderr, "looping too long waiting for SIGIO\n");
-			exit(EXIT_FAILURE);
-		}
-	}
-
-	if (verbose) {
-		printf("provoking SIGPIPE\n");
-	}
-
-	// SIGPIPE is never forwarded on Darwin, see golang.org/issue/33384.
-	if (!darwin) {
-		GoRaiseSIGPIPE();
-
-		if (verbose) {
-			printf("waiting for sigpipeSeen\n");
-		}
-
-		// Wait until the signal has been delivered.
-		i = 0;
-		while (!sigpipeSeen) {
-			ts.tv_sec = 0;
-			ts.tv_nsec = 1000000;
-			nanosleep(&ts, NULL);
-			i++;
-			if (i > 5000) {
-				fprintf(stderr, "looping too long waiting for SIGPIPE\n");
-				exit(EXIT_FAILURE);
-			}
-		}
-	}
-
-	if (verbose) {
-		printf("calling setjmp\n");
-	}
-
-	// Test that a SIGSEGV on this thread is delivered to us.
-	if (setjmp(jmp) == 0) {
-		if (verbose) {
-			printf("triggering SIGSEGV\n");
-		}
-
-		*nullPointer = '\0';
-
-		fprintf(stderr, "continued after address error\n");
-		exit(EXIT_FAILURE);
-	}
-
-	if (verbose) {
-		printf("calling TestSEGV\n");
-	}
-
-	TestSEGV();
-
-	printf("PASS\n");
-	return 0;
-}
diff --git a/misc/cgo/testcarchive/testdata/main3.c b/misc/cgo/testcarchive/testdata/main3.c
deleted file mode 100644
index 4d11d9c..0000000
--- a/misc/cgo/testcarchive/testdata/main3.c
+++ /dev/null
@@ -1,210 +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 os/signal.Notify and os/signal.Reset.
-// This is a lot like misc/cgo/testcshared/main5.c.
-
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-#include <sched.h>
-#include <unistd.h>
-#include <pthread.h>
-
-#include "libgo3.h"
-
-static void die(const char* msg) {
-	perror(msg);
-	exit(EXIT_FAILURE);
-}
-
-static volatile sig_atomic_t sigioSeen;
-
-static void ioHandler(int signo, siginfo_t* info, void* ctxt) {
-	sigioSeen = 1;
-}
-
-// Set up the SIGPIPE signal handler in a high priority constructor, so
-// that it is installed before the Go code starts.
-
-static void pipeHandler(int signo, siginfo_t* info, void* ctxt) {
-	const char *s = "unexpected SIGPIPE\n";
-	write(2, s, strlen(s));
-	exit(EXIT_FAILURE);
-}
-
-static void init(void) __attribute__ ((constructor (200)));
-
-static void init() {
-    struct sigaction sa;
-
-	memset(&sa, 0, sizeof sa);
-	sa.sa_sigaction = pipeHandler;
-	if (sigemptyset(&sa.sa_mask) < 0) {
-		die("sigemptyset");
-	}
-	sa.sa_flags = SA_SIGINFO;
-	if (sigaction(SIGPIPE, &sa, NULL) < 0) {
-		die("sigaction");
-	}
-}
-
-static void *provokeSIGPIPE(void *arg) {
-	ProvokeSIGPIPE();
-	return NULL;
-}
-
-int main(int argc, char** argv) {
-	int verbose;
-	struct sigaction sa;
-	int i;
-	struct timespec ts;
-	int res;
-	pthread_t tid;
-
-	verbose = argc > 2;
-	setvbuf(stdout, NULL, _IONBF, 0);
-
-	if (verbose) {
-		printf("raising SIGPIPE\n");
-	}
-
-	// Test that the Go runtime handles SIGPIPE, even if we installed
-	// a non-default SIGPIPE handler before the runtime initializes.
-	ProvokeSIGPIPE();
-
-	// Test that SIGPIPE on a non-main thread is also handled by Go.
-	res = pthread_create(&tid, NULL, provokeSIGPIPE, NULL);
-	if (res != 0) {
-		fprintf(stderr, "pthread_create: %s\n", strerror(res));
-		exit(EXIT_FAILURE);
-	}
-
-	res = pthread_join(tid, NULL);
-	if (res != 0) {
-		fprintf(stderr, "pthread_join: %s\n", strerror(res));
-		exit(EXIT_FAILURE);
-	}
-
-	if (verbose) {
-		printf("calling sigaction\n");
-	}
-
-	memset(&sa, 0, sizeof sa);
-	sa.sa_sigaction = ioHandler;
-	if (sigemptyset(&sa.sa_mask) < 0) {
-		die("sigemptyset");
-	}
-	sa.sa_flags = SA_SIGINFO;
-	if (sigaction(SIGIO, &sa, NULL) < 0) {
-		die("sigaction");
-	}
-
-	// At this point there should not be a Go signal handler
-	// installed for SIGIO.
-
-	if (verbose) {
-		printf("raising SIGIO\n");
-	}
-
-	if (raise(SIGIO) < 0) {
-		die("raise");
-	}
-
-	if (verbose) {
-		printf("waiting for sigioSeen\n");
-	}
-
-	// Wait until the signal has been delivered.
-	i = 0;
-	while (!sigioSeen) {
-		ts.tv_sec = 0;
-		ts.tv_nsec = 1000000;
-		nanosleep(&ts, NULL);
-		i++;
-		if (i > 5000) {
-			fprintf(stderr, "looping too long waiting for signal\n");
-			exit(EXIT_FAILURE);
-		}
-	}
-
-	sigioSeen = 0;
-
-	// Tell the Go code to catch SIGIO.
-
-	if (verbose) {
-		printf("calling CatchSIGIO\n");
-	}
-
-	CatchSIGIO();
-
-	if (verbose) {
-		printf("raising SIGIO\n");
-	}
-
-	if (raise(SIGIO) < 0) {
-		die("raise");
-	}
-
-	if (verbose) {
-		printf("calling SawSIGIO\n");
-	}
-
-	if (!SawSIGIO()) {
-		fprintf(stderr, "Go handler did not see SIGIO\n");
-		exit(EXIT_FAILURE);
-	}
-
-	if (sigioSeen != 0) {
-		fprintf(stderr, "C handler saw SIGIO when only Go handler should have\n");
-		exit(EXIT_FAILURE);
-	}
-
-	// Tell the Go code to stop catching SIGIO.
-
-	if (verbose) {
-		printf("calling ResetSIGIO\n");
-	}
-
-	ResetSIGIO();
-
-	if (verbose) {
-		printf("raising SIGIO\n");
-	}
-
-	if (raise(SIGIO) < 0) {
-		die("raise");
-	}
-
-	if (verbose) {
-		printf("calling SawSIGIO\n");
-	}
-
-	if (SawSIGIO()) {
-		fprintf(stderr, "Go handler saw SIGIO after Reset\n");
-		exit(EXIT_FAILURE);
-	}
-
-	if (verbose) {
-		printf("waiting for sigioSeen\n");
-	}
-
-	// Wait until the signal has been delivered.
-	i = 0;
-	while (!sigioSeen) {
-		ts.tv_sec = 0;
-		ts.tv_nsec = 1000000;
-		nanosleep(&ts, NULL);
-		i++;
-		if (i > 5000) {
-			fprintf(stderr, "looping too long waiting for signal\n");
-			exit(EXIT_FAILURE);
-		}
-	}
-
-	printf("PASS\n");
-	return 0;
-}
diff --git a/misc/cgo/testcshared/cshared_test.go b/misc/cgo/testcshared/cshared_test.go
deleted file mode 100644
index 2b57249..0000000
--- a/misc/cgo/testcshared/cshared_test.go
+++ /dev/null
@@ -1,914 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cshared_test
-
-import (
-	"bufio"
-	"bytes"
-	"debug/elf"
-	"debug/pe"
-	"encoding/binary"
-	"flag"
-	"fmt"
-	"log"
-	"os"
-	"os/exec"
-	"path/filepath"
-	"runtime"
-	"strings"
-	"sync"
-	"testing"
-	"unicode"
-)
-
-// C compiler with args (from $(go env CC) $(go env GOGCCFLAGS)).
-var cc []string
-
-// ".exe" on Windows.
-var exeSuffix string
-
-var GOOS, GOARCH, GOROOT string
-var installdir, androiddir string
-var libgoname string
-
-func TestMain(m *testing.M) {
-	os.Exit(testMain(m))
-}
-
-func testMain(m *testing.M) int {
-	log.SetFlags(log.Lshortfile)
-	flag.Parse()
-	if testing.Short() && os.Getenv("GO_BUILDER_NAME") == "" {
-		fmt.Printf("SKIP - short mode and $GO_BUILDER_NAME not set\n")
-		os.Exit(0)
-	}
-	if runtime.GOOS == "linux" {
-		if _, err := os.Stat("/etc/alpine-release"); err == nil {
-			fmt.Printf("SKIP - skipping failing test on alpine - go.dev/issue/19938\n")
-			os.Exit(0)
-		}
-	}
-
-	GOOS = goEnv("GOOS")
-	GOARCH = goEnv("GOARCH")
-	GOROOT = goEnv("GOROOT")
-
-	if _, err := os.Stat(GOROOT); os.IsNotExist(err) {
-		log.Fatalf("Unable able to find GOROOT at '%s'", GOROOT)
-	}
-
-	androiddir = fmt.Sprintf("/data/local/tmp/testcshared-%d", os.Getpid())
-	if runtime.GOOS != GOOS && GOOS == "android" {
-		args := append(adbCmd(), "exec-out", "mkdir", "-p", androiddir)
-		cmd := exec.Command(args[0], args[1:]...)
-		out, err := cmd.CombinedOutput()
-		if err != nil {
-			log.Fatalf("setupAndroid failed: %v\n%s\n", err, out)
-		}
-		defer cleanupAndroid()
-	}
-
-	cc = []string{goEnv("CC")}
-
-	out := goEnv("GOGCCFLAGS")
-	quote := '\000'
-	start := 0
-	lastSpace := true
-	backslash := false
-	s := string(out)
-	for i, c := range s {
-		if quote == '\000' && unicode.IsSpace(c) {
-			if !lastSpace {
-				cc = append(cc, s[start:i])
-				lastSpace = true
-			}
-		} else {
-			if lastSpace {
-				start = i
-				lastSpace = false
-			}
-			if quote == '\000' && !backslash && (c == '"' || c == '\'') {
-				quote = c
-				backslash = false
-			} else if !backslash && quote == c {
-				quote = '\000'
-			} else if (quote == '\000' || quote == '"') && !backslash && c == '\\' {
-				backslash = true
-			} else {
-				backslash = false
-			}
-		}
-	}
-	if !lastSpace {
-		cc = append(cc, s[start:])
-	}
-
-	switch GOOS {
-	case "darwin", "ios":
-		// For Darwin/ARM.
-		// TODO(crawshaw): can we do better?
-		cc = append(cc, []string{"-framework", "CoreFoundation", "-framework", "Foundation"}...)
-	case "android":
-		cc = append(cc, "-pie")
-	}
-	libgodir := GOOS + "_" + GOARCH
-	switch GOOS {
-	case "darwin", "ios":
-		if GOARCH == "arm64" {
-			libgodir += "_shared"
-		}
-	case "dragonfly", "freebsd", "linux", "netbsd", "openbsd", "solaris", "illumos":
-		libgodir += "_shared"
-	}
-	cc = append(cc, "-I", filepath.Join("pkg", libgodir))
-
-	// Force reallocation (and avoid aliasing bugs) for parallel tests that append to cc.
-	cc = cc[:len(cc):len(cc)]
-
-	if GOOS == "windows" {
-		exeSuffix = ".exe"
-	}
-
-	// Copy testdata into GOPATH/src/testcshared, along with a go.mod file
-	// declaring the same path.
-
-	GOPATH, err := os.MkdirTemp("", "cshared_test")
-	if err != nil {
-		log.Panic(err)
-	}
-	defer os.RemoveAll(GOPATH)
-	os.Setenv("GOPATH", GOPATH)
-
-	modRoot := filepath.Join(GOPATH, "src", "testcshared")
-	if err := overlayDir(modRoot, "testdata"); err != nil {
-		log.Panic(err)
-	}
-	if err := os.Chdir(modRoot); err != nil {
-		log.Panic(err)
-	}
-	os.Setenv("PWD", modRoot)
-	if err := os.WriteFile("go.mod", []byte("module testcshared\n"), 0666); err != nil {
-		log.Panic(err)
-	}
-
-	defer func() {
-		if installdir != "" {
-			err := os.RemoveAll(installdir)
-			if err != nil {
-				log.Panic(err)
-			}
-		}
-	}()
-
-	return m.Run()
-}
-
-func goEnv(key string) string {
-	out, err := exec.Command("go", "env", key).Output()
-	if err != nil {
-		log.Printf("go env %s failed:\n%s", key, err)
-		log.Panicf("%s", err.(*exec.ExitError).Stderr)
-	}
-	return strings.TrimSpace(string(out))
-}
-
-func cmdToRun(name string) string {
-	return "./" + name + exeSuffix
-}
-
-func adbCmd() []string {
-	cmd := []string{"adb"}
-	if flags := os.Getenv("GOANDROID_ADB_FLAGS"); flags != "" {
-		cmd = append(cmd, strings.Split(flags, " ")...)
-	}
-	return cmd
-}
-
-func adbPush(t *testing.T, filename string) {
-	if runtime.GOOS == GOOS || GOOS != "android" {
-		return
-	}
-	args := append(adbCmd(), "push", filename, fmt.Sprintf("%s/%s", androiddir, filename))
-	cmd := exec.Command(args[0], args[1:]...)
-	if out, err := cmd.CombinedOutput(); err != nil {
-		t.Fatalf("adb command failed: %v\n%s\n", err, out)
-	}
-}
-
-func adbRun(t *testing.T, env []string, adbargs ...string) string {
-	if GOOS != "android" {
-		t.Fatalf("trying to run adb command when operating system is not android.")
-	}
-	args := append(adbCmd(), "exec-out")
-	// Propagate LD_LIBRARY_PATH to the adb shell invocation.
-	for _, e := range env {
-		if strings.Contains(e, "LD_LIBRARY_PATH=") {
-			adbargs = append([]string{e}, adbargs...)
-			break
-		}
-	}
-	shellcmd := fmt.Sprintf("cd %s; %s", androiddir, strings.Join(adbargs, " "))
-	args = append(args, shellcmd)
-	cmd := exec.Command(args[0], args[1:]...)
-	out, err := cmd.CombinedOutput()
-	if err != nil {
-		t.Fatalf("adb command failed: %v\n%s\n", err, out)
-	}
-	return strings.Replace(string(out), "\r", "", -1)
-}
-
-func run(t *testing.T, extraEnv []string, args ...string) string {
-	t.Helper()
-	cmd := exec.Command(args[0], args[1:]...)
-	if len(extraEnv) > 0 {
-		cmd.Env = append(os.Environ(), extraEnv...)
-	}
-
-	if GOOS != "windows" {
-		// TestUnexportedSymbols relies on file descriptor 30
-		// being closed when the program starts, so enforce
-		// that in all cases. (The first three descriptors are
-		// stdin/stdout/stderr, so we just need to make sure
-		// that cmd.ExtraFiles[27] exists and is nil.)
-		cmd.ExtraFiles = make([]*os.File, 28)
-	}
-
-	out, err := cmd.CombinedOutput()
-	if err != nil {
-		t.Fatalf("command failed: %v\n%v\n%s\n", args, err, out)
-	} else {
-		t.Logf("run: %v", args)
-	}
-	return string(out)
-}
-
-func runExe(t *testing.T, extraEnv []string, args ...string) string {
-	t.Helper()
-	if runtime.GOOS != GOOS && GOOS == "android" {
-		return adbRun(t, append(os.Environ(), extraEnv...), args...)
-	}
-	return run(t, extraEnv, args...)
-}
-
-func runCC(t *testing.T, args ...string) string {
-	t.Helper()
-	// This function is run in parallel, so append to a copy of cc
-	// rather than cc itself.
-	return run(t, nil, append(append([]string(nil), cc...), args...)...)
-}
-
-func createHeaders() error {
-	// The 'cgo' command generates a number of additional artifacts,
-	// but we're only interested in the header.
-	// Shunt the rest of the outputs to a temporary directory.
-	objDir, err := os.MkdirTemp("", "testcshared_obj")
-	if err != nil {
-		return err
-	}
-	defer os.RemoveAll(objDir)
-
-	// Generate a C header file for p, which is a non-main dependency
-	// of main package libgo.
-	//
-	// TODO(golang.org/issue/35715): This should be simpler.
-	args := []string{"go", "tool", "cgo",
-		"-objdir", objDir,
-		"-exportheader", "p.h",
-		filepath.Join(".", "p", "p.go")}
-	cmd := exec.Command(args[0], args[1:]...)
-	out, err := cmd.CombinedOutput()
-	if err != nil {
-		return fmt.Errorf("command failed: %v\n%v\n%s\n", args, err, out)
-	}
-
-	// Generate a C header file for libgo itself.
-	installdir, err = os.MkdirTemp("", "testcshared")
-	if err != nil {
-		return err
-	}
-	libgoname = "libgo.a"
-
-	args = []string{"go", "build", "-buildmode=c-shared", "-o", filepath.Join(installdir, libgoname), "./libgo"}
-	cmd = exec.Command(args[0], args[1:]...)
-	out, err = cmd.CombinedOutput()
-	if err != nil {
-		return fmt.Errorf("command failed: %v\n%v\n%s\n", args, err, out)
-	}
-
-	args = []string{"go", "build", "-buildmode=c-shared",
-		"-installsuffix", "testcshared",
-		"-o", libgoname,
-		filepath.Join(".", "libgo", "libgo.go")}
-	if GOOS == "windows" && strings.HasSuffix(args[6], ".a") {
-		args[6] = strings.TrimSuffix(args[6], ".a") + ".dll"
-	}
-	cmd = exec.Command(args[0], args[1:]...)
-	out, err = cmd.CombinedOutput()
-	if err != nil {
-		return fmt.Errorf("command failed: %v\n%v\n%s\n", args, err, out)
-	}
-	if GOOS == "windows" {
-		// We can't simply pass -Wl,--out-implib, because this relies on having imports from multiple packages,
-		// which results in the linkers output implib getting overwritten at each step. So instead build the
-		// import library the traditional way, using a def file.
-		err = os.WriteFile("libgo.def",
-			[]byte("LIBRARY libgo.dll\nEXPORTS\n\tDidInitRun\n\tDidMainRun\n\tDivu\n\tFromPkg\n\t_cgo_dummy_export\n"),
-			0644)
-		if err != nil {
-			return fmt.Errorf("unable to write def file: %v", err)
-		}
-		out, err = exec.Command(cc[0], append(cc[1:], "-print-prog-name=dlltool")...).CombinedOutput()
-		if err != nil {
-			return fmt.Errorf("unable to find dlltool path: %v\n%s\n", err, out)
-		}
-		dlltoolpath := strings.TrimSpace(string(out))
-		if filepath.Ext(dlltoolpath) == "" {
-			// Some compilers report slash-separated paths without extensions
-			// instead of ordinary Windows paths.
-			// Try to find the canonical name for the path.
-			if lp, err := exec.LookPath(dlltoolpath); err == nil {
-				dlltoolpath = lp
-			}
-		}
-
-		args := []string{dlltoolpath, "-D", args[6], "-l", libgoname, "-d", "libgo.def"}
-
-		if filepath.Ext(dlltoolpath) == "" {
-			// This is an unfortunate workaround for
-			// https://github.com/mstorsjo/llvm-mingw/issues/205 in which
-			// we basically reimplement the contents of the dlltool.sh
-			// wrapper: https://git.io/JZFlU.
-			// TODO(thanm): remove this workaround once we can upgrade
-			// the compilers on the windows-arm64 builder.
-			dlltoolContents, err := os.ReadFile(args[0])
-			if err != nil {
-				return fmt.Errorf("unable to read dlltool: %v\n", err)
-			}
-			if bytes.HasPrefix(dlltoolContents, []byte("#!/bin/sh")) && bytes.Contains(dlltoolContents, []byte("llvm-dlltool")) {
-				base, name := filepath.Split(args[0])
-				args[0] = filepath.Join(base, "llvm-dlltool")
-				var machine string
-				switch prefix, _, _ := strings.Cut(name, "-"); prefix {
-				case "i686":
-					machine = "i386"
-				case "x86_64":
-					machine = "i386:x86-64"
-				case "armv7":
-					machine = "arm"
-				case "aarch64":
-					machine = "arm64"
-				}
-				if len(machine) > 0 {
-					args = append(args, "-m", machine)
-				}
-			}
-		}
-
-		out, err = exec.Command(args[0], args[1:]...).CombinedOutput()
-		if err != nil {
-			return fmt.Errorf("unable to run dlltool to create import library: %v\n%s\n", err, out)
-		}
-	}
-
-	if runtime.GOOS != GOOS && GOOS == "android" {
-		args = append(adbCmd(), "push", libgoname, fmt.Sprintf("%s/%s", androiddir, libgoname))
-		cmd = exec.Command(args[0], args[1:]...)
-		out, err = cmd.CombinedOutput()
-		if err != nil {
-			return fmt.Errorf("adb command failed: %v\n%s\n", err, out)
-		}
-	}
-
-	return nil
-}
-
-var (
-	headersOnce sync.Once
-	headersErr  error
-)
-
-func createHeadersOnce(t *testing.T) {
-	headersOnce.Do(func() {
-		headersErr = createHeaders()
-	})
-	if headersErr != nil {
-		t.Helper()
-		t.Fatal(headersErr)
-	}
-}
-
-func cleanupAndroid() {
-	if GOOS != "android" {
-		return
-	}
-	args := append(adbCmd(), "exec-out", "rm", "-rf", androiddir)
-	cmd := exec.Command(args[0], args[1:]...)
-	out, err := cmd.CombinedOutput()
-	if err != nil {
-		log.Panicf("cleanupAndroid failed: %v\n%s\n", err, out)
-	}
-}
-
-// test0: exported symbols in shared lib are accessible.
-func TestExportedSymbols(t *testing.T) {
-	t.Parallel()
-
-	cmd := "testp0"
-	bin := cmdToRun(cmd)
-
-	createHeadersOnce(t)
-
-	runCC(t, "-I", installdir, "-o", cmd, "main0.c", libgoname)
-	adbPush(t, cmd)
-
-	defer os.Remove(bin)
-
-	out := runExe(t, []string{"LD_LIBRARY_PATH=."}, bin)
-	if strings.TrimSpace(out) != "PASS" {
-		t.Error(out)
-	}
-}
-
-func checkNumberOfExportedFunctionsWindows(t *testing.T, exportAllSymbols bool) {
-	const prog = `
-package main
-
-import "C"
-
-//export GoFunc
-func GoFunc() {
-	println(42)
-}
-
-//export GoFunc2
-func GoFunc2() {
-	println(24)
-}
-
-func main() {
-}
-`
-
-	tmpdir := t.TempDir()
-
-	srcfile := filepath.Join(tmpdir, "test.go")
-	objfile := filepath.Join(tmpdir, "test.dll")
-	if err := os.WriteFile(srcfile, []byte(prog), 0666); err != nil {
-		t.Fatal(err)
-	}
-	argv := []string{"build", "-buildmode=c-shared"}
-	if exportAllSymbols {
-		argv = append(argv, "-ldflags", "-extldflags=-Wl,--export-all-symbols")
-	}
-	argv = append(argv, "-o", objfile, srcfile)
-	out, err := exec.Command("go", argv...).CombinedOutput()
-	if err != nil {
-		t.Fatalf("build failure: %s\n%s\n", err, string(out))
-	}
-
-	f, err := pe.Open(objfile)
-	if err != nil {
-		t.Fatalf("pe.Open failed: %v", err)
-	}
-	defer f.Close()
-	section := f.Section(".edata")
-	if section == nil {
-		t.Skip(".edata section is not present")
-	}
-
-	// TODO: deduplicate this struct from cmd/link/internal/ld/pe.go
-	type IMAGE_EXPORT_DIRECTORY struct {
-		_                 [2]uint32
-		_                 [2]uint16
-		_                 [2]uint32
-		NumberOfFunctions uint32
-		NumberOfNames     uint32
-		_                 [3]uint32
-	}
-	var e IMAGE_EXPORT_DIRECTORY
-	if err := binary.Read(section.Open(), binary.LittleEndian, &e); err != nil {
-		t.Fatalf("binary.Read failed: %v", err)
-	}
-
-	// Only the two exported functions and _cgo_dummy_export should be exported
-	expectedNumber := uint32(3)
-
-	if exportAllSymbols {
-		if e.NumberOfFunctions <= expectedNumber {
-			t.Fatalf("missing exported functions: %v", e.NumberOfFunctions)
-		}
-		if e.NumberOfNames <= expectedNumber {
-			t.Fatalf("missing exported names: %v", e.NumberOfNames)
-		}
-	} else {
-		if e.NumberOfFunctions != expectedNumber {
-			t.Fatalf("got %d exported functions; want %d", e.NumberOfFunctions, expectedNumber)
-		}
-		if e.NumberOfNames != expectedNumber {
-			t.Fatalf("got %d exported names; want %d", e.NumberOfNames, expectedNumber)
-		}
-	}
-}
-
-func TestNumberOfExportedFunctions(t *testing.T) {
-	if GOOS != "windows" {
-		t.Skip("skipping windows only test")
-	}
-	t.Parallel()
-
-	t.Run("OnlyExported", func(t *testing.T) {
-		checkNumberOfExportedFunctionsWindows(t, false)
-	})
-	t.Run("All", func(t *testing.T) {
-		checkNumberOfExportedFunctionsWindows(t, true)
-	})
-}
-
-// test1: shared library can be dynamically loaded and exported symbols are accessible.
-func TestExportedSymbolsWithDynamicLoad(t *testing.T) {
-	t.Parallel()
-
-	if GOOS == "windows" {
-		t.Logf("Skipping on %s", GOOS)
-		return
-	}
-
-	cmd := "testp1"
-	bin := cmdToRun(cmd)
-
-	createHeadersOnce(t)
-
-	if GOOS != "freebsd" {
-		runCC(t, "-o", cmd, "main1.c", "-ldl")
-	} else {
-		runCC(t, "-o", cmd, "main1.c")
-	}
-	adbPush(t, cmd)
-
-	defer os.Remove(bin)
-
-	out := runExe(t, nil, bin, "./"+libgoname)
-	if strings.TrimSpace(out) != "PASS" {
-		t.Error(out)
-	}
-}
-
-// test2: tests libgo2 which does not export any functions.
-func TestUnexportedSymbols(t *testing.T) {
-	t.Parallel()
-
-	if GOOS == "windows" {
-		t.Logf("Skipping on %s", GOOS)
-		return
-	}
-
-	cmd := "testp2"
-	bin := cmdToRun(cmd)
-	libname := "libgo2.a"
-
-	run(t,
-		nil,
-		"go", "build",
-		"-buildmode=c-shared",
-		"-installsuffix", "testcshared",
-		"-o", libname, "./libgo2",
-	)
-	adbPush(t, libname)
-
-	linkFlags := "-Wl,--no-as-needed"
-	if GOOS == "darwin" || GOOS == "ios" {
-		linkFlags = ""
-	}
-
-	runCC(t, "-o", cmd, "main2.c", linkFlags, libname)
-	adbPush(t, cmd)
-
-	defer os.Remove(libname)
-	defer os.Remove(bin)
-
-	out := runExe(t, []string{"LD_LIBRARY_PATH=."}, bin)
-
-	if strings.TrimSpace(out) != "PASS" {
-		t.Error(out)
-	}
-}
-
-// test3: tests main.main is exported on android.
-func TestMainExportedOnAndroid(t *testing.T) {
-	t.Parallel()
-
-	switch GOOS {
-	case "android":
-		break
-	default:
-		t.Logf("Skipping on %s", GOOS)
-		return
-	}
-
-	cmd := "testp3"
-	bin := cmdToRun(cmd)
-
-	createHeadersOnce(t)
-
-	runCC(t, "-o", cmd, "main3.c", "-ldl")
-	adbPush(t, cmd)
-
-	defer os.Remove(bin)
-
-	out := runExe(t, nil, bin, "./"+libgoname)
-	if strings.TrimSpace(out) != "PASS" {
-		t.Error(out)
-	}
-}
-
-func testSignalHandlers(t *testing.T, pkgname, cfile, cmd string) {
-	libname := pkgname + ".a"
-	run(t,
-		nil,
-		"go", "build",
-		"-buildmode=c-shared",
-		"-installsuffix", "testcshared",
-		"-o", libname, pkgname,
-	)
-	adbPush(t, libname)
-	if GOOS != "freebsd" {
-		runCC(t, "-pthread", "-o", cmd, cfile, "-ldl")
-	} else {
-		runCC(t, "-pthread", "-o", cmd, cfile)
-	}
-	adbPush(t, cmd)
-
-	bin := cmdToRun(cmd)
-
-	defer os.Remove(libname)
-	defer os.Remove(bin)
-	defer os.Remove(pkgname + ".h")
-
-	out := runExe(t, nil, bin, "./"+libname)
-	if strings.TrimSpace(out) != "PASS" {
-		t.Error(run(t, nil, bin, libname, "verbose"))
-	}
-}
-
-// test4: test signal handlers
-func TestSignalHandlers(t *testing.T) {
-	t.Parallel()
-	if GOOS == "windows" {
-		t.Logf("Skipping on %s", GOOS)
-		return
-	}
-	testSignalHandlers(t, "./libgo4", "main4.c", "testp4")
-}
-
-// test5: test signal handlers with os/signal.Notify
-func TestSignalHandlersWithNotify(t *testing.T) {
-	t.Parallel()
-	if GOOS == "windows" {
-		t.Logf("Skipping on %s", GOOS)
-		return
-	}
-	testSignalHandlers(t, "./libgo5", "main5.c", "testp5")
-}
-
-func TestPIE(t *testing.T) {
-	t.Parallel()
-
-	switch GOOS {
-	case "linux", "android":
-		break
-	default:
-		t.Logf("Skipping on %s", GOOS)
-		return
-	}
-
-	createHeadersOnce(t)
-
-	f, err := elf.Open(libgoname)
-	if err != nil {
-		t.Fatalf("elf.Open failed: %v", err)
-	}
-	defer f.Close()
-
-	ds := f.SectionByType(elf.SHT_DYNAMIC)
-	if ds == nil {
-		t.Fatalf("no SHT_DYNAMIC section")
-	}
-	d, err := ds.Data()
-	if err != nil {
-		t.Fatalf("can't read SHT_DYNAMIC contents: %v", err)
-	}
-	for len(d) > 0 {
-		var tag elf.DynTag
-		switch f.Class {
-		case elf.ELFCLASS32:
-			tag = elf.DynTag(f.ByteOrder.Uint32(d[:4]))
-			d = d[8:]
-		case elf.ELFCLASS64:
-			tag = elf.DynTag(f.ByteOrder.Uint64(d[:8]))
-			d = d[16:]
-		}
-		if tag == elf.DT_TEXTREL {
-			t.Fatalf("%s has DT_TEXTREL flag", libgoname)
-		}
-	}
-}
-
-// Test that installing a second time recreates the header file.
-func TestCachedInstall(t *testing.T) {
-	tmpdir, err := os.MkdirTemp("", "cshared")
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer os.RemoveAll(tmpdir)
-
-	copyFile(t, filepath.Join(tmpdir, "src", "testcshared", "go.mod"), "go.mod")
-	copyFile(t, filepath.Join(tmpdir, "src", "testcshared", "libgo", "libgo.go"), filepath.Join("libgo", "libgo.go"))
-	copyFile(t, filepath.Join(tmpdir, "src", "testcshared", "p", "p.go"), filepath.Join("p", "p.go"))
-
-	buildcmd := []string{"go", "install", "-x", "-buildmode=c-shared", "-installsuffix", "testcshared", "./libgo"}
-
-	cmd := exec.Command(buildcmd[0], buildcmd[1:]...)
-	cmd.Dir = filepath.Join(tmpdir, "src", "testcshared")
-	env := append(cmd.Environ(),
-		"GOPATH="+tmpdir,
-		"GOBIN="+filepath.Join(tmpdir, "bin"),
-		"GO111MODULE=off", // 'go install' only works in GOPATH mode
-	)
-	cmd.Env = env
-	t.Log(buildcmd)
-	out, err := cmd.CombinedOutput()
-	t.Logf("%s", out)
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	var libgoh, ph string
-
-	walker := func(path string, info os.FileInfo, err error) error {
-		if err != nil {
-			t.Fatal(err)
-		}
-		var ps *string
-		switch filepath.Base(path) {
-		case "libgo.h":
-			ps = &libgoh
-		case "p.h":
-			ps = &ph
-		}
-		if ps != nil {
-			if *ps != "" {
-				t.Fatalf("%s found again", *ps)
-			}
-			*ps = path
-		}
-		return nil
-	}
-
-	if err := filepath.Walk(tmpdir, walker); err != nil {
-		t.Fatal(err)
-	}
-
-	if libgoh == "" {
-		t.Fatal("libgo.h not installed")
-	}
-
-	if err := os.Remove(libgoh); err != nil {
-		t.Fatal(err)
-	}
-
-	cmd = exec.Command(buildcmd[0], buildcmd[1:]...)
-	cmd.Dir = filepath.Join(tmpdir, "src", "testcshared")
-	cmd.Env = env
-	t.Log(buildcmd)
-	out, err = cmd.CombinedOutput()
-	t.Logf("%s", out)
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	if _, err := os.Stat(libgoh); err != nil {
-		t.Errorf("libgo.h not installed in second run: %v", err)
-	}
-}
-
-// copyFile copies src to dst.
-func copyFile(t *testing.T, dst, src string) {
-	t.Helper()
-	data, err := os.ReadFile(src)
-	if err != nil {
-		t.Fatal(err)
-	}
-	if err := os.MkdirAll(filepath.Dir(dst), 0777); err != nil {
-		t.Fatal(err)
-	}
-	if err := os.WriteFile(dst, data, 0666); err != nil {
-		t.Fatal(err)
-	}
-}
-
-func TestGo2C2Go(t *testing.T) {
-	switch GOOS {
-	case "darwin", "ios", "windows":
-		// Non-ELF shared libraries don't support the multiple
-		// copies of the runtime package implied by this test.
-		t.Skipf("linking c-shared into Go programs not supported on %s; issue 29061, 49457", GOOS)
-	case "android":
-		t.Skip("test fails on android; issue 29087")
-	}
-
-	t.Parallel()
-
-	tmpdir, err := os.MkdirTemp("", "cshared-TestGo2C2Go")
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer os.RemoveAll(tmpdir)
-
-	lib := filepath.Join(tmpdir, "libtestgo2c2go.a")
-	var env []string
-	if GOOS == "windows" && strings.HasSuffix(lib, ".a") {
-		env = append(env, "CGO_LDFLAGS=-Wl,--out-implib,"+lib, "CGO_LDFLAGS_ALLOW=.*")
-		lib = strings.TrimSuffix(lib, ".a") + ".dll"
-	}
-	run(t, env, "go", "build", "-buildmode=c-shared", "-o", lib, "./go2c2go/go")
-
-	cgoCflags := os.Getenv("CGO_CFLAGS")
-	if cgoCflags != "" {
-		cgoCflags += " "
-	}
-	cgoCflags += "-I" + tmpdir
-
-	cgoLdflags := os.Getenv("CGO_LDFLAGS")
-	if cgoLdflags != "" {
-		cgoLdflags += " "
-	}
-	cgoLdflags += "-L" + tmpdir + " -ltestgo2c2go"
-
-	goenv := []string{"CGO_CFLAGS=" + cgoCflags, "CGO_LDFLAGS=" + cgoLdflags}
-
-	ldLibPath := os.Getenv("LD_LIBRARY_PATH")
-	if ldLibPath != "" {
-		ldLibPath += ":"
-	}
-	ldLibPath += tmpdir
-
-	runenv := []string{"LD_LIBRARY_PATH=" + ldLibPath}
-
-	bin := filepath.Join(tmpdir, "m1") + exeSuffix
-	run(t, goenv, "go", "build", "-o", bin, "./go2c2go/m1")
-	runExe(t, runenv, bin)
-
-	bin = filepath.Join(tmpdir, "m2") + exeSuffix
-	run(t, goenv, "go", "build", "-o", bin, "./go2c2go/m2")
-	runExe(t, runenv, bin)
-}
-
-func TestIssue36233(t *testing.T) {
-	t.Parallel()
-
-	// Test that the export header uses GoComplex64 and GoComplex128
-	// for complex types.
-
-	tmpdir, err := os.MkdirTemp("", "cshared-TestIssue36233")
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer os.RemoveAll(tmpdir)
-
-	const exportHeader = "issue36233.h"
-
-	run(t, nil, "go", "tool", "cgo", "-exportheader", exportHeader, "-objdir", tmpdir, "./issue36233/issue36233.go")
-	data, err := os.ReadFile(exportHeader)
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	funcs := []struct{ name, signature string }{
-		{"exportComplex64", "GoComplex64 exportComplex64(GoComplex64 v)"},
-		{"exportComplex128", "GoComplex128 exportComplex128(GoComplex128 v)"},
-		{"exportComplexfloat", "GoComplex64 exportComplexfloat(GoComplex64 v)"},
-		{"exportComplexdouble", "GoComplex128 exportComplexdouble(GoComplex128 v)"},
-	}
-
-	scanner := bufio.NewScanner(bytes.NewReader(data))
-	var found int
-	for scanner.Scan() {
-		b := scanner.Bytes()
-		for _, fn := range funcs {
-			if bytes.Contains(b, []byte(fn.name)) {
-				found++
-				if !bytes.Contains(b, []byte(fn.signature)) {
-					t.Errorf("function signature mismatch; got %q, want %q", b, fn.signature)
-				}
-			}
-		}
-	}
-	if err = scanner.Err(); err != nil {
-		t.Errorf("scanner encountered error: %v", err)
-	}
-	if found != len(funcs) {
-		t.Error("missing functions")
-	}
-}
diff --git a/misc/cgo/testcshared/overlaydir_test.go b/misc/cgo/testcshared/overlaydir_test.go
deleted file mode 100644
index 85d6b44..0000000
--- a/misc/cgo/testcshared/overlaydir_test.go
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright 2019 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cshared_test
-
-import (
-	"io"
-	"os"
-	"path/filepath"
-	"strings"
-)
-
-// overlayDir makes a minimal-overhead copy of srcRoot in which new files may be added.
-//
-// TODO: Once we no longer need to support the misc module in GOPATH mode,
-// factor this function out into a package to reduce duplication.
-func overlayDir(dstRoot, srcRoot string) error {
-	dstRoot = filepath.Clean(dstRoot)
-	if err := os.MkdirAll(dstRoot, 0777); err != nil {
-		return err
-	}
-
-	srcRoot, err := filepath.Abs(srcRoot)
-	if err != nil {
-		return err
-	}
-
-	return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error {
-		if err != nil || srcPath == srcRoot {
-			return err
-		}
-
-		suffix := strings.TrimPrefix(srcPath, srcRoot)
-		for len(suffix) > 0 && suffix[0] == filepath.Separator {
-			suffix = suffix[1:]
-		}
-		dstPath := filepath.Join(dstRoot, suffix)
-
-		perm := info.Mode() & os.ModePerm
-		if info.Mode()&os.ModeSymlink != 0 {
-			info, err = os.Stat(srcPath)
-			if err != nil {
-				return err
-			}
-			perm = info.Mode() & os.ModePerm
-		}
-
-		// Always copy directories (don't symlink them).
-		// If we add a file in the overlay, we don't want to add it in the original.
-		if info.IsDir() {
-			return os.MkdirAll(dstPath, perm|0200)
-		}
-
-		// If the OS supports symlinks, use them instead of copying bytes.
-		if err := os.Symlink(srcPath, dstPath); err == nil {
-			return nil
-		}
-
-		// Otherwise, copy the bytes.
-		src, err := os.Open(srcPath)
-		if err != nil {
-			return err
-		}
-		defer src.Close()
-
-		dst, err := os.OpenFile(dstPath, os.O_WRONLY|os.O_CREATE|os.O_EXCL, perm)
-		if err != nil {
-			return err
-		}
-
-		_, err = io.Copy(dst, src)
-		if closeErr := dst.Close(); err == nil {
-			err = closeErr
-		}
-		return err
-	})
-}
diff --git a/misc/cgo/testcshared/testdata/issue36233/issue36233.go b/misc/cgo/testcshared/testdata/issue36233/issue36233.go
deleted file mode 100644
index d0d1e5d..0000000
--- a/misc/cgo/testcshared/testdata/issue36233/issue36233.go
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2022 The Go Authors. 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

-

-// #include <complex.h>

-import "C"

-

-//export exportComplex64

-func exportComplex64(v complex64) complex64 {

-	return v

-}

-

-//export exportComplex128

-func exportComplex128(v complex128) complex128 {

-	return v

-}

-

-//export exportComplexfloat

-func exportComplexfloat(v C.complexfloat) C.complexfloat {

-	return v

-}

-

-//export exportComplexdouble

-func exportComplexdouble(v C.complexdouble) C.complexdouble {

-	return v

-}

-

-func main() {}

diff --git a/misc/cgo/testcshared/testdata/libgo2/dup2.go b/misc/cgo/testcshared/testdata/libgo2/dup2.go
deleted file mode 100644
index d343aa5..0000000
--- a/misc/cgo/testcshared/testdata/libgo2/dup2.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 darwin dragonfly freebsd linux,!arm64,!riscv64 netbsd openbsd
-
-package main
-
-import "syscall"
-
-func dup2(oldfd, newfd int) error {
-	return syscall.Dup2(oldfd, newfd)
-}
diff --git a/misc/cgo/testcshared/testdata/libgo2/dup3.go b/misc/cgo/testcshared/testdata/libgo2/dup3.go
deleted file mode 100644
index 459f0dc..0000000
--- a/misc/cgo/testcshared/testdata/libgo2/dup3.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 linux,arm64 linux,riscv64
-
-package main
-
-import "syscall"
-
-func dup2(oldfd, newfd int) error {
-	return syscall.Dup3(oldfd, newfd, 0)
-}
diff --git a/misc/cgo/testcshared/testdata/libgo2/libgo2.go b/misc/cgo/testcshared/testdata/libgo2/libgo2.go
deleted file mode 100644
index e57c93b..0000000
--- a/misc/cgo/testcshared/testdata/libgo2/libgo2.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 netbsd openbsd solaris
-
-package main
-
-// Test a shared library created by -buildmode=c-shared that does not
-// export anything.
-
-import (
-	"fmt"
-	"os"
-	"syscall"
-)
-
-// To test this we want to communicate between the main program and
-// the shared library without using any exported symbols.  The init
-// function creates a pipe and Dups the read end to a known number
-// that the C code can also use.
-
-const (
-	fd = 30
-)
-
-func init() {
-	var p [2]int
-	if e := syscall.Pipe(p[0:]); e != nil {
-		fmt.Fprintf(os.Stderr, "pipe: %v\n", e)
-		os.Exit(2)
-	}
-
-	if e := dup2(p[0], fd); e != nil {
-		fmt.Fprintf(os.Stderr, "dup2: %v\n", e)
-		os.Exit(2)
-	}
-
-	const str = "PASS"
-	if n, e := syscall.Write(p[1], []byte(str)); e != nil || n != len(str) {
-		fmt.Fprintf(os.Stderr, "write: %d %v\n", n, e)
-		os.Exit(2)
-	}
-
-	if e := syscall.Close(p[1]); e != nil {
-		fmt.Fprintf(os.Stderr, "close: %v\n", e)
-		os.Exit(2)
-	}
-}
-
-func main() {
-}
diff --git a/misc/cgo/testcshared/testdata/libgo4/libgo4.go b/misc/cgo/testcshared/testdata/libgo4/libgo4.go
deleted file mode 100644
index ab40b75..0000000
--- a/misc/cgo/testcshared/testdata/libgo4/libgo4.go
+++ /dev/null
@@ -1,45 +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 "C"
-
-import (
-	"fmt"
-	"os"
-	"runtime"
-)
-
-// RunGoroutines starts some goroutines that don't do anything.
-// The idea is to get some threads going, so that a signal will be delivered
-// to a thread started by Go.
-//export RunGoroutines
-func RunGoroutines() {
-	for i := 0; i < 4; i++ {
-		go func() {
-			runtime.LockOSThread()
-			select {}
-		}()
-	}
-}
-
-var P *byte
-
-// TestSEGV makes sure that an invalid address turns into a run-time Go panic.
-//export TestSEGV
-func TestSEGV() {
-	defer func() {
-		if recover() == nil {
-			fmt.Fprintln(os.Stderr, "no panic from segv")
-			os.Exit(1)
-		}
-	}()
-	*P = 0
-	fmt.Fprintln(os.Stderr, "continued after segv")
-	os.Exit(1)
-}
-
-func main() {
-}
diff --git a/misc/cgo/testcshared/testdata/libgo5/libgo5.go b/misc/cgo/testcshared/testdata/libgo5/libgo5.go
deleted file mode 100644
index 94e5d21..0000000
--- a/misc/cgo/testcshared/testdata/libgo5/libgo5.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.
-
-package main
-
-import "C"
-
-import (
-	"os"
-	"os/signal"
-	"syscall"
-	"time"
-)
-
-// The channel used to read SIGIO signals.
-var sigioChan chan os.Signal
-
-// CatchSIGIO starts catching SIGIO signals.
-//export CatchSIGIO
-func CatchSIGIO() {
-	sigioChan = make(chan os.Signal, 1)
-	signal.Notify(sigioChan, syscall.SIGIO)
-}
-
-// ResetSIGIO stops catching SIGIO signals.
-//export ResetSIGIO
-func ResetSIGIO() {
-	signal.Reset(syscall.SIGIO)
-}
-
-// SawSIGIO returns whether we saw a SIGIO within a brief pause.
-//export SawSIGIO
-func SawSIGIO() C.int {
-	select {
-	case <-sigioChan:
-		return 1
-	case <-time.After(100 * time.Millisecond):
-		return 0
-	}
-}
-
-func main() {
-}
diff --git a/misc/cgo/testcshared/testdata/main4.c b/misc/cgo/testcshared/testdata/main4.c
deleted file mode 100644
index 355cdef..0000000
--- a/misc/cgo/testcshared/testdata/main4.c
+++ /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.
-
-// Test that a signal handler that uses up stack space does not crash
-// if the signal is delivered to a thread running a goroutine.
-// This is a lot like misc/cgo/testcarchive/main2.c.
-
-#include <setjmp.h>
-#include <signal.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-#include <unistd.h>
-#include <sched.h>
-#include <time.h>
-#include <dlfcn.h>
-
-static void die(const char* msg) {
-	perror(msg);
-	exit(EXIT_FAILURE);
-}
-
-static volatile sig_atomic_t sigioSeen;
-
-// Use up some stack space.
-static void recur(int i, char *p) {
-	char a[1024];
-
-	*p = '\0';
-	if (i > 0) {
-		recur(i - 1, a);
-	}
-}
-
-// Signal handler that uses up more stack space than a goroutine will have.
-static void ioHandler(int signo, siginfo_t* info, void* ctxt) {
-	char a[1024];
-
-	recur(4, a);
-	sigioSeen = 1;
-}
-
-static jmp_buf jmp;
-static char* nullPointer;
-
-// Signal handler for SIGSEGV on a C thread.
-static void segvHandler(int signo, siginfo_t* info, void* ctxt) {
-	sigset_t mask;
-	int i;
-
-	if (sigemptyset(&mask) < 0) {
-		die("sigemptyset");
-	}
-	if (sigaddset(&mask, SIGSEGV) < 0) {
-		die("sigaddset");
-	}
-	i = sigprocmask(SIG_UNBLOCK, &mask, NULL);
-	if (i != 0) {
-		fprintf(stderr, "sigprocmask: %s\n", strerror(i));
-		exit(EXIT_FAILURE);
-	}
-
-	// Don't try this at home.
-	longjmp(jmp, signo);
-
-	// We should never get here.
-	abort();
-}
-
-int main(int argc, char** argv) {
-	int verbose;
-	struct sigaction sa;
-	void* handle;
-	void (*fn)(void);
-	sigset_t mask;
-	int i;
-	struct timespec ts;
-
-	verbose = argc > 2;
-	setvbuf(stdout, NULL, _IONBF, 0);
-
-	// Call setsid so that we can use kill(0, SIGIO) below.
-	// Don't check the return value so that this works both from
-	// a job control shell and from a shell script.
-	setsid();
-
-	if (verbose) {
-		printf("calling sigaction\n");
-	}
-
-	memset(&sa, 0, sizeof sa);
-	sa.sa_sigaction = ioHandler;
-	if (sigemptyset(&sa.sa_mask) < 0) {
-		die("sigemptyset");
-	}
-	sa.sa_flags = SA_SIGINFO;
-	if (sigaction(SIGIO, &sa, NULL) < 0) {
-		die("sigaction");
-	}
-
-	sa.sa_sigaction = segvHandler;
-	if (sigaction(SIGSEGV, &sa, NULL) < 0 || sigaction(SIGBUS, &sa, NULL) < 0) {
-		die("sigaction");
-	}
-
-	if (verbose) {
-		printf("calling dlopen\n");
-	}
-
-	handle = dlopen(argv[1], RTLD_NOW | RTLD_GLOBAL);
-	if (handle == NULL) {
-		fprintf(stderr, "%s\n", dlerror());
-		exit(EXIT_FAILURE);
-	}
-
-	if (verbose) {
-		printf("calling dlsym\n");
-	}
-
-	// Start some goroutines.
-	fn = (void(*)(void))dlsym(handle, "RunGoroutines");
-	if (fn == NULL) {
-		fprintf(stderr, "%s\n", dlerror());
-		exit(EXIT_FAILURE);
-	}
-
-	if (verbose) {
-		printf("calling RunGoroutines\n");
-	}
-
-	fn();
-
-	// Block SIGIO in this thread to make it more likely that it
-	// will be delivered to a goroutine.
-
-	if (verbose) {
-		printf("calling pthread_sigmask\n");
-	}
-
-	if (sigemptyset(&mask) < 0) {
-		die("sigemptyset");
-	}
-	if (sigaddset(&mask, SIGIO) < 0) {
-		die("sigaddset");
-	}
-	i = pthread_sigmask(SIG_BLOCK, &mask, NULL);
-	if (i != 0) {
-		fprintf(stderr, "pthread_sigmask: %s\n", strerror(i));
-		exit(EXIT_FAILURE);
-	}
-
-	if (verbose) {
-		printf("calling kill\n");
-	}
-
-	if (kill(0, SIGIO) < 0) {
-		die("kill");
-	}
-
-	if (verbose) {
-		printf("waiting for sigioSeen\n");
-	}
-
-	// Wait until the signal has been delivered.
-	i = 0;
-	while (!sigioSeen) {
-		ts.tv_sec = 0;
-		ts.tv_nsec = 1000000;
-		nanosleep(&ts, NULL);
-		i++;
-		if (i > 5000) {
-			fprintf(stderr, "looping too long waiting for signal\n");
-			exit(EXIT_FAILURE);
-		}
-	}
-
-	if (verbose) {
-		printf("calling setjmp\n");
-	}
-
-	// Test that a SIGSEGV on this thread is delivered to us.
-	if (setjmp(jmp) == 0) {
-		if (verbose) {
-			printf("triggering SIGSEGV\n");
-		}
-
-		*nullPointer = '\0';
-
-		fprintf(stderr, "continued after address error\n");
-		exit(EXIT_FAILURE);
-	}
-
-	if (verbose) {
-		printf("calling dlsym\n");
-	}
-
-	// Make sure that a SIGSEGV in Go causes a run-time panic.
-	fn = (void (*)(void))dlsym(handle, "TestSEGV");
-	if (fn == NULL) {
-		fprintf(stderr, "%s\n", dlerror());
-		exit(EXIT_FAILURE);
-	}
-
-	if (verbose) {
-		printf("calling TestSEGV\n");
-	}
-
-	fn();
-
-	printf("PASS\n");
-	return 0;
-}
diff --git a/misc/cgo/testcshared/testdata/main5.c b/misc/cgo/testcshared/testdata/main5.c
deleted file mode 100644
index 1bc9910..0000000
--- a/misc/cgo/testcshared/testdata/main5.c
+++ /dev/null
@@ -1,199 +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 that a signal handler works in non-Go code when using
-// os/signal.Notify.
-// This is a lot like misc/cgo/testcarchive/main3.c.
-
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-#include <sched.h>
-#include <dlfcn.h>
-
-static void die(const char* msg) {
-	perror(msg);
-	exit(EXIT_FAILURE);
-}
-
-static volatile sig_atomic_t sigioSeen;
-
-static void ioHandler(int signo, siginfo_t* info, void* ctxt) {
-	sigioSeen = 1;
-}
-
-int main(int argc, char** argv) {
-	int verbose;
-	struct sigaction sa;
-	void* handle;
-	void (*fn1)(void);
-	int (*sawSIGIO)(void);
-	int i;
-	struct timespec ts;
-
-	verbose = argc > 2;
-	setvbuf(stdout, NULL, _IONBF, 0);
-
-	if (verbose) {
-		printf("calling sigaction\n");
-	}
-
-	memset(&sa, 0, sizeof sa);
-	sa.sa_sigaction = ioHandler;
-	if (sigemptyset(&sa.sa_mask) < 0) {
-		die("sigemptyset");
-	}
-	sa.sa_flags = SA_SIGINFO;
-	if (sigaction(SIGIO, &sa, NULL) < 0) {
-		die("sigaction");
-	}
-
-	if (verbose) {
-		printf("calling dlopen\n");
-	}
-
-	handle = dlopen(argv[1], RTLD_NOW | RTLD_GLOBAL);
-	if (handle == NULL) {
-		fprintf(stderr, "%s\n", dlerror());
-		exit(EXIT_FAILURE);
-	}
-
-	// At this point there should not be a Go signal handler
-	// installed for SIGIO.
-
-	if (verbose) {
-		printf("raising SIGIO\n");
-	}
-
-	if (raise(SIGIO) < 0) {
-		die("raise");
-	}
-
-	if (verbose) {
-		printf("waiting for sigioSeen\n");
-	}
-
-	// Wait until the signal has been delivered.
-	i = 0;
-	while (!sigioSeen) {
-		ts.tv_sec = 0;
-		ts.tv_nsec = 1000000;
-		nanosleep(&ts, NULL);
-		i++;
-		if (i > 5000) {
-			fprintf(stderr, "looping too long waiting for signal\n");
-			exit(EXIT_FAILURE);
-		}
-	}
-
-	sigioSeen = 0;
-
-	// Tell the Go code to catch SIGIO.
-
-	if (verbose) {
-		printf("calling dlsym\n");
-	}
-
-	fn1 = (void(*)(void))dlsym(handle, "CatchSIGIO");
-	if (fn1 == NULL) {
-		fprintf(stderr, "%s\n", dlerror());
-		exit(EXIT_FAILURE);
-	}
-
-	if (verbose) {
-		printf("calling CatchSIGIO\n");
-	}
-
-	fn1();
-
-	if (verbose) {
-		printf("raising SIGIO\n");
-	}
-
-	if (raise(SIGIO) < 0) {
-		die("raise");
-	}
-
-	if (verbose) {
-		printf("calling dlsym\n");
-	}
-
-	// Check that the Go code saw SIGIO.
-	sawSIGIO = (int (*)(void))dlsym(handle, "SawSIGIO");
-	if (sawSIGIO == NULL) {
-		fprintf(stderr, "%s\n", dlerror());
-		exit(EXIT_FAILURE);
-	}
-
-	if (verbose) {
-		printf("calling SawSIGIO\n");
-	}
-
-	if (!sawSIGIO()) {
-		fprintf(stderr, "Go handler did not see SIGIO\n");
-		exit(EXIT_FAILURE);
-	}
-
-	if (sigioSeen != 0) {
-		fprintf(stderr, "C handler saw SIGIO when only Go handler should have\n");
-		exit(EXIT_FAILURE);
-	}
-
-	// Tell the Go code to stop catching SIGIO.
-
-	if (verbose) {
-		printf("calling dlsym\n");
-	}
-
-	fn1 = (void(*)(void))dlsym(handle, "ResetSIGIO");
-	if (fn1 == NULL) {
-		fprintf(stderr, "%s\n", dlerror());
-		exit(EXIT_FAILURE);
-	}
-
-	if (verbose) {
-		printf("calling ResetSIGIO\n");
-	}
-
-	fn1();
-
-	if (verbose) {
-		printf("raising SIGIO\n");
-	}
-
-	if (raise(SIGIO) < 0) {
-		die("raise");
-	}
-
-	if (verbose) {
-		printf("calling SawSIGIO\n");
-	}
-
-	if (sawSIGIO()) {
-		fprintf(stderr, "Go handler saw SIGIO after Reset\n");
-		exit(EXIT_FAILURE);
-	}
-
-	if (verbose) {
-		printf("waiting for sigioSeen\n");
-	}
-
-	// Wait until the signal has been delivered.
-	i = 0;
-	while (!sigioSeen) {
-		ts.tv_sec = 0;
-		ts.tv_nsec = 1000000;
-		nanosleep(&ts, NULL);
-		i++;
-		if (i > 5000) {
-			fprintf(stderr, "looping too long waiting for signal\n");
-			exit(EXIT_FAILURE);
-		}
-	}
-
-	printf("PASS\n");
-	return 0;
-}
diff --git a/misc/cgo/testgodefs/testdata/anonunion.go b/misc/cgo/testgodefs/testdata/anonunion.go
deleted file mode 100644
index 18840f2..0000000
--- a/misc/cgo/testgodefs/testdata/anonunion.go
+++ /dev/null
@@ -1,26 +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 main
-
-// This file tests that when cgo -godefs sees a struct with a field
-// that is an anonymous union, the first field in the union is
-// promoted to become a field of the struct.  See issue 6677 for
-// background.
-
-/*
-typedef struct {
-	union {
-		long l;
-		int c;
-	};
-} t;
-*/
-import "C"
-
-// Input for cgo -godefs.
-
-type T C.t
diff --git a/misc/cgo/testgodefs/testdata/bitfields.go b/misc/cgo/testgodefs/testdata/bitfields.go
deleted file mode 100644
index 6a9724d..0000000
--- a/misc/cgo/testgodefs/testdata/bitfields.go
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2020 The Go 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 file tests that we don't generate an incorrect field location
-// for a bitfield that appears aligned.
-
-/*
-struct bitfields {
-    unsigned int B1     :  5;
-    unsigned int B2     :  1;
-    unsigned int B3     :  1;
-    unsigned int B4     :  1;
-    unsigned int Short1 : 16; // misaligned on 8 bit boundary
-    unsigned int B5     :  1;
-    unsigned int B6     :  1;
-    unsigned int B7     :  1;
-    unsigned int B8     :  1;
-    unsigned int B9     :  1;
-    unsigned int B10    :  3;
-    unsigned int Short2 : 16; // alignment is OK
-    unsigned int Short3 : 16; // alignment is OK
-};
-*/
-import "C"
-
-type bitfields C.struct_bitfields
diff --git a/misc/cgo/testgodefs/testdata/fieldtypedef.go b/misc/cgo/testgodefs/testdata/fieldtypedef.go
deleted file mode 100644
index 45c0bf8..0000000
--- a/misc/cgo/testgodefs/testdata/fieldtypedef.go
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserve d.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-//
-// +build ignore
-
-package main
-
-/*
-struct S1 { int f1; };
-struct S2 { struct S1 s1; };
-typedef struct S1 S1Type;
-typedef struct S2 S2Type;
-*/
-import "C"
-
-type S1 C.S1Type
-type S2 C.S2Type
diff --git a/misc/cgo/testgodefs/testdata/issue37479.go b/misc/cgo/testgodefs/testdata/issue37479.go
deleted file mode 100644
index a210eb5..0000000
--- a/misc/cgo/testgodefs/testdata/issue37479.go
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2020 The Go 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
-
-/*
-typedef struct A A;
-
-typedef struct {
-	struct A *next;
-	struct A **prev;
-} N;
-
-struct A
-{
-	N n;
-};
-
-typedef struct B
-{
-	A* a;
-} B;
-*/
-import "C"
-
-type N C.N
-
-type A C.A
-
-type B C.B
diff --git a/misc/cgo/testgodefs/testdata/issue37621.go b/misc/cgo/testgodefs/testdata/issue37621.go
deleted file mode 100644
index d5ace3f..0000000
--- a/misc/cgo/testgodefs/testdata/issue37621.go
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2020 The Go 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
-
-/*
-struct tt {
-	long long a;
-	long long b;
-};
-
-struct s {
-	struct tt ts[3];
-};
-*/
-import "C"
-
-type TT C.struct_tt
-
-type S C.struct_s
diff --git a/misc/cgo/testgodefs/testdata/issue38649.go b/misc/cgo/testgodefs/testdata/issue38649.go
deleted file mode 100644
index 6af74d6..0000000
--- a/misc/cgo/testgodefs/testdata/issue38649.go
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright 2020 The Go 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
-
-/*
-struct Issue38649 { int x; };
-#define issue38649 struct Issue38649
-*/
-import "C"
-
-type issue38649 C.issue38649
diff --git a/misc/cgo/testgodefs/testdata/issue39534.go b/misc/cgo/testgodefs/testdata/issue39534.go
deleted file mode 100644
index 9899ba1..0000000
--- a/misc/cgo/testgodefs/testdata/issue39534.go
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2020 The Go 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
-
-// enum { ENUMVAL = 0x1 };
-import "C"
-
-const ENUMVAL = C.ENUMVAL
diff --git a/misc/cgo/testgodefs/testdata/issue48396.go b/misc/cgo/testgodefs/testdata/issue48396.go
deleted file mode 100644
index d4c1924..0000000
--- a/misc/cgo/testgodefs/testdata/issue48396.go
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2021 The Go 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
-
-/*
-// from <linux/kcm.h>
-struct issue48396 {
-	int fd;
-	int bpf_fd;
-};
-*/
-import "C"
-
-type Issue48396 C.struct_issue48396
diff --git a/misc/cgo/testgodefs/testdata/issue8478.go b/misc/cgo/testgodefs/testdata/issue8478.go
deleted file mode 100644
index 2321446..0000000
--- a/misc/cgo/testgodefs/testdata/issue8478.go
+++ /dev/null
@@ -1,20 +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 main
-
-// Issue 8478.  Test that void* is consistently mapped to *byte.
-
-/*
-typedef struct {
-	void *p;
-	void **q;
-	void ***r;
-} s;
-*/
-import "C"
-
-type Issue8478 C.s
diff --git a/misc/cgo/testgodefs/testgodefs_test.go b/misc/cgo/testgodefs/testgodefs_test.go
deleted file mode 100644
index d03769e..0000000
--- a/misc/cgo/testgodefs/testgodefs_test.go
+++ /dev/null
@@ -1,112 +0,0 @@
-// Copyright 2019 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package testgodefs
-
-import (
-	"bytes"
-	"os"
-	"os/exec"
-	"path/filepath"
-	"runtime"
-	"strings"
-	"testing"
-)
-
-// We are testing cgo -godefs, which translates Go files that use
-// import "C" into Go files with Go definitions of types defined in the
-// import "C" block.  Add more tests here.
-var filePrefixes = []string{
-	"anonunion",
-	"bitfields",
-	"issue8478",
-	"fieldtypedef",
-	"issue37479",
-	"issue37621",
-	"issue38649",
-	"issue39534",
-	"issue48396",
-}
-
-func TestGoDefs(t *testing.T) {
-	testdata, err := filepath.Abs("testdata")
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	gopath, err := os.MkdirTemp("", "testgodefs-gopath")
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer os.RemoveAll(gopath)
-
-	dir := filepath.Join(gopath, "src", "testgodefs")
-	if err := os.MkdirAll(dir, 0755); err != nil {
-		t.Fatal(err)
-	}
-
-	for _, fp := range filePrefixes {
-		cmd := exec.Command("go", "tool", "cgo",
-			"-godefs",
-			"-srcdir", testdata,
-			"-objdir", dir,
-			fp+".go")
-		cmd.Stderr = new(bytes.Buffer)
-
-		out, err := cmd.Output()
-		if err != nil {
-			t.Fatalf("%s: %v\n%s", strings.Join(cmd.Args, " "), err, cmd.Stderr)
-		}
-
-		fn := fp + "_defs.go"
-		if err := os.WriteFile(filepath.Join(dir, fn), out, 0644); err != nil {
-			t.Fatal(err)
-		}
-
-		// Verify that command line arguments are not rewritten in the generated comment,
-		// see go.dev/issue/52063
-		hasGeneratedByComment := false
-		for _, line := range strings.Split(strings.TrimSpace(string(out)), "\n") {
-			cgoExe := "cgo"
-			if runtime.GOOS == "windows" {
-				cgoExe = "cgo.exe"
-			}
-			if !strings.HasPrefix(line, "// "+cgoExe+" -godefs") {
-				continue
-			}
-			if want := "// " + cgoExe + " " + strings.Join(cmd.Args[3:], " "); line != want {
-				t.Errorf("%s: got generated comment %q, want %q", fn, line, want)
-			}
-			hasGeneratedByComment = true
-			break
-		}
-
-		if !hasGeneratedByComment {
-			t.Errorf("%s: comment with generating cgo -godefs command not found", fn)
-		}
-	}
-
-	main, err := os.ReadFile(filepath.Join("testdata", "main.go"))
-	if err != nil {
-		t.Fatal(err)
-	}
-	if err := os.WriteFile(filepath.Join(dir, "main.go"), main, 0644); err != nil {
-		t.Fatal(err)
-	}
-
-	if err := os.WriteFile(filepath.Join(dir, "go.mod"), []byte("module testgodefs\ngo 1.14\n"), 0644); err != nil {
-		t.Fatal(err)
-	}
-
-	// Use 'go run' to build and run the resulting binary in a single step,
-	// instead of invoking 'go build' and the resulting binary separately, so that
-	// this test can pass on mobile builders, which do not copy artifacts back
-	// from remote invocations.
-	cmd := exec.Command("go", "run", ".")
-	cmd.Env = append(os.Environ(), "GOPATH="+gopath)
-	cmd.Dir = dir
-	if out, err := cmd.CombinedOutput(); err != nil {
-		t.Fatalf("%s [%s]: %v\n%s", strings.Join(cmd.Args, " "), dir, err, out)
-	}
-}
diff --git a/misc/cgo/testplugin/overlaydir_test.go b/misc/cgo/testplugin/overlaydir_test.go
deleted file mode 100644
index e2c32d8..0000000
--- a/misc/cgo/testplugin/overlaydir_test.go
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright 2019 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package plugin_test
-
-import (
-	"io"
-	"os"
-	"path/filepath"
-	"strings"
-)
-
-// overlayDir makes a minimal-overhead copy of srcRoot in which new files may be added.
-//
-// TODO: Once we no longer need to support the misc module in GOPATH mode,
-// factor this function out into a package to reduce duplication.
-func overlayDir(dstRoot, srcRoot string) error {
-	dstRoot = filepath.Clean(dstRoot)
-	if err := os.MkdirAll(dstRoot, 0777); err != nil {
-		return err
-	}
-
-	srcRoot, err := filepath.Abs(srcRoot)
-	if err != nil {
-		return err
-	}
-
-	return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error {
-		if err != nil || srcPath == srcRoot {
-			return err
-		}
-
-		suffix := strings.TrimPrefix(srcPath, srcRoot)
-		for len(suffix) > 0 && suffix[0] == filepath.Separator {
-			suffix = suffix[1:]
-		}
-		dstPath := filepath.Join(dstRoot, suffix)
-
-		perm := info.Mode() & os.ModePerm
-		if info.Mode()&os.ModeSymlink != 0 {
-			info, err = os.Stat(srcPath)
-			if err != nil {
-				return err
-			}
-			perm = info.Mode() & os.ModePerm
-		}
-
-		// Always copy directories (don't symlink them).
-		// If we add a file in the overlay, we don't want to add it in the original.
-		if info.IsDir() {
-			return os.MkdirAll(dstPath, perm|0200)
-		}
-
-		// If the OS supports symlinks, use them instead of copying bytes.
-		if err := os.Symlink(srcPath, dstPath); err == nil {
-			return nil
-		}
-
-		// Otherwise, copy the bytes.
-		src, err := os.Open(srcPath)
-		if err != nil {
-			return err
-		}
-		defer src.Close()
-
-		dst, err := os.OpenFile(dstPath, os.O_WRONLY|os.O_CREATE|os.O_EXCL, perm)
-		if err != nil {
-			return err
-		}
-
-		_, err = io.Copy(dst, src)
-		if closeErr := dst.Close(); err == nil {
-			err = closeErr
-		}
-		return err
-	})
-}
diff --git a/misc/cgo/testplugin/plugin_test.go b/misc/cgo/testplugin/plugin_test.go
deleted file mode 100644
index 2856810..0000000
--- a/misc/cgo/testplugin/plugin_test.go
+++ /dev/null
@@ -1,342 +0,0 @@
-// Copyright 2019 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package plugin_test
-
-import (
-	"bytes"
-	"context"
-	"flag"
-	"fmt"
-	"log"
-	"os"
-	"os/exec"
-	"path/filepath"
-	"strings"
-	"testing"
-	"time"
-)
-
-var gcflags string = os.Getenv("GO_GCFLAGS")
-var goroot string
-
-func TestMain(m *testing.M) {
-	flag.Parse()
-	if testing.Short() && os.Getenv("GO_BUILDER_NAME") == "" {
-		fmt.Printf("SKIP - short mode and $GO_BUILDER_NAME not set\n")
-		os.Exit(0)
-	}
-	log.SetFlags(log.Lshortfile)
-	os.Exit(testMain(m))
-}
-
-// tmpDir is used to cleanup logged commands -- s/tmpDir/$TMPDIR/
-var tmpDir string
-
-// prettyPrintf prints lines with tmpDir sanitized.
-func prettyPrintf(format string, args ...interface{}) {
-	s := fmt.Sprintf(format, args...)
-	if tmpDir != "" {
-		s = strings.ReplaceAll(s, tmpDir, "$TMPDIR")
-	}
-	fmt.Print(s)
-}
-
-func testMain(m *testing.M) int {
-	cwd, err := os.Getwd()
-	if err != nil {
-		log.Fatal(err)
-	}
-	goroot = filepath.Join(cwd, "../../..")
-
-	// Copy testdata into GOPATH/src/testplugin, along with a go.mod file
-	// declaring the same path.
-
-	GOPATH, err := os.MkdirTemp("", "plugin_test")
-	if err != nil {
-		log.Panic(err)
-	}
-	defer os.RemoveAll(GOPATH)
-	tmpDir = GOPATH
-
-	modRoot := filepath.Join(GOPATH, "src", "testplugin")
-	altRoot := filepath.Join(GOPATH, "alt", "src", "testplugin")
-	for srcRoot, dstRoot := range map[string]string{
-		"testdata":                           modRoot,
-		filepath.Join("altpath", "testdata"): altRoot,
-	} {
-		if err := overlayDir(dstRoot, srcRoot); err != nil {
-			log.Panic(err)
-		}
-		prettyPrintf("mkdir -p %s\n", dstRoot)
-		prettyPrintf("rsync -a %s/ %s\n", srcRoot, dstRoot)
-
-		if err := os.WriteFile(filepath.Join(dstRoot, "go.mod"), []byte("module testplugin\n"), 0666); err != nil {
-			log.Panic(err)
-		}
-		prettyPrintf("echo 'module testplugin' > %s/go.mod\n", dstRoot)
-	}
-
-	os.Setenv("GOPATH", filepath.Join(GOPATH, "alt"))
-	if err := os.Chdir(altRoot); err != nil {
-		log.Panic(err)
-	} else {
-		prettyPrintf("cd %s\n", altRoot)
-	}
-	os.Setenv("PWD", altRoot)
-	goCmd(nil, "build", "-buildmode=plugin", "-o", filepath.Join(modRoot, "plugin-mismatch.so"), "./plugin-mismatch")
-
-	os.Setenv("GOPATH", GOPATH)
-	if err := os.Chdir(modRoot); err != nil {
-		log.Panic(err)
-	} else {
-		prettyPrintf("cd %s\n", modRoot)
-	}
-	os.Setenv("PWD", modRoot)
-
-	os.Setenv("LD_LIBRARY_PATH", modRoot)
-
-	goCmd(nil, "build", "-buildmode=plugin", "./plugin1")
-	goCmd(nil, "build", "-buildmode=plugin", "./plugin2")
-	so, err := os.ReadFile("plugin2.so")
-	if err != nil {
-		log.Panic(err)
-	}
-	if err := os.WriteFile("plugin2-dup.so", so, 0444); err != nil {
-		log.Panic(err)
-	}
-	prettyPrintf("cp plugin2.so plugin2-dup.so\n")
-
-	goCmd(nil, "build", "-buildmode=plugin", "-o=sub/plugin1.so", "./sub/plugin1")
-	goCmd(nil, "build", "-buildmode=plugin", "-o=unnamed1.so", "./unnamed1/main.go")
-	goCmd(nil, "build", "-buildmode=plugin", "-o=unnamed2.so", "./unnamed2/main.go")
-	goCmd(nil, "build", "-o", "host.exe", "./host")
-
-	return m.Run()
-}
-
-func goCmd(t *testing.T, op string, args ...string) {
-	if t != nil {
-		t.Helper()
-	}
-	run(t, filepath.Join(goroot, "bin", "go"), append([]string{op, "-gcflags", gcflags}, args...)...)
-}
-
-// escape converts a string to something suitable for a shell command line.
-func escape(s string) string {
-	s = strings.Replace(s, "\\", "\\\\", -1)
-	s = strings.Replace(s, "'", "\\'", -1)
-	// Conservative guess at characters that will force quoting
-	if s == "" || strings.ContainsAny(s, "\\ ;#*&$~?!|[]()<>{}`") {
-		s = "'" + s + "'"
-	}
-	return s
-}
-
-// asCommandLine renders cmd as something that could be copy-and-pasted into a command line
-func asCommandLine(cwd string, cmd *exec.Cmd) string {
-	s := "("
-	if cmd.Dir != "" && cmd.Dir != cwd {
-		s += "cd" + escape(cmd.Dir) + ";"
-	}
-	for _, e := range cmd.Env {
-		if !strings.HasPrefix(e, "PATH=") &&
-			!strings.HasPrefix(e, "HOME=") &&
-			!strings.HasPrefix(e, "USER=") &&
-			!strings.HasPrefix(e, "SHELL=") {
-			s += " "
-			s += escape(e)
-		}
-	}
-	// These EVs are relevant to this test.
-	for _, e := range os.Environ() {
-		if strings.HasPrefix(e, "PWD=") ||
-			strings.HasPrefix(e, "GOPATH=") ||
-			strings.HasPrefix(e, "LD_LIBRARY_PATH=") {
-			s += " "
-			s += escape(e)
-		}
-	}
-	for _, a := range cmd.Args {
-		s += " "
-		s += escape(a)
-	}
-	s += " )"
-	return s
-}
-
-func run(t *testing.T, bin string, args ...string) string {
-	cmd := exec.Command(bin, args...)
-	cmdLine := asCommandLine(".", cmd)
-	prettyPrintf("%s\n", cmdLine)
-	cmd.Stderr = new(strings.Builder)
-	out, err := cmd.Output()
-	if err != nil {
-		if t == nil {
-			log.Panicf("%s: %v\n%s", strings.Join(cmd.Args, " "), err, cmd.Stderr)
-		} else {
-			t.Helper()
-			t.Fatalf("%s: %v\n%s", strings.Join(cmd.Args, " "), err, cmd.Stderr)
-		}
-	}
-
-	return string(bytes.TrimSpace(out))
-}
-
-func TestDWARFSections(t *testing.T) {
-	// test that DWARF sections are emitted for plugins and programs importing "plugin"
-	goCmd(t, "run", "./checkdwarf/main.go", "plugin2.so", "plugin2.UnexportedNameReuse")
-	goCmd(t, "run", "./checkdwarf/main.go", "./host.exe", "main.main")
-}
-
-func TestRunHost(t *testing.T) {
-	run(t, "./host.exe")
-}
-
-func TestUniqueTypesAndItabs(t *testing.T) {
-	goCmd(t, "build", "-buildmode=plugin", "./iface_a")
-	goCmd(t, "build", "-buildmode=plugin", "./iface_b")
-	goCmd(t, "build", "-o", "iface.exe", "./iface")
-	run(t, "./iface.exe")
-}
-
-func TestIssue18676(t *testing.T) {
-	// make sure we don't add the same itab twice.
-	// The buggy code hangs forever, so use a timeout to check for that.
-	goCmd(t, "build", "-buildmode=plugin", "-o", "plugin.so", "./issue18676/plugin.go")
-	goCmd(t, "build", "-o", "issue18676.exe", "./issue18676/main.go")
-
-	ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
-	defer cancel()
-	cmd := exec.CommandContext(ctx, "./issue18676.exe")
-	out, err := cmd.CombinedOutput()
-	if err != nil {
-		t.Fatalf("%s: %v\n%s", strings.Join(cmd.Args, " "), err, out)
-	}
-}
-
-func TestIssue19534(t *testing.T) {
-	// Test that we can load a plugin built in a path with non-alpha characters.
-	goCmd(t, "build", "-buildmode=plugin", "-gcflags=-p=issue.19534", "-ldflags=-pluginpath=issue.19534", "-o", "plugin.so", "./issue19534/plugin.go")
-	goCmd(t, "build", "-o", "issue19534.exe", "./issue19534/main.go")
-	run(t, "./issue19534.exe")
-}
-
-func TestIssue18584(t *testing.T) {
-	goCmd(t, "build", "-buildmode=plugin", "-o", "plugin.so", "./issue18584/plugin.go")
-	goCmd(t, "build", "-o", "issue18584.exe", "./issue18584/main.go")
-	run(t, "./issue18584.exe")
-}
-
-func TestIssue19418(t *testing.T) {
-	goCmd(t, "build", "-buildmode=plugin", "-ldflags=-X main.Val=linkstr", "-o", "plugin.so", "./issue19418/plugin.go")
-	goCmd(t, "build", "-o", "issue19418.exe", "./issue19418/main.go")
-	run(t, "./issue19418.exe")
-}
-
-func TestIssue19529(t *testing.T) {
-	goCmd(t, "build", "-buildmode=plugin", "-o", "plugin.so", "./issue19529/plugin.go")
-}
-
-func TestIssue22175(t *testing.T) {
-	goCmd(t, "build", "-buildmode=plugin", "-o", "issue22175_plugin1.so", "./issue22175/plugin1.go")
-	goCmd(t, "build", "-buildmode=plugin", "-o", "issue22175_plugin2.so", "./issue22175/plugin2.go")
-	goCmd(t, "build", "-o", "issue22175.exe", "./issue22175/main.go")
-	run(t, "./issue22175.exe")
-}
-
-func TestIssue22295(t *testing.T) {
-	goCmd(t, "build", "-buildmode=plugin", "-o", "issue.22295.so", "./issue22295.pkg")
-	goCmd(t, "build", "-o", "issue22295.exe", "./issue22295.pkg/main.go")
-	run(t, "./issue22295.exe")
-}
-
-func TestIssue24351(t *testing.T) {
-	goCmd(t, "build", "-buildmode=plugin", "-o", "issue24351.so", "./issue24351/plugin.go")
-	goCmd(t, "build", "-o", "issue24351.exe", "./issue24351/main.go")
-	run(t, "./issue24351.exe")
-}
-
-func TestIssue25756(t *testing.T) {
-	goCmd(t, "build", "-buildmode=plugin", "-o", "life.so", "./issue25756/plugin")
-	goCmd(t, "build", "-o", "issue25756.exe", "./issue25756/main.go")
-	// Fails intermittently, but 20 runs should cause the failure
-	for n := 20; n > 0; n-- {
-		t.Run(fmt.Sprint(n), func(t *testing.T) {
-			t.Parallel()
-			run(t, "./issue25756.exe")
-		})
-	}
-}
-
-// Test with main using -buildmode=pie with plugin for issue #43228
-func TestIssue25756pie(t *testing.T) {
-	goCmd(t, "build", "-buildmode=plugin", "-o", "life.so", "./issue25756/plugin")
-	goCmd(t, "build", "-buildmode=pie", "-o", "issue25756pie.exe", "./issue25756/main.go")
-	run(t, "./issue25756pie.exe")
-}
-
-func TestMethod(t *testing.T) {
-	// Exported symbol's method must be live.
-	goCmd(t, "build", "-buildmode=plugin", "-o", "plugin.so", "./method/plugin.go")
-	goCmd(t, "build", "-o", "method.exe", "./method/main.go")
-	run(t, "./method.exe")
-}
-
-func TestMethod2(t *testing.T) {
-	goCmd(t, "build", "-buildmode=plugin", "-o", "method2.so", "./method2/plugin.go")
-	goCmd(t, "build", "-o", "method2.exe", "./method2/main.go")
-	run(t, "./method2.exe")
-}
-
-func TestMethod3(t *testing.T) {
-	goCmd(t, "build", "-buildmode=plugin", "-o", "method3.so", "./method3/plugin.go")
-	goCmd(t, "build", "-o", "method3.exe", "./method3/main.go")
-	run(t, "./method3.exe")
-}
-
-func TestIssue44956(t *testing.T) {
-	goCmd(t, "build", "-buildmode=plugin", "-o", "issue44956p1.so", "./issue44956/plugin1.go")
-	goCmd(t, "build", "-buildmode=plugin", "-o", "issue44956p2.so", "./issue44956/plugin2.go")
-	goCmd(t, "build", "-o", "issue44956.exe", "./issue44956/main.go")
-	run(t, "./issue44956.exe")
-}
-
-func TestIssue52937(t *testing.T) {
-	goCmd(t, "build", "-buildmode=plugin", "-o", "issue52937.so", "./issue52937/main.go")
-}
-
-func TestIssue53989(t *testing.T) {
-	goCmd(t, "build", "-buildmode=plugin", "-o", "issue53989.so", "./issue53989/plugin.go")
-	goCmd(t, "build", "-o", "issue53989.exe", "./issue53989/main.go")
-	run(t, "./issue53989.exe")
-}
-
-func TestForkExec(t *testing.T) {
-	// Issue 38824: importing the plugin package causes it hang in forkExec on darwin.
-
-	t.Parallel()
-	goCmd(t, "build", "-o", "forkexec.exe", "./forkexec/main.go")
-
-	var cmd *exec.Cmd
-	done := make(chan int, 1)
-
-	go func() {
-		for i := 0; i < 100; i++ {
-			cmd = exec.Command("./forkexec.exe", "1")
-			err := cmd.Run()
-			if err != nil {
-				t.Errorf("running command failed: %v", err)
-				break
-			}
-		}
-		done <- 1
-	}()
-	select {
-	case <-done:
-	case <-time.After(5 * time.Minute):
-		cmd.Process.Kill()
-		t.Fatalf("subprocess hang")
-	}
-}
diff --git a/misc/cgo/testplugin/testdata/issue18676/main.go b/misc/cgo/testplugin/testdata/issue18676/main.go
deleted file mode 100644
index b1dadbe..0000000
--- a/misc/cgo/testplugin/testdata/issue18676/main.go
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2017 The Go 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 bug happened like this:
-// 1) The main binary adds an itab for *json.UnsupportedValueError / error
-//    (concrete type / interface type).  This itab goes in hash bucket 0x111.
-// 2) The plugin adds that same itab again.  That makes a cycle in the itab
-//    chain rooted at hash bucket 0x111.
-// 3) The main binary then asks for the itab for *dynamodbstreamsevt.Event /
-//    json.Unmarshaler.  This itab happens to also live in bucket 0x111.
-//    The lookup code goes into an infinite loop searching for this itab.
-// The code is carefully crafted so that the two itabs are both from the
-// same bucket, and so that the second itab doesn't exist in
-// the itab hashmap yet (so the entire linked list must be searched).
-package main
-
-import (
-	"encoding/json"
-	"plugin"
-	"testplugin/issue18676/dynamodbstreamsevt"
-)
-
-func main() {
-	plugin.Open("plugin.so")
-
-	var x interface{} = (*dynamodbstreamsevt.Event)(nil)
-	if _, ok := x.(json.Unmarshaler); !ok {
-		println("something")
-	}
-}
diff --git a/misc/cgo/testplugin/testdata/issue22295.pkg/main.go b/misc/cgo/testplugin/testdata/issue22295.pkg/main.go
deleted file mode 100644
index 6cb186e..0000000
--- a/misc/cgo/testplugin/testdata/issue22295.pkg/main.go
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2017 The Go 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 (
-	"log"
-	"plugin"
-)
-
-func main() {
-	p, err := plugin.Open("issue.22295.so")
-	if err != nil {
-		log.Fatal(err)
-	}
-	f, err := p.Lookup("F")
-	if err != nil {
-		log.Fatal(err)
-	}
-	const want = 2503
-	got := f.(func() int)()
-	if got != want {
-		log.Fatalf("got %d, want %d", got, want)
-	}
-}
diff --git a/misc/cgo/testplugin/testdata/issue25756/plugin/life.go b/misc/cgo/testplugin/testdata/issue25756/plugin/life.go
deleted file mode 100644
index 675a192..0000000
--- a/misc/cgo/testplugin/testdata/issue25756/plugin/life.go
+++ /dev/null
@@ -1,39 +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
-
-// #include "life.h"
-import "C"
-
-import "unsafe"
-
-func Run(gen, x, y int, a []int32) {
-	n := make([]int32, x*y)
-	for i := 0; i < gen; i++ {
-		C.Step(C.int(x), C.int(y), (*C.int)(unsafe.Pointer(&a[0])), (*C.int)(unsafe.Pointer(&n[0])))
-		copy(a, n)
-	}
-}
-
-// Keep the channels visible from Go.
-var chans [4]chan bool
-
-//export GoStart
-// Double return value is just for testing.
-func GoStart(i, xdim, ydim, xstart, xend, ystart, yend C.int, a *C.int, n *C.int) (int, int) {
-	c := make(chan bool, int(C.MYCONST))
-	go func() {
-		C.DoStep(xdim, ydim, xstart, xend, ystart, yend, a, n)
-		c <- true
-	}()
-	chans[i] = c
-	return int(i), int(i + 100)
-}
-
-//export GoWait
-func GoWait(i C.int) {
-	<-chans[i]
-	chans[i] = nil
-}
diff --git a/misc/cgo/testplugin/testdata/method3/p/p.go b/misc/cgo/testplugin/testdata/method3/p/p.go
deleted file mode 100644
index 3846bc0..0000000
--- a/misc/cgo/testplugin/testdata/method3/p/p.go
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2022 The Go Authors. 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 T int
-
-func (T) m() { println("m") }
-
-type I interface { m() }
-
-func F() {
-	i.m()
-}
-
-var i I = T(123)
diff --git a/misc/cgo/testplugin/testdata/unnamed1/main.go b/misc/cgo/testplugin/testdata/unnamed1/main.go
deleted file mode 100644
index dd1777b..0000000
--- a/misc/cgo/testplugin/testdata/unnamed1/main.go
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2016 The Go 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
-
-// // No C code required.
-import "C"
-
-func FuncInt() int { return 1 }
-
-// Add a recursive type to check that type equality across plugins doesn't
-// crash. See https://golang.org/issues/19258
-func FuncRecursive() X { return X{} }
-
-type Y struct {
-	X *X
-}
-type X struct {
-	Y Y
-}
-
-func main() {}
diff --git a/misc/cgo/testplugin/testdata/unnamed2/main.go b/misc/cgo/testplugin/testdata/unnamed2/main.go
deleted file mode 100644
index 757436f..0000000
--- a/misc/cgo/testplugin/testdata/unnamed2/main.go
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2016 The Go 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
-
-// // No C code required.
-import "C"
-
-func FuncInt() int { return 2 }
-
-func FuncRecursive() X { return X{} }
-
-type Y struct {
-	X *X
-}
-type X struct {
-	Y Y
-}
-
-func main() {}
diff --git a/misc/cgo/testsanitizers/asan_test.go b/misc/cgo/testsanitizers/asan_test.go
deleted file mode 100644
index 932cfb1..0000000
--- a/misc/cgo/testsanitizers/asan_test.go
+++ /dev/null
@@ -1,141 +0,0 @@
-// Copyright 2021 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package sanitizers_test
-
-import (
-	"fmt"
-	"strings"
-	"testing"
-)
-
-func TestASAN(t *testing.T) {
-	goos, err := goEnv("GOOS")
-	if err != nil {
-		t.Fatal(err)
-	}
-	goarch, err := goEnv("GOARCH")
-	if err != nil {
-		t.Fatal(err)
-	}
-	// The asan tests require support for the -asan option.
-	if !aSanSupported(goos, goarch) {
-		t.Skipf("skipping on %s/%s; -asan option is not supported.", goos, goarch)
-	}
-	// The current implementation is only compatible with the ASan library from version
-	// v7 to v9 (See the description in src/runtime/asan/asan.go). Therefore, using the
-	// -asan option must use a compatible version of ASan library, which requires that
-	// the gcc version is not less than 7 and the clang version is not less than 9,
-	// otherwise a segmentation fault will occur.
-	if !compilerRequiredAsanVersion(goos, goarch) {
-		t.Skipf("skipping on %s/%s: too old version of compiler", goos, goarch)
-	}
-
-	t.Parallel()
-	requireOvercommit(t)
-	config := configure("address")
-	config.skipIfCSanitizerBroken(t)
-
-	mustRun(t, config.goCmd("build", "std"))
-
-	cases := []struct {
-		src               string
-		memoryAccessError string
-		errorLocation     string
-		experiments       []string
-	}{
-		{src: "asan1_fail.go", memoryAccessError: "heap-use-after-free", errorLocation: "asan1_fail.go:25"},
-		{src: "asan2_fail.go", memoryAccessError: "heap-buffer-overflow", errorLocation: "asan2_fail.go:31"},
-		{src: "asan3_fail.go", memoryAccessError: "use-after-poison", errorLocation: "asan3_fail.go:13"},
-		{src: "asan4_fail.go", memoryAccessError: "use-after-poison", errorLocation: "asan4_fail.go:13"},
-		{src: "asan5_fail.go", memoryAccessError: "use-after-poison", errorLocation: "asan5_fail.go:18"},
-		{src: "asan_useAfterReturn.go"},
-		{src: "asan_unsafe_fail1.go", memoryAccessError: "use-after-poison", errorLocation: "asan_unsafe_fail1.go:25"},
-		{src: "asan_unsafe_fail2.go", memoryAccessError: "use-after-poison", errorLocation: "asan_unsafe_fail2.go:25"},
-		{src: "asan_unsafe_fail3.go", memoryAccessError: "use-after-poison", errorLocation: "asan_unsafe_fail3.go:18"},
-		{src: "asan_global1_fail.go", memoryAccessError: "global-buffer-overflow", errorLocation: "asan_global1_fail.go:12"},
-		{src: "asan_global2_fail.go", memoryAccessError: "global-buffer-overflow", errorLocation: "asan_global2_fail.go:19"},
-		{src: "asan_global3_fail.go", memoryAccessError: "global-buffer-overflow", errorLocation: "asan_global3_fail.go:13"},
-		{src: "asan_global4_fail.go", memoryAccessError: "global-buffer-overflow", errorLocation: "asan_global4_fail.go:21"},
-		{src: "asan_global5.go"},
-		{src: "arena_fail.go", memoryAccessError: "use-after-poison", errorLocation: "arena_fail.go:26", experiments: []string{"arenas"}},
-	}
-	for _, tc := range cases {
-		tc := tc
-		name := strings.TrimSuffix(tc.src, ".go")
-		t.Run(name, func(t *testing.T) {
-			t.Parallel()
-
-			dir := newTempDir(t)
-			defer dir.RemoveAll(t)
-
-			outPath := dir.Join(name)
-			mustRun(t, config.goCmdWithExperiments("build", []string{"-o", outPath, srcPath(tc.src)}, tc.experiments))
-
-			cmd := hangProneCmd(outPath)
-			if tc.memoryAccessError != "" {
-				outb, err := cmd.CombinedOutput()
-				out := string(outb)
-				if err != nil && strings.Contains(out, tc.memoryAccessError) {
-					// This string is output if the
-					// sanitizer library needs a
-					// symbolizer program and can't find it.
-					const noSymbolizer = "external symbolizer"
-					// Check if -asan option can correctly print where the error occurred.
-					if tc.errorLocation != "" &&
-						!strings.Contains(out, tc.errorLocation) &&
-						!strings.Contains(out, noSymbolizer) &&
-						compilerSupportsLocation() {
-
-						t.Errorf("%#q exited without expected location of the error\n%s; got failure\n%s", strings.Join(cmd.Args, " "), tc.errorLocation, out)
-					}
-					return
-				}
-				t.Fatalf("%#q exited without expected memory access error\n%s; got failure\n%s", strings.Join(cmd.Args, " "), tc.memoryAccessError, out)
-			}
-			mustRun(t, cmd)
-		})
-	}
-}
-
-func TestASANLinkerX(t *testing.T) {
-	// Test ASAN with linker's -X flag (see issue 56175).
-	goos, err := goEnv("GOOS")
-	if err != nil {
-		t.Fatal(err)
-	}
-	goarch, err := goEnv("GOARCH")
-	if err != nil {
-		t.Fatal(err)
-	}
-	// The asan tests require support for the -asan option.
-	if !aSanSupported(goos, goarch) {
-		t.Skipf("skipping on %s/%s; -asan option is not supported.", goos, goarch)
-	}
-	if !compilerRequiredAsanVersion(goos, goarch) {
-		t.Skipf("skipping on %s/%s: too old version of compiler", goos, goarch)
-	}
-
-	t.Parallel()
-	requireOvercommit(t)
-	config := configure("address")
-	config.skipIfCSanitizerBroken(t)
-
-	dir := newTempDir(t)
-	defer dir.RemoveAll(t)
-
-	var ldflags string
-	for i := 1; i <= 10; i++ {
-		ldflags += fmt.Sprintf("-X=main.S%d=%d -X=misc/cgo/testsanitizers/testdata/asan_linkerx/p.S%d=%d ", i, i, i, i)
-	}
-
-	// build the binary
-	outPath := dir.Join("main.exe")
-	cmd := config.goCmd("build", "-ldflags="+ldflags, "-o", outPath)
-	cmd.Dir = srcPath("asan_linkerx")
-	mustRun(t, cmd)
-
-	// run the binary
-	mustRun(t, hangProneCmd(outPath))
-}
diff --git a/misc/cgo/testsanitizers/cc_test.go b/misc/cgo/testsanitizers/cc_test.go
deleted file mode 100644
index 8eda137..0000000
--- a/misc/cgo/testsanitizers/cc_test.go
+++ /dev/null
@@ -1,583 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// sanitizers_test checks the use of Go with sanitizers like msan, asan, etc.
-// See https://github.com/google/sanitizers.
-package sanitizers_test
-
-import (
-	"bytes"
-	"encoding/json"
-	"errors"
-	"fmt"
-	"os"
-	"os/exec"
-	"path/filepath"
-	"regexp"
-	"strconv"
-	"strings"
-	"sync"
-	"syscall"
-	"testing"
-	"time"
-	"unicode"
-)
-
-var overcommit struct {
-	sync.Once
-	value int
-	err   error
-}
-
-// requireOvercommit skips t if the kernel does not allow overcommit.
-func requireOvercommit(t *testing.T) {
-	t.Helper()
-
-	overcommit.Once.Do(func() {
-		var out []byte
-		out, overcommit.err = os.ReadFile("/proc/sys/vm/overcommit_memory")
-		if overcommit.err != nil {
-			return
-		}
-		overcommit.value, overcommit.err = strconv.Atoi(string(bytes.TrimSpace(out)))
-	})
-
-	if overcommit.err != nil {
-		t.Skipf("couldn't determine vm.overcommit_memory (%v); assuming no overcommit", overcommit.err)
-	}
-	if overcommit.value == 2 {
-		t.Skip("vm.overcommit_memory=2")
-	}
-}
-
-var env struct {
-	sync.Once
-	m   map[string]string
-	err error
-}
-
-// goEnv returns the output of $(go env) as a map.
-func goEnv(key string) (string, error) {
-	env.Once.Do(func() {
-		var out []byte
-		out, env.err = exec.Command("go", "env", "-json").Output()
-		if env.err != nil {
-			return
-		}
-
-		env.m = make(map[string]string)
-		env.err = json.Unmarshal(out, &env.m)
-	})
-	if env.err != nil {
-		return "", env.err
-	}
-
-	v, ok := env.m[key]
-	if !ok {
-		return "", fmt.Errorf("`go env`: no entry for %v", key)
-	}
-	return v, nil
-}
-
-// replaceEnv sets the key environment variable to value in cmd.
-func replaceEnv(cmd *exec.Cmd, key, value string) {
-	if cmd.Env == nil {
-		cmd.Env = cmd.Environ()
-	}
-	cmd.Env = append(cmd.Env, key+"="+value)
-}
-
-// appendExperimentEnv appends comma-separated experiments to GOEXPERIMENT.
-func appendExperimentEnv(cmd *exec.Cmd, experiments []string) {
-	if cmd.Env == nil {
-		cmd.Env = cmd.Environ()
-	}
-	exps := strings.Join(experiments, ",")
-	for _, evar := range cmd.Env {
-		c := strings.SplitN(evar, "=", 2)
-		if c[0] == "GOEXPERIMENT" {
-			exps = c[1] + "," + exps
-		}
-	}
-	cmd.Env = append(cmd.Env, "GOEXPERIMENT="+exps)
-}
-
-// mustRun executes t and fails cmd with a well-formatted message if it fails.
-func mustRun(t *testing.T, cmd *exec.Cmd) {
-	t.Helper()
-	out := new(strings.Builder)
-	cmd.Stdout = out
-	cmd.Stderr = out
-
-	err := cmd.Start()
-	if err != nil {
-		t.Fatalf("%v: %v", cmd, err)
-	}
-
-	if deadline, ok := t.Deadline(); ok {
-		timeout := time.Until(deadline)
-		timeout -= timeout / 10 // Leave 10% headroom for logging and cleanup.
-		timer := time.AfterFunc(timeout, func() {
-			cmd.Process.Signal(syscall.SIGQUIT)
-		})
-		defer timer.Stop()
-	}
-
-	if err := cmd.Wait(); err != nil {
-		t.Fatalf("%v exited with %v\n%s", cmd, err, out)
-	}
-}
-
-// cc returns a cmd that executes `$(go env CC) $(go env GOGCCFLAGS) $args`.
-func cc(args ...string) (*exec.Cmd, error) {
-	CC, err := goEnv("CC")
-	if err != nil {
-		return nil, err
-	}
-
-	GOGCCFLAGS, err := goEnv("GOGCCFLAGS")
-	if err != nil {
-		return nil, err
-	}
-
-	// Split GOGCCFLAGS, respecting quoting.
-	//
-	// TODO(bcmills): This code also appears in
-	// misc/cgo/testcarchive/carchive_test.go, and perhaps ought to go in
-	// src/cmd/dist/test.go as well. Figure out where to put it so that it can be
-	// shared.
-	var flags []string
-	quote := '\000'
-	start := 0
-	lastSpace := true
-	backslash := false
-	for i, c := range GOGCCFLAGS {
-		if quote == '\000' && unicode.IsSpace(c) {
-			if !lastSpace {
-				flags = append(flags, GOGCCFLAGS[start:i])
-				lastSpace = true
-			}
-		} else {
-			if lastSpace {
-				start = i
-				lastSpace = false
-			}
-			if quote == '\000' && !backslash && (c == '"' || c == '\'') {
-				quote = c
-				backslash = false
-			} else if !backslash && quote == c {
-				quote = '\000'
-			} else if (quote == '\000' || quote == '"') && !backslash && c == '\\' {
-				backslash = true
-			} else {
-				backslash = false
-			}
-		}
-	}
-	if !lastSpace {
-		flags = append(flags, GOGCCFLAGS[start:])
-	}
-
-	cmd := exec.Command(CC, flags...)
-	cmd.Args = append(cmd.Args, args...)
-	return cmd, nil
-}
-
-type version struct {
-	name         string
-	major, minor int
-}
-
-var compiler struct {
-	sync.Once
-	version
-	err error
-}
-
-// compilerVersion detects the version of $(go env CC).
-//
-// It returns a non-nil error if the compiler matches a known version schema but
-// the version could not be parsed, or if $(go env CC) could not be determined.
-func compilerVersion() (version, error) {
-	compiler.Once.Do(func() {
-		compiler.err = func() error {
-			compiler.name = "unknown"
-
-			cmd, err := cc("--version")
-			if err != nil {
-				return err
-			}
-			out, err := cmd.Output()
-			if err != nil {
-				// Compiler does not support "--version" flag: not Clang or GCC.
-				return nil
-			}
-
-			var match [][]byte
-			if bytes.HasPrefix(out, []byte("gcc")) {
-				compiler.name = "gcc"
-				cmd, err := cc("-dumpfullversion", "-dumpversion")
-				if err != nil {
-					return err
-				}
-				out, err := cmd.Output()
-				if err != nil {
-					// gcc, but does not support gcc's "-v" flag?!
-					return err
-				}
-				gccRE := regexp.MustCompile(`(\d+)\.(\d+)`)
-				match = gccRE.FindSubmatch(out)
-			} else {
-				clangRE := regexp.MustCompile(`clang version (\d+)\.(\d+)`)
-				if match = clangRE.FindSubmatch(out); len(match) > 0 {
-					compiler.name = "clang"
-				}
-			}
-
-			if len(match) < 3 {
-				return nil // "unknown"
-			}
-			if compiler.major, err = strconv.Atoi(string(match[1])); err != nil {
-				return err
-			}
-			if compiler.minor, err = strconv.Atoi(string(match[2])); err != nil {
-				return err
-			}
-			return nil
-		}()
-	})
-	return compiler.version, compiler.err
-}
-
-// compilerSupportsLocation reports whether the compiler should be
-// able to provide file/line information in backtraces.
-func compilerSupportsLocation() bool {
-	compiler, err := compilerVersion()
-	if err != nil {
-		return false
-	}
-	switch compiler.name {
-	case "gcc":
-		return compiler.major >= 10
-	case "clang":
-		return true
-	default:
-		return false
-	}
-}
-
-// compilerRequiredTsanVersion reports whether the compiler is the version required by Tsan.
-// Only restrictions for ppc64le are known; otherwise return true.
-func compilerRequiredTsanVersion(goos, goarch string) bool {
-	compiler, err := compilerVersion()
-	if err != nil {
-		return false
-	}
-	if compiler.name == "gcc" && goarch == "ppc64le" {
-		return compiler.major >= 9
-	}
-	return true
-}
-
-// compilerRequiredAsanVersion reports whether the compiler is the version required by Asan.
-func compilerRequiredAsanVersion(goos, goarch string) bool {
-	compiler, err := compilerVersion()
-	if err != nil {
-		return false
-	}
-	switch compiler.name {
-	case "gcc":
-		if goarch == "ppc64le" {
-			return compiler.major >= 9
-		}
-		return compiler.major >= 7
-	case "clang":
-		return compiler.major >= 9
-	default:
-		return false
-	}
-}
-
-type compilerCheck struct {
-	once sync.Once
-	err  error
-	skip bool // If true, skip with err instead of failing with it.
-}
-
-type config struct {
-	sanitizer string
-
-	cFlags, ldFlags, goFlags []string
-
-	sanitizerCheck, runtimeCheck compilerCheck
-}
-
-var configs struct {
-	sync.Mutex
-	m map[string]*config
-}
-
-// configure returns the configuration for the given sanitizer.
-func configure(sanitizer string) *config {
-	configs.Lock()
-	defer configs.Unlock()
-	if c, ok := configs.m[sanitizer]; ok {
-		return c
-	}
-
-	c := &config{
-		sanitizer: sanitizer,
-		cFlags:    []string{"-fsanitize=" + sanitizer},
-		ldFlags:   []string{"-fsanitize=" + sanitizer},
-	}
-
-	if testing.Verbose() {
-		c.goFlags = append(c.goFlags, "-x")
-	}
-
-	switch sanitizer {
-	case "memory":
-		c.goFlags = append(c.goFlags, "-msan")
-
-	case "thread":
-		c.goFlags = append(c.goFlags, "--installsuffix=tsan")
-		compiler, _ := compilerVersion()
-		if compiler.name == "gcc" {
-			c.cFlags = append(c.cFlags, "-fPIC")
-			c.ldFlags = append(c.ldFlags, "-fPIC", "-static-libtsan")
-		}
-
-	case "address":
-		c.goFlags = append(c.goFlags, "-asan")
-		// Set the debug mode to print the C stack trace.
-		c.cFlags = append(c.cFlags, "-g")
-
-	case "fuzzer":
-		c.goFlags = append(c.goFlags, "-tags=libfuzzer", "-gcflags=-d=libfuzzer")
-
-	default:
-		panic(fmt.Sprintf("unrecognized sanitizer: %q", sanitizer))
-	}
-
-	if configs.m == nil {
-		configs.m = make(map[string]*config)
-	}
-	configs.m[sanitizer] = c
-	return c
-}
-
-// goCmd returns a Cmd that executes "go $subcommand $args" with appropriate
-// additional flags and environment.
-func (c *config) goCmd(subcommand string, args ...string) *exec.Cmd {
-	return c.goCmdWithExperiments(subcommand, args, nil)
-}
-
-// goCmdWithExperiments returns a Cmd that executes
-// "GOEXPERIMENT=$experiments go $subcommand $args" with appropriate
-// additional flags and CGO-related environment variables.
-func (c *config) goCmdWithExperiments(subcommand string, args []string, experiments []string) *exec.Cmd {
-	cmd := exec.Command("go", subcommand)
-	cmd.Args = append(cmd.Args, c.goFlags...)
-	cmd.Args = append(cmd.Args, args...)
-	replaceEnv(cmd, "CGO_CFLAGS", strings.Join(c.cFlags, " "))
-	replaceEnv(cmd, "CGO_LDFLAGS", strings.Join(c.ldFlags, " "))
-	appendExperimentEnv(cmd, experiments)
-	return cmd
-}
-
-// skipIfCSanitizerBroken skips t if the C compiler does not produce working
-// binaries as configured.
-func (c *config) skipIfCSanitizerBroken(t *testing.T) {
-	check := &c.sanitizerCheck
-	check.once.Do(func() {
-		check.skip, check.err = c.checkCSanitizer()
-	})
-	if check.err != nil {
-		t.Helper()
-		if check.skip {
-			t.Skip(check.err)
-		}
-		t.Fatal(check.err)
-	}
-}
-
-var cMain = []byte(`
-int main() {
-	return 0;
-}
-`)
-
-var cLibFuzzerInput = []byte(`
-#include <stddef.h>
-int LLVMFuzzerTestOneInput(char *data, size_t size) {
-	return 0;
-}
-`)
-
-func (c *config) checkCSanitizer() (skip bool, err error) {
-	dir, err := os.MkdirTemp("", c.sanitizer)
-	if err != nil {
-		return false, fmt.Errorf("failed to create temp directory: %v", err)
-	}
-	defer os.RemoveAll(dir)
-
-	src := filepath.Join(dir, "return0.c")
-	cInput := cMain
-	if c.sanitizer == "fuzzer" {
-		// libFuzzer generates the main function itself, and uses a different input.
-		cInput = cLibFuzzerInput
-	}
-	if err := os.WriteFile(src, cInput, 0600); err != nil {
-		return false, fmt.Errorf("failed to write C source file: %v", err)
-	}
-
-	dst := filepath.Join(dir, "return0")
-	cmd, err := cc(c.cFlags...)
-	if err != nil {
-		return false, err
-	}
-	cmd.Args = append(cmd.Args, c.ldFlags...)
-	cmd.Args = append(cmd.Args, "-o", dst, src)
-	out, err := cmd.CombinedOutput()
-	if err != nil {
-		if bytes.Contains(out, []byte("-fsanitize")) &&
-			(bytes.Contains(out, []byte("unrecognized")) ||
-				bytes.Contains(out, []byte("unsupported"))) {
-			return true, errors.New(string(out))
-		}
-		return true, fmt.Errorf("%#q failed: %v\n%s", strings.Join(cmd.Args, " "), err, out)
-	}
-
-	if c.sanitizer == "fuzzer" {
-		// For fuzzer, don't try running the test binary. It never finishes.
-		return false, nil
-	}
-
-	if out, err := exec.Command(dst).CombinedOutput(); err != nil {
-		if os.IsNotExist(err) {
-			return true, fmt.Errorf("%#q failed to produce executable: %v", strings.Join(cmd.Args, " "), err)
-		}
-		snippet, _, _ := bytes.Cut(out, []byte("\n"))
-		return true, fmt.Errorf("%#q generated broken executable: %v\n%s", strings.Join(cmd.Args, " "), err, snippet)
-	}
-
-	return false, nil
-}
-
-// skipIfRuntimeIncompatible skips t if the Go runtime is suspected not to work
-// with cgo as configured.
-func (c *config) skipIfRuntimeIncompatible(t *testing.T) {
-	check := &c.runtimeCheck
-	check.once.Do(func() {
-		check.skip, check.err = c.checkRuntime()
-	})
-	if check.err != nil {
-		t.Helper()
-		if check.skip {
-			t.Skip(check.err)
-		}
-		t.Fatal(check.err)
-	}
-}
-
-func (c *config) checkRuntime() (skip bool, err error) {
-	if c.sanitizer != "thread" {
-		return false, nil
-	}
-
-	// libcgo.h sets CGO_TSAN if it detects TSAN support in the C compiler.
-	// Dump the preprocessor defines to check that works.
-	// (Sometimes it doesn't: see https://golang.org/issue/15983.)
-	cmd, err := cc(c.cFlags...)
-	if err != nil {
-		return false, err
-	}
-	cmd.Args = append(cmd.Args, "-dM", "-E", "../../../src/runtime/cgo/libcgo.h")
-	cmdStr := strings.Join(cmd.Args, " ")
-	out, err := cmd.CombinedOutput()
-	if err != nil {
-		return false, fmt.Errorf("%#q exited with %v\n%s", cmdStr, err, out)
-	}
-	if !bytes.Contains(out, []byte("#define CGO_TSAN")) {
-		return true, fmt.Errorf("%#q did not define CGO_TSAN", cmdStr)
-	}
-	return false, nil
-}
-
-// srcPath returns the path to the given file relative to this test's source tree.
-func srcPath(path string) string {
-	return filepath.Join("testdata", path)
-}
-
-// A tempDir manages a temporary directory within a test.
-type tempDir struct {
-	base string
-}
-
-func (d *tempDir) RemoveAll(t *testing.T) {
-	t.Helper()
-	if d.base == "" {
-		return
-	}
-	if err := os.RemoveAll(d.base); err != nil {
-		t.Fatalf("Failed to remove temp dir: %v", err)
-	}
-}
-
-func (d *tempDir) Base() string {
-	return d.base
-}
-
-func (d *tempDir) Join(name string) string {
-	return filepath.Join(d.base, name)
-}
-
-func newTempDir(t *testing.T) *tempDir {
-	t.Helper()
-	dir, err := os.MkdirTemp("", filepath.Dir(t.Name()))
-	if err != nil {
-		t.Fatalf("Failed to create temp dir: %v", err)
-	}
-	return &tempDir{base: dir}
-}
-
-// hangProneCmd returns an exec.Cmd for a command that is likely to hang.
-//
-// If one of these tests hangs, the caller is likely to kill the test process
-// using SIGINT, which will be sent to all of the processes in the test's group.
-// Unfortunately, TSAN in particular is prone to dropping signals, so the SIGINT
-// may terminate the test binary but leave the subprocess running. hangProneCmd
-// configures subprocess to receive SIGKILL instead to ensure that it won't
-// leak.
-func hangProneCmd(name string, arg ...string) *exec.Cmd {
-	cmd := exec.Command(name, arg...)
-	cmd.SysProcAttr = &syscall.SysProcAttr{
-		Pdeathsig: syscall.SIGKILL,
-	}
-	return cmd
-}
-
-// mSanSupported is a copy of the function cmd/internal/sys.MSanSupported,
-// because the internal package can't be used here.
-func mSanSupported(goos, goarch string) bool {
-	switch goos {
-	case "linux":
-		return goarch == "amd64" || goarch == "arm64"
-	case "freebsd":
-		return goarch == "amd64"
-	default:
-		return false
-	}
-}
-
-// aSanSupported is a copy of the function cmd/internal/sys.ASanSupported,
-// because the internal package can't be used here.
-func aSanSupported(goos, goarch string) bool {
-	switch goos {
-	case "linux":
-		return goarch == "amd64" || goarch == "arm64" || goarch == "riscv64" || goarch == "ppc64le"
-	default:
-		return false
-	}
-}
diff --git a/misc/cgo/testsanitizers/cshared_test.go b/misc/cgo/testsanitizers/cshared_test.go
deleted file mode 100644
index 21b13ce..0000000
--- a/misc/cgo/testsanitizers/cshared_test.go
+++ /dev/null
@@ -1,90 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package sanitizers_test
-
-import (
-	"fmt"
-	"os"
-	"strings"
-	"testing"
-)
-
-func TestShared(t *testing.T) {
-	t.Parallel()
-	requireOvercommit(t)
-
-	GOOS, err := goEnv("GOOS")
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	GOARCH, err := goEnv("GOARCH")
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	libExt := "so"
-	if GOOS == "darwin" {
-		libExt = "dylib"
-	}
-
-	cases := []struct {
-		src       string
-		sanitizer string
-	}{
-		{
-			src:       "msan_shared.go",
-			sanitizer: "memory",
-		},
-		{
-			src:       "tsan_shared.go",
-			sanitizer: "thread",
-		},
-	}
-
-	for _, tc := range cases {
-		tc := tc
-		name := strings.TrimSuffix(tc.src, ".go")
-		//The memory sanitizer tests require support for the -msan option.
-		if tc.sanitizer == "memory" && !mSanSupported(GOOS, GOARCH) {
-			t.Logf("skipping %s test on %s/%s; -msan option is not supported.", name, GOOS, GOARCH)
-			continue
-		}
-		if tc.sanitizer == "thread" && !compilerRequiredTsanVersion(GOOS, GOARCH) {
-			t.Logf("skipping %s test on %s/%s; compiler version too old for -tsan.", name, GOOS, GOARCH)
-			continue
-		}
-
-		t.Run(name, func(t *testing.T) {
-			t.Parallel()
-			config := configure(tc.sanitizer)
-			config.skipIfCSanitizerBroken(t)
-
-			dir := newTempDir(t)
-			defer dir.RemoveAll(t)
-
-			lib := dir.Join(fmt.Sprintf("lib%s.%s", name, libExt))
-			mustRun(t, config.goCmd("build", "-buildmode=c-shared", "-o", lib, srcPath(tc.src)))
-
-			cSrc := dir.Join("main.c")
-			if err := os.WriteFile(cSrc, cMain, 0600); err != nil {
-				t.Fatalf("failed to write C source file: %v", err)
-			}
-
-			dstBin := dir.Join(name)
-			cmd, err := cc(config.cFlags...)
-			if err != nil {
-				t.Fatal(err)
-			}
-			cmd.Args = append(cmd.Args, config.ldFlags...)
-			cmd.Args = append(cmd.Args, "-o", dstBin, cSrc, lib)
-			mustRun(t, cmd)
-
-			cmd = hangProneCmd(dstBin)
-			replaceEnv(cmd, "LD_LIBRARY_PATH", ".")
-			mustRun(t, cmd)
-		})
-	}
-}
diff --git a/misc/cgo/testsanitizers/libfuzzer_test.go b/misc/cgo/testsanitizers/libfuzzer_test.go
deleted file mode 100644
index 345751b..0000000
--- a/misc/cgo/testsanitizers/libfuzzer_test.go
+++ /dev/null
@@ -1,91 +0,0 @@
-// Copyright 2022 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package sanitizers_test
-
-import (
-	"strings"
-	"testing"
-)
-
-func TestLibFuzzer(t *testing.T) {
-	goos, err := goEnv("GOOS")
-	if err != nil {
-		t.Fatal(err)
-	}
-	goarch, err := goEnv("GOARCH")
-	if err != nil {
-		t.Fatal(err)
-	}
-	if !libFuzzerSupported(goos, goarch) {
-		t.Skipf("skipping on %s/%s; libfuzzer option is not supported.", goos, goarch)
-	}
-	config := configure("fuzzer")
-	config.skipIfCSanitizerBroken(t)
-
-	cases := []struct {
-		goSrc         string
-		cSrc          string
-		expectedError string
-	}{
-		{goSrc: "libfuzzer1.go", expectedError: "panic: found it"},
-		{goSrc: "libfuzzer2.go", cSrc: "libfuzzer2.c", expectedError: "panic: found it"},
-	}
-	for _, tc := range cases {
-		tc := tc
-		name := strings.TrimSuffix(tc.goSrc, ".go")
-		t.Run(name, func(t *testing.T) {
-			t.Parallel()
-
-			dir := newTempDir(t)
-			defer dir.RemoveAll(t)
-
-			// build Go code in libfuzzer mode to a c-archive
-			outPath := dir.Join(name)
-			archivePath := dir.Join(name + ".a")
-			mustRun(t, config.goCmd("build", "-buildmode=c-archive", "-o", archivePath, srcPath(tc.goSrc)))
-
-			// build C code (if any) and link with Go code
-			cmd, err := cc(config.cFlags...)
-			if err != nil {
-				t.Fatalf("error running cc: %v", err)
-			}
-			cmd.Args = append(cmd.Args, config.ldFlags...)
-			cmd.Args = append(cmd.Args, "-o", outPath, "-I", dir.Base())
-			if tc.cSrc != "" {
-				cmd.Args = append(cmd.Args, srcPath(tc.cSrc))
-			}
-			cmd.Args = append(cmd.Args, archivePath)
-			mustRun(t, cmd)
-
-			cmd = hangProneCmd(outPath)
-			cmd.Dir = dir.Base()
-			outb, err := cmd.CombinedOutput()
-			out := string(outb)
-			if err == nil {
-				t.Fatalf("fuzzing succeeded unexpectedly; output:\n%s", out)
-			}
-			if !strings.Contains(out, tc.expectedError) {
-				t.Errorf("exited without expected error %q; got\n%s", tc.expectedError, out)
-			}
-		})
-	}
-}
-
-// libFuzzerSupported is a copy of the function internal/platform.FuzzInstrumented,
-// because the internal package can't be used here.
-func libFuzzerSupported(goos, goarch string) bool {
-	switch goarch {
-	case "amd64", "arm64":
-		// TODO(#14565): support more architectures.
-		switch goos {
-		case "darwin", "freebsd", "linux", "windows":
-			return true
-		default:
-			return false
-		}
-	default:
-		return false
-	}
-}
diff --git a/misc/cgo/testsanitizers/msan_test.go b/misc/cgo/testsanitizers/msan_test.go
deleted file mode 100644
index 96397e0..0000000
--- a/misc/cgo/testsanitizers/msan_test.go
+++ /dev/null
@@ -1,81 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package sanitizers_test
-
-import (
-	"strings"
-	"testing"
-)
-
-func TestMSAN(t *testing.T) {
-	goos, err := goEnv("GOOS")
-	if err != nil {
-		t.Fatal(err)
-	}
-	goarch, err := goEnv("GOARCH")
-	if err != nil {
-		t.Fatal(err)
-	}
-	// The msan tests require support for the -msan option.
-	if !mSanSupported(goos, goarch) {
-		t.Skipf("skipping on %s/%s; -msan option is not supported.", goos, goarch)
-	}
-
-	t.Parallel()
-	// Overcommit is enabled by default on FreeBSD (vm.overcommit=0, see tuning(7)).
-	// Do not skip tests with stricter overcommit settings unless testing shows that FreeBSD has similar issues.
-	if goos == "linux" {
-		requireOvercommit(t)
-	}
-	config := configure("memory")
-	config.skipIfCSanitizerBroken(t)
-
-	mustRun(t, config.goCmd("build", "std"))
-
-	cases := []struct {
-		src         string
-		wantErr     bool
-		experiments []string
-	}{
-		{src: "msan.go"},
-		{src: "msan2.go"},
-		{src: "msan2_cmsan.go"},
-		{src: "msan3.go"},
-		{src: "msan4.go"},
-		{src: "msan5.go"},
-		{src: "msan6.go"},
-		{src: "msan7.go"},
-		{src: "msan8.go"},
-		{src: "msan_fail.go", wantErr: true},
-		// This may not always fail specifically due to MSAN. It may sometimes
-		// fail because of a fault. However, we don't care what kind of error we
-		// get here, just that we get an error. This is an MSAN test because without
-		// MSAN it would not fail deterministically.
-		{src: "arena_fail.go", wantErr: true, experiments: []string{"arenas"}},
-	}
-	for _, tc := range cases {
-		tc := tc
-		name := strings.TrimSuffix(tc.src, ".go")
-		t.Run(name, func(t *testing.T) {
-			t.Parallel()
-
-			dir := newTempDir(t)
-			defer dir.RemoveAll(t)
-
-			outPath := dir.Join(name)
-			mustRun(t, config.goCmdWithExperiments("build", []string{"-o", outPath, srcPath(tc.src)}, tc.experiments))
-
-			cmd := hangProneCmd(outPath)
-			if tc.wantErr {
-				out, err := cmd.CombinedOutput()
-				if err != nil {
-					return
-				}
-				t.Fatalf("%#q exited without error; want MSAN failure\n%s", strings.Join(cmd.Args, " "), out)
-			}
-			mustRun(t, cmd)
-		})
-	}
-}
diff --git a/misc/cgo/testsanitizers/testdata/asan_linkerx/main.go b/misc/cgo/testsanitizers/testdata/asan_linkerx/main.go
deleted file mode 100644
index bbd6127..0000000
--- a/misc/cgo/testsanitizers/testdata/asan_linkerx/main.go
+++ /dev/null
@@ -1,28 +0,0 @@
-package main
-
-import "misc/cgo/testsanitizers/testdata/asan_linkerx/p"
-
-func pstring(s *string) {
-	println(*s)
-}
-
-func main() {
-	all := []*string{
-		&S1, &S2, &S3, &S4, &S5, &S6, &S7, &S8, &S9, &S10,
-		&p.S1, &p.S2, &p.S3, &p.S4, &p.S5, &p.S6, &p.S7, &p.S8, &p.S9, &p.S10,
-	}
-	for _, ps := range all {
-		pstring(ps)
-	}
-}
-
-var S1 string
-var S2 string
-var S3 string
-var S4 string
-var S5 string
-var S6 string
-var S7 string
-var S8 string
-var S9 string
-var S10 string
diff --git a/misc/cgo/testsanitizers/testdata/msan.go b/misc/cgo/testsanitizers/testdata/msan.go
deleted file mode 100644
index 7915fa8..0000000
--- a/misc/cgo/testsanitizers/testdata/msan.go
+++ /dev/null
@@ -1,35 +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
-
-/*
-#include <stdint.h>
-
-void f(int32_t *p, int n) {
-  int i;
-
-  for (i = 0; i < n; i++) {
-    p[i] = (int32_t)i;
-  }
-}
-*/
-import "C"
-
-import (
-	"fmt"
-	"os"
-	"unsafe"
-)
-
-func main() {
-	a := make([]int32, 10)
-	C.f((*C.int32_t)(unsafe.Pointer(&a[0])), C.int(len(a)))
-	for i, v := range a {
-		if i != int(v) {
-			fmt.Println("bad %d: %v\n", i, a)
-			os.Exit(1)
-		}
-	}
-}
diff --git a/misc/cgo/testsanitizers/testdata/msan6.go b/misc/cgo/testsanitizers/testdata/msan6.go
deleted file mode 100644
index 003989c..0000000
--- a/misc/cgo/testsanitizers/testdata/msan6.go
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright 2018 The Go Authors. 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
-
-// A C function returning a value on the Go stack could leave the Go
-// stack marked as uninitialized, potentially causing a later error
-// when the stack is used for something else. Issue 26209.
-
-/*
-#cgo LDFLAGS: -fsanitize=memory
-#cgo CPPFLAGS: -fsanitize=memory
-
-#include <stdint.h>
-#include <stdlib.h>
-#include <string.h>
-
-typedef struct {
-	uintptr_t a[20];
-} S;
-
-S f() {
-	S *p;
-
-	p = (S *)(malloc(sizeof(S)));
-	p->a[0] = 0;
-	return *p;
-}
-*/
-import "C"
-
-// allocateStack extends the stack so that stack copying doesn't
-// confuse the msan data structures.
-//go:noinline
-func allocateStack(i int) int {
-	if i == 0 {
-		return i
-	}
-	return allocateStack(i - 1)
-}
-
-// F1 marks a chunk of stack as uninitialized.
-// C.f returns an uninitialized struct on the stack, so msan will mark
-// the stack as uninitialized.
-//go:noinline
-func F1() uintptr {
-	s := C.f()
-	return uintptr(s.a[0])
-}
-
-// F2 allocates a struct on the stack and converts it to an empty interface,
-// which will call msanread and see that the data appears uninitialized.
-//go:noinline
-func F2() interface{} {
-	return C.S{}
-}
-
-func poisonStack(i int) int {
-	if i == 0 {
-		return int(F1())
-	}
-	F1()
-	r := poisonStack(i - 1)
-	F2()
-	return r
-}
-
-func main() {
-	allocateStack(16384)
-	poisonStack(128)
-}
diff --git a/misc/cgo/testsanitizers/tsan_test.go b/misc/cgo/testsanitizers/tsan_test.go
deleted file mode 100644
index 00ad313..0000000
--- a/misc/cgo/testsanitizers/tsan_test.go
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package sanitizers_test
-
-import (
-	"strings"
-	"testing"
-)
-
-func TestTSAN(t *testing.T) {
-	goos, err := goEnv("GOOS")
-	if err != nil {
-		t.Fatal(err)
-	}
-	goarch, err := goEnv("GOARCH")
-	if err != nil {
-		t.Fatal(err)
-	}
-	// The msan tests require support for the -msan option.
-	if !compilerRequiredTsanVersion(goos, goarch) {
-		t.Skipf("skipping on %s/%s; compiler version for -tsan option is too old.", goos, goarch)
-	}
-
-	t.Parallel()
-	requireOvercommit(t)
-	config := configure("thread")
-	config.skipIfCSanitizerBroken(t)
-
-	mustRun(t, config.goCmd("build", "std"))
-
-	cases := []struct {
-		src          string
-		needsRuntime bool
-	}{
-		{src: "tsan.go"},
-		{src: "tsan2.go"},
-		{src: "tsan3.go"},
-		{src: "tsan4.go"},
-		{src: "tsan5.go", needsRuntime: true},
-		{src: "tsan6.go", needsRuntime: true},
-		{src: "tsan7.go", needsRuntime: true},
-		{src: "tsan8.go"},
-		{src: "tsan9.go"},
-		{src: "tsan10.go", needsRuntime: true},
-		{src: "tsan11.go", needsRuntime: true},
-		{src: "tsan12.go", needsRuntime: true},
-	}
-	for _, tc := range cases {
-		tc := tc
-		name := strings.TrimSuffix(tc.src, ".go")
-		t.Run(name, func(t *testing.T) {
-			t.Parallel()
-
-			dir := newTempDir(t)
-			defer dir.RemoveAll(t)
-
-			outPath := dir.Join(name)
-			mustRun(t, config.goCmd("build", "-o", outPath, srcPath(tc.src)))
-
-			cmd := hangProneCmd(outPath)
-			if tc.needsRuntime {
-				config.skipIfRuntimeIncompatible(t)
-			}
-			mustRun(t, cmd)
-		})
-	}
-}
diff --git a/misc/cgo/testshared/overlaydir_test.go b/misc/cgo/testshared/overlaydir_test.go
deleted file mode 100644
index eb587a2..0000000
--- a/misc/cgo/testshared/overlaydir_test.go
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright 2019 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package shared_test
-
-import (
-	"io"
-	"os"
-	"path/filepath"
-	"strings"
-)
-
-// overlayDir makes a minimal-overhead copy of srcRoot in which new files may be added.
-//
-// TODO: Once we no longer need to support the misc module in GOPATH mode,
-// factor this function out into a package to reduce duplication.
-func overlayDir(dstRoot, srcRoot string) error {
-	dstRoot = filepath.Clean(dstRoot)
-	if err := os.MkdirAll(dstRoot, 0777); err != nil {
-		return err
-	}
-
-	srcRoot, err := filepath.Abs(srcRoot)
-	if err != nil {
-		return err
-	}
-
-	return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error {
-		if err != nil || srcPath == srcRoot {
-			return err
-		}
-
-		suffix := strings.TrimPrefix(srcPath, srcRoot)
-		for len(suffix) > 0 && suffix[0] == filepath.Separator {
-			suffix = suffix[1:]
-		}
-		dstPath := filepath.Join(dstRoot, suffix)
-
-		perm := info.Mode() & os.ModePerm
-		if info.Mode()&os.ModeSymlink != 0 {
-			info, err = os.Stat(srcPath)
-			if err != nil {
-				return err
-			}
-			perm = info.Mode() & os.ModePerm
-		}
-
-		// Always copy directories (don't symlink them).
-		// If we add a file in the overlay, we don't want to add it in the original.
-		if info.IsDir() {
-			return os.MkdirAll(dstPath, perm|0200)
-		}
-
-		// If the OS supports symlinks, use them instead of copying bytes.
-		if err := os.Symlink(srcPath, dstPath); err == nil {
-			return nil
-		}
-
-		// Otherwise, copy the bytes.
-		src, err := os.Open(srcPath)
-		if err != nil {
-			return err
-		}
-		defer src.Close()
-
-		dst, err := os.OpenFile(dstPath, os.O_WRONLY|os.O_CREATE|os.O_EXCL, perm)
-		if err != nil {
-			return err
-		}
-
-		_, err = io.Copy(dst, src)
-		if closeErr := dst.Close(); err == nil {
-			err = closeErr
-		}
-		return err
-	})
-}
diff --git a/misc/cgo/testshared/shared_test.go b/misc/cgo/testshared/shared_test.go
deleted file mode 100644
index b14fb1c..0000000
--- a/misc/cgo/testshared/shared_test.go
+++ /dev/null
@@ -1,1119 +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 shared_test
-
-import (
-	"bufio"
-	"bytes"
-	"debug/elf"
-	"encoding/binary"
-	"flag"
-	"fmt"
-	"go/build"
-	"io"
-	"log"
-	"os"
-	"os/exec"
-	"path/filepath"
-	"regexp"
-	"runtime"
-	"sort"
-	"strconv"
-	"strings"
-	"testing"
-	"time"
-)
-
-var gopathInstallDir, gorootInstallDir string
-var oldGOROOT string
-
-// This is the smallest set of packages we can link into a shared
-// library (runtime/cgo is built implicitly).
-var minpkgs = []string{"runtime", "sync/atomic"}
-var soname = "libruntime,sync-atomic.so"
-
-var testX = flag.Bool("testx", false, "if true, pass -x to 'go' subcommands invoked by the test")
-var testWork = flag.Bool("testwork", false, "if true, log and do not delete the temporary working directory")
-
-// run runs a command and calls t.Errorf if it fails.
-func run(t *testing.T, msg string, args ...string) {
-	runWithEnv(t, msg, nil, args...)
-}
-
-// runWithEnv runs a command under the given environment and calls t.Errorf if it fails.
-func runWithEnv(t *testing.T, msg string, env []string, args ...string) {
-	c := exec.Command(args[0], args[1:]...)
-	if len(env) != 0 {
-		c.Env = append(os.Environ(), env...)
-	}
-	if output, err := c.CombinedOutput(); err != nil {
-		t.Errorf("executing %s (%s) failed %s:\n%s", strings.Join(args, " "), msg, err, output)
-	}
-}
-
-// goCmd invokes the go tool with the installsuffix set up by TestMain. It calls
-// t.Fatalf if the command fails.
-func goCmd(t *testing.T, args ...string) string {
-	newargs := []string{args[0]}
-	if *testX && args[0] != "env" {
-		newargs = append(newargs, "-x", "-ldflags=-v")
-	}
-	newargs = append(newargs, args[1:]...)
-	c := exec.Command(filepath.Join(oldGOROOT, "bin", "go"), newargs...)
-	stderr := new(strings.Builder)
-	c.Stderr = stderr
-
-	if testing.Verbose() && t == nil {
-		fmt.Fprintf(os.Stderr, "+ go %s\n", strings.Join(args, " "))
-		c.Stderr = os.Stderr
-	}
-	output, err := c.Output()
-
-	if err != nil {
-		if t != nil {
-			t.Helper()
-			t.Fatalf("executing %s failed %v:\n%s", strings.Join(c.Args, " "), err, stderr)
-		} else {
-			// Panic instead of using log.Fatalf so that deferred cleanup may run in testMain.
-			log.Panicf("executing %s failed %v:\n%s", strings.Join(c.Args, " "), err, stderr)
-		}
-	}
-	if testing.Verbose() && t != nil {
-		t.Logf("go %s", strings.Join(args, " "))
-		if stderr.Len() > 0 {
-			t.Logf("%s", stderr)
-		}
-	}
-	return string(bytes.TrimSpace(output))
-}
-
-// TestMain calls testMain so that the latter can use defer (TestMain exits with os.Exit).
-func testMain(m *testing.M) (int, error) {
-	cwd, err := os.Getwd()
-	if err != nil {
-		log.Fatal(err)
-	}
-	oldGOROOT = filepath.Join(cwd, "../../..")
-
-	workDir, err := os.MkdirTemp("", "shared_test")
-	if err != nil {
-		return 0, err
-	}
-	if *testWork || testing.Verbose() {
-		fmt.Printf("+ mkdir -p %s\n", workDir)
-	}
-	if !*testWork {
-		defer os.RemoveAll(workDir)
-	}
-
-	// -buildmode=shared fundamentally does not work in module mode.
-	// (It tries to share package dependencies across builds, but in module mode
-	// each module has its own distinct set of dependency versions.)
-	// We would like to eliminate it (see https://go.dev/issue/47788),
-	// but first need to figure out a replacement that covers the small subset
-	// of use-cases where -buildmode=shared still works today.
-	// For now, run the tests in GOPATH mode only.
-	os.Setenv("GO111MODULE", "off")
-
-	// Some tests need to edit the source in GOPATH, so copy this directory to a
-	// temporary directory and chdir to that.
-	gopath := filepath.Join(workDir, "gopath")
-	modRoot, err := cloneTestdataModule(gopath)
-	if err != nil {
-		return 0, err
-	}
-	if testing.Verbose() {
-		fmt.Printf("+ export GOPATH=%s\n", gopath)
-		fmt.Printf("+ cd %s\n", modRoot)
-	}
-	os.Setenv("GOPATH", gopath)
-	// Explicitly override GOBIN as well, in case it was set through a GOENV file.
-	os.Setenv("GOBIN", filepath.Join(gopath, "bin"))
-	os.Chdir(modRoot)
-	os.Setenv("PWD", modRoot)
-
-	// The test also needs to install libraries into GOROOT/pkg, so copy the
-	// subset of GOROOT that we need.
-	//
-	// TODO(golang.org/issue/28553): Rework -buildmode=shared so that it does not
-	// need to write to GOROOT.
-	goroot := filepath.Join(workDir, "goroot")
-	if err := cloneGOROOTDeps(goroot); err != nil {
-		return 0, err
-	}
-	if testing.Verbose() {
-		fmt.Fprintf(os.Stderr, "+ export GOROOT=%s\n", goroot)
-	}
-	os.Setenv("GOROOT", goroot)
-
-	myContext := build.Default
-	myContext.GOROOT = goroot
-	myContext.GOPATH = gopath
-
-	// All tests depend on runtime being built into a shared library. Because
-	// that takes a few seconds, do it here and have all tests use the version
-	// built here.
-	goCmd(nil, append([]string{"install", "-buildmode=shared"}, minpkgs...)...)
-
-	shlib := goCmd(nil, "list", "-linkshared", "-f={{.Shlib}}", "runtime")
-	if shlib != "" {
-		gorootInstallDir = filepath.Dir(shlib)
-	}
-
-	myContext.InstallSuffix = "_dynlink"
-	depP, err := myContext.Import("./depBase", ".", build.ImportComment)
-	if err != nil {
-		return 0, fmt.Errorf("import failed: %v", err)
-	}
-	if depP.PkgTargetRoot == "" {
-		gopathInstallDir = filepath.Dir(goCmd(nil, "list", "-buildmode=shared", "-f", "{{.Target}}", "./depBase"))
-	} else {
-		gopathInstallDir = filepath.Join(depP.PkgTargetRoot, "testshared")
-	}
-	return m.Run(), nil
-}
-
-func TestMain(m *testing.M) {
-	log.SetFlags(log.Lshortfile)
-	flag.Parse()
-
-	exitCode, err := testMain(m)
-	if err != nil {
-		log.Fatal(err)
-	}
-	os.Exit(exitCode)
-}
-
-// cloneTestdataModule clones the packages from src/testshared into gopath.
-// It returns the directory within gopath at which the module root is located.
-func cloneTestdataModule(gopath string) (string, error) {
-	modRoot := filepath.Join(gopath, "src", "testshared")
-	if err := overlayDir(modRoot, "testdata"); err != nil {
-		return "", err
-	}
-	if err := os.WriteFile(filepath.Join(modRoot, "go.mod"), []byte("module testshared\n"), 0644); err != nil {
-		return "", err
-	}
-	return modRoot, nil
-}
-
-// cloneGOROOTDeps copies (or symlinks) the portions of GOROOT/src and
-// GOROOT/pkg relevant to this test into the given directory.
-// It must be run from within the testdata module.
-func cloneGOROOTDeps(goroot string) error {
-	// Before we clone GOROOT, figure out which packages we need to copy over.
-	listArgs := []string{
-		"list",
-		"-deps",
-		"-f", "{{if and .Standard (not .ForTest)}}{{.ImportPath}}{{end}}",
-	}
-	stdDeps := goCmd(nil, append(listArgs, minpkgs...)...)
-	testdataDeps := goCmd(nil, append(listArgs, "-test", "./...")...)
-
-	pkgs := append(strings.Split(strings.TrimSpace(stdDeps), "\n"),
-		strings.Split(strings.TrimSpace(testdataDeps), "\n")...)
-	sort.Strings(pkgs)
-	var pkgRoots []string
-	for _, pkg := range pkgs {
-		parentFound := false
-		for _, prev := range pkgRoots {
-			if strings.HasPrefix(pkg, prev) {
-				// We will copy in the source for pkg when we copy in prev.
-				parentFound = true
-				break
-			}
-		}
-		if !parentFound {
-			pkgRoots = append(pkgRoots, pkg)
-		}
-	}
-
-	gorootDirs := []string{
-		"pkg/tool",
-		"pkg/include",
-	}
-	for _, pkg := range pkgRoots {
-		gorootDirs = append(gorootDirs, filepath.Join("src", pkg))
-	}
-
-	for _, dir := range gorootDirs {
-		if testing.Verbose() {
-			fmt.Fprintf(os.Stderr, "+ cp -r %s %s\n", filepath.Join(oldGOROOT, dir), filepath.Join(goroot, dir))
-		}
-		if err := overlayDir(filepath.Join(goroot, dir), filepath.Join(oldGOROOT, dir)); err != nil {
-			return err
-		}
-	}
-
-	return nil
-}
-
-// The shared library was built at the expected location.
-func TestSOBuilt(t *testing.T) {
-	_, err := os.Stat(filepath.Join(gorootInstallDir, soname))
-	if err != nil {
-		t.Error(err)
-	}
-}
-
-func hasDynTag(f *elf.File, tag elf.DynTag) bool {
-	ds := f.SectionByType(elf.SHT_DYNAMIC)
-	if ds == nil {
-		return false
-	}
-	d, err := ds.Data()
-	if err != nil {
-		return false
-	}
-	for len(d) > 0 {
-		var t elf.DynTag
-		switch f.Class {
-		case elf.ELFCLASS32:
-			t = elf.DynTag(f.ByteOrder.Uint32(d[0:4]))
-			d = d[8:]
-		case elf.ELFCLASS64:
-			t = elf.DynTag(f.ByteOrder.Uint64(d[0:8]))
-			d = d[16:]
-		}
-		if t == tag {
-			return true
-		}
-	}
-	return false
-}
-
-// The shared library does not have relocations against the text segment.
-func TestNoTextrel(t *testing.T) {
-	sopath := filepath.Join(gorootInstallDir, soname)
-	f, err := elf.Open(sopath)
-	if err != nil {
-		t.Fatal("elf.Open failed: ", err)
-	}
-	defer f.Close()
-	if hasDynTag(f, elf.DT_TEXTREL) {
-		t.Errorf("%s has DT_TEXTREL set", soname)
-	}
-}
-
-// The shared library does not contain symbols called ".dup"
-// (See golang.org/issue/14841.)
-func TestNoDupSymbols(t *testing.T) {
-	sopath := filepath.Join(gorootInstallDir, soname)
-	f, err := elf.Open(sopath)
-	if err != nil {
-		t.Fatal("elf.Open failed: ", err)
-	}
-	defer f.Close()
-	syms, err := f.Symbols()
-	if err != nil {
-		t.Errorf("error reading symbols %v", err)
-		return
-	}
-	for _, s := range syms {
-		if s.Name == ".dup" {
-			t.Fatalf("%s contains symbol called .dup", sopath)
-		}
-	}
-}
-
-// The install command should have created a "shlibname" file for the
-// listed packages (and runtime/cgo, and math on arm) indicating the
-// name of the shared library containing it.
-func TestShlibnameFiles(t *testing.T) {
-	pkgs := append([]string{}, minpkgs...)
-	pkgs = append(pkgs, "runtime/cgo")
-	if runtime.GOARCH == "arm" {
-		pkgs = append(pkgs, "math")
-	}
-	for _, pkg := range pkgs {
-		shlibnamefile := filepath.Join(gorootInstallDir, pkg+".shlibname")
-		contentsb, err := os.ReadFile(shlibnamefile)
-		if err != nil {
-			t.Errorf("error reading shlibnamefile for %s: %v", pkg, err)
-			continue
-		}
-		contents := strings.TrimSpace(string(contentsb))
-		if contents != soname {
-			t.Errorf("shlibnamefile for %s has wrong contents: %q", pkg, contents)
-		}
-	}
-}
-
-// Is a given offset into the file contained in a loaded segment?
-func isOffsetLoaded(f *elf.File, offset uint64) bool {
-	for _, prog := range f.Progs {
-		if prog.Type == elf.PT_LOAD {
-			if prog.Off <= offset && offset < prog.Off+prog.Filesz {
-				return true
-			}
-		}
-	}
-	return false
-}
-
-func rnd(v int32, r int32) int32 {
-	if r <= 0 {
-		return v
-	}
-	v += r - 1
-	c := v % r
-	if c < 0 {
-		c += r
-	}
-	v -= c
-	return v
-}
-
-func readwithpad(r io.Reader, sz int32) ([]byte, error) {
-	data := make([]byte, rnd(sz, 4))
-	_, err := io.ReadFull(r, data)
-	if err != nil {
-		return nil, err
-	}
-	data = data[:sz]
-	return data, nil
-}
-
-type note struct {
-	name    string
-	tag     int32
-	desc    string
-	section *elf.Section
-}
-
-// Read all notes from f. As ELF section names are not supposed to be special, one
-// looks for a particular note by scanning all SHT_NOTE sections looking for a note
-// with a particular "name" and "tag".
-func readNotes(f *elf.File) ([]*note, error) {
-	var notes []*note
-	for _, sect := range f.Sections {
-		if sect.Type != elf.SHT_NOTE {
-			continue
-		}
-		r := sect.Open()
-		for {
-			var namesize, descsize, tag 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, &tag)
-			if err != nil {
-				return nil, fmt.Errorf("read type failed: %v", err)
-			}
-			name, err := readwithpad(r, namesize)
-			if err != nil {
-				return nil, fmt.Errorf("read name failed: %v", err)
-			}
-			desc, err := readwithpad(r, descsize)
-			if err != nil {
-				return nil, fmt.Errorf("read desc failed: %v", err)
-			}
-			notes = append(notes, &note{name: string(name), tag: tag, desc: string(desc), section: sect})
-		}
-	}
-	return notes, nil
-}
-
-func dynStrings(t *testing.T, path string, flag elf.DynTag) []string {
-	t.Helper()
-	f, err := elf.Open(path)
-	if err != nil {
-		t.Fatalf("elf.Open(%q) failed: %v", path, err)
-	}
-	defer f.Close()
-	dynstrings, err := f.DynString(flag)
-	if err != nil {
-		t.Fatalf("DynString(%s) failed on %s: %v", flag, path, err)
-	}
-	return dynstrings
-}
-
-func AssertIsLinkedToRegexp(t *testing.T, path string, re *regexp.Regexp) {
-	t.Helper()
-	for _, dynstring := range dynStrings(t, path, elf.DT_NEEDED) {
-		if re.MatchString(dynstring) {
-			return
-		}
-	}
-	t.Errorf("%s is not linked to anything matching %v", path, re)
-}
-
-func AssertIsLinkedTo(t *testing.T, path, lib string) {
-	t.Helper()
-	AssertIsLinkedToRegexp(t, path, regexp.MustCompile(regexp.QuoteMeta(lib)))
-}
-
-func AssertHasRPath(t *testing.T, path, dir string) {
-	t.Helper()
-	for _, tag := range []elf.DynTag{elf.DT_RPATH, elf.DT_RUNPATH} {
-		for _, dynstring := range dynStrings(t, path, tag) {
-			for _, rpath := range strings.Split(dynstring, ":") {
-				if filepath.Clean(rpath) == filepath.Clean(dir) {
-					return
-				}
-			}
-		}
-	}
-	t.Errorf("%s does not have rpath %s", path, dir)
-}
-
-// Build a trivial program that links against the shared runtime and check it runs.
-func TestTrivialExecutable(t *testing.T) {
-	goCmd(t, "install", "-linkshared", "./trivial")
-	run(t, "trivial executable", "../../bin/trivial")
-	AssertIsLinkedTo(t, "../../bin/trivial", soname)
-	AssertHasRPath(t, "../../bin/trivial", gorootInstallDir)
-	// It is 19K on linux/amd64, with separate-code in binutils ld and 64k being most common alignment
-	// 4*64k should be enough, but this might need revision eventually.
-	checkSize(t, "../../bin/trivial", 256000)
-}
-
-// Build a trivial program in PIE mode that links against the shared runtime and check it runs.
-func TestTrivialExecutablePIE(t *testing.T) {
-	goCmd(t, "build", "-buildmode=pie", "-o", "trivial.pie", "-linkshared", "./trivial")
-	run(t, "trivial executable", "./trivial.pie")
-	AssertIsLinkedTo(t, "./trivial.pie", soname)
-	AssertHasRPath(t, "./trivial.pie", gorootInstallDir)
-	// It is 19K on linux/amd64, with separate-code in binutils ld and 64k being most common alignment
-	// 4*64k should be enough, but this might need revision eventually.
-	checkSize(t, "./trivial.pie", 256000)
-}
-
-// Check that the file size does not exceed a limit.
-func checkSize(t *testing.T, f string, limit int64) {
-	fi, err := os.Stat(f)
-	if err != nil {
-		t.Fatalf("stat failed: %v", err)
-	}
-	if sz := fi.Size(); sz > limit {
-		t.Errorf("file too large: got %d, want <= %d", sz, limit)
-	}
-}
-
-// Build a division test program and check it runs.
-func TestDivisionExecutable(t *testing.T) {
-	goCmd(t, "install", "-linkshared", "./division")
-	run(t, "division executable", "../../bin/division")
-}
-
-// Build an executable that uses cgo linked against the shared runtime and check it
-// runs.
-func TestCgoExecutable(t *testing.T) {
-	goCmd(t, "install", "-linkshared", "./execgo")
-	run(t, "cgo executable", "../../bin/execgo")
-}
-
-func checkPIE(t *testing.T, name string) {
-	f, err := elf.Open(name)
-	if err != nil {
-		t.Fatal("elf.Open failed: ", err)
-	}
-	defer f.Close()
-	if f.Type != elf.ET_DYN {
-		t.Errorf("%s has type %v, want ET_DYN", name, f.Type)
-	}
-	if hasDynTag(f, elf.DT_TEXTREL) {
-		t.Errorf("%s has DT_TEXTREL set", name)
-	}
-}
-
-func TestTrivialPIE(t *testing.T) {
-	if strings.HasSuffix(os.Getenv("GO_BUILDER_NAME"), "-alpine") {
-		t.Skip("skipping on alpine until issue #54354 resolved")
-	}
-	name := "trivial_pie"
-	goCmd(t, "build", "-buildmode=pie", "-o="+name, "./trivial")
-	defer os.Remove(name)
-	run(t, name, "./"+name)
-	checkPIE(t, name)
-}
-
-func TestCgoPIE(t *testing.T) {
-	name := "cgo_pie"
-	goCmd(t, "build", "-buildmode=pie", "-o="+name, "./execgo")
-	defer os.Remove(name)
-	run(t, name, "./"+name)
-	checkPIE(t, name)
-}
-
-// Build a GOPATH package into a shared library that links against the goroot runtime
-// and an executable that links against both.
-func TestGopathShlib(t *testing.T) {
-	goCmd(t, "install", "-buildmode=shared", "-linkshared", "./depBase")
-	shlib := goCmd(t, "list", "-f", "{{.Shlib}}", "-buildmode=shared", "-linkshared", "./depBase")
-	AssertIsLinkedTo(t, shlib, soname)
-	goCmd(t, "install", "-linkshared", "./exe")
-	AssertIsLinkedTo(t, "../../bin/exe", soname)
-	AssertIsLinkedTo(t, "../../bin/exe", filepath.Base(shlib))
-	AssertHasRPath(t, "../../bin/exe", gorootInstallDir)
-	AssertHasRPath(t, "../../bin/exe", filepath.Dir(gopathInstallDir))
-	// And check it runs.
-	run(t, "executable linked to GOPATH library", "../../bin/exe")
-}
-
-// The shared library contains a note listing the packages it contains in a section
-// that is not mapped into memory.
-func testPkgListNote(t *testing.T, f *elf.File, note *note) {
-	if note.section.Flags != 0 {
-		t.Errorf("package list section has flags %v, want 0", note.section.Flags)
-	}
-	if isOffsetLoaded(f, note.section.Offset) {
-		t.Errorf("package list section contained in PT_LOAD segment")
-	}
-	if note.desc != "testshared/depBase\n" {
-		t.Errorf("incorrect package list %q, want %q", note.desc, "testshared/depBase\n")
-	}
-}
-
-// The shared library contains a note containing the ABI hash that is mapped into
-// memory and there is a local symbol called go.link.abihashbytes that points 16
-// bytes into it.
-func testABIHashNote(t *testing.T, f *elf.File, note *note) {
-	if note.section.Flags != elf.SHF_ALLOC {
-		t.Errorf("abi hash section has flags %v, want SHF_ALLOC", note.section.Flags)
-	}
-	if !isOffsetLoaded(f, note.section.Offset) {
-		t.Errorf("abihash section not contained in PT_LOAD segment")
-	}
-	var hashbytes elf.Symbol
-	symbols, err := f.Symbols()
-	if err != nil {
-		t.Errorf("error reading symbols %v", err)
-		return
-	}
-	for _, sym := range symbols {
-		if sym.Name == "go:link.abihashbytes" {
-			hashbytes = sym
-		}
-	}
-	if hashbytes.Name == "" {
-		t.Errorf("no symbol called go:link.abihashbytes")
-		return
-	}
-	if elf.ST_BIND(hashbytes.Info) != elf.STB_LOCAL {
-		t.Errorf("%s has incorrect binding %v, want STB_LOCAL", hashbytes.Name, elf.ST_BIND(hashbytes.Info))
-	}
-	if f.Sections[hashbytes.Section] != note.section {
-		t.Errorf("%s has incorrect section %v, want %s", hashbytes.Name, f.Sections[hashbytes.Section].Name, note.section.Name)
-	}
-	if hashbytes.Value-note.section.Addr != 16 {
-		t.Errorf("%s has incorrect offset into section %d, want 16", hashbytes.Name, hashbytes.Value-note.section.Addr)
-	}
-}
-
-// A Go shared library contains a note indicating which other Go shared libraries it
-// was linked against in an unmapped section.
-func testDepsNote(t *testing.T, f *elf.File, note *note) {
-	if note.section.Flags != 0 {
-		t.Errorf("package list section has flags %v, want 0", note.section.Flags)
-	}
-	if isOffsetLoaded(f, note.section.Offset) {
-		t.Errorf("package list section contained in PT_LOAD segment")
-	}
-	// libdepBase.so just links against the lib containing the runtime.
-	if note.desc != soname {
-		t.Errorf("incorrect dependency list %q, want %q", note.desc, soname)
-	}
-}
-
-// The shared library contains notes with defined contents; see above.
-func TestNotes(t *testing.T) {
-	goCmd(t, "install", "-buildmode=shared", "-linkshared", "./depBase")
-	shlib := goCmd(t, "list", "-f", "{{.Shlib}}", "-buildmode=shared", "-linkshared", "./depBase")
-	f, err := elf.Open(shlib)
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer f.Close()
-	notes, err := readNotes(f)
-	if err != nil {
-		t.Fatal(err)
-	}
-	pkgListNoteFound := false
-	abiHashNoteFound := false
-	depsNoteFound := false
-	for _, note := range notes {
-		if note.name != "Go\x00\x00" {
-			continue
-		}
-		switch note.tag {
-		case 1: // ELF_NOTE_GOPKGLIST_TAG
-			if pkgListNoteFound {
-				t.Error("multiple package list notes")
-			}
-			testPkgListNote(t, f, note)
-			pkgListNoteFound = true
-		case 2: // ELF_NOTE_GOABIHASH_TAG
-			if abiHashNoteFound {
-				t.Error("multiple abi hash notes")
-			}
-			testABIHashNote(t, f, note)
-			abiHashNoteFound = true
-		case 3: // ELF_NOTE_GODEPS_TAG
-			if depsNoteFound {
-				t.Error("multiple dependency list notes")
-			}
-			testDepsNote(t, f, note)
-			depsNoteFound = true
-		}
-	}
-	if !pkgListNoteFound {
-		t.Error("package list note not found")
-	}
-	if !abiHashNoteFound {
-		t.Error("abi hash note not found")
-	}
-	if !depsNoteFound {
-		t.Error("deps note not found")
-	}
-}
-
-// Build a GOPATH package (depBase) into a shared library that links against the goroot
-// runtime, another package (dep2) that links against the first, and an
-// executable that links against dep2.
-func TestTwoGopathShlibs(t *testing.T) {
-	goCmd(t, "install", "-buildmode=shared", "-linkshared", "./depBase")
-	goCmd(t, "install", "-buildmode=shared", "-linkshared", "./dep2")
-	goCmd(t, "install", "-linkshared", "./exe2")
-	run(t, "executable linked to GOPATH library", "../../bin/exe2")
-}
-
-func TestThreeGopathShlibs(t *testing.T) {
-	goCmd(t, "install", "-buildmode=shared", "-linkshared", "./depBase")
-	goCmd(t, "install", "-buildmode=shared", "-linkshared", "./dep2")
-	goCmd(t, "install", "-buildmode=shared", "-linkshared", "./dep3")
-	goCmd(t, "install", "-linkshared", "./exe3")
-	run(t, "executable linked to GOPATH library", "../../bin/exe3")
-}
-
-// If gccgo is not available or not new enough, call t.Skip.
-func requireGccgo(t *testing.T) {
-	t.Helper()
-
-	gccgoName := os.Getenv("GCCGO")
-	if gccgoName == "" {
-		gccgoName = "gccgo"
-	}
-	gccgoPath, err := exec.LookPath(gccgoName)
-	if err != nil {
-		t.Skip("gccgo not found")
-	}
-	cmd := exec.Command(gccgoPath, "-dumpversion")
-	output, err := cmd.CombinedOutput()
-	if err != nil {
-		t.Fatalf("%s -dumpversion failed: %v\n%s", gccgoPath, err, output)
-	}
-	dot := bytes.Index(output, []byte{'.'})
-	if dot > 0 {
-		output = output[:dot]
-	}
-	major, err := strconv.Atoi(string(output))
-	if err != nil {
-		t.Skipf("can't parse gccgo version number %s", output)
-	}
-	if major < 5 {
-		t.Skipf("gccgo too old (%s)", strings.TrimSpace(string(output)))
-	}
-
-	gomod, err := exec.Command("go", "env", "GOMOD").Output()
-	if err != nil {
-		t.Fatalf("go env GOMOD: %v", err)
-	}
-	if len(bytes.TrimSpace(gomod)) > 0 {
-		t.Skipf("gccgo not supported in module mode; see golang.org/issue/30344")
-	}
-}
-
-// Build a GOPATH package into a shared library with gccgo and an executable that
-// links against it.
-func TestGoPathShlibGccgo(t *testing.T) {
-	requireGccgo(t)
-
-	libgoRE := regexp.MustCompile("libgo.so.[0-9]+")
-
-	goCmd(t, "install", "-compiler=gccgo", "-buildmode=shared", "-linkshared", "./depBase")
-
-	// Run 'go list' after 'go install': with gccgo, we apparently don't know the
-	// shlib location until after we've installed it.
-	shlib := goCmd(t, "list", "-compiler=gccgo", "-buildmode=shared", "-linkshared", "-f", "{{.Shlib}}", "./depBase")
-
-	AssertIsLinkedToRegexp(t, shlib, libgoRE)
-	goCmd(t, "install", "-compiler=gccgo", "-linkshared", "./exe")
-	AssertIsLinkedToRegexp(t, "../../bin/exe", libgoRE)
-	AssertIsLinkedTo(t, "../../bin/exe", filepath.Base(shlib))
-	AssertHasRPath(t, "../../bin/exe", filepath.Dir(shlib))
-	// And check it runs.
-	run(t, "gccgo-built", "../../bin/exe")
-}
-
-// The gccgo version of TestTwoGopathShlibs: build a GOPATH package into a shared
-// library with gccgo, another GOPATH package that depends on the first and an
-// executable that links the second library.
-func TestTwoGopathShlibsGccgo(t *testing.T) {
-	requireGccgo(t)
-
-	libgoRE := regexp.MustCompile("libgo.so.[0-9]+")
-
-	goCmd(t, "install", "-compiler=gccgo", "-buildmode=shared", "-linkshared", "./depBase")
-	goCmd(t, "install", "-compiler=gccgo", "-buildmode=shared", "-linkshared", "./dep2")
-	goCmd(t, "install", "-compiler=gccgo", "-linkshared", "./exe2")
-
-	// Run 'go list' after 'go install': with gccgo, we apparently don't know the
-	// shlib location until after we've installed it.
-	dep2 := goCmd(t, "list", "-compiler=gccgo", "-buildmode=shared", "-linkshared", "-f", "{{.Shlib}}", "./dep2")
-	depBase := goCmd(t, "list", "-compiler=gccgo", "-buildmode=shared", "-linkshared", "-f", "{{.Shlib}}", "./depBase")
-
-	AssertIsLinkedToRegexp(t, depBase, libgoRE)
-	AssertIsLinkedToRegexp(t, dep2, libgoRE)
-	AssertIsLinkedTo(t, dep2, filepath.Base(depBase))
-	AssertIsLinkedToRegexp(t, "../../bin/exe2", libgoRE)
-	AssertIsLinkedTo(t, "../../bin/exe2", filepath.Base(dep2))
-	AssertIsLinkedTo(t, "../../bin/exe2", filepath.Base(depBase))
-
-	// And check it runs.
-	run(t, "gccgo-built", "../../bin/exe2")
-}
-
-// Testing rebuilding of shared libraries when they are stale is a bit more
-// complicated that it seems like it should be. First, we make everything "old": but
-// only a few seconds old, or it might be older than gc (or the runtime source) and
-// everything will get rebuilt. Then define a timestamp slightly newer than this
-// time, which is what we set the mtime to of a file to cause it to be seen as new,
-// and finally another slightly even newer one that we can compare files against to
-// see if they have been rebuilt.
-var oldTime = time.Now().Add(-9 * time.Second)
-var nearlyNew = time.Now().Add(-6 * time.Second)
-var stampTime = time.Now().Add(-3 * time.Second)
-
-// resetFileStamps makes "everything" (bin, src, pkg from GOPATH and the
-// test-specific parts of GOROOT) appear old.
-func resetFileStamps() {
-	chtime := func(path string, info os.FileInfo, err error) error {
-		return os.Chtimes(path, oldTime, oldTime)
-	}
-	reset := func(path string) {
-		if err := filepath.Walk(path, chtime); err != nil {
-			log.Panicf("resetFileStamps failed: %v", err)
-		}
-
-	}
-	reset("../../bin")
-	reset("../../pkg")
-	reset("../../src")
-	reset(gorootInstallDir)
-}
-
-// touch changes path and returns a function that changes it back.
-// It also sets the time of the file, so that we can see if it is rewritten.
-func touch(t *testing.T, path string) (cleanup func()) {
-	t.Helper()
-	data, err := os.ReadFile(path)
-	if err != nil {
-		t.Fatal(err)
-	}
-	old := make([]byte, len(data))
-	copy(old, data)
-	if bytes.HasPrefix(data, []byte("!<arch>\n")) {
-		// Change last digit of build ID.
-		// (Content ID in the new content-based build IDs.)
-		const marker = `build id "`
-		i := bytes.Index(data, []byte(marker))
-		if i < 0 {
-			t.Fatal("cannot find build id in archive")
-		}
-		j := bytes.IndexByte(data[i+len(marker):], '"')
-		if j < 0 {
-			t.Fatal("cannot find build id in archive")
-		}
-		i += len(marker) + j - 1
-		if data[i] == 'a' {
-			data[i] = 'b'
-		} else {
-			data[i] = 'a'
-		}
-	} else {
-		// assume it's a text file
-		data = append(data, '\n')
-	}
-
-	// If the file is still a symlink from an overlay, delete it so that we will
-	// replace it with a regular file instead of overwriting the symlinked one.
-	fi, err := os.Lstat(path)
-	if err == nil && !fi.Mode().IsRegular() {
-		fi, err = os.Stat(path)
-		if err := os.Remove(path); err != nil {
-			t.Fatal(err)
-		}
-	}
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	// If we're replacing a symlink to a read-only file, make the new file
-	// user-writable.
-	perm := fi.Mode().Perm() | 0200
-
-	if err := os.WriteFile(path, data, perm); err != nil {
-		t.Fatal(err)
-	}
-	if err := os.Chtimes(path, nearlyNew, nearlyNew); err != nil {
-		t.Fatal(err)
-	}
-	return func() {
-		if err := os.WriteFile(path, old, perm); err != nil {
-			t.Fatal(err)
-		}
-	}
-}
-
-// isNew returns if the path is newer than the time stamp used by touch.
-func isNew(t *testing.T, path string) bool {
-	t.Helper()
-	fi, err := os.Stat(path)
-	if err != nil {
-		t.Fatal(err)
-	}
-	return fi.ModTime().After(stampTime)
-}
-
-// Fail unless path has been rebuilt (i.e. is newer than the time stamp used by
-// isNew)
-func AssertRebuilt(t *testing.T, msg, path string) {
-	t.Helper()
-	if !isNew(t, path) {
-		t.Errorf("%s was not rebuilt (%s)", msg, path)
-	}
-}
-
-// Fail if path has been rebuilt (i.e. is newer than the time stamp used by isNew)
-func AssertNotRebuilt(t *testing.T, msg, path string) {
-	t.Helper()
-	if isNew(t, path) {
-		t.Errorf("%s was rebuilt (%s)", msg, path)
-	}
-}
-
-func TestRebuilding(t *testing.T) {
-	goCmd(t, "install", "-buildmode=shared", "-linkshared", "./depBase")
-	goCmd(t, "install", "-linkshared", "./exe")
-	info := strings.Fields(goCmd(t, "list", "-buildmode=shared", "-linkshared", "-f", "{{.Target}} {{.Shlib}}", "./depBase"))
-	if len(info) != 2 {
-		t.Fatalf("go list failed to report Target and/or Shlib")
-	}
-	target := info[0]
-	shlib := info[1]
-
-	// If the source is newer than both the .a file and the .so, both are rebuilt.
-	t.Run("newsource", func(t *testing.T) {
-		resetFileStamps()
-		cleanup := touch(t, "./depBase/dep.go")
-		defer func() {
-			cleanup()
-			goCmd(t, "install", "-linkshared", "./exe")
-		}()
-		goCmd(t, "install", "-linkshared", "./exe")
-		AssertRebuilt(t, "new source", target)
-		AssertRebuilt(t, "new source", shlib)
-	})
-
-	// If the .a file is newer than the .so, the .so is rebuilt (but not the .a)
-	t.Run("newarchive", func(t *testing.T) {
-		resetFileStamps()
-		AssertNotRebuilt(t, "new .a file before build", target)
-		goCmd(t, "list", "-linkshared", "-f={{.ImportPath}} {{.Stale}} {{.StaleReason}} {{.Target}}", "./depBase")
-		AssertNotRebuilt(t, "new .a file before build", target)
-		cleanup := touch(t, target)
-		defer func() {
-			cleanup()
-			goCmd(t, "install", "-v", "-linkshared", "./exe")
-		}()
-		goCmd(t, "install", "-v", "-linkshared", "./exe")
-		AssertNotRebuilt(t, "new .a file", target)
-		AssertRebuilt(t, "new .a file", shlib)
-	})
-}
-
-func appendFile(t *testing.T, path, content string) {
-	t.Helper()
-	f, err := os.OpenFile(path, os.O_WRONLY|os.O_APPEND, 0660)
-	if err != nil {
-		t.Fatalf("os.OpenFile failed: %v", err)
-	}
-	defer func() {
-		err := f.Close()
-		if err != nil {
-			t.Fatalf("f.Close failed: %v", err)
-		}
-	}()
-	_, err = f.WriteString(content)
-	if err != nil {
-		t.Fatalf("f.WriteString failed: %v", err)
-	}
-}
-
-func createFile(t *testing.T, path, content string) {
-	t.Helper()
-	f, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_EXCL, 0644)
-	if err != nil {
-		t.Fatalf("os.OpenFile failed: %v", err)
-	}
-	_, err = f.WriteString(content)
-	if closeErr := f.Close(); err == nil {
-		err = closeErr
-	}
-	if err != nil {
-		t.Fatalf("WriteString failed: %v", err)
-	}
-}
-
-func TestABIChecking(t *testing.T) {
-	goCmd(t, "install", "-buildmode=shared", "-linkshared", "./depBase")
-	goCmd(t, "install", "-linkshared", "./exe")
-
-	// If we make an ABI-breaking change to depBase and rebuild libp.so but not exe,
-	// exe will abort with a complaint on startup.
-	// This assumes adding an exported function breaks ABI, which is not true in
-	// some senses but suffices for the narrow definition of ABI compatibility the
-	// toolchain uses today.
-	resetFileStamps()
-
-	createFile(t, "./depBase/break.go", "package depBase\nfunc ABIBreak() {}\n")
-	defer os.Remove("./depBase/break.go")
-
-	goCmd(t, "install", "-buildmode=shared", "-linkshared", "./depBase")
-	c := exec.Command("../../bin/exe")
-	output, err := c.CombinedOutput()
-	if err == nil {
-		t.Fatal("executing exe did not fail after ABI break")
-	}
-	scanner := bufio.NewScanner(bytes.NewReader(output))
-	foundMsg := false
-	const wantPrefix = "abi mismatch detected between the executable and lib"
-	for scanner.Scan() {
-		if strings.HasPrefix(scanner.Text(), wantPrefix) {
-			foundMsg = true
-			break
-		}
-	}
-	if err = scanner.Err(); err != nil {
-		t.Errorf("scanner encountered error: %v", err)
-	}
-	if !foundMsg {
-		t.Fatalf("exe failed, but without line %q; got output:\n%s", wantPrefix, output)
-	}
-
-	// Rebuilding exe makes it work again.
-	goCmd(t, "install", "-linkshared", "./exe")
-	run(t, "rebuilt exe", "../../bin/exe")
-
-	// If we make a change which does not break ABI (such as adding an unexported
-	// function) and rebuild libdepBase.so, exe still works, even if new function
-	// is in a file by itself.
-	resetFileStamps()
-	createFile(t, "./depBase/dep2.go", "package depBase\nfunc noABIBreak() {}\n")
-	goCmd(t, "install", "-buildmode=shared", "-linkshared", "./depBase")
-	run(t, "after non-ABI breaking change", "../../bin/exe")
-}
-
-// If a package 'explicit' imports a package 'implicit', building
-// 'explicit' into a shared library implicitly includes implicit in
-// the shared library. Building an executable that imports both
-// explicit and implicit builds the code from implicit into the
-// executable rather than fetching it from the shared library. The
-// link still succeeds and the executable still runs though.
-func TestImplicitInclusion(t *testing.T) {
-	goCmd(t, "install", "-buildmode=shared", "-linkshared", "./explicit")
-	goCmd(t, "install", "-linkshared", "./implicitcmd")
-	run(t, "running executable linked against library that contains same package as it", "../../bin/implicitcmd")
-}
-
-// Tests to make sure that the type fields of empty interfaces and itab
-// fields of nonempty interfaces are unique even across modules,
-// so that interface equality works correctly.
-func TestInterface(t *testing.T) {
-	goCmd(t, "install", "-buildmode=shared", "-linkshared", "./iface_a")
-	// Note: iface_i gets installed implicitly as a dependency of iface_a.
-	goCmd(t, "install", "-buildmode=shared", "-linkshared", "./iface_b")
-	goCmd(t, "install", "-linkshared", "./iface")
-	run(t, "running type/itab uniqueness tester", "../../bin/iface")
-}
-
-// Access a global variable from a library.
-func TestGlobal(t *testing.T) {
-	goCmd(t, "install", "-buildmode=shared", "-linkshared", "./globallib")
-	goCmd(t, "install", "-linkshared", "./global")
-	run(t, "global executable", "../../bin/global")
-	AssertIsLinkedTo(t, "../../bin/global", soname)
-	AssertHasRPath(t, "../../bin/global", gorootInstallDir)
-}
-
-// Run a test using -linkshared of an installed shared package.
-// Issue 26400.
-func TestTestInstalledShared(t *testing.T) {
-	goCmd(t, "test", "-linkshared", "-test.short", "sync/atomic")
-}
-
-// Test generated pointer method with -linkshared.
-// Issue 25065.
-func TestGeneratedMethod(t *testing.T) {
-	goCmd(t, "install", "-buildmode=shared", "-linkshared", "./issue25065")
-}
-
-// Test use of shared library struct with generated hash function.
-// Issue 30768.
-func TestGeneratedHash(t *testing.T) {
-	goCmd(t, "install", "-buildmode=shared", "-linkshared", "./issue30768/issue30768lib")
-	goCmd(t, "test", "-linkshared", "./issue30768")
-}
-
-// Test that packages can be added not in dependency order (here a depends on b, and a adds
-// before b). This could happen with e.g. go build -buildmode=shared std. See issue 39777.
-func TestPackageOrder(t *testing.T) {
-	goCmd(t, "install", "-buildmode=shared", "-linkshared", "./issue39777/a", "./issue39777/b")
-}
-
-// Test that GC data are generated correctly by the linker when it needs a type defined in
-// a shared library. See issue 39927.
-func TestGCData(t *testing.T) {
-	goCmd(t, "install", "-buildmode=shared", "-linkshared", "./gcdata/p")
-	goCmd(t, "build", "-linkshared", "./gcdata/main")
-	runWithEnv(t, "running gcdata/main", []string{"GODEBUG=clobberfree=1"}, "./main")
-}
-
-// Test that we don't decode type symbols from shared libraries (which has no data,
-// causing panic). See issue 44031.
-func TestIssue44031(t *testing.T) {
-	goCmd(t, "install", "-buildmode=shared", "-linkshared", "./issue44031/a")
-	goCmd(t, "install", "-buildmode=shared", "-linkshared", "./issue44031/b")
-	goCmd(t, "run", "-linkshared", "./issue44031/main")
-}
-
-// Test that we use a variable from shared libraries (which implement an
-// interface in shared libraries.). A weak reference is used in the itab
-// in main process. It can cause unreacheble panic. See issue 47873.
-func TestIssue47873(t *testing.T) {
-	goCmd(t, "install", "-buildmode=shared", "-linkshared", "./issue47837/a")
-	goCmd(t, "run", "-linkshared", "./issue47837/main")
-}
-
-// Test that we can build std in shared mode.
-func TestStd(t *testing.T) {
-	if testing.Short() {
-		t.Skip("skip in short mode")
-	}
-	t.Parallel()
-	// Use a temporary pkgdir to not interfere with other tests, and not write to GOROOT.
-	// Cannot use goCmd as it runs with cloned GOROOT which is incomplete.
-	runWithEnv(t, "building std", []string{"GOROOT=" + oldGOROOT},
-		filepath.Join(oldGOROOT, "bin", "go"), "install", "-buildmode=shared", "-pkgdir="+t.TempDir(), "std")
-}
diff --git a/misc/cgo/testshared/testdata/depBase/asm.s b/misc/cgo/testshared/testdata/depBase/asm.s
deleted file mode 100644
index 0f1111f..0000000
--- a/misc/cgo/testshared/testdata/depBase/asm.s
+++ /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.
-
-// +build gc
-
-#include "textflag.h"
-
-TEXT ·ImplementedInAsm(SB),NOSPLIT,$0-0
-       RET
diff --git a/misc/cgo/testshared/testdata/depBase/gccgo.go b/misc/cgo/testshared/testdata/depBase/gccgo.go
deleted file mode 100644
index 2b02a1e..0000000
--- a/misc/cgo/testshared/testdata/depBase/gccgo.go
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright 2016 The Go 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 gccgo
-
-package depBase
-
-func ImplementedInAsm() {}
diff --git a/misc/cgo/testshared/testdata/depBase/stubs.go b/misc/cgo/testshared/testdata/depBase/stubs.go
deleted file mode 100644
index c779538..0000000
--- a/misc/cgo/testshared/testdata/depBase/stubs.go
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright 2016 The Go 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 gc
-
-package depBase
-
-func ImplementedInAsm()
diff --git a/misc/cgo/testshared/testdata/issue25065/a.go b/misc/cgo/testshared/testdata/issue25065/a.go
deleted file mode 100644
index 979350f..0000000
--- a/misc/cgo/testshared/testdata/issue25065/a.go
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package issue25065 has a type with a method that is
-//  1) referenced in a method expression
-//  2) not called
-//  3) not converted to an interface
-//  4) is a value method but the reference is to the pointer method
-// These cases avoid the call to makefuncsym from typecheckfunc, but we
-// still need to call makefuncsym somehow or the symbol will not be defined.
-package issue25065
-
-type T int
-
-func (t T) M() {}
-
-func F() func(*T) {
-	return (*T).M
-}
diff --git a/misc/cgo/testso/noso_test.go b/misc/cgo/testso/noso_test.go
deleted file mode 100644
index 1014534..0000000
--- a/misc/cgo/testso/noso_test.go
+++ /dev/null
@@ -1,10 +0,0 @@
-// Copyright 2019 The Go 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:build !cgo
-// +build !cgo
-
-package so_test
-
-// Nothing to test.
diff --git a/misc/cgo/testso/overlaydir_test.go b/misc/cgo/testso/overlaydir_test.go
deleted file mode 100644
index 09a1d51..0000000
--- a/misc/cgo/testso/overlaydir_test.go
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright 2019 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package so_test
-
-import (
-	"io"
-	"os"
-	"path/filepath"
-	"strings"
-)
-
-// overlayDir makes a minimal-overhead copy of srcRoot in which new files may be added.
-//
-// TODO: Once we no longer need to support the misc module in GOPATH mode,
-// factor this function out into a package to reduce duplication.
-func overlayDir(dstRoot, srcRoot string) error {
-	dstRoot = filepath.Clean(dstRoot)
-	if err := os.MkdirAll(dstRoot, 0777); err != nil {
-		return err
-	}
-
-	srcRoot, err := filepath.Abs(srcRoot)
-	if err != nil {
-		return err
-	}
-
-	return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error {
-		if err != nil || srcPath == srcRoot {
-			return err
-		}
-
-		suffix := strings.TrimPrefix(srcPath, srcRoot)
-		for len(suffix) > 0 && suffix[0] == filepath.Separator {
-			suffix = suffix[1:]
-		}
-		dstPath := filepath.Join(dstRoot, suffix)
-
-		perm := info.Mode() & os.ModePerm
-		if info.Mode()&os.ModeSymlink != 0 {
-			info, err = os.Stat(srcPath)
-			if err != nil {
-				return err
-			}
-			perm = info.Mode() & os.ModePerm
-		}
-
-		// Always copy directories (don't symlink them).
-		// If we add a file in the overlay, we don't want to add it in the original.
-		if info.IsDir() {
-			return os.MkdirAll(dstPath, perm|0200)
-		}
-
-		// If the OS supports symlinks, use them instead of copying bytes.
-		if err := os.Symlink(srcPath, dstPath); err == nil {
-			return nil
-		}
-
-		// Otherwise, copy the bytes.
-		src, err := os.Open(srcPath)
-		if err != nil {
-			return err
-		}
-		defer src.Close()
-
-		dst, err := os.OpenFile(dstPath, os.O_WRONLY|os.O_CREATE|os.O_EXCL, perm)
-		if err != nil {
-			return err
-		}
-
-		_, err = io.Copy(dst, src)
-		if closeErr := dst.Close(); err == nil {
-			err = closeErr
-		}
-		return err
-	})
-}
diff --git a/misc/cgo/testso/so_test.go b/misc/cgo/testso/so_test.go
deleted file mode 100644
index 6d14e32..0000000
--- a/misc/cgo/testso/so_test.go
+++ /dev/null
@@ -1,142 +0,0 @@
-// Copyright 2019 The Go 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:build cgo
-// +build cgo
-
-package so_test
-
-import (
-	"log"
-	"os"
-	"os/exec"
-	"path/filepath"
-	"runtime"
-	"strings"
-	"testing"
-)
-
-func requireTestSOSupported(t *testing.T) {
-	t.Helper()
-	switch runtime.GOARCH {
-	case "arm64":
-		if runtime.GOOS == "darwin" || runtime.GOOS == "ios" {
-			t.Skip("No exec facility on iOS.")
-		}
-	case "ppc64":
-		if runtime.GOOS == "linux" {
-			t.Skip("External linking not implemented on linux/ppc64 (issue #8912).")
-		}
-	}
-	if runtime.GOOS == "android" {
-		t.Skip("No exec facility on Android.")
-	}
-}
-
-func TestSO(t *testing.T) {
-	requireTestSOSupported(t)
-
-	GOPATH, err := os.MkdirTemp("", "cgosotest")
-	if err != nil {
-		log.Fatal(err)
-	}
-	defer os.RemoveAll(GOPATH)
-
-	modRoot := filepath.Join(GOPATH, "src", "cgosotest")
-	if err := overlayDir(modRoot, "testdata"); err != nil {
-		log.Panic(err)
-	}
-	if err := os.WriteFile(filepath.Join(modRoot, "go.mod"), []byte("module cgosotest\n"), 0666); err != nil {
-		log.Panic(err)
-	}
-
-	cmd := exec.Command("go", "env", "CC", "GOGCCFLAGS")
-	cmd.Dir = modRoot
-	cmd.Stderr = new(strings.Builder)
-	cmd.Env = append(os.Environ(), "GOPATH="+GOPATH)
-	out, err := cmd.Output()
-	if err != nil {
-		t.Fatalf("%s: %v\n%s", strings.Join(cmd.Args, " "), err, cmd.Stderr)
-	}
-	lines := strings.Split(string(out), "\n")
-	if len(lines) != 3 || lines[2] != "" {
-		t.Fatalf("Unexpected output from %s:\n%s", strings.Join(cmd.Args, " "), lines)
-	}
-
-	cc := lines[0]
-	if cc == "" {
-		t.Fatal("CC environment variable (go env CC) cannot be empty")
-	}
-	gogccflags := strings.Split(lines[1], " ")
-
-	// build shared object
-	ext := "so"
-	args := append(gogccflags, "-shared")
-	switch runtime.GOOS {
-	case "darwin", "ios":
-		ext = "dylib"
-		args = append(args, "-undefined", "suppress", "-flat_namespace")
-	case "windows":
-		ext = "dll"
-		args = append(args, "-DEXPORT_DLL")
-		// At least in mingw-clang it is not permitted to just name a .dll
-		// on the command line. You must name the corresponding import
-		// library instead, even though the dll is used when the executable is run.
-		args = append(args, "-Wl,-out-implib,libcgosotest.a")
-	case "aix":
-		ext = "so.1"
-	}
-	sofname := "libcgosotest." + ext
-	args = append(args, "-o", sofname, "cgoso_c.c")
-
-	cmd = exec.Command(cc, args...)
-	cmd.Dir = modRoot
-	cmd.Env = append(os.Environ(), "GOPATH="+GOPATH)
-	out, err = cmd.CombinedOutput()
-	if err != nil {
-		t.Fatalf("%s: %s\n%s", strings.Join(cmd.Args, " "), err, out)
-	}
-	t.Logf("%s:\n%s", strings.Join(cmd.Args, " "), out)
-
-	if runtime.GOOS == "aix" {
-		// Shared object must be wrapped by an archive
-		cmd = exec.Command("ar", "-X64", "-q", "libcgosotest.a", "libcgosotest.so.1")
-		cmd.Dir = modRoot
-		out, err = cmd.CombinedOutput()
-		if err != nil {
-			t.Fatalf("%s: %s\n%s", strings.Join(cmd.Args, " "), err, out)
-		}
-	}
-
-	cmd = exec.Command("go", "build", "-o", "main.exe", "main.go")
-	cmd.Dir = modRoot
-	cmd.Env = append(os.Environ(), "GOPATH="+GOPATH)
-	out, err = cmd.CombinedOutput()
-	if err != nil {
-		t.Fatalf("%s: %s\n%s", strings.Join(cmd.Args, " "), err, out)
-	}
-	t.Logf("%s:\n%s", strings.Join(cmd.Args, " "), out)
-
-	cmd = exec.Command("./main.exe")
-	cmd.Dir = modRoot
-	cmd.Env = append(os.Environ(), "GOPATH="+GOPATH)
-	if runtime.GOOS != "windows" {
-		s := "LD_LIBRARY_PATH"
-		if runtime.GOOS == "darwin" || runtime.GOOS == "ios" {
-			s = "DYLD_LIBRARY_PATH"
-		}
-		cmd.Env = append(os.Environ(), s+"=.")
-
-		// On FreeBSD 64-bit architectures, the 32-bit linker looks for
-		// different environment variables.
-		if runtime.GOOS == "freebsd" && runtime.GOARCH == "386" {
-			cmd.Env = append(cmd.Env, "LD_32_LIBRARY_PATH=.")
-		}
-	}
-	out, err = cmd.CombinedOutput()
-	if err != nil {
-		t.Fatalf("%s: %s\n%s", strings.Join(cmd.Args, " "), err, out)
-	}
-	t.Logf("%s:\n%s", strings.Join(cmd.Args, " "), out)
-}
diff --git a/misc/cgo/testso/testdata/cgoso_c.c b/misc/cgo/testso/testdata/cgoso_c.c
deleted file mode 100644
index e5015ed..0000000
--- a/misc/cgo/testso/testdata/cgoso_c.c
+++ /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 ignore
-
-#ifdef WIN32
-// A Windows DLL is unable to call an arbitrary function in
-// the main executable. Work around that by making the main
-// executable pass the callback function pointer to us.
-void (*goCallback)(void);
-__declspec(dllexport) void setCallback(void *f)
-{
-	goCallback = (void (*)())f;
-}
-__declspec(dllexport) void sofunc(void);
-#elif defined(_AIX)
-// AIX doesn't allow the creation of a shared object with an
-// undefined symbol. It's possible to bypass this problem by
-// using -Wl,-G and -Wl,-brtl option which allows run-time linking.
-// However, that's not how most of AIX shared object works.
-// Therefore, it's better to consider goCallback as a pointer and
-// to set up during an init function.
-void (*goCallback)(void);
-void setCallback(void *f) { goCallback = f; }
-#else
-extern void goCallback(void);
-void setCallback(void *f) { (void)f; }
-#endif
-
-// OpenBSD and older Darwin lack TLS support
-#if !defined(__OpenBSD__) && !defined(__APPLE__)
-__thread int tlsvar = 12345;
-#endif
-
-void sofunc(void)
-{
-	goCallback();
-}
diff --git a/misc/cgo/testso/testdata/cgoso_unix.go b/misc/cgo/testso/testdata/cgoso_unix.go
deleted file mode 100644
index 1860694..0000000
--- a/misc/cgo/testso/testdata/cgoso_unix.go
+++ /dev/null
@@ -1,20 +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 aix dragonfly freebsd linux netbsd solaris
-
-package cgosotest
-
-/*
-extern int __thread tlsvar;
-int *getTLS() { return &tlsvar; }
-*/
-import "C"
-
-func init() {
-	if v := *C.getTLS(); v != 12345 {
-		println("got", v)
-		panic("BAD TLS value")
-	}
-}
diff --git a/misc/cgo/testso/testdata/main.go b/misc/cgo/testso/testdata/main.go
deleted file mode 100644
index 963d451..0000000
--- a/misc/cgo/testso/testdata/main.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 ignore
-
-package main
-
-import "cgosotest"
-
-func main() {
-	cgosotest.Test()
-}
diff --git a/misc/cgo/testsovar/noso_test.go b/misc/cgo/testsovar/noso_test.go
deleted file mode 100644
index 1014534..0000000
--- a/misc/cgo/testsovar/noso_test.go
+++ /dev/null
@@ -1,10 +0,0 @@
-// Copyright 2019 The Go 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:build !cgo
-// +build !cgo
-
-package so_test
-
-// Nothing to test.
diff --git a/misc/cgo/testsovar/overlaydir_test.go b/misc/cgo/testsovar/overlaydir_test.go
deleted file mode 100644
index 09a1d51..0000000
--- a/misc/cgo/testsovar/overlaydir_test.go
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright 2019 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package so_test
-
-import (
-	"io"
-	"os"
-	"path/filepath"
-	"strings"
-)
-
-// overlayDir makes a minimal-overhead copy of srcRoot in which new files may be added.
-//
-// TODO: Once we no longer need to support the misc module in GOPATH mode,
-// factor this function out into a package to reduce duplication.
-func overlayDir(dstRoot, srcRoot string) error {
-	dstRoot = filepath.Clean(dstRoot)
-	if err := os.MkdirAll(dstRoot, 0777); err != nil {
-		return err
-	}
-
-	srcRoot, err := filepath.Abs(srcRoot)
-	if err != nil {
-		return err
-	}
-
-	return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error {
-		if err != nil || srcPath == srcRoot {
-			return err
-		}
-
-		suffix := strings.TrimPrefix(srcPath, srcRoot)
-		for len(suffix) > 0 && suffix[0] == filepath.Separator {
-			suffix = suffix[1:]
-		}
-		dstPath := filepath.Join(dstRoot, suffix)
-
-		perm := info.Mode() & os.ModePerm
-		if info.Mode()&os.ModeSymlink != 0 {
-			info, err = os.Stat(srcPath)
-			if err != nil {
-				return err
-			}
-			perm = info.Mode() & os.ModePerm
-		}
-
-		// Always copy directories (don't symlink them).
-		// If we add a file in the overlay, we don't want to add it in the original.
-		if info.IsDir() {
-			return os.MkdirAll(dstPath, perm|0200)
-		}
-
-		// If the OS supports symlinks, use them instead of copying bytes.
-		if err := os.Symlink(srcPath, dstPath); err == nil {
-			return nil
-		}
-
-		// Otherwise, copy the bytes.
-		src, err := os.Open(srcPath)
-		if err != nil {
-			return err
-		}
-		defer src.Close()
-
-		dst, err := os.OpenFile(dstPath, os.O_WRONLY|os.O_CREATE|os.O_EXCL, perm)
-		if err != nil {
-			return err
-		}
-
-		_, err = io.Copy(dst, src)
-		if closeErr := dst.Close(); err == nil {
-			err = closeErr
-		}
-		return err
-	})
-}
diff --git a/misc/cgo/testsovar/so_test.go b/misc/cgo/testsovar/so_test.go
deleted file mode 100644
index 6d14e32..0000000
--- a/misc/cgo/testsovar/so_test.go
+++ /dev/null
@@ -1,142 +0,0 @@
-// Copyright 2019 The Go 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:build cgo
-// +build cgo
-
-package so_test
-
-import (
-	"log"
-	"os"
-	"os/exec"
-	"path/filepath"
-	"runtime"
-	"strings"
-	"testing"
-)
-
-func requireTestSOSupported(t *testing.T) {
-	t.Helper()
-	switch runtime.GOARCH {
-	case "arm64":
-		if runtime.GOOS == "darwin" || runtime.GOOS == "ios" {
-			t.Skip("No exec facility on iOS.")
-		}
-	case "ppc64":
-		if runtime.GOOS == "linux" {
-			t.Skip("External linking not implemented on linux/ppc64 (issue #8912).")
-		}
-	}
-	if runtime.GOOS == "android" {
-		t.Skip("No exec facility on Android.")
-	}
-}
-
-func TestSO(t *testing.T) {
-	requireTestSOSupported(t)
-
-	GOPATH, err := os.MkdirTemp("", "cgosotest")
-	if err != nil {
-		log.Fatal(err)
-	}
-	defer os.RemoveAll(GOPATH)
-
-	modRoot := filepath.Join(GOPATH, "src", "cgosotest")
-	if err := overlayDir(modRoot, "testdata"); err != nil {
-		log.Panic(err)
-	}
-	if err := os.WriteFile(filepath.Join(modRoot, "go.mod"), []byte("module cgosotest\n"), 0666); err != nil {
-		log.Panic(err)
-	}
-
-	cmd := exec.Command("go", "env", "CC", "GOGCCFLAGS")
-	cmd.Dir = modRoot
-	cmd.Stderr = new(strings.Builder)
-	cmd.Env = append(os.Environ(), "GOPATH="+GOPATH)
-	out, err := cmd.Output()
-	if err != nil {
-		t.Fatalf("%s: %v\n%s", strings.Join(cmd.Args, " "), err, cmd.Stderr)
-	}
-	lines := strings.Split(string(out), "\n")
-	if len(lines) != 3 || lines[2] != "" {
-		t.Fatalf("Unexpected output from %s:\n%s", strings.Join(cmd.Args, " "), lines)
-	}
-
-	cc := lines[0]
-	if cc == "" {
-		t.Fatal("CC environment variable (go env CC) cannot be empty")
-	}
-	gogccflags := strings.Split(lines[1], " ")
-
-	// build shared object
-	ext := "so"
-	args := append(gogccflags, "-shared")
-	switch runtime.GOOS {
-	case "darwin", "ios":
-		ext = "dylib"
-		args = append(args, "-undefined", "suppress", "-flat_namespace")
-	case "windows":
-		ext = "dll"
-		args = append(args, "-DEXPORT_DLL")
-		// At least in mingw-clang it is not permitted to just name a .dll
-		// on the command line. You must name the corresponding import
-		// library instead, even though the dll is used when the executable is run.
-		args = append(args, "-Wl,-out-implib,libcgosotest.a")
-	case "aix":
-		ext = "so.1"
-	}
-	sofname := "libcgosotest." + ext
-	args = append(args, "-o", sofname, "cgoso_c.c")
-
-	cmd = exec.Command(cc, args...)
-	cmd.Dir = modRoot
-	cmd.Env = append(os.Environ(), "GOPATH="+GOPATH)
-	out, err = cmd.CombinedOutput()
-	if err != nil {
-		t.Fatalf("%s: %s\n%s", strings.Join(cmd.Args, " "), err, out)
-	}
-	t.Logf("%s:\n%s", strings.Join(cmd.Args, " "), out)
-
-	if runtime.GOOS == "aix" {
-		// Shared object must be wrapped by an archive
-		cmd = exec.Command("ar", "-X64", "-q", "libcgosotest.a", "libcgosotest.so.1")
-		cmd.Dir = modRoot
-		out, err = cmd.CombinedOutput()
-		if err != nil {
-			t.Fatalf("%s: %s\n%s", strings.Join(cmd.Args, " "), err, out)
-		}
-	}
-
-	cmd = exec.Command("go", "build", "-o", "main.exe", "main.go")
-	cmd.Dir = modRoot
-	cmd.Env = append(os.Environ(), "GOPATH="+GOPATH)
-	out, err = cmd.CombinedOutput()
-	if err != nil {
-		t.Fatalf("%s: %s\n%s", strings.Join(cmd.Args, " "), err, out)
-	}
-	t.Logf("%s:\n%s", strings.Join(cmd.Args, " "), out)
-
-	cmd = exec.Command("./main.exe")
-	cmd.Dir = modRoot
-	cmd.Env = append(os.Environ(), "GOPATH="+GOPATH)
-	if runtime.GOOS != "windows" {
-		s := "LD_LIBRARY_PATH"
-		if runtime.GOOS == "darwin" || runtime.GOOS == "ios" {
-			s = "DYLD_LIBRARY_PATH"
-		}
-		cmd.Env = append(os.Environ(), s+"=.")
-
-		// On FreeBSD 64-bit architectures, the 32-bit linker looks for
-		// different environment variables.
-		if runtime.GOOS == "freebsd" && runtime.GOARCH == "386" {
-			cmd.Env = append(cmd.Env, "LD_32_LIBRARY_PATH=.")
-		}
-	}
-	out, err = cmd.CombinedOutput()
-	if err != nil {
-		t.Fatalf("%s: %s\n%s", strings.Join(cmd.Args, " "), err, out)
-	}
-	t.Logf("%s:\n%s", strings.Join(cmd.Args, " "), out)
-}
diff --git a/misc/cgo/testsovar/testdata/cgoso_c.c b/misc/cgo/testsovar/testdata/cgoso_c.c
deleted file mode 100644
index a448c01..0000000
--- a/misc/cgo/testsovar/testdata/cgoso_c.c
+++ /dev/null
@@ -1,7 +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
-
-const char *exported_var = "Hello world";
diff --git a/misc/cgo/testsovar/testdata/cgoso_c.h b/misc/cgo/testsovar/testdata/cgoso_c.h
deleted file mode 100644
index 640db7b..0000000
--- a/misc/cgo/testsovar/testdata/cgoso_c.h
+++ /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 ignore
-
-#ifdef WIN32
-#if defined(EXPORT_DLL)
-#    define VAR __declspec(dllexport)
-#elif defined(IMPORT_DLL)
-#    define VAR __declspec(dllimport)
-#endif
-#else
-#    define VAR extern
-#endif
-
-VAR const char *exported_var;
diff --git a/misc/cgo/testsovar/testdata/main.go b/misc/cgo/testsovar/testdata/main.go
deleted file mode 100644
index 87b52ce..0000000
--- a/misc/cgo/testsovar/testdata/main.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 ignore
-
-package main
-
-import "cgosotest"
-
-func main() {
-	cgosotest.Test()
-}
diff --git a/misc/cgo/testtls/tls.go b/misc/cgo/testtls/tls.go
deleted file mode 100644
index e634220..0000000
--- a/misc/cgo/testtls/tls.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.
-
-package cgotlstest
-
-// #include <pthread.h>
-// extern void setTLS(int);
-// extern int getTLS();
-import "C"
-
-import (
-	"runtime"
-	"testing"
-)
-
-func testTLS(t *testing.T) {
-	runtime.LockOSThread()
-	defer runtime.UnlockOSThread()
-
-	if val := C.getTLS(); val != 0 {
-		t.Fatalf("at start, C.getTLS() = %#x, want 0", val)
-	}
-
-	const keyVal = 0x1234
-	C.setTLS(keyVal)
-	if val := C.getTLS(); val != keyVal {
-		t.Fatalf("at end, C.getTLS() = %#x, want %#x", val, keyVal)
-	}
-}
diff --git a/misc/cgo/testtls/tls_test.go b/misc/cgo/testtls/tls_test.go
deleted file mode 100644
index a3b67c0..0000000
--- a/misc/cgo/testtls/tls_test.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2013 The Go 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:build !windows
-// +build !windows
-
-package cgotlstest
-
-import "testing"
-
-func TestTLS(t *testing.T) {
-	testTLS(t)
-}
diff --git a/misc/cgo/testtls/tls_unix.c b/misc/cgo/testtls/tls_unix.c
deleted file mode 100644
index 957afce..0000000
--- a/misc/cgo/testtls/tls_unix.c
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright 2013 The Go 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 <pthread.h>
-
-static __thread int tls;
-
-void
-setTLS(int v)
-{
-	tls = v;
-}
-
-int
-getTLS()
-{
-	return tls;
-}
diff --git a/misc/go.mod b/misc/go.mod
index 712a051..d5494b1 100644
--- a/misc/go.mod
+++ b/misc/go.mod
@@ -1,11 +1,6 @@
-// Module misc contains tests and binaries that pertain to specific build modes
-// (cgo) and platforms (Android and iOS).
-//
-// The 'run' scripts in ../src execute these tests and binaries, which need to
-// be in a module in order to build and run successfully in module mode.
-// (Otherwise, they lack well-defined import paths, and module mode — unlike
-// GOPATH mode — does not synthesize import paths from the absolute working
-// directory.)
+// Module misc contains binaries that pertain to specific platforms
+// (Android, iOS, and WebAssembly), as well as some miscellaneous
+// tests and tools.
 module misc
 
-go 1.18
+go 1.21
diff --git a/misc/android/README b/misc/go_android_exec/README
similarity index 100%
rename from misc/android/README
rename to misc/go_android_exec/README
diff --git a/misc/go_android_exec/exitcode_test.go b/misc/go_android_exec/exitcode_test.go
new file mode 100644
index 0000000..4ad2f60
--- /dev/null
+++ b/misc/go_android_exec/exitcode_test.go
@@ -0,0 +1,76 @@
+// Copyright 2023 The Go 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:build !(windows || js || wasip1)
+
+package main
+
+import (
+	"regexp"
+	"strings"
+	"testing"
+)
+
+func TestExitCodeFilter(t *testing.T) {
+	// Write text to the filter one character at a time.
+	var out strings.Builder
+	f, exitStr := newExitCodeFilter(&out)
+	// Embed a "fake" exit code in the middle to check that we don't get caught on it.
+	pre := "abc" + exitStr + "123def"
+	text := pre + exitStr + `1`
+	for i := 0; i < len(text); i++ {
+		_, err := f.Write([]byte{text[i]})
+		if err != nil {
+			t.Fatal(err)
+		}
+	}
+
+	// The "pre" output should all have been flushed already.
+	if want, got := pre, out.String(); want != got {
+		t.Errorf("filter should have already flushed %q, but flushed %q", want, got)
+	}
+
+	code, err := f.Finish()
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	// Nothing more should have been written to out.
+	if want, got := pre, out.String(); want != got {
+		t.Errorf("want output %q, got %q", want, got)
+	}
+	if want := 1; want != code {
+		t.Errorf("want exit code %d, got %d", want, code)
+	}
+}
+
+func TestExitCodeMissing(t *testing.T) {
+	var wantErr *regexp.Regexp
+	check := func(text string) {
+		t.Helper()
+		var out strings.Builder
+		f, exitStr := newExitCodeFilter(&out)
+		if want := "exitcode="; want != exitStr {
+			t.Fatalf("test assumes exitStr will be %q, but got %q", want, exitStr)
+		}
+		f.Write([]byte(text))
+		_, err := f.Finish()
+		// We should get a no exit code error
+		if err == nil || !wantErr.MatchString(err.Error()) {
+			t.Errorf("want error matching %s, got %s", wantErr, err)
+		}
+		// And it should flush all output (even if it looks
+		// like we may be getting an exit code)
+		if got := out.String(); text != got {
+			t.Errorf("want full output %q, got %q", text, got)
+		}
+	}
+	wantErr = regexp.MustCompile("^no exit code")
+	check("abc")
+	check("exitcode")
+	check("exitcode=")
+	check("exitcode=123\n")
+	wantErr = regexp.MustCompile("^bad exit code: .* value out of range")
+	check("exitcode=999999999999999999999999")
+}
diff --git a/misc/go_android_exec/main.go b/misc/go_android_exec/main.go
new file mode 100644
index 0000000..554810c
--- /dev/null
+++ b/misc/go_android_exec/main.go
@@ -0,0 +1,526 @@
+// 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 wrapper uses syscall.Flock to prevent concurrent adb commands,
+// so for now it only builds on platforms that support that system call.
+// TODO(#33974): use a more portable library for file locking.
+
+//go:build darwin || dragonfly || freebsd || illumos || linux || netbsd || openbsd
+
+// This program can be used as go_android_GOARCH_exec by the Go tool.
+// It executes binaries on an android device using adb.
+package main
+
+import (
+	"bytes"
+	"errors"
+	"fmt"
+	"io"
+	"log"
+	"os"
+	"os/exec"
+	"os/signal"
+	"path"
+	"path/filepath"
+	"regexp"
+	"runtime"
+	"strconv"
+	"strings"
+	"sync"
+	"syscall"
+)
+
+func adbRun(args string) (int, error) {
+	// The exit code of adb is often wrong. In theory it was fixed in 2016
+	// (https://code.google.com/p/android/issues/detail?id=3254), but it's
+	// still broken on our builders in 2023. Instead, append the exitcode to
+	// the output and parse it from there.
+	filter, exitStr := newExitCodeFilter(os.Stdout)
+	args += "; echo -n " + exitStr + "$?"
+
+	cmd := adbCmd("exec-out", args)
+	cmd.Stdout = filter
+	// If the adb subprocess somehow hangs, go test will kill this wrapper
+	// and wait for our os.Stderr (and os.Stdout) to close as a result.
+	// However, if the os.Stderr (or os.Stdout) file descriptors are
+	// passed on, the hanging adb subprocess will hold them open and
+	// go test will hang forever.
+	//
+	// Avoid that by wrapping stderr, breaking the short circuit and
+	// forcing cmd.Run to use another pipe and goroutine to pass
+	// along stderr from adb.
+	cmd.Stderr = struct{ io.Writer }{os.Stderr}
+	err := cmd.Run()
+
+	// Before we process err, flush any further output and get the exit code.
+	exitCode, err2 := filter.Finish()
+
+	if err != nil {
+		return 0, fmt.Errorf("adb exec-out %s: %v", args, err)
+	}
+	return exitCode, err2
+}
+
+func adb(args ...string) error {
+	if out, err := adbCmd(args...).CombinedOutput(); err != nil {
+		fmt.Fprintf(os.Stderr, "adb %s\n%s", strings.Join(args, " "), out)
+		return err
+	}
+	return nil
+}
+
+func adbCmd(args ...string) *exec.Cmd {
+	if flags := os.Getenv("GOANDROID_ADB_FLAGS"); flags != "" {
+		args = append(strings.Split(flags, " "), args...)
+	}
+	return exec.Command("adb", args...)
+}
+
+const (
+	deviceRoot   = "/data/local/tmp/go_android_exec"
+	deviceGoroot = deviceRoot + "/goroot"
+)
+
+func main() {
+	log.SetFlags(0)
+	log.SetPrefix("go_android_exec: ")
+	exitCode, err := runMain()
+	if err != nil {
+		log.Fatal(err)
+	}
+	os.Exit(exitCode)
+}
+
+func runMain() (int, error) {
+	// Concurrent use of adb is flaky, so serialize adb commands.
+	// See https://github.com/golang/go/issues/23795 or
+	// https://issuetracker.google.com/issues/73230216.
+	lockPath := filepath.Join(os.TempDir(), "go_android_exec-adb-lock")
+	lock, err := os.OpenFile(lockPath, os.O_CREATE|os.O_RDWR, 0666)
+	if err != nil {
+		return 0, err
+	}
+	defer lock.Close()
+	if err := syscall.Flock(int(lock.Fd()), syscall.LOCK_EX); err != nil {
+		return 0, err
+	}
+
+	// In case we're booting a device or emulator alongside all.bash, wait for
+	// it to be ready. adb wait-for-device is not enough, we have to
+	// wait for sys.boot_completed.
+	if err := adb("wait-for-device", "exec-out", "while [[ -z $(getprop sys.boot_completed) ]]; do sleep 1; done;"); err != nil {
+		return 0, err
+	}
+
+	// Done once per make.bash.
+	if err := adbCopyGoroot(); err != nil {
+		return 0, err
+	}
+
+	// Prepare a temporary directory that will be cleaned up at the end.
+	// Binary names can conflict.
+	// E.g. template.test from the {html,text}/template packages.
+	binName := filepath.Base(os.Args[1])
+	deviceGotmp := fmt.Sprintf(deviceRoot+"/%s-%d", binName, os.Getpid())
+	deviceGopath := deviceGotmp + "/gopath"
+	defer adb("exec-out", "rm", "-rf", deviceGotmp) // Clean up.
+
+	// Determine the package by examining the current working
+	// directory, which will look something like
+	// "$GOROOT/src/mime/multipart" or "$GOPATH/src/golang.org/x/mobile".
+	// We extract everything after the $GOROOT or $GOPATH to run on the
+	// same relative directory on the target device.
+	importPath, isStd, modPath, modDir, err := pkgPath()
+	if err != nil {
+		return 0, err
+	}
+	var deviceCwd string
+	if isStd {
+		// Note that we use path.Join here instead of filepath.Join:
+		// The device paths should be slash-separated even if the go_android_exec
+		// wrapper itself is compiled for Windows.
+		deviceCwd = path.Join(deviceGoroot, "src", importPath)
+	} else {
+		deviceCwd = path.Join(deviceGopath, "src", importPath)
+		if modDir != "" {
+			// In module mode, the user may reasonably expect the entire module
+			// to be present. Copy it over.
+			deviceModDir := path.Join(deviceGopath, "src", modPath)
+			if err := adb("exec-out", "mkdir", "-p", path.Dir(deviceModDir)); err != nil {
+				return 0, err
+			}
+			// We use a single recursive 'adb push' of the module root instead of
+			// walking the tree and copying it piecewise. If the directory tree
+			// contains nested modules this could push a lot of unnecessary contents,
+			// but for the golang.org/x repos it seems to be significantly (~2x)
+			// faster than copying one file at a time (via filepath.WalkDir),
+			// apparently due to high latency in 'adb' commands.
+			if err := adb("push", modDir, deviceModDir); err != nil {
+				return 0, err
+			}
+		} else {
+			if err := adb("exec-out", "mkdir", "-p", deviceCwd); err != nil {
+				return 0, err
+			}
+			if err := adbCopyTree(deviceCwd, importPath); err != nil {
+				return 0, err
+			}
+
+			// Copy .go files from the package.
+			goFiles, err := filepath.Glob("*.go")
+			if err != nil {
+				return 0, err
+			}
+			if len(goFiles) > 0 {
+				args := append(append([]string{"push"}, goFiles...), deviceCwd)
+				if err := adb(args...); err != nil {
+					return 0, err
+				}
+			}
+		}
+	}
+
+	deviceBin := fmt.Sprintf("%s/%s", deviceGotmp, binName)
+	if err := adb("push", os.Args[1], deviceBin); err != nil {
+		return 0, err
+	}
+
+	// Forward SIGQUIT from the go command to show backtraces from
+	// the binary instead of from this wrapper.
+	quit := make(chan os.Signal, 1)
+	signal.Notify(quit, syscall.SIGQUIT)
+	go func() {
+		for range quit {
+			// We don't have the PID of the running process; use the
+			// binary name instead.
+			adb("exec-out", "killall -QUIT "+binName)
+		}
+	}()
+	cmd := `export TMPDIR="` + deviceGotmp + `"` +
+		`; export GOROOT="` + deviceGoroot + `"` +
+		`; export GOPATH="` + deviceGopath + `"` +
+		`; export CGO_ENABLED=0` +
+		`; export GOPROXY=` + os.Getenv("GOPROXY") +
+		`; export GOCACHE="` + deviceRoot + `/gocache"` +
+		`; export PATH="` + deviceGoroot + `/bin":$PATH` +
+		`; cd "` + deviceCwd + `"` +
+		"; '" + deviceBin + "' " + strings.Join(os.Args[2:], " ")
+	code, err := adbRun(cmd)
+	signal.Reset(syscall.SIGQUIT)
+	close(quit)
+	return code, err
+}
+
+type exitCodeFilter struct {
+	w      io.Writer // Pass through to w
+	exitRe *regexp.Regexp
+	buf    bytes.Buffer
+}
+
+func newExitCodeFilter(w io.Writer) (*exitCodeFilter, string) {
+	const exitStr = "exitcode="
+
+	// Build a regexp that matches any prefix of the exit string at the end of
+	// the input. We do it this way to avoid assuming anything about the
+	// subcommand output (e.g., it might not be \n-terminated).
+	var exitReStr strings.Builder
+	for i := 1; i <= len(exitStr); i++ {
+		fmt.Fprintf(&exitReStr, "%s$|", exitStr[:i])
+	}
+	// Finally, match the exit string along with an exit code.
+	// This is the only case we use a group, and we'll use this
+	// group to extract the numeric code.
+	fmt.Fprintf(&exitReStr, "%s([0-9]+)$", exitStr)
+	exitRe := regexp.MustCompile(exitReStr.String())
+
+	return &exitCodeFilter{w: w, exitRe: exitRe}, exitStr
+}
+
+func (f *exitCodeFilter) Write(data []byte) (int, error) {
+	n := len(data)
+	f.buf.Write(data)
+	// Flush to w until a potential match of exitRe
+	b := f.buf.Bytes()
+	match := f.exitRe.FindIndex(b)
+	if match == nil {
+		// Flush all of the buffer.
+		_, err := f.w.Write(b)
+		f.buf.Reset()
+		if err != nil {
+			return n, err
+		}
+	} else {
+		// Flush up to the beginning of the (potential) match.
+		_, err := f.w.Write(b[:match[0]])
+		f.buf.Next(match[0])
+		if err != nil {
+			return n, err
+		}
+	}
+	return n, nil
+}
+
+func (f *exitCodeFilter) Finish() (int, error) {
+	// f.buf could be empty, contain a partial match of exitRe, or
+	// contain a full match.
+	b := f.buf.Bytes()
+	defer f.buf.Reset()
+	match := f.exitRe.FindSubmatch(b)
+	if len(match) < 2 || match[1] == nil {
+		// Not a full match. Flush.
+		if _, err := f.w.Write(b); err != nil {
+			return 0, err
+		}
+		return 0, fmt.Errorf("no exit code (in %q)", string(b))
+	}
+
+	// Parse the exit code.
+	code, err := strconv.Atoi(string(match[1]))
+	if err != nil {
+		// Something is malformed. Flush.
+		if _, err := f.w.Write(b); err != nil {
+			return 0, err
+		}
+		return 0, fmt.Errorf("bad exit code: %v (in %q)", err, string(b))
+	}
+	return code, nil
+}
+
+// pkgPath determines the package import path of the current working directory,
+// and indicates whether it is
+// and returns the path to the package source relative to $GOROOT (or $GOPATH).
+func pkgPath() (importPath string, isStd bool, modPath, modDir string, err error) {
+	errorf := func(format string, args ...any) (string, bool, string, string, error) {
+		return "", false, "", "", fmt.Errorf(format, args...)
+	}
+	goTool, err := goTool()
+	if err != nil {
+		return errorf("%w", err)
+	}
+	cmd := exec.Command(goTool, "list", "-e", "-f", "{{.ImportPath}}:{{.Standard}}{{with .Module}}:{{.Path}}:{{.Dir}}{{end}}", ".")
+	out, err := cmd.Output()
+	if err != nil {
+		if ee, ok := err.(*exec.ExitError); ok && len(ee.Stderr) > 0 {
+			return errorf("%v: %s", cmd, ee.Stderr)
+		}
+		return errorf("%v: %w", cmd, err)
+	}
+
+	parts := strings.SplitN(string(bytes.TrimSpace(out)), ":", 4)
+	if len(parts) < 2 {
+		return errorf("%v: missing ':' in output: %q", cmd, out)
+	}
+	importPath = parts[0]
+	if importPath == "" || importPath == "." {
+		return errorf("current directory does not have a Go import path")
+	}
+	isStd, err = strconv.ParseBool(parts[1])
+	if err != nil {
+		return errorf("%v: non-boolean .Standard in output: %q", cmd, out)
+	}
+	if len(parts) >= 4 {
+		modPath = parts[2]
+		modDir = parts[3]
+	}
+
+	return importPath, isStd, modPath, modDir, nil
+}
+
+// adbCopyTree copies testdata, go.mod, go.sum files from subdir
+// and from parent directories all the way up to the root of subdir.
+// go.mod and go.sum files are needed for the go tool modules queries,
+// and the testdata directories for tests.  It is common for tests to
+// reach out into testdata from parent packages.
+func adbCopyTree(deviceCwd, subdir string) error {
+	dir := ""
+	for {
+		for _, name := range []string{"testdata", "go.mod", "go.sum"} {
+			hostPath := filepath.Join(dir, name)
+			if _, err := os.Stat(hostPath); err != nil {
+				continue
+			}
+			devicePath := path.Join(deviceCwd, dir)
+			if err := adb("exec-out", "mkdir", "-p", devicePath); err != nil {
+				return err
+			}
+			if err := adb("push", hostPath, devicePath); err != nil {
+				return err
+			}
+		}
+		if subdir == "." {
+			break
+		}
+		subdir = filepath.Dir(subdir)
+		dir = path.Join(dir, "..")
+	}
+	return nil
+}
+
+// adbCopyGoroot clears deviceRoot for previous versions of GOROOT, GOPATH
+// and temporary data. Then, it copies relevant parts of GOROOT to the device,
+// including the go tool built for android.
+// A lock file ensures this only happens once, even with concurrent exec
+// wrappers.
+func adbCopyGoroot() error {
+	goTool, err := goTool()
+	if err != nil {
+		return err
+	}
+	cmd := exec.Command(goTool, "version")
+	cmd.Stderr = os.Stderr
+	out, err := cmd.Output()
+	if err != nil {
+		return fmt.Errorf("%v: %w", cmd, err)
+	}
+	goVersion := string(out)
+
+	// Also known by cmd/dist. The bootstrap command deletes the file.
+	statPath := filepath.Join(os.TempDir(), "go_android_exec-adb-sync-status")
+	stat, err := os.OpenFile(statPath, os.O_CREATE|os.O_RDWR, 0666)
+	if err != nil {
+		return err
+	}
+	defer stat.Close()
+	// Serialize check and copying.
+	if err := syscall.Flock(int(stat.Fd()), syscall.LOCK_EX); err != nil {
+		return err
+	}
+	s, err := io.ReadAll(stat)
+	if err != nil {
+		return err
+	}
+	if string(s) == goVersion {
+		return nil
+	}
+
+	goroot, err := findGoroot()
+	if err != nil {
+		return err
+	}
+
+	// Delete the device's GOROOT, GOPATH and any leftover test data,
+	// and recreate GOROOT.
+	if err := adb("exec-out", "rm", "-rf", deviceRoot); err != nil {
+		return err
+	}
+
+	// Build Go for Android.
+	cmd = exec.Command(goTool, "install", "cmd")
+	out, err = cmd.CombinedOutput()
+	if err != nil {
+		if len(bytes.TrimSpace(out)) > 0 {
+			log.Printf("\n%s", out)
+		}
+		return fmt.Errorf("%v: %w", cmd, err)
+	}
+	if err := adb("exec-out", "mkdir", "-p", deviceGoroot); err != nil {
+		return err
+	}
+
+	// Copy the Android tools from the relevant bin subdirectory to GOROOT/bin.
+	cmd = exec.Command(goTool, "list", "-f", "{{.Target}}", "cmd/go")
+	cmd.Stderr = os.Stderr
+	out, err = cmd.Output()
+	if err != nil {
+		return fmt.Errorf("%v: %w", cmd, err)
+	}
+	platformBin := filepath.Dir(string(bytes.TrimSpace(out)))
+	if platformBin == "." {
+		return errors.New("failed to locate cmd/go for target platform")
+	}
+	if err := adb("push", platformBin, path.Join(deviceGoroot, "bin")); err != nil {
+		return err
+	}
+
+	// Copy only the relevant subdirectories from pkg: pkg/include and the
+	// platform-native binaries in pkg/tool.
+	if err := adb("exec-out", "mkdir", "-p", path.Join(deviceGoroot, "pkg", "tool")); err != nil {
+		return err
+	}
+	if err := adb("push", filepath.Join(goroot, "pkg", "include"), path.Join(deviceGoroot, "pkg", "include")); err != nil {
+		return err
+	}
+
+	cmd = exec.Command(goTool, "list", "-f", "{{.Target}}", "cmd/compile")
+	cmd.Stderr = os.Stderr
+	out, err = cmd.Output()
+	if err != nil {
+		return fmt.Errorf("%v: %w", cmd, err)
+	}
+	platformToolDir := filepath.Dir(string(bytes.TrimSpace(out)))
+	if platformToolDir == "." {
+		return errors.New("failed to locate cmd/compile for target platform")
+	}
+	relToolDir, err := filepath.Rel(filepath.Join(goroot), platformToolDir)
+	if err != nil {
+		return err
+	}
+	if err := adb("push", platformToolDir, path.Join(deviceGoroot, relToolDir)); err != nil {
+		return err
+	}
+
+	// Copy all other files from GOROOT.
+	dirents, err := os.ReadDir(goroot)
+	if err != nil {
+		return err
+	}
+	for _, de := range dirents {
+		switch de.Name() {
+		case "bin", "pkg":
+			// We already created GOROOT/bin and GOROOT/pkg above; skip those.
+			continue
+		}
+		if err := adb("push", filepath.Join(goroot, de.Name()), path.Join(deviceGoroot, de.Name())); err != nil {
+			return err
+		}
+	}
+
+	if _, err := stat.WriteString(goVersion); err != nil {
+		return err
+	}
+	return nil
+}
+
+func findGoroot() (string, error) {
+	gorootOnce.Do(func() {
+		// If runtime.GOROOT reports a non-empty path, assume that it is valid.
+		// (It may be empty if this binary was built with -trimpath.)
+		gorootPath = runtime.GOROOT()
+		if gorootPath != "" {
+			return
+		}
+
+		// runtime.GOROOT is empty — perhaps go_android_exec was built with
+		// -trimpath and GOROOT is unset. Try 'go env GOROOT' as a fallback,
+		// assuming that the 'go' command in $PATH is the correct one.
+
+		cmd := exec.Command("go", "env", "GOROOT")
+		cmd.Stderr = os.Stderr
+		out, err := cmd.Output()
+		if err != nil {
+			gorootErr = fmt.Errorf("%v: %w", cmd, err)
+		}
+
+		gorootPath = string(bytes.TrimSpace(out))
+		if gorootPath == "" {
+			gorootErr = errors.New("GOROOT not found")
+		}
+	})
+
+	return gorootPath, gorootErr
+}
+
+func goTool() (string, error) {
+	goroot, err := findGoroot()
+	if err != nil {
+		return "", err
+	}
+	return filepath.Join(goroot, "bin", "go"), nil
+}
+
+var (
+	gorootOnce sync.Once
+	gorootPath string
+	gorootErr  error
+)
diff --git a/misc/reboot/experiment_toolid_test.go b/misc/reboot/experiment_toolid_test.go
deleted file mode 100644
index 87a828e..0000000
--- a/misc/reboot/experiment_toolid_test.go
+++ /dev/null
@@ -1,101 +0,0 @@
-// Copyright 2019 The Go 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:build explicit
-// +build explicit
-
-// Package experiment_toolid_test verifies that GOEXPERIMENT settings built
-// into the toolchain influence tool ids in the Go command.
-// This test requires bootstrapping the toolchain twice, so it's very expensive.
-// It must be run explicitly with -tags=explicit.
-// Verifies golang.org/issue/33091.
-package reboot_test
-
-import (
-	"bytes"
-	"os"
-	"os/exec"
-	"path/filepath"
-	"runtime"
-	"testing"
-)
-
-func TestExperimentToolID(t *testing.T) {
-	// Set up GOROOT
-	goroot, err := os.MkdirTemp("", "experiment-goroot")
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer os.RemoveAll(goroot)
-
-	gorootSrc := filepath.Join(goroot, "src")
-	if err := overlayDir(gorootSrc, filepath.Join(runtime.GOROOT(), "src")); err != nil {
-		t.Fatal(err)
-	}
-
-	if err := os.WriteFile(filepath.Join(goroot, "VERSION"), []byte("go1.999"), 0666); err != nil {
-		t.Fatal(err)
-	}
-	env := append(os.Environ(), "GOROOT=", "GOROOT_BOOTSTRAP="+runtime.GOROOT())
-
-	// Use a clean cache.
-	gocache, err := os.MkdirTemp("", "experiment-gocache")
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer os.RemoveAll(gocache)
-	env = append(env, "GOCACHE="+gocache)
-
-	// Build the toolchain without GOEXPERIMENT.
-	var makeScript string
-	switch runtime.GOOS {
-	case "windows":
-		makeScript = "make.bat"
-	case "plan9":
-		makeScript = "make.rc"
-	default:
-		makeScript = "make.bash"
-	}
-	makeScriptPath := filepath.Join(runtime.GOROOT(), "src", makeScript)
-	runCmd(t, gorootSrc, env, makeScriptPath)
-
-	// Verify compiler version string.
-	goCmdPath := filepath.Join(goroot, "bin", "go")
-	if runtime.GOOS == "windows" {
-		goCmdPath += ".exe"
-	}
-	gotVersion := bytes.TrimSpace(runCmd(t, gorootSrc, env, goCmdPath, "tool", "compile", "-V=full"))
-	wantVersion := []byte(`compile version go1.999`)
-	if !bytes.Equal(gotVersion, wantVersion) {
-		t.Errorf("compile version without experiment: got %q, want %q", gotVersion, wantVersion)
-	}
-
-	// Build a package in a mode not handled by the make script.
-	runCmd(t, gorootSrc, env, goCmdPath, "build", "-race", "archive/tar")
-
-	// Rebuild the toolchain with GOEXPERIMENT.
-	env = append(env, "GOEXPERIMENT=fieldtrack")
-	runCmd(t, gorootSrc, env, makeScriptPath)
-
-	// Verify compiler version string.
-	gotVersion = bytes.TrimSpace(runCmd(t, gorootSrc, env, goCmdPath, "tool", "compile", "-V=full"))
-	wantVersion = []byte(`compile version go1.999 X:fieldtrack,framepointer`)
-	if !bytes.Equal(gotVersion, wantVersion) {
-		t.Errorf("compile version with experiment: got %q, want %q", gotVersion, wantVersion)
-	}
-
-	// Build the same package. We should not get a cache conflict.
-	runCmd(t, gorootSrc, env, goCmdPath, "build", "-race", "archive/tar")
-}
-
-func runCmd(t *testing.T, dir string, env []string, path string, args ...string) []byte {
-	cmd := exec.Command(path, args...)
-	cmd.Dir = dir
-	cmd.Env = env
-	out, err := cmd.Output()
-	if err != nil {
-		t.Fatal(err)
-	}
-	return out
-}
diff --git a/misc/reboot/overlaydir_test.go b/misc/reboot/overlaydir_test.go
deleted file mode 100644
index 71faf09..0000000
--- a/misc/reboot/overlaydir_test.go
+++ /dev/null
@@ -1,85 +0,0 @@
-// Copyright 2019 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package reboot_test
-
-import (
-	"io"
-	"io/fs"
-	"os"
-	"path/filepath"
-	"strings"
-)
-
-// overlayDir makes a minimal-overhead copy of srcRoot in which new files may be added.
-//
-// TODO: Once we no longer need to support the misc module in GOPATH mode,
-// factor this function out into a package to reduce duplication.
-func overlayDir(dstRoot, srcRoot string) error {
-	dstRoot = filepath.Clean(dstRoot)
-	if err := os.MkdirAll(dstRoot, 0777); err != nil {
-		return err
-	}
-
-	srcRoot, err := filepath.Abs(srcRoot)
-	if err != nil {
-		return err
-	}
-
-	return filepath.WalkDir(srcRoot, func(srcPath string, entry fs.DirEntry, err error) error {
-		if err != nil || srcPath == srcRoot {
-			return err
-		}
-		if filepath.Base(srcPath) == "testdata" {
-			// We're just building, so no need to copy those.
-			return fs.SkipDir
-		}
-
-		suffix := strings.TrimPrefix(srcPath, srcRoot)
-		for len(suffix) > 0 && suffix[0] == filepath.Separator {
-			suffix = suffix[1:]
-		}
-		dstPath := filepath.Join(dstRoot, suffix)
-
-		info, err := entry.Info()
-		perm := info.Mode() & os.ModePerm
-		if info.Mode()&os.ModeSymlink != 0 {
-			info, err = os.Stat(srcPath)
-			if err != nil {
-				return err
-			}
-			perm = info.Mode() & os.ModePerm
-		}
-
-		// Always make copies of directories.
-		// If we add a file in the overlay, we don't want to add it in the original.
-		if info.IsDir() {
-			return os.MkdirAll(dstPath, perm|0200)
-		}
-
-		// If we can use a hard link, do that instead of copying bytes.
-		// Go builds don't like symlinks in some cases, such as go:embed.
-		if err := os.Link(srcPath, dstPath); err == nil {
-			return nil
-		}
-
-		// Otherwise, copy the bytes.
-		src, err := os.Open(srcPath)
-		if err != nil {
-			return err
-		}
-		defer src.Close()
-
-		dst, err := os.OpenFile(dstPath, os.O_WRONLY|os.O_CREATE|os.O_EXCL, perm)
-		if err != nil {
-			return err
-		}
-
-		_, err = io.Copy(dst, src)
-		if closeErr := dst.Close(); err == nil {
-			err = closeErr
-		}
-		return err
-	})
-}
diff --git a/misc/reboot/reboot_test.go b/misc/reboot/reboot_test.go
deleted file mode 100644
index a1b513b..0000000
--- a/misc/reboot/reboot_test.go
+++ /dev/null
@@ -1,70 +0,0 @@
-// Copyright 2019 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package reboot_test verifies that the current GOROOT can be used to bootstrap
-// itself.
-package reboot_test
-
-import (
-	"os"
-	"os/exec"
-	"path/filepath"
-	"runtime"
-	"testing"
-	"time"
-)
-
-func TestRepeatBootstrap(t *testing.T) {
-	if testing.Short() {
-		t.Skipf("skipping test that rebuilds the entire toolchain")
-	}
-
-	realGoroot, err := filepath.Abs(filepath.Join("..", ".."))
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	// To ensure that bootstrapping doesn't unexpectedly depend
-	// on the Go repo's git metadata, add a fake (unreadable) git
-	// directory above the simulated GOROOT.
-	// This mimics the configuration one much have when
-	// building from distro-packaged source code
-	// (see https://go.dev/issue/54852).
-	parent := t.TempDir()
-	dotGit := filepath.Join(parent, ".git")
-	if err := os.Mkdir(dotGit, 000); err != nil {
-		t.Fatal(err)
-	}
-	goroot := filepath.Join(parent, "goroot")
-
-	gorootSrc := filepath.Join(goroot, "src")
-	overlayStart := time.Now()
-	if err := overlayDir(gorootSrc, filepath.Join(realGoroot, "src")); err != nil {
-		t.Fatal(err)
-	}
-	t.Logf("GOROOT/src overlay set up in %s", time.Since(overlayStart))
-
-	if err := os.WriteFile(filepath.Join(goroot, "VERSION"), []byte(runtime.Version()), 0666); err != nil {
-		t.Fatal(err)
-	}
-
-	var makeScript string
-	switch runtime.GOOS {
-	case "windows":
-		makeScript = "make.bat"
-	case "plan9":
-		makeScript = "make.rc"
-	default:
-		makeScript = "make.bash"
-	}
-
-	cmd := exec.Command(filepath.Join(goroot, "src", makeScript))
-	cmd.Dir = gorootSrc
-	cmd.Env = append(cmd.Environ(), "GOROOT=", "GOROOT_BOOTSTRAP="+realGoroot)
-	cmd.Stderr = os.Stderr
-	cmd.Stdout = os.Stdout
-	if err := cmd.Run(); err != nil {
-		t.Fatal(err)
-	}
-}
diff --git a/misc/swig/callback/callback.cc b/misc/swig/callback/callback.cc
deleted file mode 100644
index 88bd49c..0000000
--- a/misc/swig/callback/callback.cc
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright 2013 The Go 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 .cc file will be automatically compiled by the go tool and
-// included in the package.
-
-#include <string>
-#include "callback.h"
-
-std::string Caller::call() {
-	if (callback_ != 0)
-		return callback_->run();
-	return "";
-}
diff --git a/misc/swig/callback/callback.go b/misc/swig/callback/callback.go
deleted file mode 100644
index 0d6e97f..0000000
--- a/misc/swig/callback/callback.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 callback
-
-type GoCallback struct{}
-
-func (p *GoCallback) Run() string {
-	return "GoCallback.Run"
-}
diff --git a/misc/swig/callback/callback.swigcxx b/misc/swig/callback/callback.swigcxx
deleted file mode 100644
index 6181fe9..0000000
--- a/misc/swig/callback/callback.swigcxx
+++ /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.  */
-
-/* An example of writing a C++ virtual function in Go.  */
-
-%module(directors="1") callback
-
-%{
-#include <string>
-#include "callback.h"
-%}
-
-%include "std_string.i"
-
-%feature("director");
-
-%include "callback.h"
diff --git a/misc/swig/callback/callback_test.go b/misc/swig/callback/callback_test.go
deleted file mode 100644
index 0c8a300..0000000
--- a/misc/swig/callback/callback_test.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.
-
-package callback
-
-import (
-	"testing"
-)
-
-func TestCall(t *testing.T) {
-	c := NewCaller()
-	cb := NewCallback()
-
-	c.SetCallback(cb)
-	s := c.Call()
-	if s != "Callback::run" {
-		t.Errorf("unexpected string from Call: %q", s)
-	}
-	c.DelCallback()
-}
-
-func TestCallback(t *testing.T) {
-	c := NewCaller()
-	cb := NewDirectorCallback(&GoCallback{})
-	c.SetCallback(cb)
-	s := c.Call()
-	if s != "GoCallback.Run" {
-		t.Errorf("unexpected string from Call with callback: %q", s)
-	}
-	c.DelCallback()
-	DeleteDirectorCallback(cb)
-}
diff --git a/misc/swig/stdio/file.go b/misc/swig/stdio/file.go
deleted file mode 100644
index a582f77..0000000
--- a/misc/swig/stdio/file.go
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright 2017 The Go 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 here just to cause problems.
-// file.swig turns into a file also named file.go.
-// Make sure cmd/go keeps them separate
-// when both are passed to cgo.
-
-package file
-
-//int F(void) { return 1; }
-import "C"
-
-func F() int { return int(C.F()) }
diff --git a/misc/swig/stdio/file_test.go b/misc/swig/stdio/file_test.go
deleted file mode 100644
index aea92aa..0000000
--- a/misc/swig/stdio/file_test.go
+++ /dev/null
@@ -1,28 +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 file
-
-import "testing"
-
-// Open this file itself and verify that the first few characters are
-// as expected.
-func TestRead(t *testing.T) {
-	f := Fopen("file_test.go", "r")
-	if f.Swigcptr() == 0 {
-		t.Fatal("fopen failed")
-	}
-	if Fgetc(f) != '/' || Fgetc(f) != '/' || Fgetc(f) != ' ' || Fgetc(f) != 'C' {
-		t.Error("read unexpected characters")
-	}
-	if Fclose(f) != 0 {
-		t.Error("fclose failed")
-	}
-}
-
-func TestF(t *testing.T) {
-	if x := F(); x != 1 {
-		t.Fatalf("x = %d, want 1", x)
-	}
-}
diff --git a/misc/wasm/go_js_wasm_exec b/misc/wasm/go_js_wasm_exec
index fcbd0e4..ff59257 100755
--- a/misc/wasm/go_js_wasm_exec
+++ b/misc/wasm/go_js_wasm_exec
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/usr/bin/env bash
 # Copyright 2018 The Go Authors. All rights reserved.
 # Use of this source code is governed by a BSD-style
 # license that can be found in the LICENSE file.
@@ -11,4 +11,7 @@
 done
 DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
 
-exec node "$DIR/wasm_exec_node.js" "$@"
+# Increase the V8 stack size from the default of 984K
+# to 8192K to ensure all tests can pass without hitting
+# stack size limits.
+exec node --stack-size=8192 "$DIR/wasm_exec_node.js" "$@"
diff --git a/misc/wasm/go_wasip1_wasm_exec b/misc/wasm/go_wasip1_wasm_exec
new file mode 100755
index 0000000..0351994
--- /dev/null
+++ b/misc/wasm/go_wasip1_wasm_exec
@@ -0,0 +1,23 @@
+#!/usr/bin/env bash
+# Copyright 2023 The Go Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style
+# license that can be found in the LICENSE file.
+
+case "$GOWASIRUNTIME" in
+	"wasmedge")
+		exec wasmedge --dir=/ --env PWD="$PWD" --env PATH="$PATH" ${GOWASIRUNTIMEARGS:-} "$1" "${@:2}"
+		;;
+	"wasmer")
+		exec wasmer run --dir=/ --env PWD="$PWD" --env PATH="$PATH" ${GOWASIRUNTIMEARGS:-} "$1" -- "${@:2}"
+		;;
+	"wazero")
+		exec wazero run -mount /:/ -env-inherit -cachedir "${TMPDIR:-/tmp}"/wazero ${GOWASIRUNTIMEARGS:-} "$1" "${@:2}"
+		;;
+	"wasmtime" | "")
+		exec wasmtime run --dir=/ --env PWD="$PWD" --env PATH="$PATH" --max-wasm-stack 1048576 ${GOWASIRUNTIMEARGS:-} "$1" -- "${@:2}"
+		;;
+	*)
+		echo "Unknown Go WASI runtime specified: $GOWASIRUNTIME"
+		exit 1
+		;;
+esac
diff --git a/misc/wasm/wasm_exec.js b/misc/wasm/wasm_exec.js
index e6c8921..bc6f210 100644
--- a/misc/wasm/wasm_exec.js
+++ b/misc/wasm/wasm_exec.js
@@ -113,6 +113,10 @@
 				this.mem.setUint32(addr + 4, Math.floor(v / 4294967296), true);
 			}
 
+			const setInt32 = (addr, v) => {
+				this.mem.setUint32(addr + 0, v, true);
+			}
+
 			const getInt64 = (addr) => {
 				const low = this.mem.getUint32(addr + 0, true);
 				const high = this.mem.getInt32(addr + 4, true);
@@ -206,7 +210,10 @@
 
 			const timeOrigin = Date.now() - performance.now();
 			this.importObject = {
-				go: {
+				_gotest: {
+					add: (a, b) => a + b,
+				},
+				gojs: {
 					// Go's SP does not change as long as no Go code is running. Some operations (e.g. calls, getters and setters)
 					// may synchronously trigger a Go event handler. This makes Go code get executed in the middle of the imported
 					// function. A goroutine can switch to a new stack if the current stack is too small (see morestack function).
@@ -269,7 +276,7 @@
 									this._resume();
 								}
 							},
-							getInt64(sp + 8) + 1, // setTimeout has been seen to fire up to 1 millisecond early
+							getInt64(sp + 8),
 						));
 						this.mem.setInt32(sp + 16, id, true);
 					},
diff --git a/misc/wasm/wasm_exec_node.js b/misc/wasm/wasm_exec_node.js
index f9200ca..9860690 100644
--- a/misc/wasm/wasm_exec_node.js
+++ b/misc/wasm/wasm_exec_node.js
@@ -14,19 +14,9 @@
 globalThis.TextEncoder = require("util").TextEncoder;
 globalThis.TextDecoder = require("util").TextDecoder;
 
-globalThis.performance = {
-	now() {
-		const [sec, nsec] = process.hrtime();
-		return sec * 1000 + nsec / 1000000;
-	},
-};
+globalThis.performance ??= require("performance");
 
-const crypto = require("crypto");
-globalThis.crypto = {
-	getRandomValues(b) {
-		crypto.randomFillSync(b);
-	},
-};
+globalThis.crypto ??= require("crypto");
 
 require("./wasm_exec");
 
diff --git a/src/README.vendor b/src/README.vendor
index 4b6bdb8..43821b2 100644
--- a/src/README.vendor
+++ b/src/README.vendor
@@ -38,7 +38,7 @@
 A typical sequence might be:
 
     cd src
-    go get golang.org/x/net@latest
+    go get golang.org/x/net@master
     go mod tidy
     go mod vendor
 
diff --git a/src/all.bash b/src/all.bash
index 5d994d3..5f8e8fe 100755
--- a/src/all.bash
+++ b/src/all.bash
@@ -8,8 +8,6 @@
 	echo 'all.bash must be run from $GOROOT/src' 1>&2
 	exit 1
 fi
-OLDPATH="$PATH"
 . ./make.bash "$@" --no-banner
 bash run.bash --no-rebuild
-PATH="$OLDPATH"
 $GOTOOLDIR/dist banner  # print build info
diff --git a/src/all.bat b/src/all.bat
index dfc83c8..d5abec1 100644
--- a/src/all.bat
+++ b/src/all.bat
@@ -12,15 +12,10 @@
 goto end

 :ok

 

-set OLDPATH=%PATH%

 call .\make.bat --no-banner --no-local

 if %GOBUILDFAIL%==1 goto end

 call .\run.bat --no-rebuild --no-local

 if %GOBUILDFAIL%==1 goto end

-:: we must restore %PATH% before running "dist banner" so that the latter

-:: can get the original %PATH% and give suggestion to add %GOROOT%/bin

-:: to %PATH% if necessary.

-set PATH=%OLDPATH%

 "%GOTOOLDIR%/dist" banner

 

 :end

diff --git a/src/archive/tar/common.go b/src/archive/tar/common.go
index 38216ac..dc9d350 100644
--- a/src/archive/tar/common.go
+++ b/src/archive/tar/common.go
@@ -607,6 +607,10 @@
 	return mode
 }
 
+func (fi headerFileInfo) String() string {
+	return fs.FormatFileInfo(fi)
+}
+
 // sysStat, if non-nil, populates h from system-dependent fields of fi.
 var sysStat func(fi fs.FileInfo, h *Header) error
 
diff --git a/src/archive/tar/reader.go b/src/archive/tar/reader.go
index 768ca19..cfa5044 100644
--- a/src/archive/tar/reader.go
+++ b/src/archive/tar/reader.go
@@ -57,8 +57,11 @@
 	}
 	hdr, err := tr.next()
 	tr.err = err
-	if err == nil && tarinsecurepath.Value() == "0" && !filepath.IsLocal(hdr.Name) {
-		err = ErrInsecurePath
+	if err == nil && !filepath.IsLocal(hdr.Name) {
+		if tarinsecurepath.Value() == "0" {
+			tarinsecurepath.IncNonDefault()
+			err = ErrInsecurePath
+		}
 	}
 	return hdr, err
 }
diff --git a/src/archive/zip/reader.go b/src/archive/zip/reader.go
index a1554d2..1fde1de 100644
--- a/src/archive/zip/reader.go
+++ b/src/archive/zip/reader.go
@@ -66,6 +66,14 @@
 }
 
 // OpenReader will open the Zip file specified by name and return a ReadCloser.
+//
+// If any file inside the archive uses a non-local name
+// (as defined by [filepath.IsLocal]) or a name containing backslashes
+// and the GODEBUG environment variable contains `zipinsecurepath=0`,
+// OpenReader returns the reader with an ErrInsecurePath error.
+// A future version of Go may introduce this behavior by default.
+// Programs that want to accept non-local names can ignore
+// the ErrInsecurePath error and use the returned reader.
 func OpenReader(name string) (*ReadCloser, error) {
 	f, err := os.Open(name)
 	if err != nil {
@@ -77,12 +85,12 @@
 		return nil, err
 	}
 	r := new(ReadCloser)
-	if err := r.init(f, fi.Size()); err != nil {
+	if err = r.init(f, fi.Size()); err != nil && err != ErrInsecurePath {
 		f.Close()
 		return nil, err
 	}
 	r.f = f
-	return r, nil
+	return r, err
 }
 
 // NewReader returns a new Reader reading from r, which is assumed to
@@ -100,45 +108,32 @@
 		return nil, errors.New("zip: size cannot be negative")
 	}
 	zr := new(Reader)
-	if err := zr.init(r, size); err != nil {
+	var err error
+	if err = zr.init(r, size); err != nil && err != ErrInsecurePath {
 		return nil, err
 	}
-	for _, f := range zr.File {
-		if f.Name == "" {
-			// Zip permits an empty file name field.
-			continue
-		}
-		if zipinsecurepath.Value() != "0" {
-			continue
-		}
-		// The zip specification states that names must use forward slashes,
-		// so consider any backslashes in the name insecure.
-		if !filepath.IsLocal(f.Name) || strings.Contains(f.Name, `\`) {
-			return zr, ErrInsecurePath
-		}
-	}
-	return zr, nil
+	return zr, err
 }
 
-func (z *Reader) init(r io.ReaderAt, size int64) error {
-	end, baseOffset, err := readDirectoryEnd(r, size)
+func (r *Reader) init(rdr io.ReaderAt, size int64) error {
+	end, baseOffset, err := readDirectoryEnd(rdr, size)
 	if err != nil {
 		return err
 	}
-	z.r = r
-	z.baseOffset = baseOffset
+	r.r = rdr
+	r.baseOffset = baseOffset
 	// Since the number of directory records is not validated, it is not
-	// safe to preallocate z.File without first checking that the specified
+	// safe to preallocate r.File without first checking that the specified
 	// number of files is reasonable, since a malformed archive may
 	// indicate it contains up to 1 << 128 - 1 files. Since each file has a
 	// header which will be _at least_ 30 bytes we can safely preallocate
 	// if (data size / 30) >= end.directoryRecords.
 	if end.directorySize < uint64(size) && (uint64(size)-end.directorySize)/30 >= end.directoryRecords {
-		z.File = make([]*File, 0, end.directoryRecords)
+		r.File = make([]*File, 0, end.directoryRecords)
 	}
-	z.Comment = end.comment
-	rs := io.NewSectionReader(r, 0, size)
-	if _, err = rs.Seek(z.baseOffset+int64(end.directoryOffset), io.SeekStart); err != nil {
+	r.Comment = end.comment
+	rs := io.NewSectionReader(rdr, 0, size)
+	if _, err = rs.Seek(r.baseOffset+int64(end.directoryOffset), io.SeekStart); err != nil {
 		return err
 	}
 	buf := bufio.NewReader(rs)
@@ -148,51 +143,51 @@
 	// a bad one, and then only report an ErrFormat or UnexpectedEOF if
 	// the file count modulo 65536 is incorrect.
 	for {
-		f := &File{zip: z, zipr: r}
+		f := &File{zip: r, zipr: rdr}
 		err = readDirectoryHeader(f, buf)
-
-		// For compatibility with other zip programs,
-		// if we have a non-zero base offset and can't read
-		// the first directory header, try again with a zero
-		// base offset.
-		if err == ErrFormat && z.baseOffset != 0 && len(z.File) == 0 {
-			z.baseOffset = 0
-			if _, err = rs.Seek(int64(end.directoryOffset), io.SeekStart); err != nil {
-				return err
-			}
-			buf.Reset(rs)
-			continue
-		}
-
 		if err == ErrFormat || err == io.ErrUnexpectedEOF {
 			break
 		}
 		if err != nil {
 			return err
 		}
-		f.headerOffset += z.baseOffset
-		z.File = append(z.File, f)
+		f.headerOffset += r.baseOffset
+		r.File = append(r.File, f)
 	}
-	if uint16(len(z.File)) != uint16(end.directoryRecords) { // only compare 16 bits here
+	if uint16(len(r.File)) != uint16(end.directoryRecords) { // only compare 16 bits here
 		// Return the readDirectoryHeader error if we read
 		// the wrong number of directory entries.
 		return err
 	}
+	if zipinsecurepath.Value() == "0" {
+		for _, f := range r.File {
+			if f.Name == "" {
+				// Zip permits an empty file name field.
+				continue
+			}
+			// The zip specification states that names must use forward slashes,
+			// so consider any backslashes in the name insecure.
+			if !filepath.IsLocal(f.Name) || strings.Contains(f.Name, `\`) {
+				zipinsecurepath.IncNonDefault()
+				return ErrInsecurePath
+			}
+		}
+	}
 	return nil
 }
 
 // RegisterDecompressor registers or overrides a custom decompressor for a
 // specific method ID. If a decompressor for a given method is not found,
 // Reader will default to looking up the decompressor at the package level.
-func (z *Reader) RegisterDecompressor(method uint16, dcomp Decompressor) {
-	if z.decompressors == nil {
-		z.decompressors = make(map[uint16]Decompressor)
+func (r *Reader) RegisterDecompressor(method uint16, dcomp Decompressor) {
+	if r.decompressors == nil {
+		r.decompressors = make(map[uint16]Decompressor)
 	}
-	z.decompressors[method] = dcomp
+	r.decompressors[method] = dcomp
 }
 
-func (z *Reader) decompressor(method uint16) Decompressor {
-	dcomp := z.decompressors[method]
+func (r *Reader) decompressor(method uint16) Decompressor {
+	dcomp := r.decompressors[method]
 	if dcomp == nil {
 		dcomp = decompressor(method)
 	}
@@ -620,12 +615,31 @@
 		}
 	}
 
+	maxInt64 := uint64(1<<63 - 1)
+	if d.directorySize > maxInt64 || d.directoryOffset > maxInt64 {
+		return nil, 0, ErrFormat
+	}
+
 	baseOffset = directoryEndOffset - int64(d.directorySize) - int64(d.directoryOffset)
 
 	// Make sure directoryOffset points to somewhere in our file.
 	if o := baseOffset + int64(d.directoryOffset); o < 0 || o >= size {
 		return nil, 0, ErrFormat
 	}
+
+	// If the directory end data tells us to use a non-zero baseOffset,
+	// but we would find a valid directory entry if we assume that the
+	// baseOffset is 0, then just use a baseOffset of 0.
+	// We've seen files in which the directory end data gives us
+	// an incorrect baseOffset.
+	if baseOffset > 0 {
+		off := int64(d.directoryOffset)
+		rs := io.NewSectionReader(r, off, size-off)
+		if readDirectoryHeader(&File{}, rs) == nil {
+			baseOffset = 0
+		}
+	}
+
 	return d, baseOffset, nil
 }
 
@@ -739,14 +753,14 @@
 	fs.DirEntry
 }
 
-func (e *fileListEntry) stat() (fileInfoDirEntry, error) {
-	if e.isDup {
-		return nil, errors.New(e.name + ": duplicate entries in zip file")
+func (f *fileListEntry) stat() (fileInfoDirEntry, error) {
+	if f.isDup {
+		return nil, errors.New(f.name + ": duplicate entries in zip file")
 	}
-	if !e.isDir {
-		return headerFileInfo{&e.file.FileHeader}, nil
+	if !f.isDir {
+		return headerFileInfo{&f.file.FileHeader}, nil
 	}
-	return e, nil
+	return f, nil
 }
 
 // Only used for directories.
@@ -766,6 +780,10 @@
 
 func (f *fileListEntry) Info() (fs.FileInfo, error) { return f, nil }
 
+func (f *fileListEntry) String() string {
+	return fs.FormatDirEntry(f)
+}
+
 // toValidName coerces name to be a valid name for fs.FS.Open.
 func toValidName(name string) string {
 	name = strings.ReplaceAll(name, `\`, `/`)
diff --git a/src/archive/zip/reader_test.go b/src/archive/zip/reader_test.go
index 1594b26..a67c335 100644
--- a/src/archive/zip/reader_test.go
+++ b/src/archive/zip/reader_test.go
@@ -127,6 +127,24 @@
 		},
 	},
 	{
+		Name:    "test-badbase.zip",
+		Comment: "This is a zipfile comment.",
+		File: []ZipTestFile{
+			{
+				Name:     "test.txt",
+				Content:  []byte("This is a test text file.\n"),
+				Modified: time.Date(2010, 9, 5, 12, 12, 1, 0, timeZone(+10*time.Hour)),
+				Mode:     0644,
+			},
+			{
+				Name:     "gophercolor16x16.png",
+				File:     "gophercolor16x16.png",
+				Modified: time.Date(2010, 9, 5, 15, 52, 58, 0, timeZone(+10*time.Hour)),
+				Mode:     0644,
+			},
+		},
+	},
+	{
 		Name:   "r.zip",
 		Source: returnRecursiveZip,
 		File: []ZipTestFile{
@@ -1334,6 +1352,62 @@
 	}
 }
 
+func TestOpenReaderInsecurePath(t *testing.T) {
+	t.Setenv("GODEBUG", "zipinsecurepath=0")
+	// Archive containing only the file "../test.txt"
+	data := []byte{
+		0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00,
+		0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+		0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x2e, 0x2e,
+		0x2f, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x74, 0x78,
+		0x74, 0x0a, 0xc9, 0xc8, 0x2c, 0x56, 0xc8, 0x2c,
+		0x56, 0x48, 0x54, 0x28, 0x49, 0x2d, 0x2e, 0x51,
+		0x28, 0x49, 0xad, 0x28, 0x51, 0x48, 0xcb, 0xcc,
+		0x49, 0xd5, 0xe3, 0x02, 0x04, 0x00, 0x00, 0xff,
+		0xff, 0x50, 0x4b, 0x07, 0x08, 0xc0, 0xd7, 0xed,
+		0xc3, 0x20, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00,
+		0x00, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x00, 0x14,
+		0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
+		0x00, 0xc0, 0xd7, 0xed, 0xc3, 0x20, 0x00, 0x00,
+		0x00, 0x1a, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00,
+		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2e,
+		0x2e, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x74,
+		0x78, 0x74, 0x50, 0x4b, 0x05, 0x06, 0x00, 0x00,
+		0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x39, 0x00,
+		0x00, 0x00, 0x59, 0x00, 0x00, 0x00, 0x00, 0x00,
+	}
+
+	// Read in the archive with the OpenReader interface
+	name := filepath.Join(t.TempDir(), "test.zip")
+	err := os.WriteFile(name, data, 0644)
+	if err != nil {
+		t.Fatalf("Unable to write out the bugos zip entry")
+	}
+	r, err := OpenReader(name)
+	if r != nil {
+		defer r.Close()
+	}
+
+	if err != ErrInsecurePath {
+		t.Fatalf("Error reading the archive, we expected ErrInsecurePath but got: %v", err)
+	}
+	_, err = r.Open("test.txt")
+	if err != nil {
+		t.Errorf("Error reading file: %v", err)
+	}
+	if len(r.File) != 1 {
+		t.Fatalf("No entries in the file list")
+	}
+	if r.File[0].Name != "../test.txt" {
+		t.Errorf("Unexpected entry name: %s", r.File[0].Name)
+	}
+	if _, err := r.File[0].Open(); err != nil {
+		t.Errorf("Error opening file: %v", err)
+	}
+}
+
 func TestCVE202133196(t *testing.T) {
 	// Archive that indicates it has 1 << 128 -1 files,
 	// this would previously cause a panic due to attempting
@@ -1711,3 +1785,44 @@
 		}
 	}
 }
+
+func TestBaseOffsetPlusOverflow(t *testing.T) {
+	// directoryOffset > maxInt64 && size-directoryOffset < 0
+	data := []byte{
+		0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+		0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+		0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+		0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+		0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+		0xff, 0xff, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+		0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+		0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+		0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+		0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+		0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+		0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+		0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+		0x20, 0x20, 0x20, 0x50, 0x4b, 0x06, 0x06, 0x20,
+		0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+		0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+		0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+		0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+		0x20, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00,
+		0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x00, 0x00,
+		0x00, 0x00, 0x80, 0x50, 0x4b, 0x06, 0x07, 0x00,
+		0x00, 0x00, 0x00, 0x6b, 0x00, 0x00, 0x00, 0x00,
+		0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x50,
+		0x4b, 0x05, 0x06, 0x20, 0x20, 0x20, 0x20, 0xff,
+		0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+		0xff, 0xff, 0xff, 0x20, 0x00,
+	}
+	defer func() {
+		if r := recover(); r != nil {
+			t.Fatalf("NewReader panicked: %s", r)
+		}
+	}()
+	// Previously, this would trigger a panic as we attempt to read from
+	// a io.SectionReader which would access a slice at a negative offset
+	// as the section reader offset & size were < 0.
+	NewReader(bytes.NewReader(data), int64(len(data))+1875)
+}
diff --git a/src/archive/zip/struct.go b/src/archive/zip/struct.go
index 9c37084..9a8e67c 100644
--- a/src/archive/zip/struct.go
+++ b/src/archive/zip/struct.go
@@ -67,7 +67,7 @@
 	//
 	// IDs 0..31 are reserved for official use by PKWARE.
 	// IDs above that range are defined by third-party vendors.
-	// Since ZIP lacked high precision timestamps (nor a official specification
+	// Since ZIP lacked high precision timestamps (nor an official specification
 	// of the timezone used for the date fields), many competing extra fields
 	// have been invented. Pervasive use effectively makes them "official".
 	//
@@ -190,6 +190,10 @@
 
 func (fi headerFileInfo) Info() (fs.FileInfo, error) { return fi, nil }
 
+func (fi headerFileInfo) String() string {
+	return fs.FormatFileInfo(fi)
+}
+
 // FileInfoHeader creates a partially-populated FileHeader from an
 // fs.FileInfo.
 // Because fs.FileInfo's Name method returns only the base name of
@@ -338,8 +342,8 @@
 	return h.CompressedSize64 >= uint32max || h.UncompressedSize64 >= uint32max
 }
 
-func (f *FileHeader) hasDataDescriptor() bool {
-	return f.Flags&0x8 != 0
+func (h *FileHeader) hasDataDescriptor() bool {
+	return h.Flags&0x8 != 0
 }
 
 func msdosModeToFileMode(m uint32) (mode fs.FileMode) {
diff --git a/src/archive/zip/testdata/test-badbase.zip b/src/archive/zip/testdata/test-badbase.zip
new file mode 100644
index 0000000..245a62c
--- /dev/null
+++ b/src/archive/zip/testdata/test-badbase.zip
Binary files differ
diff --git a/src/archive/zip/zip_test.go b/src/archive/zip/zip_test.go
index a4b952e..7d1de07 100644
--- a/src/archive/zip/zip_test.go
+++ b/src/archive/zip/zip_test.go
@@ -30,7 +30,7 @@
 	for i := 0; i < nFiles; i++ {
 		_, err := w.CreateHeader(&FileHeader{
 			Name:   fmt.Sprintf("%d.dat", i),
-			Method: Store, // avoid Issue 6136 and Issue 6138
+			Method: Store, // Deflate is too slow when it is compiled with -race flag
 		})
 		if err != nil {
 			t.Fatalf("creating file %d: %v", i, err)
diff --git a/src/bootstrap.bash b/src/bootstrap.bash
index 1e4f1c5..5a97d52 100755
--- a/src/bootstrap.bash
+++ b/src/bootstrap.bash
@@ -21,10 +21,16 @@
 set -e
 
 if [ "$GOOS" = "" -o "$GOARCH" = "" ]; then
-	echo "usage: GOOS=os GOARCH=arch ./bootstrap.bash" >&2
+	echo "usage: GOOS=os GOARCH=arch ./bootstrap.bash [-force]" >&2
 	exit 2
 fi
 
+forceflag=""
+if [ "$1" = "-force" ]; then
+	forceflag=-force
+	shift
+fi
+
 targ="../../go-${GOOS}-${GOARCH}-bootstrap"
 if [ -e $targ ]; then
 	echo "$targ already exists; remove before continuing"
@@ -47,7 +53,7 @@
 echo "#### Building $targ"
 echo
 cd src
-./make.bash --no-banner
+./make.bash --no-banner $forceflag
 gohostos="$(../bin/go env GOHOSTOS)"
 gohostarch="$(../bin/go env GOHOSTARCH)"
 goos="$(../bin/go env GOOS)"
diff --git a/src/bufio/bufio.go b/src/bufio/bufio.go
index 5a88def..8469b9e 100644
--- a/src/bufio/bufio.go
+++ b/src/bufio/bufio.go
@@ -70,7 +70,14 @@
 // the buffered reader to read from r.
 // Calling Reset on the zero value of Reader initializes the internal buffer
 // to the default size.
+// Calling b.Reset(b) (that is, resetting a Reader to itself) does nothing.
 func (b *Reader) Reset(r io.Reader) {
+	// If a Reader r is passed to NewReader, NewReader will return r.
+	// Different layers of code may do that, and then later pass r
+	// to Reset. Avoid infinite recursion in that case.
+	if b == r {
+		return
+	}
 	if b.buf == nil {
 		b.buf = make([]byte, defaultBufSize)
 	}
@@ -608,7 +615,14 @@
 // resets b to write its output to w.
 // Calling Reset on the zero value of Writer initializes the internal buffer
 // to the default size.
+// Calling w.Reset(w) (that is, resetting a Writer to itself) does nothing.
 func (b *Writer) Reset(w io.Writer) {
+	// If a Writer w is passed to NewWriter, NewWriter will return w.
+	// Different layers of code may do that, and then later pass w
+	// to Reset. Avoid infinite recursion in that case.
+	if b == w {
+		return
+	}
 	if b.buf == nil {
 		b.buf = make([]byte, defaultBufSize)
 	}
diff --git a/src/bufio/bufio_test.go b/src/bufio/bufio_test.go
index 64ccd02..a8c1e50 100644
--- a/src/bufio/bufio_test.go
+++ b/src/bufio/bufio_test.go
@@ -1482,6 +1482,17 @@
 }
 
 func TestReaderReset(t *testing.T) {
+	checkAll := func(r *Reader, want string) {
+		t.Helper()
+		all, err := io.ReadAll(r)
+		if err != nil {
+			t.Fatal(err)
+		}
+		if string(all) != want {
+			t.Errorf("ReadAll returned %q, want %q", all, want)
+		}
+	}
+
 	r := NewReader(strings.NewReader("foo foo"))
 	buf := make([]byte, 3)
 	r.Read(buf)
@@ -1490,27 +1501,23 @@
 	}
 
 	r.Reset(strings.NewReader("bar bar"))
-	all, err := io.ReadAll(r)
-	if err != nil {
-		t.Fatal(err)
-	}
-	if string(all) != "bar bar" {
-		t.Errorf("ReadAll = %q; want bar bar", all)
-	}
+	checkAll(r, "bar bar")
 
 	*r = Reader{} // zero out the Reader
 	r.Reset(strings.NewReader("bar bar"))
-	all, err = io.ReadAll(r)
-	if err != nil {
-		t.Fatal(err)
-	}
-	if string(all) != "bar bar" {
-		t.Errorf("ReadAll = %q; want bar bar", all)
-	}
+	checkAll(r, "bar bar")
+
+	// Wrap a reader and then Reset to that reader.
+	r.Reset(strings.NewReader("recur"))
+	r2 := NewReader(r)
+	checkAll(r2, "recur")
+	r.Reset(strings.NewReader("recur2"))
+	r2.Reset(r)
+	checkAll(r2, "recur2")
 }
 
 func TestWriterReset(t *testing.T) {
-	var buf1, buf2, buf3 strings.Builder
+	var buf1, buf2, buf3, buf4, buf5 strings.Builder
 	w := NewWriter(&buf1)
 	w.WriteString("foo")
 
@@ -1534,6 +1541,22 @@
 	if buf3.String() != "bar" {
 		t.Errorf("buf3 = %q; want bar", buf3.String())
 	}
+
+	// Wrap a writer and then Reset to that writer.
+	w.Reset(&buf4)
+	w2 := NewWriter(w)
+	w2.WriteString("recur")
+	w2.Flush()
+	if buf4.String() != "recur" {
+		t.Errorf("buf4 = %q, want %q", buf4.String(), "recur")
+	}
+	w.Reset(&buf5)
+	w2.Reset(w)
+	w2.WriteString("recur2")
+	w2.Flush()
+	if buf5.String() != "recur2" {
+		t.Errorf("buf5 = %q, want %q", buf5.String(), "recur2")
+	}
 }
 
 func TestReaderDiscard(t *testing.T) {
diff --git a/src/buildall.bash b/src/buildall.bash
index e4e3ec3..4e9b15b 100755
--- a/src/buildall.bash
+++ b/src/buildall.bash
@@ -36,7 +36,8 @@
 GOROOT="$(cd .. && pwd)"
 
 gettargets() {
-	../bin/go tool dist list | sed -e 's|/|-|'
+	../bin/go tool dist list | sed -e 's|/|-|' |
+		egrep -v '^(android|ios)' # need C toolchain even for cross-compiling
 	echo linux-arm-arm5
 }
 
diff --git a/src/builtin/builtin.go b/src/builtin/builtin.go
index 7feb209..da0ace1 100644
--- a/src/builtin/builtin.go
+++ b/src/builtin/builtin.go
@@ -10,6 +10,8 @@
 */
 package builtin
 
+import "cmp"
+
 // bool is the set of boolean values, true and false.
 type bool bool
 
@@ -206,6 +208,18 @@
 //	unbuffered.
 func make(t Type, size ...IntegerType) Type
 
+// The max built-in function returns the largest value of a fixed number of
+// arguments of [cmp.Ordered] types. There must be at least one argument.
+// If T is a floating-point type and any of the arguments are NaNs,
+// max will return NaN.
+func max[T cmp.Ordered](x T, y ...T) T
+
+// The min built-in function returns the smallest value of a fixed number of
+// arguments of [cmp.Ordered] types. There must be at least one argument.
+// If T is a floating-point type and any of the arguments are NaNs,
+// min will return NaN.
+func min[T cmp.Ordered](x T, y ...T) T
+
 // 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.
@@ -227,6 +241,15 @@
 // the type of c.
 func imag(c ComplexType) FloatType
 
+// The clear built-in function clears maps and slices.
+// For maps, clear deletes all entries, resulting in an empty map.
+// For slices, clear sets all elements up to the length of the slice
+// to the zero value of the respective element type. If the argument
+// type is a type parameter, the type parameter's type set must
+// contain only map or slice types, and clear performs the operation
+// implied by the type argument.
+func clear[T ~[]Type | ~map[Type]Type1](t T)
+
 // 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
@@ -249,6 +272,10 @@
 // that point, the program is terminated with a non-zero exit code. This
 // termination sequence is called panicking and can be controlled by the
 // built-in function recover.
+//
+// Starting in Go 1.21, calling panic with a nil interface value or an
+// untyped nil causes a run-time error (a different panic).
+// The GODEBUG setting panicnil=1 disables the run-time error.
 func panic(v any)
 
 // The recover built-in function allows a program to manage behavior of a
diff --git a/src/bytes/buffer.go b/src/bytes/buffer.go
index ee83fd8..5a68188 100644
--- a/src/bytes/buffer.go
+++ b/src/bytes/buffer.go
@@ -53,6 +53,12 @@
 // so immediate changes to the slice will affect the result of future reads.
 func (b *Buffer) Bytes() []byte { return b.buf[b.off:] }
 
+// AvailableBuffer returns an empty buffer with b.Available() capacity.
+// This buffer is intended to be appended to and
+// passed to an immediately succeeding Write call.
+// The buffer is only valid until the next write operation on b.
+func (b *Buffer) AvailableBuffer() []byte { return b.buf[len(b.buf):] }
+
 // String returns the contents of the unread portion of the buffer
 // as a string. If the Buffer is a nil pointer, it returns "<nil>".
 //
@@ -76,6 +82,9 @@
 // total space allocated for the buffer's data.
 func (b *Buffer) Cap() int { return cap(b.buf) }
 
+// Available returns how many bytes are unused in the buffer.
+func (b *Buffer) Available() int { return cap(b.buf) - len(b.buf) }
+
 // Truncate discards all but the first n unread bytes from the buffer
 // but continues to use the same allocated storage.
 // It panics if n is negative or greater than the length of the buffer.
@@ -100,7 +109,7 @@
 	b.lastRead = opInvalid
 }
 
-// tryGrowByReslice is a inlineable version of grow for the fast-case where the
+// tryGrowByReslice is an inlineable version of grow for the fast-case where the
 // internal buffer only needs to be resliced.
 // It returns the index where bytes should be written and whether it succeeded.
 func (b *Buffer) tryGrowByReslice(n int) (int, bool) {
diff --git a/src/bytes/buffer_test.go b/src/bytes/buffer_test.go
index c085500..845e5e2 100644
--- a/src/bytes/buffer_test.go
+++ b/src/bytes/buffer_test.go
@@ -9,6 +9,7 @@
 	"fmt"
 	"io"
 	"math/rand"
+	"strconv"
 	"testing"
 	"unicode/utf8"
 )
@@ -267,7 +268,7 @@
 
 func (r panicReader) Read(p []byte) (int, error) {
 	if r.panic {
-		panic(nil)
+		panic("oops")
 	}
 	return 0, io.EOF
 }
@@ -326,6 +327,33 @@
 	}
 }
 
+func TestWriteAppend(t *testing.T) {
+	var got Buffer
+	var want []byte
+	for i := 0; i < 1000; i++ {
+		b := got.AvailableBuffer()
+		b = strconv.AppendInt(b, int64(i), 10)
+		want = strconv.AppendInt(want, int64(i), 10)
+		got.Write(b)
+	}
+	if !Equal(got.Bytes(), want) {
+		t.Fatalf("Bytes() = %q, want %q", got, want)
+	}
+
+	// With a sufficiently sized buffer, there should be no allocations.
+	n := testing.AllocsPerRun(100, func() {
+		got.Reset()
+		for i := 0; i < 1000; i++ {
+			b := got.AvailableBuffer()
+			b = strconv.AppendInt(b, int64(i), 10)
+			got.Write(b)
+		}
+	})
+	if n > 0 {
+		t.Errorf("allocations occurred while appending")
+	}
+}
+
 func TestRuneIO(t *testing.T) {
 	const NRune = 1000
 	// Built a test slice while we write the data
@@ -687,3 +715,16 @@
 		})
 	}
 }
+
+func BenchmarkBufferAppendNoCopy(b *testing.B) {
+	var bb Buffer
+	bb.Grow(16 << 20)
+	b.SetBytes(int64(bb.Available()))
+	b.ReportAllocs()
+	for i := 0; i < b.N; i++ {
+		bb.Reset()
+		b := bb.AvailableBuffer()
+		b = b[:cap(b)] // use max capacity to simulate a large append operation
+		bb.Write(b)    // should be nearly infinitely fast
+	}
+}
diff --git a/src/bytes/bytes.go b/src/bytes/bytes.go
index e2e5d5f..c54e52e 100644
--- a/src/bytes/bytes.go
+++ b/src/bytes/bytes.go
@@ -3,7 +3,7 @@
 // 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.
+// It is analogous to the facilities of the [strings] package.
 package bytes
 
 import (
@@ -86,6 +86,11 @@
 	return IndexRune(b, r) >= 0
 }
 
+// ContainsFunc reports whether any of the UTF-8-encoded code points r within b satisfy f(r).
+func ContainsFunc(b []byte, f func(rune) bool) bool {
+	return IndexFunc(b, f) >= 0
+}
+
 // IndexByte returns the index of the first instance of c in b, or -1 if c is not present in b.
 func IndexByte(b []byte, c byte) int {
 	return bytealg.IndexByte(b, c)
@@ -528,12 +533,22 @@
 		// Just return a copy.
 		return append([]byte(nil), s[0]...)
 	}
-	n := len(sep) * (len(s) - 1)
+
+	var n int
+	if len(sep) > 0 {
+		if len(sep) >= maxInt/(len(s)-1) {
+			panic("bytes: Join output length overflow")
+		}
+		n += len(sep) * (len(s) - 1)
+	}
 	for _, v := range s {
+		if len(v) > maxInt-n {
+			panic("bytes: Join output length overflow")
+		}
 		n += len(v)
 	}
 
-	b := make([]byte, n)
+	b := bytealg.MakeNoZero(n)
 	bp := copy(b, s[0])
 	for _, v := range s[1:] {
 		bp += copy(b[bp:], sep)
@@ -584,22 +599,22 @@
 	if count == 0 {
 		return []byte{}
 	}
+
 	// Since we cannot return an error on overflow,
-	// we should panic if the repeat will generate
-	// an overflow.
+	// we should panic if the repeat will generate an overflow.
 	// See golang.org/issue/16237.
 	if count < 0 {
 		panic("bytes: negative Repeat count")
-	} else if len(b)*count/count != len(b) {
-		panic("bytes: Repeat count causes overflow")
 	}
+	if len(b) >= maxInt/count {
+		panic("bytes: Repeat output length overflow")
+	}
+	n := len(b) * count
 
 	if len(b) == 0 {
 		return []byte{}
 	}
 
-	n := len(b) * count
-
 	// Past a certain chunk size it is counterproductive to use
 	// larger chunks as the source of the write, as when the source
 	// is too large we are basically just thrashing the CPU D-cache.
@@ -618,9 +633,9 @@
 			chunkMax = len(b)
 		}
 	}
-	nb := make([]byte, n)
+	nb := bytealg.MakeNoZero(n)
 	bp := copy(nb, b)
-	for bp < len(nb) {
+	for bp < n {
 		chunk := bp
 		if chunk > chunkMax {
 			chunk = chunkMax
@@ -648,7 +663,7 @@
 			// Just return a copy.
 			return append([]byte(""), s...)
 		}
-		b := make([]byte, len(s))
+		b := bytealg.MakeNoZero(len(s))
 		for i := 0; i < len(s); i++ {
 			c := s[i]
 			if 'a' <= c && c <= 'z' {
@@ -678,7 +693,7 @@
 		if !hasUpper {
 			return append([]byte(""), s...)
 		}
-		b := make([]byte, len(s))
+		b := bytealg.MakeNoZero(len(s))
 		for i := 0; i < len(s); i++ {
 			c := s[i]
 			if 'A' <= c && c <= 'Z' {
diff --git a/src/bytes/bytes_test.go b/src/bytes/bytes_test.go
index f58f18c..f0733ed 100644
--- a/src/bytes/bytes_test.go
+++ b/src/bytes/bytes_test.go
@@ -652,6 +652,38 @@
 	}
 }
 
+func BenchmarkEqualBothUnaligned(b *testing.B) {
+	sizes := []int{64, 4 << 10}
+	if !isRaceBuilder {
+		sizes = append(sizes, []int{4 << 20, 64 << 20}...)
+	}
+	maxSize := 2 * (sizes[len(sizes)-1] + 8)
+	if len(bmbuf) < maxSize {
+		bmbuf = make([]byte, maxSize)
+	}
+
+	for _, n := range sizes {
+		for _, off := range []int{0, 1, 4, 7} {
+			buf1 := bmbuf[off : off+n]
+			buf2Start := (len(bmbuf) / 2) + off
+			buf2 := bmbuf[buf2Start : buf2Start+n]
+			buf1[n-1] = 'x'
+			buf2[n-1] = 'x'
+			b.Run(fmt.Sprint(n, off), func(b *testing.B) {
+				b.SetBytes(int64(n))
+				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 BenchmarkIndex(b *testing.B) {
 	benchBytes(b, indexSizes, func(b *testing.B, n int) {
 		buf := bmbuf[0:n]
@@ -1728,7 +1760,7 @@
 
 var cutSuffixTests = []struct {
 	s, sep string
-	after  string
+	before string
 	found  bool
 }{
 	{"abc", "bc", "a", true},
@@ -1741,8 +1773,8 @@
 
 func TestCutSuffix(t *testing.T) {
 	for _, tt := range cutSuffixTests {
-		if after, found := CutSuffix([]byte(tt.s), []byte(tt.sep)); string(after) != tt.after || found != tt.found {
-			t.Errorf("CutSuffix(%q, %q) = %q, %v, want %q, %v", tt.s, tt.sep, after, found, tt.after, tt.found)
+		if before, found := CutSuffix([]byte(tt.s), []byte(tt.sep)); string(before) != tt.before || found != tt.found {
+			t.Errorf("CutSuffix(%q, %q) = %q, %v, want %q, %v", tt.s, tt.sep, before, found, tt.before, tt.found)
 		}
 	}
 }
@@ -1847,6 +1879,17 @@
 	}
 }
 
+func TestContainsFunc(t *testing.T) {
+	for _, ct := range ContainsRuneTests {
+		if ContainsFunc(ct.b, func(r rune) bool {
+			return ct.r == r
+		}) != ct.expected {
+			t.Errorf("ContainsFunc(%q, func(%q)) = %v, want %v",
+				ct.b, ct.r, !ct.expected, ct.expected)
+		}
+	}
+}
+
 var makeFieldsInput = func() []byte {
 	x := make([]byte, 1<<20)
 	// Input is ~10% space, ~10% 2-byte UTF-8, rest ASCII non-space.
diff --git a/src/bytes/compare_test.go b/src/bytes/compare_test.go
index a0150ab..067530b 100644
--- a/src/bytes/compare_test.go
+++ b/src/bytes/compare_test.go
@@ -7,7 +7,6 @@
 import (
 	. "bytes"
 	"fmt"
-	"internal/testenv"
 	"testing"
 )
 
@@ -73,7 +72,7 @@
 	}
 	lengths = append(lengths, 256, 512, 1024, 1333, 4095, 4096, 4097)
 
-	if !testing.Short() || testenv.Builder() != "" {
+	if !testing.Short() {
 		lengths = append(lengths, 65535, 65536, 65537, 99999)
 	}
 
@@ -238,6 +237,32 @@
 	}
 }
 
+func benchmarkCompareBytesBigBothUnaligned(b *testing.B, offset int) {
+	b.StopTimer()
+	pattern := []byte("Hello Gophers!")
+	b1 := make([]byte, 0, 1<<20+len(pattern))
+	for len(b1) < 1<<20 {
+		b1 = append(b1, pattern...)
+	}
+	b2 := make([]byte, len(b1))
+	copy(b2, b1)
+	b.StartTimer()
+	for j := 0; j < b.N; j++ {
+		if Compare(b1[offset:], b2[offset:]) != 0 {
+			b.Fatal("b1 != b2")
+		}
+	}
+	b.SetBytes(int64(len(b1[offset:])))
+}
+
+func BenchmarkCompareBytesBigBothUnaligned(b *testing.B) {
+	for i := 0; i < 8; i++ {
+		b.Run(fmt.Sprintf("offset=%d", i), func(b *testing.B) {
+			benchmarkCompareBytesBigBothUnaligned(b, i)
+		})
+	}
+}
+
 func BenchmarkCompareBytesBig(b *testing.B) {
 	b.StopTimer()
 	b1 := make([]byte, 0, 1<<20)
diff --git a/src/bytes/example_test.go b/src/bytes/example_test.go
index 54a7aa6..41a5e2e 100644
--- a/src/bytes/example_test.go
+++ b/src/bytes/example_test.go
@@ -11,6 +11,7 @@
 	"io"
 	"os"
 	"sort"
+	"strconv"
 	"unicode"
 )
 
@@ -37,6 +38,18 @@
 	// Output: hello world
 }
 
+func ExampleBuffer_AvailableBuffer() {
+	var buf bytes.Buffer
+	for i := 0; i < 4; i++ {
+		b := buf.AvailableBuffer()
+		b = strconv.AppendInt(b, int64(i), 10)
+		b = append(b, ' ')
+		buf.Write(b)
+	}
+	os.Stdout.Write(buf.Bytes())
+	// Output: 0 1 2 3
+}
+
 func ExampleBuffer_Cap() {
 	buf1 := bytes.NewBuffer(make([]byte, 10))
 	buf2 := bytes.NewBuffer(make([]byte, 0, 10))
@@ -110,6 +123,19 @@
 	// bcde
 }
 
+func ExampleClone() {
+	b := []byte("abc")
+	clone := bytes.Clone(b)
+	fmt.Printf("%s\n", clone)
+	clone[0] = 'd'
+	fmt.Printf("%s\n", b)
+	fmt.Printf("%s\n", clone)
+	// Output:
+	// abc
+	// abc
+	// dbc
+}
+
 func ExampleCompare() {
 	// Interpret Compare's result by comparing it to zero.
 	var a, b []byte
@@ -210,6 +236,30 @@
 	// Cut("Gopher", "Badger") = "Gopher", "", false
 }
 
+func ExampleCutPrefix() {
+	show := func(s, sep string) {
+		after, found := bytes.CutPrefix([]byte(s), []byte(sep))
+		fmt.Printf("CutPrefix(%q, %q) = %q, %v\n", s, sep, after, found)
+	}
+	show("Gopher", "Go")
+	show("Gopher", "ph")
+	// Output:
+	// CutPrefix("Gopher", "Go") = "pher", true
+	// CutPrefix("Gopher", "ph") = "Gopher", false
+}
+
+func ExampleCutSuffix() {
+	show := func(s, sep string) {
+		before, found := bytes.CutSuffix([]byte(s), []byte(sep))
+		fmt.Printf("CutSuffix(%q, %q) = %q, %v\n", s, sep, before, found)
+	}
+	show("Gopher", "Go")
+	show("Gopher", "er")
+	// Output:
+	// CutSuffix("Gopher", "Go") = "Gopher", false
+	// CutSuffix("Gopher", "er") = "Goph", true
+}
+
 func ExampleEqual() {
 	fmt.Println(bytes.Equal([]byte("Go"), []byte("Go")))
 	fmt.Println(bytes.Equal([]byte("Go"), []byte("C++")))
@@ -347,6 +397,21 @@
 	// -1
 }
 
+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.Printf("%s\n", bytes.Map(rot13, []byte("'Twas brillig and the slithy gopher...")))
+	// Output:
+	// 'Gjnf oevyyvt naq gur fyvgul tbcure...
+}
+
 func ExampleReader_Len() {
 	fmt.Println(bytes.NewReader([]byte("Hi!")).Len())
 	fmt.Println(bytes.NewReader([]byte("こんにちは!")).Len())
@@ -445,6 +510,16 @@
 	// ToTitle : AHOJ VÝVOJÁRİ GOLANG
 }
 
+func ExampleToValidUTF8() {
+	fmt.Printf("%s\n", bytes.ToValidUTF8([]byte("abc"), []byte("\uFFFD")))
+	fmt.Printf("%s\n", bytes.ToValidUTF8([]byte("a\xffb\xC0\xAFc\xff"), []byte("")))
+	fmt.Printf("%s\n", bytes.ToValidUTF8([]byte("\xed\xa0\x80"), []byte("abc")))
+	// Output:
+	// abc
+	// abc
+	// abc
+}
+
 func ExampleTrim() {
 	fmt.Printf("[%q]", bytes.Trim([]byte(" !!! Achtung! Achtung! !!! "), "! "))
 	// Output: ["Achtung! Achtung"]
diff --git a/src/cmd/api/api.go b/src/cmd/api/api.go
deleted file mode 100644
index 399da1c..0000000
--- a/src/cmd/api/api.go
+++ /dev/null
@@ -1,1264 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package api computes the exported API of a set of Go packages.
-// It is only a test, not a command, nor a usefully importable package.
-package api
-
-import (
-	"bufio"
-	"bytes"
-	"encoding/json"
-	"flag"
-	"fmt"
-	"go/ast"
-	"go/build"
-	"go/parser"
-	"go/token"
-	"go/types"
-	"internal/testenv"
-	"io"
-	"log"
-	"os"
-	"os/exec"
-	"path/filepath"
-	"regexp"
-	"runtime"
-	"sort"
-	"strconv"
-	"strings"
-	"sync"
-	"testing"
-)
-
-const verbose = false
-
-func goCmd() string {
-	var exeSuffix string
-	if runtime.GOOS == "windows" {
-		exeSuffix = ".exe"
-	}
-	path := filepath.Join(testenv.GOROOT(nil), "bin", "go"+exeSuffix)
-	if _, err := os.Stat(path); err == nil {
-		return path
-	}
-	return "go"
-}
-
-// contexts are the default contexts which are scanned, unless
-// overridden by the -contexts flag.
-var contexts = []*build.Context{
-	{GOOS: "linux", GOARCH: "386", CgoEnabled: true},
-	{GOOS: "linux", GOARCH: "386"},
-	{GOOS: "linux", GOARCH: "amd64", CgoEnabled: true},
-	{GOOS: "linux", GOARCH: "amd64"},
-	{GOOS: "linux", GOARCH: "arm", CgoEnabled: true},
-	{GOOS: "linux", GOARCH: "arm"},
-	{GOOS: "darwin", GOARCH: "amd64", CgoEnabled: true},
-	{GOOS: "darwin", GOARCH: "amd64"},
-	{GOOS: "darwin", GOARCH: "arm64", CgoEnabled: true},
-	{GOOS: "darwin", GOARCH: "arm64"},
-	{GOOS: "windows", GOARCH: "amd64"},
-	{GOOS: "windows", GOARCH: "386"},
-	{GOOS: "freebsd", GOARCH: "386", CgoEnabled: true},
-	{GOOS: "freebsd", GOARCH: "386"},
-	{GOOS: "freebsd", GOARCH: "amd64", CgoEnabled: true},
-	{GOOS: "freebsd", GOARCH: "amd64"},
-	{GOOS: "freebsd", GOARCH: "arm", CgoEnabled: true},
-	{GOOS: "freebsd", GOARCH: "arm"},
-	{GOOS: "netbsd", GOARCH: "386", CgoEnabled: true},
-	{GOOS: "netbsd", GOARCH: "386"},
-	{GOOS: "netbsd", GOARCH: "amd64", CgoEnabled: true},
-	{GOOS: "netbsd", GOARCH: "amd64"},
-	{GOOS: "netbsd", GOARCH: "arm", CgoEnabled: true},
-	{GOOS: "netbsd", GOARCH: "arm"},
-	{GOOS: "netbsd", GOARCH: "arm64", CgoEnabled: true},
-	{GOOS: "netbsd", GOARCH: "arm64"},
-	{GOOS: "openbsd", GOARCH: "386", CgoEnabled: true},
-	{GOOS: "openbsd", GOARCH: "386"},
-	{GOOS: "openbsd", GOARCH: "amd64", CgoEnabled: true},
-	{GOOS: "openbsd", GOARCH: "amd64"},
-}
-
-func contextName(c *build.Context) string {
-	s := c.GOOS + "-" + c.GOARCH
-	if c.CgoEnabled {
-		s += "-cgo"
-	}
-	if c.Dir != "" {
-		s += fmt.Sprintf(" [%s]", c.Dir)
-	}
-	return s
-}
-
-func parseContext(c string) *build.Context {
-	parts := strings.Split(c, "-")
-	if len(parts) < 2 {
-		log.Fatalf("bad context: %q", c)
-	}
-	bc := &build.Context{
-		GOOS:   parts[0],
-		GOARCH: parts[1],
-	}
-	if len(parts) == 3 {
-		if parts[2] == "cgo" {
-			bc.CgoEnabled = true
-		} else {
-			log.Fatalf("bad context: %q", c)
-		}
-	}
-	return bc
-}
-
-var internalPkg = regexp.MustCompile(`(^|/)internal($|/)`)
-
-var exitCode = 0
-
-func Check(t *testing.T) {
-	checkFiles, err := filepath.Glob(filepath.Join(testenv.GOROOT(t), "api/go1*.txt"))
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	var nextFiles []string
-	if strings.Contains(runtime.Version(), "devel") {
-		next, err := filepath.Glob(filepath.Join(testenv.GOROOT(t), "api/next/*.txt"))
-		if err != nil {
-			t.Fatal(err)
-		}
-		nextFiles = next
-	}
-
-	for _, c := range contexts {
-		c.Compiler = build.Default.Compiler
-	}
-
-	walkers := make([]*Walker, len(contexts))
-	var wg sync.WaitGroup
-	for i, context := range contexts {
-		i, context := i, context
-		wg.Add(1)
-		go func() {
-			defer wg.Done()
-			walkers[i] = NewWalker(context, filepath.Join(testenv.GOROOT(t), "src"))
-		}()
-	}
-	wg.Wait()
-
-	var featureCtx = make(map[string]map[string]bool) // feature -> context name -> true
-	for _, w := range walkers {
-		pkgNames := w.stdPackages
-		if flag.NArg() > 0 {
-			pkgNames = flag.Args()
-		}
-
-		for _, name := range pkgNames {
-			pkg, err := w.import_(name)
-			if _, nogo := err.(*build.NoGoError); nogo {
-				continue
-			}
-			if err != nil {
-				log.Fatalf("Import(%q): %v", name, err)
-			}
-			w.export(pkg)
-		}
-
-		ctxName := contextName(w.context)
-		for _, f := range w.Features() {
-			if featureCtx[f] == nil {
-				featureCtx[f] = make(map[string]bool)
-			}
-			featureCtx[f][ctxName] = true
-		}
-	}
-
-	var features []string
-	for f, cmap := range featureCtx {
-		if len(cmap) == len(contexts) {
-			features = append(features, f)
-			continue
-		}
-		comma := strings.Index(f, ",")
-		for cname := range cmap {
-			f2 := fmt.Sprintf("%s (%s)%s", f[:comma], cname, f[comma:])
-			features = append(features, f2)
-		}
-	}
-
-	bw := bufio.NewWriter(os.Stdout)
-	defer bw.Flush()
-
-	var required []string
-	for _, file := range checkFiles {
-		required = append(required, fileFeatures(file, needApproval(file))...)
-	}
-	var optional []string
-	for _, file := range nextFiles {
-		optional = append(optional, fileFeatures(file, true)...)
-	}
-	exception := fileFeatures(filepath.Join(testenv.GOROOT(t), "api/except.txt"), false)
-
-	if exitCode == 1 {
-		t.Errorf("API database problems found")
-	}
-	if !compareAPI(bw, features, required, optional, exception, false) {
-		t.Errorf("API differences found")
-	}
-}
-
-// export emits the exported package features.
-func (w *Walker) export(pkg *apiPackage) {
-	if verbose {
-		log.Println(pkg)
-	}
-	pop := w.pushScope("pkg " + pkg.Path())
-	w.current = pkg
-	w.collectDeprecated()
-	scope := pkg.Scope()
-	for _, name := range scope.Names() {
-		if token.IsExported(name) {
-			w.emitObj(scope.Lookup(name))
-		}
-	}
-	pop()
-}
-
-func set(items []string) map[string]bool {
-	s := make(map[string]bool)
-	for _, v := range items {
-		s[v] = true
-	}
-	return s
-}
-
-var spaceParensRx = regexp.MustCompile(` \(\S+?\)`)
-
-func featureWithoutContext(f string) string {
-	if !strings.Contains(f, "(") {
-		return f
-	}
-	return spaceParensRx.ReplaceAllString(f, "")
-}
-
-// portRemoved reports whether the given port-specific API feature is
-// okay to no longer exist because its port was removed.
-func portRemoved(feature string) bool {
-	return strings.Contains(feature, "(darwin-386)") ||
-		strings.Contains(feature, "(darwin-386-cgo)")
-}
-
-func compareAPI(w io.Writer, features, required, optional, exception []string, allowAdd bool) (ok bool) {
-	ok = true
-
-	optionalSet := set(optional)
-	exceptionSet := set(exception)
-	featureSet := set(features)
-
-	sort.Strings(features)
-	sort.Strings(required)
-
-	take := func(sl *[]string) string {
-		s := (*sl)[0]
-		*sl = (*sl)[1:]
-		return s
-	}
-
-	for len(required) > 0 || len(features) > 0 {
-		switch {
-		case len(features) == 0 || (len(required) > 0 && required[0] < features[0]):
-			feature := take(&required)
-			if exceptionSet[feature] {
-				// An "unfortunate" case: the feature was once
-				// included in the API (e.g. go1.txt), but was
-				// subsequently removed. These are already
-				// acknowledged by being in the file
-				// "api/except.txt". No need to print them out
-				// here.
-			} else if portRemoved(feature) {
-				// okay.
-			} else if featureSet[featureWithoutContext(feature)] {
-				// okay.
-			} else {
-				fmt.Fprintf(w, "-%s\n", feature)
-				ok = false // broke compatibility
-			}
-		case len(required) == 0 || (len(features) > 0 && required[0] > features[0]):
-			newFeature := take(&features)
-			if optionalSet[newFeature] {
-				// Known added feature to the upcoming release.
-				// Delete it from the map so we can detect any upcoming features
-				// which were never seen.  (so we can clean up the nextFile)
-				delete(optionalSet, newFeature)
-			} else {
-				fmt.Fprintf(w, "+%s\n", newFeature)
-				if !allowAdd {
-					ok = false // we're in lock-down mode for next release
-				}
-			}
-		default:
-			take(&required)
-			take(&features)
-		}
-	}
-
-	// In next file, but not in API.
-	var missing []string
-	for feature := range optionalSet {
-		missing = append(missing, feature)
-	}
-	sort.Strings(missing)
-	for _, feature := range missing {
-		fmt.Fprintf(w, "±%s\n", feature)
-	}
-	return
-}
-
-// aliasReplacer applies type aliases to earlier API files,
-// to avoid misleading negative results.
-// This makes all the references to os.FileInfo in go1.txt
-// be read as if they said fs.FileInfo, since os.FileInfo is now an alias.
-// If there are many of these, we could do a more general solution,
-// but for now the replacer is fine.
-var aliasReplacer = strings.NewReplacer(
-	"os.FileInfo", "fs.FileInfo",
-	"os.FileMode", "fs.FileMode",
-	"os.PathError", "fs.PathError",
-)
-
-func fileFeatures(filename string, needApproval bool) []string {
-	bs, err := os.ReadFile(filename)
-	if err != nil {
-		log.Fatal(err)
-	}
-	s := string(bs)
-
-	// Diagnose common mistakes people make,
-	// since there is no apifmt to format these files.
-	// The missing final newline is important for the
-	// final release step of cat next/*.txt >go1.X.txt.
-	// If the files don't end in full lines, the concatenation goes awry.
-	if strings.Contains(s, "\r") {
-		log.Printf("%s: contains CRLFs", filename)
-		exitCode = 1
-	}
-	if s == "" {
-		log.Printf("%s: empty file", filename)
-		exitCode = 1
-	} else if s[len(s)-1] != '\n' {
-		log.Printf("%s: missing final newline", filename)
-		exitCode = 1
-	}
-	s = aliasReplacer.Replace(s)
-	lines := strings.Split(s, "\n")
-	var nonblank []string
-	for i, line := range lines {
-		line = strings.TrimSpace(line)
-		if line == "" || strings.HasPrefix(line, "#") {
-			continue
-		}
-		if needApproval {
-			feature, approval, ok := strings.Cut(line, "#")
-			if !ok {
-				log.Printf("%s:%d: missing proposal approval\n", filename, i+1)
-				exitCode = 1
-			} else {
-				_, err := strconv.Atoi(approval)
-				if err != nil {
-					log.Printf("%s:%d: malformed proposal approval #%s\n", filename, i+1, approval)
-					exitCode = 1
-				}
-			}
-			line = strings.TrimSpace(feature)
-		} else {
-			if strings.Contains(line, " #") {
-				log.Printf("%s:%d: unexpected approval\n", filename, i+1)
-				exitCode = 1
-			}
-		}
-		nonblank = append(nonblank, line)
-	}
-	return nonblank
-}
-
-var fset = token.NewFileSet()
-
-type Walker struct {
-	context     *build.Context
-	root        string
-	scope       []string
-	current     *apiPackage
-	deprecated  map[token.Pos]bool
-	features    map[string]bool              // set
-	imported    map[string]*apiPackage       // packages already imported
-	stdPackages []string                     // names, omitting "unsafe", internal, and vendored packages
-	importMap   map[string]map[string]string // importer dir -> import path -> canonical path
-	importDir   map[string]string            // canonical import path -> dir
-
-}
-
-func NewWalker(context *build.Context, root string) *Walker {
-	w := &Walker{
-		context:  context,
-		root:     root,
-		features: map[string]bool{},
-		imported: map[string]*apiPackage{"unsafe": &apiPackage{Package: types.Unsafe}},
-	}
-	w.loadImports()
-	return w
-}
-
-func (w *Walker) Features() (fs []string) {
-	for f := range w.features {
-		fs = append(fs, f)
-	}
-	sort.Strings(fs)
-	return
-}
-
-var parsedFileCache = make(map[string]*ast.File)
-
-func (w *Walker) parseFile(dir, file string) (*ast.File, error) {
-	filename := filepath.Join(dir, file)
-	if f := parsedFileCache[filename]; f != nil {
-		return f, nil
-	}
-
-	f, err := parser.ParseFile(fset, filename, nil, parser.ParseComments)
-	if err != nil {
-		return nil, err
-	}
-	parsedFileCache[filename] = f
-
-	return f, nil
-}
-
-// Disable before debugging non-obvious errors from the type-checker.
-const usePkgCache = true
-
-var (
-	pkgCache = map[string]*apiPackage{} // map tagKey to package
-	pkgTags  = map[string][]string{}    // map import dir to list of relevant tags
-)
-
-// tagKey returns the tag-based key to use in the pkgCache.
-// It is a comma-separated string; the first part is dir, the rest tags.
-// The satisfied tags are derived from context but only those that
-// matter (the ones listed in the tags argument plus GOOS and GOARCH) are used.
-// The tags list, which came from go/build's Package.AllTags,
-// is known to be sorted.
-func tagKey(dir string, context *build.Context, tags []string) string {
-	ctags := map[string]bool{
-		context.GOOS:   true,
-		context.GOARCH: true,
-	}
-	if context.CgoEnabled {
-		ctags["cgo"] = true
-	}
-	for _, tag := range context.BuildTags {
-		ctags[tag] = true
-	}
-	// TODO: ReleaseTags (need to load default)
-	key := dir
-
-	// explicit on GOOS and GOARCH as global cache will use "all" cached packages for
-	// an indirect imported package. See https://github.com/golang/go/issues/21181
-	// for more detail.
-	tags = append(tags, context.GOOS, context.GOARCH)
-	sort.Strings(tags)
-
-	for _, tag := range tags {
-		if ctags[tag] {
-			key += "," + tag
-			ctags[tag] = false
-		}
-	}
-	return key
-}
-
-type listImports struct {
-	stdPackages []string                     // names, omitting "unsafe", internal, and vendored packages
-	importDir   map[string]string            // canonical import path → directory
-	importMap   map[string]map[string]string // import path → canonical import path
-}
-
-var listCache sync.Map // map[string]listImports, keyed by contextName
-
-// listSem is a semaphore restricting concurrent invocations of 'go list'. 'go
-// list' has its own internal concurrency, so we use a hard-coded constant (to
-// allow the I/O-intensive phases of 'go list' to overlap) instead of scaling
-// all the way up to GOMAXPROCS.
-var listSem = make(chan semToken, 2)
-
-type semToken struct{}
-
-// loadImports populates w with information about the packages in the standard
-// library and the packages they themselves import in w's build context.
-//
-// The source import path and expanded import path are identical except for vendored packages.
-// For example, on return:
-//
-//	w.importMap["math"] = "math"
-//	w.importDir["math"] = "<goroot>/src/math"
-//
-//	w.importMap["golang.org/x/net/route"] = "vendor/golang.org/x/net/route"
-//	w.importDir["vendor/golang.org/x/net/route"] = "<goroot>/src/vendor/golang.org/x/net/route"
-//
-// Since the set of packages that exist depends on context, the result of
-// loadImports also depends on context. However, to improve test running time
-// the configuration for each environment is cached across runs.
-func (w *Walker) loadImports() {
-	if w.context == nil {
-		return // test-only Walker; does not use the import map
-	}
-
-	name := contextName(w.context)
-
-	imports, ok := listCache.Load(name)
-	if !ok {
-		listSem <- semToken{}
-		defer func() { <-listSem }()
-
-		cmd := exec.Command(goCmd(), "list", "-e", "-deps", "-json", "std")
-		cmd.Env = listEnv(w.context)
-		if w.context.Dir != "" {
-			cmd.Dir = w.context.Dir
-		}
-		out, err := cmd.CombinedOutput()
-		if err != nil {
-			log.Fatalf("loading imports: %v\n%s", err, out)
-		}
-
-		var stdPackages []string
-		importMap := make(map[string]map[string]string)
-		importDir := make(map[string]string)
-		dec := json.NewDecoder(bytes.NewReader(out))
-		for {
-			var pkg struct {
-				ImportPath, Dir string
-				ImportMap       map[string]string
-				Standard        bool
-			}
-			err := dec.Decode(&pkg)
-			if err == io.EOF {
-				break
-			}
-			if err != nil {
-				log.Fatalf("go list: invalid output: %v", err)
-			}
-
-			// - Package "unsafe" contains special signatures requiring
-			//   extra care when printing them - ignore since it is not
-			//   going to change w/o a language change.
-			// - Internal and vendored packages do not contribute to our
-			//   API surface. (If we are running within the "std" module,
-			//   vendored dependencies appear as themselves instead of
-			//   their "vendor/" standard-library copies.)
-			// - 'go list std' does not include commands, which cannot be
-			//   imported anyway.
-			if ip := pkg.ImportPath; pkg.Standard && ip != "unsafe" && !strings.HasPrefix(ip, "vendor/") && !internalPkg.MatchString(ip) {
-				stdPackages = append(stdPackages, ip)
-			}
-			importDir[pkg.ImportPath] = pkg.Dir
-			if len(pkg.ImportMap) > 0 {
-				importMap[pkg.Dir] = make(map[string]string, len(pkg.ImportMap))
-			}
-			for k, v := range pkg.ImportMap {
-				importMap[pkg.Dir][k] = v
-			}
-		}
-
-		sort.Strings(stdPackages)
-		imports = listImports{
-			stdPackages: stdPackages,
-			importMap:   importMap,
-			importDir:   importDir,
-		}
-		imports, _ = listCache.LoadOrStore(name, imports)
-	}
-
-	li := imports.(listImports)
-	w.stdPackages = li.stdPackages
-	w.importDir = li.importDir
-	w.importMap = li.importMap
-}
-
-// listEnv returns the process environment to use when invoking 'go list' for
-// the given context.
-func listEnv(c *build.Context) []string {
-	if c == nil {
-		return os.Environ()
-	}
-
-	environ := append(os.Environ(),
-		"GOOS="+c.GOOS,
-		"GOARCH="+c.GOARCH)
-	if c.CgoEnabled {
-		environ = append(environ, "CGO_ENABLED=1")
-	} else {
-		environ = append(environ, "CGO_ENABLED=0")
-	}
-	return environ
-}
-
-type apiPackage struct {
-	*types.Package
-	Files []*ast.File
-}
-
-// Importing is a sentinel taking the place in Walker.imported
-// for a package that is in the process of being imported.
-var importing apiPackage
-
-// Import implements types.Importer.
-func (w *Walker) Import(name string) (*types.Package, error) {
-	return w.ImportFrom(name, "", 0)
-}
-
-// ImportFrom implements types.ImporterFrom.
-func (w *Walker) ImportFrom(fromPath, fromDir string, mode types.ImportMode) (*types.Package, error) {
-	pkg, err := w.importFrom(fromPath, fromDir, mode)
-	if err != nil {
-		return nil, err
-	}
-	return pkg.Package, nil
-}
-
-func (w *Walker) import_(name string) (*apiPackage, error) {
-	return w.importFrom(name, "", 0)
-}
-
-func (w *Walker) importFrom(fromPath, fromDir string, mode types.ImportMode) (*apiPackage, error) {
-	name := fromPath
-	if canonical, ok := w.importMap[fromDir][fromPath]; ok {
-		name = canonical
-	}
-
-	pkg := w.imported[name]
-	if pkg != nil {
-		if pkg == &importing {
-			log.Fatalf("cycle importing package %q", name)
-		}
-		return pkg, nil
-	}
-	w.imported[name] = &importing
-
-	// Determine package files.
-	dir := w.importDir[name]
-	if dir == "" {
-		dir = filepath.Join(w.root, filepath.FromSlash(name))
-	}
-	if fi, err := os.Stat(dir); err != nil || !fi.IsDir() {
-		log.Panicf("no source in tree for import %q (from import %s in %s): %v", name, fromPath, fromDir, err)
-	}
-
-	context := w.context
-	if context == nil {
-		context = &build.Default
-	}
-
-	// Look in cache.
-	// If we've already done an import with the same set
-	// of relevant tags, reuse the result.
-	var key string
-	if usePkgCache {
-		if tags, ok := pkgTags[dir]; ok {
-			key = tagKey(dir, context, tags)
-			if pkg := pkgCache[key]; pkg != nil {
-				w.imported[name] = pkg
-				return pkg, nil
-			}
-		}
-	}
-
-	info, err := context.ImportDir(dir, 0)
-	if err != nil {
-		if _, nogo := err.(*build.NoGoError); nogo {
-			return nil, err
-		}
-		log.Fatalf("pkg %q, dir %q: ScanDir: %v", name, dir, err)
-	}
-
-	// Save tags list first time we see a directory.
-	if usePkgCache {
-		if _, ok := pkgTags[dir]; !ok {
-			pkgTags[dir] = info.AllTags
-			key = tagKey(dir, context, info.AllTags)
-		}
-	}
-
-	filenames := append(append([]string{}, info.GoFiles...), info.CgoFiles...)
-
-	// Parse package files.
-	var files []*ast.File
-	for _, file := range filenames {
-		f, err := w.parseFile(dir, file)
-		if err != nil {
-			log.Fatalf("error parsing package %s: %s", name, err)
-		}
-		files = append(files, f)
-	}
-
-	// Type-check package files.
-	var sizes types.Sizes
-	if w.context != nil {
-		sizes = types.SizesFor(w.context.Compiler, w.context.GOARCH)
-	}
-	conf := types.Config{
-		IgnoreFuncBodies: true,
-		FakeImportC:      true,
-		Importer:         w,
-		Sizes:            sizes,
-	}
-	tpkg, err := conf.Check(name, fset, files, nil)
-	if err != nil {
-		ctxt := "<no context>"
-		if w.context != nil {
-			ctxt = fmt.Sprintf("%s-%s", w.context.GOOS, w.context.GOARCH)
-		}
-		log.Fatalf("error typechecking package %s: %s (%s)", name, err, ctxt)
-	}
-	pkg = &apiPackage{tpkg, files}
-
-	if usePkgCache {
-		pkgCache[key] = pkg
-	}
-
-	w.imported[name] = pkg
-	return pkg, nil
-}
-
-// pushScope enters a new scope (walking a package, type, node, etc)
-// and returns a function that will leave the scope (with sanity checking
-// for mismatched pushes & pops)
-func (w *Walker) pushScope(name string) (popFunc func()) {
-	w.scope = append(w.scope, name)
-	return func() {
-		if len(w.scope) == 0 {
-			log.Fatalf("attempt to leave scope %q with empty scope list", name)
-		}
-		if w.scope[len(w.scope)-1] != name {
-			log.Fatalf("attempt to leave scope %q, but scope is currently %#v", name, w.scope)
-		}
-		w.scope = w.scope[:len(w.scope)-1]
-	}
-}
-
-func sortedMethodNames(typ *types.Interface) []string {
-	n := typ.NumMethods()
-	list := make([]string, n)
-	for i := range list {
-		list[i] = typ.Method(i).Name()
-	}
-	sort.Strings(list)
-	return list
-}
-
-// sortedEmbeddeds returns constraint types embedded in an
-// interface. It does not include embedded interface types or methods.
-func (w *Walker) sortedEmbeddeds(typ *types.Interface) []string {
-	n := typ.NumEmbeddeds()
-	list := make([]string, 0, n)
-	for i := 0; i < n; i++ {
-		emb := typ.EmbeddedType(i)
-		switch emb := emb.(type) {
-		case *types.Interface:
-			list = append(list, w.sortedEmbeddeds(emb)...)
-		case *types.Union:
-			var buf bytes.Buffer
-			nu := emb.Len()
-			for i := 0; i < nu; i++ {
-				if i > 0 {
-					buf.WriteString(" | ")
-				}
-				term := emb.Term(i)
-				if term.Tilde() {
-					buf.WriteByte('~')
-				}
-				w.writeType(&buf, term.Type())
-			}
-			list = append(list, buf.String())
-		}
-	}
-	sort.Strings(list)
-	return list
-}
-
-func (w *Walker) writeType(buf *bytes.Buffer, typ types.Type) {
-	switch typ := typ.(type) {
-	case *types.Basic:
-		s := typ.Name()
-		switch typ.Kind() {
-		case types.UnsafePointer:
-			s = "unsafe.Pointer"
-		case types.UntypedBool:
-			s = "ideal-bool"
-		case types.UntypedInt:
-			s = "ideal-int"
-		case types.UntypedRune:
-			// "ideal-char" for compatibility with old tool
-			// TODO(gri) change to "ideal-rune"
-			s = "ideal-char"
-		case types.UntypedFloat:
-			s = "ideal-float"
-		case types.UntypedComplex:
-			s = "ideal-complex"
-		case types.UntypedString:
-			s = "ideal-string"
-		case types.UntypedNil:
-			panic("should never see untyped nil type")
-		default:
-			switch s {
-			case "byte":
-				s = "uint8"
-			case "rune":
-				s = "int32"
-			}
-		}
-		buf.WriteString(s)
-
-	case *types.Array:
-		fmt.Fprintf(buf, "[%d]", typ.Len())
-		w.writeType(buf, typ.Elem())
-
-	case *types.Slice:
-		buf.WriteString("[]")
-		w.writeType(buf, typ.Elem())
-
-	case *types.Struct:
-		buf.WriteString("struct")
-
-	case *types.Pointer:
-		buf.WriteByte('*')
-		w.writeType(buf, typ.Elem())
-
-	case *types.Tuple:
-		panic("should never see a tuple type")
-
-	case *types.Signature:
-		buf.WriteString("func")
-		w.writeSignature(buf, typ)
-
-	case *types.Interface:
-		buf.WriteString("interface{")
-		if typ.NumMethods() > 0 || typ.NumEmbeddeds() > 0 {
-			buf.WriteByte(' ')
-		}
-		if typ.NumMethods() > 0 {
-			buf.WriteString(strings.Join(sortedMethodNames(typ), ", "))
-		}
-		if typ.NumEmbeddeds() > 0 {
-			buf.WriteString(strings.Join(w.sortedEmbeddeds(typ), ", "))
-		}
-		if typ.NumMethods() > 0 || typ.NumEmbeddeds() > 0 {
-			buf.WriteByte(' ')
-		}
-		buf.WriteString("}")
-
-	case *types.Map:
-		buf.WriteString("map[")
-		w.writeType(buf, typ.Key())
-		buf.WriteByte(']')
-		w.writeType(buf, typ.Elem())
-
-	case *types.Chan:
-		var s string
-		switch typ.Dir() {
-		case types.SendOnly:
-			s = "chan<- "
-		case types.RecvOnly:
-			s = "<-chan "
-		case types.SendRecv:
-			s = "chan "
-		default:
-			panic("unreachable")
-		}
-		buf.WriteString(s)
-		w.writeType(buf, typ.Elem())
-
-	case *types.Named:
-		obj := typ.Obj()
-		pkg := obj.Pkg()
-		if pkg != nil && pkg != w.current.Package {
-			buf.WriteString(pkg.Name())
-			buf.WriteByte('.')
-		}
-		buf.WriteString(typ.Obj().Name())
-
-	case *types.TypeParam:
-		// Type parameter names may change, so use a placeholder instead.
-		fmt.Fprintf(buf, "$%d", typ.Index())
-
-	default:
-		panic(fmt.Sprintf("unknown type %T", typ))
-	}
-}
-
-func (w *Walker) writeSignature(buf *bytes.Buffer, sig *types.Signature) {
-	if tparams := sig.TypeParams(); tparams != nil {
-		w.writeTypeParams(buf, tparams, true)
-	}
-	w.writeParams(buf, sig.Params(), sig.Variadic())
-	switch res := sig.Results(); res.Len() {
-	case 0:
-		// nothing to do
-	case 1:
-		buf.WriteByte(' ')
-		w.writeType(buf, res.At(0).Type())
-	default:
-		buf.WriteByte(' ')
-		w.writeParams(buf, res, false)
-	}
-}
-
-func (w *Walker) writeTypeParams(buf *bytes.Buffer, tparams *types.TypeParamList, withConstraints bool) {
-	buf.WriteByte('[')
-	c := tparams.Len()
-	for i := 0; i < c; i++ {
-		if i > 0 {
-			buf.WriteString(", ")
-		}
-		tp := tparams.At(i)
-		w.writeType(buf, tp)
-		if withConstraints {
-			buf.WriteByte(' ')
-			w.writeType(buf, tp.Constraint())
-		}
-	}
-	buf.WriteByte(']')
-}
-
-func (w *Walker) writeParams(buf *bytes.Buffer, t *types.Tuple, variadic bool) {
-	buf.WriteByte('(')
-	for i, n := 0, t.Len(); i < n; i++ {
-		if i > 0 {
-			buf.WriteString(", ")
-		}
-		typ := t.At(i).Type()
-		if variadic && i+1 == n {
-			buf.WriteString("...")
-			typ = typ.(*types.Slice).Elem()
-		}
-		w.writeType(buf, typ)
-	}
-	buf.WriteByte(')')
-}
-
-func (w *Walker) typeString(typ types.Type) string {
-	var buf bytes.Buffer
-	w.writeType(&buf, typ)
-	return buf.String()
-}
-
-func (w *Walker) signatureString(sig *types.Signature) string {
-	var buf bytes.Buffer
-	w.writeSignature(&buf, sig)
-	return buf.String()
-}
-
-func (w *Walker) emitObj(obj types.Object) {
-	switch obj := obj.(type) {
-	case *types.Const:
-		if w.isDeprecated(obj) {
-			w.emitf("const %s //deprecated", obj.Name())
-		}
-		w.emitf("const %s %s", obj.Name(), w.typeString(obj.Type()))
-		x := obj.Val()
-		short := x.String()
-		exact := x.ExactString()
-		if short == exact {
-			w.emitf("const %s = %s", obj.Name(), short)
-		} else {
-			w.emitf("const %s = %s  // %s", obj.Name(), short, exact)
-		}
-	case *types.Var:
-		if w.isDeprecated(obj) {
-			w.emitf("var %s //deprecated", obj.Name())
-		}
-		w.emitf("var %s %s", obj.Name(), w.typeString(obj.Type()))
-	case *types.TypeName:
-		w.emitType(obj)
-	case *types.Func:
-		w.emitFunc(obj)
-	default:
-		panic("unknown object: " + obj.String())
-	}
-}
-
-func (w *Walker) emitType(obj *types.TypeName) {
-	name := obj.Name()
-	if w.isDeprecated(obj) {
-		w.emitf("type %s //deprecated", name)
-	}
-	if tparams := obj.Type().(*types.Named).TypeParams(); tparams != nil {
-		var buf bytes.Buffer
-		buf.WriteString(name)
-		w.writeTypeParams(&buf, tparams, true)
-		name = buf.String()
-	}
-	typ := obj.Type()
-	if obj.IsAlias() {
-		w.emitf("type %s = %s", name, w.typeString(typ))
-		return
-	}
-	switch typ := typ.Underlying().(type) {
-	case *types.Struct:
-		w.emitStructType(name, typ)
-	case *types.Interface:
-		w.emitIfaceType(name, typ)
-		return // methods are handled by emitIfaceType
-	default:
-		w.emitf("type %s %s", name, w.typeString(typ.Underlying()))
-	}
-
-	// emit methods with value receiver
-	var methodNames map[string]bool
-	vset := types.NewMethodSet(typ)
-	for i, n := 0, vset.Len(); i < n; i++ {
-		m := vset.At(i)
-		if m.Obj().Exported() {
-			w.emitMethod(m)
-			if methodNames == nil {
-				methodNames = make(map[string]bool)
-			}
-			methodNames[m.Obj().Name()] = true
-		}
-	}
-
-	// emit methods with pointer receiver; exclude
-	// methods that we have emitted already
-	// (the method set of *T includes the methods of T)
-	pset := types.NewMethodSet(types.NewPointer(typ))
-	for i, n := 0, pset.Len(); i < n; i++ {
-		m := pset.At(i)
-		if m.Obj().Exported() && !methodNames[m.Obj().Name()] {
-			w.emitMethod(m)
-		}
-	}
-}
-
-func (w *Walker) emitStructType(name string, typ *types.Struct) {
-	typeStruct := fmt.Sprintf("type %s struct", name)
-	w.emitf(typeStruct)
-	defer w.pushScope(typeStruct)()
-
-	for i := 0; i < typ.NumFields(); i++ {
-		f := typ.Field(i)
-		if !f.Exported() {
-			continue
-		}
-		typ := f.Type()
-		if f.Anonymous() {
-			if w.isDeprecated(f) {
-				w.emitf("embedded %s //deprecated", w.typeString(typ))
-			}
-			w.emitf("embedded %s", w.typeString(typ))
-			continue
-		}
-		if w.isDeprecated(f) {
-			w.emitf("%s //deprecated", f.Name())
-		}
-		w.emitf("%s %s", f.Name(), w.typeString(typ))
-	}
-}
-
-func (w *Walker) emitIfaceType(name string, typ *types.Interface) {
-	pop := w.pushScope("type " + name + " interface")
-
-	var methodNames []string
-	complete := true
-	mset := types.NewMethodSet(typ)
-	for i, n := 0, mset.Len(); i < n; i++ {
-		m := mset.At(i).Obj().(*types.Func)
-		if !m.Exported() {
-			complete = false
-			continue
-		}
-		methodNames = append(methodNames, m.Name())
-		if w.isDeprecated(m) {
-			w.emitf("%s //deprecated", m.Name())
-		}
-		w.emitf("%s%s", m.Name(), w.signatureString(m.Type().(*types.Signature)))
-	}
-
-	if !complete {
-		// The method set has unexported methods, so all the
-		// implementations are provided by the same package,
-		// so the method set can be extended. Instead of recording
-		// the full set of names (below), record only that there were
-		// unexported methods. (If the interface shrinks, we will notice
-		// because a method signature emitted during the last loop
-		// will disappear.)
-		w.emitf("unexported methods")
-	}
-
-	pop()
-
-	if !complete {
-		return
-	}
-
-	if len(methodNames) == 0 {
-		w.emitf("type %s interface {}", name)
-		return
-	}
-
-	sort.Strings(methodNames)
-	w.emitf("type %s interface { %s }", name, strings.Join(methodNames, ", "))
-}
-
-func (w *Walker) emitFunc(f *types.Func) {
-	sig := f.Type().(*types.Signature)
-	if sig.Recv() != nil {
-		panic("method considered a regular function: " + f.String())
-	}
-	if w.isDeprecated(f) {
-		w.emitf("func %s //deprecated", f.Name())
-	}
-	w.emitf("func %s%s", f.Name(), w.signatureString(sig))
-}
-
-func (w *Walker) emitMethod(m *types.Selection) {
-	sig := m.Type().(*types.Signature)
-	recv := sig.Recv().Type()
-	// report exported methods with unexported receiver base type
-	if true {
-		base := recv
-		if p, _ := recv.(*types.Pointer); p != nil {
-			base = p.Elem()
-		}
-		if obj := base.(*types.Named).Obj(); !obj.Exported() {
-			log.Fatalf("exported method with unexported receiver base type: %s", m)
-		}
-	}
-	tps := ""
-	if rtp := sig.RecvTypeParams(); rtp != nil {
-		var buf bytes.Buffer
-		w.writeTypeParams(&buf, rtp, false)
-		tps = buf.String()
-	}
-	if w.isDeprecated(m.Obj()) {
-		w.emitf("method (%s%s) %s //deprecated", w.typeString(recv), tps, m.Obj().Name())
-	}
-	w.emitf("method (%s%s) %s%s", w.typeString(recv), tps, m.Obj().Name(), w.signatureString(sig))
-}
-
-func (w *Walker) emitf(format string, args ...any) {
-	f := strings.Join(w.scope, ", ") + ", " + fmt.Sprintf(format, args...)
-	if strings.Contains(f, "\n") {
-		panic("feature contains newlines: " + f)
-	}
-
-	if _, dup := w.features[f]; dup {
-		panic("duplicate feature inserted: " + f)
-	}
-	w.features[f] = true
-
-	if verbose {
-		log.Printf("feature: %s", f)
-	}
-}
-
-func needApproval(filename string) bool {
-	name := filepath.Base(filename)
-	if name == "go1.txt" {
-		return false
-	}
-	minor := strings.TrimSuffix(strings.TrimPrefix(name, "go1."), ".txt")
-	n, err := strconv.Atoi(minor)
-	if err != nil {
-		log.Fatalf("unexpected api file: %v", name)
-	}
-	return n >= 19 // started tracking approvals in Go 1.19
-}
-
-func (w *Walker) collectDeprecated() {
-	isDeprecated := func(doc *ast.CommentGroup) bool {
-		if doc != nil {
-			for _, c := range doc.List {
-				if strings.HasPrefix(c.Text, "// Deprecated:") {
-					return true
-				}
-			}
-		}
-		return false
-	}
-
-	w.deprecated = make(map[token.Pos]bool)
-	mark := func(id *ast.Ident) {
-		if id != nil {
-			w.deprecated[id.Pos()] = true
-		}
-	}
-	for _, file := range w.current.Files {
-		ast.Inspect(file, func(n ast.Node) bool {
-			switch n := n.(type) {
-			case *ast.File:
-				if isDeprecated(n.Doc) {
-					mark(n.Name)
-				}
-				return true
-			case *ast.GenDecl:
-				if isDeprecated(n.Doc) {
-					for _, spec := range n.Specs {
-						switch spec := spec.(type) {
-						case *ast.ValueSpec:
-							for _, id := range spec.Names {
-								mark(id)
-							}
-						case *ast.TypeSpec:
-							mark(spec.Name)
-						}
-					}
-				}
-				return true // look at specs
-			case *ast.FuncDecl:
-				if isDeprecated(n.Doc) {
-					mark(n.Name)
-				}
-				return false
-			case *ast.TypeSpec:
-				if isDeprecated(n.Doc) {
-					mark(n.Name)
-				}
-				return true // recurse into struct or interface type
-			case *ast.StructType:
-				return true // recurse into fields
-			case *ast.InterfaceType:
-				return true // recurse into methods
-			case *ast.FieldList:
-				return true // recurse into fields
-			case *ast.ValueSpec:
-				if isDeprecated(n.Doc) {
-					for _, id := range n.Names {
-						mark(id)
-					}
-				}
-				return false
-			case *ast.Field:
-				if isDeprecated(n.Doc) {
-					for _, id := range n.Names {
-						mark(id)
-					}
-					if len(n.Names) == 0 {
-						// embedded field T or *T?
-						typ := n.Type
-						if ptr, ok := typ.(*ast.StarExpr); ok {
-							typ = ptr.X
-						}
-						if id, ok := typ.(*ast.Ident); ok {
-							mark(id)
-						}
-					}
-				}
-				return false
-			default:
-				return false
-			}
-		})
-	}
-}
-
-func (w *Walker) isDeprecated(obj types.Object) bool {
-	return w.deprecated[obj.Pos()]
-}
diff --git a/src/cmd/api/api_test.go b/src/cmd/api/api_test.go
index 5f9aa6d..910e046 100644
--- a/src/cmd/api/api_test.go
+++ b/src/cmd/api/api_test.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-package api
+package main
 
 import (
 	"flag"
@@ -20,33 +20,12 @@
 var flagCheck = flag.Bool("check", false, "run API checks")
 
 func TestMain(m *testing.M) {
-	if !testenv.HasExec() {
-		os.Stdout.WriteString("skipping test: platform cannot exec")
-		os.Exit(0)
-	}
-	if !testenv.HasGoBuild() {
-		os.Stdout.WriteString("skipping test: platform cannot 'go build' to import std packages")
-		os.Exit(0)
-	}
-
 	flag.Parse()
 	for _, c := range contexts {
 		c.Compiler = build.Default.Compiler
 	}
 	build.Default.GOROOT = testenv.GOROOT(nil)
 
-	// Warm up the import cache in parallel.
-	var wg sync.WaitGroup
-	for _, context := range contexts {
-		context := context
-		wg.Add(1)
-		go func() {
-			defer wg.Done()
-			_ = NewWalker(context, filepath.Join(testenv.GOROOT(nil), "src"))
-		}()
-	}
-	wg.Wait()
-
 	os.Exit(m.Run())
 }
 
@@ -59,6 +38,9 @@
 		// slow, not worth repeating in -check
 		t.Skip("skipping with -check set")
 	}
+
+	testenv.MustHaveGoBuild(t)
+
 	td, err := os.Open("testdata/src/pkg")
 	if err != nil {
 		t.Fatal(err)
@@ -115,16 +97,23 @@
 
 func TestCompareAPI(t *testing.T) {
 	tests := []struct {
-		name                                    string
-		features, required, optional, exception []string
-		ok                                      bool   // want
-		out                                     string // want
+		name                          string
+		features, required, exception []string
+		ok                            bool   // want
+		out                           string // want
 	}{
 		{
+			name:     "equal",
+			features: []string{"A", "B", "C"},
+			required: []string{"A", "B", "C"},
+			ok:       true,
+			out:      "",
+		},
+		{
 			name:     "feature added",
 			features: []string{"A", "B", "C", "D", "E", "F"},
 			required: []string{"B", "D"},
-			ok:       true,
+			ok:       false,
 			out:      "+A\n+C\n+E\n+F\n",
 		},
 		{
@@ -135,41 +124,51 @@
 			out:      "-B\n",
 		},
 		{
-			name:     "feature added then removed",
-			features: []string{"A", "C"},
-			optional: []string{"B"},
-			required: []string{"A", "C"},
-			ok:       true,
-			out:      "±B\n",
-		},
-		{
 			name:      "exception removal",
-			required:  []string{"A", "B", "C"},
 			features:  []string{"A", "C"},
+			required:  []string{"A", "B", "C"},
 			exception: []string{"B"},
 			ok:        true,
 			out:       "",
 		},
+
+		// Test that a feature required on a subset of ports is implicitly satisfied
+		// by the same feature being implemented on all ports. That is, it shouldn't
+		// say "pkg syscall (darwin-amd64), type RawSockaddrInet6 struct" is missing.
+		// See https://go.dev/issue/4303.
 		{
-			// https://golang.org/issue/4303
-			name: "contexts reconverging",
-			required: []string{
-				"A",
-				"pkg syscall (darwin-amd64), type RawSockaddrInet6 struct",
-			},
+			name: "contexts reconverging after api/next/* update",
 			features: []string{
 				"A",
 				"pkg syscall, type RawSockaddrInet6 struct",
 			},
+			required: []string{
+				"A",
+				"pkg syscall (darwin-amd64), type RawSockaddrInet6 struct", // api/go1.n.txt
+				"pkg syscall, type RawSockaddrInet6 struct",                // api/next/n.txt
+			},
 			ok:  true,
+			out: "",
+		},
+		{
+			name: "contexts reconverging before api/next/* update",
+			features: []string{
+				"A",
+				"pkg syscall, type RawSockaddrInet6 struct",
+			},
+			required: []string{
+				"A",
+				"pkg syscall (darwin-amd64), type RawSockaddrInet6 struct",
+			},
+			ok:  false,
 			out: "+pkg syscall, type RawSockaddrInet6 struct\n",
 		},
 	}
 	for _, tt := range tests {
 		buf := new(strings.Builder)
-		gotok := compareAPI(buf, tt.features, tt.required, tt.optional, tt.exception, true)
-		if gotok != tt.ok {
-			t.Errorf("%s: ok = %v; want %v", tt.name, gotok, tt.ok)
+		gotOK := compareAPI(buf, tt.features, tt.required, tt.exception)
+		if gotOK != tt.ok {
+			t.Errorf("%s: ok = %v; want %v", tt.name, gotOK, tt.ok)
 		}
 		if got := buf.String(); got != tt.out {
 			t.Errorf("%s: output differs\nGOT:\n%s\nWANT:\n%s", tt.name, got, tt.out)
@@ -210,11 +209,32 @@
 	}
 }
 
+var warmupCache = sync.OnceFunc(func() {
+	// Warm up the import cache in parallel.
+	var wg sync.WaitGroup
+	for _, context := range contexts {
+		context := context
+		wg.Add(1)
+		go func() {
+			defer wg.Done()
+			_ = NewWalker(context, filepath.Join(testenv.GOROOT(nil), "src"))
+		}()
+	}
+	wg.Wait()
+})
+
 func TestIssue21181(t *testing.T) {
+	if testing.Short() {
+		t.Skip("skipping with -short")
+	}
 	if *flagCheck {
 		// slow, not worth repeating in -check
 		t.Skip("skipping with -check set")
 	}
+	testenv.MustHaveGoBuild(t)
+
+	warmupCache()
+
 	for _, context := range contexts {
 		w := NewWalker(context, "testdata/src/issue21181")
 		pkg, err := w.import_("p")
@@ -227,10 +247,17 @@
 }
 
 func TestIssue29837(t *testing.T) {
+	if testing.Short() {
+		t.Skip("skipping with -short")
+	}
 	if *flagCheck {
 		// slow, not worth repeating in -check
 		t.Skip("skipping with -check set")
 	}
+	testenv.MustHaveGoBuild(t)
+
+	warmupCache()
+
 	for _, context := range contexts {
 		w := NewWalker(context, "testdata/src/issue29837")
 		_, err := w.ImportFrom("p", "", 0)
@@ -245,6 +272,7 @@
 		// slow, not worth repeating in -check
 		t.Skip("skipping with -check set")
 	}
+	testenv.MustHaveGoBuild(t)
 	context := new(build.Context)
 	*context = build.Default
 	context.Dir = filepath.Join(testenv.GOROOT(t), "src")
@@ -261,5 +289,6 @@
 	if !*flagCheck {
 		t.Skip("-check not specified")
 	}
+	testenv.MustHaveGoBuild(t)
 	Check(t)
 }
diff --git a/src/cmd/api/boring_test.go b/src/cmd/api/boring_test.go
index a9ec6e6..f0e3575 100644
--- a/src/cmd/api/boring_test.go
+++ b/src/cmd/api/boring_test.go
@@ -4,7 +4,7 @@
 
 //go:build boringcrypto
 
-package api
+package main
 
 import (
 	"fmt"
diff --git a/src/cmd/api/main_test.go b/src/cmd/api/main_test.go
new file mode 100644
index 0000000..f3201e9
--- /dev/null
+++ b/src/cmd/api/main_test.go
@@ -0,0 +1,1230 @@
+// Copyright 2011 The Go 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 computes the exported API of a set of Go packages.
+// It is only a test, not a command, nor a usefully importable package.
+
+package main
+
+import (
+	"bufio"
+	"bytes"
+	"encoding/json"
+	"fmt"
+	"go/ast"
+	"go/build"
+	"go/parser"
+	"go/token"
+	"go/types"
+	"internal/testenv"
+	"io"
+	"log"
+	"os"
+	"os/exec"
+	"path/filepath"
+	"regexp"
+	"runtime"
+	"sort"
+	"strconv"
+	"strings"
+	"sync"
+	"testing"
+)
+
+const verbose = false
+
+func goCmd() string {
+	var exeSuffix string
+	if runtime.GOOS == "windows" {
+		exeSuffix = ".exe"
+	}
+	path := filepath.Join(testenv.GOROOT(nil), "bin", "go"+exeSuffix)
+	if _, err := os.Stat(path); err == nil {
+		return path
+	}
+	return "go"
+}
+
+// contexts are the default contexts which are scanned.
+var contexts = []*build.Context{
+	{GOOS: "linux", GOARCH: "386", CgoEnabled: true},
+	{GOOS: "linux", GOARCH: "386"},
+	{GOOS: "linux", GOARCH: "amd64", CgoEnabled: true},
+	{GOOS: "linux", GOARCH: "amd64"},
+	{GOOS: "linux", GOARCH: "arm", CgoEnabled: true},
+	{GOOS: "linux", GOARCH: "arm"},
+	{GOOS: "darwin", GOARCH: "amd64", CgoEnabled: true},
+	{GOOS: "darwin", GOARCH: "amd64"},
+	{GOOS: "darwin", GOARCH: "arm64", CgoEnabled: true},
+	{GOOS: "darwin", GOARCH: "arm64"},
+	{GOOS: "windows", GOARCH: "amd64"},
+	{GOOS: "windows", GOARCH: "386"},
+	{GOOS: "freebsd", GOARCH: "386", CgoEnabled: true},
+	{GOOS: "freebsd", GOARCH: "386"},
+	{GOOS: "freebsd", GOARCH: "amd64", CgoEnabled: true},
+	{GOOS: "freebsd", GOARCH: "amd64"},
+	{GOOS: "freebsd", GOARCH: "arm", CgoEnabled: true},
+	{GOOS: "freebsd", GOARCH: "arm"},
+	{GOOS: "freebsd", GOARCH: "arm64", CgoEnabled: true},
+	{GOOS: "freebsd", GOARCH: "arm64"},
+	{GOOS: "freebsd", GOARCH: "riscv64", CgoEnabled: true},
+	{GOOS: "freebsd", GOARCH: "riscv64"},
+	{GOOS: "netbsd", GOARCH: "386", CgoEnabled: true},
+	{GOOS: "netbsd", GOARCH: "386"},
+	{GOOS: "netbsd", GOARCH: "amd64", CgoEnabled: true},
+	{GOOS: "netbsd", GOARCH: "amd64"},
+	{GOOS: "netbsd", GOARCH: "arm", CgoEnabled: true},
+	{GOOS: "netbsd", GOARCH: "arm"},
+	{GOOS: "netbsd", GOARCH: "arm64", CgoEnabled: true},
+	{GOOS: "netbsd", GOARCH: "arm64"},
+	{GOOS: "openbsd", GOARCH: "386", CgoEnabled: true},
+	{GOOS: "openbsd", GOARCH: "386"},
+	{GOOS: "openbsd", GOARCH: "amd64", CgoEnabled: true},
+	{GOOS: "openbsd", GOARCH: "amd64"},
+}
+
+func contextName(c *build.Context) string {
+	s := c.GOOS + "-" + c.GOARCH
+	if c.CgoEnabled {
+		s += "-cgo"
+	}
+	if c.Dir != "" {
+		s += fmt.Sprintf(" [%s]", c.Dir)
+	}
+	return s
+}
+
+var internalPkg = regexp.MustCompile(`(^|/)internal($|/)`)
+
+var exitCode = 0
+
+func Check(t *testing.T) {
+	checkFiles, err := filepath.Glob(filepath.Join(testenv.GOROOT(t), "api/go1*.txt"))
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	var nextFiles []string
+	if strings.Contains(runtime.Version(), "devel") {
+		next, err := filepath.Glob(filepath.Join(testenv.GOROOT(t), "api/next/*.txt"))
+		if err != nil {
+			t.Fatal(err)
+		}
+		nextFiles = next
+	}
+
+	for _, c := range contexts {
+		c.Compiler = build.Default.Compiler
+	}
+
+	walkers := make([]*Walker, len(contexts))
+	var wg sync.WaitGroup
+	for i, context := range contexts {
+		i, context := i, context
+		wg.Add(1)
+		go func() {
+			defer wg.Done()
+			walkers[i] = NewWalker(context, filepath.Join(testenv.GOROOT(t), "src"))
+		}()
+	}
+	wg.Wait()
+
+	var featureCtx = make(map[string]map[string]bool) // feature -> context name -> true
+	for _, w := range walkers {
+		for _, name := range w.stdPackages {
+			pkg, err := w.import_(name)
+			if _, nogo := err.(*build.NoGoError); nogo {
+				continue
+			}
+			if err != nil {
+				log.Fatalf("Import(%q): %v", name, err)
+			}
+			w.export(pkg)
+		}
+
+		ctxName := contextName(w.context)
+		for _, f := range w.Features() {
+			if featureCtx[f] == nil {
+				featureCtx[f] = make(map[string]bool)
+			}
+			featureCtx[f][ctxName] = true
+		}
+	}
+
+	var features []string
+	for f, cmap := range featureCtx {
+		if len(cmap) == len(contexts) {
+			features = append(features, f)
+			continue
+		}
+		comma := strings.Index(f, ",")
+		for cname := range cmap {
+			f2 := fmt.Sprintf("%s (%s)%s", f[:comma], cname, f[comma:])
+			features = append(features, f2)
+		}
+	}
+
+	bw := bufio.NewWriter(os.Stdout)
+	defer bw.Flush()
+
+	var required []string
+	for _, file := range checkFiles {
+		required = append(required, fileFeatures(file, needApproval(file))...)
+	}
+	for _, file := range nextFiles {
+		required = append(required, fileFeatures(file, true)...)
+	}
+	exception := fileFeatures(filepath.Join(testenv.GOROOT(t), "api/except.txt"), false)
+
+	if exitCode == 1 {
+		t.Errorf("API database problems found")
+	}
+	if !compareAPI(bw, features, required, exception) {
+		t.Errorf("API differences found")
+	}
+}
+
+// export emits the exported package features.
+func (w *Walker) export(pkg *apiPackage) {
+	if verbose {
+		log.Println(pkg)
+	}
+	pop := w.pushScope("pkg " + pkg.Path())
+	w.current = pkg
+	w.collectDeprecated()
+	scope := pkg.Scope()
+	for _, name := range scope.Names() {
+		if token.IsExported(name) {
+			w.emitObj(scope.Lookup(name))
+		}
+	}
+	pop()
+}
+
+func set(items []string) map[string]bool {
+	s := make(map[string]bool)
+	for _, v := range items {
+		s[v] = true
+	}
+	return s
+}
+
+var spaceParensRx = regexp.MustCompile(` \(\S+?\)`)
+
+func featureWithoutContext(f string) string {
+	if !strings.Contains(f, "(") {
+		return f
+	}
+	return spaceParensRx.ReplaceAllString(f, "")
+}
+
+// portRemoved reports whether the given port-specific API feature is
+// okay to no longer exist because its port was removed.
+func portRemoved(feature string) bool {
+	return strings.Contains(feature, "(darwin-386)") ||
+		strings.Contains(feature, "(darwin-386-cgo)")
+}
+
+func compareAPI(w io.Writer, features, required, exception []string) (ok bool) {
+	ok = true
+
+	featureSet := set(features)
+	exceptionSet := set(exception)
+
+	sort.Strings(features)
+	sort.Strings(required)
+
+	take := func(sl *[]string) string {
+		s := (*sl)[0]
+		*sl = (*sl)[1:]
+		return s
+	}
+
+	for len(features) > 0 || len(required) > 0 {
+		switch {
+		case len(features) == 0 || (len(required) > 0 && required[0] < features[0]):
+			feature := take(&required)
+			if exceptionSet[feature] {
+				// An "unfortunate" case: the feature was once
+				// included in the API (e.g. go1.txt), but was
+				// subsequently removed. These are already
+				// acknowledged by being in the file
+				// "api/except.txt". No need to print them out
+				// here.
+			} else if portRemoved(feature) {
+				// okay.
+			} else if featureSet[featureWithoutContext(feature)] {
+				// okay.
+			} else {
+				fmt.Fprintf(w, "-%s\n", feature)
+				ok = false // broke compatibility
+			}
+		case len(required) == 0 || (len(features) > 0 && required[0] > features[0]):
+			newFeature := take(&features)
+			fmt.Fprintf(w, "+%s\n", newFeature)
+			ok = false // feature not in api/next/*
+		default:
+			take(&required)
+			take(&features)
+		}
+	}
+
+	return ok
+}
+
+// aliasReplacer applies type aliases to earlier API files,
+// to avoid misleading negative results.
+// This makes all the references to os.FileInfo in go1.txt
+// be read as if they said fs.FileInfo, since os.FileInfo is now an alias.
+// If there are many of these, we could do a more general solution,
+// but for now the replacer is fine.
+var aliasReplacer = strings.NewReplacer(
+	"os.FileInfo", "fs.FileInfo",
+	"os.FileMode", "fs.FileMode",
+	"os.PathError", "fs.PathError",
+)
+
+func fileFeatures(filename string, needApproval bool) []string {
+	bs, err := os.ReadFile(filename)
+	if err != nil {
+		log.Fatal(err)
+	}
+	s := string(bs)
+
+	// Diagnose common mistakes people make,
+	// since there is no apifmt to format these files.
+	// The missing final newline is important for the
+	// final release step of cat next/*.txt >go1.X.txt.
+	// If the files don't end in full lines, the concatenation goes awry.
+	if strings.Contains(s, "\r") {
+		log.Printf("%s: contains CRLFs", filename)
+		exitCode = 1
+	}
+	if filepath.Base(filename) == "go1.4.txt" {
+		// No use for blank lines in api files, except go1.4.txt
+		// used them in a reasonable way and we should let it be.
+	} else if strings.HasPrefix(s, "\n") || strings.Contains(s, "\n\n") {
+		log.Printf("%s: contains a blank line", filename)
+		exitCode = 1
+	}
+	if s == "" {
+		log.Printf("%s: empty file", filename)
+		exitCode = 1
+	} else if s[len(s)-1] != '\n' {
+		log.Printf("%s: missing final newline", filename)
+		exitCode = 1
+	}
+	s = aliasReplacer.Replace(s)
+	lines := strings.Split(s, "\n")
+	var nonblank []string
+	for i, line := range lines {
+		line = strings.TrimSpace(line)
+		if line == "" || strings.HasPrefix(line, "#") {
+			continue
+		}
+		if needApproval {
+			feature, approval, ok := strings.Cut(line, "#")
+			if !ok {
+				log.Printf("%s:%d: missing proposal approval\n", filename, i+1)
+				exitCode = 1
+			} else {
+				_, err := strconv.Atoi(approval)
+				if err != nil {
+					log.Printf("%s:%d: malformed proposal approval #%s\n", filename, i+1, approval)
+					exitCode = 1
+				}
+			}
+			line = strings.TrimSpace(feature)
+		} else {
+			if strings.Contains(line, " #") {
+				log.Printf("%s:%d: unexpected approval\n", filename, i+1)
+				exitCode = 1
+			}
+		}
+		nonblank = append(nonblank, line)
+	}
+	return nonblank
+}
+
+var fset = token.NewFileSet()
+
+type Walker struct {
+	context     *build.Context
+	root        string
+	scope       []string
+	current     *apiPackage
+	deprecated  map[token.Pos]bool
+	features    map[string]bool              // set
+	imported    map[string]*apiPackage       // packages already imported
+	stdPackages []string                     // names, omitting "unsafe", internal, and vendored packages
+	importMap   map[string]map[string]string // importer dir -> import path -> canonical path
+	importDir   map[string]string            // canonical import path -> dir
+
+}
+
+func NewWalker(context *build.Context, root string) *Walker {
+	w := &Walker{
+		context:  context,
+		root:     root,
+		features: map[string]bool{},
+		imported: map[string]*apiPackage{"unsafe": &apiPackage{Package: types.Unsafe}},
+	}
+	w.loadImports()
+	return w
+}
+
+func (w *Walker) Features() (fs []string) {
+	for f := range w.features {
+		fs = append(fs, f)
+	}
+	sort.Strings(fs)
+	return
+}
+
+var parsedFileCache = make(map[string]*ast.File)
+
+func (w *Walker) parseFile(dir, file string) (*ast.File, error) {
+	filename := filepath.Join(dir, file)
+	if f := parsedFileCache[filename]; f != nil {
+		return f, nil
+	}
+
+	f, err := parser.ParseFile(fset, filename, nil, parser.ParseComments)
+	if err != nil {
+		return nil, err
+	}
+	parsedFileCache[filename] = f
+
+	return f, nil
+}
+
+// Disable before debugging non-obvious errors from the type-checker.
+const usePkgCache = true
+
+var (
+	pkgCache = map[string]*apiPackage{} // map tagKey to package
+	pkgTags  = map[string][]string{}    // map import dir to list of relevant tags
+)
+
+// tagKey returns the tag-based key to use in the pkgCache.
+// It is a comma-separated string; the first part is dir, the rest tags.
+// The satisfied tags are derived from context but only those that
+// matter (the ones listed in the tags argument plus GOOS and GOARCH) are used.
+// The tags list, which came from go/build's Package.AllTags,
+// is known to be sorted.
+func tagKey(dir string, context *build.Context, tags []string) string {
+	ctags := map[string]bool{
+		context.GOOS:   true,
+		context.GOARCH: true,
+	}
+	if context.CgoEnabled {
+		ctags["cgo"] = true
+	}
+	for _, tag := range context.BuildTags {
+		ctags[tag] = true
+	}
+	// TODO: ReleaseTags (need to load default)
+	key := dir
+
+	// explicit on GOOS and GOARCH as global cache will use "all" cached packages for
+	// an indirect imported package. See https://github.com/golang/go/issues/21181
+	// for more detail.
+	tags = append(tags, context.GOOS, context.GOARCH)
+	sort.Strings(tags)
+
+	for _, tag := range tags {
+		if ctags[tag] {
+			key += "," + tag
+			ctags[tag] = false
+		}
+	}
+	return key
+}
+
+type listImports struct {
+	stdPackages []string                     // names, omitting "unsafe", internal, and vendored packages
+	importDir   map[string]string            // canonical import path → directory
+	importMap   map[string]map[string]string // import path → canonical import path
+}
+
+var listCache sync.Map // map[string]listImports, keyed by contextName
+
+// listSem is a semaphore restricting concurrent invocations of 'go list'. 'go
+// list' has its own internal concurrency, so we use a hard-coded constant (to
+// allow the I/O-intensive phases of 'go list' to overlap) instead of scaling
+// all the way up to GOMAXPROCS.
+var listSem = make(chan semToken, 2)
+
+type semToken struct{}
+
+// loadImports populates w with information about the packages in the standard
+// library and the packages they themselves import in w's build context.
+//
+// The source import path and expanded import path are identical except for vendored packages.
+// For example, on return:
+//
+//	w.importMap["math"] = "math"
+//	w.importDir["math"] = "<goroot>/src/math"
+//
+//	w.importMap["golang.org/x/net/route"] = "vendor/golang.org/x/net/route"
+//	w.importDir["vendor/golang.org/x/net/route"] = "<goroot>/src/vendor/golang.org/x/net/route"
+//
+// Since the set of packages that exist depends on context, the result of
+// loadImports also depends on context. However, to improve test running time
+// the configuration for each environment is cached across runs.
+func (w *Walker) loadImports() {
+	if w.context == nil {
+		return // test-only Walker; does not use the import map
+	}
+
+	name := contextName(w.context)
+
+	imports, ok := listCache.Load(name)
+	if !ok {
+		listSem <- semToken{}
+		defer func() { <-listSem }()
+
+		cmd := exec.Command(goCmd(), "list", "-e", "-deps", "-json", "std")
+		cmd.Env = listEnv(w.context)
+		if w.context.Dir != "" {
+			cmd.Dir = w.context.Dir
+		}
+		out, err := cmd.CombinedOutput()
+		if err != nil {
+			log.Fatalf("loading imports: %v\n%s", err, out)
+		}
+
+		var stdPackages []string
+		importMap := make(map[string]map[string]string)
+		importDir := make(map[string]string)
+		dec := json.NewDecoder(bytes.NewReader(out))
+		for {
+			var pkg struct {
+				ImportPath, Dir string
+				ImportMap       map[string]string
+				Standard        bool
+			}
+			err := dec.Decode(&pkg)
+			if err == io.EOF {
+				break
+			}
+			if err != nil {
+				log.Fatalf("go list: invalid output: %v", err)
+			}
+
+			// - Package "unsafe" contains special signatures requiring
+			//   extra care when printing them - ignore since it is not
+			//   going to change w/o a language change.
+			// - Internal and vendored packages do not contribute to our
+			//   API surface. (If we are running within the "std" module,
+			//   vendored dependencies appear as themselves instead of
+			//   their "vendor/" standard-library copies.)
+			// - 'go list std' does not include commands, which cannot be
+			//   imported anyway.
+			if ip := pkg.ImportPath; pkg.Standard && ip != "unsafe" && !strings.HasPrefix(ip, "vendor/") && !internalPkg.MatchString(ip) {
+				stdPackages = append(stdPackages, ip)
+			}
+			importDir[pkg.ImportPath] = pkg.Dir
+			if len(pkg.ImportMap) > 0 {
+				importMap[pkg.Dir] = make(map[string]string, len(pkg.ImportMap))
+			}
+			for k, v := range pkg.ImportMap {
+				importMap[pkg.Dir][k] = v
+			}
+		}
+
+		sort.Strings(stdPackages)
+		imports = listImports{
+			stdPackages: stdPackages,
+			importMap:   importMap,
+			importDir:   importDir,
+		}
+		imports, _ = listCache.LoadOrStore(name, imports)
+	}
+
+	li := imports.(listImports)
+	w.stdPackages = li.stdPackages
+	w.importDir = li.importDir
+	w.importMap = li.importMap
+}
+
+// listEnv returns the process environment to use when invoking 'go list' for
+// the given context.
+func listEnv(c *build.Context) []string {
+	if c == nil {
+		return os.Environ()
+	}
+
+	environ := append(os.Environ(),
+		"GOOS="+c.GOOS,
+		"GOARCH="+c.GOARCH)
+	if c.CgoEnabled {
+		environ = append(environ, "CGO_ENABLED=1")
+	} else {
+		environ = append(environ, "CGO_ENABLED=0")
+	}
+	return environ
+}
+
+type apiPackage struct {
+	*types.Package
+	Files []*ast.File
+}
+
+// Importing is a sentinel taking the place in Walker.imported
+// for a package that is in the process of being imported.
+var importing apiPackage
+
+// Import implements types.Importer.
+func (w *Walker) Import(name string) (*types.Package, error) {
+	return w.ImportFrom(name, "", 0)
+}
+
+// ImportFrom implements types.ImporterFrom.
+func (w *Walker) ImportFrom(fromPath, fromDir string, mode types.ImportMode) (*types.Package, error) {
+	pkg, err := w.importFrom(fromPath, fromDir, mode)
+	if err != nil {
+		return nil, err
+	}
+	return pkg.Package, nil
+}
+
+func (w *Walker) import_(name string) (*apiPackage, error) {
+	return w.importFrom(name, "", 0)
+}
+
+func (w *Walker) importFrom(fromPath, fromDir string, mode types.ImportMode) (*apiPackage, error) {
+	name := fromPath
+	if canonical, ok := w.importMap[fromDir][fromPath]; ok {
+		name = canonical
+	}
+
+	pkg := w.imported[name]
+	if pkg != nil {
+		if pkg == &importing {
+			log.Fatalf("cycle importing package %q", name)
+		}
+		return pkg, nil
+	}
+	w.imported[name] = &importing
+
+	// Determine package files.
+	dir := w.importDir[name]
+	if dir == "" {
+		dir = filepath.Join(w.root, filepath.FromSlash(name))
+	}
+	if fi, err := os.Stat(dir); err != nil || !fi.IsDir() {
+		log.Panicf("no source in tree for import %q (from import %s in %s): %v", name, fromPath, fromDir, err)
+	}
+
+	context := w.context
+	if context == nil {
+		context = &build.Default
+	}
+
+	// Look in cache.
+	// If we've already done an import with the same set
+	// of relevant tags, reuse the result.
+	var key string
+	if usePkgCache {
+		if tags, ok := pkgTags[dir]; ok {
+			key = tagKey(dir, context, tags)
+			if pkg := pkgCache[key]; pkg != nil {
+				w.imported[name] = pkg
+				return pkg, nil
+			}
+		}
+	}
+
+	info, err := context.ImportDir(dir, 0)
+	if err != nil {
+		if _, nogo := err.(*build.NoGoError); nogo {
+			return nil, err
+		}
+		log.Fatalf("pkg %q, dir %q: ScanDir: %v", name, dir, err)
+	}
+
+	// Save tags list first time we see a directory.
+	if usePkgCache {
+		if _, ok := pkgTags[dir]; !ok {
+			pkgTags[dir] = info.AllTags
+			key = tagKey(dir, context, info.AllTags)
+		}
+	}
+
+	filenames := append(append([]string{}, info.GoFiles...), info.CgoFiles...)
+
+	// Parse package files.
+	var files []*ast.File
+	for _, file := range filenames {
+		f, err := w.parseFile(dir, file)
+		if err != nil {
+			log.Fatalf("error parsing package %s: %s", name, err)
+		}
+		files = append(files, f)
+	}
+
+	// Type-check package files.
+	var sizes types.Sizes
+	if w.context != nil {
+		sizes = types.SizesFor(w.context.Compiler, w.context.GOARCH)
+	}
+	conf := types.Config{
+		IgnoreFuncBodies: true,
+		FakeImportC:      true,
+		Importer:         w,
+		Sizes:            sizes,
+	}
+	tpkg, err := conf.Check(name, fset, files, nil)
+	if err != nil {
+		ctxt := "<no context>"
+		if w.context != nil {
+			ctxt = fmt.Sprintf("%s-%s", w.context.GOOS, w.context.GOARCH)
+		}
+		log.Fatalf("error typechecking package %s: %s (%s)", name, err, ctxt)
+	}
+	pkg = &apiPackage{tpkg, files}
+
+	if usePkgCache {
+		pkgCache[key] = pkg
+	}
+
+	w.imported[name] = pkg
+	return pkg, nil
+}
+
+// pushScope enters a new scope (walking a package, type, node, etc)
+// and returns a function that will leave the scope (with sanity checking
+// for mismatched pushes & pops)
+func (w *Walker) pushScope(name string) (popFunc func()) {
+	w.scope = append(w.scope, name)
+	return func() {
+		if len(w.scope) == 0 {
+			log.Fatalf("attempt to leave scope %q with empty scope list", name)
+		}
+		if w.scope[len(w.scope)-1] != name {
+			log.Fatalf("attempt to leave scope %q, but scope is currently %#v", name, w.scope)
+		}
+		w.scope = w.scope[:len(w.scope)-1]
+	}
+}
+
+func sortedMethodNames(typ *types.Interface) []string {
+	n := typ.NumMethods()
+	list := make([]string, n)
+	for i := range list {
+		list[i] = typ.Method(i).Name()
+	}
+	sort.Strings(list)
+	return list
+}
+
+// sortedEmbeddeds returns constraint types embedded in an
+// interface. It does not include embedded interface types or methods.
+func (w *Walker) sortedEmbeddeds(typ *types.Interface) []string {
+	n := typ.NumEmbeddeds()
+	list := make([]string, 0, n)
+	for i := 0; i < n; i++ {
+		emb := typ.EmbeddedType(i)
+		switch emb := emb.(type) {
+		case *types.Interface:
+			list = append(list, w.sortedEmbeddeds(emb)...)
+		case *types.Union:
+			var buf bytes.Buffer
+			nu := emb.Len()
+			for i := 0; i < nu; i++ {
+				if i > 0 {
+					buf.WriteString(" | ")
+				}
+				term := emb.Term(i)
+				if term.Tilde() {
+					buf.WriteByte('~')
+				}
+				w.writeType(&buf, term.Type())
+			}
+			list = append(list, buf.String())
+		}
+	}
+	sort.Strings(list)
+	return list
+}
+
+func (w *Walker) writeType(buf *bytes.Buffer, typ types.Type) {
+	switch typ := typ.(type) {
+	case *types.Basic:
+		s := typ.Name()
+		switch typ.Kind() {
+		case types.UnsafePointer:
+			s = "unsafe.Pointer"
+		case types.UntypedBool:
+			s = "ideal-bool"
+		case types.UntypedInt:
+			s = "ideal-int"
+		case types.UntypedRune:
+			// "ideal-char" for compatibility with old tool
+			// TODO(gri) change to "ideal-rune"
+			s = "ideal-char"
+		case types.UntypedFloat:
+			s = "ideal-float"
+		case types.UntypedComplex:
+			s = "ideal-complex"
+		case types.UntypedString:
+			s = "ideal-string"
+		case types.UntypedNil:
+			panic("should never see untyped nil type")
+		default:
+			switch s {
+			case "byte":
+				s = "uint8"
+			case "rune":
+				s = "int32"
+			}
+		}
+		buf.WriteString(s)
+
+	case *types.Array:
+		fmt.Fprintf(buf, "[%d]", typ.Len())
+		w.writeType(buf, typ.Elem())
+
+	case *types.Slice:
+		buf.WriteString("[]")
+		w.writeType(buf, typ.Elem())
+
+	case *types.Struct:
+		buf.WriteString("struct")
+
+	case *types.Pointer:
+		buf.WriteByte('*')
+		w.writeType(buf, typ.Elem())
+
+	case *types.Tuple:
+		panic("should never see a tuple type")
+
+	case *types.Signature:
+		buf.WriteString("func")
+		w.writeSignature(buf, typ)
+
+	case *types.Interface:
+		buf.WriteString("interface{")
+		if typ.NumMethods() > 0 || typ.NumEmbeddeds() > 0 {
+			buf.WriteByte(' ')
+		}
+		if typ.NumMethods() > 0 {
+			buf.WriteString(strings.Join(sortedMethodNames(typ), ", "))
+		}
+		if typ.NumEmbeddeds() > 0 {
+			buf.WriteString(strings.Join(w.sortedEmbeddeds(typ), ", "))
+		}
+		if typ.NumMethods() > 0 || typ.NumEmbeddeds() > 0 {
+			buf.WriteByte(' ')
+		}
+		buf.WriteString("}")
+
+	case *types.Map:
+		buf.WriteString("map[")
+		w.writeType(buf, typ.Key())
+		buf.WriteByte(']')
+		w.writeType(buf, typ.Elem())
+
+	case *types.Chan:
+		var s string
+		switch typ.Dir() {
+		case types.SendOnly:
+			s = "chan<- "
+		case types.RecvOnly:
+			s = "<-chan "
+		case types.SendRecv:
+			s = "chan "
+		default:
+			panic("unreachable")
+		}
+		buf.WriteString(s)
+		w.writeType(buf, typ.Elem())
+
+	case *types.Named:
+		obj := typ.Obj()
+		pkg := obj.Pkg()
+		if pkg != nil && pkg != w.current.Package {
+			buf.WriteString(pkg.Name())
+			buf.WriteByte('.')
+		}
+		buf.WriteString(typ.Obj().Name())
+
+	case *types.TypeParam:
+		// Type parameter names may change, so use a placeholder instead.
+		fmt.Fprintf(buf, "$%d", typ.Index())
+
+	default:
+		panic(fmt.Sprintf("unknown type %T", typ))
+	}
+}
+
+func (w *Walker) writeSignature(buf *bytes.Buffer, sig *types.Signature) {
+	if tparams := sig.TypeParams(); tparams != nil {
+		w.writeTypeParams(buf, tparams, true)
+	}
+	w.writeParams(buf, sig.Params(), sig.Variadic())
+	switch res := sig.Results(); res.Len() {
+	case 0:
+		// nothing to do
+	case 1:
+		buf.WriteByte(' ')
+		w.writeType(buf, res.At(0).Type())
+	default:
+		buf.WriteByte(' ')
+		w.writeParams(buf, res, false)
+	}
+}
+
+func (w *Walker) writeTypeParams(buf *bytes.Buffer, tparams *types.TypeParamList, withConstraints bool) {
+	buf.WriteByte('[')
+	c := tparams.Len()
+	for i := 0; i < c; i++ {
+		if i > 0 {
+			buf.WriteString(", ")
+		}
+		tp := tparams.At(i)
+		w.writeType(buf, tp)
+		if withConstraints {
+			buf.WriteByte(' ')
+			w.writeType(buf, tp.Constraint())
+		}
+	}
+	buf.WriteByte(']')
+}
+
+func (w *Walker) writeParams(buf *bytes.Buffer, t *types.Tuple, variadic bool) {
+	buf.WriteByte('(')
+	for i, n := 0, t.Len(); i < n; i++ {
+		if i > 0 {
+			buf.WriteString(", ")
+		}
+		typ := t.At(i).Type()
+		if variadic && i+1 == n {
+			buf.WriteString("...")
+			typ = typ.(*types.Slice).Elem()
+		}
+		w.writeType(buf, typ)
+	}
+	buf.WriteByte(')')
+}
+
+func (w *Walker) typeString(typ types.Type) string {
+	var buf bytes.Buffer
+	w.writeType(&buf, typ)
+	return buf.String()
+}
+
+func (w *Walker) signatureString(sig *types.Signature) string {
+	var buf bytes.Buffer
+	w.writeSignature(&buf, sig)
+	return buf.String()
+}
+
+func (w *Walker) emitObj(obj types.Object) {
+	switch obj := obj.(type) {
+	case *types.Const:
+		if w.isDeprecated(obj) {
+			w.emitf("const %s //deprecated", obj.Name())
+		}
+		w.emitf("const %s %s", obj.Name(), w.typeString(obj.Type()))
+		x := obj.Val()
+		short := x.String()
+		exact := x.ExactString()
+		if short == exact {
+			w.emitf("const %s = %s", obj.Name(), short)
+		} else {
+			w.emitf("const %s = %s  // %s", obj.Name(), short, exact)
+		}
+	case *types.Var:
+		if w.isDeprecated(obj) {
+			w.emitf("var %s //deprecated", obj.Name())
+		}
+		w.emitf("var %s %s", obj.Name(), w.typeString(obj.Type()))
+	case *types.TypeName:
+		w.emitType(obj)
+	case *types.Func:
+		w.emitFunc(obj)
+	default:
+		panic("unknown object: " + obj.String())
+	}
+}
+
+func (w *Walker) emitType(obj *types.TypeName) {
+	name := obj.Name()
+	if w.isDeprecated(obj) {
+		w.emitf("type %s //deprecated", name)
+	}
+	if tparams := obj.Type().(*types.Named).TypeParams(); tparams != nil {
+		var buf bytes.Buffer
+		buf.WriteString(name)
+		w.writeTypeParams(&buf, tparams, true)
+		name = buf.String()
+	}
+	typ := obj.Type()
+	if obj.IsAlias() {
+		w.emitf("type %s = %s", name, w.typeString(typ))
+		return
+	}
+	switch typ := typ.Underlying().(type) {
+	case *types.Struct:
+		w.emitStructType(name, typ)
+	case *types.Interface:
+		w.emitIfaceType(name, typ)
+		return // methods are handled by emitIfaceType
+	default:
+		w.emitf("type %s %s", name, w.typeString(typ.Underlying()))
+	}
+
+	// emit methods with value receiver
+	var methodNames map[string]bool
+	vset := types.NewMethodSet(typ)
+	for i, n := 0, vset.Len(); i < n; i++ {
+		m := vset.At(i)
+		if m.Obj().Exported() {
+			w.emitMethod(m)
+			if methodNames == nil {
+				methodNames = make(map[string]bool)
+			}
+			methodNames[m.Obj().Name()] = true
+		}
+	}
+
+	// emit methods with pointer receiver; exclude
+	// methods that we have emitted already
+	// (the method set of *T includes the methods of T)
+	pset := types.NewMethodSet(types.NewPointer(typ))
+	for i, n := 0, pset.Len(); i < n; i++ {
+		m := pset.At(i)
+		if m.Obj().Exported() && !methodNames[m.Obj().Name()] {
+			w.emitMethod(m)
+		}
+	}
+}
+
+func (w *Walker) emitStructType(name string, typ *types.Struct) {
+	typeStruct := fmt.Sprintf("type %s struct", name)
+	w.emitf(typeStruct)
+	defer w.pushScope(typeStruct)()
+
+	for i := 0; i < typ.NumFields(); i++ {
+		f := typ.Field(i)
+		if !f.Exported() {
+			continue
+		}
+		typ := f.Type()
+		if f.Anonymous() {
+			if w.isDeprecated(f) {
+				w.emitf("embedded %s //deprecated", w.typeString(typ))
+			}
+			w.emitf("embedded %s", w.typeString(typ))
+			continue
+		}
+		if w.isDeprecated(f) {
+			w.emitf("%s //deprecated", f.Name())
+		}
+		w.emitf("%s %s", f.Name(), w.typeString(typ))
+	}
+}
+
+func (w *Walker) emitIfaceType(name string, typ *types.Interface) {
+	pop := w.pushScope("type " + name + " interface")
+
+	var methodNames []string
+	complete := true
+	mset := types.NewMethodSet(typ)
+	for i, n := 0, mset.Len(); i < n; i++ {
+		m := mset.At(i).Obj().(*types.Func)
+		if !m.Exported() {
+			complete = false
+			continue
+		}
+		methodNames = append(methodNames, m.Name())
+		if w.isDeprecated(m) {
+			w.emitf("%s //deprecated", m.Name())
+		}
+		w.emitf("%s%s", m.Name(), w.signatureString(m.Type().(*types.Signature)))
+	}
+
+	if !complete {
+		// The method set has unexported methods, so all the
+		// implementations are provided by the same package,
+		// so the method set can be extended. Instead of recording
+		// the full set of names (below), record only that there were
+		// unexported methods. (If the interface shrinks, we will notice
+		// because a method signature emitted during the last loop
+		// will disappear.)
+		w.emitf("unexported methods")
+	}
+
+	pop()
+
+	if !complete {
+		return
+	}
+
+	if len(methodNames) == 0 {
+		w.emitf("type %s interface {}", name)
+		return
+	}
+
+	sort.Strings(methodNames)
+	w.emitf("type %s interface { %s }", name, strings.Join(methodNames, ", "))
+}
+
+func (w *Walker) emitFunc(f *types.Func) {
+	sig := f.Type().(*types.Signature)
+	if sig.Recv() != nil {
+		panic("method considered a regular function: " + f.String())
+	}
+	if w.isDeprecated(f) {
+		w.emitf("func %s //deprecated", f.Name())
+	}
+	w.emitf("func %s%s", f.Name(), w.signatureString(sig))
+}
+
+func (w *Walker) emitMethod(m *types.Selection) {
+	sig := m.Type().(*types.Signature)
+	recv := sig.Recv().Type()
+	// report exported methods with unexported receiver base type
+	if true {
+		base := recv
+		if p, _ := recv.(*types.Pointer); p != nil {
+			base = p.Elem()
+		}
+		if obj := base.(*types.Named).Obj(); !obj.Exported() {
+			log.Fatalf("exported method with unexported receiver base type: %s", m)
+		}
+	}
+	tps := ""
+	if rtp := sig.RecvTypeParams(); rtp != nil {
+		var buf bytes.Buffer
+		w.writeTypeParams(&buf, rtp, false)
+		tps = buf.String()
+	}
+	if w.isDeprecated(m.Obj()) {
+		w.emitf("method (%s%s) %s //deprecated", w.typeString(recv), tps, m.Obj().Name())
+	}
+	w.emitf("method (%s%s) %s%s", w.typeString(recv), tps, m.Obj().Name(), w.signatureString(sig))
+}
+
+func (w *Walker) emitf(format string, args ...any) {
+	f := strings.Join(w.scope, ", ") + ", " + fmt.Sprintf(format, args...)
+	if strings.Contains(f, "\n") {
+		panic("feature contains newlines: " + f)
+	}
+
+	if _, dup := w.features[f]; dup {
+		panic("duplicate feature inserted: " + f)
+	}
+	w.features[f] = true
+
+	if verbose {
+		log.Printf("feature: %s", f)
+	}
+}
+
+func needApproval(filename string) bool {
+	name := filepath.Base(filename)
+	if name == "go1.txt" {
+		return false
+	}
+	minor := strings.TrimSuffix(strings.TrimPrefix(name, "go1."), ".txt")
+	n, err := strconv.Atoi(minor)
+	if err != nil {
+		log.Fatalf("unexpected api file: %v", name)
+	}
+	return n >= 19 // started tracking approvals in Go 1.19
+}
+
+func (w *Walker) collectDeprecated() {
+	isDeprecated := func(doc *ast.CommentGroup) bool {
+		if doc != nil {
+			for _, c := range doc.List {
+				if strings.HasPrefix(c.Text, "// Deprecated:") {
+					return true
+				}
+			}
+		}
+		return false
+	}
+
+	w.deprecated = make(map[token.Pos]bool)
+	mark := func(id *ast.Ident) {
+		if id != nil {
+			w.deprecated[id.Pos()] = true
+		}
+	}
+	for _, file := range w.current.Files {
+		ast.Inspect(file, func(n ast.Node) bool {
+			switch n := n.(type) {
+			case *ast.File:
+				if isDeprecated(n.Doc) {
+					mark(n.Name)
+				}
+				return true
+			case *ast.GenDecl:
+				if isDeprecated(n.Doc) {
+					for _, spec := range n.Specs {
+						switch spec := spec.(type) {
+						case *ast.ValueSpec:
+							for _, id := range spec.Names {
+								mark(id)
+							}
+						case *ast.TypeSpec:
+							mark(spec.Name)
+						}
+					}
+				}
+				return true // look at specs
+			case *ast.FuncDecl:
+				if isDeprecated(n.Doc) {
+					mark(n.Name)
+				}
+				return false
+			case *ast.TypeSpec:
+				if isDeprecated(n.Doc) {
+					mark(n.Name)
+				}
+				return true // recurse into struct or interface type
+			case *ast.StructType:
+				return true // recurse into fields
+			case *ast.InterfaceType:
+				return true // recurse into methods
+			case *ast.FieldList:
+				return true // recurse into fields
+			case *ast.ValueSpec:
+				if isDeprecated(n.Doc) {
+					for _, id := range n.Names {
+						mark(id)
+					}
+				}
+				return false
+			case *ast.Field:
+				if isDeprecated(n.Doc) {
+					for _, id := range n.Names {
+						mark(id)
+					}
+					if len(n.Names) == 0 {
+						// embedded field T or *T?
+						typ := n.Type
+						if ptr, ok := typ.(*ast.StarExpr); ok {
+							typ = ptr.X
+						}
+						if id, ok := typ.(*ast.Ident); ok {
+							mark(id)
+						}
+					}
+				}
+				return false
+			default:
+				return false
+			}
+		})
+	}
+}
+
+func (w *Walker) isDeprecated(obj types.Object) bool {
+	return w.deprecated[obj.Pos()]
+}
diff --git a/src/cmd/asm/internal/arch/arch.go b/src/cmd/asm/internal/arch/arch.go
index 740711c..11bb7af 100644
--- a/src/cmd/asm/internal/arch/arch.go
+++ b/src/cmd/asm/internal/arch/arch.go
@@ -536,7 +536,6 @@
 	// Avoid unintentionally clobbering g using R22.
 	delete(register, "R22")
 	register["g"] = loong64.REG_R22
-	register["RSB"] = loong64.REG_R31
 	registerPrefix := map[string]bool{
 		"F":    true,
 		"FCSR": true,
diff --git a/src/cmd/asm/internal/arch/loong64.go b/src/cmd/asm/internal/arch/loong64.go
index ebf842c..2958ee1 100644
--- a/src/cmd/asm/internal/arch/loong64.go
+++ b/src/cmd/asm/internal/arch/loong64.go
@@ -44,6 +44,17 @@
 	return false
 }
 
+// IsLoong64RDTIME reports whether the op (as defined by an loong64.A*
+// constant) is one of the RDTIMELW/RDTIMEHW/RDTIMED instructions that
+// require special handling.
+func IsLoong64RDTIME(op obj.As) bool {
+	switch op {
+	case loong64.ARDTIMELW, loong64.ARDTIMEHW, loong64.ARDTIMED:
+		return true
+	}
+	return false
+}
+
 func loong64RegisterNumber(name string, n int16) (int16, bool) {
 	switch name {
 	case "F":
diff --git a/src/cmd/asm/internal/asm/asm.go b/src/cmd/asm/internal/asm/asm.go
index 00fb7f4..563e794 100644
--- a/src/cmd/asm/internal/asm/asm.go
+++ b/src/cmd/asm/internal/asm/asm.go
@@ -6,6 +6,7 @@
 
 import (
 	"fmt"
+	"internal/abi"
 	"strconv"
 	"strings"
 	"text/scanner"
@@ -16,7 +17,6 @@
 	"cmd/internal/obj"
 	"cmd/internal/obj/ppc64"
 	"cmd/internal/obj/x86"
-	"cmd/internal/objabi"
 	"cmd/internal/sys"
 )
 
@@ -169,7 +169,7 @@
 		frameSize = -frameSize
 	}
 	op = op[1:]
-	argSize := int64(objabi.ArgsSizeUnknown)
+	argSize := int64(abi.ArgsSizeUnknown)
 	if len(op) > 0 {
 		// There is an argument size. It must be a minus sign followed by a non-negative integer literal.
 		if len(op) != 2 || op[0].ScanToken != '-' || op[1].ScanToken != scanner.Int {
@@ -485,7 +485,7 @@
 				prog.Reg = p.getRegister(prog, op, &a[1])
 			} else {
 				// Compare register with immediate and jump.
-				prog.SetFrom3(a[1])
+				prog.AddRestSource(a[1])
 			}
 			break
 		}
@@ -508,7 +508,7 @@
 			// 4-operand compare-and-branch.
 			prog.From = a[0]
 			prog.Reg = p.getRegister(prog, op, &a[1])
-			prog.SetFrom3(a[2])
+			prog.AddRestSource(a[2])
 			target = &a[3]
 			break
 		}
@@ -642,6 +642,18 @@
 				prog.Reg = p.getRegister(prog, op, &a[1])
 				break
 			}
+
+			if arch.IsLoong64RDTIME(op) {
+				// The Loong64 RDTIME family of instructions is a bit special,
+				// in that both its register operands are outputs
+				prog.To = a[0]
+				if a[1].Type != obj.TYPE_REG {
+					p.errorf("invalid addressing modes for 2nd operand to %s instruction, must be register", op)
+					return
+				}
+				prog.RegTo2 = a[1].Reg
+				break
+			}
 		}
 		prog.From = a[0]
 		prog.To = a[1]
@@ -670,7 +682,7 @@
 			if arch.IsARMBFX(op) {
 				// a[0] and a[1] must be constants, a[2] must be a register
 				prog.From = a[0]
-				prog.SetFrom3(a[1])
+				prog.AddRestSource(a[1])
 				prog.To = a[2]
 				break
 			}
@@ -680,7 +692,7 @@
 			prog.To = a[2]
 		case sys.AMD64:
 			prog.From = a[0]
-			prog.SetFrom3(a[1])
+			prog.AddRestSource(a[1])
 			prog.To = a[2]
 		case sys.ARM64:
 			switch {
@@ -696,7 +708,7 @@
 			case arch.IsARM64TBL(op):
 				// one of its inputs does not fit into prog.Reg.
 				prog.From = a[0]
-				prog.SetFrom3(a[1])
+				prog.AddRestSource(a[1])
 				prog.To = a[2]
 			case arch.IsARM64CASP(op):
 				prog.From = a[0]
@@ -709,7 +721,7 @@
 				}
 				// For ARM64 CASP-like instructions, its 2nd destination operand is register pair(Rt, Rt+1) that can
 				// not fit into prog.RegTo2, so save it to the prog.RestArgs.
-				prog.SetTo2(a[2])
+				prog.AddRestDest(a[2])
 			default:
 				prog.From = a[0]
 				prog.Reg = p.getRegister(prog, op, &a[1])
@@ -717,7 +729,7 @@
 			}
 		case sys.I386:
 			prog.From = a[0]
-			prog.SetFrom3(a[1])
+			prog.AddRestSource(a[1])
 			prog.To = a[2]
 		case sys.PPC64:
 			if arch.IsPPC64CMP(op) {
@@ -732,12 +744,12 @@
 			prog.To = a[2]
 
 			// If the second argument is not a register argument, it must be
-			// passed RestArgs/SetFrom3
+			// passed RestArgs/AddRestSource
 			switch a[1].Type {
 			case obj.TYPE_REG:
 				prog.Reg = p.getRegister(prog, op, &a[1])
 			default:
-				prog.SetFrom3(a[1])
+				prog.AddRestSource(a[1])
 			}
 		case sys.RISCV64:
 			// RISCV64 instructions with one input and two outputs.
@@ -759,7 +771,7 @@
 			if a[1].Type == obj.TYPE_REG {
 				prog.Reg = p.getRegister(prog, op, &a[1])
 			} else {
-				prog.SetFrom3(a[1])
+				prog.AddRestSource(a[1])
 			}
 			prog.To = a[2]
 		default:
@@ -771,7 +783,7 @@
 			if arch.IsARMBFX(op) {
 				// a[0] and a[1] must be constants, a[2] and a[3] must be registers
 				prog.From = a[0]
-				prog.SetFrom3(a[1])
+				prog.AddRestSource(a[1])
 				prog.Reg = p.getRegister(prog, op, &a[2])
 				prog.To = a[3]
 				break
@@ -792,14 +804,14 @@
 		}
 		if p.arch.Family == sys.AMD64 {
 			prog.From = a[0]
-			prog.SetRestArgs([]obj.Addr{a[1], a[2]})
+			prog.AddRestSourceArgs([]obj.Addr{a[1], a[2]})
 			prog.To = a[3]
 			break
 		}
 		if p.arch.Family == sys.ARM64 {
 			prog.From = a[0]
 			prog.Reg = p.getRegister(prog, op, &a[1])
-			prog.SetFrom3(a[2])
+			prog.AddRestSource(a[2])
 			prog.To = a[3]
 			break
 		}
@@ -807,20 +819,20 @@
 			prog.From = a[0]
 			prog.To = a[3]
 			// If the second argument is not a register argument, it must be
-			// passed RestArgs/SetFrom3
+			// passed RestArgs/AddRestSource
 			if a[1].Type == obj.TYPE_REG {
 				prog.Reg = p.getRegister(prog, op, &a[1])
-				prog.SetRestArgs([]obj.Addr{a[2]})
+				prog.AddRestSource(a[2])
 			} else {
 				// Don't set prog.Reg if a1 isn't a reg arg.
-				prog.SetRestArgs([]obj.Addr{a[1], a[2]})
+				prog.AddRestSourceArgs([]obj.Addr{a[1], a[2]})
 			}
 			break
 		}
 		if p.arch.Family == sys.RISCV64 {
 			prog.From = a[0]
 			prog.Reg = p.getRegister(prog, op, &a[1])
-			prog.SetRestArgs([]obj.Addr{a[2]})
+			prog.AddRestSource(a[2])
 			prog.To = a[3]
 			break
 		}
@@ -831,7 +843,7 @@
 			}
 			prog.From = a[0]
 			prog.Reg = p.getRegister(prog, op, &a[1])
-			prog.SetFrom3(a[2])
+			prog.AddRestSource(a[2])
 			prog.To = a[3]
 			break
 		}
@@ -842,19 +854,19 @@
 			prog.From = a[0]
 			// Second arg is always a register type on ppc64.
 			prog.Reg = p.getRegister(prog, op, &a[1])
-			prog.SetRestArgs([]obj.Addr{a[2], a[3]})
+			prog.AddRestSourceArgs([]obj.Addr{a[2], a[3]})
 			prog.To = a[4]
 			break
 		}
 		if p.arch.Family == sys.AMD64 {
 			prog.From = a[0]
-			prog.SetRestArgs([]obj.Addr{a[1], a[2], a[3]})
+			prog.AddRestSourceArgs([]obj.Addr{a[1], a[2], a[3]})
 			prog.To = a[4]
 			break
 		}
 		if p.arch.Family == sys.S390X {
 			prog.From = a[0]
-			prog.SetRestArgs([]obj.Addr{a[1], a[2], a[3]})
+			prog.AddRestSourceArgs([]obj.Addr{a[1], a[2], a[3]})
 			prog.To = a[4]
 			break
 		}
@@ -884,7 +896,7 @@
 			prog.From = a[0]
 			// Second arg is always a register type on ppc64.
 			prog.Reg = p.getRegister(prog, op, &a[1])
-			prog.SetRestArgs([]obj.Addr{a[2], a[3], a[4]})
+			prog.AddRestSourceArgs([]obj.Addr{a[2], a[3], a[4]})
 			prog.To = a[5]
 			break
 		}
diff --git a/src/cmd/asm/internal/asm/endtoend_test.go b/src/cmd/asm/internal/asm/endtoend_test.go
index 3928e36..ef41667 100644
--- a/src/cmd/asm/internal/asm/endtoend_test.go
+++ b/src/cmd/asm/internal/asm/endtoend_test.go
@@ -457,10 +457,14 @@
 }
 
 func TestPPC64EndToEnd(t *testing.T) {
-	testEndToEnd(t, "ppc64", "ppc64")
-
-	// The assembler accepts all instructions irrespective of the GOPPC64 value.
-	testEndToEnd(t, "ppc64", "ppc64_p10")
+	defer func(old int) { buildcfg.GOPPC64 = old }(buildcfg.GOPPC64)
+	for _, goppc64 := range []int{8, 9, 10} {
+		t.Logf("GOPPC64=power%d", goppc64)
+		buildcfg.GOPPC64 = goppc64
+		// Some pseudo-ops may assemble differently depending on GOPPC64
+		testEndToEnd(t, "ppc64", "ppc64")
+		testEndToEnd(t, "ppc64", "ppc64_p10")
+	}
 }
 
 func TestRISCVEndToEnd(t *testing.T) {
diff --git a/src/cmd/asm/internal/asm/operand_test.go b/src/cmd/asm/internal/asm/operand_test.go
index 29371d6..c7e251f 100644
--- a/src/cmd/asm/internal/asm/operand_test.go
+++ b/src/cmd/asm/internal/asm/operand_test.go
@@ -915,8 +915,9 @@
 	{"R27", "R27"},
 	{"R28", "R28"},
 	{"R29", "R29"},
-	{"R30", "R30"},
 	{"R3", "R3"},
+	{"R30", "R30"},
+	{"R31", "R31"},
 	{"R4", "R4"},
 	{"R5", "R5"},
 	{"R6", "R6"},
@@ -925,7 +926,6 @@
 	{"R9", "R9"},
 	{"a(FP)", "a(FP)"},
 	{"g", "g"},
-	{"RSB", "R31"},
 	{"ret+8(FP)", "ret+8(FP)"},
 	{"runtime·abort(SB)", "runtime.abort(SB)"},
 	{"·AddUint32(SB)", "\"\".AddUint32(SB)"},
diff --git a/src/cmd/asm/internal/asm/parse.go b/src/cmd/asm/internal/asm/parse.go
index e26c945..37f8e6c 100644
--- a/src/cmd/asm/internal/asm/parse.go
+++ b/src/cmd/asm/internal/asm/parse.go
@@ -1149,7 +1149,7 @@
 		}
 		a.Offset = offset
 	default:
-		p.errorf("register list not supported on this architecuture")
+		p.errorf("register list not supported on this architecture")
 	}
 }
 
diff --git a/src/cmd/asm/internal/asm/testdata/386enc.s b/src/cmd/asm/internal/asm/testdata/386enc.s
index 4af6de3..aacb407 100644
--- a/src/cmd/asm/internal/asm/testdata/386enc.s
+++ b/src/cmd/asm/internal/asm/testdata/386enc.s
@@ -33,5 +33,8 @@
 	PUSHL FS // 0fa0
 	POPL FS  // 0fa1
 	POPL SS  // 17
+
+	RDPID AX                                // f30fc7f8
+
 	// End of tests.
 	RET
diff --git a/src/cmd/asm/internal/asm/testdata/amd64dynlinkerror.s b/src/cmd/asm/internal/asm/testdata/amd64dynlinkerror.s
index 1eee1a1..4bf58a3 100644
--- a/src/cmd/asm/internal/asm/testdata/amd64dynlinkerror.s
+++ b/src/cmd/asm/internal/asm/testdata/amd64dynlinkerror.s
@@ -66,3 +66,106 @@
 one:
 	MOVL $0, R15
 	JMP two
+
+// Ensure 3-arg instructions get GOT-rewritten without errors.
+// See issue 58735.
+TEXT ·a13(SB), 0, $0-0
+	MULXQ runtime·writeBarrier(SB), AX, CX
+	RET
+
+// Various special cases in the use-R15-after-global-access-when-dynlinking check.
+// See issue 58632.
+TEXT ·a14(SB), 0, $0-0
+	CMPL runtime·writeBarrier(SB), $0
+	MULXQ R15, AX, BX // ERROR "when dynamic linking, R15 is clobbered by a global variable access and is used here"
+	RET
+TEXT ·a15(SB), 0, $0-0
+	CMPL runtime·writeBarrier(SB), $0
+	MULXQ AX, R15, BX
+	ADDQ $1, R15
+	RET
+TEXT ·a16(SB), 0, $0-0
+	CMPL runtime·writeBarrier(SB), $0
+	MULXQ AX, BX, R15
+	ADDQ $1, R15
+	RET
+TEXT ·a17(SB), 0, $0-0
+	CMPL runtime·writeBarrier(SB), $0
+	MOVQ (R15), AX // ERROR "when dynamic linking, R15 is clobbered by a global variable access and is used here"
+	RET
+TEXT ·a18(SB), 0, $0-0
+	CMPL runtime·writeBarrier(SB), $0
+	MOVQ (CX)(R15*1), AX // ERROR "when dynamic linking, R15 is clobbered by a global variable access and is used here"
+	RET
+TEXT ·a19(SB), 0, $0-0
+	CMPL runtime·writeBarrier(SB), $0
+	MOVQ AX, (R15) // ERROR "when dynamic linking, R15 is clobbered by a global variable access and is used here"
+	RET
+TEXT ·a20(SB), 0, $0-0
+	CMPL runtime·writeBarrier(SB), $0
+	MOVQ AX, (CX)(R15*1) // ERROR "when dynamic linking, R15 is clobbered by a global variable access and is used here"
+	RET
+TEXT ·a21(SB), 0, $0-0
+	CMPL runtime·writeBarrier(SB), $0
+	MOVBLSX AX, R15
+	ADDQ $1, R15
+	RET
+TEXT ·a22(SB), 0, $0-0
+	CMPL runtime·writeBarrier(SB), $0
+	PMOVMSKB X0, R15
+	ADDQ $1, R15
+	RET
+TEXT ·a23(SB), 0, $0-0
+	CMPL runtime·writeBarrier(SB), $0
+	LEAQ (AX)(CX*1), R15
+	RET
+TEXT ·a24(SB), 0, $0-0
+	CMPL runtime·writeBarrier(SB), $0
+	LEAQ (R15)(AX*1), AX // ERROR "when dynamic linking, R15 is clobbered by a global variable access and is used here"
+	RET
+TEXT ·a25(SB), 0, $0-0
+	CMPL runtime·writeBarrier(SB), $0
+	LEAQ (AX)(R15*1), AX // ERROR "when dynamic linking, R15 is clobbered by a global variable access and is used here"
+	RET
+TEXT ·a26(SB), 0, $0-0
+	CMPL runtime·writeBarrier(SB), $0
+	IMUL3Q $33, AX, R15
+	ADDQ $1, R15
+	RET
+TEXT ·a27(SB), 0, $0-0
+	CMPL runtime·writeBarrier(SB), $0
+	IMUL3Q $33, R15, AX // ERROR "when dynamic linking, R15 is clobbered by a global variable access and is used here"
+	RET
+TEXT ·a28(SB), 0, $0-0
+	CMPL runtime·writeBarrier(SB), $0
+	PEXTRD $0, X0, R15
+	ADDQ $1, R15
+	RET
+TEXT ·a29(SB), 0, $0-0
+	CMPL runtime·writeBarrier(SB), $0
+	VPEXTRD $0, X0, R15
+	ADDQ $1, R15
+	RET
+TEXT ·a30(SB), 0, $0-0
+	CMPL runtime·writeBarrier(SB), $0
+	BSFQ R15, AX // ERROR "when dynamic linking, R15 is clobbered by a global variable access and is used here"
+	RET
+TEXT ·a31(SB), 0, $0-0
+	CMPL runtime·writeBarrier(SB), $0
+	BSFQ AX, R15
+	ADDQ $1, R15
+	RET
+TEXT ·a32(SB), 0, $0-0
+	CMPL runtime·writeBarrier(SB), $0
+	POPCNTL R15, AX // ERROR "when dynamic linking, R15 is clobbered by a global variable access and is used here"
+	RET
+TEXT ·a33(SB), 0, $0-0
+	CMPL runtime·writeBarrier(SB), $0
+	POPCNTL AX, R15
+	ADDQ $1, R15
+	RET
+TEXT ·a34(SB), 0, $0-0
+	CMPL runtime·writeBarrier(SB), $0
+	SHLXQ AX, CX, R15
+	ADDQ $1, R15
+	RET
diff --git a/src/cmd/asm/internal/asm/testdata/amd64enc_extra.s b/src/cmd/asm/internal/asm/testdata/amd64enc_extra.s
index a7d9bda..08cb20c 100644
--- a/src/cmd/asm/internal/asm/testdata/amd64enc_extra.s
+++ b/src/cmd/asm/internal/asm/testdata/amd64enc_extra.s
@@ -891,7 +891,7 @@
 	VPEXTRW $17, X20, (SP)(AX*2)      // 62e37d0815244411 or 62e3fd0815244411
 	VPEXTRW $127, X20, (SP)(AX*2)     // 62e37d081524447f or 62e3fd081524447f
 	// EVEX: embedded zeroing.
-	VADDPD.Z X30, X1, X0      // 6291f58858c6
+	VADDPD.Z X30, X1, K7, X0  // 6291f58f58c6
 	VMAXPD.Z (AX), Z2, K1, Z1 // 62f1edc95f08
 	// EVEX: embedded rounding.
 	VADDPD.RU_SAE Z3, Z2, K1, Z1   // 62f1ed5958cb
@@ -1055,5 +1055,9 @@
 	TPAUSE BX // 660faef3
 	UMONITOR BX // f30faef3
 	UMWAIT BX // f20faef3
+
+	RDPID DX                                // f30fc7fa
+	RDPID R11                               // f3410fc7fb
+
 	// End of tests.
 	RET
diff --git a/src/cmd/asm/internal/asm/testdata/amd64error.s b/src/cmd/asm/internal/asm/testdata/amd64error.s
index 7e91fb4..e9a1d0a 100644
--- a/src/cmd/asm/internal/asm/testdata/amd64error.s
+++ b/src/cmd/asm/internal/asm/testdata/amd64error.s
@@ -74,7 +74,7 @@
 	MOVQ (AX), DR3                  // ERROR "invalid instruction"
 	MOVQ (AX), DR6                  // ERROR "invalid instruction"
 	MOVQ (AX), DR7                  // ERROR "invalid instruction"
-        // AVX512GATHER index/index #UD cases.
+	// AVX512GATHER index/index #UD cases.
 	VPGATHERQQ (BP)(X2*2), K1, X2   // ERROR "index and destination registers should be distinct"
 	VPGATHERQQ (BP)(Y15*2), K1, Y15 // ERROR "index and destination registers should be distinct"
 	VPGATHERQQ (BP)(Z20*2), K1, Z20 // ERROR "index and destination registers should be distinct"
@@ -132,7 +132,7 @@
 	VADDPD.BCST X3, X2, K1, X1       // ERROR "illegal broadcast without memory argument"
 	VADDPD.BCST X3, X2, K1, X1       // ERROR "illegal broadcast without memory argument"
 	VADDPD.BCST X3, X2, K1, X1       // ERROR "illegal broadcast without memory argument"
-	// CLWB instuctions:
+	// CLWB instructions:
 	CLWB BX                          // ERROR "invalid instruction"
 	// CLDEMOTE instructions:
 	CLDEMOTE BX                      // ERROR "invalid instruction"
@@ -140,4 +140,11 @@
 	TPAUSE (BX)                      // ERROR "invalid instruction"
 	UMONITOR (BX)                    // ERROR "invalid instruction"
 	UMWAIT (BX)                      // ERROR "invalid instruction"
+	// .Z instructions
+	VMOVDQA32.Z Z0, Z1               // ERROR "mask register must be specified for .Z instructions"
+	VMOVDQA32.Z Z0, K0, Z1           // ERROR "invalid instruction"
+	VMOVDQA32.Z Z0, K1, Z1           // ok
+
+	RDPID (BX)			 // ERROR "invalid instruction"
+
 	RET
diff --git a/src/cmd/asm/internal/asm/testdata/arm64.s b/src/cmd/asm/internal/asm/testdata/arm64.s
index a1493a7..11bd678 100644
--- a/src/cmd/asm/internal/asm/testdata/arm64.s
+++ b/src/cmd/asm/internal/asm/testdata/arm64.s
@@ -238,6 +238,8 @@
 	FMOVS	$0, F0                          // e003271e
 	FMOVD	ZR, F0                          // e003679e
 	FMOVS	ZR, F0                          // e003271e
+	FMOVD	F1, ZR                          // 3f00669e
+	FMOVS	F1, ZR                          // 3f00261e
 	VUADDW	V9.B8, V12.H8, V14.H8           // 8e11292e
 	VUADDW	V13.H4, V10.S4, V11.S4          // 4b116d2e
 	VUADDW	V21.S2, V24.D2, V29.D2          // 1d13b52e
@@ -819,6 +821,38 @@
 	LDEORLH	R5, (RSP), R7                        // e7236578
 	LDEORLB	R5, (R6), R7                         // c7206538
 	LDEORLB	R5, (RSP), R7                        // e7236538
+	LDADDD	R5, (R6), ZR                         // df0025f8
+	LDADDW	R5, (R6), ZR                         // df0025b8
+	LDADDH	R5, (R6), ZR                         // df002578
+	LDADDB	R5, (R6), ZR                         // df002538
+	LDADDLD	R5, (R6), ZR                         // df0065f8
+	LDADDLW	R5, (R6), ZR                         // df0065b8
+	LDADDLH	R5, (R6), ZR                         // df006578
+	LDADDLB	R5, (R6), ZR                         // df006538
+	LDCLRD	R5, (R6), ZR                         // df1025f8
+	LDCLRW	R5, (R6), ZR                         // df1025b8
+	LDCLRH	R5, (R6), ZR                         // df102578
+	LDCLRB	R5, (R6), ZR                         // df102538
+	LDCLRLD	R5, (R6), ZR                         // df1065f8
+	LDCLRLW	R5, (R6), ZR                         // df1065b8
+	LDCLRLH	R5, (R6), ZR                         // df106578
+	LDCLRLB	R5, (R6), ZR                         // df106538
+	LDEORD	R5, (R6), ZR                         // df2025f8
+	LDEORW	R5, (R6), ZR                         // df2025b8
+	LDEORH	R5, (R6), ZR                         // df202578
+	LDEORB	R5, (R6), ZR                         // df202538
+	LDEORLD	R5, (R6), ZR                         // df2065f8
+	LDEORLW	R5, (R6), ZR                         // df2065b8
+	LDEORLH	R5, (R6), ZR                         // df206578
+	LDEORLB	R5, (R6), ZR                         // df206538
+	LDORD	R5, (R6), ZR                         // df3025f8
+	LDORW	R5, (R6), ZR                         // df3025b8
+	LDORH	R5, (R6), ZR                         // df302578
+	LDORB	R5, (R6), ZR                         // df302538
+	LDORLD	R5, (R6), ZR                         // df3065f8
+	LDORLW	R5, (R6), ZR                         // df3065b8
+	LDORLH	R5, (R6), ZR                         // df306578
+	LDORLB	R5, (R6), ZR                         // df306538
 	LDORAD	R5, (R6), R7                         // c730a5f8
 	LDORAD	R5, (RSP), R7                        // e733a5f8
 	LDORAW	R5, (R6), R7                         // c730a5b8
diff --git a/src/cmd/asm/internal/asm/testdata/arm64enc.s b/src/cmd/asm/internal/asm/testdata/arm64enc.s
index 0ae00d2..7ef3a7f 100644
--- a/src/cmd/asm/internal/asm/testdata/arm64enc.s
+++ b/src/cmd/asm/internal/asm/testdata/arm64enc.s
@@ -11,756 +11,756 @@
 
 TEXT asmtest(SB),DUPOK|NOSPLIT,$-8
 
-   AND $(1<<63), R1                           // AND $-9223372036854775808, R1     // 21004192
-   ADCW ZR, R8, R10                           // 0a011f1a
-   ADC R0, R2, R12                            // 4c00009a
-   ADCSW R9, R21, R6                          // a602093a
-   ADCS R23, R22, R22                         // d60217ba
-   ADDW R5.UXTH, R8, R9                       // 0921250b
-   ADD R8.SXTB<<3, R23, R14                   // ee8e288b
-   ADDW $3076, R17, R3                        // 23123011
-   ADDW $(3076<<12), R17, R3                  // ADDW $12599296, R17, R3           // 23127011
-   ADD $2280, R25, R11                        // 2ba32391
-   ADD $(2280<<12), R25, R11                  // ADD $9338880, R25, R11            // 2ba36391
-   ADDW R13->5, R11, R7                       // 67158d0b
-   ADD R25<<54, R17, R16                      // 30da198b
-   ADDSW R12.SXTX<<1, R29, R7                 // a7e72c2b
-   ADDS R24.UXTX<<4, R25, R21                 // 357338ab
-   ADDSW $(3525<<12), R3, R11                 // ADDSW $14438400, R3, R11          // 6b147731
-   ADDS $(3525<<12), R3, R11                  // ADDS $14438400, R3, R11           // 6b1477b1
-   ADDSW R7->22, R14, R13                     // cd59872b
-   ADDS R14>>7, ZR, R4                        // e41f4eab
-   AND $-9223372036854775808, R1, R1          // 21004192
-   ANDW $4026540031, R29, R2                  // a2430412
-   AND $34903429696192636, R12, R19           // 93910e92
-   ANDW R9@>7, R19, R26                       // 7a1ec90a
-   AND R9@>7, R19, R26                        // 7a1ec98a
-   TSTW $2863311530, R24                      // 1ff30172
-   TST R2, R0                                 // 1f0002ea
-   TST $7, R2                                 // 5f0840f2
-   ANDS R2, R0, ZR                            // 1f0002ea
-   ANDS $7, R2, ZR                            // 5f0840f2
-   ANDSW $2863311530, R24, ZR                 // 1ff30172
-   ANDSW $2863311530, R24, R23                // 17f30172
-   ANDS $-140737488289793, R2, R5             // 458051f2
-   ANDSW R26->24, R21, R15                    // af629a6a
-   ANDS R30@>44, R3, R26                      // 7ab0deea
-   ASRW R12, R27, R25                         // 792bcc1a
-   ASR R14, R27, R7                           // 672bce9a
-   ASR $11, R27, R25                          // 79ff4b93
-   ASRW $11, R27, R25                         // 797f0b13
-   BLT -1(PC)                                 // ebffff54
-   JMP -1(PC)                                 // ffffff17
-   BFIW $16, R20, $6, R0                      // 80161033
-   BFI $27, R21, $21, R25                     // b95265b3
-   BFXILW $3, R27, $23, R14                   // 6e670333
-   BFXIL $26, R8, $16, R20                    // 14a55ab3
-   BICW R7@>15, R5, R16                       // b03ce70a
-   BIC R12@>13, R12, R19                      // 9335ec8a
-   BICSW R25->20, R3, R20                     // 7450b96a
-   BICS R19->12, R1, R23                      // 3730b3ea
-   BICS R19, R1, R23                          // 370033ea
-   BICS R19>>0, R1, R23                       // 370073ea
-   CALL -1(PC)                                // ffffff97
-   CALL (R15)                                 // e0013fd6
-   JMP  (R29)                                 // a0031fd6
-   BRK $35943                                 // e08c31d4
-   CBNZW R2, -1(PC)                           // e2ffff35
-   CBNZ R7, -1(PC)                            // e7ffffb5
-   CBZW R15, -1(PC)                           // efffff34
-   CBZ R1, -1(PC)                             // e1ffffb4
-   CCMN MI, ZR, R1, $4                        // e44341ba
-   CCMNW AL, R26, $20, $11                    // 4beb543a
-   CCMN PL, R24, $6, $1                       // 015b46ba
-   CCMNW EQ, R20, R6, $6                      // 8602463a
-   CCMN LE, R30, R12, $6                      // c6d34cba
-   CCMPW VS, R29, $15, $7                     // a76b4f7a
-   CCMP LE, R7, $19, $3                       // e3d853fa
-   CCMPW HS, R19, R6, $0                      // 6022467a
-   CCMP LT, R30, R6, $7                       // c7b346fa
-   CCMN  MI, ZR, R1, $4                       // e44341ba
-   CSINCW HS, ZR, R27, R14                    // ee279b1a
-   CSINC VC, R2, R1, R1                       // 4174819a
-   CSINVW EQ, R2, R21, R17                    // 5100955a
-   CSINV LO, R2, R19, R23                     // 573093da
-   CINCW LO, R27, R14                         // 6e279b1a
-   CINCW HS, R27, ZR                          // 7f379b1a
-   CINVW EQ, R2, R17                          // 5110825a
-   CINV VS, R12, R7                           // 87718cda
-   CINV VS, R30, R30                          // de739eda
-   CLREX $4                                   // 5f3403d5
-   CLREX $0                                   // 5f3003d5
-   CLSW R15, R6                               // e615c05a
-   CLS R15, ZR                                // ff15c0da
-   CLZW R1, R14                               // 2e10c05a
-   CLZ R21, R9                                // a912c0da
-   CMNW R21.UXTB<<4, R15                      // ff11352b
-   CMN R0.UXTW<<4, R16                        // 1f5220ab
-   CMNW R13>>8, R9                            // 3f214d2b
-   CMN R6->17, R3                             // 7f4486ab
-   CMNW $(2<<12), R5                          // CMNW $8192, R5                // bf084031
-   CMN $(8<<12), R12                          // CMN $32768, R12               // 9f2140b1
-   CMN R6->0, R3                              // 7f0086ab
-   CMN R6, R3                                 // 7f0006ab
-   CMNW R30, R5                               // bf001e2b
-   CMNW $2, R5                                // bf080031
-   CMN ZR, R3                                 // 7f001fab
-   CMN R0, R3                                 // 7f0000ab
-   CMPW R6.UXTB, R23                          // ff02266b
-   CMP R25.SXTH<<2, R26                       // 5fab39eb
-   CMP $3817, R29                             // bfa73bf1
-   CMP R7>>23, R3                             // 7f5c47eb
-   CNEGW PL, R9, R14                          // 2e45895a
-   CSNEGW HS, R5, R9, R14                     // ae24895a
-   CSNEG PL, R14, R21, R3                     // c35595da
-   CNEG  LO, R7, R15                          // ef2487da
-   CRC32B R17, R8, R16                        // 1041d11a
-   CRC32H R3, R21, R27                        // bb46c31a
-   CRC32W R22, R30, R9                        // c94bd61a
-   CRC32X R20, R4, R15                        // 8f4cd49a
-   CRC32CB R19, R27, R22                      // 7653d31a
-   CRC32CH R21, R0, R20                       // 1454d51a
-   CRC32CW R9, R3, R21                        // 7558c91a
-   CRC32CX R11, R0, R24                       // 185ccb9a
-   CSELW LO, R4, R20, R12                     // 8c30941a
-   CSEL GE, R0, R12, R14                      // 0ea08c9a
-   CSETW GE, R3                               // e3b79f1a
-   CSET LT, R30                               // fea79f9a
-   CSETMW VC, R5                              // e5639f5a
-   CSETM VS, R4                               // e4739fda
-   CSINCW LE, R5, R24, R26                    // bad4981a
-   CSINC VS, R26, R16, R17                    // 5167909a
-   CSINVW AL, R23, R21, R5                    // e5e2955a
-   CSINV LO, R2, R11, R14                     // 4e308bda
-   CSNEGW HS, R16, R29, R10                   // 0a269d5a
-   CSNEG NE, R21, R19, R11                    // ab1693da
-   DC IVAC, R1                                // 217608d5
-   DCPS1 $11378                               // 418ea5d4
-   DCPS2 $10699                               // 6239a5d4
-   DCPS3 $24415                               // e3ebabd4
-   DMB $1                                     // bf3103d5
-   DMB $0                                     // bf3003d5
-   DRPS                                       // e003bfd6
-   DSB  $1                                    // 9f3103d5
-   EONW R21<<29, R6, R9                       // c974354a
-   EON R14>>46, R4, R9                        // 89b86eca
-   EOR $-2287828610704211969, R27, R22        // 76e343d2
-   EORW R12->27, R10, R19                     // 536d8c4a
-   EOR R2<<59, R30, R17                       // d1ef02ca
-   ERET                                       // e0039fd6
-   EXTRW $7, R8, R10, R25                     // 591d8813
-   EXTR $35, R22, R12, R8                     // 888dd693
-   SEVL                                       // bf2003d5
-   HINT $6                                    // df2003d5
-   HINT $0                                    // 1f2003d5
-   HLT $65509                                 // a0fc5fd4
-   HVC $61428                                 // 82fe1dd4
-   ISB $1                                     // df3103d5
-   ISB $15                                    // df3f03d5
-   LDARW (R12), R29                           // 9dfddf88
-   LDARW (R30), R22                           // d6ffdf88
-   LDARW (RSP), R22                           // f6ffdf88
-   LDAR (R27), R22                            // 76ffdfc8
-   LDARB (R25), R2                            // 22ffdf08
-   LDARH (R5), R7                             // a7fcdf48
-   LDAXPW (R10), (R20, R16)                   // 54c17f88
-   LDAXP (R25), (R30, R11)                    // 3eaf7fc8
-   LDAXRW (R15), R2                           // e2fd5f88
-   LDAXR (R15), R21                           // f5fd5fc8
-   LDAXRB (R19), R16                          // 70fe5f08
-   LDAXRH (R5), R8                            // a8fc5f48
-   //TODO LDNP 0xcc(RSP), ZR, R12             // ecff5928
-   //TODO LDNP 0x40(R28), R9, R5              // 852744a8
-   //TODO LDPSW -0xd0(R2), R0, R12            // 4c00e668
-   //TODO LDPSW 0x5c(R4), R8, R5              // 85a0cb69
-   //TODO LDPSW 0x6c(R12), R2, R27            // 9b894d69
-   MOVWU.P -84(R15), R9                       // e9c55ab8
-   MOVD.P -46(R10), R8                        // 48255df8
-   MOVD.P (R10), R8                           // 480540f8
-   MOVWU.W -141(R3), R16                      // 703c57b8
-   MOVD.W -134(R0), R29                       // 1dac57f8
-   MOVWU 4156(R1), R25                        // 393c50b9
-   MOVD 14616(R10), R9                        // 498d5cf9
-   MOVWU (R4)(R12.SXTW<<2), R7                // 87d86cb8
-   MOVD (R7)(R11.UXTW<<3), R25                // f9586bf8
-   MOVBU.P 42(R2), R12                        // 4ca44238
-   MOVBU.W -27(R2), R14                       // 4e5c5e38
-   MOVBU 2916(R24), R3                        // 03936d39
-   MOVBU (R19)(R14<<0), R23                   // 777a6e38
-   MOVBU (R2)(R8.SXTX), R19                   // 53e86838
-   MOVBU (R27)(R23), R14                      // 6e6b7738
-   MOVHU.P 107(R14), R13                      // cdb54678
-   MOVHU.W 192(R3), R2                        // 620c4c78
-   MOVHU 6844(R4), R19                        // 93787579
-   MOVHU (R5)(R25.SXTW), R15                  // afc87978
-   //TODO MOVBW.P 77(R19), R11                // 6bd6c438
-   MOVB.P 36(RSP), R27                        // fb478238
-   //TODO MOVBW.W -57(R19), R13               // 6d7edc38
-   MOVB.W -178(R16), R24                      // 18ee9438
-   //TODO MOVBW 430(R8), R22                  // 16b9c639
-   MOVB 997(R9), R23                          // 37958f39
-   //TODO MOVBW (R2<<1)(R21), R15             // af7ae238
-   //TODO MOVBW (R26)(R0), R21                // 1568fa38
-   MOVB (R5)(R15), R16                        // b068af38
-   MOVB (R19)(R26.SXTW), R19                  // 73caba38
-   MOVB (R29)(R30), R14                       // ae6bbe38
-   //TODO MOVHW.P 218(R22), R25               // d9a6cd78
-   MOVH.P 179(R23), R5                        // e5368b78
-   //TODO MOVHW.W 136(R2), R27                // 5b8cc878
-   MOVH.W -63(R25), R22                       // 361f9c78
-   //TODO MOVHW 5708(R25), R21                // 359bec79
-   MOVH 54(R2), R13                           // 4d6c8079
-   //TODO MOVHW (R22)(R24.SXTX), R4           // c4eaf878
-   MOVH (R26)(R30.UXTW<<1), ZR                // 5f5bbe78
-   MOVW.P -58(R16), R2                        // 02669cb8
-   MOVW.W -216(R19), R8                       // 688e92b8
-   MOVW 4764(R23), R10                        // ea9e92b9
-   MOVW (R8)(R3.UXTW), R17                    // 1149a3b8
-   //TODO LDTR -0x1e(R3), R4                  // 64285eb8
-   //TODO LDTR -0xe5(R3), R10                 // 6ab851f8
-   //TODO LDTRB 0xf0(R13), R10                // aa094f38
-   //TODO LDTRH 0xe8(R13), R23                // b7894e78
-   //TODO LDTRSB -0x24(R20), R5               // 85cadd38
-   //TODO LDTRSB -0x75(R9), R13               // 2db99838
-   //TODO LDTRSH 0xef(R3), LR                 // 7ef8ce78
-   //TODO LDTRSH 0x96(R19), R24               // 786a8978
-   //TODO LDTRSW 0x1e(LR), R5                 // c5eb81b8
-   //TODO LDUR 0xbf(R13), R1                  // a1f14bb8
-   //TODO LDUR -0x3c(R22), R3                 // c3425cf8
-   //TODO LDURB -0xff(R17), R14               // 2e125038
-   //TODO LDURH 0x80(R1), R6                  // 26004878
-   //TODO LDURSB 0xde(LR), R3                 // c3e3cd38
-   //TODO LDURSB 0x96(R9), R7                 // 27618938
-   //TODO LDURSH -0x49(R11), R28              // 7c71db78
-   //TODO LDURSH -0x1f(R0), R29               // 1d109e78
-   //TODO LDURSW 0x48(R6), R20                // d48084b8
-   LDXPW (R24), (R23, R11)                    // 172f7f88
-   LDXP (R0), (R16, R13)                      // 10347fc8
-   LDXRW (RSP), R30                           // fe7f5f88
-   LDXR (R27), R12                            // 6c7f5fc8
-   LDXRB (R0), R4                             // 047c5f08
-   LDXRH (R12), R26                           // 9a7d5f48
-   LSLW R11, R10, R15                         // 4f21cb1a
-   LSL R27, R24, R21                          // 1523db9a
-   LSLW $5, R7, R22                           // f6681b53
-   LSL $57, R17, R2                           // 221a47d3
-   LSRW R9, R3, R12                           // 6c24c91a
-   LSR R10, R5, R2                            // a224ca9a
-   LSRW $1, R3, R16                           // 707c0153
-   LSR $12, R1, R20                           // 34fc4cd3
-   MADDW R13, R23, R3, R10                    // 6a5c0d1b
-   MADD R5, R23, R10, R4                      // 445d059b
-   MNEGW R0, R9, R21                          // 35fd001b
-   MNEG R14, R27, R23                         // 77ff0e9b
-   MOVD  R2, R7                               // e70302aa
-   MOVW $-24, R20                             // f4028012
-   MOVD $-51096, ZR                           // fff29892
-   MOVW $2507014144, R20                      // d4adb252
-   MOVD $1313925191285342208, R7              // 8747e2d2
-   ORRW $16252928, ZR, R21                    // f5130d32
-   MOVD $-4260607558625, R11                  // eb6b16b2
-   MOVD R30, R7                               // e7031eaa
-   MOVKW $(3905<<0), R21                      // MOVKW $3905, R21              // 35e88172
-   MOVKW $(3905<<16), R21                     // MOVKW $255918080, R21         // 35e8a172
-   MOVK $(3905<<32), R21                      // MOVK $16771847290880, R21     // 35e8c1f2
-   MOVD $0, R5                                // e5031faa
-   MSR $1, SPSel                              // bf4100d5
-   MSR $9, DAIFSet                            // df4903d5
-   MSR $6, DAIFClr                            // ff4603d5
-   MRS ELR_EL1, R8                            // 284038d5
-   MSR R16, ELR_EL1                           // 304018d5
-   MRS DCZID_EL0, R3                          // e3003bd5
-   MSUBW R1, R1, R12, R5                      // 8585011b
-   MSUB R19, R16, R26, R2                     // 42c3139b
-   MULW R26, R5, R22                          // b67c1a1b
-   MUL R4, R3, R0                             // 607c049b
-   MVNW R3@>13, R8                            // e837e32a
-   MVN R13>>31, R9                            // e97f6daa
-   NEGSW R23<<1, R30                          // fe07176b
-   NEGS R20>>35, R22                          // f68f54eb
-   NGCW R13, R8                               // e8030d5a
-   NGC R2, R7                                 // e70302da
-   NGCSW R10, R5                              // e5030a7a
-   NGCS R24, R16                              // f00318fa
-   NOOP                                        // 1f2003d5
-   ORNW R4@>11, R16, R3                       // 032ee42a
-   ORN R22@>19, R3, R3                        // 634cf6aa
-   ORRW $4294443071, R15, R24                 // f8490d32
-   ORR $-3458764513820540929, R12, R22        // 96f542b2
-   ORRW R13<<4, R8, R26                       // 1a110d2a
-   ORR R3<<22, R5, R6                         // a65803aa
-   PRFM (R8), $25                             // 190180f9
-   PRFM (R2), PLDL1KEEP                       // 400080f9
-   //TODO PRFM (R27)(R30.SXTW<<3), PLDL2STRM  // 63dbbff8
-   //TODO PRFUM 22(R16), PSTL1KEEP            // 106281f8
-   RBITW R9, R22                              // 3601c05a
-   RBIT R11, R4                               // 6401c0da
-   RET                                        // c0035fd6
-   REVW R8, R10                               // 0a09c05a
-   REV R1, R2                                 // 220cc0da
-   REV16W R21, R19                            // b306c05a
-   REV16 R25, R4                              // 2407c0da
-   REV32 R27, R21                             // 750bc0da
-   EXTRW $27, R4, R25, R19                    // 336f8413
-   EXTR $17, R10, R29, R15                    // af47ca93
-   ROR $14, R14, R15                          // cf39ce93
-   RORW $28, R14, R15                         // cf718e13
-   RORW R3, R12, R3                           // 832dc31a
-   ROR R0, R23, R2                            // e22ec09a
-   SBCW R4, R8, R24                           // 1801045a
-   SBC R25, R10, R26                          // 5a0119da
-   SBCSW R27, R19, R19                        // 73021b7a
-   SBCS R5, R9, R5                            // 250105fa
-   SBFIZW $9, R10, $18, R22                   // 56451713
-   SBFIZ $6, R11, $15, R20                    // 74397a93
-   SBFXW $8, R15, $10, R20                    // f4450813
-   SBFX $2, R27, $54, R7                      // 67df4293
-   SDIVW R22, R14, R9                         // c90dd61a
-   SDIV R13, R21, R9                          // a90ecd9a
-   SEV                                        // 9f2003d5
-   SEVL                                       // bf2003d5
-   SMADDL R3, R7, R11, R9                     // 691d239b
-   SMSUBL R5, R19, R11, R29                   // 7dcd259b
-   SMNEGL R26, R3, R15                        // 6ffc3a9b
-   SMULH R17, R21, R21                        // b57e519b
-   SMULL R0, R5, R0                           // a07c209b
-   SMC $37977                                 // 238b12d4
-   STLRW R16, (R22)                           // d0fe9f88
-   STLR R3, (R24)                             // 03ff9fc8
-   STLRB R11, (R22)                           // cbfe9f08
-   STLRH R16, (R23)                           // f0fe9f48
-   STLXR R7, (R27), R8                        // 67ff08c8
-   STLXRW R13, (R15), R14                     // edfd0e88
-   STLXRB R24, (R23), R8                      // f8fe0808
-   STLXRH R19, (R27), R11                     // 73ff0b48
-   STLXP (R6, R3), (R10), R2                  // 468d22c8
-   STLXPW (R6, R11), (R22), R21               // c6ae3588
-   //TODO STNPW 44(R1), R3, R10               // 2a8c0528
-   //TODO STNP 0x108(R3), ZR, R7              // 67fc10a8
-   LDP.P -384(R3), (R22, R26)                 // 7668e8a8
-   LDP.W 280(R8), (R19, R11)                  // 13add1a9
-   STP.P (R22, R27), 352(R0)                  // 166c96a8
-   STP.W (R17, R11), 96(R8)                   // 112d86a9
-   MOVW.P R20, -28(R1)                        // 34441eb8
-   MOVD.P R17, 191(R16)                       // 11f60bf8
-   MOVW.W R1, -171(R14)                       // c15d15b8
-   MOVD.W R14, -220(R13)                      // ae4d12f8
-   MOVW R3, 14828(R24)                        // 03ef39b9
-   MOVD R0, 20736(R17)                        // 208228f9
-   MOVB.P ZR, -117(R7)                        // ffb41838
-   MOVB.W R27, -96(R13)                       // bb0d1a38
-   MOVB R17, 2200(R13)                        // b1612239
-   MOVH.P R7, -72(R4)                         // 87841b78
-   MOVH.W R12, -125(R14)                      // cc3d1878
-   MOVH R19, 3686(R26)                        // 53cf1c79
-   MOVW R21, 34(R0)                           // 152002b8
-   MOVD R25, -137(R17)                        // 397217f8
-   MOVW R4, (R12)(R22.UXTW<<2)                // 845936b8
-   MOVD R27, (R5)(R15.UXTW<<3)                // bb582ff8
-   MOVB R2, (R10)(R16)                        // 42693038
-   MOVB R2, (R29)(R26)                        // a26b3a38
-   MOVH R11, -80(R23)                         // eb021b78
-   MOVH R11, (R27)(R14.SXTW<<1)               // 6bdb2e78
-   MOVB R19, (R0)(R4)                         // 13682438
-   MOVB R1, (R6)(R4)                          // c1682438
-   MOVH R3, (R11)(R13<<1)                     // 63792d78
-   //TODO STTR 55(R4), R29                    // 9d7803b8
-   //TODO STTR 124(R5), R25                   // b9c807f8
-   //TODO STTRB -28(R23), R16                 // f04a1e38
-   //TODO STTRH 9(R10), R19                   // 53990078
-   STXP (R1, R2), (R3), R10                   // 61082ac8
-   STXP (R1, R2), (RSP), R10                  // e10b2ac8
-   STXPW (R1, R2), (R3), R10                  // 61082a88
-   STXPW (R1, R2), (RSP), R10                 // e10b2a88
-   STXRW R2, (R19), R20                       // 627e1488
-   STXR R15, (R21), R13                       // af7e0dc8
-   STXRB R7, (R9), R24                        // 277d1808
-   STXRH R12, (R3), R8                        // 6c7c0848
-   SUBW R20.UXTW<<2, R23, R19                 // f34a344b
-   SUB R5.SXTW<<2, R1, R26                    // 3ac825cb
-   SUB $(1923<<12), R4, R27                   // SUB $7876608, R4, R27         // 9b0c5ed1
-   SUBW $(1923<<12), R4, R27                  // SUBW $7876608, R4, R27        // 9b0c5e51
-   SUBW R12<<29, R7, R8                       // e8740c4b
-   SUB R12<<61, R7, R8                        // e8f40ccb
-   SUBSW R2.SXTH<<3, R13, R6                  // a6ad226b
-   SUBS R21.UXTX<<2, R27, R4                  // 646b35eb
-   SUBSW $(44<<12), R6, R9                    // SUBSW $180224, R6, R9         // c9b04071
-   SUBS $(1804<<12), R13, R9                  // SUBS $7389184, R13, R9        // a9315cf1
-   SUBSW R22->28, R6, R7                      // c770966b
-   SUBSW R22>>28, R6, R7                      // c770566b
-   SUBS R26<<15, R6, R16                      // d03c1aeb
-   SVC $0                                     // 010000d4
-   SVC $7165                                  // a17f03d4
-   SXTBW R8, R25                              // 191d0013
-   SXTB R13, R9                               // a91d4093
-   SXTHW R8, R8                               // 083d0013
-   SXTH R17, R25                              // 393e4093
-   SXTW R0, R27                               // 1b7c4093
-   SYSL $285440, R12                          // 0c5b2cd5
-   TLBI VAE1IS, R1                            // 218308d5
-   TSTW $0x80000007, R9                       // TSTW $2147483655, R9          // 3f0d0172
-   TST $0xfffffff0, LR                        // TST $4294967280, R30          // df6f7cf2
-   TSTW R10@>21, R2                           // 5f54ca6a
-   TST R17<<11, R24                           // 1f2f11ea
-   ANDSW $0x80000007, R9, ZR                  // ANDSW   $2147483655, R9, ZR   // 3f0d0172
-   ANDS $0xfffffff0, LR, ZR                   // ANDS    $4294967280, R30, ZR  // df6f7cf2
-   ANDSW R10@>21, R2, ZR                      // 5f54ca6a
-   ANDS R17<<11, R24, ZR                      // 1f2f11ea
-   UBFIZW $3, R19, $14, R14                   // 6e361d53
-   UBFIZ $3, R22, $14, R4                     // c4367dd3
-   UBFXW $3, R7, $20, R15                     // ef580353
-   UBFX $33, R17, $25, R5                     // 25e661d3
-   UDIVW R8, R21, R15                         // af0ac81a
-   UDIV R2, R19, R21                          // 750ac29a
-   UMADDL R0, R20, R17, R17                   // 3152a09b
-   UMSUBL R22, R4, R3, R7                     // 6790b69b
-   UMNEGL R3, R19, R1                         // 61fea39b
-   UMULH R24, R20, R24                        // 987ed89b
-   UMULL R19, R22, R19                        // d37eb39b
-   UXTBW R2, R6                               // 461c0053
-   UXTHW R7, R20                              // f43c0053
-   VCNT V0.B8, V0.B8                          // 0058200e
-   VCNT V0.B16, V0.B16                        // 0058204e
-   WFE                                        // 5f2003d5
-   WFI                                        // 7f2003d5
-   YIELD                                      // 3f2003d5
-   //TODO FABD F0, F5, F11                    // abd4a07e
-   //TODO VFABD V30.S2, V8.S2, V24.S2         // 18d5be2e
-   //TODO VFABS V5.S4, V24.S4                 // b8f8a04e
-   FABSS F2, F28                              // 5cc0201e
-   FABSD F0, F14                              // 0ec0601e
-   //TODO FACGE F25, F16, F0                  // 00ee797e
-   //TODO VFACGE V11.S2, V15.S2, V9.S2        // e9ed2b2e
-   //TODO FACGT F20, F16, F27                 // 1beef47e
-   //TODO VFACGT V15.S4, V25.S4, V22.S4       // 36efaf6e
-   //TODO VFADD V21.D2, V10.D2, V21.D2        // 55d5754e
-   FADDS F12, F2, F10                         // 4a282c1e
-   FADDD F24, F14, F12                        // cc29781e
-   //TODO VFADDP V4.D2, F13                   // 8dd8707e
-   //TODO VFADDP V30.S4, V3.S4, V11.S4        // 6bd43e6e
-   FCCMPS LE, F17, F12, $14                   // 8ed5311e
-   FCCMPD HI, F11, F15, $15                   // ef856b1e
-   FCCMPES HS, F28, F13, $13                  // bd253c1e
-   FCCMPED LT, F20, F4, $9                    // 99b4741e
-   //TODO FCMEQ F7, F11, F26                  // 7ae5675e
-   //TODO VFCMEQ V29.S4, V26.S4, V30.S4       // 5ee73d4e
-   //TODO FCMEQ $0, F17, F22                  // 36daa05e
-   //TODO VFCMEQ $0, V17.D2, V22.D2           // 36dae04e
-   //TODO FCMGE F29, F31, F13                 // ede77d7e
-   //TODO VFCMGE V8.S2, V31.S2, V2.S2         // e2e7282e
-   //TODO FCMGE $0, F18, F27                  // e2e7282e
-   //TODO VFCMGE $0, V14.S2, V8.S2            // c8c9a02e
-   //TODO FCMGT F20, F2, F8                   // 48e4b47e
-   //TODO VFCMGT V26.D2, V15.D2, V23.D2       // f7e5fa6e
-   //TODO FCMGT $0, F14, F3                   // c3c9e05e
-   //TODO VFCMGT $0, V6.S2, V28.S2            // dcc8a00e
-   //TODO FCMLE $0, F26, F25                  // 59dba07e
-   //TODO VFCMLE $0, V28.S2, V20.S2           // 94dba02e
-   //TODO FCMLT $0, F17, F3                   // 23eae05e
-   //TODO VFCMLT $0, V8.S4, V7.S4             // 07e9a04e
-   FCMPS F3, F17                              // 2022231e
-   FCMPS $(0.0), F8                           // 0821201e
-   FCMPD F11, F27                             // 60236b1e
-   FCMPD $(0.0), F25                          // 2823601e
-   FCMPES F16, F30                            // d023301e
-   FCMPES $(0.0), F29                         // b823201e
-   FCMPED F13, F10                            // 50216d1e
-   FCMPED $(0.0), F25                         // 3823601e
-   FCSELS EQ, F26, F27, F25                   // 590f3b1e
-   FCSELD PL, F8, F22, F7                     // 075d761e
-   //TODO FCVTAS F4, F28                      // 9cc8215e
-   //TODO VFCVTAS V21.D2, V27.D2              // bbca614e
-   //TODO FCVTAS F27, R7                      // 6703241e
-   //TODO FCVTAS F19, R26                     // 7a02249e
-   //TODO FCVTAS F4, R0                       // 8000641e
-   //TODO FCVTAS F3, R19                      // 7300649e
-   //TODO FCVTAU F18, F28                     // 5cca217e
-   //TODO VFCVTAU V30.S4, V27.S4              // dbcb216e
-   //TODO FCVTAU F0, R2                       // 0200251e
-   //TODO FCVTAU F0, R24                      // 1800259e
-   //TODO FCVTAU F31, R10                     // ea03651e
-   //TODO FCVTAU F3, R8                       // 6800659e
-   //TODO VFCVTL V11.S2, V21.D2               // 7579610e
-   //TODO VFCVTL2 V15.H8, V25.S4              // f979214e
-   //TODO FCVTMS F21, F28                     // bcba215e
-   //TODO VFCVTMS V5.D2, V2.D2                // a2b8614e
-   //TODO FCVTMS F31, R19                     // f303301e
-   //TODO FCVTMS F23, R16                     // f002309e
-   //TODO FCVTMS F16, R22                     // 1602701e
-   //TODO FCVTMS F14, R19                     // d301709e
-   //TODO FCVTMU F14, F8                      // c8b9217e
-   //TODO VFCVTMU V7.D2, V1.D2                // e1b8616e
-   //TODO FCVTMU F2, R0                       // 4000311e
-   //TODO FCVTMU F23, R19                     // f302319e
-   //TODO FCVTMU F16, R17                     // 1102711e
-   //TODO FCVTMU F12, R19                     // 9301719e
-   //TODO VFCVTN V23.D2, V26.S2               // fa6a610e
-   //TODO VFCVTN2 V2.D2, V31.S4               // 5f68614e
-   //TODO FCVTNS F3, F27                      // 7ba8215e
-   //TODO VFCVTNS V11.S2, V12.S2              // 6ca9210e
-   //TODO FCVTNS F14, R9                      // c901201e
-   //TODO FCVTNS F0, R27                      // 1b00209e
-   //TODO FCVTNS F23, R0                      // e002601e
-   //TODO FCVTNS F6, R30                      // de00609e
-   //TODO FCVTNU F12, F9                      // 89a9217e
-   //TODO VFCVTNU V3.D2, V20.D2               // 74a8616e
-   //TODO FCVTNU F20, R11                     // 8b02211e
-   //TODO FCVTNU F23, R19                     // f302219e
-   //TODO FCVTNU F4, R5                       // 8500611e
-   //TODO FCVTNU F11, R19                     // 7301619e
-   //TODO FCVTPS F20, F26                     // 9aaae15e
-   //TODO VFCVTPS V29.S4, V13.S4              // adaba14e
-   //TODO FCVTPS F5, R29                      // bd00281e
-   //TODO FCVTPS F3, R3                       // 6300289e
-   //TODO FCVTPS F4, R25                      // 9900681e
-   //TODO FCVTPS F29, R15                     // af03689e
-   //TODO FCVTPU F13, F3                      // a3a9e17e
-   //TODO VFCVTPU V6.S4, V24.S4               // d8a8a16e
-   //TODO FCVTPU F17, R17                     // 3102291e
-   //TODO FCVTPU F7, R23                      // f700299e
-   //TODO FCVTPU F10, R3                      // 4301691e
-   //TODO FCVTPU F24, R27                     // 1b03699e
-   //TODO FCVTXN F14, F0                      // c069617e
-   //TODO VFCVTXN V1.D2, V17.S2               // 3168612e
-   //TODO VFCVTXN2 V0.D2, V21.S4              // 1568616e
-   //TODO FCVTZS $26, F29, F19                // b3ff665f
-   //TODO VFCVTZS $45, V14.D2, V18.D2         // d2fd534f
-   //TODO FCVTZS F8, F7                       // 07b9a15e
-   //TODO VFCVTZS V2.S2, V4.S2                // 44b8a10e
-   //TODO FCVTZS $26, F7, R11                 // eb98181e
-   //TODO FCVTZS $7, F4, ZR                   // 9fe4189e
-   //TODO FCVTZS $28, F13, R14                // ae91581e
-   //TODO FCVTZS $8, F27, R3                  // 63e3589e
-   FCVTZSSW F7, R15                           // ef00381e
-   FCVTZSS F16, ZR                            // 1f02389e
-   FCVTZSDW F19, R3                           // 6302781e
-   FCVTZSD F7, R7                             // e700789e
-   //TODO FCVTZU $17, F18, F28                // 5cfe2f7f
-   //TODO VFCVTZU $19, V20.D2, V11.D2         // 8bfe6d6f
-   //TODO FCVTZU F22, F8                      // c8bae17e
-   //TODO VFCVTZU V0.S4, V1.S4                // 01b8a16e
-   //TODO FCVTZU $14, F24, R20                // 14cb191e
-   //TODO FCVTZU $6, F25, R17                 // 31eb199e
-   //TODO FCVTZU $5, F17, R10                 // 2aee591e
-   //TODO FCVTZU $6, F7, R19                  // f3e8599e
-   FCVTZUSW F2, R9                            // 4900391e
-   FCVTZUS F12, R29                           // 9d01399e
-   FCVTZUDW F27, R22                          // 7603791e
-   FCVTZUD F25, R22                           // 3603799e
-   //TODO VFDIV V6.D2, V1.D2, V27.D2          // 3bfc666e
-   FDIVS F16, F10, F20                        // 5419301e
-   FDIVD F11, F25, F30                        // 3e1b6b1e
-   FMADDS F15, F2, F8, F1                     // 01090f1f
-   FMADDD F15, F21, F25, F9                   // 29574f1f
-   //TODO VFMAX V23.D2, V27.D2, V14.D2        // 6ef7774e
-   FMAXS F5, F28, F27                         // 9b4b251e
-   FMAXD F12, F31, F31                        // ff4b6c1e
-   //TODO VFMAXNM V3.D2, V12.D2, V27.D2       // 9bc5634e
-   FMAXNMS F11, F24, F12                      // 0c6b2b1e
-   FMAXNMD F20, F6, F16                       // d068741e
-   //TODO VFMAXNMP V3.S2, F2                  // 62c8307e
-   //TODO VFMAXNMP V25.S2, V4.S2, V2.S2       // 82c4392e
-   //TODO VFMAXNMV V14.S4, F15                // cfc9306e
-   //TODO VFMAXP V3.S2, F27                   // 7bf8307e
-   //TODO VFMAXP V29.S2, V30.S2, V9.S2        // c9f73d2e
-   //TODO VFMAXV V13.S4, F14                  // aef9306e
-   //TODO VFMIN V19.D2, V30.D2, V7.D2         // c7f7f34e
-   FMINS F26, F18, F30                        // 5e5a3a1e
-   FMIND F29, F4, F21                         // 95587d1e
-   //TODO VFMINNM V21.S4, V5.S4, V1.S4        // a1c4b54e
-   FMINNMS F23, F20, F1                       // 817a371e
-   FMINNMD F8, F3, F24                        // 7878681e
-   //TODO VFMINNMP V16.D2, F12                // 0ccaf07e
-   //TODO VFMINNMP V10.S4, V25.S4, V27.S4     // 3bc7aa6e
-   //TODO VFMINNMV V8.S4, F3                  // 03c9b06e
-   //TODO VFMINP V10.S2, F20                  // 54f9b07e
-   //TODO VFMINP V1.D2, V10.D2, V3.D2         // 43f5e16e
-   //TODO VFMINV V11.S4, F9                   // 69f9b06e
-   //TODO VFMLA V6.S[0], F2, F14              // 4e10865f
-   //TODO VFMLA V28.S[2], V2.S2, V30.S2       // 5e189c0f
-   VFMLA V29.S2, V20.S2, V14.S2               // 8ece3d0e
-   //TODO VFMLS V24.D[1], F3, F17             // 7158d85f
-   //TODO VFMLS V10.S[0], V11.S2, V10.S2      // 6a518a0f
-   VFMLS V29.S2, V27.S2, V17.S2               // 71cfbd0e
-   //TODO FMOVS $(-1.625), F13                // 0d503f1e
-   //TODO FMOVD $12.5, F30                    // 1e30651e
-   //TODO VFMOV R7, V25.D[1]                  // f900af9e
-   FMOVD F2, R15                              // 4f00669e
-   FMOVD R3, F11                              // 6b00679e
-   FMOVS F20, R29                             // 9d02261e
-   FMOVS R8, F15                              // 0f01271e
-   FMOVD F2, F9                               // 4940601e
-   FMOVS F4, F27                              // 9b40201e
-   //TODO VFMOV $3.125, V8.D2                 // 28f5006f
-   FMSUBS F13, F21, F13, F19                  // b3d50d1f
-   FMSUBD F11, F7, F15, F31                   // ff9d4b1f
-   //TODO VFMUL V9.S[2], F21, F19             // b39a895f
-   //TODO VFMUL V26.S[2], V26.S2, V2.S2       // 429b9a0f
-   //TODO VFMUL V21.D2, V17.D2, V25.D2        // 39de756e
-   FMULS F0, F6, F24                          // d808201e
-   FMULD F5, F29, F9                          // a90b651e
-   //TODO VFMULX V26.S[2], F20, F8            // 889a9a7f
-   //TODO VFMULX V12.D[1], V21.D2, V31.D2     // bf9acc6f
-   //TODO FMULX F16, F1, F31                  // 3fdc705e
-   //TODO VFMULX V29.S2, V13.S2, V31.S2       // bfdd3d0e
-   //TODO VFNEG V18.S2, V12.S2                // 4cfaa02e
-   FNEGS F16, F5                              // 0542211e
-   FNEGD F31, F31                             // ff43611e
-   FNMADDS F17, F22, F6, F20                  // d458311f
-   FNMADDD F15, F0, F26, F20                  // 54036f1f
-   FNMSUBS F14, F16, F27, F14                 // 6ec32e1f
-   FNMSUBD F29, F25, F8, F10                  // 0ae57d1f
-   FNMULS F24, F22, F18                       // d28a381e
-   FNMULD F14, F30, F7                        // c78b6e1e
-   //TODO FRECPE F9, F2                       // 22d9e15e
-   //TODO VFRECPE V0.S2, V28.S2               // 1cd8a10e
-   //TODO FRECPS F28, F10, F9                 // 49fd3c5e
-   //TODO VFRECPS V27.D2, V12.D2, V24.D2      // 98fd7b4e
-   //TODO FRECPX F28, F3                      // 83fbe15e
-   //TODO VFRINTA V14.S2, V25.S2              // d989212e
-   FRINTAS F0, F21                            // 1540261e
-   FRINTAD F8, F22                            // 1641661e
-   //TODO VFRINTI V21.D2, V31.D2              // bf9ae16e
-   FRINTIS F17, F17                           // 31c2271e
-   FRINTID F9, F15                            // 2fc1671e
-   //TODO VFRINTM V9.D2, V27.D2               // 3b99614e
-   FRINTMS F24, F16                           // 1043251e
-   FRINTMD F5, F2                             // a240651e
-   //TODO VFRINTN V30.S4, V2.S4               // c28b214e
-   FRINTNS F26, F14                           // 4e43241e
-   FRINTND F28, F12                           // 8c43641e
-   //TODO VFRINTP V27.D2, V31.D2              // 7f8be14e
-   FRINTPS F27, F4                            // 64c3241e
-   FRINTPD F6, F22                            // d6c0641e
-   //TODO VFRINTX V25.D2, V0.D2               // 209b616e
-   FRINTXS F26, F10                           // 4a43271e
-   FRINTXD F16, F12                           // 0c42671e
-   //TODO VFRINTZ V25.S4, V27.S4              // 3b9ba14e
-   FRINTZS F3, F28                            // 7cc0251e
-   FRINTZD F24, F6                            // 06c3651e
-   //TODO FRSQRTE F29, F5                     // a5dbe17e
-   //TODO VFRSQRTE V18.S2, V1.S2              // 41daa12e
-   //TODO FRSQRTS F17, F7, F24                // f8fcf15e
-   //TODO VFRSQRTS V14.S2, V10.S2, V24.S2     // 58fdae0e
-   //TODO VFSQRT V2.D2, V21.D2                // 55f8e16e
-   FSQRTS F0, F9                              // 09c0211e
-   FSQRTD F14, F27                            // dbc1611e
-   FSUBS F25, F23, F0                         // e03a391e
-   FSUBD F11, F13, F24                        // b8396b1e
-   //TODO SCVTFSS F30, F20                    // d4db215e
-   //TODO VSCVTF V7.S2, V17.S2                // f1d8210e
-   SCVTFWS R3, F16                            // 7000221e
-   SCVTFWD R20, F4                            // 8402621e
-   SCVTFS R16, F12                            // 0c02229e
-   SCVTFD R26, F14                            // 4e03629e
-   UCVTFWS R6, F4                             // c400231e
-   UCVTFWD R10, F23                           // 5701631e
-   UCVTFS R24, F29                            // 1d03239e
-   UCVTFD R20, F11                            // 8b02639e
-   VADD V16, V19, V14                                          // 6e86f05e
-   VADD V5.H8, V18.H8, V9.H8                                   // 4986654e
-   VADDP V7.H8, V25.H8, V17.H8                                 // 31bf674e
-   VADDV V3.H8, V0                                             // 60b8714e
-   AESD V22.B16, V19.B16                                       // d35a284e
-   AESE V31.B16, V29.B16                                       // fd4b284e
-   AESIMC V12.B16, V27.B16                                     // 9b79284e
-   AESMC V14.B16, V28.B16                                      // dc69284e
-   VAND V4.B16, V4.B16, V9.B16                                 // 891c244e
-   VCMEQ V24.S4, V13.S4, V12.S4                                // ac8db86e
-   VCNT V13.B8, V11.B8                                         // ab59200e
-   VMOV V31.B[15], V18                                         // f2071f5e
-   VDUP V31.B[15], V18                                         // f2071f5e
-   VDUP V31.B[13], V20.B16                                     // f4071b4e
-   VEOR V4.B8, V18.B8, V7.B8                                   // 471e242e
-   VEXT $4, V2.B8, V1.B8, V3.B8                                // 2320022e
-   VEXT $8, V2.B16, V1.B16, V3.B16                             // 2340026e
-   VMOV V11.B[11], V16.B[12]                                   // 705d196e
-   VMOV R20, V21.B[2]                                          // 951e054e
-   VLD1 (R2), [V21.B16]                                        // 5570404c
-   VLD1 (R24), [V18.D1, V19.D1, V20.D1]                        // 126f400c
-   VLD1 (R29), [V14.D1, V15.D1, V16.D1, V17.D1]                // ae2f400c
-   VLD1.P 16(R23), [V1.B16]                                    // e172df4c
-   VLD1.P (R6)(R11), [V31.D1]                                  // df7ccb0c
-   VLD1.P 16(R7), [V31.D1, V0.D1]                              // ffacdf0c
-   VLD1.P (R19)(R4), [V24.B8, V25.B8]                          // 78a2c40c
-   VLD1.P (R20)(R8), [V7.H8, V8.H8, V9.H8]                     // 8766c84c
-   VLD1.P 32(R30), [V5.B8, V6.B8, V7.B8, V8.B8]                // c523df0c
-   VLD1 (R19), V14.B[15]                                       // 6e1e404d
-   VLD1 (R29), V0.H[1]                                         // a04b400d
-   VLD1 (R27), V2.S[0]                                         // 6283400d
-   VLD1 (R21), V5.D[1]                                         // a586404d
-   VLD1.P 1(R19), V10.B[14]                                    // 6a1adf4d
-   VLD1.P (R3)(R14), V16.B[11]                                 // 700cce4d
-   VLD1.P 2(R1), V28.H[2]                                      // 3c50df0d
-   VLD1.P (R13)(R20), V9.H[2]                                  // a951d40d
-   VLD1.P 4(R17), V1.S[3]                                      // 2192df4d
-   VLD1.P (R14)(R2), V17.S[2]                                  // d181c24d
-   VLD1.P 8(R5), V30.D[1]                                      // be84df4d
-   VLD1.P (R27)(R13), V27.D[0]                                 // 7b87cd0d
-   //TODO FMOVS.P -29(RSP), F8                                 // e8375ebc
-   //TODO FMOVS.W 71(R29), F28                                 // bc7f44bc
-   FMOVS 6160(R4), F23                                         // 971058bd
-   VMOV V18.B[10], V27                                         // 5b06155e
-   VDUP V18.B[10], V27                                         // 5b06155e
-   VMOV V12.B[2], V28.B[12]                                    // 9c15196e
-   VMOV R30, V4.B[13]                                          // c41f1b4e
-   VMOV V2.B16, V4.B16                                         // 441ca24e
-   VMOV V13.S[0], R20                                          // b43d040e
-   VMOV V13.D[0], R20                                          // b43d084e
-   VMOVI $146, V22.B16                                         // 56e6044f
-   VORR V25.B16, V22.B16, V15.B16                              // cf1eb94e
-   VPMULL V2.D1, V1.D1, V3.Q1                                  // 23e0e20e
-   VPMULL2 V2.D2, V1.D2, V4.Q1                                 // 24e0e24e
-   VPMULL V2.B8, V1.B8, V3.H8                                  // 23e0220e
-   VPMULL2 V2.B16, V1.B16, V4.H8                               // 24e0224e
-   VRBIT V10.B16, V21.B16                                      // 5559606e
-   VREV32 V2.H8, V1.H8                                         // 4108606e
-   VREV16 V2.B8, V1.B8                                         // 4118200e
-   VREV16 V5.B16, V16.B16                                      // b018204e
-   SCVTFWS R6, F17                                             // d100221e
-   SCVTFWD R3, F15                                             // 6f00621e
-   SCVTFS R20, F25                                             // 9902229e
-   SCVTFD R13, F9                                              // a901629e
-   SHA1C V8.S4, V8, V2                                         // 0201085e
-   SHA1H V17, V25                                              // 390a285e
-   SHA1M V0.S4, V27, V27                                       // 7b23005e
-   SHA1P V3.S4, V20, V27                                       // 9b12035e
-   SHA1SU0 V17.S4, V13.S4, V16.S4                              // b031115e
-   SHA1SU1 V24.S4, V23.S4                                      // 171b285e
-   SHA256H2 V6.S4, V16, V11                                    // 0b52065e
-   SHA256H V4.S4, V2, V11                                      // 4b40045e
-   SHA256SU0 V0.S4, V16.S4                                     // 1028285e
-   SHA256SU1 V31.S4, V3.S4, V15.S4                             // 6f601f5e
-   VSHL $7, V22.D2, V25.D2                                     // d956474f
-   VST1 [V14.H4, V15.H4, V16.H4], (R27)                        // 6e67000c
-   VST1 [V2.S4, V3.S4, V4.S4, V5.S4], (R14)                    // c229004c
-   VST1.P [V25.S4], (R7)(R29)                                  // f9789d4c
-   VST1.P [V25.D2, V26.D2], 32(R7)                             // f9ac9f4c
-   VST1.P [V14.D1, V15.D1], (R7)(R23)                          // eeac970c
-   VST1.P [V25.D2, V26.D2, V27.D2], 48(R27)                    // 796f9f4c
-   VST1.P [V13.H8, V14.H8, V15.H8], (R3)(R14)                  // 6d648e4c
-   VST1.P [V16.S4, V17.S4, V18.S4, V19.S4], 64(R6)             // d0289f4c
-   VST1.P [V19.H4, V20.H4, V21.H4, V22.H4], (R4)(R16)          // 9324900c
-   VST1 V12.B[3], (R1)                                         // 2c0c000d
-   VST1 V12.B[3], (R1)                                         // 2c0c000d
-   VST1 V25.S[2], (R20)                                        // 9982004d
-   VST1 V9.D[1], (RSP)                                         // e987004d
-   VST1.P V30.B[6], 1(R3)                                      // 7e189f0d
-   VST1.P V8.B[0], (R3)(R21)                                   // 6800950d
-   VST1.P V15.H[5], 2(R10)                                     // 4f499f4d
-   VST1.P V1.H[7], (R23)(R11)                                  // e15a8b4d
-   VST1.P V26.S[0], 4(R11)                                     // 7a819f0d
-   VST1.P V9.S[1], (R16)(R21)                                  // 0992950d
-   VST1.P V16.D[0], 8(R9)                                      // 30859f0d
-   VST1.P V23.D[1], (R21)(R16)                                 // b786904d
-   VSUB V1, V12, V23                                           // 9785e17e
-   VUADDLV V31.S4, V11                                         // eb3bb06e
-   UCVTFWS R11, F19                                            // 7301231e
-   UCVTFWD R26, F13                                            // 4d03631e
-   UCVTFS R23, F11                                             // eb02239e
-   UCVTFD R5, F29                                              // bd00639e
-   VMOV V0.B[1], R11                                           // 0b3c030e
-   VMOV V1.H[3], R12                                           // 2c3c0e0e
-   VUSHR $6, V22.H8, V23.H8                                    // d7061a6f
+	AND $(1<<63), R1                           // AND $-9223372036854775808, R1     // 21004192
+	ADCW ZR, R8, R10                           // 0a011f1a
+	ADC R0, R2, R12                            // 4c00009a
+	ADCSW R9, R21, R6                          // a602093a
+	ADCS R23, R22, R22                         // d60217ba
+	ADDW R5.UXTH, R8, R9                       // 0921250b
+	ADD R8.SXTB<<3, R23, R14                   // ee8e288b
+	ADDW $3076, R17, R3                        // 23123011
+	ADDW $(3076<<12), R17, R3                  // ADDW $12599296, R17, R3           // 23127011
+	ADD $2280, R25, R11                        // 2ba32391
+	ADD $(2280<<12), R25, R11                  // ADD $9338880, R25, R11            // 2ba36391
+	ADDW R13->5, R11, R7                       // 67158d0b
+	ADD R25<<54, R17, R16                      // 30da198b
+	ADDSW R12.SXTX<<1, R29, R7                 // a7e72c2b
+	ADDS R24.UXTX<<4, R25, R21                 // 357338ab
+	ADDSW $(3525<<12), R3, R11                 // ADDSW $14438400, R3, R11          // 6b147731
+	ADDS $(3525<<12), R3, R11                  // ADDS $14438400, R3, R11           // 6b1477b1
+	ADDSW R7->22, R14, R13                     // cd59872b
+	ADDS R14>>7, ZR, R4                        // e41f4eab
+	AND $-9223372036854775808, R1, R1          // 21004192
+	ANDW $4026540031, R29, R2                  // a2430412
+	AND $34903429696192636, R12, R19           // 93910e92
+	ANDW R9@>7, R19, R26                       // 7a1ec90a
+	AND R9@>7, R19, R26                        // 7a1ec98a
+	TSTW $2863311530, R24                      // 1ff30172
+	TST R2, R0                                 // 1f0002ea
+	TST $7, R2                                 // 5f0840f2
+	ANDS R2, R0, ZR                            // 1f0002ea
+	ANDS $7, R2, ZR                            // 5f0840f2
+	ANDSW $2863311530, R24, ZR                 // 1ff30172
+	ANDSW $2863311530, R24, R23                // 17f30172
+	ANDS $-140737488289793, R2, R5             // 458051f2
+	ANDSW R26->24, R21, R15                    // af629a6a
+	ANDS R30@>44, R3, R26                      // 7ab0deea
+	ASRW R12, R27, R25                         // 792bcc1a
+	ASR R14, R27, R7                           // 672bce9a
+	ASR $11, R27, R25                          // 79ff4b93
+	ASRW $11, R27, R25                         // 797f0b13
+	BLT -1(PC)                                 // ebffff54
+	JMP -1(PC)                                 // ffffff17
+	BFIW $16, R20, $6, R0                      // 80161033
+	BFI $27, R21, $21, R25                     // b95265b3
+	BFXILW $3, R27, $23, R14                   // 6e670333
+	BFXIL $26, R8, $16, R20                    // 14a55ab3
+	BICW R7@>15, R5, R16                       // b03ce70a
+	BIC R12@>13, R12, R19                      // 9335ec8a
+	BICSW R25->20, R3, R20                     // 7450b96a
+	BICS R19->12, R1, R23                      // 3730b3ea
+	BICS R19, R1, R23                          // 370033ea
+	BICS R19>>0, R1, R23                       // 370073ea
+	CALL -1(PC)                                // ffffff97
+	CALL (R15)                                 // e0013fd6
+	JMP  (R29)                                 // a0031fd6
+	BRK $35943                                 // e08c31d4
+	CBNZW R2, -1(PC)                           // e2ffff35
+	CBNZ R7, -1(PC)                            // e7ffffb5
+	CBZW R15, -1(PC)                           // efffff34
+	CBZ R1, -1(PC)                             // e1ffffb4
+	CCMN MI, ZR, R1, $4                        // e44341ba
+	CCMNW AL, R26, $20, $11                    // 4beb543a
+	CCMN PL, R24, $6, $1                       // 015b46ba
+	CCMNW EQ, R20, R6, $6                      // 8602463a
+	CCMN LE, R30, R12, $6                      // c6d34cba
+	CCMPW VS, R29, $15, $7                     // a76b4f7a
+	CCMP LE, R7, $19, $3                       // e3d853fa
+	CCMPW HS, R19, R6, $0                      // 6022467a
+	CCMP LT, R30, R6, $7                       // c7b346fa
+	CCMN  MI, ZR, R1, $4                       // e44341ba
+	CSINCW HS, ZR, R27, R14                    // ee279b1a
+	CSINC VC, R2, R1, R1                       // 4174819a
+	CSINVW EQ, R2, R21, R17                    // 5100955a
+	CSINV LO, R2, R19, R23                     // 573093da
+	CINCW LO, R27, R14                         // 6e279b1a
+	CINCW HS, R27, ZR                          // 7f379b1a
+	CINVW EQ, R2, R17                          // 5110825a
+	CINV VS, R12, R7                           // 87718cda
+	CINV VS, R30, R30                          // de739eda
+	CLREX $4                                   // 5f3403d5
+	CLREX $0                                   // 5f3003d5
+	CLSW R15, R6                               // e615c05a
+	CLS R15, ZR                                // ff15c0da
+	CLZW R1, R14                               // 2e10c05a
+	CLZ R21, R9                                // a912c0da
+	CMNW R21.UXTB<<4, R15                      // ff11352b
+	CMN R0.UXTW<<4, R16                        // 1f5220ab
+	CMNW R13>>8, R9                            // 3f214d2b
+	CMN R6->17, R3                             // 7f4486ab
+	CMNW $(2<<12), R5                          // CMNW $8192, R5                // bf084031
+	CMN $(8<<12), R12                          // CMN $32768, R12               // 9f2140b1
+	CMN R6->0, R3                              // 7f0086ab
+	CMN R6, R3                                 // 7f0006ab
+	CMNW R30, R5                               // bf001e2b
+	CMNW $2, R5                                // bf080031
+	CMN ZR, R3                                 // 7f001fab
+	CMN R0, R3                                 // 7f0000ab
+	CMPW R6.UXTB, R23                          // ff02266b
+	CMP R25.SXTH<<2, R26                       // 5fab39eb
+	CMP $3817, R29                             // bfa73bf1
+	CMP R7>>23, R3                             // 7f5c47eb
+	CNEGW PL, R9, R14                          // 2e45895a
+	CSNEGW HS, R5, R9, R14                     // ae24895a
+	CSNEG PL, R14, R21, R3                     // c35595da
+	CNEG  LO, R7, R15                          // ef2487da
+	CRC32B R17, R8, R16                        // 1041d11a
+	CRC32H R3, R21, R27                        // bb46c31a
+	CRC32W R22, R30, R9                        // c94bd61a
+	CRC32X R20, R4, R15                        // 8f4cd49a
+	CRC32CB R19, R27, R22                      // 7653d31a
+	CRC32CH R21, R0, R20                       // 1454d51a
+	CRC32CW R9, R3, R21                        // 7558c91a
+	CRC32CX R11, R0, R24                       // 185ccb9a
+	CSELW LO, R4, R20, R12                     // 8c30941a
+	CSEL GE, R0, R12, R14                      // 0ea08c9a
+	CSETW GE, R3                               // e3b79f1a
+	CSET LT, R30                               // fea79f9a
+	CSETMW VC, R5                              // e5639f5a
+	CSETM VS, R4                               // e4739fda
+	CSINCW LE, R5, R24, R26                    // bad4981a
+	CSINC VS, R26, R16, R17                    // 5167909a
+	CSINVW AL, R23, R21, R5                    // e5e2955a
+	CSINV LO, R2, R11, R14                     // 4e308bda
+	CSNEGW HS, R16, R29, R10                   // 0a269d5a
+	CSNEG NE, R21, R19, R11                    // ab1693da
+	DC IVAC, R1                                // 217608d5
+	DCPS1 $11378                               // 418ea5d4
+	DCPS2 $10699                               // 6239a5d4
+	DCPS3 $24415                               // e3ebabd4
+	DMB $1                                     // bf3103d5
+	DMB $0                                     // bf3003d5
+	DRPS                                       // e003bfd6
+	DSB  $1                                    // 9f3103d5
+	EONW R21<<29, R6, R9                       // c974354a
+	EON R14>>46, R4, R9                        // 89b86eca
+	EOR $-2287828610704211969, R27, R22        // 76e343d2
+	EORW R12->27, R10, R19                     // 536d8c4a
+	EOR R2<<59, R30, R17                       // d1ef02ca
+	ERET                                       // e0039fd6
+	EXTRW $7, R8, R10, R25                     // 591d8813
+	EXTR $35, R22, R12, R8                     // 888dd693
+	SEVL                                       // bf2003d5
+	HINT $6                                    // df2003d5
+	HINT $0                                    // 1f2003d5
+	HLT $65509                                 // a0fc5fd4
+	HVC $61428                                 // 82fe1dd4
+	ISB $1                                     // df3103d5
+	ISB $15                                    // df3f03d5
+	LDARW (R12), R29                           // 9dfddf88
+	LDARW (R30), R22                           // d6ffdf88
+	LDARW (RSP), R22                           // f6ffdf88
+	LDAR (R27), R22                            // 76ffdfc8
+	LDARB (R25), R2                            // 22ffdf08
+	LDARH (R5), R7                             // a7fcdf48
+	LDAXPW (R10), (R20, R16)                   // 54c17f88
+	LDAXP (R25), (R30, R11)                    // 3eaf7fc8
+	LDAXRW (R15), R2                           // e2fd5f88
+	LDAXR (R15), R21                           // f5fd5fc8
+	LDAXRB (R19), R16                          // 70fe5f08
+	LDAXRH (R5), R8                            // a8fc5f48
+	//TODO LDNP 0xcc(RSP), ZR, R12             // ecff5928
+	//TODO LDNP 0x40(R28), R9, R5              // 852744a8
+	//TODO LDPSW -0xd0(R2), R0, R12            // 4c00e668
+	//TODO LDPSW 0x5c(R4), R8, R5              // 85a0cb69
+	//TODO LDPSW 0x6c(R12), R2, R27            // 9b894d69
+	MOVWU.P -84(R15), R9                       // e9c55ab8
+	MOVD.P -46(R10), R8                        // 48255df8
+	MOVD.P (R10), R8                           // 480540f8
+	MOVWU.W -141(R3), R16                      // 703c57b8
+	MOVD.W -134(R0), R29                       // 1dac57f8
+	MOVWU 4156(R1), R25                        // 393c50b9
+	MOVD 14616(R10), R9                        // 498d5cf9
+	MOVWU (R4)(R12.SXTW<<2), R7                // 87d86cb8
+	MOVD (R7)(R11.UXTW<<3), R25                // f9586bf8
+	MOVBU.P 42(R2), R12                        // 4ca44238
+	MOVBU.W -27(R2), R14                       // 4e5c5e38
+	MOVBU 2916(R24), R3                        // 03936d39
+	MOVBU (R19)(R14<<0), R23                   // 777a6e38
+	MOVBU (R2)(R8.SXTX), R19                   // 53e86838
+	MOVBU (R27)(R23), R14                      // 6e6b7738
+	MOVHU.P 107(R14), R13                      // cdb54678
+	MOVHU.W 192(R3), R2                        // 620c4c78
+	MOVHU 6844(R4), R19                        // 93787579
+	MOVHU (R5)(R25.SXTW), R15                  // afc87978
+	//TODO MOVBW.P 77(R19), R11                // 6bd6c438
+	MOVB.P 36(RSP), R27                        // fb478238
+	//TODO MOVBW.W -57(R19), R13               // 6d7edc38
+	MOVB.W -178(R16), R24                      // 18ee9438
+	//TODO MOVBW 430(R8), R22                  // 16b9c639
+	MOVB 997(R9), R23                          // 37958f39
+	//TODO MOVBW (R2<<1)(R21), R15             // af7ae238
+	//TODO MOVBW (R26)(R0), R21                // 1568fa38
+	MOVB (R5)(R15), R16                        // b068af38
+	MOVB (R19)(R26.SXTW), R19                  // 73caba38
+	MOVB (R29)(R30), R14                       // ae6bbe38
+	//TODO MOVHW.P 218(R22), R25               // d9a6cd78
+	MOVH.P 179(R23), R5                        // e5368b78
+	//TODO MOVHW.W 136(R2), R27                // 5b8cc878
+	MOVH.W -63(R25), R22                       // 361f9c78
+	//TODO MOVHW 5708(R25), R21                // 359bec79
+	MOVH 54(R2), R13                           // 4d6c8079
+	//TODO MOVHW (R22)(R24.SXTX), R4           // c4eaf878
+	MOVH (R26)(R30.UXTW<<1), ZR                // 5f5bbe78
+	MOVW.P -58(R16), R2                        // 02669cb8
+	MOVW.W -216(R19), R8                       // 688e92b8
+	MOVW 4764(R23), R10                        // ea9e92b9
+	MOVW (R8)(R3.UXTW), R17                    // 1149a3b8
+	//TODO LDTR -0x1e(R3), R4                  // 64285eb8
+	//TODO LDTR -0xe5(R3), R10                 // 6ab851f8
+	//TODO LDTRB 0xf0(R13), R10                // aa094f38
+	//TODO LDTRH 0xe8(R13), R23                // b7894e78
+	//TODO LDTRSB -0x24(R20), R5               // 85cadd38
+	//TODO LDTRSB -0x75(R9), R13               // 2db99838
+	//TODO LDTRSH 0xef(R3), LR                 // 7ef8ce78
+	//TODO LDTRSH 0x96(R19), R24               // 786a8978
+	//TODO LDTRSW 0x1e(LR), R5                 // c5eb81b8
+	//TODO LDUR 0xbf(R13), R1                  // a1f14bb8
+	//TODO LDUR -0x3c(R22), R3                 // c3425cf8
+	//TODO LDURB -0xff(R17), R14               // 2e125038
+	//TODO LDURH 0x80(R1), R6                  // 26004878
+	//TODO LDURSB 0xde(LR), R3                 // c3e3cd38
+	//TODO LDURSB 0x96(R9), R7                 // 27618938
+	//TODO LDURSH -0x49(R11), R28              // 7c71db78
+	//TODO LDURSH -0x1f(R0), R29               // 1d109e78
+	//TODO LDURSW 0x48(R6), R20                // d48084b8
+	LDXPW (R24), (R23, R11)                    // 172f7f88
+	LDXP (R0), (R16, R13)                      // 10347fc8
+	LDXRW (RSP), R30                           // fe7f5f88
+	LDXR (R27), R12                            // 6c7f5fc8
+	LDXRB (R0), R4                             // 047c5f08
+	LDXRH (R12), R26                           // 9a7d5f48
+	LSLW R11, R10, R15                         // 4f21cb1a
+	LSL R27, R24, R21                          // 1523db9a
+	LSLW $5, R7, R22                           // f6681b53
+	LSL $57, R17, R2                           // 221a47d3
+	LSRW R9, R3, R12                           // 6c24c91a
+	LSR R10, R5, R2                            // a224ca9a
+	LSRW $1, R3, R16                           // 707c0153
+	LSR $12, R1, R20                           // 34fc4cd3
+	MADDW R13, R23, R3, R10                    // 6a5c0d1b
+	MADD R5, R23, R10, R4                      // 445d059b
+	MNEGW R0, R9, R21                          // 35fd001b
+	MNEG R14, R27, R23                         // 77ff0e9b
+	MOVD  R2, R7                               // e70302aa
+	MOVW $-24, R20                             // f4028012
+	MOVD $-51096, ZR                           // fff29892
+	MOVW $2507014144, R20                      // d4adb252
+	MOVD $1313925191285342208, R7              // 8747e2d2
+	ORRW $16252928, ZR, R21                    // f5130d32
+	MOVD $-4260607558625, R11                  // eb6b16b2
+	MOVD R30, R7                               // e7031eaa
+	MOVKW $(3905<<0), R21                      // MOVKW $3905, R21              // 35e88172
+	MOVKW $(3905<<16), R21                     // MOVKW $255918080, R21         // 35e8a172
+	MOVK $(3905<<32), R21                      // MOVK $16771847290880, R21     // 35e8c1f2
+	MOVD $0, R5                                // e5031faa
+	MSR $1, SPSel                              // bf4100d5
+	MSR $9, DAIFSet                            // df4903d5
+	MSR $6, DAIFClr                            // ff4603d5
+	MRS ELR_EL1, R8                            // 284038d5
+	MSR R16, ELR_EL1                           // 304018d5
+	MRS DCZID_EL0, R3                          // e3003bd5
+	MSUBW R1, R1, R12, R5                      // 8585011b
+	MSUB R19, R16, R26, R2                     // 42c3139b
+	MULW R26, R5, R22                          // b67c1a1b
+	MUL R4, R3, R0                             // 607c049b
+	MVNW R3@>13, R8                            // e837e32a
+	MVN R13>>31, R9                            // e97f6daa
+	NEGSW R23<<1, R30                          // fe07176b
+	NEGS R20>>35, R22                          // f68f54eb
+	NGCW R13, R8                               // e8030d5a
+	NGC R2, R7                                 // e70302da
+	NGCSW R10, R5                              // e5030a7a
+	NGCS R24, R16                              // f00318fa
+	NOOP                                        // 1f2003d5
+	ORNW R4@>11, R16, R3                       // 032ee42a
+	ORN R22@>19, R3, R3                        // 634cf6aa
+	ORRW $4294443071, R15, R24                 // f8490d32
+	ORR $-3458764513820540929, R12, R22        // 96f542b2
+	ORRW R13<<4, R8, R26                       // 1a110d2a
+	ORR R3<<22, R5, R6                         // a65803aa
+	PRFM (R8), $25                             // 190180f9
+	PRFM (R2), PLDL1KEEP                       // 400080f9
+	//TODO PRFM (R27)(R30.SXTW<<3), PLDL2STRM  // 63dbbff8
+	//TODO PRFUM 22(R16), PSTL1KEEP            // 106281f8
+	RBITW R9, R22                              // 3601c05a
+	RBIT R11, R4                               // 6401c0da
+	RET                                        // c0035fd6
+	REVW R8, R10                               // 0a09c05a
+	REV R1, R2                                 // 220cc0da
+	REV16W R21, R19                            // b306c05a
+	REV16 R25, R4                              // 2407c0da
+	REV32 R27, R21                             // 750bc0da
+	EXTRW $27, R4, R25, R19                    // 336f8413
+	EXTR $17, R10, R29, R15                    // af47ca93
+	ROR $14, R14, R15                          // cf39ce93
+	RORW $28, R14, R15                         // cf718e13
+	RORW R3, R12, R3                           // 832dc31a
+	ROR R0, R23, R2                            // e22ec09a
+	SBCW R4, R8, R24                           // 1801045a
+	SBC R25, R10, R26                          // 5a0119da
+	SBCSW R27, R19, R19                        // 73021b7a
+	SBCS R5, R9, R5                            // 250105fa
+	SBFIZW $9, R10, $18, R22                   // 56451713
+	SBFIZ $6, R11, $15, R20                    // 74397a93
+	SBFXW $8, R15, $10, R20                    // f4450813
+	SBFX $2, R27, $54, R7                      // 67df4293
+	SDIVW R22, R14, R9                         // c90dd61a
+	SDIV R13, R21, R9                          // a90ecd9a
+	SEV                                        // 9f2003d5
+	SEVL                                       // bf2003d5
+	SMADDL R3, R7, R11, R9                     // 691d239b
+	SMSUBL R5, R19, R11, R29                   // 7dcd259b
+	SMNEGL R26, R3, R15                        // 6ffc3a9b
+	SMULH R17, R21, R21                        // b57e519b
+	SMULL R0, R5, R0                           // a07c209b
+	SMC $37977                                 // 238b12d4
+	STLRW R16, (R22)                           // d0fe9f88
+	STLR R3, (R24)                             // 03ff9fc8
+	STLRB R11, (R22)                           // cbfe9f08
+	STLRH R16, (R23)                           // f0fe9f48
+	STLXR R7, (R27), R8                        // 67ff08c8
+	STLXRW R13, (R15), R14                     // edfd0e88
+	STLXRB R24, (R23), R8                      // f8fe0808
+	STLXRH R19, (R27), R11                     // 73ff0b48
+	STLXP (R6, R3), (R10), R2                  // 468d22c8
+	STLXPW (R6, R11), (R22), R21               // c6ae3588
+	//TODO STNPW 44(R1), R3, R10               // 2a8c0528
+	//TODO STNP 0x108(R3), ZR, R7              // 67fc10a8
+	LDP.P -384(R3), (R22, R26)                 // 7668e8a8
+	LDP.W 280(R8), (R19, R11)                  // 13add1a9
+	STP.P (R22, R27), 352(R0)                  // 166c96a8
+	STP.W (R17, R11), 96(R8)                   // 112d86a9
+	MOVW.P R20, -28(R1)                        // 34441eb8
+	MOVD.P R17, 191(R16)                       // 11f60bf8
+	MOVW.W R1, -171(R14)                       // c15d15b8
+	MOVD.W R14, -220(R13)                      // ae4d12f8
+	MOVW R3, 14828(R24)                        // 03ef39b9
+	MOVD R0, 20736(R17)                        // 208228f9
+	MOVB.P ZR, -117(R7)                        // ffb41838
+	MOVB.W R27, -96(R13)                       // bb0d1a38
+	MOVB R17, 2200(R13)                        // b1612239
+	MOVH.P R7, -72(R4)                         // 87841b78
+	MOVH.W R12, -125(R14)                      // cc3d1878
+	MOVH R19, 3686(R26)                        // 53cf1c79
+	MOVW R21, 34(R0)                           // 152002b8
+	MOVD R25, -137(R17)                        // 397217f8
+	MOVW R4, (R12)(R22.UXTW<<2)                // 845936b8
+	MOVD R27, (R5)(R15.UXTW<<3)                // bb582ff8
+	MOVB R2, (R10)(R16)                        // 42693038
+	MOVB R2, (R29)(R26)                        // a26b3a38
+	MOVH R11, -80(R23)                         // eb021b78
+	MOVH R11, (R27)(R14.SXTW<<1)               // 6bdb2e78
+	MOVB R19, (R0)(R4)                         // 13682438
+	MOVB R1, (R6)(R4)                          // c1682438
+	MOVH R3, (R11)(R13<<1)                     // 63792d78
+	//TODO STTR 55(R4), R29                    // 9d7803b8
+	//TODO STTR 124(R5), R25                   // b9c807f8
+	//TODO STTRB -28(R23), R16                 // f04a1e38
+	//TODO STTRH 9(R10), R19                   // 53990078
+	STXP (R1, R2), (R3), R10                   // 61082ac8
+	STXP (R1, R2), (RSP), R10                  // e10b2ac8
+	STXPW (R1, R2), (R3), R10                  // 61082a88
+	STXPW (R1, R2), (RSP), R10                 // e10b2a88
+	STXRW R2, (R19), R20                       // 627e1488
+	STXR R15, (R21), R13                       // af7e0dc8
+	STXRB R7, (R9), R24                        // 277d1808
+	STXRH R12, (R3), R8                        // 6c7c0848
+	SUBW R20.UXTW<<2, R23, R19                 // f34a344b
+	SUB R5.SXTW<<2, R1, R26                    // 3ac825cb
+	SUB $(1923<<12), R4, R27                   // SUB $7876608, R4, R27         // 9b0c5ed1
+	SUBW $(1923<<12), R4, R27                  // SUBW $7876608, R4, R27        // 9b0c5e51
+	SUBW R12<<29, R7, R8                       // e8740c4b
+	SUB R12<<61, R7, R8                        // e8f40ccb
+	SUBSW R2.SXTH<<3, R13, R6                  // a6ad226b
+	SUBS R21.UXTX<<2, R27, R4                  // 646b35eb
+	SUBSW $(44<<12), R6, R9                    // SUBSW $180224, R6, R9         // c9b04071
+	SUBS $(1804<<12), R13, R9                  // SUBS $7389184, R13, R9        // a9315cf1
+	SUBSW R22->28, R6, R7                      // c770966b
+	SUBSW R22>>28, R6, R7                      // c770566b
+	SUBS R26<<15, R6, R16                      // d03c1aeb
+	SVC $0                                     // 010000d4
+	SVC $7165                                  // a17f03d4
+	SXTBW R8, R25                              // 191d0013
+	SXTB R13, R9                               // a91d4093
+	SXTHW R8, R8                               // 083d0013
+	SXTH R17, R25                              // 393e4093
+	SXTW R0, R27                               // 1b7c4093
+	SYSL $285440, R12                          // 0c5b2cd5
+	TLBI VAE1IS, R1                            // 218308d5
+	TSTW $0x80000007, R9                       // TSTW $2147483655, R9          // 3f0d0172
+	TST $0xfffffff0, LR                        // TST $4294967280, R30          // df6f7cf2
+	TSTW R10@>21, R2                           // 5f54ca6a
+	TST R17<<11, R24                           // 1f2f11ea
+	ANDSW $0x80000007, R9, ZR                  // ANDSW   $2147483655, R9, ZR   // 3f0d0172
+	ANDS $0xfffffff0, LR, ZR                   // ANDS    $4294967280, R30, ZR  // df6f7cf2
+	ANDSW R10@>21, R2, ZR                      // 5f54ca6a
+	ANDS R17<<11, R24, ZR                      // 1f2f11ea
+	UBFIZW $3, R19, $14, R14                   // 6e361d53
+	UBFIZ $3, R22, $14, R4                     // c4367dd3
+	UBFXW $3, R7, $20, R15                     // ef580353
+	UBFX $33, R17, $25, R5                     // 25e661d3
+	UDIVW R8, R21, R15                         // af0ac81a
+	UDIV R2, R19, R21                          // 750ac29a
+	UMADDL R0, R20, R17, R17                   // 3152a09b
+	UMSUBL R22, R4, R3, R7                     // 6790b69b
+	UMNEGL R3, R19, R1                         // 61fea39b
+	UMULH R24, R20, R24                        // 987ed89b
+	UMULL R19, R22, R19                        // d37eb39b
+	UXTBW R2, R6                               // 461c0053
+	UXTHW R7, R20                              // f43c0053
+	VCNT V0.B8, V0.B8                          // 0058200e
+	VCNT V0.B16, V0.B16                        // 0058204e
+	WFE                                        // 5f2003d5
+	WFI                                        // 7f2003d5
+	YIELD                                      // 3f2003d5
+	//TODO FABD F0, F5, F11                    // abd4a07e
+	//TODO VFABD V30.S2, V8.S2, V24.S2         // 18d5be2e
+	//TODO VFABS V5.S4, V24.S4                 // b8f8a04e
+	FABSS F2, F28                              // 5cc0201e
+	FABSD F0, F14                              // 0ec0601e
+	//TODO FACGE F25, F16, F0                  // 00ee797e
+	//TODO VFACGE V11.S2, V15.S2, V9.S2        // e9ed2b2e
+	//TODO FACGT F20, F16, F27                 // 1beef47e
+	//TODO VFACGT V15.S4, V25.S4, V22.S4       // 36efaf6e
+	//TODO VFADD V21.D2, V10.D2, V21.D2        // 55d5754e
+	FADDS F12, F2, F10                         // 4a282c1e
+	FADDD F24, F14, F12                        // cc29781e
+	//TODO VFADDP V4.D2, F13                   // 8dd8707e
+	//TODO VFADDP V30.S4, V3.S4, V11.S4        // 6bd43e6e
+	FCCMPS LE, F17, F12, $14                   // 8ed5311e
+	FCCMPD HI, F11, F15, $15                   // ef856b1e
+	FCCMPES HS, F28, F13, $13                  // bd253c1e
+	FCCMPED LT, F20, F4, $9                    // 99b4741e
+	//TODO FCMEQ F7, F11, F26                  // 7ae5675e
+	//TODO VFCMEQ V29.S4, V26.S4, V30.S4       // 5ee73d4e
+	//TODO FCMEQ $0, F17, F22                  // 36daa05e
+	//TODO VFCMEQ $0, V17.D2, V22.D2           // 36dae04e
+	//TODO FCMGE F29, F31, F13                 // ede77d7e
+	//TODO VFCMGE V8.S2, V31.S2, V2.S2         // e2e7282e
+	//TODO FCMGE $0, F18, F27                  // e2e7282e
+	//TODO VFCMGE $0, V14.S2, V8.S2            // c8c9a02e
+	//TODO FCMGT F20, F2, F8                   // 48e4b47e
+	//TODO VFCMGT V26.D2, V15.D2, V23.D2       // f7e5fa6e
+	//TODO FCMGT $0, F14, F3                   // c3c9e05e
+	//TODO VFCMGT $0, V6.S2, V28.S2            // dcc8a00e
+	//TODO FCMLE $0, F26, F25                  // 59dba07e
+	//TODO VFCMLE $0, V28.S2, V20.S2           // 94dba02e
+	//TODO FCMLT $0, F17, F3                   // 23eae05e
+	//TODO VFCMLT $0, V8.S4, V7.S4             // 07e9a04e
+	FCMPS F3, F17                              // 2022231e
+	FCMPS $(0.0), F8                           // 0821201e
+	FCMPD F11, F27                             // 60236b1e
+	FCMPD $(0.0), F25                          // 2823601e
+	FCMPES F16, F30                            // d023301e
+	FCMPES $(0.0), F29                         // b823201e
+	FCMPED F13, F10                            // 50216d1e
+	FCMPED $(0.0), F25                         // 3823601e
+	FCSELS EQ, F26, F27, F25                   // 590f3b1e
+	FCSELD PL, F8, F22, F7                     // 075d761e
+	//TODO FCVTAS F4, F28                      // 9cc8215e
+	//TODO VFCVTAS V21.D2, V27.D2              // bbca614e
+	//TODO FCVTAS F27, R7                      // 6703241e
+	//TODO FCVTAS F19, R26                     // 7a02249e
+	//TODO FCVTAS F4, R0                       // 8000641e
+	//TODO FCVTAS F3, R19                      // 7300649e
+	//TODO FCVTAU F18, F28                     // 5cca217e
+	//TODO VFCVTAU V30.S4, V27.S4              // dbcb216e
+	//TODO FCVTAU F0, R2                       // 0200251e
+	//TODO FCVTAU F0, R24                      // 1800259e
+	//TODO FCVTAU F31, R10                     // ea03651e
+	//TODO FCVTAU F3, R8                       // 6800659e
+	//TODO VFCVTL V11.S2, V21.D2               // 7579610e
+	//TODO VFCVTL2 V15.H8, V25.S4              // f979214e
+	//TODO FCVTMS F21, F28                     // bcba215e
+	//TODO VFCVTMS V5.D2, V2.D2                // a2b8614e
+	//TODO FCVTMS F31, R19                     // f303301e
+	//TODO FCVTMS F23, R16                     // f002309e
+	//TODO FCVTMS F16, R22                     // 1602701e
+	//TODO FCVTMS F14, R19                     // d301709e
+	//TODO FCVTMU F14, F8                      // c8b9217e
+	//TODO VFCVTMU V7.D2, V1.D2                // e1b8616e
+	//TODO FCVTMU F2, R0                       // 4000311e
+	//TODO FCVTMU F23, R19                     // f302319e
+	//TODO FCVTMU F16, R17                     // 1102711e
+	//TODO FCVTMU F12, R19                     // 9301719e
+	//TODO VFCVTN V23.D2, V26.S2               // fa6a610e
+	//TODO VFCVTN2 V2.D2, V31.S4               // 5f68614e
+	//TODO FCVTNS F3, F27                      // 7ba8215e
+	//TODO VFCVTNS V11.S2, V12.S2              // 6ca9210e
+	//TODO FCVTNS F14, R9                      // c901201e
+	//TODO FCVTNS F0, R27                      // 1b00209e
+	//TODO FCVTNS F23, R0                      // e002601e
+	//TODO FCVTNS F6, R30                      // de00609e
+	//TODO FCVTNU F12, F9                      // 89a9217e
+	//TODO VFCVTNU V3.D2, V20.D2               // 74a8616e
+	//TODO FCVTNU F20, R11                     // 8b02211e
+	//TODO FCVTNU F23, R19                     // f302219e
+	//TODO FCVTNU F4, R5                       // 8500611e
+	//TODO FCVTNU F11, R19                     // 7301619e
+	//TODO FCVTPS F20, F26                     // 9aaae15e
+	//TODO VFCVTPS V29.S4, V13.S4              // adaba14e
+	//TODO FCVTPS F5, R29                      // bd00281e
+	//TODO FCVTPS F3, R3                       // 6300289e
+	//TODO FCVTPS F4, R25                      // 9900681e
+	//TODO FCVTPS F29, R15                     // af03689e
+	//TODO FCVTPU F13, F3                      // a3a9e17e
+	//TODO VFCVTPU V6.S4, V24.S4               // d8a8a16e
+	//TODO FCVTPU F17, R17                     // 3102291e
+	//TODO FCVTPU F7, R23                      // f700299e
+	//TODO FCVTPU F10, R3                      // 4301691e
+	//TODO FCVTPU F24, R27                     // 1b03699e
+	//TODO FCVTXN F14, F0                      // c069617e
+	//TODO VFCVTXN V1.D2, V17.S2               // 3168612e
+	//TODO VFCVTXN2 V0.D2, V21.S4              // 1568616e
+	//TODO FCVTZS $26, F29, F19                // b3ff665f
+	//TODO VFCVTZS $45, V14.D2, V18.D2         // d2fd534f
+	//TODO FCVTZS F8, F7                       // 07b9a15e
+	//TODO VFCVTZS V2.S2, V4.S2                // 44b8a10e
+	//TODO FCVTZS $26, F7, R11                 // eb98181e
+	//TODO FCVTZS $7, F4, ZR                   // 9fe4189e
+	//TODO FCVTZS $28, F13, R14                // ae91581e
+	//TODO FCVTZS $8, F27, R3                  // 63e3589e
+	FCVTZSSW F7, R15                           // ef00381e
+	FCVTZSS F16, ZR                            // 1f02389e
+	FCVTZSDW F19, R3                           // 6302781e
+	FCVTZSD F7, R7                             // e700789e
+	//TODO FCVTZU $17, F18, F28                // 5cfe2f7f
+	//TODO VFCVTZU $19, V20.D2, V11.D2         // 8bfe6d6f
+	//TODO FCVTZU F22, F8                      // c8bae17e
+	//TODO VFCVTZU V0.S4, V1.S4                // 01b8a16e
+	//TODO FCVTZU $14, F24, R20                // 14cb191e
+	//TODO FCVTZU $6, F25, R17                 // 31eb199e
+	//TODO FCVTZU $5, F17, R10                 // 2aee591e
+	//TODO FCVTZU $6, F7, R19                  // f3e8599e
+	FCVTZUSW F2, R9                            // 4900391e
+	FCVTZUS F12, R29                           // 9d01399e
+	FCVTZUDW F27, R22                          // 7603791e
+	FCVTZUD F25, R22                           // 3603799e
+	//TODO VFDIV V6.D2, V1.D2, V27.D2          // 3bfc666e
+	FDIVS F16, F10, F20                        // 5419301e
+	FDIVD F11, F25, F30                        // 3e1b6b1e
+	FMADDS F15, F2, F8, F1                     // 01090f1f
+	FMADDD F15, F21, F25, F9                   // 29574f1f
+	//TODO VFMAX V23.D2, V27.D2, V14.D2        // 6ef7774e
+	FMAXS F5, F28, F27                         // 9b4b251e
+	FMAXD F12, F31, F31                        // ff4b6c1e
+	//TODO VFMAXNM V3.D2, V12.D2, V27.D2       // 9bc5634e
+	FMAXNMS F11, F24, F12                      // 0c6b2b1e
+	FMAXNMD F20, F6, F16                       // d068741e
+	//TODO VFMAXNMP V3.S2, F2                  // 62c8307e
+	//TODO VFMAXNMP V25.S2, V4.S2, V2.S2       // 82c4392e
+	//TODO VFMAXNMV V14.S4, F15                // cfc9306e
+	//TODO VFMAXP V3.S2, F27                   // 7bf8307e
+	//TODO VFMAXP V29.S2, V30.S2, V9.S2        // c9f73d2e
+	//TODO VFMAXV V13.S4, F14                  // aef9306e
+	//TODO VFMIN V19.D2, V30.D2, V7.D2         // c7f7f34e
+	FMINS F26, F18, F30                        // 5e5a3a1e
+	FMIND F29, F4, F21                         // 95587d1e
+	//TODO VFMINNM V21.S4, V5.S4, V1.S4        // a1c4b54e
+	FMINNMS F23, F20, F1                       // 817a371e
+	FMINNMD F8, F3, F24                        // 7878681e
+	//TODO VFMINNMP V16.D2, F12                // 0ccaf07e
+	//TODO VFMINNMP V10.S4, V25.S4, V27.S4     // 3bc7aa6e
+	//TODO VFMINNMV V8.S4, F3                  // 03c9b06e
+	//TODO VFMINP V10.S2, F20                  // 54f9b07e
+	//TODO VFMINP V1.D2, V10.D2, V3.D2         // 43f5e16e
+	//TODO VFMINV V11.S4, F9                   // 69f9b06e
+	//TODO VFMLA V6.S[0], F2, F14              // 4e10865f
+	//TODO VFMLA V28.S[2], V2.S2, V30.S2       // 5e189c0f
+	VFMLA V29.S2, V20.S2, V14.S2               // 8ece3d0e
+	//TODO VFMLS V24.D[1], F3, F17             // 7158d85f
+	//TODO VFMLS V10.S[0], V11.S2, V10.S2      // 6a518a0f
+	VFMLS V29.S2, V27.S2, V17.S2               // 71cfbd0e
+	//TODO FMOVS $(-1.625), F13                // 0d503f1e
+	//TODO FMOVD $12.5, F30                    // 1e30651e
+	//TODO VFMOV R7, V25.D[1]                  // f900af9e
+	FMOVD F2, R15                              // 4f00669e
+	FMOVD R3, F11                              // 6b00679e
+	FMOVS F20, R29                             // 9d02261e
+	FMOVS R8, F15                              // 0f01271e
+	FMOVD F2, F9                               // 4940601e
+	FMOVS F4, F27                              // 9b40201e
+	//TODO VFMOV $3.125, V8.D2                 // 28f5006f
+	FMSUBS F13, F21, F13, F19                  // b3d50d1f
+	FMSUBD F11, F7, F15, F31                   // ff9d4b1f
+	//TODO VFMUL V9.S[2], F21, F19             // b39a895f
+	//TODO VFMUL V26.S[2], V26.S2, V2.S2       // 429b9a0f
+	//TODO VFMUL V21.D2, V17.D2, V25.D2        // 39de756e
+	FMULS F0, F6, F24                          // d808201e
+	FMULD F5, F29, F9                          // a90b651e
+	//TODO VFMULX V26.S[2], F20, F8            // 889a9a7f
+	//TODO VFMULX V12.D[1], V21.D2, V31.D2     // bf9acc6f
+	//TODO FMULX F16, F1, F31                  // 3fdc705e
+	//TODO VFMULX V29.S2, V13.S2, V31.S2       // bfdd3d0e
+	//TODO VFNEG V18.S2, V12.S2                // 4cfaa02e
+	FNEGS F16, F5                              // 0542211e
+	FNEGD F31, F31                             // ff43611e
+	FNMADDS F17, F22, F6, F20                  // d458311f
+	FNMADDD F15, F0, F26, F20                  // 54036f1f
+	FNMSUBS F14, F16, F27, F14                 // 6ec32e1f
+	FNMSUBD F29, F25, F8, F10                  // 0ae57d1f
+	FNMULS F24, F22, F18                       // d28a381e
+	FNMULD F14, F30, F7                        // c78b6e1e
+	//TODO FRECPE F9, F2                       // 22d9e15e
+	//TODO VFRECPE V0.S2, V28.S2               // 1cd8a10e
+	//TODO FRECPS F28, F10, F9                 // 49fd3c5e
+	//TODO VFRECPS V27.D2, V12.D2, V24.D2      // 98fd7b4e
+	//TODO FRECPX F28, F3                      // 83fbe15e
+	//TODO VFRINTA V14.S2, V25.S2              // d989212e
+	FRINTAS F0, F21                            // 1540261e
+	FRINTAD F8, F22                            // 1641661e
+	//TODO VFRINTI V21.D2, V31.D2              // bf9ae16e
+	FRINTIS F17, F17                           // 31c2271e
+	FRINTID F9, F15                            // 2fc1671e
+	//TODO VFRINTM V9.D2, V27.D2               // 3b99614e
+	FRINTMS F24, F16                           // 1043251e
+	FRINTMD F5, F2                             // a240651e
+	//TODO VFRINTN V30.S4, V2.S4               // c28b214e
+	FRINTNS F26, F14                           // 4e43241e
+	FRINTND F28, F12                           // 8c43641e
+	//TODO VFRINTP V27.D2, V31.D2              // 7f8be14e
+	FRINTPS F27, F4                            // 64c3241e
+	FRINTPD F6, F22                            // d6c0641e
+	//TODO VFRINTX V25.D2, V0.D2               // 209b616e
+	FRINTXS F26, F10                           // 4a43271e
+	FRINTXD F16, F12                           // 0c42671e
+	//TODO VFRINTZ V25.S4, V27.S4              // 3b9ba14e
+	FRINTZS F3, F28                            // 7cc0251e
+	FRINTZD F24, F6                            // 06c3651e
+	//TODO FRSQRTE F29, F5                     // a5dbe17e
+	//TODO VFRSQRTE V18.S2, V1.S2              // 41daa12e
+	//TODO FRSQRTS F17, F7, F24                // f8fcf15e
+	//TODO VFRSQRTS V14.S2, V10.S2, V24.S2     // 58fdae0e
+	//TODO VFSQRT V2.D2, V21.D2                // 55f8e16e
+	FSQRTS F0, F9                              // 09c0211e
+	FSQRTD F14, F27                            // dbc1611e
+	FSUBS F25, F23, F0                         // e03a391e
+	FSUBD F11, F13, F24                        // b8396b1e
+	//TODO SCVTFSS F30, F20                    // d4db215e
+	//TODO VSCVTF V7.S2, V17.S2                // f1d8210e
+	SCVTFWS R3, F16                            // 7000221e
+	SCVTFWD R20, F4                            // 8402621e
+	SCVTFS R16, F12                            // 0c02229e
+	SCVTFD R26, F14                            // 4e03629e
+	UCVTFWS R6, F4                             // c400231e
+	UCVTFWD R10, F23                           // 5701631e
+	UCVTFS R24, F29                            // 1d03239e
+	UCVTFD R20, F11                            // 8b02639e
+	VADD V16, V19, V14                                          // 6e86f05e
+	VADD V5.H8, V18.H8, V9.H8                                   // 4986654e
+	VADDP V7.H8, V25.H8, V17.H8                                 // 31bf674e
+	VADDV V3.H8, V0                                             // 60b8714e
+	AESD V22.B16, V19.B16                                       // d35a284e
+	AESE V31.B16, V29.B16                                       // fd4b284e
+	AESIMC V12.B16, V27.B16                                     // 9b79284e
+	AESMC V14.B16, V28.B16                                      // dc69284e
+	VAND V4.B16, V4.B16, V9.B16                                 // 891c244e
+	VCMEQ V24.S4, V13.S4, V12.S4                                // ac8db86e
+	VCNT V13.B8, V11.B8                                         // ab59200e
+	VMOV V31.B[15], V18                                         // f2071f5e
+	VDUP V31.B[15], V18                                         // f2071f5e
+	VDUP V31.B[13], V20.B16                                     // f4071b4e
+	VEOR V4.B8, V18.B8, V7.B8                                   // 471e242e
+	VEXT $4, V2.B8, V1.B8, V3.B8                                // 2320022e
+	VEXT $8, V2.B16, V1.B16, V3.B16                             // 2340026e
+	VMOV V11.B[11], V16.B[12]                                   // 705d196e
+	VMOV R20, V21.B[2]                                          // 951e054e
+	VLD1 (R2), [V21.B16]                                        // 5570404c
+	VLD1 (R24), [V18.D1, V19.D1, V20.D1]                        // 126f400c
+	VLD1 (R29), [V14.D1, V15.D1, V16.D1, V17.D1]                // ae2f400c
+	VLD1.P 16(R23), [V1.B16]                                    // e172df4c
+	VLD1.P (R6)(R11), [V31.D1]                                  // df7ccb0c
+	VLD1.P 16(R7), [V31.D1, V0.D1]                              // ffacdf0c
+	VLD1.P (R19)(R4), [V24.B8, V25.B8]                          // 78a2c40c
+	VLD1.P (R20)(R8), [V7.H8, V8.H8, V9.H8]                     // 8766c84c
+	VLD1.P 32(R30), [V5.B8, V6.B8, V7.B8, V8.B8]                // c523df0c
+	VLD1 (R19), V14.B[15]                                       // 6e1e404d
+	VLD1 (R29), V0.H[1]                                         // a04b400d
+	VLD1 (R27), V2.S[0]                                         // 6283400d
+	VLD1 (R21), V5.D[1]                                         // a586404d
+	VLD1.P 1(R19), V10.B[14]                                    // 6a1adf4d
+	VLD1.P (R3)(R14), V16.B[11]                                 // 700cce4d
+	VLD1.P 2(R1), V28.H[2]                                      // 3c50df0d
+	VLD1.P (R13)(R20), V9.H[2]                                  // a951d40d
+	VLD1.P 4(R17), V1.S[3]                                      // 2192df4d
+	VLD1.P (R14)(R2), V17.S[2]                                  // d181c24d
+	VLD1.P 8(R5), V30.D[1]                                      // be84df4d
+	VLD1.P (R27)(R13), V27.D[0]                                 // 7b87cd0d
+	//TODO FMOVS.P -29(RSP), F8                                 // e8375ebc
+	//TODO FMOVS.W 71(R29), F28                                 // bc7f44bc
+	FMOVS 6160(R4), F23                                         // 971058bd
+	VMOV V18.B[10], V27                                         // 5b06155e
+	VDUP V18.B[10], V27                                         // 5b06155e
+	VMOV V12.B[2], V28.B[12]                                    // 9c15196e
+	VMOV R30, V4.B[13]                                          // c41f1b4e
+	VMOV V2.B16, V4.B16                                         // 441ca24e
+	VMOV V13.S[0], R20                                          // b43d040e
+	VMOV V13.D[0], R20                                          // b43d084e
+	VMOVI $146, V22.B16                                         // 56e6044f
+	VORR V25.B16, V22.B16, V15.B16                              // cf1eb94e
+	VPMULL V2.D1, V1.D1, V3.Q1                                  // 23e0e20e
+	VPMULL2 V2.D2, V1.D2, V4.Q1                                 // 24e0e24e
+	VPMULL V2.B8, V1.B8, V3.H8                                  // 23e0220e
+	VPMULL2 V2.B16, V1.B16, V4.H8                               // 24e0224e
+	VRBIT V10.B16, V21.B16                                      // 5559606e
+	VREV32 V2.H8, V1.H8                                         // 4108606e
+	VREV16 V2.B8, V1.B8                                         // 4118200e
+	VREV16 V5.B16, V16.B16                                      // b018204e
+	SCVTFWS R6, F17                                             // d100221e
+	SCVTFWD R3, F15                                             // 6f00621e
+	SCVTFS R20, F25                                             // 9902229e
+	SCVTFD R13, F9                                              // a901629e
+	SHA1C V8.S4, V8, V2                                         // 0201085e
+	SHA1H V17, V25                                              // 390a285e
+	SHA1M V0.S4, V27, V27                                       // 7b23005e
+	SHA1P V3.S4, V20, V27                                       // 9b12035e
+	SHA1SU0 V17.S4, V13.S4, V16.S4                              // b031115e
+	SHA1SU1 V24.S4, V23.S4                                      // 171b285e
+	SHA256H2 V6.S4, V16, V11                                    // 0b52065e
+	SHA256H V4.S4, V2, V11                                      // 4b40045e
+	SHA256SU0 V0.S4, V16.S4                                     // 1028285e
+	SHA256SU1 V31.S4, V3.S4, V15.S4                             // 6f601f5e
+	VSHL $7, V22.D2, V25.D2                                     // d956474f
+	VST1 [V14.H4, V15.H4, V16.H4], (R27)                        // 6e67000c
+	VST1 [V2.S4, V3.S4, V4.S4, V5.S4], (R14)                    // c229004c
+	VST1.P [V25.S4], (R7)(R29)                                  // f9789d4c
+	VST1.P [V25.D2, V26.D2], 32(R7)                             // f9ac9f4c
+	VST1.P [V14.D1, V15.D1], (R7)(R23)                          // eeac970c
+	VST1.P [V25.D2, V26.D2, V27.D2], 48(R27)                    // 796f9f4c
+	VST1.P [V13.H8, V14.H8, V15.H8], (R3)(R14)                  // 6d648e4c
+	VST1.P [V16.S4, V17.S4, V18.S4, V19.S4], 64(R6)             // d0289f4c
+	VST1.P [V19.H4, V20.H4, V21.H4, V22.H4], (R4)(R16)          // 9324900c
+	VST1 V12.B[3], (R1)                                         // 2c0c000d
+	VST1 V12.B[3], (R1)                                         // 2c0c000d
+	VST1 V25.S[2], (R20)                                        // 9982004d
+	VST1 V9.D[1], (RSP)                                         // e987004d
+	VST1.P V30.B[6], 1(R3)                                      // 7e189f0d
+	VST1.P V8.B[0], (R3)(R21)                                   // 6800950d
+	VST1.P V15.H[5], 2(R10)                                     // 4f499f4d
+	VST1.P V1.H[7], (R23)(R11)                                  // e15a8b4d
+	VST1.P V26.S[0], 4(R11)                                     // 7a819f0d
+	VST1.P V9.S[1], (R16)(R21)                                  // 0992950d
+	VST1.P V16.D[0], 8(R9)                                      // 30859f0d
+	VST1.P V23.D[1], (R21)(R16)                                 // b786904d
+	VSUB V1, V12, V23                                           // 9785e17e
+	VUADDLV V31.S4, V11                                         // eb3bb06e
+	UCVTFWS R11, F19                                            // 7301231e
+	UCVTFWD R26, F13                                            // 4d03631e
+	UCVTFS R23, F11                                             // eb02239e
+	UCVTFD R5, F29                                              // bd00639e
+	VMOV V0.B[1], R11                                           // 0b3c030e
+	VMOV V1.H[3], R12                                           // 2c3c0e0e
+	VUSHR $6, V22.H8, V23.H8                                    // d7061a6f
 
-   RET
+	RET
diff --git a/src/cmd/asm/internal/asm/testdata/arm64error.s b/src/cmd/asm/internal/asm/testdata/arm64error.s
index 52f01e1..354b64d 100644
--- a/src/cmd/asm/internal/asm/testdata/arm64error.s
+++ b/src/cmd/asm/internal/asm/testdata/arm64error.s
@@ -166,38 +166,6 @@
 	FSTPD	(R1, R2), (R0)                                   // ERROR "invalid register pair"
 	FMOVS	(F2), F0                                         // ERROR "illegal combination"
 	FMOVD	F0, (F1)                                         // ERROR "illegal combination"
-	LDADDD	R5, (R6), ZR                                     // ERROR "illegal destination register"
-	LDADDW	R5, (R6), ZR                                     // ERROR "illegal destination register"
-	LDADDH	R5, (R6), ZR                                     // ERROR "illegal destination register"
-	LDADDB	R5, (R6), ZR                                     // ERROR "illegal destination register"
-	LDADDLD	R5, (R6), ZR                                     // ERROR "illegal destination register"
-	LDADDLW	R5, (R6), ZR                                     // ERROR "illegal destination register"
-	LDADDLH	R5, (R6), ZR                                     // ERROR "illegal destination register"
-	LDADDLB	R5, (R6), ZR                                     // ERROR "illegal destination register"
-	LDCLRD	R5, (R6), ZR                                     // ERROR "illegal destination register"
-	LDCLRW	R5, (R6), ZR                                     // ERROR "illegal destination register"
-	LDCLRH	R5, (R6), ZR                                     // ERROR "illegal destination register"
-	LDCLRB	R5, (R6), ZR                                     // ERROR "illegal destination register"
-	LDCLRLD	R5, (R6), ZR                                     // ERROR "illegal destination register"
-	LDCLRLW	R5, (R6), ZR                                     // ERROR "illegal destination register"
-	LDCLRLH	R5, (R6), ZR                                     // ERROR "illegal destination register"
-	LDCLRLB	R5, (R6), ZR                                     // ERROR "illegal destination register"
-	LDEORD	R5, (R6), ZR                                     // ERROR "illegal destination register"
-	LDEORW	R5, (R6), ZR                                     // ERROR "illegal destination register"
-	LDEORH	R5, (R6), ZR                                     // ERROR "illegal destination register"
-	LDEORB	R5, (R6), ZR                                     // ERROR "illegal destination register"
-	LDEORLD	R5, (R6), ZR                                     // ERROR "illegal destination register"
-	LDEORLW	R5, (R6), ZR                                     // ERROR "illegal destination register"
-	LDEORLH	R5, (R6), ZR                                     // ERROR "illegal destination register"
-	LDEORLB	R5, (R6), ZR                                     // ERROR "illegal destination register"
-	LDORD	R5, (R6), ZR                                     // ERROR "illegal destination register"
-	LDORW	R5, (R6), ZR                                     // ERROR "illegal destination register"
-	LDORH	R5, (R6), ZR                                     // ERROR "illegal destination register"
-	LDORB	R5, (R6), ZR                                     // ERROR "illegal destination register"
-	LDORLD	R5, (R6), ZR                                     // ERROR "illegal destination register"
-	LDORLW	R5, (R6), ZR                                     // ERROR "illegal destination register"
-	LDORLH	R5, (R6), ZR                                     // ERROR "illegal destination register"
-	LDORLB	R5, (R6), ZR                                     // ERROR "illegal destination register"
 	LDADDAD	R5, (R6), RSP                                    // ERROR "illegal destination register"
 	LDADDAW	R5, (R6), RSP                                    // ERROR "illegal destination register"
 	LDADDAH	R5, (R6), RSP                                    // ERROR "illegal destination register"
@@ -442,4 +410,15 @@
 	DC	VAE1IS                                           // ERROR "illegal argument"
 	DC	VAE1IS, R0                                       // ERROR "illegal argument"
 	DC	IVAC                                             // ERROR "missing register at operand 2"
+	AESD	V1.B8, V2.B8                                     // ERROR "invalid arrangement"
+	AESE	V1.D2, V2.D2                                     // ERROR "invalid arrangement"
+	AESIMC	V1.S4, V2.S4                                     // ERROR "invalid arrangement"
+	SHA1SU1	V1.B16, V2.B16                                   // ERROR "invalid arrangement"
+	SHA256SU1	V1.B16, V2.B16, V3.B16                   // ERROR "invalid arrangement"
+	SHA512SU1	V1.S4, V2.S4, V3.S4                      // ERROR "invalid arrangement"
+	SHA256H	V1.D2, V2, V3                                    // ERROR "invalid arrangement"
+	SHA512H	V1.S4, V2, V3                                    // ERROR "invalid arrangement"
+	AESE	V1.B16, V2.B8                                    // ERROR "invalid arrangement"
+	SHA256SU1	V1.S4, V2.B16, V3.S4                     // ERROR "invalid arrangement"
+	SHA1H	V1.B16, V2.B16                                   // ERROR "invalid operands"
 	RET
diff --git a/src/cmd/asm/internal/asm/testdata/loong64.s b/src/cmd/asm/internal/asm/testdata/loong64.s
index 133cf48..51b195b 100644
--- a/src/cmd/asm/internal/asm/testdata/loong64.s
+++ b/src/cmd/asm/internal/asm/testdata/loong64.s
@@ -6,6 +6,7 @@
 // TODO: cover more instruction
 
 TEXT foo(SB),DUPOK|NOSPLIT,$0
-	JAL	1(PC)	//CALL 1(PC)	//000c0054
+	JAL	1(PC)	//CALL 1(PC)	//00040054
 	JAL	(R4)	//CALL (R4)	//8100004c
-	JAL	foo(SB)	//CALL foo(SB)	//00100054
+	// relocation in play so the assembled offset should be 0
+	JAL	foo(SB)	//CALL foo(SB)	//00000054
diff --git a/src/cmd/asm/internal/asm/testdata/loong64enc1.s b/src/cmd/asm/internal/asm/testdata/loong64enc1.s
index 83bb6ec..ea6c569 100644
--- a/src/cmd/asm/internal/asm/testdata/loong64enc1.s
+++ b/src/cmd/asm/internal/asm/testdata/loong64enc1.s
@@ -13,9 +13,11 @@
 	BFPF	1(PC)			// 00040048
 	BFPF	lable2	// BFPF 4 	// 1ffcff4b
 
-	JMP	foo(SB)			// 00100050
+	// relocation in play so the assembled offset should be 0
+	JMP	foo(SB)			// 00000050
+
 	JMP	(R4)			// 8000004c
-	JMP	1(PC)			// 00040058
+	JMP	1(PC)			// 00040050
 	MOVW	$65536, R4		// 04020014
 	MOVW	$4096, R4		// 24000014
 	MOVV	$65536, R4		// 04020014
@@ -114,7 +116,13 @@
 	ROTRV	$4, R4			// 84104d00
 	SYSCALL				// 00002b00
 	BEQ	R4, R5, 1(PC)		// 85040058
-	BEQ	R4, 1(PC)		// 80040058
+	BEQ	R4, 1(PC)		// 80040040
+	BEQ	R4, R0, 1(PC)		// 80040040
+	BEQ	R0, R4, 1(PC)		// 80040040
+	BNE	R4, R5, 1(PC)		// 8504005c
+	BNE	R4, 1(PC)		// 80040044
+	BNE	R4, R0, 1(PC)		// 80040044
+	BNE	R0, R4, 1(PC)		// 80040044
 	BLTU	R4, 1(PC)		// 80040068
 	MOVW	y+8(FP), F4		// 6440002b
 	MOVF	y+8(FP), F4		// 6440002b
@@ -218,3 +226,10 @@
 	CMPGEF	F4, R5			// a090130c
 	CMPGED	F4, R5			// a090230c
 	CMPEQD	F4, R5			// a010220c
+
+	RDTIMELW R4, R0			// 80600000
+	RDTIMEHW R4, R0			// 80640000
+	RDTIMED  R4, R5			// 85680000
+
+	MOVV    FCC0, R4		// 04dc1401
+	MOVV    R4, FCC0		// 80d81401
diff --git a/src/cmd/asm/internal/asm/testdata/loong64enc2.s b/src/cmd/asm/internal/asm/testdata/loong64enc2.s
index 3b5e3cb..0076836 100644
--- a/src/cmd/asm/internal/asm/testdata/loong64enc2.s
+++ b/src/cmd/asm/internal/asm/testdata/loong64enc2.s
@@ -61,22 +61,22 @@
 	XOR	$-1, R4			// 1efcbf0284f81500
 	MOVH	R4, R5			// 85c04000a5c04800
 
-	// relocation	instructions
-	MOVW	R4, name(SB)		// 1e00001cc4038029
-	MOVWU	R4, name(SB)		// 1e00001cc4038029
-	MOVV	R4, name(SB)		// 1e00001cc403c029
-	MOVB	R4, name(SB)		// 1e00001cc4030029
-	MOVBU	R4, name(SB)		// 1e00001cc4030029
-	MOVF	F4, name(SB)		// 1e00001cc403402b
-	MOVD	F4, name(SB)		// 1e00001cc403c02b
-	MOVW	name(SB), R4		// 1e00001cc4038028
-	MOVWU	name(SB), R4		// 1e00001cc403802a
-	MOVV	name(SB), R4		// 1e00001cc403c028
-	MOVB	name(SB), R4		// 1e00001cc4030028
-	MOVBU	name(SB), R4		// 1e00001cc403002a
-	MOVF	name(SB), F4		// 1e00001cc403002b
-	MOVD	name(SB), F4		// 1e00001cc403802b
-	MOVH	R4, name(SB)		// 1e00001cc4034029
-	MOVH	name(SB), R4		// 1e00001cc4034028
-	MOVHU	R4, name(SB)		// 1e00001cc4034029
-	MOVHU	name(SB), R4		// 1e00001cc403402a
+	// relocation instructions
+	MOVW	R4, name(SB)		// 1e00001ac4038029
+	MOVWU	R4, name(SB)		// 1e00001ac4038029
+	MOVV	R4, name(SB)		// 1e00001ac403c029
+	MOVB	R4, name(SB)		// 1e00001ac4030029
+	MOVBU	R4, name(SB)		// 1e00001ac4030029
+	MOVF	F4, name(SB)		// 1e00001ac403402b
+	MOVD	F4, name(SB)		// 1e00001ac403c02b
+	MOVW	name(SB), R4		// 1e00001ac4038028
+	MOVWU	name(SB), R4		// 1e00001ac403802a
+	MOVV	name(SB), R4		// 1e00001ac403c028
+	MOVB	name(SB), R4		// 1e00001ac4030028
+	MOVBU	name(SB), R4		// 1e00001ac403002a
+	MOVF	name(SB), F4		// 1e00001ac403002b
+	MOVD	name(SB), F4		// 1e00001ac403802b
+	MOVH	R4, name(SB)		// 1e00001ac4034029
+	MOVH	name(SB), R4		// 1e00001ac4034028
+	MOVHU	R4, name(SB)		// 1e00001ac4034029
+	MOVHU	name(SB), R4		// 1e00001ac403402a
diff --git a/src/cmd/asm/internal/asm/testdata/ppc64.s b/src/cmd/asm/internal/asm/testdata/ppc64.s
index 367d7b7..a0f1276 100644
--- a/src/cmd/asm/internal/asm/testdata/ppc64.s
+++ b/src/cmd/asm/internal/asm/testdata/ppc64.s
@@ -20,19 +20,19 @@
 	MOVD $65536, R6                 // 64060001
 	MOVD $-32767, R5                // 38a08001
 	MOVD $-32768, R6                // 38c08000
-	MOVD $1234567, R5               // 6405001260a5d687
+	MOVD $1234567, R5               // 6405001260a5d687 or 0600001238a0d687
 	MOVW $1, R3                     // 38600001
 	MOVW $-1, R4                    // 3880ffff
 	MOVW $65535, R5                 // 6005ffff
 	MOVW $65536, R6                 // 64060001
 	MOVW $-32767, R5                // 38a08001
 	MOVW $-32768, R6                // 38c08000
-	MOVW $1234567, R5               // 6405001260a5d687
+	MOVW $1234567, R5               // 6405001260a5d687 or 0600001238a0d687
 	// Hex constant 0x80000001
-	MOVW $2147483649, R5            // 6405800060a50001
-	MOVD $2147483649, R5            // 6405800060a50001
+	MOVW $2147483649, R5            // 6405800060a50001 or 0600800038a00001
+	MOVD $2147483649, R5            // 6405800060a50001 or 0600800038a00001
 	// Hex constant 0xFFFFFFFF80000001
-	MOVD $-2147483647, R5    	// 3ca0800060a50001
+	MOVD $-2147483647, R5    	// 3ca0800060a50001 or 0603800038a00001
 	MOVD 8(R3), R4                  // e8830008
 	MOVD (R3)(R4), R5               // 7ca4182a
 	MOVD (R3)(R0), R5               // 7ca0182a
@@ -71,8 +71,8 @@
 	MOVHBR (R3)(R4), R5             // 7ca41e2c
 	MOVHBR (R3)(R0), R5             // 7ca01e2c
 	MOVHBR (R3), R5                 // 7ca01e2c
-	MOVD $foo+4009806848(FP), R5    // 3ca1ef0138a5cc40
-	MOVD $foo(SB), R5               // 3ca0000038a50000
+	MOVD $foo+4009806848(FP), R5    // 3ca1ef0138a5cc40 or 0600ef0038a1cc40
+	MOVD $foo(SB), R5               // 3ca0000038a50000 or 0610000038a00000
 
 	MOVDU 8(R3), R4                 // e8830009
 	MOVDU (R3)(R4), R5              // 7ca4186a
@@ -156,16 +156,21 @@
 	ADD $1, R3, R4                  // 38830001
 	ADD $-1, R4                     // 3884ffff
 	ADD $-1, R4, R5                 // 38a4ffff
-	ADD $65535, R5                  // 601fffff7cbf2a14
-	ADD $65535, R5, R6              // 601fffff7cdf2a14
+	ADD $65535, R5                  // 601fffff7cbf2a14 or 0600000038a5ffff
+	ADD $65535, R5, R6              // 601fffff7cdf2a14 or 0600000038c5ffff
 	ADD $65536, R6                  // 3cc60001
 	ADD $65536, R6, R7              // 3ce60001
 	ADD $-32767, R5                 // 38a58001
 	ADD $-32767, R5, R4             // 38858001
 	ADD $-32768, R6                 // 38c68000
 	ADD $-32768, R6, R5             // 38a68000
-	ADD $1234567, R5                // 641f001263ffd6877cbf2a14
-	ADD $1234567, R5, R6            // 641f001263ffd6877cdf2a14
+
+	//TODO: this compiles to add r5,r6,r0. It should be addi r5,r6,0.
+	//      this is OK since r0 == $0, but the latter is preferred.
+	ADD $0, R6, R5             	// 7ca60214
+
+	ADD $1234567, R5                // 641f001263ffd6877cbf2a14 or 0600001238a5d687
+	ADD $1234567, R5, R6            // 641f001263ffd6877cdf2a14 or 0600001238c5d687
 	ADDEX R3, R5, $3, R6            // 7cc32f54
 	ADDEX R3, $3, R5, R6            // 7cc32f54
 	ADDIS $8, R3                    // 3c630008
@@ -1082,4 +1087,8 @@
 	MOVD 4(R1), XER                 // ebe100047fe103a6
 	PNOP                            // 0700000000000000
 
+	SETB CR1,R3                     // 7c640100
+	VCLZLSBB V1, R2			// 10400e02
+	VCTZLSBB V1, R2			// 10410e02
+
 	RET
diff --git a/src/cmd/asm/internal/asm/testdata/ppc64_p10.s b/src/cmd/asm/internal/asm/testdata/ppc64_p10.s
index c0a22aa..4419aa0 100644
--- a/src/cmd/asm/internal/asm/testdata/ppc64_p10.s
+++ b/src/cmd/asm/internal/asm/testdata/ppc64_p10.s
@@ -270,4 +270,4 @@
 	HASHCHK -8(R1), R2                      // 7fe115e5
 	HASHCHKP -8(R1), R2                     // 7fe11565
 
-        RET
+	RET
diff --git a/src/cmd/asm/internal/asm/testdata/riscv64.s b/src/cmd/asm/internal/asm/testdata/riscv64.s
index 79d6054..5353832 100644
--- a/src/cmd/asm/internal/asm/testdata/riscv64.s
+++ b/src/cmd/asm/internal/asm/testdata/riscv64.s
@@ -183,28 +183,28 @@
 	// 8.2: Load-Reserved/Store-Conditional
 	LRW	(X5), X6				// 2fa30214
 	LRD	(X5), X6				// 2fb30214
-	SCW	X5, (X6), X7				// af23531c
-	SCD	X5, (X6), X7				// af33531c
+	SCW	X5, (X6), X7				// af23531a
+	SCD	X5, (X6), X7				// af33531a
 
 	// 8.3: Atomic Memory Operations
-	AMOSWAPW	X5, (X6), X7			// af23530c
-	AMOSWAPD	X5, (X6), X7			// af33530c
-	AMOADDW		X5, (X6), X7			// af235304
-	AMOADDD		X5, (X6), X7			// af335304
-	AMOANDW		X5, (X6), X7			// af235364
-	AMOANDD		X5, (X6), X7			// af335364
-	AMOORW		X5, (X6), X7			// af235344
-	AMOORD		X5, (X6), X7			// af335344
-	AMOXORW		X5, (X6), X7			// af235324
-	AMOXORD		X5, (X6), X7			// af335324
-	AMOMAXW		X5, (X6), X7			// af2353a4
-	AMOMAXD		X5, (X6), X7			// af3353a4
-	AMOMAXUW	X5, (X6), X7			// af2353e4
-	AMOMAXUD	X5, (X6), X7			// af3353e4
-	AMOMINW		X5, (X6), X7			// af235384
-	AMOMIND		X5, (X6), X7			// af335384
-	AMOMINUW	X5, (X6), X7			// af2353c4
-	AMOMINUD	X5, (X6), X7			// af3353c4
+	AMOSWAPW	X5, (X6), X7			// af23530e
+	AMOSWAPD	X5, (X6), X7			// af33530e
+	AMOADDW		X5, (X6), X7			// af235306
+	AMOADDD		X5, (X6), X7			// af335306
+	AMOANDW		X5, (X6), X7			// af235366
+	AMOANDD		X5, (X6), X7			// af335366
+	AMOORW		X5, (X6), X7			// af235346
+	AMOORD		X5, (X6), X7			// af335346
+	AMOXORW		X5, (X6), X7			// af235326
+	AMOXORD		X5, (X6), X7			// af335326
+	AMOMAXW		X5, (X6), X7			// af2353a6
+	AMOMAXD		X5, (X6), X7			// af3353a6
+	AMOMAXUW	X5, (X6), X7			// af2353e6
+	AMOMAXUD	X5, (X6), X7			// af3353e6
+	AMOMINW		X5, (X6), X7			// af235386
+	AMOMIND		X5, (X6), X7			// af335386
+	AMOMINUW	X5, (X6), X7			// af2353c6
+	AMOMINUD	X5, (X6), X7			// af3353c6
 
 	// 10.1: Base Counters and Timers
 	RDCYCLE		X5				// f32200c0
@@ -318,7 +318,9 @@
 	MOV	$-2147483647, X5			// b70200809b821200
 
 	// Converted to load of symbol (AUIPC + LD)
-	MOV	$4294967296, X5				// 9702000083b20200
+	MOV	$4294967295, X5				// 9702000083b20200
+	// Converted to MOV $1, X5 + SLLI $32, X5
+	MOV	$4294967296, X5				// 9302100093920202
 
 	MOV	(X5), X6				// 03b30200
 	MOV	4(X5), X6				// 03b34200
diff --git a/src/cmd/asm/internal/asm/testdata/riscv64error.s b/src/cmd/asm/internal/asm/testdata/riscv64error.s
index d3e43e7..cdb8a02 100644
--- a/src/cmd/asm/internal/asm/testdata/riscv64error.s
+++ b/src/cmd/asm/internal/asm/testdata/riscv64error.s
@@ -26,5 +26,17 @@
 	MOVD	F0, F1, F2			// ERROR "illegal MOV instruction"
 	MOV	X10, X11, X12			// ERROR "illegal MOV instruction"
 	MOVW	X10, X11, X12			// ERROR "illegal MOV instruction"
+	SLLI	$64, X5, X6			// ERROR "shift amount out of range 0 to 63"
+	SRLI	$64, X5, X6			// ERROR "shift amount out of range 0 to 63"
+	SRAI	$64, X5, X6			// ERROR "shift amount out of range 0 to 63"
+	SLLI	$-1, X5, X6			// ERROR "shift amount out of range 0 to 63"
+	SRLI	$-1, X5, X6			// ERROR "shift amount out of range 0 to 63"
+	SRAI	$-1, X5, X6			// ERROR "shift amount out of range 0 to 63"
+	SLLIW	$32, X5, X6			// ERROR "shift amount out of range 0 to 31"
+	SRLIW	$32, X5, X6			// ERROR "shift amount out of range 0 to 31"
+	SRAIW	$32, X5, X6			// ERROR "shift amount out of range 0 to 31"
+	SLLIW	$-1, X5, X6			// ERROR "shift amount out of range 0 to 31"
+	SRLIW	$-1, X5, X6			// ERROR "shift amount out of range 0 to 31"
+	SRAIW	$-1, X5, X6			// ERROR "shift amount out of range 0 to 31"
 
 	RET
diff --git a/src/cmd/asm/internal/asm/testdata/s390x.s b/src/cmd/asm/internal/asm/testdata/s390x.s
index 7c5d26b..78ccb96 100644
--- a/src/cmd/asm/internal/asm/testdata/s390x.s
+++ b/src/cmd/asm/internal/asm/testdata/s390x.s
@@ -410,6 +410,7 @@
 	TCDB	F15, $4095             // edf00fff0011
 
 	UNDEF                          // 00000000
+	BRRK			       // 0001
 	NOPH                           // 0700
 
 	SYNC                           // 07e0
diff --git a/src/cmd/asm/internal/lex/slice.go b/src/cmd/asm/internal/lex/slice.go
index 8ee0c70..61b15dd 100644
--- a/src/cmd/asm/internal/lex/slice.go
+++ b/src/cmd/asm/internal/lex/slice.go
@@ -65,7 +65,7 @@
 	//	#define A #define B(x) x
 	// and
 	//	#define A #define B (x) x
-	// The first has definition of B has an argument, the second doesn't. Because we let
+	// The first definition of B has an argument, the second doesn't. Because we let
 	// text/scanner strip the blanks for us, this is extremely rare, hard to fix, and not worth it.
 	return s.pos
 }
diff --git a/src/cmd/cgo/ast.go b/src/cmd/cgo/ast.go
index 81060c6..3cbbeaf 100644
--- a/src/cmd/cgo/ast.go
+++ b/src/cmd/cgo/ast.go
@@ -9,6 +9,7 @@
 import (
 	"fmt"
 	"go/ast"
+	"go/format"
 	"go/parser"
 	"go/scanner"
 	"go/token"
@@ -62,29 +63,53 @@
 	// 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 || s.Path.Value != `"C"` {
-				continue
+		switch decl := decl.(type) {
+		case *ast.GenDecl:
+			for _, spec := range decl.Specs {
+				s, ok := spec.(*ast.ImportSpec)
+				if !ok || 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(decl.Specs) == 1 {
+					cg = decl.Doc
+				}
+				if cg != nil {
+					if strings.ContainsAny(abspath, "\r\n") {
+						// This should have been checked when the file path was first resolved,
+						// but we double check here just to be sure.
+						fatalf("internal error: ParseGo: abspath contains unexpected newline character: %q", abspath)
+					}
+					f.Preamble += fmt.Sprintf("#line %d %q\n", sourceLine(cg), abspath)
+					f.Preamble += commentText(cg) + "\n"
+					f.Preamble += "#line 1 \"cgo-generated-wrapper\"\n"
+				}
 			}
-			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), abspath)
-				f.Preamble += commentText(cg) + "\n"
-				f.Preamble += "#line 1 \"cgo-generated-wrapper\"\n"
+
+		case *ast.FuncDecl:
+			// Also, reject attempts to declare methods on C.T or *C.T.
+			// (The generated code would otherwise accept this
+			// invalid input; see issue #57926.)
+			if decl.Recv != nil && len(decl.Recv.List) > 0 {
+				recvType := decl.Recv.List[0].Type
+				if recvType != nil {
+					t := recvType
+					if star, ok := unparen(t).(*ast.StarExpr); ok {
+						t = star.X
+					}
+					if sel, ok := unparen(t).(*ast.SelectorExpr); ok {
+						var buf strings.Builder
+						format.Node(&buf, fset, recvType)
+						error_(sel.Pos(), `cannot define new methods on non-local type %s`, &buf)
+					}
+				}
 			}
 		}
+
 	}
 	if !sawC {
 		error_(ast1.Package, `cannot find import "C"`)
@@ -542,3 +567,11 @@
 		}
 	}
 }
+
+// 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
+}
diff --git a/src/cmd/cgo/doc.go b/src/cmd/cgo/doc.go
index 70685c7..b1a288f 100644
--- a/src/cmd/cgo/doc.go
+++ b/src/cmd/cgo/doc.go
@@ -26,7 +26,7 @@
 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
+See $GOROOT/cmd/cgo/internal/teststdio 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.
 
@@ -350,31 +350,52 @@
 about Go pointers applies not just to pointer types, but also to other
 types that include Go pointers.
 
-Go code may pass a Go pointer to C provided the Go memory to which it
-points does not contain any Go pointers. The C code must preserve
-this property: it must not store any Go pointers in Go memory, even
-temporarily. When passing a pointer to a field in a struct, the Go
-memory in question is the memory occupied by the field, not the entire
-struct. When passing a pointer to an element in an array or slice,
-the Go memory in question is the entire array or the entire backing
-array of the slice.
+All Go pointers passed to C must point to pinned Go memory. Go pointers
+passed as function arguments to C functions have the memory they point to
+implicitly pinned for the duration of the call. Go memory reachable from
+these function arguments must be pinned as long as the C code has access
+to it. Whether Go memory is pinned is a dynamic property of that memory
+region; it has nothing to do with the type of the pointer.
 
-C code may not keep a copy of a Go pointer after the call returns.
-This includes the _GoString_ type, which, as noted above, includes a
-Go pointer; _GoString_ values may not be retained by C code.
+Go values created by calling new, by taking the address of a composite
+literal, or by taking the address of a local variable may also have their
+memory pinned using [runtime.Pinner]. This type may be used to manage
+the duration of the memory's pinned status, potentially beyond the
+duration of a C function call. Memory may be pinned more than once and
+must be unpinned exactly the same number of times it has been pinned.
 
-A Go function called by C code may not return a Go pointer (which
-implies that it may not return a string, slice, channel, and so
-forth). A Go function called by C code may take C pointers as
-arguments, and it may store non-pointer or C pointer data through
-those pointers, but it may not store a Go pointer in memory pointed to
-by a C pointer. A Go function called by C code may take a Go pointer
-as an argument, but it must preserve the property that the Go memory
-to which it points does not contain any Go pointers.
+Go code may pass a Go pointer to C provided the memory to which it
+points does not contain any Go pointers to memory that is unpinned. When
+passing a pointer to a field in a struct, the Go memory in question is
+the memory occupied by the field, not the entire struct. When passing a
+pointer to an element in an array or slice, the Go memory in question is
+the entire array or the entire backing array of the slice.
 
-Go code may not store a Go pointer in C memory. C code may store Go
-pointers in C memory, subject to the rule above: it must stop storing
-the Go pointer when the C function returns.
+C code may keep a copy of a Go pointer only as long as the memory it
+points to is pinned.
+
+C code may not keep a copy of a Go pointer after the call returns,
+unless the memory it points to is pinned with [runtime.Pinner] and the
+Pinner is not unpinned while the Go pointer is stored in C memory.
+This implies that C code may not keep a copy of a string, slice,
+channel, and so forth, because they cannot be pinned with
+[runtime.Pinner].
+
+The _GoString_ type also may not be pinned with [runtime.Pinner].
+Because it includes a Go pointer, the memory it points to is only pinned
+for the duration of the call; _GoString_ values may not be retained by C
+code.
+
+A Go function called by C code may return a Go pointer to pinned memory
+(which implies that it may not return a string, slice, channel, and so
+forth). A Go function called by C code may take C pointers as arguments,
+and it may store non-pointer data, C pointers, or Go pointers to pinned
+memory through those pointers. It may not store a Go pointer to unpinned
+memory in memory pointed to by a C pointer (which again, implies that it
+may not store a string, slice, channel, and so forth). A Go function
+called by C code may take a Go pointer but it must preserve the property
+that the Go memory to which it points (and the Go memory to which that
+memory points, and so on) is pinned.
 
 These rules are checked dynamically at runtime. The checking is
 controlled by the cgocheck setting of the GODEBUG environment
diff --git a/src/cmd/cgo/gcc.go b/src/cmd/cgo/gcc.go
index 5df4a8c..7ae6fbc 100644
--- a/src/cmd/cgo/gcc.go
+++ b/src/cmd/cgo/gcc.go
@@ -938,7 +938,7 @@
 		// constants to the parameter type, to avoid a type mismatch.
 		ptype := p.rewriteUnsafe(param.Go)
 
-		if !p.needsPointerCheck(f, param.Go, args[i]) || param.BadPointer {
+		if !p.needsPointerCheck(f, param.Go, args[i]) || param.BadPointer || p.checkUnsafeStringData(args[i]) {
 			if ptype != param.Go {
 				needsUnsafe = true
 			}
@@ -957,6 +957,11 @@
 			continue
 		}
 
+		// Check for a[:].
+		if p.checkSlice(&sb, &sbCheck, arg, i) {
+			continue
+		}
+
 		fmt.Fprintf(&sb, "_cgo%d := %s; ", i, gofmtPos(arg, origArg.Pos()))
 		fmt.Fprintf(&sbCheck, "_cgoCheckPointer(_cgo%d, nil); ", i)
 	}
@@ -1178,7 +1183,10 @@
 	x := arg
 	for {
 		c, ok := x.(*ast.CallExpr)
-		if !ok || len(c.Args) != 1 || !p.isType(c.Fun) {
+		if !ok || len(c.Args) != 1 {
+			break
+		}
+		if !p.isType(c.Fun) && !p.isUnsafeData(c.Fun, false) {
 			break
 		}
 		x = c.Args[0]
@@ -1232,7 +1240,10 @@
 	px := &arg
 	for {
 		c, ok := (*px).(*ast.CallExpr)
-		if !ok || len(c.Args) != 1 || !p.isType(c.Fun) {
+		if !ok || len(c.Args) != 1 {
+			break
+		}
+		if !p.isType(c.Fun) && !p.isUnsafeData(c.Fun, false) {
 			break
 		}
 		px = &c.Args[0]
@@ -1255,6 +1266,71 @@
 	return true
 }
 
+// checkSlice checks whether arg has the form x[i:j], possibly inside
+// type conversions. If so, it writes
+//
+//	_cgoSliceNN := x[i:j]
+//	_cgoNN := _cgoSliceNN // with type conversions, if any
+//
+// to sb, and writes
+//
+//	_cgoCheckPointer(_cgoSliceNN, true)
+//
+// to sbCheck, and returns true. This tells _cgoCheckPointer to check
+// just the contents of the slice being passed, not any other part
+// of the memory allocation.
+func (p *Package) checkSlice(sb, sbCheck *bytes.Buffer, arg ast.Expr, i int) bool {
+	// Strip type conversions.
+	px := &arg
+	for {
+		c, ok := (*px).(*ast.CallExpr)
+		if !ok || len(c.Args) != 1 {
+			break
+		}
+		if !p.isType(c.Fun) && !p.isUnsafeData(c.Fun, false) {
+			break
+		}
+		px = &c.Args[0]
+	}
+	if _, ok := (*px).(*ast.SliceExpr); !ok {
+		return false
+	}
+
+	fmt.Fprintf(sb, "_cgoSlice%d := %s; ", i, gofmtPos(*px, (*px).Pos()))
+
+	origX := *px
+	*px = ast.NewIdent(fmt.Sprintf("_cgoSlice%d", i))
+	fmt.Fprintf(sb, "_cgo%d := %s; ", i, gofmtPos(arg, arg.Pos()))
+	*px = origX
+
+	// Use 0 == 0 to do the right thing in the unlikely event
+	// that "true" is shadowed.
+	fmt.Fprintf(sbCheck, "_cgoCheckPointer(_cgoSlice%d, 0 == 0); ", i)
+
+	return true
+}
+
+// checkUnsafeStringData checks for a call to unsafe.StringData.
+// The result of that call can't contain a pointer so there is
+// no need to call _cgoCheckPointer.
+func (p *Package) checkUnsafeStringData(arg ast.Expr) bool {
+	x := arg
+	for {
+		c, ok := x.(*ast.CallExpr)
+		if !ok || len(c.Args) != 1 {
+			break
+		}
+		if p.isUnsafeData(c.Fun, true) {
+			return true
+		}
+		if !p.isType(c.Fun) {
+			break
+		}
+		x = c.Args[0]
+	}
+	return false
+}
+
 // isType reports whether the expression is definitely a type.
 // This is conservative--it returns false for an unknown identifier.
 func (p *Package) isType(t ast.Expr) bool {
@@ -1299,6 +1375,28 @@
 	return false
 }
 
+// isUnsafeData reports whether the expression is unsafe.StringData
+// or unsafe.SliceData. We can ignore these when checking for pointers
+// because they don't change whether or not their argument contains
+// any Go pointers. If onlyStringData is true we only check for StringData.
+func (p *Package) isUnsafeData(x ast.Expr, onlyStringData bool) bool {
+	st, ok := x.(*ast.SelectorExpr)
+	if !ok {
+		return false
+	}
+	id, ok := st.X.(*ast.Ident)
+	if !ok {
+		return false
+	}
+	if id.Name != "unsafe" {
+		return false
+	}
+	if !onlyStringData && st.Sel.Name == "SliceData" {
+		return true
+	}
+	return st.Sel.Name == "StringData"
+}
+
 // isVariable reports whether x is a variable, possibly with field references.
 func (p *Package) isVariable(x ast.Expr) bool {
 	switch x := x.(type) {
@@ -3227,7 +3325,7 @@
 	return false
 }
 
-// badStructPointerTypedef is like badVoidPointerTypedefs but for structs.
+// badStructPointerTypedef is like badVoidPointerTypedef but for structs.
 func (c *typeConv) badStructPointerTypedef(name string, dt *dwarf.StructType) bool {
 	// Windows handle types can all potentially contain non-pointers.
 	// badVoidPointerTypedef handles the "void *" HANDLE type, but other
diff --git a/src/cmd/cgo/internal/cgotest/overlaydir.go b/src/cmd/cgo/internal/cgotest/overlaydir.go
new file mode 100644
index 0000000..c6b1615
--- /dev/null
+++ b/src/cmd/cgo/internal/cgotest/overlaydir.go
@@ -0,0 +1,75 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package cgotest
+
+import (
+	"io"
+	"os"
+	"path/filepath"
+	"strings"
+)
+
+// OverlayDir makes a minimal-overhead copy of srcRoot in which new files may be added.
+func OverlayDir(dstRoot, srcRoot string) error {
+	dstRoot = filepath.Clean(dstRoot)
+	if err := os.MkdirAll(dstRoot, 0777); err != nil {
+		return err
+	}
+
+	srcRoot, err := filepath.Abs(srcRoot)
+	if err != nil {
+		return err
+	}
+
+	return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error {
+		if err != nil || srcPath == srcRoot {
+			return err
+		}
+
+		suffix := strings.TrimPrefix(srcPath, srcRoot)
+		for len(suffix) > 0 && suffix[0] == filepath.Separator {
+			suffix = suffix[1:]
+		}
+		dstPath := filepath.Join(dstRoot, suffix)
+
+		perm := info.Mode() & os.ModePerm
+		if info.Mode()&os.ModeSymlink != 0 {
+			info, err = os.Stat(srcPath)
+			if err != nil {
+				return err
+			}
+			perm = info.Mode() & os.ModePerm
+		}
+
+		// Always copy directories (don't symlink them).
+		// If we add a file in the overlay, we don't want to add it in the original.
+		if info.IsDir() {
+			return os.MkdirAll(dstPath, perm|0200)
+		}
+
+		// If the OS supports symlinks, use them instead of copying bytes.
+		if err := os.Symlink(srcPath, dstPath); err == nil {
+			return nil
+		}
+
+		// Otherwise, copy the bytes.
+		src, err := os.Open(srcPath)
+		if err != nil {
+			return err
+		}
+		defer src.Close()
+
+		dst, err := os.OpenFile(dstPath, os.O_WRONLY|os.O_CREATE|os.O_EXCL, perm)
+		if err != nil {
+			return err
+		}
+
+		_, err = io.Copy(dst, src)
+		if closeErr := dst.Close(); err == nil {
+			err = closeErr
+		}
+		return err
+	})
+}
diff --git a/src/cmd/cgo/internal/swig/swig_test.go b/src/cmd/cgo/internal/swig/swig_test.go
new file mode 100644
index 0000000..4156313
--- /dev/null
+++ b/src/cmd/cgo/internal/swig/swig_test.go
@@ -0,0 +1,153 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package swig
+
+import (
+	"cmd/internal/quoted"
+	"internal/testenv"
+	"os"
+	"os/exec"
+	"path/filepath"
+	"regexp"
+	"strconv"
+	"strings"
+	"sync"
+	"testing"
+)
+
+func TestStdio(t *testing.T) {
+	testenv.MustHaveCGO(t)
+	mustHaveSwig(t)
+	run(t, "testdata/stdio", false)
+}
+
+func TestCall(t *testing.T) {
+	testenv.MustHaveCGO(t)
+	mustHaveSwig(t)
+	mustHaveCxx(t)
+	run(t, "testdata/callback", false, "Call")
+	t.Run("lto", func(t *testing.T) { run(t, "testdata/callback", true, "Call") })
+}
+
+func TestCallback(t *testing.T) {
+	testenv.MustHaveCGO(t)
+	mustHaveSwig(t)
+	mustHaveCxx(t)
+	run(t, "testdata/callback", false, "Callback")
+	t.Run("lto", func(t *testing.T) { run(t, "testdata/callback", true, "Callback") })
+}
+
+func run(t *testing.T, dir string, lto bool, args ...string) {
+	runArgs := append([]string{"run", "."}, args...)
+	cmd := exec.Command("go", runArgs...)
+	cmd.Dir = dir
+	if lto {
+		const cflags = "-flto -Wno-lto-type-mismatch -Wno-unknown-warning-option"
+		cmd.Env = append(cmd.Environ(),
+			"CGO_CFLAGS="+cflags,
+			"CGO_CXXFLAGS="+cflags,
+			"CGO_LDFLAGS="+cflags)
+	}
+	out, err := cmd.CombinedOutput()
+	if string(out) != "OK\n" {
+		t.Errorf("%s", string(out))
+	}
+	if err != nil {
+		t.Errorf("%s", err)
+	}
+}
+
+func mustHaveCxx(t *testing.T) {
+	// Ask the go tool for the CXX it's configured to use.
+	cxx, err := exec.Command("go", "env", "CXX").CombinedOutput()
+	if err != nil {
+		t.Fatalf("go env CXX failed: %s", err)
+	}
+	args, err := quoted.Split(string(cxx))
+	if err != nil {
+		t.Skipf("could not parse 'go env CXX' output %q: %s", string(cxx), err)
+	}
+	if len(args) == 0 {
+		t.Skip("no C++ compiler")
+	}
+	testenv.MustHaveExecPath(t, string(args[0]))
+}
+
+var (
+	swigOnce sync.Once
+	haveSwig bool
+)
+
+func mustHaveSwig(t *testing.T) {
+	swigOnce.Do(func() {
+		mustHaveSwigOnce(t)
+		haveSwig = true
+	})
+	// The first call will skip t with a nice message. On later calls, we just skip.
+	if !haveSwig {
+		t.Skip("swig not found")
+	}
+}
+
+func mustHaveSwigOnce(t *testing.T) {
+	swig, err := exec.LookPath("swig")
+	if err != nil {
+		t.Skipf("swig not in PATH: %s", err)
+	}
+
+	// Check that swig was installed with Go support by checking
+	// that a go directory exists inside the swiglib directory.
+	// See https://golang.org/issue/23469.
+	output, err := exec.Command(swig, "-go", "-swiglib").Output()
+	if err != nil {
+		t.Skip("swig is missing Go support")
+	}
+	swigDir := strings.TrimSpace(string(output))
+
+	_, err = os.Stat(filepath.Join(swigDir, "go"))
+	if err != nil {
+		t.Skip("swig is missing Go support")
+	}
+
+	// Check that swig has a new enough version.
+	// See https://golang.org/issue/22858.
+	out, err := exec.Command(swig, "-version").CombinedOutput()
+	if err != nil {
+		t.Skipf("failed to get swig version:%s\n%s", err, string(out))
+	}
+
+	re := regexp.MustCompile(`[vV]ersion +(\d+)([.]\d+)?([.]\d+)?`)
+	matches := re.FindSubmatch(out)
+	if matches == nil {
+		// Can't find version number; hope for the best.
+		t.Logf("failed to find swig version, continuing")
+		return
+	}
+
+	var parseError error
+	atoi := func(s string) int {
+		x, err := strconv.Atoi(s)
+		if err != nil && parseError == nil {
+			parseError = err
+		}
+		return x
+	}
+	var major, minor, patch int
+	major = atoi(string(matches[1]))
+	if len(matches[2]) > 0 {
+		minor = atoi(string(matches[2][1:]))
+	}
+	if len(matches[3]) > 0 {
+		patch = atoi(string(matches[3][1:]))
+	}
+	if parseError != nil {
+		t.Logf("error parsing swig version %q, continuing anyway: %s", string(matches[0]), parseError)
+		return
+	}
+	t.Logf("found swig version %d.%d.%d", major, minor, patch)
+	if major < 3 || (major == 3 && minor == 0 && patch < 6) {
+		t.Skip("test requires swig 3.0.6 or later")
+	}
+}
diff --git a/src/cmd/cgo/internal/swig/testdata/callback/main.cc b/src/cmd/cgo/internal/swig/testdata/callback/main.cc
new file mode 100644
index 0000000..7de917c
--- /dev/null
+++ b/src/cmd/cgo/internal/swig/testdata/callback/main.cc
@@ -0,0 +1,15 @@
+// Copyright 2013 The Go 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 .cc file will be automatically compiled by the go tool and
+// included in the package.
+
+#include <string>
+#include "main.h"
+
+std::string Caller::call() {
+	if (callback_ != 0)
+		return callback_->run();
+	return "";
+}
diff --git a/src/cmd/cgo/internal/swig/testdata/callback/main.go b/src/cmd/cgo/internal/swig/testdata/callback/main.go
new file mode 100644
index 0000000..73034a0
--- /dev/null
+++ b/src/cmd/cgo/internal/swig/testdata/callback/main.go
@@ -0,0 +1,60 @@
+// 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"
+)
+
+func main() {
+	if len(os.Args) != 2 {
+		fatal("usage: callback testname")
+	}
+	switch os.Args[1] {
+	default:
+		fatal("unknown test %q", os.Args[1])
+	case "Call":
+		testCall()
+	case "Callback":
+		testCallback()
+	}
+	println("OK")
+}
+
+func fatal(f string, args ...any) {
+	fmt.Fprintln(os.Stderr, fmt.Sprintf(f, args...))
+	os.Exit(1)
+}
+
+type GoCallback struct{}
+
+func (p *GoCallback) Run() string {
+	return "GoCallback.Run"
+}
+
+func testCall() {
+	c := NewCaller()
+	cb := NewCallback()
+
+	c.SetCallback(cb)
+	s := c.Call()
+	if s != "Callback::run" {
+		fatal("unexpected string from Call: %q", s)
+	}
+	c.DelCallback()
+}
+
+func testCallback() {
+	c := NewCaller()
+	cb := NewDirectorCallback(&GoCallback{})
+	c.SetCallback(cb)
+	s := c.Call()
+	if s != "GoCallback.Run" {
+		fatal("unexpected string from Call with callback: %q", s)
+	}
+	c.DelCallback()
+	DeleteDirectorCallback(cb)
+}
diff --git a/misc/swig/callback/callback.h b/src/cmd/cgo/internal/swig/testdata/callback/main.h
similarity index 100%
rename from misc/swig/callback/callback.h
rename to src/cmd/cgo/internal/swig/testdata/callback/main.h
diff --git a/src/cmd/cgo/internal/swig/testdata/callback/main.swigcxx b/src/cmd/cgo/internal/swig/testdata/callback/main.swigcxx
new file mode 100644
index 0000000..0fd73d6
--- /dev/null
+++ b/src/cmd/cgo/internal/swig/testdata/callback/main.swigcxx
@@ -0,0 +1,18 @@
+/* Copyright 2011 The Go Authors. All rights reserved.
+   Use of this source code is governed by a BSD-style
+   license that can be found in the LICENSE file.  */
+
+/* An example of writing a C++ virtual function in Go.  */
+
+%module(directors="1") callback
+
+%{
+#include <string>
+#include "main.h"
+%}
+
+%include "std_string.i"
+
+%feature("director");
+
+%include "main.h"
diff --git a/src/cmd/cgo/internal/swig/testdata/stdio/main.go b/src/cmd/cgo/internal/swig/testdata/stdio/main.go
new file mode 100644
index 0000000..0296dd3
--- /dev/null
+++ b/src/cmd/cgo/internal/swig/testdata/stdio/main.go
@@ -0,0 +1,45 @@
+// Copyright 2017 The Go 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 here just to cause problems.
+// main.swig turns into a file also named main.go.
+// Make sure cmd/go keeps them separate
+// when both are passed to cgo.
+
+package main
+
+//int F(void) { return 1; }
+import "C"
+import (
+	"fmt"
+	"os"
+)
+
+func F() int { return int(C.F()) }
+
+func main() {
+	if x := int(C.F()); x != 1 {
+		fatal("x = %d, want 1", x)
+	}
+
+	// Open this file itself and verify that the first few characters are
+	// as expected.
+	f := Fopen("main.go", "r")
+	if f.Swigcptr() == 0 {
+		fatal("fopen failed")
+	}
+	if Fgetc(f) != '/' || Fgetc(f) != '/' || Fgetc(f) != ' ' || Fgetc(f) != 'C' {
+		fatal("read unexpected characters")
+	}
+	if Fclose(f) != 0 {
+		fatal("fclose failed")
+	}
+
+	println("OK")
+}
+
+func fatal(f string, args ...any) {
+	fmt.Fprintln(os.Stderr, fmt.Sprintf(f, args...))
+	os.Exit(1)
+}
diff --git a/misc/swig/stdio/file.swig b/src/cmd/cgo/internal/swig/testdata/stdio/main.swig
similarity index 100%
rename from misc/swig/stdio/file.swig
rename to src/cmd/cgo/internal/swig/testdata/stdio/main.swig
diff --git a/misc/cgo/test/backdoor.go b/src/cmd/cgo/internal/test/backdoor.go
similarity index 100%
rename from misc/cgo/test/backdoor.go
rename to src/cmd/cgo/internal/test/backdoor.go
diff --git a/misc/cgo/test/buildid_linux.go b/src/cmd/cgo/internal/test/buildid_linux.go
similarity index 100%
rename from misc/cgo/test/buildid_linux.go
rename to src/cmd/cgo/internal/test/buildid_linux.go
diff --git a/src/cmd/cgo/internal/test/callback.go b/src/cmd/cgo/internal/test/callback.go
new file mode 100644
index 0000000..478bf82
--- /dev/null
+++ b/src/cmd/cgo/internal/test/callback.go
@@ -0,0 +1,1782 @@
+// Copyright 2011 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package cgotest
+
+/*
+void callback(void *f);
+void callGoFoo(void);
+void callGoStackCheck(void);
+void callPanic(void);
+int callGoReturnVal(void);
+int returnAfterGrow(void);
+int returnAfterGrowFromGo(void);
+void callGoWithString(void);
+*/
+import "C"
+
+import (
+	"path"
+	"runtime"
+	"strings"
+	"sync"
+	"testing"
+	"unsafe"
+)
+
+// Pass a func value from nestedCall to goCallback using an integer token.
+var callbackMutex sync.Mutex
+var callbackToken int
+var callbackFuncs = make(map[int]func())
+
+// nestedCall calls into C, back into Go, and finally to f.
+func nestedCall(f func()) {
+	// callback(x) calls goCallback(x)
+	callbackMutex.Lock()
+	callbackToken++
+	i := callbackToken
+	callbackFuncs[i] = f
+	callbackMutex.Unlock()
+
+	// Pass the address of i because the C function was written to
+	// take a pointer.  We could pass an int if we felt like
+	// rewriting the C code.
+	C.callback(unsafe.Pointer(&i))
+
+	callbackMutex.Lock()
+	delete(callbackFuncs, i)
+	callbackMutex.Unlock()
+}
+
+//export goCallback
+func goCallback(p unsafe.Pointer) {
+	i := *(*int)(p)
+
+	callbackMutex.Lock()
+	f := callbackFuncs[i]
+	callbackMutex.Unlock()
+
+	if f == nil {
+		panic("missing callback function")
+	}
+	f()
+}
+
+func testCallback(t *testing.T) {
+	var x = false
+	nestedCall(func() { x = true })
+	if !x {
+		t.Fatal("nestedCall did not call func")
+	}
+}
+
+func testCallbackGC(t *testing.T) {
+	nestedCall(runtime.GC)
+}
+
+func testCallbackPanic(t *testing.T) {
+	// Make sure panic during callback unwinds properly.
+	if lockedOSThread() {
+		t.Fatal("locked OS thread on entry to TestCallbackPanic")
+	}
+	defer func() {
+		s := recover()
+		if s == nil {
+			t.Fatal("did not panic")
+		}
+		if s.(string) != "callback panic" {
+			t.Fatal("wrong panic:", s)
+		}
+		if lockedOSThread() {
+			t.Fatal("locked OS thread on exit from TestCallbackPanic")
+		}
+	}()
+	nestedCall(func() { panic("callback panic") })
+	panic("nestedCall returned")
+}
+
+func testCallbackPanicLoop(t *testing.T) {
+	// Make sure we don't blow out m->g0 stack.
+	for i := 0; i < 100000; i++ {
+		testCallbackPanic(t)
+	}
+}
+
+func testCallbackPanicLocked(t *testing.T) {
+	runtime.LockOSThread()
+	defer runtime.UnlockOSThread()
+
+	if !lockedOSThread() {
+		t.Fatal("runtime.LockOSThread didn't")
+	}
+	defer func() {
+		s := recover()
+		if s == nil {
+			t.Fatal("did not panic")
+		}
+		if s.(string) != "callback panic" {
+			t.Fatal("wrong panic:", s)
+		}
+		if !lockedOSThread() {
+			t.Fatal("lost lock on OS thread after panic")
+		}
+	}()
+	nestedCall(func() { panic("callback panic") })
+	panic("nestedCall returned")
+}
+
+// Callback with zero arguments used to make the stack misaligned,
+// which broke the garbage collector and other things.
+func testZeroArgCallback(t *testing.T) {
+	defer func() {
+		s := recover()
+		if s != nil {
+			t.Fatal("panic during callback:", s)
+		}
+	}()
+	C.callGoFoo()
+}
+
+//export goFoo
+func goFoo() {
+	x := 1
+	for i := 0; i < 10000; i++ {
+		// variadic call mallocs + writes to
+		variadic(x, x, x)
+		if x != 1 {
+			panic("bad x")
+		}
+	}
+}
+
+func variadic(x ...interface{}) {}
+
+func testBlocking(t *testing.T) {
+	c := make(chan int)
+	go func() {
+		for i := 0; i < 10; i++ {
+			c <- <-c
+		}
+	}()
+	nestedCall(func() {
+		for i := 0; i < 10; i++ {
+			c <- i
+			if j := <-c; j != i {
+				t.Errorf("out of sync %d != %d", j, i)
+			}
+		}
+	})
+}
+
+// Test that the stack can be unwound through a call out and call back
+// into Go.
+func testCallbackCallers(t *testing.T) {
+	if runtime.Compiler != "gc" {
+		// The exact function names are not going to be the same.
+		t.Skip("skipping for non-gc toolchain")
+	}
+	pc := make([]uintptr, 100)
+	n := 0
+	name := []string{
+		"runtime.cgocallbackg1",
+		"runtime.cgocallbackg",
+		"runtime.cgocallback",
+		"runtime.systemstack_switch",
+		"runtime.cgocall",
+		"test._Cfunc_callback",
+		"test.nestedCall.func1",
+		"test.nestedCall",
+		"test.testCallbackCallers",
+		"test.TestCallbackCallers",
+		"testing.tRunner",
+		"runtime.goexit",
+	}
+	nestedCall(func() {
+		n = runtime.Callers(4, pc)
+	})
+	if n != len(name) {
+		t.Errorf("expected %d frames, got %d", len(name), n)
+	}
+	for i := 0; i < n; i++ {
+		f := runtime.FuncForPC(pc[i] - 1) // TODO: use runtime.CallersFrames
+		if f == nil {
+			t.Fatalf("expected non-nil Func for pc %d", pc[i])
+		}
+		fname := f.Name()
+		// Remove the prepended pathname from automatically
+		// generated cgo function names.
+		if strings.HasPrefix(fname, "_") {
+			fname = path.Base(f.Name()[1:])
+		}
+		// In module mode, this package has a fully-qualified import path.
+		// Remove it if present.
+		fname = strings.TrimPrefix(fname, "cmd/cgo/internal/")
+
+		namei := ""
+		if i < len(name) {
+			namei = name[i]
+		}
+		if fname != namei {
+			t.Errorf("stk[%d] = %q, want %q", i, fname, namei)
+		}
+	}
+}
+
+func testPanicFromC(t *testing.T) {
+	defer func() {
+		r := recover()
+		if r == nil {
+			t.Fatal("did not panic")
+		}
+		if r.(string) != "panic from C" {
+			t.Fatal("wrong panic:", r)
+		}
+	}()
+	C.callPanic()
+}
+
+// Test that C code can return a value if it calls a Go function that
+// causes a stack copy.
+func testReturnAfterGrow(t *testing.T) {
+	// Use a new goroutine so that we get a small stack.
+	c := make(chan int)
+	go func() {
+		c <- int(C.returnAfterGrow())
+	}()
+	if got, want := <-c, 123456; got != want {
+		t.Errorf("got %d want %d", got, want)
+	}
+}
+
+// Test that we can return a value from Go->C->Go if the Go code
+// causes a stack copy.
+func testReturnAfterGrowFromGo(t *testing.T) {
+	// Use a new goroutine so that we get a small stack.
+	c := make(chan int)
+	go func() {
+		c <- int(C.returnAfterGrowFromGo())
+	}()
+	if got, want := <-c, 129*128/2; got != want {
+		t.Errorf("got %d want %d", got, want)
+	}
+}
+
+//export goReturnVal
+func goReturnVal() (r C.int) {
+	// Force a stack copy.
+	var f func(int) int
+	f = func(i int) int {
+		var buf [256]byte
+		use(buf[:])
+		if i == 0 {
+			return 0
+		}
+		return i + f(i-1)
+	}
+	r = C.int(f(128))
+	return
+}
+
+// Test that C can pass in a Go string from a string constant.
+func testCallGoWithString(t *testing.T) {
+	C.callGoWithString()
+	want := "string passed from C to Go"
+	if stringFromGo != want {
+		t.Errorf("string passed through C is %s, want %s", stringFromGo, want)
+	}
+}
+
+var stringFromGo string
+
+//export goWithString
+func goWithString(s string) {
+	stringFromGo = s
+}
+
+func testCallbackStack(t *testing.T) {
+	// Make cgo call and callback with different amount of stack available.
+	// We do not do any explicit checks, just ensure that it does not crash.
+	for _, f := range splitTests {
+		f()
+	}
+}
+
+//export goStackCheck
+func goStackCheck() {
+	// use some stack memory to trigger split stack check
+	var buf [256]byte
+	use(buf[:])
+}
+
+var Used byte
+
+func use(buf []byte) {
+	for _, c := range buf {
+		Used += c
+	}
+}
+
+var splitTests = []func(){
+	// Edit .+1,/^}/-1|seq 4 4 5000 | sed 's/.*/	stack&,/' | fmt
+	stack4, stack8, stack12, stack16, stack20, stack24, stack28,
+	stack32, stack36, stack40, stack44, stack48, stack52, stack56,
+	stack60, stack64, stack68, stack72, stack76, stack80, stack84,
+	stack88, stack92, stack96, stack100, stack104, stack108, stack112,
+	stack116, stack120, stack124, stack128, stack132, stack136,
+	stack140, stack144, stack148, stack152, stack156, stack160,
+	stack164, stack168, stack172, stack176, stack180, stack184,
+	stack188, stack192, stack196, stack200, stack204, stack208,
+	stack212, stack216, stack220, stack224, stack228, stack232,
+	stack236, stack240, stack244, stack248, stack252, stack256,
+	stack260, stack264, stack268, stack272, stack276, stack280,
+	stack284, stack288, stack292, stack296, stack300, stack304,
+	stack308, stack312, stack316, stack320, stack324, stack328,
+	stack332, stack336, stack340, stack344, stack348, stack352,
+	stack356, stack360, stack364, stack368, stack372, stack376,
+	stack380, stack384, stack388, stack392, stack396, stack400,
+	stack404, stack408, stack412, stack416, stack420, stack424,
+	stack428, stack432, stack436, stack440, stack444, stack448,
+	stack452, stack456, stack460, stack464, stack468, stack472,
+	stack476, stack480, stack484, stack488, stack492, stack496,
+	stack500, stack504, stack508, stack512, stack516, stack520,
+	stack524, stack528, stack532, stack536, stack540, stack544,
+	stack548, stack552, stack556, stack560, stack564, stack568,
+	stack572, stack576, stack580, stack584, stack588, stack592,
+	stack596, stack600, stack604, stack608, stack612, stack616,
+	stack620, stack624, stack628, stack632, stack636, stack640,
+	stack644, stack648, stack652, stack656, stack660, stack664,
+	stack668, stack672, stack676, stack680, stack684, stack688,
+	stack692, stack696, stack700, stack704, stack708, stack712,
+	stack716, stack720, stack724, stack728, stack732, stack736,
+	stack740, stack744, stack748, stack752, stack756, stack760,
+	stack764, stack768, stack772, stack776, stack780, stack784,
+	stack788, stack792, stack796, stack800, stack804, stack808,
+	stack812, stack816, stack820, stack824, stack828, stack832,
+	stack836, stack840, stack844, stack848, stack852, stack856,
+	stack860, stack864, stack868, stack872, stack876, stack880,
+	stack884, stack888, stack892, stack896, stack900, stack904,
+	stack908, stack912, stack916, stack920, stack924, stack928,
+	stack932, stack936, stack940, stack944, stack948, stack952,
+	stack956, stack960, stack964, stack968, stack972, stack976,
+	stack980, stack984, stack988, stack992, stack996, stack1000,
+	stack1004, stack1008, stack1012, stack1016, stack1020, stack1024,
+	stack1028, stack1032, stack1036, stack1040, stack1044, stack1048,
+	stack1052, stack1056, stack1060, stack1064, stack1068, stack1072,
+	stack1076, stack1080, stack1084, stack1088, stack1092, stack1096,
+	stack1100, stack1104, stack1108, stack1112, stack1116, stack1120,
+	stack1124, stack1128, stack1132, stack1136, stack1140, stack1144,
+	stack1148, stack1152, stack1156, stack1160, stack1164, stack1168,
+	stack1172, stack1176, stack1180, stack1184, stack1188, stack1192,
+	stack1196, stack1200, stack1204, stack1208, stack1212, stack1216,
+	stack1220, stack1224, stack1228, stack1232, stack1236, stack1240,
+	stack1244, stack1248, stack1252, stack1256, stack1260, stack1264,
+	stack1268, stack1272, stack1276, stack1280, stack1284, stack1288,
+	stack1292, stack1296, stack1300, stack1304, stack1308, stack1312,
+	stack1316, stack1320, stack1324, stack1328, stack1332, stack1336,
+	stack1340, stack1344, stack1348, stack1352, stack1356, stack1360,
+	stack1364, stack1368, stack1372, stack1376, stack1380, stack1384,
+	stack1388, stack1392, stack1396, stack1400, stack1404, stack1408,
+	stack1412, stack1416, stack1420, stack1424, stack1428, stack1432,
+	stack1436, stack1440, stack1444, stack1448, stack1452, stack1456,
+	stack1460, stack1464, stack1468, stack1472, stack1476, stack1480,
+	stack1484, stack1488, stack1492, stack1496, stack1500, stack1504,
+	stack1508, stack1512, stack1516, stack1520, stack1524, stack1528,
+	stack1532, stack1536, stack1540, stack1544, stack1548, stack1552,
+	stack1556, stack1560, stack1564, stack1568, stack1572, stack1576,
+	stack1580, stack1584, stack1588, stack1592, stack1596, stack1600,
+	stack1604, stack1608, stack1612, stack1616, stack1620, stack1624,
+	stack1628, stack1632, stack1636, stack1640, stack1644, stack1648,
+	stack1652, stack1656, stack1660, stack1664, stack1668, stack1672,
+	stack1676, stack1680, stack1684, stack1688, stack1692, stack1696,
+	stack1700, stack1704, stack1708, stack1712, stack1716, stack1720,
+	stack1724, stack1728, stack1732, stack1736, stack1740, stack1744,
+	stack1748, stack1752, stack1756, stack1760, stack1764, stack1768,
+	stack1772, stack1776, stack1780, stack1784, stack1788, stack1792,
+	stack1796, stack1800, stack1804, stack1808, stack1812, stack1816,
+	stack1820, stack1824, stack1828, stack1832, stack1836, stack1840,
+	stack1844, stack1848, stack1852, stack1856, stack1860, stack1864,
+	stack1868, stack1872, stack1876, stack1880, stack1884, stack1888,
+	stack1892, stack1896, stack1900, stack1904, stack1908, stack1912,
+	stack1916, stack1920, stack1924, stack1928, stack1932, stack1936,
+	stack1940, stack1944, stack1948, stack1952, stack1956, stack1960,
+	stack1964, stack1968, stack1972, stack1976, stack1980, stack1984,
+	stack1988, stack1992, stack1996, stack2000, stack2004, stack2008,
+	stack2012, stack2016, stack2020, stack2024, stack2028, stack2032,
+	stack2036, stack2040, stack2044, stack2048, stack2052, stack2056,
+	stack2060, stack2064, stack2068, stack2072, stack2076, stack2080,
+	stack2084, stack2088, stack2092, stack2096, stack2100, stack2104,
+	stack2108, stack2112, stack2116, stack2120, stack2124, stack2128,
+	stack2132, stack2136, stack2140, stack2144, stack2148, stack2152,
+	stack2156, stack2160, stack2164, stack2168, stack2172, stack2176,
+	stack2180, stack2184, stack2188, stack2192, stack2196, stack2200,
+	stack2204, stack2208, stack2212, stack2216, stack2220, stack2224,
+	stack2228, stack2232, stack2236, stack2240, stack2244, stack2248,
+	stack2252, stack2256, stack2260, stack2264, stack2268, stack2272,
+	stack2276, stack2280, stack2284, stack2288, stack2292, stack2296,
+	stack2300, stack2304, stack2308, stack2312, stack2316, stack2320,
+	stack2324, stack2328, stack2332, stack2336, stack2340, stack2344,
+	stack2348, stack2352, stack2356, stack2360, stack2364, stack2368,
+	stack2372, stack2376, stack2380, stack2384, stack2388, stack2392,
+	stack2396, stack2400, stack2404, stack2408, stack2412, stack2416,
+	stack2420, stack2424, stack2428, stack2432, stack2436, stack2440,
+	stack2444, stack2448, stack2452, stack2456, stack2460, stack2464,
+	stack2468, stack2472, stack2476, stack2480, stack2484, stack2488,
+	stack2492, stack2496, stack2500, stack2504, stack2508, stack2512,
+	stack2516, stack2520, stack2524, stack2528, stack2532, stack2536,
+	stack2540, stack2544, stack2548, stack2552, stack2556, stack2560,
+	stack2564, stack2568, stack2572, stack2576, stack2580, stack2584,
+	stack2588, stack2592, stack2596, stack2600, stack2604, stack2608,
+	stack2612, stack2616, stack2620, stack2624, stack2628, stack2632,
+	stack2636, stack2640, stack2644, stack2648, stack2652, stack2656,
+	stack2660, stack2664, stack2668, stack2672, stack2676, stack2680,
+	stack2684, stack2688, stack2692, stack2696, stack2700, stack2704,
+	stack2708, stack2712, stack2716, stack2720, stack2724, stack2728,
+	stack2732, stack2736, stack2740, stack2744, stack2748, stack2752,
+	stack2756, stack2760, stack2764, stack2768, stack2772, stack2776,
+	stack2780, stack2784, stack2788, stack2792, stack2796, stack2800,
+	stack2804, stack2808, stack2812, stack2816, stack2820, stack2824,
+	stack2828, stack2832, stack2836, stack2840, stack2844, stack2848,
+	stack2852, stack2856, stack2860, stack2864, stack2868, stack2872,
+	stack2876, stack2880, stack2884, stack2888, stack2892, stack2896,
+	stack2900, stack2904, stack2908, stack2912, stack2916, stack2920,
+	stack2924, stack2928, stack2932, stack2936, stack2940, stack2944,
+	stack2948, stack2952, stack2956, stack2960, stack2964, stack2968,
+	stack2972, stack2976, stack2980, stack2984, stack2988, stack2992,
+	stack2996, stack3000, stack3004, stack3008, stack3012, stack3016,
+	stack3020, stack3024, stack3028, stack3032, stack3036, stack3040,
+	stack3044, stack3048, stack3052, stack3056, stack3060, stack3064,
+	stack3068, stack3072, stack3076, stack3080, stack3084, stack3088,
+	stack3092, stack3096, stack3100, stack3104, stack3108, stack3112,
+	stack3116, stack3120, stack3124, stack3128, stack3132, stack3136,
+	stack3140, stack3144, stack3148, stack3152, stack3156, stack3160,
+	stack3164, stack3168, stack3172, stack3176, stack3180, stack3184,
+	stack3188, stack3192, stack3196, stack3200, stack3204, stack3208,
+	stack3212, stack3216, stack3220, stack3224, stack3228, stack3232,
+	stack3236, stack3240, stack3244, stack3248, stack3252, stack3256,
+	stack3260, stack3264, stack3268, stack3272, stack3276, stack3280,
+	stack3284, stack3288, stack3292, stack3296, stack3300, stack3304,
+	stack3308, stack3312, stack3316, stack3320, stack3324, stack3328,
+	stack3332, stack3336, stack3340, stack3344, stack3348, stack3352,
+	stack3356, stack3360, stack3364, stack3368, stack3372, stack3376,
+	stack3380, stack3384, stack3388, stack3392, stack3396, stack3400,
+	stack3404, stack3408, stack3412, stack3416, stack3420, stack3424,
+	stack3428, stack3432, stack3436, stack3440, stack3444, stack3448,
+	stack3452, stack3456, stack3460, stack3464, stack3468, stack3472,
+	stack3476, stack3480, stack3484, stack3488, stack3492, stack3496,
+	stack3500, stack3504, stack3508, stack3512, stack3516, stack3520,
+	stack3524, stack3528, stack3532, stack3536, stack3540, stack3544,
+	stack3548, stack3552, stack3556, stack3560, stack3564, stack3568,
+	stack3572, stack3576, stack3580, stack3584, stack3588, stack3592,
+	stack3596, stack3600, stack3604, stack3608, stack3612, stack3616,
+	stack3620, stack3624, stack3628, stack3632, stack3636, stack3640,
+	stack3644, stack3648, stack3652, stack3656, stack3660, stack3664,
+	stack3668, stack3672, stack3676, stack3680, stack3684, stack3688,
+	stack3692, stack3696, stack3700, stack3704, stack3708, stack3712,
+	stack3716, stack3720, stack3724, stack3728, stack3732, stack3736,
+	stack3740, stack3744, stack3748, stack3752, stack3756, stack3760,
+	stack3764, stack3768, stack3772, stack3776, stack3780, stack3784,
+	stack3788, stack3792, stack3796, stack3800, stack3804, stack3808,
+	stack3812, stack3816, stack3820, stack3824, stack3828, stack3832,
+	stack3836, stack3840, stack3844, stack3848, stack3852, stack3856,
+	stack3860, stack3864, stack3868, stack3872, stack3876, stack3880,
+	stack3884, stack3888, stack3892, stack3896, stack3900, stack3904,
+	stack3908, stack3912, stack3916, stack3920, stack3924, stack3928,
+	stack3932, stack3936, stack3940, stack3944, stack3948, stack3952,
+	stack3956, stack3960, stack3964, stack3968, stack3972, stack3976,
+	stack3980, stack3984, stack3988, stack3992, stack3996, stack4000,
+	stack4004, stack4008, stack4012, stack4016, stack4020, stack4024,
+	stack4028, stack4032, stack4036, stack4040, stack4044, stack4048,
+	stack4052, stack4056, stack4060, stack4064, stack4068, stack4072,
+	stack4076, stack4080, stack4084, stack4088, stack4092, stack4096,
+	stack4100, stack4104, stack4108, stack4112, stack4116, stack4120,
+	stack4124, stack4128, stack4132, stack4136, stack4140, stack4144,
+	stack4148, stack4152, stack4156, stack4160, stack4164, stack4168,
+	stack4172, stack4176, stack4180, stack4184, stack4188, stack4192,
+	stack4196, stack4200, stack4204, stack4208, stack4212, stack4216,
+	stack4220, stack4224, stack4228, stack4232, stack4236, stack4240,
+	stack4244, stack4248, stack4252, stack4256, stack4260, stack4264,
+	stack4268, stack4272, stack4276, stack4280, stack4284, stack4288,
+	stack4292, stack4296, stack4300, stack4304, stack4308, stack4312,
+	stack4316, stack4320, stack4324, stack4328, stack4332, stack4336,
+	stack4340, stack4344, stack4348, stack4352, stack4356, stack4360,
+	stack4364, stack4368, stack4372, stack4376, stack4380, stack4384,
+	stack4388, stack4392, stack4396, stack4400, stack4404, stack4408,
+	stack4412, stack4416, stack4420, stack4424, stack4428, stack4432,
+	stack4436, stack4440, stack4444, stack4448, stack4452, stack4456,
+	stack4460, stack4464, stack4468, stack4472, stack4476, stack4480,
+	stack4484, stack4488, stack4492, stack4496, stack4500, stack4504,
+	stack4508, stack4512, stack4516, stack4520, stack4524, stack4528,
+	stack4532, stack4536, stack4540, stack4544, stack4548, stack4552,
+	stack4556, stack4560, stack4564, stack4568, stack4572, stack4576,
+	stack4580, stack4584, stack4588, stack4592, stack4596, stack4600,
+	stack4604, stack4608, stack4612, stack4616, stack4620, stack4624,
+	stack4628, stack4632, stack4636, stack4640, stack4644, stack4648,
+	stack4652, stack4656, stack4660, stack4664, stack4668, stack4672,
+	stack4676, stack4680, stack4684, stack4688, stack4692, stack4696,
+	stack4700, stack4704, stack4708, stack4712, stack4716, stack4720,
+	stack4724, stack4728, stack4732, stack4736, stack4740, stack4744,
+	stack4748, stack4752, stack4756, stack4760, stack4764, stack4768,
+	stack4772, stack4776, stack4780, stack4784, stack4788, stack4792,
+	stack4796, stack4800, stack4804, stack4808, stack4812, stack4816,
+	stack4820, stack4824, stack4828, stack4832, stack4836, stack4840,
+	stack4844, stack4848, stack4852, stack4856, stack4860, stack4864,
+	stack4868, stack4872, stack4876, stack4880, stack4884, stack4888,
+	stack4892, stack4896, stack4900, stack4904, stack4908, stack4912,
+	stack4916, stack4920, stack4924, stack4928, stack4932, stack4936,
+	stack4940, stack4944, stack4948, stack4952, stack4956, stack4960,
+	stack4964, stack4968, stack4972, stack4976, stack4980, stack4984,
+	stack4988, stack4992, stack4996, stack5000,
+}
+
+// Edit .+1,$ | seq 4 4 5000 | sed 's/.*/func stack&() { var buf [&]byte; use(buf[:]); C.callGoStackCheck() }/'
+func stack4()    { var buf [4]byte; use(buf[:]); C.callGoStackCheck() }
+func stack8()    { var buf [8]byte; use(buf[:]); C.callGoStackCheck() }
+func stack12()   { var buf [12]byte; use(buf[:]); C.callGoStackCheck() }
+func stack16()   { var buf [16]byte; use(buf[:]); C.callGoStackCheck() }
+func stack20()   { var buf [20]byte; use(buf[:]); C.callGoStackCheck() }
+func stack24()   { var buf [24]byte; use(buf[:]); C.callGoStackCheck() }
+func stack28()   { var buf [28]byte; use(buf[:]); C.callGoStackCheck() }
+func stack32()   { var buf [32]byte; use(buf[:]); C.callGoStackCheck() }
+func stack36()   { var buf [36]byte; use(buf[:]); C.callGoStackCheck() }
+func stack40()   { var buf [40]byte; use(buf[:]); C.callGoStackCheck() }
+func stack44()   { var buf [44]byte; use(buf[:]); C.callGoStackCheck() }
+func stack48()   { var buf [48]byte; use(buf[:]); C.callGoStackCheck() }
+func stack52()   { var buf [52]byte; use(buf[:]); C.callGoStackCheck() }
+func stack56()   { var buf [56]byte; use(buf[:]); C.callGoStackCheck() }
+func stack60()   { var buf [60]byte; use(buf[:]); C.callGoStackCheck() }
+func stack64()   { var buf [64]byte; use(buf[:]); C.callGoStackCheck() }
+func stack68()   { var buf [68]byte; use(buf[:]); C.callGoStackCheck() }
+func stack72()   { var buf [72]byte; use(buf[:]); C.callGoStackCheck() }
+func stack76()   { var buf [76]byte; use(buf[:]); C.callGoStackCheck() }
+func stack80()   { var buf [80]byte; use(buf[:]); C.callGoStackCheck() }
+func stack84()   { var buf [84]byte; use(buf[:]); C.callGoStackCheck() }
+func stack88()   { var buf [88]byte; use(buf[:]); C.callGoStackCheck() }
+func stack92()   { var buf [92]byte; use(buf[:]); C.callGoStackCheck() }
+func stack96()   { var buf [96]byte; use(buf[:]); C.callGoStackCheck() }
+func stack100()  { var buf [100]byte; use(buf[:]); C.callGoStackCheck() }
+func stack104()  { var buf [104]byte; use(buf[:]); C.callGoStackCheck() }
+func stack108()  { var buf [108]byte; use(buf[:]); C.callGoStackCheck() }
+func stack112()  { var buf [112]byte; use(buf[:]); C.callGoStackCheck() }
+func stack116()  { var buf [116]byte; use(buf[:]); C.callGoStackCheck() }
+func stack120()  { var buf [120]byte; use(buf[:]); C.callGoStackCheck() }
+func stack124()  { var buf [124]byte; use(buf[:]); C.callGoStackCheck() }
+func stack128()  { var buf [128]byte; use(buf[:]); C.callGoStackCheck() }
+func stack132()  { var buf [132]byte; use(buf[:]); C.callGoStackCheck() }
+func stack136()  { var buf [136]byte; use(buf[:]); C.callGoStackCheck() }
+func stack140()  { var buf [140]byte; use(buf[:]); C.callGoStackCheck() }
+func stack144()  { var buf [144]byte; use(buf[:]); C.callGoStackCheck() }
+func stack148()  { var buf [148]byte; use(buf[:]); C.callGoStackCheck() }
+func stack152()  { var buf [152]byte; use(buf[:]); C.callGoStackCheck() }
+func stack156()  { var buf [156]byte; use(buf[:]); C.callGoStackCheck() }
+func stack160()  { var buf [160]byte; use(buf[:]); C.callGoStackCheck() }
+func stack164()  { var buf [164]byte; use(buf[:]); C.callGoStackCheck() }
+func stack168()  { var buf [168]byte; use(buf[:]); C.callGoStackCheck() }
+func stack172()  { var buf [172]byte; use(buf[:]); C.callGoStackCheck() }
+func stack176()  { var buf [176]byte; use(buf[:]); C.callGoStackCheck() }
+func stack180()  { var buf [180]byte; use(buf[:]); C.callGoStackCheck() }
+func stack184()  { var buf [184]byte; use(buf[:]); C.callGoStackCheck() }
+func stack188()  { var buf [188]byte; use(buf[:]); C.callGoStackCheck() }
+func stack192()  { var buf [192]byte; use(buf[:]); C.callGoStackCheck() }
+func stack196()  { var buf [196]byte; use(buf[:]); C.callGoStackCheck() }
+func stack200()  { var buf [200]byte; use(buf[:]); C.callGoStackCheck() }
+func stack204()  { var buf [204]byte; use(buf[:]); C.callGoStackCheck() }
+func stack208()  { var buf [208]byte; use(buf[:]); C.callGoStackCheck() }
+func stack212()  { var buf [212]byte; use(buf[:]); C.callGoStackCheck() }
+func stack216()  { var buf [216]byte; use(buf[:]); C.callGoStackCheck() }
+func stack220()  { var buf [220]byte; use(buf[:]); C.callGoStackCheck() }
+func stack224()  { var buf [224]byte; use(buf[:]); C.callGoStackCheck() }
+func stack228()  { var buf [228]byte; use(buf[:]); C.callGoStackCheck() }
+func stack232()  { var buf [232]byte; use(buf[:]); C.callGoStackCheck() }
+func stack236()  { var buf [236]byte; use(buf[:]); C.callGoStackCheck() }
+func stack240()  { var buf [240]byte; use(buf[:]); C.callGoStackCheck() }
+func stack244()  { var buf [244]byte; use(buf[:]); C.callGoStackCheck() }
+func stack248()  { var buf [248]byte; use(buf[:]); C.callGoStackCheck() }
+func stack252()  { var buf [252]byte; use(buf[:]); C.callGoStackCheck() }
+func stack256()  { var buf [256]byte; use(buf[:]); C.callGoStackCheck() }
+func stack260()  { var buf [260]byte; use(buf[:]); C.callGoStackCheck() }
+func stack264()  { var buf [264]byte; use(buf[:]); C.callGoStackCheck() }
+func stack268()  { var buf [268]byte; use(buf[:]); C.callGoStackCheck() }
+func stack272()  { var buf [272]byte; use(buf[:]); C.callGoStackCheck() }
+func stack276()  { var buf [276]byte; use(buf[:]); C.callGoStackCheck() }
+func stack280()  { var buf [280]byte; use(buf[:]); C.callGoStackCheck() }
+func stack284()  { var buf [284]byte; use(buf[:]); C.callGoStackCheck() }
+func stack288()  { var buf [288]byte; use(buf[:]); C.callGoStackCheck() }
+func stack292()  { var buf [292]byte; use(buf[:]); C.callGoStackCheck() }
+func stack296()  { var buf [296]byte; use(buf[:]); C.callGoStackCheck() }
+func stack300()  { var buf [300]byte; use(buf[:]); C.callGoStackCheck() }
+func stack304()  { var buf [304]byte; use(buf[:]); C.callGoStackCheck() }
+func stack308()  { var buf [308]byte; use(buf[:]); C.callGoStackCheck() }
+func stack312()  { var buf [312]byte; use(buf[:]); C.callGoStackCheck() }
+func stack316()  { var buf [316]byte; use(buf[:]); C.callGoStackCheck() }
+func stack320()  { var buf [320]byte; use(buf[:]); C.callGoStackCheck() }
+func stack324()  { var buf [324]byte; use(buf[:]); C.callGoStackCheck() }
+func stack328()  { var buf [328]byte; use(buf[:]); C.callGoStackCheck() }
+func stack332()  { var buf [332]byte; use(buf[:]); C.callGoStackCheck() }
+func stack336()  { var buf [336]byte; use(buf[:]); C.callGoStackCheck() }
+func stack340()  { var buf [340]byte; use(buf[:]); C.callGoStackCheck() }
+func stack344()  { var buf [344]byte; use(buf[:]); C.callGoStackCheck() }
+func stack348()  { var buf [348]byte; use(buf[:]); C.callGoStackCheck() }
+func stack352()  { var buf [352]byte; use(buf[:]); C.callGoStackCheck() }
+func stack356()  { var buf [356]byte; use(buf[:]); C.callGoStackCheck() }
+func stack360()  { var buf [360]byte; use(buf[:]); C.callGoStackCheck() }
+func stack364()  { var buf [364]byte; use(buf[:]); C.callGoStackCheck() }
+func stack368()  { var buf [368]byte; use(buf[:]); C.callGoStackCheck() }
+func stack372()  { var buf [372]byte; use(buf[:]); C.callGoStackCheck() }
+func stack376()  { var buf [376]byte; use(buf[:]); C.callGoStackCheck() }
+func stack380()  { var buf [380]byte; use(buf[:]); C.callGoStackCheck() }
+func stack384()  { var buf [384]byte; use(buf[:]); C.callGoStackCheck() }
+func stack388()  { var buf [388]byte; use(buf[:]); C.callGoStackCheck() }
+func stack392()  { var buf [392]byte; use(buf[:]); C.callGoStackCheck() }
+func stack396()  { var buf [396]byte; use(buf[:]); C.callGoStackCheck() }
+func stack400()  { var buf [400]byte; use(buf[:]); C.callGoStackCheck() }
+func stack404()  { var buf [404]byte; use(buf[:]); C.callGoStackCheck() }
+func stack408()  { var buf [408]byte; use(buf[:]); C.callGoStackCheck() }
+func stack412()  { var buf [412]byte; use(buf[:]); C.callGoStackCheck() }
+func stack416()  { var buf [416]byte; use(buf[:]); C.callGoStackCheck() }
+func stack420()  { var buf [420]byte; use(buf[:]); C.callGoStackCheck() }
+func stack424()  { var buf [424]byte; use(buf[:]); C.callGoStackCheck() }
+func stack428()  { var buf [428]byte; use(buf[:]); C.callGoStackCheck() }
+func stack432()  { var buf [432]byte; use(buf[:]); C.callGoStackCheck() }
+func stack436()  { var buf [436]byte; use(buf[:]); C.callGoStackCheck() }
+func stack440()  { var buf [440]byte; use(buf[:]); C.callGoStackCheck() }
+func stack444()  { var buf [444]byte; use(buf[:]); C.callGoStackCheck() }
+func stack448()  { var buf [448]byte; use(buf[:]); C.callGoStackCheck() }
+func stack452()  { var buf [452]byte; use(buf[:]); C.callGoStackCheck() }
+func stack456()  { var buf [456]byte; use(buf[:]); C.callGoStackCheck() }
+func stack460()  { var buf [460]byte; use(buf[:]); C.callGoStackCheck() }
+func stack464()  { var buf [464]byte; use(buf[:]); C.callGoStackCheck() }
+func stack468()  { var buf [468]byte; use(buf[:]); C.callGoStackCheck() }
+func stack472()  { var buf [472]byte; use(buf[:]); C.callGoStackCheck() }
+func stack476()  { var buf [476]byte; use(buf[:]); C.callGoStackCheck() }
+func stack480()  { var buf [480]byte; use(buf[:]); C.callGoStackCheck() }
+func stack484()  { var buf [484]byte; use(buf[:]); C.callGoStackCheck() }
+func stack488()  { var buf [488]byte; use(buf[:]); C.callGoStackCheck() }
+func stack492()  { var buf [492]byte; use(buf[:]); C.callGoStackCheck() }
+func stack496()  { var buf [496]byte; use(buf[:]); C.callGoStackCheck() }
+func stack500()  { var buf [500]byte; use(buf[:]); C.callGoStackCheck() }
+func stack504()  { var buf [504]byte; use(buf[:]); C.callGoStackCheck() }
+func stack508()  { var buf [508]byte; use(buf[:]); C.callGoStackCheck() }
+func stack512()  { var buf [512]byte; use(buf[:]); C.callGoStackCheck() }
+func stack516()  { var buf [516]byte; use(buf[:]); C.callGoStackCheck() }
+func stack520()  { var buf [520]byte; use(buf[:]); C.callGoStackCheck() }
+func stack524()  { var buf [524]byte; use(buf[:]); C.callGoStackCheck() }
+func stack528()  { var buf [528]byte; use(buf[:]); C.callGoStackCheck() }
+func stack532()  { var buf [532]byte; use(buf[:]); C.callGoStackCheck() }
+func stack536()  { var buf [536]byte; use(buf[:]); C.callGoStackCheck() }
+func stack540()  { var buf [540]byte; use(buf[:]); C.callGoStackCheck() }
+func stack544()  { var buf [544]byte; use(buf[:]); C.callGoStackCheck() }
+func stack548()  { var buf [548]byte; use(buf[:]); C.callGoStackCheck() }
+func stack552()  { var buf [552]byte; use(buf[:]); C.callGoStackCheck() }
+func stack556()  { var buf [556]byte; use(buf[:]); C.callGoStackCheck() }
+func stack560()  { var buf [560]byte; use(buf[:]); C.callGoStackCheck() }
+func stack564()  { var buf [564]byte; use(buf[:]); C.callGoStackCheck() }
+func stack568()  { var buf [568]byte; use(buf[:]); C.callGoStackCheck() }
+func stack572()  { var buf [572]byte; use(buf[:]); C.callGoStackCheck() }
+func stack576()  { var buf [576]byte; use(buf[:]); C.callGoStackCheck() }
+func stack580()  { var buf [580]byte; use(buf[:]); C.callGoStackCheck() }
+func stack584()  { var buf [584]byte; use(buf[:]); C.callGoStackCheck() }
+func stack588()  { var buf [588]byte; use(buf[:]); C.callGoStackCheck() }
+func stack592()  { var buf [592]byte; use(buf[:]); C.callGoStackCheck() }
+func stack596()  { var buf [596]byte; use(buf[:]); C.callGoStackCheck() }
+func stack600()  { var buf [600]byte; use(buf[:]); C.callGoStackCheck() }
+func stack604()  { var buf [604]byte; use(buf[:]); C.callGoStackCheck() }
+func stack608()  { var buf [608]byte; use(buf[:]); C.callGoStackCheck() }
+func stack612()  { var buf [612]byte; use(buf[:]); C.callGoStackCheck() }
+func stack616()  { var buf [616]byte; use(buf[:]); C.callGoStackCheck() }
+func stack620()  { var buf [620]byte; use(buf[:]); C.callGoStackCheck() }
+func stack624()  { var buf [624]byte; use(buf[:]); C.callGoStackCheck() }
+func stack628()  { var buf [628]byte; use(buf[:]); C.callGoStackCheck() }
+func stack632()  { var buf [632]byte; use(buf[:]); C.callGoStackCheck() }
+func stack636()  { var buf [636]byte; use(buf[:]); C.callGoStackCheck() }
+func stack640()  { var buf [640]byte; use(buf[:]); C.callGoStackCheck() }
+func stack644()  { var buf [644]byte; use(buf[:]); C.callGoStackCheck() }
+func stack648()  { var buf [648]byte; use(buf[:]); C.callGoStackCheck() }
+func stack652()  { var buf [652]byte; use(buf[:]); C.callGoStackCheck() }
+func stack656()  { var buf [656]byte; use(buf[:]); C.callGoStackCheck() }
+func stack660()  { var buf [660]byte; use(buf[:]); C.callGoStackCheck() }
+func stack664()  { var buf [664]byte; use(buf[:]); C.callGoStackCheck() }
+func stack668()  { var buf [668]byte; use(buf[:]); C.callGoStackCheck() }
+func stack672()  { var buf [672]byte; use(buf[:]); C.callGoStackCheck() }
+func stack676()  { var buf [676]byte; use(buf[:]); C.callGoStackCheck() }
+func stack680()  { var buf [680]byte; use(buf[:]); C.callGoStackCheck() }
+func stack684()  { var buf [684]byte; use(buf[:]); C.callGoStackCheck() }
+func stack688()  { var buf [688]byte; use(buf[:]); C.callGoStackCheck() }
+func stack692()  { var buf [692]byte; use(buf[:]); C.callGoStackCheck() }
+func stack696()  { var buf [696]byte; use(buf[:]); C.callGoStackCheck() }
+func stack700()  { var buf [700]byte; use(buf[:]); C.callGoStackCheck() }
+func stack704()  { var buf [704]byte; use(buf[:]); C.callGoStackCheck() }
+func stack708()  { var buf [708]byte; use(buf[:]); C.callGoStackCheck() }
+func stack712()  { var buf [712]byte; use(buf[:]); C.callGoStackCheck() }
+func stack716()  { var buf [716]byte; use(buf[:]); C.callGoStackCheck() }
+func stack720()  { var buf [720]byte; use(buf[:]); C.callGoStackCheck() }
+func stack724()  { var buf [724]byte; use(buf[:]); C.callGoStackCheck() }
+func stack728()  { var buf [728]byte; use(buf[:]); C.callGoStackCheck() }
+func stack732()  { var buf [732]byte; use(buf[:]); C.callGoStackCheck() }
+func stack736()  { var buf [736]byte; use(buf[:]); C.callGoStackCheck() }
+func stack740()  { var buf [740]byte; use(buf[:]); C.callGoStackCheck() }
+func stack744()  { var buf [744]byte; use(buf[:]); C.callGoStackCheck() }
+func stack748()  { var buf [748]byte; use(buf[:]); C.callGoStackCheck() }
+func stack752()  { var buf [752]byte; use(buf[:]); C.callGoStackCheck() }
+func stack756()  { var buf [756]byte; use(buf[:]); C.callGoStackCheck() }
+func stack760()  { var buf [760]byte; use(buf[:]); C.callGoStackCheck() }
+func stack764()  { var buf [764]byte; use(buf[:]); C.callGoStackCheck() }
+func stack768()  { var buf [768]byte; use(buf[:]); C.callGoStackCheck() }
+func stack772()  { var buf [772]byte; use(buf[:]); C.callGoStackCheck() }
+func stack776()  { var buf [776]byte; use(buf[:]); C.callGoStackCheck() }
+func stack780()  { var buf [780]byte; use(buf[:]); C.callGoStackCheck() }
+func stack784()  { var buf [784]byte; use(buf[:]); C.callGoStackCheck() }
+func stack788()  { var buf [788]byte; use(buf[:]); C.callGoStackCheck() }
+func stack792()  { var buf [792]byte; use(buf[:]); C.callGoStackCheck() }
+func stack796()  { var buf [796]byte; use(buf[:]); C.callGoStackCheck() }
+func stack800()  { var buf [800]byte; use(buf[:]); C.callGoStackCheck() }
+func stack804()  { var buf [804]byte; use(buf[:]); C.callGoStackCheck() }
+func stack808()  { var buf [808]byte; use(buf[:]); C.callGoStackCheck() }
+func stack812()  { var buf [812]byte; use(buf[:]); C.callGoStackCheck() }
+func stack816()  { var buf [816]byte; use(buf[:]); C.callGoStackCheck() }
+func stack820()  { var buf [820]byte; use(buf[:]); C.callGoStackCheck() }
+func stack824()  { var buf [824]byte; use(buf[:]); C.callGoStackCheck() }
+func stack828()  { var buf [828]byte; use(buf[:]); C.callGoStackCheck() }
+func stack832()  { var buf [832]byte; use(buf[:]); C.callGoStackCheck() }
+func stack836()  { var buf [836]byte; use(buf[:]); C.callGoStackCheck() }
+func stack840()  { var buf [840]byte; use(buf[:]); C.callGoStackCheck() }
+func stack844()  { var buf [844]byte; use(buf[:]); C.callGoStackCheck() }
+func stack848()  { var buf [848]byte; use(buf[:]); C.callGoStackCheck() }
+func stack852()  { var buf [852]byte; use(buf[:]); C.callGoStackCheck() }
+func stack856()  { var buf [856]byte; use(buf[:]); C.callGoStackCheck() }
+func stack860()  { var buf [860]byte; use(buf[:]); C.callGoStackCheck() }
+func stack864()  { var buf [864]byte; use(buf[:]); C.callGoStackCheck() }
+func stack868()  { var buf [868]byte; use(buf[:]); C.callGoStackCheck() }
+func stack872()  { var buf [872]byte; use(buf[:]); C.callGoStackCheck() }
+func stack876()  { var buf [876]byte; use(buf[:]); C.callGoStackCheck() }
+func stack880()  { var buf [880]byte; use(buf[:]); C.callGoStackCheck() }
+func stack884()  { var buf [884]byte; use(buf[:]); C.callGoStackCheck() }
+func stack888()  { var buf [888]byte; use(buf[:]); C.callGoStackCheck() }
+func stack892()  { var buf [892]byte; use(buf[:]); C.callGoStackCheck() }
+func stack896()  { var buf [896]byte; use(buf[:]); C.callGoStackCheck() }
+func stack900()  { var buf [900]byte; use(buf[:]); C.callGoStackCheck() }
+func stack904()  { var buf [904]byte; use(buf[:]); C.callGoStackCheck() }
+func stack908()  { var buf [908]byte; use(buf[:]); C.callGoStackCheck() }
+func stack912()  { var buf [912]byte; use(buf[:]); C.callGoStackCheck() }
+func stack916()  { var buf [916]byte; use(buf[:]); C.callGoStackCheck() }
+func stack920()  { var buf [920]byte; use(buf[:]); C.callGoStackCheck() }
+func stack924()  { var buf [924]byte; use(buf[:]); C.callGoStackCheck() }
+func stack928()  { var buf [928]byte; use(buf[:]); C.callGoStackCheck() }
+func stack932()  { var buf [932]byte; use(buf[:]); C.callGoStackCheck() }
+func stack936()  { var buf [936]byte; use(buf[:]); C.callGoStackCheck() }
+func stack940()  { var buf [940]byte; use(buf[:]); C.callGoStackCheck() }
+func stack944()  { var buf [944]byte; use(buf[:]); C.callGoStackCheck() }
+func stack948()  { var buf [948]byte; use(buf[:]); C.callGoStackCheck() }
+func stack952()  { var buf [952]byte; use(buf[:]); C.callGoStackCheck() }
+func stack956()  { var buf [956]byte; use(buf[:]); C.callGoStackCheck() }
+func stack960()  { var buf [960]byte; use(buf[:]); C.callGoStackCheck() }
+func stack964()  { var buf [964]byte; use(buf[:]); C.callGoStackCheck() }
+func stack968()  { var buf [968]byte; use(buf[:]); C.callGoStackCheck() }
+func stack972()  { var buf [972]byte; use(buf[:]); C.callGoStackCheck() }
+func stack976()  { var buf [976]byte; use(buf[:]); C.callGoStackCheck() }
+func stack980()  { var buf [980]byte; use(buf[:]); C.callGoStackCheck() }
+func stack984()  { var buf [984]byte; use(buf[:]); C.callGoStackCheck() }
+func stack988()  { var buf [988]byte; use(buf[:]); C.callGoStackCheck() }
+func stack992()  { var buf [992]byte; use(buf[:]); C.callGoStackCheck() }
+func stack996()  { var buf [996]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1000() { var buf [1000]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1004() { var buf [1004]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1008() { var buf [1008]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1012() { var buf [1012]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1016() { var buf [1016]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1020() { var buf [1020]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1024() { var buf [1024]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1028() { var buf [1028]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1032() { var buf [1032]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1036() { var buf [1036]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1040() { var buf [1040]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1044() { var buf [1044]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1048() { var buf [1048]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1052() { var buf [1052]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1056() { var buf [1056]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1060() { var buf [1060]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1064() { var buf [1064]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1068() { var buf [1068]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1072() { var buf [1072]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1076() { var buf [1076]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1080() { var buf [1080]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1084() { var buf [1084]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1088() { var buf [1088]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1092() { var buf [1092]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1096() { var buf [1096]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1100() { var buf [1100]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1104() { var buf [1104]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1108() { var buf [1108]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1112() { var buf [1112]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1116() { var buf [1116]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1120() { var buf [1120]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1124() { var buf [1124]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1128() { var buf [1128]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1132() { var buf [1132]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1136() { var buf [1136]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1140() { var buf [1140]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1144() { var buf [1144]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1148() { var buf [1148]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1152() { var buf [1152]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1156() { var buf [1156]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1160() { var buf [1160]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1164() { var buf [1164]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1168() { var buf [1168]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1172() { var buf [1172]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1176() { var buf [1176]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1180() { var buf [1180]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1184() { var buf [1184]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1188() { var buf [1188]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1192() { var buf [1192]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1196() { var buf [1196]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1200() { var buf [1200]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1204() { var buf [1204]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1208() { var buf [1208]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1212() { var buf [1212]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1216() { var buf [1216]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1220() { var buf [1220]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1224() { var buf [1224]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1228() { var buf [1228]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1232() { var buf [1232]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1236() { var buf [1236]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1240() { var buf [1240]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1244() { var buf [1244]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1248() { var buf [1248]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1252() { var buf [1252]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1256() { var buf [1256]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1260() { var buf [1260]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1264() { var buf [1264]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1268() { var buf [1268]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1272() { var buf [1272]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1276() { var buf [1276]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1280() { var buf [1280]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1284() { var buf [1284]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1288() { var buf [1288]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1292() { var buf [1292]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1296() { var buf [1296]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1300() { var buf [1300]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1304() { var buf [1304]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1308() { var buf [1308]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1312() { var buf [1312]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1316() { var buf [1316]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1320() { var buf [1320]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1324() { var buf [1324]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1328() { var buf [1328]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1332() { var buf [1332]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1336() { var buf [1336]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1340() { var buf [1340]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1344() { var buf [1344]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1348() { var buf [1348]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1352() { var buf [1352]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1356() { var buf [1356]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1360() { var buf [1360]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1364() { var buf [1364]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1368() { var buf [1368]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1372() { var buf [1372]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1376() { var buf [1376]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1380() { var buf [1380]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1384() { var buf [1384]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1388() { var buf [1388]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1392() { var buf [1392]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1396() { var buf [1396]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1400() { var buf [1400]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1404() { var buf [1404]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1408() { var buf [1408]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1412() { var buf [1412]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1416() { var buf [1416]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1420() { var buf [1420]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1424() { var buf [1424]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1428() { var buf [1428]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1432() { var buf [1432]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1436() { var buf [1436]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1440() { var buf [1440]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1444() { var buf [1444]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1448() { var buf [1448]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1452() { var buf [1452]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1456() { var buf [1456]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1460() { var buf [1460]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1464() { var buf [1464]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1468() { var buf [1468]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1472() { var buf [1472]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1476() { var buf [1476]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1480() { var buf [1480]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1484() { var buf [1484]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1488() { var buf [1488]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1492() { var buf [1492]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1496() { var buf [1496]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1500() { var buf [1500]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1504() { var buf [1504]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1508() { var buf [1508]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1512() { var buf [1512]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1516() { var buf [1516]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1520() { var buf [1520]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1524() { var buf [1524]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1528() { var buf [1528]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1532() { var buf [1532]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1536() { var buf [1536]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1540() { var buf [1540]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1544() { var buf [1544]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1548() { var buf [1548]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1552() { var buf [1552]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1556() { var buf [1556]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1560() { var buf [1560]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1564() { var buf [1564]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1568() { var buf [1568]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1572() { var buf [1572]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1576() { var buf [1576]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1580() { var buf [1580]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1584() { var buf [1584]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1588() { var buf [1588]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1592() { var buf [1592]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1596() { var buf [1596]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1600() { var buf [1600]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1604() { var buf [1604]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1608() { var buf [1608]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1612() { var buf [1612]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1616() { var buf [1616]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1620() { var buf [1620]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1624() { var buf [1624]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1628() { var buf [1628]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1632() { var buf [1632]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1636() { var buf [1636]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1640() { var buf [1640]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1644() { var buf [1644]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1648() { var buf [1648]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1652() { var buf [1652]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1656() { var buf [1656]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1660() { var buf [1660]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1664() { var buf [1664]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1668() { var buf [1668]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1672() { var buf [1672]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1676() { var buf [1676]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1680() { var buf [1680]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1684() { var buf [1684]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1688() { var buf [1688]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1692() { var buf [1692]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1696() { var buf [1696]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1700() { var buf [1700]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1704() { var buf [1704]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1708() { var buf [1708]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1712() { var buf [1712]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1716() { var buf [1716]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1720() { var buf [1720]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1724() { var buf [1724]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1728() { var buf [1728]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1732() { var buf [1732]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1736() { var buf [1736]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1740() { var buf [1740]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1744() { var buf [1744]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1748() { var buf [1748]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1752() { var buf [1752]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1756() { var buf [1756]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1760() { var buf [1760]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1764() { var buf [1764]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1768() { var buf [1768]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1772() { var buf [1772]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1776() { var buf [1776]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1780() { var buf [1780]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1784() { var buf [1784]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1788() { var buf [1788]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1792() { var buf [1792]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1796() { var buf [1796]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1800() { var buf [1800]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1804() { var buf [1804]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1808() { var buf [1808]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1812() { var buf [1812]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1816() { var buf [1816]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1820() { var buf [1820]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1824() { var buf [1824]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1828() { var buf [1828]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1832() { var buf [1832]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1836() { var buf [1836]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1840() { var buf [1840]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1844() { var buf [1844]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1848() { var buf [1848]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1852() { var buf [1852]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1856() { var buf [1856]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1860() { var buf [1860]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1864() { var buf [1864]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1868() { var buf [1868]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1872() { var buf [1872]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1876() { var buf [1876]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1880() { var buf [1880]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1884() { var buf [1884]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1888() { var buf [1888]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1892() { var buf [1892]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1896() { var buf [1896]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1900() { var buf [1900]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1904() { var buf [1904]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1908() { var buf [1908]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1912() { var buf [1912]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1916() { var buf [1916]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1920() { var buf [1920]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1924() { var buf [1924]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1928() { var buf [1928]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1932() { var buf [1932]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1936() { var buf [1936]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1940() { var buf [1940]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1944() { var buf [1944]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1948() { var buf [1948]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1952() { var buf [1952]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1956() { var buf [1956]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1960() { var buf [1960]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1964() { var buf [1964]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1968() { var buf [1968]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1972() { var buf [1972]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1976() { var buf [1976]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1980() { var buf [1980]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1984() { var buf [1984]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1988() { var buf [1988]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1992() { var buf [1992]byte; use(buf[:]); C.callGoStackCheck() }
+func stack1996() { var buf [1996]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2000() { var buf [2000]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2004() { var buf [2004]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2008() { var buf [2008]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2012() { var buf [2012]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2016() { var buf [2016]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2020() { var buf [2020]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2024() { var buf [2024]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2028() { var buf [2028]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2032() { var buf [2032]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2036() { var buf [2036]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2040() { var buf [2040]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2044() { var buf [2044]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2048() { var buf [2048]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2052() { var buf [2052]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2056() { var buf [2056]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2060() { var buf [2060]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2064() { var buf [2064]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2068() { var buf [2068]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2072() { var buf [2072]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2076() { var buf [2076]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2080() { var buf [2080]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2084() { var buf [2084]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2088() { var buf [2088]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2092() { var buf [2092]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2096() { var buf [2096]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2100() { var buf [2100]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2104() { var buf [2104]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2108() { var buf [2108]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2112() { var buf [2112]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2116() { var buf [2116]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2120() { var buf [2120]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2124() { var buf [2124]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2128() { var buf [2128]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2132() { var buf [2132]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2136() { var buf [2136]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2140() { var buf [2140]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2144() { var buf [2144]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2148() { var buf [2148]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2152() { var buf [2152]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2156() { var buf [2156]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2160() { var buf [2160]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2164() { var buf [2164]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2168() { var buf [2168]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2172() { var buf [2172]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2176() { var buf [2176]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2180() { var buf [2180]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2184() { var buf [2184]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2188() { var buf [2188]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2192() { var buf [2192]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2196() { var buf [2196]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2200() { var buf [2200]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2204() { var buf [2204]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2208() { var buf [2208]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2212() { var buf [2212]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2216() { var buf [2216]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2220() { var buf [2220]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2224() { var buf [2224]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2228() { var buf [2228]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2232() { var buf [2232]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2236() { var buf [2236]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2240() { var buf [2240]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2244() { var buf [2244]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2248() { var buf [2248]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2252() { var buf [2252]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2256() { var buf [2256]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2260() { var buf [2260]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2264() { var buf [2264]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2268() { var buf [2268]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2272() { var buf [2272]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2276() { var buf [2276]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2280() { var buf [2280]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2284() { var buf [2284]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2288() { var buf [2288]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2292() { var buf [2292]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2296() { var buf [2296]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2300() { var buf [2300]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2304() { var buf [2304]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2308() { var buf [2308]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2312() { var buf [2312]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2316() { var buf [2316]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2320() { var buf [2320]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2324() { var buf [2324]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2328() { var buf [2328]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2332() { var buf [2332]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2336() { var buf [2336]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2340() { var buf [2340]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2344() { var buf [2344]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2348() { var buf [2348]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2352() { var buf [2352]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2356() { var buf [2356]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2360() { var buf [2360]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2364() { var buf [2364]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2368() { var buf [2368]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2372() { var buf [2372]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2376() { var buf [2376]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2380() { var buf [2380]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2384() { var buf [2384]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2388() { var buf [2388]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2392() { var buf [2392]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2396() { var buf [2396]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2400() { var buf [2400]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2404() { var buf [2404]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2408() { var buf [2408]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2412() { var buf [2412]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2416() { var buf [2416]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2420() { var buf [2420]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2424() { var buf [2424]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2428() { var buf [2428]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2432() { var buf [2432]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2436() { var buf [2436]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2440() { var buf [2440]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2444() { var buf [2444]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2448() { var buf [2448]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2452() { var buf [2452]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2456() { var buf [2456]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2460() { var buf [2460]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2464() { var buf [2464]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2468() { var buf [2468]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2472() { var buf [2472]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2476() { var buf [2476]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2480() { var buf [2480]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2484() { var buf [2484]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2488() { var buf [2488]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2492() { var buf [2492]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2496() { var buf [2496]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2500() { var buf [2500]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2504() { var buf [2504]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2508() { var buf [2508]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2512() { var buf [2512]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2516() { var buf [2516]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2520() { var buf [2520]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2524() { var buf [2524]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2528() { var buf [2528]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2532() { var buf [2532]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2536() { var buf [2536]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2540() { var buf [2540]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2544() { var buf [2544]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2548() { var buf [2548]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2552() { var buf [2552]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2556() { var buf [2556]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2560() { var buf [2560]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2564() { var buf [2564]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2568() { var buf [2568]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2572() { var buf [2572]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2576() { var buf [2576]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2580() { var buf [2580]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2584() { var buf [2584]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2588() { var buf [2588]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2592() { var buf [2592]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2596() { var buf [2596]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2600() { var buf [2600]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2604() { var buf [2604]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2608() { var buf [2608]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2612() { var buf [2612]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2616() { var buf [2616]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2620() { var buf [2620]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2624() { var buf [2624]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2628() { var buf [2628]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2632() { var buf [2632]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2636() { var buf [2636]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2640() { var buf [2640]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2644() { var buf [2644]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2648() { var buf [2648]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2652() { var buf [2652]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2656() { var buf [2656]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2660() { var buf [2660]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2664() { var buf [2664]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2668() { var buf [2668]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2672() { var buf [2672]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2676() { var buf [2676]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2680() { var buf [2680]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2684() { var buf [2684]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2688() { var buf [2688]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2692() { var buf [2692]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2696() { var buf [2696]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2700() { var buf [2700]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2704() { var buf [2704]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2708() { var buf [2708]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2712() { var buf [2712]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2716() { var buf [2716]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2720() { var buf [2720]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2724() { var buf [2724]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2728() { var buf [2728]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2732() { var buf [2732]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2736() { var buf [2736]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2740() { var buf [2740]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2744() { var buf [2744]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2748() { var buf [2748]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2752() { var buf [2752]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2756() { var buf [2756]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2760() { var buf [2760]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2764() { var buf [2764]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2768() { var buf [2768]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2772() { var buf [2772]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2776() { var buf [2776]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2780() { var buf [2780]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2784() { var buf [2784]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2788() { var buf [2788]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2792() { var buf [2792]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2796() { var buf [2796]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2800() { var buf [2800]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2804() { var buf [2804]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2808() { var buf [2808]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2812() { var buf [2812]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2816() { var buf [2816]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2820() { var buf [2820]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2824() { var buf [2824]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2828() { var buf [2828]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2832() { var buf [2832]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2836() { var buf [2836]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2840() { var buf [2840]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2844() { var buf [2844]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2848() { var buf [2848]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2852() { var buf [2852]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2856() { var buf [2856]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2860() { var buf [2860]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2864() { var buf [2864]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2868() { var buf [2868]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2872() { var buf [2872]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2876() { var buf [2876]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2880() { var buf [2880]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2884() { var buf [2884]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2888() { var buf [2888]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2892() { var buf [2892]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2896() { var buf [2896]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2900() { var buf [2900]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2904() { var buf [2904]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2908() { var buf [2908]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2912() { var buf [2912]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2916() { var buf [2916]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2920() { var buf [2920]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2924() { var buf [2924]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2928() { var buf [2928]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2932() { var buf [2932]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2936() { var buf [2936]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2940() { var buf [2940]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2944() { var buf [2944]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2948() { var buf [2948]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2952() { var buf [2952]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2956() { var buf [2956]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2960() { var buf [2960]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2964() { var buf [2964]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2968() { var buf [2968]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2972() { var buf [2972]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2976() { var buf [2976]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2980() { var buf [2980]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2984() { var buf [2984]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2988() { var buf [2988]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2992() { var buf [2992]byte; use(buf[:]); C.callGoStackCheck() }
+func stack2996() { var buf [2996]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3000() { var buf [3000]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3004() { var buf [3004]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3008() { var buf [3008]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3012() { var buf [3012]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3016() { var buf [3016]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3020() { var buf [3020]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3024() { var buf [3024]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3028() { var buf [3028]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3032() { var buf [3032]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3036() { var buf [3036]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3040() { var buf [3040]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3044() { var buf [3044]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3048() { var buf [3048]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3052() { var buf [3052]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3056() { var buf [3056]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3060() { var buf [3060]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3064() { var buf [3064]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3068() { var buf [3068]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3072() { var buf [3072]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3076() { var buf [3076]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3080() { var buf [3080]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3084() { var buf [3084]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3088() { var buf [3088]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3092() { var buf [3092]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3096() { var buf [3096]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3100() { var buf [3100]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3104() { var buf [3104]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3108() { var buf [3108]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3112() { var buf [3112]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3116() { var buf [3116]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3120() { var buf [3120]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3124() { var buf [3124]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3128() { var buf [3128]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3132() { var buf [3132]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3136() { var buf [3136]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3140() { var buf [3140]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3144() { var buf [3144]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3148() { var buf [3148]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3152() { var buf [3152]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3156() { var buf [3156]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3160() { var buf [3160]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3164() { var buf [3164]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3168() { var buf [3168]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3172() { var buf [3172]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3176() { var buf [3176]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3180() { var buf [3180]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3184() { var buf [3184]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3188() { var buf [3188]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3192() { var buf [3192]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3196() { var buf [3196]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3200() { var buf [3200]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3204() { var buf [3204]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3208() { var buf [3208]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3212() { var buf [3212]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3216() { var buf [3216]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3220() { var buf [3220]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3224() { var buf [3224]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3228() { var buf [3228]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3232() { var buf [3232]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3236() { var buf [3236]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3240() { var buf [3240]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3244() { var buf [3244]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3248() { var buf [3248]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3252() { var buf [3252]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3256() { var buf [3256]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3260() { var buf [3260]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3264() { var buf [3264]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3268() { var buf [3268]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3272() { var buf [3272]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3276() { var buf [3276]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3280() { var buf [3280]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3284() { var buf [3284]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3288() { var buf [3288]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3292() { var buf [3292]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3296() { var buf [3296]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3300() { var buf [3300]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3304() { var buf [3304]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3308() { var buf [3308]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3312() { var buf [3312]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3316() { var buf [3316]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3320() { var buf [3320]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3324() { var buf [3324]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3328() { var buf [3328]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3332() { var buf [3332]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3336() { var buf [3336]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3340() { var buf [3340]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3344() { var buf [3344]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3348() { var buf [3348]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3352() { var buf [3352]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3356() { var buf [3356]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3360() { var buf [3360]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3364() { var buf [3364]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3368() { var buf [3368]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3372() { var buf [3372]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3376() { var buf [3376]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3380() { var buf [3380]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3384() { var buf [3384]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3388() { var buf [3388]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3392() { var buf [3392]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3396() { var buf [3396]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3400() { var buf [3400]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3404() { var buf [3404]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3408() { var buf [3408]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3412() { var buf [3412]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3416() { var buf [3416]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3420() { var buf [3420]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3424() { var buf [3424]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3428() { var buf [3428]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3432() { var buf [3432]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3436() { var buf [3436]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3440() { var buf [3440]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3444() { var buf [3444]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3448() { var buf [3448]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3452() { var buf [3452]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3456() { var buf [3456]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3460() { var buf [3460]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3464() { var buf [3464]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3468() { var buf [3468]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3472() { var buf [3472]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3476() { var buf [3476]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3480() { var buf [3480]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3484() { var buf [3484]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3488() { var buf [3488]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3492() { var buf [3492]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3496() { var buf [3496]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3500() { var buf [3500]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3504() { var buf [3504]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3508() { var buf [3508]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3512() { var buf [3512]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3516() { var buf [3516]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3520() { var buf [3520]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3524() { var buf [3524]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3528() { var buf [3528]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3532() { var buf [3532]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3536() { var buf [3536]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3540() { var buf [3540]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3544() { var buf [3544]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3548() { var buf [3548]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3552() { var buf [3552]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3556() { var buf [3556]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3560() { var buf [3560]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3564() { var buf [3564]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3568() { var buf [3568]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3572() { var buf [3572]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3576() { var buf [3576]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3580() { var buf [3580]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3584() { var buf [3584]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3588() { var buf [3588]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3592() { var buf [3592]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3596() { var buf [3596]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3600() { var buf [3600]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3604() { var buf [3604]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3608() { var buf [3608]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3612() { var buf [3612]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3616() { var buf [3616]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3620() { var buf [3620]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3624() { var buf [3624]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3628() { var buf [3628]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3632() { var buf [3632]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3636() { var buf [3636]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3640() { var buf [3640]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3644() { var buf [3644]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3648() { var buf [3648]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3652() { var buf [3652]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3656() { var buf [3656]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3660() { var buf [3660]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3664() { var buf [3664]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3668() { var buf [3668]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3672() { var buf [3672]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3676() { var buf [3676]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3680() { var buf [3680]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3684() { var buf [3684]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3688() { var buf [3688]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3692() { var buf [3692]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3696() { var buf [3696]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3700() { var buf [3700]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3704() { var buf [3704]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3708() { var buf [3708]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3712() { var buf [3712]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3716() { var buf [3716]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3720() { var buf [3720]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3724() { var buf [3724]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3728() { var buf [3728]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3732() { var buf [3732]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3736() { var buf [3736]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3740() { var buf [3740]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3744() { var buf [3744]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3748() { var buf [3748]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3752() { var buf [3752]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3756() { var buf [3756]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3760() { var buf [3760]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3764() { var buf [3764]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3768() { var buf [3768]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3772() { var buf [3772]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3776() { var buf [3776]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3780() { var buf [3780]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3784() { var buf [3784]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3788() { var buf [3788]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3792() { var buf [3792]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3796() { var buf [3796]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3800() { var buf [3800]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3804() { var buf [3804]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3808() { var buf [3808]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3812() { var buf [3812]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3816() { var buf [3816]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3820() { var buf [3820]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3824() { var buf [3824]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3828() { var buf [3828]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3832() { var buf [3832]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3836() { var buf [3836]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3840() { var buf [3840]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3844() { var buf [3844]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3848() { var buf [3848]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3852() { var buf [3852]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3856() { var buf [3856]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3860() { var buf [3860]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3864() { var buf [3864]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3868() { var buf [3868]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3872() { var buf [3872]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3876() { var buf [3876]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3880() { var buf [3880]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3884() { var buf [3884]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3888() { var buf [3888]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3892() { var buf [3892]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3896() { var buf [3896]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3900() { var buf [3900]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3904() { var buf [3904]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3908() { var buf [3908]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3912() { var buf [3912]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3916() { var buf [3916]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3920() { var buf [3920]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3924() { var buf [3924]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3928() { var buf [3928]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3932() { var buf [3932]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3936() { var buf [3936]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3940() { var buf [3940]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3944() { var buf [3944]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3948() { var buf [3948]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3952() { var buf [3952]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3956() { var buf [3956]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3960() { var buf [3960]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3964() { var buf [3964]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3968() { var buf [3968]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3972() { var buf [3972]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3976() { var buf [3976]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3980() { var buf [3980]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3984() { var buf [3984]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3988() { var buf [3988]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3992() { var buf [3992]byte; use(buf[:]); C.callGoStackCheck() }
+func stack3996() { var buf [3996]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4000() { var buf [4000]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4004() { var buf [4004]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4008() { var buf [4008]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4012() { var buf [4012]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4016() { var buf [4016]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4020() { var buf [4020]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4024() { var buf [4024]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4028() { var buf [4028]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4032() { var buf [4032]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4036() { var buf [4036]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4040() { var buf [4040]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4044() { var buf [4044]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4048() { var buf [4048]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4052() { var buf [4052]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4056() { var buf [4056]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4060() { var buf [4060]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4064() { var buf [4064]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4068() { var buf [4068]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4072() { var buf [4072]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4076() { var buf [4076]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4080() { var buf [4080]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4084() { var buf [4084]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4088() { var buf [4088]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4092() { var buf [4092]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4096() { var buf [4096]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4100() { var buf [4100]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4104() { var buf [4104]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4108() { var buf [4108]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4112() { var buf [4112]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4116() { var buf [4116]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4120() { var buf [4120]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4124() { var buf [4124]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4128() { var buf [4128]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4132() { var buf [4132]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4136() { var buf [4136]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4140() { var buf [4140]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4144() { var buf [4144]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4148() { var buf [4148]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4152() { var buf [4152]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4156() { var buf [4156]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4160() { var buf [4160]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4164() { var buf [4164]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4168() { var buf [4168]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4172() { var buf [4172]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4176() { var buf [4176]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4180() { var buf [4180]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4184() { var buf [4184]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4188() { var buf [4188]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4192() { var buf [4192]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4196() { var buf [4196]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4200() { var buf [4200]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4204() { var buf [4204]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4208() { var buf [4208]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4212() { var buf [4212]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4216() { var buf [4216]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4220() { var buf [4220]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4224() { var buf [4224]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4228() { var buf [4228]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4232() { var buf [4232]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4236() { var buf [4236]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4240() { var buf [4240]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4244() { var buf [4244]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4248() { var buf [4248]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4252() { var buf [4252]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4256() { var buf [4256]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4260() { var buf [4260]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4264() { var buf [4264]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4268() { var buf [4268]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4272() { var buf [4272]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4276() { var buf [4276]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4280() { var buf [4280]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4284() { var buf [4284]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4288() { var buf [4288]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4292() { var buf [4292]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4296() { var buf [4296]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4300() { var buf [4300]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4304() { var buf [4304]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4308() { var buf [4308]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4312() { var buf [4312]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4316() { var buf [4316]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4320() { var buf [4320]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4324() { var buf [4324]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4328() { var buf [4328]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4332() { var buf [4332]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4336() { var buf [4336]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4340() { var buf [4340]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4344() { var buf [4344]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4348() { var buf [4348]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4352() { var buf [4352]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4356() { var buf [4356]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4360() { var buf [4360]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4364() { var buf [4364]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4368() { var buf [4368]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4372() { var buf [4372]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4376() { var buf [4376]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4380() { var buf [4380]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4384() { var buf [4384]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4388() { var buf [4388]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4392() { var buf [4392]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4396() { var buf [4396]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4400() { var buf [4400]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4404() { var buf [4404]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4408() { var buf [4408]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4412() { var buf [4412]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4416() { var buf [4416]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4420() { var buf [4420]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4424() { var buf [4424]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4428() { var buf [4428]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4432() { var buf [4432]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4436() { var buf [4436]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4440() { var buf [4440]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4444() { var buf [4444]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4448() { var buf [4448]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4452() { var buf [4452]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4456() { var buf [4456]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4460() { var buf [4460]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4464() { var buf [4464]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4468() { var buf [4468]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4472() { var buf [4472]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4476() { var buf [4476]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4480() { var buf [4480]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4484() { var buf [4484]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4488() { var buf [4488]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4492() { var buf [4492]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4496() { var buf [4496]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4500() { var buf [4500]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4504() { var buf [4504]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4508() { var buf [4508]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4512() { var buf [4512]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4516() { var buf [4516]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4520() { var buf [4520]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4524() { var buf [4524]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4528() { var buf [4528]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4532() { var buf [4532]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4536() { var buf [4536]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4540() { var buf [4540]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4544() { var buf [4544]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4548() { var buf [4548]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4552() { var buf [4552]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4556() { var buf [4556]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4560() { var buf [4560]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4564() { var buf [4564]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4568() { var buf [4568]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4572() { var buf [4572]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4576() { var buf [4576]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4580() { var buf [4580]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4584() { var buf [4584]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4588() { var buf [4588]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4592() { var buf [4592]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4596() { var buf [4596]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4600() { var buf [4600]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4604() { var buf [4604]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4608() { var buf [4608]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4612() { var buf [4612]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4616() { var buf [4616]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4620() { var buf [4620]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4624() { var buf [4624]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4628() { var buf [4628]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4632() { var buf [4632]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4636() { var buf [4636]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4640() { var buf [4640]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4644() { var buf [4644]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4648() { var buf [4648]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4652() { var buf [4652]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4656() { var buf [4656]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4660() { var buf [4660]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4664() { var buf [4664]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4668() { var buf [4668]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4672() { var buf [4672]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4676() { var buf [4676]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4680() { var buf [4680]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4684() { var buf [4684]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4688() { var buf [4688]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4692() { var buf [4692]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4696() { var buf [4696]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4700() { var buf [4700]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4704() { var buf [4704]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4708() { var buf [4708]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4712() { var buf [4712]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4716() { var buf [4716]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4720() { var buf [4720]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4724() { var buf [4724]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4728() { var buf [4728]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4732() { var buf [4732]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4736() { var buf [4736]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4740() { var buf [4740]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4744() { var buf [4744]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4748() { var buf [4748]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4752() { var buf [4752]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4756() { var buf [4756]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4760() { var buf [4760]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4764() { var buf [4764]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4768() { var buf [4768]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4772() { var buf [4772]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4776() { var buf [4776]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4780() { var buf [4780]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4784() { var buf [4784]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4788() { var buf [4788]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4792() { var buf [4792]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4796() { var buf [4796]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4800() { var buf [4800]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4804() { var buf [4804]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4808() { var buf [4808]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4812() { var buf [4812]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4816() { var buf [4816]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4820() { var buf [4820]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4824() { var buf [4824]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4828() { var buf [4828]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4832() { var buf [4832]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4836() { var buf [4836]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4840() { var buf [4840]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4844() { var buf [4844]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4848() { var buf [4848]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4852() { var buf [4852]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4856() { var buf [4856]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4860() { var buf [4860]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4864() { var buf [4864]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4868() { var buf [4868]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4872() { var buf [4872]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4876() { var buf [4876]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4880() { var buf [4880]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4884() { var buf [4884]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4888() { var buf [4888]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4892() { var buf [4892]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4896() { var buf [4896]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4900() { var buf [4900]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4904() { var buf [4904]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4908() { var buf [4908]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4912() { var buf [4912]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4916() { var buf [4916]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4920() { var buf [4920]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4924() { var buf [4924]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4928() { var buf [4928]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4932() { var buf [4932]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4936() { var buf [4936]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4940() { var buf [4940]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4944() { var buf [4944]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4948() { var buf [4948]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4952() { var buf [4952]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4956() { var buf [4956]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4960() { var buf [4960]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4964() { var buf [4964]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4968() { var buf [4968]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4972() { var buf [4972]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4976() { var buf [4976]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4980() { var buf [4980]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4984() { var buf [4984]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4988() { var buf [4988]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4992() { var buf [4992]byte; use(buf[:]); C.callGoStackCheck() }
+func stack4996() { var buf [4996]byte; use(buf[:]); C.callGoStackCheck() }
+func stack5000() { var buf [5000]byte; use(buf[:]); C.callGoStackCheck() }
diff --git a/misc/cgo/test/callback_c.c b/src/cmd/cgo/internal/test/callback_c.c
similarity index 100%
rename from misc/cgo/test/callback_c.c
rename to src/cmd/cgo/internal/test/callback_c.c
diff --git a/src/cmd/cgo/internal/test/callback_c_gc.c b/src/cmd/cgo/internal/test/callback_c_gc.c
new file mode 100644
index 0000000..c6666c2
--- /dev/null
+++ b/src/cmd/cgo/internal/test/callback_c_gc.c
@@ -0,0 +1,25 @@
+// Copyright 2013 The Go 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:build gc
+
+#include "_cgo_export.h"
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+/* Test calling panic from C.  This is what SWIG does.  */
+
+extern void crosscall2(void (*fn)(void *, int), void *, int);
+extern void _cgo_panic(void *, int);
+extern void _cgo_allocate(void *, int);
+
+void
+callPanic(void)
+{
+	struct { const char *p; } a;
+	a.p = "panic from C";
+	crosscall2(_cgo_panic, &a, sizeof a);
+	*(int*)1 = 1;
+}
diff --git a/src/cmd/cgo/internal/test/callback_c_gccgo.c b/src/cmd/cgo/internal/test/callback_c_gccgo.c
new file mode 100644
index 0000000..91d37f0
--- /dev/null
+++ b/src/cmd/cgo/internal/test/callback_c_gccgo.c
@@ -0,0 +1,21 @@
+// Copyright 2013 The Go 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:build gccgo
+
+#include "_cgo_export.h"
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+/* Test calling panic from C.  This is what SWIG does.  */
+
+extern void _cgo_panic(const char *);
+extern void *_cgo_allocate(size_t);
+
+void
+callPanic(void)
+{
+	_cgo_panic("panic from C");
+}
diff --git a/src/cmd/cgo/internal/test/cgo_linux_test.go b/src/cmd/cgo/internal/test/cgo_linux_test.go
new file mode 100644
index 0000000..3defc32
--- /dev/null
+++ b/src/cmd/cgo/internal/test/cgo_linux_test.go
@@ -0,0 +1,45 @@
+// 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:build cgo
+
+package cgotest
+
+import (
+	"os"
+	"runtime"
+	"testing"
+)
+
+func TestSetgid(t *testing.T) {
+	if runtime.GOOS == "android" {
+		t.Skip("unsupported on Android")
+	}
+	if _, err := os.Stat("/etc/alpine-release"); err == nil {
+		t.Skip("setgid is broken with musl libc - go.dev/issue/39857")
+	}
+	testSetgid(t)
+}
+
+func TestSetgidStress(t *testing.T) {
+	if runtime.GOOS == "android" {
+		t.Skip("unsupported on Android")
+	}
+	if _, err := os.Stat("/etc/alpine-release"); err == nil {
+		t.Skip("setgid is broken with musl libc - go.dev/issue/39857")
+	}
+	testSetgidStress(t)
+}
+
+func Test1435(t *testing.T) { test1435(t) }
+func Test6997(t *testing.T) { test6997(t) }
+
+func Test9400(t *testing.T) {
+	if _, err := os.Stat("/etc/alpine-release"); err == nil {
+		t.Skip("setgid is broken with musl libc - go.dev/issue/39857")
+	}
+	test9400(t)
+}
+
+func TestBuildID(t *testing.T) { testBuildID(t) }
diff --git a/misc/cgo/test/cgo_stubs_android_test.go b/src/cmd/cgo/internal/test/cgo_stubs_android_test.go
similarity index 100%
rename from misc/cgo/test/cgo_stubs_android_test.go
rename to src/cmd/cgo/internal/test/cgo_stubs_android_test.go
diff --git a/src/cmd/cgo/internal/test/cgo_test.go b/src/cmd/cgo/internal/test/cgo_test.go
new file mode 100644
index 0000000..5e02888
--- /dev/null
+++ b/src/cmd/cgo/internal/test/cgo_test.go
@@ -0,0 +1,112 @@
+// Copyright 2011 The Go 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:build cgo
+
+package cgotest
+
+import "testing"
+
+// The actual test functions are in non-_test.go files
+// so that they can use cgo (import "C").
+// These wrappers are here for gotest to find.
+
+func Test1328(t *testing.T)                  { test1328(t) }
+func Test1560(t *testing.T)                  { test1560(t) }
+func Test1635(t *testing.T)                  { test1635(t) }
+func Test3250(t *testing.T)                  { test3250(t) }
+func Test3729(t *testing.T)                  { test3729(t) }
+func Test3775(t *testing.T)                  { test3775(t) }
+func Test4029(t *testing.T)                  { test4029(t) }
+func Test4339(t *testing.T)                  { test4339(t) }
+func Test5227(t *testing.T)                  { test5227(t) }
+func Test5242(t *testing.T)                  { test5242(t) }
+func Test5337(t *testing.T)                  { test5337(t) }
+func Test5548(t *testing.T)                  { test5548(t) }
+func Test5603(t *testing.T)                  { test5603(t) }
+func Test5986(t *testing.T)                  { test5986(t) }
+func Test6390(t *testing.T)                  { test6390(t) }
+func Test6833(t *testing.T)                  { test6833(t) }
+func Test6907(t *testing.T)                  { test6907(t) }
+func Test6907Go(t *testing.T)                { test6907Go(t) }
+func Test7560(t *testing.T)                  { test7560(t) }
+func Test7665(t *testing.T)                  { test7665(t) }
+func Test7978(t *testing.T)                  { test7978(t) }
+func Test8092(t *testing.T)                  { test8092(t) }
+func Test8517(t *testing.T)                  { test8517(t) }
+func Test8694(t *testing.T)                  { test8694(t) }
+func Test8756(t *testing.T)                  { test8756(t) }
+func Test8811(t *testing.T)                  { test8811(t) }
+func Test9026(t *testing.T)                  { test9026(t) }
+func Test9510(t *testing.T)                  { test9510(t) }
+func Test9557(t *testing.T)                  { test9557(t) }
+func Test10303(t *testing.T)                 { test10303(t, 10) }
+func Test11925(t *testing.T)                 { test11925(t) }
+func Test12030(t *testing.T)                 { test12030(t) }
+func Test14838(t *testing.T)                 { test14838(t) }
+func Test17065(t *testing.T)                 { test17065(t) }
+func Test17537(t *testing.T)                 { test17537(t) }
+func Test18126(t *testing.T)                 { test18126(t) }
+func Test18720(t *testing.T)                 { test18720(t) }
+func Test20129(t *testing.T)                 { test20129(t) }
+func Test20266(t *testing.T)                 { test20266(t) }
+func Test20369(t *testing.T)                 { test20369(t) }
+func Test20910(t *testing.T)                 { test20910(t) }
+func Test21708(t *testing.T)                 { test21708(t) }
+func Test21809(t *testing.T)                 { test21809(t) }
+func Test21897(t *testing.T)                 { test21897(t) }
+func Test22906(t *testing.T)                 { test22906(t) }
+func Test23356(t *testing.T)                 { test23356(t) }
+func Test24206(t *testing.T)                 { test24206(t) }
+func Test25143(t *testing.T)                 { test25143(t) }
+func Test26066(t *testing.T)                 { test26066(t) }
+func Test26213(t *testing.T)                 { test26213(t) }
+func Test27660(t *testing.T)                 { test27660(t) }
+func Test28896(t *testing.T)                 { test28896(t) }
+func Test30065(t *testing.T)                 { test30065(t) }
+func Test32579(t *testing.T)                 { test32579(t) }
+func Test31891(t *testing.T)                 { test31891(t) }
+func Test42018(t *testing.T)                 { test42018(t) }
+func Test45451(t *testing.T)                 { test45451(t) }
+func Test49633(t *testing.T)                 { test49633(t) }
+func TestAlign(t *testing.T)                 { testAlign(t) }
+func TestAtol(t *testing.T)                  { testAtol(t) }
+func TestBlocking(t *testing.T)              { testBlocking(t) }
+func TestBoolAlign(t *testing.T)             { testBoolAlign(t) }
+func TestCallGoWithString(t *testing.T)      { testCallGoWithString(t) }
+func TestCallback(t *testing.T)              { testCallback(t) }
+func TestCallbackCallers(t *testing.T)       { testCallbackCallers(t) }
+func TestCallbackGC(t *testing.T)            { testCallbackGC(t) }
+func TestCallbackPanic(t *testing.T)         { testCallbackPanic(t) }
+func TestCallbackPanicLocked(t *testing.T)   { testCallbackPanicLocked(t) }
+func TestCallbackPanicLoop(t *testing.T)     { testCallbackPanicLoop(t) }
+func TestCallbackStack(t *testing.T)         { testCallbackStack(t) }
+func TestCflags(t *testing.T)                { testCflags(t) }
+func TestCheckConst(t *testing.T)            { testCheckConst(t) }
+func TestConst(t *testing.T)                 { testConst(t) }
+func TestCthread(t *testing.T)               { testCthread(t) }
+func TestEnum(t *testing.T)                  { testEnum(t) }
+func TestNamedEnum(t *testing.T)             { testNamedEnum(t) }
+func TestCastToEnum(t *testing.T)            { testCastToEnum(t) }
+func TestErrno(t *testing.T)                 { testErrno(t) }
+func TestFpVar(t *testing.T)                 { testFpVar(t) }
+func TestGCC68255(t *testing.T)              { testGCC68255(t) }
+func TestHandle(t *testing.T)                { testHandle(t) }
+func TestHelpers(t *testing.T)               { testHelpers(t) }
+func TestLibgcc(t *testing.T)                { testLibgcc(t) }
+func TestMultipleAssign(t *testing.T)        { testMultipleAssign(t) }
+func TestNaming(t *testing.T)                { testNaming(t) }
+func TestPanicFromC(t *testing.T)            { testPanicFromC(t) }
+func TestPrintf(t *testing.T)                { testPrintf(t) }
+func TestReturnAfterGrow(t *testing.T)       { testReturnAfterGrow(t) }
+func TestReturnAfterGrowFromGo(t *testing.T) { testReturnAfterGrowFromGo(t) }
+func TestSetEnv(t *testing.T)                { testSetEnv(t) }
+func TestThreadLock(t *testing.T)            { testThreadLockFunc(t) }
+func TestUnsignedInt(t *testing.T)           { testUnsignedInt(t) }
+func TestZeroArgCallback(t *testing.T)       { testZeroArgCallback(t) }
+
+func BenchmarkCgoCall(b *testing.B)      { benchCgoCall(b) }
+func BenchmarkGoString(b *testing.B)     { benchGoString(b) }
+func BenchmarkCGoCallback(b *testing.B)  { benchCallback(b) }
+func BenchmarkCGoInCThread(b *testing.B) { benchCGoInCthread(b) }
diff --git a/src/cmd/cgo/internal/test/cgo_thread_lock.go b/src/cmd/cgo/internal/test/cgo_thread_lock.go
new file mode 100644
index 0000000..e874938
--- /dev/null
+++ b/src/cmd/cgo/internal/test/cgo_thread_lock.go
@@ -0,0 +1,57 @@
+// Copyright 2016 The Go 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:build linux
+
+package cgotest
+
+/*
+#include <unistd.h>
+#include <stdbool.h>
+#include <sys/syscall.h>
+void Gosched(void);
+static bool Ctid(void) {
+	long tid1 = syscall(SYS_gettid);
+	Gosched();
+	return tid1 == syscall(SYS_gettid);
+}
+*/
+import "C"
+
+import (
+	"runtime"
+	"testing"
+	"time"
+)
+
+//export Gosched
+func Gosched() {
+	runtime.Gosched()
+}
+
+func init() {
+	testThreadLockFunc = testThreadLock
+}
+
+func testThreadLock(t *testing.T) {
+	stop := make(chan int)
+	go func() {
+		// We need the G continue running,
+		// so the M has a chance to run this G.
+		for {
+			select {
+			case <-stop:
+				return
+			case <-time.After(time.Millisecond * 100):
+			}
+		}
+	}()
+	defer close(stop)
+
+	for i := 0; i < 1000; i++ {
+		if !C.Ctid() {
+			t.Fatalf("cgo has not locked OS thread")
+		}
+	}
+}
diff --git a/src/cmd/cgo/internal/test/cgo_unix_test.go b/src/cmd/cgo/internal/test/cgo_unix_test.go
new file mode 100644
index 0000000..5c1f9b7
--- /dev/null
+++ b/src/cmd/cgo/internal/test/cgo_unix_test.go
@@ -0,0 +1,13 @@
+// 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:build cgo && !windows
+
+package cgotest
+
+import "testing"
+
+func TestSigaltstack(t *testing.T) { testSigaltstack(t) }
+func TestSigprocmask(t *testing.T) { testSigprocmask(t) }
+func Test18146(t *testing.T)       { test18146(t) }
diff --git a/src/cmd/cgo/internal/test/cthread_unix.c b/src/cmd/cgo/internal/test/cthread_unix.c
new file mode 100644
index 0000000..d0da643
--- /dev/null
+++ b/src/cmd/cgo/internal/test/cthread_unix.c
@@ -0,0 +1,58 @@
+// Copyright 2013 The Go 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:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris
+
+#include <pthread.h>
+#include "_cgo_export.h"
+
+static void*
+addThread(void *p)
+{
+	int i, max;
+	
+	max = *(int*)p;
+	for(i=0; i<max; i++)
+		Add(i);
+	return 0;
+}
+
+void
+doAdd(int max, int nthread)
+{
+	enum { MaxThread = 20 };
+	int i;
+	pthread_t thread_id[MaxThread];
+	
+	if(nthread > MaxThread)
+		nthread = MaxThread;
+	for(i=0; i<nthread; i++)
+		pthread_create(&thread_id[i], 0, addThread, &max);
+	for(i=0; i<nthread; i++)
+		pthread_join(thread_id[i], 0);		
+}
+
+static void*
+goDummyCallbackThread(void* p)
+{
+	int i, max;
+
+	max = *(int*)p;
+	for(i=0; i<max; i++)
+		goDummy();
+	return NULL;
+}
+
+int
+callGoInCThread(int max)
+{
+	pthread_t thread;
+
+	if (pthread_create(&thread, NULL, goDummyCallbackThread, (void*)(&max)) != 0)
+		return -1;
+	if (pthread_join(thread, NULL) != 0)
+		return -1;
+
+	return max;
+}
diff --git a/src/cmd/cgo/internal/test/cthread_windows.c b/src/cmd/cgo/internal/test/cthread_windows.c
new file mode 100644
index 0000000..4e52209
--- /dev/null
+++ b/src/cmd/cgo/internal/test/cthread_windows.c
@@ -0,0 +1,59 @@
+// Copyright 2013 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#include <process.h>
+#include "_cgo_export.h"
+
+__stdcall
+static unsigned int
+addThread(void *p)
+{
+	int i, max;
+	
+	max = *(int*)p;
+	for(i=0; i<max; i++)
+		Add(i);
+	return 0;
+}
+
+void
+doAdd(int max, int nthread)
+{
+	enum { MaxThread = 20 };
+	int i;
+	uintptr_t thread_id[MaxThread];
+	
+	if(nthread > MaxThread)
+		nthread = MaxThread;
+	for(i=0; i<nthread; i++)
+		thread_id[i] = _beginthreadex(0, 0, addThread, &max, 0, 0);
+	for(i=0; i<nthread; i++) {
+		WaitForSingleObject((HANDLE)thread_id[i], INFINITE);
+		CloseHandle((HANDLE)thread_id[i]);
+	}
+}
+
+__stdcall
+static unsigned int
+goDummyCallbackThread(void* p)
+{
+	int i, max;
+
+	max = *(int*)p;
+	for(i=0; i<max; i++)
+		goDummy();
+	return 0;
+}
+
+int
+callGoInCThread(int max)
+{
+	uintptr_t thread_id;
+	thread_id = _beginthreadex(0, 0, goDummyCallbackThread, &max, 0, 0);
+	WaitForSingleObject((HANDLE)thread_id, INFINITE);
+	CloseHandle((HANDLE)thread_id);
+	return max;
+}
diff --git a/src/cmd/cgo/internal/test/gcc68255.go b/src/cmd/cgo/internal/test/gcc68255.go
new file mode 100644
index 0000000..f5493a9
--- /dev/null
+++ b/src/cmd/cgo/internal/test/gcc68255.go
@@ -0,0 +1,19 @@
+// 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:build cgo
+
+package cgotest
+
+import (
+	"testing"
+
+	"cmd/cgo/internal/test/gcc68255"
+)
+
+func testGCC68255(t *testing.T) {
+	if !gcc68255.F() {
+		t.Error("C global variable was not initialized")
+	}
+}
diff --git a/misc/cgo/test/gcc68255/a.go b/src/cmd/cgo/internal/test/gcc68255/a.go
similarity index 100%
rename from misc/cgo/test/gcc68255/a.go
rename to src/cmd/cgo/internal/test/gcc68255/a.go
diff --git a/misc/cgo/test/gcc68255/c.c b/src/cmd/cgo/internal/test/gcc68255/c.c
similarity index 100%
rename from misc/cgo/test/gcc68255/c.c
rename to src/cmd/cgo/internal/test/gcc68255/c.c
diff --git a/misc/cgo/test/gcc68255/c.h b/src/cmd/cgo/internal/test/gcc68255/c.h
similarity index 100%
rename from misc/cgo/test/gcc68255/c.h
rename to src/cmd/cgo/internal/test/gcc68255/c.h
diff --git a/src/cmd/cgo/internal/test/issue1435.go b/src/cmd/cgo/internal/test/issue1435.go
new file mode 100644
index 0000000..a672e26
--- /dev/null
+++ b/src/cmd/cgo/internal/test/issue1435.go
@@ -0,0 +1,203 @@
+// Copyright 2019 The Go 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:build linux && cgo
+
+package cgotest
+
+import (
+	"fmt"
+	"os"
+	"runtime"
+	"sort"
+	"strings"
+	"syscall"
+	"testing"
+)
+
+// #include <stdio.h>
+// #include <stdlib.h>
+// #include <pthread.h>
+// #include <unistd.h>
+// #include <sys/types.h>
+//
+// pthread_t *t = NULL;
+// pthread_mutex_t mu;
+// int nts = 0;
+// int all_done = 0;
+//
+// static void *aFn(void *vargp) {
+//   int done = 0;
+//   while (!done) {
+//     usleep(100);
+//     pthread_mutex_lock(&mu);
+//     done = all_done;
+//     pthread_mutex_unlock(&mu);
+//   }
+//   return NULL;
+// }
+//
+// void trial(int argc) {
+//   int i;
+//   nts = argc;
+//   t = calloc(nts, sizeof(pthread_t));
+//   pthread_mutex_init(&mu, NULL);
+//   for (i = 0; i < nts; i++) {
+//     pthread_create(&t[i], NULL, aFn, NULL);
+//   }
+// }
+//
+// void cleanup(void) {
+//   int i;
+//   pthread_mutex_lock(&mu);
+//   all_done = 1;
+//   pthread_mutex_unlock(&mu);
+//   for (i = 0; i < nts; i++) {
+//     pthread_join(t[i], NULL);
+//   }
+//   pthread_mutex_destroy(&mu);
+//   free(t);
+// }
+import "C"
+
+// compareStatus is used to confirm the contents of the thread
+// specific status files match expectations.
+func compareStatus(filter, expect string) error {
+	expected := filter + expect
+	pid := syscall.Getpid()
+	fs, err := os.ReadDir(fmt.Sprintf("/proc/%d/task", pid))
+	if err != nil {
+		return fmt.Errorf("unable to find %d tasks: %v", pid, err)
+	}
+	expectedProc := fmt.Sprintf("Pid:\t%d", pid)
+	foundAThread := false
+	for _, f := range fs {
+		tf := fmt.Sprintf("/proc/%s/status", f.Name())
+		d, err := os.ReadFile(tf)
+		if err != nil {
+			// There are a surprising number of ways this
+			// can error out on linux.  We've seen all of
+			// the following, so treat any error here as
+			// equivalent to the "process is gone":
+			//    os.IsNotExist(err),
+			//    "... : no such process",
+			//    "... : bad file descriptor.
+			continue
+		}
+		lines := strings.Split(string(d), "\n")
+		for _, line := range lines {
+			// Different kernel vintages pad differently.
+			line = strings.TrimSpace(line)
+			if strings.HasPrefix(line, "Pid:\t") {
+				// On loaded systems, it is possible
+				// for a TID to be reused really
+				// quickly. As such, we need to
+				// validate that the thread status
+				// info we just read is a task of the
+				// same process PID as we are
+				// currently running, and not a
+				// recently terminated thread
+				// resurfaced in a different process.
+				if line != expectedProc {
+					break
+				}
+				// Fall through in the unlikely case
+				// that filter at some point is
+				// "Pid:\t".
+			}
+			if strings.HasPrefix(line, filter) {
+				if line == expected {
+					foundAThread = true
+					break
+				}
+				if filter == "Groups:" && strings.HasPrefix(line, "Groups:\t") {
+					// https://github.com/golang/go/issues/46145
+					// Containers don't reliably output this line in sorted order so manually sort and compare that.
+					a := strings.Split(line[8:], " ")
+					sort.Strings(a)
+					got := strings.Join(a, " ")
+					if got == expected[8:] {
+						foundAThread = true
+						break
+					}
+
+				}
+				return fmt.Errorf("%q got:%q want:%q (bad) [pid=%d file:'%s' %v]\n", tf, line, expected, pid, string(d), expectedProc)
+			}
+		}
+	}
+	if !foundAThread {
+		return fmt.Errorf("found no thread /proc/<TID>/status files for process %q", expectedProc)
+	}
+	return nil
+}
+
+// test1435 test 9 glibc implemented setuid/gid syscall functions are
+// mapped.  This test is a slightly more expansive test than that of
+// src/syscall/syscall_linux_test.go:TestSetuidEtc() insofar as it
+// launches concurrent threads from C code via CGo and validates that
+// they are subject to the system calls being tested. For the actual
+// Go functionality being tested here, the syscall_linux_test version
+// is considered authoritative, but non-trivial improvements to that
+// should be mirrored here.
+func test1435(t *testing.T) {
+	if syscall.Getuid() != 0 {
+		t.Skip("skipping root only test")
+	}
+	if runtime.GOOS == "linux" {
+		if _, err := os.Stat("/etc/alpine-release"); err == nil {
+			t.Skip("skipping failing test on alpine - go.dev/issue/19938")
+		}
+	}
+
+	// Launch some threads in C.
+	const cts = 5
+	C.trial(cts)
+	defer C.cleanup()
+
+	vs := []struct {
+		call           string
+		fn             func() error
+		filter, expect string
+	}{
+		{call: "Setegid(1)", fn: func() error { return syscall.Setegid(1) }, filter: "Gid:", expect: "\t0\t1\t0\t1"},
+		{call: "Setegid(0)", fn: func() error { return syscall.Setegid(0) }, filter: "Gid:", expect: "\t0\t0\t0\t0"},
+
+		{call: "Seteuid(1)", fn: func() error { return syscall.Seteuid(1) }, filter: "Uid:", expect: "\t0\t1\t0\t1"},
+		{call: "Setuid(0)", fn: func() error { return syscall.Setuid(0) }, filter: "Uid:", expect: "\t0\t0\t0\t0"},
+
+		{call: "Setgid(1)", fn: func() error { return syscall.Setgid(1) }, filter: "Gid:", expect: "\t1\t1\t1\t1"},
+		{call: "Setgid(0)", fn: func() error { return syscall.Setgid(0) }, filter: "Gid:", expect: "\t0\t0\t0\t0"},
+
+		{call: "Setgroups([]int{0,1,2,3})", fn: func() error { return syscall.Setgroups([]int{0, 1, 2, 3}) }, filter: "Groups:", expect: "\t0 1 2 3"},
+		{call: "Setgroups(nil)", fn: func() error { return syscall.Setgroups(nil) }, filter: "Groups:", expect: ""},
+		{call: "Setgroups([]int{0})", fn: func() error { return syscall.Setgroups([]int{0}) }, filter: "Groups:", expect: "\t0"},
+
+		{call: "Setregid(101,0)", fn: func() error { return syscall.Setregid(101, 0) }, filter: "Gid:", expect: "\t101\t0\t0\t0"},
+		{call: "Setregid(0,102)", fn: func() error { return syscall.Setregid(0, 102) }, filter: "Gid:", expect: "\t0\t102\t102\t102"},
+		{call: "Setregid(0,0)", fn: func() error { return syscall.Setregid(0, 0) }, filter: "Gid:", expect: "\t0\t0\t0\t0"},
+
+		{call: "Setreuid(1,0)", fn: func() error { return syscall.Setreuid(1, 0) }, filter: "Uid:", expect: "\t1\t0\t0\t0"},
+		{call: "Setreuid(0,2)", fn: func() error { return syscall.Setreuid(0, 2) }, filter: "Uid:", expect: "\t0\t2\t2\t2"},
+		{call: "Setreuid(0,0)", fn: func() error { return syscall.Setreuid(0, 0) }, filter: "Uid:", expect: "\t0\t0\t0\t0"},
+
+		{call: "Setresgid(101,0,102)", fn: func() error { return syscall.Setresgid(101, 0, 102) }, filter: "Gid:", expect: "\t101\t0\t102\t0"},
+		{call: "Setresgid(0,102,101)", fn: func() error { return syscall.Setresgid(0, 102, 101) }, filter: "Gid:", expect: "\t0\t102\t101\t102"},
+		{call: "Setresgid(0,0,0)", fn: func() error { return syscall.Setresgid(0, 0, 0) }, filter: "Gid:", expect: "\t0\t0\t0\t0"},
+
+		{call: "Setresuid(1,0,2)", fn: func() error { return syscall.Setresuid(1, 0, 2) }, filter: "Uid:", expect: "\t1\t0\t2\t0"},
+		{call: "Setresuid(0,2,1)", fn: func() error { return syscall.Setresuid(0, 2, 1) }, filter: "Uid:", expect: "\t0\t2\t1\t2"},
+		{call: "Setresuid(0,0,0)", fn: func() error { return syscall.Setresuid(0, 0, 0) }, filter: "Uid:", expect: "\t0\t0\t0\t0"},
+	}
+
+	for i, v := range vs {
+		if err := v.fn(); err != nil {
+			t.Errorf("[%d] %q failed: %v", i, v.call, err)
+			continue
+		}
+		if err := compareStatus(v.filter, v.expect); err != nil {
+			t.Errorf("[%d] %q comparison: %v", i, v.call, err)
+		}
+	}
+}
diff --git a/src/cmd/cgo/internal/test/issue18146.go b/src/cmd/cgo/internal/test/issue18146.go
new file mode 100644
index 0000000..d302bd0
--- /dev/null
+++ b/src/cmd/cgo/internal/test/issue18146.go
@@ -0,0 +1,128 @@
+// Copyright 2016 The Go 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:build cgo && !windows
+
+// Issue 18146: pthread_create failure during syscall.Exec.
+
+package cgotest
+
+import (
+	"bytes"
+	"crypto/md5"
+	"os"
+	"os/exec"
+	"runtime"
+	"syscall"
+	"testing"
+	"time"
+)
+
+func test18146(t *testing.T) {
+	if testing.Short() {
+		t.Skip("skipping in short mode")
+	}
+
+	if runtime.GOOS == "darwin" || runtime.GOOS == "ios" {
+		t.Skipf("skipping flaky test on %s; see golang.org/issue/18202", runtime.GOOS)
+	}
+
+	if runtime.GOARCH == "mips" || runtime.GOARCH == "mips64" {
+		t.Skipf("skipping on %s", runtime.GOARCH)
+	}
+
+	attempts := 1000
+	threads := 4
+
+	// Restrict the number of attempts based on RLIMIT_NPROC.
+	// Tediously, RLIMIT_NPROC was left out of the syscall package,
+	// probably because it is not in POSIX.1, so we define it here.
+	// It is not defined on Solaris.
+	var nproc int
+	setNproc := true
+	switch runtime.GOOS {
+	default:
+		setNproc = false
+	case "aix":
+		nproc = 9
+	case "linux":
+		nproc = 6
+	case "darwin", "dragonfly", "freebsd", "netbsd", "openbsd":
+		nproc = 7
+	}
+	if setNproc {
+		var rlim syscall.Rlimit
+		if syscall.Getrlimit(nproc, &rlim) == nil {
+			max := int(rlim.Cur) / (threads + 5)
+			if attempts > max {
+				t.Logf("lowering attempts from %d to %d for RLIMIT_NPROC", attempts, max)
+				attempts = max
+			}
+		}
+	}
+
+	if os.Getenv("test18146") == "exec" {
+		runtime.GOMAXPROCS(1)
+		for n := threads; n > 0; n-- {
+			go func() {
+				for {
+					_ = md5.Sum([]byte("Hello, !"))
+				}
+			}()
+		}
+		runtime.GOMAXPROCS(threads)
+		argv := append(os.Args, "-test.run=NoSuchTestExists")
+		if err := syscall.Exec(os.Args[0], argv, os.Environ()); err != nil {
+			t.Fatal(err)
+		}
+	}
+
+	var cmds []*exec.Cmd
+	defer func() {
+		for _, cmd := range cmds {
+			cmd.Process.Kill()
+		}
+	}()
+
+	args := append(append([]string(nil), os.Args[1:]...), "-test.run=Test18146")
+	for n := attempts; n > 0; n-- {
+		cmd := exec.Command(os.Args[0], args...)
+		cmd.Env = append(os.Environ(), "test18146=exec")
+		buf := bytes.NewBuffer(nil)
+		cmd.Stdout = buf
+		cmd.Stderr = buf
+		if err := cmd.Start(); err != nil {
+			// We are starting so many processes that on
+			// some systems (problem seen on Darwin,
+			// Dragonfly, OpenBSD) the fork call will fail
+			// with EAGAIN.
+			if pe, ok := err.(*os.PathError); ok {
+				err = pe.Err
+			}
+			if se, ok := err.(syscall.Errno); ok && (se == syscall.EAGAIN || se == syscall.EMFILE) {
+				time.Sleep(time.Millisecond)
+				continue
+			}
+
+			t.Error(err)
+			return
+		}
+		cmds = append(cmds, cmd)
+	}
+
+	failures := 0
+	for _, cmd := range cmds {
+		err := cmd.Wait()
+		if err == nil {
+			continue
+		}
+
+		t.Errorf("syscall.Exec failed: %v\n%s", err, cmd.Stdout)
+		failures++
+	}
+
+	if failures > 0 {
+		t.Logf("Failed %v of %v attempts.", failures, len(cmds))
+	}
+}
diff --git a/misc/cgo/test/issue20266.go b/src/cmd/cgo/internal/test/issue20266.go
similarity index 100%
rename from misc/cgo/test/issue20266.go
rename to src/cmd/cgo/internal/test/issue20266.go
diff --git a/misc/cgo/test/issue20266/issue20266.h b/src/cmd/cgo/internal/test/issue20266/issue20266.h
similarity index 100%
rename from misc/cgo/test/issue20266/issue20266.h
rename to src/cmd/cgo/internal/test/issue20266/issue20266.h
diff --git a/misc/cgo/test/issue20910.c b/src/cmd/cgo/internal/test/issue20910.c
similarity index 100%
rename from misc/cgo/test/issue20910.c
rename to src/cmd/cgo/internal/test/issue20910.c
diff --git a/src/cmd/cgo/internal/test/issue21897.go b/src/cmd/cgo/internal/test/issue21897.go
new file mode 100644
index 0000000..cd3600a
--- /dev/null
+++ b/src/cmd/cgo/internal/test/issue21897.go
@@ -0,0 +1,56 @@
+// Copyright 2017 The Go 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:build darwin && cgo && !internal
+
+package cgotest
+
+/*
+#cgo LDFLAGS: -framework CoreFoundation
+#include <CoreFoundation/CoreFoundation.h>
+*/
+import "C"
+import (
+	"runtime/debug"
+	"testing"
+	"unsafe"
+)
+
+func test21897(t *testing.T) {
+	// Please write barrier, kick in soon.
+	defer debug.SetGCPercent(debug.SetGCPercent(1))
+
+	for i := 0; i < 10000; i++ {
+		testCFNumberRef()
+		testCFDateRef()
+		testCFBooleanRef()
+		// Allocate some memory, so eventually the write barrier is enabled
+		// and it will see writes of bad pointers in the test* functions below.
+		byteSliceSink = make([]byte, 1024)
+	}
+}
+
+var byteSliceSink []byte
+
+func testCFNumberRef() {
+	var v int64 = 0
+	xCFNumberRef = C.CFNumberCreate(C.kCFAllocatorSystemDefault, C.kCFNumberSInt64Type, unsafe.Pointer(&v))
+	//fmt.Printf("CFNumberRef: %x\n", uintptr(unsafe.Pointer(xCFNumberRef)))
+}
+
+var xCFNumberRef C.CFNumberRef
+
+func testCFDateRef() {
+	xCFDateRef = C.CFDateCreate(C.kCFAllocatorSystemDefault, 0) // 0 value is 1 Jan 2001 00:00:00 GMT
+	//fmt.Printf("CFDateRef: %x\n", uintptr(unsafe.Pointer(xCFDateRef)))
+}
+
+var xCFDateRef C.CFDateRef
+
+func testCFBooleanRef() {
+	xCFBooleanRef = C.kCFBooleanFalse
+	//fmt.Printf("CFBooleanRef: %x\n", uintptr(unsafe.Pointer(xCFBooleanRef)))
+}
+
+var xCFBooleanRef C.CFBooleanRef
diff --git a/src/cmd/cgo/internal/test/issue21897b.go b/src/cmd/cgo/internal/test/issue21897b.go
new file mode 100644
index 0000000..e12564c
--- /dev/null
+++ b/src/cmd/cgo/internal/test/issue21897b.go
@@ -0,0 +1,13 @@
+// Copyright 2017 The Go 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:build !darwin || !cgo || internal
+
+package cgotest
+
+import "testing"
+
+func test21897(t *testing.T) {
+	t.Skip("test runs only on darwin+cgo")
+}
diff --git a/src/cmd/cgo/internal/test/issue23555.go b/src/cmd/cgo/internal/test/issue23555.go
new file mode 100644
index 0000000..1232148
--- /dev/null
+++ b/src/cmd/cgo/internal/test/issue23555.go
@@ -0,0 +1,15 @@
+// Copyright 2018 The Go 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:build cgo
+
+// Test that we can have two identical cgo packages in a single binary.
+// No runtime test; just make sure it compiles.
+
+package cgotest
+
+import (
+	_ "cmd/cgo/internal/test/issue23555a"
+	_ "cmd/cgo/internal/test/issue23555b"
+)
diff --git a/misc/cgo/test/issue23555a/a.go b/src/cmd/cgo/internal/test/issue23555a/a.go
similarity index 100%
rename from misc/cgo/test/issue23555a/a.go
rename to src/cmd/cgo/internal/test/issue23555a/a.go
diff --git a/misc/cgo/test/issue23555b/a.go b/src/cmd/cgo/internal/test/issue23555b/a.go
similarity index 100%
rename from misc/cgo/test/issue23555b/a.go
rename to src/cmd/cgo/internal/test/issue23555b/a.go
diff --git a/src/cmd/cgo/internal/test/issue24161_darwin_test.go b/src/cmd/cgo/internal/test/issue24161_darwin_test.go
new file mode 100644
index 0000000..9d08751
--- /dev/null
+++ b/src/cmd/cgo/internal/test/issue24161_darwin_test.go
@@ -0,0 +1,33 @@
+// Copyright 2018 The Go 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:build cgo
+
+package cgotest
+
+import (
+	"testing"
+
+	"cmd/cgo/internal/test/issue24161arg"
+	"cmd/cgo/internal/test/issue24161e0"
+	"cmd/cgo/internal/test/issue24161e1"
+	"cmd/cgo/internal/test/issue24161e2"
+	"cmd/cgo/internal/test/issue24161res"
+)
+
+func Test24161Arg(t *testing.T) {
+	issue24161arg.Test(t)
+}
+func Test24161Res(t *testing.T) {
+	issue24161res.Test(t)
+}
+func Test24161Example0(t *testing.T) {
+	issue24161e0.Test(t)
+}
+func Test24161Example1(t *testing.T) {
+	issue24161e1.Test(t)
+}
+func Test24161Example2(t *testing.T) {
+	issue24161e2.Test(t)
+}
diff --git a/src/cmd/cgo/internal/test/issue24161arg/def.go b/src/cmd/cgo/internal/test/issue24161arg/def.go
new file mode 100644
index 0000000..acea3ae
--- /dev/null
+++ b/src/cmd/cgo/internal/test/issue24161arg/def.go
@@ -0,0 +1,17 @@
+// Copyright 2018 The Go 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:build darwin
+
+package issue24161arg
+
+/*
+#cgo LDFLAGS: -framework CoreFoundation
+#include <CoreFoundation/CoreFoundation.h>
+*/
+import "C"
+
+func test24161array() C.CFArrayRef {
+	return C.CFArrayCreate(0, nil, 0, nil)
+}
diff --git a/src/cmd/cgo/internal/test/issue24161arg/use.go b/src/cmd/cgo/internal/test/issue24161arg/use.go
new file mode 100644
index 0000000..7987105
--- /dev/null
+++ b/src/cmd/cgo/internal/test/issue24161arg/use.go
@@ -0,0 +1,19 @@
+// Copyright 2018 The Go 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:build darwin
+
+package issue24161arg
+
+/*
+#cgo LDFLAGS: -framework CoreFoundation
+#include <CoreFoundation/CoreFoundation.h>
+*/
+import "C"
+import "testing"
+
+func Test(t *testing.T) {
+	a := test24161array()
+	C.CFArrayCreateCopy(0, a)
+}
diff --git a/src/cmd/cgo/internal/test/issue24161e0/main.go b/src/cmd/cgo/internal/test/issue24161e0/main.go
new file mode 100644
index 0000000..5912fe2
--- /dev/null
+++ b/src/cmd/cgo/internal/test/issue24161e0/main.go
@@ -0,0 +1,29 @@
+// Copyright 2018 The Go 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:build darwin
+
+package issue24161e0
+
+/*
+#cgo CFLAGS: -x objective-c
+#cgo LDFLAGS: -framework CoreFoundation -framework Security
+#include <TargetConditionals.h>
+#include <CoreFoundation/CoreFoundation.h>
+#include <Security/Security.h>
+#if TARGET_OS_IPHONE == 0 && __MAC_OS_X_VERSION_MAX_ALLOWED < 101200
+  typedef CFStringRef SecKeyAlgorithm;
+  static CFDataRef SecKeyCreateSignature(SecKeyRef key, SecKeyAlgorithm algorithm, CFDataRef dataToSign, CFErrorRef *error){return NULL;}
+  #define kSecKeyAlgorithmECDSASignatureDigestX962SHA1 foo()
+  static SecKeyAlgorithm foo(void){return NULL;}
+#endif
+*/
+import "C"
+import "testing"
+
+func f1() {
+	C.SecKeyCreateSignature(0, C.kSecKeyAlgorithmECDSASignatureDigestX962SHA1, 0, nil)
+}
+
+func Test(t *testing.T) {}
diff --git a/src/cmd/cgo/internal/test/issue24161e1/main.go b/src/cmd/cgo/internal/test/issue24161e1/main.go
new file mode 100644
index 0000000..8c2bc6e
--- /dev/null
+++ b/src/cmd/cgo/internal/test/issue24161e1/main.go
@@ -0,0 +1,38 @@
+// Copyright 2018 The Go 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:build darwin
+
+package issue24161e1
+
+/*
+#cgo CFLAGS: -x objective-c
+#cgo LDFLAGS: -framework CoreFoundation -framework Security
+#include <TargetConditionals.h>
+#include <CoreFoundation/CoreFoundation.h>
+#include <Security/Security.h>
+#if TARGET_OS_IPHONE == 0 && __MAC_OS_X_VERSION_MAX_ALLOWED < 101200
+  typedef CFStringRef SecKeyAlgorithm;
+  static CFDataRef SecKeyCreateSignature(SecKeyRef key, SecKeyAlgorithm algorithm, CFDataRef dataToSign, CFErrorRef *error){return NULL;}
+  #define kSecKeyAlgorithmECDSASignatureDigestX962SHA1 foo()
+  static SecKeyAlgorithm foo(void){return NULL;}
+#endif
+*/
+import "C"
+import (
+	"fmt"
+	"testing"
+)
+
+func f1() {
+	C.SecKeyCreateSignature(0, C.kSecKeyAlgorithmECDSASignatureDigestX962SHA1, 0, nil)
+}
+
+func f2(e C.CFErrorRef) {
+	if desc := C.CFErrorCopyDescription(e); desc != 0 {
+		fmt.Println(desc)
+	}
+}
+
+func Test(t *testing.T) {}
diff --git a/src/cmd/cgo/internal/test/issue24161e2/main.go b/src/cmd/cgo/internal/test/issue24161e2/main.go
new file mode 100644
index 0000000..159f479
--- /dev/null
+++ b/src/cmd/cgo/internal/test/issue24161e2/main.go
@@ -0,0 +1,40 @@
+// Copyright 2018 The Go 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:build darwin
+
+package issue24161e2
+
+/*
+#cgo CFLAGS: -x objective-c
+#cgo LDFLAGS: -framework CoreFoundation -framework Security
+#include <TargetConditionals.h>
+#include <CoreFoundation/CoreFoundation.h>
+#include <Security/Security.h>
+#if TARGET_OS_IPHONE == 0 && __MAC_OS_X_VERSION_MAX_ALLOWED < 101200
+  typedef CFStringRef SecKeyAlgorithm;
+  static CFDataRef SecKeyCreateSignature(SecKeyRef key, SecKeyAlgorithm algorithm, CFDataRef dataToSign, CFErrorRef *error){return NULL;}
+  #define kSecKeyAlgorithmECDSASignatureDigestX962SHA1 foo()
+  static SecKeyAlgorithm foo(void){return NULL;}
+#endif
+*/
+import "C"
+import (
+	"fmt"
+	"testing"
+)
+
+var _ C.CFStringRef
+
+func f1() {
+	C.SecKeyCreateSignature(0, C.kSecKeyAlgorithmECDSASignatureDigestX962SHA1, 0, nil)
+}
+
+func f2(e C.CFErrorRef) {
+	if desc := C.CFErrorCopyDescription(e); desc != 0 {
+		fmt.Println(desc)
+	}
+}
+
+func Test(t *testing.T) {}
diff --git a/src/cmd/cgo/internal/test/issue24161res/restype.go b/src/cmd/cgo/internal/test/issue24161res/restype.go
new file mode 100644
index 0000000..07cb98d
--- /dev/null
+++ b/src/cmd/cgo/internal/test/issue24161res/restype.go
@@ -0,0 +1,23 @@
+// Copyright 2018 The Go 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:build darwin
+
+package issue24161res
+
+/*
+#cgo LDFLAGS: -framework CoreFoundation
+#include <CoreFoundation/CoreFoundation.h>
+*/
+import "C"
+import (
+	"reflect"
+	"testing"
+)
+
+func Test(t *testing.T) {
+	if k := reflect.TypeOf(C.CFArrayCreate(0, nil, 0, nil)).Kind(); k != reflect.Uintptr {
+		t.Fatalf("bad kind %s\n", k)
+	}
+}
diff --git a/misc/cgo/test/issue26213/jni.h b/src/cmd/cgo/internal/test/issue26213/jni.h
similarity index 100%
rename from misc/cgo/test/issue26213/jni.h
rename to src/cmd/cgo/internal/test/issue26213/jni.h
diff --git a/misc/cgo/test/issue26213/test26213.go b/src/cmd/cgo/internal/test/issue26213/test26213.go
similarity index 100%
rename from misc/cgo/test/issue26213/test26213.go
rename to src/cmd/cgo/internal/test/issue26213/test26213.go
diff --git a/src/cmd/cgo/internal/test/issue26430.go b/src/cmd/cgo/internal/test/issue26430.go
new file mode 100644
index 0000000..837a745
--- /dev/null
+++ b/src/cmd/cgo/internal/test/issue26430.go
@@ -0,0 +1,12 @@
+// Copyright 2018 The Go 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:build cgo
+
+// Issue 26430: incomplete typedef leads to inconsistent typedefs error.
+// No runtime test; just make sure it compiles.
+
+package cgotest
+
+import _ "cmd/cgo/internal/test/issue26430"
diff --git a/misc/cgo/test/issue26430/a.go b/src/cmd/cgo/internal/test/issue26430/a.go
similarity index 100%
rename from misc/cgo/test/issue26430/a.go
rename to src/cmd/cgo/internal/test/issue26430/a.go
diff --git a/misc/cgo/test/issue26430/b.go b/src/cmd/cgo/internal/test/issue26430/b.go
similarity index 100%
rename from misc/cgo/test/issue26430/b.go
rename to src/cmd/cgo/internal/test/issue26430/b.go
diff --git a/src/cmd/cgo/internal/test/issue26743.go b/src/cmd/cgo/internal/test/issue26743.go
new file mode 100644
index 0000000..b6e1ac5
--- /dev/null
+++ b/src/cmd/cgo/internal/test/issue26743.go
@@ -0,0 +1,12 @@
+// Copyright 2018 The Go 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:build cgo
+
+// Issue 26743: typedef of uint leads to inconsistent typedefs error.
+// No runtime test; just make sure it compiles.
+
+package cgotest
+
+import _ "cmd/cgo/internal/test/issue26743"
diff --git a/misc/cgo/test/issue26743/a.go b/src/cmd/cgo/internal/test/issue26743/a.go
similarity index 100%
rename from misc/cgo/test/issue26743/a.go
rename to src/cmd/cgo/internal/test/issue26743/a.go
diff --git a/misc/cgo/test/issue26743/b.go b/src/cmd/cgo/internal/test/issue26743/b.go
similarity index 100%
rename from misc/cgo/test/issue26743/b.go
rename to src/cmd/cgo/internal/test/issue26743/b.go
diff --git a/misc/cgo/test/issue27054/egl.h b/src/cmd/cgo/internal/test/issue27054/egl.h
similarity index 100%
rename from misc/cgo/test/issue27054/egl.h
rename to src/cmd/cgo/internal/test/issue27054/egl.h
diff --git a/misc/cgo/test/issue27054/test27054.go b/src/cmd/cgo/internal/test/issue27054/test27054.go
similarity index 100%
rename from misc/cgo/test/issue27054/test27054.go
rename to src/cmd/cgo/internal/test/issue27054/test27054.go
diff --git a/src/cmd/cgo/internal/test/issue27340.go b/src/cmd/cgo/internal/test/issue27340.go
new file mode 100644
index 0000000..a6de328
--- /dev/null
+++ b/src/cmd/cgo/internal/test/issue27340.go
@@ -0,0 +1,14 @@
+// Copyright 2018 The Go 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:build cgo
+
+// Failed to resolve typedefs consistently.
+// No runtime test; just make sure it compiles.
+
+package cgotest
+
+import "cmd/cgo/internal/test/issue27340"
+
+var issue27340Var = issue27340.Issue27340GoFunc
diff --git a/misc/cgo/test/issue27340/a.go b/src/cmd/cgo/internal/test/issue27340/a.go
similarity index 100%
rename from misc/cgo/test/issue27340/a.go
rename to src/cmd/cgo/internal/test/issue27340/a.go
diff --git a/src/cmd/cgo/internal/test/issue29563.go b/src/cmd/cgo/internal/test/issue29563.go
new file mode 100644
index 0000000..f507759
--- /dev/null
+++ b/src/cmd/cgo/internal/test/issue29563.go
@@ -0,0 +1,12 @@
+// Copyright 2019 The Go 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:build cgo && !windows
+
+// Issue 29563: internal linker fails on duplicate weak symbols.
+// No runtime test; just make sure it compiles.
+
+package cgotest
+
+import _ "cmd/cgo/internal/test/issue29563"
diff --git a/misc/cgo/test/issue29563/weak.go b/src/cmd/cgo/internal/test/issue29563/weak.go
similarity index 100%
rename from misc/cgo/test/issue29563/weak.go
rename to src/cmd/cgo/internal/test/issue29563/weak.go
diff --git a/misc/cgo/test/issue29563/weak1.c b/src/cmd/cgo/internal/test/issue29563/weak1.c
similarity index 100%
rename from misc/cgo/test/issue29563/weak1.c
rename to src/cmd/cgo/internal/test/issue29563/weak1.c
diff --git a/misc/cgo/test/issue29563/weak2.c b/src/cmd/cgo/internal/test/issue29563/weak2.c
similarity index 100%
rename from misc/cgo/test/issue29563/weak2.c
rename to src/cmd/cgo/internal/test/issue29563/weak2.c
diff --git a/src/cmd/cgo/internal/test/issue30527.go b/src/cmd/cgo/internal/test/issue30527.go
new file mode 100644
index 0000000..d3e57b6
--- /dev/null
+++ b/src/cmd/cgo/internal/test/issue30527.go
@@ -0,0 +1,16 @@
+// Copyright 2019 The Go 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:build cgo
+
+// Issue 30527: function call rewriting casts untyped
+// constants to int because of ":=" usage.
+
+package cgotest
+
+import "cmd/cgo/internal/test/issue30527"
+
+func issue30527G() {
+	issue30527.G(nil)
+}
diff --git a/misc/cgo/test/issue30527/a.go b/src/cmd/cgo/internal/test/issue30527/a.go
similarity index 100%
rename from misc/cgo/test/issue30527/a.go
rename to src/cmd/cgo/internal/test/issue30527/a.go
diff --git a/misc/cgo/test/issue30527/b.go b/src/cmd/cgo/internal/test/issue30527/b.go
similarity index 100%
rename from misc/cgo/test/issue30527/b.go
rename to src/cmd/cgo/internal/test/issue30527/b.go
diff --git a/misc/cgo/test/issue31891.c b/src/cmd/cgo/internal/test/issue31891.c
similarity index 100%
rename from misc/cgo/test/issue31891.c
rename to src/cmd/cgo/internal/test/issue31891.c
diff --git a/src/cmd/cgo/internal/test/issue4029.c b/src/cmd/cgo/internal/test/issue4029.c
new file mode 100644
index 0000000..212d692
--- /dev/null
+++ b/src/cmd/cgo/internal/test/issue4029.c
@@ -0,0 +1,29 @@
+// 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:build !windows && !static && (!darwin || (!internal_pie && !arm64))
+
+#include <stdint.h>
+#include <dlfcn.h>
+
+// Write our own versions of dlopen/dlsym/dlclose so that we represent
+// the opaque handle as a Go uintptr rather than a Go pointer to avoid
+// garbage collector confusion.  See issue 23663.
+
+uintptr_t dlopen4029(char* name, int flags) {
+	return (uintptr_t)(dlopen(name, flags));
+}
+
+uintptr_t dlsym4029(uintptr_t handle, char* name) {
+	return (uintptr_t)(dlsym((void*)(handle), name));
+}
+
+int dlclose4029(uintptr_t handle) {
+	return dlclose((void*)(handle));
+}
+
+void call4029(void *arg) {
+	void (*fn)(void) = arg;
+	fn();
+}
diff --git a/src/cmd/cgo/internal/test/issue4029.go b/src/cmd/cgo/internal/test/issue4029.go
new file mode 100644
index 0000000..686b767
--- /dev/null
+++ b/src/cmd/cgo/internal/test/issue4029.go
@@ -0,0 +1,77 @@
+// 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:build !windows && !static && (!darwin || (!internal_pie && !arm64))
+
+// Excluded in darwin internal linking PIE mode, as dynamic export is not
+// supported.
+// Excluded in internal linking mode on darwin/arm64, as it is always PIE.
+
+package cgotest
+
+/*
+#include <stdint.h>
+#include <dlfcn.h>
+#cgo linux LDFLAGS: -ldl
+
+extern uintptr_t dlopen4029(char*, int);
+extern uintptr_t dlsym4029(uintptr_t, char*);
+extern int dlclose4029(uintptr_t);
+
+extern void call4029(uintptr_t arg);
+*/
+import "C"
+
+import (
+	"testing"
+)
+
+var callbacks int
+
+//export IMPIsOpaque
+func IMPIsOpaque() {
+	callbacks++
+}
+
+//export IMPInitWithFrame
+func IMPInitWithFrame() {
+	callbacks++
+}
+
+//export IMPDrawRect
+func IMPDrawRect() {
+	callbacks++
+}
+
+//export IMPWindowResize
+func IMPWindowResize() {
+	callbacks++
+}
+
+func test4029(t *testing.T) {
+	loadThySelf(t, "IMPWindowResize")
+	loadThySelf(t, "IMPDrawRect")
+	loadThySelf(t, "IMPInitWithFrame")
+	loadThySelf(t, "IMPIsOpaque")
+	if callbacks != 4 {
+		t.Errorf("got %d callbacks, expected 4", callbacks)
+	}
+}
+
+func loadThySelf(t *testing.T, symbol string) {
+	this_process := C.dlopen4029(nil, C.RTLD_NOW)
+	if this_process == 0 {
+		t.Error("dlopen:", C.GoString(C.dlerror()))
+		return
+	}
+	defer C.dlclose4029(this_process)
+
+	symbol_address := C.dlsym4029(this_process, C.CString(symbol))
+	if symbol_address == 0 {
+		t.Error("dlsym:", C.GoString(C.dlerror()))
+		return
+	}
+	t.Log(symbol, symbol_address)
+	C.call4029(symbol_address)
+}
diff --git a/src/cmd/cgo/internal/test/issue4029w.go b/src/cmd/cgo/internal/test/issue4029w.go
new file mode 100644
index 0000000..91dad6a
--- /dev/null
+++ b/src/cmd/cgo/internal/test/issue4029w.go
@@ -0,0 +1,12 @@
+// 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:build windows || static || (darwin && internal_pie) || (darwin && arm64)
+
+package cgotest
+
+import "testing"
+
+func test4029(t *testing.T) {
+}
diff --git a/src/cmd/cgo/internal/test/issue41761.go b/src/cmd/cgo/internal/test/issue41761.go
new file mode 100644
index 0000000..27d9047
--- /dev/null
+++ b/src/cmd/cgo/internal/test/issue41761.go
@@ -0,0 +1,20 @@
+// Copyright 2020 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package cgotest
+
+/*
+   typedef struct S41761 S41761;
+*/
+import "C"
+
+import (
+	"cmd/cgo/internal/test/issue41761a"
+	"testing"
+)
+
+func test41761(t *testing.T) {
+	var x issue41761a.T
+	_ = (*C.struct_S41761)(x.X)
+}
diff --git a/misc/cgo/test/issue41761a/a.go b/src/cmd/cgo/internal/test/issue41761a/a.go
similarity index 100%
rename from misc/cgo/test/issue41761a/a.go
rename to src/cmd/cgo/internal/test/issue41761a/a.go
diff --git a/src/cmd/cgo/internal/test/issue42018.go b/src/cmd/cgo/internal/test/issue42018.go
new file mode 100644
index 0000000..6b369bf
--- /dev/null
+++ b/src/cmd/cgo/internal/test/issue42018.go
@@ -0,0 +1,13 @@
+// Copyright 2021 The Go 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:build !windows
+
+package cgotest
+
+import "testing"
+
+func test42018(t *testing.T) {
+	t.Skip("skipping Windows-only test")
+}
diff --git a/misc/cgo/test/issue42018_windows.go b/src/cmd/cgo/internal/test/issue42018_windows.go
similarity index 100%
rename from misc/cgo/test/issue42018_windows.go
rename to src/cmd/cgo/internal/test/issue42018_windows.go
diff --git a/misc/cgo/test/issue42495.go b/src/cmd/cgo/internal/test/issue42495.go
similarity index 100%
rename from misc/cgo/test/issue42495.go
rename to src/cmd/cgo/internal/test/issue42495.go
diff --git a/misc/cgo/test/issue4273.c b/src/cmd/cgo/internal/test/issue4273.c
similarity index 100%
rename from misc/cgo/test/issue4273.c
rename to src/cmd/cgo/internal/test/issue4273.c
diff --git a/misc/cgo/test/issue4273b.c b/src/cmd/cgo/internal/test/issue4273b.c
similarity index 100%
rename from misc/cgo/test/issue4273b.c
rename to src/cmd/cgo/internal/test/issue4273b.c
diff --git a/misc/cgo/test/issue4339.c b/src/cmd/cgo/internal/test/issue4339.c
similarity index 100%
rename from misc/cgo/test/issue4339.c
rename to src/cmd/cgo/internal/test/issue4339.c
diff --git a/misc/cgo/test/issue4339.h b/src/cmd/cgo/internal/test/issue4339.h
similarity index 100%
rename from misc/cgo/test/issue4339.h
rename to src/cmd/cgo/internal/test/issue4339.h
diff --git a/src/cmd/cgo/internal/test/issue43639.go b/src/cmd/cgo/internal/test/issue43639.go
new file mode 100644
index 0000000..c297bfe
--- /dev/null
+++ b/src/cmd/cgo/internal/test/issue43639.go
@@ -0,0 +1,11 @@
+// Copyright 2021 The Go 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:build cgo
+
+package cgotest
+
+// Issue 43639: No runtime test needed, make sure package cmd/cgo/internal/test/issue43639 compiles well.
+
+import _ "cmd/cgo/internal/test/issue43639"
diff --git a/misc/cgo/test/issue43639/a.go b/src/cmd/cgo/internal/test/issue43639/a.go
similarity index 100%
rename from misc/cgo/test/issue43639/a.go
rename to src/cmd/cgo/internal/test/issue43639/a.go
diff --git a/src/cmd/cgo/internal/test/issue52611.go b/src/cmd/cgo/internal/test/issue52611.go
new file mode 100644
index 0000000..9082a53
--- /dev/null
+++ b/src/cmd/cgo/internal/test/issue52611.go
@@ -0,0 +1,15 @@
+// Copyright 2022 The Go 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:build cgo
+
+// Issue 52611: inconsistent compiler behaviour when compiling a C.struct.
+// No runtime test; just make sure it compiles.
+
+package cgotest
+
+import (
+	_ "cmd/cgo/internal/test/issue52611a"
+	_ "cmd/cgo/internal/test/issue52611b"
+)
diff --git a/misc/cgo/test/issue52611a/a.go b/src/cmd/cgo/internal/test/issue52611a/a.go
similarity index 100%
rename from misc/cgo/test/issue52611a/a.go
rename to src/cmd/cgo/internal/test/issue52611a/a.go
diff --git a/misc/cgo/test/issue52611a/b.go b/src/cmd/cgo/internal/test/issue52611a/b.go
similarity index 100%
rename from misc/cgo/test/issue52611a/b.go
rename to src/cmd/cgo/internal/test/issue52611a/b.go
diff --git a/misc/cgo/test/issue52611b/a.go b/src/cmd/cgo/internal/test/issue52611b/a.go
similarity index 100%
rename from misc/cgo/test/issue52611b/a.go
rename to src/cmd/cgo/internal/test/issue52611b/a.go
diff --git a/misc/cgo/test/issue52611b/b.go b/src/cmd/cgo/internal/test/issue52611b/b.go
similarity index 100%
rename from misc/cgo/test/issue52611b/b.go
rename to src/cmd/cgo/internal/test/issue52611b/b.go
diff --git a/misc/cgo/test/issue5548_c.c b/src/cmd/cgo/internal/test/issue5548_c.c
similarity index 100%
rename from misc/cgo/test/issue5548_c.c
rename to src/cmd/cgo/internal/test/issue5548_c.c
diff --git a/misc/cgo/test/issue5740a.c b/src/cmd/cgo/internal/test/issue5740a.c
similarity index 100%
rename from misc/cgo/test/issue5740a.c
rename to src/cmd/cgo/internal/test/issue5740a.c
diff --git a/misc/cgo/test/issue5740b.c b/src/cmd/cgo/internal/test/issue5740b.c
similarity index 100%
rename from misc/cgo/test/issue5740b.c
rename to src/cmd/cgo/internal/test/issue5740b.c
diff --git a/misc/cgo/test/issue6833_c.c b/src/cmd/cgo/internal/test/issue6833_c.c
similarity index 100%
rename from misc/cgo/test/issue6833_c.c
rename to src/cmd/cgo/internal/test/issue6833_c.c
diff --git a/misc/cgo/test/issue6907export_c.c b/src/cmd/cgo/internal/test/issue6907export_c.c
similarity index 100%
rename from misc/cgo/test/issue6907export_c.c
rename to src/cmd/cgo/internal/test/issue6907export_c.c
diff --git a/src/cmd/cgo/internal/test/issue6997_linux.c b/src/cmd/cgo/internal/test/issue6997_linux.c
new file mode 100644
index 0000000..c6d251b
--- /dev/null
+++ b/src/cmd/cgo/internal/test/issue6997_linux.c
@@ -0,0 +1,28 @@
+// 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:build !android
+
+#include <pthread.h>
+#include <stdio.h>
+#include <unistd.h>
+
+static pthread_t thread;
+
+static void* threadfunc(void* dummy) {
+	while(1) {
+		sleep(1);
+	}
+}
+
+int StartThread() {
+	return pthread_create(&thread, NULL, &threadfunc, NULL);
+}
+
+int CancelThread() {
+	void *r;
+	pthread_cancel(thread);
+	pthread_join(thread, &r);
+	return (r == PTHREAD_CANCELED);
+}
diff --git a/src/cmd/cgo/internal/test/issue6997_linux.go b/src/cmd/cgo/internal/test/issue6997_linux.go
new file mode 100644
index 0000000..1de5edd
--- /dev/null
+++ b/src/cmd/cgo/internal/test/issue6997_linux.go
@@ -0,0 +1,44 @@
+// 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:build !android
+
+// Test that pthread_cancel works as expected
+// (NPTL uses SIGRTMIN to implement thread cancellation)
+// See https://golang.org/issue/6997
+package cgotest
+
+/*
+#cgo CFLAGS: -pthread
+#cgo LDFLAGS: -pthread
+extern int StartThread();
+extern int CancelThread();
+*/
+import "C"
+
+import (
+	"testing"
+	"time"
+)
+
+func test6997(t *testing.T) {
+	r := C.StartThread()
+	if r != 0 {
+		t.Error("pthread_create failed")
+	}
+	c := make(chan C.int)
+	go func() {
+		time.Sleep(500 * time.Millisecond)
+		c <- C.CancelThread()
+	}()
+
+	select {
+	case r = <-c:
+		if r == 0 {
+			t.Error("pthread finished but wasn't canceled??")
+		}
+	case <-time.After(30 * time.Second):
+		t.Error("hung in pthread_cancel/pthread_join")
+	}
+}
diff --git a/misc/cgo/test/issue7234_test.go b/src/cmd/cgo/internal/test/issue7234_test.go
similarity index 100%
rename from misc/cgo/test/issue7234_test.go
rename to src/cmd/cgo/internal/test/issue7234_test.go
diff --git a/misc/cgo/test/issue8148.c b/src/cmd/cgo/internal/test/issue8148.c
similarity index 100%
rename from misc/cgo/test/issue8148.c
rename to src/cmd/cgo/internal/test/issue8148.c
diff --git a/misc/cgo/test/issue8148.go b/src/cmd/cgo/internal/test/issue8148.go
similarity index 100%
rename from misc/cgo/test/issue8148.go
rename to src/cmd/cgo/internal/test/issue8148.go
diff --git a/misc/cgo/test/issue8331.h b/src/cmd/cgo/internal/test/issue8331.h
similarity index 100%
rename from misc/cgo/test/issue8331.h
rename to src/cmd/cgo/internal/test/issue8331.h
diff --git a/src/cmd/cgo/internal/test/issue8517.go b/src/cmd/cgo/internal/test/issue8517.go
new file mode 100644
index 0000000..2261513
--- /dev/null
+++ b/src/cmd/cgo/internal/test/issue8517.go
@@ -0,0 +1,13 @@
+// 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:build !windows
+
+package cgotest
+
+import "testing"
+
+func test8517(t *testing.T) {
+	t.Skip("skipping windows only test")
+}
diff --git a/misc/cgo/test/issue8517_windows.c b/src/cmd/cgo/internal/test/issue8517_windows.c
similarity index 100%
rename from misc/cgo/test/issue8517_windows.c
rename to src/cmd/cgo/internal/test/issue8517_windows.c
diff --git a/misc/cgo/test/issue8517_windows.go b/src/cmd/cgo/internal/test/issue8517_windows.go
similarity index 100%
rename from misc/cgo/test/issue8517_windows.go
rename to src/cmd/cgo/internal/test/issue8517_windows.go
diff --git a/src/cmd/cgo/internal/test/issue8694.go b/src/cmd/cgo/internal/test/issue8694.go
new file mode 100644
index 0000000..3b8f065
--- /dev/null
+++ b/src/cmd/cgo/internal/test/issue8694.go
@@ -0,0 +1,40 @@
+// 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:build !android
+
+package cgotest
+
+/*
+#include <complex.h>
+
+complex float complexFloatSquared(complex float a) { return a*a; }
+complex double complexDoubleSquared(complex double a) { return a*a; }
+*/
+import "C"
+
+import (
+	"runtime"
+	"testing"
+)
+
+func test8694(t *testing.T) {
+	if runtime.GOARCH == "arm" {
+		t.Skip("test8694 is disabled on ARM because 5l cannot handle thumb library.")
+	}
+	// Really just testing that this compiles, but check answer anyway.
+	x := C.complexfloat(2 + 3i)
+	x2 := x * x
+	cx2 := C.complexFloatSquared(x)
+	if cx2 != x2 {
+		t.Errorf("C.complexFloatSquared(%v) = %v, want %v", x, cx2, x2)
+	}
+
+	y := C.complexdouble(2 + 3i)
+	y2 := y * y
+	cy2 := C.complexDoubleSquared(y)
+	if cy2 != y2 {
+		t.Errorf("C.complexDoubleSquared(%v) = %v, want %v", y, cy2, y2)
+	}
+}
diff --git a/src/cmd/cgo/internal/test/issue8756.go b/src/cmd/cgo/internal/test/issue8756.go
new file mode 100644
index 0000000..817f449
--- /dev/null
+++ b/src/cmd/cgo/internal/test/issue8756.go
@@ -0,0 +1,17 @@
+package cgotest
+
+/*
+#cgo !darwin LDFLAGS: -lm
+#include <math.h>
+*/
+import "C"
+import (
+	"testing"
+
+	"cmd/cgo/internal/test/issue8756"
+)
+
+func test8756(t *testing.T) {
+	issue8756.Pow()
+	C.pow(1, 2)
+}
diff --git a/src/cmd/cgo/internal/test/issue8756/issue8756.go b/src/cmd/cgo/internal/test/issue8756/issue8756.go
new file mode 100644
index 0000000..223397f
--- /dev/null
+++ b/src/cmd/cgo/internal/test/issue8756/issue8756.go
@@ -0,0 +1,11 @@
+package issue8756
+
+/*
+#cgo !darwin LDFLAGS: -lm
+#include <math.h>
+*/
+import "C"
+
+func Pow() {
+	C.pow(1, 2)
+}
diff --git a/misc/cgo/test/issue8811.c b/src/cmd/cgo/internal/test/issue8811.c
similarity index 100%
rename from misc/cgo/test/issue8811.c
rename to src/cmd/cgo/internal/test/issue8811.c
diff --git a/src/cmd/cgo/internal/test/issue8828.go b/src/cmd/cgo/internal/test/issue8828.go
new file mode 100644
index 0000000..9904a66
--- /dev/null
+++ b/src/cmd/cgo/internal/test/issue8828.go
@@ -0,0 +1,16 @@
+// 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:build cgo
+
+// Issue 8828: compiling a file with -compiler=gccgo fails if a .c file
+// has the same name as compiled directory.
+
+package cgotest
+
+import "cmd/cgo/internal/test/issue8828"
+
+func p() {
+	issue8828.Bar()
+}
diff --git a/misc/cgo/test/issue8828/issue8828.c b/src/cmd/cgo/internal/test/issue8828/issue8828.c
similarity index 100%
rename from misc/cgo/test/issue8828/issue8828.c
rename to src/cmd/cgo/internal/test/issue8828/issue8828.c
diff --git a/misc/cgo/test/issue8828/trivial.go b/src/cmd/cgo/internal/test/issue8828/trivial.go
similarity index 100%
rename from misc/cgo/test/issue8828/trivial.go
rename to src/cmd/cgo/internal/test/issue8828/trivial.go
diff --git a/src/cmd/cgo/internal/test/issue9026.go b/src/cmd/cgo/internal/test/issue9026.go
new file mode 100644
index 0000000..bab06ba
--- /dev/null
+++ b/src/cmd/cgo/internal/test/issue9026.go
@@ -0,0 +1,15 @@
+// Copyright 2023 The Go 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:build cgo
+
+package cgotest
+
+import (
+	"testing"
+
+	"cmd/cgo/internal/test/issue9026"
+)
+
+func test9026(t *testing.T) { issue9026.Test(t) }
diff --git a/misc/cgo/test/issue9026/issue9026.go b/src/cmd/cgo/internal/test/issue9026/issue9026.go
similarity index 100%
rename from misc/cgo/test/issue9026/issue9026.go
rename to src/cmd/cgo/internal/test/issue9026/issue9026.go
diff --git a/src/cmd/cgo/internal/test/issue9400/asm_386.s b/src/cmd/cgo/internal/test/issue9400/asm_386.s
new file mode 100644
index 0000000..8a38301
--- /dev/null
+++ b/src/cmd/cgo/internal/test/issue9400/asm_386.s
@@ -0,0 +1,27 @@
+// 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:build gc
+
+#include "textflag.h"
+
+TEXT ·RewindAndSetgid(SB),NOSPLIT,$0-0
+	MOVL	$·Baton(SB), BX
+	// Rewind stack pointer so anything that happens on the stack
+	// will clobber the test pattern created by the caller
+	ADDL	$(1024 * 8), SP
+
+	// Ask signaller to setgid
+	MOVL	$1, (BX)
+
+	// Wait for setgid completion
+loop:
+	PAUSE
+	MOVL	(BX), AX
+	CMPL	AX, $0
+	JNE	loop
+
+	// Restore stack
+	SUBL	$(1024 * 8), SP
+	RET
diff --git a/src/cmd/cgo/internal/test/issue9400/asm_amd64x.s b/src/cmd/cgo/internal/test/issue9400/asm_amd64x.s
new file mode 100644
index 0000000..07adaf7
--- /dev/null
+++ b/src/cmd/cgo/internal/test/issue9400/asm_amd64x.s
@@ -0,0 +1,26 @@
+// 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:build (amd64 || amd64p32) && gc
+
+#include "textflag.h"
+
+TEXT ·RewindAndSetgid(SB),NOSPLIT,$0-0
+	// Rewind stack pointer so anything that happens on the stack
+	// will clobber the test pattern created by the caller
+	ADDQ	$(1024 * 8), SP
+
+	// Ask signaller to setgid
+	MOVL	$1, ·Baton(SB)
+
+	// Wait for setgid completion
+loop:
+	PAUSE
+	MOVL	·Baton(SB), AX
+	CMPL	AX, $0
+	JNE	loop
+
+	// Restore stack
+	SUBQ	$(1024 * 8), SP
+	RET
diff --git a/src/cmd/cgo/internal/test/issue9400/asm_arm.s b/src/cmd/cgo/internal/test/issue9400/asm_arm.s
new file mode 100644
index 0000000..4126172
--- /dev/null
+++ b/src/cmd/cgo/internal/test/issue9400/asm_arm.s
@@ -0,0 +1,39 @@
+// 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:build gc
+
+#include "textflag.h"
+
+TEXT cas<>(SB),NOSPLIT,$0
+	MOVW	$0xffff0fc0, R15 // R15 is PC
+
+TEXT ·RewindAndSetgid(SB),NOSPLIT|NOFRAME,$0-0
+	// Save link register
+	MOVW	R14, R4
+
+	// Rewind stack pointer so anything that happens on the stack
+	// will clobber the test pattern created by the caller
+	ADD	$(1024 * 8), R13
+
+	// Ask signaller to setgid
+	MOVW	$·Baton(SB), R2
+storeloop:
+	MOVW	0(R2), R0
+	MOVW	$1, R1
+	BL	cas<>(SB)
+	BCC	storeloop
+
+	// Wait for setgid completion
+loop:
+	MOVW	$0, R0
+	MOVW	$0, R1
+	BL	cas<>(SB)
+	BCC	loop
+
+	// Restore stack
+	SUB	$(1024 * 8), R13
+
+	MOVW	R4, R14
+	RET
diff --git a/src/cmd/cgo/internal/test/issue9400/asm_arm64.s b/src/cmd/cgo/internal/test/issue9400/asm_arm64.s
new file mode 100644
index 0000000..affbd71
--- /dev/null
+++ b/src/cmd/cgo/internal/test/issue9400/asm_arm64.s
@@ -0,0 +1,39 @@
+// 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:build gc
+
+#include "textflag.h"
+
+TEXT ·RewindAndSetgid(SB),NOSPLIT|NOFRAME,$0-0
+	// Save link register
+	MOVD	R30, R9
+
+	// Rewind stack pointer so anything that happens on the stack
+	// will clobber the test pattern created by the caller
+	ADD	$(1024 * 8), RSP
+
+	// Ask signaller to setgid
+	MOVD	$·Baton(SB), R0
+	MOVD	$1, R1
+storeloop:
+	LDAXRW	(R0), R2
+	STLXRW	R1, (R0), R3
+	CBNZ	R3, storeloop
+
+	// Wait for setgid completion
+	MOVW	$0, R1
+	MOVW	$0, R2
+loop:
+	LDAXRW	(R0), R3
+	CMPW	R1, R3
+	BNE	loop
+	STLXRW	R2, (R0), R3
+	CBNZ	R3, loop
+
+	// Restore stack
+	SUB	$(1024 * 8), RSP
+
+	MOVD	R9, R30
+	RET
diff --git a/misc/cgo/test/issue9400/asm_loong64.s b/src/cmd/cgo/internal/test/issue9400/asm_loong64.s
similarity index 100%
rename from misc/cgo/test/issue9400/asm_loong64.s
rename to src/cmd/cgo/internal/test/issue9400/asm_loong64.s
diff --git a/src/cmd/cgo/internal/test/issue9400/asm_mips64x.s b/src/cmd/cgo/internal/test/issue9400/asm_mips64x.s
new file mode 100644
index 0000000..1f492ea
--- /dev/null
+++ b/src/cmd/cgo/internal/test/issue9400/asm_mips64x.s
@@ -0,0 +1,32 @@
+// Copyright 2016 The Go 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:build (mips64 || mips64le) && gc
+
+#include "textflag.h"
+
+#define SYNC	WORD $0xf
+
+TEXT ·RewindAndSetgid(SB),NOSPLIT|NOFRAME,$0-0
+	// Rewind stack pointer so anything that happens on the stack
+	// will clobber the test pattern created by the caller
+	ADDV	$(1024*8), R29
+
+	// Ask signaller to setgid
+	MOVW	$1, R1
+	SYNC
+	MOVW	R1, ·Baton(SB)
+	SYNC
+
+	// Wait for setgid completion
+loop:
+	SYNC
+	MOVW	·Baton(SB), R1
+	OR	R2, R2, R2	// hint that we're in a spin loop
+	BNE	R1, loop
+	SYNC
+
+	// Restore stack
+	ADDV	$(-1024*8), R29
+	RET
diff --git a/src/cmd/cgo/internal/test/issue9400/asm_mipsx.s b/src/cmd/cgo/internal/test/issue9400/asm_mipsx.s
new file mode 100644
index 0000000..695273d
--- /dev/null
+++ b/src/cmd/cgo/internal/test/issue9400/asm_mipsx.s
@@ -0,0 +1,30 @@
+// Copyright 2016 The Go 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:build (mips || mipsle) && gc
+
+#include "textflag.h"
+
+TEXT ·RewindAndSetgid(SB),NOSPLIT|NOFRAME,$0-0
+	// Rewind stack pointer so anything that happens on the stack
+	// will clobber the test pattern created by the caller
+	ADDU	$(1024*8), R29
+
+	// Ask signaller to setgid
+	MOVW	$1, R1
+	SYNC
+	MOVW	R1, ·Baton(SB)
+	SYNC
+
+	// Wait for setgid completion
+loop:
+	SYNC
+	MOVW	·Baton(SB), R1
+	OR	R2, R2, R2	// hint that we're in a spin loop
+	BNE	R1, loop
+	SYNC
+
+	// Restore stack
+	ADDU	$(-1024*8), R29
+	RET
diff --git a/src/cmd/cgo/internal/test/issue9400/asm_ppc64x.s b/src/cmd/cgo/internal/test/issue9400/asm_ppc64x.s
new file mode 100644
index 0000000..5f13f16
--- /dev/null
+++ b/src/cmd/cgo/internal/test/issue9400/asm_ppc64x.s
@@ -0,0 +1,31 @@
+// 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:build (ppc64 || ppc64le) && gc
+
+#include "textflag.h"
+
+TEXT ·RewindAndSetgid(SB),NOSPLIT|NOFRAME,$0-0
+	// Rewind stack pointer so anything that happens on the stack
+	// will clobber the test pattern created by the caller
+	ADD	$(1024 * 8), R1
+
+	// Ask signaller to setgid
+	MOVW	$1, R3
+	SYNC
+	MOVW	R3, ·Baton(SB)
+
+	// Wait for setgid completion
+loop:
+	SYNC
+	MOVW	·Baton(SB), R3
+	CMP	R3, $0
+	// Hint that we're in a spin loop
+	OR	R1, R1, R1
+	BNE	loop
+	ISYNC
+
+	// Restore stack
+	SUB	$(1024 * 8), R1
+	RET
diff --git a/src/cmd/cgo/internal/test/issue9400/asm_riscv64.s b/src/cmd/cgo/internal/test/issue9400/asm_riscv64.s
new file mode 100644
index 0000000..fa34f6b
--- /dev/null
+++ b/src/cmd/cgo/internal/test/issue9400/asm_riscv64.s
@@ -0,0 +1,30 @@
+// Copyright 2020 The Go 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:build riscv64 && gc
+
+#include "textflag.h"
+
+TEXT ·RewindAndSetgid(SB),NOSPLIT|NOFRAME,$0-0
+	// Rewind stack pointer so anything that happens on the stack
+	// will clobber the test pattern created by the caller
+	ADD	$(1024*8), X2
+
+	// Ask signaller to setgid
+	MOV	$1, X5
+	FENCE
+	MOVW	X5, ·Baton(SB)
+	FENCE
+
+	// Wait for setgid completion
+loop:
+	FENCE
+	MOVW	·Baton(SB), X5
+	OR	X6, X6, X6	// hint that we're in a spin loop
+	BNE	ZERO, X5, loop
+	FENCE
+
+	// Restore stack
+	ADD	$(-1024*8), X2
+	RET
diff --git a/src/cmd/cgo/internal/test/issue9400/asm_s390x.s b/src/cmd/cgo/internal/test/issue9400/asm_s390x.s
new file mode 100644
index 0000000..2552fa7
--- /dev/null
+++ b/src/cmd/cgo/internal/test/issue9400/asm_s390x.s
@@ -0,0 +1,26 @@
+// Copyright 2016 The Go 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:build gc
+
+#include "textflag.h"
+
+TEXT ·RewindAndSetgid(SB),NOSPLIT,$0-0
+	// Rewind stack pointer so anything that happens on the stack
+	// will clobber the test pattern created by the caller
+	ADD	$(1024 * 8), R15
+
+	// Ask signaller to setgid
+	MOVD	$·Baton(SB), R5
+	MOVW	$1, 0(R5)
+
+	// Wait for setgid completion
+loop:
+	SYNC
+	MOVW	·Baton(SB), R3
+	CMPBNE	R3, $0, loop
+
+	// Restore stack
+	SUB	$(1024 * 8), R15
+	RET
diff --git a/src/cmd/cgo/internal/test/issue9400/gccgo.go b/src/cmd/cgo/internal/test/issue9400/gccgo.go
new file mode 100644
index 0000000..4dd987b
--- /dev/null
+++ b/src/cmd/cgo/internal/test/issue9400/gccgo.go
@@ -0,0 +1,26 @@
+// 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:build gccgo
+
+package issue9400
+
+import (
+	"runtime"
+	"sync/atomic"
+)
+
+// The test for the gc compiler resets the stack pointer so that the
+// stack gets modified.  We don't have a way to do that for gccgo
+// without writing more assembly code, which we haven't bothered to
+// do.  So this is not much of a test.
+
+var Baton int32
+
+func RewindAndSetgid() {
+	atomic.StoreInt32(&Baton, 1)
+	for atomic.LoadInt32(&Baton) != 0 {
+		runtime.Gosched()
+	}
+}
diff --git a/src/cmd/cgo/internal/test/issue9400/stubs.go b/src/cmd/cgo/internal/test/issue9400/stubs.go
new file mode 100644
index 0000000..c2b235a
--- /dev/null
+++ b/src/cmd/cgo/internal/test/issue9400/stubs.go
@@ -0,0 +1,11 @@
+// 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:build linux && gc
+
+package issue9400
+
+var Baton int32
+
+func RewindAndSetgid()
diff --git a/src/cmd/cgo/internal/test/issue9400_linux.go b/src/cmd/cgo/internal/test/issue9400_linux.go
new file mode 100644
index 0000000..1511e25
--- /dev/null
+++ b/src/cmd/cgo/internal/test/issue9400_linux.go
@@ -0,0 +1,67 @@
+// 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 SIGSETXID runs on signal stack, since it's likely to
+// overflow if it runs on the Go stack.
+
+package cgotest
+
+/*
+#include <sys/types.h>
+#include <unistd.h>
+*/
+import "C"
+
+import (
+	"runtime"
+	"runtime/debug"
+	"sync/atomic"
+	"testing"
+
+	"cmd/cgo/internal/test/issue9400"
+)
+
+func test9400(t *testing.T) {
+	// We synchronize through a shared variable, so we need two procs
+	defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(2))
+
+	// Start signaller
+	atomic.StoreInt32(&issue9400.Baton, 0)
+	go func() {
+		// Wait for RewindAndSetgid
+		for atomic.LoadInt32(&issue9400.Baton) == 0 {
+			runtime.Gosched()
+		}
+		// Broadcast SIGSETXID
+		runtime.LockOSThread()
+		C.setgid(0)
+		// Indicate that signalling is done
+		atomic.StoreInt32(&issue9400.Baton, 0)
+	}()
+
+	// Grow the stack and put down a test pattern
+	const pattern = 0x123456789abcdef
+	var big [1024]uint64 // len must match assembly
+	for i := range big {
+		big[i] = pattern
+	}
+
+	// Disable GC for the duration of the test.
+	// This avoids a potential GC deadlock when spinning in uninterruptable ASM below #49695.
+	defer debug.SetGCPercent(debug.SetGCPercent(-1))
+	// SetGCPercent waits until the mark phase is over, but the runtime
+	// also preempts at the start of the sweep phase, so make sure that's
+	// done too. See #49695.
+	runtime.GC()
+
+	// Temporarily rewind the stack and trigger SIGSETXID
+	issue9400.RewindAndSetgid()
+
+	// Check test pattern
+	for i := range big {
+		if big[i] != pattern {
+			t.Fatalf("entry %d of test pattern is wrong; %#x != %#x", i, big[i], uint64(pattern))
+		}
+	}
+}
diff --git a/src/cmd/cgo/internal/test/issue9510.go b/src/cmd/cgo/internal/test/issue9510.go
new file mode 100644
index 0000000..7f0aff4
--- /dev/null
+++ b/src/cmd/cgo/internal/test/issue9510.go
@@ -0,0 +1,26 @@
+// 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:build cgo
+
+// Test that we can link together two different cgo packages that both
+// use the same libgcc function.
+
+package cgotest
+
+import (
+	"runtime"
+	"testing"
+
+	"cmd/cgo/internal/test/issue9510a"
+	"cmd/cgo/internal/test/issue9510b"
+)
+
+func test9510(t *testing.T) {
+	if runtime.GOARCH == "arm" {
+		t.Skip("skipping because libgcc may be a Thumb library")
+	}
+	issue9510a.F(1, 1)
+	issue9510b.F(1, 1)
+}
diff --git a/misc/cgo/test/issue9510a/a.go b/src/cmd/cgo/internal/test/issue9510a/a.go
similarity index 100%
rename from misc/cgo/test/issue9510a/a.go
rename to src/cmd/cgo/internal/test/issue9510a/a.go
diff --git a/misc/cgo/test/issue9510b/b.go b/src/cmd/cgo/internal/test/issue9510b/b.go
similarity index 100%
rename from misc/cgo/test/issue9510b/b.go
rename to src/cmd/cgo/internal/test/issue9510b/b.go
diff --git a/misc/cgo/test/setgid2_linux.go b/src/cmd/cgo/internal/test/setgid2_linux.go
similarity index 100%
rename from misc/cgo/test/setgid2_linux.go
rename to src/cmd/cgo/internal/test/setgid2_linux.go
diff --git a/misc/cgo/test/setgid_linux.go b/src/cmd/cgo/internal/test/setgid_linux.go
similarity index 100%
rename from misc/cgo/test/setgid_linux.go
rename to src/cmd/cgo/internal/test/setgid_linux.go
diff --git a/src/cmd/cgo/internal/test/sigaltstack.go b/src/cmd/cgo/internal/test/sigaltstack.go
new file mode 100644
index 0000000..d468cf8
--- /dev/null
+++ b/src/cmd/cgo/internal/test/sigaltstack.go
@@ -0,0 +1,78 @@
+// 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:build !windows && !android
+
+// Test that the Go runtime still works if C code changes the signal stack.
+
+package cgotest
+
+/*
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifdef _AIX
+// On AIX, SIGSTKSZ is too small to handle Go sighandler.
+#define CSIGSTKSZ 0x4000
+#else
+#define CSIGSTKSZ SIGSTKSZ
+#endif
+
+static stack_t oss;
+static char signalStack[CSIGSTKSZ];
+
+static void changeSignalStack(void) {
+	stack_t ss;
+	memset(&ss, 0, sizeof ss);
+	ss.ss_sp = signalStack;
+	ss.ss_flags = 0;
+	ss.ss_size = CSIGSTKSZ;
+	if (sigaltstack(&ss, &oss) < 0) {
+		perror("sigaltstack");
+		abort();
+	}
+}
+
+static void restoreSignalStack(void) {
+#if (defined(__x86_64__) || defined(__i386__)) && defined(__APPLE__)
+	// The Darwin C library enforces a minimum that the kernel does not.
+	// This is OK since we allocated this much space in mpreinit,
+	// it was just removed from the buffer by stackalloc.
+	oss.ss_size = MINSIGSTKSZ;
+#endif
+	if (sigaltstack(&oss, NULL) < 0) {
+		perror("sigaltstack restore");
+		abort();
+	}
+}
+
+static int zero(void) {
+	return 0;
+}
+*/
+import "C"
+
+import (
+	"runtime"
+	"testing"
+)
+
+func testSigaltstack(t *testing.T) {
+	switch {
+	case runtime.GOOS == "solaris", runtime.GOOS == "illumos", runtime.GOOS == "ios" && runtime.GOARCH == "arm64":
+		t.Skipf("switching signal stack not implemented on %s/%s", runtime.GOOS, runtime.GOARCH)
+	}
+
+	C.changeSignalStack()
+	defer C.restoreSignalStack()
+	defer func() {
+		if recover() == nil {
+			t.Error("did not see expected panic")
+		}
+	}()
+	v := 1 / int(C.zero())
+	t.Errorf("unexpected success of division by zero == %d", v)
+}
diff --git a/src/cmd/cgo/internal/test/sigprocmask.c b/src/cmd/cgo/internal/test/sigprocmask.c
new file mode 100644
index 0000000..4315833
--- /dev/null
+++ b/src/cmd/cgo/internal/test/sigprocmask.c
@@ -0,0 +1,51 @@
+// 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:build !windows
+
+#include <errno.h>
+#include <signal.h>
+#include <stdlib.h>
+#include <pthread.h>
+#include <stdio.h>
+#include <time.h>
+#include <unistd.h>
+
+extern void IntoGoAndBack();
+
+int CheckBlocked() {
+	sigset_t mask;
+	sigprocmask(SIG_BLOCK, NULL, &mask);
+	return sigismember(&mask, SIGIO);
+}
+
+static void* sigthreadfunc(void* unused) {
+	sigset_t mask;
+	sigemptyset(&mask);
+	sigaddset(&mask, SIGIO);
+	sigprocmask(SIG_BLOCK, &mask, NULL);
+	IntoGoAndBack();
+	return NULL;
+}
+
+int RunSigThread() {
+	int tries;
+	pthread_t thread;
+	int r;
+	struct timespec ts;
+
+	for (tries = 0; tries < 20; tries++) {
+		r = pthread_create(&thread, NULL, &sigthreadfunc, NULL);
+		if (r == 0) {
+			return pthread_join(thread, NULL);
+		}
+		if (r != EAGAIN) {
+			return r;
+		}
+		ts.tv_sec = 0;
+		ts.tv_nsec = (tries + 1) * 1000 * 1000; // Milliseconds.
+		nanosleep(&ts, NULL);
+	}
+	return EAGAIN;
+}
diff --git a/src/cmd/cgo/internal/test/sigprocmask.go b/src/cmd/cgo/internal/test/sigprocmask.go
new file mode 100644
index 0000000..6cc04d6
--- /dev/null
+++ b/src/cmd/cgo/internal/test/sigprocmask.go
@@ -0,0 +1,40 @@
+// 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:build !windows
+
+package cgotest
+
+/*
+#cgo CFLAGS: -pthread
+#cgo LDFLAGS: -pthread
+extern int RunSigThread();
+extern int CheckBlocked();
+*/
+import "C"
+import (
+	"os"
+	"os/signal"
+	"syscall"
+	"testing"
+)
+
+var blocked bool
+
+//export IntoGoAndBack
+func IntoGoAndBack() {
+	// Verify that SIGIO stays blocked on the C thread
+	// even when unblocked for signal.Notify().
+	signal.Notify(make(chan os.Signal), syscall.SIGIO)
+	blocked = C.CheckBlocked() != 0
+}
+
+func testSigprocmask(t *testing.T) {
+	if r := C.RunSigThread(); r != 0 {
+		t.Errorf("pthread_create/pthread_join failed: %d", r)
+	}
+	if !blocked {
+		t.Error("Go runtime unblocked SIGIO")
+	}
+}
diff --git a/src/cmd/cgo/internal/test/test.go b/src/cmd/cgo/internal/test/test.go
new file mode 100644
index 0000000..7da5a85
--- /dev/null
+++ b/src/cmd/cgo/internal/test/test.go
@@ -0,0 +1,2303 @@
+// 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.
+
+// Test cases for cgo.
+// Both the import "C" prologue and the main file are sorted by issue number.
+// This file contains C definitions (not just declarations)
+// and so it must NOT contain any //export directives on Go functions.
+// See testx.go for exports.
+
+package cgotest
+
+/*
+#include <complex.h>
+#include <math.h>
+#include <stdarg.h>
+#include <stdbool.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/stat.h>
+#include <errno.h>
+#cgo !darwin LDFLAGS: -lm
+
+#ifndef WIN32
+#include <pthread.h>
+#include <signal.h>
+#endif
+
+// alignment tests
+
+typedef unsigned char Uint8;
+typedef unsigned short Uint16;
+
+typedef enum {
+ MOD1 = 0x0000,
+ MODX = 0x8000
+} SDLMod;
+
+typedef enum {
+ A1 = 1,
+ B1 = 322,
+ SDLK_LAST
+} SDLKey;
+
+typedef struct SDL_keysym {
+	Uint8 scancode;
+	SDLKey sym;
+	SDLMod mod;
+	Uint16 unicode;
+} SDL_keysym;
+
+typedef struct SDL_KeyboardEvent {
+	Uint8 typ;
+	Uint8 which;
+	Uint8 state;
+	SDL_keysym keysym;
+} SDL_KeyboardEvent;
+
+void makeEvent(SDL_KeyboardEvent *event) {
+ unsigned char *p;
+ int i;
+
+ p = (unsigned char*)event;
+ for (i=0; i<sizeof *event; i++) {
+   p[i] = i;
+ }
+}
+
+int same(SDL_KeyboardEvent* e, Uint8 typ, Uint8 which, Uint8 state, Uint8 scan, SDLKey sym, SDLMod mod, Uint16 uni) {
+  return e->typ == typ && e->which == which && e->state == state && e->keysym.scancode == scan && e->keysym.sym == sym && e->keysym.mod == mod && e->keysym.unicode == uni;
+}
+
+void cTest(SDL_KeyboardEvent *event) {
+ printf("C: %#x %#x %#x %#x %#x %#x %#x\n", event->typ, event->which, event->state,
+   event->keysym.scancode, event->keysym.sym, event->keysym.mod, event->keysym.unicode);
+ fflush(stdout);
+}
+
+// api
+
+const char *greeting = "hello, world";
+
+// basic test cases
+
+#define SHIFT(x, y)  ((x)<<(y))
+#define KILO SHIFT(1, 10)
+#define UINT32VAL 0xc008427bU
+
+enum E {
+	Enum1 = 1,
+	Enum2 = 2,
+};
+
+typedef unsigned char cgo_uuid_t[20];
+
+void uuid_generate(cgo_uuid_t x) {
+	x[0] = 0;
+}
+
+struct S {
+	int x;
+};
+
+const char *cstr = "abcefghijklmnopqrstuvwxyzABCEFGHIJKLMNOPQRSTUVWXYZ1234567890";
+
+extern enum E myConstFunc(struct S* const ctx, int const id, struct S **const filter);
+
+enum E myConstFunc(struct S *const ctx, int const id, struct S **const filter) { return 0; }
+
+int add(int x, int y) {
+	return x+y;
+};
+
+// Following mimics vulkan complex definitions for benchmarking cgocheck overhead.
+
+typedef uint32_t VkFlags;
+typedef VkFlags  VkDeviceQueueCreateFlags;
+typedef uint32_t VkStructureType;
+
+typedef struct VkDeviceQueueCreateInfo {
+    VkStructureType             sType;
+    const void*                 pNext;
+    VkDeviceQueueCreateFlags    flags;
+    uint32_t                    queueFamilyIndex;
+    uint32_t                    queueCount;
+    const float*                pQueuePriorities;
+} VkDeviceQueueCreateInfo;
+
+typedef struct VkPhysicalDeviceFeatures {
+    uint32_t bools[56];
+} VkPhysicalDeviceFeatures;
+
+typedef struct VkDeviceCreateInfo {
+    VkStructureType                    sType;
+    const void*                        pNext;
+    VkFlags                            flags;
+    uint32_t                           queueCreateInfoCount;
+    const VkDeviceQueueCreateInfo*     pQueueCreateInfos;
+    uint32_t                           enabledLayerCount;
+    const char* const*                 ppEnabledLayerNames;
+    uint32_t                           enabledExtensionCount;
+    const char* const*                 ppEnabledExtensionNames;
+    const VkPhysicalDeviceFeatures*    pEnabledFeatures;
+} VkDeviceCreateInfo;
+
+void handleComplexPointer(VkDeviceCreateInfo *a0) {}
+void handleComplexPointer8(
+	VkDeviceCreateInfo *a0, VkDeviceCreateInfo *a1, VkDeviceCreateInfo *a2, VkDeviceCreateInfo *a3,
+	VkDeviceCreateInfo *a4, VkDeviceCreateInfo *a5, VkDeviceCreateInfo *a6, VkDeviceCreateInfo *a7
+) {}
+
+// complex alignment
+
+struct {
+	float x;
+	_Complex float y;
+} cplxAlign = { 3.14, 2.17 };
+
+// constants and pointer checking
+
+#define CheckConstVal 0
+
+typedef struct {
+	int *p;
+} CheckConstStruct;
+
+static void CheckConstFunc(CheckConstStruct *p, int e) {}
+
+// duplicate symbol
+
+int base_symbol = 0;
+#define alias_one base_symbol
+#define alias_two base_symbol
+
+// function pointer variables
+
+typedef int (*intFunc) ();
+
+int
+bridge_int_func(intFunc f)
+{
+	return f();
+}
+
+int fortytwo()
+{
+	return 42;
+}
+
+// issue 1222
+typedef union {
+	long align;
+} xxpthread_mutex_t;
+struct ibv_async_event {
+	union {
+		int x;
+	} element;
+};
+struct ibv_context {
+	xxpthread_mutex_t mutex;
+};
+
+// issue 1635
+// Mac OS X's gcc will generate scattered relocation 2/1 for
+// this function on Darwin/386, and 8l couldn't handle it.
+// this example is in issue 1635
+void scatter() {
+	void *p = scatter;
+	printf("scatter = %p\n", p);
+}
+
+// Adding this explicit extern declaration makes this a test for
+// https://gcc.gnu.org/PR68072 aka https://golang.org/issue/13344 .
+// It used to cause a cgo error when building with GCC 6.
+extern int hola;
+
+// this example is in issue 3253
+int hola = 0;
+int testHola() { return hola; }
+
+// issue 3250
+#ifdef WIN32
+void testSendSIG() {}
+#else
+static void *thread(void *p) {
+	const int M = 100;
+	int i;
+	(void)p;
+	for (i = 0; i < M; i++) {
+		pthread_kill(pthread_self(), SIGCHLD);
+		usleep(rand() % 20 + 5);
+	}
+	return NULL;
+}
+void testSendSIG() {
+	const int N = 20;
+	int i;
+	pthread_t tid[N];
+	for (i = 0; i < N; i++) {
+		usleep(rand() % 200 + 100);
+		pthread_create(&tid[i], 0, thread, NULL);
+	}
+	for (i = 0; i < N; i++)
+		pthread_join(tid[i], 0);
+}
+#endif
+
+// issue 3261
+// libgcc on ARM might be compiled as thumb code, but our 5l
+// can't handle that, so we have to disable this test on arm.
+#ifdef __ARMEL__
+int vabs(int x) {
+	puts("testLibgcc is disabled on ARM because 5l cannot handle thumb library.");
+	return (x < 0) ? -x : x;
+}
+#elif defined(__arm64__) && defined(__clang__)
+int vabs(int x) {
+	puts("testLibgcc is disabled on ARM64 with clang due to lack of libgcc.");
+	return (x < 0) ? -x : x;
+}
+#else
+int __absvsi2(int); // dummy prototype for libgcc function
+// we shouldn't name the function abs, as gcc might use
+// the builtin one.
+int vabs(int x) { return __absvsi2(x); }
+#endif
+
+
+// issue 3729
+// access errno from void C function
+const char _expA = 0x42;
+const float _expB = 3.14159;
+const short _expC = 0x55aa;
+const int _expD = 0xdeadbeef;
+
+#ifdef WIN32
+void g(void) {}
+void g2(int x, char a, float b, short c, int d) {}
+#else
+
+void g(void) {
+	errno = E2BIG;
+}
+
+// try to pass some non-trivial arguments to function g2
+void g2(int x, char a, float b, short c, int d) {
+	if (a == _expA && b == _expB && c == _expC && d == _expD)
+		errno = x;
+	else
+		errno = -1;
+}
+#endif
+
+// issue 3945
+// Test that cgo reserves enough stack space during cgo call.
+// See https://golang.org/issue/3945 for details.
+void say() {
+	printf("%s from C\n", "hello");
+}
+
+// issue 4054 part 1 - other half in testx.go
+
+typedef enum {
+	A = 0,
+	B,
+	C,
+	D,
+	E,
+	F,
+	G,
+	H,
+	II,
+	J,
+} issue4054a;
+
+// issue 4339
+// We've historically permitted #include <>, so test it here.  Issue 29333.
+// Also see issue 41059.
+#include <issue4339.h>
+
+// issue 4417
+// cmd/cgo: bool alignment/padding issue.
+// bool alignment is wrong and causing wrong arguments when calling functions.
+static int c_bool(bool a, bool b, int c, bool d, bool e)  {
+   return c;
+}
+
+// issue 4857
+#cgo CFLAGS: -Werror
+const struct { int a; } *issue4857() { return (void *)0; }
+
+// issue 5224
+// Test that the #cgo CFLAGS directive works,
+// with and without platform filters.
+#cgo CFLAGS: -DCOMMON_VALUE=123
+#cgo windows CFLAGS: -DIS_WINDOWS=1
+#cgo !windows CFLAGS: -DIS_WINDOWS=0
+int common = COMMON_VALUE;
+int is_windows = IS_WINDOWS;
+
+// issue 5227
+// linker incorrectly treats common symbols and
+// leaves them undefined.
+
+typedef struct {
+        int Count;
+} Fontinfo;
+
+Fontinfo SansTypeface;
+
+extern void init();
+
+Fontinfo loadfont() {
+        Fontinfo f = {0};
+        return f;
+}
+
+void init() {
+        SansTypeface = loadfont();
+}
+
+// issue 5242
+// Cgo incorrectly computed the alignment of structs
+// with no Go accessible fields as 0, and then panicked on
+// modulo-by-zero computations.
+
+// issue 50987
+// disable arm64 GCC warnings
+#cgo CFLAGS: -Wno-psabi -Wno-unknown-warning-option
+
+typedef struct {
+} foo;
+
+typedef struct {
+	int x : 1;
+} bar;
+
+int issue5242(foo f, bar b) {
+	return 5242;
+}
+
+// issue 5337
+// Verify that we can withstand SIGPROF received on foreign threads
+
+#ifdef WIN32
+void test5337() {}
+#else
+static void *thread1(void *p) {
+	(void)p;
+	pthread_kill(pthread_self(), SIGPROF);
+	return NULL;
+}
+void test5337() {
+	pthread_t tid;
+	pthread_create(&tid, 0, thread1, NULL);
+	pthread_join(tid, 0);
+}
+#endif
+
+// issue 5603
+
+const long long issue5603exp = 0x12345678;
+long long issue5603foo0() { return issue5603exp; }
+long long issue5603foo1(void *p) { return issue5603exp; }
+long long issue5603foo2(void *p, void *q) { return issue5603exp; }
+long long issue5603foo3(void *p, void *q, void *r) { return issue5603exp; }
+long long issue5603foo4(void *p, void *q, void *r, void *s) { return issue5603exp; }
+
+// issue 5740
+
+int test5740a(void), test5740b(void);
+
+// issue 5986
+static void output5986()
+{
+    int current_row = 0, row_count = 0;
+    double sum_squares = 0;
+    double d;
+    do {
+        if (current_row == 10) {
+            current_row = 0;
+        }
+        ++row_count;
+    }
+    while (current_row++ != 1);
+    d =  sqrt(sum_squares / row_count);
+    printf("sqrt is: %g\n", d);
+}
+
+// issue 6128
+// Test handling of #defined names in clang.
+// NOTE: Must use hex, or else a shortcut for decimals
+// in cgo avoids trying to pass this to clang.
+#define X 0x1
+
+// issue 6472
+typedef struct
+{
+        struct
+        {
+            int x;
+        } y[16];
+} z;
+
+// issue 6612
+// Test new scheme for deciding whether C.name is an expression, type, constant.
+// Clang silences some warnings when the name is a #defined macro, so test those too
+// (even though we now use errors exclusively, not warnings).
+
+void myfunc(void) {}
+int myvar = 5;
+const char *mytext = "abcdef";
+typedef int mytype;
+enum {
+	myenum = 1234,
+};
+
+#define myfunc_def myfunc
+#define myvar_def myvar
+#define mytext_def mytext
+#define mytype_def mytype
+#define myenum_def myenum
+#define myint_def 12345
+#define myfloat_def 1.5
+#define mystring_def "hello"
+
+// issue 6907
+char* Issue6907CopyString(_GoString_ s) {
+	size_t n;
+	const char *p;
+	char *r;
+
+	n = _GoStringLen(s);
+	p = _GoStringPtr(s);
+	r = malloc(n + 1);
+	memmove(r, p, n);
+	r[n] = '\0';
+	return r;
+}
+
+// issue 7560
+typedef struct {
+	char x;
+	long y;
+} __attribute__((__packed__)) misaligned;
+
+int
+offset7560(void)
+{
+	return (uintptr_t)&((misaligned*)0)->y;
+}
+
+// issue 7786
+// No runtime test, just make sure that typedef and struct/union/class are interchangeable at compile time.
+
+struct test7786;
+typedef struct test7786 typedef_test7786;
+void f7786(struct test7786 *ctx) {}
+void g7786(typedef_test7786 *ctx) {}
+
+typedef struct body7786 typedef_body7786;
+struct body7786 { int x; };
+void b7786(struct body7786 *ctx) {}
+void c7786(typedef_body7786 *ctx) {}
+
+typedef union union7786 typedef_union7786;
+void u7786(union union7786 *ctx) {}
+void v7786(typedef_union7786 *ctx) {}
+
+// issue 8092
+// Test that linker defined symbols (e.g., text, data) don't
+// conflict with C symbols.
+char text[] = "text";
+char data[] = "data";
+char *ctext(void) { return text; }
+char *cdata(void) { return data; }
+
+// issue 8428
+// Cgo inconsistently translated zero size arrays.
+
+struct issue8428one {
+	char b;
+	char rest[];
+};
+
+struct issue8428two {
+	void *p;
+	char b;
+	char rest[0];
+	char pad;
+};
+
+struct issue8428three {
+	char w[1][2][3][0];
+	char x[2][3][0][1];
+	char y[3][0][1][2];
+	char z[0][1][2][3];
+};
+
+// issue 8331 part 1 - part 2 in testx.go
+// A typedef of an unnamed struct is the same struct when
+// #include'd twice.  No runtime test; just make sure it compiles.
+#include "issue8331.h"
+
+// issue 8368 and 8441
+// Recursive struct definitions didn't work.
+// No runtime test; just make sure it compiles.
+typedef struct one one;
+typedef struct two two;
+struct one {
+	two *x;
+};
+struct two {
+	one *x;
+};
+
+// issue 8811
+
+extern int issue8811Initialized;
+extern void issue8811Init();
+
+void issue8811Execute() {
+	if(!issue8811Initialized)
+		issue8811Init();
+}
+
+// issue 8945
+
+typedef void (*PFunc8945)();
+PFunc8945 func8945;
+
+// issue 9557
+
+struct issue9557_t {
+  int a;
+} test9557bar = { 42 };
+struct issue9557_t *issue9557foo = &test9557bar;
+
+// issue 10303
+// Pointers passed to C were not marked as escaping (bug in cgo).
+
+typedef int *intptr;
+
+void setintstar(int *x) {
+	*x = 1;
+}
+
+void setintptr(intptr x) {
+	*x = 1;
+}
+
+void setvoidptr(void *x) {
+	*(int*)x = 1;
+}
+
+typedef struct Struct Struct;
+struct Struct {
+	int *P;
+};
+
+void setstruct(Struct s) {
+	*s.P = 1;
+}
+
+// issue 11925
+// Structs with zero-length trailing fields are now padded by the Go compiler.
+
+struct a11925 {
+	int i;
+	char a[0];
+	char b[0];
+};
+
+struct b11925 {
+	int i;
+	char a[0];
+	char b[];
+};
+
+// issue 12030
+void issue12030conv(char *buf, double x) {
+	sprintf(buf, "d=%g", x);
+}
+
+// issue 14838
+
+int check_cbytes(char *b, size_t l) {
+	int i;
+	for (i = 0; i < l; i++) {
+		if (b[i] != i) {
+			return 0;
+		}
+	}
+	return 1;
+}
+
+// issue 17065
+// Test that C symbols larger than a page play nicely with the race detector.
+int ii[65537];
+
+// issue 17537
+// The void* cast introduced by cgo to avoid problems
+// with const/volatile qualifiers breaks C preprocessor macros that
+// emulate functions.
+
+typedef struct {
+	int i;
+} S17537;
+
+int I17537(S17537 *p);
+
+#define I17537(p) ((p)->i)
+
+// Calling this function used to fail without the cast.
+const int F17537(const char **p) {
+	return **p;
+}
+
+// issue 17723
+// API compatibility checks
+
+typedef char *cstring_pointer;
+static void cstring_pointer_fun(cstring_pointer dummy) { }
+const char *api_hello = "hello!";
+
+// Calling this function used to trigger an error from the C compiler
+// (issue 18298).
+void F18298(const void *const *p) {
+}
+
+// Test that conversions between typedefs work as they used to.
+typedef const void *T18298_1;
+struct S18298 { int i; };
+typedef const struct S18298 *T18298_2;
+void G18298(T18298_1 t) {
+}
+
+// issue 18126
+// cgo check of void function returning errno.
+void Issue18126C(void **p) {}
+
+// issue 18720
+
+#define HELLO "hello"
+#define WORLD "world"
+#define HELLO_WORLD HELLO "\000" WORLD
+
+struct foo { char c; };
+#define SIZE_OF(x) sizeof(x)
+#define SIZE_OF_FOO SIZE_OF(struct foo)
+#define VAR1 VAR
+#define VAR var
+int var = 5;
+
+#define ADDR &var
+
+#define CALL fn()
+int fn(void) {
+	return ++var;
+}
+
+// issue 20129
+
+int issue20129 = 0;
+typedef void issue20129Void;
+issue20129Void issue20129Foo() {
+	issue20129 = 1;
+}
+typedef issue20129Void issue20129Void2;
+issue20129Void2 issue20129Bar() {
+	issue20129 = 2;
+}
+
+// issue 20369
+#define XUINT64_MAX        18446744073709551615ULL
+
+// issue 21668
+// Fail to guess the kind of the constant "x".
+// No runtime test; just make sure it compiles.
+const int x21668 = 42;
+
+// issue 21708
+#define CAST_TO_INT64 (int64_t)(-1)
+
+// issue 21809
+// Compile C `typedef` to go type aliases.
+
+typedef long MySigned_t;
+// tests alias-to-alias
+typedef MySigned_t MySigned2_t;
+long takes_long(long x) { return x * x; }
+MySigned_t takes_typedef(MySigned_t x) { return x * x; }
+
+// issue 22906
+
+// It's going to be hard to include a whole real JVM to test this.
+// So we'll simulate a really easy JVM using just the parts we need.
+// This is the relevant part of jni.h.
+
+struct _jobject;
+
+typedef struct _jobject *jobject;
+typedef jobject jclass;
+typedef jobject jthrowable;
+typedef jobject jstring;
+typedef jobject jarray;
+typedef jarray jbooleanArray;
+typedef jarray jbyteArray;
+typedef jarray jcharArray;
+typedef jarray jshortArray;
+typedef jarray jintArray;
+typedef jarray jlongArray;
+typedef jarray jfloatArray;
+typedef jarray jdoubleArray;
+typedef jarray jobjectArray;
+
+typedef jobject jweak;
+
+// Note: jvalue is already a non-pointer type due to it being a C union.
+
+// issue 22958
+
+typedef struct {
+	unsigned long long f8  : 8;
+	unsigned long long f16 : 16;
+	unsigned long long f24 : 24;
+	unsigned long long f32 : 32;
+	unsigned long long f40 : 40;
+	unsigned long long f48 : 48;
+	unsigned long long f56 : 56;
+	unsigned long long f64 : 64;
+} issue22958Type;
+
+// issue 23356
+int a(void) { return 5; };
+int r(void) { return 3; };
+
+// issue 23720
+typedef int *issue23720A;
+typedef const int *issue23720B;
+void issue23720F(issue23720B a) {}
+
+// issue 24206
+#if defined(__linux__) && defined(__x86_64__)
+#include <sys/mman.h>
+// Returns string with null byte at the last valid address
+char* dangerousString1() {
+	int pageSize = 4096;
+	char *data = mmap(0, 2 * pageSize, PROT_READ|PROT_WRITE, MAP_ANON|MAP_PRIVATE, 0, 0);
+	mprotect(data + pageSize,pageSize,PROT_NONE);
+	int start = pageSize - 123 - 1; // last 123 bytes of first page + 1 null byte
+	int i = start;
+	for (; i < pageSize; i++) {
+	data[i] = 'x';
+	}
+	data[pageSize -1 ] = 0;
+	return data+start;
+}
+
+char* dangerousString2() {
+	int pageSize = 4096;
+	char *data = mmap(0, 3 * pageSize, PROT_READ|PROT_WRITE, MAP_ANON|MAP_PRIVATE, 0, 0);
+	mprotect(data + 2 * pageSize,pageSize,PROT_NONE);
+	int start = pageSize - 123 - 1; // last 123 bytes of first page + 1 null byte
+	int i = start;
+	for (; i < 2 * pageSize; i++) {
+	data[i] = 'x';
+	}
+	data[2*pageSize -1 ] = 0;
+	return data+start;
+}
+#else
+char *dangerousString1() { return NULL; }
+char *dangerousString2() { return NULL; }
+#endif
+
+// issue 26066
+const unsigned long long int issue26066 = (const unsigned long long) -1;
+
+// issue 26517
+// Introduce two pointer types which are distinct, but have the same
+// base type. Make sure that both of those pointer types get resolved
+// correctly. Before the fix for 26517 if one of these pointer types
+// was resolved before the other one was processed, the second one
+// would never be resolved.
+// Before this issue was fixed this test failed on Windows,
+// where va_list expands to a named char* type.
+typedef va_list TypeOne;
+typedef char *TypeTwo;
+
+// issue 28540
+
+static void twoargs1(void *p, int n) {}
+static void *twoargs2() { return 0; }
+static int twoargs3(void * p) { return 0; }
+
+// issue 28545
+// Failed to add type conversion for negative constant.
+
+static void issue28545F(char **p, int n, complex double a) {}
+
+// issue 28772 part 1 - part 2 in testx.go
+// Failed to add type conversion for Go constant set to C constant.
+// No runtime test; just make sure it compiles.
+
+#define issue28772Constant 1
+
+// issue 28896
+// cgo was incorrectly adding padding after a packed struct.
+typedef struct {
+	void *f1;
+	uint32_t f2;
+} __attribute__((__packed__)) innerPacked;
+
+typedef struct {
+	innerPacked g1;
+	uint64_t g2;
+} outerPacked;
+
+typedef struct {
+	void *f1;
+	uint32_t f2;
+} innerUnpacked;
+
+typedef struct {
+	innerUnpacked g1;
+	uint64_t g2;
+} outerUnpacked;
+
+size_t offset(int x) {
+	switch (x) {
+	case 0:
+		return offsetof(innerPacked, f2);
+	case 1:
+		return offsetof(outerPacked, g2);
+	case 2:
+		return offsetof(innerUnpacked, f2);
+	case 3:
+		return offsetof(outerUnpacked, g2);
+	default:
+		abort();
+	}
+}
+
+// issue 29748
+
+typedef struct { char **p; } S29748;
+static int f29748(S29748 *p) { return 0; }
+
+// issue 29781
+// Error with newline inserted into constant expression.
+// Compilation test only, nothing to run.
+
+static void issue29781F(char **p, int n) {}
+#define ISSUE29781C 0
+
+// issue 31093
+static uint16_t issue31093F(uint16_t v) { return v; }
+
+// issue 32579
+typedef struct S32579 { unsigned char data[1]; } S32579;
+
+// issue 37033, cgo.Handle
+extern void GoFunc37033(uintptr_t handle);
+void cFunc37033(uintptr_t handle) { GoFunc37033(handle); }
+
+// issue 38649
+// Test that #define'd type aliases work.
+#define netbsd_gid unsigned int
+
+// issue 40494
+// Inconsistent handling of tagged enum and union types.
+enum Enum40494 { X_40494 };
+union Union40494 { int x; };
+void issue40494(enum Enum40494 e, union Union40494* up) {}
+
+// Issue 45451, bad handling of go:notinheap types.
+typedef struct issue45451Undefined issue45451;
+
+// Issue 49633, example of cgo.Handle with void*.
+extern void GoFunc49633(void*);
+void cfunc49633(void *context) { GoFunc49633(context); }
+
+*/
+import "C"
+
+import (
+	"context"
+	"fmt"
+	"math"
+	"math/rand"
+	"os"
+	"os/signal"
+	"reflect"
+	"runtime"
+	"runtime/cgo"
+	"sync"
+	"syscall"
+	"testing"
+	"time"
+	"unsafe"
+)
+
+// alignment
+
+func testAlign(t *testing.T) {
+	var evt C.SDL_KeyboardEvent
+	C.makeEvent(&evt)
+	if C.same(&evt, evt.typ, evt.which, evt.state, evt.keysym.scancode, evt.keysym.sym, evt.keysym.mod, evt.keysym.unicode) == 0 {
+		t.Error("*** bad alignment")
+		C.cTest(&evt)
+		t.Errorf("Go: %#x %#x %#x %#x %#x %#x %#x\n",
+			evt.typ, evt.which, evt.state, evt.keysym.scancode,
+			evt.keysym.sym, evt.keysym.mod, evt.keysym.unicode)
+		t.Error(evt)
+	}
+}
+
+// api
+
+const greeting = "hello, world"
+
+type testPair struct {
+	Name      string
+	Got, Want interface{}
+}
+
+var testPairs = []testPair{
+	{"GoString", C.GoString(C.greeting), greeting},
+	{"GoStringN", C.GoStringN(C.greeting, 5), greeting[:5]},
+	{"GoBytes", C.GoBytes(unsafe.Pointer(C.greeting), 5), []byte(greeting[:5])},
+}
+
+func testHelpers(t *testing.T) {
+	for _, pair := range testPairs {
+		if !reflect.DeepEqual(pair.Got, pair.Want) {
+			t.Errorf("%s: got %#v, want %#v", pair.Name, pair.Got, pair.Want)
+		}
+	}
+}
+
+// basic test cases
+
+const EINVAL = C.EINVAL /* test #define */
+
+var KILO = C.KILO
+
+func uuidgen() {
+	var uuid C.cgo_uuid_t
+	C.uuid_generate(&uuid[0])
+}
+
+func Strtol(s string, base int) (int, error) {
+	p := C.CString(s)
+	n, err := C.strtol(p, nil, C.int(base))
+	C.free(unsafe.Pointer(p))
+	return int(n), err
+}
+
+func Atol(s string) int {
+	p := C.CString(s)
+	n := C.atol(p)
+	C.free(unsafe.Pointer(p))
+	return int(n)
+}
+
+func testConst(t *testing.T) {
+	C.myConstFunc(nil, 0, nil)
+}
+
+func testEnum(t *testing.T) {
+	if C.Enum1 != 1 || C.Enum2 != 2 {
+		t.Error("bad enum", C.Enum1, C.Enum2)
+	}
+}
+
+func testNamedEnum(t *testing.T) {
+	e := new(C.enum_E)
+
+	*e = C.Enum1
+	if *e != 1 {
+		t.Error("bad enum", C.Enum1)
+	}
+
+	*e = C.Enum2
+	if *e != 2 {
+		t.Error("bad enum", C.Enum2)
+	}
+}
+
+func testCastToEnum(t *testing.T) {
+	e := C.enum_E(C.Enum1)
+	if e != 1 {
+		t.Error("bad enum", C.Enum1)
+	}
+
+	e = C.enum_E(C.Enum2)
+	if e != 2 {
+		t.Error("bad enum", C.Enum2)
+	}
+}
+
+func testAtol(t *testing.T) {
+	l := Atol("123")
+	if l != 123 {
+		t.Error("Atol 123: ", l)
+	}
+}
+
+func testErrno(t *testing.T) {
+	p := C.CString("no-such-file")
+	m := C.CString("r")
+	f, err := C.fopen(p, m)
+	C.free(unsafe.Pointer(p))
+	C.free(unsafe.Pointer(m))
+	if err == nil {
+		C.fclose(f)
+		t.Fatalf("C.fopen: should fail")
+	}
+	if err != syscall.ENOENT {
+		t.Fatalf("C.fopen: unexpected error: %v", err)
+	}
+}
+
+func testMultipleAssign(t *testing.T) {
+	p := C.CString("234")
+	n, m := C.strtol(p, nil, 345), C.strtol(p, nil, 10)
+	if runtime.GOOS == "openbsd" {
+		// Bug in OpenBSD strtol(3) - base > 36 succeeds.
+		if (n != 0 && n != 239089) || m != 234 {
+			t.Fatal("Strtol x2: ", n, m)
+		}
+	} else if n != 0 || m != 234 {
+		t.Fatal("Strtol x2: ", n, m)
+	}
+	C.free(unsafe.Pointer(p))
+}
+
+var (
+	cuint  = (C.uint)(0)
+	culong C.ulong
+	cchar  C.char
+)
+
+type Context struct {
+	ctx *C.struct_ibv_context
+}
+
+func benchCgoCall(b *testing.B) {
+	b.Run("add-int", func(b *testing.B) {
+		const x = C.int(2)
+		const y = C.int(3)
+
+		for i := 0; i < b.N; i++ {
+			C.add(x, y)
+		}
+	})
+
+	b.Run("one-pointer", func(b *testing.B) {
+		var a0 C.VkDeviceCreateInfo
+		for i := 0; i < b.N; i++ {
+			C.handleComplexPointer(&a0)
+		}
+	})
+	b.Run("eight-pointers", func(b *testing.B) {
+		var a0, a1, a2, a3, a4, a5, a6, a7 C.VkDeviceCreateInfo
+		for i := 0; i < b.N; i++ {
+			C.handleComplexPointer8(&a0, &a1, &a2, &a3, &a4, &a5, &a6, &a7)
+		}
+	})
+	b.Run("eight-pointers-nil", func(b *testing.B) {
+		var a0, a1, a2, a3, a4, a5, a6, a7 *C.VkDeviceCreateInfo
+		for i := 0; i < b.N; i++ {
+			C.handleComplexPointer8(a0, a1, a2, a3, a4, a5, a6, a7)
+		}
+	})
+	b.Run("eight-pointers-array", func(b *testing.B) {
+		var a [8]C.VkDeviceCreateInfo
+		for i := 0; i < b.N; i++ {
+			C.handleComplexPointer8(&a[0], &a[1], &a[2], &a[3], &a[4], &a[5], &a[6], &a[7])
+		}
+	})
+	b.Run("eight-pointers-slice", func(b *testing.B) {
+		a := make([]C.VkDeviceCreateInfo, 8)
+		for i := 0; i < b.N; i++ {
+			C.handleComplexPointer8(&a[0], &a[1], &a[2], &a[3], &a[4], &a[5], &a[6], &a[7])
+		}
+	})
+}
+
+// Benchmark measuring overhead from Go to C and back to Go (via a callback)
+func benchCallback(b *testing.B) {
+	var x = false
+	for i := 0; i < b.N; i++ {
+		nestedCall(func() { x = true })
+	}
+	if !x {
+		b.Fatal("nestedCall was not invoked")
+	}
+}
+
+var sinkString string
+
+func benchGoString(b *testing.B) {
+	for i := 0; i < b.N; i++ {
+		sinkString = C.GoString(C.cstr)
+	}
+	const want = "abcefghijklmnopqrstuvwxyzABCEFGHIJKLMNOPQRSTUVWXYZ1234567890"
+	if sinkString != want {
+		b.Fatalf("%q != %q", sinkString, want)
+	}
+}
+
+// Static (build-time) test that syntax traversal visits all operands of s[i:j:k].
+func sliceOperands(array [2000]int) {
+	_ = array[C.KILO:C.KILO:C.KILO] // no type error
+}
+
+// set in cgo_thread_lock.go init
+var testThreadLockFunc = func(*testing.T) {}
+
+// complex alignment
+
+func TestComplexAlign(t *testing.T) {
+	if C.cplxAlign.x != 3.14 {
+		t.Errorf("got %v, expected 3.14", C.cplxAlign.x)
+	}
+	if C.cplxAlign.y != 2.17 {
+		t.Errorf("got %v, expected 2.17", C.cplxAlign.y)
+	}
+}
+
+// constants and pointer checking
+
+func testCheckConst(t *testing.T) {
+	// The test is that this compiles successfully.
+	p := C.malloc(C.size_t(unsafe.Sizeof(C.int(0))))
+	defer C.free(p)
+	C.CheckConstFunc(&C.CheckConstStruct{(*C.int)(p)}, C.CheckConstVal)
+}
+
+// duplicate symbol
+
+func duplicateSymbols() {
+	fmt.Printf("%v %v %v\n", C.base_symbol, C.alias_one, C.alias_two)
+}
+
+// environment
+
+// This is really an os package test but here for convenience.
+func testSetEnv(t *testing.T) {
+	if runtime.GOOS == "windows" {
+		// Go uses SetEnvironmentVariable on windows. However,
+		// C runtime takes a *copy* at process startup of the
+		// OS environment, and stores it in environ/envp.
+		// It is this copy that	getenv/putenv manipulate.
+		t.Logf("skipping test")
+		return
+	}
+	const key = "CGO_OS_TEST_KEY"
+	const val = "CGO_OS_TEST_VALUE"
+	os.Setenv(key, val)
+	keyc := C.CString(key)
+	defer C.free(unsafe.Pointer(keyc))
+	v := C.getenv(keyc)
+	if uintptr(unsafe.Pointer(v)) == 0 {
+		t.Fatal("getenv returned NULL")
+	}
+	vs := C.GoString(v)
+	if vs != val {
+		t.Fatalf("getenv() = %q; want %q", vs, val)
+	}
+}
+
+// function pointer variables
+
+func callBridge(f C.intFunc) int {
+	return int(C.bridge_int_func(f))
+}
+
+func callCBridge(f C.intFunc) C.int {
+	return C.bridge_int_func(f)
+}
+
+func testFpVar(t *testing.T) {
+	const expected = 42
+	f := C.intFunc(C.fortytwo)
+	res1 := C.bridge_int_func(f)
+	if r1 := int(res1); r1 != expected {
+		t.Errorf("got %d, want %d", r1, expected)
+	}
+	res2 := callCBridge(f)
+	if r2 := int(res2); r2 != expected {
+		t.Errorf("got %d, want %d", r2, expected)
+	}
+	r3 := callBridge(f)
+	if r3 != expected {
+		t.Errorf("got %d, want %d", r3, expected)
+	}
+}
+
+// issue 1222
+type AsyncEvent struct {
+	event C.struct_ibv_async_event
+}
+
+// issue 1635
+
+func test1635(t *testing.T) {
+	C.scatter()
+	if v := C.hola; v != 0 {
+		t.Fatalf("C.hola is %d, should be 0", v)
+	}
+	if v := C.testHola(); v != 0 {
+		t.Fatalf("C.testHola() is %d, should be 0", v)
+	}
+}
+
+// issue 2470
+
+func testUnsignedInt(t *testing.T) {
+	a := (int64)(C.UINT32VAL)
+	b := (int64)(0xc008427b)
+	if a != b {
+		t.Errorf("Incorrect unsigned int - got %x, want %x", a, b)
+	}
+}
+
+// issue 3250
+
+func test3250(t *testing.T) {
+	if runtime.GOOS == "windows" {
+		t.Skip("not applicable on windows")
+	}
+
+	t.Skip("skipped, see golang.org/issue/5885")
+	var (
+		thres = 1
+		sig   = syscall_dot_SIGCHLD
+	)
+	type result struct {
+		n   int
+		sig os.Signal
+	}
+	var (
+		sigCh     = make(chan os.Signal, 10)
+		waitStart = make(chan struct{})
+		waitDone  = make(chan result)
+	)
+
+	signal.Notify(sigCh, sig)
+
+	go func() {
+		n := 0
+		alarm := time.After(time.Second * 3)
+		for {
+			select {
+			case <-waitStart:
+				waitStart = nil
+			case v := <-sigCh:
+				n++
+				if v != sig || n > thres {
+					waitDone <- result{n, v}
+					return
+				}
+			case <-alarm:
+				waitDone <- result{n, sig}
+				return
+			}
+		}
+	}()
+
+	waitStart <- struct{}{}
+	C.testSendSIG()
+	r := <-waitDone
+	if r.sig != sig {
+		t.Fatalf("received signal %v, but want %v", r.sig, sig)
+	}
+	t.Logf("got %d signals\n", r.n)
+	if r.n <= thres {
+		t.Fatalf("expected more than %d", thres)
+	}
+}
+
+// issue 3261
+
+func testLibgcc(t *testing.T) {
+	var table = []struct {
+		in, out C.int
+	}{
+		{0, 0},
+		{1, 1},
+		{-42, 42},
+		{1000300, 1000300},
+		{1 - 1<<31, 1<<31 - 1},
+	}
+	for _, v := range table {
+		if o := C.vabs(v.in); o != v.out {
+			t.Fatalf("abs(%d) got %d, should be %d", v.in, o, v.out)
+			return
+		}
+	}
+}
+
+// issue 3729
+
+func test3729(t *testing.T) {
+	if runtime.GOOS == "windows" {
+		t.Skip("skipping on windows")
+	}
+
+	_, e := C.g()
+	if e != syscall.E2BIG {
+		t.Errorf("got %q, expect %q", e, syscall.E2BIG)
+	}
+	_, e = C.g2(C.EINVAL, C._expA, C._expB, C._expC, C._expD)
+	if e != syscall.EINVAL {
+		t.Errorf("got %q, expect %q", e, syscall.EINVAL)
+	}
+}
+
+// issue 3945
+
+func testPrintf(t *testing.T) {
+	C.say()
+}
+
+// issue 4054
+
+var issue4054a = []int{C.A, C.B, C.C, C.D, C.E, C.F, C.G, C.H, C.I, C.J}
+
+// issue 4339
+
+func test4339(t *testing.T) {
+	C.handle4339(&C.exported4339)
+}
+
+// issue 4417
+
+func testBoolAlign(t *testing.T) {
+	b := C.c_bool(true, true, 10, true, false)
+	if b != 10 {
+		t.Fatalf("found %d expected 10\n", b)
+	}
+	b = C.c_bool(true, true, 5, true, true)
+	if b != 5 {
+		t.Fatalf("found %d expected 5\n", b)
+	}
+	b = C.c_bool(true, true, 3, true, false)
+	if b != 3 {
+		t.Fatalf("found %d expected 3\n", b)
+	}
+	b = C.c_bool(false, false, 1, true, false)
+	if b != 1 {
+		t.Fatalf("found %d expected 1\n", b)
+	}
+	b = C.c_bool(false, true, 200, true, false)
+	if b != 200 {
+		t.Fatalf("found %d expected 200\n", b)
+	}
+}
+
+// issue 4857
+
+func test4857() {
+	_ = C.issue4857()
+}
+
+// issue 5224
+
+func testCflags(t *testing.T) {
+	is_windows := C.is_windows == 1
+	if is_windows != (runtime.GOOS == "windows") {
+		t.Errorf("is_windows: %v, runtime.GOOS: %s", is_windows, runtime.GOOS)
+	}
+	if C.common != 123 {
+		t.Errorf("common: %v (expected 123)", C.common)
+	}
+}
+
+// issue 5227
+
+func test5227(t *testing.T) {
+	C.init()
+}
+
+func selectfont() C.Fontinfo {
+	return C.SansTypeface
+}
+
+// issue 5242
+
+func test5242(t *testing.T) {
+	if got := C.issue5242(C.foo{}, C.bar{}); got != 5242 {
+		t.Errorf("got %v", got)
+	}
+}
+
+func test5603(t *testing.T) {
+	var x [5]int64
+	exp := int64(C.issue5603exp)
+	x[0] = int64(C.issue5603foo0())
+	x[1] = int64(C.issue5603foo1(nil))
+	x[2] = int64(C.issue5603foo2(nil, nil))
+	x[3] = int64(C.issue5603foo3(nil, nil, nil))
+	x[4] = int64(C.issue5603foo4(nil, nil, nil, nil))
+	for i, v := range x {
+		if v != exp {
+			t.Errorf("issue5603foo%d() returns %v, expected %v", i, v, exp)
+		}
+	}
+}
+
+// issue 5337
+
+func test5337(t *testing.T) {
+	C.test5337()
+}
+
+// issue 5740
+
+func test5740(t *testing.T) {
+	if v := C.test5740a() + C.test5740b(); v != 5 {
+		t.Errorf("expected 5, got %v", v)
+	}
+}
+
+// issue 5986
+
+func test5986(t *testing.T) {
+	C.output5986()
+}
+
+// issue 6128
+
+func test6128() {
+	// nothing to run, just make sure this compiles.
+	_ = C.X
+}
+
+// issue 6390
+
+func test6390(t *testing.T) {
+	p1 := C.malloc(1024)
+	if p1 == nil {
+		t.Fatalf("C.malloc(1024) returned nil")
+	}
+	p2 := C.malloc(0)
+	if p2 == nil {
+		t.Fatalf("C.malloc(0) returned nil")
+	}
+	C.free(p1)
+	C.free(p2)
+}
+
+func test6472() {
+	// nothing to run, just make sure this compiles
+	s := new(C.z)
+	println(s.y[0].x)
+}
+
+// issue 6506
+
+func test6506() {
+	// nothing to run, just make sure this compiles
+	var x C.size_t
+
+	C.calloc(x, x)
+	C.malloc(x)
+	C.realloc(nil, x)
+	C.memcpy(nil, nil, x)
+	C.memcmp(nil, nil, x)
+	C.memmove(nil, nil, x)
+	C.strncpy(nil, nil, x)
+	C.strncmp(nil, nil, x)
+	C.strncat(nil, nil, x)
+	x = C.strxfrm(nil, nil, x)
+	C.memchr(nil, 0, x)
+	x = C.strcspn(nil, nil)
+	x = C.strspn(nil, nil)
+	C.memset(nil, 0, x)
+	x = C.strlen(nil)
+	_ = x
+}
+
+// issue 6612
+
+func testNaming(t *testing.T) {
+	C.myfunc()
+	C.myfunc_def()
+	if v := C.myvar; v != 5 {
+		t.Errorf("C.myvar = %d, want 5", v)
+	}
+	if v := C.myvar_def; v != 5 {
+		t.Errorf("C.myvar_def = %d, want 5", v)
+	}
+	if s := C.GoString(C.mytext); s != "abcdef" {
+		t.Errorf("C.mytext = %q, want %q", s, "abcdef")
+	}
+	if s := C.GoString(C.mytext_def); s != "abcdef" {
+		t.Errorf("C.mytext_def = %q, want %q", s, "abcdef")
+	}
+	if c := C.myenum; c != 1234 {
+		t.Errorf("C.myenum = %v, want 1234", c)
+	}
+	if c := C.myenum_def; c != 1234 {
+		t.Errorf("C.myenum_def = %v, want 1234", c)
+	}
+	{
+		const c = C.myenum
+		if c != 1234 {
+			t.Errorf("C.myenum as const = %v, want 1234", c)
+		}
+	}
+	{
+		const c = C.myenum_def
+		if c != 1234 {
+			t.Errorf("C.myenum as const = %v, want 1234", c)
+		}
+	}
+	if c := C.myint_def; c != 12345 {
+		t.Errorf("C.myint_def = %v, want 12345", c)
+	}
+	{
+		const c = C.myint_def
+		if c != 12345 {
+			t.Errorf("C.myint as const = %v, want 12345", c)
+		}
+	}
+
+	if c := C.myfloat_def; c != 1.5 {
+		t.Errorf("C.myint_def = %v, want 1.5", c)
+	}
+	{
+		const c = C.myfloat_def
+		if c != 1.5 {
+			t.Errorf("C.myint as const = %v, want 1.5", c)
+		}
+	}
+
+	if s := C.mystring_def; s != "hello" {
+		t.Errorf("C.mystring_def = %q, want %q", s, "hello")
+	}
+}
+
+// issue 6907
+
+func test6907(t *testing.T) {
+	want := "yarn"
+	if got := C.GoString(C.Issue6907CopyString(want)); got != want {
+		t.Errorf("C.GoString(C.Issue6907CopyString(%q)) == %q, want %q", want, got, want)
+	}
+}
+
+// issue 7560
+
+func test7560(t *testing.T) {
+	// some mingw don't implement __packed__ correctly.
+	if C.offset7560() != 1 {
+		t.Skip("C compiler did not pack struct")
+	}
+
+	// C.misaligned should have x but then a padding field to get to the end of the struct.
+	// There should not be a field named 'y'.
+	var v C.misaligned
+	rt := reflect.TypeOf(&v).Elem()
+	if rt.NumField() != 2 || rt.Field(0).Name != "x" || rt.Field(1).Name != "_" {
+		t.Errorf("unexpected fields in C.misaligned:\n")
+		for i := 0; i < rt.NumField(); i++ {
+			t.Logf("%+v\n", rt.Field(i))
+		}
+	}
+}
+
+// issue 7786
+
+func f() {
+	var x1 *C.typedef_test7786
+	var x2 *C.struct_test7786
+	x1 = x2
+	x2 = x1
+	C.f7786(x1)
+	C.f7786(x2)
+	C.g7786(x1)
+	C.g7786(x2)
+
+	var b1 *C.typedef_body7786
+	var b2 *C.struct_body7786
+	b1 = b2
+	b2 = b1
+	C.b7786(b1)
+	C.b7786(b2)
+	C.c7786(b1)
+	C.c7786(b2)
+
+	var u1 *C.typedef_union7786
+	var u2 *C.union_union7786
+	u1 = u2
+	u2 = u1
+	C.u7786(u1)
+	C.u7786(u2)
+	C.v7786(u1)
+	C.v7786(u2)
+}
+
+// issue 8092
+
+func test8092(t *testing.T) {
+	tests := []struct {
+		s    string
+		a, b *C.char
+	}{
+		{"text", &C.text[0], C.ctext()},
+		{"data", &C.data[0], C.cdata()},
+	}
+	for _, test := range tests {
+		if test.a != test.b {
+			t.Errorf("%s: pointer mismatch: %v != %v", test.s, test.a, test.b)
+		}
+		if got := C.GoString(test.a); got != test.s {
+			t.Errorf("%s: points at %#v, want %#v", test.s, got, test.s)
+		}
+	}
+}
+
+// issues 8368 and 8441
+
+func issue8368(one *C.struct_one, two *C.struct_two) {
+}
+
+func issue8441(one *C.one, two *C.two) {
+	issue8441(two.x, one.x)
+}
+
+// issue 8428
+
+var _ = C.struct_issue8428one{
+	b: C.char(0),
+	// The trailing rest field is not available in cgo.
+	// See issue 11925.
+	// rest: [0]C.char{},
+}
+
+var _ = C.struct_issue8428two{
+	p:    unsafe.Pointer(nil),
+	b:    C.char(0),
+	rest: [0]C.char{},
+}
+
+var _ = C.struct_issue8428three{
+	w: [1][2][3][0]C.char{},
+	x: [2][3][0][1]C.char{},
+	y: [3][0][1][2]C.char{},
+	z: [0][1][2][3]C.char{},
+}
+
+// issue 8811
+
+func test8811(t *testing.T) {
+	C.issue8811Execute()
+}
+
+// issue 9557
+
+func test9557(t *testing.T) {
+	// implicitly dereference a Go variable
+	foo := C.issue9557foo
+	if v := foo.a; v != 42 {
+		t.Fatalf("foo.a expected 42, but got %d", v)
+	}
+
+	// explicitly dereference a C variable
+	if v := (*C.issue9557foo).a; v != 42 {
+		t.Fatalf("(*C.issue9557foo).a expected 42, but is %d", v)
+	}
+
+	// implicitly dereference a C variable
+	if v := C.issue9557foo.a; v != 42 {
+		t.Fatalf("C.issue9557foo.a expected 42, but is %d", v)
+	}
+}
+
+// issue 8331 part 1
+
+func issue8331a() C.issue8331 {
+	return issue8331Var
+}
+
+// issue 10303
+
+func test10303(t *testing.T, n int) {
+	if runtime.Compiler == "gccgo" {
+		t.Skip("gccgo permits C pointers on the stack")
+	}
+
+	// Run at a few different stack depths just to avoid an unlucky pass
+	// due to variables ending up on different pages.
+	if n > 0 {
+		test10303(t, n-1)
+	}
+	if t.Failed() {
+		return
+	}
+	var x, y, z, v, si C.int
+	var s C.Struct
+	C.setintstar(&x)
+	C.setintptr(&y)
+	C.setvoidptr(unsafe.Pointer(&v))
+	s.P = &si
+	C.setstruct(s)
+
+	if uintptr(unsafe.Pointer(&x))&^0xfff == uintptr(unsafe.Pointer(&z))&^0xfff {
+		t.Error("C int* argument on stack")
+	}
+	if uintptr(unsafe.Pointer(&y))&^0xfff == uintptr(unsafe.Pointer(&z))&^0xfff {
+		t.Error("C intptr argument on stack")
+	}
+	if uintptr(unsafe.Pointer(&v))&^0xfff == uintptr(unsafe.Pointer(&z))&^0xfff {
+		t.Error("C void* argument on stack")
+	}
+	if uintptr(unsafe.Pointer(&si))&^0xfff == uintptr(unsafe.Pointer(&z))&^0xfff {
+		t.Error("C struct field pointer on stack")
+	}
+}
+
+// issue 11925
+
+func test11925(t *testing.T) {
+	if C.sizeof_struct_a11925 != unsafe.Sizeof(C.struct_a11925{}) {
+		t.Errorf("size of a changed: C %d, Go %d", C.sizeof_struct_a11925, unsafe.Sizeof(C.struct_a11925{}))
+	}
+	if C.sizeof_struct_b11925 != unsafe.Sizeof(C.struct_b11925{}) {
+		t.Errorf("size of b changed: C %d, Go %d", C.sizeof_struct_b11925, unsafe.Sizeof(C.struct_b11925{}))
+	}
+}
+
+// issue 12030
+
+func test12030(t *testing.T) {
+	buf := (*C.char)(C.malloc(256))
+	defer C.free(unsafe.Pointer(buf))
+	for _, f := range []float64{1.0, 2.0, 3.14} {
+		C.issue12030conv(buf, C.double(f))
+		got := C.GoString(buf)
+		if want := fmt.Sprintf("d=%g", f); got != want {
+			t.Fatalf("C.sprintf failed for %g: %q != %q", f, got, want)
+		}
+	}
+}
+
+// issue 13402
+
+var _ C.complexfloat
+var _ C.complexdouble
+
+// issue 13930
+// Test that cgo's multiple-value special form for
+// C function calls works in variable declaration statements.
+
+var _, _ = C.abs(0)
+
+// issue 14838
+
+func test14838(t *testing.T) {
+	data := []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
+	cData := C.CBytes(data)
+	defer C.free(cData)
+
+	if C.check_cbytes((*C.char)(cData), C.size_t(len(data))) == 0 {
+		t.Fatalf("mismatched data: expected %v, got %v", data, (*(*[10]byte)(unsafe.Pointer(cData)))[:])
+	}
+}
+
+// issue 17065
+
+var sink C.int
+
+func test17065(t *testing.T) {
+	if runtime.GOOS == "darwin" || runtime.GOOS == "ios" {
+		t.Skip("broken on darwin; issue 17065")
+	}
+	for i := range C.ii {
+		sink = C.ii[i]
+	}
+}
+
+// issue 17537
+
+func test17537(t *testing.T) {
+	v := C.S17537{i: 17537}
+	if got, want := C.I17537(&v), C.int(17537); got != want {
+		t.Errorf("got %d, want %d", got, want)
+	}
+
+	p := (*C.char)(C.malloc(1))
+	*p = 17
+	if got, want := C.F17537(&p), C.int(17); got != want {
+		t.Errorf("got %d, want %d", got, want)
+	}
+
+	C.F18298(nil)
+	var v18298 C.T18298_2
+	C.G18298(C.T18298_1(v18298))
+}
+
+// issue 17723
+
+func testAPI() {
+	var cs *C.char
+	cs = C.CString("hello")
+	defer C.free(unsafe.Pointer(cs))
+	var s string
+	s = C.GoString((*C.char)(C.api_hello))
+	s = C.GoStringN((*C.char)(C.api_hello), C.int(6))
+	var b []byte
+	b = C.GoBytes(unsafe.Pointer(C.api_hello), C.int(6))
+	_, _ = s, b
+	C.cstring_pointer_fun(nil)
+}
+
+// issue 18126
+
+func test18126(t *testing.T) {
+	p := C.malloc(1)
+	_, err := C.Issue18126C(&p)
+	C.free(p)
+	_ = err
+}
+
+// issue 18720
+
+func test18720(t *testing.T) {
+	if got, want := C.HELLO_WORLD, "hello\000world"; got != want {
+		t.Errorf("C.HELLO_WORLD == %q, expected %q", got, want)
+	}
+
+	if got, want := C.VAR1, C.int(5); got != want {
+		t.Errorf("C.VAR1 == %v, expected %v", got, want)
+	}
+
+	if got, want := *C.ADDR, C.int(5); got != want {
+		t.Errorf("*C.ADDR == %v, expected %v", got, want)
+	}
+
+	if got, want := C.CALL, C.int(6); got != want {
+		t.Errorf("C.CALL == %v, expected %v", got, want)
+	}
+
+	if got, want := C.CALL, C.int(7); got != want {
+		t.Errorf("C.CALL == %v, expected %v", got, want)
+	}
+
+	// Issue 20125.
+	if got, want := C.SIZE_OF_FOO, 1; got != want {
+		t.Errorf("C.SIZE_OF_FOO == %v, expected %v", got, want)
+	}
+}
+
+// issue 20129
+
+func test20129(t *testing.T) {
+	if C.issue20129 != 0 {
+		t.Fatal("test is broken")
+	}
+	C.issue20129Foo()
+	if C.issue20129 != 1 {
+		t.Errorf("got %v but expected %v", C.issue20129, 1)
+	}
+	C.issue20129Bar()
+	if C.issue20129 != 2 {
+		t.Errorf("got %v but expected %v", C.issue20129, 2)
+	}
+}
+
+// issue 20369
+
+func test20369(t *testing.T) {
+	if C.XUINT64_MAX != math.MaxUint64 {
+		t.Fatalf("got %v, want %v", uint64(C.XUINT64_MAX), uint64(math.MaxUint64))
+	}
+}
+
+// issue 21668
+
+var issue21668_X = C.x21668
+
+// issue 21708
+
+func test21708(t *testing.T) {
+	if got, want := C.CAST_TO_INT64, -1; got != want {
+		t.Errorf("C.CAST_TO_INT64 == %v, expected %v", got, want)
+	}
+}
+
+// issue 21809
+
+func test21809(t *testing.T) {
+	longVar := C.long(3)
+	typedefVar := C.MySigned_t(4)
+	typedefTypedefVar := C.MySigned2_t(5)
+
+	// all three should be considered identical to `long`
+	if ret := C.takes_long(longVar); ret != 9 {
+		t.Errorf("got %v but expected %v", ret, 9)
+	}
+	if ret := C.takes_long(typedefVar); ret != 16 {
+		t.Errorf("got %v but expected %v", ret, 16)
+	}
+	if ret := C.takes_long(typedefTypedefVar); ret != 25 {
+		t.Errorf("got %v but expected %v", ret, 25)
+	}
+
+	// They should also be identical to the typedef'd type
+	if ret := C.takes_typedef(longVar); ret != 9 {
+		t.Errorf("got %v but expected %v", ret, 9)
+	}
+	if ret := C.takes_typedef(typedefVar); ret != 16 {
+		t.Errorf("got %v but expected %v", ret, 16)
+	}
+	if ret := C.takes_typedef(typedefTypedefVar); ret != 25 {
+		t.Errorf("got %v but expected %v", ret, 25)
+	}
+}
+
+// issue 22906
+
+func test22906(t *testing.T) {
+	var x1 C.jobject = 0 // Note: 0, not nil. That makes sure we use uintptr for these types.
+	_ = x1
+	var x2 C.jclass = 0
+	_ = x2
+	var x3 C.jthrowable = 0
+	_ = x3
+	var x4 C.jstring = 0
+	_ = x4
+	var x5 C.jarray = 0
+	_ = x5
+	var x6 C.jbooleanArray = 0
+	_ = x6
+	var x7 C.jbyteArray = 0
+	_ = x7
+	var x8 C.jcharArray = 0
+	_ = x8
+	var x9 C.jshortArray = 0
+	_ = x9
+	var x10 C.jintArray = 0
+	_ = x10
+	var x11 C.jlongArray = 0
+	_ = x11
+	var x12 C.jfloatArray = 0
+	_ = x12
+	var x13 C.jdoubleArray = 0
+	_ = x13
+	var x14 C.jobjectArray = 0
+	_ = x14
+	var x15 C.jweak = 0
+	_ = x15
+}
+
+// issue 22958
+// Nothing to run, just make sure this compiles.
+var Vissue22958 C.issue22958Type
+
+func test23356(t *testing.T) {
+	if got, want := C.a(), C.int(5); got != want {
+		t.Errorf("C.a() == %v, expected %v", got, want)
+	}
+	if got, want := C.r(), C.int(3); got != want {
+		t.Errorf("C.r() == %v, expected %v", got, want)
+	}
+}
+
+// issue 23720
+
+func Issue23720F() {
+	var x C.issue23720A
+	C.issue23720F(x)
+}
+
+// issue 24206
+
+func test24206(t *testing.T) {
+	if runtime.GOOS != "linux" || runtime.GOARCH != "amd64" {
+		t.Skipf("skipping on %s/%s", runtime.GOOS, runtime.GOARCH)
+	}
+
+	if l := len(C.GoString(C.dangerousString1())); l != 123 {
+		t.Errorf("Incorrect string length - got %d, want 123", l)
+	}
+	if l := len(C.GoString(C.dangerousString2())); l != 4096+123 {
+		t.Errorf("Incorrect string length - got %d, want %d", l, 4096+123)
+	}
+}
+
+// issue 25143
+
+func issue25143sum(ns ...C.int) C.int {
+	total := C.int(0)
+	for _, n := range ns {
+		total += n
+	}
+	return total
+}
+
+func test25143(t *testing.T) {
+	if got, want := issue25143sum(1, 2, 3), C.int(6); got != want {
+		t.Errorf("issue25143sum(1, 2, 3) == %v, expected %v", got, want)
+	}
+}
+
+// issue 26066
+// Wrong type of constant with GCC 8 and newer.
+
+func test26066(t *testing.T) {
+	var i = int64(C.issue26066)
+	if i != -1 {
+		t.Errorf("got %d, want -1", i)
+	}
+}
+
+// issue 26517
+var a C.TypeOne
+var b C.TypeTwo
+
+// issue 27660
+// Stress the interaction between the race detector and cgo in an
+// attempt to reproduce the memory corruption described in #27660.
+// The bug was very timing sensitive; at the time of writing this
+// test would only trigger the bug about once out of every five runs.
+
+func test27660(t *testing.T) {
+	ctx, cancel := context.WithCancel(context.Background())
+	defer cancel()
+	ints := make([]int, 100)
+	locks := make([]sync.Mutex, 100)
+	// Slowly create threads so that ThreadSanitizer is forced to
+	// frequently resize its SyncClocks.
+	for i := 0; i < 100; i++ {
+		go func() {
+			for ctx.Err() == nil {
+				// Sleep in C for long enough that it is likely that the runtime
+				// will retake this goroutine's currently wired P.
+				C.usleep(1000 /* 1ms */)
+				runtime.Gosched() // avoid starvation (see #28701)
+			}
+		}()
+		go func() {
+			// Trigger lots of synchronization and memory reads/writes to
+			// increase the likelihood that the race described in #27660
+			// results in corruption of ThreadSanitizer's internal state
+			// and thus an assertion failure or segfault.
+			i := 0
+			for ctx.Err() == nil {
+				j := rand.Intn(100)
+				locks[j].Lock()
+				ints[j]++
+				locks[j].Unlock()
+				// needed for gccgo, to avoid creation of an
+				// unpreemptible "fast path" in this loop. Choice
+				// of (1<<24) is somewhat arbitrary.
+				if i%(1<<24) == 0 {
+					runtime.Gosched()
+				}
+				i++
+
+			}
+		}()
+		time.Sleep(time.Millisecond)
+	}
+}
+
+// issue 28540
+
+func twoargsF() {
+	var v struct{ p *byte }
+	C.twoargs1(C.twoargs2(), C.twoargs3(unsafe.Pointer(&v)))
+}
+
+// issue 28545
+
+func issue28545G(p **C.char) {
+	C.issue28545F(p, -1, (0))
+	C.issue28545F(p, 2+3, complex(1, 1))
+	C.issue28545F(p, issue28772Constant, issue28772Constant2)
+}
+
+// issue 28772 part 1 - part 2 in testx.go
+
+const issue28772Constant = C.issue28772Constant
+
+// issue 28896
+
+func offset(i int) uintptr {
+	var pi C.innerPacked
+	var po C.outerPacked
+	var ui C.innerUnpacked
+	var uo C.outerUnpacked
+	switch i {
+	case 0:
+		return unsafe.Offsetof(pi.f2)
+	case 1:
+		return unsafe.Offsetof(po.g2)
+	case 2:
+		return unsafe.Offsetof(ui.f2)
+	case 3:
+		return unsafe.Offsetof(uo.g2)
+	default:
+		panic("can't happen")
+	}
+}
+
+func test28896(t *testing.T) {
+	for i := 0; i < 4; i++ {
+		c := uintptr(C.offset(C.int(i)))
+		g := offset(i)
+		if c != g {
+			t.Errorf("%d: C: %d != Go %d", i, c, g)
+		}
+	}
+}
+
+// issue 29383
+// cgo's /*line*/ comments failed when inserted after '/',
+// because the result looked like a "//" comment.
+// No runtime test; just make sure it compiles.
+
+func Issue29383(n, size uint) int {
+	if ^C.size_t(0)/C.size_t(n) < C.size_t(size) {
+		return 0
+	}
+	return 0
+}
+
+// issue 29748
+// Error handling a struct initializer that requires pointer checking.
+// Compilation test only, nothing to run.
+
+var Vissue29748 = C.f29748(&C.S29748{
+	nil,
+})
+
+func Fissue299748() {
+	C.f29748(&C.S29748{
+		nil,
+	})
+}
+
+// issue 29781
+
+var issue29781X struct{ X int }
+
+func issue29781F(...int) int { return 0 }
+
+func issue29781G() {
+	var p *C.char
+	C.issue29781F(&p, C.ISSUE29781C+1)
+	C.issue29781F(nil, (C.int)(
+		0))
+	C.issue29781F(&p, (C.int)(0))
+	C.issue29781F(&p, (C.int)(
+		0))
+	C.issue29781F(&p, (C.int)(issue29781X.
+		X))
+}
+
+// issue 30065
+
+func test30065(t *testing.T) {
+	var a [256]byte
+	b := []byte("a")
+	C.memcpy(unsafe.Pointer(&a), unsafe.Pointer(&b[0]), 1)
+	if a[0] != 'a' {
+		t.Errorf("&a failed: got %c, want %c", a[0], 'a')
+	}
+
+	b = []byte("b")
+	C.memcpy(unsafe.Pointer(&a[0]), unsafe.Pointer(&b[0]), 1)
+	if a[0] != 'b' {
+		t.Errorf("&a[0] failed: got %c, want %c", a[0], 'b')
+	}
+
+	d := make([]byte, 256)
+	b = []byte("c")
+	C.memcpy(unsafe.Pointer(&d[0]), unsafe.Pointer(&b[0]), 1)
+	if d[0] != 'c' {
+		t.Errorf("&d[0] failed: got %c, want %c", d[0], 'c')
+	}
+}
+
+// issue 31093
+// No runtime test; just make sure it compiles.
+
+func Issue31093() {
+	C.issue31093F(C.ushort(0))
+}
+
+// issue 32579
+
+func test32579(t *testing.T) {
+	var s [1]C.struct_S32579
+	C.memset(unsafe.Pointer(&s[0].data[0]), 1, 1)
+	if s[0].data[0] != 1 {
+		t.Errorf("&s[0].data[0] failed: got %d, want %d", s[0].data[0], 1)
+	}
+}
+
+// issue 37033, check if cgo.Handle works properly
+
+func testHandle(t *testing.T) {
+	ch := make(chan int)
+
+	for i := 0; i < 42; i++ {
+		h := cgo.NewHandle(ch)
+		go func() {
+			C.cFunc37033(C.uintptr_t(h))
+		}()
+		if v := <-ch; issue37033 != v {
+			t.Fatalf("unexpected receiving value: got %d, want %d", v, issue37033)
+		}
+		h.Delete()
+	}
+}
+
+// issue 38649
+
+var issue38649 C.netbsd_gid = 42
+
+// issue 39877
+
+var issue39877 *C.void = nil
+
+// issue 40494
+// No runtime test; just make sure it compiles.
+
+func Issue40494() {
+	C.issue40494(C.enum_Enum40494(C.X_40494), (*C.union_Union40494)(nil))
+}
+
+// Issue 45451.
+func test45451(t *testing.T) {
+	var u *C.issue45451
+	typ := reflect.ValueOf(u).Type().Elem()
+
+	// The type is undefined in C so allocating it should panic.
+	defer func() {
+		if r := recover(); r == nil {
+			t.Error("expected panic")
+		}
+	}()
+
+	_ = reflect.New(typ)
+	t.Errorf("reflect.New(%v) should have panicked", typ)
+}
+
+// issue 52542
+
+func func52542[T ~[]C.int]() {}
+
+type type52542[T ~*C.float] struct{}
diff --git a/src/cmd/cgo/internal/test/test26213.go b/src/cmd/cgo/internal/test/test26213.go
new file mode 100644
index 0000000..04f8e84
--- /dev/null
+++ b/src/cmd/cgo/internal/test/test26213.go
@@ -0,0 +1,17 @@
+// Copyright 2018 The Go 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:build cgo
+
+package cgotest
+
+import (
+	"testing"
+
+	"cmd/cgo/internal/test/issue26213"
+)
+
+func test26213(t *testing.T) {
+	issue26213.Test26213(t)
+}
diff --git a/src/cmd/cgo/internal/test/test_unix.go b/src/cmd/cgo/internal/test/test_unix.go
new file mode 100644
index 0000000..664c485
--- /dev/null
+++ b/src/cmd/cgo/internal/test/test_unix.go
@@ -0,0 +1,11 @@
+// Copyright 2019 The Go 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:build unix
+
+package cgotest
+
+import "syscall"
+
+var syscall_dot_SIGCHLD = syscall.SIGCHLD
diff --git a/misc/cgo/test/test_windows.go b/src/cmd/cgo/internal/test/test_windows.go
similarity index 100%
rename from misc/cgo/test/test_windows.go
rename to src/cmd/cgo/internal/test/test_windows.go
diff --git a/misc/cgo/test/testx.c b/src/cmd/cgo/internal/test/testx.c
similarity index 100%
rename from misc/cgo/test/testx.c
rename to src/cmd/cgo/internal/test/testx.c
diff --git a/src/cmd/cgo/internal/test/testx.go b/src/cmd/cgo/internal/test/testx.go
new file mode 100644
index 0000000..0e2a51a
--- /dev/null
+++ b/src/cmd/cgo/internal/test/testx.go
@@ -0,0 +1,597 @@
+// Copyright 2011 The Go 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 cgo.
+// Both the import "C" prologue and the main file are sorted by issue number.
+// This file contains //export directives on Go functions
+// and so it must NOT contain C definitions (only declarations).
+// See test.go for C definitions.
+
+package cgotest
+
+import (
+	"runtime"
+	"runtime/cgo"
+	"runtime/debug"
+	"strings"
+	"sync"
+	"sync/atomic"
+	"testing"
+	"unsafe"
+)
+
+/*
+// threads
+extern void doAdd(int, int);
+extern int callGoInCThread(int);
+
+// issue 1328
+void IntoC(void);
+
+// issue 1560
+extern void Issue1560InC(void);
+
+// twoSleep returns the absolute start time of the first sleep
+// in ms.
+long long twoSleep(int);
+
+// issue 3775
+void lockOSThreadC(void);
+int usleep(unsigned usec);
+
+// issue 4054 part 2 - part 1 in test.go
+typedef enum {
+	A = 0,
+	B,
+	C,
+	D,
+	E,
+	F,
+	G,
+	H,
+	II,
+	J,
+} issue4054b;
+
+// issue 5548
+
+extern int issue5548_in_c(void);
+
+// issue 6833
+
+extern unsigned long long issue6833Func(unsigned int, unsigned long long);
+
+// issue 6907
+
+extern int CheckIssue6907C(_GoString_);
+
+// issue 7665
+
+extern void f7665(void);
+
+// issue 7978
+// Stack tracing didn't work during cgo code after calling a Go
+// callback.  Make sure GC works and the stack trace is correct.
+
+#include <stdint.h>
+
+// use ugly atomic variable sync since that doesn't require calling back into
+// Go code or OS dependencies
+void issue7978c(uint32_t *sync);
+
+// issue 8331 part 2 - part 1 in test.go
+// A typedef of an unnamed struct is the same struct when
+// #include'd twice.  No runtime test; just make sure it compiles.
+#include "issue8331.h"
+
+// issue 8945
+
+typedef void (*PFunc8945)();
+extern PFunc8945 func8945; // definition is in test.go
+
+// issue 20910
+void callMulti(void);
+
+// issue 28772 part 2 - part 1 in issuex.go
+#define issue28772Constant2 2
+
+
+// issue 31891
+typedef struct {
+	long obj;
+} Issue31891A;
+
+typedef struct {
+	long obj;
+} Issue31891B;
+
+void callIssue31891(void);
+
+typedef struct {
+	int i;
+} Issue38408, *PIssue38408;
+
+extern void cfunc49633(void*); // definition is in test.go
+*/
+import "C"
+
+// exports
+
+//export ReturnIntLong
+func ReturnIntLong() (int, C.long) {
+	return 1, 2
+}
+
+//export gc
+func gc() {
+	runtime.GC()
+}
+
+// threads
+
+var sum struct {
+	sync.Mutex
+	i int
+}
+
+//export Add
+func Add(x int) {
+	defer func() {
+		recover()
+	}()
+	sum.Lock()
+	sum.i += x
+	sum.Unlock()
+	var p *int
+	*p = 2
+}
+
+//export goDummy
+func goDummy() {
+}
+
+func testCthread(t *testing.T) {
+	if (runtime.GOOS == "darwin" || runtime.GOOS == "ios") && runtime.GOARCH == "arm64" {
+		t.Skip("the iOS exec wrapper is unable to properly handle the panic from Add")
+	}
+	sum.i = 0
+	C.doAdd(10, 6)
+
+	want := 10 * (10 - 1) / 2 * 6
+	if sum.i != want {
+		t.Fatalf("sum=%d, want %d", sum.i, want)
+	}
+}
+
+// Benchmark measuring overhead from C to Go in a C thread.
+// Create a new C thread and invoke Go function repeatedly in the new C thread.
+func benchCGoInCthread(b *testing.B) {
+	n := C.callGoInCThread(C.int(b.N))
+	if int(n) != b.N {
+		b.Fatal("unmatch loop times")
+	}
+}
+
+// issue 1328
+
+//export BackIntoGo
+func BackIntoGo() {
+	x := 1
+
+	for i := 0; i < 10000; i++ {
+		xvariadic(x)
+		if x != 1 {
+			panic("x is not 1?")
+		}
+	}
+}
+
+func xvariadic(x ...interface{}) {
+}
+
+func test1328(t *testing.T) {
+	C.IntoC()
+}
+
+// issue 1560
+// Test that C functions and Go functions run in parallel.
+
+var (
+	issue1560 int32
+
+	issue1560Ch = make(chan bool, 2)
+)
+
+//export Issue1560FromC
+func Issue1560FromC() {
+	for atomic.LoadInt32(&issue1560) != 1 {
+		runtime.Gosched()
+	}
+	atomic.AddInt32(&issue1560, 1)
+	for atomic.LoadInt32(&issue1560) != 3 {
+		runtime.Gosched()
+	}
+	issue1560Ch <- true
+}
+
+func Issue1560FromGo() {
+	atomic.AddInt32(&issue1560, 1)
+	for atomic.LoadInt32(&issue1560) != 2 {
+		runtime.Gosched()
+	}
+	atomic.AddInt32(&issue1560, 1)
+	issue1560Ch <- true
+}
+
+func test1560(t *testing.T) {
+	go Issue1560FromGo()
+	go C.Issue1560InC()
+	<-issue1560Ch
+	<-issue1560Ch
+}
+
+// issue 2462
+
+//export exportbyte
+func exportbyte() byte {
+	return 0
+}
+
+//export exportbool
+func exportbool() bool {
+	return false
+}
+
+//export exportrune
+func exportrune() rune {
+	return 0
+}
+
+//export exporterror
+func exporterror() error {
+	return nil
+}
+
+//export exportint
+func exportint() int {
+	return 0
+}
+
+//export exportuint
+func exportuint() uint {
+	return 0
+}
+
+//export exportuintptr
+func exportuintptr() uintptr {
+	return (uintptr)(0)
+}
+
+//export exportint8
+func exportint8() int8 {
+	return 0
+}
+
+//export exportuint8
+func exportuint8() uint8 {
+	return 0
+}
+
+//export exportint16
+func exportint16() int16 {
+	return 0
+}
+
+//export exportuint16
+func exportuint16() uint16 {
+	return 0
+}
+
+//export exportint32
+func exportint32() int32 {
+	return 0
+}
+
+//export exportuint32
+func exportuint32() uint32 {
+	return 0
+}
+
+//export exportint64
+func exportint64() int64 {
+	return 0
+}
+
+//export exportuint64
+func exportuint64() uint64 {
+	return 0
+}
+
+//export exportfloat32
+func exportfloat32() float32 {
+	return 0
+}
+
+//export exportfloat64
+func exportfloat64() float64 {
+	return 0
+}
+
+//export exportcomplex64
+func exportcomplex64() complex64 {
+	return 0
+}
+
+//export exportcomplex128
+func exportcomplex128() complex128 {
+	return 0
+}
+
+// issue 3741
+
+//export exportSliceIn
+func exportSliceIn(s []byte) bool {
+	return len(s) == cap(s)
+}
+
+//export exportSliceOut
+func exportSliceOut() []byte {
+	return []byte{1}
+}
+
+//export exportSliceInOut
+func exportSliceInOut(s []byte) []byte {
+	return s
+}
+
+// issue 3775
+
+func init() {
+	if runtime.GOOS == "android" {
+		return
+	}
+	// Same as test3775 but run during init so that
+	// there are two levels of internal runtime lock
+	// (1 for init, 1 for cgo).
+	// This would have been broken by CL 11663043.
+	C.lockOSThreadC()
+}
+
+func test3775(t *testing.T) {
+	if runtime.GOOS == "android" {
+		return
+	}
+	// Used to panic because of the UnlockOSThread below.
+	C.lockOSThreadC()
+}
+
+//export lockOSThreadCallback
+func lockOSThreadCallback() {
+	runtime.LockOSThread()
+	runtime.UnlockOSThread()
+	go C.usleep(10000)
+	runtime.Gosched()
+}
+
+// issue 4054 part 2 - part 1 in test.go
+
+var issue4054b = []int{C.A, C.B, C.C, C.D, C.E, C.F, C.G, C.H, C.II, C.J}
+
+//export issue5548FromC
+func issue5548FromC(s string, i int) int {
+	if len(s) == 4 && s == "test" && i == 42 {
+		return 12345
+	}
+	println("got", len(s), i)
+	return 9876
+}
+
+func test5548(t *testing.T) {
+	if x := C.issue5548_in_c(); x != 12345 {
+		t.Errorf("issue5548_in_c = %d, want %d", x, 12345)
+	}
+}
+
+// issue 6833
+
+//export GoIssue6833Func
+func GoIssue6833Func(aui uint, aui64 uint64) uint64 {
+	return aui64 + uint64(aui)
+}
+
+func test6833(t *testing.T) {
+	ui := 7
+	ull := uint64(0x4000300020001000)
+	v := uint64(C.issue6833Func(C.uint(ui), C.ulonglong(ull)))
+	exp := uint64(ui) + ull
+	if v != exp {
+		t.Errorf("issue6833Func() returns %x, expected %x", v, exp)
+	}
+}
+
+// issue 6907
+
+const CString = "C string"
+
+//export CheckIssue6907Go
+func CheckIssue6907Go(s string) C.int {
+	if s == CString {
+		return 1
+	}
+	return 0
+}
+
+func test6907Go(t *testing.T) {
+	if got := C.CheckIssue6907C(CString); got != 1 {
+		t.Errorf("C.CheckIssue6907C() == %d, want %d", got, 1)
+	}
+}
+
+// issue 7665
+
+var bad7665 unsafe.Pointer = C.f7665
+var good7665 uintptr = uintptr(C.f7665)
+
+func test7665(t *testing.T) {
+	if bad7665 == nil || uintptr(bad7665) != good7665 {
+		t.Errorf("ptrs = %p, %#x, want same non-nil pointer", bad7665, good7665)
+	}
+}
+
+// issue 7978
+
+var issue7978sync uint32
+
+func issue7978check(t *testing.T, wantFunc string, badFunc string, depth int) {
+	runtime.GC()
+	buf := make([]byte, 65536)
+	trace := string(buf[:runtime.Stack(buf, true)])
+	for _, goroutine := range strings.Split(trace, "\n\n") {
+		if strings.Contains(goroutine, "test.issue7978go") {
+			trace := strings.Split(goroutine, "\n")
+			// look for the expected function in the stack
+			for i := 0; i < depth; i++ {
+				if badFunc != "" && strings.Contains(trace[1+2*i], badFunc) {
+					t.Errorf("bad stack: found %s in the stack:\n%s", badFunc, goroutine)
+					return
+				}
+				if strings.Contains(trace[1+2*i], wantFunc) {
+					return
+				}
+			}
+			t.Errorf("bad stack: didn't find %s in the stack:\n%s", wantFunc, goroutine)
+			return
+		}
+	}
+	t.Errorf("bad stack: goroutine not found. Full stack dump:\n%s", trace)
+}
+
+func issue7978wait(store uint32, wait uint32) {
+	if store != 0 {
+		atomic.StoreUint32(&issue7978sync, store)
+	}
+	for atomic.LoadUint32(&issue7978sync) != wait {
+		runtime.Gosched()
+	}
+}
+
+//export issue7978cb
+func issue7978cb() {
+	// Force a stack growth from the callback to put extra
+	// pressure on the runtime. See issue #17785.
+	growStack(64)
+	issue7978wait(3, 4)
+}
+
+func growStack(n int) int {
+	var buf [128]int
+	if n == 0 {
+		return 0
+	}
+	return buf[growStack(n-1)]
+}
+
+func issue7978go() {
+	C.issue7978c((*C.uint32_t)(&issue7978sync))
+	issue7978wait(7, 8)
+}
+
+func test7978(t *testing.T) {
+	if runtime.Compiler == "gccgo" {
+		t.Skip("gccgo can not do stack traces of C code")
+	}
+	debug.SetTraceback("2")
+	issue7978sync = 0
+	go issue7978go()
+	// test in c code, before callback
+	issue7978wait(0, 1)
+	issue7978check(t, "_Cfunc_issue7978c(", "", 1)
+	// test in go code, during callback
+	issue7978wait(2, 3)
+	issue7978check(t, "test.issue7978cb(", "test.issue7978go", 3)
+	// test in c code, after callback
+	issue7978wait(4, 5)
+	issue7978check(t, "_Cfunc_issue7978c(", "_cgoexpwrap", 1)
+	// test in go code, after return from cgo
+	issue7978wait(6, 7)
+	issue7978check(t, "test.issue7978go(", "", 3)
+	atomic.StoreUint32(&issue7978sync, 8)
+}
+
+// issue 8331 part 2
+
+var issue8331Var C.issue8331
+
+// issue 8945
+
+//export Test8945
+func Test8945() {
+	_ = C.func8945
+}
+
+// issue 20910
+
+//export multi
+func multi() (*C.char, C.int) {
+	return C.CString("multi"), 0
+}
+
+func test20910(t *testing.T) {
+	C.callMulti()
+}
+
+// issue 28772 part 2
+
+const issue28772Constant2 = C.issue28772Constant2
+
+// issue 31891
+
+//export useIssue31891A
+func useIssue31891A(c *C.Issue31891A) {}
+
+//export useIssue31891B
+func useIssue31891B(c *C.Issue31891B) {}
+
+func test31891(t *testing.T) {
+	C.callIssue31891()
+}
+
+// issue 37033, check if cgo.Handle works properly
+
+var issue37033 = 42
+
+//export GoFunc37033
+func GoFunc37033(handle C.uintptr_t) {
+	h := cgo.Handle(handle)
+	ch := h.Value().(chan int)
+	ch <- issue37033
+}
+
+// issue 38408
+// A typedef pointer can be used as the element type.
+// No runtime test; just make sure it compiles.
+var _ C.PIssue38408 = &C.Issue38408{i: 1}
+
+// issue 49633, example use of cgo.Handle with void*
+
+type data49633 struct {
+	msg string
+}
+
+//export GoFunc49633
+func GoFunc49633(context unsafe.Pointer) {
+	h := *(*cgo.Handle)(context)
+	v := h.Value().(*data49633)
+	v.msg = "hello"
+}
+
+func test49633(t *testing.T) {
+	v := &data49633{}
+	h := cgo.NewHandle(v)
+	defer h.Delete()
+	C.cfunc49633(unsafe.Pointer(&h))
+	if v.msg != "hello" {
+		t.Errorf("msg = %q, want 'hello'", v.msg)
+	}
+}
diff --git a/misc/cgo/test/typeparam.go b/src/cmd/cgo/internal/test/typeparam.go
similarity index 100%
rename from misc/cgo/test/typeparam.go
rename to src/cmd/cgo/internal/test/typeparam.go
diff --git a/src/cmd/cgo/internal/testcarchive/carchive_test.go b/src/cmd/cgo/internal/testcarchive/carchive_test.go
new file mode 100644
index 0000000..b140a9c
--- /dev/null
+++ b/src/cmd/cgo/internal/testcarchive/carchive_test.go
@@ -0,0 +1,1399 @@
+// Copyright 2016 The Go 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 uses various syscall.SIG* constants that are defined on Unix
+// platforms and Windows.
+
+//go:build unix || windows
+
+package carchive_test
+
+import (
+	"bufio"
+	"bytes"
+	"cmd/cgo/internal/cgotest"
+	"debug/elf"
+	"flag"
+	"fmt"
+	"internal/testenv"
+	"io"
+	"log"
+	"os"
+	"os/exec"
+	"path/filepath"
+	"regexp"
+	"runtime"
+	"strconv"
+	"strings"
+	"sync"
+	"syscall"
+	"testing"
+	"time"
+	"unicode"
+)
+
+var globalSkip = func(t *testing.T) {}
+
+// Program to run.
+var bin []string
+
+// C compiler with args (from $(go env CC) $(go env GOGCCFLAGS)).
+var cc []string
+
+// ".exe" on Windows.
+var exeSuffix string
+
+var GOOS, GOARCH, GOPATH string
+var libgodir string
+
+var testWork bool // If true, preserve temporary directories.
+
+func TestMain(m *testing.M) {
+	flag.BoolVar(&testWork, "testwork", false, "if true, log and preserve the test's temporary working directory")
+	flag.Parse()
+
+	log.SetFlags(log.Lshortfile)
+	os.Exit(testMain(m))
+}
+
+func testMain(m *testing.M) int {
+	if testing.Short() && os.Getenv("GO_BUILDER_NAME") == "" {
+		globalSkip = func(t *testing.T) { t.Skip("short mode and $GO_BUILDER_NAME not set") }
+		return m.Run()
+	}
+	if runtime.GOOS == "linux" {
+		if _, err := os.Stat("/etc/alpine-release"); err == nil {
+			globalSkip = func(t *testing.T) { t.Skip("skipping failing test on alpine - go.dev/issue/19938") }
+			return m.Run()
+		}
+	}
+
+	// We need a writable GOPATH in which to run the tests.
+	// Construct one in a temporary directory.
+	var err error
+	GOPATH, err = os.MkdirTemp("", "carchive_test")
+	if err != nil {
+		log.Panic(err)
+	}
+	if testWork {
+		log.Println(GOPATH)
+	} else {
+		defer os.RemoveAll(GOPATH)
+	}
+	os.Setenv("GOPATH", GOPATH)
+
+	// Copy testdata into GOPATH/src/testarchive, along with a go.mod file
+	// declaring the same path.
+	modRoot := filepath.Join(GOPATH, "src", "testcarchive")
+	if err := cgotest.OverlayDir(modRoot, "testdata"); err != nil {
+		log.Panic(err)
+	}
+	if err := os.Chdir(modRoot); err != nil {
+		log.Panic(err)
+	}
+	os.Setenv("PWD", modRoot)
+	if err := os.WriteFile("go.mod", []byte("module testcarchive\n"), 0666); err != nil {
+		log.Panic(err)
+	}
+
+	GOOS = goEnv("GOOS")
+	GOARCH = goEnv("GOARCH")
+	bin = cmdToRun("./testp")
+
+	ccOut := goEnv("CC")
+	cc = []string{string(ccOut)}
+
+	out := goEnv("GOGCCFLAGS")
+	quote := '\000'
+	start := 0
+	lastSpace := true
+	backslash := false
+	s := string(out)
+	for i, c := range s {
+		if quote == '\000' && unicode.IsSpace(c) {
+			if !lastSpace {
+				cc = append(cc, s[start:i])
+				lastSpace = true
+			}
+		} else {
+			if lastSpace {
+				start = i
+				lastSpace = false
+			}
+			if quote == '\000' && !backslash && (c == '"' || c == '\'') {
+				quote = c
+				backslash = false
+			} else if !backslash && quote == c {
+				quote = '\000'
+			} else if (quote == '\000' || quote == '"') && !backslash && c == '\\' {
+				backslash = true
+			} else {
+				backslash = false
+			}
+		}
+	}
+	if !lastSpace {
+		cc = append(cc, s[start:])
+	}
+
+	if GOOS == "aix" {
+		// -Wl,-bnoobjreorder is mandatory to keep the same layout
+		// in .text section.
+		cc = append(cc, "-Wl,-bnoobjreorder")
+	}
+	if GOOS == "ios" {
+		// Linking runtime/cgo on ios requires the CoreFoundation framework because
+		// x_cgo_init uses CoreFoundation APIs to switch directory to the app root.
+		//
+		// TODO(#58225): This special case probably should not be needed.
+		// runtime/cgo is a very low-level package, and should not provide
+		// high-level behaviors like changing the current working directory at init.
+		cc = append(cc, "-framework", "CoreFoundation")
+	}
+	libbase := GOOS + "_" + GOARCH
+	if runtime.Compiler == "gccgo" {
+		libbase = "gccgo_" + libgodir + "_fPIC"
+	} else {
+		switch GOOS {
+		case "darwin", "ios":
+			if GOARCH == "arm64" {
+				libbase += "_shared"
+			}
+		case "dragonfly", "freebsd", "linux", "netbsd", "openbsd", "solaris", "illumos":
+			libbase += "_shared"
+		}
+	}
+	libgodir = filepath.Join(GOPATH, "pkg", libbase, "testcarchive")
+	cc = append(cc, "-I", libgodir)
+
+	// Force reallocation (and avoid aliasing bugs) for parallel tests that append to cc.
+	cc = cc[:len(cc):len(cc)]
+
+	if GOOS == "windows" {
+		exeSuffix = ".exe"
+	}
+
+	return m.Run()
+}
+
+func goEnv(key string) string {
+	out, err := exec.Command("go", "env", key).Output()
+	if err != nil {
+		if ee, ok := err.(*exec.ExitError); ok {
+			fmt.Fprintf(os.Stderr, "%s", ee.Stderr)
+		}
+		log.Panicf("go env %s failed:\n%s\n", key, err)
+	}
+	return strings.TrimSpace(string(out))
+}
+
+func cmdToRun(name string) []string {
+	execScript := "go_" + goEnv("GOOS") + "_" + goEnv("GOARCH") + "_exec"
+	executor, err := exec.LookPath(execScript)
+	if err != nil {
+		return []string{name}
+	}
+	return []string{executor, name}
+}
+
+// genHeader writes a C header file for the C-exported declarations found in .go
+// source files in dir.
+//
+// TODO(golang.org/issue/35715): This should be simpler.
+func genHeader(t *testing.T, header, dir string) {
+	t.Helper()
+
+	// The 'cgo' command generates a number of additional artifacts,
+	// but we're only interested in the header.
+	// Shunt the rest of the outputs to a temporary directory.
+	objDir, err := os.MkdirTemp(GOPATH, "_obj")
+	if err != nil {
+		t.Fatal(err)
+	}
+	defer os.RemoveAll(objDir)
+
+	files, err := filepath.Glob(filepath.Join(dir, "*.go"))
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	cmd := exec.Command("go", "tool", "cgo",
+		"-objdir", objDir,
+		"-exportheader", header)
+	cmd.Args = append(cmd.Args, files...)
+	t.Log(cmd.Args)
+	if out, err := cmd.CombinedOutput(); err != nil {
+		t.Logf("%s", out)
+		t.Fatal(err)
+	}
+}
+
+func testInstall(t *testing.T, exe, libgoa, libgoh string, buildcmd ...string) {
+	t.Helper()
+	cmd := exec.Command(buildcmd[0], buildcmd[1:]...)
+	cmd.Env = append(cmd.Environ(), "GO111MODULE=off") // 'go install' only works in GOPATH mode
+	t.Log(buildcmd)
+	if out, err := cmd.CombinedOutput(); err != nil {
+		t.Logf("%s", out)
+		t.Fatal(err)
+	}
+	if !testWork {
+		defer func() {
+			os.Remove(libgoa)
+			os.Remove(libgoh)
+		}()
+	}
+
+	ccArgs := append(cc, "-o", exe, "main.c")
+	if GOOS == "windows" {
+		ccArgs = append(ccArgs, "main_windows.c", libgoa, "-lntdll", "-lws2_32", "-lwinmm")
+	} else {
+		ccArgs = append(ccArgs, "main_unix.c", libgoa)
+	}
+	if runtime.Compiler == "gccgo" {
+		ccArgs = append(ccArgs, "-lgo")
+	}
+	t.Log(ccArgs)
+	if out, err := exec.Command(ccArgs[0], ccArgs[1:]...).CombinedOutput(); err != nil {
+		t.Logf("%s", out)
+		t.Fatal(err)
+	}
+	if !testWork {
+		defer os.Remove(exe)
+	}
+
+	binArgs := append(cmdToRun(exe), "arg1", "arg2")
+	cmd = exec.Command(binArgs[0], binArgs[1:]...)
+	if runtime.Compiler == "gccgo" {
+		cmd.Env = append(cmd.Environ(), "GCCGO=1")
+	}
+	if out, err := cmd.CombinedOutput(); err != nil {
+		t.Logf("%s", out)
+		t.Fatal(err)
+	}
+
+	checkLineComments(t, libgoh)
+}
+
+var badLineRegexp = regexp.MustCompile(`(?m)^#line [0-9]+ "/.*$`)
+
+// checkLineComments checks that the export header generated by
+// -buildmode=c-archive doesn't have any absolute paths in the #line
+// comments. We don't want those paths because they are unhelpful for
+// the user and make the files change based on details of the location
+// of GOPATH.
+func checkLineComments(t *testing.T, hdrname string) {
+	hdr, err := os.ReadFile(hdrname)
+	if err != nil {
+		if !os.IsNotExist(err) {
+			t.Error(err)
+		}
+		return
+	}
+	if line := badLineRegexp.Find(hdr); line != nil {
+		t.Errorf("bad #line directive with absolute path in %s: %q", hdrname, line)
+	}
+}
+
+// checkArchive verifies that the created library looks OK.
+// We just check a couple of things now, we can add more checks as needed.
+func checkArchive(t *testing.T, arname string) {
+	t.Helper()
+
+	switch GOOS {
+	case "aix", "darwin", "ios", "windows":
+		// We don't have any checks for non-ELF libraries yet.
+		if _, err := os.Stat(arname); err != nil {
+			t.Errorf("archive %s does not exist: %v", arname, err)
+		}
+	default:
+		checkELFArchive(t, arname)
+	}
+}
+
+// checkELFArchive checks an ELF archive.
+func checkELFArchive(t *testing.T, arname string) {
+	t.Helper()
+
+	f, err := os.Open(arname)
+	if err != nil {
+		t.Errorf("archive %s does not exist: %v", arname, err)
+		return
+	}
+	defer f.Close()
+
+	// TODO(iant): put these in a shared package?  But where?
+	const (
+		magic = "!<arch>\n"
+		fmag  = "`\n"
+
+		namelen = 16
+		datelen = 12
+		uidlen  = 6
+		gidlen  = 6
+		modelen = 8
+		sizelen = 10
+		fmaglen = 2
+		hdrlen  = namelen + datelen + uidlen + gidlen + modelen + sizelen + fmaglen
+	)
+
+	type arhdr struct {
+		name string
+		date string
+		uid  string
+		gid  string
+		mode string
+		size string
+		fmag string
+	}
+
+	var magbuf [len(magic)]byte
+	if _, err := io.ReadFull(f, magbuf[:]); err != nil {
+		t.Errorf("%s: archive too short", arname)
+		return
+	}
+	if string(magbuf[:]) != magic {
+		t.Errorf("%s: incorrect archive magic string %q", arname, magbuf)
+	}
+
+	off := int64(len(magic))
+	for {
+		if off&1 != 0 {
+			var b [1]byte
+			if _, err := f.Read(b[:]); err != nil {
+				if err == io.EOF {
+					break
+				}
+				t.Errorf("%s: error skipping alignment byte at %d: %v", arname, off, err)
+			}
+			off++
+		}
+
+		var hdrbuf [hdrlen]byte
+		if _, err := io.ReadFull(f, hdrbuf[:]); err != nil {
+			if err == io.EOF {
+				break
+			}
+			t.Errorf("%s: error reading archive header at %d: %v", arname, off, err)
+			return
+		}
+
+		var hdr arhdr
+		hdrslice := hdrbuf[:]
+		set := func(len int, ps *string) {
+			*ps = string(bytes.TrimSpace(hdrslice[:len]))
+			hdrslice = hdrslice[len:]
+		}
+		set(namelen, &hdr.name)
+		set(datelen, &hdr.date)
+		set(uidlen, &hdr.uid)
+		set(gidlen, &hdr.gid)
+		set(modelen, &hdr.mode)
+		set(sizelen, &hdr.size)
+		hdr.fmag = string(hdrslice[:fmaglen])
+		hdrslice = hdrslice[fmaglen:]
+		if len(hdrslice) != 0 {
+			t.Fatalf("internal error: len(hdrslice) == %d", len(hdrslice))
+		}
+
+		if hdr.fmag != fmag {
+			t.Errorf("%s: invalid fmagic value %q at %d", arname, hdr.fmag, off)
+			return
+		}
+
+		size, err := strconv.ParseInt(hdr.size, 10, 64)
+		if err != nil {
+			t.Errorf("%s: error parsing size %q at %d: %v", arname, hdr.size, off, err)
+			return
+		}
+
+		off += hdrlen
+
+		switch hdr.name {
+		case "__.SYMDEF", "/", "/SYM64/":
+			// The archive symbol map.
+		case "//", "ARFILENAMES/":
+			// The extended name table.
+		default:
+			// This should be an ELF object.
+			checkELFArchiveObject(t, arname, off, io.NewSectionReader(f, off, size))
+		}
+
+		off += size
+		if _, err := f.Seek(off, io.SeekStart); err != nil {
+			t.Errorf("%s: failed to seek to %d: %v", arname, off, err)
+		}
+	}
+}
+
+// checkELFArchiveObject checks an object in an ELF archive.
+func checkELFArchiveObject(t *testing.T, arname string, off int64, obj io.ReaderAt) {
+	t.Helper()
+
+	ef, err := elf.NewFile(obj)
+	if err != nil {
+		t.Errorf("%s: failed to open ELF file at %d: %v", arname, off, err)
+		return
+	}
+	defer ef.Close()
+
+	// Verify section types.
+	for _, sec := range ef.Sections {
+		want := elf.SHT_NULL
+		switch sec.Name {
+		case ".text", ".data":
+			want = elf.SHT_PROGBITS
+		case ".bss":
+			want = elf.SHT_NOBITS
+		case ".symtab":
+			want = elf.SHT_SYMTAB
+		case ".strtab":
+			want = elf.SHT_STRTAB
+		case ".init_array":
+			want = elf.SHT_INIT_ARRAY
+		case ".fini_array":
+			want = elf.SHT_FINI_ARRAY
+		case ".preinit_array":
+			want = elf.SHT_PREINIT_ARRAY
+		}
+		if want != elf.SHT_NULL && sec.Type != want {
+			t.Errorf("%s: incorrect section type in elf file at %d for section %q: got %v want %v", arname, off, sec.Name, sec.Type, want)
+		}
+	}
+}
+
+func TestInstall(t *testing.T) {
+	globalSkip(t)
+	testenv.MustHaveGoBuild(t)
+	testenv.MustHaveCGO(t)
+	testenv.MustHaveBuildMode(t, "c-archive")
+
+	if !testWork {
+		defer os.RemoveAll(filepath.Join(GOPATH, "pkg"))
+	}
+
+	libgoa := "libgo.a"
+	if runtime.Compiler == "gccgo" {
+		libgoa = "liblibgo.a"
+	}
+
+	// Generate the p.h header file.
+	//
+	// 'go install -i -buildmode=c-archive ./libgo' would do that too, but that
+	// would also attempt to install transitive standard-library dependencies to
+	// GOROOT, and we cannot assume that GOROOT is writable. (A non-root user may
+	// be running this test in a GOROOT owned by root.)
+	genHeader(t, "p.h", "./p")
+
+	testInstall(t, "./testp1"+exeSuffix,
+		filepath.Join(libgodir, libgoa),
+		filepath.Join(libgodir, "libgo.h"),
+		"go", "install", "-buildmode=c-archive", "./libgo")
+
+	// Test building libgo other than installing it.
+	// Header files are now present.
+	testInstall(t, "./testp2"+exeSuffix, "libgo.a", "libgo.h",
+		"go", "build", "-buildmode=c-archive", filepath.Join(".", "libgo", "libgo.go"))
+
+	testInstall(t, "./testp3"+exeSuffix, "libgo.a", "libgo.h",
+		"go", "build", "-buildmode=c-archive", "-o", "libgo.a", "./libgo")
+}
+
+func TestEarlySignalHandler(t *testing.T) {
+	switch GOOS {
+	case "darwin", "ios":
+		switch GOARCH {
+		case "arm64":
+			t.Skipf("skipping on %s/%s; see https://golang.org/issue/13701", GOOS, GOARCH)
+		}
+	case "windows":
+		t.Skip("skipping signal test on Windows")
+	}
+	globalSkip(t)
+	testenv.MustHaveGoBuild(t)
+	testenv.MustHaveCGO(t)
+	testenv.MustHaveBuildMode(t, "c-archive")
+
+	if !testWork {
+		defer func() {
+			os.Remove("libgo2.a")
+			os.Remove("libgo2.h")
+			os.Remove("testp" + exeSuffix)
+			os.RemoveAll(filepath.Join(GOPATH, "pkg"))
+		}()
+	}
+
+	cmd := exec.Command("go", "build", "-buildmode=c-archive", "-o", "libgo2.a", "./libgo2")
+	if out, err := cmd.CombinedOutput(); err != nil {
+		t.Logf("%s", out)
+		t.Fatal(err)
+	}
+	checkLineComments(t, "libgo2.h")
+	checkArchive(t, "libgo2.a")
+
+	ccArgs := append(cc, "-o", "testp"+exeSuffix, "main2.c", "libgo2.a")
+	if runtime.Compiler == "gccgo" {
+		ccArgs = append(ccArgs, "-lgo")
+	}
+	if out, err := exec.Command(ccArgs[0], ccArgs[1:]...).CombinedOutput(); err != nil {
+		t.Logf("%s", out)
+		t.Fatal(err)
+	}
+
+	darwin := "0"
+	if runtime.GOOS == "darwin" {
+		darwin = "1"
+	}
+	cmd = exec.Command(bin[0], append(bin[1:], darwin)...)
+
+	if out, err := cmd.CombinedOutput(); err != nil {
+		t.Logf("%s", out)
+		t.Fatal(err)
+	}
+}
+
+func TestSignalForwarding(t *testing.T) {
+	globalSkip(t)
+	checkSignalForwardingTest(t)
+	buildSignalForwardingTest(t)
+
+	cmd := exec.Command(bin[0], append(bin[1:], "1")...)
+
+	out, err := cmd.CombinedOutput()
+	t.Logf("%v\n%s", cmd.Args, out)
+	expectSignal(t, err, syscall.SIGSEGV, 0)
+
+	// SIGPIPE is never forwarded on darwin. See golang.org/issue/33384.
+	if runtime.GOOS != "darwin" && runtime.GOOS != "ios" {
+		// Test SIGPIPE forwarding
+		cmd = exec.Command(bin[0], append(bin[1:], "3")...)
+
+		out, err = cmd.CombinedOutput()
+		if len(out) > 0 {
+			t.Logf("%s", out)
+		}
+		expectSignal(t, err, syscall.SIGPIPE, 0)
+	}
+}
+
+func TestSignalForwardingExternal(t *testing.T) {
+	if GOOS == "freebsd" || GOOS == "aix" {
+		t.Skipf("skipping on %s/%s; signal always goes to the Go runtime", GOOS, GOARCH)
+	} else if GOOS == "darwin" && GOARCH == "amd64" {
+		t.Skipf("skipping on %s/%s: runtime does not permit SI_USER SIGSEGV", GOOS, GOARCH)
+	}
+	globalSkip(t)
+	checkSignalForwardingTest(t)
+	buildSignalForwardingTest(t)
+
+	// We want to send the process a signal and see if it dies.
+	// Normally the signal goes to the C thread, the Go signal
+	// handler picks it up, sees that it is running in a C thread,
+	// and the program dies. Unfortunately, occasionally the
+	// signal is delivered to a Go thread, which winds up
+	// discarding it because it was sent by another program and
+	// there is no Go handler for it. To avoid this, run the
+	// program several times in the hopes that it will eventually
+	// fail.
+	const tries = 20
+	for i := 0; i < tries; i++ {
+		err := runSignalForwardingTest(t, "2")
+		if err == nil {
+			continue
+		}
+
+		// If the signal is delivered to a C thread, as expected,
+		// the Go signal handler will disable itself and re-raise
+		// the signal, causing the program to die with SIGSEGV.
+		//
+		// It is also possible that the signal will be
+		// delivered to a Go thread, such as a GC thread.
+		// Currently when the Go runtime sees that a SIGSEGV was
+		// sent from a different program, it first tries to send
+		// the signal to the os/signal API. If nothing is looking
+		// for (or explicitly ignoring) SIGSEGV, then it crashes.
+		// Because the Go runtime is invoked via a c-archive,
+		// it treats this as GOTRACEBACK=crash, meaning that it
+		// dumps a stack trace for all goroutines, which it does
+		// by raising SIGQUIT. The effect is that we will see the
+		// program die with SIGQUIT in that case, not SIGSEGV.
+		if expectSignal(t, err, syscall.SIGSEGV, syscall.SIGQUIT) {
+			return
+		}
+	}
+
+	t.Errorf("program succeeded unexpectedly %d times", tries)
+}
+
+func TestSignalForwardingGo(t *testing.T) {
+	// This test fails on darwin-amd64 because of the special
+	// handling of user-generated SIGSEGV signals in fixsigcode in
+	// runtime/signal_darwin_amd64.go.
+	if runtime.GOOS == "darwin" && runtime.GOARCH == "amd64" {
+		t.Skip("not supported on darwin-amd64")
+	}
+	globalSkip(t)
+
+	checkSignalForwardingTest(t)
+	buildSignalForwardingTest(t)
+	err := runSignalForwardingTest(t, "4")
+
+	// Occasionally the signal will be delivered to a C thread,
+	// and the program will crash with SIGSEGV.
+	expectSignal(t, err, syscall.SIGQUIT, syscall.SIGSEGV)
+}
+
+// checkSignalForwardingTest calls t.Skip if the SignalForwarding test
+// doesn't work on this platform.
+func checkSignalForwardingTest(t *testing.T) {
+	switch GOOS {
+	case "darwin", "ios":
+		switch GOARCH {
+		case "arm64":
+			t.Skipf("skipping on %s/%s; see https://golang.org/issue/13701", GOOS, GOARCH)
+		}
+	case "windows":
+		t.Skip("skipping signal test on Windows")
+	}
+	testenv.MustHaveGoBuild(t)
+	testenv.MustHaveCGO(t)
+	testenv.MustHaveBuildMode(t, "c-archive")
+}
+
+// buildSignalForwardingTest builds the executable used by the various
+// signal forwarding tests.
+func buildSignalForwardingTest(t *testing.T) {
+	if !testWork {
+		t.Cleanup(func() {
+			os.Remove("libgo2.a")
+			os.Remove("libgo2.h")
+			os.Remove("testp" + exeSuffix)
+			os.RemoveAll(filepath.Join(GOPATH, "pkg"))
+		})
+	}
+
+	t.Log("go build -buildmode=c-archive -o libgo2.a ./libgo2")
+	cmd := exec.Command("go", "build", "-buildmode=c-archive", "-o", "libgo2.a", "./libgo2")
+	out, err := cmd.CombinedOutput()
+	if len(out) > 0 {
+		t.Logf("%s", out)
+	}
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	checkLineComments(t, "libgo2.h")
+	checkArchive(t, "libgo2.a")
+
+	ccArgs := append(cc, "-o", "testp"+exeSuffix, "main5.c", "libgo2.a")
+	if runtime.Compiler == "gccgo" {
+		ccArgs = append(ccArgs, "-lgo")
+	}
+	t.Log(ccArgs)
+	out, err = exec.Command(ccArgs[0], ccArgs[1:]...).CombinedOutput()
+	if len(out) > 0 {
+		t.Logf("%s", out)
+	}
+	if err != nil {
+		t.Fatal(err)
+	}
+}
+
+func runSignalForwardingTest(t *testing.T, arg string) error {
+	t.Logf("%v %s", bin, arg)
+	cmd := exec.Command(bin[0], append(bin[1:], arg)...)
+
+	var out strings.Builder
+	cmd.Stdout = &out
+
+	stderr, err := cmd.StderrPipe()
+	if err != nil {
+		t.Fatal(err)
+	}
+	defer stderr.Close()
+
+	r := bufio.NewReader(stderr)
+
+	err = cmd.Start()
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	// Wait for trigger to ensure that process is started.
+	ok, err := r.ReadString('\n')
+
+	// Verify trigger.
+	if err != nil || ok != "OK\n" {
+		t.Fatal("Did not receive OK signal")
+	}
+
+	var wg sync.WaitGroup
+	wg.Add(1)
+	var errsb strings.Builder
+	go func() {
+		defer wg.Done()
+		io.Copy(&errsb, r)
+	}()
+
+	// Give the program a chance to enter the function.
+	// If the program doesn't get there the test will still
+	// pass, although it doesn't quite test what we intended.
+	// This is fine as long as the program normally makes it.
+	time.Sleep(time.Millisecond)
+
+	cmd.Process.Signal(syscall.SIGSEGV)
+
+	err = cmd.Wait()
+
+	s := out.String()
+	if len(s) > 0 {
+		t.Log(s)
+	}
+	wg.Wait()
+	s = errsb.String()
+	if len(s) > 0 {
+		t.Log(s)
+	}
+
+	return err
+}
+
+// expectSignal checks that err, the exit status of a test program,
+// shows a failure due to a specific signal or two. Returns whether we
+// found an expected signal.
+func expectSignal(t *testing.T, err error, sig1, sig2 syscall.Signal) bool {
+	t.Helper()
+	if err == nil {
+		t.Error("test program succeeded unexpectedly")
+	} else if ee, ok := err.(*exec.ExitError); !ok {
+		t.Errorf("error (%v) has type %T; expected exec.ExitError", err, err)
+	} else if ws, ok := ee.Sys().(syscall.WaitStatus); !ok {
+		t.Errorf("error.Sys (%v) has type %T; expected syscall.WaitStatus", ee.Sys(), ee.Sys())
+	} else if !ws.Signaled() || (ws.Signal() != sig1 && ws.Signal() != sig2) {
+		if sig2 == 0 {
+			t.Errorf("got %q; expected signal %q", ee, sig1)
+		} else {
+			t.Errorf("got %q; expected signal %q or %q", ee, sig1, sig2)
+		}
+	} else {
+		return true
+	}
+	return false
+}
+
+func TestOsSignal(t *testing.T) {
+	switch GOOS {
+	case "windows":
+		t.Skip("skipping signal test on Windows")
+	}
+	globalSkip(t)
+	testenv.MustHaveGoBuild(t)
+	testenv.MustHaveCGO(t)
+	testenv.MustHaveBuildMode(t, "c-archive")
+
+	if !testWork {
+		defer func() {
+			os.Remove("libgo3.a")
+			os.Remove("libgo3.h")
+			os.Remove("testp" + exeSuffix)
+			os.RemoveAll(filepath.Join(GOPATH, "pkg"))
+		}()
+	}
+
+	cmd := exec.Command("go", "build", "-buildmode=c-archive", "-o", "libgo3.a", "./libgo3")
+	if out, err := cmd.CombinedOutput(); err != nil {
+		t.Logf("%s", out)
+		t.Fatal(err)
+	}
+	checkLineComments(t, "libgo3.h")
+	checkArchive(t, "libgo3.a")
+
+	ccArgs := append(cc, "-o", "testp"+exeSuffix, "main3.c", "libgo3.a")
+	if runtime.Compiler == "gccgo" {
+		ccArgs = append(ccArgs, "-lgo")
+	}
+	if out, err := exec.Command(ccArgs[0], ccArgs[1:]...).CombinedOutput(); err != nil {
+		t.Logf("%s", out)
+		t.Fatal(err)
+	}
+
+	if out, err := exec.Command(bin[0], bin[1:]...).CombinedOutput(); err != nil {
+		t.Logf("%s", out)
+		t.Fatal(err)
+	}
+}
+
+func TestSigaltstack(t *testing.T) {
+	switch GOOS {
+	case "windows":
+		t.Skip("skipping signal test on Windows")
+	}
+	globalSkip(t)
+	testenv.MustHaveGoBuild(t)
+	testenv.MustHaveCGO(t)
+	testenv.MustHaveBuildMode(t, "c-archive")
+
+	if !testWork {
+		defer func() {
+			os.Remove("libgo4.a")
+			os.Remove("libgo4.h")
+			os.Remove("testp" + exeSuffix)
+			os.RemoveAll(filepath.Join(GOPATH, "pkg"))
+		}()
+	}
+
+	cmd := exec.Command("go", "build", "-buildmode=c-archive", "-o", "libgo4.a", "./libgo4")
+	if out, err := cmd.CombinedOutput(); err != nil {
+		t.Logf("%s", out)
+		t.Fatal(err)
+	}
+	checkLineComments(t, "libgo4.h")
+	checkArchive(t, "libgo4.a")
+
+	ccArgs := append(cc, "-o", "testp"+exeSuffix, "main4.c", "libgo4.a")
+	if runtime.Compiler == "gccgo" {
+		ccArgs = append(ccArgs, "-lgo")
+	}
+	if out, err := exec.Command(ccArgs[0], ccArgs[1:]...).CombinedOutput(); err != nil {
+		t.Logf("%s", out)
+		t.Fatal(err)
+	}
+
+	if out, err := exec.Command(bin[0], bin[1:]...).CombinedOutput(); err != nil {
+		t.Logf("%s", out)
+		t.Fatal(err)
+	}
+}
+
+const testar = `#!/usr/bin/env bash
+while [[ $1 == -* ]] >/dev/null; do
+  shift
+done
+echo "testar" > $1
+echo "testar" > PWD/testar.ran
+`
+
+func TestExtar(t *testing.T) {
+	switch GOOS {
+	case "windows":
+		t.Skip("skipping signal test on Windows")
+	}
+	if runtime.Compiler == "gccgo" {
+		t.Skip("skipping -extar test when using gccgo")
+	}
+	globalSkip(t)
+	testenv.MustHaveGoBuild(t)
+	testenv.MustHaveCGO(t)
+	testenv.MustHaveBuildMode(t, "c-archive")
+	testenv.MustHaveExecPath(t, "bash") // This test uses a bash script
+
+	if !testWork {
+		defer func() {
+			os.Remove("libgo4.a")
+			os.Remove("libgo4.h")
+			os.Remove("testar")
+			os.Remove("testar.ran")
+			os.RemoveAll(filepath.Join(GOPATH, "pkg"))
+		}()
+	}
+
+	os.Remove("testar")
+	dir, err := os.Getwd()
+	if err != nil {
+		t.Fatal(err)
+	}
+	s := strings.Replace(testar, "PWD", dir, 1)
+	if err := os.WriteFile("testar", []byte(s), 0777); err != nil {
+		t.Fatal(err)
+	}
+
+	cmd := exec.Command("go", "build", "-buildmode=c-archive", "-ldflags=-extar="+filepath.Join(dir, "testar"), "-o", "libgo4.a", "./libgo4")
+	if out, err := cmd.CombinedOutput(); err != nil {
+		t.Logf("%s", out)
+		t.Fatal(err)
+	}
+	checkLineComments(t, "libgo4.h")
+
+	if _, err := os.Stat("testar.ran"); err != nil {
+		if os.IsNotExist(err) {
+			t.Error("testar does not exist after go build")
+		} else {
+			t.Errorf("error checking testar: %v", err)
+		}
+	}
+}
+
+func TestPIE(t *testing.T) {
+	switch GOOS {
+	case "windows", "darwin", "ios", "plan9":
+		t.Skipf("skipping PIE test on %s", GOOS)
+	}
+	globalSkip(t)
+	testenv.MustHaveGoBuild(t)
+	testenv.MustHaveCGO(t)
+	testenv.MustHaveBuildMode(t, "c-archive")
+
+	libgoa := "libgo.a"
+	if runtime.Compiler == "gccgo" {
+		libgoa = "liblibgo.a"
+	}
+
+	if !testWork {
+		defer func() {
+			os.Remove("testp" + exeSuffix)
+			os.Remove(libgoa)
+			os.RemoveAll(filepath.Join(GOPATH, "pkg"))
+		}()
+	}
+
+	// Generate the p.h header file.
+	//
+	// 'go install -i -buildmode=c-archive ./libgo' would do that too, but that
+	// would also attempt to install transitive standard-library dependencies to
+	// GOROOT, and we cannot assume that GOROOT is writable. (A non-root user may
+	// be running this test in a GOROOT owned by root.)
+	genHeader(t, "p.h", "./p")
+
+	cmd := exec.Command("go", "build", "-buildmode=c-archive", "./libgo")
+	if out, err := cmd.CombinedOutput(); err != nil {
+		t.Logf("%s", out)
+		t.Fatal(err)
+	}
+
+	ccArgs := append(cc, "-fPIE", "-pie", "-o", "testp"+exeSuffix, "main.c", "main_unix.c", libgoa)
+	if runtime.Compiler == "gccgo" {
+		ccArgs = append(ccArgs, "-lgo")
+	}
+	if out, err := exec.Command(ccArgs[0], ccArgs[1:]...).CombinedOutput(); err != nil {
+		t.Logf("%s", out)
+		t.Fatal(err)
+	}
+
+	binArgs := append(bin, "arg1", "arg2")
+	cmd = exec.Command(binArgs[0], binArgs[1:]...)
+	if runtime.Compiler == "gccgo" {
+		cmd.Env = append(os.Environ(), "GCCGO=1")
+	}
+	if out, err := cmd.CombinedOutput(); err != nil {
+		t.Logf("%s", out)
+		t.Fatal(err)
+	}
+
+	if GOOS != "aix" {
+		f, err := elf.Open("testp" + exeSuffix)
+		if err != nil {
+			t.Fatal("elf.Open failed: ", err)
+		}
+		defer f.Close()
+		if hasDynTag(t, f, elf.DT_TEXTREL) {
+			t.Errorf("%s has DT_TEXTREL flag", "testp"+exeSuffix)
+		}
+	}
+}
+
+func hasDynTag(t *testing.T, f *elf.File, tag elf.DynTag) bool {
+	ds := f.SectionByType(elf.SHT_DYNAMIC)
+	if ds == nil {
+		t.Error("no SHT_DYNAMIC section")
+		return false
+	}
+	d, err := ds.Data()
+	if err != nil {
+		t.Errorf("can't read SHT_DYNAMIC contents: %v", err)
+		return false
+	}
+	for len(d) > 0 {
+		var t elf.DynTag
+		switch f.Class {
+		case elf.ELFCLASS32:
+			t = elf.DynTag(f.ByteOrder.Uint32(d[:4]))
+			d = d[8:]
+		case elf.ELFCLASS64:
+			t = elf.DynTag(f.ByteOrder.Uint64(d[:8]))
+			d = d[16:]
+		}
+		if t == tag {
+			return true
+		}
+	}
+	return false
+}
+
+func TestSIGPROF(t *testing.T) {
+	switch GOOS {
+	case "windows", "plan9":
+		t.Skipf("skipping SIGPROF test on %s", GOOS)
+	case "darwin", "ios":
+		t.Skipf("skipping SIGPROF test on %s; see https://golang.org/issue/19320", GOOS)
+	}
+	globalSkip(t)
+	testenv.MustHaveGoBuild(t)
+	testenv.MustHaveCGO(t)
+	testenv.MustHaveBuildMode(t, "c-archive")
+
+	t.Parallel()
+
+	if !testWork {
+		defer func() {
+			os.Remove("testp6" + exeSuffix)
+			os.Remove("libgo6.a")
+			os.Remove("libgo6.h")
+		}()
+	}
+
+	cmd := exec.Command("go", "build", "-buildmode=c-archive", "-o", "libgo6.a", "./libgo6")
+	out, err := cmd.CombinedOutput()
+	t.Logf("%v\n%s", cmd.Args, out)
+	if err != nil {
+		t.Fatal(err)
+	}
+	checkLineComments(t, "libgo6.h")
+	checkArchive(t, "libgo6.a")
+
+	ccArgs := append(cc, "-o", "testp6"+exeSuffix, "main6.c", "libgo6.a")
+	if runtime.Compiler == "gccgo" {
+		ccArgs = append(ccArgs, "-lgo")
+	}
+	out, err = exec.Command(ccArgs[0], ccArgs[1:]...).CombinedOutput()
+	t.Logf("%v\n%s", ccArgs, out)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	argv := cmdToRun("./testp6")
+	cmd = exec.Command(argv[0], argv[1:]...)
+	out, err = cmd.CombinedOutput()
+	t.Logf("%v\n%s", argv, out)
+	if err != nil {
+		t.Fatal(err)
+	}
+}
+
+// TestCompileWithoutShared tests that if we compile code without the
+// -shared option, we can put it into an archive. When we use the go
+// tool with -buildmode=c-archive, it passes -shared to the compiler,
+// so we override that. The go tool doesn't work this way, but Bazel
+// will likely do it in the future. And it ought to work. This test
+// was added because at one time it did not work on PPC Linux.
+func TestCompileWithoutShared(t *testing.T) {
+	globalSkip(t)
+	// For simplicity, reuse the signal forwarding test.
+	checkSignalForwardingTest(t)
+	testenv.MustHaveGoBuild(t)
+
+	if !testWork {
+		defer func() {
+			os.Remove("libgo2.a")
+			os.Remove("libgo2.h")
+		}()
+	}
+
+	cmd := exec.Command("go", "build", "-buildmode=c-archive", "-gcflags=-shared=false", "-o", "libgo2.a", "./libgo2")
+	out, err := cmd.CombinedOutput()
+	t.Logf("%v\n%s", cmd.Args, out)
+	if err != nil {
+		t.Fatal(err)
+	}
+	checkLineComments(t, "libgo2.h")
+	checkArchive(t, "libgo2.a")
+
+	exe := "./testnoshared" + exeSuffix
+
+	// In some cases, -no-pie is needed here, but not accepted everywhere. First try
+	// if -no-pie is accepted. See #22126.
+	ccArgs := append(cc, "-o", exe, "-no-pie", "main5.c", "libgo2.a")
+	if runtime.Compiler == "gccgo" {
+		ccArgs = append(ccArgs, "-lgo")
+	}
+	out, err = exec.Command(ccArgs[0], ccArgs[1:]...).CombinedOutput()
+	t.Logf("%v\n%s", ccArgs, out)
+
+	// If -no-pie unrecognized, try -nopie if this is possibly clang
+	if err != nil && bytes.Contains(out, []byte("unknown")) && !strings.Contains(cc[0], "gcc") {
+		ccArgs = append(cc, "-o", exe, "-nopie", "main5.c", "libgo2.a")
+		out, err = exec.Command(ccArgs[0], ccArgs[1:]...).CombinedOutput()
+		t.Logf("%v\n%s", ccArgs, out)
+	}
+
+	// Don't use either -no-pie or -nopie
+	if err != nil && bytes.Contains(out, []byte("unrecognized")) {
+		ccArgs = append(cc, "-o", exe, "main5.c", "libgo2.a")
+		out, err = exec.Command(ccArgs[0], ccArgs[1:]...).CombinedOutput()
+		t.Logf("%v\n%s", ccArgs, out)
+	}
+	if err != nil {
+		t.Fatal(err)
+	}
+	if !testWork {
+		defer os.Remove(exe)
+	}
+
+	binArgs := append(cmdToRun(exe), "1")
+	out, err = exec.Command(binArgs[0], binArgs[1:]...).CombinedOutput()
+	t.Logf("%v\n%s", binArgs, out)
+	expectSignal(t, err, syscall.SIGSEGV, 0)
+
+	// SIGPIPE is never forwarded on darwin. See golang.org/issue/33384.
+	if runtime.GOOS != "darwin" && runtime.GOOS != "ios" {
+		binArgs := append(cmdToRun(exe), "3")
+		out, err = exec.Command(binArgs[0], binArgs[1:]...).CombinedOutput()
+		t.Logf("%v\n%s", binArgs, out)
+		expectSignal(t, err, syscall.SIGPIPE, 0)
+	}
+}
+
+// Test that installing a second time recreates the header file.
+func TestCachedInstall(t *testing.T) {
+	globalSkip(t)
+	testenv.MustHaveGoBuild(t)
+	testenv.MustHaveCGO(t)
+	testenv.MustHaveBuildMode(t, "c-archive")
+
+	if !testWork {
+		defer os.RemoveAll(filepath.Join(GOPATH, "pkg"))
+	}
+
+	h := filepath.Join(libgodir, "libgo.h")
+
+	buildcmd := []string{"go", "install", "-buildmode=c-archive", "./libgo"}
+
+	cmd := exec.Command(buildcmd[0], buildcmd[1:]...)
+	cmd.Env = append(cmd.Environ(), "GO111MODULE=off") // 'go install' only works in GOPATH mode
+	t.Log(buildcmd)
+	if out, err := cmd.CombinedOutput(); err != nil {
+		t.Logf("%s", out)
+		t.Fatal(err)
+	}
+
+	if _, err := os.Stat(h); err != nil {
+		t.Errorf("libgo.h not installed: %v", err)
+	}
+
+	if err := os.Remove(h); err != nil {
+		t.Fatal(err)
+	}
+
+	cmd = exec.Command(buildcmd[0], buildcmd[1:]...)
+	cmd.Env = append(cmd.Environ(), "GO111MODULE=off")
+	t.Log(buildcmd)
+	if out, err := cmd.CombinedOutput(); err != nil {
+		t.Logf("%s", out)
+		t.Fatal(err)
+	}
+
+	if _, err := os.Stat(h); err != nil {
+		t.Errorf("libgo.h not installed in second run: %v", err)
+	}
+}
+
+// Issue 35294.
+func TestManyCalls(t *testing.T) {
+	globalSkip(t)
+	testenv.MustHaveGoBuild(t)
+	testenv.MustHaveCGO(t)
+	testenv.MustHaveBuildMode(t, "c-archive")
+
+	t.Parallel()
+
+	if !testWork {
+		defer func() {
+			os.Remove("testp7" + exeSuffix)
+			os.Remove("libgo7.a")
+			os.Remove("libgo7.h")
+		}()
+	}
+
+	cmd := exec.Command("go", "build", "-buildmode=c-archive", "-o", "libgo7.a", "./libgo7")
+	out, err := cmd.CombinedOutput()
+	t.Logf("%v\n%s", cmd.Args, out)
+	if err != nil {
+		t.Fatal(err)
+	}
+	checkLineComments(t, "libgo7.h")
+	checkArchive(t, "libgo7.a")
+
+	ccArgs := append(cc, "-o", "testp7"+exeSuffix, "main7.c", "libgo7.a")
+	if runtime.Compiler == "gccgo" {
+		ccArgs = append(ccArgs, "-lgo")
+	}
+	out, err = exec.Command(ccArgs[0], ccArgs[1:]...).CombinedOutput()
+	t.Logf("%v\n%s", ccArgs, out)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	argv := cmdToRun("./testp7")
+	cmd = exec.Command(argv[0], argv[1:]...)
+	sb := new(strings.Builder)
+	cmd.Stdout = sb
+	cmd.Stderr = sb
+	if err := cmd.Start(); err != nil {
+		t.Fatal(err)
+	}
+
+	timer := time.AfterFunc(time.Minute,
+		func() {
+			t.Error("test program timed out")
+			cmd.Process.Kill()
+		},
+	)
+	defer timer.Stop()
+
+	err = cmd.Wait()
+	t.Logf("%v\n%s", cmd.Args, sb)
+	if err != nil {
+		t.Error(err)
+	}
+}
+
+// Issue 49288.
+func TestPreemption(t *testing.T) {
+	if runtime.Compiler == "gccgo" {
+		t.Skip("skipping asynchronous preemption test with gccgo")
+	}
+	globalSkip(t)
+	testenv.MustHaveGoBuild(t)
+	testenv.MustHaveCGO(t)
+	testenv.MustHaveBuildMode(t, "c-archive")
+
+	t.Parallel()
+
+	if !testWork {
+		defer func() {
+			os.Remove("testp8" + exeSuffix)
+			os.Remove("libgo8.a")
+			os.Remove("libgo8.h")
+		}()
+	}
+
+	cmd := exec.Command("go", "build", "-buildmode=c-archive", "-o", "libgo8.a", "./libgo8")
+	out, err := cmd.CombinedOutput()
+	t.Logf("%v\n%s", cmd.Args, out)
+	if err != nil {
+		t.Fatal(err)
+	}
+	checkLineComments(t, "libgo8.h")
+	checkArchive(t, "libgo8.a")
+
+	ccArgs := append(cc, "-o", "testp8"+exeSuffix, "main8.c", "libgo8.a")
+	out, err = exec.Command(ccArgs[0], ccArgs[1:]...).CombinedOutput()
+	t.Logf("%v\n%s", ccArgs, out)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	argv := cmdToRun("./testp8")
+	cmd = exec.Command(argv[0], argv[1:]...)
+	sb := new(strings.Builder)
+	cmd.Stdout = sb
+	cmd.Stderr = sb
+	if err := cmd.Start(); err != nil {
+		t.Fatal(err)
+	}
+
+	timer := time.AfterFunc(time.Minute,
+		func() {
+			t.Error("test program timed out")
+			cmd.Process.Kill()
+		},
+	)
+	defer timer.Stop()
+
+	err = cmd.Wait()
+	t.Logf("%v\n%s", cmd.Args, sb)
+	if err != nil {
+		t.Error(err)
+	}
+}
+
+// Issue 59294. Test calling Go function from C after using some
+// stack space.
+func TestDeepStack(t *testing.T) {
+	globalSkip(t)
+	testenv.MustHaveGoBuild(t)
+	testenv.MustHaveCGO(t)
+	testenv.MustHaveBuildMode(t, "c-archive")
+
+	t.Parallel()
+
+	if !testWork {
+		defer func() {
+			os.Remove("testp9" + exeSuffix)
+			os.Remove("libgo9.a")
+			os.Remove("libgo9.h")
+		}()
+	}
+
+	cmd := exec.Command("go", "build", "-buildmode=c-archive", "-o", "libgo9.a", "./libgo9")
+	out, err := cmd.CombinedOutput()
+	t.Logf("%v\n%s", cmd.Args, out)
+	if err != nil {
+		t.Fatal(err)
+	}
+	checkLineComments(t, "libgo9.h")
+	checkArchive(t, "libgo9.a")
+
+	// build with -O0 so the C compiler won't optimize out the large stack frame
+	ccArgs := append(cc, "-O0", "-o", "testp9"+exeSuffix, "main9.c", "libgo9.a")
+	out, err = exec.Command(ccArgs[0], ccArgs[1:]...).CombinedOutput()
+	t.Logf("%v\n%s", ccArgs, out)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	argv := cmdToRun("./testp9")
+	cmd = exec.Command(argv[0], argv[1:]...)
+	sb := new(strings.Builder)
+	cmd.Stdout = sb
+	cmd.Stderr = sb
+	if err := cmd.Start(); err != nil {
+		t.Fatal(err)
+	}
+
+	timer := time.AfterFunc(time.Minute,
+		func() {
+			t.Error("test program timed out")
+			cmd.Process.Kill()
+		},
+	)
+	defer timer.Stop()
+
+	err = cmd.Wait()
+	t.Logf("%v\n%s", cmd.Args, sb)
+	if err != nil {
+		t.Error(err)
+	}
+}
+
+func TestSharedObject(t *testing.T) {
+	// Test that we can put a Go c-archive into a C shared object.
+	globalSkip(t)
+	testenv.MustHaveGoBuild(t)
+	testenv.MustHaveCGO(t)
+	testenv.MustHaveBuildMode(t, "c-archive")
+
+	t.Parallel()
+
+	if !testWork {
+		defer func() {
+			os.Remove("libgo_s.a")
+			os.Remove("libgo_s.h")
+			os.Remove("libgo_s.so")
+		}()
+	}
+
+	cmd := exec.Command("go", "build", "-buildmode=c-archive", "-o", "libgo_s.a", "./libgo")
+	out, err := cmd.CombinedOutput()
+	t.Logf("%v\n%s", cmd.Args, out)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	ccArgs := append(cc, "-shared", "-o", "libgo_s.so", "libgo_s.a")
+	out, err = exec.Command(ccArgs[0], ccArgs[1:]...).CombinedOutput()
+	t.Logf("%v\n%s", ccArgs, out)
+	if err != nil {
+		t.Fatal(err)
+	}
+}
diff --git a/misc/cgo/testcarchive/testdata/libgo/libgo.go b/src/cmd/cgo/internal/testcarchive/testdata/libgo/libgo.go
similarity index 100%
rename from misc/cgo/testcarchive/testdata/libgo/libgo.go
rename to src/cmd/cgo/internal/testcarchive/testdata/libgo/libgo.go
diff --git a/src/cmd/cgo/internal/testcarchive/testdata/libgo2/libgo2.go b/src/cmd/cgo/internal/testcarchive/testdata/libgo2/libgo2.go
new file mode 100644
index 0000000..b2e7731
--- /dev/null
+++ b/src/cmd/cgo/internal/testcarchive/testdata/libgo2/libgo2.go
@@ -0,0 +1,91 @@
+// 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
+
+/*
+#include <signal.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+// Raise SIGPIPE.
+static void CRaiseSIGPIPE() {
+	int fds[2];
+
+	if (pipe(fds) == -1) {
+		perror("pipe");
+		exit(EXIT_FAILURE);
+	}
+	// Close the reader end
+	close(fds[0]);
+	// Write to the writer end to provoke a SIGPIPE
+	if (write(fds[1], "some data", 9) != -1) {
+		fprintf(stderr, "write to a closed pipe succeeded\n");
+		exit(EXIT_FAILURE);
+	}
+	close(fds[1]);
+}
+*/
+import "C"
+
+import (
+	"fmt"
+	"os"
+	"runtime"
+)
+
+// RunGoroutines starts some goroutines that don't do anything.
+// The idea is to get some threads going, so that a signal will be delivered
+// to a thread started by Go.
+//
+//export RunGoroutines
+func RunGoroutines() {
+	for i := 0; i < 4; i++ {
+		go func() {
+			runtime.LockOSThread()
+			select {}
+		}()
+	}
+}
+
+// Block blocks the current thread while running Go code.
+//
+//export Block
+func Block() {
+	select {}
+}
+
+var P *byte
+
+// TestSEGV makes sure that an invalid address turns into a run-time Go panic.
+//
+//export TestSEGV
+func TestSEGV() {
+	defer func() {
+		if recover() == nil {
+			fmt.Fprintln(os.Stderr, "no panic from segv")
+			os.Exit(1)
+		}
+	}()
+	*P = 0
+	fmt.Fprintln(os.Stderr, "continued after segv")
+	os.Exit(1)
+}
+
+// Noop ensures that the Go runtime is initialized.
+//
+//export Noop
+func Noop() {
+}
+
+// Raise SIGPIPE.
+//
+//export GoRaiseSIGPIPE
+func GoRaiseSIGPIPE() {
+	C.CRaiseSIGPIPE()
+}
+
+func main() {
+}
diff --git a/src/cmd/cgo/internal/testcarchive/testdata/libgo3/libgo3.go b/src/cmd/cgo/internal/testcarchive/testdata/libgo3/libgo3.go
new file mode 100644
index 0000000..136695b
--- /dev/null
+++ b/src/cmd/cgo/internal/testcarchive/testdata/libgo3/libgo3.go
@@ -0,0 +1,60 @@
+// 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 "C"
+
+import (
+	"os"
+	"os/signal"
+	"syscall"
+	"time"
+)
+
+// The channel used to read SIGIO signals.
+var sigioChan chan os.Signal
+
+// CatchSIGIO starts catching SIGIO signals.
+//
+//export CatchSIGIO
+func CatchSIGIO() {
+	sigioChan = make(chan os.Signal, 1)
+	signal.Notify(sigioChan, syscall.SIGIO)
+}
+
+// ResetSIGIO stops catching SIGIO signals.
+//
+//export ResetSIGIO
+func ResetSIGIO() {
+	signal.Reset(syscall.SIGIO)
+}
+
+// SawSIGIO reports whether we saw a SIGIO.
+//
+//export SawSIGIO
+func SawSIGIO() C.int {
+	select {
+	case <-sigioChan:
+		return 1
+	case <-time.After(5 * time.Second):
+		return 0
+	}
+}
+
+// ProvokeSIGPIPE provokes a kernel-initiated SIGPIPE.
+//
+//export ProvokeSIGPIPE
+func ProvokeSIGPIPE() {
+	r, w, err := os.Pipe()
+	if err != nil {
+		panic(err)
+	}
+	r.Close()
+	defer w.Close()
+	w.Write([]byte("some data"))
+}
+
+func main() {
+}
diff --git a/src/cmd/cgo/internal/testcarchive/testdata/libgo4/libgo4.go b/src/cmd/cgo/internal/testcarchive/testdata/libgo4/libgo4.go
new file mode 100644
index 0000000..c81d3af
--- /dev/null
+++ b/src/cmd/cgo/internal/testcarchive/testdata/libgo4/libgo4.go
@@ -0,0 +1,55 @@
+// 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
+
+/*
+#include <signal.h>
+#include <pthread.h>
+
+// Raise SIGIO.
+static void CRaiseSIGIO(pthread_t* p) {
+	pthread_kill(*p, SIGIO);
+}
+*/
+import "C"
+
+import (
+	"os"
+	"os/signal"
+	"sync/atomic"
+	"syscall"
+)
+
+var sigioCount int32
+
+// Catch SIGIO.
+//
+//export GoCatchSIGIO
+func GoCatchSIGIO() {
+	c := make(chan os.Signal, 1)
+	signal.Notify(c, syscall.SIGIO)
+	go func() {
+		for range c {
+			atomic.AddInt32(&sigioCount, 1)
+		}
+	}()
+}
+
+// Raise SIGIO.
+//
+//export GoRaiseSIGIO
+func GoRaiseSIGIO(p *C.pthread_t) {
+	C.CRaiseSIGIO(p)
+}
+
+// Return the number of SIGIO signals seen.
+//
+//export SIGIOCount
+func SIGIOCount() C.int {
+	return C.int(atomic.LoadInt32(&sigioCount))
+}
+
+func main() {
+}
diff --git a/misc/cgo/testcarchive/testdata/libgo6/sigprof.go b/src/cmd/cgo/internal/testcarchive/testdata/libgo6/sigprof.go
similarity index 100%
rename from misc/cgo/testcarchive/testdata/libgo6/sigprof.go
rename to src/cmd/cgo/internal/testcarchive/testdata/libgo6/sigprof.go
diff --git a/misc/cgo/testcarchive/testdata/libgo7/sink.go b/src/cmd/cgo/internal/testcarchive/testdata/libgo7/sink.go
similarity index 100%
rename from misc/cgo/testcarchive/testdata/libgo7/sink.go
rename to src/cmd/cgo/internal/testcarchive/testdata/libgo7/sink.go
diff --git a/misc/cgo/testcarchive/testdata/libgo8/a.go b/src/cmd/cgo/internal/testcarchive/testdata/libgo8/a.go
similarity index 100%
rename from misc/cgo/testcarchive/testdata/libgo8/a.go
rename to src/cmd/cgo/internal/testcarchive/testdata/libgo8/a.go
diff --git a/src/cmd/cgo/internal/testcarchive/testdata/libgo9/a.go b/src/cmd/cgo/internal/testcarchive/testdata/libgo9/a.go
new file mode 100644
index 0000000..acb08d9
--- /dev/null
+++ b/src/cmd/cgo/internal/testcarchive/testdata/libgo9/a.go
@@ -0,0 +1,14 @@
+// Copyright 2023 The Go Authors. 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 "runtime"
+
+import "C"
+
+func main() {}
+
+//export GoF
+func GoF() { runtime.GC() }
diff --git a/misc/cgo/testcarchive/testdata/main.c b/src/cmd/cgo/internal/testcarchive/testdata/main.c
similarity index 100%
rename from misc/cgo/testcarchive/testdata/main.c
rename to src/cmd/cgo/internal/testcarchive/testdata/main.c
diff --git a/src/cmd/cgo/internal/testcarchive/testdata/main2.c b/src/cmd/cgo/internal/testcarchive/testdata/main2.c
new file mode 100644
index 0000000..e82294d
--- /dev/null
+++ b/src/cmd/cgo/internal/testcarchive/testdata/main2.c
@@ -0,0 +1,239 @@
+// 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 installing a signal handler before the Go code starts.
+// This is a lot like ../testcshared/main4.c.
+
+#include <setjmp.h>
+#include <signal.h>
+#include <stdarg.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <sched.h>
+#include <time.h>
+#include <errno.h>
+
+#include "libgo2.h"
+
+static void die(const char* msg) {
+	perror(msg);
+	exit(EXIT_FAILURE);
+}
+
+static volatile sig_atomic_t sigioSeen;
+static volatile sig_atomic_t sigpipeSeen;
+
+// Use up some stack space.
+static void recur(int i, char *p) {
+	char a[1024];
+
+	*p = '\0';
+	if (i > 0) {
+		recur(i - 1, a);
+	}
+}
+
+static void pipeHandler(int signo, siginfo_t* info, void* ctxt) {
+	sigpipeSeen = 1;
+}
+
+// Signal handler that uses up more stack space than a goroutine will have.
+static void ioHandler(int signo, siginfo_t* info, void* ctxt) {
+	char a[1024];
+
+	recur(4, a);
+	sigioSeen = 1;
+}
+
+static jmp_buf jmp;
+static char* nullPointer;
+
+// An arbitrary function which requires proper stack alignment; see
+// http://golang.org/issue/17641.
+static void callWithVarargs(void* dummy, ...) {
+	va_list args;
+	va_start(args, dummy);
+	va_end(args);
+}
+
+// Signal handler for SIGSEGV on a C thread.
+static void segvHandler(int signo, siginfo_t* info, void* ctxt) {
+	sigset_t mask;
+	int i;
+
+	// Call an arbitrary function that requires the stack to be properly aligned.
+	callWithVarargs("dummy arg", 3.1415);
+
+	if (sigemptyset(&mask) < 0) {
+		die("sigemptyset");
+	}
+	if (sigaddset(&mask, SIGSEGV) < 0) {
+		die("sigaddset");
+	}
+	i = sigprocmask(SIG_UNBLOCK, &mask, NULL);
+	if (i != 0) {
+		fprintf(stderr, "sigprocmask: %s\n", strerror(i));
+		exit(EXIT_FAILURE);
+	}
+
+	// Don't try this at home.
+	longjmp(jmp, signo);
+
+	// We should never get here.
+	abort();
+}
+
+// Set up the signal handlers in a high priority constructor,
+// so that they are installed before the Go code starts.
+
+static void init(void) __attribute__ ((constructor (200)));
+
+static void init() {
+	struct sigaction sa;
+
+	memset(&sa, 0, sizeof sa);
+	sa.sa_sigaction = ioHandler;
+	if (sigemptyset(&sa.sa_mask) < 0) {
+		die("sigemptyset");
+	}
+	sa.sa_flags = SA_SIGINFO;
+	if (sigaction(SIGIO, &sa, NULL) < 0) {
+		die("sigaction");
+	}
+
+	sa.sa_sigaction = segvHandler;
+	if (sigaction(SIGSEGV, &sa, NULL) < 0 || sigaction(SIGBUS, &sa, NULL) < 0) {
+		die("sigaction");
+	}
+
+	sa.sa_sigaction = pipeHandler;
+	if (sigaction(SIGPIPE, &sa, NULL) < 0) {
+		die("sigaction");
+	}
+}
+
+int main(int argc, char** argv) {
+	int verbose;
+	sigset_t mask;
+	int i;
+	struct timespec ts;
+	int darwin;
+
+	darwin = atoi(argv[1]);
+
+	verbose = argc > 2;
+
+	setvbuf(stdout, NULL, _IONBF, 0);
+
+	// Call setsid so that we can use kill(0, SIGIO) below.
+	// Don't check the return value so that this works both from
+	// a job control shell and from a shell script.
+	setsid();
+
+	if (verbose) {
+		printf("calling RunGoroutines\n");
+	}
+
+	RunGoroutines();
+
+	// Block SIGIO in this thread to make it more likely that it
+	// will be delivered to a goroutine.
+
+	if (verbose) {
+		printf("calling pthread_sigmask\n");
+	}
+
+	if (sigemptyset(&mask) < 0) {
+		die("sigemptyset");
+	}
+	if (sigaddset(&mask, SIGIO) < 0) {
+		die("sigaddset");
+	}
+	i = pthread_sigmask(SIG_BLOCK, &mask, NULL);
+	if (i != 0) {
+		fprintf(stderr, "pthread_sigmask: %s\n", strerror(i));
+		exit(EXIT_FAILURE);
+	}
+
+	if (verbose) {
+		printf("calling kill\n");
+	}
+
+	if (kill(0, SIGIO) < 0) {
+		die("kill");
+	}
+
+	if (verbose) {
+		printf("waiting for sigioSeen\n");
+	}
+
+	// Wait until the signal has been delivered.
+	i = 0;
+	while (!sigioSeen) {
+		ts.tv_sec = 0;
+		ts.tv_nsec = 1000000;
+		nanosleep(&ts, NULL);
+		i++;
+		if (i > 5000) {
+			fprintf(stderr, "looping too long waiting for SIGIO\n");
+			exit(EXIT_FAILURE);
+		}
+	}
+
+	if (verbose) {
+		printf("provoking SIGPIPE\n");
+	}
+
+	// SIGPIPE is never forwarded on Darwin, see golang.org/issue/33384.
+	if (!darwin) {
+		GoRaiseSIGPIPE();
+
+		if (verbose) {
+			printf("waiting for sigpipeSeen\n");
+		}
+
+		// Wait until the signal has been delivered.
+		i = 0;
+		while (!sigpipeSeen) {
+			ts.tv_sec = 0;
+			ts.tv_nsec = 1000000;
+			nanosleep(&ts, NULL);
+			i++;
+			if (i > 5000) {
+				fprintf(stderr, "looping too long waiting for SIGPIPE\n");
+				exit(EXIT_FAILURE);
+			}
+		}
+	}
+
+	if (verbose) {
+		printf("calling setjmp\n");
+	}
+
+	// Test that a SIGSEGV on this thread is delivered to us.
+	if (setjmp(jmp) == 0) {
+		if (verbose) {
+			printf("triggering SIGSEGV\n");
+		}
+
+		*nullPointer = '\0';
+
+		fprintf(stderr, "continued after address error\n");
+		exit(EXIT_FAILURE);
+	}
+
+	if (verbose) {
+		printf("calling TestSEGV\n");
+	}
+
+	TestSEGV();
+
+	printf("PASS\n");
+	return 0;
+}
diff --git a/src/cmd/cgo/internal/testcarchive/testdata/main3.c b/src/cmd/cgo/internal/testcarchive/testdata/main3.c
new file mode 100644
index 0000000..983e1b6
--- /dev/null
+++ b/src/cmd/cgo/internal/testcarchive/testdata/main3.c
@@ -0,0 +1,210 @@
+// 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 os/signal.Notify and os/signal.Reset.
+// This is a lot like ../testcshared/main5.c.
+
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <sched.h>
+#include <unistd.h>
+#include <pthread.h>
+
+#include "libgo3.h"
+
+static void die(const char* msg) {
+	perror(msg);
+	exit(EXIT_FAILURE);
+}
+
+static volatile sig_atomic_t sigioSeen;
+
+static void ioHandler(int signo, siginfo_t* info, void* ctxt) {
+	sigioSeen = 1;
+}
+
+// Set up the SIGPIPE signal handler in a high priority constructor, so
+// that it is installed before the Go code starts.
+
+static void pipeHandler(int signo, siginfo_t* info, void* ctxt) {
+	const char *s = "unexpected SIGPIPE\n";
+	write(2, s, strlen(s));
+	exit(EXIT_FAILURE);
+}
+
+static void init(void) __attribute__ ((constructor (200)));
+
+static void init() {
+    struct sigaction sa;
+
+	memset(&sa, 0, sizeof sa);
+	sa.sa_sigaction = pipeHandler;
+	if (sigemptyset(&sa.sa_mask) < 0) {
+		die("sigemptyset");
+	}
+	sa.sa_flags = SA_SIGINFO;
+	if (sigaction(SIGPIPE, &sa, NULL) < 0) {
+		die("sigaction");
+	}
+}
+
+static void *provokeSIGPIPE(void *arg) {
+	ProvokeSIGPIPE();
+	return NULL;
+}
+
+int main(int argc, char** argv) {
+	int verbose;
+	struct sigaction sa;
+	int i;
+	struct timespec ts;
+	int res;
+	pthread_t tid;
+
+	verbose = argc > 2;
+	setvbuf(stdout, NULL, _IONBF, 0);
+
+	if (verbose) {
+		printf("raising SIGPIPE\n");
+	}
+
+	// Test that the Go runtime handles SIGPIPE, even if we installed
+	// a non-default SIGPIPE handler before the runtime initializes.
+	ProvokeSIGPIPE();
+
+	// Test that SIGPIPE on a non-main thread is also handled by Go.
+	res = pthread_create(&tid, NULL, provokeSIGPIPE, NULL);
+	if (res != 0) {
+		fprintf(stderr, "pthread_create: %s\n", strerror(res));
+		exit(EXIT_FAILURE);
+	}
+
+	res = pthread_join(tid, NULL);
+	if (res != 0) {
+		fprintf(stderr, "pthread_join: %s\n", strerror(res));
+		exit(EXIT_FAILURE);
+	}
+
+	if (verbose) {
+		printf("calling sigaction\n");
+	}
+
+	memset(&sa, 0, sizeof sa);
+	sa.sa_sigaction = ioHandler;
+	if (sigemptyset(&sa.sa_mask) < 0) {
+		die("sigemptyset");
+	}
+	sa.sa_flags = SA_SIGINFO;
+	if (sigaction(SIGIO, &sa, NULL) < 0) {
+		die("sigaction");
+	}
+
+	// At this point there should not be a Go signal handler
+	// installed for SIGIO.
+
+	if (verbose) {
+		printf("raising SIGIO\n");
+	}
+
+	if (raise(SIGIO) < 0) {
+		die("raise");
+	}
+
+	if (verbose) {
+		printf("waiting for sigioSeen\n");
+	}
+
+	// Wait until the signal has been delivered.
+	i = 0;
+	while (!sigioSeen) {
+		ts.tv_sec = 0;
+		ts.tv_nsec = 1000000;
+		nanosleep(&ts, NULL);
+		i++;
+		if (i > 5000) {
+			fprintf(stderr, "looping too long waiting for signal\n");
+			exit(EXIT_FAILURE);
+		}
+	}
+
+	sigioSeen = 0;
+
+	// Tell the Go code to catch SIGIO.
+
+	if (verbose) {
+		printf("calling CatchSIGIO\n");
+	}
+
+	CatchSIGIO();
+
+	if (verbose) {
+		printf("raising SIGIO\n");
+	}
+
+	if (raise(SIGIO) < 0) {
+		die("raise");
+	}
+
+	if (verbose) {
+		printf("calling SawSIGIO\n");
+	}
+
+	if (!SawSIGIO()) {
+		fprintf(stderr, "Go handler did not see SIGIO\n");
+		exit(EXIT_FAILURE);
+	}
+
+	if (sigioSeen != 0) {
+		fprintf(stderr, "C handler saw SIGIO when only Go handler should have\n");
+		exit(EXIT_FAILURE);
+	}
+
+	// Tell the Go code to stop catching SIGIO.
+
+	if (verbose) {
+		printf("calling ResetSIGIO\n");
+	}
+
+	ResetSIGIO();
+
+	if (verbose) {
+		printf("raising SIGIO\n");
+	}
+
+	if (raise(SIGIO) < 0) {
+		die("raise");
+	}
+
+	if (verbose) {
+		printf("calling SawSIGIO\n");
+	}
+
+	if (SawSIGIO()) {
+		fprintf(stderr, "Go handler saw SIGIO after Reset\n");
+		exit(EXIT_FAILURE);
+	}
+
+	if (verbose) {
+		printf("waiting for sigioSeen\n");
+	}
+
+	// Wait until the signal has been delivered.
+	i = 0;
+	while (!sigioSeen) {
+		ts.tv_sec = 0;
+		ts.tv_nsec = 1000000;
+		nanosleep(&ts, NULL);
+		i++;
+		if (i > 5000) {
+			fprintf(stderr, "looping too long waiting for signal\n");
+			exit(EXIT_FAILURE);
+		}
+	}
+
+	printf("PASS\n");
+	return 0;
+}
diff --git a/misc/cgo/testcarchive/testdata/main4.c b/src/cmd/cgo/internal/testcarchive/testdata/main4.c
similarity index 100%
rename from misc/cgo/testcarchive/testdata/main4.c
rename to src/cmd/cgo/internal/testcarchive/testdata/main4.c
diff --git a/misc/cgo/testcarchive/testdata/main5.c b/src/cmd/cgo/internal/testcarchive/testdata/main5.c
similarity index 100%
rename from misc/cgo/testcarchive/testdata/main5.c
rename to src/cmd/cgo/internal/testcarchive/testdata/main5.c
diff --git a/misc/cgo/testcarchive/testdata/main6.c b/src/cmd/cgo/internal/testcarchive/testdata/main6.c
similarity index 100%
rename from misc/cgo/testcarchive/testdata/main6.c
rename to src/cmd/cgo/internal/testcarchive/testdata/main6.c
diff --git a/misc/cgo/testcarchive/testdata/main7.c b/src/cmd/cgo/internal/testcarchive/testdata/main7.c
similarity index 100%
rename from misc/cgo/testcarchive/testdata/main7.c
rename to src/cmd/cgo/internal/testcarchive/testdata/main7.c
diff --git a/misc/cgo/testcarchive/testdata/main8.c b/src/cmd/cgo/internal/testcarchive/testdata/main8.c
similarity index 100%
rename from misc/cgo/testcarchive/testdata/main8.c
rename to src/cmd/cgo/internal/testcarchive/testdata/main8.c
diff --git a/src/cmd/cgo/internal/testcarchive/testdata/main9.c b/src/cmd/cgo/internal/testcarchive/testdata/main9.c
new file mode 100644
index 0000000..95ad4de
--- /dev/null
+++ b/src/cmd/cgo/internal/testcarchive/testdata/main9.c
@@ -0,0 +1,24 @@
+// Copyright 2023 The Go 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 "libgo9.h"
+
+void use(int *x) { (*x)++; }
+
+void callGoFWithDeepStack() {
+	int x[10000];
+
+	use(&x[0]);
+	use(&x[9999]);
+
+	GoF();
+
+	use(&x[0]);
+	use(&x[9999]);
+}
+
+int main() {
+	GoF();                  // call GoF without using much stack
+	callGoFWithDeepStack(); // call GoF with a deep stack
+}
diff --git a/misc/cgo/testcarchive/testdata/main_unix.c b/src/cmd/cgo/internal/testcarchive/testdata/main_unix.c
similarity index 100%
rename from misc/cgo/testcarchive/testdata/main_unix.c
rename to src/cmd/cgo/internal/testcarchive/testdata/main_unix.c
diff --git a/misc/cgo/testcarchive/testdata/main_windows.c b/src/cmd/cgo/internal/testcarchive/testdata/main_windows.c
similarity index 100%
rename from misc/cgo/testcarchive/testdata/main_windows.c
rename to src/cmd/cgo/internal/testcarchive/testdata/main_windows.c
diff --git a/misc/cgo/testcarchive/testdata/p/p.go b/src/cmd/cgo/internal/testcarchive/testdata/p/p.go
similarity index 100%
rename from misc/cgo/testcarchive/testdata/p/p.go
rename to src/cmd/cgo/internal/testcarchive/testdata/p/p.go
diff --git a/src/cmd/cgo/internal/testcshared/cshared_test.go b/src/cmd/cgo/internal/testcshared/cshared_test.go
new file mode 100644
index 0000000..7fe6782
--- /dev/null
+++ b/src/cmd/cgo/internal/testcshared/cshared_test.go
@@ -0,0 +1,874 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package cshared_test
+
+import (
+	"bufio"
+	"bytes"
+	"cmd/cgo/internal/cgotest"
+	"debug/elf"
+	"debug/pe"
+	"encoding/binary"
+	"flag"
+	"fmt"
+	"internal/testenv"
+	"log"
+	"os"
+	"os/exec"
+	"path/filepath"
+	"runtime"
+	"strings"
+	"sync"
+	"testing"
+	"unicode"
+)
+
+var globalSkip = func(t *testing.T) {}
+
+// C compiler with args (from $(go env CC) $(go env GOGCCFLAGS)).
+var cc []string
+
+// ".exe" on Windows.
+var exeSuffix string
+
+var GOOS, GOARCH, GOROOT string
+var installdir string
+var libgoname string
+
+func TestMain(m *testing.M) {
+	os.Exit(testMain(m))
+}
+
+func testMain(m *testing.M) int {
+	log.SetFlags(log.Lshortfile)
+	flag.Parse()
+	if testing.Short() && os.Getenv("GO_BUILDER_NAME") == "" {
+		globalSkip = func(t *testing.T) { t.Skip("short mode and $GO_BUILDER_NAME not set") }
+		return m.Run()
+	}
+	if runtime.GOOS == "linux" {
+		if _, err := os.Stat("/etc/alpine-release"); err == nil {
+			globalSkip = func(t *testing.T) { t.Skip("skipping failing test on alpine - go.dev/issue/19938") }
+			return m.Run()
+		}
+	}
+	if !testenv.HasGoBuild() {
+		// Checking for "go build" is a proxy for whether or not we can run "go env".
+		globalSkip = func(t *testing.T) { t.Skip("no go build") }
+		return m.Run()
+	}
+
+	GOOS = goEnv("GOOS")
+	GOARCH = goEnv("GOARCH")
+	GOROOT = goEnv("GOROOT")
+
+	if _, err := os.Stat(GOROOT); os.IsNotExist(err) {
+		log.Fatalf("Unable able to find GOROOT at '%s'", GOROOT)
+	}
+
+	cc = []string{goEnv("CC")}
+
+	out := goEnv("GOGCCFLAGS")
+	quote := '\000'
+	start := 0
+	lastSpace := true
+	backslash := false
+	s := string(out)
+	for i, c := range s {
+		if quote == '\000' && unicode.IsSpace(c) {
+			if !lastSpace {
+				cc = append(cc, s[start:i])
+				lastSpace = true
+			}
+		} else {
+			if lastSpace {
+				start = i
+				lastSpace = false
+			}
+			if quote == '\000' && !backslash && (c == '"' || c == '\'') {
+				quote = c
+				backslash = false
+			} else if !backslash && quote == c {
+				quote = '\000'
+			} else if (quote == '\000' || quote == '"') && !backslash && c == '\\' {
+				backslash = true
+			} else {
+				backslash = false
+			}
+		}
+	}
+	if !lastSpace {
+		cc = append(cc, s[start:])
+	}
+
+	switch GOOS {
+	case "darwin", "ios":
+		// For Darwin/ARM.
+		// TODO(crawshaw): can we do better?
+		cc = append(cc, []string{"-framework", "CoreFoundation", "-framework", "Foundation"}...)
+	case "android":
+		cc = append(cc, "-pie")
+	}
+	libgodir := GOOS + "_" + GOARCH
+	switch GOOS {
+	case "darwin", "ios":
+		if GOARCH == "arm64" {
+			libgodir += "_shared"
+		}
+	case "dragonfly", "freebsd", "linux", "netbsd", "openbsd", "solaris", "illumos":
+		libgodir += "_shared"
+	}
+	cc = append(cc, "-I", filepath.Join("pkg", libgodir))
+
+	// Force reallocation (and avoid aliasing bugs) for parallel tests that append to cc.
+	cc = cc[:len(cc):len(cc)]
+
+	if GOOS == "windows" {
+		exeSuffix = ".exe"
+	}
+
+	// Copy testdata into GOPATH/src/testcshared, along with a go.mod file
+	// declaring the same path.
+
+	GOPATH, err := os.MkdirTemp("", "cshared_test")
+	if err != nil {
+		log.Panic(err)
+	}
+	defer os.RemoveAll(GOPATH)
+	os.Setenv("GOPATH", GOPATH)
+
+	modRoot := filepath.Join(GOPATH, "src", "testcshared")
+	if err := cgotest.OverlayDir(modRoot, "testdata"); err != nil {
+		log.Panic(err)
+	}
+	if err := os.Chdir(modRoot); err != nil {
+		log.Panic(err)
+	}
+	os.Setenv("PWD", modRoot)
+	if err := os.WriteFile("go.mod", []byte("module testcshared\n"), 0666); err != nil {
+		log.Panic(err)
+	}
+
+	defer func() {
+		if installdir != "" {
+			err := os.RemoveAll(installdir)
+			if err != nil {
+				log.Panic(err)
+			}
+		}
+	}()
+
+	return m.Run()
+}
+
+func goEnv(key string) string {
+	out, err := exec.Command("go", "env", key).Output()
+	if err != nil {
+		log.Printf("go env %s failed:\n%s", key, err)
+		log.Panicf("%s", err.(*exec.ExitError).Stderr)
+	}
+	return strings.TrimSpace(string(out))
+}
+
+func cmdToRun(name string) string {
+	return "./" + name + exeSuffix
+}
+
+func run(t *testing.T, extraEnv []string, args ...string) string {
+	t.Helper()
+	cmd := exec.Command(args[0], args[1:]...)
+	if len(extraEnv) > 0 {
+		cmd.Env = append(os.Environ(), extraEnv...)
+	}
+
+	if GOOS != "windows" {
+		// TestUnexportedSymbols relies on file descriptor 30
+		// being closed when the program starts, so enforce
+		// that in all cases. (The first three descriptors are
+		// stdin/stdout/stderr, so we just need to make sure
+		// that cmd.ExtraFiles[27] exists and is nil.)
+		cmd.ExtraFiles = make([]*os.File, 28)
+	}
+
+	out, err := cmd.CombinedOutput()
+	if err != nil {
+		t.Fatalf("command failed: %v\n%v\n%s\n", args, err, out)
+	} else {
+		t.Logf("run: %v", args)
+	}
+	return string(out)
+}
+
+func runExe(t *testing.T, extraEnv []string, args ...string) string {
+	t.Helper()
+	return run(t, extraEnv, args...)
+}
+
+func runCC(t *testing.T, args ...string) string {
+	t.Helper()
+	// This function is run in parallel, so append to a copy of cc
+	// rather than cc itself.
+	return run(t, nil, append(append([]string(nil), cc...), args...)...)
+}
+
+func createHeaders() error {
+	// The 'cgo' command generates a number of additional artifacts,
+	// but we're only interested in the header.
+	// Shunt the rest of the outputs to a temporary directory.
+	objDir, err := os.MkdirTemp("", "testcshared_obj")
+	if err != nil {
+		return err
+	}
+	defer os.RemoveAll(objDir)
+
+	// Generate a C header file for p, which is a non-main dependency
+	// of main package libgo.
+	//
+	// TODO(golang.org/issue/35715): This should be simpler.
+	args := []string{"go", "tool", "cgo",
+		"-objdir", objDir,
+		"-exportheader", "p.h",
+		filepath.Join(".", "p", "p.go")}
+	cmd := exec.Command(args[0], args[1:]...)
+	out, err := cmd.CombinedOutput()
+	if err != nil {
+		return fmt.Errorf("command failed: %v\n%v\n%s\n", args, err, out)
+	}
+
+	// Generate a C header file for libgo itself.
+	installdir, err = os.MkdirTemp("", "testcshared")
+	if err != nil {
+		return err
+	}
+	libgoname = "libgo.a"
+
+	args = []string{"go", "build", "-buildmode=c-shared", "-o", filepath.Join(installdir, libgoname), "./libgo"}
+	cmd = exec.Command(args[0], args[1:]...)
+	out, err = cmd.CombinedOutput()
+	if err != nil {
+		return fmt.Errorf("command failed: %v\n%v\n%s\n", args, err, out)
+	}
+
+	args = []string{"go", "build", "-buildmode=c-shared",
+		"-installsuffix", "testcshared",
+		"-o", libgoname,
+		filepath.Join(".", "libgo", "libgo.go")}
+	if GOOS == "windows" && strings.HasSuffix(args[6], ".a") {
+		args[6] = strings.TrimSuffix(args[6], ".a") + ".dll"
+	}
+	cmd = exec.Command(args[0], args[1:]...)
+	out, err = cmd.CombinedOutput()
+	if err != nil {
+		return fmt.Errorf("command failed: %v\n%v\n%s\n", args, err, out)
+	}
+	if GOOS == "windows" {
+		// We can't simply pass -Wl,--out-implib, because this relies on having imports from multiple packages,
+		// which results in the linkers output implib getting overwritten at each step. So instead build the
+		// import library the traditional way, using a def file.
+		err = os.WriteFile("libgo.def",
+			[]byte("LIBRARY libgo.dll\nEXPORTS\n\tDidInitRun\n\tDidMainRun\n\tDivu\n\tFromPkg\n\t_cgo_dummy_export\n"),
+			0644)
+		if err != nil {
+			return fmt.Errorf("unable to write def file: %v", err)
+		}
+		out, err = exec.Command(cc[0], append(cc[1:], "-print-prog-name=dlltool")...).CombinedOutput()
+		if err != nil {
+			return fmt.Errorf("unable to find dlltool path: %v\n%s\n", err, out)
+		}
+		dlltoolpath := strings.TrimSpace(string(out))
+		if filepath.Ext(dlltoolpath) == "" {
+			// Some compilers report slash-separated paths without extensions
+			// instead of ordinary Windows paths.
+			// Try to find the canonical name for the path.
+			if lp, err := exec.LookPath(dlltoolpath); err == nil {
+				dlltoolpath = lp
+			}
+		}
+
+		args := []string{dlltoolpath, "-D", args[6], "-l", libgoname, "-d", "libgo.def"}
+
+		if filepath.Ext(dlltoolpath) == "" {
+			// This is an unfortunate workaround for
+			// https://github.com/mstorsjo/llvm-mingw/issues/205 in which
+			// we basically reimplement the contents of the dlltool.sh
+			// wrapper: https://git.io/JZFlU.
+			// TODO(thanm): remove this workaround once we can upgrade
+			// the compilers on the windows-arm64 builder.
+			dlltoolContents, err := os.ReadFile(args[0])
+			if err != nil {
+				return fmt.Errorf("unable to read dlltool: %v\n", err)
+			}
+			if bytes.HasPrefix(dlltoolContents, []byte("#!/bin/sh")) && bytes.Contains(dlltoolContents, []byte("llvm-dlltool")) {
+				base, name := filepath.Split(args[0])
+				args[0] = filepath.Join(base, "llvm-dlltool")
+				var machine string
+				switch prefix, _, _ := strings.Cut(name, "-"); prefix {
+				case "i686":
+					machine = "i386"
+				case "x86_64":
+					machine = "i386:x86-64"
+				case "armv7":
+					machine = "arm"
+				case "aarch64":
+					machine = "arm64"
+				}
+				if len(machine) > 0 {
+					args = append(args, "-m", machine)
+				}
+			}
+		}
+
+		out, err = exec.Command(args[0], args[1:]...).CombinedOutput()
+		if err != nil {
+			return fmt.Errorf("unable to run dlltool to create import library: %v\n%s\n", err, out)
+		}
+	}
+
+	return nil
+}
+
+var (
+	headersOnce sync.Once
+	headersErr  error
+)
+
+func createHeadersOnce(t *testing.T) {
+	testenv.MustHaveGoBuild(t)
+	testenv.MustHaveCGO(t)
+	testenv.MustHaveBuildMode(t, "c-shared")
+
+	headersOnce.Do(func() {
+		headersErr = createHeaders()
+	})
+	if headersErr != nil {
+		t.Helper()
+		t.Fatal(headersErr)
+	}
+}
+
+// test0: exported symbols in shared lib are accessible.
+func TestExportedSymbols(t *testing.T) {
+	globalSkip(t)
+	testenv.MustHaveCGO(t)
+	testenv.MustHaveExec(t)
+
+	t.Parallel()
+
+	cmd := "testp0"
+	bin := cmdToRun(cmd)
+
+	createHeadersOnce(t)
+
+	runCC(t, "-I", installdir, "-o", cmd, "main0.c", libgoname)
+
+	defer os.Remove(bin)
+
+	out := runExe(t, []string{"LD_LIBRARY_PATH=."}, bin)
+	if strings.TrimSpace(out) != "PASS" {
+		t.Error(out)
+	}
+}
+
+func checkNumberOfExportedFunctionsWindows(t *testing.T, exportAllSymbols bool) {
+	const prog = `
+package main
+
+import "C"
+
+//export GoFunc
+func GoFunc() {
+	println(42)
+}
+
+//export GoFunc2
+func GoFunc2() {
+	println(24)
+}
+
+func main() {
+}
+`
+
+	tmpdir := t.TempDir()
+
+	srcfile := filepath.Join(tmpdir, "test.go")
+	objfile := filepath.Join(tmpdir, "test.dll")
+	if err := os.WriteFile(srcfile, []byte(prog), 0666); err != nil {
+		t.Fatal(err)
+	}
+	argv := []string{"build", "-buildmode=c-shared"}
+	if exportAllSymbols {
+		argv = append(argv, "-ldflags", "-extldflags=-Wl,--export-all-symbols")
+	}
+	argv = append(argv, "-o", objfile, srcfile)
+	out, err := exec.Command("go", argv...).CombinedOutput()
+	if err != nil {
+		t.Fatalf("build failure: %s\n%s\n", err, string(out))
+	}
+
+	f, err := pe.Open(objfile)
+	if err != nil {
+		t.Fatalf("pe.Open failed: %v", err)
+	}
+	defer f.Close()
+	section := f.Section(".edata")
+	if section == nil {
+		t.Skip(".edata section is not present")
+	}
+
+	// TODO: deduplicate this struct from cmd/link/internal/ld/pe.go
+	type IMAGE_EXPORT_DIRECTORY struct {
+		_                 [2]uint32
+		_                 [2]uint16
+		_                 [2]uint32
+		NumberOfFunctions uint32
+		NumberOfNames     uint32
+		_                 [3]uint32
+	}
+	var e IMAGE_EXPORT_DIRECTORY
+	if err := binary.Read(section.Open(), binary.LittleEndian, &e); err != nil {
+		t.Fatalf("binary.Read failed: %v", err)
+	}
+
+	// Only the two exported functions and _cgo_dummy_export should be exported
+	expectedNumber := uint32(3)
+
+	if exportAllSymbols {
+		if e.NumberOfFunctions <= expectedNumber {
+			t.Fatalf("missing exported functions: %v", e.NumberOfFunctions)
+		}
+		if e.NumberOfNames <= expectedNumber {
+			t.Fatalf("missing exported names: %v", e.NumberOfNames)
+		}
+	} else {
+		if e.NumberOfFunctions != expectedNumber {
+			t.Fatalf("got %d exported functions; want %d", e.NumberOfFunctions, expectedNumber)
+		}
+		if e.NumberOfNames != expectedNumber {
+			t.Fatalf("got %d exported names; want %d", e.NumberOfNames, expectedNumber)
+		}
+	}
+}
+
+func TestNumberOfExportedFunctions(t *testing.T) {
+	if GOOS != "windows" {
+		t.Skip("skipping windows only test")
+	}
+	globalSkip(t)
+	testenv.MustHaveGoBuild(t)
+	testenv.MustHaveCGO(t)
+	testenv.MustHaveBuildMode(t, "c-shared")
+
+	t.Parallel()
+
+	t.Run("OnlyExported", func(t *testing.T) {
+		checkNumberOfExportedFunctionsWindows(t, false)
+	})
+	t.Run("All", func(t *testing.T) {
+		checkNumberOfExportedFunctionsWindows(t, true)
+	})
+}
+
+// test1: shared library can be dynamically loaded and exported symbols are accessible.
+func TestExportedSymbolsWithDynamicLoad(t *testing.T) {
+	if GOOS == "windows" {
+		t.Skipf("Skipping on %s", GOOS)
+	}
+	globalSkip(t)
+	testenv.MustHaveCGO(t)
+	testenv.MustHaveExec(t)
+
+	t.Parallel()
+
+	cmd := "testp1"
+	bin := cmdToRun(cmd)
+
+	createHeadersOnce(t)
+
+	if GOOS != "freebsd" {
+		runCC(t, "-o", cmd, "main1.c", "-ldl")
+	} else {
+		runCC(t, "-o", cmd, "main1.c")
+	}
+
+	defer os.Remove(bin)
+
+	out := runExe(t, nil, bin, "./"+libgoname)
+	if strings.TrimSpace(out) != "PASS" {
+		t.Error(out)
+	}
+}
+
+// test2: tests libgo2 which does not export any functions.
+func TestUnexportedSymbols(t *testing.T) {
+	if GOOS == "windows" {
+		t.Skipf("Skipping on %s", GOOS)
+	}
+	globalSkip(t)
+	testenv.MustHaveGoBuild(t)
+	testenv.MustHaveCGO(t)
+	testenv.MustHaveBuildMode(t, "c-shared")
+
+	t.Parallel()
+
+	cmd := "testp2"
+	bin := cmdToRun(cmd)
+	libname := "libgo2.a"
+
+	run(t,
+		nil,
+		"go", "build",
+		"-buildmode=c-shared",
+		"-installsuffix", "testcshared",
+		"-o", libname, "./libgo2",
+	)
+
+	linkFlags := "-Wl,--no-as-needed"
+	if GOOS == "darwin" || GOOS == "ios" {
+		linkFlags = ""
+	}
+
+	runCC(t, "-o", cmd, "main2.c", linkFlags, libname)
+
+	defer os.Remove(libname)
+	defer os.Remove(bin)
+
+	out := runExe(t, []string{"LD_LIBRARY_PATH=."}, bin)
+
+	if strings.TrimSpace(out) != "PASS" {
+		t.Error(out)
+	}
+}
+
+// test3: tests main.main is exported on android.
+func TestMainExportedOnAndroid(t *testing.T) {
+	globalSkip(t)
+	testenv.MustHaveCGO(t)
+	testenv.MustHaveExec(t)
+
+	t.Parallel()
+
+	switch GOOS {
+	case "android":
+		break
+	default:
+		t.Logf("Skipping on %s", GOOS)
+		return
+	}
+
+	cmd := "testp3"
+	bin := cmdToRun(cmd)
+
+	createHeadersOnce(t)
+
+	runCC(t, "-o", cmd, "main3.c", "-ldl")
+
+	defer os.Remove(bin)
+
+	out := runExe(t, nil, bin, "./"+libgoname)
+	if strings.TrimSpace(out) != "PASS" {
+		t.Error(out)
+	}
+}
+
+func testSignalHandlers(t *testing.T, pkgname, cfile, cmd string) {
+	if GOOS == "windows" {
+		t.Skipf("Skipping on %s", GOOS)
+	}
+	globalSkip(t)
+	testenv.MustHaveGoBuild(t)
+	testenv.MustHaveCGO(t)
+	testenv.MustHaveBuildMode(t, "c-shared")
+
+	libname := pkgname + ".a"
+	run(t,
+		nil,
+		"go", "build",
+		"-buildmode=c-shared",
+		"-installsuffix", "testcshared",
+		"-o", libname, pkgname,
+	)
+	if GOOS != "freebsd" {
+		runCC(t, "-pthread", "-o", cmd, cfile, "-ldl")
+	} else {
+		runCC(t, "-pthread", "-o", cmd, cfile)
+	}
+
+	bin := cmdToRun(cmd)
+
+	defer os.Remove(libname)
+	defer os.Remove(bin)
+	defer os.Remove(pkgname + ".h")
+
+	out := runExe(t, nil, bin, "./"+libname)
+	if strings.TrimSpace(out) != "PASS" {
+		t.Error(run(t, nil, bin, libname, "verbose"))
+	}
+}
+
+// test4: test signal handlers
+func TestSignalHandlers(t *testing.T) {
+	t.Parallel()
+	testSignalHandlers(t, "./libgo4", "main4.c", "testp4")
+}
+
+// test5: test signal handlers with os/signal.Notify
+func TestSignalHandlersWithNotify(t *testing.T) {
+	t.Parallel()
+	testSignalHandlers(t, "./libgo5", "main5.c", "testp5")
+}
+
+func TestPIE(t *testing.T) {
+	switch GOOS {
+	case "linux", "android":
+		break
+	default:
+		t.Skipf("Skipping on %s", GOOS)
+	}
+	globalSkip(t)
+
+	t.Parallel()
+
+	createHeadersOnce(t)
+
+	f, err := elf.Open(libgoname)
+	if err != nil {
+		t.Fatalf("elf.Open failed: %v", err)
+	}
+	defer f.Close()
+
+	ds := f.SectionByType(elf.SHT_DYNAMIC)
+	if ds == nil {
+		t.Fatalf("no SHT_DYNAMIC section")
+	}
+	d, err := ds.Data()
+	if err != nil {
+		t.Fatalf("can't read SHT_DYNAMIC contents: %v", err)
+	}
+	for len(d) > 0 {
+		var tag elf.DynTag
+		switch f.Class {
+		case elf.ELFCLASS32:
+			tag = elf.DynTag(f.ByteOrder.Uint32(d[:4]))
+			d = d[8:]
+		case elf.ELFCLASS64:
+			tag = elf.DynTag(f.ByteOrder.Uint64(d[:8]))
+			d = d[16:]
+		}
+		if tag == elf.DT_TEXTREL {
+			t.Fatalf("%s has DT_TEXTREL flag", libgoname)
+		}
+	}
+}
+
+// Test that installing a second time recreates the header file.
+func TestCachedInstall(t *testing.T) {
+	globalSkip(t)
+	testenv.MustHaveGoBuild(t)
+	testenv.MustHaveCGO(t)
+	testenv.MustHaveBuildMode(t, "c-shared")
+
+	tmpdir, err := os.MkdirTemp("", "cshared")
+	if err != nil {
+		t.Fatal(err)
+	}
+	defer os.RemoveAll(tmpdir)
+
+	copyFile(t, filepath.Join(tmpdir, "src", "testcshared", "go.mod"), "go.mod")
+	copyFile(t, filepath.Join(tmpdir, "src", "testcshared", "libgo", "libgo.go"), filepath.Join("libgo", "libgo.go"))
+	copyFile(t, filepath.Join(tmpdir, "src", "testcshared", "p", "p.go"), filepath.Join("p", "p.go"))
+
+	buildcmd := []string{"go", "install", "-x", "-buildmode=c-shared", "-installsuffix", "testcshared", "./libgo"}
+
+	cmd := exec.Command(buildcmd[0], buildcmd[1:]...)
+	cmd.Dir = filepath.Join(tmpdir, "src", "testcshared")
+	env := append(cmd.Environ(),
+		"GOPATH="+tmpdir,
+		"GOBIN="+filepath.Join(tmpdir, "bin"),
+		"GO111MODULE=off", // 'go install' only works in GOPATH mode
+	)
+	cmd.Env = env
+	t.Log(buildcmd)
+	out, err := cmd.CombinedOutput()
+	t.Logf("%s", out)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	var libgoh, ph string
+
+	walker := func(path string, info os.FileInfo, err error) error {
+		if err != nil {
+			t.Fatal(err)
+		}
+		var ps *string
+		switch filepath.Base(path) {
+		case "libgo.h":
+			ps = &libgoh
+		case "p.h":
+			ps = &ph
+		}
+		if ps != nil {
+			if *ps != "" {
+				t.Fatalf("%s found again", *ps)
+			}
+			*ps = path
+		}
+		return nil
+	}
+
+	if err := filepath.Walk(tmpdir, walker); err != nil {
+		t.Fatal(err)
+	}
+
+	if libgoh == "" {
+		t.Fatal("libgo.h not installed")
+	}
+
+	if err := os.Remove(libgoh); err != nil {
+		t.Fatal(err)
+	}
+
+	cmd = exec.Command(buildcmd[0], buildcmd[1:]...)
+	cmd.Dir = filepath.Join(tmpdir, "src", "testcshared")
+	cmd.Env = env
+	t.Log(buildcmd)
+	out, err = cmd.CombinedOutput()
+	t.Logf("%s", out)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	if _, err := os.Stat(libgoh); err != nil {
+		t.Errorf("libgo.h not installed in second run: %v", err)
+	}
+}
+
+// copyFile copies src to dst.
+func copyFile(t *testing.T, dst, src string) {
+	t.Helper()
+	data, err := os.ReadFile(src)
+	if err != nil {
+		t.Fatal(err)
+	}
+	if err := os.MkdirAll(filepath.Dir(dst), 0777); err != nil {
+		t.Fatal(err)
+	}
+	if err := os.WriteFile(dst, data, 0666); err != nil {
+		t.Fatal(err)
+	}
+}
+
+func TestGo2C2Go(t *testing.T) {
+	switch GOOS {
+	case "darwin", "ios", "windows":
+		// Non-ELF shared libraries don't support the multiple
+		// copies of the runtime package implied by this test.
+		t.Skipf("linking c-shared into Go programs not supported on %s; issue 29061, 49457", GOOS)
+	case "android":
+		t.Skip("test fails on android; issue 29087")
+	}
+	globalSkip(t)
+	testenv.MustHaveGoBuild(t)
+	testenv.MustHaveCGO(t)
+	testenv.MustHaveBuildMode(t, "c-shared")
+
+	t.Parallel()
+
+	tmpdir, err := os.MkdirTemp("", "cshared-TestGo2C2Go")
+	if err != nil {
+		t.Fatal(err)
+	}
+	defer os.RemoveAll(tmpdir)
+
+	lib := filepath.Join(tmpdir, "libtestgo2c2go.a")
+	var env []string
+	if GOOS == "windows" && strings.HasSuffix(lib, ".a") {
+		env = append(env, "CGO_LDFLAGS=-Wl,--out-implib,"+lib, "CGO_LDFLAGS_ALLOW=.*")
+		lib = strings.TrimSuffix(lib, ".a") + ".dll"
+	}
+	run(t, env, "go", "build", "-buildmode=c-shared", "-o", lib, "./go2c2go/go")
+
+	cgoCflags := os.Getenv("CGO_CFLAGS")
+	if cgoCflags != "" {
+		cgoCflags += " "
+	}
+	cgoCflags += "-I" + tmpdir
+
+	cgoLdflags := os.Getenv("CGO_LDFLAGS")
+	if cgoLdflags != "" {
+		cgoLdflags += " "
+	}
+	cgoLdflags += "-L" + tmpdir + " -ltestgo2c2go"
+
+	goenv := []string{"CGO_CFLAGS=" + cgoCflags, "CGO_LDFLAGS=" + cgoLdflags}
+
+	ldLibPath := os.Getenv("LD_LIBRARY_PATH")
+	if ldLibPath != "" {
+		ldLibPath += ":"
+	}
+	ldLibPath += tmpdir
+
+	runenv := []string{"LD_LIBRARY_PATH=" + ldLibPath}
+
+	bin := filepath.Join(tmpdir, "m1") + exeSuffix
+	run(t, goenv, "go", "build", "-o", bin, "./go2c2go/m1")
+	runExe(t, runenv, bin)
+
+	bin = filepath.Join(tmpdir, "m2") + exeSuffix
+	run(t, goenv, "go", "build", "-o", bin, "./go2c2go/m2")
+	runExe(t, runenv, bin)
+}
+
+func TestIssue36233(t *testing.T) {
+	globalSkip(t)
+	testenv.MustHaveCGO(t)
+
+	t.Parallel()
+
+	// Test that the export header uses GoComplex64 and GoComplex128
+	// for complex types.
+
+	tmpdir, err := os.MkdirTemp("", "cshared-TestIssue36233")
+	if err != nil {
+		t.Fatal(err)
+	}
+	defer os.RemoveAll(tmpdir)
+
+	const exportHeader = "issue36233.h"
+
+	run(t, nil, "go", "tool", "cgo", "-exportheader", exportHeader, "-objdir", tmpdir, "./issue36233/issue36233.go")
+	data, err := os.ReadFile(exportHeader)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	funcs := []struct{ name, signature string }{
+		{"exportComplex64", "GoComplex64 exportComplex64(GoComplex64 v)"},
+		{"exportComplex128", "GoComplex128 exportComplex128(GoComplex128 v)"},
+		{"exportComplexfloat", "GoComplex64 exportComplexfloat(GoComplex64 v)"},
+		{"exportComplexdouble", "GoComplex128 exportComplexdouble(GoComplex128 v)"},
+	}
+
+	scanner := bufio.NewScanner(bytes.NewReader(data))
+	var found int
+	for scanner.Scan() {
+		b := scanner.Bytes()
+		for _, fn := range funcs {
+			if bytes.Contains(b, []byte(fn.name)) {
+				found++
+				if !bytes.Contains(b, []byte(fn.signature)) {
+					t.Errorf("function signature mismatch; got %q, want %q", b, fn.signature)
+				}
+			}
+		}
+	}
+	if err = scanner.Err(); err != nil {
+		t.Errorf("scanner encountered error: %v", err)
+	}
+	if found != len(funcs) {
+		t.Error("missing functions")
+	}
+}
diff --git a/misc/cgo/testcshared/testdata/go2c2go/go/shlib.go b/src/cmd/cgo/internal/testcshared/testdata/go2c2go/go/shlib.go
similarity index 100%
rename from misc/cgo/testcshared/testdata/go2c2go/go/shlib.go
rename to src/cmd/cgo/internal/testcshared/testdata/go2c2go/go/shlib.go
diff --git a/misc/cgo/testcshared/testdata/go2c2go/m1/c.c b/src/cmd/cgo/internal/testcshared/testdata/go2c2go/m1/c.c
similarity index 100%
rename from misc/cgo/testcshared/testdata/go2c2go/m1/c.c
rename to src/cmd/cgo/internal/testcshared/testdata/go2c2go/m1/c.c
diff --git a/misc/cgo/testcshared/testdata/go2c2go/m1/main.go b/src/cmd/cgo/internal/testcshared/testdata/go2c2go/m1/main.go
similarity index 100%
rename from misc/cgo/testcshared/testdata/go2c2go/m1/main.go
rename to src/cmd/cgo/internal/testcshared/testdata/go2c2go/m1/main.go
diff --git a/misc/cgo/testcshared/testdata/go2c2go/m2/main.go b/src/cmd/cgo/internal/testcshared/testdata/go2c2go/m2/main.go
similarity index 100%
rename from misc/cgo/testcshared/testdata/go2c2go/m2/main.go
rename to src/cmd/cgo/internal/testcshared/testdata/go2c2go/m2/main.go
diff --git a/src/cmd/cgo/internal/testcshared/testdata/issue36233/issue36233.go b/src/cmd/cgo/internal/testcshared/testdata/issue36233/issue36233.go
new file mode 100644
index 0000000..433bf5c
--- /dev/null
+++ b/src/cmd/cgo/internal/testcshared/testdata/issue36233/issue36233.go
@@ -0,0 +1,30 @@
+// Copyright 2022 The Go Authors. 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
+
+// #include <complex.h>
+import "C"
+
+//export exportComplex64
+func exportComplex64(v complex64) complex64 {
+	return v
+}
+
+//export exportComplex128
+func exportComplex128(v complex128) complex128 {
+	return v
+}
+
+//export exportComplexfloat
+func exportComplexfloat(v C.complexfloat) C.complexfloat {
+	return v
+}
+
+//export exportComplexdouble
+func exportComplexdouble(v C.complexdouble) C.complexdouble {
+	return v
+}
+
+func main() {}
diff --git a/misc/cgo/testcshared/testdata/libgo/libgo.go b/src/cmd/cgo/internal/testcshared/testdata/libgo/libgo.go
similarity index 100%
rename from misc/cgo/testcshared/testdata/libgo/libgo.go
rename to src/cmd/cgo/internal/testcshared/testdata/libgo/libgo.go
diff --git a/src/cmd/cgo/internal/testcshared/testdata/libgo2/dup2.go b/src/cmd/cgo/internal/testcshared/testdata/libgo2/dup2.go
new file mode 100644
index 0000000..d50e0c4
--- /dev/null
+++ b/src/cmd/cgo/internal/testcshared/testdata/libgo2/dup2.go
@@ -0,0 +1,13 @@
+// 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:build darwin || dragonfly || freebsd || (linux && !arm64 && !loong64 && !riscv64) || netbsd || openbsd
+
+package main
+
+import "syscall"
+
+func dup2(oldfd, newfd int) error {
+	return syscall.Dup2(oldfd, newfd)
+}
diff --git a/src/cmd/cgo/internal/testcshared/testdata/libgo2/dup3.go b/src/cmd/cgo/internal/testcshared/testdata/libgo2/dup3.go
new file mode 100644
index 0000000..ec4b5a7
--- /dev/null
+++ b/src/cmd/cgo/internal/testcshared/testdata/libgo2/dup3.go
@@ -0,0 +1,13 @@
+// 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:build (linux && arm64) || (linux && loong64) || (linux && riscv64)
+
+package main
+
+import "syscall"
+
+func dup2(oldfd, newfd int) error {
+	return syscall.Dup3(oldfd, newfd, 0)
+}
diff --git a/src/cmd/cgo/internal/testcshared/testdata/libgo2/libgo2.go b/src/cmd/cgo/internal/testcshared/testdata/libgo2/libgo2.go
new file mode 100644
index 0000000..5f6cfd0
--- /dev/null
+++ b/src/cmd/cgo/internal/testcshared/testdata/libgo2/libgo2.go
@@ -0,0 +1,52 @@
+// 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:build darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris
+
+package main
+
+// Test a shared library created by -buildmode=c-shared that does not
+// export anything.
+
+import (
+	"fmt"
+	"os"
+	"syscall"
+)
+
+// To test this we want to communicate between the main program and
+// the shared library without using any exported symbols.  The init
+// function creates a pipe and Dups the read end to a known number
+// that the C code can also use.
+
+const (
+	fd = 30
+)
+
+func init() {
+	var p [2]int
+	if e := syscall.Pipe(p[0:]); e != nil {
+		fmt.Fprintf(os.Stderr, "pipe: %v\n", e)
+		os.Exit(2)
+	}
+
+	if e := dup2(p[0], fd); e != nil {
+		fmt.Fprintf(os.Stderr, "dup2: %v\n", e)
+		os.Exit(2)
+	}
+
+	const str = "PASS"
+	if n, e := syscall.Write(p[1], []byte(str)); e != nil || n != len(str) {
+		fmt.Fprintf(os.Stderr, "write: %d %v\n", n, e)
+		os.Exit(2)
+	}
+
+	if e := syscall.Close(p[1]); e != nil {
+		fmt.Fprintf(os.Stderr, "close: %v\n", e)
+		os.Exit(2)
+	}
+}
+
+func main() {
+}
diff --git a/src/cmd/cgo/internal/testcshared/testdata/libgo4/libgo4.go b/src/cmd/cgo/internal/testcshared/testdata/libgo4/libgo4.go
new file mode 100644
index 0000000..9c30c85
--- /dev/null
+++ b/src/cmd/cgo/internal/testcshared/testdata/libgo4/libgo4.go
@@ -0,0 +1,47 @@
+// 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 "C"
+
+import (
+	"fmt"
+	"os"
+	"runtime"
+)
+
+// RunGoroutines starts some goroutines that don't do anything.
+// The idea is to get some threads going, so that a signal will be delivered
+// to a thread started by Go.
+//
+//export RunGoroutines
+func RunGoroutines() {
+	for i := 0; i < 4; i++ {
+		go func() {
+			runtime.LockOSThread()
+			select {}
+		}()
+	}
+}
+
+var P *byte
+
+// TestSEGV makes sure that an invalid address turns into a run-time Go panic.
+//
+//export TestSEGV
+func TestSEGV() {
+	defer func() {
+		if recover() == nil {
+			fmt.Fprintln(os.Stderr, "no panic from segv")
+			os.Exit(1)
+		}
+	}()
+	*P = 0
+	fmt.Fprintln(os.Stderr, "continued after segv")
+	os.Exit(1)
+}
+
+func main() {
+}
diff --git a/src/cmd/cgo/internal/testcshared/testdata/libgo5/libgo5.go b/src/cmd/cgo/internal/testcshared/testdata/libgo5/libgo5.go
new file mode 100644
index 0000000..4ca44e5
--- /dev/null
+++ b/src/cmd/cgo/internal/testcshared/testdata/libgo5/libgo5.go
@@ -0,0 +1,47 @@
+// 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 "C"
+
+import (
+	"os"
+	"os/signal"
+	"syscall"
+	"time"
+)
+
+// The channel used to read SIGIO signals.
+var sigioChan chan os.Signal
+
+// CatchSIGIO starts catching SIGIO signals.
+//
+//export CatchSIGIO
+func CatchSIGIO() {
+	sigioChan = make(chan os.Signal, 1)
+	signal.Notify(sigioChan, syscall.SIGIO)
+}
+
+// ResetSIGIO stops catching SIGIO signals.
+//
+//export ResetSIGIO
+func ResetSIGIO() {
+	signal.Reset(syscall.SIGIO)
+}
+
+// SawSIGIO returns whether we saw a SIGIO within a brief pause.
+//
+//export SawSIGIO
+func SawSIGIO() C.int {
+	select {
+	case <-sigioChan:
+		return 1
+	case <-time.After(100 * time.Millisecond):
+		return 0
+	}
+}
+
+func main() {
+}
diff --git a/misc/cgo/testcshared/testdata/main0.c b/src/cmd/cgo/internal/testcshared/testdata/main0.c
similarity index 100%
rename from misc/cgo/testcshared/testdata/main0.c
rename to src/cmd/cgo/internal/testcshared/testdata/main0.c
diff --git a/misc/cgo/testcshared/testdata/main1.c b/src/cmd/cgo/internal/testcshared/testdata/main1.c
similarity index 100%
rename from misc/cgo/testcshared/testdata/main1.c
rename to src/cmd/cgo/internal/testcshared/testdata/main1.c
diff --git a/misc/cgo/testcshared/testdata/main2.c b/src/cmd/cgo/internal/testcshared/testdata/main2.c
similarity index 100%
rename from misc/cgo/testcshared/testdata/main2.c
rename to src/cmd/cgo/internal/testcshared/testdata/main2.c
diff --git a/misc/cgo/testcshared/testdata/main3.c b/src/cmd/cgo/internal/testcshared/testdata/main3.c
similarity index 100%
rename from misc/cgo/testcshared/testdata/main3.c
rename to src/cmd/cgo/internal/testcshared/testdata/main3.c
diff --git a/src/cmd/cgo/internal/testcshared/testdata/main4.c b/src/cmd/cgo/internal/testcshared/testdata/main4.c
new file mode 100644
index 0000000..6c16364
--- /dev/null
+++ b/src/cmd/cgo/internal/testcshared/testdata/main4.c
@@ -0,0 +1,215 @@
+// 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 that a signal handler that uses up stack space does not crash
+// if the signal is delivered to a thread running a goroutine.
+// This is a lot like ../testcarchive/main2.c.
+
+#include <setjmp.h>
+#include <signal.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <sched.h>
+#include <time.h>
+#include <dlfcn.h>
+
+static void die(const char* msg) {
+	perror(msg);
+	exit(EXIT_FAILURE);
+}
+
+static volatile sig_atomic_t sigioSeen;
+
+// Use up some stack space.
+static void recur(int i, char *p) {
+	char a[1024];
+
+	*p = '\0';
+	if (i > 0) {
+		recur(i - 1, a);
+	}
+}
+
+// Signal handler that uses up more stack space than a goroutine will have.
+static void ioHandler(int signo, siginfo_t* info, void* ctxt) {
+	char a[1024];
+
+	recur(4, a);
+	sigioSeen = 1;
+}
+
+static jmp_buf jmp;
+static char* nullPointer;
+
+// Signal handler for SIGSEGV on a C thread.
+static void segvHandler(int signo, siginfo_t* info, void* ctxt) {
+	sigset_t mask;
+	int i;
+
+	if (sigemptyset(&mask) < 0) {
+		die("sigemptyset");
+	}
+	if (sigaddset(&mask, SIGSEGV) < 0) {
+		die("sigaddset");
+	}
+	i = sigprocmask(SIG_UNBLOCK, &mask, NULL);
+	if (i != 0) {
+		fprintf(stderr, "sigprocmask: %s\n", strerror(i));
+		exit(EXIT_FAILURE);
+	}
+
+	// Don't try this at home.
+	longjmp(jmp, signo);
+
+	// We should never get here.
+	abort();
+}
+
+int main(int argc, char** argv) {
+	int verbose;
+	struct sigaction sa;
+	void* handle;
+	void (*fn)(void);
+	sigset_t mask;
+	int i;
+	struct timespec ts;
+
+	verbose = argc > 2;
+	setvbuf(stdout, NULL, _IONBF, 0);
+
+	// Call setsid so that we can use kill(0, SIGIO) below.
+	// Don't check the return value so that this works both from
+	// a job control shell and from a shell script.
+	setsid();
+
+	if (verbose) {
+		printf("calling sigaction\n");
+	}
+
+	memset(&sa, 0, sizeof sa);
+	sa.sa_sigaction = ioHandler;
+	if (sigemptyset(&sa.sa_mask) < 0) {
+		die("sigemptyset");
+	}
+	sa.sa_flags = SA_SIGINFO;
+	if (sigaction(SIGIO, &sa, NULL) < 0) {
+		die("sigaction");
+	}
+
+	sa.sa_sigaction = segvHandler;
+	if (sigaction(SIGSEGV, &sa, NULL) < 0 || sigaction(SIGBUS, &sa, NULL) < 0) {
+		die("sigaction");
+	}
+
+	if (verbose) {
+		printf("calling dlopen\n");
+	}
+
+	handle = dlopen(argv[1], RTLD_NOW | RTLD_GLOBAL);
+	if (handle == NULL) {
+		fprintf(stderr, "%s\n", dlerror());
+		exit(EXIT_FAILURE);
+	}
+
+	if (verbose) {
+		printf("calling dlsym\n");
+	}
+
+	// Start some goroutines.
+	fn = (void(*)(void))dlsym(handle, "RunGoroutines");
+	if (fn == NULL) {
+		fprintf(stderr, "%s\n", dlerror());
+		exit(EXIT_FAILURE);
+	}
+
+	if (verbose) {
+		printf("calling RunGoroutines\n");
+	}
+
+	fn();
+
+	// Block SIGIO in this thread to make it more likely that it
+	// will be delivered to a goroutine.
+
+	if (verbose) {
+		printf("calling pthread_sigmask\n");
+	}
+
+	if (sigemptyset(&mask) < 0) {
+		die("sigemptyset");
+	}
+	if (sigaddset(&mask, SIGIO) < 0) {
+		die("sigaddset");
+	}
+	i = pthread_sigmask(SIG_BLOCK, &mask, NULL);
+	if (i != 0) {
+		fprintf(stderr, "pthread_sigmask: %s\n", strerror(i));
+		exit(EXIT_FAILURE);
+	}
+
+	if (verbose) {
+		printf("calling kill\n");
+	}
+
+	if (kill(0, SIGIO) < 0) {
+		die("kill");
+	}
+
+	if (verbose) {
+		printf("waiting for sigioSeen\n");
+	}
+
+	// Wait until the signal has been delivered.
+	i = 0;
+	while (!sigioSeen) {
+		ts.tv_sec = 0;
+		ts.tv_nsec = 1000000;
+		nanosleep(&ts, NULL);
+		i++;
+		if (i > 5000) {
+			fprintf(stderr, "looping too long waiting for signal\n");
+			exit(EXIT_FAILURE);
+		}
+	}
+
+	if (verbose) {
+		printf("calling setjmp\n");
+	}
+
+	// Test that a SIGSEGV on this thread is delivered to us.
+	if (setjmp(jmp) == 0) {
+		if (verbose) {
+			printf("triggering SIGSEGV\n");
+		}
+
+		*nullPointer = '\0';
+
+		fprintf(stderr, "continued after address error\n");
+		exit(EXIT_FAILURE);
+	}
+
+	if (verbose) {
+		printf("calling dlsym\n");
+	}
+
+	// Make sure that a SIGSEGV in Go causes a run-time panic.
+	fn = (void (*)(void))dlsym(handle, "TestSEGV");
+	if (fn == NULL) {
+		fprintf(stderr, "%s\n", dlerror());
+		exit(EXIT_FAILURE);
+	}
+
+	if (verbose) {
+		printf("calling TestSEGV\n");
+	}
+
+	fn();
+
+	printf("PASS\n");
+	return 0;
+}
diff --git a/src/cmd/cgo/internal/testcshared/testdata/main5.c b/src/cmd/cgo/internal/testcshared/testdata/main5.c
new file mode 100644
index 0000000..e7bebab
--- /dev/null
+++ b/src/cmd/cgo/internal/testcshared/testdata/main5.c
@@ -0,0 +1,199 @@
+// 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 that a signal handler works in non-Go code when using
+// os/signal.Notify.
+// This is a lot like ../testcarchive/main3.c.
+
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <sched.h>
+#include <dlfcn.h>
+
+static void die(const char* msg) {
+	perror(msg);
+	exit(EXIT_FAILURE);
+}
+
+static volatile sig_atomic_t sigioSeen;
+
+static void ioHandler(int signo, siginfo_t* info, void* ctxt) {
+	sigioSeen = 1;
+}
+
+int main(int argc, char** argv) {
+	int verbose;
+	struct sigaction sa;
+	void* handle;
+	void (*fn1)(void);
+	int (*sawSIGIO)(void);
+	int i;
+	struct timespec ts;
+
+	verbose = argc > 2;
+	setvbuf(stdout, NULL, _IONBF, 0);
+
+	if (verbose) {
+		printf("calling sigaction\n");
+	}
+
+	memset(&sa, 0, sizeof sa);
+	sa.sa_sigaction = ioHandler;
+	if (sigemptyset(&sa.sa_mask) < 0) {
+		die("sigemptyset");
+	}
+	sa.sa_flags = SA_SIGINFO;
+	if (sigaction(SIGIO, &sa, NULL) < 0) {
+		die("sigaction");
+	}
+
+	if (verbose) {
+		printf("calling dlopen\n");
+	}
+
+	handle = dlopen(argv[1], RTLD_NOW | RTLD_GLOBAL);
+	if (handle == NULL) {
+		fprintf(stderr, "%s\n", dlerror());
+		exit(EXIT_FAILURE);
+	}
+
+	// At this point there should not be a Go signal handler
+	// installed for SIGIO.
+
+	if (verbose) {
+		printf("raising SIGIO\n");
+	}
+
+	if (raise(SIGIO) < 0) {
+		die("raise");
+	}
+
+	if (verbose) {
+		printf("waiting for sigioSeen\n");
+	}
+
+	// Wait until the signal has been delivered.
+	i = 0;
+	while (!sigioSeen) {
+		ts.tv_sec = 0;
+		ts.tv_nsec = 1000000;
+		nanosleep(&ts, NULL);
+		i++;
+		if (i > 5000) {
+			fprintf(stderr, "looping too long waiting for signal\n");
+			exit(EXIT_FAILURE);
+		}
+	}
+
+	sigioSeen = 0;
+
+	// Tell the Go code to catch SIGIO.
+
+	if (verbose) {
+		printf("calling dlsym\n");
+	}
+
+	fn1 = (void(*)(void))dlsym(handle, "CatchSIGIO");
+	if (fn1 == NULL) {
+		fprintf(stderr, "%s\n", dlerror());
+		exit(EXIT_FAILURE);
+	}
+
+	if (verbose) {
+		printf("calling CatchSIGIO\n");
+	}
+
+	fn1();
+
+	if (verbose) {
+		printf("raising SIGIO\n");
+	}
+
+	if (raise(SIGIO) < 0) {
+		die("raise");
+	}
+
+	if (verbose) {
+		printf("calling dlsym\n");
+	}
+
+	// Check that the Go code saw SIGIO.
+	sawSIGIO = (int (*)(void))dlsym(handle, "SawSIGIO");
+	if (sawSIGIO == NULL) {
+		fprintf(stderr, "%s\n", dlerror());
+		exit(EXIT_FAILURE);
+	}
+
+	if (verbose) {
+		printf("calling SawSIGIO\n");
+	}
+
+	if (!sawSIGIO()) {
+		fprintf(stderr, "Go handler did not see SIGIO\n");
+		exit(EXIT_FAILURE);
+	}
+
+	if (sigioSeen != 0) {
+		fprintf(stderr, "C handler saw SIGIO when only Go handler should have\n");
+		exit(EXIT_FAILURE);
+	}
+
+	// Tell the Go code to stop catching SIGIO.
+
+	if (verbose) {
+		printf("calling dlsym\n");
+	}
+
+	fn1 = (void(*)(void))dlsym(handle, "ResetSIGIO");
+	if (fn1 == NULL) {
+		fprintf(stderr, "%s\n", dlerror());
+		exit(EXIT_FAILURE);
+	}
+
+	if (verbose) {
+		printf("calling ResetSIGIO\n");
+	}
+
+	fn1();
+
+	if (verbose) {
+		printf("raising SIGIO\n");
+	}
+
+	if (raise(SIGIO) < 0) {
+		die("raise");
+	}
+
+	if (verbose) {
+		printf("calling SawSIGIO\n");
+	}
+
+	if (sawSIGIO()) {
+		fprintf(stderr, "Go handler saw SIGIO after Reset\n");
+		exit(EXIT_FAILURE);
+	}
+
+	if (verbose) {
+		printf("waiting for sigioSeen\n");
+	}
+
+	// Wait until the signal has been delivered.
+	i = 0;
+	while (!sigioSeen) {
+		ts.tv_sec = 0;
+		ts.tv_nsec = 1000000;
+		nanosleep(&ts, NULL);
+		i++;
+		if (i > 5000) {
+			fprintf(stderr, "looping too long waiting for signal\n");
+			exit(EXIT_FAILURE);
+		}
+	}
+
+	printf("PASS\n");
+	return 0;
+}
diff --git a/misc/cgo/testcshared/testdata/p/p.go b/src/cmd/cgo/internal/testcshared/testdata/p/p.go
similarity index 100%
rename from misc/cgo/testcshared/testdata/p/p.go
rename to src/cmd/cgo/internal/testcshared/testdata/p/p.go
diff --git a/src/cmd/cgo/internal/testerrors/argposition_test.go b/src/cmd/cgo/internal/testerrors/argposition_test.go
new file mode 100644
index 0000000..0876dc4
--- /dev/null
+++ b/src/cmd/cgo/internal/testerrors/argposition_test.go
@@ -0,0 +1,137 @@
+// Copyright 2021 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Issue 42580: cmd/cgo: shifting identifier position in ast
+
+package errorstest
+
+import (
+	"bytes"
+	"fmt"
+	"go/ast"
+	"go/parser"
+	"go/token"
+	"internal/testenv"
+	"os"
+	"os/exec"
+	"path/filepath"
+	"strings"
+	"testing"
+)
+
+type ShortPosition struct {
+	Line    int
+	Column  int
+	Visited bool
+}
+
+type IdentPositionInfo map[string][]ShortPosition
+
+type Visitor struct {
+	identPosInfo IdentPositionInfo
+	fset         *token.FileSet
+	t            *testing.T
+}
+
+func (v *Visitor) Visit(node ast.Node) ast.Visitor {
+	if ident, ok := node.(*ast.Ident); ok {
+		if expectedPositions, ok := v.identPosInfo[ident.Name]; ok {
+			gotMatch := false
+			var errorMessage strings.Builder
+			for caseIndex, expectedPos := range expectedPositions {
+				actualPosition := v.fset.PositionFor(ident.Pos(), true)
+				errorOccured := false
+				if expectedPos.Line != actualPosition.Line {
+					fmt.Fprintf(&errorMessage, "wrong line number for ident %s: expected: %d got: %d\n", ident.Name, expectedPos.Line, actualPosition.Line)
+					errorOccured = true
+				}
+				if expectedPos.Column != actualPosition.Column {
+					fmt.Fprintf(&errorMessage, "wrong column number for ident %s: expected: %d got: %d\n", ident.Name, expectedPos.Column, actualPosition.Column)
+					errorOccured = true
+				}
+				if errorOccured {
+					continue
+				}
+				gotMatch = true
+				expectedPositions[caseIndex].Visited = true
+			}
+
+			if !gotMatch {
+				v.t.Errorf(errorMessage.String())
+			}
+		}
+	}
+	return v
+}
+
+func TestArgumentsPositions(t *testing.T) {
+	testenv.MustHaveCGO(t)
+	testenv.MustHaveExec(t)
+
+	testdata, err := filepath.Abs("testdata")
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	tmpPath := t.TempDir()
+
+	dir := filepath.Join(tmpPath, "src", "testpositions")
+	if err := os.MkdirAll(dir, 0755); err != nil {
+		t.Fatal(err)
+	}
+
+	cmd := exec.Command("go", "tool", "cgo",
+		"-srcdir", testdata,
+		"-objdir", dir,
+		"issue42580.go")
+	cmd.Stderr = new(bytes.Buffer)
+
+	err = cmd.Run()
+	if err != nil {
+		t.Fatalf("%s: %v\n%s", cmd, err, cmd.Stderr)
+	}
+	mainProcessed, err := os.ReadFile(filepath.Join(dir, "issue42580.cgo1.go"))
+	if err != nil {
+		t.Fatal(err)
+	}
+	fset := token.NewFileSet()
+	f, err := parser.ParseFile(fset, "", mainProcessed, parser.AllErrors)
+	if err != nil {
+		fmt.Println(err)
+		return
+	}
+
+	expectation := IdentPositionInfo{
+		"checkedPointer": []ShortPosition{
+			ShortPosition{
+				Line:   32,
+				Column: 56,
+			},
+		},
+		"singleInnerPointerChecked": []ShortPosition{
+			ShortPosition{
+				Line:   37,
+				Column: 91,
+			},
+		},
+		"doublePointerChecked": []ShortPosition{
+			ShortPosition{
+				Line:   42,
+				Column: 91,
+			},
+		},
+	}
+	for _, decl := range f.Decls {
+		if fdecl, ok := decl.(*ast.FuncDecl); ok {
+			ast.Walk(&Visitor{expectation, fset, t}, fdecl.Body)
+		}
+	}
+	for ident, positions := range expectation {
+		for _, position := range positions {
+			if !position.Visited {
+				t.Errorf("Position %d:%d missed for %s ident", position.Line, position.Column, ident)
+			}
+		}
+	}
+}
diff --git a/src/cmd/cgo/internal/testerrors/badsym_test.go b/src/cmd/cgo/internal/testerrors/badsym_test.go
new file mode 100644
index 0000000..6c87977
--- /dev/null
+++ b/src/cmd/cgo/internal/testerrors/badsym_test.go
@@ -0,0 +1,231 @@
+// Copyright 2020 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package errorstest
+
+import (
+	"bytes"
+	"cmd/internal/quoted"
+	"internal/testenv"
+	"os"
+	"os/exec"
+	"path/filepath"
+	"strings"
+	"testing"
+	"unicode"
+)
+
+// A manually modified object file could pass unexpected characters
+// into the files generated by cgo.
+
+const magicInput = "abcdefghijklmnopqrstuvwxyz0123"
+const magicReplace = "\n//go:cgo_ldflag \"-badflag\"\n//"
+
+const cSymbol = "BadSymbol" + magicInput + "Name"
+const cDefSource = "int " + cSymbol + " = 1;"
+const cRefSource = "extern int " + cSymbol + "; int F() { return " + cSymbol + "; }"
+
+// goSource is the source code for the trivial Go file we use.
+// We will replace TMPDIR with the temporary directory name.
+const goSource = `
+package main
+
+// #cgo LDFLAGS: TMPDIR/cbad.o TMPDIR/cbad.so
+// extern int F();
+import "C"
+
+func main() {
+	println(C.F())
+}
+`
+
+func TestBadSymbol(t *testing.T) {
+	testenv.MustHaveGoBuild(t)
+	testenv.MustHaveCGO(t)
+
+	dir := t.TempDir()
+
+	mkdir := func(base string) string {
+		ret := filepath.Join(dir, base)
+		if err := os.Mkdir(ret, 0755); err != nil {
+			t.Fatal(err)
+		}
+		return ret
+	}
+
+	cdir := mkdir("c")
+	godir := mkdir("go")
+
+	makeFile := func(mdir, base, source string) string {
+		ret := filepath.Join(mdir, base)
+		if err := os.WriteFile(ret, []byte(source), 0644); err != nil {
+			t.Fatal(err)
+		}
+		return ret
+	}
+
+	cDefFile := makeFile(cdir, "cdef.c", cDefSource)
+	cRefFile := makeFile(cdir, "cref.c", cRefSource)
+
+	ccCmd := cCompilerCmd(t)
+
+	cCompile := func(arg, base, src string) string {
+		out := filepath.Join(cdir, base)
+		run := append(ccCmd, arg, "-o", out, src)
+		output, err := exec.Command(run[0], run[1:]...).CombinedOutput()
+		if err != nil {
+			t.Log(run)
+			t.Logf("%s", output)
+			t.Fatal(err)
+		}
+		if err := os.Remove(src); err != nil {
+			t.Fatal(err)
+		}
+		return out
+	}
+
+	// Build a shared library that defines a symbol whose name
+	// contains magicInput.
+
+	cShared := cCompile("-shared", "c.so", cDefFile)
+
+	// Build an object file that refers to the symbol whose name
+	// contains magicInput.
+
+	cObj := cCompile("-c", "c.o", cRefFile)
+
+	// Rewrite the shared library and the object file, replacing
+	// magicInput with magicReplace. This will have the effect of
+	// introducing a symbol whose name looks like a cgo command.
+	// The cgo tool will use that name when it generates the
+	// _cgo_import.go file, thus smuggling a magic //go:cgo_ldflag
+	// pragma into a Go file. We used to not check the pragmas in
+	// _cgo_import.go.
+
+	rewrite := func(from, to string) {
+		obj, err := os.ReadFile(from)
+		if err != nil {
+			t.Fatal(err)
+		}
+
+		if bytes.Count(obj, []byte(magicInput)) == 0 {
+			t.Fatalf("%s: did not find magic string", from)
+		}
+
+		if len(magicInput) != len(magicReplace) {
+			t.Fatalf("internal test error: different magic lengths: %d != %d", len(magicInput), len(magicReplace))
+		}
+
+		obj = bytes.ReplaceAll(obj, []byte(magicInput), []byte(magicReplace))
+
+		if err := os.WriteFile(to, obj, 0644); err != nil {
+			t.Fatal(err)
+		}
+	}
+
+	cBadShared := filepath.Join(godir, "cbad.so")
+	rewrite(cShared, cBadShared)
+
+	cBadObj := filepath.Join(godir, "cbad.o")
+	rewrite(cObj, cBadObj)
+
+	goSourceBadObject := strings.ReplaceAll(goSource, "TMPDIR", godir)
+	makeFile(godir, "go.go", goSourceBadObject)
+
+	makeFile(godir, "go.mod", "module badsym")
+
+	// Try to build our little package.
+	cmd := exec.Command("go", "build", "-ldflags=-v")
+	cmd.Dir = godir
+	output, err := cmd.CombinedOutput()
+
+	// The build should fail, but we want it to fail because we
+	// detected the error, not because we passed a bad flag to the
+	// C linker.
+
+	if err == nil {
+		t.Errorf("go build succeeded unexpectedly")
+	}
+
+	t.Logf("%s", output)
+
+	for _, line := range bytes.Split(output, []byte("\n")) {
+		if bytes.Contains(line, []byte("dynamic symbol")) && bytes.Contains(line, []byte("contains unsupported character")) {
+			// This is the error from cgo.
+			continue
+		}
+
+		// We passed -ldflags=-v to see the external linker invocation,
+		// which should not include -badflag.
+		if bytes.Contains(line, []byte("-badflag")) {
+			t.Error("output should not mention -badflag")
+		}
+
+		// Also check for compiler errors, just in case.
+		// GCC says "unrecognized command line option".
+		// clang says "unknown argument".
+		if bytes.Contains(line, []byte("unrecognized")) || bytes.Contains(output, []byte("unknown")) {
+			t.Error("problem should have been caught before invoking C linker")
+		}
+	}
+}
+
+func cCompilerCmd(t *testing.T) []string {
+	cc, err := quoted.Split(goEnv(t, "CC"))
+	if err != nil {
+		t.Skipf("parsing go env CC: %s", err)
+	}
+	if len(cc) == 0 {
+		t.Skipf("no C compiler")
+	}
+	testenv.MustHaveExecPath(t, cc[0])
+
+	out := goEnv(t, "GOGCCFLAGS")
+	quote := '\000'
+	start := 0
+	lastSpace := true
+	backslash := false
+	s := string(out)
+	for i, c := range s {
+		if quote == '\000' && unicode.IsSpace(c) {
+			if !lastSpace {
+				cc = append(cc, s[start:i])
+				lastSpace = true
+			}
+		} else {
+			if lastSpace {
+				start = i
+				lastSpace = false
+			}
+			if quote == '\000' && !backslash && (c == '"' || c == '\'') {
+				quote = c
+				backslash = false
+			} else if !backslash && quote == c {
+				quote = '\000'
+			} else if (quote == '\000' || quote == '"') && !backslash && c == '\\' {
+				backslash = true
+			} else {
+				backslash = false
+			}
+		}
+	}
+	if !lastSpace {
+		cc = append(cc, s[start:])
+	}
+
+	// Force reallocation (and avoid aliasing bugs) for tests that append to cc.
+	cc = cc[:len(cc):len(cc)]
+
+	return cc
+}
+
+func goEnv(t *testing.T, key string) string {
+	out, err := exec.Command("go", "env", key).CombinedOutput()
+	if err != nil {
+		t.Logf("go env %s\n", key)
+		t.Logf("%s", out)
+		t.Fatal(err)
+	}
+	return strings.TrimSpace(string(out))
+}
diff --git a/src/cmd/cgo/internal/testerrors/errors_test.go b/src/cmd/cgo/internal/testerrors/errors_test.go
new file mode 100644
index 0000000..870d05b
--- /dev/null
+++ b/src/cmd/cgo/internal/testerrors/errors_test.go
@@ -0,0 +1,168 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package errorstest
+
+import (
+	"bytes"
+	"fmt"
+	"internal/testenv"
+	"os"
+	"os/exec"
+	"path/filepath"
+	"regexp"
+	"strconv"
+	"strings"
+	"testing"
+)
+
+func path(file string) string {
+	return filepath.Join("testdata", file)
+}
+
+func check(t *testing.T, file string) {
+	t.Run(file, func(t *testing.T) {
+		testenv.MustHaveGoBuild(t)
+		testenv.MustHaveCGO(t)
+		t.Parallel()
+
+		contents, err := os.ReadFile(path(file))
+		if err != nil {
+			t.Fatal(err)
+		}
+		var errors []*regexp.Regexp
+		for i, line := range bytes.Split(contents, []byte("\n")) {
+			if bytes.HasSuffix(line, []byte("ERROR HERE")) {
+				re := regexp.MustCompile(regexp.QuoteMeta(fmt.Sprintf("%s:%d:", file, i+1)))
+				errors = append(errors, re)
+				continue
+			}
+
+			_, frag, ok := bytes.Cut(line, []byte("ERROR HERE: "))
+			if !ok {
+				continue
+			}
+			re, err := regexp.Compile(fmt.Sprintf(":%d:.*%s", i+1, frag))
+			if err != nil {
+				t.Errorf("Invalid regexp after `ERROR HERE: `: %#q", frag)
+				continue
+			}
+			errors = append(errors, re)
+		}
+		if len(errors) == 0 {
+			t.Fatalf("cannot find ERROR HERE")
+		}
+		expect(t, file, errors)
+	})
+}
+
+func expect(t *testing.T, file string, errors []*regexp.Regexp) {
+	dir, err := os.MkdirTemp("", filepath.Base(t.Name()))
+	if err != nil {
+		t.Fatal(err)
+	}
+	defer os.RemoveAll(dir)
+
+	dst := filepath.Join(dir, strings.TrimSuffix(file, ".go"))
+	cmd := exec.Command("go", "build", "-gcflags=-L -e", "-o="+dst, path(file)) // TODO(gri) no need for -gcflags=-L if go tool is adjusted
+	out, err := cmd.CombinedOutput()
+	if err == nil {
+		t.Errorf("expected cgo to fail but it succeeded")
+	}
+
+	lines := bytes.Split(out, []byte("\n"))
+	for _, re := range errors {
+		found := false
+		for _, line := range lines {
+			if re.Match(line) {
+				t.Logf("found match for %#q: %q", re, line)
+				found = true
+				break
+			}
+		}
+		if !found {
+			t.Errorf("expected error output to contain %#q", re)
+		}
+	}
+
+	if t.Failed() {
+		t.Logf("actual output:\n%s", out)
+	}
+}
+
+func sizeofLongDouble(t *testing.T) int {
+	testenv.MustHaveGoRun(t)
+	testenv.MustHaveCGO(t)
+	cmd := exec.Command("go", "run", path("long_double_size.go"))
+	out, err := cmd.CombinedOutput()
+	if err != nil {
+		t.Fatalf("%#q: %v:\n%s", strings.Join(cmd.Args, " "), err, out)
+	}
+
+	i, err := strconv.Atoi(strings.TrimSpace(string(out)))
+	if err != nil {
+		t.Fatalf("long_double_size.go printed invalid size: %s", out)
+	}
+	return i
+}
+
+func TestReportsTypeErrors(t *testing.T) {
+	for _, file := range []string{
+		"err1.go",
+		"err2.go",
+		"err5.go",
+		"issue11097a.go",
+		"issue11097b.go",
+		"issue18452.go",
+		"issue18889.go",
+		"issue28721.go",
+		"issue33061.go",
+		"issue50710.go",
+	} {
+		check(t, file)
+	}
+
+	if sizeofLongDouble(t) > 8 {
+		for _, file := range []string{
+			"err4.go",
+			"issue28069.go",
+		} {
+			check(t, file)
+		}
+	}
+}
+
+func TestToleratesOptimizationFlag(t *testing.T) {
+	for _, cflags := range []string{
+		"",
+		"-O",
+	} {
+		cflags := cflags
+		t.Run(cflags, func(t *testing.T) {
+			testenv.MustHaveGoBuild(t)
+			testenv.MustHaveCGO(t)
+			t.Parallel()
+
+			cmd := exec.Command("go", "build", path("issue14669.go"))
+			cmd.Env = append(os.Environ(), "CGO_CFLAGS="+cflags)
+			out, err := cmd.CombinedOutput()
+			if err != nil {
+				t.Errorf("%#q: %v:\n%s", strings.Join(cmd.Args, " "), err, out)
+			}
+		})
+	}
+}
+
+func TestMallocCrashesOnNil(t *testing.T) {
+	testenv.MustHaveCGO(t)
+	testenv.MustHaveGoRun(t)
+	t.Parallel()
+
+	cmd := exec.Command("go", "run", path("malloc.go"))
+	out, err := cmd.CombinedOutput()
+	if err == nil {
+		t.Logf("%#q:\n%s", strings.Join(cmd.Args, " "), out)
+		t.Fatalf("succeeded unexpectedly")
+	}
+}
diff --git a/src/cmd/cgo/internal/testerrors/ptr_test.go b/src/cmd/cgo/internal/testerrors/ptr_test.go
new file mode 100644
index 0000000..7f56501
--- /dev/null
+++ b/src/cmd/cgo/internal/testerrors/ptr_test.go
@@ -0,0 +1,706 @@
+// 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 that cgo detects invalid pointer passing at runtime.
+
+package errorstest
+
+import (
+	"bytes"
+	"flag"
+	"fmt"
+	"internal/testenv"
+	"os"
+	"os/exec"
+	"path/filepath"
+	"runtime"
+	"slices"
+	"strings"
+	"sync/atomic"
+	"testing"
+)
+
+var tmp = flag.String("tmp", "", "use `dir` for temporary files and do not clean up")
+
+// ptrTest is the tests without the boilerplate.
+type ptrTest struct {
+	name      string   // for reporting
+	c         string   // the cgo comment
+	c1        string   // cgo comment forced into non-export cgo file
+	imports   []string // a list of imports
+	support   string   // supporting functions
+	body      string   // the body of the main function
+	extra     []extra  // extra files
+	fail      bool     // whether the test should fail
+	expensive bool     // whether the test requires the expensive check
+}
+
+type extra struct {
+	name     string
+	contents string
+}
+
+var ptrTests = []ptrTest{
+	{
+		// Passing a pointer to a struct that contains a Go pointer.
+		name: "ptr1",
+		c:    `typedef struct s1 { int *p; } s1; void f1(s1 *ps) {}`,
+		body: `C.f1(&C.s1{new(C.int)})`,
+		fail: true,
+	},
+	{
+		// Passing a pointer to a struct that contains a Go pointer.
+		name: "ptr2",
+		c:    `typedef struct s2 { int *p; } s2; void f2(s2 *ps) {}`,
+		body: `p := &C.s2{new(C.int)}; C.f2(p)`,
+		fail: true,
+	},
+	{
+		// Passing a pointer to an int field of a Go struct
+		// that (irrelevantly) contains a Go pointer.
+		name: "ok1",
+		c:    `struct s3 { int i; int *p; }; void f3(int *p) {}`,
+		body: `p := &C.struct_s3{i: 0, p: new(C.int)}; C.f3(&p.i)`,
+		fail: false,
+	},
+	{
+		// Passing a pointer to a pointer field of a Go struct.
+		name: "ptrfield",
+		c:    `struct s4 { int i; int *p; }; void f4(int **p) {}`,
+		body: `p := &C.struct_s4{i: 0, p: new(C.int)}; C.f4(&p.p)`,
+		fail: true,
+	},
+	{
+		// Passing a pointer to a pointer field of a Go
+		// struct, where the field does not contain a Go
+		// pointer, but another field (irrelevantly) does.
+		name: "ptrfieldok",
+		c:    `struct s5 { int *p1; int *p2; }; void f5(int **p) {}`,
+		body: `p := &C.struct_s5{p1: nil, p2: new(C.int)}; C.f5(&p.p1)`,
+		fail: false,
+	},
+	{
+		// Passing the address of a slice with no Go pointers.
+		name:    "sliceok1",
+		c:       `void f6(void **p) {}`,
+		imports: []string{"unsafe"},
+		body:    `s := []unsafe.Pointer{nil}; C.f6(&s[0])`,
+		fail:    false,
+	},
+	{
+		// Passing the address of a slice with a Go pointer.
+		name:    "sliceptr1",
+		c:       `void f7(void **p) {}`,
+		imports: []string{"unsafe"},
+		body:    `i := 0; s := []unsafe.Pointer{unsafe.Pointer(&i)}; C.f7(&s[0])`,
+		fail:    true,
+	},
+	{
+		// Passing the address of a slice with a Go pointer,
+		// where we are passing the address of an element that
+		// is not a Go pointer.
+		name:    "sliceptr2",
+		c:       `void f8(void **p) {}`,
+		imports: []string{"unsafe"},
+		body:    `i := 0; s := []unsafe.Pointer{nil, unsafe.Pointer(&i)}; C.f8(&s[0])`,
+		fail:    true,
+	},
+	{
+		// Passing the address of a slice that is an element
+		// in a struct only looks at the slice.
+		name:    "sliceok2",
+		c:       `void f9(void **p) {}`,
+		imports: []string{"unsafe"},
+		support: `type S9 struct { p *int; s []unsafe.Pointer }`,
+		body:    `i := 0; p := &S9{p:&i, s:[]unsafe.Pointer{nil}}; C.f9(&p.s[0])`,
+		fail:    false,
+	},
+	{
+		// Passing the address of a slice of an array that is
+		// an element in a struct, with a type conversion.
+		name:    "sliceok3",
+		c:       `void f10(void* p) {}`,
+		imports: []string{"unsafe"},
+		support: `type S10 struct { p *int; a [4]byte }`,
+		body:    `i := 0; p := &S10{p:&i}; s := p.a[:]; C.f10(unsafe.Pointer(&s[0]))`,
+		fail:    false,
+	},
+	{
+		// Passing the address of a slice of an array that is
+		// an element in a struct, with a type conversion.
+		name:    "sliceok4",
+		c:       `typedef void* PV11; void f11(PV11 p) {}`,
+		imports: []string{"unsafe"},
+		support: `type S11 struct { p *int; a [4]byte }`,
+		body:    `i := 0; p := &S11{p:&i}; C.f11(C.PV11(unsafe.Pointer(&p.a[0])))`,
+		fail:    false,
+	},
+	{
+		// Passing the address of a static variable with no
+		// pointers doesn't matter.
+		name:    "varok",
+		c:       `void f12(char** parg) {}`,
+		support: `var hello12 = [...]C.char{'h', 'e', 'l', 'l', 'o'}`,
+		body:    `parg := [1]*C.char{&hello12[0]}; C.f12(&parg[0])`,
+		fail:    false,
+	},
+	{
+		// Passing the address of a static variable with
+		// pointers does matter.
+		name:    "var1",
+		c:       `void f13(char*** parg) {}`,
+		support: `var hello13 = [...]*C.char{new(C.char)}`,
+		body:    `parg := [1]**C.char{&hello13[0]}; C.f13(&parg[0])`,
+		fail:    true,
+	},
+	{
+		// Storing a Go pointer into C memory should fail.
+		name: "barrier",
+		c: `#include <stdlib.h>
+		    char **f14a() { return malloc(sizeof(char*)); }
+		    void f14b(char **p) {}`,
+		body:      `p := C.f14a(); *p = new(C.char); C.f14b(p)`,
+		fail:      true,
+		expensive: true,
+	},
+	{
+		// Storing a pinned Go pointer into C memory should succeed.
+		name: "barrierpinnedok",
+		c: `#include <stdlib.h>
+		    char **f14a2() { return malloc(sizeof(char*)); }
+		    void f14b2(char **p) {}`,
+		imports:   []string{"runtime"},
+		body:      `var pinr runtime.Pinner; p := C.f14a2(); x := new(C.char); pinr.Pin(x); *p = x; C.f14b2(p); pinr.Unpin()`,
+		fail:      false,
+		expensive: true,
+	},
+	{
+		// Storing a Go pointer into C memory by assigning a
+		// large value should fail.
+		name: "barrierstruct",
+		c: `#include <stdlib.h>
+		    struct s15 { char *a[10]; };
+		    struct s15 *f15() { return malloc(sizeof(struct s15)); }
+		    void f15b(struct s15 *p) {}`,
+		body:      `p := C.f15(); p.a = [10]*C.char{new(C.char)}; C.f15b(p)`,
+		fail:      true,
+		expensive: true,
+	},
+	{
+		// Storing a Go pointer into C memory using a slice
+		// copy should fail.
+		name: "barrierslice",
+		c: `#include <stdlib.h>
+		    struct s16 { char *a[10]; };
+		    struct s16 *f16() { return malloc(sizeof(struct s16)); }
+		    void f16b(struct s16 *p) {}`,
+		body:      `p := C.f16(); copy(p.a[:], []*C.char{new(C.char)}); C.f16b(p)`,
+		fail:      true,
+		expensive: true,
+	},
+	{
+		// A very large value uses a GC program, which is a
+		// different code path.
+		name: "barriergcprogarray",
+		c: `#include <stdlib.h>
+		    struct s17 { char *a[32769]; };
+		    struct s17 *f17() { return malloc(sizeof(struct s17)); }
+		    void f17b(struct s17 *p) {}`,
+		body:      `p := C.f17(); p.a = [32769]*C.char{new(C.char)}; C.f17b(p)`,
+		fail:      true,
+		expensive: true,
+	},
+	{
+		// Similar case, with a source on the heap.
+		name: "barriergcprogarrayheap",
+		c: `#include <stdlib.h>
+		    struct s18 { char *a[32769]; };
+		    struct s18 *f18() { return malloc(sizeof(struct s18)); }
+		    void f18b(struct s18 *p) {}
+		    void f18c(void *p) {}`,
+		imports:   []string{"unsafe"},
+		body:      `p := C.f18(); n := &[32769]*C.char{new(C.char)}; p.a = *n; C.f18b(p); n[0] = nil; C.f18c(unsafe.Pointer(n))`,
+		fail:      true,
+		expensive: true,
+	},
+	{
+		// A GC program with a struct.
+		name: "barriergcprogstruct",
+		c: `#include <stdlib.h>
+		    struct s19a { char *a[32769]; };
+		    struct s19b { struct s19a f; };
+		    struct s19b *f19() { return malloc(sizeof(struct s19b)); }
+		    void f19b(struct s19b *p) {}`,
+		body:      `p := C.f19(); p.f = C.struct_s19a{[32769]*C.char{new(C.char)}}; C.f19b(p)`,
+		fail:      true,
+		expensive: true,
+	},
+	{
+		// Similar case, with a source on the heap.
+		name: "barriergcprogstructheap",
+		c: `#include <stdlib.h>
+		    struct s20a { char *a[32769]; };
+		    struct s20b { struct s20a f; };
+		    struct s20b *f20() { return malloc(sizeof(struct s20b)); }
+		    void f20b(struct s20b *p) {}
+		    void f20c(void *p) {}`,
+		imports:   []string{"unsafe"},
+		body:      `p := C.f20(); n := &C.struct_s20a{[32769]*C.char{new(C.char)}}; p.f = *n; C.f20b(p); n.a[0] = nil; C.f20c(unsafe.Pointer(n))`,
+		fail:      true,
+		expensive: true,
+	},
+	{
+		// Exported functions may not return Go pointers.
+		name: "export1",
+		c:    `extern unsigned char *GoFn21();`,
+		support: `//export GoFn21
+		          func GoFn21() *byte { return new(byte) }`,
+		body: `C.GoFn21()`,
+		fail: true,
+	},
+	{
+		// Returning a C pointer is fine.
+		name: "exportok",
+		c: `#include <stdlib.h>
+		    extern unsigned char *GoFn22();`,
+		support: `//export GoFn22
+		          func GoFn22() *byte { return (*byte)(C.malloc(1)) }`,
+		body: `C.GoFn22()`,
+	},
+	{
+		// Passing a Go string is fine.
+		name: "passstring",
+		c: `#include <stddef.h>
+		    typedef struct { const char *p; ptrdiff_t n; } gostring23;
+		    gostring23 f23(gostring23 s) { return s; }`,
+		imports: []string{"unsafe"},
+		body:    `s := "a"; r := C.f23(*(*C.gostring23)(unsafe.Pointer(&s))); if *(*string)(unsafe.Pointer(&r)) != s { panic(r) }`,
+	},
+	{
+		// Passing a slice of Go strings fails.
+		name:    "passstringslice",
+		c:       `void f24(void *p) {}`,
+		imports: []string{"strings", "unsafe"},
+		support: `type S24 struct { a [1]string }`,
+		body:    `s := S24{a:[1]string{strings.Repeat("a", 2)}}; C.f24(unsafe.Pointer(&s.a[0]))`,
+		fail:    true,
+	},
+	{
+		// Exported functions may not return strings.
+		name:    "retstring",
+		c:       `extern void f25();`,
+		imports: []string{"strings"},
+		support: `//export GoStr25
+		          func GoStr25() string { return strings.Repeat("a", 2) }`,
+		body: `C.f25()`,
+		c1: `#include <stddef.h>
+		     typedef struct { const char *p; ptrdiff_t n; } gostring25;
+		     extern gostring25 GoStr25();
+		     void f25() { GoStr25(); }`,
+		fail: true,
+	},
+	{
+		// Don't check non-pointer data.
+		// Uses unsafe code to get a pointer we shouldn't check.
+		// Although we use unsafe, the uintptr represents an integer
+		// that happens to have the same representation as a pointer;
+		// that is, we are testing something that is not unsafe.
+		name: "ptrdata1",
+		c: `#include <stdlib.h>
+		    void f26(void* p) {}`,
+		imports: []string{"unsafe"},
+		support: `type S26 struct { p *int; a [8*8]byte; u uintptr }`,
+		body:    `i := 0; p := &S26{u:uintptr(unsafe.Pointer(&i))}; q := (*S26)(C.malloc(C.size_t(unsafe.Sizeof(*p)))); *q = *p; C.f26(unsafe.Pointer(q))`,
+		fail:    false,
+	},
+	{
+		// Like ptrdata1, but with a type that uses a GC program.
+		name: "ptrdata2",
+		c: `#include <stdlib.h>
+		    void f27(void* p) {}`,
+		imports: []string{"unsafe"},
+		support: `type S27 struct { p *int; a [32769*8]byte; q *int; u uintptr }`,
+		body:    `i := 0; p := S27{u:uintptr(unsafe.Pointer(&i))}; q := (*S27)(C.malloc(C.size_t(unsafe.Sizeof(p)))); *q = p; C.f27(unsafe.Pointer(q))`,
+		fail:    false,
+	},
+	{
+		// Check deferred pointers when they are used, not
+		// when the defer statement is run.
+		name: "defer1",
+		c:    `typedef struct s28 { int *p; } s28; void f28(s28 *ps) {}`,
+		body: `p := &C.s28{}; defer C.f28(p); p.p = new(C.int)`,
+		fail: true,
+	},
+	{
+		// Check a pointer to a union if the union has any
+		// pointer fields.
+		name:    "union1",
+		c:       `typedef union { char **p; unsigned long i; } u29; void f29(u29 *pu) {}`,
+		imports: []string{"unsafe"},
+		body:    `var b C.char; p := &b; C.f29((*C.u29)(unsafe.Pointer(&p)))`,
+		fail:    true,
+	},
+	{
+		// Don't check a pointer to a union if the union does
+		// not have any pointer fields.
+		// Like ptrdata1 above, the uintptr represents an
+		// integer that happens to have the same
+		// representation as a pointer.
+		name:    "union2",
+		c:       `typedef union { unsigned long i; } u39; void f39(u39 *pu) {}`,
+		imports: []string{"unsafe"},
+		body:    `var b C.char; p := &b; C.f39((*C.u39)(unsafe.Pointer(&p)))`,
+		fail:    false,
+	},
+	{
+		// Test preemption while entering a cgo call. Issue #21306.
+		name:    "preemptduringcall",
+		c:       `void f30() {}`,
+		imports: []string{"runtime", "sync"},
+		body:    `var wg sync.WaitGroup; wg.Add(100); for i := 0; i < 100; i++ { go func(i int) { for j := 0; j < 100; j++ { C.f30(); runtime.GOMAXPROCS(i) }; wg.Done() }(i) }; wg.Wait()`,
+		fail:    false,
+	},
+	{
+		// Test poller deadline with cgocheck=2.  Issue #23435.
+		name:    "deadline",
+		c:       `#define US31 10`,
+		imports: []string{"os", "time"},
+		body:    `r, _, _ := os.Pipe(); r.SetDeadline(time.Now().Add(C.US31 * time.Microsecond))`,
+		fail:    false,
+	},
+	{
+		// Test for double evaluation of channel receive.
+		name:    "chanrecv",
+		c:       `void f32(char** p) {}`,
+		imports: []string{"time"},
+		body:    `c := make(chan []*C.char, 2); c <- make([]*C.char, 1); go func() { time.Sleep(10 * time.Second); panic("received twice from chan") }(); C.f32(&(<-c)[0]);`,
+		fail:    false,
+	},
+	{
+		// Test that converting the address of a struct field
+		// to unsafe.Pointer still just checks that field.
+		// Issue #25941.
+		name:    "structfield",
+		c:       `void f33(void* p) {}`,
+		imports: []string{"unsafe"},
+		support: `type S33 struct { p *int; a [8]byte; u uintptr }`,
+		body:    `s := &S33{p: new(int)}; C.f33(unsafe.Pointer(&s.a))`,
+		fail:    false,
+	},
+	{
+		// Test that converting multiple struct field
+		// addresses to unsafe.Pointer still just checks those
+		// fields. Issue #25941.
+		name:    "structfield2",
+		c:       `void f34(void* p, int r, void* s) {}`,
+		imports: []string{"unsafe"},
+		support: `type S34 struct { a [8]byte; p *int; b int64; }`,
+		body:    `s := &S34{p: new(int)}; C.f34(unsafe.Pointer(&s.a), 32, unsafe.Pointer(&s.b))`,
+		fail:    false,
+	},
+	{
+		// Test that second argument to cgoCheckPointer is
+		// evaluated when a deferred function is deferred, not
+		// when it is run.
+		name:    "defer2",
+		c:       `void f35(char **pc) {}`,
+		support: `type S35a struct { s []*C.char }; type S35b struct { ps *S35a }`,
+		body:    `p := &S35b{&S35a{[]*C.char{nil}}}; defer C.f35(&p.ps.s[0]); p.ps = nil`,
+		fail:    false,
+	},
+	{
+		// Test that indexing into a function call still
+		// examines only the slice being indexed.
+		name:    "buffer",
+		c:       `void f36(void *p) {}`,
+		imports: []string{"bytes", "unsafe"},
+		body:    `var b bytes.Buffer; b.WriteString("a"); C.f36(unsafe.Pointer(&b.Bytes()[0]))`,
+		fail:    false,
+	},
+	{
+		// Test that bgsweep releasing a finalizer is OK.
+		name:    "finalizer",
+		c:       `// Nothing to declare.`,
+		imports: []string{"os"},
+		support: `func open37() { os.Open(os.Args[0]) }; var G37 [][]byte`,
+		body:    `for i := 0; i < 10000; i++ { G37 = append(G37, make([]byte, 4096)); if i % 100 == 0 { G37 = nil; open37() } }`,
+		fail:    false,
+	},
+	{
+		// Test that converting generated struct to interface is OK.
+		name:    "structof",
+		c:       `// Nothing to declare.`,
+		imports: []string{"reflect"},
+		support: `type MyInt38 int; func (i MyInt38) Get() int { return int(i) }; type Getter38 interface { Get() int }`,
+		body:    `t := reflect.StructOf([]reflect.StructField{{Name: "MyInt38", Type: reflect.TypeOf(MyInt38(0)), Anonymous: true}}); v := reflect.New(t).Elem(); v.Interface().(Getter38).Get()`,
+		fail:    false,
+	},
+	{
+		// Test that a converted address of a struct field results
+		// in a check for just that field and not the whole struct.
+		name:    "structfieldcast",
+		c:       `struct S40i { int i; int* p; }; void f40(struct S40i* p) {}`,
+		support: `type S40 struct { p *int; a C.struct_S40i }`,
+		body:    `s := &S40{p: new(int)}; C.f40((*C.struct_S40i)(&s.a))`,
+		fail:    false,
+	},
+	{
+		// Test that we handle unsafe.StringData.
+		name:    "stringdata",
+		c:       `void f41(void* p) {}`,
+		imports: []string{"unsafe"},
+		body:    `s := struct { a [4]byte; p *int }{p: new(int)}; str := unsafe.String(&s.a[0], 4); C.f41(unsafe.Pointer(unsafe.StringData(str)))`,
+		fail:    false,
+	},
+	{
+		name:    "slicedata",
+		c:       `void f42(void* p) {}`,
+		imports: []string{"unsafe"},
+		body:    `s := []*byte{nil, new(byte)}; C.f42(unsafe.Pointer(unsafe.SliceData(s)))`,
+		fail:    true,
+	},
+	{
+		name:    "slicedata2",
+		c:       `void f43(void* p) {}`,
+		imports: []string{"unsafe"},
+		body:    `s := struct { a [4]byte; p *int }{p: new(int)}; C.f43(unsafe.Pointer(unsafe.SliceData(s.a[:])))`,
+		fail:    false,
+	},
+}
+
+func TestPointerChecks(t *testing.T) {
+	testenv.MustHaveGoBuild(t)
+	testenv.MustHaveCGO(t)
+	if runtime.GOOS == "windows" {
+		// TODO: Skip just the cases that fail?
+		t.Skipf("some tests fail to build on %s", runtime.GOOS)
+	}
+
+	var gopath string
+	var dir string
+	if *tmp != "" {
+		gopath = *tmp
+		dir = ""
+	} else {
+		d, err := os.MkdirTemp("", filepath.Base(t.Name()))
+		if err != nil {
+			t.Fatal(err)
+		}
+		dir = d
+		gopath = d
+	}
+
+	exe := buildPtrTests(t, gopath, false)
+	exe2 := buildPtrTests(t, gopath, true)
+
+	// We (TestPointerChecks) return before the parallel subtest functions do,
+	// so we can't just defer os.RemoveAll(dir). Instead we have to wait for
+	// the parallel subtests to finish. This code looks racy but is not:
+	// the add +1 run in serial before testOne blocks. The -1 run in parallel
+	// after testOne finishes.
+	var pending int32
+	for _, pt := range ptrTests {
+		pt := pt
+		t.Run(pt.name, func(t *testing.T) {
+			atomic.AddInt32(&pending, +1)
+			defer func() {
+				if atomic.AddInt32(&pending, -1) == 0 {
+					os.RemoveAll(dir)
+				}
+			}()
+			testOne(t, pt, exe, exe2)
+		})
+	}
+}
+
+func buildPtrTests(t *testing.T, gopath string, cgocheck2 bool) (exe string) {
+
+	src := filepath.Join(gopath, "src", "ptrtest")
+	if err := os.MkdirAll(src, 0777); err != nil {
+		t.Fatal(err)
+	}
+	if err := os.WriteFile(filepath.Join(src, "go.mod"), []byte("module ptrtest\ngo 1.20"), 0666); err != nil {
+		t.Fatal(err)
+	}
+
+	// Prepare two cgo inputs: one for standard cgo and one for //export cgo.
+	// (The latter cannot have C definitions, only declarations.)
+	var cgo1, cgo2 bytes.Buffer
+	fmt.Fprintf(&cgo1, "package main\n\n/*\n")
+	fmt.Fprintf(&cgo2, "package main\n\n/*\n")
+
+	// C code
+	for _, pt := range ptrTests {
+		cgo := &cgo1
+		if strings.Contains(pt.support, "//export") {
+			cgo = &cgo2
+		}
+		fmt.Fprintf(cgo, "%s\n", pt.c)
+		fmt.Fprintf(&cgo1, "%s\n", pt.c1)
+	}
+	fmt.Fprintf(&cgo1, "*/\nimport \"C\"\n\n")
+	fmt.Fprintf(&cgo2, "*/\nimport \"C\"\n\n")
+
+	// Imports
+	did1 := make(map[string]bool)
+	did2 := make(map[string]bool)
+	did1["os"] = true // for ptrTestMain
+	fmt.Fprintf(&cgo1, "import \"os\"\n")
+
+	for _, pt := range ptrTests {
+		did := did1
+		cgo := &cgo1
+		if strings.Contains(pt.support, "//export") {
+			did = did2
+			cgo = &cgo2
+		}
+		for _, imp := range pt.imports {
+			if !did[imp] {
+				did[imp] = true
+				fmt.Fprintf(cgo, "import %q\n", imp)
+			}
+		}
+	}
+
+	// Func support and bodies.
+	for _, pt := range ptrTests {
+		cgo := &cgo1
+		if strings.Contains(pt.support, "//export") {
+			cgo = &cgo2
+		}
+		fmt.Fprintf(cgo, "%s\nfunc %s() {\n%s\n}\n", pt.support, pt.name, pt.body)
+	}
+
+	// Func list and main dispatch.
+	fmt.Fprintf(&cgo1, "var funcs = map[string]func() {\n")
+	for _, pt := range ptrTests {
+		fmt.Fprintf(&cgo1, "\t%q: %s,\n", pt.name, pt.name)
+	}
+	fmt.Fprintf(&cgo1, "}\n\n")
+	fmt.Fprintf(&cgo1, "%s\n", ptrTestMain)
+
+	if err := os.WriteFile(filepath.Join(src, "cgo1.go"), cgo1.Bytes(), 0666); err != nil {
+		t.Fatal(err)
+	}
+	if err := os.WriteFile(filepath.Join(src, "cgo2.go"), cgo2.Bytes(), 0666); err != nil {
+		t.Fatal(err)
+	}
+
+	exeName := "ptrtest.exe"
+	if cgocheck2 {
+		exeName = "ptrtest2.exe"
+	}
+	cmd := exec.Command("go", "build", "-o", exeName)
+	cmd.Dir = src
+	cmd.Env = append(os.Environ(), "GOPATH="+gopath)
+
+	// Set or remove cgocheck2 from the environment.
+	goexperiment := strings.Split(os.Getenv("GOEXPERIMENT"), ",")
+	if len(goexperiment) == 1 && goexperiment[0] == "" {
+		goexperiment = nil
+	}
+	i := slices.Index(goexperiment, "cgocheck2")
+	changed := false
+	if cgocheck2 && i < 0 {
+		goexperiment = append(goexperiment, "cgocheck2")
+		changed = true
+	} else if !cgocheck2 && i >= 0 {
+		goexperiment = append(goexperiment[:i], goexperiment[i+1:]...)
+		changed = true
+	}
+	if changed {
+		cmd.Env = append(cmd.Env, "GOEXPERIMENT="+strings.Join(goexperiment, ","))
+	}
+
+	out, err := cmd.CombinedOutput()
+	if err != nil {
+		t.Fatalf("go build: %v\n%s", err, out)
+	}
+
+	return filepath.Join(src, exeName)
+}
+
+const ptrTestMain = `
+func main() {
+	for _, arg := range os.Args[1:] {
+		f := funcs[arg]
+		if f == nil {
+			panic("missing func "+arg)
+		}
+		f()
+	}
+}
+`
+
+var csem = make(chan bool, 16)
+
+func testOne(t *testing.T, pt ptrTest, exe, exe2 string) {
+	t.Parallel()
+
+	// Run the tests in parallel, but don't run too many
+	// executions in parallel, to avoid overloading the system.
+	runcmd := func(cgocheck string) ([]byte, error) {
+		csem <- true
+		defer func() { <-csem }()
+		x := exe
+		if cgocheck == "2" {
+			x = exe2
+			cgocheck = "1"
+		}
+		cmd := exec.Command(x, pt.name)
+		cmd.Env = append(os.Environ(), "GODEBUG=cgocheck="+cgocheck)
+		return cmd.CombinedOutput()
+	}
+
+	if pt.expensive {
+		buf, err := runcmd("1")
+		if err != nil {
+			t.Logf("%s", buf)
+			if pt.fail {
+				t.Fatalf("test marked expensive, but failed when not expensive: %v", err)
+			} else {
+				t.Errorf("failed unexpectedly with GODEBUG=cgocheck=1: %v", err)
+			}
+		}
+
+	}
+
+	cgocheck := ""
+	if pt.expensive {
+		cgocheck = "2"
+	}
+
+	buf, err := runcmd(cgocheck)
+	if pt.fail {
+		if err == nil {
+			t.Logf("%s", buf)
+			t.Fatalf("did not fail as expected")
+		} else if !bytes.Contains(buf, []byte("Go pointer")) {
+			t.Logf("%s", buf)
+			t.Fatalf("did not print expected error (failed with %v)", err)
+		}
+	} else {
+		if err != nil {
+			t.Logf("%s", buf)
+			t.Fatalf("failed unexpectedly: %v", err)
+		}
+
+		if !pt.expensive {
+			// Make sure it passes with the expensive checks.
+			buf, err := runcmd("2")
+			if err != nil {
+				t.Logf("%s", buf)
+				t.Fatalf("failed unexpectedly with expensive checks: %v", err)
+			}
+		}
+	}
+
+	if pt.fail {
+		buf, err := runcmd("0")
+		if err != nil {
+			t.Logf("%s", buf)
+			t.Fatalf("failed unexpectedly with GODEBUG=cgocheck=0: %v", err)
+		}
+	}
+}
diff --git a/misc/cgo/errors/testdata/err1.go b/src/cmd/cgo/internal/testerrors/testdata/err1.go
similarity index 100%
rename from misc/cgo/errors/testdata/err1.go
rename to src/cmd/cgo/internal/testerrors/testdata/err1.go
diff --git a/misc/cgo/errors/testdata/err2.go b/src/cmd/cgo/internal/testerrors/testdata/err2.go
similarity index 100%
rename from misc/cgo/errors/testdata/err2.go
rename to src/cmd/cgo/internal/testerrors/testdata/err2.go
diff --git a/misc/cgo/errors/testdata/err4.go b/src/cmd/cgo/internal/testerrors/testdata/err4.go
similarity index 100%
rename from misc/cgo/errors/testdata/err4.go
rename to src/cmd/cgo/internal/testerrors/testdata/err4.go
diff --git a/src/cmd/cgo/internal/testerrors/testdata/err5.go b/src/cmd/cgo/internal/testerrors/testdata/err5.go
new file mode 100644
index 0000000..779d745
--- /dev/null
+++ b/src/cmd/cgo/internal/testerrors/testdata/err5.go
@@ -0,0 +1,10 @@
+// Copyright 2023 The Go Authors. 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
+
+//line /tmp/_cgo_.go:1
+//go:cgo_dynamic_linker "/elf/interp" // ERROR HERE: only allowed in cgo-generated code
+
+func main() {}
diff --git a/misc/cgo/errors/testdata/issue11097a.go b/src/cmd/cgo/internal/testerrors/testdata/issue11097a.go
similarity index 100%
rename from misc/cgo/errors/testdata/issue11097a.go
rename to src/cmd/cgo/internal/testerrors/testdata/issue11097a.go
diff --git a/misc/cgo/errors/testdata/issue11097b.go b/src/cmd/cgo/internal/testerrors/testdata/issue11097b.go
similarity index 100%
rename from misc/cgo/errors/testdata/issue11097b.go
rename to src/cmd/cgo/internal/testerrors/testdata/issue11097b.go
diff --git a/misc/cgo/errors/testdata/issue14669.go b/src/cmd/cgo/internal/testerrors/testdata/issue14669.go
similarity index 100%
rename from misc/cgo/errors/testdata/issue14669.go
rename to src/cmd/cgo/internal/testerrors/testdata/issue14669.go
diff --git a/misc/cgo/errors/testdata/issue18452.go b/src/cmd/cgo/internal/testerrors/testdata/issue18452.go
similarity index 100%
rename from misc/cgo/errors/testdata/issue18452.go
rename to src/cmd/cgo/internal/testerrors/testdata/issue18452.go
diff --git a/misc/cgo/errors/testdata/issue18889.go b/src/cmd/cgo/internal/testerrors/testdata/issue18889.go
similarity index 100%
rename from misc/cgo/errors/testdata/issue18889.go
rename to src/cmd/cgo/internal/testerrors/testdata/issue18889.go
diff --git a/misc/cgo/errors/testdata/issue28069.go b/src/cmd/cgo/internal/testerrors/testdata/issue28069.go
similarity index 100%
rename from misc/cgo/errors/testdata/issue28069.go
rename to src/cmd/cgo/internal/testerrors/testdata/issue28069.go
diff --git a/misc/cgo/errors/testdata/issue28721.go b/src/cmd/cgo/internal/testerrors/testdata/issue28721.go
similarity index 100%
rename from misc/cgo/errors/testdata/issue28721.go
rename to src/cmd/cgo/internal/testerrors/testdata/issue28721.go
diff --git a/misc/cgo/errors/testdata/issue33061.go b/src/cmd/cgo/internal/testerrors/testdata/issue33061.go
similarity index 100%
rename from misc/cgo/errors/testdata/issue33061.go
rename to src/cmd/cgo/internal/testerrors/testdata/issue33061.go
diff --git a/misc/cgo/errors/testdata/issue42580.go b/src/cmd/cgo/internal/testerrors/testdata/issue42580.go
similarity index 100%
rename from misc/cgo/errors/testdata/issue42580.go
rename to src/cmd/cgo/internal/testerrors/testdata/issue42580.go
diff --git a/misc/cgo/errors/testdata/issue50710.go b/src/cmd/cgo/internal/testerrors/testdata/issue50710.go
similarity index 100%
rename from misc/cgo/errors/testdata/issue50710.go
rename to src/cmd/cgo/internal/testerrors/testdata/issue50710.go
diff --git a/misc/cgo/errors/testdata/long_double_size.go b/src/cmd/cgo/internal/testerrors/testdata/long_double_size.go
similarity index 100%
rename from misc/cgo/errors/testdata/long_double_size.go
rename to src/cmd/cgo/internal/testerrors/testdata/long_double_size.go
diff --git a/misc/cgo/errors/testdata/malloc.go b/src/cmd/cgo/internal/testerrors/testdata/malloc.go
similarity index 100%
rename from misc/cgo/errors/testdata/malloc.go
rename to src/cmd/cgo/internal/testerrors/testdata/malloc.go
diff --git a/src/cmd/cgo/internal/testfortran/fortran_test.go b/src/cmd/cgo/internal/testfortran/fortran_test.go
new file mode 100644
index 0000000..eaa36ac
--- /dev/null
+++ b/src/cmd/cgo/internal/testfortran/fortran_test.go
@@ -0,0 +1,85 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package fortran
+
+import (
+	"fmt"
+	"internal/testenv"
+	"os"
+	"os/exec"
+	"path/filepath"
+	"runtime"
+	"strings"
+	"testing"
+)
+
+func TestFortran(t *testing.T) {
+	testenv.MustHaveGoRun(t)
+	testenv.MustHaveCGO(t)
+
+	// Find the FORTRAN compiler.
+	fc := os.Getenv("FC")
+	if fc == "" {
+		fc, _ = exec.LookPath("gfortran")
+	}
+	if fc == "" {
+		t.Skip("fortran compiler not found (try setting $FC)")
+	}
+
+	var fcExtra []string
+	if strings.Contains(fc, "gfortran") {
+		// TODO: This duplicates but also diverges from logic from cmd/go
+		// itself. For example, cmd/go merely adds -lgfortran without the extra
+		// library path work. If this is what's necessary to run gfortran, we
+		// should reconcile the logic here and in cmd/go.. Maybe this should
+		// become a cmd/go script test to share that logic.
+
+		// Add -m32 if we're targeting 386, in case this is a cross-compile.
+		if runtime.GOARCH == "386" {
+			fcExtra = append(fcExtra, "-m32")
+		}
+
+		// Find libgfortran. If the FORTRAN compiler isn't bundled
+		// with the C linker, this may be in a path the C linker can't
+		// find on its own. (See #14544)
+		libExt := "so"
+		switch runtime.GOOS {
+		case "darwin":
+			libExt = "dylib"
+		case "aix":
+			libExt = "a"
+		}
+		libPath, err := exec.Command(fc, append([]string{"-print-file-name=libgfortran." + libExt}, fcExtra...)...).CombinedOutput()
+		if err != nil {
+			t.Errorf("error invoking %s: %s", fc, err)
+		}
+		libDir := filepath.Dir(string(libPath))
+		cgoLDFlags := os.Getenv("CGO_LDFLAGS")
+		cgoLDFlags += " -L " + libDir
+		if runtime.GOOS != "aix" {
+			cgoLDFlags += " -Wl,-rpath," + libDir
+		}
+		t.Logf("CGO_LDFLAGS=%s", cgoLDFlags)
+		os.Setenv("CGO_LDFLAGS", cgoLDFlags)
+
+	}
+
+	// Do a test build that doesn't involve Go FORTRAN support.
+	fcArgs := append([]string{"testdata/helloworld/helloworld.f90", "-o", "/dev/null"}, fcExtra...)
+	t.Logf("%s %s", fc, fcArgs)
+	if err := exec.Command(fc, fcArgs...).Run(); err != nil {
+		t.Skipf("skipping Fortran test: could not build helloworld.f90 with %s: %s", fc, err)
+	}
+
+	// Finally, run the actual test.
+	t.Log("go", "run", "./testdata/testprog")
+	out, err := exec.Command("go", "run", "./testdata/testprog").CombinedOutput()
+	if err == nil && string(out) != "ok\n" {
+		err = fmt.Errorf("expected ok")
+	}
+	if err != nil {
+		t.Errorf("%s\nOutput:\n%s", err, string(out))
+	}
+}
diff --git a/misc/cgo/fortran/helloworld/helloworld.f90 b/src/cmd/cgo/internal/testfortran/testdata/helloworld/helloworld.f90
similarity index 100%
rename from misc/cgo/fortran/helloworld/helloworld.f90
rename to src/cmd/cgo/internal/testfortran/testdata/helloworld/helloworld.f90
diff --git a/misc/cgo/fortran/testdata/testprog/answer.f90 b/src/cmd/cgo/internal/testfortran/testdata/testprog/answer.f90
similarity index 100%
rename from misc/cgo/fortran/testdata/testprog/answer.f90
rename to src/cmd/cgo/internal/testfortran/testdata/testprog/answer.f90
diff --git a/misc/cgo/fortran/testdata/testprog/fortran.go b/src/cmd/cgo/internal/testfortran/testdata/testprog/fortran.go
similarity index 100%
rename from misc/cgo/fortran/testdata/testprog/fortran.go
rename to src/cmd/cgo/internal/testfortran/testdata/testprog/fortran.go
diff --git a/src/cmd/cgo/internal/testgodefs/testdata/anonunion.go b/src/cmd/cgo/internal/testgodefs/testdata/anonunion.go
new file mode 100644
index 0000000..2c86c5c
--- /dev/null
+++ b/src/cmd/cgo/internal/testgodefs/testdata/anonunion.go
@@ -0,0 +1,26 @@
+// 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:build ignore
+
+package main
+
+// This file tests that when cgo -godefs sees a struct with a field
+// that is an anonymous union, the first field in the union is
+// promoted to become a field of the struct.  See issue 6677 for
+// background.
+
+/*
+typedef struct {
+	union {
+		long l;
+		int c;
+	};
+} t;
+*/
+import "C"
+
+// Input for cgo -godefs.
+
+type T C.t
diff --git a/src/cmd/cgo/internal/testgodefs/testdata/bitfields.go b/src/cmd/cgo/internal/testgodefs/testdata/bitfields.go
new file mode 100644
index 0000000..431ffc0
--- /dev/null
+++ b/src/cmd/cgo/internal/testgodefs/testdata/bitfields.go
@@ -0,0 +1,31 @@
+// Copyright 2020 The Go 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:build ignore
+
+package main
+
+// This file tests that we don't generate an incorrect field location
+// for a bitfield that appears aligned.
+
+/*
+struct bitfields {
+    unsigned int B1     :  5;
+    unsigned int B2     :  1;
+    unsigned int B3     :  1;
+    unsigned int B4     :  1;
+    unsigned int Short1 : 16; // misaligned on 8 bit boundary
+    unsigned int B5     :  1;
+    unsigned int B6     :  1;
+    unsigned int B7     :  1;
+    unsigned int B8     :  1;
+    unsigned int B9     :  1;
+    unsigned int B10    :  3;
+    unsigned int Short2 : 16; // alignment is OK
+    unsigned int Short3 : 16; // alignment is OK
+};
+*/
+import "C"
+
+type bitfields C.struct_bitfields
diff --git a/src/cmd/cgo/internal/testgodefs/testdata/fieldtypedef.go b/src/cmd/cgo/internal/testgodefs/testdata/fieldtypedef.go
new file mode 100644
index 0000000..b0c5074
--- /dev/null
+++ b/src/cmd/cgo/internal/testgodefs/testdata/fieldtypedef.go
@@ -0,0 +1,18 @@
+// Copyright 2018 The Go Authors. All rights reserve d.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+//go:build ignore
+
+package main
+
+/*
+struct S1 { int f1; };
+struct S2 { struct S1 s1; };
+typedef struct S1 S1Type;
+typedef struct S2 S2Type;
+*/
+import "C"
+
+type S1 C.S1Type
+type S2 C.S2Type
diff --git a/src/cmd/cgo/internal/testgodefs/testdata/issue37479.go b/src/cmd/cgo/internal/testgodefs/testdata/issue37479.go
new file mode 100644
index 0000000..d545310
--- /dev/null
+++ b/src/cmd/cgo/internal/testgodefs/testdata/issue37479.go
@@ -0,0 +1,33 @@
+// Copyright 2020 The Go 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:build ignore
+
+package main
+
+/*
+typedef struct A A;
+
+typedef struct {
+	struct A *next;
+	struct A **prev;
+} N;
+
+struct A
+{
+	N n;
+};
+
+typedef struct B
+{
+	A* a;
+} B;
+*/
+import "C"
+
+type N C.N
+
+type A C.A
+
+type B C.B
diff --git a/src/cmd/cgo/internal/testgodefs/testdata/issue37621.go b/src/cmd/cgo/internal/testgodefs/testdata/issue37621.go
new file mode 100644
index 0000000..655e8ae
--- /dev/null
+++ b/src/cmd/cgo/internal/testgodefs/testdata/issue37621.go
@@ -0,0 +1,23 @@
+// Copyright 2020 The Go 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:build ignore
+
+package main
+
+/*
+struct tt {
+	long long a;
+	long long b;
+};
+
+struct s {
+	struct tt ts[3];
+};
+*/
+import "C"
+
+type TT C.struct_tt
+
+type S C.struct_s
diff --git a/src/cmd/cgo/internal/testgodefs/testdata/issue38649.go b/src/cmd/cgo/internal/testgodefs/testdata/issue38649.go
new file mode 100644
index 0000000..78b5f78
--- /dev/null
+++ b/src/cmd/cgo/internal/testgodefs/testdata/issue38649.go
@@ -0,0 +1,15 @@
+// Copyright 2020 The Go 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:build ignore
+
+package main
+
+/*
+struct Issue38649 { int x; };
+#define issue38649 struct Issue38649
+*/
+import "C"
+
+type issue38649 C.issue38649
diff --git a/src/cmd/cgo/internal/testgodefs/testdata/issue39534.go b/src/cmd/cgo/internal/testgodefs/testdata/issue39534.go
new file mode 100644
index 0000000..af730e9
--- /dev/null
+++ b/src/cmd/cgo/internal/testgodefs/testdata/issue39534.go
@@ -0,0 +1,12 @@
+// Copyright 2020 The Go 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:build ignore
+
+package main
+
+// enum { ENUMVAL = 0x1 };
+import "C"
+
+const ENUMVAL = C.ENUMVAL
diff --git a/src/cmd/cgo/internal/testgodefs/testdata/issue48396.go b/src/cmd/cgo/internal/testgodefs/testdata/issue48396.go
new file mode 100644
index 0000000..81dd2fe
--- /dev/null
+++ b/src/cmd/cgo/internal/testgodefs/testdata/issue48396.go
@@ -0,0 +1,18 @@
+// Copyright 2021 The Go 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:build ignore
+
+package main
+
+/*
+// from <linux/kcm.h>
+struct issue48396 {
+	int fd;
+	int bpf_fd;
+};
+*/
+import "C"
+
+type Issue48396 C.struct_issue48396
diff --git a/src/cmd/cgo/internal/testgodefs/testdata/issue8478.go b/src/cmd/cgo/internal/testgodefs/testdata/issue8478.go
new file mode 100644
index 0000000..f4ef164
--- /dev/null
+++ b/src/cmd/cgo/internal/testgodefs/testdata/issue8478.go
@@ -0,0 +1,20 @@
+// 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:build ignore
+
+package main
+
+// Issue 8478.  Test that void* is consistently mapped to *byte.
+
+/*
+typedef struct {
+	void *p;
+	void **q;
+	void ***r;
+} s;
+*/
+import "C"
+
+type Issue8478 C.s
diff --git a/misc/cgo/testgodefs/testdata/main.go b/src/cmd/cgo/internal/testgodefs/testdata/main.go
similarity index 100%
rename from misc/cgo/testgodefs/testdata/main.go
rename to src/cmd/cgo/internal/testgodefs/testdata/main.go
diff --git a/src/cmd/cgo/internal/testgodefs/testgodefs_test.go b/src/cmd/cgo/internal/testgodefs/testgodefs_test.go
new file mode 100644
index 0000000..8138b7f
--- /dev/null
+++ b/src/cmd/cgo/internal/testgodefs/testgodefs_test.go
@@ -0,0 +1,116 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package testgodefs
+
+import (
+	"bytes"
+	"internal/testenv"
+	"os"
+	"os/exec"
+	"path/filepath"
+	"runtime"
+	"strings"
+	"testing"
+)
+
+// We are testing cgo -godefs, which translates Go files that use
+// import "C" into Go files with Go definitions of types defined in the
+// import "C" block.  Add more tests here.
+var filePrefixes = []string{
+	"anonunion",
+	"bitfields",
+	"issue8478",
+	"fieldtypedef",
+	"issue37479",
+	"issue37621",
+	"issue38649",
+	"issue39534",
+	"issue48396",
+}
+
+func TestGoDefs(t *testing.T) {
+	testenv.MustHaveGoRun(t)
+	testenv.MustHaveCGO(t)
+
+	testdata, err := filepath.Abs("testdata")
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	gopath, err := os.MkdirTemp("", "testgodefs-gopath")
+	if err != nil {
+		t.Fatal(err)
+	}
+	defer os.RemoveAll(gopath)
+
+	dir := filepath.Join(gopath, "src", "testgodefs")
+	if err := os.MkdirAll(dir, 0755); err != nil {
+		t.Fatal(err)
+	}
+
+	for _, fp := range filePrefixes {
+		cmd := exec.Command("go", "tool", "cgo",
+			"-godefs",
+			"-srcdir", testdata,
+			"-objdir", dir,
+			fp+".go")
+		cmd.Stderr = new(bytes.Buffer)
+
+		out, err := cmd.Output()
+		if err != nil {
+			t.Fatalf("%s: %v\n%s", strings.Join(cmd.Args, " "), err, cmd.Stderr)
+		}
+
+		fn := fp + "_defs.go"
+		if err := os.WriteFile(filepath.Join(dir, fn), out, 0644); err != nil {
+			t.Fatal(err)
+		}
+
+		// Verify that command line arguments are not rewritten in the generated comment,
+		// see go.dev/issue/52063
+		hasGeneratedByComment := false
+		for _, line := range strings.Split(strings.TrimSpace(string(out)), "\n") {
+			cgoExe := "cgo"
+			if runtime.GOOS == "windows" {
+				cgoExe = "cgo.exe"
+			}
+			if !strings.HasPrefix(line, "// "+cgoExe+" -godefs") {
+				continue
+			}
+			if want := "// " + cgoExe + " " + strings.Join(cmd.Args[3:], " "); line != want {
+				t.Errorf("%s: got generated comment %q, want %q", fn, line, want)
+			}
+			hasGeneratedByComment = true
+			break
+		}
+
+		if !hasGeneratedByComment {
+			t.Errorf("%s: comment with generating cgo -godefs command not found", fn)
+		}
+	}
+
+	main, err := os.ReadFile(filepath.Join("testdata", "main.go"))
+	if err != nil {
+		t.Fatal(err)
+	}
+	if err := os.WriteFile(filepath.Join(dir, "main.go"), main, 0644); err != nil {
+		t.Fatal(err)
+	}
+
+	if err := os.WriteFile(filepath.Join(dir, "go.mod"), []byte("module testgodefs\ngo 1.14\n"), 0644); err != nil {
+		t.Fatal(err)
+	}
+
+	// Use 'go run' to build and run the resulting binary in a single step,
+	// instead of invoking 'go build' and the resulting binary separately, so that
+	// this test can pass on mobile builders, which do not copy artifacts back
+	// from remote invocations.
+	cmd := exec.Command("go", "run", ".")
+	cmd.Env = append(os.Environ(), "GOPATH="+gopath)
+	cmd.Dir = dir
+	if out, err := cmd.CombinedOutput(); err != nil {
+		t.Fatalf("%s [%s]: %v\n%s", strings.Join(cmd.Args, " "), dir, err, out)
+	}
+}
diff --git a/src/cmd/cgo/internal/testlife/life_test.go b/src/cmd/cgo/internal/testlife/life_test.go
new file mode 100644
index 0000000..e93d29c
--- /dev/null
+++ b/src/cmd/cgo/internal/testlife/life_test.go
@@ -0,0 +1,65 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package life_test
+
+import (
+	"bytes"
+	"cmd/cgo/internal/cgotest"
+	"internal/testenv"
+	"log"
+	"os"
+	"os/exec"
+	"path/filepath"
+	"testing"
+)
+
+func TestMain(m *testing.M) {
+	log.SetFlags(log.Lshortfile)
+	os.Exit(testMain(m))
+}
+
+func testMain(m *testing.M) int {
+	GOPATH, err := os.MkdirTemp("", "cgolife")
+	if err != nil {
+		log.Panic(err)
+	}
+	defer os.RemoveAll(GOPATH)
+	os.Setenv("GOPATH", GOPATH)
+
+	// Copy testdata into GOPATH/src/cgolife, along with a go.mod file
+	// declaring the same path.
+	modRoot := filepath.Join(GOPATH, "src", "cgolife")
+	if err := cgotest.OverlayDir(modRoot, "testdata"); err != nil {
+		log.Panic(err)
+	}
+	if err := os.Chdir(modRoot); err != nil {
+		log.Panic(err)
+	}
+	os.Setenv("PWD", modRoot)
+	if err := os.WriteFile("go.mod", []byte("module cgolife\n"), 0666); err != nil {
+		log.Panic(err)
+	}
+
+	return m.Run()
+}
+
+// TestTestRun runs a test case for cgo //export.
+func TestTestRun(t *testing.T) {
+	testenv.MustHaveGoRun(t)
+	testenv.MustHaveCGO(t)
+
+	cmd := exec.Command("go", "run", "main.go")
+	got, err := cmd.CombinedOutput()
+	if err != nil {
+		t.Fatalf("%v: %s\n%s", cmd, err, got)
+	}
+	want, err := os.ReadFile("main.out")
+	if err != nil {
+		t.Fatal("reading golden output:", err)
+	}
+	if !bytes.Equal(got, want) {
+		t.Errorf("'%v' output does not match expected in main.out. Instead saw:\n%s", cmd, got)
+	}
+}
diff --git a/misc/cgo/life/testdata/c-life.c b/src/cmd/cgo/internal/testlife/testdata/c-life.c
similarity index 100%
rename from misc/cgo/life/testdata/c-life.c
rename to src/cmd/cgo/internal/testlife/testdata/c-life.c
diff --git a/src/cmd/cgo/internal/testlife/testdata/life.go b/src/cmd/cgo/internal/testlife/testdata/life.go
new file mode 100644
index 0000000..7231140
--- /dev/null
+++ b/src/cmd/cgo/internal/testlife/testdata/life.go
@@ -0,0 +1,40 @@
+// 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 cgolife
+
+// #include "life.h"
+import "C"
+
+import "unsafe"
+
+func Run(gen, x, y int, a []int32) {
+	n := make([]int32, x*y)
+	for i := 0; i < gen; i++ {
+		C.Step(C.int(x), C.int(y), (*C.int)(unsafe.Pointer(&a[0])), (*C.int)(unsafe.Pointer(&n[0])))
+		copy(a, n)
+	}
+}
+
+// Keep the channels visible from Go.
+var chans [4]chan bool
+
+// Double return value is just for testing.
+//
+//export GoStart
+func GoStart(i, xdim, ydim, xstart, xend, ystart, yend C.int, a *C.int, n *C.int) (int, int) {
+	c := make(chan bool, int(C.MYCONST))
+	go func() {
+		C.DoStep(xdim, ydim, xstart, xend, ystart, yend, a, n)
+		c <- true
+	}()
+	chans[i] = c
+	return int(i), int(i + 100)
+}
+
+//export GoWait
+func GoWait(i C.int) {
+	<-chans[i]
+	chans[i] = nil
+}
diff --git a/misc/cgo/life/testdata/life.h b/src/cmd/cgo/internal/testlife/testdata/life.h
similarity index 100%
rename from misc/cgo/life/testdata/life.h
rename to src/cmd/cgo/internal/testlife/testdata/life.h
diff --git a/src/cmd/cgo/internal/testlife/testdata/main.go b/src/cmd/cgo/internal/testlife/testdata/main.go
new file mode 100644
index 0000000..e9d19be
--- /dev/null
+++ b/src/cmd/cgo/internal/testlife/testdata/main.go
@@ -0,0 +1,47 @@
+// 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.
+
+//go:build test_run
+
+// Run the game of life in C using Go for parallelization.
+
+package main
+
+import (
+	"flag"
+	"fmt"
+
+	"cgolife"
+)
+
+const MAXDIM = 100
+
+var dim = flag.Int("dim", 16, "board dimensions")
+var gen = flag.Int("gen", 10, "generations")
+
+func main() {
+	flag.Parse()
+
+	var a [MAXDIM * MAXDIM]int32
+	for i := 2; i < *dim; i += 8 {
+		for j := 2; j < *dim-3; j += 8 {
+			for y := 0; y < 3; y++ {
+				a[i**dim+j+y] = 1
+			}
+		}
+	}
+
+	cgolife.Run(*gen, *dim, *dim, a[:])
+
+	for i := 0; i < *dim; i++ {
+		for j := 0; j < *dim; j++ {
+			if a[i**dim+j] == 0 {
+				fmt.Print(" ")
+			} else {
+				fmt.Print("X")
+			}
+		}
+		fmt.Print("\n")
+	}
+}
diff --git a/misc/cgo/life/testdata/main.out b/src/cmd/cgo/internal/testlife/testdata/main.out
similarity index 100%
rename from misc/cgo/life/testdata/main.out
rename to src/cmd/cgo/internal/testlife/testdata/main.out
diff --git a/misc/cgo/nocgo/nocgo.go b/src/cmd/cgo/internal/testnocgo/nocgo.go
similarity index 100%
rename from misc/cgo/nocgo/nocgo.go
rename to src/cmd/cgo/internal/testnocgo/nocgo.go
diff --git a/misc/cgo/nocgo/nocgo_test.go b/src/cmd/cgo/internal/testnocgo/nocgo_test.go
similarity index 100%
rename from misc/cgo/nocgo/nocgo_test.go
rename to src/cmd/cgo/internal/testnocgo/nocgo_test.go
diff --git a/misc/cgo/testplugin/altpath/testdata/common/common.go b/src/cmd/cgo/internal/testplugin/altpath/testdata/common/common.go
similarity index 100%
rename from misc/cgo/testplugin/altpath/testdata/common/common.go
rename to src/cmd/cgo/internal/testplugin/altpath/testdata/common/common.go
diff --git a/misc/cgo/testplugin/altpath/testdata/plugin-mismatch/main.go b/src/cmd/cgo/internal/testplugin/altpath/testdata/plugin-mismatch/main.go
similarity index 100%
rename from misc/cgo/testplugin/altpath/testdata/plugin-mismatch/main.go
rename to src/cmd/cgo/internal/testplugin/altpath/testdata/plugin-mismatch/main.go
diff --git a/src/cmd/cgo/internal/testplugin/plugin_test.go b/src/cmd/cgo/internal/testplugin/plugin_test.go
new file mode 100644
index 0000000..7f5b1bf
--- /dev/null
+++ b/src/cmd/cgo/internal/testplugin/plugin_test.go
@@ -0,0 +1,406 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package plugin_test
+
+import (
+	"bytes"
+	"cmd/cgo/internal/cgotest"
+	"context"
+	"flag"
+	"fmt"
+	"internal/platform"
+	"internal/testenv"
+	"log"
+	"os"
+	"os/exec"
+	"path/filepath"
+	"runtime"
+	"strings"
+	"testing"
+	"time"
+)
+
+var globalSkip = func(t *testing.T) {}
+
+var gcflags string = os.Getenv("GO_GCFLAGS")
+var goroot string
+
+func TestMain(m *testing.M) {
+	flag.Parse()
+	log.SetFlags(log.Lshortfile)
+	os.Exit(testMain(m))
+}
+
+// tmpDir is used to cleanup logged commands -- s/tmpDir/$TMPDIR/
+var tmpDir string
+
+// prettyPrintf prints lines with tmpDir sanitized.
+func prettyPrintf(format string, args ...interface{}) {
+	s := fmt.Sprintf(format, args...)
+	if tmpDir != "" {
+		s = strings.ReplaceAll(s, tmpDir, "$TMPDIR")
+	}
+	fmt.Print(s)
+}
+
+func testMain(m *testing.M) int {
+	if testing.Short() && os.Getenv("GO_BUILDER_NAME") == "" {
+		globalSkip = func(t *testing.T) { t.Skip("short mode and $GO_BUILDER_NAME not set") }
+		return m.Run()
+	}
+	if !platform.BuildModeSupported(runtime.Compiler, "plugin", runtime.GOOS, runtime.GOARCH) {
+		globalSkip = func(t *testing.T) { t.Skip("plugin build mode not supported") }
+		return m.Run()
+	}
+	if !testenv.HasCGO() {
+		globalSkip = func(t *testing.T) { t.Skip("cgo not supported") }
+		return m.Run()
+	}
+
+	cwd, err := os.Getwd()
+	if err != nil {
+		log.Fatal(err)
+	}
+	goroot = filepath.Join(cwd, "../../../../..")
+
+	// Copy testdata into GOPATH/src/testplugin, along with a go.mod file
+	// declaring the same path.
+
+	GOPATH, err := os.MkdirTemp("", "plugin_test")
+	if err != nil {
+		log.Panic(err)
+	}
+	defer os.RemoveAll(GOPATH)
+	tmpDir = GOPATH
+
+	modRoot := filepath.Join(GOPATH, "src", "testplugin")
+	altRoot := filepath.Join(GOPATH, "alt", "src", "testplugin")
+	for srcRoot, dstRoot := range map[string]string{
+		"testdata":                           modRoot,
+		filepath.Join("altpath", "testdata"): altRoot,
+	} {
+		if err := cgotest.OverlayDir(dstRoot, srcRoot); err != nil {
+			log.Panic(err)
+		}
+		prettyPrintf("mkdir -p %s\n", dstRoot)
+		prettyPrintf("rsync -a %s/ %s\n", srcRoot, dstRoot)
+
+		if err := os.WriteFile(filepath.Join(dstRoot, "go.mod"), []byte("module testplugin\n"), 0666); err != nil {
+			log.Panic(err)
+		}
+		prettyPrintf("echo 'module testplugin' > %s/go.mod\n", dstRoot)
+	}
+
+	os.Setenv("GOPATH", filepath.Join(GOPATH, "alt"))
+	if err := os.Chdir(altRoot); err != nil {
+		log.Panic(err)
+	} else {
+		prettyPrintf("cd %s\n", altRoot)
+	}
+	os.Setenv("PWD", altRoot)
+	goCmd(nil, "build", "-buildmode=plugin", "-o", filepath.Join(modRoot, "plugin-mismatch.so"), "./plugin-mismatch")
+
+	os.Setenv("GOPATH", GOPATH)
+	if err := os.Chdir(modRoot); err != nil {
+		log.Panic(err)
+	} else {
+		prettyPrintf("cd %s\n", modRoot)
+	}
+	os.Setenv("PWD", modRoot)
+
+	os.Setenv("LD_LIBRARY_PATH", modRoot)
+
+	goCmd(nil, "build", "-buildmode=plugin", "./plugin1")
+	goCmd(nil, "build", "-buildmode=plugin", "./plugin2")
+	so, err := os.ReadFile("plugin2.so")
+	if err != nil {
+		log.Panic(err)
+	}
+	if err := os.WriteFile("plugin2-dup.so", so, 0444); err != nil {
+		log.Panic(err)
+	}
+	prettyPrintf("cp plugin2.so plugin2-dup.so\n")
+
+	goCmd(nil, "build", "-buildmode=plugin", "-o=sub/plugin1.so", "./sub/plugin1")
+	goCmd(nil, "build", "-buildmode=plugin", "-o=unnamed1.so", "./unnamed1/main.go")
+	goCmd(nil, "build", "-buildmode=plugin", "-o=unnamed2.so", "./unnamed2/main.go")
+	goCmd(nil, "build", "-o", "host.exe", "./host")
+
+	return m.Run()
+}
+
+func goCmd(t *testing.T, op string, args ...string) string {
+	if t != nil {
+		t.Helper()
+	}
+	var flags []string
+	if op != "tool" {
+		flags = []string{"-gcflags", gcflags}
+	}
+	return run(t, filepath.Join(goroot, "bin", "go"), append(append([]string{op}, flags...), args...)...)
+}
+
+// escape converts a string to something suitable for a shell command line.
+func escape(s string) string {
+	s = strings.Replace(s, "\\", "\\\\", -1)
+	s = strings.Replace(s, "'", "\\'", -1)
+	// Conservative guess at characters that will force quoting
+	if s == "" || strings.ContainsAny(s, "\\ ;#*&$~?!|[]()<>{}`") {
+		s = "'" + s + "'"
+	}
+	return s
+}
+
+// asCommandLine renders cmd as something that could be copy-and-pasted into a command line
+func asCommandLine(cwd string, cmd *exec.Cmd) string {
+	s := "("
+	if cmd.Dir != "" && cmd.Dir != cwd {
+		s += "cd" + escape(cmd.Dir) + ";"
+	}
+	for _, e := range cmd.Env {
+		if !strings.HasPrefix(e, "PATH=") &&
+			!strings.HasPrefix(e, "HOME=") &&
+			!strings.HasPrefix(e, "USER=") &&
+			!strings.HasPrefix(e, "SHELL=") {
+			s += " "
+			s += escape(e)
+		}
+	}
+	// These EVs are relevant to this test.
+	for _, e := range os.Environ() {
+		if strings.HasPrefix(e, "PWD=") ||
+			strings.HasPrefix(e, "GOPATH=") ||
+			strings.HasPrefix(e, "LD_LIBRARY_PATH=") {
+			s += " "
+			s += escape(e)
+		}
+	}
+	for _, a := range cmd.Args {
+		s += " "
+		s += escape(a)
+	}
+	s += " )"
+	return s
+}
+
+func run(t *testing.T, bin string, args ...string) string {
+	cmd := exec.Command(bin, args...)
+	cmdLine := asCommandLine(".", cmd)
+	prettyPrintf("%s\n", cmdLine)
+	cmd.Stderr = new(strings.Builder)
+	out, err := cmd.Output()
+	if err != nil {
+		if t == nil {
+			log.Panicf("%s: %v\n%s", strings.Join(cmd.Args, " "), err, cmd.Stderr)
+		} else {
+			t.Helper()
+			t.Fatalf("%s: %v\n%s", strings.Join(cmd.Args, " "), err, cmd.Stderr)
+		}
+	}
+
+	return string(bytes.TrimSpace(out))
+}
+
+func TestDWARFSections(t *testing.T) {
+	// test that DWARF sections are emitted for plugins and programs importing "plugin"
+	globalSkip(t)
+	goCmd(t, "run", "./checkdwarf/main.go", "plugin2.so", "plugin2.UnexportedNameReuse")
+	goCmd(t, "run", "./checkdwarf/main.go", "./host.exe", "main.main")
+}
+
+func TestBuildID(t *testing.T) {
+	// check that plugin has build ID.
+	globalSkip(t)
+	b := goCmd(t, "tool", "buildid", "plugin1.so")
+	if len(b) == 0 {
+		t.Errorf("build id not found")
+	}
+}
+
+func TestRunHost(t *testing.T) {
+	globalSkip(t)
+	run(t, "./host.exe")
+}
+
+func TestUniqueTypesAndItabs(t *testing.T) {
+	globalSkip(t)
+	goCmd(t, "build", "-buildmode=plugin", "./iface_a")
+	goCmd(t, "build", "-buildmode=plugin", "./iface_b")
+	goCmd(t, "build", "-o", "iface.exe", "./iface")
+	run(t, "./iface.exe")
+}
+
+func TestIssue18676(t *testing.T) {
+	// make sure we don't add the same itab twice.
+	// The buggy code hangs forever, so use a timeout to check for that.
+	globalSkip(t)
+	goCmd(t, "build", "-buildmode=plugin", "-o", "plugin.so", "./issue18676/plugin.go")
+	goCmd(t, "build", "-o", "issue18676.exe", "./issue18676/main.go")
+
+	ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
+	defer cancel()
+	cmd := exec.CommandContext(ctx, "./issue18676.exe")
+	out, err := cmd.CombinedOutput()
+	if err != nil {
+		t.Fatalf("%s: %v\n%s", strings.Join(cmd.Args, " "), err, out)
+	}
+}
+
+func TestIssue19534(t *testing.T) {
+	// Test that we can load a plugin built in a path with non-alpha characters.
+	globalSkip(t)
+	goCmd(t, "build", "-buildmode=plugin", "-gcflags=-p=issue.19534", "-ldflags=-pluginpath=issue.19534", "-o", "plugin.so", "./issue19534/plugin.go")
+	goCmd(t, "build", "-o", "issue19534.exe", "./issue19534/main.go")
+	run(t, "./issue19534.exe")
+}
+
+func TestIssue18584(t *testing.T) {
+	globalSkip(t)
+	goCmd(t, "build", "-buildmode=plugin", "-o", "plugin.so", "./issue18584/plugin.go")
+	goCmd(t, "build", "-o", "issue18584.exe", "./issue18584/main.go")
+	run(t, "./issue18584.exe")
+}
+
+func TestIssue19418(t *testing.T) {
+	globalSkip(t)
+	goCmd(t, "build", "-buildmode=plugin", "-ldflags=-X main.Val=linkstr", "-o", "plugin.so", "./issue19418/plugin.go")
+	goCmd(t, "build", "-o", "issue19418.exe", "./issue19418/main.go")
+	run(t, "./issue19418.exe")
+}
+
+func TestIssue19529(t *testing.T) {
+	globalSkip(t)
+	goCmd(t, "build", "-buildmode=plugin", "-o", "plugin.so", "./issue19529/plugin.go")
+}
+
+func TestIssue22175(t *testing.T) {
+	globalSkip(t)
+	goCmd(t, "build", "-buildmode=plugin", "-o", "issue22175_plugin1.so", "./issue22175/plugin1.go")
+	goCmd(t, "build", "-buildmode=plugin", "-o", "issue22175_plugin2.so", "./issue22175/plugin2.go")
+	goCmd(t, "build", "-o", "issue22175.exe", "./issue22175/main.go")
+	run(t, "./issue22175.exe")
+}
+
+func TestIssue22295(t *testing.T) {
+	globalSkip(t)
+	goCmd(t, "build", "-buildmode=plugin", "-o", "issue.22295.so", "./issue22295.pkg")
+	goCmd(t, "build", "-o", "issue22295.exe", "./issue22295.pkg/main.go")
+	run(t, "./issue22295.exe")
+}
+
+func TestIssue24351(t *testing.T) {
+	globalSkip(t)
+	goCmd(t, "build", "-buildmode=plugin", "-o", "issue24351.so", "./issue24351/plugin.go")
+	goCmd(t, "build", "-o", "issue24351.exe", "./issue24351/main.go")
+	run(t, "./issue24351.exe")
+}
+
+func TestIssue25756(t *testing.T) {
+	globalSkip(t)
+	goCmd(t, "build", "-buildmode=plugin", "-o", "life.so", "./issue25756/plugin")
+	goCmd(t, "build", "-o", "issue25756.exe", "./issue25756/main.go")
+	// Fails intermittently, but 20 runs should cause the failure
+	for n := 20; n > 0; n-- {
+		t.Run(fmt.Sprint(n), func(t *testing.T) {
+			t.Parallel()
+			run(t, "./issue25756.exe")
+		})
+	}
+}
+
+// Test with main using -buildmode=pie with plugin for issue #43228
+func TestIssue25756pie(t *testing.T) {
+	globalSkip(t)
+	goCmd(t, "build", "-buildmode=plugin", "-o", "life.so", "./issue25756/plugin")
+	goCmd(t, "build", "-buildmode=pie", "-o", "issue25756pie.exe", "./issue25756/main.go")
+	run(t, "./issue25756pie.exe")
+}
+
+func TestMethod(t *testing.T) {
+	// Exported symbol's method must be live.
+	globalSkip(t)
+	goCmd(t, "build", "-buildmode=plugin", "-o", "plugin.so", "./method/plugin.go")
+	goCmd(t, "build", "-o", "method.exe", "./method/main.go")
+	run(t, "./method.exe")
+}
+
+func TestMethod2(t *testing.T) {
+	globalSkip(t)
+	goCmd(t, "build", "-buildmode=plugin", "-o", "method2.so", "./method2/plugin.go")
+	goCmd(t, "build", "-o", "method2.exe", "./method2/main.go")
+	run(t, "./method2.exe")
+}
+
+func TestMethod3(t *testing.T) {
+	globalSkip(t)
+	goCmd(t, "build", "-buildmode=plugin", "-o", "method3.so", "./method3/plugin.go")
+	goCmd(t, "build", "-o", "method3.exe", "./method3/main.go")
+	run(t, "./method3.exe")
+}
+
+func TestIssue44956(t *testing.T) {
+	globalSkip(t)
+	goCmd(t, "build", "-buildmode=plugin", "-o", "issue44956p1.so", "./issue44956/plugin1.go")
+	goCmd(t, "build", "-buildmode=plugin", "-o", "issue44956p2.so", "./issue44956/plugin2.go")
+	goCmd(t, "build", "-o", "issue44956.exe", "./issue44956/main.go")
+	run(t, "./issue44956.exe")
+}
+
+func TestIssue52937(t *testing.T) {
+	globalSkip(t)
+	goCmd(t, "build", "-buildmode=plugin", "-o", "issue52937.so", "./issue52937/main.go")
+}
+
+func TestIssue53989(t *testing.T) {
+	globalSkip(t)
+	goCmd(t, "build", "-buildmode=plugin", "-o", "issue53989.so", "./issue53989/plugin.go")
+	goCmd(t, "build", "-o", "issue53989.exe", "./issue53989/main.go")
+	run(t, "./issue53989.exe")
+}
+
+func TestForkExec(t *testing.T) {
+	// Issue 38824: importing the plugin package causes it hang in forkExec on darwin.
+	globalSkip(t)
+
+	t.Parallel()
+	goCmd(t, "build", "-o", "forkexec.exe", "./forkexec/main.go")
+
+	var cmd *exec.Cmd
+	done := make(chan int, 1)
+
+	go func() {
+		for i := 0; i < 100; i++ {
+			cmd = exec.Command("./forkexec.exe", "1")
+			err := cmd.Run()
+			if err != nil {
+				t.Errorf("running command failed: %v", err)
+				break
+			}
+		}
+		done <- 1
+	}()
+	select {
+	case <-done:
+	case <-time.After(5 * time.Minute):
+		cmd.Process.Kill()
+		t.Fatalf("subprocess hang")
+	}
+}
+
+func TestSymbolNameMangle(t *testing.T) {
+	// Issue 58800: generic function name may contain weird characters
+	// that confuse the external linker.
+	// Issue 62098: the name mangling code doesn't handle some string
+	// symbols correctly.
+	globalSkip(t)
+	goCmd(t, "build", "-buildmode=plugin", "-o", "mangle.so", "./mangle/plugin.go")
+}
+
+func TestIssue62430(t *testing.T) {
+	globalSkip(t)
+	goCmd(t, "build", "-buildmode=plugin", "-o", "issue62430.so", "./issue62430/plugin.go")
+	goCmd(t, "build", "-o", "issue62430.exe", "./issue62430/main.go")
+	run(t, "./issue62430.exe")
+}
diff --git a/misc/cgo/testplugin/testdata/checkdwarf/main.go b/src/cmd/cgo/internal/testplugin/testdata/checkdwarf/main.go
similarity index 100%
rename from misc/cgo/testplugin/testdata/checkdwarf/main.go
rename to src/cmd/cgo/internal/testplugin/testdata/checkdwarf/main.go
diff --git a/misc/cgo/testplugin/testdata/common/common.go b/src/cmd/cgo/internal/testplugin/testdata/common/common.go
similarity index 100%
rename from misc/cgo/testplugin/testdata/common/common.go
rename to src/cmd/cgo/internal/testplugin/testdata/common/common.go
diff --git a/misc/cgo/testplugin/testdata/forkexec/main.go b/src/cmd/cgo/internal/testplugin/testdata/forkexec/main.go
similarity index 100%
rename from misc/cgo/testplugin/testdata/forkexec/main.go
rename to src/cmd/cgo/internal/testplugin/testdata/forkexec/main.go
diff --git a/misc/cgo/testplugin/testdata/host/host.go b/src/cmd/cgo/internal/testplugin/testdata/host/host.go
similarity index 100%
rename from misc/cgo/testplugin/testdata/host/host.go
rename to src/cmd/cgo/internal/testplugin/testdata/host/host.go
diff --git a/misc/cgo/testplugin/testdata/iface/main.go b/src/cmd/cgo/internal/testplugin/testdata/iface/main.go
similarity index 100%
rename from misc/cgo/testplugin/testdata/iface/main.go
rename to src/cmd/cgo/internal/testplugin/testdata/iface/main.go
diff --git a/misc/cgo/testplugin/testdata/iface_a/a.go b/src/cmd/cgo/internal/testplugin/testdata/iface_a/a.go
similarity index 100%
rename from misc/cgo/testplugin/testdata/iface_a/a.go
rename to src/cmd/cgo/internal/testplugin/testdata/iface_a/a.go
diff --git a/misc/cgo/testplugin/testdata/iface_b/b.go b/src/cmd/cgo/internal/testplugin/testdata/iface_b/b.go
similarity index 100%
rename from misc/cgo/testplugin/testdata/iface_b/b.go
rename to src/cmd/cgo/internal/testplugin/testdata/iface_b/b.go
diff --git a/misc/cgo/testplugin/testdata/iface_i/i.go b/src/cmd/cgo/internal/testplugin/testdata/iface_i/i.go
similarity index 100%
rename from misc/cgo/testplugin/testdata/iface_i/i.go
rename to src/cmd/cgo/internal/testplugin/testdata/iface_i/i.go
diff --git a/misc/cgo/testplugin/testdata/issue18584/main.go b/src/cmd/cgo/internal/testplugin/testdata/issue18584/main.go
similarity index 100%
rename from misc/cgo/testplugin/testdata/issue18584/main.go
rename to src/cmd/cgo/internal/testplugin/testdata/issue18584/main.go
diff --git a/misc/cgo/testplugin/testdata/issue18584/plugin.go b/src/cmd/cgo/internal/testplugin/testdata/issue18584/plugin.go
similarity index 100%
rename from misc/cgo/testplugin/testdata/issue18584/plugin.go
rename to src/cmd/cgo/internal/testplugin/testdata/issue18584/plugin.go
diff --git a/misc/cgo/testplugin/testdata/issue18676/dynamodbstreamsevt/definition.go b/src/cmd/cgo/internal/testplugin/testdata/issue18676/dynamodbstreamsevt/definition.go
similarity index 100%
rename from misc/cgo/testplugin/testdata/issue18676/dynamodbstreamsevt/definition.go
rename to src/cmd/cgo/internal/testplugin/testdata/issue18676/dynamodbstreamsevt/definition.go
diff --git a/src/cmd/cgo/internal/testplugin/testdata/issue18676/main.go b/src/cmd/cgo/internal/testplugin/testdata/issue18676/main.go
new file mode 100644
index 0000000..471f3d9
--- /dev/null
+++ b/src/cmd/cgo/internal/testplugin/testdata/issue18676/main.go
@@ -0,0 +1,32 @@
+// Copyright 2017 The Go 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 bug happened like this:
+//  1. The main binary adds an itab for *json.UnsupportedValueError / error
+//     (concrete type / interface type).  This itab goes in hash bucket 0x111.
+//  2. The plugin adds that same itab again.  That makes a cycle in the itab
+//     chain rooted at hash bucket 0x111.
+//  3. The main binary then asks for the itab for *dynamodbstreamsevt.Event /
+//     json.Unmarshaler.  This itab happens to also live in bucket 0x111.
+//     The lookup code goes into an infinite loop searching for this itab.
+//
+// The code is carefully crafted so that the two itabs are both from the
+// same bucket, and so that the second itab doesn't exist in
+// the itab hashmap yet (so the entire linked list must be searched).
+package main
+
+import (
+	"encoding/json"
+	"plugin"
+	"testplugin/issue18676/dynamodbstreamsevt"
+)
+
+func main() {
+	plugin.Open("plugin.so")
+
+	var x interface{} = (*dynamodbstreamsevt.Event)(nil)
+	if _, ok := x.(json.Unmarshaler); !ok {
+		println("something")
+	}
+}
diff --git a/misc/cgo/testplugin/testdata/issue18676/plugin.go b/src/cmd/cgo/internal/testplugin/testdata/issue18676/plugin.go
similarity index 100%
rename from misc/cgo/testplugin/testdata/issue18676/plugin.go
rename to src/cmd/cgo/internal/testplugin/testdata/issue18676/plugin.go
diff --git a/misc/cgo/testplugin/testdata/issue19418/main.go b/src/cmd/cgo/internal/testplugin/testdata/issue19418/main.go
similarity index 100%
rename from misc/cgo/testplugin/testdata/issue19418/main.go
rename to src/cmd/cgo/internal/testplugin/testdata/issue19418/main.go
diff --git a/misc/cgo/testplugin/testdata/issue19418/plugin.go b/src/cmd/cgo/internal/testplugin/testdata/issue19418/plugin.go
similarity index 100%
rename from misc/cgo/testplugin/testdata/issue19418/plugin.go
rename to src/cmd/cgo/internal/testplugin/testdata/issue19418/plugin.go
diff --git a/misc/cgo/testplugin/testdata/issue19529/plugin.go b/src/cmd/cgo/internal/testplugin/testdata/issue19529/plugin.go
similarity index 100%
rename from misc/cgo/testplugin/testdata/issue19529/plugin.go
rename to src/cmd/cgo/internal/testplugin/testdata/issue19529/plugin.go
diff --git a/misc/cgo/testplugin/testdata/issue19534/main.go b/src/cmd/cgo/internal/testplugin/testdata/issue19534/main.go
similarity index 100%
rename from misc/cgo/testplugin/testdata/issue19534/main.go
rename to src/cmd/cgo/internal/testplugin/testdata/issue19534/main.go
diff --git a/misc/cgo/testplugin/testdata/issue19534/plugin.go b/src/cmd/cgo/internal/testplugin/testdata/issue19534/plugin.go
similarity index 100%
rename from misc/cgo/testplugin/testdata/issue19534/plugin.go
rename to src/cmd/cgo/internal/testplugin/testdata/issue19534/plugin.go
diff --git a/misc/cgo/testplugin/testdata/issue22175/main.go b/src/cmd/cgo/internal/testplugin/testdata/issue22175/main.go
similarity index 100%
rename from misc/cgo/testplugin/testdata/issue22175/main.go
rename to src/cmd/cgo/internal/testplugin/testdata/issue22175/main.go
diff --git a/misc/cgo/testplugin/testdata/issue22175/plugin1.go b/src/cmd/cgo/internal/testplugin/testdata/issue22175/plugin1.go
similarity index 100%
rename from misc/cgo/testplugin/testdata/issue22175/plugin1.go
rename to src/cmd/cgo/internal/testplugin/testdata/issue22175/plugin1.go
diff --git a/misc/cgo/testplugin/testdata/issue22175/plugin2.go b/src/cmd/cgo/internal/testplugin/testdata/issue22175/plugin2.go
similarity index 100%
rename from misc/cgo/testplugin/testdata/issue22175/plugin2.go
rename to src/cmd/cgo/internal/testplugin/testdata/issue22175/plugin2.go
diff --git a/src/cmd/cgo/internal/testplugin/testdata/issue22295.pkg/main.go b/src/cmd/cgo/internal/testplugin/testdata/issue22295.pkg/main.go
new file mode 100644
index 0000000..44b2a21
--- /dev/null
+++ b/src/cmd/cgo/internal/testplugin/testdata/issue22295.pkg/main.go
@@ -0,0 +1,28 @@
+// Copyright 2017 The Go 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:build ignore
+
+package main
+
+import (
+	"log"
+	"plugin"
+)
+
+func main() {
+	p, err := plugin.Open("issue.22295.so")
+	if err != nil {
+		log.Fatal(err)
+	}
+	f, err := p.Lookup("F")
+	if err != nil {
+		log.Fatal(err)
+	}
+	const want = 2503
+	got := f.(func() int)()
+	if got != want {
+		log.Fatalf("got %d, want %d", got, want)
+	}
+}
diff --git a/misc/cgo/testplugin/testdata/issue22295.pkg/plugin.go b/src/cmd/cgo/internal/testplugin/testdata/issue22295.pkg/plugin.go
similarity index 100%
rename from misc/cgo/testplugin/testdata/issue22295.pkg/plugin.go
rename to src/cmd/cgo/internal/testplugin/testdata/issue22295.pkg/plugin.go
diff --git a/misc/cgo/testplugin/testdata/issue24351/main.go b/src/cmd/cgo/internal/testplugin/testdata/issue24351/main.go
similarity index 100%
rename from misc/cgo/testplugin/testdata/issue24351/main.go
rename to src/cmd/cgo/internal/testplugin/testdata/issue24351/main.go
diff --git a/misc/cgo/testplugin/testdata/issue24351/plugin.go b/src/cmd/cgo/internal/testplugin/testdata/issue24351/plugin.go
similarity index 100%
rename from misc/cgo/testplugin/testdata/issue24351/plugin.go
rename to src/cmd/cgo/internal/testplugin/testdata/issue24351/plugin.go
diff --git a/misc/cgo/testplugin/testdata/issue25756/main.go b/src/cmd/cgo/internal/testplugin/testdata/issue25756/main.go
similarity index 100%
rename from misc/cgo/testplugin/testdata/issue25756/main.go
rename to src/cmd/cgo/internal/testplugin/testdata/issue25756/main.go
diff --git a/misc/cgo/testplugin/testdata/issue25756/plugin/c-life.c b/src/cmd/cgo/internal/testplugin/testdata/issue25756/plugin/c-life.c
similarity index 100%
rename from misc/cgo/testplugin/testdata/issue25756/plugin/c-life.c
rename to src/cmd/cgo/internal/testplugin/testdata/issue25756/plugin/c-life.c
diff --git a/src/cmd/cgo/internal/testplugin/testdata/issue25756/plugin/life.go b/src/cmd/cgo/internal/testplugin/testdata/issue25756/plugin/life.go
new file mode 100644
index 0000000..468bc6f
--- /dev/null
+++ b/src/cmd/cgo/internal/testplugin/testdata/issue25756/plugin/life.go
@@ -0,0 +1,40 @@
+// 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
+
+// #include "life.h"
+import "C"
+
+import "unsafe"
+
+func Run(gen, x, y int, a []int32) {
+	n := make([]int32, x*y)
+	for i := 0; i < gen; i++ {
+		C.Step(C.int(x), C.int(y), (*C.int)(unsafe.Pointer(&a[0])), (*C.int)(unsafe.Pointer(&n[0])))
+		copy(a, n)
+	}
+}
+
+// Keep the channels visible from Go.
+var chans [4]chan bool
+
+// Double return value is just for testing.
+//
+//export GoStart
+func GoStart(i, xdim, ydim, xstart, xend, ystart, yend C.int, a *C.int, n *C.int) (int, int) {
+	c := make(chan bool, int(C.MYCONST))
+	go func() {
+		C.DoStep(xdim, ydim, xstart, xend, ystart, yend, a, n)
+		c <- true
+	}()
+	chans[i] = c
+	return int(i), int(i + 100)
+}
+
+//export GoWait
+func GoWait(i C.int) {
+	<-chans[i]
+	chans[i] = nil
+}
diff --git a/misc/cgo/testplugin/testdata/issue25756/plugin/life.h b/src/cmd/cgo/internal/testplugin/testdata/issue25756/plugin/life.h
similarity index 100%
rename from misc/cgo/testplugin/testdata/issue25756/plugin/life.h
rename to src/cmd/cgo/internal/testplugin/testdata/issue25756/plugin/life.h
diff --git a/misc/cgo/testplugin/testdata/issue44956/base/base.go b/src/cmd/cgo/internal/testplugin/testdata/issue44956/base/base.go
similarity index 100%
rename from misc/cgo/testplugin/testdata/issue44956/base/base.go
rename to src/cmd/cgo/internal/testplugin/testdata/issue44956/base/base.go
diff --git a/misc/cgo/testplugin/testdata/issue44956/main.go b/src/cmd/cgo/internal/testplugin/testdata/issue44956/main.go
similarity index 100%
rename from misc/cgo/testplugin/testdata/issue44956/main.go
rename to src/cmd/cgo/internal/testplugin/testdata/issue44956/main.go
diff --git a/misc/cgo/testplugin/testdata/issue44956/plugin1.go b/src/cmd/cgo/internal/testplugin/testdata/issue44956/plugin1.go
similarity index 100%
rename from misc/cgo/testplugin/testdata/issue44956/plugin1.go
rename to src/cmd/cgo/internal/testplugin/testdata/issue44956/plugin1.go
diff --git a/misc/cgo/testplugin/testdata/issue44956/plugin2.go b/src/cmd/cgo/internal/testplugin/testdata/issue44956/plugin2.go
similarity index 100%
rename from misc/cgo/testplugin/testdata/issue44956/plugin2.go
rename to src/cmd/cgo/internal/testplugin/testdata/issue44956/plugin2.go
diff --git a/misc/cgo/testplugin/testdata/issue52937/main.go b/src/cmd/cgo/internal/testplugin/testdata/issue52937/main.go
similarity index 100%
rename from misc/cgo/testplugin/testdata/issue52937/main.go
rename to src/cmd/cgo/internal/testplugin/testdata/issue52937/main.go
diff --git a/misc/cgo/testplugin/testdata/issue53989/main.go b/src/cmd/cgo/internal/testplugin/testdata/issue53989/main.go
similarity index 100%
rename from misc/cgo/testplugin/testdata/issue53989/main.go
rename to src/cmd/cgo/internal/testplugin/testdata/issue53989/main.go
diff --git a/misc/cgo/testplugin/testdata/issue53989/p/p.go b/src/cmd/cgo/internal/testplugin/testdata/issue53989/p/p.go
similarity index 100%
rename from misc/cgo/testplugin/testdata/issue53989/p/p.go
rename to src/cmd/cgo/internal/testplugin/testdata/issue53989/p/p.go
diff --git a/misc/cgo/testplugin/testdata/issue53989/plugin.go b/src/cmd/cgo/internal/testplugin/testdata/issue53989/plugin.go
similarity index 100%
rename from misc/cgo/testplugin/testdata/issue53989/plugin.go
rename to src/cmd/cgo/internal/testplugin/testdata/issue53989/plugin.go
diff --git a/src/cmd/cgo/internal/testplugin/testdata/issue62430/main.go b/src/cmd/cgo/internal/testplugin/testdata/issue62430/main.go
new file mode 100644
index 0000000..8010840
--- /dev/null
+++ b/src/cmd/cgo/internal/testplugin/testdata/issue62430/main.go
@@ -0,0 +1,35 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Issue 62430: a program that uses plugins may appear
+// to have no references to an initialized global map variable defined
+// in some stdlib package (ex: unicode), however there
+// may be references to that map var from a plugin that
+// gets loaded.
+
+package main
+
+import (
+	"fmt"
+	"plugin"
+	"unicode"
+)
+
+func main() {
+	p, err := plugin.Open("issue62430.so")
+	if err != nil {
+		panic(err)
+	}
+	s, err := p.Lookup("F")
+	if err != nil {
+		panic(err)
+	}
+
+	f := s.(func(string) *unicode.RangeTable)
+	if f("C") == nil {
+		panic("unicode.Categories not properly initialized")
+	} else {
+		fmt.Println("unicode.Categories properly initialized")
+	}
+}
diff --git a/src/cmd/cgo/internal/testplugin/testdata/issue62430/plugin.go b/src/cmd/cgo/internal/testplugin/testdata/issue62430/plugin.go
new file mode 100644
index 0000000..e42cd8b
--- /dev/null
+++ b/src/cmd/cgo/internal/testplugin/testdata/issue62430/plugin.go
@@ -0,0 +1,11 @@
+package main
+
+import (
+	"unicode"
+)
+
+func F(s string) *unicode.RangeTable {
+	return unicode.Categories[s]
+}
+
+func main() {}
diff --git a/src/cmd/cgo/internal/testplugin/testdata/mangle/plugin.go b/src/cmd/cgo/internal/testplugin/testdata/mangle/plugin.go
new file mode 100644
index 0000000..e1ccb70
--- /dev/null
+++ b/src/cmd/cgo/internal/testplugin/testdata/mangle/plugin.go
@@ -0,0 +1,38 @@
+// Copyright 2023 The Go 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 symbol name mangling.
+
+package main
+
+import (
+	"fmt"
+	"strings"
+)
+
+// Issue 58800:
+// Instantiated function name may contain weird characters
+// that confuse the external linker, so it needs to be
+// mangled.
+type S struct {
+	X int `parser:"|@@)"`
+}
+
+//go:noinline
+func F[T any]() {}
+
+func P() {
+	F[S]()
+}
+
+// Issue 62098: the name mangling code doesn't handle some string
+// symbols correctly.
+func G(id string) error {
+	if strings.ContainsAny(id, "&$@;/:+,?\\{^}%`]\">[~<#|") {
+		return fmt.Errorf("invalid")
+	}
+	return nil
+}
+
+func main() {}
diff --git a/misc/cgo/testplugin/testdata/method/main.go b/src/cmd/cgo/internal/testplugin/testdata/method/main.go
similarity index 100%
rename from misc/cgo/testplugin/testdata/method/main.go
rename to src/cmd/cgo/internal/testplugin/testdata/method/main.go
diff --git a/misc/cgo/testplugin/testdata/method/plugin.go b/src/cmd/cgo/internal/testplugin/testdata/method/plugin.go
similarity index 100%
rename from misc/cgo/testplugin/testdata/method/plugin.go
rename to src/cmd/cgo/internal/testplugin/testdata/method/plugin.go
diff --git a/misc/cgo/testplugin/testdata/method2/main.go b/src/cmd/cgo/internal/testplugin/testdata/method2/main.go
similarity index 100%
rename from misc/cgo/testplugin/testdata/method2/main.go
rename to src/cmd/cgo/internal/testplugin/testdata/method2/main.go
diff --git a/misc/cgo/testplugin/testdata/method2/p/p.go b/src/cmd/cgo/internal/testplugin/testdata/method2/p/p.go
similarity index 100%
rename from misc/cgo/testplugin/testdata/method2/p/p.go
rename to src/cmd/cgo/internal/testplugin/testdata/method2/p/p.go
diff --git a/misc/cgo/testplugin/testdata/method2/plugin.go b/src/cmd/cgo/internal/testplugin/testdata/method2/plugin.go
similarity index 100%
rename from misc/cgo/testplugin/testdata/method2/plugin.go
rename to src/cmd/cgo/internal/testplugin/testdata/method2/plugin.go
diff --git a/misc/cgo/testplugin/testdata/method3/main.go b/src/cmd/cgo/internal/testplugin/testdata/method3/main.go
similarity index 100%
rename from misc/cgo/testplugin/testdata/method3/main.go
rename to src/cmd/cgo/internal/testplugin/testdata/method3/main.go
diff --git a/src/cmd/cgo/internal/testplugin/testdata/method3/p/p.go b/src/cmd/cgo/internal/testplugin/testdata/method3/p/p.go
new file mode 100644
index 0000000..f72f7c7
--- /dev/null
+++ b/src/cmd/cgo/internal/testplugin/testdata/method3/p/p.go
@@ -0,0 +1,17 @@
+// Copyright 2022 The Go Authors. 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 T int
+
+func (T) m() { println("m") }
+
+type I interface{ m() }
+
+func F() {
+	i.m()
+}
+
+var i I = T(123)
diff --git a/misc/cgo/testplugin/testdata/method3/plugin.go b/src/cmd/cgo/internal/testplugin/testdata/method3/plugin.go
similarity index 100%
rename from misc/cgo/testplugin/testdata/method3/plugin.go
rename to src/cmd/cgo/internal/testplugin/testdata/method3/plugin.go
diff --git a/misc/cgo/testplugin/testdata/plugin1/plugin1.go b/src/cmd/cgo/internal/testplugin/testdata/plugin1/plugin1.go
similarity index 100%
rename from misc/cgo/testplugin/testdata/plugin1/plugin1.go
rename to src/cmd/cgo/internal/testplugin/testdata/plugin1/plugin1.go
diff --git a/misc/cgo/testplugin/testdata/plugin2/plugin2.go b/src/cmd/cgo/internal/testplugin/testdata/plugin2/plugin2.go
similarity index 100%
rename from misc/cgo/testplugin/testdata/plugin2/plugin2.go
rename to src/cmd/cgo/internal/testplugin/testdata/plugin2/plugin2.go
diff --git a/misc/cgo/testplugin/testdata/sub/plugin1/plugin1.go b/src/cmd/cgo/internal/testplugin/testdata/sub/plugin1/plugin1.go
similarity index 100%
rename from misc/cgo/testplugin/testdata/sub/plugin1/plugin1.go
rename to src/cmd/cgo/internal/testplugin/testdata/sub/plugin1/plugin1.go
diff --git a/src/cmd/cgo/internal/testplugin/testdata/unnamed1/main.go b/src/cmd/cgo/internal/testplugin/testdata/unnamed1/main.go
new file mode 100644
index 0000000..1620dc4
--- /dev/null
+++ b/src/cmd/cgo/internal/testplugin/testdata/unnamed1/main.go
@@ -0,0 +1,25 @@
+// Copyright 2016 The Go 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:build ignore
+
+package main
+
+// // No C code required.
+import "C"
+
+func FuncInt() int { return 1 }
+
+// Add a recursive type to check that type equality across plugins doesn't
+// crash. See https://golang.org/issues/19258
+func FuncRecursive() X { return X{} }
+
+type Y struct {
+	X *X
+}
+type X struct {
+	Y Y
+}
+
+func main() {}
diff --git a/src/cmd/cgo/internal/testplugin/testdata/unnamed2/main.go b/src/cmd/cgo/internal/testplugin/testdata/unnamed2/main.go
new file mode 100644
index 0000000..027ef64
--- /dev/null
+++ b/src/cmd/cgo/internal/testplugin/testdata/unnamed2/main.go
@@ -0,0 +1,23 @@
+// Copyright 2016 The Go 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:build ignore
+
+package main
+
+// // No C code required.
+import "C"
+
+func FuncInt() int { return 2 }
+
+func FuncRecursive() X { return X{} }
+
+type Y struct {
+	X *X
+}
+type X struct {
+	Y Y
+}
+
+func main() {}
diff --git a/src/cmd/cgo/internal/testsanitizers/asan_test.go b/src/cmd/cgo/internal/testsanitizers/asan_test.go
new file mode 100644
index 0000000..7db3562
--- /dev/null
+++ b/src/cmd/cgo/internal/testsanitizers/asan_test.go
@@ -0,0 +1,149 @@
+// Copyright 2021 The Go 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:build linux || (freebsd && amd64)
+
+package sanitizers_test
+
+import (
+	"fmt"
+	"internal/platform"
+	"internal/testenv"
+	"strings"
+	"testing"
+)
+
+func TestASAN(t *testing.T) {
+	testenv.MustHaveGoBuild(t)
+	testenv.MustHaveCGO(t)
+	goos, err := goEnv("GOOS")
+	if err != nil {
+		t.Fatal(err)
+	}
+	goarch, err := goEnv("GOARCH")
+	if err != nil {
+		t.Fatal(err)
+	}
+	// The asan tests require support for the -asan option.
+	if !platform.ASanSupported(goos, goarch) {
+		t.Skipf("skipping on %s/%s; -asan option is not supported.", goos, goarch)
+	}
+	// The current implementation is only compatible with the ASan library from version
+	// v7 to v9 (See the description in src/runtime/asan/asan.go). Therefore, using the
+	// -asan option must use a compatible version of ASan library, which requires that
+	// the gcc version is not less than 7 and the clang version is not less than 9,
+	// otherwise a segmentation fault will occur.
+	if !compilerRequiredAsanVersion(goos, goarch) {
+		t.Skipf("skipping on %s/%s: too old version of compiler", goos, goarch)
+	}
+
+	t.Parallel()
+	requireOvercommit(t)
+	config := configure("address")
+	config.skipIfCSanitizerBroken(t)
+
+	mustRun(t, config.goCmd("build", "std"))
+
+	cases := []struct {
+		src               string
+		memoryAccessError string
+		errorLocation     string
+		experiments       []string
+	}{
+		{src: "asan1_fail.go", memoryAccessError: "heap-use-after-free", errorLocation: "asan1_fail.go:25"},
+		{src: "asan2_fail.go", memoryAccessError: "heap-buffer-overflow", errorLocation: "asan2_fail.go:31"},
+		{src: "asan3_fail.go", memoryAccessError: "use-after-poison", errorLocation: "asan3_fail.go:13"},
+		{src: "asan4_fail.go", memoryAccessError: "use-after-poison", errorLocation: "asan4_fail.go:13"},
+		{src: "asan5_fail.go", memoryAccessError: "use-after-poison", errorLocation: "asan5_fail.go:18"},
+		{src: "asan_useAfterReturn.go"},
+		{src: "asan_unsafe_fail1.go", memoryAccessError: "use-after-poison", errorLocation: "asan_unsafe_fail1.go:25"},
+		{src: "asan_unsafe_fail2.go", memoryAccessError: "use-after-poison", errorLocation: "asan_unsafe_fail2.go:25"},
+		{src: "asan_unsafe_fail3.go", memoryAccessError: "use-after-poison", errorLocation: "asan_unsafe_fail3.go:18"},
+		{src: "asan_global1_fail.go", memoryAccessError: "global-buffer-overflow", errorLocation: "asan_global1_fail.go:12"},
+		{src: "asan_global2_fail.go", memoryAccessError: "global-buffer-overflow", errorLocation: "asan_global2_fail.go:19"},
+		{src: "asan_global3_fail.go", memoryAccessError: "global-buffer-overflow", errorLocation: "asan_global3_fail.go:13"},
+		{src: "asan_global4_fail.go", memoryAccessError: "global-buffer-overflow", errorLocation: "asan_global4_fail.go:21"},
+		{src: "asan_global5.go"},
+		{src: "arena_fail.go", memoryAccessError: "use-after-poison", errorLocation: "arena_fail.go:26", experiments: []string{"arenas"}},
+	}
+	for _, tc := range cases {
+		tc := tc
+		name := strings.TrimSuffix(tc.src, ".go")
+		t.Run(name, func(t *testing.T) {
+			t.Parallel()
+
+			dir := newTempDir(t)
+			defer dir.RemoveAll(t)
+
+			outPath := dir.Join(name)
+			mustRun(t, config.goCmdWithExperiments("build", []string{"-o", outPath, srcPath(tc.src)}, tc.experiments))
+
+			cmd := hangProneCmd(outPath)
+			if tc.memoryAccessError != "" {
+				outb, err := cmd.CombinedOutput()
+				out := string(outb)
+				if err != nil && strings.Contains(out, tc.memoryAccessError) {
+					// This string is output if the
+					// sanitizer library needs a
+					// symbolizer program and can't find it.
+					const noSymbolizer = "external symbolizer"
+					// Check if -asan option can correctly print where the error occurred.
+					if tc.errorLocation != "" &&
+						!strings.Contains(out, tc.errorLocation) &&
+						!strings.Contains(out, noSymbolizer) &&
+						compilerSupportsLocation() {
+
+						t.Errorf("%#q exited without expected location of the error\n%s; got failure\n%s", strings.Join(cmd.Args, " "), tc.errorLocation, out)
+					}
+					return
+				}
+				t.Fatalf("%#q exited without expected memory access error\n%s; got failure\n%s", strings.Join(cmd.Args, " "), tc.memoryAccessError, out)
+			}
+			mustRun(t, cmd)
+		})
+	}
+}
+
+func TestASANLinkerX(t *testing.T) {
+	testenv.MustHaveGoBuild(t)
+	testenv.MustHaveCGO(t)
+	// Test ASAN with linker's -X flag (see issue 56175).
+	goos, err := goEnv("GOOS")
+	if err != nil {
+		t.Fatal(err)
+	}
+	goarch, err := goEnv("GOARCH")
+	if err != nil {
+		t.Fatal(err)
+	}
+	// The asan tests require support for the -asan option.
+	if !platform.ASanSupported(goos, goarch) {
+		t.Skipf("skipping on %s/%s; -asan option is not supported.", goos, goarch)
+	}
+	if !compilerRequiredAsanVersion(goos, goarch) {
+		t.Skipf("skipping on %s/%s: too old version of compiler", goos, goarch)
+	}
+
+	t.Parallel()
+	requireOvercommit(t)
+	config := configure("address")
+	config.skipIfCSanitizerBroken(t)
+
+	dir := newTempDir(t)
+	defer dir.RemoveAll(t)
+
+	var ldflags string
+	for i := 1; i <= 10; i++ {
+		ldflags += fmt.Sprintf("-X=main.S%d=%d -X=cmd/cgo/internal/testsanitizers/testdata/asan_linkerx/p.S%d=%d ", i, i, i, i)
+	}
+
+	// build the binary
+	outPath := dir.Join("main.exe")
+	cmd := config.goCmd("build", "-ldflags="+ldflags, "-o", outPath)
+	cmd.Dir = srcPath("asan_linkerx")
+	mustRun(t, cmd)
+
+	// run the binary
+	mustRun(t, hangProneCmd(outPath))
+}
diff --git a/src/cmd/cgo/internal/testsanitizers/cc_test.go b/src/cmd/cgo/internal/testsanitizers/cc_test.go
new file mode 100644
index 0000000..6eb5a64
--- /dev/null
+++ b/src/cmd/cgo/internal/testsanitizers/cc_test.go
@@ -0,0 +1,564 @@
+// Copyright 2017 The Go 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 uses the Pdeathsig field of syscall.SysProcAttr, so it only works
+// on platforms that support that.
+
+//go:build linux || (freebsd && amd64)
+
+// sanitizers_test checks the use of Go with sanitizers like msan, asan, etc.
+// See https://github.com/google/sanitizers.
+package sanitizers_test
+
+import (
+	"bytes"
+	"encoding/json"
+	"errors"
+	"fmt"
+	"os"
+	"os/exec"
+	"path/filepath"
+	"regexp"
+	"strconv"
+	"strings"
+	"sync"
+	"syscall"
+	"testing"
+	"time"
+	"unicode"
+)
+
+var overcommit struct {
+	sync.Once
+	value int
+	err   error
+}
+
+// requireOvercommit skips t if the kernel does not allow overcommit.
+func requireOvercommit(t *testing.T) {
+	t.Helper()
+
+	overcommit.Once.Do(func() {
+		var out []byte
+		out, overcommit.err = os.ReadFile("/proc/sys/vm/overcommit_memory")
+		if overcommit.err != nil {
+			return
+		}
+		overcommit.value, overcommit.err = strconv.Atoi(string(bytes.TrimSpace(out)))
+	})
+
+	if overcommit.err != nil {
+		t.Skipf("couldn't determine vm.overcommit_memory (%v); assuming no overcommit", overcommit.err)
+	}
+	if overcommit.value == 2 {
+		t.Skip("vm.overcommit_memory=2")
+	}
+}
+
+var env struct {
+	sync.Once
+	m   map[string]string
+	err error
+}
+
+// goEnv returns the output of $(go env) as a map.
+func goEnv(key string) (string, error) {
+	env.Once.Do(func() {
+		var out []byte
+		out, env.err = exec.Command("go", "env", "-json").Output()
+		if env.err != nil {
+			return
+		}
+
+		env.m = make(map[string]string)
+		env.err = json.Unmarshal(out, &env.m)
+	})
+	if env.err != nil {
+		return "", env.err
+	}
+
+	v, ok := env.m[key]
+	if !ok {
+		return "", fmt.Errorf("`go env`: no entry for %v", key)
+	}
+	return v, nil
+}
+
+// replaceEnv sets the key environment variable to value in cmd.
+func replaceEnv(cmd *exec.Cmd, key, value string) {
+	if cmd.Env == nil {
+		cmd.Env = cmd.Environ()
+	}
+	cmd.Env = append(cmd.Env, key+"="+value)
+}
+
+// appendExperimentEnv appends comma-separated experiments to GOEXPERIMENT.
+func appendExperimentEnv(cmd *exec.Cmd, experiments []string) {
+	if cmd.Env == nil {
+		cmd.Env = cmd.Environ()
+	}
+	exps := strings.Join(experiments, ",")
+	for _, evar := range cmd.Env {
+		c := strings.SplitN(evar, "=", 2)
+		if c[0] == "GOEXPERIMENT" {
+			exps = c[1] + "," + exps
+		}
+	}
+	cmd.Env = append(cmd.Env, "GOEXPERIMENT="+exps)
+}
+
+// mustRun executes t and fails cmd with a well-formatted message if it fails.
+func mustRun(t *testing.T, cmd *exec.Cmd) {
+	t.Helper()
+	out := new(strings.Builder)
+	cmd.Stdout = out
+	cmd.Stderr = out
+
+	err := cmd.Start()
+	if err != nil {
+		t.Fatalf("%v: %v", cmd, err)
+	}
+
+	if deadline, ok := t.Deadline(); ok {
+		timeout := time.Until(deadline)
+		timeout -= timeout / 10 // Leave 10% headroom for logging and cleanup.
+		timer := time.AfterFunc(timeout, func() {
+			cmd.Process.Signal(syscall.SIGQUIT)
+		})
+		defer timer.Stop()
+	}
+
+	if err := cmd.Wait(); err != nil {
+		t.Fatalf("%v exited with %v\n%s", cmd, err, out)
+	}
+}
+
+// cc returns a cmd that executes `$(go env CC) $(go env GOGCCFLAGS) $args`.
+func cc(args ...string) (*exec.Cmd, error) {
+	CC, err := goEnv("CC")
+	if err != nil {
+		return nil, err
+	}
+
+	GOGCCFLAGS, err := goEnv("GOGCCFLAGS")
+	if err != nil {
+		return nil, err
+	}
+
+	// Split GOGCCFLAGS, respecting quoting.
+	//
+	// TODO(bcmills): This code also appears in
+	// cmd/cgo/internal/testcarchive/carchive_test.go, and perhaps ought to go in
+	// src/cmd/dist/test.go as well. Figure out where to put it so that it can be
+	// shared.
+	var flags []string
+	quote := '\000'
+	start := 0
+	lastSpace := true
+	backslash := false
+	for i, c := range GOGCCFLAGS {
+		if quote == '\000' && unicode.IsSpace(c) {
+			if !lastSpace {
+				flags = append(flags, GOGCCFLAGS[start:i])
+				lastSpace = true
+			}
+		} else {
+			if lastSpace {
+				start = i
+				lastSpace = false
+			}
+			if quote == '\000' && !backslash && (c == '"' || c == '\'') {
+				quote = c
+				backslash = false
+			} else if !backslash && quote == c {
+				quote = '\000'
+			} else if (quote == '\000' || quote == '"') && !backslash && c == '\\' {
+				backslash = true
+			} else {
+				backslash = false
+			}
+		}
+	}
+	if !lastSpace {
+		flags = append(flags, GOGCCFLAGS[start:])
+	}
+
+	cmd := exec.Command(CC, flags...)
+	cmd.Args = append(cmd.Args, args...)
+	return cmd, nil
+}
+
+type version struct {
+	name         string
+	major, minor int
+}
+
+var compiler struct {
+	sync.Once
+	version
+	err error
+}
+
+// compilerVersion detects the version of $(go env CC).
+//
+// It returns a non-nil error if the compiler matches a known version schema but
+// the version could not be parsed, or if $(go env CC) could not be determined.
+func compilerVersion() (version, error) {
+	compiler.Once.Do(func() {
+		compiler.err = func() error {
+			compiler.name = "unknown"
+
+			cmd, err := cc("--version")
+			if err != nil {
+				return err
+			}
+			out, err := cmd.Output()
+			if err != nil {
+				// Compiler does not support "--version" flag: not Clang or GCC.
+				return nil
+			}
+
+			var match [][]byte
+			if bytes.HasPrefix(out, []byte("gcc")) {
+				compiler.name = "gcc"
+				cmd, err := cc("-dumpfullversion", "-dumpversion")
+				if err != nil {
+					return err
+				}
+				out, err := cmd.Output()
+				if err != nil {
+					// gcc, but does not support gcc's "-v" flag?!
+					return err
+				}
+				gccRE := regexp.MustCompile(`(\d+)\.(\d+)`)
+				match = gccRE.FindSubmatch(out)
+			} else {
+				clangRE := regexp.MustCompile(`clang version (\d+)\.(\d+)`)
+				if match = clangRE.FindSubmatch(out); len(match) > 0 {
+					compiler.name = "clang"
+				}
+			}
+
+			if len(match) < 3 {
+				return nil // "unknown"
+			}
+			if compiler.major, err = strconv.Atoi(string(match[1])); err != nil {
+				return err
+			}
+			if compiler.minor, err = strconv.Atoi(string(match[2])); err != nil {
+				return err
+			}
+			return nil
+		}()
+	})
+	return compiler.version, compiler.err
+}
+
+// compilerSupportsLocation reports whether the compiler should be
+// able to provide file/line information in backtraces.
+func compilerSupportsLocation() bool {
+	compiler, err := compilerVersion()
+	if err != nil {
+		return false
+	}
+	switch compiler.name {
+	case "gcc":
+		return compiler.major >= 10
+	case "clang":
+		return true
+	default:
+		return false
+	}
+}
+
+// compilerRequiredTsanVersion reports whether the compiler is the version required by Tsan.
+// Only restrictions for ppc64le are known; otherwise return true.
+func compilerRequiredTsanVersion(goos, goarch string) bool {
+	compiler, err := compilerVersion()
+	if err != nil {
+		return false
+	}
+	if compiler.name == "gcc" && goarch == "ppc64le" {
+		return compiler.major >= 9
+	}
+	return true
+}
+
+// compilerRequiredAsanVersion reports whether the compiler is the version required by Asan.
+func compilerRequiredAsanVersion(goos, goarch string) bool {
+	compiler, err := compilerVersion()
+	if err != nil {
+		return false
+	}
+	switch compiler.name {
+	case "gcc":
+		if goarch == "ppc64le" {
+			return compiler.major >= 9
+		}
+		return compiler.major >= 7
+	case "clang":
+		return compiler.major >= 9
+	default:
+		return false
+	}
+}
+
+type compilerCheck struct {
+	once sync.Once
+	err  error
+	skip bool // If true, skip with err instead of failing with it.
+}
+
+type config struct {
+	sanitizer string
+
+	cFlags, ldFlags, goFlags []string
+
+	sanitizerCheck, runtimeCheck compilerCheck
+}
+
+var configs struct {
+	sync.Mutex
+	m map[string]*config
+}
+
+// configure returns the configuration for the given sanitizer.
+func configure(sanitizer string) *config {
+	configs.Lock()
+	defer configs.Unlock()
+	if c, ok := configs.m[sanitizer]; ok {
+		return c
+	}
+
+	c := &config{
+		sanitizer: sanitizer,
+		cFlags:    []string{"-fsanitize=" + sanitizer},
+		ldFlags:   []string{"-fsanitize=" + sanitizer},
+	}
+
+	if testing.Verbose() {
+		c.goFlags = append(c.goFlags, "-x")
+	}
+
+	switch sanitizer {
+	case "memory":
+		c.goFlags = append(c.goFlags, "-msan")
+
+	case "thread":
+		c.goFlags = append(c.goFlags, "--installsuffix=tsan")
+		compiler, _ := compilerVersion()
+		if compiler.name == "gcc" {
+			c.cFlags = append(c.cFlags, "-fPIC")
+			c.ldFlags = append(c.ldFlags, "-fPIC", "-static-libtsan")
+		}
+
+	case "address":
+		c.goFlags = append(c.goFlags, "-asan")
+		// Set the debug mode to print the C stack trace.
+		c.cFlags = append(c.cFlags, "-g")
+
+	case "fuzzer":
+		c.goFlags = append(c.goFlags, "-tags=libfuzzer", "-gcflags=-d=libfuzzer")
+
+	default:
+		panic(fmt.Sprintf("unrecognized sanitizer: %q", sanitizer))
+	}
+
+	if configs.m == nil {
+		configs.m = make(map[string]*config)
+	}
+	configs.m[sanitizer] = c
+	return c
+}
+
+// goCmd returns a Cmd that executes "go $subcommand $args" with appropriate
+// additional flags and environment.
+func (c *config) goCmd(subcommand string, args ...string) *exec.Cmd {
+	return c.goCmdWithExperiments(subcommand, args, nil)
+}
+
+// goCmdWithExperiments returns a Cmd that executes
+// "GOEXPERIMENT=$experiments go $subcommand $args" with appropriate
+// additional flags and CGO-related environment variables.
+func (c *config) goCmdWithExperiments(subcommand string, args []string, experiments []string) *exec.Cmd {
+	cmd := exec.Command("go", subcommand)
+	cmd.Args = append(cmd.Args, c.goFlags...)
+	cmd.Args = append(cmd.Args, args...)
+	replaceEnv(cmd, "CGO_CFLAGS", strings.Join(c.cFlags, " "))
+	replaceEnv(cmd, "CGO_LDFLAGS", strings.Join(c.ldFlags, " "))
+	appendExperimentEnv(cmd, experiments)
+	return cmd
+}
+
+// skipIfCSanitizerBroken skips t if the C compiler does not produce working
+// binaries as configured.
+func (c *config) skipIfCSanitizerBroken(t *testing.T) {
+	check := &c.sanitizerCheck
+	check.once.Do(func() {
+		check.skip, check.err = c.checkCSanitizer()
+	})
+	if check.err != nil {
+		t.Helper()
+		if check.skip {
+			t.Skip(check.err)
+		}
+		t.Fatal(check.err)
+	}
+}
+
+var cMain = []byte(`
+int main() {
+	return 0;
+}
+`)
+
+var cLibFuzzerInput = []byte(`
+#include <stddef.h>
+int LLVMFuzzerTestOneInput(char *data, size_t size) {
+	return 0;
+}
+`)
+
+func (c *config) checkCSanitizer() (skip bool, err error) {
+	dir, err := os.MkdirTemp("", c.sanitizer)
+	if err != nil {
+		return false, fmt.Errorf("failed to create temp directory: %v", err)
+	}
+	defer os.RemoveAll(dir)
+
+	src := filepath.Join(dir, "return0.c")
+	cInput := cMain
+	if c.sanitizer == "fuzzer" {
+		// libFuzzer generates the main function itself, and uses a different input.
+		cInput = cLibFuzzerInput
+	}
+	if err := os.WriteFile(src, cInput, 0600); err != nil {
+		return false, fmt.Errorf("failed to write C source file: %v", err)
+	}
+
+	dst := filepath.Join(dir, "return0")
+	cmd, err := cc(c.cFlags...)
+	if err != nil {
+		return false, err
+	}
+	cmd.Args = append(cmd.Args, c.ldFlags...)
+	cmd.Args = append(cmd.Args, "-o", dst, src)
+	out, err := cmd.CombinedOutput()
+	if err != nil {
+		if bytes.Contains(out, []byte("-fsanitize")) &&
+			(bytes.Contains(out, []byte("unrecognized")) ||
+				bytes.Contains(out, []byte("unsupported"))) {
+			return true, errors.New(string(out))
+		}
+		return true, fmt.Errorf("%#q failed: %v\n%s", strings.Join(cmd.Args, " "), err, out)
+	}
+
+	if c.sanitizer == "fuzzer" {
+		// For fuzzer, don't try running the test binary. It never finishes.
+		return false, nil
+	}
+
+	if out, err := exec.Command(dst).CombinedOutput(); err != nil {
+		if os.IsNotExist(err) {
+			return true, fmt.Errorf("%#q failed to produce executable: %v", strings.Join(cmd.Args, " "), err)
+		}
+		snippet, _, _ := bytes.Cut(out, []byte("\n"))
+		return true, fmt.Errorf("%#q generated broken executable: %v\n%s", strings.Join(cmd.Args, " "), err, snippet)
+	}
+
+	return false, nil
+}
+
+// skipIfRuntimeIncompatible skips t if the Go runtime is suspected not to work
+// with cgo as configured.
+func (c *config) skipIfRuntimeIncompatible(t *testing.T) {
+	check := &c.runtimeCheck
+	check.once.Do(func() {
+		check.skip, check.err = c.checkRuntime()
+	})
+	if check.err != nil {
+		t.Helper()
+		if check.skip {
+			t.Skip(check.err)
+		}
+		t.Fatal(check.err)
+	}
+}
+
+func (c *config) checkRuntime() (skip bool, err error) {
+	if c.sanitizer != "thread" {
+		return false, nil
+	}
+
+	// libcgo.h sets CGO_TSAN if it detects TSAN support in the C compiler.
+	// Dump the preprocessor defines to check that works.
+	// (Sometimes it doesn't: see https://golang.org/issue/15983.)
+	cmd, err := cc(c.cFlags...)
+	if err != nil {
+		return false, err
+	}
+	cmd.Args = append(cmd.Args, "-dM", "-E", "../../../../runtime/cgo/libcgo.h")
+	cmdStr := strings.Join(cmd.Args, " ")
+	out, err := cmd.CombinedOutput()
+	if err != nil {
+		return false, fmt.Errorf("%#q exited with %v\n%s", cmdStr, err, out)
+	}
+	if !bytes.Contains(out, []byte("#define CGO_TSAN")) {
+		return true, fmt.Errorf("%#q did not define CGO_TSAN", cmdStr)
+	}
+	return false, nil
+}
+
+// srcPath returns the path to the given file relative to this test's source tree.
+func srcPath(path string) string {
+	return filepath.Join("testdata", path)
+}
+
+// A tempDir manages a temporary directory within a test.
+type tempDir struct {
+	base string
+}
+
+func (d *tempDir) RemoveAll(t *testing.T) {
+	t.Helper()
+	if d.base == "" {
+		return
+	}
+	if err := os.RemoveAll(d.base); err != nil {
+		t.Fatalf("Failed to remove temp dir: %v", err)
+	}
+}
+
+func (d *tempDir) Base() string {
+	return d.base
+}
+
+func (d *tempDir) Join(name string) string {
+	return filepath.Join(d.base, name)
+}
+
+func newTempDir(t *testing.T) *tempDir {
+	t.Helper()
+	dir, err := os.MkdirTemp("", filepath.Dir(t.Name()))
+	if err != nil {
+		t.Fatalf("Failed to create temp dir: %v", err)
+	}
+	return &tempDir{base: dir}
+}
+
+// hangProneCmd returns an exec.Cmd for a command that is likely to hang.
+//
+// If one of these tests hangs, the caller is likely to kill the test process
+// using SIGINT, which will be sent to all of the processes in the test's group.
+// Unfortunately, TSAN in particular is prone to dropping signals, so the SIGINT
+// may terminate the test binary but leave the subprocess running. hangProneCmd
+// configures subprocess to receive SIGKILL instead to ensure that it won't
+// leak.
+func hangProneCmd(name string, arg ...string) *exec.Cmd {
+	cmd := exec.Command(name, arg...)
+	cmd.SysProcAttr = &syscall.SysProcAttr{
+		Pdeathsig: syscall.SIGKILL,
+	}
+	return cmd
+}
diff --git a/src/cmd/cgo/internal/testsanitizers/cshared_test.go b/src/cmd/cgo/internal/testsanitizers/cshared_test.go
new file mode 100644
index 0000000..f26c50a
--- /dev/null
+++ b/src/cmd/cgo/internal/testsanitizers/cshared_test.go
@@ -0,0 +1,98 @@
+// Copyright 2017 The Go 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:build linux || (freebsd && amd64)
+
+package sanitizers_test
+
+import (
+	"fmt"
+	"internal/platform"
+	"internal/testenv"
+	"os"
+	"strings"
+	"testing"
+)
+
+func TestShared(t *testing.T) {
+	testenv.MustHaveGoBuild(t)
+	testenv.MustHaveCGO(t)
+	testenv.MustHaveBuildMode(t, "c-shared")
+
+	t.Parallel()
+	requireOvercommit(t)
+
+	GOOS, err := goEnv("GOOS")
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	GOARCH, err := goEnv("GOARCH")
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	libExt := "so"
+	if GOOS == "darwin" {
+		libExt = "dylib"
+	}
+
+	cases := []struct {
+		src       string
+		sanitizer string
+	}{
+		{
+			src:       "msan_shared.go",
+			sanitizer: "memory",
+		},
+		{
+			src:       "tsan_shared.go",
+			sanitizer: "thread",
+		},
+	}
+
+	for _, tc := range cases {
+		tc := tc
+		name := strings.TrimSuffix(tc.src, ".go")
+		//The memory sanitizer tests require support for the -msan option.
+		if tc.sanitizer == "memory" && !platform.MSanSupported(GOOS, GOARCH) {
+			t.Logf("skipping %s test on %s/%s; -msan option is not supported.", name, GOOS, GOARCH)
+			continue
+		}
+		if tc.sanitizer == "thread" && !compilerRequiredTsanVersion(GOOS, GOARCH) {
+			t.Logf("skipping %s test on %s/%s; compiler version too old for -tsan.", name, GOOS, GOARCH)
+			continue
+		}
+
+		t.Run(name, func(t *testing.T) {
+			t.Parallel()
+			config := configure(tc.sanitizer)
+			config.skipIfCSanitizerBroken(t)
+
+			dir := newTempDir(t)
+			defer dir.RemoveAll(t)
+
+			lib := dir.Join(fmt.Sprintf("lib%s.%s", name, libExt))
+			mustRun(t, config.goCmd("build", "-buildmode=c-shared", "-o", lib, srcPath(tc.src)))
+
+			cSrc := dir.Join("main.c")
+			if err := os.WriteFile(cSrc, cMain, 0600); err != nil {
+				t.Fatalf("failed to write C source file: %v", err)
+			}
+
+			dstBin := dir.Join(name)
+			cmd, err := cc(config.cFlags...)
+			if err != nil {
+				t.Fatal(err)
+			}
+			cmd.Args = append(cmd.Args, config.ldFlags...)
+			cmd.Args = append(cmd.Args, "-o", dstBin, cSrc, lib)
+			mustRun(t, cmd)
+
+			cmd = hangProneCmd(dstBin)
+			replaceEnv(cmd, "LD_LIBRARY_PATH", ".")
+			mustRun(t, cmd)
+		})
+	}
+}
diff --git a/src/cmd/cgo/internal/testsanitizers/empty_test.go b/src/cmd/cgo/internal/testsanitizers/empty_test.go
new file mode 100644
index 0000000..e7fed99
--- /dev/null
+++ b/src/cmd/cgo/internal/testsanitizers/empty_test.go
@@ -0,0 +1,8 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// All of the actual test files have limited build constraints. This file
+// ensures there's at least one test file on every platform.
+
+package sanitizers_test
diff --git a/src/cmd/cgo/internal/testsanitizers/libfuzzer_test.go b/src/cmd/cgo/internal/testsanitizers/libfuzzer_test.go
new file mode 100644
index 0000000..f84c9f3
--- /dev/null
+++ b/src/cmd/cgo/internal/testsanitizers/libfuzzer_test.go
@@ -0,0 +1,93 @@
+// Copyright 2022 The Go 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:build linux || (freebsd && amd64)
+
+package sanitizers_test
+
+import (
+	"strings"
+	"testing"
+)
+
+func TestLibFuzzer(t *testing.T) {
+	goos, err := goEnv("GOOS")
+	if err != nil {
+		t.Fatal(err)
+	}
+	goarch, err := goEnv("GOARCH")
+	if err != nil {
+		t.Fatal(err)
+	}
+	if !libFuzzerSupported(goos, goarch) {
+		t.Skipf("skipping on %s/%s; libfuzzer option is not supported.", goos, goarch)
+	}
+	config := configure("fuzzer")
+	config.skipIfCSanitizerBroken(t)
+
+	cases := []struct {
+		goSrc         string
+		cSrc          string
+		expectedError string
+	}{
+		{goSrc: "libfuzzer1.go", expectedError: "panic: found it"},
+		{goSrc: "libfuzzer2.go", cSrc: "libfuzzer2.c", expectedError: "panic: found it"},
+	}
+	for _, tc := range cases {
+		tc := tc
+		name := strings.TrimSuffix(tc.goSrc, ".go")
+		t.Run(name, func(t *testing.T) {
+			t.Parallel()
+
+			dir := newTempDir(t)
+			defer dir.RemoveAll(t)
+
+			// build Go code in libfuzzer mode to a c-archive
+			outPath := dir.Join(name)
+			archivePath := dir.Join(name + ".a")
+			mustRun(t, config.goCmd("build", "-buildmode=c-archive", "-o", archivePath, srcPath(tc.goSrc)))
+
+			// build C code (if any) and link with Go code
+			cmd, err := cc(config.cFlags...)
+			if err != nil {
+				t.Fatalf("error running cc: %v", err)
+			}
+			cmd.Args = append(cmd.Args, config.ldFlags...)
+			cmd.Args = append(cmd.Args, "-o", outPath, "-I", dir.Base())
+			if tc.cSrc != "" {
+				cmd.Args = append(cmd.Args, srcPath(tc.cSrc))
+			}
+			cmd.Args = append(cmd.Args, archivePath)
+			mustRun(t, cmd)
+
+			cmd = hangProneCmd(outPath)
+			cmd.Dir = dir.Base()
+			outb, err := cmd.CombinedOutput()
+			out := string(outb)
+			if err == nil {
+				t.Fatalf("fuzzing succeeded unexpectedly; output:\n%s", out)
+			}
+			if !strings.Contains(out, tc.expectedError) {
+				t.Errorf("exited without expected error %q; got\n%s", tc.expectedError, out)
+			}
+		})
+	}
+}
+
+// libFuzzerSupported is a copy of the function internal/platform.FuzzInstrumented,
+// because the internal package can't be used here.
+func libFuzzerSupported(goos, goarch string) bool {
+	switch goarch {
+	case "amd64", "arm64":
+		// TODO(#14565): support more architectures.
+		switch goos {
+		case "darwin", "freebsd", "linux", "windows":
+			return true
+		default:
+			return false
+		}
+	default:
+		return false
+	}
+}
diff --git a/src/cmd/cgo/internal/testsanitizers/msan_test.go b/src/cmd/cgo/internal/testsanitizers/msan_test.go
new file mode 100644
index 0000000..1a22b52
--- /dev/null
+++ b/src/cmd/cgo/internal/testsanitizers/msan_test.go
@@ -0,0 +1,84 @@
+// Copyright 2017 The Go 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:build linux || (freebsd && amd64)
+
+package sanitizers_test
+
+import (
+	"internal/platform"
+	"strings"
+	"testing"
+)
+
+func TestMSAN(t *testing.T) {
+	goos, err := goEnv("GOOS")
+	if err != nil {
+		t.Fatal(err)
+	}
+	goarch, err := goEnv("GOARCH")
+	if err != nil {
+		t.Fatal(err)
+	}
+	// The msan tests require support for the -msan option.
+	if !platform.MSanSupported(goos, goarch) {
+		t.Skipf("skipping on %s/%s; -msan option is not supported.", goos, goarch)
+	}
+
+	t.Parallel()
+	// Overcommit is enabled by default on FreeBSD (vm.overcommit=0, see tuning(7)).
+	// Do not skip tests with stricter overcommit settings unless testing shows that FreeBSD has similar issues.
+	if goos == "linux" {
+		requireOvercommit(t)
+	}
+	config := configure("memory")
+	config.skipIfCSanitizerBroken(t)
+
+	mustRun(t, config.goCmd("build", "std"))
+
+	cases := []struct {
+		src         string
+		wantErr     bool
+		experiments []string
+	}{
+		{src: "msan.go"},
+		{src: "msan2.go"},
+		{src: "msan2_cmsan.go"},
+		{src: "msan3.go"},
+		{src: "msan4.go"},
+		{src: "msan5.go"},
+		{src: "msan6.go"},
+		{src: "msan7.go"},
+		{src: "msan8.go"},
+		{src: "msan_fail.go", wantErr: true},
+		// This may not always fail specifically due to MSAN. It may sometimes
+		// fail because of a fault. However, we don't care what kind of error we
+		// get here, just that we get an error. This is an MSAN test because without
+		// MSAN it would not fail deterministically.
+		{src: "arena_fail.go", wantErr: true, experiments: []string{"arenas"}},
+	}
+	for _, tc := range cases {
+		tc := tc
+		name := strings.TrimSuffix(tc.src, ".go")
+		t.Run(name, func(t *testing.T) {
+			t.Parallel()
+
+			dir := newTempDir(t)
+			defer dir.RemoveAll(t)
+
+			outPath := dir.Join(name)
+			mustRun(t, config.goCmdWithExperiments("build", []string{"-o", outPath, srcPath(tc.src)}, tc.experiments))
+
+			cmd := hangProneCmd(outPath)
+			if tc.wantErr {
+				out, err := cmd.CombinedOutput()
+				if err != nil {
+					return
+				}
+				t.Fatalf("%#q exited without error; want MSAN failure\n%s", strings.Join(cmd.Args, " "), out)
+			}
+			mustRun(t, cmd)
+		})
+	}
+}
diff --git a/misc/cgo/testsanitizers/testdata/arena_fail.go b/src/cmd/cgo/internal/testsanitizers/testdata/arena_fail.go
similarity index 100%
rename from misc/cgo/testsanitizers/testdata/arena_fail.go
rename to src/cmd/cgo/internal/testsanitizers/testdata/arena_fail.go
diff --git a/misc/cgo/testsanitizers/testdata/asan1_fail.go b/src/cmd/cgo/internal/testsanitizers/testdata/asan1_fail.go
similarity index 100%
rename from misc/cgo/testsanitizers/testdata/asan1_fail.go
rename to src/cmd/cgo/internal/testsanitizers/testdata/asan1_fail.go
diff --git a/misc/cgo/testsanitizers/testdata/asan2_fail.go b/src/cmd/cgo/internal/testsanitizers/testdata/asan2_fail.go
similarity index 100%
rename from misc/cgo/testsanitizers/testdata/asan2_fail.go
rename to src/cmd/cgo/internal/testsanitizers/testdata/asan2_fail.go
diff --git a/misc/cgo/testsanitizers/testdata/asan3_fail.go b/src/cmd/cgo/internal/testsanitizers/testdata/asan3_fail.go
similarity index 100%
rename from misc/cgo/testsanitizers/testdata/asan3_fail.go
rename to src/cmd/cgo/internal/testsanitizers/testdata/asan3_fail.go
diff --git a/misc/cgo/testsanitizers/testdata/asan4_fail.go b/src/cmd/cgo/internal/testsanitizers/testdata/asan4_fail.go
similarity index 100%
rename from misc/cgo/testsanitizers/testdata/asan4_fail.go
rename to src/cmd/cgo/internal/testsanitizers/testdata/asan4_fail.go
diff --git a/misc/cgo/testsanitizers/testdata/asan5_fail.go b/src/cmd/cgo/internal/testsanitizers/testdata/asan5_fail.go
similarity index 100%
rename from misc/cgo/testsanitizers/testdata/asan5_fail.go
rename to src/cmd/cgo/internal/testsanitizers/testdata/asan5_fail.go
diff --git a/misc/cgo/testsanitizers/testdata/asan_global1_fail.go b/src/cmd/cgo/internal/testsanitizers/testdata/asan_global1_fail.go
similarity index 100%
rename from misc/cgo/testsanitizers/testdata/asan_global1_fail.go
rename to src/cmd/cgo/internal/testsanitizers/testdata/asan_global1_fail.go
diff --git a/misc/cgo/testsanitizers/testdata/asan_global2_fail.go b/src/cmd/cgo/internal/testsanitizers/testdata/asan_global2_fail.go
similarity index 100%
rename from misc/cgo/testsanitizers/testdata/asan_global2_fail.go
rename to src/cmd/cgo/internal/testsanitizers/testdata/asan_global2_fail.go
diff --git a/misc/cgo/testsanitizers/testdata/asan_global3_fail.go b/src/cmd/cgo/internal/testsanitizers/testdata/asan_global3_fail.go
similarity index 100%
rename from misc/cgo/testsanitizers/testdata/asan_global3_fail.go
rename to src/cmd/cgo/internal/testsanitizers/testdata/asan_global3_fail.go
diff --git a/misc/cgo/testsanitizers/testdata/asan_global4_fail.go b/src/cmd/cgo/internal/testsanitizers/testdata/asan_global4_fail.go
similarity index 100%
rename from misc/cgo/testsanitizers/testdata/asan_global4_fail.go
rename to src/cmd/cgo/internal/testsanitizers/testdata/asan_global4_fail.go
diff --git a/misc/cgo/testsanitizers/testdata/asan_global5.go b/src/cmd/cgo/internal/testsanitizers/testdata/asan_global5.go
similarity index 100%
rename from misc/cgo/testsanitizers/testdata/asan_global5.go
rename to src/cmd/cgo/internal/testsanitizers/testdata/asan_global5.go
diff --git a/src/cmd/cgo/internal/testsanitizers/testdata/asan_linkerx/main.go b/src/cmd/cgo/internal/testsanitizers/testdata/asan_linkerx/main.go
new file mode 100644
index 0000000..290b588
--- /dev/null
+++ b/src/cmd/cgo/internal/testsanitizers/testdata/asan_linkerx/main.go
@@ -0,0 +1,28 @@
+package main
+
+import "cmd/cgo/internal/testsanitizers/testdata/asan_linkerx/p"
+
+func pstring(s *string) {
+	println(*s)
+}
+
+func main() {
+	all := []*string{
+		&S1, &S2, &S3, &S4, &S5, &S6, &S7, &S8, &S9, &S10,
+		&p.S1, &p.S2, &p.S3, &p.S4, &p.S5, &p.S6, &p.S7, &p.S8, &p.S9, &p.S10,
+	}
+	for _, ps := range all {
+		pstring(ps)
+	}
+}
+
+var S1 string
+var S2 string
+var S3 string
+var S4 string
+var S5 string
+var S6 string
+var S7 string
+var S8 string
+var S9 string
+var S10 string
diff --git a/misc/cgo/testsanitizers/testdata/asan_linkerx/p/p.go b/src/cmd/cgo/internal/testsanitizers/testdata/asan_linkerx/p/p.go
similarity index 100%
rename from misc/cgo/testsanitizers/testdata/asan_linkerx/p/p.go
rename to src/cmd/cgo/internal/testsanitizers/testdata/asan_linkerx/p/p.go
diff --git a/misc/cgo/testsanitizers/testdata/asan_unsafe_fail1.go b/src/cmd/cgo/internal/testsanitizers/testdata/asan_unsafe_fail1.go
similarity index 100%
rename from misc/cgo/testsanitizers/testdata/asan_unsafe_fail1.go
rename to src/cmd/cgo/internal/testsanitizers/testdata/asan_unsafe_fail1.go
diff --git a/misc/cgo/testsanitizers/testdata/asan_unsafe_fail2.go b/src/cmd/cgo/internal/testsanitizers/testdata/asan_unsafe_fail2.go
similarity index 100%
rename from misc/cgo/testsanitizers/testdata/asan_unsafe_fail2.go
rename to src/cmd/cgo/internal/testsanitizers/testdata/asan_unsafe_fail2.go
diff --git a/misc/cgo/testsanitizers/testdata/asan_unsafe_fail3.go b/src/cmd/cgo/internal/testsanitizers/testdata/asan_unsafe_fail3.go
similarity index 100%
rename from misc/cgo/testsanitizers/testdata/asan_unsafe_fail3.go
rename to src/cmd/cgo/internal/testsanitizers/testdata/asan_unsafe_fail3.go
diff --git a/misc/cgo/testsanitizers/testdata/asan_useAfterReturn.go b/src/cmd/cgo/internal/testsanitizers/testdata/asan_useAfterReturn.go
similarity index 100%
rename from misc/cgo/testsanitizers/testdata/asan_useAfterReturn.go
rename to src/cmd/cgo/internal/testsanitizers/testdata/asan_useAfterReturn.go
diff --git a/misc/cgo/testsanitizers/testdata/libfuzzer1.go b/src/cmd/cgo/internal/testsanitizers/testdata/libfuzzer1.go
similarity index 100%
rename from misc/cgo/testsanitizers/testdata/libfuzzer1.go
rename to src/cmd/cgo/internal/testsanitizers/testdata/libfuzzer1.go
diff --git a/misc/cgo/testsanitizers/testdata/libfuzzer2.c b/src/cmd/cgo/internal/testsanitizers/testdata/libfuzzer2.c
similarity index 100%
rename from misc/cgo/testsanitizers/testdata/libfuzzer2.c
rename to src/cmd/cgo/internal/testsanitizers/testdata/libfuzzer2.c
diff --git a/misc/cgo/testsanitizers/testdata/libfuzzer2.go b/src/cmd/cgo/internal/testsanitizers/testdata/libfuzzer2.go
similarity index 100%
rename from misc/cgo/testsanitizers/testdata/libfuzzer2.go
rename to src/cmd/cgo/internal/testsanitizers/testdata/libfuzzer2.go
diff --git a/src/cmd/cgo/internal/testsanitizers/testdata/msan.go b/src/cmd/cgo/internal/testsanitizers/testdata/msan.go
new file mode 100644
index 0000000..5d73c38
--- /dev/null
+++ b/src/cmd/cgo/internal/testsanitizers/testdata/msan.go
@@ -0,0 +1,35 @@
+// 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
+
+/*
+#include <stdint.h>
+
+void f(int32_t *p, int n) {
+  int i;
+
+  for (i = 0; i < n; i++) {
+    p[i] = (int32_t)i;
+  }
+}
+*/
+import "C"
+
+import (
+	"fmt"
+	"os"
+	"unsafe"
+)
+
+func main() {
+	a := make([]int32, 10)
+	C.f((*C.int32_t)(unsafe.Pointer(&a[0])), C.int(len(a)))
+	for i, v := range a {
+		if i != int(v) {
+			fmt.Printf("bad %d: %v\n", i, a)
+			os.Exit(1)
+		}
+	}
+}
diff --git a/misc/cgo/testsanitizers/testdata/msan2.go b/src/cmd/cgo/internal/testsanitizers/testdata/msan2.go
similarity index 100%
rename from misc/cgo/testsanitizers/testdata/msan2.go
rename to src/cmd/cgo/internal/testsanitizers/testdata/msan2.go
diff --git a/misc/cgo/testsanitizers/testdata/msan2_cmsan.go b/src/cmd/cgo/internal/testsanitizers/testdata/msan2_cmsan.go
similarity index 100%
rename from misc/cgo/testsanitizers/testdata/msan2_cmsan.go
rename to src/cmd/cgo/internal/testsanitizers/testdata/msan2_cmsan.go
diff --git a/misc/cgo/testsanitizers/testdata/msan3.go b/src/cmd/cgo/internal/testsanitizers/testdata/msan3.go
similarity index 100%
rename from misc/cgo/testsanitizers/testdata/msan3.go
rename to src/cmd/cgo/internal/testsanitizers/testdata/msan3.go
diff --git a/misc/cgo/testsanitizers/testdata/msan4.go b/src/cmd/cgo/internal/testsanitizers/testdata/msan4.go
similarity index 100%
rename from misc/cgo/testsanitizers/testdata/msan4.go
rename to src/cmd/cgo/internal/testsanitizers/testdata/msan4.go
diff --git a/misc/cgo/testsanitizers/testdata/msan5.go b/src/cmd/cgo/internal/testsanitizers/testdata/msan5.go
similarity index 100%
rename from misc/cgo/testsanitizers/testdata/msan5.go
rename to src/cmd/cgo/internal/testsanitizers/testdata/msan5.go
diff --git a/src/cmd/cgo/internal/testsanitizers/testdata/msan6.go b/src/cmd/cgo/internal/testsanitizers/testdata/msan6.go
new file mode 100644
index 0000000..e96e8f9
--- /dev/null
+++ b/src/cmd/cgo/internal/testsanitizers/testdata/msan6.go
@@ -0,0 +1,75 @@
+// Copyright 2018 The Go Authors. 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
+
+// A C function returning a value on the Go stack could leave the Go
+// stack marked as uninitialized, potentially causing a later error
+// when the stack is used for something else. Issue 26209.
+
+/*
+#cgo LDFLAGS: -fsanitize=memory
+#cgo CPPFLAGS: -fsanitize=memory
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+typedef struct {
+	uintptr_t a[20];
+} S;
+
+S f() {
+	S *p;
+
+	p = (S *)(malloc(sizeof(S)));
+	p->a[0] = 0;
+	return *p;
+}
+*/
+import "C"
+
+// allocateStack extends the stack so that stack copying doesn't
+// confuse the msan data structures.
+//
+//go:noinline
+func allocateStack(i int) int {
+	if i == 0 {
+		return i
+	}
+	return allocateStack(i - 1)
+}
+
+// F1 marks a chunk of stack as uninitialized.
+// C.f returns an uninitialized struct on the stack, so msan will mark
+// the stack as uninitialized.
+//
+//go:noinline
+func F1() uintptr {
+	s := C.f()
+	return uintptr(s.a[0])
+}
+
+// F2 allocates a struct on the stack and converts it to an empty interface,
+// which will call msanread and see that the data appears uninitialized.
+//
+//go:noinline
+func F2() interface{} {
+	return C.S{}
+}
+
+func poisonStack(i int) int {
+	if i == 0 {
+		return int(F1())
+	}
+	F1()
+	r := poisonStack(i - 1)
+	F2()
+	return r
+}
+
+func main() {
+	allocateStack(16384)
+	poisonStack(128)
+}
diff --git a/misc/cgo/testsanitizers/testdata/msan7.go b/src/cmd/cgo/internal/testsanitizers/testdata/msan7.go
similarity index 100%
rename from misc/cgo/testsanitizers/testdata/msan7.go
rename to src/cmd/cgo/internal/testsanitizers/testdata/msan7.go
diff --git a/misc/cgo/testsanitizers/testdata/msan8.go b/src/cmd/cgo/internal/testsanitizers/testdata/msan8.go
similarity index 100%
rename from misc/cgo/testsanitizers/testdata/msan8.go
rename to src/cmd/cgo/internal/testsanitizers/testdata/msan8.go
diff --git a/misc/cgo/testsanitizers/testdata/msan_fail.go b/src/cmd/cgo/internal/testsanitizers/testdata/msan_fail.go
similarity index 100%
rename from misc/cgo/testsanitizers/testdata/msan_fail.go
rename to src/cmd/cgo/internal/testsanitizers/testdata/msan_fail.go
diff --git a/misc/cgo/testsanitizers/testdata/msan_shared.go b/src/cmd/cgo/internal/testsanitizers/testdata/msan_shared.go
similarity index 100%
rename from misc/cgo/testsanitizers/testdata/msan_shared.go
rename to src/cmd/cgo/internal/testsanitizers/testdata/msan_shared.go
diff --git a/misc/cgo/testsanitizers/testdata/tsan.go b/src/cmd/cgo/internal/testsanitizers/testdata/tsan.go
similarity index 100%
rename from misc/cgo/testsanitizers/testdata/tsan.go
rename to src/cmd/cgo/internal/testsanitizers/testdata/tsan.go
diff --git a/misc/cgo/testsanitizers/testdata/tsan10.go b/src/cmd/cgo/internal/testsanitizers/testdata/tsan10.go
similarity index 100%
rename from misc/cgo/testsanitizers/testdata/tsan10.go
rename to src/cmd/cgo/internal/testsanitizers/testdata/tsan10.go
diff --git a/misc/cgo/testsanitizers/testdata/tsan11.go b/src/cmd/cgo/internal/testsanitizers/testdata/tsan11.go
similarity index 100%
rename from misc/cgo/testsanitizers/testdata/tsan11.go
rename to src/cmd/cgo/internal/testsanitizers/testdata/tsan11.go
diff --git a/misc/cgo/testsanitizers/testdata/tsan12.go b/src/cmd/cgo/internal/testsanitizers/testdata/tsan12.go
similarity index 100%
rename from misc/cgo/testsanitizers/testdata/tsan12.go
rename to src/cmd/cgo/internal/testsanitizers/testdata/tsan12.go
diff --git a/src/cmd/cgo/internal/testsanitizers/testdata/tsan13.go b/src/cmd/cgo/internal/testsanitizers/testdata/tsan13.go
new file mode 100644
index 0000000..ebdf635
--- /dev/null
+++ b/src/cmd/cgo/internal/testsanitizers/testdata/tsan13.go
@@ -0,0 +1,90 @@
+// Copyright 2023 The Go Authors. 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
+
+// This program failed when run under the C/C++ ThreadSanitizer.
+// There was no TSAN synchronization for the call to the cgo
+// traceback routine.
+
+/*
+#cgo CFLAGS: -g -fsanitize=thread
+#cgo LDFLAGS: -g -fsanitize=thread
+
+#include <pthread.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <sys/time.h>
+#include <unistd.h>
+
+struct tracebackArg {
+	uintptr_t  Context;
+	uintptr_t  SigContext;
+	uintptr_t* Buf;
+	uintptr_t  Max;
+};
+
+void tsanTraceback(struct tracebackArg *arg) {
+	arg->Buf[0] = 0;
+}
+
+static void* spin(void *arg) {
+	size_t n;
+	struct timeval tvstart, tvnow;
+	int diff;
+	void *prev;
+	void *cur;
+
+	prev = NULL;
+	gettimeofday(&tvstart, NULL);
+	for (n = 0; n < 1<<20; n++) {
+		cur = malloc(n);
+		free(prev);
+		prev = cur;
+
+		gettimeofday(&tvnow, NULL);
+		diff = (tvnow.tv_sec - tvstart.tv_sec) * 1000 * 1000 + (tvnow.tv_usec - tvstart.tv_usec);
+
+		// Profile frequency is 100Hz so we should definitely
+		// get some signals in 50 milliseconds.
+		if (diff > 50 * 1000) {
+			break;
+		}
+	}
+
+	free(prev);
+
+	return NULL;
+}
+
+static void runThreads(int n) {
+	pthread_t ids[64];
+	int i;
+
+	if (n > 64) {
+		n = 64;
+	}
+	for (i = 0; i < n; i++) {
+		pthread_create(&ids[i], NULL, spin, NULL);
+	}
+	for (i = 0; i < n; i++) {
+		pthread_join(ids[i], NULL);
+	}
+}
+*/
+import "C"
+
+import (
+	"io"
+	"runtime"
+	"runtime/pprof"
+	"unsafe"
+)
+
+func main() {
+	runtime.SetCgoTraceback(0, unsafe.Pointer(C.tsanTraceback), nil, nil)
+	pprof.StartCPUProfile(io.Discard)
+	C.runThreads(C.int(runtime.GOMAXPROCS(0)))
+	pprof.StopCPUProfile()
+}
diff --git a/src/cmd/cgo/internal/testsanitizers/testdata/tsan14.go b/src/cmd/cgo/internal/testsanitizers/testdata/tsan14.go
new file mode 100644
index 0000000..d594ffb
--- /dev/null
+++ b/src/cmd/cgo/internal/testsanitizers/testdata/tsan14.go
@@ -0,0 +1,53 @@
+// Copyright 2023 The Go Authors. 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
+
+// This program failed when run under the C/C++ ThreadSanitizer.
+//
+// cgocallback on a new thread calls into runtime.needm -> _cgo_getstackbound
+// to update gp.stack.lo with the stack bounds. If the G itself is passed to
+// _cgo_getstackbound, then writes to the same G can be seen on multiple
+// threads (when the G is reused after thread exit). This would trigger TSAN.
+
+/*
+#include <pthread.h>
+
+void go_callback();
+
+static void *thr(void *arg) {
+    go_callback();
+    return 0;
+}
+
+static void foo() {
+    pthread_t th;
+    pthread_attr_t attr;
+    pthread_attr_init(&attr);
+    pthread_attr_setstacksize(&attr, 256 << 10);
+    pthread_create(&th, &attr, thr, 0);
+    pthread_join(th, 0);
+}
+*/
+import "C"
+
+import (
+	"time"
+)
+
+//export go_callback
+func go_callback() {
+}
+
+func main() {
+	for i := 0; i < 2; i++ {
+		go func() {
+			for {
+				C.foo()
+			}
+		}()
+	}
+
+	time.Sleep(1000*time.Millisecond)
+}
diff --git a/misc/cgo/testsanitizers/testdata/tsan2.go b/src/cmd/cgo/internal/testsanitizers/testdata/tsan2.go
similarity index 100%
rename from misc/cgo/testsanitizers/testdata/tsan2.go
rename to src/cmd/cgo/internal/testsanitizers/testdata/tsan2.go
diff --git a/misc/cgo/testsanitizers/testdata/tsan3.go b/src/cmd/cgo/internal/testsanitizers/testdata/tsan3.go
similarity index 100%
rename from misc/cgo/testsanitizers/testdata/tsan3.go
rename to src/cmd/cgo/internal/testsanitizers/testdata/tsan3.go
diff --git a/misc/cgo/testsanitizers/testdata/tsan4.go b/src/cmd/cgo/internal/testsanitizers/testdata/tsan4.go
similarity index 100%
rename from misc/cgo/testsanitizers/testdata/tsan4.go
rename to src/cmd/cgo/internal/testsanitizers/testdata/tsan4.go
diff --git a/misc/cgo/testsanitizers/testdata/tsan5.go b/src/cmd/cgo/internal/testsanitizers/testdata/tsan5.go
similarity index 100%
rename from misc/cgo/testsanitizers/testdata/tsan5.go
rename to src/cmd/cgo/internal/testsanitizers/testdata/tsan5.go
diff --git a/misc/cgo/testsanitizers/testdata/tsan6.go b/src/cmd/cgo/internal/testsanitizers/testdata/tsan6.go
similarity index 100%
rename from misc/cgo/testsanitizers/testdata/tsan6.go
rename to src/cmd/cgo/internal/testsanitizers/testdata/tsan6.go
diff --git a/misc/cgo/testsanitizers/testdata/tsan7.go b/src/cmd/cgo/internal/testsanitizers/testdata/tsan7.go
similarity index 100%
rename from misc/cgo/testsanitizers/testdata/tsan7.go
rename to src/cmd/cgo/internal/testsanitizers/testdata/tsan7.go
diff --git a/misc/cgo/testsanitizers/testdata/tsan8.go b/src/cmd/cgo/internal/testsanitizers/testdata/tsan8.go
similarity index 100%
rename from misc/cgo/testsanitizers/testdata/tsan8.go
rename to src/cmd/cgo/internal/testsanitizers/testdata/tsan8.go
diff --git a/misc/cgo/testsanitizers/testdata/tsan9.go b/src/cmd/cgo/internal/testsanitizers/testdata/tsan9.go
similarity index 100%
rename from misc/cgo/testsanitizers/testdata/tsan9.go
rename to src/cmd/cgo/internal/testsanitizers/testdata/tsan9.go
diff --git a/misc/cgo/testsanitizers/testdata/tsan_shared.go b/src/cmd/cgo/internal/testsanitizers/testdata/tsan_shared.go
similarity index 100%
rename from misc/cgo/testsanitizers/testdata/tsan_shared.go
rename to src/cmd/cgo/internal/testsanitizers/testdata/tsan_shared.go
diff --git a/src/cmd/cgo/internal/testsanitizers/tsan_test.go b/src/cmd/cgo/internal/testsanitizers/tsan_test.go
new file mode 100644
index 0000000..8e758e6
--- /dev/null
+++ b/src/cmd/cgo/internal/testsanitizers/tsan_test.go
@@ -0,0 +1,80 @@
+// Copyright 2017 The Go 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:build linux || (freebsd && amd64)
+
+package sanitizers_test
+
+import (
+	"internal/testenv"
+	"strings"
+	"testing"
+)
+
+func TestTSAN(t *testing.T) {
+	testenv.MustHaveGoBuild(t)
+	testenv.MustHaveCGO(t)
+
+	goos, err := goEnv("GOOS")
+	if err != nil {
+		t.Fatal(err)
+	}
+	goarch, err := goEnv("GOARCH")
+	if err != nil {
+		t.Fatal(err)
+	}
+	// The msan tests require support for the -msan option.
+	if !compilerRequiredTsanVersion(goos, goarch) {
+		t.Skipf("skipping on %s/%s; compiler version for -tsan option is too old.", goos, goarch)
+	}
+
+	t.Parallel()
+	requireOvercommit(t)
+	config := configure("thread")
+	config.skipIfCSanitizerBroken(t)
+
+	mustRun(t, config.goCmd("build", "std"))
+
+	cases := []struct {
+		src          string
+		needsRuntime bool
+	}{
+		{src: "tsan.go"},
+		{src: "tsan2.go"},
+		{src: "tsan3.go"},
+		{src: "tsan4.go"},
+		{src: "tsan5.go", needsRuntime: true},
+		{src: "tsan6.go", needsRuntime: true},
+		{src: "tsan7.go", needsRuntime: true},
+		{src: "tsan8.go"},
+		{src: "tsan9.go"},
+		{src: "tsan10.go", needsRuntime: true},
+		{src: "tsan11.go", needsRuntime: true},
+		{src: "tsan12.go", needsRuntime: true},
+		{src: "tsan13.go", needsRuntime: true},
+		{src: "tsan14.go", needsRuntime: true},
+	}
+	for _, tc := range cases {
+		tc := tc
+		name := strings.TrimSuffix(tc.src, ".go")
+		t.Run(name, func(t *testing.T) {
+			t.Parallel()
+
+			dir := newTempDir(t)
+			defer dir.RemoveAll(t)
+
+			outPath := dir.Join(name)
+			mustRun(t, config.goCmd("build", "-o", outPath, srcPath(tc.src)))
+
+			cmd := hangProneCmd(outPath)
+			if tc.needsRuntime {
+				config.skipIfRuntimeIncompatible(t)
+			}
+			// If we don't see halt_on_error, the program
+			// will only exit non-zero if we call C.exit.
+			cmd.Env = append(cmd.Environ(), "TSAN_OPTIONS=halt_on_error=1")
+			mustRun(t, cmd)
+		})
+	}
+}
diff --git a/src/cmd/cgo/internal/testshared/shared_test.go b/src/cmd/cgo/internal/testshared/shared_test.go
new file mode 100644
index 0000000..796c46b
--- /dev/null
+++ b/src/cmd/cgo/internal/testshared/shared_test.go
@@ -0,0 +1,1174 @@
+// 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 shared_test
+
+import (
+	"bufio"
+	"bytes"
+	"cmd/cgo/internal/cgotest"
+	"debug/elf"
+	"encoding/binary"
+	"flag"
+	"fmt"
+	"go/build"
+	"internal/platform"
+	"internal/testenv"
+	"io"
+	"log"
+	"os"
+	"os/exec"
+	"path/filepath"
+	"regexp"
+	"runtime"
+	"sort"
+	"strconv"
+	"strings"
+	"testing"
+	"time"
+)
+
+var globalSkip = func(t testing.TB) {}
+
+var gopathInstallDir, gorootInstallDir string
+var oldGOROOT string
+
+// This is the smallest set of packages we can link into a shared
+// library (runtime/cgo is built implicitly).
+var minpkgs = []string{"runtime", "sync/atomic"}
+var soname = "libruntime,sync-atomic.so"
+
+var testX = flag.Bool("testx", false, "if true, pass -x to 'go' subcommands invoked by the test")
+var testWork = flag.Bool("testwork", false, "if true, log and do not delete the temporary working directory")
+
+// run runs a command and calls t.Errorf if it fails.
+func run(t *testing.T, msg string, args ...string) {
+	runWithEnv(t, msg, nil, args...)
+}
+
+// runWithEnv runs a command under the given environment and calls t.Errorf if it fails.
+func runWithEnv(t *testing.T, msg string, env []string, args ...string) {
+	c := exec.Command(args[0], args[1:]...)
+	if len(env) != 0 {
+		c.Env = append(os.Environ(), env...)
+	}
+	if output, err := c.CombinedOutput(); err != nil {
+		t.Errorf("executing %s (%s) failed %s:\n%s", strings.Join(args, " "), msg, err, output)
+	}
+}
+
+// goCmd invokes the go tool with the installsuffix set up by TestMain. It calls
+// t.Fatalf if the command fails.
+func goCmd(t *testing.T, args ...string) string {
+	newargs := []string{args[0]}
+	if *testX && args[0] != "env" {
+		newargs = append(newargs, "-x", "-ldflags=-v")
+	}
+	newargs = append(newargs, args[1:]...)
+	c := exec.Command(filepath.Join(oldGOROOT, "bin", "go"), newargs...)
+	stderr := new(strings.Builder)
+	c.Stderr = stderr
+
+	if testing.Verbose() && t == nil {
+		fmt.Fprintf(os.Stderr, "+ go %s\n", strings.Join(args, " "))
+		c.Stderr = os.Stderr
+	}
+	output, err := c.Output()
+
+	if err != nil {
+		if t != nil {
+			t.Helper()
+			t.Fatalf("executing %s failed %v:\n%s", strings.Join(c.Args, " "), err, stderr)
+		} else {
+			// Panic instead of using log.Fatalf so that deferred cleanup may run in testMain.
+			log.Panicf("executing %s failed %v:\n%s", strings.Join(c.Args, " "), err, stderr)
+		}
+	}
+	if testing.Verbose() && t != nil {
+		t.Logf("go %s", strings.Join(args, " "))
+		if stderr.Len() > 0 {
+			t.Logf("%s", stderr)
+		}
+	}
+	return string(bytes.TrimSpace(output))
+}
+
+// TestMain calls testMain so that the latter can use defer (TestMain exits with os.Exit).
+func testMain(m *testing.M) (int, error) {
+	if !platform.BuildModeSupported(runtime.Compiler, "shared", runtime.GOOS, runtime.GOARCH) {
+		globalSkip = func(t testing.TB) { t.Skip("shared build mode not supported") }
+		return m.Run(), nil
+	}
+	if !testenv.HasCGO() {
+		globalSkip = testenv.MustHaveCGO
+		return m.Run(), nil
+	}
+
+	cwd, err := os.Getwd()
+	if err != nil {
+		log.Fatal(err)
+	}
+	oldGOROOT = filepath.Join(cwd, "../../../../..")
+
+	workDir, err := os.MkdirTemp("", "shared_test")
+	if err != nil {
+		return 0, err
+	}
+	if *testWork || testing.Verbose() {
+		fmt.Printf("+ mkdir -p %s\n", workDir)
+	}
+	if !*testWork {
+		defer os.RemoveAll(workDir)
+	}
+
+	// -buildmode=shared fundamentally does not work in module mode.
+	// (It tries to share package dependencies across builds, but in module mode
+	// each module has its own distinct set of dependency versions.)
+	// We would like to eliminate it (see https://go.dev/issue/47788),
+	// but first need to figure out a replacement that covers the small subset
+	// of use-cases where -buildmode=shared still works today.
+	// For now, run the tests in GOPATH mode only.
+	os.Setenv("GO111MODULE", "off")
+
+	// Some tests need to edit the source in GOPATH, so copy this directory to a
+	// temporary directory and chdir to that.
+	gopath := filepath.Join(workDir, "gopath")
+	modRoot, err := cloneTestdataModule(gopath)
+	if err != nil {
+		return 0, err
+	}
+	if testing.Verbose() {
+		fmt.Printf("+ export GOPATH=%s\n", gopath)
+		fmt.Printf("+ cd %s\n", modRoot)
+	}
+	os.Setenv("GOPATH", gopath)
+	// Explicitly override GOBIN as well, in case it was set through a GOENV file.
+	os.Setenv("GOBIN", filepath.Join(gopath, "bin"))
+	os.Chdir(modRoot)
+	os.Setenv("PWD", modRoot)
+
+	// The test also needs to install libraries into GOROOT/pkg, so copy the
+	// subset of GOROOT that we need.
+	//
+	// TODO(golang.org/issue/28553): Rework -buildmode=shared so that it does not
+	// need to write to GOROOT.
+	goroot := filepath.Join(workDir, "goroot")
+	if err := cloneGOROOTDeps(goroot); err != nil {
+		return 0, err
+	}
+	if testing.Verbose() {
+		fmt.Fprintf(os.Stderr, "+ export GOROOT=%s\n", goroot)
+	}
+	os.Setenv("GOROOT", goroot)
+
+	myContext := build.Default
+	myContext.GOROOT = goroot
+	myContext.GOPATH = gopath
+
+	// All tests depend on runtime being built into a shared library. Because
+	// that takes a few seconds, do it here and have all tests use the version
+	// built here.
+	goCmd(nil, append([]string{"install", "-buildmode=shared"}, minpkgs...)...)
+
+	shlib := goCmd(nil, "list", "-linkshared", "-f={{.Shlib}}", "runtime")
+	if shlib != "" {
+		gorootInstallDir = filepath.Dir(shlib)
+	}
+
+	myContext.InstallSuffix = "_dynlink"
+	depP, err := myContext.Import("./depBase", ".", build.ImportComment)
+	if err != nil {
+		return 0, fmt.Errorf("import failed: %v", err)
+	}
+	if depP.PkgTargetRoot == "" {
+		gopathInstallDir = filepath.Dir(goCmd(nil, "list", "-buildmode=shared", "-f", "{{.Target}}", "./depBase"))
+	} else {
+		gopathInstallDir = filepath.Join(depP.PkgTargetRoot, "testshared")
+	}
+	return m.Run(), nil
+}
+
+func TestMain(m *testing.M) {
+	log.SetFlags(log.Lshortfile)
+	flag.Parse()
+
+	exitCode, err := testMain(m)
+	if err != nil {
+		log.Fatal(err)
+	}
+	os.Exit(exitCode)
+}
+
+// cloneTestdataModule clones the packages from src/testshared into gopath.
+// It returns the directory within gopath at which the module root is located.
+func cloneTestdataModule(gopath string) (string, error) {
+	modRoot := filepath.Join(gopath, "src", "testshared")
+	if err := cgotest.OverlayDir(modRoot, "testdata"); err != nil {
+		return "", err
+	}
+	if err := os.WriteFile(filepath.Join(modRoot, "go.mod"), []byte("module testshared\n"), 0644); err != nil {
+		return "", err
+	}
+	return modRoot, nil
+}
+
+// cloneGOROOTDeps copies (or symlinks) the portions of GOROOT/src and
+// GOROOT/pkg relevant to this test into the given directory.
+// It must be run from within the testdata module.
+func cloneGOROOTDeps(goroot string) error {
+	// Before we clone GOROOT, figure out which packages we need to copy over.
+	listArgs := []string{
+		"list",
+		"-deps",
+		"-f", "{{if and .Standard (not .ForTest)}}{{.ImportPath}}{{end}}",
+	}
+	stdDeps := goCmd(nil, append(listArgs, minpkgs...)...)
+	testdataDeps := goCmd(nil, append(listArgs, "-test", "./...")...)
+
+	pkgs := append(strings.Split(strings.TrimSpace(stdDeps), "\n"),
+		strings.Split(strings.TrimSpace(testdataDeps), "\n")...)
+	sort.Strings(pkgs)
+	var pkgRoots []string
+	for _, pkg := range pkgs {
+		parentFound := false
+		for _, prev := range pkgRoots {
+			if pkg == prev || strings.HasPrefix(pkg, prev+"/") {
+				// We will copy in the source for pkg when we copy in prev.
+				parentFound = true
+				break
+			}
+		}
+		if !parentFound {
+			pkgRoots = append(pkgRoots, pkg)
+		}
+	}
+
+	gorootDirs := []string{
+		"pkg/tool",
+		"pkg/include",
+	}
+	for _, pkg := range pkgRoots {
+		gorootDirs = append(gorootDirs, filepath.Join("src", pkg))
+	}
+
+	for _, dir := range gorootDirs {
+		if testing.Verbose() {
+			fmt.Fprintf(os.Stderr, "+ cp -r %s %s\n", filepath.Join(oldGOROOT, dir), filepath.Join(goroot, dir))
+		}
+		if err := cgotest.OverlayDir(filepath.Join(goroot, dir), filepath.Join(oldGOROOT, dir)); err != nil {
+			return err
+		}
+	}
+
+	return nil
+}
+
+// The shared library was built at the expected location.
+func TestSOBuilt(t *testing.T) {
+	globalSkip(t)
+	_, err := os.Stat(filepath.Join(gorootInstallDir, soname))
+	if err != nil {
+		t.Error(err)
+	}
+}
+
+func hasDynTag(f *elf.File, tag elf.DynTag) bool {
+	ds := f.SectionByType(elf.SHT_DYNAMIC)
+	if ds == nil {
+		return false
+	}
+	d, err := ds.Data()
+	if err != nil {
+		return false
+	}
+	for len(d) > 0 {
+		var t elf.DynTag
+		switch f.Class {
+		case elf.ELFCLASS32:
+			t = elf.DynTag(f.ByteOrder.Uint32(d[0:4]))
+			d = d[8:]
+		case elf.ELFCLASS64:
+			t = elf.DynTag(f.ByteOrder.Uint64(d[0:8]))
+			d = d[16:]
+		}
+		if t == tag {
+			return true
+		}
+	}
+	return false
+}
+
+// The shared library does not have relocations against the text segment.
+func TestNoTextrel(t *testing.T) {
+	globalSkip(t)
+	sopath := filepath.Join(gorootInstallDir, soname)
+	f, err := elf.Open(sopath)
+	if err != nil {
+		t.Fatal("elf.Open failed: ", err)
+	}
+	defer f.Close()
+	if hasDynTag(f, elf.DT_TEXTREL) {
+		t.Errorf("%s has DT_TEXTREL set", soname)
+	}
+}
+
+// The shared library does not contain symbols called ".dup"
+// (See golang.org/issue/14841.)
+func TestNoDupSymbols(t *testing.T) {
+	globalSkip(t)
+	sopath := filepath.Join(gorootInstallDir, soname)
+	f, err := elf.Open(sopath)
+	if err != nil {
+		t.Fatal("elf.Open failed: ", err)
+	}
+	defer f.Close()
+	syms, err := f.Symbols()
+	if err != nil {
+		t.Errorf("error reading symbols %v", err)
+		return
+	}
+	for _, s := range syms {
+		if s.Name == ".dup" {
+			t.Fatalf("%s contains symbol called .dup", sopath)
+		}
+	}
+}
+
+// The install command should have created a "shlibname" file for the
+// listed packages (and runtime/cgo, and math on arm) indicating the
+// name of the shared library containing it.
+func TestShlibnameFiles(t *testing.T) {
+	globalSkip(t)
+	pkgs := append([]string{}, minpkgs...)
+	pkgs = append(pkgs, "runtime/cgo")
+	if runtime.GOARCH == "arm" {
+		pkgs = append(pkgs, "math")
+	}
+	for _, pkg := range pkgs {
+		shlibnamefile := filepath.Join(gorootInstallDir, pkg+".shlibname")
+		contentsb, err := os.ReadFile(shlibnamefile)
+		if err != nil {
+			t.Errorf("error reading shlibnamefile for %s: %v", pkg, err)
+			continue
+		}
+		contents := strings.TrimSpace(string(contentsb))
+		if contents != soname {
+			t.Errorf("shlibnamefile for %s has wrong contents: %q", pkg, contents)
+		}
+	}
+}
+
+// Is a given offset into the file contained in a loaded segment?
+func isOffsetLoaded(f *elf.File, offset uint64) bool {
+	for _, prog := range f.Progs {
+		if prog.Type == elf.PT_LOAD {
+			if prog.Off <= offset && offset < prog.Off+prog.Filesz {
+				return true
+			}
+		}
+	}
+	return false
+}
+
+func rnd(v int32, r int32) int32 {
+	if r <= 0 {
+		return v
+	}
+	v += r - 1
+	c := v % r
+	if c < 0 {
+		c += r
+	}
+	v -= c
+	return v
+}
+
+func readwithpad(r io.Reader, sz int32) ([]byte, error) {
+	data := make([]byte, rnd(sz, 4))
+	_, err := io.ReadFull(r, data)
+	if err != nil {
+		return nil, err
+	}
+	data = data[:sz]
+	return data, nil
+}
+
+type note struct {
+	name    string
+	tag     int32
+	desc    string
+	section *elf.Section
+}
+
+// Read all notes from f. As ELF section names are not supposed to be special, one
+// looks for a particular note by scanning all SHT_NOTE sections looking for a note
+// with a particular "name" and "tag".
+func readNotes(f *elf.File) ([]*note, error) {
+	var notes []*note
+	for _, sect := range f.Sections {
+		if sect.Type != elf.SHT_NOTE {
+			continue
+		}
+		r := sect.Open()
+		for {
+			var namesize, descsize, tag 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, &tag)
+			if err != nil {
+				return nil, fmt.Errorf("read type failed: %v", err)
+			}
+			name, err := readwithpad(r, namesize)
+			if err != nil {
+				return nil, fmt.Errorf("read name failed: %v", err)
+			}
+			desc, err := readwithpad(r, descsize)
+			if err != nil {
+				return nil, fmt.Errorf("read desc failed: %v", err)
+			}
+			notes = append(notes, &note{name: string(name), tag: tag, desc: string(desc), section: sect})
+		}
+	}
+	return notes, nil
+}
+
+func dynStrings(t *testing.T, path string, flag elf.DynTag) []string {
+	t.Helper()
+	f, err := elf.Open(path)
+	if err != nil {
+		t.Fatalf("elf.Open(%q) failed: %v", path, err)
+	}
+	defer f.Close()
+	dynstrings, err := f.DynString(flag)
+	if err != nil {
+		t.Fatalf("DynString(%s) failed on %s: %v", flag, path, err)
+	}
+	return dynstrings
+}
+
+func AssertIsLinkedToRegexp(t *testing.T, path string, re *regexp.Regexp) {
+	t.Helper()
+	for _, dynstring := range dynStrings(t, path, elf.DT_NEEDED) {
+		if re.MatchString(dynstring) {
+			return
+		}
+	}
+	t.Errorf("%s is not linked to anything matching %v", path, re)
+}
+
+func AssertIsLinkedTo(t *testing.T, path, lib string) {
+	t.Helper()
+	AssertIsLinkedToRegexp(t, path, regexp.MustCompile(regexp.QuoteMeta(lib)))
+}
+
+func AssertHasRPath(t *testing.T, path, dir string) {
+	t.Helper()
+	for _, tag := range []elf.DynTag{elf.DT_RPATH, elf.DT_RUNPATH} {
+		for _, dynstring := range dynStrings(t, path, tag) {
+			for _, rpath := range strings.Split(dynstring, ":") {
+				if filepath.Clean(rpath) == filepath.Clean(dir) {
+					return
+				}
+			}
+		}
+	}
+	t.Errorf("%s does not have rpath %s", path, dir)
+}
+
+// Build a trivial program that links against the shared runtime and check it runs.
+func TestTrivialExecutable(t *testing.T) {
+	globalSkip(t)
+	goCmd(t, "install", "-linkshared", "./trivial")
+	run(t, "trivial executable", "../../bin/trivial")
+	AssertIsLinkedTo(t, "../../bin/trivial", soname)
+	AssertHasRPath(t, "../../bin/trivial", gorootInstallDir)
+	// It is 19K on linux/amd64, with separate-code in binutils ld and 64k being most common alignment
+	// 4*64k should be enough, but this might need revision eventually.
+	checkSize(t, "../../bin/trivial", 256000)
+}
+
+// Build a trivial program in PIE mode that links against the shared runtime and check it runs.
+func TestTrivialExecutablePIE(t *testing.T) {
+	globalSkip(t)
+	goCmd(t, "build", "-buildmode=pie", "-o", "trivial.pie", "-linkshared", "./trivial")
+	run(t, "trivial executable", "./trivial.pie")
+	AssertIsLinkedTo(t, "./trivial.pie", soname)
+	AssertHasRPath(t, "./trivial.pie", gorootInstallDir)
+	// It is 19K on linux/amd64, with separate-code in binutils ld and 64k being most common alignment
+	// 4*64k should be enough, but this might need revision eventually.
+	checkSize(t, "./trivial.pie", 256000)
+}
+
+// Check that the file size does not exceed a limit.
+func checkSize(t *testing.T, f string, limit int64) {
+	fi, err := os.Stat(f)
+	if err != nil {
+		t.Fatalf("stat failed: %v", err)
+	}
+	if sz := fi.Size(); sz > limit {
+		t.Errorf("file too large: got %d, want <= %d", sz, limit)
+	}
+}
+
+// Build a division test program and check it runs.
+func TestDivisionExecutable(t *testing.T) {
+	globalSkip(t)
+	goCmd(t, "install", "-linkshared", "./division")
+	run(t, "division executable", "../../bin/division")
+}
+
+// Build an executable that uses cgo linked against the shared runtime and check it
+// runs.
+func TestCgoExecutable(t *testing.T) {
+	globalSkip(t)
+	goCmd(t, "install", "-linkshared", "./execgo")
+	run(t, "cgo executable", "../../bin/execgo")
+}
+
+func checkPIE(t *testing.T, name string) {
+	f, err := elf.Open(name)
+	if err != nil {
+		t.Fatal("elf.Open failed: ", err)
+	}
+	defer f.Close()
+	if f.Type != elf.ET_DYN {
+		t.Errorf("%s has type %v, want ET_DYN", name, f.Type)
+	}
+	if hasDynTag(f, elf.DT_TEXTREL) {
+		t.Errorf("%s has DT_TEXTREL set", name)
+	}
+}
+
+func TestTrivialPIE(t *testing.T) {
+	if strings.HasSuffix(os.Getenv("GO_BUILDER_NAME"), "-alpine") {
+		t.Skip("skipping on alpine until issue #54354 resolved")
+	}
+	globalSkip(t)
+	testenv.MustHaveBuildMode(t, "pie")
+	name := "trivial_pie"
+	goCmd(t, "build", "-buildmode=pie", "-o="+name, "./trivial")
+	defer os.Remove(name)
+	run(t, name, "./"+name)
+	checkPIE(t, name)
+}
+
+func TestCgoPIE(t *testing.T) {
+	globalSkip(t)
+	testenv.MustHaveCGO(t)
+	testenv.MustHaveBuildMode(t, "pie")
+	name := "cgo_pie"
+	goCmd(t, "build", "-buildmode=pie", "-o="+name, "./execgo")
+	defer os.Remove(name)
+	run(t, name, "./"+name)
+	checkPIE(t, name)
+}
+
+// Build a GOPATH package into a shared library that links against the goroot runtime
+// and an executable that links against both.
+func TestGopathShlib(t *testing.T) {
+	globalSkip(t)
+	goCmd(t, "install", "-buildmode=shared", "-linkshared", "./depBase")
+	shlib := goCmd(t, "list", "-f", "{{.Shlib}}", "-buildmode=shared", "-linkshared", "./depBase")
+	AssertIsLinkedTo(t, shlib, soname)
+	goCmd(t, "install", "-linkshared", "./exe")
+	AssertIsLinkedTo(t, "../../bin/exe", soname)
+	AssertIsLinkedTo(t, "../../bin/exe", filepath.Base(shlib))
+	AssertHasRPath(t, "../../bin/exe", gorootInstallDir)
+	AssertHasRPath(t, "../../bin/exe", filepath.Dir(gopathInstallDir))
+	// And check it runs.
+	run(t, "executable linked to GOPATH library", "../../bin/exe")
+}
+
+// The shared library contains a note listing the packages it contains in a section
+// that is not mapped into memory.
+func testPkgListNote(t *testing.T, f *elf.File, note *note) {
+	if note.section.Flags != 0 {
+		t.Errorf("package list section has flags %v, want 0", note.section.Flags)
+	}
+	if isOffsetLoaded(f, note.section.Offset) {
+		t.Errorf("package list section contained in PT_LOAD segment")
+	}
+	if note.desc != "testshared/depBase\n" {
+		t.Errorf("incorrect package list %q, want %q", note.desc, "testshared/depBase\n")
+	}
+}
+
+// The shared library contains a note containing the ABI hash that is mapped into
+// memory and there is a local symbol called go.link.abihashbytes that points 16
+// bytes into it.
+func testABIHashNote(t *testing.T, f *elf.File, note *note) {
+	if note.section.Flags != elf.SHF_ALLOC {
+		t.Errorf("abi hash section has flags %v, want SHF_ALLOC", note.section.Flags)
+	}
+	if !isOffsetLoaded(f, note.section.Offset) {
+		t.Errorf("abihash section not contained in PT_LOAD segment")
+	}
+	var hashbytes elf.Symbol
+	symbols, err := f.Symbols()
+	if err != nil {
+		t.Errorf("error reading symbols %v", err)
+		return
+	}
+	for _, sym := range symbols {
+		if sym.Name == "go:link.abihashbytes" {
+			hashbytes = sym
+		}
+	}
+	if hashbytes.Name == "" {
+		t.Errorf("no symbol called go:link.abihashbytes")
+		return
+	}
+	if elf.ST_BIND(hashbytes.Info) != elf.STB_LOCAL {
+		t.Errorf("%s has incorrect binding %v, want STB_LOCAL", hashbytes.Name, elf.ST_BIND(hashbytes.Info))
+	}
+	if f.Sections[hashbytes.Section] != note.section {
+		t.Errorf("%s has incorrect section %v, want %s", hashbytes.Name, f.Sections[hashbytes.Section].Name, note.section.Name)
+	}
+	if hashbytes.Value-note.section.Addr != 16 {
+		t.Errorf("%s has incorrect offset into section %d, want 16", hashbytes.Name, hashbytes.Value-note.section.Addr)
+	}
+}
+
+// A Go shared library contains a note indicating which other Go shared libraries it
+// was linked against in an unmapped section.
+func testDepsNote(t *testing.T, f *elf.File, note *note) {
+	if note.section.Flags != 0 {
+		t.Errorf("package list section has flags %v, want 0", note.section.Flags)
+	}
+	if isOffsetLoaded(f, note.section.Offset) {
+		t.Errorf("package list section contained in PT_LOAD segment")
+	}
+	// libdepBase.so just links against the lib containing the runtime.
+	if note.desc != soname {
+		t.Errorf("incorrect dependency list %q, want %q", note.desc, soname)
+	}
+}
+
+// The shared library contains notes with defined contents; see above.
+func TestNotes(t *testing.T) {
+	globalSkip(t)
+	goCmd(t, "install", "-buildmode=shared", "-linkshared", "./depBase")
+	shlib := goCmd(t, "list", "-f", "{{.Shlib}}", "-buildmode=shared", "-linkshared", "./depBase")
+	f, err := elf.Open(shlib)
+	if err != nil {
+		t.Fatal(err)
+	}
+	defer f.Close()
+	notes, err := readNotes(f)
+	if err != nil {
+		t.Fatal(err)
+	}
+	pkgListNoteFound := false
+	abiHashNoteFound := false
+	depsNoteFound := false
+	for _, note := range notes {
+		if note.name != "Go\x00\x00" {
+			continue
+		}
+		switch note.tag {
+		case 1: // ELF_NOTE_GOPKGLIST_TAG
+			if pkgListNoteFound {
+				t.Error("multiple package list notes")
+			}
+			testPkgListNote(t, f, note)
+			pkgListNoteFound = true
+		case 2: // ELF_NOTE_GOABIHASH_TAG
+			if abiHashNoteFound {
+				t.Error("multiple abi hash notes")
+			}
+			testABIHashNote(t, f, note)
+			abiHashNoteFound = true
+		case 3: // ELF_NOTE_GODEPS_TAG
+			if depsNoteFound {
+				t.Error("multiple dependency list notes")
+			}
+			testDepsNote(t, f, note)
+			depsNoteFound = true
+		}
+	}
+	if !pkgListNoteFound {
+		t.Error("package list note not found")
+	}
+	if !abiHashNoteFound {
+		t.Error("abi hash note not found")
+	}
+	if !depsNoteFound {
+		t.Error("deps note not found")
+	}
+}
+
+// Build a GOPATH package (depBase) into a shared library that links against the goroot
+// runtime, another package (dep2) that links against the first, and an
+// executable that links against dep2.
+func TestTwoGopathShlibs(t *testing.T) {
+	globalSkip(t)
+	goCmd(t, "install", "-buildmode=shared", "-linkshared", "./depBase")
+	goCmd(t, "install", "-buildmode=shared", "-linkshared", "./dep2")
+	goCmd(t, "install", "-linkshared", "./exe2")
+	run(t, "executable linked to GOPATH library", "../../bin/exe2")
+}
+
+func TestThreeGopathShlibs(t *testing.T) {
+	globalSkip(t)
+	goCmd(t, "install", "-buildmode=shared", "-linkshared", "./depBase")
+	goCmd(t, "install", "-buildmode=shared", "-linkshared", "./dep2")
+	goCmd(t, "install", "-buildmode=shared", "-linkshared", "./dep3")
+	goCmd(t, "install", "-linkshared", "./exe3")
+	run(t, "executable linked to GOPATH library", "../../bin/exe3")
+}
+
+// If gccgo is not available or not new enough, call t.Skip.
+func requireGccgo(t *testing.T) {
+	t.Helper()
+
+	if runtime.GOARCH == "ppc64" || runtime.GOARCH == "ppc64le" {
+		t.Skip("gccgo test skipped on PPC64 until issue #60798 is resolved")
+	}
+
+	gccgoName := os.Getenv("GCCGO")
+	if gccgoName == "" {
+		gccgoName = "gccgo"
+	}
+	gccgoPath, err := exec.LookPath(gccgoName)
+	if err != nil {
+		t.Skip("gccgo not found")
+	}
+	cmd := exec.Command(gccgoPath, "-dumpversion")
+	output, err := cmd.CombinedOutput()
+	if err != nil {
+		t.Fatalf("%s -dumpversion failed: %v\n%s", gccgoPath, err, output)
+	}
+	dot := bytes.Index(output, []byte{'.'})
+	if dot > 0 {
+		output = output[:dot]
+	}
+	major, err := strconv.Atoi(strings.TrimSpace(string(output)))
+	if err != nil {
+		t.Skipf("can't parse gccgo version number %s", output)
+	}
+	if major < 5 {
+		t.Skipf("gccgo too old (%s)", strings.TrimSpace(string(output)))
+	}
+
+	gomod, err := exec.Command("go", "env", "GOMOD").Output()
+	if err != nil {
+		t.Fatalf("go env GOMOD: %v", err)
+	}
+	if len(bytes.TrimSpace(gomod)) > 0 {
+		t.Skipf("gccgo not supported in module mode; see golang.org/issue/30344")
+	}
+}
+
+// Build a GOPATH package into a shared library with gccgo and an executable that
+// links against it.
+func TestGoPathShlibGccgo(t *testing.T) {
+	globalSkip(t)
+	requireGccgo(t)
+
+	libgoRE := regexp.MustCompile("libgo.so.[0-9]+")
+
+	goCmd(t, "install", "-compiler=gccgo", "-buildmode=shared", "-linkshared", "./depBase")
+
+	// Run 'go list' after 'go install': with gccgo, we apparently don't know the
+	// shlib location until after we've installed it.
+	shlib := goCmd(t, "list", "-compiler=gccgo", "-buildmode=shared", "-linkshared", "-f", "{{.Shlib}}", "./depBase")
+
+	AssertIsLinkedToRegexp(t, shlib, libgoRE)
+	goCmd(t, "install", "-compiler=gccgo", "-linkshared", "./exe")
+	AssertIsLinkedToRegexp(t, "../../bin/exe", libgoRE)
+	AssertIsLinkedTo(t, "../../bin/exe", filepath.Base(shlib))
+	AssertHasRPath(t, "../../bin/exe", filepath.Dir(shlib))
+	// And check it runs.
+	run(t, "gccgo-built", "../../bin/exe")
+}
+
+// The gccgo version of TestTwoGopathShlibs: build a GOPATH package into a shared
+// library with gccgo, another GOPATH package that depends on the first and an
+// executable that links the second library.
+func TestTwoGopathShlibsGccgo(t *testing.T) {
+	globalSkip(t)
+	requireGccgo(t)
+
+	libgoRE := regexp.MustCompile("libgo.so.[0-9]+")
+
+	goCmd(t, "install", "-compiler=gccgo", "-buildmode=shared", "-linkshared", "./depBase")
+	goCmd(t, "install", "-compiler=gccgo", "-buildmode=shared", "-linkshared", "./dep2")
+	goCmd(t, "install", "-compiler=gccgo", "-linkshared", "./exe2")
+
+	// Run 'go list' after 'go install': with gccgo, we apparently don't know the
+	// shlib location until after we've installed it.
+	dep2 := goCmd(t, "list", "-compiler=gccgo", "-buildmode=shared", "-linkshared", "-f", "{{.Shlib}}", "./dep2")
+	depBase := goCmd(t, "list", "-compiler=gccgo", "-buildmode=shared", "-linkshared", "-f", "{{.Shlib}}", "./depBase")
+
+	AssertIsLinkedToRegexp(t, depBase, libgoRE)
+	AssertIsLinkedToRegexp(t, dep2, libgoRE)
+	AssertIsLinkedTo(t, dep2, filepath.Base(depBase))
+	AssertIsLinkedToRegexp(t, "../../bin/exe2", libgoRE)
+	AssertIsLinkedTo(t, "../../bin/exe2", filepath.Base(dep2))
+	AssertIsLinkedTo(t, "../../bin/exe2", filepath.Base(depBase))
+
+	// And check it runs.
+	run(t, "gccgo-built", "../../bin/exe2")
+}
+
+// Testing rebuilding of shared libraries when they are stale is a bit more
+// complicated that it seems like it should be. First, we make everything "old": but
+// only a few seconds old, or it might be older than gc (or the runtime source) and
+// everything will get rebuilt. Then define a timestamp slightly newer than this
+// time, which is what we set the mtime to of a file to cause it to be seen as new,
+// and finally another slightly even newer one that we can compare files against to
+// see if they have been rebuilt.
+var oldTime = time.Now().Add(-9 * time.Second)
+var nearlyNew = time.Now().Add(-6 * time.Second)
+var stampTime = time.Now().Add(-3 * time.Second)
+
+// resetFileStamps makes "everything" (bin, src, pkg from GOPATH and the
+// test-specific parts of GOROOT) appear old.
+func resetFileStamps() {
+	chtime := func(path string, info os.FileInfo, err error) error {
+		return os.Chtimes(path, oldTime, oldTime)
+	}
+	reset := func(path string) {
+		if err := filepath.Walk(path, chtime); err != nil {
+			log.Panicf("resetFileStamps failed: %v", err)
+		}
+
+	}
+	reset("../../bin")
+	reset("../../pkg")
+	reset("../../src")
+	reset(gorootInstallDir)
+}
+
+// touch changes path and returns a function that changes it back.
+// It also sets the time of the file, so that we can see if it is rewritten.
+func touch(t *testing.T, path string) (cleanup func()) {
+	t.Helper()
+	data, err := os.ReadFile(path)
+	if err != nil {
+		t.Fatal(err)
+	}
+	old := make([]byte, len(data))
+	copy(old, data)
+	if bytes.HasPrefix(data, []byte("!<arch>\n")) {
+		// Change last digit of build ID.
+		// (Content ID in the new content-based build IDs.)
+		const marker = `build id "`
+		i := bytes.Index(data, []byte(marker))
+		if i < 0 {
+			t.Fatal("cannot find build id in archive")
+		}
+		j := bytes.IndexByte(data[i+len(marker):], '"')
+		if j < 0 {
+			t.Fatal("cannot find build id in archive")
+		}
+		i += len(marker) + j - 1
+		if data[i] == 'a' {
+			data[i] = 'b'
+		} else {
+			data[i] = 'a'
+		}
+	} else {
+		// assume it's a text file
+		data = append(data, '\n')
+	}
+
+	// If the file is still a symlink from an overlay, delete it so that we will
+	// replace it with a regular file instead of overwriting the symlinked one.
+	fi, err := os.Lstat(path)
+	if err == nil && !fi.Mode().IsRegular() {
+		fi, err = os.Stat(path)
+		if err := os.Remove(path); err != nil {
+			t.Fatal(err)
+		}
+	}
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	// If we're replacing a symlink to a read-only file, make the new file
+	// user-writable.
+	perm := fi.Mode().Perm() | 0200
+
+	if err := os.WriteFile(path, data, perm); err != nil {
+		t.Fatal(err)
+	}
+	if err := os.Chtimes(path, nearlyNew, nearlyNew); err != nil {
+		t.Fatal(err)
+	}
+	return func() {
+		if err := os.WriteFile(path, old, perm); err != nil {
+			t.Fatal(err)
+		}
+	}
+}
+
+// isNew returns if the path is newer than the time stamp used by touch.
+func isNew(t *testing.T, path string) bool {
+	t.Helper()
+	fi, err := os.Stat(path)
+	if err != nil {
+		t.Fatal(err)
+	}
+	return fi.ModTime().After(stampTime)
+}
+
+// Fail unless path has been rebuilt (i.e. is newer than the time stamp used by
+// isNew)
+func AssertRebuilt(t *testing.T, msg, path string) {
+	t.Helper()
+	if !isNew(t, path) {
+		t.Errorf("%s was not rebuilt (%s)", msg, path)
+	}
+}
+
+// Fail if path has been rebuilt (i.e. is newer than the time stamp used by isNew)
+func AssertNotRebuilt(t *testing.T, msg, path string) {
+	t.Helper()
+	if isNew(t, path) {
+		t.Errorf("%s was rebuilt (%s)", msg, path)
+	}
+}
+
+func TestRebuilding(t *testing.T) {
+	globalSkip(t)
+	goCmd(t, "install", "-buildmode=shared", "-linkshared", "./depBase")
+	goCmd(t, "install", "-linkshared", "./exe")
+	info := strings.Fields(goCmd(t, "list", "-buildmode=shared", "-linkshared", "-f", "{{.Target}} {{.Shlib}}", "./depBase"))
+	if len(info) != 2 {
+		t.Fatalf("go list failed to report Target and/or Shlib")
+	}
+	target := info[0]
+	shlib := info[1]
+
+	// If the source is newer than both the .a file and the .so, both are rebuilt.
+	t.Run("newsource", func(t *testing.T) {
+		resetFileStamps()
+		cleanup := touch(t, "./depBase/dep.go")
+		defer func() {
+			cleanup()
+			goCmd(t, "install", "-linkshared", "./exe")
+		}()
+		goCmd(t, "install", "-linkshared", "./exe")
+		AssertRebuilt(t, "new source", target)
+		AssertRebuilt(t, "new source", shlib)
+	})
+
+	// If the .a file is newer than the .so, the .so is rebuilt (but not the .a)
+	t.Run("newarchive", func(t *testing.T) {
+		resetFileStamps()
+		AssertNotRebuilt(t, "new .a file before build", target)
+		goCmd(t, "list", "-linkshared", "-f={{.ImportPath}} {{.Stale}} {{.StaleReason}} {{.Target}}", "./depBase")
+		AssertNotRebuilt(t, "new .a file before build", target)
+		cleanup := touch(t, target)
+		defer func() {
+			cleanup()
+			goCmd(t, "install", "-v", "-linkshared", "./exe")
+		}()
+		goCmd(t, "install", "-v", "-linkshared", "./exe")
+		AssertNotRebuilt(t, "new .a file", target)
+		AssertRebuilt(t, "new .a file", shlib)
+	})
+}
+
+func appendFile(t *testing.T, path, content string) {
+	t.Helper()
+	f, err := os.OpenFile(path, os.O_WRONLY|os.O_APPEND, 0660)
+	if err != nil {
+		t.Fatalf("os.OpenFile failed: %v", err)
+	}
+	defer func() {
+		err := f.Close()
+		if err != nil {
+			t.Fatalf("f.Close failed: %v", err)
+		}
+	}()
+	_, err = f.WriteString(content)
+	if err != nil {
+		t.Fatalf("f.WriteString failed: %v", err)
+	}
+}
+
+func createFile(t *testing.T, path, content string) {
+	t.Helper()
+	f, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_EXCL, 0644)
+	if err != nil {
+		t.Fatalf("os.OpenFile failed: %v", err)
+	}
+	_, err = f.WriteString(content)
+	if closeErr := f.Close(); err == nil {
+		err = closeErr
+	}
+	if err != nil {
+		t.Fatalf("WriteString failed: %v", err)
+	}
+}
+
+func TestABIChecking(t *testing.T) {
+	globalSkip(t)
+	goCmd(t, "install", "-buildmode=shared", "-linkshared", "./depBase")
+	goCmd(t, "install", "-linkshared", "./exe")
+
+	// If we make an ABI-breaking change to depBase and rebuild libp.so but not exe,
+	// exe will abort with a complaint on startup.
+	// This assumes adding an exported function breaks ABI, which is not true in
+	// some senses but suffices for the narrow definition of ABI compatibility the
+	// toolchain uses today.
+	resetFileStamps()
+
+	createFile(t, "./depBase/break.go", "package depBase\nfunc ABIBreak() {}\n")
+	defer os.Remove("./depBase/break.go")
+
+	goCmd(t, "install", "-buildmode=shared", "-linkshared", "./depBase")
+	c := exec.Command("../../bin/exe")
+	output, err := c.CombinedOutput()
+	if err == nil {
+		t.Fatal("executing exe did not fail after ABI break")
+	}
+	scanner := bufio.NewScanner(bytes.NewReader(output))
+	foundMsg := false
+	const wantPrefix = "abi mismatch detected between the executable and lib"
+	for scanner.Scan() {
+		if strings.HasPrefix(scanner.Text(), wantPrefix) {
+			foundMsg = true
+			break
+		}
+	}
+	if err = scanner.Err(); err != nil {
+		t.Errorf("scanner encountered error: %v", err)
+	}
+	if !foundMsg {
+		t.Fatalf("exe failed, but without line %q; got output:\n%s", wantPrefix, output)
+	}
+
+	// Rebuilding exe makes it work again.
+	goCmd(t, "install", "-linkshared", "./exe")
+	run(t, "rebuilt exe", "../../bin/exe")
+
+	// If we make a change which does not break ABI (such as adding an unexported
+	// function) and rebuild libdepBase.so, exe still works, even if new function
+	// is in a file by itself.
+	resetFileStamps()
+	createFile(t, "./depBase/dep2.go", "package depBase\nfunc noABIBreak() {}\n")
+	goCmd(t, "install", "-buildmode=shared", "-linkshared", "./depBase")
+	run(t, "after non-ABI breaking change", "../../bin/exe")
+}
+
+// If a package 'explicit' imports a package 'implicit', building
+// 'explicit' into a shared library implicitly includes implicit in
+// the shared library. Building an executable that imports both
+// explicit and implicit builds the code from implicit into the
+// executable rather than fetching it from the shared library. The
+// link still succeeds and the executable still runs though.
+func TestImplicitInclusion(t *testing.T) {
+	globalSkip(t)
+	goCmd(t, "install", "-buildmode=shared", "-linkshared", "./explicit")
+	goCmd(t, "install", "-linkshared", "./implicitcmd")
+	run(t, "running executable linked against library that contains same package as it", "../../bin/implicitcmd")
+}
+
+// Tests to make sure that the type fields of empty interfaces and itab
+// fields of nonempty interfaces are unique even across modules,
+// so that interface equality works correctly.
+func TestInterface(t *testing.T) {
+	globalSkip(t)
+	goCmd(t, "install", "-buildmode=shared", "-linkshared", "./iface_a")
+	// Note: iface_i gets installed implicitly as a dependency of iface_a.
+	goCmd(t, "install", "-buildmode=shared", "-linkshared", "./iface_b")
+	goCmd(t, "install", "-linkshared", "./iface")
+	run(t, "running type/itab uniqueness tester", "../../bin/iface")
+}
+
+// Access a global variable from a library.
+func TestGlobal(t *testing.T) {
+	globalSkip(t)
+	goCmd(t, "install", "-buildmode=shared", "-linkshared", "./globallib")
+	goCmd(t, "install", "-linkshared", "./global")
+	run(t, "global executable", "../../bin/global")
+	AssertIsLinkedTo(t, "../../bin/global", soname)
+	AssertHasRPath(t, "../../bin/global", gorootInstallDir)
+}
+
+// Run a test using -linkshared of an installed shared package.
+// Issue 26400.
+func TestTestInstalledShared(t *testing.T) {
+	globalSkip(t)
+	goCmd(t, "test", "-linkshared", "-test.short", "sync/atomic")
+}
+
+// Test generated pointer method with -linkshared.
+// Issue 25065.
+func TestGeneratedMethod(t *testing.T) {
+	globalSkip(t)
+	goCmd(t, "install", "-buildmode=shared", "-linkshared", "./issue25065")
+}
+
+// Test use of shared library struct with generated hash function.
+// Issue 30768.
+func TestGeneratedHash(t *testing.T) {
+	globalSkip(t)
+	goCmd(t, "install", "-buildmode=shared", "-linkshared", "./issue30768/issue30768lib")
+	goCmd(t, "test", "-linkshared", "./issue30768")
+}
+
+// Test that packages can be added not in dependency order (here a depends on b, and a adds
+// before b). This could happen with e.g. go build -buildmode=shared std. See issue 39777.
+func TestPackageOrder(t *testing.T) {
+	globalSkip(t)
+	goCmd(t, "install", "-buildmode=shared", "-linkshared", "./issue39777/a", "./issue39777/b")
+}
+
+// Test that GC data are generated correctly by the linker when it needs a type defined in
+// a shared library. See issue 39927.
+func TestGCData(t *testing.T) {
+	globalSkip(t)
+	goCmd(t, "install", "-buildmode=shared", "-linkshared", "./gcdata/p")
+	goCmd(t, "build", "-linkshared", "./gcdata/main")
+	runWithEnv(t, "running gcdata/main", []string{"GODEBUG=clobberfree=1"}, "./main")
+}
+
+// Test that we don't decode type symbols from shared libraries (which has no data,
+// causing panic). See issue 44031.
+func TestIssue44031(t *testing.T) {
+	globalSkip(t)
+	goCmd(t, "install", "-buildmode=shared", "-linkshared", "./issue44031/a")
+	goCmd(t, "install", "-buildmode=shared", "-linkshared", "./issue44031/b")
+	goCmd(t, "run", "-linkshared", "./issue44031/main")
+}
+
+// Test that we use a variable from shared libraries (which implement an
+// interface in shared libraries.). A weak reference is used in the itab
+// in main process. It can cause unreachable panic. See issue 47873.
+func TestIssue47873(t *testing.T) {
+	globalSkip(t)
+	goCmd(t, "install", "-buildmode=shared", "-linkshared", "./issue47837/a")
+	goCmd(t, "run", "-linkshared", "./issue47837/main")
+}
+
+// Test that we can build std in shared mode.
+func TestStd(t *testing.T) {
+	if testing.Short() {
+		t.Skip("skip in short mode")
+	}
+	globalSkip(t)
+	t.Parallel()
+	tmpDir := t.TempDir()
+	// Use a temporary pkgdir to not interfere with other tests, and not write to GOROOT.
+	// Cannot use goCmd as it runs with cloned GOROOT which is incomplete.
+	runWithEnv(t, "building std", []string{"GOROOT=" + oldGOROOT},
+		filepath.Join(oldGOROOT, "bin", "go"), "install", "-buildmode=shared", "-pkgdir="+tmpDir, "std")
+
+	// Issue #58966.
+	runWithEnv(t, "testing issue #58966", []string{"GOROOT=" + oldGOROOT},
+		filepath.Join(oldGOROOT, "bin", "go"), "run", "-linkshared", "-pkgdir="+tmpDir, "./issue58966/main.go")
+}
diff --git a/misc/cgo/testshared/testdata/dep2/dep2.go b/src/cmd/cgo/internal/testshared/testdata/dep2/dep2.go
similarity index 100%
rename from misc/cgo/testshared/testdata/dep2/dep2.go
rename to src/cmd/cgo/internal/testshared/testdata/dep2/dep2.go
diff --git a/misc/cgo/testshared/testdata/dep3/dep3.go b/src/cmd/cgo/internal/testshared/testdata/dep3/dep3.go
similarity index 100%
rename from misc/cgo/testshared/testdata/dep3/dep3.go
rename to src/cmd/cgo/internal/testshared/testdata/dep3/dep3.go
diff --git a/src/cmd/cgo/internal/testshared/testdata/depBase/asm.s b/src/cmd/cgo/internal/testshared/testdata/depBase/asm.s
new file mode 100644
index 0000000..51adca3
--- /dev/null
+++ b/src/cmd/cgo/internal/testshared/testdata/depBase/asm.s
@@ -0,0 +1,10 @@
+// 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:build gc
+
+#include "textflag.h"
+
+TEXT ·ImplementedInAsm(SB),NOSPLIT,$0-0
+       RET
diff --git a/misc/cgo/testshared/testdata/depBase/dep.go b/src/cmd/cgo/internal/testshared/testdata/depBase/dep.go
similarity index 100%
rename from misc/cgo/testshared/testdata/depBase/dep.go
rename to src/cmd/cgo/internal/testshared/testdata/depBase/dep.go
diff --git a/src/cmd/cgo/internal/testshared/testdata/depBase/gccgo.go b/src/cmd/cgo/internal/testshared/testdata/depBase/gccgo.go
new file mode 100644
index 0000000..a59d0b8
--- /dev/null
+++ b/src/cmd/cgo/internal/testshared/testdata/depBase/gccgo.go
@@ -0,0 +1,9 @@
+// Copyright 2016 The Go 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:build gccgo
+
+package depBase
+
+func ImplementedInAsm() {}
diff --git a/src/cmd/cgo/internal/testshared/testdata/depBase/stubs.go b/src/cmd/cgo/internal/testshared/testdata/depBase/stubs.go
new file mode 100644
index 0000000..c15e4e9
--- /dev/null
+++ b/src/cmd/cgo/internal/testshared/testdata/depBase/stubs.go
@@ -0,0 +1,9 @@
+// Copyright 2016 The Go 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:build gc
+
+package depBase
+
+func ImplementedInAsm()
diff --git a/misc/cgo/testshared/testdata/division/division.go b/src/cmd/cgo/internal/testshared/testdata/division/division.go
similarity index 100%
rename from misc/cgo/testshared/testdata/division/division.go
rename to src/cmd/cgo/internal/testshared/testdata/division/division.go
diff --git a/misc/cgo/testshared/testdata/exe/exe.go b/src/cmd/cgo/internal/testshared/testdata/exe/exe.go
similarity index 100%
rename from misc/cgo/testshared/testdata/exe/exe.go
rename to src/cmd/cgo/internal/testshared/testdata/exe/exe.go
diff --git a/misc/cgo/testshared/testdata/exe2/exe2.go b/src/cmd/cgo/internal/testshared/testdata/exe2/exe2.go
similarity index 100%
rename from misc/cgo/testshared/testdata/exe2/exe2.go
rename to src/cmd/cgo/internal/testshared/testdata/exe2/exe2.go
diff --git a/misc/cgo/testshared/testdata/exe3/exe3.go b/src/cmd/cgo/internal/testshared/testdata/exe3/exe3.go
similarity index 100%
rename from misc/cgo/testshared/testdata/exe3/exe3.go
rename to src/cmd/cgo/internal/testshared/testdata/exe3/exe3.go
diff --git a/misc/cgo/testshared/testdata/execgo/exe.go b/src/cmd/cgo/internal/testshared/testdata/execgo/exe.go
similarity index 100%
rename from misc/cgo/testshared/testdata/execgo/exe.go
rename to src/cmd/cgo/internal/testshared/testdata/execgo/exe.go
diff --git a/misc/cgo/testshared/testdata/explicit/explicit.go b/src/cmd/cgo/internal/testshared/testdata/explicit/explicit.go
similarity index 100%
rename from misc/cgo/testshared/testdata/explicit/explicit.go
rename to src/cmd/cgo/internal/testshared/testdata/explicit/explicit.go
diff --git a/misc/cgo/testshared/testdata/gcdata/main/main.go b/src/cmd/cgo/internal/testshared/testdata/gcdata/main/main.go
similarity index 100%
rename from misc/cgo/testshared/testdata/gcdata/main/main.go
rename to src/cmd/cgo/internal/testshared/testdata/gcdata/main/main.go
diff --git a/misc/cgo/testshared/testdata/gcdata/p/p.go b/src/cmd/cgo/internal/testshared/testdata/gcdata/p/p.go
similarity index 100%
rename from misc/cgo/testshared/testdata/gcdata/p/p.go
rename to src/cmd/cgo/internal/testshared/testdata/gcdata/p/p.go
diff --git a/misc/cgo/testshared/testdata/global/main.go b/src/cmd/cgo/internal/testshared/testdata/global/main.go
similarity index 100%
rename from misc/cgo/testshared/testdata/global/main.go
rename to src/cmd/cgo/internal/testshared/testdata/global/main.go
diff --git a/misc/cgo/testshared/testdata/globallib/global.go b/src/cmd/cgo/internal/testshared/testdata/globallib/global.go
similarity index 100%
rename from misc/cgo/testshared/testdata/globallib/global.go
rename to src/cmd/cgo/internal/testshared/testdata/globallib/global.go
diff --git a/misc/cgo/testshared/testdata/iface/main.go b/src/cmd/cgo/internal/testshared/testdata/iface/main.go
similarity index 100%
rename from misc/cgo/testshared/testdata/iface/main.go
rename to src/cmd/cgo/internal/testshared/testdata/iface/main.go
diff --git a/misc/cgo/testshared/testdata/iface_a/a.go b/src/cmd/cgo/internal/testshared/testdata/iface_a/a.go
similarity index 100%
rename from misc/cgo/testshared/testdata/iface_a/a.go
rename to src/cmd/cgo/internal/testshared/testdata/iface_a/a.go
diff --git a/misc/cgo/testshared/testdata/iface_b/b.go b/src/cmd/cgo/internal/testshared/testdata/iface_b/b.go
similarity index 100%
rename from misc/cgo/testshared/testdata/iface_b/b.go
rename to src/cmd/cgo/internal/testshared/testdata/iface_b/b.go
diff --git a/misc/cgo/testshared/testdata/iface_i/i.go b/src/cmd/cgo/internal/testshared/testdata/iface_i/i.go
similarity index 100%
rename from misc/cgo/testshared/testdata/iface_i/i.go
rename to src/cmd/cgo/internal/testshared/testdata/iface_i/i.go
diff --git a/misc/cgo/testshared/testdata/implicit/implicit.go b/src/cmd/cgo/internal/testshared/testdata/implicit/implicit.go
similarity index 100%
rename from misc/cgo/testshared/testdata/implicit/implicit.go
rename to src/cmd/cgo/internal/testshared/testdata/implicit/implicit.go
diff --git a/misc/cgo/testshared/testdata/implicitcmd/implicitcmd.go b/src/cmd/cgo/internal/testshared/testdata/implicitcmd/implicitcmd.go
similarity index 100%
rename from misc/cgo/testshared/testdata/implicitcmd/implicitcmd.go
rename to src/cmd/cgo/internal/testshared/testdata/implicitcmd/implicitcmd.go
diff --git a/src/cmd/cgo/internal/testshared/testdata/issue25065/a.go b/src/cmd/cgo/internal/testshared/testdata/issue25065/a.go
new file mode 100644
index 0000000..646de4e
--- /dev/null
+++ b/src/cmd/cgo/internal/testshared/testdata/issue25065/a.go
@@ -0,0 +1,21 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package issue25065 has a type with a method that is
+//  1. referenced in a method expression
+//  2. not called
+//  3. not converted to an interface
+//  4. is a value method but the reference is to the pointer method
+//
+// These cases avoid the call to makefuncsym from typecheckfunc, but we
+// still need to call makefuncsym somehow or the symbol will not be defined.
+package issue25065
+
+type T int
+
+func (t T) M() {}
+
+func F() func(*T) {
+	return (*T).M
+}
diff --git a/misc/cgo/testshared/testdata/issue30768/issue30768lib/lib.go b/src/cmd/cgo/internal/testshared/testdata/issue30768/issue30768lib/lib.go
similarity index 100%
rename from misc/cgo/testshared/testdata/issue30768/issue30768lib/lib.go
rename to src/cmd/cgo/internal/testshared/testdata/issue30768/issue30768lib/lib.go
diff --git a/misc/cgo/testshared/testdata/issue30768/x_test.go b/src/cmd/cgo/internal/testshared/testdata/issue30768/x_test.go
similarity index 100%
rename from misc/cgo/testshared/testdata/issue30768/x_test.go
rename to src/cmd/cgo/internal/testshared/testdata/issue30768/x_test.go
diff --git a/misc/cgo/testshared/testdata/issue39777/a/a.go b/src/cmd/cgo/internal/testshared/testdata/issue39777/a/a.go
similarity index 100%
rename from misc/cgo/testshared/testdata/issue39777/a/a.go
rename to src/cmd/cgo/internal/testshared/testdata/issue39777/a/a.go
diff --git a/misc/cgo/testshared/testdata/issue39777/b/b.go b/src/cmd/cgo/internal/testshared/testdata/issue39777/b/b.go
similarity index 100%
rename from misc/cgo/testshared/testdata/issue39777/b/b.go
rename to src/cmd/cgo/internal/testshared/testdata/issue39777/b/b.go
diff --git a/misc/cgo/testshared/testdata/issue44031/a/a.go b/src/cmd/cgo/internal/testshared/testdata/issue44031/a/a.go
similarity index 100%
rename from misc/cgo/testshared/testdata/issue44031/a/a.go
rename to src/cmd/cgo/internal/testshared/testdata/issue44031/a/a.go
diff --git a/misc/cgo/testshared/testdata/issue44031/b/b.go b/src/cmd/cgo/internal/testshared/testdata/issue44031/b/b.go
similarity index 100%
rename from misc/cgo/testshared/testdata/issue44031/b/b.go
rename to src/cmd/cgo/internal/testshared/testdata/issue44031/b/b.go
diff --git a/misc/cgo/testshared/testdata/issue44031/main/main.go b/src/cmd/cgo/internal/testshared/testdata/issue44031/main/main.go
similarity index 100%
rename from misc/cgo/testshared/testdata/issue44031/main/main.go
rename to src/cmd/cgo/internal/testshared/testdata/issue44031/main/main.go
diff --git a/misc/cgo/testshared/testdata/issue47837/a/a.go b/src/cmd/cgo/internal/testshared/testdata/issue47837/a/a.go
similarity index 100%
rename from misc/cgo/testshared/testdata/issue47837/a/a.go
rename to src/cmd/cgo/internal/testshared/testdata/issue47837/a/a.go
diff --git a/misc/cgo/testshared/testdata/issue47837/main/main.go b/src/cmd/cgo/internal/testshared/testdata/issue47837/main/main.go
similarity index 100%
rename from misc/cgo/testshared/testdata/issue47837/main/main.go
rename to src/cmd/cgo/internal/testshared/testdata/issue47837/main/main.go
diff --git a/src/cmd/cgo/internal/testshared/testdata/issue58966/main.go b/src/cmd/cgo/internal/testshared/testdata/issue58966/main.go
new file mode 100644
index 0000000..2d923c3
--- /dev/null
+++ b/src/cmd/cgo/internal/testshared/testdata/issue58966/main.go
@@ -0,0 +1,15 @@
+// Copyright 2023 The Go Authors. 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 "crypto/elliptic"
+
+var curve elliptic.Curve
+
+func main() {
+	switch curve {
+	case elliptic.P224():
+	}
+}
diff --git a/misc/cgo/testshared/testdata/trivial/trivial.go b/src/cmd/cgo/internal/testshared/testdata/trivial/trivial.go
similarity index 100%
rename from misc/cgo/testshared/testdata/trivial/trivial.go
rename to src/cmd/cgo/internal/testshared/testdata/trivial/trivial.go
diff --git a/src/cmd/cgo/internal/testso/so_test.go b/src/cmd/cgo/internal/testso/so_test.go
new file mode 100644
index 0000000..e011167
--- /dev/null
+++ b/src/cmd/cgo/internal/testso/so_test.go
@@ -0,0 +1,137 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package so_test
+
+import (
+	"cmd/cgo/internal/cgotest"
+	"internal/testenv"
+	"log"
+	"os"
+	"os/exec"
+	"path/filepath"
+	"runtime"
+	"strings"
+	"testing"
+)
+
+func TestSO(t *testing.T) {
+	testSO(t, "so")
+}
+
+func TestSOVar(t *testing.T) {
+	testSO(t, "sovar")
+}
+
+func testSO(t *testing.T, dir string) {
+	if runtime.GOOS == "ios" {
+		t.Skip("iOS disallows dynamic loading of user libraries")
+	}
+	testenv.MustHaveGoBuild(t)
+	testenv.MustHaveExec(t)
+	testenv.MustHaveCGO(t)
+
+	GOPATH, err := os.MkdirTemp("", "cgosotest")
+	if err != nil {
+		log.Fatal(err)
+	}
+	defer os.RemoveAll(GOPATH)
+
+	modRoot := filepath.Join(GOPATH, "src", "cgosotest")
+	if err := cgotest.OverlayDir(modRoot, filepath.Join("testdata", dir)); err != nil {
+		log.Panic(err)
+	}
+	if err := os.WriteFile(filepath.Join(modRoot, "go.mod"), []byte("module cgosotest\n"), 0666); err != nil {
+		log.Panic(err)
+	}
+
+	cmd := exec.Command("go", "env", "CC", "GOGCCFLAGS")
+	cmd.Dir = modRoot
+	cmd.Stderr = new(strings.Builder)
+	cmd.Env = append(os.Environ(), "GOPATH="+GOPATH)
+	out, err := cmd.Output()
+	if err != nil {
+		t.Fatalf("%s: %v\n%s", strings.Join(cmd.Args, " "), err, cmd.Stderr)
+	}
+	lines := strings.Split(string(out), "\n")
+	if len(lines) != 3 || lines[2] != "" {
+		t.Fatalf("Unexpected output from %s:\n%s", strings.Join(cmd.Args, " "), lines)
+	}
+
+	cc := lines[0]
+	if cc == "" {
+		t.Fatal("CC environment variable (go env CC) cannot be empty")
+	}
+	gogccflags := strings.Split(lines[1], " ")
+
+	// build shared object
+	ext := "so"
+	args := append(gogccflags, "-shared")
+	switch runtime.GOOS {
+	case "darwin", "ios":
+		ext = "dylib"
+		args = append(args, "-undefined", "suppress", "-flat_namespace")
+	case "windows":
+		ext = "dll"
+		args = append(args, "-DEXPORT_DLL")
+		// At least in mingw-clang it is not permitted to just name a .dll
+		// on the command line. You must name the corresponding import
+		// library instead, even though the dll is used when the executable is run.
+		args = append(args, "-Wl,-out-implib,libcgosotest.a")
+	case "aix":
+		ext = "so.1"
+	}
+	sofname := "libcgosotest." + ext
+	args = append(args, "-o", sofname, "cgoso_c.c")
+
+	cmd = exec.Command(cc, args...)
+	cmd.Dir = modRoot
+	cmd.Env = append(os.Environ(), "GOPATH="+GOPATH)
+	out, err = cmd.CombinedOutput()
+	if err != nil {
+		t.Fatalf("%s: %s\n%s", strings.Join(cmd.Args, " "), err, out)
+	}
+	t.Logf("%s:\n%s", strings.Join(cmd.Args, " "), out)
+
+	if runtime.GOOS == "aix" {
+		// Shared object must be wrapped by an archive
+		cmd = exec.Command("ar", "-X64", "-q", "libcgosotest.a", "libcgosotest.so.1")
+		cmd.Dir = modRoot
+		out, err = cmd.CombinedOutput()
+		if err != nil {
+			t.Fatalf("%s: %s\n%s", strings.Join(cmd.Args, " "), err, out)
+		}
+	}
+
+	cmd = exec.Command("go", "build", "-o", "main.exe", "main.go")
+	cmd.Dir = modRoot
+	cmd.Env = append(os.Environ(), "GOPATH="+GOPATH)
+	out, err = cmd.CombinedOutput()
+	if err != nil {
+		t.Fatalf("%s: %s\n%s", strings.Join(cmd.Args, " "), err, out)
+	}
+	t.Logf("%s:\n%s", strings.Join(cmd.Args, " "), out)
+
+	cmd = exec.Command("./main.exe")
+	cmd.Dir = modRoot
+	cmd.Env = append(os.Environ(), "GOPATH="+GOPATH)
+	if runtime.GOOS != "windows" {
+		s := "LD_LIBRARY_PATH"
+		if runtime.GOOS == "darwin" || runtime.GOOS == "ios" {
+			s = "DYLD_LIBRARY_PATH"
+		}
+		cmd.Env = append(os.Environ(), s+"=.")
+
+		// On FreeBSD 64-bit architectures, the 32-bit linker looks for
+		// different environment variables.
+		if runtime.GOOS == "freebsd" && runtime.GOARCH == "386" {
+			cmd.Env = append(cmd.Env, "LD_32_LIBRARY_PATH=.")
+		}
+	}
+	out, err = cmd.CombinedOutput()
+	if err != nil {
+		t.Fatalf("%s: %s\n%s", strings.Join(cmd.Args, " "), err, out)
+	}
+	t.Logf("%s:\n%s", strings.Join(cmd.Args, " "), out)
+}
diff --git a/misc/cgo/testso/testdata/cgoso.c b/src/cmd/cgo/internal/testso/testdata/so/cgoso.c
similarity index 100%
rename from misc/cgo/testso/testdata/cgoso.c
rename to src/cmd/cgo/internal/testso/testdata/so/cgoso.c
diff --git a/misc/cgo/testso/testdata/cgoso.go b/src/cmd/cgo/internal/testso/testdata/so/cgoso.go
similarity index 100%
rename from misc/cgo/testso/testdata/cgoso.go
rename to src/cmd/cgo/internal/testso/testdata/so/cgoso.go
diff --git a/src/cmd/cgo/internal/testso/testdata/so/cgoso_c.c b/src/cmd/cgo/internal/testso/testdata/so/cgoso_c.c
new file mode 100644
index 0000000..d5fb559
--- /dev/null
+++ b/src/cmd/cgo/internal/testso/testdata/so/cgoso_c.c
@@ -0,0 +1,39 @@
+// Copyright 2011 The Go 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:build ignore
+
+#ifdef WIN32
+// A Windows DLL is unable to call an arbitrary function in
+// the main executable. Work around that by making the main
+// executable pass the callback function pointer to us.
+void (*goCallback)(void);
+__declspec(dllexport) void setCallback(void *f)
+{
+	goCallback = (void (*)())f;
+}
+__declspec(dllexport) void sofunc(void);
+#elif defined(_AIX)
+// AIX doesn't allow the creation of a shared object with an
+// undefined symbol. It's possible to bypass this problem by
+// using -Wl,-G and -Wl,-brtl option which allows run-time linking.
+// However, that's not how most of AIX shared object works.
+// Therefore, it's better to consider goCallback as a pointer and
+// to set up during an init function.
+void (*goCallback)(void);
+void setCallback(void *f) { goCallback = f; }
+#else
+extern void goCallback(void);
+void setCallback(void *f) { (void)f; }
+#endif
+
+// OpenBSD and older Darwin lack TLS support
+#if !defined(__OpenBSD__) && !defined(__APPLE__)
+__thread int tlsvar = 12345;
+#endif
+
+void sofunc(void)
+{
+	goCallback();
+}
diff --git a/src/cmd/cgo/internal/testso/testdata/so/cgoso_unix.go b/src/cmd/cgo/internal/testso/testdata/so/cgoso_unix.go
new file mode 100644
index 0000000..ea9cb0a
--- /dev/null
+++ b/src/cmd/cgo/internal/testso/testdata/so/cgoso_unix.go
@@ -0,0 +1,20 @@
+// 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:build aix || dragonfly || freebsd || linux || netbsd || solaris
+
+package cgosotest
+
+/*
+extern int __thread tlsvar;
+int *getTLS() { return &tlsvar; }
+*/
+import "C"
+
+func init() {
+	if v := *C.getTLS(); v != 12345 {
+		println("got", v)
+		panic("BAD TLS value")
+	}
+}
diff --git a/src/cmd/cgo/internal/testso/testdata/so/main.go b/src/cmd/cgo/internal/testso/testdata/so/main.go
new file mode 100644
index 0000000..84382f7
--- /dev/null
+++ b/src/cmd/cgo/internal/testso/testdata/so/main.go
@@ -0,0 +1,13 @@
+// Copyright 2011 The Go 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:build ignore
+
+package main
+
+import "cgosotest"
+
+func main() {
+	cgosotest.Test()
+}
diff --git a/misc/cgo/testsovar/testdata/cgoso.go b/src/cmd/cgo/internal/testso/testdata/sovar/cgoso.go
similarity index 100%
rename from misc/cgo/testsovar/testdata/cgoso.go
rename to src/cmd/cgo/internal/testso/testdata/sovar/cgoso.go
diff --git a/src/cmd/cgo/internal/testso/testdata/sovar/cgoso_c.c b/src/cmd/cgo/internal/testso/testdata/sovar/cgoso_c.c
new file mode 100644
index 0000000..36f4d57
--- /dev/null
+++ b/src/cmd/cgo/internal/testso/testdata/sovar/cgoso_c.c
@@ -0,0 +1,7 @@
+// 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:build ignore
+
+const char *exported_var = "Hello world";
diff --git a/src/cmd/cgo/internal/testso/testdata/sovar/cgoso_c.h b/src/cmd/cgo/internal/testso/testdata/sovar/cgoso_c.h
new file mode 100644
index 0000000..eccd8c0
--- /dev/null
+++ b/src/cmd/cgo/internal/testso/testdata/sovar/cgoso_c.h
@@ -0,0 +1,17 @@
+// 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:build ignore
+
+#ifdef WIN32
+#if defined(EXPORT_DLL)
+#    define VAR __declspec(dllexport)
+#elif defined(IMPORT_DLL)
+#    define VAR __declspec(dllimport)
+#endif
+#else
+#    define VAR extern
+#endif
+
+VAR const char *exported_var;
diff --git a/src/cmd/cgo/internal/testso/testdata/sovar/main.go b/src/cmd/cgo/internal/testso/testdata/sovar/main.go
new file mode 100644
index 0000000..018b835
--- /dev/null
+++ b/src/cmd/cgo/internal/testso/testdata/sovar/main.go
@@ -0,0 +1,13 @@
+// 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:build ignore
+
+package main
+
+import "cgosotest"
+
+func main() {
+	cgosotest.Test()
+}
diff --git a/src/cmd/cgo/internal/teststdio/stdio_test.go b/src/cmd/cgo/internal/teststdio/stdio_test.go
new file mode 100644
index 0000000..3883422
--- /dev/null
+++ b/src/cmd/cgo/internal/teststdio/stdio_test.go
@@ -0,0 +1,77 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package stdio_test
+
+import (
+	"bytes"
+	"cmd/cgo/internal/cgotest"
+	"internal/testenv"
+	"log"
+	"os"
+	"os/exec"
+	"path/filepath"
+	"strings"
+	"testing"
+)
+
+func TestMain(m *testing.M) {
+	log.SetFlags(log.Lshortfile)
+	os.Exit(testMain(m))
+}
+
+func testMain(m *testing.M) int {
+	GOPATH, err := os.MkdirTemp("", "cgostdio")
+	if err != nil {
+		log.Panic(err)
+	}
+	defer os.RemoveAll(GOPATH)
+	os.Setenv("GOPATH", GOPATH)
+
+	// Copy testdata into GOPATH/src/cgostdio, along with a go.mod file
+	// declaring the same path.
+	modRoot := filepath.Join(GOPATH, "src", "cgostdio")
+	if err := cgotest.OverlayDir(modRoot, "testdata"); err != nil {
+		log.Panic(err)
+	}
+	if err := os.Chdir(modRoot); err != nil {
+		log.Panic(err)
+	}
+	os.Setenv("PWD", modRoot)
+	if err := os.WriteFile("go.mod", []byte("module cgostdio\n"), 0666); err != nil {
+		log.Panic(err)
+	}
+
+	return m.Run()
+}
+
+// TestTestRun runs a cgo test that doesn't depend on non-standard libraries.
+func TestTestRun(t *testing.T) {
+	testenv.MustHaveGoRun(t)
+	testenv.MustHaveCGO(t)
+
+	for _, file := range [...]string{
+		"chain.go",
+		"fib.go",
+		"hello.go",
+	} {
+		file := file
+		wantFile := strings.Replace(file, ".go", ".out", 1)
+		t.Run(file, func(t *testing.T) {
+			cmd := exec.Command("go", "run", file)
+			got, err := cmd.CombinedOutput()
+			if err != nil {
+				t.Fatalf("%v: %s\n%s", cmd, err, got)
+			}
+			got = bytes.ReplaceAll(got, []byte("\r\n"), []byte("\n"))
+			want, err := os.ReadFile(wantFile)
+			if err != nil {
+				t.Fatal("reading golden output:", err)
+			}
+			if !bytes.Equal(got, want) {
+				t.Errorf("'%v' output does not match expected in %s. Instead saw:\n%s", cmd, wantFile, got)
+			}
+		})
+	}
+}
diff --git a/src/cmd/cgo/internal/teststdio/testdata/chain.go b/src/cmd/cgo/internal/teststdio/testdata/chain.go
new file mode 100644
index 0000000..c7163f5
--- /dev/null
+++ b/src/cmd/cgo/internal/teststdio/testdata/chain.go
@@ -0,0 +1,46 @@
+// Copyright 2009 The Go 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:build test_run
+
+// Pass numbers along a chain of threads.
+
+package main
+
+import (
+	"runtime"
+	"strconv"
+
+	"cgostdio/stdio"
+)
+
+const N = 10
+const R = 5
+
+func link(left chan<- int, right <-chan int) {
+	// Keep the links in dedicated operating system
+	// threads, so that this program tests coordination
+	// between pthreads and not just goroutines.
+	runtime.LockOSThread()
+	for {
+		v := <-right
+		stdio.Stdout.WriteString(strconv.Itoa(v) + "\n")
+		left <- 1 + v
+	}
+}
+
+func main() {
+	leftmost := make(chan int)
+	var left chan int
+	right := leftmost
+	for i := 0; i < N; i++ {
+		left, right = right, make(chan int)
+		go link(left, right)
+	}
+	for i := 0; i < R; i++ {
+		right <- 0
+		x := <-leftmost
+		stdio.Stdout.WriteString(strconv.Itoa(x) + "\n")
+	}
+}
diff --git a/misc/cgo/stdio/testdata/chain.out b/src/cmd/cgo/internal/teststdio/testdata/chain.out
similarity index 100%
rename from misc/cgo/stdio/testdata/chain.out
rename to src/cmd/cgo/internal/teststdio/testdata/chain.out
diff --git a/src/cmd/cgo/internal/teststdio/testdata/fib.go b/src/cmd/cgo/internal/teststdio/testdata/fib.go
new file mode 100644
index 0000000..9617368
--- /dev/null
+++ b/src/cmd/cgo/internal/teststdio/testdata/fib.go
@@ -0,0 +1,50 @@
+// Copyright 2009 The Go 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:build test_run
+
+// Compute Fibonacci numbers with two goroutines
+// that pass integers back and forth.  No actual
+// concurrency, just threads and synchronization
+// and foreign code on multiple pthreads.
+
+package main
+
+import (
+	"runtime"
+	"strconv"
+
+	"cgostdio/stdio"
+)
+
+func fibber(c, out chan int64, i int64) {
+	// Keep the fibbers in dedicated operating system
+	// threads, so that this program tests coordination
+	// between pthreads and not just goroutines.
+	runtime.LockOSThread()
+
+	if i == 0 {
+		c <- i
+	}
+	for {
+		j := <-c
+		stdio.Stdout.WriteString(strconv.FormatInt(j, 10) + "\n")
+		out <- j
+		<-out
+		i += j
+		c <- i
+	}
+}
+
+func main() {
+	c := make(chan int64)
+	out := make(chan int64)
+	go fibber(c, out, 0)
+	go fibber(c, out, 1)
+	<-out
+	for i := 0; i < 90; i++ {
+		out <- 1
+		<-out
+	}
+}
diff --git a/misc/cgo/stdio/testdata/fib.out b/src/cmd/cgo/internal/teststdio/testdata/fib.out
similarity index 100%
rename from misc/cgo/stdio/testdata/fib.out
rename to src/cmd/cgo/internal/teststdio/testdata/fib.out
diff --git a/src/cmd/cgo/internal/teststdio/testdata/hello.go b/src/cmd/cgo/internal/teststdio/testdata/hello.go
new file mode 100644
index 0000000..c0b52bf
--- /dev/null
+++ b/src/cmd/cgo/internal/teststdio/testdata/hello.go
@@ -0,0 +1,13 @@
+// Copyright 2009 The Go 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:build test_run
+
+package main
+
+import "cgostdio/stdio"
+
+func main() {
+	stdio.Stdout.WriteString(stdio.Greeting + "\n")
+}
diff --git a/misc/cgo/stdio/testdata/hello.out b/src/cmd/cgo/internal/teststdio/testdata/hello.out
similarity index 100%
rename from misc/cgo/stdio/testdata/hello.out
rename to src/cmd/cgo/internal/teststdio/testdata/hello.out
diff --git a/src/cmd/cgo/internal/teststdio/testdata/stdio/file.go b/src/cmd/cgo/internal/teststdio/testdata/stdio/file.go
new file mode 100644
index 0000000..d97ee4c
--- /dev/null
+++ b/src/cmd/cgo/internal/teststdio/testdata/stdio/file.go
@@ -0,0 +1,42 @@
+// Copyright 2009 The Go 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 trivial example of wrapping a C library in Go.
+For a more complex example and explanation,
+see misc/cgo/gmp/gmp.go.
+*/
+
+package stdio
+
+/*
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/stat.h>
+#include <errno.h>
+
+char* greeting = "hello, world";
+*/
+import "C"
+import "unsafe"
+
+type File C.FILE
+
+// Test reference to library symbol.
+// Stdout and stderr are too special to be a reliable test.
+//var  = C.environ
+
+func (f *File) WriteString(s string) {
+	p := C.CString(s)
+	C.fputs(p, (*C.FILE)(f))
+	C.free(unsafe.Pointer(p))
+	f.Flush()
+}
+
+func (f *File) Flush() {
+	C.fflush((*C.FILE)(f))
+}
+
+var Greeting = C.GoString(C.greeting)
+var Gbytes = C.GoBytes(unsafe.Pointer(C.greeting), C.int(len(Greeting)))
diff --git a/src/cmd/cgo/internal/teststdio/testdata/stdio/stdio.go b/src/cmd/cgo/internal/teststdio/testdata/stdio/stdio.go
new file mode 100644
index 0000000..08286d4
--- /dev/null
+++ b/src/cmd/cgo/internal/teststdio/testdata/stdio/stdio.go
@@ -0,0 +1,20 @@
+// Copyright 2009 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package stdio
+
+/*
+#include <stdio.h>
+
+// on mingw, stderr and stdout are defined as &_iob[FILENO]
+// on netbsd, they are defined as &__sF[FILENO]
+// and cgo doesn't recognize them, so write a function to get them,
+// instead of depending on internals of libc implementation.
+FILE *getStdout(void) { return stdout; }
+FILE *getStderr(void) { return stderr; }
+*/
+import "C"
+
+var Stdout = (*File)(C.getStdout())
+var Stderr = (*File)(C.getStderr())
diff --git a/src/cmd/cgo/internal/testtls/tls.c b/src/cmd/cgo/internal/testtls/tls.c
new file mode 100644
index 0000000..8839cc8
--- /dev/null
+++ b/src/cmd/cgo/internal/testtls/tls.c
@@ -0,0 +1,47 @@
+// Copyright 2013 The Go 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>
+
+#if __STDC_VERSION__ >= 201112L && !defined(__STDC_NO_THREADS__)
+
+// Mingw seems not to have threads.h, so we use the _Thread_local keyword rather
+// than the thread_local macro.
+static _Thread_local int tls;
+
+const char *
+checkTLS() {
+	return NULL;
+}
+
+void
+setTLS(int v)
+{
+	tls = v;
+}
+
+int
+getTLS()
+{
+	return tls;
+}
+
+#else
+
+const char *
+checkTLS() {
+	return "_Thread_local requires C11 and not __STDC_NO_THREADS__";
+}
+
+void
+setTLS(int v) {
+}
+
+int
+getTLS()
+{
+	return 0;
+}
+
+#endif
diff --git a/src/cmd/cgo/internal/testtls/tls.go b/src/cmd/cgo/internal/testtls/tls.go
new file mode 100644
index 0000000..78628f5
--- /dev/null
+++ b/src/cmd/cgo/internal/testtls/tls.go
@@ -0,0 +1,34 @@
+// Copyright 2013 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package cgotlstest
+
+// extern const char *checkTLS();
+// extern void setTLS(int);
+// extern int getTLS();
+import "C"
+
+import (
+	"runtime"
+	"testing"
+)
+
+func testTLS(t *testing.T) {
+	if skip := C.checkTLS(); skip != nil {
+		t.Skipf("%s", C.GoString(skip))
+	}
+
+	runtime.LockOSThread()
+	defer runtime.UnlockOSThread()
+
+	if val := C.getTLS(); val != 0 {
+		t.Fatalf("at start, C.getTLS() = %#x, want 0", val)
+	}
+
+	const keyVal = 0x1234
+	C.setTLS(keyVal)
+	if val := C.getTLS(); val != keyVal {
+		t.Fatalf("at end, C.getTLS() = %#x, want %#x", val, keyVal)
+	}
+}
diff --git a/src/cmd/cgo/internal/testtls/tls_none.go b/src/cmd/cgo/internal/testtls/tls_none.go
new file mode 100644
index 0000000..b6033fb
--- /dev/null
+++ b/src/cmd/cgo/internal/testtls/tls_none.go
@@ -0,0 +1,13 @@
+// Copyright 2023 The Go 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:build !cgo
+
+package cgotlstest
+
+import "testing"
+
+func testTLS(t *testing.T) {
+	t.Skip("cgo not supported")
+}
diff --git a/src/cmd/cgo/internal/testtls/tls_test.go b/src/cmd/cgo/internal/testtls/tls_test.go
new file mode 100644
index 0000000..8e14add
--- /dev/null
+++ b/src/cmd/cgo/internal/testtls/tls_test.go
@@ -0,0 +1,11 @@
+// Copyright 2013 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package cgotlstest
+
+import "testing"
+
+func TestTLS(t *testing.T) {
+	testTLS(t)
+}
diff --git a/src/cmd/cgo/main.go b/src/cmd/cgo/main.go
index f78969e..78020ae 100644
--- a/src/cmd/cgo/main.go
+++ b/src/cmd/cgo/main.go
@@ -363,6 +363,12 @@
 
 		// Apply trimpath to the file path. The path won't be read from after this point.
 		input, _ = objabi.ApplyRewrites(input, *trimpath)
+		if strings.ContainsAny(input, "\r\n") {
+			// ParseGo, (*Package).writeOutput, and printer.Fprint in SourcePos mode
+			// all emit line directives, which don't permit newlines in the file path.
+			// Bail early if we see anything newline-like in the trimmed path.
+			fatalf("input path contains newline character: %q", input)
+		}
 		goFiles[i] = input
 
 		f := new(File)
diff --git a/src/cmd/cgo/out.go b/src/cmd/cgo/out.go
index d26f9e7..b2933e2 100644
--- a/src/cmd/cgo/out.go
+++ b/src/cmd/cgo/out.go
@@ -47,7 +47,9 @@
 
 	fflg := creat(*objDir + "_cgo_flags")
 	for k, v := range p.CgoFlags {
-		fmt.Fprintf(fflg, "_CGO_%s=%s\n", k, strings.Join(v, " "))
+		for _, arg := range v {
+			fmt.Fprintf(fflg, "_CGO_%s=%s\n", k, arg)
+		}
 		if k == "LDFLAGS" && !*gccgo {
 			for _, arg := range v {
 				fmt.Fprintf(fgo2, "//go:cgo_ldflag %q\n", arg)
@@ -642,6 +644,11 @@
 
 	// Write Go output: Go input with rewrites of C.xxx to _C_xxx.
 	fmt.Fprintf(fgo1, "// Code generated by cmd/cgo; DO NOT EDIT.\n\n")
+	if strings.ContainsAny(srcfile, "\r\n") {
+		// This should have been checked when the file path was first resolved,
+		// but we double check here just to be sure.
+		fatalf("internal error: writeOutput: srcfile contains unexpected newline character: %q", srcfile)
+	}
 	fmt.Fprintf(fgo1, "//line %s:1:1\n", srcfile)
 	fgo1.Write(f.Edit.Bytes())
 
diff --git a/src/cmd/compile/default.pgo b/src/cmd/compile/default.pgo
new file mode 100644
index 0000000..2ba7968
--- /dev/null
+++ b/src/cmd/compile/default.pgo
Binary files differ
diff --git a/src/cmd/compile/doc.go b/src/cmd/compile/doc.go
index 60e1263..0a60368 100644
--- a/src/cmd/compile/doc.go
+++ b/src/cmd/compile/doc.go
@@ -247,14 +247,53 @@
 
 	//go:linkname localname [importpath.name]
 
-This special directive does not apply to the Go code that follows it.
-Instead, the //go:linkname directive instructs the compiler to use ``importpath.name''
-as the object file symbol name for the variable or function declared as ``localname''
-in the source code.
-If the ``importpath.name'' argument is omitted, the directive uses the
-symbol's default object file symbol name and only has the effect of making
-the symbol accessible to other packages.
-Because this directive can subvert the type system and package
-modularity, it is only enabled in files that have imported "unsafe".
+The //go:linkname directive conventionally precedes the var or func
+declaration named by ``localname``, though its position does not
+change its effect.
+This directive determines the object-file symbol used for a Go var or
+func declaration, allowing two Go symbols to alias the same
+object-file symbol, thereby enabling one package to access a symbol in
+another package even when this would violate the usual encapsulation
+of unexported declarations, or even type safety.
+For that reason, it is only enabled in files that have imported "unsafe".
+
+It may be used in two scenarios. Let's assume that package upper
+imports package lower, perhaps indirectly. In the first scenario,
+package lower defines a symbol whose object file name belongs to
+package upper. Both packages contain a linkname directive: package
+lower uses the two-argument form and package upper uses the
+one-argument form. In the example below, lower.f is an alias for the
+function upper.g:
+
+    package upper
+    import _ "unsafe"
+    //go:linkname g
+    func g()
+
+    package lower
+    import _ "unsafe"
+    //go:linkname f upper.g
+    func f() { ... }
+
+The linkname directive in package upper suppresses the usual error for
+a function that lacks a body. (That check may alternatively be
+suppressed by including a .s file, even an empty one, in the package.)
+
+In the second scenario, package upper unilaterally creates an alias
+for a symbol in package lower. In the example below, upper.g is an alias
+for the function lower.f.
+
+    package upper
+    import _ "unsafe"
+    //go:linkname g lower.f
+    func g()
+
+    package lower
+    func f() { ... }
+
+The declaration of lower.f may also have a linkname directive with a
+single argument, f. This is optional, but helps alert the reader that
+the function is accessed from outside the package.
+
 */
 package main
diff --git a/src/cmd/compile/internal/abi/abiutils.go b/src/cmd/compile/internal/abi/abiutils.go
index a88f8c4..71fbb88 100644
--- a/src/cmd/compile/internal/abi/abiutils.go
+++ b/src/cmd/compile/internal/abi/abiutils.go
@@ -92,7 +92,7 @@
 // ABIParamAssignment holds information about how a specific param or
 // result will be passed: in registers (in which case 'Registers' is
 // populated) or on the stack (in which case 'Offset' is set to a
-// non-negative stack offset. The values in 'Registers' are indices
+// non-negative stack offset). The values in 'Registers' are indices
 // (as described above), not architected registers.
 type ABIParamAssignment struct {
 	Type      *types.Type
@@ -717,19 +717,19 @@
 		nxp := src.NoXPos
 		bp := types.NewPtr(types.Types[types.TUINT8])
 		it := types.Types[types.TINT]
-		synthSlice = types.NewStruct(types.NoPkg, []*types.Field{
+		synthSlice = types.NewStruct([]*types.Field{
 			types.NewField(nxp, fname("ptr"), bp),
 			types.NewField(nxp, fname("len"), it),
 			types.NewField(nxp, fname("cap"), it),
 		})
 		types.CalcStructSize(synthSlice)
-		synthString = types.NewStruct(types.NoPkg, []*types.Field{
+		synthString = types.NewStruct([]*types.Field{
 			types.NewField(nxp, fname("data"), bp),
 			types.NewField(nxp, fname("len"), it),
 		})
 		types.CalcStructSize(synthString)
 		unsp := types.Types[types.TUNSAFEPTR]
-		synthIface = types.NewStruct(types.NoPkg, []*types.Field{
+		synthIface = types.NewStruct([]*types.Field{
 			types.NewField(nxp, fname("f1"), unsp),
 			types.NewField(nxp, fname("f2"), unsp),
 		})
diff --git a/src/cmd/compile/internal/abt/avlint32.go b/src/cmd/compile/internal/abt/avlint32.go
index 9800e03..28c1642 100644
--- a/src/cmd/compile/internal/abt/avlint32.go
+++ b/src/cmd/compile/internal/abt/avlint32.go
@@ -570,7 +570,7 @@
 			// t is too small, lub is to right.
 			t = t.right
 		} else {
-			// t is a upper bound, record it and seek a better one.
+			// t is an upper bound, record it and seek a better one.
 			best = t
 			t = t.left
 		}
diff --git a/src/cmd/compile/internal/amd64/ggen.go b/src/cmd/compile/internal/amd64/ggen.go
index b8dce81..db98a22 100644
--- a/src/cmd/compile/internal/amd64/ggen.go
+++ b/src/cmd/compile/internal/amd64/ggen.go
@@ -5,7 +5,6 @@
 package amd64
 
 import (
-	"cmd/compile/internal/base"
 	"cmd/compile/internal/ir"
 	"cmd/compile/internal/objw"
 	"cmd/compile/internal/types"
@@ -63,26 +62,8 @@
 		return p
 	}
 
-	if cnt%int64(types.RegSize) != 0 {
-		// should only happen with nacl
-		if cnt%int64(types.PtrSize) != 0 {
-			base.Fatalf("zerorange count not a multiple of widthptr %d", cnt)
-		}
-		if *state&r13 == 0 {
-			p = pp.Append(p, x86.AMOVQ, obj.TYPE_CONST, 0, 0, obj.TYPE_REG, x86.REG_R13, 0)
-			*state |= r13
-		}
-		p = pp.Append(p, x86.AMOVL, obj.TYPE_REG, x86.REG_R13, 0, obj.TYPE_MEM, x86.REG_SP, off)
-		off += int64(types.PtrSize)
-		cnt -= int64(types.PtrSize)
-	}
-
 	if cnt == 8 {
-		if *state&r13 == 0 {
-			p = pp.Append(p, x86.AMOVQ, obj.TYPE_CONST, 0, 0, obj.TYPE_REG, x86.REG_R13, 0)
-			*state |= r13
-		}
-		p = pp.Append(p, x86.AMOVQ, obj.TYPE_REG, x86.REG_R13, 0, obj.TYPE_MEM, x86.REG_SP, off)
+		p = pp.Append(p, x86.AMOVQ, obj.TYPE_REG, x86.REG_X15, 0, obj.TYPE_MEM, x86.REG_SP, off)
 	} else if !isPlan9 && cnt <= int64(8*types.RegSize) {
 		for i := int64(0); i < cnt/16; i++ {
 			p = pp.Append(p, x86.AMOVUPS, obj.TYPE_REG, x86.REG_X15, 0, obj.TYPE_MEM, x86.REG_SP, off+i*16)
@@ -120,7 +101,7 @@
 		p = pp.Append(p, x86.AMOVQ, obj.TYPE_REG, x86.REG_CX, 0, obj.TYPE_REG, x86.REG_R15, 0)
 
 		// Set up the REPSTOSQ and kick it off.
-		p = pp.Append(p, x86.AMOVQ, obj.TYPE_CONST, 0, 0, obj.TYPE_REG, x86.REG_AX, 0)
+		p = pp.Append(p, x86.AXORL, obj.TYPE_REG, x86.REG_AX, 0, obj.TYPE_REG, x86.REG_AX, 0)
 		p = pp.Append(p, x86.AMOVQ, obj.TYPE_CONST, 0, cnt/int64(types.RegSize), obj.TYPE_REG, x86.REG_CX, 0)
 		p = pp.Append(p, leaptr, obj.TYPE_MEM, x86.REG_SP, off, obj.TYPE_REG, x86.REG_DI, 0)
 		p = pp.Append(p, x86.AREP, obj.TYPE_NONE, 0, 0, obj.TYPE_NONE, 0, 0)
diff --git a/src/cmd/compile/internal/amd64/ssa.go b/src/cmd/compile/internal/amd64/ssa.go
index 6139d5e..1138758 100644
--- a/src/cmd/compile/internal/amd64/ssa.go
+++ b/src/cmd/compile/internal/amd64/ssa.go
@@ -30,7 +30,7 @@
 		v := b.Values[i]
 		if flive && (v.Op == ssa.OpAMD64MOVLconst || v.Op == ssa.OpAMD64MOVQconst) {
 			// The "mark" is any non-nil Aux value.
-			v.Aux = v
+			v.Aux = ssa.AuxMark
 		}
 		if v.Type.IsFlags() {
 			flive = false
@@ -206,7 +206,7 @@
 		p := s.Prog(v.Op.Asm())
 		p.From = obj.Addr{Type: obj.TYPE_REG, Reg: v.Args[2].Reg()}
 		p.To = obj.Addr{Type: obj.TYPE_REG, Reg: v.Reg()}
-		p.SetFrom3Reg(v.Args[1].Reg())
+		p.AddRestSourceReg(v.Args[1].Reg())
 	case ssa.OpAMD64ADDQ, ssa.OpAMD64ADDL:
 		r := v.Reg()
 		r1 := v.Args[0].Reg()
@@ -265,7 +265,7 @@
 		p.From.Reg = bits
 		p.To.Type = obj.TYPE_REG
 		p.To.Reg = lo
-		p.SetFrom3Reg(hi)
+		p.AddRestSourceReg(hi)
 
 	case ssa.OpAMD64BLSIQ, ssa.OpAMD64BLSIL,
 		ssa.OpAMD64BLSMSKQ, ssa.OpAMD64BLSMSKL,
@@ -274,7 +274,12 @@
 		p.From.Type = obj.TYPE_REG
 		p.From.Reg = v.Args[0].Reg()
 		p.To.Type = obj.TYPE_REG
-		p.To.Reg = v.Reg()
+		switch v.Op {
+		case ssa.OpAMD64BLSRQ, ssa.OpAMD64BLSRL:
+			p.To.Reg = v.Reg0()
+		default:
+			p.To.Reg = v.Reg()
+		}
 
 	case ssa.OpAMD64ANDNQ, ssa.OpAMD64ANDNL:
 		p := s.Prog(v.Op.Asm())
@@ -282,13 +287,13 @@
 		p.From.Reg = v.Args[0].Reg()
 		p.To.Type = obj.TYPE_REG
 		p.To.Reg = v.Reg()
-		p.SetFrom3Reg(v.Args[1].Reg())
+		p.AddRestSourceReg(v.Args[1].Reg())
 
 	case ssa.OpAMD64SARXL, ssa.OpAMD64SARXQ,
 		ssa.OpAMD64SHLXL, ssa.OpAMD64SHLXQ,
 		ssa.OpAMD64SHRXL, ssa.OpAMD64SHRXQ:
 		p := opregreg(s, v.Op.Asm(), v.Reg(), v.Args[1].Reg())
-		p.SetFrom3Reg(v.Args[0].Reg())
+		p.AddRestSourceReg(v.Args[0].Reg())
 
 	case ssa.OpAMD64SHLXLload, ssa.OpAMD64SHLXQload,
 		ssa.OpAMD64SHRXLload, ssa.OpAMD64SHRXQload,
@@ -296,7 +301,7 @@
 		p := opregreg(s, v.Op.Asm(), v.Reg(), v.Args[1].Reg())
 		m := obj.Addr{Type: obj.TYPE_MEM, Reg: v.Args[0].Reg()}
 		ssagen.AddAux(&m, v)
-		p.SetFrom3(m)
+		p.AddRestSource(m)
 
 	case ssa.OpAMD64SHLXLloadidx1, ssa.OpAMD64SHLXLloadidx4, ssa.OpAMD64SHLXLloadidx8,
 		ssa.OpAMD64SHRXLloadidx1, ssa.OpAMD64SHRXLloadidx4, ssa.OpAMD64SHRXLloadidx8,
@@ -308,7 +313,7 @@
 		m := obj.Addr{Type: obj.TYPE_MEM}
 		memIdx(&m, v)
 		ssagen.AddAux(&m, v)
-		p.SetFrom3(m)
+		p.AddRestSource(m)
 
 	case ssa.OpAMD64DIVQU, ssa.OpAMD64DIVLU, ssa.OpAMD64DIVWU:
 		// Arg[0] (the dividend) is in AX.
@@ -331,59 +336,34 @@
 		// Result[0] (the quotient) is in AX.
 		// Result[1] (the remainder) is in DX.
 		r := v.Args[1].Reg()
-		var j1 *obj.Prog
+
+		var opCMP, opNEG, opSXD obj.As
+		switch v.Op {
+		case ssa.OpAMD64DIVQ:
+			opCMP, opNEG, opSXD = x86.ACMPQ, x86.ANEGQ, x86.ACQO
+		case ssa.OpAMD64DIVL:
+			opCMP, opNEG, opSXD = x86.ACMPL, x86.ANEGL, x86.ACDQ
+		case ssa.OpAMD64DIVW:
+			opCMP, opNEG, opSXD = x86.ACMPW, x86.ANEGW, x86.ACWD
+		}
 
 		// CPU faults upon signed overflow, which occurs when the most
 		// negative int is divided by -1. Handle divide by -1 as a special case.
+		var j1, j2 *obj.Prog
 		if ssa.DivisionNeedsFixUp(v) {
-			var c *obj.Prog
-			switch v.Op {
-			case ssa.OpAMD64DIVQ:
-				c = s.Prog(x86.ACMPQ)
-			case ssa.OpAMD64DIVL:
-				c = s.Prog(x86.ACMPL)
-			case ssa.OpAMD64DIVW:
-				c = s.Prog(x86.ACMPW)
-			}
+			c := s.Prog(opCMP)
 			c.From.Type = obj.TYPE_REG
 			c.From.Reg = r
 			c.To.Type = obj.TYPE_CONST
 			c.To.Offset = -1
-			j1 = s.Prog(x86.AJEQ)
+
+			// Divisor is not -1, proceed with normal division.
+			j1 = s.Prog(x86.AJNE)
 			j1.To.Type = obj.TYPE_BRANCH
-		}
 
-		// Sign extend dividend.
-		switch v.Op {
-		case ssa.OpAMD64DIVQ:
-			s.Prog(x86.ACQO)
-		case ssa.OpAMD64DIVL:
-			s.Prog(x86.ACDQ)
-		case ssa.OpAMD64DIVW:
-			s.Prog(x86.ACWD)
-		}
-
-		// Issue divide.
-		p := s.Prog(v.Op.Asm())
-		p.From.Type = obj.TYPE_REG
-		p.From.Reg = r
-
-		if j1 != nil {
-			// Skip over -1 fixup code.
-			j2 := s.Prog(obj.AJMP)
-			j2.To.Type = obj.TYPE_BRANCH
-
-			// Issue -1 fixup code.
+			// Divisor is -1, manually compute quotient and remainder via fixup code.
 			// n / -1 = -n
-			var n1 *obj.Prog
-			switch v.Op {
-			case ssa.OpAMD64DIVQ:
-				n1 = s.Prog(x86.ANEGQ)
-			case ssa.OpAMD64DIVL:
-				n1 = s.Prog(x86.ANEGL)
-			case ssa.OpAMD64DIVW:
-				n1 = s.Prog(x86.ANEGW)
-			}
+			n1 := s.Prog(opNEG)
 			n1.To.Type = obj.TYPE_REG
 			n1.To.Reg = x86.REG_AX
 
@@ -393,7 +373,21 @@
 			// TODO(khr): issue only the -1 fixup code we need.
 			// For instance, if only the quotient is used, no point in zeroing the remainder.
 
-			j1.To.SetTarget(n1)
+			// Skip over normal division.
+			j2 = s.Prog(obj.AJMP)
+			j2.To.Type = obj.TYPE_BRANCH
+		}
+
+		// Sign extend dividend and perform division.
+		p := s.Prog(opSXD)
+		if j1 != nil {
+			j1.To.SetTarget(p)
+		}
+		p = s.Prog(v.Op.Asm())
+		p.From.Type = obj.TYPE_REG
+		p.From.Reg = r
+
+		if j2 != nil {
 			j2.To.SetTarget(s.Pc())
 		}
 
@@ -637,7 +631,7 @@
 		p.From.Offset = v.AuxInt
 		p.To.Type = obj.TYPE_REG
 		p.To.Reg = r
-		p.SetFrom3Reg(v.Args[0].Reg())
+		p.AddRestSourceReg(v.Args[0].Reg())
 
 	case ssa.OpAMD64ANDQconst:
 		asm := v.Op.Asm()
@@ -1036,7 +1030,7 @@
 		p.From.Reg = v.Args[0].Reg()
 		ssagen.AddrAuto(&p.To, v)
 	case ssa.OpAMD64LoweredHasCPUFeature:
-		p := s.Prog(x86.AMOVBQZX)
+		p := s.Prog(x86.AMOVBLZX)
 		p.From.Type = obj.TYPE_MEM
 		ssagen.AddAux(&p.From, v)
 		p.To.Type = obj.TYPE_REG
@@ -1111,8 +1105,8 @@
 		p := s.Prog(obj.ACALL)
 		p.To.Type = obj.TYPE_MEM
 		p.To.Name = obj.NAME_EXTERN
-		// arg0 is in DI. Set sym to match where regalloc put arg1.
-		p.To.Sym = ssagen.GCWriteBarrierReg[v.Args[1].Reg()]
+		// AuxInt encodes how many buffer entries we need.
+		p.To.Sym = ir.Syms.GCWriteBarrier[v.AuxInt-1]
 
 	case ssa.OpAMD64LoweredPanicBoundsA, ssa.OpAMD64LoweredPanicBoundsB, ssa.OpAMD64LoweredPanicBoundsC:
 		p := s.Prog(obj.ACALL)
@@ -1153,7 +1147,7 @@
 		}
 		p.From.Offset = val
 		p.From.Type = obj.TYPE_CONST
-		p.SetFrom3Reg(v.Args[0].Reg())
+		p.AddRestSourceReg(v.Args[0].Reg())
 		p.To.Type = obj.TYPE_REG
 		p.To.Reg = v.Reg()
 	case ssa.OpAMD64POPCNTQ, ssa.OpAMD64POPCNTL,
diff --git a/src/cmd/compile/internal/arm/ssa.go b/src/cmd/compile/internal/arm/ssa.go
index fd0da34..7fcbb4d 100644
--- a/src/cmd/compile/internal/arm/ssa.go
+++ b/src/cmd/compile/internal/arm/ssa.go
@@ -282,7 +282,7 @@
 		p := s.Prog(v.Op.Asm())
 		p.From.Type = obj.TYPE_CONST
 		p.From.Offset = v.AuxInt >> 8
-		p.SetFrom3Const(v.AuxInt & 0xff)
+		p.AddRestSourceConst(v.AuxInt & 0xff)
 		p.Reg = v.Args[0].Reg()
 		p.To.Type = obj.TYPE_REG
 		p.To.Reg = v.Reg()
@@ -302,7 +302,7 @@
 				p := s.Prog(arm.ABFC)
 				p.From.Type = obj.TYPE_CONST
 				p.From.Offset = int64(width)
-				p.SetFrom3Const(int64(lsb))
+				p.AddRestSourceConst(int64(lsb))
 				p.To.Type = obj.TYPE_REG
 				p.To.Reg = v.Reg()
 				break
@@ -710,7 +710,8 @@
 		p := s.Prog(obj.ACALL)
 		p.To.Type = obj.TYPE_MEM
 		p.To.Name = obj.NAME_EXTERN
-		p.To.Sym = v.Aux.(*obj.LSym)
+		// AuxInt encodes how many buffer entries we need.
+		p.To.Sym = ir.Syms.GCWriteBarrier[v.AuxInt-1]
 	case ssa.OpARMLoweredPanicBoundsA, ssa.OpARMLoweredPanicBoundsB, ssa.OpARMLoweredPanicBoundsC:
 		p := s.Prog(obj.ACALL)
 		p.To.Type = obj.TYPE_MEM
diff --git a/src/cmd/compile/internal/arm64/ssa.go b/src/cmd/compile/internal/arm64/ssa.go
index 8885655..a0b432b 100644
--- a/src/cmd/compile/internal/arm64/ssa.go
+++ b/src/cmd/compile/internal/arm64/ssa.go
@@ -246,7 +246,7 @@
 		p.Reg = ra
 		p.From.Type = obj.TYPE_REG
 		p.From.Reg = rm
-		p.SetFrom3Reg(rn)
+		p.AddRestSourceReg(rn)
 		p.To.Type = obj.TYPE_REG
 		p.To.Reg = rt
 	case ssa.OpARM64ADDconst,
@@ -309,7 +309,7 @@
 		p := s.Prog(v.Op.Asm())
 		p.From.Type = obj.TYPE_CONST
 		p.From.Offset = v.AuxInt
-		p.SetFrom3Reg(v.Args[0].Reg())
+		p.AddRestSourceReg(v.Args[0].Reg())
 		p.Reg = v.Args[1].Reg()
 		p.To.Type = obj.TYPE_REG
 		p.To.Reg = v.Reg()
@@ -558,7 +558,7 @@
 		p := s.Prog(v.Op.Asm())
 		p.From.Type = obj.TYPE_CONST
 		p.From.Offset = v.AuxInt >> 8
-		p.SetFrom3Const(v.AuxInt & 0xff)
+		p.AddRestSourceConst(v.AuxInt & 0xff)
 		p.Reg = v.Args[1].Reg()
 		p.To.Type = obj.TYPE_REG
 		p.To.Reg = v.Reg()
@@ -569,7 +569,7 @@
 		p := s.Prog(v.Op.Asm())
 		p.From.Type = obj.TYPE_CONST
 		p.From.Offset = v.AuxInt >> 8
-		p.SetFrom3Const(v.AuxInt & 0xff)
+		p.AddRestSourceConst(v.AuxInt & 0xff)
 		p.Reg = v.Args[0].Reg()
 		p.To.Type = obj.TYPE_REG
 		p.To.Reg = v.Reg()
@@ -976,7 +976,7 @@
 		condCode := condBits[ssa.Op(v.AuxInt)]
 		p.From.Offset = int64(condCode)
 		p.Reg = v.Args[0].Reg()
-		p.SetFrom3Reg(r1)
+		p.AddRestSourceReg(r1)
 		p.To.Type = obj.TYPE_REG
 		p.To.Reg = v.Reg()
 	case ssa.OpARM64CSINC, ssa.OpARM64CSINV, ssa.OpARM64CSNEG:
@@ -985,7 +985,7 @@
 		condCode := condBits[ssa.Op(v.AuxInt)]
 		p.From.Offset = int64(condCode)
 		p.Reg = v.Args[0].Reg()
-		p.SetFrom3Reg(v.Args[1].Reg())
+		p.AddRestSourceReg(v.Args[1].Reg())
 		p.To.Type = obj.TYPE_REG
 		p.To.Reg = v.Reg()
 	case ssa.OpARM64CSETM:
@@ -1065,7 +1065,9 @@
 		p := s.Prog(obj.ACALL)
 		p.To.Type = obj.TYPE_MEM
 		p.To.Name = obj.NAME_EXTERN
-		p.To.Sym = v.Aux.(*obj.LSym)
+		// AuxInt encodes how many buffer entries we need.
+		p.To.Sym = ir.Syms.GCWriteBarrier[v.AuxInt-1]
+
 	case ssa.OpARM64LoweredPanicBoundsA, ssa.OpARM64LoweredPanicBoundsB, ssa.OpARM64LoweredPanicBoundsC:
 		p := s.Prog(obj.ACALL)
 		p.To.Type = obj.TYPE_MEM
@@ -1103,7 +1105,9 @@
 		ssa.OpARM64NotLessThanF,
 		ssa.OpARM64NotLessEqualF,
 		ssa.OpARM64NotGreaterThanF,
-		ssa.OpARM64NotGreaterEqualF:
+		ssa.OpARM64NotGreaterEqualF,
+		ssa.OpARM64LessThanNoov,
+		ssa.OpARM64GreaterEqualNoov:
 		// generate boolean values using CSET
 		p := s.Prog(arm64.ACSET)
 		p.From.Type = obj.TYPE_SPECIAL // assembler encodes conditional bits in Offset
@@ -1194,6 +1198,9 @@
 	ssa.OpARM64NotLessEqualF:    arm64.SPOP_HI, // Greater than or unordered
 	ssa.OpARM64NotGreaterThanF:  arm64.SPOP_LE, // Less than, equal to or unordered
 	ssa.OpARM64NotGreaterEqualF: arm64.SPOP_LT, // Less than or unordered
+
+	ssa.OpARM64LessThanNoov:     arm64.SPOP_MI, // Less than but without honoring overflow
+	ssa.OpARM64GreaterEqualNoov: arm64.SPOP_PL, // Greater than or equal to but without honoring overflow
 }
 
 var blockJump = map[ssa.BlockKind]struct {
diff --git a/src/cmd/compile/internal/base/base.go b/src/cmd/compile/internal/base/base.go
index 521600b..8caeb41 100644
--- a/src/cmd/compile/internal/base/base.go
+++ b/src/cmd/compile/internal/base/base.go
@@ -264,6 +264,7 @@
 	"runtime/msan",
 	"runtime/asan",
 	"internal/cpu",
+	"internal/abi",
 }
 
 // Don't insert racefuncenter/racefuncexit into the following packages.
diff --git a/src/cmd/compile/internal/base/debug.go b/src/cmd/compile/internal/base/debug.go
index ee42696..1f05ed9 100644
--- a/src/cmd/compile/internal/base/debug.go
+++ b/src/cmd/compile/internal/base/debug.go
@@ -19,7 +19,6 @@
 	Append                int    `help:"print information about append compilation"`
 	Checkptr              int    `help:"instrument unsafe pointer conversions\n0: instrumentation disabled\n1: conversions involving unsafe.Pointer are instrumented\n2: conversions to unsafe.Pointer force heap allocation" concurrent:"ok"`
 	Closure               int    `help:"print information about closure compilation"`
-	DclStack              int    `help:"run internal dclstack check"`
 	Defer                 int    `help:"print information about defer compilation"`
 	DisableNil            int    `help:"disable nil checks" concurrent:"ok"`
 	DumpPtrs              int    `help:"show Node pointers values in dump output"`
@@ -34,6 +33,8 @@
 	InlStaticInit         int    `help:"allow static initialization of inlined calls" concurrent:"ok"`
 	InterfaceCycles       int    `help:"allow anonymous interface cycles"`
 	Libfuzzer             int    `help:"enable coverage instrumentation for libfuzzer"`
+	LoopVar               int    `help:"shared (0, default), 1 (private loop variables), 2, private + log"`
+	LoopVarHash           string `help:"for debugging changes in loop behavior. Overrides experiment and loopvar flag."`
 	LocationLists         int    `help:"print information about DWARF location list creation"`
 	Nil                   int    `help:"print information about nil checks"`
 	NoOpenDefer           int    `help:"disable open-coded defers" concurrent:"ok"`
@@ -46,14 +47,16 @@
 	SoftFloat             int    `help:"force compiler to emit soft-float code" concurrent:"ok"`
 	SyncFrames            int    `help:"how many writer stack frames to include at sync points in unified export data"`
 	TypeAssert            int    `help:"print information about type assertion inlining"`
-	TypecheckInl          int    `help:"eager typechecking of inline function bodies" concurrent:"ok"`
-	Unified               int    `help:"enable unified IR construction"`
 	WB                    int    `help:"print information about write barriers"`
 	ABIWrap               int    `help:"print information about ABI wrapper generation"`
 	MayMoreStack          string `help:"call named function before all stack growth checks" concurrent:"ok"`
-	PGOInlineCDFThreshold string `help:"cummulative threshold percentage for determining call sites as hot candidates for inlining" concurrent:"ok"`
+	PGODebug              int    `help:"debug profile-guided optimizations"`
+	PGOInline             int    `help:"enable profile-guided inlining" concurrent:"ok"`
+	PGOInlineCDFThreshold string `help:"cumulative threshold percentage for determining call sites as hot candidates for inlining" concurrent:"ok"`
 	PGOInlineBudget       int    `help:"inline budget for hot functions" concurrent:"ok"`
-	PGOInline             int    `help:"debug profile-guided inlining"`
+	PGODevirtualize       int    `help:"enable profile-guided devirtualization" concurrent:"ok"`
+	WrapGlobalMapDbg      int    `help:"debug trace output for global map init wrapping"`
+	WrapGlobalMapCtl      int    `help:"global map init wrap control (0 => default, 1 => off, 2 => stress mode, no size cutoff)"`
 
 	ConcurrentOk bool // true if only concurrentOk flags seen
 }
diff --git a/src/cmd/compile/internal/base/flag.go b/src/cmd/compile/internal/base/flag.go
index be555c3..753a60a 100644
--- a/src/cmd/compile/internal/base/flag.go
+++ b/src/cmd/compile/internal/base/flag.go
@@ -122,9 +122,9 @@
 	SymABIs            string       "help:\"read symbol ABIs from `file`\""
 	TraceProfile       string       "help:\"write an execution trace to `file`\""
 	TrimPath           string       "help:\"remove `prefix` from recorded source file paths\""
-	WB                 bool         "help:\"enable write barrier\""            // TODO: remove
-	OldComparable      bool         "help:\"enable old comparable semantics\"" // TODO: remove for Go 1.21
+	WB                 bool         "help:\"enable write barrier\"" // TODO: remove
 	PgoProfile         string       "help:\"read profile from `file`\""
+	ErrorURL           bool         "help:\"print explanatory URL with error message if applicable\""
 
 	// Configuration derived from flags; not a flag itself.
 	Cfg struct {
@@ -167,10 +167,9 @@
 
 	Debug.ConcurrentOk = true
 	Debug.InlFuncsWithClosures = 1
-	Debug.InlStaticInit = 0
-	if buildcfg.Experiment.Unified {
-		Debug.Unified = 1
-	}
+	Debug.InlStaticInit = 1
+	Debug.PGOInline = 1
+	Debug.PGODevirtualize = 1
 	Debug.SyncFrames = -1 // disable sync markers by default
 
 	Debug.Checkptr = -1 // so we can tell whether it is set explicitly
@@ -188,7 +187,52 @@
 	}
 
 	if Debug.Gossahash != "" {
-		hashDebug = NewHashDebug("gosshash", Debug.Gossahash, nil)
+		hashDebug = NewHashDebug("gossahash", Debug.Gossahash, nil)
+	}
+
+	// Three inputs govern loop iteration variable rewriting, hash, experiment, flag.
+	// The loop variable rewriting is:
+	// IF non-empty hash, then hash determines behavior (function+line match) (*)
+	// ELSE IF experiment and flag==0, then experiment (set flag=1)
+	// ELSE flag (note that build sets flag per-package), with behaviors:
+	//  -1 => no change to behavior.
+	//   0 => no change to behavior (unless non-empty hash, see above)
+	//   1 => apply change to likely-iteration-variable-escaping loops
+	//   2 => apply change, log results
+	//   11 => apply change EVERYWHERE, do not log results (for debugging/benchmarking)
+	//   12 => apply change EVERYWHERE, log results (for debugging/benchmarking)
+	//
+	// The expected uses of the these inputs are, in believed most-likely to least likely:
+	//  GOEXPERIMENT=loopvar -- apply change to entire application
+	//  -gcflags=some_package=-d=loopvar=1 -- apply change to some_package (**)
+	//  -gcflags=some_package=-d=loopvar=2 -- apply change to some_package, log it
+	//  GOEXPERIMENT=loopvar -gcflags=some_package=-d=loopvar=-1 -- apply change to all but one package
+	//  GOCOMPILEDEBUG=loopvarhash=... -- search for failure cause
+	//
+	//  (*) For debugging purposes, providing loopvar flag >= 11 will expand the hash-eligible set of loops to all.
+	// (**) Loop semantics, changed or not, follow code from a package when it is inlined; that is, the behavior
+	//      of an application compiled with partially modified loop semantics does not depend on inlining.
+
+	if Debug.LoopVarHash != "" {
+		// This first little bit controls the inputs for debug-hash-matching.
+		mostInlineOnly := true
+		if strings.HasPrefix(Debug.LoopVarHash, "IL") {
+			// When hash-searching on a position that is an inline site, default is to use the
+			// most-inlined position only.  This makes the hash faster, plus there's no point
+			// reporting a problem with all the inlining; there's only one copy of the source.
+			// However, if for some reason you wanted it per-site, you can get this.  (The default
+			// hash-search behavior for compiler debugging is at an inline site.)
+			Debug.LoopVarHash = Debug.LoopVarHash[2:]
+			mostInlineOnly = false
+		}
+		// end of testing trickiness
+		LoopVarHash = NewHashDebug("loopvarhash", Debug.LoopVarHash, nil)
+		if Debug.LoopVar < 11 { // >= 11 means all loops are rewrite-eligible
+			Debug.LoopVar = 1 // 1 means those loops that syntactically escape their dcl vars are eligible.
+		}
+		LoopVarHash.SetInlineSuffixOnly(mostInlineOnly)
+	} else if buildcfg.Experiment.LoopVar && Debug.LoopVar == 0 {
+		Debug.LoopVar = 1
 	}
 
 	if Debug.Fmahash != "" {
@@ -204,7 +248,7 @@
 	if Flag.Race && !platform.RaceDetectorSupported(buildcfg.GOOS, buildcfg.GOARCH) {
 		log.Fatalf("%s/%s does not support -race", buildcfg.GOOS, buildcfg.GOARCH)
 	}
-	if (*Flag.Shared || *Flag.Dynlink || *Flag.LinkShared) && !Ctxt.Arch.InFamily(sys.AMD64, sys.ARM, sys.ARM64, sys.I386, sys.PPC64, sys.RISCV64, sys.S390X) {
+	if (*Flag.Shared || *Flag.Dynlink || *Flag.LinkShared) && !Ctxt.Arch.InFamily(sys.AMD64, sys.ARM, sys.ARM64, sys.I386, sys.Loong64, sys.MIPS64, sys.PPC64, sys.RISCV64, sys.S390X) {
 		log.Fatalf("%s/%s does not support -shared", buildcfg.GOOS, buildcfg.GOARCH)
 	}
 	parseSpectre(Flag.Spectre) // left as string for RecordFlags
diff --git a/src/cmd/compile/internal/base/hashdebug.go b/src/cmd/compile/internal/base/hashdebug.go
index 6c4821b..167b0df 100644
--- a/src/cmd/compile/internal/base/hashdebug.go
+++ b/src/cmd/compile/internal/base/hashdebug.go
@@ -6,22 +6,18 @@
 
 import (
 	"bytes"
-	"cmd/internal/notsha256"
 	"cmd/internal/obj"
 	"cmd/internal/src"
 	"fmt"
+	"internal/bisect"
 	"io"
 	"os"
+	"path/filepath"
 	"strconv"
 	"strings"
 	"sync"
 )
 
-type writeSyncer interface {
-	io.Writer
-	Sync() error
-}
-
 type hashAndMask struct {
 	// a hash h matches if (h^hash)&mask == 0
 	hash uint64
@@ -34,18 +30,33 @@
 	name string     // base name of the flag/variable.
 	// what file (if any) receives the yes/no logging?
 	// default is os.Stdout
-	logfile  writeSyncer
-	posTmp   []src.Pos
-	bytesTmp bytes.Buffer
-	matches  []hashAndMask // A hash matches if one of these matches.
-	yes, no  bool
+	logfile          io.Writer
+	posTmp           []src.Pos
+	bytesTmp         bytes.Buffer
+	matches          []hashAndMask // A hash matches if one of these matches.
+	excludes         []hashAndMask // explicitly excluded hash suffixes
+	bisect           *bisect.Matcher
+	fileSuffixOnly   bool // for Pos hashes, remove the directory prefix.
+	inlineSuffixOnly bool // for Pos hashes, remove all but the most inline position.
+}
+
+// SetInlineSuffixOnly controls whether hashing and reporting use the entire
+// inline position, or just the most-inline suffix.  Compiler debugging tends
+// to want the whole inlining, debugging user problems (loopvarhash, e.g.)
+// typically does not need to see the entire inline tree, there is just one
+// copy of the source code.
+func (d *HashDebug) SetInlineSuffixOnly(b bool) *HashDebug {
+	d.inlineSuffixOnly = b
+	return d
 }
 
 // The default compiler-debugging HashDebug, for "-d=gossahash=..."
 var hashDebug *HashDebug
-var FmaHash *HashDebug
 
-// DebugHashMatch reports whether debug variable Gossahash
+var FmaHash *HashDebug     // for debugging fused-multiply-add floating point changes
+var LoopVarHash *HashDebug // for debugging shared/private loop variable changes
+
+// DebugHashMatchPkgFunc reports whether debug variable Gossahash
 //
 //  1. is empty (returns true; this is a special more-quickly implemented case of 4 below)
 //
@@ -53,20 +64,28 @@
 //
 //  3. is "n" or "N" (returns false)
 //
-//  4. is a suffix of the sha1 hash of pkgAndName (returns true)
+//  4. does not explicitly exclude the sha1 hash of pkgAndName (see step 6)
 //
-//  5. OR
-//     if the value is in the regular language "[01]+(;[01]+)+"
-//     test the [01]+ substrings after in order returning true
-//     for the first one that suffix-matches. The substrings AFTER
-//     the first semicolon are numbered 0,1, etc and are named
-//     fmt.Sprintf("%s%d", varname, number)
-//     Clause 5 is not really intended for human use and only
+//  5. is a suffix of the sha1 hash of pkgAndName (returns true)
+//
+//  6. OR
+//     if the (non-empty) value is in the regular language
+//     "(-[01]+/)+?([01]+(/[01]+)+?"
+//     (exclude..)(....include...)
+//     test the [01]+ exclude substrings, if any suffix-match, return false (4 above)
+//     test the [01]+ include substrings, if any suffix-match, return true
+//     The include substrings AFTER the first slash are numbered 0,1, etc and
+//     are named fmt.Sprintf("%s%d", varname, number)
+//     As an extra-special case for multiple failure search,
+//     an excludes-only string ending in a slash (terminated, not separated)
+//     implicitly specifies the include string "0/1", that is, match everything.
+//     (Exclude strings are used for automated search for multiple failures.)
+//     Clause 6 is not really intended for human use and only
 //     matters for failures that require multiple triggers.
 //
 // Otherwise it returns false.
 //
-// Unless Flags.Gossahash is empty, when DebugHashMatch returns true the message
+// Unless Flags.Gossahash is empty, when DebugHashMatchPkgFunc returns true the message
 //
 //	"%s triggered %s\n", varname, pkgAndName
 //
@@ -102,8 +121,12 @@
 //
 //  6. gossahash should return a single function whose miscompilation
 //     causes the problem, and you can focus on that.
-func DebugHashMatch(pkgAndName string) bool {
-	return hashDebug.DebugHashMatch(pkgAndName)
+func DebugHashMatchPkgFunc(pkg, fn string) bool {
+	return hashDebug.MatchPkgFunc(pkg, fn, nil)
+}
+
+func DebugHashMatchPos(pos src.XPos) bool {
+	return hashDebug.MatchPos(pos, nil)
 }
 
 // HasDebugHash returns true if Flags.Gossahash is non-empty, which
@@ -113,6 +136,7 @@
 	return hashDebug != nil
 }
 
+// TODO: Delete when we switch to bisect-only.
 func toHashAndMask(s, varname string) hashAndMask {
 	l := len(s)
 	if l > 64 {
@@ -131,170 +155,215 @@
 // NewHashDebug returns a new hash-debug tester for the
 // environment variable ev.  If ev is not set, it returns
 // nil, allowing a lightweight check for normal-case behavior.
-func NewHashDebug(ev, s string, file writeSyncer) *HashDebug {
+func NewHashDebug(ev, s string, file io.Writer) *HashDebug {
 	if s == "" {
 		return nil
 	}
 
 	hd := &HashDebug{name: ev, logfile: file}
-	switch s[0] {
-	case 'y', 'Y':
-		hd.yes = true
-		return hd
-	case 'n', 'N':
-		hd.no = true
+	if !strings.Contains(s, "/") {
+		m, err := bisect.New(s)
+		if err != nil {
+			Fatalf("%s: %v", ev, err)
+		}
+		hd.bisect = m
 		return hd
 	}
+
+	// TODO: Delete remainder of function when we switch to bisect-only.
 	ss := strings.Split(s, "/")
-	hd.matches = append(hd.matches, toHashAndMask(ss[0], ev))
+	// first remove any leading exclusions; these are preceded with "-"
+	i := 0
+	for len(ss) > 0 {
+		s := ss[0]
+		if len(s) == 0 || len(s) > 0 && s[0] != '-' {
+			break
+		}
+		ss = ss[1:]
+		hd.excludes = append(hd.excludes, toHashAndMask(s[1:], fmt.Sprintf("%s%d", "HASH_EXCLUDE", i)))
+		i++
+	}
 	// hash searches may use additional EVs with 0, 1, 2, ... suffixes.
-	for i := 1; i < len(ss); i++ {
-		evi := fmt.Sprintf("%s%d", ev, i-1) // convention is extras begin indexing at zero
-		hd.matches = append(hd.matches, toHashAndMask(ss[i], evi))
+	i = 0
+	for _, s := range ss {
+		if s == "" {
+			if i != 0 || len(ss) > 1 && ss[1] != "" || len(ss) > 2 {
+				Fatalf("Empty hash match string for %s should be first (and only) one", ev)
+			}
+			// Special case of should match everything.
+			hd.matches = append(hd.matches, toHashAndMask("0", fmt.Sprintf("%s0", ev)))
+			hd.matches = append(hd.matches, toHashAndMask("1", fmt.Sprintf("%s1", ev)))
+			break
+		}
+		if i == 0 {
+			hd.matches = append(hd.matches, toHashAndMask(s, fmt.Sprintf("%s", ev)))
+		} else {
+			hd.matches = append(hd.matches, toHashAndMask(s, fmt.Sprintf("%s%d", ev, i-1)))
+		}
+		i++
 	}
 	return hd
 
 }
 
-func hashOf(pkgAndName string, param uint64) uint64 {
-	return hashOfBytes([]byte(pkgAndName), param)
-}
-
-func hashOfBytes(sbytes []byte, param uint64) uint64 {
-	hbytes := notsha256.Sum256(sbytes)
-	hash := uint64(hbytes[7])<<56 + uint64(hbytes[6])<<48 +
-		uint64(hbytes[5])<<40 + uint64(hbytes[4])<<32 +
-		uint64(hbytes[3])<<24 + uint64(hbytes[2])<<16 +
-		uint64(hbytes[1])<<8 + uint64(hbytes[0])
-
-	if param != 0 {
-		// Because param is probably a line number, probably near zero,
-		// hash it up a little bit, but even so only the lower-order bits
-		// likely matter because search focuses on those.
-		p0 := param + uint64(hbytes[9]) + uint64(hbytes[10])<<8 +
-			uint64(hbytes[11])<<16 + uint64(hbytes[12])<<24
-
-		p1 := param + uint64(hbytes[13]) + uint64(hbytes[14])<<8 +
-			uint64(hbytes[15])<<16 + uint64(hbytes[16])<<24
-
-		param += p0 * p1
-		param ^= param>>17 ^ param<<47
+// TODO: Delete when we switch to bisect-only.
+func (d *HashDebug) excluded(hash uint64) bool {
+	for _, m := range d.excludes {
+		if (m.hash^hash)&m.mask == 0 {
+			return true
+		}
 	}
-
-	return hash ^ param
+	return false
 }
 
-// DebugHashMatch returns true if either the variable used to create d is
+// TODO: Delete when we switch to bisect-only.
+func hashString(hash uint64) string {
+	hstr := ""
+	if hash == 0 {
+		hstr = "0"
+	} else {
+		for ; hash != 0; hash = hash >> 1 {
+			hstr = string('0'+byte(hash&1)) + hstr
+		}
+	}
+	if len(hstr) > 24 {
+		hstr = hstr[len(hstr)-24:]
+	}
+	return hstr
+}
+
+// TODO: Delete when we switch to bisect-only.
+func (d *HashDebug) match(hash uint64) *hashAndMask {
+	for i, m := range d.matches {
+		if (m.hash^hash)&m.mask == 0 {
+			return &d.matches[i]
+		}
+	}
+	return nil
+}
+
+// MatchPkgFunc returns true if either the variable used to create d is
 // unset, or if its value is y, or if it is a suffix of the base-two
-// representation of the hash of pkgAndName.  If the variable is not nil,
+// representation of the hash of pkg and fn.  If the variable is not nil,
 // then a true result is accompanied by stylized output to d.logfile, which
 // is used for automated bug search.
-func (d *HashDebug) DebugHashMatch(pkgAndName string) bool {
-	return d.DebugHashMatchParam(pkgAndName, 0)
-}
-
-// DebugHashMatchParam returns true if either the variable used to create d is
-// unset, or if its value is y, or if it is a suffix of the base-two
-// representation of the hash of pkgAndName and param. If the variable is not
-// nil, then a true result is accompanied by stylized output to d.logfile,
-// which is used for automated bug search.
-func (d *HashDebug) DebugHashMatchParam(pkgAndName string, param uint64) bool {
+func (d *HashDebug) MatchPkgFunc(pkg, fn string, note func() string) bool {
 	if d == nil {
 		return true
 	}
-	if d.no {
-		return false
-	}
-
-	if d.yes {
-		d.logDebugHashMatch(d.name, pkgAndName, "y", param)
-		return true
-	}
-
-	hash := hashOf(pkgAndName, param)
-
-	for _, m := range d.matches {
-		if (m.hash^hash)&m.mask == 0 {
-			hstr := ""
-			if hash == 0 {
-				hstr = "0"
-			} else {
-				for ; hash != 0; hash = hash >> 1 {
-					hstr = string('0'+byte(hash&1)) + hstr
-				}
-			}
-			d.logDebugHashMatch(m.name, pkgAndName, hstr, param)
-			return true
-		}
-	}
-	return false
+	// Written this way to make inlining likely.
+	return d.matchPkgFunc(pkg, fn, note)
 }
 
-// DebugHashMatchPos is similar to DebugHashMatchParam, but for hash computation
+func (d *HashDebug) matchPkgFunc(pkg, fn string, note func() string) bool {
+	hash := bisect.Hash(pkg, fn)
+	return d.matchAndLog(hash, func() string { return pkg + "." + fn }, note)
+}
+
+// MatchPos is similar to MatchPkgFunc, but for hash computation
 // it uses the source position including all inlining information instead of
-// package name and path. The output trigger string is prefixed with "POS=" so
-// that tools processing the output can reliably tell the difference. The mutex
-// locking is also more frequent and more granular.
-func (d *HashDebug) DebugHashMatchPos(ctxt *obj.Link, pos src.XPos) bool {
+// package name and path.
+// Note that the default answer for no environment variable (d == nil)
+// is "yes", do the thing.
+func (d *HashDebug) MatchPos(pos src.XPos, desc func() string) bool {
 	if d == nil {
 		return true
 	}
-	if d.no {
-		return false
-	}
-	d.mu.Lock()
-	defer d.mu.Unlock()
+	// Written this way to make inlining likely.
+	return d.matchPos(Ctxt, pos, desc)
+}
 
-	b := d.bytesForPos(ctxt, pos)
+func (d *HashDebug) matchPos(ctxt *obj.Link, pos src.XPos, note func() string) bool {
+	hash := d.hashPos(ctxt, pos)
+	return d.matchAndLog(hash, func() string { return d.fmtPos(ctxt, pos) }, note)
+}
 
-	if d.yes {
-		d.logDebugHashMatchLocked(d.name, string(b), "y", 0)
-		return true
-	}
-
-	hash := hashOfBytes(b, 0)
-
-	for _, m := range d.matches {
-		if (m.hash^hash)&m.mask == 0 {
-			hstr := ""
-			if hash == 0 {
-				hstr = "0"
-			} else {
-				for ; hash != 0; hash = hash >> 1 {
-					hstr = string('0'+byte(hash&1)) + hstr
+// matchAndLog is the core matcher. It reports whether the hash matches the pattern.
+// If a report needs to be printed, match prints that report to the log file.
+// The text func must be non-nil and should return a user-readable
+// representation of what was hashed. The note func may be nil; if non-nil,
+// it should return additional information to display to the user when this
+// change is selected.
+func (d *HashDebug) matchAndLog(hash uint64, text, note func() string) bool {
+	if d.bisect != nil {
+		enabled := d.bisect.ShouldEnable(hash)
+		if d.bisect.ShouldPrint(hash) {
+			disabled := ""
+			if !enabled {
+				disabled = " [DISABLED]"
+			}
+			var t string
+			if !d.bisect.MarkerOnly() {
+				t = text()
+				if note != nil {
+					if n := note(); n != "" {
+						t += ": " + n + disabled
+						disabled = ""
+					}
 				}
 			}
-			d.logDebugHashMatchLocked(m.name, "POS="+string(b), hstr, 0)
-			return true
+			d.log(d.name, hash, strings.TrimSpace(t+disabled))
 		}
+		return enabled
+	}
+
+	// TODO: Delete rest of function body when we switch to bisect-only.
+	if d.excluded(hash) {
+		return false
+	}
+	if m := d.match(hash); m != nil {
+		d.log(m.name, hash, text())
+		return true
 	}
 	return false
 }
 
-// bytesForPos renders a position, including inlining, into d.bytesTmp
-// and returns the byte array.  d.mu must be locked.
-func (d *HashDebug) bytesForPos(ctxt *obj.Link, pos src.XPos) []byte {
-	d.posTmp = ctxt.AllPos(pos, d.posTmp)
-	// Reverse posTmp to put outermost first.
-	b := &d.bytesTmp
-	b.Reset()
-	for i := len(d.posTmp) - 1; i >= 0; i-- {
-		p := &d.posTmp[i]
-		fmt.Fprintf(b, "%s:%d:%d", p.Filename(), p.Line(), p.Col())
-		if i != 0 {
-			b.WriteByte(';')
-		}
+// short returns the form of file name to use for d.
+// The default is the full path, but fileSuffixOnly selects
+// just the final path element.
+func (d *HashDebug) short(name string) string {
+	if d.fileSuffixOnly {
+		return filepath.Base(name)
 	}
-	return b.Bytes()
+	return name
 }
 
-func (d *HashDebug) logDebugHashMatch(varname, name, hstr string, param uint64) {
+// hashPos returns a hash of the position pos, including its entire inline stack.
+// If d.inlineSuffixOnly is true, hashPos only considers the innermost (leaf) position on the inline stack.
+func (d *HashDebug) hashPos(ctxt *obj.Link, pos src.XPos) uint64 {
+	if d.inlineSuffixOnly {
+		p := ctxt.InnermostPos(pos)
+		return bisect.Hash(d.short(p.Filename()), p.Line(), p.Col())
+	}
+	h := bisect.Hash()
+	ctxt.AllPos(pos, func(p src.Pos) {
+		h = bisect.Hash(h, d.short(p.Filename()), p.Line(), p.Col())
+	})
+	return h
+}
+
+// fmtPos returns a textual formatting of the position pos, including its entire inline stack.
+// If d.inlineSuffixOnly is true, fmtPos only considers the innermost (leaf) position on the inline stack.
+func (d *HashDebug) fmtPos(ctxt *obj.Link, pos src.XPos) string {
+	format := func(p src.Pos) string {
+		return fmt.Sprintf("%s:%d:%d", d.short(p.Filename()), p.Line(), p.Col())
+	}
+	if d.inlineSuffixOnly {
+		return format(ctxt.InnermostPos(pos))
+	}
+	var stk []string
+	ctxt.AllPos(pos, func(p src.Pos) {
+		stk = append(stk, format(p))
+	})
+	return strings.Join(stk, "; ")
+}
+
+// log prints a match with the given hash and textual formatting.
+// TODO: Delete varname parameter when we switch to bisect-only.
+func (d *HashDebug) log(varname string, hash uint64, text string) {
 	d.mu.Lock()
 	defer d.mu.Unlock()
-	d.logDebugHashMatchLocked(varname, name, hstr, param)
-}
 
-func (d *HashDebug) logDebugHashMatchLocked(varname, name, hstr string, param uint64) {
 	file := d.logfile
 	if file == nil {
 		if tmpfile := os.Getenv("GSHS_LOGFILE"); tmpfile != "" {
@@ -310,14 +379,11 @@
 		}
 		d.logfile = file
 	}
-	if len(hstr) > 24 {
-		hstr = hstr[len(hstr)-24:]
-	}
-	// External tools depend on this string
-	if param == 0 {
-		fmt.Fprintf(file, "%s triggered %s %s\n", varname, name, hstr)
-	} else {
-		fmt.Fprintf(file, "%s triggered %s:%d %s\n", varname, name, param, hstr)
-	}
-	file.Sync()
+
+	// Bisect output.
+	fmt.Fprintf(file, "%s %s\n", text, bisect.Marker(hash))
+
+	// Gossahash output.
+	// TODO: Delete rest of function when we switch to bisect-only.
+	fmt.Fprintf(file, "%s triggered %s %s\n", varname, text, hashString(hash))
 }
diff --git a/src/cmd/compile/internal/base/hashdebug_test.go b/src/cmd/compile/internal/base/hashdebug_test.go
index b74169f..62ef2ed 100644
--- a/src/cmd/compile/internal/base/hashdebug_test.go
+++ b/src/cmd/compile/internal/base/hashdebug_test.go
@@ -6,33 +6,28 @@
 
 import (
 	"bytes"
+	"internal/bisect"
 	"strings"
 	"testing"
 )
 
 func TestHashDebugGossahashY(t *testing.T) {
-	hd := NewHashDebug("GOSSAHASH", "y", nil)
+	hd := NewHashDebug("GOSSAHASH", "y", new(bytes.Buffer))
 	if hd == nil {
 		t.Errorf("NewHashDebug should not return nil for GOSSASHASH=y")
 	}
-	if !hd.yes {
-		t.Errorf("NewHashDebug should return hd.yes==true for GOSSASHASH=y")
-	}
-	if hd.no {
-		t.Errorf("NewHashDebug should not return hd.no==true for GOSSASHASH=y")
+	if !hd.MatchPkgFunc("anything", "anyfunc", nil) {
+		t.Errorf("NewHashDebug should return yes for everything for GOSSASHASH=y")
 	}
 }
 
 func TestHashDebugGossahashN(t *testing.T) {
-	hd := NewHashDebug("GOSSAHASH", "n", nil)
+	hd := NewHashDebug("GOSSAHASH", "n", new(bytes.Buffer))
 	if hd == nil {
 		t.Errorf("NewHashDebug should not return nil for GOSSASHASH=n")
 	}
-	if !hd.no {
-		t.Errorf("NewHashDebug should return hd.no==true GOSSASHASH=n")
-	}
-	if hd.yes {
-		t.Errorf("NewHashDebug should not return hd.yes==true for GOSSASHASH=n")
+	if hd.MatchPkgFunc("anything", "anyfunc", nil) {
+		t.Errorf("NewHashDebug should return no for everything for GOSSASHASH=n")
 	}
 }
 
@@ -55,72 +50,61 @@
 }
 
 func TestHash(t *testing.T) {
-	h0 := hashOf("bar", 0)
-	h1 := hashOf("bar", 1)
-	t.Logf(`These values are used in other tests: hashOf("bar,0)"=0x%x, hashOf("bar,1)"=0x%x`, h0, h1)
+	h0 := bisect.Hash("bar", "0")
+	h1 := bisect.Hash("bar", "1")
+	t.Logf(`These values are used in other tests: Hash("bar", "0")=%#64b, Hash("bar", "1")=%#64b`, h0, h1)
 	if h0 == h1 {
 		t.Errorf("Hashes 0x%x and 0x%x should differ", h0, h1)
 	}
 }
 
 func TestHashMatch(t *testing.T) {
-	ws := new(bufferWithSync)
-	hd := NewHashDebug("GOSSAHASH", "0011", ws)
-	check := hd.DebugHashMatch("bar")
-	msg := ws.String()
+	b := new(bytes.Buffer)
+	hd := NewHashDebug("GOSSAHASH", "v1110", b)
+	check := hd.MatchPkgFunc("bar", "0", func() string { return "note" })
+	msg := b.String()
 	t.Logf("message was '%s'", msg)
 	if !check {
-		t.Errorf("GOSSAHASH=0011 should have matched for 'bar'")
+		t.Errorf("GOSSAHASH=1110 should have matched for 'bar', '0'")
 	}
-	wantPrefix(t, msg, "GOSSAHASH triggered bar ")
-}
-
-func TestHashMatchParam(t *testing.T) {
-	ws := new(bufferWithSync)
-	hd := NewHashDebug("GOSSAHASH", "1010", ws)
-	check := hd.DebugHashMatchParam("bar", 1)
-	msg := ws.String()
-	t.Logf("message was '%s'", msg)
-	if !check {
-		t.Errorf("GOSSAHASH=1010 should have matched for 'bar', 1")
-	}
-	wantPrefix(t, msg, "GOSSAHASH triggered bar:1 ")
+	wantPrefix(t, msg, "bar.0: note [bisect-match ")
+	wantContains(t, msg, "\nGOSSAHASH triggered bar.0: note ")
 }
 
 func TestYMatch(t *testing.T) {
-	ws := new(bufferWithSync)
-	hd := NewHashDebug("GOSSAHASH", "y", ws)
-	check := hd.DebugHashMatch("bar")
-	msg := ws.String()
+	b := new(bytes.Buffer)
+	hd := NewHashDebug("GOSSAHASH", "vy", b)
+	check := hd.MatchPkgFunc("bar", "0", nil)
+	msg := b.String()
 	t.Logf("message was '%s'", msg)
 	if !check {
-		t.Errorf("GOSSAHASH=y should have matched for 'bar'")
+		t.Errorf("GOSSAHASH=y should have matched for 'bar', '0'")
 	}
-	wantPrefix(t, msg, "GOSSAHASH triggered bar y")
+	wantPrefix(t, msg, "bar.0 [bisect-match ")
+	wantContains(t, msg, "\nGOSSAHASH triggered bar.0 010100100011100101011110")
 }
 
 func TestNMatch(t *testing.T) {
-	ws := new(bufferWithSync)
-	hd := NewHashDebug("GOSSAHASH", "n", ws)
-	check := hd.DebugHashMatch("bar")
-	msg := ws.String()
+	b := new(bytes.Buffer)
+	hd := NewHashDebug("GOSSAHASH", "vn", b)
+	check := hd.MatchPkgFunc("bar", "0", nil)
+	msg := b.String()
 	t.Logf("message was '%s'", msg)
 	if check {
-		t.Errorf("GOSSAHASH=n should NOT have matched for 'bar'")
+		t.Errorf("GOSSAHASH=n should NOT have matched for 'bar', '0'")
 	}
-	if msg != "" {
-		t.Errorf("Message should have been empty, instead %s", msg)
-	}
+	wantPrefix(t, msg, "bar.0 [DISABLED] [bisect-match ")
+	wantContains(t, msg, "\nGOSSAHASH triggered bar.0 [DISABLED] 010100100011100101011110")
 }
 
 func TestHashNoMatch(t *testing.T) {
-	ws := new(bufferWithSync)
-	hd := NewHashDebug("GOSSAHASH", "001100", ws)
-	check := hd.DebugHashMatch("bar")
-	msg := ws.String()
+	b := new(bytes.Buffer)
+	hd := NewHashDebug("GOSSAHASH", "01110", b)
+	check := hd.MatchPkgFunc("bar", "0", nil)
+	msg := b.String()
 	t.Logf("message was '%s'", msg)
 	if check {
-		t.Errorf("GOSSAHASH=001100 should NOT have matched for 'bar'")
+		t.Errorf("GOSSAHASH=001100 should NOT have matched for 'bar', '0'")
 	}
 	if msg != "" {
 		t.Errorf("Message should have been empty, instead %s", msg)
@@ -129,36 +113,28 @@
 }
 
 func TestHashSecondMatch(t *testing.T) {
-	ws := new(bufferWithSync)
-	hd := NewHashDebug("GOSSAHASH", "001100/0011", ws)
+	b := new(bytes.Buffer)
+	hd := NewHashDebug("GOSSAHASH", "01110/11110", b)
 
-	check := hd.DebugHashMatch("bar")
-	msg := ws.String()
+	check := hd.MatchPkgFunc("bar", "0", nil)
+	msg := b.String()
 	t.Logf("message was '%s'", msg)
 	if !check {
-		t.Errorf("GOSSAHASH=001100, GOSSAHASH0=0011 should have matched for 'bar'")
+		t.Errorf("GOSSAHASH=001100, GOSSAHASH0=0011 should have matched for 'bar', '0'")
 	}
-	wantPrefix(t, msg, "GOSSAHASH0 triggered bar")
-}
-
-type bufferWithSync struct {
-	b bytes.Buffer
-}
-
-func (ws *bufferWithSync) Sync() error {
-	return nil
-}
-
-func (ws *bufferWithSync) Write(p []byte) (n int, err error) {
-	return (&ws.b).Write(p)
-}
-
-func (ws *bufferWithSync) String() string {
-	return strings.TrimSpace((&ws.b).String())
+	wantContains(t, msg, "\nGOSSAHASH0 triggered bar")
 }
 
 func wantPrefix(t *testing.T, got, want string) {
+	t.Helper()
 	if !strings.HasPrefix(got, want) {
-		t.Errorf("Want %s, got %s", want, got)
+		t.Errorf("want prefix %q, got:\n%s", want, got)
+	}
+}
+
+func wantContains(t *testing.T, got, want string) {
+	t.Helper()
+	if !strings.Contains(got, want) {
+		t.Errorf("want contains %q, got:\n%s", want, got)
 	}
 }
diff --git a/src/cmd/compile/internal/base/print.go b/src/cmd/compile/internal/base/print.go
index 21fa001..efd70f7 100644
--- a/src/cmd/compile/internal/base/print.go
+++ b/src/cmd/compile/internal/base/print.go
@@ -7,6 +7,7 @@
 import (
 	"fmt"
 	"internal/buildcfg"
+	"internal/types/errors"
 	"os"
 	"runtime/debug"
 	"sort"
@@ -17,8 +18,9 @@
 
 // An errorMsg is a queued error message, waiting to be printed.
 type errorMsg struct {
-	pos src.XPos
-	msg string
+	pos  src.XPos
+	msg  string
+	code errors.Code
 }
 
 // Pos is the current source position being processed,
@@ -42,7 +44,7 @@
 }
 
 // addErrorMsg adds a new errorMsg (which may be a warning) to errorMsgs.
-func addErrorMsg(pos src.XPos, format string, args ...interface{}) {
+func addErrorMsg(pos src.XPos, code errors.Code, format string, args ...interface{}) {
 	msg := fmt.Sprintf(format, args...)
 	// Only add the position if know the position.
 	// See issue golang.org/issue/11361.
@@ -50,8 +52,9 @@
 		msg = fmt.Sprintf("%v: %s", FmtPos(pos), msg)
 	}
 	errorMsgs = append(errorMsgs, errorMsg{
-		pos: pos,
-		msg: msg + "\n",
+		pos:  pos,
+		msg:  msg + "\n",
+		code: code,
 	})
 }
 
@@ -82,7 +85,7 @@
 	sort.Stable(byPos(errorMsgs))
 	for i, err := range errorMsgs {
 		if i == 0 || err.msg != errorMsgs[i-1].msg {
-			fmt.Printf("%s", err.msg)
+			fmt.Print(err.msg)
 		}
 	}
 	errorMsgs = errorMsgs[:0]
@@ -105,11 +108,11 @@
 
 // Errorf reports a formatted error at the current line.
 func Errorf(format string, args ...interface{}) {
-	ErrorfAt(Pos, format, args...)
+	ErrorfAt(Pos, 0, format, args...)
 }
 
 // ErrorfAt reports a formatted error message at pos.
-func ErrorfAt(pos src.XPos, format string, args ...interface{}) {
+func ErrorfAt(pos src.XPos, code errors.Code, format string, args ...interface{}) {
 	msg := fmt.Sprintf(format, args...)
 
 	if strings.HasPrefix(msg, "syntax error") {
@@ -132,7 +135,7 @@
 		lasterror.msg = msg
 	}
 
-	addErrorMsg(pos, "%s", msg)
+	addErrorMsg(pos, code, "%s", msg)
 	numErrors++
 
 	hcrash()
@@ -174,7 +177,7 @@
 // so this should be used only when the user has opted in
 // to additional output by setting a particular flag.
 func WarnfAt(pos src.XPos, format string, args ...interface{}) {
-	addErrorMsg(pos, format, args...)
+	addErrorMsg(pos, 0, format, args...)
 	if Flag.LowerM != 0 {
 		FlushErrors()
 	}
diff --git a/src/cmd/compile/internal/base/timings.go b/src/cmd/compile/internal/base/timings.go
index f599f4e..f48ac93 100644
--- a/src/cmd/compile/internal/base/timings.go
+++ b/src/cmd/compile/internal/base/timings.go
@@ -14,7 +14,7 @@
 var Timer Timings
 
 // Timings collects the execution times of labeled phases
-// which are added trough a sequence of Start/Stop calls.
+// which are added through a sequence of Start/Stop calls.
 // Events may be associated with each phase via AddEvent.
 type Timings struct {
 	list   []timestamp
diff --git a/src/cmd/compile/internal/compare/compare.go b/src/cmd/compile/internal/compare/compare.go
index 512ad25..1674065 100644
--- a/src/cmd/compile/internal/compare/compare.go
+++ b/src/cmd/compile/internal/compare/compare.go
@@ -166,7 +166,10 @@
 // It works by building a list of boolean conditions to satisfy.
 // Conditions must be evaluated in the returned order and
 // properly short-circuited by the caller.
-func EqStruct(t *types.Type, np, nq ir.Node) []ir.Node {
+// The first return value is the flattened list of conditions,
+// the second value is a boolean indicating whether any of the
+// comparisons could panic.
+func EqStruct(t *types.Type, np, nq ir.Node) ([]ir.Node, bool) {
 	// The conditions are a list-of-lists. Conditions are reorderable
 	// within each inner list. The outer lists must be evaluated in order.
 	var conds [][]ir.Node
@@ -187,9 +190,11 @@
 			continue
 		}
 
+		typeCanPanic := EqCanPanic(f.Type)
+
 		// Compare non-memory fields with field equality.
 		if !IsRegularMemory(f.Type) {
-			if EqCanPanic(f.Type) {
+			if typeCanPanic {
 				// Enforce ordering by starting a new set of reorderable conditions.
 				conds = append(conds, []ir.Node{})
 			}
@@ -203,7 +208,7 @@
 			default:
 				and(ir.NewBinaryExpr(base.Pos, ir.OEQ, p, q))
 			}
-			if EqCanPanic(f.Type) {
+			if typeCanPanic {
 				// Also enforce ordering after something that can panic.
 				conds = append(conds, []ir.Node{})
 			}
@@ -238,7 +243,7 @@
 		})
 		flatConds = append(flatConds, c...)
 	}
-	return flatConds
+	return flatConds, len(conds) > 1
 }
 
 // EqString returns the nodes
@@ -259,9 +264,40 @@
 	slen := typecheck.Conv(ir.NewUnaryExpr(base.Pos, ir.OLEN, s), types.Types[types.TUINTPTR])
 	tlen := typecheck.Conv(ir.NewUnaryExpr(base.Pos, ir.OLEN, t), types.Types[types.TUINTPTR])
 
+	// Pick the 3rd arg to memequal. Both slen and tlen are fine to use, because we short
+	// circuit the memequal call if they aren't the same. But if one is a constant some
+	// memequal optimizations are easier to apply.
+	probablyConstant := func(n ir.Node) bool {
+		if n.Op() == ir.OCONVNOP {
+			n = n.(*ir.ConvExpr).X
+		}
+		if n.Op() == ir.OLITERAL {
+			return true
+		}
+		if n.Op() != ir.ONAME {
+			return false
+		}
+		name := n.(*ir.Name)
+		if name.Class != ir.PAUTO {
+			return false
+		}
+		if def := name.Defn; def == nil {
+			// n starts out as the empty string
+			return true
+		} else if def.Op() == ir.OAS && (def.(*ir.AssignStmt).Y == nil || def.(*ir.AssignStmt).Y.Op() == ir.OLITERAL) {
+			// n starts out as a constant string
+			return true
+		}
+		return false
+	}
+	cmplen := slen
+	if probablyConstant(t) && !probablyConstant(s) {
+		cmplen = tlen
+	}
+
 	fn := typecheck.LookupRuntime("memequal")
 	fn = typecheck.SubstArgTypes(fn, types.Types[types.TUINT8], types.Types[types.TUINT8])
-	call := typecheck.Call(base.Pos, fn, []ir.Node{sptr, tptr, ir.Copy(slen)}, false).(*ir.CallExpr)
+	call := typecheck.Call(base.Pos, fn, []ir.Node{sptr, tptr, ir.Copy(cmplen)}, false).(*ir.CallExpr)
 
 	cmp := ir.NewBinaryExpr(base.Pos, ir.OEQ, slen, tlen)
 	cmp = typecheck.Expr(cmp).(*ir.BinaryExpr)
@@ -321,7 +357,7 @@
 
 // eqmem returns the node
 //
-//	memequal(&p.field, &q.field, size])
+//	memequal(&p.field, &q.field, size)
 func eqmem(p ir.Node, q ir.Node, field *types.Sym, size int64) ir.Node {
 	nx := typecheck.Expr(typecheck.NodAddr(ir.NewSelectorExpr(base.Pos, ir.OXDOT, p, field)))
 	ny := typecheck.Expr(typecheck.NodAddr(ir.NewSelectorExpr(base.Pos, ir.OXDOT, q, field)))
@@ -331,7 +367,7 @@
 	call.Args.Append(nx)
 	call.Args.Append(ny)
 	if needsize {
-		call.Args.Append(ir.NewInt(size))
+		call.Args.Append(ir.NewInt(base.Pos, size))
 	}
 
 	return call
diff --git a/src/cmd/compile/internal/compare/compare_test.go b/src/cmd/compile/internal/compare/compare_test.go
index db34657..c65537f 100644
--- a/src/cmd/compile/internal/compare/compare_test.go
+++ b/src/cmd/compile/internal/compare/compare_test.go
@@ -53,11 +53,11 @@
 	}{
 		{"struct without fields", 0, 0,
 			func() *types.Type {
-				return types.NewStruct(types.NewPkg("main", ""), []*types.Field{})
+				return types.NewStruct([]*types.Field{})
 			}},
 		{"struct with 1 byte field", 1, 1,
 			func() *types.Type {
-				parent := types.NewStruct(types.NewPkg("main", ""), []*types.Field{})
+				parent := types.NewStruct([]*types.Field{})
 				fields := []*types.Field{
 					newByteField(parent, 0),
 				}
@@ -67,7 +67,7 @@
 		},
 		{"struct with 8 byte fields", 1, 8,
 			func() *types.Type {
-				parent := types.NewStruct(types.NewPkg("main", ""), []*types.Field{})
+				parent := types.NewStruct([]*types.Field{})
 				fields := make([]*types.Field, 8)
 				for i := range fields {
 					fields[i] = newByteField(parent, int64(i))
@@ -78,7 +78,7 @@
 		},
 		{"struct with 16 byte fields", 2, 16,
 			func() *types.Type {
-				parent := types.NewStruct(types.NewPkg("main", ""), []*types.Field{})
+				parent := types.NewStruct([]*types.Field{})
 				fields := make([]*types.Field, 16)
 				for i := range fields {
 					fields[i] = newByteField(parent, int64(i))
@@ -89,7 +89,7 @@
 		},
 		{"struct with 32 byte fields", 4, 32,
 			func() *types.Type {
-				parent := types.NewStruct(types.NewPkg("main", ""), []*types.Field{})
+				parent := types.NewStruct([]*types.Field{})
 				fields := make([]*types.Field, 32)
 				for i := range fields {
 					fields[i] = newByteField(parent, int64(i))
@@ -100,7 +100,7 @@
 		},
 		{"struct with 2 int32 fields", 1, 2,
 			func() *types.Type {
-				parent := types.NewStruct(types.NewPkg("main", ""), []*types.Field{})
+				parent := types.NewStruct([]*types.Field{})
 				fields := make([]*types.Field, 2)
 				for i := range fields {
 					fields[i] = newField(parent, int64(i*4), types.TINT32)
@@ -111,7 +111,7 @@
 		},
 		{"struct with 2 int32 fields and 1 int64", 2, 3,
 			func() *types.Type {
-				parent := types.NewStruct(types.NewPkg("main", ""), []*types.Field{})
+				parent := types.NewStruct([]*types.Field{})
 				fields := make([]*types.Field, 3)
 				fields[0] = newField(parent, int64(0), types.TINT32)
 				fields[1] = newField(parent, int64(4), types.TINT32)
@@ -122,7 +122,7 @@
 		},
 		{"struct with 1 int field and 1 string", 3, 3,
 			func() *types.Type {
-				parent := types.NewStruct(types.NewPkg("main", ""), []*types.Field{})
+				parent := types.NewStruct([]*types.Field{})
 				fields := make([]*types.Field, 2)
 				fields[0] = newField(parent, int64(0), types.TINT64)
 				fields[1] = newField(parent, int64(8), types.TSTRING)
@@ -132,7 +132,7 @@
 		},
 		{"struct with 2 strings", 4, 4,
 			func() *types.Type {
-				parent := types.NewStruct(types.NewPkg("main", ""), []*types.Field{})
+				parent := types.NewStruct([]*types.Field{})
 				fields := make([]*types.Field, 2)
 				fields[0] = newField(parent, int64(0), types.TSTRING)
 				fields[1] = newField(parent, int64(8), types.TSTRING)
@@ -142,7 +142,7 @@
 		},
 		{"struct with 1 large byte array field", 26, 101,
 			func() *types.Type {
-				parent := types.NewStruct(types.NewPkg("main", ""), []*types.Field{})
+				parent := types.NewStruct([]*types.Field{})
 				fields := []*types.Field{
 					newArrayField(parent, 0, 101, types.TUINT16),
 				}
@@ -152,7 +152,7 @@
 		},
 		{"struct with string array field", 4, 4,
 			func() *types.Type {
-				parent := types.NewStruct(types.NewPkg("main", ""), []*types.Field{})
+				parent := types.NewStruct([]*types.Field{})
 				fields := []*types.Field{
 					newArrayField(parent, 0, 2, types.TSTRING),
 				}
diff --git a/src/cmd/compile/internal/coverage/cover.go b/src/cmd/compile/internal/coverage/cover.go
index 688728d..3e0350b 100644
--- a/src/cmd/compile/internal/coverage/cover.go
+++ b/src/cmd/compile/internal/coverage/cover.go
@@ -157,7 +157,7 @@
 	pos := cnames.InitFn.Pos()
 	elist := make([]ir.Node, 0, 16)
 	for i := 0; i < 16; i++ {
-		elem := ir.NewInt(int64(hashv[i]))
+		elem := ir.NewInt(base.Pos, int64(hashv[i]))
 		elist = append(elist, elem)
 	}
 	ht := types.NewArray(types.Types[types.TUINT8], 16)
@@ -168,7 +168,7 @@
 	mdauspx := typecheck.ConvNop(mdax, types.Types[types.TUNSAFEPTR])
 
 	// Materialize expression for length.
-	lenx := ir.NewInt(int64(mdlen)) // untyped
+	lenx := ir.NewInt(base.Pos, int64(mdlen)) // untyped
 
 	// Generate a call to runtime.addCovMeta, e.g.
 	//
@@ -176,10 +176,10 @@
 	//
 	fn := typecheck.LookupRuntime("addCovMeta")
 	pkid := coverage.HardCodedPkgID(base.Ctxt.Pkgpath)
-	pkIdNode := ir.NewInt(int64(pkid))
-	cmodeNode := ir.NewInt(int64(cnames.CounterMode))
-	cgranNode := ir.NewInt(int64(cnames.CounterGran))
-	pkPathNode := ir.NewString(base.Ctxt.Pkgpath)
+	pkIdNode := ir.NewInt(base.Pos, int64(pkid))
+	cmodeNode := ir.NewInt(base.Pos, int64(cnames.CounterMode))
+	cgranNode := ir.NewInt(base.Pos, int64(cnames.CounterGran))
+	pkPathNode := ir.NewString(base.Pos, base.Ctxt.Pkgpath)
 	callx := typecheck.Call(pos, fn, []ir.Node{mdauspx, lenx, hashx,
 		pkPathNode, pkIdNode, cmodeNode, cgranNode}, false)
 	assign := callx
@@ -202,7 +202,7 @@
 	pos := initfn.Pos()
 	istest := cmode == coverage.CtrModeTestMain
 	initf := typecheck.LookupCoverage("initHook")
-	istestNode := ir.NewBool(istest)
+	istestNode := ir.NewBool(base.Pos, istest)
 	args := []ir.Node{istestNode}
 	callx := typecheck.Call(pos, initf, args, false)
 	initfn.Body.Append(callx)
diff --git a/src/cmd/compile/internal/deadcode/deadcode.go b/src/cmd/compile/internal/deadcode/deadcode.go
index decd261..46a2239 100644
--- a/src/cmd/compile/internal/deadcode/deadcode.go
+++ b/src/cmd/compile/internal/deadcode/deadcode.go
@@ -122,16 +122,16 @@
 							// This switch entry is the one that always triggers.
 							for _, cas2 := range n.Cases {
 								for _, c2 := range cas2.List {
-									if cas2 != cas || c2 != c {
-										ir.Visit(c2, markHiddenClosureDead)
-									}
+									ir.Visit(c2, markHiddenClosureDead)
 								}
 								if cas2 != cas {
 									ir.VisitList(cas2.Body, markHiddenClosureDead)
 								}
 							}
 
-							cas.List[0] = c
+							// Rewrite to switch { case true: ... }
+							n.Tag = nil
+							cas.List[0] = ir.NewBool(c.Pos(), true)
 							cas.List = cas.List[:1]
 							n.Cases[0] = cas
 							n.Cases = n.Cases[:1]
diff --git a/src/cmd/compile/internal/devirtualize/devirtualize.go b/src/cmd/compile/internal/devirtualize/devirtualize.go
index 554e935..b156b66 100644
--- a/src/cmd/compile/internal/devirtualize/devirtualize.go
+++ b/src/cmd/compile/internal/devirtualize/devirtualize.go
@@ -2,9 +2,13 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// Package devirtualize implements a simple "devirtualization"
-// optimization pass, which replaces interface method calls with
-// direct concrete-type method calls where possible.
+// Package devirtualize implements two "devirtualization" optimization passes:
+//
+//   - "Static" devirtualization which replaces interface method calls with
+//     direct concrete-type method calls where possible.
+//   - "Profile-guided" devirtualization which replaces indirect calls with a
+//     conditional direct call to the hottest concrete callee from a profile, as
+//     well as a fallback using the original indirect call.
 package devirtualize
 
 import (
@@ -14,8 +18,9 @@
 	"cmd/compile/internal/types"
 )
 
-// Func devirtualizes calls within fn where possible.
-func Func(fn *ir.Func) {
+// Static devirtualizes calls within fn where possible when the concrete callee
+// is available statically.
+func Static(fn *ir.Func) {
 	ir.CurFunc = fn
 
 	// For promoted methods (including value-receiver methods promoted to pointer-receivers),
@@ -34,14 +39,15 @@
 			return
 		case *ir.CallExpr:
 			if !goDeferCall[n] {
-				Call(n)
+				staticCall(n)
 			}
 		}
 	})
 }
 
-// Call devirtualizes the given call if possible.
-func Call(call *ir.CallExpr) {
+// staticCall devirtualizes the given call if possible when the concrete callee
+// is available statically.
+func staticCall(call *ir.CallExpr) {
 	if call.Op() != ir.OCALLINTER {
 		return
 	}
@@ -57,58 +63,52 @@
 		return
 	}
 
-	if base.Debug.Unified != 0 {
-		// N.B., stencil.go converts shape-typed values to interface type
-		// using OEFACE instead of OCONVIFACE, so devirtualization fails
-		// above instead. That's why this code is specific to unified IR.
+	// If typ is a shape type, then it was a type argument originally
+	// and we'd need an indirect call through the dictionary anyway.
+	// We're unable to devirtualize this call.
+	if typ.IsShape() {
+		return
+	}
 
-		// If typ is a shape type, then it was a type argument originally
-		// and we'd need an indirect call through the dictionary anyway.
-		// We're unable to devirtualize this call.
-		if typ.IsShape() {
-			return
+	// If typ *has* a shape type, then it's an shaped, instantiated
+	// type like T[go.shape.int], and its methods (may) have an extra
+	// dictionary parameter. We could devirtualize this call if we
+	// could derive an appropriate dictionary argument.
+	//
+	// TODO(mdempsky): If typ has has a promoted non-generic method,
+	// then that method won't require a dictionary argument. We could
+	// still devirtualize those calls.
+	//
+	// TODO(mdempsky): We have the *runtime.itab in recv.TypeWord. It
+	// should be possible to compute the represented type's runtime
+	// dictionary from this (e.g., by adding a pointer from T[int]'s
+	// *runtime._type to .dict.T[int]; or by recognizing static
+	// references to go:itab.T[int],iface and constructing a direct
+	// reference to .dict.T[int]).
+	if typ.HasShape() {
+		if base.Flag.LowerM != 0 {
+			base.WarnfAt(call.Pos(), "cannot devirtualize %v: shaped receiver %v", call, typ)
 		}
+		return
+	}
 
-		// If typ *has* a shape type, then it's an shaped, instantiated
-		// type like T[go.shape.int], and its methods (may) have an extra
-		// dictionary parameter. We could devirtualize this call if we
-		// could derive an appropriate dictionary argument.
-		//
-		// TODO(mdempsky): If typ has has a promoted non-generic method,
-		// then that method won't require a dictionary argument. We could
-		// still devirtualize those calls.
-		//
-		// TODO(mdempsky): We have the *runtime.itab in recv.TypeWord. It
-		// should be possible to compute the represented type's runtime
-		// dictionary from this (e.g., by adding a pointer from T[int]'s
-		// *runtime._type to .dict.T[int]; or by recognizing static
-		// references to go:itab.T[int],iface and constructing a direct
-		// reference to .dict.T[int]).
-		if typ.HasShape() {
-			if base.Flag.LowerM != 0 {
-				base.WarnfAt(call.Pos(), "cannot devirtualize %v: shaped receiver %v", call, typ)
-			}
-			return
+	// Further, if sel.X's type has a shape type, then it's a shaped
+	// interface type. In this case, the (non-dynamic) TypeAssertExpr
+	// we construct below would attempt to create an itab
+	// corresponding to this shaped interface type; but the actual
+	// itab pointer in the interface value will correspond to the
+	// original (non-shaped) interface type instead. These are
+	// functionally equivalent, but they have distinct pointer
+	// identities, which leads to the type assertion failing.
+	//
+	// TODO(mdempsky): We know the type assertion here is safe, so we
+	// could instead set a flag so that walk skips the itab check. For
+	// now, punting is easy and safe.
+	if sel.X.Type().HasShape() {
+		if base.Flag.LowerM != 0 {
+			base.WarnfAt(call.Pos(), "cannot devirtualize %v: shaped interface %v", call, sel.X.Type())
 		}
-
-		// Further, if sel.X's type has a shape type, then it's a shaped
-		// interface type. In this case, the (non-dynamic) TypeAssertExpr
-		// we construct below would attempt to create an itab
-		// corresponding to this shaped interface type; but the actual
-		// itab pointer in the interface value will correspond to the
-		// original (non-shaped) interface type instead. These are
-		// functionally equivalent, but they have distinct pointer
-		// identities, which leads to the type assertion failing.
-		//
-		// TODO(mdempsky): We know the type assertion here is safe, so we
-		// could instead set a flag so that walk skips the itab check. For
-		// now, punting is easy and safe.
-		if sel.X.Type().HasShape() {
-			if base.Flag.LowerM != 0 {
-				base.WarnfAt(call.Pos(), "cannot devirtualize %v: shaped interface %v", call, sel.X.Type())
-			}
-			return
-		}
+		return
 	}
 
 	dt := ir.NewTypeAssertExpr(sel.Pos(), sel.X, nil)
diff --git a/src/cmd/compile/internal/devirtualize/pgo.go b/src/cmd/compile/internal/devirtualize/pgo.go
new file mode 100644
index 0000000..068e0ef
--- /dev/null
+++ b/src/cmd/compile/internal/devirtualize/pgo.go
@@ -0,0 +1,542 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package devirtualize
+
+import (
+	"cmd/compile/internal/base"
+	"cmd/compile/internal/inline"
+	"cmd/compile/internal/ir"
+	"cmd/compile/internal/logopt"
+	"cmd/compile/internal/pgo"
+	"cmd/compile/internal/typecheck"
+	"cmd/compile/internal/types"
+	"encoding/json"
+	"fmt"
+	"os"
+	"strings"
+)
+
+// CallStat summarizes a single call site.
+//
+// This is used only for debug logging.
+type CallStat struct {
+	Pkg string // base.Ctxt.Pkgpath
+	Pos string // file:line:col of call.
+
+	Caller string // Linker symbol name of calling function.
+
+	// Direct or indirect call.
+	Direct bool
+
+	// For indirect calls, interface call or other indirect function call.
+	Interface bool
+
+	// Total edge weight from this call site.
+	Weight int64
+
+	// Hottest callee from this call site, regardless of type
+	// compatibility.
+	Hottest       string
+	HottestWeight int64
+
+	// Devirtualized callee if != "".
+	//
+	// Note that this may be different than Hottest because we apply
+	// type-check restrictions, which helps distinguish multiple calls on
+	// the same line.
+	Devirtualized       string
+	DevirtualizedWeight int64
+}
+
+// ProfileGuided performs call devirtualization of indirect calls based on
+// profile information.
+//
+// Specifically, it performs conditional devirtualization of interface calls
+// for the hottest callee. That is, it performs a transformation like:
+//
+//	type Iface interface {
+//		Foo()
+//	}
+//
+//	type Concrete struct{}
+//
+//	func (Concrete) Foo() {}
+//
+//	func foo(i Iface) {
+//		i.Foo()
+//	}
+//
+// to:
+//
+//	func foo(i Iface) {
+//		if c, ok := i.(Concrete); ok {
+//			c.Foo()
+//		} else {
+//			i.Foo()
+//		}
+//	}
+//
+// The primary benefit of this transformation is enabling inlining of the
+// direct call.
+func ProfileGuided(fn *ir.Func, p *pgo.Profile) {
+	ir.CurFunc = fn
+
+	name := ir.LinkFuncName(fn)
+
+	// Can't devirtualize go/defer calls. See comment in Static.
+	goDeferCall := make(map[*ir.CallExpr]bool)
+
+	var jsonW *json.Encoder
+	if base.Debug.PGODebug >= 3 {
+		jsonW = json.NewEncoder(os.Stdout)
+	}
+
+	var edit func(n ir.Node) ir.Node
+	edit = func(n ir.Node) ir.Node {
+		if n == nil {
+			return n
+		}
+
+		if gds, ok := n.(*ir.GoDeferStmt); ok {
+			if call, ok := gds.Call.(*ir.CallExpr); ok {
+				goDeferCall[call] = true
+			}
+		}
+
+		ir.EditChildren(n, edit)
+
+		call, ok := n.(*ir.CallExpr)
+		if !ok {
+			return n
+		}
+
+		var stat *CallStat
+		if base.Debug.PGODebug >= 3 {
+			// Statistics about every single call. Handy for external data analysis.
+			//
+			// TODO(prattmic): Log via logopt?
+			stat = constructCallStat(p, fn, name, call)
+			if stat != nil {
+				defer func() {
+					jsonW.Encode(&stat)
+				}()
+			}
+		}
+
+		if call.Op() != ir.OCALLINTER {
+			return n
+		}
+
+		if base.Debug.PGODebug >= 2 {
+			fmt.Printf("%v: PGO devirtualize considering call %v\n", ir.Line(call), call)
+		}
+
+		if goDeferCall[call] {
+			if base.Debug.PGODebug >= 2 {
+				fmt.Printf("%v: can't PGO devirtualize go/defer call %v\n", ir.Line(call), call)
+			}
+			return n
+		}
+
+		// Bail if we do not have a hot callee.
+		callee, weight := findHotConcreteCallee(p, fn, call)
+		if callee == nil {
+			return n
+		}
+		// Bail if we do not have a Type node for the hot callee.
+		ctyp := methodRecvType(callee)
+		if ctyp == nil {
+			return n
+		}
+		// Bail if we know for sure it won't inline.
+		if !shouldPGODevirt(callee) {
+			return n
+		}
+
+		if stat != nil {
+			stat.Devirtualized = ir.LinkFuncName(callee)
+			stat.DevirtualizedWeight = weight
+		}
+
+		return rewriteCondCall(call, fn, callee, ctyp)
+	}
+
+	ir.EditChildren(fn, edit)
+}
+
+// shouldPGODevirt checks if we should perform PGO devirtualization to the
+// target function.
+//
+// PGO devirtualization is most valuable when the callee is inlined, so if it
+// won't inline we can skip devirtualizing.
+func shouldPGODevirt(fn *ir.Func) bool {
+	var reason string
+	if base.Flag.LowerM > 1 || logopt.Enabled() {
+		defer func() {
+			if reason != "" {
+				if base.Flag.LowerM > 1 {
+					fmt.Printf("%v: should not PGO devirtualize %v: %s\n", ir.Line(fn), ir.FuncName(fn), reason)
+				}
+				if logopt.Enabled() {
+					logopt.LogOpt(fn.Pos(), ": should not PGO devirtualize function", "pgo-devirtualize", ir.FuncName(fn), reason)
+				}
+			}
+		}()
+	}
+
+	reason = inline.InlineImpossible(fn)
+	if reason != "" {
+		return false
+	}
+
+	// TODO(prattmic): checking only InlineImpossible is very conservative,
+	// primarily excluding only functions with pragmas. We probably want to
+	// move in either direction. Either:
+	//
+	// 1. Don't even bother to check InlineImpossible, as it affects so few
+	// functions.
+	//
+	// 2. Or consider the function body (notably cost) to better determine
+	// if the function will actually inline.
+
+	return true
+}
+
+// constructCallStat builds an initial CallStat describing this call, for
+// logging. If the call is devirtualized, the devirtualization fields should be
+// updated.
+func constructCallStat(p *pgo.Profile, fn *ir.Func, name string, call *ir.CallExpr) *CallStat {
+	switch call.Op() {
+	case ir.OCALLFUNC, ir.OCALLINTER, ir.OCALLMETH:
+	default:
+		// We don't care about logging builtin functions.
+		return nil
+	}
+
+	stat := CallStat{
+		Pkg:    base.Ctxt.Pkgpath,
+		Pos:    ir.Line(call),
+		Caller: name,
+	}
+
+	offset := pgo.NodeLineOffset(call, fn)
+
+	// Sum of all edges from this callsite, regardless of callee.
+	// For direct calls, this should be the same as the single edge
+	// weight (except for multiple calls on one line, which we
+	// can't distinguish).
+	callerNode := p.WeightedCG.IRNodes[name]
+	for _, edge := range callerNode.OutEdges {
+		if edge.CallSiteOffset != offset {
+			continue
+		}
+		stat.Weight += edge.Weight
+		if edge.Weight > stat.HottestWeight {
+			stat.HottestWeight = edge.Weight
+			stat.Hottest = edge.Dst.Name()
+		}
+	}
+
+	switch call.Op() {
+	case ir.OCALLFUNC:
+		stat.Interface = false
+
+		callee := pgo.DirectCallee(call.X)
+		if callee != nil {
+			stat.Direct = true
+			if stat.Hottest == "" {
+				stat.Hottest = ir.LinkFuncName(callee)
+			}
+		} else {
+			stat.Direct = false
+		}
+	case ir.OCALLINTER:
+		stat.Direct = false
+		stat.Interface = true
+	case ir.OCALLMETH:
+		base.FatalfAt(call.Pos(), "OCALLMETH missed by typecheck")
+	}
+
+	return &stat
+}
+
+// rewriteCondCall devirtualizes the given call using a direct method call to
+// concretetyp.
+func rewriteCondCall(call *ir.CallExpr, curfn, callee *ir.Func, concretetyp *types.Type) ir.Node {
+	if base.Flag.LowerM != 0 {
+		fmt.Printf("%v: PGO devirtualizing %v to %v\n", ir.Line(call), call.X, callee)
+	}
+
+	// We generate an OINCALL of:
+	//
+	// var recv Iface
+	//
+	// var arg1 A1
+	// var argN AN
+	//
+	// var ret1 R1
+	// var retN RN
+	//
+	// recv, arg1, argN = recv expr, arg1 expr, argN expr
+	//
+	// t, ok := recv.(Concrete)
+	// if ok {
+	//   ret1, retN = t.Method(arg1, ... argN)
+	// } else {
+	//   ret1, retN = recv.Method(arg1, ... argN)
+	// }
+	//
+	// OINCALL retvars: ret1, ... retN
+	//
+	// This isn't really an inlined call of course, but InlinedCallExpr
+	// makes handling reassignment of return values easier.
+	//
+	// TODO(prattmic): This increases the size of the AST in the caller,
+	// making it less like to inline. We may want to compensate for this
+	// somehow.
+
+	var retvars []ir.Node
+
+	sig := call.X.Type()
+
+	for _, ret := range sig.Results().FieldSlice() {
+		retvars = append(retvars, typecheck.Temp(ret.Type))
+	}
+
+	sel := call.X.(*ir.SelectorExpr)
+	method := sel.Sel
+	pos := call.Pos()
+	init := ir.TakeInit(call)
+
+	// Evaluate receiver and argument expressions. The receiver is used
+	// twice but we don't want to cause side effects twice. The arguments
+	// are used in two different calls and we can't trivially copy them.
+	//
+	// recv must be first in the assignment list as its side effects must
+	// be ordered before argument side effects.
+	var lhs, rhs []ir.Node
+	recv := typecheck.Temp(sel.X.Type())
+	lhs = append(lhs, recv)
+	rhs = append(rhs, sel.X)
+
+	// Move arguments to assignments prior to the if statement. We cannot
+	// simply copy the args' IR, as some IR constructs cannot be copied,
+	// such as labels (possible in InlinedCall nodes).
+	args := call.Args.Take()
+	for _, arg := range args {
+		argvar := typecheck.Temp(arg.Type())
+
+		lhs = append(lhs, argvar)
+		rhs = append(rhs, arg)
+	}
+
+	asList := ir.NewAssignListStmt(pos, ir.OAS2, lhs, rhs)
+	init.Append(typecheck.Stmt(asList))
+
+	// Copy slice so edits in one location don't affect another.
+	argvars := append([]ir.Node(nil), lhs[1:]...)
+	call.Args = argvars
+
+	tmpnode := typecheck.Temp(concretetyp)
+	tmpok := typecheck.Temp(types.Types[types.TBOOL])
+
+	assert := ir.NewTypeAssertExpr(pos, recv, concretetyp)
+
+	assertAsList := ir.NewAssignListStmt(pos, ir.OAS2, []ir.Node{tmpnode, tmpok}, []ir.Node{typecheck.Expr(assert)})
+	init.Append(typecheck.Stmt(assertAsList))
+
+	concreteCallee := typecheck.Callee(ir.NewSelectorExpr(pos, ir.OXDOT, tmpnode, method))
+	// Copy slice so edits in one location don't affect another.
+	argvars = append([]ir.Node(nil), argvars...)
+	concreteCall := typecheck.Call(pos, concreteCallee, argvars, call.IsDDD)
+
+	var thenBlock, elseBlock ir.Nodes
+	if len(retvars) == 0 {
+		thenBlock.Append(concreteCall)
+		elseBlock.Append(call)
+	} else {
+		// Copy slice so edits in one location don't affect another.
+		thenRet := append([]ir.Node(nil), retvars...)
+		thenAsList := ir.NewAssignListStmt(pos, ir.OAS2, thenRet, []ir.Node{concreteCall})
+		thenBlock.Append(typecheck.Stmt(thenAsList))
+
+		elseRet := append([]ir.Node(nil), retvars...)
+		elseAsList := ir.NewAssignListStmt(pos, ir.OAS2, elseRet, []ir.Node{call})
+		elseBlock.Append(typecheck.Stmt(elseAsList))
+	}
+
+	cond := ir.NewIfStmt(pos, nil, nil, nil)
+	cond.SetInit(init)
+	cond.Cond = tmpok
+	cond.Body = thenBlock
+	cond.Else = elseBlock
+	cond.Likely = true
+
+	body := []ir.Node{typecheck.Stmt(cond)}
+
+	res := ir.NewInlinedCallExpr(pos, body, retvars)
+	res.SetType(call.Type())
+	res.SetTypecheck(1)
+
+	if base.Debug.PGODebug >= 3 {
+		fmt.Printf("PGO devirtualizing call to %+v. After: %+v\n", concretetyp, res)
+	}
+
+	return res
+}
+
+// methodRecvType returns the type containing method fn. Returns nil if fn
+// is not a method.
+func methodRecvType(fn *ir.Func) *types.Type {
+	recv := fn.Nname.Type().Recv()
+	if recv == nil {
+		return nil
+	}
+	return recv.Type
+}
+
+// interfaceCallRecvTypeAndMethod returns the type and the method of the interface
+// used in an interface call.
+func interfaceCallRecvTypeAndMethod(call *ir.CallExpr) (*types.Type, *types.Sym) {
+	if call.Op() != ir.OCALLINTER {
+		base.Fatalf("Call isn't OCALLINTER: %+v", call)
+	}
+
+	sel, ok := call.X.(*ir.SelectorExpr)
+	if !ok {
+		base.Fatalf("OCALLINTER doesn't contain SelectorExpr: %+v", call)
+	}
+
+	return sel.X.Type(), sel.Sel
+}
+
+// findHotConcreteCallee returns the *ir.Func of the hottest callee of an
+// indirect call, if available, and its edge weight.
+func findHotConcreteCallee(p *pgo.Profile, caller *ir.Func, call *ir.CallExpr) (*ir.Func, int64) {
+	callerName := ir.LinkFuncName(caller)
+	callerNode := p.WeightedCG.IRNodes[callerName]
+	callOffset := pgo.NodeLineOffset(call, caller)
+
+	inter, method := interfaceCallRecvTypeAndMethod(call)
+
+	var hottest *pgo.IREdge
+
+	// Returns true if e is hotter than hottest.
+	//
+	// Naively this is just e.Weight > hottest.Weight, but because OutEdges
+	// has arbitrary iteration order, we need to apply additional sort
+	// criteria when e.Weight == hottest.Weight to ensure we have stable
+	// selection.
+	hotter := func(e *pgo.IREdge) bool {
+		if hottest == nil {
+			return true
+		}
+		if e.Weight != hottest.Weight {
+			return e.Weight > hottest.Weight
+		}
+
+		// Now e.Weight == hottest.Weight, we must select on other
+		// criteria.
+
+		if hottest.Dst.AST == nil && e.Dst.AST != nil {
+			// Prefer the edge with IR available.
+			return true
+		}
+
+		// Arbitrary, but the callee names will always differ. Select
+		// the lexicographically first callee.
+		return e.Dst.Name() < hottest.Dst.Name()
+	}
+
+	for _, e := range callerNode.OutEdges {
+		if e.CallSiteOffset != callOffset {
+			continue
+		}
+
+		if !hotter(e) {
+			// TODO(prattmic): consider total caller weight? i.e.,
+			// if the hottest callee is only 10% of the weight,
+			// maybe don't devirtualize? Similarly, if this is call
+			// is globally very cold, there is not much value in
+			// devirtualizing.
+			if base.Debug.PGODebug >= 2 {
+				fmt.Printf("%v: edge %s:%d -> %s (weight %d): too cold (hottest %d)\n", ir.Line(call), callerName, callOffset, e.Dst.Name(), e.Weight, hottest.Weight)
+			}
+			continue
+		}
+
+		if e.Dst.AST == nil {
+			// Destination isn't visible from this package
+			// compilation.
+			//
+			// We must assume it implements the interface.
+			//
+			// We still record this as the hottest callee so far
+			// because we only want to return the #1 hottest
+			// callee. If we skip this then we'd return the #2
+			// hottest callee.
+			if base.Debug.PGODebug >= 2 {
+				fmt.Printf("%v: edge %s:%d -> %s (weight %d) (missing IR): hottest so far\n", ir.Line(call), callerName, callOffset, e.Dst.Name(), e.Weight)
+			}
+			hottest = e
+			continue
+		}
+
+		ctyp := methodRecvType(e.Dst.AST)
+		if ctyp == nil {
+			// Not a method.
+			// TODO(prattmic): Support non-interface indirect calls.
+			if base.Debug.PGODebug >= 2 {
+				fmt.Printf("%v: edge %s:%d -> %s (weight %d): callee not a method\n", ir.Line(call), callerName, callOffset, e.Dst.Name(), e.Weight)
+			}
+			continue
+		}
+
+		// If ctyp doesn't implement inter it is most likely from a
+		// different call on the same line
+		if !typecheck.Implements(ctyp, inter) {
+			// TODO(prattmic): this is overly strict. Consider if
+			// ctyp is a partial implementation of an interface
+			// that gets embedded in types that complete the
+			// interface. It would still be OK to devirtualize a
+			// call to this method.
+			//
+			// What we'd need to do is check that the function
+			// pointer in the itab matches the method we want,
+			// rather than doing a full type assertion.
+			if base.Debug.PGODebug >= 2 {
+				why := typecheck.ImplementsExplain(ctyp, inter)
+				fmt.Printf("%v: edge %s:%d -> %s (weight %d): %v doesn't implement %v (%s)\n", ir.Line(call), callerName, callOffset, e.Dst.Name(), e.Weight, ctyp, inter, why)
+			}
+			continue
+		}
+
+		// If the method name is different it is most likely from a
+		// different call on the same line
+		if !strings.HasSuffix(e.Dst.Name(), "."+method.Name) {
+			if base.Debug.PGODebug >= 2 {
+				fmt.Printf("%v: edge %s:%d -> %s (weight %d): callee is a different method\n", ir.Line(call), callerName, callOffset, e.Dst.Name(), e.Weight)
+			}
+			continue
+		}
+
+		if base.Debug.PGODebug >= 2 {
+			fmt.Printf("%v: edge %s:%d -> %s (weight %d): hottest so far\n", ir.Line(call), callerName, callOffset, e.Dst.Name(), e.Weight)
+		}
+		hottest = e
+	}
+
+	if hottest == nil {
+		if base.Debug.PGODebug >= 2 {
+			fmt.Printf("%v: call %s:%d: no hot callee\n", ir.Line(call), callerName, callOffset)
+		}
+		return nil, 0
+	}
+
+	if base.Debug.PGODebug >= 2 {
+		fmt.Printf("%v call %s:%d: hottest callee %s (weight %d)\n", ir.Line(call), callerName, callOffset, hottest.Dst.Name(), hottest.Weight)
+	}
+	return hottest.Dst.AST, hottest.Weight
+}
diff --git a/src/cmd/compile/internal/dwarfgen/dwarf.go b/src/cmd/compile/internal/dwarfgen/dwarf.go
index 90c331f..886250a 100644
--- a/src/cmd/compile/internal/dwarfgen/dwarf.go
+++ b/src/cmd/compile/internal/dwarfgen/dwarf.go
@@ -23,7 +23,7 @@
 	"cmd/internal/src"
 )
 
-func Info(fnsym *obj.LSym, infosym *obj.LSym, curfn interface{}) ([]dwarf.Scope, dwarf.InlCalls) {
+func Info(fnsym *obj.LSym, infosym *obj.LSym, curfn interface{}) (scopes []dwarf.Scope, inlcalls dwarf.InlCalls, startPos src.XPos) {
 	fn := curfn.(*ir.Func)
 
 	if fn.Nname != nil {
@@ -124,12 +124,11 @@
 		varScopes = append(varScopes, findScope(fn.Marks, pos))
 	}
 
-	scopes := assembleScopes(fnsym, fn, dwarfVars, varScopes)
-	var inlcalls dwarf.InlCalls
+	scopes = assembleScopes(fnsym, fn, dwarfVars, varScopes)
 	if base.Flag.GenDwarfInl > 0 {
 		inlcalls = assembleInlines(fnsym, dwarfVars)
 	}
-	return scopes, inlcalls
+	return scopes, inlcalls, fn.Pos()
 }
 
 func declPos(decl *ir.Name) src.XPos {
diff --git a/src/cmd/compile/internal/dwarfgen/dwinl.go b/src/cmd/compile/internal/dwarfgen/dwinl.go
index c785e06..99e1ce9 100644
--- a/src/cmd/compile/internal/dwarfgen/dwinl.go
+++ b/src/cmd/compile/internal/dwarfgen/dwinl.go
@@ -273,13 +273,13 @@
 	// Create new entry for this inline
 	inlinedFn := base.Ctxt.InlTree.InlinedFunction(inlIdx)
 	callXPos := base.Ctxt.InlTree.CallPos(inlIdx)
+	callPos := base.Ctxt.PosTable.Pos(callXPos)
+	callFileSym := base.Ctxt.Lookup(callPos.Base().SymFilename())
 	absFnSym := base.Ctxt.DwFixups.AbsFuncDwarfSym(inlinedFn)
-	pb := base.Ctxt.PosTable.Pos(callXPos).Base()
-	callFileSym := base.Ctxt.Lookup(pb.SymFilename())
 	ic := dwarf.InlCall{
 		InlIndex:  inlIdx,
 		CallFile:  callFileSym,
-		CallLine:  uint32(callXPos.Line()),
+		CallLine:  uint32(callPos.RelLine()),
 		AbsFunSym: absFnSym,
 		Root:      parCallIdx == -1,
 	}
diff --git a/src/cmd/compile/internal/dwarfgen/scope_test.go b/src/cmd/compile/internal/dwarfgen/scope_test.go
index 502b66f..ae4a87c 100644
--- a/src/cmd/compile/internal/dwarfgen/scope_test.go
+++ b/src/cmd/compile/internal/dwarfgen/scope_test.go
@@ -7,6 +7,7 @@
 import (
 	"debug/dwarf"
 	"fmt"
+	"internal/platform"
 	"internal/testenv"
 	"os"
 	"path/filepath"
@@ -215,17 +216,11 @@
 	testenv.MustHaveGoBuild(t)
 	t.Parallel()
 
-	if runtime.GOOS == "plan9" {
-		t.Skip("skipping on plan9; no DWARF symbol table in executables")
+	if !platform.ExecutableHasDWARF(runtime.GOOS, runtime.GOARCH) {
+		t.Skipf("skipping on %s/%s: no DWARF symbol table in executables", runtime.GOOS, runtime.GOARCH)
 	}
 
-	dir, err := os.MkdirTemp("", "TestScopeRanges")
-	if err != nil {
-		t.Fatalf("could not create directory: %v", err)
-	}
-	defer os.RemoveAll(dir)
-
-	src, f := gobuild(t, dir, false, testfile)
+	src, f := gobuild(t, t.TempDir(), false, testfile)
 	defer f.Close()
 
 	// the compiler uses forward slashes for paths even on windows
@@ -492,17 +487,11 @@
 	testenv.MustHaveGoRun(t)
 	t.Parallel()
 
-	if runtime.GOOS == "plan9" {
-		t.Skip("skipping on plan9; no DWARF symbol table in executables")
+	if !platform.ExecutableHasDWARF(runtime.GOOS, runtime.GOARCH) {
+		t.Skipf("skipping on %s/%s: no DWARF symbol table in executables", runtime.GOOS, runtime.GOARCH)
 	}
 
-	dir, err := os.MkdirTemp("", "TestEmptyDwarfRanges")
-	if err != nil {
-		t.Fatalf("could not create directory: %v", err)
-	}
-	defer os.RemoveAll(dir)
-
-	_, f := gobuild(t, dir, true, []testline{{line: "package main"}, {line: "func main(){ println(\"hello\") }"}})
+	_, f := gobuild(t, t.TempDir(), true, []testline{{line: "package main"}, {line: "func main(){ println(\"hello\") }"}})
 	defer f.Close()
 
 	dwarfData, err := f.DWARF()
diff --git a/src/cmd/compile/internal/escape/call.go b/src/cmd/compile/internal/escape/call.go
index 448702e..c69eca1 100644
--- a/src/cmd/compile/internal/escape/call.go
+++ b/src/cmd/compile/internal/escape/call.go
@@ -57,8 +57,7 @@
 
 	case ir.OCALLFUNC, ir.OCALLMETH, ir.OCALLINTER:
 		call := call.(*ir.CallExpr)
-		typecheck.FixVariadicCall(call)
-		typecheck.FixMethodCall(call)
+		typecheck.AssertFixedCall(call)
 
 		// Pick out the function callee, if statically known.
 		//
@@ -116,7 +115,7 @@
 		args := call.Args
 		if recv := fntype.Recv(); recv != nil {
 			if recvp == nil {
-				// Function call using method expression. Recevier argument is
+				// Function call using method expression. Receiver argument is
 				// at the front of the regular arguments list.
 				recvp = &args[0]
 				args = args[1:]
@@ -187,7 +186,7 @@
 		argument(e.discardHole(), &call.X)
 		argument(e.discardHole(), &call.Y)
 
-	case ir.ODELETE, ir.OPRINT, ir.OPRINTN, ir.ORECOVER:
+	case ir.ODELETE, ir.OMAX, ir.OMIN, ir.OPRINT, ir.OPRINTN, ir.ORECOVER:
 		call := call.(*ir.CallExpr)
 		fixRecoverCall(call)
 		for i := range call.Args {
@@ -195,7 +194,7 @@
 		}
 		argumentRType(&call.RType)
 
-	case ir.OLEN, ir.OCAP, ir.OREAL, ir.OIMAG, ir.OCLOSE:
+	case ir.OLEN, ir.OCAP, ir.OREAL, ir.OIMAG, ir.OCLOSE, ir.OCLEAR:
 		call := call.(*ir.UnaryExpr)
 		argument(e.discardHole(), &call.X)
 
@@ -260,7 +259,7 @@
 	// Create a new no-argument function that we'll hand off to defer.
 	fn := ir.NewClosureFunc(n.Pos(), true)
 	fn.SetWrapper(true)
-	fn.Nname.SetType(types.NewSignature(types.LocalPkg, nil, nil, nil, nil))
+	fn.Nname.SetType(types.NewSignature(nil, nil, nil))
 	fn.Body = []ir.Node{call}
 	if call, ok := call.(*ir.CallExpr); ok && call.Op() == ir.OCALLFUNC {
 		// If the callee is a named function, link to the original callee.
diff --git a/src/cmd/compile/internal/escape/desugar.go b/src/cmd/compile/internal/escape/desugar.go
index 6c21981..b2c4294 100644
--- a/src/cmd/compile/internal/escape/desugar.go
+++ b/src/cmd/compile/internal/escape/desugar.go
@@ -27,7 +27,7 @@
 	// FP is equal to caller's SP plus FixedFrameSize.
 	var fp ir.Node = ir.NewCallExpr(pos, ir.OGETCALLERSP, nil, nil)
 	if off := base.Ctxt.Arch.FixedFrameSize; off != 0 {
-		fp = ir.NewBinaryExpr(fp.Pos(), ir.OADD, fp, ir.NewInt(off))
+		fp = ir.NewBinaryExpr(fp.Pos(), ir.OADD, fp, ir.NewInt(base.Pos, off))
 	}
 	// TODO(mdempsky): Replace *int32 with unsafe.Pointer, without upsetting checkptr.
 	fp = ir.NewConvExpr(pos, ir.OCONVNOP, types.NewPtr(types.Types[types.TINT32]), fp)
diff --git a/src/cmd/compile/internal/escape/escape.go b/src/cmd/compile/internal/escape/escape.go
index 05fbe58..f17ac13 100644
--- a/src/cmd/compile/internal/escape/escape.go
+++ b/src/cmd/compile/internal/escape/escape.go
@@ -303,7 +303,7 @@
 		if loc.escapes {
 			if n.Op() == ir.ONAME {
 				if base.Flag.CompilingRuntime {
-					base.ErrorfAt(n.Pos(), "%v escapes to heap, not allowed in runtime", n)
+					base.ErrorfAt(n.Pos(), 0, "%v escapes to heap, not allowed in runtime", n)
 				}
 				if base.Flag.LowerM != 0 {
 					base.WarnfAt(n.Pos(), "moved to heap: %v", n)
diff --git a/src/cmd/compile/internal/escape/expr.go b/src/cmd/compile/internal/escape/expr.go
index fc56530..e5f590d 100644
--- a/src/cmd/compile/internal/escape/expr.go
+++ b/src/cmd/compile/internal/escape/expr.go
@@ -139,7 +139,7 @@
 		e.discard(n.X)
 
 	case ir.OCALLMETH, ir.OCALLFUNC, ir.OCALLINTER, ir.OINLCALL,
-		ir.OLEN, ir.OCAP, ir.OCOMPLEX, ir.OREAL, ir.OIMAG, ir.OAPPEND, ir.OCOPY, ir.ORECOVER,
+		ir.OLEN, ir.OCAP, ir.OMIN, ir.OMAX, ir.OCOMPLEX, ir.OREAL, ir.OIMAG, ir.OAPPEND, ir.OCOPY, ir.ORECOVER,
 		ir.OUNSAFEADD, ir.OUNSAFESLICE, ir.OUNSAFESTRING, ir.OUNSAFESTRINGDATA, ir.OUNSAFESLICEDATA:
 		e.call([]hole{k}, n)
 
diff --git a/src/cmd/compile/internal/escape/graph.go b/src/cmd/compile/internal/escape/graph.go
index cc3d078..fc18f77 100644
--- a/src/cmd/compile/internal/escape/graph.go
+++ b/src/cmd/compile/internal/escape/graph.go
@@ -218,7 +218,7 @@
 		base.Fatalf("e.curfn isn't set")
 	}
 	if n != nil && n.Type() != nil && n.Type().NotInHeap() {
-		base.ErrorfAt(n.Pos(), "%v is incomplete (or unallocatable); stack allocation disallowed", n.Type())
+		base.ErrorfAt(n.Pos(), 0, "%v is incomplete (or unallocatable); stack allocation disallowed", n.Type())
 	}
 
 	if n != nil && n.Op() == ir.ONAME {
diff --git a/src/cmd/compile/internal/escape/solve.go b/src/cmd/compile/internal/escape/solve.go
index 77d6b27..a2d3b6d 100644
--- a/src/cmd/compile/internal/escape/solve.go
+++ b/src/cmd/compile/internal/escape/solve.go
@@ -193,7 +193,7 @@
 			epos = srcloc.n.Pos()
 		}
 		var e_curfn *ir.Func // TODO(mdempsky): Fix.
-		explanation = append(explanation, logopt.NewLoggedOpt(epos, "escflow", "escape", ir.FuncName(e_curfn), flow))
+		explanation = append(explanation, logopt.NewLoggedOpt(epos, epos, "escflow", "escape", ir.FuncName(e_curfn), flow))
 	}
 
 	for note := notes; note != nil; note = note.next {
@@ -202,7 +202,8 @@
 		}
 		if logopt.Enabled() {
 			var e_curfn *ir.Func // TODO(mdempsky): Fix.
-			explanation = append(explanation, logopt.NewLoggedOpt(note.where.Pos(), "escflow", "escape", ir.FuncName(e_curfn),
+			notePos := note.where.Pos()
+			explanation = append(explanation, logopt.NewLoggedOpt(notePos, notePos, "escflow", "escape", ir.FuncName(e_curfn),
 				fmt.Sprintf("     from %v (%v)", note.where, note.why)))
 		}
 	}
diff --git a/src/cmd/compile/internal/escape/stmt.go b/src/cmd/compile/internal/escape/stmt.go
index 90d4f2d..5ae78e3 100644
--- a/src/cmd/compile/internal/escape/stmt.go
+++ b/src/cmd/compile/internal/escape/stmt.go
@@ -64,7 +64,7 @@
 			}
 			e.loopDepth++
 		default:
-			base.Fatalf("label missing tag")
+			base.Fatalf("label %v missing tag", n.Label)
 		}
 		delete(e.labels, n.Label)
 
@@ -80,6 +80,7 @@
 
 	case ir.OFOR:
 		n := n.(*ir.ForStmt)
+		base.Assert(!n.DistinctVars) // Should all be rewritten before escape analysis
 		e.loopDepth++
 		e.discard(n.Cond)
 		e.stmt(n.Post)
@@ -89,6 +90,7 @@
 	case ir.ORANGE:
 		// for Key, Value = range X { Body }
 		n := n.(*ir.RangeStmt)
+		base.Assert(!n.DistinctVars) // Should all be rewritten before escape analysis
 
 		// X is evaluated outside the loop.
 		tmp := e.newLoc(nil, false)
@@ -180,7 +182,7 @@
 			dsts[i] = res.Nname.(*ir.Name)
 		}
 		e.assignList(dsts, n.Results, "return", n)
-	case ir.OCALLFUNC, ir.OCALLMETH, ir.OCALLINTER, ir.OINLCALL, ir.OCLOSE, ir.OCOPY, ir.ODELETE, ir.OPANIC, ir.OPRINT, ir.OPRINTN, ir.ORECOVER:
+	case ir.OCALLFUNC, ir.OCALLMETH, ir.OCALLINTER, ir.OINLCALL, ir.OCLEAR, ir.OCLOSE, ir.OCOPY, ir.ODELETE, ir.OPANIC, ir.OPRINT, ir.OPRINTN, ir.ORECOVER:
 		e.call(nil, n)
 	case ir.OGO, ir.ODEFER:
 		n := n.(*ir.GoDeferStmt)
diff --git a/src/cmd/compile/internal/gc/compile.go b/src/cmd/compile/internal/gc/compile.go
index 6951d7e..4795297 100644
--- a/src/cmd/compile/internal/gc/compile.go
+++ b/src/cmd/compile/internal/gc/compile.go
@@ -15,6 +15,7 @@
 	"cmd/compile/internal/liveness"
 	"cmd/compile/internal/objw"
 	"cmd/compile/internal/ssagen"
+	"cmd/compile/internal/staticinit"
 	"cmd/compile/internal/typecheck"
 	"cmd/compile/internal/types"
 	"cmd/compile/internal/walk"
@@ -42,6 +43,10 @@
 		return // we'll get this as part of its enclosing function
 	}
 
+	if ssagen.CreateWasmImportWrapper(fn) {
+		return
+	}
+
 	if len(fn.Body) == 0 {
 		// Initialize ABI wrappers if necessary.
 		ir.InitLSym(fn, false)
@@ -84,6 +89,14 @@
 	// (e.g. in MarkTypeUsedInInterface).
 	ir.InitLSym(fn, true)
 
+	// If this function is a compiler-generated outlined global map
+	// initializer function, register its LSym for later processing.
+	if staticinit.MapInitToVar != nil {
+		if _, ok := staticinit.MapInitToVar[fn]; ok {
+			ssagen.RegisterMapInitLsym(fn.Linksym())
+		}
+	}
+
 	// Calculate parameter offsets.
 	types.CalcSize(fn.Type())
 
diff --git a/src/cmd/compile/internal/gc/main.go b/src/cmd/compile/internal/gc/main.go
index 4a37548..937d1c4 100644
--- a/src/cmd/compile/internal/gc/main.go
+++ b/src/cmd/compile/internal/gc/main.go
@@ -16,12 +16,14 @@
 	"cmd/compile/internal/inline"
 	"cmd/compile/internal/ir"
 	"cmd/compile/internal/logopt"
+	"cmd/compile/internal/loopvar"
 	"cmd/compile/internal/noder"
 	"cmd/compile/internal/pgo"
 	"cmd/compile/internal/pkginit"
 	"cmd/compile/internal/reflectdata"
 	"cmd/compile/internal/ssa"
 	"cmd/compile/internal/ssagen"
+	"cmd/compile/internal/staticinit"
 	"cmd/compile/internal/typecheck"
 	"cmd/compile/internal/types"
 	"cmd/internal/dwarf"
@@ -250,17 +252,28 @@
 	}
 	typecheck.IncrementalAddrtaken = true
 
-	if base.Debug.TypecheckInl != 0 {
-		// Typecheck imported function bodies if Debug.l > 1,
-		// otherwise lazily when used or re-exported.
-		typecheck.AllImportedBodies()
-	}
-
 	// Read profile file and build profile-graph and weighted-call-graph.
-	base.Timer.Start("fe", "pgoprofile")
+	base.Timer.Start("fe", "pgo-load-profile")
 	var profile *pgo.Profile
 	if base.Flag.PgoProfile != "" {
-		profile = pgo.New(base.Flag.PgoProfile)
+		var err error
+		profile, err = pgo.New(base.Flag.PgoProfile)
+		if err != nil {
+			log.Fatalf("%s: PGO error: %v", base.Flag.PgoProfile, err)
+		}
+	}
+
+	base.Timer.Start("fe", "pgo-devirtualization")
+	if profile != nil && base.Debug.PGODevirtualize > 0 {
+		// TODO(prattmic): No need to use bottom-up visit order. This
+		// is mirroring the PGO IRGraph visit order, which also need
+		// not be bottom-up.
+		ir.VisitFuncsBottomUp(typecheck.Target.Decls, func(list []*ir.Func, recursive bool) {
+			for _, fn := range list {
+				devirtualize.ProfileGuided(fn, profile)
+			}
+		})
+		ir.CurFunc = nil
 	}
 
 	// Inlining
@@ -270,10 +283,12 @@
 	}
 	noder.MakeWrappers(typecheck.Target) // must happen after inlining
 
-	// Devirtualize.
+	// Devirtualize and get variable capture right in for loops
+	var transformed []loopvar.VarAndLoop
 	for _, n := range typecheck.Target.Decls {
 		if n.Op() == ir.ODCLFUNC {
-			devirtualize.Func(n.(*ir.Func))
+			devirtualize.Static(n.(*ir.Func))
+			transformed = append(transformed, loopvar.ForCapture(n.(*ir.Func))...)
 		}
 	}
 	ir.CurFunc = nil
@@ -298,10 +313,7 @@
 	base.Timer.Start("fe", "escapes")
 	escape.Funcs(typecheck.Target.Decls)
 
-	// TODO(mdempsky): This is a hack. We need a proper, global work
-	// queue for scheduling function compilation so components don't
-	// need to adjust their behavior depending on when they're called.
-	reflectdata.AfterGlobalEscapeAnalysis = true
+	loopvar.LogTransformations(transformed)
 
 	// Collect information for go:nowritebarrierrec
 	// checking. This must happen before transforming closures during Walk
@@ -336,6 +348,11 @@
 		ssagen.NoWriteBarrierRecCheck()
 	}
 
+	// Add keep relocations for global maps.
+	if base.Debug.WrapGlobalMapCtl != 1 {
+		staticinit.AddKeepRelocations()
+	}
+
 	// Finalize DWARF inline routine DIEs, then explicitly turn off
 	// DWARF inlining gen so as to avoid problems with generated
 	// method wrappers.
diff --git a/src/cmd/compile/internal/gc/obj.go b/src/cmd/compile/internal/gc/obj.go
index 504072b..e895c45 100644
--- a/src/cmd/compile/internal/gc/obj.go
+++ b/src/cmd/compile/internal/gc/obj.go
@@ -195,7 +195,7 @@
 	}
 	types.CalcSize(n.Type())
 	ggloblnod(n)
-	if n.CoverageCounter() || n.CoverageAuxVar() {
+	if n.CoverageCounter() || n.CoverageAuxVar() || n.Linksym().Static() {
 		return
 	}
 	base.Ctxt.DwarfGlobal(base.Ctxt.Pkgpath, types.TypeSymName(n.Type()), n.Linksym())
diff --git a/src/cmd/compile/internal/importer/gcimporter.go b/src/cmd/compile/internal/importer/gcimporter.go
index 5d948f0..490cdf9 100644
--- a/src/cmd/compile/internal/importer/gcimporter.go
+++ b/src/cmd/compile/internal/importer/gcimporter.go
@@ -39,8 +39,9 @@
 		)
 		f, _ = exportMap.LoadOrStore(pkgDir, func() (string, bool) {
 			listOnce.Do(func() {
-				cmd := exec.Command("go", "list", "-export", "-f", "{{.Export}}", pkgDir)
+				cmd := exec.Command(filepath.Join(build.Default.GOROOT, "bin", "go"), "list", "-export", "-f", "{{.Export}}", pkgDir)
 				cmd.Dir = build.Default.GOROOT
+				cmd.Env = append(os.Environ(), "PWD="+cmd.Dir, "GOROOT="+build.Default.GOROOT)
 				var output []byte
 				output, err := cmd.Output()
 				if err != nil {
diff --git a/src/cmd/compile/internal/importer/gcimporter_test.go b/src/cmd/compile/internal/importer/gcimporter_test.go
index 387c7c0..96c5f69 100644
--- a/src/cmd/compile/internal/importer/gcimporter_test.go
+++ b/src/cmd/compile/internal/importer/gcimporter_test.go
@@ -9,7 +9,6 @@
 	"cmd/compile/internal/types2"
 	"fmt"
 	"go/build"
-	"internal/goexperiment"
 	"internal/testenv"
 	"os"
 	"os/exec"
@@ -75,12 +74,8 @@
 }
 
 func mktmpdir(t *testing.T) string {
-	tmpdir, err := os.MkdirTemp("", "gcimporter_test")
-	if err != nil {
-		t.Fatal("mktmpdir:", err)
-	}
+	tmpdir := t.TempDir()
 	if err := os.Mkdir(filepath.Join(tmpdir, "testdata"), 0700); err != nil {
-		os.RemoveAll(tmpdir)
 		t.Fatal("mktmpdir:", err)
 	}
 	return tmpdir
@@ -98,7 +93,7 @@
 		"exports.go":  {"go/ast", "go/token"},
 		"generics.go": nil,
 	}
-	if goexperiment.Unified {
+	if true /* was goexperiment.Unified */ {
 		// TODO(mdempsky): Fix test below to flatten the transitive
 		// Package.Imports graph. Unified IR is more precise about
 		// recreating the package import graph.
@@ -107,7 +102,6 @@
 
 	for testfile, wantImports := range testfiles {
 		tmpdir := mktmpdir(t)
-		defer os.RemoveAll(tmpdir)
 
 		importMap := map[string]string{}
 		for _, pkg := range wantImports {
@@ -150,7 +144,6 @@
 	}
 
 	tmpdir := mktmpdir(t)
-	defer os.RemoveAll(tmpdir)
 	corruptdir := filepath.Join(tmpdir, "testdata", "versions")
 	if err := os.Mkdir(corruptdir, 0700); err != nil {
 		t.Fatal(err)
@@ -343,8 +336,12 @@
 	// The unified IR importer always sets interface method receiver
 	// parameters to point to the Interface type, rather than the Named.
 	// See #49906.
+	//
+	// TODO(mdempsky): This is only true for the types2 importer. For
+	// the go/types importer, we duplicate the Interface and rewrite its
+	// receiver methods to match historical behavior.
 	var want types2.Type = named
-	if goexperiment.Unified {
+	if true /* was goexperiment.Unified */ {
 		want = iface
 	}
 
@@ -429,14 +426,7 @@
 		t.Skipf("gc-built packages not available (compiler = %s)", runtime.Compiler)
 	}
 
-	// On windows, we have to set the -D option for the compiler to avoid having a drive
-	// letter and an illegal ':' in the import path - just skip it (see also issue #3483).
-	if runtime.GOOS == "windows" {
-		t.Skip("avoid dealing with relative paths/drive letters on windows")
-	}
-
 	tmpdir := mktmpdir(t)
-	defer os.RemoveAll(tmpdir)
 	testoutdir := filepath.Join(tmpdir, "testdata")
 
 	// b.go needs to be compiled from the output directory so that the compiler can
@@ -520,14 +510,7 @@
 		t.Skipf("gc-built packages not available (compiler = %s)", runtime.Compiler)
 	}
 
-	// On windows, we have to set the -D option for the compiler to avoid having a drive
-	// letter and an illegal ':' in the import path - just skip it (see also issue #3483).
-	if runtime.GOOS == "windows" {
-		t.Skip("avoid dealing with relative paths/drive letters on windows")
-	}
-
 	tmpdir := mktmpdir(t)
-	defer os.RemoveAll(tmpdir)
 
 	compile(t, "testdata", "p.go", filepath.Join(tmpdir, "testdata"), nil)
 
@@ -559,12 +542,6 @@
 		t.Skipf("gc-built packages not available (compiler = %s)", runtime.Compiler)
 	}
 
-	// On windows, we have to set the -D option for the compiler to avoid having a drive
-	// letter and an illegal ':' in the import path - just skip it (see also issue #3483).
-	if runtime.GOOS == "windows" {
-		t.Skip("avoid dealing with relative paths/drive letters on windows")
-	}
-
 	compileAndImportPkg(t, "issue15920")
 }
 
@@ -576,12 +553,6 @@
 		t.Skipf("gc-built packages not available (compiler = %s)", runtime.Compiler)
 	}
 
-	// On windows, we have to set the -D option for the compiler to avoid having a drive
-	// letter and an illegal ':' in the import path - just skip it (see also issue #3483).
-	if runtime.GOOS == "windows" {
-		t.Skip("avoid dealing with relative paths/drive letters on windows")
-	}
-
 	// "./issue20046".V.M must exist
 	pkg := compileAndImportPkg(t, "issue20046")
 	obj := lookupObj(t, pkg.Scope(), "V")
@@ -597,12 +568,6 @@
 		t.Skipf("gc-built packages not available (compiler = %s)", runtime.Compiler)
 	}
 
-	// On windows, we have to set the -D option for the compiler to avoid having a drive
-	// letter and an illegal ':' in the import path - just skip it (see also issue #3483).
-	if runtime.GOOS == "windows" {
-		t.Skip("avoid dealing with relative paths/drive letters on windows")
-	}
-
 	compileAndImportPkg(t, "issue25301")
 }
 
@@ -614,12 +579,6 @@
 		t.Skipf("gc-built packages not available (compiler = %s)", runtime.Compiler)
 	}
 
-	// On windows, we have to set the -D option for the compiler to avoid having a drive
-	// letter and an illegal ':' in the import path - just skip it (see also issue #3483).
-	if runtime.GOOS == "windows" {
-		t.Skip("avoid dealing with relative paths/drive letters on windows")
-	}
-
 	compileAndImportPkg(t, "issue25596")
 }
 
@@ -635,7 +594,6 @@
 func compileAndImportPkg(t *testing.T, name string) *types2.Package {
 	t.Helper()
 	tmpdir := mktmpdir(t)
-	defer os.RemoveAll(tmpdir)
 	compile(t, "testdata", name+".go", filepath.Join(tmpdir, "testdata"), nil)
 	return importPkg(t, "./testdata/"+name, tmpdir)
 }
diff --git a/src/cmd/compile/internal/inline/inl.go b/src/cmd/compile/internal/inline/inl.go
index 84e61f3..4ae7fa9 100644
--- a/src/cmd/compile/internal/inline/inl.go
+++ b/src/cmd/compile/internal/inline/inl.go
@@ -31,7 +31,6 @@
 	"go/constant"
 	"sort"
 	"strconv"
-	"strings"
 
 	"cmd/compile/internal/base"
 	"cmd/compile/internal/ir"
@@ -40,7 +39,6 @@
 	"cmd/compile/internal/typecheck"
 	"cmd/compile/internal/types"
 	"cmd/internal/obj"
-	"cmd/internal/src"
 )
 
 // Inlining budget parameters, gathered in one place
@@ -65,10 +63,6 @@
 	// TODO(prattmic): Make this non-global.
 	candHotEdgeMap = make(map[pgo.CallSiteInfo]struct{})
 
-	// List of inlined call sites. CallSiteInfo.Callee is always nil.
-	// TODO(prattmic): Make this non-global.
-	inlinedCallSites = make(map[pgo.CallSiteInfo]struct{})
-
 	// Threshold in percentage for hot callsite inlining.
 	inlineHotCallSiteThresholdPercent float64
 
@@ -93,7 +87,7 @@
 	}
 	var hotCallsites []pgo.NodeMapKey
 	inlineHotCallSiteThresholdPercent, hotCallsites = hotNodesFromCDF(p)
-	if base.Debug.PGOInline > 0 {
+	if base.Debug.PGODebug > 0 {
 		fmt.Printf("hot-callsite-thres-from-CDF=%v\n", inlineHotCallSiteThresholdPercent)
 	}
 
@@ -107,13 +101,13 @@
 			candHotCalleeMap[callee] = struct{}{}
 		}
 		// mark hot call sites
-		if caller := p.WeightedCG.IRNodes[n.CallerName]; caller != nil {
+		if caller := p.WeightedCG.IRNodes[n.CallerName]; caller != nil && caller.AST != nil {
 			csi := pgo.CallSiteInfo{LineOffset: n.CallSiteOffset, Caller: caller.AST}
 			candHotEdgeMap[csi] = struct{}{}
 		}
 	}
 
-	if base.Debug.PGOInline >= 2 {
+	if base.Debug.PGODebug >= 3 {
 		fmt.Printf("hot-cg before inline in dot format:")
 		p.PrintWeightedCallGraphDOT(inlineHotCallSiteThresholdPercent)
 	}
@@ -160,26 +154,18 @@
 	return 0, nodes
 }
 
-// pgoInlineEpilogue updates IRGraph after inlining.
-func pgoInlineEpilogue(p *pgo.Profile, decls []ir.Node) {
-	if base.Debug.PGOInline >= 2 {
-		ir.VisitFuncsBottomUp(decls, func(list []*ir.Func, recursive bool) {
-			for _, f := range list {
-				name := ir.PkgFuncName(f)
-				if n, ok := p.WeightedCG.IRNodes[name]; ok {
-					p.RedirectEdges(n, inlinedCallSites)
-				}
-			}
-		})
-		// Print the call-graph after inlining. This is a debugging feature.
-		fmt.Printf("hot-cg after inline in dot:")
-		p.PrintWeightedCallGraphDOT(inlineHotCallSiteThresholdPercent)
-	}
-}
-
 // InlinePackage finds functions that can be inlined and clones them before walk expands them.
 func InlinePackage(p *pgo.Profile) {
+	if base.Debug.PGOInline == 0 {
+		p = nil
+	}
+
 	InlineDecls(p, typecheck.Target.Decls, true)
+
+	// Perform a garbage collection of hidden closures functions that
+	// are no longer reachable from top-level functions following
+	// inlining. See #59404 and #59638 for more context.
+	garbageCollectUnreferencedHiddenClosures()
 }
 
 // InlineDecls applies inlining to the given batch of declarations.
@@ -188,27 +174,90 @@
 		pgoInlinePrologue(p, decls)
 	}
 
+	doCanInline := func(n *ir.Func, recursive bool, numfns int) {
+		if !recursive || numfns > 1 {
+			// We allow inlining if there is no
+			// recursion, or the recursion cycle is
+			// across more than one function.
+			CanInline(n, p)
+		} else {
+			if base.Flag.LowerM > 1 && n.OClosure == nil {
+				fmt.Printf("%v: cannot inline %v: recursive\n", ir.Line(n), n.Nname)
+			}
+		}
+	}
+
 	ir.VisitFuncsBottomUp(decls, func(list []*ir.Func, recursive bool) {
 		numfns := numNonClosures(list)
+		// We visit functions within an SCC in fairly arbitrary order,
+		// so by computing inlinability for all functions in the SCC
+		// before performing any inlining, the results are less
+		// sensitive to the order within the SCC (see #58905 for an
+		// example).
+
+		// First compute inlinability for all functions in the SCC ...
 		for _, n := range list {
-			if !recursive || numfns > 1 {
-				// We allow inlining if there is no
-				// recursion, or the recursion cycle is
-				// across more than one function.
-				CanInline(n, p)
-			} else {
-				if base.Flag.LowerM > 1 {
-					fmt.Printf("%v: cannot inline %v: recursive\n", ir.Line(n), n.Nname)
-				}
-			}
-			if doInline {
+			doCanInline(n, recursive, numfns)
+		}
+		// ... then make a second pass to do inlining of calls.
+		if doInline {
+			for _, n := range list {
 				InlineCalls(n, p)
 			}
 		}
 	})
+}
 
-	if p != nil {
-		pgoInlineEpilogue(p, decls)
+// garbageCollectUnreferencedHiddenClosures makes a pass over all the
+// top-level (non-hidden-closure) functions looking for nested closure
+// functions that are reachable, then sweeps through the Target.Decls
+// list and marks any non-reachable hidden closure function as dead.
+// See issues #59404 and #59638 for more context.
+func garbageCollectUnreferencedHiddenClosures() {
+
+	liveFuncs := make(map[*ir.Func]bool)
+
+	var markLiveFuncs func(fn *ir.Func)
+	markLiveFuncs = func(fn *ir.Func) {
+		if liveFuncs[fn] {
+			return
+		}
+		liveFuncs[fn] = true
+		ir.Visit(fn, func(n ir.Node) {
+			if clo, ok := n.(*ir.ClosureExpr); ok {
+				markLiveFuncs(clo.Func)
+			}
+		})
+	}
+
+	for i := 0; i < len(typecheck.Target.Decls); i++ {
+		if fn, ok := typecheck.Target.Decls[i].(*ir.Func); ok {
+			if fn.IsHiddenClosure() {
+				continue
+			}
+			markLiveFuncs(fn)
+		}
+	}
+
+	for i := 0; i < len(typecheck.Target.Decls); i++ {
+		if fn, ok := typecheck.Target.Decls[i].(*ir.Func); ok {
+			if !fn.IsHiddenClosure() {
+				continue
+			}
+			if fn.IsDeadcodeClosure() {
+				continue
+			}
+			if liveFuncs[fn] {
+				continue
+			}
+			fn.SetIsDeadcodeClosure(true)
+			if base.Flag.LowerM > 2 {
+				fmt.Printf("%v: unreferenced closure %v marked as dead\n", ir.Line(fn), fn)
+			}
+			if fn.Inl != nil && fn.LSym == nil {
+				ir.InitLSym(fn, true)
+			}
+		}
 	}
 }
 
@@ -234,64 +283,10 @@
 		}()
 	}
 
-	// If marked "go:noinline", don't inline
-	if fn.Pragma&ir.Noinline != 0 {
-		reason = "marked go:noinline"
+	reason = InlineImpossible(fn)
+	if reason != "" {
 		return
 	}
-
-	// If marked "go:norace" and -race compilation, don't inline.
-	if base.Flag.Race && fn.Pragma&ir.Norace != 0 {
-		reason = "marked go:norace with -race compilation"
-		return
-	}
-
-	// If marked "go:nocheckptr" and -d checkptr compilation, don't inline.
-	if base.Debug.Checkptr != 0 && fn.Pragma&ir.NoCheckPtr != 0 {
-		reason = "marked go:nocheckptr"
-		return
-	}
-
-	// If marked "go:cgo_unsafe_args", don't inline, since the
-	// function makes assumptions about its argument frame layout.
-	if fn.Pragma&ir.CgoUnsafeArgs != 0 {
-		reason = "marked go:cgo_unsafe_args"
-		return
-	}
-
-	// If marked as "go:uintptrkeepalive", don't inline, since the
-	// keep alive information is lost during inlining.
-	//
-	// TODO(prattmic): This is handled on calls during escape analysis,
-	// which is after inlining. Move prior to inlining so the keep-alive is
-	// maintained after inlining.
-	if fn.Pragma&ir.UintptrKeepAlive != 0 {
-		reason = "marked as having a keep-alive uintptr argument"
-		return
-	}
-
-	// If marked as "go:uintptrescapes", don't inline, since the
-	// escape information is lost during inlining.
-	if fn.Pragma&ir.UintptrEscapes != 0 {
-		reason = "marked as having an escaping uintptr argument"
-		return
-	}
-
-	// The nowritebarrierrec checker currently works at function
-	// granularity, so inlining yeswritebarrierrec functions can
-	// confuse it (#22342). As a workaround, disallow inlining
-	// them for now.
-	if fn.Pragma&ir.Yeswritebarrierrec != 0 {
-		reason = "marked go:yeswritebarrierrec"
-		return
-	}
-
-	// If fn has no body (is defined outside of Go), cannot inline it.
-	if len(fn.Body) == 0 {
-		reason = "no function body"
-		return
-	}
-
 	if fn.Typecheck() == 0 {
 		base.Fatalf("CanInline on non-typechecked function %v", fn)
 	}
@@ -310,10 +305,10 @@
 	// Update the budget for profile-guided inlining.
 	budget := int32(inlineMaxBudget)
 	if profile != nil {
-		if n, ok := profile.WeightedCG.IRNodes[ir.PkgFuncName(fn)]; ok {
+		if n, ok := profile.WeightedCG.IRNodes[ir.LinkFuncName(fn)]; ok {
 			if _, ok := candHotCalleeMap[n]; ok {
 				budget = int32(inlineHotMaxBudget)
-				if base.Debug.PGOInline > 0 {
+				if base.Debug.PGODebug > 0 {
 					fmt.Printf("hot-node enabled increased budget=%v for func=%v\n", budget, ir.PkgFuncName(fn))
 				}
 			}
@@ -359,6 +354,83 @@
 	}
 }
 
+// InlineImpossible returns a non-empty reason string if fn is impossible to
+// inline regardless of cost or contents.
+func InlineImpossible(fn *ir.Func) string {
+	var reason string // reason, if any, that the function can not be inlined.
+	if fn.Nname == nil {
+		reason = "no name"
+		return reason
+	}
+
+	// If marked "go:noinline", don't inline.
+	if fn.Pragma&ir.Noinline != 0 {
+		reason = "marked go:noinline"
+		return reason
+	}
+
+	// If marked "go:norace" and -race compilation, don't inline.
+	if base.Flag.Race && fn.Pragma&ir.Norace != 0 {
+		reason = "marked go:norace with -race compilation"
+		return reason
+	}
+
+	// If marked "go:nocheckptr" and -d checkptr compilation, don't inline.
+	if base.Debug.Checkptr != 0 && fn.Pragma&ir.NoCheckPtr != 0 {
+		reason = "marked go:nocheckptr"
+		return reason
+	}
+
+	// If marked "go:cgo_unsafe_args", don't inline, since the function
+	// makes assumptions about its argument frame layout.
+	if fn.Pragma&ir.CgoUnsafeArgs != 0 {
+		reason = "marked go:cgo_unsafe_args"
+		return reason
+	}
+
+	// If marked as "go:uintptrkeepalive", don't inline, since the keep
+	// alive information is lost during inlining.
+	//
+	// TODO(prattmic): This is handled on calls during escape analysis,
+	// which is after inlining. Move prior to inlining so the keep-alive is
+	// maintained after inlining.
+	if fn.Pragma&ir.UintptrKeepAlive != 0 {
+		reason = "marked as having a keep-alive uintptr argument"
+		return reason
+	}
+
+	// If marked as "go:uintptrescapes", don't inline, since the escape
+	// information is lost during inlining.
+	if fn.Pragma&ir.UintptrEscapes != 0 {
+		reason = "marked as having an escaping uintptr argument"
+		return reason
+	}
+
+	// The nowritebarrierrec checker currently works at function
+	// granularity, so inlining yeswritebarrierrec functions can confuse it
+	// (#22342). As a workaround, disallow inlining them for now.
+	if fn.Pragma&ir.Yeswritebarrierrec != 0 {
+		reason = "marked go:yeswritebarrierrec"
+		return reason
+	}
+
+	// If a local function has no fn.Body (is defined outside of Go), cannot inline it.
+	// Imported functions don't have fn.Body but might have inline body in fn.Inl.
+	if len(fn.Body) == 0 && !typecheck.HaveInlineBody(fn) {
+		reason = "no function body"
+		return reason
+	}
+
+	// If fn is synthetic hash or eq function, cannot inline it.
+	// The function is not generated in Unified IR frontend at this moment.
+	if ir.IsEqOrHashFunc(fn) {
+		reason = "type eq/hash function"
+		return reason
+	}
+
+	return ""
+}
+
 // canDelayResults reports whether inlined calls to fn can delay
 // declaring the result parameter until the "return" statement.
 func canDelayResults(fn *ir.Func) bool {
@@ -417,6 +489,8 @@
 	return false
 }
 
+// doNode visits n and its children, updates the state in v, and returns true if
+// n makes the current function too hairy for inlining.
 func (v *hairyVisitor) doNode(n ir.Node) bool {
 	if n == nil {
 		return false
@@ -429,6 +503,7 @@
 		// because getcaller{pc,sp} expect a pointer to the caller's first argument.
 		//
 		// runtime.throw is a "cheap call" like panic in normal code.
+		var cheap bool
 		if n.X.Op() == ir.ONAME {
 			name := n.X.(*ir.Name)
 			if name.Class == ir.PFUNC && types.IsRuntimePkg(name.Sym().Pkg) {
@@ -442,6 +517,14 @@
 					break
 				}
 			}
+			// Special case for reflect.noescpae. It does just type
+			// conversions to appease the escape analysis, and doesn't
+			// generate code.
+			if name.Class == ir.PFUNC && types.IsReflectPkg(name.Sym().Pkg) {
+				if name.Sym().Name == "noescape" {
+					cheap = true
+				}
+			}
 			// Special case for coverage counter updates; although
 			// these correspond to real operations, we treat them as
 			// zero cost for the moment. This is due to the existence
@@ -460,7 +543,6 @@
 			if meth := ir.MethodExprName(n.X); meth != nil {
 				if fn := meth.Func; fn != nil {
 					s := fn.Sym()
-					var cheap bool
 					if types.IsRuntimePkg(s.Pkg) && s.Name == "heapBits.nextArena" {
 						// Special case: explicitly allow mid-stack inlining of
 						// runtime.heapBits.next even though it calls slow-path
@@ -482,12 +564,12 @@
 							cheap = true
 						}
 					}
-					if cheap {
-						break // treat like any other node, that is, cost of 1
-					}
 				}
 			}
 		}
+		if cheap {
+			break // treat like any other node, that is, cost of 1
+		}
 
 		// Determine if the callee edge is for an inlinable hot callee or not.
 		if v.profile != nil && v.curFunc != nil {
@@ -495,7 +577,7 @@
 				lineOffset := pgo.NodeLineOffset(n, fn)
 				csi := pgo.CallSiteInfo{LineOffset: lineOffset, Caller: v.curFunc}
 				if _, o := candHotEdgeMap[csi]; o {
-					if base.Debug.PGOInline > 0 {
+					if base.Debug.PGODebug > 0 {
 						fmt.Printf("hot-callsite identified at line=%v for func=%v\n", ir.Line(n), ir.PkgFuncName(v.curFunc))
 					}
 				}
@@ -548,13 +630,10 @@
 		// TODO(danscales): Maybe make budget proportional to number of closure
 		// variables, e.g.:
 		//v.budget -= int32(len(n.(*ir.ClosureExpr).Func.ClosureVars) * 3)
+		// TODO(austin): However, if we're able to inline this closure into
+		// v.curFunc, then we actually pay nothing for the closure captures. We
+		// should try to account for that if we're going to account for captures.
 		v.budget -= 15
-		// Scan body of closure (which DoChildren doesn't automatically
-		// do) to check for disallowed ops in the body and include the
-		// body in the budget.
-		if doList(n.(*ir.ClosureExpr).Func.Body, v.do) {
-			return true
-		}
 
 	case ir.OGO,
 		ir.ODEFER,
@@ -591,7 +670,7 @@
 		// This doesn't produce code, but the children might.
 		v.budget++ // undo default cost
 
-	case ir.ODCLCONST, ir.OFALL:
+	case ir.ODCLCONST, ir.OFALL, ir.OTYPE:
 		// These nodes don't produce code; omit from inlining budget.
 		return false
 
@@ -645,15 +724,15 @@
 		// minimize impact to the existing inlining heuristics (in
 		// particular, to avoid breaking the existing inlinability regress
 		// tests), we need to compensate for this here.
-		if base.Debug.Unified != 0 {
-			if init := n.Rhs[0].Init(); len(init) == 1 {
-				if _, ok := init[0].(*ir.AssignListStmt); ok {
-					// 4 for each value, because each temporary variable now
-					// appears 3 times (DCL, LHS, RHS), plus an extra DCL node.
-					//
-					// 1 for the extra "tmp1, tmp2 = f()" assignment statement.
-					v.budget += 4*int32(len(n.Lhs)) + 1
-				}
+		//
+		// See also identical logic in isBigFunc.
+		if init := n.Rhs[0].Init(); len(init) == 1 {
+			if _, ok := init[0].(*ir.AssignListStmt); ok {
+				// 4 for each value, because each temporary variable now
+				// appears 3 times (DCL, LHS, RHS), plus an extra DCL node.
+				//
+				// 1 for the extra "tmp1, tmp2 = f()" assignment statement.
+				v.budget += 4*int32(len(n.Lhs)) + 1
 			}
 		}
 
@@ -688,6 +767,16 @@
 func isBigFunc(fn *ir.Func) bool {
 	budget := inlineBigFunctionNodes
 	return ir.Any(fn, func(n ir.Node) bool {
+		// See logic in hairyVisitor.doNode, explaining unified IR's
+		// handling of "a, b = f()" assignments.
+		if n, ok := n.(*ir.AssignListStmt); ok && n.Op() == ir.OAS2 {
+			if init := n.Rhs[0].Init(); len(init) == 1 {
+				if _, ok := init[0].(*ir.AssignListStmt); ok {
+					budget += 4*len(n.Lhs) + 1
+				}
+			}
+		}
+
 		budget--
 		return budget <= 0
 	})
@@ -740,14 +829,14 @@
 func InlineCalls(fn *ir.Func, profile *pgo.Profile) {
 	savefn := ir.CurFunc
 	ir.CurFunc = fn
-	maxCost := int32(inlineMaxBudget)
-	if isBigFunc(fn) {
-		maxCost = inlineBigFunctionMaxCost
+	bigCaller := isBigFunc(fn)
+	if bigCaller && base.Flag.LowerM > 1 {
+		fmt.Printf("%v: function %v considered 'big'; reducing max cost of inlinees\n", ir.Line(fn), fn)
 	}
 	var inlCalls []*ir.InlinedCallExpr
 	var edit func(ir.Node) ir.Node
 	edit = func(n ir.Node) ir.Node {
-		return inlnode(n, maxCost, &inlCalls, edit, profile)
+		return inlnode(n, bigCaller, &inlCalls, edit, profile)
 	}
 	ir.EditChildren(fn, edit)
 
@@ -778,7 +867,7 @@
 // The result of inlnode MUST be assigned back to n, e.g.
 //
 //	n.Left = inlnode(n.Left)
-func inlnode(n ir.Node, maxCost int32, inlCalls *[]*ir.InlinedCallExpr, edit func(ir.Node) ir.Node, profile *pgo.Profile) ir.Node {
+func inlnode(n ir.Node, bigCaller bool, inlCalls *[]*ir.InlinedCallExpr, edit func(ir.Node) ir.Node, profile *pgo.Profile) ir.Node {
 	if n == nil {
 		return n
 	}
@@ -840,7 +929,7 @@
 			break
 		}
 		if fn := inlCallee(call.X, profile); fn != nil && typecheck.HaveInlineBody(fn) {
-			n = mkinlcall(call, fn, maxCost, inlCalls, edit)
+			n = mkinlcall(call, fn, bigCaller, inlCalls)
 		}
 	}
 
@@ -878,23 +967,6 @@
 	return nil
 }
 
-func inlParam(t *types.Field, as ir.InitNode, inlvars map[*ir.Name]*ir.Name) ir.Node {
-	if t.Nname == nil {
-		return ir.BlankNode
-	}
-	n := t.Nname.(*ir.Name)
-	if ir.IsBlank(n) {
-		return ir.BlankNode
-	}
-	inlvar := inlvars[n]
-	if inlvar == nil {
-		base.Fatalf("missing inlvar for %v", n)
-	}
-	as.PtrInit().Append(ir.NewDecl(base.Pos, ir.ODCL, inlvar))
-	inlvar.Name().Defn = as
-	return inlvar
-}
-
 var inlgen int
 
 // SSADumpInline gives the SSA back end a chance to dump the function
@@ -903,7 +975,58 @@
 
 // InlineCall allows the inliner implementation to be overridden.
 // If it returns nil, the function will not be inlined.
-var InlineCall = oldInlineCall
+var InlineCall = func(call *ir.CallExpr, fn *ir.Func, inlIndex int) *ir.InlinedCallExpr {
+	base.Fatalf("inline.InlineCall not overridden")
+	panic("unreachable")
+}
+
+// inlineCostOK returns true if call n from caller to callee is cheap enough to
+// inline. bigCaller indicates that caller is a big function.
+//
+// If inlineCostOK returns false, it also returns the max cost that the callee
+// exceeded.
+func inlineCostOK(n *ir.CallExpr, caller, callee *ir.Func, bigCaller bool) (bool, int32) {
+	maxCost := int32(inlineMaxBudget)
+	if bigCaller {
+		// We use this to restrict inlining into very big functions.
+		// See issue 26546 and 17566.
+		maxCost = inlineBigFunctionMaxCost
+	}
+
+	if callee.Inl.Cost <= maxCost {
+		// Simple case. Function is already cheap enough.
+		return true, 0
+	}
+
+	// We'll also allow inlining of hot functions below inlineHotMaxBudget,
+	// but only in small functions.
+
+	lineOffset := pgo.NodeLineOffset(n, caller)
+	csi := pgo.CallSiteInfo{LineOffset: lineOffset, Caller: caller}
+	if _, ok := candHotEdgeMap[csi]; !ok {
+		// Cold
+		return false, maxCost
+	}
+
+	// Hot
+
+	if bigCaller {
+		if base.Debug.PGODebug > 0 {
+			fmt.Printf("hot-big check disallows inlining for call %s (cost %d) at %v in big function %s\n", ir.PkgFuncName(callee), callee.Inl.Cost, ir.Line(n), ir.PkgFuncName(caller))
+		}
+		return false, maxCost
+	}
+
+	if callee.Inl.Cost > inlineHotMaxBudget {
+		return false, inlineHotMaxBudget
+	}
+
+	if base.Debug.PGODebug > 0 {
+		fmt.Printf("hot-budget check allows inlining for call %s (cost %d) at %v in function %s\n", ir.PkgFuncName(callee), callee.Inl.Cost, ir.Line(n), ir.PkgFuncName(caller))
+	}
+
+	return true, 0
+}
 
 // If n is a OCALLFUNC node, and fn is an ONAME node for a
 // function with an inlinable body, return an OINLCALL node that can replace n.
@@ -913,7 +1036,7 @@
 // The result of mkinlcall MUST be assigned back to n, e.g.
 //
 //	n.Left = mkinlcall(n.Left, fn, isddd)
-func mkinlcall(n *ir.CallExpr, fn *ir.Func, maxCost int32, inlCalls *[]*ir.InlinedCallExpr, edit func(ir.Node) ir.Node) ir.Node {
+func mkinlcall(n *ir.CallExpr, fn *ir.Func, bigCaller bool, inlCalls *[]*ir.InlinedCallExpr) ir.Node {
 	if fn.Inl == nil {
 		if logopt.Enabled() {
 			logopt.LogOpt(n.Pos(), "cannotInlineCall", "inline", ir.FuncName(ir.CurFunc),
@@ -921,30 +1044,13 @@
 		}
 		return n
 	}
-	if fn.Inl.Cost > maxCost {
-		// If the callsite is hot and it is under the inlineHotMaxBudget budget, then try to inline it, or else bail.
-		lineOffset := pgo.NodeLineOffset(n, ir.CurFunc)
-		csi := pgo.CallSiteInfo{LineOffset: lineOffset, Caller: ir.CurFunc}
-		if _, ok := candHotEdgeMap[csi]; ok {
-			if fn.Inl.Cost > inlineHotMaxBudget {
-				if logopt.Enabled() {
-					logopt.LogOpt(n.Pos(), "cannotInlineCall", "inline", ir.FuncName(ir.CurFunc),
-						fmt.Sprintf("cost %d of %s exceeds max large caller cost %d", fn.Inl.Cost, ir.PkgFuncName(fn), inlineHotMaxBudget))
-				}
-				return n
-			}
-			if base.Debug.PGOInline > 0 {
-				fmt.Printf("hot-budget check allows inlining for call %s at %v\n", ir.PkgFuncName(fn), ir.Line(n))
-			}
-		} else {
-			// The inlined function body is too big. Typically we use this check to restrict
-			// inlining into very big functions.  See issue 26546 and 17566.
-			if logopt.Enabled() {
-				logopt.LogOpt(n.Pos(), "cannotInlineCall", "inline", ir.FuncName(ir.CurFunc),
-					fmt.Sprintf("cost %d of %s exceeds max large caller cost %d", fn.Inl.Cost, ir.PkgFuncName(fn), maxCost))
-			}
-			return n
+
+	if ok, maxCost := inlineCostOK(n, ir.CurFunc, fn, bigCaller); !ok {
+		if logopt.Enabled() {
+			logopt.LogOpt(n.Pos(), "cannotInlineCall", "inline", ir.FuncName(ir.CurFunc),
+				fmt.Sprintf("cost %d of %s exceeds max caller cost %d", fn.Inl.Cost, ir.PkgFuncName(fn), maxCost))
 		}
+		return n
 	}
 
 	if fn == ir.CurFunc {
@@ -955,50 +1061,7 @@
 		return n
 	}
 
-	// The non-unified frontend has issues with inlining and shape parameters.
-	if base.Debug.Unified == 0 {
-		// Don't inline a function fn that has no shape parameters, but is passed at
-		// least one shape arg. This means we must be inlining a non-generic function
-		// fn that was passed into a generic function, and can be called with a shape
-		// arg because it matches an appropriate type parameters. But fn may include
-		// an interface conversion (that may be applied to a shape arg) that was not
-		// apparent when we first created the instantiation of the generic function.
-		// We can't handle this if we actually do the inlining, since we want to know
-		// all interface conversions immediately after stenciling. So, we avoid
-		// inlining in this case, see issue #49309. (1)
-		//
-		// See discussion on go.dev/cl/406475 for more background.
-		if !fn.Type().Params().HasShape() {
-			for _, arg := range n.Args {
-				if arg.Type().HasShape() {
-					if logopt.Enabled() {
-						logopt.LogOpt(n.Pos(), "cannotInlineCall", "inline", ir.FuncName(ir.CurFunc),
-							fmt.Sprintf("inlining function %v has no-shape params with shape args", ir.FuncName(fn)))
-					}
-					return n
-				}
-			}
-		} else {
-			// Don't inline a function fn that has shape parameters, but is passed no shape arg.
-			// See comments (1) above, and issue #51909.
-			inlineable := len(n.Args) == 0 // Function has shape in type, with no arguments can always be inlined.
-			for _, arg := range n.Args {
-				if arg.Type().HasShape() {
-					inlineable = true
-					break
-				}
-			}
-			if !inlineable {
-				if logopt.Enabled() {
-					logopt.LogOpt(n.Pos(), "cannotInlineCall", "inline", ir.FuncName(ir.CurFunc),
-						fmt.Sprintf("inlining function %v has shape params with no-shape args", ir.FuncName(fn)))
-				}
-				return n
-			}
-		}
-	}
-
-	if base.Flag.Cfg.Instrumenting && types.IsRuntimePkg(fn.Sym().Pkg) {
+	if base.Flag.Cfg.Instrumenting && types.IsNoInstrumentPkg(fn.Sym().Pkg) {
 		// Runtime package must not be instrumented.
 		// Instrument skips runtime package. However, some runtime code can be
 		// inlined into other packages and instrumented there. To avoid this,
@@ -1007,6 +1070,9 @@
 		// which lead to false race reports on m contents.
 		return n
 	}
+	if base.Flag.Race && types.IsNoRacePkg(fn.Sym().Pkg) {
+		return n
+	}
 
 	parent := base.Ctxt.PosTable.Pos(n.Pos()).Base().InliningIndex()
 	sym := fn.Linksym()
@@ -1027,9 +1093,9 @@
 		}
 	}
 
-	typecheck.FixVariadicCall(n)
+	typecheck.AssertFixedCall(n)
 
-	inlIndex := base.Ctxt.InlTree.Add(parent, n.Pos(), sym)
+	inlIndex := base.Ctxt.InlTree.Add(parent, n.Pos(), sym, ir.FuncName(fn))
 
 	closureInitLSym := func(n *ir.CallExpr, fn *ir.Func) {
 		// The linker needs FuncInfo metadata for all inlined
@@ -1087,13 +1153,6 @@
 		fmt.Printf("%v: Before inlining: %+v\n", ir.Line(n), n)
 	}
 
-	if base.Debug.PGOInline > 0 {
-		csi := pgo.CallSiteInfo{LineOffset: pgo.NodeLineOffset(n, fn), Caller: ir.CurFunc}
-		if _, ok := inlinedCallSites[csi]; !ok {
-			inlinedCallSites[csi] = struct{}{}
-		}
-	}
-
 	res := InlineCall(n, fn, inlIndex)
 
 	if res == nil {
@@ -1133,580 +1192,6 @@
 	}
 }
 
-// oldInlineCall creates an InlinedCallExpr to replace the given call
-// expression. fn is the callee function to be inlined. inlIndex is
-// the inlining tree position index, for use with src.NewInliningBase
-// when rewriting positions.
-func oldInlineCall(call *ir.CallExpr, fn *ir.Func, inlIndex int) *ir.InlinedCallExpr {
-	if base.Debug.TypecheckInl == 0 {
-		typecheck.ImportedBody(fn)
-	}
-
-	SSADumpInline(fn)
-
-	ninit := call.Init()
-
-	// For normal function calls, the function callee expression
-	// may contain side effects. Make sure to preserve these,
-	// if necessary (#42703).
-	if call.Op() == ir.OCALLFUNC {
-		CalleeEffects(&ninit, call.X)
-	}
-
-	// Make temp names to use instead of the originals.
-	inlvars := make(map[*ir.Name]*ir.Name)
-
-	// record formals/locals for later post-processing
-	var inlfvars []*ir.Name
-
-	for _, ln := range fn.Inl.Dcl {
-		if ln.Op() != ir.ONAME {
-			continue
-		}
-		if ln.Class == ir.PPARAMOUT { // return values handled below.
-			continue
-		}
-		inlf := typecheck.Expr(inlvar(ln)).(*ir.Name)
-		inlvars[ln] = inlf
-		if base.Flag.GenDwarfInl > 0 {
-			if ln.Class == ir.PPARAM {
-				inlf.Name().SetInlFormal(true)
-			} else {
-				inlf.Name().SetInlLocal(true)
-			}
-			inlf.SetPos(ln.Pos())
-			inlfvars = append(inlfvars, inlf)
-		}
-	}
-
-	// We can delay declaring+initializing result parameters if:
-	// temporaries for return values.
-	var retvars []ir.Node
-	for i, t := range fn.Type().Results().Fields().Slice() {
-		var m *ir.Name
-		if nn := t.Nname; nn != nil && !ir.IsBlank(nn.(*ir.Name)) && !strings.HasPrefix(nn.Sym().Name, "~r") {
-			n := nn.(*ir.Name)
-			m = inlvar(n)
-			m = typecheck.Expr(m).(*ir.Name)
-			inlvars[n] = m
-		} else {
-			// anonymous return values, synthesize names for use in assignment that replaces return
-			m = retvar(t, i)
-		}
-
-		if base.Flag.GenDwarfInl > 0 {
-			// Don't update the src.Pos on a return variable if it
-			// was manufactured by the inliner (e.g. "~R2"); such vars
-			// were not part of the original callee.
-			if !strings.HasPrefix(m.Sym().Name, "~R") {
-				m.Name().SetInlFormal(true)
-				m.SetPos(t.Pos)
-				inlfvars = append(inlfvars, m)
-			}
-		}
-
-		retvars = append(retvars, m)
-	}
-
-	// Assign arguments to the parameters' temp names.
-	as := ir.NewAssignListStmt(base.Pos, ir.OAS2, nil, nil)
-	as.Def = true
-	if call.Op() == ir.OCALLMETH {
-		base.FatalfAt(call.Pos(), "OCALLMETH missed by typecheck")
-	}
-	as.Rhs.Append(call.Args...)
-
-	if recv := fn.Type().Recv(); recv != nil {
-		as.Lhs.Append(inlParam(recv, as, inlvars))
-	}
-	for _, param := range fn.Type().Params().Fields().Slice() {
-		as.Lhs.Append(inlParam(param, as, inlvars))
-	}
-
-	if len(as.Rhs) != 0 {
-		ninit.Append(typecheck.Stmt(as))
-	}
-
-	if !fn.Inl.CanDelayResults {
-		// Zero the return parameters.
-		for _, n := range retvars {
-			ninit.Append(ir.NewDecl(base.Pos, ir.ODCL, n.(*ir.Name)))
-			ras := ir.NewAssignStmt(base.Pos, n, nil)
-			ninit.Append(typecheck.Stmt(ras))
-		}
-	}
-
-	retlabel := typecheck.AutoLabel(".i")
-
-	inlgen++
-
-	// Add an inline mark just before the inlined body.
-	// This mark is inline in the code so that it's a reasonable spot
-	// to put a breakpoint. Not sure if that's really necessary or not
-	// (in which case it could go at the end of the function instead).
-	// Note issue 28603.
-	ninit.Append(ir.NewInlineMarkStmt(call.Pos().WithIsStmt(), int64(inlIndex)))
-
-	subst := inlsubst{
-		retlabel:    retlabel,
-		retvars:     retvars,
-		inlvars:     inlvars,
-		defnMarker:  ir.NilExpr{},
-		bases:       make(map[*src.PosBase]*src.PosBase),
-		newInlIndex: inlIndex,
-		fn:          fn,
-	}
-	subst.edit = subst.node
-
-	body := subst.list(ir.Nodes(fn.Inl.Body))
-
-	lab := ir.NewLabelStmt(base.Pos, retlabel)
-	body = append(body, lab)
-
-	if base.Flag.GenDwarfInl > 0 {
-		for _, v := range inlfvars {
-			v.SetPos(subst.updatedPos(v.Pos()))
-		}
-	}
-
-	//dumplist("ninit post", ninit);
-
-	res := ir.NewInlinedCallExpr(base.Pos, body, retvars)
-	res.SetInit(ninit)
-	res.SetType(call.Type())
-	res.SetTypecheck(1)
-	return res
-}
-
-// Every time we expand a function we generate a new set of tmpnames,
-// PAUTO's in the calling functions, and link them off of the
-// PPARAM's, PAUTOS and PPARAMOUTs of the called function.
-func inlvar(var_ *ir.Name) *ir.Name {
-	if base.Flag.LowerM > 3 {
-		fmt.Printf("inlvar %+v\n", var_)
-	}
-
-	n := typecheck.NewName(var_.Sym())
-	n.SetType(var_.Type())
-	n.SetTypecheck(1)
-	n.Class = ir.PAUTO
-	n.SetUsed(true)
-	n.SetAutoTemp(var_.AutoTemp())
-	n.Curfn = ir.CurFunc // the calling function, not the called one
-	n.SetAddrtaken(var_.Addrtaken())
-
-	ir.CurFunc.Dcl = append(ir.CurFunc.Dcl, n)
-	return n
-}
-
-// Synthesize a variable to store the inlined function's results in.
-func retvar(t *types.Field, i int) *ir.Name {
-	n := typecheck.NewName(typecheck.LookupNum("~R", i))
-	n.SetType(t.Type)
-	n.SetTypecheck(1)
-	n.Class = ir.PAUTO
-	n.SetUsed(true)
-	n.Curfn = ir.CurFunc // the calling function, not the called one
-	ir.CurFunc.Dcl = append(ir.CurFunc.Dcl, n)
-	return n
-}
-
-// The inlsubst type implements the actual inlining of a single
-// function call.
-type inlsubst struct {
-	// Target of the goto substituted in place of a return.
-	retlabel *types.Sym
-
-	// Temporary result variables.
-	retvars []ir.Node
-
-	inlvars map[*ir.Name]*ir.Name
-	// defnMarker is used to mark a Node for reassignment.
-	// inlsubst.clovar set this during creating new ONAME.
-	// inlsubst.node will set the correct Defn for inlvar.
-	defnMarker ir.NilExpr
-
-	// bases maps from original PosBase to PosBase with an extra
-	// inlined call frame.
-	bases map[*src.PosBase]*src.PosBase
-
-	// newInlIndex is the index of the inlined call frame to
-	// insert for inlined nodes.
-	newInlIndex int
-
-	edit func(ir.Node) ir.Node // cached copy of subst.node method value closure
-
-	// If non-nil, we are inside a closure inside the inlined function, and
-	// newclofn is the Func of the new inlined closure.
-	newclofn *ir.Func
-
-	fn *ir.Func // For debug -- the func that is being inlined
-
-	// If true, then don't update source positions during substitution
-	// (retain old source positions).
-	noPosUpdate bool
-}
-
-// list inlines a list of nodes.
-func (subst *inlsubst) list(ll ir.Nodes) []ir.Node {
-	s := make([]ir.Node, 0, len(ll))
-	for _, n := range ll {
-		s = append(s, subst.node(n))
-	}
-	return s
-}
-
-// fields returns a list of the fields of a struct type representing receiver,
-// params, or results, after duplicating the field nodes and substituting the
-// Nname nodes inside the field nodes.
-func (subst *inlsubst) fields(oldt *types.Type) []*types.Field {
-	oldfields := oldt.FieldSlice()
-	newfields := make([]*types.Field, len(oldfields))
-	for i := range oldfields {
-		newfields[i] = oldfields[i].Copy()
-		if oldfields[i].Nname != nil {
-			newfields[i].Nname = subst.node(oldfields[i].Nname.(*ir.Name))
-		}
-	}
-	return newfields
-}
-
-// clovar creates a new ONAME node for a local variable or param of a closure
-// inside a function being inlined.
-func (subst *inlsubst) clovar(n *ir.Name) *ir.Name {
-	m := ir.NewNameAt(n.Pos(), n.Sym())
-	m.Class = n.Class
-	m.SetType(n.Type())
-	m.SetTypecheck(1)
-	if n.IsClosureVar() {
-		m.SetIsClosureVar(true)
-	}
-	if n.Addrtaken() {
-		m.SetAddrtaken(true)
-	}
-	if n.Used() {
-		m.SetUsed(true)
-	}
-	m.Defn = n.Defn
-
-	m.Curfn = subst.newclofn
-
-	switch defn := n.Defn.(type) {
-	case nil:
-		// ok
-	case *ir.Name:
-		if !n.IsClosureVar() {
-			base.FatalfAt(n.Pos(), "want closure variable, got: %+v", n)
-		}
-		if n.Sym().Pkg != types.LocalPkg {
-			// If the closure came from inlining a function from
-			// another package, must change package of captured
-			// variable to localpkg, so that the fields of the closure
-			// struct are local package and can be accessed even if
-			// name is not exported. If you disable this code, you can
-			// reproduce the problem by running 'go test
-			// go/internal/srcimporter'. TODO(mdempsky) - maybe change
-			// how we create closure structs?
-			m.SetSym(types.LocalPkg.Lookup(n.Sym().Name))
-		}
-		// Make sure any inlvar which is the Defn
-		// of an ONAME closure var is rewritten
-		// during inlining. Don't substitute
-		// if Defn node is outside inlined function.
-		if subst.inlvars[n.Defn.(*ir.Name)] != nil {
-			m.Defn = subst.node(n.Defn)
-		}
-	case *ir.AssignStmt, *ir.AssignListStmt:
-		// Mark node for reassignment at the end of inlsubst.node.
-		m.Defn = &subst.defnMarker
-	case *ir.TypeSwitchGuard:
-		// TODO(mdempsky): Set m.Defn properly. See discussion on #45743.
-	case *ir.RangeStmt:
-		// TODO: Set m.Defn properly if we support inlining range statement in the future.
-	default:
-		base.FatalfAt(n.Pos(), "unexpected Defn: %+v", defn)
-	}
-
-	if n.Outer != nil {
-		// Either the outer variable is defined in function being inlined,
-		// and we will replace it with the substituted variable, or it is
-		// defined outside the function being inlined, and we should just
-		// skip the outer variable (the closure variable of the function
-		// being inlined).
-		s := subst.node(n.Outer).(*ir.Name)
-		if s == n.Outer {
-			s = n.Outer.Outer
-		}
-		m.Outer = s
-	}
-	return m
-}
-
-// closure does the necessary substitions for a ClosureExpr n and returns the new
-// closure node.
-func (subst *inlsubst) closure(n *ir.ClosureExpr) ir.Node {
-	// Prior to the subst edit, set a flag in the inlsubst to indicate
-	// that we don't want to update the source positions in the new
-	// closure function. If we do this, it will appear that the
-	// closure itself has things inlined into it, which is not the
-	// case. See issue #46234 for more details. At the same time, we
-	// do want to update the position in the new ClosureExpr (which is
-	// part of the function we're working on). See #49171 for an
-	// example of what happens if we miss that update.
-	newClosurePos := subst.updatedPos(n.Pos())
-	defer func(prev bool) { subst.noPosUpdate = prev }(subst.noPosUpdate)
-	subst.noPosUpdate = true
-
-	//fmt.Printf("Inlining func %v with closure into %v\n", subst.fn, ir.FuncName(ir.CurFunc))
-
-	oldfn := n.Func
-	newfn := ir.NewClosureFunc(oldfn.Pos(), true)
-
-	if subst.newclofn != nil {
-		//fmt.Printf("Inlining a closure with a nested closure\n")
-	}
-	prevxfunc := subst.newclofn
-
-	// Mark that we are now substituting within a closure (within the
-	// inlined function), and create new nodes for all the local
-	// vars/params inside this closure.
-	subst.newclofn = newfn
-	newfn.Dcl = nil
-	newfn.ClosureVars = nil
-	for _, oldv := range oldfn.Dcl {
-		newv := subst.clovar(oldv)
-		subst.inlvars[oldv] = newv
-		newfn.Dcl = append(newfn.Dcl, newv)
-	}
-	for _, oldv := range oldfn.ClosureVars {
-		newv := subst.clovar(oldv)
-		subst.inlvars[oldv] = newv
-		newfn.ClosureVars = append(newfn.ClosureVars, newv)
-	}
-
-	// Need to replace ONAME nodes in
-	// newfn.Type().FuncType().Receiver/Params/Results.FieldSlice().Nname
-	oldt := oldfn.Type()
-	newrecvs := subst.fields(oldt.Recvs())
-	var newrecv *types.Field
-	if len(newrecvs) > 0 {
-		newrecv = newrecvs[0]
-	}
-	newt := types.NewSignature(oldt.Pkg(), newrecv,
-		nil, subst.fields(oldt.Params()), subst.fields(oldt.Results()))
-
-	newfn.Nname.SetType(newt)
-	newfn.Body = subst.list(oldfn.Body)
-
-	// Remove the nodes for the current closure from subst.inlvars
-	for _, oldv := range oldfn.Dcl {
-		delete(subst.inlvars, oldv)
-	}
-	for _, oldv := range oldfn.ClosureVars {
-		delete(subst.inlvars, oldv)
-	}
-	// Go back to previous closure func
-	subst.newclofn = prevxfunc
-
-	// Actually create the named function for the closure, now that
-	// the closure is inlined in a specific function.
-	newclo := newfn.OClosure
-	newclo.SetPos(newClosurePos)
-	newclo.SetInit(subst.list(n.Init()))
-	return typecheck.Expr(newclo)
-}
-
-// node recursively copies a node from the saved pristine body of the
-// inlined function, substituting references to input/output
-// parameters with ones to the tmpnames, and substituting returns with
-// assignments to the output.
-func (subst *inlsubst) node(n ir.Node) ir.Node {
-	if n == nil {
-		return nil
-	}
-
-	switch n.Op() {
-	case ir.ONAME:
-		n := n.(*ir.Name)
-
-		// Handle captured variables when inlining closures.
-		if n.IsClosureVar() && subst.newclofn == nil {
-			o := n.Outer
-
-			// Deal with case where sequence of closures are inlined.
-			// TODO(danscales) - write test case to see if we need to
-			// go up multiple levels.
-			if o.Curfn != ir.CurFunc {
-				o = o.Outer
-			}
-
-			// make sure the outer param matches the inlining location
-			if o == nil || o.Curfn != ir.CurFunc {
-				base.Fatalf("%v: unresolvable capture %v\n", ir.Line(n), n)
-			}
-
-			if base.Flag.LowerM > 2 {
-				fmt.Printf("substituting captured name %+v  ->  %+v\n", n, o)
-			}
-			return o
-		}
-
-		if inlvar := subst.inlvars[n]; inlvar != nil { // These will be set during inlnode
-			if base.Flag.LowerM > 2 {
-				fmt.Printf("substituting name %+v  ->  %+v\n", n, inlvar)
-			}
-			return inlvar
-		}
-
-		if base.Flag.LowerM > 2 {
-			fmt.Printf("not substituting name %+v\n", n)
-		}
-		return n
-
-	case ir.OMETHEXPR:
-		n := n.(*ir.SelectorExpr)
-		return n
-
-	case ir.OLITERAL, ir.ONIL, ir.OTYPE:
-		// If n is a named constant or type, we can continue
-		// using it in the inline copy. Otherwise, make a copy
-		// so we can update the line number.
-		if n.Sym() != nil {
-			return n
-		}
-
-	case ir.ORETURN:
-		if subst.newclofn != nil {
-			// Don't do special substitutions if inside a closure
-			break
-		}
-		// Because of the above test for subst.newclofn,
-		// this return is guaranteed to belong to the current inlined function.
-		n := n.(*ir.ReturnStmt)
-		init := subst.list(n.Init())
-		if len(subst.retvars) != 0 && len(n.Results) != 0 {
-			as := ir.NewAssignListStmt(base.Pos, ir.OAS2, nil, nil)
-
-			// Make a shallow copy of retvars.
-			// Otherwise OINLCALL.Rlist will be the same list,
-			// and later walk and typecheck may clobber it.
-			for _, n := range subst.retvars {
-				as.Lhs.Append(n)
-			}
-			as.Rhs = subst.list(n.Results)
-
-			if subst.fn.Inl.CanDelayResults {
-				for _, n := range as.Lhs {
-					as.PtrInit().Append(ir.NewDecl(base.Pos, ir.ODCL, n.(*ir.Name)))
-					n.Name().Defn = as
-				}
-			}
-
-			init = append(init, typecheck.Stmt(as))
-		}
-		init = append(init, ir.NewBranchStmt(base.Pos, ir.OGOTO, subst.retlabel))
-		typecheck.Stmts(init)
-		return ir.NewBlockStmt(base.Pos, init)
-
-	case ir.OGOTO, ir.OBREAK, ir.OCONTINUE:
-		if subst.newclofn != nil {
-			// Don't do special substitutions if inside a closure
-			break
-		}
-		n := n.(*ir.BranchStmt)
-		m := ir.Copy(n).(*ir.BranchStmt)
-		m.SetPos(subst.updatedPos(m.Pos()))
-		m.SetInit(nil)
-		m.Label = translateLabel(n.Label)
-		return m
-
-	case ir.OLABEL:
-		if subst.newclofn != nil {
-			// Don't do special substitutions if inside a closure
-			break
-		}
-		n := n.(*ir.LabelStmt)
-		m := ir.Copy(n).(*ir.LabelStmt)
-		m.SetPos(subst.updatedPos(m.Pos()))
-		m.SetInit(nil)
-		m.Label = translateLabel(n.Label)
-		return m
-
-	case ir.OCLOSURE:
-		return subst.closure(n.(*ir.ClosureExpr))
-
-	}
-
-	m := ir.Copy(n)
-	m.SetPos(subst.updatedPos(m.Pos()))
-	ir.EditChildren(m, subst.edit)
-
-	if subst.newclofn == nil {
-		// Translate any label on FOR, RANGE loops, SWITCH or SELECT
-		switch m.Op() {
-		case ir.OFOR:
-			m := m.(*ir.ForStmt)
-			m.Label = translateLabel(m.Label)
-			return m
-
-		case ir.ORANGE:
-			m := m.(*ir.RangeStmt)
-			m.Label = translateLabel(m.Label)
-			return m
-
-		case ir.OSWITCH:
-			m := m.(*ir.SwitchStmt)
-			m.Label = translateLabel(m.Label)
-			return m
-
-		case ir.OSELECT:
-			m := m.(*ir.SelectStmt)
-			m.Label = translateLabel(m.Label)
-			return m
-		}
-	}
-
-	switch m := m.(type) {
-	case *ir.AssignStmt:
-		if lhs, ok := m.X.(*ir.Name); ok && lhs.Defn == &subst.defnMarker {
-			lhs.Defn = m
-		}
-	case *ir.AssignListStmt:
-		for _, lhs := range m.Lhs {
-			if lhs, ok := lhs.(*ir.Name); ok && lhs.Defn == &subst.defnMarker {
-				lhs.Defn = m
-			}
-		}
-	}
-
-	return m
-}
-
-// translateLabel makes a label from an inlined function (if non-nil) be unique by
-// adding "·inlgen".
-func translateLabel(l *types.Sym) *types.Sym {
-	if l == nil {
-		return nil
-	}
-	p := fmt.Sprintf("%s·%d", l.Name, inlgen)
-	return typecheck.Lookup(p)
-}
-
-func (subst *inlsubst) updatedPos(xpos src.XPos) src.XPos {
-	if subst.noPosUpdate {
-		return xpos
-	}
-	pos := base.Ctxt.PosTable.Pos(xpos)
-	oldbase := pos.Base() // can be nil
-	newbase := subst.bases[oldbase]
-	if newbase == nil {
-		newbase = src.NewInliningBase(oldbase, subst.newInlIndex)
-		subst.bases[oldbase] = newbase
-	}
-	pos.SetBase(newbase)
-	return base.Ctxt.PosTable.XPos(pos)
-}
-
 func pruneUnusedAutos(ll []*ir.Name, vis *hairyVisitor) []*ir.Name {
 	s := make([]*ir.Name, 0, len(ll))
 	for _, n := range ll {
diff --git a/src/cmd/compile/internal/ir/abi.go b/src/cmd/compile/internal/ir/abi.go
index 8cd1606..041448f 100644
--- a/src/cmd/compile/internal/ir/abi.go
+++ b/src/cmd/compile/internal/ir/abi.go
@@ -53,6 +53,9 @@
 	if f.ReflectMethod() {
 		flag |= obj.REFLECTMETHOD
 	}
+	if f.IsPackageInit() {
+		flag |= obj.PKGINIT
+	}
 
 	// Clumsy but important.
 	// For functions that could be on the path of invoking a deferred
diff --git a/src/cmd/compile/internal/ir/const.go b/src/cmd/compile/internal/ir/const.go
index f0b6695..751620f 100644
--- a/src/cmd/compile/internal/ir/const.go
+++ b/src/cmd/compile/internal/ir/const.go
@@ -11,18 +11,19 @@
 
 	"cmd/compile/internal/base"
 	"cmd/compile/internal/types"
+	"cmd/internal/src"
 )
 
-func NewBool(b bool) Node {
-	return NewLiteral(constant.MakeBool(b))
+func NewBool(pos src.XPos, b bool) Node {
+	return NewBasicLit(pos, constant.MakeBool(b))
 }
 
-func NewInt(v int64) Node {
-	return NewLiteral(constant.MakeInt64(v))
+func NewInt(pos src.XPos, v int64) Node {
+	return NewBasicLit(pos, constant.MakeInt64(v))
 }
 
-func NewString(s string) Node {
-	return NewLiteral(constant.MakeString(s))
+func NewString(pos src.XPos, s string) Node {
+	return NewBasicLit(pos, constant.MakeString(s))
 }
 
 const (
diff --git a/src/cmd/compile/internal/ir/dump.go b/src/cmd/compile/internal/ir/dump.go
index 59914ba..4c21868 100644
--- a/src/cmd/compile/internal/ir/dump.go
+++ b/src/cmd/compile/internal/ir/dump.go
@@ -218,7 +218,7 @@
 					continue // Op field already printed for Nodes
 				}
 				x := x.Field(i)
-				if isZeroVal(x) {
+				if x.IsZero() {
 					omitted = true
 					continue // exclude zero-valued fields
 				}
@@ -248,22 +248,6 @@
 	}
 }
 
-func isZeroVal(x reflect.Value) bool {
-	switch x.Kind() {
-	case reflect.Bool:
-		return !x.Bool()
-	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
-		return x.Int() == 0
-	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
-		return x.Uint() == 0
-	case reflect.String:
-		return x.String() == ""
-	case reflect.Interface, reflect.Ptr, reflect.Slice:
-		return x.IsNil()
-	}
-	return false
-}
-
 func commonPrefixLen(a, b string) (i int) {
 	for i < len(a) && i < len(b) && a[i] == b[i] {
 		i++
diff --git a/src/cmd/compile/internal/ir/expr.go b/src/cmd/compile/internal/ir/expr.go
index a481b14..5355edc 100644
--- a/src/cmd/compile/internal/ir/expr.go
+++ b/src/cmd/compile/internal/ir/expr.go
@@ -174,7 +174,7 @@
 		OCALL, OCALLFUNC, OCALLINTER, OCALLMETH,
 		ODELETE,
 		OGETG, OGETCALLERPC, OGETCALLERSP,
-		OMAKE, OPRINT, OPRINTN,
+		OMAKE, OMAX, OMIN, OPRINT, OPRINTN,
 		ORECOVER, ORECOVERFP:
 		n.op = op
 	}
@@ -380,7 +380,7 @@
 	return n.ReturnVars[0]
 }
 
-// A LogicalExpr is a expression X Op Y where Op is && or ||.
+// A LogicalExpr is an expression X Op Y where Op is && or ||.
 // It is separate from BinaryExpr to make room for statements
 // that must be executed before Y but after X.
 type LogicalExpr struct {
@@ -563,8 +563,7 @@
 	if n.Selection.Nname != nil {
 		// TODO(austin): Nname is nil for interface method
 		// expressions (I.M), so we can't attach a Func to
-		// those here. reflectdata.methodWrapper generates the
-		// Func.
+		// those here.
 		fn.Func = n.Selection.Nname.(*Name).Func
 	}
 	return fn
@@ -747,7 +746,7 @@
 	default:
 		panic(n.no("SetOp " + op.String()))
 	case OBITNOT, ONEG, ONOT, OPLUS, ORECV,
-		OALIGNOF, OCAP, OCLOSE, OIMAG, OLEN, ONEW,
+		OALIGNOF, OCAP, OCLEAR, OCLOSE, OIMAG, OLEN, ONEW,
 		OOFFSETOF, OPANIC, OREAL, OSIZEOF,
 		OCHECKNIL, OCFUNC, OIDATA, OITAB, OSPTR,
 		OUNSAFESTRINGDATA, OUNSAFESLICEDATA:
@@ -959,6 +958,11 @@
 			if isName(OuterValue(n.X)) {
 				return true
 			}
+		case ORANGE:
+			n := n.(*RangeStmt)
+			if isName(n.Key) || isName(n.Value) {
+				return true
+			}
 		case OCLOSURE:
 			n := n.(*ClosureExpr)
 			if Any(n.Func, do) {
diff --git a/src/cmd/compile/internal/ir/fmt.go b/src/cmd/compile/internal/ir/fmt.go
index bac172d..0c553a9 100644
--- a/src/cmd/compile/internal/ir/fmt.go
+++ b/src/cmd/compile/internal/ir/fmt.go
@@ -9,7 +9,6 @@
 	"fmt"
 	"go/constant"
 	"io"
-	"math"
 	"os"
 	"path/filepath"
 	"reflect"
@@ -39,6 +38,7 @@
 	OCALL:             "function call", // not actual syntax
 	OCAP:              "cap",
 	OCASE:             "case",
+	OCLEAR:            "clear",
 	OCLOSE:            "close",
 	OCOMPLEX:          "complex",
 	OBITNOT:           "^",
@@ -63,6 +63,8 @@
 	OLT:               "<",
 	OMAKE:             "make",
 	ONEG:              "-",
+	OMAX:              "max",
+	OMIN:              "min",
 	OMOD:              "%",
 	OMUL:              "*",
 	ONEW:              "new",
@@ -182,6 +184,7 @@
 	OCALLMETH:         8,
 	OCALL:             8,
 	OCAP:              8,
+	OCLEAR:            8,
 	OCLOSE:            8,
 	OCOMPLIT:          8,
 	OCONVIFACE:        8,
@@ -197,6 +200,8 @@
 	OMAKESLICECOPY:    8,
 	OMAKE:             8,
 	OMAPLIT:           8,
+	OMAX:              8,
+	OMIN:              8,
 	ONAME:             8,
 	ONEW:              8,
 	ONIL:              8,
@@ -415,6 +420,9 @@
 		}
 
 		fmt.Fprint(s, "for")
+		if n.DistinctVars {
+			fmt.Fprint(s, " /* distinct */")
+		}
 		if simpleinit {
 			fmt.Fprintf(s, " %v;", n.Init()[0])
 		} else if n.Post != nil {
@@ -449,6 +457,9 @@
 			fmt.Fprint(s, " =")
 		}
 		fmt.Fprintf(s, " range %v { %v }", n.X, n.Body)
+		if n.DistinctVars {
+			fmt.Fprint(s, " /* distinct vars */")
+		}
 
 	case OSELECT:
 		n := n.(*SelectStmt)
@@ -767,6 +778,7 @@
 	case OREAL,
 		OIMAG,
 		OCAP,
+		OCLEAR,
 		OCLOSE,
 		OLEN,
 		ONEW,
@@ -780,6 +792,8 @@
 	case OAPPEND,
 		ODELETE,
 		OMAKE,
+		OMAX,
+		OMIN,
 		ORECOVER,
 		OPRINT,
 		OPRINTN:
@@ -1013,7 +1027,7 @@
 			name := strings.TrimSuffix(tf.Name, "_")
 			vf := v.Field(i)
 			vfi := vf.Interface()
-			if name == "Offset" && vfi == types.BADWIDTH || name != "Offset" && isZero(vf) {
+			if name == "Offset" && vfi == types.BADWIDTH || name != "Offset" && vf.IsZero() {
 				continue
 			}
 			if vfi == true {
@@ -1077,15 +1091,15 @@
 		case src.PosIsStmt:
 			fmt.Fprint(w, "+")
 		}
-		for i, pos := range base.Ctxt.AllPos(n.Pos(), nil) {
-			if i > 0 {
-				fmt.Fprint(w, ",")
-			}
+		sep := ""
+		base.Ctxt.AllPos(n.Pos(), func(pos src.Pos) {
+			fmt.Fprint(w, sep)
+			sep = " "
 			// TODO(mdempsky): Print line pragma details too.
 			file := filepath.Base(pos.Filename())
 			// Note: this output will be parsed by ssa/html.go:(*HTMLWriter).WriteAST. Keep in sync.
 			fmt.Fprintf(w, "%s:%d:%d", file, pos.Line(), pos.Col())
-		}
+		})
 	}
 }
 
@@ -1252,40 +1266,3 @@
 		dumpNode(w, n, depth)
 	}
 }
-
-// reflect.IsZero is not available in Go 1.4 (added in Go 1.13), so we use this copy instead.
-func isZero(v reflect.Value) bool {
-	switch v.Kind() {
-	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 math.Float64bits(v.Float()) == 0
-	case reflect.Complex64, reflect.Complex128:
-		c := v.Complex()
-		return math.Float64bits(real(c)) == 0 && math.Float64bits(imag(c)) == 0
-	case reflect.Array:
-		for i := 0; i < v.Len(); i++ {
-			if !isZero(v.Index(i)) {
-				return false
-			}
-		}
-		return true
-	case reflect.Chan, reflect.Func, reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice, reflect.UnsafePointer:
-		return v.IsNil()
-	case reflect.String:
-		return v.Len() == 0
-	case reflect.Struct:
-		for i := 0; i < v.NumField(); i++ {
-			if !isZero(v.Field(i)) {
-				return false
-			}
-		}
-		return true
-	default:
-		return false
-	}
-}
diff --git a/src/cmd/compile/internal/ir/func.go b/src/cmd/compile/internal/ir/func.go
index b0b8da5..5c41893 100644
--- a/src/cmd/compile/internal/ir/func.go
+++ b/src/cmd/compile/internal/ir/func.go
@@ -8,8 +8,10 @@
 	"cmd/compile/internal/base"
 	"cmd/compile/internal/types"
 	"cmd/internal/obj"
+	"cmd/internal/objabi"
 	"cmd/internal/src"
 	"fmt"
+	"strings"
 )
 
 // A Func corresponds to a single function in a Go program
@@ -133,6 +135,16 @@
 	// For wrapper functions, WrappedFunc point to the original Func.
 	// Currently only used for go/defer wrappers.
 	WrappedFunc *Func
+
+	// WasmImport is used by the //go:wasmimport directive to store info about
+	// a WebAssembly function import.
+	WasmImport *WasmImport
+}
+
+// WasmImport stores metadata associated with the //go:wasmimport pragma.
+type WasmImport struct {
+	Module string
+	Name   string
 }
 
 func NewFunc(pos src.XPos) *Func {
@@ -204,6 +216,7 @@
 	funcInstrumentBody           // add race/msan/asan instrumentation during SSA construction
 	funcOpenCodedDeferDisallowed // can't do open-coded defers
 	funcClosureCalled            // closure is only immediately called; used by escape analysis
+	funcPackageInit              // compiler emitted .init func for package
 )
 
 type SymAndPos struct {
@@ -225,6 +238,7 @@
 func (f *Func) InstrumentBody() bool           { return f.flags&funcInstrumentBody != 0 }
 func (f *Func) OpenCodedDeferDisallowed() bool { return f.flags&funcOpenCodedDeferDisallowed != 0 }
 func (f *Func) ClosureCalled() bool            { return f.flags&funcClosureCalled != 0 }
+func (f *Func) IsPackageInit() bool            { return f.flags&funcPackageInit != 0 }
 
 func (f *Func) SetDupok(b bool)                    { f.flags.set(funcDupok, b) }
 func (f *Func) SetWrapper(b bool)                  { f.flags.set(funcWrapper, b) }
@@ -240,6 +254,7 @@
 func (f *Func) SetInstrumentBody(b bool)           { f.flags.set(funcInstrumentBody, b) }
 func (f *Func) SetOpenCodedDeferDisallowed(b bool) { f.flags.set(funcOpenCodedDeferDisallowed, b) }
 func (f *Func) SetClosureCalled(b bool)            { f.flags.set(funcClosureCalled, b) }
+func (f *Func) SetIsPackageInit(b bool)            { f.flags.set(funcPackageInit, b) }
 
 func (f *Func) SetWBPos(pos src.XPos) {
 	if base.Debug.WB != 0 {
@@ -250,7 +265,7 @@
 	}
 }
 
-// FuncName returns the name (without the package) of the function n.
+// FuncName returns the name (without the package) of the function f.
 func FuncName(f *Func) string {
 	if f == nil || f.Nname == nil {
 		return "<nil>"
@@ -258,10 +273,12 @@
 	return f.Sym().Name
 }
 
-// PkgFuncName returns the name of the function referenced by n, with package prepended.
-// This differs from the compiler's internal convention where local functions lack a package
-// because the ultimate consumer of this is a human looking at an IDE; package is only empty
-// if the compilation package is actually the empty string.
+// PkgFuncName returns the name of the function referenced by f, with package
+// prepended.
+//
+// This differs from the compiler's internal convention where local functions
+// lack a package. This is primarily useful when the ultimate consumer of this
+// is a human looking at message.
 func PkgFuncName(f *Func) string {
 	if f == nil || f.Nname == nil {
 		return "<nil>"
@@ -272,6 +289,26 @@
 	return pkg.Path + "." + s.Name
 }
 
+// LinkFuncName returns the name of the function f, as it will appear in the
+// symbol table of the final linked binary.
+func LinkFuncName(f *Func) string {
+	if f == nil || f.Nname == nil {
+		return "<nil>"
+	}
+	s := f.Sym()
+	pkg := s.Pkg
+
+	return objabi.PathToPrefix(pkg.Path) + "." + s.Name
+}
+
+// IsEqOrHashFunc reports whether f is type eq/hash function.
+func IsEqOrHashFunc(f *Func) bool {
+	if f == nil || f.Nname == nil {
+		return false
+	}
+	return types.IsTypePkg(f.Sym().Pkg)
+}
+
 var CurFunc *Func
 
 // WithFunc invokes do with CurFunc and base.Pos set to curfn and
@@ -310,7 +347,7 @@
 		}
 	}
 	if base.Flag.CompilingRuntime && clo.Esc() == EscHeap && !clo.IsGoWrap {
-		base.ErrorfAt(clo.Pos(), "heap-allocated closure %s, not allowed in runtime", FuncName(clo.Func))
+		base.ErrorfAt(clo.Pos(), 0, "heap-allocated closure %s, not allowed in runtime", FuncName(clo.Func))
 	}
 }
 
@@ -323,8 +360,8 @@
 // globClosgen is like Func.Closgen, but for the global scope.
 var globClosgen int32
 
-// closureName generates a new unique name for a closure within outerfn.
-func closureName(outerfn *Func) *types.Sym {
+// closureName generates a new unique name for a closure within outerfn at pos.
+func closureName(outerfn *Func, pos src.XPos) *types.Sym {
 	pkg := types.LocalPkg
 	outer := "glob."
 	prefix := "func"
@@ -346,6 +383,17 @@
 		}
 	}
 
+	// If this closure was created due to inlining, then incorporate any
+	// inlined functions' names into the closure's linker symbol name
+	// too (#60324).
+	if inlIndex := base.Ctxt.InnermostPos(pos).Base().InliningIndex(); inlIndex >= 0 {
+		names := []string{outer}
+		base.Ctxt.InlTree.AllParents(inlIndex, func(call obj.InlinedCall) {
+			names = append(names, call.Name)
+		})
+		outer = strings.Join(names, ".")
+	}
+
 	*gen++
 	return pkg.Lookup(fmt.Sprintf("%s.%s%d", outer, prefix, *gen))
 }
@@ -382,11 +430,11 @@
 		base.FatalfAt(clo.Pos(), "closure already named: %v", name)
 	}
 
-	name.SetSym(closureName(outerfn))
+	name.SetSym(closureName(outerfn, clo.Pos()))
 	MarkFunc(name)
 }
 
-// UseClosure checks that the ginen function literal has been setup
+// UseClosure checks that the given function literal has been setup
 // correctly, and then returns it as an expression.
 // It must be called after clo.Func.ClosureVars has been set.
 func UseClosure(clo *ClosureExpr, pkg *Package) Node {
diff --git a/src/cmd/compile/internal/ir/name.go b/src/cmd/compile/internal/ir/name.go
index 43aa582..c6eff27 100644
--- a/src/cmd/compile/internal/ir/name.go
+++ b/src/cmd/compile/internal/ir/name.go
@@ -40,7 +40,7 @@
 	flags     bitset16
 	DictIndex uint16 // index of the dictionary entry describing the type of this variable declaration plus 1
 	sym       *types.Sym
-	Func      *Func // TODO(austin): nil for I.M, eqFor, hashfor, and hashmem
+	Func      *Func // TODO(austin): nil for I.M
 	Offset_   int64
 	val       constant.Value
 	Opt       interface{} // for use by escape analysis
diff --git a/src/cmd/compile/internal/ir/node.go b/src/cmd/compile/internal/ir/node.go
index b42f914..769340e 100644
--- a/src/cmd/compile/internal/ir/node.go
+++ b/src/cmd/compile/internal/ir/node.go
@@ -52,7 +52,6 @@
 	//  0 means the node is not typechecked
 	//  1 means the node is completely typechecked
 	//  2 means typechecking of the node is in progress
-	//  3 means the node has its type from types2, but may need transformation
 	Typecheck() uint8
 	SetTypecheck(x uint8)
 	NonNil() bool
@@ -159,6 +158,7 @@
 	OCALLMETH  // X(Args) (direct method call x.Method(args))
 	OCALLINTER // X(Args) (interface method call x.Method(args))
 	OCAP       // cap(X)
+	OCLEAR     // clear(X)
 	OCLOSE     // close(X)
 	OCLOSURE   // func Type { Func.Closure.Body } (func literal)
 	OCOMPLIT   // Type{List} (composite literal, not yet lowered to specific form)
@@ -241,6 +241,8 @@
 	ORECV             // <-X
 	ORUNESTR          // Type(X) (Type is string, X is rune)
 	OSELRECV2         // like OAS2: Lhs = Rhs where len(Lhs)=2, len(Rhs)=1, Rhs[0].Op = ORECV (appears as .Var of OCASE)
+	OMIN              // min(List)
+	OMAX              // max(List)
 	OREAL             // real(X)
 	OIMAG             // imag(X)
 	OCOMPLEX          // complex(X, Y)
@@ -291,7 +293,7 @@
 	OEFACE         // itable and data words of an empty-interface value.
 	OITAB          // itable word of an interface value.
 	OIDATA         // data word of an interface value in X
-	OSPTR          // base pointer of a slice or string.
+	OSPTR          // base pointer of a slice or string. Bounded==1 means known non-nil.
 	OCFUNC         // reference to c function pointer (not go func value)
 	OCHECKNIL      // emit code to ensure pointer/interface not nil
 	ORESULT        // result of a function call; Xoffset is stack offset
diff --git a/src/cmd/compile/internal/ir/op_string.go b/src/cmd/compile/internal/ir/op_string.go
index d84a08e..571ac6c 100644
--- a/src/cmd/compile/internal/ir/op_string.go
+++ b/src/cmd/compile/internal/ir/op_string.go
@@ -42,132 +42,135 @@
 	_ = x[OCALLMETH-31]
 	_ = x[OCALLINTER-32]
 	_ = x[OCAP-33]
-	_ = x[OCLOSE-34]
-	_ = x[OCLOSURE-35]
-	_ = x[OCOMPLIT-36]
-	_ = x[OMAPLIT-37]
-	_ = x[OSTRUCTLIT-38]
-	_ = x[OARRAYLIT-39]
-	_ = x[OSLICELIT-40]
-	_ = x[OPTRLIT-41]
-	_ = x[OCONV-42]
-	_ = x[OCONVIFACE-43]
-	_ = x[OCONVIDATA-44]
-	_ = x[OCONVNOP-45]
-	_ = x[OCOPY-46]
-	_ = x[ODCL-47]
-	_ = x[ODCLFUNC-48]
-	_ = x[ODCLCONST-49]
-	_ = x[ODCLTYPE-50]
-	_ = x[ODELETE-51]
-	_ = x[ODOT-52]
-	_ = x[ODOTPTR-53]
-	_ = x[ODOTMETH-54]
-	_ = x[ODOTINTER-55]
-	_ = x[OXDOT-56]
-	_ = x[ODOTTYPE-57]
-	_ = x[ODOTTYPE2-58]
-	_ = x[OEQ-59]
-	_ = x[ONE-60]
-	_ = x[OLT-61]
-	_ = x[OLE-62]
-	_ = x[OGE-63]
-	_ = x[OGT-64]
-	_ = x[ODEREF-65]
-	_ = x[OINDEX-66]
-	_ = x[OINDEXMAP-67]
-	_ = x[OKEY-68]
-	_ = x[OSTRUCTKEY-69]
-	_ = x[OLEN-70]
-	_ = x[OMAKE-71]
-	_ = x[OMAKECHAN-72]
-	_ = x[OMAKEMAP-73]
-	_ = x[OMAKESLICE-74]
-	_ = x[OMAKESLICECOPY-75]
-	_ = x[OMUL-76]
-	_ = x[ODIV-77]
-	_ = x[OMOD-78]
-	_ = x[OLSH-79]
-	_ = x[ORSH-80]
-	_ = x[OAND-81]
-	_ = x[OANDNOT-82]
-	_ = x[ONEW-83]
-	_ = x[ONOT-84]
-	_ = x[OBITNOT-85]
-	_ = x[OPLUS-86]
-	_ = x[ONEG-87]
-	_ = x[OOROR-88]
-	_ = x[OPANIC-89]
-	_ = x[OPRINT-90]
-	_ = x[OPRINTN-91]
-	_ = x[OPAREN-92]
-	_ = x[OSEND-93]
-	_ = x[OSLICE-94]
-	_ = x[OSLICEARR-95]
-	_ = x[OSLICESTR-96]
-	_ = x[OSLICE3-97]
-	_ = x[OSLICE3ARR-98]
-	_ = x[OSLICEHEADER-99]
-	_ = x[OSTRINGHEADER-100]
-	_ = x[ORECOVER-101]
-	_ = x[ORECOVERFP-102]
-	_ = x[ORECV-103]
-	_ = x[ORUNESTR-104]
-	_ = x[OSELRECV2-105]
-	_ = x[OREAL-106]
-	_ = x[OIMAG-107]
-	_ = x[OCOMPLEX-108]
-	_ = x[OALIGNOF-109]
-	_ = x[OOFFSETOF-110]
-	_ = x[OSIZEOF-111]
-	_ = x[OUNSAFEADD-112]
-	_ = x[OUNSAFESLICE-113]
-	_ = x[OUNSAFESLICEDATA-114]
-	_ = x[OUNSAFESTRING-115]
-	_ = x[OUNSAFESTRINGDATA-116]
-	_ = x[OMETHEXPR-117]
-	_ = x[OMETHVALUE-118]
-	_ = x[OBLOCK-119]
-	_ = x[OBREAK-120]
-	_ = x[OCASE-121]
-	_ = x[OCONTINUE-122]
-	_ = x[ODEFER-123]
-	_ = x[OFALL-124]
-	_ = x[OFOR-125]
-	_ = x[OGOTO-126]
-	_ = x[OIF-127]
-	_ = x[OLABEL-128]
-	_ = x[OGO-129]
-	_ = x[ORANGE-130]
-	_ = x[ORETURN-131]
-	_ = x[OSELECT-132]
-	_ = x[OSWITCH-133]
-	_ = x[OTYPESW-134]
-	_ = x[OFUNCINST-135]
-	_ = x[OINLCALL-136]
-	_ = x[OEFACE-137]
-	_ = x[OITAB-138]
-	_ = x[OIDATA-139]
-	_ = x[OSPTR-140]
-	_ = x[OCFUNC-141]
-	_ = x[OCHECKNIL-142]
-	_ = x[ORESULT-143]
-	_ = x[OINLMARK-144]
-	_ = x[OLINKSYMOFFSET-145]
-	_ = x[OJUMPTABLE-146]
-	_ = x[ODYNAMICDOTTYPE-147]
-	_ = x[ODYNAMICDOTTYPE2-148]
-	_ = x[ODYNAMICTYPE-149]
-	_ = x[OTAILCALL-150]
-	_ = x[OGETG-151]
-	_ = x[OGETCALLERPC-152]
-	_ = x[OGETCALLERSP-153]
-	_ = x[OEND-154]
+	_ = x[OCLEAR-34]
+	_ = x[OCLOSE-35]
+	_ = x[OCLOSURE-36]
+	_ = x[OCOMPLIT-37]
+	_ = x[OMAPLIT-38]
+	_ = x[OSTRUCTLIT-39]
+	_ = x[OARRAYLIT-40]
+	_ = x[OSLICELIT-41]
+	_ = x[OPTRLIT-42]
+	_ = x[OCONV-43]
+	_ = x[OCONVIFACE-44]
+	_ = x[OCONVIDATA-45]
+	_ = x[OCONVNOP-46]
+	_ = x[OCOPY-47]
+	_ = x[ODCL-48]
+	_ = x[ODCLFUNC-49]
+	_ = x[ODCLCONST-50]
+	_ = x[ODCLTYPE-51]
+	_ = x[ODELETE-52]
+	_ = x[ODOT-53]
+	_ = x[ODOTPTR-54]
+	_ = x[ODOTMETH-55]
+	_ = x[ODOTINTER-56]
+	_ = x[OXDOT-57]
+	_ = x[ODOTTYPE-58]
+	_ = x[ODOTTYPE2-59]
+	_ = x[OEQ-60]
+	_ = x[ONE-61]
+	_ = x[OLT-62]
+	_ = x[OLE-63]
+	_ = x[OGE-64]
+	_ = x[OGT-65]
+	_ = x[ODEREF-66]
+	_ = x[OINDEX-67]
+	_ = x[OINDEXMAP-68]
+	_ = x[OKEY-69]
+	_ = x[OSTRUCTKEY-70]
+	_ = x[OLEN-71]
+	_ = x[OMAKE-72]
+	_ = x[OMAKECHAN-73]
+	_ = x[OMAKEMAP-74]
+	_ = x[OMAKESLICE-75]
+	_ = x[OMAKESLICECOPY-76]
+	_ = x[OMUL-77]
+	_ = x[ODIV-78]
+	_ = x[OMOD-79]
+	_ = x[OLSH-80]
+	_ = x[ORSH-81]
+	_ = x[OAND-82]
+	_ = x[OANDNOT-83]
+	_ = x[ONEW-84]
+	_ = x[ONOT-85]
+	_ = x[OBITNOT-86]
+	_ = x[OPLUS-87]
+	_ = x[ONEG-88]
+	_ = x[OOROR-89]
+	_ = x[OPANIC-90]
+	_ = x[OPRINT-91]
+	_ = x[OPRINTN-92]
+	_ = x[OPAREN-93]
+	_ = x[OSEND-94]
+	_ = x[OSLICE-95]
+	_ = x[OSLICEARR-96]
+	_ = x[OSLICESTR-97]
+	_ = x[OSLICE3-98]
+	_ = x[OSLICE3ARR-99]
+	_ = x[OSLICEHEADER-100]
+	_ = x[OSTRINGHEADER-101]
+	_ = x[ORECOVER-102]
+	_ = x[ORECOVERFP-103]
+	_ = x[ORECV-104]
+	_ = x[ORUNESTR-105]
+	_ = x[OSELRECV2-106]
+	_ = x[OMIN-107]
+	_ = x[OMAX-108]
+	_ = x[OREAL-109]
+	_ = x[OIMAG-110]
+	_ = x[OCOMPLEX-111]
+	_ = x[OALIGNOF-112]
+	_ = x[OOFFSETOF-113]
+	_ = x[OSIZEOF-114]
+	_ = x[OUNSAFEADD-115]
+	_ = x[OUNSAFESLICE-116]
+	_ = x[OUNSAFESLICEDATA-117]
+	_ = x[OUNSAFESTRING-118]
+	_ = x[OUNSAFESTRINGDATA-119]
+	_ = x[OMETHEXPR-120]
+	_ = x[OMETHVALUE-121]
+	_ = x[OBLOCK-122]
+	_ = x[OBREAK-123]
+	_ = x[OCASE-124]
+	_ = x[OCONTINUE-125]
+	_ = x[ODEFER-126]
+	_ = x[OFALL-127]
+	_ = x[OFOR-128]
+	_ = x[OGOTO-129]
+	_ = x[OIF-130]
+	_ = x[OLABEL-131]
+	_ = x[OGO-132]
+	_ = x[ORANGE-133]
+	_ = x[ORETURN-134]
+	_ = x[OSELECT-135]
+	_ = x[OSWITCH-136]
+	_ = x[OTYPESW-137]
+	_ = x[OFUNCINST-138]
+	_ = x[OINLCALL-139]
+	_ = x[OEFACE-140]
+	_ = x[OITAB-141]
+	_ = x[OIDATA-142]
+	_ = x[OSPTR-143]
+	_ = x[OCFUNC-144]
+	_ = x[OCHECKNIL-145]
+	_ = x[ORESULT-146]
+	_ = x[OINLMARK-147]
+	_ = x[OLINKSYMOFFSET-148]
+	_ = x[OJUMPTABLE-149]
+	_ = x[ODYNAMICDOTTYPE-150]
+	_ = x[ODYNAMICDOTTYPE2-151]
+	_ = x[ODYNAMICTYPE-152]
+	_ = x[OTAILCALL-153]
+	_ = x[OGETG-154]
+	_ = x[OGETCALLERPC-155]
+	_ = x[OGETCALLERSP-156]
+	_ = x[OEND-157]
 }
 
-const _Op_name = "XXXNAMENONAMETYPELITERALNILADDSUBORXORADDSTRADDRANDANDAPPENDBYTES2STRBYTES2STRTMPRUNES2STRSTR2BYTESSTR2BYTESTMPSTR2RUNESSLICE2ARRSLICE2ARRPTRASAS2AS2DOTTYPEAS2FUNCAS2MAPRAS2RECVASOPCALLCALLFUNCCALLMETHCALLINTERCAPCLOSECLOSURECOMPLITMAPLITSTRUCTLITARRAYLITSLICELITPTRLITCONVCONVIFACECONVIDATACONVNOPCOPYDCLDCLFUNCDCLCONSTDCLTYPEDELETEDOTDOTPTRDOTMETHDOTINTERXDOTDOTTYPEDOTTYPE2EQNELTLEGEGTDEREFINDEXINDEXMAPKEYSTRUCTKEYLENMAKEMAKECHANMAKEMAPMAKESLICEMAKESLICECOPYMULDIVMODLSHRSHANDANDNOTNEWNOTBITNOTPLUSNEGORORPANICPRINTPRINTNPARENSENDSLICESLICEARRSLICESTRSLICE3SLICE3ARRSLICEHEADERSTRINGHEADERRECOVERRECOVERFPRECVRUNESTRSELRECV2REALIMAGCOMPLEXALIGNOFOFFSETOFSIZEOFUNSAFEADDUNSAFESLICEUNSAFESLICEDATAUNSAFESTRINGUNSAFESTRINGDATAMETHEXPRMETHVALUEBLOCKBREAKCASECONTINUEDEFERFALLFORGOTOIFLABELGORANGERETURNSELECTSWITCHTYPESWFUNCINSTINLCALLEFACEITABIDATASPTRCFUNCCHECKNILRESULTINLMARKLINKSYMOFFSETJUMPTABLEDYNAMICDOTTYPEDYNAMICDOTTYPE2DYNAMICTYPETAILCALLGETGGETCALLERPCGETCALLERSPEND"
+const _Op_name = "XXXNAMENONAMETYPELITERALNILADDSUBORXORADDSTRADDRANDANDAPPENDBYTES2STRBYTES2STRTMPRUNES2STRSTR2BYTESSTR2BYTESTMPSTR2RUNESSLICE2ARRSLICE2ARRPTRASAS2AS2DOTTYPEAS2FUNCAS2MAPRAS2RECVASOPCALLCALLFUNCCALLMETHCALLINTERCAPCLEARCLOSECLOSURECOMPLITMAPLITSTRUCTLITARRAYLITSLICELITPTRLITCONVCONVIFACECONVIDATACONVNOPCOPYDCLDCLFUNCDCLCONSTDCLTYPEDELETEDOTDOTPTRDOTMETHDOTINTERXDOTDOTTYPEDOTTYPE2EQNELTLEGEGTDEREFINDEXINDEXMAPKEYSTRUCTKEYLENMAKEMAKECHANMAKEMAPMAKESLICEMAKESLICECOPYMULDIVMODLSHRSHANDANDNOTNEWNOTBITNOTPLUSNEGORORPANICPRINTPRINTNPARENSENDSLICESLICEARRSLICESTRSLICE3SLICE3ARRSLICEHEADERSTRINGHEADERRECOVERRECOVERFPRECVRUNESTRSELRECV2MINMAXREALIMAGCOMPLEXALIGNOFOFFSETOFSIZEOFUNSAFEADDUNSAFESLICEUNSAFESLICEDATAUNSAFESTRINGUNSAFESTRINGDATAMETHEXPRMETHVALUEBLOCKBREAKCASECONTINUEDEFERFALLFORGOTOIFLABELGORANGERETURNSELECTSWITCHTYPESWFUNCINSTINLCALLEFACEITABIDATASPTRCFUNCCHECKNILRESULTINLMARKLINKSYMOFFSETJUMPTABLEDYNAMICDOTTYPEDYNAMICDOTTYPE2DYNAMICTYPETAILCALLGETGGETCALLERPCGETCALLERSPEND"
 
-var _Op_index = [...]uint16{0, 3, 7, 13, 17, 24, 27, 30, 33, 35, 38, 44, 48, 54, 60, 69, 81, 90, 99, 111, 120, 129, 141, 143, 146, 156, 163, 170, 177, 181, 185, 193, 201, 210, 213, 218, 225, 232, 238, 247, 255, 263, 269, 273, 282, 291, 298, 302, 305, 312, 320, 327, 333, 336, 342, 349, 357, 361, 368, 376, 378, 380, 382, 384, 386, 388, 393, 398, 406, 409, 418, 421, 425, 433, 440, 449, 462, 465, 468, 471, 474, 477, 480, 486, 489, 492, 498, 502, 505, 509, 514, 519, 525, 530, 534, 539, 547, 555, 561, 570, 581, 593, 600, 609, 613, 620, 628, 632, 636, 643, 650, 658, 664, 673, 684, 699, 711, 727, 735, 744, 749, 754, 758, 766, 771, 775, 778, 782, 784, 789, 791, 796, 802, 808, 814, 820, 828, 835, 840, 844, 849, 853, 858, 866, 872, 879, 892, 901, 915, 930, 941, 949, 953, 964, 975, 978}
+var _Op_index = [...]uint16{0, 3, 7, 13, 17, 24, 27, 30, 33, 35, 38, 44, 48, 54, 60, 69, 81, 90, 99, 111, 120, 129, 141, 143, 146, 156, 163, 170, 177, 181, 185, 193, 201, 210, 213, 218, 223, 230, 237, 243, 252, 260, 268, 274, 278, 287, 296, 303, 307, 310, 317, 325, 332, 338, 341, 347, 354, 362, 366, 373, 381, 383, 385, 387, 389, 391, 393, 398, 403, 411, 414, 423, 426, 430, 438, 445, 454, 467, 470, 473, 476, 479, 482, 485, 491, 494, 497, 503, 507, 510, 514, 519, 524, 530, 535, 539, 544, 552, 560, 566, 575, 586, 598, 605, 614, 618, 625, 633, 636, 639, 643, 647, 654, 661, 669, 675, 684, 695, 710, 722, 738, 746, 755, 760, 765, 769, 777, 782, 786, 789, 793, 795, 800, 802, 807, 813, 819, 825, 831, 839, 846, 851, 855, 860, 864, 869, 877, 883, 890, 903, 912, 926, 941, 952, 960, 964, 975, 986, 989}
 
 func (i Op) String() string {
 	if i >= Op(len(_Op_index)-1) {
diff --git a/src/cmd/compile/internal/ir/sizeof_test.go b/src/cmd/compile/internal/ir/sizeof_test.go
index 754d1a8..307f40d 100644
--- a/src/cmd/compile/internal/ir/sizeof_test.go
+++ b/src/cmd/compile/internal/ir/sizeof_test.go
@@ -20,7 +20,7 @@
 		_32bit uintptr     // size on 32bit platforms
 		_64bit uintptr     // size on 64bit platforms
 	}{
-		{Func{}, 184, 320},
+		{Func{}, 188, 328},
 		{Name{}, 100, 176},
 	}
 
diff --git a/src/cmd/compile/internal/ir/stmt.go b/src/cmd/compile/internal/ir/stmt.go
index 9f2d04f..b6653ab 100644
--- a/src/cmd/compile/internal/ir/stmt.go
+++ b/src/cmd/compile/internal/ir/stmt.go
@@ -163,6 +163,15 @@
 	return n
 }
 
+func (n *BranchStmt) SetOp(op Op) {
+	switch op {
+	default:
+		panic(n.no("SetOp " + op.String()))
+	case OBREAK, OCONTINUE, OFALL, OGOTO:
+		n.op = op
+	}
+}
+
 func (n *BranchStmt) Sym() *types.Sym { return n.Label }
 
 // A CaseClause is a case statement in a switch or select: case List: Body.
@@ -207,14 +216,14 @@
 // A ForStmt is a non-range for loop: for Init; Cond; Post { Body }
 type ForStmt struct {
 	miniStmt
-	Label    *types.Sym
-	Cond     Node
-	Post     Node
-	Body     Nodes
-	HasBreak bool
+	Label        *types.Sym
+	Cond         Node
+	Post         Node
+	Body         Nodes
+	DistinctVars bool
 }
 
-func NewForStmt(pos src.XPos, init Node, cond, post Node, body []Node) *ForStmt {
+func NewForStmt(pos src.XPos, init Node, cond, post Node, body []Node, distinctVars bool) *ForStmt {
 	n := &ForStmt{Cond: cond, Post: post}
 	n.pos = pos
 	n.op = OFOR
@@ -222,6 +231,7 @@
 		n.init = []Node{init}
 	}
 	n.Body = body
+	n.DistinctVars = distinctVars
 	return n
 }
 
@@ -332,15 +342,15 @@
 // A RangeStmt is a range loop: for Key, Value = range X { Body }
 type RangeStmt struct {
 	miniStmt
-	Label    *types.Sym
-	Def      bool
-	X        Node
-	RType    Node `mknode:"-"` // see reflectdata/helpers.go
-	Key      Node
-	Value    Node
-	Body     Nodes
-	HasBreak bool
-	Prealloc *Name
+	Label        *types.Sym
+	Def          bool
+	X            Node
+	RType        Node `mknode:"-"` // see reflectdata/helpers.go
+	Key          Node
+	Value        Node
+	Body         Nodes
+	DistinctVars bool
+	Prealloc     *Name
 
 	// When desugaring the RangeStmt during walk, the assignments to Key
 	// and Value may require OCONVIFACE operations. If so, these fields
@@ -351,11 +361,12 @@
 	ValueSrcRType Node `mknode:"-"`
 }
 
-func NewRangeStmt(pos src.XPos, key, value, x Node, body []Node) *RangeStmt {
+func NewRangeStmt(pos src.XPos, key, value, x Node, body []Node, distinctVars bool) *RangeStmt {
 	n := &RangeStmt{X: x, Key: key, Value: value}
 	n.pos = pos
 	n.op = ORANGE
 	n.Body = body
+	n.DistinctVars = distinctVars
 	return n
 }
 
@@ -378,9 +389,8 @@
 // A SelectStmt is a block: { Cases }.
 type SelectStmt struct {
 	miniStmt
-	Label    *types.Sym
-	Cases    []*CommClause
-	HasBreak bool
+	Label *types.Sym
+	Cases []*CommClause
 
 	// TODO(rsc): Instead of recording here, replace with a block?
 	Compiled Nodes // compiled form, after walkSelect
@@ -410,10 +420,9 @@
 // A SwitchStmt is a switch statement: switch Init; Tag { Cases }.
 type SwitchStmt struct {
 	miniStmt
-	Tag      Node
-	Cases    []*CaseClause
-	Label    *types.Sym
-	HasBreak bool
+	Tag   Node
+	Cases []*CaseClause
+	Label *types.Sym
 
 	// TODO(rsc): Instead of recording here, replace with a block?
 	Compiled Nodes // compiled form, after walkSwitch
diff --git a/src/cmd/compile/internal/ir/symtab.go b/src/cmd/compile/internal/ir/symtab.go
index bde7a4c..6ee832e 100644
--- a/src/cmd/compile/internal/ir/symtab.go
+++ b/src/cmd/compile/internal/ir/symtab.go
@@ -17,13 +17,15 @@
 	AssertI2I2        *obj.LSym
 	Asanread          *obj.LSym
 	Asanwrite         *obj.LSym
+	CgoCheckMemmove   *obj.LSym
+	CgoCheckPtrWrite  *obj.LSym
 	CheckPtrAlignment *obj.LSym
 	Deferproc         *obj.LSym
 	DeferprocStack    *obj.LSym
 	Deferreturn       *obj.LSym
 	Duffcopy          *obj.LSym
 	Duffzero          *obj.LSym
-	GCWriteBarrier    *obj.LSym
+	GCWriteBarrier    [8]*obj.LSym
 	Goschedguarded    *obj.LSym
 	Growslice         *obj.LSym
 	Memmove           *obj.LSym
@@ -42,10 +44,11 @@
 	Racereadrange     *obj.LSym
 	Racewrite         *obj.LSym
 	Racewriterange    *obj.LSym
+	WBZero            *obj.LSym
+	WBMove            *obj.LSym
 	// Wasm
 	SigPanic        *obj.LSym
 	Staticuint64s   *obj.LSym
-	Typedmemclr     *obj.LSym
 	Typedmemmove    *obj.LSym
 	Udiv            *obj.LSym
 	WriteBarrier    *obj.LSym
diff --git a/src/cmd/compile/internal/ir/val.go b/src/cmd/compile/internal/ir/val.go
index 925222b..75da5a1 100644
--- a/src/cmd/compile/internal/ir/val.go
+++ b/src/cmd/compile/internal/ir/val.go
@@ -60,11 +60,6 @@
 	panic("unreachable")
 }
 
-// NewLiteral returns a new untyped constant with value v.
-func NewLiteral(v constant.Value) Node {
-	return NewBasicLit(base.Pos, v)
-}
-
 func idealType(ct constant.Kind) *types.Type {
 	switch ct {
 	case constant.String:
@@ -97,7 +92,7 @@
 	return x
 }
 
-// Uint64Val returns n as an uint64.
+// Uint64Val returns n as a uint64.
 // n must be an integer or rune constant.
 func Uint64Val(n Node) uint64 {
 	if !IsConst(n, constant.Int) {
diff --git a/src/cmd/compile/internal/ir/visit.go b/src/cmd/compile/internal/ir/visit.go
index 0164670..73ec1de 100644
--- a/src/cmd/compile/internal/ir/visit.go
+++ b/src/cmd/compile/internal/ir/visit.go
@@ -115,6 +115,17 @@
 	}
 }
 
+// VisitFuncAndClosures calls visit on each non-nil node in fn.Body,
+// including any nested closure bodies.
+func VisitFuncAndClosures(fn *Func, visit func(n Node)) {
+	VisitList(fn.Body, func(n Node) {
+		visit(n)
+		if n, ok := n.(*ClosureExpr); ok && n.Op() == OCLOSURE {
+			VisitFuncAndClosures(n.Func, visit)
+		}
+	})
+}
+
 // Any looks for a non-nil node x in the IR tree rooted at n
 // for which cond(x) returns true.
 // Any considers nodes in a depth-first, preorder traversal.
diff --git a/src/cmd/compile/internal/liveness/arg.go b/src/cmd/compile/internal/liveness/arg.go
index abbc8c9..6375e43 100644
--- a/src/cmd/compile/internal/liveness/arg.go
+++ b/src/cmd/compile/internal/liveness/arg.go
@@ -6,6 +6,7 @@
 
 import (
 	"fmt"
+	"internal/abi"
 
 	"cmd/compile/internal/base"
 	"cmd/compile/internal/bitvec"
@@ -13,7 +14,6 @@
 	"cmd/compile/internal/objw"
 	"cmd/compile/internal/ssa"
 	"cmd/internal/obj"
-	"cmd/internal/objabi"
 )
 
 // Argument liveness tracking.
@@ -221,7 +221,7 @@
 	//lv.print()
 
 	p := pp.Prog(obj.AFUNCDATA)
-	p.From.SetConst(objabi.FUNCDATA_ArgLiveInfo)
+	p.From.SetConst(abi.FUNCDATA_ArgLiveInfo)
 	p.To.Type = obj.TYPE_MEM
 	p.To.Name = obj.NAME_EXTERN
 	p.To.Sym = lsym
diff --git a/src/cmd/compile/internal/liveness/plive.go b/src/cmd/compile/internal/liveness/plive.go
index 689b528..169467e 100644
--- a/src/cmd/compile/internal/liveness/plive.go
+++ b/src/cmd/compile/internal/liveness/plive.go
@@ -31,8 +31,9 @@
 	"cmd/compile/internal/types"
 	"cmd/internal/notsha256"
 	"cmd/internal/obj"
-	"cmd/internal/objabi"
 	"cmd/internal/src"
+
+	rtabi "internal/abi"
 )
 
 // OpVarDef is an annotation for the liveness analysis, marking a place
@@ -469,143 +470,125 @@
 		}
 	}
 
-	// Mark write barrier unsafe points.
-	for _, wbBlock := range lv.f.WBLoads {
-		if wbBlock.Kind == ssa.BlockPlain && len(wbBlock.Values) == 0 {
-			// The write barrier block was optimized away
-			// but we haven't done dead block elimination.
-			// (This can happen in -N mode.)
-			continue
-		}
-		// Check that we have the expected diamond shape.
-		if len(wbBlock.Succs) != 2 {
-			lv.f.Fatalf("expected branch at write barrier block %v", wbBlock)
-		}
-		s0, s1 := wbBlock.Succs[0].Block(), wbBlock.Succs[1].Block()
-		if s0 == s1 {
-			// There's no difference between write barrier on and off.
-			// Thus there's no unsafe locations. See issue 26024.
-			continue
-		}
-		if s0.Kind != ssa.BlockPlain || s1.Kind != ssa.BlockPlain {
-			lv.f.Fatalf("expected successors of write barrier block %v to be plain", wbBlock)
-		}
-		if s0.Succs[0].Block() != s1.Succs[0].Block() {
-			lv.f.Fatalf("expected successors of write barrier block %v to converge", wbBlock)
-		}
-
-		// Flow backwards from the control value to find the
-		// flag load. We don't know what lowered ops we're
-		// looking for, but all current arches produce a
-		// single op that does the memory load from the flag
-		// address, so we look for that.
-		var load *ssa.Value
-		v := wbBlock.Controls[0]
-		for {
-			if sym, ok := v.Aux.(*obj.LSym); ok && sym == ir.Syms.WriteBarrier {
-				load = v
-				break
+	for _, b := range lv.f.Blocks {
+		for _, v := range b.Values {
+			if v.Op != ssa.OpWBend {
+				continue
 			}
-			switch v.Op {
-			case ssa.Op386TESTL:
-				// 386 lowers Neq32 to (TESTL cond cond),
-				if v.Args[0] == v.Args[1] {
+			// WBend appears at the start of a block, like this:
+			//    ...
+			//    if wbEnabled: goto C else D
+			// C:
+			//    ... some write barrier enabled code ...
+			//    goto B
+			// D:
+			//    ... some write barrier disabled code ...
+			//    goto B
+			// B:
+			//    m1 = Phi mem_C mem_D
+			//    m2 = store operation ... m1
+			//    m3 = store operation ... m2
+			//    m4 = WBend m3
+			//
+			// (For now m2 and m3 won't be present.)
+
+			// Find first memory op in the block, which should be a Phi.
+			m := v
+			for {
+				m = m.MemoryArg()
+				if m.Block != b {
+					lv.f.Fatalf("can't find Phi before write barrier end mark %v", v)
+				}
+				if m.Op == ssa.OpPhi {
+					break
+				}
+			}
+			// Find the two predecessor blocks (write barrier on and write barrier off)
+			if len(m.Args) != 2 {
+				lv.f.Fatalf("phi before write barrier end mark has %d args, want 2", len(m.Args))
+			}
+			c := b.Preds[0].Block()
+			d := b.Preds[1].Block()
+
+			// Find their common predecessor block (the one that branches based on wb on/off).
+			// It might be a diamond pattern, or one of the blocks in the diamond pattern might
+			// be missing.
+			var decisionBlock *ssa.Block
+			if len(c.Preds) == 1 && c.Preds[0].Block() == d {
+				decisionBlock = d
+			} else if len(d.Preds) == 1 && d.Preds[0].Block() == c {
+				decisionBlock = c
+			} else if len(c.Preds) == 1 && len(d.Preds) == 1 && c.Preds[0].Block() == d.Preds[0].Block() {
+				decisionBlock = c.Preds[0].Block()
+			} else {
+				lv.f.Fatalf("can't find write barrier pattern %v", v)
+			}
+			if len(decisionBlock.Succs) != 2 {
+				lv.f.Fatalf("common predecessor block the wrong type %s", decisionBlock.Kind)
+			}
+
+			// Flow backwards from the control value to find the
+			// flag load. We don't know what lowered ops we're
+			// looking for, but all current arches produce a
+			// single op that does the memory load from the flag
+			// address, so we look for that.
+			var load *ssa.Value
+			v := decisionBlock.Controls[0]
+			for {
+				if sym, ok := v.Aux.(*obj.LSym); ok && sym == ir.Syms.WriteBarrier {
+					load = v
+					break
+				}
+				switch v.Op {
+				case ssa.Op386TESTL:
+					// 386 lowers Neq32 to (TESTL cond cond),
+					if v.Args[0] == v.Args[1] {
+						v = v.Args[0]
+						continue
+					}
+				case ssa.Op386MOVLload, ssa.OpARM64MOVWUload, ssa.OpMIPS64MOVWUload, ssa.OpPPC64MOVWZload, ssa.OpWasmI64Load32U:
+					// Args[0] is the address of the write
+					// barrier control. Ignore Args[1],
+					// which is the mem operand.
+					// TODO: Just ignore mem operands?
 					v = v.Args[0]
 					continue
 				}
-			case ssa.Op386MOVLload, ssa.OpARM64MOVWUload, ssa.OpPPC64MOVWZload, ssa.OpWasmI64Load32U:
-				// Args[0] is the address of the write
-				// barrier control. Ignore Args[1],
-				// which is the mem operand.
-				// TODO: Just ignore mem operands?
+				// Common case: just flow backwards.
+				if len(v.Args) != 1 {
+					v.Fatalf("write barrier control value has more than one argument: %s", v.LongString())
+				}
 				v = v.Args[0]
-				continue
 			}
-			// Common case: just flow backwards.
-			if len(v.Args) != 1 {
-				v.Fatalf("write barrier control value has more than one argument: %s", v.LongString())
-			}
-			v = v.Args[0]
-		}
 
-		// Mark everything after the load unsafe.
-		found := false
-		for _, v := range wbBlock.Values {
-			found = found || v == load
-			if found {
+			// Mark everything after the load unsafe.
+			found := false
+			for _, v := range decisionBlock.Values {
+				found = found || v == load
+				if found {
+					lv.unsafePoints.Set(int32(v.ID))
+				}
+			}
+
+			// Mark the write barrier on/off blocks as unsafe.
+			for _, e := range decisionBlock.Succs {
+				x := e.Block()
+				if x == b {
+					continue
+				}
+				for _, v := range x.Values {
+					lv.unsafePoints.Set(int32(v.ID))
+				}
+			}
+
+			// Mark from the join point up to the WBend as unsafe.
+			for _, v := range b.Values {
 				lv.unsafePoints.Set(int32(v.ID))
+				if v.Op == ssa.OpWBend {
+					break
+				}
 			}
 		}
-
-		// Mark the two successor blocks unsafe. These come
-		// back together immediately after the direct write in
-		// one successor and the last write barrier call in
-		// the other, so there's no need to be more precise.
-		for _, succ := range wbBlock.Succs {
-			for _, v := range succ.Block().Values {
-				lv.unsafePoints.Set(int32(v.ID))
-			}
-		}
-	}
-
-	// Find uintptr -> unsafe.Pointer conversions and flood
-	// unsafeness back to a call (which is always a safe point).
-	//
-	// Looking for the uintptr -> unsafe.Pointer conversion has a
-	// few advantages over looking for unsafe.Pointer -> uintptr
-	// conversions:
-	//
-	// 1. We avoid needlessly blocking safe-points for
-	// unsafe.Pointer -> uintptr conversions that never go back to
-	// a Pointer.
-	//
-	// 2. We don't have to detect calls to reflect.Value.Pointer,
-	// reflect.Value.UnsafeAddr, and reflect.Value.InterfaceData,
-	// which are implicit unsafe.Pointer -> uintptr conversions.
-	// We can't even reliably detect this if there's an indirect
-	// call to one of these methods.
-	//
-	// TODO: For trivial unsafe.Pointer arithmetic, it would be
-	// nice to only flood as far as the unsafe.Pointer -> uintptr
-	// conversion, but it's hard to know which argument of an Add
-	// or Sub to follow.
-	var flooded bitvec.BitVec
-	var flood func(b *ssa.Block, vi int)
-	flood = func(b *ssa.Block, vi int) {
-		if flooded.N == 0 {
-			flooded = bitvec.New(int32(lv.f.NumBlocks()))
-		}
-		if flooded.Get(int32(b.ID)) {
-			return
-		}
-		for i := vi - 1; i >= 0; i-- {
-			v := b.Values[i]
-			if v.Op.IsCall() {
-				// Uintptrs must not contain live
-				// pointers across calls, so stop
-				// flooding.
-				return
-			}
-			lv.unsafePoints.Set(int32(v.ID))
-		}
-		if vi == len(b.Values) {
-			// We marked all values in this block, so no
-			// need to flood this block again.
-			flooded.Set(int32(b.ID))
-		}
-		for _, pred := range b.Preds {
-			flood(pred.Block(), len(pred.Block().Values))
-		}
-	}
-	for _, b := range lv.f.Blocks {
-		for i, v := range b.Values {
-			if !(v.Op == ssa.OpConvert && v.Type.IsPtrShaped()) {
-				continue
-			}
-			// Flood the unsafe-ness of this backwards
-			// until we hit a call.
-			flood(b, i+1)
-		}
 	}
 }
 
@@ -618,10 +601,10 @@
 	if !v.Op.IsCall() {
 		return false
 	}
-	// typedmemclr and typedmemmove are write barriers and
+	// wbZero and wbCopy are write barriers and
 	// deeply non-preemptible. They are unsafe points and
 	// hence should not have liveness maps.
-	if sym, ok := v.Aux.(*ssa.AuxCall); ok && (sym.Fn == ir.Syms.Typedmemclr || sym.Fn == ir.Syms.Typedmemmove) {
+	if sym, ok := v.Aux.(*ssa.AuxCall); ok && (sym.Fn == ir.Syms.WBZero || sym.Fn == ir.Syms.WBMove) {
 		return false
 	}
 	return true
@@ -1106,11 +1089,18 @@
 		s += "indirect call:"
 	}
 
+	// Sort variable names for display. Variables aren't in any particular order, and
+	// the order can change by architecture, particularly with differences in regabi.
+	var names []string
 	for j, n := range lv.vars {
 		if live.Get(int32(j)) {
-			s += fmt.Sprintf(" %v", n)
+			names = append(names, n.Sym().Name)
 		}
 	}
+	sort.Strings(names)
+	for _, v := range names {
+		s += " " + v
+	}
 
 	base.WarnfAt(pos, s)
 }
@@ -1372,20 +1362,20 @@
 	fninfo.GCArgs, fninfo.GCLocals = lv.emit()
 
 	p := pp.Prog(obj.AFUNCDATA)
-	p.From.SetConst(objabi.FUNCDATA_ArgsPointerMaps)
+	p.From.SetConst(rtabi.FUNCDATA_ArgsPointerMaps)
 	p.To.Type = obj.TYPE_MEM
 	p.To.Name = obj.NAME_EXTERN
 	p.To.Sym = fninfo.GCArgs
 
 	p = pp.Prog(obj.AFUNCDATA)
-	p.From.SetConst(objabi.FUNCDATA_LocalsPointerMaps)
+	p.From.SetConst(rtabi.FUNCDATA_LocalsPointerMaps)
 	p.To.Type = obj.TYPE_MEM
 	p.To.Name = obj.NAME_EXTERN
 	p.To.Sym = fninfo.GCLocals
 
 	if x := lv.emitStackObjects(); x != nil {
 		p := pp.Prog(obj.AFUNCDATA)
-		p.From.SetConst(objabi.FUNCDATA_StackObjects)
+		p.From.SetConst(rtabi.FUNCDATA_StackObjects)
 		p.To.Type = obj.TYPE_MEM
 		p.To.Name = obj.NAME_EXTERN
 		p.To.Sym = x
diff --git a/src/cmd/compile/internal/logopt/log_opts.go b/src/cmd/compile/internal/logopt/log_opts.go
index d0be4d8..b731e55 100644
--- a/src/cmd/compile/internal/logopt/log_opts.go
+++ b/src/cmd/compile/internal/logopt/log_opts.go
@@ -225,6 +225,7 @@
 // to be converted to JSON for human or IDE consumption.
 type LoggedOpt struct {
 	pos          src.XPos      // Source code position at which the event occurred. If it is inlined, outer and all inlined locations will appear in JSON.
+	lastPos      src.XPos      // Usually the same as pos; current exception is for reporting entire range of transformed loops
 	compilerPass string        // Compiler pass.  For human/adhoc consumption; does not appear in JSON (yet)
 	functionName string        // Function name.  For human/adhoc consumption; does not appear in JSON (yet)
 	what         string        // The (non) optimization; "nilcheck", "boundsCheck", "inline", "noInline"
@@ -324,9 +325,9 @@
 // Pos is the source position (including inlining), what is the message, pass is which pass created the message,
 // funcName is the name of the function
 // A typical use for this to accumulate an explanation for a missed optimization, for example, why did something escape?
-func NewLoggedOpt(pos src.XPos, what, pass, funcName string, args ...interface{}) *LoggedOpt {
+func NewLoggedOpt(pos, lastPos src.XPos, what, pass, funcName string, args ...interface{}) *LoggedOpt {
 	pass = strings.Replace(pass, " ", "_", -1)
-	return &LoggedOpt{pos, pass, funcName, what, args}
+	return &LoggedOpt{pos, lastPos, pass, funcName, what, args}
 }
 
 // LogOpt logs information about a (usually missed) optimization performed by the compiler.
@@ -336,7 +337,20 @@
 	if Format == None {
 		return
 	}
-	lo := NewLoggedOpt(pos, what, pass, funcName, args...)
+	lo := NewLoggedOpt(pos, pos, what, pass, funcName, args...)
+	mu.Lock()
+	defer mu.Unlock()
+	// Because of concurrent calls from back end, no telling what the order will be, but is stable-sorted by outer Pos before use.
+	loggedOpts = append(loggedOpts, lo)
+}
+
+// LogOptRange is the same as LogOpt, but includes the ability to express a range of positions,
+// not just a point.
+func LogOptRange(pos, lastPos src.XPos, what, pass, funcName string, args ...interface{}) {
+	if Format == None {
+		return
+	}
+	lo := NewLoggedOpt(pos, lastPos, what, pass, funcName, args...)
 	mu.Lock()
 	defer mu.Unlock()
 	// Because of concurrent calls from back end, no telling what the order will be, but is stable-sorted by outer Pos before use.
@@ -424,7 +438,7 @@
 	switch Format {
 
 	case Json0: // LSP 3.15
-		var posTmp []src.Pos
+		var posTmp, lastTmp []src.Pos
 		var encoder *json.Encoder
 		var w io.WriteCloser
 
@@ -441,7 +455,8 @@
 		// For LSP, make a subdirectory for the package, and for each file foo.go, create foo.json in that subdirectory.
 		currentFile := ""
 		for _, x := range loggedOpts {
-			posTmp, p0 := x.parsePos(ctxt, posTmp)
+			posTmp, p0 := parsePos(ctxt, x.pos, posTmp)
+			lastTmp, l0 := parsePos(ctxt, x.lastPos, lastTmp) // These match posTmp/p0 except for most-inline, and that often also matches.
 			p0f := uprootedPath(p0.Filename())
 
 			if currentFile != p0f {
@@ -462,25 +477,26 @@
 
 			diagnostic.Code = x.what
 			diagnostic.Message = target
-			diagnostic.Range = newPointRange(p0)
+			diagnostic.Range = newRange(p0, l0)
 			diagnostic.RelatedInformation = diagnostic.RelatedInformation[:0]
 
-			appendInlinedPos(posTmp, &diagnostic)
+			appendInlinedPos(posTmp, lastTmp, &diagnostic)
 
 			// Diagnostic explanation is stored in RelatedInformation after inlining info
 			if len(x.target) > 1 {
 				switch y := x.target[1].(type) {
 				case []*LoggedOpt:
 					for _, z := range y {
-						posTmp, p0 := z.parsePos(ctxt, posTmp)
-						loc := newLocation(p0)
+						posTmp, p0 := parsePos(ctxt, z.pos, posTmp)
+						lastTmp, l0 := parsePos(ctxt, z.lastPos, lastTmp)
+						loc := newLocation(p0, l0)
 						msg := z.what
 						if len(z.target) > 0 {
 							msg = msg + ": " + fmt.Sprint(z.target[0])
 						}
 
 						diagnostic.RelatedInformation = append(diagnostic.RelatedInformation, DiagnosticRelatedInformation{Location: loc, Message: msg})
-						appendInlinedPos(posTmp, &diagnostic)
+						appendInlinedPos(posTmp, lastTmp, &diagnostic)
 					}
 				}
 			}
@@ -493,34 +509,32 @@
 	}
 }
 
-// newPointRange returns a single-position Range for the compiler source location p.
-func newPointRange(p src.Pos) Range {
+// newRange returns a single-position Range for the compiler source location p.
+func newRange(p, last src.Pos) Range {
 	return Range{Start: Position{p.Line(), p.Col()},
-		End: Position{p.Line(), p.Col()}}
+		End: Position{last.Line(), last.Col()}}
 }
 
 // newLocation returns the Location for the compiler source location p.
-func newLocation(p src.Pos) Location {
-	loc := Location{URI: uriIfy(uprootedPath(p.Filename())), Range: newPointRange(p)}
+func newLocation(p, last src.Pos) Location {
+	loc := Location{URI: uriIfy(uprootedPath(p.Filename())), Range: newRange(p, last)}
 	return loc
 }
 
 // appendInlinedPos extracts inlining information from posTmp and append it to diagnostic.
-func appendInlinedPos(posTmp []src.Pos, diagnostic *Diagnostic) {
+func appendInlinedPos(posTmp, lastTmp []src.Pos, diagnostic *Diagnostic) {
 	for i := 1; i < len(posTmp); i++ {
-		p := posTmp[i]
-		loc := newLocation(p)
+		loc := newLocation(posTmp[i], lastTmp[i])
 		diagnostic.RelatedInformation = append(diagnostic.RelatedInformation, DiagnosticRelatedInformation{Location: loc, Message: "inlineLoc"})
 	}
 }
 
-func (x *LoggedOpt) parsePos(ctxt *obj.Link, posTmp []src.Pos) ([]src.Pos, src.Pos) {
-	posTmp = ctxt.AllPos(x.pos, posTmp)
-	// Reverse posTmp to put outermost first.
-	l := len(posTmp)
-	for i := 0; i < l/2; i++ {
-		posTmp[i], posTmp[l-i-1] = posTmp[l-i-1], posTmp[i]
-	}
-	p0 := posTmp[0]
-	return posTmp, p0
+// parsePos expands a src.XPos into a slice of src.Pos, with the outermost first.
+// It returns the slice, and the outermost.
+func parsePos(ctxt *obj.Link, pos src.XPos, posTmp []src.Pos) ([]src.Pos, src.Pos) {
+	posTmp = posTmp[:0]
+	ctxt.AllPos(pos, func(p src.Pos) {
+		posTmp = append(posTmp, p)
+	})
+	return posTmp, posTmp[0]
 }
diff --git a/src/cmd/compile/internal/logopt/logopt_test.go b/src/cmd/compile/internal/logopt/logopt_test.go
index eb5c313..1c48351 100644
--- a/src/cmd/compile/internal/logopt/logopt_test.go
+++ b/src/cmd/compile/internal/logopt/logopt_test.go
@@ -86,13 +86,7 @@
 
 	testenv.MustHaveGoBuild(t)
 
-	dir, err := os.MkdirTemp("", "TestLogOpt")
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer os.RemoveAll(dir)
-
-	dir = fixSlash(dir) // Normalize the directory name as much as possible, for Windows testing
+	dir := fixSlash(t.TempDir()) // Normalize the directory name as much as possible, for Windows testing
 	src := filepath.Join(dir, "file.go")
 	if err := os.WriteFile(src, []byte(srcCode), 0644); err != nil {
 		t.Fatal(err)
diff --git a/src/cmd/compile/internal/loong64/ggen.go b/src/cmd/compile/internal/loong64/ggen.go
index c6fd1a6..8a24d2f 100644
--- a/src/cmd/compile/internal/loong64/ggen.go
+++ b/src/cmd/compile/internal/loong64/ggen.go
@@ -50,10 +50,6 @@
 }
 
 func ginsnop(pp *objw.Progs) *obj.Prog {
-	p := pp.Prog(loong64.ANOR)
-	p.From.Type = obj.TYPE_REG
-	p.From.Reg = loong64.REG_R0
-	p.To.Type = obj.TYPE_REG
-	p.To.Reg = loong64.REG_R0
+	p := pp.Prog(loong64.ANOOP)
 	return p
 }
diff --git a/src/cmd/compile/internal/loong64/ssa.go b/src/cmd/compile/internal/loong64/ssa.go
index 59f9e18..8193b4e 100644
--- a/src/cmd/compile/internal/loong64/ssa.go
+++ b/src/cmd/compile/internal/loong64/ssa.go
@@ -140,7 +140,9 @@
 		ssa.OpLOONG64MULF,
 		ssa.OpLOONG64MULD,
 		ssa.OpLOONG64DIVF,
-		ssa.OpLOONG64DIVD:
+		ssa.OpLOONG64DIVD,
+		ssa.OpLOONG64MULV, ssa.OpLOONG64MULHV, ssa.OpLOONG64MULHVU,
+		ssa.OpLOONG64DIVV, ssa.OpLOONG64REMV, ssa.OpLOONG64DIVVU, ssa.OpLOONG64REMVU:
 		p := s.Prog(v.Op.Asm())
 		p.From.Type = obj.TYPE_REG
 		p.From.Reg = v.Args[1].Reg()
@@ -174,58 +176,6 @@
 		p.Reg = v.Args[0].Reg()
 		p.To.Type = obj.TYPE_REG
 		p.To.Reg = v.Reg()
-	case ssa.OpLOONG64MULV:
-		p := s.Prog(loong64.AMULV)
-		p.From.Type = obj.TYPE_REG
-		p.From.Reg = v.Args[1].Reg()
-		p.Reg = v.Args[0].Reg()
-		p.To.Type = obj.TYPE_REG
-		p.To.Reg = v.Reg1()
-		p1 := s.Prog(loong64.AMULHV)
-		p1.From.Type = obj.TYPE_REG
-		p1.From.Reg = v.Args[1].Reg()
-		p1.Reg = v.Args[0].Reg()
-		p1.To.Type = obj.TYPE_REG
-		p1.To.Reg = v.Reg0()
-	case ssa.OpLOONG64MULVU:
-		p := s.Prog(loong64.AMULV)
-		p.From.Type = obj.TYPE_REG
-		p.From.Reg = v.Args[1].Reg()
-		p.Reg = v.Args[0].Reg()
-		p.To.Type = obj.TYPE_REG
-		p.To.Reg = v.Reg1()
-		p1 := s.Prog(loong64.AMULHVU)
-		p1.From.Type = obj.TYPE_REG
-		p1.From.Reg = v.Args[1].Reg()
-		p1.Reg = v.Args[0].Reg()
-		p1.To.Type = obj.TYPE_REG
-		p1.To.Reg = v.Reg0()
-	case ssa.OpLOONG64DIVV:
-		p := s.Prog(loong64.ADIVV)
-		p.From.Type = obj.TYPE_REG
-		p.From.Reg = v.Args[1].Reg()
-		p.Reg = v.Args[0].Reg()
-		p.To.Type = obj.TYPE_REG
-		p.To.Reg = v.Reg1()
-		p1 := s.Prog(loong64.AREMV)
-		p1.From.Type = obj.TYPE_REG
-		p1.From.Reg = v.Args[1].Reg()
-		p1.Reg = v.Args[0].Reg()
-		p1.To.Type = obj.TYPE_REG
-		p1.To.Reg = v.Reg0()
-	case ssa.OpLOONG64DIVVU:
-		p := s.Prog(loong64.ADIVVU)
-		p.From.Type = obj.TYPE_REG
-		p.From.Reg = v.Args[1].Reg()
-		p.Reg = v.Args[0].Reg()
-		p.To.Type = obj.TYPE_REG
-		p.To.Reg = v.Reg1()
-		p1 := s.Prog(loong64.AREMVU)
-		p1.From.Type = obj.TYPE_REG
-		p1.From.Reg = v.Args[1].Reg()
-		p1.Reg = v.Args[0].Reg()
-		p1.To.Type = obj.TYPE_REG
-		p1.To.Reg = v.Reg0()
 	case ssa.OpLOONG64MOVVconst:
 		r := v.Reg()
 		p := s.Prog(v.Op.Asm())
@@ -516,7 +466,8 @@
 		p := s.Prog(obj.ACALL)
 		p.To.Type = obj.TYPE_MEM
 		p.To.Name = obj.NAME_EXTERN
-		p.To.Sym = v.Aux.(*obj.LSym)
+		// AuxInt encodes how many buffer entries we need.
+		p.To.Sym = ir.Syms.GCWriteBarrier[v.AuxInt-1]
 	case ssa.OpLOONG64LoweredPanicBoundsA, ssa.OpLOONG64LoweredPanicBoundsB, ssa.OpLOONG64LoweredPanicBoundsC:
 		p := s.Prog(obj.ACALL)
 		p.To.Type = obj.TYPE_MEM
diff --git a/src/cmd/compile/internal/loopvar/loopvar.go b/src/cmd/compile/internal/loopvar/loopvar.go
new file mode 100644
index 0000000..43f081c
--- /dev/null
+++ b/src/cmd/compile/internal/loopvar/loopvar.go
@@ -0,0 +1,623 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package loopvar applies the proper variable capture, according
+// to experiment, flags, language version, etc.
+package loopvar
+
+import (
+	"cmd/compile/internal/base"
+	"cmd/compile/internal/ir"
+	"cmd/compile/internal/logopt"
+	"cmd/compile/internal/typecheck"
+	"cmd/compile/internal/types"
+	"cmd/internal/src"
+	"fmt"
+)
+
+type VarAndLoop struct {
+	Name    *ir.Name
+	Loop    ir.Node  // the *ir.RangeStmt or *ir.ForStmt. Used for identity and position
+	LastPos src.XPos // the last position observed within Loop
+}
+
+// ForCapture transforms for and range loops that declare variables that might be
+// captured by a closure or escaped to the heap, using a syntactic check that
+// conservatively overestimates the loops where capture occurs, but still avoids
+// transforming the (large) majority of loops. It returns the list of names
+// subject to this change, that may (once transformed) be heap allocated in the
+// process. (This allows checking after escape analysis to call out any such
+// variables, in case it causes allocation/performance problems).
+//
+// The decision to transform loops is normally encoded in the For/Range loop node
+// field DistinctVars but is also dependent on base.LoopVarHash, and some values
+// of base.Debug.LoopVar (which is set per-package).  Decisions encoded in DistinctVars
+// are preserved across inlining, so if package a calls b.F and loops in b.F are
+// transformed, then they are always transformed, whether b.F is inlined or not.
+//
+// Per-package, the debug flag settings that affect this transformer:
+//
+// base.LoopVarHash != nil => use hash setting to govern transformation.
+// note that LoopVarHash != nil sets base.Debug.LoopVar to 1 (unless it is >= 11, for testing/debugging).
+//
+// base.Debug.LoopVar == 11 => transform ALL loops ignoring syntactic/potential escape. Do not log, can be in addition to GOEXPERIMENT.
+//
+// The effect of GOEXPERIMENT=loopvar is to change the default value (0) of base.Debug.LoopVar to 1 for all packages.
+func ForCapture(fn *ir.Func) []VarAndLoop {
+	// if a loop variable is transformed it is appended to this slice for later logging
+	var transformed []VarAndLoop
+
+	describe := func(n *ir.Name) string {
+		pos := n.Pos()
+		inner := base.Ctxt.InnermostPos(pos)
+		outer := base.Ctxt.OutermostPos(pos)
+		if inner == outer {
+			return fmt.Sprintf("loop variable %v now per-iteration", n)
+		}
+		return fmt.Sprintf("loop variable %v now per-iteration (loop inlined into %s:%d)", n, outer.Filename(), outer.Line())
+	}
+
+	forCapture := func() {
+		seq := 1
+
+		dclFixups := make(map[*ir.Name]ir.Stmt)
+
+		// possibly leaked includes names of declared loop variables that may be leaked;
+		// the mapped value is true if the name is *syntactically* leaked, and those loops
+		// will be transformed.
+		possiblyLeaked := make(map[*ir.Name]bool)
+
+		// these enable an optimization of "escape" under return statements
+		loopDepth := 0
+		returnInLoopDepth := 0
+
+		// noteMayLeak is called for candidate variables in for range/3-clause, and
+		// adds them (mapped to false) to possiblyLeaked.
+		noteMayLeak := func(x ir.Node) {
+			if n, ok := x.(*ir.Name); ok {
+				if n.Type().Kind() == types.TBLANK {
+					return
+				}
+				// default is false (leak candidate, not yet known to leak), but flag can make all variables "leak"
+				possiblyLeaked[n] = base.Debug.LoopVar >= 11
+			}
+		}
+
+		// For reporting, keep track of the last position within any loop.
+		// Loops nest, also need to be sensitive to inlining.
+		var lastPos src.XPos
+
+		updateLastPos := func(p src.XPos) {
+			pl, ll := p.Line(), lastPos.Line()
+			if p.SameFile(lastPos) &&
+				(pl > ll || pl == ll && p.Col() > lastPos.Col()) {
+				lastPos = p
+			}
+		}
+
+		// maybeReplaceVar unshares an iteration variable for a range loop,
+		// if that variable was actually (syntactically) leaked,
+		// subject to hash-variable debugging.
+		maybeReplaceVar := func(k ir.Node, x *ir.RangeStmt) ir.Node {
+			if n, ok := k.(*ir.Name); ok && possiblyLeaked[n] {
+				desc := func() string {
+					return describe(n)
+				}
+				if base.LoopVarHash.MatchPos(n.Pos(), desc) {
+					// Rename the loop key, prefix body with assignment from loop key
+					transformed = append(transformed, VarAndLoop{n, x, lastPos})
+					tk := typecheck.Temp(n.Type())
+					tk.SetTypecheck(1)
+					as := ir.NewAssignStmt(x.Pos(), n, tk)
+					as.Def = true
+					as.SetTypecheck(1)
+					x.Body.Prepend(as)
+					dclFixups[n] = as
+					return tk
+				}
+			}
+			return k
+		}
+
+		// scanChildrenThenTransform processes node x to:
+		//  1. if x is a for/range w/ DistinctVars, note declared iteration variables possiblyLeaked (PL)
+		//  2. search all of x's children for syntactically escaping references to v in PL,
+		//     meaning either address-of-v or v-captured-by-a-closure
+		//  3. for all v in PL that had a syntactically escaping reference, transform the declaration
+		//     and (in case of 3-clause loop) the loop to the unshared loop semantics.
+		//  This is all much simpler for range loops; 3-clause loops can have an arbitrary number
+		//  of iteration variables and the transformation is more involved, range loops have at most 2.
+		var scanChildrenThenTransform func(x ir.Node) bool
+		scanChildrenThenTransform = func(n ir.Node) bool {
+
+			if loopDepth > 0 {
+				updateLastPos(n.Pos())
+			}
+
+			switch x := n.(type) {
+			case *ir.ClosureExpr:
+				if returnInLoopDepth >= loopDepth {
+					// This expression is a child of a return, which escapes all loops above
+					// the return, but not those between this expression and the return.
+					break
+				}
+				for _, cv := range x.Func.ClosureVars {
+					v := cv.Canonical()
+					if _, ok := possiblyLeaked[v]; ok {
+						possiblyLeaked[v] = true
+					}
+				}
+
+			case *ir.AddrExpr:
+				if returnInLoopDepth >= loopDepth {
+					// This expression is a child of a return, which escapes all loops above
+					// the return, but not those between this expression and the return.
+					break
+				}
+				// Explicitly note address-taken so that return-statements can be excluded
+				y := ir.OuterValue(x.X)
+				if y.Op() != ir.ONAME {
+					break
+				}
+				z, ok := y.(*ir.Name)
+				if !ok {
+					break
+				}
+				switch z.Class {
+				case ir.PAUTO, ir.PPARAM, ir.PPARAMOUT, ir.PAUTOHEAP:
+					if _, ok := possiblyLeaked[z]; ok {
+						possiblyLeaked[z] = true
+					}
+				}
+
+			case *ir.ReturnStmt:
+				savedRILD := returnInLoopDepth
+				returnInLoopDepth = loopDepth
+				defer func() { returnInLoopDepth = savedRILD }()
+
+			case *ir.RangeStmt:
+				if !(x.Def && x.DistinctVars) {
+					// range loop must define its iteration variables AND have distinctVars.
+					x.DistinctVars = false
+					break
+				}
+				noteMayLeak(x.Key)
+				noteMayLeak(x.Value)
+				loopDepth++
+				savedLastPos := lastPos
+				lastPos = x.Pos() // this sets the file.
+				ir.DoChildren(n, scanChildrenThenTransform)
+				loopDepth--
+				x.Key = maybeReplaceVar(x.Key, x)
+				x.Value = maybeReplaceVar(x.Value, x)
+				thisLastPos := lastPos
+				lastPos = savedLastPos
+				updateLastPos(thisLastPos) // this will propagate lastPos if in the same file.
+				x.DistinctVars = false
+				return false
+
+			case *ir.ForStmt:
+				if !x.DistinctVars {
+					break
+				}
+				forAllDefInInit(x, noteMayLeak)
+				loopDepth++
+				savedLastPos := lastPos
+				lastPos = x.Pos() // this sets the file.
+				ir.DoChildren(n, scanChildrenThenTransform)
+				loopDepth--
+				var leaked []*ir.Name
+				// Collect the leaking variables for the much-more-complex transformation.
+				forAllDefInInit(x, func(z ir.Node) {
+					if n, ok := z.(*ir.Name); ok && possiblyLeaked[n] {
+						desc := func() string {
+							return describe(n)
+						}
+						// Hash on n.Pos() for most precise failure location.
+						if base.LoopVarHash.MatchPos(n.Pos(), desc) {
+							leaked = append(leaked, n)
+						}
+					}
+				})
+
+				if len(leaked) > 0 {
+					// need to transform the for loop just so.
+
+					/* Contrived example, w/ numbered comments from the transformation:
+									BEFORE:
+										var escape []*int
+										for z := 0; z < n; z++ {
+											if reason() {
+												escape = append(escape, &z)
+												continue
+											}
+											z = z + z
+											stuff
+										}
+									AFTER:
+										for z', tmp_first := 0, true; ; { // (4)
+											                              // (5) body' follows:
+											z := z'                       // (1)
+											if tmp_first {tmp_first = false} else {z++} // (6)
+											if ! (z < n) { break }        // (7)
+											                              // (3, 8) body_continue
+											if reason() {
+					                            escape = append(escape, &z)
+												goto next                 // rewritten continue
+											}
+											z = z + z
+											stuff
+										next:                             // (9)
+											z' = z                       // (2)
+										}
+
+										In the case that the loop contains no increment (z++),
+										there is no need for step 6,
+										and thus no need to test, update, or declare tmp_first (part of step 4).
+										Similarly if the loop contains no exit test (z < n),
+										then there is no need for step 7.
+					*/
+
+					// Expressed in terms of the input ForStmt
+					//
+					// 	type ForStmt struct {
+					// 	init     Nodes
+					// 	Label    *types.Sym
+					// 	Cond     Node  // empty if OFORUNTIL
+					// 	Post     Node
+					// 	Body     Nodes
+					// 	HasBreak bool
+					// }
+
+					// OFOR: init; loop: if !Cond {break}; Body; Post; goto loop
+
+					// (1) prebody = {z := z' for z in leaked}
+					// (2) postbody = {z' = z for z in leaked}
+					// (3) body_continue = {body : s/continue/goto next}
+					// (4) init' = (init : s/z/z' for z in leaked) + tmp_first := true
+					// (5) body' = prebody +        // appears out of order below
+					// (6)         if tmp_first {tmp_first = false} else {Post} +
+					// (7)         if !cond {break} +
+					// (8)         body_continue (3) +
+					// (9)         next: postbody (2)
+					// (10) cond' = {}
+					// (11) post' = {}
+
+					// minor optimizations:
+					//   if Post is empty, tmp_first and step 6 can be skipped.
+					//   if Cond is empty, that code can also be skipped.
+
+					var preBody, postBody ir.Nodes
+
+					// Given original iteration variable z, what is the corresponding z'
+					// that carries the value from iteration to iteration?
+					zPrimeForZ := make(map[*ir.Name]*ir.Name)
+
+					// (1,2) initialize preBody and postBody
+					for _, z := range leaked {
+						transformed = append(transformed, VarAndLoop{z, x, lastPos})
+
+						tz := typecheck.Temp(z.Type())
+						tz.SetTypecheck(1)
+						zPrimeForZ[z] = tz
+
+						as := ir.NewAssignStmt(x.Pos(), z, tz)
+						as.Def = true
+						as.SetTypecheck(1)
+						preBody.Append(as)
+						dclFixups[z] = as
+
+						as = ir.NewAssignStmt(x.Pos(), tz, z)
+						as.SetTypecheck(1)
+						postBody.Append(as)
+
+					}
+
+					// (3) rewrite continues in body -- rewrite is inplace, so works for top level visit, too.
+					label := typecheck.Lookup(fmt.Sprintf(".3clNext_%d", seq))
+					seq++
+					labelStmt := ir.NewLabelStmt(x.Pos(), label)
+					labelStmt.SetTypecheck(1)
+
+					loopLabel := x.Label
+					loopDepth := 0
+					var editContinues func(x ir.Node) bool
+					editContinues = func(x ir.Node) bool {
+
+						switch c := x.(type) {
+						case *ir.BranchStmt:
+							// If this is a continue targeting the loop currently being rewritten, transform it to an appropriate GOTO
+							if c.Op() == ir.OCONTINUE && (loopDepth == 0 && c.Label == nil || loopLabel != nil && c.Label == loopLabel) {
+								c.Label = label
+								c.SetOp(ir.OGOTO)
+							}
+						case *ir.RangeStmt, *ir.ForStmt:
+							loopDepth++
+							ir.DoChildren(x, editContinues)
+							loopDepth--
+							return false
+						}
+						ir.DoChildren(x, editContinues)
+						return false
+					}
+					for _, y := range x.Body {
+						editContinues(y)
+					}
+					bodyContinue := x.Body
+
+					// (4) rewrite init
+					forAllDefInInitUpdate(x, func(z ir.Node, pz *ir.Node) {
+						// note tempFor[n] can be nil if hash searching.
+						if n, ok := z.(*ir.Name); ok && possiblyLeaked[n] && zPrimeForZ[n] != nil {
+							*pz = zPrimeForZ[n]
+						}
+					})
+
+					postNotNil := x.Post != nil
+					var tmpFirstDcl *ir.AssignStmt
+					if postNotNil {
+						// body' = prebody +
+						// (6)     if tmp_first {tmp_first = false} else {Post} +
+						//         if !cond {break} + ...
+						tmpFirst := typecheck.Temp(types.Types[types.TBOOL])
+
+						// tmpFirstAssign assigns val to tmpFirst
+						tmpFirstAssign := func(val bool) *ir.AssignStmt {
+							s := ir.NewAssignStmt(x.Pos(), tmpFirst, typecheck.OrigBool(tmpFirst, val))
+							s.SetTypecheck(1)
+							return s
+						}
+
+						tmpFirstDcl = tmpFirstAssign(true)
+						tmpFirstDcl.Def = true // also declares tmpFirst
+						tmpFirstSetFalse := tmpFirstAssign(false)
+						ifTmpFirst := ir.NewIfStmt(x.Pos(), tmpFirst, ir.Nodes{tmpFirstSetFalse}, ir.Nodes{x.Post})
+						ifTmpFirst.SetTypecheck(1)
+						preBody.Append(ifTmpFirst)
+					}
+
+					// body' = prebody +
+					//         if tmp_first {tmp_first = false} else {Post} +
+					// (7)     if !cond {break} + ...
+					if x.Cond != nil {
+						notCond := ir.NewUnaryExpr(x.Cond.Pos(), ir.ONOT, x.Cond)
+						notCond.SetType(x.Cond.Type())
+						notCond.SetTypecheck(1)
+						newBreak := ir.NewBranchStmt(x.Pos(), ir.OBREAK, nil)
+						newBreak.SetTypecheck(1)
+						ifNotCond := ir.NewIfStmt(x.Pos(), notCond, ir.Nodes{newBreak}, nil)
+						ifNotCond.SetTypecheck(1)
+						preBody.Append(ifNotCond)
+					}
+
+					if postNotNil {
+						x.PtrInit().Append(tmpFirstDcl)
+					}
+
+					// (8)
+					preBody.Append(bodyContinue...)
+					// (9)
+					preBody.Append(labelStmt)
+					preBody.Append(postBody...)
+
+					// (5) body' = prebody + ...
+					x.Body = preBody
+
+					// (10) cond' = {}
+					x.Cond = nil
+
+					// (11) post' = {}
+					x.Post = nil
+				}
+				thisLastPos := lastPos
+				lastPos = savedLastPos
+				updateLastPos(thisLastPos) // this will propagate lastPos if in the same file.
+				x.DistinctVars = false
+
+				return false
+			}
+
+			ir.DoChildren(n, scanChildrenThenTransform)
+
+			return false
+		}
+		scanChildrenThenTransform(fn)
+		if len(transformed) > 0 {
+			// editNodes scans a slice C of ir.Node, looking for declarations that
+			// appear in dclFixups.  Any declaration D whose "fixup" is an assignmnt
+			// statement A is removed from the C and relocated to the Init
+			// of A.  editNodes returns the modified slice of ir.Node.
+			editNodes := func(c ir.Nodes) ir.Nodes {
+				j := 0
+				for _, n := range c {
+					if d, ok := n.(*ir.Decl); ok {
+						if s := dclFixups[d.X]; s != nil {
+							switch a := s.(type) {
+							case *ir.AssignStmt:
+								a.PtrInit().Prepend(d)
+								delete(dclFixups, d.X) // can't be sure of visit order, wouldn't want to visit twice.
+							default:
+								base.Fatalf("not implemented yet for node type %v", s.Op())
+							}
+							continue // do not copy this node, and do not increment j
+						}
+					}
+					c[j] = n
+					j++
+				}
+				for k := j; k < len(c); k++ {
+					c[k] = nil
+				}
+				return c[:j]
+			}
+			// fixup all tagged declarations in all the statements lists in fn.
+			rewriteNodes(fn, editNodes)
+		}
+	}
+	ir.WithFunc(fn, forCapture)
+	return transformed
+}
+
+// forAllDefInInitUpdate applies "do" to all the defining assignments in the Init clause of a ForStmt.
+// This abstracts away some of the boilerplate from the already complex and verbose for-3-clause case.
+func forAllDefInInitUpdate(x *ir.ForStmt, do func(z ir.Node, update *ir.Node)) {
+	for _, s := range x.Init() {
+		switch y := s.(type) {
+		case *ir.AssignListStmt:
+			if !y.Def {
+				continue
+			}
+			for i, z := range y.Lhs {
+				do(z, &y.Lhs[i])
+			}
+		case *ir.AssignStmt:
+			if !y.Def {
+				continue
+			}
+			do(y.X, &y.X)
+		}
+	}
+}
+
+// forAllDefInInit is forAllDefInInitUpdate without the update option.
+func forAllDefInInit(x *ir.ForStmt, do func(z ir.Node)) {
+	forAllDefInInitUpdate(x, func(z ir.Node, _ *ir.Node) { do(z) })
+}
+
+// rewriteNodes applies editNodes to all statement lists in fn.
+func rewriteNodes(fn *ir.Func, editNodes func(c ir.Nodes) ir.Nodes) {
+	var forNodes func(x ir.Node) bool
+	forNodes = func(n ir.Node) bool {
+		if stmt, ok := n.(ir.InitNode); ok {
+			// process init list
+			stmt.SetInit(editNodes(stmt.Init()))
+		}
+		switch x := n.(type) {
+		case *ir.Func:
+			x.Body = editNodes(x.Body)
+			x.Enter = editNodes(x.Enter)
+			x.Exit = editNodes(x.Exit)
+		case *ir.InlinedCallExpr:
+			x.Body = editNodes(x.Body)
+
+		case *ir.CaseClause:
+			x.Body = editNodes(x.Body)
+		case *ir.CommClause:
+			x.Body = editNodes(x.Body)
+
+		case *ir.BlockStmt:
+			x.List = editNodes(x.List)
+
+		case *ir.ForStmt:
+			x.Body = editNodes(x.Body)
+		case *ir.RangeStmt:
+			x.Body = editNodes(x.Body)
+		case *ir.IfStmt:
+			x.Body = editNodes(x.Body)
+			x.Else = editNodes(x.Else)
+		case *ir.SelectStmt:
+			x.Compiled = editNodes(x.Compiled)
+		case *ir.SwitchStmt:
+			x.Compiled = editNodes(x.Compiled)
+		}
+		ir.DoChildren(n, forNodes)
+		return false
+	}
+	forNodes(fn)
+}
+
+func LogTransformations(transformed []VarAndLoop) {
+	print := 2 <= base.Debug.LoopVar && base.Debug.LoopVar != 11
+
+	if print || logopt.Enabled() { // 11 is do them all, quietly, 12 includes debugging.
+		fileToPosBase := make(map[string]*src.PosBase) // used to remove inline context for innermost reporting.
+
+		// trueInlinedPos rebases inner w/o inline context so that it prints correctly in WarnfAt; otherwise it prints as outer.
+		trueInlinedPos := func(inner src.Pos) src.XPos {
+			afn := inner.AbsFilename()
+			pb, ok := fileToPosBase[afn]
+			if !ok {
+				pb = src.NewFileBase(inner.Filename(), afn)
+				fileToPosBase[afn] = pb
+			}
+			inner.SetBase(pb)
+			return base.Ctxt.PosTable.XPos(inner)
+		}
+
+		type unit struct{}
+		loopsSeen := make(map[ir.Node]unit)
+		type loopPos struct {
+			loop  ir.Node
+			last  src.XPos
+			curfn *ir.Func
+		}
+		var loops []loopPos
+		for _, lv := range transformed {
+			n := lv.Name
+			if _, ok := loopsSeen[lv.Loop]; !ok {
+				l := lv.Loop
+				loopsSeen[l] = unit{}
+				loops = append(loops, loopPos{l, lv.LastPos, n.Curfn})
+			}
+			pos := n.Pos()
+
+			inner := base.Ctxt.InnermostPos(pos)
+			outer := base.Ctxt.OutermostPos(pos)
+
+			if logopt.Enabled() {
+				// For automated checking of coverage of this transformation, include this in the JSON information.
+				var nString interface{} = n
+				if inner != outer {
+					nString = fmt.Sprintf("%v (from inline)", n)
+				}
+				if n.Esc() == ir.EscHeap {
+					logopt.LogOpt(pos, "iteration-variable-to-heap", "loopvar", ir.FuncName(n.Curfn), nString)
+				} else {
+					logopt.LogOpt(pos, "iteration-variable-to-stack", "loopvar", ir.FuncName(n.Curfn), nString)
+				}
+			}
+			if print {
+				if inner == outer {
+					if n.Esc() == ir.EscHeap {
+						base.WarnfAt(pos, "loop variable %v now per-iteration, heap-allocated", n)
+					} else {
+						base.WarnfAt(pos, "loop variable %v now per-iteration, stack-allocated", n)
+					}
+				} else {
+					innerXPos := trueInlinedPos(inner)
+					if n.Esc() == ir.EscHeap {
+						base.WarnfAt(innerXPos, "loop variable %v now per-iteration, heap-allocated (loop inlined into %s:%d)", n, outer.Filename(), outer.Line())
+					} else {
+						base.WarnfAt(innerXPos, "loop variable %v now per-iteration, stack-allocated (loop inlined into %s:%d)", n, outer.Filename(), outer.Line())
+					}
+				}
+			}
+		}
+		for _, l := range loops {
+			pos := l.loop.Pos()
+			last := l.last
+			loopKind := "range"
+			if _, ok := l.loop.(*ir.ForStmt); ok {
+				loopKind = "for"
+			}
+			if logopt.Enabled() {
+				// Intended to help with performance debugging, we record whole loop ranges
+				logopt.LogOptRange(pos, last, "loop-modified-"+loopKind, "loopvar", ir.FuncName(l.curfn))
+			}
+			if print && 3 <= base.Debug.LoopVar {
+				// TODO decide if we want to keep this, or not.  It was helpful for validating logopt, otherwise, eh.
+				inner := base.Ctxt.InnermostPos(pos)
+				outer := base.Ctxt.OutermostPos(pos)
+
+				if inner == outer {
+					base.WarnfAt(pos, "%s loop ending at %d:%d was modified", loopKind, last.Line(), last.Col())
+				} else {
+					pos = trueInlinedPos(inner)
+					last = trueInlinedPos(base.Ctxt.InnermostPos(last))
+					base.WarnfAt(pos, "%s loop ending at %d:%d was modified (loop inlined into %s:%d)", loopKind, last.Line(), last.Col(), outer.Filename(), outer.Line())
+				}
+			}
+		}
+	}
+}
diff --git a/src/cmd/compile/internal/loopvar/loopvar_test.go b/src/cmd/compile/internal/loopvar/loopvar_test.go
new file mode 100644
index 0000000..03e6eec
--- /dev/null
+++ b/src/cmd/compile/internal/loopvar/loopvar_test.go
@@ -0,0 +1,264 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package loopvar_test
+
+import (
+	"internal/testenv"
+	"os/exec"
+	"path/filepath"
+	"regexp"
+	"runtime"
+	"strings"
+	"testing"
+)
+
+type testcase struct {
+	lvFlag      string // ==-2, -1, 0, 1, 2
+	buildExpect string // message, if any
+	expectRC    int
+	files       []string
+}
+
+var for_files = []string{
+	"for_esc_address.go",             // address of variable
+	"for_esc_closure.go",             // closure of variable
+	"for_esc_minimal_closure.go",     // simple closure of variable
+	"for_esc_method.go",              // method value of variable
+	"for_complicated_esc_address.go", // modifies loop index in body
+}
+
+var range_files = []string{
+	"range_esc_address.go",         // address of variable
+	"range_esc_closure.go",         // closure of variable
+	"range_esc_minimal_closure.go", // simple closure of variable
+	"range_esc_method.go",          // method value of variable
+}
+
+var cases = []testcase{
+	{"-1", "", 11, for_files[:1]},
+	{"0", "", 0, for_files[:1]},
+	{"1", "", 0, for_files[:1]},
+	{"2", "loop variable i now per-iteration,", 0, for_files},
+
+	{"-1", "", 11, range_files[:1]},
+	{"0", "", 0, range_files[:1]},
+	{"1", "", 0, range_files[:1]},
+	{"2", "loop variable i now per-iteration,", 0, range_files},
+
+	{"1", "", 0, []string{"for_nested.go"}},
+}
+
+// TestLoopVar checks that the GOEXPERIMENT and debug flags behave as expected.
+func TestLoopVar(t *testing.T) {
+	switch runtime.GOOS {
+	case "linux", "darwin":
+	default:
+		t.Skipf("Slow test, usually avoid it, os=%s not linux or darwin", runtime.GOOS)
+	}
+	switch runtime.GOARCH {
+	case "amd64", "arm64":
+	default:
+		t.Skipf("Slow test, usually avoid it, arch=%s not amd64 or arm64", runtime.GOARCH)
+	}
+
+	testenv.MustHaveGoBuild(t)
+	gocmd := testenv.GoToolPath(t)
+	tmpdir := t.TempDir()
+	output := filepath.Join(tmpdir, "foo.exe")
+
+	for i, tc := range cases {
+		for _, f := range tc.files {
+			source := f
+			cmd := testenv.Command(t, gocmd, "build", "-o", output, "-gcflags=-d=loopvar="+tc.lvFlag, source)
+			cmd.Env = append(cmd.Env, "GOEXPERIMENT=loopvar", "HOME="+tmpdir)
+			cmd.Dir = "testdata"
+			t.Logf("File %s loopvar=%s expect '%s' exit code %d", f, tc.lvFlag, tc.buildExpect, tc.expectRC)
+			b, e := cmd.CombinedOutput()
+			if e != nil {
+				t.Error(e)
+			}
+			if tc.buildExpect != "" {
+				s := string(b)
+				if !strings.Contains(s, tc.buildExpect) {
+					t.Errorf("File %s test %d expected to match '%s' with \n-----\n%s\n-----", f, i, tc.buildExpect, s)
+				}
+			}
+			// run what we just built.
+			cmd = testenv.Command(t, output)
+			b, e = cmd.CombinedOutput()
+			if tc.expectRC != 0 {
+				if e == nil {
+					t.Errorf("Missing expected error, file %s, case %d", f, i)
+				} else if ee, ok := (e).(*exec.ExitError); !ok || ee.ExitCode() != tc.expectRC {
+					t.Error(e)
+				} else {
+					// okay
+				}
+			} else if e != nil {
+				t.Error(e)
+			}
+		}
+	}
+}
+
+func TestLoopVarInlines(t *testing.T) {
+	switch runtime.GOOS {
+	case "linux", "darwin":
+	default:
+		t.Skipf("Slow test, usually avoid it, os=%s not linux or darwin", runtime.GOOS)
+	}
+	switch runtime.GOARCH {
+	case "amd64", "arm64":
+	default:
+		t.Skipf("Slow test, usually avoid it, arch=%s not amd64 or arm64", runtime.GOARCH)
+	}
+
+	testenv.MustHaveGoBuild(t)
+	gocmd := testenv.GoToolPath(t)
+	tmpdir := t.TempDir()
+
+	root := "cmd/compile/internal/loopvar/testdata/inlines"
+
+	f := func(pkg string) string {
+		// This disables the loopvar change, except for the specified package.
+		// The effect should follow the package, even though everything (except "c")
+		// is inlined.
+		cmd := testenv.Command(t, gocmd, "run", "-gcflags="+pkg+"=-d=loopvar=1", root)
+		cmd.Env = append(cmd.Env, "GOEXPERIMENT=noloopvar", "HOME="+tmpdir)
+		cmd.Dir = filepath.Join("testdata", "inlines")
+
+		b, e := cmd.CombinedOutput()
+		if e != nil {
+			t.Error(e)
+		}
+		return string(b)
+	}
+
+	a := f(root + "/a")
+	b := f(root + "/b")
+	c := f(root + "/c")
+	m := f(root)
+
+	t.Logf(a)
+	t.Logf(b)
+	t.Logf(c)
+	t.Logf(m)
+
+	if !strings.Contains(a, "f, af, bf, abf, cf sums = 100, 45, 100, 100, 100") {
+		t.Errorf("Did not see expected value of a")
+	}
+	if !strings.Contains(b, "f, af, bf, abf, cf sums = 100, 100, 45, 45, 100") {
+		t.Errorf("Did not see expected value of b")
+	}
+	if !strings.Contains(c, "f, af, bf, abf, cf sums = 100, 100, 100, 100, 45") {
+		t.Errorf("Did not see expected value of c")
+	}
+	if !strings.Contains(m, "f, af, bf, abf, cf sums = 45, 100, 100, 100, 100") {
+		t.Errorf("Did not see expected value of m")
+	}
+}
+
+func countMatches(s, re string) int {
+	slice := regexp.MustCompile(re).FindAllString(s, -1)
+	return len(slice)
+}
+
+func TestLoopVarHashes(t *testing.T) {
+	switch runtime.GOOS {
+	case "linux", "darwin":
+	default:
+		t.Skipf("Slow test, usually avoid it, os=%s not linux or darwin", runtime.GOOS)
+	}
+	switch runtime.GOARCH {
+	case "amd64", "arm64":
+	default:
+		t.Skipf("Slow test, usually avoid it, arch=%s not amd64 or arm64", runtime.GOARCH)
+	}
+
+	testenv.MustHaveGoBuild(t)
+	gocmd := testenv.GoToolPath(t)
+	tmpdir := t.TempDir()
+
+	root := "cmd/compile/internal/loopvar/testdata/inlines"
+
+	f := func(hash string) string {
+		// This disables the loopvar change, except for the specified hash pattern.
+		// -trimpath is necessary so we get the same answer no matter where the
+		// Go repository is checked out. This is not normally a concern since people
+		// do not rely on the meaning of specific hashes.
+		cmd := testenv.Command(t, gocmd, "run", "-trimpath", root)
+		cmd.Env = append(cmd.Env, "GOCOMPILEDEBUG=loopvarhash="+hash, "HOME="+tmpdir)
+		cmd.Dir = filepath.Join("testdata", "inlines")
+
+		b, _ := cmd.CombinedOutput()
+		// Ignore the error, sometimes it's supposed to fail, the output test will catch it.
+		return string(b)
+	}
+
+	for _, arg := range []string{"v001100110110110010100100", "vx336ca4"} {
+		m := f(arg)
+		t.Logf(m)
+
+		mCount := countMatches(m, "loopvarhash triggered cmd/compile/internal/loopvar/testdata/inlines/main.go:27:6: .* 001100110110110010100100")
+		otherCount := strings.Count(m, "loopvarhash")
+		if mCount < 1 {
+			t.Errorf("%s: did not see triggered main.go:27:6", arg)
+		}
+		if mCount != otherCount {
+			t.Errorf("%s: too many matches", arg)
+		}
+		mCount = countMatches(m, "cmd/compile/internal/loopvar/testdata/inlines/main.go:27:6: .* \\[bisect-match 0x7802e115b9336ca4\\]")
+		otherCount = strings.Count(m, "[bisect-match ")
+		if mCount < 1 {
+			t.Errorf("%s: did not see bisect-match for main.go:27:6", arg)
+		}
+		if mCount != otherCount {
+			t.Errorf("%s: too many matches", arg)
+		}
+
+		// This next test carefully dodges a bug-to-be-fixed with inlined locations for ir.Names.
+		if !strings.Contains(m, ", 100, 100, 100, 100") {
+			t.Errorf("%s: did not see expected value of m run", arg)
+		}
+	}
+}
+
+func TestLoopVarOpt(t *testing.T) {
+	switch runtime.GOOS {
+	case "linux", "darwin":
+	default:
+		t.Skipf("Slow test, usually avoid it, os=%s not linux or darwin", runtime.GOOS)
+	}
+	switch runtime.GOARCH {
+	case "amd64", "arm64":
+	default:
+		t.Skipf("Slow test, usually avoid it, arch=%s not amd64 or arm64", runtime.GOARCH)
+	}
+
+	testenv.MustHaveGoBuild(t)
+	gocmd := testenv.GoToolPath(t)
+
+	cmd := testenv.Command(t, gocmd, "run", "-gcflags=-d=loopvar=2", "opt.go")
+	cmd.Dir = filepath.Join("testdata")
+
+	b, err := cmd.CombinedOutput()
+	m := string(b)
+
+	t.Logf(m)
+
+	yCount := strings.Count(m, "opt.go:16:6: loop variable private now per-iteration, heap-allocated (loop inlined into ./opt.go:30)")
+	nCount := strings.Count(m, "shared")
+
+	if yCount != 1 {
+		t.Errorf("yCount=%d != 1", yCount)
+	}
+	if nCount > 0 {
+		t.Errorf("nCount=%d > 0", nCount)
+	}
+	if err != nil {
+		t.Errorf("err=%v != nil", err)
+	}
+
+}
diff --git a/src/cmd/compile/internal/loopvar/testdata/for_complicated_esc_address.go b/src/cmd/compile/internal/loopvar/testdata/for_complicated_esc_address.go
new file mode 100644
index 0000000..c658340
--- /dev/null
+++ b/src/cmd/compile/internal/loopvar/testdata/for_complicated_esc_address.go
@@ -0,0 +1,115 @@
+// Copyright 2023 The Go Authors. 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"
+)
+
+func main() {
+	ss, sa := shared(23)
+	ps, pa := private(23)
+	es, ea := experiment(23)
+
+	fmt.Printf("shared s, a; private, s, a; experiment s, a = %d, %d;  %d, %d;  %d, %d\n", ss, sa, ps, pa, es, ea)
+
+	if ss != ps || ss != es || ea != pa || sa == pa {
+		os.Exit(11)
+	} else {
+		fmt.Println("PASS")
+	}
+}
+
+func experiment(x int) (int, int) {
+	sum := 0
+	var is []*int
+	for i := x; i != 1; i = i / 2 {
+		for j := 0; j < 10; j++ {
+			if i == j { // 10 skips
+				continue
+			}
+			sum++
+		}
+		i = i*3 + 1
+		if i&1 == 0 {
+			is = append(is, &i)
+			for i&2 == 0 {
+				i = i >> 1
+			}
+		} else {
+			i = i + i
+		}
+	}
+
+	asum := 0
+	for _, pi := range is {
+		asum += *pi
+	}
+
+	return sum, asum
+}
+
+func private(x int) (int, int) {
+	sum := 0
+	var is []*int
+	I := x
+	for ; I != 1; I = I / 2 {
+		i := I
+		for j := 0; j < 10; j++ {
+			if i == j { // 10 skips
+				I = i
+				continue
+			}
+			sum++
+		}
+		i = i*3 + 1
+		if i&1 == 0 {
+			is = append(is, &i)
+			for i&2 == 0 {
+				i = i >> 1
+			}
+		} else {
+			i = i + i
+		}
+		I = i
+	}
+
+	asum := 0
+	for _, pi := range is {
+		asum += *pi
+	}
+
+	return sum, asum
+}
+
+func shared(x int) (int, int) {
+	sum := 0
+	var is []*int
+	i := x
+	for ; i != 1; i = i / 2 {
+		for j := 0; j < 10; j++ {
+			if i == j { // 10 skips
+				continue
+			}
+			sum++
+		}
+		i = i*3 + 1
+		if i&1 == 0 {
+			is = append(is, &i)
+			for i&2 == 0 {
+				i = i >> 1
+			}
+		} else {
+			i = i + i
+		}
+	}
+
+	asum := 0
+	for _, pi := range is {
+		asum += *pi
+	}
+	return sum, asum
+}
diff --git a/src/cmd/compile/internal/loopvar/testdata/for_esc_address.go b/src/cmd/compile/internal/loopvar/testdata/for_esc_address.go
new file mode 100644
index 0000000..beaefb1
--- /dev/null
+++ b/src/cmd/compile/internal/loopvar/testdata/for_esc_address.go
@@ -0,0 +1,45 @@
+// Copyright 2023 The Go Authors. 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"
+)
+
+func main() {
+	sum := 0
+	var is []*int
+	for i := 0; i < 10; i++ {
+		for j := 0; j < 10; j++ {
+			if i == j { // 10 skips
+				continue
+			}
+			sum++
+		}
+		if i&1 == 0 {
+			is = append(is, &i)
+		}
+	}
+
+	bug := false
+	if sum != 100-10 {
+		fmt.Printf("wrong sum, expected %d, saw %d\n", 90, sum)
+		bug = true
+	}
+	sum = 0
+	for _, pi := range is {
+		sum += *pi
+	}
+	if sum != 2+4+6+8 {
+		fmt.Printf("wrong sum, expected %d, saw %d\n", 20, sum)
+		bug = true
+	}
+	if !bug {
+		fmt.Printf("PASS\n")
+	} else {
+		os.Exit(11)
+	}
+}
diff --git a/src/cmd/compile/internal/loopvar/testdata/for_esc_closure.go b/src/cmd/compile/internal/loopvar/testdata/for_esc_closure.go
new file mode 100644
index 0000000..b60d000
--- /dev/null
+++ b/src/cmd/compile/internal/loopvar/testdata/for_esc_closure.go
@@ -0,0 +1,51 @@
+// Copyright 2023 The Go Authors. 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"
+)
+
+var is []func() int
+
+func main() {
+	sum := 0
+	for i := 0; i < 10; i++ {
+		for j := 0; j < 10; j++ {
+			if i == j { // 10 skips
+				continue
+			}
+			sum++
+		}
+		if i&1 == 0 {
+			is = append(is, func() int {
+				if i%17 == 15 {
+					i++
+				}
+				return i
+			})
+		}
+	}
+
+	bug := false
+	if sum != 100-10 {
+		fmt.Printf("wrong sum, expected %d, saw %d\n", 90, sum)
+		bug = true
+	}
+	sum = 0
+	for _, f := range is {
+		sum += f()
+	}
+	if sum != 2+4+6+8 {
+		fmt.Printf("wrong sum, expected %d, saw %d\n", 20, sum)
+		bug = true
+	}
+	if !bug {
+		fmt.Printf("PASS\n")
+	} else {
+		os.Exit(11)
+	}
+}
diff --git a/src/cmd/compile/internal/loopvar/testdata/for_esc_method.go b/src/cmd/compile/internal/loopvar/testdata/for_esc_method.go
new file mode 100644
index 0000000..0e2f801
--- /dev/null
+++ b/src/cmd/compile/internal/loopvar/testdata/for_esc_method.go
@@ -0,0 +1,51 @@
+// Copyright 2023 The Go Authors. 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"
+)
+
+type I int
+
+func (x *I) method() int {
+	return int(*x)
+}
+
+func main() {
+	sum := 0
+	var is []func() int
+	for i := I(0); int(i) < 10; i++ {
+		for j := 0; j < 10; j++ {
+			if int(i) == j { // 10 skips
+				continue
+			}
+			sum++
+		}
+		if i&1 == 0 {
+			is = append(is, i.method)
+		}
+	}
+
+	bug := false
+	if sum != 100-10 {
+		fmt.Printf("wrong sum, expected %d, saw %d\n", 90, sum)
+		bug = true
+	}
+	sum = 0
+	for _, m := range is {
+		sum += m()
+	}
+	if sum != 2+4+6+8 {
+		fmt.Printf("wrong sum, expected %d, saw %d\n", 20, sum)
+		bug = true
+	}
+	if !bug {
+		fmt.Printf("PASS\n")
+	} else {
+		os.Exit(11)
+	}
+}
diff --git a/src/cmd/compile/internal/loopvar/testdata/for_esc_minimal_closure.go b/src/cmd/compile/internal/loopvar/testdata/for_esc_minimal_closure.go
new file mode 100644
index 0000000..971c91d
--- /dev/null
+++ b/src/cmd/compile/internal/loopvar/testdata/for_esc_minimal_closure.go
@@ -0,0 +1,48 @@
+// Copyright 2023 The Go Authors. 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"
+)
+
+var is []func() int
+
+func main() {
+	sum := 0
+	for i := 0; i < 10; i++ {
+		for j := 0; j < 10; j++ {
+			if i == j { // 10 skips
+				continue
+			}
+			sum++
+		}
+		if i&1 == 0 {
+			is = append(is, func() int {
+				return i
+			})
+		}
+	}
+
+	bug := false
+	if sum != 100-10 {
+		fmt.Printf("wrong sum, expected %d, saw %d\n", 90, sum)
+		bug = true
+	}
+	sum = 0
+	for _, f := range is {
+		sum += f()
+	}
+	if sum != 2+4+6+8 {
+		fmt.Printf("wrong sum, expected %d, saw %d\n", 20, sum)
+		bug = true
+	}
+	if !bug {
+		fmt.Printf("PASS\n")
+	} else {
+		os.Exit(11)
+	}
+}
diff --git a/src/cmd/compile/internal/loopvar/testdata/for_nested.go b/src/cmd/compile/internal/loopvar/testdata/for_nested.go
new file mode 100644
index 0000000..4888fab
--- /dev/null
+++ b/src/cmd/compile/internal/loopvar/testdata/for_nested.go
@@ -0,0 +1,47 @@
+// Copyright 2023 The Go Authors. 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"
+)
+
+func main() {
+	x := f(60)
+	fmt.Println(x)
+	if x != 54 {
+		os.Exit(11)
+	}
+}
+
+var escape *int
+
+func f(i int) int {
+	a := 0
+outer:
+	for {
+		switch {
+		case i > 55:
+			i--
+			continue
+		case i == 55:
+			for j := i; j != 1; j = j / 2 {
+				a++
+				if j == 4 {
+					escape = &j
+					i--
+					continue outer
+				}
+				if j&1 == 1 {
+					j = 2 * (3*j + 1)
+				}
+			}
+			return a
+		case i < 55:
+			return i
+		}
+	}
+}
diff --git a/src/cmd/compile/internal/loopvar/testdata/inlines/a/a.go b/src/cmd/compile/internal/loopvar/testdata/inlines/a/a.go
new file mode 100644
index 0000000..0bae36d
--- /dev/null
+++ b/src/cmd/compile/internal/loopvar/testdata/inlines/a/a.go
@@ -0,0 +1,20 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package a
+
+import "cmd/compile/internal/loopvar/testdata/inlines/b"
+
+func F() []*int {
+	var s []*int
+	for i := 0; i < 10; i++ {
+		s = append(s, &i)
+	}
+	return s
+}
+
+func Fb() []*int {
+	bf, _ := b.F()
+	return bf
+}
diff --git a/src/cmd/compile/internal/loopvar/testdata/inlines/b/b.go b/src/cmd/compile/internal/loopvar/testdata/inlines/b/b.go
new file mode 100644
index 0000000..7b1d8ce
--- /dev/null
+++ b/src/cmd/compile/internal/loopvar/testdata/inlines/b/b.go
@@ -0,0 +1,21 @@
+// Copyright 2023 The Go Authors. 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
+
+var slice = []int{1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024}
+
+func F() ([]*int, []*int) {
+	return g()
+}
+
+func g() ([]*int, []*int) {
+	var s []*int
+	var t []*int
+	for i, j := range slice {
+		s = append(s, &i)
+		t = append(t, &j)
+	}
+	return s[:len(s)-1], t
+}
diff --git a/src/cmd/compile/internal/loopvar/testdata/inlines/c/c.go b/src/cmd/compile/internal/loopvar/testdata/inlines/c/c.go
new file mode 100644
index 0000000..0405ace
--- /dev/null
+++ b/src/cmd/compile/internal/loopvar/testdata/inlines/c/c.go
@@ -0,0 +1,14 @@
+// Copyright 2023 The Go Authors. 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
+
+//go:noinline
+func F() []*int {
+	var s []*int
+	for i := 0; i < 10; i++ {
+		s = append(s, &i)
+	}
+	return s
+}
diff --git a/src/cmd/compile/internal/loopvar/testdata/inlines/main.go b/src/cmd/compile/internal/loopvar/testdata/inlines/main.go
new file mode 100644
index 0000000..46fcee1
--- /dev/null
+++ b/src/cmd/compile/internal/loopvar/testdata/inlines/main.go
@@ -0,0 +1,53 @@
+// Copyright 2023 The Go Authors. 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 (
+	"cmd/compile/internal/loopvar/testdata/inlines/a"
+	"cmd/compile/internal/loopvar/testdata/inlines/b"
+	"cmd/compile/internal/loopvar/testdata/inlines/c"
+	"fmt"
+	"os"
+)
+
+func sum(s []*int) int {
+	sum := 0
+	for _, pi := range s {
+		sum += *pi
+	}
+	return sum
+}
+
+var t []*int
+
+func F() []*int {
+	var s []*int
+	for i, j := 0, 0; j < 10; i, j = i+1, j+1 {
+		s = append(s, &i)
+		t = append(s, &j)
+	}
+	return s
+}
+
+func main() {
+	f := F()
+	af := a.F()
+	bf, _ := b.F()
+	abf := a.Fb()
+	cf := c.F()
+
+	sf, saf, sbf, sabf, scf := sum(f), sum(af), sum(bf), sum(abf), sum(cf)
+
+	fmt.Printf("f, af, bf, abf, cf sums = %d, %d, %d, %d, %d\n", sf, saf, sbf, sabf, scf)
+
+	// Special failure just for use with hash searching, to prove it fires exactly once.
+	// To test: `gossahash -e loopvarhash go run .` in this directory.
+	// This is designed to fail in two different ways, because gossahash searches randomly
+	// it will find both failures over time.
+	if os.Getenv("GOCOMPILEDEBUG") != "" && (sabf == 45 || sf == 45) {
+		os.Exit(11)
+	}
+	os.Exit(0)
+}
diff --git a/src/cmd/compile/internal/loopvar/testdata/opt.go b/src/cmd/compile/internal/loopvar/testdata/opt.go
new file mode 100644
index 0000000..1bcd736
--- /dev/null
+++ b/src/cmd/compile/internal/loopvar/testdata/opt.go
@@ -0,0 +1,42 @@
+// Copyright 2023 The Go Authors. 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"
+)
+
+var is []func() int
+
+func inline(j, k int) []*int {
+	var a []*int
+	for private := j; private < k; private++ {
+		a = append(a, &private)
+	}
+	return a
+
+}
+
+//go:noinline
+func notinline(j, k int) ([]*int, *int) {
+	for shared := j; shared < k; shared++ {
+		if shared == k/2 {
+			// want the call inlined, want "private" in that inline to be transformed,
+			// (believe it ends up on init node of the return).
+			// but do not want "shared" transformed,
+			return inline(j, k), &shared
+		}
+	}
+	return nil, &j
+}
+
+func main() {
+	a, p := notinline(2, 9)
+	fmt.Printf("a[0]=%d,*p=%d\n", *a[0], *p)
+	if *a[0] != 2 {
+		os.Exit(1)
+	}
+}
diff --git a/src/cmd/compile/internal/loopvar/testdata/range_esc_address.go b/src/cmd/compile/internal/loopvar/testdata/range_esc_address.go
new file mode 100644
index 0000000..79d7f04
--- /dev/null
+++ b/src/cmd/compile/internal/loopvar/testdata/range_esc_address.go
@@ -0,0 +1,47 @@
+// Copyright 2023 The Go Authors. 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"
+)
+
+var ints = []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
+
+func main() {
+	sum := 0
+	var is []*int
+	for _, i := range ints {
+		for j := 0; j < 10; j++ {
+			if i == j { // 10 skips
+				continue
+			}
+			sum++
+		}
+		if i&1 == 0 {
+			is = append(is, &i)
+		}
+	}
+
+	bug := false
+	if sum != 100-10 {
+		fmt.Printf("wrong sum, expected %d, saw %d\n", 90, sum)
+		bug = true
+	}
+	sum = 0
+	for _, pi := range is {
+		sum += *pi
+	}
+	if sum != 2+4+6+8 {
+		fmt.Printf("wrong sum, expected %d, saw %d\n", 20, sum)
+		bug = true
+	}
+	if !bug {
+		fmt.Printf("PASS\n")
+	} else {
+		os.Exit(11)
+	}
+}
diff --git a/src/cmd/compile/internal/loopvar/testdata/range_esc_closure.go b/src/cmd/compile/internal/loopvar/testdata/range_esc_closure.go
new file mode 100644
index 0000000..9bcb5ef
--- /dev/null
+++ b/src/cmd/compile/internal/loopvar/testdata/range_esc_closure.go
@@ -0,0 +1,53 @@
+// Copyright 2023 The Go Authors. 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"
+)
+
+var is []func() int
+
+var ints = []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
+
+func main() {
+	sum := 0
+	for _, i := range ints {
+		for j := 0; j < 10; j++ {
+			if i == j { // 10 skips
+				continue
+			}
+			sum++
+		}
+		if i&1 == 0 {
+			is = append(is, func() int {
+				if i%17 == 15 {
+					i++
+				}
+				return i
+			})
+		}
+	}
+
+	bug := false
+	if sum != 100-10 {
+		fmt.Printf("wrong sum, expected %d, saw %d\n", 90, sum)
+		bug = true
+	}
+	sum = 0
+	for _, f := range is {
+		sum += f()
+	}
+	if sum != 2+4+6+8 {
+		fmt.Printf("wrong sum, expected %d, saw %d\n", 20, sum)
+		bug = true
+	}
+	if !bug {
+		fmt.Printf("PASS\n")
+	} else {
+		os.Exit(11)
+	}
+}
diff --git a/src/cmd/compile/internal/loopvar/testdata/range_esc_method.go b/src/cmd/compile/internal/loopvar/testdata/range_esc_method.go
new file mode 100644
index 0000000..9a85ab0
--- /dev/null
+++ b/src/cmd/compile/internal/loopvar/testdata/range_esc_method.go
@@ -0,0 +1,53 @@
+// Copyright 2023 The Go Authors. 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"
+)
+
+type I int
+
+func (x *I) method() int {
+	return int(*x)
+}
+
+var ints = []I{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
+
+func main() {
+	sum := 0
+	var is []func() int
+	for _, i := range ints {
+		for j := 0; j < 10; j++ {
+			if int(i) == j { // 10 skips
+				continue
+			}
+			sum++
+		}
+		if i&1 == 0 {
+			is = append(is, i.method)
+		}
+	}
+
+	bug := false
+	if sum != 100-10 {
+		fmt.Printf("wrong sum, expected %d, saw %d\n", 90, sum)
+		bug = true
+	}
+	sum = 0
+	for _, m := range is {
+		sum += m()
+	}
+	if sum != 2+4+6+8 {
+		fmt.Printf("wrong sum, expected %d, saw %d\n", 20, sum)
+		bug = true
+	}
+	if !bug {
+		fmt.Printf("PASS\n")
+	} else {
+		os.Exit(11)
+	}
+}
diff --git a/src/cmd/compile/internal/loopvar/testdata/range_esc_minimal_closure.go b/src/cmd/compile/internal/loopvar/testdata/range_esc_minimal_closure.go
new file mode 100644
index 0000000..8804d8b
--- /dev/null
+++ b/src/cmd/compile/internal/loopvar/testdata/range_esc_minimal_closure.go
@@ -0,0 +1,50 @@
+// Copyright 2023 The Go Authors. 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"
+)
+
+var is []func() int
+
+var ints = []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
+
+func main() {
+	sum := 0
+	for _, i := range ints {
+		for j := 0; j < 10; j++ {
+			if i == j { // 10 skips
+				continue
+			}
+			sum++
+		}
+		if i&1 == 0 {
+			is = append(is, func() int {
+				return i
+			})
+		}
+	}
+
+	bug := false
+	if sum != 100-10 {
+		fmt.Printf("wrong sum, expected %d, saw %d\n", 90, sum)
+		bug = true
+	}
+	sum = 0
+	for _, f := range is {
+		sum += f()
+	}
+	if sum != 2+4+6+8 {
+		fmt.Printf("wrong sum, expected %d, saw %d\n", 20, sum)
+		bug = true
+	}
+	if !bug {
+		fmt.Printf("PASS\n")
+	} else {
+		os.Exit(11)
+	}
+}
diff --git a/src/cmd/compile/internal/mips/ssa.go b/src/cmd/compile/internal/mips/ssa.go
index 2ad7520..bfccafd 100644
--- a/src/cmd/compile/internal/mips/ssa.go
+++ b/src/cmd/compile/internal/mips/ssa.go
@@ -361,8 +361,11 @@
 		ssa.OpMIPSTRUNCDW,
 		ssa.OpMIPSMOVFD,
 		ssa.OpMIPSMOVDF,
+		ssa.OpMIPSMOVWfpgp,
+		ssa.OpMIPSMOVWgpfp,
 		ssa.OpMIPSNEGF,
 		ssa.OpMIPSNEGD,
+		ssa.OpMIPSABSD,
 		ssa.OpMIPSSQRTF,
 		ssa.OpMIPSSQRTD,
 		ssa.OpMIPSCLZ:
@@ -481,7 +484,8 @@
 		p := s.Prog(obj.ACALL)
 		p.To.Type = obj.TYPE_MEM
 		p.To.Name = obj.NAME_EXTERN
-		p.To.Sym = v.Aux.(*obj.LSym)
+		// AuxInt encodes how many buffer entries we need.
+		p.To.Sym = ir.Syms.GCWriteBarrier[v.AuxInt-1]
 	case ssa.OpMIPSLoweredPanicBoundsA, ssa.OpMIPSLoweredPanicBoundsB, ssa.OpMIPSLoweredPanicBoundsC:
 		p := s.Prog(obj.ACALL)
 		p.To.Type = obj.TYPE_MEM
diff --git a/src/cmd/compile/internal/mips64/ssa.go b/src/cmd/compile/internal/mips64/ssa.go
index 8612763..0c0dc6e 100644
--- a/src/cmd/compile/internal/mips64/ssa.go
+++ b/src/cmd/compile/internal/mips64/ssa.go
@@ -356,8 +356,13 @@
 		ssa.OpMIPS64TRUNCDV,
 		ssa.OpMIPS64MOVFD,
 		ssa.OpMIPS64MOVDF,
+		ssa.OpMIPS64MOVWfpgp,
+		ssa.OpMIPS64MOVWgpfp,
+		ssa.OpMIPS64MOVVfpgp,
+		ssa.OpMIPS64MOVVgpfp,
 		ssa.OpMIPS64NEGF,
 		ssa.OpMIPS64NEGD,
+		ssa.OpMIPS64ABSD,
 		ssa.OpMIPS64SQRTF,
 		ssa.OpMIPS64SQRTD:
 		p := s.Prog(v.Op.Asm())
@@ -500,7 +505,8 @@
 		p := s.Prog(obj.ACALL)
 		p.To.Type = obj.TYPE_MEM
 		p.To.Name = obj.NAME_EXTERN
-		p.To.Sym = v.Aux.(*obj.LSym)
+		// AuxInt encodes how many buffer entries we need.
+		p.To.Sym = ir.Syms.GCWriteBarrier[v.AuxInt-1]
 	case ssa.OpMIPS64LoweredPanicBoundsA, ssa.OpMIPS64LoweredPanicBoundsB, ssa.OpMIPS64LoweredPanicBoundsC:
 		p := s.Prog(obj.ACALL)
 		p.To.Type = obj.TYPE_MEM
@@ -670,6 +676,43 @@
 		p4.Reg = v.Reg0()
 		p4.To.Type = obj.TYPE_REG
 		p4.To.Reg = v.Reg0()
+	case ssa.OpMIPS64LoweredAtomicAnd32,
+		ssa.OpMIPS64LoweredAtomicOr32:
+		// SYNC
+		// LL	(Rarg0), Rtmp
+		// AND/OR	Rarg1, Rtmp
+		// SC	Rtmp, (Rarg0)
+		// BEQ	Rtmp, -3(PC)
+		// SYNC
+		s.Prog(mips.ASYNC)
+
+		p := s.Prog(mips.ALL)
+		p.From.Type = obj.TYPE_MEM
+		p.From.Reg = v.Args[0].Reg()
+		p.To.Type = obj.TYPE_REG
+		p.To.Reg = mips.REGTMP
+
+		p1 := s.Prog(v.Op.Asm())
+		p1.From.Type = obj.TYPE_REG
+		p1.From.Reg = v.Args[1].Reg()
+		p1.Reg = mips.REGTMP
+		p1.To.Type = obj.TYPE_REG
+		p1.To.Reg = mips.REGTMP
+
+		p2 := s.Prog(mips.ASC)
+		p2.From.Type = obj.TYPE_REG
+		p2.From.Reg = mips.REGTMP
+		p2.To.Type = obj.TYPE_MEM
+		p2.To.Reg = v.Args[0].Reg()
+
+		p3 := s.Prog(mips.ABEQ)
+		p3.From.Type = obj.TYPE_REG
+		p3.From.Reg = mips.REGTMP
+		p3.To.Type = obj.TYPE_BRANCH
+		p3.To.SetTarget(p)
+
+		s.Prog(mips.ASYNC)
+
 	case ssa.OpMIPS64LoweredAtomicCas32, ssa.OpMIPS64LoweredAtomicCas64:
 		// MOVV $0, Rout
 		// SYNC
diff --git a/src/cmd/compile/internal/noder/decl.go b/src/cmd/compile/internal/noder/decl.go
index 07353cc..8e23fce 100644
--- a/src/cmd/compile/internal/noder/decl.go
+++ b/src/cmd/compile/internal/noder/decl.go
@@ -5,53 +5,10 @@
 package noder
 
 import (
-	"go/constant"
-
-	"cmd/compile/internal/base"
-	"cmd/compile/internal/ir"
 	"cmd/compile/internal/syntax"
-	"cmd/compile/internal/typecheck"
-	"cmd/compile/internal/types"
 	"cmd/compile/internal/types2"
 )
 
-// TODO(mdempsky): Skip blank declarations? Probably only safe
-// for declarations without pragmas.
-
-func (g *irgen) decls(res *ir.Nodes, decls []syntax.Decl) {
-	for _, decl := range decls {
-		switch decl := decl.(type) {
-		case *syntax.ConstDecl:
-			g.constDecl(res, decl)
-		case *syntax.FuncDecl:
-			g.funcDecl(res, decl)
-		case *syntax.TypeDecl:
-			if ir.CurFunc == nil {
-				continue // already handled in irgen.generate
-			}
-			g.typeDecl(res, decl)
-		case *syntax.VarDecl:
-			g.varDecl(res, decl)
-		default:
-			g.unhandled("declaration", decl)
-		}
-	}
-}
-
-func (g *irgen) importDecl(p *noder, decl *syntax.ImportDecl) {
-	g.pragmaFlags(decl.Pragma, 0)
-
-	// Get the imported package's path, as resolved already by types2
-	// and gcimporter. This is the same path as would be computed by
-	// parseImportPath.
-	switch pkgNameOf(g.info, decl).Imported().Path() {
-	case "unsafe":
-		p.importedUnsafe = true
-	case "embed":
-		p.importedEmbed = true
-	}
-}
-
 // pkgNameOf returns the PkgName associated with the given ImportDecl.
 func pkgNameOf(info *types2.Info, decl *syntax.ImportDecl) *types2.PkgName {
 	if name := decl.LocalPkgName; name != nil {
@@ -59,294 +16,3 @@
 	}
 	return info.Implicits[decl].(*types2.PkgName)
 }
-
-func (g *irgen) constDecl(out *ir.Nodes, decl *syntax.ConstDecl) {
-	g.pragmaFlags(decl.Pragma, 0)
-
-	for _, name := range decl.NameList {
-		name, obj := g.def(name)
-
-		// For untyped numeric constants, make sure the value
-		// representation matches what the rest of the
-		// compiler (really just iexport) expects.
-		// TODO(mdempsky): Revisit after #43891 is resolved.
-		val := obj.(*types2.Const).Val()
-		switch name.Type() {
-		case types.UntypedInt, types.UntypedRune:
-			val = constant.ToInt(val)
-		case types.UntypedFloat:
-			val = constant.ToFloat(val)
-		case types.UntypedComplex:
-			val = constant.ToComplex(val)
-		}
-		name.SetVal(val)
-
-		out.Append(ir.NewDecl(g.pos(decl), ir.ODCLCONST, name))
-	}
-}
-
-func (g *irgen) funcDecl(out *ir.Nodes, decl *syntax.FuncDecl) {
-	assert(g.curDecl == "")
-	// Set g.curDecl to the function name, as context for the type params declared
-	// during types2-to-types1 translation if this is a generic function.
-	g.curDecl = decl.Name.Value
-	obj2 := g.info.Defs[decl.Name]
-	recv := types2.AsSignature(obj2.Type()).Recv()
-	if recv != nil {
-		t2 := deref2(recv.Type())
-		// This is a method, so set g.curDecl to recvTypeName.methName instead.
-		g.curDecl = t2.(*types2.Named).Obj().Name() + "." + g.curDecl
-	}
-
-	fn := ir.NewFunc(g.pos(decl))
-	fn.Nname, _ = g.def(decl.Name)
-	fn.Nname.Func = fn
-	fn.Nname.Defn = fn
-
-	fn.Pragma = g.pragmaFlags(decl.Pragma, funcPragmas)
-	if fn.Pragma&ir.Systemstack != 0 && fn.Pragma&ir.Nosplit != 0 {
-		base.ErrorfAt(fn.Pos(), "go:nosplit and go:systemstack cannot be combined")
-	}
-	if fn.Pragma&ir.Nointerface != 0 {
-		// Propagate //go:nointerface from Func.Pragma to Field.Nointerface.
-		// This is a bit roundabout, but this is the earliest point where we've
-		// processed the function's pragma flags, and we've also already created
-		// the Fields to represent the receiver's method set.
-		if recv := fn.Type().Recv(); recv != nil {
-			typ := types.ReceiverBaseType(recv.Type)
-			if orig := typ.OrigType(); orig != nil {
-				// For a generic method, we mark the methods on the
-				// base generic type, since those are the methods
-				// that will be stenciled.
-				typ = orig
-			}
-			meth := typecheck.Lookdot1(fn, typecheck.Lookup(decl.Name.Value), typ, typ.Methods(), 0)
-			meth.SetNointerface(true)
-		}
-	}
-
-	if decl.Body != nil {
-		if fn.Pragma&ir.Noescape != 0 {
-			base.ErrorfAt(fn.Pos(), "can only use //go:noescape with external func implementations")
-		}
-		if (fn.Pragma&ir.UintptrKeepAlive != 0 && fn.Pragma&ir.UintptrEscapes == 0) && fn.Pragma&ir.Nosplit == 0 {
-			// Stack growth can't handle uintptr arguments that may
-			// be pointers (as we don't know which are pointers
-			// when creating the stack map). Thus uintptrkeepalive
-			// functions (and all transitive callees) must be
-			// nosplit.
-			//
-			// N.B. uintptrescapes implies uintptrkeepalive but it
-			// is OK since the arguments must escape to the heap.
-			//
-			// TODO(prattmic): Add recursive nosplit check of callees.
-			// TODO(prattmic): Functions with no body (i.e.,
-			// assembly) must also be nosplit, but we can't check
-			// that here.
-			base.ErrorfAt(fn.Pos(), "go:uintptrkeepalive requires go:nosplit")
-		}
-	}
-
-	if decl.Name.Value == "init" && decl.Recv == nil {
-		g.target.Inits = append(g.target.Inits, fn)
-	}
-
-	saveHaveEmbed := g.haveEmbed
-	saveCurDecl := g.curDecl
-	g.curDecl = ""
-	g.later(func() {
-		defer func(b bool, s string) {
-			// Revert haveEmbed and curDecl back to what they were before
-			// the "later" function.
-			g.haveEmbed = b
-			g.curDecl = s
-		}(g.haveEmbed, g.curDecl)
-
-		// Set haveEmbed and curDecl to what they were for this funcDecl.
-		g.haveEmbed = saveHaveEmbed
-		g.curDecl = saveCurDecl
-		if fn.Type().HasTParam() {
-			g.topFuncIsGeneric = true
-		}
-		g.funcBody(fn, decl.Recv, decl.Type, decl.Body)
-		g.topFuncIsGeneric = false
-		if fn.Type().HasTParam() && fn.Body != nil {
-			// Set pointers to the dcls/body of a generic function/method in
-			// the Inl struct, so it is marked for export, is available for
-			// stenciling, and works with Inline_Flood().
-			fn.Inl = &ir.Inline{
-				Cost: 1,
-				Dcl:  fn.Dcl,
-				Body: fn.Body,
-			}
-		}
-
-		out.Append(fn)
-	})
-}
-
-func (g *irgen) typeDecl(out *ir.Nodes, decl *syntax.TypeDecl) {
-	// Set the position for any error messages we might print (e.g. too large types).
-	base.Pos = g.pos(decl)
-	assert(ir.CurFunc != nil || g.curDecl == "")
-	// Set g.curDecl to the type name, as context for the type params declared
-	// during types2-to-types1 translation if this is a generic type.
-	saveCurDecl := g.curDecl
-	g.curDecl = decl.Name.Value
-	if decl.Alias {
-		name, _ := g.def(decl.Name)
-		g.pragmaFlags(decl.Pragma, 0)
-		assert(name.Alias()) // should be set by irgen.obj
-
-		out.Append(ir.NewDecl(g.pos(decl), ir.ODCLTYPE, name))
-		g.curDecl = ""
-		return
-	}
-
-	// Prevent size calculations until we set the underlying type.
-	types.DeferCheckSize()
-
-	name, obj := g.def(decl.Name)
-	ntyp, otyp := name.Type(), obj.Type()
-	if ir.CurFunc != nil {
-		ntyp.SetVargen()
-	}
-
-	pragmas := g.pragmaFlags(decl.Pragma, 0)
-	name.SetPragma(pragmas) // TODO(mdempsky): Is this still needed?
-
-	ntyp.SetUnderlying(g.typeExpr(decl.Type))
-
-	tparams := otyp.(*types2.Named).TypeParams()
-	if n := tparams.Len(); n > 0 {
-		rparams := make([]*types.Type, n)
-		for i := range rparams {
-			rparams[i] = g.typ(tparams.At(i))
-		}
-		// This will set hasTParam flag if any rparams are not concrete types.
-		ntyp.SetRParams(rparams)
-	}
-	types.ResumeCheckSize()
-
-	g.curDecl = saveCurDecl
-	if otyp, ok := otyp.(*types2.Named); ok && otyp.NumMethods() != 0 {
-		methods := make([]*types.Field, otyp.NumMethods())
-		for i := range methods {
-			m := otyp.Method(i)
-			// Set g.curDecl to recvTypeName.methName, as context for the
-			// method-specific type params in the receiver.
-			g.curDecl = decl.Name.Value + "." + m.Name()
-			meth := g.obj(m)
-			methods[i] = types.NewField(meth.Pos(), g.selector(m), meth.Type())
-			methods[i].Nname = meth
-			g.curDecl = ""
-		}
-		ntyp.Methods().Set(methods)
-	}
-
-	out.Append(ir.NewDecl(g.pos(decl), ir.ODCLTYPE, name))
-}
-
-func (g *irgen) varDecl(out *ir.Nodes, decl *syntax.VarDecl) {
-	pos := g.pos(decl)
-	// Set the position for any error messages we might print (e.g. too large types).
-	base.Pos = pos
-	names := make([]*ir.Name, len(decl.NameList))
-	for i, name := range decl.NameList {
-		names[i], _ = g.def(name)
-	}
-
-	if decl.Pragma != nil {
-		pragma := decl.Pragma.(*pragmas)
-		varEmbed(g.makeXPos, names[0], decl, pragma, g.haveEmbed)
-		g.reportUnused(pragma)
-	}
-
-	haveEmbed := g.haveEmbed
-	do := func() {
-		defer func(b bool) { g.haveEmbed = b }(g.haveEmbed)
-
-		g.haveEmbed = haveEmbed
-		values := g.exprList(decl.Values)
-
-		var as2 *ir.AssignListStmt
-		if len(values) != 0 && len(names) != len(values) {
-			as2 = ir.NewAssignListStmt(pos, ir.OAS2, make([]ir.Node, len(names)), values)
-		}
-
-		for i, name := range names {
-			if ir.CurFunc != nil {
-				out.Append(ir.NewDecl(pos, ir.ODCL, name))
-			}
-			if as2 != nil {
-				as2.Lhs[i] = name
-				name.Defn = as2
-			} else {
-				as := ir.NewAssignStmt(pos, name, nil)
-				if len(values) != 0 {
-					as.Y = values[i]
-					name.Defn = as
-				} else if ir.CurFunc == nil {
-					name.Defn = as
-				}
-				if !g.delayTransform() {
-					lhs := []ir.Node{as.X}
-					rhs := []ir.Node{}
-					if as.Y != nil {
-						rhs = []ir.Node{as.Y}
-					}
-					transformAssign(as, lhs, rhs)
-					as.X = lhs[0]
-					if as.Y != nil {
-						as.Y = rhs[0]
-					}
-				}
-				as.SetTypecheck(1)
-				out.Append(as)
-			}
-		}
-		if as2 != nil {
-			if !g.delayTransform() {
-				transformAssign(as2, as2.Lhs, as2.Rhs)
-			}
-			as2.SetTypecheck(1)
-			out.Append(as2)
-		}
-	}
-
-	// If we're within a function, we need to process the assignment
-	// part of the variable declaration right away. Otherwise, we leave
-	// it to be handled after all top-level declarations are processed.
-	if ir.CurFunc != nil {
-		do()
-	} else {
-		g.later(do)
-	}
-}
-
-// pragmaFlags returns any specified pragma flags included in allowed,
-// and reports errors about any other, unexpected pragmas.
-func (g *irgen) pragmaFlags(pragma syntax.Pragma, allowed ir.PragmaFlag) ir.PragmaFlag {
-	if pragma == nil {
-		return 0
-	}
-	p := pragma.(*pragmas)
-	present := p.Flag & allowed
-	p.Flag &^= allowed
-	g.reportUnused(p)
-	return present
-}
-
-// reportUnused reports errors about any unused pragmas.
-func (g *irgen) reportUnused(pragma *pragmas) {
-	for _, pos := range pragma.Pos {
-		if pos.Flag&pragma.Flag != 0 {
-			base.ErrorfAt(g.makeXPos(pos.Pos), "misplaced compiler directive")
-		}
-	}
-	if len(pragma.Embeds) > 0 {
-		for _, e := range pragma.Embeds {
-			base.ErrorfAt(g.makeXPos(e.Pos), "misplaced go:embed directive")
-		}
-	}
-}
diff --git a/src/cmd/compile/internal/noder/export.go b/src/cmd/compile/internal/noder/export.go
index 263cdc2..e1f289b 100644
--- a/src/cmd/compile/internal/noder/export.go
+++ b/src/cmd/compile/internal/noder/export.go
@@ -10,19 +10,14 @@
 	"io"
 
 	"cmd/compile/internal/base"
-	"cmd/compile/internal/typecheck"
 	"cmd/internal/bio"
 )
 
 func WriteExports(out *bio.Writer) {
 	var data bytes.Buffer
 
-	if base.Debug.Unified != 0 {
-		data.WriteByte('u')
-		writeUnifiedExport(&data)
-	} else {
-		typecheck.WriteExports(&data, true)
-	}
+	data.WriteByte('u')
+	writeUnifiedExport(&data)
 
 	// The linker also looks for the $$ marker - use char after $$ to distinguish format.
 	out.WriteString("\n$$B\n") // indicate binary export format
diff --git a/src/cmd/compile/internal/noder/expr.go b/src/cmd/compile/internal/noder/expr.go
index f391339..51b0656 100644
--- a/src/cmd/compile/internal/noder/expr.go
+++ b/src/cmd/compile/internal/noder/expr.go
@@ -7,340 +7,10 @@
 import (
 	"fmt"
 
-	"cmd/compile/internal/base"
 	"cmd/compile/internal/ir"
 	"cmd/compile/internal/syntax"
-	"cmd/compile/internal/typecheck"
-	"cmd/compile/internal/types"
-	"cmd/compile/internal/types2"
-	"cmd/internal/src"
 )
 
-func (g *irgen) expr(expr syntax.Expr) ir.Node {
-	expr = unparen(expr) // skip parens; unneeded after parse+typecheck
-
-	if expr == nil {
-		return nil
-	}
-
-	if expr, ok := expr.(*syntax.Name); ok && expr.Value == "_" {
-		return ir.BlankNode
-	}
-
-	tv := g.typeAndValue(expr)
-	switch {
-	case tv.IsBuiltin():
-		// Qualified builtins, such as unsafe.Add and unsafe.Slice.
-		if expr, ok := expr.(*syntax.SelectorExpr); ok {
-			if name, ok := expr.X.(*syntax.Name); ok {
-				if _, ok := g.info.Uses[name].(*types2.PkgName); ok {
-					return g.use(expr.Sel)
-				}
-			}
-		}
-		return g.use(expr.(*syntax.Name))
-	case tv.IsType():
-		return ir.TypeNode(g.typ(tv.Type))
-	case tv.IsValue(), tv.IsVoid():
-		// ok
-	default:
-		base.FatalfAt(g.pos(expr), "unrecognized type-checker result")
-	}
-
-	base.Assert(g.exprStmtOK)
-
-	typ := idealType(tv)
-	if typ == nil {
-		base.FatalfAt(g.pos(expr), "unexpected untyped type: %v", tv.Type)
-	}
-
-	// Constant expression.
-	if tv.Value != nil {
-		typ := g.typ(typ)
-		value := FixValue(typ, tv.Value)
-		return OrigConst(g.pos(expr), typ, value, constExprOp(expr), syntax.String(expr))
-	}
-
-	n := g.expr0(typ, expr)
-	if n.Typecheck() != 1 && n.Typecheck() != 3 {
-		base.FatalfAt(g.pos(expr), "missed typecheck: %+v", n)
-	}
-	if n.Op() != ir.OFUNCINST && !g.match(n.Type(), typ, tv.HasOk()) {
-		base.FatalfAt(g.pos(expr), "expected %L to have type %v", n, typ)
-	}
-	return n
-}
-
-func (g *irgen) expr0(typ types2.Type, expr syntax.Expr) ir.Node {
-	pos := g.pos(expr)
-	assert(pos.IsKnown())
-
-	// Set base.Pos for transformation code that still uses base.Pos, rather than
-	// the pos of the node being converted.
-	base.Pos = pos
-
-	switch expr := expr.(type) {
-	case *syntax.Name:
-		if _, isNil := g.info.Uses[expr].(*types2.Nil); isNil {
-			return Nil(pos, g.typ(typ))
-		}
-		return g.use(expr)
-
-	case *syntax.CompositeLit:
-		return g.compLit(typ, expr)
-
-	case *syntax.FuncLit:
-		return g.funcLit(typ, expr)
-
-	case *syntax.AssertExpr:
-		return Assert(pos, g.expr(expr.X), g.typeExpr(expr.Type))
-
-	case *syntax.CallExpr:
-		fun := g.expr(expr.Fun)
-		return g.callExpr(pos, g.typ(typ), fun, g.exprs(expr.ArgList), expr.HasDots)
-
-	case *syntax.IndexExpr:
-		args := unpackListExpr(expr.Index)
-		if len(args) == 1 {
-			tv := g.typeAndValue(args[0])
-			if tv.IsValue() {
-				// This is just a normal index expression
-				n := Index(pos, g.typ(typ), g.expr(expr.X), g.expr(args[0]))
-				if !g.delayTransform() {
-					// transformIndex will modify n.Type() for OINDEXMAP.
-					transformIndex(n)
-				}
-				return n
-			}
-		}
-
-		// expr.Index is a list of type args, so we ignore it, since types2 has
-		// already provided this info with the Info.Instances map.
-		return g.expr(expr.X)
-
-	case *syntax.SelectorExpr:
-		// Qualified identifier.
-		if name, ok := expr.X.(*syntax.Name); ok {
-			if _, ok := g.info.Uses[name].(*types2.PkgName); ok {
-				return g.use(expr.Sel)
-			}
-		}
-		return g.selectorExpr(pos, typ, expr)
-
-	case *syntax.SliceExpr:
-		n := Slice(pos, g.typ(typ), g.expr(expr.X), g.expr(expr.Index[0]), g.expr(expr.Index[1]), g.expr(expr.Index[2]))
-		if !g.delayTransform() {
-			transformSlice(n)
-		}
-		return n
-
-	case *syntax.Operation:
-		if expr.Y == nil {
-			n := Unary(pos, g.typ(typ), g.op(expr.Op, unOps[:]), g.expr(expr.X))
-			if n.Op() == ir.OADDR && !g.delayTransform() {
-				transformAddr(n.(*ir.AddrExpr))
-			}
-			return n
-		}
-		switch op := g.op(expr.Op, binOps[:]); op {
-		case ir.OEQ, ir.ONE, ir.OLT, ir.OLE, ir.OGT, ir.OGE:
-			n := Compare(pos, g.typ(typ), op, g.expr(expr.X), g.expr(expr.Y))
-			if !g.delayTransform() {
-				transformCompare(n)
-			}
-			return n
-		case ir.OANDAND, ir.OOROR:
-			x := g.expr(expr.X)
-			y := g.expr(expr.Y)
-			return typed(x.Type(), ir.NewLogicalExpr(pos, op, x, y))
-		default:
-			n := Binary(pos, op, g.typ(typ), g.expr(expr.X), g.expr(expr.Y))
-			if op == ir.OADD && !g.delayTransform() {
-				return transformAdd(n)
-			}
-			return n
-		}
-
-	default:
-		g.unhandled("expression", expr)
-		panic("unreachable")
-	}
-}
-
-// substType does a normal type substition, but tparams is in the form of a field
-// list, and targs is in terms of a slice of type nodes. substType records any newly
-// instantiated types into g.instTypeList.
-func (g *irgen) substType(typ *types.Type, tparams *types.Type, targs []ir.Ntype) *types.Type {
-	fields := tparams.FieldSlice()
-	tparams1 := make([]*types.Type, len(fields))
-	for i, f := range fields {
-		tparams1[i] = f.Type
-	}
-	targs1 := make([]*types.Type, len(targs))
-	for i, n := range targs {
-		targs1[i] = n.Type()
-	}
-	ts := typecheck.Tsubster{
-		Tparams: tparams1,
-		Targs:   targs1,
-	}
-	newt := ts.Typ(typ)
-	return newt
-}
-
-// callExpr creates a call expression (which might be a type conversion, built-in
-// call, or a regular call) and does standard transforms, unless we are in a generic
-// function.
-func (g *irgen) callExpr(pos src.XPos, typ *types.Type, fun ir.Node, args []ir.Node, dots bool) ir.Node {
-	n := ir.NewCallExpr(pos, ir.OCALL, fun, args)
-	n.IsDDD = dots
-	typed(typ, n)
-
-	if fun.Op() == ir.OTYPE {
-		// Actually a type conversion, not a function call.
-		if !g.delayTransform() {
-			return transformConvCall(n)
-		}
-		return n
-	}
-
-	if fun, ok := fun.(*ir.Name); ok && fun.BuiltinOp != 0 {
-		if !g.delayTransform() {
-			return transformBuiltin(n)
-		}
-		return n
-	}
-
-	// Add information, now that we know that fun is actually being called.
-	switch fun := fun.(type) {
-	case *ir.SelectorExpr:
-		if fun.Op() == ir.OMETHVALUE {
-			op := ir.ODOTMETH
-			if fun.X.Type().IsInterface() {
-				op = ir.ODOTINTER
-			}
-			fun.SetOp(op)
-			// Set the type to include the receiver, since that's what
-			// later parts of the compiler expect
-			fun.SetType(fun.Selection.Type)
-		}
-	}
-
-	// A function instantiation (even if fully concrete) shouldn't be
-	// transformed yet, because we need to add the dictionary during the
-	// transformation.
-	if fun.Op() != ir.OFUNCINST && !g.delayTransform() {
-		transformCall(n)
-	}
-	return n
-}
-
-// selectorExpr resolves the choice of ODOT, ODOTPTR, OMETHVALUE (eventually
-// ODOTMETH & ODOTINTER), and OMETHEXPR and deals with embedded fields here rather
-// than in typecheck.go.
-func (g *irgen) selectorExpr(pos src.XPos, typ types2.Type, expr *syntax.SelectorExpr) ir.Node {
-	x := g.expr(expr.X)
-	if x.Type().HasTParam() {
-		// Leave a method call on a type param as an OXDOT, since it can
-		// only be fully transformed once it has an instantiated type.
-		n := ir.NewSelectorExpr(pos, ir.OXDOT, x, typecheck.Lookup(expr.Sel.Value))
-		typed(g.typ(typ), n)
-		return n
-	}
-
-	selinfo := g.info.Selections[expr]
-	// Everything up to the last selection is an implicit embedded field access,
-	// and the last selection is determined by selinfo.Kind().
-	index := selinfo.Index()
-	embeds, last := index[:len(index)-1], index[len(index)-1]
-
-	origx := x
-	for _, ix := range embeds {
-		x = Implicit(DotField(pos, x, ix))
-	}
-
-	kind := selinfo.Kind()
-	if kind == types2.FieldVal {
-		return DotField(pos, x, last)
-	}
-
-	var n ir.Node
-	method2 := selinfo.Obj().(*types2.Func)
-
-	if kind == types2.MethodExpr {
-		// OMETHEXPR is unusual in using directly the node and type of the
-		// original OTYPE node (origx) before passing through embedded
-		// fields, even though the method is selected from the type
-		// (x.Type()) reached after following the embedded fields. We will
-		// actually drop any ODOT nodes we created due to the embedded
-		// fields.
-		n = MethodExpr(pos, origx, x.Type(), last)
-	} else {
-		// Add implicit addr/deref for method values, if needed.
-		if x.Type().IsInterface() {
-			n = DotMethod(pos, x, last)
-		} else {
-			recvType2 := method2.Type().(*types2.Signature).Recv().Type()
-			_, wantPtr := recvType2.(*types2.Pointer)
-			havePtr := x.Type().IsPtr()
-
-			if havePtr != wantPtr {
-				if havePtr {
-					x = Implicit(Deref(pos, x.Type().Elem(), x))
-				} else {
-					x = Implicit(Addr(pos, x))
-				}
-			}
-			recvType2Base := recvType2
-			if wantPtr {
-				recvType2Base = types2.AsPointer(recvType2).Elem()
-			}
-			if recvType2Base.(*types2.Named).TypeParams().Len() > 0 {
-				// recvType2 is the original generic type that is
-				// instantiated for this method call.
-				// selinfo.Recv() is the instantiated type
-				recvType2 = recvType2Base
-				recvTypeSym := g.pkg(method2.Pkg()).Lookup(recvType2.(*types2.Named).Obj().Name())
-				recvType := recvTypeSym.Def.(*ir.Name).Type()
-				// method is the generic method associated with
-				// the base generic type. The instantiated type may not
-				// have method bodies filled in, if it was imported.
-				method := recvType.Methods().Index(last).Nname.(*ir.Name)
-				n = ir.NewSelectorExpr(pos, ir.OMETHVALUE, x, typecheck.Lookup(expr.Sel.Value))
-				n.(*ir.SelectorExpr).Selection = types.NewField(pos, method.Sym(), method.Type())
-				n.(*ir.SelectorExpr).Selection.Nname = method
-				typed(method.Type(), n)
-
-				xt := deref(x.Type())
-				targs := make([]ir.Ntype, len(xt.RParams()))
-				for i := range targs {
-					targs[i] = ir.TypeNode(xt.RParams()[i])
-				}
-
-				// Create function instantiation with the type
-				// args for the receiver type for the method call.
-				n = ir.NewInstExpr(pos, ir.OFUNCINST, n, targs)
-				typed(g.typ(typ), n)
-				return n
-			}
-
-			if !g.match(x.Type(), recvType2, false) {
-				base.FatalfAt(pos, "expected %L to have type %v", x, recvType2)
-			} else {
-				n = DotMethod(pos, x, last)
-			}
-		}
-	}
-	if have, want := n.Sym(), g.selector(method2); have != want {
-		base.FatalfAt(pos, "bad Sym: have %v, want %v", have, want)
-	}
-	return n
-}
-
-func (g *irgen) exprList(expr syntax.Expr) []ir.Node {
-	return g.exprs(unpackListExpr(expr))
-}
-
 func unpackListExpr(expr syntax.Expr) []syntax.Expr {
 	switch expr := expr.(type) {
 	case nil:
@@ -352,95 +22,6 @@
 	}
 }
 
-func (g *irgen) exprs(exprs []syntax.Expr) []ir.Node {
-	nodes := make([]ir.Node, len(exprs))
-	for i, expr := range exprs {
-		nodes[i] = g.expr(expr)
-	}
-	return nodes
-}
-
-func (g *irgen) compLit(typ types2.Type, lit *syntax.CompositeLit) ir.Node {
-	if ptr, ok := types2.CoreType(typ).(*types2.Pointer); ok {
-		n := ir.NewAddrExpr(g.pos(lit), g.compLit(ptr.Elem(), lit))
-		n.SetOp(ir.OPTRLIT)
-		return typed(g.typ(typ), n)
-	}
-
-	_, isStruct := types2.CoreType(typ).(*types2.Struct)
-
-	exprs := make([]ir.Node, len(lit.ElemList))
-	for i, elem := range lit.ElemList {
-		switch elem := elem.(type) {
-		case *syntax.KeyValueExpr:
-			var key ir.Node
-			if isStruct {
-				key = ir.NewIdent(g.pos(elem.Key), g.name(elem.Key.(*syntax.Name)))
-			} else {
-				key = g.expr(elem.Key)
-			}
-			value := wrapname(g.pos(elem.Value), g.expr(elem.Value))
-			if value.Op() == ir.OPAREN {
-				// Make sure any PAREN node added by wrapper has a type
-				typed(value.(*ir.ParenExpr).X.Type(), value)
-			}
-			exprs[i] = ir.NewKeyExpr(g.pos(elem), key, value)
-		default:
-			exprs[i] = wrapname(g.pos(elem), g.expr(elem))
-			if exprs[i].Op() == ir.OPAREN {
-				// Make sure any PAREN node added by wrapper has a type
-				typed(exprs[i].(*ir.ParenExpr).X.Type(), exprs[i])
-			}
-		}
-	}
-
-	n := ir.NewCompLitExpr(g.pos(lit), ir.OCOMPLIT, nil, exprs)
-	typed(g.typ(typ), n)
-	var r ir.Node = n
-	if !g.delayTransform() {
-		r = transformCompLit(n)
-	}
-	return r
-}
-
-func (g *irgen) funcLit(typ2 types2.Type, expr *syntax.FuncLit) ir.Node {
-	fn := ir.NewClosureFunc(g.pos(expr), ir.CurFunc != nil)
-	ir.NameClosure(fn.OClosure, ir.CurFunc)
-
-	typ := g.typ(typ2)
-	typed(typ, fn.Nname)
-	typed(typ, fn.OClosure)
-	fn.SetTypecheck(1)
-
-	g.funcBody(fn, nil, expr.Type, expr.Body)
-
-	ir.FinishCaptureNames(fn.Pos(), ir.CurFunc, fn)
-
-	// TODO(mdempsky): ir.CaptureName should probably handle
-	// copying these fields from the canonical variable.
-	for _, cv := range fn.ClosureVars {
-		cv.SetType(cv.Canonical().Type())
-		cv.SetTypecheck(1)
-	}
-
-	if g.topFuncIsGeneric {
-		// Don't add any closure inside a generic function/method to the
-		// g.target.Decls list, even though it may not be generic itself.
-		// See issue #47514.
-		return ir.UseClosure(fn.OClosure, nil)
-	} else {
-		return ir.UseClosure(fn.OClosure, g.target)
-	}
-}
-
-func (g *irgen) typeExpr(typ syntax.Expr) *types.Type {
-	n := g.expr(typ)
-	if n.Op() != ir.OTYPE {
-		base.FatalfAt(g.pos(typ), "expected type: %L", n)
-	}
-	return n.Type()
-}
-
 // constExprOp returns an ir.Op that represents the outermost
 // operation of the given constant expression. It's intended for use
 // with ir.RawOrigExpr.
diff --git a/src/cmd/compile/internal/noder/func.go b/src/cmd/compile/internal/noder/func.go
deleted file mode 100644
index 6077b34..0000000
--- a/src/cmd/compile/internal/noder/func.go
+++ /dev/null
@@ -1,73 +0,0 @@
-// Copyright 2021 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package noder
-
-import (
-	"cmd/compile/internal/base"
-	"cmd/compile/internal/ir"
-	"cmd/compile/internal/syntax"
-	"cmd/compile/internal/typecheck"
-	"cmd/compile/internal/types"
-	"cmd/internal/src"
-)
-
-func (g *irgen) funcBody(fn *ir.Func, recv *syntax.Field, sig *syntax.FuncType, block *syntax.BlockStmt) {
-	typecheck.Func(fn)
-
-	// TODO(mdempsky): Remove uses of ir.CurFunc and
-	// typecheck.DeclContext after we stop relying on typecheck
-	// for desugaring.
-	outerfn, outerctxt := ir.CurFunc, typecheck.DeclContext
-	ir.CurFunc = fn
-
-	typ := fn.Type()
-	if param := typ.Recv(); param != nil {
-		g.defParam(param, recv, ir.PPARAM)
-	}
-	for i, param := range typ.Params().FieldSlice() {
-		g.defParam(param, sig.ParamList[i], ir.PPARAM)
-	}
-	for i, result := range typ.Results().FieldSlice() {
-		g.defParam(result, sig.ResultList[i], ir.PPARAMOUT)
-	}
-
-	// We may have type-checked a call to this function already and
-	// calculated its size, including parameter offsets. Now that we've
-	// created the parameter Names, force a recalculation to ensure
-	// their offsets are correct.
-	types.RecalcSize(typ)
-
-	if block != nil {
-		typecheck.DeclContext = ir.PAUTO
-
-		fn.Body = g.stmts(block.List)
-		if fn.Body == nil {
-			fn.Body = []ir.Node{ir.NewBlockStmt(src.NoXPos, nil)}
-		}
-		fn.Endlineno = g.makeXPos(block.Rbrace)
-
-		if base.Flag.Dwarf {
-			g.recordScopes(fn, sig)
-		}
-	}
-
-	ir.CurFunc, typecheck.DeclContext = outerfn, outerctxt
-}
-
-func (g *irgen) defParam(param *types.Field, decl *syntax.Field, class ir.Class) {
-	typecheck.DeclContext = class
-
-	var name *ir.Name
-	if decl.Name != nil {
-		name, _ = g.def(decl.Name)
-	} else if class == ir.PPARAMOUT {
-		name = g.obj(g.info.Implicits[decl])
-	}
-
-	if name != nil {
-		param.Nname = name
-		param.Sym = name.Sym() // in case it was renamed
-	}
-}
diff --git a/src/cmd/compile/internal/noder/helpers.go b/src/cmd/compile/internal/noder/helpers.go
index 4ef46a4..ff2d50f 100644
--- a/src/cmd/compile/internal/noder/helpers.go
+++ b/src/cmd/compile/internal/noder/helpers.go
@@ -61,9 +61,7 @@
 	if !typ.IsUntyped() {
 		val = typecheck.DefaultLit(ir.NewBasicLit(src.NoXPos, val), typ).Val()
 	}
-	if !typ.IsTypeParam() {
-		ir.AssertValidTypeForConst(typ, val)
-	}
+	ir.AssertValidTypeForConst(typ, val)
 	return val
 }
 
@@ -211,15 +209,7 @@
 func IncDec(pos src.XPos, op ir.Op, x ir.Node) *ir.AssignOpStmt {
 	assert(x.Type() != nil)
 	bl := ir.NewBasicLit(pos, one)
-	if x.Type().HasTParam() {
-		// If the operand is generic, then types2 will have proved it must be
-		// a type that fits with increment/decrement, so just set the type of
-		// "one" to n.Type(). This works even for types that are eventually
-		// float or complex.
-		typed(x.Type(), bl)
-	} else {
-		bl = typecheck.DefaultLit(bl, x.Type())
-	}
+	bl = typecheck.DefaultLit(bl, x.Type())
 	return ir.NewAssignOpStmt(pos, op, x, bl)
 }
 
diff --git a/src/cmd/compile/internal/noder/import.go b/src/cmd/compile/internal/noder/import.go
index 8b017ec..b7008ac 100644
--- a/src/cmd/compile/internal/noder/import.go
+++ b/src/cmd/compile/internal/noder/import.go
@@ -231,10 +231,6 @@
 
 	switch c {
 	case 'u':
-		if !buildcfg.Experiment.Unified {
-			base.Fatalf("unexpected export data format")
-		}
-
 		// TODO(mdempsky): This seems a bit clunky.
 		data = strings.TrimSuffix(data, "\n$$\n")
 
@@ -244,20 +240,6 @@
 		readPackage(newPkgReader(pr), pkg1, false)
 		pkg2 = importer.ReadPackage(env, packages, pr)
 
-	case 'i':
-		if buildcfg.Experiment.Unified {
-			base.Fatalf("unexpected export data format")
-		}
-
-		typecheck.ReadImports(pkg1, data)
-
-		if packages != nil {
-			pkg2, err = importer.ImportData(packages, data, path)
-			if err != nil {
-				return
-			}
-		}
-
 	default:
 		// Indexed format is distinguished by an 'i' byte,
 		// whereas previous export formats started with 'c', 'd', or 'v'.
diff --git a/src/cmd/compile/internal/noder/irgen.go b/src/cmd/compile/internal/noder/irgen.go
index d034926..df5de63 100644
--- a/src/cmd/compile/internal/noder/irgen.go
+++ b/src/cmd/compile/internal/noder/irgen.go
@@ -6,15 +6,12 @@
 
 import (
 	"fmt"
+	"internal/types/errors"
 	"regexp"
 	"sort"
 
 	"cmd/compile/internal/base"
-	"cmd/compile/internal/dwarfgen"
-	"cmd/compile/internal/ir"
 	"cmd/compile/internal/syntax"
-	"cmd/compile/internal/typecheck"
-	"cmd/compile/internal/types"
 	"cmd/compile/internal/types2"
 	"cmd/internal/src"
 )
@@ -23,16 +20,14 @@
 
 // checkFiles configures and runs the types2 checker on the given
 // parsed source files and then returns the result.
-func checkFiles(noders []*noder) (posMap, *types2.Package, *types2.Info) {
+func checkFiles(m posMap, noders []*noder) (*types2.Package, *types2.Info) {
 	if base.SyntaxErrors() != 0 {
 		base.ErrorExit()
 	}
 
 	// setup and syntax error reporting
-	var m posMap
 	files := make([]*syntax.File, len(noders))
 	for i, p := range noders {
-		m.join(&p.posMap)
 		files[i] = p.file
 	}
 
@@ -53,11 +48,13 @@
 			if versionErrorRx.MatchString(msg) {
 				msg = fmt.Sprintf("%s (-lang was set to %s; check go.mod)", msg, base.Flag.Lang)
 			}
-			base.ErrorfAt(m.makeXPos(terr.Pos), "%s", msg)
+			base.ErrorfAt(m.makeXPos(terr.Pos), terr.Code, "%s", msg)
 		},
-		Importer:               &importer,
-		Sizes:                  &gcSizes{},
-		OldComparableSemantics: base.Flag.OldComparable, // default is new comparable semantics
+		Importer: &importer,
+		Sizes:    &gcSizes{},
+	}
+	if base.Flag.ErrorURL {
+		conf.ErrorURL = " [go.dev/e/%s]"
 	}
 	info := &types2.Info{
 		StoreTypesInSyntax: true,
@@ -79,7 +76,7 @@
 			syntax.Inspect(file, func(n syntax.Node) bool {
 				if n, ok := n.(*syntax.InterfaceType); ok {
 					if f.hasCycle(n.GetTypeInfo().Type.(*types2.Interface)) {
-						base.ErrorfAt(m.makeXPos(n.Pos()), "invalid recursive type: anonymous interface refers to itself (see https://go.dev/issue/56103)")
+						base.ErrorfAt(m.makeXPos(n.Pos()), errors.InvalidTypeCycle, "invalid recursive type: anonymous interface refers to itself (see https://go.dev/issue/56103)")
 
 						for typ := range f.cyclic {
 							f.cyclic[typ] = false // suppress duplicate errors
@@ -113,7 +110,7 @@
 			return ti.pos.Before(tj.pos)
 		})
 		for _, targ := range nihTargs {
-			base.ErrorfAt(targ.pos, "cannot use incomplete (or unallocatable) type as a type argument: %v", targ.typ)
+			base.ErrorfAt(targ.pos, 0, "cannot use incomplete (or unallocatable) type as a type argument: %v", targ.typ)
 		}
 	}
 
@@ -122,309 +119,7 @@
 		base.FatalfAt(src.NoXPos, "conf.Check error: %v", err)
 	}
 
-	return m, pkg, info
-}
-
-// check2 type checks a Go package using types2, and then generates IR
-// using the results.
-func check2(noders []*noder) {
-	m, pkg, info := checkFiles(noders)
-
-	g := irgen{
-		target: typecheck.Target,
-		self:   pkg,
-		info:   info,
-		posMap: m,
-		objs:   make(map[types2.Object]*ir.Name),
-		typs:   make(map[types2.Type]*types.Type),
-	}
-	g.generate(noders)
-}
-
-// Information about sub-dictionary entries in a dictionary
-type subDictInfo struct {
-	// Call or XDOT node that requires a dictionary.
-	callNode ir.Node
-	// Saved CallExpr.X node (*ir.SelectorExpr or *InstExpr node) for a generic
-	// method or function call, since this node will get dropped when the generic
-	// method/function call is transformed to a call on the instantiated shape
-	// function. Nil for other kinds of calls or XDOTs.
-	savedXNode ir.Node
-}
-
-// dictInfo is the dictionary format for an instantiation of a generic function with
-// particular shapes. shapeParams, derivedTypes, subDictCalls, itabConvs, and methodExprClosures
-// describe the actual dictionary entries in order, and the remaining fields are other info
-// needed in doing dictionary processing during compilation.
-type dictInfo struct {
-	// Types substituted for the type parameters, which are shape types.
-	shapeParams []*types.Type
-	// All types derived from those typeparams used in the instantiation.
-	derivedTypes []*types.Type
-	// Nodes in the instantiation that requires a subdictionary. Includes
-	// method and function calls (OCALL), function values (OFUNCINST), method
-	// values/expressions (OXDOT).
-	subDictCalls []subDictInfo
-	// Nodes in the instantiation that are a conversion from a typeparam/derived
-	// type to a specific interface.
-	itabConvs []ir.Node
-	// Method expression closures. For a generic type T with method M(arg1, arg2) res,
-	// these closures are func(rcvr T, arg1, arg2) res.
-	// These closures capture no variables, they are just the generic version of ·f symbols
-	// that live in the dictionary instead of in the readonly globals section.
-	methodExprClosures []methodExprClosure
-
-	// Mapping from each shape type that substitutes a type param, to its
-	// type bound (which is also substituted with shapes if it is parameterized)
-	shapeToBound map[*types.Type]*types.Type
-
-	// For type switches on nonempty interfaces, a map from OTYPE entries of
-	// HasShape type, to the interface type we're switching from.
-	type2switchType map[ir.Node]*types.Type
-
-	startSubDict            int // Start of dict entries for subdictionaries
-	startItabConv           int // Start of dict entries for itab conversions
-	startMethodExprClosures int // Start of dict entries for closures for method expressions
-	dictLen                 int // Total number of entries in dictionary
-}
-
-type methodExprClosure struct {
-	idx  int    // index in list of shape parameters
-	name string // method name
-}
-
-// instInfo is information gathered on an shape instantiation of a function.
-type instInfo struct {
-	fun       *ir.Func // The instantiated function (with body)
-	dictParam *ir.Name // The node inside fun that refers to the dictionary param
-
-	dictInfo *dictInfo
-}
-
-type irgen struct {
-	target *ir.Package
-	self   *types2.Package
-	info   *types2.Info
-
-	posMap
-	objs   map[types2.Object]*ir.Name
-	typs   map[types2.Type]*types.Type
-	marker dwarfgen.ScopeMarker
-
-	// laterFuncs records tasks that need to run after all declarations
-	// are processed.
-	laterFuncs []func()
-	// haveEmbed indicates whether the current node belongs to file that
-	// imports "embed" package.
-	haveEmbed bool
-
-	// exprStmtOK indicates whether it's safe to generate expressions or
-	// statements yet.
-	exprStmtOK bool
-
-	// types which we need to finish, by doing g.fillinMethods.
-	typesToFinalize []*typeDelayInfo
-
-	// True when we are compiling a top-level generic function or method. Use to
-	// avoid adding closures of generic functions/methods to the target.Decls
-	// list.
-	topFuncIsGeneric bool
-
-	// The context during type/function/method declarations that is used to
-	// uniquely name type parameters. We need unique names for type params so we
-	// can be sure they match up correctly between types2-to-types1 translation
-	// and types1 importing.
-	curDecl string
-}
-
-// genInst has the information for creating needed instantiations and modifying
-// functions to use instantiations.
-type genInst struct {
-	dnum int // for generating unique dictionary variables
-
-	// Map from the names of all instantiations to information about the
-	// instantiations.
-	instInfoMap map[*types.Sym]*instInfo
-
-	// Dictionary syms which we need to finish, by writing out any itabconv
-	// or method expression closure entries.
-	dictSymsToFinalize []*delayInfo
-
-	// New instantiations created during this round of buildInstantiations().
-	newInsts []ir.Node
-}
-
-func (g *irgen) later(fn func()) {
-	g.laterFuncs = append(g.laterFuncs, fn)
-}
-
-type delayInfo struct {
-	gf     *ir.Name
-	targs  []*types.Type
-	sym    *types.Sym
-	off    int
-	isMeth bool
-}
-
-type typeDelayInfo struct {
-	typ  *types2.Named
-	ntyp *types.Type
-}
-
-func (g *irgen) generate(noders []*noder) {
-	types.LocalPkg.Name = g.self.Name()
-	typecheck.TypecheckAllowed = true
-
-	// Prevent size calculations until we set the underlying type
-	// for all package-block defined types.
-	types.DeferCheckSize()
-
-	// At this point, types2 has already handled name resolution and
-	// type checking. We just need to map from its object and type
-	// representations to those currently used by the rest of the
-	// compiler. This happens in a few passes.
-
-	// 1. Process all import declarations. We use the compiler's own
-	// importer for this, rather than types2's gcimporter-derived one,
-	// to handle extensions and inline function bodies correctly.
-	//
-	// Also, we need to do this in a separate pass, because mappings are
-	// instantiated on demand. If we interleaved processing import
-	// declarations with other declarations, it's likely we'd end up
-	// wanting to map an object/type from another source file, but not
-	// yet have the import data it relies on.
-	declLists := make([][]syntax.Decl, len(noders))
-Outer:
-	for i, p := range noders {
-		g.pragmaFlags(p.file.Pragma, ir.GoBuildPragma)
-		for j, decl := range p.file.DeclList {
-			switch decl := decl.(type) {
-			case *syntax.ImportDecl:
-				g.importDecl(p, decl)
-			default:
-				declLists[i] = p.file.DeclList[j:]
-				continue Outer // no more ImportDecls
-			}
-		}
-	}
-
-	// 2. Process all package-block type declarations. As with imports,
-	// we need to make sure all types are properly instantiated before
-	// trying to map any expressions that utilize them. In particular,
-	// we need to make sure type pragmas are already known (see comment
-	// in irgen.typeDecl).
-	//
-	// We could perhaps instead defer processing of package-block
-	// variable initializers and function bodies, like noder does, but
-	// special-casing just package-block type declarations minimizes the
-	// differences between processing package-block and function-scoped
-	// declarations.
-	for _, declList := range declLists {
-		for _, decl := range declList {
-			switch decl := decl.(type) {
-			case *syntax.TypeDecl:
-				g.typeDecl((*ir.Nodes)(&g.target.Decls), decl)
-			}
-		}
-	}
-	types.ResumeCheckSize()
-
-	// 3. Process all remaining declarations.
-	for i, declList := range declLists {
-		old := g.haveEmbed
-		g.haveEmbed = noders[i].importedEmbed
-		g.decls((*ir.Nodes)(&g.target.Decls), declList)
-		g.haveEmbed = old
-	}
-	g.exprStmtOK = true
-
-	// 4. Run any "later" tasks. Avoid using 'range' so that tasks can
-	// recursively queue further tasks. (Not currently utilized though.)
-	for len(g.laterFuncs) > 0 {
-		fn := g.laterFuncs[0]
-		g.laterFuncs = g.laterFuncs[1:]
-		fn()
-	}
-
-	if base.Flag.W > 1 {
-		for _, n := range g.target.Decls {
-			s := fmt.Sprintf("\nafter noder2 %v", n)
-			ir.Dump(s, n)
-		}
-	}
-
-	for _, p := range noders {
-		// Process linkname and cgo pragmas.
-		p.processPragmas()
-
-		// Double check for any type-checking inconsistencies. This can be
-		// removed once we're confident in IR generation results.
-		syntax.Crawl(p.file, func(n syntax.Node) bool {
-			g.validate(n)
-			return false
-		})
-	}
-
-	if base.Flag.Complete {
-		for _, n := range g.target.Decls {
-			if fn, ok := n.(*ir.Func); ok {
-				if fn.Body == nil && fn.Nname.Sym().Linkname == "" {
-					base.ErrorfAt(fn.Pos(), "missing function body")
-				}
-			}
-		}
-	}
-
-	// Check for unusual case where noder2 encounters a type error that types2
-	// doesn't check for (e.g. notinheap incompatibility).
-	base.ExitIfErrors()
-
-	typecheck.DeclareUniverse()
-
-	// Create any needed instantiations of generic functions and transform
-	// existing and new functions to use those instantiations.
-	BuildInstantiations()
-
-	// Remove all generic functions from g.target.Decl, since they have been
-	// used for stenciling, but don't compile. Generic functions will already
-	// have been marked for export as appropriate.
-	j := 0
-	for i, decl := range g.target.Decls {
-		if decl.Op() != ir.ODCLFUNC || !decl.Type().HasTParam() {
-			g.target.Decls[j] = g.target.Decls[i]
-			j++
-		}
-	}
-	g.target.Decls = g.target.Decls[:j]
-
-	base.Assertf(len(g.laterFuncs) == 0, "still have %d later funcs", len(g.laterFuncs))
-}
-
-func (g *irgen) unhandled(what string, p poser) {
-	base.FatalfAt(g.pos(p), "unhandled %s: %T", what, p)
-	panic("unreachable")
-}
-
-// delayTransform returns true if we should delay all transforms, because we are
-// creating the nodes for a generic function/method.
-func (g *irgen) delayTransform() bool {
-	return g.topFuncIsGeneric
-}
-
-func (g *irgen) typeAndValue(x syntax.Expr) syntax.TypeAndValue {
-	tv := x.GetTypeInfo()
-	if tv.Type == nil {
-		base.FatalfAt(g.pos(x), "missing type for %v (%T)", x, x)
-	}
-	return tv
-}
-
-func (g *irgen) type2(x syntax.Expr) syntax.Type {
-	tv := x.GetTypeInfo()
-	if tv.Type == nil {
-		base.FatalfAt(g.pos(x), "missing type for %v (%T)", x, x)
-	}
-	return tv.Type
+	return pkg, info
 }
 
 // A cycleFinder detects anonymous interface cycles (go.dev/issue/56103).
diff --git a/src/cmd/compile/internal/noder/linker.go b/src/cmd/compile/internal/noder/linker.go
index 0f39fde..0efe6b6 100644
--- a/src/cmd/compile/internal/noder/linker.go
+++ b/src/cmd/compile/internal/noder/linker.go
@@ -5,6 +5,7 @@
 package noder
 
 import (
+	"internal/buildcfg"
 	"internal/pkgbits"
 	"io"
 
@@ -198,7 +199,7 @@
 			l.exportBody(obj, local)
 		}
 
-		if obj.Op() == ir.OTYPE {
+		if obj.Op() == ir.OTYPE && !obj.Alias() {
 			if typ := obj.Type(); !typ.IsInterface() {
 				for _, method := range typ.Methods().Slice() {
 					l.exportBody(method.Nname.(*ir.Name), local)
@@ -269,6 +270,16 @@
 	l.pragmaFlag(w, name.Func.Pragma)
 	l.linkname(w, name)
 
+	if buildcfg.GOARCH == "wasm" {
+		if name.Func.WasmImport != nil {
+			w.String(name.Func.WasmImport.Module)
+			w.String(name.Func.WasmImport.Name)
+		} else {
+			w.String("")
+			w.String("")
+		}
+	}
+
 	// Relocated extension data.
 	w.Bool(true)
 
diff --git a/src/cmd/compile/internal/noder/noder.go b/src/cmd/compile/internal/noder/noder.go
index d0d9545..9407158 100644
--- a/src/cmd/compile/internal/noder/noder.go
+++ b/src/cmd/compile/internal/noder/noder.go
@@ -7,6 +7,7 @@
 import (
 	"errors"
 	"fmt"
+	"internal/buildcfg"
 	"os"
 	"path/filepath"
 	"runtime"
@@ -21,7 +22,6 @@
 	"cmd/compile/internal/typecheck"
 	"cmd/compile/internal/types"
 	"cmd/internal/objabi"
-	"cmd/internal/src"
 )
 
 func LoadPackage(filenames []string) {
@@ -62,9 +62,10 @@
 	}()
 
 	var lines uint
+	var m posMap
 	for _, p := range noders {
 		for e := range p.err {
-			p.errorAt(e.Pos, "%s", e.Msg)
+			base.ErrorfAt(m.makeXPos(e.Pos), 0, "%s", e.Msg)
 		}
 		if p.file == nil {
 			base.ErrorExit()
@@ -73,17 +74,7 @@
 	}
 	base.Timer.AddEvent(int64(lines), "lines")
 
-	if base.Debug.Unified != 0 {
-		unified(noders)
-		return
-	}
-
-	// Use types2 to type-check and generate IR.
-	check2(noders)
-}
-
-func (p *noder) errorAt(pos syntax.Pos, format string, args ...interface{}) {
-	base.ErrorfAt(p.makeXPos(pos), format, args...)
+	unified(m, noders)
 }
 
 // trimFilename returns the "trimmed" filename of b, which is the
@@ -107,14 +98,10 @@
 
 // noder transforms package syntax's AST into a Node tree.
 type noder struct {
-	posMap
-
-	file           *syntax.File
-	linknames      []linkname
-	pragcgobuf     [][]string
-	err            chan syntax.Error
-	importedUnsafe bool
-	importedEmbed  bool
+	file       *syntax.File
+	linknames  []linkname
+	pragcgobuf [][]string
+	err        chan syntax.Error
 }
 
 // linkname records a //go:linkname directive.
@@ -124,28 +111,6 @@
 	remote string
 }
 
-func (p *noder) processPragmas() {
-	for _, l := range p.linknames {
-		if !p.importedUnsafe {
-			p.errorAt(l.pos, "//go:linkname only allowed in Go files that import \"unsafe\"")
-			continue
-		}
-		n := ir.AsNode(typecheck.Lookup(l.local).Def)
-		if n == nil || n.Op() != ir.ONAME {
-			if types.AllowsGoVersion(1, 18) {
-				p.errorAt(l.pos, "//go:linkname must refer to declared function or variable")
-			}
-			continue
-		}
-		if n.Sym().Linkname != "" {
-			p.errorAt(l.pos, "duplicate //go:linkname for %s", l.local)
-			continue
-		}
-		n.Sym().Linkname = l.remote
-	}
-	typecheck.Target.CgoPragmas = append(typecheck.Target.CgoPragmas, p.pragcgobuf...)
-}
-
 var unOps = [...]ir.Op{
 	syntax.Recv: ir.ORECV,
 	syntax.Mul:  ir.ODEREF,
@@ -182,23 +147,6 @@
 	syntax.Shr:    ir.ORSH,
 }
 
-func wrapname(pos src.XPos, x ir.Node) ir.Node {
-	// These nodes do not carry line numbers.
-	// Introduce a wrapper node to give them the correct line.
-	switch x.Op() {
-	case ir.OTYPE, ir.OLITERAL:
-		if x.Sym() == nil {
-			break
-		}
-		fallthrough
-	case ir.ONAME, ir.ONONAME:
-		p := ir.NewParenExpr(pos, x)
-		p.SetImplicit(true)
-		return p
-	}
-	return x
-}
-
 // error is called concurrently if files are parsed concurrently.
 func (p *noder) error(err error) {
 	p.err <- err.(syntax.Error)
@@ -219,9 +167,17 @@
 
 // *pragmas is the value stored in a syntax.pragmas during parsing.
 type pragmas struct {
-	Flag   ir.PragmaFlag // collected bits
-	Pos    []pragmaPos   // position of each individual flag
-	Embeds []pragmaEmbed
+	Flag       ir.PragmaFlag // collected bits
+	Pos        []pragmaPos   // position of each individual flag
+	Embeds     []pragmaEmbed
+	WasmImport *WasmImport
+}
+
+// WasmImport stores metadata associated with the //go:wasmimport pragma
+type WasmImport struct {
+	Pos    syntax.Pos
+	Module string
+	Name   string
 }
 
 type pragmaPos struct {
@@ -245,6 +201,9 @@
 			p.error(syntax.Error{Pos: e.Pos, Msg: "misplaced go:embed directive"})
 		}
 	}
+	if pragma.WasmImport != nil {
+		p.error(syntax.Error{Pos: pragma.WasmImport.Pos, Msg: "misplaced go:wasmimport directive"})
+	}
 }
 
 // pragma is called concurrently if files are parsed concurrently.
@@ -272,6 +231,21 @@
 	}
 
 	switch {
+	case strings.HasPrefix(text, "go:wasmimport "):
+		f := strings.Fields(text)
+		if len(f) != 3 {
+			p.error(syntax.Error{Pos: pos, Msg: "usage: //go:wasmimport importmodule importname"})
+			break
+		}
+
+		if buildcfg.GOARCH == "wasm" {
+			// Only actually use them if we're compiling to WASM though.
+			pragma.WasmImport = &WasmImport{
+				Pos:    pos,
+				Module: f[1],
+				Name:   f[2],
+			}
+		}
 	case strings.HasPrefix(text, "go:linkname "):
 		f := strings.Fields(text)
 		if !(2 <= len(f) && len(f) <= 3) {
@@ -359,8 +333,14 @@
 // contain cgo directives, and for security reasons
 // (primarily misuse of linker flags), other files are not.
 // See golang.org/issue/23672.
+// Note that cmd/go ignores files whose names start with underscore,
+// so the only _cgo_ files we will see from cmd/go are generated by cgo.
+// It's easy to bypass this check by calling the compiler directly;
+// we only protect against uses by cmd/go.
 func isCgoGeneratedFile(pos syntax.Pos) bool {
-	return strings.HasPrefix(filepath.Base(trimFilename(pos.Base())), "_cgo_")
+	// We need the absolute file, independent of //line directives,
+	// so we call pos.Base().Pos().
+	return strings.HasPrefix(filepath.Base(trimFilename(pos.Base().Pos().Base())), "_cgo_")
 }
 
 // safeArg reports whether arg is a "safe" command-line argument,
@@ -448,26 +428,6 @@
 	return s
 }
 
-func varEmbed(makeXPos func(syntax.Pos) src.XPos, name *ir.Name, decl *syntax.VarDecl, pragma *pragmas, haveEmbed bool) {
-	pragmaEmbeds := pragma.Embeds
-	pragma.Embeds = nil
-	if len(pragmaEmbeds) == 0 {
-		return
-	}
-
-	if err := checkEmbed(decl, haveEmbed, typecheck.DeclContext != ir.PEXTERN); err != nil {
-		base.ErrorfAt(makeXPos(pragmaEmbeds[0].Pos), "%s", err)
-		return
-	}
-
-	var embeds []ir.Embed
-	for _, e := range pragmaEmbeds {
-		embeds = append(embeds, ir.Embed{Pos: makeXPos(e.Pos), Patterns: e.Patterns})
-	}
-	typecheck.Target.Embeds = append(typecheck.Target.Embeds, name)
-	name.Embed = &embeds
-}
-
 func checkEmbed(decl *syntax.VarDecl, haveEmbed, withinFunc bool) error {
 	switch {
 	case !haveEmbed:
diff --git a/src/cmd/compile/internal/noder/object.go b/src/cmd/compile/internal/noder/object.go
deleted file mode 100644
index 3b60760..0000000
--- a/src/cmd/compile/internal/noder/object.go
+++ /dev/null
@@ -1,205 +0,0 @@
-// Copyright 2021 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package noder
-
-import (
-	"cmd/compile/internal/base"
-	"cmd/compile/internal/ir"
-	"cmd/compile/internal/syntax"
-	"cmd/compile/internal/typecheck"
-	"cmd/compile/internal/types"
-	"cmd/compile/internal/types2"
-	"cmd/internal/src"
-)
-
-func (g *irgen) def(name *syntax.Name) (*ir.Name, types2.Object) {
-	obj, ok := g.info.Defs[name]
-	if !ok {
-		base.FatalfAt(g.pos(name), "unknown name %v", name)
-	}
-	return g.obj(obj), obj
-}
-
-// use returns the Name or InstExpr node associated with the use of name,
-// possibly instantiated by type arguments. The returned node will have
-// the correct type and be marked as typechecked.
-func (g *irgen) use(name *syntax.Name) ir.Node {
-	obj2, ok := g.info.Uses[name]
-	if !ok {
-		base.FatalfAt(g.pos(name), "unknown name %v", name)
-	}
-	obj := ir.CaptureName(g.pos(name), ir.CurFunc, g.obj(obj2))
-	if obj.Defn != nil && obj.Defn.Op() == ir.ONAME {
-		// If CaptureName created a closure variable, then transfer the
-		// type of the captured name to the new closure variable.
-		obj.SetTypecheck(1)
-		obj.SetType(obj.Defn.Type())
-	}
-
-	if obj.Class == ir.PFUNC {
-		if inst, ok := g.info.Instances[name]; ok {
-			// This is the case where inferring types required the
-			// types of the function arguments.
-			targs := make([]ir.Ntype, inst.TypeArgs.Len())
-			for i := range targs {
-				targs[i] = ir.TypeNode(g.typ(inst.TypeArgs.At(i)))
-			}
-			typ := g.substType(obj.Type(), obj.Type().TParams(), targs)
-			return typed(typ, ir.NewInstExpr(g.pos(name), ir.OFUNCINST, obj, targs))
-		}
-	}
-
-	return obj
-}
-
-// obj returns the Name that represents the given object. If no such Name exists
-// yet, it will be implicitly created. The returned node will have the correct
-// type and be marked as typechecked.
-//
-// For objects declared at function scope, ir.CurFunc must already be
-// set to the respective function when the Name is created.
-func (g *irgen) obj(obj types2.Object) *ir.Name {
-	// For imported objects, we use iimport directly instead of mapping
-	// the types2 representation.
-	if obj.Pkg() != g.self {
-		if sig, ok := obj.Type().(*types2.Signature); ok && sig.Recv() != nil {
-			// We can't import a method by name - must import the type
-			// and access the method from it.
-			base.FatalfAt(g.pos(obj), "tried to import a method directly")
-		}
-		sym := g.sym(obj)
-		if sym.Def != nil {
-			return sym.Def.(*ir.Name)
-		}
-		n := typecheck.Resolve(ir.NewIdent(src.NoXPos, sym))
-		if n, ok := n.(*ir.Name); ok {
-			n.SetTypecheck(1)
-			return n
-		}
-		base.FatalfAt(g.pos(obj), "failed to resolve %v", obj)
-	}
-
-	if name, ok := g.objs[obj]; ok {
-		return name // previously mapped
-	}
-
-	var name *ir.Name
-	pos := g.pos(obj)
-
-	class := typecheck.DeclContext
-	if obj.Parent() == g.self.Scope() {
-		class = ir.PEXTERN // forward reference to package-block declaration
-	}
-
-	// "You are in a maze of twisting little passages, all different."
-	switch obj := obj.(type) {
-	case *types2.Const:
-		name = g.objCommon(pos, ir.OLITERAL, g.sym(obj), class, g.typ(obj.Type()))
-
-	case *types2.Func:
-		sig := obj.Type().(*types2.Signature)
-		var sym *types.Sym
-		var typ *types.Type
-		if recv := sig.Recv(); recv == nil {
-			if obj.Name() == "init" {
-				sym = Renameinit()
-			} else {
-				sym = g.sym(obj)
-			}
-			typ = g.typ(sig)
-		} else {
-			sym = g.selector(obj)
-			if !sym.IsBlank() {
-				sym = ir.MethodSym(g.typ(recv.Type()), sym)
-			}
-			typ = g.signature(g.param(recv), sig)
-		}
-		name = g.objCommon(pos, ir.ONAME, sym, ir.PFUNC, typ)
-
-	case *types2.TypeName:
-		if obj.IsAlias() {
-			name = g.objCommon(pos, ir.OTYPE, g.sym(obj), class, g.typ(obj.Type()))
-			name.SetAlias(true)
-		} else {
-			name = ir.NewDeclNameAt(pos, ir.OTYPE, g.sym(obj))
-			g.objFinish(name, class, types.NewNamed(name))
-		}
-
-	case *types2.Var:
-		sym := g.sym(obj)
-		if class == ir.PPARAMOUT && (sym == nil || sym.IsBlank()) {
-			// Backend needs names for result parameters,
-			// even if they're anonymous or blank.
-			nresults := 0
-			for _, n := range ir.CurFunc.Dcl {
-				if n.Class == ir.PPARAMOUT {
-					nresults++
-				}
-			}
-			if sym == nil {
-				sym = typecheck.LookupNum("~r", nresults) // 'r' for "result"
-			} else {
-				sym = typecheck.LookupNum("~b", nresults) // 'b' for "blank"
-			}
-		}
-		name = g.objCommon(pos, ir.ONAME, sym, class, g.typ(obj.Type()))
-
-	default:
-		g.unhandled("object", obj)
-	}
-
-	g.objs[obj] = name
-	name.SetTypecheck(1)
-	return name
-}
-
-func (g *irgen) objCommon(pos src.XPos, op ir.Op, sym *types.Sym, class ir.Class, typ *types.Type) *ir.Name {
-	name := ir.NewDeclNameAt(pos, op, sym)
-	g.objFinish(name, class, typ)
-	return name
-}
-
-func (g *irgen) objFinish(name *ir.Name, class ir.Class, typ *types.Type) {
-	sym := name.Sym()
-
-	name.SetType(typ)
-	name.Class = class
-	if name.Class == ir.PFUNC {
-		sym.SetFunc(true)
-	}
-
-	name.SetTypecheck(1)
-
-	if ir.IsBlank(name) {
-		return
-	}
-
-	switch class {
-	case ir.PEXTERN:
-		g.target.Externs = append(g.target.Externs, name)
-		fallthrough
-	case ir.PFUNC:
-		sym.Def = name
-		if name.Class == ir.PFUNC && name.Type().Recv() != nil {
-			break // methods are exported with their receiver type
-		}
-		if types.IsExported(sym.Name) {
-			// Generic functions can be marked for export here, even
-			// though they will not be compiled until instantiated.
-			typecheck.Export(name)
-		}
-		if base.Flag.AsmHdr != "" && !name.Sym().Asm() {
-			name.Sym().SetAsm(true)
-			g.target.Asms = append(g.target.Asms, name)
-		}
-
-	default:
-		// Function-scoped declaration.
-		name.Curfn = ir.CurFunc
-		if name.Op() == ir.ONAME {
-			ir.CurFunc.Dcl = append(ir.CurFunc.Dcl, name)
-		}
-	}
-}
diff --git a/src/cmd/compile/internal/noder/posmap.go b/src/cmd/compile/internal/noder/posmap.go
index 6c7e57c..439daf4 100644
--- a/src/cmd/compile/internal/noder/posmap.go
+++ b/src/cmd/compile/internal/noder/posmap.go
@@ -72,15 +72,3 @@
 
 	return b1
 }
-
-func (m *posMap) join(other *posMap) {
-	if m.bases == nil {
-		m.bases = make(map[*syntax.PosBase]*src.PosBase)
-	}
-	for k, v := range other.bases {
-		if m.bases[k] != nil {
-			base.Fatalf("duplicate posmap bases")
-		}
-		m.bases[k] = v
-	}
-}
diff --git a/src/cmd/compile/internal/noder/reader.go b/src/cmd/compile/internal/noder/reader.go
index bc2151e..610d02c 100644
--- a/src/cmd/compile/internal/noder/reader.go
+++ b/src/cmd/compile/internal/noder/reader.go
@@ -9,6 +9,7 @@
 	"go/constant"
 	"internal/buildcfg"
 	"internal/pkgbits"
+	"path/filepath"
 	"strings"
 
 	"cmd/compile/internal/base"
@@ -278,13 +279,14 @@
 	// "$GOROOT" to buildcfg.GOROOT is a close-enough approximation to
 	// satisfy this.
 	//
-	// TODO(mdempsky): De-duplicate this logic with similar logic in
-	// cmd/link/internal/ld's expandGoroot. However, this will probably
-	// require being more consistent about when we use native vs UNIX
-	// file paths.
+	// The export data format only ever uses slash paths
+	// (for cross-operating-system reproducible builds),
+	// but error messages need to use native paths (backslash on Windows)
+	// as if they had been specified on the command line.
+	// (The go command always passes native paths to the compiler.)
 	const dollarGOROOT = "$GOROOT"
 	if buildcfg.GOROOT != "" && strings.HasPrefix(filename, dollarGOROOT) {
-		filename = buildcfg.GOROOT + filename[len(dollarGOROOT):]
+		filename = filepath.FromSlash(buildcfg.GOROOT + filename[len(dollarGOROOT):])
 	}
 
 	if r.Bool() {
@@ -514,7 +516,7 @@
 	case pkgbits.TypePointer:
 		return types.NewPtr(r.typ())
 	case pkgbits.TypeSignature:
-		return r.signature(types.LocalPkg, nil)
+		return r.signature(nil)
 	case pkgbits.TypeSlice:
 		return types.NewSlice(r.typ())
 	case pkgbits.TypeStruct:
@@ -538,27 +540,30 @@
 	//
 	// To avoid needing to represent type unions in types1 (since we
 	// don't have any uses for that today anyway), we simply fold them
-	// to "any". As a consistency check, we still read the union terms
-	// to make sure this substitution is safe.
+	// to "any".
 
-	pure := false
-	for i, n := 0, r.Len(); i < n; i++ {
-		_ = r.Bool() // tilde
-		term := r.typ()
-		if term.IsEmptyInterface() {
-			pure = true
+	// TODO(mdempsky): Restore consistency check to make sure folding to
+	// "any" is safe. This is unfortunately tricky, because a pure
+	// interface can reference impure interfaces too, including
+	// cyclically (#60117).
+	if false {
+		pure := false
+		for i, n := 0, r.Len(); i < n; i++ {
+			_ = r.Bool() // tilde
+			term := r.typ()
+			if term.IsEmptyInterface() {
+				pure = true
+			}
 		}
-	}
-	if !pure {
-		base.Fatalf("impure type set used in value type")
+		if !pure {
+			base.Fatalf("impure type set used in value type")
+		}
 	}
 
 	return types.Types[types.TINTER]
 }
 
 func (r *reader) interfaceType() *types.Type {
-	tpkg := types.LocalPkg // TODO(mdempsky): Remove after iexport is gone.
-
 	nmethods, nembeddeds := r.Len(), r.Len()
 	implicit := nmethods == 0 && nembeddeds == 1 && r.Bool()
 	assert(!implicit) // implicit interfaces only appear in constraints
@@ -568,9 +573,8 @@
 
 	for i := range methods {
 		pos := r.pos()
-		pkg, sym := r.selector()
-		tpkg = pkg
-		mtyp := r.signature(pkg, types.FakeRecv())
+		_, sym := r.selector()
+		mtyp := r.signature(types.FakeRecv())
 		methods[i] = types.NewField(pos, sym, mtyp)
 	}
 	for i := range embeddeds {
@@ -580,16 +584,14 @@
 	if len(fields) == 0 {
 		return types.Types[types.TINTER] // empty interface
 	}
-	return types.NewInterface(tpkg, fields, false)
+	return types.NewInterface(fields)
 }
 
 func (r *reader) structType() *types.Type {
-	tpkg := types.LocalPkg // TODO(mdempsky): Remove after iexport is gone.
 	fields := make([]*types.Field, r.Len())
 	for i := range fields {
 		pos := r.pos()
-		pkg, sym := r.selector()
-		tpkg = pkg
+		_, sym := r.selector()
 		ftyp := r.typ()
 		tag := r.String()
 		embedded := r.Bool()
@@ -601,26 +603,26 @@
 		}
 		fields[i] = f
 	}
-	return types.NewStruct(tpkg, fields)
+	return types.NewStruct(fields)
 }
 
-func (r *reader) signature(tpkg *types.Pkg, recv *types.Field) *types.Type {
+func (r *reader) signature(recv *types.Field) *types.Type {
 	r.Sync(pkgbits.SyncSignature)
 
-	params := r.params(&tpkg)
-	results := r.params(&tpkg)
+	params := r.params()
+	results := r.params()
 	if r.Bool() { // variadic
 		params[len(params)-1].SetIsDDD(true)
 	}
 
-	return types.NewSignature(tpkg, recv, nil, params, results)
+	return types.NewSignature(recv, params, results)
 }
 
-func (r *reader) params(tpkg **types.Pkg) []*types.Field {
+func (r *reader) params() []*types.Field {
 	r.Sync(pkgbits.SyncParams)
 	fields := make([]*types.Field, r.Len())
 	for i := range fields {
-		*tpkg, fields[i] = r.param()
+		_, fields[i] = r.param()
 	}
 	return fields
 }
@@ -750,7 +752,7 @@
 			sym = Renameinit()
 		}
 		name := do(ir.ONAME, true)
-		setType(name, r.signature(sym.Pkg, nil))
+		setType(name, r.signature(nil))
 
 		name.Func = ir.NewFunc(r.pos())
 		name.Func.Nname = name
@@ -989,10 +991,10 @@
 func (r *reader) method(rext *reader) *types.Field {
 	r.Sync(pkgbits.SyncMethod)
 	pos := r.pos()
-	pkg, sym := r.selector()
+	_, sym := r.selector()
 	r.typeParamNames()
 	_, recv := r.param()
-	typ := r.signature(pkg, recv)
+	typ := r.signature(recv)
 
 	name := ir.NewNameAt(pos, ir.MethodSym(recv.Type, sym))
 	setType(name, typ)
@@ -1084,6 +1086,18 @@
 	fn.Pragma = r.pragmaFlag()
 	r.linkname(name)
 
+	if buildcfg.GOARCH == "wasm" {
+		xmod := r.String()
+		xname := r.String()
+
+		if xmod != "" && xname != "" {
+			fn.WasmImport = &ir.WasmImport{
+				Module: xmod,
+				Name:   xname,
+			}
+		}
+	}
+
 	typecheck.Func(fn)
 
 	if r.Bool() {
@@ -1569,13 +1583,6 @@
 			name.SetInlFormal(true)
 			ctxt = ir.PAUTO
 		}
-
-		// TODO(mdempsky): Rethink this hack.
-		if strings.HasPrefix(name.Sym().Name, "~") || base.Flag.GenDwarfInl == 0 {
-			name.SetPos(r.inlCall.Pos())
-			name.SetInlFormal(false)
-			name.SetInlLocal(false)
-		}
 	}
 
 	name.Class = ctxt
@@ -1855,7 +1862,7 @@
 
 	if r.Bool() {
 		pos := r.pos()
-		rang := ir.NewRangeStmt(pos, nil, nil, nil, nil)
+		rang := ir.NewRangeStmt(pos, nil, nil, nil, nil, false)
 		rang.Label = label
 
 		names, lhs := r.assignList()
@@ -1879,6 +1886,7 @@
 		}
 
 		rang.Body = r.blockStmt()
+		rang.DistinctVars = r.Bool()
 		r.closeAnotherScope()
 
 		return rang
@@ -1889,9 +1897,10 @@
 	cond := r.optExpr()
 	post := r.stmt()
 	body := r.blockStmt()
+	dv := r.Bool()
 	r.closeAnotherScope()
 
-	stmt := ir.NewForStmt(pos, init, cond, post, body)
+	stmt := ir.NewForStmt(pos, init, cond, post, body, dv)
 	stmt.Label = label
 	return stmt
 }
@@ -2364,7 +2373,7 @@
 				if recv.Type().IsInterface() {
 					// N.B., this happens currently for typeparam/issue51521.go
 					// and typeparam/typeswitch3.go.
-					if base.Flag.LowerM > 0 {
+					if base.Flag.LowerM != 0 {
 						base.WarnfAt(method.Pos(), "imprecise interface call")
 					}
 				}
@@ -2600,7 +2609,7 @@
 
 	params, results := syntheticSig(fun.Type())
 	params = params[len(captured)-1:] // skip curried parameters
-	typ := types.NewSignature(types.NoPkg, nil, nil, params, results)
+	typ := types.NewSignature(nil, params, results)
 
 	addBody := func(pos src.XPos, r *reader, captured []ir.Node) {
 		recvs, params := r.syntheticArgs(pos)
@@ -2638,7 +2647,7 @@
 		params = append(params[:1], params[2:]...)
 	}
 
-	typ := types.NewSignature(types.NoPkg, nil, nil, params, results)
+	typ := types.NewSignature(nil, params, results)
 
 	addBody := func(pos src.XPos, r *reader, captured []ir.Node) {
 		recvs, args := r.syntheticArgs(pos)
@@ -3099,7 +3108,7 @@
 	// allocation of the closure is credited (#49171).
 	r.suppressInlPos++
 	pos := r.pos()
-	xtype2 := r.signature(types.LocalPkg, nil)
+	xtype2 := r.signature(nil)
 	r.suppressInlPos--
 
 	fn := ir.NewClosureFunc(pos, r.curfn != nil)
@@ -3563,15 +3572,9 @@
 			name.Curfn = callerfn
 			callerfn.Dcl = append(callerfn.Dcl, name)
 
-			// Quirkish. TODO(mdempsky): Document why.
 			if name.AutoTemp() {
 				name.SetEsc(ir.EscUnknown)
-
-				if base.Flag.GenDwarfInl != 0 {
-					name.SetInlLocal(true)
-				} else {
-					name.SetPos(r.inlCall.Pos())
-				}
+				name.SetInlLocal(true)
 			}
 		}
 	}
@@ -3734,11 +3737,6 @@
 }
 
 func MakeWrappers(target *ir.Package) {
-	// Only unified IR emits its own wrappers.
-	if base.Debug.Unified == 0 {
-		return
-	}
-
 	// always generate a wrapper for error.Error (#29304)
 	needWrapperTypes = append(needWrapperTypes, types.ErrorType)
 
@@ -3921,7 +3919,11 @@
 	// The body of wrapper function after inlining may reveal new ir.OMETHVALUE node,
 	// we don't know whether wrapper function has been generated for it or not, so
 	// generate one immediately here.
-	ir.VisitList(fn.Body, func(n ir.Node) {
+	//
+	// Further, after CL 492017, function that construct closures is allowed to be inlined,
+	// even though the closure itself can't be inline. So we also need to visit body of any
+	// closure that we see when visiting body of the wrapper function.
+	ir.VisitFuncAndClosures(fn, func(n ir.Node) {
 		if n, ok := n.(*ir.SelectorExpr); ok && n.Op() == ir.OMETHVALUE {
 			wrapMethodValue(n.X.Type(), n.Selection, target, true)
 		}
@@ -3957,7 +3959,7 @@
 	params := clone(sig.Params().FieldSlice())
 	results := clone(sig.Results().FieldSlice())
 
-	return types.NewSignature(types.NoPkg, recv, nil, params, results)
+	return types.NewSignature(recv, params, results)
 }
 
 func addTailCall(pos src.XPos, fn *ir.Func, recv ir.Node, method *types.Field) {
@@ -3995,7 +3997,7 @@
 //
 // N.B., this variable name is known to Delve:
 // https://github.com/go-delve/delve/blob/cb91509630529e6055be845688fd21eb89ae8714/pkg/proc/eval.go#L28
-const dictParamName = ".dict"
+const dictParamName = typecheck.LocalDictName
 
 // shapeSig returns a copy of fn's signature, except adding a
 // dictionary parameter and promoting the receiver parameter (if any)
@@ -4025,5 +4027,5 @@
 		results[i] = types.NewField(result.Pos, result.Sym, result.Type)
 	}
 
-	return types.NewSignature(types.LocalPkg, recv, nil, params, results)
+	return types.NewSignature(recv, params, results)
 }
diff --git a/src/cmd/compile/internal/noder/scopes.go b/src/cmd/compile/internal/noder/scopes.go
deleted file mode 100644
index eb51847..0000000
--- a/src/cmd/compile/internal/noder/scopes.go
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright 2021 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package noder
-
-import (
-	"strings"
-
-	"cmd/compile/internal/base"
-	"cmd/compile/internal/ir"
-	"cmd/compile/internal/syntax"
-	"cmd/compile/internal/types2"
-)
-
-// recordScopes populates fn.Parents and fn.Marks based on the scoping
-// information provided by types2.
-func (g *irgen) recordScopes(fn *ir.Func, sig *syntax.FuncType) {
-	scope, ok := g.info.Scopes[sig]
-	if !ok {
-		base.FatalfAt(fn.Pos(), "missing scope for %v", fn)
-	}
-
-	for i, n := 0, scope.NumChildren(); i < n; i++ {
-		g.walkScope(scope.Child(i))
-	}
-
-	g.marker.WriteTo(fn)
-}
-
-func (g *irgen) walkScope(scope *types2.Scope) bool {
-	// types2 doesn't provide a proper API for determining the
-	// lexical element a scope represents, so we have to resort to
-	// string matching. Conveniently though, this allows us to
-	// skip both function types and function literals, neither of
-	// which are interesting to us here.
-	if strings.HasPrefix(scope.String(), "function scope ") {
-		return false
-	}
-
-	g.marker.Push(g.pos(scope))
-
-	haveVars := false
-	for _, name := range scope.Names() {
-		if obj, ok := scope.Lookup(name).(*types2.Var); ok && obj.Name() != "_" {
-			haveVars = true
-			break
-		}
-	}
-
-	for i, n := 0, scope.NumChildren(); i < n; i++ {
-		if g.walkScope(scope.Child(i)) {
-			haveVars = true
-		}
-	}
-
-	if haveVars {
-		g.marker.Pop(g.end(scope))
-	} else {
-		g.marker.Unpush()
-	}
-
-	return haveVars
-}
diff --git a/src/cmd/compile/internal/noder/sizes.go b/src/cmd/compile/internal/noder/sizes.go
index 107f4d0..dff8d7b 100644
--- a/src/cmd/compile/internal/noder/sizes.go
+++ b/src/cmd/compile/internal/noder/sizes.go
@@ -78,13 +78,23 @@
 
 func (s *gcSizes) Offsetsof(fields []*types2.Var) []int64 {
 	offsets := make([]int64, len(fields))
-	var o int64
+	var offs int64
 	for i, f := range fields {
+		if offs < 0 {
+			// all remaining offsets are too large
+			offsets[i] = -1
+			continue
+		}
+		// offs >= 0
 		typ := f.Type()
 		a := s.Alignof(typ)
-		o = types.RoundUp(o, a)
-		offsets[i] = o
-		o += s.Sizeof(typ)
+		offs = types.RoundUp(offs, a) // possibly < 0 if align overflows
+		offsets[i] = offs
+		if d := s.Sizeof(typ); d >= 0 && offs >= 0 {
+			offs += d // ok to overflow to < 0
+		} else {
+			offs = -1
+		}
 	}
 	return offsets
 }
@@ -112,7 +122,20 @@
 		}
 		// n > 0
 		// gc: Size includes alignment padding.
-		return s.Sizeof(t.Elem()) * n
+		esize := s.Sizeof(t.Elem())
+		if esize < 0 {
+			return -1 // array element too large
+		}
+		if esize == 0 {
+			return 0 // 0-size element
+		}
+		// esize > 0
+		// Final size is esize * n; and size must be <= maxInt64.
+		const maxInt64 = 1<<63 - 1
+		if esize > maxInt64/n {
+			return -1 // esize * n overflows
+		}
+		return esize * n
 	case *types2.Slice:
 		return int64(types.PtrSize) * 3
 	case *types2.Struct:
@@ -134,7 +157,7 @@
 		}
 
 		// gc: Size includes alignment padding.
-		return types.RoundUp(offsets[n-1]+last, s.Alignof(t))
+		return types.RoundUp(offsets[n-1]+last, s.Alignof(t)) // may overflow to < 0 which is ok
 	case *types2.Interface:
 		return int64(types.PtrSize) * 2
 	case *types2.Chan, *types2.Map, *types2.Pointer, *types2.Signature:
diff --git a/src/cmd/compile/internal/noder/stencil.go b/src/cmd/compile/internal/noder/stencil.go
index 26a088e..43a39ab 100644
--- a/src/cmd/compile/internal/noder/stencil.go
+++ b/src/cmd/compile/internal/noder/stencil.go
@@ -9,2326 +9,8 @@
 
 import (
 	"cmd/compile/internal/base"
-	"cmd/compile/internal/ir"
-	"cmd/compile/internal/objw"
-	"cmd/compile/internal/reflectdata"
-	"cmd/compile/internal/typecheck"
-	"cmd/compile/internal/types"
-	"cmd/internal/obj"
-	"cmd/internal/src"
-	"fmt"
-	"go/constant"
 )
 
-// Enable extra consistency checks.
-const doubleCheck = false
-
 func assert(p bool) {
 	base.Assert(p)
 }
-
-// For outputting debug information on dictionary format and instantiated dictionaries
-// (type arg, derived types, sub-dictionary, and itab entries).
-var infoPrintMode = false
-
-func infoPrint(format string, a ...interface{}) {
-	if infoPrintMode {
-		fmt.Printf(format, a...)
-	}
-}
-
-var geninst genInst
-
-func BuildInstantiations() {
-	geninst.instInfoMap = make(map[*types.Sym]*instInfo)
-	geninst.buildInstantiations()
-	geninst.instInfoMap = nil
-}
-
-// buildInstantiations scans functions for generic function calls and methods, and
-// creates the required instantiations. It also creates instantiated methods for all
-// fully-instantiated generic types that have been encountered already or new ones
-// that are encountered during the instantiation process. It scans all declarations
-// in typecheck.Target.Decls first, before scanning any new instantiations created.
-func (g *genInst) buildInstantiations() {
-	// Instantiate the methods of instantiated generic types that we have seen so far.
-	g.instantiateMethods()
-
-	// Scan all currentdecls for call to generic functions/methods.
-	n := len(typecheck.Target.Decls)
-	for i := 0; i < n; i++ {
-		g.scanForGenCalls(typecheck.Target.Decls[i])
-	}
-
-	// Scan all new instantiations created due to g.instantiateMethods() and the
-	// scan of current decls. This loop purposely runs until no new
-	// instantiations are created.
-	for i := 0; i < len(g.newInsts); i++ {
-		g.scanForGenCalls(g.newInsts[i])
-	}
-
-	g.finalizeSyms()
-
-	// All the instantiations and dictionaries have been created. Now go through
-	// each new instantiation and transform the various operations that need to make
-	// use of their dictionary.
-	l := len(g.newInsts)
-	for _, fun := range g.newInsts {
-		info := g.instInfoMap[fun.Sym()]
-		g.dictPass(info)
-		if doubleCheck {
-			ir.Visit(info.fun, func(n ir.Node) {
-				if n.Op() != ir.OCONVIFACE {
-					return
-				}
-				c := n.(*ir.ConvExpr)
-				if c.X.Type().HasShape() && !c.X.Type().IsInterface() {
-					ir.Dump("BAD FUNCTION", info.fun)
-					ir.Dump("BAD CONVERSION", c)
-					base.Fatalf("converting shape type to interface")
-				}
-			})
-		}
-		if base.Flag.W > 1 {
-			ir.Dump(fmt.Sprintf("\ndictpass %v", info.fun), info.fun)
-		}
-	}
-	assert(l == len(g.newInsts))
-	g.newInsts = nil
-}
-
-// scanForGenCalls scans a single function (or global assignment), looking for
-// references to generic functions/methods. At each such reference, it creates any
-// required instantiation and transforms the reference.
-func (g *genInst) scanForGenCalls(decl ir.Node) {
-	switch decl.Op() {
-	case ir.ODCLFUNC:
-		if decl.Type().HasTParam() {
-			// Skip any generic functions
-			return
-		}
-		// transformCall() below depends on CurFunc being set.
-		ir.CurFunc = decl.(*ir.Func)
-
-	case ir.OAS, ir.OAS2, ir.OAS2DOTTYPE, ir.OAS2FUNC, ir.OAS2MAPR, ir.OAS2RECV, ir.OASOP:
-		// These are all the various kinds of global assignments,
-		// whose right-hand-sides might contain a function
-		// instantiation.
-
-	default:
-		// The other possible ops at the top level are ODCLCONST
-		// and ODCLTYPE, which don't have any function
-		// instantiations.
-		return
-	}
-
-	// Search for any function references using generic function/methods. Then
-	// create the needed instantiated function if it hasn't been created yet, and
-	// change to calling that function directly.
-	modified := false
-	closureRequired := false
-	// declInfo will be non-nil exactly if we are scanning an instantiated function
-	declInfo := g.instInfoMap[decl.Sym()]
-
-	ir.Visit(decl, func(n ir.Node) {
-		if n.Op() == ir.OFUNCINST {
-			// generic F, not immediately called
-			closureRequired = true
-		}
-		if (n.Op() == ir.OMETHEXPR || n.Op() == ir.OMETHVALUE) && len(deref(n.(*ir.SelectorExpr).X.Type()).RParams()) > 0 && !types.IsInterfaceMethod(n.(*ir.SelectorExpr).Selection.Type) {
-			// T.M or x.M, where T or x is generic, but not immediately
-			// called. Not necessary if the method selected is
-			// actually for an embedded interface field.
-			closureRequired = true
-		}
-		if n.Op() == ir.OCALL && n.(*ir.CallExpr).X.Op() == ir.OFUNCINST {
-			// We have found a function call using a generic function
-			// instantiation.
-			call := n.(*ir.CallExpr)
-			inst := call.X.(*ir.InstExpr)
-			nameNode, isMeth := g.getInstNameNode(inst)
-			targs := typecheck.TypesOf(inst.Targs)
-			st := g.getInstantiation(nameNode, targs, isMeth).fun
-			dictValue, usingSubdict := g.getDictOrSubdict(declInfo, n, nameNode, targs, isMeth)
-			if infoPrintMode {
-				dictkind := "Main dictionary"
-				if usingSubdict {
-					dictkind = "Sub-dictionary"
-				}
-				if inst.X.Op() == ir.OMETHVALUE {
-					fmt.Printf("%s in %v at generic method call: %v - %v\n", dictkind, decl, inst.X, call)
-				} else {
-					fmt.Printf("%s in %v at generic function call: %v - %v\n", dictkind, decl, inst.X, call)
-				}
-			}
-
-			// Transform the Call now, which changes OCALL to
-			// OCALLFUNC and does typecheckaste/assignconvfn. Do
-			// it before installing the instantiation, so we are
-			// checking against non-shape param types in
-			// typecheckaste.
-			transformCall(call)
-
-			// Replace the OFUNCINST with a direct reference to the
-			// new stenciled function
-			call.X = st.Nname
-			if inst.X.Op() == ir.OMETHVALUE {
-				// When we create an instantiation of a method
-				// call, we make it a function. So, move the
-				// receiver to be the first arg of the function
-				// call.
-				call.Args.Prepend(inst.X.(*ir.SelectorExpr).X)
-			}
-
-			// Add dictionary to argument list.
-			call.Args.Prepend(dictValue)
-			modified = true
-		}
-		if n.Op() == ir.OCALLMETH && n.(*ir.CallExpr).X.Op() == ir.ODOTMETH && len(deref(n.(*ir.CallExpr).X.Type().Recv().Type).RParams()) > 0 {
-			// Method call on a generic type, which was instantiated by stenciling.
-			// Method calls on explicitly instantiated types will have an OFUNCINST
-			// and are handled above.
-			call := n.(*ir.CallExpr)
-			meth := call.X.(*ir.SelectorExpr)
-			targs := deref(meth.Type().Recv().Type).RParams()
-
-			t := meth.X.Type()
-			baseType := deref(t).OrigType()
-			var gf *ir.Name
-			for _, m := range baseType.Methods().Slice() {
-				if meth.Sel == m.Sym {
-					gf = m.Nname.(*ir.Name)
-					break
-				}
-			}
-
-			// Transform the Call now, which changes OCALL
-			// to OCALLFUNC and does typecheckaste/assignconvfn.
-			transformCall(call)
-
-			st := g.getInstantiation(gf, targs, true).fun
-			dictValue, usingSubdict := g.getDictOrSubdict(declInfo, n, gf, targs, true)
-			if hasShapeTypes(targs) {
-				// We have to be using a subdictionary, since this is
-				// a generic method call.
-				assert(usingSubdict)
-			} else {
-				// We should use main dictionary, because the receiver is
-				// an instantiation already, see issue #53406.
-				assert(!usingSubdict)
-			}
-
-			// Transform to a function call, by appending the
-			// dictionary and the receiver to the args.
-			call.SetOp(ir.OCALLFUNC)
-			call.X = st.Nname
-			call.Args.Prepend(dictValue, meth.X)
-			modified = true
-		}
-	})
-
-	// If we found a reference to a generic instantiation that wasn't an
-	// immediate call, then traverse the nodes of decl again (with
-	// EditChildren rather than Visit), where we actually change the
-	// reference to the instantiation to a closure that captures the
-	// dictionary, then does a direct call.
-	// EditChildren is more expensive than Visit, so we only do this
-	// in the infrequent case of an OFUNCINST without a corresponding
-	// call.
-	if closureRequired {
-		modified = true
-		var edit func(ir.Node) ir.Node
-		var outer *ir.Func
-		if f, ok := decl.(*ir.Func); ok {
-			outer = f
-		}
-		edit = func(x ir.Node) ir.Node {
-			if x.Op() == ir.OFUNCINST {
-				child := x.(*ir.InstExpr).X
-				if child.Op() == ir.OMETHEXPR || child.Op() == ir.OMETHVALUE {
-					// Call EditChildren on child (x.X),
-					// not x, so that we don't do
-					// buildClosure() on the
-					// METHEXPR/METHVALUE nodes as well.
-					ir.EditChildren(child, edit)
-					return g.buildClosure(outer, x)
-				}
-			}
-			ir.EditChildren(x, edit)
-			switch {
-			case x.Op() == ir.OFUNCINST:
-				return g.buildClosure(outer, x)
-			case (x.Op() == ir.OMETHEXPR || x.Op() == ir.OMETHVALUE) &&
-				len(deref(x.(*ir.SelectorExpr).X.Type()).RParams()) > 0 &&
-				!types.IsInterfaceMethod(x.(*ir.SelectorExpr).Selection.Type):
-				return g.buildClosure(outer, x)
-			}
-			return x
-		}
-		edit(decl)
-	}
-	if base.Flag.W > 1 && modified {
-		ir.Dump(fmt.Sprintf("\nmodified %v", decl), decl)
-	}
-	ir.CurFunc = nil
-	// We may have seen new fully-instantiated generic types while
-	// instantiating any needed functions/methods in the above
-	// function. If so, instantiate all the methods of those types
-	// (which will then lead to more function/methods to scan in the loop).
-	g.instantiateMethods()
-}
-
-// buildClosure makes a closure to implement x, a OFUNCINST or OMETHEXPR/OMETHVALUE
-// of generic type. outer is the containing function (or nil if closure is
-// in a global assignment instead of a function).
-func (g *genInst) buildClosure(outer *ir.Func, x ir.Node) ir.Node {
-	pos := x.Pos()
-	var target *ir.Func   // target instantiated function/method
-	var dictValue ir.Node // dictionary to use
-	var rcvrValue ir.Node // receiver, if a method value
-	typ := x.Type()       // type of the closure
-	var outerInfo *instInfo
-	if outer != nil {
-		outerInfo = g.instInfoMap[outer.Sym()]
-	}
-	usingSubdict := false
-	valueMethod := false
-	if x.Op() == ir.OFUNCINST {
-		inst := x.(*ir.InstExpr)
-
-		// Type arguments we're instantiating with.
-		targs := typecheck.TypesOf(inst.Targs)
-
-		// Find the generic function/method.
-		var gf *ir.Name
-		if inst.X.Op() == ir.ONAME {
-			// Instantiating a generic function call.
-			gf = inst.X.(*ir.Name)
-		} else if inst.X.Op() == ir.OMETHVALUE {
-			// Instantiating a method value x.M.
-			se := inst.X.(*ir.SelectorExpr)
-			rcvrValue = se.X
-			gf = se.Selection.Nname.(*ir.Name)
-		} else {
-			panic("unhandled")
-		}
-
-		// target is the instantiated function we're trying to call.
-		// For functions, the target expects a dictionary as its first argument.
-		// For method values, the target expects a dictionary and the receiver
-		// as its first two arguments.
-		// dictValue is the value to use for the dictionary argument.
-		target = g.getInstantiation(gf, targs, rcvrValue != nil).fun
-		dictValue, usingSubdict = g.getDictOrSubdict(outerInfo, x, gf, targs, rcvrValue != nil)
-		if infoPrintMode {
-			dictkind := "Main dictionary"
-			if usingSubdict {
-				dictkind = "Sub-dictionary"
-			}
-			if rcvrValue == nil {
-				fmt.Printf("%s in %v for generic function value %v\n", dictkind, outer, inst.X)
-			} else {
-				fmt.Printf("%s in %v for generic method value %v\n", dictkind, outer, inst.X)
-			}
-		}
-	} else { // ir.OMETHEXPR or ir.METHVALUE
-		// Method expression T.M where T is a generic type.
-		se := x.(*ir.SelectorExpr)
-		if x.Op() == ir.OMETHVALUE {
-			rcvrValue = se.X
-		}
-
-		// se.X.Type() is the top-level type of the method expression. To
-		// correctly handle method expressions involving embedded fields,
-		// look up the generic method below using the type of the receiver
-		// of se.Selection, since that will be the type that actually has
-		// the method.
-		recv := deref(se.Selection.Type.Recv().Type)
-		targs := recv.RParams()
-		if len(targs) == 0 {
-			// The embedded type that actually has the method is not
-			// actually generic, so no need to build a closure.
-			return x
-		}
-		baseType := recv.OrigType()
-		var gf *ir.Name
-		for _, m := range baseType.Methods().Slice() {
-			if se.Sel == m.Sym {
-				gf = m.Nname.(*ir.Name)
-				break
-			}
-		}
-		if !gf.Type().Recv().Type.IsPtr() {
-			// Remember if value method, so we can detect (*T).M case.
-			valueMethod = true
-		}
-		target = g.getInstantiation(gf, targs, true).fun
-		dictValue, usingSubdict = g.getDictOrSubdict(outerInfo, x, gf, targs, true)
-		if infoPrintMode {
-			dictkind := "Main dictionary"
-			if usingSubdict {
-				dictkind = "Sub-dictionary"
-			}
-			fmt.Printf("%s in %v for method expression %v\n", dictkind, outer, x)
-		}
-	}
-
-	// Build a closure to implement a function instantiation.
-	//
-	//   func f[T any] (int, int) (int, int) { ...whatever... }
-	//
-	// Then any reference to f[int] not directly called gets rewritten to
-	//
-	//   .dictN := ... dictionary to use ...
-	//   func(a0, a1 int) (r0, r1 int) {
-	//     return .inst.f[int](.dictN, a0, a1)
-	//   }
-	//
-	// Similarly for method expressions,
-	//
-	//   type g[T any] ....
-	//   func (rcvr g[T]) f(a0, a1 int) (r0, r1 int) { ... }
-	//
-	// Any reference to g[int].f not directly called gets rewritten to
-	//
-	//   .dictN := ... dictionary to use ...
-	//   func(rcvr g[int], a0, a1 int) (r0, r1 int) {
-	//     return .inst.g[int].f(.dictN, rcvr, a0, a1)
-	//   }
-	//
-	// Also method values
-	//
-	//   var x g[int]
-	//
-	// Any reference to x.f not directly called gets rewritten to
-	//
-	//   .dictN := ... dictionary to use ...
-	//   x2 := x
-	//   func(a0, a1 int) (r0, r1 int) {
-	//     return .inst.g[int].f(.dictN, x2, a0, a1)
-	//   }
-
-	// Make a new internal function.
-	fn, formalParams, formalResults := startClosure(pos, outer, typ)
-	fn.SetWrapper(true) // See issue 52237
-
-	// This is the dictionary we want to use.
-	// It may be a constant, it may be the outer functions's dictionary, or it may be
-	// a subdictionary acquired from the outer function's dictionary.
-	// For the latter, dictVar is a variable in the outer function's scope, set to the subdictionary
-	// read from the outer function's dictionary.
-	var dictVar *ir.Name
-	var dictAssign *ir.AssignStmt
-	if outer != nil {
-		dictVar = ir.NewNameAt(pos, closureSym(outer, typecheck.LocalDictName, g.dnum))
-		g.dnum++
-		dictVar.Class = ir.PAUTO
-		typed(types.Types[types.TUINTPTR], dictVar)
-		dictVar.Curfn = outer
-		dictAssign = ir.NewAssignStmt(pos, dictVar, dictValue)
-		dictAssign.SetTypecheck(1)
-		dictVar.Defn = dictAssign
-		outer.Dcl = append(outer.Dcl, dictVar)
-	}
-	// assign the receiver to a temporary.
-	var rcvrVar *ir.Name
-	var rcvrAssign ir.Node
-	if rcvrValue != nil {
-		rcvrVar = ir.NewNameAt(pos, closureSym(outer, ".rcvr", g.dnum))
-		g.dnum++
-		typed(rcvrValue.Type(), rcvrVar)
-		rcvrAssign = ir.NewAssignStmt(pos, rcvrVar, rcvrValue)
-		rcvrAssign.SetTypecheck(1)
-		rcvrVar.Defn = rcvrAssign
-		if outer == nil {
-			rcvrVar.Class = ir.PEXTERN
-			typecheck.Target.Decls = append(typecheck.Target.Decls, rcvrAssign)
-			typecheck.Target.Externs = append(typecheck.Target.Externs, rcvrVar)
-		} else {
-			rcvrVar.Class = ir.PAUTO
-			rcvrVar.Curfn = outer
-			outer.Dcl = append(outer.Dcl, rcvrVar)
-		}
-	}
-
-	// Build body of closure. This involves just calling the wrapped function directly
-	// with the additional dictionary argument.
-
-	// First, figure out the dictionary argument.
-	var dict2Var ir.Node
-	if usingSubdict {
-		// Capture sub-dictionary calculated in the outer function
-		dict2Var = ir.CaptureName(pos, fn, dictVar)
-		typed(types.Types[types.TUINTPTR], dict2Var)
-	} else {
-		// Static dictionary, so can be used directly in the closure
-		dict2Var = dictValue
-	}
-	// Also capture the receiver variable.
-	var rcvr2Var *ir.Name
-	if rcvrValue != nil {
-		rcvr2Var = ir.CaptureName(pos, fn, rcvrVar)
-	}
-
-	// Build arguments to call inside the closure.
-	var args []ir.Node
-
-	// First the dictionary argument.
-	args = append(args, dict2Var)
-	// Then the receiver.
-	if rcvrValue != nil {
-		args = append(args, rcvr2Var)
-	}
-	// Then all the other arguments (including receiver for method expressions).
-	for i := 0; i < typ.NumParams(); i++ {
-		if x.Op() == ir.OMETHEXPR && i == 0 {
-			// If we are doing a method expression, we need to
-			// explicitly traverse any embedded fields in the receiver
-			// argument in order to call the method instantiation.
-			arg0 := formalParams[0].Nname.(ir.Node)
-			arg0 = typecheck.AddImplicitDots(ir.NewSelectorExpr(x.Pos(), ir.OXDOT, arg0, x.(*ir.SelectorExpr).Sel)).X
-			if valueMethod && arg0.Type().IsPtr() {
-				// For handling the (*T).M case: if we have a pointer
-				// receiver after following all the embedded fields,
-				// but it's a value method, add a star operator.
-				arg0 = ir.NewStarExpr(arg0.Pos(), arg0)
-			}
-			args = append(args, arg0)
-		} else {
-			args = append(args, formalParams[i].Nname.(*ir.Name))
-		}
-	}
-
-	// Build call itself.
-	var innerCall ir.Node = ir.NewCallExpr(pos, ir.OCALL, target.Nname, args)
-	innerCall.(*ir.CallExpr).IsDDD = typ.IsVariadic()
-	if len(formalResults) > 0 {
-		innerCall = ir.NewReturnStmt(pos, []ir.Node{innerCall})
-	}
-	// Finish building body of closure.
-	ir.CurFunc = fn
-	// TODO: set types directly here instead of using typecheck.Stmt
-	typecheck.Stmt(innerCall)
-	ir.CurFunc = nil
-	fn.Body = []ir.Node{innerCall}
-
-	// We're all done with the captured dictionary (and receiver, for method values).
-	ir.FinishCaptureNames(pos, outer, fn)
-
-	// Make a closure referencing our new internal function.
-	c := ir.UseClosure(fn.OClosure, typecheck.Target)
-	var init []ir.Node
-	if outer != nil {
-		init = append(init, dictAssign)
-	}
-	if rcvrValue != nil {
-		init = append(init, rcvrAssign)
-	}
-	return ir.InitExpr(init, c)
-}
-
-// instantiateMethods instantiates all the methods (and associated dictionaries) of
-// all fully-instantiated generic types that have been added to typecheck.instTypeList.
-// It continues until no more types are added to typecheck.instTypeList.
-func (g *genInst) instantiateMethods() {
-	for {
-		instTypeList := typecheck.GetInstTypeList()
-		if len(instTypeList) == 0 {
-			break
-		}
-		typecheck.ClearInstTypeList()
-		for _, typ := range instTypeList {
-			assert(!typ.HasShape())
-			// Mark runtime type as needed, since this ensures that the
-			// compiler puts out the needed DWARF symbols, when this
-			// instantiated type has a different package from the local
-			// package.
-			typecheck.NeedRuntimeType(typ)
-			// Lookup the method on the base generic type, since methods may
-			// not be set on imported instantiated types.
-			baseType := typ.OrigType()
-			for j := range typ.Methods().Slice() {
-				if baseType.Methods().Slice()[j].Nointerface() {
-					typ.Methods().Slice()[j].SetNointerface(true)
-				}
-				baseNname := baseType.Methods().Slice()[j].Nname.(*ir.Name)
-				// Eagerly generate the instantiations and dictionaries that implement these methods.
-				// We don't use the instantiations here, just generate them (and any
-				// further instantiations those generate, etc.).
-				// Note that we don't set the Func for any methods on instantiated
-				// types. Their signatures don't match so that would be confusing.
-				// Direct method calls go directly to the instantiations, implemented above.
-				// Indirect method calls use wrappers generated in reflectcall. Those wrappers
-				// will use these instantiations if they are needed (for interface tables or reflection).
-				_ = g.getInstantiation(baseNname, typ.RParams(), true)
-				_ = g.getDictionarySym(baseNname, typ.RParams(), true)
-			}
-		}
-	}
-}
-
-// getInstNameNode returns the name node for the method or function being instantiated, and a bool which is true if a method is being instantiated.
-func (g *genInst) getInstNameNode(inst *ir.InstExpr) (*ir.Name, bool) {
-	if meth, ok := inst.X.(*ir.SelectorExpr); ok {
-		return meth.Selection.Nname.(*ir.Name), true
-	} else {
-		return inst.X.(*ir.Name), false
-	}
-}
-
-// getDictOrSubdict returns, for a method/function call or reference (node n) in an
-// instantiation (described by instInfo), a node which is accessing a sub-dictionary
-// or main/static dictionary, as needed, and also returns a boolean indicating if a
-// sub-dictionary was accessed. nameNode is the particular function or method being
-// called/referenced, and targs are the type arguments.
-func (g *genInst) getDictOrSubdict(declInfo *instInfo, n ir.Node, nameNode *ir.Name, targs []*types.Type, isMeth bool) (ir.Node, bool) {
-	var dict ir.Node
-	usingSubdict := false
-	if declInfo != nil {
-		entry := -1
-		for i, de := range declInfo.dictInfo.subDictCalls {
-			if n == de.callNode {
-				entry = declInfo.dictInfo.startSubDict + i
-				break
-			}
-		}
-		// If the entry is not found, it may be that this node did not have
-		// any type args that depend on type params, so we need a main
-		// dictionary, not a sub-dictionary.
-		if entry >= 0 {
-			dict = getDictionaryEntry(n.Pos(), declInfo.dictParam, entry, declInfo.dictInfo.dictLen)
-			usingSubdict = true
-		}
-	}
-	if !usingSubdict {
-		dict = g.getDictionaryValue(n.Pos(), nameNode, targs, isMeth)
-	}
-	return dict, usingSubdict
-}
-
-// checkFetchBody checks if a generic body can be fetched, but hasn't been loaded
-// yet. If so, it imports the body.
-func checkFetchBody(nameNode *ir.Name) {
-	if nameNode.Func.Body == nil && nameNode.Func.Inl != nil {
-		// If there is no body yet but Func.Inl exists, then we can
-		// import the whole generic body.
-		assert(nameNode.Func.Inl.Cost == 1 && nameNode.Sym().Pkg != types.LocalPkg)
-		typecheck.ImportBody(nameNode.Func)
-		assert(nameNode.Func.Inl.Body != nil)
-		nameNode.Func.Body = nameNode.Func.Inl.Body
-		nameNode.Func.Dcl = nameNode.Func.Inl.Dcl
-	}
-}
-
-// getInstantiation gets the instantiation and dictionary of the function or method nameNode
-// with the type arguments shapes. If the instantiated function is not already
-// cached, then it calls genericSubst to create the new instantiation.
-func (g *genInst) getInstantiation(nameNode *ir.Name, shapes []*types.Type, isMeth bool) *instInfo {
-	if nameNode.Func == nil {
-		// If nameNode.Func is nil, this must be a reference to a method of
-		// an imported instantiated type. We will have already called
-		// g.instantiateMethods() on the fully-instantiated type, so
-		// g.instInfoMap[sym] will be non-nil below.
-		rcvr := nameNode.Type().Recv()
-		if rcvr == nil || !deref(rcvr.Type).IsFullyInstantiated() {
-			base.FatalfAt(nameNode.Pos(), "Unexpected function instantiation %v with no body", nameNode)
-		}
-	} else {
-		checkFetchBody(nameNode)
-	}
-
-	var tparams []*types.Type
-	if isMeth {
-		// Get the type params from the method receiver (after skipping
-		// over any pointer)
-		recvType := nameNode.Type().Recv().Type
-		recvType = deref(recvType)
-		if recvType.IsFullyInstantiated() {
-			// Get the type of the base generic type, so we get
-			// its original typeparams.
-			recvType = recvType.OrigType()
-		}
-		tparams = recvType.RParams()
-	} else {
-		fields := nameNode.Type().TParams().Fields().Slice()
-		tparams = make([]*types.Type, len(fields))
-		for i, f := range fields {
-			tparams[i] = f.Type
-		}
-	}
-
-	// Convert any non-shape type arguments to their shape, so we can reduce the
-	// number of instantiations we have to generate. You can actually have a mix
-	// of shape and non-shape arguments, because of inferred or explicitly
-	// specified concrete type args.
-	s1 := make([]*types.Type, len(shapes))
-	for i, t := range shapes {
-		var tparam *types.Type
-		// Shapes are grouped differently for structural types, so we
-		// pass the type param to Shapify(), so we can distinguish.
-		tparam = tparams[i]
-		if !t.IsShape() {
-			s1[i] = typecheck.Shapify(t, i, tparam)
-		} else {
-			// Already a shape, but make sure it has the correct index.
-			s1[i] = typecheck.Shapify(shapes[i].Underlying(), i, tparam)
-		}
-	}
-	shapes = s1
-
-	sym := typecheck.MakeFuncInstSym(nameNode.Sym(), shapes, false, isMeth)
-	info := g.instInfoMap[sym]
-	if info == nil {
-		// If instantiation doesn't exist yet, create it and add
-		// to the list of decls.
-		info = &instInfo{
-			dictInfo: &dictInfo{},
-		}
-		info.dictInfo.shapeToBound = make(map[*types.Type]*types.Type)
-
-		if sym.Def != nil {
-			// This instantiation must have been imported from another
-			// package (because it was needed for inlining), so we should
-			// not re-generate it and have conflicting definitions for the
-			// symbol (issue #50121). It will have already gone through the
-			// dictionary transformations of dictPass, so we don't actually
-			// need the info.dictParam and info.shapeToBound info filled in
-			// below. We just set the imported instantiation as info.fun.
-			assert(sym.Pkg != types.LocalPkg)
-			info.fun = sym.Def.(*ir.Name).Func
-			assert(info.fun != nil)
-			g.instInfoMap[sym] = info
-			return info
-		}
-
-		// genericSubst fills in info.dictParam and info.shapeToBound.
-		st := g.genericSubst(sym, nameNode, tparams, shapes, isMeth, info)
-		info.fun = st
-		g.instInfoMap[sym] = info
-
-		// getInstInfo fills in info.dictInfo.
-		g.getInstInfo(st, shapes, info)
-		if base.Flag.W > 1 {
-			ir.Dump(fmt.Sprintf("\nstenciled %v", st), st)
-		}
-
-		// This ensures that the linker drops duplicates of this instantiation.
-		// All just works!
-		st.SetDupok(true)
-		typecheck.Target.Decls = append(typecheck.Target.Decls, st)
-		g.newInsts = append(g.newInsts, st)
-	}
-	return info
-}
-
-// Struct containing info needed for doing the substitution as we create the
-// instantiation of a generic function with specified type arguments.
-type subster struct {
-	g           *genInst
-	isMethod    bool     // If a method is being instantiated
-	newf        *ir.Func // Func node for the new stenciled function
-	ts          typecheck.Tsubster
-	info        *instInfo // Place to put extra info in the instantiation
-	skipClosure bool      // Skip substituting closures
-
-	// Map from non-nil, non-ONAME node n to slice of all m, where m.Defn = n
-	defnMap map[ir.Node][]**ir.Name
-}
-
-// genericSubst returns a new function with name newsym. The function is an
-// instantiation of a generic function or method specified by namedNode with type
-// args shapes. For a method with a generic receiver, it returns an instantiated
-// function type where the receiver becomes the first parameter. For either a generic
-// method or function, a dictionary parameter is the added as the very first
-// parameter. genericSubst fills in info.dictParam and info.shapeToBound.
-func (g *genInst) genericSubst(newsym *types.Sym, nameNode *ir.Name, tparams []*types.Type, shapes []*types.Type, isMethod bool, info *instInfo) *ir.Func {
-	gf := nameNode.Func
-	// Pos of the instantiated function is same as the generic function
-	newf := ir.NewFunc(gf.Pos())
-	newf.Pragma = gf.Pragma // copy over pragmas from generic function to stenciled implementation.
-	newf.Endlineno = gf.Endlineno
-	newf.Nname = ir.NewNameAt(gf.Pos(), newsym)
-	newf.Nname.Func = newf
-	newf.Nname.Defn = newf
-	newsym.Def = newf.Nname
-	savef := ir.CurFunc
-	// transformCall/transformReturn (called during stenciling of the body)
-	// depend on ir.CurFunc being set.
-	ir.CurFunc = newf
-
-	assert(len(tparams) == len(shapes))
-
-	subst := &subster{
-		g:        g,
-		isMethod: isMethod,
-		newf:     newf,
-		info:     info,
-		ts: typecheck.Tsubster{
-			Tparams: tparams,
-			Targs:   shapes,
-			Vars:    make(map[*ir.Name]*ir.Name),
-		},
-		defnMap: make(map[ir.Node][]**ir.Name),
-	}
-
-	newf.Dcl = make([]*ir.Name, 0, len(gf.Dcl)+1)
-
-	// Create the needed dictionary param
-	dictionarySym := newsym.Pkg.Lookup(typecheck.LocalDictName)
-	dictionaryType := types.Types[types.TUINTPTR]
-	dictionaryName := ir.NewNameAt(gf.Pos(), dictionarySym)
-	typed(dictionaryType, dictionaryName)
-	dictionaryName.Class = ir.PPARAM
-	dictionaryName.Curfn = newf
-	newf.Dcl = append(newf.Dcl, dictionaryName)
-	for _, n := range gf.Dcl {
-		if n.Sym().Name == typecheck.LocalDictName {
-			panic("already has dictionary")
-		}
-		newf.Dcl = append(newf.Dcl, subst.localvar(n))
-	}
-	dictionaryArg := types.NewField(gf.Pos(), dictionarySym, dictionaryType)
-	dictionaryArg.Nname = dictionaryName
-	info.dictParam = dictionaryName
-
-	// We add the dictionary as the first parameter in the function signature.
-	// We also transform a method type to the corresponding function type
-	// (make the receiver be the next parameter after the dictionary).
-	oldt := nameNode.Type()
-	var args []*types.Field
-	args = append(args, dictionaryArg)
-	args = append(args, oldt.Recvs().FieldSlice()...)
-	args = append(args, oldt.Params().FieldSlice()...)
-
-	// Replace the types in the function signature via subst.fields.
-	// Ugly: also, we have to insert the Name nodes of the parameters/results into
-	// the function type. The current function type has no Nname fields set,
-	// because it came via conversion from the types2 type.
-	newt := types.NewSignature(oldt.Pkg(), nil, nil,
-		subst.fields(ir.PPARAM, args, newf.Dcl),
-		subst.fields(ir.PPARAMOUT, oldt.Results().FieldSlice(), newf.Dcl))
-
-	typed(newt, newf.Nname)
-	ir.MarkFunc(newf.Nname)
-	newf.SetTypecheck(1)
-
-	// Make sure name/type of newf is set before substituting the body.
-	newf.Body = subst.list(gf.Body)
-	if len(newf.Body) == 0 {
-		// Ensure the body is nonempty, for issue 49524.
-		// TODO: have some other way to detect the difference between
-		// a function declared with no body, vs. one with an empty body?
-		newf.Body = append(newf.Body, ir.NewBlockStmt(gf.Pos(), nil))
-	}
-
-	if len(subst.defnMap) > 0 {
-		base.Fatalf("defnMap is not empty")
-	}
-
-	for i, tp := range tparams {
-		info.dictInfo.shapeToBound[shapes[i]] = subst.ts.Typ(tp.Bound())
-	}
-
-	ir.CurFunc = savef
-
-	return subst.newf
-}
-
-// localvar creates a new name node for the specified local variable and enters it
-// in subst.vars. It substitutes type arguments for type parameters in the type of
-// name as needed.
-func (subst *subster) localvar(name *ir.Name) *ir.Name {
-	m := ir.NewNameAt(name.Pos(), name.Sym())
-	if name.IsClosureVar() {
-		m.SetIsClosureVar(true)
-	}
-	m.SetType(subst.ts.Typ(name.Type()))
-	m.BuiltinOp = name.BuiltinOp
-	m.Curfn = subst.newf
-	m.Class = name.Class
-	assert(name.Class != ir.PEXTERN && name.Class != ir.PFUNC)
-	m.Func = name.Func
-	subst.ts.Vars[name] = m
-	m.SetTypecheck(1)
-	m.DictIndex = name.DictIndex
-	if name.Defn != nil {
-		if name.Defn.Op() == ir.ONAME {
-			// This is a closure variable, so its Defn is the outer
-			// captured variable, which has already been substituted.
-			m.Defn = subst.node(name.Defn)
-		} else {
-			// The other values of Defn are nodes in the body of the
-			// function, so just remember the mapping so we can set Defn
-			// properly in node() when we create the new body node. We
-			// always call localvar() on all the local variables before
-			// we substitute the body.
-			slice := subst.defnMap[name.Defn]
-			subst.defnMap[name.Defn] = append(slice, &m)
-		}
-	}
-	if name.Outer != nil {
-		m.Outer = subst.node(name.Outer).(*ir.Name)
-	}
-
-	return m
-}
-
-// getDictionaryEntry gets the i'th entry in the dictionary dict.
-func getDictionaryEntry(pos src.XPos, dict *ir.Name, i int, size int) ir.Node {
-	// Convert dictionary to *[N]uintptr
-	// All entries in the dictionary are pointers. They all point to static data, though, so we
-	// treat them as uintptrs so the GC doesn't need to keep track of them.
-	d := ir.NewConvExpr(pos, ir.OCONVNOP, types.Types[types.TUNSAFEPTR], dict)
-	d.SetTypecheck(1)
-	d = ir.NewConvExpr(pos, ir.OCONVNOP, types.NewArray(types.Types[types.TUINTPTR], int64(size)).PtrTo(), d)
-	d.SetTypecheck(1)
-	types.CheckSize(d.Type().Elem())
-
-	// Load entry i out of the dictionary.
-	deref := ir.NewStarExpr(pos, d)
-	typed(d.Type().Elem(), deref)
-	idx := ir.NewConstExpr(constant.MakeUint64(uint64(i)), dict) // TODO: what to set orig to?
-	typed(types.Types[types.TUINTPTR], idx)
-	r := ir.NewIndexExpr(pos, deref, idx)
-	typed(types.Types[types.TUINTPTR], r)
-	return r
-}
-
-// getDictionaryEntryAddr gets the address of the i'th entry in dictionary dict.
-func getDictionaryEntryAddr(pos src.XPos, dict *ir.Name, i int, size int) ir.Node {
-	a := ir.NewAddrExpr(pos, getDictionaryEntry(pos, dict, i, size))
-	typed(types.Types[types.TUINTPTR].PtrTo(), a)
-	return a
-}
-
-// getDictionaryType returns a *runtime._type from the dictionary entry i (which
-// refers to a type param or a derived type that uses type params). It uses the
-// specified dictionary dictParam, rather than the one in info.dictParam.
-func getDictionaryType(info *instInfo, dictParam *ir.Name, pos src.XPos, i int) ir.Node {
-	if i < 0 || i >= info.dictInfo.startSubDict {
-		base.Fatalf(fmt.Sprintf("bad dict index %d", i))
-	}
-
-	r := getDictionaryEntry(pos, dictParam, i, info.dictInfo.startSubDict)
-	// change type of retrieved dictionary entry to *byte, which is the
-	// standard typing of a *runtime._type in the compiler
-	typed(types.Types[types.TUINT8].PtrTo(), r)
-	return r
-}
-
-// node is like DeepCopy(), but substitutes ONAME nodes based on subst.ts.vars, and
-// also descends into closures. It substitutes type arguments for type parameters in
-// all the new nodes and does the transformations that were delayed on the generic
-// function.
-func (subst *subster) node(n ir.Node) ir.Node {
-	// Use closure to capture all state needed by the ir.EditChildren argument.
-	var edit func(ir.Node) ir.Node
-	edit = func(x ir.Node) ir.Node {
-		// Analogous to ir.SetPos() at beginning of typecheck.typecheck() -
-		// allows using base.Pos during the transform functions, just like
-		// the tc*() functions.
-		ir.SetPos(x)
-		switch x.Op() {
-		case ir.OTYPE:
-			return ir.TypeNode(subst.ts.Typ(x.Type()))
-
-		case ir.ONAME:
-			if v := subst.ts.Vars[x.(*ir.Name)]; v != nil {
-				return v
-			}
-			if ir.IsBlank(x) {
-				// Special case, because a blank local variable is
-				// not in the fn.Dcl list.
-				m := ir.NewNameAt(x.Pos(), ir.BlankNode.Sym())
-				return typed(subst.ts.Typ(x.Type()), m)
-			}
-			return x
-		case ir.ONONAME:
-			// This handles the identifier in a type switch guard
-			fallthrough
-		case ir.OLITERAL, ir.ONIL:
-			if x.Sym() != nil {
-				return x
-			}
-		}
-		m := ir.Copy(x)
-
-		slice, ok := subst.defnMap[x]
-		if ok {
-			// We just copied a non-ONAME node which was the Defn value
-			// of a local variable. Set the Defn value of the copied
-			// local variable to this new Defn node.
-			for _, ptr := range slice {
-				(*ptr).Defn = m
-			}
-			delete(subst.defnMap, x)
-		}
-
-		if _, isExpr := m.(ir.Expr); isExpr {
-			t := x.Type()
-			if t == nil {
-				// Check for known cases where t can be nil (call
-				// that has no return values, and key expressions)
-				// and otherwise cause a fatal error.
-				_, isCallExpr := m.(*ir.CallExpr)
-				_, isStructKeyExpr := m.(*ir.StructKeyExpr)
-				_, isKeyExpr := m.(*ir.KeyExpr)
-				if !isCallExpr && !isStructKeyExpr && !isKeyExpr && x.Op() != ir.OPANIC &&
-					x.Op() != ir.OCLOSE {
-					base.FatalfAt(m.Pos(), "Nil type for %v", x)
-				}
-			} else if x.Op() != ir.OCLOSURE {
-				m.SetType(subst.ts.Typ(x.Type()))
-			}
-		}
-
-		old := subst.skipClosure
-		// For unsafe.{Alignof,Offsetof,Sizeof}, subster will transform them to OLITERAL nodes,
-		// and discard their arguments. However, their children nodes were already process before,
-		// thus if they contain any closure, the closure was still be added to package declarations
-		// queue for processing later. Thus, genInst will fail to generate instantiation for the
-		// closure because of lacking dictionary information, see issue #53390.
-		if call, ok := m.(*ir.CallExpr); ok && call.X.Op() == ir.ONAME {
-			switch call.X.Name().BuiltinOp {
-			case ir.OALIGNOF, ir.OOFFSETOF, ir.OSIZEOF:
-				subst.skipClosure = true
-			}
-		}
-		ir.EditChildren(m, edit)
-		subst.skipClosure = old
-
-		m.SetTypecheck(1)
-
-		// Do the transformations that we delayed on the generic function
-		// node, now that we have substituted in the type args.
-		switch x.Op() {
-		case ir.OEQ, ir.ONE, ir.OLT, ir.OLE, ir.OGT, ir.OGE:
-			transformCompare(m.(*ir.BinaryExpr))
-
-		case ir.OSLICE, ir.OSLICE3:
-			transformSlice(m.(*ir.SliceExpr))
-
-		case ir.OADD:
-			m = transformAdd(m.(*ir.BinaryExpr))
-
-		case ir.OINDEX:
-			transformIndex(m.(*ir.IndexExpr))
-
-		case ir.OAS2:
-			as2 := m.(*ir.AssignListStmt)
-			transformAssign(as2, as2.Lhs, as2.Rhs)
-
-		case ir.OAS:
-			as := m.(*ir.AssignStmt)
-			if as.Y != nil {
-				// transformAssign doesn't handle the case
-				// of zeroing assignment of a dcl (rhs[0] is nil).
-				lhs, rhs := []ir.Node{as.X}, []ir.Node{as.Y}
-				transformAssign(as, lhs, rhs)
-				as.X, as.Y = lhs[0], rhs[0]
-			}
-
-		case ir.OASOP:
-			as := m.(*ir.AssignOpStmt)
-			transformCheckAssign(as, as.X)
-
-		case ir.ORETURN:
-			transformReturn(m.(*ir.ReturnStmt))
-
-		case ir.OSEND:
-			transformSend(m.(*ir.SendStmt))
-
-		case ir.OSELECT:
-			transformSelect(m.(*ir.SelectStmt))
-
-		case ir.OCOMPLIT:
-			transformCompLit(m.(*ir.CompLitExpr))
-
-		case ir.OADDR:
-			transformAddr(m.(*ir.AddrExpr))
-
-		case ir.OLITERAL:
-			t := m.Type()
-			if t != x.Type() {
-				// types2 will give us a constant with a type T,
-				// if an untyped constant is used with another
-				// operand of type T (in a provably correct way).
-				// When we substitute in the type args during
-				// stenciling, we now know the real type of the
-				// constant. We may then need to change the
-				// BasicLit.val to be the correct type (e.g.
-				// convert an int64Val constant to a floatVal
-				// constant).
-				m.SetType(types.UntypedInt) // use any untyped type for DefaultLit to work
-				m = typecheck.DefaultLit(m, t)
-			}
-
-		case ir.OXDOT:
-			// Finish the transformation of an OXDOT, unless this is
-			// bound call or field access on a type param. A bound call
-			// or field access on a type param will be transformed during
-			// the dictPass. Otherwise, m will be transformed to an
-			// OMETHVALUE node. It will be transformed to an ODOTMETH or
-			// ODOTINTER node if we find in the OCALL case below that the
-			// method value is actually called.
-			mse := m.(*ir.SelectorExpr)
-			if src := mse.X.Type(); !src.IsShape() {
-				transformDot(mse, false)
-			}
-
-		case ir.OCALL:
-			call := m.(*ir.CallExpr)
-			switch call.X.Op() {
-			case ir.OTYPE:
-				// Transform the conversion, now that we know the
-				// type argument.
-				m = transformConvCall(call)
-
-			case ir.OMETHVALUE, ir.OMETHEXPR:
-				// Redo the transformation of OXDOT, now that we
-				// know the method value is being called. Then
-				// transform the call.
-				call.X.(*ir.SelectorExpr).SetOp(ir.OXDOT)
-				transformDot(call.X.(*ir.SelectorExpr), true)
-				transformCall(call)
-
-			case ir.ODOT, ir.ODOTPTR:
-				// An OXDOT for a generic receiver was resolved to
-				// an access to a field which has a function
-				// value. Transform the call to that function, now
-				// that the OXDOT was resolved.
-				transformCall(call)
-
-			case ir.ONAME:
-				name := call.X.Name()
-				if name.BuiltinOp != ir.OXXX {
-					m = transformBuiltin(call)
-				} else {
-					// This is the case of a function value that was a
-					// type parameter (implied to be a function via a
-					// structural constraint) which is now resolved.
-					transformCall(call)
-				}
-
-			case ir.OFUNCINST:
-				// A call with an OFUNCINST will get transformed
-				// in stencil() once we have created & attached the
-				// instantiation to be called.
-				// We must transform the arguments of the call now, though,
-				// so that any needed CONVIFACE nodes are exposed,
-				// so the dictionary format is correct.
-				transformEarlyCall(call)
-
-			case ir.OXDOT:
-				// This is the case of a bound call or a field access
-				// on a typeparam, which will be handled in the
-				// dictPass. As with OFUNCINST, we must transform the
-				// arguments of the call now, so any needed CONVIFACE
-				// nodes are exposed.
-				transformEarlyCall(call)
-
-			case ir.ODOTTYPE, ir.ODOTTYPE2:
-				// These are DOTTYPEs that could get transformed into
-				// ODYNAMIC DOTTYPEs by the dict pass.
-
-			default:
-				// Transform a call for all other values of
-				// call.X.Op() that don't require any special
-				// handling.
-				transformCall(call)
-
-			}
-
-		case ir.OCLOSURE:
-			if subst.skipClosure {
-				break
-			}
-			// We're going to create a new closure from scratch, so clear m
-			// to avoid using the ir.Copy by accident until we reassign it.
-			m = nil
-
-			x := x.(*ir.ClosureExpr)
-			// Need to duplicate x.Func.Nname, x.Func.Dcl, x.Func.ClosureVars, and
-			// x.Func.Body.
-			oldfn := x.Func
-			newfn := ir.NewClosureFunc(oldfn.Pos(), subst.newf != nil)
-			ir.NameClosure(newfn.OClosure, subst.newf)
-
-			saveNewf := subst.newf
-			ir.CurFunc = newfn
-			subst.newf = newfn
-			newfn.Dcl = subst.namelist(oldfn.Dcl)
-
-			// Make a closure variable for the dictionary of the
-			// containing function.
-			cdict := ir.CaptureName(oldfn.Pos(), newfn, subst.info.dictParam)
-			typed(types.Types[types.TUINTPTR], cdict)
-			ir.FinishCaptureNames(oldfn.Pos(), saveNewf, newfn)
-			newfn.ClosureVars = append(newfn.ClosureVars, subst.namelist(oldfn.ClosureVars)...)
-
-			// Copy that closure variable to a local one.
-			// Note: this allows the dictionary to be captured by child closures.
-			// See issue 47723.
-			ldict := ir.NewNameAt(x.Pos(), newfn.Sym().Pkg.Lookup(typecheck.LocalDictName))
-			typed(types.Types[types.TUINTPTR], ldict)
-			ldict.Class = ir.PAUTO
-			ldict.Curfn = newfn
-			newfn.Dcl = append(newfn.Dcl, ldict)
-			as := ir.NewAssignStmt(x.Pos(), ldict, cdict)
-			as.SetTypecheck(1)
-			ldict.Defn = as
-			newfn.Body.Append(as)
-
-			// Create inst info for the instantiated closure. The dict
-			// param is the closure variable for the dictionary of the
-			// outer function. Since the dictionary is shared, use the
-			// same dictInfo.
-			cinfo := &instInfo{
-				fun:       newfn,
-				dictParam: ldict,
-				dictInfo:  subst.info.dictInfo,
-			}
-			subst.g.instInfoMap[newfn.Nname.Sym()] = cinfo
-
-			typed(subst.ts.Typ(oldfn.Nname.Type()), newfn.Nname)
-			typed(newfn.Nname.Type(), newfn.OClosure)
-			newfn.SetTypecheck(1)
-
-			outerinfo := subst.info
-			subst.info = cinfo
-			// Make sure type of closure function is set before doing body.
-			newfn.Body.Append(subst.list(oldfn.Body)...)
-			subst.info = outerinfo
-			subst.newf = saveNewf
-			ir.CurFunc = saveNewf
-
-			m = ir.UseClosure(newfn.OClosure, typecheck.Target)
-			subst.g.newInsts = append(subst.g.newInsts, m.(*ir.ClosureExpr).Func)
-			m.(*ir.ClosureExpr).SetInit(subst.list(x.Init()))
-
-		case ir.OSWITCH:
-			m := m.(*ir.SwitchStmt)
-			if m.Tag != nil && m.Tag.Op() == ir.OTYPESW {
-				break // Nothing to do here for type switches.
-			}
-			if m.Tag != nil && !types.IsComparable(m.Tag.Type()) {
-				break // Nothing to do here for un-comparable types.
-			}
-			if m.Tag != nil && !m.Tag.Type().IsEmptyInterface() && m.Tag.Type().HasShape() {
-				// To implement a switch on a value that is or has a type parameter, we first convert
-				// that thing we're switching on to an interface{}.
-				m.Tag = assignconvfn(m.Tag, types.Types[types.TINTER])
-			}
-			for _, c := range m.Cases {
-				for i, x := range c.List {
-					// If we have a case that is or has a type parameter, convert that case
-					// to an interface{}.
-					if !x.Type().IsEmptyInterface() && x.Type().HasShape() {
-						c.List[i] = assignconvfn(x, types.Types[types.TINTER])
-					}
-				}
-			}
-
-		}
-		return m
-	}
-
-	return edit(n)
-}
-
-// dictPass takes a function instantiation and does the transformations on the
-// operations that need to make use of the dictionary param.
-func (g *genInst) dictPass(info *instInfo) {
-	savef := ir.CurFunc
-	ir.CurFunc = info.fun
-
-	callMap := make(map[ir.Node]bool)
-
-	var edit func(ir.Node) ir.Node
-	edit = func(m ir.Node) ir.Node {
-		if m.Op() == ir.OCALL && m.(*ir.CallExpr).X.Op() == ir.OXDOT {
-			callMap[m.(*ir.CallExpr).X] = true
-		}
-
-		ir.EditChildren(m, edit)
-
-		switch m.Op() {
-		case ir.OCLOSURE:
-			newf := m.(*ir.ClosureExpr).Func
-			ir.CurFunc = newf
-			outerinfo := info
-			info = g.instInfoMap[newf.Nname.Sym()]
-
-			body := newf.Body
-			for i, n := range body {
-				body[i] = edit(n)
-			}
-
-			info = outerinfo
-			ir.CurFunc = info.fun
-
-		case ir.OXDOT:
-			// This is the case of a dot access on a type param. This is
-			// typically a bound call on the type param, but could be a
-			// field access, if the constraint has a single structural type.
-			mse := m.(*ir.SelectorExpr)
-			src := mse.X.Type()
-			assert(src.IsShape())
-
-			if mse.X.Op() == ir.OTYPE {
-				// Method expression T.M
-				idx := findMethodExprClosure(info.dictInfo, mse)
-				c := getDictionaryEntryAddr(m.Pos(), info.dictParam, info.dictInfo.startMethodExprClosures+idx, info.dictInfo.dictLen)
-				m = ir.NewConvExpr(m.Pos(), ir.OCONVNOP, mse.Type(), c)
-				m.SetTypecheck(1)
-			} else {
-				// If we can't find the selected method in the
-				// AllMethods of the bound, then this must be an access
-				// to a field of a structural type. If so, we skip the
-				// dictionary lookups - transformDot() will convert to
-				// the desired direct field access.
-				if isBoundMethod(info.dictInfo, mse) {
-					if callMap[m] {
-						// The OCALL surrounding this XDOT will rewrite the call
-						// to use the method expression closure directly.
-						break
-					}
-					// Convert this method value to a closure.
-					// TODO: use method expression closure.
-					dst := info.dictInfo.shapeToBound[mse.X.Type()]
-					// Implement x.M as a conversion-to-bound-interface
-					//  1) convert x to the bound interface
-					//  2) select method value M on that interface
-					if src.IsInterface() {
-						// If type arg is an interface (unusual case),
-						// we do a type assert to the type bound.
-						mse.X = assertToBound(info, info.dictParam, m.Pos(), mse.X, dst)
-					} else {
-						mse.X = convertUsingDictionary(info, info.dictParam, m.Pos(), mse.X, m, dst)
-					}
-				}
-				transformDot(mse, false)
-			}
-		case ir.OCALL:
-			call := m.(*ir.CallExpr)
-			op := call.X.Op()
-			if op == ir.OXDOT {
-				// This is a call of a method value where the value has a type parameter type.
-				// We transform to a call of the appropriate method expression closure
-				// in the dictionary.
-				// So if x has a type parameter type:
-				//   _ = x.m(a)
-				// Rewrite to:
-				//   _ = methexpr<m>(x, a)
-				se := call.X.(*ir.SelectorExpr)
-				call.SetOp(ir.OCALLFUNC)
-				idx := findMethodExprClosure(info.dictInfo, se)
-				c := getDictionaryEntryAddr(se.Pos(), info.dictParam, info.dictInfo.startMethodExprClosures+idx, info.dictInfo.dictLen)
-				t := typecheck.NewMethodType(se.Type(), se.X.Type())
-				call.X = ir.NewConvExpr(se.Pos(), ir.OCONVNOP, t, c)
-				typed(t, call.X)
-				call.Args.Prepend(se.X)
-				break
-				// TODO: deref case?
-			}
-			if op == ir.OMETHVALUE {
-				// Redo the transformation of OXDOT, now that we
-				// know the method value is being called.
-				call.X.(*ir.SelectorExpr).SetOp(ir.OXDOT)
-				transformDot(call.X.(*ir.SelectorExpr), true)
-			}
-			transformCall(call)
-
-		case ir.OCONVIFACE:
-			if m.Type().IsEmptyInterface() && m.(*ir.ConvExpr).X.Type().IsEmptyInterface() {
-				// Was T->interface{}, after stenciling it is now interface{}->interface{}.
-				// No longer need the conversion. See issue 48276.
-				m.(*ir.ConvExpr).SetOp(ir.OCONVNOP)
-				break
-			}
-			mce := m.(*ir.ConvExpr)
-			// Note: x's argument is still typed as a type parameter.
-			// m's argument now has an instantiated type.
-			if mce.X.Type().HasShape() || (m.Type().HasShape() && !m.Type().IsEmptyInterface()) {
-				m = convertUsingDictionary(info, info.dictParam, m.Pos(), mce.X, m, m.Type())
-			}
-		case ir.ODOTTYPE, ir.ODOTTYPE2:
-			dt := m.(*ir.TypeAssertExpr)
-			if dt.Type().IsEmptyInterface() || (dt.Type().IsInterface() && !dt.Type().HasShape()) {
-				break
-			}
-			if !dt.Type().HasShape() && !(dt.X.Type().HasShape() && !dt.X.Type().IsEmptyInterface()) {
-				break
-			}
-			var rtype, itab ir.Node
-			if dt.Type().IsInterface() || dt.X.Type().IsEmptyInterface() {
-				// TODO(mdempsky): Investigate executing this block unconditionally.
-				ix := findDictType(info, m.Type())
-				assert(ix >= 0)
-				rtype = getDictionaryType(info, info.dictParam, dt.Pos(), ix)
-			} else {
-				// nonempty interface to noninterface. Need an itab.
-				ix := -1
-				for i, ic := range info.dictInfo.itabConvs {
-					if ic == m {
-						ix = info.dictInfo.startItabConv + i
-						break
-					}
-				}
-				assert(ix >= 0)
-				itab = getDictionaryEntry(dt.Pos(), info.dictParam, ix, info.dictInfo.dictLen)
-			}
-			op := ir.ODYNAMICDOTTYPE
-			if m.Op() == ir.ODOTTYPE2 {
-				op = ir.ODYNAMICDOTTYPE2
-			}
-			m = ir.NewDynamicTypeAssertExpr(dt.Pos(), op, dt.X, rtype)
-			m.(*ir.DynamicTypeAssertExpr).ITab = itab
-			m.SetType(dt.Type())
-			m.SetTypecheck(1)
-		case ir.OCASE:
-			if _, ok := m.(*ir.CommClause); ok {
-				// This is not a type switch. TODO: Should we use an OSWITCH case here instead of OCASE?
-				break
-			}
-			m := m.(*ir.CaseClause)
-			for i, c := range m.List {
-				if c.Op() == ir.OTYPE && c.Type().HasShape() {
-					// Use a *runtime._type for the dynamic type.
-					ix := findDictType(info, m.List[i].Type())
-					assert(ix >= 0)
-					dt := ir.NewDynamicType(c.Pos(), getDictionaryEntry(c.Pos(), info.dictParam, ix, info.dictInfo.dictLen))
-
-					// For type switch from nonempty interfaces to non-interfaces, we need an itab as well.
-					if !m.List[i].Type().IsInterface() {
-						if _, ok := info.dictInfo.type2switchType[m.List[i]]; ok {
-							// Type switch from nonempty interface. We need a *runtime.itab
-							// for the dynamic type.
-							ix := -1
-							for j, ic := range info.dictInfo.itabConvs {
-								if ic == m.List[i] {
-									ix = info.dictInfo.startItabConv + j
-									break
-								}
-							}
-							assert(ix >= 0)
-							dt.ITab = getDictionaryEntry(c.Pos(), info.dictParam, ix, info.dictInfo.dictLen)
-						}
-					}
-					typed(m.List[i].Type(), dt)
-					m.List[i] = dt
-				}
-			}
-
-		}
-		return m
-	}
-	edit(info.fun)
-	ir.CurFunc = savef
-}
-
-// findDictType looks for type t in the typeparams or derived types in the generic
-// function info.gfInfo. This will indicate the dictionary entry with the
-// correct concrete type for the associated instantiated function.
-func findDictType(info *instInfo, t *types.Type) int {
-	for i, dt := range info.dictInfo.shapeParams {
-		if dt == t {
-			return i
-		}
-	}
-	for i, dt := range info.dictInfo.derivedTypes {
-		if types.IdenticalStrict(dt, t) {
-			return i + len(info.dictInfo.shapeParams)
-		}
-	}
-	return -1
-}
-
-// convertUsingDictionary converts instantiated value v (type v.Type()) to an interface
-// type dst, by returning a new set of nodes that make use of a dictionary entry. in is the
-// instantiated node of the CONVIFACE node or XDOT node (for a bound method call) that is causing the
-// conversion.
-func convertUsingDictionary(info *instInfo, dictParam *ir.Name, pos src.XPos, v ir.Node, in ir.Node, dst *types.Type) ir.Node {
-	assert(v.Type().HasShape() || (in.Type().HasShape() && !in.Type().IsEmptyInterface()))
-	assert(dst.IsInterface())
-
-	if v.Type().IsInterface() {
-		// Converting from an interface. The shape-ness of the source doesn't really matter, as
-		// we'll be using the concrete type from the first interface word.
-		if dst.IsEmptyInterface() {
-			// Converting I2E. OCONVIFACE does that for us, and doesn't depend
-			// on what the empty interface was instantiated with. No dictionary entry needed.
-			v = ir.NewConvExpr(pos, ir.OCONVIFACE, dst, v)
-			v.SetTypecheck(1)
-			return v
-		}
-		if !in.Type().HasShape() {
-			// Regular OCONVIFACE works if the destination isn't parameterized.
-			v = ir.NewConvExpr(pos, ir.OCONVIFACE, dst, v)
-			v.SetTypecheck(1)
-			return v
-		}
-
-		// We get the destination interface type from the dictionary and the concrete
-		// type from the argument's itab. Call runtime.convI2I to get the new itab.
-		tmp := typecheck.Temp(v.Type())
-		as := ir.NewAssignStmt(pos, tmp, v)
-		as.SetTypecheck(1)
-		itab := ir.NewUnaryExpr(pos, ir.OITAB, tmp)
-		typed(types.Types[types.TUINTPTR].PtrTo(), itab)
-		idata := ir.NewUnaryExpr(pos, ir.OIDATA, tmp)
-		typed(types.Types[types.TUNSAFEPTR], idata)
-
-		fn := typecheck.LookupRuntime("convI2I")
-		fn.SetTypecheck(1)
-		types.CalcSize(fn.Type())
-		call := ir.NewCallExpr(pos, ir.OCALLFUNC, fn, nil)
-		typed(types.Types[types.TUINT8].PtrTo(), call)
-		ix := findDictType(info, in.Type())
-		assert(ix >= 0)
-		inter := getDictionaryType(info, dictParam, pos, ix)
-		call.Args = []ir.Node{inter, itab}
-		i := ir.NewBinaryExpr(pos, ir.OEFACE, call, idata)
-		typed(dst, i)
-		i.PtrInit().Append(as)
-		return i
-	}
-
-	var rt ir.Node
-	if !dst.IsEmptyInterface() {
-		// We should have an itab entry in the dictionary. Using this itab
-		// will be more efficient than converting to an empty interface first
-		// and then type asserting to dst.
-		ix := -1
-		for i, ic := range info.dictInfo.itabConvs {
-			if ic == in {
-				ix = info.dictInfo.startItabConv + i
-				break
-			}
-		}
-		assert(ix >= 0)
-		rt = getDictionaryEntry(pos, dictParam, ix, info.dictInfo.dictLen)
-	} else {
-		ix := findDictType(info, v.Type())
-		assert(ix >= 0)
-		// Load the actual runtime._type of the type parameter from the dictionary.
-		rt = getDictionaryType(info, dictParam, pos, ix)
-	}
-
-	// Figure out what the data field of the interface will be.
-	data := ir.NewConvExpr(pos, ir.OCONVIDATA, nil, v)
-	typed(types.Types[types.TUNSAFEPTR], data)
-
-	// Build an interface from the type and data parts.
-	var i ir.Node = ir.NewBinaryExpr(pos, ir.OEFACE, rt, data)
-	typed(dst, i)
-	return i
-}
-
-func (subst *subster) namelist(l []*ir.Name) []*ir.Name {
-	s := make([]*ir.Name, len(l))
-	for i, n := range l {
-		s[i] = subst.localvar(n)
-	}
-	return s
-}
-
-func (subst *subster) list(l []ir.Node) []ir.Node {
-	s := make([]ir.Node, len(l))
-	for i, n := range l {
-		s[i] = subst.node(n)
-	}
-	return s
-}
-
-// fields sets the Nname field for the Field nodes inside a type signature, based
-// on the corresponding in/out parameters in dcl. It depends on the in and out
-// parameters being in order in dcl.
-func (subst *subster) fields(class ir.Class, oldfields []*types.Field, dcl []*ir.Name) []*types.Field {
-	// Find the starting index in dcl of declarations of the class (either
-	// PPARAM or PPARAMOUT).
-	var i int
-	for i = range dcl {
-		if dcl[i].Class == class {
-			break
-		}
-	}
-
-	// Create newfields nodes that are copies of the oldfields nodes, but
-	// with substitution for any type params, and with Nname set to be the node in
-	// Dcl for the corresponding PPARAM or PPARAMOUT.
-	newfields := make([]*types.Field, len(oldfields))
-	for j := range oldfields {
-		newfields[j] = oldfields[j].Copy()
-		newfields[j].Type = subst.ts.Typ(oldfields[j].Type)
-		// A PPARAM field will be missing from dcl if its name is
-		// unspecified or specified as "_". So, we compare the dcl sym
-		// with the field sym (or sym of the field's Nname node). (Unnamed
-		// results still have a name like ~r2 in their Nname node.) If
-		// they don't match, this dcl (if there is one left) must apply to
-		// a later field.
-		if i < len(dcl) && (dcl[i].Sym() == oldfields[j].Sym ||
-			(oldfields[j].Nname != nil && dcl[i].Sym() == oldfields[j].Nname.Sym())) {
-			newfields[j].Nname = dcl[i]
-			i++
-		}
-	}
-	return newfields
-}
-
-// deref does a single deref of type t, if it is a pointer type.
-func deref(t *types.Type) *types.Type {
-	if t.IsPtr() {
-		return t.Elem()
-	}
-	return t
-}
-
-// markTypeUsed marks type t as used in order to help avoid dead-code elimination of
-// needed methods.
-func markTypeUsed(t *types.Type, lsym *obj.LSym) {
-	if t.IsInterface() {
-		return
-	}
-	// TODO: This is somewhat overkill, we really only need it
-	// for types that are put into interfaces.
-	// Note: this relocation is also used in cmd/link/internal/ld/dwarf.go
-	reflectdata.MarkTypeUsedInInterface(t, lsym)
-}
-
-// getDictionarySym returns the dictionary for the named generic function gf, which
-// is instantiated with the type arguments targs.
-func (g *genInst) getDictionarySym(gf *ir.Name, targs []*types.Type, isMeth bool) *types.Sym {
-	if len(targs) == 0 {
-		base.Fatalf("%s should have type arguments", gf.Sym().Name)
-	}
-
-	// Enforce that only concrete types can make it to here.
-	for _, t := range targs {
-		if t.HasShape() {
-			panic(fmt.Sprintf("shape %+v in dictionary for %s", t, gf.Sym().Name))
-		}
-	}
-
-	// Get a symbol representing the dictionary.
-	sym := typecheck.MakeDictSym(gf.Sym(), targs, isMeth)
-
-	// Initialize the dictionary, if we haven't yet already.
-	lsym := sym.Linksym()
-	if len(lsym.P) > 0 {
-		// We already started creating this dictionary and its lsym.
-		return sym
-	}
-
-	infoPrint("=== Creating dictionary %v\n", sym.Name)
-	off := 0
-	// Emit an entry for each targ (concrete type or gcshape).
-	for _, t := range targs {
-		infoPrint(" * %v\n", t)
-		s := reflectdata.TypeLinksym(t)
-		off = objw.SymPtr(lsym, off, s, 0)
-		markTypeUsed(t, lsym)
-	}
-
-	instInfo := g.getInstantiation(gf, targs, isMeth)
-	info := instInfo.dictInfo
-
-	subst := typecheck.Tsubster{
-		Tparams: info.shapeParams,
-		Targs:   targs,
-	}
-	// Emit an entry for each derived type (after substituting targs)
-	for _, t := range info.derivedTypes {
-		ts := subst.Typ(t)
-		infoPrint(" - %v\n", ts)
-		s := reflectdata.TypeLinksym(ts)
-		off = objw.SymPtr(lsym, off, s, 0)
-		markTypeUsed(ts, lsym)
-	}
-	// Emit an entry for each subdictionary (after substituting targs)
-	for _, subDictInfo := range info.subDictCalls {
-		var sym *types.Sym
-		n := subDictInfo.callNode
-		switch n.Op() {
-		case ir.OCALL, ir.OCALLFUNC, ir.OCALLMETH:
-			call := n.(*ir.CallExpr)
-			if call.X.Op() == ir.OXDOT || call.X.Op() == ir.ODOTMETH {
-				var nameNode *ir.Name
-				se := call.X.(*ir.SelectorExpr)
-				if se.X.Type().IsShape() {
-					tparam := se.X.Type()
-					// Ensure methods on all instantiating types are computed.
-					typecheck.CalcMethods(tparam)
-					if typecheck.Lookdot1(nil, se.Sel, tparam, tparam.AllMethods(), 0) != nil {
-						// This is a method call enabled by a type bound.
-						// We need this extra check for method expressions,
-						// which don't add in the implicit XDOTs.
-						tmpse := ir.NewSelectorExpr(src.NoXPos, ir.OXDOT, se.X, se.Sel)
-						tmpse = typecheck.AddImplicitDots(tmpse)
-						tparam = tmpse.X.Type()
-					}
-					if !tparam.IsShape() {
-						// The method expression is not
-						// really on a typeparam.
-						break
-					}
-					ix := -1
-					for i, shape := range info.shapeParams {
-						if shape == tparam {
-							ix = i
-							break
-						}
-					}
-					assert(ix >= 0)
-					recvType := targs[ix]
-					if recvType.IsInterface() || len(recvType.RParams()) == 0 {
-						// No sub-dictionary entry is
-						// actually needed, since the
-						// type arg is not an
-						// instantiated type that
-						// will have generic methods.
-						break
-					}
-					// This is a method call for an
-					// instantiated type, so we need a
-					// sub-dictionary.
-					targs := recvType.RParams()
-					genRecvType := recvType.OrigType()
-					nameNode = typecheck.Lookdot1(call.X, se.Sel, genRecvType, genRecvType.Methods(), 1).Nname.(*ir.Name)
-					sym = g.getDictionarySym(nameNode, targs, true)
-				} else {
-					// This is the case of a normal
-					// method call on a generic type.
-					assert(subDictInfo.savedXNode == se)
-					sym = g.getSymForMethodCall(se, &subst)
-				}
-			} else {
-				inst, ok := call.X.(*ir.InstExpr)
-				if ok {
-					// Code hasn't been transformed yet
-					assert(subDictInfo.savedXNode == inst)
-				}
-				// If !ok, then the generic method/function call has
-				// already been transformed to a shape instantiation
-				// call. Either way, use the SelectorExpr/InstExpr
-				// node saved in info.
-				cex := subDictInfo.savedXNode
-				if se, ok := cex.(*ir.SelectorExpr); ok {
-					sym = g.getSymForMethodCall(se, &subst)
-				} else {
-					inst := cex.(*ir.InstExpr)
-					nameNode := inst.X.(*ir.Name)
-					subtargs := typecheck.TypesOf(inst.Targs)
-					for i, t := range subtargs {
-						subtargs[i] = subst.Typ(t)
-					}
-					sym = g.getDictionarySym(nameNode, subtargs, false)
-				}
-			}
-
-		case ir.OFUNCINST:
-			inst := n.(*ir.InstExpr)
-			nameNode := inst.X.(*ir.Name)
-			subtargs := typecheck.TypesOf(inst.Targs)
-			for i, t := range subtargs {
-				subtargs[i] = subst.Typ(t)
-			}
-			sym = g.getDictionarySym(nameNode, subtargs, false)
-
-		case ir.OXDOT, ir.OMETHEXPR, ir.OMETHVALUE:
-			sym = g.getSymForMethodCall(n.(*ir.SelectorExpr), &subst)
-
-		default:
-			assert(false)
-		}
-
-		if sym == nil {
-			// Unused sub-dictionary entry, just emit 0.
-			off = objw.Uintptr(lsym, off, 0)
-			infoPrint(" - Unused subdict entry\n")
-		} else {
-			off = objw.SymPtr(lsym, off, sym.Linksym(), 0)
-			infoPrint(" - Subdict %v\n", sym.Name)
-		}
-	}
-
-	g.instantiateMethods()
-	delay := &delayInfo{
-		gf:     gf,
-		targs:  targs,
-		sym:    sym,
-		off:    off,
-		isMeth: isMeth,
-	}
-	g.dictSymsToFinalize = append(g.dictSymsToFinalize, delay)
-	return sym
-}
-
-// getSymForMethodCall gets the dictionary sym for a method call, method value, or method
-// expression that has selector se. subst gives the substitution from shape types to
-// concrete types.
-func (g *genInst) getSymForMethodCall(se *ir.SelectorExpr, subst *typecheck.Tsubster) *types.Sym {
-	// For everything except method expressions, 'recvType = deref(se.X.Type)' would
-	// also give the receiver type. For method expressions with embedded types, we
-	// need to look at the type of the selection to get the final receiver type.
-	recvType := deref(se.Selection.Type.Recv().Type)
-	genRecvType := recvType.OrigType()
-	nameNode := typecheck.Lookdot1(se, se.Sel, genRecvType, genRecvType.Methods(), 1).Nname.(*ir.Name)
-	subtargs := recvType.RParams()
-	s2targs := make([]*types.Type, len(subtargs))
-	for i, t := range subtargs {
-		s2targs[i] = subst.Typ(t)
-	}
-	return g.getDictionarySym(nameNode, s2targs, true)
-}
-
-// finalizeSyms finishes up all dictionaries on g.dictSymsToFinalize, by writing out
-// any needed LSyms for itabs. The itab lsyms create wrappers which need various
-// dictionaries and method instantiations to be complete, so, to avoid recursive
-// dependencies, we finalize the itab lsyms only after all dictionaries syms and
-// instantiations have been created.
-// Also handles writing method expression closures into the dictionaries.
-func (g *genInst) finalizeSyms() {
-Outer:
-	for _, d := range g.dictSymsToFinalize {
-		infoPrint("=== Finalizing dictionary %s\n", d.sym.Name)
-
-		lsym := d.sym.Linksym()
-		instInfo := g.getInstantiation(d.gf, d.targs, d.isMeth)
-		info := instInfo.dictInfo
-
-		subst := typecheck.Tsubster{
-			Tparams: info.shapeParams,
-			Targs:   d.targs,
-		}
-
-		// Emit an entry for each itab
-		for _, n := range info.itabConvs {
-			var srctype, dsttype *types.Type
-			switch n.Op() {
-			case ir.OXDOT, ir.OMETHVALUE:
-				se := n.(*ir.SelectorExpr)
-				srctype = subst.Typ(se.X.Type())
-				dsttype = subst.Typ(info.shapeToBound[se.X.Type()])
-			case ir.ODOTTYPE, ir.ODOTTYPE2:
-				srctype = subst.Typ(n.(*ir.TypeAssertExpr).Type())
-				dsttype = subst.Typ(n.(*ir.TypeAssertExpr).X.Type())
-			case ir.OCONVIFACE:
-				srctype = subst.Typ(n.(*ir.ConvExpr).X.Type())
-				dsttype = subst.Typ(n.Type())
-			case ir.OTYPE:
-				srctype = subst.Typ(n.Type())
-				dsttype = subst.Typ(info.type2switchType[n])
-			default:
-				base.Fatalf("itab entry with unknown op %s", n.Op())
-			}
-			if srctype.IsInterface() || dsttype.IsEmptyInterface() {
-				// No itab is wanted if src type is an interface. We
-				// will use a type assert instead.
-				d.off = objw.Uintptr(lsym, d.off, 0)
-				infoPrint(" + Unused itab entry for %v\n", srctype)
-			} else {
-				// Make sure all new fully-instantiated types have
-				// their methods created before generating any itabs.
-				g.instantiateMethods()
-				itabLsym := reflectdata.ITabLsym(srctype, dsttype)
-				d.off = objw.SymPtr(lsym, d.off, itabLsym, 0)
-				markTypeUsed(srctype, lsym)
-				infoPrint(" + Itab for (%v,%v)\n", srctype, dsttype)
-			}
-		}
-
-		// Emit an entry for each method expression closure.
-		// Each entry is a (captureless) closure pointing to the method on the instantiating type.
-		// In other words, the entry is a runtime.funcval whose fn field is set to the method
-		// in question, and has no other fields. The address of this dictionary entry can be
-		// cast to a func of the appropriate type.
-		// TODO: do these need to be done when finalizing, or can we do them earlier?
-		for _, bf := range info.methodExprClosures {
-			rcvr := d.targs[bf.idx]
-			rcvr2 := deref(rcvr)
-			found := false
-			typecheck.CalcMethods(rcvr2) // Ensure methods on all instantiating types are computed.
-			for _, f := range rcvr2.AllMethods().Slice() {
-				if f.Sym.Name == bf.name {
-					codePtr := ir.MethodSym(rcvr, f.Sym).Linksym()
-					d.off = objw.SymPtr(lsym, d.off, codePtr, 0)
-					infoPrint(" + MethodExprClosure for %v.%s\n", rcvr, bf.name)
-					found = true
-					break
-				}
-			}
-			if !found {
-				// We failed to find a method expression needed for this
-				// dictionary. This may happen because we tried to create a
-				// dictionary for an invalid instantiation.
-				//
-				// For example, in test/typeparam/issue54225.go, we attempt to
-				// construct a dictionary for "Node[struct{}].contentLen",
-				// even though "struct{}" does not implement "Value", so it
-				// cannot actually be used as a type argument to "Node".
-				//
-				// The real issue here is we shouldn't be attempting to create
-				// those dictionaries in the first place (e.g., CL 428356),
-				// but that fix is scarier for backporting to Go 1.19. Too
-				// many backport CLs to this code have fixed one issue while
-				// introducing another.
-				//
-				// So as a hack, instead of calling Fatalf, we simply skip
-				// calling objw.Global below, which prevents us from emitting
-				// the broken dictionary. The linker's dead code elimination
-				// should then naturally prune this invalid, unneeded
-				// dictionary. Worst case, if the dictionary somehow *is*
-				// needed by the final executable, we've just turned an ICE
-				// into a link-time missing symbol failure.
-				infoPrint(" ! abandoning dictionary %v; missing method expression %v.%s\n", d.sym.Name, rcvr, bf.name)
-				continue Outer
-			}
-		}
-
-		objw.Global(lsym, int32(d.off), obj.DUPOK|obj.RODATA)
-		infoPrint("=== Finalized dictionary %s\n", d.sym.Name)
-	}
-	g.dictSymsToFinalize = nil
-}
-
-func (g *genInst) getDictionaryValue(pos src.XPos, gf *ir.Name, targs []*types.Type, isMeth bool) ir.Node {
-	sym := g.getDictionarySym(gf, targs, isMeth)
-
-	// Make (or reuse) a node referencing the dictionary symbol.
-	var n *ir.Name
-	if sym.Def != nil {
-		n = sym.Def.(*ir.Name)
-	} else {
-		// We set the position of a static dictionary to be the position of
-		// one of its uses.
-		n = ir.NewNameAt(pos, sym)
-		n.Curfn = ir.CurFunc
-		n.SetType(types.Types[types.TUINTPTR]) // should probably be [...]uintptr, but doesn't really matter
-		n.SetTypecheck(1)
-		n.Class = ir.PEXTERN
-		sym.Def = n
-	}
-
-	// Return the address of the dictionary.  Addr node gets position that was passed in.
-	np := typecheck.NodAddrAt(pos, n)
-	// Note: treat dictionary pointers as uintptrs, so they aren't pointers
-	// with respect to GC. That saves on stack scanning work, write barriers, etc.
-	// We can get away with it because dictionaries are global variables.
-	// TODO: use a cast, or is typing directly ok?
-	np.SetType(types.Types[types.TUINTPTR])
-	np.SetTypecheck(1)
-	return np
-}
-
-// hasShapeNodes returns true if the type of any node in targs has a shape.
-func hasShapeNodes(targs []ir.Ntype) bool {
-	for _, n := range targs {
-		if n.Type().HasShape() {
-			return true
-		}
-	}
-	return false
-}
-
-// hasShapeTypes returns true if any type in targs has a shape.
-func hasShapeTypes(targs []*types.Type) bool {
-	for _, t := range targs {
-		if t.HasShape() {
-			return true
-		}
-	}
-	return false
-}
-
-// getInstInfo get the dictionary format for a function instantiation- type params, derived
-// types, and needed subdictionaries, itabs, and method expression closures.
-func (g *genInst) getInstInfo(st *ir.Func, shapes []*types.Type, instInfo *instInfo) {
-	info := instInfo.dictInfo
-	info.shapeParams = shapes
-
-	for _, t := range info.shapeParams {
-		b := info.shapeToBound[t]
-		if b.HasShape() {
-			// If a type bound is parameterized (unusual case), then we
-			// may need its derived type to do a type assert when doing a
-			// bound call for a type arg that is an interface.
-			addType(info, nil, b)
-		}
-	}
-
-	for _, n := range st.Dcl {
-		addType(info, n, n.Type())
-		n.DictIndex = uint16(findDictType(instInfo, n.Type()) + 1)
-	}
-
-	if infoPrintMode {
-		fmt.Printf(">>> InstInfo for %v\n", st)
-		for _, t := range info.shapeParams {
-			fmt.Printf("  Typeparam %v\n", t)
-		}
-	}
-
-	// Map to remember when we have seen an instantiated function value or method
-	// expression/value as part of a call, so we can determine when we encounter
-	// an uncalled function value or method expression/value.
-	callMap := make(map[ir.Node]bool)
-
-	var visitFunc func(ir.Node)
-	visitFunc = func(n ir.Node) {
-		switch n.Op() {
-		case ir.OFUNCINST:
-			if !callMap[n] && hasShapeNodes(n.(*ir.InstExpr).Targs) {
-				infoPrint("  Closure&subdictionary required at generic function value %v\n", n.(*ir.InstExpr).X)
-				info.subDictCalls = append(info.subDictCalls, subDictInfo{callNode: n, savedXNode: nil})
-			}
-		case ir.OMETHEXPR, ir.OMETHVALUE:
-			if !callMap[n] && !types.IsInterfaceMethod(n.(*ir.SelectorExpr).Selection.Type) &&
-				len(deref(n.(*ir.SelectorExpr).X.Type()).RParams()) > 0 &&
-				hasShapeTypes(deref(n.(*ir.SelectorExpr).X.Type()).RParams()) {
-				if n.(*ir.SelectorExpr).X.Op() == ir.OTYPE {
-					infoPrint("  Closure&subdictionary required at generic meth expr %v\n", n)
-				} else {
-					infoPrint("  Closure&subdictionary required at generic meth value %v\n", n)
-				}
-				info.subDictCalls = append(info.subDictCalls, subDictInfo{callNode: n, savedXNode: nil})
-			}
-		case ir.OCALL:
-			ce := n.(*ir.CallExpr)
-			if ce.X.Op() == ir.OFUNCINST {
-				callMap[ce.X] = true
-				if hasShapeNodes(ce.X.(*ir.InstExpr).Targs) {
-					infoPrint("  Subdictionary at generic function/method call: %v - %v\n", ce.X.(*ir.InstExpr).X, n)
-					// Save the instExpr node for the function call,
-					// since we will lose this information when the
-					// generic function call is transformed to a call
-					// on the shape instantiation.
-					info.subDictCalls = append(info.subDictCalls, subDictInfo{callNode: n, savedXNode: ce.X})
-				}
-			}
-			// Note: this XDOT code is not actually needed as long as we
-			// continue to disable type parameters on RHS of type
-			// declarations (#45639).
-			if ce.X.Op() == ir.OXDOT {
-				callMap[ce.X] = true
-				if isBoundMethod(info, ce.X.(*ir.SelectorExpr)) {
-					infoPrint("  Optional subdictionary at generic bound call: %v\n", n)
-					info.subDictCalls = append(info.subDictCalls, subDictInfo{callNode: n, savedXNode: nil})
-				}
-			}
-		case ir.OCALLMETH:
-			ce := n.(*ir.CallExpr)
-			if ce.X.Op() == ir.ODOTMETH &&
-				len(deref(ce.X.(*ir.SelectorExpr).X.Type()).RParams()) > 0 {
-				callMap[ce.X] = true
-				if hasShapeTypes(deref(ce.X.(*ir.SelectorExpr).X.Type()).RParams()) {
-					infoPrint("  Subdictionary at generic method call: %v\n", n)
-					// Save the selector for the method call, since we
-					// will eventually lose this information when the
-					// generic method call is transformed into a
-					// function call on the method shape instantiation.
-					info.subDictCalls = append(info.subDictCalls, subDictInfo{callNode: n, savedXNode: ce.X})
-				}
-			}
-		case ir.OCONVIFACE:
-			if n.Type().IsInterface() && !n.Type().IsEmptyInterface() &&
-				(n.Type().HasShape() || n.(*ir.ConvExpr).X.Type().HasShape()) {
-				infoPrint("  Itab for interface conv: %v\n", n)
-				info.itabConvs = append(info.itabConvs, n)
-			}
-		case ir.OXDOT:
-			se := n.(*ir.SelectorExpr)
-			if se.X.Op() == ir.OTYPE && se.X.Type().IsShape() {
-				// Method expression.
-				addMethodExprClosure(info, se)
-				break
-			}
-			if isBoundMethod(info, se) {
-				if callMap[n] {
-					// Method value called directly. Use method expression closure.
-					addMethodExprClosure(info, se)
-					break
-				}
-				// Method value not called directly. Still doing the old way.
-				infoPrint("  Itab for bound call: %v\n", n)
-				info.itabConvs = append(info.itabConvs, n)
-			}
-
-		case ir.ODOTTYPE, ir.ODOTTYPE2:
-			if !n.(*ir.TypeAssertExpr).Type().IsInterface() && !n.(*ir.TypeAssertExpr).X.Type().IsEmptyInterface() {
-				infoPrint("  Itab for dot type: %v\n", n)
-				info.itabConvs = append(info.itabConvs, n)
-			}
-		case ir.OCLOSURE:
-			// Visit the closure body and add all relevant entries to the
-			// dictionary of the outer function (closure will just use
-			// the dictionary of the outer function).
-			cfunc := n.(*ir.ClosureExpr).Func
-			for _, n1 := range cfunc.Body {
-				ir.Visit(n1, visitFunc)
-			}
-			for _, n := range cfunc.Dcl {
-				n.DictIndex = uint16(findDictType(instInfo, n.Type()) + 1)
-			}
-		case ir.OSWITCH:
-			ss := n.(*ir.SwitchStmt)
-			if ss.Tag != nil && ss.Tag.Op() == ir.OTYPESW &&
-				!ss.Tag.(*ir.TypeSwitchGuard).X.Type().IsEmptyInterface() {
-				for _, cc := range ss.Cases {
-					for _, c := range cc.List {
-						if c.Op() == ir.OTYPE && c.Type().HasShape() {
-							// Type switch from a non-empty interface - might need an itab.
-							infoPrint("  Itab for type switch: %v\n", c)
-							info.itabConvs = append(info.itabConvs, c)
-							if info.type2switchType == nil {
-								info.type2switchType = map[ir.Node]*types.Type{}
-							}
-							info.type2switchType[c] = ss.Tag.(*ir.TypeSwitchGuard).X.Type()
-						}
-					}
-				}
-			}
-		}
-		addType(info, n, n.Type())
-	}
-
-	for _, stmt := range st.Body {
-		ir.Visit(stmt, visitFunc)
-	}
-	if infoPrintMode {
-		for _, t := range info.derivedTypes {
-			fmt.Printf("  Derived type %v\n", t)
-		}
-		fmt.Printf(">>> Done Instinfo\n")
-	}
-	info.startSubDict = len(info.shapeParams) + len(info.derivedTypes)
-	info.startItabConv = len(info.shapeParams) + len(info.derivedTypes) + len(info.subDictCalls)
-	info.startMethodExprClosures = len(info.shapeParams) + len(info.derivedTypes) + len(info.subDictCalls) + len(info.itabConvs)
-	info.dictLen = len(info.shapeParams) + len(info.derivedTypes) + len(info.subDictCalls) + len(info.itabConvs) + len(info.methodExprClosures)
-}
-
-// isBoundMethod returns true if the selection indicated by se is a bound method of
-// se.X. se.X must be a shape type (i.e. substituted directly from a type param). If
-// isBoundMethod returns false, then the selection must be a field access of a
-// structural type.
-func isBoundMethod(info *dictInfo, se *ir.SelectorExpr) bool {
-	bound := info.shapeToBound[se.X.Type()]
-	return typecheck.Lookdot1(se, se.Sel, bound, bound.AllMethods(), 1) != nil
-}
-
-func shapeIndex(info *dictInfo, t *types.Type) int {
-	for i, s := range info.shapeParams {
-		if s == t {
-			return i
-		}
-	}
-	base.Fatalf("can't find type %v in shape params", t)
-	return -1
-}
-
-// addMethodExprClosure adds the T.M method expression to the list of bound method expressions
-// used in the generic body.
-// isBoundMethod must have returned true on the same arguments.
-func addMethodExprClosure(info *dictInfo, se *ir.SelectorExpr) {
-	idx := shapeIndex(info, se.X.Type())
-	name := se.Sel.Name
-	for _, b := range info.methodExprClosures {
-		if idx == b.idx && name == b.name {
-			return
-		}
-	}
-	infoPrint("  Method expression closure for %v.%s\n", info.shapeParams[idx], name)
-	info.methodExprClosures = append(info.methodExprClosures, methodExprClosure{idx: idx, name: name})
-}
-
-// findMethodExprClosure finds the entry in the dictionary to use for the T.M
-// method expression encoded in se.
-// isBoundMethod must have returned true on the same arguments.
-func findMethodExprClosure(info *dictInfo, se *ir.SelectorExpr) int {
-	idx := shapeIndex(info, se.X.Type())
-	name := se.Sel.Name
-	for i, b := range info.methodExprClosures {
-		if idx == b.idx && name == b.name {
-			return i
-		}
-	}
-	base.Fatalf("can't find method expression closure for %s %s", se.X.Type(), name)
-	return -1
-}
-
-// addType adds t to info.derivedTypes if it is parameterized type (which is not
-// just a simple shape) that is different from any existing type on
-// info.derivedTypes.
-func addType(info *dictInfo, n ir.Node, t *types.Type) {
-	if t == nil || !t.HasShape() {
-		return
-	}
-	if t.IsShape() {
-		return
-	}
-	if t.Kind() == types.TFUNC && n != nil &&
-		(t.Recv() != nil || n.Op() == ir.ONAME && n.Name().Class == ir.PFUNC) {
-		// Don't use the type of a named generic function or method,
-		// since that is parameterized by other typeparams.
-		// (They all come from arguments of a FUNCINST node.)
-		return
-	}
-	if doubleCheck && !parameterizedBy(t, info.shapeParams) {
-		base.Fatalf("adding type with invalid parameters %+v", t)
-	}
-	if t.Kind() == types.TSTRUCT && t.IsFuncArgStruct() {
-		// Multiple return values are not a relevant new type (?).
-		return
-	}
-	// Ignore a derived type we've already added.
-	for _, et := range info.derivedTypes {
-		if types.IdenticalStrict(t, et) {
-			return
-		}
-	}
-	info.derivedTypes = append(info.derivedTypes, t)
-}
-
-// parameterizedBy returns true if t is parameterized by (at most) params.
-func parameterizedBy(t *types.Type, params []*types.Type) bool {
-	return parameterizedBy1(t, params, map[*types.Type]bool{})
-}
-func parameterizedBy1(t *types.Type, params []*types.Type, visited map[*types.Type]bool) bool {
-	if visited[t] {
-		return true
-	}
-	visited[t] = true
-
-	if t.Sym() != nil && len(t.RParams()) > 0 {
-		// This defined type is instantiated. Check the instantiating types.
-		for _, r := range t.RParams() {
-			if !parameterizedBy1(r, params, visited) {
-				return false
-			}
-		}
-		return true
-	}
-	if t.IsShape() {
-		// Check if t is one of the allowed parameters in scope.
-		for _, p := range params {
-			if p == t {
-				return true
-			}
-		}
-		// Couldn't find t in the list of allowed parameters.
-		return false
-
-	}
-	switch t.Kind() {
-	case types.TARRAY, types.TPTR, types.TSLICE, types.TCHAN:
-		return parameterizedBy1(t.Elem(), params, visited)
-
-	case types.TMAP:
-		return parameterizedBy1(t.Key(), params, visited) && parameterizedBy1(t.Elem(), params, visited)
-
-	case types.TFUNC:
-		return parameterizedBy1(t.TParams(), params, visited) && parameterizedBy1(t.Recvs(), params, visited) && parameterizedBy1(t.Params(), params, visited) && parameterizedBy1(t.Results(), params, visited)
-
-	case types.TSTRUCT:
-		for _, f := range t.Fields().Slice() {
-			if !parameterizedBy1(f.Type, params, visited) {
-				return false
-			}
-		}
-		return true
-
-	case types.TINTER:
-		for _, f := range t.Methods().Slice() {
-			if !parameterizedBy1(f.Type, params, visited) {
-				return false
-			}
-		}
-		return true
-
-	case types.TINT, types.TINT8, types.TINT16, types.TINT32, types.TINT64,
-		types.TUINT, types.TUINT8, types.TUINT16, types.TUINT32, types.TUINT64,
-		types.TUINTPTR, types.TBOOL, types.TSTRING, types.TFLOAT32, types.TFLOAT64, types.TCOMPLEX64, types.TCOMPLEX128, types.TUNSAFEPTR:
-		return true
-
-	case types.TUNION:
-		for i := 0; i < t.NumTerms(); i++ {
-			tt, _ := t.Term(i)
-			if !parameterizedBy1(tt, params, visited) {
-				return false
-			}
-		}
-		return true
-
-	default:
-		base.Fatalf("bad type kind %+v", t)
-		return true
-	}
-}
-
-// startClosure starts creation of a closure that has the function type typ. It
-// creates all the formal params and results according to the type typ. On return,
-// the body and closure variables of the closure must still be filled in, and
-// ir.UseClosure() called.
-func startClosure(pos src.XPos, outer *ir.Func, typ *types.Type) (*ir.Func, []*types.Field, []*types.Field) {
-	// Make a new internal function.
-	fn := ir.NewClosureFunc(pos, outer != nil)
-	ir.NameClosure(fn.OClosure, outer)
-
-	// Build formal argument and return lists.
-	var formalParams []*types.Field  // arguments of closure
-	var formalResults []*types.Field // returns of closure
-	for i := 0; i < typ.NumParams(); i++ {
-		t := typ.Params().Field(i).Type
-		arg := ir.NewNameAt(pos, closureSym(outer, "a", i))
-		arg.Class = ir.PPARAM
-		typed(t, arg)
-		arg.Curfn = fn
-		fn.Dcl = append(fn.Dcl, arg)
-		f := types.NewField(pos, arg.Sym(), t)
-		f.Nname = arg
-		f.SetIsDDD(typ.Params().Field(i).IsDDD())
-		formalParams = append(formalParams, f)
-	}
-	for i := 0; i < typ.NumResults(); i++ {
-		t := typ.Results().Field(i).Type
-		result := ir.NewNameAt(pos, closureSym(outer, "r", i)) // TODO: names not needed?
-		result.Class = ir.PPARAMOUT
-		typed(t, result)
-		result.Curfn = fn
-		fn.Dcl = append(fn.Dcl, result)
-		f := types.NewField(pos, result.Sym(), t)
-		f.Nname = result
-		formalResults = append(formalResults, f)
-	}
-
-	// Build an internal function with the right signature.
-	closureType := types.NewSignature(typ.Pkg(), nil, nil, formalParams, formalResults)
-	typed(closureType, fn.Nname)
-	typed(typ, fn.OClosure)
-	fn.SetTypecheck(1)
-	return fn, formalParams, formalResults
-
-}
-
-// closureSym returns outer.Sym().Pkg.LookupNum(prefix, n).
-// If outer is nil, then types.LocalPkg is used instead.
-func closureSym(outer *ir.Func, prefix string, n int) *types.Sym {
-	pkg := types.LocalPkg
-	if outer != nil {
-		pkg = outer.Sym().Pkg
-	}
-	return pkg.LookupNum(prefix, n)
-}
-
-// assertToBound returns a new node that converts a node rcvr with interface type to
-// the 'dst' interface type.
-func assertToBound(info *instInfo, dictVar *ir.Name, pos src.XPos, rcvr ir.Node, dst *types.Type) ir.Node {
-	if !dst.HasShape() {
-		return typed(dst, ir.NewTypeAssertExpr(pos, rcvr, nil))
-	}
-
-	ix := findDictType(info, dst)
-	assert(ix >= 0)
-	rt := getDictionaryType(info, dictVar, pos, ix)
-	return typed(dst, ir.NewDynamicTypeAssertExpr(pos, ir.ODYNAMICDOTTYPE, rcvr, rt))
-}
diff --git a/src/cmd/compile/internal/noder/stmt.go b/src/cmd/compile/internal/noder/stmt.go
index a349a7e..aa82274 100644
--- a/src/cmd/compile/internal/noder/stmt.go
+++ b/src/cmd/compile/internal/noder/stmt.go
@@ -5,136 +5,10 @@
 package noder
 
 import (
-	"cmd/compile/internal/base"
 	"cmd/compile/internal/ir"
 	"cmd/compile/internal/syntax"
-	"cmd/compile/internal/typecheck"
-	"cmd/compile/internal/types"
-	"cmd/internal/src"
 )
 
-// stmts creates nodes for a slice of statements that form a scope.
-func (g *irgen) stmts(stmts []syntax.Stmt) []ir.Node {
-	var nodes []ir.Node
-	types.Markdcl()
-	for _, stmt := range stmts {
-		switch s := g.stmt(stmt).(type) {
-		case nil: // EmptyStmt
-		case *ir.BlockStmt:
-			nodes = append(nodes, s.List...)
-		default:
-			nodes = append(nodes, s)
-		}
-	}
-	types.Popdcl()
-	return nodes
-}
-
-func (g *irgen) stmt(stmt syntax.Stmt) ir.Node {
-	base.Assert(g.exprStmtOK)
-	switch stmt := stmt.(type) {
-	case nil, *syntax.EmptyStmt:
-		return nil
-	case *syntax.LabeledStmt:
-		return g.labeledStmt(stmt)
-	case *syntax.BlockStmt:
-		return ir.NewBlockStmt(g.pos(stmt), g.blockStmt(stmt))
-	case *syntax.ExprStmt:
-		return wrapname(g.pos(stmt.X), g.expr(stmt.X))
-	case *syntax.SendStmt:
-		n := ir.NewSendStmt(g.pos(stmt), g.expr(stmt.Chan), g.expr(stmt.Value))
-		if !g.delayTransform() {
-			transformSend(n)
-		}
-		n.SetTypecheck(1)
-		return n
-	case *syntax.DeclStmt:
-		if g.topFuncIsGeneric && len(stmt.DeclList) > 0 {
-			if _, ok := stmt.DeclList[0].(*syntax.TypeDecl); ok {
-				// TODO: remove this restriction. See issue 47631.
-				base.ErrorfAt(g.pos(stmt), "type declarations inside generic functions are not currently supported")
-			}
-		}
-		n := ir.NewBlockStmt(g.pos(stmt), nil)
-		g.decls(&n.List, stmt.DeclList)
-		return n
-
-	case *syntax.AssignStmt:
-		if stmt.Op != 0 && stmt.Op != syntax.Def {
-			op := g.op(stmt.Op, binOps[:])
-			var n *ir.AssignOpStmt
-			if stmt.Rhs == nil {
-				n = IncDec(g.pos(stmt), op, g.expr(stmt.Lhs))
-			} else {
-				// Eval rhs before lhs, for compatibility with noder1
-				rhs := g.expr(stmt.Rhs)
-				lhs := g.expr(stmt.Lhs)
-				n = ir.NewAssignOpStmt(g.pos(stmt), op, lhs, rhs)
-			}
-			if !g.delayTransform() {
-				transformAsOp(n)
-			}
-			n.SetTypecheck(1)
-			return n
-		}
-
-		// Eval rhs before lhs, for compatibility with noder1
-		rhs := g.exprList(stmt.Rhs)
-		names, lhs := g.assignList(stmt.Lhs, stmt.Op == syntax.Def)
-
-		if len(lhs) == 1 && len(rhs) == 1 {
-			n := ir.NewAssignStmt(g.pos(stmt), lhs[0], rhs[0])
-			n.Def = initDefn(n, names)
-
-			if !g.delayTransform() {
-				lhs, rhs := []ir.Node{n.X}, []ir.Node{n.Y}
-				transformAssign(n, lhs, rhs)
-				n.X, n.Y = lhs[0], rhs[0]
-			}
-			n.SetTypecheck(1)
-			return n
-		}
-
-		n := ir.NewAssignListStmt(g.pos(stmt), ir.OAS2, lhs, rhs)
-		n.Def = initDefn(n, names)
-		if !g.delayTransform() {
-			transformAssign(n, n.Lhs, n.Rhs)
-		}
-		n.SetTypecheck(1)
-		return n
-
-	case *syntax.BranchStmt:
-		return ir.NewBranchStmt(g.pos(stmt), g.tokOp(int(stmt.Tok), branchOps[:]), g.name(stmt.Label))
-	case *syntax.CallStmt:
-		return ir.NewGoDeferStmt(g.pos(stmt), g.tokOp(int(stmt.Tok), callOps[:]), g.expr(stmt.Call))
-	case *syntax.ReturnStmt:
-		n := ir.NewReturnStmt(g.pos(stmt), g.exprList(stmt.Results))
-		if !g.delayTransform() {
-			transformReturn(n)
-		}
-		n.SetTypecheck(1)
-		return n
-	case *syntax.IfStmt:
-		return g.ifStmt(stmt)
-	case *syntax.ForStmt:
-		return g.forStmt(stmt)
-	case *syntax.SelectStmt:
-		n := g.selectStmt(stmt)
-
-		if !g.delayTransform() {
-			transformSelect(n.(*ir.SelectStmt))
-		}
-		n.SetTypecheck(1)
-		return n
-	case *syntax.SwitchStmt:
-		return g.switchStmt(stmt)
-
-	default:
-		g.unhandled("statement", stmt)
-		panic("unreachable")
-	}
-}
-
 // TODO(mdempsky): Investigate replacing with switch statements or dense arrays.
 
 var branchOps = [...]ir.Op{
@@ -149,50 +23,6 @@
 	syntax.Go:    ir.OGO,
 }
 
-func (g *irgen) tokOp(tok int, ops []ir.Op) ir.Op {
-	// TODO(mdempsky): Validate.
-	return ops[tok]
-}
-
-func (g *irgen) op(op syntax.Operator, ops []ir.Op) ir.Op {
-	// TODO(mdempsky): Validate.
-	return ops[op]
-}
-
-func (g *irgen) assignList(expr syntax.Expr, def bool) ([]*ir.Name, []ir.Node) {
-	if !def {
-		return nil, g.exprList(expr)
-	}
-
-	var exprs []syntax.Expr
-	if list, ok := expr.(*syntax.ListExpr); ok {
-		exprs = list.ElemList
-	} else {
-		exprs = []syntax.Expr{expr}
-	}
-
-	var names []*ir.Name
-	res := make([]ir.Node, len(exprs))
-	for i, expr := range exprs {
-		expr := expr.(*syntax.Name)
-		if expr.Value == "_" {
-			res[i] = ir.BlankNode
-			continue
-		}
-
-		if obj, ok := g.info.Uses[expr]; ok {
-			res[i] = g.obj(obj)
-			continue
-		}
-
-		name, _ := g.def(expr)
-		names = append(names, name)
-		res[i] = name
-	}
-
-	return names, res
-}
-
 // initDefn marks the given names as declared by defn and populates
 // its Init field with ODCL nodes. It then reports whether any names
 // were so declared, which can be used to initialize defn.Def.
@@ -210,25 +40,6 @@
 	return true
 }
 
-func (g *irgen) blockStmt(stmt *syntax.BlockStmt) []ir.Node {
-	return g.stmts(stmt.List)
-}
-
-func (g *irgen) ifStmt(stmt *syntax.IfStmt) ir.Node {
-	init := g.stmt(stmt.Init)
-	n := ir.NewIfStmt(g.pos(stmt), g.expr(stmt.Cond), g.blockStmt(stmt.Then), nil)
-	if stmt.Else != nil {
-		e := g.stmt(stmt.Else)
-		if e.Op() == ir.OBLOCK {
-			e := e.(*ir.BlockStmt)
-			n.Else = e.List
-		} else {
-			n.Else = []ir.Node{e}
-		}
-	}
-	return g.init(init, n)
-}
-
 // unpackTwo returns the first two nodes in list. If list has fewer
 // than 2 nodes, then the missing nodes are replaced with nils.
 func unpackTwo(list []ir.Node) (fst, snd ir.Node) {
@@ -241,113 +52,3 @@
 		return list[0], list[1]
 	}
 }
-
-func (g *irgen) forStmt(stmt *syntax.ForStmt) ir.Node {
-	if r, ok := stmt.Init.(*syntax.RangeClause); ok {
-		names, lhs := g.assignList(r.Lhs, r.Def)
-		key, value := unpackTwo(lhs)
-		n := ir.NewRangeStmt(g.pos(r), key, value, g.expr(r.X), g.blockStmt(stmt.Body))
-		n.Def = initDefn(n, names)
-		if key != nil {
-			transformCheckAssign(n, key)
-		}
-		if value != nil {
-			transformCheckAssign(n, value)
-		}
-		return n
-	}
-
-	return ir.NewForStmt(g.pos(stmt), g.stmt(stmt.Init), g.expr(stmt.Cond), g.stmt(stmt.Post), g.blockStmt(stmt.Body))
-}
-
-func (g *irgen) selectStmt(stmt *syntax.SelectStmt) ir.Node {
-	body := make([]*ir.CommClause, len(stmt.Body))
-	for i, clause := range stmt.Body {
-		body[i] = ir.NewCommStmt(g.pos(clause), g.stmt(clause.Comm), g.stmts(clause.Body))
-	}
-	return ir.NewSelectStmt(g.pos(stmt), body)
-}
-
-func (g *irgen) switchStmt(stmt *syntax.SwitchStmt) ir.Node {
-	pos := g.pos(stmt)
-	init := g.stmt(stmt.Init)
-
-	var expr ir.Node
-	switch tag := stmt.Tag.(type) {
-	case *syntax.TypeSwitchGuard:
-		var ident *ir.Ident
-		if tag.Lhs != nil {
-			ident = ir.NewIdent(g.pos(tag.Lhs), g.name(tag.Lhs))
-		}
-		expr = ir.NewTypeSwitchGuard(pos, ident, g.expr(tag.X))
-	default:
-		expr = g.expr(tag)
-	}
-
-	body := make([]*ir.CaseClause, len(stmt.Body))
-	for i, clause := range stmt.Body {
-		// Check for an implicit clause variable before
-		// visiting body, because it may contain function
-		// literals that reference it, and then it'll be
-		// associated to the wrong function.
-		//
-		// Also, override its position to the clause's colon, so that
-		// dwarfgen can find the right scope for it later.
-		// TODO(mdempsky): We should probably just store the scope
-		// directly in the ir.Name.
-		var cv *ir.Name
-		if obj, ok := g.info.Implicits[clause]; ok {
-			cv = g.obj(obj)
-			cv.SetPos(g.makeXPos(clause.Colon))
-			assert(expr.Op() == ir.OTYPESW)
-			cv.Defn = expr
-		}
-		body[i] = ir.NewCaseStmt(g.pos(clause), g.exprList(clause.Cases), g.stmts(clause.Body))
-		body[i].Var = cv
-	}
-
-	return g.init(init, ir.NewSwitchStmt(pos, expr, body))
-}
-
-func (g *irgen) labeledStmt(label *syntax.LabeledStmt) ir.Node {
-	sym := g.name(label.Label)
-	lhs := ir.NewLabelStmt(g.pos(label), sym)
-	ls := g.stmt(label.Stmt)
-
-	// Attach label directly to control statement too.
-	switch ls := ls.(type) {
-	case *ir.ForStmt:
-		ls.Label = sym
-	case *ir.RangeStmt:
-		ls.Label = sym
-	case *ir.SelectStmt:
-		ls.Label = sym
-	case *ir.SwitchStmt:
-		ls.Label = sym
-	}
-
-	l := []ir.Node{lhs}
-	if ls != nil {
-		if ls.Op() == ir.OBLOCK {
-			ls := ls.(*ir.BlockStmt)
-			l = append(l, ls.List...)
-		} else {
-			l = append(l, ls)
-		}
-	}
-	return ir.NewBlockStmt(src.NoXPos, l)
-}
-
-func (g *irgen) init(init ir.Node, stmt ir.InitNode) ir.InitNode {
-	if init != nil {
-		stmt.SetInit([]ir.Node{init})
-	}
-	return stmt
-}
-
-func (g *irgen) name(name *syntax.Name) *types.Sym {
-	if name == nil {
-		return nil
-	}
-	return typecheck.Lookup(name.Value)
-}
diff --git a/src/cmd/compile/internal/noder/transform.go b/src/cmd/compile/internal/noder/transform.go
deleted file mode 100644
index 15adb89..0000000
--- a/src/cmd/compile/internal/noder/transform.go
+++ /dev/null
@@ -1,1085 +0,0 @@
-// Copyright 2021 The Go 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 transformation functions on nodes, which are the
-// transformations that the typecheck package does that are distinct from the
-// typechecking functionality. These transform functions are pared-down copies of
-// the original typechecking functions, with all code removed that is related to:
-//
-//    - Detecting compile-time errors (already done by types2)
-//    - Setting the actual type of existing nodes (already done based on
-//      type info from types2)
-//    - Dealing with untyped constants (which types2 has already resolved)
-//
-// Each of the transformation functions requires that node passed in has its type
-// and typecheck flag set. If the transformation function replaces or adds new
-// nodes, it will set the type and typecheck flag for those new nodes.
-
-package noder
-
-import (
-	"cmd/compile/internal/base"
-	"cmd/compile/internal/ir"
-	"cmd/compile/internal/typecheck"
-	"cmd/compile/internal/types"
-	"fmt"
-	"go/constant"
-)
-
-// Transformation functions for expressions
-
-// transformAdd transforms an addition operation (currently just addition of
-// strings). Corresponds to the "binary operators" case in typecheck.typecheck1.
-func transformAdd(n *ir.BinaryExpr) ir.Node {
-	assert(n.Type() != nil && n.Typecheck() == 1)
-	l := n.X
-	if l.Type().IsString() {
-		var add *ir.AddStringExpr
-		if l.Op() == ir.OADDSTR {
-			add = l.(*ir.AddStringExpr)
-			add.SetPos(n.Pos())
-		} else {
-			add = ir.NewAddStringExpr(n.Pos(), []ir.Node{l})
-		}
-		r := n.Y
-		if r.Op() == ir.OADDSTR {
-			r := r.(*ir.AddStringExpr)
-			add.List.Append(r.List.Take()...)
-		} else {
-			add.List.Append(r)
-		}
-		typed(l.Type(), add)
-		return add
-	}
-	return n
-}
-
-// Corresponds to typecheck.stringtoruneslit.
-func stringtoruneslit(n *ir.ConvExpr) ir.Node {
-	if n.X.Op() != ir.OLITERAL || n.X.Val().Kind() != constant.String {
-		base.Fatalf("stringtoarraylit %v", n)
-	}
-
-	var list []ir.Node
-	i := 0
-	eltType := n.Type().Elem()
-	for _, r := range ir.StringVal(n.X) {
-		elt := ir.NewKeyExpr(base.Pos, ir.NewInt(int64(i)), ir.NewInt(int64(r)))
-		// Change from untyped int to the actual element type determined
-		// by types2.  No need to change elt.Key, since the array indexes
-		// are just used for setting up the element ordering.
-		elt.Value.SetType(eltType)
-		list = append(list, elt)
-		i++
-	}
-
-	nn := ir.NewCompLitExpr(base.Pos, ir.OCOMPLIT, n.Type(), list)
-	typed(n.Type(), nn)
-	// Need to transform the OCOMPLIT.
-	return transformCompLit(nn)
-}
-
-// transformConv transforms an OCONV node as needed, based on the types involved,
-// etc.  Corresponds to typecheck.tcConv.
-func transformConv(n *ir.ConvExpr) ir.Node {
-	t := n.X.Type()
-	op, why := typecheck.Convertop(n.X.Op() == ir.OLITERAL, t, n.Type())
-	if op == ir.OXXX {
-		// types2 currently ignores pragmas, so a 'notinheap' mismatch is the
-		// one type-related error that it does not catch. This error will be
-		// caught here by Convertop (see two checks near beginning of
-		// Convertop) and reported at the end of noding.
-		base.ErrorfAt(n.Pos(), "cannot convert %L to type %v%s", n.X, n.Type(), why)
-		return n
-	}
-	n.SetOp(op)
-	switch n.Op() {
-	case ir.OCONVNOP:
-		if t.Kind() == n.Type().Kind() {
-			switch t.Kind() {
-			case types.TFLOAT32, types.TFLOAT64, types.TCOMPLEX64, types.TCOMPLEX128:
-				// Floating point casts imply rounding and
-				// so the conversion must be kept.
-				n.SetOp(ir.OCONV)
-			}
-		}
-
-	// Do not convert to []byte literal. See CL 125796.
-	// Generated code and compiler memory footprint is better without it.
-	case ir.OSTR2BYTES:
-		// ok
-
-	case ir.OSTR2RUNES:
-		if n.X.Op() == ir.OLITERAL {
-			return stringtoruneslit(n)
-		}
-
-	case ir.OBYTES2STR:
-		assert(t.IsSlice())
-		assert(t.Elem().Kind() == types.TUINT8)
-		if t.Elem() != types.ByteType && t.Elem() != types.Types[types.TUINT8] {
-			// If t is a slice of a user-defined byte type B (not uint8
-			// or byte), then add an extra CONVNOP from []B to []byte, so
-			// that the call to slicebytetostring() added in walk will
-			// typecheck correctly.
-			n.X = ir.NewConvExpr(n.X.Pos(), ir.OCONVNOP, types.NewSlice(types.ByteType), n.X)
-			n.X.SetTypecheck(1)
-		}
-
-	case ir.ORUNES2STR:
-		assert(t.IsSlice())
-		assert(t.Elem().Kind() == types.TINT32)
-		if t.Elem() != types.RuneType && t.Elem() != types.Types[types.TINT32] {
-			// If t is a slice of a user-defined rune type B (not uint32
-			// or rune), then add an extra CONVNOP from []B to []rune, so
-			// that the call to slicerunetostring() added in walk will
-			// typecheck correctly.
-			n.X = ir.NewConvExpr(n.X.Pos(), ir.OCONVNOP, types.NewSlice(types.RuneType), n.X)
-			n.X.SetTypecheck(1)
-		}
-
-	}
-	return n
-}
-
-// transformConvCall transforms a conversion call. Corresponds to the OTYPE part of
-// typecheck.tcCall.
-func transformConvCall(n *ir.CallExpr) ir.Node {
-	assert(n.Type() != nil && n.Typecheck() == 1)
-	arg := n.Args[0]
-	n1 := ir.NewConvExpr(n.Pos(), ir.OCONV, nil, arg)
-	typed(n.X.Type(), n1)
-	return transformConv(n1)
-}
-
-// transformCall transforms a normal function/method call. Corresponds to last half
-// (non-conversion, non-builtin part) of typecheck.tcCall. This code should work even
-// in the case of OCALL/OFUNCINST.
-func transformCall(n *ir.CallExpr) {
-	// Set base.Pos, since transformArgs below may need it, but transformCall
-	// is called in some passes that don't set base.Pos.
-	ir.SetPos(n)
-	// n.Type() can be nil for calls with no return value
-	assert(n.Typecheck() == 1)
-	typecheck.RewriteNonNameCall(n)
-	transformArgs(n)
-	l := n.X
-	t := l.Type()
-
-	switch l.Op() {
-	case ir.ODOTINTER:
-		n.SetOp(ir.OCALLINTER)
-
-	case ir.ODOTMETH:
-		l := l.(*ir.SelectorExpr)
-		n.SetOp(ir.OCALLMETH)
-
-		tp := t.Recv().Type
-
-		if l.X == nil || !types.Identical(l.X.Type(), tp) {
-			base.Fatalf("method receiver")
-		}
-
-	default:
-		n.SetOp(ir.OCALLFUNC)
-	}
-
-	typecheckaste(ir.OCALL, n.X, n.IsDDD, t.Params(), n.Args)
-	if l.Op() == ir.ODOTMETH && len(deref(n.X.Type().Recv().Type).RParams()) == 0 {
-		typecheck.FixMethodCall(n)
-	}
-	if t.NumResults() == 1 {
-		if n.Op() == ir.OCALLFUNC && n.X.Op() == ir.ONAME {
-			if sym := n.X.(*ir.Name).Sym(); types.IsRuntimePkg(sym.Pkg) && sym.Name == "getg" {
-				// Emit code for runtime.getg() directly instead of calling function.
-				// Most such rewrites (for example the similar one for math.Sqrt) should be done in walk,
-				// so that the ordering pass can make sure to preserve the semantics of the original code
-				// (in particular, the exact time of the function call) by introducing temporaries.
-				// In this case, we know getg() always returns the same result within a given function
-				// and we want to avoid the temporaries, so we do the rewrite earlier than is typical.
-				n.SetOp(ir.OGETG)
-			}
-		}
-		return
-	}
-}
-
-// transformEarlyCall transforms the arguments of a call with an OFUNCINST node.
-func transformEarlyCall(n *ir.CallExpr) {
-	transformArgs(n)
-	typecheckaste(ir.OCALL, n.X, n.IsDDD, n.X.Type().Params(), n.Args)
-}
-
-// transformCompare transforms a compare operation (currently just equals/not
-// equals). Corresponds to the "comparison operators" case in
-// typecheck.typecheck1, including tcArith.
-func transformCompare(n *ir.BinaryExpr) {
-	assert(n.Type() != nil && n.Typecheck() == 1)
-	if (n.Op() == ir.OEQ || n.Op() == ir.ONE) && !types.Identical(n.X.Type(), n.Y.Type()) {
-		// Comparison is okay as long as one side is assignable to the
-		// other. The only allowed case where the conversion is not CONVNOP is
-		// "concrete == interface". In that case, check comparability of
-		// the concrete type. The conversion allocates, so only do it if
-		// the concrete type is huge.
-		l, r := n.X, n.Y
-		lt, rt := l.Type(), r.Type()
-		converted := false
-		if rt.Kind() != types.TBLANK {
-			aop, _ := typecheck.Assignop(lt, rt)
-			if aop != ir.OXXX {
-				types.CalcSize(lt)
-				if lt.HasShape() || rt.IsInterface() == lt.IsInterface() || lt.Size() >= 1<<16 {
-					l = ir.NewConvExpr(base.Pos, aop, rt, l)
-					l.SetTypecheck(1)
-				}
-
-				converted = true
-			}
-		}
-
-		if !converted && lt.Kind() != types.TBLANK {
-			aop, _ := typecheck.Assignop(rt, lt)
-			if aop != ir.OXXX {
-				types.CalcSize(rt)
-				if rt.HasShape() || rt.IsInterface() == lt.IsInterface() || rt.Size() >= 1<<16 {
-					r = ir.NewConvExpr(base.Pos, aop, lt, r)
-					r.SetTypecheck(1)
-				}
-			}
-		}
-		n.X, n.Y = l, r
-	}
-}
-
-// Corresponds to typecheck.implicitstar.
-func implicitstar(n ir.Node) ir.Node {
-	// insert implicit * if needed for fixed array
-	t := n.Type()
-	if !t.IsPtr() {
-		return n
-	}
-	t = t.Elem()
-	if !t.IsArray() {
-		return n
-	}
-	star := ir.NewStarExpr(base.Pos, n)
-	star.SetImplicit(true)
-	return typed(t, star)
-}
-
-// transformIndex transforms an index operation.  Corresponds to typecheck.tcIndex.
-func transformIndex(n *ir.IndexExpr) {
-	assert(n.Type() != nil && n.Typecheck() == 1)
-	n.X = implicitstar(n.X)
-	l := n.X
-	t := l.Type()
-	if t.Kind() == types.TMAP {
-		n.Index = assignconvfn(n.Index, t.Key())
-		n.SetOp(ir.OINDEXMAP)
-		// Set type to just the map value, not (value, bool). This is
-		// different from types2, but fits the later stages of the
-		// compiler better.
-		n.SetType(t.Elem())
-		n.Assigned = false
-	}
-}
-
-// transformSlice transforms a slice operation.  Corresponds to typecheck.tcSlice.
-func transformSlice(n *ir.SliceExpr) {
-	assert(n.Type() != nil && n.Typecheck() == 1)
-	l := n.X
-	if l.Type().IsArray() {
-		addr := typecheck.NodAddr(n.X)
-		addr.SetImplicit(true)
-		typed(types.NewPtr(n.X.Type()), addr)
-		n.X = addr
-		l = addr
-	}
-	t := l.Type()
-	if t.IsString() {
-		n.SetOp(ir.OSLICESTR)
-	} else if t.IsPtr() && t.Elem().IsArray() {
-		if n.Op().IsSlice3() {
-			n.SetOp(ir.OSLICE3ARR)
-		} else {
-			n.SetOp(ir.OSLICEARR)
-		}
-	}
-}
-
-// Transformation functions for statements
-
-// Corresponds to typecheck.checkassign.
-func transformCheckAssign(stmt ir.Node, n ir.Node) {
-	if n.Op() == ir.OINDEXMAP {
-		n := n.(*ir.IndexExpr)
-		n.Assigned = true
-		return
-	}
-}
-
-// Corresponds to typecheck.assign.
-func transformAssign(stmt ir.Node, lhs, rhs []ir.Node) {
-	checkLHS := func(i int, typ *types.Type) {
-		transformCheckAssign(stmt, lhs[i])
-	}
-
-	cr := len(rhs)
-	if len(rhs) == 1 {
-		if rtyp := rhs[0].Type(); rtyp != nil && rtyp.IsFuncArgStruct() {
-			cr = rtyp.NumFields()
-		}
-	}
-
-	// x, ok = y
-assignOK:
-	for len(lhs) == 2 && cr == 1 {
-		stmt := stmt.(*ir.AssignListStmt)
-		r := rhs[0]
-
-		switch r.Op() {
-		case ir.OINDEXMAP:
-			stmt.SetOp(ir.OAS2MAPR)
-		case ir.ORECV:
-			stmt.SetOp(ir.OAS2RECV)
-		case ir.ODOTTYPE:
-			r := r.(*ir.TypeAssertExpr)
-			stmt.SetOp(ir.OAS2DOTTYPE)
-			r.SetOp(ir.ODOTTYPE2)
-		case ir.ODYNAMICDOTTYPE:
-			r := r.(*ir.DynamicTypeAssertExpr)
-			stmt.SetOp(ir.OAS2DOTTYPE)
-			r.SetOp(ir.ODYNAMICDOTTYPE2)
-		default:
-			break assignOK
-		}
-		checkLHS(0, r.Type())
-		checkLHS(1, types.UntypedBool)
-		t := lhs[0].Type()
-		if t != nil && rhs[0].Type().HasShape() && t.IsInterface() && !types.IdenticalStrict(t, rhs[0].Type()) {
-			// This is a multi-value assignment (map, channel, or dot-type)
-			// where the main result is converted to an interface during the
-			// assignment. Normally, the needed CONVIFACE is not created
-			// until (*orderState).as2ok(), because the AS2* ops and their
-			// sub-ops are so tightly intertwined. But we need to create the
-			// CONVIFACE now to enable dictionary lookups. So, assign the
-			// results first to temps, so that we can manifest the CONVIFACE
-			// in assigning the first temp to lhs[0]. If we added the
-			// CONVIFACE into rhs[0] directly, we would break a lot of later
-			// code that depends on the tight coupling between the AS2* ops
-			// and their sub-ops. (Issue #50642).
-			v := typecheck.Temp(rhs[0].Type())
-			ok := typecheck.Temp(types.Types[types.TBOOL])
-			as := ir.NewAssignListStmt(base.Pos, stmt.Op(), []ir.Node{v, ok}, []ir.Node{r})
-			as.Def = true
-			as.PtrInit().Append(ir.NewDecl(base.Pos, ir.ODCL, v))
-			as.PtrInit().Append(ir.NewDecl(base.Pos, ir.ODCL, ok))
-			as.SetTypecheck(1)
-			// Change stmt to be a normal assignment of the temps to the final
-			// left-hand-sides. We re-create the original multi-value assignment
-			// so that it assigns to the temps and add it as an init of stmt.
-			//
-			// TODO: fix the order of evaluation, so that the lval of lhs[0]
-			// is evaluated before rhs[0] (similar to problem in #50672).
-			stmt.SetOp(ir.OAS2)
-			stmt.PtrInit().Append(as)
-			// assignconvfn inserts the CONVIFACE.
-			stmt.Rhs = []ir.Node{assignconvfn(v, t), ok}
-		}
-		return
-	}
-
-	if len(lhs) != cr {
-		for i := range lhs {
-			checkLHS(i, nil)
-		}
-		return
-	}
-
-	// x,y,z = f()
-	if cr > len(rhs) {
-		stmt := stmt.(*ir.AssignListStmt)
-		stmt.SetOp(ir.OAS2FUNC)
-		r := rhs[0].(*ir.CallExpr)
-		rtyp := r.Type()
-
-		mismatched := false
-		failed := false
-		for i := range lhs {
-			result := rtyp.Field(i).Type
-			checkLHS(i, result)
-
-			if lhs[i].Type() == nil || result == nil {
-				failed = true
-			} else if lhs[i] != ir.BlankNode && !types.Identical(lhs[i].Type(), result) {
-				mismatched = true
-			}
-		}
-		if mismatched && !failed {
-			typecheck.RewriteMultiValueCall(stmt, r)
-		}
-		return
-	}
-
-	for i, r := range rhs {
-		checkLHS(i, r.Type())
-		if lhs[i].Type() != nil {
-			rhs[i] = assignconvfn(r, lhs[i].Type())
-		}
-	}
-}
-
-// Corresponds to typecheck.typecheckargs.  Really just deals with multi-value calls.
-func transformArgs(n ir.InitNode) {
-	var list []ir.Node
-	switch n := n.(type) {
-	default:
-		base.Fatalf("transformArgs %+v", n.Op())
-	case *ir.CallExpr:
-		list = n.Args
-		if n.IsDDD {
-			return
-		}
-	case *ir.ReturnStmt:
-		list = n.Results
-	}
-	if len(list) != 1 {
-		return
-	}
-
-	t := list[0].Type()
-	if t == nil || !t.IsFuncArgStruct() {
-		return
-	}
-
-	// Save n as n.Orig for fmt.go.
-	if ir.Orig(n) == n {
-		n.(ir.OrigNode).SetOrig(ir.SepCopy(n))
-	}
-
-	// Rewrite f(g()) into t1, t2, ... = g(); f(t1, t2, ...).
-	typecheck.RewriteMultiValueCall(n, list[0])
-}
-
-// assignconvfn converts node n for assignment to type t. Corresponds to
-// typecheck.assignconvfn.
-func assignconvfn(n ir.Node, t *types.Type) ir.Node {
-	if t.Kind() == types.TBLANK {
-		return n
-	}
-
-	if n.Op() == ir.OPAREN {
-		n = n.(*ir.ParenExpr).X
-	}
-
-	if types.IdenticalStrict(n.Type(), t) {
-		return n
-	}
-
-	op, why := Assignop(n.Type(), t)
-	if op == ir.OXXX {
-		base.Fatalf("found illegal assignment %+v -> %+v; %s", n.Type(), t, why)
-	}
-
-	r := ir.NewConvExpr(base.Pos, op, t, n)
-	r.SetTypecheck(1)
-	r.SetImplicit(true)
-	return r
-}
-
-func Assignop(src, dst *types.Type) (ir.Op, string) {
-	if src == dst {
-		return ir.OCONVNOP, ""
-	}
-	if src == nil || dst == nil || src.Kind() == types.TFORW || dst.Kind() == types.TFORW || src.Underlying() == nil || dst.Underlying() == nil {
-		return ir.OXXX, ""
-	}
-
-	// 1. src type is identical to dst (taking shapes into account)
-	if types.Identical(src, dst) {
-		// We already know from assignconvfn above that IdenticalStrict(src,
-		// dst) is false, so the types are not exactly the same and one of
-		// src or dst is a shape. If dst is an interface (which means src is
-		// an interface too), we need a real OCONVIFACE op; otherwise we need a
-		// OCONVNOP. See issue #48453.
-		if dst.IsInterface() {
-			return ir.OCONVIFACE, ""
-		} else {
-			return ir.OCONVNOP, ""
-		}
-	}
-	return typecheck.Assignop1(src, dst)
-}
-
-// Corresponds to typecheck.typecheckaste, but we add an extra flag convifaceOnly
-// only. If convifaceOnly is true, we only do interface conversion. We use this to do
-// early insertion of CONVIFACE nodes during noder2, when the function or args may
-// have typeparams.
-func typecheckaste(op ir.Op, call ir.Node, isddd bool, tstruct *types.Type, nl ir.Nodes) {
-	var t *types.Type
-	var i int
-
-	lno := base.Pos
-	defer func() { base.Pos = lno }()
-
-	var n ir.Node
-	if len(nl) == 1 {
-		n = nl[0]
-	}
-
-	i = 0
-	for _, tl := range tstruct.Fields().Slice() {
-		t = tl.Type
-		if tl.IsDDD() {
-			if isddd {
-				n = nl[i]
-				ir.SetPos(n)
-				if n.Type() != nil {
-					nl[i] = assignconvfn(n, t)
-				}
-				return
-			}
-
-			// TODO(mdempsky): Make into ... call with implicit slice.
-			for ; i < len(nl); i++ {
-				n = nl[i]
-				ir.SetPos(n)
-				if n.Type() != nil {
-					nl[i] = assignconvfn(n, t.Elem())
-				}
-			}
-			return
-		}
-
-		n = nl[i]
-		ir.SetPos(n)
-		if n.Type() != nil {
-			nl[i] = assignconvfn(n, t)
-		}
-		i++
-	}
-}
-
-// transformSend transforms a send statement, converting the value to appropriate
-// type for the channel, as needed. Corresponds of typecheck.tcSend.
-func transformSend(n *ir.SendStmt) {
-	n.Value = assignconvfn(n.Value, n.Chan.Type().Elem())
-}
-
-// transformReturn transforms a return node, by doing the needed assignments and
-// any necessary conversions. Corresponds to typecheck.tcReturn()
-func transformReturn(rs *ir.ReturnStmt) {
-	transformArgs(rs)
-	nl := rs.Results
-	if ir.HasNamedResults(ir.CurFunc) && len(nl) == 0 {
-		return
-	}
-
-	typecheckaste(ir.ORETURN, nil, false, ir.CurFunc.Type().Results(), nl)
-}
-
-// transformSelect transforms a select node, creating an assignment list as needed
-// for each case. Corresponds to typecheck.tcSelect().
-func transformSelect(sel *ir.SelectStmt) {
-	for _, ncase := range sel.Cases {
-		if ncase.Comm != nil {
-			n := ncase.Comm
-			oselrecv2 := func(dst, recv ir.Node, def bool) {
-				selrecv := ir.NewAssignListStmt(n.Pos(), ir.OSELRECV2, []ir.Node{dst, ir.BlankNode}, []ir.Node{recv})
-				if dst.Op() == ir.ONAME && dst.(*ir.Name).Defn == n {
-					// Must fix Defn for dst, since we are
-					// completely changing the node.
-					dst.(*ir.Name).Defn = selrecv
-				}
-				selrecv.Def = def
-				selrecv.SetTypecheck(1)
-				selrecv.SetInit(n.Init())
-				ncase.Comm = selrecv
-			}
-			switch n.Op() {
-			case ir.OAS:
-				// convert x = <-c into x, _ = <-c
-				// remove implicit conversions; the eventual assignment
-				// will reintroduce them.
-				n := n.(*ir.AssignStmt)
-				if r := n.Y; r.Op() == ir.OCONVNOP || r.Op() == ir.OCONVIFACE {
-					r := r.(*ir.ConvExpr)
-					if r.Implicit() {
-						n.Y = r.X
-					}
-				}
-				oselrecv2(n.X, n.Y, n.Def)
-
-			case ir.OAS2RECV:
-				n := n.(*ir.AssignListStmt)
-				n.SetOp(ir.OSELRECV2)
-
-			case ir.ORECV:
-				// convert <-c into _, _ = <-c
-				n := n.(*ir.UnaryExpr)
-				oselrecv2(ir.BlankNode, n, false)
-
-			case ir.OSEND:
-				break
-			}
-		}
-	}
-}
-
-// transformAsOp transforms an AssignOp statement. Corresponds to OASOP case in
-// typecheck1.
-func transformAsOp(n *ir.AssignOpStmt) {
-	transformCheckAssign(n, n.X)
-}
-
-// transformDot transforms an OXDOT (or ODOT) or ODOT, ODOTPTR, ODOTMETH,
-// ODOTINTER, or OMETHVALUE, as appropriate. It adds in extra nodes as needed to
-// access embedded fields. Corresponds to typecheck.tcDot.
-func transformDot(n *ir.SelectorExpr, isCall bool) ir.Node {
-	assert(n.Type() != nil && n.Typecheck() == 1)
-	if n.Op() == ir.OXDOT {
-		n = typecheck.AddImplicitDots(n)
-		n.SetOp(ir.ODOT)
-
-		// Set the Selection field and typecheck flag for any new ODOT nodes
-		// added by AddImplicitDots(), and also transform to ODOTPTR if
-		// needed. Equivalent to 'n.X = typecheck(n.X, ctxExpr|ctxType)' in
-		// tcDot.
-		for n1 := n; n1.X.Op() == ir.ODOT; {
-			n1 = n1.X.(*ir.SelectorExpr)
-			if !n1.Implicit() {
-				break
-			}
-			t1 := n1.X.Type()
-			if t1.IsPtr() && !t1.Elem().IsInterface() {
-				t1 = t1.Elem()
-				n1.SetOp(ir.ODOTPTR)
-			}
-			typecheck.Lookdot(n1, t1, 0)
-			n1.SetTypecheck(1)
-		}
-	}
-
-	t := n.X.Type()
-
-	if n.X.Op() == ir.OTYPE {
-		return transformMethodExpr(n)
-	}
-
-	if t.IsPtr() && !t.Elem().IsInterface() {
-		t = t.Elem()
-		n.SetOp(ir.ODOTPTR)
-	}
-
-	f := typecheck.Lookdot(n, t, 0)
-	assert(f != nil)
-
-	if (n.Op() == ir.ODOTINTER || n.Op() == ir.ODOTMETH) && !isCall {
-		n.SetOp(ir.OMETHVALUE)
-		// This converts a method type to a function type. See issue 47775.
-		n.SetType(typecheck.NewMethodType(n.Type(), nil))
-	}
-	return n
-}
-
-// Corresponds to typecheck.typecheckMethodExpr.
-func transformMethodExpr(n *ir.SelectorExpr) (res ir.Node) {
-	t := n.X.Type()
-
-	// Compute the method set for t.
-	var ms *types.Fields
-	if t.IsInterface() {
-		ms = t.AllMethods()
-	} else {
-		mt := types.ReceiverBaseType(t)
-		typecheck.CalcMethods(mt)
-		ms = mt.AllMethods()
-
-		// The method expression T.m requires a wrapper when T
-		// is different from m's declared receiver type. We
-		// normally generate these wrappers while writing out
-		// runtime type descriptors, which is always done for
-		// types declared at package scope. However, we need
-		// to make sure to generate wrappers for anonymous
-		// receiver types too.
-		if mt.Sym() == nil {
-			typecheck.NeedRuntimeType(t)
-		}
-	}
-
-	s := n.Sel
-	m := typecheck.Lookdot1(n, s, t, ms, 0)
-	if !t.HasShape() {
-		// It's OK to not find the method if t is instantiated by shape types,
-		// because we will use the methods on the generic type anyway.
-		assert(m != nil)
-	}
-
-	n.SetOp(ir.OMETHEXPR)
-	n.Selection = m
-	n.SetType(typecheck.NewMethodType(m.Type, n.X.Type()))
-	return n
-}
-
-// Corresponds to typecheck.tcAppend.
-func transformAppend(n *ir.CallExpr) ir.Node {
-	transformArgs(n)
-	args := n.Args
-	t := args[0].Type()
-	assert(t.IsSlice())
-
-	if n.IsDDD {
-		// assignconvfn is of args[1] not required here, as the
-		// types of args[0] and args[1] don't need to match
-		// (They will both have an underlying type which are
-		// slices of identical base types, or be []byte and string.)
-		// See issue 53888.
-		return n
-	}
-
-	as := args[1:]
-	for i, n := range as {
-		assert(n.Type() != nil)
-		as[i] = assignconvfn(n, t.Elem())
-	}
-	return n
-}
-
-// Corresponds to typecheck.tcComplex.
-func transformComplex(n *ir.BinaryExpr) ir.Node {
-	l := n.X
-	r := n.Y
-
-	assert(types.Identical(l.Type(), r.Type()))
-
-	var t *types.Type
-	switch l.Type().Kind() {
-	case types.TFLOAT32:
-		t = types.Types[types.TCOMPLEX64]
-	case types.TFLOAT64:
-		t = types.Types[types.TCOMPLEX128]
-	default:
-		panic(fmt.Sprintf("transformComplex: unexpected type %v", l.Type()))
-	}
-
-	// Must set the type here for generics, because this can't be determined
-	// by substitution of the generic types.
-	typed(t, n)
-	return n
-}
-
-// Corresponds to typecheck.tcDelete.
-func transformDelete(n *ir.CallExpr) ir.Node {
-	transformArgs(n)
-	args := n.Args
-	assert(len(args) == 2)
-
-	l := args[0]
-	r := args[1]
-
-	args[1] = assignconvfn(r, l.Type().Key())
-	return n
-}
-
-// Corresponds to typecheck.tcMake.
-func transformMake(n *ir.CallExpr) ir.Node {
-	args := n.Args
-
-	n.Args = nil
-	l := args[0]
-	t := l.Type()
-	assert(t != nil)
-
-	i := 1
-	var nn ir.Node
-	switch t.Kind() {
-	case types.TSLICE:
-		l = args[i]
-		i++
-		var r ir.Node
-		if i < len(args) {
-			r = args[i]
-			i++
-		}
-		nn = ir.NewMakeExpr(n.Pos(), ir.OMAKESLICE, l, r)
-
-	case types.TMAP:
-		if i < len(args) {
-			l = args[i]
-			i++
-		} else {
-			l = ir.NewInt(0)
-		}
-		nn = ir.NewMakeExpr(n.Pos(), ir.OMAKEMAP, l, nil)
-		nn.SetEsc(n.Esc())
-
-	case types.TCHAN:
-		l = nil
-		if i < len(args) {
-			l = args[i]
-			i++
-		} else {
-			l = ir.NewInt(0)
-		}
-		nn = ir.NewMakeExpr(n.Pos(), ir.OMAKECHAN, l, nil)
-	default:
-		panic(fmt.Sprintf("transformMake: unexpected type %v", t))
-	}
-
-	assert(i == len(args))
-	typed(n.Type(), nn)
-	return nn
-}
-
-// Corresponds to typecheck.tcPanic.
-func transformPanic(n *ir.UnaryExpr) ir.Node {
-	n.X = assignconvfn(n.X, types.Types[types.TINTER])
-	return n
-}
-
-// Corresponds to typecheck.tcPrint.
-func transformPrint(n *ir.CallExpr) ir.Node {
-	transformArgs(n)
-	return n
-}
-
-// Corresponds to typecheck.tcRealImag.
-func transformRealImag(n *ir.UnaryExpr) ir.Node {
-	l := n.X
-	var t *types.Type
-
-	// Determine result type.
-	switch l.Type().Kind() {
-	case types.TCOMPLEX64:
-		t = types.Types[types.TFLOAT32]
-	case types.TCOMPLEX128:
-		t = types.Types[types.TFLOAT64]
-	default:
-		panic(fmt.Sprintf("transformRealImag: unexpected type %v", l.Type()))
-	}
-
-	// Must set the type here for generics, because this can't be determined
-	// by substitution of the generic types.
-	typed(t, n)
-	return n
-}
-
-// Corresponds to typecheck.tcLenCap.
-func transformLenCap(n *ir.UnaryExpr) ir.Node {
-	n.X = implicitstar(n.X)
-	return n
-}
-
-// Corresponds to Builtin part of tcCall.
-func transformBuiltin(n *ir.CallExpr) ir.Node {
-	// n.Type() can be nil for builtins with no return value
-	assert(n.Typecheck() == 1)
-	fun := n.X.(*ir.Name)
-	op := fun.BuiltinOp
-
-	switch op {
-	case ir.OAPPEND, ir.ODELETE, ir.OMAKE, ir.OPRINT, ir.OPRINTN, ir.ORECOVER:
-		n.SetOp(op)
-		n.X = nil
-		switch op {
-		case ir.OAPPEND:
-			return transformAppend(n)
-		case ir.ODELETE:
-			return transformDelete(n)
-		case ir.OMAKE:
-			return transformMake(n)
-		case ir.OPRINT, ir.OPRINTN:
-			return transformPrint(n)
-		case ir.ORECOVER:
-			// nothing more to do
-			return n
-		}
-
-	case ir.OCAP, ir.OCLOSE, ir.OIMAG, ir.OLEN, ir.OPANIC, ir.OREAL:
-		transformArgs(n)
-		fallthrough
-
-	case ir.ONEW, ir.OALIGNOF, ir.OOFFSETOF, ir.OSIZEOF, ir.OUNSAFESLICEDATA, ir.OUNSAFESTRINGDATA:
-		u := ir.NewUnaryExpr(n.Pos(), op, n.Args[0])
-		u1 := typed(n.Type(), ir.InitExpr(n.Init(), u)) // typecheckargs can add to old.Init
-		switch op {
-		case ir.OCAP, ir.OLEN:
-			return transformLenCap(u1.(*ir.UnaryExpr))
-		case ir.OREAL, ir.OIMAG:
-			return transformRealImag(u1.(*ir.UnaryExpr))
-		case ir.OPANIC:
-			return transformPanic(u1.(*ir.UnaryExpr))
-		case ir.OALIGNOF, ir.OOFFSETOF, ir.OSIZEOF:
-			// This corresponds to the EvalConst() call near end of typecheck().
-			return typecheck.EvalConst(u1)
-		case ir.OCLOSE, ir.ONEW, ir.OUNSAFESTRINGDATA, ir.OUNSAFESLICEDATA:
-			// nothing more to do
-			return u1
-		}
-
-	case ir.OCOMPLEX, ir.OCOPY, ir.OUNSAFEADD, ir.OUNSAFESLICE, ir.OUNSAFESTRING:
-		transformArgs(n)
-		b := ir.NewBinaryExpr(n.Pos(), op, n.Args[0], n.Args[1])
-		n1 := typed(n.Type(), ir.InitExpr(n.Init(), b))
-		if op != ir.OCOMPLEX {
-			// nothing more to do
-			return n1
-		}
-		return transformComplex(n1.(*ir.BinaryExpr))
-
-	default:
-		panic(fmt.Sprintf("transformBuiltin: unexpected op %v", op))
-	}
-
-	return n
-}
-
-func hasKeys(l ir.Nodes) bool {
-	for _, n := range l {
-		if n.Op() == ir.OKEY || n.Op() == ir.OSTRUCTKEY {
-			return true
-		}
-	}
-	return false
-}
-
-// transformArrayLit runs assignconvfn on each array element and returns the
-// length of the slice/array that is needed to hold all the array keys/indexes
-// (one more than the highest index). Corresponds to typecheck.typecheckarraylit.
-func transformArrayLit(elemType *types.Type, bound int64, elts []ir.Node) int64 {
-	var key, length int64
-	for i, elt := range elts {
-		ir.SetPos(elt)
-		r := elts[i]
-		var kv *ir.KeyExpr
-		if elt.Op() == ir.OKEY {
-			elt := elt.(*ir.KeyExpr)
-			key = typecheck.IndexConst(elt.Key)
-			assert(key >= 0)
-			kv = elt
-			r = elt.Value
-		}
-
-		r = assignconvfn(r, elemType)
-		if kv != nil {
-			kv.Value = r
-		} else {
-			elts[i] = r
-		}
-
-		key++
-		if key > length {
-			length = key
-		}
-	}
-
-	return length
-}
-
-// transformCompLit transforms n to an OARRAYLIT, OSLICELIT, OMAPLIT, or
-// OSTRUCTLIT node, with any needed conversions. Corresponds to
-// typecheck.tcCompLit (and includes parts corresponding to tcStructLitKey).
-func transformCompLit(n *ir.CompLitExpr) (res ir.Node) {
-	assert(n.Type() != nil && n.Typecheck() == 1)
-	lno := base.Pos
-	defer func() {
-		base.Pos = lno
-	}()
-
-	// Save original node (including n.Right)
-	n.SetOrig(ir.Copy(n))
-
-	ir.SetPos(n)
-
-	t := n.Type()
-
-	switch t.Kind() {
-	default:
-		base.Fatalf("transformCompLit %v", t.Kind())
-
-	case types.TARRAY:
-		transformArrayLit(t.Elem(), t.NumElem(), n.List)
-		n.SetOp(ir.OARRAYLIT)
-
-	case types.TSLICE:
-		length := transformArrayLit(t.Elem(), -1, n.List)
-		n.SetOp(ir.OSLICELIT)
-		n.Len = length
-
-	case types.TMAP:
-		for _, l := range n.List {
-			ir.SetPos(l)
-			assert(l.Op() == ir.OKEY)
-			l := l.(*ir.KeyExpr)
-
-			r := l.Key
-			l.Key = assignconvfn(r, t.Key())
-
-			r = l.Value
-			l.Value = assignconvfn(r, t.Elem())
-		}
-
-		n.SetOp(ir.OMAPLIT)
-
-	case types.TSTRUCT:
-		// Need valid field offsets for Xoffset below.
-		types.CalcSize(t)
-
-		if len(n.List) != 0 && !hasKeys(n.List) {
-			// simple list of values
-			ls := n.List
-			for i, n1 := range ls {
-				ir.SetPos(n1)
-
-				f := t.Field(i)
-				n1 = assignconvfn(n1, f.Type)
-				ls[i] = ir.NewStructKeyExpr(base.Pos, f, n1)
-			}
-			assert(len(ls) >= t.NumFields())
-		} else {
-			// keyed list
-			ls := n.List
-			for i, l := range ls {
-				ir.SetPos(l)
-
-				kv := l.(*ir.KeyExpr)
-				key := kv.Key
-
-				s := key.Sym()
-				if types.IsExported(s.Name) && s.Pkg != types.LocalPkg {
-					// Exported field names should always have
-					// local pkg. We only need to do this
-					// adjustment for generic functions that are
-					// being transformed after being imported
-					// from another package.
-					s = typecheck.Lookup(s.Name)
-				}
-
-				// An OXDOT uses the Sym field to hold
-				// the field to the right of the dot,
-				// so s will be non-nil, but an OXDOT
-				// is never a valid struct literal key.
-				assert(!(s == nil || key.Op() == ir.OXDOT || s.IsBlank()))
-
-				f := typecheck.Lookdot1(nil, s, t, t.Fields(), 0)
-				l := ir.NewStructKeyExpr(l.Pos(), f, kv.Value)
-				ls[i] = l
-
-				l.Value = assignconvfn(l.Value, f.Type)
-			}
-		}
-
-		n.SetOp(ir.OSTRUCTLIT)
-	}
-
-	return n
-}
-
-// transformAddr corresponds to typecheck.tcAddr.
-func transformAddr(n *ir.AddrExpr) {
-	switch n.X.Op() {
-	case ir.OARRAYLIT, ir.OMAPLIT, ir.OSLICELIT, ir.OSTRUCTLIT:
-		n.SetOp(ir.OPTRLIT)
-	}
-}
diff --git a/src/cmd/compile/internal/noder/types.go b/src/cmd/compile/internal/noder/types.go
index 57b35e6..6caf158 100644
--- a/src/cmd/compile/internal/noder/types.go
+++ b/src/cmd/compile/internal/noder/types.go
@@ -5,473 +5,12 @@
 package noder
 
 import (
-	"cmd/compile/internal/base"
-	"cmd/compile/internal/ir"
-	"cmd/compile/internal/typecheck"
 	"cmd/compile/internal/types"
 	"cmd/compile/internal/types2"
-	"cmd/internal/src"
-	"strings"
 )
 
-func (g *irgen) pkg(pkg *types2.Package) *types.Pkg {
-	switch pkg {
-	case nil:
-		return types.BuiltinPkg
-	case g.self:
-		return types.LocalPkg
-	case types2.Unsafe:
-		return types.UnsafePkg
-	}
-	return types.NewPkg(pkg.Path(), pkg.Name())
-}
-
 var universeAny = types2.Universe.Lookup("any").Type()
 
-// typ converts a types2.Type to a types.Type, including caching of previously
-// translated types.
-func (g *irgen) typ(typ types2.Type) *types.Type {
-	// Defer the CheckSize calls until we have fully-defined a
-	// (possibly-recursive) top-level type.
-	types.DeferCheckSize()
-	res := g.typ1(typ)
-	types.ResumeCheckSize()
-
-	// Finish up any types on typesToFinalize, now that we are at the top of a
-	// fully-defined (possibly recursive) type. fillinMethods could create more
-	// types to finalize.
-	for len(g.typesToFinalize) > 0 {
-		l := len(g.typesToFinalize)
-		info := g.typesToFinalize[l-1]
-		g.typesToFinalize = g.typesToFinalize[:l-1]
-		types.DeferCheckSize()
-		g.fillinMethods(info.typ, info.ntyp)
-		types.ResumeCheckSize()
-	}
-	return res
-}
-
-// typ1 is like typ, but doesn't call CheckSize, since it may have only
-// constructed part of a recursive type. Should not be called from outside this
-// file (g.typ is the "external" entry point).
-func (g *irgen) typ1(typ types2.Type) *types.Type {
-	// See issue 49583: the type checker has trouble keeping track of aliases,
-	// but for such a common alias as any we can improve things by preserving a
-	// pointer identity that can be checked when formatting type strings.
-	if typ == universeAny {
-		return types.AnyType
-	}
-	// Cache type2-to-type mappings. Important so that each defined generic
-	// type (instantiated or not) has a single types.Type representation.
-	// Also saves a lot of computation and memory by avoiding re-translating
-	// types2 types repeatedly.
-	res, ok := g.typs[typ]
-	if !ok {
-		res = g.typ0(typ)
-		// Calculate the size for all concrete types seen by the frontend.
-		// This is the replacement for the CheckSize() calls in the types1
-		// typechecker. These will be deferred until the top-level g.typ().
-		if res != nil && !res.IsUntyped() && !res.IsFuncArgStruct() && !res.HasTParam() {
-			types.CheckSize(res)
-		}
-		g.typs[typ] = res
-	}
-	return res
-}
-
-// instTypeName2 creates a name for an instantiated type, base on the type args
-// (given as types2 types).
-func (g *irgen) instTypeName2(name string, targs *types2.TypeList) string {
-	rparams := make([]*types.Type, targs.Len())
-	for i := range rparams {
-		rparams[i] = g.typ(targs.At(i))
-	}
-	return typecheck.InstTypeName(name, rparams)
-}
-
-// typ0 converts a types2.Type to a types.Type, but doesn't do the caching check
-// at the top level.
-func (g *irgen) typ0(typ types2.Type) *types.Type {
-	switch typ := typ.(type) {
-	case *types2.Basic:
-		return g.basic(typ)
-	case *types2.Named:
-		// If tparams is set, but targs is not, typ is a base generic
-		// type. typ is appearing as part of the source type of an alias,
-		// since that is the only use of a generic type that doesn't
-		// involve instantiation. We just translate the named type in the
-		// normal way below using g.obj().
-		if typ.TypeParams() != nil && typ.TypeArgs() != nil {
-			// typ is an instantiation of a defined (named) generic type.
-			// This instantiation should also be a defined (named) type.
-			// types2 gives us the substituted type in t.Underlying()
-			// The substituted type may or may not still have type
-			// params. We might, for example, be substituting one type
-			// param for another type param.
-			//
-			// When converted to types.Type, typ has a unique name,
-			// based on the names of the type arguments.
-			instName := g.instTypeName2(typ.Obj().Name(), typ.TypeArgs())
-			s := g.pkg(typ.Obj().Pkg()).Lookup(instName)
-
-			// Make sure the base generic type exists in type1 (it may
-			// not yet if we are referecing an imported generic type, as
-			// opposed to a generic type declared in this package). Make
-			// sure to do this lookup before checking s.Def, in case
-			// s.Def gets defined while importing base (if an imported
-			// type). (Issue #50486).
-			base := g.obj(typ.Origin().Obj())
-
-			if s.Def != nil {
-				// We have already encountered this instantiation.
-				// Use the type we previously created, since there
-				// must be exactly one instance of a defined type.
-				return s.Def.Type()
-			}
-
-			if base.Class == ir.PAUTO {
-				// If the base type is a local type, we want to pop
-				// this instantiated type symbol/definition when we
-				// leave the containing block, so we don't use it
-				// incorrectly later.
-				types.Pushdcl(s)
-			}
-
-			// Create a forwarding type first and put it in the g.typs
-			// map, in order to deal with recursive generic types
-			// (including via method signatures). Set up the extra
-			// ntyp information (Def, RParams, which may set
-			// HasTParam) before translating the underlying type
-			// itself, so we handle recursion correctly.
-			ntyp := typecheck.NewIncompleteNamedType(g.pos(typ.Obj().Pos()), s)
-			g.typs[typ] = ntyp
-
-			// If ntyp still has type params, then we must be
-			// referencing something like 'value[T2]', as when
-			// specifying the generic receiver of a method, where
-			// value was defined as "type value[T any] ...". Save the
-			// type args, which will now be the new typeparams of the
-			// current type.
-			//
-			// If ntyp does not have type params, we are saving the
-			// non-generic types used to instantiate this type. We'll
-			// use these when instantiating the methods of the
-			// instantiated type.
-			targs := typ.TypeArgs()
-			rparams := make([]*types.Type, targs.Len())
-			for i := range rparams {
-				rparams[i] = g.typ1(targs.At(i))
-			}
-			ntyp.SetRParams(rparams)
-			//fmt.Printf("Saw new type %v %v\n", instName, ntyp.HasTParam())
-
-			// Save the symbol for the base generic type.
-			ntyp.SetOrigType(base.Type())
-			ntyp.SetUnderlying(g.typ1(typ.Underlying()))
-			if typ.NumMethods() != 0 {
-				// Save a delayed call to g.fillinMethods() (once
-				// potentially recursive types have been fully
-				// resolved).
-				g.typesToFinalize = append(g.typesToFinalize,
-					&typeDelayInfo{
-						typ:  typ,
-						ntyp: ntyp,
-					})
-			}
-			return ntyp
-		}
-		obj := g.obj(typ.Obj())
-		if obj.Op() != ir.OTYPE {
-			base.FatalfAt(obj.Pos(), "expected type: %L", obj)
-		}
-		return obj.Type()
-
-	case *types2.Array:
-		return types.NewArray(g.typ1(typ.Elem()), typ.Len())
-	case *types2.Chan:
-		return types.NewChan(g.typ1(typ.Elem()), dirs[typ.Dir()])
-	case *types2.Map:
-		return types.NewMap(g.typ1(typ.Key()), g.typ1(typ.Elem()))
-	case *types2.Pointer:
-		return types.NewPtr(g.typ1(typ.Elem()))
-	case *types2.Signature:
-		return g.signature(nil, typ)
-	case *types2.Slice:
-		return types.NewSlice(g.typ1(typ.Elem()))
-
-	case *types2.Struct:
-		fields := make([]*types.Field, typ.NumFields())
-		for i := range fields {
-			v := typ.Field(i)
-			f := types.NewField(g.pos(v), g.selector(v), g.typ1(v.Type()))
-			f.Note = typ.Tag(i)
-			if v.Embedded() {
-				f.Embedded = 1
-			}
-			fields[i] = f
-		}
-		return types.NewStruct(g.tpkg(typ), fields)
-
-	case *types2.Interface:
-		embeddeds := make([]*types.Field, typ.NumEmbeddeds())
-		j := 0
-		for i := range embeddeds {
-			// TODO(mdempsky): Get embedding position.
-			e := typ.EmbeddedType(i)
-
-			// With Go 1.18, an embedded element can be any type, not
-			// just an interface.
-			embeddeds[j] = types.NewField(src.NoXPos, nil, g.typ1(e))
-			j++
-		}
-		embeddeds = embeddeds[:j]
-
-		methods := make([]*types.Field, typ.NumExplicitMethods())
-		for i := range methods {
-			m := typ.ExplicitMethod(i)
-			mtyp := g.signature(types.FakeRecv(), m.Type().(*types2.Signature))
-			methods[i] = types.NewField(g.pos(m), g.selector(m), mtyp)
-		}
-
-		return types.NewInterface(g.tpkg(typ), append(embeddeds, methods...), typ.IsImplicit())
-
-	case *types2.TypeParam:
-		// Save the name of the type parameter in the sym of the type.
-		// Include the types2 subscript in the sym name
-		pkg := g.tpkg(typ)
-		// Create the unique types1 name for a type param, using its context
-		// with a function, type, or method declaration. Also, map blank type
-		// param names to a unique name based on their type param index. The
-		// unique blank names will be exported, but will be reverted during
-		// types2 and gcimporter import.
-		assert(g.curDecl != "")
-		nm := typecheck.TparamExportName(g.curDecl, typ.Obj().Name(), typ.Index())
-		sym := pkg.Lookup(nm)
-		if sym.Def != nil {
-			// Make sure we use the same type param type for the same
-			// name, whether it is created during types1-import or
-			// this types2-to-types1 translation.
-			return sym.Def.Type()
-		}
-		obj := ir.NewDeclNameAt(g.pos(typ.Obj().Pos()), ir.OTYPE, sym)
-		sym.Def = obj
-		tp := types.NewTypeParam(obj, typ.Index())
-		obj.SetType(tp)
-		// Set g.typs[typ] in case the bound methods reference typ.
-		g.typs[typ] = tp
-
-		bound := g.typ1(typ.Constraint())
-		tp.SetBound(bound)
-		return tp
-
-	case *types2.Union:
-		nt := typ.Len()
-		tlist := make([]*types.Type, nt)
-		tildes := make([]bool, nt)
-		for i := range tlist {
-			t := typ.Term(i)
-			tlist[i] = g.typ1(t.Type())
-			tildes[i] = t.Tilde()
-		}
-		return types.NewUnion(tlist, tildes)
-
-	case *types2.Tuple:
-		// Tuples are used for the type of a function call (i.e. the
-		// return value of the function).
-		if typ == nil {
-			return (*types.Type)(nil)
-		}
-		fields := make([]*types.Field, typ.Len())
-		for i := range fields {
-			fields[i] = g.param(typ.At(i))
-		}
-		t := types.NewStruct(types.LocalPkg, fields)
-		t.StructType().Funarg = types.FunargResults
-		return t
-
-	default:
-		base.FatalfAt(src.NoXPos, "unhandled type: %v (%T)", typ, typ)
-		panic("unreachable")
-	}
-}
-
-// fillinMethods fills in the method name nodes and types for a defined type with at
-// least one method. This is needed for later typechecking when looking up methods of
-// instantiated types, and for actually generating the methods for instantiated
-// types.
-func (g *irgen) fillinMethods(typ *types2.Named, ntyp *types.Type) {
-	targs2 := typ.TypeArgs()
-	targs := make([]*types.Type, targs2.Len())
-	for i := range targs {
-		targs[i] = g.typ1(targs2.At(i))
-	}
-
-	methods := make([]*types.Field, typ.NumMethods())
-	for i := range methods {
-		m := typ.Method(i)
-		recvType := deref2(types2.AsSignature(m.Type()).Recv().Type())
-		var meth *ir.Name
-		imported := false
-		if m.Pkg() != g.self {
-			// Imported methods cannot be loaded by name (what
-			// g.obj() does) - they must be loaded via their
-			// type.
-			meth = g.obj(recvType.(*types2.Named).Obj()).Type().Methods().Index(i).Nname.(*ir.Name)
-			// XXX Because Obj() returns the object of the base generic
-			// type, we have to still do the method translation below.
-			imported = true
-		} else {
-			meth = g.obj(m)
-		}
-		assert(recvType == types2.Type(typ))
-		if imported {
-			// Unfortunately, meth is the type of the method of the
-			// generic type, so we have to do a substitution to get
-			// the name/type of the method of the instantiated type,
-			// using m.Type().RParams() and typ.TArgs()
-			inst2 := g.instTypeName2("", typ.TypeArgs())
-			name := meth.Sym().Name
-			i1 := strings.Index(name, "[")
-			i2 := strings.Index(name[i1:], "]")
-			assert(i1 >= 0 && i2 >= 0)
-			// Generate the name of the instantiated method.
-			name = name[0:i1] + inst2 + name[i1+i2+1:]
-			newsym := meth.Sym().Pkg.Lookup(name)
-			var meth2 *ir.Name
-			if newsym.Def != nil {
-				meth2 = newsym.Def.(*ir.Name)
-			} else {
-				meth2 = ir.NewNameAt(meth.Pos(), newsym)
-				rparams := types2.AsSignature(m.Type()).RecvTypeParams()
-				tparams := make([]*types.Type, rparams.Len())
-				// Set g.curDecl to be the method context, so type
-				// params in the receiver of the method that we are
-				// translating gets the right unique name. We could
-				// be in a top-level typeDecl, so save and restore
-				// the current contents of g.curDecl.
-				savedCurDecl := g.curDecl
-				g.curDecl = typ.Obj().Name() + "." + m.Name()
-				for i := range tparams {
-					tparams[i] = g.typ1(rparams.At(i))
-				}
-				g.curDecl = savedCurDecl
-				assert(len(tparams) == len(targs))
-				ts := typecheck.Tsubster{
-					Tparams: tparams,
-					Targs:   targs,
-				}
-				// Do the substitution of the type
-				meth2.SetType(ts.Typ(meth.Type()))
-				newsym.Def = meth2
-			}
-			meth = meth2
-		}
-		methods[i] = types.NewField(meth.Pos(), g.selector(m), meth.Type())
-		methods[i].Nname = meth
-	}
-	ntyp.Methods().Set(methods)
-	if !ntyp.HasTParam() && !ntyp.HasShape() {
-		// Generate all the methods for a new fully-instantiated type.
-		typecheck.NeedInstType(ntyp)
-	}
-}
-
-func (g *irgen) signature(recv *types.Field, sig *types2.Signature) *types.Type {
-	tparams2 := sig.TypeParams()
-	tparams := make([]*types.Field, tparams2.Len())
-	for i := range tparams {
-		tp := tparams2.At(i).Obj()
-		tparams[i] = types.NewField(g.pos(tp), g.sym(tp), g.typ1(tp.Type()))
-	}
-
-	do := func(typ *types2.Tuple) []*types.Field {
-		fields := make([]*types.Field, typ.Len())
-		for i := range fields {
-			fields[i] = g.param(typ.At(i))
-		}
-		return fields
-	}
-	params := do(sig.Params())
-	results := do(sig.Results())
-	if sig.Variadic() {
-		params[len(params)-1].SetIsDDD(true)
-	}
-
-	return types.NewSignature(g.tpkg(sig), recv, tparams, params, results)
-}
-
-func (g *irgen) param(v *types2.Var) *types.Field {
-	return types.NewField(g.pos(v), g.sym(v), g.typ1(v.Type()))
-}
-
-func (g *irgen) sym(obj types2.Object) *types.Sym {
-	if name := obj.Name(); name != "" {
-		return g.pkg(obj.Pkg()).Lookup(obj.Name())
-	}
-	return nil
-}
-
-func (g *irgen) selector(obj types2.Object) *types.Sym {
-	pkg, name := g.pkg(obj.Pkg()), obj.Name()
-	if types.IsExported(name) {
-		pkg = types.LocalPkg
-	}
-	return pkg.Lookup(name)
-}
-
-// tpkg returns the package that a function, interface, struct, or typeparam type
-// expression appeared in.
-//
-// Caveat: For the degenerate types "func()", "interface{}", and
-// "struct{}", tpkg always returns LocalPkg. However, we only need the
-// package information so that go/types can report it via its API, and
-// the reason we fail to return the original package for these
-// particular types is because go/types does *not* report it for
-// them. So in practice this limitation is probably moot.
-func (g *irgen) tpkg(typ types2.Type) *types.Pkg {
-	if obj := anyObj(typ); obj != nil {
-		return g.pkg(obj.Pkg())
-	}
-	return types.LocalPkg
-}
-
-// anyObj returns some object accessible from typ, if any.
-func anyObj(typ types2.Type) types2.Object {
-	switch typ := typ.(type) {
-	case *types2.Signature:
-		if recv := typ.Recv(); recv != nil {
-			return recv
-		}
-		if params := typ.Params(); params.Len() > 0 {
-			return params.At(0)
-		}
-		if results := typ.Results(); results.Len() > 0 {
-			return results.At(0)
-		}
-	case *types2.Struct:
-		if typ.NumFields() > 0 {
-			return typ.Field(0)
-		}
-	case *types2.Interface:
-		if typ.NumExplicitMethods() > 0 {
-			return typ.ExplicitMethod(0)
-		}
-	case *types2.TypeParam:
-		return typ.Obj()
-	}
-	return nil
-}
-
-func (g *irgen) basic(typ *types2.Basic) *types.Type {
-	switch typ.Name() {
-	case "byte":
-		return types.ByteType
-	case "rune":
-		return types.RuneType
-	}
-	return *basics[typ.Kind()]
-}
-
 var basics = [...]**types.Type{
 	types2.Invalid:        new(*types.Type),
 	types2.Bool:           &types.Types[types.TBOOL],
diff --git a/src/cmd/compile/internal/noder/unified.go b/src/cmd/compile/internal/noder/unified.go
index ed97a09..6c4ac66 100644
--- a/src/cmd/compile/internal/noder/unified.go
+++ b/src/cmd/compile/internal/noder/unified.go
@@ -68,11 +68,11 @@
 // the unified IR has the full typed AST needed for introspection during step (1).
 // In other words, we have all the necessary information to build the generic IR form
 // (see writer.captureVars for an example).
-func unified(noders []*noder) {
+func unified(m posMap, noders []*noder) {
 	inline.InlineCall = unifiedInlineCall
 	typecheck.HaveInlineBody = unifiedHaveInlineBody
 
-	data := writePkgStub(noders)
+	data := writePkgStub(m, noders)
 
 	// We already passed base.Flag.Lang to types2 to handle validating
 	// the user's source code. Bump it up now to the current version and
@@ -158,7 +158,11 @@
 			// Instantiated generic function: add to Decls for typechecking
 			// and compilation.
 			if fn.OClosure == nil && len(pri.dict.targs) != 0 {
-				if duringInlining {
+				// cmd/link does not support a type symbol referencing a method symbol
+				// across DSO boundary, so force re-compiling methods on a generic type
+				// even it was seen from imported package in linkshared mode, see #58966.
+				canSkipNonGenericMethod := !(base.Ctxt.Flag_linkshared && ir.IsMethod(fn))
+				if duringInlining && canSkipNonGenericMethod {
 					inlDecls = append(inlDecls, fn)
 				} else {
 					target.Decls = append(target.Decls, fn)
@@ -202,8 +206,8 @@
 // writePkgStub type checks the given parsed source files,
 // writes an export data package stub representing them,
 // and returns the result.
-func writePkgStub(noders []*noder) string {
-	m, pkg, info := checkFiles(noders)
+func writePkgStub(m posMap, noders []*noder) string {
+	pkg, info := checkFiles(m, noders)
 
 	pw := newPkgWriter(m, pkg, info)
 
diff --git a/src/cmd/compile/internal/noder/validate.go b/src/cmd/compile/internal/noder/validate.go
deleted file mode 100644
index baf8bd3..0000000
--- a/src/cmd/compile/internal/noder/validate.go
+++ /dev/null
@@ -1,132 +0,0 @@
-// Copyright 2021 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package noder
-
-import (
-	"go/constant"
-
-	"cmd/compile/internal/base"
-	"cmd/compile/internal/syntax"
-	"cmd/compile/internal/types"
-	"cmd/compile/internal/types2"
-)
-
-// match reports whether types t1 and t2 are consistent
-// representations for a given expression's type.
-func (g *irgen) match(t1 *types.Type, t2 types2.Type, hasOK bool) bool {
-	tuple, ok := t2.(*types2.Tuple)
-	if !ok {
-		// Not a tuple; can use simple type identity comparison.
-		return types.Identical(t1, g.typ(t2))
-	}
-
-	if hasOK {
-		// For has-ok values, types2 represents the expression's type as a
-		// 2-element tuple, whereas ir just uses the first type and infers
-		// that the second type is boolean. Must match either, since we
-		// sometimes delay the transformation to the ir form.
-		if tuple.Len() == 2 && types.Identical(t1, g.typ(tuple.At(0).Type())) {
-			return true
-		}
-		return types.Identical(t1, g.typ(t2))
-	}
-
-	if t1 == nil || tuple == nil {
-		return t1 == nil && tuple == nil
-	}
-	if !t1.IsFuncArgStruct() {
-		return false
-	}
-	if t1.NumFields() != tuple.Len() {
-		return false
-	}
-	for i, result := range t1.FieldSlice() {
-		if !types.Identical(result.Type, g.typ(tuple.At(i).Type())) {
-			return false
-		}
-	}
-	return true
-}
-
-func (g *irgen) validate(n syntax.Node) {
-	switch n := n.(type) {
-	case *syntax.CallExpr:
-		tv := g.typeAndValue(n.Fun)
-		if tv.IsBuiltin() {
-			fun := n.Fun
-			for {
-				builtin, ok := fun.(*syntax.ParenExpr)
-				if !ok {
-					break
-				}
-				fun = builtin.X
-			}
-			switch builtin := fun.(type) {
-			case *syntax.Name:
-				g.validateBuiltin(builtin.Value, n)
-			case *syntax.SelectorExpr:
-				g.validateBuiltin(builtin.Sel.Value, n)
-			default:
-				g.unhandled("builtin", n)
-			}
-		}
-	}
-}
-
-func (g *irgen) validateBuiltin(name string, call *syntax.CallExpr) {
-	switch name {
-	case "Alignof", "Offsetof", "Sizeof":
-		// Check that types2+gcSizes calculates sizes the same
-		// as cmd/compile does.
-
-		tv := g.typeAndValue(call)
-		if !tv.IsValue() {
-			base.FatalfAt(g.pos(call), "expected a value")
-		}
-
-		if tv.Value == nil {
-			break // unsafe op is not a constant, so no further validation
-		}
-
-		got, ok := constant.Int64Val(tv.Value)
-		if !ok {
-			base.FatalfAt(g.pos(call), "expected int64 constant value")
-		}
-
-		want := g.unsafeExpr(name, call.ArgList[0])
-		if got != want {
-			base.FatalfAt(g.pos(call), "got %v from types2, but want %v", got, want)
-		}
-	}
-}
-
-// unsafeExpr evaluates the given unsafe builtin function on arg.
-func (g *irgen) unsafeExpr(name string, arg syntax.Expr) int64 {
-	switch name {
-	case "Alignof":
-		return g.typ(g.type2(arg)).Alignment()
-	case "Sizeof":
-		return g.typ(g.type2(arg)).Size()
-	}
-
-	// Offsetof
-
-	sel := arg.(*syntax.SelectorExpr)
-	selection := g.info.Selections[sel]
-
-	typ := g.typ(g.type2(sel.X))
-	typ = deref(typ)
-
-	var offset int64
-	for _, i := range selection.Index() {
-		// Ensure field offsets have been calculated.
-		types.CalcSize(typ)
-
-		f := typ.Field(i)
-		offset += f.Offset
-		typ = f.Type
-	}
-	return offset
-}
diff --git a/src/cmd/compile/internal/noder/writer.go b/src/cmd/compile/internal/noder/writer.go
index da5c1e9..178c3eb 100644
--- a/src/cmd/compile/internal/noder/writer.go
+++ b/src/cmd/compile/internal/noder/writer.go
@@ -6,6 +6,7 @@
 
 import (
 	"fmt"
+	"internal/buildcfg"
 	"internal/pkgbits"
 
 	"cmd/compile/internal/base"
@@ -107,7 +108,7 @@
 
 // errorf reports a user error about thing p.
 func (pw *pkgWriter) errorf(p poser, msg string, args ...interface{}) {
-	base.ErrorfAt(pw.m.pos(p), msg, args...)
+	base.ErrorfAt(pw.m.pos(p), 0, msg, args...)
 }
 
 // fatalf reports an internal compiler error about thing p.
@@ -122,14 +123,25 @@
 }
 
 func (pw *pkgWriter) typeAndValue(x syntax.Expr) syntax.TypeAndValue {
-	tv := x.GetTypeInfo()
-	if tv.Type == nil {
+	tv, ok := pw.maybeTypeAndValue(x)
+	if !ok {
 		pw.fatalf(x, "missing Types entry: %v", syntax.String(x))
 	}
 	return tv
 }
+
 func (pw *pkgWriter) maybeTypeAndValue(x syntax.Expr) (syntax.TypeAndValue, bool) {
 	tv := x.GetTypeInfo()
+
+	// If x is a generic function whose type arguments are inferred
+	// from assignment context, then we need to find its inferred type
+	// in Info.Instances instead.
+	if name, ok := x.(*syntax.Name); ok {
+		if inst, ok := pw.info.Instances[name]; ok {
+			tv.Type = inst.Type
+		}
+	}
+
 	return tv, tv.Type != nil
 }
 
@@ -1003,11 +1015,15 @@
 	if pragma&ir.Systemstack != 0 && pragma&ir.Nosplit != 0 {
 		w.p.errorf(decl, "go:nosplit and go:systemstack cannot be combined")
 	}
+	wi := asWasmImport(decl.Pragma)
 
 	if decl.Body != nil {
 		if pragma&ir.Noescape != 0 {
 			w.p.errorf(decl, "can only use //go:noescape with external func implementations")
 		}
+		if wi != nil {
+			w.p.errorf(decl, "can only use //go:wasmimport with external func implementations")
+		}
 		if (pragma&ir.UintptrKeepAlive != 0 && pragma&ir.UintptrEscapes == 0) && pragma&ir.Nosplit == 0 {
 			// Stack growth can't handle uintptr arguments that may
 			// be pointers (as we don't know which are pointers
@@ -1028,7 +1044,8 @@
 		if base.Flag.Complete || decl.Name.Value == "init" {
 			// Linknamed functions are allowed to have no body. Hopefully
 			// the linkname target has a body. See issue 23311.
-			if _, ok := w.p.linknames[obj]; !ok {
+			// Wasmimport functions are also allowed to have no body.
+			if _, ok := w.p.linknames[obj]; !ok && wi == nil {
 				w.p.errorf(decl, "missing function body")
 			}
 		}
@@ -1041,6 +1058,17 @@
 	w.Sync(pkgbits.SyncFuncExt)
 	w.pragmaFlag(pragma)
 	w.linkname(obj)
+
+	if buildcfg.GOARCH == "wasm" {
+		if wi != nil {
+			w.String(wi.Module)
+			w.String(wi.Name)
+		} else {
+			w.String("")
+			w.String("")
+		}
+	}
+
 	w.Bool(false) // stub extension
 	w.Reloc(pkgbits.RelocBody, body)
 	w.Sync(pkgbits.SyncEOF)
@@ -1428,6 +1456,7 @@
 	}
 
 	w.blockStmt(stmt.Body)
+	w.Bool(base.Debug.LoopVar > 0)
 	w.closeAnotherScope()
 }
 
@@ -2728,6 +2757,13 @@
 	return p.(*pragmas).Flag
 }
 
+func asWasmImport(p syntax.Pragma) *WasmImport {
+	if p == nil {
+		return nil
+	}
+	return p.(*pragmas).WasmImport
+}
+
 // isPtrTo reports whether from is the type *to.
 func isPtrTo(from, to types2.Type) bool {
 	ptr, ok := from.(*types2.Pointer)
diff --git a/src/cmd/compile/internal/objw/prog.go b/src/cmd/compile/internal/objw/prog.go
index b5ac4dd..3175123 100644
--- a/src/cmd/compile/internal/objw/prog.go
+++ b/src/cmd/compile/internal/objw/prog.go
@@ -34,8 +34,8 @@
 	"cmd/compile/internal/base"
 	"cmd/compile/internal/ir"
 	"cmd/internal/obj"
-	"cmd/internal/objabi"
 	"cmd/internal/src"
+	"internal/abi"
 )
 
 var sharedProgArray = new([10000]obj.Prog) // *T instead of T to work around issue 19839
@@ -144,18 +144,18 @@
 		idx := pp.NextLive.StackMapIndex
 		pp.PrevLive.StackMapIndex = idx
 		p := pp.Prog(obj.APCDATA)
-		p.From.SetConst(objabi.PCDATA_StackMapIndex)
+		p.From.SetConst(abi.PCDATA_StackMapIndex)
 		p.To.SetConst(int64(idx))
 	}
 	if pp.NextLive.IsUnsafePoint != pp.PrevLive.IsUnsafePoint {
 		// Emit unsafe-point marker.
 		pp.PrevLive.IsUnsafePoint = pp.NextLive.IsUnsafePoint
 		p := pp.Prog(obj.APCDATA)
-		p.From.SetConst(objabi.PCDATA_UnsafePoint)
+		p.From.SetConst(abi.PCDATA_UnsafePoint)
 		if pp.NextLive.IsUnsafePoint {
-			p.To.SetConst(objabi.PCDATA_UnsafePointUnsafe)
+			p.To.SetConst(abi.UnsafePointUnsafe)
 		} else {
-			p.To.SetConst(objabi.PCDATA_UnsafePointSafe)
+			p.To.SetConst(abi.UnsafePointSafe)
 		}
 	}
 
diff --git a/src/cmd/compile/internal/pgo/graph.go b/src/cmd/compile/internal/pgo/graph.go
deleted file mode 100644
index a2cf18f..0000000
--- a/src/cmd/compile/internal/pgo/graph.go
+++ /dev/null
@@ -1,848 +0,0 @@
-// Copyright 2014 Google Inc. All Rights Reserved.
-//
-// 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.
-
-// Package graph collects a set of samples into a directed graph.
-
-// Original file location: https://github.com/google/pprof/tree/main/internal/graph/graph.go
-package pgo
-
-import (
-	"fmt"
-	"internal/profile"
-	"math"
-	"sort"
-	"strings"
-)
-
-// Options encodes the options for constructing a graph
-type Options struct {
-	SampleValue       func(s []int64) int64 // Function to compute the value of a sample
-	SampleMeanDivisor func(s []int64) int64 // Function to compute the divisor for mean graphs, or nil
-
-	CallTree     bool // Build a tree instead of a graph
-	DropNegative bool // Drop nodes with overall negative values
-
-	KeptNodes NodeSet // If non-nil, only use nodes in this set
-}
-
-// Nodes is an ordered collection of graph nodes.
-type Nodes []*Node
-
-// Node is an entry on a profiling report. It represents a unique
-// program location.
-type Node struct {
-	// Info describes the source location associated to this node.
-	Info NodeInfo
-
-	// Function represents the function that this node belongs to. On
-	// graphs with sub-function resolution (eg line number or
-	// addresses), two nodes in a NodeMap that are part of the same
-	// function have the same value of Node.Function. If the Node
-	// represents the whole function, it points back to itself.
-	Function *Node
-
-	// Values associated to this node. Flat is exclusive to this node,
-	// Cum includes all descendents.
-	Flat, FlatDiv, Cum, CumDiv int64
-
-	// In and out Contains the nodes immediately reaching or reached by
-	// this node.
-	In, Out EdgeMap
-}
-
-// Graph summarizes a performance profile into a format that is
-// suitable for visualization.
-type Graph struct {
-	Nodes Nodes
-}
-
-// FlatValue returns the exclusive value for this node, computing the
-// mean if a divisor is available.
-func (n *Node) FlatValue() int64 {
-	if n.FlatDiv == 0 {
-		return n.Flat
-	}
-	return n.Flat / n.FlatDiv
-}
-
-// CumValue returns the inclusive value for this node, computing the
-// mean if a divisor is available.
-func (n *Node) CumValue() int64 {
-	if n.CumDiv == 0 {
-		return n.Cum
-	}
-	return n.Cum / n.CumDiv
-}
-
-// AddToEdge increases the weight of an edge between two nodes. If
-// there isn't such an edge one is created.
-func (n *Node) AddToEdge(to *Node, v int64, residual, inline bool) {
-	n.AddToEdgeDiv(to, 0, v, residual, inline)
-}
-
-// AddToEdgeDiv increases the weight of an edge between two nodes. If
-// there isn't such an edge one is created.
-func (n *Node) AddToEdgeDiv(to *Node, dv, v int64, residual, inline bool) {
-	if e := n.Out.FindTo(to); e != nil {
-		e.WeightDiv += dv
-		e.Weight += v
-		if residual {
-			e.Residual = true
-		}
-		if !inline {
-			e.Inline = false
-		}
-		return
-	}
-
-	info := &Edge{Src: n, Dest: to, WeightDiv: dv, Weight: v, Residual: residual, Inline: inline}
-	n.Out.Add(info)
-	to.In.Add(info)
-}
-
-// NodeInfo contains the attributes for a node.
-type NodeInfo struct {
-	Name              string
-	Address           uint64
-	StartLine, Lineno int
-	//File            string
-	//OrigName        string
-	//Objfile         string
-}
-
-// PrintableName calls the Node's Formatter function with a single space separator.
-func (i *NodeInfo) PrintableName() string {
-	return strings.Join(i.NameComponents(), " ")
-}
-
-// NameComponents returns the components of the printable name to be used for a node.
-func (i *NodeInfo) NameComponents() []string {
-	var name []string
-	if i.Address != 0 {
-		name = append(name, fmt.Sprintf("%016x", i.Address))
-	}
-	if fun := i.Name; fun != "" {
-		name = append(name, fun)
-	}
-
-	switch {
-	case i.Lineno != 0:
-		// User requested line numbers, provide what we have.
-		name = append(name, fmt.Sprintf(":%d", i.Lineno))
-	case i.Name != "":
-		// User requested function name. It was already included.
-	default:
-		// Do not leave it empty if there is no information at all.
-		name = append(name, "<unknown>")
-	}
-	return name
-}
-
-// NodeMap maps from a node info struct to a node. It is used to merge
-// report entries with the same info.
-type NodeMap map[NodeInfo]*Node
-
-// NodeSet is a collection of node info structs.
-type NodeSet map[NodeInfo]bool
-
-// NodePtrSet is a collection of nodes. Trimming a graph or tree requires a set
-// of objects which uniquely identify the nodes to keep. In a graph, NodeInfo
-// works as a unique identifier; however, in a tree multiple nodes may share
-// identical NodeInfos. A *Node does uniquely identify a node so we can use that
-// instead. Though a *Node also uniquely identifies a node in a graph,
-// currently, during trimming, graphs are rebuilt from scratch using only the
-// NodeSet, so there would not be the required context of the initial graph to
-// allow for the use of *Node.
-type NodePtrSet map[*Node]bool
-
-// FindOrInsertNode takes the info for a node and either returns a matching node
-// from the node map if one exists, or adds one to the map if one does not.
-// If kept is non-nil, nodes are only added if they can be located on it.
-func (nm NodeMap) FindOrInsertNode(info NodeInfo, kept NodeSet) *Node {
-	if kept != nil {
-		if _, ok := kept[info]; !ok {
-			return nil
-		}
-	}
-
-	if n, ok := nm[info]; ok {
-		return n
-	}
-
-	n := &Node{
-		Info: info,
-	}
-	nm[info] = n
-	if info.Address == 0 && info.Lineno == 0 {
-		// This node represents the whole function, so point Function
-		// back to itself.
-		n.Function = n
-		return n
-	}
-	// Find a node that represents the whole function.
-	info.Address = 0
-	info.Lineno = 0
-	n.Function = nm.FindOrInsertNode(info, nil)
-	return n
-}
-
-// EdgeMap is used to represent the incoming/outgoing edges from a node.
-type EdgeMap []*Edge
-
-func (em EdgeMap) FindTo(n *Node) *Edge {
-	for _, e := range em {
-		if e.Dest == n {
-			return e
-		}
-	}
-	return nil
-}
-
-func (em *EdgeMap) Add(e *Edge) {
-	*em = append(*em, e)
-}
-
-func (em *EdgeMap) Delete(e *Edge) {
-	for i, edge := range *em {
-		if edge == e {
-			(*em)[i] = (*em)[len(*em)-1]
-			*em = (*em)[:len(*em)-1]
-			return
-		}
-	}
-}
-
-// Edge contains any attributes to be represented about edges in a graph.
-type Edge struct {
-	Src, Dest *Node
-	// The summary weight of the edge
-	Weight, WeightDiv int64
-
-	// residual edges connect nodes that were connected through a
-	// separate node, which has been removed from the report.
-	Residual bool
-	// An inline edge represents a call that was inlined into the caller.
-	Inline bool
-}
-
-// WeightValue returns the weight value for this edge, normalizing if a
-// divisor is available.
-func (e *Edge) WeightValue() int64 {
-	if e.WeightDiv == 0 {
-		return e.Weight
-	}
-	return e.Weight / e.WeightDiv
-}
-
-// newGraph computes a graph from a profile.
-func newGraph(prof *profile.Profile, o *Options) *Graph {
-	nodes, locationMap := CreateNodes(prof, o)
-	seenNode := make(map[*Node]bool)
-	seenEdge := make(map[nodePair]bool)
-	for _, sample := range prof.Sample {
-		var w, dw int64
-		w = o.SampleValue(sample.Value)
-		if o.SampleMeanDivisor != nil {
-			dw = o.SampleMeanDivisor(sample.Value)
-		}
-		if dw == 0 && w == 0 {
-			continue
-		}
-		for k := range seenNode {
-			delete(seenNode, k)
-		}
-		for k := range seenEdge {
-			delete(seenEdge, k)
-		}
-		var parent *Node
-		// A residual edge goes over one or more nodes that were not kept.
-		residual := false
-
-		// Group the sample frames, based on a global map.
-		// Count only the last two frames as a call edge. Frames higher up
-		// the stack are unlikely to be repeated calls (e.g. runtime.main
-		// calling main.main). So adding weights to call edges higher up
-		// the stack may be not reflecting the actual call edge weights
-		// in the program. Without a branch profile this is just an
-		// approximation.
-		i := 1
-		if last := len(sample.Location) - 1; last < i {
-			i = last
-		}
-		for ; i >= 0; i-- {
-			l := sample.Location[i]
-			locNodes := locationMap.get(l.ID)
-			for ni := len(locNodes) - 1; ni >= 0; ni-- {
-				n := locNodes[ni]
-				if n == nil {
-					residual = true
-					continue
-				}
-				// Add cum weight to all nodes in stack, avoiding double counting.
-				_, sawNode := seenNode[n]
-				if !sawNode {
-					seenNode[n] = true
-					n.addSample(dw, w, false)
-				}
-				// Update edge weights for all edges in stack, avoiding double counting.
-				if (!sawNode || !seenEdge[nodePair{n, parent}]) && parent != nil && n != parent {
-					seenEdge[nodePair{n, parent}] = true
-					parent.AddToEdgeDiv(n, dw, w, residual, ni != len(locNodes)-1)
-				}
-
-				parent = n
-				residual = false
-			}
-		}
-		if parent != nil && !residual {
-			// Add flat weight to leaf node.
-			parent.addSample(dw, w, true)
-		}
-	}
-
-	return selectNodesForGraph(nodes, o.DropNegative)
-}
-
-func selectNodesForGraph(nodes Nodes, dropNegative bool) *Graph {
-	// Collect nodes into a graph.
-	gNodes := make(Nodes, 0, len(nodes))
-	for _, n := range nodes {
-		if n == nil {
-			continue
-		}
-		if n.Cum == 0 && n.Flat == 0 {
-			continue
-		}
-		if dropNegative && isNegative(n) {
-			continue
-		}
-		gNodes = append(gNodes, n)
-	}
-	return &Graph{gNodes}
-}
-
-type nodePair struct {
-	src, dest *Node
-}
-
-func newTree(prof *profile.Profile, o *Options) (g *Graph) {
-	parentNodeMap := make(map[*Node]NodeMap, len(prof.Sample))
-	for _, sample := range prof.Sample {
-		var w, dw int64
-		w = o.SampleValue(sample.Value)
-		if o.SampleMeanDivisor != nil {
-			dw = o.SampleMeanDivisor(sample.Value)
-		}
-		if dw == 0 && w == 0 {
-			continue
-		}
-		var parent *Node
-		// Group the sample frames, based on a per-node map.
-		for i := len(sample.Location) - 1; i >= 0; i-- {
-			l := sample.Location[i]
-			lines := l.Line
-			if len(lines) == 0 {
-				lines = []profile.Line{{}} // Create empty line to include location info.
-			}
-			for lidx := len(lines) - 1; lidx >= 0; lidx-- {
-				nodeMap := parentNodeMap[parent]
-				if nodeMap == nil {
-					nodeMap = make(NodeMap)
-					parentNodeMap[parent] = nodeMap
-				}
-				n := nodeMap.findOrInsertLine(l, lines[lidx], o)
-				if n == nil {
-					continue
-				}
-				n.addSample(dw, w, false)
-				if parent != nil {
-					parent.AddToEdgeDiv(n, dw, w, false, lidx != len(lines)-1)
-				}
-				parent = n
-			}
-		}
-		if parent != nil {
-			parent.addSample(dw, w, true)
-		}
-	}
-
-	nodes := make(Nodes, len(prof.Location))
-	for _, nm := range parentNodeMap {
-		nodes = append(nodes, nm.nodes()...)
-	}
-	return selectNodesForGraph(nodes, o.DropNegative)
-}
-
-// isNegative returns true if the node is considered as "negative" for the
-// purposes of drop_negative.
-func isNegative(n *Node) bool {
-	switch {
-	case n.Flat < 0:
-		return true
-	case n.Flat == 0 && n.Cum < 0:
-		return true
-	default:
-		return false
-	}
-}
-
-type locationMap struct {
-	s []Nodes          // a slice for small sequential IDs
-	m map[uint64]Nodes // fallback for large IDs (unlikely)
-}
-
-func (l *locationMap) add(id uint64, n Nodes) {
-	if id < uint64(len(l.s)) {
-		l.s[id] = n
-	} else {
-		l.m[id] = n
-	}
-}
-
-func (l locationMap) get(id uint64) Nodes {
-	if id < uint64(len(l.s)) {
-		return l.s[id]
-	} else {
-		return l.m[id]
-	}
-}
-
-// CreateNodes creates graph nodes for all locations in a profile. It
-// returns set of all nodes, plus a mapping of each location to the
-// set of corresponding nodes (one per location.Line).
-func CreateNodes(prof *profile.Profile, o *Options) (Nodes, locationMap) {
-	locations := locationMap{make([]Nodes, len(prof.Location)+1), make(map[uint64]Nodes)}
-	nm := make(NodeMap, len(prof.Location))
-	for _, l := range prof.Location {
-		lines := l.Line
-		if len(lines) == 0 {
-			lines = []profile.Line{{}} // Create empty line to include location info.
-		}
-		nodes := make(Nodes, len(lines))
-		for ln := range lines {
-			nodes[ln] = nm.findOrInsertLine(l, lines[ln], o)
-		}
-		locations.add(l.ID, nodes)
-	}
-	return nm.nodes(), locations
-}
-
-func (nm NodeMap) nodes() Nodes {
-	nodes := make(Nodes, 0, len(nm))
-	for _, n := range nm {
-		nodes = append(nodes, n)
-	}
-	return nodes
-}
-
-func (nm NodeMap) findOrInsertLine(l *profile.Location, li profile.Line, o *Options) *Node {
-	var objfile string
-	if m := l.Mapping; m != nil && m.File != "" {
-		objfile = m.File
-	}
-
-	if ni := nodeInfo(l, li, objfile, o); ni != nil {
-		return nm.FindOrInsertNode(*ni, o.KeptNodes)
-	}
-	return nil
-}
-
-func nodeInfo(l *profile.Location, line profile.Line, objfile string, o *Options) *NodeInfo {
-	if line.Function == nil {
-		return &NodeInfo{Address: l.Address}
-	}
-	ni := &NodeInfo{
-		Address: l.Address,
-		Lineno:  int(line.Line),
-		Name:    line.Function.Name,
-	}
-	ni.StartLine = int(line.Function.StartLine)
-	return ni
-}
-
-// Sum adds the flat and cum values of a set of nodes.
-func (ns Nodes) Sum() (flat int64, cum int64) {
-	for _, n := range ns {
-		flat += n.Flat
-		cum += n.Cum
-	}
-	return
-}
-
-func (n *Node) addSample(dw, w int64, flat bool) {
-	// Update sample value
-	if flat {
-		n.FlatDiv += dw
-		n.Flat += w
-	} else {
-		n.CumDiv += dw
-		n.Cum += w
-	}
-}
-
-// String returns a text representation of a graph, for debugging purposes.
-func (g *Graph) String() string {
-	var s []string
-
-	nodeIndex := make(map[*Node]int, len(g.Nodes))
-
-	for i, n := range g.Nodes {
-		nodeIndex[n] = i + 1
-	}
-
-	for i, n := range g.Nodes {
-		name := n.Info.PrintableName()
-		var in, out []int
-
-		for _, from := range n.In {
-			in = append(in, nodeIndex[from.Src])
-		}
-		for _, to := range n.Out {
-			out = append(out, nodeIndex[to.Dest])
-		}
-		s = append(s, fmt.Sprintf("%d: %s[flat=%d cum=%d] %x -> %v ", i+1, name, n.Flat, n.Cum, in, out))
-	}
-	return strings.Join(s, "\n")
-}
-
-// DiscardLowFrequencyNodes returns a set of the nodes at or over a
-// specific cum value cutoff.
-func (g *Graph) DiscardLowFrequencyNodes(nodeCutoff int64) NodeSet {
-	return makeNodeSet(g.Nodes, nodeCutoff)
-}
-
-// DiscardLowFrequencyNodePtrs returns a NodePtrSet of nodes at or over a
-// specific cum value cutoff.
-func (g *Graph) DiscardLowFrequencyNodePtrs(nodeCutoff int64) NodePtrSet {
-	cutNodes := getNodesAboveCumCutoff(g.Nodes, nodeCutoff)
-	kept := make(NodePtrSet, len(cutNodes))
-	for _, n := range cutNodes {
-		kept[n] = true
-	}
-	return kept
-}
-
-func makeNodeSet(nodes Nodes, nodeCutoff int64) NodeSet {
-	cutNodes := getNodesAboveCumCutoff(nodes, nodeCutoff)
-	kept := make(NodeSet, len(cutNodes))
-	for _, n := range cutNodes {
-		kept[n.Info] = true
-	}
-	return kept
-}
-
-// getNodesAboveCumCutoff returns all the nodes which have a Cum value greater
-// than or equal to cutoff.
-func getNodesAboveCumCutoff(nodes Nodes, nodeCutoff int64) Nodes {
-	cutoffNodes := make(Nodes, 0, len(nodes))
-	for _, n := range nodes {
-		if abs64(n.Cum) < nodeCutoff {
-			continue
-		}
-		cutoffNodes = append(cutoffNodes, n)
-	}
-	return cutoffNodes
-}
-
-// TrimLowFrequencyEdges removes edges that have less than
-// the specified weight. Returns the number of edges removed
-func (g *Graph) TrimLowFrequencyEdges(edgeCutoff int64) int {
-	var droppedEdges int
-	for _, n := range g.Nodes {
-		for _, e := range n.In {
-			if abs64(e.Weight) < edgeCutoff {
-				n.In.Delete(e)
-				e.Src.Out.Delete(e)
-				droppedEdges++
-			}
-		}
-	}
-	return droppedEdges
-}
-
-// SortNodes sorts the nodes in a graph based on a specific heuristic.
-func (g *Graph) SortNodes(cum bool, visualMode bool) {
-	// Sort nodes based on requested mode
-	switch {
-	case visualMode:
-		// Specialized sort to produce a more visually-interesting graph
-		g.Nodes.Sort(EntropyOrder)
-	case cum:
-		g.Nodes.Sort(CumNameOrder)
-	default:
-		g.Nodes.Sort(FlatNameOrder)
-	}
-}
-
-// SelectTopNodePtrs returns a set of the top maxNodes *Node in a graph.
-func (g *Graph) SelectTopNodePtrs(maxNodes int, visualMode bool) NodePtrSet {
-	set := make(NodePtrSet)
-	for _, node := range g.selectTopNodes(maxNodes, visualMode) {
-		set[node] = true
-	}
-	return set
-}
-
-// SelectTopNodes returns a set of the top maxNodes nodes in a graph.
-func (g *Graph) SelectTopNodes(maxNodes int, visualMode bool) NodeSet {
-	return makeNodeSet(g.selectTopNodes(maxNodes, visualMode), 0)
-}
-
-// selectTopNodes returns a slice of the top maxNodes nodes in a graph.
-func (g *Graph) selectTopNodes(maxNodes int, visualMode bool) Nodes {
-	if maxNodes > len(g.Nodes) {
-		maxNodes = len(g.Nodes)
-	}
-	return g.Nodes[:maxNodes]
-}
-
-// nodeSorter is a mechanism used to allow a report to be sorted
-// in different ways.
-type nodeSorter struct {
-	rs   Nodes
-	less func(l, r *Node) bool
-}
-
-func (s nodeSorter) Len() int           { return len(s.rs) }
-func (s nodeSorter) Swap(i, j int)      { s.rs[i], s.rs[j] = s.rs[j], s.rs[i] }
-func (s nodeSorter) Less(i, j int) bool { return s.less(s.rs[i], s.rs[j]) }
-
-// Sort reorders a slice of nodes based on the specified ordering
-// criteria. The result is sorted in decreasing order for (absolute)
-// numeric quantities, alphabetically for text, and increasing for
-// addresses.
-func (ns Nodes) Sort(o NodeOrder) error {
-	var s nodeSorter
-
-	switch o {
-	case FlatNameOrder:
-		s = nodeSorter{ns,
-			func(l, r *Node) bool {
-				if iv, jv := abs64(l.Flat), abs64(r.Flat); iv != jv {
-					return iv > jv
-				}
-				if iv, jv := l.Info.PrintableName(), r.Info.PrintableName(); iv != jv {
-					return iv < jv
-				}
-				if iv, jv := abs64(l.Cum), abs64(r.Cum); iv != jv {
-					return iv > jv
-				}
-				return compareNodes(l, r)
-			},
-		}
-	case FlatCumNameOrder:
-		s = nodeSorter{ns,
-			func(l, r *Node) bool {
-				if iv, jv := abs64(l.Flat), abs64(r.Flat); iv != jv {
-					return iv > jv
-				}
-				if iv, jv := abs64(l.Cum), abs64(r.Cum); iv != jv {
-					return iv > jv
-				}
-				if iv, jv := l.Info.PrintableName(), r.Info.PrintableName(); iv != jv {
-					return iv < jv
-				}
-				return compareNodes(l, r)
-			},
-		}
-	case NameOrder:
-		s = nodeSorter{ns,
-			func(l, r *Node) bool {
-				if iv, jv := l.Info.Name, r.Info.Name; iv != jv {
-					return iv < jv
-				}
-				return compareNodes(l, r)
-			},
-		}
-	case FileOrder:
-		s = nodeSorter{ns,
-			func(l, r *Node) bool {
-				if iv, jv := l.Info.StartLine, r.Info.StartLine; iv != jv {
-					return iv < jv
-				}
-				return compareNodes(l, r)
-			},
-		}
-	case AddressOrder:
-		s = nodeSorter{ns,
-			func(l, r *Node) bool {
-				if iv, jv := l.Info.Address, r.Info.Address; iv != jv {
-					return iv < jv
-				}
-				return compareNodes(l, r)
-			},
-		}
-	case CumNameOrder, EntropyOrder:
-		// Hold scoring for score-based ordering
-		var score map[*Node]int64
-		scoreOrder := func(l, r *Node) bool {
-			if iv, jv := abs64(score[l]), abs64(score[r]); iv != jv {
-				return iv > jv
-			}
-			if iv, jv := l.Info.PrintableName(), r.Info.PrintableName(); iv != jv {
-				return iv < jv
-			}
-			if iv, jv := abs64(l.Flat), abs64(r.Flat); iv != jv {
-				return iv > jv
-			}
-			return compareNodes(l, r)
-		}
-
-		switch o {
-		case CumNameOrder:
-			score = make(map[*Node]int64, len(ns))
-			for _, n := range ns {
-				score[n] = n.Cum
-			}
-			s = nodeSorter{ns, scoreOrder}
-		case EntropyOrder:
-			score = make(map[*Node]int64, len(ns))
-			for _, n := range ns {
-				score[n] = entropyScore(n)
-			}
-			s = nodeSorter{ns, scoreOrder}
-		}
-	default:
-		return fmt.Errorf("report: unrecognized sort ordering: %d", o)
-	}
-	sort.Sort(s)
-	return nil
-}
-
-// compareNodes compares two nodes to provide a deterministic ordering
-// between them. Two nodes cannot have the same Node.Info value.
-func compareNodes(l, r *Node) bool {
-	return fmt.Sprint(l.Info) < fmt.Sprint(r.Info)
-}
-
-// entropyScore computes a score for a node representing how important
-// it is to include this node on a graph visualization. It is used to
-// sort the nodes and select which ones to display if we have more
-// nodes than desired in the graph. This number is computed by looking
-// at the flat and cum weights of the node and the incoming/outgoing
-// edges. The fundamental idea is to penalize nodes that have a simple
-// fallthrough from their incoming to the outgoing edge.
-func entropyScore(n *Node) int64 {
-	score := float64(0)
-
-	if len(n.In) == 0 {
-		score++ // Favor entry nodes
-	} else {
-		score += edgeEntropyScore(n, n.In, 0)
-	}
-
-	if len(n.Out) == 0 {
-		score++ // Favor leaf nodes
-	} else {
-		score += edgeEntropyScore(n, n.Out, n.Flat)
-	}
-
-	return int64(score*float64(n.Cum)) + n.Flat
-}
-
-// edgeEntropyScore computes the entropy value for a set of edges
-// coming in or out of a node. Entropy (as defined in information
-// theory) refers to the amount of information encoded by the set of
-// edges. A set of edges that have a more interesting distribution of
-// samples gets a higher score.
-func edgeEntropyScore(n *Node, edges EdgeMap, self int64) float64 {
-	score := float64(0)
-	total := self
-	for _, e := range edges {
-		if e.Weight > 0 {
-			total += abs64(e.Weight)
-		}
-	}
-	if total != 0 {
-		for _, e := range edges {
-			frac := float64(abs64(e.Weight)) / float64(total)
-			score += -frac * math.Log2(frac)
-		}
-		if self > 0 {
-			frac := float64(abs64(self)) / float64(total)
-			score += -frac * math.Log2(frac)
-		}
-	}
-	return score
-}
-
-// NodeOrder sets the ordering for a Sort operation
-type NodeOrder int
-
-// Sorting options for node sort.
-const (
-	FlatNameOrder NodeOrder = iota
-	FlatCumNameOrder
-	CumNameOrder
-	NameOrder
-	FileOrder
-	AddressOrder
-	EntropyOrder
-)
-
-// Sort returns a slice of the edges in the map, in a consistent
-// order. The sort order is first based on the edge weight
-// (higher-to-lower) and then by the node names to avoid flakiness.
-func (e EdgeMap) Sort() []*Edge {
-	el := make(edgeList, 0, len(e))
-	for _, w := range e {
-		el = append(el, w)
-	}
-
-	sort.Sort(el)
-	return el
-}
-
-// Sum returns the total weight for a set of nodes.
-func (e EdgeMap) Sum() int64 {
-	var ret int64
-	for _, edge := range e {
-		ret += edge.Weight
-	}
-	return ret
-}
-
-type edgeList []*Edge
-
-func (el edgeList) Len() int {
-	return len(el)
-}
-
-func (el edgeList) Less(i, j int) bool {
-	if el[i].Weight != el[j].Weight {
-		return abs64(el[i].Weight) > abs64(el[j].Weight)
-	}
-
-	from1 := el[i].Src.Info.PrintableName()
-	from2 := el[j].Src.Info.PrintableName()
-	if from1 != from2 {
-		return from1 < from2
-	}
-
-	to1 := el[i].Dest.Info.PrintableName()
-	to2 := el[j].Dest.Info.PrintableName()
-
-	return to1 < to2
-}
-
-func (el edgeList) Swap(i, j int) {
-	el[i], el[j] = el[j], el[i]
-}
-
-func abs64(i int64) int64 {
-	if i < 0 {
-		return -i
-	}
-	return i
-}
diff --git a/src/cmd/compile/internal/pgo/internal/graph/graph.go b/src/cmd/compile/internal/pgo/internal/graph/graph.go
new file mode 100644
index 0000000..1275298
--- /dev/null
+++ b/src/cmd/compile/internal/pgo/internal/graph/graph.go
@@ -0,0 +1,520 @@
+// Copyright 2014 Google Inc. All Rights Reserved.
+//
+// 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.
+
+// Package graph represents a pprof profile as a directed graph.
+//
+// This package is a simplified fork of github.com/google/pprof/internal/graph.
+package graph
+
+import (
+	"fmt"
+	"internal/profile"
+	"sort"
+	"strings"
+)
+
+// Options encodes the options for constructing a graph
+type Options struct {
+	SampleValue       func(s []int64) int64 // Function to compute the value of a sample
+	SampleMeanDivisor func(s []int64) int64 // Function to compute the divisor for mean graphs, or nil
+
+	DropNegative bool // Drop nodes with overall negative values
+
+	KeptNodes NodeSet // If non-nil, only use nodes in this set
+}
+
+// Nodes is an ordered collection of graph nodes.
+type Nodes []*Node
+
+// Node is an entry on a profiling report. It represents a unique
+// program location.
+type Node struct {
+	// Info describes the source location associated to this node.
+	Info NodeInfo
+
+	// Function represents the function that this node belongs to. On
+	// graphs with sub-function resolution (eg line number or
+	// addresses), two nodes in a NodeMap that are part of the same
+	// function have the same value of Node.Function. If the Node
+	// represents the whole function, it points back to itself.
+	Function *Node
+
+	// Values associated to this node. Flat is exclusive to this node,
+	// Cum includes all descendents.
+	Flat, FlatDiv, Cum, CumDiv int64
+
+	// In and out Contains the nodes immediately reaching or reached by
+	// this node.
+	In, Out EdgeMap
+}
+
+// Graph summarizes a performance profile into a format that is
+// suitable for visualization.
+type Graph struct {
+	Nodes Nodes
+}
+
+// FlatValue returns the exclusive value for this node, computing the
+// mean if a divisor is available.
+func (n *Node) FlatValue() int64 {
+	if n.FlatDiv == 0 {
+		return n.Flat
+	}
+	return n.Flat / n.FlatDiv
+}
+
+// CumValue returns the inclusive value for this node, computing the
+// mean if a divisor is available.
+func (n *Node) CumValue() int64 {
+	if n.CumDiv == 0 {
+		return n.Cum
+	}
+	return n.Cum / n.CumDiv
+}
+
+// AddToEdge increases the weight of an edge between two nodes. If
+// there isn't such an edge one is created.
+func (n *Node) AddToEdge(to *Node, v int64, residual, inline bool) {
+	n.AddToEdgeDiv(to, 0, v, residual, inline)
+}
+
+// AddToEdgeDiv increases the weight of an edge between two nodes. If
+// there isn't such an edge one is created.
+func (n *Node) AddToEdgeDiv(to *Node, dv, v int64, residual, inline bool) {
+	if e := n.Out.FindTo(to); e != nil {
+		e.WeightDiv += dv
+		e.Weight += v
+		if residual {
+			e.Residual = true
+		}
+		if !inline {
+			e.Inline = false
+		}
+		return
+	}
+
+	info := &Edge{Src: n, Dest: to, WeightDiv: dv, Weight: v, Residual: residual, Inline: inline}
+	n.Out.Add(info)
+	to.In.Add(info)
+}
+
+// NodeInfo contains the attributes for a node.
+type NodeInfo struct {
+	Name              string
+	Address           uint64
+	StartLine, Lineno int
+}
+
+// PrintableName calls the Node's Formatter function with a single space separator.
+func (i *NodeInfo) PrintableName() string {
+	return strings.Join(i.NameComponents(), " ")
+}
+
+// NameComponents returns the components of the printable name to be used for a node.
+func (i *NodeInfo) NameComponents() []string {
+	var name []string
+	if i.Address != 0 {
+		name = append(name, fmt.Sprintf("%016x", i.Address))
+	}
+	if fun := i.Name; fun != "" {
+		name = append(name, fun)
+	}
+
+	switch {
+	case i.Lineno != 0:
+		// User requested line numbers, provide what we have.
+		name = append(name, fmt.Sprintf(":%d", i.Lineno))
+	case i.Name != "":
+		// User requested function name. It was already included.
+	default:
+		// Do not leave it empty if there is no information at all.
+		name = append(name, "<unknown>")
+	}
+	return name
+}
+
+// NodeMap maps from a node info struct to a node. It is used to merge
+// report entries with the same info.
+type NodeMap map[NodeInfo]*Node
+
+// NodeSet is a collection of node info structs.
+type NodeSet map[NodeInfo]bool
+
+// NodePtrSet is a collection of nodes. Trimming a graph or tree requires a set
+// of objects which uniquely identify the nodes to keep. In a graph, NodeInfo
+// works as a unique identifier; however, in a tree multiple nodes may share
+// identical NodeInfos. A *Node does uniquely identify a node so we can use that
+// instead. Though a *Node also uniquely identifies a node in a graph,
+// currently, during trimming, graphs are rebuilt from scratch using only the
+// NodeSet, so there would not be the required context of the initial graph to
+// allow for the use of *Node.
+type NodePtrSet map[*Node]bool
+
+// FindOrInsertNode takes the info for a node and either returns a matching node
+// from the node map if one exists, or adds one to the map if one does not.
+// If kept is non-nil, nodes are only added if they can be located on it.
+func (nm NodeMap) FindOrInsertNode(info NodeInfo, kept NodeSet) *Node {
+	if kept != nil {
+		if _, ok := kept[info]; !ok {
+			return nil
+		}
+	}
+
+	if n, ok := nm[info]; ok {
+		return n
+	}
+
+	n := &Node{
+		Info: info,
+	}
+	nm[info] = n
+	if info.Address == 0 && info.Lineno == 0 {
+		// This node represents the whole function, so point Function
+		// back to itself.
+		n.Function = n
+		return n
+	}
+	// Find a node that represents the whole function.
+	info.Address = 0
+	info.Lineno = 0
+	n.Function = nm.FindOrInsertNode(info, nil)
+	return n
+}
+
+// EdgeMap is used to represent the incoming/outgoing edges from a node.
+type EdgeMap []*Edge
+
+func (em EdgeMap) FindTo(n *Node) *Edge {
+	for _, e := range em {
+		if e.Dest == n {
+			return e
+		}
+	}
+	return nil
+}
+
+func (em *EdgeMap) Add(e *Edge) {
+	*em = append(*em, e)
+}
+
+func (em *EdgeMap) Delete(e *Edge) {
+	for i, edge := range *em {
+		if edge == e {
+			(*em)[i] = (*em)[len(*em)-1]
+			*em = (*em)[:len(*em)-1]
+			return
+		}
+	}
+}
+
+// Edge contains any attributes to be represented about edges in a graph.
+type Edge struct {
+	Src, Dest *Node
+	// The summary weight of the edge
+	Weight, WeightDiv int64
+
+	// residual edges connect nodes that were connected through a
+	// separate node, which has been removed from the report.
+	Residual bool
+	// An inline edge represents a call that was inlined into the caller.
+	Inline bool
+}
+
+// WeightValue returns the weight value for this edge, normalizing if a
+// divisor is available.
+func (e *Edge) WeightValue() int64 {
+	if e.WeightDiv == 0 {
+		return e.Weight
+	}
+	return e.Weight / e.WeightDiv
+}
+
+// NewGraph computes a graph from a profile.
+func NewGraph(prof *profile.Profile, o *Options) *Graph {
+	nodes, locationMap := CreateNodes(prof, o)
+	seenNode := make(map[*Node]bool)
+	seenEdge := make(map[nodePair]bool)
+	for _, sample := range prof.Sample {
+		var w, dw int64
+		w = o.SampleValue(sample.Value)
+		if o.SampleMeanDivisor != nil {
+			dw = o.SampleMeanDivisor(sample.Value)
+		}
+		if dw == 0 && w == 0 {
+			continue
+		}
+		for k := range seenNode {
+			delete(seenNode, k)
+		}
+		for k := range seenEdge {
+			delete(seenEdge, k)
+		}
+		var parent *Node
+		// A residual edge goes over one or more nodes that were not kept.
+		residual := false
+
+		// Group the sample frames, based on a global map.
+		// Count only the last two frames as a call edge. Frames higher up
+		// the stack are unlikely to be repeated calls (e.g. runtime.main
+		// calling main.main). So adding weights to call edges higher up
+		// the stack may be not reflecting the actual call edge weights
+		// in the program. Without a branch profile this is just an
+		// approximation.
+		i := 1
+		if last := len(sample.Location) - 1; last < i {
+			i = last
+		}
+		for ; i >= 0; i-- {
+			l := sample.Location[i]
+			locNodes := locationMap.get(l.ID)
+			for ni := len(locNodes) - 1; ni >= 0; ni-- {
+				n := locNodes[ni]
+				if n == nil {
+					residual = true
+					continue
+				}
+				// Add cum weight to all nodes in stack, avoiding double counting.
+				_, sawNode := seenNode[n]
+				if !sawNode {
+					seenNode[n] = true
+					n.addSample(dw, w, false)
+				}
+				// Update edge weights for all edges in stack, avoiding double counting.
+				if (!sawNode || !seenEdge[nodePair{n, parent}]) && parent != nil && n != parent {
+					seenEdge[nodePair{n, parent}] = true
+					parent.AddToEdgeDiv(n, dw, w, residual, ni != len(locNodes)-1)
+				}
+
+				parent = n
+				residual = false
+			}
+		}
+		if parent != nil && !residual {
+			// Add flat weight to leaf node.
+			parent.addSample(dw, w, true)
+		}
+	}
+
+	return selectNodesForGraph(nodes, o.DropNegative)
+}
+
+func selectNodesForGraph(nodes Nodes, dropNegative bool) *Graph {
+	// Collect nodes into a graph.
+	gNodes := make(Nodes, 0, len(nodes))
+	for _, n := range nodes {
+		if n == nil {
+			continue
+		}
+		if n.Cum == 0 && n.Flat == 0 {
+			continue
+		}
+		if dropNegative && isNegative(n) {
+			continue
+		}
+		gNodes = append(gNodes, n)
+	}
+	return &Graph{gNodes}
+}
+
+type nodePair struct {
+	src, dest *Node
+}
+
+// isNegative returns true if the node is considered as "negative" for the
+// purposes of drop_negative.
+func isNegative(n *Node) bool {
+	switch {
+	case n.Flat < 0:
+		return true
+	case n.Flat == 0 && n.Cum < 0:
+		return true
+	default:
+		return false
+	}
+}
+
+type locationMap struct {
+	s []Nodes          // a slice for small sequential IDs
+	m map[uint64]Nodes // fallback for large IDs (unlikely)
+}
+
+func (l *locationMap) add(id uint64, n Nodes) {
+	if id < uint64(len(l.s)) {
+		l.s[id] = n
+	} else {
+		l.m[id] = n
+	}
+}
+
+func (l locationMap) get(id uint64) Nodes {
+	if id < uint64(len(l.s)) {
+		return l.s[id]
+	} else {
+		return l.m[id]
+	}
+}
+
+// CreateNodes creates graph nodes for all locations in a profile. It
+// returns set of all nodes, plus a mapping of each location to the
+// set of corresponding nodes (one per location.Line).
+func CreateNodes(prof *profile.Profile, o *Options) (Nodes, locationMap) {
+	locations := locationMap{make([]Nodes, len(prof.Location)+1), make(map[uint64]Nodes)}
+	nm := make(NodeMap, len(prof.Location))
+	for _, l := range prof.Location {
+		lines := l.Line
+		if len(lines) == 0 {
+			lines = []profile.Line{{}} // Create empty line to include location info.
+		}
+		nodes := make(Nodes, len(lines))
+		for ln := range lines {
+			nodes[ln] = nm.findOrInsertLine(l, lines[ln], o)
+		}
+		locations.add(l.ID, nodes)
+	}
+	return nm.nodes(), locations
+}
+
+func (nm NodeMap) nodes() Nodes {
+	nodes := make(Nodes, 0, len(nm))
+	for _, n := range nm {
+		nodes = append(nodes, n)
+	}
+	return nodes
+}
+
+func (nm NodeMap) findOrInsertLine(l *profile.Location, li profile.Line, o *Options) *Node {
+	var objfile string
+	if m := l.Mapping; m != nil && m.File != "" {
+		objfile = m.File
+	}
+
+	if ni := nodeInfo(l, li, objfile, o); ni != nil {
+		return nm.FindOrInsertNode(*ni, o.KeptNodes)
+	}
+	return nil
+}
+
+func nodeInfo(l *profile.Location, line profile.Line, objfile string, o *Options) *NodeInfo {
+	if line.Function == nil {
+		return &NodeInfo{Address: l.Address}
+	}
+	ni := &NodeInfo{
+		Address: l.Address,
+		Lineno:  int(line.Line),
+		Name:    line.Function.Name,
+	}
+	ni.StartLine = int(line.Function.StartLine)
+	return ni
+}
+
+// Sum adds the flat and cum values of a set of nodes.
+func (ns Nodes) Sum() (flat int64, cum int64) {
+	for _, n := range ns {
+		flat += n.Flat
+		cum += n.Cum
+	}
+	return
+}
+
+func (n *Node) addSample(dw, w int64, flat bool) {
+	// Update sample value
+	if flat {
+		n.FlatDiv += dw
+		n.Flat += w
+	} else {
+		n.CumDiv += dw
+		n.Cum += w
+	}
+}
+
+// String returns a text representation of a graph, for debugging purposes.
+func (g *Graph) String() string {
+	var s []string
+
+	nodeIndex := make(map[*Node]int, len(g.Nodes))
+
+	for i, n := range g.Nodes {
+		nodeIndex[n] = i + 1
+	}
+
+	for i, n := range g.Nodes {
+		name := n.Info.PrintableName()
+		var in, out []int
+
+		for _, from := range n.In {
+			in = append(in, nodeIndex[from.Src])
+		}
+		for _, to := range n.Out {
+			out = append(out, nodeIndex[to.Dest])
+		}
+		s = append(s, fmt.Sprintf("%d: %s[flat=%d cum=%d] %x -> %v ", i+1, name, n.Flat, n.Cum, in, out))
+	}
+	return strings.Join(s, "\n")
+}
+
+// Sort returns a slice of the edges in the map, in a consistent
+// order. The sort order is first based on the edge weight
+// (higher-to-lower) and then by the node names to avoid flakiness.
+func (e EdgeMap) Sort() []*Edge {
+	el := make(edgeList, 0, len(e))
+	for _, w := range e {
+		el = append(el, w)
+	}
+
+	sort.Sort(el)
+	return el
+}
+
+// Sum returns the total weight for a set of nodes.
+func (e EdgeMap) Sum() int64 {
+	var ret int64
+	for _, edge := range e {
+		ret += edge.Weight
+	}
+	return ret
+}
+
+type edgeList []*Edge
+
+func (el edgeList) Len() int {
+	return len(el)
+}
+
+func (el edgeList) Less(i, j int) bool {
+	if el[i].Weight != el[j].Weight {
+		return abs64(el[i].Weight) > abs64(el[j].Weight)
+	}
+
+	from1 := el[i].Src.Info.PrintableName()
+	from2 := el[j].Src.Info.PrintableName()
+	if from1 != from2 {
+		return from1 < from2
+	}
+
+	to1 := el[i].Dest.Info.PrintableName()
+	to2 := el[j].Dest.Info.PrintableName()
+
+	return to1 < to2
+}
+
+func (el edgeList) Swap(i, j int) {
+	el[i], el[j] = el[j], el[i]
+}
+
+func abs64(i int64) int64 {
+	if i < 0 {
+		return -i
+	}
+	return i
+}
diff --git a/src/cmd/compile/internal/pgo/irgraph.go b/src/cmd/compile/internal/pgo/irgraph.go
index bb5df50..074f4a5 100644
--- a/src/cmd/compile/internal/pgo/irgraph.go
+++ b/src/cmd/compile/internal/pgo/irgraph.go
@@ -2,8 +2,6 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// WORK IN PROGRESS
-
 // A note on line numbers: when working with line numbers, we always use the
 // binary-visible relative line number. i.e., the line number as adjusted by
 // //line directives (ctxt.InnermostPos(ir.Node.Pos()).RelLine()). Use
@@ -45,37 +43,49 @@
 import (
 	"cmd/compile/internal/base"
 	"cmd/compile/internal/ir"
+	"cmd/compile/internal/pgo/internal/graph"
 	"cmd/compile/internal/typecheck"
 	"cmd/compile/internal/types"
 	"fmt"
 	"internal/profile"
-	"log"
 	"os"
 )
 
-// IRGraph is the key datastrcture that is built from profile. It is
-// essentially a call graph with nodes pointing to IRs of functions and edges
-// carrying weights and callsite information. The graph is bidirectional that
-// helps in removing nodes efficiently.
+// IRGraph is a call graph with nodes pointing to IRs of functions and edges
+// carrying weights and callsite information.
+//
+// Nodes for indirect calls may have missing IR (IRNode.AST == nil) if the node
+// is not visible from this package (e.g., not in the transitive deps). Keeping
+// these nodes allows determining the hottest edge from a call even if that
+// callee is not available.
+//
+// TODO(prattmic): Consider merging this data structure with Graph. This is
+// effectively a copy of Graph aggregated to line number and pointing to IR.
 type IRGraph struct {
 	// Nodes of the graph
-	IRNodes  map[string]*IRNode
-	OutEdges IREdgeMap
-	InEdges  IREdgeMap
+	IRNodes map[string]*IRNode
 }
 
-// IRNode represents a node in the IRGraph.
+// IRNode represents a node (function) in the IRGraph.
 type IRNode struct {
 	// Pointer to the IR of the Function represented by this node.
 	AST *ir.Func
-	// Flat weight of the IRNode, obtained from profile.
-	Flat int64
-	// Cumulative weight of the IRNode.
-	Cum int64
+	// Linker symbol name of the Function represented by this node.
+	// Populated only if AST == nil.
+	LinkerSymbolName string
+
+	// Set of out-edges in the callgraph. The map uniquely identifies each
+	// edge based on the callsite and callee, for fast lookup.
+	OutEdges map[NodeMapKey]*IREdge
 }
 
-// IREdgeMap maps an IRNode to its successors.
-type IREdgeMap map[*IRNode][]*IREdge
+// Name returns the symbol name of this function.
+func (i *IRNode) Name() string {
+	if i.AST != nil {
+		return ir.LinkFuncName(i.AST)
+	}
+	return i.LinkerSymbolName
+}
 
 // IREdge represents a call edge in the IRGraph with source, destination,
 // weight, callsite, and line number information.
@@ -88,6 +98,8 @@
 
 // NodeMapKey represents a hash key to identify unique call-edges in profile
 // and in IR. Used for deduplication of call edges found in profile.
+//
+// TODO(prattmic): rename to something more descriptive.
 type NodeMapKey struct {
 	CallerName     string
 	CalleeName     string
@@ -127,22 +139,20 @@
 }
 
 // New generates a profile-graph from the profile.
-func New(profileFile string) *Profile {
+func New(profileFile string) (*Profile, error) {
 	f, err := os.Open(profileFile)
 	if err != nil {
-		log.Fatal("failed to open file " + profileFile)
-		return nil
+		return nil, fmt.Errorf("error opening profile: %w", err)
 	}
 	defer f.Close()
 	profile, err := profile.Parse(f)
 	if err != nil {
-		log.Fatal("failed to Parse profile file.")
-		return nil
+		return nil, fmt.Errorf("error parsing profile: %w", err)
 	}
 
 	if len(profile.Sample) == 0 {
 		// We accept empty profiles, but there is nothing to do.
-		return nil
+		return nil, nil
 	}
 
 	valueIndex := -1
@@ -157,12 +167,10 @@
 	}
 
 	if valueIndex == -1 {
-		log.Fatal("failed to find CPU samples count or CPU nanoseconds value-types in profile.")
-		return nil
+		return nil, fmt.Errorf(`profile does not contain a sample index with value/type "samples/count" or cpu/nanoseconds"`)
 	}
 
-	g := newGraph(profile, &Options{
-		CallTree:    false,
+	g := graph.NewGraph(profile, &graph.Options{
 		SampleValue: func(v []int64) int64 { return v[valueIndex] },
 	})
 
@@ -174,14 +182,18 @@
 	}
 
 	// Build the node map and totals from the profile graph.
-	if !p.processprofileGraph(g) {
-		return nil
+	if err := p.processprofileGraph(g); err != nil {
+		return nil, err
+	}
+
+	if p.TotalNodeWeight == 0 || p.TotalEdgeWeight == 0 {
+		return nil, nil // accept but ignore profile with no samples.
 	}
 
 	// Create package-level call graph with weights from profile and IR.
 	p.initializeIRGraph()
 
-	return p
+	return p, nil
 }
 
 // processprofileGraph builds various maps from the profile-graph.
@@ -189,8 +201,9 @@
 // It initializes NodeMap and Total{Node,Edge}Weight based on the name and
 // callsite to compute node and edge weights which will be used later on to
 // create edges for WeightedCG.
-// Returns whether it successfully processed the profile.
-func (p *Profile) processprofileGraph(g *Graph) bool {
+//
+// Caller should ignore the profile if p.TotalNodeWeight == 0 || p.TotalEdgeWeight == 0.
+func (p *Profile) processprofileGraph(g *graph.Graph) error {
 	nFlat := make(map[string]int64)
 	nCum := make(map[string]int64)
 	seenStartLine := false
@@ -231,64 +244,62 @@
 	}
 
 	if p.TotalNodeWeight == 0 || p.TotalEdgeWeight == 0 {
-		return false // accept but ignore profile with no sample
+		return nil // accept but ignore profile with no samples.
 	}
 
 	if !seenStartLine {
-		// TODO(prattic): If Function.start_line is missing we could
+		// TODO(prattmic): If Function.start_line is missing we could
 		// fall back to using absolute line numbers, which is better
 		// than nothing.
-		log.Fatal("PGO profile missing Function.start_line data (Go version of profiled application too old? Go 1.20+ automatically adds this to profiles)")
+		return fmt.Errorf("profile missing Function.start_line data (Go version of profiled application too old? Go 1.20+ automatically adds this to profiles)")
 	}
 
-	return true
+	return nil
 }
 
-// initializeIRGraph builds the IRGraph by visting all the ir.Func in decl list
+// initializeIRGraph builds the IRGraph by visiting all the ir.Func in decl list
 // of a package.
 func (p *Profile) initializeIRGraph() {
 	// Bottomup walk over the function to create IRGraph.
 	ir.VisitFuncsBottomUp(typecheck.Target.Decls, func(list []*ir.Func, recursive bool) {
-		for _, n := range list {
-			p.VisitIR(n, recursive)
+		for _, fn := range list {
+			p.VisitIR(fn)
 		}
 	})
+
+	// Add additional edges for indirect calls. This must be done second so
+	// that IRNodes is fully populated (see the dummy node TODO in
+	// addIndirectEdges).
+	//
+	// TODO(prattmic): VisitIR above populates the graph via direct calls
+	// discovered via the IR. addIndirectEdges populates the graph via
+	// calls discovered via the profile. This combination of opposite
+	// approaches is a bit awkward, particularly because direct calls are
+	// discoverable via the profile as well. Unify these into a single
+	// approach.
+	p.addIndirectEdges()
 }
 
 // VisitIR traverses the body of each ir.Func and use NodeMap to determine if
 // we need to add an edge from ir.Func and any node in the ir.Func body.
-func (p *Profile) VisitIR(fn *ir.Func, recursive bool) {
+func (p *Profile) VisitIR(fn *ir.Func) {
 	g := p.WeightedCG
 
 	if g.IRNodes == nil {
 		g.IRNodes = make(map[string]*IRNode)
 	}
-	if g.OutEdges == nil {
-		g.OutEdges = make(map[*IRNode][]*IREdge)
-	}
-	if g.InEdges == nil {
-		g.InEdges = make(map[*IRNode][]*IREdge)
-	}
-	name := ir.PkgFuncName(fn)
-	node := new(IRNode)
-	node.AST = fn
-	if g.IRNodes[name] == nil {
+
+	name := ir.LinkFuncName(fn)
+	node, ok := g.IRNodes[name]
+	if !ok {
+		node = &IRNode{
+			AST: fn,
+		}
 		g.IRNodes[name] = node
 	}
-	// Create the key for the NodeMapKey.
-	nodeinfo := NodeMapKey{
-		CallerName:     name,
-		CalleeName:     "",
-		CallSiteOffset: 0,
-	}
-	// If the node exists, then update its node weight.
-	if weights, ok := p.NodeMap[nodeinfo]; ok {
-		g.IRNodes[name].Flat = weights.NFlat
-		g.IRNodes[name].Cum = weights.NCum
-	}
 
 	// Recursively walk over the body of the function to create IRGraph edges.
-	p.createIRGraphEdge(fn, g.IRNodes[name], name)
+	p.createIRGraphEdge(fn, node, name)
 }
 
 // NodeLineOffset returns the line offset of n in fn.
@@ -301,71 +312,137 @@
 
 // addIREdge adds an edge between caller and new node that points to `callee`
 // based on the profile-graph and NodeMap.
-func (p *Profile) addIREdge(caller *IRNode, callername string, call ir.Node, callee *ir.Func) {
+func (p *Profile) addIREdge(callerNode *IRNode, callerName string, call ir.Node, callee *ir.Func) {
 	g := p.WeightedCG
 
-	// Create an IRNode for the callee.
-	calleenode := new(IRNode)
-	calleenode.AST = callee
-	calleename := ir.PkgFuncName(callee)
+	calleeName := ir.LinkFuncName(callee)
+	calleeNode, ok := g.IRNodes[calleeName]
+	if !ok {
+		calleeNode = &IRNode{
+			AST: callee,
+		}
+		g.IRNodes[calleeName] = calleeNode
+	}
 
-	// Create key for NodeMapKey.
 	nodeinfo := NodeMapKey{
-		CallerName:     callername,
-		CalleeName:     calleename,
-		CallSiteOffset: NodeLineOffset(call, caller.AST),
+		CallerName:     callerName,
+		CalleeName:     calleeName,
+		CallSiteOffset: NodeLineOffset(call, callerNode.AST),
 	}
 
-	// Create the callee node with node weight.
-	if g.IRNodes[calleename] == nil {
-		g.IRNodes[calleename] = calleenode
-		nodeinfo2 := NodeMapKey{
-			CallerName:     calleename,
-			CalleeName:     "",
-			CallSiteOffset: 0,
-		}
-		if weights, ok := p.NodeMap[nodeinfo2]; ok {
-			g.IRNodes[calleename].Flat = weights.NFlat
-			g.IRNodes[calleename].Cum = weights.NCum
-		}
-	}
-
+	var weight int64
 	if weights, ok := p.NodeMap[nodeinfo]; ok {
-		caller.Flat = weights.NFlat
-		caller.Cum = weights.NCum
+		weight = weights.EWeight
+	}
 
-		// Add edge in the IRGraph from caller to callee.
-		info := &IREdge{Src: caller, Dst: g.IRNodes[calleename], Weight: weights.EWeight, CallSiteOffset: nodeinfo.CallSiteOffset}
-		g.OutEdges[caller] = append(g.OutEdges[caller], info)
-		g.InEdges[g.IRNodes[calleename]] = append(g.InEdges[g.IRNodes[calleename]], info)
-	} else {
-		nodeinfo.CalleeName = ""
-		nodeinfo.CallSiteOffset = 0
-		if weights, ok := p.NodeMap[nodeinfo]; ok {
-			caller.Flat = weights.NFlat
-			caller.Cum = weights.NCum
-			info := &IREdge{Src: caller, Dst: g.IRNodes[calleename], Weight: 0, CallSiteOffset: nodeinfo.CallSiteOffset}
-			g.OutEdges[caller] = append(g.OutEdges[caller], info)
-			g.InEdges[g.IRNodes[calleename]] = append(g.InEdges[g.IRNodes[calleename]], info)
-		} else {
-			info := &IREdge{Src: caller, Dst: g.IRNodes[calleename], Weight: 0, CallSiteOffset: nodeinfo.CallSiteOffset}
-			g.OutEdges[caller] = append(g.OutEdges[caller], info)
-			g.InEdges[g.IRNodes[calleename]] = append(g.InEdges[g.IRNodes[calleename]], info)
+	// Add edge in the IRGraph from caller to callee.
+	edge := &IREdge{
+		Src:            callerNode,
+		Dst:            calleeNode,
+		Weight:         weight,
+		CallSiteOffset: nodeinfo.CallSiteOffset,
+	}
+
+	if callerNode.OutEdges == nil {
+		callerNode.OutEdges = make(map[NodeMapKey]*IREdge)
+	}
+	callerNode.OutEdges[nodeinfo] = edge
+}
+
+// addIndirectEdges adds indirect call edges found in the profile to the graph,
+// to be used for devirtualization.
+//
+// targetDeclFuncs is the set of functions in typecheck.Target.Decls. Only
+// edges from these functions will be added.
+//
+// Devirtualization is only applied to typecheck.Target.Decls functions, so there
+// is no need to add edges from other functions.
+//
+// N.B. despite the name, addIndirectEdges will add any edges discovered via
+// the profile. We don't know for sure that they are indirect, but assume they
+// are since direct calls would already be added. (e.g., direct calls that have
+// been deleted from source since the profile was taken would be added here).
+//
+// TODO(prattmic): Devirtualization runs before inlining, so we can't devirtualize
+// calls inside inlined call bodies. If we did add that, we'd need edges from
+// inlined bodies as well.
+func (p *Profile) addIndirectEdges() {
+	g := p.WeightedCG
+
+	// g.IRNodes is populated with the set of functions in the local
+	// package build by VisitIR. We want to filter for local functions
+	// below, but we also add unknown callees to IRNodes as we go. So make
+	// an initial copy of IRNodes to recall just the local functions.
+	localNodes := make(map[string]*IRNode, len(g.IRNodes))
+	for k, v := range g.IRNodes {
+		localNodes[k] = v
+	}
+
+	for key, weights := range p.NodeMap {
+		// All callers in the local package build were added to IRNodes
+		// in VisitIR. If a caller isn't in the local package build we
+		// can skip adding edges, since we won't be devirtualizing in
+		// them anyway. This keeps the graph smaller.
+		callerNode, ok := localNodes[key.CallerName]
+		if !ok {
+			continue
 		}
+
+		// Already handled this edge?
+		if _, ok := callerNode.OutEdges[key]; ok {
+			continue
+		}
+
+		calleeNode, ok := g.IRNodes[key.CalleeName]
+		if !ok {
+			// IR is missing for this callee. Most likely this is
+			// because the callee isn't in the transitive deps of
+			// this package.
+			//
+			// Record this call anyway. If this is the hottest,
+			// then we want to skip devirtualization rather than
+			// devirtualizing to the second most common callee.
+			//
+			// TODO(prattmic): VisitIR populates IRNodes with all
+			// of the functions discovered via local package
+			// function declarations and calls. Thus we could miss
+			// functions that are available in export data of
+			// transitive deps, but aren't directly reachable. We
+			// need to do a lookup directly from package export
+			// data to get complete coverage.
+			calleeNode = &IRNode{
+				LinkerSymbolName: key.CalleeName,
+				// TODO: weights? We don't need them.
+			}
+			// Add dummy node back to IRNodes. We don't need this
+			// directly, but PrintWeightedCallGraphDOT uses these
+			// to print nodes.
+			g.IRNodes[key.CalleeName] = calleeNode
+		}
+		edge := &IREdge{
+			Src:            callerNode,
+			Dst:            calleeNode,
+			Weight:         weights.EWeight,
+			CallSiteOffset: key.CallSiteOffset,
+		}
+
+		if callerNode.OutEdges == nil {
+			callerNode.OutEdges = make(map[NodeMapKey]*IREdge)
+		}
+		callerNode.OutEdges[key] = edge
 	}
 }
 
-// createIRGraphEdge traverses the nodes in the body of ir.Func and add edges between callernode which points to the ir.Func and the nodes in the body.
+// createIRGraphEdge traverses the nodes in the body of ir.Func and adds edges
+// between the callernode which points to the ir.Func and the nodes in the
+// body.
 func (p *Profile) createIRGraphEdge(fn *ir.Func, callernode *IRNode, name string) {
-	var doNode func(ir.Node) bool
-	doNode = func(n ir.Node) bool {
+	ir.VisitList(fn.Body, func(n ir.Node) {
 		switch n.Op() {
-		default:
-			ir.DoChildren(n, doNode)
 		case ir.OCALLFUNC:
 			call := n.(*ir.CallExpr)
 			// Find the callee function from the call site and add the edge.
-			callee := inlCallee(call.X)
+			callee := DirectCallee(call.X)
 			if callee != nil {
 				p.addIREdge(callernode, name, n, callee)
 			}
@@ -375,9 +452,7 @@
 			callee := ir.MethodExprName(call.X).Func
 			p.addIREdge(callernode, name, n, callee)
 		}
-		return false
-	}
-	doNode(fn)
+	})
 }
 
 // WeightInPercentage converts profile weights to a percentage.
@@ -394,55 +469,65 @@
 	funcs := make(map[string]struct{})
 	ir.VisitFuncsBottomUp(typecheck.Target.Decls, func(list []*ir.Func, recursive bool) {
 		for _, f := range list {
-			name := ir.PkgFuncName(f)
+			name := ir.LinkFuncName(f)
 			funcs[name] = struct{}{}
 		}
 	})
 
 	// Determine nodes of DOT.
+	//
+	// Note that ir.Func may be nil for functions not visible from this
+	// package.
 	nodes := make(map[string]*ir.Func)
-	for name, _ := range funcs {
+	for name := range funcs {
 		if n, ok := p.WeightedCG.IRNodes[name]; ok {
-			for _, e := range p.WeightedCG.OutEdges[n] {
-				if _, ok := nodes[ir.PkgFuncName(e.Src.AST)]; !ok {
-					nodes[ir.PkgFuncName(e.Src.AST)] = e.Src.AST
+			for _, e := range n.OutEdges {
+				if _, ok := nodes[e.Src.Name()]; !ok {
+					nodes[e.Src.Name()] = e.Src.AST
 				}
-				if _, ok := nodes[ir.PkgFuncName(e.Dst.AST)]; !ok {
-					nodes[ir.PkgFuncName(e.Dst.AST)] = e.Dst.AST
+				if _, ok := nodes[e.Dst.Name()]; !ok {
+					nodes[e.Dst.Name()] = e.Dst.AST
 				}
 			}
-			if _, ok := nodes[ir.PkgFuncName(n.AST)]; !ok {
-				nodes[ir.PkgFuncName(n.AST)] = n.AST
+			if _, ok := nodes[n.Name()]; !ok {
+				nodes[n.Name()] = n.AST
 			}
 		}
 	}
 
 	// Print nodes.
 	for name, ast := range nodes {
-		if n, ok := p.WeightedCG.IRNodes[name]; ok {
-			nodeweight := WeightInPercentage(n.Flat, p.TotalNodeWeight)
-			color := "black"
-			if ast.Inl != nil {
-				fmt.Printf("\"%v\" [color=%v,label=\"%v,freq=%.2f,inl_cost=%d\"];\n", ir.PkgFuncName(ast), color, ir.PkgFuncName(ast), nodeweight, ast.Inl.Cost)
+		if _, ok := p.WeightedCG.IRNodes[name]; ok {
+			style := "solid"
+			if ast == nil {
+				style = "dashed"
+			}
+
+			if ast != nil && ast.Inl != nil {
+				fmt.Printf("\"%v\" [color=black, style=%s, label=\"%v,inl_cost=%d\"];\n", name, style, name, ast.Inl.Cost)
 			} else {
-				fmt.Printf("\"%v\" [color=%v, label=\"%v,freq=%.2f\"];\n", ir.PkgFuncName(ast), color, ir.PkgFuncName(ast), nodeweight)
+				fmt.Printf("\"%v\" [color=black, style=%s, label=\"%v\"];\n", name, style, name)
 			}
 		}
 	}
 	// Print edges.
 	ir.VisitFuncsBottomUp(typecheck.Target.Decls, func(list []*ir.Func, recursive bool) {
 		for _, f := range list {
-			name := ir.PkgFuncName(f)
+			name := ir.LinkFuncName(f)
 			if n, ok := p.WeightedCG.IRNodes[name]; ok {
-				for _, e := range p.WeightedCG.OutEdges[n] {
+				for _, e := range n.OutEdges {
+					style := "solid"
+					if e.Dst.AST == nil {
+						style = "dashed"
+					}
+					color := "black"
 					edgepercent := WeightInPercentage(e.Weight, p.TotalEdgeWeight)
 					if edgepercent > edgeThreshold {
-						fmt.Printf("edge [color=red, style=solid];\n")
-					} else {
-						fmt.Printf("edge [color=black, style=solid];\n")
+						color = "red"
 					}
 
-					fmt.Printf("\"%v\" -> \"%v\" [label=\"%.2f\"];\n", ir.PkgFuncName(n.AST), ir.PkgFuncName(e.Dst.AST), edgepercent)
+					fmt.Printf("edge [color=%s, style=%s];\n", color, style)
+					fmt.Printf("\"%v\" -> \"%v\" [label=\"%.2f\"];\n", n.Name(), e.Dst.Name(), edgepercent)
 				}
 			}
 		}
@@ -450,77 +535,11 @@
 	fmt.Printf("}\n")
 }
 
-// RedirectEdges deletes and redirects out-edges from node cur based on
-// inlining information via inlinedCallSites.
+// DirectCallee takes a function-typed expression and returns the underlying
+// function that it refers to if statically known. Otherwise, it returns nil.
 //
-// CallSiteInfo.Callee must be nil.
-func (p *Profile) RedirectEdges(cur *IRNode, inlinedCallSites map[CallSiteInfo]struct{}) {
-	g := p.WeightedCG
-
-	for i, outEdge := range g.OutEdges[cur] {
-		if _, found := inlinedCallSites[CallSiteInfo{LineOffset: outEdge.CallSiteOffset, Caller: cur.AST}]; !found {
-			for _, InEdge := range g.InEdges[cur] {
-				if _, ok := inlinedCallSites[CallSiteInfo{LineOffset: InEdge.CallSiteOffset, Caller: InEdge.Src.AST}]; ok {
-					weight := g.calculateWeight(InEdge.Src, cur)
-					g.redirectEdge(InEdge.Src, cur, outEdge, weight, i)
-				}
-			}
-		} else {
-			g.remove(cur, i)
-		}
-	}
-}
-
-// redirectEdges deletes the cur node out-edges and redirect them so now these
-// edges are the parent node out-edges.
-func (g *IRGraph) redirectEdges(parent *IRNode, cur *IRNode) {
-	for _, outEdge := range g.OutEdges[cur] {
-		outEdge.Src = parent
-		g.OutEdges[parent] = append(g.OutEdges[parent], outEdge)
-	}
-	delete(g.OutEdges, cur)
-}
-
-// redirectEdge deletes the cur-node's out-edges and redirect them so now these
-// edges are the parent node out-edges.
-func (g *IRGraph) redirectEdge(parent *IRNode, cur *IRNode, outEdge *IREdge, weight int64, idx int) {
-	outEdge.Src = parent
-	outEdge.Weight = weight * outEdge.Weight
-	g.OutEdges[parent] = append(g.OutEdges[parent], outEdge)
-	g.remove(cur, idx)
-}
-
-// remove deletes the cur-node's out-edges at index idx.
-func (g *IRGraph) remove(cur *IRNode, i int) {
-	if len(g.OutEdges[cur]) >= 2 {
-		g.OutEdges[cur][i] = g.OutEdges[cur][len(g.OutEdges[cur])-1]
-		g.OutEdges[cur] = g.OutEdges[cur][:len(g.OutEdges[cur])-1]
-	} else {
-		delete(g.OutEdges, cur)
-	}
-}
-
-// calculateWeight calculates the weight of the new redirected edge.
-func (g *IRGraph) calculateWeight(parent *IRNode, cur *IRNode) int64 {
-	sum := int64(0)
-	pw := int64(0)
-	for _, InEdge := range g.InEdges[cur] {
-		sum = sum + InEdge.Weight
-		if InEdge.Src == parent {
-			pw = InEdge.Weight
-		}
-	}
-	weight := int64(0)
-	if sum != 0 {
-		weight = pw / sum
-	} else {
-		weight = pw
-	}
-	return weight
-}
-
-// inlCallee is same as the implementation for inl.go with one change. The change is that we do not invoke CanInline on a closure.
-func inlCallee(fn ir.Node) *ir.Func {
+// Equivalent to inline.inlCallee without calling CanInline on closures.
+func DirectCallee(fn ir.Node) *ir.Func {
 	fn = ir.StaticValue(fn)
 	switch fn.Op() {
 	case ir.OMETHEXPR:
diff --git a/src/cmd/compile/internal/pkginit/init.go b/src/cmd/compile/internal/pkginit/init.go
index e13a7fb..edb0d6a 100644
--- a/src/cmd/compile/internal/pkginit/init.go
+++ b/src/cmd/compile/internal/pkginit/init.go
@@ -13,7 +13,10 @@
 	"cmd/compile/internal/typecheck"
 	"cmd/compile/internal/types"
 	"cmd/internal/obj"
+	"cmd/internal/objabi"
 	"cmd/internal/src"
+	"fmt"
+	"os"
 )
 
 // MakeInit creates a synthetic init function to handle any
@@ -36,10 +39,18 @@
 	}
 	fn.Dcl = append(fn.Dcl, typecheck.InitTodoFunc.Dcl...)
 	typecheck.InitTodoFunc.Dcl = nil
+	fn.SetIsPackageInit(true)
+
+	// Outline (if legal/profitable) global map inits.
+	newfuncs := []*ir.Func{}
+	nf, newfuncs = staticinit.OutlineMapInits(nf)
 
 	// Suppress useless "can inline" diagnostics.
 	// Init functions are only called dynamically.
 	fn.SetInlinabilityChecked(true)
+	for _, nfn := range newfuncs {
+		nfn.SetInlinabilityChecked(true)
+	}
 
 	fn.Body = nf
 	typecheck.FinishFuncBody()
@@ -49,6 +60,16 @@
 		typecheck.Stmts(nf)
 	})
 	typecheck.Target.Decls = append(typecheck.Target.Decls, fn)
+	if base.Debug.WrapGlobalMapDbg > 1 {
+		fmt.Fprintf(os.Stderr, "=-= len(newfuncs) is %d for %v\n",
+			len(newfuncs), fn)
+	}
+	for _, nfn := range newfuncs {
+		if base.Debug.WrapGlobalMapDbg > 1 {
+			fmt.Fprintf(os.Stderr, "=-= add to target.decls %v\n", nfn)
+		}
+		typecheck.Target.Decls = append(typecheck.Target.Decls, ir.Node(nfn))
+	}
 
 	// Prepend to Inits, so it runs first, before any user-declared init
 	// functions.
@@ -75,14 +96,14 @@
 
 	// Find imported packages with init tasks.
 	for _, pkg := range typecheck.Target.Imports {
-		n := typecheck.Resolve(ir.NewIdent(base.Pos, pkg.Lookup(".inittask")))
-		if n.Op() == ir.ONONAME {
+		n, ok := pkg.Lookup(".inittask").Def.(*ir.Name)
+		if !ok {
 			continue
 		}
-		if n.Op() != ir.ONAME || n.(*ir.Name).Class != ir.PEXTERN {
+		if n.Op() != ir.ONAME || n.Class != ir.PEXTERN {
 			base.Fatalf("bad inittask: %v", n)
 		}
-		deps = append(deps, n.(*ir.Name).Linksym())
+		deps = append(deps, n.Linksym())
 	}
 	if base.Flag.ASan {
 		// Make an initialization function to call runtime.asanregisterglobals to register an
@@ -109,21 +130,21 @@
 			name := noder.Renameinit()
 			fnInit := typecheck.DeclFunc(name, nil, nil, nil)
 
-			// Get an array of intrumented global variables.
+			// Get an array of instrumented global variables.
 			globals := instrumentGlobals(fnInit)
 
 			// Call runtime.asanregisterglobals function to poison redzones.
 			// runtime.asanregisterglobals(unsafe.Pointer(&globals[0]), ni)
 			asanf := typecheck.NewName(ir.Pkgs.Runtime.Lookup("asanregisterglobals"))
 			ir.MarkFunc(asanf)
-			asanf.SetType(types.NewSignature(types.NoPkg, nil, nil, []*types.Field{
+			asanf.SetType(types.NewSignature(nil, []*types.Field{
 				types.NewField(base.Pos, nil, types.Types[types.TUNSAFEPTR]),
 				types.NewField(base.Pos, nil, types.Types[types.TUINTPTR]),
 			}, nil))
 			asancall := ir.NewCallExpr(base.Pos, ir.OCALL, asanf, nil)
 			asancall.Args.Append(typecheck.ConvNop(typecheck.NodAddr(
-				ir.NewIndexExpr(base.Pos, globals, ir.NewInt(0))), types.Types[types.TUNSAFEPTR]))
-			asancall.Args.Append(typecheck.ConvNop(ir.NewInt(int64(ni)), types.Types[types.TUINTPTR]))
+				ir.NewIndexExpr(base.Pos, globals, ir.NewInt(base.Pos, 0))), types.Types[types.TUNSAFEPTR]))
+			asancall.Args.Append(typecheck.DefaultLit(ir.NewInt(base.Pos, int64(ni)), types.Types[types.TUINTPTR]))
 
 			fnInit.Body.Append(asancall)
 			typecheck.FinishFuncBody()
@@ -181,15 +202,20 @@
 	sym.Def = task
 	lsym := task.Linksym()
 	ot := 0
-	ot = objw.Uintptr(lsym, ot, 0) // state: not initialized yet
-	ot = objw.Uintptr(lsym, ot, uint64(len(deps)))
-	ot = objw.Uintptr(lsym, ot, uint64(len(fns)))
-	for _, d := range deps {
-		ot = objw.SymPtr(lsym, ot, d, 0)
-	}
+	ot = objw.Uint32(lsym, ot, 0) // state: not initialized yet
+	ot = objw.Uint32(lsym, ot, uint32(len(fns)))
 	for _, f := range fns {
 		ot = objw.SymPtr(lsym, ot, f, 0)
 	}
+
+	// Add relocations which tell the linker all of the packages
+	// that this package depends on (and thus, all of the packages
+	// that need to be initialized before this one).
+	for _, d := range deps {
+		r := obj.Addrel(lsym)
+		r.Type = objabi.R_INITORDER
+		r.Sym = d
+	}
 	// An initTask has pointers, but none into the Go heap.
 	// It's not quite read only, the state field must be modifiable.
 	objw.Global(lsym, int32(ot), obj.NOPTR)
diff --git a/src/cmd/compile/internal/pkginit/initAsanGlobals.go b/src/cmd/compile/internal/pkginit/initAsanGlobals.go
index 63aa361..ce26cbf 100644
--- a/src/cmd/compile/internal/pkginit/initAsanGlobals.go
+++ b/src/cmd/compile/internal/pkginit/initAsanGlobals.go
@@ -69,7 +69,7 @@
 	for i, n := range InstrumentGlobalsSlice {
 		setField := func(f string, val ir.Node, i int) {
 			r := ir.NewAssignStmt(base.Pos, ir.NewSelectorExpr(base.Pos, ir.ODOT,
-				ir.NewIndexExpr(base.Pos, globals, ir.NewInt(int64(i))), lname(f)), val)
+				ir.NewIndexExpr(base.Pos, globals, ir.NewInt(base.Pos, int64(i))), lname(f)), val)
 			init.Append(typecheck.Stmt(r))
 		}
 		// globals[i].beg = uintptr(unsafe.Pointer(&n))
@@ -79,19 +79,19 @@
 		// Assign globals[i].size.
 		g := n.(*ir.Name)
 		size := g.Type().Size()
-		c = tconv(ir.NewInt(size), types.Types[types.TUINTPTR])
+		c = typecheck.DefaultLit(ir.NewInt(base.Pos, size), types.Types[types.TUINTPTR])
 		setField("size", c, i)
 		// Assign globals[i].sizeWithRedzone.
 		rzSize := GetRedzoneSizeForGlobal(size)
 		sizeWithRz := rzSize + size
-		c = tconv(ir.NewInt(sizeWithRz), types.Types[types.TUINTPTR])
+		c = typecheck.DefaultLit(ir.NewInt(base.Pos, sizeWithRz), types.Types[types.TUINTPTR])
 		setField("sizeWithRedzone", c, i)
 		// The C string type is terminated by a null character "\0", Go should use three-digit
 		// octal "\000" or two-digit hexadecimal "\x00" to create null terminated string.
 		// asanName = symbol's linkname + "\000"
 		// globals[i].name = (*defString)(unsafe.Pointer(&asanName)).data
 		name := g.Linksym().Name
-		init.Append(typecheck.Stmt(ir.NewAssignStmt(base.Pos, asanName, ir.NewString(name+"\000"))))
+		init.Append(typecheck.Stmt(ir.NewAssignStmt(base.Pos, asanName, ir.NewString(base.Pos, name+"\000"))))
 		c = tconv(typecheck.NodAddr(asanName), types.Types[types.TUNSAFEPTR])
 		c = tconv(c, types.NewPtr(defStringstruct))
 		c = ir.NewSelectorExpr(base.Pos, ir.ODOT, c, lname("data"))
@@ -99,23 +99,23 @@
 
 		// Set the name of package being compiled as a unique identifier of a module.
 		// asanModulename = pkgName + "\000"
-		init.Append(typecheck.Stmt(ir.NewAssignStmt(base.Pos, asanModulename, ir.NewString(types.LocalPkg.Name+"\000"))))
+		init.Append(typecheck.Stmt(ir.NewAssignStmt(base.Pos, asanModulename, ir.NewString(base.Pos, types.LocalPkg.Name+"\000"))))
 		c = tconv(typecheck.NodAddr(asanModulename), types.Types[types.TUNSAFEPTR])
 		c = tconv(c, types.NewPtr(defStringstruct))
 		c = ir.NewSelectorExpr(base.Pos, ir.ODOT, c, lname("data"))
 		setField("moduleName", c, i)
 		// Assign asanL[i].filename, asanL[i].line, asanL[i].column
 		// and assign globals[i].location = uintptr(unsafe.Pointer(&asanL[i]))
-		asanLi := ir.NewIndexExpr(base.Pos, asanlocation, ir.NewInt(int64(i)))
-		filename := ir.NewString(base.Ctxt.PosTable.Pos(n.Pos()).Filename() + "\000")
+		asanLi := ir.NewIndexExpr(base.Pos, asanlocation, ir.NewInt(base.Pos, int64(i)))
+		filename := ir.NewString(base.Pos, base.Ctxt.PosTable.Pos(n.Pos()).Filename()+"\000")
 		init.Append(typecheck.Stmt(ir.NewAssignStmt(base.Pos, asanFilename, filename)))
 		c = tconv(typecheck.NodAddr(asanFilename), types.Types[types.TUNSAFEPTR])
 		c = tconv(c, types.NewPtr(defStringstruct))
 		c = ir.NewSelectorExpr(base.Pos, ir.ODOT, c, lname("data"))
 		init.Append(typecheck.Stmt(ir.NewAssignStmt(base.Pos, ir.NewSelectorExpr(base.Pos, ir.ODOT, asanLi, lname("filename")), c)))
-		line := ir.NewInt(int64(n.Pos().Line()))
+		line := ir.NewInt(base.Pos, int64(n.Pos().Line()))
 		init.Append(typecheck.Stmt(ir.NewAssignStmt(base.Pos, ir.NewSelectorExpr(base.Pos, ir.ODOT, asanLi, lname("line")), line)))
-		col := ir.NewInt(int64(n.Pos().Col()))
+		col := ir.NewInt(base.Pos, int64(n.Pos().Col()))
 		init.Append(typecheck.Stmt(ir.NewAssignStmt(base.Pos, ir.NewSelectorExpr(base.Pos, ir.ODOT, asanLi, lname("column")), col)))
 		c = tconv(typecheck.NodAddr(asanLi), types.Types[types.TUNSAFEPTR])
 		c = tconv(c, types.Types[types.TUINTPTR])
@@ -161,7 +161,7 @@
 	fname := typecheck.Lookup
 	nxp := src.NoXPos
 	nfield := types.NewField
-	asanGlobal := types.NewStruct(types.NoPkg, []*types.Field{
+	asanGlobal := types.NewStruct([]*types.Field{
 		nfield(nxp, fname("beg"), up),
 		nfield(nxp, fname("size"), up),
 		nfield(nxp, fname("sizeWithRedzone"), up),
@@ -173,14 +173,14 @@
 	})
 	types.CalcSize(asanGlobal)
 
-	asanLocation := types.NewStruct(types.NoPkg, []*types.Field{
+	asanLocation := types.NewStruct([]*types.Field{
 		nfield(nxp, fname("filename"), up),
 		nfield(nxp, fname("line"), i32),
 		nfield(nxp, fname("column"), i32),
 	})
 	types.CalcSize(asanLocation)
 
-	defString := types.NewStruct(types.NoPkg, []*types.Field{
+	defString := types.NewStruct([]*types.Field{
 		types.NewField(nxp, fname("data"), up),
 		types.NewField(nxp, fname("len"), up),
 	})
diff --git a/src/cmd/compile/internal/pkginit/initorder.go b/src/cmd/compile/internal/pkginit/initorder.go
index 426d298..9416470 100644
--- a/src/cmd/compile/internal/pkginit/initorder.go
+++ b/src/cmd/compile/internal/pkginit/initorder.go
@@ -7,6 +7,7 @@
 import (
 	"container/heap"
 	"fmt"
+	"internal/types/errors"
 	"strings"
 
 	"cmd/compile/internal/base"
@@ -243,7 +244,7 @@
 	}
 	fmt.Fprintf(&msg, "\t%v: %v", ir.Line(l[0]), l[0])
 
-	base.ErrorfAt(l[0].Pos(), msg.String())
+	base.ErrorfAt(l[0].Pos(), errors.InvalidInitCycle, msg.String())
 	base.ErrorExit()
 }
 
@@ -320,15 +321,6 @@
 		return
 	}
 
-	// Treat coverage counter variables effectively as invisible with
-	// respect to init order. If we don't do this, then the
-	// instrumentation vars can perturb the order of initialization
-	// away from the order of the original uninstrumented program.
-	// See issue #56293 for more details.
-	if n.CoverageCounter() || n.CoverageAuxVar() {
-		return
-	}
-
 	if d.seen.Has(n) {
 		return
 	}
diff --git a/src/cmd/compile/internal/ppc64/ssa.go b/src/cmd/compile/internal/ppc64/ssa.go
index d567a12..23df7ee 100644
--- a/src/cmd/compile/internal/ppc64/ssa.go
+++ b/src/cmd/compile/internal/ppc64/ssa.go
@@ -381,7 +381,7 @@
 		// If it is a Compare-and-Swap-Release operation, set the EH field with
 		// the release hint.
 		if v.AuxInt == 0 {
-			p0.SetFrom3Const(0)
+			p0.AddRestSourceConst(0)
 		}
 		// CMP reg1,reg2
 		p1 := s.Prog(cmp)
@@ -556,7 +556,7 @@
 		p := s.Prog(v.Op.Asm())
 		// clrlslwi ra,rs,mb,sh will become rlwinm ra,rs,sh,mb-sh,31-sh as described in ISA
 		p.From = obj.Addr{Type: obj.TYPE_CONST, Offset: ssa.GetPPC64Shiftmb(shifts)}
-		p.SetFrom3Const(ssa.GetPPC64Shiftsh(shifts))
+		p.AddRestSourceConst(ssa.GetPPC64Shiftsh(shifts))
 		p.Reg = r1
 		p.To.Type = obj.TYPE_REG
 		p.To.Reg = r
@@ -568,7 +568,7 @@
 		p := s.Prog(v.Op.Asm())
 		// clrlsldi ra,rs,mb,sh will become rldic ra,rs,sh,mb-sh
 		p.From = obj.Addr{Type: obj.TYPE_CONST, Offset: ssa.GetPPC64Shiftmb(shifts)}
-		p.SetFrom3Const(ssa.GetPPC64Shiftsh(shifts))
+		p.AddRestSourceConst(ssa.GetPPC64Shiftsh(shifts))
 		p.Reg = r1
 		p.To.Type = obj.TYPE_REG
 		p.To.Reg = r
@@ -580,7 +580,7 @@
 		shifts := v.AuxInt
 		p := s.Prog(v.Op.Asm())
 		p.From = obj.Addr{Type: obj.TYPE_CONST, Offset: ssa.GetPPC64Shiftsh(shifts)}
-		p.SetFrom3Const(ssa.GetPPC64Shiftmb(shifts))
+		p.AddRestSourceConst(ssa.GetPPC64Shiftmb(shifts))
 		p.Reg = r1
 		p.To.Type = obj.TYPE_REG
 		p.To.Reg = r
@@ -628,8 +628,7 @@
 		p.To = obj.Addr{Type: obj.TYPE_REG, Reg: v.Reg()}
 		p.Reg = v.Args[0].Reg()
 		p.From = obj.Addr{Type: obj.TYPE_CONST, Offset: int64(rot)}
-		p.SetRestArgs([]obj.Addr{{Type: obj.TYPE_CONST, Offset: mb}, {Type: obj.TYPE_CONST, Offset: me}})
-
+		p.AddRestSourceArgs([]obj.Addr{{Type: obj.TYPE_CONST, Offset: mb}, {Type: obj.TYPE_CONST, Offset: me}})
 		// Auxint holds mask
 	case ssa.OpPPC64RLWNM:
 		_, mb, me, _ := ssa.DecodePPC64RotateMask(v.AuxInt)
@@ -637,7 +636,7 @@
 		p.To = obj.Addr{Type: obj.TYPE_REG, Reg: v.Reg()}
 		p.Reg = v.Args[0].Reg()
 		p.From = obj.Addr{Type: obj.TYPE_REG, Reg: v.Args[1].Reg()}
-		p.SetRestArgs([]obj.Addr{{Type: obj.TYPE_CONST, Offset: mb}, {Type: obj.TYPE_CONST, Offset: me}})
+		p.AddRestSourceArgs([]obj.Addr{{Type: obj.TYPE_CONST, Offset: mb}, {Type: obj.TYPE_CONST, Offset: me}})
 
 	case ssa.OpPPC64MADDLD:
 		r := v.Reg()
@@ -649,7 +648,7 @@
 		p.From.Type = obj.TYPE_REG
 		p.From.Reg = r1
 		p.Reg = r2
-		p.SetFrom3Reg(r3)
+		p.AddRestSourceReg(r3)
 		p.To.Type = obj.TYPE_REG
 		p.To.Reg = r
 
@@ -663,14 +662,14 @@
 		p.From.Type = obj.TYPE_REG
 		p.From.Reg = r1
 		p.Reg = r3
-		p.SetFrom3Reg(r2)
+		p.AddRestSourceReg(r2)
 		p.To.Type = obj.TYPE_REG
 		p.To.Reg = r
 
 	case ssa.OpPPC64NEG, ssa.OpPPC64FNEG, ssa.OpPPC64FSQRT, ssa.OpPPC64FSQRTS, ssa.OpPPC64FFLOOR, ssa.OpPPC64FTRUNC, ssa.OpPPC64FCEIL,
 		ssa.OpPPC64FCTIDZ, ssa.OpPPC64FCTIWZ, ssa.OpPPC64FCFID, ssa.OpPPC64FCFIDS, ssa.OpPPC64FRSP, ssa.OpPPC64CNTLZD, ssa.OpPPC64CNTLZW,
 		ssa.OpPPC64POPCNTD, ssa.OpPPC64POPCNTW, ssa.OpPPC64POPCNTB, ssa.OpPPC64MFVSRD, ssa.OpPPC64MTVSRD, ssa.OpPPC64FABS, ssa.OpPPC64FNABS,
-		ssa.OpPPC64FROUND, ssa.OpPPC64CNTTZW, ssa.OpPPC64CNTTZD:
+		ssa.OpPPC64FROUND, ssa.OpPPC64CNTTZW, ssa.OpPPC64CNTTZD, ssa.OpPPC64BRH, ssa.OpPPC64BRW, ssa.OpPPC64BRD:
 		r := v.Reg()
 		p := s.Prog(v.Op.Asm())
 		p.To.Type = obj.TYPE_REG
@@ -717,7 +716,7 @@
 
 	case ssa.OpPPC64SUBCconst:
 		p := s.Prog(v.Op.Asm())
-		p.SetFrom3Const(v.AuxInt)
+		p.AddRestSourceConst(v.AuxInt)
 		p.From.Type = obj.TYPE_REG
 		p.From.Reg = v.Args[0].Reg()
 		p.To.Type = obj.TYPE_REG
@@ -725,7 +724,7 @@
 
 	case ssa.OpPPC64SUBFCconst:
 		p := s.Prog(v.Op.Asm())
-		p.SetFrom3Const(v.AuxInt)
+		p.AddRestSourceConst(v.AuxInt)
 		p.From.Type = obj.TYPE_REG
 		p.From.Reg = v.Args[0].Reg()
 		p.To.Type = obj.TYPE_REG
@@ -963,9 +962,8 @@
 		p.To.Type = obj.TYPE_MEM
 		p.To.Reg = v.Args[0].Reg()
 
-	case ssa.OpPPC64ISEL, ssa.OpPPC64ISELB, ssa.OpPPC64ISELZ:
+	case ssa.OpPPC64ISEL, ssa.OpPPC64ISELZ:
 		// ISEL  AuxInt ? arg0 : arg1
-		// ISELB is a special case of ISEL where AuxInt ? $1 (arg0) : $0.
 		// ISELZ is a special case of ISEL where arg1 is implicitly $0.
 		//
 		// AuxInt value indicates conditions 0=LT 1=GT 2=EQ 3=SO 4=GE 5=LE 6=NE 7=NSO.
@@ -974,24 +972,26 @@
 		//
 		// AuxInt&3 ? arg0 : arg1 for conditions LT, GT, EQ, SO
 		// AuxInt&3 ? arg1 : arg0 for conditions GE, LE, NE, NSO
-		p := s.Prog(ppc64.AISEL)
-		p.To.Type = obj.TYPE_REG
-		p.To.Reg = v.Reg()
-		// For ISELB/ISELZ Use R0 for 0 operand to avoid load.
-		r := obj.Addr{Type: obj.TYPE_REG, Reg: ppc64.REG_R0}
+		p := s.Prog(v.Op.Asm())
+		p.To = obj.Addr{Type: obj.TYPE_REG, Reg: v.Reg()}
+		p.Reg = v.Args[0].Reg()
 		if v.Op == ssa.OpPPC64ISEL {
-			r.Reg = v.Args[1].Reg()
+			p.AddRestSourceReg(v.Args[1].Reg())
+		} else {
+			p.AddRestSourceReg(ppc64.REG_R0)
 		}
 		// AuxInt values 4,5,6 implemented with reverse operand order from 0,1,2
 		if v.AuxInt > 3 {
-			p.Reg = r.Reg
-			p.SetFrom3Reg(v.Args[0].Reg())
-		} else {
-			p.Reg = v.Args[0].Reg()
-			p.SetFrom3(r)
+			p.Reg, p.GetFrom3().Reg = p.GetFrom3().Reg, p.Reg
 		}
-		p.From.Type = obj.TYPE_CONST
-		p.From.Offset = v.AuxInt & 3
+		p.From.SetConst(v.AuxInt & 3)
+
+	case ssa.OpPPC64SETBC, ssa.OpPPC64SETBCR:
+		p := s.Prog(v.Op.Asm())
+		p.To.Type = obj.TYPE_REG
+		p.To.Reg = v.Reg()
+		p.From.Type = obj.TYPE_REG
+		p.From.Reg = int16(ppc64.REG_CR0LT + v.AuxInt)
 
 	case ssa.OpPPC64LoweredQuadZero, ssa.OpPPC64LoweredQuadZeroShort:
 		// The LoweredQuad code generation
@@ -1867,9 +1867,9 @@
 		pp.From.Offset = ppc64.BO_ALWAYS
 		pp.Reg = ppc64.REG_CR0LT // The preferred value if BI is ignored.
 		pp.To.Reg = ppc64.REG_LR
-		pp.SetFrom3Const(1)
+		pp.AddRestSourceConst(1)
 
-		if base.Ctxt.Flag_shared {
+		if ppc64.NeedTOCpointer(base.Ctxt) {
 			// When compiling Go into PIC, the function we just
 			// called via pointer might have been implemented in
 			// a separate module and so overwritten the TOC
@@ -1886,7 +1886,8 @@
 		p := s.Prog(obj.ACALL)
 		p.To.Type = obj.TYPE_MEM
 		p.To.Name = obj.NAME_EXTERN
-		p.To.Sym = v.Aux.(*obj.LSym)
+		// AuxInt encodes how many buffer entries we need.
+		p.To.Sym = ir.Syms.GCWriteBarrier[v.AuxInt-1]
 
 	case ssa.OpPPC64LoweredPanicBoundsA, ssa.OpPPC64LoweredPanicBoundsB, ssa.OpPPC64LoweredPanicBoundsC:
 		p := s.Prog(obj.ACALL)
diff --git a/src/cmd/compile/internal/reflectdata/alg.go b/src/cmd/compile/internal/reflectdata/alg.go
index 8f0c4e8..69de685 100644
--- a/src/cmd/compile/internal/reflectdata/alg.go
+++ b/src/cmd/compile/internal/reflectdata/alg.go
@@ -14,6 +14,7 @@
 	"cmd/compile/internal/typecheck"
 	"cmd/compile/internal/types"
 	"cmd/internal/obj"
+	"cmd/internal/src"
 )
 
 // AlgType returns the fixed-width AMEMxx variants instead of the general
@@ -119,9 +120,24 @@
 		}
 	}
 
-	sym := TypeSymPrefix(".hash", t)
 	if base.Flag.LowerR != 0 {
-		fmt.Printf("genhash %v %v %v\n", closure, sym, t)
+		fmt.Printf("genhash %v %v\n", closure, t)
+	}
+
+	fn := hashFunc(t)
+
+	// Build closure. It doesn't close over any variables, so
+	// it contains just the function pointer.
+	objw.SymPtr(closure, 0, fn.Linksym(), 0)
+	objw.Global(closure, int32(types.PtrSize), obj.DUPOK|obj.RODATA)
+
+	return closure
+}
+
+func hashFunc(t *types.Type) *ir.Func {
+	sym := TypeSymPrefix(".hash", t)
+	if sym.Def != nil {
+		return sym.Def.(*ir.Name).Func
 	}
 
 	base.Pos = base.AutogeneratedPos // less confusing than end of input
@@ -135,6 +151,7 @@
 	results := []*ir.Field{ir.NewField(base.Pos, nil, types.Types[types.TUINTPTR])}
 
 	fn := typecheck.DeclFunc(sym, nil, args, results)
+	sym.Def = fn.Nname
 	np := ir.AsNode(fn.Type().Params().Field(0).Nname)
 	nh := ir.AsNode(fn.Type().Params().Field(1).Nname)
 
@@ -147,10 +164,10 @@
 
 		// for i := 0; i < nelem; i++
 		ni := typecheck.Temp(types.Types[types.TINT])
-		init := ir.NewAssignStmt(base.Pos, ni, ir.NewInt(0))
-		cond := ir.NewBinaryExpr(base.Pos, ir.OLT, ni, ir.NewInt(t.NumElem()))
-		post := ir.NewAssignStmt(base.Pos, ni, ir.NewBinaryExpr(base.Pos, ir.OADD, ni, ir.NewInt(1)))
-		loop := ir.NewForStmt(base.Pos, nil, cond, post, nil)
+		init := ir.NewAssignStmt(base.Pos, ni, ir.NewInt(base.Pos, 0))
+		cond := ir.NewBinaryExpr(base.Pos, ir.OLT, ni, ir.NewInt(base.Pos, t.NumElem()))
+		post := ir.NewAssignStmt(base.Pos, ni, ir.NewBinaryExpr(base.Pos, ir.OADD, ni, ir.NewInt(base.Pos, 1)))
+		loop := ir.NewForStmt(base.Pos, nil, cond, post, nil, false)
 		loop.PtrInit().Append(init)
 
 		// h = hashel(&p[i], h)
@@ -200,7 +217,7 @@
 			na := typecheck.NodAddr(nx)
 			call.Args.Append(na)
 			call.Args.Append(nh)
-			call.Args.Append(ir.NewInt(size))
+			call.Args.Append(ir.NewInt(base.Pos, size))
 			fn.Body.Append(ir.NewAssignStmt(base.Pos, nh, call))
 
 			i = next
@@ -220,61 +237,45 @@
 	fn.SetDupok(true)
 	typecheck.Func(fn)
 
-	ir.CurFunc = fn
-	typecheck.Stmts(fn.Body)
-	ir.CurFunc = nil
-
-	if base.Debug.DclStack != 0 {
-		types.CheckDclstack()
-	}
+	ir.WithFunc(fn, func() {
+		typecheck.Stmts(fn.Body)
+	})
 
 	fn.SetNilCheckDisabled(true)
 	typecheck.Target.Decls = append(typecheck.Target.Decls, fn)
 
-	// Build closure. It doesn't close over any variables, so
-	// it contains just the function pointer.
-	objw.SymPtr(closure, 0, fn.Linksym(), 0)
-	objw.Global(closure, int32(types.PtrSize), obj.DUPOK|obj.RODATA)
-
-	return closure
+	return fn
 }
 
-func hashfor(t *types.Type) ir.Node {
-	var sym *types.Sym
+func runtimeHashFor(name string, t *types.Type) *ir.Name {
+	n := typecheck.LookupRuntime(name)
+	n = typecheck.SubstArgTypes(n, t)
+	return n
+}
 
+// hashfor returns the function to compute the hash of a value of type t.
+func hashfor(t *types.Type) *ir.Name {
 	switch a, _ := types.AlgType(t); a {
 	case types.AMEM:
 		base.Fatalf("hashfor with AMEM type")
 	case types.AINTER:
-		sym = ir.Pkgs.Runtime.Lookup("interhash")
+		return runtimeHashFor("interhash", t)
 	case types.ANILINTER:
-		sym = ir.Pkgs.Runtime.Lookup("nilinterhash")
+		return runtimeHashFor("nilinterhash", t)
 	case types.ASTRING:
-		sym = ir.Pkgs.Runtime.Lookup("strhash")
+		return runtimeHashFor("strhash", t)
 	case types.AFLOAT32:
-		sym = ir.Pkgs.Runtime.Lookup("f32hash")
+		return runtimeHashFor("f32hash", t)
 	case types.AFLOAT64:
-		sym = ir.Pkgs.Runtime.Lookup("f64hash")
+		return runtimeHashFor("f64hash", t)
 	case types.ACPLX64:
-		sym = ir.Pkgs.Runtime.Lookup("c64hash")
+		return runtimeHashFor("c64hash", t)
 	case types.ACPLX128:
-		sym = ir.Pkgs.Runtime.Lookup("c128hash")
-	default:
-		// Note: the caller of hashfor ensured that this symbol
-		// exists and has a body by calling genhash for t.
-		sym = TypeSymPrefix(".hash", t)
+		return runtimeHashFor("c128hash", t)
 	}
 
-	// TODO(austin): This creates an ir.Name with a nil Func.
-	n := typecheck.NewName(sym)
-	ir.MarkFunc(n)
-	n.SetType(types.NewSignature(types.NoPkg, nil, nil, []*types.Field{
-		types.NewField(base.Pos, nil, types.NewPtr(t)),
-		types.NewField(base.Pos, nil, types.Types[types.TUINTPTR]),
-	}, []*types.Field{
-		types.NewField(base.Pos, nil, types.Types[types.TUINTPTR]),
-	}))
-	return n
+	fn := hashFunc(t)
+	return fn.Nname
 }
 
 // sysClosure returns a closure which will call the
@@ -346,13 +347,25 @@
 	if len(closure.P) > 0 { // already generated
 		return closure
 	}
-	sym := TypeSymPrefix(".eq", t)
+
 	if base.Flag.LowerR != 0 {
 		fmt.Printf("geneq %v\n", t)
 	}
 
-	// Autogenerate code for equality of structs and arrays.
+	fn := eqFunc(t)
 
+	// Generate a closure which points at the function we just generated.
+	objw.SymPtr(closure, 0, fn.Linksym(), 0)
+	objw.Global(closure, int32(types.PtrSize), obj.DUPOK|obj.RODATA)
+	return closure
+}
+
+func eqFunc(t *types.Type) *ir.Func {
+	// Autogenerate code for equality of structs and arrays.
+	sym := TypeSymPrefix(".eq", t)
+	if sym.Def != nil {
+		return sym.Def.(*ir.Name).Func
+	}
 	base.Pos = base.AutogeneratedPos // less confusing than end of input
 	typecheck.DeclContext = ir.PEXTERN
 
@@ -361,6 +374,7 @@
 		[]*ir.Field{ir.NewField(base.Pos, typecheck.Lookup("p"), types.NewPtr(t)), ir.NewField(base.Pos, typecheck.Lookup("q"), types.NewPtr(t))},
 		[]*ir.Field{ir.NewField(base.Pos, typecheck.Lookup("r"), types.Types[types.TBOOL])},
 	)
+	sym.Def = fn.Nname
 	np := ir.AsNode(fn.Type().Params().Field(0).Nname)
 	nq := ir.AsNode(fn.Type().Params().Field(1).Nname)
 	nr := ir.AsNode(fn.Type().Results().Field(0).Nname)
@@ -427,9 +441,9 @@
 				// Generate an unrolled for loop.
 				// for i := 0; i < nelem/unroll*unroll; i += unroll
 				i := typecheck.Temp(types.Types[types.TINT])
-				init := ir.NewAssignStmt(base.Pos, i, ir.NewInt(0))
-				cond := ir.NewBinaryExpr(base.Pos, ir.OLT, i, ir.NewInt(iterateTo))
-				loop := ir.NewForStmt(base.Pos, nil, cond, nil, nil)
+				init := ir.NewAssignStmt(base.Pos, i, ir.NewInt(base.Pos, 0))
+				cond := ir.NewBinaryExpr(base.Pos, ir.OLT, i, ir.NewInt(base.Pos, iterateTo))
+				loop := ir.NewForStmt(base.Pos, nil, cond, nil, nil, false)
 				loop.PtrInit().Append(init)
 
 				// if eq(p[i+0], q[i+0]) && eq(p[i+1], q[i+1]) && ... && eq(p[i+unroll-1], q[i+unroll-1]) {
@@ -441,7 +455,7 @@
 					nif := ir.NewIfStmt(base.Pos, checkIdx(i), nil, nil)
 					nif.Else.Append(ir.NewBranchStmt(base.Pos, ir.OGOTO, neq))
 					loop.Body.Append(nif)
-					post := ir.NewAssignStmt(base.Pos, i, ir.NewBinaryExpr(base.Pos, ir.OADD, i, ir.NewInt(1)))
+					post := ir.NewAssignStmt(base.Pos, i, ir.NewBinaryExpr(base.Pos, ir.OADD, i, ir.NewInt(base.Pos, 1)))
 					loop.Body.Append(post)
 				}
 
@@ -449,7 +463,7 @@
 
 				if nelem == iterateTo {
 					if last {
-						fn.Body.Append(ir.NewAssignStmt(base.Pos, nr, ir.NewBool(true)))
+						fn.Body.Append(ir.NewAssignStmt(base.Pos, nr, ir.NewBool(base.Pos, true)))
 					}
 					return
 				}
@@ -466,12 +480,12 @@
 			// }
 			for j := iterateTo; j < nelem; j++ {
 				// if check {} else { goto neq }
-				nif := ir.NewIfStmt(base.Pos, checkIdx(ir.NewInt(j)), nil, nil)
+				nif := ir.NewIfStmt(base.Pos, checkIdx(ir.NewInt(base.Pos, j)), nil, nil)
 				nif.Else.Append(ir.NewBranchStmt(base.Pos, ir.OGOTO, neq))
 				fn.Body.Append(nif)
 			}
 			if last {
-				fn.Body.Append(ir.NewAssignStmt(base.Pos, nr, checkIdx(ir.NewInt(nelem))))
+				fn.Body.Append(ir.NewAssignStmt(base.Pos, nr, checkIdx(ir.NewInt(base.Pos, nelem))))
 			}
 		}
 
@@ -494,7 +508,66 @@
 				// p[i] == q[i]
 				return ir.NewBinaryExpr(base.Pos, ir.OEQ, pi, qi)
 			})
-		// TODO: pick apart structs, do them piecemeal too
+		case types.TSTRUCT:
+			isCall := func(n ir.Node) bool {
+				return n.Op() == ir.OCALL || n.Op() == ir.OCALLFUNC
+			}
+			var expr ir.Node
+			var hasCallExprs bool
+			allCallExprs := true
+			and := func(cond ir.Node) {
+				if expr == nil {
+					expr = cond
+				} else {
+					expr = ir.NewLogicalExpr(base.Pos, ir.OANDAND, expr, cond)
+				}
+			}
+
+			var tmpPos src.XPos
+			pi := ir.NewIndexExpr(tmpPos, np, ir.NewInt(tmpPos, 0))
+			pi.SetBounded(true)
+			pi.SetType(t.Elem())
+			qi := ir.NewIndexExpr(tmpPos, nq, ir.NewInt(tmpPos, 0))
+			qi.SetBounded(true)
+			qi.SetType(t.Elem())
+			flatConds, canPanic := compare.EqStruct(t.Elem(), pi, qi)
+			for _, c := range flatConds {
+				if isCall(c) {
+					hasCallExprs = true
+				} else {
+					allCallExprs = false
+				}
+			}
+			if !hasCallExprs || allCallExprs || canPanic {
+				checkAll(1, true, func(pi, qi ir.Node) ir.Node {
+					// p[i] == q[i]
+					return ir.NewBinaryExpr(base.Pos, ir.OEQ, pi, qi)
+				})
+			} else {
+				checkAll(4, false, func(pi, qi ir.Node) ir.Node {
+					expr = nil
+					flatConds, _ := compare.EqStruct(t.Elem(), pi, qi)
+					if len(flatConds) == 0 {
+						return ir.NewBool(base.Pos, true)
+					}
+					for _, c := range flatConds {
+						if !isCall(c) {
+							and(c)
+						}
+					}
+					return expr
+				})
+				checkAll(2, true, func(pi, qi ir.Node) ir.Node {
+					expr = nil
+					flatConds, _ := compare.EqStruct(t.Elem(), pi, qi)
+					for _, c := range flatConds {
+						if isCall(c) {
+							and(c)
+						}
+					}
+					return expr
+				})
+			}
 		default:
 			checkAll(1, true, func(pi, qi ir.Node) ir.Node {
 				// p[i] == q[i]
@@ -503,9 +576,9 @@
 		}
 
 	case types.TSTRUCT:
-		flatConds := compare.EqStruct(t, np, nq)
+		flatConds, _ := compare.EqStruct(t, np, nq)
 		if len(flatConds) == 0 {
-			fn.Body.Append(ir.NewAssignStmt(base.Pos, nr, ir.NewBool(true)))
+			fn.Body.Append(ir.NewAssignStmt(base.Pos, nr, ir.NewBool(base.Pos, true)))
 		} else {
 			for _, c := range flatConds[:len(flatConds)-1] {
 				// if cond {} else { goto neq }
@@ -527,7 +600,7 @@
 	//   r = false
 	//   return (or goto ret)
 	fn.Body.Append(ir.NewLabelStmt(base.Pos, neq))
-	fn.Body.Append(ir.NewAssignStmt(base.Pos, nr, ir.NewBool(false)))
+	fn.Body.Append(ir.NewAssignStmt(base.Pos, nr, ir.NewBool(base.Pos, false)))
 	if compare.EqCanPanic(t) || anyCall(fn) {
 		// Epilogue is large, so share it with the equal case.
 		fn.Body.Append(ir.NewBranchStmt(base.Pos, ir.OGOTO, ret))
@@ -548,13 +621,9 @@
 	fn.SetDupok(true)
 	typecheck.Func(fn)
 
-	ir.CurFunc = fn
-	typecheck.Stmts(fn.Body)
-	ir.CurFunc = nil
-
-	if base.Debug.DclStack != 0 {
-		types.CheckDclstack()
-	}
+	ir.WithFunc(fn, func() {
+		typecheck.Stmts(fn.Body)
+	})
 
 	// Disable checknils while compiling this code.
 	// We are comparing a struct or an array,
@@ -562,11 +631,23 @@
 	// are shallow.
 	fn.SetNilCheckDisabled(true)
 	typecheck.Target.Decls = append(typecheck.Target.Decls, fn)
+	return fn
+}
 
-	// Generate a closure which points at the function we just generated.
-	objw.SymPtr(closure, 0, fn.Linksym(), 0)
-	objw.Global(closure, int32(types.PtrSize), obj.DUPOK|obj.RODATA)
-	return closure
+// EqFor returns ONAME node represents type t's equal function, and a boolean
+// to indicates whether a length needs to be passed when calling the function.
+func EqFor(t *types.Type) (ir.Node, bool) {
+	switch a, _ := types.AlgType(t); a {
+	case types.AMEM:
+		n := typecheck.LookupRuntime("memequal")
+		n = typecheck.SubstArgTypes(n, t, t)
+		return n, true
+	case types.ASPECIAL:
+		fn := eqFunc(t)
+		return fn.Nname, false
+	}
+	base.Fatalf("EqFor %v", t)
+	return nil, false
 }
 
 func anyCall(fn *ir.Func) bool {
@@ -578,17 +659,7 @@
 }
 
 func hashmem(t *types.Type) ir.Node {
-	sym := ir.Pkgs.Runtime.Lookup("memhash")
-
-	// TODO(austin): This creates an ir.Name with a nil Func.
-	n := typecheck.NewName(sym)
-	ir.MarkFunc(n)
-	n.SetType(types.NewSignature(types.NoPkg, nil, nil, []*types.Field{
-		types.NewField(base.Pos, nil, types.NewPtr(t)),
-		types.NewField(base.Pos, nil, types.Types[types.TUINTPTR]),
-		types.NewField(base.Pos, nil, types.Types[types.TUINTPTR]),
-	}, []*types.Field{
-		types.NewField(base.Pos, nil, types.Types[types.TUINTPTR]),
-	}))
+	n := typecheck.LookupRuntime("memhash")
+	n = typecheck.SubstArgTypes(n, t)
 	return n
 }
diff --git a/src/cmd/compile/internal/reflectdata/alg_test.go b/src/cmd/compile/internal/reflectdata/alg_test.go
index a1fc8c5..38fb974 100644
--- a/src/cmd/compile/internal/reflectdata/alg_test.go
+++ b/src/cmd/compile/internal/reflectdata/alg_test.go
@@ -4,7 +4,9 @@
 
 package reflectdata_test
 
-import "testing"
+import (
+	"testing"
+)
 
 func BenchmarkEqArrayOfStrings5(b *testing.B) {
 	var a [5]string
@@ -75,6 +77,56 @@
 	}
 }
 
+func BenchmarkEqArrayOfStructsEq(b *testing.B) {
+	type T2 struct {
+		a string
+		b int
+	}
+	const size = 1024
+	var (
+		str1 = "foobar"
+
+		a [size]T2
+		c [size]T2
+	)
+
+	for i := 0; i < size; i++ {
+		a[i].a = str1
+		c[i].a = str1
+	}
+
+	b.ResetTimer()
+	for j := 0; j < b.N; j++ {
+		_ = a == c
+	}
+}
+
+func BenchmarkEqArrayOfStructsNotEq(b *testing.B) {
+	type T2 struct {
+		a string
+		b int
+	}
+	const size = 1024
+	var (
+		str1 = "foobar"
+		str2 = "foobarz"
+
+		a [size]T2
+		c [size]T2
+	)
+
+	for i := 0; i < size; i++ {
+		a[i].a = str1
+		c[i].a = str1
+	}
+	c[len(c)-1].a = str2
+
+	b.ResetTimer()
+	for j := 0; j < b.N; j++ {
+		_ = a == c
+	}
+}
+
 const size = 16
 
 type T1 struct {
diff --git a/src/cmd/compile/internal/reflectdata/helpers.go b/src/cmd/compile/internal/reflectdata/helpers.go
index 99461cf..f2d69cd 100644
--- a/src/cmd/compile/internal/reflectdata/helpers.go
+++ b/src/cmd/compile/internal/reflectdata/helpers.go
@@ -21,7 +21,7 @@
 	// gets confused by implicit conversions. Also, because
 	// package-scope statements can never be generic, so they'll never
 	// require dictionary lookups.
-	if base.Debug.Unified != 0 && ir.CurFunc.Nname.Sym().Name != "init" {
+	if ir.CurFunc.Nname.Sym().Name != "init" {
 		ir.Dump("CurFunc", ir.CurFunc)
 		base.FatalfAt(n.Pos(), "missing %s in %v: %+v", fieldName, ir.CurFunc, n)
 	}
diff --git a/src/cmd/compile/internal/reflectdata/reflect.go b/src/cmd/compile/internal/reflectdata/reflect.go
index 9dcc0a0..6ef40cb 100644
--- a/src/cmd/compile/internal/reflectdata/reflect.go
+++ b/src/cmd/compile/internal/reflectdata/reflect.go
@@ -7,6 +7,7 @@
 import (
 	"encoding/binary"
 	"fmt"
+	"internal/abi"
 	"os"
 	"sort"
 	"strings"
@@ -15,8 +16,6 @@
 	"cmd/compile/internal/base"
 	"cmd/compile/internal/bitvec"
 	"cmd/compile/internal/compare"
-	"cmd/compile/internal/escape"
-	"cmd/compile/internal/inline"
 	"cmd/compile/internal/ir"
 	"cmd/compile/internal/objw"
 	"cmd/compile/internal/typebits"
@@ -65,21 +64,28 @@
 // we include only enough information to generate a correct GC
 // program for it.
 // Make sure this stays in sync with runtime/map.go.
+//
+//	A "bucket" is a "struct" {
+//	      tophash [BUCKETSIZE]uint8
+//	      keys [BUCKETSIZE]keyType
+//	      elems [BUCKETSIZE]elemType
+//	      overflow *bucket
+//	    }
 const (
-	BUCKETSIZE  = 8
-	MAXKEYSIZE  = 128
-	MAXELEMSIZE = 128
+	BUCKETSIZE  = abi.MapBucketCount
+	MAXKEYSIZE  = abi.MapMaxKeyBytes
+	MAXELEMSIZE = abi.MapMaxElemBytes
 )
 
-func structfieldSize() int { return 3 * types.PtrSize }       // Sizeof(runtime.structfield{})
-func imethodSize() int     { return 4 + 4 }                   // Sizeof(runtime.imethod{})
-func commonSize() int      { return 4*types.PtrSize + 8 + 8 } // Sizeof(runtime._type{})
+func structfieldSize() int { return abi.StructFieldSize(types.PtrSize) } // Sizeof(runtime.structfield{})
+func imethodSize() int     { return abi.IMethodSize(types.PtrSize) }     // Sizeof(runtime.imethod{})
+func commonSize() int      { return abi.CommonSize(types.PtrSize) }      // Sizeof(runtime._type{})
 
 func uncommonSize(t *types.Type) int { // Sizeof(runtime.uncommontype{})
 	if t.Sym() == nil && len(methods(t)) == 0 {
 		return 0
 	}
-	return 4 + 2 + 2 + 4 + 4
+	return int(abi.UncommonSize())
 }
 
 func makefield(name string, t *types.Type) *types.Field {
@@ -134,7 +140,7 @@
 	field = append(field, overflow)
 
 	// link up fields
-	bucket := types.NewStruct(types.NoPkg, field[:])
+	bucket := types.NewStruct(field[:])
 	bucket.SetNoalg(true)
 	types.CalcSize(bucket)
 
@@ -143,19 +149,19 @@
 		base.Fatalf("unsupported map key type for %v", t)
 	}
 	if BUCKETSIZE < 8 {
-		base.Fatalf("bucket size too small for proper alignment")
+		base.Fatalf("bucket size %d too small for proper alignment %d", BUCKETSIZE, 8)
 	}
 	if uint8(keytype.Alignment()) > BUCKETSIZE {
 		base.Fatalf("key align too big for %v", t)
 	}
 	if uint8(elemtype.Alignment()) > BUCKETSIZE {
-		base.Fatalf("elem align too big for %v", t)
+		base.Fatalf("elem align %d too big for %v, BUCKETSIZE=%d", elemtype.Alignment(), t, BUCKETSIZE)
 	}
 	if keytype.Size() > MAXKEYSIZE {
-		base.Fatalf("key size to large for %v", t)
+		base.Fatalf("key size too large for %v", t)
 	}
 	if elemtype.Size() > MAXELEMSIZE {
-		base.Fatalf("elem size to large for %v", t)
+		base.Fatalf("elem size too large for %v", t)
 	}
 	if t.Key().Size() > MAXKEYSIZE && !keytype.IsPtr() {
 		base.Fatalf("key indirect incorrect for %v", t)
@@ -185,7 +191,8 @@
 	// Double-check that overflow field is final memory in struct,
 	// with no padding at end.
 	if overflow.Offset != bucket.Size()-int64(types.PtrSize) {
-		base.Fatalf("bad offset of overflow in bmap for %v", t)
+		base.Fatalf("bad offset of overflow in bmap for %v, overflow.Offset=%d, bucket.Size()-int64(types.PtrSize)=%d",
+			t, overflow.Offset, bucket.Size()-int64(types.PtrSize))
 	}
 
 	t.MapType().Bucket = bucket
@@ -228,7 +235,7 @@
 		makefield("extra", types.Types[types.TUNSAFEPTR]),
 	}
 
-	hmap := types.NewStruct(types.NoPkg, fields)
+	hmap := types.NewStruct(fields)
 	hmap.SetNoalg(true)
 	types.CalcSize(hmap)
 
@@ -291,7 +298,7 @@
 	}
 
 	// build iterator struct holding the above fields
-	hiter := types.NewStruct(types.NoPkg, fields)
+	hiter := types.NewStruct(fields)
 	hiter.SetNoalg(true)
 	types.CalcSize(hiter)
 	if hiter.Size() != int64(12*types.PtrSize) {
@@ -664,20 +671,6 @@
 	types.TUNSAFEPTR:  objabi.KindUnsafePointer,
 }
 
-// tflag is documented in reflect/type.go.
-//
-// tflag values must be kept in sync with copies in:
-//   - cmd/compile/internal/reflectdata/reflect.go
-//   - cmd/link/internal/ld/decodesym.go
-//   - reflect/type.go
-//   - runtime/type.go
-const (
-	tflagUncommon      = 1 << 0
-	tflagExtraStar     = 1 << 1
-	tflagNamed         = 1 << 2
-	tflagRegularMemory = 1 << 3
-)
-
 var (
 	memhashvarlen  *obj.LSym
 	memequalvarlen *obj.LSym
@@ -721,15 +714,15 @@
 	ot = objw.Uintptr(lsym, ot, uint64(ptrdata))
 	ot = objw.Uint32(lsym, ot, types.TypeHash(t))
 
-	var tflag uint8
+	var tflag abi.TFlag
 	if uncommonSize(t) != 0 {
-		tflag |= tflagUncommon
+		tflag |= abi.TFlagUncommon
 	}
 	if t.Sym() != nil && t.Sym().Name != "" {
-		tflag |= tflagNamed
+		tflag |= abi.TFlagNamed
 	}
 	if compare.IsRegularMemory(t) {
-		tflag |= tflagRegularMemory
+		tflag |= abi.TFlagRegularMemory
 	}
 
 	exported := false
@@ -741,7 +734,7 @@
 	// amount of space taken up by reflect strings.
 	if !strings.HasPrefix(p, "*") {
 		p = "*" + p
-		tflag |= tflagExtraStar
+		tflag |= abi.TFlagExtraStar
 		if t.Sym() != nil {
 			exported = types.IsExported(t.Sym().Name)
 		}
@@ -751,7 +744,11 @@
 		}
 	}
 
-	ot = objw.Uint8(lsym, ot, tflag)
+	if tflag != abi.TFlag(uint8(tflag)) {
+		// this should optimize away completely
+		panic("Unexpected change in size of abi.TFlag")
+	}
+	ot = objw.Uint8(lsym, ot, uint8(tflag))
 
 	// runtime (and common sense) expects alignment to be a power of two.
 	i := int(uint8(t.Alignment()))
@@ -838,7 +835,14 @@
 }
 
 func TypeLinksym(t *types.Type) *obj.LSym {
-	return TypeSym(t).Linksym()
+	lsym := TypeSym(t).Linksym()
+	signatmu.Lock()
+	if lsym.Extra == nil {
+		ti := lsym.NewTypeInfo()
+		ti.Type = t
+	}
+	signatmu.Unlock()
+	return lsym
 }
 
 // Deprecated: Use TypePtrAt instead.
@@ -953,7 +957,7 @@
 
 func writeType(t *types.Type) *obj.LSym {
 	t = formalType(t)
-	if t.IsUntyped() || t.HasTParam() {
+	if t.IsUntyped() {
 		base.Fatalf("writeType %v", t)
 	}
 
@@ -1254,11 +1258,6 @@
 
 // NeedRuntimeType ensures that a runtime type descriptor is emitted for t.
 func NeedRuntimeType(t *types.Type) {
-	if t.HasTParam() {
-		// Generic types don't really exist at run-time and have no runtime
-		// type descriptor.  But we do write out shape types.
-		return
-	}
 	if _, ok := signatset[t]; !ok {
 		signatset[t] = struct{}{}
 		signatslice = append(signatslice, typeAndStr{t: t, short: types.TypeSymName(t), regular: t.String()})
@@ -1401,7 +1400,7 @@
 	if typ.Sym() == nil && typ.Kind() == types.TFUNC {
 		f := typ.FuncType()
 		// func(error) string
-		if f.Receiver.NumFields() == 0 && f.TParams.NumFields() == 0 &&
+		if f.Receiver.NumFields() == 0 &&
 			f.Params.NumFields() == 1 && f.Results.NumFields() == 1 &&
 			f.Params.FieldType(0) == types.ErrorType &&
 			f.Results.FieldType(0) == types.Types[types.TSTRING] {
@@ -1450,7 +1449,7 @@
 
 		// emit type for func(error) string,
 		// which is the type of an auto-generated wrapper.
-		writeType(types.NewPtr(types.NewSignature(types.NoPkg, nil, nil, []*types.Field{
+		writeType(types.NewPtr(types.NewSignature(nil, []*types.Field{
 			types.NewField(base.Pos, nil, types.ErrorType),
 		}, []*types.Field{
 			types.NewField(base.Pos, nil, types.Types[types.TSTRING]),
@@ -1775,9 +1774,6 @@
 		if s.Pkg.Name != "main" {
 			continue
 		}
-		if n.Type().HasTParam() {
-			continue // skip generic functions (#52937)
-		}
 		ptabs = append(ptabs, n)
 	}
 }
@@ -1860,208 +1856,17 @@
 //
 // These wrappers are always fully stenciled.
 func methodWrapper(rcvr *types.Type, method *types.Field, forItab bool) *obj.LSym {
-	orig := rcvr
 	if forItab && !types.IsDirectIface(rcvr) {
 		rcvr = rcvr.PtrTo()
 	}
 
-	generic := false
-	// We don't need a dictionary if we are reaching a method (possibly via an
-	// embedded field) which is an interface method.
-	if !types.IsInterfaceMethod(method.Type) {
-		rcvr1 := deref(rcvr)
-		if len(rcvr1.RParams()) > 0 {
-			// If rcvr has rparams, remember method as generic, which
-			// means we need to add a dictionary to the wrapper.
-			generic = true
-			if rcvr.HasShape() {
-				base.Fatalf("method on type instantiated with shapes, rcvr:%+v", rcvr)
-			}
-		}
-	}
-
 	newnam := ir.MethodSym(rcvr, method.Sym)
 	lsym := newnam.Linksym()
 
 	// Unified IR creates its own wrappers.
-	if base.Debug.Unified != 0 {
-		return lsym
-	}
-
-	if newnam.Siggen() {
-		return lsym
-	}
-	newnam.SetSiggen(true)
-
-	methodrcvr := method.Type.Recv().Type
-	// For generic methods, we need to generate the wrapper even if the receiver
-	// types are identical, because we want to add the dictionary.
-	if !generic && types.Identical(rcvr, methodrcvr) {
-		return lsym
-	}
-
-	if !NeedEmit(rcvr) || rcvr.IsPtr() && !NeedEmit(rcvr.Elem()) {
-		return lsym
-	}
-
-	base.Pos = base.AutogeneratedPos
-	typecheck.DeclContext = ir.PEXTERN
-
-	// TODO(austin): SelectorExpr may have created one or more
-	// ir.Names for these already with a nil Func field. We should
-	// consolidate these and always attach a Func to the Name.
-	fn := typecheck.DeclFunc(newnam, ir.NewField(base.Pos, typecheck.Lookup(".this"), rcvr),
-		typecheck.NewFuncParams(method.Type.Params(), true),
-		typecheck.NewFuncParams(method.Type.Results(), false))
-
-	fn.SetDupok(true)
-
-	nthis := ir.AsNode(fn.Type().Recv().Nname)
-
-	indirect := rcvr.IsPtr() && rcvr.Elem() == methodrcvr
-
-	// generate nil pointer check for better error
-	if indirect {
-		// generating wrapper from *T to T.
-		n := ir.NewIfStmt(base.Pos, nil, nil, nil)
-		n.Cond = ir.NewBinaryExpr(base.Pos, ir.OEQ, nthis, typecheck.NodNil())
-		call := ir.NewCallExpr(base.Pos, ir.OCALL, typecheck.LookupRuntime("panicwrap"), nil)
-		n.Body = []ir.Node{call}
-		fn.Body.Append(n)
-	}
-
-	dot := typecheck.AddImplicitDots(ir.NewSelectorExpr(base.Pos, ir.OXDOT, nthis, method.Sym))
-	// generate call
-	// It's not possible to use a tail call when dynamic linking on ppc64le. The
-	// bad scenario is when a local call is made to the wrapper: the wrapper will
-	// call the implementation, which might be in a different module and so set
-	// the TOC to the appropriate value for that module. But if it returns
-	// directly to the wrapper's caller, nothing will reset it to the correct
-	// value for that function.
-	var call *ir.CallExpr
-	if !base.Flag.Cfg.Instrumenting && rcvr.IsPtr() && methodrcvr.IsPtr() && method.Embedded != 0 && !types.IsInterfaceMethod(method.Type) && !(base.Ctxt.Arch.Name == "ppc64le" && base.Ctxt.Flag_dynlink) && !generic {
-		call = ir.NewCallExpr(base.Pos, ir.OCALL, dot, nil)
-		call.Args = ir.ParamNames(fn.Type())
-		call.IsDDD = fn.Type().IsVariadic()
-		fn.Body.Append(ir.NewTailCallStmt(base.Pos, call))
-	} else {
-		fn.SetWrapper(true) // ignore frame for panic+recover matching
-
-		if generic && dot.X != nthis {
-			// If there is embedding involved, then we should do the
-			// normal non-generic embedding wrapper below, which calls
-			// the wrapper for the real receiver type using dot as an
-			// argument. There is no need for generic processing (adding
-			// a dictionary) for this wrapper.
-			generic = false
-		}
-
-		if generic {
-			targs := deref(rcvr).RParams()
-			// The wrapper for an auto-generated pointer/non-pointer
-			// receiver method should share the same dictionary as the
-			// corresponding original (user-written) method.
-			baseOrig := orig
-			if baseOrig.IsPtr() && !methodrcvr.IsPtr() {
-				baseOrig = baseOrig.Elem()
-			} else if !baseOrig.IsPtr() && methodrcvr.IsPtr() {
-				baseOrig = types.NewPtr(baseOrig)
-			}
-			args := []ir.Node{getDictionary(ir.MethodSym(baseOrig, method.Sym), targs)}
-			if indirect {
-				args = append(args, ir.NewStarExpr(base.Pos, dot.X))
-			} else if methodrcvr.IsPtr() && methodrcvr.Elem() == dot.X.Type() {
-				// Case where method call is via a non-pointer
-				// embedded field with a pointer method.
-				args = append(args, typecheck.NodAddrAt(base.Pos, dot.X))
-			} else {
-				args = append(args, dot.X)
-			}
-			args = append(args, ir.ParamNames(fn.Type())...)
-
-			// Target method uses shaped names.
-			targs2 := make([]*types.Type, len(targs))
-			origRParams := deref(orig).OrigType().RParams()
-			for i, t := range targs {
-				targs2[i] = typecheck.Shapify(t, i, origRParams[i])
-			}
-			targs = targs2
-
-			sym := typecheck.MakeFuncInstSym(ir.MethodSym(methodrcvr, method.Sym), targs, false, true)
-			if sym.Def == nil {
-				// Currently we make sure that we have all the
-				// instantiations we need by generating them all in
-				// ../noder/stencil.go:instantiateMethods
-				// Extra instantiations because of an inlined function
-				// should have been exported, and so available via
-				// Resolve.
-				in := typecheck.Resolve(ir.NewIdent(src.NoXPos, sym))
-				if in.Op() == ir.ONONAME {
-					base.Fatalf("instantiation %s not found", sym.Name)
-				}
-				sym = in.Sym()
-			}
-			target := ir.AsNode(sym.Def)
-			call = ir.NewCallExpr(base.Pos, ir.OCALL, target, args)
-			// Fill-in the generic method node that was not filled in
-			// in instantiateMethod.
-			method.Nname = fn.Nname
-		} else {
-			call = ir.NewCallExpr(base.Pos, ir.OCALL, dot, nil)
-			call.Args = ir.ParamNames(fn.Type())
-		}
-		call.IsDDD = fn.Type().IsVariadic()
-		if method.Type.NumResults() > 0 {
-			ret := ir.NewReturnStmt(base.Pos, nil)
-			ret.Results = []ir.Node{call}
-			fn.Body.Append(ret)
-		} else {
-			fn.Body.Append(call)
-		}
-	}
-
-	typecheck.FinishFuncBody()
-	if base.Debug.DclStack != 0 {
-		types.CheckDclstack()
-	}
-
-	typecheck.Func(fn)
-	ir.CurFunc = fn
-	typecheck.Stmts(fn.Body)
-
-	if AfterGlobalEscapeAnalysis {
-		// Inlining the method may reveal closures, which require walking all function bodies
-		// to decide whether to capture free variables by value or by ref. So we only do inline
-		// if the method do not contain any closures, otherwise, the escape analysis may make
-		// dead variables resurrected, and causing liveness analysis confused, see issue #53702.
-		var canInline bool
-		switch x := call.X.(type) {
-		case *ir.Name:
-			canInline = len(x.Func.Closures) == 0
-		case *ir.SelectorExpr:
-			if x.Op() == ir.OMETHEXPR {
-				canInline = x.FuncName().Func != nil && len(x.FuncName().Func.Closures) == 0
-			}
-		}
-		if canInline {
-			// TODO(prattmic): plumb PGO.
-			inline.InlineCalls(fn, nil)
-		}
-		escape.Batch([]*ir.Func{fn}, false)
-	}
-
-	ir.CurFunc = nil
-	typecheck.Target.Decls = append(typecheck.Target.Decls, fn)
-
 	return lsym
 }
 
-// AfterGlobalEscapeAnalysis tracks whether package gc has already
-// performed the main, global escape analysis pass. If so,
-// methodWrapper takes responsibility for escape analyzing any
-// generated wrappers.
-var AfterGlobalEscapeAnalysis bool
-
 var ZeroSize int64
 
 // MarkTypeUsedInInterface marks that type t is converted to an interface.
@@ -2071,7 +1876,9 @@
 		// Shape types shouldn't be put in interfaces, so we shouldn't ever get here.
 		base.Fatalf("shape types have no methods %+v", t)
 	}
-	tsym := TypeLinksym(t)
+	MarkTypeSymUsedInInterface(TypeLinksym(t), from)
+}
+func MarkTypeSymUsedInInterface(tsym *obj.LSym, from *obj.LSym) {
 	// Emit a marker relocation. The linker will know the type is converted
 	// to an interface if "from" is reachable.
 	r := obj.Addrel(from)
@@ -2133,53 +1940,6 @@
 	r.Type = objabi.R_USEIFACEMETHOD
 }
 
-// getDictionary returns the dictionary for the given named generic function
-// or method, with the given type arguments.
-func getDictionary(gf *types.Sym, targs []*types.Type) ir.Node {
-	if len(targs) == 0 {
-		base.Fatalf("%s should have type arguments", gf.Name)
-	}
-	for _, t := range targs {
-		if t.HasShape() {
-			base.Fatalf("dictionary for %s should only use concrete types: %+v", gf.Name, t)
-		}
-	}
-
-	sym := typecheck.MakeDictSym(gf, targs, true)
-
-	// Dictionary should already have been generated by instantiateMethods().
-	// Extra dictionaries needed because of an inlined function should have been
-	// exported, and so available via Resolve.
-	if lsym := sym.Linksym(); len(lsym.P) == 0 {
-		in := typecheck.Resolve(ir.NewIdent(src.NoXPos, sym))
-		if in.Op() == ir.ONONAME {
-			base.Fatalf("Dictionary should have already been generated: %s.%s", sym.Pkg.Path, sym.Name)
-		}
-		sym = in.Sym()
-	}
-
-	// Make (or reuse) a node referencing the dictionary symbol.
-	var n *ir.Name
-	if sym.Def != nil {
-		n = sym.Def.(*ir.Name)
-	} else {
-		n = typecheck.NewName(sym)
-		n.SetType(types.Types[types.TUINTPTR]) // should probably be [...]uintptr, but doesn't really matter
-		n.SetTypecheck(1)
-		n.Class = ir.PEXTERN
-		sym.Def = n
-	}
-
-	// Return the address of the dictionary.
-	np := typecheck.NodAddr(n)
-	// Note: treat dictionary pointers as uintptrs, so they aren't pointers
-	// with respect to GC. That saves on stack scanning work, write barriers, etc.
-	// We can get away with it because dictionaries are global variables.
-	np.SetType(types.Types[types.TUINTPTR])
-	np.SetTypecheck(1)
-	return np
-}
-
 func deref(t *types.Type) *types.Type {
 	if t.IsPtr() {
 		return t.Elem()
diff --git a/src/cmd/compile/internal/riscv64/ssa.go b/src/cmd/compile/internal/riscv64/ssa.go
index 984779f..2eb1e7f 100644
--- a/src/cmd/compile/internal/riscv64/ssa.go
+++ b/src/cmd/compile/internal/riscv64/ssa.go
@@ -341,7 +341,7 @@
 		p.From.Type = obj.TYPE_REG
 		p.From.Reg = r2
 		p.Reg = r1
-		p.SetRestArgs([]obj.Addr{{Type: obj.TYPE_REG, Reg: r3}})
+		p.AddRestSource(obj.Addr{Type: obj.TYPE_REG, Reg: r3})
 		p.To.Type = obj.TYPE_REG
 		p.To.Reg = r
 	case ssa.OpRISCV64FSQRTS, ssa.OpRISCV64FNEGS, ssa.OpRISCV64FABSD, ssa.OpRISCV64FSQRTD, ssa.OpRISCV64FNEGD,
@@ -433,7 +433,8 @@
 		p := s.Prog(obj.ACALL)
 		p.To.Type = obj.TYPE_MEM
 		p.To.Name = obj.NAME_EXTERN
-		p.To.Sym = v.Aux.(*obj.LSym)
+		// AuxInt encodes how many buffer entries we need.
+		p.To.Sym = ir.Syms.GCWriteBarrier[v.AuxInt-1]
 	case ssa.OpRISCV64LoweredPanicBoundsA, ssa.OpRISCV64LoweredPanicBoundsB, ssa.OpRISCV64LoweredPanicBoundsC:
 		p := s.Prog(obj.ACALL)
 		p.To.Type = obj.TYPE_MEM
diff --git a/src/cmd/compile/internal/s390x/ssa.go b/src/cmd/compile/internal/s390x/ssa.go
index ba50b00..a97c156 100644
--- a/src/cmd/compile/internal/s390x/ssa.go
+++ b/src/cmd/compile/internal/s390x/ssa.go
@@ -8,6 +8,7 @@
 	"math"
 
 	"cmd/compile/internal/base"
+	"cmd/compile/internal/ir"
 	"cmd/compile/internal/logopt"
 	"cmd/compile/internal/ssa"
 	"cmd/compile/internal/ssagen"
@@ -26,7 +27,7 @@
 		v := b.Values[i]
 		if flive && v.Op == ssa.OpS390XMOVDconst {
 			// The "mark" is any non-nil Aux value.
-			v.Aux = v
+			v.Aux = ssa.AuxMark
 		}
 		if v.Type.IsFlags() {
 			flive = false
@@ -183,7 +184,7 @@
 		i := v.Aux.(s390x.RotateParams)
 		p := s.Prog(v.Op.Asm())
 		p.From = obj.Addr{Type: obj.TYPE_CONST, Offset: int64(i.Start)}
-		p.SetRestArgs([]obj.Addr{
+		p.AddRestSourceArgs([]obj.Addr{
 			{Type: obj.TYPE_CONST, Offset: int64(i.End)},
 			{Type: obj.TYPE_CONST, Offset: int64(i.Amount)},
 			{Type: obj.TYPE_REG, Reg: r2},
@@ -195,7 +196,7 @@
 		i := v.Aux.(s390x.RotateParams)
 		p := s.Prog(v.Op.Asm())
 		p.From = obj.Addr{Type: obj.TYPE_CONST, Offset: int64(i.Start)}
-		p.SetRestArgs([]obj.Addr{
+		p.AddRestSourceArgs([]obj.Addr{
 			{Type: obj.TYPE_CONST, Offset: int64(i.End)},
 			{Type: obj.TYPE_CONST, Offset: int64(i.Amount)},
 			{Type: obj.TYPE_REG, Reg: r2},
@@ -566,7 +567,8 @@
 		p := s.Prog(obj.ACALL)
 		p.To.Type = obj.TYPE_MEM
 		p.To.Name = obj.NAME_EXTERN
-		p.To.Sym = v.Aux.(*obj.LSym)
+		// AuxInt encodes how many buffer entries we need.
+		p.To.Sym = ir.Syms.GCWriteBarrier[v.AuxInt-1]
 	case ssa.OpS390XLoweredPanicBoundsA, ssa.OpS390XLoweredPanicBoundsB, ssa.OpS390XLoweredPanicBoundsC:
 		p := s.Prog(obj.ACALL)
 		p.To.Type = obj.TYPE_MEM
@@ -625,7 +627,7 @@
 		p := s.Prog(s390x.AMVC)
 		p.From.Type = obj.TYPE_CONST
 		p.From.Offset = vo.Val64()
-		p.SetFrom3(obj.Addr{
+		p.AddRestSource(obj.Addr{
 			Type:   obj.TYPE_MEM,
 			Reg:    v.Args[1].Reg(),
 			Offset: vo.Off64(),
@@ -662,7 +664,7 @@
 		mvc := s.Prog(s390x.AMVC)
 		mvc.From.Type = obj.TYPE_CONST
 		mvc.From.Offset = 256
-		mvc.SetFrom3(obj.Addr{Type: obj.TYPE_MEM, Reg: v.Args[1].Reg()})
+		mvc.AddRestSource(obj.Addr{Type: obj.TYPE_MEM, Reg: v.Args[1].Reg()})
 		mvc.To.Type = obj.TYPE_MEM
 		mvc.To.Reg = v.Args[0].Reg()
 
@@ -689,7 +691,7 @@
 			mvc := s.Prog(s390x.AMVC)
 			mvc.From.Type = obj.TYPE_CONST
 			mvc.From.Offset = v.AuxInt
-			mvc.SetFrom3(obj.Addr{Type: obj.TYPE_MEM, Reg: v.Args[1].Reg()})
+			mvc.AddRestSource(obj.Addr{Type: obj.TYPE_MEM, Reg: v.Args[1].Reg()})
 			mvc.To.Type = obj.TYPE_MEM
 			mvc.To.Reg = v.Args[0].Reg()
 		}
@@ -900,7 +902,7 @@
 		p.From.Type = obj.TYPE_CONST
 		p.From.Offset = int64(s390x.NotEqual & s390x.NotUnordered) // unordered is not possible
 		p.Reg = s390x.REG_R3
-		p.SetFrom3Const(0)
+		p.AddRestSourceConst(0)
 		if b.Succs[0].Block() != next {
 			s.Br(s390x.ABR, b.Succs[0].Block())
 		}
@@ -937,17 +939,17 @@
 		p.From.Type = obj.TYPE_CONST
 		p.From.Offset = int64(mask & s390x.NotUnordered) // unordered is not possible
 		p.Reg = b.Controls[0].Reg()
-		p.SetFrom3Reg(b.Controls[1].Reg())
+		p.AddRestSourceReg(b.Controls[1].Reg())
 	case ssa.BlockS390XCGIJ, ssa.BlockS390XCIJ:
 		p.From.Type = obj.TYPE_CONST
 		p.From.Offset = int64(mask & s390x.NotUnordered) // unordered is not possible
 		p.Reg = b.Controls[0].Reg()
-		p.SetFrom3Const(int64(int8(b.AuxInt)))
+		p.AddRestSourceConst(int64(int8(b.AuxInt)))
 	case ssa.BlockS390XCLGIJ, ssa.BlockS390XCLIJ:
 		p.From.Type = obj.TYPE_CONST
 		p.From.Offset = int64(mask & s390x.NotUnordered) // unordered is not possible
 		p.Reg = b.Controls[0].Reg()
-		p.SetFrom3Const(int64(uint8(b.AuxInt)))
+		p.AddRestSourceConst(int64(uint8(b.AuxInt)))
 	default:
 		b.Fatalf("branch not implemented: %s", b.LongString())
 	}
diff --git a/src/cmd/compile/internal/ssa/README.md b/src/cmd/compile/internal/ssa/README.md
index 27ac02b..5dc4fbe 100644
--- a/src/cmd/compile/internal/ssa/README.md
+++ b/src/cmd/compile/internal/ssa/README.md
@@ -214,8 +214,8 @@
 
 Similarly, the code to manage operators is also code generated from
 `_gen/*Ops.go`, as it is easier to maintain a few tables than a lot of code.
-After changing the rules or operators, see [_gen/README](_gen/README) for
-instructions on how to generate the Go code again.
+After changing the rules or operators, run `go generate cmd/compile/internal/ssa`
+to generate the Go code again.
 
 <!---
 TODO: more tips and info could likely go here
diff --git a/src/cmd/compile/internal/ssa/_gen/386.rules b/src/cmd/compile/internal/ssa/_gen/386.rules
index 5e30ca9..d92dddd 100644
--- a/src/cmd/compile/internal/ssa/_gen/386.rules
+++ b/src/cmd/compile/internal/ssa/_gen/386.rules
@@ -52,12 +52,17 @@
 (OffPtr [off] ptr) => (ADDLconst [int32(off)] ptr)
 
 (Bswap32 ...) => (BSWAPL ...)
+(Bswap16 x) => (ROLWconst [8] x)
 
 (Sqrt ...) => (SQRTSD ...)
 (Sqrt32 ...) => (SQRTSS ...)
 
+(Ctz8 x) => (BSFL (ORLconst <typ.UInt32> [0x100] x))
+(Ctz8NonZero ...) => (BSFL ...)
 (Ctz16 x) => (BSFL (ORLconst <typ.UInt32> [0x10000] x))
 (Ctz16NonZero ...) => (BSFL ...)
+(Ctz32 ...) => (LoweredCtz32 ...)
+(Ctz32NonZero ...) => (BSFL ...)
 
 // Lowering extension
 (SignExt8to16  ...) => (MOVBLSX ...)
@@ -202,11 +207,9 @@
 (Load <t> ptr mem) && is64BitFloat(t) => (MOVSDload ptr mem)
 
 // Lowering stores
-// These more-specific FP versions of Store pattern should come first.
-(Store {t} ptr val mem) && t.Size() == 8 && is64BitFloat(val.Type) => (MOVSDstore ptr val mem)
-(Store {t} ptr val mem) && t.Size() == 4 && is32BitFloat(val.Type) => (MOVSSstore ptr val mem)
-
-(Store {t} ptr val mem) && t.Size() == 4 => (MOVLstore ptr val mem)
+(Store {t} ptr val mem) && t.Size() == 8 &&  t.IsFloat() => (MOVSDstore ptr val mem)
+(Store {t} ptr val mem) && t.Size() == 4 &&  t.IsFloat() => (MOVSSstore ptr val mem)
+(Store {t} ptr val mem) && t.Size() == 4 && !t.IsFloat() => (MOVLstore ptr val mem)
 (Store {t} ptr val mem) && t.Size() == 2 => (MOVWstore ptr val mem)
 (Store {t} ptr val mem) && t.Size() == 1 => (MOVBstore ptr val mem)
 
@@ -333,7 +336,8 @@
 (GetCallerPC ...) => (LoweredGetCallerPC ...)
 (GetCallerSP ...) => (LoweredGetCallerSP ...)
 (Addr {sym} base) => (LEAL {sym} base)
-(LocalAddr {sym} base _) => (LEAL {sym} base)
+(LocalAddr <t> {sym} base mem) && t.Elem().HasPointers() => (LEAL {sym} (SPanchored base mem))
+(LocalAddr <t> {sym} base _)  && !t.Elem().HasPointers() => (LEAL {sym} base)
 
 // block rewrites
 (If (SETL  cmp) yes no) => (LT  cmp yes no)
@@ -393,7 +397,7 @@
 (NE (TESTB (SETNEF cmp) (SETNEF cmp)) yes no) => (NEF  cmp yes no)
 
 // fold constants into instructions
-(ADDL x (MOVLconst [c])) => (ADDLconst [c] x)
+(ADDL x (MOVLconst <t> [c])) && !t.IsPtr() => (ADDLconst [c] x)
 (ADDLcarry x (MOVLconst [c])) => (ADDLconstcarry [c] x)
 (ADCL x (MOVLconst [c]) f) => (ADCLconst [c] x f)
 
@@ -915,160 +919,6 @@
 // Convert LEAL1 back to ADDL if we can
 (LEAL1 [0] {nil} x y) => (ADDL x y)
 
-// Combining byte loads into larger (unaligned) loads.
-// There are many ways these combinations could occur.  This is
-// designed to match the way encoding/binary.LittleEndian does it.
-(ORL                  x0:(MOVBload [i0] {s} p mem)
-    s0:(SHLLconst [8] x1:(MOVBload [i1] {s} p mem)))
-  && i1 == i0+1
-  && x0.Uses == 1
-  && x1.Uses == 1
-  && s0.Uses == 1
-  && mergePoint(b,x0,x1) != nil
-  && clobber(x0, x1, s0)
-  => @mergePoint(b,x0,x1) (MOVWload [i0] {s} p mem)
-
-(ORL                  x0:(MOVBload [i] {s} p0 mem)
-    s0:(SHLLconst [8] x1:(MOVBload [i] {s} p1 mem)))
-  && x0.Uses == 1
-  && x1.Uses == 1
-  && s0.Uses == 1
-  && sequentialAddresses(p0, p1, 1)
-  && mergePoint(b,x0,x1) != nil
-  && clobber(x0, x1, s0)
-  => @mergePoint(b,x0,x1) (MOVWload [i] {s} p0 mem)
-
-(ORL o0:(ORL
-                       x0:(MOVWload [i0] {s} p mem)
-    s0:(SHLLconst [16] x1:(MOVBload [i2] {s} p mem)))
-    s1:(SHLLconst [24] x2:(MOVBload [i3] {s} p mem)))
-  && i2 == i0+2
-  && i3 == i0+3
-  && x0.Uses == 1
-  && x1.Uses == 1
-  && x2.Uses == 1
-  && s0.Uses == 1
-  && s1.Uses == 1
-  && o0.Uses == 1
-  && mergePoint(b,x0,x1,x2) != nil
-  && clobber(x0, x1, x2, s0, s1, o0)
-  => @mergePoint(b,x0,x1,x2) (MOVLload [i0] {s} p mem)
-
-(ORL o0:(ORL
-                       x0:(MOVWload [i] {s} p0 mem)
-    s0:(SHLLconst [16] x1:(MOVBload [i] {s} p1 mem)))
-    s1:(SHLLconst [24] x2:(MOVBload [i] {s} p2 mem)))
-  && x0.Uses == 1
-  && x1.Uses == 1
-  && x2.Uses == 1
-  && s0.Uses == 1
-  && s1.Uses == 1
-  && o0.Uses == 1
-  && sequentialAddresses(p0, p1, 2)
-  && sequentialAddresses(p1, p2, 1)
-  && mergePoint(b,x0,x1,x2) != nil
-  && clobber(x0, x1, x2, s0, s1, o0)
-  => @mergePoint(b,x0,x1,x2) (MOVLload [i] {s} p0 mem)
-
-// Combine constant stores into larger (unaligned) stores.
-(MOVBstoreconst [c] {s} p x:(MOVBstoreconst [a] {s} p mem))
-  && x.Uses == 1
-  && a.Off() + 1 == c.Off()
-  && clobber(x)
-  => (MOVWstoreconst [makeValAndOff(a.Val()&0xff | c.Val()<<8, a.Off())] {s} p mem)
-(MOVBstoreconst [a] {s} p x:(MOVBstoreconst [c] {s} p mem))
-  && x.Uses == 1
-  && a.Off() + 1 == c.Off()
-  && clobber(x)
-  => (MOVWstoreconst [makeValAndOff(a.Val()&0xff | c.Val()<<8, a.Off())] {s} p mem)
-
-(MOVBstoreconst [c] {s} p1 x:(MOVBstoreconst [a] {s} p0 mem))
-  && x.Uses == 1
-  && a.Off() == c.Off()
-  && sequentialAddresses(p0, p1, 1)
-  && clobber(x)
-  => (MOVWstoreconst [makeValAndOff(a.Val()&0xff | c.Val()<<8, a.Off())] {s} p0 mem)
-(MOVBstoreconst [a] {s} p0 x:(MOVBstoreconst [c] {s} p1 mem))
-  && x.Uses == 1
-  && a.Off() == c.Off()
-  && sequentialAddresses(p0, p1, 1)
-  && clobber(x)
-  => (MOVWstoreconst [makeValAndOff(a.Val()&0xff | c.Val()<<8, a.Off())] {s} p0 mem)
-
-(MOVWstoreconst [c] {s} p x:(MOVWstoreconst [a] {s} p mem))
-  && x.Uses == 1
-  && a.Off() + 2 == c.Off()
-  && clobber(x)
-  => (MOVLstoreconst [makeValAndOff(a.Val()&0xffff | c.Val()<<16, a.Off())] {s} p mem)
-(MOVWstoreconst [a] {s} p x:(MOVWstoreconst [c] {s} p mem))
-  && x.Uses == 1
-  && ValAndOff(a).Off() + 2 == ValAndOff(c).Off()
-  && clobber(x)
-  => (MOVLstoreconst [makeValAndOff(a.Val()&0xffff | c.Val()<<16, a.Off())] {s} p mem)
-
-(MOVWstoreconst [c] {s} p1 x:(MOVWstoreconst [a] {s} p0 mem))
-  && x.Uses == 1
-  && a.Off() == c.Off()
-  && sequentialAddresses(p0, p1, 2)
-  && clobber(x)
-  => (MOVLstoreconst [makeValAndOff(a.Val()&0xffff | c.Val()<<16, a.Off())] {s} p0 mem)
-(MOVWstoreconst [a] {s} p0 x:(MOVWstoreconst [c] {s} p1 mem))
-  && x.Uses == 1
-  && a.Off() == c.Off()
-  && sequentialAddresses(p0, p1, 2)
-  && clobber(x)
-  => (MOVLstoreconst [makeValAndOff(a.Val()&0xffff | c.Val()<<16, a.Off())] {s} p0 mem)
-
-// Combine stores into larger (unaligned) stores.
-(MOVBstore [i] {s} p (SHR(W|L)const [8] w) x:(MOVBstore [i-1] {s} p w mem))
-  && x.Uses == 1
-  && clobber(x)
-  => (MOVWstore [i-1] {s} p w mem)
-(MOVBstore [i] {s} p w x:(MOVBstore {s} [i+1] p (SHR(W|L)const [8] w) mem))
-  && x.Uses == 1
-  && clobber(x)
-  => (MOVWstore [i] {s} p w mem)
-(MOVBstore [i] {s} p (SHRLconst [j] w) x:(MOVBstore [i-1] {s} p w0:(SHRLconst [j-8] w) mem))
-  && x.Uses == 1
-  && clobber(x)
-  => (MOVWstore [i-1] {s} p w0 mem)
-
-(MOVBstore [i] {s} p1 (SHR(W|L)const [8] w) x:(MOVBstore [i] {s} p0 w mem))
-  && x.Uses == 1
-  && sequentialAddresses(p0, p1, 1)
-  && clobber(x)
-  => (MOVWstore [i] {s} p0 w mem)
-(MOVBstore [i] {s} p0 w x:(MOVBstore {s} [i] p1 (SHR(W|L)const [8] w) mem))
-  && x.Uses == 1
-  && sequentialAddresses(p0, p1, 1)
-  && clobber(x)
-  => (MOVWstore [i] {s} p0 w mem)
-(MOVBstore [i] {s} p1 (SHRLconst [j] w) x:(MOVBstore [i] {s} p0 w0:(SHRLconst [j-8] w) mem))
-  && x.Uses == 1
-  && sequentialAddresses(p0, p1, 1)
-  && clobber(x)
-  => (MOVWstore [i] {s} p0 w0 mem)
-
-(MOVWstore [i] {s} p (SHRLconst [16] w) x:(MOVWstore [i-2] {s} p w mem))
-  && x.Uses == 1
-  && clobber(x)
-  => (MOVLstore [i-2] {s} p w mem)
-(MOVWstore [i] {s} p (SHRLconst [j] w) x:(MOVWstore [i-2] {s} p w0:(SHRLconst [j-16] w) mem))
-  && x.Uses == 1
-  && clobber(x)
-  => (MOVLstore [i-2] {s} p w0 mem)
-
-(MOVWstore [i] {s} p1 (SHRLconst [16] w) x:(MOVWstore [i] {s} p0 w mem))
-  && x.Uses == 1
-  && sequentialAddresses(p0, p1, 2)
-  && clobber(x)
-  => (MOVLstore [i] {s} p0 w mem)
-(MOVWstore [i] {s} p1 (SHRLconst [j] w) x:(MOVWstore [i] {s} p0 w0:(SHRLconst [j-16] w) mem))
-  && x.Uses == 1
-  && sequentialAddresses(p0, p1, 2)
-  && clobber(x)
-  => (MOVLstore [i] {s} p0 w0 mem)
-
 // For PIC, break floating-point constant loading into two instructions so we have
 // a register to use for holding the address of the constant pool entry.
 (MOVSSconst [c]) && config.ctxt.Flag_shared => (MOVSSconst2 (MOVSSconst1 [c]))
diff --git a/src/cmd/compile/internal/ssa/_gen/386Ops.go b/src/cmd/compile/internal/ssa/_gen/386Ops.go
index c66650c..7401ac8 100644
--- a/src/cmd/compile/internal/ssa/_gen/386Ops.go
+++ b/src/cmd/compile/internal/ssa/_gen/386Ops.go
@@ -302,6 +302,7 @@
 
 		{name: "BSFL", argLength: 1, reg: gp11, asm: "BSFL", clobberFlags: true}, // arg0 # of low-order zeroes ; undef if zero
 		{name: "BSFW", argLength: 1, reg: gp11, asm: "BSFW", clobberFlags: true}, // arg0 # of low-order zeroes ; undef if zero
+		{name: "LoweredCtz32", argLength: 1, reg: gp11, clobberFlags: true},      // arg0 # of low-order zeroes
 
 		{name: "BSRL", argLength: 1, reg: gp11, asm: "BSRL", clobberFlags: true}, // arg0 # of high-order zeroes ; undef if zero
 		{name: "BSRW", argLength: 1, reg: gp11, asm: "BSRW", clobberFlags: true}, // arg0 # of high-order zeroes ; undef if zero
@@ -511,14 +512,15 @@
 		// the result should be the PC within f that g will return to.
 		// See runtime/stubs.go for a more detailed discussion.
 		{name: "LoweredGetCallerPC", reg: gp01, rematerializeable: true},
-		// LoweredGetCallerSP returns the SP of the caller of the current function.
-		{name: "LoweredGetCallerSP", reg: gp01, rematerializeable: true},
+		// LoweredGetCallerSP returns the SP of the caller of the current function. arg0=mem
+		{name: "LoweredGetCallerSP", argLength: 1, reg: gp01, rematerializeable: true},
 		//arg0=ptr,arg1=mem, returns void.  Faults if ptr is nil.
 		{name: "LoweredNilCheck", argLength: 2, reg: regInfo{inputs: []regMask{gpsp}}, clobberFlags: true, nilCheck: true, faultOnNilArg0: true},
 
-		// LoweredWB invokes runtime.gcWriteBarrier. arg0=destptr, arg1=srcptr, arg2=mem, aux=runtime.gcWriteBarrier
+		// LoweredWB invokes runtime.gcWriteBarrier. arg0=mem, auxint=# of write barrier slots
 		// It saves all GP registers if necessary, but may clobber others.
-		{name: "LoweredWB", argLength: 3, reg: regInfo{inputs: []regMask{buildReg("DI"), ax}, clobbers: callerSave &^ gp}, clobberFlags: true, aux: "Sym", symEffect: "None"},
+		// Returns a pointer to a write barrier buffer in DI.
+		{name: "LoweredWB", argLength: 1, reg: regInfo{clobbers: callerSave &^ gp, outputs: []regMask{buildReg("DI")}}, clobberFlags: true, aux: "Int64"},
 
 		// There are three of these functions so that they can have three different register inputs.
 		// When we check 0 <= c <= cap (A), then 0 <= b <= c (B), then 0 <= a <= b (C), we want the
diff --git a/src/cmd/compile/internal/ssa/_gen/AMD64.rules b/src/cmd/compile/internal/ssa/_gen/AMD64.rules
index ccb5295..5f9b85f 100644
--- a/src/cmd/compile/internal/ssa/_gen/AMD64.rules
+++ b/src/cmd/compile/internal/ssa/_gen/AMD64.rules
@@ -110,6 +110,7 @@
 (BitLen8 <t> x) && buildcfg.GOAMD64 >= 3 => (NEGQ (ADDQconst <t> [-32] (LZCNTL (MOVBQZX <x.Type> x))))
 
 (Bswap(64|32) ...) => (BSWAP(Q|L) ...)
+(Bswap16 x) => (ROLWconst [8] x)
 
 (PopCount(64|32) ...) => (POPCNT(Q|L) ...)
 (PopCount16 x) => (POPCNTL (MOVWQZX <typ.UInt32> x))
@@ -234,12 +235,10 @@
 (Load <t> ptr mem) && is64BitFloat(t) => (MOVSDload ptr mem)
 
 // Lowering stores
-// These more-specific FP versions of Store pattern should come first.
-(Store {t} ptr val mem) && t.Size() == 8 && is64BitFloat(val.Type) => (MOVSDstore ptr val mem)
-(Store {t} ptr val mem) && t.Size() == 4 && is32BitFloat(val.Type) => (MOVSSstore ptr val mem)
-
-(Store {t} ptr val mem) && t.Size() == 8 => (MOVQstore ptr val mem)
-(Store {t} ptr val mem) && t.Size() == 4 => (MOVLstore ptr val mem)
+(Store {t} ptr val mem) && t.Size() == 8 &&  t.IsFloat() => (MOVSDstore ptr val mem)
+(Store {t} ptr val mem) && t.Size() == 4 &&  t.IsFloat() => (MOVSSstore ptr val mem)
+(Store {t} ptr val mem) && t.Size() == 8 && !t.IsFloat() => (MOVQstore ptr val mem)
+(Store {t} ptr val mem) && t.Size() == 4 && !t.IsFloat() => (MOVLstore ptr val mem)
 (Store {t} ptr val mem) && t.Size() == 2 => (MOVWstore ptr val mem)
 (Store {t} ptr val mem) && t.Size() == 1 => (MOVBstore ptr val mem)
 
@@ -480,7 +479,8 @@
 
 (HasCPUFeature {s}) => (SETNE (CMPLconst [0] (LoweredHasCPUFeature {s})))
 (Addr {sym} base) => (LEAQ {sym} base)
-(LocalAddr {sym} base _) => (LEAQ {sym} base)
+(LocalAddr <t> {sym} base mem) && t.Elem().HasPointers() => (LEAQ {sym} (SPanchored base mem))
+(LocalAddr <t> {sym} base _)  && !t.Elem().HasPointers() => (LEAQ {sym} base)
 
 (MOVBstore [off] {sym} ptr y:(SETL x) mem) && y.Uses == 1 => (SETLstore [off] {sym} ptr x mem)
 (MOVBstore [off] {sym} ptr y:(SETLE x) mem) && y.Uses == 1 => (SETLEstore [off] {sym} ptr x mem)
@@ -745,7 +745,7 @@
 // (SETEQF x) => (ANDQ (SETEQ <typ.Int8> x) (SETORD <typ.Int8> x))
 
 // fold constants into instructions
-(ADDQ x (MOVQconst [c])) && is32Bit(c) => (ADDQconst [int32(c)] x)
+(ADDQ x (MOVQconst <t> [c])) && is32Bit(c) && !t.IsPtr() => (ADDQconst [int32(c)] x)
 (ADDQ x (MOVLconst [c])) => (ADDQconst [c] x)
 (ADDL x (MOVLconst [c])) => (ADDLconst [c] x)
 
@@ -1470,397 +1470,6 @@
 // Convert LEAQ1 back to ADDQ if we can
 (LEAQ1 [0] x y) && v.Aux == nil => (ADDQ x y)
 
-// Combining byte loads into larger (unaligned) loads.
-// There are many ways these combinations could occur.  This is
-// designed to match the way encoding/binary.LittleEndian does it.
-
-// Little-endian loads
-
-(OR(L|Q)                  x0:(MOVBload [i0] {s} p mem)
-    sh:(SHL(L|Q)const [8] x1:(MOVBload [i1] {s} p mem)))
-  && i1 == i0+1
-  && x0.Uses == 1
-  && x1.Uses == 1
-  && sh.Uses == 1
-  && mergePoint(b,x0,x1) != nil
-  && clobber(x0, x1, sh)
-  => @mergePoint(b,x0,x1) (MOVWload [i0] {s} p mem)
-
-(OR(L|Q)                  x0:(MOVBload [i] {s} p0 mem)
-    sh:(SHL(L|Q)const [8] x1:(MOVBload [i] {s} p1 mem)))
-  && x0.Uses == 1
-  && x1.Uses == 1
-  && sh.Uses == 1
-  && sequentialAddresses(p0, p1, 1)
-  && mergePoint(b,x0,x1) != nil
-  && clobber(x0, x1, sh)
-  => @mergePoint(b,x0,x1) (MOVWload [i] {s} p0 mem)
-
-(OR(L|Q)                   x0:(MOVWload [i0] {s} p mem)
-    sh:(SHL(L|Q)const [16] x1:(MOVWload [i1] {s} p mem)))
-  && i1 == i0+2
-  && x0.Uses == 1
-  && x1.Uses == 1
-  && sh.Uses == 1
-  && mergePoint(b,x0,x1) != nil
-  && clobber(x0, x1, sh)
-  => @mergePoint(b,x0,x1) (MOVLload [i0] {s} p mem)
-
-(OR(L|Q)                   x0:(MOVWload [i] {s} p0 mem)
-    sh:(SHL(L|Q)const [16] x1:(MOVWload [i] {s} p1 mem)))
-  && x0.Uses == 1
-  && x1.Uses == 1
-  && sh.Uses == 1
-  && sequentialAddresses(p0, p1, 2)
-  && mergePoint(b,x0,x1) != nil
-  && clobber(x0, x1, sh)
-  => @mergePoint(b,x0,x1) (MOVLload [i] {s} p0 mem)
-
-(ORQ                   x0:(MOVLload [i0] {s} p mem)
-    sh:(SHLQconst [32] x1:(MOVLload [i1] {s} p mem)))
-  && i1 == i0+4
-  && x0.Uses == 1
-  && x1.Uses == 1
-  && sh.Uses == 1
-  && mergePoint(b,x0,x1) != nil
-  && clobber(x0, x1, sh)
-  => @mergePoint(b,x0,x1) (MOVQload [i0] {s} p mem)
-
-(ORQ                   x0:(MOVLload [i] {s} p0 mem)
-    sh:(SHLQconst [32] x1:(MOVLload [i] {s} p1 mem)))
-  && x0.Uses == 1
-  && x1.Uses == 1
-  && sh.Uses == 1
-  && sequentialAddresses(p0, p1, 4)
-  && mergePoint(b,x0,x1) != nil
-  && clobber(x0, x1, sh)
-  => @mergePoint(b,x0,x1) (MOVQload [i] {s} p0 mem)
-
-(OR(L|Q)
-    s1:(SHL(L|Q)const [j1] x1:(MOVBload [i1] {s} p mem))
-    or:(OR(L|Q)
-        s0:(SHL(L|Q)const [j0] x0:(MOVBload [i0] {s} p mem))
-	y))
-  && i1 == i0+1
-  && j1 == j0+8
-  && j0 % 16 == 0
-  && x0.Uses == 1
-  && x1.Uses == 1
-  && s0.Uses == 1
-  && s1.Uses == 1
-  && or.Uses == 1
-  && mergePoint(b,x0,x1,y) != nil
-  && clobber(x0, x1, s0, s1, or)
-  => @mergePoint(b,x0,x1,y) (OR(L|Q) <v.Type> (SHL(L|Q)const <v.Type> [j0] (MOVWload [i0] {s} p mem)) y)
-
-(OR(L|Q)
-    s1:(SHL(L|Q)const [j1] x1:(MOVBload [i] {s} p1 mem))
-    or:(OR(L|Q)
-        s0:(SHL(L|Q)const [j0] x0:(MOVBload [i] {s} p0 mem))
-	y))
-  && j1 == j0+8
-  && j0 % 16 == 0
-  && x0.Uses == 1
-  && x1.Uses == 1
-  && s0.Uses == 1
-  && s1.Uses == 1
-  && or.Uses == 1
-  && sequentialAddresses(p0, p1, 1)
-  && mergePoint(b,x0,x1,y) != nil
-  && clobber(x0, x1, s0, s1, or)
-  => @mergePoint(b,x0,x1,y) (OR(L|Q) <v.Type> (SHL(L|Q)const <v.Type> [j0] (MOVWload [i] {s} p0 mem)) y)
-
-(ORQ
-    s1:(SHLQconst [j1] x1:(MOVWload [i1] {s} p mem))
-    or:(ORQ
-        s0:(SHLQconst [j0] x0:(MOVWload [i0] {s} p mem))
-	y))
-  && i1 == i0+2
-  && j1 == j0+16
-  && j0 % 32 == 0
-  && x0.Uses == 1
-  && x1.Uses == 1
-  && s0.Uses == 1
-  && s1.Uses == 1
-  && or.Uses == 1
-  && mergePoint(b,x0,x1,y) != nil
-  && clobber(x0, x1, s0, s1, or)
-  => @mergePoint(b,x0,x1,y) (ORQ <v.Type> (SHLQconst <v.Type> [j0] (MOVLload [i0] {s} p mem)) y)
-
-(ORQ
-    s1:(SHLQconst [j1] x1:(MOVWload [i] {s} p1 mem))
-    or:(ORQ
-        s0:(SHLQconst [j0] x0:(MOVWload [i] {s} p0 mem))
-	y))
-  && j1 == j0+16
-  && j0 % 32 == 0
-  && x0.Uses == 1
-  && x1.Uses == 1
-  && s0.Uses == 1
-  && s1.Uses == 1
-  && or.Uses == 1
-  && sequentialAddresses(p0, p1, 2)
-  && mergePoint(b,x0,x1,y) != nil
-  && clobber(x0, x1, s0, s1, or)
-  => @mergePoint(b,x0,x1,y) (ORQ <v.Type> (SHLQconst <v.Type> [j0] (MOVLload [i] {s} p0 mem)) y)
-
-// Big-endian loads
-
-(OR(L|Q)
-                           x1:(MOVBload [i1] {s} p mem)
-    sh:(SHL(L|Q)const [8]  x0:(MOVBload [i0] {s} p mem)))
-  && i1 == i0+1
-  && x0.Uses == 1
-  && x1.Uses == 1
-  && sh.Uses == 1
-  && mergePoint(b,x0,x1) != nil
-  && clobber(x0, x1, sh)
-  => @mergePoint(b,x0,x1) (ROLWconst <v.Type> [8] (MOVWload [i0] {s} p mem))
-
-(OR(L|Q)
-                           x1:(MOVBload [i] {s} p1 mem)
-    sh:(SHL(L|Q)const [8]  x0:(MOVBload [i] {s} p0 mem)))
-  && x0.Uses == 1
-  && x1.Uses == 1
-  && sh.Uses == 1
-  && sequentialAddresses(p0, p1, 1)
-  && mergePoint(b,x0,x1) != nil
-  && clobber(x0, x1, sh)
-  => @mergePoint(b,x0,x1) (ROLWconst <v.Type> [8] (MOVWload [i] {s} p0 mem))
-
-(OR(L|Q)
-                            r1:(ROLWconst [8] x1:(MOVWload [i1] {s} p mem))
-    sh:(SHL(L|Q)const [16]  r0:(ROLWconst [8] x0:(MOVWload [i0] {s} p mem))))
-  && i1 == i0+2
-  && x0.Uses == 1
-  && x1.Uses == 1
-  && r0.Uses == 1
-  && r1.Uses == 1
-  && sh.Uses == 1
-  && mergePoint(b,x0,x1) != nil
-  && clobber(x0, x1, r0, r1, sh)
-  => @mergePoint(b,x0,x1) (BSWAPL <v.Type> (MOVLload [i0] {s} p mem))
-
-(OR(L|Q)
-                            r1:(ROLWconst [8] x1:(MOVWload [i] {s} p1 mem))
-    sh:(SHL(L|Q)const [16]  r0:(ROLWconst [8] x0:(MOVWload [i] {s} p0 mem))))
-  && x0.Uses == 1
-  && x1.Uses == 1
-  && r0.Uses == 1
-  && r1.Uses == 1
-  && sh.Uses == 1
-  && sequentialAddresses(p0, p1, 2)
-  && mergePoint(b,x0,x1) != nil
-  && clobber(x0, x1, r0, r1, sh)
-  => @mergePoint(b,x0,x1) (BSWAPL <v.Type> (MOVLload [i] {s} p0 mem))
-
-(ORQ
-                        r1:(BSWAPL x1:(MOVLload [i1] {s} p mem))
-    sh:(SHLQconst [32]  r0:(BSWAPL x0:(MOVLload [i0] {s} p mem))))
-  && i1 == i0+4
-  && x0.Uses == 1
-  && x1.Uses == 1
-  && r0.Uses == 1
-  && r1.Uses == 1
-  && sh.Uses == 1
-  && mergePoint(b,x0,x1) != nil
-  && clobber(x0, x1, r0, r1, sh)
-  => @mergePoint(b,x0,x1) (BSWAPQ <v.Type> (MOVQload [i0] {s} p mem))
-
-(ORQ
-                        r1:(BSWAPL x1:(MOVLload [i] {s} p1 mem))
-    sh:(SHLQconst [32]  r0:(BSWAPL x0:(MOVLload [i] {s} p0 mem))))
-  && x0.Uses == 1
-  && x1.Uses == 1
-  && r0.Uses == 1
-  && r1.Uses == 1
-  && sh.Uses == 1
-  && sequentialAddresses(p0, p1, 4)
-  && mergePoint(b,x0,x1) != nil
-  && clobber(x0, x1, r0, r1, sh)
-  => @mergePoint(b,x0,x1) (BSWAPQ <v.Type> (MOVQload [i] {s} p0 mem))
-
-(OR(L|Q)
-    s0:(SHL(L|Q)const [j0] x0:(MOVBload [i0] {s} p mem))
-    or:(OR(L|Q)
-        s1:(SHL(L|Q)const [j1] x1:(MOVBload [i1] {s} p mem))
-	y))
-  && i1 == i0+1
-  && j1 == j0-8
-  && j1 % 16 == 0
-  && x0.Uses == 1
-  && x1.Uses == 1
-  && s0.Uses == 1
-  && s1.Uses == 1
-  && or.Uses == 1
-  && mergePoint(b,x0,x1,y) != nil
-  && clobber(x0, x1, s0, s1, or)
-  => @mergePoint(b,x0,x1,y) (OR(L|Q) <v.Type> (SHL(L|Q)const <v.Type> [j1] (ROLWconst <typ.UInt16> [8] (MOVWload [i0] {s} p mem))) y)
-
-(OR(L|Q)
-    s0:(SHL(L|Q)const [j0] x0:(MOVBload [i] {s} p0 mem))
-    or:(OR(L|Q)
-        s1:(SHL(L|Q)const [j1] x1:(MOVBload [i] {s} p1 mem))
-	y))
-  && j1 == j0-8
-  && j1 % 16 == 0
-  && x0.Uses == 1
-  && x1.Uses == 1
-  && s0.Uses == 1
-  && s1.Uses == 1
-  && or.Uses == 1
-  && sequentialAddresses(p0, p1, 1)
-  && mergePoint(b,x0,x1,y) != nil
-  && clobber(x0, x1, s0, s1, or)
-  => @mergePoint(b,x0,x1,y) (OR(L|Q) <v.Type> (SHL(L|Q)const <v.Type> [j1] (ROLWconst <typ.UInt16> [8] (MOVWload [i] {s} p0 mem))) y)
-
-(ORQ
-    s0:(SHLQconst [j0] r0:(ROLWconst [8] x0:(MOVWload [i0] {s} p mem)))
-    or:(ORQ
-        s1:(SHLQconst [j1] r1:(ROLWconst [8] x1:(MOVWload [i1] {s} p mem)))
-	y))
-  && i1 == i0+2
-  && j1 == j0-16
-  && j1 % 32 == 0
-  && x0.Uses == 1
-  && x1.Uses == 1
-  && r0.Uses == 1
-  && r1.Uses == 1
-  && s0.Uses == 1
-  && s1.Uses == 1
-  && or.Uses == 1
-  && mergePoint(b,x0,x1,y) != nil
-  && clobber(x0, x1, r0, r1, s0, s1, or)
-  => @mergePoint(b,x0,x1,y) (ORQ <v.Type> (SHLQconst <v.Type> [j1] (BSWAPL <typ.UInt32> (MOVLload [i0] {s} p mem))) y)
-
-(ORQ
-    s0:(SHLQconst [j0] r0:(ROLWconst [8] x0:(MOVWload [i] {s} p0 mem)))
-    or:(ORQ
-        s1:(SHLQconst [j1] r1:(ROLWconst [8] x1:(MOVWload [i] {s} p1 mem)))
-	y))
-  && j1 == j0-16
-  && j1 % 32 == 0
-  && x0.Uses == 1
-  && x1.Uses == 1
-  && r0.Uses == 1
-  && r1.Uses == 1
-  && s0.Uses == 1
-  && s1.Uses == 1
-  && or.Uses == 1
-  && sequentialAddresses(p0, p1, 2)
-  && mergePoint(b,x0,x1,y) != nil
-  && clobber(x0, x1, r0, r1, s0, s1, or)
-  => @mergePoint(b,x0,x1,y) (ORQ <v.Type> (SHLQconst <v.Type> [j1] (BSWAPL <typ.UInt32> (MOVLload [i] {s} p0 mem))) y)
-
-// Combine 2 byte stores + shift into rolw 8 + word store
-(MOVBstore [i] {s} p w
-  x0:(MOVBstore [i-1] {s} p (SHRWconst [8] w) mem))
-  && x0.Uses == 1
-  && clobber(x0)
-  => (MOVWstore [i-1] {s} p (ROLWconst <w.Type> [8] w) mem)
-(MOVBstore [i] {s} p1 w
-  x0:(MOVBstore [i] {s} p0 (SHRWconst [8] w) mem))
-  && x0.Uses == 1
-  && sequentialAddresses(p0, p1, 1)
-  && clobber(x0)
-  => (MOVWstore [i] {s} p0 (ROLWconst <w.Type> [8] w) mem)
-
-// Combine stores + shifts into bswap and larger (unaligned) stores
-(MOVBstore [i] {s} p w
-  x2:(MOVBstore [i-1] {s} p (SHRLconst [8] w)
-  x1:(MOVBstore [i-2] {s} p (SHRLconst [16] w)
-  x0:(MOVBstore [i-3] {s} p (SHRLconst [24] w) mem))))
-  && x0.Uses == 1
-  && x1.Uses == 1
-  && x2.Uses == 1
-  && clobber(x0, x1, x2)
-  => (MOVLstore [i-3] {s} p (BSWAPL <w.Type> w) mem)
-(MOVBstore [i] {s} p3 w
-  x2:(MOVBstore [i] {s} p2 (SHRLconst [8] w)
-  x1:(MOVBstore [i] {s} p1 (SHRLconst [16] w)
-  x0:(MOVBstore [i] {s} p0 (SHRLconst [24] w) mem))))
-  && x0.Uses == 1
-  && x1.Uses == 1
-  && x2.Uses == 1
-  && sequentialAddresses(p0, p1, 1)
-  && sequentialAddresses(p1, p2, 1)
-  && sequentialAddresses(p2, p3, 1)
-  && clobber(x0, x1, x2)
-  => (MOVLstore [i] {s} p0 (BSWAPL <w.Type> w) mem)
-
-(MOVBstore [i] {s} p w
-  x6:(MOVBstore [i-1] {s} p (SHRQconst [8] w)
-  x5:(MOVBstore [i-2] {s} p (SHRQconst [16] w)
-  x4:(MOVBstore [i-3] {s} p (SHRQconst [24] w)
-  x3:(MOVBstore [i-4] {s} p (SHRQconst [32] w)
-  x2:(MOVBstore [i-5] {s} p (SHRQconst [40] w)
-  x1:(MOVBstore [i-6] {s} p (SHRQconst [48] w)
-  x0:(MOVBstore [i-7] {s} p (SHRQconst [56] w) mem))))))))
-  && x0.Uses == 1
-  && x1.Uses == 1
-  && x2.Uses == 1
-  && x3.Uses == 1
-  && x4.Uses == 1
-  && x5.Uses == 1
-  && x6.Uses == 1
-  && clobber(x0, x1, x2, x3, x4, x5, x6)
-  => (MOVQstore [i-7] {s} p (BSWAPQ <w.Type> w) mem)
-(MOVBstore [i] {s} p7 w
-  x6:(MOVBstore [i] {s} p6 (SHRQconst [8] w)
-  x5:(MOVBstore [i] {s} p5 (SHRQconst [16] w)
-  x4:(MOVBstore [i] {s} p4 (SHRQconst [24] w)
-  x3:(MOVBstore [i] {s} p3 (SHRQconst [32] w)
-  x2:(MOVBstore [i] {s} p2 (SHRQconst [40] w)
-  x1:(MOVBstore [i] {s} p1 (SHRQconst [48] w)
-  x0:(MOVBstore [i] {s} p0 (SHRQconst [56] w) mem))))))))
-  && x0.Uses == 1
-  && x1.Uses == 1
-  && x2.Uses == 1
-  && x3.Uses == 1
-  && x4.Uses == 1
-  && x5.Uses == 1
-  && x6.Uses == 1
-  && sequentialAddresses(p0, p1, 1)
-  && sequentialAddresses(p1, p2, 1)
-  && sequentialAddresses(p2, p3, 1)
-  && sequentialAddresses(p3, p4, 1)
-  && sequentialAddresses(p4, p5, 1)
-  && sequentialAddresses(p5, p6, 1)
-  && sequentialAddresses(p6, p7, 1)
-  && clobber(x0, x1, x2, x3, x4, x5, x6)
-  => (MOVQstore [i] {s} p0 (BSWAPQ <w.Type> w) mem)
-
-// Combine constant stores into larger (unaligned) stores.
-(MOVBstoreconst [c] {s} p1 x:(MOVBstoreconst [a] {s} p0 mem))
-  && x.Uses == 1
-  && sequentialAddresses(p0, p1, int64(a.Off()+1-c.Off()))
-  && clobber(x)
-  => (MOVWstoreconst [makeValAndOff(a.Val()&0xff | c.Val()<<8, a.Off())] {s} p0 mem)
-(MOVBstoreconst [a] {s} p0 x:(MOVBstoreconst [c] {s} p1 mem))
-  && x.Uses == 1
-  && sequentialAddresses(p0, p1, int64(a.Off()+1-c.Off()))
-  && clobber(x)
-  => (MOVWstoreconst [makeValAndOff(a.Val()&0xff | c.Val()<<8, a.Off())] {s} p0 mem)
-(MOVWstoreconst [c] {s} p1 x:(MOVWstoreconst [a] {s} p0 mem))
-  && x.Uses == 1
-  && sequentialAddresses(p0, p1, int64(a.Off()+2-c.Off()))
-  && clobber(x)
-  => (MOVLstoreconst [makeValAndOff(a.Val()&0xffff | c.Val()<<16, a.Off())] {s} p0 mem)
-(MOVWstoreconst [a] {s} p0 x:(MOVWstoreconst [c] {s} p1 mem))
-  && x.Uses == 1
-  && sequentialAddresses(p0, p1, int64(a.Off()+2-c.Off()))
-  && clobber(x)
-  => (MOVLstoreconst [makeValAndOff(a.Val()&0xffff | c.Val()<<16, a.Off())] {s} p0 mem)
-(MOVLstoreconst [c] {s} p1 x:(MOVLstoreconst [a] {s} p0 mem))
-  && x.Uses == 1
-  && sequentialAddresses(p0, p1, int64(a.Off()+4-c.Off()))
-  && clobber(x)
-  => (MOVQstore [a.Off()] {s} p0 (MOVQconst [a.Val64()&0xffffffff | c.Val64()<<32]) mem)
-(MOVLstoreconst [a] {s} p0 x:(MOVLstoreconst [c] {s} p1 mem))
-  && x.Uses == 1
-  && sequentialAddresses(p0, p1, int64(a.Off()+4-c.Off()))
-  && clobber(x)
-  => (MOVQstore [a.Off()] {s} p0 (MOVQconst [a.Val64()&0xffffffff | c.Val64()<<32]) mem)
 (MOVQstoreconst [c] {s} p1 x:(MOVQstoreconst [a] {s} p0 mem))
   && config.useSSE
   && x.Uses == 1
@@ -1878,86 +1487,6 @@
   && clobber(x)
   => (MOVOstoreconst [makeValAndOff(0,a.Off())] {s} p0 mem)
 
-// Combine stores into larger (unaligned) stores. Little endian.
-(MOVBstore [i] {s} p (SHR(W|L|Q)const [8] w) x:(MOVBstore [i-1] {s} p w mem))
-  && x.Uses == 1
-  && clobber(x)
-  => (MOVWstore [i-1] {s} p w mem)
-(MOVBstore [i] {s} p w x:(MOVBstore [i+1] {s} p (SHR(W|L|Q)const [8] w) mem))
-  && x.Uses == 1
-  && clobber(x)
-  => (MOVWstore [i] {s} p w mem)
-(MOVBstore [i] {s} p (SHR(L|Q)const [j] w) x:(MOVBstore [i-1] {s} p w0:(SHR(L|Q)const [j-8] w) mem))
-  && x.Uses == 1
-  && clobber(x)
-  => (MOVWstore [i-1] {s} p w0 mem)
-(MOVBstore [i] {s} p1 (SHR(W|L|Q)const [8] w) x:(MOVBstore [i] {s} p0 w mem))
-  && x.Uses == 1
-  && sequentialAddresses(p0, p1, 1)
-  && clobber(x)
-  => (MOVWstore [i] {s} p0 w mem)
-(MOVBstore [i] {s} p0 w x:(MOVBstore [i] {s} p1 (SHR(W|L|Q)const [8] w) mem))
-  && x.Uses == 1
-  && sequentialAddresses(p0, p1, 1)
-  && clobber(x)
-  => (MOVWstore [i] {s} p0 w mem)
-(MOVBstore [i] {s} p1 (SHR(L|Q)const [j] w) x:(MOVBstore [i] {s} p0 w0:(SHR(L|Q)const [j-8] w) mem))
-  && x.Uses == 1
-  && sequentialAddresses(p0, p1, 1)
-  && clobber(x)
-  => (MOVWstore [i] {s} p0 w0 mem)
-
-(MOVWstore [i] {s} p (SHR(L|Q)const [16] w) x:(MOVWstore [i-2] {s} p w mem))
-  && x.Uses == 1
-  && clobber(x)
-  => (MOVLstore [i-2] {s} p w mem)
-(MOVWstore [i] {s} p (SHR(L|Q)const [j] w) x:(MOVWstore [i-2] {s} p w0:(SHR(L|Q)const [j-16] w) mem))
-  && x.Uses == 1
-  && clobber(x)
-  => (MOVLstore [i-2] {s} p w0 mem)
-(MOVWstore [i] {s} p1 (SHR(L|Q)const [16] w) x:(MOVWstore [i] {s} p0 w mem))
-  && x.Uses == 1
-  && sequentialAddresses(p0, p1, 2)
-  && clobber(x)
-  => (MOVLstore [i] {s} p0 w mem)
-(MOVWstore [i] {s} p1 (SHR(L|Q)const [j] w) x:(MOVWstore [i] {s} p0 w0:(SHR(L|Q)const [j-16] w) mem))
-  && x.Uses == 1
-  && sequentialAddresses(p0, p1, 2)
-  && clobber(x)
-  => (MOVLstore [i] {s} p0 w0 mem)
-
-(MOVLstore [i] {s} p (SHRQconst [32] w) x:(MOVLstore [i-4] {s} p w mem))
-  && x.Uses == 1
-  && clobber(x)
-  => (MOVQstore [i-4] {s} p w mem)
-(MOVLstore [i] {s} p (SHRQconst [j] w) x:(MOVLstore [i-4] {s} p w0:(SHRQconst [j-32] w) mem))
-  && x.Uses == 1
-  && clobber(x)
-  => (MOVQstore [i-4] {s} p w0 mem)
-(MOVLstore [i] {s} p1 (SHRQconst [32] w) x:(MOVLstore [i] {s} p0 w mem))
-  && x.Uses == 1
-  && sequentialAddresses(p0, p1, 4)
-  && clobber(x)
-  => (MOVQstore [i] {s} p0 w mem)
-(MOVLstore [i] {s} p1 (SHRQconst [j] w) x:(MOVLstore [i] {s} p0 w0:(SHRQconst [j-32] w) mem))
-  && x.Uses == 1
-  && sequentialAddresses(p0, p1, 4)
-  && clobber(x)
-  => (MOVQstore [i] {s} p0 w0 mem)
-
-(MOVBstore  [c3] {s}  p3 (SHRQconst [56]  w)
-  x1:(MOVWstore [c2]  {s} p2  (SHRQconst [40] w)
-  x2:(MOVLstore [c1] {s} p1  (SHRQconst [8] w)
-  x3:(MOVBstore [c0] {s} p0  w mem))))
-  && x1.Uses == 1
-  && x2.Uses == 1
-  && x3.Uses == 1
-  && sequentialAddresses(p0, p1, int64(1 + c0 - c1))
-  && sequentialAddresses(p0, p2, int64(5 + c0 - c2))
-  && sequentialAddresses(p0, p3, int64(7 + c0 - c3))
-  && clobber(x1, x2, x3)
-  => (MOVQstore [c0] {s} p0 w mem)
-
 (MOVBstore [i] {s} p
   x1:(MOVBload [j] {s2} p2 mem)
     mem2:(MOVBstore [i-1] {s} p
@@ -2172,41 +1701,30 @@
 (PrefetchCacheStreamed ...) => (PrefetchNTA ...)
 
 // CPUID feature: BMI1.
-(AND(Q|L) x (NOT(Q|L) y))           && buildcfg.GOAMD64 >= 3 => (ANDN(Q|L) x y)
-(AND(Q|L) x (NEG(Q|L) x))           && buildcfg.GOAMD64 >= 3 => (BLSI(Q|L) x)
-(XOR(Q|L) x (ADD(Q|L)const [-1] x)) && buildcfg.GOAMD64 >= 3 => (BLSMSK(Q|L) x)
-(AND(Q|L) x (ADD(Q|L)const [-1] x)) && buildcfg.GOAMD64 >= 3 => (BLSR(Q|L) x)
+(AND(Q|L) x (NOT(Q|L) y))               && buildcfg.GOAMD64 >= 3 => (ANDN(Q|L) x y)
+(AND(Q|L) x (NEG(Q|L) x))               && buildcfg.GOAMD64 >= 3 => (BLSI(Q|L) x)
+(XOR(Q|L) x (ADD(Q|L)const [-1] x))     && buildcfg.GOAMD64 >= 3 => (BLSMSK(Q|L) x)
+(AND(Q|L) <t> x (ADD(Q|L)const [-1] x)) && buildcfg.GOAMD64 >= 3 => (Select0 <t> (BLSR(Q|L) x))
+// eliminate TEST instruction in classical "isPowerOfTwo" check
+(SETEQ       (TEST(Q|L) s:(Select0 blsr:(BLSR(Q|L) _)) s))        => (SETEQ       (Select1 <types.TypeFlags> blsr))
+(CMOVQEQ x y (TEST(Q|L) s:(Select0 blsr:(BLSR(Q|L) _)) s))        => (CMOVQEQ x y (Select1 <types.TypeFlags> blsr))
+(CMOVLEQ x y (TEST(Q|L) s:(Select0 blsr:(BLSR(Q|L) _)) s))        => (CMOVLEQ x y (Select1 <types.TypeFlags> blsr))
+(EQ          (TEST(Q|L) s:(Select0 blsr:(BLSR(Q|L) _)) s) yes no) => (EQ          (Select1 <types.TypeFlags> blsr) yes no)
+(SETNE       (TEST(Q|L) s:(Select0 blsr:(BLSR(Q|L) _)) s))        => (SETNE       (Select1 <types.TypeFlags> blsr))
+(CMOVQNE x y (TEST(Q|L) s:(Select0 blsr:(BLSR(Q|L) _)) s))        => (CMOVQNE x y (Select1 <types.TypeFlags> blsr))
+(CMOVLNE x y (TEST(Q|L) s:(Select0 blsr:(BLSR(Q|L) _)) s))        => (CMOVLNE x y (Select1 <types.TypeFlags> blsr))
+(NE          (TEST(Q|L) s:(Select0 blsr:(BLSR(Q|L) _)) s) yes no) => (NE          (Select1 <types.TypeFlags> blsr) yes no)
 
 (BSWAP(Q|L) (BSWAP(Q|L) p)) => p
 
 // CPUID feature: MOVBE.
-(MOV(Q|L)store [i] {s} p x:(BSWAP(Q|L) w) mem) && x.Uses == 1 && buildcfg.GOAMD64 >= 3 => (MOVBE(Q|L)store [i] {s} p w mem)
-(BSWAP(Q|L) x:(MOV(Q|L)load [i] {s} p mem))    && x.Uses == 1 && buildcfg.GOAMD64 >= 3 => (MOVBE(Q|L)load [i] {s} p mem)
-(BSWAP(Q|L) (MOVBE(Q|L)load [i] {s} p m))    => (MOV(Q|L)load [i] {s} p m)
-(MOVBE(Q|L)store [i] {s} p (BSWAP(Q|L) x) m) => (MOV(Q|L)store [i] {s} p x m)
+(MOV(Q|L)store   [i] {s} p x:(BSWAP(Q|L) w) mem) && x.Uses == 1 && buildcfg.GOAMD64 >= 3 => (MOVBE(Q|L)store [i] {s} p w mem)
+(MOVBE(Q|L)store [i] {s} p x:(BSWAP(Q|L) w) mem) && x.Uses == 1                          => (MOV(Q|L)store   [i] {s} p w mem)
+(BSWAP(Q|L) x:(MOV(Q|L)load   [i] {s} p mem))  && x.Uses == 1 && buildcfg.GOAMD64 >= 3 => @x.Block (MOVBE(Q|L)load [i] {s} p mem)
+(BSWAP(Q|L) x:(MOVBE(Q|L)load [i] {s} p mem))  && x.Uses == 1                          => @x.Block (MOV(Q|L)load   [i] {s} p mem)
 (MOVWstore [i] {s} p x:(ROLWconst [8] w) mem)   && x.Uses == 1 && buildcfg.GOAMD64 >= 3 => (MOVBEWstore [i] {s} p w mem)
 (MOVBEWstore [i] {s} p x:(ROLWconst [8] w) mem) && x.Uses == 1 => (MOVWstore [i] {s} p w mem)
 
-(ORQ                   x0:(MOVBELload [i0] {s} p mem)
-    sh:(SHLQconst [32] x1:(MOVBELload [i1] {s} p mem)))
-  && i0 == i1+4
-  && x0.Uses == 1
-  && x1.Uses == 1
-  && sh.Uses == 1
-  && mergePoint(b,x0,x1) != nil
-  && clobber(x0, x1, sh)
-  => @mergePoint(b,x0,x1) (MOVBEQload [i1] {s} p mem)
-
-(ORQ                   x0:(MOVBELload [i] {s} p0 mem)
-    sh:(SHLQconst [32] x1:(MOVBELload [i] {s} p1 mem)))
-  && x0.Uses == 1
-  && x1.Uses == 1
-  && sh.Uses == 1
-  && sequentialAddresses(p1, p0, 4)
-  && mergePoint(b,x0,x1) != nil
-  && clobber(x0, x1, sh)
-  => @mergePoint(b,x0,x1) (MOVBEQload [i] {s} p1 mem)
-
 (SAR(Q|L) l:(MOV(Q|L)load [off] {sym} ptr mem) x) && buildcfg.GOAMD64 >= 3 && canMergeLoad(v, l) && clobber(l) => (SARX(Q|L)load [off] {sym} ptr x mem)
 (SHL(Q|L) l:(MOV(Q|L)load [off] {sym} ptr mem) x) && buildcfg.GOAMD64 >= 3 && canMergeLoad(v, l) && clobber(l) => (SHLX(Q|L)load [off] {sym} ptr x mem)
 (SHR(Q|L) l:(MOV(Q|L)load [off] {sym} ptr mem) x) && buildcfg.GOAMD64 >= 3 && canMergeLoad(v, l) && clobber(l) => (SHRX(Q|L)load [off] {sym} ptr x mem)
diff --git a/src/cmd/compile/internal/ssa/_gen/AMD64Ops.go b/src/cmd/compile/internal/ssa/_gen/AMD64Ops.go
index cbe1f5b..d8d0225 100644
--- a/src/cmd/compile/internal/ssa/_gen/AMD64Ops.go
+++ b/src/cmd/compile/internal/ssa/_gen/AMD64Ops.go
@@ -930,13 +930,14 @@
 		// the result should be the PC within f that g will return to.
 		// See runtime/stubs.go for a more detailed discussion.
 		{name: "LoweredGetCallerPC", reg: gp01, rematerializeable: true},
-		// LoweredGetCallerSP returns the SP of the caller of the current function.
-		{name: "LoweredGetCallerSP", reg: gp01, rematerializeable: true},
+		// LoweredGetCallerSP returns the SP of the caller of the current function. arg0=mem
+		{name: "LoweredGetCallerSP", argLength: 1, reg: gp01, rematerializeable: true},
 		//arg0=ptr,arg1=mem, returns void.  Faults if ptr is nil.
 		{name: "LoweredNilCheck", argLength: 2, reg: regInfo{inputs: []regMask{gpsp}}, clobberFlags: true, nilCheck: true, faultOnNilArg0: true},
-		// LoweredWB invokes runtime.gcWriteBarrier. arg0=destptr, arg1=srcptr, arg2=mem, aux=runtime.gcWriteBarrier
+		// LoweredWB invokes runtime.gcWriteBarrier{auxint}. arg0=mem, auxint=# of buffer entries needed.
 		// It saves all GP registers if necessary, but may clobber others.
-		{name: "LoweredWB", argLength: 3, reg: regInfo{inputs: []regMask{buildReg("DI"), buildReg("AX CX DX BX BP SI R8 R9")}, clobbers: callerSave &^ (gp | g)}, clobberFlags: true, aux: "Sym", symEffect: "None"},
+		// Returns a pointer to a write barrier buffer in R11.
+		{name: "LoweredWB", argLength: 1, reg: regInfo{clobbers: callerSave &^ (gp | g), outputs: []regMask{buildReg("R11")}}, clobberFlags: true, aux: "Int64"},
 
 		{name: "LoweredHasCPUFeature", argLength: 0, reg: gp01, rematerializeable: true, typ: "UInt64", aux: "Sym", symEffect: "None"},
 
@@ -1018,14 +1019,14 @@
 		{name: "PrefetchNTA", argLength: 2, reg: prefreg, asm: "PREFETCHNTA", hasSideEffects: true},
 
 		// CPUID feature: BMI1.
-		{name: "ANDNQ", argLength: 2, reg: gp21, asm: "ANDNQ", clobberFlags: true},     // arg0 &^ arg1
-		{name: "ANDNL", argLength: 2, reg: gp21, asm: "ANDNL", clobberFlags: true},     // arg0 &^ arg1
-		{name: "BLSIQ", argLength: 1, reg: gp11, asm: "BLSIQ", clobberFlags: true},     // arg0 & -arg0
-		{name: "BLSIL", argLength: 1, reg: gp11, asm: "BLSIL", clobberFlags: true},     // arg0 & -arg0
-		{name: "BLSMSKQ", argLength: 1, reg: gp11, asm: "BLSMSKQ", clobberFlags: true}, // arg0 ^ (arg0 - 1)
-		{name: "BLSMSKL", argLength: 1, reg: gp11, asm: "BLSMSKL", clobberFlags: true}, // arg0 ^ (arg0 - 1)
-		{name: "BLSRQ", argLength: 1, reg: gp11, asm: "BLSRQ", clobberFlags: true},     // arg0 & (arg0 - 1)
-		{name: "BLSRL", argLength: 1, reg: gp11, asm: "BLSRL", clobberFlags: true},     // arg0 & (arg0 - 1)
+		{name: "ANDNQ", argLength: 2, reg: gp21, asm: "ANDNQ", clobberFlags: true},         // arg0 &^ arg1
+		{name: "ANDNL", argLength: 2, reg: gp21, asm: "ANDNL", clobberFlags: true},         // arg0 &^ arg1
+		{name: "BLSIQ", argLength: 1, reg: gp11, asm: "BLSIQ", clobberFlags: true},         // arg0 & -arg0
+		{name: "BLSIL", argLength: 1, reg: gp11, asm: "BLSIL", clobberFlags: true},         // arg0 & -arg0
+		{name: "BLSMSKQ", argLength: 1, reg: gp11, asm: "BLSMSKQ", clobberFlags: true},     // arg0 ^ (arg0 - 1)
+		{name: "BLSMSKL", argLength: 1, reg: gp11, asm: "BLSMSKL", clobberFlags: true},     // arg0 ^ (arg0 - 1)
+		{name: "BLSRQ", argLength: 1, reg: gp11flags, asm: "BLSRQ", typ: "(UInt64,Flags)"}, // arg0 & (arg0 - 1)
+		{name: "BLSRL", argLength: 1, reg: gp11flags, asm: "BLSRL", typ: "(UInt32,Flags)"}, // arg0 & (arg0 - 1)
 		// count the number of trailing zero bits, prefer TZCNTQ over BSFQ, as TZCNTQ(0)==64
 		// and BSFQ(0) is undefined. Same for TZCNTL(0)==32
 		{name: "TZCNTQ", argLength: 1, reg: gp11, asm: "TZCNTQ", clobberFlags: true},
diff --git a/src/cmd/compile/internal/ssa/_gen/AMD64latelower.rules b/src/cmd/compile/internal/ssa/_gen/AMD64latelower.rules
index bcf4531..a1e63d6 100644
--- a/src/cmd/compile/internal/ssa/_gen/AMD64latelower.rules
+++ b/src/cmd/compile/internal/ssa/_gen/AMD64latelower.rules
@@ -2,14 +2,6 @@
 // Use of this source code is governed by a BSD-style

 // license that can be found in the LICENSE file.

 

-// split 3 operand LEA.

-// Note: Don't split pointer computations in order to avoid invalid pointers.

-(LEA(Q|L|W)1 <t> [c] {s} x y) &&  isPtr(x.Type) && c != 0 && s == nil => (ADD(Q|L|L) x (ADD(Q|L|L)const <y.Type> [c] y))

-(LEA(Q|L|W)1 <t> [c] {s} x y) && !isPtr(x.Type) && c != 0 && s == nil => (ADD(Q|L|L) y (ADD(Q|L|L)const <x.Type> [c] x))

-(LEA(Q|L|W)2 <t> [c] {s} x y) && !isPtr(t)      && c != 0 && s == nil => (ADD(Q|L|L)const [c] (LEA(Q|L|W)2 <x.Type> x y))

-(LEA(Q|L|W)4 <t> [c] {s} x y) && !isPtr(t)      && c != 0 && s == nil => (ADD(Q|L|L)const [c] (LEA(Q|L|W)4 <x.Type> x y))

-(LEA(Q|L|W)8 <t> [c] {s} x y) && !isPtr(t)      && c != 0 && s == nil => (ADD(Q|L|L)const [c] (LEA(Q|L|W)8 <x.Type> x y))

-

 // Prefer SARX/SHLX/SHRX instruction because it has less register restriction on the shift input.

 (SAR(Q|L) x y) && buildcfg.GOAMD64 >= 3 => (SARX(Q|L) x y)

 (SHL(Q|L) x y) && buildcfg.GOAMD64 >= 3 => (SHLX(Q|L) x y)

diff --git a/src/cmd/compile/internal/ssa/_gen/ARM.rules b/src/cmd/compile/internal/ssa/_gen/ARM.rules
index e5898b0..a60afb0 100644
--- a/src/cmd/compile/internal/ssa/_gen/ARM.rules
+++ b/src/cmd/compile/internal/ssa/_gen/ARM.rules
@@ -248,14 +248,15 @@
 (OffPtr [off] ptr) => (ADDconst [int32(off)] ptr)
 
 (Addr {sym} base) => (MOVWaddr {sym} base)
-(LocalAddr {sym} base _) => (MOVWaddr {sym} base)
+(LocalAddr <t> {sym} base mem) && t.Elem().HasPointers() => (MOVWaddr {sym} (SPanchored base mem))
+(LocalAddr <t> {sym} base _)  && !t.Elem().HasPointers() => (MOVWaddr {sym} base)
 
 // loads
 (Load <t> ptr mem) && t.IsBoolean() => (MOVBUload ptr mem)
-(Load <t> ptr mem) && (is8BitInt(t) && isSigned(t)) => (MOVBload ptr mem)
-(Load <t> ptr mem) && (is8BitInt(t) && !isSigned(t)) => (MOVBUload ptr mem)
-(Load <t> ptr mem) && (is16BitInt(t) && isSigned(t)) => (MOVHload ptr mem)
-(Load <t> ptr mem) && (is16BitInt(t) && !isSigned(t)) => (MOVHUload ptr mem)
+(Load <t> ptr mem) && (is8BitInt(t)  &&  t.IsSigned()) => (MOVBload ptr mem)
+(Load <t> ptr mem) && (is8BitInt(t)  && !t.IsSigned()) => (MOVBUload ptr mem)
+(Load <t> ptr mem) && (is16BitInt(t) &&  t.IsSigned()) => (MOVHload ptr mem)
+(Load <t> ptr mem) && (is16BitInt(t) && !t.IsSigned()) => (MOVHUload ptr mem)
 (Load <t> ptr mem) && (is32BitInt(t) || isPtr(t)) => (MOVWload ptr mem)
 (Load <t> ptr mem) && is32BitFloat(t) => (MOVFload ptr mem)
 (Load <t> ptr mem) && is64BitFloat(t) => (MOVDload ptr mem)
@@ -263,9 +264,9 @@
 // stores
 (Store {t} ptr val mem) && t.Size() == 1 => (MOVBstore ptr val mem)
 (Store {t} ptr val mem) && t.Size() == 2 => (MOVHstore ptr val mem)
-(Store {t} ptr val mem) && t.Size() == 4 && !is32BitFloat(val.Type) => (MOVWstore ptr val mem)
-(Store {t} ptr val mem) && t.Size() == 4 && is32BitFloat(val.Type) => (MOVFstore ptr val mem)
-(Store {t} ptr val mem) && t.Size() == 8 && is64BitFloat(val.Type) => (MOVDstore ptr val mem)
+(Store {t} ptr val mem) && t.Size() == 4 && !t.IsFloat() => (MOVWstore ptr val mem)
+(Store {t} ptr val mem) && t.Size() == 4 &&  t.IsFloat() => (MOVFstore ptr val mem)
+(Store {t} ptr val mem) && t.Size() == 8 &&  t.IsFloat() => (MOVDstore ptr val mem)
 
 // zero instructions
 (Zero [0] _ mem) => mem
@@ -480,7 +481,7 @@
 (MOVHloadidx ptr idx (MOVHstoreidx ptr2 idx x _)) && isSamePtr(ptr, ptr2) => (MOVHreg x)
 
 // fold constant into arithmetic ops
-(ADD x (MOVWconst [c])) => (ADDconst [c] x)
+(ADD x (MOVWconst <t> [c])) && !t.IsPtr() => (ADDconst [c] x)
 (SUB (MOVWconst [c]) x) => (RSBconst [c] x)
 (SUB x (MOVWconst [c])) => (SUBconst [c] x)
 (RSB (MOVWconst [c]) x) => (SUBconst [c] x)
diff --git a/src/cmd/compile/internal/ssa/_gen/ARM64.rules b/src/cmd/compile/internal/ssa/_gen/ARM64.rules
index 0c5a2e6..8cf6f67 100644
--- a/src/cmd/compile/internal/ssa/_gen/ARM64.rules
+++ b/src/cmd/compile/internal/ssa/_gen/ARM64.rules
@@ -3,70 +3,68 @@
 // license that can be found in the LICENSE file.
 
 (Add(Ptr|64|32|16|8) ...) => (ADD ...)
-(Add(32F|64F) ...) => (FADD(S|D) ...)
+(Add(32|64)F ...) => (FADD(S|D) ...)
 
 (Sub(Ptr|64|32|16|8) ...) => (SUB ...)
-(Sub(32F|64F) ...) => (FSUB(S|D) ...)
+(Sub(32|64)F ...) => (FSUB(S|D) ...)
 
 (Mul64 ...) => (MUL ...)
 (Mul(32|16|8) ...) => (MULW ...)
-(Mul(32F|64F) ...) => (FMUL(S|D) ...)
+(Mul(32|64)F  ...) => (FMUL(S|D) ...)
 
-(Hmul64 ...) => (MULH ...)
+(Hmul64  ...) => (MULH ...)
 (Hmul64u ...) => (UMULH ...)
-(Hmul32 x y) => (SRAconst (MULL <typ.Int64> x y) [32])
+(Hmul32  x y) => (SRAconst (MULL <typ.Int64> x y) [32])
 (Hmul32u x y) => (SRAconst (UMULL <typ.UInt64> x y) [32])
 (Select0 (Mul64uhilo x y)) => (UMULH x y)
 (Select1 (Mul64uhilo x y)) => (MUL x y)
 
-(Div64 [false] x y) => (DIV x y)
-(Div64u ...) => (UDIV ...)
+(Div64 [false] x y) => (DIV  x y)
 (Div32 [false] x y) => (DIVW x y)
-(Div32u ...) => (UDIVW ...)
 (Div16 [false] x y) => (DIVW (SignExt16to32 x) (SignExt16to32 y))
 (Div16u x y) => (UDIVW (ZeroExt16to32 x) (ZeroExt16to32 y))
-(Div8 x y) => (DIVW (SignExt8to32 x) (SignExt8to32 y))
-(Div8u x y) => (UDIVW (ZeroExt8to32 x) (ZeroExt8to32 y))
+(Div8   x y) => (DIVW  (SignExt8to32  x) (SignExt8to32  y))
+(Div8u  x y) => (UDIVW (ZeroExt8to32  x) (ZeroExt8to32  y))
+(Div64u ...) => (UDIV  ...)
+(Div32u ...) => (UDIVW ...)
 (Div32F ...) => (FDIVS ...)
 (Div64F ...) => (FDIVD ...)
 
 (Mod64 x y) => (MOD x y)
-(Mod64u ...) => (UMOD ...)
 (Mod32 x y) => (MODW x y)
+(Mod64u ...) => (UMOD ...)
 (Mod32u ...) => (UMODW ...)
-(Mod16 x y) => (MODW (SignExt16to32 x) (SignExt16to32 y))
-(Mod16u x y) => (UMODW (ZeroExt16to32 x) (ZeroExt16to32 y))
-(Mod8 x y) => (MODW (SignExt8to32 x) (SignExt8to32 y))
-(Mod8u x y) => (UMODW (ZeroExt8to32 x) (ZeroExt8to32 y))
+(Mod(16|8)  x y) => (MODW  (SignExt(16|8)to32 x) (SignExt(16|8)to32 y))
+(Mod(16|8)u x y) => (UMODW (ZeroExt(16|8)to32 x) (ZeroExt(16|8)to32 y))
 
 // (x + y) / 2 with x>=y    =>    (x - y) / 2 + y
 (Avg64u <t> x y) => (ADD (SRLconst <t> (SUB <t> x y) [1]) y)
 
 (And(64|32|16|8) ...) => (AND ...)
-(Or(64|32|16|8) ...) => (OR ...)
+(Or(64|32|16|8)  ...) => (OR ...)
 (Xor(64|32|16|8) ...) => (XOR ...)
 
 // unary ops
 (Neg(64|32|16|8) ...) => (NEG ...)
-(Neg(32F|64F) ...) => (FNEG(S|D) ...)
+(Neg(32|64)F     ...) => (FNEG(S|D) ...)
 (Com(64|32|16|8) ...) => (MVN ...)
 
 // math package intrinsics
-(Abs ...) => (FABSD ...)
-(Sqrt ...) => (FSQRTD ...)
-(Ceil ...) => (FRINTPD ...)
-(Floor ...) => (FRINTMD ...)
-(Round ...) => (FRINTAD ...)
+(Abs         ...) => (FABSD   ...)
+(Sqrt        ...) => (FSQRTD  ...)
+(Ceil        ...) => (FRINTPD ...)
+(Floor       ...) => (FRINTMD ...)
+(Round       ...) => (FRINTAD ...)
 (RoundToEven ...) => (FRINTND ...)
-(Trunc ...) => (FRINTZD ...)
-(FMA x y z) => (FMADDD z x y)
+(Trunc       ...) => (FRINTZD ...)
+(FMA       x y z) => (FMADDD z x y)
 
 (Sqrt32 ...) => (FSQRTS ...)
 
 // lowering rotates
-// we do rotate detection in generic rules, if the following rules need to be changed, chcek generic rules first.
-(RotateLeft8 <t> x (MOVDconst [c])) => (Or8 (Lsh8x64 <t> x (MOVDconst [c&7])) (Rsh8Ux64 <t> x (MOVDconst [-c&7])))
-(RotateLeft8 <t> x y) => (OR <t> (SLL <t> x (ANDconst <typ.Int64> [7] y)) (SRL <t> (ZeroExt8to64 x) (ANDconst <typ.Int64> [7] (NEG <typ.Int64> y))))
+// we do rotate detection in generic rules, if the following rules need to be changed, check generic rules first.
+(RotateLeft8  <t> x (MOVDconst [c])) => (Or8 (Lsh8x64 <t> x (MOVDconst [c&7])) (Rsh8Ux64 <t> x (MOVDconst [-c&7])))
+(RotateLeft8  <t> x y) => (OR <t> (SLL <t> x (ANDconst <typ.Int64> [7] y)) (SRL <t> (ZeroExt8to64 x) (ANDconst <typ.Int64> [7] (NEG <typ.Int64> y))))
 (RotateLeft16 <t> x (MOVDconst [c])) => (Or16 (Lsh16x64 <t> x (MOVDconst [c&15])) (Rsh16Ux64 <t> x (MOVDconst [-c&15])))
 (RotateLeft16 <t> x y) => (RORW <t> (ORshiftLL <typ.UInt32> (ZeroExt16to32 x) (ZeroExt16to32 x) [16]) (NEG <typ.Int64> y))
 (RotateLeft32 x y) => (RORW x (NEG <y.Type> y))
@@ -74,10 +72,10 @@
 
 (Ctz(64|32|16|8)NonZero ...) => (Ctz(64|32|32|32) ...)
 
-(Ctz64 <t> x) => (CLZ (RBIT <t> x))
+(Ctz64 <t> x) => (CLZ  (RBIT  <t> x))
 (Ctz32 <t> x) => (CLZW (RBITW <t> x))
 (Ctz16 <t> x) => (CLZW <t> (RBITW <typ.UInt32> (ORconst <typ.UInt32> [0x10000] x)))
-(Ctz8 <t> x) => (CLZW <t> (RBITW <typ.UInt32> (ORconst <typ.UInt32> [0x100] x)))
+(Ctz8  <t> x) => (CLZW <t> (RBITW <typ.UInt32> (ORconst <typ.UInt32> [0x100] x)))
 
 (PopCount64 <t> x) => (FMOVDfpgp <t> (VUADDLV <typ.Float64> (VCNT <typ.Float64> (FMOVDgpfp <typ.Float64> x))))
 (PopCount32 <t> x) => (FMOVDfpgp <t> (VUADDLV <typ.Float64> (VCNT <typ.Float64> (FMOVDgpfp <typ.Float64> (ZeroExt32to64 x)))))
@@ -88,34 +86,35 @@
 (FMOVDfpgp <t> (Arg [off] {sym})) => @b.Func.Entry (Arg <t> [off] {sym})
 
 // Similarly for stores, if we see a store after FPR <=> GPR move, then redirect store to use the other register set.
-(MOVDstore [off] {sym} ptr (FMOVDfpgp val) mem) => (FMOVDstore [off] {sym} ptr val mem)
+(MOVDstore  [off] {sym} ptr (FMOVDfpgp val) mem) => (FMOVDstore [off] {sym} ptr val mem)
 (FMOVDstore [off] {sym} ptr (FMOVDgpfp val) mem) => (MOVDstore [off] {sym} ptr val mem)
-(MOVWstore [off] {sym} ptr (FMOVSfpgp val) mem) => (FMOVSstore [off] {sym} ptr val mem)
+(MOVWstore  [off] {sym} ptr (FMOVSfpgp val) mem) => (FMOVSstore [off] {sym} ptr val mem)
 (FMOVSstore [off] {sym} ptr (FMOVSgpfp val) mem) => (MOVWstore [off] {sym} ptr val mem)
 
 // float <=> int register moves, with no conversion.
 // These come up when compiling math.{Float64bits, Float64frombits, Float32bits, Float32frombits}.
-(MOVDload [off] {sym} ptr (FMOVDstore [off] {sym} ptr val _)) => (FMOVDfpgp val)
-(FMOVDload [off] {sym} ptr (MOVDstore [off] {sym} ptr val _)) => (FMOVDgpfp val)
+(MOVDload  [off] {sym} ptr (FMOVDstore [off] {sym} ptr val _)) => (FMOVDfpgp val)
+(FMOVDload [off] {sym} ptr (MOVDstore  [off] {sym} ptr val _)) => (FMOVDgpfp val)
 (MOVWUload [off] {sym} ptr (FMOVSstore [off] {sym} ptr val _)) => (FMOVSfpgp val)
-(FMOVSload [off] {sym} ptr (MOVWstore [off] {sym} ptr val _)) => (FMOVSgpfp val)
+(FMOVSload [off] {sym} ptr (MOVWstore  [off] {sym} ptr val _)) => (FMOVSgpfp val)
 
 (BitLen64 x) => (SUB (MOVDconst [64]) (CLZ <typ.Int> x))
 (BitLen32 x) => (SUB (MOVDconst [32]) (CLZW <typ.Int> x))
 
 (Bswap64 ...) => (REV ...)
 (Bswap32 ...) => (REVW ...)
+(Bswap16 ...) => (REV16W ...)
 
 (BitRev64 ...) => (RBIT ...)
 (BitRev32 ...) => (RBITW ...)
-(BitRev16 x) => (SRLconst [48] (RBIT <typ.UInt64> x))
-(BitRev8 x) => (SRLconst [56] (RBIT <typ.UInt64> x))
+(BitRev16   x) => (SRLconst [48] (RBIT <typ.UInt64> x))
+(BitRev8    x) => (SRLconst [56] (RBIT <typ.UInt64> x))
 
 // In fact, UMOD will be translated into UREM instruction, and UREM is originally translated into
 // UDIV and MSUB instructions. But if there is already an identical UDIV instruction just before or
 // after UREM (case like quo, rem := z/y, z%y), then the second UDIV instruction becomes redundant.
 // The purpose of this rule is to have this extra UDIV instruction removed in CSE pass.
-(UMOD <typ.UInt64> x y) => (MSUB <typ.UInt64> x y (UDIV <typ.UInt64> x y))
+(UMOD  <typ.UInt64> x y) => (MSUB <typ.UInt64> x y (UDIV <typ.UInt64> x y))
 (UMODW <typ.UInt32> x y) => (MSUBW <typ.UInt32> x y (UDIVW <typ.UInt32> x y))
 
 // 64-bit addition with carry.
@@ -128,10 +127,10 @@
 
 // boolean ops -- booleans are represented with 0=false, 1=true
 (AndB ...) => (AND ...)
-(OrB ...) => (OR ...)
-(EqB x y) => (XOR (MOVDconst [1]) (XOR <typ.Bool> x y))
+(OrB  ...) => (OR ...)
+(EqB  x y) => (XOR (MOVDconst [1]) (XOR <typ.Bool> x y))
 (NeqB ...) => (XOR ...)
-(Not x) => (XOR (MOVDconst [1]) x)
+(Not    x) => (XOR (MOVDconst [1]) x)
 
 // shifts
 // hardware instruction uses only the low 6 bits of the shift
@@ -145,7 +144,7 @@
 (Lsh(64|32|16|8)x64 <t> x y) && shiftIsBounded(v) => (SLL <t> x y)
 (Lsh(64|32|16|8)x32 <t> x y) && shiftIsBounded(v) => (SLL <t> x y)
 (Lsh(64|32|16|8)x16 <t> x y) && shiftIsBounded(v) => (SLL <t> x y)
-(Lsh(64|32|16|8)x8 <t> x y) && shiftIsBounded(v) => (SLL <t> x y)
+(Lsh(64|32|16|8)x8  <t> x y) && shiftIsBounded(v) => (SLL <t> x y)
 
 // signed right shift
 (Rsh64x(64|32|16|8) <t> x y) && shiftIsBounded(v) => (SRA <t> x y)
@@ -160,69 +159,45 @@
 (Rsh8Ux(64|32|16|8)  <t> x y) && shiftIsBounded(v) => (SRL <t> (ZeroExt8to64 x) y)
 
 // shift value may be out of range, use CMP + CSEL instead
-(Lsh64x64 <t> x y) && !shiftIsBounded(v) => (CSEL [OpARM64LessThanU] (SLL <t> x y) (Const64 <t> [0]) (CMPconst [64] y))
-(Lsh64x32 <t> x y) && !shiftIsBounded(v) => (CSEL [OpARM64LessThanU] (SLL <t> x y) (Const64 <t> [0]) (CMPconst [64] (ZeroExt32to64 y)))
-(Lsh64x16 <t> x y) && !shiftIsBounded(v) => (CSEL [OpARM64LessThanU] (SLL <t> x y) (Const64 <t> [0]) (CMPconst [64] (ZeroExt16to64 y)))
-(Lsh64x8  <t> x y) && !shiftIsBounded(v) => (CSEL [OpARM64LessThanU] (SLL <t> x y) (Const64 <t> [0]) (CMPconst [64] (ZeroExt8to64  y)))
+(Lsh64x64 <t> x y) && !shiftIsBounded(v)        => (CSEL [OpARM64LessThanU] (SLL <t> x y) (Const64 <t> [0]) (CMPconst [64] y))
+(Lsh64x(32|16|8) <t> x y) && !shiftIsBounded(v) => (CSEL [OpARM64LessThanU] (SLL <t> x y) (Const64 <t> [0]) (CMPconst [64] ((ZeroExt32to64|ZeroExt16to64|ZeroExt8to64) y)))
 
-(Lsh32x64 <t> x y) && !shiftIsBounded(v) => (CSEL [OpARM64LessThanU] (SLL <t> x y) (Const64 <t> [0]) (CMPconst [64] y))
-(Lsh32x32 <t> x y) && !shiftIsBounded(v) => (CSEL [OpARM64LessThanU] (SLL <t> x y) (Const64 <t> [0]) (CMPconst [64] (ZeroExt32to64 y)))
-(Lsh32x16 <t> x y) && !shiftIsBounded(v) => (CSEL [OpARM64LessThanU] (SLL <t> x y) (Const64 <t> [0]) (CMPconst [64] (ZeroExt16to64 y)))
-(Lsh32x8  <t> x y) && !shiftIsBounded(v) => (CSEL [OpARM64LessThanU] (SLL <t> x y) (Const64 <t> [0]) (CMPconst [64] (ZeroExt8to64  y)))
+(Lsh32x64 <t> x y) && !shiftIsBounded(v)        => (CSEL [OpARM64LessThanU] (SLL <t> x y) (Const64 <t> [0]) (CMPconst [64] y))
+(Lsh32x(32|16|8) <t> x y) && !shiftIsBounded(v) => (CSEL [OpARM64LessThanU] (SLL <t> x y) (Const64 <t> [0]) (CMPconst [64] ((ZeroExt32to64|ZeroExt16to64|ZeroExt8to64) y)))
 
-(Lsh16x64 <t> x y) && !shiftIsBounded(v) => (CSEL [OpARM64LessThanU] (SLL <t> x y) (Const64 <t> [0]) (CMPconst [64] y))
-(Lsh16x32 <t> x y) && !shiftIsBounded(v) => (CSEL [OpARM64LessThanU] (SLL <t> x y) (Const64 <t> [0]) (CMPconst [64] (ZeroExt32to64 y)))
-(Lsh16x16 <t> x y) && !shiftIsBounded(v) => (CSEL [OpARM64LessThanU] (SLL <t> x y) (Const64 <t> [0]) (CMPconst [64] (ZeroExt16to64 y)))
-(Lsh16x8  <t> x y) && !shiftIsBounded(v) => (CSEL [OpARM64LessThanU] (SLL <t> x y) (Const64 <t> [0]) (CMPconst [64] (ZeroExt8to64  y)))
+(Lsh16x64 <t> x y) && !shiftIsBounded(v)        => (CSEL [OpARM64LessThanU] (SLL <t> x y) (Const64 <t> [0]) (CMPconst [64] y))
+(Lsh16x(32|16|8) <t> x y) && !shiftIsBounded(v) => (CSEL [OpARM64LessThanU] (SLL <t> x y) (Const64 <t> [0]) (CMPconst [64] ((ZeroExt32to64|ZeroExt16to64|ZeroExt8to64) y)))
 
-(Lsh8x64 <t> x y) && !shiftIsBounded(v) => (CSEL [OpARM64LessThanU] (SLL <t> x y) (Const64 <t> [0]) (CMPconst [64] y))
-(Lsh8x32 <t> x y) && !shiftIsBounded(v) => (CSEL [OpARM64LessThanU] (SLL <t> x y) (Const64 <t> [0]) (CMPconst [64] (ZeroExt32to64 y)))
-(Lsh8x16 <t> x y) && !shiftIsBounded(v) => (CSEL [OpARM64LessThanU] (SLL <t> x y) (Const64 <t> [0]) (CMPconst [64] (ZeroExt16to64 y)))
-(Lsh8x8  <t> x y) && !shiftIsBounded(v) => (CSEL [OpARM64LessThanU] (SLL <t> x y) (Const64 <t> [0]) (CMPconst [64] (ZeroExt8to64  y)))
+(Lsh8x64 <t> x y) && !shiftIsBounded(v)        => (CSEL [OpARM64LessThanU] (SLL <t> x y) (Const64 <t> [0]) (CMPconst [64] y))
+(Lsh8x(32|16|8) <t> x y) && !shiftIsBounded(v) => (CSEL [OpARM64LessThanU] (SLL <t> x y) (Const64 <t> [0]) (CMPconst [64] ((ZeroExt32to64|ZeroExt16to64|ZeroExt8to64) y)))
 
-(Rsh64Ux64 <t> x y) && !shiftIsBounded(v) => (CSEL [OpARM64LessThanU] (SRL <t> x y) (Const64 <t> [0]) (CMPconst [64] y))
-(Rsh64Ux32 <t> x y) && !shiftIsBounded(v) => (CSEL [OpARM64LessThanU] (SRL <t> x y) (Const64 <t> [0]) (CMPconst [64] (ZeroExt32to64 y)))
-(Rsh64Ux16 <t> x y) && !shiftIsBounded(v) => (CSEL [OpARM64LessThanU] (SRL <t> x y) (Const64 <t> [0]) (CMPconst [64] (ZeroExt16to64 y)))
-(Rsh64Ux8  <t> x y) && !shiftIsBounded(v) => (CSEL [OpARM64LessThanU] (SRL <t> x y) (Const64 <t> [0]) (CMPconst [64] (ZeroExt8to64  y)))
+(Rsh64Ux64 <t> x y) && !shiftIsBounded(v)        => (CSEL [OpARM64LessThanU] (SRL <t> x y) (Const64 <t> [0]) (CMPconst [64] y))
+(Rsh64Ux(32|16|8) <t> x y) && !shiftIsBounded(v) => (CSEL [OpARM64LessThanU] (SRL <t> x y) (Const64 <t> [0]) (CMPconst [64] ((ZeroExt32to64|ZeroExt16to64|ZeroExt8to64) y)))
 
-(Rsh32Ux64 <t> x y) && !shiftIsBounded(v) => (CSEL [OpARM64LessThanU] (SRL <t> (ZeroExt32to64 x) y) (Const64 <t> [0]) (CMPconst [64] y))
-(Rsh32Ux32 <t> x y) && !shiftIsBounded(v) => (CSEL [OpARM64LessThanU] (SRL <t> (ZeroExt32to64 x) y) (Const64 <t> [0]) (CMPconst [64] (ZeroExt32to64 y)))
-(Rsh32Ux16 <t> x y) && !shiftIsBounded(v) => (CSEL [OpARM64LessThanU] (SRL <t> (ZeroExt32to64 x) y) (Const64 <t> [0]) (CMPconst [64] (ZeroExt16to64 y)))
-(Rsh32Ux8  <t> x y) && !shiftIsBounded(v) => (CSEL [OpARM64LessThanU] (SRL <t> (ZeroExt32to64 x) y) (Const64 <t> [0]) (CMPconst [64] (ZeroExt8to64  y)))
+(Rsh32Ux64 <t> x y) && !shiftIsBounded(v)        => (CSEL [OpARM64LessThanU] (SRL <t> (ZeroExt32to64 x) y) (Const64 <t> [0]) (CMPconst [64] y))
+(Rsh32Ux(32|16|8) <t> x y) && !shiftIsBounded(v) => (CSEL [OpARM64LessThanU] (SRL <t> (ZeroExt32to64 x) y) (Const64 <t> [0]) (CMPconst [64] ((ZeroExt32to64|ZeroExt16to64|ZeroExt8to64) y)))
 
-(Rsh16Ux64 <t> x y) && !shiftIsBounded(v) => (CSEL [OpARM64LessThanU] (SRL <t> (ZeroExt16to64 x) y) (Const64 <t> [0]) (CMPconst [64] y))
-(Rsh16Ux32 <t> x y) && !shiftIsBounded(v) => (CSEL [OpARM64LessThanU] (SRL <t> (ZeroExt16to64 x) y) (Const64 <t> [0]) (CMPconst [64] (ZeroExt32to64 y)))
-(Rsh16Ux16 <t> x y) && !shiftIsBounded(v) => (CSEL [OpARM64LessThanU] (SRL <t> (ZeroExt16to64 x) y) (Const64 <t> [0]) (CMPconst [64] (ZeroExt16to64 y)))
-(Rsh16Ux8  <t> x y) && !shiftIsBounded(v) => (CSEL [OpARM64LessThanU] (SRL <t> (ZeroExt16to64 x) y) (Const64 <t> [0]) (CMPconst [64] (ZeroExt8to64  y)))
+(Rsh16Ux64 <t> x y) && !shiftIsBounded(v)        => (CSEL [OpARM64LessThanU] (SRL <t> (ZeroExt16to64 x) y) (Const64 <t> [0]) (CMPconst [64] y))
+(Rsh16Ux(32|16|8) <t> x y) && !shiftIsBounded(v) => (CSEL [OpARM64LessThanU] (SRL <t> (ZeroExt16to64 x) y) (Const64 <t> [0]) (CMPconst [64] ((ZeroExt32to64|ZeroExt16to64|ZeroExt8to64) y)))
 
-(Rsh8Ux64 <t> x y) && !shiftIsBounded(v) => (CSEL [OpARM64LessThanU] (SRL <t> (ZeroExt8to64 x) y) (Const64 <t> [0]) (CMPconst [64] y))
-(Rsh8Ux32 <t> x y) && !shiftIsBounded(v) => (CSEL [OpARM64LessThanU] (SRL <t> (ZeroExt8to64 x) y) (Const64 <t> [0]) (CMPconst [64] (ZeroExt32to64 y)))
-(Rsh8Ux16 <t> x y) && !shiftIsBounded(v) => (CSEL [OpARM64LessThanU] (SRL <t> (ZeroExt8to64 x) y) (Const64 <t> [0]) (CMPconst [64] (ZeroExt16to64 y)))
-(Rsh8Ux8  <t> x y) && !shiftIsBounded(v) => (CSEL [OpARM64LessThanU] (SRL <t> (ZeroExt8to64 x) y) (Const64 <t> [0]) (CMPconst [64] (ZeroExt8to64  y)))
+(Rsh8Ux64 <t> x y) && !shiftIsBounded(v)        => (CSEL [OpARM64LessThanU] (SRL <t> (ZeroExt8to64 x) y) (Const64 <t> [0]) (CMPconst [64] y))
+(Rsh8Ux(32|16|8) <t> x y) && !shiftIsBounded(v) => (CSEL [OpARM64LessThanU] (SRL <t> (ZeroExt8to64 x) y) (Const64 <t> [0]) (CMPconst [64] ((ZeroExt32to64|ZeroExt16to64|ZeroExt8to64) y)))
 
-(Rsh64x64 x y) && !shiftIsBounded(v) => (SRA x (CSEL [OpARM64LessThanU] <y.Type> y (Const64 <y.Type> [63]) (CMPconst [64] y)))
-(Rsh64x32 x y) && !shiftIsBounded(v) => (SRA x (CSEL [OpARM64LessThanU] <y.Type> y (Const64 <y.Type> [63]) (CMPconst [64] (ZeroExt32to64 y))))
-(Rsh64x16 x y) && !shiftIsBounded(v) => (SRA x (CSEL [OpARM64LessThanU] <y.Type> y (Const64 <y.Type> [63]) (CMPconst [64] (ZeroExt16to64 y))))
-(Rsh64x8  x y) && !shiftIsBounded(v) => (SRA x (CSEL [OpARM64LessThanU] <y.Type> y (Const64 <y.Type> [63]) (CMPconst [64] (ZeroExt8to64  y))))
+(Rsh64x64 x y) && !shiftIsBounded(v)        => (SRA x (CSEL [OpARM64LessThanU] <y.Type> y (Const64 <y.Type> [63]) (CMPconst [64] y)))
+(Rsh64x(32|16|8) x y) && !shiftIsBounded(v) => (SRA x (CSEL [OpARM64LessThanU] <y.Type> y (Const64 <y.Type> [63]) (CMPconst [64] ((ZeroExt32to64|ZeroExt16to64|ZeroExt8to64) y))))
 
-(Rsh32x64 x y) && !shiftIsBounded(v) => (SRA (SignExt32to64 x) (CSEL [OpARM64LessThanU] <y.Type> y (Const64 <y.Type> [63]) (CMPconst [64] y)))
-(Rsh32x32 x y) && !shiftIsBounded(v) => (SRA (SignExt32to64 x) (CSEL [OpARM64LessThanU] <y.Type> y (Const64 <y.Type> [63]) (CMPconst [64] (ZeroExt32to64 y))))
-(Rsh32x16 x y) && !shiftIsBounded(v) => (SRA (SignExt32to64 x) (CSEL [OpARM64LessThanU] <y.Type> y (Const64 <y.Type> [63]) (CMPconst [64] (ZeroExt16to64 y))))
-(Rsh32x8  x y) && !shiftIsBounded(v) => (SRA (SignExt32to64 x) (CSEL [OpARM64LessThanU] <y.Type> y (Const64 <y.Type> [63]) (CMPconst [64] (ZeroExt8to64  y))))
+(Rsh32x64 x y) && !shiftIsBounded(v)        => (SRA (SignExt32to64 x) (CSEL [OpARM64LessThanU] <y.Type> y (Const64 <y.Type> [63]) (CMPconst [64] y)))
+(Rsh32x(32|16|8) x y) && !shiftIsBounded(v) => (SRA (SignExt32to64 x) (CSEL [OpARM64LessThanU] <y.Type> y (Const64 <y.Type> [63]) (CMPconst [64] ((ZeroExt32to64|ZeroExt16to64|ZeroExt8to64) y))))
 
-(Rsh16x64 x y) && !shiftIsBounded(v) => (SRA (SignExt16to64 x) (CSEL [OpARM64LessThanU] <y.Type> y (Const64 <y.Type> [63]) (CMPconst [64] y)))
-(Rsh16x32 x y) && !shiftIsBounded(v) => (SRA (SignExt16to64 x) (CSEL [OpARM64LessThanU] <y.Type> y (Const64 <y.Type> [63]) (CMPconst [64] (ZeroExt32to64 y))))
-(Rsh16x16 x y) && !shiftIsBounded(v) => (SRA (SignExt16to64 x) (CSEL [OpARM64LessThanU] <y.Type> y (Const64 <y.Type> [63]) (CMPconst [64] (ZeroExt16to64 y))))
-(Rsh16x8  x y) && !shiftIsBounded(v) => (SRA (SignExt16to64 x) (CSEL [OpARM64LessThanU] <y.Type> y (Const64 <y.Type> [63]) (CMPconst [64] (ZeroExt8to64  y))))
+(Rsh16x64 x y) && !shiftIsBounded(v)        => (SRA (SignExt16to64 x) (CSEL [OpARM64LessThanU] <y.Type> y (Const64 <y.Type> [63]) (CMPconst [64] y)))
+(Rsh16x(32|16|8) x y) && !shiftIsBounded(v) => (SRA (SignExt16to64 x) (CSEL [OpARM64LessThanU] <y.Type> y (Const64 <y.Type> [63]) (CMPconst [64] ((ZeroExt32to64|ZeroExt16to64|ZeroExt8to64) y))))
 
-(Rsh8x64 x y) && !shiftIsBounded(v) => (SRA (SignExt8to64 x) (CSEL [OpARM64LessThanU] <y.Type> y (Const64 <y.Type> [63]) (CMPconst [64] y)))
-(Rsh8x32 x y) && !shiftIsBounded(v) => (SRA (SignExt8to64 x) (CSEL [OpARM64LessThanU] <y.Type> y (Const64 <y.Type> [63]) (CMPconst [64] (ZeroExt32to64 y))))
-(Rsh8x16 x y) && !shiftIsBounded(v) => (SRA (SignExt8to64 x) (CSEL [OpARM64LessThanU] <y.Type> y (Const64 <y.Type> [63]) (CMPconst [64] (ZeroExt16to64 y))))
-(Rsh8x8  x y) && !shiftIsBounded(v) => (SRA (SignExt8to64 x) (CSEL [OpARM64LessThanU] <y.Type> y (Const64 <y.Type> [63]) (CMPconst [64] (ZeroExt8to64  y))))
+(Rsh8x64 x y) && !shiftIsBounded(v)        => (SRA (SignExt8to64 x) (CSEL [OpARM64LessThanU] <y.Type> y (Const64 <y.Type> [63]) (CMPconst [64] y)))
+(Rsh8x(32|16|8) x y) && !shiftIsBounded(v) => (SRA (SignExt8to64 x) (CSEL [OpARM64LessThanU] <y.Type> y (Const64 <y.Type> [63]) (CMPconst [64] ((ZeroExt32to64|ZeroExt16to64|ZeroExt8to64) y))))
 
 // constants
 (Const(64|32|16|8) [val]) => (MOVDconst [int64(val)])
-(Const(32F|64F) [val]) => (FMOV(S|D)const [float64(val)])
+(Const(32|64)F    [val]) => (FMOV(S|D)const [float64(val)])
 (ConstNil) => (MOVDconst [0])
 (ConstBool [t]) => (MOVDconst [b2i(t)])
 
@@ -230,41 +205,41 @@
 
 // truncations
 // Because we ignore high parts of registers, truncates are just copies.
-(Trunc16to8 ...) => (Copy ...)
-(Trunc32to8 ...) => (Copy ...)
+(Trunc16to8  ...) => (Copy ...)
+(Trunc32to8  ...) => (Copy ...)
 (Trunc32to16 ...) => (Copy ...)
-(Trunc64to8 ...) => (Copy ...)
+(Trunc64to8  ...) => (Copy ...)
 (Trunc64to16 ...) => (Copy ...)
 (Trunc64to32 ...) => (Copy ...)
 
 // Zero-/Sign-extensions
-(ZeroExt8to16 ...) => (MOVBUreg ...)
-(ZeroExt8to32 ...) => (MOVBUreg ...)
+(ZeroExt8to16  ...) => (MOVBUreg ...)
+(ZeroExt8to32  ...) => (MOVBUreg ...)
 (ZeroExt16to32 ...) => (MOVHUreg ...)
-(ZeroExt8to64 ...) => (MOVBUreg ...)
+(ZeroExt8to64  ...) => (MOVBUreg ...)
 (ZeroExt16to64 ...) => (MOVHUreg ...)
 (ZeroExt32to64 ...) => (MOVWUreg ...)
 
-(SignExt8to16 ...) => (MOVBreg ...)
-(SignExt8to32 ...) => (MOVBreg ...)
+(SignExt8to16  ...) => (MOVBreg ...)
+(SignExt8to32  ...) => (MOVBreg ...)
 (SignExt16to32 ...) => (MOVHreg ...)
-(SignExt8to64 ...) => (MOVBreg ...)
+(SignExt8to64  ...) => (MOVBreg ...)
 (SignExt16to64 ...) => (MOVHreg ...)
 (SignExt32to64 ...) => (MOVWreg ...)
 
 // float <=> int conversion
-(Cvt32to32F ...) => (SCVTFWS ...)
-(Cvt32to64F ...) => (SCVTFWD ...)
-(Cvt64to32F ...) => (SCVTFS ...)
-(Cvt64to64F ...) => (SCVTFD ...)
+(Cvt32to32F  ...) => (SCVTFWS ...)
+(Cvt32to64F  ...) => (SCVTFWD ...)
+(Cvt64to32F  ...) => (SCVTFS ...)
+(Cvt64to64F  ...) => (SCVTFD ...)
 (Cvt32Uto32F ...) => (UCVTFWS ...)
 (Cvt32Uto64F ...) => (UCVTFWD ...)
 (Cvt64Uto32F ...) => (UCVTFS ...)
 (Cvt64Uto64F ...) => (UCVTFD ...)
-(Cvt32Fto32 ...) => (FCVTZSSW ...)
-(Cvt64Fto32 ...) => (FCVTZSDW ...)
-(Cvt32Fto64 ...) => (FCVTZSS ...)
-(Cvt64Fto64 ...) => (FCVTZSD ...)
+(Cvt32Fto32  ...) => (FCVTZSSW ...)
+(Cvt64Fto32  ...) => (FCVTZSDW ...)
+(Cvt32Fto64  ...) => (FCVTZSS ...)
+(Cvt64Fto64  ...) => (FCVTZSD ...)
 (Cvt32Fto32U ...) => (FCVTZUSW ...)
 (Cvt64Fto32U ...) => (FCVTZUDW ...)
 (Cvt32Fto64U ...) => (FCVTZUS ...)
@@ -278,26 +253,24 @@
 (Round64F ...) => (LoweredRound64F ...)
 
 // comparisons
-(Eq8 x y)  => (Equal (CMPW (ZeroExt8to32 x) (ZeroExt8to32 y)))
-(Eq16 x y) => (Equal (CMPW (ZeroExt16to32 x) (ZeroExt16to32 y)))
-(Eq32 x y) => (Equal (CMPW x y))
-(Eq64 x y) => (Equal (CMP x y))
-(EqPtr x y) => (Equal (CMP x y))
+(Eq8  x y)  => (Equal (CMPW (ZeroExt8to32  x) (ZeroExt8to32  y)))
+(Eq16  x y) => (Equal (CMPW (ZeroExt16to32 x) (ZeroExt16to32 y)))
+(Eq32  x y) => (Equal (CMPW  x y))
+(Eq64  x y) => (Equal (CMP   x y))
+(EqPtr x y) => (Equal (CMP   x y))
 (Eq32F x y) => (Equal (FCMPS x y))
 (Eq64F x y) => (Equal (FCMPD x y))
 
-(Neq8 x y)  => (NotEqual (CMPW (ZeroExt8to32 x) (ZeroExt8to32 y)))
-(Neq16 x y) => (NotEqual (CMPW (ZeroExt16to32 x) (ZeroExt16to32 y)))
-(Neq32 x y) => (NotEqual (CMPW x y))
-(Neq64 x y) => (NotEqual (CMP x y))
-(NeqPtr x y) => (NotEqual (CMP x y))
-(Neq32F x y) => (NotEqual (FCMPS x y))
-(Neq64F x y) => (NotEqual (FCMPD x y))
+(Neq8   x y) => (NotEqual (CMPW (ZeroExt8to32  x) (ZeroExt8to32  y)))
+(Neq16  x y) => (NotEqual (CMPW (ZeroExt16to32 x) (ZeroExt16to32 y)))
+(Neq32  x y) => (NotEqual (CMPW  x y))
+(Neq64  x y) => (NotEqual (CMP   x y))
+(NeqPtr x y) => (NotEqual (CMP   x y))
+(Neq(32|64)F x y) => (NotEqual (FCMP(S|D) x y))
 
-(Less8 x y)  => (LessThan (CMPW (SignExt8to32 x) (SignExt8to32 y)))
-(Less16 x y) => (LessThan (CMPW (SignExt16to32 x) (SignExt16to32 y)))
+(Less(8|16) x y) => (LessThan (CMPW (SignExt(8|16)to32 x) (SignExt(8|16)to32 y)))
 (Less32 x y) => (LessThan (CMPW x y))
-(Less64 x y) => (LessThan (CMP x y))
+(Less64 x y) => (LessThan (CMP  x y))
 
 // Set condition flags for floating-point comparisons "x < y"
 // and "x <= y". Because if either or both of the operands are
@@ -313,16 +286,16 @@
 // x <  1  =>  x == 0
 // 1 <= x  =>  x != 0
 (Less(8U|16U|32U|64U) zero:(MOVDconst [0]) x) => (Neq(8|16|32|64) zero x)
-(Leq(8U|16U|32U|64U) x zero:(MOVDconst [0]))  => (Eq(8|16|32|64) x zero)
-(Less(8U|16U|32U|64U) x (MOVDconst [1])) => (Eq(8|16|32|64) x (MOVDconst [0]))
-(Leq(8U|16U|32U|64U) (MOVDconst [1]) x)  => (Neq(8|16|32|64) (MOVDconst [0]) x)
+(Leq(8U|16U|32U|64U)  x zero:(MOVDconst [0])) => (Eq(8|16|32|64)  x zero)
+(Less(8U|16U|32U|64U) x (MOVDconst [1])) => (Eq(8|16|32|64)  x (MOVDconst [0]))
+(Leq(8U|16U|32U|64U)  (MOVDconst [1]) x) => (Neq(8|16|32|64) (MOVDconst [0]) x)
 
-(Less8U x y)  => (LessThanU (CMPW (ZeroExt8to32 x) (ZeroExt8to32 y)))
+(Less8U  x y) => (LessThanU (CMPW (ZeroExt8to32  x) (ZeroExt8to32  y)))
 (Less16U x y) => (LessThanU (CMPW (ZeroExt16to32 x) (ZeroExt16to32 y)))
 (Less32U x y) => (LessThanU (CMPW x y))
 (Less64U x y) => (LessThanU (CMP x y))
 
-(Leq8 x y)  => (LessEqual (CMPW (SignExt8to32 x) (SignExt8to32 y)))
+(Leq8  x y) => (LessEqual (CMPW (SignExt8to32  x) (SignExt8to32  y)))
 (Leq16 x y) => (LessEqual (CMPW (SignExt16to32 x) (SignExt16to32 y)))
 (Leq32 x y) => (LessEqual (CMPW x y))
 (Leq64 x y) => (LessEqual (CMP x y))
@@ -331,7 +304,7 @@
 (Leq32F x y) => (LessEqualF (FCMPS x y))
 (Leq64F x y) => (LessEqualF (FCMPD x y))
 
-(Leq8U x y)  => (LessEqualU (CMPW (ZeroExt8to32 x) (ZeroExt8to32 y)))
+(Leq8U  x y) => (LessEqualU (CMPW (ZeroExt8to32  x) (ZeroExt8to32  y)))
 (Leq16U x y) => (LessEqualU (CMPW (ZeroExt16to32 x) (ZeroExt16to32 y)))
 (Leq32U x y) => (LessEqualU (CMPW x y))
 (Leq64U x y) => (LessEqualU (CMP x y))
@@ -350,16 +323,17 @@
 (OffPtr [off] ptr) => (ADDconst [off] ptr)
 
 (Addr {sym} base) => (MOVDaddr {sym} base)
-(LocalAddr {sym} base _) => (MOVDaddr {sym} base)
+(LocalAddr <t> {sym} base mem) && t.Elem().HasPointers() => (MOVDaddr {sym} (SPanchored base mem))
+(LocalAddr <t> {sym} base _)  && !t.Elem().HasPointers() => (MOVDaddr {sym} base)
 
 // loads
 (Load <t> ptr mem) && t.IsBoolean() => (MOVBUload ptr mem)
-(Load <t> ptr mem) && (is8BitInt(t)  && isSigned(t))  => (MOVBload ptr mem)
-(Load <t> ptr mem) && (is8BitInt(t)  && !isSigned(t)) => (MOVBUload ptr mem)
-(Load <t> ptr mem) && (is16BitInt(t) && isSigned(t))  => (MOVHload ptr mem)
-(Load <t> ptr mem) && (is16BitInt(t) && !isSigned(t)) => (MOVHUload ptr mem)
-(Load <t> ptr mem) && (is32BitInt(t) && isSigned(t))  => (MOVWload ptr mem)
-(Load <t> ptr mem) && (is32BitInt(t) && !isSigned(t)) => (MOVWUload ptr mem)
+(Load <t> ptr mem) && (is8BitInt(t)  &&  t.IsSigned()) => (MOVBload ptr mem)
+(Load <t> ptr mem) && (is8BitInt(t)  && !t.IsSigned()) => (MOVBUload ptr mem)
+(Load <t> ptr mem) && (is16BitInt(t) &&  t.IsSigned()) => (MOVHload ptr mem)
+(Load <t> ptr mem) && (is16BitInt(t) && !t.IsSigned()) => (MOVHUload ptr mem)
+(Load <t> ptr mem) && (is32BitInt(t) &&  t.IsSigned()) => (MOVWload ptr mem)
+(Load <t> ptr mem) && (is32BitInt(t) && !t.IsSigned()) => (MOVWUload ptr mem)
 (Load <t> ptr mem) && (is64BitInt(t) || isPtr(t)) => (MOVDload ptr mem)
 (Load <t> ptr mem) && is32BitFloat(t) => (FMOVSload ptr mem)
 (Load <t> ptr mem) && is64BitFloat(t) => (FMOVDload ptr mem)
@@ -367,13 +341,13 @@
 // stores
 (Store {t} ptr val mem) && t.Size() == 1 => (MOVBstore ptr val mem)
 (Store {t} ptr val mem) && t.Size() == 2 => (MOVHstore ptr val mem)
-(Store {t} ptr val mem) && t.Size() == 4 && !is32BitFloat(val.Type) => (MOVWstore ptr val mem)
-(Store {t} ptr val mem) && t.Size() == 8 && !is64BitFloat(val.Type) => (MOVDstore ptr val mem)
-(Store {t} ptr val mem) && t.Size() == 4 && is32BitFloat(val.Type) => (FMOVSstore ptr val mem)
-(Store {t} ptr val mem) && t.Size() == 8 && is64BitFloat(val.Type) => (FMOVDstore ptr val mem)
+(Store {t} ptr val mem) && t.Size() == 4 && !t.IsFloat() => (MOVWstore ptr val mem)
+(Store {t} ptr val mem) && t.Size() == 8 && !t.IsFloat() => (MOVDstore ptr val mem)
+(Store {t} ptr val mem) && t.Size() == 4 &&  t.IsFloat() => (FMOVSstore ptr val mem)
+(Store {t} ptr val mem) && t.Size() == 8 &&  t.IsFloat() => (FMOVDstore ptr val mem)
 
 // zeroing
-(Zero [0] _ mem) => mem
+(Zero [0] _   mem) => mem
 (Zero [1] ptr mem) => (MOVBstore ptr (MOVDconst [0]) mem)
 (Zero [2] ptr mem) => (MOVHstore ptr (MOVDconst [0]) mem)
 (Zero [4] ptr mem) => (MOVWstore ptr (MOVDconst [0]) mem)
@@ -455,7 +429,7 @@
 		mem)
 
 // moves
-(Move [0] _ _ mem) => mem
+(Move [0] _   _   mem) => mem
 (Move [1] dst src mem) => (MOVBstore dst (MOVBUload src mem) mem)
 (Move [2] dst src mem) => (MOVHstore dst (MOVHUload src mem) mem)
 (Move [3] dst src mem) =>
@@ -508,6 +482,9 @@
 			(STP [16] dst (Select0 <typ.UInt64> (LDP [16] src mem)) (Select1 <typ.UInt64> (LDP [16] src mem))
 				(STP dst (Select0 <typ.UInt64> (LDP src mem)) (Select1 <typ.UInt64> (LDP src mem)) mem))))
 
+(MOVDstorezero {s} [i] ptr x:(MOVDstorezero {s} [i+8] ptr mem)) && x.Uses == 1 && clobber(x) => (MOVQstorezero {s} [i] ptr mem)
+(MOVDstorezero {s} [i] ptr x:(MOVDstorezero {s} [i-8] ptr mem)) && x.Uses == 1 && clobber(x) => (MOVQstorezero {s} [i-8] ptr mem)
+
 // strip off fractional word move
 (Move [s] dst src mem) && s%16 != 0 && s%16 <= 8 && s > 16 =>
 	(Move [8]
@@ -543,36 +520,36 @@
 		mem)
 
 // calls
-(StaticCall ...) => (CALLstatic ...)
+(StaticCall  ...) => (CALLstatic  ...)
 (ClosureCall ...) => (CALLclosure ...)
-(InterCall ...) => (CALLinter ...)
-(TailCall ...) => (CALLtail ...)
+(InterCall   ...) => (CALLinter   ...)
+(TailCall    ...) => (CALLtail    ...)
 
 // checks
 (NilCheck ...) => (LoweredNilCheck ...)
 (IsNonNil ptr) => (NotEqual (CMPconst [0] ptr))
-(IsInBounds idx len) => (LessThanU (CMP idx len))
+(IsInBounds      idx len) => (LessThanU  (CMP idx len))
 (IsSliceInBounds idx len) => (LessEqualU (CMP idx len))
 
 // pseudo-ops
 (GetClosurePtr ...) => (LoweredGetClosurePtr ...)
-(GetCallerSP ...) => (LoweredGetCallerSP ...)
-(GetCallerPC ...) => (LoweredGetCallerPC ...)
+(GetCallerSP   ...) => (LoweredGetCallerSP   ...)
+(GetCallerPC   ...) => (LoweredGetCallerPC   ...)
 
 // Absorb pseudo-ops into blocks.
-(If (Equal cc) yes no) => (EQ cc yes no)
-(If (NotEqual cc) yes no) => (NE cc yes no)
-(If (LessThan cc) yes no) => (LT cc yes no)
-(If (LessThanU cc) yes no) => (ULT cc yes no)
-(If (LessEqual cc) yes no) => (LE cc yes no)
-(If (LessEqualU cc) yes no) => (ULE cc yes no)
-(If (GreaterThan cc) yes no) => (GT cc yes no)
-(If (GreaterThanU cc) yes no) => (UGT cc yes no)
-(If (GreaterEqual cc) yes no) => (GE cc yes no)
+(If (Equal         cc) yes no) => (EQ cc yes no)
+(If (NotEqual      cc) yes no) => (NE cc yes no)
+(If (LessThan      cc) yes no) => (LT cc yes no)
+(If (LessThanU     cc) yes no) => (ULT cc yes no)
+(If (LessEqual     cc) yes no) => (LE cc yes no)
+(If (LessEqualU    cc) yes no) => (ULE cc yes no)
+(If (GreaterThan   cc) yes no) => (GT cc yes no)
+(If (GreaterThanU  cc) yes no) => (UGT cc yes no)
+(If (GreaterEqual  cc) yes no) => (GE cc yes no)
 (If (GreaterEqualU cc) yes no) => (UGE cc yes no)
-(If (LessThanF cc) yes no) => (FLT cc yes no)
-(If (LessEqualF cc) yes no) => (FLE cc yes no)
-(If (GreaterThanF cc) yes no) => (FGT cc yes no)
+(If (LessThanF     cc) yes no) => (FLT cc yes no)
+(If (LessEqualF    cc) yes no) => (FLE cc yes no)
+(If (GreaterThanF  cc) yes no) => (FGT cc yes no)
 (If (GreaterEqualF cc) yes no) => (FGE cc yes no)
 
 (If cond yes no) => (TBNZ [0] cond yes no)
@@ -592,23 +569,18 @@
 (AtomicStorePtrNoWB ...) => (STLR  ...)
 
 (AtomicExchange(32|64)       ...) => (LoweredAtomicExchange(32|64) ...)
-(AtomicAdd(32|64)            ...) => (LoweredAtomicAdd(32|64) ...)
-(AtomicCompareAndSwap(32|64) ...) => (LoweredAtomicCas(32|64) ...)
+(AtomicAdd(32|64)            ...) => (LoweredAtomicAdd(32|64)      ...)
+(AtomicCompareAndSwap(32|64) ...) => (LoweredAtomicCas(32|64)      ...)
 
 (AtomicAdd(32|64)Variant            ...) => (LoweredAtomicAdd(32|64)Variant      ...)
 (AtomicExchange(32|64)Variant       ...) => (LoweredAtomicExchange(32|64)Variant ...)
 (AtomicCompareAndSwap(32|64)Variant ...) => (LoweredAtomicCas(32|64)Variant      ...)
 
 // Currently the updated value is not used, but we need a register to temporarily hold it.
-(AtomicAnd8  ptr val mem) => (Select1 (LoweredAtomicAnd8  ptr val mem))
-(AtomicAnd32 ptr val mem) => (Select1 (LoweredAtomicAnd32 ptr val mem))
-(AtomicOr8   ptr val mem) => (Select1 (LoweredAtomicOr8   ptr val mem))
-(AtomicOr32  ptr val mem) => (Select1 (LoweredAtomicOr32  ptr val mem))
-
-(AtomicAnd8Variant  ptr val mem) => (Select1 (LoweredAtomicAnd8Variant  ptr val mem))
-(AtomicAnd32Variant ptr val mem) => (Select1 (LoweredAtomicAnd32Variant ptr val mem))
-(AtomicOr8Variant   ptr val mem) => (Select1 (LoweredAtomicOr8Variant   ptr val mem))
-(AtomicOr32Variant  ptr val mem) => (Select1 (LoweredAtomicOr32Variant  ptr val mem))
+(AtomicAnd(8|32)         ptr val mem) => (Select1 (LoweredAtomicAnd(8|32)         ptr val mem))
+(AtomicOr(8|32)          ptr val mem) => (Select1 (LoweredAtomicOr(8|32)          ptr val mem))
+(AtomicAnd(8|32)Variant  ptr val mem) => (Select1 (LoweredAtomicAnd(8|32)Variant  ptr val mem))
+(AtomicOr(8|32)Variant   ptr val mem) => (Select1 (LoweredAtomicOr(8|32)Variant   ptr val mem))
 
 // Write barrier.
 (WB ...) => (LoweredWB ...)
@@ -623,239 +595,139 @@
 // Optimizations
 
 // Absorb boolean tests into block
-(NZ (Equal cc) yes no) => (EQ cc yes no)
-(NZ (NotEqual cc) yes no) => (NE cc yes no)
-(NZ (LessThan cc) yes no) => (LT cc yes no)
-(NZ (LessThanU cc) yes no) => (ULT cc yes no)
-(NZ (LessEqual cc) yes no) => (LE cc yes no)
-(NZ (LessEqualU cc) yes no) => (ULE cc yes no)
-(NZ (GreaterThan cc) yes no) => (GT cc yes no)
-(NZ (GreaterThanU cc) yes no) => (UGT cc yes no)
-(NZ (GreaterEqual cc) yes no) => (GE cc yes no)
+(NZ (Equal         cc) yes no) => (EQ  cc yes no)
+(NZ (NotEqual      cc) yes no) => (NE  cc yes no)
+(NZ (LessThan      cc) yes no) => (LT  cc yes no)
+(NZ (LessThanU     cc) yes no) => (ULT cc yes no)
+(NZ (LessEqual     cc) yes no) => (LE  cc yes no)
+(NZ (LessEqualU    cc) yes no) => (ULE cc yes no)
+(NZ (GreaterThan   cc) yes no) => (GT  cc yes no)
+(NZ (GreaterThanU  cc) yes no) => (UGT cc yes no)
+(NZ (GreaterEqual  cc) yes no) => (GE  cc yes no)
 (NZ (GreaterEqualU cc) yes no) => (UGE cc yes no)
-(NZ (LessThanF cc) yes no) => (FLT cc yes no)
-(NZ (LessEqualF cc) yes no) => (FLE cc yes no)
-(NZ (GreaterThanF cc) yes no) => (FGT cc yes no)
+(NZ (LessThanF     cc) yes no) => (FLT cc yes no)
+(NZ (LessEqualF    cc) yes no) => (FLE cc yes no)
+(NZ (GreaterThanF  cc) yes no) => (FGT cc yes no)
 (NZ (GreaterEqualF cc) yes no) => (FGE cc yes no)
 
-(TBNZ [0] (Equal cc) yes no) => (EQ cc yes no)
-(TBNZ [0] (NotEqual cc) yes no) => (NE cc yes no)
-(TBNZ [0] (LessThan cc) yes no) => (LT cc yes no)
-(TBNZ [0] (LessThanU cc) yes no) => (ULT cc yes no)
-(TBNZ [0] (LessEqual cc) yes no) => (LE cc yes no)
-(TBNZ [0] (LessEqualU cc) yes no) => (ULE cc yes no)
-(TBNZ [0] (GreaterThan cc) yes no) => (GT cc yes no)
-(TBNZ [0] (GreaterThanU cc) yes no) => (UGT cc yes no)
-(TBNZ [0] (GreaterEqual cc) yes no) => (GE cc yes no)
+(TBNZ [0] (Equal         cc) yes no) => (EQ  cc yes no)
+(TBNZ [0] (NotEqual      cc) yes no) => (NE  cc yes no)
+(TBNZ [0] (LessThan      cc) yes no) => (LT  cc yes no)
+(TBNZ [0] (LessThanU     cc) yes no) => (ULT cc yes no)
+(TBNZ [0] (LessEqual     cc) yes no) => (LE  cc yes no)
+(TBNZ [0] (LessEqualU    cc) yes no) => (ULE cc yes no)
+(TBNZ [0] (GreaterThan   cc) yes no) => (GT  cc yes no)
+(TBNZ [0] (GreaterThanU  cc) yes no) => (UGT cc yes no)
+(TBNZ [0] (GreaterEqual  cc) yes no) => (GE  cc yes no)
 (TBNZ [0] (GreaterEqualU cc) yes no) => (UGE cc yes no)
-(TBNZ [0] (LessThanF cc) yes no) => (FLT cc yes no)
-(TBNZ [0] (LessEqualF cc) yes no) => (FLE cc yes no)
-(TBNZ [0] (GreaterThanF cc) yes no) => (FGT cc yes no)
+(TBNZ [0] (LessThanF     cc) yes no) => (FLT cc yes no)
+(TBNZ [0] (LessEqualF    cc) yes no) => (FLE cc yes no)
+(TBNZ [0] (GreaterThanF  cc) yes no) => (FGT cc yes no)
 (TBNZ [0] (GreaterEqualF cc) yes no) => (FGE cc yes no)
 
-(EQ (CMPconst [0] z:(AND x y)) yes no) && z.Uses == 1 => (EQ (TST x y) yes no)
-(NE (CMPconst [0] z:(AND x y)) yes no) && z.Uses == 1 => (NE (TST x y) yes no)
-(LT (CMPconst [0] z:(AND x y)) yes no) && z.Uses == 1 => (LT (TST x y) yes no)
-(LE (CMPconst [0] z:(AND x y)) yes no) && z.Uses == 1 => (LE (TST x y) yes no)
-(GT (CMPconst [0] z:(AND x y)) yes no) && z.Uses == 1 => (GT (TST x y) yes no)
-(GE (CMPconst [0] z:(AND x y)) yes no) && z.Uses == 1 => (GE (TST x y) yes no)
-
-(EQ (CMPconst [0] x:(ANDconst [c] y)) yes no) && x.Uses == 1 => (EQ (TSTconst [c] y) yes no)
-(NE (CMPconst [0] x:(ANDconst [c] y)) yes no) && x.Uses == 1 => (NE (TSTconst [c] y) yes no)
-(LT (CMPconst [0] x:(ANDconst [c] y)) yes no) && x.Uses == 1 => (LT (TSTconst [c] y) yes no)
-(LE (CMPconst [0] x:(ANDconst [c] y)) yes no) && x.Uses == 1 => (LE (TSTconst [c] y) yes no)
-(GT (CMPconst [0] x:(ANDconst [c] y)) yes no) && x.Uses == 1 => (GT (TSTconst [c] y) yes no)
-(GE (CMPconst [0] x:(ANDconst [c] y)) yes no) && x.Uses == 1 => (GE (TSTconst [c] y) yes no)
-
-(EQ (CMPWconst [0] z:(AND x y)) yes no) && z.Uses == 1 => (EQ (TSTW x y) yes no)
-(NE (CMPWconst [0] z:(AND x y)) yes no) && z.Uses == 1 => (NE (TSTW x y) yes no)
-(LT (CMPWconst [0] z:(AND x y)) yes no) && z.Uses == 1 => (LT (TSTW x y) yes no)
-(LE (CMPWconst [0] z:(AND x y)) yes no) && z.Uses == 1 => (LE (TSTW x y) yes no)
-(GT (CMPWconst [0] z:(AND x y)) yes no) && z.Uses == 1 => (GT (TSTW x y) yes no)
-(GE (CMPWconst [0] z:(AND x y)) yes no) && z.Uses == 1 => (GE (TSTW x y) yes no)
-
-(EQ (CMPWconst [0] x:(ANDconst [c] y)) yes no) && x.Uses == 1 => (EQ (TSTWconst [int32(c)] y) yes no)
-(NE (CMPWconst [0] x:(ANDconst [c] y)) yes no) && x.Uses == 1 => (NE (TSTWconst [int32(c)] y) yes no)
-(LT (CMPWconst [0] x:(ANDconst [c] y)) yes no) && x.Uses == 1 => (LT (TSTWconst [int32(c)] y) yes no)
-(LE (CMPWconst [0] x:(ANDconst [c] y)) yes no) && x.Uses == 1 => (LE (TSTWconst [int32(c)] y) yes no)
-(GT (CMPWconst [0] x:(ANDconst [c] y)) yes no) && x.Uses == 1 => (GT (TSTWconst [int32(c)] y) yes no)
-(GE (CMPWconst [0] x:(ANDconst [c] y)) yes no) && x.Uses == 1 => (GE (TSTWconst [int32(c)] y) yes no)
+((EQ|NE|LT|LE|GT|GE) (CMPconst  [0] z:(AND        x y)) yes no) && z.Uses == 1 => ((EQ|NE|LT|LE|GT|GE) (TST                x y) yes no)
+((EQ|NE|LT|LE|GT|GE) (CMPconst  [0] x:(ANDconst [c] y)) yes no) && x.Uses == 1 => ((EQ|NE|LT|LE|GT|GE) (TSTconst         [c] y) yes no)
+((EQ|NE|LT|LE|GT|GE) (CMPWconst [0] z:(AND        x y)) yes no) && z.Uses == 1 => ((EQ|NE|LT|LE|GT|GE) (TSTW               x y) yes no)
+((EQ|NE|LT|LE|GT|GE) (CMPWconst [0] x:(ANDconst [c] y)) yes no) && x.Uses == 1 => ((EQ|NE|LT|LE|GT|GE) (TSTWconst [int32(c)] y) yes no)
 
 // For conditional instructions such as CSET, CSEL.
-(Equal (CMPconst [0] z:(AND x y))) && z.Uses == 1 => (Equal (TST x y))
-(NotEqual (CMPconst [0] z:(AND x y))) && z.Uses == 1 => (NotEqual (TST x y))
-(LessThan (CMPconst [0] z:(AND x y))) && z.Uses == 1 => (LessThan (TST x y))
-(LessEqual (CMPconst [0] z:(AND x y))) && z.Uses == 1 => (LessEqual (TST x y))
-(GreaterThan (CMPconst [0] z:(AND x y))) && z.Uses == 1 => (GreaterThan (TST x y))
-(GreaterEqual (CMPconst [0] z:(AND x y))) && z.Uses == 1 => (GreaterEqual (TST x y))
+((Equal|NotEqual|LessThan|LessEqual|GreaterThan|GreaterEqual) (CMPconst [0]  z:(AND        x y))) && z.Uses == 1 =>
+	((Equal|NotEqual|LessThan|LessEqual|GreaterThan|GreaterEqual) (TST x y))
+((Equal|NotEqual|LessThan|LessEqual|GreaterThan|GreaterEqual) (CMPWconst [0] x:(ANDconst [c] y))) && x.Uses == 1 =>
+	((Equal|NotEqual|LessThan|LessEqual|GreaterThan|GreaterEqual) (TSTWconst [int32(c)] y))
+((Equal|NotEqual|LessThan|LessEqual|GreaterThan|GreaterEqual) (CMPWconst [0] z:(AND        x y))) && z.Uses == 1 =>
+	((Equal|NotEqual|LessThan|LessEqual|GreaterThan|GreaterEqual) (TSTW x y))
+((Equal|NotEqual|LessThan|LessEqual|GreaterThan|GreaterEqual) (CMPconst [0]  x:(ANDconst [c] y))) && x.Uses == 1 =>
+	((Equal|NotEqual|LessThan|LessEqual|GreaterThan|GreaterEqual) (TSTconst [c] y))
 
-(Equal (CMPWconst [0] x:(ANDconst [c] y))) && x.Uses == 1 => (Equal (TSTWconst [int32(c)] y))
-(NotEqual (CMPWconst [0] x:(ANDconst [c] y))) && x.Uses == 1 => (NotEqual (TSTWconst [int32(c)] y))
-(LessThan (CMPWconst [0] x:(ANDconst [c] y))) && x.Uses == 1 => (LessThan (TSTWconst [int32(c)] y))
-(LessEqual (CMPWconst [0] x:(ANDconst [c] y))) && x.Uses == 1 => (LessEqual (TSTWconst [int32(c)] y))
-(GreaterThan (CMPWconst [0] x:(ANDconst [c] y))) && x.Uses == 1 => (GreaterThan (TSTWconst [int32(c)] y))
-(GreaterEqual (CMPWconst [0] x:(ANDconst [c] y))) && x.Uses == 1 => (GreaterEqual (TSTWconst [int32(c)] y))
-
-(Equal (CMPWconst [0] z:(AND x y))) && z.Uses == 1 => (Equal (TSTW x y))
-(NotEqual (CMPWconst [0] z:(AND x y))) && z.Uses == 1 => (NotEqual (TSTW x y))
-(LessThan (CMPWconst [0] z:(AND x y))) && z.Uses == 1 => (LessThan (TSTW x y))
-(LessEqual (CMPWconst [0] z:(AND x y))) && z.Uses == 1 => (LessEqual (TSTW x y))
-(GreaterThan (CMPWconst [0] z:(AND x y))) && z.Uses == 1 => (GreaterThan (TSTW x y))
-(GreaterEqual (CMPWconst [0] z:(AND x y))) && z.Uses == 1 => (GreaterEqual (TSTW x y))
-
-(Equal (CMPconst [0] x:(ANDconst [c] y))) && x.Uses == 1 => (Equal (TSTconst [c] y))
-(NotEqual (CMPconst [0] x:(ANDconst [c] y))) && x.Uses == 1 => (NotEqual (TSTconst [c] y))
-(LessThan (CMPWconst [0] x:(ANDconst [c] y))) && x.Uses == 1 => (LessThan (TSTconst [c] y))
-(LessEqual (CMPWconst [0] x:(ANDconst [c] y))) && x.Uses == 1 => (LessEqual (TSTconst [c] y))
-(GreaterThan (CMPWconst [0] x:(ANDconst [c] y))) && x.Uses == 1 => (GreaterThan (TSTconst [c] y))
-(GreaterEqual (CMPWconst [0] x:(ANDconst [c] y))) && x.Uses == 1 => (GreaterEqual (TSTconst [c] y))
-
-(EQ (CMPconst [0] x:(ADDconst [c] y)) yes no) && x.Uses == 1 => (EQ (CMNconst [c] y) yes no)
-(NE (CMPconst [0] x:(ADDconst [c] y)) yes no) && x.Uses == 1 => (NE (CMNconst [c] y) yes no)
-(LT (CMPconst [0] x:(ADDconst [c] y)) yes no) && x.Uses == 1 => (LTnoov (CMNconst [c] y) yes no)
-(LE (CMPconst [0] x:(ADDconst [c] y)) yes no) && x.Uses == 1 => (LEnoov (CMNconst [c] y) yes no)
-(GT (CMPconst [0] x:(ADDconst [c] y)) yes no) && x.Uses == 1 => (GTnoov (CMNconst [c] y) yes no)
-(GE (CMPconst [0] x:(ADDconst [c] y)) yes no) && x.Uses == 1 => (GEnoov (CMNconst [c] y) yes no)
-
-(EQ (CMPWconst [0] x:(ADDconst [c] y)) yes no) && x.Uses == 1 => (EQ (CMNWconst [int32(c)] y) yes no)
-(NE (CMPWconst [0] x:(ADDconst [c] y)) yes no) && x.Uses == 1 => (NE (CMNWconst [int32(c)] y) yes no)
-(LT (CMPWconst [0] x:(ADDconst [c] y)) yes no) && x.Uses == 1 => (LTnoov (CMNWconst [int32(c)] y) yes no)
-(LE (CMPWconst [0] x:(ADDconst [c] y)) yes no) && x.Uses == 1 => (LEnoov (CMNWconst [int32(c)] y) yes no)
-(GT (CMPWconst [0] x:(ADDconst [c] y)) yes no) && x.Uses == 1 => (GTnoov (CMNWconst [int32(c)] y) yes no)
-(GE (CMPWconst [0] x:(ADDconst [c] y)) yes no) && x.Uses == 1 => (GEnoov (CMNWconst [int32(c)] y) yes no)
-
-(EQ (CMPconst [0] z:(ADD x y)) yes no) && z.Uses == 1 => (EQ (CMN x y) yes no)
-(NE (CMPconst [0] z:(ADD x y)) yes no) && z.Uses == 1 => (NE (CMN x y) yes no)
-(LT (CMPconst [0] z:(ADD x y)) yes no) && z.Uses == 1 => (LTnoov (CMN x y) yes no)
-(LE (CMPconst [0] z:(ADD x y)) yes no) && z.Uses == 1 => (LEnoov (CMN x y) yes no)
-(GT (CMPconst [0] z:(ADD x y)) yes no) && z.Uses == 1 => (GTnoov (CMN x y) yes no)
-(GE (CMPconst [0] z:(ADD x y)) yes no) && z.Uses == 1 => (GEnoov (CMN x y) yes no)
-
-(EQ (CMPWconst [0] z:(ADD x y)) yes no) && z.Uses == 1 => (EQ (CMNW x y) yes no)
-(NE (CMPWconst [0] z:(ADD x y)) yes no) && z.Uses == 1 => (NE (CMNW x y) yes no)
-(LT (CMPWconst [0] z:(ADD x y)) yes no) && z.Uses == 1 => (LTnoov (CMNW x y) yes no)
-(LE (CMPWconst [0] z:(ADD x y)) yes no) && z.Uses == 1 => (LEnoov (CMNW x y) yes no)
-(GT (CMPWconst [0] z:(ADD x y)) yes no) && z.Uses == 1 => (GTnoov (CMNW x y) yes no)
-(GE (CMPWconst [0] z:(ADD x y)) yes no) && z.Uses == 1 => (GEnoov (CMNW x y) yes no)
+((EQ|NE|LT|LE|GT|GE) (CMPconst  [0] x:(ADDconst [c] y)) yes no) && x.Uses == 1 => ((EQ|NE|LTnoov|LEnoov|GTnoov|GEnoov) (CMNconst         [c] y) yes no)
+((EQ|NE|LT|LE|GT|GE) (CMPWconst [0] x:(ADDconst [c] y)) yes no) && x.Uses == 1 => ((EQ|NE|LTnoov|LEnoov|GTnoov|GEnoov) (CMNWconst [int32(c)] y) yes no)
+((EQ|NE|LT|LE|GT|GE) (CMPconst  [0] z:(ADD        x y)) yes no) && z.Uses == 1 => ((EQ|NE|LTnoov|LEnoov|GTnoov|GEnoov) (CMN                x y) yes no)
+((EQ|NE|LT|LE|GT|GE) (CMPWconst [0] z:(ADD        x y)) yes no) && z.Uses == 1 => ((EQ|NE|LTnoov|LEnoov|GTnoov|GEnoov) (CMNW               x y) yes no)
 
 // CMP(x,-y) -> CMN(x,y) is only valid for unordered comparison, if y can be -1<<63
-(EQ (CMP x z:(NEG y)) yes no) && z.Uses == 1 => (EQ (CMN x y) yes no)
-(NE (CMP x z:(NEG y)) yes no) && z.Uses == 1 => (NE (CMN x y) yes no)
-
-(Equal (CMP x z:(NEG y))) && z.Uses == 1 => (Equal (CMN x y))
-(NotEqual (CMP x z:(NEG y))) && z.Uses == 1 => (NotEqual (CMN x y))
+((EQ|NE) (CMP x z:(NEG y)) yes no)   && z.Uses == 1 => ((EQ|NE) (CMN x y) yes no)
+((Equal|NotEqual) (CMP x z:(NEG y))) && z.Uses == 1 => ((Equal|NotEqual) (CMN x y))
 
 // CMPW(x,-y) -> CMNW(x,y) is only valid for unordered comparison, if y can be -1<<31
-(EQ (CMPW x z:(NEG y)) yes no) && z.Uses == 1 => (EQ (CMNW x y) yes no)
-(NE (CMPW x z:(NEG y)) yes no) && z.Uses == 1 => (NE (CMNW x y) yes no)
-
-(Equal (CMPW x z:(NEG y))) && z.Uses == 1 => (Equal (CMNW x y))
-(NotEqual (CMPW x z:(NEG y))) && z.Uses == 1 => (NotEqual (CMNW x y))
+((EQ|NE) (CMPW x z:(NEG y)) yes no)   && z.Uses == 1 => ((EQ|NE) (CMNW x y) yes no)
+((Equal|NotEqual) (CMPW x z:(NEG y))) && z.Uses == 1 => ((Equal|NotEqual) (CMNW x y))
 
 // For conditional instructions such as CSET, CSEL.
-// TODO: add support for LT, LE, GT, GE, overflow needs to be considered.
-(Equal (CMPconst [0] x:(ADDconst [c] y))) && x.Uses == 1 => (Equal (CMNconst [c] y))
-(NotEqual (CMPconst [0] x:(ADDconst [c] y))) && x.Uses == 1 => (NotEqual (CMNconst [c] y))
+// TODO: add support for LE, GT, overflow needs to be considered.
+((Equal|NotEqual|LessThan|GreaterEqual) (CMPconst  [0] x:(ADDconst [c] y))) && x.Uses == 1 => ((Equal|NotEqual|LessThanNoov|GreaterEqualNoov) (CMNconst [c] y))
+((Equal|NotEqual|LessThan|GreaterEqual) (CMPWconst [0] x:(ADDconst [c] y))) && x.Uses == 1 => ((Equal|NotEqual|LessThanNoov|GreaterEqualNoov) (CMNWconst [int32(c)] y))
+((Equal|NotEqual|LessThan|GreaterEqual) (CMPconst  [0] z:(ADD        x y))) && z.Uses == 1 => ((Equal|NotEqual|LessThanNoov|GreaterEqualNoov) (CMN  x y))
+((Equal|NotEqual|LessThan|GreaterEqual) (CMPWconst [0] z:(ADD        x y))) && z.Uses == 1 => ((Equal|NotEqual|LessThanNoov|GreaterEqualNoov) (CMNW x y))
+((Equal|NotEqual|LessThan|GreaterEqual) (CMPconst  [0] z:(MADD     a x y))) && z.Uses == 1 => ((Equal|NotEqual|LessThanNoov|GreaterEqualNoov) (CMN  a (MUL  <x.Type> x y)))
+((Equal|NotEqual|LessThan|GreaterEqual) (CMPconst  [0] z:(MSUB     a x y))) && z.Uses == 1 => ((Equal|NotEqual|LessThanNoov|GreaterEqualNoov) (CMP  a (MUL  <x.Type> x y)))
+((Equal|NotEqual|LessThan|GreaterEqual) (CMPWconst [0] z:(MADDW    a x y))) && z.Uses == 1 => ((Equal|NotEqual|LessThanNoov|GreaterEqualNoov) (CMNW a (MULW <x.Type> x y)))
+((Equal|NotEqual|LessThan|GreaterEqual) (CMPWconst [0] z:(MSUBW    a x y))) && z.Uses == 1 => ((Equal|NotEqual|LessThanNoov|GreaterEqualNoov) (CMPW a (MULW <x.Type> x y)))
 
-(Equal (CMPWconst [0] x:(ADDconst [c] y))) && x.Uses == 1 => (Equal (CMNWconst [int32(c)] y))
-(NotEqual (CMPWconst [0] x:(ADDconst [c] y))) && x.Uses == 1 => (NotEqual (CMNWconst [int32(c)] y))
+((CMPconst|CMNconst)   [c] y) && c < 0 && c != -1<<63 => ((CMNconst|CMPconst)   [-c] y)
+((CMPWconst|CMNWconst) [c] y) && c < 0 && c != -1<<31 => ((CMNWconst|CMPWconst) [-c] y)
 
-(Equal (CMPconst [0] z:(ADD x y))) && z.Uses == 1 => (Equal (CMN x y))
-(NotEqual (CMPconst [0] z:(ADD x y))) && z.Uses == 1 => (NotEqual (CMN x y))
+((EQ|NE) (CMPconst  [0] x) yes no) => ((Z|NZ)   x yes no)
+((EQ|NE) (CMPWconst [0] x) yes no) => ((ZW|NZW) x yes no)
 
-(Equal (CMPWconst [0] z:(ADD x y))) && z.Uses == 1 => (Equal (CMNW x y))
-(NotEqual (CMPWconst [0] z:(ADD x y))) && z.Uses == 1 => (NotEqual (CMNW x y))
-
-(Equal (CMPconst [0] z:(MADD a x y))) && z.Uses==1 => (Equal (CMN a (MUL <x.Type> x y)))
-(NotEqual (CMPconst [0] z:(MADD a x y))) && z.Uses==1 => (NotEqual (CMN a (MUL <x.Type> x y)))
-
-(Equal (CMPconst [0] z:(MSUB a x y))) && z.Uses==1 => (Equal (CMP a (MUL <x.Type> x y)))
-(NotEqual (CMPconst [0] z:(MSUB a x y))) && z.Uses==1 => (NotEqual (CMP a (MUL <x.Type> x y)))
-
-(Equal (CMPWconst [0] z:(MADDW a x y))) && z.Uses==1 => (Equal (CMNW a (MULW <x.Type> x y)))
-(NotEqual (CMPWconst [0] z:(MADDW a x y))) && z.Uses==1 => (NotEqual (CMNW a (MULW <x.Type> x y)))
-
-(Equal (CMPWconst [0] z:(MSUBW a x y))) && z.Uses==1 => (Equal (CMPW a (MULW <x.Type> x y)))
-(NotEqual (CMPWconst [0] z:(MSUBW a x y))) && z.Uses==1 => (NotEqual (CMPW a (MULW <x.Type> x y)))
-
-(CMPconst [c] y) && c < 0 && c != -1<<63 => (CMNconst [-c] y)
-(CMPWconst [c] y) && c < 0 && c != -1<<31 => (CMNWconst [-c] y)
-(CMNconst [c] y) && c < 0 && c != -1<<63 => (CMPconst [-c] y)
-(CMNWconst [c] y) && c < 0 && c != -1<<31 => (CMPWconst [-c] y)
-
-(EQ (CMPconst [0] x) yes no) => (Z x yes no)
-(NE (CMPconst [0] x) yes no) => (NZ x yes no)
-(EQ (CMPWconst [0] x) yes no) => (ZW x yes no)
-(NE (CMPWconst [0] x) yes no) => (NZW x yes no)
-
-(EQ (CMPconst [0]  z:(MADD a x y)) yes no) && z.Uses==1 => (EQ (CMN a (MUL <x.Type> x y)) yes no)
-(NE (CMPconst [0]  z:(MADD a x y)) yes no) && z.Uses==1 => (NE (CMN a (MUL <x.Type> x y)) yes no)
-(LT (CMPconst [0]  z:(MADD a x y)) yes no) && z.Uses==1 => (LTnoov (CMN a (MUL <x.Type> x y)) yes no)
-(LE (CMPconst [0]  z:(MADD a x y)) yes no) && z.Uses==1 => (LEnoov (CMN a (MUL <x.Type> x y)) yes no)
-(GT (CMPconst [0]  z:(MADD a x y)) yes no) && z.Uses==1 => (GTnoov (CMN a (MUL <x.Type> x y)) yes no)
-(GE (CMPconst [0]  z:(MADD a x y)) yes no) && z.Uses==1 => (GEnoov (CMN a (MUL <x.Type> x y)) yes no)
-
-(EQ (CMPconst [0]  z:(MSUB a x y)) yes no) && z.Uses==1 => (EQ (CMP a (MUL <x.Type> x y)) yes no)
-(NE (CMPconst [0]  z:(MSUB a x y)) yes no) && z.Uses==1 => (NE (CMP a (MUL <x.Type> x y)) yes no)
-(LE (CMPconst [0]  z:(MSUB a x y)) yes no) && z.Uses==1 => (LEnoov (CMP a (MUL <x.Type> x y)) yes no)
-(LT (CMPconst [0]  z:(MSUB a x y)) yes no) && z.Uses==1 => (LTnoov (CMP a (MUL <x.Type> x y)) yes no)
-(GE (CMPconst [0]  z:(MSUB a x y)) yes no) && z.Uses==1 => (GEnoov (CMP a (MUL <x.Type> x y)) yes no)
-(GT (CMPconst [0]  z:(MSUB a x y)) yes no) && z.Uses==1 => (GTnoov (CMP a (MUL <x.Type> x y)) yes no)
-
-(EQ (CMPWconst [0] z:(MADDW a x y)) yes no) && z.Uses==1 => (EQ (CMNW a (MULW <x.Type> x y)) yes no)
-(NE (CMPWconst [0] z:(MADDW a x y)) yes no) && z.Uses==1 => (NE (CMNW a (MULW <x.Type> x y)) yes no)
-(LE (CMPWconst [0] z:(MADDW a x y)) yes no) && z.Uses==1 => (LEnoov (CMNW a (MULW <x.Type> x y)) yes no)
-(LT (CMPWconst [0] z:(MADDW a x y)) yes no) && z.Uses==1 => (LTnoov (CMNW a (MULW <x.Type> x y)) yes no)
-(GE (CMPWconst [0] z:(MADDW a x y)) yes no) && z.Uses==1 => (GEnoov (CMNW a (MULW <x.Type> x y)) yes no)
-(GT (CMPWconst [0] z:(MADDW a x y)) yes no) && z.Uses==1 => (GTnoov (CMNW a (MULW <x.Type> x y)) yes no)
-
-(EQ (CMPWconst [0] z:(MSUBW a x y)) yes no) && z.Uses==1 => (EQ (CMPW a (MULW <x.Type> x y)) yes no)
-(NE (CMPWconst [0] z:(MSUBW a x y)) yes no) && z.Uses==1 => (NE (CMPW a (MULW <x.Type> x y)) yes no)
-(LE (CMPWconst [0] z:(MSUBW a x y)) yes no) && z.Uses==1 => (LEnoov (CMPW a (MULW <x.Type> x y)) yes no)
-(LT (CMPWconst [0] z:(MSUBW a x y)) yes no) && z.Uses==1 => (LTnoov (CMPW a (MULW <x.Type> x y)) yes no)
-(GE (CMPWconst [0] z:(MSUBW a x y)) yes no) && z.Uses==1 => (GEnoov (CMPW a (MULW <x.Type> x y)) yes no)
-(GT (CMPWconst [0] z:(MSUBW a x y)) yes no) && z.Uses==1 => (GTnoov (CMPW a (MULW <x.Type> x y)) yes no)
+((EQ|NE|LT|LE|GT|GE) (CMPconst  [0] z:(MADD a x y))  yes no) && z.Uses==1 => ((EQ|NE|LTnoov|LEnoov|GTnoov|GEnoov) (CMN  a (MUL  <x.Type> x y)) yes no)
+((EQ|NE|LT|LE|GT|GE) (CMPconst  [0] z:(MSUB a x y))  yes no) && z.Uses==1 => ((EQ|NE|LTnoov|LEnoov|GTnoov|GEnoov) (CMP  a (MUL  <x.Type> x y)) yes no)
+((EQ|NE|LT|LE|GT|GE) (CMPWconst [0] z:(MADDW a x y)) yes no) && z.Uses==1 => ((EQ|NE|LTnoov|LEnoov|GTnoov|GEnoov) (CMNW a (MULW <x.Type> x y)) yes no)
+((EQ|NE|LT|LE|GT|GE) (CMPWconst [0] z:(MSUBW a x y)) yes no) && z.Uses==1 => ((EQ|NE|LTnoov|LEnoov|GTnoov|GEnoov) (CMPW a (MULW <x.Type> x y)) yes no)
 
 // Absorb bit-tests into block
-(Z  (ANDconst [c] x) yes no) && oneBit(c) => (TBZ  [int64(ntz64(c))] x yes no)
-(NZ (ANDconst [c] x) yes no) && oneBit(c) => (TBNZ [int64(ntz64(c))] x yes no)
-(ZW  (ANDconst [c] x) yes no) && oneBit(int64(uint32(c))) => (TBZ  [int64(ntz64(int64(uint32(c))))] x yes no)
-(NZW (ANDconst [c] x) yes no) && oneBit(int64(uint32(c))) => (TBNZ [int64(ntz64(int64(uint32(c))))] x yes no)
-(EQ (TSTconst [c] x) yes no) && oneBit(c) => (TBZ  [int64(ntz64(c))] x yes no)
-(NE (TSTconst [c] x) yes no) && oneBit(c) => (TBNZ [int64(ntz64(c))] x yes no)
-(EQ (TSTWconst [c] x) yes no) && oneBit(int64(uint32(c))) => (TBZ  [int64(ntz64(int64(uint32(c))))] x yes no)
-(NE (TSTWconst [c] x) yes no) && oneBit(int64(uint32(c))) => (TBNZ [int64(ntz64(int64(uint32(c))))] x yes no)
+(Z   (ANDconst  [c] x) yes no) && oneBit(c) => (TBZ  [int64(ntz64(c))] x yes no)
+(NZ  (ANDconst  [c] x) yes no) && oneBit(c) => (TBNZ [int64(ntz64(c))] x yes no)
+(ZW  (ANDconst  [c] x) yes no) && oneBit(int64(uint32(c))) => (TBZ  [int64(ntz64(int64(uint32(c))))] x yes no)
+(NZW (ANDconst  [c] x) yes no) && oneBit(int64(uint32(c))) => (TBNZ [int64(ntz64(int64(uint32(c))))] x yes no)
+(EQ  (TSTconst  [c] x) yes no) && oneBit(c) => (TBZ  [int64(ntz64(c))] x yes no)
+(NE  (TSTconst  [c] x) yes no) && oneBit(c) => (TBNZ [int64(ntz64(c))] x yes no)
+(EQ  (TSTWconst [c] x) yes no) && oneBit(int64(uint32(c))) => (TBZ  [int64(ntz64(int64(uint32(c))))] x yes no)
+(NE  (TSTWconst [c] x) yes no) && oneBit(int64(uint32(c))) => (TBNZ [int64(ntz64(int64(uint32(c))))] x yes no)
 
 // Test sign-bit for signed comparisons against zero
 (GE (CMPWconst [0] x) yes no) => (TBZ  [31] x yes no)
-(GE (CMPconst [0] x) yes no) => (TBZ  [63] x yes no)
-(LT (CMPWconst [0] x) yes no) => (TBNZ  [31] x yes no)
-(LT (CMPconst [0] x) yes no) => (TBNZ  [63] x yes no)
+(GE (CMPconst [0] x)  yes no) => (TBZ  [63] x yes no)
+(LT (CMPWconst [0] x) yes no) => (TBNZ [31] x yes no)
+(LT (CMPconst [0] x)  yes no) => (TBNZ [63] x yes no)
 
 // fold offset into address
 (ADDconst [off1] (MOVDaddr [off2] {sym} ptr)) && is32Bit(off1+int64(off2)) =>
 	 (MOVDaddr [int32(off1)+off2] {sym} ptr)
 
-// fold address into load/store
-(MOVBload [off1] {sym} (ADDconst [off2] ptr) mem) && is32Bit(int64(off1)+off2) =>
+// fold address into load/store.
+// Do not fold global variable access in -dynlink mode, where it will
+// be rewritten to use the GOT via REGTMP, which currently cannot handle
+// large offset.
+(MOVBload [off1] {sym} (ADDconst [off2] ptr) mem) && is32Bit(int64(off1)+off2)
+	&& (ptr.Op != OpSB || !config.ctxt.Flag_dynlink) =>
 	(MOVBload [off1+int32(off2)] {sym} ptr mem)
-(MOVBUload [off1] {sym} (ADDconst [off2] ptr) mem) && is32Bit(int64(off1)+off2) =>
+(MOVBUload [off1] {sym} (ADDconst [off2] ptr) mem) && is32Bit(int64(off1)+off2)
+	&& (ptr.Op != OpSB || !config.ctxt.Flag_dynlink) =>
 	(MOVBUload [off1+int32(off2)] {sym} ptr mem)
-(MOVHload [off1] {sym} (ADDconst [off2] ptr) mem) && is32Bit(int64(off1)+off2) =>
+(MOVHload [off1] {sym} (ADDconst [off2] ptr) mem) && is32Bit(int64(off1)+off2)
+	&& (ptr.Op != OpSB || !config.ctxt.Flag_dynlink) =>
 	(MOVHload [off1+int32(off2)] {sym} ptr mem)
-(MOVHUload [off1] {sym} (ADDconst [off2] ptr) mem) && is32Bit(int64(off1)+off2) =>
+(MOVHUload [off1] {sym} (ADDconst [off2] ptr) mem) && is32Bit(int64(off1)+off2)
+	&& (ptr.Op != OpSB || !config.ctxt.Flag_dynlink) =>
 	(MOVHUload [off1+int32(off2)] {sym} ptr mem)
-(MOVWload [off1] {sym} (ADDconst [off2] ptr) mem) && is32Bit(int64(off1)+off2) =>
+(MOVWload [off1] {sym} (ADDconst [off2] ptr) mem) && is32Bit(int64(off1)+off2)
+	&& (ptr.Op != OpSB || !config.ctxt.Flag_dynlink) =>
 	(MOVWload [off1+int32(off2)] {sym} ptr mem)
-(MOVWUload [off1] {sym} (ADDconst [off2] ptr) mem) && is32Bit(int64(off1)+off2) =>
+(MOVWUload [off1] {sym} (ADDconst [off2] ptr) mem) && is32Bit(int64(off1)+off2)
+	&& (ptr.Op != OpSB || !config.ctxt.Flag_dynlink) =>
 	(MOVWUload [off1+int32(off2)] {sym} ptr mem)
-(MOVDload [off1] {sym} (ADDconst [off2] ptr) mem) && is32Bit(int64(off1)+off2) =>
+(MOVDload [off1] {sym} (ADDconst [off2] ptr) mem) && is32Bit(int64(off1)+off2)
+	&& (ptr.Op != OpSB || !config.ctxt.Flag_dynlink) =>
 	(MOVDload [off1+int32(off2)] {sym} ptr mem)
-(LDP [off1] {sym} (ADDconst [off2] ptr) mem) && is32Bit(int64(off1)+off2) =>
+(LDP [off1] {sym} (ADDconst [off2] ptr) mem) && is32Bit(int64(off1)+off2)
+	&& (ptr.Op != OpSB || !config.ctxt.Flag_dynlink) =>
 	(LDP [off1+int32(off2)] {sym} ptr mem)
-(FMOVSload [off1] {sym} (ADDconst [off2] ptr) mem) && is32Bit(int64(off1)+off2) =>
+(FMOVSload [off1] {sym} (ADDconst [off2] ptr) mem) && is32Bit(int64(off1)+off2)
+	&& (ptr.Op != OpSB || !config.ctxt.Flag_dynlink) =>
 	(FMOVSload [off1+int32(off2)] {sym} ptr mem)
-(FMOVDload [off1] {sym} (ADDconst [off2] ptr) mem) && is32Bit(int64(off1)+off2) =>
+(FMOVDload [off1] {sym} (ADDconst [off2] ptr) mem) && is32Bit(int64(off1)+off2)
+	&& (ptr.Op != OpSB || !config.ctxt.Flag_dynlink) =>
 	(FMOVDload [off1+int32(off2)] {sym} ptr mem)
 
 // register indexed load
@@ -868,6 +740,7 @@
 (MOVBload  [off] {sym} (ADD ptr idx) mem) && off == 0 && sym == nil => (MOVBloadidx ptr idx mem)
 (FMOVSload [off] {sym} (ADD ptr idx) mem) && off == 0 && sym == nil => (FMOVSloadidx ptr idx mem)
 (FMOVDload [off] {sym} (ADD ptr idx) mem) && off == 0 && sym == nil => (FMOVDloadidx ptr idx mem)
+
 (MOVDloadidx  ptr (MOVDconst [c]) mem) && is32Bit(c) => (MOVDload  [int32(c)] ptr mem)
 (MOVDloadidx  (MOVDconst [c]) ptr mem) && is32Bit(c) => (MOVDload  [int32(c)] ptr mem)
 (MOVWUloadidx ptr (MOVDconst [c]) mem) && is32Bit(c) => (MOVWUload [int32(c)] ptr mem)
@@ -920,46 +793,58 @@
 (FMOVDloadidx8 ptr (MOVDconst [c]) mem) && is32Bit(c<<3) => (FMOVDload ptr [int32(c)<<3] mem)
 (FMOVSloadidx4 ptr (MOVDconst [c]) mem) && is32Bit(c<<2) => (FMOVSload ptr [int32(c)<<2] mem)
 
-(MOVBstore [off1] {sym} (ADDconst [off2] ptr) val mem) && is32Bit(int64(off1)+off2) =>
+(MOVBstore [off1] {sym} (ADDconst [off2] ptr) val mem) && is32Bit(int64(off1)+off2)
+	&& (ptr.Op != OpSB || !config.ctxt.Flag_dynlink) =>
 	(MOVBstore [off1+int32(off2)] {sym} ptr val mem)
-(MOVHstore [off1] {sym} (ADDconst [off2] ptr) val mem) && is32Bit(int64(off1)+off2) =>
+(MOVHstore [off1] {sym} (ADDconst [off2] ptr) val mem) && is32Bit(int64(off1)+off2)
+	&& (ptr.Op != OpSB || !config.ctxt.Flag_dynlink) =>
 	(MOVHstore [off1+int32(off2)] {sym} ptr val mem)
-(MOVWstore [off1] {sym} (ADDconst [off2] ptr) val mem) && is32Bit(int64(off1)+off2) =>
+(MOVWstore [off1] {sym} (ADDconst [off2] ptr) val mem) && is32Bit(int64(off1)+off2)
+	&& (ptr.Op != OpSB || !config.ctxt.Flag_dynlink) =>
 	(MOVWstore [off1+int32(off2)] {sym} ptr val mem)
-(MOVDstore [off1] {sym} (ADDconst [off2] ptr) val mem) && is32Bit(int64(off1)+off2) =>
+(MOVDstore [off1] {sym} (ADDconst [off2] ptr) val mem) && is32Bit(int64(off1)+off2)
+	&& (ptr.Op != OpSB || !config.ctxt.Flag_dynlink) =>
 	(MOVDstore [off1+int32(off2)] {sym} ptr val mem)
-(STP [off1] {sym} (ADDconst [off2] ptr) val1 val2 mem) && is32Bit(int64(off1)+off2) =>
+(STP [off1] {sym} (ADDconst [off2] ptr) val1 val2 mem) && is32Bit(int64(off1)+off2)
+	&& (ptr.Op != OpSB || !config.ctxt.Flag_dynlink) =>
 	(STP [off1+int32(off2)] {sym} ptr val1 val2 mem)
-(FMOVSstore [off1] {sym} (ADDconst [off2] ptr) val mem) && is32Bit(int64(off1)+off2) =>
+(FMOVSstore [off1] {sym} (ADDconst [off2] ptr) val mem) && is32Bit(int64(off1)+off2)
+	&& (ptr.Op != OpSB || !config.ctxt.Flag_dynlink) =>
 	(FMOVSstore [off1+int32(off2)] {sym} ptr val mem)
-(FMOVDstore [off1] {sym} (ADDconst [off2] ptr) val mem) && is32Bit(int64(off1)+off2) =>
+(FMOVDstore [off1] {sym} (ADDconst [off2] ptr) val mem) && is32Bit(int64(off1)+off2)
+	&& (ptr.Op != OpSB || !config.ctxt.Flag_dynlink) =>
 	(FMOVDstore [off1+int32(off2)] {sym} ptr val mem)
-(MOVBstorezero [off1] {sym} (ADDconst [off2] ptr) mem) && is32Bit(int64(off1)+off2) =>
+(MOVBstorezero [off1] {sym} (ADDconst [off2] ptr) mem) && is32Bit(int64(off1)+off2)
+	&& (ptr.Op != OpSB || !config.ctxt.Flag_dynlink) =>
 	(MOVBstorezero [off1+int32(off2)] {sym} ptr mem)
-(MOVHstorezero [off1] {sym} (ADDconst [off2] ptr) mem) && is32Bit(int64(off1)+off2) =>
+(MOVHstorezero [off1] {sym} (ADDconst [off2] ptr) mem) && is32Bit(int64(off1)+off2)
+	&& (ptr.Op != OpSB || !config.ctxt.Flag_dynlink) =>
 	(MOVHstorezero [off1+int32(off2)] {sym} ptr mem)
-(MOVWstorezero [off1] {sym} (ADDconst [off2] ptr) mem) && is32Bit(int64(off1)+off2) =>
+(MOVWstorezero [off1] {sym} (ADDconst [off2] ptr) mem) && is32Bit(int64(off1)+off2)
+	&& (ptr.Op != OpSB || !config.ctxt.Flag_dynlink) =>
 	(MOVWstorezero [off1+int32(off2)] {sym} ptr mem)
-(MOVDstorezero [off1] {sym} (ADDconst [off2] ptr) mem) && is32Bit(int64(off1)+off2) =>
+(MOVDstorezero [off1] {sym} (ADDconst [off2] ptr) mem) && is32Bit(int64(off1)+off2)
+	&& (ptr.Op != OpSB || !config.ctxt.Flag_dynlink) =>
 	(MOVDstorezero [off1+int32(off2)] {sym} ptr mem)
-(MOVQstorezero [off1] {sym} (ADDconst [off2] ptr) mem) && is32Bit(int64(off1)+off2) =>
+(MOVQstorezero [off1] {sym} (ADDconst [off2] ptr) mem) && is32Bit(int64(off1)+off2)
+	&& (ptr.Op != OpSB || !config.ctxt.Flag_dynlink) =>
 	(MOVQstorezero [off1+int32(off2)] {sym} ptr mem)
 
 // register indexed store
-(MOVDstore [off] {sym} (ADD ptr idx) val mem) && off == 0 && sym == nil => (MOVDstoreidx ptr idx val mem)
-(MOVWstore [off] {sym} (ADD ptr idx) val mem) && off == 0 && sym == nil => (MOVWstoreidx ptr idx val mem)
-(MOVHstore [off] {sym} (ADD ptr idx) val mem) && off == 0 && sym == nil => (MOVHstoreidx ptr idx val mem)
-(MOVBstore [off] {sym} (ADD ptr idx) val mem) && off == 0 && sym == nil => (MOVBstoreidx ptr idx val mem)
+(MOVDstore  [off] {sym} (ADD ptr idx) val mem) && off == 0 && sym == nil => (MOVDstoreidx ptr idx val mem)
+(MOVWstore  [off] {sym} (ADD ptr idx) val mem) && off == 0 && sym == nil => (MOVWstoreidx ptr idx val mem)
+(MOVHstore  [off] {sym} (ADD ptr idx) val mem) && off == 0 && sym == nil => (MOVHstoreidx ptr idx val mem)
+(MOVBstore  [off] {sym} (ADD ptr idx) val mem) && off == 0 && sym == nil => (MOVBstoreidx ptr idx val mem)
 (FMOVDstore [off] {sym} (ADD ptr idx) val mem) && off == 0 && sym == nil => (FMOVDstoreidx ptr idx val mem)
 (FMOVSstore [off] {sym} (ADD ptr idx) val mem) && off == 0 && sym == nil => (FMOVSstoreidx ptr idx val mem)
-(MOVDstoreidx ptr (MOVDconst [c]) val mem) && is32Bit(c) => (MOVDstore [int32(c)] ptr val mem)
-(MOVDstoreidx (MOVDconst [c]) idx val mem) && is32Bit(c) => (MOVDstore [int32(c)] idx val mem)
-(MOVWstoreidx ptr (MOVDconst [c]) val mem) && is32Bit(c) => (MOVWstore [int32(c)] ptr val mem)
-(MOVWstoreidx (MOVDconst [c]) idx val mem) && is32Bit(c) => (MOVWstore [int32(c)] idx val mem)
-(MOVHstoreidx ptr (MOVDconst [c]) val mem) && is32Bit(c) => (MOVHstore [int32(c)] ptr val mem)
-(MOVHstoreidx (MOVDconst [c]) idx val mem) && is32Bit(c) => (MOVHstore [int32(c)] idx val mem)
-(MOVBstoreidx ptr (MOVDconst [c]) val mem) && is32Bit(c) => (MOVBstore [int32(c)] ptr val mem)
-(MOVBstoreidx (MOVDconst [c]) idx val mem) && is32Bit(c) => (MOVBstore [int32(c)] idx val mem)
+(MOVDstoreidx  ptr (MOVDconst [c]) val mem) && is32Bit(c) => (MOVDstore  [int32(c)] ptr val mem)
+(MOVDstoreidx  (MOVDconst [c]) idx val mem) && is32Bit(c) => (MOVDstore  [int32(c)] idx val mem)
+(MOVWstoreidx  ptr (MOVDconst [c]) val mem) && is32Bit(c) => (MOVWstore  [int32(c)] ptr val mem)
+(MOVWstoreidx  (MOVDconst [c]) idx val mem) && is32Bit(c) => (MOVWstore  [int32(c)] idx val mem)
+(MOVHstoreidx  ptr (MOVDconst [c]) val mem) && is32Bit(c) => (MOVHstore  [int32(c)] ptr val mem)
+(MOVHstoreidx  (MOVDconst [c]) idx val mem) && is32Bit(c) => (MOVHstore  [int32(c)] idx val mem)
+(MOVBstoreidx  ptr (MOVDconst [c]) val mem) && is32Bit(c) => (MOVBstore  [int32(c)] ptr val mem)
+(MOVBstoreidx  (MOVDconst [c]) idx val mem) && is32Bit(c) => (MOVBstore  [int32(c)] idx val mem)
 (FMOVDstoreidx ptr (MOVDconst [c]) val mem) && is32Bit(c) => (FMOVDstore [int32(c)] ptr val mem)
 (FMOVDstoreidx (MOVDconst [c]) idx val mem) && is32Bit(c) => (FMOVDstore [int32(c)] idx val mem)
 (FMOVSstoreidx ptr (MOVDconst [c]) val mem) && is32Bit(c) => (FMOVSstore [int32(c)] ptr val mem)
@@ -969,14 +854,14 @@
 (MOVDstore [off] {sym} (ADDshiftLL [3] ptr idx) val mem) && off == 0 && sym == nil => (MOVDstoreidx8 ptr idx val mem)
 (MOVWstore [off] {sym} (ADDshiftLL [2] ptr idx) val mem) && off == 0 && sym == nil => (MOVWstoreidx4 ptr idx val mem)
 (MOVHstore [off] {sym} (ADDshiftLL [1] ptr idx) val mem) && off == 0 && sym == nil => (MOVHstoreidx2 ptr idx val mem)
-(MOVDstoreidx ptr (SLLconst [3] idx) val mem) => (MOVDstoreidx8 ptr idx val mem)
-(MOVWstoreidx ptr (SLLconst [2] idx) val mem) => (MOVWstoreidx4 ptr idx val mem)
-(MOVHstoreidx ptr (SLLconst [1] idx) val mem) => (MOVHstoreidx2 ptr idx val mem)
-(MOVHstoreidx ptr (ADD idx idx) val mem) => (MOVHstoreidx2 ptr idx val mem)
-(MOVDstoreidx (SLLconst [3] idx) ptr val mem) => (MOVDstoreidx8 ptr idx val mem)
-(MOVWstoreidx (SLLconst [2] idx) ptr val mem) => (MOVWstoreidx4 ptr idx val mem)
-(MOVHstoreidx (SLLconst [1] idx) ptr val mem) => (MOVHstoreidx2 ptr idx val mem)
-(MOVHstoreidx (ADD idx idx) ptr val mem) => (MOVHstoreidx2 ptr idx val mem)
+(MOVDstoreidx  ptr (SLLconst [3] idx) val mem) => (MOVDstoreidx8 ptr idx val mem)
+(MOVWstoreidx  ptr (SLLconst [2] idx) val mem) => (MOVWstoreidx4 ptr idx val mem)
+(MOVHstoreidx  ptr (SLLconst [1] idx) val mem) => (MOVHstoreidx2 ptr idx val mem)
+(MOVHstoreidx  ptr (ADD      idx idx) val mem) => (MOVHstoreidx2 ptr idx val mem)
+(MOVDstoreidx  (SLLconst [3] idx) ptr val mem) => (MOVDstoreidx8 ptr idx val mem)
+(MOVWstoreidx  (SLLconst [2] idx) ptr val mem) => (MOVWstoreidx4 ptr idx val mem)
+(MOVHstoreidx  (SLLconst [1] idx) ptr val mem) => (MOVHstoreidx2 ptr idx val mem)
+(MOVHstoreidx  (ADD      idx idx) ptr val mem) => (MOVHstoreidx2 ptr idx val mem)
 (MOVDstoreidx8 ptr (MOVDconst [c]) val mem) && is32Bit(c<<3) => (MOVDstore [int32(c)<<3] ptr val mem)
 (MOVWstoreidx4 ptr (MOVDconst [c]) val mem) && is32Bit(c<<2) => (MOVWstore [int32(c)<<2] ptr val mem)
 (MOVHstoreidx2 ptr (MOVDconst [c]) val mem) && is32Bit(c<<1) => (MOVHstore [int32(c)<<1] ptr val mem)
@@ -991,71 +876,93 @@
 (FMOVSstoreidx4 ptr (MOVDconst [c]) val mem) && is32Bit(c<<2) => (FMOVSstore [int32(c)<<2] ptr val mem)
 
 (MOVBload [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem)
-	&& canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) =>
+	&& canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	&& (ptr.Op != OpSB || !config.ctxt.Flag_dynlink) =>
 	(MOVBload [off1+off2] {mergeSym(sym1,sym2)} ptr mem)
 (MOVBUload [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem)
-	&& canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) =>
+	&& canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	&& (ptr.Op != OpSB || !config.ctxt.Flag_dynlink) =>
 	(MOVBUload [off1+off2] {mergeSym(sym1,sym2)} ptr mem)
 (MOVHload [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem)
-	&& canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) =>
+	&& canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	&& (ptr.Op != OpSB || !config.ctxt.Flag_dynlink) =>
 	(MOVHload [off1+off2] {mergeSym(sym1,sym2)} ptr mem)
 (MOVHUload [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem)
-	&& canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) =>
+	&& canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	&& (ptr.Op != OpSB || !config.ctxt.Flag_dynlink) =>
 	(MOVHUload [off1+off2] {mergeSym(sym1,sym2)} ptr mem)
 (MOVWload [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem)
-	&& canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) =>
+	&& canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	&& (ptr.Op != OpSB || !config.ctxt.Flag_dynlink) =>
 	(MOVWload [off1+off2] {mergeSym(sym1,sym2)} ptr mem)
 (MOVWUload [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem)
-	&& canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) =>
+	&& canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	&& (ptr.Op != OpSB || !config.ctxt.Flag_dynlink) =>
 	(MOVWUload [off1+off2] {mergeSym(sym1,sym2)} ptr mem)
 (MOVDload [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem)
-	&& canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) =>
+	&& canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	&& (ptr.Op != OpSB || !config.ctxt.Flag_dynlink) =>
 	(MOVDload [off1+off2] {mergeSym(sym1,sym2)} ptr mem)
 (LDP [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem)
-	&& canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) =>
+	&& canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	&& (ptr.Op != OpSB || !config.ctxt.Flag_dynlink) =>
 	(LDP [off1+off2] {mergeSym(sym1,sym2)} ptr mem)
 (FMOVSload [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem)
-	&& canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) =>
+	&& canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	&& (ptr.Op != OpSB || !config.ctxt.Flag_dynlink) =>
 	(FMOVSload [off1+off2] {mergeSym(sym1,sym2)} ptr mem)
 (FMOVDload [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem)
-	&& canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) =>
+	&& canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	&& (ptr.Op != OpSB || !config.ctxt.Flag_dynlink) =>
 	(FMOVDload [off1+off2] {mergeSym(sym1,sym2)} ptr mem)
 
 (MOVBstore [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) val mem)
-	&& canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) =>
+	&& canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	&& (ptr.Op != OpSB || !config.ctxt.Flag_dynlink) =>
 	(MOVBstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem)
 (MOVHstore [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) val mem)
-	&& canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) =>
+	&& canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	&& (ptr.Op != OpSB || !config.ctxt.Flag_dynlink) =>
 	(MOVHstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem)
 (MOVWstore [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) val mem)
-	&& canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) =>
+	&& canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	&& (ptr.Op != OpSB || !config.ctxt.Flag_dynlink) =>
 	(MOVWstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem)
 (MOVDstore [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) val mem)
-	&& canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) =>
+	&& canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	&& (ptr.Op != OpSB || !config.ctxt.Flag_dynlink) =>
 	(MOVDstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem)
 (STP [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) val1 val2 mem)
-	&& canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) =>
+	&& canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	&& (ptr.Op != OpSB || !config.ctxt.Flag_dynlink) =>
 	(STP [off1+off2] {mergeSym(sym1,sym2)} ptr val1 val2 mem)
 (FMOVSstore [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) val mem)
-	&& canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) =>
+	&& canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	&& (ptr.Op != OpSB || !config.ctxt.Flag_dynlink) =>
 	(FMOVSstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem)
 (FMOVDstore [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) val mem)
-	&& canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) =>
+	&& canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	&& (ptr.Op != OpSB || !config.ctxt.Flag_dynlink) =>
 	(FMOVDstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem)
 (MOVBstorezero [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem)
-	&& canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) =>
+	&& canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	&& (ptr.Op != OpSB || !config.ctxt.Flag_dynlink) =>
 	(MOVBstorezero [off1+off2] {mergeSym(sym1,sym2)} ptr mem)
 (MOVHstorezero [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem)
-	&& canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) =>
+	&& canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	&& (ptr.Op != OpSB || !config.ctxt.Flag_dynlink) =>
 	(MOVHstorezero [off1+off2] {mergeSym(sym1,sym2)} ptr mem)
 (MOVWstorezero [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem)
-	&& canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) =>
+	&& canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	&& (ptr.Op != OpSB || !config.ctxt.Flag_dynlink) =>
 	(MOVWstorezero [off1+off2] {mergeSym(sym1,sym2)} ptr mem)
 (MOVDstorezero [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem)
-	&& canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) =>
+	&& canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	&& (ptr.Op != OpSB || !config.ctxt.Flag_dynlink) =>
 	(MOVDstorezero [off1+off2] {mergeSym(sym1,sym2)} ptr mem)
 (MOVQstorezero [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem)
-	&& canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) =>
+	&& canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	&& (ptr.Op != OpSB || !config.ctxt.Flag_dynlink) =>
 	(MOVQstorezero [off1+off2] {mergeSym(sym1,sym2)} ptr mem)
 
 // store zero
@@ -1090,11 +997,11 @@
 (MOVDstorezeroidx ptr (SLLconst [3] idx) mem) => (MOVDstorezeroidx8 ptr idx mem)
 (MOVWstorezeroidx ptr (SLLconst [2] idx) mem) => (MOVWstorezeroidx4 ptr idx mem)
 (MOVHstorezeroidx ptr (SLLconst [1] idx) mem) => (MOVHstorezeroidx2 ptr idx mem)
-(MOVHstorezeroidx ptr (ADD idx idx) mem) => (MOVHstorezeroidx2 ptr idx mem)
+(MOVHstorezeroidx ptr (ADD      idx idx) mem) => (MOVHstorezeroidx2 ptr idx mem)
 (MOVDstorezeroidx (SLLconst [3] idx) ptr mem) => (MOVDstorezeroidx8 ptr idx mem)
 (MOVWstorezeroidx (SLLconst [2] idx) ptr mem) => (MOVWstorezeroidx4 ptr idx mem)
 (MOVHstorezeroidx (SLLconst [1] idx) ptr mem) => (MOVHstorezeroidx2 ptr idx mem)
-(MOVHstorezeroidx (ADD idx idx) ptr mem) => (MOVHstorezeroidx2 ptr idx mem)
+(MOVHstorezeroidx (ADD      idx idx) ptr mem) => (MOVHstorezeroidx2 ptr idx mem)
 (MOVDstoreidx8 ptr idx (MOVDconst [0]) mem) => (MOVDstorezeroidx8 ptr idx mem)
 (MOVWstoreidx4 ptr idx (MOVDconst [0]) mem) => (MOVWstorezeroidx4 ptr idx mem)
 (MOVHstoreidx2 ptr idx (MOVDconst [0]) mem) => (MOVHstorezeroidx2 ptr idx mem)
@@ -1104,24 +1011,24 @@
 
 // replace load from same location as preceding store with zero/sign extension (or copy in case of full width)
 // these seem to have bad interaction with other rules, resulting in slower code
-//(MOVBload [off] {sym} ptr (MOVBstore [off2] {sym2} ptr2 x _)) && sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) -> (MOVBreg x)
-//(MOVBUload [off] {sym} ptr (MOVBstore [off2] {sym2} ptr2 x _)) && sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) -> (MOVBUreg x)
-//(MOVHload [off] {sym} ptr (MOVHstore [off2] {sym2} ptr2 x _)) && sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) -> (MOVHreg x)
-//(MOVHUload [off] {sym} ptr (MOVHstore [off2] {sym2} ptr2 x _)) && sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) -> (MOVHUreg x)
-//(MOVWload [off] {sym} ptr (MOVWstore [off2] {sym2} ptr2 x _)) && sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) -> (MOVWreg x)
-//(MOVWUload [off] {sym} ptr (MOVWstore [off2] {sym2} ptr2 x _)) && sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) -> (MOVWUreg x)
-//(MOVDload [off] {sym} ptr (MOVDstore [off2] {sym2} ptr2 x _)) && sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) -> x
-//(LDP [off] {sym} ptr (STP [off2] {sym2} ptr2 x y _)) && sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) -> x y
+//(MOVBload  [off] {sym} ptr (MOVBstore  [off2] {sym2} ptr2 x _)) && sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) -> (MOVBreg x)
+//(MOVBUload [off] {sym} ptr (MOVBstore  [off2] {sym2} ptr2 x _)) && sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) -> (MOVBUreg x)
+//(MOVHload  [off] {sym} ptr (MOVHstore  [off2] {sym2} ptr2 x _)) && sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) -> (MOVHreg x)
+//(MOVHUload [off] {sym} ptr (MOVHstore  [off2] {sym2} ptr2 x _)) && sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) -> (MOVHUreg x)
+//(MOVWload  [off] {sym} ptr (MOVWstore  [off2] {sym2} ptr2 x _)) && sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) -> (MOVWreg x)
+//(MOVWUload [off] {sym} ptr (MOVWstore  [off2] {sym2} ptr2 x _)) && sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) -> (MOVWUreg x)
+//(MOVDload  [off] {sym} ptr (MOVDstore  [off2] {sym2} ptr2 x _)) && sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) -> x
 //(FMOVSload [off] {sym} ptr (FMOVSstore [off2] {sym2} ptr2 x _)) && sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) -> x
 //(FMOVDload [off] {sym} ptr (FMOVDstore [off2] {sym2} ptr2 x _)) && sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) -> x
+//(LDP       [off] {sym} ptr (STP      [off2] {sym2} ptr2 x y _)) && sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) -> x y
 
-(MOVBload [off] {sym} ptr (MOVBstorezero [off2] {sym2} ptr2 _)) && sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) => (MOVDconst [0])
+(MOVBload  [off] {sym} ptr (MOVBstorezero [off2] {sym2} ptr2 _)) && sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) => (MOVDconst [0])
 (MOVBUload [off] {sym} ptr (MOVBstorezero [off2] {sym2} ptr2 _)) && sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) => (MOVDconst [0])
-(MOVHload [off] {sym} ptr (MOVHstorezero [off2] {sym2} ptr2 _)) && sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) => (MOVDconst [0])
+(MOVHload  [off] {sym} ptr (MOVHstorezero [off2] {sym2} ptr2 _)) && sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) => (MOVDconst [0])
 (MOVHUload [off] {sym} ptr (MOVHstorezero [off2] {sym2} ptr2 _)) && sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) => (MOVDconst [0])
-(MOVWload [off] {sym} ptr (MOVWstorezero [off2] {sym2} ptr2 _)) && sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) => (MOVDconst [0])
+(MOVWload  [off] {sym} ptr (MOVWstorezero [off2] {sym2} ptr2 _)) && sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) => (MOVDconst [0])
 (MOVWUload [off] {sym} ptr (MOVWstorezero [off2] {sym2} ptr2 _)) && sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) => (MOVDconst [0])
-(MOVDload [off] {sym} ptr (MOVDstorezero [off2] {sym2} ptr2 _)) && sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) => (MOVDconst [0])
+(MOVDload  [off] {sym} ptr (MOVDstorezero [off2] {sym2} ptr2 _)) && sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) => (MOVDconst [0])
 
 (MOVBloadidx ptr idx (MOVBstorezeroidx ptr2 idx2 _))
 	&& (isSamePtr(ptr, ptr2) && isSamePtr(idx, idx2) || isSamePtr(ptr, idx2) && isSamePtr(idx, ptr2)) => (MOVDconst [0])
@@ -1138,97 +1045,97 @@
 (MOVDloadidx ptr idx (MOVDstorezeroidx ptr2 idx2 _))
 	&& (isSamePtr(ptr, ptr2) && isSamePtr(idx, idx2) || isSamePtr(ptr, idx2) && isSamePtr(idx, ptr2)) => (MOVDconst [0])
 
-(MOVHloadidx2 ptr idx (MOVHstorezeroidx2 ptr2 idx2 _)) && isSamePtr(ptr, ptr2) && isSamePtr(idx, idx2) => (MOVDconst [0])
+(MOVHloadidx2  ptr idx (MOVHstorezeroidx2 ptr2 idx2 _)) && isSamePtr(ptr, ptr2) && isSamePtr(idx, idx2) => (MOVDconst [0])
 (MOVHUloadidx2 ptr idx (MOVHstorezeroidx2 ptr2 idx2 _)) && isSamePtr(ptr, ptr2) && isSamePtr(idx, idx2) => (MOVDconst [0])
-(MOVWloadidx4 ptr idx (MOVWstorezeroidx4 ptr2 idx2 _)) && isSamePtr(ptr, ptr2) && isSamePtr(idx, idx2) => (MOVDconst [0])
+(MOVWloadidx4  ptr idx (MOVWstorezeroidx4 ptr2 idx2 _)) && isSamePtr(ptr, ptr2) && isSamePtr(idx, idx2) => (MOVDconst [0])
 (MOVWUloadidx4 ptr idx (MOVWstorezeroidx4 ptr2 idx2 _)) && isSamePtr(ptr, ptr2) && isSamePtr(idx, idx2) => (MOVDconst [0])
-(MOVDloadidx8 ptr idx (MOVDstorezeroidx8 ptr2 idx2 _)) && isSamePtr(ptr, ptr2) && isSamePtr(idx, idx2) => (MOVDconst [0])
+(MOVDloadidx8  ptr idx (MOVDstorezeroidx8 ptr2 idx2 _)) && isSamePtr(ptr, ptr2) && isSamePtr(idx, idx2) => (MOVDconst [0])
 
 // don't extend after proper load
-(MOVBreg x:(MOVBload _ _)) => (MOVDreg x)
+(MOVBreg  x:(MOVBload  _ _)) => (MOVDreg x)
 (MOVBUreg x:(MOVBUload _ _)) => (MOVDreg x)
-(MOVHreg x:(MOVBload _ _)) => (MOVDreg x)
-(MOVHreg x:(MOVBUload _ _)) => (MOVDreg x)
-(MOVHreg x:(MOVHload _ _)) => (MOVDreg x)
+(MOVHreg  x:(MOVBload  _ _)) => (MOVDreg x)
+(MOVHreg  x:(MOVBUload _ _)) => (MOVDreg x)
+(MOVHreg  x:(MOVHload  _ _)) => (MOVDreg x)
 (MOVHUreg x:(MOVBUload _ _)) => (MOVDreg x)
 (MOVHUreg x:(MOVHUload _ _)) => (MOVDreg x)
-(MOVWreg x:(MOVBload _ _)) => (MOVDreg x)
-(MOVWreg x:(MOVBUload _ _)) => (MOVDreg x)
-(MOVWreg x:(MOVHload _ _)) => (MOVDreg x)
-(MOVWreg x:(MOVHUload _ _)) => (MOVDreg x)
-(MOVWreg x:(MOVWload _ _)) => (MOVDreg x)
+(MOVWreg  x:(MOVBload  _ _)) => (MOVDreg x)
+(MOVWreg  x:(MOVBUload _ _)) => (MOVDreg x)
+(MOVWreg  x:(MOVHload  _ _)) => (MOVDreg x)
+(MOVWreg  x:(MOVHUload _ _)) => (MOVDreg x)
+(MOVWreg  x:(MOVWload  _ _)) => (MOVDreg x)
 (MOVWUreg x:(MOVBUload _ _)) => (MOVDreg x)
 (MOVWUreg x:(MOVHUload _ _)) => (MOVDreg x)
 (MOVWUreg x:(MOVWUload _ _)) => (MOVDreg x)
-(MOVBreg x:(MOVBloadidx _  _ _)) => (MOVDreg x)
-(MOVBUreg x:(MOVBUloadidx _ _ _)) => (MOVDreg x)
-(MOVHreg x:(MOVBloadidx _ _ _)) => (MOVDreg x)
-(MOVHreg x:(MOVBUloadidx _ _ _)) => (MOVDreg x)
-(MOVHreg x:(MOVHloadidx _ _ _)) => (MOVDreg x)
-(MOVHUreg x:(MOVBUloadidx _ _ _)) => (MOVDreg x)
-(MOVHUreg x:(MOVHUloadidx _ _ _)) => (MOVDreg x)
-(MOVWreg x:(MOVBloadidx _ _ _)) => (MOVDreg x)
-(MOVWreg x:(MOVBUloadidx _ _ _)) => (MOVDreg x)
-(MOVWreg x:(MOVHloadidx _ _ _)) => (MOVDreg x)
-(MOVWreg x:(MOVHUloadidx _ _ _)) => (MOVDreg x)
-(MOVWreg x:(MOVWloadidx _ _ _)) => (MOVDreg x)
-(MOVWUreg x:(MOVBUloadidx _ _ _)) => (MOVDreg x)
-(MOVWUreg x:(MOVHUloadidx _ _ _)) => (MOVDreg x)
-(MOVWUreg x:(MOVWUloadidx _ _ _)) => (MOVDreg x)
-(MOVHreg x:(MOVHloadidx2 _ _ _)) => (MOVDreg x)
+(MOVBreg  x:(MOVBloadidx  _  _ _)) => (MOVDreg x)
+(MOVBUreg x:(MOVBUloadidx  _ _ _)) => (MOVDreg x)
+(MOVHreg  x:(MOVBloadidx   _ _ _)) => (MOVDreg x)
+(MOVHreg  x:(MOVBUloadidx  _ _ _)) => (MOVDreg x)
+(MOVHreg  x:(MOVHloadidx   _ _ _)) => (MOVDreg x)
+(MOVHUreg x:(MOVBUloadidx  _ _ _)) => (MOVDreg x)
+(MOVHUreg x:(MOVHUloadidx  _ _ _)) => (MOVDreg x)
+(MOVWreg  x:(MOVBloadidx   _ _ _)) => (MOVDreg x)
+(MOVWreg  x:(MOVBUloadidx  _ _ _)) => (MOVDreg x)
+(MOVWreg  x:(MOVHloadidx   _ _ _)) => (MOVDreg x)
+(MOVWreg  x:(MOVHUloadidx  _ _ _)) => (MOVDreg x)
+(MOVWreg  x:(MOVWloadidx   _ _ _)) => (MOVDreg x)
+(MOVWUreg x:(MOVBUloadidx  _ _ _)) => (MOVDreg x)
+(MOVWUreg x:(MOVHUloadidx  _ _ _)) => (MOVDreg x)
+(MOVWUreg x:(MOVWUloadidx  _ _ _)) => (MOVDreg x)
+(MOVHreg  x:(MOVHloadidx2  _ _ _)) => (MOVDreg x)
 (MOVHUreg x:(MOVHUloadidx2 _ _ _)) => (MOVDreg x)
-(MOVWreg x:(MOVHloadidx2 _ _ _)) => (MOVDreg x)
-(MOVWreg x:(MOVHUloadidx2 _ _ _)) => (MOVDreg x)
-(MOVWreg x:(MOVWloadidx4 _ _ _)) => (MOVDreg x)
+(MOVWreg  x:(MOVHloadidx2  _ _ _)) => (MOVDreg x)
+(MOVWreg  x:(MOVHUloadidx2 _ _ _)) => (MOVDreg x)
+(MOVWreg  x:(MOVWloadidx4  _ _ _)) => (MOVDreg x)
 (MOVWUreg x:(MOVHUloadidx2 _ _ _)) => (MOVDreg x)
 (MOVWUreg x:(MOVWUloadidx4 _ _ _)) => (MOVDreg x)
 
 // fold double extensions
-(MOVBreg x:(MOVBreg _)) => (MOVDreg x)
+(MOVBreg  x:(MOVBreg  _)) => (MOVDreg x)
 (MOVBUreg x:(MOVBUreg _)) => (MOVDreg x)
-(MOVHreg x:(MOVBreg _)) => (MOVDreg x)
-(MOVHreg x:(MOVBUreg _)) => (MOVDreg x)
-(MOVHreg x:(MOVHreg _)) => (MOVDreg x)
+(MOVHreg  x:(MOVBreg  _)) => (MOVDreg x)
+(MOVHreg  x:(MOVBUreg _)) => (MOVDreg x)
+(MOVHreg  x:(MOVHreg  _)) => (MOVDreg x)
 (MOVHUreg x:(MOVBUreg _)) => (MOVDreg x)
 (MOVHUreg x:(MOVHUreg _)) => (MOVDreg x)
-(MOVWreg x:(MOVBreg _)) => (MOVDreg x)
-(MOVWreg x:(MOVBUreg _)) => (MOVDreg x)
-(MOVWreg x:(MOVHreg _)) => (MOVDreg x)
-(MOVWreg x:(MOVWreg _)) => (MOVDreg x)
+(MOVWreg  x:(MOVBreg  _)) => (MOVDreg x)
+(MOVWreg  x:(MOVBUreg _)) => (MOVDreg x)
+(MOVWreg  x:(MOVHreg  _)) => (MOVDreg x)
+(MOVWreg  x:(MOVWreg  _)) => (MOVDreg x)
 (MOVWUreg x:(MOVBUreg _)) => (MOVDreg x)
 (MOVWUreg x:(MOVHUreg _)) => (MOVDreg x)
 (MOVWUreg x:(MOVWUreg _)) => (MOVDreg x)
 
 // don't extend before store
-(MOVBstore [off] {sym} ptr (MOVBreg x) mem) => (MOVBstore [off] {sym} ptr x mem)
+(MOVBstore [off] {sym} ptr (MOVBreg  x) mem) => (MOVBstore [off] {sym} ptr x mem)
 (MOVBstore [off] {sym} ptr (MOVBUreg x) mem) => (MOVBstore [off] {sym} ptr x mem)
-(MOVBstore [off] {sym} ptr (MOVHreg x) mem) => (MOVBstore [off] {sym} ptr x mem)
+(MOVBstore [off] {sym} ptr (MOVHreg  x) mem) => (MOVBstore [off] {sym} ptr x mem)
 (MOVBstore [off] {sym} ptr (MOVHUreg x) mem) => (MOVBstore [off] {sym} ptr x mem)
-(MOVBstore [off] {sym} ptr (MOVWreg x) mem) => (MOVBstore [off] {sym} ptr x mem)
+(MOVBstore [off] {sym} ptr (MOVWreg  x) mem) => (MOVBstore [off] {sym} ptr x mem)
 (MOVBstore [off] {sym} ptr (MOVWUreg x) mem) => (MOVBstore [off] {sym} ptr x mem)
-(MOVHstore [off] {sym} ptr (MOVHreg x) mem) => (MOVHstore [off] {sym} ptr x mem)
+(MOVHstore [off] {sym} ptr (MOVHreg  x) mem) => (MOVHstore [off] {sym} ptr x mem)
 (MOVHstore [off] {sym} ptr (MOVHUreg x) mem) => (MOVHstore [off] {sym} ptr x mem)
-(MOVHstore [off] {sym} ptr (MOVWreg x) mem) => (MOVHstore [off] {sym} ptr x mem)
+(MOVHstore [off] {sym} ptr (MOVWreg  x) mem) => (MOVHstore [off] {sym} ptr x mem)
 (MOVHstore [off] {sym} ptr (MOVWUreg x) mem) => (MOVHstore [off] {sym} ptr x mem)
-(MOVWstore [off] {sym} ptr (MOVWreg x) mem) => (MOVWstore [off] {sym} ptr x mem)
+(MOVWstore [off] {sym} ptr (MOVWreg  x) mem) => (MOVWstore [off] {sym} ptr x mem)
 (MOVWstore [off] {sym} ptr (MOVWUreg x) mem) => (MOVWstore [off] {sym} ptr x mem)
-(MOVBstoreidx ptr idx (MOVBreg x) mem) => (MOVBstoreidx ptr idx x mem)
-(MOVBstoreidx ptr idx (MOVBUreg x) mem) => (MOVBstoreidx ptr idx x mem)
-(MOVBstoreidx ptr idx (MOVHreg x) mem) => (MOVBstoreidx ptr idx x mem)
-(MOVBstoreidx ptr idx (MOVHUreg x) mem) => (MOVBstoreidx ptr idx x mem)
-(MOVBstoreidx ptr idx (MOVWreg x) mem) => (MOVBstoreidx ptr idx x mem)
-(MOVBstoreidx ptr idx (MOVWUreg x) mem) => (MOVBstoreidx ptr idx x mem)
-(MOVHstoreidx ptr idx (MOVHreg x) mem) => (MOVHstoreidx ptr idx x mem)
-(MOVHstoreidx ptr idx (MOVHUreg x) mem) => (MOVHstoreidx ptr idx x mem)
-(MOVHstoreidx ptr idx (MOVWreg x) mem) => (MOVHstoreidx ptr idx x mem)
-(MOVHstoreidx ptr idx (MOVWUreg x) mem) => (MOVHstoreidx ptr idx x mem)
-(MOVWstoreidx ptr idx (MOVWreg x) mem) => (MOVWstoreidx ptr idx x mem)
-(MOVWstoreidx ptr idx (MOVWUreg x) mem) => (MOVWstoreidx ptr idx x mem)
-(MOVHstoreidx2 ptr idx (MOVHreg x) mem) => (MOVHstoreidx2 ptr idx x mem)
+(MOVBstoreidx  ptr idx (MOVBreg  x) mem) => (MOVBstoreidx  ptr idx x mem)
+(MOVBstoreidx  ptr idx (MOVBUreg x) mem) => (MOVBstoreidx  ptr idx x mem)
+(MOVBstoreidx  ptr idx (MOVHreg  x) mem) => (MOVBstoreidx  ptr idx x mem)
+(MOVBstoreidx  ptr idx (MOVHUreg x) mem) => (MOVBstoreidx  ptr idx x mem)
+(MOVBstoreidx  ptr idx (MOVWreg  x) mem) => (MOVBstoreidx  ptr idx x mem)
+(MOVBstoreidx  ptr idx (MOVWUreg x) mem) => (MOVBstoreidx  ptr idx x mem)
+(MOVHstoreidx  ptr idx (MOVHreg  x) mem) => (MOVHstoreidx  ptr idx x mem)
+(MOVHstoreidx  ptr idx (MOVHUreg x) mem) => (MOVHstoreidx  ptr idx x mem)
+(MOVHstoreidx  ptr idx (MOVWreg  x) mem) => (MOVHstoreidx  ptr idx x mem)
+(MOVHstoreidx  ptr idx (MOVWUreg x) mem) => (MOVHstoreidx  ptr idx x mem)
+(MOVWstoreidx  ptr idx (MOVWreg  x) mem) => (MOVWstoreidx  ptr idx x mem)
+(MOVWstoreidx  ptr idx (MOVWUreg x) mem) => (MOVWstoreidx  ptr idx x mem)
+(MOVHstoreidx2 ptr idx (MOVHreg  x) mem) => (MOVHstoreidx2 ptr idx x mem)
 (MOVHstoreidx2 ptr idx (MOVHUreg x) mem) => (MOVHstoreidx2 ptr idx x mem)
-(MOVHstoreidx2 ptr idx (MOVWreg x) mem) => (MOVHstoreidx2 ptr idx x mem)
+(MOVHstoreidx2 ptr idx (MOVWreg  x) mem) => (MOVHstoreidx2 ptr idx x mem)
 (MOVHstoreidx2 ptr idx (MOVWUreg x) mem) => (MOVHstoreidx2 ptr idx x mem)
-(MOVWstoreidx4 ptr idx (MOVWreg x) mem) => (MOVWstoreidx4 ptr idx x mem)
+(MOVWstoreidx4 ptr idx (MOVWreg  x) mem) => (MOVWstoreidx4 ptr idx x mem)
 (MOVWstoreidx4 ptr idx (MOVWUreg x) mem) => (MOVWstoreidx4 ptr idx x mem)
 
 // if a register move has only 1 use, just use the same register without emitting instruction
@@ -1240,18 +1147,18 @@
 (MOVDnop (MOVDconst [c])) => (MOVDconst [c])
 
 // fold constant into arithmetic ops
-(ADD x (MOVDconst [c])) => (ADDconst [c] x)
-(SUB x (MOVDconst [c])) => (SUBconst [c] x)
-(AND x (MOVDconst [c])) => (ANDconst [c] x)
-(OR  x (MOVDconst [c])) => (ORconst  [c] x)
-(XOR x (MOVDconst [c])) => (XORconst [c] x)
-(TST x (MOVDconst [c])) => (TSTconst [c] x)
+(ADD  x (MOVDconst <t> [c])) && !t.IsPtr() => (ADDconst [c] x)
+(SUB  x (MOVDconst [c])) => (SUBconst [c] x)
+(AND  x (MOVDconst [c])) => (ANDconst [c] x)
+(OR   x (MOVDconst [c])) => (ORconst  [c] x)
+(XOR  x (MOVDconst [c])) => (XORconst [c] x)
+(TST  x (MOVDconst [c])) => (TSTconst [c] x)
 (TSTW x (MOVDconst [c])) => (TSTWconst [int32(c)] x)
-(CMN x (MOVDconst [c])) => (CMNconst [c] x)
+(CMN  x (MOVDconst [c])) => (CMNconst [c] x)
 (CMNW x (MOVDconst [c])) => (CMNWconst [int32(c)] x)
-(BIC x (MOVDconst [c])) => (ANDconst [^c] x)
-(EON x (MOVDconst [c])) => (XORconst [^c] x)
-(ORN x (MOVDconst [c])) => (ORconst  [^c] x)
+(BIC  x (MOVDconst [c])) => (ANDconst [^c] x)
+(EON  x (MOVDconst [c])) => (XORconst [^c] x)
+(ORN  x (MOVDconst [c])) => (ORconst  [^c] x)
 
 (SLL x (MOVDconst [c])) => (SLLconst x [c&63])
 (SRL x (MOVDconst [c])) => (SRLconst x [c&63])
@@ -1260,12 +1167,12 @@
 (SRL x (ANDconst [63] y)) => (SRL x y)
 (SRA x (ANDconst [63] y)) => (SRA x y)
 
-(CMP x (MOVDconst [c])) => (CMPconst [c] x)
-(CMP (MOVDconst [c]) x) => (InvertFlags (CMPconst [c] x))
+(CMP  x (MOVDconst [c])) => (CMPconst [c] x)
+(CMP  (MOVDconst [c]) x) => (InvertFlags (CMPconst [c] x))
 (CMPW x (MOVDconst [c])) => (CMPWconst [int32(c)] x)
 (CMPW (MOVDconst [c]) x) => (InvertFlags (CMPWconst [int32(c)] x))
 
-(ROR x (MOVDconst [c])) => (RORconst x [c&63])
+(ROR  x (MOVDconst [c])) => (RORconst x [c&63])
 (RORW x (MOVDconst [c])) => (RORWconst x [c&31])
 
 (ADDSflags x (MOVDconst [c]))  => (ADDSconstflags [c] x)
@@ -1276,10 +1183,10 @@
 ((CMP|CMPW) x y) && canonLessThan(x,y) => (InvertFlags ((CMP|CMPW) y x))
 
 // mul-neg => mneg
-(NEG (MUL x y)) => (MNEG x y)
-(NEG (MULW x y)) => (MNEGW x y)
-(MUL (NEG x) y) => (MNEG x y)
-(MULW (NEG x) y) => (MNEGW x y)
+(NEG  (MUL  x y)) => (MNEG  x y)
+(NEG  (MULW x y)) => (MNEGW x y)
+(MUL  (NEG  x) y) => (MNEG  x y)
+(MULW (NEG  x) y) => (MNEGW x y)
 
 // madd/msub
 (ADD a l:(MUL  x y)) && l.Uses==1 && clobber(l) => (MADD a x y)
@@ -1435,12 +1342,12 @@
 (MSUBW a (MOVDconst [c]) x) && c%9 == 0 && isPowerOfTwo64(c/9) && is32Bit(c) => (SUBshiftLL a (ADDshiftLL <x.Type> x x [3]) [log64(c/9)])
 
 // div by constant
-(UDIV x (MOVDconst [1])) => x
-(UDIV x (MOVDconst [c])) && isPowerOfTwo64(c) => (SRLconst [log64(c)] x)
+(UDIV  x (MOVDconst [1])) => x
+(UDIV  x (MOVDconst [c])) && isPowerOfTwo64(c) => (SRLconst [log64(c)] x)
 (UDIVW x (MOVDconst [c])) && uint32(c)==1 => x
 (UDIVW x (MOVDconst [c])) && isPowerOfTwo64(c) && is32Bit(c) => (SRLconst [log64(c)] x)
-(UMOD _ (MOVDconst [1])) => (MOVDconst [0])
-(UMOD x (MOVDconst [c])) && isPowerOfTwo64(c) => (ANDconst [c-1] x)
+(UMOD  _ (MOVDconst [1])) => (MOVDconst [0])
+(UMOD  x (MOVDconst [c])) && isPowerOfTwo64(c) => (ANDconst [c-1] x)
 (UMODW _ (MOVDconst [c])) && uint32(c)==1 => (MOVDconst [0])
 (UMODW x (MOVDconst [c])) && isPowerOfTwo64(c) && is32Bit(c) => (ANDconst [c-1] x)
 
@@ -1544,12 +1451,12 @@
 (CMNWconst (MOVDconst [x]) [y]) => (FlagConstant [addFlags32(int32(x),y)])
 
 // other known comparisons
-(CMPconst (MOVBUreg _) [c]) && 0xff < c => (FlagConstant [subFlags64(0,1)])
-(CMPconst (MOVHUreg _) [c]) && 0xffff < c => (FlagConstant [subFlags64(0,1)])
-(CMPconst (MOVWUreg _) [c]) && 0xffffffff < c => (FlagConstant [subFlags64(0,1)])
-(CMPconst (ANDconst _ [m]) [n]) && 0 <= m && m < n => (FlagConstant [subFlags64(0,1)])
-(CMPconst (SRLconst _ [c]) [n]) && 0 <= n && 0 < c && c <= 63 && (1<<uint64(64-c)) <= uint64(n) => (FlagConstant [subFlags64(0,1)])
-(CMPWconst (MOVBUreg _) [c]) && 0xff < c => (FlagConstant [subFlags64(0,1)])
+(CMPconst  (MOVBUreg _) [c]) && 0xff < c       => (FlagConstant [subFlags64(0,1)])
+(CMPconst  (MOVHUreg _) [c]) && 0xffff < c     => (FlagConstant [subFlags64(0,1)])
+(CMPconst  (MOVWUreg _) [c]) && 0xffffffff < c => (FlagConstant [subFlags64(0,1)])
+(CMPconst  (ANDconst _ [m]) [n]) && 0 <= m && m < n => (FlagConstant [subFlags64(0,1)])
+(CMPconst  (SRLconst _ [c]) [n]) && 0 <= n && 0 < c && c <= 63 && (1<<uint64(64-c)) <= uint64(n) => (FlagConstant [subFlags64(0,1)])
+(CMPWconst (MOVBUreg _) [c]) && 0xff   < c => (FlagConstant [subFlags64(0,1)])
 (CMPWconst (MOVHUreg _) [c]) && 0xffff < c => (FlagConstant [subFlags64(0,1)])
 
 // absorb flag constants into branches
@@ -1595,26 +1502,26 @@
 (GEnoov (FlagConstant [fc]) yes no) &&  fc.geNoov() => (First yes no)
 (GEnoov (FlagConstant [fc]) yes no) && !fc.geNoov() => (First no yes)
 
-(Z (MOVDconst [0]) yes no) => (First yes no)
-(Z (MOVDconst [c]) yes no) && c != 0 => (First no yes)
-(NZ (MOVDconst [0]) yes no) => (First no yes)
-(NZ (MOVDconst [c]) yes no) && c != 0 => (First yes no)
-(ZW (MOVDconst [c]) yes no) && int32(c) == 0 => (First yes no)
-(ZW (MOVDconst [c]) yes no) && int32(c) != 0 => (First no yes)
+(Z   (MOVDconst [0]) yes no)                  => (First yes no)
+(Z   (MOVDconst [c]) yes no) && c != 0        => (First no yes)
+(NZ  (MOVDconst [0]) yes no)                  => (First no yes)
+(NZ  (MOVDconst [c]) yes no) && c != 0        => (First yes no)
+(ZW  (MOVDconst [c]) yes no) && int32(c) == 0 => (First yes no)
+(ZW  (MOVDconst [c]) yes no) && int32(c) != 0 => (First no yes)
 (NZW (MOVDconst [c]) yes no) && int32(c) == 0 => (First no yes)
 (NZW (MOVDconst [c]) yes no) && int32(c) != 0 => (First yes no)
 
 // absorb InvertFlags into branches
-(LT (InvertFlags cmp) yes no) => (GT cmp yes no)
-(GT (InvertFlags cmp) yes no) => (LT cmp yes no)
-(LE (InvertFlags cmp) yes no) => (GE cmp yes no)
-(GE (InvertFlags cmp) yes no) => (LE cmp yes no)
+(LT  (InvertFlags cmp) yes no) => (GT cmp yes no)
+(GT  (InvertFlags cmp) yes no) => (LT cmp yes no)
+(LE  (InvertFlags cmp) yes no) => (GE cmp yes no)
+(GE  (InvertFlags cmp) yes no) => (LE cmp yes no)
 (ULT (InvertFlags cmp) yes no) => (UGT cmp yes no)
 (UGT (InvertFlags cmp) yes no) => (ULT cmp yes no)
 (ULE (InvertFlags cmp) yes no) => (UGE cmp yes no)
 (UGE (InvertFlags cmp) yes no) => (ULE cmp yes no)
-(EQ (InvertFlags cmp) yes no) => (EQ cmp yes no)
-(NE (InvertFlags cmp) yes no) => (NE cmp yes no)
+(EQ  (InvertFlags cmp) yes no) => (EQ cmp yes no)
+(NE  (InvertFlags cmp) yes no) => (NE cmp yes no)
 (FLT (InvertFlags cmp) yes no) => (FGT cmp yes no)
 (FGT (InvertFlags cmp) yes no) => (FLT cmp yes no)
 (FLE (InvertFlags cmp) yes no) => (FGE cmp yes no)
@@ -1625,58 +1532,60 @@
 (GTnoov (InvertFlags cmp) yes no) => (LTnoov cmp yes no)
 
 // absorb InvertFlags into conditional instructions
-(CSEL [cc] x y (InvertFlags cmp)) => (CSEL [arm64Invert(cc)] x y cmp)
-(CSEL0 [cc] x (InvertFlags cmp)) => (CSEL0 [arm64Invert(cc)] x cmp)
-(CSETM [cc] (InvertFlags cmp)) => (CSETM [arm64Invert(cc)] cmp)
+(CSEL  [cc] x y (InvertFlags cmp)) => (CSEL  [arm64Invert(cc)] x y cmp)
+(CSEL0 [cc] x   (InvertFlags cmp)) => (CSEL0 [arm64Invert(cc)] x   cmp)
+(CSETM [cc]     (InvertFlags cmp)) => (CSETM [arm64Invert(cc)]     cmp)
 (CSINC [cc] x y (InvertFlags cmp)) => (CSINC [arm64Invert(cc)] x y cmp)
 (CSINV [cc] x y (InvertFlags cmp)) => (CSINV [arm64Invert(cc)] x y cmp)
 (CSNEG [cc] x y (InvertFlags cmp)) => (CSNEG [arm64Invert(cc)] x y cmp)
 
 // absorb flag constants into boolean values
-(Equal (FlagConstant [fc])) => (MOVDconst [b2i(fc.eq())])
-(NotEqual (FlagConstant [fc])) => (MOVDconst [b2i(fc.ne())])
-(LessThan (FlagConstant [fc])) => (MOVDconst [b2i(fc.lt())])
-(LessThanU (FlagConstant [fc])) => (MOVDconst [b2i(fc.ult())])
-(LessEqual (FlagConstant [fc])) => (MOVDconst [b2i(fc.le())])
-(LessEqualU (FlagConstant [fc])) => (MOVDconst [b2i(fc.ule())])
-(GreaterThan (FlagConstant [fc])) => (MOVDconst [b2i(fc.gt())])
-(GreaterThanU (FlagConstant [fc])) => (MOVDconst [b2i(fc.ugt())])
-(GreaterEqual (FlagConstant [fc])) => (MOVDconst [b2i(fc.ge())])
+(Equal         (FlagConstant [fc])) => (MOVDconst [b2i(fc.eq())])
+(NotEqual      (FlagConstant [fc])) => (MOVDconst [b2i(fc.ne())])
+(LessThan      (FlagConstant [fc])) => (MOVDconst [b2i(fc.lt())])
+(LessThanU     (FlagConstant [fc])) => (MOVDconst [b2i(fc.ult())])
+(LessEqual     (FlagConstant [fc])) => (MOVDconst [b2i(fc.le())])
+(LessEqualU    (FlagConstant [fc])) => (MOVDconst [b2i(fc.ule())])
+(GreaterThan   (FlagConstant [fc])) => (MOVDconst [b2i(fc.gt())])
+(GreaterThanU  (FlagConstant [fc])) => (MOVDconst [b2i(fc.ugt())])
+(GreaterEqual  (FlagConstant [fc])) => (MOVDconst [b2i(fc.ge())])
 (GreaterEqualU (FlagConstant [fc])) => (MOVDconst [b2i(fc.uge())])
 
 // absorb InvertFlags into boolean values
-(Equal (InvertFlags x)) => (Equal x)
-(NotEqual (InvertFlags x)) => (NotEqual x)
-(LessThan (InvertFlags x)) => (GreaterThan x)
-(LessThanU (InvertFlags x)) => (GreaterThanU x)
-(GreaterThan (InvertFlags x)) => (LessThan x)
-(GreaterThanU (InvertFlags x)) => (LessThanU x)
-(LessEqual (InvertFlags x)) => (GreaterEqual x)
-(LessEqualU (InvertFlags x)) => (GreaterEqualU x)
-(GreaterEqual (InvertFlags x)) => (LessEqual x)
-(GreaterEqualU (InvertFlags x)) => (LessEqualU x)
-(LessThanF (InvertFlags x)) => (GreaterThanF x)
-(LessEqualF (InvertFlags x)) => (GreaterEqualF x)
-(GreaterThanF (InvertFlags x)) => (LessThanF x)
-(GreaterEqualF (InvertFlags x)) => (LessEqualF x)
+(Equal            (InvertFlags x)) => (Equal x)
+(NotEqual         (InvertFlags x)) => (NotEqual x)
+(LessThan         (InvertFlags x)) => (GreaterThan x)
+(LessThanU        (InvertFlags x)) => (GreaterThanU x)
+(GreaterThan      (InvertFlags x)) => (LessThan x)
+(GreaterThanU     (InvertFlags x)) => (LessThanU x)
+(LessEqual        (InvertFlags x)) => (GreaterEqual x)
+(LessEqualU       (InvertFlags x)) => (GreaterEqualU x)
+(GreaterEqual     (InvertFlags x)) => (LessEqual x)
+(GreaterEqualU    (InvertFlags x)) => (LessEqualU x)
+(LessThanF        (InvertFlags x)) => (GreaterThanF x)
+(LessEqualF       (InvertFlags x)) => (GreaterEqualF x)
+(GreaterThanF     (InvertFlags x)) => (LessThanF x)
+(GreaterEqualF    (InvertFlags x)) => (LessEqualF x)
+(LessThanNoov     (InvertFlags x)) => (BIC (GreaterEqualNoov <typ.Bool> x) (Equal <typ.Bool> x))
+(GreaterEqualNoov (InvertFlags x)) => (OR (LessThanNoov <typ.Bool> x) (Equal <typ.Bool> x))
 
 // Boolean-generating instructions (NOTE: NOT all boolean Values) always
 // zero upper bit of the register; no need to zero-extend
 (MOVBUreg x:((Equal|NotEqual|LessThan|LessThanU|LessThanF|LessEqual|LessEqualU|LessEqualF|GreaterThan|GreaterThanU|GreaterThanF|GreaterEqual|GreaterEqualU|GreaterEqualF) _)) => (MOVDreg x)
 
 // absorb flag constants into conditional instructions
-(CSEL [cc] x _ flag) && ccARM64Eval(cc, flag) > 0 => x
-(CSEL [cc] _ y flag) && ccARM64Eval(cc, flag) < 0 => y
-(CSEL0 [cc] x flag) && ccARM64Eval(cc, flag) > 0 => x
-(CSEL0 [cc] _ flag) && ccARM64Eval(cc, flag) < 0 => (MOVDconst [0])
+(CSEL  [cc] x _ flag) && ccARM64Eval(cc, flag) > 0 => x
+(CSEL  [cc] _ y flag) && ccARM64Eval(cc, flag) < 0 => y
+(CSEL0 [cc] x   flag) && ccARM64Eval(cc, flag) > 0 => x
+(CSEL0 [cc] _   flag) && ccARM64Eval(cc, flag) < 0 => (MOVDconst [0])
 (CSNEG [cc] x _ flag) && ccARM64Eval(cc, flag) > 0 => x
 (CSNEG [cc] _ y flag) && ccARM64Eval(cc, flag) < 0 => (NEG y)
 (CSINV [cc] x _ flag) && ccARM64Eval(cc, flag) > 0 => x
 (CSINV [cc] _ y flag) && ccARM64Eval(cc, flag) < 0 => (Not y)
 (CSINC [cc] x _ flag) && ccARM64Eval(cc, flag) > 0 => x
 (CSINC [cc] _ y flag) && ccARM64Eval(cc, flag) < 0 => (ADDconst [1] y)
-(CSETM [cc] flag) && ccARM64Eval(cc, flag) > 0 => (MOVDconst [-1])
-(CSETM [cc] flag) && ccARM64Eval(cc, flag) < 0 => (MOVDconst [0])
+(CSETM [cc]     flag) && ccARM64Eval(cc, flag) > 0 => (MOVDconst [-1])
+(CSETM [cc]     flag) && ccARM64Eval(cc, flag) < 0 => (MOVDconst [0])
 
 // absorb flags back into boolean CSEL
 (CSEL [cc] x y (CMPWconst [0] boolval)) && cc == OpARM64NotEqual && flagArg(boolval) != nil =>
@@ -1902,11 +1811,11 @@
 // int64(x << lc)
 (MOVWreg (SLLconst [lc] x)) && lc < 32 => (SBFIZ [armBFAuxInt(lc, 32-lc)] x)
 (MOVHreg (SLLconst [lc] x)) && lc < 16 => (SBFIZ [armBFAuxInt(lc, 16-lc)] x)
-(MOVBreg (SLLconst [lc] x)) && lc < 8 => (SBFIZ [armBFAuxInt(lc, 8-lc)] x)
+(MOVBreg (SLLconst [lc] x)) && lc < 8  => (SBFIZ [armBFAuxInt(lc,  8-lc)] x)
 // int64(x) << lc
 (SLLconst [lc] (MOVWreg x))  => (SBFIZ [armBFAuxInt(lc, min(32, 64-lc))] x)
 (SLLconst [lc] (MOVHreg x))  => (SBFIZ [armBFAuxInt(lc, min(16, 64-lc))] x)
-(SLLconst [lc] (MOVBreg x))  => (SBFIZ [armBFAuxInt(lc, min(8, 64-lc))] x)
+(SLLconst [lc] (MOVBreg x))  => (SBFIZ [armBFAuxInt(lc, min(8,  64-lc))] x)
 
 // sbfx
 // (x << lc) >> rc
@@ -1914,7 +1823,7 @@
 // int64(x) >> rc
 (SRAconst [rc] (MOVWreg x)) && rc < 32 => (SBFX [armBFAuxInt(rc, 32-rc)] x)
 (SRAconst [rc] (MOVHreg x)) && rc < 16 => (SBFX [armBFAuxInt(rc, 16-rc)] x)
-(SRAconst [rc] (MOVBreg x)) && rc < 8 => (SBFX [armBFAuxInt(rc, 8-rc)] x)
+(SRAconst [rc] (MOVBreg x)) && rc < 8  => (SBFX [armBFAuxInt(rc,  8-rc)] x)
 // merge sbfx and sign-extension into sbfx
 (MOVWreg (SBFX [bfc] x)) && bfc.getARM64BFwidth() <= 32 => (SBFX [bfc] x)
 (MOVHreg (SBFX [bfc] x)) && bfc.getARM64BFwidth() <= 16 => (SBFX [bfc] x)
@@ -1933,11 +1842,11 @@
 // uint64(x) << lc
 (SLLconst [lc] (MOVWUreg x))  => (UBFIZ [armBFAuxInt(lc, min(32, 64-lc))] x)
 (SLLconst [lc] (MOVHUreg x))  => (UBFIZ [armBFAuxInt(lc, min(16, 64-lc))] x)
-(SLLconst [lc] (MOVBUreg x))  => (UBFIZ [armBFAuxInt(lc, min(8, 64-lc))] x)
+(SLLconst [lc] (MOVBUreg x))  => (UBFIZ [armBFAuxInt(lc, min(8,  64-lc))] x)
 // uint64(x << lc)
 (MOVWUreg (SLLconst [lc] x)) && lc < 32 => (UBFIZ [armBFAuxInt(lc, 32-lc)] x)
 (MOVHUreg (SLLconst [lc] x)) && lc < 16 => (UBFIZ [armBFAuxInt(lc, 16-lc)] x)
-(MOVBUreg (SLLconst [lc] x)) && lc < 8 => (UBFIZ [armBFAuxInt(lc, 8-lc)] x)
+(MOVBUreg (SLLconst [lc] x)) && lc < 8  => (UBFIZ [armBFAuxInt(lc,  8-lc)] x)
 
 // merge ANDconst into ubfiz
 // (x & ac) << sc
@@ -1953,11 +1862,11 @@
 // uint64(x) >> rc
 (SRLconst [rc] (MOVWUreg x)) && rc < 32 => (UBFX [armBFAuxInt(rc, 32-rc)] x)
 (SRLconst [rc] (MOVHUreg x)) && rc < 16 => (UBFX [armBFAuxInt(rc, 16-rc)] x)
-(SRLconst [rc] (MOVBUreg x)) && rc < 8 => (UBFX [armBFAuxInt(rc, 8-rc)] x)
+(SRLconst [rc] (MOVBUreg x)) && rc < 8  => (UBFX [armBFAuxInt(rc,  8-rc)] x)
 // uint64(x >> rc)
 (MOVWUreg (SRLconst [rc] x)) && rc < 32 => (UBFX [armBFAuxInt(rc, 32)] x)
 (MOVHUreg (SRLconst [rc] x)) && rc < 16 => (UBFX [armBFAuxInt(rc, 16)] x)
-(MOVBUreg (SRLconst [rc] x)) && rc < 8 => (UBFX [armBFAuxInt(rc, 8)] x)
+(MOVBUreg (SRLconst [rc] x)) && rc < 8  => (UBFX [armBFAuxInt(rc,  8)] x)
 // merge ANDconst into ubfx
 // (x >> sc) & ac
 (ANDconst [ac] (SRLconst [sc] x)) && isARM64BFMask(sc, ac, 0)
@@ -2016,938 +1925,26 @@
 (ORshiftRL [rc] (ANDconst [ac] y) (SLLconst [lc] x)) && lc < rc && ac == ^((1<<uint(64-rc)-1))
 	=> (BFXIL [armBFAuxInt(rc-lc, 64-rc)] y x)
 
-// do combined loads
-// little endian loads
-// b[0] | b[1]<<8 => load 16-bit
-(ORshiftLL <t> [8]
-	y0:(MOVDnop x0:(MOVBUload [i0] {s} p mem))
-	y1:(MOVDnop x1:(MOVBUload [i1] {s} p mem)))
-	&& i1 == i0+1
-	&& x0.Uses == 1 && x1.Uses == 1
-	&& y0.Uses == 1 && y1.Uses == 1
-	&& mergePoint(b,x0,x1) != nil
-	&& clobber(x0, x1, y0, y1)
-	=> @mergePoint(b,x0,x1) (MOVHUload <t> {s} (OffPtr <p.Type> [int64(i0)] p) mem)
-(ORshiftLL <t> [8]
-	y0:(MOVDnop x0:(MOVBUloadidx ptr0 idx0 mem))
-	y1:(MOVDnop x1:(MOVBUload [1] {s} p1:(ADD ptr1 idx1) mem)))
-	&& s == nil
-	&& x0.Uses == 1 && x1.Uses == 1
-	&& y0.Uses == 1 && y1.Uses == 1
-	&& mergePoint(b,x0,x1) != nil
-	&& (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1))
-	&& clobber(x0, x1, y0, y1)
-	=> @mergePoint(b,x0,x1) (MOVHUloadidx <t> ptr0 idx0 mem)
-(ORshiftLL <t> [8]
-	y0:(MOVDnop x0:(MOVBUloadidx ptr idx mem))
-	y1:(MOVDnop x1:(MOVBUloadidx ptr (ADDconst [1] idx) mem)))
-	&& x0.Uses == 1 && x1.Uses == 1
-	&& y0.Uses == 1 && y1.Uses == 1
-	&& mergePoint(b,x0,x1) != nil
-	&& clobber(x0, x1, y0, y1)
-	=> @mergePoint(b,x0,x1) (MOVHUloadidx <t> ptr idx mem)
-
-// b[0] | b[1]<<8 | b[2]<<16 | b[3]<<24 => load 32-bit
-(ORshiftLL <t> [24] o0:(ORshiftLL [16]
-	            x0:(MOVHUload [i0] {s} p mem)
-	y1:(MOVDnop x1:(MOVBUload [i2] {s} p mem)))
-	y2:(MOVDnop x2:(MOVBUload [i3] {s} p mem)))
-	&& i2 == i0+2
-	&& i3 == i0+3
-	&& x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1
-	&& y1.Uses == 1 && y2.Uses == 1
-	&& o0.Uses == 1
-	&& mergePoint(b,x0,x1,x2) != nil
-	&& clobber(x0, x1, x2, y1, y2, o0)
-	=> @mergePoint(b,x0,x1,x2) (MOVWUload <t> {s} (OffPtr <p.Type> [int64(i0)] p) mem)
-(ORshiftLL <t> [24] o0:(ORshiftLL [16]
-	            x0:(MOVHUloadidx ptr0 idx0 mem)
-	y1:(MOVDnop x1:(MOVBUload [2] {s} p1:(ADD ptr1 idx1) mem)))
-	y2:(MOVDnop x2:(MOVBUload [3] {s} p mem)))
-	&& s == nil
-	&& x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1
-	&& y1.Uses == 1 && y2.Uses == 1
-	&& o0.Uses == 1
-	&& mergePoint(b,x0,x1,x2) != nil
-	&& (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1))
-	&& isSamePtr(p1, p)
-	&& clobber(x0, x1, x2, y1, y2, o0)
-	=> @mergePoint(b,x0,x1,x2) (MOVWUloadidx <t> ptr0 idx0 mem)
-(ORshiftLL <t> [24] o0:(ORshiftLL [16]
-	            x0:(MOVHUloadidx ptr idx mem)
-	y1:(MOVDnop x1:(MOVBUloadidx ptr (ADDconst [2] idx) mem)))
-	y2:(MOVDnop x2:(MOVBUloadidx ptr (ADDconst [3] idx) mem)))
-	&& x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1
-	&& y1.Uses == 1 && y2.Uses == 1
-	&& o0.Uses == 1
-	&& mergePoint(b,x0,x1,x2) != nil
-	&& clobber(x0, x1, x2, y1, y2, o0)
-	=> @mergePoint(b,x0,x1,x2) (MOVWUloadidx <t> ptr idx mem)
-(ORshiftLL <t> [24] o0:(ORshiftLL [16]
-	            x0:(MOVHUloadidx2 ptr0 idx0 mem)
-	y1:(MOVDnop x1:(MOVBUload [2] {s} p1:(ADDshiftLL [1] ptr1 idx1) mem)))
-	y2:(MOVDnop x2:(MOVBUload [3] {s} p mem)))
-	&& s == nil
-	&& x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1
-	&& y1.Uses == 1 && y2.Uses == 1
-	&& o0.Uses == 1
-	&& mergePoint(b,x0,x1,x2) != nil
-	&& isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1)
-	&& isSamePtr(p1, p)
-	&& clobber(x0, x1, x2, y1, y2, o0)
-	=> @mergePoint(b,x0,x1,x2) (MOVWUloadidx <t> ptr0 (SLLconst <idx0.Type> [1] idx0) mem)
-
-// b[0] | b[1]<<8 | b[2]<<16 | b[3]<<24 | b[4]<<32 | b[5]<<40 | b[6]<<48 | b[7]<<56 => load 64-bit
-(ORshiftLL <t> [56] o0:(ORshiftLL [48] o1:(ORshiftLL [40] o2:(ORshiftLL [32]
-	            x0:(MOVWUload [i0] {s} p mem)
-	y1:(MOVDnop x1:(MOVBUload [i4] {s} p mem)))
-	y2:(MOVDnop x2:(MOVBUload [i5] {s} p mem)))
-	y3:(MOVDnop x3:(MOVBUload [i6] {s} p mem)))
-	y4:(MOVDnop x4:(MOVBUload [i7] {s} p mem)))
-	&& i4 == i0+4
-	&& i5 == i0+5
-	&& i6 == i0+6
-	&& i7 == i0+7
-	&& x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1
-	&& y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1
-	&& o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1
-	&& mergePoint(b,x0,x1,x2,x3,x4) != nil
-	&& clobber(x0, x1, x2, x3, x4, y1, y2, y3, y4, o0, o1, o2)
-	=> @mergePoint(b,x0,x1,x2,x3,x4) (MOVDload <t> {s} (OffPtr <p.Type> [int64(i0)] p) mem)
-(ORshiftLL <t> [56] o0:(ORshiftLL [48] o1:(ORshiftLL [40] o2:(ORshiftLL [32]
-	            x0:(MOVWUloadidx ptr0 idx0 mem)
-	y1:(MOVDnop x1:(MOVBUload [4] {s} p1:(ADD ptr1 idx1) mem)))
-	y2:(MOVDnop x2:(MOVBUload [5] {s} p mem)))
-	y3:(MOVDnop x3:(MOVBUload [6] {s} p mem)))
-	y4:(MOVDnop x4:(MOVBUload [7] {s} p mem)))
-	&& s == nil
-	&& x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1
-	&& y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1
-	&& o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1
-	&& mergePoint(b,x0,x1,x2,x3,x4) != nil
-	&& (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1))
-	&& isSamePtr(p1, p)
-	&& clobber(x0, x1, x2, x3, x4, y1, y2, y3, y4, o0, o1, o2)
-	=> @mergePoint(b,x0,x1,x2,x3,x4) (MOVDloadidx <t> ptr0 idx0 mem)
-(ORshiftLL <t> [56] o0:(ORshiftLL [48] o1:(ORshiftLL [40] o2:(ORshiftLL [32]
-	            x0:(MOVWUloadidx4 ptr0 idx0 mem)
-	y1:(MOVDnop x1:(MOVBUload [4] {s} p1:(ADDshiftLL [2] ptr1 idx1) mem)))
-	y2:(MOVDnop x2:(MOVBUload [5] {s} p mem)))
-	y3:(MOVDnop x3:(MOVBUload [6] {s} p mem)))
-	y4:(MOVDnop x4:(MOVBUload [7] {s} p mem)))
-	&& s == nil
-	&& x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1
-	&& y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1
-	&& o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1
-	&& mergePoint(b,x0,x1,x2,x3,x4) != nil
-	&& isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1)
-	&& isSamePtr(p1, p)
-	&& clobber(x0, x1, x2, x3, x4, y1, y2, y3, y4, o0, o1, o2)
-	=> @mergePoint(b,x0,x1,x2,x3,x4) (MOVDloadidx <t> ptr0 (SLLconst <idx0.Type> [2] idx0) mem)
-(ORshiftLL <t> [56] o0:(ORshiftLL [48] o1:(ORshiftLL [40] o2:(ORshiftLL [32]
-	            x0:(MOVWUloadidx ptr idx mem)
-	y1:(MOVDnop x1:(MOVBUloadidx ptr (ADDconst [4] idx) mem)))
-	y2:(MOVDnop x2:(MOVBUloadidx ptr (ADDconst [5] idx) mem)))
-	y3:(MOVDnop x3:(MOVBUloadidx ptr (ADDconst [6] idx) mem)))
-	y4:(MOVDnop x4:(MOVBUloadidx ptr (ADDconst [7] idx) mem)))
-	&& x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1
-	&& y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1
-	&& o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1
-	&& mergePoint(b,x0,x1,x2,x3,x4) != nil
-	&& clobber(x0, x1, x2, x3, x4, y1, y2, y3, y4, o0, o1, o2)
-	=> @mergePoint(b,x0,x1,x2,x3,x4) (MOVDloadidx <t> ptr idx mem)
-
-// b[3]<<24 | b[2]<<16 | b[1]<<8 | b[0] => load 32-bit
-(OR <t> o0:(ORshiftLL [8] o1:(ORshiftLL [16] s0:(SLLconst [24]
-	y0:(MOVDnop x0:(MOVBUload [i3] {s} p mem)))
-	y1:(MOVDnop x1:(MOVBUload [i2] {s} p mem)))
-	y2:(MOVDnop x2:(MOVBUload [i1] {s} p mem)))
-	y3:(MOVDnop x3:(MOVBUload [i0] {s} p mem)))
-	&& i1 == i0+1
-	&& i2 == i0+2
-	&& i3 == i0+3
-	&& x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1
-	&& y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1
-	&& o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1
-	&& mergePoint(b,x0,x1,x2,x3) != nil
-	&& clobber(x0, x1, x2, x3, y0, y1, y2, y3, o0, o1, s0)
-	=> @mergePoint(b,x0,x1,x2,x3) (MOVWUload <t> {s} (OffPtr <p.Type> [int64(i0)] p) mem)
-(OR <t> o0:(ORshiftLL [8] o1:(ORshiftLL [16] s0:(SLLconst [24]
-	y0:(MOVDnop x0:(MOVBUload [3] {s} p mem)))
-	y1:(MOVDnop x1:(MOVBUload [2] {s} p mem)))
-	y2:(MOVDnop x2:(MOVBUload [1] {s} p1:(ADD ptr1 idx1) mem)))
-	y3:(MOVDnop x3:(MOVBUloadidx ptr0 idx0 mem)))
-	&& s == nil
-	&& x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1
-	&& y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1
-	&& o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1
-	&& mergePoint(b,x0,x1,x2,x3) != nil
-	&& (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1))
-	&& isSamePtr(p1, p)
-	&& clobber(x0, x1, x2, x3, y0, y1, y2, y3, o0, o1, s0)
-	=> @mergePoint(b,x0,x1,x2,x3) (MOVWUloadidx <t> ptr0 idx0 mem)
-(OR <t> o0:(ORshiftLL [8] o1:(ORshiftLL [16] s0:(SLLconst [24]
-	y0:(MOVDnop x0:(MOVBUloadidx ptr (ADDconst [3] idx) mem)))
-	y1:(MOVDnop x1:(MOVBUloadidx ptr (ADDconst [2] idx) mem)))
-	y2:(MOVDnop x2:(MOVBUloadidx ptr (ADDconst [1] idx) mem)))
-	y3:(MOVDnop x3:(MOVBUloadidx ptr idx mem)))
-	&& x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1
-	&& y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1
-	&& o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1
-	&& mergePoint(b,x0,x1,x2,x3) != nil
-	&& clobber(x0, x1, x2, x3, y0, y1, y2, y3, o0, o1, s0)
-	=> @mergePoint(b,x0,x1,x2,x3) (MOVWUloadidx <t> ptr idx mem)
-
-// b[7]<<56 | b[6]<<48 | b[5]<<40 | b[4]<<32 | b[3]<<24 | b[2]<<16 | b[1]<<8 | b[0] => load 64-bit
-(OR <t> o0:(ORshiftLL [8] o1:(ORshiftLL [16] o2:(ORshiftLL [24] o3:(ORshiftLL [32] o4:(ORshiftLL [40] o5:(ORshiftLL [48] s0:(SLLconst [56]
-	y0:(MOVDnop x0:(MOVBUload [i7] {s} p mem)))
-	y1:(MOVDnop x1:(MOVBUload [i6] {s} p mem)))
-	y2:(MOVDnop x2:(MOVBUload [i5] {s} p mem)))
-	y3:(MOVDnop x3:(MOVBUload [i4] {s} p mem)))
-	y4:(MOVDnop x4:(MOVBUload [i3] {s} p mem)))
-	y5:(MOVDnop x5:(MOVBUload [i2] {s} p mem)))
-	y6:(MOVDnop x6:(MOVBUload [i1] {s} p mem)))
-	y7:(MOVDnop x7:(MOVBUload [i0] {s} p mem)))
-	&& i1 == i0+1
-	&& i2 == i0+2
-	&& i3 == i0+3
-	&& i4 == i0+4
-	&& i5 == i0+5
-	&& i6 == i0+6
-	&& i7 == i0+7
-	&& x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1
-	&& x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1
-	&& y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1
-	&& y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1
-	&& o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1
-	&& o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1
-	&& mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) != nil
-	&& clobber(x0, x1, x2, x3, x4, x5, x6, x7, y0, y1, y2, y3, y4, y5, y6, y7, o0, o1, o2, o3, o4, o5, s0)
-	=> @mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) (MOVDload <t> {s} (OffPtr <p.Type> [int64(i0)] p) mem)
-(OR <t> o0:(ORshiftLL [8] o1:(ORshiftLL [16] o2:(ORshiftLL [24] o3:(ORshiftLL [32] o4:(ORshiftLL [40] o5:(ORshiftLL [48] s0:(SLLconst [56]
-	y0:(MOVDnop x0:(MOVBUload [7] {s} p mem)))
-	y1:(MOVDnop x1:(MOVBUload [6] {s} p mem)))
-	y2:(MOVDnop x2:(MOVBUload [5] {s} p mem)))
-	y3:(MOVDnop x3:(MOVBUload [4] {s} p mem)))
-	y4:(MOVDnop x4:(MOVBUload [3] {s} p mem)))
-	y5:(MOVDnop x5:(MOVBUload [2] {s} p mem)))
-	y6:(MOVDnop x6:(MOVBUload [1] {s} p1:(ADD ptr1 idx1) mem)))
-	y7:(MOVDnop x7:(MOVBUloadidx ptr0 idx0 mem)))
-	&& s == nil
-	&& x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1
-	&& x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1
-	&& y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1
-	&& y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1
-	&& o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1
-	&& o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1
-	&& mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) != nil
-	&& (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1))
-	&& isSamePtr(p1, p)
-	&& clobber(x0, x1, x2, x3, x4, x5, x6, x7, y0, y1, y2, y3, y4, y5, y6, y7, o0, o1, o2, o3, o4, o5, s0)
-	=> @mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) (MOVDloadidx <t> ptr0 idx0 mem)
-(OR <t> o0:(ORshiftLL [8] o1:(ORshiftLL [16] o2:(ORshiftLL [24] o3:(ORshiftLL [32] o4:(ORshiftLL [40] o5:(ORshiftLL [48] s0:(SLLconst [56]
-	y0:(MOVDnop x0:(MOVBUloadidx ptr (ADDconst [7] idx) mem)))
-	y1:(MOVDnop x1:(MOVBUloadidx ptr (ADDconst [6] idx) mem)))
-	y2:(MOVDnop x2:(MOVBUloadidx ptr (ADDconst [5] idx) mem)))
-	y3:(MOVDnop x3:(MOVBUloadidx ptr (ADDconst [4] idx) mem)))
-	y4:(MOVDnop x4:(MOVBUloadidx ptr (ADDconst [3] idx) mem)))
-	y5:(MOVDnop x5:(MOVBUloadidx ptr (ADDconst [2] idx) mem)))
-	y6:(MOVDnop x6:(MOVBUloadidx ptr (ADDconst [1] idx) mem)))
-	y7:(MOVDnop x7:(MOVBUloadidx ptr idx mem)))
-	&& x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1
-	&& x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1
-	&& y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1
-	&& y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1
-	&& o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1
-	&& o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1
-	&& mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) != nil
-	&& clobber(x0, x1, x2, x3, x4, x5, x6, x7, y0, y1, y2, y3, y4, y5, y6, y7, o0, o1, o2, o3, o4, o5, s0)
-	=> @mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) (MOVDloadidx <t> ptr idx mem)
-
-// big endian loads
-// b[1] | b[0]<<8 => load 16-bit, reverse
-(ORshiftLL <t> [8]
-	y0:(MOVDnop x0:(MOVBUload [i1] {s} p mem))
-	y1:(MOVDnop x1:(MOVBUload [i0] {s} p mem)))
-	&& i1 == i0+1
-	&& x0.Uses == 1 && x1.Uses == 1
-	&& y0.Uses == 1 && y1.Uses == 1
-	&& mergePoint(b,x0,x1) != nil
-	&& clobber(x0, x1, y0, y1)
-	=> @mergePoint(b,x0,x1) (REV16W <t> (MOVHUload <t> [i0] {s} p mem))
-(ORshiftLL <t> [8]
-	y0:(MOVDnop x0:(MOVBUload [1] {s} p1:(ADD ptr1 idx1) mem))
-	y1:(MOVDnop x1:(MOVBUloadidx ptr0 idx0 mem)))
-	&& s == nil
-	&& x0.Uses == 1 && x1.Uses == 1
-	&& y0.Uses == 1 && y1.Uses == 1
-	&& mergePoint(b,x0,x1) != nil
-	&& (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1))
-	&& clobber(x0, x1, y0, y1)
-	=> @mergePoint(b,x0,x1) (REV16W <t> (MOVHUloadidx <t> ptr0 idx0 mem))
-(ORshiftLL <t> [8]
-	y0:(MOVDnop x0:(MOVBUloadidx ptr (ADDconst [1] idx) mem))
-	y1:(MOVDnop x1:(MOVBUloadidx ptr idx mem)))
-	&& x0.Uses == 1 && x1.Uses == 1
-	&& y0.Uses == 1 && y1.Uses == 1
-	&& mergePoint(b,x0,x1) != nil
-	&& clobber(x0, x1, y0, y1)
-	=> @mergePoint(b,x0,x1) (REV16W <t> (MOVHUloadidx <t> ptr idx mem))
-
-// b[3] | b[2]<<8 | b[1]<<16 | b[0]<<24 => load 32-bit, reverse
-(ORshiftLL <t> [24] o0:(ORshiftLL [16]
-	y0:(REV16W  x0:(MOVHUload [i2] {s} p mem))
-	y1:(MOVDnop x1:(MOVBUload [i1] {s} p mem)))
-	y2:(MOVDnop x2:(MOVBUload [i0] {s} p mem)))
-	&& i1 == i0+1
-	&& i2 == i0+2
-	&& x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1
-	&& y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1
-	&& o0.Uses == 1
-	&& mergePoint(b,x0,x1,x2) != nil
-	&& clobber(x0, x1, x2, y0, y1, y2, o0)
-	=> @mergePoint(b,x0,x1,x2) (REVW <t> (MOVWUload <t> {s} (OffPtr <p.Type> [int64(i0)] p) mem))
-(ORshiftLL <t> [24] o0:(ORshiftLL [16]
-	y0:(REV16W  x0:(MOVHUload [2] {s} p mem))
-	y1:(MOVDnop x1:(MOVBUload [1] {s} p1:(ADD ptr1 idx1) mem)))
-	y2:(MOVDnop x2:(MOVBUloadidx ptr0 idx0 mem)))
-	&& s == nil
-	&& x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1
-	&& y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1
-	&& o0.Uses == 1
-	&& mergePoint(b,x0,x1,x2) != nil
-	&& (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1))
-	&& isSamePtr(p1, p)
-	&& clobber(x0, x1, x2, y0, y1, y2, o0)
-	=> @mergePoint(b,x0,x1,x2) (REVW <t> (MOVWUloadidx <t> ptr0 idx0 mem))
-(ORshiftLL <t> [24] o0:(ORshiftLL [16]
-	y0:(REV16W  x0:(MOVHUloadidx ptr (ADDconst [2] idx) mem))
-	y1:(MOVDnop x1:(MOVBUloadidx ptr (ADDconst [1] idx) mem)))
-	y2:(MOVDnop x2:(MOVBUloadidx ptr idx mem)))
-	&& x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1
-	&& y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1
-	&& o0.Uses == 1
-	&& mergePoint(b,x0,x1,x2) != nil
-	&& clobber(x0, x1, x2, y0, y1, y2, o0)
-	=> @mergePoint(b,x0,x1,x2) (REVW <t> (MOVWUloadidx <t> ptr idx mem))
-
-// b[7] | b[6]<<8 | b[5]<<16 | b[4]<<24 | b[3]<<32 | b[2]<<40 | b[1]<<48 | b[0]<<56 => load 64-bit, reverse
-(ORshiftLL <t> [56] o0:(ORshiftLL [48] o1:(ORshiftLL [40] o2:(ORshiftLL [32]
-	y0:(REVW    x0:(MOVWUload [i4] {s} p mem))
-	y1:(MOVDnop x1:(MOVBUload [i3] {s} p mem)))
-	y2:(MOVDnop x2:(MOVBUload [i2] {s} p mem)))
-	y3:(MOVDnop x3:(MOVBUload [i1] {s} p mem)))
-	y4:(MOVDnop x4:(MOVBUload [i0] {s} p mem)))
-	&& i1 == i0+1
-	&& i2 == i0+2
-	&& i3 == i0+3
-	&& i4 == i0+4
-	&& x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1
-	&& y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1
-	&& o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1
-	&& mergePoint(b,x0,x1,x2,x3,x4) != nil
-	&& clobber(x0, x1, x2, x3, x4, y0, y1, y2, y3, y4, o0, o1, o2)
-	=> @mergePoint(b,x0,x1,x2,x3,x4) (REV <t> (MOVDload <t> {s} (OffPtr <p.Type> [int64(i0)] p) mem))
-(ORshiftLL <t> [56] o0:(ORshiftLL [48] o1:(ORshiftLL [40] o2:(ORshiftLL [32]
-	y0:(REVW    x0:(MOVWUload [4] {s} p mem))
-	y1:(MOVDnop x1:(MOVBUload [3] {s} p mem)))
-	y2:(MOVDnop x2:(MOVBUload [2] {s} p mem)))
-	y3:(MOVDnop x3:(MOVBUload [1] {s} p1:(ADD ptr1 idx1) mem)))
-	y4:(MOVDnop x4:(MOVBUloadidx ptr0 idx0 mem)))
-	&& s == nil
-	&& x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1
-	&& y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1
-	&& o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1
-	&& mergePoint(b,x0,x1,x2,x3,x4) != nil
-	&& (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1))
-	&& isSamePtr(p1, p)
-	&& clobber(x0, x1, x2, x3, x4, y0, y1, y2, y3, y4, o0, o1, o2)
-	=> @mergePoint(b,x0,x1,x2,x3,x4) (REV <t> (MOVDloadidx <t> ptr0 idx0 mem))
-(ORshiftLL <t> [56] o0:(ORshiftLL [48] o1:(ORshiftLL [40] o2:(ORshiftLL [32]
-	y0:(REVW    x0:(MOVWUloadidx ptr (ADDconst [4] idx) mem))
-	y1:(MOVDnop x1:(MOVBUloadidx ptr (ADDconst [3] idx) mem)))
-	y2:(MOVDnop x2:(MOVBUloadidx ptr (ADDconst [2] idx) mem)))
-	y3:(MOVDnop x3:(MOVBUloadidx ptr (ADDconst [1] idx) mem)))
-	y4:(MOVDnop x4:(MOVBUloadidx ptr idx mem)))
-	&& x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1
-	&& y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1
-	&& o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1
-	&& mergePoint(b,x0,x1,x2,x3,x4) != nil
-	&& clobber(x0, x1, x2, x3, x4, y0, y1, y2, y3, y4, o0, o1, o2)
-	=> @mergePoint(b,x0,x1,x2,x3,x4) (REV <t> (MOVDloadidx <t> ptr idx mem))
-
-// b[0]<<24 | b[1]<<16 | b[2]<<8 | b[3] => load 32-bit, reverse
-(OR <t> o0:(ORshiftLL [8] o1:(ORshiftLL [16] s0:(SLLconst [24]
-	y0:(MOVDnop x0:(MOVBUload [i0] {s} p mem)))
-	y1:(MOVDnop x1:(MOVBUload [i1] {s} p mem)))
-	y2:(MOVDnop x2:(MOVBUload [i2] {s} p mem)))
-	y3:(MOVDnop x3:(MOVBUload [i3] {s} p mem)))
-	&& i1 == i0+1
-	&& i2 == i0+2
-	&& i3 == i0+3
-	&& x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1
-	&& y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1
-	&& o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1
-	&& mergePoint(b,x0,x1,x2,x3) != nil
-	&& clobber(x0, x1, x2, x3, y0, y1, y2, y3, o0, o1, s0)
-	=> @mergePoint(b,x0,x1,x2,x3) (REVW <t> (MOVWUload <t> {s} (OffPtr <p.Type> [int64(i0)] p) mem))
-(OR <t> o0:(ORshiftLL [8] o1:(ORshiftLL [16] s0:(SLLconst [24]
-	y0:(MOVDnop x0:(MOVBUloadidx ptr0 idx0 mem)))
-	y1:(MOVDnop x1:(MOVBUload [1] {s} p1:(ADD ptr1 idx1) mem)))
-	y2:(MOVDnop x2:(MOVBUload [2] {s} p mem)))
-	y3:(MOVDnop x3:(MOVBUload [3] {s} p mem)))
-	&& s == nil
-	&& x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1
-	&& y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1
-	&& o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1
-	&& mergePoint(b,x0,x1,x2,x3) != nil
-	&& (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1))
-	&& isSamePtr(p1, p)
-	&& clobber(x0, x1, x2, x3, y0, y1, y2, y3, o0, o1, s0)
-	=> @mergePoint(b,x0,x1,x2,x3) (REVW <t> (MOVWUloadidx <t> ptr0 idx0 mem))
-(OR <t> o0:(ORshiftLL [8] o1:(ORshiftLL [16] s0:(SLLconst [24]
-	y0:(MOVDnop x0:(MOVBUloadidx ptr idx mem)))
-	y1:(MOVDnop x1:(MOVBUloadidx ptr (ADDconst [1] idx) mem)))
-	y2:(MOVDnop x2:(MOVBUloadidx ptr (ADDconst [2] idx) mem)))
-	y3:(MOVDnop x3:(MOVBUloadidx ptr (ADDconst [3] idx) mem)))
-	&& x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1
-	&& y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1
-	&& o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1
-	&& mergePoint(b,x0,x1,x2,x3) != nil
-	&& clobber(x0, x1, x2, x3, y0, y1, y2, y3, o0, o1, s0)
-	=> @mergePoint(b,x0,x1,x2,x3) (REVW <t> (MOVWUloadidx <t> ptr idx mem))
-
-// b[0]<<56 | b[1]<<48 | b[2]<<40 | b[3]<<32 | b[4]<<24 | b[5]<<16 | b[6]<<8 | b[7] => load 64-bit, reverse
-(OR <t> o0:(ORshiftLL [8] o1:(ORshiftLL [16] o2:(ORshiftLL [24] o3:(ORshiftLL [32] o4:(ORshiftLL [40] o5:(ORshiftLL [48] s0:(SLLconst [56]
-	y0:(MOVDnop x0:(MOVBUload [i0] {s} p mem)))
-	y1:(MOVDnop x1:(MOVBUload [i1] {s} p mem)))
-	y2:(MOVDnop x2:(MOVBUload [i2] {s} p mem)))
-	y3:(MOVDnop x3:(MOVBUload [i3] {s} p mem)))
-	y4:(MOVDnop x4:(MOVBUload [i4] {s} p mem)))
-	y5:(MOVDnop x5:(MOVBUload [i5] {s} p mem)))
-	y6:(MOVDnop x6:(MOVBUload [i6] {s} p mem)))
-	y7:(MOVDnop x7:(MOVBUload [i7] {s} p mem)))
-	&& i1 == i0+1
-	&& i2 == i0+2
-	&& i3 == i0+3
-	&& i4 == i0+4
-	&& i5 == i0+5
-	&& i6 == i0+6
-	&& i7 == i0+7
-	&& x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1
-	&& x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1
-	&& y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1
-	&& y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1
-	&& o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1
-	&& o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1
-	&& mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) != nil
-	&& clobber(x0, x1, x2, x3, x4, x5, x6, x7, y0, y1, y2, y3, y4, y5, y6, y7, o0, o1, o2, o3, o4, o5, s0)
-	=> @mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) (REV <t> (MOVDload <t> {s} (OffPtr <p.Type> [int64(i0)] p) mem))
-(OR <t> o0:(ORshiftLL [8] o1:(ORshiftLL [16] o2:(ORshiftLL [24] o3:(ORshiftLL [32] o4:(ORshiftLL [40] o5:(ORshiftLL [48] s0:(SLLconst [56]
-	y0:(MOVDnop x0:(MOVBUloadidx ptr0 idx0 mem)))
-	y1:(MOVDnop x1:(MOVBUload [1] {s} p1:(ADD ptr1 idx1) mem)))
-	y2:(MOVDnop x2:(MOVBUload [2] {s} p mem)))
-	y3:(MOVDnop x3:(MOVBUload [3] {s} p mem)))
-	y4:(MOVDnop x4:(MOVBUload [4] {s} p mem)))
-	y5:(MOVDnop x5:(MOVBUload [5] {s} p mem)))
-	y6:(MOVDnop x6:(MOVBUload [6] {s} p mem)))
-	y7:(MOVDnop x7:(MOVBUload [7] {s} p mem)))
-	&& s == nil
-	&& x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1
-	&& x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1
-	&& y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1
-	&& y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1
-	&& o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1
-	&& o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1
-	&& mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) != nil
-	&& (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1))
-	&& isSamePtr(p1, p)
-	&& clobber(x0, x1, x2, x3, x4, x5, x6, x7, y0, y1, y2, y3, y4, y5, y6, y7, o0, o1, o2, o3, o4, o5, s0)
-	=> @mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) (REV <t> (MOVDloadidx <t> ptr0 idx0 mem))
-(OR <t> o0:(ORshiftLL [8] o1:(ORshiftLL [16] o2:(ORshiftLL [24] o3:(ORshiftLL [32] o4:(ORshiftLL [40] o5:(ORshiftLL [48] s0:(SLLconst [56]
-	y0:(MOVDnop x0:(MOVBUloadidx ptr idx mem)))
-	y1:(MOVDnop x1:(MOVBUloadidx ptr (ADDconst [1] idx) mem)))
-	y2:(MOVDnop x2:(MOVBUloadidx ptr (ADDconst [2] idx) mem)))
-	y3:(MOVDnop x3:(MOVBUloadidx ptr (ADDconst [3] idx) mem)))
-	y4:(MOVDnop x4:(MOVBUloadidx ptr (ADDconst [4] idx) mem)))
-	y5:(MOVDnop x5:(MOVBUloadidx ptr (ADDconst [5] idx) mem)))
-	y6:(MOVDnop x6:(MOVBUloadidx ptr (ADDconst [6] idx) mem)))
-	y7:(MOVDnop x7:(MOVBUloadidx ptr (ADDconst [7] idx) mem)))
-	&& x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1
-	&& x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1
-	&& y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1
-	&& y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1
-	&& o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1
-	&& o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1
-	&& mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) != nil
-	&& clobber(x0, x1, x2, x3, x4, x5, x6, x7, y0, y1, y2, y3, y4, y5, y6, y7, o0, o1, o2, o3, o4, o5, s0)
-	=> @mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) (REV <t> (MOVDloadidx <t> ptr idx mem))
-
-// Combine zero stores into larger (unaligned) stores.
-(MOVBstorezero [i] {s} ptr0 x:(MOVBstorezero [j] {s} ptr1 mem))
-	&& x.Uses == 1
-	&& areAdjacentOffsets(int64(i),int64(j),1)
-	&& isSamePtr(ptr0, ptr1)
-	&& clobber(x)
-	=> (MOVHstorezero [int32(min(int64(i),int64(j)))] {s} ptr0 mem)
-(MOVBstorezero [1] {s} (ADD ptr0 idx0) x:(MOVBstorezeroidx ptr1 idx1 mem))
-	&& x.Uses == 1
-	&& s == nil
-	&& (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1))
-	&& clobber(x)
-	=> (MOVHstorezeroidx ptr1 idx1 mem)
-(MOVBstorezeroidx ptr (ADDconst [1] idx) x:(MOVBstorezeroidx ptr idx mem))
-	&& x.Uses == 1
-	&& clobber(x)
-	=> (MOVHstorezeroidx ptr idx mem)
-(MOVHstorezero [i] {s} ptr0 x:(MOVHstorezero [j] {s} ptr1 mem))
-	&& x.Uses == 1
-	&& areAdjacentOffsets(int64(i),int64(j),2)
-	&& isSamePtr(ptr0, ptr1)
-	&& clobber(x)
-	=> (MOVWstorezero [int32(min(int64(i),int64(j)))] {s} ptr0 mem)
-(MOVHstorezero [2] {s} (ADD ptr0 idx0) x:(MOVHstorezeroidx ptr1 idx1 mem))
-	&& x.Uses == 1
-	&& s == nil
-	&& (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1))
-	&& clobber(x)
-	=> (MOVWstorezeroidx ptr1 idx1 mem)
-(MOVHstorezeroidx ptr (ADDconst [2] idx) x:(MOVHstorezeroidx ptr idx mem))
-	&& x.Uses == 1
-	&& clobber(x)
-	=> (MOVWstorezeroidx ptr idx mem)
-(MOVHstorezero [2] {s} (ADDshiftLL [1] ptr0 idx0) x:(MOVHstorezeroidx2 ptr1 idx1 mem))
-	&& x.Uses == 1
-	&& s == nil
-	&& isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1)
-	&& clobber(x)
-	=> (MOVWstorezeroidx ptr1 (SLLconst <idx1.Type> [1] idx1) mem)
-(MOVWstorezero [i] {s} ptr0 x:(MOVWstorezero [j] {s} ptr1 mem))
-	&& x.Uses == 1
-	&& areAdjacentOffsets(int64(i),int64(j),4)
-	&& isSamePtr(ptr0, ptr1)
-	&& clobber(x)
-	=> (MOVDstorezero [int32(min(int64(i),int64(j)))] {s} ptr0 mem)
-(MOVWstorezero [4] {s} (ADD ptr0 idx0) x:(MOVWstorezeroidx ptr1 idx1 mem))
-	&& x.Uses == 1
-	&& s == nil
-	&& (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1))
-	&& clobber(x)
-	=> (MOVDstorezeroidx ptr1 idx1 mem)
-(MOVWstorezeroidx ptr (ADDconst [4] idx) x:(MOVWstorezeroidx ptr idx mem))
-	&& x.Uses == 1
-	&& clobber(x)
-	=> (MOVDstorezeroidx ptr idx mem)
-(MOVWstorezero [4] {s} (ADDshiftLL [2] ptr0 idx0) x:(MOVWstorezeroidx4 ptr1 idx1 mem))
-	&& x.Uses == 1
-	&& s == nil
-	&& isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1)
-	&& clobber(x)
-	=> (MOVDstorezeroidx ptr1 (SLLconst <idx1.Type> [2] idx1) mem)
-(MOVDstorezero [i] {s} ptr0 x:(MOVDstorezero [j] {s} ptr1 mem))
-	&& x.Uses == 1
-	&& areAdjacentOffsets(int64(i),int64(j),8)
-	&& isSamePtr(ptr0, ptr1)
-	&& clobber(x)
-	=> (MOVQstorezero [int32(min(int64(i),int64(j)))] {s} ptr0 mem)
-(MOVDstorezero [8] {s} p0:(ADD ptr0 idx0) x:(MOVDstorezeroidx ptr1 idx1 mem))
-	&& x.Uses == 1
-	&& s == nil
-	&& (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1))
-	&& clobber(x)
-	=> (MOVQstorezero [0] {s} p0 mem)
-(MOVDstorezero [8] {s} p0:(ADDshiftLL [3] ptr0 idx0) x:(MOVDstorezeroidx8 ptr1 idx1 mem))
-	&& x.Uses == 1
-	&& s == nil
-	&& isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1)
-	&& clobber(x)
-	=> (MOVQstorezero [0] {s} p0 mem)
-
-// Combine stores into larger (unaligned) stores.
-(MOVBstore [i] {s} ptr0 (SRLconst [8] w) x:(MOVBstore [i-1] {s} ptr1 w mem))
-	&& x.Uses == 1
-	&& isSamePtr(ptr0, ptr1)
-	&& clobber(x)
-	=> (MOVHstore [i-1] {s} ptr0 w mem)
-(MOVBstore [1] {s} (ADD ptr0 idx0) (SRLconst [8] w) x:(MOVBstoreidx ptr1 idx1 w mem))
-	&& x.Uses == 1
-	&& s == nil
-	&& (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1))
-	&& clobber(x)
-	=> (MOVHstoreidx ptr1 idx1 w mem)
-(MOVBstoreidx ptr (ADDconst [1] idx) (SRLconst [8] w) x:(MOVBstoreidx ptr idx w mem))
-	&& x.Uses == 1
-	&& clobber(x)
-	=> (MOVHstoreidx ptr idx w mem)
-(MOVBstore [i] {s} ptr0 (UBFX [armBFAuxInt(8, 8)] w) x:(MOVBstore [i-1] {s} ptr1 w mem))
-	&& x.Uses == 1
-	&& isSamePtr(ptr0, ptr1)
-	&& clobber(x)
-	=> (MOVHstore [i-1] {s} ptr0 w mem)
-(MOVBstore [1] {s} (ADD ptr0 idx0) (UBFX [armBFAuxInt(8, 8)] w) x:(MOVBstoreidx ptr1 idx1 w mem))
-	&& x.Uses == 1
-	&& s == nil
-	&& (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1))
-	&& clobber(x)
-	=> (MOVHstoreidx ptr1 idx1 w mem)
-(MOVBstore [i] {s} ptr0 (UBFX [armBFAuxInt(8, 24)] w) x:(MOVBstore [i-1] {s} ptr1 w mem))
-	&& x.Uses == 1
-	&& isSamePtr(ptr0, ptr1)
-	&& clobber(x)
-	=> (MOVHstore [i-1] {s} ptr0 w mem)
-(MOVBstore [1] {s} (ADD ptr0 idx0) (UBFX [armBFAuxInt(8, 24)] w) x:(MOVBstoreidx ptr1 idx1 w mem))
-	&& x.Uses == 1
-	&& s == nil
-	&& (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1))
-	&& clobber(x)
-	=> (MOVHstoreidx ptr1 idx1 w mem)
-(MOVBstore [i] {s} ptr0 (SRLconst [8] (MOVDreg w)) x:(MOVBstore [i-1] {s} ptr1 w mem))
-	&& x.Uses == 1
-	&& isSamePtr(ptr0, ptr1)
-	&& clobber(x)
-	=> (MOVHstore [i-1] {s} ptr0 w mem)
-(MOVBstore [1] {s} (ADD ptr0 idx0) (SRLconst [8] (MOVDreg w)) x:(MOVBstoreidx ptr1 idx1 w mem))
-	&& x.Uses == 1
-	&& s == nil
-	&& (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1))
-	&& clobber(x)
-	=> (MOVHstoreidx ptr1 idx1 w mem)
-(MOVBstore [i] {s} ptr0 (SRLconst [j] w) x:(MOVBstore [i-1] {s} ptr1 w0:(SRLconst [j-8] w) mem))
-	&& x.Uses == 1
-	&& isSamePtr(ptr0, ptr1)
-	&& clobber(x)
-	=> (MOVHstore [i-1] {s} ptr0 w0 mem)
-(MOVBstore [1] {s} (ADD ptr0 idx0) (SRLconst [j] w) x:(MOVBstoreidx ptr1 idx1 w0:(SRLconst [j-8] w) mem))
-	&& x.Uses == 1
-	&& s == nil
-	&& (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1))
-	&& clobber(x)
-	=> (MOVHstoreidx ptr1 idx1 w0 mem)
-(MOVBstore [i] {s} ptr0 (UBFX [bfc] w) x:(MOVBstore [i-1] {s} ptr1 w0:(UBFX [bfc2] w) mem))
-	&& x.Uses == 1
-	&& isSamePtr(ptr0, ptr1)
-	&& bfc.getARM64BFwidth() == 32 - bfc.getARM64BFlsb()
-	&& bfc2.getARM64BFwidth() == 32 - bfc2.getARM64BFlsb()
-	&& bfc2.getARM64BFlsb() == bfc.getARM64BFlsb() - 8
-	&& clobber(x)
-	=> (MOVHstore [i-1] {s} ptr0 w0 mem)
-(MOVBstore [1] {s} (ADD ptr0 idx0) (UBFX [bfc] w) x:(MOVBstoreidx ptr1 idx1 w0:(UBFX [bfc2] w) mem))
-	&& x.Uses == 1
-	&& s == nil
-	&& (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1))
-	&& bfc.getARM64BFwidth() == 32 - bfc.getARM64BFlsb()
-	&& bfc2.getARM64BFwidth() == 32 - bfc2.getARM64BFlsb()
-	&& bfc2.getARM64BFlsb() == bfc.getARM64BFlsb() - 8
-	&& clobber(x)
-	=> (MOVHstoreidx ptr1 idx1 w0 mem)
-(MOVBstore [i] {s} ptr0 (SRLconst [j] (MOVDreg w)) x:(MOVBstore [i-1] {s} ptr1 w0:(SRLconst [j-8] (MOVDreg w)) mem))
-	&& x.Uses == 1
-	&& isSamePtr(ptr0, ptr1)
-	&& clobber(x)
-	=> (MOVHstore [i-1] {s} ptr0 w0 mem)
-(MOVBstore [1] {s} (ADD ptr0 idx0) (SRLconst [j] (MOVDreg w)) x:(MOVBstoreidx ptr1 idx1 w0:(SRLconst [j-8] (MOVDreg w)) mem))
-	&& x.Uses == 1
-	&& s == nil
-	&& (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1))
-	&& clobber(x)
-	=> (MOVHstoreidx ptr1 idx1 w0 mem)
-(MOVHstore [i] {s} ptr0 (SRLconst [16] w) x:(MOVHstore [i-2] {s} ptr1 w mem))
-	&& x.Uses == 1
-	&& isSamePtr(ptr0, ptr1)
-	&& clobber(x)
-	=> (MOVWstore [i-2] {s} ptr0 w mem)
-(MOVHstore [2] {s} (ADD ptr0 idx0) (SRLconst [16] w) x:(MOVHstoreidx ptr1 idx1 w mem))
-	&& x.Uses == 1
-	&& s == nil
-	&& (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1))
-	&& clobber(x)
-	=> (MOVWstoreidx ptr1 idx1 w mem)
-(MOVHstoreidx ptr (ADDconst [2] idx) (SRLconst [16] w) x:(MOVHstoreidx ptr idx w mem))
-	&& x.Uses == 1
-	&& clobber(x)
-	=> (MOVWstoreidx ptr idx w mem)
-(MOVHstore [2] {s} (ADDshiftLL [1] ptr0 idx0) (SRLconst [16] w) x:(MOVHstoreidx2 ptr1 idx1 w mem))
-	&& x.Uses == 1
-	&& s == nil
-	&& isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1)
-	&& clobber(x)
-	=> (MOVWstoreidx ptr1 (SLLconst <idx1.Type> [1] idx1) w mem)
-(MOVHstore [i] {s} ptr0 (UBFX [armBFAuxInt(16, 16)] w) x:(MOVHstore [i-2] {s} ptr1 w mem))
-	&& x.Uses == 1
-	&& isSamePtr(ptr0, ptr1)
-	&& clobber(x)
-	=> (MOVWstore [i-2] {s} ptr0 w mem)
-(MOVHstore [2] {s} (ADD ptr0 idx0) (UBFX [armBFAuxInt(16, 16)] w) x:(MOVHstoreidx ptr1 idx1 w mem))
-	&& x.Uses == 1
-	&& s == nil
-	&& (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1))
-	&& clobber(x)
-	=> (MOVWstoreidx ptr1 idx1 w mem)
-(MOVHstore [2] {s} (ADDshiftLL [1] ptr0 idx0) (UBFX [armBFAuxInt(16, 16)] w) x:(MOVHstoreidx2 ptr1 idx1 w mem))
-	&& x.Uses == 1
-	&& s == nil
-	&& isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1)
-	&& clobber(x)
-	=> (MOVWstoreidx ptr1 (SLLconst <idx1.Type> [1] idx1) w mem)
-(MOVHstore [i] {s} ptr0 (SRLconst [16] (MOVDreg w)) x:(MOVHstore [i-2] {s} ptr1 w mem))
-	&& x.Uses == 1
-	&& isSamePtr(ptr0, ptr1)
-	&& clobber(x)
-	=> (MOVWstore [i-2] {s} ptr0 w mem)
-(MOVHstore [2] {s} (ADD ptr0 idx0) (SRLconst [16] (MOVDreg w)) x:(MOVHstoreidx ptr1 idx1 w mem))
-	&& x.Uses == 1
-	&& s == nil
-	&& (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1))
-	&& clobber(x)
-	=> (MOVWstoreidx ptr1 idx1 w mem)
-(MOVHstore [2] {s} (ADDshiftLL [1] ptr0 idx0) (SRLconst [16] (MOVDreg w)) x:(MOVHstoreidx2 ptr1 idx1 w mem))
-	&& x.Uses == 1
-	&& s == nil
-	&& isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1)
-	&& clobber(x)
-	=> (MOVWstoreidx ptr1 (SLLconst <idx1.Type> [1] idx1) w mem)
-(MOVHstore [i] {s} ptr0 (SRLconst [j] w) x:(MOVHstore [i-2] {s} ptr1 w0:(SRLconst [j-16] w) mem))
-	&& x.Uses == 1
-	&& isSamePtr(ptr0, ptr1)
-	&& clobber(x)
-	=> (MOVWstore [i-2] {s} ptr0 w0 mem)
-(MOVHstore [2] {s} (ADD ptr0 idx0) (SRLconst [j] w) x:(MOVHstoreidx ptr1 idx1 w0:(SRLconst [j-16] w) mem))
-	&& x.Uses == 1
-	&& s == nil
-	&& (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1))
-	&& clobber(x)
-	=> (MOVWstoreidx ptr1 idx1 w0 mem)
-(MOVHstore [2] {s} (ADDshiftLL [1] ptr0 idx0) (SRLconst [j] w) x:(MOVHstoreidx2 ptr1 idx1 w0:(SRLconst [j-16] w) mem))
-	&& x.Uses == 1
-	&& s == nil
-	&& isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1)
-	&& clobber(x)
-	=> (MOVWstoreidx ptr1 (SLLconst <idx1.Type> [1] idx1) w0 mem)
-(MOVWstore [i] {s} ptr0 (SRLconst [32] w) x:(MOVWstore [i-4] {s} ptr1 w mem))
-	&& x.Uses == 1
-	&& isSamePtr(ptr0, ptr1)
-	&& clobber(x)
-	=> (MOVDstore [i-4] {s} ptr0 w mem)
-(MOVWstore [4] {s} (ADD ptr0 idx0) (SRLconst [32] w) x:(MOVWstoreidx ptr1 idx1 w mem))
-	&& x.Uses == 1
-	&& s == nil
-	&& (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1))
-	&& clobber(x)
-	=> (MOVDstoreidx ptr1 idx1 w mem)
-(MOVWstoreidx ptr (ADDconst [4] idx) (SRLconst [32] w) x:(MOVWstoreidx ptr idx w mem))
-	&& x.Uses == 1
-	&& clobber(x)
-	=> (MOVDstoreidx ptr idx w mem)
-(MOVWstore [4] {s} (ADDshiftLL [2] ptr0 idx0) (SRLconst [32] w) x:(MOVWstoreidx4 ptr1 idx1 w mem))
-	&& x.Uses == 1
-	&& s == nil
-	&& isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1)
-	&& clobber(x)
-	=> (MOVDstoreidx ptr1 (SLLconst <idx1.Type> [2] idx1) w mem)
-(MOVWstore [i] {s} ptr0 (SRLconst [j] w) x:(MOVWstore [i-4] {s} ptr1 w0:(SRLconst [j-32] w) mem))
-	&& x.Uses == 1
-	&& isSamePtr(ptr0, ptr1)
-	&& clobber(x)
-	=> (MOVDstore [i-4] {s} ptr0 w0 mem)
-(MOVWstore [4] {s} (ADD ptr0 idx0) (SRLconst [j] w) x:(MOVWstoreidx ptr1 idx1 w0:(SRLconst [j-32] w) mem))
-	&& x.Uses == 1
-	&& s == nil
-	&& (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1))
-	&& clobber(x)
-	=> (MOVDstoreidx ptr1 idx1 w0 mem)
-(MOVWstore [4] {s} (ADDshiftLL [2] ptr0 idx0) (SRLconst [j] w) x:(MOVWstoreidx4 ptr1 idx1 w0:(SRLconst [j-32] w) mem))
-	&& x.Uses == 1
-	&& s == nil
-	&& isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1)
-	&& clobber(x)
-	=> (MOVDstoreidx ptr1 (SLLconst <idx1.Type> [2] idx1) w0 mem)
-(MOVBstore [i] {s} ptr w
-	x0:(MOVBstore [i-1] {s} ptr (SRLconst [8] w)
-	x1:(MOVBstore [i-2] {s} ptr (SRLconst [16] w)
-	x2:(MOVBstore [i-3] {s} ptr (SRLconst [24] w)
-	x3:(MOVBstore [i-4] {s} ptr (SRLconst [32] w)
-	x4:(MOVBstore [i-5] {s} ptr (SRLconst [40] w)
-	x5:(MOVBstore [i-6] {s} ptr (SRLconst [48] w)
-	x6:(MOVBstore [i-7] {s} ptr (SRLconst [56] w) mem))))))))
-	&& x0.Uses == 1
-	&& x1.Uses == 1
-	&& x2.Uses == 1
-	&& x3.Uses == 1
-	&& x4.Uses == 1
-	&& x5.Uses == 1
-	&& x6.Uses == 1
-	&& clobber(x0, x1, x2, x3, x4, x5, x6)
-	=> (MOVDstore [i-7] {s} ptr (REV <w.Type> w) mem)
-(MOVBstore [7] {s} p w
-	x0:(MOVBstore [6] {s} p (SRLconst [8] w)
-	x1:(MOVBstore [5] {s} p (SRLconst [16] w)
-	x2:(MOVBstore [4] {s} p (SRLconst [24] w)
-	x3:(MOVBstore [3] {s} p (SRLconst [32] w)
-	x4:(MOVBstore [2] {s} p (SRLconst [40] w)
-	x5:(MOVBstore [1] {s} p1:(ADD ptr1 idx1) (SRLconst [48] w)
-	x6:(MOVBstoreidx ptr0 idx0 (SRLconst [56] w) mem))))))))
-	&& x0.Uses == 1
-	&& x1.Uses == 1
-	&& x2.Uses == 1
-	&& x3.Uses == 1
-	&& x4.Uses == 1
-	&& x5.Uses == 1
-	&& x6.Uses == 1
-	&& s == nil
-	&& (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1))
-	&& isSamePtr(p1, p)
-	&& clobber(x0, x1, x2, x3, x4, x5, x6)
-	=> (MOVDstoreidx ptr0 idx0 (REV <w.Type> w) mem)
-(MOVBstore [i] {s} ptr w
-	x0:(MOVBstore [i-1] {s} ptr (UBFX [armBFAuxInt(8, 24)] w)
-	x1:(MOVBstore [i-2] {s} ptr (UBFX [armBFAuxInt(16, 16)] w)
-	x2:(MOVBstore [i-3] {s} ptr (UBFX [armBFAuxInt(24, 8)] w) mem))))
-	&& x0.Uses == 1
-	&& x1.Uses == 1
-	&& x2.Uses == 1
-	&& clobber(x0, x1, x2)
-	=> (MOVWstore [i-3] {s} ptr (REVW <w.Type> w) mem)
-(MOVBstore [3] {s} p w
-	x0:(MOVBstore [2] {s} p (UBFX [armBFAuxInt(8, 24)] w)
-	x1:(MOVBstore [1] {s} p1:(ADD ptr1 idx1) (UBFX [armBFAuxInt(16, 16)] w)
-	x2:(MOVBstoreidx ptr0 idx0 (UBFX [armBFAuxInt(24, 8)] w) mem))))
-	&& x0.Uses == 1
-	&& x1.Uses == 1
-	&& x2.Uses == 1
-	&& s == nil
-	&& (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1))
-	&& isSamePtr(p1, p)
-	&& clobber(x0, x1, x2)
-	=> (MOVWstoreidx ptr0 idx0 (REVW <w.Type> w) mem)
-(MOVBstoreidx ptr (ADDconst [3] idx) w
-	x0:(MOVBstoreidx ptr (ADDconst [2] idx) (UBFX [armBFAuxInt(8, 24)] w)
-	x1:(MOVBstoreidx ptr (ADDconst [1] idx) (UBFX [armBFAuxInt(16, 16)] w)
-	x2:(MOVBstoreidx ptr idx (UBFX [armBFAuxInt(24, 8)] w) mem))))
-	&& x0.Uses == 1
-	&& x1.Uses == 1
-	&& x2.Uses == 1
-	&& clobber(x0, x1, x2)
-	=> (MOVWstoreidx ptr idx (REVW <w.Type> w) mem)
-(MOVBstoreidx ptr idx w
-	x0:(MOVBstoreidx ptr (ADDconst [1] idx) (UBFX [armBFAuxInt(8, 24)] w)
-	x1:(MOVBstoreidx ptr (ADDconst [2] idx) (UBFX [armBFAuxInt(16, 16)] w)
-	x2:(MOVBstoreidx ptr (ADDconst [3] idx) (UBFX [armBFAuxInt(24, 8)] w) mem))))
-	&& x0.Uses == 1
-	&& x1.Uses == 1
-	&& x2.Uses == 1
-	&& clobber(x0, x1, x2)
-	=> (MOVWstoreidx ptr idx w mem)
-(MOVBstore [i] {s} ptr w
-	x0:(MOVBstore [i-1] {s} ptr (SRLconst [8] (MOVDreg w))
-	x1:(MOVBstore [i-2] {s} ptr (SRLconst [16] (MOVDreg w))
-	x2:(MOVBstore [i-3] {s} ptr (SRLconst [24] (MOVDreg w)) mem))))
-	&& x0.Uses == 1
-	&& x1.Uses == 1
-	&& x2.Uses == 1
-	&& clobber(x0, x1, x2)
-	=> (MOVWstore [i-3] {s} ptr (REVW <w.Type> w) mem)
-(MOVBstore [3] {s} p w
-	x0:(MOVBstore [2] {s} p (SRLconst [8] (MOVDreg w))
-	x1:(MOVBstore [1] {s} p1:(ADD ptr1 idx1) (SRLconst [16] (MOVDreg w))
-	x2:(MOVBstoreidx ptr0 idx0 (SRLconst [24] (MOVDreg w)) mem))))
-	&& x0.Uses == 1
-	&& x1.Uses == 1
-	&& x2.Uses == 1
-	&& s == nil
-	&& (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1))
-	&& isSamePtr(p1, p)
-	&& clobber(x0, x1, x2)
-	=> (MOVWstoreidx ptr0 idx0 (REVW <w.Type> w) mem)
-(MOVBstore [i] {s} ptr w
-	x0:(MOVBstore [i-1] {s} ptr (SRLconst [8] w)
-	x1:(MOVBstore [i-2] {s} ptr (SRLconst [16] w)
-	x2:(MOVBstore [i-3] {s} ptr (SRLconst [24] w) mem))))
-	&& x0.Uses == 1
-	&& x1.Uses == 1
-	&& x2.Uses == 1
-	&& clobber(x0, x1, x2)
-	=> (MOVWstore [i-3] {s} ptr (REVW <w.Type> w) mem)
-(MOVBstore [3] {s} p w
-	x0:(MOVBstore [2] {s} p (SRLconst [8] w)
-	x1:(MOVBstore [1] {s} p1:(ADD ptr1 idx1) (SRLconst [16] w)
-	x2:(MOVBstoreidx ptr0 idx0 (SRLconst [24] w) mem))))
-	&& x0.Uses == 1
-	&& x1.Uses == 1
-	&& x2.Uses == 1
-	&& s == nil
-	&& (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1))
-	&& isSamePtr(p1, p)
-	&& clobber(x0, x1, x2)
-	=> (MOVWstoreidx ptr0 idx0 (REVW <w.Type> w) mem)
-(MOVBstore [i] {s} ptr w x:(MOVBstore [i-1] {s} ptr (SRLconst [8] w) mem))
-	&& x.Uses == 1
-	&& clobber(x)
-	=> (MOVHstore [i-1] {s} ptr (REV16W <w.Type> w) mem)
-(MOVBstore [1] {s} (ADD ptr1 idx1) w x:(MOVBstoreidx ptr0 idx0 (SRLconst [8] w) mem))
-	&& x.Uses == 1
-	&& s == nil
-	&& (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1))
-	&& clobber(x)
-	=> (MOVHstoreidx ptr0 idx0 (REV16W <w.Type> w) mem)
-(MOVBstore [i] {s} ptr w x:(MOVBstore [i-1] {s} ptr (UBFX [armBFAuxInt(8, 8)] w) mem))
-	&& x.Uses == 1
-	&& clobber(x)
-	=> (MOVHstore [i-1] {s} ptr (REV16W <w.Type> w) mem)
-(MOVBstore [1] {s} (ADD ptr1 idx1) w x:(MOVBstoreidx ptr0 idx0 (UBFX [armBFAuxInt(8, 8)] w) mem))
-	&& x.Uses == 1
-	&& s == nil
-	&& (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1))
-	&& clobber(x)
-	=> (MOVHstoreidx ptr0 idx0 (REV16W <w.Type> w) mem)
-(MOVBstoreidx ptr (ADDconst [1] idx) w x:(MOVBstoreidx ptr idx (UBFX [armBFAuxInt(8, 8)] w) mem))
-	&& x.Uses == 1
-	&& clobber(x)
-	=> (MOVHstoreidx ptr idx (REV16W <w.Type> w) mem)
-(MOVBstoreidx ptr idx w x:(MOVBstoreidx ptr (ADDconst [1] idx) (UBFX [armBFAuxInt(8, 8)] w) mem))
-	&& x.Uses == 1
-	&& clobber(x)
-	=> (MOVHstoreidx ptr idx w mem)
-(MOVBstore [i] {s} ptr w x:(MOVBstore [i-1] {s} ptr (SRLconst [8] (MOVDreg w)) mem))
-	&& x.Uses == 1
-	&& clobber(x)
-	=> (MOVHstore [i-1] {s} ptr (REV16W <w.Type> w) mem)
-(MOVBstore [1] {s} (ADD ptr1 idx1) w x:(MOVBstoreidx ptr0 idx0 (SRLconst [8] (MOVDreg w)) mem))
-	&& x.Uses == 1
-	&& s == nil
-	&& (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1))
-	&& clobber(x)
-	=> (MOVHstoreidx ptr0 idx0 (REV16W <w.Type> w) mem)
-(MOVBstore [i] {s} ptr w x:(MOVBstore [i-1] {s} ptr (UBFX [armBFAuxInt(8, 24)] w) mem))
-	&& x.Uses == 1
-	&& clobber(x)
-	=> (MOVHstore [i-1] {s} ptr (REV16W <w.Type> w) mem)
-(MOVBstore [1] {s} (ADD ptr1 idx1) w x:(MOVBstoreidx ptr0 idx0 (UBFX [armBFAuxInt(8, 24)] w) mem))
-	&& x.Uses == 1
-	&& s == nil
-	&& (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1))
-	&& clobber(x)
-	=> (MOVHstoreidx ptr0 idx0 (REV16W <w.Type> w) mem)
-
 // FP simplification
-(FNEGS (FMULS x y)) => (FNMULS x y)
-(FNEGD (FMULD x y)) => (FNMULD x y)
-(FMULS (FNEGS x) y) => (FNMULS x y)
-(FMULD (FNEGD x) y) => (FNMULD x y)
-(FNEGS (FNMULS x y)) => (FMULS x y)
-(FNEGD (FNMULD x y)) => (FMULD x y)
-(FNMULS (FNEGS x) y) => (FMULS x y)
-(FNMULD (FNEGD x) y) => (FMULD x y)
+(FNEGS  (FMULS  x y)) => (FNMULS x y)
+(FNEGD  (FMULD  x y)) => (FNMULD x y)
+(FMULS  (FNEGS  x) y) => (FNMULS x y)
+(FMULD  (FNEGD  x) y) => (FNMULD x y)
+(FNEGS  (FNMULS x y)) => (FMULS  x y)
+(FNEGD  (FNMULD x y)) => (FMULD  x y)
+(FNMULS (FNEGS  x) y) => (FMULS  x y)
+(FNMULD (FNEGD  x) y) => (FMULD  x y)
 
-(FADDS a (FMULS x y)) && a.Block.Func.useFMA(v) => (FMADDS a x y)
-(FADDD a (FMULD x y)) && a.Block.Func.useFMA(v) => (FMADDD a x y)
-(FSUBS a (FMULS x y)) && a.Block.Func.useFMA(v) => (FMSUBS a x y)
-(FSUBD a (FMULD x y)) && a.Block.Func.useFMA(v) => (FMSUBD a x y)
-(FSUBS (FMULS x y) a) && a.Block.Func.useFMA(v) => (FNMSUBS a x y)
-(FSUBD (FMULD x y) a) && a.Block.Func.useFMA(v) => (FNMSUBD a x y)
-(FADDS a (FNMULS x y)) && a.Block.Func.useFMA(v) => (FMSUBS a x y)
-(FADDD a (FNMULD x y)) && a.Block.Func.useFMA(v) => (FMSUBD a x y)
-(FSUBS a (FNMULS x y)) && a.Block.Func.useFMA(v) => (FMADDS a x y)
-(FSUBD a (FNMULD x y)) && a.Block.Func.useFMA(v) => (FMADDD a x y)
+(FADDS a (FMULS  x y)) && a.Block.Func.useFMA(v) => (FMADDS  a x y)
+(FADDD a (FMULD  x y)) && a.Block.Func.useFMA(v) => (FMADDD  a x y)
+(FSUBS a (FMULS  x y)) && a.Block.Func.useFMA(v) => (FMSUBS  a x y)
+(FSUBD a (FMULD  x y)) && a.Block.Func.useFMA(v) => (FMSUBD  a x y)
+(FSUBS (FMULS  x y) a) && a.Block.Func.useFMA(v) => (FNMSUBS a x y)
+(FSUBD (FMULD  x y) a) && a.Block.Func.useFMA(v) => (FNMSUBD a x y)
+(FADDS a (FNMULS x y)) && a.Block.Func.useFMA(v) => (FMSUBS  a x y)
+(FADDD a (FNMULD x y)) && a.Block.Func.useFMA(v) => (FMSUBD  a x y)
+(FSUBS a (FNMULS x y)) && a.Block.Func.useFMA(v) => (FMADDS  a x y)
+(FSUBD a (FNMULD x y)) && a.Block.Func.useFMA(v) => (FMADDD  a x y)
 (FSUBS (FNMULS x y) a) && a.Block.Func.useFMA(v) => (FNMADDS a x y)
 (FSUBD (FNMULD x y) a) && a.Block.Func.useFMA(v) => (FNMADDD a x y)
 
diff --git a/src/cmd/compile/internal/ssa/_gen/ARM64Ops.go b/src/cmd/compile/internal/ssa/_gen/ARM64Ops.go
index f7cc47b..2853e62 100644
--- a/src/cmd/compile/internal/ssa/_gen/ARM64Ops.go
+++ b/src/cmd/compile/internal/ssa/_gen/ARM64Ops.go
@@ -513,6 +513,9 @@
 		{name: "NotLessEqualF", argLength: 1, reg: readflags},    // bool, true flags encode floating-point x>y || x is unordered with y, false otherwise.
 		{name: "NotGreaterThanF", argLength: 1, reg: readflags},  // bool, true flags encode floating-point x<=y || x is unordered with y, false otherwise.
 		{name: "NotGreaterEqualF", argLength: 1, reg: readflags}, // bool, true flags encode floating-point x<y || x is unordered with y, false otherwise.
+		{name: "LessThanNoov", argLength: 1, reg: readflags},     // bool, true flags encode signed x<y but without honoring overflow, false otherwise.
+		{name: "GreaterEqualNoov", argLength: 1, reg: readflags}, // bool, true flags encode signed x>=y but without honoring overflow, false otherwise.
+
 		// duffzero
 		// arg0 = address of memory to zero
 		// arg1 = mem
@@ -603,8 +606,8 @@
 		// use of R26 (arm64.REGCTXT, the closure pointer)
 		{name: "LoweredGetClosurePtr", reg: regInfo{outputs: []regMask{buildReg("R26")}}, zeroWidth: true},
 
-		// LoweredGetCallerSP returns the SP of the caller of the current function.
-		{name: "LoweredGetCallerSP", reg: gp01, rematerializeable: true},
+		// LoweredGetCallerSP returns the SP of the caller of the current function. arg0=mem
+		{name: "LoweredGetCallerSP", argLength: 1, reg: gp01, rematerializeable: true},
 
 		// LoweredGetCallerPC evaluates to the PC to which its "caller" will return.
 		// I.e., if f calls g "calls" getcallerpc,
@@ -723,11 +726,12 @@
 		{name: "LoweredAtomicOr8Variant", argLength: 3, reg: gpxchg, resultNotInArgs: true, typ: "(UInt8,Mem)", faultOnNilArg0: true, hasSideEffects: true},
 		{name: "LoweredAtomicOr32Variant", argLength: 3, reg: gpxchg, resultNotInArgs: true, typ: "(UInt32,Mem)", faultOnNilArg0: true, hasSideEffects: true},
 
-		// LoweredWB invokes runtime.gcWriteBarrier. arg0=destptr, arg1=srcptr, arg2=mem, aux=runtime.gcWriteBarrier
+		// LoweredWB invokes runtime.gcWriteBarrier. arg0=mem, auxint=# of buffer entries needed
 		// It saves all GP registers if necessary,
 		// but clobbers R30 (LR) because it's a call.
 		// R16 and R17 may be clobbered by linker trampoline.
-		{name: "LoweredWB", argLength: 3, reg: regInfo{inputs: []regMask{buildReg("R2"), buildReg("R3")}, clobbers: (callerSave &^ gpg) | buildReg("R16 R17 R30")}, clobberFlags: true, aux: "Sym", symEffect: "None"},
+		// Returns a pointer to a write barrier buffer in R25.
+		{name: "LoweredWB", argLength: 1, reg: regInfo{clobbers: (callerSave &^ gpg) | buildReg("R16 R17 R30"), outputs: []regMask{buildReg("R25")}}, clobberFlags: true, aux: "Int64"},
 
 		// There are three of these functions so that they can have three different register inputs.
 		// When we check 0 <= c <= cap (A), then 0 <= b <= c (B), then 0 <= a <= b (C), we want the
diff --git a/src/cmd/compile/internal/ssa/_gen/ARMOps.go b/src/cmd/compile/internal/ssa/_gen/ARMOps.go
index de477a2..39d2469 100644
--- a/src/cmd/compile/internal/ssa/_gen/ARMOps.go
+++ b/src/cmd/compile/internal/ssa/_gen/ARMOps.go
@@ -531,8 +531,8 @@
 		// use of R7 (arm.REGCTXT, the closure pointer)
 		{name: "LoweredGetClosurePtr", reg: regInfo{outputs: []regMask{buildReg("R7")}}, zeroWidth: true},
 
-		// LoweredGetCallerSP returns the SP of the caller of the current function.
-		{name: "LoweredGetCallerSP", reg: gp01, rematerializeable: true},
+		// LoweredGetCallerSP returns the SP of the caller of the current function. arg0=mem.
+		{name: "LoweredGetCallerSP", argLength: 1, reg: gp01, rematerializeable: true},
 
 		// LoweredGetCallerPC evaluates to the PC to which its "caller" will return.
 		// I.e., if f calls g "calls" getcallerpc,
@@ -562,11 +562,11 @@
 		// InvertFlags is a pseudo-op which can't appear in assembly output.
 		{name: "InvertFlags", argLength: 1}, // reverse direction of arg0
 
-		// LoweredWB invokes runtime.gcWriteBarrier. arg0=destptr, arg1=srcptr, arg2=mem, aux=runtime.gcWriteBarrier
+		// LoweredWB invokes runtime.gcWriteBarrier. arg0=mem, auxint=# of buffer entries needed
 		// It saves all GP registers if necessary,
 		// but clobbers R14 (LR) because it's a call, and R12 which is linker trampoline scratch register.
-		{name: "LoweredWB", argLength: 3, reg: regInfo{inputs: []regMask{buildReg("R2"), buildReg("R3")}, clobbers: (callerSave &^ gpg) | buildReg("R12 R14")}, clobberFlags: true, aux: "Sym", symEffect: "None"},
-	}
+		// Returns a pointer to a write barrier buffer in R8.
+		{name: "LoweredWB", argLength: 1, reg: regInfo{clobbers: (callerSave &^ gpg) | buildReg("R12 R14"), outputs: []regMask{buildReg("R8")}}, clobberFlags: true, aux: "Int64"}}
 
 	blocks := []blockData{
 		{name: "EQ", controls: 1},
diff --git a/src/cmd/compile/internal/ssa/_gen/LOONG64.rules b/src/cmd/compile/internal/ssa/_gen/LOONG64.rules
index 1caaf13..4a47c4c 100644
--- a/src/cmd/compile/internal/ssa/_gen/LOONG64.rules
+++ b/src/cmd/compile/internal/ssa/_gen/LOONG64.rules
@@ -8,35 +8,36 @@
 (Sub(Ptr|64|32|16|8) ...) => (SUBV ...)
 (Sub(32|64)F ...) => (SUB(F|D) ...)
 
-(Mul(64|32|16|8) x y) => (Select1 (MULVU x y))
+(Mul(64|32|16|8) ...) => (MULV ...)
 (Mul(32|64)F ...) => (MUL(F|D) ...)
-(Mul64uhilo ...) => (MULVU ...)
-(Select0 (Mul64uover x y)) => (Select1 <typ.UInt64> (MULVU x y))
-(Select1 (Mul64uover x y)) => (SGTU <typ.Bool> (Select0 <typ.UInt64> (MULVU x y)) (MOVVconst <typ.UInt64> [0]))
+(Select0 (Mul64uhilo x y)) => (MULHVU x y)
+(Select1 (Mul64uhilo x y)) => (MULV x y)
+(Select0 (Mul64uover x y)) => (MULV x y)
+(Select1 (Mul64uover x y)) => (SGTU <typ.Bool> (MULHVU x y) (MOVVconst <typ.UInt64> [0]))
 
-(Hmul64 x y) => (Select0 (MULV x y))
-(Hmul64u x y) => (Select0 (MULVU x y))
-(Hmul32 x y) => (SRAVconst (Select1 <typ.Int64> (MULV (SignExt32to64 x) (SignExt32to64 y))) [32])
-(Hmul32u x y) => (SRLVconst (Select1 <typ.UInt64> (MULVU (ZeroExt32to64 x) (ZeroExt32to64 y))) [32])
+(Hmul64 ...)  => (MULHV  ...)
+(Hmul64u ...) => (MULHVU ...)
+(Hmul32 x y)  => (SRAVconst (MULV (SignExt32to64 x) (SignExt32to64 y)) [32])
+(Hmul32u x y) => (SRLVconst (MULV (ZeroExt32to64 x) (ZeroExt32to64 y)) [32])
 
-(Div64 x y) => (Select1 (DIVV x y))
-(Div64u x y) => (Select1 (DIVVU x y))
-(Div32 x y) => (Select1 (DIVV (SignExt32to64 x) (SignExt32to64 y)))
-(Div32u x y) => (Select1 (DIVVU (ZeroExt32to64 x) (ZeroExt32to64 y)))
-(Div16 x y) => (Select1 (DIVV (SignExt16to64 x) (SignExt16to64 y)))
-(Div16u x y) => (Select1 (DIVVU (ZeroExt16to64 x) (ZeroExt16to64 y)))
-(Div8 x y) => (Select1 (DIVV (SignExt8to64 x) (SignExt8to64 y)))
-(Div8u x y) => (Select1 (DIVVU (ZeroExt8to64 x) (ZeroExt8to64 y)))
+(Div64 x y) => (DIVV x y)
+(Div64u ...) => (DIVVU ...)
+(Div32 x y) => (DIVV (SignExt32to64 x) (SignExt32to64 y))
+(Div32u x y) => (DIVVU (ZeroExt32to64 x) (ZeroExt32to64 y))
+(Div16 x y) => (DIVV (SignExt16to64 x) (SignExt16to64 y))
+(Div16u x y) => (DIVVU (ZeroExt16to64 x) (ZeroExt16to64 y))
+(Div8 x y) => (DIVV (SignExt8to64 x) (SignExt8to64 y))
+(Div8u x y) => (DIVVU (ZeroExt8to64 x) (ZeroExt8to64 y))
 (Div(32|64)F ...) => (DIV(F|D) ...)
 
-(Mod64 x y) => (Select0 (DIVV x y))
-(Mod64u x y) => (Select0 (DIVVU x y))
-(Mod32 x y) => (Select0 (DIVV (SignExt32to64 x) (SignExt32to64 y)))
-(Mod32u x y) => (Select0 (DIVVU (ZeroExt32to64 x) (ZeroExt32to64 y)))
-(Mod16 x y) => (Select0 (DIVV (SignExt16to64 x) (SignExt16to64 y)))
-(Mod16u x y) => (Select0 (DIVVU (ZeroExt16to64 x) (ZeroExt16to64 y)))
-(Mod8 x y) => (Select0 (DIVV (SignExt8to64 x) (SignExt8to64 y)))
-(Mod8u x y) => (Select0 (DIVVU (ZeroExt8to64 x) (ZeroExt8to64 y)))
+(Mod64 x y) => (REMV x y)
+(Mod64u ...) => (REMVU ...)
+(Mod32 x y) => (REMV (SignExt32to64 x) (SignExt32to64 y))
+(Mod32u x y) => (REMVU (ZeroExt32to64 x) (ZeroExt32to64 y))
+(Mod16 x y) => (REMV (SignExt16to64 x) (SignExt16to64 y))
+(Mod16u x y) => (REMVU (ZeroExt16to64 x) (ZeroExt16to64 y))
+(Mod8 x y) => (REMV (SignExt8to64 x) (SignExt8to64 y))
+(Mod8u x y) => (REMVU (ZeroExt8to64 x) (ZeroExt8to64 y))
 
 (Select0 <t> (Add64carry x y c)) => (ADDV (ADDV <t> x y) c)
 (Select1 <t> (Add64carry x y c)) =>
@@ -56,45 +57,45 @@
 // shifts
 // hardware instruction uses only the low 6 bits of the shift
 // we compare to 64 to ensure Go semantics for large shifts
-(Lsh64x64 <t> x y) => (AND (NEGV <t> (SGTU (MOVVconst <typ.UInt64> [64]) y)) (SLLV <t> x y))
-(Lsh64x32 <t> x y) => (AND (NEGV <t> (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt32to64 y))) (SLLV <t> x (ZeroExt32to64 y)))
-(Lsh64x16 <t> x y) => (AND (NEGV <t> (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt16to64 y))) (SLLV <t> x (ZeroExt16to64 y)))
-(Lsh64x8  <t> x y) => (AND (NEGV <t> (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt8to64  y))) (SLLV <t> x (ZeroExt8to64  y)))
+(Lsh64x64 <t> x y) => (MASKEQZ (SLLV <t> x                y)  (SGTU (MOVVconst <typ.UInt64> [64])                y))
+(Lsh64x32 <t> x y) => (MASKEQZ (SLLV <t> x (ZeroExt32to64 y)) (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt32to64 y)))
+(Lsh64x16 <t> x y) => (MASKEQZ (SLLV <t> x (ZeroExt16to64 y)) (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt16to64 y)))
+(Lsh64x8  <t> x y) => (MASKEQZ (SLLV <t> x (ZeroExt8to64  y)) (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt8to64  y)))
 
-(Lsh32x64 <t> x y) => (AND (NEGV <t> (SGTU (MOVVconst <typ.UInt64> [64]) y)) (SLLV <t> x y))
-(Lsh32x32 <t> x y) => (AND (NEGV <t> (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt32to64 y))) (SLLV <t> x (ZeroExt32to64 y)))
-(Lsh32x16 <t> x y) => (AND (NEGV <t> (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt16to64 y))) (SLLV <t> x (ZeroExt16to64 y)))
-(Lsh32x8  <t> x y) => (AND (NEGV <t> (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt8to64  y))) (SLLV <t> x (ZeroExt8to64  y)))
+(Lsh32x64 <t> x y) => (MASKEQZ (SLLV <t> x                y)  (SGTU (MOVVconst <typ.UInt64> [64])                y))
+(Lsh32x32 <t> x y) => (MASKEQZ (SLLV <t> x (ZeroExt32to64 y)) (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt32to64 y)))
+(Lsh32x16 <t> x y) => (MASKEQZ (SLLV <t> x (ZeroExt16to64 y)) (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt16to64 y)))
+(Lsh32x8  <t> x y) => (MASKEQZ (SLLV <t> x (ZeroExt8to64  y)) (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt8to64  y)))
 
-(Lsh16x64 <t> x y) => (AND (NEGV <t> (SGTU (MOVVconst <typ.UInt64> [64]) y)) (SLLV <t> x y))
-(Lsh16x32 <t> x y) => (AND (NEGV <t> (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt32to64 y))) (SLLV <t> x (ZeroExt32to64 y)))
-(Lsh16x16 <t> x y) => (AND (NEGV <t> (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt16to64 y))) (SLLV <t> x (ZeroExt16to64 y)))
-(Lsh16x8  <t> x y) => (AND (NEGV <t> (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt8to64  y))) (SLLV <t> x (ZeroExt8to64  y)))
+(Lsh16x64 <t> x y) => (MASKEQZ (SLLV <t> x                y)  (SGTU (MOVVconst <typ.UInt64> [64])                y))
+(Lsh16x32 <t> x y) => (MASKEQZ (SLLV <t> x (ZeroExt32to64 y)) (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt32to64 y)))
+(Lsh16x16 <t> x y) => (MASKEQZ (SLLV <t> x (ZeroExt16to64 y)) (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt16to64 y)))
+(Lsh16x8  <t> x y) => (MASKEQZ (SLLV <t> x (ZeroExt8to64  y)) (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt8to64  y)))
 
-(Lsh8x64 <t> x y) => (AND (NEGV <t> (SGTU (MOVVconst <typ.UInt64> [64]) y)) (SLLV <t> x y))
-(Lsh8x32 <t> x y) => (AND (NEGV <t> (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt32to64 y))) (SLLV <t> x (ZeroExt32to64 y)))
-(Lsh8x16 <t> x y) => (AND (NEGV <t> (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt16to64 y))) (SLLV <t> x (ZeroExt16to64 y)))
-(Lsh8x8  <t> x y) => (AND (NEGV <t> (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt8to64  y))) (SLLV <t> x (ZeroExt8to64  y)))
+(Lsh8x64 <t> x y) => (MASKEQZ (SLLV <t> x                y)  (SGTU (MOVVconst <typ.UInt64> [64])                y))
+(Lsh8x32 <t> x y) => (MASKEQZ (SLLV <t> x (ZeroExt32to64 y)) (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt32to64 y)))
+(Lsh8x16 <t> x y) => (MASKEQZ (SLLV <t> x (ZeroExt16to64 y)) (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt16to64 y)))
+(Lsh8x8  <t> x y) => (MASKEQZ (SLLV <t> x (ZeroExt8to64  y)) (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt8to64  y)))
 
-(Rsh64Ux64 <t> x y) => (AND (NEGV <t> (SGTU (MOVVconst <typ.UInt64> [64]) y)) (SRLV <t> x y))
-(Rsh64Ux32 <t> x y) => (AND (NEGV <t> (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt32to64 y))) (SRLV <t> x (ZeroExt32to64 y)))
-(Rsh64Ux16 <t> x y) => (AND (NEGV <t> (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt16to64 y))) (SRLV <t> x (ZeroExt16to64 y)))
-(Rsh64Ux8  <t> x y) => (AND (NEGV <t> (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt8to64  y))) (SRLV <t> x (ZeroExt8to64  y)))
+(Rsh64Ux64 <t> x y) => (MASKEQZ (SRLV <t> x                y)  (SGTU (MOVVconst <typ.UInt64> [64])                y))
+(Rsh64Ux32 <t> x y) => (MASKEQZ (SRLV <t> x (ZeroExt32to64 y)) (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt32to64 y)))
+(Rsh64Ux16 <t> x y) => (MASKEQZ (SRLV <t> x (ZeroExt16to64 y)) (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt16to64 y)))
+(Rsh64Ux8  <t> x y) => (MASKEQZ (SRLV <t> x (ZeroExt8to64  y)) (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt8to64  y)))
 
-(Rsh32Ux64 <t> x y) => (AND (NEGV <t> (SGTU (MOVVconst <typ.UInt64> [64]) y)) (SRLV <t> (ZeroExt32to64 x) y))
-(Rsh32Ux32 <t> x y) => (AND (NEGV <t> (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt32to64 y))) (SRLV <t> (ZeroExt32to64 x) (ZeroExt32to64 y)))
-(Rsh32Ux16 <t> x y) => (AND (NEGV <t> (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt16to64 y))) (SRLV <t> (ZeroExt32to64 x) (ZeroExt16to64 y)))
-(Rsh32Ux8  <t> x y) => (AND (NEGV <t> (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt8to64  y))) (SRLV <t> (ZeroExt32to64 x) (ZeroExt8to64  y)))
+(Rsh32Ux64 <t> x y) => (MASKEQZ (SRLV <t> (ZeroExt32to64 x)                y)  (SGTU (MOVVconst <typ.UInt64> [64])                y))
+(Rsh32Ux32 <t> x y) => (MASKEQZ (SRLV <t> (ZeroExt32to64 x) (ZeroExt32to64 y)) (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt32to64 y)))
+(Rsh32Ux16 <t> x y) => (MASKEQZ (SRLV <t> (ZeroExt32to64 x) (ZeroExt16to64 y)) (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt16to64 y)))
+(Rsh32Ux8  <t> x y) => (MASKEQZ (SRLV <t> (ZeroExt32to64 x) (ZeroExt8to64  y)) (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt8to64  y)))
 
-(Rsh16Ux64 <t> x y) => (AND (NEGV <t> (SGTU (MOVVconst <typ.UInt64> [64]) y)) (SRLV <t> (ZeroExt16to64 x) y))
-(Rsh16Ux32 <t> x y) => (AND (NEGV <t> (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt32to64 y))) (SRLV <t> (ZeroExt16to64 x) (ZeroExt32to64 y)))
-(Rsh16Ux16 <t> x y) => (AND (NEGV <t> (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt16to64 y))) (SRLV <t> (ZeroExt16to64 x) (ZeroExt16to64 y)))
-(Rsh16Ux8  <t> x y) => (AND (NEGV <t> (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt8to64  y))) (SRLV <t> (ZeroExt16to64 x) (ZeroExt8to64  y)))
+(Rsh16Ux64 <t> x y) => (MASKEQZ (SRLV <t> (ZeroExt16to64 x)                y)  (SGTU (MOVVconst <typ.UInt64> [64])                y))
+(Rsh16Ux32 <t> x y) => (MASKEQZ (SRLV <t> (ZeroExt16to64 x) (ZeroExt32to64 y)) (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt32to64 y)))
+(Rsh16Ux16 <t> x y) => (MASKEQZ (SRLV <t> (ZeroExt16to64 x) (ZeroExt16to64 y)) (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt16to64 y)))
+(Rsh16Ux8  <t> x y) => (MASKEQZ (SRLV <t> (ZeroExt16to64 x) (ZeroExt8to64  y)) (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt8to64  y)))
 
-(Rsh8Ux64 <t> x y) => (AND (NEGV <t> (SGTU (MOVVconst <typ.UInt64> [64]) y)) (SRLV <t> (ZeroExt8to64 x) y))
-(Rsh8Ux32 <t> x y) => (AND (NEGV <t> (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt32to64 y))) (SRLV <t> (ZeroExt8to64 x) (ZeroExt32to64 y)))
-(Rsh8Ux16 <t> x y) => (AND (NEGV <t> (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt16to64 y))) (SRLV <t> (ZeroExt8to64 x) (ZeroExt16to64 y)))
-(Rsh8Ux8  <t> x y) => (AND (NEGV <t> (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt8to64  y))) (SRLV <t> (ZeroExt8to64 x) (ZeroExt8to64  y)))
+(Rsh8Ux64 <t> x y) => (MASKEQZ (SRLV <t> (ZeroExt8to64 x)                y)  (SGTU (MOVVconst <typ.UInt64> [64])                y))
+(Rsh8Ux32 <t> x y) => (MASKEQZ (SRLV <t> (ZeroExt8to64 x) (ZeroExt32to64 y)) (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt32to64 y)))
+(Rsh8Ux16 <t> x y) => (MASKEQZ (SRLV <t> (ZeroExt8to64 x) (ZeroExt16to64 y)) (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt16to64 y)))
+(Rsh8Ux8  <t> x y) => (MASKEQZ (SRLV <t> (ZeroExt8to64 x) (ZeroExt8to64  y)) (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt8to64  y)))
 
 (Rsh64x64 <t> x y) => (SRAV x (OR <t> (NEGV <t> (SGTU y (MOVVconst <typ.UInt64> [63]))) y))
 (Rsh64x32 <t> x y) => (SRAV x (OR <t> (NEGV <t> (SGTU (ZeroExt32to64 y) (MOVVconst <typ.UInt64> [63]))) (ZeroExt32to64 y)))
@@ -227,16 +228,17 @@
 (OffPtr [off] ptr) => (ADDVconst [off] ptr)
 
 (Addr {sym} base) => (MOVVaddr {sym} base)
-(LocalAddr {sym} base _) => (MOVVaddr {sym} base)
+(LocalAddr <t> {sym} base mem) && t.Elem().HasPointers() => (MOVVaddr {sym} (SPanchored base mem))
+(LocalAddr <t> {sym} base _)  && !t.Elem().HasPointers() => (MOVVaddr {sym} base)
 
 // loads
 (Load <t> ptr mem) && t.IsBoolean() => (MOVBUload ptr mem)
-(Load <t> ptr mem) && (is8BitInt(t) && isSigned(t)) => (MOVBload ptr mem)
-(Load <t> ptr mem) && (is8BitInt(t) && !isSigned(t)) => (MOVBUload ptr mem)
-(Load <t> ptr mem) && (is16BitInt(t) && isSigned(t)) => (MOVHload ptr mem)
-(Load <t> ptr mem) && (is16BitInt(t) && !isSigned(t)) => (MOVHUload ptr mem)
-(Load <t> ptr mem) && (is32BitInt(t) && isSigned(t)) => (MOVWload ptr mem)
-(Load <t> ptr mem) && (is32BitInt(t) && !isSigned(t)) => (MOVWUload ptr mem)
+(Load <t> ptr mem) && (is8BitInt(t)  &&  t.IsSigned()) => (MOVBload ptr mem)
+(Load <t> ptr mem) && (is8BitInt(t)  && !t.IsSigned()) => (MOVBUload ptr mem)
+(Load <t> ptr mem) && (is16BitInt(t) &&  t.IsSigned()) => (MOVHload ptr mem)
+(Load <t> ptr mem) && (is16BitInt(t) && !t.IsSigned()) => (MOVHUload ptr mem)
+(Load <t> ptr mem) && (is32BitInt(t) &&  t.IsSigned()) => (MOVWload ptr mem)
+(Load <t> ptr mem) && (is32BitInt(t) && !t.IsSigned()) => (MOVWUload ptr mem)
 (Load <t> ptr mem) && (is64BitInt(t) || isPtr(t)) => (MOVVload ptr mem)
 (Load <t> ptr mem) && is32BitFloat(t) => (MOVFload ptr mem)
 (Load <t> ptr mem) && is64BitFloat(t) => (MOVDload ptr mem)
@@ -244,10 +246,10 @@
 // stores
 (Store {t} ptr val mem) && t.Size() == 1 => (MOVBstore ptr val mem)
 (Store {t} ptr val mem) && t.Size() == 2 => (MOVHstore ptr val mem)
-(Store {t} ptr val mem) && t.Size() == 4 && !is32BitFloat(val.Type) => (MOVWstore ptr val mem)
-(Store {t} ptr val mem) && t.Size() == 8 && !is64BitFloat(val.Type) => (MOVVstore ptr val mem)
-(Store {t} ptr val mem) && t.Size() == 4 && is32BitFloat(val.Type) => (MOVFstore ptr val mem)
-(Store {t} ptr val mem) && t.Size() == 8 && is64BitFloat(val.Type) => (MOVDstore ptr val mem)
+(Store {t} ptr val mem) && t.Size() == 4 && !t.IsFloat() => (MOVWstore ptr val mem)
+(Store {t} ptr val mem) && t.Size() == 8 && !t.IsFloat() => (MOVVstore ptr val mem)
+(Store {t} ptr val mem) && t.Size() == 4 &&  t.IsFloat() => (MOVFstore ptr val mem)
+(Store {t} ptr val mem) && t.Size() == 8 &&  t.IsFloat() => (MOVDstore ptr val mem)
 
 // zeroing
 (Zero [0] _ mem) => mem
@@ -570,7 +572,7 @@
 (MOVVreg x) && x.Uses == 1 => (MOVVnop x)
 
 // fold constant into arithmetic ops
-(ADDV x (MOVVconst [c])) && is32Bit(c) => (ADDVconst [c] x)
+(ADDV x (MOVVconst <t> [c])) && is32Bit(c) && !t.IsPtr() => (ADDVconst [c] x)
 (SUBV x (MOVVconst [c])) && is32Bit(c) => (SUBVconst [c] x)
 (AND x (MOVVconst [c])) && is32Bit(c) => (ANDconst [c] x)
 (OR  x (MOVVconst [c])) && is32Bit(c) => (ORconst  [c] x)
@@ -590,16 +592,16 @@
 (SGTU (MOVVconst [c]) x) && is32Bit(c) => (SGTUconst [c] x)
 
 // mul by constant
-(Select1 (MULVU x (MOVVconst [-1]))) => (NEGV x)
-(Select1 (MULVU _ (MOVVconst [0]))) => (MOVVconst [0])
-(Select1 (MULVU x (MOVVconst [1]))) => x
-(Select1 (MULVU x (MOVVconst [c]))) && isPowerOfTwo64(c) => (SLLVconst [log64(c)] x)
+(MULV x (MOVVconst [-1])) => (NEGV x)
+(MULV _ (MOVVconst [0])) => (MOVVconst [0])
+(MULV x (MOVVconst [1])) => x
+(MULV x (MOVVconst [c])) && isPowerOfTwo64(c) => (SLLVconst [log64(c)] x)
 
 // div by constant
-(Select1 (DIVVU x (MOVVconst [1]))) => x
-(Select1 (DIVVU x (MOVVconst [c]))) && isPowerOfTwo64(c) => (SRLVconst [log64(c)] x)
-(Select0 (DIVVU _ (MOVVconst [1]))) => (MOVVconst [0])                       // mod
-(Select0 (DIVVU x (MOVVconst [c]))) && isPowerOfTwo64(c) => (ANDconst [c-1] x) // mod
+(DIVVU x (MOVVconst [1])) => x
+(DIVVU x (MOVVconst [c])) && isPowerOfTwo64(c) => (SRLVconst [log64(c)] x)
+(REMVU _ (MOVVconst [1])) => (MOVVconst [0])                       // mod
+(REMVU x (MOVVconst [c])) && isPowerOfTwo64(c) => (ANDconst [c-1] x) // mod
 
 // generic simplifications
 (ADDV x (NEGV y)) => (SUBV x y)
@@ -620,6 +622,8 @@
 (XORconst [-1] x) => (NORconst [0] x)
 (MASKEQZ (MOVVconst [0]) cond) => (MOVVconst [0])
 (MASKNEZ (MOVVconst [0]) cond) => (MOVVconst [0])
+(MASKEQZ x (MOVVconst [c])) && c == 0 => (MOVVconst [0])
+(MASKEQZ x (MOVVconst [c])) && c != 0 => x
 
 // generic constant folding
 (ADDVconst [c] (MOVVconst [d]))  => (MOVVconst [c+d])
@@ -631,11 +635,11 @@
 (SLLVconst [c] (MOVVconst [d]))  => (MOVVconst [d<<uint64(c)])
 (SRLVconst [c] (MOVVconst [d]))  => (MOVVconst [int64(uint64(d)>>uint64(c))])
 (SRAVconst [c] (MOVVconst [d]))  => (MOVVconst [d>>uint64(c)])
-(Select1 (MULVU (MOVVconst [c]) (MOVVconst [d]))) => (MOVVconst [c*d])
-(Select1 (DIVV  (MOVVconst [c]) (MOVVconst [d]))) && d != 0 => (MOVVconst [c/d])
-(Select1 (DIVVU (MOVVconst [c]) (MOVVconst [d]))) && d != 0 => (MOVVconst [int64(uint64(c)/uint64(d))])
-(Select0 (DIVV  (MOVVconst [c]) (MOVVconst [d]))) && d != 0 => (MOVVconst [c%d])   // mod
-(Select0 (DIVVU (MOVVconst [c]) (MOVVconst [d]))) && d != 0 => (MOVVconst [int64(uint64(c)%uint64(d))]) // mod
+(MULV (MOVVconst [c]) (MOVVconst [d])) => (MOVVconst [c*d])
+(DIVV  (MOVVconst [c]) (MOVVconst [d])) && d != 0 => (MOVVconst [c/d])
+(DIVVU (MOVVconst [c]) (MOVVconst [d])) && d != 0 => (MOVVconst [int64(uint64(c)/uint64(d))])
+(REMV  (MOVVconst [c]) (MOVVconst [d])) && d != 0 => (MOVVconst [c%d])   // mod
+(REMVU (MOVVconst [c]) (MOVVconst [d])) && d != 0 => (MOVVconst [int64(uint64(c)%uint64(d))]) // mod
 (ANDconst [c] (MOVVconst [d])) => (MOVVconst [c&d])
 (ANDconst [c] (ANDconst [d] x)) => (ANDconst [c&d] x)
 (ORconst [c] (MOVVconst [d])) => (MOVVconst [c|d])
diff --git a/src/cmd/compile/internal/ssa/_gen/LOONG64Ops.go b/src/cmd/compile/internal/ssa/_gen/LOONG64Ops.go
index 22a83fb..23f20fd 100644
--- a/src/cmd/compile/internal/ssa/_gen/LOONG64Ops.go
+++ b/src/cmd/compile/internal/ssa/_gen/LOONG64Ops.go
@@ -124,7 +124,6 @@
 	// Common individual register masks
 	var (
 		gp         = buildReg("R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R18 R19 R20 R23 R24 R25 R26 R27 R28 R29 R31") // R1 is LR, R2 is thread pointer, R3 is stack pointer, R21-unused, R22 is g, R30 is REGTMP
-		gps        = buildReg("R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R19 R20 R23 R24 R25 R26 R27 R28 R29 R31") | buildReg("g")
 		gpg        = gp | buildReg("g")
 		gpsp       = gp | buildReg("SP")
 		gpspg      = gpg | buildReg("SP")
@@ -142,7 +141,6 @@
 		gp11      = regInfo{inputs: []regMask{gpg}, outputs: []regMask{gp}}
 		gp11sp    = regInfo{inputs: []regMask{gpspg}, outputs: []regMask{gp}}
 		gp21      = regInfo{inputs: []regMask{gpg, gpg}, outputs: []regMask{gp}}
-		gp22      = regInfo{inputs: []regMask{gps, gps}, outputs: []regMask{gp, gp}}
 		gpload    = regInfo{inputs: []regMask{gpspsbg}, outputs: []regMask{gp}}
 		gpstore   = regInfo{inputs: []regMask{gpspsbg, gpg}}
 		gpstore0  = regInfo{inputs: []regMask{gpspsbg}}
@@ -163,10 +161,13 @@
 		{name: "SUBV", argLength: 2, reg: gp21, asm: "SUBVU"},                      // arg0 - arg1
 		{name: "SUBVconst", argLength: 1, reg: gp11, asm: "SUBVU", aux: "Int64"},   // arg0 - auxInt
 
-		{name: "MULV", argLength: 2, reg: gp22, resultNotInArgs: true, commutative: true, typ: "(Int64,Int64)"},    // arg0 * arg1, signed
-		{name: "MULVU", argLength: 2, reg: gp22, resultNotInArgs: true, commutative: true, typ: "(UInt64,UInt64)"}, // arg0 * arg1, unsigned
-		{name: "DIVV", argLength: 2, reg: gp22, resultNotInArgs: true, typ: "(Int64,Int64)"},                       // arg0 / arg1, signed
-		{name: "DIVVU", argLength: 2, reg: gp22, resultNotInArgs: true, typ: "(UInt64,UInt64)"},                    // arg0 / arg1, unsigned
+		{name: "MULV", argLength: 2, reg: gp21, asm: "MULV", commutative: true, typ: "Int64"},      // arg0 * arg1
+		{name: "MULHV", argLength: 2, reg: gp21, asm: "MULHV", commutative: true, typ: "Int64"},    // (arg0 * arg1) >> 64, signed
+		{name: "MULHVU", argLength: 2, reg: gp21, asm: "MULHVU", commutative: true, typ: "UInt64"}, // (arg0 * arg1) >> 64, unsigned
+		{name: "DIVV", argLength: 2, reg: gp21, asm: "DIVV", typ: "Int64"},                         // arg0 / arg1, signed
+		{name: "DIVVU", argLength: 2, reg: gp21, asm: "DIVVU", typ: "UInt64"},                      // arg0 / arg1, unsigned
+		{name: "REMV", argLength: 2, reg: gp21, asm: "REMV", typ: "Int64"},                         // arg0 / arg1, signed
+		{name: "REMVU", argLength: 2, reg: gp21, asm: "REMVU", typ: "UInt64"},                      // arg0 / arg1, unsigned
 
 		{name: "ADDF", argLength: 2, reg: fp21, asm: "ADDF", commutative: true}, // arg0 + arg1
 		{name: "ADDD", argLength: 2, reg: fp21, asm: "ADDD", commutative: true}, // arg0 + arg1
@@ -432,8 +433,8 @@
 		// use of R22 (loong64.REGCTXT, the closure pointer)
 		{name: "LoweredGetClosurePtr", reg: regInfo{outputs: []regMask{buildReg("R29")}}, zeroWidth: true},
 
-		// LoweredGetCallerSP returns the SP of the caller of the current function.
-		{name: "LoweredGetCallerSP", reg: gp01, rematerializeable: true},
+		// LoweredGetCallerSP returns the SP of the caller of the current function. arg0=mem.
+		{name: "LoweredGetCallerSP", argLength: 1, reg: gp01, rematerializeable: true},
 
 		// LoweredGetCallerPC evaluates to the PC to which its "caller" will return.
 		// I.e., if f calls g "calls" getcallerpc,
@@ -441,11 +442,12 @@
 		// See runtime/stubs.go for a more detailed discussion.
 		{name: "LoweredGetCallerPC", reg: gp01, rematerializeable: true},
 
-		// LoweredWB invokes runtime.gcWriteBarrier. arg0=destptr, arg1=srcptr, arg2=mem, aux=runtime.gcWriteBarrier
+		// LoweredWB invokes runtime.gcWriteBarrier. arg0=mem, auxint=# of buffer entries needed
 		// It saves all GP registers if necessary,
 		// but clobbers R1 (LR) because it's a call
 		// and R30 (REGTMP).
-		{name: "LoweredWB", argLength: 3, reg: regInfo{inputs: []regMask{buildReg("R27"), buildReg("R28")}, clobbers: (callerSave &^ gpg) | buildReg("R1")}, clobberFlags: true, aux: "Sym", symEffect: "None"},
+		// Returns a pointer to a write barrier buffer in R29.
+		{name: "LoweredWB", argLength: 1, reg: regInfo{clobbers: (callerSave &^ gpg) | buildReg("R1"), outputs: []regMask{buildReg("R29")}}, clobberFlags: true, aux: "Int64"},
 
 		// There are three of these functions so that they can have three different register inputs.
 		// When we check 0 <= c <= cap (A), then 0 <= b <= c (B), then 0 <= a <= b (C), we want the
diff --git a/src/cmd/compile/internal/ssa/_gen/MIPS.rules b/src/cmd/compile/internal/ssa/_gen/MIPS.rules
index 6f696da..d6ae010 100644
--- a/src/cmd/compile/internal/ssa/_gen/MIPS.rules
+++ b/src/cmd/compile/internal/ssa/_gen/MIPS.rules
@@ -37,6 +37,9 @@
 (Mod8 x y) => (Select0 (DIV (SignExt8to32 x) (SignExt8to32 y)))
 (Mod8u x y) => (Select0 (DIVU (ZeroExt8to32 x) (ZeroExt8to32 y)))
 
+// math package intrinsics
+(Abs ...) => (ABSD ...)
+
 // (x + y) / 2 with x>=y  becomes  (x - y) / 2 + y
 (Avg32u <t> x y) => (ADD (SRLconst <t> (SUB <t> x y) [1]) y)
 
@@ -210,14 +213,15 @@
 (OffPtr [off] ptr) => (ADDconst [int32(off)] ptr)
 
 (Addr {sym} base) => (MOVWaddr {sym} base)
-(LocalAddr {sym} base _) => (MOVWaddr {sym} base)
+(LocalAddr <t> {sym} base mem) && t.Elem().HasPointers() => (MOVWaddr {sym} (SPanchored base mem))
+(LocalAddr <t> {sym} base _)  && !t.Elem().HasPointers() => (MOVWaddr {sym} base)
 
 // loads
 (Load <t> ptr mem) && t.IsBoolean() => (MOVBUload ptr mem)
-(Load <t> ptr mem) && (is8BitInt(t) && isSigned(t)) => (MOVBload ptr mem)
-(Load <t> ptr mem) && (is8BitInt(t) && !isSigned(t)) => (MOVBUload ptr mem)
-(Load <t> ptr mem) && (is16BitInt(t) && isSigned(t)) => (MOVHload ptr mem)
-(Load <t> ptr mem) && (is16BitInt(t) && !isSigned(t)) => (MOVHUload ptr mem)
+(Load <t> ptr mem) && (is8BitInt(t)  &&  t.IsSigned()) => (MOVBload ptr mem)
+(Load <t> ptr mem) && (is8BitInt(t)  && !t.IsSigned()) => (MOVBUload ptr mem)
+(Load <t> ptr mem) && (is16BitInt(t) &&  t.IsSigned()) => (MOVHload ptr mem)
+(Load <t> ptr mem) && (is16BitInt(t) && !t.IsSigned()) => (MOVHUload ptr mem)
 (Load <t> ptr mem) && (is32BitInt(t) || isPtr(t)) => (MOVWload ptr mem)
 (Load <t> ptr mem) && is32BitFloat(t) => (MOVFload ptr mem)
 (Load <t> ptr mem) && is64BitFloat(t) => (MOVDload ptr mem)
@@ -225,9 +229,18 @@
 // stores
 (Store {t} ptr val mem) && t.Size() == 1 => (MOVBstore ptr val mem)
 (Store {t} ptr val mem) && t.Size() == 2 => (MOVHstore ptr val mem)
-(Store {t} ptr val mem) && t.Size() == 4 && !is32BitFloat(val.Type) => (MOVWstore ptr val mem)
-(Store {t} ptr val mem) && t.Size() == 4 && is32BitFloat(val.Type) => (MOVFstore ptr val mem)
-(Store {t} ptr val mem) && t.Size() == 8 && is64BitFloat(val.Type) => (MOVDstore ptr val mem)
+(Store {t} ptr val mem) && t.Size() == 4 && !t.IsFloat() => (MOVWstore ptr val mem)
+(Store {t} ptr val mem) && t.Size() == 4 &&  t.IsFloat() => (MOVFstore ptr val mem)
+(Store {t} ptr val mem) && t.Size() == 8 &&  t.IsFloat() => (MOVDstore ptr val mem)
+
+// float <=> int register moves, with no conversion.
+// These come up when compiling math.{Float32bits, Float32frombits}.
+(MOVWload [off] {sym} ptr (MOVFstore [off] {sym} ptr val _)) => (MOVWfpgp val)
+(MOVFload [off] {sym} ptr (MOVWstore [off] {sym} ptr val _)) => (MOVWgpfp val)
+
+// Similarly for stores, if we see a store after FPR <=> GPR move, then redirect store to use the other register set.
+(MOVWstore [off] {sym} ptr (MOVWfpgp val) mem) => (MOVFstore [off] {sym} ptr val mem)
+(MOVFstore [off] {sym} ptr (MOVWgpfp val) mem) => (MOVWstore [off] {sym} ptr val mem)
 
 // zero instructions
 (Zero [0] _ mem) => mem
@@ -566,7 +579,7 @@
 (MOVWnop (MOVWconst [c])) => (MOVWconst [c])
 
 // fold constant into arithmetic ops
-(ADD x (MOVWconst [c])) => (ADDconst [c] x)
+(ADD x (MOVWconst <t> [c])) && !t.IsPtr() => (ADDconst [c] x)
 (SUB x (MOVWconst [c])) => (SUBconst [c] x)
 (AND x (MOVWconst [c])) => (ANDconst [c] x)
 (OR  x (MOVWconst [c])) => (ORconst  [c] x)
diff --git a/src/cmd/compile/internal/ssa/_gen/MIPS64.rules b/src/cmd/compile/internal/ssa/_gen/MIPS64.rules
index a594df2..4628e2a 100644
--- a/src/cmd/compile/internal/ssa/_gen/MIPS64.rules
+++ b/src/cmd/compile/internal/ssa/_gen/MIPS64.rules
@@ -38,6 +38,9 @@
 (Mod8 x y) => (Select0 (DIVV (SignExt8to64 x) (SignExt8to64 y)))
 (Mod8u x y) => (Select0 (DIVVU (ZeroExt8to64 x) (ZeroExt8to64 y)))
 
+// math package intrinsics
+(Abs ...) => (ABSD ...)
+
 // (x + y) / 2 with x>=y => (x - y) / 2 + y
 (Avg64u <t> x y) => (ADDV (SRLVconst <t> (SUBV <t> x y) [1]) y)
 
@@ -219,16 +222,17 @@
 (OffPtr [off] ptr) => (ADDVconst [off] ptr)
 
 (Addr {sym} base) => (MOVVaddr {sym} base)
-(LocalAddr {sym} base _) => (MOVVaddr {sym} base)
+(LocalAddr <t> {sym} base mem) && t.Elem().HasPointers() => (MOVVaddr {sym} (SPanchored base mem))
+(LocalAddr <t> {sym} base _)  && !t.Elem().HasPointers() => (MOVVaddr {sym} base)
 
 // loads
 (Load <t> ptr mem) && t.IsBoolean() => (MOVBUload ptr mem)
-(Load <t> ptr mem) && (is8BitInt(t) && isSigned(t)) => (MOVBload ptr mem)
-(Load <t> ptr mem) && (is8BitInt(t) && !isSigned(t)) => (MOVBUload ptr mem)
-(Load <t> ptr mem) && (is16BitInt(t) && isSigned(t)) => (MOVHload ptr mem)
-(Load <t> ptr mem) && (is16BitInt(t) && !isSigned(t)) => (MOVHUload ptr mem)
-(Load <t> ptr mem) && (is32BitInt(t) && isSigned(t)) => (MOVWload ptr mem)
-(Load <t> ptr mem) && (is32BitInt(t) && !isSigned(t)) => (MOVWUload ptr mem)
+(Load <t> ptr mem) && (is8BitInt(t)  &&  t.IsSigned()) => (MOVBload ptr mem)
+(Load <t> ptr mem) && (is8BitInt(t)  && !t.IsSigned()) => (MOVBUload ptr mem)
+(Load <t> ptr mem) && (is16BitInt(t) &&  t.IsSigned()) => (MOVHload ptr mem)
+(Load <t> ptr mem) && (is16BitInt(t) && !t.IsSigned()) => (MOVHUload ptr mem)
+(Load <t> ptr mem) && (is32BitInt(t) &&  t.IsSigned()) => (MOVWload ptr mem)
+(Load <t> ptr mem) && (is32BitInt(t) && !t.IsSigned()) => (MOVWUload ptr mem)
 (Load <t> ptr mem) && (is64BitInt(t) || isPtr(t)) => (MOVVload ptr mem)
 (Load <t> ptr mem) && is32BitFloat(t) => (MOVFload ptr mem)
 (Load <t> ptr mem) && is64BitFloat(t) => (MOVDload ptr mem)
@@ -236,10 +240,10 @@
 // stores
 (Store {t} ptr val mem) && t.Size() == 1 => (MOVBstore ptr val mem)
 (Store {t} ptr val mem) && t.Size() == 2 => (MOVHstore ptr val mem)
-(Store {t} ptr val mem) && t.Size() == 4 && !is32BitFloat(val.Type) => (MOVWstore ptr val mem)
-(Store {t} ptr val mem) && t.Size() == 8 && !is64BitFloat(val.Type) => (MOVVstore ptr val mem)
-(Store {t} ptr val mem) && t.Size() == 4 && is32BitFloat(val.Type) => (MOVFstore ptr val mem)
-(Store {t} ptr val mem) && t.Size() == 8 && is64BitFloat(val.Type) => (MOVDstore ptr val mem)
+(Store {t} ptr val mem) && t.Size() == 4 && !t.IsFloat() => (MOVWstore ptr val mem)
+(Store {t} ptr val mem) && t.Size() == 8 && !t.IsFloat() => (MOVVstore ptr val mem)
+(Store {t} ptr val mem) && t.Size() == 4 &&  t.IsFloat() => (MOVFstore ptr val mem)
+(Store {t} ptr val mem) && t.Size() == 8 &&  t.IsFloat() => (MOVDstore ptr val mem)
 
 // zeroing
 (Zero [0] _ mem) => mem
@@ -354,6 +358,19 @@
 		(MOVVstore [8] dst (MOVVload [8] src mem)
 			(MOVVstore dst (MOVVload src mem) mem)))
 
+// float <=> int register moves, with no conversion.
+// These come up when compiling math.{Float64bits, Float64frombits, Float32bits, Float32frombits}.
+(MOVVload  [off] {sym} ptr (MOVDstore [off] {sym} ptr val _)) => (MOVVfpgp val)
+(MOVDload  [off] {sym} ptr (MOVVstore [off] {sym} ptr val _)) => (MOVVgpfp val)
+(MOVWUload [off] {sym} ptr (MOVFstore [off] {sym} ptr val _)) => (ZeroExt32to64 (MOVWfpgp <typ.Float32> val))
+(MOVFload  [off] {sym} ptr (MOVWstore [off] {sym} ptr val _)) => (MOVWgpfp val)
+
+// Similarly for stores, if we see a store after FPR <=> GPR move, then redirect store to use the other register set.
+(MOVVstore [off] {sym} ptr (MOVVfpgp val) mem) => (MOVDstore [off] {sym} ptr val mem)
+(MOVDstore [off] {sym} ptr (MOVVgpfp val) mem) => (MOVVstore [off] {sym} ptr val mem)
+(MOVWstore [off] {sym} ptr (MOVWfpgp val) mem) => (MOVFstore [off] {sym} ptr val mem)
+(MOVFstore [off] {sym} ptr (MOVWgpfp val) mem) => (MOVWstore [off] {sym} ptr val mem)
+
 // medium move uses a duff device
 (Move [s] {t} dst src mem)
 	&& s%8 == 0 && s >= 24 && s <= 8*128 && t.Alignment()%8 == 0
@@ -395,6 +412,46 @@
 (AtomicCompareAndSwap32 ptr old new mem) => (LoweredAtomicCas32 ptr (SignExt32to64 old) new mem)
 (AtomicCompareAndSwap64 ...) => (LoweredAtomicCas64 ...)
 
+// AtomicOr8(ptr,val)  =>   LoweredAtomicOr32(ptr&^3,uint32(val) << ((ptr & 3) * 8))
+(AtomicOr8 ptr val mem) && !config.BigEndian =>
+	(LoweredAtomicOr32 (AND <typ.UInt32Ptr> (MOVVconst [^3]) ptr)
+		(SLLV <typ.UInt32> (ZeroExt8to32 val)
+			(SLLVconst <typ.UInt64> [3]
+				(ANDconst <typ.UInt64> [3] ptr))) mem)
+
+// AtomicAnd8(ptr,val)  =>  LoweredAtomicAnd32(ptr&^3,(uint32(val) << ((ptr & 3) * 8)) | ^(uint32(0xFF) << ((ptr & 3) * 8))))
+(AtomicAnd8  ptr val mem) && !config.BigEndian =>
+	(LoweredAtomicAnd32 (AND <typ.UInt32Ptr> (MOVVconst [^3]) ptr)
+		(OR <typ.UInt64> (SLLV <typ.UInt32> (ZeroExt8to32 val)
+			(SLLVconst <typ.UInt64> [3]
+				(ANDconst  <typ.UInt64> [3] ptr)))
+		(NORconst [0] <typ.UInt64> (SLLV <typ.UInt64>
+			(MOVVconst [0xff]) (SLLVconst <typ.UInt64> [3]
+				(ANDconst <typ.UInt64> [3] ptr))))) mem)
+
+// AtomicOr8(ptr,val)  =>  LoweredAtomicOr32(ptr&^3,uint32(val) << (((ptr^3) & 3) * 8))
+(AtomicOr8 ptr val mem) && config.BigEndian =>
+	(LoweredAtomicOr32 (AND <typ.UInt32Ptr> (MOVVconst [^3]) ptr)
+		(SLLV <typ.UInt32> (ZeroExt8to32 val)
+			(SLLVconst <typ.UInt64> [3]
+				(ANDconst <typ.UInt64> [3]
+					(XORconst <typ.UInt64> [3] ptr)))) mem)
+
+// AtomicAnd8(ptr,val)  =>  LoweredAtomicAnd32(ptr&^3,(uint32(val) << (((ptr^3) & 3) * 8)) | ^(uint32(0xFF) << (((ptr^3) & 3) * 8))))
+(AtomicAnd8  ptr val mem) && config.BigEndian =>
+	(LoweredAtomicAnd32 (AND <typ.UInt32Ptr> (MOVVconst [^3]) ptr)
+		(OR <typ.UInt64> (SLLV <typ.UInt32> (ZeroExt8to32 val)
+			(SLLVconst <typ.UInt64> [3]
+				(ANDconst  <typ.UInt64> [3]
+					(XORconst <typ.UInt64> [3] ptr))))
+		(NORconst [0] <typ.UInt64> (SLLV <typ.UInt64>
+			(MOVVconst [0xff]) (SLLVconst <typ.UInt64> [3]
+				(ANDconst <typ.UInt64> [3]
+					(XORconst <typ.UInt64> [3] ptr)))))) mem)
+
+(AtomicAnd32 ...) => (LoweredAtomicAnd32 ...)
+(AtomicOr32  ...) => (LoweredAtomicOr32  ...)
+
 // checks
 (NilCheck ...) => (LoweredNilCheck ...)
 (IsNonNil ptr) => (SGTU ptr (MOVVconst [0]))
@@ -443,65 +500,122 @@
 (ADDVconst [off1] (MOVVaddr [off2] {sym} ptr)) && is32Bit(off1+int64(off2)) => (MOVVaddr [int32(off1)+int32(off2)] {sym} ptr)
 
 // fold address into load/store
-(MOVBload  [off1] {sym} (ADDVconst [off2] ptr) mem) && is32Bit(int64(off1)+off2) => (MOVBload  [off1+int32(off2)] {sym} ptr mem)
-(MOVBUload [off1] {sym} (ADDVconst [off2] ptr) mem) && is32Bit(int64(off1)+off2) => (MOVBUload [off1+int32(off2)] {sym} ptr mem)
-(MOVHload  [off1] {sym} (ADDVconst [off2] ptr) mem) && is32Bit(int64(off1)+off2) => (MOVHload  [off1+int32(off2)] {sym} ptr mem)
-(MOVHUload [off1] {sym} (ADDVconst [off2] ptr) mem) && is32Bit(int64(off1)+off2) => (MOVHUload [off1+int32(off2)] {sym} ptr mem)
-(MOVWload  [off1] {sym} (ADDVconst [off2] ptr) mem) && is32Bit(int64(off1)+off2) => (MOVWload  [off1+int32(off2)] {sym} ptr mem)
-(MOVWUload [off1] {sym} (ADDVconst [off2] ptr) mem) && is32Bit(int64(off1)+off2) => (MOVWUload [off1+int32(off2)] {sym} ptr mem)
-(MOVVload  [off1] {sym} (ADDVconst [off2] ptr) mem) && is32Bit(int64(off1)+off2) => (MOVVload  [off1+int32(off2)] {sym} ptr mem)
-(MOVFload  [off1] {sym} (ADDVconst [off2] ptr) mem) && is32Bit(int64(off1)+off2) => (MOVFload  [off1+int32(off2)] {sym} ptr mem)
-(MOVDload  [off1] {sym} (ADDVconst [off2] ptr) mem) && is32Bit(int64(off1)+off2) => (MOVDload  [off1+int32(off2)] {sym} ptr mem)
+(MOVBload  [off1] {sym} (ADDVconst [off2] ptr) mem) && is32Bit(int64(off1)+off2)
+	 && (ptr.Op != OpSB || !config.ctxt.Flag_shared) => (MOVBload  [off1+int32(off2)] {sym} ptr mem)
+(MOVBUload [off1] {sym} (ADDVconst [off2] ptr) mem) && is32Bit(int64(off1)+off2)
+	 && (ptr.Op != OpSB || !config.ctxt.Flag_shared) => (MOVBUload [off1+int32(off2)] {sym} ptr mem)
+(MOVHload  [off1] {sym} (ADDVconst [off2] ptr) mem) && is32Bit(int64(off1)+off2)
+	 && (ptr.Op != OpSB || !config.ctxt.Flag_shared) => (MOVHload  [off1+int32(off2)] {sym} ptr mem)
+(MOVHUload [off1] {sym} (ADDVconst [off2] ptr) mem) && is32Bit(int64(off1)+off2)
+	 && (ptr.Op != OpSB || !config.ctxt.Flag_shared) => (MOVHUload [off1+int32(off2)] {sym} ptr mem)
+(MOVWload  [off1] {sym} (ADDVconst [off2] ptr) mem) && is32Bit(int64(off1)+off2)
+	 && (ptr.Op != OpSB || !config.ctxt.Flag_shared) => (MOVWload  [off1+int32(off2)] {sym} ptr mem)
+(MOVWUload [off1] {sym} (ADDVconst [off2] ptr) mem) && is32Bit(int64(off1)+off2)
+	 && (ptr.Op != OpSB || !config.ctxt.Flag_shared) => (MOVWUload [off1+int32(off2)] {sym} ptr mem)
+(MOVVload  [off1] {sym} (ADDVconst [off2] ptr) mem) && is32Bit(int64(off1)+off2)
+	 && (ptr.Op != OpSB || !config.ctxt.Flag_shared) => (MOVVload  [off1+int32(off2)] {sym} ptr mem)
+(MOVFload  [off1] {sym} (ADDVconst [off2] ptr) mem) && is32Bit(int64(off1)+off2)
+	 && (ptr.Op != OpSB || !config.ctxt.Flag_shared) => (MOVFload  [off1+int32(off2)] {sym} ptr mem)
+(MOVDload  [off1] {sym} (ADDVconst [off2] ptr) mem) && is32Bit(int64(off1)+off2)
+	 && (ptr.Op != OpSB || !config.ctxt.Flag_shared) => (MOVDload  [off1+int32(off2)] {sym} ptr mem)
 
-(MOVBstore [off1] {sym} (ADDVconst [off2] ptr) val mem) && is32Bit(int64(off1)+off2) => (MOVBstore [off1+int32(off2)] {sym} ptr val mem)
-(MOVHstore [off1] {sym} (ADDVconst [off2] ptr) val mem) && is32Bit(int64(off1)+off2) => (MOVHstore [off1+int32(off2)] {sym} ptr val mem)
-(MOVWstore [off1] {sym} (ADDVconst [off2] ptr) val mem) && is32Bit(int64(off1)+off2) => (MOVWstore [off1+int32(off2)] {sym} ptr val mem)
-(MOVVstore [off1] {sym} (ADDVconst [off2] ptr) val mem) && is32Bit(int64(off1)+off2) => (MOVVstore [off1+int32(off2)] {sym} ptr val mem)
-(MOVFstore [off1] {sym} (ADDVconst [off2] ptr) val mem) && is32Bit(int64(off1)+off2) => (MOVFstore [off1+int32(off2)] {sym} ptr val mem)
-(MOVDstore [off1] {sym} (ADDVconst [off2] ptr) val mem) && is32Bit(int64(off1)+off2) => (MOVDstore [off1+int32(off2)] {sym} ptr val mem)
-(MOVBstorezero [off1] {sym} (ADDVconst [off2] ptr) mem) && is32Bit(int64(off1)+off2) => (MOVBstorezero [off1+int32(off2)] {sym} ptr mem)
-(MOVHstorezero [off1] {sym} (ADDVconst [off2] ptr) mem) && is32Bit(int64(off1)+off2) => (MOVHstorezero [off1+int32(off2)] {sym} ptr mem)
-(MOVWstorezero [off1] {sym} (ADDVconst [off2] ptr) mem) && is32Bit(int64(off1)+off2) => (MOVWstorezero [off1+int32(off2)] {sym} ptr mem)
-(MOVVstorezero [off1] {sym} (ADDVconst [off2] ptr) mem) && is32Bit(int64(off1)+off2) => (MOVVstorezero [off1+int32(off2)] {sym} ptr mem)
+(MOVBstore [off1] {sym} (ADDVconst [off2] ptr) val mem) && is32Bit(int64(off1)+off2)
+	 && (ptr.Op != OpSB || !config.ctxt.Flag_shared) => (MOVBstore [off1+int32(off2)] {sym} ptr val mem)
+(MOVHstore [off1] {sym} (ADDVconst [off2] ptr) val mem) && is32Bit(int64(off1)+off2)
+	 && (ptr.Op != OpSB || !config.ctxt.Flag_shared) => (MOVHstore [off1+int32(off2)] {sym} ptr val mem)
+(MOVWstore [off1] {sym} (ADDVconst [off2] ptr) val mem) && is32Bit(int64(off1)+off2)
+	 && (ptr.Op != OpSB || !config.ctxt.Flag_shared) => (MOVWstore [off1+int32(off2)] {sym} ptr val mem)
+(MOVVstore [off1] {sym} (ADDVconst [off2] ptr) val mem) && is32Bit(int64(off1)+off2)
+	 && (ptr.Op != OpSB || !config.ctxt.Flag_shared) => (MOVVstore [off1+int32(off2)] {sym} ptr val mem)
+(MOVFstore [off1] {sym} (ADDVconst [off2] ptr) val mem) && is32Bit(int64(off1)+off2)
+	 && (ptr.Op != OpSB || !config.ctxt.Flag_shared) => (MOVFstore [off1+int32(off2)] {sym} ptr val mem)
+(MOVDstore [off1] {sym} (ADDVconst [off2] ptr) val mem) && is32Bit(int64(off1)+off2)
+	 && (ptr.Op != OpSB || !config.ctxt.Flag_shared) => (MOVDstore [off1+int32(off2)] {sym} ptr val mem)
+(MOVBstorezero [off1] {sym} (ADDVconst [off2] ptr) mem) && is32Bit(int64(off1)+off2)
+	 && (ptr.Op != OpSB || !config.ctxt.Flag_shared) => (MOVBstorezero [off1+int32(off2)] {sym} ptr mem)
+(MOVHstorezero [off1] {sym} (ADDVconst [off2] ptr) mem) && is32Bit(int64(off1)+off2)
+	 && (ptr.Op != OpSB || !config.ctxt.Flag_shared) => (MOVHstorezero [off1+int32(off2)] {sym} ptr mem)
+(MOVWstorezero [off1] {sym} (ADDVconst [off2] ptr) mem) && is32Bit(int64(off1)+off2)
+	 && (ptr.Op != OpSB || !config.ctxt.Flag_shared) => (MOVWstorezero [off1+int32(off2)] {sym} ptr mem)
+(MOVVstorezero [off1] {sym} (ADDVconst [off2] ptr) mem) && is32Bit(int64(off1)+off2)
+	 && (ptr.Op != OpSB || !config.ctxt.Flag_shared) => (MOVVstorezero [off1+int32(off2)] {sym} ptr mem)
 
-(MOVBload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem) && canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) =>
+(MOVBload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem)
+	&& canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	&& (ptr.Op != OpSB || !config.ctxt.Flag_shared) =>
 	(MOVBload [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr mem)
-(MOVBUload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem) && canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) =>
+(MOVBUload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem)
+	&& canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	&& (ptr.Op != OpSB || !config.ctxt.Flag_shared) =>
 	(MOVBUload [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr mem)
-(MOVHload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem) && canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) =>
+(MOVHload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem)
+	&& canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	&& (ptr.Op != OpSB || !config.ctxt.Flag_shared) =>
 	(MOVHload [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr mem)
-(MOVHUload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem) && canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) =>
+(MOVHUload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem)
+	&& canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	&& (ptr.Op != OpSB || !config.ctxt.Flag_shared) =>
 	(MOVHUload [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr mem)
-(MOVWload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem) && canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) =>
+(MOVWload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem)
+	&& canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	&& (ptr.Op != OpSB || !config.ctxt.Flag_shared) =>
 	(MOVWload [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr mem)
-(MOVWUload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem) && canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) =>
+(MOVWUload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem)
+	&& canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	&& (ptr.Op != OpSB || !config.ctxt.Flag_shared) =>
 	(MOVWUload [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr mem)
-(MOVVload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem) && canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) =>
+(MOVVload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem)
+	&& canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	&& (ptr.Op != OpSB || !config.ctxt.Flag_shared) =>
 	(MOVVload [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr mem)
-(MOVFload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem) && canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) =>
+(MOVFload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem)
+	&& canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	&& (ptr.Op != OpSB || !config.ctxt.Flag_shared) =>
 	(MOVFload [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr mem)
-(MOVDload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem) && canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) =>
+(MOVDload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem)
+	&& canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	&& (ptr.Op != OpSB || !config.ctxt.Flag_shared) =>
 	(MOVDload [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr mem)
 
-(MOVBstore [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) val mem) && canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) =>
+(MOVBstore [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) val mem)
+	&& canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	&& (ptr.Op != OpSB || !config.ctxt.Flag_shared) =>
 	(MOVBstore [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr val mem)
-(MOVHstore [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) val mem) && canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) =>
+(MOVHstore [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) val mem)
+	&& canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	&& (ptr.Op != OpSB || !config.ctxt.Flag_shared) =>
 	(MOVHstore [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr val mem)
-(MOVWstore [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) val mem) && canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) =>
+(MOVWstore [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) val mem)
+	&& canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	&& (ptr.Op != OpSB || !config.ctxt.Flag_shared) =>
 	(MOVWstore [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr val mem)
-(MOVVstore [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) val mem) && canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) =>
+(MOVVstore [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) val mem)
+	&& canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+       	&& (ptr.Op != OpSB || !config.ctxt.Flag_shared) =>
 	(MOVVstore [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr val mem)
-(MOVFstore [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) val mem) && canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) =>
+(MOVFstore [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) val mem)
+	&& canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	&& (ptr.Op != OpSB || !config.ctxt.Flag_shared) =>
 	(MOVFstore [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr val mem)
-(MOVDstore [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) val mem) && canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) =>
+(MOVDstore [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) val mem)
+	&& canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	&& (ptr.Op != OpSB || !config.ctxt.Flag_shared) =>
 	(MOVDstore [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr val mem)
-(MOVBstorezero [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem) && canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) =>
+(MOVBstorezero [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem)
+	&& canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	&& (ptr.Op != OpSB || !config.ctxt.Flag_shared) =>
 	(MOVBstorezero [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr mem)
-(MOVHstorezero [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem) && canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) =>
+(MOVHstorezero [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem)
+	&& canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	&& (ptr.Op != OpSB || !config.ctxt.Flag_shared) =>
 	(MOVHstorezero [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr mem)
-(MOVWstorezero [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem) && canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) =>
+(MOVWstorezero [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem)
+	&& canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	&& (ptr.Op != OpSB || !config.ctxt.Flag_shared) =>
 	(MOVWstorezero [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr mem)
-(MOVVstorezero [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem) && canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) =>
+(MOVVstorezero [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem)
+	&& canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	&& (ptr.Op != OpSB || !config.ctxt.Flag_shared) =>
 	(MOVVstorezero [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr mem)
 
 // store zero
@@ -566,7 +680,7 @@
 (MOVVnop (MOVVconst [c])) => (MOVVconst [c])
 
 // fold constant into arithmetic ops
-(ADDV x (MOVVconst [c])) && is32Bit(c) => (ADDVconst [c] x)
+(ADDV x (MOVVconst <t> [c])) && is32Bit(c) && !t.IsPtr() => (ADDVconst [c] x)
 (SUBV x (MOVVconst [c])) && is32Bit(c) => (SUBVconst [c] x)
 (AND x (MOVVconst [c])) && is32Bit(c) => (ANDconst [c] x)
 (OR  x (MOVVconst [c])) && is32Bit(c) => (ORconst  [c] x)
@@ -688,4 +802,4 @@
 (MOVBload [off] {sym} (SB) _) && symIsRO(sym) => (MOVVconst [int64(read8(sym, int64(off)))])
 (MOVHload [off] {sym} (SB) _) && symIsRO(sym) => (MOVVconst [int64(read16(sym, int64(off), config.ctxt.Arch.ByteOrder))])
 (MOVWload [off] {sym} (SB) _) && symIsRO(sym) => (MOVVconst [int64(read32(sym, int64(off), config.ctxt.Arch.ByteOrder))])
-(MOVVload  [off] {sym} (SB) _) && symIsRO(sym) => (MOVVconst [int64(read64(sym, int64(off), config.ctxt.Arch.ByteOrder))])
+(MOVVload [off] {sym} (SB) _) && symIsRO(sym) => (MOVVconst [int64(read64(sym, int64(off), config.ctxt.Arch.ByteOrder))])
diff --git a/src/cmd/compile/internal/ssa/_gen/MIPS64Ops.go b/src/cmd/compile/internal/ssa/_gen/MIPS64Ops.go
index 89c8772..08cab89 100644
--- a/src/cmd/compile/internal/ssa/_gen/MIPS64Ops.go
+++ b/src/cmd/compile/internal/ssa/_gen/MIPS64Ops.go
@@ -156,8 +156,8 @@
 		fp01     = regInfo{inputs: nil, outputs: []regMask{fp}}
 		fp11     = regInfo{inputs: []regMask{fp}, outputs: []regMask{fp}}
 		//fp1flags  = regInfo{inputs: []regMask{fp}}
-		//fpgp      = regInfo{inputs: []regMask{fp}, outputs: []regMask{gp}}
-		//gpfp      = regInfo{inputs: []regMask{gp}, outputs: []regMask{fp}}
+		fpgp      = regInfo{inputs: []regMask{fp}, outputs: []regMask{gp}}
+		gpfp      = regInfo{inputs: []regMask{gp}, outputs: []regMask{fp}}
 		fp21      = regInfo{inputs: []regMask{fp, fp}, outputs: []regMask{fp}}
 		fp2flags  = regInfo{inputs: []regMask{fp, fp}}
 		fpload    = regInfo{inputs: []regMask{gpspsbg}, outputs: []regMask{fp}}
@@ -196,6 +196,7 @@
 		{name: "NEGV", argLength: 1, reg: gp11},                // -arg0
 		{name: "NEGF", argLength: 1, reg: fp11, asm: "NEGF"},   // -arg0, float32
 		{name: "NEGD", argLength: 1, reg: fp11, asm: "NEGD"},   // -arg0, float64
+		{name: "ABSD", argLength: 1, reg: fp11, asm: "ABSD"},   // abs(arg0), float64
 		{name: "SQRTD", argLength: 1, reg: fp11, asm: "SQRTD"}, // sqrt(arg0), float64
 		{name: "SQRTF", argLength: 1, reg: fp11, asm: "SQRTF"}, // sqrt(arg0), float32
 
@@ -249,6 +250,12 @@
 		{name: "MOVWstorezero", argLength: 2, reg: gpstore0, aux: "SymOff", asm: "MOVW", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"}, // store 4 bytes of zero to arg0 + auxInt + aux.  arg1=mem.
 		{name: "MOVVstorezero", argLength: 2, reg: gpstore0, aux: "SymOff", asm: "MOVV", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"}, // store 8 bytes of zero to arg0 + auxInt + aux.  ar12=mem.
 
+		// moves (no conversion)
+		{name: "MOVWfpgp", argLength: 1, reg: fpgp, asm: "MOVW"}, // move float32 to int32 (no conversion). MIPS64 will perform sign-extend to 64-bit by default
+		{name: "MOVWgpfp", argLength: 1, reg: gpfp, asm: "MOVW"}, // move int32 to float32 (no conversion). MIPS64 will perform sign-extend to 64-bit by default
+		{name: "MOVVfpgp", argLength: 1, reg: fpgp, asm: "MOVV"}, // move float64 to int64 (no conversion).
+		{name: "MOVVgpfp", argLength: 1, reg: gpfp, asm: "MOVV"}, // move int64 to float64 (no conversion).
+
 		// conversions
 		{name: "MOVBreg", argLength: 1, reg: gp11, asm: "MOVB"},   // move from arg0, sign-extended from byte
 		{name: "MOVBUreg", argLength: 1, reg: gp11, asm: "MOVBU"}, // move from arg0, unsign-extended from byte
@@ -360,6 +367,17 @@
 			faultOnNilArg1: true,
 		},
 
+		// atomic and/or.
+		// *arg0 &= (|=) arg1. arg2=mem. returns memory.
+		// SYNC
+		// LL	(Rarg0), Rtmp
+		// AND	Rarg1, Rtmp
+		// SC	Rtmp, (Rarg0)
+		// BEQ	Rtmp, -3(PC)
+		// SYNC
+		{name: "LoweredAtomicAnd32", argLength: 3, reg: gpstore, asm: "AND", faultOnNilArg0: true, hasSideEffects: true, unsafePoint: true},
+		{name: "LoweredAtomicOr32", argLength: 3, reg: gpstore, asm: "OR", faultOnNilArg0: true, hasSideEffects: true, unsafePoint: true},
+
 		// atomic loads.
 		// load from arg0. arg1=mem.
 		// returns <value,memory> so they can be properly ordered with other loads.
@@ -432,8 +450,8 @@
 		// use of R22 (mips.REGCTXT, the closure pointer)
 		{name: "LoweredGetClosurePtr", reg: regInfo{outputs: []regMask{buildReg("R22")}}, zeroWidth: true},
 
-		// LoweredGetCallerSP returns the SP of the caller of the current function.
-		{name: "LoweredGetCallerSP", reg: gp01, rematerializeable: true},
+		// LoweredGetCallerSP returns the SP of the caller of the current function. arg0=mem.
+		{name: "LoweredGetCallerSP", argLength: 1, reg: gp01, rematerializeable: true},
 
 		// LoweredGetCallerPC evaluates to the PC to which its "caller" will return.
 		// I.e., if f calls g "calls" getcallerpc,
@@ -441,11 +459,12 @@
 		// See runtime/stubs.go for a more detailed discussion.
 		{name: "LoweredGetCallerPC", reg: gp01, rematerializeable: true},
 
-		// LoweredWB invokes runtime.gcWriteBarrier. arg0=destptr, arg1=srcptr, arg2=mem, aux=runtime.gcWriteBarrier
+		// LoweredWB invokes runtime.gcWriteBarrier. arg0=mem, auxint=# of buffer entries needed
 		// It saves all GP registers if necessary,
 		// but clobbers R31 (LR) because it's a call
 		// and R23 (REGTMP).
-		{name: "LoweredWB", argLength: 3, reg: regInfo{inputs: []regMask{buildReg("R20"), buildReg("R21")}, clobbers: (callerSave &^ gpg) | buildReg("R31")}, clobberFlags: true, aux: "Sym", symEffect: "None"},
+		// Returns a pointer to a write barrier buffer in R25.
+		{name: "LoweredWB", argLength: 1, reg: regInfo{clobbers: (callerSave &^ gpg) | buildReg("R31"), outputs: []regMask{buildReg("R25")}}, clobberFlags: true, aux: "Int64"},
 
 		// There are three of these functions so that they can have three different register inputs.
 		// When we check 0 <= c <= cap (A), then 0 <= b <= c (B), then 0 <= a <= b (C), we want the
diff --git a/src/cmd/compile/internal/ssa/_gen/MIPSOps.go b/src/cmd/compile/internal/ssa/_gen/MIPSOps.go
index 22a7a5c..5964bb7 100644
--- a/src/cmd/compile/internal/ssa/_gen/MIPSOps.go
+++ b/src/cmd/compile/internal/ssa/_gen/MIPSOps.go
@@ -139,6 +139,8 @@
 		gpxchg    = regInfo{inputs: []regMask{gpspsbg, gpg}, outputs: []regMask{gp}}
 		gpcas     = regInfo{inputs: []regMask{gpspsbg, gpg, gpg}, outputs: []regMask{gp}}
 		gpstore0  = regInfo{inputs: []regMask{gpspsbg}}
+		fpgp      = regInfo{inputs: []regMask{fp}, outputs: []regMask{gp}}
+		gpfp      = regInfo{inputs: []regMask{gp}, outputs: []regMask{fp}}
 		fp01      = regInfo{inputs: nil, outputs: []regMask{fp}}
 		fp11      = regInfo{inputs: []regMask{fp}, outputs: []regMask{fp}}
 		fp21      = regInfo{inputs: []regMask{fp, fp}, outputs: []regMask{fp}}
@@ -179,6 +181,7 @@
 		{name: "NEG", argLength: 1, reg: gp11},                 // -arg0
 		{name: "NEGF", argLength: 1, reg: fp11, asm: "NEGF"},   // -arg0, float32
 		{name: "NEGD", argLength: 1, reg: fp11, asm: "NEGD"},   // -arg0, float64
+		{name: "ABSD", argLength: 1, reg: fp11, asm: "ABSD"},   // abs(arg0), float64
 		{name: "SQRTD", argLength: 1, reg: fp11, asm: "SQRTD"}, // sqrt(arg0), float64
 		{name: "SQRTF", argLength: 1, reg: fp11, asm: "SQRTF"}, // sqrt(arg0), float32
 
@@ -232,6 +235,10 @@
 		{name: "MOVHstorezero", argLength: 2, reg: gpstore0, aux: "SymOff", asm: "MOVH", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"}, // store 2 bytes of zero to arg0 + auxInt + aux.  arg1=mem.
 		{name: "MOVWstorezero", argLength: 2, reg: gpstore0, aux: "SymOff", asm: "MOVW", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"}, // store 4 bytes of zero to arg0 + auxInt + aux.  arg1=mem.
 
+		// moves (no conversion)
+		{name: "MOVWfpgp", argLength: 1, reg: fpgp, asm: "MOVW"}, // move float32 to int32 (no conversion)
+		{name: "MOVWgpfp", argLength: 1, reg: gpfp, asm: "MOVW"}, // move int32 to float32 (no conversion)
+
 		// conversions
 		{name: "MOVBreg", argLength: 1, reg: gp11, asm: "MOVB"},   // move from arg0, sign-extended from byte
 		{name: "MOVBUreg", argLength: 1, reg: gp11, asm: "MOVBU"}, // move from arg0, unsign-extended from byte
@@ -385,8 +392,8 @@
 		// use of R22 (mips.REGCTXT, the closure pointer)
 		{name: "LoweredGetClosurePtr", reg: regInfo{outputs: []regMask{buildReg("R22")}}, zeroWidth: true},
 
-		// LoweredGetCallerSP returns the SP of the caller of the current function.
-		{name: "LoweredGetCallerSP", reg: gp01, rematerializeable: true},
+		// LoweredGetCallerSP returns the SP of the caller of the current function. arg0=mem.
+		{name: "LoweredGetCallerSP", argLength: 1, reg: gp01, rematerializeable: true},
 
 		// LoweredGetCallerPC evaluates to the PC to which its "caller" will return.
 		// I.e., if f calls g "calls" getcallerpc,
@@ -394,11 +401,12 @@
 		// See runtime/stubs.go for a more detailed discussion.
 		{name: "LoweredGetCallerPC", reg: gp01, rematerializeable: true},
 
-		// LoweredWB invokes runtime.gcWriteBarrier. arg0=destptr, arg1=srcptr, arg2=mem, aux=runtime.gcWriteBarrier
+		// LoweredWB invokes runtime.gcWriteBarrier. arg0=mem, auxint=# of buffer entries needed
 		// It saves all GP registers if necessary,
 		// but clobbers R31 (LR) because it's a call
 		// and R23 (REGTMP).
-		{name: "LoweredWB", argLength: 3, reg: regInfo{inputs: []regMask{buildReg("R20"), buildReg("R21")}, clobbers: (callerSave &^ gpg) | buildReg("R31")}, clobberFlags: true, aux: "Sym", symEffect: "None"},
+		// Returns a pointer to a write barrier buffer in R25.
+		{name: "LoweredWB", argLength: 1, reg: regInfo{clobbers: (callerSave &^ gpg) | buildReg("R31"), outputs: []regMask{buildReg("R25")}}, clobberFlags: true, aux: "Int64"},
 
 		// There are three of these functions so that they can have three different register inputs.
 		// When we check 0 <= c <= cap (A), then 0 <= b <= c (B), then 0 <= a <= b (C), we want the
diff --git a/src/cmd/compile/internal/ssa/_gen/PPC64.rules b/src/cmd/compile/internal/ssa/_gen/PPC64.rules
index 5a68de0..97e592f 100644
--- a/src/cmd/compile/internal/ssa/_gen/PPC64.rules
+++ b/src/cmd/compile/internal/ssa/_gen/PPC64.rules
@@ -2,7 +2,10 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// Lowering arithmetic
+// GOPPC64 values indicate power8, power9, etc.
+// That means the code is compiled for that target,
+// and will not run on earlier targets.
+//
 (Add(Ptr|64|32|16|8) ...) => (ADD ...)
 (Add64F ...) => (FADD ...)
 (Add32F ...) => (FADDS ...)
@@ -84,11 +87,11 @@
 (ZeroExt16to(32|64) ...) => (MOVHZreg ...)
 (ZeroExt32to64 ...) => (MOVWZreg ...)
 
-(Trunc(16|32|64)to8 <t> x) && isSigned(t) => (MOVBreg x)
+(Trunc(16|32|64)to8 <t> x) && t.IsSigned() => (MOVBreg x)
 (Trunc(16|32|64)to8  x) => (MOVBZreg x)
-(Trunc(32|64)to16 <t> x) && isSigned(t) => (MOVHreg x)
+(Trunc(32|64)to16 <t> x) && t.IsSigned() => (MOVHreg x)
 (Trunc(32|64)to16 x) => (MOVHZreg x)
-(Trunc64to32 <t> x) && isSigned(t) => (MOVWreg x)
+(Trunc64to32 <t> x) && t.IsSigned() => (MOVWreg x)
 (Trunc64to32 x) => (MOVWZreg x)
 
 // Lowering constants
@@ -172,68 +175,68 @@
 // Lower bounded shifts first. No need to check shift value.
 (Lsh64x(64|32|16|8)  x y) && shiftIsBounded(v) => (SLD x y)
 (Lsh32x(64|32|16|8)  x y) && shiftIsBounded(v) => (SLW x y)
-(Lsh16x(64|32|16|8)  x y) && shiftIsBounded(v) => (SLW x y)
-(Lsh8x(64|32|16|8)   x y) && shiftIsBounded(v) => (SLW x y)
+(Lsh16x(64|32|16|8)  x y) && shiftIsBounded(v) => (SLD x y)
+(Lsh8x(64|32|16|8)   x y) && shiftIsBounded(v) => (SLD x y)
 (Rsh64Ux(64|32|16|8) x y) && shiftIsBounded(v) => (SRD x y)
 (Rsh32Ux(64|32|16|8) x y) && shiftIsBounded(v) => (SRW x y)
-(Rsh16Ux(64|32|16|8) x y) && shiftIsBounded(v) => (SRW (MOVHZreg x) y)
-(Rsh8Ux(64|32|16|8)  x y) && shiftIsBounded(v) => (SRW (MOVBZreg x) y)
+(Rsh16Ux(64|32|16|8) x y) && shiftIsBounded(v) => (SRD (MOVHZreg x) y)
+(Rsh8Ux(64|32|16|8)  x y) && shiftIsBounded(v) => (SRD (MOVBZreg x) y)
 (Rsh64x(64|32|16|8)  x y) && shiftIsBounded(v) => (SRAD x y)
 (Rsh32x(64|32|16|8)  x y) && shiftIsBounded(v) => (SRAW x y)
-(Rsh16x(64|32|16|8)  x y) && shiftIsBounded(v) => (SRAW (MOVHreg x) y)
-(Rsh8x(64|32|16|8)   x y) && shiftIsBounded(v) => (SRAW (MOVBreg x) y)
+(Rsh16x(64|32|16|8)  x y) && shiftIsBounded(v) => (SRAD (MOVHreg x) y)
+(Rsh8x(64|32|16|8)   x y) && shiftIsBounded(v) => (SRAD (MOVBreg x) y)
 
-// non-constant rotates
-// If shift > 64 then use -1 as shift count to shift all bits.
-((Lsh64|Rsh64|Rsh64U)x64 x y)  => (S(L|RA|R)D  x (ISEL [0] y (MOVDconst [-1]) (CMPU y (MOVDconst [64]))))
-((Rsh32|Rsh32U|Lsh32)x64 x y)  => (S(RA|R|L)W x (ISEL [0] y (MOVDconst [-1]) (CMPU y (MOVDconst [32]))))
+// Unbounded shifts. Go shifts saturate to 0 or -1 when shifting beyond the number of
+// bits in a type, PPC64 shifts do not (see the ISA for details).
+//
+// Note, y is always non-negative.
+//
+// Note, ISELZ is intentionally not used in lower. Where possible, ISEL is converted to ISELZ in late lower
+// after all the ISEL folding rules have been exercised.
 
-(Rsh(16|16U)x64 x y)  => (SR(AW|W) ((Sign|Zero)Ext16to32 x) (ISEL [0] y (MOVDconst [-1]) (CMPU y (MOVDconst [16]))))
-(Lsh16x64 x y)  => (SLW  x                 (ISEL [0] y (MOVDconst [-1]) (CMPU y (MOVDconst [16]))))
+((Rsh64U|Lsh64)x64 <t> x y)  => (ISEL [0] (S(R|L)D <t> x y) (MOVDconst [0])        (CMPUconst y [64]))
+((Rsh64U|Lsh64)x32 <t> x y)  => (ISEL [0] (S(R|L)D <t> x y) (MOVDconst [0])        (CMPWUconst y [64]))
+((Rsh64U|Lsh64)x16 <t> x y)  => (ISEL [2] (S(R|L)D <t> x y) (MOVDconst [0])        (Select1 <types.TypeFlags> (ANDCCconst [0xFFC0] y)))
+((Rsh64U|Lsh64)x8  <t> x y)  => (ISEL [2] (S(R|L)D <t> x y) (MOVDconst [0])        (Select1 <types.TypeFlags> (ANDCCconst [0x00C0] y)))
+(Rsh64x(64|32)     <t> x y)  => (ISEL [0] (SRAD    <t> x y) (SRADconst <t> x [63]) (CMP(U|WU)const y [64]))
+(Rsh64x16          <t> x y)  => (ISEL [2] (SRAD    <t> x y) (SRADconst <t> x [63]) (Select1 <types.TypeFlags> (ANDCCconst [0xFFC0] y)))
+(Rsh64x8           <t> x y)  => (ISEL [2] (SRAD    <t> x y) (SRADconst <t> x [63]) (Select1 <types.TypeFlags> (ANDCCconst [0x00C0] y)))
 
-(Rsh(8|8U)x64 x y)  => (SR(AW|W) ((Sign|Zero)Ext8to32 x) (ISEL [0] y (MOVDconst [-1]) (CMPU y (MOVDconst [8]))))
-(Lsh8x64 x y)  => (SLW  x                (ISEL [0] y (MOVDconst [-1]) (CMPU y (MOVDconst [8]))))
+((Rsh32U|Lsh32)x64 <t> x y)  => (ISEL [0] (S(R|L)W <t> x y) (MOVDconst [0])        (CMPUconst y [32]))
+((Rsh32U|Lsh32)x32 <t> x y)  => (ISEL [0] (S(R|L)W <t> x y) (MOVDconst [0])        (CMPWUconst y [32]))
+((Rsh32U|Lsh32)x16 <t> x y)  => (ISEL [2] (S(R|L)W <t> x y) (MOVDconst [0])        (Select1 <types.TypeFlags> (ANDCCconst [0xFFE0] y)))
+((Rsh32U|Lsh32)x8  <t> x y)  => (ISEL [2] (S(R|L)W <t> x y) (MOVDconst [0])        (Select1 <types.TypeFlags> (ANDCCconst [0x00E0] y)))
+(Rsh32x(64|32)     <t> x y)  => (ISEL [0] (SRAW    <t> x y) (SRAWconst <t> x [31]) (CMP(U|WU)const y [32]))
+(Rsh32x16          <t> x y)  => (ISEL [2] (SRAW    <t> x y) (SRAWconst <t> x [31]) (Select1 <types.TypeFlags> (ANDCCconst [0xFFE0] y)))
+(Rsh32x8           <t> x y)  => (ISEL [2] (SRAW    <t> x y) (SRAWconst <t> x [31]) (Select1 <types.TypeFlags> (ANDCCconst [0x00E0] y)))
 
-((Rsh64|Rsh64U|Lsh64)x32 x y)  => (S(RA|R|L)D x (ISEL [0] y (MOVDconst [-1]) (CMPU y (MOVDconst [64]))))
-((Rsh32|Rsh32U|Lsh32)x32 x y)  => (S(RA|R|L)W x (ISEL [0] y (MOVDconst [-1]) (CMPU y (MOVDconst [32]))))
+((Rsh16U|Lsh16)x64 <t> x y) => (ISEL [0] (S(R|L)D  <t> (MOVHZreg x) y) (MOVDconst [0])                   (CMPUconst  y [16]))
+((Rsh16U|Lsh16)x32 <t> x y) => (ISEL [0] (S(R|L)D  <t> (MOVHZreg x) y) (MOVDconst [0])                   (CMPWUconst y [16]))
+((Rsh16U|Lsh16)x16 <t> x y) => (ISEL [2] (S(R|L)D  <t> (MOVHZreg x) y) (MOVDconst [0])                   (Select1 <types.TypeFlags> (ANDCCconst [0xFFF0] y)))
+((Rsh16U|Lsh16)x8  <t> x y) => (ISEL [2] (S(R|L)D  <t> (MOVHZreg x) y) (MOVDconst [0])                   (Select1 <types.TypeFlags> (ANDCCconst [0x00F0] y)))
+(Rsh16x(64|32)     <t> x y) => (ISEL [0] (SRAD     <t> (MOVHreg  x) y) (SRADconst <t>  (MOVHreg x) [15]) (CMP(U|WU)const  y [16]))
+(Rsh16x16          <t> x y) => (ISEL [2] (SRAD     <t> (MOVHreg  x) y) (SRADconst <t>  (MOVHreg x) [15]) (Select1 <types.TypeFlags> (ANDCCconst [0xFFF0] y)))
+(Rsh16x8           <t> x y) => (ISEL [2] (SRAD     <t> (MOVHreg  x) y) (SRADconst <t>  (MOVHreg x) [15]) (Select1 <types.TypeFlags> (ANDCCconst [0x00F0] y)))
 
-(Rsh(16|16U)x32 x y)  => (SR(AW|W) ((Sign|Zero)Ext16to32 x) (ISEL [0] y (MOVDconst [-1]) (CMPU y (MOVDconst [16]))))
-(Lsh16x32 x y)  => (SLW  x                 (ISEL [0] y (MOVDconst [-1]) (CMPU y (MOVDconst [16]))))
+((Rsh8U|Lsh8)x64 <t> x y) => (ISEL [0] (S(R|L)D  <t> (MOVBZreg x) y) (MOVDconst [0])                  (CMPUconst  y [8]))
+((Rsh8U|Lsh8)x32 <t> x y) => (ISEL [0] (S(R|L)D  <t> (MOVBZreg x) y) (MOVDconst [0])                  (CMPWUconst y [8]))
+((Rsh8U|Lsh8)x16 <t> x y) => (ISEL [2] (S(R|L)D  <t> (MOVBZreg x) y) (MOVDconst [0])                  (Select1 <types.TypeFlags> (ANDCCconst [0xFFF8] y)))
+((Rsh8U|Lsh8)x8  <t> x y) => (ISEL [2] (S(R|L)D  <t> (MOVBZreg x) y) (MOVDconst [0])                  (Select1 <types.TypeFlags> (ANDCCconst [0x00F8] y)))
+(Rsh8x(64|32)    <t> x y) => (ISEL [0] (SRAD     <t> (MOVBreg  x) y) (SRADconst <t>  (MOVBreg x) [7]) (CMP(U|WU)const  y [8]))
+(Rsh8x16         <t> x y) => (ISEL [2] (SRAD     <t> (MOVBreg  x) y) (SRADconst <t>  (MOVBreg x) [7]) (Select1 <types.TypeFlags> (ANDCCconst [0xFFF8] y)))
+(Rsh8x8          <t> x y) => (ISEL [2] (SRAD     <t> (MOVBreg  x) y) (SRADconst <t>  (MOVBreg x) [7]) (Select1 <types.TypeFlags> (ANDCCconst [0x00F8] y)))
 
-(Rsh(8|8U)x32 x y)  => (SR(AW|W) ((Sign|Zero)Ext8to32 x) (ISEL [0] y (MOVDconst [-1]) (CMPU y (MOVDconst [8]))))
-(Lsh8x32 x y)  => (SLW  x                (ISEL [0] y (MOVDconst [-1]) (CMPU y (MOVDconst [8]))))
+// Catch bounded shifts in situations like foo<<uint(shift&63) which might not be caught by the prove pass.
+(CMP(U|WU)const [d] (Select0 (ANDCCconst z [c]))) && uint64(d) > uint64(c) => (FlagLT)
 
-((Rsh64|Rsh64U|Lsh64)x16 x y)  => (S(RA|R|L)D x (ISEL [0] y (MOVDconst [-1]) (CMPU (ZeroExt16to64 y) (MOVDconst [64]))))
-
-((Rsh32|Rsh32U|Lsh32)x16 x y)  => (S(RA|R|L)W x (ISEL [0] y (MOVDconst [-1]) (CMPU (ZeroExt16to64 y) (MOVDconst [32]))))
-
-(Rsh(16|16U)x16 x y)  => (S(RA|R)W ((Sign|Zero)Ext16to32 x) (ISEL [0] y (MOVDconst [-1]) (CMPU (ZeroExt16to64 y) (MOVDconst [16]))))
-(Lsh16x16 x y)  => (SLW  x                 (ISEL [0] y (MOVDconst [-1]) (CMPU (ZeroExt16to64 y) (MOVDconst [16]))))
-
-(Rsh(8|8U)x16 x y)  => (SR(AW|W) ((Sign|Zero)Ext8to32 x) (ISEL [0] y (MOVDconst [-1]) (CMPU (ZeroExt16to64 y) (MOVDconst [8]))))
-(Lsh8x16 x y)  => (SLW  x                (ISEL [0] y (MOVDconst [-1]) (CMPU (ZeroExt16to64 y) (MOVDconst [8]))))
-
-
-((Rsh64|Rsh64U|Lsh64)x8 x y)  => (S(RA|R|L)D x (ISEL [0] y (MOVDconst [-1]) (CMPU (ZeroExt8to64 y) (MOVDconst [64]))))
-
-((Rsh32|Rsh32U|Lsh32)x8 x y)  => (S(RA|R|L)W x (ISEL [0] y (MOVDconst [-1]) (CMPU (ZeroExt8to64 y) (MOVDconst [32]))))
-
-(Rsh(16|16U)x8 x y)  => (S(RA|R)W ((Sign|Zero)Ext16to32 x) (ISEL [0] y (MOVDconst [-1]) (CMPU (ZeroExt8to64 y) (MOVDconst [16]))))
-(Lsh16x8 x y)  => (SLW  x                 (ISEL [0] y (MOVDconst [-1]) (CMPU (ZeroExt8to64 y) (MOVDconst [16]))))
-
-(Rsh(8|8U)x8 x y)  => (S(RA|R)W ((Sign|Zero)Ext8to32 x) (ISEL [0] y (MOVDconst [-1]) (CMPU (ZeroExt8to64 y) (MOVDconst [8]))))
-(Lsh8x8 x y)  => (SLW  x                (ISEL [0] y (MOVDconst [-1]) (CMPU (ZeroExt8to64 y) (MOVDconst [8]))))
-
-// Cleaning up shift ops
-(ISEL [0] (Select0 (ANDCCconst [d] y)) (MOVDconst [-1]) (CMPU (Select0 (ANDCCconst [d] y)) (MOVDconst [c]))) && c >= d => (Select0 (ANDCCconst [d] y))
-(ISEL [0] (Select0 (ANDCCconst [d] y)) (MOVDconst [-1]) (CMPUconst [c] (Select0 (ANDCCconst [d] y)))) && c >= d => (Select0 (ANDCCconst [d] y))
 (ORN x (MOVDconst [-1])) => x
 
 (S(RAD|RD|LD) x (MOVDconst [c])) => (S(RAD|RD|LD)const [c&63 | (c>>6&1*63)] x)
 (S(RAW|RW|LW) x (MOVDconst [c])) => (S(RAW|RW|LW)const [c&31 | (c>>5&1*31)] x)
 
 (Addr {sym} base) => (MOVDaddr {sym} [0] base)
-(LocalAddr {sym} base _) => (MOVDaddr {sym} base)
+(LocalAddr <t> {sym} base mem) && t.Elem().HasPointers() => (MOVDaddr {sym} (SPanchored base mem))
+(LocalAddr <t> {sym} base _)  && !t.Elem().HasPointers() => (MOVDaddr {sym} base)
 (OffPtr [off] ptr) => (ADD (MOVDconst <typ.Int64> [off]) ptr)
 
 // TODO: optimize these cases?
@@ -274,14 +277,14 @@
 // Lowering comparisons
 (EqB x y)  => (Select0 <typ.Int> (ANDCCconst [1] (EQV x y)))
 // Sign extension dependence on operand sign sets up for sign/zero-extension elision later
-(Eq(8|16) x y) && isSigned(x.Type) && isSigned(y.Type) => (Equal (CMPW (SignExt(8|16)to32 x) (SignExt(8|16)to32 y)))
+(Eq(8|16) x y) && x.Type.IsSigned() && y.Type.IsSigned() => (Equal (CMPW (SignExt(8|16)to32 x) (SignExt(8|16)to32 y)))
 (Eq(8|16) x y) => (Equal (CMPW (ZeroExt(8|16)to32 x) (ZeroExt(8|16)to32 y)))
 (Eq(32|64|Ptr) x y) => (Equal ((CMPW|CMP|CMP) x y))
 (Eq(32|64)F x y) => (Equal (FCMPU x y))
 
 (NeqB ...) => (XOR ...)
 // Like Eq8 and Eq16, prefer sign extension likely to enable later elision.
-(Neq(8|16) x y) && isSigned(x.Type) && isSigned(y.Type) => (NotEqual (CMPW (SignExt(8|16)to32 x) (SignExt(8|16)to32 y)))
+(Neq(8|16) x y) && x.Type.IsSigned() && y.Type.IsSigned() => (NotEqual (CMPW (SignExt(8|16)to32 x) (SignExt(8|16)to32 y)))
 (Neq(8|16) x y)  => (NotEqual (CMPW (ZeroExt(8|16)to32 x) (ZeroExt(8|16)to32 y)))
 (Neq(32|64|Ptr) x y) => (NotEqual ((CMPW|CMP|CMP) x y))
 (Neq(32|64)F x y) => (NotEqual (FCMPU x y))
@@ -408,29 +411,32 @@
 ((EQ|NE|LT|LE|GT|GE) (CMPconst [0] z:(OR x y)) yes no) && z.Uses == 1 => ((EQ|NE|LT|LE|GT|GE) (Select1 <types.TypeFlags> (ORCC x y)) yes no)
 ((EQ|NE|LT|LE|GT|GE) (CMPconst [0] z:(XOR x y)) yes no) && z.Uses == 1 => ((EQ|NE|LT|LE|GT|GE) (Select1 <types.TypeFlags> (XORCC x y)) yes no)
 
+(CondSelect x y (SETBC [a] cmp))  => (ISEL [a] x y cmp)
+(CondSelect x y (SETBCR [a] cmp))  => (ISEL [a+4] x y cmp)
 // Only lower after bool is lowered. It should always lower. This helps ensure the folding below happens reliably.
 (CondSelect x y bool) && flagArg(bool) == nil => (ISEL [6] x y (Select1 <types.TypeFlags> (ANDCCconst [1] bool)))
 // Fold any CR -> GPR -> CR transfers when applying the above rule.
-(ISEL [6] x y (Select1 (ANDCCconst [1] (ISELB [c] one cmp)))) => (ISEL [c] x y cmp)
+(ISEL [6] x y (Select1 (ANDCCconst [1] (SETBC [c] cmp)))) => (ISEL [c] x y cmp)
+(ISEL [6] x y ((CMP|CMPW)const [0] (SETBC [c] cmp))) => (ISEL [c] x y cmp)
+(ISEL [6] x y ((CMP|CMPW)const [0] (SETBCR [c] cmp))) => (ISEL [c+4] x y cmp)
 
 // Lowering loads
 (Load <t> ptr mem) && (is64BitInt(t) || isPtr(t)) => (MOVDload ptr mem)
-(Load <t> ptr mem) && is32BitInt(t) && isSigned(t) => (MOVWload ptr mem)
-(Load <t> ptr mem) && is32BitInt(t) && !isSigned(t) => (MOVWZload ptr mem)
-(Load <t> ptr mem) && is16BitInt(t) && isSigned(t) => (MOVHload ptr mem)
-(Load <t> ptr mem) && is16BitInt(t) && !isSigned(t) => (MOVHZload ptr mem)
+(Load <t> ptr mem) && is32BitInt(t) &&  t.IsSigned() => (MOVWload ptr mem)
+(Load <t> ptr mem) && is32BitInt(t) && !t.IsSigned() => (MOVWZload ptr mem)
+(Load <t> ptr mem) && is16BitInt(t) &&  t.IsSigned() => (MOVHload ptr mem)
+(Load <t> ptr mem) && is16BitInt(t) && !t.IsSigned() => (MOVHZload ptr mem)
 (Load <t> ptr mem) && t.IsBoolean() => (MOVBZload ptr mem)
-(Load <t> ptr mem) && is8BitInt(t) && isSigned(t) => (MOVBreg (MOVBZload ptr mem)) // PPC has no signed-byte load.
-(Load <t> ptr mem) && is8BitInt(t) && !isSigned(t) => (MOVBZload ptr mem)
+(Load <t> ptr mem) && is8BitInt(t) &&  t.IsSigned() => (MOVBreg (MOVBZload ptr mem)) // PPC has no signed-byte load.
+(Load <t> ptr mem) && is8BitInt(t) && !t.IsSigned() => (MOVBZload ptr mem)
 
 (Load <t> ptr mem) && is32BitFloat(t) => (FMOVSload ptr mem)
 (Load <t> ptr mem) && is64BitFloat(t) => (FMOVDload ptr mem)
 
-(Store {t} ptr val mem) && t.Size() == 8 && is64BitFloat(val.Type) => (FMOVDstore ptr val mem)
-(Store {t} ptr val mem) && t.Size() == 8 && is32BitFloat(val.Type) => (FMOVDstore ptr val mem) // glitch from (Cvt32Fto64F x) => x -- type is wrong
-(Store {t} ptr val mem) && t.Size() == 4 && is32BitFloat(val.Type) => (FMOVSstore ptr val mem)
-(Store {t} ptr val mem) && t.Size() == 8 && !is64BitFloat(val.Type) => (MOVDstore ptr val mem)
-(Store {t} ptr val mem) && t.Size() == 4 && is32BitInt(val.Type) => (MOVWstore ptr val mem)
+(Store {t} ptr val mem) && t.Size() == 8 &&  t.IsFloat() => (FMOVDstore ptr val mem)
+(Store {t} ptr val mem) && t.Size() == 4 &&  t.IsFloat() => (FMOVSstore ptr val mem)
+(Store {t} ptr val mem) && t.Size() == 8 && !t.IsFloat() => (MOVDstore ptr val mem)
+(Store {t} ptr val mem) && t.Size() == 4 && !t.IsFloat() => (MOVWstore ptr val mem)
 (Store {t} ptr val mem) && t.Size() == 2 => (MOVHstore ptr val mem)
 (Store {t} ptr val mem) && t.Size() == 1 => (MOVBstore ptr val mem)
 
@@ -558,11 +564,12 @@
 (OR x (MOVDconst [c])) && isU32Bit(c) => (ORconst [c] x)
 
 // Simplify consts
-(Select0 (ANDCCconst [c] (Select0 (ANDCCconst [d] x)))) => (Select0 (ANDCCconst [c&d] x))
+(ANDCCconst [c] (Select0 (ANDCCconst [d] x))) => (ANDCCconst [c&d] x)
 (ORconst [c] (ORconst [d] x)) => (ORconst [c|d] x)
 (XORconst [c] (XORconst [d] x)) => (XORconst [c^d] x)
 (Select0 (ANDCCconst [-1] x)) => x
 (Select0 (ANDCCconst [0] _)) => (MOVDconst [0])
+(Select1 (ANDCCconst [0] _)) => (FlagEQ)
 (XORconst [0] x) => x
 (ORconst [-1] _) => (MOVDconst [-1])
 (ORconst [0] x) => x
@@ -581,16 +588,16 @@
 
 // small and of zero-extend => either zero-extend or small and
 (Select0 (ANDCCconst [c] y:(MOVBZreg _))) && c&0xFF == 0xFF => y
-(Select0 (ANDCCconst [0xFF] y:(MOVBreg _))) => y
+(Select0 (ANDCCconst [0xFF] (MOVBreg x))) => (MOVBZreg x)
 (Select0 (ANDCCconst [c] y:(MOVHZreg _)))  && c&0xFFFF == 0xFFFF => y
-(Select0 (ANDCCconst [0xFFFF] y:(MOVHreg _))) => y
+(Select0 (ANDCCconst [0xFFFF] (MOVHreg x))) => (MOVHZreg x)
 
 (AND (MOVDconst [c]) y:(MOVWZreg _))  && c&0xFFFFFFFF == 0xFFFFFFFF => y
 (AND (MOVDconst [0xFFFFFFFF]) y:(MOVWreg x)) => (MOVWZreg x)
 // normal case
-(Select0 (ANDCCconst [c] (MOV(B|BZ)reg x))) => (Select0 (ANDCCconst [c&0xFF] x))
-(Select0 (ANDCCconst [c] (MOV(H|HZ)reg x))) => (Select0 (ANDCCconst [c&0xFFFF] x))
-(Select0 (ANDCCconst [c] (MOV(W|WZ)reg x))) => (Select0 (ANDCCconst [c&0xFFFFFFFF] x))
+(Select0 (ANDCCconst [c] (MOVBZreg x))) => (Select0 (ANDCCconst [c&0xFF] x))
+(Select0 (ANDCCconst [c] (MOVHZreg x))) => (Select0 (ANDCCconst [c&0xFFFF] x))
+(Select0 (ANDCCconst [c] (MOVWZreg x))) => (Select0 (ANDCCconst [c&0xFFFFFFFF] x))
 
 // Eliminate unnecessary sign/zero extend following right shift
 (MOV(B|H|W)Zreg (SRWconst [c] (MOVBZreg x))) => (SRWconst [c] (MOVBZreg x))
@@ -665,7 +672,7 @@
 
 // Arithmetic constant ops
 
-(ADD x (MOVDconst [c])) && is32Bit(c) => (ADDconst [c] x)
+(ADD x (MOVDconst <t> [c])) && is32Bit(c) && !t.IsPtr() => (ADDconst [c] x)
 (ADDconst [c] (ADDconst [d] x)) && is32Bit(c+d) => (ADDconst [c+d] x)
 (ADDconst [0] x) => x
 (SUB x (MOVDconst [c])) && is32Bit(-c) => (ADDconst [-c] x)
@@ -701,71 +708,79 @@
 (MTVSRD x:(MOVDload [off] {sym} ptr mem)) && x.Uses == 1 && clobber(x) => @x.Block (FMOVDload [off] {sym} ptr mem)
 (MFVSRD x:(FMOVDload [off] {sym} ptr mem)) && x.Uses == 1 && clobber(x) => @x.Block (MOVDload [off] {sym} ptr mem)
 
+// Rules for MOV* or FMOV* ops determine when indexed (MOV*loadidx or MOV*storeidx)
+// or non-indexed (MOV*load or MOV*store) should be used. Indexed instructions
+// require an extra instruction and register to load the index so non-indexed is preferred.
+// Indexed ops generate indexed load or store instructions for all GOPPC64 values.
+// Non-indexed ops generate DS-form loads and stores when the offset fits in 16 bits,
+// and on power8 and power9, a multiple of 4 is required for MOVW and MOVD ops.
+// On power10, prefixed loads and stores can be used for offsets > 16 bits and <= 32 bits.
+// and support for PC relative addressing must be available if relocation is needed.
+// On power10, the assembler will determine when to use DS-form or prefixed
+// instructions for non-indexed ops depending on the value of the offset.
+//
 // Fold offsets for stores.
-(MOV(D|W|H|B)store [off1] {sym} (ADDconst [off2] x) val mem) && is16Bit(int64(off1)+off2) => (MOV(D|W|H|B)store [off1+int32(off2)] {sym} x val mem)
+(MOV(D|W|H|B)store [off1] {sym} (ADDconst [off2] x) val mem) && (is16Bit(int64(off1)+off2) || (supportsPPC64PCRel() && is32Bit(int64(off1)+off2))) => (MOV(D|W|H|B)store [off1+int32(off2)] {sym} x val mem)
 
-(FMOV(S|D)store [off1] {sym} (ADDconst [off2] ptr) val mem) && is16Bit(int64(off1)+off2) => (FMOV(S|D)store [off1+int32(off2)] {sym} ptr val mem)
+(FMOV(S|D)store [off1] {sym} (ADDconst [off2] ptr) val mem) && (is16Bit(int64(off1)+off2) || (supportsPPC64PCRel() && is32Bit(int64(off1)+off2))) => (FMOV(S|D)store [off1+int32(off2)] {sym} ptr val mem)
 
 // Fold address into load/store.
-// The assembler needs to generate several instructions and use
+// If power10 with PCRel is not available, then
+// the assembler needs to generate several instructions and use
 // temp register for accessing global, and each time it will reload
-// the temp register. So don't fold address of global, unless there
-// is only one use.
+// the temp register. So don't fold address of global in that case if there is more than
+// one use.
 (MOV(B|H|W|D)store [off1] {sym1} p:(MOVDaddr [off2] {sym2} ptr) val mem) && canMergeSym(sym1,sym2)
-	&& is16Bit(int64(off1+off2)) && (ptr.Op != OpSB || p.Uses == 1) =>
+	&& ((is16Bit(int64(off1+off2)) && (ptr.Op != OpSB || p.Uses == 1)) || (supportsPPC64PCRel() && is32Bit(int64(off1+off2)))) =>
         (MOV(B|H|W|D)store [off1+off2] {mergeSym(sym1,sym2)} ptr val mem)
 
 (FMOV(S|D)store [off1] {sym1} p:(MOVDaddr [off2] {sym2} ptr) val mem) && canMergeSym(sym1,sym2)
-	&& is16Bit(int64(off1+off2)) && (ptr.Op != OpSB || p.Uses == 1) =>
+	&& ((is16Bit(int64(off1+off2)) && (ptr.Op != OpSB || p.Uses == 1)) || (supportsPPC64PCRel() && is32Bit(int64(off1+off2)))) =>
         (FMOV(S|D)store [off1+off2] {mergeSym(sym1,sym2)} ptr val mem)
 
 (MOV(B|H|W)Zload [off1] {sym1} p:(MOVDaddr [off2] {sym2} ptr) mem) && canMergeSym(sym1,sym2)
-	&& is16Bit(int64(off1+off2)) && (ptr.Op != OpSB || p.Uses == 1) =>
+	&& ((is16Bit(int64(off1+off2)) && (ptr.Op != OpSB || p.Uses == 1)) || (supportsPPC64PCRel() && is32Bit(int64(off1+off2)))) =>
         (MOV(B|H|W)Zload [off1+off2] {mergeSym(sym1,sym2)} ptr mem)
 (MOV(H|W|D)load [off1] {sym1} p:(MOVDaddr [off2] {sym2} ptr) mem) && canMergeSym(sym1,sym2)
-	&& is16Bit(int64(off1+off2)) && (ptr.Op != OpSB || p.Uses == 1) =>
+	&& ((is16Bit(int64(off1+off2)) && (ptr.Op != OpSB || p.Uses == 1)) || (supportsPPC64PCRel() && is32Bit(int64(off1+off2)))) =>
         (MOV(H|W|D)load [off1+off2] {mergeSym(sym1,sym2)} ptr mem)
 (FMOV(S|D)load [off1] {sym1} p:(MOVDaddr [off2] {sym2} ptr) mem) && canMergeSym(sym1,sym2)
-	&& is16Bit(int64(off1+off2)) && (ptr.Op != OpSB || p.Uses == 1) =>
+	&& ((is16Bit(int64(off1+off2)) && (ptr.Op != OpSB || p.Uses == 1)) || (supportsPPC64PCRel() && is32Bit(int64(off1+off2)))) =>
         (FMOV(S|D)load [off1+off2] {mergeSym(sym1,sym2)} ptr mem)
 
 // Fold offsets for loads.
-(FMOV(S|D)load [off1] {sym} (ADDconst [off2] ptr) mem) && is16Bit(int64(off1)+off2) => (FMOV(S|D)load [off1+int32(off2)] {sym} ptr mem)
+(FMOV(S|D)load [off1] {sym} (ADDconst [off2] ptr) mem) && (is16Bit(int64(off1)+off2) || (supportsPPC64PCRel() && is32Bit(int64(off1)+off2))) => (FMOV(S|D)load [off1+int32(off2)] {sym} ptr mem)
 
-(MOV(D|W|WZ|H|HZ|BZ)load [off1] {sym} (ADDconst [off2] x) mem) && is16Bit(int64(off1)+off2) => (MOV(D|W|WZ|H|HZ|BZ)load [off1+int32(off2)] {sym} x mem)
+(MOV(D|W|WZ|H|HZ|BZ)load [off1] {sym} (ADDconst [off2] x) mem) && (is16Bit(int64(off1)+off2) || (supportsPPC64PCRel() && is32Bit(int64(off1)+off2))) => (MOV(D|W|WZ|H|HZ|BZ)load [off1+int32(off2)] {sym} x mem)
 
 // Determine load + addressing that can be done as a register indexed load
 (MOV(D|W|WZ|H|HZ|BZ)load [0] {sym} p:(ADD ptr idx) mem) && sym == nil && p.Uses == 1 => (MOV(D|W|WZ|H|HZ|BZ)loadidx ptr idx mem)
 
-// Determine if there is benefit to using a non-indexed load, since that saves the load
-// of the index register. With MOVDload and MOVWload, there is no benefit if the offset
-// value is not a multiple of 4, since that results in an extra instruction in the base
-// register address computation.
-(MOV(D|W)loadidx ptr (MOVDconst [c]) mem) && is16Bit(c) && c%4 == 0 => (MOV(D|W)load [int32(c)] ptr mem)
-(MOV(WZ|H|HZ|BZ)loadidx ptr (MOVDconst [c]) mem) && is16Bit(c) => (MOV(WZ|H|HZ|BZ)load [int32(c)] ptr mem)
-(MOV(D|W)loadidx (MOVDconst [c]) ptr mem) && is16Bit(c) && c%4 == 0 => (MOV(D|W)load [int32(c)] ptr mem)
-(MOV(WZ|H|HZ|BZ)loadidx (MOVDconst [c]) ptr mem) && is16Bit(c) => (MOV(WZ|H|HZ|BZ)load [int32(c)] ptr mem)
+// See comments above concerning selection of indexed vs. non-indexed ops.
+// These cases don't have relocation.
+(MOV(D|W)loadidx ptr (MOVDconst [c]) mem) && ((is16Bit(c) && c%4 == 0) || (buildcfg.GOPPC64 >= 10 && is32Bit(c))) => (MOV(D|W)load [int32(c)] ptr mem)
+(MOV(WZ|H|HZ|BZ)loadidx ptr (MOVDconst [c]) mem) && (is16Bit(c) || (buildcfg.GOPPC64 >= 10 && is32Bit(c))) => (MOV(WZ|H|HZ|BZ)load [int32(c)] ptr mem)
+(MOV(D|W)loadidx (MOVDconst [c]) ptr mem) && ((is16Bit(c) && c%4 == 0) || (buildcfg.GOPPC64 >= 10 && is32Bit(c))) => (MOV(D|W)load [int32(c)] ptr mem)
+(MOV(WZ|H|HZ|BZ)loadidx (MOVDconst [c]) ptr mem) && (is16Bit(c) || (buildcfg.GOPPC64 >= 10 && is32Bit(c))) => (MOV(WZ|H|HZ|BZ)load [int32(c)] ptr mem)
 
 // Store of zero => storezero
 (MOV(D|W|H|B)store [off] {sym} ptr (MOVDconst [0]) mem) => (MOV(D|W|H|B)storezero [off] {sym} ptr mem)
 
 // Fold offsets for storezero
-(MOV(D|W|H|B)storezero [off1] {sym} (ADDconst [off2] x) mem) && is16Bit(int64(off1)+off2) =>
+(MOV(D|W|H|B)storezero [off1] {sym} (ADDconst [off2] x) mem) && ((supportsPPC64PCRel() && is32Bit(int64(off1)+off2)) || (is16Bit(int64(off1)+off2))) =>
     (MOV(D|W|H|B)storezero [off1+int32(off2)] {sym} x mem)
 
 // Stores with addressing that can be done as indexed stores
 (MOV(D|W|H|B)store [0] {sym} p:(ADD ptr idx) val mem) && sym == nil && p.Uses == 1 => (MOV(D|W|H|B)storeidx ptr idx val mem)
 
-// Stores with constant index values can be done without indexed instructions
-// No need to lower the idx cases if c%4 is not 0
-(MOVDstoreidx ptr (MOVDconst [c]) val mem) && is16Bit(c) && c%4 == 0 => (MOVDstore [int32(c)] ptr val mem)
-(MOV(W|H|B)storeidx ptr (MOVDconst [c]) val mem) && is16Bit(c) => (MOV(W|H|B)store [int32(c)] ptr val mem)
-(MOVDstoreidx (MOVDconst [c]) ptr val mem) && is16Bit(c) && c%4 == 0 => (MOVDstore [int32(c)] ptr val mem)
-(MOV(W|H|B)storeidx (MOVDconst [c]) ptr val mem) && is16Bit(c) => (MOV(W|H|B)store [int32(c)] ptr val mem)
+(MOVDstoreidx ptr (MOVDconst [c]) val mem) && ((is16Bit(c) && c%4 == 0) || (buildcfg.GOPPC64 >= 10 && is32Bit(c))) => (MOVDstore [int32(c)] ptr val mem)
+(MOV(W|H|B)storeidx ptr (MOVDconst [c]) val mem) && (is16Bit(c) || (buildcfg.GOPPC64 >= 10 && is32Bit(c))) => (MOV(W|H|B)store [int32(c)] ptr val mem)
+(MOVDstoreidx (MOVDconst [c]) ptr val mem) && ((is16Bit(c) && c%4 == 0) || (buildcfg.GOPPC64 >= 10 && is32Bit(c))) => (MOVDstore [int32(c)] ptr val mem)
+(MOV(W|H|B)storeidx (MOVDconst [c]) ptr val mem) && (is16Bit(c) || (buildcfg.GOPPC64 >= 10 && is32Bit(c))) => (MOV(W|H|B)store [int32(c)] ptr val mem)
 
 // Fold symbols into storezero
 (MOV(D|W|H|B)storezero [off1] {sym1} p:(MOVDaddr [off2] {sym2} x) mem) && canMergeSym(sym1,sym2)
-	&& (x.Op != OpSB || p.Uses == 1) =>
+	&& ((is16Bit(int64(off1+off2)) && (x.Op != OpSB || p.Uses == 1)) || (supportsPPC64PCRel() && is32Bit(int64(off1+off2)))) =>
     (MOV(D|W|H|B)storezero [off1+off2] {mergeSym(sym1,sym2)} x mem)
 
 // atomic intrinsics
@@ -800,12 +815,12 @@
 (MOV(B|W)Zreg x:(Select0 (LoweredAtomicLoad(8|32) _ _))) => x
 
 // don't extend if argument is already extended
-(MOVBreg x:(Arg <t>)) && is8BitInt(t) && isSigned(t) => x
-(MOVBZreg x:(Arg <t>)) && is8BitInt(t) && !isSigned(t) => x
-(MOVHreg x:(Arg <t>)) && (is8BitInt(t) || is16BitInt(t)) && isSigned(t) => x
-(MOVHZreg x:(Arg <t>)) && (is8BitInt(t) || is16BitInt(t)) && !isSigned(t) => x
-(MOVWreg x:(Arg <t>)) && (is8BitInt(t) || is16BitInt(t) || is32BitInt(t)) && isSigned(t) => x
-(MOVWZreg x:(Arg <t>)) && (is8BitInt(t) || is16BitInt(t) || is32BitInt(t)) && !isSigned(t) => x
+(MOVBreg x:(Arg <t>)) && is8BitInt(t) && t.IsSigned() => x
+(MOVBZreg x:(Arg <t>)) && is8BitInt(t) && !t.IsSigned() => x
+(MOVHreg x:(Arg <t>)) && (is8BitInt(t) || is16BitInt(t)) && t.IsSigned() => x
+(MOVHZreg x:(Arg <t>)) && (is8BitInt(t) || is16BitInt(t)) && !t.IsSigned() => x
+(MOVWreg x:(Arg <t>)) && (is8BitInt(t) || is16BitInt(t) || is32BitInt(t)) && t.IsSigned() => x
+(MOVWZreg x:(Arg <t>)) && (is8BitInt(t) || is16BitInt(t) || is32BitInt(t)) && !t.IsSigned() => x
 
 (MOVBZreg (MOVDconst [c]))  => (MOVDconst [int64(uint8(c))])
 (MOVBreg (MOVDconst [c]))  => (MOVDconst [int64(int8(c))])
@@ -841,8 +856,8 @@
 (MOVWstoreidx ptr idx (MOV(W|WZ)reg x) mem) => (MOVWstoreidx ptr idx x mem)
 (MOVBstoreidx ptr idx (SRWconst (MOV(H|HZ)reg x) [c]) mem) && c <= 8 => (MOVBstoreidx ptr idx (SRWconst <typ.UInt32> x [c]) mem)
 (MOVBstoreidx ptr idx (SRWconst (MOV(W|WZ)reg x) [c]) mem) && c <= 24 => (MOVBstoreidx ptr idx (SRWconst <typ.UInt32> x [c]) mem)
-(MOVHBRstore {sym} ptr (MOV(H|HZ|W|WZ)reg x) mem) => (MOVHBRstore {sym} ptr x mem)
-(MOVWBRstore {sym} ptr (MOV(W|WZ)reg x) mem) => (MOVWBRstore {sym} ptr x mem)
+(MOVHBRstore ptr (MOV(H|HZ|W|WZ)reg x) mem) => (MOVHBRstore ptr x mem)
+(MOVWBRstore ptr (MOV(W|WZ)reg x) mem) => (MOVWBRstore ptr x mem)
 
 // Lose W-widening ops fed to compare-W
 (CMP(W|WU) x (MOV(W|WZ)reg y)) => (CMP(W|WU) x y)
@@ -861,33 +876,43 @@
 // Canonicalize the order of arguments to comparisons - helps with CSE.
 ((CMP|CMPW|CMPU|CMPWU) x y) && canonLessThan(x,y) => (InvertFlags ((CMP|CMPW|CMPU|CMPWU) y x))
 
+// SETBC auxInt values 0=LT 1=GT 2=EQ   Crbit==1 ? 1 : 0
+// SETBCR auxInt values 0=LT 1=GT 2=EQ   Crbit==1 ? 0 : 1
+(Equal cmp) => (SETBC [2] cmp)
+(NotEqual cmp) => (SETBCR [2] cmp)
+(LessThan cmp) => (SETBC [0] cmp)
+(FLessThan cmp) => (SETBC [0] cmp)
+(FLessEqual cmp) => (OR (SETBC [2] cmp) (SETBC [0] cmp))
+(GreaterEqual cmp) => (SETBCR [0] cmp)
+(GreaterThan cmp)  => (SETBC [1] cmp)
+(FGreaterEqual cmp) => (OR (SETBC [2] cmp) (SETBC [1] cmp))
+(FGreaterThan cmp)  => (SETBC [1] cmp)
+(LessEqual cmp) => (SETBCR [1] cmp)
+
+(SETBC [0] (FlagLT)) => (MOVDconst [1])
+(SETBC [0] (Flag(GT|EQ))) => (MOVDconst [0])
+(SETBC [1] (FlagGT)) => (MOVDconst [1])
+(SETBC [1] (Flag(LT|EQ))) => (MOVDconst [0])
+(SETBC [2] (FlagEQ)) => (MOVDconst [1])
+(SETBC [2] (Flag(LT|GT))) => (MOVDconst [0])
+
+(SETBCR [0] (FlagLT)) => (MOVDconst [0])
+(SETBCR [0] (Flag(GT|EQ))) => (MOVDconst [1])
+(SETBCR [1] (FlagGT)) => (MOVDconst [0])
+(SETBCR [1] (Flag(LT|EQ))) => (MOVDconst [1])
+(SETBCR [2] (FlagEQ)) => (MOVDconst [0])
+(SETBCR [2] (Flag(LT|GT))) => (MOVDconst [1])
+
+(SETBC [0] (InvertFlags bool)) => (SETBC [1] bool)
+(SETBC [1] (InvertFlags bool)) => (SETBC [0] bool)
+(SETBC [2] (InvertFlags bool)) => (SETBC [2] bool)
+
+(SETBCR [0] (InvertFlags bool)) => (SETBCR [1] bool)
+(SETBCR [1] (InvertFlags bool)) => (SETBCR [0] bool)
+(SETBCR [2] (InvertFlags bool)) => (SETBCR [2] bool)
+
 // ISEL auxInt values 0=LT 1=GT 2=EQ   arg2 ? arg0 : arg1
 // ISEL auxInt values 4=GE 5=LE 6=NE   !arg2 ? arg1 : arg0
-// ISELB special case where arg0, arg1 values are 0, 1
-
-(Equal cmp) => (ISELB [2] (MOVDconst [1]) cmp)
-(NotEqual cmp) => (ISELB [6] (MOVDconst [1]) cmp)
-(LessThan cmp) => (ISELB [0] (MOVDconst [1]) cmp)
-(FLessThan cmp) => (ISELB [0] (MOVDconst [1]) cmp)
-(FLessEqual cmp) => (ISEL [2] (MOVDconst [1]) (ISELB [0] (MOVDconst [1]) cmp) cmp)
-(GreaterEqual cmp) => (ISELB [4] (MOVDconst [1]) cmp)
-(GreaterThan cmp) => (ISELB [1] (MOVDconst [1]) cmp)
-(FGreaterThan cmp) => (ISELB [1] (MOVDconst [1]) cmp)
-(FGreaterEqual cmp) => (ISEL [2] (MOVDconst [1]) (ISELB [1] (MOVDconst [1]) cmp) cmp)
-(LessEqual cmp) => (ISELB [5] (MOVDconst [1]) cmp)
-
-(ISELB [0] _ (FlagLT)) => (MOVDconst [1])
-(ISELB [0] _ (Flag(GT|EQ))) => (MOVDconst [0])
-(ISELB [1] _ (FlagGT)) => (MOVDconst [1])
-(ISELB [1] _ (Flag(LT|EQ))) => (MOVDconst [0])
-(ISELB [2] _ (FlagEQ)) => (MOVDconst [1])
-(ISELB [2] _ (Flag(LT|GT))) => (MOVDconst [0])
-(ISELB [4] _ (FlagLT)) => (MOVDconst [0])
-(ISELB [4] _ (Flag(GT|EQ))) => (MOVDconst [1])
-(ISELB [5] _ (FlagGT)) => (MOVDconst [0])
-(ISELB [5] _ (Flag(LT|EQ))) => (MOVDconst [1])
-(ISELB [6] _ (FlagEQ)) => (MOVDconst [0])
-(ISELB [6] _ (Flag(LT|GT))) => (MOVDconst [1])
 
 (ISEL [2] x _ (FlagEQ)) => x
 (ISEL [2] _ y (Flag(LT|GT))) => y
@@ -909,31 +934,30 @@
 
 (ISEL [2] x y ((CMP|CMPW)const [0] (Select0 (ANDCCconst [n] z)))) => (ISEL [2] x y (Select1 <types.TypeFlags> (ANDCCconst [n] z )))
 (ISEL [6] x y ((CMP|CMPW)const [0] (Select0 (ANDCCconst [n] z)))) => (ISEL [6] x y (Select1 <types.TypeFlags> (ANDCCconst [n] z )))
-(ISELB [2] x ((CMP|CMPW)const [0] (Select0 (ANDCCconst [1] z)))) => (XORconst [1] (Select0 <typ.UInt64> (ANDCCconst [1] z )))
-(ISELB [6] x ((CMP|CMPW)const [0] (Select0 (ANDCCconst [1] z)))) => (Select0 <typ.UInt64> (ANDCCconst [1] z ))
+(SETBC [n] (InvertFlags bool)) => (SETBCR [n] bool)
+(SETBCR [n] (InvertFlags bool)) => (SETBC [n] bool)
 
-(ISELB [2] x (CMPWconst [0] (Select0 (ANDCCconst [n] z)))) => (ISELB [2] x (Select1 <types.TypeFlags> (ANDCCconst [n] z )))
-(ISELB [6] x (CMPWconst [0] (Select0 (ANDCCconst [n] z)))) => (ISELB [6] x (Select1 <types.TypeFlags> (ANDCCconst [n] z )))
-
-// Only CMPconst for these in case AND|OR|XOR result is > 32 bits
-(ISELB [2] x (CMPconst [0] a:(AND y z))) && a.Uses == 1 => (ISELB [2] x (Select1 <types.TypeFlags> (ANDCC y z )))
-(ISELB [6] x (CMPconst [0] a:(AND y z))) && a.Uses == 1 => (ISELB [6] x (Select1 <types.TypeFlags> (ANDCC y z )))
-
-(ISELB [2] x (CMPconst [0] o:(OR y z))) && o.Uses == 1 => (ISELB [2] x (Select1 <types.TypeFlags> (ORCC y z )))
-(ISELB [6] x (CMPconst [0] o:(OR y z))) && o.Uses == 1 => (ISELB [6] x (Select1 <types.TypeFlags> (ORCC y z )))
-
-(ISELB [2] x (CMPconst [0] a:(XOR y z))) && a.Uses == 1 => (ISELB [2] x (Select1 <types.TypeFlags> (XORCC y z )))
-(ISELB [6] x (CMPconst [0] a:(XOR y z))) && a.Uses == 1 => (ISELB [6] x (Select1 <types.TypeFlags> (XORCC y z )))
-
-(ISELB [n] (MOVDconst [1]) (InvertFlags bool)) && n%4 == 0 => (ISELB [n+1] (MOVDconst [1]) bool)
-(ISELB [n] (MOVDconst [1]) (InvertFlags bool)) && n%4 == 1 => (ISELB [n-1] (MOVDconst [1]) bool)
-(ISELB [n] (MOVDconst [1]) (InvertFlags bool)) && n%4 == 2 => (ISELB [n] (MOVDconst [1]) bool)
 (ISEL [n] x y (InvertFlags bool)) && n%4 == 0 => (ISEL [n+1] x y bool)
 (ISEL [n] x y (InvertFlags bool)) && n%4 == 1 => (ISEL [n-1] x y bool)
 (ISEL [n] x y (InvertFlags bool)) && n%4 == 2 => (ISEL [n] x y bool)
-(XORconst [1] (ISELB [6] (MOVDconst [1]) cmp)) => (ISELB [2] (MOVDconst [1]) cmp)
-(XORconst [1] (ISELB [5] (MOVDconst [1]) cmp)) => (ISELB [1] (MOVDconst [1]) cmp)
-(XORconst [1] (ISELB [4] (MOVDconst [1]) cmp)) => (ISELB [0] (MOVDconst [1]) cmp)
+(XORconst [1] (SETBCR [n] cmp)) => (SETBC [n] cmp)
+(XORconst [1] (SETBC [n] cmp)) => (SETBCR [n] cmp)
+
+(SETBC [2] ((CMP|CMPW)const [0] (Select0 (ANDCCconst [1] z)))) => (XORconst [1] (Select0 <typ.UInt64> (ANDCCconst [1] z )))
+(SETBCR [2] ((CMP|CMPW)const [0] (Select0 (ANDCCconst [1] z)))) => (Select0 <typ.UInt64> (ANDCCconst [1] z ))
+
+(SETBC [2] (CMPWconst [0] (Select0 (ANDCCconst [n] z)))) => (SETBC [2] (Select1 <types.TypeFlags> (ANDCCconst [n] z )))
+(SETBCR [2] (CMPWconst [0] (Select0 (ANDCCconst [n] z)))) => (SETBCR [2] (Select1 <types.TypeFlags> (ANDCCconst [n] z )))
+
+// Only CMPconst for these in case AND|OR|XOR result is > 32 bits
+(SETBC [2] (CMPconst [0] a:(AND y z))) && a.Uses == 1 => (SETBC [2] (Select1 <types.TypeFlags> (ANDCC y z )))
+(SETBCR [2] (CMPconst [0] a:(AND y z))) && a.Uses == 1 => (SETBCR [2] (Select1 <types.TypeFlags> (ANDCC y z )))
+
+(SETBC [2] (CMPconst [0] o:(OR y z))) && o.Uses == 1 => (SETBC [2] (Select1 <types.TypeFlags> (ORCC y z )))
+(SETBCR [2] (CMPconst [0] o:(OR y z))) && o.Uses == 1 => (SETBCR [2] (Select1 <types.TypeFlags> (ORCC y z )))
+
+(SETBC [2] (CMPconst [0] a:(XOR y z))) && a.Uses == 1 => (SETBC [2] (Select1 <types.TypeFlags> (XORCC y z )))
+(SETBCR [2] (CMPconst [0] a:(XOR y z))) && a.Uses == 1 => (SETBCR [2] (Select1 <types.TypeFlags> (XORCC y z )))
 
 // A particular pattern seen in cgo code:
 (AND (MOVDconst [c]) x:(MOVBZload _ _)) => (Select0 (ANDCCconst [c&0xFF] x))
@@ -945,307 +969,6 @@
 (F(ADD|SUB) (FMUL x y) z) && x.Block.Func.useFMA(v) => (FM(ADD|SUB) x y z)
 (F(ADDS|SUBS) (FMULS x y) z) && x.Block.Func.useFMA(v) => (FM(ADDS|SUBS) x y z)
 
-// The following statements are found in encoding/binary functions UintXX (load) and PutUintXX (store)
-// and convert the statements in these functions from multiple single byte loads or stores to
-// the single largest possible load or store.
-// Some are marked big or little endian based on the order in which the bytes are loaded or stored,
-// not on the ordering of the machine. These are intended for little endian machines.
-// To implement for big endian machines, most rules would have to be duplicated but the
-// resulting rule would be reversed, i. e., MOVHZload on little endian would be MOVHBRload on big endian
-// and vice versa.
-// b[0] | b[1]<<8 => load 16-bit Little endian
-(OR <t> x0:(MOVBZload [i0] {s} p mem)
-	o1:(SL(W|D)const x1:(MOVBZload [i1] {s} p mem) [8]))
-	&& !config.BigEndian
-	&& i1 == i0+1
-	&& x0.Uses ==1 && x1.Uses == 1
-	&& o1.Uses == 1
-	&& mergePoint(b, x0, x1) != nil
-	&& clobber(x0, x1, o1)
-	 => @mergePoint(b,x0,x1) (MOVHZload <t> {s} [i0] p mem)
-
-// b[0]<<8 | b[1] => load 16-bit Big endian on Little endian arch.
-// Use byte-reverse indexed load for 2 bytes.
-(OR <t> x0:(MOVBZload [i1] {s} p mem)
-	o1:(SL(W|D)const x1:(MOVBZload [i0] {s} p mem) [8]))
-	&& !config.BigEndian
-	&& i1 == i0+1
-	&& x0.Uses ==1 && x1.Uses == 1
-	&& o1.Uses == 1
-	&& mergePoint(b, x0, x1) != nil
-	&& clobber(x0, x1, o1)
-	  => @mergePoint(b,x0,x1) (MOVHBRload <t> (MOVDaddr <typ.Uintptr> [i0] {s} p) mem)
-
-// b[0]<<n+8 | b[1]<<n => load 16-bit Big endian (where n%8== 0)
-// Use byte-reverse indexed load for 2 bytes,
-// then shift left to the correct position. Used to match subrules
-// from longer rules.
-(OR <t> s0:(SL(W|D)const x0:(MOVBZload [i1] {s} p mem) [n1])
-	s1:(SL(W|D)const x1:(MOVBZload [i0] {s} p mem) [n2]))
-	&& !config.BigEndian
-	&& i1 == i0+1
-	&& n1%8 == 0
-	&& n2 == n1+8
-	&& x0.Uses == 1 && x1.Uses == 1
-	&& s0.Uses == 1 && s1.Uses == 1
-	&& mergePoint(b, x0, x1) != nil
-	&& clobber(x0, x1, s0, s1)
-	  => @mergePoint(b,x0,x1) (SLDconst <t> (MOVHBRload <t> (MOVDaddr <typ.Uintptr> [i0] {s} p) mem) [n1])
-
-// b[0] | b[1]<<8 | b[2]<<16 | b[3]<<24 => load 32-bit Little endian
-// Use byte-reverse indexed load for 4 bytes.
-(OR <t> s1:(SL(W|D)const x2:(MOVBZload [i3] {s} p mem) [24])
-	o0:(OR <t> s0:(SL(W|D)const x1:(MOVBZload [i2] {s} p mem) [16])
-	x0:(MOVHZload [i0] {s} p mem)))
-	&& !config.BigEndian
-	&& i2 == i0+2
-	&& i3 == i0+3
-	&& x0.Uses ==1 && x1.Uses == 1 && x2.Uses == 1
-	&& o0.Uses == 1
-	&& s0.Uses == 1 && s1.Uses == 1
-	&& mergePoint(b, x0, x1, x2) != nil
-	&& clobber(x0, x1, x2, s0, s1, o0)
-	 => @mergePoint(b,x0,x1,x2) (MOVWZload <t> {s} [i0] p mem)
-
-// b[0]<<24 | b[1]<<16 | b[2]<<8 | b[3] => load 32-bit Big endian order on Little endian arch
-// Use byte-reverse indexed load for 4 bytes with computed address.
-// Could be used to match subrules of a longer rule.
-(OR <t> s1:(SL(W|D)const x2:(MOVBZload [i0] {s} p mem) [24])
-	o0:(OR <t> s0:(SL(W|D)const x1:(MOVBZload [i1] {s} p mem) [16])
-	x0:(MOVHBRload <t> (MOVDaddr <typ.Uintptr> [i2] {s} p) mem)))
-	&& !config.BigEndian
-	&& i1 == i0+1
-	&& i2 == i0+2
-	&& x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1
-	&& o0.Uses == 1
-	&& s0.Uses == 1 && s1.Uses == 1
-	&& mergePoint(b, x0, x1, x2) != nil
-	&& clobber(x0, x1, x2, s0, s1, o0)
-	  => @mergePoint(b,x0,x1,x2) (MOVWBRload <t> (MOVDaddr <typ.Uintptr> [i0] {s} p) mem)
-
-// b[3] | b[2]<<8 | b[1]<<16 | b[0]<<24 => load 32-bit Big endian order on Little endian arch
-// Use byte-reverse indexed load for 4 bytes with computed address.
-// Could be used to match subrules of a longer rule.
-(OR <t> x0:(MOVBZload [i3] {s} p mem)
-	o0:(OR <t> s0:(SL(W|D)const x1:(MOVBZload [i2] {s} p mem) [8])
-	s1:(SL(W|D)const x2:(MOVHBRload <t> (MOVDaddr <typ.Uintptr> [i0] {s} p) mem) [16])))
-	&& !config.BigEndian
-	&& i2 == i0+2
-	&& i3 == i0+3
-	&& x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1
-	&& o0.Uses == 1
-	&& s0.Uses == 1 && s1.Uses == 1
-	&& mergePoint(b, x0, x1, x2) != nil
-	&& clobber(x0, x1, x2, s0, s1, o0)
-	  => @mergePoint(b,x0,x1,x2) (MOVWBRload <t> (MOVDaddr <typ.Uintptr> [i0] {s} p) mem)
-
-// b[0]<<56 | b[1]<<48 | b[2]<<40 | b[3]<<32 => load 32-bit Big endian order on Little endian arch
-// Use byte-reverse indexed load to for 4 bytes with computed address.
-// Used to match longer rules.
-(OR <t> s2:(SLDconst x2:(MOVBZload [i3] {s} p mem) [32])
-	o0:(OR <t> s1:(SLDconst x1:(MOVBZload [i2] {s} p mem) [40])
-	s0:(SLDconst x0:(MOVHBRload <t> (MOVDaddr <typ.Uintptr> [i0] {s} p) mem) [48])))
-	&& !config.BigEndian
-	&& i2 == i0+2
-	&& i3 == i0+3
-	&& x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1
-	&& o0.Uses == 1
-	&& s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1
-	&& mergePoint(b, x0, x1, x2) != nil
-	&& clobber(x0, x1, x2, s0, s1, s2, o0)
-	  => @mergePoint(b,x0,x1,x2) (SLDconst <t> (MOVWBRload <t> (MOVDaddr <typ.Uintptr> [i0] {s} p) mem) [32])
-
-// b[3]<<32 | b[2]<<40 | b[1]<<48 | b[0]<<56 => load 32-bit Big endian order on Little endian arch
-// Use byte-reverse indexed load for 4 bytes with constant address.
-// Used to match longer rules.
-(OR <t> s2:(SLDconst x2:(MOVBZload [i0] {s} p mem) [56])
-        o0:(OR <t> s1:(SLDconst x1:(MOVBZload [i1] {s} p mem) [48])
-        s0:(SLDconst x0:(MOVHBRload <t> (MOVDaddr <typ.Uintptr> [i2] {s} p) mem) [32])))
-        && !config.BigEndian
-        && i1 == i0+1
-        && i2 == i0+2
-        && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1
-        && o0.Uses == 1
-        && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1
-        && mergePoint(b, x0, x1, x2) != nil
-        && clobber(x0, x1, x2, s0, s1, s2, o0)
-          => @mergePoint(b,x0,x1,x2) (SLDconst <t> (MOVWBRload <t> (MOVDaddr <typ.Uintptr> [i0] {s} p) mem) [32])
-
-// b[0] | b[1]<<8 | b[2]<<16 | b[3]<<24 | b[4] <<32 | b[5]<<40 | b[6]<<48 | b[7]<<56 => load 64-bit Little endian
-// Rules with commutative ops and many operands will result in extremely large functions in rewritePPC64,
-// so matching shorter previously defined subrules is important.
-// Offset must be multiple of 4 for MOVD
-(OR <t> s6:(SLDconst x7:(MOVBZload [i7] {s} p mem) [56])
-	o5:(OR <t> s5:(SLDconst x6:(MOVBZload [i6] {s} p mem) [48])
-	o4:(OR <t> s4:(SLDconst x5:(MOVBZload [i5] {s} p mem) [40])
-	o3:(OR <t> s3:(SLDconst x4:(MOVBZload [i4] {s} p mem) [32])
-	x0:(MOVWZload {s} [i0] p mem)))))
-	&& !config.BigEndian
-	&& i4 == i0+4
-	&& i5 == i0+5
-	&& i6 == i0+6
-	&& i7 == i0+7
-	&& x0.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses ==1 && x7.Uses == 1
-	&& o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1
-	&& s3.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1
-	&& mergePoint(b, x0, x4, x5, x6, x7) != nil
-	&& clobber(x0, x4, x5, x6, x7, s3, s4, s5, s6, o3, o4, o5)
-	  => @mergePoint(b,x0,x4,x5,x6,x7) (MOVDload <t> {s} [i0] p mem)
-
-// b[7] | b[6]<<8 | b[5]<<16 | b[4]<<24 | b[3]<<32 | b[2]<<40 | b[1]<<48 | b[0]<<56 load 64-bit Big endian ordered bytes on Little endian arch
-// Use byte-reverse indexed load of 8 bytes.
-// Rules with commutative ops and many operands can result in extremely large functions in rewritePPC64,
-// so matching shorter previously defined subrules is important.
-(OR <t> s0:(SLDconst x0:(MOVBZload [i0] {s} p mem) [56])
-	o0:(OR <t> s1:(SLDconst x1:(MOVBZload [i1] {s} p mem) [48])
-	o1:(OR <t> s2:(SLDconst x2:(MOVBZload [i2] {s} p mem) [40])
-	o2:(OR <t> s3:(SLDconst x3:(MOVBZload [i3] {s} p mem) [32])
-	x4:(MOVWBRload <t> (MOVDaddr <typ.Uintptr> [i4] p) mem)))))
-	&& !config.BigEndian
-	&& i1 == i0+1
-	&& i2 == i0+2
-	&& i3 == i0+3
-	&& i4 == i0+4
-	&& x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1
-	&& o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1
-	&& s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1
-	&& mergePoint(b, x0, x1, x2, x3, x4) != nil
-	&& clobber(x0, x1, x2, x3, x4, o0, o1, o2, s0, s1, s2, s3)
-	  => @mergePoint(b,x0,x1,x2,x3,x4) (MOVDBRload <t> (MOVDaddr <typ.Uintptr> [i0] {s} p) mem)
-
-// b[0]<<56 | b[1]<<48 | b[2]<<40 | b[3]<<32 | b[4]<<24 | b[5]<<16 | b[6]<<8 | b[7] => load 64-bit Big endian ordered bytes on Little endian arch
-// Use byte-reverse indexed load of 8 bytes.
-// Rules with commutative ops and many operands can result in extremely large functions in rewritePPC64,
-// so matching shorter previously defined subrules is important.
-(OR <t> x7:(MOVBZload [i7] {s} p mem)
-	o5:(OR <t> s6:(SLDconst x6:(MOVBZload [i6] {s} p mem) [8])
-	o4:(OR <t> s5:(SLDconst x5:(MOVBZload [i5] {s} p mem) [16])
-	o3:(OR <t> s4:(SLDconst x4:(MOVBZload [i4] {s} p mem) [24])
-	s0:(SL(W|D)const x3:(MOVWBRload <t> (MOVDaddr <typ.Uintptr> [i0] {s} p) mem) [32])))))
-	&& !config.BigEndian
-	&& i4 == i0+4
-	&& i5 == i0+5
-	&& i6 == i0+6
-	&& i7 == i0+7
-	&& x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1
-	&& o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1
-	&& s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1
-	&& mergePoint(b, x3, x4, x5, x6, x7) != nil
-	&& clobber(x3, x4, x5, x6, x7, o3, o4, o5, s0, s4, s5, s6)
-	=> @mergePoint(b,x3,x4,x5,x6,x7) (MOVDBRload <t> (MOVDaddr <typ.Uintptr> [i0] {s} p) mem)
-
-// 2 byte store Little endian as in:
-//      b[0] = byte(v >> 16)
-//      b[1] = byte(v >> 24)
-// Added for use in matching longer rules.
-(MOVBstore [i1] {s} p (SR(W|D)const w [24])
-        x0:(MOVBstore [i0] {s} p (SR(W|D)const w [16]) mem))
-        && !config.BigEndian
-        && x0.Uses == 1
-        && i1 == i0+1
-        && clobber(x0)
-          => (MOVHstore [i0] {s} p (SRWconst <typ.UInt16> w [16]) mem)
-
-// 2 byte store Little endian as in:
-//      b[0] = byte(v)
-//      b[1] = byte(v >> 8)
-(MOVBstore [i1] {s} p (SR(W|D)const w [8])
-	x0:(MOVBstore [i0] {s} p w mem))
-	&& !config.BigEndian
-	&& x0.Uses == 1
-	&& i1 == i0+1
-	&& clobber(x0)
-	  => (MOVHstore [i0] {s} p w mem)
-
-// 4 byte store Little endian as in:
-//     b[0:1] = uint16(v)
-//     b[2:3] = uint16(v >> 16)
-(MOVHstore [i1] {s} p (SR(W|D)const w [16])
-	x0:(MOVHstore [i0] {s} p w mem))
-	&& !config.BigEndian
-	&& x0.Uses == 1
-	&& i1 == i0+2
-	&& clobber(x0)
-	  => (MOVWstore [i0] {s} p w mem)
-
-// 4 byte store Big endian as in:
-//     b[0] = byte(v >> 24)
-//     b[1] = byte(v >> 16)
-//     b[2] = byte(v >> 8)
-//     b[3] = byte(v)
-// Use byte-reverse indexed 4 byte store.
-(MOVBstore [i3] {s} p w
-	x0:(MOVBstore [i2] {s} p (SRWconst w [8])
-	x1:(MOVBstore [i1] {s} p (SRWconst w [16])
-	x2:(MOVBstore [i0] {s} p (SRWconst w [24]) mem))))
-	&& !config.BigEndian
-	&& x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1
-	&& i1 == i0+1 && i2 == i0+2 && i3 == i0+3
-	&& clobber(x0, x1, x2)
-	  => (MOVWBRstore (MOVDaddr <typ.Uintptr> [i0] {s} p) w mem)
-
-// The 2 byte store appears after the 4 byte store so that the
-// match for the 2 byte store is not done first.
-// If the 4 byte store is based on the 2 byte store then there are
-// variations on the MOVDaddr subrule that would require additional
-// rules to be written.
-
-// 2 byte store Big endian as in:
-//      b[0] = byte(v >> 8)
-//      b[1] = byte(v)
-(MOVBstore [i1] {s} p w x0:(MOVBstore [i0] {s} p (SRWconst w [8]) mem))
-	&& !config.BigEndian
-	&& x0.Uses == 1
-	&& i1 == i0+1
-	&& clobber(x0)
-	  => (MOVHBRstore (MOVDaddr <typ.Uintptr> [i0] {s} p) w mem)
-
-// 8 byte store Little endian as in:
-//	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)
-// Built on previously defined rules
-// Offset must be multiple of 4 for MOVDstore
-(MOVBstore [i7] {s} p (SRDconst w [56])
-	x0:(MOVBstore [i6] {s} p (SRDconst w [48])
-	x1:(MOVBstore [i5] {s} p (SRDconst w [40])
-	x2:(MOVBstore [i4] {s} p (SRDconst w [32])
-	x3:(MOVWstore [i0] {s} p w mem)))))
-	&& !config.BigEndian
-	&& x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1
-	&& i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7
-	&& clobber(x0, x1, x2, x3)
-	  => (MOVDstore [i0] {s} p w mem)
-
-// 8 byte store Big endian as in:
-//      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)
-// Use byte-reverse indexed 8 byte store.
-(MOVBstore [i7] {s} p w
-        x0:(MOVBstore [i6] {s} p (SRDconst w [8])
-        x1:(MOVBstore [i5] {s} p (SRDconst w [16])
-        x2:(MOVBstore [i4] {s} p (SRDconst w [24])
-        x3:(MOVBstore [i3] {s} p (SRDconst w [32])
-        x4:(MOVBstore [i2] {s} p (SRDconst w [40])
-        x5:(MOVBstore [i1] {s} p (SRDconst w [48])
-        x6:(MOVBstore [i0] {s} p (SRDconst w [56]) mem))))))))
-        && !config.BigEndian
-        && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1
-        && i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7
-        && clobber(x0, x1, x2, x3, x4, x5, x6)
-          => (MOVDBRstore (MOVDaddr <typ.Uintptr> [i0] {s} p) w mem)
-
 // Arch-specific inlining for small or disjoint runtime.memmove
 (SelectN [0] call:(CALLstatic {sym} s1:(MOVDstore _ (MOVDconst [sz]) s2:(MOVDstore  _ src s3:(MOVDstore {t} _ dst mem)))))
         && sz >= 0
@@ -1272,3 +995,24 @@
 (PrefetchCache ptr mem)          => (DCBT ptr mem [0])
 (PrefetchCacheStreamed ptr mem)  => (DCBT ptr mem [16])
 
+// Use byte reverse instructions on Power10
+(Bswap(16|32|64) x) && buildcfg.GOPPC64>=10 => (BR(H|W|D) x)
+
+// Fold bit reversal into loads.
+(BR(W|H) x:(MOV(W|H)Zload [off] {sym} ptr mem)) && x.Uses == 1 => @x.Block (MOV(W|H)BRload (MOVDaddr <ptr.Type> [off] {sym} ptr) mem)
+(BR(W|H) x:(MOV(W|H)Zloadidx ptr idx      mem)) && x.Uses == 1 => @x.Block (MOV(W|H)Zreg (MOV(W|H)BRloadidx ptr idx mem))
+(BRD x:(MOVDload [off] {sym} ptr mem)) && x.Uses == 1 => @x.Block (MOVDBRload (MOVDaddr <ptr.Type> [off] {sym} ptr) mem)
+(BRD x:(MOVDloadidx ptr idx      mem)) && x.Uses == 1 => @x.Block (MOVDBRloadidx ptr idx mem)
+
+// Fold bit reversal into stores.
+(MOV(D|W|H)store [off] {sym} ptr r:(BR(D|W|H) val) mem) && r.Uses == 1 => (MOV(D|W|H)BRstore (MOVDaddr <ptr.Type> [off] {sym} ptr) val mem)
+(MOV(D|W|H)storeidx ptr idx      r:(BR(D|W|H) val) mem) && r.Uses == 1 => (MOV(D|W|H)BRstoreidx ptr idx val mem)
+
+// GOPPC64<10 rules.
+// These Bswap operations should only be introduced by the memcombine pass in places where they can be folded into loads or stores.
+(Bswap(32|16) x:(MOV(W|H)Zload [off] {sym} ptr mem)) => @x.Block (MOV(W|H)BRload (MOVDaddr <ptr.Type> [off] {sym} ptr) mem)
+(Bswap(32|16) x:(MOV(W|H)Zloadidx ptr idx      mem)) => @x.Block (MOV(W|H)Zreg (MOV(W|H)BRloadidx ptr idx mem))
+(Bswap64 x:(MOVDload [off] {sym} ptr mem)) => @x.Block (MOVDBRload (MOVDaddr <ptr.Type> [off] {sym} ptr) mem)
+(Bswap64 x:(MOVDloadidx ptr idx      mem)) => @x.Block (MOVDBRloadidx ptr idx mem)
+(MOV(D|W|H)store [off] {sym} ptr (Bswap(64|32|16) val) mem) => (MOV(D|W|H)BRstore (MOVDaddr <ptr.Type> [off] {sym} ptr) val mem)
+(MOV(D|W|H)storeidx ptr idx      (Bswap(64|32|16) val) mem) => (MOV(D|W|H)BRstoreidx ptr idx val mem)
diff --git a/src/cmd/compile/internal/ssa/_gen/PPC64Ops.go b/src/cmd/compile/internal/ssa/_gen/PPC64Ops.go
index 2d651dd..4be3623 100644
--- a/src/cmd/compile/internal/ssa/_gen/PPC64Ops.go
+++ b/src/cmd/compile/internal/ssa/_gen/PPC64Ops.go
@@ -295,6 +295,9 @@
 		{name: "XORCC", argLength: 2, reg: gp21, asm: "XORCC", commutative: true, clobberFlags: true, typ: "(Int,Flags)"},   // arg0^arg1 sets CC
 		{name: "EQV", argLength: 2, reg: gp21, asm: "EQV", typ: "Int64", commutative: true},                                 // arg0^^arg1
 		{name: "NEG", argLength: 1, reg: gp11, asm: "NEG"},                                                                  // -arg0 (integer)
+		{name: "BRD", argLength: 1, reg: gp11, asm: "BRD"},                                                                  // reversebytes64(arg0)
+		{name: "BRW", argLength: 1, reg: gp11, asm: "BRW"},                                                                  // reversebytes32(arg0)
+		{name: "BRH", argLength: 1, reg: gp11, asm: "BRH"},                                                                  // reversebytes16(arg0)
 		{name: "FNEG", argLength: 1, reg: fp11, asm: "FNEG"},                                                                // -arg0 (floating point)
 		{name: "FSQRT", argLength: 1, reg: fp11, asm: "FSQRT"},                                                              // sqrt(arg0) (floating point)
 		{name: "FSQRTS", argLength: 1, reg: fp11, asm: "FSQRTS"},                                                            // sqrt(arg0) (floating point, single precision)
@@ -328,9 +331,9 @@
 		// Load bytes in reverse endian order of the arch from arg0 into a 64 bit register, all zero extend.
 		// The generated instructions are indexed loads with no offset field in the instruction so the aux fields are not used.
 		// In these cases the index register field is set to 0 and the full address is in the base register.
-		{name: "MOVDBRload", argLength: 2, reg: gpload, asm: "MOVDBR", aux: "SymOff", typ: "Int64", faultOnNilArg0: true, symEffect: "Read"}, // load 8 bytes reverse order
-		{name: "MOVWBRload", argLength: 2, reg: gpload, asm: "MOVWBR", aux: "SymOff", typ: "Int32", faultOnNilArg0: true, symEffect: "Read"}, // load 4 bytes zero extend reverse order
-		{name: "MOVHBRload", argLength: 2, reg: gpload, asm: "MOVHBR", aux: "SymOff", typ: "Int16", faultOnNilArg0: true, symEffect: "Read"}, // load 2 bytes zero extend reverse order
+		{name: "MOVDBRload", argLength: 2, reg: gpload, asm: "MOVDBR", typ: "UInt64", faultOnNilArg0: true}, // load 8 bytes reverse order
+		{name: "MOVWBRload", argLength: 2, reg: gpload, asm: "MOVWBR", typ: "UInt32", faultOnNilArg0: true}, // load 4 bytes zero extend reverse order
+		{name: "MOVHBRload", argLength: 2, reg: gpload, asm: "MOVHBR", typ: "UInt16", faultOnNilArg0: true}, // load 2 bytes zero extend reverse order
 
 		// In these cases an index register is used in addition to a base register
 		// Loads from memory location arg[0] + arg[1].
@@ -352,9 +355,9 @@
 
 		// Store bytes in the reverse endian order of the arch into arg0.
 		// These are indexed stores with no offset field in the instruction so the auxint fields are not used.
-		{name: "MOVDBRstore", argLength: 3, reg: gpstore, asm: "MOVDBR", aux: "Sym", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"}, // store 8 bytes reverse order
-		{name: "MOVWBRstore", argLength: 3, reg: gpstore, asm: "MOVWBR", aux: "Sym", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"}, // store 4 bytes reverse order
-		{name: "MOVHBRstore", argLength: 3, reg: gpstore, asm: "MOVHBR", aux: "Sym", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"}, // store 2 bytes reverse order
+		{name: "MOVDBRstore", argLength: 3, reg: gpstore, asm: "MOVDBR", typ: "Mem", faultOnNilArg0: true}, // store 8 bytes reverse order
+		{name: "MOVWBRstore", argLength: 3, reg: gpstore, asm: "MOVWBR", typ: "Mem", faultOnNilArg0: true}, // store 4 bytes reverse order
+		{name: "MOVHBRstore", argLength: 3, reg: gpstore, asm: "MOVHBR", typ: "Mem", faultOnNilArg0: true}, // store 2 bytes reverse order
 
 		// Floating point loads from arg0+aux+auxint
 		{name: "FMOVDload", argLength: 2, reg: fpload, asm: "FMOVD", aux: "SymOff", typ: "Float64", faultOnNilArg0: true, symEffect: "Read"}, // load double float
@@ -405,14 +408,17 @@
 		{name: "CMPWUconst", argLength: 1, reg: gp1cr, asm: "CMPWU", aux: "Int32", typ: "Flags"},
 
 		// ISEL  arg2 ? arg0 : arg1
-		// ISELB arg1 ? arg0 : $0. arg0 is some register holding $1.
 		// ISELZ arg1 ? arg0 : $0
 		// auxInt values 0=LT 1=GT 2=EQ 3=SO (summary overflow/unordered) 4=GE 5=LE 6=NE 7=NSO (not summary overflow/not unordered)
 		// Note, auxInt^4 inverts the comparison condition. For example, LT^4 becomes GE, and "ISEL [a] x y z" is equivalent to ISEL [a^4] y x z".
 		{name: "ISEL", argLength: 3, reg: crgp21, asm: "ISEL", aux: "Int32", typ: "Int32"},
-		{name: "ISELB", argLength: 2, reg: crgp11, asm: "ISEL", aux: "Int32", typ: "Int32"},
 		{name: "ISELZ", argLength: 2, reg: crgp11, asm: "ISEL", aux: "Int32"},
 
+		// SETBC auxInt values 0=LT 1=GT 2=EQ     (CRbit=1)? 1 : 0
+		{name: "SETBC", argLength: 1, reg: crgp, asm: "SETBC", aux: "Int32", typ: "Int32"},
+		// SETBCR auxInt values 0=LT 1=GT 2=EQ     (CRbit=1)? 0 : 1
+		{name: "SETBCR", argLength: 1, reg: crgp, asm: "SETBCR", aux: "Int32", typ: "Int32"},
+
 		// pseudo-ops
 		{name: "Equal", argLength: 1, reg: crgp},         // bool, true flags encode x==y false otherwise.
 		{name: "NotEqual", argLength: 1, reg: crgp},      // bool, true flags encode x!=y false otherwise.
@@ -430,8 +436,8 @@
 		// use of the closure pointer.
 		{name: "LoweredGetClosurePtr", reg: regInfo{outputs: []regMask{ctxt}}, zeroWidth: true},
 
-		// LoweredGetCallerSP returns the SP of the caller of the current function.
-		{name: "LoweredGetCallerSP", reg: gp01, rematerializeable: true},
+		// LoweredGetCallerSP returns the SP of the caller of the current function. arg0=mem.
+		{name: "LoweredGetCallerSP", argLength: 1, reg: gp01, rematerializeable: true},
 
 		// LoweredGetCallerPC evaluates to the PC to which its "caller" will return.
 		// I.e., if f calls g "calls" getcallerpc,
@@ -675,10 +681,11 @@
 		{name: "LoweredAtomicOr8", argLength: 3, reg: gpstore, asm: "OR", faultOnNilArg0: true, hasSideEffects: true},
 		{name: "LoweredAtomicOr32", argLength: 3, reg: gpstore, asm: "OR", faultOnNilArg0: true, hasSideEffects: true},
 
-		// LoweredWB invokes runtime.gcWriteBarrier. arg0=destptr, arg1=srcptr, arg2=mem, aux=runtime.gcWriteBarrier
-		// It preserves R0 through R17 (except special registers R1, R2, R11, R12, R13), g, and its arguments R20 and R21,
+		// LoweredWB invokes runtime.gcWriteBarrier. arg0=mem, auxint=# of buffer entries needed
+		// It preserves R0 through R17 (except special registers R1, R2, R11, R12, R13), g, and R20 and R21,
 		// but may clobber anything else, including R31 (REGTMP).
-		{name: "LoweredWB", argLength: 3, reg: regInfo{inputs: []regMask{buildReg("R20"), buildReg("R21")}, clobbers: (callerSave &^ buildReg("R0 R3 R4 R5 R6 R7 R8 R9 R10 R14 R15 R16 R17 R20 R21 g")) | buildReg("R31")}, clobberFlags: true, aux: "Sym", symEffect: "None"},
+		// Returns a pointer to a write barrier buffer in R29.
+		{name: "LoweredWB", argLength: 1, reg: regInfo{clobbers: (callerSave &^ buildReg("R0 R3 R4 R5 R6 R7 R8 R9 R10 R14 R15 R16 R17 R20 R21 g")) | buildReg("R31"), outputs: []regMask{buildReg("R29")}}, clobberFlags: true, aux: "Int64"},
 
 		{name: "LoweredPubBarrier", argLength: 1, asm: "LWSYNC", hasSideEffects: true}, // Do data barrier. arg0=memory
 		// There are three of these functions so that they can have three different register inputs.
diff --git a/src/cmd/compile/internal/ssa/_gen/PPC64latelower.rules b/src/cmd/compile/internal/ssa/_gen/PPC64latelower.rules
index ada97b2..00d898f 100644
--- a/src/cmd/compile/internal/ssa/_gen/PPC64latelower.rules
+++ b/src/cmd/compile/internal/ssa/_gen/PPC64latelower.rules
@@ -8,3 +8,12 @@
 (ISEL [a] x (MOVDconst [0]) z) => (ISELZ [a] x z)
 // Simplify ISEL $0 y z into ISELZ by inverting comparison and reversing arguments.
 (ISEL [a] (MOVDconst [0]) y z) => (ISELZ [a^0x4] y z)
+
+// SETBC, SETBCR is supported on ISA 3.1(Power10) and newer, use ISELZ for
+// older targets
+(SETBC [2] cmp) && buildcfg.GOPPC64 <= 9 => (ISELZ [2] (MOVDconst [1]) cmp)
+(SETBCR [2] cmp) && buildcfg.GOPPC64 <= 9 => (ISELZ [6] (MOVDconst [1]) cmp)
+(SETBC [0] cmp) && buildcfg.GOPPC64 <= 9 => (ISELZ [0] (MOVDconst [1]) cmp)
+(SETBCR [0] cmp) && buildcfg.GOPPC64 <= 9 => (ISELZ [4] (MOVDconst [1]) cmp)
+(SETBC [1] cmp) && buildcfg.GOPPC64 <= 9 => (ISELZ [1] (MOVDconst [1]) cmp)
+(SETBCR [1] cmp) && buildcfg.GOPPC64 <= 9 => (ISELZ [5] (MOVDconst [1]) cmp)
diff --git a/src/cmd/compile/internal/ssa/_gen/README b/src/cmd/compile/internal/ssa/_gen/README
index 0c7ceba..74b81c2 100644
--- a/src/cmd/compile/internal/ssa/_gen/README
+++ b/src/cmd/compile/internal/ssa/_gen/README
@@ -2,6 +2,10 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-This package generates opcode tables, rewrite rules, etc. for the ssa compiler.
-Run it with go-1.13 (or above):
-   go run .
+This command generates Go code (in the parent directory) for all
+the architecture-specific opcodes, blocks, and rewrites. See the
+"Hacking on SSA" section in the parent directory's README.md for
+more information.
+
+To regenerate everything, run "go generate" on the ssa package
+in the parent directory.
diff --git a/src/cmd/compile/internal/ssa/_gen/RISCV64.rules b/src/cmd/compile/internal/ssa/_gen/RISCV64.rules
index 59f71be..9a6fceb 100644
--- a/src/cmd/compile/internal/ssa/_gen/RISCV64.rules
+++ b/src/cmd/compile/internal/ssa/_gen/RISCV64.rules
@@ -282,24 +282,24 @@
 (Neq32F ...) => (FNES ...)
 
 // Loads
-(Load <t> ptr mem) &&  t.IsBoolean()                  => (MOVBUload ptr mem)
-(Load <t> ptr mem) && ( is8BitInt(t) &&  isSigned(t)) => (MOVBload  ptr mem)
-(Load <t> ptr mem) && ( is8BitInt(t) && !isSigned(t)) => (MOVBUload ptr mem)
-(Load <t> ptr mem) && (is16BitInt(t) &&  isSigned(t)) => (MOVHload  ptr mem)
-(Load <t> ptr mem) && (is16BitInt(t) && !isSigned(t)) => (MOVHUload ptr mem)
-(Load <t> ptr mem) && (is32BitInt(t) &&  isSigned(t)) => (MOVWload  ptr mem)
-(Load <t> ptr mem) && (is32BitInt(t) && !isSigned(t)) => (MOVWUload ptr mem)
-(Load <t> ptr mem) && (is64BitInt(t) || isPtr(t))     => (MOVDload  ptr mem)
-(Load <t> ptr mem) &&  is32BitFloat(t)                => (FMOVWload ptr mem)
-(Load <t> ptr mem) &&  is64BitFloat(t)                => (FMOVDload ptr mem)
+(Load <t> ptr mem) &&  t.IsBoolean()                   => (MOVBUload ptr mem)
+(Load <t> ptr mem) && ( is8BitInt(t) &&  t.IsSigned()) => (MOVBload  ptr mem)
+(Load <t> ptr mem) && ( is8BitInt(t) && !t.IsSigned()) => (MOVBUload ptr mem)
+(Load <t> ptr mem) && (is16BitInt(t) &&  t.IsSigned()) => (MOVHload  ptr mem)
+(Load <t> ptr mem) && (is16BitInt(t) && !t.IsSigned()) => (MOVHUload ptr mem)
+(Load <t> ptr mem) && (is32BitInt(t) &&  t.IsSigned()) => (MOVWload  ptr mem)
+(Load <t> ptr mem) && (is32BitInt(t) && !t.IsSigned()) => (MOVWUload ptr mem)
+(Load <t> ptr mem) && (is64BitInt(t) || isPtr(t))      => (MOVDload  ptr mem)
+(Load <t> ptr mem) &&  is32BitFloat(t)                 => (FMOVWload ptr mem)
+(Load <t> ptr mem) &&  is64BitFloat(t)                 => (FMOVDload ptr mem)
 
 // Stores
 (Store {t} ptr val mem) && t.Size() == 1 => (MOVBstore ptr val mem)
 (Store {t} ptr val mem) && t.Size() == 2 => (MOVHstore ptr val mem)
-(Store {t} ptr val mem) && t.Size() == 4 && !is32BitFloat(val.Type) => (MOVWstore ptr val mem)
-(Store {t} ptr val mem) && t.Size() == 8 && !is64BitFloat(val.Type) => (MOVDstore ptr val mem)
-(Store {t} ptr val mem) && t.Size() == 4 &&  is32BitFloat(val.Type) => (FMOVWstore ptr val mem)
-(Store {t} ptr val mem) && t.Size() == 8 &&  is64BitFloat(val.Type) => (FMOVDstore ptr val mem)
+(Store {t} ptr val mem) && t.Size() == 4 && !t.IsFloat() => (MOVWstore ptr val mem)
+(Store {t} ptr val mem) && t.Size() == 8 && !t.IsFloat() => (MOVDstore ptr val mem)
+(Store {t} ptr val mem) && t.Size() == 4 &&  t.IsFloat() => (FMOVWstore ptr val mem)
+(Store {t} ptr val mem) && t.Size() == 8 &&  t.IsFloat() => (FMOVDstore ptr val mem)
 
 // We need to fold MOVaddr into the LD/MOVDstore ops so that the live variable analysis
 // knows what variables are being read/written by the ops.
@@ -547,7 +547,8 @@
 (ConstBool [val]) => (MOVDconst [int64(b2i(val))])
 
 (Addr {sym} base) => (MOVaddr {sym} [0] base)
-(LocalAddr {sym} base _) => (MOVaddr {sym} base)
+(LocalAddr <t> {sym} base mem) && t.Elem().HasPointers() => (MOVaddr {sym} (SPanchored base mem))
+(LocalAddr <t> {sym} base _)  && !t.Elem().HasPointers() => (MOVaddr {sym} base)
 
 // Calls
 (StaticCall  ...) => (CALLstatic  ...)
@@ -756,7 +757,7 @@
 (MOVDnop (MOVDconst [c])) => (MOVDconst [c])
 
 // Fold constant into immediate instructions where possible.
-(ADD (MOVDconst [val]) x) && is32Bit(val) => (ADDI [val] x)
+(ADD (MOVDconst <t> [val]) x) && is32Bit(val) && !t.IsPtr() => (ADDI [val] x)
 (AND (MOVDconst [val]) x) && is32Bit(val) => (ANDI [val] x)
 (OR  (MOVDconst [val]) x) && is32Bit(val) => (ORI  [val] x)
 (XOR (MOVDconst [val]) x) && is32Bit(val) => (XORI [val] x)
@@ -835,11 +836,11 @@
 //
 // Key:
 //
-//   [+ -](x * y) [+ -] z.
-//    _ N          A S
-//                 D U
-//                 D B
+//   [+ -](x * y [+ -] z).
+//    _ N         A S
+//                D U
+//                D B
 //
 // Note: multiplication commutativity handled by rule generator.
-(F(MADD|NMADD|MSUB|NMSUB)D neg:(FNEGD x) y z) && neg.Uses == 1 => (F(NMADD|MADD|NMSUB|MSUB)D x y z)
+(F(MADD|NMADD|MSUB|NMSUB)D neg:(FNEGD x) y z) && neg.Uses == 1 => (F(NMSUB|MSUB|NMADD|MADD)D x y z)
 (F(MADD|NMADD|MSUB|NMSUB)D x y neg:(FNEGD z)) && neg.Uses == 1 => (F(MSUB|NMSUB|MADD|NMADD)D x y z)
diff --git a/src/cmd/compile/internal/ssa/_gen/RISCV64Ops.go b/src/cmd/compile/internal/ssa/_gen/RISCV64Ops.go
index 09b1620..52e87cb 100644
--- a/src/cmd/compile/internal/ssa/_gen/RISCV64Ops.go
+++ b/src/cmd/compile/internal/ssa/_gen/RISCV64Ops.go
@@ -169,7 +169,7 @@
 		{name: "REMW", argLength: 2, reg: gp21, asm: "REMW", typ: "Int32"},
 		{name: "REMUW", argLength: 2, reg: gp21, asm: "REMUW", typ: "UInt32"},
 
-		{name: "MOVaddr", argLength: 1, reg: gp11sb, asm: "MOV", aux: "SymOff", rematerializeable: true, symEffect: "RdWr"}, // arg0 + auxint + offset encoded in aux
+		{name: "MOVaddr", argLength: 1, reg: gp11sb, asm: "MOV", aux: "SymOff", rematerializeable: true, symEffect: "Addr"}, // arg0 + auxint + offset encoded in aux
 		// auxint+aux == add auxint and the offset of the symbol in aux (if any) to the effective address
 
 		{name: "MOVDconst", reg: gp01, asm: "MOV", typ: "UInt64", aux: "Int64", rematerializeable: true}, // auxint
@@ -379,8 +379,8 @@
 		{name: "LoweredNilCheck", argLength: 2, faultOnNilArg0: true, nilCheck: true, reg: regInfo{inputs: []regMask{gpspMask}}}, // arg0=ptr,arg1=mem, returns void.  Faults if ptr is nil.
 		{name: "LoweredGetClosurePtr", reg: regInfo{outputs: []regMask{regCtxt}}},                                                // scheduler ensures only at beginning of entry block
 
-		// LoweredGetCallerSP returns the SP of the caller of the current function.
-		{name: "LoweredGetCallerSP", reg: gp01, rematerializeable: true},
+		// LoweredGetCallerSP returns the SP of the caller of the current function. arg0=mem.
+		{name: "LoweredGetCallerSP", argLength: 1, reg: gp01, rematerializeable: true},
 
 		// LoweredGetCallerPC evaluates to the PC to which its "caller" will return.
 		// I.e., if f calls g "calls" getcallerpc,
@@ -388,11 +388,12 @@
 		// See runtime/stubs.go for a more detailed discussion.
 		{name: "LoweredGetCallerPC", reg: gp01, rematerializeable: true},
 
-		// LoweredWB invokes runtime.gcWriteBarrier. arg0=destptr, arg1=srcptr, arg2=mem, aux=runtime.gcWriteBarrier
+		// LoweredWB invokes runtime.gcWriteBarrier. arg0=mem, auxint=# of buffer entries needed
 		// It saves all GP registers if necessary,
 		// but clobbers RA (LR) because it's a call
 		// and T6 (REG_TMP).
-		{name: "LoweredWB", argLength: 3, reg: regInfo{inputs: []regMask{regNamed["X5"], regNamed["X6"]}, clobbers: (callerSave &^ (gpMask | regNamed["g"])) | regNamed["X1"]}, clobberFlags: true, aux: "Sym", symEffect: "None"},
+		// Returns a pointer to a write barrier buffer in X24.
+		{name: "LoweredWB", argLength: 1, reg: regInfo{clobbers: (callerSave &^ (gpMask | regNamed["g"])) | regNamed["X1"], outputs: []regMask{regNamed["X24"]}}, clobberFlags: true, aux: "Int64"},
 
 		// There are three of these functions so that they can have three different register inputs.
 		// When we check 0 <= c <= cap (A), then 0 <= b <= c (B), then 0 <= a <= b (C), we want the
diff --git a/src/cmd/compile/internal/ssa/_gen/S390X.rules b/src/cmd/compile/internal/ssa/_gen/S390X.rules
index e9becb2..a9d62c7 100644
--- a/src/cmd/compile/internal/ssa/_gen/S390X.rules
+++ b/src/cmd/compile/internal/ssa/_gen/S390X.rules
@@ -336,22 +336,20 @@
 
 // Lowering loads
 (Load <t> ptr mem) && (is64BitInt(t) || isPtr(t)) => (MOVDload ptr mem)
-(Load <t> ptr mem) && is32BitInt(t) && isSigned(t) => (MOVWload ptr mem)
-(Load <t> ptr mem) && is32BitInt(t) && !isSigned(t) => (MOVWZload ptr mem)
-(Load <t> ptr mem) && is16BitInt(t) && isSigned(t) => (MOVHload ptr mem)
-(Load <t> ptr mem) && is16BitInt(t) && !isSigned(t) => (MOVHZload ptr mem)
-(Load <t> ptr mem) && is8BitInt(t) && isSigned(t) => (MOVBload ptr mem)
-(Load <t> ptr mem) && (t.IsBoolean() || (is8BitInt(t) && !isSigned(t))) => (MOVBZload ptr mem)
+(Load <t> ptr mem) && is32BitInt(t) &&  t.IsSigned() => (MOVWload ptr mem)
+(Load <t> ptr mem) && is32BitInt(t) && !t.IsSigned() => (MOVWZload ptr mem)
+(Load <t> ptr mem) && is16BitInt(t) &&  t.IsSigned() => (MOVHload ptr mem)
+(Load <t> ptr mem) && is16BitInt(t) && !t.IsSigned() => (MOVHZload ptr mem)
+(Load <t> ptr mem) && is8BitInt(t)  &&  t.IsSigned() => (MOVBload ptr mem)
+(Load <t> ptr mem) && (t.IsBoolean() || (is8BitInt(t) && !t.IsSigned())) => (MOVBZload ptr mem)
 (Load <t> ptr mem) && is32BitFloat(t) => (FMOVSload ptr mem)
 (Load <t> ptr mem) && is64BitFloat(t) => (FMOVDload ptr mem)
 
 // Lowering stores
-// These more-specific FP versions of Store pattern should come first.
-(Store {t} ptr val mem) && t.Size() == 8 && is64BitFloat(val.Type) => (FMOVDstore ptr val mem)
-(Store {t} ptr val mem) && t.Size() == 4 && is32BitFloat(val.Type) => (FMOVSstore ptr val mem)
-
-(Store {t} ptr val mem) && t.Size() == 8 => (MOVDstore ptr val mem)
-(Store {t} ptr val mem) && t.Size() == 4 => (MOVWstore ptr val mem)
+(Store {t} ptr val mem) && t.Size() == 8 &&  t.IsFloat() => (FMOVDstore ptr val mem)
+(Store {t} ptr val mem) && t.Size() == 4 &&  t.IsFloat() => (FMOVSstore ptr val mem)
+(Store {t} ptr val mem) && t.Size() == 8 && !t.IsFloat() => (MOVDstore ptr val mem)
+(Store {t} ptr val mem) && t.Size() == 4 && !t.IsFloat() => (MOVWstore ptr val mem)
 (Store {t} ptr val mem) && t.Size() == 2 => (MOVHstore ptr val mem)
 (Store {t} ptr val mem) && t.Size() == 1 => (MOVBstore ptr val mem)
 
@@ -446,7 +444,8 @@
 (GetCallerSP ...) => (LoweredGetCallerSP ...)
 (GetCallerPC ...) => (LoweredGetCallerPC ...)
 (Addr {sym} base) => (MOVDaddr {sym} base)
-(LocalAddr {sym} base _) => (MOVDaddr {sym} base)
+(LocalAddr <t> {sym} base mem) && t.Elem().HasPointers() => (MOVDaddr {sym} (SPanchored base mem))
+(LocalAddr <t> {sym} base _)  && !t.Elem().HasPointers() => (MOVDaddr {sym} base)
 (ITab (Load ptr mem)) => (MOVDload ptr mem)
 
 // block rewrites
@@ -631,7 +630,7 @@
 (BRC {c} (CMPWUconst x [y]) yes no) && y == int32( int8(y)) && (c == s390x.Equal || c == s390x.LessOrGreater) => (CIJ   {c} x [ int8(y)] yes no)
 
 // Fold constants into instructions.
-(ADD x (MOVDconst [c])) && is32Bit(c) => (ADDconst [int32(c)] x)
+(ADD x (MOVDconst <t> [c])) && is32Bit(c) && !t.IsPtr() => (ADDconst [int32(c)] x)
 (ADDW x (MOVDconst [c])) => (ADDWconst [int32(c)] x)
 
 (SUB x (MOVDconst [c])) && is32Bit(c) => (SUBconst x [int32(c)])
@@ -1295,365 +1294,6 @@
   && clobber(g)
   => ((ADD|SUB|MULL|AND|OR|XOR)Wload <t> [off] {sym} x ptr mem)
 
-// Combine constant stores into larger (unaligned) stores.
-// Avoid SB because constant stores to relative offsets are
-// emulated by the assembler and also can't handle unaligned offsets.
-(MOVBstoreconst [c] {s} p x:(MOVBstoreconst [a] {s} p mem))
-  && p.Op != OpSB
-  && x.Uses == 1
-  && a.Off() + 1 == c.Off()
-  && clobber(x)
-  => (MOVHstoreconst [makeValAndOff(c.Val()&0xff | a.Val()<<8, a.Off())] {s} p mem)
-(MOVHstoreconst [c] {s} p x:(MOVHstoreconst [a] {s} p mem))
-  && p.Op != OpSB
-  && x.Uses == 1
-  && a.Off() + 2 == c.Off()
-  && clobber(x)
-  => (MOVWstore [a.Off()] {s} p (MOVDconst [int64(c.Val()&0xffff | a.Val()<<16)]) mem)
-(MOVWstoreconst [c] {s} p x:(MOVWstoreconst [a] {s} p mem))
-  && p.Op != OpSB
-  && x.Uses == 1
-  && a.Off() + 4 == c.Off()
-  && clobber(x)
-  => (MOVDstore [a.Off()] {s} p (MOVDconst [c.Val64()&0xffffffff | a.Val64()<<32]) mem)
-
-// Combine stores into larger (unaligned) stores.
-// It doesn't work on global data (based on SB) because stores with relative addressing
-// require that the memory operand be aligned.
-(MOVBstore [i] {s} p w x:(MOVBstore [i-1] {s} p (SRDconst [8] w) mem))
-  && p.Op != OpSB
-  && x.Uses == 1
-  && clobber(x)
-  => (MOVHstore [i-1] {s} p w mem)
-(MOVBstore [i] {s} p w0:(SRDconst [j] w) x:(MOVBstore [i-1] {s} p (SRDconst [j+8] w) mem))
-  && p.Op != OpSB
-  && x.Uses == 1
-  && clobber(x)
-  => (MOVHstore [i-1] {s} p w0 mem)
-(MOVBstore [i] {s} p w x:(MOVBstore [i-1] {s} p (SRWconst [8] w) mem))
-  && p.Op != OpSB
-  && x.Uses == 1
-  && clobber(x)
-  => (MOVHstore [i-1] {s} p w mem)
-(MOVBstore [i] {s} p w0:(SRWconst [j] w) x:(MOVBstore [i-1] {s} p (SRWconst [j+8] w) mem))
-  && p.Op != OpSB
-  && x.Uses == 1
-  && clobber(x)
-  => (MOVHstore [i-1] {s} p w0 mem)
-(MOVHstore [i] {s} p w x:(MOVHstore [i-2] {s} p (SRDconst [16] w) mem))
-  && p.Op != OpSB
-  && x.Uses == 1
-  && clobber(x)
-  => (MOVWstore [i-2] {s} p w mem)
-(MOVHstore [i] {s} p w0:(SRDconst [j] w) x:(MOVHstore [i-2] {s} p (SRDconst [j+16] w) mem))
-  && p.Op != OpSB
-  && x.Uses == 1
-  && clobber(x)
-  => (MOVWstore [i-2] {s} p w0 mem)
-(MOVHstore [i] {s} p w x:(MOVHstore [i-2] {s} p (SRWconst [16] w) mem))
-  && p.Op != OpSB
-  && x.Uses == 1
-  && clobber(x)
-  => (MOVWstore [i-2] {s} p w mem)
-(MOVHstore [i] {s} p w0:(SRWconst [j] w) x:(MOVHstore [i-2] {s} p (SRWconst [j+16] w) mem))
-  && p.Op != OpSB
-  && x.Uses == 1
-  && clobber(x)
-  => (MOVWstore [i-2] {s} p w0 mem)
-(MOVWstore [i] {s} p (SRDconst [32] w) x:(MOVWstore [i-4] {s} p w mem))
-  && p.Op != OpSB
-  && x.Uses == 1
-  && clobber(x)
-  => (MOVDstore [i-4] {s} p w mem)
-(MOVWstore [i] {s} p w0:(SRDconst [j] w) x:(MOVWstore [i-4] {s} p (SRDconst [j+32] w) mem))
-  && p.Op != OpSB
-  && x.Uses == 1
-  && clobber(x)
-  => (MOVDstore [i-4] {s} p w0 mem)
-
-// Combine stores into larger (unaligned) stores with the bytes reversed (little endian).
-// Store-with-bytes-reversed instructions do not support relative memory addresses,
-// so these stores can't operate on global data (SB).
-(MOVBstore [i] {s} p (SRDconst [8] w) x:(MOVBstore [i-1] {s} p w mem))
-  && p.Op != OpSB
-  && x.Uses == 1
-  && clobber(x)
-  => (MOVHBRstore [i-1] {s} p w mem)
-(MOVBstore [i] {s} p (SRDconst [j] w) x:(MOVBstore [i-1] {s} p w0:(SRDconst [j-8] w) mem))
-  && p.Op != OpSB
-  && x.Uses == 1
-  && clobber(x)
-  => (MOVHBRstore [i-1] {s} p w0 mem)
-(MOVBstore [i] {s} p (SRWconst [8] w) x:(MOVBstore [i-1] {s} p w mem))
-  && p.Op != OpSB
-  && x.Uses == 1
-  && clobber(x)
-  => (MOVHBRstore [i-1] {s} p w mem)
-(MOVBstore [i] {s} p (SRWconst [j] w) x:(MOVBstore [i-1] {s} p w0:(SRWconst [j-8] w) mem))
-  && p.Op != OpSB
-  && x.Uses == 1
-  && clobber(x)
-  => (MOVHBRstore [i-1] {s} p w0 mem)
-(MOVHBRstore [i] {s} p (SRDconst [16] w) x:(MOVHBRstore [i-2] {s} p w mem))
-  && x.Uses == 1
-  && clobber(x)
-  => (MOVWBRstore [i-2] {s} p w mem)
-(MOVHBRstore [i] {s} p (SRDconst [j] w) x:(MOVHBRstore [i-2] {s} p w0:(SRDconst [j-16] w) mem))
-  && x.Uses == 1
-  && clobber(x)
-  => (MOVWBRstore [i-2] {s} p w0 mem)
-(MOVHBRstore [i] {s} p (SRWconst [16] w) x:(MOVHBRstore [i-2] {s} p w mem))
-  && x.Uses == 1
-  && clobber(x)
-  => (MOVWBRstore [i-2] {s} p w mem)
-(MOVHBRstore [i] {s} p (SRWconst [j] w) x:(MOVHBRstore [i-2] {s} p w0:(SRWconst [j-16] w) mem))
-  && x.Uses == 1
-  && clobber(x)
-  => (MOVWBRstore [i-2] {s} p w0 mem)
-(MOVWBRstore [i] {s} p (SRDconst [32] w) x:(MOVWBRstore [i-4] {s} p w mem))
-  && x.Uses == 1
-  && clobber(x)
-  => (MOVDBRstore [i-4] {s} p w mem)
-(MOVWBRstore [i] {s} p (SRDconst [j] w) x:(MOVWBRstore [i-4] {s} p w0:(SRDconst [j-32] w) mem))
-  && x.Uses == 1
-  && clobber(x)
-  => (MOVDBRstore [i-4] {s} p w0 mem)
-
-(MOVBstore [7] {s} p1 (SRDconst w)
-  x1:(MOVHBRstore [5] {s} p1 (SRDconst w)
-  x2:(MOVWBRstore [1] {s} p1 (SRDconst w)
-  x3:(MOVBstore [0] {s} p1 w mem))))
-  && x1.Uses == 1
-  && x2.Uses == 1
-  && x3.Uses == 1
-  && clobber(x1, x2, x3)
-  => (MOVDBRstore {s} p1 w mem)
-
-// Combining byte loads into larger (unaligned) loads.
-
-// Big-endian loads
-
-(ORW                 x1:(MOVBZload [i1] {s} p mem)
-    sh:(SLWconst [8] x0:(MOVBZload [i0] {s} p mem)))
-  && i1 == i0+1
-  && p.Op != OpSB
-  && x0.Uses == 1
-  && x1.Uses == 1
-  && sh.Uses == 1
-  && mergePoint(b,x0,x1) != nil
-  && clobber(x0, x1, sh)
-  => @mergePoint(b,x0,x1) (MOVHZload [i0] {s} p mem)
-
-(OR                  x1:(MOVBZload [i1] {s} p mem)
-    sh:(SLDconst [8] x0:(MOVBZload [i0] {s} p mem)))
-  && i1 == i0+1
-  && p.Op != OpSB
-  && x0.Uses == 1
-  && x1.Uses == 1
-  && sh.Uses == 1
-  && mergePoint(b,x0,x1) != nil
-  && clobber(x0, x1, sh)
-  => @mergePoint(b,x0,x1) (MOVHZload [i0] {s} p mem)
-
-(ORW                  x1:(MOVHZload [i1] {s} p mem)
-    sh:(SLWconst [16] x0:(MOVHZload [i0] {s} p mem)))
-  && i1 == i0+2
-  && p.Op != OpSB
-  && x0.Uses == 1
-  && x1.Uses == 1
-  && sh.Uses == 1
-  && mergePoint(b,x0,x1) != nil
-  && clobber(x0, x1, sh)
-  => @mergePoint(b,x0,x1) (MOVWZload [i0] {s} p mem)
-
-(OR                   x1:(MOVHZload [i1] {s} p mem)
-    sh:(SLDconst [16] x0:(MOVHZload [i0] {s} p mem)))
-  && i1 == i0+2
-  && p.Op != OpSB
-  && x0.Uses == 1
-  && x1.Uses == 1
-  && sh.Uses == 1
-  && mergePoint(b,x0,x1) != nil
-  && clobber(x0, x1, sh)
-  => @mergePoint(b,x0,x1) (MOVWZload [i0] {s} p mem)
-
-(OR                   x1:(MOVWZload [i1] {s} p mem)
-    sh:(SLDconst [32] x0:(MOVWZload [i0] {s} p mem)))
-  && i1 == i0+4
-  && p.Op != OpSB
-  && x0.Uses == 1
-  && x1.Uses == 1
-  && sh.Uses == 1
-  && mergePoint(b,x0,x1) != nil
-  && clobber(x0, x1, sh)
-  => @mergePoint(b,x0,x1) (MOVDload [i0] {s} p mem)
-
-(ORW
-    s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem))
-    or:(ORW
-        s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem))
-	y))
-  && i1 == i0+1
-  && j1 == j0-8
-  && j1 % 16 == 0
-  && x0.Uses == 1
-  && x1.Uses == 1
-  && s0.Uses == 1
-  && s1.Uses == 1
-  && or.Uses == 1
-  && mergePoint(b,x0,x1,y) != nil
-  && clobber(x0, x1, s0, s1, or)
-  => @mergePoint(b,x0,x1,y) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y)
-
-(OR
-    s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem))
-    or:(OR
-        s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem))
-	y))
-  && i1 == i0+1
-  && j1 == j0-8
-  && j1 % 16 == 0
-  && x0.Uses == 1
-  && x1.Uses == 1
-  && s0.Uses == 1
-  && s1.Uses == 1
-  && or.Uses == 1
-  && mergePoint(b,x0,x1,y) != nil
-  && clobber(x0, x1, s0, s1, or)
-  => @mergePoint(b,x0,x1,y) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y)
-
-(OR
-    s0:(SLDconst [j0] x0:(MOVHZload [i0] {s} p mem))
-    or:(OR
-        s1:(SLDconst [j1] x1:(MOVHZload [i1] {s} p mem))
-	y))
-  && i1 == i0+2
-  && j1 == j0-16
-  && j1 % 32 == 0
-  && x0.Uses == 1
-  && x1.Uses == 1
-  && s0.Uses == 1
-  && s1.Uses == 1
-  && or.Uses == 1
-  && mergePoint(b,x0,x1,y) != nil
-  && clobber(x0, x1, s0, s1, or)
-  => @mergePoint(b,x0,x1,y) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZload [i0] {s} p mem)) y)
-
-// Little-endian loads
-
-(ORW                 x0:(MOVBZload [i0] {s} p mem)
-    sh:(SLWconst [8] x1:(MOVBZload [i1] {s} p mem)))
-  && p.Op != OpSB
-  && i1 == i0+1
-  && x0.Uses == 1
-  && x1.Uses == 1
-  && sh.Uses == 1
-  && mergePoint(b,x0,x1) != nil
-  && clobber(x0, x1, sh)
-  => @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRload [i0] {s} p mem))
-
-(OR                  x0:(MOVBZload [i0] {s} p mem)
-    sh:(SLDconst [8] x1:(MOVBZload [i1] {s} p mem)))
-  && p.Op != OpSB
-  && i1 == i0+1
-  && x0.Uses == 1
-  && x1.Uses == 1
-  && sh.Uses == 1
-  && mergePoint(b,x0,x1) != nil
-  && clobber(x0, x1, sh)
-  => @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRload [i0] {s} p mem))
-
-(ORW                  r0:(MOVHZreg x0:(MOVHBRload [i0] {s} p mem))
-    sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRload [i1] {s} p mem))))
-  && i1 == i0+2
-  && x0.Uses == 1
-  && x1.Uses == 1
-  && r0.Uses == 1
-  && r1.Uses == 1
-  && sh.Uses == 1
-  && mergePoint(b,x0,x1) != nil
-  && clobber(x0, x1, r0, r1, sh)
-  => @mergePoint(b,x0,x1) (MOVWBRload [i0] {s} p mem)
-
-(OR                   r0:(MOVHZreg x0:(MOVHBRload [i0] {s} p mem))
-    sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRload [i1] {s} p mem))))
-  && i1 == i0+2
-  && x0.Uses == 1
-  && x1.Uses == 1
-  && r0.Uses == 1
-  && r1.Uses == 1
-  && sh.Uses == 1
-  && mergePoint(b,x0,x1) != nil
-  && clobber(x0, x1, r0, r1, sh)
-  => @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRload [i0] {s} p mem))
-
-(OR                   r0:(MOVWZreg x0:(MOVWBRload [i0] {s} p mem))
-    sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRload [i1] {s} p mem))))
-  && i1 == i0+4
-  && x0.Uses == 1
-  && x1.Uses == 1
-  && r0.Uses == 1
-  && r1.Uses == 1
-  && sh.Uses == 1
-  && mergePoint(b,x0,x1) != nil
-  && clobber(x0, x1, r0, r1, sh)
-  => @mergePoint(b,x0,x1) (MOVDBRload [i0] {s} p mem)
-
-(ORW
-    s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem))
-    or:(ORW
-        s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem))
-	y))
-  && p.Op != OpSB
-  && i1 == i0+1
-  && j1 == j0+8
-  && j0 % 16 == 0
-  && x0.Uses == 1
-  && x1.Uses == 1
-  && s0.Uses == 1
-  && s1.Uses == 1
-  && or.Uses == 1
-  && mergePoint(b,x0,x1,y) != nil
-  && clobber(x0, x1, s0, s1, or)
-  => @mergePoint(b,x0,x1,y) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y)
-
-(OR
-    s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem))
-    or:(OR
-        s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem))
-	y))
-  && p.Op != OpSB
-  && i1 == i0+1
-  && j1 == j0+8
-  && j0 % 16 == 0
-  && x0.Uses == 1
-  && x1.Uses == 1
-  && s0.Uses == 1
-  && s1.Uses == 1
-  && or.Uses == 1
-  && mergePoint(b,x0,x1,y) != nil
-  && clobber(x0, x1, s0, s1, or)
-  => @mergePoint(b,x0,x1,y) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y)
-
-(OR
-    s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRload [i1] {s} p mem)))
-    or:(OR
-        s0:(SLDconst [j0] r0:(MOVHZreg x0:(MOVHBRload [i0] {s} p mem)))
-	y))
-  && i1 == i0+2
-  && j1 == j0+16
-  && j0 % 32 == 0
-  && x0.Uses == 1
-  && x1.Uses == 1
-  && r0.Uses == 1
-  && r1.Uses == 1
-  && s0.Uses == 1
-  && s1.Uses == 1
-  && or.Uses == 1
-  && mergePoint(b,x0,x1,y) != nil
-  && clobber(x0, x1, r0, r1, s0, s1, or)
-  => @mergePoint(b,x0,x1,y) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRload [i0] {s} p mem))) y)
-
 // Combine stores into store multiples.
 // 32-bit
 (MOVWstore [i] {s} p w1 x:(MOVWstore [i-4] {s} p w0 mem))
@@ -1702,3 +1342,19 @@
 
 // Convert 32-bit store multiples into 64-bit stores.
 (STM2 [i] {s} p (SRDconst [32] x) x mem) => (MOVDstore [i] {s} p x mem)
+
+// Fold bit reversal into loads.
+(MOVWBR x:(MOVWZload    [off] {sym} ptr     mem)) && x.Uses == 1 => @x.Block (MOVWZreg (MOVWBRload    [off] {sym} ptr     mem)) // need zero extension?
+(MOVWBR x:(MOVWZloadidx [off] {sym} ptr idx mem)) && x.Uses == 1 => @x.Block (MOVWZreg (MOVWBRloadidx [off] {sym} ptr idx mem)) // need zero extension?
+(MOVDBR x:(MOVDload     [off] {sym} ptr     mem)) && x.Uses == 1 => @x.Block (MOVDBRload    [off] {sym} ptr     mem)
+(MOVDBR x:(MOVDloadidx  [off] {sym} ptr idx mem)) && x.Uses == 1 => @x.Block (MOVDBRloadidx [off] {sym} ptr idx mem)
+
+// Fold bit reversal into stores.
+(MOV(D|W)store    [off] {sym} ptr     r:(MOV(D|W)BR x) mem) && r.Uses == 1 => (MOV(D|W)BRstore    [off] {sym} ptr     x mem)
+(MOV(D|W)storeidx [off] {sym} ptr idx r:(MOV(D|W)BR x) mem) && r.Uses == 1 => (MOV(D|W)BRstoreidx [off] {sym} ptr idx x mem)
+
+// Special bswap16 rules
+(Bswap16 x:(MOVHZload    [off] {sym} ptr     mem)) => @x.Block (MOVHZreg (MOVHBRload    [off] {sym} ptr     mem))
+(Bswap16 x:(MOVHZloadidx [off] {sym} ptr idx mem)) => @x.Block (MOVHZreg (MOVHBRloadidx [off] {sym} ptr idx mem))
+(MOVHstore    [off] {sym} ptr     (Bswap16 val) mem) => (MOVHBRstore    [off] {sym} ptr     val mem)
+(MOVHstoreidx [off] {sym} ptr idx (Bswap16 val) mem) => (MOVHBRstoreidx [off] {sym} ptr idx val mem)
diff --git a/src/cmd/compile/internal/ssa/_gen/S390XOps.go b/src/cmd/compile/internal/ssa/_gen/S390XOps.go
index 896fdaa..c4766c1 100644
--- a/src/cmd/compile/internal/ssa/_gen/S390XOps.go
+++ b/src/cmd/compile/internal/ssa/_gen/S390XOps.go
@@ -130,6 +130,7 @@
 		r1         = buildReg("R1")
 		r2         = buildReg("R2")
 		r3         = buildReg("R3")
+		r9         = buildReg("R9")
 	)
 	// Common slices of register masks
 	var (
@@ -418,8 +419,8 @@
 		{name: "LEDBR", argLength: 1, reg: fp11, asm: "LEDBR"}, // convert float64 to float32
 		{name: "LDEBR", argLength: 1, reg: fp11, asm: "LDEBR"}, // convert float32 to float64
 
-		{name: "MOVDaddr", argLength: 1, reg: addr, aux: "SymOff", rematerializeable: true, symEffect: "Read"}, // arg0 + auxint + offset encoded in aux
-		{name: "MOVDaddridx", argLength: 2, reg: addridx, aux: "SymOff", symEffect: "Read"},                    // arg0 + arg1 + auxint + aux
+		{name: "MOVDaddr", argLength: 1, reg: addr, aux: "SymOff", rematerializeable: true, symEffect: "Addr"}, // arg0 + auxint + offset encoded in aux
+		{name: "MOVDaddridx", argLength: 2, reg: addridx, aux: "SymOff", symEffect: "Addr"},                    // arg0 + arg1 + auxint + aux
 
 		// auxint+aux == add auxint and the offset of the symbol in aux (if any) to the effective address
 		{name: "MOVBZload", argLength: 2, reg: gpload, asm: "MOVBZ", aux: "SymOff", typ: "UInt8", faultOnNilArg0: true, symEffect: "Read"},  // load byte from arg0+auxint+aux. arg1=mem.  Zero extend.
@@ -492,8 +493,8 @@
 		// use of R12 (the closure pointer)
 		{name: "LoweredGetClosurePtr", reg: regInfo{outputs: []regMask{buildReg("R12")}}, zeroWidth: true},
 		// arg0=ptr,arg1=mem, returns void.  Faults if ptr is nil.
-		// LoweredGetCallerSP returns the SP of the caller of the current function.
-		{name: "LoweredGetCallerSP", reg: gp01, rematerializeable: true},
+		// LoweredGetCallerSP returns the SP of the caller of the current function. arg0=mem.
+		{name: "LoweredGetCallerSP", argLength: 1, reg: gp01, rematerializeable: true},
 		// LoweredGetCallerPC evaluates to the PC to which its "caller" will return.
 		// I.e., if f calls g "calls" getcallerpc,
 		// the result should be the PC within f that g will return to.
@@ -504,11 +505,12 @@
 		{name: "LoweredRound32F", argLength: 1, reg: fp11, resultInArg0: true, zeroWidth: true},
 		{name: "LoweredRound64F", argLength: 1, reg: fp11, resultInArg0: true, zeroWidth: true},
 
-		// LoweredWB invokes runtime.gcWriteBarrier. arg0=destptr, arg1=srcptr, arg2=mem, aux=runtime.gcWriteBarrier
+		// LoweredWB invokes runtime.gcWriteBarrier. arg0=mem, aux=# of buffer entries needed
 		// It saves all GP registers if necessary,
 		// but clobbers R14 (LR) because it's a call,
 		// and also clobbers R1 as the PLT stub does.
-		{name: "LoweredWB", argLength: 3, reg: regInfo{inputs: []regMask{buildReg("R2"), buildReg("R3")}, clobbers: (callerSave &^ gpg) | buildReg("R14") | r1}, clobberFlags: true, aux: "Sym", symEffect: "None"},
+		// Returns a pointer to a write barrier buffer in R9.
+		{name: "LoweredWB", argLength: 1, reg: regInfo{clobbers: (callerSave &^ gpg) | buildReg("R14") | r1, outputs: []regMask{r9}}, clobberFlags: true, aux: "Int64"},
 
 		// There are three of these functions so that they can have three different register inputs.
 		// When we check 0 <= c <= cap (A), then 0 <= b <= c (B), then 0 <= a <= b (C), we want the
diff --git a/src/cmd/compile/internal/ssa/_gen/Wasm.rules b/src/cmd/compile/internal/ssa/_gen/Wasm.rules
index a9ed82e..91a9fc5 100644
--- a/src/cmd/compile/internal/ssa/_gen/Wasm.rules
+++ b/src/cmd/compile/internal/ssa/_gen/Wasm.rules
@@ -304,7 +304,8 @@
 (GetCallerPC ...) => (LoweredGetCallerPC ...)
 (GetCallerSP ...) => (LoweredGetCallerSP ...)
 (Addr {sym} base) => (LoweredAddr {sym} [0] base)
-(LocalAddr {sym} base _) => (LoweredAddr {sym} base)
+(LocalAddr <t> {sym} base mem) && t.Elem().HasPointers() => (LoweredAddr {sym} (SPanchored base mem))
+(LocalAddr <t> {sym} base _)  && !t.Elem().HasPointers() => (LoweredAddr {sym} base)
 
 // Write barrier.
 (WB ...) => (LoweredWB ...)
@@ -371,7 +372,7 @@
 (I64LeU (I64Const [1]) x) => (I64Eqz (I64Eqz x))
 (I64Ne x (I64Const [0])) => (I64Eqz (I64Eqz x))
 
-(I64Add x (I64Const [y])) => (I64AddConst [y] x)
+(I64Add x (I64Const <t> [y])) && !t.IsPtr() => (I64AddConst [y] x)
 (I64AddConst [0] x) => x
 (I64Eqz (I64Eqz (I64Eqz x))) => (I64Eqz x)
 
diff --git a/src/cmd/compile/internal/ssa/_gen/WasmOps.go b/src/cmd/compile/internal/ssa/_gen/WasmOps.go
index cd127b5..45bbed5 100644
--- a/src/cmd/compile/internal/ssa/_gen/WasmOps.go
+++ b/src/cmd/compile/internal/ssa/_gen/WasmOps.go
@@ -131,9 +131,9 @@
 
 		{name: "LoweredGetClosurePtr", reg: gp01},                                                                          // returns wasm.REG_CTXT, the closure pointer
 		{name: "LoweredGetCallerPC", reg: gp01, rematerializeable: true},                                                   // returns the PC of the caller of the current function
-		{name: "LoweredGetCallerSP", reg: gp01, rematerializeable: true},                                                   // returns the SP of the caller of the current function
+		{name: "LoweredGetCallerSP", argLength: 1, reg: gp01, rematerializeable: true},                                     // returns the SP of the caller of the current function. arg0=mem.
 		{name: "LoweredNilCheck", argLength: 2, reg: regInfo{inputs: []regMask{gp}}, nilCheck: true, faultOnNilArg0: true}, // panic if arg0 is nil. arg1=mem
-		{name: "LoweredWB", argLength: 3, reg: regInfo{inputs: []regMask{gp, gp}}, aux: "Sym", symEffect: "None"},          // invokes runtime.gcWriteBarrier. arg0=destptr, arg1=srcptr, arg2=mem, aux=runtime.gcWriteBarrier
+		{name: "LoweredWB", argLength: 1, reg: regInfo{clobbers: callerSave, outputs: []regMask{gp}}, aux: "Int64"},        // invokes runtime.gcWriteBarrier{auxint}. arg0=mem, auxint=# of buffer entries needed. Returns a pointer to a write barrier buffer.
 
 		// LoweredConvert converts between pointers and integers.
 		// We have a special op for this so as to not confuse GCCallOff
diff --git a/src/cmd/compile/internal/ssa/_gen/allocators.go b/src/cmd/compile/internal/ssa/_gen/allocators.go
index 0f3968c..5c72fe8 100644
--- a/src/cmd/compile/internal/ssa/_gen/allocators.go
+++ b/src/cmd/compile/internal/ssa/_gen/allocators.go
@@ -23,6 +23,12 @@
 	maxLog   int    // log_2 of maximum allocation size
 }
 
+type derived struct {
+	name string // name for alloc/free functions
+	typ  string // the type they return/accept
+	base string // underlying allocator
+}
+
 func genAllocators() {
 	allocators := []allocator{
 		{
@@ -36,66 +42,16 @@
 			maxLog:   32,
 		},
 		{
-			name:     "BlockSlice",
-			typ:      "[]*Block",
+			name:     "Int64Slice",
+			typ:      "[]int64",
 			capacity: "cap(%s)",
-			mak:      "make([]*Block, %s)",
-			resize:   "%s[:%s]",
-			clear:    "for i := range %[1]s {\n%[1]s[i] = nil\n}",
-			minLog:   5,
-			maxLog:   32,
-		},
-		{
-			name:     "BoolSlice",
-			typ:      "[]bool",
-			capacity: "cap(%s)",
-			mak:      "make([]bool, %s)",
-			resize:   "%s[:%s]",
-			clear:    "for i := range %[1]s {\n%[1]s[i] = false\n}",
-			minLog:   8,
-			maxLog:   32,
-		},
-		{
-			name:     "IntSlice",
-			typ:      "[]int",
-			capacity: "cap(%s)",
-			mak:      "make([]int, %s)",
+			mak:      "make([]int64, %s)",
 			resize:   "%s[:%s]",
 			clear:    "for i := range %[1]s {\n%[1]s[i] = 0\n}",
 			minLog:   5,
 			maxLog:   32,
 		},
 		{
-			name:     "Int32Slice",
-			typ:      "[]int32",
-			capacity: "cap(%s)",
-			mak:      "make([]int32, %s)",
-			resize:   "%s[:%s]",
-			clear:    "for i := range %[1]s {\n%[1]s[i] = 0\n}",
-			minLog:   6,
-			maxLog:   32,
-		},
-		{
-			name:     "Int8Slice",
-			typ:      "[]int8",
-			capacity: "cap(%s)",
-			mak:      "make([]int8, %s)",
-			resize:   "%s[:%s]",
-			clear:    "for i := range %[1]s {\n%[1]s[i] = 0\n}",
-			minLog:   8,
-			maxLog:   32,
-		},
-		{
-			name:     "IDSlice",
-			typ:      "[]ID",
-			capacity: "cap(%s)",
-			mak:      "make([]ID, %s)",
-			resize:   "%s[:%s]",
-			clear:    "for i := range %[1]s {\n%[1]s[i] = 0\n}",
-			minLog:   6,
-			maxLog:   32,
-		},
-		{
 			name:     "SparseSet",
 			typ:      "*sparseSet",
 			capacity: "%s.cap()",
@@ -126,19 +82,61 @@
 			maxLog:   32,
 		},
 	}
+	deriveds := []derived{
+		{
+			name: "BlockSlice",
+			typ:  "[]*Block",
+			base: "ValueSlice",
+		},
+		{
+			name: "IntSlice",
+			typ:  "[]int",
+			base: "Int64Slice",
+		},
+		{
+			name: "Int32Slice",
+			typ:  "[]int32",
+			base: "Int64Slice",
+		},
+		{
+			name: "Int8Slice",
+			typ:  "[]int8",
+			base: "Int64Slice",
+		},
+		{
+			name: "BoolSlice",
+			typ:  "[]bool",
+			base: "Int64Slice",
+		},
+		{
+			name: "IDSlice",
+			typ:  "[]ID",
+			base: "Int64Slice",
+		},
+	}
 
 	w := new(bytes.Buffer)
-	fmt.Fprintf(w, "// Code generated from _gen/allocators.go; DO NOT EDIT.\n")
+	fmt.Fprintf(w, "// Code generated from _gen/allocators.go using 'go generate'; DO NOT EDIT.\n")
 	fmt.Fprintln(w)
 	fmt.Fprintln(w, "package ssa")
 
 	fmt.Fprintln(w, "import (")
+	fmt.Fprintln(w, "\"internal/unsafeheader\"")
 	fmt.Fprintln(w, "\"math/bits\"")
 	fmt.Fprintln(w, "\"sync\"")
+	fmt.Fprintln(w, "\"unsafe\"")
 	fmt.Fprintln(w, ")")
 	for _, a := range allocators {
 		genAllocator(w, a)
 	}
+	for _, d := range deriveds {
+		for _, base := range allocators {
+			if base.name == d.base {
+				genDerived(w, d, base)
+				break
+			}
+		}
+	}
 	// gofmt result
 	b := w.Bytes()
 	var err error
@@ -196,3 +194,32 @@
 	}
 	fmt.Fprintf(w, "}\n")
 }
+func genDerived(w io.Writer, d derived, base allocator) {
+	fmt.Fprintf(w, "func (c *Cache) alloc%s(n int) %s {\n", d.name, d.typ)
+	if d.typ[:2] != "[]" || base.typ[:2] != "[]" {
+		panic(fmt.Sprintf("bad derived types: %s %s", d.typ, base.typ))
+	}
+	fmt.Fprintf(w, "var base %s\n", base.typ[2:])
+	fmt.Fprintf(w, "var derived %s\n", d.typ[2:])
+	fmt.Fprintf(w, "if unsafe.Sizeof(base)%%unsafe.Sizeof(derived) != 0 { panic(\"bad\") }\n")
+	fmt.Fprintf(w, "scale := unsafe.Sizeof(base)/unsafe.Sizeof(derived)\n")
+	fmt.Fprintf(w, "b := c.alloc%s(int((uintptr(n)+scale-1)/scale))\n", base.name)
+	fmt.Fprintf(w, "s := unsafeheader.Slice {\n")
+	fmt.Fprintf(w, "  Data: unsafe.Pointer(&b[0]),\n")
+	fmt.Fprintf(w, "  Len: n,\n")
+	fmt.Fprintf(w, "  Cap: cap(b)*int(scale),\n")
+	fmt.Fprintf(w, "  }\n")
+	fmt.Fprintf(w, "return *(*%s)(unsafe.Pointer(&s))\n", d.typ)
+	fmt.Fprintf(w, "}\n")
+	fmt.Fprintf(w, "func (c *Cache) free%s(s %s) {\n", d.name, d.typ)
+	fmt.Fprintf(w, "var base %s\n", base.typ[2:])
+	fmt.Fprintf(w, "var derived %s\n", d.typ[2:])
+	fmt.Fprintf(w, "scale := unsafe.Sizeof(base)/unsafe.Sizeof(derived)\n")
+	fmt.Fprintf(w, "b := unsafeheader.Slice {\n")
+	fmt.Fprintf(w, "  Data: unsafe.Pointer(&s[0]),\n")
+	fmt.Fprintf(w, "  Len: int((uintptr(len(s))+scale-1)/scale),\n")
+	fmt.Fprintf(w, "  Cap: int((uintptr(cap(s))+scale-1)/scale),\n")
+	fmt.Fprintf(w, "  }\n")
+	fmt.Fprintf(w, "c.free%s(*(*%s)(unsafe.Pointer(&b)))\n", base.name, base.typ)
+	fmt.Fprintf(w, "}\n")
+}
diff --git a/src/cmd/compile/internal/ssa/_gen/generic.rules b/src/cmd/compile/internal/ssa/_gen/generic.rules
index 0406fbb..cdb3463 100644
--- a/src/cmd/compile/internal/ssa/_gen/generic.rules
+++ b/src/cmd/compile/internal/ssa/_gen/generic.rules
@@ -176,6 +176,10 @@
 // Convert x * -1 to -x.
 (Mul(8|16|32|64)  (Const(8|16|32|64)  [-1]) x) => (Neg(8|16|32|64)  x)
 
+// DeMorgan's Laws
+(And(8|16|32|64) <t> (Com(8|16|32|64) x) (Com(8|16|32|64) y)) => (Com(8|16|32|64) (Or(8|16|32|64) <t> x y))
+(Or(8|16|32|64) <t> (Com(8|16|32|64) x) (Com(8|16|32|64) y)) => (Com(8|16|32|64) (And(8|16|32|64) <t> x y))
+
 // Convert multiplication by a power of two to a shift.
 (Mul8  <t> n (Const8  [c])) && isPowerOfTwo8(c) => (Lsh8x64  <t> n (Const64 <typ.UInt64> [log8(c)]))
 (Mul16 <t> n (Const16 [c])) && isPowerOfTwo16(c) => (Lsh16x64 <t> n (Const64 <typ.UInt64> [log16(c)]))
@@ -518,8 +522,17 @@
 (Leq32 (Const32 [0]) (Rsh32Ux64 _ (Const64 [c]))) && c > 0 => (ConstBool [true])
 (Leq64 (Const64 [0]) (Rsh64Ux64 _ (Const64 [c]))) && c > 0 => (ConstBool [true])
 
+// prefer equalities with zero
 (Less(64|32|16|8) (Const(64|32|16|8) <t> [0]) x) && isNonNegative(x) => (Neq(64|32|16|8) (Const(64|32|16|8) <t> [0]) x)
 (Less(64|32|16|8) x (Const(64|32|16|8) <t> [1])) && isNonNegative(x) => (Eq(64|32|16|8) (Const(64|32|16|8) <t> [0]) x)
+(Less(64|32|16|8)U x (Const(64|32|16|8) <t> [1])) => (Eq(64|32|16|8) (Const(64|32|16|8) <t> [0]) x)
+(Leq(64|32|16|8)U (Const(64|32|16|8) <t> [1]) x) => (Neq(64|32|16|8) (Const(64|32|16|8) <t> [0]) x)
+
+// prefer comparisons with zero
+(Less(64|32|16|8) x (Const(64|32|16|8) <t> [1])) => (Leq(64|32|16|8) x (Const(64|32|16|8) <t> [0]))
+(Leq(64|32|16|8) x (Const(64|32|16|8) <t> [-1])) => (Less(64|32|16|8) x (Const(64|32|16|8) <t> [0]))
+(Leq(64|32|16|8) (Const(64|32|16|8) <t> [1]) x) => (Less(64|32|16|8) (Const(64|32|16|8) <t> [0]) x)
+(Less(64|32|16|8) (Const(64|32|16|8) <t> [-1]) x) => (Leq(64|32|16|8) (Const(64|32|16|8) <t> [0]) x)
 
 // constant floating point comparisons
 (Eq32F   (Const32F [c]) (Const32F [d])) => (ConstBool [c == d])
@@ -564,6 +577,16 @@
 (Sub(64|32|16|8) (Com(64|32|16|8) x) (Neg(64|32|16|8) x)) => (Const(64|32|16|8) [-1])
 (Add(64|32|16|8) (Com(64|32|16|8) x)                  x)  => (Const(64|32|16|8) [-1])
 
+// Simplification when involving common integer
+// (t + x) - (t + y) == x - y
+// (t + x) - (y + t) == x - y
+// (x + t) - (y + t) == x - y
+// (x + t) - (t + y) == x - y
+// (x - t) + (t + y) == x + y
+// (x - t) + (y + t) == x + y
+(Sub(64|32|16|8) (Add(64|32|16|8) t x) (Add(64|32|16|8) t y)) => (Sub(64|32|16|8) x y)
+(Add(64|32|16|8) (Sub(64|32|16|8) x t) (Add(64|32|16|8) t y)) => (Add(64|32|16|8) x y)
+
 // ^(x-1) == ^x+1 == -x
 (Add(64|32|16|8) (Const(64|32|16|8) [1]) (Com(64|32|16|8) x)) => (Neg(64|32|16|8) x)
 (Com(64|32|16|8) (Add(64|32|16|8) (Const(64|32|16|8) [-1]) x)) => (Neg(64|32|16|8) x)
@@ -2042,6 +2065,10 @@
 	&& warnRule(fe.Debug_checknil(), v, "removed nil check")
 	=> (Invalid)
 
+// Addresses of globals are always non-nil.
+(NilCheck          (Addr {_} (SB))    _) => (Invalid)
+(NilCheck (Convert (Addr {_} (SB)) _) _) => (Invalid)
+
 // for late-expanded calls, recognize memequal applied to a single constant byte
 // Support is limited by 1, 2, 4, 8 byte sizes
 (StaticLECall {callAux} sptr (Addr {scon} (SB)) (Const64 [1]) mem)
@@ -2049,24 +2076,65 @@
   && symIsRO(scon)
   => (MakeResult (Eq8 (Load <typ.Int8> sptr mem) (Const8 <typ.Int8> [int8(read8(scon,0))])) mem)
 
+(StaticLECall {callAux} (Addr {scon} (SB)) sptr (Const64 [1]) mem)
+  && isSameCall(callAux, "runtime.memequal")
+  && symIsRO(scon)
+  => (MakeResult (Eq8 (Load <typ.Int8> sptr mem) (Const8 <typ.Int8> [int8(read8(scon,0))])) mem)
+
 (StaticLECall {callAux} sptr (Addr {scon} (SB)) (Const64 [2]) mem)
   && isSameCall(callAux, "runtime.memequal")
   && symIsRO(scon)
   && canLoadUnaligned(config)
   => (MakeResult (Eq16 (Load <typ.Int16> sptr mem) (Const16 <typ.Int16> [int16(read16(scon,0,config.ctxt.Arch.ByteOrder))])) mem)
 
+(StaticLECall {callAux} (Addr {scon} (SB)) sptr (Const64 [2]) mem)
+  && isSameCall(callAux, "runtime.memequal")
+  && symIsRO(scon)
+  && canLoadUnaligned(config)
+  => (MakeResult (Eq16 (Load <typ.Int16> sptr mem) (Const16 <typ.Int16> [int16(read16(scon,0,config.ctxt.Arch.ByteOrder))])) mem)
+
 (StaticLECall {callAux} sptr (Addr {scon} (SB)) (Const64 [4]) mem)
   && isSameCall(callAux, "runtime.memequal")
   && symIsRO(scon)
   && canLoadUnaligned(config)
   => (MakeResult (Eq32 (Load <typ.Int32> sptr mem) (Const32 <typ.Int32> [int32(read32(scon,0,config.ctxt.Arch.ByteOrder))])) mem)
 
+(StaticLECall {callAux} (Addr {scon} (SB)) sptr (Const64 [4]) mem)
+  && isSameCall(callAux, "runtime.memequal")
+  && symIsRO(scon)
+  && canLoadUnaligned(config)
+  => (MakeResult (Eq32 (Load <typ.Int32> sptr mem) (Const32 <typ.Int32> [int32(read32(scon,0,config.ctxt.Arch.ByteOrder))])) mem)
+
 (StaticLECall {callAux} sptr (Addr {scon} (SB)) (Const64 [8]) mem)
   && isSameCall(callAux, "runtime.memequal")
   && symIsRO(scon)
   && canLoadUnaligned(config) && config.PtrSize == 8
   => (MakeResult (Eq64 (Load <typ.Int64> sptr mem) (Const64 <typ.Int64> [int64(read64(scon,0,config.ctxt.Arch.ByteOrder))])) mem)
 
+(StaticLECall {callAux} (Addr {scon} (SB)) sptr (Const64 [8]) mem)
+  && isSameCall(callAux, "runtime.memequal")
+  && symIsRO(scon)
+  && canLoadUnaligned(config) && config.PtrSize == 8
+  => (MakeResult (Eq64 (Load <typ.Int64> sptr mem) (Const64 <typ.Int64> [int64(read64(scon,0,config.ctxt.Arch.ByteOrder))])) mem)
+
+(StaticLECall {callAux} _ _ (Const64 [0]) mem)
+  && isSameCall(callAux, "runtime.memequal")
+  => (MakeResult (ConstBool <typ.Bool> [true]) mem)
+
+// Turn known-size calls to memclrNoHeapPointers into a Zero.
+// Note that we are using types.Types[types.TUINT8] instead of sptr.Type.Elem() - see issue 55122 and CL 431496 for more details.
+(SelectN [0] call:(StaticCall {sym} sptr (Const(64|32) [c]) mem))
+  && isInlinableMemclr(config, int64(c))
+  && isSameCall(sym, "runtime.memclrNoHeapPointers")
+  && call.Uses == 1
+  && clobber(call)
+  => (Zero {types.Types[types.TUINT8]} [int64(c)] sptr mem)
+
+// Recognise make([]T, 0) and replace it with a pointer to the zerobase
+(StaticLECall {callAux} _ (Const(64|32) [0]) (Const(64|32) [0]) mem)
+	&& isSameCall(callAux, "runtime.makeslice")
+	=> (MakeResult (Addr <v.Type.FieldType(0)> {ir.Syms.Zerobase} (SB)) mem)
+
 // Evaluate constant address comparisons.
 (EqPtr  x x) => (ConstBool [true])
 (NeqPtr x x) => (ConstBool [false])
@@ -2088,6 +2156,8 @@
 (NeqPtr (OffPtr [o1] p1) (OffPtr [o2] p2)) && isSamePtr(p1, p2) => (ConstBool [o1 != o2])
 (EqPtr  (Const(32|64) [c]) (Const(32|64) [d])) => (ConstBool [c == d])
 (NeqPtr (Const(32|64) [c]) (Const(32|64) [d])) => (ConstBool [c != d])
+(EqPtr  (Convert (Addr {x} _) _) (Addr {y} _)) => (ConstBool [x==y])
+(NeqPtr (Convert (Addr {x} _) _) (Addr {y} _)) => (ConstBool [x!=y])
 
 (EqPtr  (LocalAddr _ _) (Addr _)) => (ConstBool [false])
 (EqPtr  (OffPtr (LocalAddr _ _)) (Addr _)) => (ConstBool [false])
@@ -2109,7 +2179,8 @@
 // Evaluate constant user nil checks.
 (IsNonNil (ConstNil)) => (ConstBool [false])
 (IsNonNil (Const(32|64) [c])) => (ConstBool [c != 0])
-(IsNonNil (Addr _)) => (ConstBool [true])
+(IsNonNil          (Addr _)   ) => (ConstBool [true])
+(IsNonNil (Convert (Addr _) _)) => (ConstBool [true])
 (IsNonNil (LocalAddr _ _)) => (ConstBool [true])
 
 // Inline small or disjoint runtime.memmove calls with constant length.
@@ -2152,11 +2223,7 @@
 	=> (Move {types.Types[types.TUINT8]} [int64(sz)] dst src mem)
 
 // De-virtualize late-expanded interface calls into late-expanded static calls.
-// Note that (ITab (IMake)) doesn't get rewritten until after the first opt pass,
-// so this rule should trigger reliably.
-// devirtLECall removes the first argument, adds the devirtualized symbol to the AuxCall, and changes the opcode
-(InterLECall [argsize] {auxCall} (Load (OffPtr [off] (ITab (IMake (Addr {itab} (SB)) _))) _) ___) && devirtLESym(v, auxCall, itab, off) !=
-    nil => devirtLECall(v, devirtLESym(v, auxCall, itab, off))
+(InterLECall [argsize] {auxCall} (Addr {fn} (SB)) ___) => devirtLECall(v, fn.(*obj.LSym))
 
 // Move and Zero optimizations.
 // Move source and destination may overlap.
@@ -2541,7 +2608,7 @@
 (SelectN [0] call:(StaticLECall {sym} a x)) && needRaceCleanup(sym, call) && clobber(call) => x
 (SelectN [0] call:(StaticLECall {sym} x)) && needRaceCleanup(sym, call) && clobber(call) => x
 
-// When rewriting append to growslice, we use as the the new length the result of
+// When rewriting append to growslice, we use as the new length the result of
 // growslice so that we don't have to spill/restore the new length around the growslice call.
 // The exception here is that if the new length is a constant, avoiding spilling it
 // is pointless and its constantness is sometimes useful for subsequent optimizations.
@@ -2670,3 +2737,15 @@
 (RotateLeft(64|32|16|8) (RotateLeft(64|32|16|8) x c) d) && c.Type.Size() == 4 && d.Type.Size() == 4 => (RotateLeft(64|32|16|8) x (Add32 <c.Type> c d))
 (RotateLeft(64|32|16|8) (RotateLeft(64|32|16|8) x c) d) && c.Type.Size() == 2 && d.Type.Size() == 2 => (RotateLeft(64|32|16|8) x (Add16 <c.Type> c d))
 (RotateLeft(64|32|16|8) (RotateLeft(64|32|16|8) x c) d) && c.Type.Size() == 1 && d.Type.Size() == 1 => (RotateLeft(64|32|16|8) x (Add8  <c.Type> c d))
+
+// Loading constant values from dictionaries and itabs.
+(Load <t> (OffPtr [off]                       (Addr {s} sb)       ) _) && t.IsUintptr() && isFixedSym(s, off) => (Addr {fixedSym(b.Func, s, off)} sb)
+(Load <t> (OffPtr [off]              (Convert (Addr {s} sb) _)    ) _) && t.IsUintptr() && isFixedSym(s, off) => (Addr {fixedSym(b.Func, s, off)} sb)
+(Load <t> (OffPtr [off] (ITab (IMake          (Addr {s} sb)    _))) _) && t.IsUintptr() && isFixedSym(s, off) => (Addr {fixedSym(b.Func, s, off)} sb)
+(Load <t> (OffPtr [off] (ITab (IMake (Convert (Addr {s} sb) _) _))) _) && t.IsUintptr() && isFixedSym(s, off) => (Addr {fixedSym(b.Func, s, off)} sb)
+
+// Loading constant values from runtime._type.hash.
+(Load <t> (OffPtr [off]                       (Addr {sym} _)       ) _) && t.IsInteger() && t.Size() == 4 && isFixed32(config, sym, off) => (Const32 [fixed32(config, sym, off)])
+(Load <t> (OffPtr [off]              (Convert (Addr {sym} _) _)    ) _) && t.IsInteger() && t.Size() == 4 && isFixed32(config, sym, off) => (Const32 [fixed32(config, sym, off)])
+(Load <t> (OffPtr [off] (ITab (IMake          (Addr {sym} _)    _))) _) && t.IsInteger() && t.Size() == 4 && isFixed32(config, sym, off) => (Const32 [fixed32(config, sym, off)])
+(Load <t> (OffPtr [off] (ITab (IMake (Convert (Addr {sym} _) _) _))) _) && t.IsInteger() && t.Size() == 4 && isFixed32(config, sym, off) => (Const32 [fixed32(config, sym, off)])
diff --git a/src/cmd/compile/internal/ssa/_gen/genericOps.go b/src/cmd/compile/internal/ssa/_gen/genericOps.go
index a4c8fc9..53ff57f 100644
--- a/src/cmd/compile/internal/ssa/_gen/genericOps.go
+++ b/src/cmd/compile/internal/ssa/_gen/genericOps.go
@@ -238,6 +238,7 @@
 	{name: "BitLen32", argLength: 1},     // Number of bits in arg[0] (returns 0-32)
 	{name: "BitLen64", argLength: 1},     // Number of bits in arg[0] (returns 0-64)
 
+	{name: "Bswap16", argLength: 1}, // Swap bytes
 	{name: "Bswap32", argLength: 1}, // Swap bytes
 	{name: "Bswap64", argLength: 1}, // Swap bytes
 
@@ -349,9 +350,10 @@
 	{name: "Addr", argLength: 1, aux: "Sym", symEffect: "Addr"},      // Address of a variable.  Arg0=SB.  Aux identifies the variable.
 	{name: "LocalAddr", argLength: 2, aux: "Sym", symEffect: "Addr"}, // Address of a variable.  Arg0=SP. Arg1=mem. Aux identifies the variable.
 
-	{name: "SP", zeroWidth: true},                 // stack pointer
-	{name: "SB", typ: "Uintptr", zeroWidth: true}, // static base pointer (a.k.a. globals pointer)
-	{name: "Invalid"},                             // unused value
+	{name: "SP", zeroWidth: true},                                       // stack pointer
+	{name: "SB", typ: "Uintptr", zeroWidth: true},                       // static base pointer (a.k.a. globals pointer)
+	{name: "Invalid"},                                                   // unused value
+	{name: "SPanchored", typ: "Uintptr", argLength: 2, zeroWidth: true}, // arg0 = SP, arg1 = mem. Result is identical to arg0, but cannot be scheduled before memory state arg1.
 
 	// Memory operations
 	{name: "Load", argLength: 2},                          // Load from arg0.  arg1=memory
@@ -377,12 +379,13 @@
 	{name: "StoreWB", argLength: 3, typ: "Mem", aux: "Typ"},    // Store arg1 to arg0. arg2=memory, aux=type.  Returns memory.
 	{name: "MoveWB", argLength: 3, typ: "Mem", aux: "TypSize"}, // arg0=destptr, arg1=srcptr, arg2=mem, auxint=size, aux=type.  Returns memory.
 	{name: "ZeroWB", argLength: 2, typ: "Mem", aux: "TypSize"}, // arg0=destptr, arg1=mem, auxint=size, aux=type. Returns memory.
+	{name: "WBend", argLength: 1, typ: "Mem"},                  // Write barrier code is done, interrupting is now allowed.
 
-	// WB invokes runtime.gcWriteBarrier. This is not a normal
+	// WB invokes runtime.gcWriteBarrier.  This is not a normal
 	// call: it takes arguments in registers, doesn't clobber
 	// general-purpose registers (the exact clobber set is
 	// arch-dependent), and is not a safe-point.
-	{name: "WB", argLength: 3, typ: "Mem", aux: "Sym", symEffect: "None"}, // arg0=destptr, arg1=srcptr, arg2=mem, aux=runtime.gcWriteBarrier
+	{name: "WB", argLength: 1, typ: "(BytePtr,Mem)", aux: "Int64"}, // arg0=mem, auxint=# of buffer entries needed. Returns buffer pointer and memory.
 
 	{name: "HasCPUFeature", argLength: 0, typ: "bool", aux: "Sym", symEffect: "None"}, // aux=place that this feature flag can be loaded from
 
@@ -474,7 +477,7 @@
 	{name: "GetG", argLength: 1, zeroWidth: true}, // runtime.getg() (read g pointer). arg0=mem
 	{name: "GetClosurePtr"},                       // get closure pointer from dedicated register
 	{name: "GetCallerPC"},                         // for getcallerpc intrinsic
-	{name: "GetCallerSP"},                         // for getcallersp intrinsic
+	{name: "GetCallerSP", argLength: 1},           // for getcallersp intrinsic. arg0=mem.
 
 	// Indexing operations
 	{name: "PtrIndex", argLength: 2},             // arg0=ptr, arg1=index. Computes ptr+sizeof(*v.type)*index, where index is extended to ptrwidth type
diff --git a/src/cmd/compile/internal/ssa/_gen/main.go b/src/cmd/compile/internal/ssa/_gen/main.go
index 9251ba5..086418c 100644
--- a/src/cmd/compile/internal/ssa/_gen/main.go
+++ b/src/cmd/compile/internal/ssa/_gen/main.go
@@ -191,7 +191,7 @@
 
 func genOp() {
 	w := new(bytes.Buffer)
-	fmt.Fprintf(w, "// Code generated from _gen/*Ops.go; DO NOT EDIT.\n")
+	fmt.Fprintf(w, "// Code generated from _gen/*Ops.go using 'go generate'; DO NOT EDIT.\n")
 	fmt.Fprintln(w)
 	fmt.Fprintln(w, "package ssa")
 
diff --git a/src/cmd/compile/internal/ssa/_gen/rulegen.go b/src/cmd/compile/internal/ssa/_gen/rulegen.go
index 80fa37a..15be9a1 100644
--- a/src/cmd/compile/internal/ssa/_gen/rulegen.go
+++ b/src/cmd/compile/internal/ssa/_gen/rulegen.go
@@ -576,8 +576,7 @@
 	case *File:
 		file := n
 		seenRewrite := make(map[[3]string]string)
-		fmt.Fprintf(w, "// Code generated from _gen/%s%s.rules; DO NOT EDIT.\n", n.Arch.name, n.Suffix)
-		fmt.Fprintf(w, "// generated with: cd _gen; go run .\n")
+		fmt.Fprintf(w, "// Code generated from _gen/%s%s.rules using 'go generate'; DO NOT EDIT.\n", n.Arch.name, n.Suffix)
 		fmt.Fprintf(w, "\npackage ssa\n")
 		for _, path := range append([]string{
 			"fmt",
@@ -586,6 +585,7 @@
 			"cmd/internal/obj",
 			"cmd/compile/internal/base",
 			"cmd/compile/internal/types",
+			"cmd/compile/internal/ir",
 		}, n.Arch.imports...) {
 			fmt.Fprintf(w, "import %q\n", path)
 		}
diff --git a/src/cmd/compile/internal/ssa/allocators.go b/src/cmd/compile/internal/ssa/allocators.go
index 7cd7cad..ff70795 100644
--- a/src/cmd/compile/internal/ssa/allocators.go
+++ b/src/cmd/compile/internal/ssa/allocators.go
@@ -1,10 +1,12 @@
-// Code generated from _gen/allocators.go; DO NOT EDIT.
+// Code generated from _gen/allocators.go using 'go generate'; DO NOT EDIT.
 
 package ssa
 
 import (
+	"internal/unsafeheader"
 	"math/bits"
 	"sync"
+	"unsafe"
 )
 
 var poolFreeValueSlice [27]sync.Pool
@@ -45,232 +47,42 @@
 	poolFreeValueSlice[b-5].Put(sp)
 }
 
-var poolFreeBlockSlice [27]sync.Pool
+var poolFreeInt64Slice [27]sync.Pool
 
-func (c *Cache) allocBlockSlice(n int) []*Block {
-	var s []*Block
+func (c *Cache) allocInt64Slice(n int) []int64 {
+	var s []int64
 	n2 := n
 	if n2 < 32 {
 		n2 = 32
 	}
 	b := bits.Len(uint(n2 - 1))
-	v := poolFreeBlockSlice[b-5].Get()
+	v := poolFreeInt64Slice[b-5].Get()
 	if v == nil {
-		s = make([]*Block, 1<<b)
+		s = make([]int64, 1<<b)
 	} else {
-		sp := v.(*[]*Block)
+		sp := v.(*[]int64)
 		s = *sp
 		*sp = nil
-		c.hdrBlockSlice = append(c.hdrBlockSlice, sp)
+		c.hdrInt64Slice = append(c.hdrInt64Slice, sp)
 	}
 	s = s[:n]
 	return s
 }
-func (c *Cache) freeBlockSlice(s []*Block) {
-	for i := range s {
-		s[i] = nil
-	}
-	b := bits.Len(uint(cap(s)) - 1)
-	var sp *[]*Block
-	if len(c.hdrBlockSlice) == 0 {
-		sp = new([]*Block)
-	} else {
-		sp = c.hdrBlockSlice[len(c.hdrBlockSlice)-1]
-		c.hdrBlockSlice[len(c.hdrBlockSlice)-1] = nil
-		c.hdrBlockSlice = c.hdrBlockSlice[:len(c.hdrBlockSlice)-1]
-	}
-	*sp = s
-	poolFreeBlockSlice[b-5].Put(sp)
-}
-
-var poolFreeBoolSlice [24]sync.Pool
-
-func (c *Cache) allocBoolSlice(n int) []bool {
-	var s []bool
-	n2 := n
-	if n2 < 256 {
-		n2 = 256
-	}
-	b := bits.Len(uint(n2 - 1))
-	v := poolFreeBoolSlice[b-8].Get()
-	if v == nil {
-		s = make([]bool, 1<<b)
-	} else {
-		sp := v.(*[]bool)
-		s = *sp
-		*sp = nil
-		c.hdrBoolSlice = append(c.hdrBoolSlice, sp)
-	}
-	s = s[:n]
-	return s
-}
-func (c *Cache) freeBoolSlice(s []bool) {
-	for i := range s {
-		s[i] = false
-	}
-	b := bits.Len(uint(cap(s)) - 1)
-	var sp *[]bool
-	if len(c.hdrBoolSlice) == 0 {
-		sp = new([]bool)
-	} else {
-		sp = c.hdrBoolSlice[len(c.hdrBoolSlice)-1]
-		c.hdrBoolSlice[len(c.hdrBoolSlice)-1] = nil
-		c.hdrBoolSlice = c.hdrBoolSlice[:len(c.hdrBoolSlice)-1]
-	}
-	*sp = s
-	poolFreeBoolSlice[b-8].Put(sp)
-}
-
-var poolFreeIntSlice [27]sync.Pool
-
-func (c *Cache) allocIntSlice(n int) []int {
-	var s []int
-	n2 := n
-	if n2 < 32 {
-		n2 = 32
-	}
-	b := bits.Len(uint(n2 - 1))
-	v := poolFreeIntSlice[b-5].Get()
-	if v == nil {
-		s = make([]int, 1<<b)
-	} else {
-		sp := v.(*[]int)
-		s = *sp
-		*sp = nil
-		c.hdrIntSlice = append(c.hdrIntSlice, sp)
-	}
-	s = s[:n]
-	return s
-}
-func (c *Cache) freeIntSlice(s []int) {
+func (c *Cache) freeInt64Slice(s []int64) {
 	for i := range s {
 		s[i] = 0
 	}
 	b := bits.Len(uint(cap(s)) - 1)
-	var sp *[]int
-	if len(c.hdrIntSlice) == 0 {
-		sp = new([]int)
+	var sp *[]int64
+	if len(c.hdrInt64Slice) == 0 {
+		sp = new([]int64)
 	} else {
-		sp = c.hdrIntSlice[len(c.hdrIntSlice)-1]
-		c.hdrIntSlice[len(c.hdrIntSlice)-1] = nil
-		c.hdrIntSlice = c.hdrIntSlice[:len(c.hdrIntSlice)-1]
+		sp = c.hdrInt64Slice[len(c.hdrInt64Slice)-1]
+		c.hdrInt64Slice[len(c.hdrInt64Slice)-1] = nil
+		c.hdrInt64Slice = c.hdrInt64Slice[:len(c.hdrInt64Slice)-1]
 	}
 	*sp = s
-	poolFreeIntSlice[b-5].Put(sp)
-}
-
-var poolFreeInt32Slice [26]sync.Pool
-
-func (c *Cache) allocInt32Slice(n int) []int32 {
-	var s []int32
-	n2 := n
-	if n2 < 64 {
-		n2 = 64
-	}
-	b := bits.Len(uint(n2 - 1))
-	v := poolFreeInt32Slice[b-6].Get()
-	if v == nil {
-		s = make([]int32, 1<<b)
-	} else {
-		sp := v.(*[]int32)
-		s = *sp
-		*sp = nil
-		c.hdrInt32Slice = append(c.hdrInt32Slice, sp)
-	}
-	s = s[:n]
-	return s
-}
-func (c *Cache) freeInt32Slice(s []int32) {
-	for i := range s {
-		s[i] = 0
-	}
-	b := bits.Len(uint(cap(s)) - 1)
-	var sp *[]int32
-	if len(c.hdrInt32Slice) == 0 {
-		sp = new([]int32)
-	} else {
-		sp = c.hdrInt32Slice[len(c.hdrInt32Slice)-1]
-		c.hdrInt32Slice[len(c.hdrInt32Slice)-1] = nil
-		c.hdrInt32Slice = c.hdrInt32Slice[:len(c.hdrInt32Slice)-1]
-	}
-	*sp = s
-	poolFreeInt32Slice[b-6].Put(sp)
-}
-
-var poolFreeInt8Slice [24]sync.Pool
-
-func (c *Cache) allocInt8Slice(n int) []int8 {
-	var s []int8
-	n2 := n
-	if n2 < 256 {
-		n2 = 256
-	}
-	b := bits.Len(uint(n2 - 1))
-	v := poolFreeInt8Slice[b-8].Get()
-	if v == nil {
-		s = make([]int8, 1<<b)
-	} else {
-		sp := v.(*[]int8)
-		s = *sp
-		*sp = nil
-		c.hdrInt8Slice = append(c.hdrInt8Slice, sp)
-	}
-	s = s[:n]
-	return s
-}
-func (c *Cache) freeInt8Slice(s []int8) {
-	for i := range s {
-		s[i] = 0
-	}
-	b := bits.Len(uint(cap(s)) - 1)
-	var sp *[]int8
-	if len(c.hdrInt8Slice) == 0 {
-		sp = new([]int8)
-	} else {
-		sp = c.hdrInt8Slice[len(c.hdrInt8Slice)-1]
-		c.hdrInt8Slice[len(c.hdrInt8Slice)-1] = nil
-		c.hdrInt8Slice = c.hdrInt8Slice[:len(c.hdrInt8Slice)-1]
-	}
-	*sp = s
-	poolFreeInt8Slice[b-8].Put(sp)
-}
-
-var poolFreeIDSlice [26]sync.Pool
-
-func (c *Cache) allocIDSlice(n int) []ID {
-	var s []ID
-	n2 := n
-	if n2 < 64 {
-		n2 = 64
-	}
-	b := bits.Len(uint(n2 - 1))
-	v := poolFreeIDSlice[b-6].Get()
-	if v == nil {
-		s = make([]ID, 1<<b)
-	} else {
-		sp := v.(*[]ID)
-		s = *sp
-		*sp = nil
-		c.hdrIDSlice = append(c.hdrIDSlice, sp)
-	}
-	s = s[:n]
-	return s
-}
-func (c *Cache) freeIDSlice(s []ID) {
-	for i := range s {
-		s[i] = 0
-	}
-	b := bits.Len(uint(cap(s)) - 1)
-	var sp *[]ID
-	if len(c.hdrIDSlice) == 0 {
-		sp = new([]ID)
-	} else {
-		sp = c.hdrIDSlice[len(c.hdrIDSlice)-1]
-		c.hdrIDSlice[len(c.hdrIDSlice)-1] = nil
-		c.hdrIDSlice = c.hdrIDSlice[:len(c.hdrIDSlice)-1]
-	}
-	*sp = s
-	poolFreeIDSlice[b-6].Put(sp)
+	poolFreeInt64Slice[b-5].Put(sp)
 }
 
 var poolFreeSparseSet [27]sync.Pool
@@ -341,3 +153,159 @@
 	b := bits.Len(uint(s.cap()) - 1)
 	poolFreeSparseMapPos[b-5].Put(s)
 }
+func (c *Cache) allocBlockSlice(n int) []*Block {
+	var base *Value
+	var derived *Block
+	if unsafe.Sizeof(base)%unsafe.Sizeof(derived) != 0 {
+		panic("bad")
+	}
+	scale := unsafe.Sizeof(base) / unsafe.Sizeof(derived)
+	b := c.allocValueSlice(int((uintptr(n) + scale - 1) / scale))
+	s := unsafeheader.Slice{
+		Data: unsafe.Pointer(&b[0]),
+		Len:  n,
+		Cap:  cap(b) * int(scale),
+	}
+	return *(*[]*Block)(unsafe.Pointer(&s))
+}
+func (c *Cache) freeBlockSlice(s []*Block) {
+	var base *Value
+	var derived *Block
+	scale := unsafe.Sizeof(base) / unsafe.Sizeof(derived)
+	b := unsafeheader.Slice{
+		Data: unsafe.Pointer(&s[0]),
+		Len:  int((uintptr(len(s)) + scale - 1) / scale),
+		Cap:  int((uintptr(cap(s)) + scale - 1) / scale),
+	}
+	c.freeValueSlice(*(*[]*Value)(unsafe.Pointer(&b)))
+}
+func (c *Cache) allocIntSlice(n int) []int {
+	var base int64
+	var derived int
+	if unsafe.Sizeof(base)%unsafe.Sizeof(derived) != 0 {
+		panic("bad")
+	}
+	scale := unsafe.Sizeof(base) / unsafe.Sizeof(derived)
+	b := c.allocInt64Slice(int((uintptr(n) + scale - 1) / scale))
+	s := unsafeheader.Slice{
+		Data: unsafe.Pointer(&b[0]),
+		Len:  n,
+		Cap:  cap(b) * int(scale),
+	}
+	return *(*[]int)(unsafe.Pointer(&s))
+}
+func (c *Cache) freeIntSlice(s []int) {
+	var base int64
+	var derived int
+	scale := unsafe.Sizeof(base) / unsafe.Sizeof(derived)
+	b := unsafeheader.Slice{
+		Data: unsafe.Pointer(&s[0]),
+		Len:  int((uintptr(len(s)) + scale - 1) / scale),
+		Cap:  int((uintptr(cap(s)) + scale - 1) / scale),
+	}
+	c.freeInt64Slice(*(*[]int64)(unsafe.Pointer(&b)))
+}
+func (c *Cache) allocInt32Slice(n int) []int32 {
+	var base int64
+	var derived int32
+	if unsafe.Sizeof(base)%unsafe.Sizeof(derived) != 0 {
+		panic("bad")
+	}
+	scale := unsafe.Sizeof(base) / unsafe.Sizeof(derived)
+	b := c.allocInt64Slice(int((uintptr(n) + scale - 1) / scale))
+	s := unsafeheader.Slice{
+		Data: unsafe.Pointer(&b[0]),
+		Len:  n,
+		Cap:  cap(b) * int(scale),
+	}
+	return *(*[]int32)(unsafe.Pointer(&s))
+}
+func (c *Cache) freeInt32Slice(s []int32) {
+	var base int64
+	var derived int32
+	scale := unsafe.Sizeof(base) / unsafe.Sizeof(derived)
+	b := unsafeheader.Slice{
+		Data: unsafe.Pointer(&s[0]),
+		Len:  int((uintptr(len(s)) + scale - 1) / scale),
+		Cap:  int((uintptr(cap(s)) + scale - 1) / scale),
+	}
+	c.freeInt64Slice(*(*[]int64)(unsafe.Pointer(&b)))
+}
+func (c *Cache) allocInt8Slice(n int) []int8 {
+	var base int64
+	var derived int8
+	if unsafe.Sizeof(base)%unsafe.Sizeof(derived) != 0 {
+		panic("bad")
+	}
+	scale := unsafe.Sizeof(base) / unsafe.Sizeof(derived)
+	b := c.allocInt64Slice(int((uintptr(n) + scale - 1) / scale))
+	s := unsafeheader.Slice{
+		Data: unsafe.Pointer(&b[0]),
+		Len:  n,
+		Cap:  cap(b) * int(scale),
+	}
+	return *(*[]int8)(unsafe.Pointer(&s))
+}
+func (c *Cache) freeInt8Slice(s []int8) {
+	var base int64
+	var derived int8
+	scale := unsafe.Sizeof(base) / unsafe.Sizeof(derived)
+	b := unsafeheader.Slice{
+		Data: unsafe.Pointer(&s[0]),
+		Len:  int((uintptr(len(s)) + scale - 1) / scale),
+		Cap:  int((uintptr(cap(s)) + scale - 1) / scale),
+	}
+	c.freeInt64Slice(*(*[]int64)(unsafe.Pointer(&b)))
+}
+func (c *Cache) allocBoolSlice(n int) []bool {
+	var base int64
+	var derived bool
+	if unsafe.Sizeof(base)%unsafe.Sizeof(derived) != 0 {
+		panic("bad")
+	}
+	scale := unsafe.Sizeof(base) / unsafe.Sizeof(derived)
+	b := c.allocInt64Slice(int((uintptr(n) + scale - 1) / scale))
+	s := unsafeheader.Slice{
+		Data: unsafe.Pointer(&b[0]),
+		Len:  n,
+		Cap:  cap(b) * int(scale),
+	}
+	return *(*[]bool)(unsafe.Pointer(&s))
+}
+func (c *Cache) freeBoolSlice(s []bool) {
+	var base int64
+	var derived bool
+	scale := unsafe.Sizeof(base) / unsafe.Sizeof(derived)
+	b := unsafeheader.Slice{
+		Data: unsafe.Pointer(&s[0]),
+		Len:  int((uintptr(len(s)) + scale - 1) / scale),
+		Cap:  int((uintptr(cap(s)) + scale - 1) / scale),
+	}
+	c.freeInt64Slice(*(*[]int64)(unsafe.Pointer(&b)))
+}
+func (c *Cache) allocIDSlice(n int) []ID {
+	var base int64
+	var derived ID
+	if unsafe.Sizeof(base)%unsafe.Sizeof(derived) != 0 {
+		panic("bad")
+	}
+	scale := unsafe.Sizeof(base) / unsafe.Sizeof(derived)
+	b := c.allocInt64Slice(int((uintptr(n) + scale - 1) / scale))
+	s := unsafeheader.Slice{
+		Data: unsafe.Pointer(&b[0]),
+		Len:  n,
+		Cap:  cap(b) * int(scale),
+	}
+	return *(*[]ID)(unsafe.Pointer(&s))
+}
+func (c *Cache) freeIDSlice(s []ID) {
+	var base int64
+	var derived ID
+	scale := unsafe.Sizeof(base) / unsafe.Sizeof(derived)
+	b := unsafeheader.Slice{
+		Data: unsafe.Pointer(&s[0]),
+		Len:  int((uintptr(len(s)) + scale - 1) / scale),
+		Cap:  int((uintptr(cap(s)) + scale - 1) / scale),
+	}
+	c.freeInt64Slice(*(*[]int64)(unsafe.Pointer(&b)))
+}
diff --git a/src/cmd/compile/internal/ssa/block.go b/src/cmd/compile/internal/ssa/block.go
index 9a1dc8e..e7776b2 100644
--- a/src/cmd/compile/internal/ssa/block.go
+++ b/src/cmd/compile/internal/ssa/block.go
@@ -341,7 +341,7 @@
 //	if v.Op != OpPhi {
 //	    continue
 //	}
-//	b.removeArg(v, i)
+//	b.removePhiArg(v, i)
 //
 // }
 func (b *Block) removePhiArg(phi *Value, i int) {
@@ -353,6 +353,7 @@
 	phi.Args[i] = phi.Args[n]
 	phi.Args[n] = nil
 	phi.Args = phi.Args[:n]
+	phielimValue(phi)
 }
 
 // LackingPos indicates whether b is a block whose position should be inherited
diff --git a/src/cmd/compile/internal/ssa/cache.go b/src/cmd/compile/internal/ssa/cache.go
index dd17f5f..ba36edd 100644
--- a/src/cmd/compile/internal/ssa/cache.go
+++ b/src/cmd/compile/internal/ssa/cache.go
@@ -34,12 +34,7 @@
 	// Free "headers" for use by the allocators in allocators.go.
 	// Used to put slices in sync.Pools without allocation.
 	hdrValueSlice []*[]*Value
-	hdrBlockSlice []*[]*Block
-	hdrBoolSlice  []*[]bool
-	hdrIntSlice   []*[]int
-	hdrInt32Slice []*[]int32
-	hdrInt8Slice  []*[]int8
-	hdrIDSlice    []*[]ID
+	hdrInt64Slice []*[]int64
 }
 
 func (c *Cache) Reset() {
diff --git a/src/cmd/compile/internal/ssa/compile.go b/src/cmd/compile/internal/ssa/compile.go
index 769f225..8618cf3 100644
--- a/src/cmd/compile/internal/ssa/compile.go
+++ b/src/cmd/compile/internal/ssa/compile.go
@@ -328,7 +328,7 @@
 		switch flag {
 		case "on":
 			checkEnabled = val != 0
-			debugPoset = checkEnabled // also turn on advanced self-checking in prove's datastructure
+			debugPoset = checkEnabled // also turn on advanced self-checking in prove's data structure
 			return ""
 		case "off":
 			checkEnabled = val == 0
@@ -482,6 +482,7 @@
 	{name: "branchelim", fn: branchelim},
 	{name: "late fuse", fn: fuseLate},
 	{name: "dse", fn: dse},
+	{name: "memcombine", fn: memcombine},
 	{name: "writebarrier", fn: writebarrier, required: true}, // expand write barrier ops
 	{name: "insert resched checks", fn: insertLoopReschedChecks,
 		disabled: !buildcfg.Experiment.PreemptibleLoops}, // insert resched checks in loops.
@@ -496,7 +497,7 @@
 	{name: "checkLower", fn: checkLower, required: true},
 	{name: "late phielim", fn: phielim},
 	{name: "late copyelim", fn: copyelim},
-	{name: "tighten", fn: tighten}, // move values closer to their uses
+	{name: "tighten", fn: tighten, required: true}, // move values closer to their uses
 	{name: "late deadcode", fn: deadcode},
 	{name: "critical", fn: critical, required: true}, // remove critical edges
 	{name: "phi tighten", fn: phiTighten},            // place rematerializable phi args near uses to reduce value lifetimes
@@ -580,6 +581,10 @@
 	{"regalloc", "stackframe"},
 	// trim needs regalloc to be done first.
 	{"regalloc", "trim"},
+	// memcombine works better if fuse happens first, to help merge stores.
+	{"late fuse", "memcombine"},
+	// memcombine is a arch-independent pass.
+	{"memcombine", "lower"},
 }
 
 func init() {
diff --git a/src/cmd/compile/internal/ssa/config.go b/src/cmd/compile/internal/ssa/config.go
index ed84430..43f9f0a 100644
--- a/src/cmd/compile/internal/ssa/config.go
+++ b/src/cmd/compile/internal/ssa/config.go
@@ -6,6 +6,7 @@
 
 import (
 	"cmd/compile/internal/abi"
+	"cmd/compile/internal/base"
 	"cmd/compile/internal/ir"
 	"cmd/compile/internal/types"
 	"cmd/internal/obj"
@@ -50,6 +51,10 @@
 	Race           bool        // race detector enabled
 	BigEndian      bool        //
 	UseFMA         bool        // Use hardware FMA operation
+	unalignedOK    bool        // Unaligned loads/stores are ok
+	haveBswap64    bool        // architecture implements Bswap64
+	haveBswap32    bool        // architecture implements Bswap32
+	haveBswap16    bool        // architecture implements Bswap16
 }
 
 type (
@@ -136,10 +141,11 @@
 }
 
 type Frontend interface {
-	CanSSA(t *types.Type) bool
-
 	Logger
 
+	// CanSSA reports whether variables of type t are SSA-able.
+	CanSSA(t *types.Type) bool
+
 	// StringData returns a symbol pointing to the given string's contents.
 	StringData(string) *obj.LSym
 
@@ -151,9 +157,6 @@
 	// for the parts of that compound type.
 	SplitSlot(parent *LocalSlot, suffix string, offset int64, t *types.Type) LocalSlot
 
-	// Line returns a string describing the given position.
-	Line(src.XPos) string
-
 	// AllocFrame assigns frame offsets to all live auto variables.
 	AllocFrame(f *Func)
 
@@ -164,15 +167,11 @@
 	// UseWriteBarrier reports whether write barrier is enabled
 	UseWriteBarrier() bool
 
-	// SetWBPos indicates that a write barrier has been inserted
-	// in this function at position pos.
-	SetWBPos(pos src.XPos)
-
 	// MyImportPath provides the import name (roughly, the package) for the function being compiled.
 	MyImportPath() string
 
-	// LSym returns the linker symbol of the function being compiled.
-	LSym() string
+	// Func returns the ir.Func of the function being compiled.
+	Func() *ir.Func
 }
 
 // NewConfig returns a new configuration object for the given architecture.
@@ -198,6 +197,10 @@
 		c.FPReg = framepointerRegAMD64
 		c.LinkReg = linkRegAMD64
 		c.hasGReg = true
+		c.unalignedOK = true
+		c.haveBswap64 = true
+		c.haveBswap32 = true
+		c.haveBswap16 = true
 	case "386":
 		c.PtrSize = 4
 		c.RegSize = 4
@@ -210,6 +213,9 @@
 		c.FPReg = framepointerReg386
 		c.LinkReg = linkReg386
 		c.hasGReg = false
+		c.unalignedOK = true
+		c.haveBswap32 = true
+		c.haveBswap16 = true
 	case "arm":
 		c.PtrSize = 4
 		c.RegSize = 4
@@ -236,6 +242,10 @@
 		c.FPReg = framepointerRegARM64
 		c.LinkReg = linkRegARM64
 		c.hasGReg = true
+		c.unalignedOK = true
+		c.haveBswap64 = true
+		c.haveBswap32 = true
+		c.haveBswap16 = true
 	case "ppc64":
 		c.BigEndian = true
 		fallthrough
@@ -255,6 +265,14 @@
 		c.FPReg = framepointerRegPPC64
 		c.LinkReg = linkRegPPC64
 		c.hasGReg = true
+		c.unalignedOK = true
+		// Note: ppc64 has register bswap ops only when GOPPC64>=10.
+		// But it has bswap+load and bswap+store ops for all ppc64 variants.
+		// That is the sense we're using them here - they are only used
+		// in contexts where they can be merged with a load or store.
+		c.haveBswap64 = true
+		c.haveBswap32 = true
+		c.haveBswap16 = true
 	case "mips64":
 		c.BigEndian = true
 		fallthrough
@@ -294,6 +312,10 @@
 		c.hasGReg = true
 		c.noDuffDevice = true
 		c.BigEndian = true
+		c.unalignedOK = true
+		c.haveBswap64 = true
+		c.haveBswap32 = true
+		c.haveBswap16 = true // only for loads&stores, see ppc64 comment
 	case "mips":
 		c.BigEndian = true
 		fallthrough
@@ -393,3 +415,17 @@
 }
 
 func (c *Config) Ctxt() *obj.Link { return c.ctxt }
+
+func (c *Config) haveByteSwap(size int64) bool {
+	switch size {
+	case 8:
+		return c.haveBswap64
+	case 4:
+		return c.haveBswap32
+	case 2:
+		return c.haveBswap16
+	default:
+		base.Fatalf("bad size %d\n", size)
+		return false
+	}
+}
diff --git a/src/cmd/compile/internal/ssa/critical.go b/src/cmd/compile/internal/ssa/critical.go
index ddf1c0f..f14bb93 100644
--- a/src/cmd/compile/internal/ssa/critical.go
+++ b/src/cmd/compile/internal/ssa/critical.go
@@ -96,11 +96,6 @@
 
 				// splitting occasionally leads to a phi having
 				// a single argument (occurs with -N)
-				// TODO(cuonglm,khr): replace this with phielimValue, and
-				//                    make removePhiArg incorporates that.
-				if len(b.Preds) == 1 {
-					phi.Op = OpCopy
-				}
 				// Don't increment i in this case because we moved
 				// an unprocessed predecessor down into slot i.
 			} else {
diff --git a/src/cmd/compile/internal/ssa/deadcode.go b/src/cmd/compile/internal/ssa/deadcode.go
index cfadda8..52cc7f2 100644
--- a/src/cmd/compile/internal/ssa/deadcode.go
+++ b/src/cmd/compile/internal/ssa/deadcode.go
@@ -290,20 +290,6 @@
 		b.truncateValues(i)
 	}
 
-	// Remove dead blocks from WBLoads list.
-	i = 0
-	for _, b := range f.WBLoads {
-		if reachable[b.ID] {
-			f.WBLoads[i] = b
-			i++
-		}
-	}
-	clearWBLoads := f.WBLoads[i:]
-	for j := range clearWBLoads {
-		clearWBLoads[j] = nil
-	}
-	f.WBLoads = f.WBLoads[:i]
-
 	// Remove unreachable blocks. Return dead blocks to allocator.
 	i = 0
 	for _, b := range f.Blocks {
@@ -344,7 +330,6 @@
 			continue
 		}
 		c.removePhiArg(v, j)
-		phielimValue(v)
 		// Note: this is trickier than it looks. Replacing
 		// a Phi with a Copy can in general cause problems because
 		// Phi and Copy don't have exactly the same semantics.
diff --git a/src/cmd/compile/internal/ssa/debug.go b/src/cmd/compile/internal/ssa/debug.go
index 584aaef..6393466 100644
--- a/src/cmd/compile/internal/ssa/debug.go
+++ b/src/cmd/compile/internal/ssa/debug.go
@@ -803,7 +803,7 @@
 // the first call, subsequent calls can only shrink startState.
 //
 // Passing forLocationLists=true enables additional side-effects that
-// are necessary for building location lists but superflous while still
+// are necessary for building location lists but superfluous while still
 // iterating to an answer.
 //
 // If previousBlock is non-nil, it registers changes vs. that block's
@@ -969,7 +969,7 @@
 	}
 
 	state.currentState.reset(abt.T{})
-	// The normal logic of "reset" is incuded in the intersection loop below.
+	// The normal logic of "reset" is included in the intersection loop below.
 
 	slotLocs := state.currentState.slots
 
@@ -1751,7 +1751,7 @@
 // it constructs a 2-element location list: the first element holds
 // the input register, and the second element holds the stack location
 // of the param (the assumption being that when optimization is off,
-// each input param reg will be spilled in the prolog.
+// each input param reg will be spilled in the prolog).
 func BuildFuncDebugNoOptimized(ctxt *obj.Link, f *Func, loggingEnabled bool, stackOffset func(LocalSlot) int32, rval *FuncDebug) {
 
 	pri := f.ABISelf.ABIAnalyzeFuncType(f.Type.FuncType())
diff --git a/src/cmd/compile/internal/ssa/debug_lines_test.go b/src/cmd/compile/internal/ssa/debug_lines_test.go
index 6678a96..cf11510 100644
--- a/src/cmd/compile/internal/ssa/debug_lines_test.go
+++ b/src/cmd/compile/internal/ssa/debug_lines_test.go
@@ -9,7 +9,6 @@
 	"bytes"
 	"flag"
 	"fmt"
-	"internal/buildcfg"
 	"internal/testenv"
 	"os"
 	"path/filepath"
@@ -84,7 +83,7 @@
 
 	case "arm64", "amd64": // register ABI
 		fn := "(*List[go.shape.int_0]).PushBack"
-		if buildcfg.Experiment.Unified {
+		if true /* was buildcfg.Experiment.Unified */ {
 			// Unified mangles differently
 			fn = "(*List[go.shape.int]).PushBack"
 		}
@@ -101,7 +100,7 @@
 
 	case "arm64", "amd64": // register ABI
 		fn := "G[go.shape.int_0]"
-		if buildcfg.Experiment.Unified {
+		if true /* was buildcfg.Experiment.Unified */ {
 			// Unified mangles differently
 			fn = "G[go.shape.int]"
 		}
@@ -222,7 +221,7 @@
 	sortInlineStacks(gotStacks)
 	sortInlineStacks(wantStacks)
 	if !reflect.DeepEqual(wantStacks, gotStacks) {
-		t.Errorf("wanted inlines %+v but got %+v", wantStacks, gotStacks)
+		t.Errorf("wanted inlines %+v but got %+v\n%s", wantStacks, gotStacks, dumpBytes)
 	}
 
 }
diff --git a/src/cmd/compile/internal/ssa/debug_test.go b/src/cmd/compile/internal/ssa/debug_test.go
index 094d1a9..9ac414c 100644
--- a/src/cmd/compile/internal/ssa/debug_test.go
+++ b/src/cmd/compile/internal/ssa/debug_test.go
@@ -222,15 +222,11 @@
 
 	// Use a temporary directory unless -f is specified
 	if !*force {
-		tmpdir, err := os.MkdirTemp("", "debug_test")
-		if err != nil {
-			panic(fmt.Sprintf("Problem creating TempDir, error %v\n", err))
-		}
+		tmpdir := t.TempDir()
 		tmpbase = filepath.Join(tmpdir, "test-"+base+"."+tag)
 		if *verbose {
 			fmt.Printf("Tempdir is %s\n", tmpdir)
 		}
-		defer os.RemoveAll(tmpdir)
 	}
 	exe := tmpbase
 
diff --git a/src/cmd/compile/internal/ssa/expand_calls.go b/src/cmd/compile/internal/ssa/expand_calls.go
index 949a8d3..3afd73e 100644
--- a/src/cmd/compile/internal/ssa/expand_calls.go
+++ b/src/cmd/compile/internal/ssa/expand_calls.go
@@ -276,7 +276,7 @@
 	x.indentLevel += n
 }
 
-// Printf does an indented fmt.Printf on te format and args.
+// Printf does an indented fmt.Printf on the format and args.
 func (x *expandState) Printf(format string, a ...interface{}) (n int, err error) {
 	if x.indentLevel > 0 {
 		fmt.Printf("%[1]*s", x.indentLevel, "")
@@ -855,7 +855,7 @@
 // storeOneLoad creates a decomposed (one step) load that is then stored.
 func storeOneLoad(x *expandState, pos src.XPos, b *Block, source, mem *Value, t *types.Type, offArg, offStore int64, loadRegOffset Abi1RO, storeRc registerCursor) *Value {
 	from := x.offsetFrom(source.Block, source.Args[0], offArg, types.NewPtr(t))
-	w := source.Block.NewValue2(source.Pos, OpLoad, t, from, mem)
+	w := b.NewValue2(source.Pos, OpLoad, t, from, mem)
 	return x.storeArgOrLoad(pos, b, w, mem, t, offStore, loadRegOffset, storeRc)
 }
 
@@ -962,7 +962,7 @@
 		eltRO := x.regWidth(elt)
 		source.Type = t
 		for i := int64(0); i < t.NumElem(); i++ {
-			sel := source.Block.NewValue1I(pos, OpArraySelect, elt, i, source)
+			sel := b.NewValue1I(pos, OpArraySelect, elt, i, source)
 			mem = x.storeArgOrLoad(pos, b, sel, mem, elt, storeOffset+i*elt.Size(), loadRegOffset, storeRc.at(t, 0))
 			loadRegOffset += eltRO
 			pos = pos.WithNotStmt()
@@ -997,7 +997,7 @@
 		source.Type = t
 		for i := 0; i < t.NumFields(); i++ {
 			fld := t.Field(i)
-			sel := source.Block.NewValue1I(pos, OpStructSelect, fld.Type, int64(i), source)
+			sel := b.NewValue1I(pos, OpStructSelect, fld.Type, int64(i), source)
 			mem = x.storeArgOrLoad(pos, b, sel, mem, fld.Type, storeOffset+fld.Offset, loadRegOffset, storeRc.next(fld.Type))
 			loadRegOffset += x.regWidth(fld.Type)
 			pos = pos.WithNotStmt()
@@ -1009,48 +1009,48 @@
 			break
 		}
 		tHi, tLo := x.intPairTypes(t.Kind())
-		sel := source.Block.NewValue1(pos, OpInt64Hi, tHi, source)
+		sel := b.NewValue1(pos, OpInt64Hi, tHi, source)
 		mem = x.storeArgOrLoad(pos, b, sel, mem, tHi, storeOffset+x.hiOffset, loadRegOffset+x.hiRo, storeRc.plus(x.hiRo))
 		pos = pos.WithNotStmt()
-		sel = source.Block.NewValue1(pos, OpInt64Lo, tLo, source)
+		sel = b.NewValue1(pos, OpInt64Lo, tLo, source)
 		return x.storeArgOrLoad(pos, b, sel, mem, tLo, storeOffset+x.lowOffset, loadRegOffset+x.loRo, storeRc.plus(x.hiRo))
 
 	case types.TINTER:
-		sel := source.Block.NewValue1(pos, OpITab, x.typs.BytePtr, source)
+		sel := b.NewValue1(pos, OpITab, x.typs.BytePtr, source)
 		mem = x.storeArgOrLoad(pos, b, sel, mem, x.typs.BytePtr, storeOffset, loadRegOffset, storeRc.next(x.typs.BytePtr))
 		pos = pos.WithNotStmt()
-		sel = source.Block.NewValue1(pos, OpIData, x.typs.BytePtr, source)
+		sel = b.NewValue1(pos, OpIData, x.typs.BytePtr, source)
 		return x.storeArgOrLoad(pos, b, sel, mem, x.typs.BytePtr, storeOffset+x.ptrSize, loadRegOffset+RO_iface_data, storeRc)
 
 	case types.TSTRING:
-		sel := source.Block.NewValue1(pos, OpStringPtr, x.typs.BytePtr, source)
+		sel := b.NewValue1(pos, OpStringPtr, x.typs.BytePtr, source)
 		mem = x.storeArgOrLoad(pos, b, sel, mem, x.typs.BytePtr, storeOffset, loadRegOffset, storeRc.next(x.typs.BytePtr))
 		pos = pos.WithNotStmt()
-		sel = source.Block.NewValue1(pos, OpStringLen, x.typs.Int, source)
+		sel = b.NewValue1(pos, OpStringLen, x.typs.Int, source)
 		return x.storeArgOrLoad(pos, b, sel, mem, x.typs.Int, storeOffset+x.ptrSize, loadRegOffset+RO_string_len, storeRc)
 
 	case types.TSLICE:
 		et := types.NewPtr(t.Elem())
-		sel := source.Block.NewValue1(pos, OpSlicePtr, et, source)
+		sel := b.NewValue1(pos, OpSlicePtr, et, source)
 		mem = x.storeArgOrLoad(pos, b, sel, mem, et, storeOffset, loadRegOffset, storeRc.next(et))
 		pos = pos.WithNotStmt()
-		sel = source.Block.NewValue1(pos, OpSliceLen, x.typs.Int, source)
+		sel = b.NewValue1(pos, OpSliceLen, x.typs.Int, source)
 		mem = x.storeArgOrLoad(pos, b, sel, mem, x.typs.Int, storeOffset+x.ptrSize, loadRegOffset+RO_slice_len, storeRc.next(x.typs.Int))
-		sel = source.Block.NewValue1(pos, OpSliceCap, x.typs.Int, source)
+		sel = b.NewValue1(pos, OpSliceCap, x.typs.Int, source)
 		return x.storeArgOrLoad(pos, b, sel, mem, x.typs.Int, storeOffset+2*x.ptrSize, loadRegOffset+RO_slice_cap, storeRc)
 
 	case types.TCOMPLEX64:
-		sel := source.Block.NewValue1(pos, OpComplexReal, x.typs.Float32, source)
+		sel := b.NewValue1(pos, OpComplexReal, x.typs.Float32, source)
 		mem = x.storeArgOrLoad(pos, b, sel, mem, x.typs.Float32, storeOffset, loadRegOffset, storeRc.next(x.typs.Float32))
 		pos = pos.WithNotStmt()
-		sel = source.Block.NewValue1(pos, OpComplexImag, x.typs.Float32, source)
+		sel = b.NewValue1(pos, OpComplexImag, x.typs.Float32, source)
 		return x.storeArgOrLoad(pos, b, sel, mem, x.typs.Float32, storeOffset+4, loadRegOffset+RO_complex_imag, storeRc)
 
 	case types.TCOMPLEX128:
-		sel := source.Block.NewValue1(pos, OpComplexReal, x.typs.Float64, source)
+		sel := b.NewValue1(pos, OpComplexReal, x.typs.Float64, source)
 		mem = x.storeArgOrLoad(pos, b, sel, mem, x.typs.Float64, storeOffset, loadRegOffset, storeRc.next(x.typs.Float64))
 		pos = pos.WithNotStmt()
-		sel = source.Block.NewValue1(pos, OpComplexImag, x.typs.Float64, source)
+		sel = b.NewValue1(pos, OpComplexImag, x.typs.Float64, source)
 		return x.storeArgOrLoad(pos, b, sel, mem, x.typs.Float64, storeOffset+8, loadRegOffset+RO_complex_imag, storeRc)
 	}
 
@@ -1090,7 +1090,7 @@
 	if v.Op == OpTailLECall {
 		// For tail call, we unwind the frame before the call so we'll use the caller's
 		// SP.
-		sp = x.f.Entry.NewValue0(src.NoXPos, OpGetCallerSP, x.typs.Uintptr)
+		sp = x.f.Entry.NewValue1(src.NoXPos, OpGetCallerSP, x.typs.Uintptr, mem)
 	}
 	for i, a := range v.Args[firstArg : len(v.Args)-1] { // skip leading non-parameter SSA Args and trailing mem SSA Arg.
 		oldArgs = append(oldArgs, a)
@@ -1113,9 +1113,12 @@
 					}
 				}
 			}
+			if x.debug > 1 {
+				x.Printf("...storeArg %s, %v, %d\n", a.LongString(), aType, aOffset)
+			}
 			// "Dereference" of addressed (probably not-SSA-eligible) value becomes Move
 			// TODO(register args) this will be more complicated with registers in the picture.
-			mem = x.rewriteDereference(v.Block, sp, a, mem, aOffset, aux.SizeOfArg(auxI), aType, a.Pos)
+			mem = x.rewriteDereference(v.Block, sp, a, mem, aOffset, aux.SizeOfArg(auxI), aType, v.Pos)
 		} else {
 			var rc registerCursor
 			var result *[]*Value
@@ -1137,7 +1140,7 @@
 				x.Printf("...storeArg %s, %v, %d\n", a.LongString(), aType, aOffset)
 			}
 			rc.init(aRegs, aux.abiInfo, result, sp)
-			mem = x.storeArgOrLoad(a.Pos, v.Block, a, mem, aType, aOffset, 0, rc)
+			mem = x.storeArgOrLoad(v.Pos, v.Block, a, mem, aType, aOffset, 0, rc)
 		}
 	}
 	var preArgStore [2]*Value
diff --git a/src/cmd/compile/internal/ssa/export_test.go b/src/cmd/compile/internal/ssa/export_test.go
index f98437b..14f2474 100644
--- a/src/cmd/compile/internal/ssa/export_test.go
+++ b/src/cmd/compile/internal/ssa/export_test.go
@@ -55,7 +55,18 @@
 
 func (c *Conf) Frontend() Frontend {
 	if c.fe == nil {
-		c.fe = TestFrontend{t: c.tb, ctxt: c.config.ctxt}
+		f := ir.NewFunc(src.NoXPos)
+		f.Nname = ir.NewNameAt(f.Pos(), &types.Sym{
+			Pkg:  types.NewPkg("my/import/path", "path"),
+			Name: "function",
+		})
+		f.LSym = &obj.LSym{Name: "my/import/path.function"}
+
+		c.fe = TestFrontend{
+			t:    c.tb,
+			ctxt: c.config.ctxt,
+			f:    f,
+		}
 	}
 	return c.fe
 }
@@ -65,6 +76,7 @@
 type TestFrontend struct {
 	t    testing.TB
 	ctxt *obj.Link
+	f    *ir.Func
 }
 
 func (TestFrontend) StringData(s string) *obj.LSym {
@@ -79,9 +91,6 @@
 func (d TestFrontend) SplitSlot(parent *LocalSlot, suffix string, offset int64, t *types.Type) LocalSlot {
 	return LocalSlot{N: parent.N, Type: t, Off: offset}
 }
-func (TestFrontend) Line(_ src.XPos) string {
-	return "unknown.go:0"
-}
 func (TestFrontend) AllocFrame(f *Func) {
 }
 func (d TestFrontend) Syslook(s string) *obj.LSym {
@@ -90,8 +99,6 @@
 func (TestFrontend) UseWriteBarrier() bool {
 	return true // only writebarrier_test cares
 }
-func (TestFrontend) SetWBPos(pos src.XPos) {
-}
 
 func (d TestFrontend) Logf(msg string, args ...interface{}) { d.t.Logf(msg, args...) }
 func (d TestFrontend) Log() bool                            { return true }
@@ -101,10 +108,10 @@
 func (d TestFrontend) Debug_checknil() bool                               { return false }
 
 func (d TestFrontend) MyImportPath() string {
-	return "my/import/path"
+	return d.f.Sym().Pkg.Path
 }
-func (d TestFrontend) LSym() string {
-	return "my/import/path.function"
+func (d TestFrontend) Func() *ir.Func {
+	return d.f
 }
 
 var testTypes Types
diff --git a/src/cmd/compile/internal/ssa/fmahash_test.go b/src/cmd/compile/internal/ssa/fmahash_test.go
index 8bdb3bf..dfa1aa1 100644
--- a/src/cmd/compile/internal/ssa/fmahash_test.go
+++ b/src/cmd/compile/internal/ssa/fmahash_test.go
@@ -6,7 +6,6 @@
 
 import (
 	"internal/testenv"
-	"os"
 	"path/filepath"
 	"regexp"
 	"runtime"
@@ -31,11 +30,7 @@
 
 	testenv.MustHaveGoBuild(t)
 	gocmd := testenv.GoToolPath(t)
-	tmpdir, err := os.MkdirTemp("", "x")
-	if err != nil {
-		t.Error(err)
-	}
-	defer os.RemoveAll(tmpdir)
+	tmpdir := t.TempDir()
 	source := filepath.Join("testdata", "fma.go")
 	output := filepath.Join(tmpdir, "fma.exe")
 	cmd := testenv.Command(t, gocmd, "build", "-o", output, source)
@@ -49,7 +44,7 @@
 		t.Error(e)
 	}
 	s := string(b) // Looking for "GOFMAHASH triggered main.main:24"
-	re := "fmahash(0?) triggered POS=.*fma.go:29:..;.*fma.go:18:.."
+	re := "fmahash(0?) triggered .*fma.go:29:..;.*fma.go:18:.."
 	match := regexp.MustCompile(re)
 	if !match.MatchString(s) {
 		t.Errorf("Expected to match '%s' with \n-----\n%s-----", re, s)
diff --git a/src/cmd/compile/internal/ssa/func.go b/src/cmd/compile/internal/ssa/func.go
index b10911a..2d203e5 100644
--- a/src/cmd/compile/internal/ssa/func.go
+++ b/src/cmd/compile/internal/ssa/func.go
@@ -64,12 +64,6 @@
 	// AuxCall describing parameters and results for this function.
 	OwnAux *AuxCall
 
-	// WBLoads is a list of Blocks that branch on the write
-	// barrier flag. Safe-points are disabled from the OpLoad that
-	// reads the write-barrier flag until the control flow rejoins
-	// below the two successors of this block.
-	WBLoads []*Block
-
 	freeValues *Value // free Values linked by argstorage[0].  All other fields except ID are 0/nil.
 	freeBlocks *Block // free Blocks linked by succstorage[0].b.  All other fields except ID are 0/nil.
 
@@ -779,8 +773,7 @@
 	if !base.HasDebugHash() {
 		return true
 	}
-	name := f.fe.MyImportPath() + "." + f.Name
-	return base.DebugHashMatch(name)
+	return base.DebugHashMatchPkgFunc(f.fe.MyImportPath(), f.Name)
 }
 
 func (f *Func) spSb() (sp, sb *Value) {
@@ -814,6 +807,5 @@
 	if base.FmaHash == nil {
 		return true
 	}
-	ctxt := v.Block.Func.Config.Ctxt()
-	return base.FmaHash.DebugHashMatchPos(ctxt, v.Pos)
+	return base.FmaHash.MatchPos(v.Pos, nil)
 }
diff --git a/src/cmd/compile/internal/ssa/fuse_branchredirect.go b/src/cmd/compile/internal/ssa/fuse_branchredirect.go
index 5957096..153c2a5 100644
--- a/src/cmd/compile/internal/ssa/fuse_branchredirect.go
+++ b/src/cmd/compile/internal/ssa/fuse_branchredirect.go
@@ -82,7 +82,6 @@
 						continue
 					}
 					b.removePhiArg(v, k)
-					phielimValue(v)
 				}
 				// Fix up child to have one more predecessor.
 				child.Preds = append(child.Preds, Edge{p, pk.i})
diff --git a/src/cmd/compile/internal/ssa/generate.go b/src/cmd/compile/internal/ssa/generate.go
new file mode 100644
index 0000000..74c5b31
--- /dev/null
+++ b/src/cmd/compile/internal/ssa/generate.go
@@ -0,0 +1,9 @@
+// Copyright 2022 The Go 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:build generate
+
+package ssa
+
+//go:generate go run -C=_gen .
diff --git a/src/cmd/compile/internal/ssa/loopbce.go b/src/cmd/compile/internal/ssa/loopbce.go
index d92566f..b7dfaa3 100644
--- a/src/cmd/compile/internal/ssa/loopbce.go
+++ b/src/cmd/compile/internal/ssa/loopbce.go
@@ -6,8 +6,8 @@
 
 import (
 	"cmd/compile/internal/base"
+	"cmd/compile/internal/types"
 	"fmt"
-	"math"
 )
 
 type indVarFlags uint8
@@ -44,9 +44,9 @@
 		return
 	}
 
-	if n := ind.Args[0]; n.Op == OpAdd64 && (n.Args[0] == ind || n.Args[1] == ind) {
+	if n := ind.Args[0]; (n.Op == OpAdd64 || n.Op == OpAdd32 || n.Op == OpAdd16 || n.Op == OpAdd8) && (n.Args[0] == ind || n.Args[1] == ind) {
 		min, nxt = ind.Args[1], n
-	} else if n := ind.Args[1]; n.Op == OpAdd64 && (n.Args[0] == ind || n.Args[1] == ind) {
+	} else if n := ind.Args[1]; (n.Op == OpAdd64 || n.Op == OpAdd32 || n.Op == OpAdd16 || n.Op == OpAdd8) && (n.Args[0] == ind || n.Args[1] == ind) {
 		min, nxt = ind.Args[0], n
 	} else {
 		// Not a recognized induction variable.
@@ -80,8 +80,6 @@
 //		goto loop
 //
 //	 exit_loop:
-//
-// TODO: handle 32 bit operations
 func findIndVar(f *Func) []indVar {
 	var iv []indVar
 	sdom := f.Sdom()
@@ -95,16 +93,15 @@
 		var init *Value  // starting value
 		var limit *Value // ending value
 
-		// Check thet the control if it either ind </<= limit or limit </<= ind.
-		// TODO: Handle 32-bit comparisons.
+		// Check that the control if it either ind </<= limit or limit </<= ind.
 		// TODO: Handle unsigned comparisons?
 		c := b.Controls[0]
 		inclusive := false
 		switch c.Op {
-		case OpLeq64:
+		case OpLeq64, OpLeq32, OpLeq16, OpLeq8:
 			inclusive = true
 			fallthrough
-		case OpLess64:
+		case OpLess64, OpLess32, OpLess16, OpLess8:
 			ind, limit = c.Args[0], c.Args[1]
 		default:
 			continue
@@ -120,18 +117,18 @@
 			//     for i := len(n)-1; i >= 0; i--
 			init, inc, nxt = parseIndVar(limit)
 			if init == nil {
-				// No recognied induction variable on either operand
+				// No recognized induction variable on either operand
 				continue
 			}
 
 			// Ok, the arguments were reversed. Swap them, and remember that we're
-			// looking at a ind >/>= loop (so the induction must be decrementing).
+			// looking at an ind >/>= loop (so the induction must be decrementing).
 			ind, limit = limit, ind
 			less = false
 		}
 
 		// Expect the increment to be a nonzero constant.
-		if inc.Op != OpConst64 {
+		if !inc.isGenericIntConst() {
 			continue
 		}
 		step := inc.AuxInt
@@ -184,16 +181,16 @@
 		// This function returns true if the increment will never overflow/underflow.
 		ok := func() bool {
 			if step > 0 {
-				if limit.Op == OpConst64 {
+				if limit.isGenericIntConst() {
 					// Figure out the actual largest value.
 					v := limit.AuxInt
 					if !inclusive {
-						if v == math.MinInt64 {
+						if v == minSignedValue(limit.Type) {
 							return false // < minint is never satisfiable.
 						}
 						v--
 					}
-					if init.Op == OpConst64 {
+					if init.isGenericIntConst() {
 						// Use stride to compute a better lower limit.
 						if init.AuxInt > v {
 							return false
@@ -205,7 +202,7 @@
 					}
 					if inclusive && v != limit.AuxInt || !inclusive && v+1 != limit.AuxInt {
 						// We know a better limit than the programmer did. Use our limit instead.
-						limit = f.ConstInt64(f.Config.Types.Int64, v)
+						limit = f.constVal(limit.Op, limit.Type, v, true)
 						inclusive = true
 					}
 					return true
@@ -227,18 +224,18 @@
 					return step <= k
 				}
 				// ind < knn - k cannot overflow if step is at most k+1
-				return step <= k+1 && k != math.MaxInt64
+				return step <= k+1 && k != maxSignedValue(limit.Type)
 			} else { // step < 0
 				if limit.Op == OpConst64 {
 					// Figure out the actual smallest value.
 					v := limit.AuxInt
 					if !inclusive {
-						if v == math.MaxInt64 {
+						if v == maxSignedValue(limit.Type) {
 							return false // > maxint is never satisfiable.
 						}
 						v++
 					}
-					if init.Op == OpConst64 {
+					if init.isGenericIntConst() {
 						// Use stride to compute a better lower limit.
 						if init.AuxInt < v {
 							return false
@@ -250,7 +247,7 @@
 					}
 					if inclusive && v != limit.AuxInt || !inclusive && v-1 != limit.AuxInt {
 						// We know a better limit than the programmer did. Use our limit instead.
-						limit = f.ConstInt64(f.Config.Types.Int64, v)
+						limit = f.constVal(limit.Op, limit.Type, v, true)
 						inclusive = true
 					}
 					return true
@@ -361,14 +358,14 @@
 	var x, y *Value
 	x = v
 	switch v.Op {
-	case OpSub64:
+	case OpSub64, OpSub32, OpSub16, OpSub8:
 		x = v.Args[0]
 		y = v.Args[1]
 
-	case OpAdd64:
+	case OpAdd64, OpAdd32, OpAdd16, OpAdd8:
 		x = v.Args[0]
 		y = v.Args[1]
-		if x.Op == OpConst64 {
+		if x.isGenericIntConst() {
 			x, y = y, x
 		}
 	}
@@ -380,10 +377,10 @@
 	if y == nil {
 		return x, 0
 	}
-	if y.Op != OpConst64 {
+	if !y.isGenericIntConst() {
 		return nil, 0
 	}
-	if v.Op == OpAdd64 {
+	if v.Op == OpAdd64 || v.Op == OpAdd32 || v.Op == OpAdd16 || v.Op == OpAdd8 {
 		return x, -y.AuxInt
 	}
 	return x, y.AuxInt
@@ -419,3 +416,11 @@
 	}
 	b.Func.Warnl(b.Pos, "Induction variable: limits %v%v,%v%v, increment %d%s", mb1, mlim1, mlim2, mb2, inc, extra)
 }
+
+func minSignedValue(t *types.Type) int64 {
+	return -1 << (t.Size()*8 - 1)
+}
+
+func maxSignedValue(t *types.Type) int64 {
+	return 1<<((t.Size()*8)-1) - 1
+}
diff --git a/src/cmd/compile/internal/ssa/lower.go b/src/cmd/compile/internal/ssa/lower.go
index 0b79d77..e4aac47 100644
--- a/src/cmd/compile/internal/ssa/lower.go
+++ b/src/cmd/compile/internal/ssa/lower.go
@@ -29,7 +29,7 @@
 				continue // lowered
 			}
 			switch v.Op {
-			case OpSP, OpSB, OpInitMem, OpArg, OpArgIntReg, OpArgFloatReg, OpPhi, OpVarDef, OpVarLive, OpKeepAlive, OpSelect0, OpSelect1, OpSelectN, OpConvert, OpInlMark:
+			case OpSP, OpSPanchored, OpSB, OpInitMem, OpArg, OpArgIntReg, OpArgFloatReg, OpPhi, OpVarDef, OpVarLive, OpKeepAlive, OpSelect0, OpSelect1, OpSelectN, OpConvert, OpInlMark, OpWBend:
 				continue // ok not to lower
 			case OpMakeResult:
 				if b.Controls[0] == v {
diff --git a/src/cmd/compile/internal/ssa/memcombine.go b/src/cmd/compile/internal/ssa/memcombine.go
new file mode 100644
index 0000000..c134643
--- /dev/null
+++ b/src/cmd/compile/internal/ssa/memcombine.go
@@ -0,0 +1,731 @@
+// Copyright 2023 The Go Authors. 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
+
+import (
+	"cmd/compile/internal/base"
+	"cmd/compile/internal/types"
+	"cmd/internal/src"
+	"sort"
+)
+
+// memcombine combines smaller loads and stores into larger ones.
+// We ensure this generates good code for encoding/binary operations.
+// It may help other cases also.
+func memcombine(f *Func) {
+	// This optimization requires that the architecture has
+	// unaligned loads and unaligned stores.
+	if !f.Config.unalignedOK {
+		return
+	}
+
+	memcombineLoads(f)
+	memcombineStores(f)
+}
+
+func memcombineLoads(f *Func) {
+	// Find "OR trees" to start with.
+	mark := f.newSparseSet(f.NumValues())
+	defer f.retSparseSet(mark)
+	var order []*Value
+
+	// Mark all values that are the argument of an OR.
+	for _, b := range f.Blocks {
+		for _, v := range b.Values {
+			if v.Op == OpOr16 || v.Op == OpOr32 || v.Op == OpOr64 {
+				mark.add(v.Args[0].ID)
+				mark.add(v.Args[1].ID)
+			}
+		}
+	}
+	for _, b := range f.Blocks {
+		order = order[:0]
+		for _, v := range b.Values {
+			if v.Op != OpOr16 && v.Op != OpOr32 && v.Op != OpOr64 {
+				continue
+			}
+			if mark.contains(v.ID) {
+				// marked - means it is not the root of an OR tree
+				continue
+			}
+			// Add the OR tree rooted at v to the order.
+			// We use BFS here, but any walk that puts roots before leaves would work.
+			i := len(order)
+			order = append(order, v)
+			for ; i < len(order); i++ {
+				x := order[i]
+				for j := 0; j < 2; j++ {
+					a := x.Args[j]
+					if a.Op == OpOr16 || a.Op == OpOr32 || a.Op == OpOr64 {
+						order = append(order, a)
+					}
+				}
+			}
+		}
+		for _, v := range order {
+			max := f.Config.RegSize
+			switch v.Op {
+			case OpOr64:
+			case OpOr32:
+				max = 4
+			case OpOr16:
+				max = 2
+			default:
+				continue
+			}
+			for n := max; n > 1; n /= 2 {
+				if combineLoads(v, n) {
+					break
+				}
+			}
+		}
+	}
+}
+
+// A BaseAddress represents the address ptr+idx, where
+// ptr is a pointer type and idx is an integer type.
+// idx may be nil, in which case it is treated as 0.
+type BaseAddress struct {
+	ptr *Value
+	idx *Value
+}
+
+// splitPtr returns the base address of ptr and any
+// constant offset from that base.
+// BaseAddress{ptr,nil},0 is always a valid result, but splitPtr
+// tries to peel away as many constants into off as possible.
+func splitPtr(ptr *Value) (BaseAddress, int64) {
+	var idx *Value
+	var off int64
+	for {
+		if ptr.Op == OpOffPtr {
+			off += ptr.AuxInt
+			ptr = ptr.Args[0]
+		} else if ptr.Op == OpAddPtr {
+			if idx != nil {
+				// We have two or more indexing values.
+				// Pick the first one we found.
+				return BaseAddress{ptr: ptr, idx: idx}, off
+			}
+			idx = ptr.Args[1]
+			if idx.Op == OpAdd32 || idx.Op == OpAdd64 {
+				if idx.Args[0].Op == OpConst32 || idx.Args[0].Op == OpConst64 {
+					off += idx.Args[0].AuxInt
+					idx = idx.Args[1]
+				} else if idx.Args[1].Op == OpConst32 || idx.Args[1].Op == OpConst64 {
+					off += idx.Args[1].AuxInt
+					idx = idx.Args[0]
+				}
+			}
+			ptr = ptr.Args[0]
+		} else {
+			return BaseAddress{ptr: ptr, idx: idx}, off
+		}
+	}
+}
+
+func combineLoads(root *Value, n int64) bool {
+	orOp := root.Op
+	var shiftOp Op
+	switch orOp {
+	case OpOr64:
+		shiftOp = OpLsh64x64
+	case OpOr32:
+		shiftOp = OpLsh32x64
+	case OpOr16:
+		shiftOp = OpLsh16x64
+	default:
+		return false
+	}
+
+	// Find n values that are ORed together with the above op.
+	a := make([]*Value, 0, 8)
+	a = append(a, root)
+	for i := 0; i < len(a) && int64(len(a)) < n; i++ {
+		v := a[i]
+		if v.Uses != 1 && v != root {
+			// Something in this subtree is used somewhere else.
+			return false
+		}
+		if v.Op == orOp {
+			a[i] = v.Args[0]
+			a = append(a, v.Args[1])
+			i--
+		}
+	}
+	if int64(len(a)) != n {
+		return false
+	}
+
+	// Check that the first entry to see what ops we're looking for.
+	// All the entries should be of the form shift(extend(load)), maybe with no shift.
+	v := a[0]
+	if v.Op == shiftOp {
+		v = v.Args[0]
+	}
+	var extOp Op
+	if orOp == OpOr64 && (v.Op == OpZeroExt8to64 || v.Op == OpZeroExt16to64 || v.Op == OpZeroExt32to64) ||
+		orOp == OpOr32 && (v.Op == OpZeroExt8to32 || v.Op == OpZeroExt16to32) ||
+		orOp == OpOr16 && v.Op == OpZeroExt8to16 {
+		extOp = v.Op
+		v = v.Args[0]
+	} else {
+		return false
+	}
+	if v.Op != OpLoad {
+		return false
+	}
+	base, _ := splitPtr(v.Args[0])
+	mem := v.Args[1]
+	size := v.Type.Size()
+
+	if root.Block.Func.Config.arch == "S390X" {
+		// s390x can't handle unaligned accesses to global variables.
+		if base.ptr.Op == OpAddr {
+			return false
+		}
+	}
+
+	// Check all the entries, extract useful info.
+	type LoadRecord struct {
+		load   *Value
+		offset int64 // offset of load address from base
+		shift  int64
+	}
+	r := make([]LoadRecord, n, 8)
+	for i := int64(0); i < n; i++ {
+		v := a[i]
+		if v.Uses != 1 {
+			return false
+		}
+		shift := int64(0)
+		if v.Op == shiftOp {
+			if v.Args[1].Op != OpConst64 {
+				return false
+			}
+			shift = v.Args[1].AuxInt
+			v = v.Args[0]
+			if v.Uses != 1 {
+				return false
+			}
+		}
+		if v.Op != extOp {
+			return false
+		}
+		load := v.Args[0]
+		if load.Op != OpLoad {
+			return false
+		}
+		if load.Uses != 1 {
+			return false
+		}
+		if load.Args[1] != mem {
+			return false
+		}
+		p, off := splitPtr(load.Args[0])
+		if p != base {
+			return false
+		}
+		r[i] = LoadRecord{load: load, offset: off, shift: shift}
+	}
+
+	// Sort in memory address order.
+	sort.Slice(r, func(i, j int) bool {
+		return r[i].offset < r[j].offset
+	})
+
+	// Check that we have contiguous offsets.
+	for i := int64(0); i < n; i++ {
+		if r[i].offset != r[0].offset+i*size {
+			return false
+		}
+	}
+
+	// Check for reads in little-endian or big-endian order.
+	shift0 := r[0].shift
+	isLittleEndian := true
+	for i := int64(0); i < n; i++ {
+		if r[i].shift != shift0+i*size*8 {
+			isLittleEndian = false
+			break
+		}
+	}
+	isBigEndian := true
+	for i := int64(0); i < n; i++ {
+		if r[i].shift != shift0-i*size*8 {
+			isBigEndian = false
+			break
+		}
+	}
+	if !isLittleEndian && !isBigEndian {
+		return false
+	}
+
+	// Find a place to put the new load.
+	// This is tricky, because it has to be at a point where
+	// its memory argument is live. We can't just put it in root.Block.
+	// We use the block of the latest load.
+	loads := make([]*Value, n, 8)
+	for i := int64(0); i < n; i++ {
+		loads[i] = r[i].load
+	}
+	loadBlock := mergePoint(root.Block, loads...)
+	if loadBlock == nil {
+		return false
+	}
+	// Find a source position to use.
+	pos := src.NoXPos
+	for _, load := range loads {
+		if load.Block == loadBlock {
+			pos = load.Pos
+			break
+		}
+	}
+	if pos == src.NoXPos {
+		return false
+	}
+
+	// Check to see if we need byte swap before storing.
+	needSwap := isLittleEndian && root.Block.Func.Config.BigEndian ||
+		isBigEndian && !root.Block.Func.Config.BigEndian
+	if needSwap && (size != 1 || !root.Block.Func.Config.haveByteSwap(n)) {
+		return false
+	}
+
+	// This is the commit point.
+
+	// First, issue load at lowest address.
+	v = loadBlock.NewValue2(pos, OpLoad, sizeType(n*size), r[0].load.Args[0], mem)
+
+	// Byte swap if needed,
+	if needSwap {
+		v = byteSwap(loadBlock, pos, v)
+	}
+
+	// Extend if needed.
+	if n*size < root.Type.Size() {
+		v = zeroExtend(loadBlock, pos, v, n*size, root.Type.Size())
+	}
+
+	// Shift if needed.
+	if isLittleEndian && shift0 != 0 {
+		v = leftShift(loadBlock, pos, v, shift0)
+	}
+	if isBigEndian && shift0-(n-1)*8 != 0 {
+		v = leftShift(loadBlock, pos, v, shift0-(n-1)*8)
+	}
+
+	// Install with (Copy v).
+	root.reset(OpCopy)
+	root.AddArg(v)
+
+	// Clobber the loads, just to prevent additional work being done on
+	// subtrees (which are now unreachable).
+	for i := int64(0); i < n; i++ {
+		clobber(r[i].load)
+	}
+	return true
+}
+
+func memcombineStores(f *Func) {
+	mark := f.newSparseSet(f.NumValues())
+	defer f.retSparseSet(mark)
+	var order []*Value
+
+	for _, b := range f.Blocks {
+		// Mark all stores which are not last in a store sequence.
+		mark.clear()
+		for _, v := range b.Values {
+			if v.Op == OpStore {
+				mark.add(v.MemoryArg().ID)
+			}
+		}
+
+		// pick an order for visiting stores such that
+		// later stores come earlier in the ordering.
+		order = order[:0]
+		for _, v := range b.Values {
+			if v.Op != OpStore {
+				continue
+			}
+			if mark.contains(v.ID) {
+				continue // not last in a chain of stores
+			}
+			for {
+				order = append(order, v)
+				v = v.Args[2]
+				if v.Block != b || v.Op != OpStore {
+					break
+				}
+			}
+		}
+
+		// Look for combining opportunities at each store in queue order.
+		for _, v := range order {
+			if v.Op != OpStore { // already rewritten
+				continue
+			}
+
+			size := v.Aux.(*types.Type).Size()
+			if size >= f.Config.RegSize || size == 0 {
+				continue
+			}
+
+			for n := f.Config.RegSize / size; n > 1; n /= 2 {
+				if combineStores(v, n) {
+					continue
+				}
+			}
+		}
+	}
+}
+
+// Try to combine the n stores ending in root.
+// Returns true if successful.
+func combineStores(root *Value, n int64) bool {
+	// Helper functions.
+	type StoreRecord struct {
+		store  *Value
+		offset int64
+	}
+	getShiftBase := func(a []StoreRecord) *Value {
+		x := a[0].store.Args[1]
+		y := a[1].store.Args[1]
+		switch x.Op {
+		case OpTrunc64to8, OpTrunc64to16, OpTrunc64to32, OpTrunc32to8, OpTrunc32to16, OpTrunc16to8:
+			x = x.Args[0]
+		default:
+			return nil
+		}
+		switch y.Op {
+		case OpTrunc64to8, OpTrunc64to16, OpTrunc64to32, OpTrunc32to8, OpTrunc32to16, OpTrunc16to8:
+			y = y.Args[0]
+		default:
+			return nil
+		}
+		var x2 *Value
+		switch x.Op {
+		case OpRsh64Ux64, OpRsh32Ux64, OpRsh16Ux64:
+			x2 = x.Args[0]
+		default:
+		}
+		var y2 *Value
+		switch y.Op {
+		case OpRsh64Ux64, OpRsh32Ux64, OpRsh16Ux64:
+			y2 = y.Args[0]
+		default:
+		}
+		if y2 == x {
+			// a shift of x and x itself.
+			return x
+		}
+		if x2 == y {
+			// a shift of y and y itself.
+			return y
+		}
+		if x2 == y2 {
+			// 2 shifts both of the same argument.
+			return x2
+		}
+		return nil
+	}
+	isShiftBase := func(v, base *Value) bool {
+		val := v.Args[1]
+		switch val.Op {
+		case OpTrunc64to8, OpTrunc64to16, OpTrunc64to32, OpTrunc32to8, OpTrunc32to16, OpTrunc16to8:
+			val = val.Args[0]
+		default:
+			return false
+		}
+		if val == base {
+			return true
+		}
+		switch val.Op {
+		case OpRsh64Ux64, OpRsh32Ux64, OpRsh16Ux64:
+			val = val.Args[0]
+		default:
+			return false
+		}
+		return val == base
+	}
+	shift := func(v, base *Value) int64 {
+		val := v.Args[1]
+		switch val.Op {
+		case OpTrunc64to8, OpTrunc64to16, OpTrunc64to32, OpTrunc32to8, OpTrunc32to16, OpTrunc16to8:
+			val = val.Args[0]
+		default:
+			return -1
+		}
+		if val == base {
+			return 0
+		}
+		switch val.Op {
+		case OpRsh64Ux64, OpRsh32Ux64, OpRsh16Ux64:
+			val = val.Args[1]
+		default:
+			return -1
+		}
+		if val.Op != OpConst64 {
+			return -1
+		}
+		return val.AuxInt
+	}
+
+	// Element size of the individual stores.
+	size := root.Aux.(*types.Type).Size()
+	if size*n > root.Block.Func.Config.RegSize {
+		return false
+	}
+
+	// Gather n stores to look at. Check easy conditions we require.
+	a := make([]StoreRecord, 0, 8)
+	rbase, roff := splitPtr(root.Args[0])
+	if root.Block.Func.Config.arch == "S390X" {
+		// s390x can't handle unaligned accesses to global variables.
+		if rbase.ptr.Op == OpAddr {
+			return false
+		}
+	}
+	a = append(a, StoreRecord{root, roff})
+	for i, x := int64(1), root.Args[2]; i < n; i, x = i+1, x.Args[2] {
+		if x.Op != OpStore {
+			return false
+		}
+		if x.Block != root.Block {
+			return false
+		}
+		if x.Uses != 1 { // Note: root can have more than one use.
+			return false
+		}
+		if x.Aux.(*types.Type).Size() != size {
+			return false
+		}
+		base, off := splitPtr(x.Args[0])
+		if base != rbase {
+			return false
+		}
+		a = append(a, StoreRecord{x, off})
+	}
+	// Before we sort, grab the memory arg the result should have.
+	mem := a[n-1].store.Args[2]
+
+	// Sort stores in increasing address order.
+	sort.Slice(a, func(i, j int) bool {
+		return a[i].offset < a[j].offset
+	})
+
+	// Check that everything is written to sequential locations.
+	for i := int64(0); i < n; i++ {
+		if a[i].offset != a[0].offset+i*size {
+			return false
+		}
+	}
+
+	// Memory location we're going to write at (the lowest one).
+	ptr := a[0].store.Args[0]
+
+	// Check for constant stores
+	isConst := true
+	for i := int64(0); i < n; i++ {
+		switch a[i].store.Args[1].Op {
+		case OpConst32, OpConst16, OpConst8:
+		default:
+			isConst = false
+			break
+		}
+	}
+	if isConst {
+		// Modify root to do all the stores.
+		var c int64
+		mask := int64(1)<<(8*size) - 1
+		for i := int64(0); i < n; i++ {
+			s := 8 * size * int64(i)
+			if root.Block.Func.Config.BigEndian {
+				s = 8*size*(n-1) - s
+			}
+			c |= (a[i].store.Args[1].AuxInt & mask) << s
+		}
+		var cv *Value
+		switch size * n {
+		case 2:
+			cv = root.Block.Func.ConstInt16(types.Types[types.TUINT16], int16(c))
+		case 4:
+			cv = root.Block.Func.ConstInt32(types.Types[types.TUINT32], int32(c))
+		case 8:
+			cv = root.Block.Func.ConstInt64(types.Types[types.TUINT64], c)
+		}
+
+		// Move all the stores to the root.
+		for i := int64(0); i < n; i++ {
+			v := a[i].store
+			if v == root {
+				v.Aux = cv.Type // widen store type
+				v.SetArg(0, ptr)
+				v.SetArg(1, cv)
+				v.SetArg(2, mem)
+			} else {
+				clobber(v)
+				v.Type = types.Types[types.TBOOL] // erase memory type
+			}
+		}
+		return true
+	}
+
+	// Check that all the shift/trunc are of the same base value.
+	shiftBase := getShiftBase(a)
+	if shiftBase == nil {
+		return false
+	}
+	for i := int64(0); i < n; i++ {
+		if !isShiftBase(a[i].store, shiftBase) {
+			return false
+		}
+	}
+
+	// Check for writes in little-endian or big-endian order.
+	isLittleEndian := true
+	shift0 := shift(a[0].store, shiftBase)
+	for i := int64(1); i < n; i++ {
+		if shift(a[i].store, shiftBase) != shift0+i*8 {
+			isLittleEndian = false
+			break
+		}
+	}
+	isBigEndian := true
+	for i := int64(1); i < n; i++ {
+		if shift(a[i].store, shiftBase) != shift0-i*8 {
+			isBigEndian = false
+			break
+		}
+	}
+	if !isLittleEndian && !isBigEndian {
+		return false
+	}
+
+	// Check to see if we need byte swap before storing.
+	needSwap := isLittleEndian && root.Block.Func.Config.BigEndian ||
+		isBigEndian && !root.Block.Func.Config.BigEndian
+	if needSwap && (size != 1 || !root.Block.Func.Config.haveByteSwap(n)) {
+		return false
+	}
+
+	// This is the commit point.
+
+	// Modify root to do all the stores.
+	sv := shiftBase
+	if isLittleEndian && shift0 != 0 {
+		sv = rightShift(root.Block, root.Pos, sv, shift0)
+	}
+	if isBigEndian && shift0-(n-1)*8 != 0 {
+		sv = rightShift(root.Block, root.Pos, sv, shift0-(n-1)*8)
+	}
+	if sv.Type.Size() > size*n {
+		sv = truncate(root.Block, root.Pos, sv, sv.Type.Size(), size*n)
+	}
+	if needSwap {
+		sv = byteSwap(root.Block, root.Pos, sv)
+	}
+
+	// Move all the stores to the root.
+	for i := int64(0); i < n; i++ {
+		v := a[i].store
+		if v == root {
+			v.Aux = sv.Type // widen store type
+			v.SetArg(0, ptr)
+			v.SetArg(1, sv)
+			v.SetArg(2, mem)
+		} else {
+			clobber(v)
+			v.Type = types.Types[types.TBOOL] // erase memory type
+		}
+	}
+	return true
+}
+
+func sizeType(size int64) *types.Type {
+	switch size {
+	case 8:
+		return types.Types[types.TUINT64]
+	case 4:
+		return types.Types[types.TUINT32]
+	case 2:
+		return types.Types[types.TUINT16]
+	default:
+		base.Fatalf("bad size %d\n", size)
+		return nil
+	}
+}
+
+func truncate(b *Block, pos src.XPos, v *Value, from, to int64) *Value {
+	switch from*10 + to {
+	case 82:
+		return b.NewValue1(pos, OpTrunc64to16, types.Types[types.TUINT16], v)
+	case 84:
+		return b.NewValue1(pos, OpTrunc64to32, types.Types[types.TUINT32], v)
+	case 42:
+		return b.NewValue1(pos, OpTrunc32to16, types.Types[types.TUINT16], v)
+	default:
+		base.Fatalf("bad sizes %d %d\n", from, to)
+		return nil
+	}
+}
+func zeroExtend(b *Block, pos src.XPos, v *Value, from, to int64) *Value {
+	switch from*10 + to {
+	case 24:
+		return b.NewValue1(pos, OpZeroExt16to32, types.Types[types.TUINT32], v)
+	case 28:
+		return b.NewValue1(pos, OpZeroExt16to64, types.Types[types.TUINT64], v)
+	case 48:
+		return b.NewValue1(pos, OpZeroExt32to64, types.Types[types.TUINT64], v)
+	default:
+		base.Fatalf("bad sizes %d %d\n", from, to)
+		return nil
+	}
+}
+
+func leftShift(b *Block, pos src.XPos, v *Value, shift int64) *Value {
+	s := b.Func.ConstInt64(types.Types[types.TUINT64], shift)
+	size := v.Type.Size()
+	switch size {
+	case 8:
+		return b.NewValue2(pos, OpLsh64x64, v.Type, v, s)
+	case 4:
+		return b.NewValue2(pos, OpLsh32x64, v.Type, v, s)
+	case 2:
+		return b.NewValue2(pos, OpLsh16x64, v.Type, v, s)
+	default:
+		base.Fatalf("bad size %d\n", size)
+		return nil
+	}
+}
+func rightShift(b *Block, pos src.XPos, v *Value, shift int64) *Value {
+	s := b.Func.ConstInt64(types.Types[types.TUINT64], shift)
+	size := v.Type.Size()
+	switch size {
+	case 8:
+		return b.NewValue2(pos, OpRsh64Ux64, v.Type, v, s)
+	case 4:
+		return b.NewValue2(pos, OpRsh32Ux64, v.Type, v, s)
+	case 2:
+		return b.NewValue2(pos, OpRsh16Ux64, v.Type, v, s)
+	default:
+		base.Fatalf("bad size %d\n", size)
+		return nil
+	}
+}
+func byteSwap(b *Block, pos src.XPos, v *Value) *Value {
+	switch v.Type.Size() {
+	case 8:
+		return b.NewValue1(pos, OpBswap64, v.Type, v)
+	case 4:
+		return b.NewValue1(pos, OpBswap32, v.Type, v)
+	case 2:
+		return b.NewValue1(pos, OpBswap16, v.Type, v)
+
+	default:
+		v.Fatalf("bad size %d\n", v.Type.Size())
+		return nil
+	}
+}
diff --git a/src/cmd/compile/internal/ssa/op.go b/src/cmd/compile/internal/ssa/op.go
index 9434c0e..e2319d7 100644
--- a/src/cmd/compile/internal/ssa/op.go
+++ b/src/cmd/compile/internal/ssa/op.go
@@ -372,7 +372,7 @@
 	auxARM64BitField     // aux is an arm64 bitfield lsb and width packed into auxInt
 	auxS390XRotateParams // aux is a s390x rotate parameters object encoding start bit, end bit and rotate amount
 	auxS390XCCMask       // aux is a s390x 4-bit condition code mask
-	auxS390XCCMaskInt8   // aux is a s390x 4-bit condition code mask, auxInt is a int8 immediate
+	auxS390XCCMaskInt8   // aux is a s390x 4-bit condition code mask, auxInt is an int8 immediate
 	auxS390XCCMaskUint8  // aux is a s390x 4-bit condition code mask, auxInt is a uint8 immediate
 )
 
diff --git a/src/cmd/compile/internal/ssa/opGen.go b/src/cmd/compile/internal/ssa/opGen.go
index 407ecbb..1480fcf 100644
--- a/src/cmd/compile/internal/ssa/opGen.go
+++ b/src/cmd/compile/internal/ssa/opGen.go
@@ -1,4 +1,4 @@
-// Code generated from _gen/*Ops.go; DO NOT EDIT.
+// Code generated from _gen/*Ops.go using 'go generate'; DO NOT EDIT.
 
 package ssa
 
@@ -456,6 +456,7 @@
 	Op386NOTL
 	Op386BSFL
 	Op386BSFW
+	Op386LoweredCtz32
 	Op386BSRL
 	Op386BSRW
 	Op386BSWAPL
@@ -1669,6 +1670,8 @@
 	OpARM64NotLessEqualF
 	OpARM64NotGreaterThanF
 	OpARM64NotGreaterEqualF
+	OpARM64LessThanNoov
+	OpARM64GreaterEqualNoov
 	OpARM64DUFFZERO
 	OpARM64LoweredZero
 	OpARM64DUFFCOPY
@@ -1716,9 +1719,12 @@
 	OpLOONG64SUBV
 	OpLOONG64SUBVconst
 	OpLOONG64MULV
-	OpLOONG64MULVU
+	OpLOONG64MULHV
+	OpLOONG64MULHVU
 	OpLOONG64DIVV
 	OpLOONG64DIVVU
+	OpLOONG64REMV
+	OpLOONG64REMVU
 	OpLOONG64ADDF
 	OpLOONG64ADDD
 	OpLOONG64SUBF
@@ -1866,6 +1872,7 @@
 	OpMIPSNEG
 	OpMIPSNEGF
 	OpMIPSNEGD
+	OpMIPSABSD
 	OpMIPSSQRTD
 	OpMIPSSQRTF
 	OpMIPSSLL
@@ -1906,6 +1913,8 @@
 	OpMIPSMOVBstorezero
 	OpMIPSMOVHstorezero
 	OpMIPSMOVWstorezero
+	OpMIPSMOVWfpgp
+	OpMIPSMOVWgpfp
 	OpMIPSMOVBreg
 	OpMIPSMOVBUreg
 	OpMIPSMOVHreg
@@ -1978,6 +1987,7 @@
 	OpMIPS64NEGV
 	OpMIPS64NEGF
 	OpMIPS64NEGD
+	OpMIPS64ABSD
 	OpMIPS64SQRTD
 	OpMIPS64SQRTF
 	OpMIPS64SLLV
@@ -2019,6 +2029,10 @@
 	OpMIPS64MOVHstorezero
 	OpMIPS64MOVWstorezero
 	OpMIPS64MOVVstorezero
+	OpMIPS64MOVWfpgp
+	OpMIPS64MOVWgpfp
+	OpMIPS64MOVVfpgp
+	OpMIPS64MOVVgpfp
 	OpMIPS64MOVBreg
 	OpMIPS64MOVBUreg
 	OpMIPS64MOVHreg
@@ -2045,6 +2059,8 @@
 	OpMIPS64DUFFCOPY
 	OpMIPS64LoweredZero
 	OpMIPS64LoweredMove
+	OpMIPS64LoweredAtomicAnd32
+	OpMIPS64LoweredAtomicOr32
 	OpMIPS64LoweredAtomicLoad8
 	OpMIPS64LoweredAtomicLoad32
 	OpMIPS64LoweredAtomicLoad64
@@ -2161,6 +2177,9 @@
 	OpPPC64XORCC
 	OpPPC64EQV
 	OpPPC64NEG
+	OpPPC64BRD
+	OpPPC64BRW
+	OpPPC64BRH
 	OpPPC64FNEG
 	OpPPC64FSQRT
 	OpPPC64FSQRTS
@@ -2239,8 +2258,9 @@
 	OpPPC64CMPWconst
 	OpPPC64CMPWUconst
 	OpPPC64ISEL
-	OpPPC64ISELB
 	OpPPC64ISELZ
+	OpPPC64SETBC
+	OpPPC64SETBCR
 	OpPPC64Equal
 	OpPPC64NotEqual
 	OpPPC64LessThan
@@ -2962,6 +2982,7 @@
 	OpBitLen16
 	OpBitLen32
 	OpBitLen64
+	OpBswap16
 	OpBswap32
 	OpBswap64
 	OpBitRev8
@@ -3008,6 +3029,7 @@
 	OpLocalAddr
 	OpSP
 	OpSB
+	OpSPanchored
 	OpLoad
 	OpDereference
 	OpStore
@@ -3016,6 +3038,7 @@
 	OpStoreWB
 	OpMoveWB
 	OpZeroWB
+	OpWBend
 	OpWB
 	OpHasCPUFeature
 	OpPanicBounds
@@ -5027,6 +5050,19 @@
 		},
 	},
 	{
+		name:         "LoweredCtz32",
+		argLen:       1,
+		clobberFlags: true,
+		reg: regInfo{
+			inputs: []inputInfo{
+				{0, 239}, // AX CX DX BX BP SI DI
+			},
+			outputs: []outputInfo{
+				{0, 239}, // AX CX DX BX BP SI DI
+			},
+		},
+	},
+	{
 		name:         "BSRL",
 		argLen:       1,
 		clobberFlags: true,
@@ -6295,7 +6331,7 @@
 	},
 	{
 		name:              "LoweredGetCallerSP",
-		argLen:            0,
+		argLen:            1,
 		rematerializeable: true,
 		reg: regInfo{
 			outputs: []outputInfo{
@@ -6317,16 +6353,14 @@
 	},
 	{
 		name:         "LoweredWB",
-		auxType:      auxSym,
-		argLen:       3,
+		auxType:      auxInt64,
+		argLen:       1,
 		clobberFlags: true,
-		symEffect:    SymNone,
 		reg: regInfo{
-			inputs: []inputInfo{
-				{0, 128}, // DI
-				{1, 1},   // AX
-			},
 			clobbers: 65280, // X0 X1 X2 X3 X4 X5 X6 X7
+			outputs: []outputInfo{
+				{0, 128}, // DI
+			},
 		},
 	},
 	{
@@ -13500,7 +13534,7 @@
 	},
 	{
 		name:              "LoweredGetCallerSP",
-		argLen:            0,
+		argLen:            1,
 		rematerializeable: true,
 		reg: regInfo{
 			outputs: []outputInfo{
@@ -13522,16 +13556,14 @@
 	},
 	{
 		name:         "LoweredWB",
-		auxType:      auxSym,
-		argLen:       3,
+		auxType:      auxInt64,
+		argLen:       1,
 		clobberFlags: true,
-		symEffect:    SymNone,
 		reg: regInfo{
-			inputs: []inputInfo{
-				{0, 128}, // DI
-				{1, 879}, // AX CX DX BX BP SI R8 R9
-			},
 			clobbers: 2147418112, // X0 X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 X11 X12 X13 X14
+			outputs: []outputInfo{
+				{0, 2048}, // R11
+			},
 		},
 	},
 	{
@@ -13979,29 +14011,29 @@
 		},
 	},
 	{
-		name:         "BLSRQ",
-		argLen:       1,
-		clobberFlags: true,
-		asm:          x86.ABLSRQ,
+		name:   "BLSRQ",
+		argLen: 1,
+		asm:    x86.ABLSRQ,
 		reg: regInfo{
 			inputs: []inputInfo{
 				{0, 49135}, // AX CX DX BX BP SI DI R8 R9 R10 R11 R12 R13 R15
 			},
 			outputs: []outputInfo{
+				{1, 0},
 				{0, 49135}, // AX CX DX BX BP SI DI R8 R9 R10 R11 R12 R13 R15
 			},
 		},
 	},
 	{
-		name:         "BLSRL",
-		argLen:       1,
-		clobberFlags: true,
-		asm:          x86.ABLSRL,
+		name:   "BLSRL",
+		argLen: 1,
+		asm:    x86.ABLSRL,
 		reg: regInfo{
 			inputs: []inputInfo{
 				{0, 49135}, // AX CX DX BX BP SI DI R8 R9 R10 R11 R12 R13 R15
 			},
 			outputs: []outputInfo{
+				{1, 0},
 				{0, 49135}, // AX CX DX BX BP SI DI R8 R9 R10 R11 R12 R13 R15
 			},
 		},
@@ -18362,7 +18394,7 @@
 	},
 	{
 		name:              "LoweredGetCallerSP",
-		argLen:            0,
+		argLen:            1,
 		rematerializeable: true,
 		reg: regInfo{
 			outputs: []outputInfo{
@@ -18468,16 +18500,14 @@
 	},
 	{
 		name:         "LoweredWB",
-		auxType:      auxSym,
-		argLen:       3,
+		auxType:      auxInt64,
+		argLen:       1,
 		clobberFlags: true,
-		symEffect:    SymNone,
 		reg: regInfo{
-			inputs: []inputInfo{
-				{0, 4}, // R2
-				{1, 8}, // R3
-			},
 			clobbers: 4294922240, // R12 R14 F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15
+			outputs: []outputInfo{
+				{0, 256}, // R8
+			},
 		},
 	},
 
@@ -22261,6 +22291,24 @@
 		},
 	},
 	{
+		name:   "LessThanNoov",
+		argLen: 1,
+		reg: regInfo{
+			outputs: []outputInfo{
+				{0, 670826495}, // R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R19 R20 R21 R22 R23 R24 R25 R26 R30
+			},
+		},
+	},
+	{
+		name:   "GreaterEqualNoov",
+		argLen: 1,
+		reg: regInfo{
+			outputs: []outputInfo{
+				{0, 670826495}, // R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R19 R20 R21 R22 R23 R24 R25 R26 R30
+			},
+		},
+	},
+	{
 		name:           "DUFFZERO",
 		auxType:        auxInt64,
 		argLen:         2,
@@ -22328,7 +22376,7 @@
 	},
 	{
 		name:              "LoweredGetCallerSP",
-		argLen:            0,
+		argLen:            1,
 		rematerializeable: true,
 		reg: regInfo{
 			outputs: []outputInfo{
@@ -22786,16 +22834,14 @@
 	},
 	{
 		name:         "LoweredWB",
-		auxType:      auxSym,
-		argLen:       3,
+		auxType:      auxInt64,
+		argLen:       1,
 		clobberFlags: true,
-		symEffect:    SymNone,
 		reg: regInfo{
-			inputs: []inputInfo{
-				{0, 4}, // R2
-				{1, 8}, // R3
-			},
 			clobbers: 9223372035244359680, // R16 R17 R30 F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 F16 F17 F18 F19 F20 F21 F22 F23 F24 F25 F26 F27 F28 F29 F30 F31
+			outputs: []outputInfo{
+				{0, 33554432}, // R25
+			},
 		},
 	},
 	{
@@ -22913,64 +22959,103 @@
 		},
 	},
 	{
-		name:            "MULV",
-		argLen:          2,
-		commutative:     true,
-		resultNotInArgs: true,
+		name:        "MULV",
+		argLen:      2,
+		commutative: true,
+		asm:         loong64.AMULV,
 		reg: regInfo{
 			inputs: []inputInfo{
-				{0, 1072496632}, // R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R19 R20 g R23 R24 R25 R26 R27 R28 R29 R31
-				{1, 1072496632}, // R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R19 R20 g R23 R24 R25 R26 R27 R28 R29 R31
+				{0, 1072693240}, // R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R18 R19 R20 g R23 R24 R25 R26 R27 R28 R29 R31
+				{1, 1072693240}, // R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R18 R19 R20 g R23 R24 R25 R26 R27 R28 R29 R31
 			},
 			outputs: []outputInfo{
 				{0, 1070596088}, // R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R18 R19 R20 R23 R24 R25 R26 R27 R28 R29 R31
-				{1, 1070596088}, // R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R18 R19 R20 R23 R24 R25 R26 R27 R28 R29 R31
 			},
 		},
 	},
 	{
-		name:            "MULVU",
-		argLen:          2,
-		commutative:     true,
-		resultNotInArgs: true,
+		name:        "MULHV",
+		argLen:      2,
+		commutative: true,
+		asm:         loong64.AMULHV,
 		reg: regInfo{
 			inputs: []inputInfo{
-				{0, 1072496632}, // R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R19 R20 g R23 R24 R25 R26 R27 R28 R29 R31
-				{1, 1072496632}, // R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R19 R20 g R23 R24 R25 R26 R27 R28 R29 R31
+				{0, 1072693240}, // R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R18 R19 R20 g R23 R24 R25 R26 R27 R28 R29 R31
+				{1, 1072693240}, // R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R18 R19 R20 g R23 R24 R25 R26 R27 R28 R29 R31
 			},
 			outputs: []outputInfo{
 				{0, 1070596088}, // R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R18 R19 R20 R23 R24 R25 R26 R27 R28 R29 R31
-				{1, 1070596088}, // R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R18 R19 R20 R23 R24 R25 R26 R27 R28 R29 R31
 			},
 		},
 	},
 	{
-		name:            "DIVV",
-		argLen:          2,
-		resultNotInArgs: true,
+		name:        "MULHVU",
+		argLen:      2,
+		commutative: true,
+		asm:         loong64.AMULHVU,
 		reg: regInfo{
 			inputs: []inputInfo{
-				{0, 1072496632}, // R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R19 R20 g R23 R24 R25 R26 R27 R28 R29 R31
-				{1, 1072496632}, // R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R19 R20 g R23 R24 R25 R26 R27 R28 R29 R31
+				{0, 1072693240}, // R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R18 R19 R20 g R23 R24 R25 R26 R27 R28 R29 R31
+				{1, 1072693240}, // R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R18 R19 R20 g R23 R24 R25 R26 R27 R28 R29 R31
 			},
 			outputs: []outputInfo{
 				{0, 1070596088}, // R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R18 R19 R20 R23 R24 R25 R26 R27 R28 R29 R31
-				{1, 1070596088}, // R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R18 R19 R20 R23 R24 R25 R26 R27 R28 R29 R31
 			},
 		},
 	},
 	{
-		name:            "DIVVU",
-		argLen:          2,
-		resultNotInArgs: true,
+		name:   "DIVV",
+		argLen: 2,
+		asm:    loong64.ADIVV,
 		reg: regInfo{
 			inputs: []inputInfo{
-				{0, 1072496632}, // R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R19 R20 g R23 R24 R25 R26 R27 R28 R29 R31
-				{1, 1072496632}, // R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R19 R20 g R23 R24 R25 R26 R27 R28 R29 R31
+				{0, 1072693240}, // R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R18 R19 R20 g R23 R24 R25 R26 R27 R28 R29 R31
+				{1, 1072693240}, // R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R18 R19 R20 g R23 R24 R25 R26 R27 R28 R29 R31
 			},
 			outputs: []outputInfo{
 				{0, 1070596088}, // R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R18 R19 R20 R23 R24 R25 R26 R27 R28 R29 R31
-				{1, 1070596088}, // R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R18 R19 R20 R23 R24 R25 R26 R27 R28 R29 R31
+			},
+		},
+	},
+	{
+		name:   "DIVVU",
+		argLen: 2,
+		asm:    loong64.ADIVVU,
+		reg: regInfo{
+			inputs: []inputInfo{
+				{0, 1072693240}, // R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R18 R19 R20 g R23 R24 R25 R26 R27 R28 R29 R31
+				{1, 1072693240}, // R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R18 R19 R20 g R23 R24 R25 R26 R27 R28 R29 R31
+			},
+			outputs: []outputInfo{
+				{0, 1070596088}, // R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R18 R19 R20 R23 R24 R25 R26 R27 R28 R29 R31
+			},
+		},
+	},
+	{
+		name:   "REMV",
+		argLen: 2,
+		asm:    loong64.AREMV,
+		reg: regInfo{
+			inputs: []inputInfo{
+				{0, 1072693240}, // R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R18 R19 R20 g R23 R24 R25 R26 R27 R28 R29 R31
+				{1, 1072693240}, // R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R18 R19 R20 g R23 R24 R25 R26 R27 R28 R29 R31
+			},
+			outputs: []outputInfo{
+				{0, 1070596088}, // R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R18 R19 R20 R23 R24 R25 R26 R27 R28 R29 R31
+			},
+		},
+	},
+	{
+		name:   "REMVU",
+		argLen: 2,
+		asm:    loong64.AREMVU,
+		reg: regInfo{
+			inputs: []inputInfo{
+				{0, 1072693240}, // R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R18 R19 R20 g R23 R24 R25 R26 R27 R28 R29 R31
+				{1, 1072693240}, // R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R18 R19 R20 g R23 R24 R25 R26 R27 R28 R29 R31
+			},
+			outputs: []outputInfo{
+				{0, 1070596088}, // R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R18 R19 R20 R23 R24 R25 R26 R27 R28 R29 R31
 			},
 		},
 	},
@@ -24506,7 +24591,7 @@
 	},
 	{
 		name:              "LoweredGetCallerSP",
-		argLen:            0,
+		argLen:            1,
 		rematerializeable: true,
 		reg: regInfo{
 			outputs: []outputInfo{
@@ -24526,16 +24611,14 @@
 	},
 	{
 		name:         "LoweredWB",
-		auxType:      auxSym,
-		argLen:       3,
+		auxType:      auxInt64,
+		argLen:       1,
 		clobberFlags: true,
-		symEffect:    SymNone,
 		reg: regInfo{
-			inputs: []inputInfo{
-				{0, 67108864},  // R27
-				{1, 134217728}, // R28
-			},
 			clobbers: 4611686017353646082, // R1 F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 F16 F17 F18 F19 F20 F21 F22 F23 F24 F25 F26 F27 F28 F29 F30 F31
+			outputs: []outputInfo{
+				{0, 268435456}, // R29
+			},
 		},
 	},
 	{
@@ -24981,6 +25064,19 @@
 		},
 	},
 	{
+		name:   "ABSD",
+		argLen: 1,
+		asm:    mips.AABSD,
+		reg: regInfo{
+			inputs: []inputInfo{
+				{0, 35183835217920}, // F0 F2 F4 F6 F8 F10 F12 F14 F16 F18 F20 F22 F24 F26 F28 F30
+			},
+			outputs: []outputInfo{
+				{0, 35183835217920}, // F0 F2 F4 F6 F8 F10 F12 F14 F16 F18 F20 F22 F24 F26 F28 F30
+			},
+		},
+	},
+	{
 		name:   "SQRTD",
 		argLen: 1,
 		asm:    mips.ASQRTD,
@@ -25525,6 +25621,32 @@
 		},
 	},
 	{
+		name:   "MOVWfpgp",
+		argLen: 1,
+		asm:    mips.AMOVW,
+		reg: regInfo{
+			inputs: []inputInfo{
+				{0, 35183835217920}, // F0 F2 F4 F6 F8 F10 F12 F14 F16 F18 F20 F22 F24 F26 F28 F30
+			},
+			outputs: []outputInfo{
+				{0, 335544318}, // R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R18 R19 R20 R21 R22 R24 R25 R28 R31
+			},
+		},
+	},
+	{
+		name:   "MOVWgpfp",
+		argLen: 1,
+		asm:    mips.AMOVW,
+		reg: regInfo{
+			inputs: []inputInfo{
+				{0, 335544318}, // R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R18 R19 R20 R21 R22 R24 R25 R28 R31
+			},
+			outputs: []outputInfo{
+				{0, 35183835217920}, // F0 F2 F4 F6 F8 F10 F12 F14 F16 F18 F20 F22 F24 F26 F28 F30
+			},
+		},
+	},
+	{
 		name:   "MOVBreg",
 		argLen: 1,
 		asm:    mips.AMOVB,
@@ -25986,7 +26108,7 @@
 	},
 	{
 		name:              "LoweredGetCallerSP",
-		argLen:            0,
+		argLen:            1,
 		rematerializeable: true,
 		reg: regInfo{
 			outputs: []outputInfo{
@@ -26006,16 +26128,14 @@
 	},
 	{
 		name:         "LoweredWB",
-		auxType:      auxSym,
-		argLen:       3,
+		auxType:      auxInt64,
+		argLen:       1,
 		clobberFlags: true,
-		symEffect:    SymNone,
 		reg: regInfo{
-			inputs: []inputInfo{
-				{0, 1048576}, // R20
-				{1, 2097152}, // R21
-			},
 			clobbers: 140737219919872, // R31 F0 F2 F4 F6 F8 F10 F12 F14 F16 F18 F20 F22 F24 F26 F28 F30 HI LO
+			outputs: []outputInfo{
+				{0, 16777216}, // R25
+			},
 		},
 	},
 	{
@@ -26484,6 +26604,19 @@
 		},
 	},
 	{
+		name:   "ABSD",
+		argLen: 1,
+		asm:    mips.AABSD,
+		reg: regInfo{
+			inputs: []inputInfo{
+				{0, 1152921504338411520}, // F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 F16 F17 F18 F19 F20 F21 F22 F23 F24 F25 F26 F27 F28 F29 F30 F31
+			},
+			outputs: []outputInfo{
+				{0, 1152921504338411520}, // F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 F16 F17 F18 F19 F20 F21 F22 F23 F24 F25 F26 F27 F28 F29 F30 F31
+			},
+		},
+	},
+	{
 		name:   "SQRTD",
 		argLen: 1,
 		asm:    mips.ASQRTD,
@@ -27048,6 +27181,58 @@
 		},
 	},
 	{
+		name:   "MOVWfpgp",
+		argLen: 1,
+		asm:    mips.AMOVW,
+		reg: regInfo{
+			inputs: []inputInfo{
+				{0, 1152921504338411520}, // F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 F16 F17 F18 F19 F20 F21 F22 F23 F24 F25 F26 F27 F28 F29 F30 F31
+			},
+			outputs: []outputInfo{
+				{0, 167772158}, // R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R18 R19 R20 R21 R22 R24 R25 R31
+			},
+		},
+	},
+	{
+		name:   "MOVWgpfp",
+		argLen: 1,
+		asm:    mips.AMOVW,
+		reg: regInfo{
+			inputs: []inputInfo{
+				{0, 167772158}, // R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R18 R19 R20 R21 R22 R24 R25 R31
+			},
+			outputs: []outputInfo{
+				{0, 1152921504338411520}, // F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 F16 F17 F18 F19 F20 F21 F22 F23 F24 F25 F26 F27 F28 F29 F30 F31
+			},
+		},
+	},
+	{
+		name:   "MOVVfpgp",
+		argLen: 1,
+		asm:    mips.AMOVV,
+		reg: regInfo{
+			inputs: []inputInfo{
+				{0, 1152921504338411520}, // F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 F16 F17 F18 F19 F20 F21 F22 F23 F24 F25 F26 F27 F28 F29 F30 F31
+			},
+			outputs: []outputInfo{
+				{0, 167772158}, // R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R18 R19 R20 R21 R22 R24 R25 R31
+			},
+		},
+	},
+	{
+		name:   "MOVVgpfp",
+		argLen: 1,
+		asm:    mips.AMOVV,
+		reg: regInfo{
+			inputs: []inputInfo{
+				{0, 167772158}, // R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R18 R19 R20 R21 R22 R24 R25 R31
+			},
+			outputs: []outputInfo{
+				{0, 1152921504338411520}, // F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 F16 F17 F18 F19 F20 F21 F22 F23 F24 F25 F26 F27 F28 F29 F30 F31
+			},
+		},
+	},
+	{
 		name:   "MOVBreg",
 		argLen: 1,
 		asm:    mips.AMOVB,
@@ -27386,6 +27571,34 @@
 		},
 	},
 	{
+		name:           "LoweredAtomicAnd32",
+		argLen:         3,
+		faultOnNilArg0: true,
+		hasSideEffects: true,
+		unsafePoint:    true,
+		asm:            mips.AAND,
+		reg: regInfo{
+			inputs: []inputInfo{
+				{1, 234881022},           // R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R18 R19 R20 R21 R22 R24 R25 g R31
+				{0, 4611686018695823358}, // R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R18 R19 R20 R21 R22 R24 R25 SP g R31 SB
+			},
+		},
+	},
+	{
+		name:           "LoweredAtomicOr32",
+		argLen:         3,
+		faultOnNilArg0: true,
+		hasSideEffects: true,
+		unsafePoint:    true,
+		asm:            mips.AOR,
+		reg: regInfo{
+			inputs: []inputInfo{
+				{1, 234881022},           // R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R18 R19 R20 R21 R22 R24 R25 g R31
+				{0, 4611686018695823358}, // R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R18 R19 R20 R21 R22 R24 R25 SP g R31 SB
+			},
+		},
+	},
+	{
 		name:           "LoweredAtomicLoad8",
 		argLen:         2,
 		faultOnNilArg0: true,
@@ -27661,7 +27874,7 @@
 	},
 	{
 		name:              "LoweredGetCallerSP",
-		argLen:            0,
+		argLen:            1,
 		rematerializeable: true,
 		reg: regInfo{
 			outputs: []outputInfo{
@@ -27681,16 +27894,14 @@
 	},
 	{
 		name:         "LoweredWB",
-		auxType:      auxSym,
-		argLen:       3,
+		auxType:      auxInt64,
+		argLen:       1,
 		clobberFlags: true,
-		symEffect:    SymNone,
 		reg: regInfo{
-			inputs: []inputInfo{
-				{0, 1048576}, // R20
-				{1, 2097152}, // R21
-			},
 			clobbers: 4611686018293170176, // R31 F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 F16 F17 F18 F19 F20 F21 F22 F23 F24 F25 F26 F27 F28 F29 F30 F31 HI LO
+			outputs: []outputInfo{
+				{0, 16777216}, // R25
+			},
 		},
 	},
 	{
@@ -29013,6 +29224,45 @@
 		},
 	},
 	{
+		name:   "BRD",
+		argLen: 1,
+		asm:    ppc64.ABRD,
+		reg: regInfo{
+			inputs: []inputInfo{
+				{0, 1073733630}, // SP SB R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R14 R15 R16 R17 R18 R19 R20 R21 R22 R23 R24 R25 R26 R27 R28 R29
+			},
+			outputs: []outputInfo{
+				{0, 1073733624}, // R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R14 R15 R16 R17 R18 R19 R20 R21 R22 R23 R24 R25 R26 R27 R28 R29
+			},
+		},
+	},
+	{
+		name:   "BRW",
+		argLen: 1,
+		asm:    ppc64.ABRW,
+		reg: regInfo{
+			inputs: []inputInfo{
+				{0, 1073733630}, // SP SB R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R14 R15 R16 R17 R18 R19 R20 R21 R22 R23 R24 R25 R26 R27 R28 R29
+			},
+			outputs: []outputInfo{
+				{0, 1073733624}, // R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R14 R15 R16 R17 R18 R19 R20 R21 R22 R23 R24 R25 R26 R27 R28 R29
+			},
+		},
+	},
+	{
+		name:   "BRH",
+		argLen: 1,
+		asm:    ppc64.ABRH,
+		reg: regInfo{
+			inputs: []inputInfo{
+				{0, 1073733630}, // SP SB R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R14 R15 R16 R17 R18 R19 R20 R21 R22 R23 R24 R25 R26 R27 R28 R29
+			},
+			outputs: []outputInfo{
+				{0, 1073733624}, // R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R14 R15 R16 R17 R18 R19 R20 R21 R22 R23 R24 R25 R26 R27 R28 R29
+			},
+		},
+	},
+	{
 		name:   "FNEG",
 		argLen: 1,
 		asm:    ppc64.AFNEG,
@@ -29362,10 +29612,8 @@
 	},
 	{
 		name:           "MOVDBRload",
-		auxType:        auxSymOff,
 		argLen:         2,
 		faultOnNilArg0: true,
-		symEffect:      SymRead,
 		asm:            ppc64.AMOVDBR,
 		reg: regInfo{
 			inputs: []inputInfo{
@@ -29378,10 +29626,8 @@
 	},
 	{
 		name:           "MOVWBRload",
-		auxType:        auxSymOff,
 		argLen:         2,
 		faultOnNilArg0: true,
-		symEffect:      SymRead,
 		asm:            ppc64.AMOVWBR,
 		reg: regInfo{
 			inputs: []inputInfo{
@@ -29394,10 +29640,8 @@
 	},
 	{
 		name:           "MOVHBRload",
-		auxType:        auxSymOff,
 		argLen:         2,
 		faultOnNilArg0: true,
-		symEffect:      SymRead,
 		asm:            ppc64.AMOVHBR,
 		reg: regInfo{
 			inputs: []inputInfo{
@@ -29576,10 +29820,8 @@
 	},
 	{
 		name:           "MOVDBRstore",
-		auxType:        auxSym,
 		argLen:         3,
 		faultOnNilArg0: true,
-		symEffect:      SymWrite,
 		asm:            ppc64.AMOVDBR,
 		reg: regInfo{
 			inputs: []inputInfo{
@@ -29590,10 +29832,8 @@
 	},
 	{
 		name:           "MOVWBRstore",
-		auxType:        auxSym,
 		argLen:         3,
 		faultOnNilArg0: true,
-		symEffect:      SymWrite,
 		asm:            ppc64.AMOVWBR,
 		reg: regInfo{
 			inputs: []inputInfo{
@@ -29604,10 +29844,8 @@
 	},
 	{
 		name:           "MOVHBRstore",
-		auxType:        auxSym,
 		argLen:         3,
 		faultOnNilArg0: true,
-		symEffect:      SymWrite,
 		asm:            ppc64.AMOVHBR,
 		reg: regInfo{
 			inputs: []inputInfo{
@@ -30059,7 +30297,7 @@
 		},
 	},
 	{
-		name:    "ISELB",
+		name:    "ISELZ",
 		auxType: auxInt32,
 		argLen:  2,
 		asm:     ppc64.AISEL,
@@ -30073,14 +30311,22 @@
 		},
 	},
 	{
-		name:    "ISELZ",
+		name:    "SETBC",
 		auxType: auxInt32,
-		argLen:  2,
-		asm:     ppc64.AISEL,
+		argLen:  1,
+		asm:     ppc64.ASETBC,
 		reg: regInfo{
-			inputs: []inputInfo{
+			outputs: []outputInfo{
 				{0, 1073733624}, // R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R14 R15 R16 R17 R18 R19 R20 R21 R22 R23 R24 R25 R26 R27 R28 R29
 			},
+		},
+	},
+	{
+		name:    "SETBCR",
+		auxType: auxInt32,
+		argLen:  1,
+		asm:     ppc64.ASETBCR,
+		reg: regInfo{
 			outputs: []outputInfo{
 				{0, 1073733624}, // R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R14 R15 R16 R17 R18 R19 R20 R21 R22 R23 R24 R25 R26 R27 R28 R29
 			},
@@ -30188,7 +30434,7 @@
 	},
 	{
 		name:              "LoweredGetCallerSP",
-		argLen:            0,
+		argLen:            1,
 		rematerializeable: true,
 		reg: regInfo{
 			outputs: []outputInfo{
@@ -30666,16 +30912,14 @@
 	},
 	{
 		name:         "LoweredWB",
-		auxType:      auxSym,
-		argLen:       3,
+		auxType:      auxInt64,
+		argLen:       1,
 		clobberFlags: true,
-		symEffect:    SymNone,
 		reg: regInfo{
-			inputs: []inputInfo{
-				{0, 1048576}, // R20
-				{1, 2097152}, // R21
-			},
 			clobbers: 18446744072632408064, // R11 R12 R18 R19 R22 R23 R24 R25 R26 R27 R28 R29 R31 F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 F16 F17 F18 F19 F20 F21 F22 F23 F24 F25 F26 F27 F28 F29 F30 XER
+			outputs: []outputInfo{
+				{0, 536870912}, // R29
+			},
 		},
 	},
 	{
@@ -31046,7 +31290,7 @@
 		auxType:           auxSymOff,
 		argLen:            1,
 		rematerializeable: true,
-		symEffect:         SymRdWr,
+		symEffect:         SymAddr,
 		asm:               riscv.AMOV,
 		reg: regInfo{
 			inputs: []inputInfo{
@@ -31995,7 +32239,7 @@
 	},
 	{
 		name:              "LoweredGetCallerSP",
-		argLen:            0,
+		argLen:            1,
 		rematerializeable: true,
 		reg: regInfo{
 			outputs: []outputInfo{
@@ -32015,16 +32259,14 @@
 	},
 	{
 		name:         "LoweredWB",
-		auxType:      auxSym,
-		argLen:       3,
+		auxType:      auxInt64,
+		argLen:       1,
 		clobberFlags: true,
-		symEffect:    SymNone,
 		reg: regInfo{
-			inputs: []inputInfo{
-				{0, 16}, // X5
-				{1, 32}, // X6
-			},
 			clobbers: 9223372034707292160, // F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 F16 F17 F18 F19 F20 F21 F22 F23 F24 F25 F26 F27 F28 F29 F30 F31
+			outputs: []outputInfo{
+				{0, 8388608}, // X24
+			},
 		},
 	},
 	{
@@ -34770,7 +35012,7 @@
 		auxType:           auxSymOff,
 		argLen:            1,
 		rematerializeable: true,
-		symEffect:         SymRead,
+		symEffect:         SymAddr,
 		reg: regInfo{
 			inputs: []inputInfo{
 				{0, 4295000064}, // SP SB
@@ -34784,7 +35026,7 @@
 		name:      "MOVDaddridx",
 		auxType:   auxSymOff,
 		argLen:    2,
-		symEffect: SymRead,
+		symEffect: SymAddr,
 		reg: regInfo{
 			inputs: []inputInfo{
 				{0, 4295000064}, // SP SB
@@ -35510,7 +35752,7 @@
 	},
 	{
 		name:              "LoweredGetCallerSP",
-		argLen:            0,
+		argLen:            1,
 		rematerializeable: true,
 		reg: regInfo{
 			outputs: []outputInfo{
@@ -35570,16 +35812,14 @@
 	},
 	{
 		name:         "LoweredWB",
-		auxType:      auxSym,
-		argLen:       3,
+		auxType:      auxInt64,
+		argLen:       1,
 		clobberFlags: true,
-		symEffect:    SymNone,
 		reg: regInfo{
-			inputs: []inputInfo{
-				{0, 4}, // R2
-				{1, 8}, // R3
-			},
 			clobbers: 4294918146, // R1 R14 F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15
+			outputs: []outputInfo{
+				{0, 512}, // R9
+			},
 		},
 	},
 	{
@@ -36219,7 +36459,7 @@
 	},
 	{
 		name:              "LoweredGetCallerSP",
-		argLen:            0,
+		argLen:            1,
 		rematerializeable: true,
 		reg: regInfo{
 			outputs: []outputInfo{
@@ -36239,14 +36479,13 @@
 		},
 	},
 	{
-		name:      "LoweredWB",
-		auxType:   auxSym,
-		argLen:    3,
-		symEffect: SymNone,
+		name:    "LoweredWB",
+		auxType: auxInt64,
+		argLen:  1,
 		reg: regInfo{
-			inputs: []inputInfo{
+			clobbers: 844424930131967, // R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 F16 F17 F18 F19 F20 F21 F22 F23 F24 F25 F26 F27 F28 F29 F30 F31 g
+			outputs: []outputInfo{
 				{0, 65535}, // R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15
-				{1, 65535}, // R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15
 			},
 		},
 	},
@@ -38564,6 +38803,11 @@
 		generic: true,
 	},
 	{
+		name:    "Bswap16",
+		argLen:  1,
+		generic: true,
+	},
+	{
 		name:    "Bswap32",
 		argLen:  1,
 		generic: true,
@@ -38819,6 +39063,12 @@
 		generic:   true,
 	},
 	{
+		name:      "SPanchored",
+		argLen:    2,
+		zeroWidth: true,
+		generic:   true,
+	},
+	{
 		name:    "Load",
 		argLen:  2,
 		generic: true,
@@ -38865,11 +39115,15 @@
 		generic: true,
 	},
 	{
-		name:      "WB",
-		auxType:   auxSym,
-		argLen:    3,
-		symEffect: SymNone,
-		generic:   true,
+		name:    "WBend",
+		argLen:  1,
+		generic: true,
+	},
+	{
+		name:    "WB",
+		auxType: auxInt64,
+		argLen:  1,
+		generic: true,
 	},
 	{
 		name:      "HasCPUFeature",
@@ -39141,7 +39395,7 @@
 	},
 	{
 		name:    "GetCallerSP",
-		argLen:  0,
+		argLen:  1,
 		generic: true,
 	},
 	{
diff --git a/src/cmd/compile/internal/ssa/poset.go b/src/cmd/compile/internal/ssa/poset.go
index ad89de3..fd2887d 100644
--- a/src/cmd/compile/internal/ssa/poset.go
+++ b/src/cmd/compile/internal/ssa/poset.go
@@ -56,7 +56,7 @@
 )
 
 // posetUndo represents an undo pass to be performed.
-// It's an union of fields that can be used to store information,
+// It's a union of fields that can be used to store information,
 // and typ is the discriminant, that specifies which kind
 // of operation must be performed. Not all fields are always used.
 type posetUndo struct {
@@ -964,7 +964,7 @@
 		return false
 	}
 
-	// Check if we recored inequality
+	// Check if we recorded inequality
 	if po.isnoneq(i1, i2) {
 		return true
 	}
@@ -1166,7 +1166,7 @@
 		}
 
 		// If we already knew that n1<=n2, we can collapse the path to
-		// record n1==n2 (and viceversa).
+		// record n1==n2 (and vice versa).
 		if po.reaches(i1, i2, false) {
 			return po.collapsepath(n1, n2)
 		}
diff --git a/src/cmd/compile/internal/ssa/prove.go b/src/cmd/compile/internal/ssa/prove.go
index 9ecd335..38758c3 100644
--- a/src/cmd/compile/internal/ssa/prove.go
+++ b/src/cmd/compile/internal/ssa/prove.go
@@ -802,6 +802,7 @@
 	ft.checkpoint()
 
 	var lensVars map[*Block][]*Value
+	var logicVars map[*Block][]*Value
 
 	// Find length and capacity ops.
 	for _, b := range f.Blocks {
@@ -856,6 +857,33 @@
 			case OpAnd64, OpAnd32, OpAnd16, OpAnd8:
 				ft.update(b, v, v.Args[1], unsigned, lt|eq)
 				ft.update(b, v, v.Args[0], unsigned, lt|eq)
+				for i := 0; i < 2; i++ {
+					if isNonNegative(v.Args[i]) {
+						ft.update(b, v, v.Args[i], signed, lt|eq)
+						ft.update(b, v, ft.zero, signed, gt|eq)
+					}
+				}
+				if logicVars == nil {
+					logicVars = make(map[*Block][]*Value)
+				}
+				logicVars[b] = append(logicVars[b], v)
+			case OpOr64, OpOr32, OpOr16, OpOr8:
+				// TODO: investigate how to always add facts without much slowdown, see issue #57959.
+				if v.Args[0].isGenericIntConst() {
+					ft.update(b, v, v.Args[0], unsigned, gt|eq)
+				}
+				if v.Args[1].isGenericIntConst() {
+					ft.update(b, v, v.Args[1], unsigned, gt|eq)
+				}
+			case OpDiv64u, OpDiv32u, OpDiv16u, OpDiv8u,
+				OpRsh8Ux64, OpRsh8Ux32, OpRsh8Ux16, OpRsh8Ux8,
+				OpRsh16Ux64, OpRsh16Ux32, OpRsh16Ux16, OpRsh16Ux8,
+				OpRsh32Ux64, OpRsh32Ux32, OpRsh32Ux16, OpRsh32Ux8,
+				OpRsh64Ux64, OpRsh64Ux32, OpRsh64Ux16, OpRsh64Ux8:
+				ft.update(b, v, v.Args[0], unsigned, lt|eq)
+			case OpMod64u, OpMod32u, OpMod16u, OpMod8u:
+				ft.update(b, v, v.Args[0], unsigned, lt|eq)
+				ft.update(b, v, v.Args[1], unsigned, lt)
 			case OpPhi:
 				// Determine the min and max value of OpPhi composed entirely of integer constants.
 				//
@@ -899,7 +927,7 @@
 				}
 				// One might be tempted to create a v >= ft.zero relation for
 				// all OpPhi's composed of only provably-positive values
-				// but that bloats up the facts table for a very neglible gain.
+				// but that bloats up the facts table for a very negligible gain.
 				// In Go itself, very few functions get improved (< 5) at a cost of 5-7% total increase
 				// of compile time.
 			}
@@ -973,6 +1001,21 @@
 
 			if branch != unknown {
 				addBranchRestrictions(ft, parent, branch)
+				// After we add the branch restriction, re-check the logic operations in the parent block,
+				// it may give us more info to omit some branches
+				if logic, ok := logicVars[parent]; ok {
+					for _, v := range logic {
+						// we only have OpAnd for now
+						ft.update(parent, v, v.Args[1], unsigned, lt|eq)
+						ft.update(parent, v, v.Args[0], unsigned, lt|eq)
+						for i := 0; i < 2; i++ {
+							if isNonNegative(v.Args[i]) {
+								ft.update(parent, v, v.Args[i], signed, lt|eq)
+								ft.update(parent, v, ft.zero, signed, gt|eq)
+							}
+						}
+					}
+				}
 				if ft.unsat {
 					// node.block is unreachable.
 					// Remove it and don't visit
@@ -1152,7 +1195,7 @@
 func addRestrictions(parent *Block, ft *factsTable, t domain, v, w *Value, r relation) {
 	if t == 0 {
 		// Trivial case: nothing to do.
-		// Shoult not happen, but just in case.
+		// Should not happen, but just in case.
 		return
 	}
 	for i := domain(1); i <= t; i <<= 1 {
diff --git a/src/cmd/compile/internal/ssa/regalloc.go b/src/cmd/compile/internal/ssa/regalloc.go
index 294c522..c4d6e48 100644
--- a/src/cmd/compile/internal/ssa/regalloc.go
+++ b/src/cmd/compile/internal/ssa/regalloc.go
@@ -272,6 +272,9 @@
 	// mask of registers currently in use
 	used regMask
 
+	// mask of registers used since the start of the current block
+	usedSinceBlockStart regMask
+
 	// mask of registers used in the current instruction
 	tmpused regMask
 
@@ -289,6 +292,11 @@
 	// saved state does not include the state of phi ops in the block.
 	startRegs [][]startReg
 
+	// startRegsMask is a mask of the registers in startRegs[curBlock.ID].
+	// Registers dropped from startRegsMask are later synchronoized back to
+	// startRegs by dropping from there as well.
+	startRegsMask regMask
+
 	// spillLive[blockid] is the set of live spills at the end of each block
 	spillLive [][]ID
 
@@ -406,7 +414,9 @@
 
 	// Pick an unused register if one is available.
 	if mask&^s.used != 0 {
-		return pickReg(mask &^ s.used)
+		r := pickReg(mask &^ s.used)
+		s.usedSinceBlockStart |= regMask(1) << r
+		return r
 	}
 
 	// Pick a value to spill. Spill the value with the
@@ -450,6 +460,7 @@
 	v2 := s.regs[r].v
 	m := s.compatRegs(v2.Type) &^ s.used &^ s.tmpused &^ (regMask(1) << r)
 	if m != 0 && !s.values[v2.ID].rematerializeable && countRegs(s.values[v2.ID].regs) == 1 {
+		s.usedSinceBlockStart |= regMask(1) << r
 		r2 := pickReg(m)
 		c := s.curBlock.NewValue1(v2.Pos, OpCopy, v2.Type, s.regs[r].c)
 		s.copies[c] = false
@@ -459,7 +470,21 @@
 		s.setOrig(c, v2)
 		s.assignReg(r2, v2, c)
 	}
+
+	// If the evicted register isn't used between the start of the block
+	// and now then there is no reason to even request it on entry. We can
+	// drop from startRegs in that case.
+	if s.usedSinceBlockStart&(regMask(1)<<r) == 0 {
+		if s.startRegsMask&(regMask(1)<<r) == 1 {
+			if s.f.pass.debug > regDebug {
+				fmt.Printf("dropped from startRegs: %s\n", &s.registers[r])
+			}
+			s.startRegsMask &^= regMask(1) << r
+		}
+	}
+
 	s.freeReg(r)
+	s.usedSinceBlockStart |= regMask(1) << r
 	return r
 }
 
@@ -513,6 +538,7 @@
 		if nospill {
 			s.nospill |= regMask(1) << r
 		}
+		s.usedSinceBlockStart |= regMask(1) << r
 		return s.regs[r].c
 	}
 
@@ -532,6 +558,7 @@
 		if s.regs[r2].v != v {
 			panic("bad register state")
 		}
+		s.usedSinceBlockStart |= regMask(1) << r2
 		c = s.curBlock.NewValue1(pos, OpCopy, v.Type, s.regs[r2].c)
 	} else if v.rematerializeable() {
 		// Rematerialize instead of loading from the spill location.
@@ -575,6 +602,11 @@
 	return true
 }
 
+// needRegister reports whether v needs a register.
+func (v *Value) needRegister() bool {
+	return !v.Type.IsMemory() && !v.Type.IsVoid() && !v.Type.IsFlags() && !v.Type.IsTuple()
+}
+
 func (s *regAllocState) init(f *Func) {
 	s.f = f
 	s.f.RegAlloc = s.f.Cache.locs[:0]
@@ -675,7 +707,7 @@
 	s.copies = make(map[*Value]bool)
 	for _, b := range s.visitOrder {
 		for _, v := range b.Values {
-			if !v.Type.IsMemory() && !v.Type.IsVoid() && !v.Type.IsFlags() && !v.Type.IsTuple() {
+			if v.needRegister() {
 				s.values[v.ID].needReg = true
 				s.values[v.ID].rematerializeable = v.rematerializeable()
 				s.orig[v.ID] = v
@@ -882,6 +914,8 @@
 			fmt.Printf("Begin processing block %v\n", b)
 		}
 		s.curBlock = b
+		s.startRegsMask = 0
+		s.usedSinceBlockStart = 0
 
 		// Initialize regValLiveSet and uses fields for this block.
 		// Walk backwards through the block doing liveness analysis.
@@ -1173,6 +1207,7 @@
 					continue
 				}
 				regList = append(regList, startReg{r, v, s.regs[r].c, s.values[v.ID].uses.pos})
+				s.startRegsMask |= regMask(1) << r
 			}
 			s.startRegs[b.ID] = make([]startReg, len(regList))
 			copy(s.startRegs[b.ID], regList)
@@ -1544,6 +1579,7 @@
 						}
 					}
 				}
+
 				// Avoid future fixed uses if we can.
 				if m&^desired.avoid != 0 {
 					m &^= desired.avoid
@@ -1551,6 +1587,21 @@
 				// Save input 0 to a new register so we can clobber it.
 				c := s.allocValToReg(v.Args[0], m, true, v.Pos)
 				s.copies[c] = false
+
+				// Normally we use the register of the old copy of input 0 as the target.
+				// However, if input 0 is already in its desired register then we use
+				// the register of the new copy instead.
+				if regspec.outputs[0].regs>>s.f.getHome(c.ID).(*Register).num&1 != 0 {
+					if rp, ok := s.f.getHome(args[0].ID).(*Register); ok {
+						r := register(rp.num)
+						for _, r2 := range dinfo[idx].in[0] {
+							if r == r2 {
+								args[0] = c
+								break
+							}
+						}
+					}
+				}
 			}
 
 		ok:
@@ -1642,7 +1693,7 @@
 						}
 					}
 					// Avoid registers we're saving for other values.
-					if mask&^desired.avoid&^s.nospill != 0 {
+					if mask&^desired.avoid&^s.nospill&^s.used != 0 {
 						mask &^= desired.avoid
 					}
 					r := s.allocReg(mask, v)
@@ -1862,6 +1913,23 @@
 			u.next = s.freeUseRecords
 			s.freeUseRecords = u
 		}
+
+		// allocReg may have dropped registers from startRegsMask that
+		// aren't actually needed in startRegs. Synchronize back to
+		// startRegs.
+		//
+		// This must be done before placing spills, which will look at
+		// startRegs to decide if a block is a valid block for a spill.
+		if c := countRegs(s.startRegsMask); c != len(s.startRegs[b.ID]) {
+			regs := make([]startReg, 0, c)
+			for _, sr := range s.startRegs[b.ID] {
+				if s.startRegsMask&(regMask(1)<<sr.r) == 0 {
+					continue
+				}
+				regs = append(regs, sr)
+			}
+			s.startRegs[b.ID] = regs
+		}
 	}
 
 	// Decide where the spills we generated will go.
diff --git a/src/cmd/compile/internal/ssa/rewrite.go b/src/cmd/compile/internal/ssa/rewrite.go
index f4ac97c..43843bd 100644
--- a/src/cmd/compile/internal/ssa/rewrite.go
+++ b/src/cmd/compile/internal/ssa/rewrite.go
@@ -7,6 +7,7 @@
 import (
 	"cmd/compile/internal/base"
 	"cmd/compile/internal/logopt"
+	"cmd/compile/internal/reflectdata"
 	"cmd/compile/internal/types"
 	"cmd/internal/obj"
 	"cmd/internal/obj/s390x"
@@ -14,11 +15,13 @@
 	"cmd/internal/src"
 	"encoding/binary"
 	"fmt"
+	"internal/buildcfg"
 	"io"
 	"math"
 	"math/bits"
 	"os"
 	"path/filepath"
+	"strings"
 )
 
 type deadValueChoice bool
@@ -235,10 +238,6 @@
 	return t.IsPtrShaped()
 }
 
-func isSigned(t *types.Type) bool {
-	return t.IsSigned()
-}
-
 // mergeSym merges two symbolic offsets. There is no real merging of
 // offsets, we just pick the non-nil one.
 func mergeSym(x, y Sym) Sym {
@@ -729,6 +728,13 @@
 	CanBeAnSSAAux()
 }
 
+// for now only used to mark moves that need to avoid clobbering flags
+type auxMark bool
+
+func (auxMark) CanBeAnSSAAux() {}
+
+var AuxMark auxMark
+
 // stringAux wraps string values for use in Aux.
 type stringAux string
 
@@ -796,25 +802,6 @@
 	return nil
 }
 
-// de-virtualize an InterLECall
-// 'sym' is the symbol for the itab.
-func devirtLESym(v *Value, aux Aux, sym Sym, offset int64) *obj.LSym {
-	n, ok := sym.(*obj.LSym)
-	if !ok {
-		return nil
-	}
-
-	lsym := loadLSymOffset(n, offset)
-	if f := v.Block.Func; f.pass.debug > 0 {
-		if lsym != nil {
-			f.Warnl(v.Pos, "de-virtualizing call")
-		} else {
-			f.Warnl(v.Pos, "couldn't de-virtualize call")
-		}
-	}
-	return lsym
-}
-
 func devirtLECall(v *Value, sym *obj.LSym) *Value {
 	v.Op = OpStaticLECall
 	auxcall := v.Aux.(*AuxCall)
@@ -824,6 +811,9 @@
 	copy(v.Args[0:], v.Args[1:])
 	v.Args[len(v.Args)-1] = nil // aid GC
 	v.Args = v.Args[:len(v.Args)-1]
+	if f := v.Block.Func; f.pass.debug > 0 {
+		f.Warnl(v.Pos, "de-virtualizing call")
+	}
 	return v
 }
 
@@ -839,9 +829,7 @@
 	case OpOffPtr:
 		return p1.AuxInt == p2.AuxInt && isSamePtr(p1.Args[0], p2.Args[0])
 	case OpAddr, OpLocalAddr:
-		// OpAddr's 0th arg is either OpSP or OpSB, which means that it is uniquely identified by its Op.
-		// Checking for value equality only works after [z]cse has run.
-		return p1.Aux == p2.Aux && p1.Args[0].Op == p2.Args[0].Op
+		return p1.Aux == p2.Aux
 	case OpAddPtr:
 		return p1.Args[1] == p2.Args[1] && isSamePtr(p1.Args[0], p2.Args[0])
 	}
@@ -1360,6 +1348,21 @@
 	return false
 }
 
+func isInlinableMemclr(c *Config, sz int64) bool {
+	if sz < 0 {
+		return false
+	}
+	// TODO: expand this check to allow other architectures
+	// see CL 454255 and issue 56997
+	switch c.arch {
+	case "amd64", "arm64":
+		return true
+	case "ppc64le", "ppc64":
+		return sz < 512
+	}
+	return false
+}
+
 // isInlinableMemmove reports whether the given arch performs a Move of the given size
 // faster than memmove. It will only return true if replacing the memmove with a Move is
 // safe, either because Move will do all of its loads before any of its stores, or
@@ -1418,6 +1421,12 @@
 	}
 }
 
+func supportsPPC64PCRel() bool {
+	// PCRel is currently supported for >= power10, linux only
+	// Internal and external linking supports this on ppc64le; internal linking on ppc64.
+	return buildcfg.GOPPC64 >= 10 && buildcfg.GOOS == "linux"
+}
+
 func newPPC64ShiftAuxInt(sh, mb, me, sz int64) int32 {
 	if sh < 0 || sh >= sz {
 		panic("PPC64 shift arg sh out of range")
@@ -1542,7 +1551,7 @@
 // Return the encoded RLWINM constant, or 0 if they cannot be merged.
 func mergePPC64ClrlsldiSrw(sld, srw int64) int64 {
 	mask_1 := uint64(0xFFFFFFFF >> uint(srw))
-	// for CLRLSLDI, it's more convient to think of it as a mask left bits then rotate left.
+	// for CLRLSLDI, it's more convenient to think of it as a mask left bits then rotate left.
 	mask_2 := uint64(0xFFFFFFFFFFFFFFFF) >> uint(GetPPC64Shiftmb(int64(sld)))
 
 	// Rewrite mask to apply after the final left shift.
@@ -1562,7 +1571,7 @@
 // the encoded RLWINM constant, or 0 if they cannot be merged.
 func mergePPC64ClrlsldiRlwinm(sld int32, rlw int64) int64 {
 	r_1, _, _, mask_1 := DecodePPC64RotateMask(rlw)
-	// for CLRLSLDI, it's more convient to think of it as a mask left bits then rotate left.
+	// for CLRLSLDI, it's more convenient to think of it as a mask left bits then rotate left.
 	mask_2 := uint64(0xFFFFFFFFFFFFFFFF) >> uint(GetPPC64Shiftmb(int64(sld)))
 
 	// combine the masks, and adjust for the final left shift.
@@ -1723,6 +1732,77 @@
 	return true
 }
 
+// isFixed32 returns true if the int32 at offset off in symbol sym
+// is known and constant.
+func isFixed32(c *Config, sym Sym, off int64) bool {
+	return isFixed(c, sym, off, 4)
+}
+
+// isFixed returns true if the range [off,off+size] of the symbol sym
+// is known and constant.
+func isFixed(c *Config, sym Sym, off, size int64) bool {
+	lsym := sym.(*obj.LSym)
+	if lsym.Extra == nil {
+		return false
+	}
+	if _, ok := (*lsym.Extra).(*obj.TypeInfo); ok {
+		if off == 2*c.PtrSize && size == 4 {
+			return true // type hash field
+		}
+	}
+	return false
+}
+func fixed32(c *Config, sym Sym, off int64) int32 {
+	lsym := sym.(*obj.LSym)
+	if ti, ok := (*lsym.Extra).(*obj.TypeInfo); ok {
+		if off == 2*c.PtrSize {
+			return int32(types.TypeHash(ti.Type.(*types.Type)))
+		}
+	}
+	base.Fatalf("fixed32 data not known for %s:%d", sym, off)
+	return 0
+}
+
+// isFixedSym returns true if the contents of sym at the given offset
+// is known and is the constant address of another symbol.
+func isFixedSym(sym Sym, off int64) bool {
+	lsym := sym.(*obj.LSym)
+	switch {
+	case lsym.Type == objabi.SRODATA:
+		// itabs, dictionaries
+	default:
+		return false
+	}
+	for _, r := range lsym.R {
+		if (r.Type == objabi.R_ADDR || r.Type == objabi.R_WEAKADDR) && int64(r.Off) == off && r.Add == 0 {
+			return true
+		}
+	}
+	return false
+}
+func fixedSym(f *Func, sym Sym, off int64) Sym {
+	lsym := sym.(*obj.LSym)
+	for _, r := range lsym.R {
+		if (r.Type == objabi.R_ADDR || r.Type == objabi.R_WEAKADDR) && int64(r.Off) == off {
+			if strings.HasPrefix(r.Sym.Name, "type:") {
+				// In case we're loading a type out of a dictionary, we need to record
+				// that the containing function might put that type in an interface.
+				// That information is currently recorded in relocations in the dictionary,
+				// but if we perform this load at compile time then the dictionary
+				// might be dead.
+				reflectdata.MarkTypeSymUsedInInterface(r.Sym, f.fe.Func().Linksym())
+			} else if strings.HasPrefix(r.Sym.Name, "go:itab") {
+				// Same, but if we're using an itab we need to record that the
+				// itab._type might be put in an interface.
+				reflectdata.MarkTypeSymUsedInInterface(r.Sym, f.fe.Func().Linksym())
+			}
+			return r.Sym
+		}
+	}
+	base.Fatalf("fixedSym data not known for %s:%d", sym, off)
+	return nil
+}
+
 // read8 reads one byte from the read-only global sym at offset off.
 func read8(sym interface{}, off int64) uint8 {
 	lsym := sym.(*obj.LSym)
@@ -1972,7 +2052,7 @@
 }
 
 func makeJumpTableSym(b *Block) *obj.LSym {
-	s := base.Ctxt.Lookup(fmt.Sprintf("%s.jump%d", b.Func.fe.LSym(), b.ID))
+	s := base.Ctxt.Lookup(fmt.Sprintf("%s.jump%d", b.Func.fe.Func().LSym.Name, b.ID))
 	s.Set(obj.AttrDuplicateOK, true)
 	s.Set(obj.AttrLocal, true)
 	return s
diff --git a/src/cmd/compile/internal/ssa/rewrite386.go b/src/cmd/compile/internal/ssa/rewrite386.go
index 0cacfe3..b051267 100644
--- a/src/cmd/compile/internal/ssa/rewrite386.go
+++ b/src/cmd/compile/internal/ssa/rewrite386.go
@@ -1,5 +1,4 @@
-// Code generated from _gen/386.rules; DO NOT EDIT.
-// generated with: cd _gen; go run .
+// Code generated from _gen/386.rules using 'go generate'; DO NOT EDIT.
 
 package ssa
 
@@ -279,6 +278,8 @@
 	case OpAvg32u:
 		v.Op = Op386AVGLU
 		return true
+	case OpBswap16:
+		return rewriteValue386_OpBswap16(v)
 	case OpBswap32:
 		v.Op = Op386BSWAPL
 		return true
@@ -316,6 +317,17 @@
 	case OpCtz16NonZero:
 		v.Op = Op386BSFL
 		return true
+	case OpCtz32:
+		v.Op = Op386LoweredCtz32
+		return true
+	case OpCtz32NonZero:
+		v.Op = Op386BSFL
+		return true
+	case OpCtz8:
+		return rewriteValue386_OpCtz8(v)
+	case OpCtz8NonZero:
+		v.Op = Op386BSFL
+		return true
 	case OpCvt32Fto32:
 		v.Op = Op386CVTTSS2SL
 		return true
@@ -727,7 +739,8 @@
 func rewriteValue386_Op386ADDL(v *Value) bool {
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
-	// match: (ADDL x (MOVLconst [c]))
+	// match: (ADDL x (MOVLconst <t> [c]))
+	// cond: !t.IsPtr()
 	// result: (ADDLconst [c] x)
 	for {
 		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
@@ -735,7 +748,11 @@
 			if v_1.Op != Op386MOVLconst {
 				continue
 			}
+			t := v_1.Type
 			c := auxIntToInt32(v_1.AuxInt)
+			if !(!t.IsPtr()) {
+				continue
+			}
 			v.reset(Op386ADDLconst)
 			v.AuxInt = int32ToAuxInt(c)
 			v.AddArg(x)
@@ -3700,266 +3717,6 @@
 		v.AddArg3(base, val, mem)
 		return true
 	}
-	// match: (MOVBstore [i] {s} p (SHRWconst [8] w) x:(MOVBstore [i-1] {s} p w mem))
-	// cond: x.Uses == 1 && clobber(x)
-	// result: (MOVWstore [i-1] {s} p w mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p := v_0
-		if v_1.Op != Op386SHRWconst || auxIntToInt16(v_1.AuxInt) != 8 {
-			break
-		}
-		w := v_1.Args[0]
-		x := v_2
-		if x.Op != Op386MOVBstore || auxIntToInt32(x.AuxInt) != i-1 || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		if p != x.Args[0] || w != x.Args[1] || !(x.Uses == 1 && clobber(x)) {
-			break
-		}
-		v.reset(Op386MOVWstore)
-		v.AuxInt = int32ToAuxInt(i - 1)
-		v.Aux = symToAux(s)
-		v.AddArg3(p, w, mem)
-		return true
-	}
-	// match: (MOVBstore [i] {s} p (SHRLconst [8] w) x:(MOVBstore [i-1] {s} p w mem))
-	// cond: x.Uses == 1 && clobber(x)
-	// result: (MOVWstore [i-1] {s} p w mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p := v_0
-		if v_1.Op != Op386SHRLconst || auxIntToInt32(v_1.AuxInt) != 8 {
-			break
-		}
-		w := v_1.Args[0]
-		x := v_2
-		if x.Op != Op386MOVBstore || auxIntToInt32(x.AuxInt) != i-1 || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		if p != x.Args[0] || w != x.Args[1] || !(x.Uses == 1 && clobber(x)) {
-			break
-		}
-		v.reset(Op386MOVWstore)
-		v.AuxInt = int32ToAuxInt(i - 1)
-		v.Aux = symToAux(s)
-		v.AddArg3(p, w, mem)
-		return true
-	}
-	// match: (MOVBstore [i] {s} p w x:(MOVBstore {s} [i+1] p (SHRWconst [8] w) mem))
-	// cond: x.Uses == 1 && clobber(x)
-	// result: (MOVWstore [i] {s} p w mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p := v_0
-		w := v_1
-		x := v_2
-		if x.Op != Op386MOVBstore || auxIntToInt32(x.AuxInt) != i+1 || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		if p != x.Args[0] {
-			break
-		}
-		x_1 := x.Args[1]
-		if x_1.Op != Op386SHRWconst || auxIntToInt16(x_1.AuxInt) != 8 || w != x_1.Args[0] || !(x.Uses == 1 && clobber(x)) {
-			break
-		}
-		v.reset(Op386MOVWstore)
-		v.AuxInt = int32ToAuxInt(i)
-		v.Aux = symToAux(s)
-		v.AddArg3(p, w, mem)
-		return true
-	}
-	// match: (MOVBstore [i] {s} p w x:(MOVBstore {s} [i+1] p (SHRLconst [8] w) mem))
-	// cond: x.Uses == 1 && clobber(x)
-	// result: (MOVWstore [i] {s} p w mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p := v_0
-		w := v_1
-		x := v_2
-		if x.Op != Op386MOVBstore || auxIntToInt32(x.AuxInt) != i+1 || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		if p != x.Args[0] {
-			break
-		}
-		x_1 := x.Args[1]
-		if x_1.Op != Op386SHRLconst || auxIntToInt32(x_1.AuxInt) != 8 || w != x_1.Args[0] || !(x.Uses == 1 && clobber(x)) {
-			break
-		}
-		v.reset(Op386MOVWstore)
-		v.AuxInt = int32ToAuxInt(i)
-		v.Aux = symToAux(s)
-		v.AddArg3(p, w, mem)
-		return true
-	}
-	// match: (MOVBstore [i] {s} p (SHRLconst [j] w) x:(MOVBstore [i-1] {s} p w0:(SHRLconst [j-8] w) mem))
-	// cond: x.Uses == 1 && clobber(x)
-	// result: (MOVWstore [i-1] {s} p w0 mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p := v_0
-		if v_1.Op != Op386SHRLconst {
-			break
-		}
-		j := auxIntToInt32(v_1.AuxInt)
-		w := v_1.Args[0]
-		x := v_2
-		if x.Op != Op386MOVBstore || auxIntToInt32(x.AuxInt) != i-1 || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		if p != x.Args[0] {
-			break
-		}
-		w0 := x.Args[1]
-		if w0.Op != Op386SHRLconst || auxIntToInt32(w0.AuxInt) != j-8 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) {
-			break
-		}
-		v.reset(Op386MOVWstore)
-		v.AuxInt = int32ToAuxInt(i - 1)
-		v.Aux = symToAux(s)
-		v.AddArg3(p, w0, mem)
-		return true
-	}
-	// match: (MOVBstore [i] {s} p1 (SHRWconst [8] w) x:(MOVBstore [i] {s} p0 w mem))
-	// cond: x.Uses == 1 && sequentialAddresses(p0, p1, 1) && clobber(x)
-	// result: (MOVWstore [i] {s} p0 w mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p1 := v_0
-		if v_1.Op != Op386SHRWconst || auxIntToInt16(v_1.AuxInt) != 8 {
-			break
-		}
-		w := v_1.Args[0]
-		x := v_2
-		if x.Op != Op386MOVBstore || auxIntToInt32(x.AuxInt) != i || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		p0 := x.Args[0]
-		if w != x.Args[1] || !(x.Uses == 1 && sequentialAddresses(p0, p1, 1) && clobber(x)) {
-			break
-		}
-		v.reset(Op386MOVWstore)
-		v.AuxInt = int32ToAuxInt(i)
-		v.Aux = symToAux(s)
-		v.AddArg3(p0, w, mem)
-		return true
-	}
-	// match: (MOVBstore [i] {s} p1 (SHRLconst [8] w) x:(MOVBstore [i] {s} p0 w mem))
-	// cond: x.Uses == 1 && sequentialAddresses(p0, p1, 1) && clobber(x)
-	// result: (MOVWstore [i] {s} p0 w mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p1 := v_0
-		if v_1.Op != Op386SHRLconst || auxIntToInt32(v_1.AuxInt) != 8 {
-			break
-		}
-		w := v_1.Args[0]
-		x := v_2
-		if x.Op != Op386MOVBstore || auxIntToInt32(x.AuxInt) != i || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		p0 := x.Args[0]
-		if w != x.Args[1] || !(x.Uses == 1 && sequentialAddresses(p0, p1, 1) && clobber(x)) {
-			break
-		}
-		v.reset(Op386MOVWstore)
-		v.AuxInt = int32ToAuxInt(i)
-		v.Aux = symToAux(s)
-		v.AddArg3(p0, w, mem)
-		return true
-	}
-	// match: (MOVBstore [i] {s} p0 w x:(MOVBstore {s} [i] p1 (SHRWconst [8] w) mem))
-	// cond: x.Uses == 1 && sequentialAddresses(p0, p1, 1) && clobber(x)
-	// result: (MOVWstore [i] {s} p0 w mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p0 := v_0
-		w := v_1
-		x := v_2
-		if x.Op != Op386MOVBstore || auxIntToInt32(x.AuxInt) != i || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		p1 := x.Args[0]
-		x_1 := x.Args[1]
-		if x_1.Op != Op386SHRWconst || auxIntToInt16(x_1.AuxInt) != 8 || w != x_1.Args[0] || !(x.Uses == 1 && sequentialAddresses(p0, p1, 1) && clobber(x)) {
-			break
-		}
-		v.reset(Op386MOVWstore)
-		v.AuxInt = int32ToAuxInt(i)
-		v.Aux = symToAux(s)
-		v.AddArg3(p0, w, mem)
-		return true
-	}
-	// match: (MOVBstore [i] {s} p0 w x:(MOVBstore {s} [i] p1 (SHRLconst [8] w) mem))
-	// cond: x.Uses == 1 && sequentialAddresses(p0, p1, 1) && clobber(x)
-	// result: (MOVWstore [i] {s} p0 w mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p0 := v_0
-		w := v_1
-		x := v_2
-		if x.Op != Op386MOVBstore || auxIntToInt32(x.AuxInt) != i || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		p1 := x.Args[0]
-		x_1 := x.Args[1]
-		if x_1.Op != Op386SHRLconst || auxIntToInt32(x_1.AuxInt) != 8 || w != x_1.Args[0] || !(x.Uses == 1 && sequentialAddresses(p0, p1, 1) && clobber(x)) {
-			break
-		}
-		v.reset(Op386MOVWstore)
-		v.AuxInt = int32ToAuxInt(i)
-		v.Aux = symToAux(s)
-		v.AddArg3(p0, w, mem)
-		return true
-	}
-	// match: (MOVBstore [i] {s} p1 (SHRLconst [j] w) x:(MOVBstore [i] {s} p0 w0:(SHRLconst [j-8] w) mem))
-	// cond: x.Uses == 1 && sequentialAddresses(p0, p1, 1) && clobber(x)
-	// result: (MOVWstore [i] {s} p0 w0 mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p1 := v_0
-		if v_1.Op != Op386SHRLconst {
-			break
-		}
-		j := auxIntToInt32(v_1.AuxInt)
-		w := v_1.Args[0]
-		x := v_2
-		if x.Op != Op386MOVBstore || auxIntToInt32(x.AuxInt) != i || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		p0 := x.Args[0]
-		w0 := x.Args[1]
-		if w0.Op != Op386SHRLconst || auxIntToInt32(w0.AuxInt) != j-8 || w != w0.Args[0] || !(x.Uses == 1 && sequentialAddresses(p0, p1, 1) && clobber(x)) {
-			break
-		}
-		v.reset(Op386MOVWstore)
-		v.AuxInt = int32ToAuxInt(i)
-		v.Aux = symToAux(s)
-		v.AddArg3(p0, w0, mem)
-		return true
-	}
 	return false
 }
 func rewriteValue386_Op386MOVBstoreconst(v *Value) bool {
@@ -4010,108 +3767,6 @@
 		v.AddArg2(ptr, mem)
 		return true
 	}
-	// match: (MOVBstoreconst [c] {s} p x:(MOVBstoreconst [a] {s} p mem))
-	// cond: x.Uses == 1 && a.Off() + 1 == c.Off() && clobber(x)
-	// result: (MOVWstoreconst [makeValAndOff(a.Val()&0xff | c.Val()<<8, a.Off())] {s} p mem)
-	for {
-		c := auxIntToValAndOff(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p := v_0
-		x := v_1
-		if x.Op != Op386MOVBstoreconst {
-			break
-		}
-		a := auxIntToValAndOff(x.AuxInt)
-		if auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[1]
-		if p != x.Args[0] || !(x.Uses == 1 && a.Off()+1 == c.Off() && clobber(x)) {
-			break
-		}
-		v.reset(Op386MOVWstoreconst)
-		v.AuxInt = valAndOffToAuxInt(makeValAndOff(a.Val()&0xff|c.Val()<<8, a.Off()))
-		v.Aux = symToAux(s)
-		v.AddArg2(p, mem)
-		return true
-	}
-	// match: (MOVBstoreconst [a] {s} p x:(MOVBstoreconst [c] {s} p mem))
-	// cond: x.Uses == 1 && a.Off() + 1 == c.Off() && clobber(x)
-	// result: (MOVWstoreconst [makeValAndOff(a.Val()&0xff | c.Val()<<8, a.Off())] {s} p mem)
-	for {
-		a := auxIntToValAndOff(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p := v_0
-		x := v_1
-		if x.Op != Op386MOVBstoreconst {
-			break
-		}
-		c := auxIntToValAndOff(x.AuxInt)
-		if auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[1]
-		if p != x.Args[0] || !(x.Uses == 1 && a.Off()+1 == c.Off() && clobber(x)) {
-			break
-		}
-		v.reset(Op386MOVWstoreconst)
-		v.AuxInt = valAndOffToAuxInt(makeValAndOff(a.Val()&0xff|c.Val()<<8, a.Off()))
-		v.Aux = symToAux(s)
-		v.AddArg2(p, mem)
-		return true
-	}
-	// match: (MOVBstoreconst [c] {s} p1 x:(MOVBstoreconst [a] {s} p0 mem))
-	// cond: x.Uses == 1 && a.Off() == c.Off() && sequentialAddresses(p0, p1, 1) && clobber(x)
-	// result: (MOVWstoreconst [makeValAndOff(a.Val()&0xff | c.Val()<<8, a.Off())] {s} p0 mem)
-	for {
-		c := auxIntToValAndOff(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p1 := v_0
-		x := v_1
-		if x.Op != Op386MOVBstoreconst {
-			break
-		}
-		a := auxIntToValAndOff(x.AuxInt)
-		if auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[1]
-		p0 := x.Args[0]
-		if !(x.Uses == 1 && a.Off() == c.Off() && sequentialAddresses(p0, p1, 1) && clobber(x)) {
-			break
-		}
-		v.reset(Op386MOVWstoreconst)
-		v.AuxInt = valAndOffToAuxInt(makeValAndOff(a.Val()&0xff|c.Val()<<8, a.Off()))
-		v.Aux = symToAux(s)
-		v.AddArg2(p0, mem)
-		return true
-	}
-	// match: (MOVBstoreconst [a] {s} p0 x:(MOVBstoreconst [c] {s} p1 mem))
-	// cond: x.Uses == 1 && a.Off() == c.Off() && sequentialAddresses(p0, p1, 1) && clobber(x)
-	// result: (MOVWstoreconst [makeValAndOff(a.Val()&0xff | c.Val()<<8, a.Off())] {s} p0 mem)
-	for {
-		a := auxIntToValAndOff(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p0 := v_0
-		x := v_1
-		if x.Op != Op386MOVBstoreconst {
-			break
-		}
-		c := auxIntToValAndOff(x.AuxInt)
-		if auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[1]
-		p1 := x.Args[0]
-		if !(x.Uses == 1 && a.Off() == c.Off() && sequentialAddresses(p0, p1, 1) && clobber(x)) {
-			break
-		}
-		v.reset(Op386MOVWstoreconst)
-		v.AuxInt = valAndOffToAuxInt(makeValAndOff(a.Val()&0xff|c.Val()<<8, a.Off()))
-		v.Aux = symToAux(s)
-		v.AddArg2(p0, mem)
-		return true
-	}
 	return false
 }
 func rewriteValue386_Op386MOVLload(v *Value) bool {
@@ -5243,115 +4898,6 @@
 		v.AddArg3(base, val, mem)
 		return true
 	}
-	// match: (MOVWstore [i] {s} p (SHRLconst [16] w) x:(MOVWstore [i-2] {s} p w mem))
-	// cond: x.Uses == 1 && clobber(x)
-	// result: (MOVLstore [i-2] {s} p w mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p := v_0
-		if v_1.Op != Op386SHRLconst || auxIntToInt32(v_1.AuxInt) != 16 {
-			break
-		}
-		w := v_1.Args[0]
-		x := v_2
-		if x.Op != Op386MOVWstore || auxIntToInt32(x.AuxInt) != i-2 || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		if p != x.Args[0] || w != x.Args[1] || !(x.Uses == 1 && clobber(x)) {
-			break
-		}
-		v.reset(Op386MOVLstore)
-		v.AuxInt = int32ToAuxInt(i - 2)
-		v.Aux = symToAux(s)
-		v.AddArg3(p, w, mem)
-		return true
-	}
-	// match: (MOVWstore [i] {s} p (SHRLconst [j] w) x:(MOVWstore [i-2] {s} p w0:(SHRLconst [j-16] w) mem))
-	// cond: x.Uses == 1 && clobber(x)
-	// result: (MOVLstore [i-2] {s} p w0 mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p := v_0
-		if v_1.Op != Op386SHRLconst {
-			break
-		}
-		j := auxIntToInt32(v_1.AuxInt)
-		w := v_1.Args[0]
-		x := v_2
-		if x.Op != Op386MOVWstore || auxIntToInt32(x.AuxInt) != i-2 || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		if p != x.Args[0] {
-			break
-		}
-		w0 := x.Args[1]
-		if w0.Op != Op386SHRLconst || auxIntToInt32(w0.AuxInt) != j-16 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) {
-			break
-		}
-		v.reset(Op386MOVLstore)
-		v.AuxInt = int32ToAuxInt(i - 2)
-		v.Aux = symToAux(s)
-		v.AddArg3(p, w0, mem)
-		return true
-	}
-	// match: (MOVWstore [i] {s} p1 (SHRLconst [16] w) x:(MOVWstore [i] {s} p0 w mem))
-	// cond: x.Uses == 1 && sequentialAddresses(p0, p1, 2) && clobber(x)
-	// result: (MOVLstore [i] {s} p0 w mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p1 := v_0
-		if v_1.Op != Op386SHRLconst || auxIntToInt32(v_1.AuxInt) != 16 {
-			break
-		}
-		w := v_1.Args[0]
-		x := v_2
-		if x.Op != Op386MOVWstore || auxIntToInt32(x.AuxInt) != i || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		p0 := x.Args[0]
-		if w != x.Args[1] || !(x.Uses == 1 && sequentialAddresses(p0, p1, 2) && clobber(x)) {
-			break
-		}
-		v.reset(Op386MOVLstore)
-		v.AuxInt = int32ToAuxInt(i)
-		v.Aux = symToAux(s)
-		v.AddArg3(p0, w, mem)
-		return true
-	}
-	// match: (MOVWstore [i] {s} p1 (SHRLconst [j] w) x:(MOVWstore [i] {s} p0 w0:(SHRLconst [j-16] w) mem))
-	// cond: x.Uses == 1 && sequentialAddresses(p0, p1, 2) && clobber(x)
-	// result: (MOVLstore [i] {s} p0 w0 mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p1 := v_0
-		if v_1.Op != Op386SHRLconst {
-			break
-		}
-		j := auxIntToInt32(v_1.AuxInt)
-		w := v_1.Args[0]
-		x := v_2
-		if x.Op != Op386MOVWstore || auxIntToInt32(x.AuxInt) != i || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		p0 := x.Args[0]
-		w0 := x.Args[1]
-		if w0.Op != Op386SHRLconst || auxIntToInt32(w0.AuxInt) != j-16 || w != w0.Args[0] || !(x.Uses == 1 && sequentialAddresses(p0, p1, 2) && clobber(x)) {
-			break
-		}
-		v.reset(Op386MOVLstore)
-		v.AuxInt = int32ToAuxInt(i)
-		v.Aux = symToAux(s)
-		v.AddArg3(p0, w0, mem)
-		return true
-	}
 	return false
 }
 func rewriteValue386_Op386MOVWstoreconst(v *Value) bool {
@@ -5402,108 +4948,6 @@
 		v.AddArg2(ptr, mem)
 		return true
 	}
-	// match: (MOVWstoreconst [c] {s} p x:(MOVWstoreconst [a] {s} p mem))
-	// cond: x.Uses == 1 && a.Off() + 2 == c.Off() && clobber(x)
-	// result: (MOVLstoreconst [makeValAndOff(a.Val()&0xffff | c.Val()<<16, a.Off())] {s} p mem)
-	for {
-		c := auxIntToValAndOff(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p := v_0
-		x := v_1
-		if x.Op != Op386MOVWstoreconst {
-			break
-		}
-		a := auxIntToValAndOff(x.AuxInt)
-		if auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[1]
-		if p != x.Args[0] || !(x.Uses == 1 && a.Off()+2 == c.Off() && clobber(x)) {
-			break
-		}
-		v.reset(Op386MOVLstoreconst)
-		v.AuxInt = valAndOffToAuxInt(makeValAndOff(a.Val()&0xffff|c.Val()<<16, a.Off()))
-		v.Aux = symToAux(s)
-		v.AddArg2(p, mem)
-		return true
-	}
-	// match: (MOVWstoreconst [a] {s} p x:(MOVWstoreconst [c] {s} p mem))
-	// cond: x.Uses == 1 && ValAndOff(a).Off() + 2 == ValAndOff(c).Off() && clobber(x)
-	// result: (MOVLstoreconst [makeValAndOff(a.Val()&0xffff | c.Val()<<16, a.Off())] {s} p mem)
-	for {
-		a := auxIntToValAndOff(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p := v_0
-		x := v_1
-		if x.Op != Op386MOVWstoreconst {
-			break
-		}
-		c := auxIntToValAndOff(x.AuxInt)
-		if auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[1]
-		if p != x.Args[0] || !(x.Uses == 1 && ValAndOff(a).Off()+2 == ValAndOff(c).Off() && clobber(x)) {
-			break
-		}
-		v.reset(Op386MOVLstoreconst)
-		v.AuxInt = valAndOffToAuxInt(makeValAndOff(a.Val()&0xffff|c.Val()<<16, a.Off()))
-		v.Aux = symToAux(s)
-		v.AddArg2(p, mem)
-		return true
-	}
-	// match: (MOVWstoreconst [c] {s} p1 x:(MOVWstoreconst [a] {s} p0 mem))
-	// cond: x.Uses == 1 && a.Off() == c.Off() && sequentialAddresses(p0, p1, 2) && clobber(x)
-	// result: (MOVLstoreconst [makeValAndOff(a.Val()&0xffff | c.Val()<<16, a.Off())] {s} p0 mem)
-	for {
-		c := auxIntToValAndOff(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p1 := v_0
-		x := v_1
-		if x.Op != Op386MOVWstoreconst {
-			break
-		}
-		a := auxIntToValAndOff(x.AuxInt)
-		if auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[1]
-		p0 := x.Args[0]
-		if !(x.Uses == 1 && a.Off() == c.Off() && sequentialAddresses(p0, p1, 2) && clobber(x)) {
-			break
-		}
-		v.reset(Op386MOVLstoreconst)
-		v.AuxInt = valAndOffToAuxInt(makeValAndOff(a.Val()&0xffff|c.Val()<<16, a.Off()))
-		v.Aux = symToAux(s)
-		v.AddArg2(p0, mem)
-		return true
-	}
-	// match: (MOVWstoreconst [a] {s} p0 x:(MOVWstoreconst [c] {s} p1 mem))
-	// cond: x.Uses == 1 && a.Off() == c.Off() && sequentialAddresses(p0, p1, 2) && clobber(x)
-	// result: (MOVLstoreconst [makeValAndOff(a.Val()&0xffff | c.Val()<<16, a.Off())] {s} p0 mem)
-	for {
-		a := auxIntToValAndOff(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p0 := v_0
-		x := v_1
-		if x.Op != Op386MOVWstoreconst {
-			break
-		}
-		c := auxIntToValAndOff(x.AuxInt)
-		if auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[1]
-		p1 := x.Args[0]
-		if !(x.Uses == 1 && a.Off() == c.Off() && sequentialAddresses(p0, p1, 2) && clobber(x)) {
-			break
-		}
-		v.reset(Op386MOVLstoreconst)
-		v.AuxInt = valAndOffToAuxInt(makeValAndOff(a.Val()&0xffff|c.Val()<<16, a.Off()))
-		v.Aux = symToAux(s)
-		v.AddArg2(p0, mem)
-		return true
-	}
 	return false
 }
 func rewriteValue386_Op386MULL(v *Value) bool {
@@ -6222,8 +5666,6 @@
 func rewriteValue386_Op386ORL(v *Value) bool {
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
-	b := v.Block
-	typ := &b.Func.Config.Types
 	// match: (ORL x (MOVLconst [c]))
 	// result: (ORLconst [c] x)
 	for {
@@ -6275,203 +5717,6 @@
 		v.copyOf(x)
 		return true
 	}
-	// match: (ORL x0:(MOVBload [i0] {s} p mem) s0:(SHLLconst [8] x1:(MOVBload [i1] {s} p mem)))
-	// cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0, x1, s0)
-	// result: @mergePoint(b,x0,x1) (MOVWload [i0] {s} p mem)
-	for {
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			x0 := v_0
-			if x0.Op != Op386MOVBload {
-				continue
-			}
-			i0 := auxIntToInt32(x0.AuxInt)
-			s := auxToSym(x0.Aux)
-			mem := x0.Args[1]
-			p := x0.Args[0]
-			s0 := v_1
-			if s0.Op != Op386SHLLconst || auxIntToInt32(s0.AuxInt) != 8 {
-				continue
-			}
-			x1 := s0.Args[0]
-			if x1.Op != Op386MOVBload {
-				continue
-			}
-			i1 := auxIntToInt32(x1.AuxInt)
-			if auxToSym(x1.Aux) != s {
-				continue
-			}
-			_ = x1.Args[1]
-			if p != x1.Args[0] || mem != x1.Args[1] || !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0, x1, s0)) {
-				continue
-			}
-			b = mergePoint(b, x0, x1)
-			v0 := b.NewValue0(x1.Pos, Op386MOVWload, typ.UInt16)
-			v.copyOf(v0)
-			v0.AuxInt = int32ToAuxInt(i0)
-			v0.Aux = symToAux(s)
-			v0.AddArg2(p, mem)
-			return true
-		}
-		break
-	}
-	// match: (ORL x0:(MOVBload [i] {s} p0 mem) s0:(SHLLconst [8] x1:(MOVBload [i] {s} p1 mem)))
-	// cond: x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && sequentialAddresses(p0, p1, 1) && mergePoint(b,x0,x1) != nil && clobber(x0, x1, s0)
-	// result: @mergePoint(b,x0,x1) (MOVWload [i] {s} p0 mem)
-	for {
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			x0 := v_0
-			if x0.Op != Op386MOVBload {
-				continue
-			}
-			i := auxIntToInt32(x0.AuxInt)
-			s := auxToSym(x0.Aux)
-			mem := x0.Args[1]
-			p0 := x0.Args[0]
-			s0 := v_1
-			if s0.Op != Op386SHLLconst || auxIntToInt32(s0.AuxInt) != 8 {
-				continue
-			}
-			x1 := s0.Args[0]
-			if x1.Op != Op386MOVBload || auxIntToInt32(x1.AuxInt) != i || auxToSym(x1.Aux) != s {
-				continue
-			}
-			_ = x1.Args[1]
-			p1 := x1.Args[0]
-			if mem != x1.Args[1] || !(x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && sequentialAddresses(p0, p1, 1) && mergePoint(b, x0, x1) != nil && clobber(x0, x1, s0)) {
-				continue
-			}
-			b = mergePoint(b, x0, x1)
-			v0 := b.NewValue0(x1.Pos, Op386MOVWload, typ.UInt16)
-			v.copyOf(v0)
-			v0.AuxInt = int32ToAuxInt(i)
-			v0.Aux = symToAux(s)
-			v0.AddArg2(p0, mem)
-			return true
-		}
-		break
-	}
-	// match: (ORL o0:(ORL x0:(MOVWload [i0] {s} p mem) s0:(SHLLconst [16] x1:(MOVBload [i2] {s} p mem))) s1:(SHLLconst [24] x2:(MOVBload [i3] {s} p mem)))
-	// cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0, x1, x2, s0, s1, o0)
-	// result: @mergePoint(b,x0,x1,x2) (MOVLload [i0] {s} p mem)
-	for {
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			o0 := v_0
-			if o0.Op != Op386ORL {
-				continue
-			}
-			_ = o0.Args[1]
-			o0_0 := o0.Args[0]
-			o0_1 := o0.Args[1]
-			for _i1 := 0; _i1 <= 1; _i1, o0_0, o0_1 = _i1+1, o0_1, o0_0 {
-				x0 := o0_0
-				if x0.Op != Op386MOVWload {
-					continue
-				}
-				i0 := auxIntToInt32(x0.AuxInt)
-				s := auxToSym(x0.Aux)
-				mem := x0.Args[1]
-				p := x0.Args[0]
-				s0 := o0_1
-				if s0.Op != Op386SHLLconst || auxIntToInt32(s0.AuxInt) != 16 {
-					continue
-				}
-				x1 := s0.Args[0]
-				if x1.Op != Op386MOVBload {
-					continue
-				}
-				i2 := auxIntToInt32(x1.AuxInt)
-				if auxToSym(x1.Aux) != s {
-					continue
-				}
-				_ = x1.Args[1]
-				if p != x1.Args[0] || mem != x1.Args[1] {
-					continue
-				}
-				s1 := v_1
-				if s1.Op != Op386SHLLconst || auxIntToInt32(s1.AuxInt) != 24 {
-					continue
-				}
-				x2 := s1.Args[0]
-				if x2.Op != Op386MOVBload {
-					continue
-				}
-				i3 := auxIntToInt32(x2.AuxInt)
-				if auxToSym(x2.Aux) != s {
-					continue
-				}
-				_ = x2.Args[1]
-				if p != x2.Args[0] || mem != x2.Args[1] || !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0, x1, x2, s0, s1, o0)) {
-					continue
-				}
-				b = mergePoint(b, x0, x1, x2)
-				v0 := b.NewValue0(x2.Pos, Op386MOVLload, typ.UInt32)
-				v.copyOf(v0)
-				v0.AuxInt = int32ToAuxInt(i0)
-				v0.Aux = symToAux(s)
-				v0.AddArg2(p, mem)
-				return true
-			}
-		}
-		break
-	}
-	// match: (ORL o0:(ORL x0:(MOVWload [i] {s} p0 mem) s0:(SHLLconst [16] x1:(MOVBload [i] {s} p1 mem))) s1:(SHLLconst [24] x2:(MOVBload [i] {s} p2 mem)))
-	// cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && sequentialAddresses(p0, p1, 2) && sequentialAddresses(p1, p2, 1) && mergePoint(b,x0,x1,x2) != nil && clobber(x0, x1, x2, s0, s1, o0)
-	// result: @mergePoint(b,x0,x1,x2) (MOVLload [i] {s} p0 mem)
-	for {
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			o0 := v_0
-			if o0.Op != Op386ORL {
-				continue
-			}
-			_ = o0.Args[1]
-			o0_0 := o0.Args[0]
-			o0_1 := o0.Args[1]
-			for _i1 := 0; _i1 <= 1; _i1, o0_0, o0_1 = _i1+1, o0_1, o0_0 {
-				x0 := o0_0
-				if x0.Op != Op386MOVWload {
-					continue
-				}
-				i := auxIntToInt32(x0.AuxInt)
-				s := auxToSym(x0.Aux)
-				mem := x0.Args[1]
-				p0 := x0.Args[0]
-				s0 := o0_1
-				if s0.Op != Op386SHLLconst || auxIntToInt32(s0.AuxInt) != 16 {
-					continue
-				}
-				x1 := s0.Args[0]
-				if x1.Op != Op386MOVBload || auxIntToInt32(x1.AuxInt) != i || auxToSym(x1.Aux) != s {
-					continue
-				}
-				_ = x1.Args[1]
-				p1 := x1.Args[0]
-				if mem != x1.Args[1] {
-					continue
-				}
-				s1 := v_1
-				if s1.Op != Op386SHLLconst || auxIntToInt32(s1.AuxInt) != 24 {
-					continue
-				}
-				x2 := s1.Args[0]
-				if x2.Op != Op386MOVBload || auxIntToInt32(x2.AuxInt) != i || auxToSym(x2.Aux) != s {
-					continue
-				}
-				_ = x2.Args[1]
-				p2 := x2.Args[0]
-				if mem != x2.Args[1] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && sequentialAddresses(p0, p1, 2) && sequentialAddresses(p1, p2, 1) && mergePoint(b, x0, x1, x2) != nil && clobber(x0, x1, x2, s0, s1, o0)) {
-					continue
-				}
-				b = mergePoint(b, x0, x1, x2)
-				v0 := b.NewValue0(x2.Pos, Op386MOVLload, typ.UInt32)
-				v.copyOf(v0)
-				v0.AuxInt = int32ToAuxInt(i)
-				v0.Aux = symToAux(s)
-				v0.AddArg2(p0, mem)
-				return true
-			}
-		}
-		break
-	}
 	return false
 }
 func rewriteValue386_Op386ORLconst(v *Value) bool {
@@ -8468,6 +7713,18 @@
 		return true
 	}
 }
+func rewriteValue386_OpBswap16(v *Value) bool {
+	v_0 := v.Args[0]
+	// match: (Bswap16 x)
+	// result: (ROLWconst [8] x)
+	for {
+		x := v_0
+		v.reset(Op386ROLWconst)
+		v.AuxInt = int16ToAuxInt(8)
+		v.AddArg(x)
+		return true
+	}
+}
 func rewriteValue386_OpConst16(v *Value) bool {
 	// match: (Const16 [c])
 	// result: (MOVLconst [int32(c)])
@@ -8523,6 +7780,22 @@
 		return true
 	}
 }
+func rewriteValue386_OpCtz8(v *Value) bool {
+	v_0 := v.Args[0]
+	b := v.Block
+	typ := &b.Func.Config.Types
+	// match: (Ctz8 x)
+	// result: (BSFL (ORLconst <typ.UInt32> [0x100] x))
+	for {
+		x := v_0
+		v.reset(Op386BSFL)
+		v0 := b.NewValue0(v.Pos, Op386ORLconst, typ.UInt32)
+		v0.AuxInt = int32ToAuxInt(0x100)
+		v0.AddArg(x)
+		v.AddArg(v0)
+		return true
+	}
+}
 func rewriteValue386_OpDiv8(v *Value) bool {
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
@@ -9051,17 +8324,44 @@
 	return false
 }
 func rewriteValue386_OpLocalAddr(v *Value) bool {
+	v_1 := v.Args[1]
 	v_0 := v.Args[0]
-	// match: (LocalAddr {sym} base _)
-	// result: (LEAL {sym} base)
+	b := v.Block
+	typ := &b.Func.Config.Types
+	// match: (LocalAddr <t> {sym} base mem)
+	// cond: t.Elem().HasPointers()
+	// result: (LEAL {sym} (SPanchored base mem))
 	for {
+		t := v.Type
 		sym := auxToSym(v.Aux)
 		base := v_0
+		mem := v_1
+		if !(t.Elem().HasPointers()) {
+			break
+		}
+		v.reset(Op386LEAL)
+		v.Aux = symToAux(sym)
+		v0 := b.NewValue0(v.Pos, OpSPanchored, typ.Uintptr)
+		v0.AddArg2(base, mem)
+		v.AddArg(v0)
+		return true
+	}
+	// match: (LocalAddr <t> {sym} base _)
+	// cond: !t.Elem().HasPointers()
+	// result: (LEAL {sym} base)
+	for {
+		t := v.Type
+		sym := auxToSym(v.Aux)
+		base := v_0
+		if !(!t.Elem().HasPointers()) {
+			break
+		}
 		v.reset(Op386LEAL)
 		v.Aux = symToAux(sym)
 		v.AddArg(base)
 		return true
 	}
+	return false
 }
 func rewriteValue386_OpLsh16x16(v *Value) bool {
 	v_1 := v.Args[1]
@@ -11166,14 +10466,14 @@
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
 	// match: (Store {t} ptr val mem)
-	// cond: t.Size() == 8 && is64BitFloat(val.Type)
+	// cond: t.Size() == 8 && t.IsFloat()
 	// result: (MOVSDstore ptr val mem)
 	for {
 		t := auxToType(v.Aux)
 		ptr := v_0
 		val := v_1
 		mem := v_2
-		if !(t.Size() == 8 && is64BitFloat(val.Type)) {
+		if !(t.Size() == 8 && t.IsFloat()) {
 			break
 		}
 		v.reset(Op386MOVSDstore)
@@ -11181,14 +10481,14 @@
 		return true
 	}
 	// match: (Store {t} ptr val mem)
-	// cond: t.Size() == 4 && is32BitFloat(val.Type)
+	// cond: t.Size() == 4 && t.IsFloat()
 	// result: (MOVSSstore ptr val mem)
 	for {
 		t := auxToType(v.Aux)
 		ptr := v_0
 		val := v_1
 		mem := v_2
-		if !(t.Size() == 4 && is32BitFloat(val.Type)) {
+		if !(t.Size() == 4 && t.IsFloat()) {
 			break
 		}
 		v.reset(Op386MOVSSstore)
@@ -11196,14 +10496,14 @@
 		return true
 	}
 	// match: (Store {t} ptr val mem)
-	// cond: t.Size() == 4
+	// cond: t.Size() == 4 && !t.IsFloat()
 	// result: (MOVLstore ptr val mem)
 	for {
 		t := auxToType(v.Aux)
 		ptr := v_0
 		val := v_1
 		mem := v_2
-		if !(t.Size() == 4) {
+		if !(t.Size() == 4 && !t.IsFloat()) {
 			break
 		}
 		v.reset(Op386MOVLstore)
diff --git a/src/cmd/compile/internal/ssa/rewrite386splitload.go b/src/cmd/compile/internal/ssa/rewrite386splitload.go
index ef3bf26..a8bd6aa 100644
--- a/src/cmd/compile/internal/ssa/rewrite386splitload.go
+++ b/src/cmd/compile/internal/ssa/rewrite386splitload.go
@@ -1,5 +1,4 @@
-// Code generated from _gen/386splitload.rules; DO NOT EDIT.
-// generated with: cd _gen; go run .
+// Code generated from _gen/386splitload.rules using 'go generate'; DO NOT EDIT.
 
 package ssa
 
diff --git a/src/cmd/compile/internal/ssa/rewriteAMD64.go b/src/cmd/compile/internal/ssa/rewriteAMD64.go
index cad37d4..88bd48f 100644
--- a/src/cmd/compile/internal/ssa/rewriteAMD64.go
+++ b/src/cmd/compile/internal/ssa/rewriteAMD64.go
@@ -1,5 +1,4 @@
-// Code generated from _gen/AMD64.rules; DO NOT EDIT.
-// generated with: cd _gen; go run .
+// Code generated from _gen/AMD64.rules using 'go generate'; DO NOT EDIT.
 
 package ssa
 
@@ -621,6 +620,8 @@
 		return rewriteValueAMD64_OpBitLen64(v)
 	case OpBitLen8:
 		return rewriteValueAMD64_OpBitLen8(v)
+	case OpBswap16:
+		return rewriteValueAMD64_OpBswap16(v)
 	case OpBswap32:
 		v.Op = OpAMD64BSWAPL
 		return true
@@ -1793,8 +1794,8 @@
 func rewriteValueAMD64_OpAMD64ADDQ(v *Value) bool {
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
-	// match: (ADDQ x (MOVQconst [c]))
-	// cond: is32Bit(c)
+	// match: (ADDQ x (MOVQconst <t> [c]))
+	// cond: is32Bit(c) && !t.IsPtr()
 	// result: (ADDQconst [int32(c)] x)
 	for {
 		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
@@ -1802,8 +1803,9 @@
 			if v_1.Op != OpAMD64MOVQconst {
 				continue
 			}
+			t := v_1.Type
 			c := auxIntToInt64(v_1.AuxInt)
-			if !(is32Bit(c)) {
+			if !(is32Bit(c) && !t.IsPtr()) {
 				continue
 			}
 			v.reset(OpAMD64ADDQconst)
@@ -2591,6 +2593,8 @@
 func rewriteValueAMD64_OpAMD64ANDL(v *Value) bool {
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
+	b := v.Block
+	typ := &b.Func.Config.Types
 	// match: (ANDL (NOTL (SHLL (MOVLconst [1]) y)) x)
 	// result: (BTRL x y)
 	for {
@@ -2719,17 +2723,21 @@
 		}
 		break
 	}
-	// match: (ANDL x (ADDLconst [-1] x))
+	// match: (ANDL <t> x (ADDLconst [-1] x))
 	// cond: buildcfg.GOAMD64 >= 3
-	// result: (BLSRL x)
+	// result: (Select0 <t> (BLSRL x))
 	for {
+		t := v.Type
 		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
 			x := v_0
 			if v_1.Op != OpAMD64ADDLconst || auxIntToInt32(v_1.AuxInt) != -1 || x != v_1.Args[0] || !(buildcfg.GOAMD64 >= 3) {
 				continue
 			}
-			v.reset(OpAMD64BLSRL)
-			v.AddArg(x)
+			v.reset(OpSelect0)
+			v.Type = t
+			v0 := b.NewValue0(v.Pos, OpAMD64BLSRL, types.NewTuple(typ.UInt32, types.TypeFlags))
+			v0.AddArg(x)
+			v.AddArg(v0)
 			return true
 		}
 		break
@@ -3057,6 +3065,8 @@
 func rewriteValueAMD64_OpAMD64ANDQ(v *Value) bool {
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
+	b := v.Block
+	typ := &b.Func.Config.Types
 	// match: (ANDQ (NOTQ (SHLQ (MOVQconst [1]) y)) x)
 	// result: (BTRQ x y)
 	for {
@@ -3189,17 +3199,21 @@
 		}
 		break
 	}
-	// match: (ANDQ x (ADDQconst [-1] x))
+	// match: (ANDQ <t> x (ADDQconst [-1] x))
 	// cond: buildcfg.GOAMD64 >= 3
-	// result: (BLSRQ x)
+	// result: (Select0 <t> (BLSRQ x))
 	for {
+		t := v.Type
 		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
 			x := v_0
 			if v_1.Op != OpAMD64ADDQconst || auxIntToInt32(v_1.AuxInt) != -1 || x != v_1.Args[0] || !(buildcfg.GOAMD64 >= 3) {
 				continue
 			}
-			v.reset(OpAMD64BLSRQ)
-			v.AddArg(x)
+			v.reset(OpSelect0)
+			v.Type = t
+			v0 := b.NewValue0(v.Pos, OpAMD64BLSRQ, types.NewTuple(typ.UInt64, types.TypeFlags))
+			v0.AddArg(x)
+			v.AddArg(v0)
 			return true
 		}
 		break
@@ -3533,6 +3547,8 @@
 }
 func rewriteValueAMD64_OpAMD64BSWAPL(v *Value) bool {
 	v_0 := v.Args[0]
+	b := v.Block
+	typ := &b.Func.Config.Types
 	// match: (BSWAPL (BSWAPL p))
 	// result: p
 	for {
@@ -3545,7 +3561,7 @@
 	}
 	// match: (BSWAPL x:(MOVLload [i] {s} p mem))
 	// cond: x.Uses == 1 && buildcfg.GOAMD64 >= 3
-	// result: (MOVBELload [i] {s} p mem)
+	// result: @x.Block (MOVBELload [i] {s} p mem)
 	for {
 		x := v_0
 		if x.Op != OpAMD64MOVLload {
@@ -3558,32 +3574,43 @@
 		if !(x.Uses == 1 && buildcfg.GOAMD64 >= 3) {
 			break
 		}
-		v.reset(OpAMD64MOVBELload)
-		v.AuxInt = int32ToAuxInt(i)
-		v.Aux = symToAux(s)
-		v.AddArg2(p, mem)
+		b = x.Block
+		v0 := b.NewValue0(x.Pos, OpAMD64MOVBELload, typ.UInt32)
+		v.copyOf(v0)
+		v0.AuxInt = int32ToAuxInt(i)
+		v0.Aux = symToAux(s)
+		v0.AddArg2(p, mem)
 		return true
 	}
-	// match: (BSWAPL (MOVBELload [i] {s} p m))
-	// result: (MOVLload [i] {s} p m)
+	// match: (BSWAPL x:(MOVBELload [i] {s} p mem))
+	// cond: x.Uses == 1
+	// result: @x.Block (MOVLload [i] {s} p mem)
 	for {
-		if v_0.Op != OpAMD64MOVBELload {
+		x := v_0
+		if x.Op != OpAMD64MOVBELload {
 			break
 		}
-		i := auxIntToInt32(v_0.AuxInt)
-		s := auxToSym(v_0.Aux)
-		m := v_0.Args[1]
-		p := v_0.Args[0]
-		v.reset(OpAMD64MOVLload)
-		v.AuxInt = int32ToAuxInt(i)
-		v.Aux = symToAux(s)
-		v.AddArg2(p, m)
+		i := auxIntToInt32(x.AuxInt)
+		s := auxToSym(x.Aux)
+		mem := x.Args[1]
+		p := x.Args[0]
+		if !(x.Uses == 1) {
+			break
+		}
+		b = x.Block
+		v0 := b.NewValue0(x.Pos, OpAMD64MOVLload, typ.UInt32)
+		v.copyOf(v0)
+		v0.AuxInt = int32ToAuxInt(i)
+		v0.Aux = symToAux(s)
+		v0.AddArg2(p, mem)
 		return true
 	}
 	return false
 }
 func rewriteValueAMD64_OpAMD64BSWAPQ(v *Value) bool {
 	v_0 := v.Args[0]
+	b := v.Block
+	typ := &b.Func.Config.Types
 	// match: (BSWAPQ (BSWAPQ p))
 	// result: p
 	for {
@@ -3596,7 +3623,7 @@
 	}
 	// match: (BSWAPQ x:(MOVQload [i] {s} p mem))
 	// cond: x.Uses == 1 && buildcfg.GOAMD64 >= 3
-	// result: (MOVBEQload [i] {s} p mem)
+	// result: @x.Block (MOVBEQload [i] {s} p mem)
 	for {
 		x := v_0
 		if x.Op != OpAMD64MOVQload {
@@ -3609,26 +3636,35 @@
 		if !(x.Uses == 1 && buildcfg.GOAMD64 >= 3) {
 			break
 		}
-		v.reset(OpAMD64MOVBEQload)
-		v.AuxInt = int32ToAuxInt(i)
-		v.Aux = symToAux(s)
-		v.AddArg2(p, mem)
+		b = x.Block
+		v0 := b.NewValue0(x.Pos, OpAMD64MOVBEQload, typ.UInt64)
+		v.copyOf(v0)
+		v0.AuxInt = int32ToAuxInt(i)
+		v0.Aux = symToAux(s)
+		v0.AddArg2(p, mem)
 		return true
 	}
-	// match: (BSWAPQ (MOVBEQload [i] {s} p m))
-	// result: (MOVQload [i] {s} p m)
+	// match: (BSWAPQ x:(MOVBEQload [i] {s} p mem))
+	// cond: x.Uses == 1
+	// result: @x.Block (MOVQload [i] {s} p mem)
 	for {
-		if v_0.Op != OpAMD64MOVBEQload {
+		x := v_0
+		if x.Op != OpAMD64MOVBEQload {
 			break
 		}
-		i := auxIntToInt32(v_0.AuxInt)
-		s := auxToSym(v_0.Aux)
-		m := v_0.Args[1]
-		p := v_0.Args[0]
-		v.reset(OpAMD64MOVQload)
-		v.AuxInt = int32ToAuxInt(i)
-		v.Aux = symToAux(s)
-		v.AddArg2(p, m)
+		i := auxIntToInt32(x.AuxInt)
+		s := auxToSym(x.Aux)
+		mem := x.Args[1]
+		p := x.Args[0]
+		if !(x.Uses == 1) {
+			break
+		}
+		b = x.Block
+		v0 := b.NewValue0(x.Pos, OpAMD64MOVQload, typ.UInt64)
+		v.copyOf(v0)
+		v0.AuxInt = int32ToAuxInt(i)
+		v0.Aux = symToAux(s)
+		v0.AddArg2(p, mem)
 		return true
 	}
 	return false
@@ -4347,6 +4383,7 @@
 	v_2 := v.Args[2]
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
+	b := v.Block
 	// match: (CMOVLEQ x y (InvertFlags cond))
 	// result: (CMOVLEQ x y cond)
 	for {
@@ -4410,6 +4447,62 @@
 		v.copyOf(y)
 		return true
 	}
+	// match: (CMOVLEQ x y (TESTQ s:(Select0 blsr:(BLSRQ _)) s))
+	// result: (CMOVLEQ x y (Select1 <types.TypeFlags> blsr))
+	for {
+		x := v_0
+		y := v_1
+		if v_2.Op != OpAMD64TESTQ {
+			break
+		}
+		_ = v_2.Args[1]
+		v_2_0 := v_2.Args[0]
+		v_2_1 := v_2.Args[1]
+		for _i0 := 0; _i0 <= 1; _i0, v_2_0, v_2_1 = _i0+1, v_2_1, v_2_0 {
+			s := v_2_0
+			if s.Op != OpSelect0 {
+				continue
+			}
+			blsr := s.Args[0]
+			if blsr.Op != OpAMD64BLSRQ || s != v_2_1 {
+				continue
+			}
+			v.reset(OpAMD64CMOVLEQ)
+			v0 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags)
+			v0.AddArg(blsr)
+			v.AddArg3(x, y, v0)
+			return true
+		}
+		break
+	}
+	// match: (CMOVLEQ x y (TESTL s:(Select0 blsr:(BLSRL _)) s))
+	// result: (CMOVLEQ x y (Select1 <types.TypeFlags> blsr))
+	for {
+		x := v_0
+		y := v_1
+		if v_2.Op != OpAMD64TESTL {
+			break
+		}
+		_ = v_2.Args[1]
+		v_2_0 := v_2.Args[0]
+		v_2_1 := v_2.Args[1]
+		for _i0 := 0; _i0 <= 1; _i0, v_2_0, v_2_1 = _i0+1, v_2_1, v_2_0 {
+			s := v_2_0
+			if s.Op != OpSelect0 {
+				continue
+			}
+			blsr := s.Args[0]
+			if blsr.Op != OpAMD64BLSRL || s != v_2_1 {
+				continue
+			}
+			v.reset(OpAMD64CMOVLEQ)
+			v0 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags)
+			v0.AddArg(blsr)
+			v.AddArg3(x, y, v0)
+			return true
+		}
+		break
+	}
 	return false
 }
 func rewriteValueAMD64_OpAMD64CMOVLGE(v *Value) bool {
@@ -4830,6 +4923,7 @@
 	v_2 := v.Args[2]
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
+	b := v.Block
 	// match: (CMOVLNE x y (InvertFlags cond))
 	// result: (CMOVLNE x y cond)
 	for {
@@ -4893,6 +4987,62 @@
 		v.copyOf(x)
 		return true
 	}
+	// match: (CMOVLNE x y (TESTQ s:(Select0 blsr:(BLSRQ _)) s))
+	// result: (CMOVLNE x y (Select1 <types.TypeFlags> blsr))
+	for {
+		x := v_0
+		y := v_1
+		if v_2.Op != OpAMD64TESTQ {
+			break
+		}
+		_ = v_2.Args[1]
+		v_2_0 := v_2.Args[0]
+		v_2_1 := v_2.Args[1]
+		for _i0 := 0; _i0 <= 1; _i0, v_2_0, v_2_1 = _i0+1, v_2_1, v_2_0 {
+			s := v_2_0
+			if s.Op != OpSelect0 {
+				continue
+			}
+			blsr := s.Args[0]
+			if blsr.Op != OpAMD64BLSRQ || s != v_2_1 {
+				continue
+			}
+			v.reset(OpAMD64CMOVLNE)
+			v0 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags)
+			v0.AddArg(blsr)
+			v.AddArg3(x, y, v0)
+			return true
+		}
+		break
+	}
+	// match: (CMOVLNE x y (TESTL s:(Select0 blsr:(BLSRL _)) s))
+	// result: (CMOVLNE x y (Select1 <types.TypeFlags> blsr))
+	for {
+		x := v_0
+		y := v_1
+		if v_2.Op != OpAMD64TESTL {
+			break
+		}
+		_ = v_2.Args[1]
+		v_2_0 := v_2.Args[0]
+		v_2_1 := v_2.Args[1]
+		for _i0 := 0; _i0 <= 1; _i0, v_2_0, v_2_1 = _i0+1, v_2_1, v_2_0 {
+			s := v_2_0
+			if s.Op != OpSelect0 {
+				continue
+			}
+			blsr := s.Args[0]
+			if blsr.Op != OpAMD64BLSRL || s != v_2_1 {
+				continue
+			}
+			v.reset(OpAMD64CMOVLNE)
+			v0 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags)
+			v0.AddArg(blsr)
+			v.AddArg3(x, y, v0)
+			return true
+		}
+		break
+	}
 	return false
 }
 func rewriteValueAMD64_OpAMD64CMOVQCC(v *Value) bool {
@@ -5037,6 +5187,7 @@
 	v_2 := v.Args[2]
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
+	b := v.Block
 	// match: (CMOVQEQ x y (InvertFlags cond))
 	// result: (CMOVQEQ x y cond)
 	for {
@@ -5146,6 +5297,62 @@
 		v.copyOf(x)
 		return true
 	}
+	// match: (CMOVQEQ x y (TESTQ s:(Select0 blsr:(BLSRQ _)) s))
+	// result: (CMOVQEQ x y (Select1 <types.TypeFlags> blsr))
+	for {
+		x := v_0
+		y := v_1
+		if v_2.Op != OpAMD64TESTQ {
+			break
+		}
+		_ = v_2.Args[1]
+		v_2_0 := v_2.Args[0]
+		v_2_1 := v_2.Args[1]
+		for _i0 := 0; _i0 <= 1; _i0, v_2_0, v_2_1 = _i0+1, v_2_1, v_2_0 {
+			s := v_2_0
+			if s.Op != OpSelect0 {
+				continue
+			}
+			blsr := s.Args[0]
+			if blsr.Op != OpAMD64BLSRQ || s != v_2_1 {
+				continue
+			}
+			v.reset(OpAMD64CMOVQEQ)
+			v0 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags)
+			v0.AddArg(blsr)
+			v.AddArg3(x, y, v0)
+			return true
+		}
+		break
+	}
+	// match: (CMOVQEQ x y (TESTL s:(Select0 blsr:(BLSRL _)) s))
+	// result: (CMOVQEQ x y (Select1 <types.TypeFlags> blsr))
+	for {
+		x := v_0
+		y := v_1
+		if v_2.Op != OpAMD64TESTL {
+			break
+		}
+		_ = v_2.Args[1]
+		v_2_0 := v_2.Args[0]
+		v_2_1 := v_2.Args[1]
+		for _i0 := 0; _i0 <= 1; _i0, v_2_0, v_2_1 = _i0+1, v_2_1, v_2_0 {
+			s := v_2_0
+			if s.Op != OpSelect0 {
+				continue
+			}
+			blsr := s.Args[0]
+			if blsr.Op != OpAMD64BLSRL || s != v_2_1 {
+				continue
+			}
+			v.reset(OpAMD64CMOVQEQ)
+			v0 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags)
+			v0.AddArg(blsr)
+			v.AddArg3(x, y, v0)
+			return true
+		}
+		break
+	}
 	return false
 }
 func rewriteValueAMD64_OpAMD64CMOVQGE(v *Value) bool {
@@ -5566,6 +5773,7 @@
 	v_2 := v.Args[2]
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
+	b := v.Block
 	// match: (CMOVQNE x y (InvertFlags cond))
 	// result: (CMOVQNE x y cond)
 	for {
@@ -5629,6 +5837,62 @@
 		v.copyOf(x)
 		return true
 	}
+	// match: (CMOVQNE x y (TESTQ s:(Select0 blsr:(BLSRQ _)) s))
+	// result: (CMOVQNE x y (Select1 <types.TypeFlags> blsr))
+	for {
+		x := v_0
+		y := v_1
+		if v_2.Op != OpAMD64TESTQ {
+			break
+		}
+		_ = v_2.Args[1]
+		v_2_0 := v_2.Args[0]
+		v_2_1 := v_2.Args[1]
+		for _i0 := 0; _i0 <= 1; _i0, v_2_0, v_2_1 = _i0+1, v_2_1, v_2_0 {
+			s := v_2_0
+			if s.Op != OpSelect0 {
+				continue
+			}
+			blsr := s.Args[0]
+			if blsr.Op != OpAMD64BLSRQ || s != v_2_1 {
+				continue
+			}
+			v.reset(OpAMD64CMOVQNE)
+			v0 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags)
+			v0.AddArg(blsr)
+			v.AddArg3(x, y, v0)
+			return true
+		}
+		break
+	}
+	// match: (CMOVQNE x y (TESTL s:(Select0 blsr:(BLSRL _)) s))
+	// result: (CMOVQNE x y (Select1 <types.TypeFlags> blsr))
+	for {
+		x := v_0
+		y := v_1
+		if v_2.Op != OpAMD64TESTL {
+			break
+		}
+		_ = v_2.Args[1]
+		v_2_0 := v_2.Args[0]
+		v_2_1 := v_2.Args[1]
+		for _i0 := 0; _i0 <= 1; _i0, v_2_0, v_2_1 = _i0+1, v_2_1, v_2_0 {
+			s := v_2_0
+			if s.Op != OpSelect0 {
+				continue
+			}
+			blsr := s.Args[0]
+			if blsr.Op != OpAMD64BLSRL || s != v_2_1 {
+				continue
+			}
+			v.reset(OpAMD64CMOVQNE)
+			v0 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags)
+			v0.AddArg(blsr)
+			v.AddArg3(x, y, v0)
+			return true
+		}
+		break
+	}
 	return false
 }
 func rewriteValueAMD64_OpAMD64CMOVWCC(v *Value) bool {
@@ -9398,21 +9662,26 @@
 	v_2 := v.Args[2]
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
-	// match: (MOVBELstore [i] {s} p (BSWAPL x) m)
-	// result: (MOVLstore [i] {s} p x m)
+	// match: (MOVBELstore [i] {s} p x:(BSWAPL w) mem)
+	// cond: x.Uses == 1
+	// result: (MOVLstore [i] {s} p w mem)
 	for {
 		i := auxIntToInt32(v.AuxInt)
 		s := auxToSym(v.Aux)
 		p := v_0
-		if v_1.Op != OpAMD64BSWAPL {
+		x := v_1
+		if x.Op != OpAMD64BSWAPL {
 			break
 		}
-		x := v_1.Args[0]
-		m := v_2
+		w := x.Args[0]
+		mem := v_2
+		if !(x.Uses == 1) {
+			break
+		}
 		v.reset(OpAMD64MOVLstore)
 		v.AuxInt = int32ToAuxInt(i)
 		v.Aux = symToAux(s)
-		v.AddArg3(p, x, m)
+		v.AddArg3(p, w, mem)
 		return true
 	}
 	return false
@@ -9421,21 +9690,26 @@
 	v_2 := v.Args[2]
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
-	// match: (MOVBEQstore [i] {s} p (BSWAPQ x) m)
-	// result: (MOVQstore [i] {s} p x m)
+	// match: (MOVBEQstore [i] {s} p x:(BSWAPQ w) mem)
+	// cond: x.Uses == 1
+	// result: (MOVQstore [i] {s} p w mem)
 	for {
 		i := auxIntToInt32(v.AuxInt)
 		s := auxToSym(v.Aux)
 		p := v_0
-		if v_1.Op != OpAMD64BSWAPQ {
+		x := v_1
+		if x.Op != OpAMD64BSWAPQ {
 			break
 		}
-		x := v_1.Args[0]
-		m := v_2
+		w := x.Args[0]
+		mem := v_2
+		if !(x.Uses == 1) {
+			break
+		}
 		v.reset(OpAMD64MOVQstore)
 		v.AuxInt = int32ToAuxInt(i)
 		v.Aux = symToAux(s)
-		v.AddArg3(p, x, m)
+		v.AddArg3(p, w, mem)
 		return true
 	}
 	return false
@@ -10242,823 +10516,6 @@
 		v.AddArg3(base, val, mem)
 		return true
 	}
-	// match: (MOVBstore [i] {s} p w x0:(MOVBstore [i-1] {s} p (SHRWconst [8] w) mem))
-	// cond: x0.Uses == 1 && clobber(x0)
-	// result: (MOVWstore [i-1] {s} p (ROLWconst <w.Type> [8] w) mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p := v_0
-		w := v_1
-		x0 := v_2
-		if x0.Op != OpAMD64MOVBstore || auxIntToInt32(x0.AuxInt) != i-1 || auxToSym(x0.Aux) != s {
-			break
-		}
-		mem := x0.Args[2]
-		if p != x0.Args[0] {
-			break
-		}
-		x0_1 := x0.Args[1]
-		if x0_1.Op != OpAMD64SHRWconst || auxIntToInt8(x0_1.AuxInt) != 8 || w != x0_1.Args[0] || !(x0.Uses == 1 && clobber(x0)) {
-			break
-		}
-		v.reset(OpAMD64MOVWstore)
-		v.AuxInt = int32ToAuxInt(i - 1)
-		v.Aux = symToAux(s)
-		v0 := b.NewValue0(x0.Pos, OpAMD64ROLWconst, w.Type)
-		v0.AuxInt = int8ToAuxInt(8)
-		v0.AddArg(w)
-		v.AddArg3(p, v0, mem)
-		return true
-	}
-	// match: (MOVBstore [i] {s} p1 w x0:(MOVBstore [i] {s} p0 (SHRWconst [8] w) mem))
-	// cond: x0.Uses == 1 && sequentialAddresses(p0, p1, 1) && clobber(x0)
-	// result: (MOVWstore [i] {s} p0 (ROLWconst <w.Type> [8] w) mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p1 := v_0
-		w := v_1
-		x0 := v_2
-		if x0.Op != OpAMD64MOVBstore || auxIntToInt32(x0.AuxInt) != i || auxToSym(x0.Aux) != s {
-			break
-		}
-		mem := x0.Args[2]
-		p0 := x0.Args[0]
-		x0_1 := x0.Args[1]
-		if x0_1.Op != OpAMD64SHRWconst || auxIntToInt8(x0_1.AuxInt) != 8 || w != x0_1.Args[0] || !(x0.Uses == 1 && sequentialAddresses(p0, p1, 1) && clobber(x0)) {
-			break
-		}
-		v.reset(OpAMD64MOVWstore)
-		v.AuxInt = int32ToAuxInt(i)
-		v.Aux = symToAux(s)
-		v0 := b.NewValue0(x0.Pos, OpAMD64ROLWconst, w.Type)
-		v0.AuxInt = int8ToAuxInt(8)
-		v0.AddArg(w)
-		v.AddArg3(p0, v0, mem)
-		return true
-	}
-	// match: (MOVBstore [i] {s} p w x2:(MOVBstore [i-1] {s} p (SHRLconst [8] w) x1:(MOVBstore [i-2] {s} p (SHRLconst [16] w) x0:(MOVBstore [i-3] {s} p (SHRLconst [24] w) mem))))
-	// cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && clobber(x0, x1, x2)
-	// result: (MOVLstore [i-3] {s} p (BSWAPL <w.Type> w) mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p := v_0
-		w := v_1
-		x2 := v_2
-		if x2.Op != OpAMD64MOVBstore || auxIntToInt32(x2.AuxInt) != i-1 || auxToSym(x2.Aux) != s {
-			break
-		}
-		_ = x2.Args[2]
-		if p != x2.Args[0] {
-			break
-		}
-		x2_1 := x2.Args[1]
-		if x2_1.Op != OpAMD64SHRLconst || auxIntToInt8(x2_1.AuxInt) != 8 || w != x2_1.Args[0] {
-			break
-		}
-		x1 := x2.Args[2]
-		if x1.Op != OpAMD64MOVBstore || auxIntToInt32(x1.AuxInt) != i-2 || auxToSym(x1.Aux) != s {
-			break
-		}
-		_ = x1.Args[2]
-		if p != x1.Args[0] {
-			break
-		}
-		x1_1 := x1.Args[1]
-		if x1_1.Op != OpAMD64SHRLconst || auxIntToInt8(x1_1.AuxInt) != 16 || w != x1_1.Args[0] {
-			break
-		}
-		x0 := x1.Args[2]
-		if x0.Op != OpAMD64MOVBstore || auxIntToInt32(x0.AuxInt) != i-3 || auxToSym(x0.Aux) != s {
-			break
-		}
-		mem := x0.Args[2]
-		if p != x0.Args[0] {
-			break
-		}
-		x0_1 := x0.Args[1]
-		if x0_1.Op != OpAMD64SHRLconst || auxIntToInt8(x0_1.AuxInt) != 24 || w != x0_1.Args[0] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && clobber(x0, x1, x2)) {
-			break
-		}
-		v.reset(OpAMD64MOVLstore)
-		v.AuxInt = int32ToAuxInt(i - 3)
-		v.Aux = symToAux(s)
-		v0 := b.NewValue0(x0.Pos, OpAMD64BSWAPL, w.Type)
-		v0.AddArg(w)
-		v.AddArg3(p, v0, mem)
-		return true
-	}
-	// match: (MOVBstore [i] {s} p3 w x2:(MOVBstore [i] {s} p2 (SHRLconst [8] w) x1:(MOVBstore [i] {s} p1 (SHRLconst [16] w) x0:(MOVBstore [i] {s} p0 (SHRLconst [24] w) mem))))
-	// cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && sequentialAddresses(p0, p1, 1) && sequentialAddresses(p1, p2, 1) && sequentialAddresses(p2, p3, 1) && clobber(x0, x1, x2)
-	// result: (MOVLstore [i] {s} p0 (BSWAPL <w.Type> w) mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p3 := v_0
-		w := v_1
-		x2 := v_2
-		if x2.Op != OpAMD64MOVBstore || auxIntToInt32(x2.AuxInt) != i || auxToSym(x2.Aux) != s {
-			break
-		}
-		_ = x2.Args[2]
-		p2 := x2.Args[0]
-		x2_1 := x2.Args[1]
-		if x2_1.Op != OpAMD64SHRLconst || auxIntToInt8(x2_1.AuxInt) != 8 || w != x2_1.Args[0] {
-			break
-		}
-		x1 := x2.Args[2]
-		if x1.Op != OpAMD64MOVBstore || auxIntToInt32(x1.AuxInt) != i || auxToSym(x1.Aux) != s {
-			break
-		}
-		_ = x1.Args[2]
-		p1 := x1.Args[0]
-		x1_1 := x1.Args[1]
-		if x1_1.Op != OpAMD64SHRLconst || auxIntToInt8(x1_1.AuxInt) != 16 || w != x1_1.Args[0] {
-			break
-		}
-		x0 := x1.Args[2]
-		if x0.Op != OpAMD64MOVBstore || auxIntToInt32(x0.AuxInt) != i || auxToSym(x0.Aux) != s {
-			break
-		}
-		mem := x0.Args[2]
-		p0 := x0.Args[0]
-		x0_1 := x0.Args[1]
-		if x0_1.Op != OpAMD64SHRLconst || auxIntToInt8(x0_1.AuxInt) != 24 || w != x0_1.Args[0] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && sequentialAddresses(p0, p1, 1) && sequentialAddresses(p1, p2, 1) && sequentialAddresses(p2, p3, 1) && clobber(x0, x1, x2)) {
-			break
-		}
-		v.reset(OpAMD64MOVLstore)
-		v.AuxInt = int32ToAuxInt(i)
-		v.Aux = symToAux(s)
-		v0 := b.NewValue0(x0.Pos, OpAMD64BSWAPL, w.Type)
-		v0.AddArg(w)
-		v.AddArg3(p0, v0, mem)
-		return true
-	}
-	// match: (MOVBstore [i] {s} p w x6:(MOVBstore [i-1] {s} p (SHRQconst [8] w) x5:(MOVBstore [i-2] {s} p (SHRQconst [16] w) x4:(MOVBstore [i-3] {s} p (SHRQconst [24] w) x3:(MOVBstore [i-4] {s} p (SHRQconst [32] w) x2:(MOVBstore [i-5] {s} p (SHRQconst [40] w) x1:(MOVBstore [i-6] {s} p (SHRQconst [48] w) x0:(MOVBstore [i-7] {s} p (SHRQconst [56] w) mem))))))))
-	// cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && clobber(x0, x1, x2, x3, x4, x5, x6)
-	// result: (MOVQstore [i-7] {s} p (BSWAPQ <w.Type> w) mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p := v_0
-		w := v_1
-		x6 := v_2
-		if x6.Op != OpAMD64MOVBstore || auxIntToInt32(x6.AuxInt) != i-1 || auxToSym(x6.Aux) != s {
-			break
-		}
-		_ = x6.Args[2]
-		if p != x6.Args[0] {
-			break
-		}
-		x6_1 := x6.Args[1]
-		if x6_1.Op != OpAMD64SHRQconst || auxIntToInt8(x6_1.AuxInt) != 8 || w != x6_1.Args[0] {
-			break
-		}
-		x5 := x6.Args[2]
-		if x5.Op != OpAMD64MOVBstore || auxIntToInt32(x5.AuxInt) != i-2 || auxToSym(x5.Aux) != s {
-			break
-		}
-		_ = x5.Args[2]
-		if p != x5.Args[0] {
-			break
-		}
-		x5_1 := x5.Args[1]
-		if x5_1.Op != OpAMD64SHRQconst || auxIntToInt8(x5_1.AuxInt) != 16 || w != x5_1.Args[0] {
-			break
-		}
-		x4 := x5.Args[2]
-		if x4.Op != OpAMD64MOVBstore || auxIntToInt32(x4.AuxInt) != i-3 || auxToSym(x4.Aux) != s {
-			break
-		}
-		_ = x4.Args[2]
-		if p != x4.Args[0] {
-			break
-		}
-		x4_1 := x4.Args[1]
-		if x4_1.Op != OpAMD64SHRQconst || auxIntToInt8(x4_1.AuxInt) != 24 || w != x4_1.Args[0] {
-			break
-		}
-		x3 := x4.Args[2]
-		if x3.Op != OpAMD64MOVBstore || auxIntToInt32(x3.AuxInt) != i-4 || auxToSym(x3.Aux) != s {
-			break
-		}
-		_ = x3.Args[2]
-		if p != x3.Args[0] {
-			break
-		}
-		x3_1 := x3.Args[1]
-		if x3_1.Op != OpAMD64SHRQconst || auxIntToInt8(x3_1.AuxInt) != 32 || w != x3_1.Args[0] {
-			break
-		}
-		x2 := x3.Args[2]
-		if x2.Op != OpAMD64MOVBstore || auxIntToInt32(x2.AuxInt) != i-5 || auxToSym(x2.Aux) != s {
-			break
-		}
-		_ = x2.Args[2]
-		if p != x2.Args[0] {
-			break
-		}
-		x2_1 := x2.Args[1]
-		if x2_1.Op != OpAMD64SHRQconst || auxIntToInt8(x2_1.AuxInt) != 40 || w != x2_1.Args[0] {
-			break
-		}
-		x1 := x2.Args[2]
-		if x1.Op != OpAMD64MOVBstore || auxIntToInt32(x1.AuxInt) != i-6 || auxToSym(x1.Aux) != s {
-			break
-		}
-		_ = x1.Args[2]
-		if p != x1.Args[0] {
-			break
-		}
-		x1_1 := x1.Args[1]
-		if x1_1.Op != OpAMD64SHRQconst || auxIntToInt8(x1_1.AuxInt) != 48 || w != x1_1.Args[0] {
-			break
-		}
-		x0 := x1.Args[2]
-		if x0.Op != OpAMD64MOVBstore || auxIntToInt32(x0.AuxInt) != i-7 || auxToSym(x0.Aux) != s {
-			break
-		}
-		mem := x0.Args[2]
-		if p != x0.Args[0] {
-			break
-		}
-		x0_1 := x0.Args[1]
-		if x0_1.Op != OpAMD64SHRQconst || auxIntToInt8(x0_1.AuxInt) != 56 || w != x0_1.Args[0] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && clobber(x0, x1, x2, x3, x4, x5, x6)) {
-			break
-		}
-		v.reset(OpAMD64MOVQstore)
-		v.AuxInt = int32ToAuxInt(i - 7)
-		v.Aux = symToAux(s)
-		v0 := b.NewValue0(x0.Pos, OpAMD64BSWAPQ, w.Type)
-		v0.AddArg(w)
-		v.AddArg3(p, v0, mem)
-		return true
-	}
-	// match: (MOVBstore [i] {s} p7 w x6:(MOVBstore [i] {s} p6 (SHRQconst [8] w) x5:(MOVBstore [i] {s} p5 (SHRQconst [16] w) x4:(MOVBstore [i] {s} p4 (SHRQconst [24] w) x3:(MOVBstore [i] {s} p3 (SHRQconst [32] w) x2:(MOVBstore [i] {s} p2 (SHRQconst [40] w) x1:(MOVBstore [i] {s} p1 (SHRQconst [48] w) x0:(MOVBstore [i] {s} p0 (SHRQconst [56] w) mem))))))))
-	// cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && sequentialAddresses(p0, p1, 1) && sequentialAddresses(p1, p2, 1) && sequentialAddresses(p2, p3, 1) && sequentialAddresses(p3, p4, 1) && sequentialAddresses(p4, p5, 1) && sequentialAddresses(p5, p6, 1) && sequentialAddresses(p6, p7, 1) && clobber(x0, x1, x2, x3, x4, x5, x6)
-	// result: (MOVQstore [i] {s} p0 (BSWAPQ <w.Type> w) mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p7 := v_0
-		w := v_1
-		x6 := v_2
-		if x6.Op != OpAMD64MOVBstore || auxIntToInt32(x6.AuxInt) != i || auxToSym(x6.Aux) != s {
-			break
-		}
-		_ = x6.Args[2]
-		p6 := x6.Args[0]
-		x6_1 := x6.Args[1]
-		if x6_1.Op != OpAMD64SHRQconst || auxIntToInt8(x6_1.AuxInt) != 8 || w != x6_1.Args[0] {
-			break
-		}
-		x5 := x6.Args[2]
-		if x5.Op != OpAMD64MOVBstore || auxIntToInt32(x5.AuxInt) != i || auxToSym(x5.Aux) != s {
-			break
-		}
-		_ = x5.Args[2]
-		p5 := x5.Args[0]
-		x5_1 := x5.Args[1]
-		if x5_1.Op != OpAMD64SHRQconst || auxIntToInt8(x5_1.AuxInt) != 16 || w != x5_1.Args[0] {
-			break
-		}
-		x4 := x5.Args[2]
-		if x4.Op != OpAMD64MOVBstore || auxIntToInt32(x4.AuxInt) != i || auxToSym(x4.Aux) != s {
-			break
-		}
-		_ = x4.Args[2]
-		p4 := x4.Args[0]
-		x4_1 := x4.Args[1]
-		if x4_1.Op != OpAMD64SHRQconst || auxIntToInt8(x4_1.AuxInt) != 24 || w != x4_1.Args[0] {
-			break
-		}
-		x3 := x4.Args[2]
-		if x3.Op != OpAMD64MOVBstore || auxIntToInt32(x3.AuxInt) != i || auxToSym(x3.Aux) != s {
-			break
-		}
-		_ = x3.Args[2]
-		p3 := x3.Args[0]
-		x3_1 := x3.Args[1]
-		if x3_1.Op != OpAMD64SHRQconst || auxIntToInt8(x3_1.AuxInt) != 32 || w != x3_1.Args[0] {
-			break
-		}
-		x2 := x3.Args[2]
-		if x2.Op != OpAMD64MOVBstore || auxIntToInt32(x2.AuxInt) != i || auxToSym(x2.Aux) != s {
-			break
-		}
-		_ = x2.Args[2]
-		p2 := x2.Args[0]
-		x2_1 := x2.Args[1]
-		if x2_1.Op != OpAMD64SHRQconst || auxIntToInt8(x2_1.AuxInt) != 40 || w != x2_1.Args[0] {
-			break
-		}
-		x1 := x2.Args[2]
-		if x1.Op != OpAMD64MOVBstore || auxIntToInt32(x1.AuxInt) != i || auxToSym(x1.Aux) != s {
-			break
-		}
-		_ = x1.Args[2]
-		p1 := x1.Args[0]
-		x1_1 := x1.Args[1]
-		if x1_1.Op != OpAMD64SHRQconst || auxIntToInt8(x1_1.AuxInt) != 48 || w != x1_1.Args[0] {
-			break
-		}
-		x0 := x1.Args[2]
-		if x0.Op != OpAMD64MOVBstore || auxIntToInt32(x0.AuxInt) != i || auxToSym(x0.Aux) != s {
-			break
-		}
-		mem := x0.Args[2]
-		p0 := x0.Args[0]
-		x0_1 := x0.Args[1]
-		if x0_1.Op != OpAMD64SHRQconst || auxIntToInt8(x0_1.AuxInt) != 56 || w != x0_1.Args[0] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && sequentialAddresses(p0, p1, 1) && sequentialAddresses(p1, p2, 1) && sequentialAddresses(p2, p3, 1) && sequentialAddresses(p3, p4, 1) && sequentialAddresses(p4, p5, 1) && sequentialAddresses(p5, p6, 1) && sequentialAddresses(p6, p7, 1) && clobber(x0, x1, x2, x3, x4, x5, x6)) {
-			break
-		}
-		v.reset(OpAMD64MOVQstore)
-		v.AuxInt = int32ToAuxInt(i)
-		v.Aux = symToAux(s)
-		v0 := b.NewValue0(x0.Pos, OpAMD64BSWAPQ, w.Type)
-		v0.AddArg(w)
-		v.AddArg3(p0, v0, mem)
-		return true
-	}
-	// match: (MOVBstore [i] {s} p (SHRWconst [8] w) x:(MOVBstore [i-1] {s} p w mem))
-	// cond: x.Uses == 1 && clobber(x)
-	// result: (MOVWstore [i-1] {s} p w mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p := v_0
-		if v_1.Op != OpAMD64SHRWconst || auxIntToInt8(v_1.AuxInt) != 8 {
-			break
-		}
-		w := v_1.Args[0]
-		x := v_2
-		if x.Op != OpAMD64MOVBstore || auxIntToInt32(x.AuxInt) != i-1 || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		if p != x.Args[0] || w != x.Args[1] || !(x.Uses == 1 && clobber(x)) {
-			break
-		}
-		v.reset(OpAMD64MOVWstore)
-		v.AuxInt = int32ToAuxInt(i - 1)
-		v.Aux = symToAux(s)
-		v.AddArg3(p, w, mem)
-		return true
-	}
-	// match: (MOVBstore [i] {s} p (SHRLconst [8] w) x:(MOVBstore [i-1] {s} p w mem))
-	// cond: x.Uses == 1 && clobber(x)
-	// result: (MOVWstore [i-1] {s} p w mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p := v_0
-		if v_1.Op != OpAMD64SHRLconst || auxIntToInt8(v_1.AuxInt) != 8 {
-			break
-		}
-		w := v_1.Args[0]
-		x := v_2
-		if x.Op != OpAMD64MOVBstore || auxIntToInt32(x.AuxInt) != i-1 || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		if p != x.Args[0] || w != x.Args[1] || !(x.Uses == 1 && clobber(x)) {
-			break
-		}
-		v.reset(OpAMD64MOVWstore)
-		v.AuxInt = int32ToAuxInt(i - 1)
-		v.Aux = symToAux(s)
-		v.AddArg3(p, w, mem)
-		return true
-	}
-	// match: (MOVBstore [i] {s} p (SHRQconst [8] w) x:(MOVBstore [i-1] {s} p w mem))
-	// cond: x.Uses == 1 && clobber(x)
-	// result: (MOVWstore [i-1] {s} p w mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p := v_0
-		if v_1.Op != OpAMD64SHRQconst || auxIntToInt8(v_1.AuxInt) != 8 {
-			break
-		}
-		w := v_1.Args[0]
-		x := v_2
-		if x.Op != OpAMD64MOVBstore || auxIntToInt32(x.AuxInt) != i-1 || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		if p != x.Args[0] || w != x.Args[1] || !(x.Uses == 1 && clobber(x)) {
-			break
-		}
-		v.reset(OpAMD64MOVWstore)
-		v.AuxInt = int32ToAuxInt(i - 1)
-		v.Aux = symToAux(s)
-		v.AddArg3(p, w, mem)
-		return true
-	}
-	// match: (MOVBstore [i] {s} p w x:(MOVBstore [i+1] {s} p (SHRWconst [8] w) mem))
-	// cond: x.Uses == 1 && clobber(x)
-	// result: (MOVWstore [i] {s} p w mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p := v_0
-		w := v_1
-		x := v_2
-		if x.Op != OpAMD64MOVBstore || auxIntToInt32(x.AuxInt) != i+1 || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		if p != x.Args[0] {
-			break
-		}
-		x_1 := x.Args[1]
-		if x_1.Op != OpAMD64SHRWconst || auxIntToInt8(x_1.AuxInt) != 8 || w != x_1.Args[0] || !(x.Uses == 1 && clobber(x)) {
-			break
-		}
-		v.reset(OpAMD64MOVWstore)
-		v.AuxInt = int32ToAuxInt(i)
-		v.Aux = symToAux(s)
-		v.AddArg3(p, w, mem)
-		return true
-	}
-	// match: (MOVBstore [i] {s} p w x:(MOVBstore [i+1] {s} p (SHRLconst [8] w) mem))
-	// cond: x.Uses == 1 && clobber(x)
-	// result: (MOVWstore [i] {s} p w mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p := v_0
-		w := v_1
-		x := v_2
-		if x.Op != OpAMD64MOVBstore || auxIntToInt32(x.AuxInt) != i+1 || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		if p != x.Args[0] {
-			break
-		}
-		x_1 := x.Args[1]
-		if x_1.Op != OpAMD64SHRLconst || auxIntToInt8(x_1.AuxInt) != 8 || w != x_1.Args[0] || !(x.Uses == 1 && clobber(x)) {
-			break
-		}
-		v.reset(OpAMD64MOVWstore)
-		v.AuxInt = int32ToAuxInt(i)
-		v.Aux = symToAux(s)
-		v.AddArg3(p, w, mem)
-		return true
-	}
-	// match: (MOVBstore [i] {s} p w x:(MOVBstore [i+1] {s} p (SHRQconst [8] w) mem))
-	// cond: x.Uses == 1 && clobber(x)
-	// result: (MOVWstore [i] {s} p w mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p := v_0
-		w := v_1
-		x := v_2
-		if x.Op != OpAMD64MOVBstore || auxIntToInt32(x.AuxInt) != i+1 || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		if p != x.Args[0] {
-			break
-		}
-		x_1 := x.Args[1]
-		if x_1.Op != OpAMD64SHRQconst || auxIntToInt8(x_1.AuxInt) != 8 || w != x_1.Args[0] || !(x.Uses == 1 && clobber(x)) {
-			break
-		}
-		v.reset(OpAMD64MOVWstore)
-		v.AuxInt = int32ToAuxInt(i)
-		v.Aux = symToAux(s)
-		v.AddArg3(p, w, mem)
-		return true
-	}
-	// match: (MOVBstore [i] {s} p (SHRLconst [j] w) x:(MOVBstore [i-1] {s} p w0:(SHRLconst [j-8] w) mem))
-	// cond: x.Uses == 1 && clobber(x)
-	// result: (MOVWstore [i-1] {s} p w0 mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p := v_0
-		if v_1.Op != OpAMD64SHRLconst {
-			break
-		}
-		j := auxIntToInt8(v_1.AuxInt)
-		w := v_1.Args[0]
-		x := v_2
-		if x.Op != OpAMD64MOVBstore || auxIntToInt32(x.AuxInt) != i-1 || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		if p != x.Args[0] {
-			break
-		}
-		w0 := x.Args[1]
-		if w0.Op != OpAMD64SHRLconst || auxIntToInt8(w0.AuxInt) != j-8 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) {
-			break
-		}
-		v.reset(OpAMD64MOVWstore)
-		v.AuxInt = int32ToAuxInt(i - 1)
-		v.Aux = symToAux(s)
-		v.AddArg3(p, w0, mem)
-		return true
-	}
-	// match: (MOVBstore [i] {s} p (SHRQconst [j] w) x:(MOVBstore [i-1] {s} p w0:(SHRQconst [j-8] w) mem))
-	// cond: x.Uses == 1 && clobber(x)
-	// result: (MOVWstore [i-1] {s} p w0 mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p := v_0
-		if v_1.Op != OpAMD64SHRQconst {
-			break
-		}
-		j := auxIntToInt8(v_1.AuxInt)
-		w := v_1.Args[0]
-		x := v_2
-		if x.Op != OpAMD64MOVBstore || auxIntToInt32(x.AuxInt) != i-1 || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		if p != x.Args[0] {
-			break
-		}
-		w0 := x.Args[1]
-		if w0.Op != OpAMD64SHRQconst || auxIntToInt8(w0.AuxInt) != j-8 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) {
-			break
-		}
-		v.reset(OpAMD64MOVWstore)
-		v.AuxInt = int32ToAuxInt(i - 1)
-		v.Aux = symToAux(s)
-		v.AddArg3(p, w0, mem)
-		return true
-	}
-	// match: (MOVBstore [i] {s} p1 (SHRWconst [8] w) x:(MOVBstore [i] {s} p0 w mem))
-	// cond: x.Uses == 1 && sequentialAddresses(p0, p1, 1) && clobber(x)
-	// result: (MOVWstore [i] {s} p0 w mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p1 := v_0
-		if v_1.Op != OpAMD64SHRWconst || auxIntToInt8(v_1.AuxInt) != 8 {
-			break
-		}
-		w := v_1.Args[0]
-		x := v_2
-		if x.Op != OpAMD64MOVBstore || auxIntToInt32(x.AuxInt) != i || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		p0 := x.Args[0]
-		if w != x.Args[1] || !(x.Uses == 1 && sequentialAddresses(p0, p1, 1) && clobber(x)) {
-			break
-		}
-		v.reset(OpAMD64MOVWstore)
-		v.AuxInt = int32ToAuxInt(i)
-		v.Aux = symToAux(s)
-		v.AddArg3(p0, w, mem)
-		return true
-	}
-	// match: (MOVBstore [i] {s} p1 (SHRLconst [8] w) x:(MOVBstore [i] {s} p0 w mem))
-	// cond: x.Uses == 1 && sequentialAddresses(p0, p1, 1) && clobber(x)
-	// result: (MOVWstore [i] {s} p0 w mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p1 := v_0
-		if v_1.Op != OpAMD64SHRLconst || auxIntToInt8(v_1.AuxInt) != 8 {
-			break
-		}
-		w := v_1.Args[0]
-		x := v_2
-		if x.Op != OpAMD64MOVBstore || auxIntToInt32(x.AuxInt) != i || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		p0 := x.Args[0]
-		if w != x.Args[1] || !(x.Uses == 1 && sequentialAddresses(p0, p1, 1) && clobber(x)) {
-			break
-		}
-		v.reset(OpAMD64MOVWstore)
-		v.AuxInt = int32ToAuxInt(i)
-		v.Aux = symToAux(s)
-		v.AddArg3(p0, w, mem)
-		return true
-	}
-	// match: (MOVBstore [i] {s} p1 (SHRQconst [8] w) x:(MOVBstore [i] {s} p0 w mem))
-	// cond: x.Uses == 1 && sequentialAddresses(p0, p1, 1) && clobber(x)
-	// result: (MOVWstore [i] {s} p0 w mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p1 := v_0
-		if v_1.Op != OpAMD64SHRQconst || auxIntToInt8(v_1.AuxInt) != 8 {
-			break
-		}
-		w := v_1.Args[0]
-		x := v_2
-		if x.Op != OpAMD64MOVBstore || auxIntToInt32(x.AuxInt) != i || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		p0 := x.Args[0]
-		if w != x.Args[1] || !(x.Uses == 1 && sequentialAddresses(p0, p1, 1) && clobber(x)) {
-			break
-		}
-		v.reset(OpAMD64MOVWstore)
-		v.AuxInt = int32ToAuxInt(i)
-		v.Aux = symToAux(s)
-		v.AddArg3(p0, w, mem)
-		return true
-	}
-	// match: (MOVBstore [i] {s} p0 w x:(MOVBstore [i] {s} p1 (SHRWconst [8] w) mem))
-	// cond: x.Uses == 1 && sequentialAddresses(p0, p1, 1) && clobber(x)
-	// result: (MOVWstore [i] {s} p0 w mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p0 := v_0
-		w := v_1
-		x := v_2
-		if x.Op != OpAMD64MOVBstore || auxIntToInt32(x.AuxInt) != i || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		p1 := x.Args[0]
-		x_1 := x.Args[1]
-		if x_1.Op != OpAMD64SHRWconst || auxIntToInt8(x_1.AuxInt) != 8 || w != x_1.Args[0] || !(x.Uses == 1 && sequentialAddresses(p0, p1, 1) && clobber(x)) {
-			break
-		}
-		v.reset(OpAMD64MOVWstore)
-		v.AuxInt = int32ToAuxInt(i)
-		v.Aux = symToAux(s)
-		v.AddArg3(p0, w, mem)
-		return true
-	}
-	// match: (MOVBstore [i] {s} p0 w x:(MOVBstore [i] {s} p1 (SHRLconst [8] w) mem))
-	// cond: x.Uses == 1 && sequentialAddresses(p0, p1, 1) && clobber(x)
-	// result: (MOVWstore [i] {s} p0 w mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p0 := v_0
-		w := v_1
-		x := v_2
-		if x.Op != OpAMD64MOVBstore || auxIntToInt32(x.AuxInt) != i || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		p1 := x.Args[0]
-		x_1 := x.Args[1]
-		if x_1.Op != OpAMD64SHRLconst || auxIntToInt8(x_1.AuxInt) != 8 || w != x_1.Args[0] || !(x.Uses == 1 && sequentialAddresses(p0, p1, 1) && clobber(x)) {
-			break
-		}
-		v.reset(OpAMD64MOVWstore)
-		v.AuxInt = int32ToAuxInt(i)
-		v.Aux = symToAux(s)
-		v.AddArg3(p0, w, mem)
-		return true
-	}
-	// match: (MOVBstore [i] {s} p0 w x:(MOVBstore [i] {s} p1 (SHRQconst [8] w) mem))
-	// cond: x.Uses == 1 && sequentialAddresses(p0, p1, 1) && clobber(x)
-	// result: (MOVWstore [i] {s} p0 w mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p0 := v_0
-		w := v_1
-		x := v_2
-		if x.Op != OpAMD64MOVBstore || auxIntToInt32(x.AuxInt) != i || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		p1 := x.Args[0]
-		x_1 := x.Args[1]
-		if x_1.Op != OpAMD64SHRQconst || auxIntToInt8(x_1.AuxInt) != 8 || w != x_1.Args[0] || !(x.Uses == 1 && sequentialAddresses(p0, p1, 1) && clobber(x)) {
-			break
-		}
-		v.reset(OpAMD64MOVWstore)
-		v.AuxInt = int32ToAuxInt(i)
-		v.Aux = symToAux(s)
-		v.AddArg3(p0, w, mem)
-		return true
-	}
-	// match: (MOVBstore [i] {s} p1 (SHRLconst [j] w) x:(MOVBstore [i] {s} p0 w0:(SHRLconst [j-8] w) mem))
-	// cond: x.Uses == 1 && sequentialAddresses(p0, p1, 1) && clobber(x)
-	// result: (MOVWstore [i] {s} p0 w0 mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p1 := v_0
-		if v_1.Op != OpAMD64SHRLconst {
-			break
-		}
-		j := auxIntToInt8(v_1.AuxInt)
-		w := v_1.Args[0]
-		x := v_2
-		if x.Op != OpAMD64MOVBstore || auxIntToInt32(x.AuxInt) != i || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		p0 := x.Args[0]
-		w0 := x.Args[1]
-		if w0.Op != OpAMD64SHRLconst || auxIntToInt8(w0.AuxInt) != j-8 || w != w0.Args[0] || !(x.Uses == 1 && sequentialAddresses(p0, p1, 1) && clobber(x)) {
-			break
-		}
-		v.reset(OpAMD64MOVWstore)
-		v.AuxInt = int32ToAuxInt(i)
-		v.Aux = symToAux(s)
-		v.AddArg3(p0, w0, mem)
-		return true
-	}
-	// match: (MOVBstore [i] {s} p1 (SHRQconst [j] w) x:(MOVBstore [i] {s} p0 w0:(SHRQconst [j-8] w) mem))
-	// cond: x.Uses == 1 && sequentialAddresses(p0, p1, 1) && clobber(x)
-	// result: (MOVWstore [i] {s} p0 w0 mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p1 := v_0
-		if v_1.Op != OpAMD64SHRQconst {
-			break
-		}
-		j := auxIntToInt8(v_1.AuxInt)
-		w := v_1.Args[0]
-		x := v_2
-		if x.Op != OpAMD64MOVBstore || auxIntToInt32(x.AuxInt) != i || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		p0 := x.Args[0]
-		w0 := x.Args[1]
-		if w0.Op != OpAMD64SHRQconst || auxIntToInt8(w0.AuxInt) != j-8 || w != w0.Args[0] || !(x.Uses == 1 && sequentialAddresses(p0, p1, 1) && clobber(x)) {
-			break
-		}
-		v.reset(OpAMD64MOVWstore)
-		v.AuxInt = int32ToAuxInt(i)
-		v.Aux = symToAux(s)
-		v.AddArg3(p0, w0, mem)
-		return true
-	}
-	// match: (MOVBstore [c3] {s} p3 (SHRQconst [56] w) x1:(MOVWstore [c2] {s} p2 (SHRQconst [40] w) x2:(MOVLstore [c1] {s} p1 (SHRQconst [8] w) x3:(MOVBstore [c0] {s} p0 w mem))))
-	// cond: x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && sequentialAddresses(p0, p1, int64(1 + c0 - c1)) && sequentialAddresses(p0, p2, int64(5 + c0 - c2)) && sequentialAddresses(p0, p3, int64(7 + c0 - c3)) && clobber(x1, x2, x3)
-	// result: (MOVQstore [c0] {s} p0 w mem)
-	for {
-		c3 := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p3 := v_0
-		if v_1.Op != OpAMD64SHRQconst || auxIntToInt8(v_1.AuxInt) != 56 {
-			break
-		}
-		w := v_1.Args[0]
-		x1 := v_2
-		if x1.Op != OpAMD64MOVWstore {
-			break
-		}
-		c2 := auxIntToInt32(x1.AuxInt)
-		if auxToSym(x1.Aux) != s {
-			break
-		}
-		_ = x1.Args[2]
-		p2 := x1.Args[0]
-		x1_1 := x1.Args[1]
-		if x1_1.Op != OpAMD64SHRQconst || auxIntToInt8(x1_1.AuxInt) != 40 || w != x1_1.Args[0] {
-			break
-		}
-		x2 := x1.Args[2]
-		if x2.Op != OpAMD64MOVLstore {
-			break
-		}
-		c1 := auxIntToInt32(x2.AuxInt)
-		if auxToSym(x2.Aux) != s {
-			break
-		}
-		_ = x2.Args[2]
-		p1 := x2.Args[0]
-		x2_1 := x2.Args[1]
-		if x2_1.Op != OpAMD64SHRQconst || auxIntToInt8(x2_1.AuxInt) != 8 || w != x2_1.Args[0] {
-			break
-		}
-		x3 := x2.Args[2]
-		if x3.Op != OpAMD64MOVBstore {
-			break
-		}
-		c0 := auxIntToInt32(x3.AuxInt)
-		if auxToSym(x3.Aux) != s {
-			break
-		}
-		mem := x3.Args[2]
-		p0 := x3.Args[0]
-		if w != x3.Args[1] || !(x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && sequentialAddresses(p0, p1, int64(1+c0-c1)) && sequentialAddresses(p0, p2, int64(5+c0-c2)) && sequentialAddresses(p0, p3, int64(7+c0-c3)) && clobber(x1, x2, x3)) {
-			break
-		}
-		v.reset(OpAMD64MOVQstore)
-		v.AuxInt = int32ToAuxInt(c0)
-		v.Aux = symToAux(s)
-		v.AddArg3(p0, w, mem)
-		return true
-	}
 	// match: (MOVBstore [i] {s} p x1:(MOVBload [j] {s2} p2 mem) mem2:(MOVBstore [i-1] {s} p x2:(MOVBload [j-1] {s2} p2 mem) mem))
 	// cond: x1.Uses == 1 && x2.Uses == 1 && mem2.Uses == 1 && clobber(x1, x2, mem2)
 	// result: (MOVWstore [i-1] {s} p (MOVWload [j-1] {s2} p2 mem) mem)
@@ -11148,58 +10605,6 @@
 		v.AddArg2(ptr, mem)
 		return true
 	}
-	// match: (MOVBstoreconst [c] {s} p1 x:(MOVBstoreconst [a] {s} p0 mem))
-	// cond: x.Uses == 1 && sequentialAddresses(p0, p1, int64(a.Off()+1-c.Off())) && clobber(x)
-	// result: (MOVWstoreconst [makeValAndOff(a.Val()&0xff | c.Val()<<8, a.Off())] {s} p0 mem)
-	for {
-		c := auxIntToValAndOff(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p1 := v_0
-		x := v_1
-		if x.Op != OpAMD64MOVBstoreconst {
-			break
-		}
-		a := auxIntToValAndOff(x.AuxInt)
-		if auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[1]
-		p0 := x.Args[0]
-		if !(x.Uses == 1 && sequentialAddresses(p0, p1, int64(a.Off()+1-c.Off())) && clobber(x)) {
-			break
-		}
-		v.reset(OpAMD64MOVWstoreconst)
-		v.AuxInt = valAndOffToAuxInt(makeValAndOff(a.Val()&0xff|c.Val()<<8, a.Off()))
-		v.Aux = symToAux(s)
-		v.AddArg2(p0, mem)
-		return true
-	}
-	// match: (MOVBstoreconst [a] {s} p0 x:(MOVBstoreconst [c] {s} p1 mem))
-	// cond: x.Uses == 1 && sequentialAddresses(p0, p1, int64(a.Off()+1-c.Off())) && clobber(x)
-	// result: (MOVWstoreconst [makeValAndOff(a.Val()&0xff | c.Val()<<8, a.Off())] {s} p0 mem)
-	for {
-		a := auxIntToValAndOff(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p0 := v_0
-		x := v_1
-		if x.Op != OpAMD64MOVBstoreconst {
-			break
-		}
-		c := auxIntToValAndOff(x.AuxInt)
-		if auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[1]
-		p1 := x.Args[0]
-		if !(x.Uses == 1 && sequentialAddresses(p0, p1, int64(a.Off()+1-c.Off())) && clobber(x)) {
-			break
-		}
-		v.reset(OpAMD64MOVWstoreconst)
-		v.AuxInt = valAndOffToAuxInt(makeValAndOff(a.Val()&0xff|c.Val()<<8, a.Off()))
-		v.Aux = symToAux(s)
-		v.AddArg2(p0, mem)
-		return true
-	}
 	return false
 }
 func rewriteValueAMD64_OpAMD64MOVLQSX(v *Value) bool {
@@ -11779,115 +11184,6 @@
 		v.AddArg3(base, val, mem)
 		return true
 	}
-	// match: (MOVLstore [i] {s} p (SHRQconst [32] w) x:(MOVLstore [i-4] {s} p w mem))
-	// cond: x.Uses == 1 && clobber(x)
-	// result: (MOVQstore [i-4] {s} p w mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p := v_0
-		if v_1.Op != OpAMD64SHRQconst || auxIntToInt8(v_1.AuxInt) != 32 {
-			break
-		}
-		w := v_1.Args[0]
-		x := v_2
-		if x.Op != OpAMD64MOVLstore || auxIntToInt32(x.AuxInt) != i-4 || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		if p != x.Args[0] || w != x.Args[1] || !(x.Uses == 1 && clobber(x)) {
-			break
-		}
-		v.reset(OpAMD64MOVQstore)
-		v.AuxInt = int32ToAuxInt(i - 4)
-		v.Aux = symToAux(s)
-		v.AddArg3(p, w, mem)
-		return true
-	}
-	// match: (MOVLstore [i] {s} p (SHRQconst [j] w) x:(MOVLstore [i-4] {s} p w0:(SHRQconst [j-32] w) mem))
-	// cond: x.Uses == 1 && clobber(x)
-	// result: (MOVQstore [i-4] {s} p w0 mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p := v_0
-		if v_1.Op != OpAMD64SHRQconst {
-			break
-		}
-		j := auxIntToInt8(v_1.AuxInt)
-		w := v_1.Args[0]
-		x := v_2
-		if x.Op != OpAMD64MOVLstore || auxIntToInt32(x.AuxInt) != i-4 || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		if p != x.Args[0] {
-			break
-		}
-		w0 := x.Args[1]
-		if w0.Op != OpAMD64SHRQconst || auxIntToInt8(w0.AuxInt) != j-32 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) {
-			break
-		}
-		v.reset(OpAMD64MOVQstore)
-		v.AuxInt = int32ToAuxInt(i - 4)
-		v.Aux = symToAux(s)
-		v.AddArg3(p, w0, mem)
-		return true
-	}
-	// match: (MOVLstore [i] {s} p1 (SHRQconst [32] w) x:(MOVLstore [i] {s} p0 w mem))
-	// cond: x.Uses == 1 && sequentialAddresses(p0, p1, 4) && clobber(x)
-	// result: (MOVQstore [i] {s} p0 w mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p1 := v_0
-		if v_1.Op != OpAMD64SHRQconst || auxIntToInt8(v_1.AuxInt) != 32 {
-			break
-		}
-		w := v_1.Args[0]
-		x := v_2
-		if x.Op != OpAMD64MOVLstore || auxIntToInt32(x.AuxInt) != i || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		p0 := x.Args[0]
-		if w != x.Args[1] || !(x.Uses == 1 && sequentialAddresses(p0, p1, 4) && clobber(x)) {
-			break
-		}
-		v.reset(OpAMD64MOVQstore)
-		v.AuxInt = int32ToAuxInt(i)
-		v.Aux = symToAux(s)
-		v.AddArg3(p0, w, mem)
-		return true
-	}
-	// match: (MOVLstore [i] {s} p1 (SHRQconst [j] w) x:(MOVLstore [i] {s} p0 w0:(SHRQconst [j-32] w) mem))
-	// cond: x.Uses == 1 && sequentialAddresses(p0, p1, 4) && clobber(x)
-	// result: (MOVQstore [i] {s} p0 w0 mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p1 := v_0
-		if v_1.Op != OpAMD64SHRQconst {
-			break
-		}
-		j := auxIntToInt8(v_1.AuxInt)
-		w := v_1.Args[0]
-		x := v_2
-		if x.Op != OpAMD64MOVLstore || auxIntToInt32(x.AuxInt) != i || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		p0 := x.Args[0]
-		w0 := x.Args[1]
-		if w0.Op != OpAMD64SHRQconst || auxIntToInt8(w0.AuxInt) != j-32 || w != w0.Args[0] || !(x.Uses == 1 && sequentialAddresses(p0, p1, 4) && clobber(x)) {
-			break
-		}
-		v.reset(OpAMD64MOVQstore)
-		v.AuxInt = int32ToAuxInt(i)
-		v.Aux = symToAux(s)
-		v.AddArg3(p0, w0, mem)
-		return true
-	}
 	// match: (MOVLstore [i] {s} p x1:(MOVLload [j] {s2} p2 mem) mem2:(MOVLstore [i-4] {s} p x2:(MOVLload [j-4] {s2} p2 mem) mem))
 	// cond: x1.Uses == 1 && x2.Uses == 1 && mem2.Uses == 1 && clobber(x1, x2, mem2)
 	// result: (MOVQstore [i-4] {s} p (MOVQload [j-4] {s2} p2 mem) mem)
@@ -12335,8 +11631,6 @@
 func rewriteValueAMD64_OpAMD64MOVLstoreconst(v *Value) bool {
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
-	b := v.Block
-	typ := &b.Func.Config.Types
 	// match: (MOVLstoreconst [sc] {s} (ADDQconst [off] ptr) mem)
 	// cond: ValAndOff(sc).canAdd32(off)
 	// result: (MOVLstoreconst [ValAndOff(sc).addOffset32(off)] {s} ptr mem)
@@ -12380,62 +11674,6 @@
 		v.AddArg2(ptr, mem)
 		return true
 	}
-	// match: (MOVLstoreconst [c] {s} p1 x:(MOVLstoreconst [a] {s} p0 mem))
-	// cond: x.Uses == 1 && sequentialAddresses(p0, p1, int64(a.Off()+4-c.Off())) && clobber(x)
-	// result: (MOVQstore [a.Off()] {s} p0 (MOVQconst [a.Val64()&0xffffffff | c.Val64()<<32]) mem)
-	for {
-		c := auxIntToValAndOff(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p1 := v_0
-		x := v_1
-		if x.Op != OpAMD64MOVLstoreconst {
-			break
-		}
-		a := auxIntToValAndOff(x.AuxInt)
-		if auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[1]
-		p0 := x.Args[0]
-		if !(x.Uses == 1 && sequentialAddresses(p0, p1, int64(a.Off()+4-c.Off())) && clobber(x)) {
-			break
-		}
-		v.reset(OpAMD64MOVQstore)
-		v.AuxInt = int32ToAuxInt(a.Off())
-		v.Aux = symToAux(s)
-		v0 := b.NewValue0(x.Pos, OpAMD64MOVQconst, typ.UInt64)
-		v0.AuxInt = int64ToAuxInt(a.Val64()&0xffffffff | c.Val64()<<32)
-		v.AddArg3(p0, v0, mem)
-		return true
-	}
-	// match: (MOVLstoreconst [a] {s} p0 x:(MOVLstoreconst [c] {s} p1 mem))
-	// cond: x.Uses == 1 && sequentialAddresses(p0, p1, int64(a.Off()+4-c.Off())) && clobber(x)
-	// result: (MOVQstore [a.Off()] {s} p0 (MOVQconst [a.Val64()&0xffffffff | c.Val64()<<32]) mem)
-	for {
-		a := auxIntToValAndOff(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p0 := v_0
-		x := v_1
-		if x.Op != OpAMD64MOVLstoreconst {
-			break
-		}
-		c := auxIntToValAndOff(x.AuxInt)
-		if auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[1]
-		p1 := x.Args[0]
-		if !(x.Uses == 1 && sequentialAddresses(p0, p1, int64(a.Off()+4-c.Off())) && clobber(x)) {
-			break
-		}
-		v.reset(OpAMD64MOVQstore)
-		v.AuxInt = int32ToAuxInt(a.Off())
-		v.Aux = symToAux(s)
-		v0 := b.NewValue0(x.Pos, OpAMD64MOVQconst, typ.UInt64)
-		v0.AuxInt = int64ToAuxInt(a.Val64()&0xffffffff | c.Val64()<<32)
-		v.AddArg3(p0, v0, mem)
-		return true
-	}
 	return false
 }
 func rewriteValueAMD64_OpAMD64MOVOload(v *Value) bool {
@@ -14147,224 +13385,6 @@
 		v.AddArg3(base, val, mem)
 		return true
 	}
-	// match: (MOVWstore [i] {s} p (SHRLconst [16] w) x:(MOVWstore [i-2] {s} p w mem))
-	// cond: x.Uses == 1 && clobber(x)
-	// result: (MOVLstore [i-2] {s} p w mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p := v_0
-		if v_1.Op != OpAMD64SHRLconst || auxIntToInt8(v_1.AuxInt) != 16 {
-			break
-		}
-		w := v_1.Args[0]
-		x := v_2
-		if x.Op != OpAMD64MOVWstore || auxIntToInt32(x.AuxInt) != i-2 || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		if p != x.Args[0] || w != x.Args[1] || !(x.Uses == 1 && clobber(x)) {
-			break
-		}
-		v.reset(OpAMD64MOVLstore)
-		v.AuxInt = int32ToAuxInt(i - 2)
-		v.Aux = symToAux(s)
-		v.AddArg3(p, w, mem)
-		return true
-	}
-	// match: (MOVWstore [i] {s} p (SHRQconst [16] w) x:(MOVWstore [i-2] {s} p w mem))
-	// cond: x.Uses == 1 && clobber(x)
-	// result: (MOVLstore [i-2] {s} p w mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p := v_0
-		if v_1.Op != OpAMD64SHRQconst || auxIntToInt8(v_1.AuxInt) != 16 {
-			break
-		}
-		w := v_1.Args[0]
-		x := v_2
-		if x.Op != OpAMD64MOVWstore || auxIntToInt32(x.AuxInt) != i-2 || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		if p != x.Args[0] || w != x.Args[1] || !(x.Uses == 1 && clobber(x)) {
-			break
-		}
-		v.reset(OpAMD64MOVLstore)
-		v.AuxInt = int32ToAuxInt(i - 2)
-		v.Aux = symToAux(s)
-		v.AddArg3(p, w, mem)
-		return true
-	}
-	// match: (MOVWstore [i] {s} p (SHRLconst [j] w) x:(MOVWstore [i-2] {s} p w0:(SHRLconst [j-16] w) mem))
-	// cond: x.Uses == 1 && clobber(x)
-	// result: (MOVLstore [i-2] {s} p w0 mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p := v_0
-		if v_1.Op != OpAMD64SHRLconst {
-			break
-		}
-		j := auxIntToInt8(v_1.AuxInt)
-		w := v_1.Args[0]
-		x := v_2
-		if x.Op != OpAMD64MOVWstore || auxIntToInt32(x.AuxInt) != i-2 || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		if p != x.Args[0] {
-			break
-		}
-		w0 := x.Args[1]
-		if w0.Op != OpAMD64SHRLconst || auxIntToInt8(w0.AuxInt) != j-16 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) {
-			break
-		}
-		v.reset(OpAMD64MOVLstore)
-		v.AuxInt = int32ToAuxInt(i - 2)
-		v.Aux = symToAux(s)
-		v.AddArg3(p, w0, mem)
-		return true
-	}
-	// match: (MOVWstore [i] {s} p (SHRQconst [j] w) x:(MOVWstore [i-2] {s} p w0:(SHRQconst [j-16] w) mem))
-	// cond: x.Uses == 1 && clobber(x)
-	// result: (MOVLstore [i-2] {s} p w0 mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p := v_0
-		if v_1.Op != OpAMD64SHRQconst {
-			break
-		}
-		j := auxIntToInt8(v_1.AuxInt)
-		w := v_1.Args[0]
-		x := v_2
-		if x.Op != OpAMD64MOVWstore || auxIntToInt32(x.AuxInt) != i-2 || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		if p != x.Args[0] {
-			break
-		}
-		w0 := x.Args[1]
-		if w0.Op != OpAMD64SHRQconst || auxIntToInt8(w0.AuxInt) != j-16 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) {
-			break
-		}
-		v.reset(OpAMD64MOVLstore)
-		v.AuxInt = int32ToAuxInt(i - 2)
-		v.Aux = symToAux(s)
-		v.AddArg3(p, w0, mem)
-		return true
-	}
-	// match: (MOVWstore [i] {s} p1 (SHRLconst [16] w) x:(MOVWstore [i] {s} p0 w mem))
-	// cond: x.Uses == 1 && sequentialAddresses(p0, p1, 2) && clobber(x)
-	// result: (MOVLstore [i] {s} p0 w mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p1 := v_0
-		if v_1.Op != OpAMD64SHRLconst || auxIntToInt8(v_1.AuxInt) != 16 {
-			break
-		}
-		w := v_1.Args[0]
-		x := v_2
-		if x.Op != OpAMD64MOVWstore || auxIntToInt32(x.AuxInt) != i || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		p0 := x.Args[0]
-		if w != x.Args[1] || !(x.Uses == 1 && sequentialAddresses(p0, p1, 2) && clobber(x)) {
-			break
-		}
-		v.reset(OpAMD64MOVLstore)
-		v.AuxInt = int32ToAuxInt(i)
-		v.Aux = symToAux(s)
-		v.AddArg3(p0, w, mem)
-		return true
-	}
-	// match: (MOVWstore [i] {s} p1 (SHRQconst [16] w) x:(MOVWstore [i] {s} p0 w mem))
-	// cond: x.Uses == 1 && sequentialAddresses(p0, p1, 2) && clobber(x)
-	// result: (MOVLstore [i] {s} p0 w mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p1 := v_0
-		if v_1.Op != OpAMD64SHRQconst || auxIntToInt8(v_1.AuxInt) != 16 {
-			break
-		}
-		w := v_1.Args[0]
-		x := v_2
-		if x.Op != OpAMD64MOVWstore || auxIntToInt32(x.AuxInt) != i || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		p0 := x.Args[0]
-		if w != x.Args[1] || !(x.Uses == 1 && sequentialAddresses(p0, p1, 2) && clobber(x)) {
-			break
-		}
-		v.reset(OpAMD64MOVLstore)
-		v.AuxInt = int32ToAuxInt(i)
-		v.Aux = symToAux(s)
-		v.AddArg3(p0, w, mem)
-		return true
-	}
-	// match: (MOVWstore [i] {s} p1 (SHRLconst [j] w) x:(MOVWstore [i] {s} p0 w0:(SHRLconst [j-16] w) mem))
-	// cond: x.Uses == 1 && sequentialAddresses(p0, p1, 2) && clobber(x)
-	// result: (MOVLstore [i] {s} p0 w0 mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p1 := v_0
-		if v_1.Op != OpAMD64SHRLconst {
-			break
-		}
-		j := auxIntToInt8(v_1.AuxInt)
-		w := v_1.Args[0]
-		x := v_2
-		if x.Op != OpAMD64MOVWstore || auxIntToInt32(x.AuxInt) != i || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		p0 := x.Args[0]
-		w0 := x.Args[1]
-		if w0.Op != OpAMD64SHRLconst || auxIntToInt8(w0.AuxInt) != j-16 || w != w0.Args[0] || !(x.Uses == 1 && sequentialAddresses(p0, p1, 2) && clobber(x)) {
-			break
-		}
-		v.reset(OpAMD64MOVLstore)
-		v.AuxInt = int32ToAuxInt(i)
-		v.Aux = symToAux(s)
-		v.AddArg3(p0, w0, mem)
-		return true
-	}
-	// match: (MOVWstore [i] {s} p1 (SHRQconst [j] w) x:(MOVWstore [i] {s} p0 w0:(SHRQconst [j-16] w) mem))
-	// cond: x.Uses == 1 && sequentialAddresses(p0, p1, 2) && clobber(x)
-	// result: (MOVLstore [i] {s} p0 w0 mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p1 := v_0
-		if v_1.Op != OpAMD64SHRQconst {
-			break
-		}
-		j := auxIntToInt8(v_1.AuxInt)
-		w := v_1.Args[0]
-		x := v_2
-		if x.Op != OpAMD64MOVWstore || auxIntToInt32(x.AuxInt) != i || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		p0 := x.Args[0]
-		w0 := x.Args[1]
-		if w0.Op != OpAMD64SHRQconst || auxIntToInt8(w0.AuxInt) != j-16 || w != w0.Args[0] || !(x.Uses == 1 && sequentialAddresses(p0, p1, 2) && clobber(x)) {
-			break
-		}
-		v.reset(OpAMD64MOVLstore)
-		v.AuxInt = int32ToAuxInt(i)
-		v.Aux = symToAux(s)
-		v.AddArg3(p0, w0, mem)
-		return true
-	}
 	// match: (MOVWstore [i] {s} p x1:(MOVWload [j] {s2} p2 mem) mem2:(MOVWstore [i-2] {s} p x2:(MOVWload [j-2] {s2} p2 mem) mem))
 	// cond: x1.Uses == 1 && x2.Uses == 1 && mem2.Uses == 1 && clobber(x1, x2, mem2)
 	// result: (MOVLstore [i-2] {s} p (MOVLload [j-2] {s2} p2 mem) mem)
@@ -14476,58 +13496,6 @@
 		v.AddArg2(ptr, mem)
 		return true
 	}
-	// match: (MOVWstoreconst [c] {s} p1 x:(MOVWstoreconst [a] {s} p0 mem))
-	// cond: x.Uses == 1 && sequentialAddresses(p0, p1, int64(a.Off()+2-c.Off())) && clobber(x)
-	// result: (MOVLstoreconst [makeValAndOff(a.Val()&0xffff | c.Val()<<16, a.Off())] {s} p0 mem)
-	for {
-		c := auxIntToValAndOff(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p1 := v_0
-		x := v_1
-		if x.Op != OpAMD64MOVWstoreconst {
-			break
-		}
-		a := auxIntToValAndOff(x.AuxInt)
-		if auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[1]
-		p0 := x.Args[0]
-		if !(x.Uses == 1 && sequentialAddresses(p0, p1, int64(a.Off()+2-c.Off())) && clobber(x)) {
-			break
-		}
-		v.reset(OpAMD64MOVLstoreconst)
-		v.AuxInt = valAndOffToAuxInt(makeValAndOff(a.Val()&0xffff|c.Val()<<16, a.Off()))
-		v.Aux = symToAux(s)
-		v.AddArg2(p0, mem)
-		return true
-	}
-	// match: (MOVWstoreconst [a] {s} p0 x:(MOVWstoreconst [c] {s} p1 mem))
-	// cond: x.Uses == 1 && sequentialAddresses(p0, p1, int64(a.Off()+2-c.Off())) && clobber(x)
-	// result: (MOVLstoreconst [makeValAndOff(a.Val()&0xffff | c.Val()<<16, a.Off())] {s} p0 mem)
-	for {
-		a := auxIntToValAndOff(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p0 := v_0
-		x := v_1
-		if x.Op != OpAMD64MOVWstoreconst {
-			break
-		}
-		c := auxIntToValAndOff(x.AuxInt)
-		if auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[1]
-		p1 := x.Args[0]
-		if !(x.Uses == 1 && sequentialAddresses(p0, p1, int64(a.Off()+2-c.Off())) && clobber(x)) {
-			break
-		}
-		v.reset(OpAMD64MOVLstoreconst)
-		v.AuxInt = valAndOffToAuxInt(makeValAndOff(a.Val()&0xffff|c.Val()<<16, a.Off()))
-		v.Aux = symToAux(s)
-		v.AddArg2(p0, mem)
-		return true
-	}
 	return false
 }
 func rewriteValueAMD64_OpAMD64MULL(v *Value) bool {
@@ -15777,8 +14745,6 @@
 func rewriteValueAMD64_OpAMD64ORL(v *Value) bool {
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
-	b := v.Block
-	typ := &b.Func.Config.Types
 	// match: (ORL (SHLL (MOVLconst [1]) y) x)
 	// result: (BTSL x y)
 	for {
@@ -15844,584 +14810,6 @@
 		v.copyOf(x)
 		return true
 	}
-	// match: (ORL x0:(MOVBload [i0] {s} p mem) sh:(SHLLconst [8] x1:(MOVBload [i1] {s} p mem)))
-	// cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0, x1, sh)
-	// result: @mergePoint(b,x0,x1) (MOVWload [i0] {s} p mem)
-	for {
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			x0 := v_0
-			if x0.Op != OpAMD64MOVBload {
-				continue
-			}
-			i0 := auxIntToInt32(x0.AuxInt)
-			s := auxToSym(x0.Aux)
-			mem := x0.Args[1]
-			p := x0.Args[0]
-			sh := v_1
-			if sh.Op != OpAMD64SHLLconst || auxIntToInt8(sh.AuxInt) != 8 {
-				continue
-			}
-			x1 := sh.Args[0]
-			if x1.Op != OpAMD64MOVBload {
-				continue
-			}
-			i1 := auxIntToInt32(x1.AuxInt)
-			if auxToSym(x1.Aux) != s {
-				continue
-			}
-			_ = x1.Args[1]
-			if p != x1.Args[0] || mem != x1.Args[1] || !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0, x1, sh)) {
-				continue
-			}
-			b = mergePoint(b, x0, x1)
-			v0 := b.NewValue0(x1.Pos, OpAMD64MOVWload, typ.UInt16)
-			v.copyOf(v0)
-			v0.AuxInt = int32ToAuxInt(i0)
-			v0.Aux = symToAux(s)
-			v0.AddArg2(p, mem)
-			return true
-		}
-		break
-	}
-	// match: (ORL x0:(MOVBload [i] {s} p0 mem) sh:(SHLLconst [8] x1:(MOVBload [i] {s} p1 mem)))
-	// cond: x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && sequentialAddresses(p0, p1, 1) && mergePoint(b,x0,x1) != nil && clobber(x0, x1, sh)
-	// result: @mergePoint(b,x0,x1) (MOVWload [i] {s} p0 mem)
-	for {
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			x0 := v_0
-			if x0.Op != OpAMD64MOVBload {
-				continue
-			}
-			i := auxIntToInt32(x0.AuxInt)
-			s := auxToSym(x0.Aux)
-			mem := x0.Args[1]
-			p0 := x0.Args[0]
-			sh := v_1
-			if sh.Op != OpAMD64SHLLconst || auxIntToInt8(sh.AuxInt) != 8 {
-				continue
-			}
-			x1 := sh.Args[0]
-			if x1.Op != OpAMD64MOVBload || auxIntToInt32(x1.AuxInt) != i || auxToSym(x1.Aux) != s {
-				continue
-			}
-			_ = x1.Args[1]
-			p1 := x1.Args[0]
-			if mem != x1.Args[1] || !(x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && sequentialAddresses(p0, p1, 1) && mergePoint(b, x0, x1) != nil && clobber(x0, x1, sh)) {
-				continue
-			}
-			b = mergePoint(b, x0, x1)
-			v0 := b.NewValue0(x1.Pos, OpAMD64MOVWload, typ.UInt16)
-			v.copyOf(v0)
-			v0.AuxInt = int32ToAuxInt(i)
-			v0.Aux = symToAux(s)
-			v0.AddArg2(p0, mem)
-			return true
-		}
-		break
-	}
-	// match: (ORL x0:(MOVWload [i0] {s} p mem) sh:(SHLLconst [16] x1:(MOVWload [i1] {s} p mem)))
-	// cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0, x1, sh)
-	// result: @mergePoint(b,x0,x1) (MOVLload [i0] {s} p mem)
-	for {
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			x0 := v_0
-			if x0.Op != OpAMD64MOVWload {
-				continue
-			}
-			i0 := auxIntToInt32(x0.AuxInt)
-			s := auxToSym(x0.Aux)
-			mem := x0.Args[1]
-			p := x0.Args[0]
-			sh := v_1
-			if sh.Op != OpAMD64SHLLconst || auxIntToInt8(sh.AuxInt) != 16 {
-				continue
-			}
-			x1 := sh.Args[0]
-			if x1.Op != OpAMD64MOVWload {
-				continue
-			}
-			i1 := auxIntToInt32(x1.AuxInt)
-			if auxToSym(x1.Aux) != s {
-				continue
-			}
-			_ = x1.Args[1]
-			if p != x1.Args[0] || mem != x1.Args[1] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0, x1, sh)) {
-				continue
-			}
-			b = mergePoint(b, x0, x1)
-			v0 := b.NewValue0(x1.Pos, OpAMD64MOVLload, typ.UInt32)
-			v.copyOf(v0)
-			v0.AuxInt = int32ToAuxInt(i0)
-			v0.Aux = symToAux(s)
-			v0.AddArg2(p, mem)
-			return true
-		}
-		break
-	}
-	// match: (ORL x0:(MOVWload [i] {s} p0 mem) sh:(SHLLconst [16] x1:(MOVWload [i] {s} p1 mem)))
-	// cond: x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && sequentialAddresses(p0, p1, 2) && mergePoint(b,x0,x1) != nil && clobber(x0, x1, sh)
-	// result: @mergePoint(b,x0,x1) (MOVLload [i] {s} p0 mem)
-	for {
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			x0 := v_0
-			if x0.Op != OpAMD64MOVWload {
-				continue
-			}
-			i := auxIntToInt32(x0.AuxInt)
-			s := auxToSym(x0.Aux)
-			mem := x0.Args[1]
-			p0 := x0.Args[0]
-			sh := v_1
-			if sh.Op != OpAMD64SHLLconst || auxIntToInt8(sh.AuxInt) != 16 {
-				continue
-			}
-			x1 := sh.Args[0]
-			if x1.Op != OpAMD64MOVWload || auxIntToInt32(x1.AuxInt) != i || auxToSym(x1.Aux) != s {
-				continue
-			}
-			_ = x1.Args[1]
-			p1 := x1.Args[0]
-			if mem != x1.Args[1] || !(x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && sequentialAddresses(p0, p1, 2) && mergePoint(b, x0, x1) != nil && clobber(x0, x1, sh)) {
-				continue
-			}
-			b = mergePoint(b, x0, x1)
-			v0 := b.NewValue0(x1.Pos, OpAMD64MOVLload, typ.UInt32)
-			v.copyOf(v0)
-			v0.AuxInt = int32ToAuxInt(i)
-			v0.Aux = symToAux(s)
-			v0.AddArg2(p0, mem)
-			return true
-		}
-		break
-	}
-	// match: (ORL s1:(SHLLconst [j1] x1:(MOVBload [i1] {s} p mem)) or:(ORL s0:(SHLLconst [j0] x0:(MOVBload [i0] {s} p mem)) y))
-	// cond: i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0, x1, s0, s1, or)
-	// result: @mergePoint(b,x0,x1,y) (ORL <v.Type> (SHLLconst <v.Type> [j0] (MOVWload [i0] {s} p mem)) y)
-	for {
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			s1 := v_0
-			if s1.Op != OpAMD64SHLLconst {
-				continue
-			}
-			j1 := auxIntToInt8(s1.AuxInt)
-			x1 := s1.Args[0]
-			if x1.Op != OpAMD64MOVBload {
-				continue
-			}
-			i1 := auxIntToInt32(x1.AuxInt)
-			s := auxToSym(x1.Aux)
-			mem := x1.Args[1]
-			p := x1.Args[0]
-			or := v_1
-			if or.Op != OpAMD64ORL {
-				continue
-			}
-			_ = or.Args[1]
-			or_0 := or.Args[0]
-			or_1 := or.Args[1]
-			for _i1 := 0; _i1 <= 1; _i1, or_0, or_1 = _i1+1, or_1, or_0 {
-				s0 := or_0
-				if s0.Op != OpAMD64SHLLconst {
-					continue
-				}
-				j0 := auxIntToInt8(s0.AuxInt)
-				x0 := s0.Args[0]
-				if x0.Op != OpAMD64MOVBload {
-					continue
-				}
-				i0 := auxIntToInt32(x0.AuxInt)
-				if auxToSym(x0.Aux) != s {
-					continue
-				}
-				_ = x0.Args[1]
-				if p != x0.Args[0] || mem != x0.Args[1] {
-					continue
-				}
-				y := or_1
-				if !(i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0, x1, s0, s1, or)) {
-					continue
-				}
-				b = mergePoint(b, x0, x1, y)
-				v0 := b.NewValue0(x0.Pos, OpAMD64ORL, v.Type)
-				v.copyOf(v0)
-				v1 := b.NewValue0(x0.Pos, OpAMD64SHLLconst, v.Type)
-				v1.AuxInt = int8ToAuxInt(j0)
-				v2 := b.NewValue0(x0.Pos, OpAMD64MOVWload, typ.UInt16)
-				v2.AuxInt = int32ToAuxInt(i0)
-				v2.Aux = symToAux(s)
-				v2.AddArg2(p, mem)
-				v1.AddArg(v2)
-				v0.AddArg2(v1, y)
-				return true
-			}
-		}
-		break
-	}
-	// match: (ORL s1:(SHLLconst [j1] x1:(MOVBload [i] {s} p1 mem)) or:(ORL s0:(SHLLconst [j0] x0:(MOVBload [i] {s} p0 mem)) y))
-	// cond: j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && sequentialAddresses(p0, p1, 1) && mergePoint(b,x0,x1,y) != nil && clobber(x0, x1, s0, s1, or)
-	// result: @mergePoint(b,x0,x1,y) (ORL <v.Type> (SHLLconst <v.Type> [j0] (MOVWload [i] {s} p0 mem)) y)
-	for {
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			s1 := v_0
-			if s1.Op != OpAMD64SHLLconst {
-				continue
-			}
-			j1 := auxIntToInt8(s1.AuxInt)
-			x1 := s1.Args[0]
-			if x1.Op != OpAMD64MOVBload {
-				continue
-			}
-			i := auxIntToInt32(x1.AuxInt)
-			s := auxToSym(x1.Aux)
-			mem := x1.Args[1]
-			p1 := x1.Args[0]
-			or := v_1
-			if or.Op != OpAMD64ORL {
-				continue
-			}
-			_ = or.Args[1]
-			or_0 := or.Args[0]
-			or_1 := or.Args[1]
-			for _i1 := 0; _i1 <= 1; _i1, or_0, or_1 = _i1+1, or_1, or_0 {
-				s0 := or_0
-				if s0.Op != OpAMD64SHLLconst {
-					continue
-				}
-				j0 := auxIntToInt8(s0.AuxInt)
-				x0 := s0.Args[0]
-				if x0.Op != OpAMD64MOVBload || auxIntToInt32(x0.AuxInt) != i || auxToSym(x0.Aux) != s {
-					continue
-				}
-				_ = x0.Args[1]
-				p0 := x0.Args[0]
-				if mem != x0.Args[1] {
-					continue
-				}
-				y := or_1
-				if !(j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && sequentialAddresses(p0, p1, 1) && mergePoint(b, x0, x1, y) != nil && clobber(x0, x1, s0, s1, or)) {
-					continue
-				}
-				b = mergePoint(b, x0, x1, y)
-				v0 := b.NewValue0(x0.Pos, OpAMD64ORL, v.Type)
-				v.copyOf(v0)
-				v1 := b.NewValue0(x0.Pos, OpAMD64SHLLconst, v.Type)
-				v1.AuxInt = int8ToAuxInt(j0)
-				v2 := b.NewValue0(x0.Pos, OpAMD64MOVWload, typ.UInt16)
-				v2.AuxInt = int32ToAuxInt(i)
-				v2.Aux = symToAux(s)
-				v2.AddArg2(p0, mem)
-				v1.AddArg(v2)
-				v0.AddArg2(v1, y)
-				return true
-			}
-		}
-		break
-	}
-	// match: (ORL x1:(MOVBload [i1] {s} p mem) sh:(SHLLconst [8] x0:(MOVBload [i0] {s} p mem)))
-	// cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0, x1, sh)
-	// result: @mergePoint(b,x0,x1) (ROLWconst <v.Type> [8] (MOVWload [i0] {s} p mem))
-	for {
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			x1 := v_0
-			if x1.Op != OpAMD64MOVBload {
-				continue
-			}
-			i1 := auxIntToInt32(x1.AuxInt)
-			s := auxToSym(x1.Aux)
-			mem := x1.Args[1]
-			p := x1.Args[0]
-			sh := v_1
-			if sh.Op != OpAMD64SHLLconst || auxIntToInt8(sh.AuxInt) != 8 {
-				continue
-			}
-			x0 := sh.Args[0]
-			if x0.Op != OpAMD64MOVBload {
-				continue
-			}
-			i0 := auxIntToInt32(x0.AuxInt)
-			if auxToSym(x0.Aux) != s {
-				continue
-			}
-			_ = x0.Args[1]
-			if p != x0.Args[0] || mem != x0.Args[1] || !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0, x1, sh)) {
-				continue
-			}
-			b = mergePoint(b, x0, x1)
-			v0 := b.NewValue0(x0.Pos, OpAMD64ROLWconst, v.Type)
-			v.copyOf(v0)
-			v0.AuxInt = int8ToAuxInt(8)
-			v1 := b.NewValue0(x0.Pos, OpAMD64MOVWload, typ.UInt16)
-			v1.AuxInt = int32ToAuxInt(i0)
-			v1.Aux = symToAux(s)
-			v1.AddArg2(p, mem)
-			v0.AddArg(v1)
-			return true
-		}
-		break
-	}
-	// match: (ORL x1:(MOVBload [i] {s} p1 mem) sh:(SHLLconst [8] x0:(MOVBload [i] {s} p0 mem)))
-	// cond: x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && sequentialAddresses(p0, p1, 1) && mergePoint(b,x0,x1) != nil && clobber(x0, x1, sh)
-	// result: @mergePoint(b,x0,x1) (ROLWconst <v.Type> [8] (MOVWload [i] {s} p0 mem))
-	for {
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			x1 := v_0
-			if x1.Op != OpAMD64MOVBload {
-				continue
-			}
-			i := auxIntToInt32(x1.AuxInt)
-			s := auxToSym(x1.Aux)
-			mem := x1.Args[1]
-			p1 := x1.Args[0]
-			sh := v_1
-			if sh.Op != OpAMD64SHLLconst || auxIntToInt8(sh.AuxInt) != 8 {
-				continue
-			}
-			x0 := sh.Args[0]
-			if x0.Op != OpAMD64MOVBload || auxIntToInt32(x0.AuxInt) != i || auxToSym(x0.Aux) != s {
-				continue
-			}
-			_ = x0.Args[1]
-			p0 := x0.Args[0]
-			if mem != x0.Args[1] || !(x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && sequentialAddresses(p0, p1, 1) && mergePoint(b, x0, x1) != nil && clobber(x0, x1, sh)) {
-				continue
-			}
-			b = mergePoint(b, x0, x1)
-			v0 := b.NewValue0(x0.Pos, OpAMD64ROLWconst, v.Type)
-			v.copyOf(v0)
-			v0.AuxInt = int8ToAuxInt(8)
-			v1 := b.NewValue0(x0.Pos, OpAMD64MOVWload, typ.UInt16)
-			v1.AuxInt = int32ToAuxInt(i)
-			v1.Aux = symToAux(s)
-			v1.AddArg2(p0, mem)
-			v0.AddArg(v1)
-			return true
-		}
-		break
-	}
-	// match: (ORL r1:(ROLWconst [8] x1:(MOVWload [i1] {s} p mem)) sh:(SHLLconst [16] r0:(ROLWconst [8] x0:(MOVWload [i0] {s} p mem))))
-	// cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0, x1, r0, r1, sh)
-	// result: @mergePoint(b,x0,x1) (BSWAPL <v.Type> (MOVLload [i0] {s} p mem))
-	for {
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			r1 := v_0
-			if r1.Op != OpAMD64ROLWconst || auxIntToInt8(r1.AuxInt) != 8 {
-				continue
-			}
-			x1 := r1.Args[0]
-			if x1.Op != OpAMD64MOVWload {
-				continue
-			}
-			i1 := auxIntToInt32(x1.AuxInt)
-			s := auxToSym(x1.Aux)
-			mem := x1.Args[1]
-			p := x1.Args[0]
-			sh := v_1
-			if sh.Op != OpAMD64SHLLconst || auxIntToInt8(sh.AuxInt) != 16 {
-				continue
-			}
-			r0 := sh.Args[0]
-			if r0.Op != OpAMD64ROLWconst || auxIntToInt8(r0.AuxInt) != 8 {
-				continue
-			}
-			x0 := r0.Args[0]
-			if x0.Op != OpAMD64MOVWload {
-				continue
-			}
-			i0 := auxIntToInt32(x0.AuxInt)
-			if auxToSym(x0.Aux) != s {
-				continue
-			}
-			_ = x0.Args[1]
-			if p != x0.Args[0] || mem != x0.Args[1] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0, x1, r0, r1, sh)) {
-				continue
-			}
-			b = mergePoint(b, x0, x1)
-			v0 := b.NewValue0(x0.Pos, OpAMD64BSWAPL, v.Type)
-			v.copyOf(v0)
-			v1 := b.NewValue0(x0.Pos, OpAMD64MOVLload, typ.UInt32)
-			v1.AuxInt = int32ToAuxInt(i0)
-			v1.Aux = symToAux(s)
-			v1.AddArg2(p, mem)
-			v0.AddArg(v1)
-			return true
-		}
-		break
-	}
-	// match: (ORL r1:(ROLWconst [8] x1:(MOVWload [i] {s} p1 mem)) sh:(SHLLconst [16] r0:(ROLWconst [8] x0:(MOVWload [i] {s} p0 mem))))
-	// cond: x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && sequentialAddresses(p0, p1, 2) && mergePoint(b,x0,x1) != nil && clobber(x0, x1, r0, r1, sh)
-	// result: @mergePoint(b,x0,x1) (BSWAPL <v.Type> (MOVLload [i] {s} p0 mem))
-	for {
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			r1 := v_0
-			if r1.Op != OpAMD64ROLWconst || auxIntToInt8(r1.AuxInt) != 8 {
-				continue
-			}
-			x1 := r1.Args[0]
-			if x1.Op != OpAMD64MOVWload {
-				continue
-			}
-			i := auxIntToInt32(x1.AuxInt)
-			s := auxToSym(x1.Aux)
-			mem := x1.Args[1]
-			p1 := x1.Args[0]
-			sh := v_1
-			if sh.Op != OpAMD64SHLLconst || auxIntToInt8(sh.AuxInt) != 16 {
-				continue
-			}
-			r0 := sh.Args[0]
-			if r0.Op != OpAMD64ROLWconst || auxIntToInt8(r0.AuxInt) != 8 {
-				continue
-			}
-			x0 := r0.Args[0]
-			if x0.Op != OpAMD64MOVWload || auxIntToInt32(x0.AuxInt) != i || auxToSym(x0.Aux) != s {
-				continue
-			}
-			_ = x0.Args[1]
-			p0 := x0.Args[0]
-			if mem != x0.Args[1] || !(x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && sequentialAddresses(p0, p1, 2) && mergePoint(b, x0, x1) != nil && clobber(x0, x1, r0, r1, sh)) {
-				continue
-			}
-			b = mergePoint(b, x0, x1)
-			v0 := b.NewValue0(x0.Pos, OpAMD64BSWAPL, v.Type)
-			v.copyOf(v0)
-			v1 := b.NewValue0(x0.Pos, OpAMD64MOVLload, typ.UInt32)
-			v1.AuxInt = int32ToAuxInt(i)
-			v1.Aux = symToAux(s)
-			v1.AddArg2(p0, mem)
-			v0.AddArg(v1)
-			return true
-		}
-		break
-	}
-	// match: (ORL s0:(SHLLconst [j0] x0:(MOVBload [i0] {s} p mem)) or:(ORL s1:(SHLLconst [j1] x1:(MOVBload [i1] {s} p mem)) y))
-	// cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0, x1, s0, s1, or)
-	// result: @mergePoint(b,x0,x1,y) (ORL <v.Type> (SHLLconst <v.Type> [j1] (ROLWconst <typ.UInt16> [8] (MOVWload [i0] {s} p mem))) y)
-	for {
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			s0 := v_0
-			if s0.Op != OpAMD64SHLLconst {
-				continue
-			}
-			j0 := auxIntToInt8(s0.AuxInt)
-			x0 := s0.Args[0]
-			if x0.Op != OpAMD64MOVBload {
-				continue
-			}
-			i0 := auxIntToInt32(x0.AuxInt)
-			s := auxToSym(x0.Aux)
-			mem := x0.Args[1]
-			p := x0.Args[0]
-			or := v_1
-			if or.Op != OpAMD64ORL {
-				continue
-			}
-			_ = or.Args[1]
-			or_0 := or.Args[0]
-			or_1 := or.Args[1]
-			for _i1 := 0; _i1 <= 1; _i1, or_0, or_1 = _i1+1, or_1, or_0 {
-				s1 := or_0
-				if s1.Op != OpAMD64SHLLconst {
-					continue
-				}
-				j1 := auxIntToInt8(s1.AuxInt)
-				x1 := s1.Args[0]
-				if x1.Op != OpAMD64MOVBload {
-					continue
-				}
-				i1 := auxIntToInt32(x1.AuxInt)
-				if auxToSym(x1.Aux) != s {
-					continue
-				}
-				_ = x1.Args[1]
-				if p != x1.Args[0] || mem != x1.Args[1] {
-					continue
-				}
-				y := or_1
-				if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0, x1, s0, s1, or)) {
-					continue
-				}
-				b = mergePoint(b, x0, x1, y)
-				v0 := b.NewValue0(x1.Pos, OpAMD64ORL, v.Type)
-				v.copyOf(v0)
-				v1 := b.NewValue0(x1.Pos, OpAMD64SHLLconst, v.Type)
-				v1.AuxInt = int8ToAuxInt(j1)
-				v2 := b.NewValue0(x1.Pos, OpAMD64ROLWconst, typ.UInt16)
-				v2.AuxInt = int8ToAuxInt(8)
-				v3 := b.NewValue0(x1.Pos, OpAMD64MOVWload, typ.UInt16)
-				v3.AuxInt = int32ToAuxInt(i0)
-				v3.Aux = symToAux(s)
-				v3.AddArg2(p, mem)
-				v2.AddArg(v3)
-				v1.AddArg(v2)
-				v0.AddArg2(v1, y)
-				return true
-			}
-		}
-		break
-	}
-	// match: (ORL s0:(SHLLconst [j0] x0:(MOVBload [i] {s} p0 mem)) or:(ORL s1:(SHLLconst [j1] x1:(MOVBload [i] {s} p1 mem)) y))
-	// cond: j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && sequentialAddresses(p0, p1, 1) && mergePoint(b,x0,x1,y) != nil && clobber(x0, x1, s0, s1, or)
-	// result: @mergePoint(b,x0,x1,y) (ORL <v.Type> (SHLLconst <v.Type> [j1] (ROLWconst <typ.UInt16> [8] (MOVWload [i] {s} p0 mem))) y)
-	for {
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			s0 := v_0
-			if s0.Op != OpAMD64SHLLconst {
-				continue
-			}
-			j0 := auxIntToInt8(s0.AuxInt)
-			x0 := s0.Args[0]
-			if x0.Op != OpAMD64MOVBload {
-				continue
-			}
-			i := auxIntToInt32(x0.AuxInt)
-			s := auxToSym(x0.Aux)
-			mem := x0.Args[1]
-			p0 := x0.Args[0]
-			or := v_1
-			if or.Op != OpAMD64ORL {
-				continue
-			}
-			_ = or.Args[1]
-			or_0 := or.Args[0]
-			or_1 := or.Args[1]
-			for _i1 := 0; _i1 <= 1; _i1, or_0, or_1 = _i1+1, or_1, or_0 {
-				s1 := or_0
-				if s1.Op != OpAMD64SHLLconst {
-					continue
-				}
-				j1 := auxIntToInt8(s1.AuxInt)
-				x1 := s1.Args[0]
-				if x1.Op != OpAMD64MOVBload || auxIntToInt32(x1.AuxInt) != i || auxToSym(x1.Aux) != s {
-					continue
-				}
-				_ = x1.Args[1]
-				p1 := x1.Args[0]
-				if mem != x1.Args[1] {
-					continue
-				}
-				y := or_1
-				if !(j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && sequentialAddresses(p0, p1, 1) && mergePoint(b, x0, x1, y) != nil && clobber(x0, x1, s0, s1, or)) {
-					continue
-				}
-				b = mergePoint(b, x0, x1, y)
-				v0 := b.NewValue0(x1.Pos, OpAMD64ORL, v.Type)
-				v.copyOf(v0)
-				v1 := b.NewValue0(x1.Pos, OpAMD64SHLLconst, v.Type)
-				v1.AuxInt = int8ToAuxInt(j1)
-				v2 := b.NewValue0(x1.Pos, OpAMD64ROLWconst, typ.UInt16)
-				v2.AuxInt = int8ToAuxInt(8)
-				v3 := b.NewValue0(x1.Pos, OpAMD64MOVWload, typ.UInt16)
-				v3.AuxInt = int32ToAuxInt(i)
-				v3.Aux = symToAux(s)
-				v3.AddArg2(p0, mem)
-				v2.AddArg(v3)
-				v1.AddArg(v2)
-				v0.AddArg2(v1, y)
-				return true
-			}
-		}
-		break
-	}
 	// match: (ORL x l:(MOVLload [off] {sym} ptr mem))
 	// cond: canMergeLoadClobber(v, l, x) && clobber(l)
 	// result: (ORLload x [off] {sym} ptr mem)
@@ -16706,8 +15094,6 @@
 func rewriteValueAMD64_OpAMD64ORQ(v *Value) bool {
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
-	b := v.Block
-	typ := &b.Func.Config.Types
 	// match: (ORQ (SHLQ (MOVQconst [1]) y) x)
 	// result: (BTSQ x y)
 	for {
@@ -16907,1020 +15293,6 @@
 		v.copyOf(x)
 		return true
 	}
-	// match: (ORQ x0:(MOVBload [i0] {s} p mem) sh:(SHLQconst [8] x1:(MOVBload [i1] {s} p mem)))
-	// cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0, x1, sh)
-	// result: @mergePoint(b,x0,x1) (MOVWload [i0] {s} p mem)
-	for {
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			x0 := v_0
-			if x0.Op != OpAMD64MOVBload {
-				continue
-			}
-			i0 := auxIntToInt32(x0.AuxInt)
-			s := auxToSym(x0.Aux)
-			mem := x0.Args[1]
-			p := x0.Args[0]
-			sh := v_1
-			if sh.Op != OpAMD64SHLQconst || auxIntToInt8(sh.AuxInt) != 8 {
-				continue
-			}
-			x1 := sh.Args[0]
-			if x1.Op != OpAMD64MOVBload {
-				continue
-			}
-			i1 := auxIntToInt32(x1.AuxInt)
-			if auxToSym(x1.Aux) != s {
-				continue
-			}
-			_ = x1.Args[1]
-			if p != x1.Args[0] || mem != x1.Args[1] || !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0, x1, sh)) {
-				continue
-			}
-			b = mergePoint(b, x0, x1)
-			v0 := b.NewValue0(x1.Pos, OpAMD64MOVWload, typ.UInt16)
-			v.copyOf(v0)
-			v0.AuxInt = int32ToAuxInt(i0)
-			v0.Aux = symToAux(s)
-			v0.AddArg2(p, mem)
-			return true
-		}
-		break
-	}
-	// match: (ORQ x0:(MOVBload [i] {s} p0 mem) sh:(SHLQconst [8] x1:(MOVBload [i] {s} p1 mem)))
-	// cond: x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && sequentialAddresses(p0, p1, 1) && mergePoint(b,x0,x1) != nil && clobber(x0, x1, sh)
-	// result: @mergePoint(b,x0,x1) (MOVWload [i] {s} p0 mem)
-	for {
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			x0 := v_0
-			if x0.Op != OpAMD64MOVBload {
-				continue
-			}
-			i := auxIntToInt32(x0.AuxInt)
-			s := auxToSym(x0.Aux)
-			mem := x0.Args[1]
-			p0 := x0.Args[0]
-			sh := v_1
-			if sh.Op != OpAMD64SHLQconst || auxIntToInt8(sh.AuxInt) != 8 {
-				continue
-			}
-			x1 := sh.Args[0]
-			if x1.Op != OpAMD64MOVBload || auxIntToInt32(x1.AuxInt) != i || auxToSym(x1.Aux) != s {
-				continue
-			}
-			_ = x1.Args[1]
-			p1 := x1.Args[0]
-			if mem != x1.Args[1] || !(x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && sequentialAddresses(p0, p1, 1) && mergePoint(b, x0, x1) != nil && clobber(x0, x1, sh)) {
-				continue
-			}
-			b = mergePoint(b, x0, x1)
-			v0 := b.NewValue0(x1.Pos, OpAMD64MOVWload, typ.UInt16)
-			v.copyOf(v0)
-			v0.AuxInt = int32ToAuxInt(i)
-			v0.Aux = symToAux(s)
-			v0.AddArg2(p0, mem)
-			return true
-		}
-		break
-	}
-	// match: (ORQ x0:(MOVWload [i0] {s} p mem) sh:(SHLQconst [16] x1:(MOVWload [i1] {s} p mem)))
-	// cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0, x1, sh)
-	// result: @mergePoint(b,x0,x1) (MOVLload [i0] {s} p mem)
-	for {
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			x0 := v_0
-			if x0.Op != OpAMD64MOVWload {
-				continue
-			}
-			i0 := auxIntToInt32(x0.AuxInt)
-			s := auxToSym(x0.Aux)
-			mem := x0.Args[1]
-			p := x0.Args[0]
-			sh := v_1
-			if sh.Op != OpAMD64SHLQconst || auxIntToInt8(sh.AuxInt) != 16 {
-				continue
-			}
-			x1 := sh.Args[0]
-			if x1.Op != OpAMD64MOVWload {
-				continue
-			}
-			i1 := auxIntToInt32(x1.AuxInt)
-			if auxToSym(x1.Aux) != s {
-				continue
-			}
-			_ = x1.Args[1]
-			if p != x1.Args[0] || mem != x1.Args[1] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0, x1, sh)) {
-				continue
-			}
-			b = mergePoint(b, x0, x1)
-			v0 := b.NewValue0(x1.Pos, OpAMD64MOVLload, typ.UInt32)
-			v.copyOf(v0)
-			v0.AuxInt = int32ToAuxInt(i0)
-			v0.Aux = symToAux(s)
-			v0.AddArg2(p, mem)
-			return true
-		}
-		break
-	}
-	// match: (ORQ x0:(MOVWload [i] {s} p0 mem) sh:(SHLQconst [16] x1:(MOVWload [i] {s} p1 mem)))
-	// cond: x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && sequentialAddresses(p0, p1, 2) && mergePoint(b,x0,x1) != nil && clobber(x0, x1, sh)
-	// result: @mergePoint(b,x0,x1) (MOVLload [i] {s} p0 mem)
-	for {
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			x0 := v_0
-			if x0.Op != OpAMD64MOVWload {
-				continue
-			}
-			i := auxIntToInt32(x0.AuxInt)
-			s := auxToSym(x0.Aux)
-			mem := x0.Args[1]
-			p0 := x0.Args[0]
-			sh := v_1
-			if sh.Op != OpAMD64SHLQconst || auxIntToInt8(sh.AuxInt) != 16 {
-				continue
-			}
-			x1 := sh.Args[0]
-			if x1.Op != OpAMD64MOVWload || auxIntToInt32(x1.AuxInt) != i || auxToSym(x1.Aux) != s {
-				continue
-			}
-			_ = x1.Args[1]
-			p1 := x1.Args[0]
-			if mem != x1.Args[1] || !(x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && sequentialAddresses(p0, p1, 2) && mergePoint(b, x0, x1) != nil && clobber(x0, x1, sh)) {
-				continue
-			}
-			b = mergePoint(b, x0, x1)
-			v0 := b.NewValue0(x1.Pos, OpAMD64MOVLload, typ.UInt32)
-			v.copyOf(v0)
-			v0.AuxInt = int32ToAuxInt(i)
-			v0.Aux = symToAux(s)
-			v0.AddArg2(p0, mem)
-			return true
-		}
-		break
-	}
-	// match: (ORQ x0:(MOVLload [i0] {s} p mem) sh:(SHLQconst [32] x1:(MOVLload [i1] {s} p mem)))
-	// cond: i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0, x1, sh)
-	// result: @mergePoint(b,x0,x1) (MOVQload [i0] {s} p mem)
-	for {
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			x0 := v_0
-			if x0.Op != OpAMD64MOVLload {
-				continue
-			}
-			i0 := auxIntToInt32(x0.AuxInt)
-			s := auxToSym(x0.Aux)
-			mem := x0.Args[1]
-			p := x0.Args[0]
-			sh := v_1
-			if sh.Op != OpAMD64SHLQconst || auxIntToInt8(sh.AuxInt) != 32 {
-				continue
-			}
-			x1 := sh.Args[0]
-			if x1.Op != OpAMD64MOVLload {
-				continue
-			}
-			i1 := auxIntToInt32(x1.AuxInt)
-			if auxToSym(x1.Aux) != s {
-				continue
-			}
-			_ = x1.Args[1]
-			if p != x1.Args[0] || mem != x1.Args[1] || !(i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0, x1, sh)) {
-				continue
-			}
-			b = mergePoint(b, x0, x1)
-			v0 := b.NewValue0(x1.Pos, OpAMD64MOVQload, typ.UInt64)
-			v.copyOf(v0)
-			v0.AuxInt = int32ToAuxInt(i0)
-			v0.Aux = symToAux(s)
-			v0.AddArg2(p, mem)
-			return true
-		}
-		break
-	}
-	// match: (ORQ x0:(MOVLload [i] {s} p0 mem) sh:(SHLQconst [32] x1:(MOVLload [i] {s} p1 mem)))
-	// cond: x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && sequentialAddresses(p0, p1, 4) && mergePoint(b,x0,x1) != nil && clobber(x0, x1, sh)
-	// result: @mergePoint(b,x0,x1) (MOVQload [i] {s} p0 mem)
-	for {
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			x0 := v_0
-			if x0.Op != OpAMD64MOVLload {
-				continue
-			}
-			i := auxIntToInt32(x0.AuxInt)
-			s := auxToSym(x0.Aux)
-			mem := x0.Args[1]
-			p0 := x0.Args[0]
-			sh := v_1
-			if sh.Op != OpAMD64SHLQconst || auxIntToInt8(sh.AuxInt) != 32 {
-				continue
-			}
-			x1 := sh.Args[0]
-			if x1.Op != OpAMD64MOVLload || auxIntToInt32(x1.AuxInt) != i || auxToSym(x1.Aux) != s {
-				continue
-			}
-			_ = x1.Args[1]
-			p1 := x1.Args[0]
-			if mem != x1.Args[1] || !(x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && sequentialAddresses(p0, p1, 4) && mergePoint(b, x0, x1) != nil && clobber(x0, x1, sh)) {
-				continue
-			}
-			b = mergePoint(b, x0, x1)
-			v0 := b.NewValue0(x1.Pos, OpAMD64MOVQload, typ.UInt64)
-			v.copyOf(v0)
-			v0.AuxInt = int32ToAuxInt(i)
-			v0.Aux = symToAux(s)
-			v0.AddArg2(p0, mem)
-			return true
-		}
-		break
-	}
-	// match: (ORQ s1:(SHLQconst [j1] x1:(MOVBload [i1] {s} p mem)) or:(ORQ s0:(SHLQconst [j0] x0:(MOVBload [i0] {s} p mem)) y))
-	// cond: i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0, x1, s0, s1, or)
-	// result: @mergePoint(b,x0,x1,y) (ORQ <v.Type> (SHLQconst <v.Type> [j0] (MOVWload [i0] {s} p mem)) y)
-	for {
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			s1 := v_0
-			if s1.Op != OpAMD64SHLQconst {
-				continue
-			}
-			j1 := auxIntToInt8(s1.AuxInt)
-			x1 := s1.Args[0]
-			if x1.Op != OpAMD64MOVBload {
-				continue
-			}
-			i1 := auxIntToInt32(x1.AuxInt)
-			s := auxToSym(x1.Aux)
-			mem := x1.Args[1]
-			p := x1.Args[0]
-			or := v_1
-			if or.Op != OpAMD64ORQ {
-				continue
-			}
-			_ = or.Args[1]
-			or_0 := or.Args[0]
-			or_1 := or.Args[1]
-			for _i1 := 0; _i1 <= 1; _i1, or_0, or_1 = _i1+1, or_1, or_0 {
-				s0 := or_0
-				if s0.Op != OpAMD64SHLQconst {
-					continue
-				}
-				j0 := auxIntToInt8(s0.AuxInt)
-				x0 := s0.Args[0]
-				if x0.Op != OpAMD64MOVBload {
-					continue
-				}
-				i0 := auxIntToInt32(x0.AuxInt)
-				if auxToSym(x0.Aux) != s {
-					continue
-				}
-				_ = x0.Args[1]
-				if p != x0.Args[0] || mem != x0.Args[1] {
-					continue
-				}
-				y := or_1
-				if !(i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0, x1, s0, s1, or)) {
-					continue
-				}
-				b = mergePoint(b, x0, x1, y)
-				v0 := b.NewValue0(x0.Pos, OpAMD64ORQ, v.Type)
-				v.copyOf(v0)
-				v1 := b.NewValue0(x0.Pos, OpAMD64SHLQconst, v.Type)
-				v1.AuxInt = int8ToAuxInt(j0)
-				v2 := b.NewValue0(x0.Pos, OpAMD64MOVWload, typ.UInt16)
-				v2.AuxInt = int32ToAuxInt(i0)
-				v2.Aux = symToAux(s)
-				v2.AddArg2(p, mem)
-				v1.AddArg(v2)
-				v0.AddArg2(v1, y)
-				return true
-			}
-		}
-		break
-	}
-	// match: (ORQ s1:(SHLQconst [j1] x1:(MOVBload [i] {s} p1 mem)) or:(ORQ s0:(SHLQconst [j0] x0:(MOVBload [i] {s} p0 mem)) y))
-	// cond: j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && sequentialAddresses(p0, p1, 1) && mergePoint(b,x0,x1,y) != nil && clobber(x0, x1, s0, s1, or)
-	// result: @mergePoint(b,x0,x1,y) (ORQ <v.Type> (SHLQconst <v.Type> [j0] (MOVWload [i] {s} p0 mem)) y)
-	for {
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			s1 := v_0
-			if s1.Op != OpAMD64SHLQconst {
-				continue
-			}
-			j1 := auxIntToInt8(s1.AuxInt)
-			x1 := s1.Args[0]
-			if x1.Op != OpAMD64MOVBload {
-				continue
-			}
-			i := auxIntToInt32(x1.AuxInt)
-			s := auxToSym(x1.Aux)
-			mem := x1.Args[1]
-			p1 := x1.Args[0]
-			or := v_1
-			if or.Op != OpAMD64ORQ {
-				continue
-			}
-			_ = or.Args[1]
-			or_0 := or.Args[0]
-			or_1 := or.Args[1]
-			for _i1 := 0; _i1 <= 1; _i1, or_0, or_1 = _i1+1, or_1, or_0 {
-				s0 := or_0
-				if s0.Op != OpAMD64SHLQconst {
-					continue
-				}
-				j0 := auxIntToInt8(s0.AuxInt)
-				x0 := s0.Args[0]
-				if x0.Op != OpAMD64MOVBload || auxIntToInt32(x0.AuxInt) != i || auxToSym(x0.Aux) != s {
-					continue
-				}
-				_ = x0.Args[1]
-				p0 := x0.Args[0]
-				if mem != x0.Args[1] {
-					continue
-				}
-				y := or_1
-				if !(j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && sequentialAddresses(p0, p1, 1) && mergePoint(b, x0, x1, y) != nil && clobber(x0, x1, s0, s1, or)) {
-					continue
-				}
-				b = mergePoint(b, x0, x1, y)
-				v0 := b.NewValue0(x0.Pos, OpAMD64ORQ, v.Type)
-				v.copyOf(v0)
-				v1 := b.NewValue0(x0.Pos, OpAMD64SHLQconst, v.Type)
-				v1.AuxInt = int8ToAuxInt(j0)
-				v2 := b.NewValue0(x0.Pos, OpAMD64MOVWload, typ.UInt16)
-				v2.AuxInt = int32ToAuxInt(i)
-				v2.Aux = symToAux(s)
-				v2.AddArg2(p0, mem)
-				v1.AddArg(v2)
-				v0.AddArg2(v1, y)
-				return true
-			}
-		}
-		break
-	}
-	// match: (ORQ s1:(SHLQconst [j1] x1:(MOVWload [i1] {s} p mem)) or:(ORQ s0:(SHLQconst [j0] x0:(MOVWload [i0] {s} p mem)) y))
-	// cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0, x1, s0, s1, or)
-	// result: @mergePoint(b,x0,x1,y) (ORQ <v.Type> (SHLQconst <v.Type> [j0] (MOVLload [i0] {s} p mem)) y)
-	for {
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			s1 := v_0
-			if s1.Op != OpAMD64SHLQconst {
-				continue
-			}
-			j1 := auxIntToInt8(s1.AuxInt)
-			x1 := s1.Args[0]
-			if x1.Op != OpAMD64MOVWload {
-				continue
-			}
-			i1 := auxIntToInt32(x1.AuxInt)
-			s := auxToSym(x1.Aux)
-			mem := x1.Args[1]
-			p := x1.Args[0]
-			or := v_1
-			if or.Op != OpAMD64ORQ {
-				continue
-			}
-			_ = or.Args[1]
-			or_0 := or.Args[0]
-			or_1 := or.Args[1]
-			for _i1 := 0; _i1 <= 1; _i1, or_0, or_1 = _i1+1, or_1, or_0 {
-				s0 := or_0
-				if s0.Op != OpAMD64SHLQconst {
-					continue
-				}
-				j0 := auxIntToInt8(s0.AuxInt)
-				x0 := s0.Args[0]
-				if x0.Op != OpAMD64MOVWload {
-					continue
-				}
-				i0 := auxIntToInt32(x0.AuxInt)
-				if auxToSym(x0.Aux) != s {
-					continue
-				}
-				_ = x0.Args[1]
-				if p != x0.Args[0] || mem != x0.Args[1] {
-					continue
-				}
-				y := or_1
-				if !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0, x1, s0, s1, or)) {
-					continue
-				}
-				b = mergePoint(b, x0, x1, y)
-				v0 := b.NewValue0(x0.Pos, OpAMD64ORQ, v.Type)
-				v.copyOf(v0)
-				v1 := b.NewValue0(x0.Pos, OpAMD64SHLQconst, v.Type)
-				v1.AuxInt = int8ToAuxInt(j0)
-				v2 := b.NewValue0(x0.Pos, OpAMD64MOVLload, typ.UInt32)
-				v2.AuxInt = int32ToAuxInt(i0)
-				v2.Aux = symToAux(s)
-				v2.AddArg2(p, mem)
-				v1.AddArg(v2)
-				v0.AddArg2(v1, y)
-				return true
-			}
-		}
-		break
-	}
-	// match: (ORQ s1:(SHLQconst [j1] x1:(MOVWload [i] {s} p1 mem)) or:(ORQ s0:(SHLQconst [j0] x0:(MOVWload [i] {s} p0 mem)) y))
-	// cond: j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && sequentialAddresses(p0, p1, 2) && mergePoint(b,x0,x1,y) != nil && clobber(x0, x1, s0, s1, or)
-	// result: @mergePoint(b,x0,x1,y) (ORQ <v.Type> (SHLQconst <v.Type> [j0] (MOVLload [i] {s} p0 mem)) y)
-	for {
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			s1 := v_0
-			if s1.Op != OpAMD64SHLQconst {
-				continue
-			}
-			j1 := auxIntToInt8(s1.AuxInt)
-			x1 := s1.Args[0]
-			if x1.Op != OpAMD64MOVWload {
-				continue
-			}
-			i := auxIntToInt32(x1.AuxInt)
-			s := auxToSym(x1.Aux)
-			mem := x1.Args[1]
-			p1 := x1.Args[0]
-			or := v_1
-			if or.Op != OpAMD64ORQ {
-				continue
-			}
-			_ = or.Args[1]
-			or_0 := or.Args[0]
-			or_1 := or.Args[1]
-			for _i1 := 0; _i1 <= 1; _i1, or_0, or_1 = _i1+1, or_1, or_0 {
-				s0 := or_0
-				if s0.Op != OpAMD64SHLQconst {
-					continue
-				}
-				j0 := auxIntToInt8(s0.AuxInt)
-				x0 := s0.Args[0]
-				if x0.Op != OpAMD64MOVWload || auxIntToInt32(x0.AuxInt) != i || auxToSym(x0.Aux) != s {
-					continue
-				}
-				_ = x0.Args[1]
-				p0 := x0.Args[0]
-				if mem != x0.Args[1] {
-					continue
-				}
-				y := or_1
-				if !(j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && sequentialAddresses(p0, p1, 2) && mergePoint(b, x0, x1, y) != nil && clobber(x0, x1, s0, s1, or)) {
-					continue
-				}
-				b = mergePoint(b, x0, x1, y)
-				v0 := b.NewValue0(x0.Pos, OpAMD64ORQ, v.Type)
-				v.copyOf(v0)
-				v1 := b.NewValue0(x0.Pos, OpAMD64SHLQconst, v.Type)
-				v1.AuxInt = int8ToAuxInt(j0)
-				v2 := b.NewValue0(x0.Pos, OpAMD64MOVLload, typ.UInt32)
-				v2.AuxInt = int32ToAuxInt(i)
-				v2.Aux = symToAux(s)
-				v2.AddArg2(p0, mem)
-				v1.AddArg(v2)
-				v0.AddArg2(v1, y)
-				return true
-			}
-		}
-		break
-	}
-	// match: (ORQ x1:(MOVBload [i1] {s} p mem) sh:(SHLQconst [8] x0:(MOVBload [i0] {s} p mem)))
-	// cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0, x1, sh)
-	// result: @mergePoint(b,x0,x1) (ROLWconst <v.Type> [8] (MOVWload [i0] {s} p mem))
-	for {
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			x1 := v_0
-			if x1.Op != OpAMD64MOVBload {
-				continue
-			}
-			i1 := auxIntToInt32(x1.AuxInt)
-			s := auxToSym(x1.Aux)
-			mem := x1.Args[1]
-			p := x1.Args[0]
-			sh := v_1
-			if sh.Op != OpAMD64SHLQconst || auxIntToInt8(sh.AuxInt) != 8 {
-				continue
-			}
-			x0 := sh.Args[0]
-			if x0.Op != OpAMD64MOVBload {
-				continue
-			}
-			i0 := auxIntToInt32(x0.AuxInt)
-			if auxToSym(x0.Aux) != s {
-				continue
-			}
-			_ = x0.Args[1]
-			if p != x0.Args[0] || mem != x0.Args[1] || !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0, x1, sh)) {
-				continue
-			}
-			b = mergePoint(b, x0, x1)
-			v0 := b.NewValue0(x0.Pos, OpAMD64ROLWconst, v.Type)
-			v.copyOf(v0)
-			v0.AuxInt = int8ToAuxInt(8)
-			v1 := b.NewValue0(x0.Pos, OpAMD64MOVWload, typ.UInt16)
-			v1.AuxInt = int32ToAuxInt(i0)
-			v1.Aux = symToAux(s)
-			v1.AddArg2(p, mem)
-			v0.AddArg(v1)
-			return true
-		}
-		break
-	}
-	// match: (ORQ x1:(MOVBload [i] {s} p1 mem) sh:(SHLQconst [8] x0:(MOVBload [i] {s} p0 mem)))
-	// cond: x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && sequentialAddresses(p0, p1, 1) && mergePoint(b,x0,x1) != nil && clobber(x0, x1, sh)
-	// result: @mergePoint(b,x0,x1) (ROLWconst <v.Type> [8] (MOVWload [i] {s} p0 mem))
-	for {
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			x1 := v_0
-			if x1.Op != OpAMD64MOVBload {
-				continue
-			}
-			i := auxIntToInt32(x1.AuxInt)
-			s := auxToSym(x1.Aux)
-			mem := x1.Args[1]
-			p1 := x1.Args[0]
-			sh := v_1
-			if sh.Op != OpAMD64SHLQconst || auxIntToInt8(sh.AuxInt) != 8 {
-				continue
-			}
-			x0 := sh.Args[0]
-			if x0.Op != OpAMD64MOVBload || auxIntToInt32(x0.AuxInt) != i || auxToSym(x0.Aux) != s {
-				continue
-			}
-			_ = x0.Args[1]
-			p0 := x0.Args[0]
-			if mem != x0.Args[1] || !(x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && sequentialAddresses(p0, p1, 1) && mergePoint(b, x0, x1) != nil && clobber(x0, x1, sh)) {
-				continue
-			}
-			b = mergePoint(b, x0, x1)
-			v0 := b.NewValue0(x0.Pos, OpAMD64ROLWconst, v.Type)
-			v.copyOf(v0)
-			v0.AuxInt = int8ToAuxInt(8)
-			v1 := b.NewValue0(x0.Pos, OpAMD64MOVWload, typ.UInt16)
-			v1.AuxInt = int32ToAuxInt(i)
-			v1.Aux = symToAux(s)
-			v1.AddArg2(p0, mem)
-			v0.AddArg(v1)
-			return true
-		}
-		break
-	}
-	// match: (ORQ r1:(ROLWconst [8] x1:(MOVWload [i1] {s} p mem)) sh:(SHLQconst [16] r0:(ROLWconst [8] x0:(MOVWload [i0] {s} p mem))))
-	// cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0, x1, r0, r1, sh)
-	// result: @mergePoint(b,x0,x1) (BSWAPL <v.Type> (MOVLload [i0] {s} p mem))
-	for {
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			r1 := v_0
-			if r1.Op != OpAMD64ROLWconst || auxIntToInt8(r1.AuxInt) != 8 {
-				continue
-			}
-			x1 := r1.Args[0]
-			if x1.Op != OpAMD64MOVWload {
-				continue
-			}
-			i1 := auxIntToInt32(x1.AuxInt)
-			s := auxToSym(x1.Aux)
-			mem := x1.Args[1]
-			p := x1.Args[0]
-			sh := v_1
-			if sh.Op != OpAMD64SHLQconst || auxIntToInt8(sh.AuxInt) != 16 {
-				continue
-			}
-			r0 := sh.Args[0]
-			if r0.Op != OpAMD64ROLWconst || auxIntToInt8(r0.AuxInt) != 8 {
-				continue
-			}
-			x0 := r0.Args[0]
-			if x0.Op != OpAMD64MOVWload {
-				continue
-			}
-			i0 := auxIntToInt32(x0.AuxInt)
-			if auxToSym(x0.Aux) != s {
-				continue
-			}
-			_ = x0.Args[1]
-			if p != x0.Args[0] || mem != x0.Args[1] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0, x1, r0, r1, sh)) {
-				continue
-			}
-			b = mergePoint(b, x0, x1)
-			v0 := b.NewValue0(x0.Pos, OpAMD64BSWAPL, v.Type)
-			v.copyOf(v0)
-			v1 := b.NewValue0(x0.Pos, OpAMD64MOVLload, typ.UInt32)
-			v1.AuxInt = int32ToAuxInt(i0)
-			v1.Aux = symToAux(s)
-			v1.AddArg2(p, mem)
-			v0.AddArg(v1)
-			return true
-		}
-		break
-	}
-	// match: (ORQ r1:(ROLWconst [8] x1:(MOVWload [i] {s} p1 mem)) sh:(SHLQconst [16] r0:(ROLWconst [8] x0:(MOVWload [i] {s} p0 mem))))
-	// cond: x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && sequentialAddresses(p0, p1, 2) && mergePoint(b,x0,x1) != nil && clobber(x0, x1, r0, r1, sh)
-	// result: @mergePoint(b,x0,x1) (BSWAPL <v.Type> (MOVLload [i] {s} p0 mem))
-	for {
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			r1 := v_0
-			if r1.Op != OpAMD64ROLWconst || auxIntToInt8(r1.AuxInt) != 8 {
-				continue
-			}
-			x1 := r1.Args[0]
-			if x1.Op != OpAMD64MOVWload {
-				continue
-			}
-			i := auxIntToInt32(x1.AuxInt)
-			s := auxToSym(x1.Aux)
-			mem := x1.Args[1]
-			p1 := x1.Args[0]
-			sh := v_1
-			if sh.Op != OpAMD64SHLQconst || auxIntToInt8(sh.AuxInt) != 16 {
-				continue
-			}
-			r0 := sh.Args[0]
-			if r0.Op != OpAMD64ROLWconst || auxIntToInt8(r0.AuxInt) != 8 {
-				continue
-			}
-			x0 := r0.Args[0]
-			if x0.Op != OpAMD64MOVWload || auxIntToInt32(x0.AuxInt) != i || auxToSym(x0.Aux) != s {
-				continue
-			}
-			_ = x0.Args[1]
-			p0 := x0.Args[0]
-			if mem != x0.Args[1] || !(x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && sequentialAddresses(p0, p1, 2) && mergePoint(b, x0, x1) != nil && clobber(x0, x1, r0, r1, sh)) {
-				continue
-			}
-			b = mergePoint(b, x0, x1)
-			v0 := b.NewValue0(x0.Pos, OpAMD64BSWAPL, v.Type)
-			v.copyOf(v0)
-			v1 := b.NewValue0(x0.Pos, OpAMD64MOVLload, typ.UInt32)
-			v1.AuxInt = int32ToAuxInt(i)
-			v1.Aux = symToAux(s)
-			v1.AddArg2(p0, mem)
-			v0.AddArg(v1)
-			return true
-		}
-		break
-	}
-	// match: (ORQ r1:(BSWAPL x1:(MOVLload [i1] {s} p mem)) sh:(SHLQconst [32] r0:(BSWAPL x0:(MOVLload [i0] {s} p mem))))
-	// cond: i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0, x1, r0, r1, sh)
-	// result: @mergePoint(b,x0,x1) (BSWAPQ <v.Type> (MOVQload [i0] {s} p mem))
-	for {
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			r1 := v_0
-			if r1.Op != OpAMD64BSWAPL {
-				continue
-			}
-			x1 := r1.Args[0]
-			if x1.Op != OpAMD64MOVLload {
-				continue
-			}
-			i1 := auxIntToInt32(x1.AuxInt)
-			s := auxToSym(x1.Aux)
-			mem := x1.Args[1]
-			p := x1.Args[0]
-			sh := v_1
-			if sh.Op != OpAMD64SHLQconst || auxIntToInt8(sh.AuxInt) != 32 {
-				continue
-			}
-			r0 := sh.Args[0]
-			if r0.Op != OpAMD64BSWAPL {
-				continue
-			}
-			x0 := r0.Args[0]
-			if x0.Op != OpAMD64MOVLload {
-				continue
-			}
-			i0 := auxIntToInt32(x0.AuxInt)
-			if auxToSym(x0.Aux) != s {
-				continue
-			}
-			_ = x0.Args[1]
-			if p != x0.Args[0] || mem != x0.Args[1] || !(i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0, x1, r0, r1, sh)) {
-				continue
-			}
-			b = mergePoint(b, x0, x1)
-			v0 := b.NewValue0(x0.Pos, OpAMD64BSWAPQ, v.Type)
-			v.copyOf(v0)
-			v1 := b.NewValue0(x0.Pos, OpAMD64MOVQload, typ.UInt64)
-			v1.AuxInt = int32ToAuxInt(i0)
-			v1.Aux = symToAux(s)
-			v1.AddArg2(p, mem)
-			v0.AddArg(v1)
-			return true
-		}
-		break
-	}
-	// match: (ORQ r1:(BSWAPL x1:(MOVLload [i] {s} p1 mem)) sh:(SHLQconst [32] r0:(BSWAPL x0:(MOVLload [i] {s} p0 mem))))
-	// cond: x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && sequentialAddresses(p0, p1, 4) && mergePoint(b,x0,x1) != nil && clobber(x0, x1, r0, r1, sh)
-	// result: @mergePoint(b,x0,x1) (BSWAPQ <v.Type> (MOVQload [i] {s} p0 mem))
-	for {
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			r1 := v_0
-			if r1.Op != OpAMD64BSWAPL {
-				continue
-			}
-			x1 := r1.Args[0]
-			if x1.Op != OpAMD64MOVLload {
-				continue
-			}
-			i := auxIntToInt32(x1.AuxInt)
-			s := auxToSym(x1.Aux)
-			mem := x1.Args[1]
-			p1 := x1.Args[0]
-			sh := v_1
-			if sh.Op != OpAMD64SHLQconst || auxIntToInt8(sh.AuxInt) != 32 {
-				continue
-			}
-			r0 := sh.Args[0]
-			if r0.Op != OpAMD64BSWAPL {
-				continue
-			}
-			x0 := r0.Args[0]
-			if x0.Op != OpAMD64MOVLload || auxIntToInt32(x0.AuxInt) != i || auxToSym(x0.Aux) != s {
-				continue
-			}
-			_ = x0.Args[1]
-			p0 := x0.Args[0]
-			if mem != x0.Args[1] || !(x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && sequentialAddresses(p0, p1, 4) && mergePoint(b, x0, x1) != nil && clobber(x0, x1, r0, r1, sh)) {
-				continue
-			}
-			b = mergePoint(b, x0, x1)
-			v0 := b.NewValue0(x0.Pos, OpAMD64BSWAPQ, v.Type)
-			v.copyOf(v0)
-			v1 := b.NewValue0(x0.Pos, OpAMD64MOVQload, typ.UInt64)
-			v1.AuxInt = int32ToAuxInt(i)
-			v1.Aux = symToAux(s)
-			v1.AddArg2(p0, mem)
-			v0.AddArg(v1)
-			return true
-		}
-		break
-	}
-	// match: (ORQ s0:(SHLQconst [j0] x0:(MOVBload [i0] {s} p mem)) or:(ORQ s1:(SHLQconst [j1] x1:(MOVBload [i1] {s} p mem)) y))
-	// cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0, x1, s0, s1, or)
-	// result: @mergePoint(b,x0,x1,y) (ORQ <v.Type> (SHLQconst <v.Type> [j1] (ROLWconst <typ.UInt16> [8] (MOVWload [i0] {s} p mem))) y)
-	for {
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			s0 := v_0
-			if s0.Op != OpAMD64SHLQconst {
-				continue
-			}
-			j0 := auxIntToInt8(s0.AuxInt)
-			x0 := s0.Args[0]
-			if x0.Op != OpAMD64MOVBload {
-				continue
-			}
-			i0 := auxIntToInt32(x0.AuxInt)
-			s := auxToSym(x0.Aux)
-			mem := x0.Args[1]
-			p := x0.Args[0]
-			or := v_1
-			if or.Op != OpAMD64ORQ {
-				continue
-			}
-			_ = or.Args[1]
-			or_0 := or.Args[0]
-			or_1 := or.Args[1]
-			for _i1 := 0; _i1 <= 1; _i1, or_0, or_1 = _i1+1, or_1, or_0 {
-				s1 := or_0
-				if s1.Op != OpAMD64SHLQconst {
-					continue
-				}
-				j1 := auxIntToInt8(s1.AuxInt)
-				x1 := s1.Args[0]
-				if x1.Op != OpAMD64MOVBload {
-					continue
-				}
-				i1 := auxIntToInt32(x1.AuxInt)
-				if auxToSym(x1.Aux) != s {
-					continue
-				}
-				_ = x1.Args[1]
-				if p != x1.Args[0] || mem != x1.Args[1] {
-					continue
-				}
-				y := or_1
-				if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0, x1, s0, s1, or)) {
-					continue
-				}
-				b = mergePoint(b, x0, x1, y)
-				v0 := b.NewValue0(x1.Pos, OpAMD64ORQ, v.Type)
-				v.copyOf(v0)
-				v1 := b.NewValue0(x1.Pos, OpAMD64SHLQconst, v.Type)
-				v1.AuxInt = int8ToAuxInt(j1)
-				v2 := b.NewValue0(x1.Pos, OpAMD64ROLWconst, typ.UInt16)
-				v2.AuxInt = int8ToAuxInt(8)
-				v3 := b.NewValue0(x1.Pos, OpAMD64MOVWload, typ.UInt16)
-				v3.AuxInt = int32ToAuxInt(i0)
-				v3.Aux = symToAux(s)
-				v3.AddArg2(p, mem)
-				v2.AddArg(v3)
-				v1.AddArg(v2)
-				v0.AddArg2(v1, y)
-				return true
-			}
-		}
-		break
-	}
-	// match: (ORQ s0:(SHLQconst [j0] x0:(MOVBload [i] {s} p0 mem)) or:(ORQ s1:(SHLQconst [j1] x1:(MOVBload [i] {s} p1 mem)) y))
-	// cond: j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && sequentialAddresses(p0, p1, 1) && mergePoint(b,x0,x1,y) != nil && clobber(x0, x1, s0, s1, or)
-	// result: @mergePoint(b,x0,x1,y) (ORQ <v.Type> (SHLQconst <v.Type> [j1] (ROLWconst <typ.UInt16> [8] (MOVWload [i] {s} p0 mem))) y)
-	for {
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			s0 := v_0
-			if s0.Op != OpAMD64SHLQconst {
-				continue
-			}
-			j0 := auxIntToInt8(s0.AuxInt)
-			x0 := s0.Args[0]
-			if x0.Op != OpAMD64MOVBload {
-				continue
-			}
-			i := auxIntToInt32(x0.AuxInt)
-			s := auxToSym(x0.Aux)
-			mem := x0.Args[1]
-			p0 := x0.Args[0]
-			or := v_1
-			if or.Op != OpAMD64ORQ {
-				continue
-			}
-			_ = or.Args[1]
-			or_0 := or.Args[0]
-			or_1 := or.Args[1]
-			for _i1 := 0; _i1 <= 1; _i1, or_0, or_1 = _i1+1, or_1, or_0 {
-				s1 := or_0
-				if s1.Op != OpAMD64SHLQconst {
-					continue
-				}
-				j1 := auxIntToInt8(s1.AuxInt)
-				x1 := s1.Args[0]
-				if x1.Op != OpAMD64MOVBload || auxIntToInt32(x1.AuxInt) != i || auxToSym(x1.Aux) != s {
-					continue
-				}
-				_ = x1.Args[1]
-				p1 := x1.Args[0]
-				if mem != x1.Args[1] {
-					continue
-				}
-				y := or_1
-				if !(j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && sequentialAddresses(p0, p1, 1) && mergePoint(b, x0, x1, y) != nil && clobber(x0, x1, s0, s1, or)) {
-					continue
-				}
-				b = mergePoint(b, x0, x1, y)
-				v0 := b.NewValue0(x1.Pos, OpAMD64ORQ, v.Type)
-				v.copyOf(v0)
-				v1 := b.NewValue0(x1.Pos, OpAMD64SHLQconst, v.Type)
-				v1.AuxInt = int8ToAuxInt(j1)
-				v2 := b.NewValue0(x1.Pos, OpAMD64ROLWconst, typ.UInt16)
-				v2.AuxInt = int8ToAuxInt(8)
-				v3 := b.NewValue0(x1.Pos, OpAMD64MOVWload, typ.UInt16)
-				v3.AuxInt = int32ToAuxInt(i)
-				v3.Aux = symToAux(s)
-				v3.AddArg2(p0, mem)
-				v2.AddArg(v3)
-				v1.AddArg(v2)
-				v0.AddArg2(v1, y)
-				return true
-			}
-		}
-		break
-	}
-	// match: (ORQ s0:(SHLQconst [j0] r0:(ROLWconst [8] x0:(MOVWload [i0] {s} p mem))) or:(ORQ s1:(SHLQconst [j1] r1:(ROLWconst [8] x1:(MOVWload [i1] {s} p mem))) y))
-	// cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0, x1, r0, r1, s0, s1, or)
-	// result: @mergePoint(b,x0,x1,y) (ORQ <v.Type> (SHLQconst <v.Type> [j1] (BSWAPL <typ.UInt32> (MOVLload [i0] {s} p mem))) y)
-	for {
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			s0 := v_0
-			if s0.Op != OpAMD64SHLQconst {
-				continue
-			}
-			j0 := auxIntToInt8(s0.AuxInt)
-			r0 := s0.Args[0]
-			if r0.Op != OpAMD64ROLWconst || auxIntToInt8(r0.AuxInt) != 8 {
-				continue
-			}
-			x0 := r0.Args[0]
-			if x0.Op != OpAMD64MOVWload {
-				continue
-			}
-			i0 := auxIntToInt32(x0.AuxInt)
-			s := auxToSym(x0.Aux)
-			mem := x0.Args[1]
-			p := x0.Args[0]
-			or := v_1
-			if or.Op != OpAMD64ORQ {
-				continue
-			}
-			_ = or.Args[1]
-			or_0 := or.Args[0]
-			or_1 := or.Args[1]
-			for _i1 := 0; _i1 <= 1; _i1, or_0, or_1 = _i1+1, or_1, or_0 {
-				s1 := or_0
-				if s1.Op != OpAMD64SHLQconst {
-					continue
-				}
-				j1 := auxIntToInt8(s1.AuxInt)
-				r1 := s1.Args[0]
-				if r1.Op != OpAMD64ROLWconst || auxIntToInt8(r1.AuxInt) != 8 {
-					continue
-				}
-				x1 := r1.Args[0]
-				if x1.Op != OpAMD64MOVWload {
-					continue
-				}
-				i1 := auxIntToInt32(x1.AuxInt)
-				if auxToSym(x1.Aux) != s {
-					continue
-				}
-				_ = x1.Args[1]
-				if p != x1.Args[0] || mem != x1.Args[1] {
-					continue
-				}
-				y := or_1
-				if !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0, x1, r0, r1, s0, s1, or)) {
-					continue
-				}
-				b = mergePoint(b, x0, x1, y)
-				v0 := b.NewValue0(x1.Pos, OpAMD64ORQ, v.Type)
-				v.copyOf(v0)
-				v1 := b.NewValue0(x1.Pos, OpAMD64SHLQconst, v.Type)
-				v1.AuxInt = int8ToAuxInt(j1)
-				v2 := b.NewValue0(x1.Pos, OpAMD64BSWAPL, typ.UInt32)
-				v3 := b.NewValue0(x1.Pos, OpAMD64MOVLload, typ.UInt32)
-				v3.AuxInt = int32ToAuxInt(i0)
-				v3.Aux = symToAux(s)
-				v3.AddArg2(p, mem)
-				v2.AddArg(v3)
-				v1.AddArg(v2)
-				v0.AddArg2(v1, y)
-				return true
-			}
-		}
-		break
-	}
-	// match: (ORQ s0:(SHLQconst [j0] r0:(ROLWconst [8] x0:(MOVWload [i] {s} p0 mem))) or:(ORQ s1:(SHLQconst [j1] r1:(ROLWconst [8] x1:(MOVWload [i] {s} p1 mem))) y))
-	// cond: j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && sequentialAddresses(p0, p1, 2) && mergePoint(b,x0,x1,y) != nil && clobber(x0, x1, r0, r1, s0, s1, or)
-	// result: @mergePoint(b,x0,x1,y) (ORQ <v.Type> (SHLQconst <v.Type> [j1] (BSWAPL <typ.UInt32> (MOVLload [i] {s} p0 mem))) y)
-	for {
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			s0 := v_0
-			if s0.Op != OpAMD64SHLQconst {
-				continue
-			}
-			j0 := auxIntToInt8(s0.AuxInt)
-			r0 := s0.Args[0]
-			if r0.Op != OpAMD64ROLWconst || auxIntToInt8(r0.AuxInt) != 8 {
-				continue
-			}
-			x0 := r0.Args[0]
-			if x0.Op != OpAMD64MOVWload {
-				continue
-			}
-			i := auxIntToInt32(x0.AuxInt)
-			s := auxToSym(x0.Aux)
-			mem := x0.Args[1]
-			p0 := x0.Args[0]
-			or := v_1
-			if or.Op != OpAMD64ORQ {
-				continue
-			}
-			_ = or.Args[1]
-			or_0 := or.Args[0]
-			or_1 := or.Args[1]
-			for _i1 := 0; _i1 <= 1; _i1, or_0, or_1 = _i1+1, or_1, or_0 {
-				s1 := or_0
-				if s1.Op != OpAMD64SHLQconst {
-					continue
-				}
-				j1 := auxIntToInt8(s1.AuxInt)
-				r1 := s1.Args[0]
-				if r1.Op != OpAMD64ROLWconst || auxIntToInt8(r1.AuxInt) != 8 {
-					continue
-				}
-				x1 := r1.Args[0]
-				if x1.Op != OpAMD64MOVWload || auxIntToInt32(x1.AuxInt) != i || auxToSym(x1.Aux) != s {
-					continue
-				}
-				_ = x1.Args[1]
-				p1 := x1.Args[0]
-				if mem != x1.Args[1] {
-					continue
-				}
-				y := or_1
-				if !(j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && sequentialAddresses(p0, p1, 2) && mergePoint(b, x0, x1, y) != nil && clobber(x0, x1, r0, r1, s0, s1, or)) {
-					continue
-				}
-				b = mergePoint(b, x0, x1, y)
-				v0 := b.NewValue0(x1.Pos, OpAMD64ORQ, v.Type)
-				v.copyOf(v0)
-				v1 := b.NewValue0(x1.Pos, OpAMD64SHLQconst, v.Type)
-				v1.AuxInt = int8ToAuxInt(j1)
-				v2 := b.NewValue0(x1.Pos, OpAMD64BSWAPL, typ.UInt32)
-				v3 := b.NewValue0(x1.Pos, OpAMD64MOVLload, typ.UInt32)
-				v3.AuxInt = int32ToAuxInt(i)
-				v3.Aux = symToAux(s)
-				v3.AddArg2(p0, mem)
-				v2.AddArg(v3)
-				v1.AddArg(v2)
-				v0.AddArg2(v1, y)
-				return true
-			}
-		}
-		break
-	}
 	// match: (ORQ x l:(MOVQload [off] {sym} ptr mem))
 	// cond: canMergeLoadClobber(v, l, x) && clobber(l)
 	// result: (ORQload x [off] {sym} ptr mem)
@@ -17946,81 +15318,6 @@
 		}
 		break
 	}
-	// match: (ORQ x0:(MOVBELload [i0] {s} p mem) sh:(SHLQconst [32] x1:(MOVBELload [i1] {s} p mem)))
-	// cond: i0 == i1+4 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0, x1, sh)
-	// result: @mergePoint(b,x0,x1) (MOVBEQload [i1] {s} p mem)
-	for {
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			x0 := v_0
-			if x0.Op != OpAMD64MOVBELload {
-				continue
-			}
-			i0 := auxIntToInt32(x0.AuxInt)
-			s := auxToSym(x0.Aux)
-			mem := x0.Args[1]
-			p := x0.Args[0]
-			sh := v_1
-			if sh.Op != OpAMD64SHLQconst || auxIntToInt8(sh.AuxInt) != 32 {
-				continue
-			}
-			x1 := sh.Args[0]
-			if x1.Op != OpAMD64MOVBELload {
-				continue
-			}
-			i1 := auxIntToInt32(x1.AuxInt)
-			if auxToSym(x1.Aux) != s {
-				continue
-			}
-			_ = x1.Args[1]
-			if p != x1.Args[0] || mem != x1.Args[1] || !(i0 == i1+4 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0, x1, sh)) {
-				continue
-			}
-			b = mergePoint(b, x0, x1)
-			v0 := b.NewValue0(x1.Pos, OpAMD64MOVBEQload, typ.UInt64)
-			v.copyOf(v0)
-			v0.AuxInt = int32ToAuxInt(i1)
-			v0.Aux = symToAux(s)
-			v0.AddArg2(p, mem)
-			return true
-		}
-		break
-	}
-	// match: (ORQ x0:(MOVBELload [i] {s} p0 mem) sh:(SHLQconst [32] x1:(MOVBELload [i] {s} p1 mem)))
-	// cond: x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && sequentialAddresses(p1, p0, 4) && mergePoint(b,x0,x1) != nil && clobber(x0, x1, sh)
-	// result: @mergePoint(b,x0,x1) (MOVBEQload [i] {s} p1 mem)
-	for {
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			x0 := v_0
-			if x0.Op != OpAMD64MOVBELload {
-				continue
-			}
-			i := auxIntToInt32(x0.AuxInt)
-			s := auxToSym(x0.Aux)
-			mem := x0.Args[1]
-			p0 := x0.Args[0]
-			sh := v_1
-			if sh.Op != OpAMD64SHLQconst || auxIntToInt8(sh.AuxInt) != 32 {
-				continue
-			}
-			x1 := sh.Args[0]
-			if x1.Op != OpAMD64MOVBELload || auxIntToInt32(x1.AuxInt) != i || auxToSym(x1.Aux) != s {
-				continue
-			}
-			_ = x1.Args[1]
-			p1 := x1.Args[0]
-			if mem != x1.Args[1] || !(x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && sequentialAddresses(p1, p0, 4) && mergePoint(b, x0, x1) != nil && clobber(x0, x1, sh)) {
-				continue
-			}
-			b = mergePoint(b, x0, x1)
-			v0 := b.NewValue0(x1.Pos, OpAMD64MOVBEQload, typ.UInt64)
-			v.copyOf(v0)
-			v0.AuxInt = int32ToAuxInt(i)
-			v0.Aux = symToAux(s)
-			v0.AddArg2(p1, mem)
-			return true
-		}
-		break
-	}
 	return false
 }
 func rewriteValueAMD64_OpAMD64ORQconst(v *Value) bool {
@@ -21057,6 +18354,58 @@
 		v.AuxInt = int32ToAuxInt(0)
 		return true
 	}
+	// match: (SETEQ (TESTQ s:(Select0 blsr:(BLSRQ _)) s))
+	// result: (SETEQ (Select1 <types.TypeFlags> blsr))
+	for {
+		if v_0.Op != OpAMD64TESTQ {
+			break
+		}
+		_ = v_0.Args[1]
+		v_0_0 := v_0.Args[0]
+		v_0_1 := v_0.Args[1]
+		for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
+			s := v_0_0
+			if s.Op != OpSelect0 {
+				continue
+			}
+			blsr := s.Args[0]
+			if blsr.Op != OpAMD64BLSRQ || s != v_0_1 {
+				continue
+			}
+			v.reset(OpAMD64SETEQ)
+			v0 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags)
+			v0.AddArg(blsr)
+			v.AddArg(v0)
+			return true
+		}
+		break
+	}
+	// match: (SETEQ (TESTL s:(Select0 blsr:(BLSRL _)) s))
+	// result: (SETEQ (Select1 <types.TypeFlags> blsr))
+	for {
+		if v_0.Op != OpAMD64TESTL {
+			break
+		}
+		_ = v_0.Args[1]
+		v_0_0 := v_0.Args[0]
+		v_0_1 := v_0.Args[1]
+		for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
+			s := v_0_0
+			if s.Op != OpSelect0 {
+				continue
+			}
+			blsr := s.Args[0]
+			if blsr.Op != OpAMD64BLSRL || s != v_0_1 {
+				continue
+			}
+			v.reset(OpAMD64SETEQ)
+			v0 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags)
+			v0.AddArg(blsr)
+			v.AddArg(v0)
+			return true
+		}
+		break
+	}
 	return false
 }
 func rewriteValueAMD64_OpAMD64SETEQstore(v *Value) bool {
@@ -22973,6 +20322,58 @@
 		v.AuxInt = int32ToAuxInt(1)
 		return true
 	}
+	// match: (SETNE (TESTQ s:(Select0 blsr:(BLSRQ _)) s))
+	// result: (SETNE (Select1 <types.TypeFlags> blsr))
+	for {
+		if v_0.Op != OpAMD64TESTQ {
+			break
+		}
+		_ = v_0.Args[1]
+		v_0_0 := v_0.Args[0]
+		v_0_1 := v_0.Args[1]
+		for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
+			s := v_0_0
+			if s.Op != OpSelect0 {
+				continue
+			}
+			blsr := s.Args[0]
+			if blsr.Op != OpAMD64BLSRQ || s != v_0_1 {
+				continue
+			}
+			v.reset(OpAMD64SETNE)
+			v0 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags)
+			v0.AddArg(blsr)
+			v.AddArg(v0)
+			return true
+		}
+		break
+	}
+	// match: (SETNE (TESTL s:(Select0 blsr:(BLSRL _)) s))
+	// result: (SETNE (Select1 <types.TypeFlags> blsr))
+	for {
+		if v_0.Op != OpAMD64TESTL {
+			break
+		}
+		_ = v_0.Args[1]
+		v_0_0 := v_0.Args[0]
+		v_0_1 := v_0.Args[1]
+		for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
+			s := v_0_0
+			if s.Op != OpSelect0 {
+				continue
+			}
+			blsr := s.Args[0]
+			if blsr.Op != OpAMD64BLSRL || s != v_0_1 {
+				continue
+			}
+			v.reset(OpAMD64SETNE)
+			v0 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags)
+			v0.AddArg(blsr)
+			v.AddArg(v0)
+			return true
+		}
+		break
+	}
 	return false
 }
 func rewriteValueAMD64_OpAMD64SETNEstore(v *Value) bool {
@@ -27450,6 +24851,18 @@
 	}
 	return false
 }
+func rewriteValueAMD64_OpBswap16(v *Value) bool {
+	v_0 := v.Args[0]
+	// match: (Bswap16 x)
+	// result: (ROLWconst [8] x)
+	for {
+		x := v_0
+		v.reset(OpAMD64ROLWconst)
+		v.AuxInt = int8ToAuxInt(8)
+		v.AddArg(x)
+		return true
+	}
+}
 func rewriteValueAMD64_OpCeil(v *Value) bool {
 	v_0 := v.Args[0]
 	// match: (Ceil x)
@@ -29389,17 +26802,44 @@
 	return false
 }
 func rewriteValueAMD64_OpLocalAddr(v *Value) bool {
+	v_1 := v.Args[1]
 	v_0 := v.Args[0]
-	// match: (LocalAddr {sym} base _)
-	// result: (LEAQ {sym} base)
+	b := v.Block
+	typ := &b.Func.Config.Types
+	// match: (LocalAddr <t> {sym} base mem)
+	// cond: t.Elem().HasPointers()
+	// result: (LEAQ {sym} (SPanchored base mem))
 	for {
+		t := v.Type
 		sym := auxToSym(v.Aux)
 		base := v_0
+		mem := v_1
+		if !(t.Elem().HasPointers()) {
+			break
+		}
+		v.reset(OpAMD64LEAQ)
+		v.Aux = symToAux(sym)
+		v0 := b.NewValue0(v.Pos, OpSPanchored, typ.Uintptr)
+		v0.AddArg2(base, mem)
+		v.AddArg(v0)
+		return true
+	}
+	// match: (LocalAddr <t> {sym} base _)
+	// cond: !t.Elem().HasPointers()
+	// result: (LEAQ {sym} base)
+	for {
+		t := v.Type
+		sym := auxToSym(v.Aux)
+		base := v_0
+		if !(!t.Elem().HasPointers()) {
+			break
+		}
 		v.reset(OpAMD64LEAQ)
 		v.Aux = symToAux(sym)
 		v.AddArg(base)
 		return true
 	}
+	return false
 }
 func rewriteValueAMD64_OpLsh16x16(v *Value) bool {
 	v_1 := v.Args[1]
@@ -32678,14 +30118,14 @@
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
 	// match: (Store {t} ptr val mem)
-	// cond: t.Size() == 8 && is64BitFloat(val.Type)
+	// cond: t.Size() == 8 && t.IsFloat()
 	// result: (MOVSDstore ptr val mem)
 	for {
 		t := auxToType(v.Aux)
 		ptr := v_0
 		val := v_1
 		mem := v_2
-		if !(t.Size() == 8 && is64BitFloat(val.Type)) {
+		if !(t.Size() == 8 && t.IsFloat()) {
 			break
 		}
 		v.reset(OpAMD64MOVSDstore)
@@ -32693,14 +30133,14 @@
 		return true
 	}
 	// match: (Store {t} ptr val mem)
-	// cond: t.Size() == 4 && is32BitFloat(val.Type)
+	// cond: t.Size() == 4 && t.IsFloat()
 	// result: (MOVSSstore ptr val mem)
 	for {
 		t := auxToType(v.Aux)
 		ptr := v_0
 		val := v_1
 		mem := v_2
-		if !(t.Size() == 4 && is32BitFloat(val.Type)) {
+		if !(t.Size() == 4 && t.IsFloat()) {
 			break
 		}
 		v.reset(OpAMD64MOVSSstore)
@@ -32708,14 +30148,14 @@
 		return true
 	}
 	// match: (Store {t} ptr val mem)
-	// cond: t.Size() == 8
+	// cond: t.Size() == 8 && !t.IsFloat()
 	// result: (MOVQstore ptr val mem)
 	for {
 		t := auxToType(v.Aux)
 		ptr := v_0
 		val := v_1
 		mem := v_2
-		if !(t.Size() == 8) {
+		if !(t.Size() == 8 && !t.IsFloat()) {
 			break
 		}
 		v.reset(OpAMD64MOVQstore)
@@ -32723,14 +30163,14 @@
 		return true
 	}
 	// match: (Store {t} ptr val mem)
-	// cond: t.Size() == 4
+	// cond: t.Size() == 4 && !t.IsFloat()
 	// result: (MOVLstore ptr val mem)
 	for {
 		t := auxToType(v.Aux)
 		ptr := v_0
 		val := v_1
 		mem := v_2
-		if !(t.Size() == 4) {
+		if !(t.Size() == 4 && !t.IsFloat()) {
 			break
 		}
 		v.reset(OpAMD64MOVLstore)
@@ -33507,6 +30947,52 @@
 			b.swapSuccessors()
 			return true
 		}
+		// match: (EQ (TESTQ s:(Select0 blsr:(BLSRQ _)) s) yes no)
+		// result: (EQ (Select1 <types.TypeFlags> blsr) yes no)
+		for b.Controls[0].Op == OpAMD64TESTQ {
+			v_0 := b.Controls[0]
+			_ = v_0.Args[1]
+			v_0_0 := v_0.Args[0]
+			v_0_1 := v_0.Args[1]
+			for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
+				s := v_0_0
+				if s.Op != OpSelect0 {
+					continue
+				}
+				blsr := s.Args[0]
+				if blsr.Op != OpAMD64BLSRQ || s != v_0_1 {
+					continue
+				}
+				v0 := b.NewValue0(v_0.Pos, OpSelect1, types.TypeFlags)
+				v0.AddArg(blsr)
+				b.resetWithControl(BlockAMD64EQ, v0)
+				return true
+			}
+			break
+		}
+		// match: (EQ (TESTL s:(Select0 blsr:(BLSRL _)) s) yes no)
+		// result: (EQ (Select1 <types.TypeFlags> blsr) yes no)
+		for b.Controls[0].Op == OpAMD64TESTL {
+			v_0 := b.Controls[0]
+			_ = v_0.Args[1]
+			v_0_0 := v_0.Args[0]
+			v_0_1 := v_0.Args[1]
+			for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
+				s := v_0_0
+				if s.Op != OpSelect0 {
+					continue
+				}
+				blsr := s.Args[0]
+				if blsr.Op != OpAMD64BLSRL || s != v_0_1 {
+					continue
+				}
+				v0 := b.NewValue0(v_0.Pos, OpSelect1, types.TypeFlags)
+				v0.AddArg(blsr)
+				b.resetWithControl(BlockAMD64EQ, v0)
+				return true
+			}
+			break
+		}
 	case BlockAMD64GE:
 		// match: (GE (InvertFlags cmp) yes no)
 		// result: (LE cmp yes no)
@@ -34388,6 +31874,52 @@
 			b.Reset(BlockFirst)
 			return true
 		}
+		// match: (NE (TESTQ s:(Select0 blsr:(BLSRQ _)) s) yes no)
+		// result: (NE (Select1 <types.TypeFlags> blsr) yes no)
+		for b.Controls[0].Op == OpAMD64TESTQ {
+			v_0 := b.Controls[0]
+			_ = v_0.Args[1]
+			v_0_0 := v_0.Args[0]
+			v_0_1 := v_0.Args[1]
+			for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
+				s := v_0_0
+				if s.Op != OpSelect0 {
+					continue
+				}
+				blsr := s.Args[0]
+				if blsr.Op != OpAMD64BLSRQ || s != v_0_1 {
+					continue
+				}
+				v0 := b.NewValue0(v_0.Pos, OpSelect1, types.TypeFlags)
+				v0.AddArg(blsr)
+				b.resetWithControl(BlockAMD64NE, v0)
+				return true
+			}
+			break
+		}
+		// match: (NE (TESTL s:(Select0 blsr:(BLSRL _)) s) yes no)
+		// result: (NE (Select1 <types.TypeFlags> blsr) yes no)
+		for b.Controls[0].Op == OpAMD64TESTL {
+			v_0 := b.Controls[0]
+			_ = v_0.Args[1]
+			v_0_0 := v_0.Args[0]
+			v_0_1 := v_0.Args[1]
+			for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
+				s := v_0_0
+				if s.Op != OpSelect0 {
+					continue
+				}
+				blsr := s.Args[0]
+				if blsr.Op != OpAMD64BLSRL || s != v_0_1 {
+					continue
+				}
+				v0 := b.NewValue0(v_0.Pos, OpSelect1, types.TypeFlags)
+				v0.AddArg(blsr)
+				b.resetWithControl(BlockAMD64NE, v0)
+				return true
+			}
+			break
+		}
 	case BlockAMD64UGE:
 		// match: (UGE (TESTQ x x) yes no)
 		// result: (First yes no)
diff --git a/src/cmd/compile/internal/ssa/rewriteAMD64latelower.go b/src/cmd/compile/internal/ssa/rewriteAMD64latelower.go
index 792cddd..d3dd263 100644
--- a/src/cmd/compile/internal/ssa/rewriteAMD64latelower.go
+++ b/src/cmd/compile/internal/ssa/rewriteAMD64latelower.go
@@ -1,5 +1,4 @@
-// Code generated from _gen/AMD64latelower.rules; DO NOT EDIT.
-// generated with: cd _gen; go run .
+// Code generated from _gen/AMD64latelower.rules using 'go generate'; DO NOT EDIT.
 
 package ssa
 
@@ -7,30 +6,6 @@
 
 func rewriteValueAMD64latelower(v *Value) bool {
 	switch v.Op {
-	case OpAMD64LEAL1:
-		return rewriteValueAMD64latelower_OpAMD64LEAL1(v)
-	case OpAMD64LEAL2:
-		return rewriteValueAMD64latelower_OpAMD64LEAL2(v)
-	case OpAMD64LEAL4:
-		return rewriteValueAMD64latelower_OpAMD64LEAL4(v)
-	case OpAMD64LEAL8:
-		return rewriteValueAMD64latelower_OpAMD64LEAL8(v)
-	case OpAMD64LEAQ1:
-		return rewriteValueAMD64latelower_OpAMD64LEAQ1(v)
-	case OpAMD64LEAQ2:
-		return rewriteValueAMD64latelower_OpAMD64LEAQ2(v)
-	case OpAMD64LEAQ4:
-		return rewriteValueAMD64latelower_OpAMD64LEAQ4(v)
-	case OpAMD64LEAQ8:
-		return rewriteValueAMD64latelower_OpAMD64LEAQ8(v)
-	case OpAMD64LEAW1:
-		return rewriteValueAMD64latelower_OpAMD64LEAW1(v)
-	case OpAMD64LEAW2:
-		return rewriteValueAMD64latelower_OpAMD64LEAW2(v)
-	case OpAMD64LEAW4:
-		return rewriteValueAMD64latelower_OpAMD64LEAW4(v)
-	case OpAMD64LEAW8:
-		return rewriteValueAMD64latelower_OpAMD64LEAW8(v)
 	case OpAMD64SARL:
 		return rewriteValueAMD64latelower_OpAMD64SARL(v)
 	case OpAMD64SARQ:
@@ -46,375 +21,6 @@
 	}
 	return false
 }
-func rewriteValueAMD64latelower_OpAMD64LEAL1(v *Value) bool {
-	v_1 := v.Args[1]
-	v_0 := v.Args[0]
-	b := v.Block
-	// match: (LEAL1 <t> [c] {s} x y)
-	// cond: isPtr(x.Type) && c != 0 && s == nil
-	// result: (ADDL x (ADDLconst <y.Type> [c] y))
-	for {
-		c := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			x := v_0
-			y := v_1
-			if !(isPtr(x.Type) && c != 0 && s == nil) {
-				continue
-			}
-			v.reset(OpAMD64ADDL)
-			v0 := b.NewValue0(v.Pos, OpAMD64ADDLconst, y.Type)
-			v0.AuxInt = int32ToAuxInt(c)
-			v0.AddArg(y)
-			v.AddArg2(x, v0)
-			return true
-		}
-		break
-	}
-	// match: (LEAL1 <t> [c] {s} x y)
-	// cond: !isPtr(x.Type) && c != 0 && s == nil
-	// result: (ADDL y (ADDLconst <x.Type> [c] x))
-	for {
-		c := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			x := v_0
-			y := v_1
-			if !(!isPtr(x.Type) && c != 0 && s == nil) {
-				continue
-			}
-			v.reset(OpAMD64ADDL)
-			v0 := b.NewValue0(v.Pos, OpAMD64ADDLconst, x.Type)
-			v0.AuxInt = int32ToAuxInt(c)
-			v0.AddArg(x)
-			v.AddArg2(y, v0)
-			return true
-		}
-		break
-	}
-	return false
-}
-func rewriteValueAMD64latelower_OpAMD64LEAL2(v *Value) bool {
-	v_1 := v.Args[1]
-	v_0 := v.Args[0]
-	b := v.Block
-	// match: (LEAL2 <t> [c] {s} x y)
-	// cond: !isPtr(t) && c != 0 && s == nil
-	// result: (ADDLconst [c] (LEAL2 <x.Type> x y))
-	for {
-		t := v.Type
-		c := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		x := v_0
-		y := v_1
-		if !(!isPtr(t) && c != 0 && s == nil) {
-			break
-		}
-		v.reset(OpAMD64ADDLconst)
-		v.AuxInt = int32ToAuxInt(c)
-		v0 := b.NewValue0(v.Pos, OpAMD64LEAL2, x.Type)
-		v0.AddArg2(x, y)
-		v.AddArg(v0)
-		return true
-	}
-	return false
-}
-func rewriteValueAMD64latelower_OpAMD64LEAL4(v *Value) bool {
-	v_1 := v.Args[1]
-	v_0 := v.Args[0]
-	b := v.Block
-	// match: (LEAL4 <t> [c] {s} x y)
-	// cond: !isPtr(t) && c != 0 && s == nil
-	// result: (ADDLconst [c] (LEAL4 <x.Type> x y))
-	for {
-		t := v.Type
-		c := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		x := v_0
-		y := v_1
-		if !(!isPtr(t) && c != 0 && s == nil) {
-			break
-		}
-		v.reset(OpAMD64ADDLconst)
-		v.AuxInt = int32ToAuxInt(c)
-		v0 := b.NewValue0(v.Pos, OpAMD64LEAL4, x.Type)
-		v0.AddArg2(x, y)
-		v.AddArg(v0)
-		return true
-	}
-	return false
-}
-func rewriteValueAMD64latelower_OpAMD64LEAL8(v *Value) bool {
-	v_1 := v.Args[1]
-	v_0 := v.Args[0]
-	b := v.Block
-	// match: (LEAL8 <t> [c] {s} x y)
-	// cond: !isPtr(t) && c != 0 && s == nil
-	// result: (ADDLconst [c] (LEAL8 <x.Type> x y))
-	for {
-		t := v.Type
-		c := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		x := v_0
-		y := v_1
-		if !(!isPtr(t) && c != 0 && s == nil) {
-			break
-		}
-		v.reset(OpAMD64ADDLconst)
-		v.AuxInt = int32ToAuxInt(c)
-		v0 := b.NewValue0(v.Pos, OpAMD64LEAL8, x.Type)
-		v0.AddArg2(x, y)
-		v.AddArg(v0)
-		return true
-	}
-	return false
-}
-func rewriteValueAMD64latelower_OpAMD64LEAQ1(v *Value) bool {
-	v_1 := v.Args[1]
-	v_0 := v.Args[0]
-	b := v.Block
-	// match: (LEAQ1 <t> [c] {s} x y)
-	// cond: isPtr(x.Type) && c != 0 && s == nil
-	// result: (ADDQ x (ADDQconst <y.Type> [c] y))
-	for {
-		c := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			x := v_0
-			y := v_1
-			if !(isPtr(x.Type) && c != 0 && s == nil) {
-				continue
-			}
-			v.reset(OpAMD64ADDQ)
-			v0 := b.NewValue0(v.Pos, OpAMD64ADDQconst, y.Type)
-			v0.AuxInt = int32ToAuxInt(c)
-			v0.AddArg(y)
-			v.AddArg2(x, v0)
-			return true
-		}
-		break
-	}
-	// match: (LEAQ1 <t> [c] {s} x y)
-	// cond: !isPtr(x.Type) && c != 0 && s == nil
-	// result: (ADDQ y (ADDQconst <x.Type> [c] x))
-	for {
-		c := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			x := v_0
-			y := v_1
-			if !(!isPtr(x.Type) && c != 0 && s == nil) {
-				continue
-			}
-			v.reset(OpAMD64ADDQ)
-			v0 := b.NewValue0(v.Pos, OpAMD64ADDQconst, x.Type)
-			v0.AuxInt = int32ToAuxInt(c)
-			v0.AddArg(x)
-			v.AddArg2(y, v0)
-			return true
-		}
-		break
-	}
-	return false
-}
-func rewriteValueAMD64latelower_OpAMD64LEAQ2(v *Value) bool {
-	v_1 := v.Args[1]
-	v_0 := v.Args[0]
-	b := v.Block
-	// match: (LEAQ2 <t> [c] {s} x y)
-	// cond: !isPtr(t) && c != 0 && s == nil
-	// result: (ADDQconst [c] (LEAQ2 <x.Type> x y))
-	for {
-		t := v.Type
-		c := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		x := v_0
-		y := v_1
-		if !(!isPtr(t) && c != 0 && s == nil) {
-			break
-		}
-		v.reset(OpAMD64ADDQconst)
-		v.AuxInt = int32ToAuxInt(c)
-		v0 := b.NewValue0(v.Pos, OpAMD64LEAQ2, x.Type)
-		v0.AddArg2(x, y)
-		v.AddArg(v0)
-		return true
-	}
-	return false
-}
-func rewriteValueAMD64latelower_OpAMD64LEAQ4(v *Value) bool {
-	v_1 := v.Args[1]
-	v_0 := v.Args[0]
-	b := v.Block
-	// match: (LEAQ4 <t> [c] {s} x y)
-	// cond: !isPtr(t) && c != 0 && s == nil
-	// result: (ADDQconst [c] (LEAQ4 <x.Type> x y))
-	for {
-		t := v.Type
-		c := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		x := v_0
-		y := v_1
-		if !(!isPtr(t) && c != 0 && s == nil) {
-			break
-		}
-		v.reset(OpAMD64ADDQconst)
-		v.AuxInt = int32ToAuxInt(c)
-		v0 := b.NewValue0(v.Pos, OpAMD64LEAQ4, x.Type)
-		v0.AddArg2(x, y)
-		v.AddArg(v0)
-		return true
-	}
-	return false
-}
-func rewriteValueAMD64latelower_OpAMD64LEAQ8(v *Value) bool {
-	v_1 := v.Args[1]
-	v_0 := v.Args[0]
-	b := v.Block
-	// match: (LEAQ8 <t> [c] {s} x y)
-	// cond: !isPtr(t) && c != 0 && s == nil
-	// result: (ADDQconst [c] (LEAQ8 <x.Type> x y))
-	for {
-		t := v.Type
-		c := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		x := v_0
-		y := v_1
-		if !(!isPtr(t) && c != 0 && s == nil) {
-			break
-		}
-		v.reset(OpAMD64ADDQconst)
-		v.AuxInt = int32ToAuxInt(c)
-		v0 := b.NewValue0(v.Pos, OpAMD64LEAQ8, x.Type)
-		v0.AddArg2(x, y)
-		v.AddArg(v0)
-		return true
-	}
-	return false
-}
-func rewriteValueAMD64latelower_OpAMD64LEAW1(v *Value) bool {
-	v_1 := v.Args[1]
-	v_0 := v.Args[0]
-	b := v.Block
-	// match: (LEAW1 <t> [c] {s} x y)
-	// cond: isPtr(x.Type) && c != 0 && s == nil
-	// result: (ADDL x (ADDLconst <y.Type> [c] y))
-	for {
-		c := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			x := v_0
-			y := v_1
-			if !(isPtr(x.Type) && c != 0 && s == nil) {
-				continue
-			}
-			v.reset(OpAMD64ADDL)
-			v0 := b.NewValue0(v.Pos, OpAMD64ADDLconst, y.Type)
-			v0.AuxInt = int32ToAuxInt(c)
-			v0.AddArg(y)
-			v.AddArg2(x, v0)
-			return true
-		}
-		break
-	}
-	// match: (LEAW1 <t> [c] {s} x y)
-	// cond: !isPtr(x.Type) && c != 0 && s == nil
-	// result: (ADDL y (ADDLconst <x.Type> [c] x))
-	for {
-		c := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			x := v_0
-			y := v_1
-			if !(!isPtr(x.Type) && c != 0 && s == nil) {
-				continue
-			}
-			v.reset(OpAMD64ADDL)
-			v0 := b.NewValue0(v.Pos, OpAMD64ADDLconst, x.Type)
-			v0.AuxInt = int32ToAuxInt(c)
-			v0.AddArg(x)
-			v.AddArg2(y, v0)
-			return true
-		}
-		break
-	}
-	return false
-}
-func rewriteValueAMD64latelower_OpAMD64LEAW2(v *Value) bool {
-	v_1 := v.Args[1]
-	v_0 := v.Args[0]
-	b := v.Block
-	// match: (LEAW2 <t> [c] {s} x y)
-	// cond: !isPtr(t) && c != 0 && s == nil
-	// result: (ADDLconst [c] (LEAW2 <x.Type> x y))
-	for {
-		t := v.Type
-		c := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		x := v_0
-		y := v_1
-		if !(!isPtr(t) && c != 0 && s == nil) {
-			break
-		}
-		v.reset(OpAMD64ADDLconst)
-		v.AuxInt = int32ToAuxInt(c)
-		v0 := b.NewValue0(v.Pos, OpAMD64LEAW2, x.Type)
-		v0.AddArg2(x, y)
-		v.AddArg(v0)
-		return true
-	}
-	return false
-}
-func rewriteValueAMD64latelower_OpAMD64LEAW4(v *Value) bool {
-	v_1 := v.Args[1]
-	v_0 := v.Args[0]
-	b := v.Block
-	// match: (LEAW4 <t> [c] {s} x y)
-	// cond: !isPtr(t) && c != 0 && s == nil
-	// result: (ADDLconst [c] (LEAW4 <x.Type> x y))
-	for {
-		t := v.Type
-		c := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		x := v_0
-		y := v_1
-		if !(!isPtr(t) && c != 0 && s == nil) {
-			break
-		}
-		v.reset(OpAMD64ADDLconst)
-		v.AuxInt = int32ToAuxInt(c)
-		v0 := b.NewValue0(v.Pos, OpAMD64LEAW4, x.Type)
-		v0.AddArg2(x, y)
-		v.AddArg(v0)
-		return true
-	}
-	return false
-}
-func rewriteValueAMD64latelower_OpAMD64LEAW8(v *Value) bool {
-	v_1 := v.Args[1]
-	v_0 := v.Args[0]
-	b := v.Block
-	// match: (LEAW8 <t> [c] {s} x y)
-	// cond: !isPtr(t) && c != 0 && s == nil
-	// result: (ADDLconst [c] (LEAW8 <x.Type> x y))
-	for {
-		t := v.Type
-		c := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		x := v_0
-		y := v_1
-		if !(!isPtr(t) && c != 0 && s == nil) {
-			break
-		}
-		v.reset(OpAMD64ADDLconst)
-		v.AuxInt = int32ToAuxInt(c)
-		v0 := b.NewValue0(v.Pos, OpAMD64LEAW8, x.Type)
-		v0.AddArg2(x, y)
-		v.AddArg(v0)
-		return true
-	}
-	return false
-}
 func rewriteValueAMD64latelower_OpAMD64SARL(v *Value) bool {
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
diff --git a/src/cmd/compile/internal/ssa/rewriteAMD64splitload.go b/src/cmd/compile/internal/ssa/rewriteAMD64splitload.go
index b443f16..0dcb1b4 100644
--- a/src/cmd/compile/internal/ssa/rewriteAMD64splitload.go
+++ b/src/cmd/compile/internal/ssa/rewriteAMD64splitload.go
@@ -1,5 +1,4 @@
-// Code generated from _gen/AMD64splitload.rules; DO NOT EDIT.
-// generated with: cd _gen; go run .
+// Code generated from _gen/AMD64splitload.rules using 'go generate'; DO NOT EDIT.
 
 package ssa
 
diff --git a/src/cmd/compile/internal/ssa/rewriteARM.go b/src/cmd/compile/internal/ssa/rewriteARM.go
index 8fa2a6a..70cacb9 100644
--- a/src/cmd/compile/internal/ssa/rewriteARM.go
+++ b/src/cmd/compile/internal/ssa/rewriteARM.go
@@ -1,5 +1,4 @@
-// Code generated from _gen/ARM.rules; DO NOT EDIT.
-// generated with: cd _gen; go run .
+// Code generated from _gen/ARM.rules using 'go generate'; DO NOT EDIT.
 
 package ssa
 
@@ -1316,7 +1315,8 @@
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
 	b := v.Block
-	// match: (ADD x (MOVWconst [c]))
+	// match: (ADD x (MOVWconst <t> [c]))
+	// cond: !t.IsPtr()
 	// result: (ADDconst [c] x)
 	for {
 		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
@@ -1324,7 +1324,11 @@
 			if v_1.Op != OpARMMOVWconst {
 				continue
 			}
+			t := v_1.Type
 			c := auxIntToInt32(v_1.AuxInt)
+			if !(!t.IsPtr()) {
+				continue
+			}
 			v.reset(OpARMADDconst)
 			v.AuxInt = int32ToAuxInt(c)
 			v.AddArg(x)
@@ -13948,13 +13952,13 @@
 		return true
 	}
 	// match: (Load <t> ptr mem)
-	// cond: (is8BitInt(t) && isSigned(t))
+	// cond: (is8BitInt(t) && t.IsSigned())
 	// result: (MOVBload ptr mem)
 	for {
 		t := v.Type
 		ptr := v_0
 		mem := v_1
-		if !(is8BitInt(t) && isSigned(t)) {
+		if !(is8BitInt(t) && t.IsSigned()) {
 			break
 		}
 		v.reset(OpARMMOVBload)
@@ -13962,13 +13966,13 @@
 		return true
 	}
 	// match: (Load <t> ptr mem)
-	// cond: (is8BitInt(t) && !isSigned(t))
+	// cond: (is8BitInt(t) && !t.IsSigned())
 	// result: (MOVBUload ptr mem)
 	for {
 		t := v.Type
 		ptr := v_0
 		mem := v_1
-		if !(is8BitInt(t) && !isSigned(t)) {
+		if !(is8BitInt(t) && !t.IsSigned()) {
 			break
 		}
 		v.reset(OpARMMOVBUload)
@@ -13976,13 +13980,13 @@
 		return true
 	}
 	// match: (Load <t> ptr mem)
-	// cond: (is16BitInt(t) && isSigned(t))
+	// cond: (is16BitInt(t) && t.IsSigned())
 	// result: (MOVHload ptr mem)
 	for {
 		t := v.Type
 		ptr := v_0
 		mem := v_1
-		if !(is16BitInt(t) && isSigned(t)) {
+		if !(is16BitInt(t) && t.IsSigned()) {
 			break
 		}
 		v.reset(OpARMMOVHload)
@@ -13990,13 +13994,13 @@
 		return true
 	}
 	// match: (Load <t> ptr mem)
-	// cond: (is16BitInt(t) && !isSigned(t))
+	// cond: (is16BitInt(t) && !t.IsSigned())
 	// result: (MOVHUload ptr mem)
 	for {
 		t := v.Type
 		ptr := v_0
 		mem := v_1
-		if !(is16BitInt(t) && !isSigned(t)) {
+		if !(is16BitInt(t) && !t.IsSigned()) {
 			break
 		}
 		v.reset(OpARMMOVHUload)
@@ -14048,17 +14052,44 @@
 	return false
 }
 func rewriteValueARM_OpLocalAddr(v *Value) bool {
+	v_1 := v.Args[1]
 	v_0 := v.Args[0]
-	// match: (LocalAddr {sym} base _)
-	// result: (MOVWaddr {sym} base)
+	b := v.Block
+	typ := &b.Func.Config.Types
+	// match: (LocalAddr <t> {sym} base mem)
+	// cond: t.Elem().HasPointers()
+	// result: (MOVWaddr {sym} (SPanchored base mem))
 	for {
+		t := v.Type
 		sym := auxToSym(v.Aux)
 		base := v_0
+		mem := v_1
+		if !(t.Elem().HasPointers()) {
+			break
+		}
+		v.reset(OpARMMOVWaddr)
+		v.Aux = symToAux(sym)
+		v0 := b.NewValue0(v.Pos, OpSPanchored, typ.Uintptr)
+		v0.AddArg2(base, mem)
+		v.AddArg(v0)
+		return true
+	}
+	// match: (LocalAddr <t> {sym} base _)
+	// cond: !t.Elem().HasPointers()
+	// result: (MOVWaddr {sym} base)
+	for {
+		t := v.Type
+		sym := auxToSym(v.Aux)
+		base := v_0
+		if !(!t.Elem().HasPointers()) {
+			break
+		}
 		v.reset(OpARMMOVWaddr)
 		v.Aux = symToAux(sym)
 		v.AddArg(base)
 		return true
 	}
+	return false
 }
 func rewriteValueARM_OpLsh16x16(v *Value) bool {
 	v_1 := v.Args[1]
@@ -15881,14 +15912,14 @@
 		return true
 	}
 	// match: (Store {t} ptr val mem)
-	// cond: t.Size() == 4 && !is32BitFloat(val.Type)
+	// cond: t.Size() == 4 && !t.IsFloat()
 	// result: (MOVWstore ptr val mem)
 	for {
 		t := auxToType(v.Aux)
 		ptr := v_0
 		val := v_1
 		mem := v_2
-		if !(t.Size() == 4 && !is32BitFloat(val.Type)) {
+		if !(t.Size() == 4 && !t.IsFloat()) {
 			break
 		}
 		v.reset(OpARMMOVWstore)
@@ -15896,14 +15927,14 @@
 		return true
 	}
 	// match: (Store {t} ptr val mem)
-	// cond: t.Size() == 4 && is32BitFloat(val.Type)
+	// cond: t.Size() == 4 && t.IsFloat()
 	// result: (MOVFstore ptr val mem)
 	for {
 		t := auxToType(v.Aux)
 		ptr := v_0
 		val := v_1
 		mem := v_2
-		if !(t.Size() == 4 && is32BitFloat(val.Type)) {
+		if !(t.Size() == 4 && t.IsFloat()) {
 			break
 		}
 		v.reset(OpARMMOVFstore)
@@ -15911,14 +15942,14 @@
 		return true
 	}
 	// match: (Store {t} ptr val mem)
-	// cond: t.Size() == 8 && is64BitFloat(val.Type)
+	// cond: t.Size() == 8 && t.IsFloat()
 	// result: (MOVDstore ptr val mem)
 	for {
 		t := auxToType(v.Aux)
 		ptr := v_0
 		val := v_1
 		mem := v_2
-		if !(t.Size() == 8 && is64BitFloat(val.Type)) {
+		if !(t.Size() == 8 && t.IsFloat()) {
 			break
 		}
 		v.reset(OpARMMOVDstore)
diff --git a/src/cmd/compile/internal/ssa/rewriteARM64.go b/src/cmd/compile/internal/ssa/rewriteARM64.go
index e82a49c..3b8fe30 100644
--- a/src/cmd/compile/internal/ssa/rewriteARM64.go
+++ b/src/cmd/compile/internal/ssa/rewriteARM64.go
@@ -1,5 +1,4 @@
-// Code generated from _gen/ARM64.rules; DO NOT EDIT.
-// generated with: cd _gen; go run .
+// Code generated from _gen/ARM64.rules using 'go generate'; DO NOT EDIT.
 
 package ssa
 
@@ -155,6 +154,8 @@
 		return rewriteValueARM64_OpARM64GreaterEqual(v)
 	case OpARM64GreaterEqualF:
 		return rewriteValueARM64_OpARM64GreaterEqualF(v)
+	case OpARM64GreaterEqualNoov:
+		return rewriteValueARM64_OpARM64GreaterEqualNoov(v)
 	case OpARM64GreaterEqualU:
 		return rewriteValueARM64_OpARM64GreaterEqualU(v)
 	case OpARM64GreaterThan:
@@ -175,6 +176,8 @@
 		return rewriteValueARM64_OpARM64LessThan(v)
 	case OpARM64LessThanF:
 		return rewriteValueARM64_OpARM64LessThanF(v)
+	case OpARM64LessThanNoov:
+		return rewriteValueARM64_OpARM64LessThanNoov(v)
 	case OpARM64LessThanU:
 		return rewriteValueARM64_OpARM64LessThanU(v)
 	case OpARM64MADD:
@@ -546,6 +549,9 @@
 		return true
 	case OpBitRev8:
 		return rewriteValueARM64_OpBitRev8(v)
+	case OpBswap16:
+		v.Op = OpARM64REV16W
+		return true
 	case OpBswap32:
 		v.Op = OpARM64REVW
 		return true
@@ -1179,7 +1185,8 @@
 func rewriteValueARM64_OpARM64ADD(v *Value) bool {
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
-	// match: (ADD x (MOVDconst [c]))
+	// match: (ADD x (MOVDconst <t> [c]))
+	// cond: !t.IsPtr()
 	// result: (ADDconst [c] x)
 	for {
 		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
@@ -1187,7 +1194,11 @@
 			if v_1.Op != OpARM64MOVDconst {
 				continue
 			}
+			t := v_1.Type
 			c := auxIntToInt64(v_1.AuxInt)
+			if !(!t.IsPtr()) {
+				continue
+			}
 			v.reset(OpARM64ADDconst)
 			v.AuxInt = int64ToAuxInt(c)
 			v.AddArg(x)
@@ -4215,7 +4226,7 @@
 		return true
 	}
 	// match: (Equal (CMPconst [0] z:(MADD a x y)))
-	// cond: z.Uses==1
+	// cond: z.Uses == 1
 	// result: (Equal (CMN a (MUL <x.Type> x y)))
 	for {
 		if v_0.Op != OpARM64CMPconst || auxIntToInt64(v_0.AuxInt) != 0 {
@@ -4240,7 +4251,7 @@
 		return true
 	}
 	// match: (Equal (CMPconst [0] z:(MSUB a x y)))
-	// cond: z.Uses==1
+	// cond: z.Uses == 1
 	// result: (Equal (CMP a (MUL <x.Type> x y)))
 	for {
 		if v_0.Op != OpARM64CMPconst || auxIntToInt64(v_0.AuxInt) != 0 {
@@ -4265,7 +4276,7 @@
 		return true
 	}
 	// match: (Equal (CMPWconst [0] z:(MADDW a x y)))
-	// cond: z.Uses==1
+	// cond: z.Uses == 1
 	// result: (Equal (CMNW a (MULW <x.Type> x y)))
 	for {
 		if v_0.Op != OpARM64CMPWconst || auxIntToInt32(v_0.AuxInt) != 0 {
@@ -4290,7 +4301,7 @@
 		return true
 	}
 	// match: (Equal (CMPWconst [0] z:(MSUBW a x y)))
-	// cond: z.Uses==1
+	// cond: z.Uses == 1
 	// result: (Equal (CMPW a (MULW <x.Type> x y)))
 	for {
 		if v_0.Op != OpARM64CMPWconst || auxIntToInt32(v_0.AuxInt) != 0 {
@@ -4533,6 +4544,8 @@
 func rewriteValueARM64_OpARM64FMOVDload(v *Value) bool {
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
+	b := v.Block
+	config := b.Func.Config
 	// match: (FMOVDload [off] {sym} ptr (MOVDstore [off] {sym} ptr val _))
 	// result: (FMOVDgpfp val)
 	for {
@@ -4551,7 +4564,7 @@
 		return true
 	}
 	// match: (FMOVDload [off1] {sym} (ADDconst [off2] ptr) mem)
-	// cond: is32Bit(int64(off1)+off2)
+	// cond: is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
 	// result: (FMOVDload [off1+int32(off2)] {sym} ptr mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -4562,7 +4575,7 @@
 		off2 := auxIntToInt64(v_0.AuxInt)
 		ptr := v_0.Args[0]
 		mem := v_1
-		if !(is32Bit(int64(off1) + off2)) {
+		if !(is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
 			break
 		}
 		v.reset(OpARM64FMOVDload)
@@ -4610,7 +4623,7 @@
 		return true
 	}
 	// match: (FMOVDload [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem)
-	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
 	// result: (FMOVDload [off1+off2] {mergeSym(sym1,sym2)} ptr mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -4622,7 +4635,7 @@
 		sym2 := auxToSym(v_0.Aux)
 		ptr := v_0.Args[0]
 		mem := v_1
-		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) {
+		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
 			break
 		}
 		v.reset(OpARM64FMOVDload)
@@ -4729,6 +4742,8 @@
 	v_2 := v.Args[2]
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
+	b := v.Block
+	config := b.Func.Config
 	// match: (FMOVDstore [off] {sym} ptr (FMOVDgpfp val) mem)
 	// result: (MOVDstore [off] {sym} ptr val mem)
 	for {
@@ -4747,7 +4762,7 @@
 		return true
 	}
 	// match: (FMOVDstore [off1] {sym} (ADDconst [off2] ptr) val mem)
-	// cond: is32Bit(int64(off1)+off2)
+	// cond: is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
 	// result: (FMOVDstore [off1+int32(off2)] {sym} ptr val mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -4759,7 +4774,7 @@
 		ptr := v_0.Args[0]
 		val := v_1
 		mem := v_2
-		if !(is32Bit(int64(off1) + off2)) {
+		if !(is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
 			break
 		}
 		v.reset(OpARM64FMOVDstore)
@@ -4809,7 +4824,7 @@
 		return true
 	}
 	// match: (FMOVDstore [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) val mem)
-	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
 	// result: (FMOVDstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -4822,7 +4837,7 @@
 		ptr := v_0.Args[0]
 		val := v_1
 		mem := v_2
-		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) {
+		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
 			break
 		}
 		v.reset(OpARM64FMOVDstore)
@@ -4935,6 +4950,8 @@
 func rewriteValueARM64_OpARM64FMOVSload(v *Value) bool {
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
+	b := v.Block
+	config := b.Func.Config
 	// match: (FMOVSload [off] {sym} ptr (MOVWstore [off] {sym} ptr val _))
 	// result: (FMOVSgpfp val)
 	for {
@@ -4953,7 +4970,7 @@
 		return true
 	}
 	// match: (FMOVSload [off1] {sym} (ADDconst [off2] ptr) mem)
-	// cond: is32Bit(int64(off1)+off2)
+	// cond: is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
 	// result: (FMOVSload [off1+int32(off2)] {sym} ptr mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -4964,7 +4981,7 @@
 		off2 := auxIntToInt64(v_0.AuxInt)
 		ptr := v_0.Args[0]
 		mem := v_1
-		if !(is32Bit(int64(off1) + off2)) {
+		if !(is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
 			break
 		}
 		v.reset(OpARM64FMOVSload)
@@ -5012,7 +5029,7 @@
 		return true
 	}
 	// match: (FMOVSload [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem)
-	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
 	// result: (FMOVSload [off1+off2] {mergeSym(sym1,sym2)} ptr mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -5024,7 +5041,7 @@
 		sym2 := auxToSym(v_0.Aux)
 		ptr := v_0.Args[0]
 		mem := v_1
-		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) {
+		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
 			break
 		}
 		v.reset(OpARM64FMOVSload)
@@ -5131,6 +5148,8 @@
 	v_2 := v.Args[2]
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
+	b := v.Block
+	config := b.Func.Config
 	// match: (FMOVSstore [off] {sym} ptr (FMOVSgpfp val) mem)
 	// result: (MOVWstore [off] {sym} ptr val mem)
 	for {
@@ -5149,7 +5168,7 @@
 		return true
 	}
 	// match: (FMOVSstore [off1] {sym} (ADDconst [off2] ptr) val mem)
-	// cond: is32Bit(int64(off1)+off2)
+	// cond: is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
 	// result: (FMOVSstore [off1+int32(off2)] {sym} ptr val mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -5161,7 +5180,7 @@
 		ptr := v_0.Args[0]
 		val := v_1
 		mem := v_2
-		if !(is32Bit(int64(off1) + off2)) {
+		if !(is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
 			break
 		}
 		v.reset(OpARM64FMOVSstore)
@@ -5211,7 +5230,7 @@
 		return true
 	}
 	// match: (FMOVSstore [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) val mem)
-	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
 	// result: (FMOVSstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -5224,7 +5243,7 @@
 		ptr := v_0.Args[0]
 		val := v_1
 		mem := v_2
-		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) {
+		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
 			break
 		}
 		v.reset(OpARM64FMOVSstore)
@@ -5686,11 +5705,11 @@
 		v.AddArg(v0)
 		return true
 	}
-	// match: (GreaterEqual (CMPWconst [0] x:(ANDconst [c] y)))
+	// match: (GreaterEqual (CMPconst [0] x:(ANDconst [c] y)))
 	// cond: x.Uses == 1
 	// result: (GreaterEqual (TSTconst [c] y))
 	for {
-		if v_0.Op != OpARM64CMPWconst || auxIntToInt32(v_0.AuxInt) != 0 {
+		if v_0.Op != OpARM64CMPconst || auxIntToInt64(v_0.AuxInt) != 0 {
 			break
 		}
 		x := v_0.Args[0]
@@ -5709,6 +5728,196 @@
 		v.AddArg(v0)
 		return true
 	}
+	// match: (GreaterEqual (CMPconst [0] x:(ADDconst [c] y)))
+	// cond: x.Uses == 1
+	// result: (GreaterEqualNoov (CMNconst [c] y))
+	for {
+		if v_0.Op != OpARM64CMPconst || auxIntToInt64(v_0.AuxInt) != 0 {
+			break
+		}
+		x := v_0.Args[0]
+		if x.Op != OpARM64ADDconst {
+			break
+		}
+		c := auxIntToInt64(x.AuxInt)
+		y := x.Args[0]
+		if !(x.Uses == 1) {
+			break
+		}
+		v.reset(OpARM64GreaterEqualNoov)
+		v0 := b.NewValue0(v.Pos, OpARM64CMNconst, types.TypeFlags)
+		v0.AuxInt = int64ToAuxInt(c)
+		v0.AddArg(y)
+		v.AddArg(v0)
+		return true
+	}
+	// match: (GreaterEqual (CMPWconst [0] x:(ADDconst [c] y)))
+	// cond: x.Uses == 1
+	// result: (GreaterEqualNoov (CMNWconst [int32(c)] y))
+	for {
+		if v_0.Op != OpARM64CMPWconst || auxIntToInt32(v_0.AuxInt) != 0 {
+			break
+		}
+		x := v_0.Args[0]
+		if x.Op != OpARM64ADDconst {
+			break
+		}
+		c := auxIntToInt64(x.AuxInt)
+		y := x.Args[0]
+		if !(x.Uses == 1) {
+			break
+		}
+		v.reset(OpARM64GreaterEqualNoov)
+		v0 := b.NewValue0(v.Pos, OpARM64CMNWconst, types.TypeFlags)
+		v0.AuxInt = int32ToAuxInt(int32(c))
+		v0.AddArg(y)
+		v.AddArg(v0)
+		return true
+	}
+	// match: (GreaterEqual (CMPconst [0] z:(ADD x y)))
+	// cond: z.Uses == 1
+	// result: (GreaterEqualNoov (CMN x y))
+	for {
+		if v_0.Op != OpARM64CMPconst || auxIntToInt64(v_0.AuxInt) != 0 {
+			break
+		}
+		z := v_0.Args[0]
+		if z.Op != OpARM64ADD {
+			break
+		}
+		y := z.Args[1]
+		x := z.Args[0]
+		if !(z.Uses == 1) {
+			break
+		}
+		v.reset(OpARM64GreaterEqualNoov)
+		v0 := b.NewValue0(v.Pos, OpARM64CMN, types.TypeFlags)
+		v0.AddArg2(x, y)
+		v.AddArg(v0)
+		return true
+	}
+	// match: (GreaterEqual (CMPWconst [0] z:(ADD x y)))
+	// cond: z.Uses == 1
+	// result: (GreaterEqualNoov (CMNW x y))
+	for {
+		if v_0.Op != OpARM64CMPWconst || auxIntToInt32(v_0.AuxInt) != 0 {
+			break
+		}
+		z := v_0.Args[0]
+		if z.Op != OpARM64ADD {
+			break
+		}
+		y := z.Args[1]
+		x := z.Args[0]
+		if !(z.Uses == 1) {
+			break
+		}
+		v.reset(OpARM64GreaterEqualNoov)
+		v0 := b.NewValue0(v.Pos, OpARM64CMNW, types.TypeFlags)
+		v0.AddArg2(x, y)
+		v.AddArg(v0)
+		return true
+	}
+	// match: (GreaterEqual (CMPconst [0] z:(MADD a x y)))
+	// cond: z.Uses == 1
+	// result: (GreaterEqualNoov (CMN a (MUL <x.Type> x y)))
+	for {
+		if v_0.Op != OpARM64CMPconst || auxIntToInt64(v_0.AuxInt) != 0 {
+			break
+		}
+		z := v_0.Args[0]
+		if z.Op != OpARM64MADD {
+			break
+		}
+		y := z.Args[2]
+		a := z.Args[0]
+		x := z.Args[1]
+		if !(z.Uses == 1) {
+			break
+		}
+		v.reset(OpARM64GreaterEqualNoov)
+		v0 := b.NewValue0(v.Pos, OpARM64CMN, types.TypeFlags)
+		v1 := b.NewValue0(v.Pos, OpARM64MUL, x.Type)
+		v1.AddArg2(x, y)
+		v0.AddArg2(a, v1)
+		v.AddArg(v0)
+		return true
+	}
+	// match: (GreaterEqual (CMPconst [0] z:(MSUB a x y)))
+	// cond: z.Uses == 1
+	// result: (GreaterEqualNoov (CMP a (MUL <x.Type> x y)))
+	for {
+		if v_0.Op != OpARM64CMPconst || auxIntToInt64(v_0.AuxInt) != 0 {
+			break
+		}
+		z := v_0.Args[0]
+		if z.Op != OpARM64MSUB {
+			break
+		}
+		y := z.Args[2]
+		a := z.Args[0]
+		x := z.Args[1]
+		if !(z.Uses == 1) {
+			break
+		}
+		v.reset(OpARM64GreaterEqualNoov)
+		v0 := b.NewValue0(v.Pos, OpARM64CMP, types.TypeFlags)
+		v1 := b.NewValue0(v.Pos, OpARM64MUL, x.Type)
+		v1.AddArg2(x, y)
+		v0.AddArg2(a, v1)
+		v.AddArg(v0)
+		return true
+	}
+	// match: (GreaterEqual (CMPWconst [0] z:(MADDW a x y)))
+	// cond: z.Uses == 1
+	// result: (GreaterEqualNoov (CMNW a (MULW <x.Type> x y)))
+	for {
+		if v_0.Op != OpARM64CMPWconst || auxIntToInt32(v_0.AuxInt) != 0 {
+			break
+		}
+		z := v_0.Args[0]
+		if z.Op != OpARM64MADDW {
+			break
+		}
+		y := z.Args[2]
+		a := z.Args[0]
+		x := z.Args[1]
+		if !(z.Uses == 1) {
+			break
+		}
+		v.reset(OpARM64GreaterEqualNoov)
+		v0 := b.NewValue0(v.Pos, OpARM64CMNW, types.TypeFlags)
+		v1 := b.NewValue0(v.Pos, OpARM64MULW, x.Type)
+		v1.AddArg2(x, y)
+		v0.AddArg2(a, v1)
+		v.AddArg(v0)
+		return true
+	}
+	// match: (GreaterEqual (CMPWconst [0] z:(MSUBW a x y)))
+	// cond: z.Uses == 1
+	// result: (GreaterEqualNoov (CMPW a (MULW <x.Type> x y)))
+	for {
+		if v_0.Op != OpARM64CMPWconst || auxIntToInt32(v_0.AuxInt) != 0 {
+			break
+		}
+		z := v_0.Args[0]
+		if z.Op != OpARM64MSUBW {
+			break
+		}
+		y := z.Args[2]
+		a := z.Args[0]
+		x := z.Args[1]
+		if !(z.Uses == 1) {
+			break
+		}
+		v.reset(OpARM64GreaterEqualNoov)
+		v0 := b.NewValue0(v.Pos, OpARM64CMPW, types.TypeFlags)
+		v1 := b.NewValue0(v.Pos, OpARM64MULW, x.Type)
+		v1.AddArg2(x, y)
+		v0.AddArg2(a, v1)
+		v.AddArg(v0)
+		return true
+	}
 	// match: (GreaterEqual (FlagConstant [fc]))
 	// result: (MOVDconst [b2i(fc.ge())])
 	for {
@@ -5748,6 +5957,27 @@
 	}
 	return false
 }
+func rewriteValueARM64_OpARM64GreaterEqualNoov(v *Value) bool {
+	v_0 := v.Args[0]
+	b := v.Block
+	typ := &b.Func.Config.Types
+	// match: (GreaterEqualNoov (InvertFlags x))
+	// result: (OR (LessThanNoov <typ.Bool> x) (Equal <typ.Bool> x))
+	for {
+		if v_0.Op != OpARM64InvertFlags {
+			break
+		}
+		x := v_0.Args[0]
+		v.reset(OpARM64OR)
+		v0 := b.NewValue0(v.Pos, OpARM64LessThanNoov, typ.Bool)
+		v0.AddArg(x)
+		v1 := b.NewValue0(v.Pos, OpARM64Equal, typ.Bool)
+		v1.AddArg(x)
+		v.AddArg2(v0, v1)
+		return true
+	}
+	return false
+}
 func rewriteValueARM64_OpARM64GreaterEqualU(v *Value) bool {
 	v_0 := v.Args[0]
 	// match: (GreaterEqualU (FlagConstant [fc]))
@@ -5844,11 +6074,11 @@
 		v.AddArg(v0)
 		return true
 	}
-	// match: (GreaterThan (CMPWconst [0] x:(ANDconst [c] y)))
+	// match: (GreaterThan (CMPconst [0] x:(ANDconst [c] y)))
 	// cond: x.Uses == 1
 	// result: (GreaterThan (TSTconst [c] y))
 	for {
-		if v_0.Op != OpARM64CMPWconst || auxIntToInt32(v_0.AuxInt) != 0 {
+		if v_0.Op != OpARM64CMPconst || auxIntToInt64(v_0.AuxInt) != 0 {
 			break
 		}
 		x := v_0.Args[0]
@@ -5935,8 +6165,10 @@
 func rewriteValueARM64_OpARM64LDP(v *Value) bool {
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
+	b := v.Block
+	config := b.Func.Config
 	// match: (LDP [off1] {sym} (ADDconst [off2] ptr) mem)
-	// cond: is32Bit(int64(off1)+off2)
+	// cond: is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
 	// result: (LDP [off1+int32(off2)] {sym} ptr mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -5947,7 +6179,7 @@
 		off2 := auxIntToInt64(v_0.AuxInt)
 		ptr := v_0.Args[0]
 		mem := v_1
-		if !(is32Bit(int64(off1) + off2)) {
+		if !(is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
 			break
 		}
 		v.reset(OpARM64LDP)
@@ -5957,7 +6189,7 @@
 		return true
 	}
 	// match: (LDP [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem)
-	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
 	// result: (LDP [off1+off2] {mergeSym(sym1,sym2)} ptr mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -5969,7 +6201,7 @@
 		sym2 := auxToSym(v_0.Aux)
 		ptr := v_0.Args[0]
 		mem := v_1
-		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) {
+		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
 			break
 		}
 		v.reset(OpARM64LDP)
@@ -6050,11 +6282,11 @@
 		v.AddArg(v0)
 		return true
 	}
-	// match: (LessEqual (CMPWconst [0] x:(ANDconst [c] y)))
+	// match: (LessEqual (CMPconst [0] x:(ANDconst [c] y)))
 	// cond: x.Uses == 1
 	// result: (LessEqual (TSTconst [c] y))
 	for {
-		if v_0.Op != OpARM64CMPWconst || auxIntToInt32(v_0.AuxInt) != 0 {
+		if v_0.Op != OpARM64CMPconst || auxIntToInt64(v_0.AuxInt) != 0 {
 			break
 		}
 		x := v_0.Args[0]
@@ -6208,11 +6440,11 @@
 		v.AddArg(v0)
 		return true
 	}
-	// match: (LessThan (CMPWconst [0] x:(ANDconst [c] y)))
+	// match: (LessThan (CMPconst [0] x:(ANDconst [c] y)))
 	// cond: x.Uses == 1
 	// result: (LessThan (TSTconst [c] y))
 	for {
-		if v_0.Op != OpARM64CMPWconst || auxIntToInt32(v_0.AuxInt) != 0 {
+		if v_0.Op != OpARM64CMPconst || auxIntToInt64(v_0.AuxInt) != 0 {
 			break
 		}
 		x := v_0.Args[0]
@@ -6231,6 +6463,196 @@
 		v.AddArg(v0)
 		return true
 	}
+	// match: (LessThan (CMPconst [0] x:(ADDconst [c] y)))
+	// cond: x.Uses == 1
+	// result: (LessThanNoov (CMNconst [c] y))
+	for {
+		if v_0.Op != OpARM64CMPconst || auxIntToInt64(v_0.AuxInt) != 0 {
+			break
+		}
+		x := v_0.Args[0]
+		if x.Op != OpARM64ADDconst {
+			break
+		}
+		c := auxIntToInt64(x.AuxInt)
+		y := x.Args[0]
+		if !(x.Uses == 1) {
+			break
+		}
+		v.reset(OpARM64LessThanNoov)
+		v0 := b.NewValue0(v.Pos, OpARM64CMNconst, types.TypeFlags)
+		v0.AuxInt = int64ToAuxInt(c)
+		v0.AddArg(y)
+		v.AddArg(v0)
+		return true
+	}
+	// match: (LessThan (CMPWconst [0] x:(ADDconst [c] y)))
+	// cond: x.Uses == 1
+	// result: (LessThanNoov (CMNWconst [int32(c)] y))
+	for {
+		if v_0.Op != OpARM64CMPWconst || auxIntToInt32(v_0.AuxInt) != 0 {
+			break
+		}
+		x := v_0.Args[0]
+		if x.Op != OpARM64ADDconst {
+			break
+		}
+		c := auxIntToInt64(x.AuxInt)
+		y := x.Args[0]
+		if !(x.Uses == 1) {
+			break
+		}
+		v.reset(OpARM64LessThanNoov)
+		v0 := b.NewValue0(v.Pos, OpARM64CMNWconst, types.TypeFlags)
+		v0.AuxInt = int32ToAuxInt(int32(c))
+		v0.AddArg(y)
+		v.AddArg(v0)
+		return true
+	}
+	// match: (LessThan (CMPconst [0] z:(ADD x y)))
+	// cond: z.Uses == 1
+	// result: (LessThanNoov (CMN x y))
+	for {
+		if v_0.Op != OpARM64CMPconst || auxIntToInt64(v_0.AuxInt) != 0 {
+			break
+		}
+		z := v_0.Args[0]
+		if z.Op != OpARM64ADD {
+			break
+		}
+		y := z.Args[1]
+		x := z.Args[0]
+		if !(z.Uses == 1) {
+			break
+		}
+		v.reset(OpARM64LessThanNoov)
+		v0 := b.NewValue0(v.Pos, OpARM64CMN, types.TypeFlags)
+		v0.AddArg2(x, y)
+		v.AddArg(v0)
+		return true
+	}
+	// match: (LessThan (CMPWconst [0] z:(ADD x y)))
+	// cond: z.Uses == 1
+	// result: (LessThanNoov (CMNW x y))
+	for {
+		if v_0.Op != OpARM64CMPWconst || auxIntToInt32(v_0.AuxInt) != 0 {
+			break
+		}
+		z := v_0.Args[0]
+		if z.Op != OpARM64ADD {
+			break
+		}
+		y := z.Args[1]
+		x := z.Args[0]
+		if !(z.Uses == 1) {
+			break
+		}
+		v.reset(OpARM64LessThanNoov)
+		v0 := b.NewValue0(v.Pos, OpARM64CMNW, types.TypeFlags)
+		v0.AddArg2(x, y)
+		v.AddArg(v0)
+		return true
+	}
+	// match: (LessThan (CMPconst [0] z:(MADD a x y)))
+	// cond: z.Uses == 1
+	// result: (LessThanNoov (CMN a (MUL <x.Type> x y)))
+	for {
+		if v_0.Op != OpARM64CMPconst || auxIntToInt64(v_0.AuxInt) != 0 {
+			break
+		}
+		z := v_0.Args[0]
+		if z.Op != OpARM64MADD {
+			break
+		}
+		y := z.Args[2]
+		a := z.Args[0]
+		x := z.Args[1]
+		if !(z.Uses == 1) {
+			break
+		}
+		v.reset(OpARM64LessThanNoov)
+		v0 := b.NewValue0(v.Pos, OpARM64CMN, types.TypeFlags)
+		v1 := b.NewValue0(v.Pos, OpARM64MUL, x.Type)
+		v1.AddArg2(x, y)
+		v0.AddArg2(a, v1)
+		v.AddArg(v0)
+		return true
+	}
+	// match: (LessThan (CMPconst [0] z:(MSUB a x y)))
+	// cond: z.Uses == 1
+	// result: (LessThanNoov (CMP a (MUL <x.Type> x y)))
+	for {
+		if v_0.Op != OpARM64CMPconst || auxIntToInt64(v_0.AuxInt) != 0 {
+			break
+		}
+		z := v_0.Args[0]
+		if z.Op != OpARM64MSUB {
+			break
+		}
+		y := z.Args[2]
+		a := z.Args[0]
+		x := z.Args[1]
+		if !(z.Uses == 1) {
+			break
+		}
+		v.reset(OpARM64LessThanNoov)
+		v0 := b.NewValue0(v.Pos, OpARM64CMP, types.TypeFlags)
+		v1 := b.NewValue0(v.Pos, OpARM64MUL, x.Type)
+		v1.AddArg2(x, y)
+		v0.AddArg2(a, v1)
+		v.AddArg(v0)
+		return true
+	}
+	// match: (LessThan (CMPWconst [0] z:(MADDW a x y)))
+	// cond: z.Uses == 1
+	// result: (LessThanNoov (CMNW a (MULW <x.Type> x y)))
+	for {
+		if v_0.Op != OpARM64CMPWconst || auxIntToInt32(v_0.AuxInt) != 0 {
+			break
+		}
+		z := v_0.Args[0]
+		if z.Op != OpARM64MADDW {
+			break
+		}
+		y := z.Args[2]
+		a := z.Args[0]
+		x := z.Args[1]
+		if !(z.Uses == 1) {
+			break
+		}
+		v.reset(OpARM64LessThanNoov)
+		v0 := b.NewValue0(v.Pos, OpARM64CMNW, types.TypeFlags)
+		v1 := b.NewValue0(v.Pos, OpARM64MULW, x.Type)
+		v1.AddArg2(x, y)
+		v0.AddArg2(a, v1)
+		v.AddArg(v0)
+		return true
+	}
+	// match: (LessThan (CMPWconst [0] z:(MSUBW a x y)))
+	// cond: z.Uses == 1
+	// result: (LessThanNoov (CMPW a (MULW <x.Type> x y)))
+	for {
+		if v_0.Op != OpARM64CMPWconst || auxIntToInt32(v_0.AuxInt) != 0 {
+			break
+		}
+		z := v_0.Args[0]
+		if z.Op != OpARM64MSUBW {
+			break
+		}
+		y := z.Args[2]
+		a := z.Args[0]
+		x := z.Args[1]
+		if !(z.Uses == 1) {
+			break
+		}
+		v.reset(OpARM64LessThanNoov)
+		v0 := b.NewValue0(v.Pos, OpARM64CMPW, types.TypeFlags)
+		v1 := b.NewValue0(v.Pos, OpARM64MULW, x.Type)
+		v1.AddArg2(x, y)
+		v0.AddArg2(a, v1)
+		v.AddArg(v0)
+		return true
+	}
 	// match: (LessThan (FlagConstant [fc]))
 	// result: (MOVDconst [b2i(fc.lt())])
 	for {
@@ -6270,6 +6692,27 @@
 	}
 	return false
 }
+func rewriteValueARM64_OpARM64LessThanNoov(v *Value) bool {
+	v_0 := v.Args[0]
+	b := v.Block
+	typ := &b.Func.Config.Types
+	// match: (LessThanNoov (InvertFlags x))
+	// result: (BIC (GreaterEqualNoov <typ.Bool> x) (Equal <typ.Bool> x))
+	for {
+		if v_0.Op != OpARM64InvertFlags {
+			break
+		}
+		x := v_0.Args[0]
+		v.reset(OpARM64BIC)
+		v0 := b.NewValue0(v.Pos, OpARM64GreaterEqualNoov, typ.Bool)
+		v0.AddArg(x)
+		v1 := b.NewValue0(v.Pos, OpARM64Equal, typ.Bool)
+		v1.AddArg(x)
+		v.AddArg2(v0, v1)
+		return true
+	}
+	return false
+}
 func rewriteValueARM64_OpARM64LessThanU(v *Value) bool {
 	v_0 := v.Args[0]
 	// match: (LessThanU (FlagConstant [fc]))
@@ -7636,8 +8079,10 @@
 func rewriteValueARM64_OpARM64MOVBUload(v *Value) bool {
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
+	b := v.Block
+	config := b.Func.Config
 	// match: (MOVBUload [off1] {sym} (ADDconst [off2] ptr) mem)
-	// cond: is32Bit(int64(off1)+off2)
+	// cond: is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
 	// result: (MOVBUload [off1+int32(off2)] {sym} ptr mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -7648,7 +8093,7 @@
 		off2 := auxIntToInt64(v_0.AuxInt)
 		ptr := v_0.Args[0]
 		mem := v_1
-		if !(is32Bit(int64(off1) + off2)) {
+		if !(is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
 			break
 		}
 		v.reset(OpARM64MOVBUload)
@@ -7677,7 +8122,7 @@
 		return true
 	}
 	// match: (MOVBUload [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem)
-	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
 	// result: (MOVBUload [off1+off2] {mergeSym(sym1,sym2)} ptr mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -7689,7 +8134,7 @@
 		sym2 := auxToSym(v_0.Aux)
 		ptr := v_0.Args[0]
 		mem := v_1
-		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) {
+		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
 			break
 		}
 		v.reset(OpARM64MOVBUload)
@@ -8077,8 +8522,10 @@
 func rewriteValueARM64_OpARM64MOVBload(v *Value) bool {
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
+	b := v.Block
+	config := b.Func.Config
 	// match: (MOVBload [off1] {sym} (ADDconst [off2] ptr) mem)
-	// cond: is32Bit(int64(off1)+off2)
+	// cond: is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
 	// result: (MOVBload [off1+int32(off2)] {sym} ptr mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -8089,7 +8536,7 @@
 		off2 := auxIntToInt64(v_0.AuxInt)
 		ptr := v_0.Args[0]
 		mem := v_1
-		if !(is32Bit(int64(off1) + off2)) {
+		if !(is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
 			break
 		}
 		v.reset(OpARM64MOVBload)
@@ -8118,7 +8565,7 @@
 		return true
 	}
 	// match: (MOVBload [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem)
-	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
 	// result: (MOVBload [off1+off2] {mergeSym(sym1,sym2)} ptr mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -8130,7 +8577,7 @@
 		sym2 := auxToSym(v_0.Aux)
 		ptr := v_0.Args[0]
 		mem := v_1
-		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) {
+		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
 			break
 		}
 		v.reset(OpARM64MOVBload)
@@ -8308,8 +8755,9 @@
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
 	b := v.Block
+	config := b.Func.Config
 	// match: (MOVBstore [off1] {sym} (ADDconst [off2] ptr) val mem)
-	// cond: is32Bit(int64(off1)+off2)
+	// cond: is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
 	// result: (MOVBstore [off1+int32(off2)] {sym} ptr val mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -8321,7 +8769,7 @@
 		ptr := v_0.Args[0]
 		val := v_1
 		mem := v_2
-		if !(is32Bit(int64(off1) + off2)) {
+		if !(is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
 			break
 		}
 		v.reset(OpARM64MOVBstore)
@@ -8351,7 +8799,7 @@
 		return true
 	}
 	// match: (MOVBstore [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) val mem)
-	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
 	// result: (MOVBstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -8364,7 +8812,7 @@
 		ptr := v_0.Args[0]
 		val := v_1
 		mem := v_2
-		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) {
+		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
 			break
 		}
 		v.reset(OpARM64MOVBstore)
@@ -8491,1327 +8939,6 @@
 		v.AddArg3(ptr, x, mem)
 		return true
 	}
-	// match: (MOVBstore [i] {s} ptr0 (SRLconst [8] w) x:(MOVBstore [i-1] {s} ptr1 w mem))
-	// cond: x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x)
-	// result: (MOVHstore [i-1] {s} ptr0 w mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		ptr0 := v_0
-		if v_1.Op != OpARM64SRLconst || auxIntToInt64(v_1.AuxInt) != 8 {
-			break
-		}
-		w := v_1.Args[0]
-		x := v_2
-		if x.Op != OpARM64MOVBstore || auxIntToInt32(x.AuxInt) != i-1 || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		ptr1 := x.Args[0]
-		if w != x.Args[1] || !(x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x)) {
-			break
-		}
-		v.reset(OpARM64MOVHstore)
-		v.AuxInt = int32ToAuxInt(i - 1)
-		v.Aux = symToAux(s)
-		v.AddArg3(ptr0, w, mem)
-		return true
-	}
-	// match: (MOVBstore [1] {s} (ADD ptr0 idx0) (SRLconst [8] w) x:(MOVBstoreidx ptr1 idx1 w mem))
-	// cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)
-	// result: (MOVHstoreidx ptr1 idx1 w mem)
-	for {
-		if auxIntToInt32(v.AuxInt) != 1 {
-			break
-		}
-		s := auxToSym(v.Aux)
-		if v_0.Op != OpARM64ADD {
-			break
-		}
-		_ = v_0.Args[1]
-		v_0_0 := v_0.Args[0]
-		v_0_1 := v_0.Args[1]
-		for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
-			ptr0 := v_0_0
-			idx0 := v_0_1
-			if v_1.Op != OpARM64SRLconst || auxIntToInt64(v_1.AuxInt) != 8 {
-				continue
-			}
-			w := v_1.Args[0]
-			x := v_2
-			if x.Op != OpARM64MOVBstoreidx {
-				continue
-			}
-			mem := x.Args[3]
-			ptr1 := x.Args[0]
-			idx1 := x.Args[1]
-			if w != x.Args[2] || !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) {
-				continue
-			}
-			v.reset(OpARM64MOVHstoreidx)
-			v.AddArg4(ptr1, idx1, w, mem)
-			return true
-		}
-		break
-	}
-	// match: (MOVBstore [i] {s} ptr0 (UBFX [armBFAuxInt(8, 8)] w) x:(MOVBstore [i-1] {s} ptr1 w mem))
-	// cond: x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x)
-	// result: (MOVHstore [i-1] {s} ptr0 w mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		ptr0 := v_0
-		if v_1.Op != OpARM64UBFX || auxIntToArm64BitField(v_1.AuxInt) != armBFAuxInt(8, 8) {
-			break
-		}
-		w := v_1.Args[0]
-		x := v_2
-		if x.Op != OpARM64MOVBstore || auxIntToInt32(x.AuxInt) != i-1 || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		ptr1 := x.Args[0]
-		if w != x.Args[1] || !(x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x)) {
-			break
-		}
-		v.reset(OpARM64MOVHstore)
-		v.AuxInt = int32ToAuxInt(i - 1)
-		v.Aux = symToAux(s)
-		v.AddArg3(ptr0, w, mem)
-		return true
-	}
-	// match: (MOVBstore [1] {s} (ADD ptr0 idx0) (UBFX [armBFAuxInt(8, 8)] w) x:(MOVBstoreidx ptr1 idx1 w mem))
-	// cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)
-	// result: (MOVHstoreidx ptr1 idx1 w mem)
-	for {
-		if auxIntToInt32(v.AuxInt) != 1 {
-			break
-		}
-		s := auxToSym(v.Aux)
-		if v_0.Op != OpARM64ADD {
-			break
-		}
-		_ = v_0.Args[1]
-		v_0_0 := v_0.Args[0]
-		v_0_1 := v_0.Args[1]
-		for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
-			ptr0 := v_0_0
-			idx0 := v_0_1
-			if v_1.Op != OpARM64UBFX || auxIntToArm64BitField(v_1.AuxInt) != armBFAuxInt(8, 8) {
-				continue
-			}
-			w := v_1.Args[0]
-			x := v_2
-			if x.Op != OpARM64MOVBstoreidx {
-				continue
-			}
-			mem := x.Args[3]
-			ptr1 := x.Args[0]
-			idx1 := x.Args[1]
-			if w != x.Args[2] || !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) {
-				continue
-			}
-			v.reset(OpARM64MOVHstoreidx)
-			v.AddArg4(ptr1, idx1, w, mem)
-			return true
-		}
-		break
-	}
-	// match: (MOVBstore [i] {s} ptr0 (UBFX [armBFAuxInt(8, 24)] w) x:(MOVBstore [i-1] {s} ptr1 w mem))
-	// cond: x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x)
-	// result: (MOVHstore [i-1] {s} ptr0 w mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		ptr0 := v_0
-		if v_1.Op != OpARM64UBFX || auxIntToArm64BitField(v_1.AuxInt) != armBFAuxInt(8, 24) {
-			break
-		}
-		w := v_1.Args[0]
-		x := v_2
-		if x.Op != OpARM64MOVBstore || auxIntToInt32(x.AuxInt) != i-1 || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		ptr1 := x.Args[0]
-		if w != x.Args[1] || !(x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x)) {
-			break
-		}
-		v.reset(OpARM64MOVHstore)
-		v.AuxInt = int32ToAuxInt(i - 1)
-		v.Aux = symToAux(s)
-		v.AddArg3(ptr0, w, mem)
-		return true
-	}
-	// match: (MOVBstore [1] {s} (ADD ptr0 idx0) (UBFX [armBFAuxInt(8, 24)] w) x:(MOVBstoreidx ptr1 idx1 w mem))
-	// cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)
-	// result: (MOVHstoreidx ptr1 idx1 w mem)
-	for {
-		if auxIntToInt32(v.AuxInt) != 1 {
-			break
-		}
-		s := auxToSym(v.Aux)
-		if v_0.Op != OpARM64ADD {
-			break
-		}
-		_ = v_0.Args[1]
-		v_0_0 := v_0.Args[0]
-		v_0_1 := v_0.Args[1]
-		for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
-			ptr0 := v_0_0
-			idx0 := v_0_1
-			if v_1.Op != OpARM64UBFX || auxIntToArm64BitField(v_1.AuxInt) != armBFAuxInt(8, 24) {
-				continue
-			}
-			w := v_1.Args[0]
-			x := v_2
-			if x.Op != OpARM64MOVBstoreidx {
-				continue
-			}
-			mem := x.Args[3]
-			ptr1 := x.Args[0]
-			idx1 := x.Args[1]
-			if w != x.Args[2] || !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) {
-				continue
-			}
-			v.reset(OpARM64MOVHstoreidx)
-			v.AddArg4(ptr1, idx1, w, mem)
-			return true
-		}
-		break
-	}
-	// match: (MOVBstore [i] {s} ptr0 (SRLconst [8] (MOVDreg w)) x:(MOVBstore [i-1] {s} ptr1 w mem))
-	// cond: x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x)
-	// result: (MOVHstore [i-1] {s} ptr0 w mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		ptr0 := v_0
-		if v_1.Op != OpARM64SRLconst || auxIntToInt64(v_1.AuxInt) != 8 {
-			break
-		}
-		v_1_0 := v_1.Args[0]
-		if v_1_0.Op != OpARM64MOVDreg {
-			break
-		}
-		w := v_1_0.Args[0]
-		x := v_2
-		if x.Op != OpARM64MOVBstore || auxIntToInt32(x.AuxInt) != i-1 || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		ptr1 := x.Args[0]
-		if w != x.Args[1] || !(x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x)) {
-			break
-		}
-		v.reset(OpARM64MOVHstore)
-		v.AuxInt = int32ToAuxInt(i - 1)
-		v.Aux = symToAux(s)
-		v.AddArg3(ptr0, w, mem)
-		return true
-	}
-	// match: (MOVBstore [1] {s} (ADD ptr0 idx0) (SRLconst [8] (MOVDreg w)) x:(MOVBstoreidx ptr1 idx1 w mem))
-	// cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)
-	// result: (MOVHstoreidx ptr1 idx1 w mem)
-	for {
-		if auxIntToInt32(v.AuxInt) != 1 {
-			break
-		}
-		s := auxToSym(v.Aux)
-		if v_0.Op != OpARM64ADD {
-			break
-		}
-		_ = v_0.Args[1]
-		v_0_0 := v_0.Args[0]
-		v_0_1 := v_0.Args[1]
-		for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
-			ptr0 := v_0_0
-			idx0 := v_0_1
-			if v_1.Op != OpARM64SRLconst || auxIntToInt64(v_1.AuxInt) != 8 {
-				continue
-			}
-			v_1_0 := v_1.Args[0]
-			if v_1_0.Op != OpARM64MOVDreg {
-				continue
-			}
-			w := v_1_0.Args[0]
-			x := v_2
-			if x.Op != OpARM64MOVBstoreidx {
-				continue
-			}
-			mem := x.Args[3]
-			ptr1 := x.Args[0]
-			idx1 := x.Args[1]
-			if w != x.Args[2] || !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) {
-				continue
-			}
-			v.reset(OpARM64MOVHstoreidx)
-			v.AddArg4(ptr1, idx1, w, mem)
-			return true
-		}
-		break
-	}
-	// match: (MOVBstore [i] {s} ptr0 (SRLconst [j] w) x:(MOVBstore [i-1] {s} ptr1 w0:(SRLconst [j-8] w) mem))
-	// cond: x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x)
-	// result: (MOVHstore [i-1] {s} ptr0 w0 mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		ptr0 := v_0
-		if v_1.Op != OpARM64SRLconst {
-			break
-		}
-		j := auxIntToInt64(v_1.AuxInt)
-		w := v_1.Args[0]
-		x := v_2
-		if x.Op != OpARM64MOVBstore || auxIntToInt32(x.AuxInt) != i-1 || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		ptr1 := x.Args[0]
-		w0 := x.Args[1]
-		if w0.Op != OpARM64SRLconst || auxIntToInt64(w0.AuxInt) != j-8 || w != w0.Args[0] || !(x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x)) {
-			break
-		}
-		v.reset(OpARM64MOVHstore)
-		v.AuxInt = int32ToAuxInt(i - 1)
-		v.Aux = symToAux(s)
-		v.AddArg3(ptr0, w0, mem)
-		return true
-	}
-	// match: (MOVBstore [1] {s} (ADD ptr0 idx0) (SRLconst [j] w) x:(MOVBstoreidx ptr1 idx1 w0:(SRLconst [j-8] w) mem))
-	// cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)
-	// result: (MOVHstoreidx ptr1 idx1 w0 mem)
-	for {
-		if auxIntToInt32(v.AuxInt) != 1 {
-			break
-		}
-		s := auxToSym(v.Aux)
-		if v_0.Op != OpARM64ADD {
-			break
-		}
-		_ = v_0.Args[1]
-		v_0_0 := v_0.Args[0]
-		v_0_1 := v_0.Args[1]
-		for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
-			ptr0 := v_0_0
-			idx0 := v_0_1
-			if v_1.Op != OpARM64SRLconst {
-				continue
-			}
-			j := auxIntToInt64(v_1.AuxInt)
-			w := v_1.Args[0]
-			x := v_2
-			if x.Op != OpARM64MOVBstoreidx {
-				continue
-			}
-			mem := x.Args[3]
-			ptr1 := x.Args[0]
-			idx1 := x.Args[1]
-			w0 := x.Args[2]
-			if w0.Op != OpARM64SRLconst || auxIntToInt64(w0.AuxInt) != j-8 || w != w0.Args[0] || !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) {
-				continue
-			}
-			v.reset(OpARM64MOVHstoreidx)
-			v.AddArg4(ptr1, idx1, w0, mem)
-			return true
-		}
-		break
-	}
-	// match: (MOVBstore [i] {s} ptr0 (UBFX [bfc] w) x:(MOVBstore [i-1] {s} ptr1 w0:(UBFX [bfc2] w) mem))
-	// cond: x.Uses == 1 && isSamePtr(ptr0, ptr1) && bfc.getARM64BFwidth() == 32 - bfc.getARM64BFlsb() && bfc2.getARM64BFwidth() == 32 - bfc2.getARM64BFlsb() && bfc2.getARM64BFlsb() == bfc.getARM64BFlsb() - 8 && clobber(x)
-	// result: (MOVHstore [i-1] {s} ptr0 w0 mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		ptr0 := v_0
-		if v_1.Op != OpARM64UBFX {
-			break
-		}
-		bfc := auxIntToArm64BitField(v_1.AuxInt)
-		w := v_1.Args[0]
-		x := v_2
-		if x.Op != OpARM64MOVBstore || auxIntToInt32(x.AuxInt) != i-1 || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		ptr1 := x.Args[0]
-		w0 := x.Args[1]
-		if w0.Op != OpARM64UBFX {
-			break
-		}
-		bfc2 := auxIntToArm64BitField(w0.AuxInt)
-		if w != w0.Args[0] || !(x.Uses == 1 && isSamePtr(ptr0, ptr1) && bfc.getARM64BFwidth() == 32-bfc.getARM64BFlsb() && bfc2.getARM64BFwidth() == 32-bfc2.getARM64BFlsb() && bfc2.getARM64BFlsb() == bfc.getARM64BFlsb()-8 && clobber(x)) {
-			break
-		}
-		v.reset(OpARM64MOVHstore)
-		v.AuxInt = int32ToAuxInt(i - 1)
-		v.Aux = symToAux(s)
-		v.AddArg3(ptr0, w0, mem)
-		return true
-	}
-	// match: (MOVBstore [1] {s} (ADD ptr0 idx0) (UBFX [bfc] w) x:(MOVBstoreidx ptr1 idx1 w0:(UBFX [bfc2] w) mem))
-	// cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && bfc.getARM64BFwidth() == 32 - bfc.getARM64BFlsb() && bfc2.getARM64BFwidth() == 32 - bfc2.getARM64BFlsb() && bfc2.getARM64BFlsb() == bfc.getARM64BFlsb() - 8 && clobber(x)
-	// result: (MOVHstoreidx ptr1 idx1 w0 mem)
-	for {
-		if auxIntToInt32(v.AuxInt) != 1 {
-			break
-		}
-		s := auxToSym(v.Aux)
-		if v_0.Op != OpARM64ADD {
-			break
-		}
-		_ = v_0.Args[1]
-		v_0_0 := v_0.Args[0]
-		v_0_1 := v_0.Args[1]
-		for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
-			ptr0 := v_0_0
-			idx0 := v_0_1
-			if v_1.Op != OpARM64UBFX {
-				continue
-			}
-			bfc := auxIntToArm64BitField(v_1.AuxInt)
-			w := v_1.Args[0]
-			x := v_2
-			if x.Op != OpARM64MOVBstoreidx {
-				continue
-			}
-			mem := x.Args[3]
-			ptr1 := x.Args[0]
-			idx1 := x.Args[1]
-			w0 := x.Args[2]
-			if w0.Op != OpARM64UBFX {
-				continue
-			}
-			bfc2 := auxIntToArm64BitField(w0.AuxInt)
-			if w != w0.Args[0] || !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && bfc.getARM64BFwidth() == 32-bfc.getARM64BFlsb() && bfc2.getARM64BFwidth() == 32-bfc2.getARM64BFlsb() && bfc2.getARM64BFlsb() == bfc.getARM64BFlsb()-8 && clobber(x)) {
-				continue
-			}
-			v.reset(OpARM64MOVHstoreidx)
-			v.AddArg4(ptr1, idx1, w0, mem)
-			return true
-		}
-		break
-	}
-	// match: (MOVBstore [i] {s} ptr0 (SRLconst [j] (MOVDreg w)) x:(MOVBstore [i-1] {s} ptr1 w0:(SRLconst [j-8] (MOVDreg w)) mem))
-	// cond: x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x)
-	// result: (MOVHstore [i-1] {s} ptr0 w0 mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		ptr0 := v_0
-		if v_1.Op != OpARM64SRLconst {
-			break
-		}
-		j := auxIntToInt64(v_1.AuxInt)
-		v_1_0 := v_1.Args[0]
-		if v_1_0.Op != OpARM64MOVDreg {
-			break
-		}
-		w := v_1_0.Args[0]
-		x := v_2
-		if x.Op != OpARM64MOVBstore || auxIntToInt32(x.AuxInt) != i-1 || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		ptr1 := x.Args[0]
-		w0 := x.Args[1]
-		if w0.Op != OpARM64SRLconst || auxIntToInt64(w0.AuxInt) != j-8 {
-			break
-		}
-		w0_0 := w0.Args[0]
-		if w0_0.Op != OpARM64MOVDreg || w != w0_0.Args[0] || !(x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x)) {
-			break
-		}
-		v.reset(OpARM64MOVHstore)
-		v.AuxInt = int32ToAuxInt(i - 1)
-		v.Aux = symToAux(s)
-		v.AddArg3(ptr0, w0, mem)
-		return true
-	}
-	// match: (MOVBstore [1] {s} (ADD ptr0 idx0) (SRLconst [j] (MOVDreg w)) x:(MOVBstoreidx ptr1 idx1 w0:(SRLconst [j-8] (MOVDreg w)) mem))
-	// cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)
-	// result: (MOVHstoreidx ptr1 idx1 w0 mem)
-	for {
-		if auxIntToInt32(v.AuxInt) != 1 {
-			break
-		}
-		s := auxToSym(v.Aux)
-		if v_0.Op != OpARM64ADD {
-			break
-		}
-		_ = v_0.Args[1]
-		v_0_0 := v_0.Args[0]
-		v_0_1 := v_0.Args[1]
-		for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
-			ptr0 := v_0_0
-			idx0 := v_0_1
-			if v_1.Op != OpARM64SRLconst {
-				continue
-			}
-			j := auxIntToInt64(v_1.AuxInt)
-			v_1_0 := v_1.Args[0]
-			if v_1_0.Op != OpARM64MOVDreg {
-				continue
-			}
-			w := v_1_0.Args[0]
-			x := v_2
-			if x.Op != OpARM64MOVBstoreidx {
-				continue
-			}
-			mem := x.Args[3]
-			ptr1 := x.Args[0]
-			idx1 := x.Args[1]
-			w0 := x.Args[2]
-			if w0.Op != OpARM64SRLconst || auxIntToInt64(w0.AuxInt) != j-8 {
-				continue
-			}
-			w0_0 := w0.Args[0]
-			if w0_0.Op != OpARM64MOVDreg || w != w0_0.Args[0] || !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) {
-				continue
-			}
-			v.reset(OpARM64MOVHstoreidx)
-			v.AddArg4(ptr1, idx1, w0, mem)
-			return true
-		}
-		break
-	}
-	// match: (MOVBstore [i] {s} ptr w x0:(MOVBstore [i-1] {s} ptr (SRLconst [8] w) x1:(MOVBstore [i-2] {s} ptr (SRLconst [16] w) x2:(MOVBstore [i-3] {s} ptr (SRLconst [24] w) x3:(MOVBstore [i-4] {s} ptr (SRLconst [32] w) x4:(MOVBstore [i-5] {s} ptr (SRLconst [40] w) x5:(MOVBstore [i-6] {s} ptr (SRLconst [48] w) x6:(MOVBstore [i-7] {s} ptr (SRLconst [56] w) mem))))))))
-	// cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && clobber(x0, x1, x2, x3, x4, x5, x6)
-	// result: (MOVDstore [i-7] {s} ptr (REV <w.Type> w) mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		ptr := v_0
-		w := v_1
-		x0 := v_2
-		if x0.Op != OpARM64MOVBstore || auxIntToInt32(x0.AuxInt) != i-1 || auxToSym(x0.Aux) != s {
-			break
-		}
-		_ = x0.Args[2]
-		if ptr != x0.Args[0] {
-			break
-		}
-		x0_1 := x0.Args[1]
-		if x0_1.Op != OpARM64SRLconst || auxIntToInt64(x0_1.AuxInt) != 8 || w != x0_1.Args[0] {
-			break
-		}
-		x1 := x0.Args[2]
-		if x1.Op != OpARM64MOVBstore || auxIntToInt32(x1.AuxInt) != i-2 || auxToSym(x1.Aux) != s {
-			break
-		}
-		_ = x1.Args[2]
-		if ptr != x1.Args[0] {
-			break
-		}
-		x1_1 := x1.Args[1]
-		if x1_1.Op != OpARM64SRLconst || auxIntToInt64(x1_1.AuxInt) != 16 || w != x1_1.Args[0] {
-			break
-		}
-		x2 := x1.Args[2]
-		if x2.Op != OpARM64MOVBstore || auxIntToInt32(x2.AuxInt) != i-3 || auxToSym(x2.Aux) != s {
-			break
-		}
-		_ = x2.Args[2]
-		if ptr != x2.Args[0] {
-			break
-		}
-		x2_1 := x2.Args[1]
-		if x2_1.Op != OpARM64SRLconst || auxIntToInt64(x2_1.AuxInt) != 24 || w != x2_1.Args[0] {
-			break
-		}
-		x3 := x2.Args[2]
-		if x3.Op != OpARM64MOVBstore || auxIntToInt32(x3.AuxInt) != i-4 || auxToSym(x3.Aux) != s {
-			break
-		}
-		_ = x3.Args[2]
-		if ptr != x3.Args[0] {
-			break
-		}
-		x3_1 := x3.Args[1]
-		if x3_1.Op != OpARM64SRLconst || auxIntToInt64(x3_1.AuxInt) != 32 || w != x3_1.Args[0] {
-			break
-		}
-		x4 := x3.Args[2]
-		if x4.Op != OpARM64MOVBstore || auxIntToInt32(x4.AuxInt) != i-5 || auxToSym(x4.Aux) != s {
-			break
-		}
-		_ = x4.Args[2]
-		if ptr != x4.Args[0] {
-			break
-		}
-		x4_1 := x4.Args[1]
-		if x4_1.Op != OpARM64SRLconst || auxIntToInt64(x4_1.AuxInt) != 40 || w != x4_1.Args[0] {
-			break
-		}
-		x5 := x4.Args[2]
-		if x5.Op != OpARM64MOVBstore || auxIntToInt32(x5.AuxInt) != i-6 || auxToSym(x5.Aux) != s {
-			break
-		}
-		_ = x5.Args[2]
-		if ptr != x5.Args[0] {
-			break
-		}
-		x5_1 := x5.Args[1]
-		if x5_1.Op != OpARM64SRLconst || auxIntToInt64(x5_1.AuxInt) != 48 || w != x5_1.Args[0] {
-			break
-		}
-		x6 := x5.Args[2]
-		if x6.Op != OpARM64MOVBstore || auxIntToInt32(x6.AuxInt) != i-7 || auxToSym(x6.Aux) != s {
-			break
-		}
-		mem := x6.Args[2]
-		if ptr != x6.Args[0] {
-			break
-		}
-		x6_1 := x6.Args[1]
-		if x6_1.Op != OpARM64SRLconst || auxIntToInt64(x6_1.AuxInt) != 56 || w != x6_1.Args[0] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && clobber(x0, x1, x2, x3, x4, x5, x6)) {
-			break
-		}
-		v.reset(OpARM64MOVDstore)
-		v.AuxInt = int32ToAuxInt(i - 7)
-		v.Aux = symToAux(s)
-		v0 := b.NewValue0(x6.Pos, OpARM64REV, w.Type)
-		v0.AddArg(w)
-		v.AddArg3(ptr, v0, mem)
-		return true
-	}
-	// match: (MOVBstore [7] {s} p w x0:(MOVBstore [6] {s} p (SRLconst [8] w) x1:(MOVBstore [5] {s} p (SRLconst [16] w) x2:(MOVBstore [4] {s} p (SRLconst [24] w) x3:(MOVBstore [3] {s} p (SRLconst [32] w) x4:(MOVBstore [2] {s} p (SRLconst [40] w) x5:(MOVBstore [1] {s} p1:(ADD ptr1 idx1) (SRLconst [48] w) x6:(MOVBstoreidx ptr0 idx0 (SRLconst [56] w) mem))))))))
-	// cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0, x1, x2, x3, x4, x5, x6)
-	// result: (MOVDstoreidx ptr0 idx0 (REV <w.Type> w) mem)
-	for {
-		if auxIntToInt32(v.AuxInt) != 7 {
-			break
-		}
-		s := auxToSym(v.Aux)
-		p := v_0
-		w := v_1
-		x0 := v_2
-		if x0.Op != OpARM64MOVBstore || auxIntToInt32(x0.AuxInt) != 6 || auxToSym(x0.Aux) != s {
-			break
-		}
-		_ = x0.Args[2]
-		if p != x0.Args[0] {
-			break
-		}
-		x0_1 := x0.Args[1]
-		if x0_1.Op != OpARM64SRLconst || auxIntToInt64(x0_1.AuxInt) != 8 || w != x0_1.Args[0] {
-			break
-		}
-		x1 := x0.Args[2]
-		if x1.Op != OpARM64MOVBstore || auxIntToInt32(x1.AuxInt) != 5 || auxToSym(x1.Aux) != s {
-			break
-		}
-		_ = x1.Args[2]
-		if p != x1.Args[0] {
-			break
-		}
-		x1_1 := x1.Args[1]
-		if x1_1.Op != OpARM64SRLconst || auxIntToInt64(x1_1.AuxInt) != 16 || w != x1_1.Args[0] {
-			break
-		}
-		x2 := x1.Args[2]
-		if x2.Op != OpARM64MOVBstore || auxIntToInt32(x2.AuxInt) != 4 || auxToSym(x2.Aux) != s {
-			break
-		}
-		_ = x2.Args[2]
-		if p != x2.Args[0] {
-			break
-		}
-		x2_1 := x2.Args[1]
-		if x2_1.Op != OpARM64SRLconst || auxIntToInt64(x2_1.AuxInt) != 24 || w != x2_1.Args[0] {
-			break
-		}
-		x3 := x2.Args[2]
-		if x3.Op != OpARM64MOVBstore || auxIntToInt32(x3.AuxInt) != 3 || auxToSym(x3.Aux) != s {
-			break
-		}
-		_ = x3.Args[2]
-		if p != x3.Args[0] {
-			break
-		}
-		x3_1 := x3.Args[1]
-		if x3_1.Op != OpARM64SRLconst || auxIntToInt64(x3_1.AuxInt) != 32 || w != x3_1.Args[0] {
-			break
-		}
-		x4 := x3.Args[2]
-		if x4.Op != OpARM64MOVBstore || auxIntToInt32(x4.AuxInt) != 2 || auxToSym(x4.Aux) != s {
-			break
-		}
-		_ = x4.Args[2]
-		if p != x4.Args[0] {
-			break
-		}
-		x4_1 := x4.Args[1]
-		if x4_1.Op != OpARM64SRLconst || auxIntToInt64(x4_1.AuxInt) != 40 || w != x4_1.Args[0] {
-			break
-		}
-		x5 := x4.Args[2]
-		if x5.Op != OpARM64MOVBstore || auxIntToInt32(x5.AuxInt) != 1 || auxToSym(x5.Aux) != s {
-			break
-		}
-		_ = x5.Args[2]
-		p1 := x5.Args[0]
-		if p1.Op != OpARM64ADD {
-			break
-		}
-		_ = p1.Args[1]
-		p1_0 := p1.Args[0]
-		p1_1 := p1.Args[1]
-		for _i0 := 0; _i0 <= 1; _i0, p1_0, p1_1 = _i0+1, p1_1, p1_0 {
-			ptr1 := p1_0
-			idx1 := p1_1
-			x5_1 := x5.Args[1]
-			if x5_1.Op != OpARM64SRLconst || auxIntToInt64(x5_1.AuxInt) != 48 || w != x5_1.Args[0] {
-				continue
-			}
-			x6 := x5.Args[2]
-			if x6.Op != OpARM64MOVBstoreidx {
-				continue
-			}
-			mem := x6.Args[3]
-			ptr0 := x6.Args[0]
-			idx0 := x6.Args[1]
-			x6_2 := x6.Args[2]
-			if x6_2.Op != OpARM64SRLconst || auxIntToInt64(x6_2.AuxInt) != 56 || w != x6_2.Args[0] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0, x1, x2, x3, x4, x5, x6)) {
-				continue
-			}
-			v.reset(OpARM64MOVDstoreidx)
-			v0 := b.NewValue0(x5.Pos, OpARM64REV, w.Type)
-			v0.AddArg(w)
-			v.AddArg4(ptr0, idx0, v0, mem)
-			return true
-		}
-		break
-	}
-	// match: (MOVBstore [i] {s} ptr w x0:(MOVBstore [i-1] {s} ptr (UBFX [armBFAuxInt(8, 24)] w) x1:(MOVBstore [i-2] {s} ptr (UBFX [armBFAuxInt(16, 16)] w) x2:(MOVBstore [i-3] {s} ptr (UBFX [armBFAuxInt(24, 8)] w) mem))))
-	// cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && clobber(x0, x1, x2)
-	// result: (MOVWstore [i-3] {s} ptr (REVW <w.Type> w) mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		ptr := v_0
-		w := v_1
-		x0 := v_2
-		if x0.Op != OpARM64MOVBstore || auxIntToInt32(x0.AuxInt) != i-1 || auxToSym(x0.Aux) != s {
-			break
-		}
-		_ = x0.Args[2]
-		if ptr != x0.Args[0] {
-			break
-		}
-		x0_1 := x0.Args[1]
-		if x0_1.Op != OpARM64UBFX || auxIntToArm64BitField(x0_1.AuxInt) != armBFAuxInt(8, 24) || w != x0_1.Args[0] {
-			break
-		}
-		x1 := x0.Args[2]
-		if x1.Op != OpARM64MOVBstore || auxIntToInt32(x1.AuxInt) != i-2 || auxToSym(x1.Aux) != s {
-			break
-		}
-		_ = x1.Args[2]
-		if ptr != x1.Args[0] {
-			break
-		}
-		x1_1 := x1.Args[1]
-		if x1_1.Op != OpARM64UBFX || auxIntToArm64BitField(x1_1.AuxInt) != armBFAuxInt(16, 16) || w != x1_1.Args[0] {
-			break
-		}
-		x2 := x1.Args[2]
-		if x2.Op != OpARM64MOVBstore || auxIntToInt32(x2.AuxInt) != i-3 || auxToSym(x2.Aux) != s {
-			break
-		}
-		mem := x2.Args[2]
-		if ptr != x2.Args[0] {
-			break
-		}
-		x2_1 := x2.Args[1]
-		if x2_1.Op != OpARM64UBFX || auxIntToArm64BitField(x2_1.AuxInt) != armBFAuxInt(24, 8) || w != x2_1.Args[0] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && clobber(x0, x1, x2)) {
-			break
-		}
-		v.reset(OpARM64MOVWstore)
-		v.AuxInt = int32ToAuxInt(i - 3)
-		v.Aux = symToAux(s)
-		v0 := b.NewValue0(x2.Pos, OpARM64REVW, w.Type)
-		v0.AddArg(w)
-		v.AddArg3(ptr, v0, mem)
-		return true
-	}
-	// match: (MOVBstore [3] {s} p w x0:(MOVBstore [2] {s} p (UBFX [armBFAuxInt(8, 24)] w) x1:(MOVBstore [1] {s} p1:(ADD ptr1 idx1) (UBFX [armBFAuxInt(16, 16)] w) x2:(MOVBstoreidx ptr0 idx0 (UBFX [armBFAuxInt(24, 8)] w) mem))))
-	// cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0, x1, x2)
-	// result: (MOVWstoreidx ptr0 idx0 (REVW <w.Type> w) mem)
-	for {
-		if auxIntToInt32(v.AuxInt) != 3 {
-			break
-		}
-		s := auxToSym(v.Aux)
-		p := v_0
-		w := v_1
-		x0 := v_2
-		if x0.Op != OpARM64MOVBstore || auxIntToInt32(x0.AuxInt) != 2 || auxToSym(x0.Aux) != s {
-			break
-		}
-		_ = x0.Args[2]
-		if p != x0.Args[0] {
-			break
-		}
-		x0_1 := x0.Args[1]
-		if x0_1.Op != OpARM64UBFX || auxIntToArm64BitField(x0_1.AuxInt) != armBFAuxInt(8, 24) || w != x0_1.Args[0] {
-			break
-		}
-		x1 := x0.Args[2]
-		if x1.Op != OpARM64MOVBstore || auxIntToInt32(x1.AuxInt) != 1 || auxToSym(x1.Aux) != s {
-			break
-		}
-		_ = x1.Args[2]
-		p1 := x1.Args[0]
-		if p1.Op != OpARM64ADD {
-			break
-		}
-		_ = p1.Args[1]
-		p1_0 := p1.Args[0]
-		p1_1 := p1.Args[1]
-		for _i0 := 0; _i0 <= 1; _i0, p1_0, p1_1 = _i0+1, p1_1, p1_0 {
-			ptr1 := p1_0
-			idx1 := p1_1
-			x1_1 := x1.Args[1]
-			if x1_1.Op != OpARM64UBFX || auxIntToArm64BitField(x1_1.AuxInt) != armBFAuxInt(16, 16) || w != x1_1.Args[0] {
-				continue
-			}
-			x2 := x1.Args[2]
-			if x2.Op != OpARM64MOVBstoreidx {
-				continue
-			}
-			mem := x2.Args[3]
-			ptr0 := x2.Args[0]
-			idx0 := x2.Args[1]
-			x2_2 := x2.Args[2]
-			if x2_2.Op != OpARM64UBFX || auxIntToArm64BitField(x2_2.AuxInt) != armBFAuxInt(24, 8) || w != x2_2.Args[0] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0, x1, x2)) {
-				continue
-			}
-			v.reset(OpARM64MOVWstoreidx)
-			v0 := b.NewValue0(x1.Pos, OpARM64REVW, w.Type)
-			v0.AddArg(w)
-			v.AddArg4(ptr0, idx0, v0, mem)
-			return true
-		}
-		break
-	}
-	// match: (MOVBstore [i] {s} ptr w x0:(MOVBstore [i-1] {s} ptr (SRLconst [8] (MOVDreg w)) x1:(MOVBstore [i-2] {s} ptr (SRLconst [16] (MOVDreg w)) x2:(MOVBstore [i-3] {s} ptr (SRLconst [24] (MOVDreg w)) mem))))
-	// cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && clobber(x0, x1, x2)
-	// result: (MOVWstore [i-3] {s} ptr (REVW <w.Type> w) mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		ptr := v_0
-		w := v_1
-		x0 := v_2
-		if x0.Op != OpARM64MOVBstore || auxIntToInt32(x0.AuxInt) != i-1 || auxToSym(x0.Aux) != s {
-			break
-		}
-		_ = x0.Args[2]
-		if ptr != x0.Args[0] {
-			break
-		}
-		x0_1 := x0.Args[1]
-		if x0_1.Op != OpARM64SRLconst || auxIntToInt64(x0_1.AuxInt) != 8 {
-			break
-		}
-		x0_1_0 := x0_1.Args[0]
-		if x0_1_0.Op != OpARM64MOVDreg || w != x0_1_0.Args[0] {
-			break
-		}
-		x1 := x0.Args[2]
-		if x1.Op != OpARM64MOVBstore || auxIntToInt32(x1.AuxInt) != i-2 || auxToSym(x1.Aux) != s {
-			break
-		}
-		_ = x1.Args[2]
-		if ptr != x1.Args[0] {
-			break
-		}
-		x1_1 := x1.Args[1]
-		if x1_1.Op != OpARM64SRLconst || auxIntToInt64(x1_1.AuxInt) != 16 {
-			break
-		}
-		x1_1_0 := x1_1.Args[0]
-		if x1_1_0.Op != OpARM64MOVDreg || w != x1_1_0.Args[0] {
-			break
-		}
-		x2 := x1.Args[2]
-		if x2.Op != OpARM64MOVBstore || auxIntToInt32(x2.AuxInt) != i-3 || auxToSym(x2.Aux) != s {
-			break
-		}
-		mem := x2.Args[2]
-		if ptr != x2.Args[0] {
-			break
-		}
-		x2_1 := x2.Args[1]
-		if x2_1.Op != OpARM64SRLconst || auxIntToInt64(x2_1.AuxInt) != 24 {
-			break
-		}
-		x2_1_0 := x2_1.Args[0]
-		if x2_1_0.Op != OpARM64MOVDreg || w != x2_1_0.Args[0] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && clobber(x0, x1, x2)) {
-			break
-		}
-		v.reset(OpARM64MOVWstore)
-		v.AuxInt = int32ToAuxInt(i - 3)
-		v.Aux = symToAux(s)
-		v0 := b.NewValue0(x2.Pos, OpARM64REVW, w.Type)
-		v0.AddArg(w)
-		v.AddArg3(ptr, v0, mem)
-		return true
-	}
-	// match: (MOVBstore [3] {s} p w x0:(MOVBstore [2] {s} p (SRLconst [8] (MOVDreg w)) x1:(MOVBstore [1] {s} p1:(ADD ptr1 idx1) (SRLconst [16] (MOVDreg w)) x2:(MOVBstoreidx ptr0 idx0 (SRLconst [24] (MOVDreg w)) mem))))
-	// cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0, x1, x2)
-	// result: (MOVWstoreidx ptr0 idx0 (REVW <w.Type> w) mem)
-	for {
-		if auxIntToInt32(v.AuxInt) != 3 {
-			break
-		}
-		s := auxToSym(v.Aux)
-		p := v_0
-		w := v_1
-		x0 := v_2
-		if x0.Op != OpARM64MOVBstore || auxIntToInt32(x0.AuxInt) != 2 || auxToSym(x0.Aux) != s {
-			break
-		}
-		_ = x0.Args[2]
-		if p != x0.Args[0] {
-			break
-		}
-		x0_1 := x0.Args[1]
-		if x0_1.Op != OpARM64SRLconst || auxIntToInt64(x0_1.AuxInt) != 8 {
-			break
-		}
-		x0_1_0 := x0_1.Args[0]
-		if x0_1_0.Op != OpARM64MOVDreg || w != x0_1_0.Args[0] {
-			break
-		}
-		x1 := x0.Args[2]
-		if x1.Op != OpARM64MOVBstore || auxIntToInt32(x1.AuxInt) != 1 || auxToSym(x1.Aux) != s {
-			break
-		}
-		_ = x1.Args[2]
-		p1 := x1.Args[0]
-		if p1.Op != OpARM64ADD {
-			break
-		}
-		_ = p1.Args[1]
-		p1_0 := p1.Args[0]
-		p1_1 := p1.Args[1]
-		for _i0 := 0; _i0 <= 1; _i0, p1_0, p1_1 = _i0+1, p1_1, p1_0 {
-			ptr1 := p1_0
-			idx1 := p1_1
-			x1_1 := x1.Args[1]
-			if x1_1.Op != OpARM64SRLconst || auxIntToInt64(x1_1.AuxInt) != 16 {
-				continue
-			}
-			x1_1_0 := x1_1.Args[0]
-			if x1_1_0.Op != OpARM64MOVDreg || w != x1_1_0.Args[0] {
-				continue
-			}
-			x2 := x1.Args[2]
-			if x2.Op != OpARM64MOVBstoreidx {
-				continue
-			}
-			mem := x2.Args[3]
-			ptr0 := x2.Args[0]
-			idx0 := x2.Args[1]
-			x2_2 := x2.Args[2]
-			if x2_2.Op != OpARM64SRLconst || auxIntToInt64(x2_2.AuxInt) != 24 {
-				continue
-			}
-			x2_2_0 := x2_2.Args[0]
-			if x2_2_0.Op != OpARM64MOVDreg || w != x2_2_0.Args[0] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0, x1, x2)) {
-				continue
-			}
-			v.reset(OpARM64MOVWstoreidx)
-			v0 := b.NewValue0(x1.Pos, OpARM64REVW, w.Type)
-			v0.AddArg(w)
-			v.AddArg4(ptr0, idx0, v0, mem)
-			return true
-		}
-		break
-	}
-	// match: (MOVBstore [i] {s} ptr w x0:(MOVBstore [i-1] {s} ptr (SRLconst [8] w) x1:(MOVBstore [i-2] {s} ptr (SRLconst [16] w) x2:(MOVBstore [i-3] {s} ptr (SRLconst [24] w) mem))))
-	// cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && clobber(x0, x1, x2)
-	// result: (MOVWstore [i-3] {s} ptr (REVW <w.Type> w) mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		ptr := v_0
-		w := v_1
-		x0 := v_2
-		if x0.Op != OpARM64MOVBstore || auxIntToInt32(x0.AuxInt) != i-1 || auxToSym(x0.Aux) != s {
-			break
-		}
-		_ = x0.Args[2]
-		if ptr != x0.Args[0] {
-			break
-		}
-		x0_1 := x0.Args[1]
-		if x0_1.Op != OpARM64SRLconst || auxIntToInt64(x0_1.AuxInt) != 8 || w != x0_1.Args[0] {
-			break
-		}
-		x1 := x0.Args[2]
-		if x1.Op != OpARM64MOVBstore || auxIntToInt32(x1.AuxInt) != i-2 || auxToSym(x1.Aux) != s {
-			break
-		}
-		_ = x1.Args[2]
-		if ptr != x1.Args[0] {
-			break
-		}
-		x1_1 := x1.Args[1]
-		if x1_1.Op != OpARM64SRLconst || auxIntToInt64(x1_1.AuxInt) != 16 || w != x1_1.Args[0] {
-			break
-		}
-		x2 := x1.Args[2]
-		if x2.Op != OpARM64MOVBstore || auxIntToInt32(x2.AuxInt) != i-3 || auxToSym(x2.Aux) != s {
-			break
-		}
-		mem := x2.Args[2]
-		if ptr != x2.Args[0] {
-			break
-		}
-		x2_1 := x2.Args[1]
-		if x2_1.Op != OpARM64SRLconst || auxIntToInt64(x2_1.AuxInt) != 24 || w != x2_1.Args[0] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && clobber(x0, x1, x2)) {
-			break
-		}
-		v.reset(OpARM64MOVWstore)
-		v.AuxInt = int32ToAuxInt(i - 3)
-		v.Aux = symToAux(s)
-		v0 := b.NewValue0(x2.Pos, OpARM64REVW, w.Type)
-		v0.AddArg(w)
-		v.AddArg3(ptr, v0, mem)
-		return true
-	}
-	// match: (MOVBstore [3] {s} p w x0:(MOVBstore [2] {s} p (SRLconst [8] w) x1:(MOVBstore [1] {s} p1:(ADD ptr1 idx1) (SRLconst [16] w) x2:(MOVBstoreidx ptr0 idx0 (SRLconst [24] w) mem))))
-	// cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0, x1, x2)
-	// result: (MOVWstoreidx ptr0 idx0 (REVW <w.Type> w) mem)
-	for {
-		if auxIntToInt32(v.AuxInt) != 3 {
-			break
-		}
-		s := auxToSym(v.Aux)
-		p := v_0
-		w := v_1
-		x0 := v_2
-		if x0.Op != OpARM64MOVBstore || auxIntToInt32(x0.AuxInt) != 2 || auxToSym(x0.Aux) != s {
-			break
-		}
-		_ = x0.Args[2]
-		if p != x0.Args[0] {
-			break
-		}
-		x0_1 := x0.Args[1]
-		if x0_1.Op != OpARM64SRLconst || auxIntToInt64(x0_1.AuxInt) != 8 || w != x0_1.Args[0] {
-			break
-		}
-		x1 := x0.Args[2]
-		if x1.Op != OpARM64MOVBstore || auxIntToInt32(x1.AuxInt) != 1 || auxToSym(x1.Aux) != s {
-			break
-		}
-		_ = x1.Args[2]
-		p1 := x1.Args[0]
-		if p1.Op != OpARM64ADD {
-			break
-		}
-		_ = p1.Args[1]
-		p1_0 := p1.Args[0]
-		p1_1 := p1.Args[1]
-		for _i0 := 0; _i0 <= 1; _i0, p1_0, p1_1 = _i0+1, p1_1, p1_0 {
-			ptr1 := p1_0
-			idx1 := p1_1
-			x1_1 := x1.Args[1]
-			if x1_1.Op != OpARM64SRLconst || auxIntToInt64(x1_1.AuxInt) != 16 || w != x1_1.Args[0] {
-				continue
-			}
-			x2 := x1.Args[2]
-			if x2.Op != OpARM64MOVBstoreidx {
-				continue
-			}
-			mem := x2.Args[3]
-			ptr0 := x2.Args[0]
-			idx0 := x2.Args[1]
-			x2_2 := x2.Args[2]
-			if x2_2.Op != OpARM64SRLconst || auxIntToInt64(x2_2.AuxInt) != 24 || w != x2_2.Args[0] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0, x1, x2)) {
-				continue
-			}
-			v.reset(OpARM64MOVWstoreidx)
-			v0 := b.NewValue0(x1.Pos, OpARM64REVW, w.Type)
-			v0.AddArg(w)
-			v.AddArg4(ptr0, idx0, v0, mem)
-			return true
-		}
-		break
-	}
-	// match: (MOVBstore [i] {s} ptr w x:(MOVBstore [i-1] {s} ptr (SRLconst [8] w) mem))
-	// cond: x.Uses == 1 && clobber(x)
-	// result: (MOVHstore [i-1] {s} ptr (REV16W <w.Type> w) mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		ptr := v_0
-		w := v_1
-		x := v_2
-		if x.Op != OpARM64MOVBstore || auxIntToInt32(x.AuxInt) != i-1 || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		if ptr != x.Args[0] {
-			break
-		}
-		x_1 := x.Args[1]
-		if x_1.Op != OpARM64SRLconst || auxIntToInt64(x_1.AuxInt) != 8 || w != x_1.Args[0] || !(x.Uses == 1 && clobber(x)) {
-			break
-		}
-		v.reset(OpARM64MOVHstore)
-		v.AuxInt = int32ToAuxInt(i - 1)
-		v.Aux = symToAux(s)
-		v0 := b.NewValue0(x.Pos, OpARM64REV16W, w.Type)
-		v0.AddArg(w)
-		v.AddArg3(ptr, v0, mem)
-		return true
-	}
-	// match: (MOVBstore [1] {s} (ADD ptr1 idx1) w x:(MOVBstoreidx ptr0 idx0 (SRLconst [8] w) mem))
-	// cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)
-	// result: (MOVHstoreidx ptr0 idx0 (REV16W <w.Type> w) mem)
-	for {
-		if auxIntToInt32(v.AuxInt) != 1 {
-			break
-		}
-		s := auxToSym(v.Aux)
-		if v_0.Op != OpARM64ADD {
-			break
-		}
-		_ = v_0.Args[1]
-		v_0_0 := v_0.Args[0]
-		v_0_1 := v_0.Args[1]
-		for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
-			ptr1 := v_0_0
-			idx1 := v_0_1
-			w := v_1
-			x := v_2
-			if x.Op != OpARM64MOVBstoreidx {
-				continue
-			}
-			mem := x.Args[3]
-			ptr0 := x.Args[0]
-			idx0 := x.Args[1]
-			x_2 := x.Args[2]
-			if x_2.Op != OpARM64SRLconst || auxIntToInt64(x_2.AuxInt) != 8 || w != x_2.Args[0] || !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) {
-				continue
-			}
-			v.reset(OpARM64MOVHstoreidx)
-			v0 := b.NewValue0(v.Pos, OpARM64REV16W, w.Type)
-			v0.AddArg(w)
-			v.AddArg4(ptr0, idx0, v0, mem)
-			return true
-		}
-		break
-	}
-	// match: (MOVBstore [i] {s} ptr w x:(MOVBstore [i-1] {s} ptr (UBFX [armBFAuxInt(8, 8)] w) mem))
-	// cond: x.Uses == 1 && clobber(x)
-	// result: (MOVHstore [i-1] {s} ptr (REV16W <w.Type> w) mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		ptr := v_0
-		w := v_1
-		x := v_2
-		if x.Op != OpARM64MOVBstore || auxIntToInt32(x.AuxInt) != i-1 || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		if ptr != x.Args[0] {
-			break
-		}
-		x_1 := x.Args[1]
-		if x_1.Op != OpARM64UBFX || auxIntToArm64BitField(x_1.AuxInt) != armBFAuxInt(8, 8) || w != x_1.Args[0] || !(x.Uses == 1 && clobber(x)) {
-			break
-		}
-		v.reset(OpARM64MOVHstore)
-		v.AuxInt = int32ToAuxInt(i - 1)
-		v.Aux = symToAux(s)
-		v0 := b.NewValue0(x.Pos, OpARM64REV16W, w.Type)
-		v0.AddArg(w)
-		v.AddArg3(ptr, v0, mem)
-		return true
-	}
-	// match: (MOVBstore [1] {s} (ADD ptr1 idx1) w x:(MOVBstoreidx ptr0 idx0 (UBFX [armBFAuxInt(8, 8)] w) mem))
-	// cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)
-	// result: (MOVHstoreidx ptr0 idx0 (REV16W <w.Type> w) mem)
-	for {
-		if auxIntToInt32(v.AuxInt) != 1 {
-			break
-		}
-		s := auxToSym(v.Aux)
-		if v_0.Op != OpARM64ADD {
-			break
-		}
-		_ = v_0.Args[1]
-		v_0_0 := v_0.Args[0]
-		v_0_1 := v_0.Args[1]
-		for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
-			ptr1 := v_0_0
-			idx1 := v_0_1
-			w := v_1
-			x := v_2
-			if x.Op != OpARM64MOVBstoreidx {
-				continue
-			}
-			mem := x.Args[3]
-			ptr0 := x.Args[0]
-			idx0 := x.Args[1]
-			x_2 := x.Args[2]
-			if x_2.Op != OpARM64UBFX || auxIntToArm64BitField(x_2.AuxInt) != armBFAuxInt(8, 8) || w != x_2.Args[0] || !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) {
-				continue
-			}
-			v.reset(OpARM64MOVHstoreidx)
-			v0 := b.NewValue0(v.Pos, OpARM64REV16W, w.Type)
-			v0.AddArg(w)
-			v.AddArg4(ptr0, idx0, v0, mem)
-			return true
-		}
-		break
-	}
-	// match: (MOVBstore [i] {s} ptr w x:(MOVBstore [i-1] {s} ptr (SRLconst [8] (MOVDreg w)) mem))
-	// cond: x.Uses == 1 && clobber(x)
-	// result: (MOVHstore [i-1] {s} ptr (REV16W <w.Type> w) mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		ptr := v_0
-		w := v_1
-		x := v_2
-		if x.Op != OpARM64MOVBstore || auxIntToInt32(x.AuxInt) != i-1 || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		if ptr != x.Args[0] {
-			break
-		}
-		x_1 := x.Args[1]
-		if x_1.Op != OpARM64SRLconst || auxIntToInt64(x_1.AuxInt) != 8 {
-			break
-		}
-		x_1_0 := x_1.Args[0]
-		if x_1_0.Op != OpARM64MOVDreg || w != x_1_0.Args[0] || !(x.Uses == 1 && clobber(x)) {
-			break
-		}
-		v.reset(OpARM64MOVHstore)
-		v.AuxInt = int32ToAuxInt(i - 1)
-		v.Aux = symToAux(s)
-		v0 := b.NewValue0(x.Pos, OpARM64REV16W, w.Type)
-		v0.AddArg(w)
-		v.AddArg3(ptr, v0, mem)
-		return true
-	}
-	// match: (MOVBstore [1] {s} (ADD ptr1 idx1) w x:(MOVBstoreidx ptr0 idx0 (SRLconst [8] (MOVDreg w)) mem))
-	// cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)
-	// result: (MOVHstoreidx ptr0 idx0 (REV16W <w.Type> w) mem)
-	for {
-		if auxIntToInt32(v.AuxInt) != 1 {
-			break
-		}
-		s := auxToSym(v.Aux)
-		if v_0.Op != OpARM64ADD {
-			break
-		}
-		_ = v_0.Args[1]
-		v_0_0 := v_0.Args[0]
-		v_0_1 := v_0.Args[1]
-		for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
-			ptr1 := v_0_0
-			idx1 := v_0_1
-			w := v_1
-			x := v_2
-			if x.Op != OpARM64MOVBstoreidx {
-				continue
-			}
-			mem := x.Args[3]
-			ptr0 := x.Args[0]
-			idx0 := x.Args[1]
-			x_2 := x.Args[2]
-			if x_2.Op != OpARM64SRLconst || auxIntToInt64(x_2.AuxInt) != 8 {
-				continue
-			}
-			x_2_0 := x_2.Args[0]
-			if x_2_0.Op != OpARM64MOVDreg || w != x_2_0.Args[0] || !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) {
-				continue
-			}
-			v.reset(OpARM64MOVHstoreidx)
-			v0 := b.NewValue0(v.Pos, OpARM64REV16W, w.Type)
-			v0.AddArg(w)
-			v.AddArg4(ptr0, idx0, v0, mem)
-			return true
-		}
-		break
-	}
-	// match: (MOVBstore [i] {s} ptr w x:(MOVBstore [i-1] {s} ptr (UBFX [armBFAuxInt(8, 24)] w) mem))
-	// cond: x.Uses == 1 && clobber(x)
-	// result: (MOVHstore [i-1] {s} ptr (REV16W <w.Type> w) mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		ptr := v_0
-		w := v_1
-		x := v_2
-		if x.Op != OpARM64MOVBstore || auxIntToInt32(x.AuxInt) != i-1 || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		if ptr != x.Args[0] {
-			break
-		}
-		x_1 := x.Args[1]
-		if x_1.Op != OpARM64UBFX || auxIntToArm64BitField(x_1.AuxInt) != armBFAuxInt(8, 24) || w != x_1.Args[0] || !(x.Uses == 1 && clobber(x)) {
-			break
-		}
-		v.reset(OpARM64MOVHstore)
-		v.AuxInt = int32ToAuxInt(i - 1)
-		v.Aux = symToAux(s)
-		v0 := b.NewValue0(x.Pos, OpARM64REV16W, w.Type)
-		v0.AddArg(w)
-		v.AddArg3(ptr, v0, mem)
-		return true
-	}
-	// match: (MOVBstore [1] {s} (ADD ptr1 idx1) w x:(MOVBstoreidx ptr0 idx0 (UBFX [armBFAuxInt(8, 24)] w) mem))
-	// cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)
-	// result: (MOVHstoreidx ptr0 idx0 (REV16W <w.Type> w) mem)
-	for {
-		if auxIntToInt32(v.AuxInt) != 1 {
-			break
-		}
-		s := auxToSym(v.Aux)
-		if v_0.Op != OpARM64ADD {
-			break
-		}
-		_ = v_0.Args[1]
-		v_0_0 := v_0.Args[0]
-		v_0_1 := v_0.Args[1]
-		for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
-			ptr1 := v_0_0
-			idx1 := v_0_1
-			w := v_1
-			x := v_2
-			if x.Op != OpARM64MOVBstoreidx {
-				continue
-			}
-			mem := x.Args[3]
-			ptr0 := x.Args[0]
-			idx0 := x.Args[1]
-			x_2 := x.Args[2]
-			if x_2.Op != OpARM64UBFX || auxIntToArm64BitField(x_2.AuxInt) != armBFAuxInt(8, 24) || w != x_2.Args[0] || !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) {
-				continue
-			}
-			v.reset(OpARM64MOVHstoreidx)
-			v0 := b.NewValue0(v.Pos, OpARM64REV16W, w.Type)
-			v0.AddArg(w)
-			v.AddArg4(ptr0, idx0, v0, mem)
-			return true
-		}
-		break
-	}
 	return false
 }
 func rewriteValueARM64_OpARM64MOVBstoreidx(v *Value) bool {
@@ -9819,7 +8946,6 @@
 	v_2 := v.Args[2]
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
-	b := v.Block
 	// match: (MOVBstoreidx ptr (MOVDconst [c]) val mem)
 	// cond: is32Bit(c)
 	// result: (MOVBstore [int32(c)] ptr val mem)
@@ -9955,212 +9081,15 @@
 		v.AddArg4(ptr, idx, x, mem)
 		return true
 	}
-	// match: (MOVBstoreidx ptr (ADDconst [1] idx) (SRLconst [8] w) x:(MOVBstoreidx ptr idx w mem))
-	// cond: x.Uses == 1 && clobber(x)
-	// result: (MOVHstoreidx ptr idx w mem)
-	for {
-		ptr := v_0
-		if v_1.Op != OpARM64ADDconst || auxIntToInt64(v_1.AuxInt) != 1 {
-			break
-		}
-		idx := v_1.Args[0]
-		if v_2.Op != OpARM64SRLconst || auxIntToInt64(v_2.AuxInt) != 8 {
-			break
-		}
-		w := v_2.Args[0]
-		x := v_3
-		if x.Op != OpARM64MOVBstoreidx {
-			break
-		}
-		mem := x.Args[3]
-		if ptr != x.Args[0] || idx != x.Args[1] || w != x.Args[2] || !(x.Uses == 1 && clobber(x)) {
-			break
-		}
-		v.reset(OpARM64MOVHstoreidx)
-		v.AddArg4(ptr, idx, w, mem)
-		return true
-	}
-	// match: (MOVBstoreidx ptr (ADDconst [3] idx) w x0:(MOVBstoreidx ptr (ADDconst [2] idx) (UBFX [armBFAuxInt(8, 24)] w) x1:(MOVBstoreidx ptr (ADDconst [1] idx) (UBFX [armBFAuxInt(16, 16)] w) x2:(MOVBstoreidx ptr idx (UBFX [armBFAuxInt(24, 8)] w) mem))))
-	// cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && clobber(x0, x1, x2)
-	// result: (MOVWstoreidx ptr idx (REVW <w.Type> w) mem)
-	for {
-		ptr := v_0
-		if v_1.Op != OpARM64ADDconst || auxIntToInt64(v_1.AuxInt) != 3 {
-			break
-		}
-		idx := v_1.Args[0]
-		w := v_2
-		x0 := v_3
-		if x0.Op != OpARM64MOVBstoreidx {
-			break
-		}
-		_ = x0.Args[3]
-		if ptr != x0.Args[0] {
-			break
-		}
-		x0_1 := x0.Args[1]
-		if x0_1.Op != OpARM64ADDconst || auxIntToInt64(x0_1.AuxInt) != 2 || idx != x0_1.Args[0] {
-			break
-		}
-		x0_2 := x0.Args[2]
-		if x0_2.Op != OpARM64UBFX || auxIntToArm64BitField(x0_2.AuxInt) != armBFAuxInt(8, 24) || w != x0_2.Args[0] {
-			break
-		}
-		x1 := x0.Args[3]
-		if x1.Op != OpARM64MOVBstoreidx {
-			break
-		}
-		_ = x1.Args[3]
-		if ptr != x1.Args[0] {
-			break
-		}
-		x1_1 := x1.Args[1]
-		if x1_1.Op != OpARM64ADDconst || auxIntToInt64(x1_1.AuxInt) != 1 || idx != x1_1.Args[0] {
-			break
-		}
-		x1_2 := x1.Args[2]
-		if x1_2.Op != OpARM64UBFX || auxIntToArm64BitField(x1_2.AuxInt) != armBFAuxInt(16, 16) || w != x1_2.Args[0] {
-			break
-		}
-		x2 := x1.Args[3]
-		if x2.Op != OpARM64MOVBstoreidx {
-			break
-		}
-		mem := x2.Args[3]
-		if ptr != x2.Args[0] || idx != x2.Args[1] {
-			break
-		}
-		x2_2 := x2.Args[2]
-		if x2_2.Op != OpARM64UBFX || auxIntToArm64BitField(x2_2.AuxInt) != armBFAuxInt(24, 8) || w != x2_2.Args[0] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && clobber(x0, x1, x2)) {
-			break
-		}
-		v.reset(OpARM64MOVWstoreidx)
-		v0 := b.NewValue0(v.Pos, OpARM64REVW, w.Type)
-		v0.AddArg(w)
-		v.AddArg4(ptr, idx, v0, mem)
-		return true
-	}
-	// match: (MOVBstoreidx ptr idx w x0:(MOVBstoreidx ptr (ADDconst [1] idx) (UBFX [armBFAuxInt(8, 24)] w) x1:(MOVBstoreidx ptr (ADDconst [2] idx) (UBFX [armBFAuxInt(16, 16)] w) x2:(MOVBstoreidx ptr (ADDconst [3] idx) (UBFX [armBFAuxInt(24, 8)] w) mem))))
-	// cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && clobber(x0, x1, x2)
-	// result: (MOVWstoreidx ptr idx w mem)
-	for {
-		ptr := v_0
-		idx := v_1
-		w := v_2
-		x0 := v_3
-		if x0.Op != OpARM64MOVBstoreidx {
-			break
-		}
-		_ = x0.Args[3]
-		if ptr != x0.Args[0] {
-			break
-		}
-		x0_1 := x0.Args[1]
-		if x0_1.Op != OpARM64ADDconst || auxIntToInt64(x0_1.AuxInt) != 1 || idx != x0_1.Args[0] {
-			break
-		}
-		x0_2 := x0.Args[2]
-		if x0_2.Op != OpARM64UBFX || auxIntToArm64BitField(x0_2.AuxInt) != armBFAuxInt(8, 24) || w != x0_2.Args[0] {
-			break
-		}
-		x1 := x0.Args[3]
-		if x1.Op != OpARM64MOVBstoreidx {
-			break
-		}
-		_ = x1.Args[3]
-		if ptr != x1.Args[0] {
-			break
-		}
-		x1_1 := x1.Args[1]
-		if x1_1.Op != OpARM64ADDconst || auxIntToInt64(x1_1.AuxInt) != 2 || idx != x1_1.Args[0] {
-			break
-		}
-		x1_2 := x1.Args[2]
-		if x1_2.Op != OpARM64UBFX || auxIntToArm64BitField(x1_2.AuxInt) != armBFAuxInt(16, 16) || w != x1_2.Args[0] {
-			break
-		}
-		x2 := x1.Args[3]
-		if x2.Op != OpARM64MOVBstoreidx {
-			break
-		}
-		mem := x2.Args[3]
-		if ptr != x2.Args[0] {
-			break
-		}
-		x2_1 := x2.Args[1]
-		if x2_1.Op != OpARM64ADDconst || auxIntToInt64(x2_1.AuxInt) != 3 || idx != x2_1.Args[0] {
-			break
-		}
-		x2_2 := x2.Args[2]
-		if x2_2.Op != OpARM64UBFX || auxIntToArm64BitField(x2_2.AuxInt) != armBFAuxInt(24, 8) || w != x2_2.Args[0] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && clobber(x0, x1, x2)) {
-			break
-		}
-		v.reset(OpARM64MOVWstoreidx)
-		v.AddArg4(ptr, idx, w, mem)
-		return true
-	}
-	// match: (MOVBstoreidx ptr (ADDconst [1] idx) w x:(MOVBstoreidx ptr idx (UBFX [armBFAuxInt(8, 8)] w) mem))
-	// cond: x.Uses == 1 && clobber(x)
-	// result: (MOVHstoreidx ptr idx (REV16W <w.Type> w) mem)
-	for {
-		ptr := v_0
-		if v_1.Op != OpARM64ADDconst || auxIntToInt64(v_1.AuxInt) != 1 {
-			break
-		}
-		idx := v_1.Args[0]
-		w := v_2
-		x := v_3
-		if x.Op != OpARM64MOVBstoreidx {
-			break
-		}
-		mem := x.Args[3]
-		if ptr != x.Args[0] || idx != x.Args[1] {
-			break
-		}
-		x_2 := x.Args[2]
-		if x_2.Op != OpARM64UBFX || auxIntToArm64BitField(x_2.AuxInt) != armBFAuxInt(8, 8) || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) {
-			break
-		}
-		v.reset(OpARM64MOVHstoreidx)
-		v0 := b.NewValue0(v.Pos, OpARM64REV16W, w.Type)
-		v0.AddArg(w)
-		v.AddArg4(ptr, idx, v0, mem)
-		return true
-	}
-	// match: (MOVBstoreidx ptr idx w x:(MOVBstoreidx ptr (ADDconst [1] idx) (UBFX [armBFAuxInt(8, 8)] w) mem))
-	// cond: x.Uses == 1 && clobber(x)
-	// result: (MOVHstoreidx ptr idx w mem)
-	for {
-		ptr := v_0
-		idx := v_1
-		w := v_2
-		x := v_3
-		if x.Op != OpARM64MOVBstoreidx {
-			break
-		}
-		mem := x.Args[3]
-		if ptr != x.Args[0] {
-			break
-		}
-		x_1 := x.Args[1]
-		if x_1.Op != OpARM64ADDconst || auxIntToInt64(x_1.AuxInt) != 1 || idx != x_1.Args[0] {
-			break
-		}
-		x_2 := x.Args[2]
-		if x_2.Op != OpARM64UBFX || auxIntToArm64BitField(x_2.AuxInt) != armBFAuxInt(8, 8) || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) {
-			break
-		}
-		v.reset(OpARM64MOVHstoreidx)
-		v.AddArg4(ptr, idx, w, mem)
-		return true
-	}
 	return false
 }
 func rewriteValueARM64_OpARM64MOVBstorezero(v *Value) bool {
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
+	b := v.Block
+	config := b.Func.Config
 	// match: (MOVBstorezero [off1] {sym} (ADDconst [off2] ptr) mem)
-	// cond: is32Bit(int64(off1)+off2)
+	// cond: is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
 	// result: (MOVBstorezero [off1+int32(off2)] {sym} ptr mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -10171,7 +9100,7 @@
 		off2 := auxIntToInt64(v_0.AuxInt)
 		ptr := v_0.Args[0]
 		mem := v_1
-		if !(is32Bit(int64(off1) + off2)) {
+		if !(is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
 			break
 		}
 		v.reset(OpARM64MOVBstorezero)
@@ -10181,7 +9110,7 @@
 		return true
 	}
 	// match: (MOVBstorezero [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem)
-	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
 	// result: (MOVBstorezero [off1+off2] {mergeSym(sym1,sym2)} ptr mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -10193,7 +9122,7 @@
 		sym2 := auxToSym(v_0.Aux)
 		ptr := v_0.Args[0]
 		mem := v_1
-		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) {
+		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
 			break
 		}
 		v.reset(OpARM64MOVBstorezero)
@@ -10221,65 +9150,6 @@
 		v.AddArg3(ptr, idx, mem)
 		return true
 	}
-	// match: (MOVBstorezero [i] {s} ptr0 x:(MOVBstorezero [j] {s} ptr1 mem))
-	// cond: x.Uses == 1 && areAdjacentOffsets(int64(i),int64(j),1) && isSamePtr(ptr0, ptr1) && clobber(x)
-	// result: (MOVHstorezero [int32(min(int64(i),int64(j)))] {s} ptr0 mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		ptr0 := v_0
-		x := v_1
-		if x.Op != OpARM64MOVBstorezero {
-			break
-		}
-		j := auxIntToInt32(x.AuxInt)
-		if auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[1]
-		ptr1 := x.Args[0]
-		if !(x.Uses == 1 && areAdjacentOffsets(int64(i), int64(j), 1) && isSamePtr(ptr0, ptr1) && clobber(x)) {
-			break
-		}
-		v.reset(OpARM64MOVHstorezero)
-		v.AuxInt = int32ToAuxInt(int32(min(int64(i), int64(j))))
-		v.Aux = symToAux(s)
-		v.AddArg2(ptr0, mem)
-		return true
-	}
-	// match: (MOVBstorezero [1] {s} (ADD ptr0 idx0) x:(MOVBstorezeroidx ptr1 idx1 mem))
-	// cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)
-	// result: (MOVHstorezeroidx ptr1 idx1 mem)
-	for {
-		if auxIntToInt32(v.AuxInt) != 1 {
-			break
-		}
-		s := auxToSym(v.Aux)
-		if v_0.Op != OpARM64ADD {
-			break
-		}
-		_ = v_0.Args[1]
-		v_0_0 := v_0.Args[0]
-		v_0_1 := v_0.Args[1]
-		for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
-			ptr0 := v_0_0
-			idx0 := v_0_1
-			x := v_1
-			if x.Op != OpARM64MOVBstorezeroidx {
-				continue
-			}
-			mem := x.Args[2]
-			ptr1 := x.Args[0]
-			idx1 := x.Args[1]
-			if !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) {
-				continue
-			}
-			v.reset(OpARM64MOVHstorezeroidx)
-			v.AddArg3(ptr1, idx1, mem)
-			return true
-		}
-		break
-	}
 	return false
 }
 func rewriteValueARM64_OpARM64MOVBstorezeroidx(v *Value) bool {
@@ -10322,27 +9192,6 @@
 		v.AddArg2(idx, mem)
 		return true
 	}
-	// match: (MOVBstorezeroidx ptr (ADDconst [1] idx) x:(MOVBstorezeroidx ptr idx mem))
-	// cond: x.Uses == 1 && clobber(x)
-	// result: (MOVHstorezeroidx ptr idx mem)
-	for {
-		ptr := v_0
-		if v_1.Op != OpARM64ADDconst || auxIntToInt64(v_1.AuxInt) != 1 {
-			break
-		}
-		idx := v_1.Args[0]
-		x := v_2
-		if x.Op != OpARM64MOVBstorezeroidx {
-			break
-		}
-		mem := x.Args[2]
-		if ptr != x.Args[0] || idx != x.Args[1] || !(x.Uses == 1 && clobber(x)) {
-			break
-		}
-		v.reset(OpARM64MOVHstorezeroidx)
-		v.AddArg3(ptr, idx, mem)
-		return true
-	}
 	return false
 }
 func rewriteValueARM64_OpARM64MOVDload(v *Value) bool {
@@ -10368,7 +9217,7 @@
 		return true
 	}
 	// match: (MOVDload [off1] {sym} (ADDconst [off2] ptr) mem)
-	// cond: is32Bit(int64(off1)+off2)
+	// cond: is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
 	// result: (MOVDload [off1+int32(off2)] {sym} ptr mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -10379,7 +9228,7 @@
 		off2 := auxIntToInt64(v_0.AuxInt)
 		ptr := v_0.Args[0]
 		mem := v_1
-		if !(is32Bit(int64(off1) + off2)) {
+		if !(is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
 			break
 		}
 		v.reset(OpARM64MOVDload)
@@ -10427,7 +9276,7 @@
 		return true
 	}
 	// match: (MOVDload [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem)
-	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
 	// result: (MOVDload [off1+off2] {mergeSym(sym1,sym2)} ptr mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -10439,7 +9288,7 @@
 		sym2 := auxToSym(v_0.Aux)
 		ptr := v_0.Args[0]
 		mem := v_1
-		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) {
+		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
 			break
 		}
 		v.reset(OpARM64MOVDload)
@@ -10657,6 +9506,8 @@
 	v_2 := v.Args[2]
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
+	b := v.Block
+	config := b.Func.Config
 	// match: (MOVDstore [off] {sym} ptr (FMOVDfpgp val) mem)
 	// result: (FMOVDstore [off] {sym} ptr val mem)
 	for {
@@ -10675,7 +9526,7 @@
 		return true
 	}
 	// match: (MOVDstore [off1] {sym} (ADDconst [off2] ptr) val mem)
-	// cond: is32Bit(int64(off1)+off2)
+	// cond: is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
 	// result: (MOVDstore [off1+int32(off2)] {sym} ptr val mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -10687,7 +9538,7 @@
 		ptr := v_0.Args[0]
 		val := v_1
 		mem := v_2
-		if !(is32Bit(int64(off1) + off2)) {
+		if !(is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
 			break
 		}
 		v.reset(OpARM64MOVDstore)
@@ -10737,7 +9588,7 @@
 		return true
 	}
 	// match: (MOVDstore [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) val mem)
-	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
 	// result: (MOVDstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -10750,7 +9601,7 @@
 		ptr := v_0.Args[0]
 		val := v_1
 		mem := v_2
-		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) {
+		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
 			break
 		}
 		v.reset(OpARM64MOVDstore)
@@ -10905,8 +9756,52 @@
 func rewriteValueARM64_OpARM64MOVDstorezero(v *Value) bool {
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
+	b := v.Block
+	config := b.Func.Config
+	// match: (MOVDstorezero {s} [i] ptr x:(MOVDstorezero {s} [i+8] ptr mem))
+	// cond: x.Uses == 1 && clobber(x)
+	// result: (MOVQstorezero {s} [i] ptr mem)
+	for {
+		i := auxIntToInt32(v.AuxInt)
+		s := auxToSym(v.Aux)
+		ptr := v_0
+		x := v_1
+		if x.Op != OpARM64MOVDstorezero || auxIntToInt32(x.AuxInt) != i+8 || auxToSym(x.Aux) != s {
+			break
+		}
+		mem := x.Args[1]
+		if ptr != x.Args[0] || !(x.Uses == 1 && clobber(x)) {
+			break
+		}
+		v.reset(OpARM64MOVQstorezero)
+		v.AuxInt = int32ToAuxInt(i)
+		v.Aux = symToAux(s)
+		v.AddArg2(ptr, mem)
+		return true
+	}
+	// match: (MOVDstorezero {s} [i] ptr x:(MOVDstorezero {s} [i-8] ptr mem))
+	// cond: x.Uses == 1 && clobber(x)
+	// result: (MOVQstorezero {s} [i-8] ptr mem)
+	for {
+		i := auxIntToInt32(v.AuxInt)
+		s := auxToSym(v.Aux)
+		ptr := v_0
+		x := v_1
+		if x.Op != OpARM64MOVDstorezero || auxIntToInt32(x.AuxInt) != i-8 || auxToSym(x.Aux) != s {
+			break
+		}
+		mem := x.Args[1]
+		if ptr != x.Args[0] || !(x.Uses == 1 && clobber(x)) {
+			break
+		}
+		v.reset(OpARM64MOVQstorezero)
+		v.AuxInt = int32ToAuxInt(i - 8)
+		v.Aux = symToAux(s)
+		v.AddArg2(ptr, mem)
+		return true
+	}
 	// match: (MOVDstorezero [off1] {sym} (ADDconst [off2] ptr) mem)
-	// cond: is32Bit(int64(off1)+off2)
+	// cond: is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
 	// result: (MOVDstorezero [off1+int32(off2)] {sym} ptr mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -10917,7 +9812,7 @@
 		off2 := auxIntToInt64(v_0.AuxInt)
 		ptr := v_0.Args[0]
 		mem := v_1
-		if !(is32Bit(int64(off1) + off2)) {
+		if !(is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
 			break
 		}
 		v.reset(OpARM64MOVDstorezero)
@@ -10927,7 +9822,7 @@
 		return true
 	}
 	// match: (MOVDstorezero [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem)
-	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
 	// result: (MOVDstorezero [off1+off2] {mergeSym(sym1,sym2)} ptr mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -10939,7 +9834,7 @@
 		sym2 := auxToSym(v_0.Aux)
 		ptr := v_0.Args[0]
 		mem := v_1
-		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) {
+		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
 			break
 		}
 		v.reset(OpARM64MOVDstorezero)
@@ -10986,98 +9881,6 @@
 		v.AddArg3(ptr, idx, mem)
 		return true
 	}
-	// match: (MOVDstorezero [i] {s} ptr0 x:(MOVDstorezero [j] {s} ptr1 mem))
-	// cond: x.Uses == 1 && areAdjacentOffsets(int64(i),int64(j),8) && isSamePtr(ptr0, ptr1) && clobber(x)
-	// result: (MOVQstorezero [int32(min(int64(i),int64(j)))] {s} ptr0 mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		ptr0 := v_0
-		x := v_1
-		if x.Op != OpARM64MOVDstorezero {
-			break
-		}
-		j := auxIntToInt32(x.AuxInt)
-		if auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[1]
-		ptr1 := x.Args[0]
-		if !(x.Uses == 1 && areAdjacentOffsets(int64(i), int64(j), 8) && isSamePtr(ptr0, ptr1) && clobber(x)) {
-			break
-		}
-		v.reset(OpARM64MOVQstorezero)
-		v.AuxInt = int32ToAuxInt(int32(min(int64(i), int64(j))))
-		v.Aux = symToAux(s)
-		v.AddArg2(ptr0, mem)
-		return true
-	}
-	// match: (MOVDstorezero [8] {s} p0:(ADD ptr0 idx0) x:(MOVDstorezeroidx ptr1 idx1 mem))
-	// cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)
-	// result: (MOVQstorezero [0] {s} p0 mem)
-	for {
-		if auxIntToInt32(v.AuxInt) != 8 {
-			break
-		}
-		s := auxToSym(v.Aux)
-		p0 := v_0
-		if p0.Op != OpARM64ADD {
-			break
-		}
-		_ = p0.Args[1]
-		p0_0 := p0.Args[0]
-		p0_1 := p0.Args[1]
-		for _i0 := 0; _i0 <= 1; _i0, p0_0, p0_1 = _i0+1, p0_1, p0_0 {
-			ptr0 := p0_0
-			idx0 := p0_1
-			x := v_1
-			if x.Op != OpARM64MOVDstorezeroidx {
-				continue
-			}
-			mem := x.Args[2]
-			ptr1 := x.Args[0]
-			idx1 := x.Args[1]
-			if !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) {
-				continue
-			}
-			v.reset(OpARM64MOVQstorezero)
-			v.AuxInt = int32ToAuxInt(0)
-			v.Aux = symToAux(s)
-			v.AddArg2(p0, mem)
-			return true
-		}
-		break
-	}
-	// match: (MOVDstorezero [8] {s} p0:(ADDshiftLL [3] ptr0 idx0) x:(MOVDstorezeroidx8 ptr1 idx1 mem))
-	// cond: x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x)
-	// result: (MOVQstorezero [0] {s} p0 mem)
-	for {
-		if auxIntToInt32(v.AuxInt) != 8 {
-			break
-		}
-		s := auxToSym(v.Aux)
-		p0 := v_0
-		if p0.Op != OpARM64ADDshiftLL || auxIntToInt64(p0.AuxInt) != 3 {
-			break
-		}
-		idx0 := p0.Args[1]
-		ptr0 := p0.Args[0]
-		x := v_1
-		if x.Op != OpARM64MOVDstorezeroidx8 {
-			break
-		}
-		mem := x.Args[2]
-		ptr1 := x.Args[0]
-		idx1 := x.Args[1]
-		if !(x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x)) {
-			break
-		}
-		v.reset(OpARM64MOVQstorezero)
-		v.AuxInt = int32ToAuxInt(0)
-		v.Aux = symToAux(s)
-		v.AddArg2(p0, mem)
-		return true
-	}
 	return false
 }
 func rewriteValueARM64_OpARM64MOVDstorezeroidx(v *Value) bool {
@@ -11178,7 +9981,7 @@
 	b := v.Block
 	config := b.Func.Config
 	// match: (MOVHUload [off1] {sym} (ADDconst [off2] ptr) mem)
-	// cond: is32Bit(int64(off1)+off2)
+	// cond: is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
 	// result: (MOVHUload [off1+int32(off2)] {sym} ptr mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -11189,7 +9992,7 @@
 		off2 := auxIntToInt64(v_0.AuxInt)
 		ptr := v_0.Args[0]
 		mem := v_1
-		if !(is32Bit(int64(off1) + off2)) {
+		if !(is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
 			break
 		}
 		v.reset(OpARM64MOVHUload)
@@ -11237,7 +10040,7 @@
 		return true
 	}
 	// match: (MOVHUload [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem)
-	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
 	// result: (MOVHUload [off1+off2] {mergeSym(sym1,sym2)} ptr mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -11249,7 +10052,7 @@
 		sym2 := auxToSym(v_0.Aux)
 		ptr := v_0.Args[0]
 		mem := v_1
-		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) {
+		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
 			break
 		}
 		v.reset(OpARM64MOVHUload)
@@ -11614,8 +10417,10 @@
 func rewriteValueARM64_OpARM64MOVHload(v *Value) bool {
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
+	b := v.Block
+	config := b.Func.Config
 	// match: (MOVHload [off1] {sym} (ADDconst [off2] ptr) mem)
-	// cond: is32Bit(int64(off1)+off2)
+	// cond: is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
 	// result: (MOVHload [off1+int32(off2)] {sym} ptr mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -11626,7 +10431,7 @@
 		off2 := auxIntToInt64(v_0.AuxInt)
 		ptr := v_0.Args[0]
 		mem := v_1
-		if !(is32Bit(int64(off1) + off2)) {
+		if !(is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
 			break
 		}
 		v.reset(OpARM64MOVHload)
@@ -11674,7 +10479,7 @@
 		return true
 	}
 	// match: (MOVHload [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem)
-	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
 	// result: (MOVHload [off1+off2] {mergeSym(sym1,sym2)} ptr mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -11686,7 +10491,7 @@
 		sym2 := auxToSym(v_0.Aux)
 		ptr := v_0.Args[0]
 		mem := v_1
-		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) {
+		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
 			break
 		}
 		v.reset(OpARM64MOVHload)
@@ -12028,8 +10833,9 @@
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
 	b := v.Block
+	config := b.Func.Config
 	// match: (MOVHstore [off1] {sym} (ADDconst [off2] ptr) val mem)
-	// cond: is32Bit(int64(off1)+off2)
+	// cond: is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
 	// result: (MOVHstore [off1+int32(off2)] {sym} ptr val mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -12041,7 +10847,7 @@
 		ptr := v_0.Args[0]
 		val := v_1
 		mem := v_2
-		if !(is32Bit(int64(off1) + off2)) {
+		if !(is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
 			break
 		}
 		v.reset(OpARM64MOVHstore)
@@ -12091,7 +10897,7 @@
 		return true
 	}
 	// match: (MOVHstore [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) val mem)
-	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
 	// result: (MOVHstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -12104,7 +10910,7 @@
 		ptr := v_0.Args[0]
 		val := v_1
 		mem := v_2
-		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) {
+		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
 			break
 		}
 		v.reset(OpARM64MOVHstore)
@@ -12197,412 +11003,6 @@
 		v.AddArg3(ptr, x, mem)
 		return true
 	}
-	// match: (MOVHstore [i] {s} ptr0 (SRLconst [16] w) x:(MOVHstore [i-2] {s} ptr1 w mem))
-	// cond: x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x)
-	// result: (MOVWstore [i-2] {s} ptr0 w mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		ptr0 := v_0
-		if v_1.Op != OpARM64SRLconst || auxIntToInt64(v_1.AuxInt) != 16 {
-			break
-		}
-		w := v_1.Args[0]
-		x := v_2
-		if x.Op != OpARM64MOVHstore || auxIntToInt32(x.AuxInt) != i-2 || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		ptr1 := x.Args[0]
-		if w != x.Args[1] || !(x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x)) {
-			break
-		}
-		v.reset(OpARM64MOVWstore)
-		v.AuxInt = int32ToAuxInt(i - 2)
-		v.Aux = symToAux(s)
-		v.AddArg3(ptr0, w, mem)
-		return true
-	}
-	// match: (MOVHstore [2] {s} (ADD ptr0 idx0) (SRLconst [16] w) x:(MOVHstoreidx ptr1 idx1 w mem))
-	// cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)
-	// result: (MOVWstoreidx ptr1 idx1 w mem)
-	for {
-		if auxIntToInt32(v.AuxInt) != 2 {
-			break
-		}
-		s := auxToSym(v.Aux)
-		if v_0.Op != OpARM64ADD {
-			break
-		}
-		_ = v_0.Args[1]
-		v_0_0 := v_0.Args[0]
-		v_0_1 := v_0.Args[1]
-		for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
-			ptr0 := v_0_0
-			idx0 := v_0_1
-			if v_1.Op != OpARM64SRLconst || auxIntToInt64(v_1.AuxInt) != 16 {
-				continue
-			}
-			w := v_1.Args[0]
-			x := v_2
-			if x.Op != OpARM64MOVHstoreidx {
-				continue
-			}
-			mem := x.Args[3]
-			ptr1 := x.Args[0]
-			idx1 := x.Args[1]
-			if w != x.Args[2] || !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) {
-				continue
-			}
-			v.reset(OpARM64MOVWstoreidx)
-			v.AddArg4(ptr1, idx1, w, mem)
-			return true
-		}
-		break
-	}
-	// match: (MOVHstore [2] {s} (ADDshiftLL [1] ptr0 idx0) (SRLconst [16] w) x:(MOVHstoreidx2 ptr1 idx1 w mem))
-	// cond: x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x)
-	// result: (MOVWstoreidx ptr1 (SLLconst <idx1.Type> [1] idx1) w mem)
-	for {
-		if auxIntToInt32(v.AuxInt) != 2 {
-			break
-		}
-		s := auxToSym(v.Aux)
-		if v_0.Op != OpARM64ADDshiftLL || auxIntToInt64(v_0.AuxInt) != 1 {
-			break
-		}
-		idx0 := v_0.Args[1]
-		ptr0 := v_0.Args[0]
-		if v_1.Op != OpARM64SRLconst || auxIntToInt64(v_1.AuxInt) != 16 {
-			break
-		}
-		w := v_1.Args[0]
-		x := v_2
-		if x.Op != OpARM64MOVHstoreidx2 {
-			break
-		}
-		mem := x.Args[3]
-		ptr1 := x.Args[0]
-		idx1 := x.Args[1]
-		if w != x.Args[2] || !(x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x)) {
-			break
-		}
-		v.reset(OpARM64MOVWstoreidx)
-		v0 := b.NewValue0(v.Pos, OpARM64SLLconst, idx1.Type)
-		v0.AuxInt = int64ToAuxInt(1)
-		v0.AddArg(idx1)
-		v.AddArg4(ptr1, v0, w, mem)
-		return true
-	}
-	// match: (MOVHstore [i] {s} ptr0 (UBFX [armBFAuxInt(16, 16)] w) x:(MOVHstore [i-2] {s} ptr1 w mem))
-	// cond: x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x)
-	// result: (MOVWstore [i-2] {s} ptr0 w mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		ptr0 := v_0
-		if v_1.Op != OpARM64UBFX || auxIntToArm64BitField(v_1.AuxInt) != armBFAuxInt(16, 16) {
-			break
-		}
-		w := v_1.Args[0]
-		x := v_2
-		if x.Op != OpARM64MOVHstore || auxIntToInt32(x.AuxInt) != i-2 || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		ptr1 := x.Args[0]
-		if w != x.Args[1] || !(x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x)) {
-			break
-		}
-		v.reset(OpARM64MOVWstore)
-		v.AuxInt = int32ToAuxInt(i - 2)
-		v.Aux = symToAux(s)
-		v.AddArg3(ptr0, w, mem)
-		return true
-	}
-	// match: (MOVHstore [2] {s} (ADD ptr0 idx0) (UBFX [armBFAuxInt(16, 16)] w) x:(MOVHstoreidx ptr1 idx1 w mem))
-	// cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)
-	// result: (MOVWstoreidx ptr1 idx1 w mem)
-	for {
-		if auxIntToInt32(v.AuxInt) != 2 {
-			break
-		}
-		s := auxToSym(v.Aux)
-		if v_0.Op != OpARM64ADD {
-			break
-		}
-		_ = v_0.Args[1]
-		v_0_0 := v_0.Args[0]
-		v_0_1 := v_0.Args[1]
-		for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
-			ptr0 := v_0_0
-			idx0 := v_0_1
-			if v_1.Op != OpARM64UBFX || auxIntToArm64BitField(v_1.AuxInt) != armBFAuxInt(16, 16) {
-				continue
-			}
-			w := v_1.Args[0]
-			x := v_2
-			if x.Op != OpARM64MOVHstoreidx {
-				continue
-			}
-			mem := x.Args[3]
-			ptr1 := x.Args[0]
-			idx1 := x.Args[1]
-			if w != x.Args[2] || !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) {
-				continue
-			}
-			v.reset(OpARM64MOVWstoreidx)
-			v.AddArg4(ptr1, idx1, w, mem)
-			return true
-		}
-		break
-	}
-	// match: (MOVHstore [2] {s} (ADDshiftLL [1] ptr0 idx0) (UBFX [armBFAuxInt(16, 16)] w) x:(MOVHstoreidx2 ptr1 idx1 w mem))
-	// cond: x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x)
-	// result: (MOVWstoreidx ptr1 (SLLconst <idx1.Type> [1] idx1) w mem)
-	for {
-		if auxIntToInt32(v.AuxInt) != 2 {
-			break
-		}
-		s := auxToSym(v.Aux)
-		if v_0.Op != OpARM64ADDshiftLL || auxIntToInt64(v_0.AuxInt) != 1 {
-			break
-		}
-		idx0 := v_0.Args[1]
-		ptr0 := v_0.Args[0]
-		if v_1.Op != OpARM64UBFX || auxIntToArm64BitField(v_1.AuxInt) != armBFAuxInt(16, 16) {
-			break
-		}
-		w := v_1.Args[0]
-		x := v_2
-		if x.Op != OpARM64MOVHstoreidx2 {
-			break
-		}
-		mem := x.Args[3]
-		ptr1 := x.Args[0]
-		idx1 := x.Args[1]
-		if w != x.Args[2] || !(x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x)) {
-			break
-		}
-		v.reset(OpARM64MOVWstoreidx)
-		v0 := b.NewValue0(v.Pos, OpARM64SLLconst, idx1.Type)
-		v0.AuxInt = int64ToAuxInt(1)
-		v0.AddArg(idx1)
-		v.AddArg4(ptr1, v0, w, mem)
-		return true
-	}
-	// match: (MOVHstore [i] {s} ptr0 (SRLconst [16] (MOVDreg w)) x:(MOVHstore [i-2] {s} ptr1 w mem))
-	// cond: x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x)
-	// result: (MOVWstore [i-2] {s} ptr0 w mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		ptr0 := v_0
-		if v_1.Op != OpARM64SRLconst || auxIntToInt64(v_1.AuxInt) != 16 {
-			break
-		}
-		v_1_0 := v_1.Args[0]
-		if v_1_0.Op != OpARM64MOVDreg {
-			break
-		}
-		w := v_1_0.Args[0]
-		x := v_2
-		if x.Op != OpARM64MOVHstore || auxIntToInt32(x.AuxInt) != i-2 || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		ptr1 := x.Args[0]
-		if w != x.Args[1] || !(x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x)) {
-			break
-		}
-		v.reset(OpARM64MOVWstore)
-		v.AuxInt = int32ToAuxInt(i - 2)
-		v.Aux = symToAux(s)
-		v.AddArg3(ptr0, w, mem)
-		return true
-	}
-	// match: (MOVHstore [2] {s} (ADD ptr0 idx0) (SRLconst [16] (MOVDreg w)) x:(MOVHstoreidx ptr1 idx1 w mem))
-	// cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)
-	// result: (MOVWstoreidx ptr1 idx1 w mem)
-	for {
-		if auxIntToInt32(v.AuxInt) != 2 {
-			break
-		}
-		s := auxToSym(v.Aux)
-		if v_0.Op != OpARM64ADD {
-			break
-		}
-		_ = v_0.Args[1]
-		v_0_0 := v_0.Args[0]
-		v_0_1 := v_0.Args[1]
-		for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
-			ptr0 := v_0_0
-			idx0 := v_0_1
-			if v_1.Op != OpARM64SRLconst || auxIntToInt64(v_1.AuxInt) != 16 {
-				continue
-			}
-			v_1_0 := v_1.Args[0]
-			if v_1_0.Op != OpARM64MOVDreg {
-				continue
-			}
-			w := v_1_0.Args[0]
-			x := v_2
-			if x.Op != OpARM64MOVHstoreidx {
-				continue
-			}
-			mem := x.Args[3]
-			ptr1 := x.Args[0]
-			idx1 := x.Args[1]
-			if w != x.Args[2] || !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) {
-				continue
-			}
-			v.reset(OpARM64MOVWstoreidx)
-			v.AddArg4(ptr1, idx1, w, mem)
-			return true
-		}
-		break
-	}
-	// match: (MOVHstore [2] {s} (ADDshiftLL [1] ptr0 idx0) (SRLconst [16] (MOVDreg w)) x:(MOVHstoreidx2 ptr1 idx1 w mem))
-	// cond: x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x)
-	// result: (MOVWstoreidx ptr1 (SLLconst <idx1.Type> [1] idx1) w mem)
-	for {
-		if auxIntToInt32(v.AuxInt) != 2 {
-			break
-		}
-		s := auxToSym(v.Aux)
-		if v_0.Op != OpARM64ADDshiftLL || auxIntToInt64(v_0.AuxInt) != 1 {
-			break
-		}
-		idx0 := v_0.Args[1]
-		ptr0 := v_0.Args[0]
-		if v_1.Op != OpARM64SRLconst || auxIntToInt64(v_1.AuxInt) != 16 {
-			break
-		}
-		v_1_0 := v_1.Args[0]
-		if v_1_0.Op != OpARM64MOVDreg {
-			break
-		}
-		w := v_1_0.Args[0]
-		x := v_2
-		if x.Op != OpARM64MOVHstoreidx2 {
-			break
-		}
-		mem := x.Args[3]
-		ptr1 := x.Args[0]
-		idx1 := x.Args[1]
-		if w != x.Args[2] || !(x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x)) {
-			break
-		}
-		v.reset(OpARM64MOVWstoreidx)
-		v0 := b.NewValue0(v.Pos, OpARM64SLLconst, idx1.Type)
-		v0.AuxInt = int64ToAuxInt(1)
-		v0.AddArg(idx1)
-		v.AddArg4(ptr1, v0, w, mem)
-		return true
-	}
-	// match: (MOVHstore [i] {s} ptr0 (SRLconst [j] w) x:(MOVHstore [i-2] {s} ptr1 w0:(SRLconst [j-16] w) mem))
-	// cond: x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x)
-	// result: (MOVWstore [i-2] {s} ptr0 w0 mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		ptr0 := v_0
-		if v_1.Op != OpARM64SRLconst {
-			break
-		}
-		j := auxIntToInt64(v_1.AuxInt)
-		w := v_1.Args[0]
-		x := v_2
-		if x.Op != OpARM64MOVHstore || auxIntToInt32(x.AuxInt) != i-2 || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		ptr1 := x.Args[0]
-		w0 := x.Args[1]
-		if w0.Op != OpARM64SRLconst || auxIntToInt64(w0.AuxInt) != j-16 || w != w0.Args[0] || !(x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x)) {
-			break
-		}
-		v.reset(OpARM64MOVWstore)
-		v.AuxInt = int32ToAuxInt(i - 2)
-		v.Aux = symToAux(s)
-		v.AddArg3(ptr0, w0, mem)
-		return true
-	}
-	// match: (MOVHstore [2] {s} (ADD ptr0 idx0) (SRLconst [j] w) x:(MOVHstoreidx ptr1 idx1 w0:(SRLconst [j-16] w) mem))
-	// cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)
-	// result: (MOVWstoreidx ptr1 idx1 w0 mem)
-	for {
-		if auxIntToInt32(v.AuxInt) != 2 {
-			break
-		}
-		s := auxToSym(v.Aux)
-		if v_0.Op != OpARM64ADD {
-			break
-		}
-		_ = v_0.Args[1]
-		v_0_0 := v_0.Args[0]
-		v_0_1 := v_0.Args[1]
-		for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
-			ptr0 := v_0_0
-			idx0 := v_0_1
-			if v_1.Op != OpARM64SRLconst {
-				continue
-			}
-			j := auxIntToInt64(v_1.AuxInt)
-			w := v_1.Args[0]
-			x := v_2
-			if x.Op != OpARM64MOVHstoreidx {
-				continue
-			}
-			mem := x.Args[3]
-			ptr1 := x.Args[0]
-			idx1 := x.Args[1]
-			w0 := x.Args[2]
-			if w0.Op != OpARM64SRLconst || auxIntToInt64(w0.AuxInt) != j-16 || w != w0.Args[0] || !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) {
-				continue
-			}
-			v.reset(OpARM64MOVWstoreidx)
-			v.AddArg4(ptr1, idx1, w0, mem)
-			return true
-		}
-		break
-	}
-	// match: (MOVHstore [2] {s} (ADDshiftLL [1] ptr0 idx0) (SRLconst [j] w) x:(MOVHstoreidx2 ptr1 idx1 w0:(SRLconst [j-16] w) mem))
-	// cond: x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x)
-	// result: (MOVWstoreidx ptr1 (SLLconst <idx1.Type> [1] idx1) w0 mem)
-	for {
-		if auxIntToInt32(v.AuxInt) != 2 {
-			break
-		}
-		s := auxToSym(v.Aux)
-		if v_0.Op != OpARM64ADDshiftLL || auxIntToInt64(v_0.AuxInt) != 1 {
-			break
-		}
-		idx0 := v_0.Args[1]
-		ptr0 := v_0.Args[0]
-		if v_1.Op != OpARM64SRLconst {
-			break
-		}
-		j := auxIntToInt64(v_1.AuxInt)
-		w := v_1.Args[0]
-		x := v_2
-		if x.Op != OpARM64MOVHstoreidx2 {
-			break
-		}
-		mem := x.Args[3]
-		ptr1 := x.Args[0]
-		idx1 := x.Args[1]
-		w0 := x.Args[2]
-		if w0.Op != OpARM64SRLconst || auxIntToInt64(w0.AuxInt) != j-16 || w != w0.Args[0] || !(x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x)) {
-			break
-		}
-		v.reset(OpARM64MOVWstoreidx)
-		v0 := b.NewValue0(v.Pos, OpARM64SLLconst, idx1.Type)
-		v0.AuxInt = int64ToAuxInt(1)
-		v0.AddArg(idx1)
-		v.AddArg4(ptr1, v0, w0, mem)
-		return true
-	}
 	return false
 }
 func rewriteValueARM64_OpARM64MOVHstoreidx(v *Value) bool {
@@ -12779,31 +11179,6 @@
 		v.AddArg4(ptr, idx, x, mem)
 		return true
 	}
-	// match: (MOVHstoreidx ptr (ADDconst [2] idx) (SRLconst [16] w) x:(MOVHstoreidx ptr idx w mem))
-	// cond: x.Uses == 1 && clobber(x)
-	// result: (MOVWstoreidx ptr idx w mem)
-	for {
-		ptr := v_0
-		if v_1.Op != OpARM64ADDconst || auxIntToInt64(v_1.AuxInt) != 2 {
-			break
-		}
-		idx := v_1.Args[0]
-		if v_2.Op != OpARM64SRLconst || auxIntToInt64(v_2.AuxInt) != 16 {
-			break
-		}
-		w := v_2.Args[0]
-		x := v_3
-		if x.Op != OpARM64MOVHstoreidx {
-			break
-		}
-		mem := x.Args[3]
-		if ptr != x.Args[0] || idx != x.Args[1] || w != x.Args[2] || !(x.Uses == 1 && clobber(x)) {
-			break
-		}
-		v.reset(OpARM64MOVWstoreidx)
-		v.AddArg4(ptr, idx, w, mem)
-		return true
-	}
 	return false
 }
 func rewriteValueARM64_OpARM64MOVHstoreidx2(v *Value) bool {
@@ -12905,8 +11280,9 @@
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
 	b := v.Block
+	config := b.Func.Config
 	// match: (MOVHstorezero [off1] {sym} (ADDconst [off2] ptr) mem)
-	// cond: is32Bit(int64(off1)+off2)
+	// cond: is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
 	// result: (MOVHstorezero [off1+int32(off2)] {sym} ptr mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -12917,7 +11293,7 @@
 		off2 := auxIntToInt64(v_0.AuxInt)
 		ptr := v_0.Args[0]
 		mem := v_1
-		if !(is32Bit(int64(off1) + off2)) {
+		if !(is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
 			break
 		}
 		v.reset(OpARM64MOVHstorezero)
@@ -12927,7 +11303,7 @@
 		return true
 	}
 	// match: (MOVHstorezero [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem)
-	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
 	// result: (MOVHstorezero [off1+off2] {mergeSym(sym1,sym2)} ptr mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -12939,7 +11315,7 @@
 		sym2 := auxToSym(v_0.Aux)
 		ptr := v_0.Args[0]
 		mem := v_1
-		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) {
+		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
 			break
 		}
 		v.reset(OpARM64MOVHstorezero)
@@ -12986,95 +11362,6 @@
 		v.AddArg3(ptr, idx, mem)
 		return true
 	}
-	// match: (MOVHstorezero [i] {s} ptr0 x:(MOVHstorezero [j] {s} ptr1 mem))
-	// cond: x.Uses == 1 && areAdjacentOffsets(int64(i),int64(j),2) && isSamePtr(ptr0, ptr1) && clobber(x)
-	// result: (MOVWstorezero [int32(min(int64(i),int64(j)))] {s} ptr0 mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		ptr0 := v_0
-		x := v_1
-		if x.Op != OpARM64MOVHstorezero {
-			break
-		}
-		j := auxIntToInt32(x.AuxInt)
-		if auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[1]
-		ptr1 := x.Args[0]
-		if !(x.Uses == 1 && areAdjacentOffsets(int64(i), int64(j), 2) && isSamePtr(ptr0, ptr1) && clobber(x)) {
-			break
-		}
-		v.reset(OpARM64MOVWstorezero)
-		v.AuxInt = int32ToAuxInt(int32(min(int64(i), int64(j))))
-		v.Aux = symToAux(s)
-		v.AddArg2(ptr0, mem)
-		return true
-	}
-	// match: (MOVHstorezero [2] {s} (ADD ptr0 idx0) x:(MOVHstorezeroidx ptr1 idx1 mem))
-	// cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)
-	// result: (MOVWstorezeroidx ptr1 idx1 mem)
-	for {
-		if auxIntToInt32(v.AuxInt) != 2 {
-			break
-		}
-		s := auxToSym(v.Aux)
-		if v_0.Op != OpARM64ADD {
-			break
-		}
-		_ = v_0.Args[1]
-		v_0_0 := v_0.Args[0]
-		v_0_1 := v_0.Args[1]
-		for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
-			ptr0 := v_0_0
-			idx0 := v_0_1
-			x := v_1
-			if x.Op != OpARM64MOVHstorezeroidx {
-				continue
-			}
-			mem := x.Args[2]
-			ptr1 := x.Args[0]
-			idx1 := x.Args[1]
-			if !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) {
-				continue
-			}
-			v.reset(OpARM64MOVWstorezeroidx)
-			v.AddArg3(ptr1, idx1, mem)
-			return true
-		}
-		break
-	}
-	// match: (MOVHstorezero [2] {s} (ADDshiftLL [1] ptr0 idx0) x:(MOVHstorezeroidx2 ptr1 idx1 mem))
-	// cond: x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x)
-	// result: (MOVWstorezeroidx ptr1 (SLLconst <idx1.Type> [1] idx1) mem)
-	for {
-		if auxIntToInt32(v.AuxInt) != 2 {
-			break
-		}
-		s := auxToSym(v.Aux)
-		if v_0.Op != OpARM64ADDshiftLL || auxIntToInt64(v_0.AuxInt) != 1 {
-			break
-		}
-		idx0 := v_0.Args[1]
-		ptr0 := v_0.Args[0]
-		x := v_1
-		if x.Op != OpARM64MOVHstorezeroidx2 {
-			break
-		}
-		mem := x.Args[2]
-		ptr1 := x.Args[0]
-		idx1 := x.Args[1]
-		if !(x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x)) {
-			break
-		}
-		v.reset(OpARM64MOVWstorezeroidx)
-		v0 := b.NewValue0(v.Pos, OpARM64SLLconst, idx1.Type)
-		v0.AuxInt = int64ToAuxInt(1)
-		v0.AddArg(idx1)
-		v.AddArg3(ptr1, v0, mem)
-		return true
-	}
 	return false
 }
 func rewriteValueARM64_OpARM64MOVHstorezeroidx(v *Value) bool {
@@ -13175,27 +11462,6 @@
 		v.AddArg3(ptr, idx, mem)
 		return true
 	}
-	// match: (MOVHstorezeroidx ptr (ADDconst [2] idx) x:(MOVHstorezeroidx ptr idx mem))
-	// cond: x.Uses == 1 && clobber(x)
-	// result: (MOVWstorezeroidx ptr idx mem)
-	for {
-		ptr := v_0
-		if v_1.Op != OpARM64ADDconst || auxIntToInt64(v_1.AuxInt) != 2 {
-			break
-		}
-		idx := v_1.Args[0]
-		x := v_2
-		if x.Op != OpARM64MOVHstorezeroidx {
-			break
-		}
-		mem := x.Args[2]
-		if ptr != x.Args[0] || idx != x.Args[1] || !(x.Uses == 1 && clobber(x)) {
-			break
-		}
-		v.reset(OpARM64MOVWstorezeroidx)
-		v.AddArg3(ptr, idx, mem)
-		return true
-	}
 	return false
 }
 func rewriteValueARM64_OpARM64MOVHstorezeroidx2(v *Value) bool {
@@ -13225,8 +11491,10 @@
 func rewriteValueARM64_OpARM64MOVQstorezero(v *Value) bool {
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
+	b := v.Block
+	config := b.Func.Config
 	// match: (MOVQstorezero [off1] {sym} (ADDconst [off2] ptr) mem)
-	// cond: is32Bit(int64(off1)+off2)
+	// cond: is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
 	// result: (MOVQstorezero [off1+int32(off2)] {sym} ptr mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -13237,7 +11505,7 @@
 		off2 := auxIntToInt64(v_0.AuxInt)
 		ptr := v_0.Args[0]
 		mem := v_1
-		if !(is32Bit(int64(off1) + off2)) {
+		if !(is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
 			break
 		}
 		v.reset(OpARM64MOVQstorezero)
@@ -13247,7 +11515,7 @@
 		return true
 	}
 	// match: (MOVQstorezero [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem)
-	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
 	// result: (MOVQstorezero [off1+off2] {mergeSym(sym1,sym2)} ptr mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -13259,7 +11527,7 @@
 		sym2 := auxToSym(v_0.Aux)
 		ptr := v_0.Args[0]
 		mem := v_1
-		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) {
+		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
 			break
 		}
 		v.reset(OpARM64MOVQstorezero)
@@ -13293,7 +11561,7 @@
 		return true
 	}
 	// match: (MOVWUload [off1] {sym} (ADDconst [off2] ptr) mem)
-	// cond: is32Bit(int64(off1)+off2)
+	// cond: is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
 	// result: (MOVWUload [off1+int32(off2)] {sym} ptr mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -13304,7 +11572,7 @@
 		off2 := auxIntToInt64(v_0.AuxInt)
 		ptr := v_0.Args[0]
 		mem := v_1
-		if !(is32Bit(int64(off1) + off2)) {
+		if !(is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
 			break
 		}
 		v.reset(OpARM64MOVWUload)
@@ -13352,7 +11620,7 @@
 		return true
 	}
 	// match: (MOVWUload [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem)
-	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
 	// result: (MOVWUload [off1+off2] {mergeSym(sym1,sym2)} ptr mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -13364,7 +11632,7 @@
 		sym2 := auxToSym(v_0.Aux)
 		ptr := v_0.Args[0]
 		mem := v_1
-		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) {
+		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
 			break
 		}
 		v.reset(OpARM64MOVWUload)
@@ -13754,8 +12022,10 @@
 func rewriteValueARM64_OpARM64MOVWload(v *Value) bool {
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
+	b := v.Block
+	config := b.Func.Config
 	// match: (MOVWload [off1] {sym} (ADDconst [off2] ptr) mem)
-	// cond: is32Bit(int64(off1)+off2)
+	// cond: is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
 	// result: (MOVWload [off1+int32(off2)] {sym} ptr mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -13766,7 +12036,7 @@
 		off2 := auxIntToInt64(v_0.AuxInt)
 		ptr := v_0.Args[0]
 		mem := v_1
-		if !(is32Bit(int64(off1) + off2)) {
+		if !(is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
 			break
 		}
 		v.reset(OpARM64MOVWload)
@@ -13814,7 +12084,7 @@
 		return true
 	}
 	// match: (MOVWload [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem)
-	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
 	// result: (MOVWload [off1+off2] {mergeSym(sym1,sym2)} ptr mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -13826,7 +12096,7 @@
 		sym2 := auxToSym(v_0.Aux)
 		ptr := v_0.Args[0]
 		mem := v_1
-		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) {
+		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
 			break
 		}
 		v.reset(OpARM64MOVWload)
@@ -14226,6 +12496,7 @@
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
 	b := v.Block
+	config := b.Func.Config
 	// match: (MOVWstore [off] {sym} ptr (FMOVSfpgp val) mem)
 	// result: (FMOVSstore [off] {sym} ptr val mem)
 	for {
@@ -14244,7 +12515,7 @@
 		return true
 	}
 	// match: (MOVWstore [off1] {sym} (ADDconst [off2] ptr) val mem)
-	// cond: is32Bit(int64(off1)+off2)
+	// cond: is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
 	// result: (MOVWstore [off1+int32(off2)] {sym} ptr val mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -14256,7 +12527,7 @@
 		ptr := v_0.Args[0]
 		val := v_1
 		mem := v_2
-		if !(is32Bit(int64(off1) + off2)) {
+		if !(is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
 			break
 		}
 		v.reset(OpARM64MOVWstore)
@@ -14306,7 +12577,7 @@
 		return true
 	}
 	// match: (MOVWstore [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) val mem)
-	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
 	// result: (MOVWstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -14319,7 +12590,7 @@
 		ptr := v_0.Args[0]
 		val := v_1
 		mem := v_2
-		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) {
+		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
 			break
 		}
 		v.reset(OpARM64MOVWstore)
@@ -14378,206 +12649,6 @@
 		v.AddArg3(ptr, x, mem)
 		return true
 	}
-	// match: (MOVWstore [i] {s} ptr0 (SRLconst [32] w) x:(MOVWstore [i-4] {s} ptr1 w mem))
-	// cond: x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x)
-	// result: (MOVDstore [i-4] {s} ptr0 w mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		ptr0 := v_0
-		if v_1.Op != OpARM64SRLconst || auxIntToInt64(v_1.AuxInt) != 32 {
-			break
-		}
-		w := v_1.Args[0]
-		x := v_2
-		if x.Op != OpARM64MOVWstore || auxIntToInt32(x.AuxInt) != i-4 || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		ptr1 := x.Args[0]
-		if w != x.Args[1] || !(x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x)) {
-			break
-		}
-		v.reset(OpARM64MOVDstore)
-		v.AuxInt = int32ToAuxInt(i - 4)
-		v.Aux = symToAux(s)
-		v.AddArg3(ptr0, w, mem)
-		return true
-	}
-	// match: (MOVWstore [4] {s} (ADD ptr0 idx0) (SRLconst [32] w) x:(MOVWstoreidx ptr1 idx1 w mem))
-	// cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)
-	// result: (MOVDstoreidx ptr1 idx1 w mem)
-	for {
-		if auxIntToInt32(v.AuxInt) != 4 {
-			break
-		}
-		s := auxToSym(v.Aux)
-		if v_0.Op != OpARM64ADD {
-			break
-		}
-		_ = v_0.Args[1]
-		v_0_0 := v_0.Args[0]
-		v_0_1 := v_0.Args[1]
-		for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
-			ptr0 := v_0_0
-			idx0 := v_0_1
-			if v_1.Op != OpARM64SRLconst || auxIntToInt64(v_1.AuxInt) != 32 {
-				continue
-			}
-			w := v_1.Args[0]
-			x := v_2
-			if x.Op != OpARM64MOVWstoreidx {
-				continue
-			}
-			mem := x.Args[3]
-			ptr1 := x.Args[0]
-			idx1 := x.Args[1]
-			if w != x.Args[2] || !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) {
-				continue
-			}
-			v.reset(OpARM64MOVDstoreidx)
-			v.AddArg4(ptr1, idx1, w, mem)
-			return true
-		}
-		break
-	}
-	// match: (MOVWstore [4] {s} (ADDshiftLL [2] ptr0 idx0) (SRLconst [32] w) x:(MOVWstoreidx4 ptr1 idx1 w mem))
-	// cond: x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x)
-	// result: (MOVDstoreidx ptr1 (SLLconst <idx1.Type> [2] idx1) w mem)
-	for {
-		if auxIntToInt32(v.AuxInt) != 4 {
-			break
-		}
-		s := auxToSym(v.Aux)
-		if v_0.Op != OpARM64ADDshiftLL || auxIntToInt64(v_0.AuxInt) != 2 {
-			break
-		}
-		idx0 := v_0.Args[1]
-		ptr0 := v_0.Args[0]
-		if v_1.Op != OpARM64SRLconst || auxIntToInt64(v_1.AuxInt) != 32 {
-			break
-		}
-		w := v_1.Args[0]
-		x := v_2
-		if x.Op != OpARM64MOVWstoreidx4 {
-			break
-		}
-		mem := x.Args[3]
-		ptr1 := x.Args[0]
-		idx1 := x.Args[1]
-		if w != x.Args[2] || !(x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x)) {
-			break
-		}
-		v.reset(OpARM64MOVDstoreidx)
-		v0 := b.NewValue0(v.Pos, OpARM64SLLconst, idx1.Type)
-		v0.AuxInt = int64ToAuxInt(2)
-		v0.AddArg(idx1)
-		v.AddArg4(ptr1, v0, w, mem)
-		return true
-	}
-	// match: (MOVWstore [i] {s} ptr0 (SRLconst [j] w) x:(MOVWstore [i-4] {s} ptr1 w0:(SRLconst [j-32] w) mem))
-	// cond: x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x)
-	// result: (MOVDstore [i-4] {s} ptr0 w0 mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		ptr0 := v_0
-		if v_1.Op != OpARM64SRLconst {
-			break
-		}
-		j := auxIntToInt64(v_1.AuxInt)
-		w := v_1.Args[0]
-		x := v_2
-		if x.Op != OpARM64MOVWstore || auxIntToInt32(x.AuxInt) != i-4 || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		ptr1 := x.Args[0]
-		w0 := x.Args[1]
-		if w0.Op != OpARM64SRLconst || auxIntToInt64(w0.AuxInt) != j-32 || w != w0.Args[0] || !(x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x)) {
-			break
-		}
-		v.reset(OpARM64MOVDstore)
-		v.AuxInt = int32ToAuxInt(i - 4)
-		v.Aux = symToAux(s)
-		v.AddArg3(ptr0, w0, mem)
-		return true
-	}
-	// match: (MOVWstore [4] {s} (ADD ptr0 idx0) (SRLconst [j] w) x:(MOVWstoreidx ptr1 idx1 w0:(SRLconst [j-32] w) mem))
-	// cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)
-	// result: (MOVDstoreidx ptr1 idx1 w0 mem)
-	for {
-		if auxIntToInt32(v.AuxInt) != 4 {
-			break
-		}
-		s := auxToSym(v.Aux)
-		if v_0.Op != OpARM64ADD {
-			break
-		}
-		_ = v_0.Args[1]
-		v_0_0 := v_0.Args[0]
-		v_0_1 := v_0.Args[1]
-		for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
-			ptr0 := v_0_0
-			idx0 := v_0_1
-			if v_1.Op != OpARM64SRLconst {
-				continue
-			}
-			j := auxIntToInt64(v_1.AuxInt)
-			w := v_1.Args[0]
-			x := v_2
-			if x.Op != OpARM64MOVWstoreidx {
-				continue
-			}
-			mem := x.Args[3]
-			ptr1 := x.Args[0]
-			idx1 := x.Args[1]
-			w0 := x.Args[2]
-			if w0.Op != OpARM64SRLconst || auxIntToInt64(w0.AuxInt) != j-32 || w != w0.Args[0] || !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) {
-				continue
-			}
-			v.reset(OpARM64MOVDstoreidx)
-			v.AddArg4(ptr1, idx1, w0, mem)
-			return true
-		}
-		break
-	}
-	// match: (MOVWstore [4] {s} (ADDshiftLL [2] ptr0 idx0) (SRLconst [j] w) x:(MOVWstoreidx4 ptr1 idx1 w0:(SRLconst [j-32] w) mem))
-	// cond: x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x)
-	// result: (MOVDstoreidx ptr1 (SLLconst <idx1.Type> [2] idx1) w0 mem)
-	for {
-		if auxIntToInt32(v.AuxInt) != 4 {
-			break
-		}
-		s := auxToSym(v.Aux)
-		if v_0.Op != OpARM64ADDshiftLL || auxIntToInt64(v_0.AuxInt) != 2 {
-			break
-		}
-		idx0 := v_0.Args[1]
-		ptr0 := v_0.Args[0]
-		if v_1.Op != OpARM64SRLconst {
-			break
-		}
-		j := auxIntToInt64(v_1.AuxInt)
-		w := v_1.Args[0]
-		x := v_2
-		if x.Op != OpARM64MOVWstoreidx4 {
-			break
-		}
-		mem := x.Args[3]
-		ptr1 := x.Args[0]
-		idx1 := x.Args[1]
-		w0 := x.Args[2]
-		if w0.Op != OpARM64SRLconst || auxIntToInt64(w0.AuxInt) != j-32 || w != w0.Args[0] || !(x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x)) {
-			break
-		}
-		v.reset(OpARM64MOVDstoreidx)
-		v0 := b.NewValue0(v.Pos, OpARM64SLLconst, idx1.Type)
-		v0.AuxInt = int64ToAuxInt(2)
-		v0.AddArg(idx1)
-		v.AddArg4(ptr1, v0, w0, mem)
-		return true
-	}
 	return false
 }
 func rewriteValueARM64_OpARM64MOVWstoreidx(v *Value) bool {
@@ -14692,31 +12763,6 @@
 		v.AddArg4(ptr, idx, x, mem)
 		return true
 	}
-	// match: (MOVWstoreidx ptr (ADDconst [4] idx) (SRLconst [32] w) x:(MOVWstoreidx ptr idx w mem))
-	// cond: x.Uses == 1 && clobber(x)
-	// result: (MOVDstoreidx ptr idx w mem)
-	for {
-		ptr := v_0
-		if v_1.Op != OpARM64ADDconst || auxIntToInt64(v_1.AuxInt) != 4 {
-			break
-		}
-		idx := v_1.Args[0]
-		if v_2.Op != OpARM64SRLconst || auxIntToInt64(v_2.AuxInt) != 32 {
-			break
-		}
-		w := v_2.Args[0]
-		x := v_3
-		if x.Op != OpARM64MOVWstoreidx {
-			break
-		}
-		mem := x.Args[3]
-		if ptr != x.Args[0] || idx != x.Args[1] || w != x.Args[2] || !(x.Uses == 1 && clobber(x)) {
-			break
-		}
-		v.reset(OpARM64MOVDstoreidx)
-		v.AddArg4(ptr, idx, w, mem)
-		return true
-	}
 	return false
 }
 func rewriteValueARM64_OpARM64MOVWstoreidx4(v *Value) bool {
@@ -14790,8 +12836,9 @@
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
 	b := v.Block
+	config := b.Func.Config
 	// match: (MOVWstorezero [off1] {sym} (ADDconst [off2] ptr) mem)
-	// cond: is32Bit(int64(off1)+off2)
+	// cond: is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
 	// result: (MOVWstorezero [off1+int32(off2)] {sym} ptr mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -14802,7 +12849,7 @@
 		off2 := auxIntToInt64(v_0.AuxInt)
 		ptr := v_0.Args[0]
 		mem := v_1
-		if !(is32Bit(int64(off1) + off2)) {
+		if !(is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
 			break
 		}
 		v.reset(OpARM64MOVWstorezero)
@@ -14812,7 +12859,7 @@
 		return true
 	}
 	// match: (MOVWstorezero [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem)
-	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
 	// result: (MOVWstorezero [off1+off2] {mergeSym(sym1,sym2)} ptr mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -14824,7 +12871,7 @@
 		sym2 := auxToSym(v_0.Aux)
 		ptr := v_0.Args[0]
 		mem := v_1
-		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) {
+		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
 			break
 		}
 		v.reset(OpARM64MOVWstorezero)
@@ -14871,95 +12918,6 @@
 		v.AddArg3(ptr, idx, mem)
 		return true
 	}
-	// match: (MOVWstorezero [i] {s} ptr0 x:(MOVWstorezero [j] {s} ptr1 mem))
-	// cond: x.Uses == 1 && areAdjacentOffsets(int64(i),int64(j),4) && isSamePtr(ptr0, ptr1) && clobber(x)
-	// result: (MOVDstorezero [int32(min(int64(i),int64(j)))] {s} ptr0 mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		ptr0 := v_0
-		x := v_1
-		if x.Op != OpARM64MOVWstorezero {
-			break
-		}
-		j := auxIntToInt32(x.AuxInt)
-		if auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[1]
-		ptr1 := x.Args[0]
-		if !(x.Uses == 1 && areAdjacentOffsets(int64(i), int64(j), 4) && isSamePtr(ptr0, ptr1) && clobber(x)) {
-			break
-		}
-		v.reset(OpARM64MOVDstorezero)
-		v.AuxInt = int32ToAuxInt(int32(min(int64(i), int64(j))))
-		v.Aux = symToAux(s)
-		v.AddArg2(ptr0, mem)
-		return true
-	}
-	// match: (MOVWstorezero [4] {s} (ADD ptr0 idx0) x:(MOVWstorezeroidx ptr1 idx1 mem))
-	// cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)
-	// result: (MOVDstorezeroidx ptr1 idx1 mem)
-	for {
-		if auxIntToInt32(v.AuxInt) != 4 {
-			break
-		}
-		s := auxToSym(v.Aux)
-		if v_0.Op != OpARM64ADD {
-			break
-		}
-		_ = v_0.Args[1]
-		v_0_0 := v_0.Args[0]
-		v_0_1 := v_0.Args[1]
-		for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
-			ptr0 := v_0_0
-			idx0 := v_0_1
-			x := v_1
-			if x.Op != OpARM64MOVWstorezeroidx {
-				continue
-			}
-			mem := x.Args[2]
-			ptr1 := x.Args[0]
-			idx1 := x.Args[1]
-			if !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) {
-				continue
-			}
-			v.reset(OpARM64MOVDstorezeroidx)
-			v.AddArg3(ptr1, idx1, mem)
-			return true
-		}
-		break
-	}
-	// match: (MOVWstorezero [4] {s} (ADDshiftLL [2] ptr0 idx0) x:(MOVWstorezeroidx4 ptr1 idx1 mem))
-	// cond: x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x)
-	// result: (MOVDstorezeroidx ptr1 (SLLconst <idx1.Type> [2] idx1) mem)
-	for {
-		if auxIntToInt32(v.AuxInt) != 4 {
-			break
-		}
-		s := auxToSym(v.Aux)
-		if v_0.Op != OpARM64ADDshiftLL || auxIntToInt64(v_0.AuxInt) != 2 {
-			break
-		}
-		idx0 := v_0.Args[1]
-		ptr0 := v_0.Args[0]
-		x := v_1
-		if x.Op != OpARM64MOVWstorezeroidx4 {
-			break
-		}
-		mem := x.Args[2]
-		ptr1 := x.Args[0]
-		idx1 := x.Args[1]
-		if !(x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x)) {
-			break
-		}
-		v.reset(OpARM64MOVDstorezeroidx)
-		v0 := b.NewValue0(v.Pos, OpARM64SLLconst, idx1.Type)
-		v0.AuxInt = int64ToAuxInt(2)
-		v0.AddArg(idx1)
-		v.AddArg3(ptr1, v0, mem)
-		return true
-	}
 	return false
 }
 func rewriteValueARM64_OpARM64MOVWstorezeroidx(v *Value) bool {
@@ -15028,27 +12986,6 @@
 		v.AddArg3(ptr, idx, mem)
 		return true
 	}
-	// match: (MOVWstorezeroidx ptr (ADDconst [4] idx) x:(MOVWstorezeroidx ptr idx mem))
-	// cond: x.Uses == 1 && clobber(x)
-	// result: (MOVDstorezeroidx ptr idx mem)
-	for {
-		ptr := v_0
-		if v_1.Op != OpARM64ADDconst || auxIntToInt64(v_1.AuxInt) != 4 {
-			break
-		}
-		idx := v_1.Args[0]
-		x := v_2
-		if x.Op != OpARM64MOVWstorezeroidx {
-			break
-		}
-		mem := x.Args[2]
-		if ptr != x.Args[0] || idx != x.Args[1] || !(x.Uses == 1 && clobber(x)) {
-			break
-		}
-		v.reset(OpARM64MOVDstorezeroidx)
-		v.AddArg3(ptr, idx, mem)
-		return true
-	}
 	return false
 }
 func rewriteValueARM64_OpARM64MOVWstorezeroidx4(v *Value) bool {
@@ -16918,7 +14855,7 @@
 		return true
 	}
 	// match: (NotEqual (CMPconst [0] z:(MADD a x y)))
-	// cond: z.Uses==1
+	// cond: z.Uses == 1
 	// result: (NotEqual (CMN a (MUL <x.Type> x y)))
 	for {
 		if v_0.Op != OpARM64CMPconst || auxIntToInt64(v_0.AuxInt) != 0 {
@@ -16943,7 +14880,7 @@
 		return true
 	}
 	// match: (NotEqual (CMPconst [0] z:(MSUB a x y)))
-	// cond: z.Uses==1
+	// cond: z.Uses == 1
 	// result: (NotEqual (CMP a (MUL <x.Type> x y)))
 	for {
 		if v_0.Op != OpARM64CMPconst || auxIntToInt64(v_0.AuxInt) != 0 {
@@ -16968,7 +14905,7 @@
 		return true
 	}
 	// match: (NotEqual (CMPWconst [0] z:(MADDW a x y)))
-	// cond: z.Uses==1
+	// cond: z.Uses == 1
 	// result: (NotEqual (CMNW a (MULW <x.Type> x y)))
 	for {
 		if v_0.Op != OpARM64CMPWconst || auxIntToInt32(v_0.AuxInt) != 0 {
@@ -16993,7 +14930,7 @@
 		return true
 	}
 	// match: (NotEqual (CMPWconst [0] z:(MSUBW a x y)))
-	// cond: z.Uses==1
+	// cond: z.Uses == 1
 	// result: (NotEqual (CMPW a (MULW <x.Type> x y)))
 	for {
 		if v_0.Op != OpARM64CMPWconst || auxIntToInt32(v_0.AuxInt) != 0 {
@@ -17044,7 +14981,6 @@
 func rewriteValueARM64_OpARM64OR(v *Value) bool {
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
-	b := v.Block
 	// match: (OR x (MOVDconst [c]))
 	// result: (ORconst [c] x)
 	for {
@@ -17224,1558 +15160,6 @@
 		}
 		break
 	}
-	// match: (OR <t> o0:(ORshiftLL [8] o1:(ORshiftLL [16] s0:(SLLconst [24] y0:(MOVDnop x0:(MOVBUload [i3] {s} p mem))) y1:(MOVDnop x1:(MOVBUload [i2] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [i1] {s} p mem))) y3:(MOVDnop x3:(MOVBUload [i0] {s} p mem)))
-	// cond: i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3) != nil && clobber(x0, x1, x2, x3, y0, y1, y2, y3, o0, o1, s0)
-	// result: @mergePoint(b,x0,x1,x2,x3) (MOVWUload <t> {s} (OffPtr <p.Type> [int64(i0)] p) mem)
-	for {
-		t := v.Type
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			o0 := v_0
-			if o0.Op != OpARM64ORshiftLL || auxIntToInt64(o0.AuxInt) != 8 {
-				continue
-			}
-			_ = o0.Args[1]
-			o1 := o0.Args[0]
-			if o1.Op != OpARM64ORshiftLL || auxIntToInt64(o1.AuxInt) != 16 {
-				continue
-			}
-			_ = o1.Args[1]
-			s0 := o1.Args[0]
-			if s0.Op != OpARM64SLLconst || auxIntToInt64(s0.AuxInt) != 24 {
-				continue
-			}
-			y0 := s0.Args[0]
-			if y0.Op != OpARM64MOVDnop {
-				continue
-			}
-			x0 := y0.Args[0]
-			if x0.Op != OpARM64MOVBUload {
-				continue
-			}
-			i3 := auxIntToInt32(x0.AuxInt)
-			s := auxToSym(x0.Aux)
-			mem := x0.Args[1]
-			p := x0.Args[0]
-			y1 := o1.Args[1]
-			if y1.Op != OpARM64MOVDnop {
-				continue
-			}
-			x1 := y1.Args[0]
-			if x1.Op != OpARM64MOVBUload {
-				continue
-			}
-			i2 := auxIntToInt32(x1.AuxInt)
-			if auxToSym(x1.Aux) != s {
-				continue
-			}
-			_ = x1.Args[1]
-			if p != x1.Args[0] || mem != x1.Args[1] {
-				continue
-			}
-			y2 := o0.Args[1]
-			if y2.Op != OpARM64MOVDnop {
-				continue
-			}
-			x2 := y2.Args[0]
-			if x2.Op != OpARM64MOVBUload {
-				continue
-			}
-			i1 := auxIntToInt32(x2.AuxInt)
-			if auxToSym(x2.Aux) != s {
-				continue
-			}
-			_ = x2.Args[1]
-			if p != x2.Args[0] || mem != x2.Args[1] {
-				continue
-			}
-			y3 := v_1
-			if y3.Op != OpARM64MOVDnop {
-				continue
-			}
-			x3 := y3.Args[0]
-			if x3.Op != OpARM64MOVBUload {
-				continue
-			}
-			i0 := auxIntToInt32(x3.AuxInt)
-			if auxToSym(x3.Aux) != s {
-				continue
-			}
-			_ = x3.Args[1]
-			if p != x3.Args[0] || mem != x3.Args[1] || !(i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3) != nil && clobber(x0, x1, x2, x3, y0, y1, y2, y3, o0, o1, s0)) {
-				continue
-			}
-			b = mergePoint(b, x0, x1, x2, x3)
-			v0 := b.NewValue0(x3.Pos, OpARM64MOVWUload, t)
-			v.copyOf(v0)
-			v0.Aux = symToAux(s)
-			v1 := b.NewValue0(x3.Pos, OpOffPtr, p.Type)
-			v1.AuxInt = int64ToAuxInt(int64(i0))
-			v1.AddArg(p)
-			v0.AddArg2(v1, mem)
-			return true
-		}
-		break
-	}
-	// match: (OR <t> o0:(ORshiftLL [8] o1:(ORshiftLL [16] s0:(SLLconst [24] y0:(MOVDnop x0:(MOVBUload [3] {s} p mem))) y1:(MOVDnop x1:(MOVBUload [2] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [1] {s} p1:(ADD ptr1 idx1) mem))) y3:(MOVDnop x3:(MOVBUloadidx ptr0 idx0 mem)))
-	// cond: s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0, x1, x2, x3, y0, y1, y2, y3, o0, o1, s0)
-	// result: @mergePoint(b,x0,x1,x2,x3) (MOVWUloadidx <t> ptr0 idx0 mem)
-	for {
-		t := v.Type
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			o0 := v_0
-			if o0.Op != OpARM64ORshiftLL || auxIntToInt64(o0.AuxInt) != 8 {
-				continue
-			}
-			_ = o0.Args[1]
-			o1 := o0.Args[0]
-			if o1.Op != OpARM64ORshiftLL || auxIntToInt64(o1.AuxInt) != 16 {
-				continue
-			}
-			_ = o1.Args[1]
-			s0 := o1.Args[0]
-			if s0.Op != OpARM64SLLconst || auxIntToInt64(s0.AuxInt) != 24 {
-				continue
-			}
-			y0 := s0.Args[0]
-			if y0.Op != OpARM64MOVDnop {
-				continue
-			}
-			x0 := y0.Args[0]
-			if x0.Op != OpARM64MOVBUload || auxIntToInt32(x0.AuxInt) != 3 {
-				continue
-			}
-			s := auxToSym(x0.Aux)
-			mem := x0.Args[1]
-			p := x0.Args[0]
-			y1 := o1.Args[1]
-			if y1.Op != OpARM64MOVDnop {
-				continue
-			}
-			x1 := y1.Args[0]
-			if x1.Op != OpARM64MOVBUload || auxIntToInt32(x1.AuxInt) != 2 || auxToSym(x1.Aux) != s {
-				continue
-			}
-			_ = x1.Args[1]
-			if p != x1.Args[0] || mem != x1.Args[1] {
-				continue
-			}
-			y2 := o0.Args[1]
-			if y2.Op != OpARM64MOVDnop {
-				continue
-			}
-			x2 := y2.Args[0]
-			if x2.Op != OpARM64MOVBUload || auxIntToInt32(x2.AuxInt) != 1 || auxToSym(x2.Aux) != s {
-				continue
-			}
-			_ = x2.Args[1]
-			p1 := x2.Args[0]
-			if p1.Op != OpARM64ADD {
-				continue
-			}
-			_ = p1.Args[1]
-			p1_0 := p1.Args[0]
-			p1_1 := p1.Args[1]
-			for _i1 := 0; _i1 <= 1; _i1, p1_0, p1_1 = _i1+1, p1_1, p1_0 {
-				ptr1 := p1_0
-				idx1 := p1_1
-				if mem != x2.Args[1] {
-					continue
-				}
-				y3 := v_1
-				if y3.Op != OpARM64MOVDnop {
-					continue
-				}
-				x3 := y3.Args[0]
-				if x3.Op != OpARM64MOVBUloadidx {
-					continue
-				}
-				_ = x3.Args[2]
-				ptr0 := x3.Args[0]
-				idx0 := x3.Args[1]
-				if mem != x3.Args[2] || !(s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0, x1, x2, x3, y0, y1, y2, y3, o0, o1, s0)) {
-					continue
-				}
-				b = mergePoint(b, x0, x1, x2, x3)
-				v0 := b.NewValue0(x2.Pos, OpARM64MOVWUloadidx, t)
-				v.copyOf(v0)
-				v0.AddArg3(ptr0, idx0, mem)
-				return true
-			}
-		}
-		break
-	}
-	// match: (OR <t> o0:(ORshiftLL [8] o1:(ORshiftLL [16] s0:(SLLconst [24] y0:(MOVDnop x0:(MOVBUloadidx ptr (ADDconst [3] idx) mem))) y1:(MOVDnop x1:(MOVBUloadidx ptr (ADDconst [2] idx) mem))) y2:(MOVDnop x2:(MOVBUloadidx ptr (ADDconst [1] idx) mem))) y3:(MOVDnop x3:(MOVBUloadidx ptr idx mem)))
-	// cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3) != nil && clobber(x0, x1, x2, x3, y0, y1, y2, y3, o0, o1, s0)
-	// result: @mergePoint(b,x0,x1,x2,x3) (MOVWUloadidx <t> ptr idx mem)
-	for {
-		t := v.Type
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			o0 := v_0
-			if o0.Op != OpARM64ORshiftLL || auxIntToInt64(o0.AuxInt) != 8 {
-				continue
-			}
-			_ = o0.Args[1]
-			o1 := o0.Args[0]
-			if o1.Op != OpARM64ORshiftLL || auxIntToInt64(o1.AuxInt) != 16 {
-				continue
-			}
-			_ = o1.Args[1]
-			s0 := o1.Args[0]
-			if s0.Op != OpARM64SLLconst || auxIntToInt64(s0.AuxInt) != 24 {
-				continue
-			}
-			y0 := s0.Args[0]
-			if y0.Op != OpARM64MOVDnop {
-				continue
-			}
-			x0 := y0.Args[0]
-			if x0.Op != OpARM64MOVBUloadidx {
-				continue
-			}
-			mem := x0.Args[2]
-			ptr := x0.Args[0]
-			x0_1 := x0.Args[1]
-			if x0_1.Op != OpARM64ADDconst || auxIntToInt64(x0_1.AuxInt) != 3 {
-				continue
-			}
-			idx := x0_1.Args[0]
-			y1 := o1.Args[1]
-			if y1.Op != OpARM64MOVDnop {
-				continue
-			}
-			x1 := y1.Args[0]
-			if x1.Op != OpARM64MOVBUloadidx {
-				continue
-			}
-			_ = x1.Args[2]
-			if ptr != x1.Args[0] {
-				continue
-			}
-			x1_1 := x1.Args[1]
-			if x1_1.Op != OpARM64ADDconst || auxIntToInt64(x1_1.AuxInt) != 2 || idx != x1_1.Args[0] || mem != x1.Args[2] {
-				continue
-			}
-			y2 := o0.Args[1]
-			if y2.Op != OpARM64MOVDnop {
-				continue
-			}
-			x2 := y2.Args[0]
-			if x2.Op != OpARM64MOVBUloadidx {
-				continue
-			}
-			_ = x2.Args[2]
-			if ptr != x2.Args[0] {
-				continue
-			}
-			x2_1 := x2.Args[1]
-			if x2_1.Op != OpARM64ADDconst || auxIntToInt64(x2_1.AuxInt) != 1 || idx != x2_1.Args[0] || mem != x2.Args[2] {
-				continue
-			}
-			y3 := v_1
-			if y3.Op != OpARM64MOVDnop {
-				continue
-			}
-			x3 := y3.Args[0]
-			if x3.Op != OpARM64MOVBUloadidx {
-				continue
-			}
-			_ = x3.Args[2]
-			if ptr != x3.Args[0] || idx != x3.Args[1] || mem != x3.Args[2] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3) != nil && clobber(x0, x1, x2, x3, y0, y1, y2, y3, o0, o1, s0)) {
-				continue
-			}
-			b = mergePoint(b, x0, x1, x2, x3)
-			v0 := b.NewValue0(v.Pos, OpARM64MOVWUloadidx, t)
-			v.copyOf(v0)
-			v0.AddArg3(ptr, idx, mem)
-			return true
-		}
-		break
-	}
-	// match: (OR <t> o0:(ORshiftLL [8] o1:(ORshiftLL [16] o2:(ORshiftLL [24] o3:(ORshiftLL [32] o4:(ORshiftLL [40] o5:(ORshiftLL [48] s0:(SLLconst [56] y0:(MOVDnop x0:(MOVBUload [i7] {s} p mem))) y1:(MOVDnop x1:(MOVBUload [i6] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [i5] {s} p mem))) y3:(MOVDnop x3:(MOVBUload [i4] {s} p mem))) y4:(MOVDnop x4:(MOVBUload [i3] {s} p mem))) y5:(MOVDnop x5:(MOVBUload [i2] {s} p mem))) y6:(MOVDnop x6:(MOVBUload [i1] {s} p mem))) y7:(MOVDnop x7:(MOVBUload [i0] {s} p mem)))
-	// cond: i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) != nil && clobber(x0, x1, x2, x3, x4, x5, x6, x7, y0, y1, y2, y3, y4, y5, y6, y7, o0, o1, o2, o3, o4, o5, s0)
-	// result: @mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) (MOVDload <t> {s} (OffPtr <p.Type> [int64(i0)] p) mem)
-	for {
-		t := v.Type
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			o0 := v_0
-			if o0.Op != OpARM64ORshiftLL || auxIntToInt64(o0.AuxInt) != 8 {
-				continue
-			}
-			_ = o0.Args[1]
-			o1 := o0.Args[0]
-			if o1.Op != OpARM64ORshiftLL || auxIntToInt64(o1.AuxInt) != 16 {
-				continue
-			}
-			_ = o1.Args[1]
-			o2 := o1.Args[0]
-			if o2.Op != OpARM64ORshiftLL || auxIntToInt64(o2.AuxInt) != 24 {
-				continue
-			}
-			_ = o2.Args[1]
-			o3 := o2.Args[0]
-			if o3.Op != OpARM64ORshiftLL || auxIntToInt64(o3.AuxInt) != 32 {
-				continue
-			}
-			_ = o3.Args[1]
-			o4 := o3.Args[0]
-			if o4.Op != OpARM64ORshiftLL || auxIntToInt64(o4.AuxInt) != 40 {
-				continue
-			}
-			_ = o4.Args[1]
-			o5 := o4.Args[0]
-			if o5.Op != OpARM64ORshiftLL || auxIntToInt64(o5.AuxInt) != 48 {
-				continue
-			}
-			_ = o5.Args[1]
-			s0 := o5.Args[0]
-			if s0.Op != OpARM64SLLconst || auxIntToInt64(s0.AuxInt) != 56 {
-				continue
-			}
-			y0 := s0.Args[0]
-			if y0.Op != OpARM64MOVDnop {
-				continue
-			}
-			x0 := y0.Args[0]
-			if x0.Op != OpARM64MOVBUload {
-				continue
-			}
-			i7 := auxIntToInt32(x0.AuxInt)
-			s := auxToSym(x0.Aux)
-			mem := x0.Args[1]
-			p := x0.Args[0]
-			y1 := o5.Args[1]
-			if y1.Op != OpARM64MOVDnop {
-				continue
-			}
-			x1 := y1.Args[0]
-			if x1.Op != OpARM64MOVBUload {
-				continue
-			}
-			i6 := auxIntToInt32(x1.AuxInt)
-			if auxToSym(x1.Aux) != s {
-				continue
-			}
-			_ = x1.Args[1]
-			if p != x1.Args[0] || mem != x1.Args[1] {
-				continue
-			}
-			y2 := o4.Args[1]
-			if y2.Op != OpARM64MOVDnop {
-				continue
-			}
-			x2 := y2.Args[0]
-			if x2.Op != OpARM64MOVBUload {
-				continue
-			}
-			i5 := auxIntToInt32(x2.AuxInt)
-			if auxToSym(x2.Aux) != s {
-				continue
-			}
-			_ = x2.Args[1]
-			if p != x2.Args[0] || mem != x2.Args[1] {
-				continue
-			}
-			y3 := o3.Args[1]
-			if y3.Op != OpARM64MOVDnop {
-				continue
-			}
-			x3 := y3.Args[0]
-			if x3.Op != OpARM64MOVBUload {
-				continue
-			}
-			i4 := auxIntToInt32(x3.AuxInt)
-			if auxToSym(x3.Aux) != s {
-				continue
-			}
-			_ = x3.Args[1]
-			if p != x3.Args[0] || mem != x3.Args[1] {
-				continue
-			}
-			y4 := o2.Args[1]
-			if y4.Op != OpARM64MOVDnop {
-				continue
-			}
-			x4 := y4.Args[0]
-			if x4.Op != OpARM64MOVBUload {
-				continue
-			}
-			i3 := auxIntToInt32(x4.AuxInt)
-			if auxToSym(x4.Aux) != s {
-				continue
-			}
-			_ = x4.Args[1]
-			if p != x4.Args[0] || mem != x4.Args[1] {
-				continue
-			}
-			y5 := o1.Args[1]
-			if y5.Op != OpARM64MOVDnop {
-				continue
-			}
-			x5 := y5.Args[0]
-			if x5.Op != OpARM64MOVBUload {
-				continue
-			}
-			i2 := auxIntToInt32(x5.AuxInt)
-			if auxToSym(x5.Aux) != s {
-				continue
-			}
-			_ = x5.Args[1]
-			if p != x5.Args[0] || mem != x5.Args[1] {
-				continue
-			}
-			y6 := o0.Args[1]
-			if y6.Op != OpARM64MOVDnop {
-				continue
-			}
-			x6 := y6.Args[0]
-			if x6.Op != OpARM64MOVBUload {
-				continue
-			}
-			i1 := auxIntToInt32(x6.AuxInt)
-			if auxToSym(x6.Aux) != s {
-				continue
-			}
-			_ = x6.Args[1]
-			if p != x6.Args[0] || mem != x6.Args[1] {
-				continue
-			}
-			y7 := v_1
-			if y7.Op != OpARM64MOVDnop {
-				continue
-			}
-			x7 := y7.Args[0]
-			if x7.Op != OpARM64MOVBUload {
-				continue
-			}
-			i0 := auxIntToInt32(x7.AuxInt)
-			if auxToSym(x7.Aux) != s {
-				continue
-			}
-			_ = x7.Args[1]
-			if p != x7.Args[0] || mem != x7.Args[1] || !(i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) != nil && clobber(x0, x1, x2, x3, x4, x5, x6, x7, y0, y1, y2, y3, y4, y5, y6, y7, o0, o1, o2, o3, o4, o5, s0)) {
-				continue
-			}
-			b = mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7)
-			v0 := b.NewValue0(x7.Pos, OpARM64MOVDload, t)
-			v.copyOf(v0)
-			v0.Aux = symToAux(s)
-			v1 := b.NewValue0(x7.Pos, OpOffPtr, p.Type)
-			v1.AuxInt = int64ToAuxInt(int64(i0))
-			v1.AddArg(p)
-			v0.AddArg2(v1, mem)
-			return true
-		}
-		break
-	}
-	// match: (OR <t> o0:(ORshiftLL [8] o1:(ORshiftLL [16] o2:(ORshiftLL [24] o3:(ORshiftLL [32] o4:(ORshiftLL [40] o5:(ORshiftLL [48] s0:(SLLconst [56] y0:(MOVDnop x0:(MOVBUload [7] {s} p mem))) y1:(MOVDnop x1:(MOVBUload [6] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [5] {s} p mem))) y3:(MOVDnop x3:(MOVBUload [4] {s} p mem))) y4:(MOVDnop x4:(MOVBUload [3] {s} p mem))) y5:(MOVDnop x5:(MOVBUload [2] {s} p mem))) y6:(MOVDnop x6:(MOVBUload [1] {s} p1:(ADD ptr1 idx1) mem))) y7:(MOVDnop x7:(MOVBUloadidx ptr0 idx0 mem)))
-	// cond: s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0, x1, x2, x3, x4, x5, x6, x7, y0, y1, y2, y3, y4, y5, y6, y7, o0, o1, o2, o3, o4, o5, s0)
-	// result: @mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) (MOVDloadidx <t> ptr0 idx0 mem)
-	for {
-		t := v.Type
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			o0 := v_0
-			if o0.Op != OpARM64ORshiftLL || auxIntToInt64(o0.AuxInt) != 8 {
-				continue
-			}
-			_ = o0.Args[1]
-			o1 := o0.Args[0]
-			if o1.Op != OpARM64ORshiftLL || auxIntToInt64(o1.AuxInt) != 16 {
-				continue
-			}
-			_ = o1.Args[1]
-			o2 := o1.Args[0]
-			if o2.Op != OpARM64ORshiftLL || auxIntToInt64(o2.AuxInt) != 24 {
-				continue
-			}
-			_ = o2.Args[1]
-			o3 := o2.Args[0]
-			if o3.Op != OpARM64ORshiftLL || auxIntToInt64(o3.AuxInt) != 32 {
-				continue
-			}
-			_ = o3.Args[1]
-			o4 := o3.Args[0]
-			if o4.Op != OpARM64ORshiftLL || auxIntToInt64(o4.AuxInt) != 40 {
-				continue
-			}
-			_ = o4.Args[1]
-			o5 := o4.Args[0]
-			if o5.Op != OpARM64ORshiftLL || auxIntToInt64(o5.AuxInt) != 48 {
-				continue
-			}
-			_ = o5.Args[1]
-			s0 := o5.Args[0]
-			if s0.Op != OpARM64SLLconst || auxIntToInt64(s0.AuxInt) != 56 {
-				continue
-			}
-			y0 := s0.Args[0]
-			if y0.Op != OpARM64MOVDnop {
-				continue
-			}
-			x0 := y0.Args[0]
-			if x0.Op != OpARM64MOVBUload || auxIntToInt32(x0.AuxInt) != 7 {
-				continue
-			}
-			s := auxToSym(x0.Aux)
-			mem := x0.Args[1]
-			p := x0.Args[0]
-			y1 := o5.Args[1]
-			if y1.Op != OpARM64MOVDnop {
-				continue
-			}
-			x1 := y1.Args[0]
-			if x1.Op != OpARM64MOVBUload || auxIntToInt32(x1.AuxInt) != 6 || auxToSym(x1.Aux) != s {
-				continue
-			}
-			_ = x1.Args[1]
-			if p != x1.Args[0] || mem != x1.Args[1] {
-				continue
-			}
-			y2 := o4.Args[1]
-			if y2.Op != OpARM64MOVDnop {
-				continue
-			}
-			x2 := y2.Args[0]
-			if x2.Op != OpARM64MOVBUload || auxIntToInt32(x2.AuxInt) != 5 || auxToSym(x2.Aux) != s {
-				continue
-			}
-			_ = x2.Args[1]
-			if p != x2.Args[0] || mem != x2.Args[1] {
-				continue
-			}
-			y3 := o3.Args[1]
-			if y3.Op != OpARM64MOVDnop {
-				continue
-			}
-			x3 := y3.Args[0]
-			if x3.Op != OpARM64MOVBUload || auxIntToInt32(x3.AuxInt) != 4 || auxToSym(x3.Aux) != s {
-				continue
-			}
-			_ = x3.Args[1]
-			if p != x3.Args[0] || mem != x3.Args[1] {
-				continue
-			}
-			y4 := o2.Args[1]
-			if y4.Op != OpARM64MOVDnop {
-				continue
-			}
-			x4 := y4.Args[0]
-			if x4.Op != OpARM64MOVBUload || auxIntToInt32(x4.AuxInt) != 3 || auxToSym(x4.Aux) != s {
-				continue
-			}
-			_ = x4.Args[1]
-			if p != x4.Args[0] || mem != x4.Args[1] {
-				continue
-			}
-			y5 := o1.Args[1]
-			if y5.Op != OpARM64MOVDnop {
-				continue
-			}
-			x5 := y5.Args[0]
-			if x5.Op != OpARM64MOVBUload || auxIntToInt32(x5.AuxInt) != 2 || auxToSym(x5.Aux) != s {
-				continue
-			}
-			_ = x5.Args[1]
-			if p != x5.Args[0] || mem != x5.Args[1] {
-				continue
-			}
-			y6 := o0.Args[1]
-			if y6.Op != OpARM64MOVDnop {
-				continue
-			}
-			x6 := y6.Args[0]
-			if x6.Op != OpARM64MOVBUload || auxIntToInt32(x6.AuxInt) != 1 || auxToSym(x6.Aux) != s {
-				continue
-			}
-			_ = x6.Args[1]
-			p1 := x6.Args[0]
-			if p1.Op != OpARM64ADD {
-				continue
-			}
-			_ = p1.Args[1]
-			p1_0 := p1.Args[0]
-			p1_1 := p1.Args[1]
-			for _i1 := 0; _i1 <= 1; _i1, p1_0, p1_1 = _i1+1, p1_1, p1_0 {
-				ptr1 := p1_0
-				idx1 := p1_1
-				if mem != x6.Args[1] {
-					continue
-				}
-				y7 := v_1
-				if y7.Op != OpARM64MOVDnop {
-					continue
-				}
-				x7 := y7.Args[0]
-				if x7.Op != OpARM64MOVBUloadidx {
-					continue
-				}
-				_ = x7.Args[2]
-				ptr0 := x7.Args[0]
-				idx0 := x7.Args[1]
-				if mem != x7.Args[2] || !(s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0, x1, x2, x3, x4, x5, x6, x7, y0, y1, y2, y3, y4, y5, y6, y7, o0, o1, o2, o3, o4, o5, s0)) {
-					continue
-				}
-				b = mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7)
-				v0 := b.NewValue0(x6.Pos, OpARM64MOVDloadidx, t)
-				v.copyOf(v0)
-				v0.AddArg3(ptr0, idx0, mem)
-				return true
-			}
-		}
-		break
-	}
-	// match: (OR <t> o0:(ORshiftLL [8] o1:(ORshiftLL [16] o2:(ORshiftLL [24] o3:(ORshiftLL [32] o4:(ORshiftLL [40] o5:(ORshiftLL [48] s0:(SLLconst [56] y0:(MOVDnop x0:(MOVBUloadidx ptr (ADDconst [7] idx) mem))) y1:(MOVDnop x1:(MOVBUloadidx ptr (ADDconst [6] idx) mem))) y2:(MOVDnop x2:(MOVBUloadidx ptr (ADDconst [5] idx) mem))) y3:(MOVDnop x3:(MOVBUloadidx ptr (ADDconst [4] idx) mem))) y4:(MOVDnop x4:(MOVBUloadidx ptr (ADDconst [3] idx) mem))) y5:(MOVDnop x5:(MOVBUloadidx ptr (ADDconst [2] idx) mem))) y6:(MOVDnop x6:(MOVBUloadidx ptr (ADDconst [1] idx) mem))) y7:(MOVDnop x7:(MOVBUloadidx ptr idx mem)))
-	// cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) != nil && clobber(x0, x1, x2, x3, x4, x5, x6, x7, y0, y1, y2, y3, y4, y5, y6, y7, o0, o1, o2, o3, o4, o5, s0)
-	// result: @mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) (MOVDloadidx <t> ptr idx mem)
-	for {
-		t := v.Type
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			o0 := v_0
-			if o0.Op != OpARM64ORshiftLL || auxIntToInt64(o0.AuxInt) != 8 {
-				continue
-			}
-			_ = o0.Args[1]
-			o1 := o0.Args[0]
-			if o1.Op != OpARM64ORshiftLL || auxIntToInt64(o1.AuxInt) != 16 {
-				continue
-			}
-			_ = o1.Args[1]
-			o2 := o1.Args[0]
-			if o2.Op != OpARM64ORshiftLL || auxIntToInt64(o2.AuxInt) != 24 {
-				continue
-			}
-			_ = o2.Args[1]
-			o3 := o2.Args[0]
-			if o3.Op != OpARM64ORshiftLL || auxIntToInt64(o3.AuxInt) != 32 {
-				continue
-			}
-			_ = o3.Args[1]
-			o4 := o3.Args[0]
-			if o4.Op != OpARM64ORshiftLL || auxIntToInt64(o4.AuxInt) != 40 {
-				continue
-			}
-			_ = o4.Args[1]
-			o5 := o4.Args[0]
-			if o5.Op != OpARM64ORshiftLL || auxIntToInt64(o5.AuxInt) != 48 {
-				continue
-			}
-			_ = o5.Args[1]
-			s0 := o5.Args[0]
-			if s0.Op != OpARM64SLLconst || auxIntToInt64(s0.AuxInt) != 56 {
-				continue
-			}
-			y0 := s0.Args[0]
-			if y0.Op != OpARM64MOVDnop {
-				continue
-			}
-			x0 := y0.Args[0]
-			if x0.Op != OpARM64MOVBUloadidx {
-				continue
-			}
-			mem := x0.Args[2]
-			ptr := x0.Args[0]
-			x0_1 := x0.Args[1]
-			if x0_1.Op != OpARM64ADDconst || auxIntToInt64(x0_1.AuxInt) != 7 {
-				continue
-			}
-			idx := x0_1.Args[0]
-			y1 := o5.Args[1]
-			if y1.Op != OpARM64MOVDnop {
-				continue
-			}
-			x1 := y1.Args[0]
-			if x1.Op != OpARM64MOVBUloadidx {
-				continue
-			}
-			_ = x1.Args[2]
-			if ptr != x1.Args[0] {
-				continue
-			}
-			x1_1 := x1.Args[1]
-			if x1_1.Op != OpARM64ADDconst || auxIntToInt64(x1_1.AuxInt) != 6 || idx != x1_1.Args[0] || mem != x1.Args[2] {
-				continue
-			}
-			y2 := o4.Args[1]
-			if y2.Op != OpARM64MOVDnop {
-				continue
-			}
-			x2 := y2.Args[0]
-			if x2.Op != OpARM64MOVBUloadidx {
-				continue
-			}
-			_ = x2.Args[2]
-			if ptr != x2.Args[0] {
-				continue
-			}
-			x2_1 := x2.Args[1]
-			if x2_1.Op != OpARM64ADDconst || auxIntToInt64(x2_1.AuxInt) != 5 || idx != x2_1.Args[0] || mem != x2.Args[2] {
-				continue
-			}
-			y3 := o3.Args[1]
-			if y3.Op != OpARM64MOVDnop {
-				continue
-			}
-			x3 := y3.Args[0]
-			if x3.Op != OpARM64MOVBUloadidx {
-				continue
-			}
-			_ = x3.Args[2]
-			if ptr != x3.Args[0] {
-				continue
-			}
-			x3_1 := x3.Args[1]
-			if x3_1.Op != OpARM64ADDconst || auxIntToInt64(x3_1.AuxInt) != 4 || idx != x3_1.Args[0] || mem != x3.Args[2] {
-				continue
-			}
-			y4 := o2.Args[1]
-			if y4.Op != OpARM64MOVDnop {
-				continue
-			}
-			x4 := y4.Args[0]
-			if x4.Op != OpARM64MOVBUloadidx {
-				continue
-			}
-			_ = x4.Args[2]
-			if ptr != x4.Args[0] {
-				continue
-			}
-			x4_1 := x4.Args[1]
-			if x4_1.Op != OpARM64ADDconst || auxIntToInt64(x4_1.AuxInt) != 3 || idx != x4_1.Args[0] || mem != x4.Args[2] {
-				continue
-			}
-			y5 := o1.Args[1]
-			if y5.Op != OpARM64MOVDnop {
-				continue
-			}
-			x5 := y5.Args[0]
-			if x5.Op != OpARM64MOVBUloadidx {
-				continue
-			}
-			_ = x5.Args[2]
-			if ptr != x5.Args[0] {
-				continue
-			}
-			x5_1 := x5.Args[1]
-			if x5_1.Op != OpARM64ADDconst || auxIntToInt64(x5_1.AuxInt) != 2 || idx != x5_1.Args[0] || mem != x5.Args[2] {
-				continue
-			}
-			y6 := o0.Args[1]
-			if y6.Op != OpARM64MOVDnop {
-				continue
-			}
-			x6 := y6.Args[0]
-			if x6.Op != OpARM64MOVBUloadidx {
-				continue
-			}
-			_ = x6.Args[2]
-			if ptr != x6.Args[0] {
-				continue
-			}
-			x6_1 := x6.Args[1]
-			if x6_1.Op != OpARM64ADDconst || auxIntToInt64(x6_1.AuxInt) != 1 || idx != x6_1.Args[0] || mem != x6.Args[2] {
-				continue
-			}
-			y7 := v_1
-			if y7.Op != OpARM64MOVDnop {
-				continue
-			}
-			x7 := y7.Args[0]
-			if x7.Op != OpARM64MOVBUloadidx {
-				continue
-			}
-			_ = x7.Args[2]
-			if ptr != x7.Args[0] || idx != x7.Args[1] || mem != x7.Args[2] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) != nil && clobber(x0, x1, x2, x3, x4, x5, x6, x7, y0, y1, y2, y3, y4, y5, y6, y7, o0, o1, o2, o3, o4, o5, s0)) {
-				continue
-			}
-			b = mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7)
-			v0 := b.NewValue0(v.Pos, OpARM64MOVDloadidx, t)
-			v.copyOf(v0)
-			v0.AddArg3(ptr, idx, mem)
-			return true
-		}
-		break
-	}
-	// match: (OR <t> o0:(ORshiftLL [8] o1:(ORshiftLL [16] s0:(SLLconst [24] y0:(MOVDnop x0:(MOVBUload [i0] {s} p mem))) y1:(MOVDnop x1:(MOVBUload [i1] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [i2] {s} p mem))) y3:(MOVDnop x3:(MOVBUload [i3] {s} p mem)))
-	// cond: i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3) != nil && clobber(x0, x1, x2, x3, y0, y1, y2, y3, o0, o1, s0)
-	// result: @mergePoint(b,x0,x1,x2,x3) (REVW <t> (MOVWUload <t> {s} (OffPtr <p.Type> [int64(i0)] p) mem))
-	for {
-		t := v.Type
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			o0 := v_0
-			if o0.Op != OpARM64ORshiftLL || auxIntToInt64(o0.AuxInt) != 8 {
-				continue
-			}
-			_ = o0.Args[1]
-			o1 := o0.Args[0]
-			if o1.Op != OpARM64ORshiftLL || auxIntToInt64(o1.AuxInt) != 16 {
-				continue
-			}
-			_ = o1.Args[1]
-			s0 := o1.Args[0]
-			if s0.Op != OpARM64SLLconst || auxIntToInt64(s0.AuxInt) != 24 {
-				continue
-			}
-			y0 := s0.Args[0]
-			if y0.Op != OpARM64MOVDnop {
-				continue
-			}
-			x0 := y0.Args[0]
-			if x0.Op != OpARM64MOVBUload {
-				continue
-			}
-			i0 := auxIntToInt32(x0.AuxInt)
-			s := auxToSym(x0.Aux)
-			mem := x0.Args[1]
-			p := x0.Args[0]
-			y1 := o1.Args[1]
-			if y1.Op != OpARM64MOVDnop {
-				continue
-			}
-			x1 := y1.Args[0]
-			if x1.Op != OpARM64MOVBUload {
-				continue
-			}
-			i1 := auxIntToInt32(x1.AuxInt)
-			if auxToSym(x1.Aux) != s {
-				continue
-			}
-			_ = x1.Args[1]
-			if p != x1.Args[0] || mem != x1.Args[1] {
-				continue
-			}
-			y2 := o0.Args[1]
-			if y2.Op != OpARM64MOVDnop {
-				continue
-			}
-			x2 := y2.Args[0]
-			if x2.Op != OpARM64MOVBUload {
-				continue
-			}
-			i2 := auxIntToInt32(x2.AuxInt)
-			if auxToSym(x2.Aux) != s {
-				continue
-			}
-			_ = x2.Args[1]
-			if p != x2.Args[0] || mem != x2.Args[1] {
-				continue
-			}
-			y3 := v_1
-			if y3.Op != OpARM64MOVDnop {
-				continue
-			}
-			x3 := y3.Args[0]
-			if x3.Op != OpARM64MOVBUload {
-				continue
-			}
-			i3 := auxIntToInt32(x3.AuxInt)
-			if auxToSym(x3.Aux) != s {
-				continue
-			}
-			_ = x3.Args[1]
-			if p != x3.Args[0] || mem != x3.Args[1] || !(i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3) != nil && clobber(x0, x1, x2, x3, y0, y1, y2, y3, o0, o1, s0)) {
-				continue
-			}
-			b = mergePoint(b, x0, x1, x2, x3)
-			v0 := b.NewValue0(x3.Pos, OpARM64REVW, t)
-			v.copyOf(v0)
-			v1 := b.NewValue0(x3.Pos, OpARM64MOVWUload, t)
-			v1.Aux = symToAux(s)
-			v2 := b.NewValue0(x3.Pos, OpOffPtr, p.Type)
-			v2.AuxInt = int64ToAuxInt(int64(i0))
-			v2.AddArg(p)
-			v1.AddArg2(v2, mem)
-			v0.AddArg(v1)
-			return true
-		}
-		break
-	}
-	// match: (OR <t> o0:(ORshiftLL [8] o1:(ORshiftLL [16] s0:(SLLconst [24] y0:(MOVDnop x0:(MOVBUloadidx ptr0 idx0 mem))) y1:(MOVDnop x1:(MOVBUload [1] {s} p1:(ADD ptr1 idx1) mem))) y2:(MOVDnop x2:(MOVBUload [2] {s} p mem))) y3:(MOVDnop x3:(MOVBUload [3] {s} p mem)))
-	// cond: s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0, x1, x2, x3, y0, y1, y2, y3, o0, o1, s0)
-	// result: @mergePoint(b,x0,x1,x2,x3) (REVW <t> (MOVWUloadidx <t> ptr0 idx0 mem))
-	for {
-		t := v.Type
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			o0 := v_0
-			if o0.Op != OpARM64ORshiftLL || auxIntToInt64(o0.AuxInt) != 8 {
-				continue
-			}
-			_ = o0.Args[1]
-			o1 := o0.Args[0]
-			if o1.Op != OpARM64ORshiftLL || auxIntToInt64(o1.AuxInt) != 16 {
-				continue
-			}
-			_ = o1.Args[1]
-			s0 := o1.Args[0]
-			if s0.Op != OpARM64SLLconst || auxIntToInt64(s0.AuxInt) != 24 {
-				continue
-			}
-			y0 := s0.Args[0]
-			if y0.Op != OpARM64MOVDnop {
-				continue
-			}
-			x0 := y0.Args[0]
-			if x0.Op != OpARM64MOVBUloadidx {
-				continue
-			}
-			mem := x0.Args[2]
-			ptr0 := x0.Args[0]
-			idx0 := x0.Args[1]
-			y1 := o1.Args[1]
-			if y1.Op != OpARM64MOVDnop {
-				continue
-			}
-			x1 := y1.Args[0]
-			if x1.Op != OpARM64MOVBUload || auxIntToInt32(x1.AuxInt) != 1 {
-				continue
-			}
-			s := auxToSym(x1.Aux)
-			_ = x1.Args[1]
-			p1 := x1.Args[0]
-			if p1.Op != OpARM64ADD {
-				continue
-			}
-			_ = p1.Args[1]
-			p1_0 := p1.Args[0]
-			p1_1 := p1.Args[1]
-			for _i1 := 0; _i1 <= 1; _i1, p1_0, p1_1 = _i1+1, p1_1, p1_0 {
-				ptr1 := p1_0
-				idx1 := p1_1
-				if mem != x1.Args[1] {
-					continue
-				}
-				y2 := o0.Args[1]
-				if y2.Op != OpARM64MOVDnop {
-					continue
-				}
-				x2 := y2.Args[0]
-				if x2.Op != OpARM64MOVBUload || auxIntToInt32(x2.AuxInt) != 2 || auxToSym(x2.Aux) != s {
-					continue
-				}
-				_ = x2.Args[1]
-				p := x2.Args[0]
-				if mem != x2.Args[1] {
-					continue
-				}
-				y3 := v_1
-				if y3.Op != OpARM64MOVDnop {
-					continue
-				}
-				x3 := y3.Args[0]
-				if x3.Op != OpARM64MOVBUload || auxIntToInt32(x3.AuxInt) != 3 || auxToSym(x3.Aux) != s {
-					continue
-				}
-				_ = x3.Args[1]
-				if p != x3.Args[0] || mem != x3.Args[1] || !(s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0, x1, x2, x3, y0, y1, y2, y3, o0, o1, s0)) {
-					continue
-				}
-				b = mergePoint(b, x0, x1, x2, x3)
-				v0 := b.NewValue0(x3.Pos, OpARM64REVW, t)
-				v.copyOf(v0)
-				v1 := b.NewValue0(x3.Pos, OpARM64MOVWUloadidx, t)
-				v1.AddArg3(ptr0, idx0, mem)
-				v0.AddArg(v1)
-				return true
-			}
-		}
-		break
-	}
-	// match: (OR <t> o0:(ORshiftLL [8] o1:(ORshiftLL [16] s0:(SLLconst [24] y0:(MOVDnop x0:(MOVBUloadidx ptr idx mem))) y1:(MOVDnop x1:(MOVBUloadidx ptr (ADDconst [1] idx) mem))) y2:(MOVDnop x2:(MOVBUloadidx ptr (ADDconst [2] idx) mem))) y3:(MOVDnop x3:(MOVBUloadidx ptr (ADDconst [3] idx) mem)))
-	// cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3) != nil && clobber(x0, x1, x2, x3, y0, y1, y2, y3, o0, o1, s0)
-	// result: @mergePoint(b,x0,x1,x2,x3) (REVW <t> (MOVWUloadidx <t> ptr idx mem))
-	for {
-		t := v.Type
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			o0 := v_0
-			if o0.Op != OpARM64ORshiftLL || auxIntToInt64(o0.AuxInt) != 8 {
-				continue
-			}
-			_ = o0.Args[1]
-			o1 := o0.Args[0]
-			if o1.Op != OpARM64ORshiftLL || auxIntToInt64(o1.AuxInt) != 16 {
-				continue
-			}
-			_ = o1.Args[1]
-			s0 := o1.Args[0]
-			if s0.Op != OpARM64SLLconst || auxIntToInt64(s0.AuxInt) != 24 {
-				continue
-			}
-			y0 := s0.Args[0]
-			if y0.Op != OpARM64MOVDnop {
-				continue
-			}
-			x0 := y0.Args[0]
-			if x0.Op != OpARM64MOVBUloadidx {
-				continue
-			}
-			mem := x0.Args[2]
-			ptr := x0.Args[0]
-			idx := x0.Args[1]
-			y1 := o1.Args[1]
-			if y1.Op != OpARM64MOVDnop {
-				continue
-			}
-			x1 := y1.Args[0]
-			if x1.Op != OpARM64MOVBUloadidx {
-				continue
-			}
-			_ = x1.Args[2]
-			if ptr != x1.Args[0] {
-				continue
-			}
-			x1_1 := x1.Args[1]
-			if x1_1.Op != OpARM64ADDconst || auxIntToInt64(x1_1.AuxInt) != 1 || idx != x1_1.Args[0] || mem != x1.Args[2] {
-				continue
-			}
-			y2 := o0.Args[1]
-			if y2.Op != OpARM64MOVDnop {
-				continue
-			}
-			x2 := y2.Args[0]
-			if x2.Op != OpARM64MOVBUloadidx {
-				continue
-			}
-			_ = x2.Args[2]
-			if ptr != x2.Args[0] {
-				continue
-			}
-			x2_1 := x2.Args[1]
-			if x2_1.Op != OpARM64ADDconst || auxIntToInt64(x2_1.AuxInt) != 2 || idx != x2_1.Args[0] || mem != x2.Args[2] {
-				continue
-			}
-			y3 := v_1
-			if y3.Op != OpARM64MOVDnop {
-				continue
-			}
-			x3 := y3.Args[0]
-			if x3.Op != OpARM64MOVBUloadidx {
-				continue
-			}
-			_ = x3.Args[2]
-			if ptr != x3.Args[0] {
-				continue
-			}
-			x3_1 := x3.Args[1]
-			if x3_1.Op != OpARM64ADDconst || auxIntToInt64(x3_1.AuxInt) != 3 || idx != x3_1.Args[0] || mem != x3.Args[2] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3) != nil && clobber(x0, x1, x2, x3, y0, y1, y2, y3, o0, o1, s0)) {
-				continue
-			}
-			b = mergePoint(b, x0, x1, x2, x3)
-			v0 := b.NewValue0(v.Pos, OpARM64REVW, t)
-			v.copyOf(v0)
-			v1 := b.NewValue0(v.Pos, OpARM64MOVWUloadidx, t)
-			v1.AddArg3(ptr, idx, mem)
-			v0.AddArg(v1)
-			return true
-		}
-		break
-	}
-	// match: (OR <t> o0:(ORshiftLL [8] o1:(ORshiftLL [16] o2:(ORshiftLL [24] o3:(ORshiftLL [32] o4:(ORshiftLL [40] o5:(ORshiftLL [48] s0:(SLLconst [56] y0:(MOVDnop x0:(MOVBUload [i0] {s} p mem))) y1:(MOVDnop x1:(MOVBUload [i1] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [i2] {s} p mem))) y3:(MOVDnop x3:(MOVBUload [i3] {s} p mem))) y4:(MOVDnop x4:(MOVBUload [i4] {s} p mem))) y5:(MOVDnop x5:(MOVBUload [i5] {s} p mem))) y6:(MOVDnop x6:(MOVBUload [i6] {s} p mem))) y7:(MOVDnop x7:(MOVBUload [i7] {s} p mem)))
-	// cond: i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) != nil && clobber(x0, x1, x2, x3, x4, x5, x6, x7, y0, y1, y2, y3, y4, y5, y6, y7, o0, o1, o2, o3, o4, o5, s0)
-	// result: @mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) (REV <t> (MOVDload <t> {s} (OffPtr <p.Type> [int64(i0)] p) mem))
-	for {
-		t := v.Type
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			o0 := v_0
-			if o0.Op != OpARM64ORshiftLL || auxIntToInt64(o0.AuxInt) != 8 {
-				continue
-			}
-			_ = o0.Args[1]
-			o1 := o0.Args[0]
-			if o1.Op != OpARM64ORshiftLL || auxIntToInt64(o1.AuxInt) != 16 {
-				continue
-			}
-			_ = o1.Args[1]
-			o2 := o1.Args[0]
-			if o2.Op != OpARM64ORshiftLL || auxIntToInt64(o2.AuxInt) != 24 {
-				continue
-			}
-			_ = o2.Args[1]
-			o3 := o2.Args[0]
-			if o3.Op != OpARM64ORshiftLL || auxIntToInt64(o3.AuxInt) != 32 {
-				continue
-			}
-			_ = o3.Args[1]
-			o4 := o3.Args[0]
-			if o4.Op != OpARM64ORshiftLL || auxIntToInt64(o4.AuxInt) != 40 {
-				continue
-			}
-			_ = o4.Args[1]
-			o5 := o4.Args[0]
-			if o5.Op != OpARM64ORshiftLL || auxIntToInt64(o5.AuxInt) != 48 {
-				continue
-			}
-			_ = o5.Args[1]
-			s0 := o5.Args[0]
-			if s0.Op != OpARM64SLLconst || auxIntToInt64(s0.AuxInt) != 56 {
-				continue
-			}
-			y0 := s0.Args[0]
-			if y0.Op != OpARM64MOVDnop {
-				continue
-			}
-			x0 := y0.Args[0]
-			if x0.Op != OpARM64MOVBUload {
-				continue
-			}
-			i0 := auxIntToInt32(x0.AuxInt)
-			s := auxToSym(x0.Aux)
-			mem := x0.Args[1]
-			p := x0.Args[0]
-			y1 := o5.Args[1]
-			if y1.Op != OpARM64MOVDnop {
-				continue
-			}
-			x1 := y1.Args[0]
-			if x1.Op != OpARM64MOVBUload {
-				continue
-			}
-			i1 := auxIntToInt32(x1.AuxInt)
-			if auxToSym(x1.Aux) != s {
-				continue
-			}
-			_ = x1.Args[1]
-			if p != x1.Args[0] || mem != x1.Args[1] {
-				continue
-			}
-			y2 := o4.Args[1]
-			if y2.Op != OpARM64MOVDnop {
-				continue
-			}
-			x2 := y2.Args[0]
-			if x2.Op != OpARM64MOVBUload {
-				continue
-			}
-			i2 := auxIntToInt32(x2.AuxInt)
-			if auxToSym(x2.Aux) != s {
-				continue
-			}
-			_ = x2.Args[1]
-			if p != x2.Args[0] || mem != x2.Args[1] {
-				continue
-			}
-			y3 := o3.Args[1]
-			if y3.Op != OpARM64MOVDnop {
-				continue
-			}
-			x3 := y3.Args[0]
-			if x3.Op != OpARM64MOVBUload {
-				continue
-			}
-			i3 := auxIntToInt32(x3.AuxInt)
-			if auxToSym(x3.Aux) != s {
-				continue
-			}
-			_ = x3.Args[1]
-			if p != x3.Args[0] || mem != x3.Args[1] {
-				continue
-			}
-			y4 := o2.Args[1]
-			if y4.Op != OpARM64MOVDnop {
-				continue
-			}
-			x4 := y4.Args[0]
-			if x4.Op != OpARM64MOVBUload {
-				continue
-			}
-			i4 := auxIntToInt32(x4.AuxInt)
-			if auxToSym(x4.Aux) != s {
-				continue
-			}
-			_ = x4.Args[1]
-			if p != x4.Args[0] || mem != x4.Args[1] {
-				continue
-			}
-			y5 := o1.Args[1]
-			if y5.Op != OpARM64MOVDnop {
-				continue
-			}
-			x5 := y5.Args[0]
-			if x5.Op != OpARM64MOVBUload {
-				continue
-			}
-			i5 := auxIntToInt32(x5.AuxInt)
-			if auxToSym(x5.Aux) != s {
-				continue
-			}
-			_ = x5.Args[1]
-			if p != x5.Args[0] || mem != x5.Args[1] {
-				continue
-			}
-			y6 := o0.Args[1]
-			if y6.Op != OpARM64MOVDnop {
-				continue
-			}
-			x6 := y6.Args[0]
-			if x6.Op != OpARM64MOVBUload {
-				continue
-			}
-			i6 := auxIntToInt32(x6.AuxInt)
-			if auxToSym(x6.Aux) != s {
-				continue
-			}
-			_ = x6.Args[1]
-			if p != x6.Args[0] || mem != x6.Args[1] {
-				continue
-			}
-			y7 := v_1
-			if y7.Op != OpARM64MOVDnop {
-				continue
-			}
-			x7 := y7.Args[0]
-			if x7.Op != OpARM64MOVBUload {
-				continue
-			}
-			i7 := auxIntToInt32(x7.AuxInt)
-			if auxToSym(x7.Aux) != s {
-				continue
-			}
-			_ = x7.Args[1]
-			if p != x7.Args[0] || mem != x7.Args[1] || !(i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) != nil && clobber(x0, x1, x2, x3, x4, x5, x6, x7, y0, y1, y2, y3, y4, y5, y6, y7, o0, o1, o2, o3, o4, o5, s0)) {
-				continue
-			}
-			b = mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7)
-			v0 := b.NewValue0(x7.Pos, OpARM64REV, t)
-			v.copyOf(v0)
-			v1 := b.NewValue0(x7.Pos, OpARM64MOVDload, t)
-			v1.Aux = symToAux(s)
-			v2 := b.NewValue0(x7.Pos, OpOffPtr, p.Type)
-			v2.AuxInt = int64ToAuxInt(int64(i0))
-			v2.AddArg(p)
-			v1.AddArg2(v2, mem)
-			v0.AddArg(v1)
-			return true
-		}
-		break
-	}
-	// match: (OR <t> o0:(ORshiftLL [8] o1:(ORshiftLL [16] o2:(ORshiftLL [24] o3:(ORshiftLL [32] o4:(ORshiftLL [40] o5:(ORshiftLL [48] s0:(SLLconst [56] y0:(MOVDnop x0:(MOVBUloadidx ptr0 idx0 mem))) y1:(MOVDnop x1:(MOVBUload [1] {s} p1:(ADD ptr1 idx1) mem))) y2:(MOVDnop x2:(MOVBUload [2] {s} p mem))) y3:(MOVDnop x3:(MOVBUload [3] {s} p mem))) y4:(MOVDnop x4:(MOVBUload [4] {s} p mem))) y5:(MOVDnop x5:(MOVBUload [5] {s} p mem))) y6:(MOVDnop x6:(MOVBUload [6] {s} p mem))) y7:(MOVDnop x7:(MOVBUload [7] {s} p mem)))
-	// cond: s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0, x1, x2, x3, x4, x5, x6, x7, y0, y1, y2, y3, y4, y5, y6, y7, o0, o1, o2, o3, o4, o5, s0)
-	// result: @mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) (REV <t> (MOVDloadidx <t> ptr0 idx0 mem))
-	for {
-		t := v.Type
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			o0 := v_0
-			if o0.Op != OpARM64ORshiftLL || auxIntToInt64(o0.AuxInt) != 8 {
-				continue
-			}
-			_ = o0.Args[1]
-			o1 := o0.Args[0]
-			if o1.Op != OpARM64ORshiftLL || auxIntToInt64(o1.AuxInt) != 16 {
-				continue
-			}
-			_ = o1.Args[1]
-			o2 := o1.Args[0]
-			if o2.Op != OpARM64ORshiftLL || auxIntToInt64(o2.AuxInt) != 24 {
-				continue
-			}
-			_ = o2.Args[1]
-			o3 := o2.Args[0]
-			if o3.Op != OpARM64ORshiftLL || auxIntToInt64(o3.AuxInt) != 32 {
-				continue
-			}
-			_ = o3.Args[1]
-			o4 := o3.Args[0]
-			if o4.Op != OpARM64ORshiftLL || auxIntToInt64(o4.AuxInt) != 40 {
-				continue
-			}
-			_ = o4.Args[1]
-			o5 := o4.Args[0]
-			if o5.Op != OpARM64ORshiftLL || auxIntToInt64(o5.AuxInt) != 48 {
-				continue
-			}
-			_ = o5.Args[1]
-			s0 := o5.Args[0]
-			if s0.Op != OpARM64SLLconst || auxIntToInt64(s0.AuxInt) != 56 {
-				continue
-			}
-			y0 := s0.Args[0]
-			if y0.Op != OpARM64MOVDnop {
-				continue
-			}
-			x0 := y0.Args[0]
-			if x0.Op != OpARM64MOVBUloadidx {
-				continue
-			}
-			mem := x0.Args[2]
-			ptr0 := x0.Args[0]
-			idx0 := x0.Args[1]
-			y1 := o5.Args[1]
-			if y1.Op != OpARM64MOVDnop {
-				continue
-			}
-			x1 := y1.Args[0]
-			if x1.Op != OpARM64MOVBUload || auxIntToInt32(x1.AuxInt) != 1 {
-				continue
-			}
-			s := auxToSym(x1.Aux)
-			_ = x1.Args[1]
-			p1 := x1.Args[0]
-			if p1.Op != OpARM64ADD {
-				continue
-			}
-			_ = p1.Args[1]
-			p1_0 := p1.Args[0]
-			p1_1 := p1.Args[1]
-			for _i1 := 0; _i1 <= 1; _i1, p1_0, p1_1 = _i1+1, p1_1, p1_0 {
-				ptr1 := p1_0
-				idx1 := p1_1
-				if mem != x1.Args[1] {
-					continue
-				}
-				y2 := o4.Args[1]
-				if y2.Op != OpARM64MOVDnop {
-					continue
-				}
-				x2 := y2.Args[0]
-				if x2.Op != OpARM64MOVBUload || auxIntToInt32(x2.AuxInt) != 2 || auxToSym(x2.Aux) != s {
-					continue
-				}
-				_ = x2.Args[1]
-				p := x2.Args[0]
-				if mem != x2.Args[1] {
-					continue
-				}
-				y3 := o3.Args[1]
-				if y3.Op != OpARM64MOVDnop {
-					continue
-				}
-				x3 := y3.Args[0]
-				if x3.Op != OpARM64MOVBUload || auxIntToInt32(x3.AuxInt) != 3 || auxToSym(x3.Aux) != s {
-					continue
-				}
-				_ = x3.Args[1]
-				if p != x3.Args[0] || mem != x3.Args[1] {
-					continue
-				}
-				y4 := o2.Args[1]
-				if y4.Op != OpARM64MOVDnop {
-					continue
-				}
-				x4 := y4.Args[0]
-				if x4.Op != OpARM64MOVBUload || auxIntToInt32(x4.AuxInt) != 4 || auxToSym(x4.Aux) != s {
-					continue
-				}
-				_ = x4.Args[1]
-				if p != x4.Args[0] || mem != x4.Args[1] {
-					continue
-				}
-				y5 := o1.Args[1]
-				if y5.Op != OpARM64MOVDnop {
-					continue
-				}
-				x5 := y5.Args[0]
-				if x5.Op != OpARM64MOVBUload || auxIntToInt32(x5.AuxInt) != 5 || auxToSym(x5.Aux) != s {
-					continue
-				}
-				_ = x5.Args[1]
-				if p != x5.Args[0] || mem != x5.Args[1] {
-					continue
-				}
-				y6 := o0.Args[1]
-				if y6.Op != OpARM64MOVDnop {
-					continue
-				}
-				x6 := y6.Args[0]
-				if x6.Op != OpARM64MOVBUload || auxIntToInt32(x6.AuxInt) != 6 || auxToSym(x6.Aux) != s {
-					continue
-				}
-				_ = x6.Args[1]
-				if p != x6.Args[0] || mem != x6.Args[1] {
-					continue
-				}
-				y7 := v_1
-				if y7.Op != OpARM64MOVDnop {
-					continue
-				}
-				x7 := y7.Args[0]
-				if x7.Op != OpARM64MOVBUload || auxIntToInt32(x7.AuxInt) != 7 || auxToSym(x7.Aux) != s {
-					continue
-				}
-				_ = x7.Args[1]
-				if p != x7.Args[0] || mem != x7.Args[1] || !(s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0, x1, x2, x3, x4, x5, x6, x7, y0, y1, y2, y3, y4, y5, y6, y7, o0, o1, o2, o3, o4, o5, s0)) {
-					continue
-				}
-				b = mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7)
-				v0 := b.NewValue0(x7.Pos, OpARM64REV, t)
-				v.copyOf(v0)
-				v1 := b.NewValue0(x7.Pos, OpARM64MOVDloadidx, t)
-				v1.AddArg3(ptr0, idx0, mem)
-				v0.AddArg(v1)
-				return true
-			}
-		}
-		break
-	}
-	// match: (OR <t> o0:(ORshiftLL [8] o1:(ORshiftLL [16] o2:(ORshiftLL [24] o3:(ORshiftLL [32] o4:(ORshiftLL [40] o5:(ORshiftLL [48] s0:(SLLconst [56] y0:(MOVDnop x0:(MOVBUloadidx ptr idx mem))) y1:(MOVDnop x1:(MOVBUloadidx ptr (ADDconst [1] idx) mem))) y2:(MOVDnop x2:(MOVBUloadidx ptr (ADDconst [2] idx) mem))) y3:(MOVDnop x3:(MOVBUloadidx ptr (ADDconst [3] idx) mem))) y4:(MOVDnop x4:(MOVBUloadidx ptr (ADDconst [4] idx) mem))) y5:(MOVDnop x5:(MOVBUloadidx ptr (ADDconst [5] idx) mem))) y6:(MOVDnop x6:(MOVBUloadidx ptr (ADDconst [6] idx) mem))) y7:(MOVDnop x7:(MOVBUloadidx ptr (ADDconst [7] idx) mem)))
-	// cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) != nil && clobber(x0, x1, x2, x3, x4, x5, x6, x7, y0, y1, y2, y3, y4, y5, y6, y7, o0, o1, o2, o3, o4, o5, s0)
-	// result: @mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) (REV <t> (MOVDloadidx <t> ptr idx mem))
-	for {
-		t := v.Type
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			o0 := v_0
-			if o0.Op != OpARM64ORshiftLL || auxIntToInt64(o0.AuxInt) != 8 {
-				continue
-			}
-			_ = o0.Args[1]
-			o1 := o0.Args[0]
-			if o1.Op != OpARM64ORshiftLL || auxIntToInt64(o1.AuxInt) != 16 {
-				continue
-			}
-			_ = o1.Args[1]
-			o2 := o1.Args[0]
-			if o2.Op != OpARM64ORshiftLL || auxIntToInt64(o2.AuxInt) != 24 {
-				continue
-			}
-			_ = o2.Args[1]
-			o3 := o2.Args[0]
-			if o3.Op != OpARM64ORshiftLL || auxIntToInt64(o3.AuxInt) != 32 {
-				continue
-			}
-			_ = o3.Args[1]
-			o4 := o3.Args[0]
-			if o4.Op != OpARM64ORshiftLL || auxIntToInt64(o4.AuxInt) != 40 {
-				continue
-			}
-			_ = o4.Args[1]
-			o5 := o4.Args[0]
-			if o5.Op != OpARM64ORshiftLL || auxIntToInt64(o5.AuxInt) != 48 {
-				continue
-			}
-			_ = o5.Args[1]
-			s0 := o5.Args[0]
-			if s0.Op != OpARM64SLLconst || auxIntToInt64(s0.AuxInt) != 56 {
-				continue
-			}
-			y0 := s0.Args[0]
-			if y0.Op != OpARM64MOVDnop {
-				continue
-			}
-			x0 := y0.Args[0]
-			if x0.Op != OpARM64MOVBUloadidx {
-				continue
-			}
-			mem := x0.Args[2]
-			ptr := x0.Args[0]
-			idx := x0.Args[1]
-			y1 := o5.Args[1]
-			if y1.Op != OpARM64MOVDnop {
-				continue
-			}
-			x1 := y1.Args[0]
-			if x1.Op != OpARM64MOVBUloadidx {
-				continue
-			}
-			_ = x1.Args[2]
-			if ptr != x1.Args[0] {
-				continue
-			}
-			x1_1 := x1.Args[1]
-			if x1_1.Op != OpARM64ADDconst || auxIntToInt64(x1_1.AuxInt) != 1 || idx != x1_1.Args[0] || mem != x1.Args[2] {
-				continue
-			}
-			y2 := o4.Args[1]
-			if y2.Op != OpARM64MOVDnop {
-				continue
-			}
-			x2 := y2.Args[0]
-			if x2.Op != OpARM64MOVBUloadidx {
-				continue
-			}
-			_ = x2.Args[2]
-			if ptr != x2.Args[0] {
-				continue
-			}
-			x2_1 := x2.Args[1]
-			if x2_1.Op != OpARM64ADDconst || auxIntToInt64(x2_1.AuxInt) != 2 || idx != x2_1.Args[0] || mem != x2.Args[2] {
-				continue
-			}
-			y3 := o3.Args[1]
-			if y3.Op != OpARM64MOVDnop {
-				continue
-			}
-			x3 := y3.Args[0]
-			if x3.Op != OpARM64MOVBUloadidx {
-				continue
-			}
-			_ = x3.Args[2]
-			if ptr != x3.Args[0] {
-				continue
-			}
-			x3_1 := x3.Args[1]
-			if x3_1.Op != OpARM64ADDconst || auxIntToInt64(x3_1.AuxInt) != 3 || idx != x3_1.Args[0] || mem != x3.Args[2] {
-				continue
-			}
-			y4 := o2.Args[1]
-			if y4.Op != OpARM64MOVDnop {
-				continue
-			}
-			x4 := y4.Args[0]
-			if x4.Op != OpARM64MOVBUloadidx {
-				continue
-			}
-			_ = x4.Args[2]
-			if ptr != x4.Args[0] {
-				continue
-			}
-			x4_1 := x4.Args[1]
-			if x4_1.Op != OpARM64ADDconst || auxIntToInt64(x4_1.AuxInt) != 4 || idx != x4_1.Args[0] || mem != x4.Args[2] {
-				continue
-			}
-			y5 := o1.Args[1]
-			if y5.Op != OpARM64MOVDnop {
-				continue
-			}
-			x5 := y5.Args[0]
-			if x5.Op != OpARM64MOVBUloadidx {
-				continue
-			}
-			_ = x5.Args[2]
-			if ptr != x5.Args[0] {
-				continue
-			}
-			x5_1 := x5.Args[1]
-			if x5_1.Op != OpARM64ADDconst || auxIntToInt64(x5_1.AuxInt) != 5 || idx != x5_1.Args[0] || mem != x5.Args[2] {
-				continue
-			}
-			y6 := o0.Args[1]
-			if y6.Op != OpARM64MOVDnop {
-				continue
-			}
-			x6 := y6.Args[0]
-			if x6.Op != OpARM64MOVBUloadidx {
-				continue
-			}
-			_ = x6.Args[2]
-			if ptr != x6.Args[0] {
-				continue
-			}
-			x6_1 := x6.Args[1]
-			if x6_1.Op != OpARM64ADDconst || auxIntToInt64(x6_1.AuxInt) != 6 || idx != x6_1.Args[0] || mem != x6.Args[2] {
-				continue
-			}
-			y7 := v_1
-			if y7.Op != OpARM64MOVDnop {
-				continue
-			}
-			x7 := y7.Args[0]
-			if x7.Op != OpARM64MOVBUloadidx {
-				continue
-			}
-			_ = x7.Args[2]
-			if ptr != x7.Args[0] {
-				continue
-			}
-			x7_1 := x7.Args[1]
-			if x7_1.Op != OpARM64ADDconst || auxIntToInt64(x7_1.AuxInt) != 7 || idx != x7_1.Args[0] || mem != x7.Args[2] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) != nil && clobber(x0, x1, x2, x3, x4, x5, x6, x7, y0, y1, y2, y3, y4, y5, y6, y7, o0, o1, o2, o3, o4, o5, s0)) {
-				continue
-			}
-			b = mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7)
-			v0 := b.NewValue0(v.Pos, OpARM64REV, t)
-			v.copyOf(v0)
-			v1 := b.NewValue0(v.Pos, OpARM64MOVDloadidx, t)
-			v1.AddArg3(ptr, idx, mem)
-			v0.AddArg(v1)
-			return true
-		}
-		break
-	}
 	return false
 }
 func rewriteValueARM64_OpARM64ORN(v *Value) bool {
@@ -19283,1452 +15667,6 @@
 		v.AddArg2(y, x)
 		return true
 	}
-	// match: (ORshiftLL <t> [8] y0:(MOVDnop x0:(MOVBUload [i0] {s} p mem)) y1:(MOVDnop x1:(MOVBUload [i1] {s} p mem)))
-	// cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0, x1, y0, y1)
-	// result: @mergePoint(b,x0,x1) (MOVHUload <t> {s} (OffPtr <p.Type> [int64(i0)] p) mem)
-	for {
-		t := v.Type
-		if auxIntToInt64(v.AuxInt) != 8 {
-			break
-		}
-		y0 := v_0
-		if y0.Op != OpARM64MOVDnop {
-			break
-		}
-		x0 := y0.Args[0]
-		if x0.Op != OpARM64MOVBUload {
-			break
-		}
-		i0 := auxIntToInt32(x0.AuxInt)
-		s := auxToSym(x0.Aux)
-		mem := x0.Args[1]
-		p := x0.Args[0]
-		y1 := v_1
-		if y1.Op != OpARM64MOVDnop {
-			break
-		}
-		x1 := y1.Args[0]
-		if x1.Op != OpARM64MOVBUload {
-			break
-		}
-		i1 := auxIntToInt32(x1.AuxInt)
-		if auxToSym(x1.Aux) != s {
-			break
-		}
-		_ = x1.Args[1]
-		if p != x1.Args[0] || mem != x1.Args[1] || !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0, x1, y0, y1)) {
-			break
-		}
-		b = mergePoint(b, x0, x1)
-		v0 := b.NewValue0(x1.Pos, OpARM64MOVHUload, t)
-		v.copyOf(v0)
-		v0.Aux = symToAux(s)
-		v1 := b.NewValue0(x1.Pos, OpOffPtr, p.Type)
-		v1.AuxInt = int64ToAuxInt(int64(i0))
-		v1.AddArg(p)
-		v0.AddArg2(v1, mem)
-		return true
-	}
-	// match: (ORshiftLL <t> [8] y0:(MOVDnop x0:(MOVBUloadidx ptr0 idx0 mem)) y1:(MOVDnop x1:(MOVBUload [1] {s} p1:(ADD ptr1 idx1) mem)))
-	// cond: s == nil && x0.Uses == 1 && x1.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && mergePoint(b,x0,x1) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x0, x1, y0, y1)
-	// result: @mergePoint(b,x0,x1) (MOVHUloadidx <t> ptr0 idx0 mem)
-	for {
-		t := v.Type
-		if auxIntToInt64(v.AuxInt) != 8 {
-			break
-		}
-		y0 := v_0
-		if y0.Op != OpARM64MOVDnop {
-			break
-		}
-		x0 := y0.Args[0]
-		if x0.Op != OpARM64MOVBUloadidx {
-			break
-		}
-		mem := x0.Args[2]
-		ptr0 := x0.Args[0]
-		idx0 := x0.Args[1]
-		y1 := v_1
-		if y1.Op != OpARM64MOVDnop {
-			break
-		}
-		x1 := y1.Args[0]
-		if x1.Op != OpARM64MOVBUload || auxIntToInt32(x1.AuxInt) != 1 {
-			break
-		}
-		s := auxToSym(x1.Aux)
-		_ = x1.Args[1]
-		p1 := x1.Args[0]
-		if p1.Op != OpARM64ADD {
-			break
-		}
-		_ = p1.Args[1]
-		p1_0 := p1.Args[0]
-		p1_1 := p1.Args[1]
-		for _i0 := 0; _i0 <= 1; _i0, p1_0, p1_1 = _i0+1, p1_1, p1_0 {
-			ptr1 := p1_0
-			idx1 := p1_1
-			if mem != x1.Args[1] || !(s == nil && x0.Uses == 1 && x1.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && mergePoint(b, x0, x1) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x0, x1, y0, y1)) {
-				continue
-			}
-			b = mergePoint(b, x0, x1)
-			v0 := b.NewValue0(x1.Pos, OpARM64MOVHUloadidx, t)
-			v.copyOf(v0)
-			v0.AddArg3(ptr0, idx0, mem)
-			return true
-		}
-		break
-	}
-	// match: (ORshiftLL <t> [8] y0:(MOVDnop x0:(MOVBUloadidx ptr idx mem)) y1:(MOVDnop x1:(MOVBUloadidx ptr (ADDconst [1] idx) mem)))
-	// cond: x0.Uses == 1 && x1.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0, x1, y0, y1)
-	// result: @mergePoint(b,x0,x1) (MOVHUloadidx <t> ptr idx mem)
-	for {
-		t := v.Type
-		if auxIntToInt64(v.AuxInt) != 8 {
-			break
-		}
-		y0 := v_0
-		if y0.Op != OpARM64MOVDnop {
-			break
-		}
-		x0 := y0.Args[0]
-		if x0.Op != OpARM64MOVBUloadidx {
-			break
-		}
-		mem := x0.Args[2]
-		ptr := x0.Args[0]
-		idx := x0.Args[1]
-		y1 := v_1
-		if y1.Op != OpARM64MOVDnop {
-			break
-		}
-		x1 := y1.Args[0]
-		if x1.Op != OpARM64MOVBUloadidx {
-			break
-		}
-		_ = x1.Args[2]
-		if ptr != x1.Args[0] {
-			break
-		}
-		x1_1 := x1.Args[1]
-		if x1_1.Op != OpARM64ADDconst || auxIntToInt64(x1_1.AuxInt) != 1 || idx != x1_1.Args[0] || mem != x1.Args[2] || !(x0.Uses == 1 && x1.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0, x1, y0, y1)) {
-			break
-		}
-		b = mergePoint(b, x0, x1)
-		v0 := b.NewValue0(v.Pos, OpARM64MOVHUloadidx, t)
-		v.copyOf(v0)
-		v0.AddArg3(ptr, idx, mem)
-		return true
-	}
-	// match: (ORshiftLL <t> [24] o0:(ORshiftLL [16] x0:(MOVHUload [i0] {s} p mem) y1:(MOVDnop x1:(MOVBUload [i2] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [i3] {s} p mem)))
-	// cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0, x1, x2, y1, y2, o0)
-	// result: @mergePoint(b,x0,x1,x2) (MOVWUload <t> {s} (OffPtr <p.Type> [int64(i0)] p) mem)
-	for {
-		t := v.Type
-		if auxIntToInt64(v.AuxInt) != 24 {
-			break
-		}
-		o0 := v_0
-		if o0.Op != OpARM64ORshiftLL || auxIntToInt64(o0.AuxInt) != 16 {
-			break
-		}
-		_ = o0.Args[1]
-		x0 := o0.Args[0]
-		if x0.Op != OpARM64MOVHUload {
-			break
-		}
-		i0 := auxIntToInt32(x0.AuxInt)
-		s := auxToSym(x0.Aux)
-		mem := x0.Args[1]
-		p := x0.Args[0]
-		y1 := o0.Args[1]
-		if y1.Op != OpARM64MOVDnop {
-			break
-		}
-		x1 := y1.Args[0]
-		if x1.Op != OpARM64MOVBUload {
-			break
-		}
-		i2 := auxIntToInt32(x1.AuxInt)
-		if auxToSym(x1.Aux) != s {
-			break
-		}
-		_ = x1.Args[1]
-		if p != x1.Args[0] || mem != x1.Args[1] {
-			break
-		}
-		y2 := v_1
-		if y2.Op != OpARM64MOVDnop {
-			break
-		}
-		x2 := y2.Args[0]
-		if x2.Op != OpARM64MOVBUload {
-			break
-		}
-		i3 := auxIntToInt32(x2.AuxInt)
-		if auxToSym(x2.Aux) != s {
-			break
-		}
-		_ = x2.Args[1]
-		if p != x2.Args[0] || mem != x2.Args[1] || !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0, x1, x2, y1, y2, o0)) {
-			break
-		}
-		b = mergePoint(b, x0, x1, x2)
-		v0 := b.NewValue0(x2.Pos, OpARM64MOVWUload, t)
-		v.copyOf(v0)
-		v0.Aux = symToAux(s)
-		v1 := b.NewValue0(x2.Pos, OpOffPtr, p.Type)
-		v1.AuxInt = int64ToAuxInt(int64(i0))
-		v1.AddArg(p)
-		v0.AddArg2(v1, mem)
-		return true
-	}
-	// match: (ORshiftLL <t> [24] o0:(ORshiftLL [16] x0:(MOVHUloadidx ptr0 idx0 mem) y1:(MOVDnop x1:(MOVBUload [2] {s} p1:(ADD ptr1 idx1) mem))) y2:(MOVDnop x2:(MOVBUload [3] {s} p mem)))
-	// cond: s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0, x1, x2, y1, y2, o0)
-	// result: @mergePoint(b,x0,x1,x2) (MOVWUloadidx <t> ptr0 idx0 mem)
-	for {
-		t := v.Type
-		if auxIntToInt64(v.AuxInt) != 24 {
-			break
-		}
-		o0 := v_0
-		if o0.Op != OpARM64ORshiftLL || auxIntToInt64(o0.AuxInt) != 16 {
-			break
-		}
-		_ = o0.Args[1]
-		x0 := o0.Args[0]
-		if x0.Op != OpARM64MOVHUloadidx {
-			break
-		}
-		mem := x0.Args[2]
-		ptr0 := x0.Args[0]
-		idx0 := x0.Args[1]
-		y1 := o0.Args[1]
-		if y1.Op != OpARM64MOVDnop {
-			break
-		}
-		x1 := y1.Args[0]
-		if x1.Op != OpARM64MOVBUload || auxIntToInt32(x1.AuxInt) != 2 {
-			break
-		}
-		s := auxToSym(x1.Aux)
-		_ = x1.Args[1]
-		p1 := x1.Args[0]
-		if p1.Op != OpARM64ADD {
-			break
-		}
-		_ = p1.Args[1]
-		p1_0 := p1.Args[0]
-		p1_1 := p1.Args[1]
-		for _i0 := 0; _i0 <= 1; _i0, p1_0, p1_1 = _i0+1, p1_1, p1_0 {
-			ptr1 := p1_0
-			idx1 := p1_1
-			if mem != x1.Args[1] {
-				continue
-			}
-			y2 := v_1
-			if y2.Op != OpARM64MOVDnop {
-				continue
-			}
-			x2 := y2.Args[0]
-			if x2.Op != OpARM64MOVBUload || auxIntToInt32(x2.AuxInt) != 3 || auxToSym(x2.Aux) != s {
-				continue
-			}
-			_ = x2.Args[1]
-			p := x2.Args[0]
-			if mem != x2.Args[1] || !(s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0, x1, x2, y1, y2, o0)) {
-				continue
-			}
-			b = mergePoint(b, x0, x1, x2)
-			v0 := b.NewValue0(x2.Pos, OpARM64MOVWUloadidx, t)
-			v.copyOf(v0)
-			v0.AddArg3(ptr0, idx0, mem)
-			return true
-		}
-		break
-	}
-	// match: (ORshiftLL <t> [24] o0:(ORshiftLL [16] x0:(MOVHUloadidx ptr idx mem) y1:(MOVDnop x1:(MOVBUloadidx ptr (ADDconst [2] idx) mem))) y2:(MOVDnop x2:(MOVBUloadidx ptr (ADDconst [3] idx) mem)))
-	// cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0, x1, x2, y1, y2, o0)
-	// result: @mergePoint(b,x0,x1,x2) (MOVWUloadidx <t> ptr idx mem)
-	for {
-		t := v.Type
-		if auxIntToInt64(v.AuxInt) != 24 {
-			break
-		}
-		o0 := v_0
-		if o0.Op != OpARM64ORshiftLL || auxIntToInt64(o0.AuxInt) != 16 {
-			break
-		}
-		_ = o0.Args[1]
-		x0 := o0.Args[0]
-		if x0.Op != OpARM64MOVHUloadidx {
-			break
-		}
-		mem := x0.Args[2]
-		ptr := x0.Args[0]
-		idx := x0.Args[1]
-		y1 := o0.Args[1]
-		if y1.Op != OpARM64MOVDnop {
-			break
-		}
-		x1 := y1.Args[0]
-		if x1.Op != OpARM64MOVBUloadidx {
-			break
-		}
-		_ = x1.Args[2]
-		if ptr != x1.Args[0] {
-			break
-		}
-		x1_1 := x1.Args[1]
-		if x1_1.Op != OpARM64ADDconst || auxIntToInt64(x1_1.AuxInt) != 2 || idx != x1_1.Args[0] || mem != x1.Args[2] {
-			break
-		}
-		y2 := v_1
-		if y2.Op != OpARM64MOVDnop {
-			break
-		}
-		x2 := y2.Args[0]
-		if x2.Op != OpARM64MOVBUloadidx {
-			break
-		}
-		_ = x2.Args[2]
-		if ptr != x2.Args[0] {
-			break
-		}
-		x2_1 := x2.Args[1]
-		if x2_1.Op != OpARM64ADDconst || auxIntToInt64(x2_1.AuxInt) != 3 || idx != x2_1.Args[0] || mem != x2.Args[2] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0, x1, x2, y1, y2, o0)) {
-			break
-		}
-		b = mergePoint(b, x0, x1, x2)
-		v0 := b.NewValue0(v.Pos, OpARM64MOVWUloadidx, t)
-		v.copyOf(v0)
-		v0.AddArg3(ptr, idx, mem)
-		return true
-	}
-	// match: (ORshiftLL <t> [24] o0:(ORshiftLL [16] x0:(MOVHUloadidx2 ptr0 idx0 mem) y1:(MOVDnop x1:(MOVBUload [2] {s} p1:(ADDshiftLL [1] ptr1 idx1) mem))) y2:(MOVDnop x2:(MOVBUload [3] {s} p mem)))
-	// cond: s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && isSamePtr(p1, p) && clobber(x0, x1, x2, y1, y2, o0)
-	// result: @mergePoint(b,x0,x1,x2) (MOVWUloadidx <t> ptr0 (SLLconst <idx0.Type> [1] idx0) mem)
-	for {
-		t := v.Type
-		if auxIntToInt64(v.AuxInt) != 24 {
-			break
-		}
-		o0 := v_0
-		if o0.Op != OpARM64ORshiftLL || auxIntToInt64(o0.AuxInt) != 16 {
-			break
-		}
-		_ = o0.Args[1]
-		x0 := o0.Args[0]
-		if x0.Op != OpARM64MOVHUloadidx2 {
-			break
-		}
-		mem := x0.Args[2]
-		ptr0 := x0.Args[0]
-		idx0 := x0.Args[1]
-		y1 := o0.Args[1]
-		if y1.Op != OpARM64MOVDnop {
-			break
-		}
-		x1 := y1.Args[0]
-		if x1.Op != OpARM64MOVBUload || auxIntToInt32(x1.AuxInt) != 2 {
-			break
-		}
-		s := auxToSym(x1.Aux)
-		_ = x1.Args[1]
-		p1 := x1.Args[0]
-		if p1.Op != OpARM64ADDshiftLL || auxIntToInt64(p1.AuxInt) != 1 {
-			break
-		}
-		idx1 := p1.Args[1]
-		ptr1 := p1.Args[0]
-		if mem != x1.Args[1] {
-			break
-		}
-		y2 := v_1
-		if y2.Op != OpARM64MOVDnop {
-			break
-		}
-		x2 := y2.Args[0]
-		if x2.Op != OpARM64MOVBUload || auxIntToInt32(x2.AuxInt) != 3 || auxToSym(x2.Aux) != s {
-			break
-		}
-		_ = x2.Args[1]
-		p := x2.Args[0]
-		if mem != x2.Args[1] || !(s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && isSamePtr(p1, p) && clobber(x0, x1, x2, y1, y2, o0)) {
-			break
-		}
-		b = mergePoint(b, x0, x1, x2)
-		v0 := b.NewValue0(x2.Pos, OpARM64MOVWUloadidx, t)
-		v.copyOf(v0)
-		v1 := b.NewValue0(x2.Pos, OpARM64SLLconst, idx0.Type)
-		v1.AuxInt = int64ToAuxInt(1)
-		v1.AddArg(idx0)
-		v0.AddArg3(ptr0, v1, mem)
-		return true
-	}
-	// match: (ORshiftLL <t> [56] o0:(ORshiftLL [48] o1:(ORshiftLL [40] o2:(ORshiftLL [32] x0:(MOVWUload [i0] {s} p mem) y1:(MOVDnop x1:(MOVBUload [i4] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [i5] {s} p mem))) y3:(MOVDnop x3:(MOVBUload [i6] {s} p mem))) y4:(MOVDnop x4:(MOVBUload [i7] {s} p mem)))
-	// cond: i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && mergePoint(b,x0,x1,x2,x3,x4) != nil && clobber(x0, x1, x2, x3, x4, y1, y2, y3, y4, o0, o1, o2)
-	// result: @mergePoint(b,x0,x1,x2,x3,x4) (MOVDload <t> {s} (OffPtr <p.Type> [int64(i0)] p) mem)
-	for {
-		t := v.Type
-		if auxIntToInt64(v.AuxInt) != 56 {
-			break
-		}
-		o0 := v_0
-		if o0.Op != OpARM64ORshiftLL || auxIntToInt64(o0.AuxInt) != 48 {
-			break
-		}
-		_ = o0.Args[1]
-		o1 := o0.Args[0]
-		if o1.Op != OpARM64ORshiftLL || auxIntToInt64(o1.AuxInt) != 40 {
-			break
-		}
-		_ = o1.Args[1]
-		o2 := o1.Args[0]
-		if o2.Op != OpARM64ORshiftLL || auxIntToInt64(o2.AuxInt) != 32 {
-			break
-		}
-		_ = o2.Args[1]
-		x0 := o2.Args[0]
-		if x0.Op != OpARM64MOVWUload {
-			break
-		}
-		i0 := auxIntToInt32(x0.AuxInt)
-		s := auxToSym(x0.Aux)
-		mem := x0.Args[1]
-		p := x0.Args[0]
-		y1 := o2.Args[1]
-		if y1.Op != OpARM64MOVDnop {
-			break
-		}
-		x1 := y1.Args[0]
-		if x1.Op != OpARM64MOVBUload {
-			break
-		}
-		i4 := auxIntToInt32(x1.AuxInt)
-		if auxToSym(x1.Aux) != s {
-			break
-		}
-		_ = x1.Args[1]
-		if p != x1.Args[0] || mem != x1.Args[1] {
-			break
-		}
-		y2 := o1.Args[1]
-		if y2.Op != OpARM64MOVDnop {
-			break
-		}
-		x2 := y2.Args[0]
-		if x2.Op != OpARM64MOVBUload {
-			break
-		}
-		i5 := auxIntToInt32(x2.AuxInt)
-		if auxToSym(x2.Aux) != s {
-			break
-		}
-		_ = x2.Args[1]
-		if p != x2.Args[0] || mem != x2.Args[1] {
-			break
-		}
-		y3 := o0.Args[1]
-		if y3.Op != OpARM64MOVDnop {
-			break
-		}
-		x3 := y3.Args[0]
-		if x3.Op != OpARM64MOVBUload {
-			break
-		}
-		i6 := auxIntToInt32(x3.AuxInt)
-		if auxToSym(x3.Aux) != s {
-			break
-		}
-		_ = x3.Args[1]
-		if p != x3.Args[0] || mem != x3.Args[1] {
-			break
-		}
-		y4 := v_1
-		if y4.Op != OpARM64MOVDnop {
-			break
-		}
-		x4 := y4.Args[0]
-		if x4.Op != OpARM64MOVBUload {
-			break
-		}
-		i7 := auxIntToInt32(x4.AuxInt)
-		if auxToSym(x4.Aux) != s {
-			break
-		}
-		_ = x4.Args[1]
-		if p != x4.Args[0] || mem != x4.Args[1] || !(i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4) != nil && clobber(x0, x1, x2, x3, x4, y1, y2, y3, y4, o0, o1, o2)) {
-			break
-		}
-		b = mergePoint(b, x0, x1, x2, x3, x4)
-		v0 := b.NewValue0(x4.Pos, OpARM64MOVDload, t)
-		v.copyOf(v0)
-		v0.Aux = symToAux(s)
-		v1 := b.NewValue0(x4.Pos, OpOffPtr, p.Type)
-		v1.AuxInt = int64ToAuxInt(int64(i0))
-		v1.AddArg(p)
-		v0.AddArg2(v1, mem)
-		return true
-	}
-	// match: (ORshiftLL <t> [56] o0:(ORshiftLL [48] o1:(ORshiftLL [40] o2:(ORshiftLL [32] x0:(MOVWUloadidx ptr0 idx0 mem) y1:(MOVDnop x1:(MOVBUload [4] {s} p1:(ADD ptr1 idx1) mem))) y2:(MOVDnop x2:(MOVBUload [5] {s} p mem))) y3:(MOVDnop x3:(MOVBUload [6] {s} p mem))) y4:(MOVDnop x4:(MOVBUload [7] {s} p mem)))
-	// cond: s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && mergePoint(b,x0,x1,x2,x3,x4) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0, x1, x2, x3, x4, y1, y2, y3, y4, o0, o1, o2)
-	// result: @mergePoint(b,x0,x1,x2,x3,x4) (MOVDloadidx <t> ptr0 idx0 mem)
-	for {
-		t := v.Type
-		if auxIntToInt64(v.AuxInt) != 56 {
-			break
-		}
-		o0 := v_0
-		if o0.Op != OpARM64ORshiftLL || auxIntToInt64(o0.AuxInt) != 48 {
-			break
-		}
-		_ = o0.Args[1]
-		o1 := o0.Args[0]
-		if o1.Op != OpARM64ORshiftLL || auxIntToInt64(o1.AuxInt) != 40 {
-			break
-		}
-		_ = o1.Args[1]
-		o2 := o1.Args[0]
-		if o2.Op != OpARM64ORshiftLL || auxIntToInt64(o2.AuxInt) != 32 {
-			break
-		}
-		_ = o2.Args[1]
-		x0 := o2.Args[0]
-		if x0.Op != OpARM64MOVWUloadidx {
-			break
-		}
-		mem := x0.Args[2]
-		ptr0 := x0.Args[0]
-		idx0 := x0.Args[1]
-		y1 := o2.Args[1]
-		if y1.Op != OpARM64MOVDnop {
-			break
-		}
-		x1 := y1.Args[0]
-		if x1.Op != OpARM64MOVBUload || auxIntToInt32(x1.AuxInt) != 4 {
-			break
-		}
-		s := auxToSym(x1.Aux)
-		_ = x1.Args[1]
-		p1 := x1.Args[0]
-		if p1.Op != OpARM64ADD {
-			break
-		}
-		_ = p1.Args[1]
-		p1_0 := p1.Args[0]
-		p1_1 := p1.Args[1]
-		for _i0 := 0; _i0 <= 1; _i0, p1_0, p1_1 = _i0+1, p1_1, p1_0 {
-			ptr1 := p1_0
-			idx1 := p1_1
-			if mem != x1.Args[1] {
-				continue
-			}
-			y2 := o1.Args[1]
-			if y2.Op != OpARM64MOVDnop {
-				continue
-			}
-			x2 := y2.Args[0]
-			if x2.Op != OpARM64MOVBUload || auxIntToInt32(x2.AuxInt) != 5 || auxToSym(x2.Aux) != s {
-				continue
-			}
-			_ = x2.Args[1]
-			p := x2.Args[0]
-			if mem != x2.Args[1] {
-				continue
-			}
-			y3 := o0.Args[1]
-			if y3.Op != OpARM64MOVDnop {
-				continue
-			}
-			x3 := y3.Args[0]
-			if x3.Op != OpARM64MOVBUload || auxIntToInt32(x3.AuxInt) != 6 || auxToSym(x3.Aux) != s {
-				continue
-			}
-			_ = x3.Args[1]
-			if p != x3.Args[0] || mem != x3.Args[1] {
-				continue
-			}
-			y4 := v_1
-			if y4.Op != OpARM64MOVDnop {
-				continue
-			}
-			x4 := y4.Args[0]
-			if x4.Op != OpARM64MOVBUload || auxIntToInt32(x4.AuxInt) != 7 || auxToSym(x4.Aux) != s {
-				continue
-			}
-			_ = x4.Args[1]
-			if p != x4.Args[0] || mem != x4.Args[1] || !(s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0, x1, x2, x3, x4, y1, y2, y3, y4, o0, o1, o2)) {
-				continue
-			}
-			b = mergePoint(b, x0, x1, x2, x3, x4)
-			v0 := b.NewValue0(x4.Pos, OpARM64MOVDloadidx, t)
-			v.copyOf(v0)
-			v0.AddArg3(ptr0, idx0, mem)
-			return true
-		}
-		break
-	}
-	// match: (ORshiftLL <t> [56] o0:(ORshiftLL [48] o1:(ORshiftLL [40] o2:(ORshiftLL [32] x0:(MOVWUloadidx4 ptr0 idx0 mem) y1:(MOVDnop x1:(MOVBUload [4] {s} p1:(ADDshiftLL [2] ptr1 idx1) mem))) y2:(MOVDnop x2:(MOVBUload [5] {s} p mem))) y3:(MOVDnop x3:(MOVBUload [6] {s} p mem))) y4:(MOVDnop x4:(MOVBUload [7] {s} p mem)))
-	// cond: s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && mergePoint(b,x0,x1,x2,x3,x4) != nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && isSamePtr(p1, p) && clobber(x0, x1, x2, x3, x4, y1, y2, y3, y4, o0, o1, o2)
-	// result: @mergePoint(b,x0,x1,x2,x3,x4) (MOVDloadidx <t> ptr0 (SLLconst <idx0.Type> [2] idx0) mem)
-	for {
-		t := v.Type
-		if auxIntToInt64(v.AuxInt) != 56 {
-			break
-		}
-		o0 := v_0
-		if o0.Op != OpARM64ORshiftLL || auxIntToInt64(o0.AuxInt) != 48 {
-			break
-		}
-		_ = o0.Args[1]
-		o1 := o0.Args[0]
-		if o1.Op != OpARM64ORshiftLL || auxIntToInt64(o1.AuxInt) != 40 {
-			break
-		}
-		_ = o1.Args[1]
-		o2 := o1.Args[0]
-		if o2.Op != OpARM64ORshiftLL || auxIntToInt64(o2.AuxInt) != 32 {
-			break
-		}
-		_ = o2.Args[1]
-		x0 := o2.Args[0]
-		if x0.Op != OpARM64MOVWUloadidx4 {
-			break
-		}
-		mem := x0.Args[2]
-		ptr0 := x0.Args[0]
-		idx0 := x0.Args[1]
-		y1 := o2.Args[1]
-		if y1.Op != OpARM64MOVDnop {
-			break
-		}
-		x1 := y1.Args[0]
-		if x1.Op != OpARM64MOVBUload || auxIntToInt32(x1.AuxInt) != 4 {
-			break
-		}
-		s := auxToSym(x1.Aux)
-		_ = x1.Args[1]
-		p1 := x1.Args[0]
-		if p1.Op != OpARM64ADDshiftLL || auxIntToInt64(p1.AuxInt) != 2 {
-			break
-		}
-		idx1 := p1.Args[1]
-		ptr1 := p1.Args[0]
-		if mem != x1.Args[1] {
-			break
-		}
-		y2 := o1.Args[1]
-		if y2.Op != OpARM64MOVDnop {
-			break
-		}
-		x2 := y2.Args[0]
-		if x2.Op != OpARM64MOVBUload || auxIntToInt32(x2.AuxInt) != 5 || auxToSym(x2.Aux) != s {
-			break
-		}
-		_ = x2.Args[1]
-		p := x2.Args[0]
-		if mem != x2.Args[1] {
-			break
-		}
-		y3 := o0.Args[1]
-		if y3.Op != OpARM64MOVDnop {
-			break
-		}
-		x3 := y3.Args[0]
-		if x3.Op != OpARM64MOVBUload || auxIntToInt32(x3.AuxInt) != 6 || auxToSym(x3.Aux) != s {
-			break
-		}
-		_ = x3.Args[1]
-		if p != x3.Args[0] || mem != x3.Args[1] {
-			break
-		}
-		y4 := v_1
-		if y4.Op != OpARM64MOVDnop {
-			break
-		}
-		x4 := y4.Args[0]
-		if x4.Op != OpARM64MOVBUload || auxIntToInt32(x4.AuxInt) != 7 || auxToSym(x4.Aux) != s {
-			break
-		}
-		_ = x4.Args[1]
-		if p != x4.Args[0] || mem != x4.Args[1] || !(s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4) != nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && isSamePtr(p1, p) && clobber(x0, x1, x2, x3, x4, y1, y2, y3, y4, o0, o1, o2)) {
-			break
-		}
-		b = mergePoint(b, x0, x1, x2, x3, x4)
-		v0 := b.NewValue0(x4.Pos, OpARM64MOVDloadidx, t)
-		v.copyOf(v0)
-		v1 := b.NewValue0(x4.Pos, OpARM64SLLconst, idx0.Type)
-		v1.AuxInt = int64ToAuxInt(2)
-		v1.AddArg(idx0)
-		v0.AddArg3(ptr0, v1, mem)
-		return true
-	}
-	// match: (ORshiftLL <t> [56] o0:(ORshiftLL [48] o1:(ORshiftLL [40] o2:(ORshiftLL [32] x0:(MOVWUloadidx ptr idx mem) y1:(MOVDnop x1:(MOVBUloadidx ptr (ADDconst [4] idx) mem))) y2:(MOVDnop x2:(MOVBUloadidx ptr (ADDconst [5] idx) mem))) y3:(MOVDnop x3:(MOVBUloadidx ptr (ADDconst [6] idx) mem))) y4:(MOVDnop x4:(MOVBUloadidx ptr (ADDconst [7] idx) mem)))
-	// cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && mergePoint(b,x0,x1,x2,x3,x4) != nil && clobber(x0, x1, x2, x3, x4, y1, y2, y3, y4, o0, o1, o2)
-	// result: @mergePoint(b,x0,x1,x2,x3,x4) (MOVDloadidx <t> ptr idx mem)
-	for {
-		t := v.Type
-		if auxIntToInt64(v.AuxInt) != 56 {
-			break
-		}
-		o0 := v_0
-		if o0.Op != OpARM64ORshiftLL || auxIntToInt64(o0.AuxInt) != 48 {
-			break
-		}
-		_ = o0.Args[1]
-		o1 := o0.Args[0]
-		if o1.Op != OpARM64ORshiftLL || auxIntToInt64(o1.AuxInt) != 40 {
-			break
-		}
-		_ = o1.Args[1]
-		o2 := o1.Args[0]
-		if o2.Op != OpARM64ORshiftLL || auxIntToInt64(o2.AuxInt) != 32 {
-			break
-		}
-		_ = o2.Args[1]
-		x0 := o2.Args[0]
-		if x0.Op != OpARM64MOVWUloadidx {
-			break
-		}
-		mem := x0.Args[2]
-		ptr := x0.Args[0]
-		idx := x0.Args[1]
-		y1 := o2.Args[1]
-		if y1.Op != OpARM64MOVDnop {
-			break
-		}
-		x1 := y1.Args[0]
-		if x1.Op != OpARM64MOVBUloadidx {
-			break
-		}
-		_ = x1.Args[2]
-		if ptr != x1.Args[0] {
-			break
-		}
-		x1_1 := x1.Args[1]
-		if x1_1.Op != OpARM64ADDconst || auxIntToInt64(x1_1.AuxInt) != 4 || idx != x1_1.Args[0] || mem != x1.Args[2] {
-			break
-		}
-		y2 := o1.Args[1]
-		if y2.Op != OpARM64MOVDnop {
-			break
-		}
-		x2 := y2.Args[0]
-		if x2.Op != OpARM64MOVBUloadidx {
-			break
-		}
-		_ = x2.Args[2]
-		if ptr != x2.Args[0] {
-			break
-		}
-		x2_1 := x2.Args[1]
-		if x2_1.Op != OpARM64ADDconst || auxIntToInt64(x2_1.AuxInt) != 5 || idx != x2_1.Args[0] || mem != x2.Args[2] {
-			break
-		}
-		y3 := o0.Args[1]
-		if y3.Op != OpARM64MOVDnop {
-			break
-		}
-		x3 := y3.Args[0]
-		if x3.Op != OpARM64MOVBUloadidx {
-			break
-		}
-		_ = x3.Args[2]
-		if ptr != x3.Args[0] {
-			break
-		}
-		x3_1 := x3.Args[1]
-		if x3_1.Op != OpARM64ADDconst || auxIntToInt64(x3_1.AuxInt) != 6 || idx != x3_1.Args[0] || mem != x3.Args[2] {
-			break
-		}
-		y4 := v_1
-		if y4.Op != OpARM64MOVDnop {
-			break
-		}
-		x4 := y4.Args[0]
-		if x4.Op != OpARM64MOVBUloadidx {
-			break
-		}
-		_ = x4.Args[2]
-		if ptr != x4.Args[0] {
-			break
-		}
-		x4_1 := x4.Args[1]
-		if x4_1.Op != OpARM64ADDconst || auxIntToInt64(x4_1.AuxInt) != 7 || idx != x4_1.Args[0] || mem != x4.Args[2] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4) != nil && clobber(x0, x1, x2, x3, x4, y1, y2, y3, y4, o0, o1, o2)) {
-			break
-		}
-		b = mergePoint(b, x0, x1, x2, x3, x4)
-		v0 := b.NewValue0(v.Pos, OpARM64MOVDloadidx, t)
-		v.copyOf(v0)
-		v0.AddArg3(ptr, idx, mem)
-		return true
-	}
-	// match: (ORshiftLL <t> [8] y0:(MOVDnop x0:(MOVBUload [i1] {s} p mem)) y1:(MOVDnop x1:(MOVBUload [i0] {s} p mem)))
-	// cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0, x1, y0, y1)
-	// result: @mergePoint(b,x0,x1) (REV16W <t> (MOVHUload <t> [i0] {s} p mem))
-	for {
-		t := v.Type
-		if auxIntToInt64(v.AuxInt) != 8 {
-			break
-		}
-		y0 := v_0
-		if y0.Op != OpARM64MOVDnop {
-			break
-		}
-		x0 := y0.Args[0]
-		if x0.Op != OpARM64MOVBUload {
-			break
-		}
-		i1 := auxIntToInt32(x0.AuxInt)
-		s := auxToSym(x0.Aux)
-		mem := x0.Args[1]
-		p := x0.Args[0]
-		y1 := v_1
-		if y1.Op != OpARM64MOVDnop {
-			break
-		}
-		x1 := y1.Args[0]
-		if x1.Op != OpARM64MOVBUload {
-			break
-		}
-		i0 := auxIntToInt32(x1.AuxInt)
-		if auxToSym(x1.Aux) != s {
-			break
-		}
-		_ = x1.Args[1]
-		if p != x1.Args[0] || mem != x1.Args[1] || !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0, x1, y0, y1)) {
-			break
-		}
-		b = mergePoint(b, x0, x1)
-		v0 := b.NewValue0(x1.Pos, OpARM64REV16W, t)
-		v.copyOf(v0)
-		v1 := b.NewValue0(x1.Pos, OpARM64MOVHUload, t)
-		v1.AuxInt = int32ToAuxInt(i0)
-		v1.Aux = symToAux(s)
-		v1.AddArg2(p, mem)
-		v0.AddArg(v1)
-		return true
-	}
-	// match: (ORshiftLL <t> [8] y0:(MOVDnop x0:(MOVBUload [1] {s} p1:(ADD ptr1 idx1) mem)) y1:(MOVDnop x1:(MOVBUloadidx ptr0 idx0 mem)))
-	// cond: s == nil && x0.Uses == 1 && x1.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && mergePoint(b,x0,x1) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x0, x1, y0, y1)
-	// result: @mergePoint(b,x0,x1) (REV16W <t> (MOVHUloadidx <t> ptr0 idx0 mem))
-	for {
-		t := v.Type
-		if auxIntToInt64(v.AuxInt) != 8 {
-			break
-		}
-		y0 := v_0
-		if y0.Op != OpARM64MOVDnop {
-			break
-		}
-		x0 := y0.Args[0]
-		if x0.Op != OpARM64MOVBUload || auxIntToInt32(x0.AuxInt) != 1 {
-			break
-		}
-		s := auxToSym(x0.Aux)
-		mem := x0.Args[1]
-		p1 := x0.Args[0]
-		if p1.Op != OpARM64ADD {
-			break
-		}
-		_ = p1.Args[1]
-		p1_0 := p1.Args[0]
-		p1_1 := p1.Args[1]
-		for _i0 := 0; _i0 <= 1; _i0, p1_0, p1_1 = _i0+1, p1_1, p1_0 {
-			ptr1 := p1_0
-			idx1 := p1_1
-			y1 := v_1
-			if y1.Op != OpARM64MOVDnop {
-				continue
-			}
-			x1 := y1.Args[0]
-			if x1.Op != OpARM64MOVBUloadidx {
-				continue
-			}
-			_ = x1.Args[2]
-			ptr0 := x1.Args[0]
-			idx0 := x1.Args[1]
-			if mem != x1.Args[2] || !(s == nil && x0.Uses == 1 && x1.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && mergePoint(b, x0, x1) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x0, x1, y0, y1)) {
-				continue
-			}
-			b = mergePoint(b, x0, x1)
-			v0 := b.NewValue0(x0.Pos, OpARM64REV16W, t)
-			v.copyOf(v0)
-			v1 := b.NewValue0(x0.Pos, OpARM64MOVHUloadidx, t)
-			v1.AddArg3(ptr0, idx0, mem)
-			v0.AddArg(v1)
-			return true
-		}
-		break
-	}
-	// match: (ORshiftLL <t> [8] y0:(MOVDnop x0:(MOVBUloadidx ptr (ADDconst [1] idx) mem)) y1:(MOVDnop x1:(MOVBUloadidx ptr idx mem)))
-	// cond: x0.Uses == 1 && x1.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0, x1, y0, y1)
-	// result: @mergePoint(b,x0,x1) (REV16W <t> (MOVHUloadidx <t> ptr idx mem))
-	for {
-		t := v.Type
-		if auxIntToInt64(v.AuxInt) != 8 {
-			break
-		}
-		y0 := v_0
-		if y0.Op != OpARM64MOVDnop {
-			break
-		}
-		x0 := y0.Args[0]
-		if x0.Op != OpARM64MOVBUloadidx {
-			break
-		}
-		mem := x0.Args[2]
-		ptr := x0.Args[0]
-		x0_1 := x0.Args[1]
-		if x0_1.Op != OpARM64ADDconst || auxIntToInt64(x0_1.AuxInt) != 1 {
-			break
-		}
-		idx := x0_1.Args[0]
-		y1 := v_1
-		if y1.Op != OpARM64MOVDnop {
-			break
-		}
-		x1 := y1.Args[0]
-		if x1.Op != OpARM64MOVBUloadidx {
-			break
-		}
-		_ = x1.Args[2]
-		if ptr != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(x0.Uses == 1 && x1.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0, x1, y0, y1)) {
-			break
-		}
-		b = mergePoint(b, x0, x1)
-		v0 := b.NewValue0(v.Pos, OpARM64REV16W, t)
-		v.copyOf(v0)
-		v1 := b.NewValue0(v.Pos, OpARM64MOVHUloadidx, t)
-		v1.AddArg3(ptr, idx, mem)
-		v0.AddArg(v1)
-		return true
-	}
-	// match: (ORshiftLL <t> [24] o0:(ORshiftLL [16] y0:(REV16W x0:(MOVHUload [i2] {s} p mem)) y1:(MOVDnop x1:(MOVBUload [i1] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [i0] {s} p mem)))
-	// cond: i1 == i0+1 && i2 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0, x1, x2, y0, y1, y2, o0)
-	// result: @mergePoint(b,x0,x1,x2) (REVW <t> (MOVWUload <t> {s} (OffPtr <p.Type> [int64(i0)] p) mem))
-	for {
-		t := v.Type
-		if auxIntToInt64(v.AuxInt) != 24 {
-			break
-		}
-		o0 := v_0
-		if o0.Op != OpARM64ORshiftLL || auxIntToInt64(o0.AuxInt) != 16 {
-			break
-		}
-		_ = o0.Args[1]
-		y0 := o0.Args[0]
-		if y0.Op != OpARM64REV16W {
-			break
-		}
-		x0 := y0.Args[0]
-		if x0.Op != OpARM64MOVHUload {
-			break
-		}
-		i2 := auxIntToInt32(x0.AuxInt)
-		s := auxToSym(x0.Aux)
-		mem := x0.Args[1]
-		p := x0.Args[0]
-		y1 := o0.Args[1]
-		if y1.Op != OpARM64MOVDnop {
-			break
-		}
-		x1 := y1.Args[0]
-		if x1.Op != OpARM64MOVBUload {
-			break
-		}
-		i1 := auxIntToInt32(x1.AuxInt)
-		if auxToSym(x1.Aux) != s {
-			break
-		}
-		_ = x1.Args[1]
-		if p != x1.Args[0] || mem != x1.Args[1] {
-			break
-		}
-		y2 := v_1
-		if y2.Op != OpARM64MOVDnop {
-			break
-		}
-		x2 := y2.Args[0]
-		if x2.Op != OpARM64MOVBUload {
-			break
-		}
-		i0 := auxIntToInt32(x2.AuxInt)
-		if auxToSym(x2.Aux) != s {
-			break
-		}
-		_ = x2.Args[1]
-		if p != x2.Args[0] || mem != x2.Args[1] || !(i1 == i0+1 && i2 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0, x1, x2, y0, y1, y2, o0)) {
-			break
-		}
-		b = mergePoint(b, x0, x1, x2)
-		v0 := b.NewValue0(x2.Pos, OpARM64REVW, t)
-		v.copyOf(v0)
-		v1 := b.NewValue0(x2.Pos, OpARM64MOVWUload, t)
-		v1.Aux = symToAux(s)
-		v2 := b.NewValue0(x2.Pos, OpOffPtr, p.Type)
-		v2.AuxInt = int64ToAuxInt(int64(i0))
-		v2.AddArg(p)
-		v1.AddArg2(v2, mem)
-		v0.AddArg(v1)
-		return true
-	}
-	// match: (ORshiftLL <t> [24] o0:(ORshiftLL [16] y0:(REV16W x0:(MOVHUload [2] {s} p mem)) y1:(MOVDnop x1:(MOVBUload [1] {s} p1:(ADD ptr1 idx1) mem))) y2:(MOVDnop x2:(MOVBUloadidx ptr0 idx0 mem)))
-	// cond: s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0, x1, x2, y0, y1, y2, o0)
-	// result: @mergePoint(b,x0,x1,x2) (REVW <t> (MOVWUloadidx <t> ptr0 idx0 mem))
-	for {
-		t := v.Type
-		if auxIntToInt64(v.AuxInt) != 24 {
-			break
-		}
-		o0 := v_0
-		if o0.Op != OpARM64ORshiftLL || auxIntToInt64(o0.AuxInt) != 16 {
-			break
-		}
-		_ = o0.Args[1]
-		y0 := o0.Args[0]
-		if y0.Op != OpARM64REV16W {
-			break
-		}
-		x0 := y0.Args[0]
-		if x0.Op != OpARM64MOVHUload || auxIntToInt32(x0.AuxInt) != 2 {
-			break
-		}
-		s := auxToSym(x0.Aux)
-		mem := x0.Args[1]
-		p := x0.Args[0]
-		y1 := o0.Args[1]
-		if y1.Op != OpARM64MOVDnop {
-			break
-		}
-		x1 := y1.Args[0]
-		if x1.Op != OpARM64MOVBUload || auxIntToInt32(x1.AuxInt) != 1 || auxToSym(x1.Aux) != s {
-			break
-		}
-		_ = x1.Args[1]
-		p1 := x1.Args[0]
-		if p1.Op != OpARM64ADD {
-			break
-		}
-		_ = p1.Args[1]
-		p1_0 := p1.Args[0]
-		p1_1 := p1.Args[1]
-		for _i0 := 0; _i0 <= 1; _i0, p1_0, p1_1 = _i0+1, p1_1, p1_0 {
-			ptr1 := p1_0
-			idx1 := p1_1
-			if mem != x1.Args[1] {
-				continue
-			}
-			y2 := v_1
-			if y2.Op != OpARM64MOVDnop {
-				continue
-			}
-			x2 := y2.Args[0]
-			if x2.Op != OpARM64MOVBUloadidx {
-				continue
-			}
-			_ = x2.Args[2]
-			ptr0 := x2.Args[0]
-			idx0 := x2.Args[1]
-			if mem != x2.Args[2] || !(s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0, x1, x2, y0, y1, y2, o0)) {
-				continue
-			}
-			b = mergePoint(b, x0, x1, x2)
-			v0 := b.NewValue0(x1.Pos, OpARM64REVW, t)
-			v.copyOf(v0)
-			v1 := b.NewValue0(x1.Pos, OpARM64MOVWUloadidx, t)
-			v1.AddArg3(ptr0, idx0, mem)
-			v0.AddArg(v1)
-			return true
-		}
-		break
-	}
-	// match: (ORshiftLL <t> [24] o0:(ORshiftLL [16] y0:(REV16W x0:(MOVHUloadidx ptr (ADDconst [2] idx) mem)) y1:(MOVDnop x1:(MOVBUloadidx ptr (ADDconst [1] idx) mem))) y2:(MOVDnop x2:(MOVBUloadidx ptr idx mem)))
-	// cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0, x1, x2, y0, y1, y2, o0)
-	// result: @mergePoint(b,x0,x1,x2) (REVW <t> (MOVWUloadidx <t> ptr idx mem))
-	for {
-		t := v.Type
-		if auxIntToInt64(v.AuxInt) != 24 {
-			break
-		}
-		o0 := v_0
-		if o0.Op != OpARM64ORshiftLL || auxIntToInt64(o0.AuxInt) != 16 {
-			break
-		}
-		_ = o0.Args[1]
-		y0 := o0.Args[0]
-		if y0.Op != OpARM64REV16W {
-			break
-		}
-		x0 := y0.Args[0]
-		if x0.Op != OpARM64MOVHUloadidx {
-			break
-		}
-		mem := x0.Args[2]
-		ptr := x0.Args[0]
-		x0_1 := x0.Args[1]
-		if x0_1.Op != OpARM64ADDconst || auxIntToInt64(x0_1.AuxInt) != 2 {
-			break
-		}
-		idx := x0_1.Args[0]
-		y1 := o0.Args[1]
-		if y1.Op != OpARM64MOVDnop {
-			break
-		}
-		x1 := y1.Args[0]
-		if x1.Op != OpARM64MOVBUloadidx {
-			break
-		}
-		_ = x1.Args[2]
-		if ptr != x1.Args[0] {
-			break
-		}
-		x1_1 := x1.Args[1]
-		if x1_1.Op != OpARM64ADDconst || auxIntToInt64(x1_1.AuxInt) != 1 || idx != x1_1.Args[0] || mem != x1.Args[2] {
-			break
-		}
-		y2 := v_1
-		if y2.Op != OpARM64MOVDnop {
-			break
-		}
-		x2 := y2.Args[0]
-		if x2.Op != OpARM64MOVBUloadidx {
-			break
-		}
-		_ = x2.Args[2]
-		if ptr != x2.Args[0] || idx != x2.Args[1] || mem != x2.Args[2] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0, x1, x2, y0, y1, y2, o0)) {
-			break
-		}
-		b = mergePoint(b, x0, x1, x2)
-		v0 := b.NewValue0(v.Pos, OpARM64REVW, t)
-		v.copyOf(v0)
-		v1 := b.NewValue0(v.Pos, OpARM64MOVWUloadidx, t)
-		v1.AddArg3(ptr, idx, mem)
-		v0.AddArg(v1)
-		return true
-	}
-	// match: (ORshiftLL <t> [56] o0:(ORshiftLL [48] o1:(ORshiftLL [40] o2:(ORshiftLL [32] y0:(REVW x0:(MOVWUload [i4] {s} p mem)) y1:(MOVDnop x1:(MOVBUload [i3] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [i2] {s} p mem))) y3:(MOVDnop x3:(MOVBUload [i1] {s} p mem))) y4:(MOVDnop x4:(MOVBUload [i0] {s} p mem)))
-	// cond: i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && mergePoint(b,x0,x1,x2,x3,x4) != nil && clobber(x0, x1, x2, x3, x4, y0, y1, y2, y3, y4, o0, o1, o2)
-	// result: @mergePoint(b,x0,x1,x2,x3,x4) (REV <t> (MOVDload <t> {s} (OffPtr <p.Type> [int64(i0)] p) mem))
-	for {
-		t := v.Type
-		if auxIntToInt64(v.AuxInt) != 56 {
-			break
-		}
-		o0 := v_0
-		if o0.Op != OpARM64ORshiftLL || auxIntToInt64(o0.AuxInt) != 48 {
-			break
-		}
-		_ = o0.Args[1]
-		o1 := o0.Args[0]
-		if o1.Op != OpARM64ORshiftLL || auxIntToInt64(o1.AuxInt) != 40 {
-			break
-		}
-		_ = o1.Args[1]
-		o2 := o1.Args[0]
-		if o2.Op != OpARM64ORshiftLL || auxIntToInt64(o2.AuxInt) != 32 {
-			break
-		}
-		_ = o2.Args[1]
-		y0 := o2.Args[0]
-		if y0.Op != OpARM64REVW {
-			break
-		}
-		x0 := y0.Args[0]
-		if x0.Op != OpARM64MOVWUload {
-			break
-		}
-		i4 := auxIntToInt32(x0.AuxInt)
-		s := auxToSym(x0.Aux)
-		mem := x0.Args[1]
-		p := x0.Args[0]
-		y1 := o2.Args[1]
-		if y1.Op != OpARM64MOVDnop {
-			break
-		}
-		x1 := y1.Args[0]
-		if x1.Op != OpARM64MOVBUload {
-			break
-		}
-		i3 := auxIntToInt32(x1.AuxInt)
-		if auxToSym(x1.Aux) != s {
-			break
-		}
-		_ = x1.Args[1]
-		if p != x1.Args[0] || mem != x1.Args[1] {
-			break
-		}
-		y2 := o1.Args[1]
-		if y2.Op != OpARM64MOVDnop {
-			break
-		}
-		x2 := y2.Args[0]
-		if x2.Op != OpARM64MOVBUload {
-			break
-		}
-		i2 := auxIntToInt32(x2.AuxInt)
-		if auxToSym(x2.Aux) != s {
-			break
-		}
-		_ = x2.Args[1]
-		if p != x2.Args[0] || mem != x2.Args[1] {
-			break
-		}
-		y3 := o0.Args[1]
-		if y3.Op != OpARM64MOVDnop {
-			break
-		}
-		x3 := y3.Args[0]
-		if x3.Op != OpARM64MOVBUload {
-			break
-		}
-		i1 := auxIntToInt32(x3.AuxInt)
-		if auxToSym(x3.Aux) != s {
-			break
-		}
-		_ = x3.Args[1]
-		if p != x3.Args[0] || mem != x3.Args[1] {
-			break
-		}
-		y4 := v_1
-		if y4.Op != OpARM64MOVDnop {
-			break
-		}
-		x4 := y4.Args[0]
-		if x4.Op != OpARM64MOVBUload {
-			break
-		}
-		i0 := auxIntToInt32(x4.AuxInt)
-		if auxToSym(x4.Aux) != s {
-			break
-		}
-		_ = x4.Args[1]
-		if p != x4.Args[0] || mem != x4.Args[1] || !(i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4) != nil && clobber(x0, x1, x2, x3, x4, y0, y1, y2, y3, y4, o0, o1, o2)) {
-			break
-		}
-		b = mergePoint(b, x0, x1, x2, x3, x4)
-		v0 := b.NewValue0(x4.Pos, OpARM64REV, t)
-		v.copyOf(v0)
-		v1 := b.NewValue0(x4.Pos, OpARM64MOVDload, t)
-		v1.Aux = symToAux(s)
-		v2 := b.NewValue0(x4.Pos, OpOffPtr, p.Type)
-		v2.AuxInt = int64ToAuxInt(int64(i0))
-		v2.AddArg(p)
-		v1.AddArg2(v2, mem)
-		v0.AddArg(v1)
-		return true
-	}
-	// match: (ORshiftLL <t> [56] o0:(ORshiftLL [48] o1:(ORshiftLL [40] o2:(ORshiftLL [32] y0:(REVW x0:(MOVWUload [4] {s} p mem)) y1:(MOVDnop x1:(MOVBUload [3] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [2] {s} p mem))) y3:(MOVDnop x3:(MOVBUload [1] {s} p1:(ADD ptr1 idx1) mem))) y4:(MOVDnop x4:(MOVBUloadidx ptr0 idx0 mem)))
-	// cond: s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && mergePoint(b,x0,x1,x2,x3,x4) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0, x1, x2, x3, x4, y0, y1, y2, y3, y4, o0, o1, o2)
-	// result: @mergePoint(b,x0,x1,x2,x3,x4) (REV <t> (MOVDloadidx <t> ptr0 idx0 mem))
-	for {
-		t := v.Type
-		if auxIntToInt64(v.AuxInt) != 56 {
-			break
-		}
-		o0 := v_0
-		if o0.Op != OpARM64ORshiftLL || auxIntToInt64(o0.AuxInt) != 48 {
-			break
-		}
-		_ = o0.Args[1]
-		o1 := o0.Args[0]
-		if o1.Op != OpARM64ORshiftLL || auxIntToInt64(o1.AuxInt) != 40 {
-			break
-		}
-		_ = o1.Args[1]
-		o2 := o1.Args[0]
-		if o2.Op != OpARM64ORshiftLL || auxIntToInt64(o2.AuxInt) != 32 {
-			break
-		}
-		_ = o2.Args[1]
-		y0 := o2.Args[0]
-		if y0.Op != OpARM64REVW {
-			break
-		}
-		x0 := y0.Args[0]
-		if x0.Op != OpARM64MOVWUload || auxIntToInt32(x0.AuxInt) != 4 {
-			break
-		}
-		s := auxToSym(x0.Aux)
-		mem := x0.Args[1]
-		p := x0.Args[0]
-		y1 := o2.Args[1]
-		if y1.Op != OpARM64MOVDnop {
-			break
-		}
-		x1 := y1.Args[0]
-		if x1.Op != OpARM64MOVBUload || auxIntToInt32(x1.AuxInt) != 3 || auxToSym(x1.Aux) != s {
-			break
-		}
-		_ = x1.Args[1]
-		if p != x1.Args[0] || mem != x1.Args[1] {
-			break
-		}
-		y2 := o1.Args[1]
-		if y2.Op != OpARM64MOVDnop {
-			break
-		}
-		x2 := y2.Args[0]
-		if x2.Op != OpARM64MOVBUload || auxIntToInt32(x2.AuxInt) != 2 || auxToSym(x2.Aux) != s {
-			break
-		}
-		_ = x2.Args[1]
-		if p != x2.Args[0] || mem != x2.Args[1] {
-			break
-		}
-		y3 := o0.Args[1]
-		if y3.Op != OpARM64MOVDnop {
-			break
-		}
-		x3 := y3.Args[0]
-		if x3.Op != OpARM64MOVBUload || auxIntToInt32(x3.AuxInt) != 1 || auxToSym(x3.Aux) != s {
-			break
-		}
-		_ = x3.Args[1]
-		p1 := x3.Args[0]
-		if p1.Op != OpARM64ADD {
-			break
-		}
-		_ = p1.Args[1]
-		p1_0 := p1.Args[0]
-		p1_1 := p1.Args[1]
-		for _i0 := 0; _i0 <= 1; _i0, p1_0, p1_1 = _i0+1, p1_1, p1_0 {
-			ptr1 := p1_0
-			idx1 := p1_1
-			if mem != x3.Args[1] {
-				continue
-			}
-			y4 := v_1
-			if y4.Op != OpARM64MOVDnop {
-				continue
-			}
-			x4 := y4.Args[0]
-			if x4.Op != OpARM64MOVBUloadidx {
-				continue
-			}
-			_ = x4.Args[2]
-			ptr0 := x4.Args[0]
-			idx0 := x4.Args[1]
-			if mem != x4.Args[2] || !(s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0, x1, x2, x3, x4, y0, y1, y2, y3, y4, o0, o1, o2)) {
-				continue
-			}
-			b = mergePoint(b, x0, x1, x2, x3, x4)
-			v0 := b.NewValue0(x3.Pos, OpARM64REV, t)
-			v.copyOf(v0)
-			v1 := b.NewValue0(x3.Pos, OpARM64MOVDloadidx, t)
-			v1.AddArg3(ptr0, idx0, mem)
-			v0.AddArg(v1)
-			return true
-		}
-		break
-	}
-	// match: (ORshiftLL <t> [56] o0:(ORshiftLL [48] o1:(ORshiftLL [40] o2:(ORshiftLL [32] y0:(REVW x0:(MOVWUloadidx ptr (ADDconst [4] idx) mem)) y1:(MOVDnop x1:(MOVBUloadidx ptr (ADDconst [3] idx) mem))) y2:(MOVDnop x2:(MOVBUloadidx ptr (ADDconst [2] idx) mem))) y3:(MOVDnop x3:(MOVBUloadidx ptr (ADDconst [1] idx) mem))) y4:(MOVDnop x4:(MOVBUloadidx ptr idx mem)))
-	// cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && mergePoint(b,x0,x1,x2,x3,x4) != nil && clobber(x0, x1, x2, x3, x4, y0, y1, y2, y3, y4, o0, o1, o2)
-	// result: @mergePoint(b,x0,x1,x2,x3,x4) (REV <t> (MOVDloadidx <t> ptr idx mem))
-	for {
-		t := v.Type
-		if auxIntToInt64(v.AuxInt) != 56 {
-			break
-		}
-		o0 := v_0
-		if o0.Op != OpARM64ORshiftLL || auxIntToInt64(o0.AuxInt) != 48 {
-			break
-		}
-		_ = o0.Args[1]
-		o1 := o0.Args[0]
-		if o1.Op != OpARM64ORshiftLL || auxIntToInt64(o1.AuxInt) != 40 {
-			break
-		}
-		_ = o1.Args[1]
-		o2 := o1.Args[0]
-		if o2.Op != OpARM64ORshiftLL || auxIntToInt64(o2.AuxInt) != 32 {
-			break
-		}
-		_ = o2.Args[1]
-		y0 := o2.Args[0]
-		if y0.Op != OpARM64REVW {
-			break
-		}
-		x0 := y0.Args[0]
-		if x0.Op != OpARM64MOVWUloadidx {
-			break
-		}
-		mem := x0.Args[2]
-		ptr := x0.Args[0]
-		x0_1 := x0.Args[1]
-		if x0_1.Op != OpARM64ADDconst || auxIntToInt64(x0_1.AuxInt) != 4 {
-			break
-		}
-		idx := x0_1.Args[0]
-		y1 := o2.Args[1]
-		if y1.Op != OpARM64MOVDnop {
-			break
-		}
-		x1 := y1.Args[0]
-		if x1.Op != OpARM64MOVBUloadidx {
-			break
-		}
-		_ = x1.Args[2]
-		if ptr != x1.Args[0] {
-			break
-		}
-		x1_1 := x1.Args[1]
-		if x1_1.Op != OpARM64ADDconst || auxIntToInt64(x1_1.AuxInt) != 3 || idx != x1_1.Args[0] || mem != x1.Args[2] {
-			break
-		}
-		y2 := o1.Args[1]
-		if y2.Op != OpARM64MOVDnop {
-			break
-		}
-		x2 := y2.Args[0]
-		if x2.Op != OpARM64MOVBUloadidx {
-			break
-		}
-		_ = x2.Args[2]
-		if ptr != x2.Args[0] {
-			break
-		}
-		x2_1 := x2.Args[1]
-		if x2_1.Op != OpARM64ADDconst || auxIntToInt64(x2_1.AuxInt) != 2 || idx != x2_1.Args[0] || mem != x2.Args[2] {
-			break
-		}
-		y3 := o0.Args[1]
-		if y3.Op != OpARM64MOVDnop {
-			break
-		}
-		x3 := y3.Args[0]
-		if x3.Op != OpARM64MOVBUloadidx {
-			break
-		}
-		_ = x3.Args[2]
-		if ptr != x3.Args[0] {
-			break
-		}
-		x3_1 := x3.Args[1]
-		if x3_1.Op != OpARM64ADDconst || auxIntToInt64(x3_1.AuxInt) != 1 || idx != x3_1.Args[0] || mem != x3.Args[2] {
-			break
-		}
-		y4 := v_1
-		if y4.Op != OpARM64MOVDnop {
-			break
-		}
-		x4 := y4.Args[0]
-		if x4.Op != OpARM64MOVBUloadidx {
-			break
-		}
-		_ = x4.Args[2]
-		if ptr != x4.Args[0] || idx != x4.Args[1] || mem != x4.Args[2] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4) != nil && clobber(x0, x1, x2, x3, x4, y0, y1, y2, y3, y4, o0, o1, o2)) {
-			break
-		}
-		b = mergePoint(b, x0, x1, x2, x3, x4)
-		v0 := b.NewValue0(v.Pos, OpARM64REV, t)
-		v.copyOf(v0)
-		v1 := b.NewValue0(v.Pos, OpARM64MOVDloadidx, t)
-		v1.AddArg3(ptr, idx, mem)
-		v0.AddArg(v1)
-		return true
-	}
 	return false
 }
 func rewriteValueARM64_OpARM64ORshiftRA(v *Value) bool {
@@ -21686,8 +16624,10 @@
 	v_2 := v.Args[2]
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
+	b := v.Block
+	config := b.Func.Config
 	// match: (STP [off1] {sym} (ADDconst [off2] ptr) val1 val2 mem)
-	// cond: is32Bit(int64(off1)+off2)
+	// cond: is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
 	// result: (STP [off1+int32(off2)] {sym} ptr val1 val2 mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -21700,7 +16640,7 @@
 		val1 := v_1
 		val2 := v_2
 		mem := v_3
-		if !(is32Bit(int64(off1) + off2)) {
+		if !(is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
 			break
 		}
 		v.reset(OpARM64STP)
@@ -21710,7 +16650,7 @@
 		return true
 	}
 	// match: (STP [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) val1 val2 mem)
-	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
 	// result: (STP [off1+off2] {mergeSym(sym1,sym2)} ptr val1 val2 mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -21724,7 +16664,7 @@
 		val1 := v_1
 		val2 := v_2
 		mem := v_3
-		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) {
+		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)) {
 			break
 		}
 		v.reset(OpARM64STP)
@@ -24663,13 +19603,13 @@
 		return true
 	}
 	// match: (Load <t> ptr mem)
-	// cond: (is8BitInt(t) && isSigned(t))
+	// cond: (is8BitInt(t) && t.IsSigned())
 	// result: (MOVBload ptr mem)
 	for {
 		t := v.Type
 		ptr := v_0
 		mem := v_1
-		if !(is8BitInt(t) && isSigned(t)) {
+		if !(is8BitInt(t) && t.IsSigned()) {
 			break
 		}
 		v.reset(OpARM64MOVBload)
@@ -24677,13 +19617,13 @@
 		return true
 	}
 	// match: (Load <t> ptr mem)
-	// cond: (is8BitInt(t) && !isSigned(t))
+	// cond: (is8BitInt(t) && !t.IsSigned())
 	// result: (MOVBUload ptr mem)
 	for {
 		t := v.Type
 		ptr := v_0
 		mem := v_1
-		if !(is8BitInt(t) && !isSigned(t)) {
+		if !(is8BitInt(t) && !t.IsSigned()) {
 			break
 		}
 		v.reset(OpARM64MOVBUload)
@@ -24691,13 +19631,13 @@
 		return true
 	}
 	// match: (Load <t> ptr mem)
-	// cond: (is16BitInt(t) && isSigned(t))
+	// cond: (is16BitInt(t) && t.IsSigned())
 	// result: (MOVHload ptr mem)
 	for {
 		t := v.Type
 		ptr := v_0
 		mem := v_1
-		if !(is16BitInt(t) && isSigned(t)) {
+		if !(is16BitInt(t) && t.IsSigned()) {
 			break
 		}
 		v.reset(OpARM64MOVHload)
@@ -24705,13 +19645,13 @@
 		return true
 	}
 	// match: (Load <t> ptr mem)
-	// cond: (is16BitInt(t) && !isSigned(t))
+	// cond: (is16BitInt(t) && !t.IsSigned())
 	// result: (MOVHUload ptr mem)
 	for {
 		t := v.Type
 		ptr := v_0
 		mem := v_1
-		if !(is16BitInt(t) && !isSigned(t)) {
+		if !(is16BitInt(t) && !t.IsSigned()) {
 			break
 		}
 		v.reset(OpARM64MOVHUload)
@@ -24719,13 +19659,13 @@
 		return true
 	}
 	// match: (Load <t> ptr mem)
-	// cond: (is32BitInt(t) && isSigned(t))
+	// cond: (is32BitInt(t) && t.IsSigned())
 	// result: (MOVWload ptr mem)
 	for {
 		t := v.Type
 		ptr := v_0
 		mem := v_1
-		if !(is32BitInt(t) && isSigned(t)) {
+		if !(is32BitInt(t) && t.IsSigned()) {
 			break
 		}
 		v.reset(OpARM64MOVWload)
@@ -24733,13 +19673,13 @@
 		return true
 	}
 	// match: (Load <t> ptr mem)
-	// cond: (is32BitInt(t) && !isSigned(t))
+	// cond: (is32BitInt(t) && !t.IsSigned())
 	// result: (MOVWUload ptr mem)
 	for {
 		t := v.Type
 		ptr := v_0
 		mem := v_1
-		if !(is32BitInt(t) && !isSigned(t)) {
+		if !(is32BitInt(t) && !t.IsSigned()) {
 			break
 		}
 		v.reset(OpARM64MOVWUload)
@@ -24791,17 +19731,44 @@
 	return false
 }
 func rewriteValueARM64_OpLocalAddr(v *Value) bool {
+	v_1 := v.Args[1]
 	v_0 := v.Args[0]
-	// match: (LocalAddr {sym} base _)
-	// result: (MOVDaddr {sym} base)
+	b := v.Block
+	typ := &b.Func.Config.Types
+	// match: (LocalAddr <t> {sym} base mem)
+	// cond: t.Elem().HasPointers()
+	// result: (MOVDaddr {sym} (SPanchored base mem))
 	for {
+		t := v.Type
 		sym := auxToSym(v.Aux)
 		base := v_0
+		mem := v_1
+		if !(t.Elem().HasPointers()) {
+			break
+		}
+		v.reset(OpARM64MOVDaddr)
+		v.Aux = symToAux(sym)
+		v0 := b.NewValue0(v.Pos, OpSPanchored, typ.Uintptr)
+		v0.AddArg2(base, mem)
+		v.AddArg(v0)
+		return true
+	}
+	// match: (LocalAddr <t> {sym} base _)
+	// cond: !t.Elem().HasPointers()
+	// result: (MOVDaddr {sym} base)
+	for {
+		t := v.Type
+		sym := auxToSym(v.Aux)
+		base := v_0
+		if !(!t.Elem().HasPointers()) {
+			break
+		}
 		v.reset(OpARM64MOVDaddr)
 		v.Aux = symToAux(sym)
 		v.AddArg(base)
 		return true
 	}
+	return false
 }
 func rewriteValueARM64_OpLsh16x16(v *Value) bool {
 	v_1 := v.Args[1]
@@ -28427,14 +23394,14 @@
 		return true
 	}
 	// match: (Store {t} ptr val mem)
-	// cond: t.Size() == 4 && !is32BitFloat(val.Type)
+	// cond: t.Size() == 4 && !t.IsFloat()
 	// result: (MOVWstore ptr val mem)
 	for {
 		t := auxToType(v.Aux)
 		ptr := v_0
 		val := v_1
 		mem := v_2
-		if !(t.Size() == 4 && !is32BitFloat(val.Type)) {
+		if !(t.Size() == 4 && !t.IsFloat()) {
 			break
 		}
 		v.reset(OpARM64MOVWstore)
@@ -28442,14 +23409,14 @@
 		return true
 	}
 	// match: (Store {t} ptr val mem)
-	// cond: t.Size() == 8 && !is64BitFloat(val.Type)
+	// cond: t.Size() == 8 && !t.IsFloat()
 	// result: (MOVDstore ptr val mem)
 	for {
 		t := auxToType(v.Aux)
 		ptr := v_0
 		val := v_1
 		mem := v_2
-		if !(t.Size() == 8 && !is64BitFloat(val.Type)) {
+		if !(t.Size() == 8 && !t.IsFloat()) {
 			break
 		}
 		v.reset(OpARM64MOVDstore)
@@ -28457,14 +23424,14 @@
 		return true
 	}
 	// match: (Store {t} ptr val mem)
-	// cond: t.Size() == 4 && is32BitFloat(val.Type)
+	// cond: t.Size() == 4 && t.IsFloat()
 	// result: (FMOVSstore ptr val mem)
 	for {
 		t := auxToType(v.Aux)
 		ptr := v_0
 		val := v_1
 		mem := v_2
-		if !(t.Size() == 4 && is32BitFloat(val.Type)) {
+		if !(t.Size() == 4 && t.IsFloat()) {
 			break
 		}
 		v.reset(OpARM64FMOVSstore)
@@ -28472,14 +23439,14 @@
 		return true
 	}
 	// match: (Store {t} ptr val mem)
-	// cond: t.Size() == 8 && is64BitFloat(val.Type)
+	// cond: t.Size() == 8 && t.IsFloat()
 	// result: (FMOVDstore ptr val mem)
 	for {
 		t := auxToType(v.Aux)
 		ptr := v_0
 		val := v_1
 		mem := v_2
-		if !(t.Size() == 8 && is64BitFloat(val.Type)) {
+		if !(t.Size() == 8 && t.IsFloat()) {
 			break
 		}
 		v.reset(OpARM64FMOVDstore)
diff --git a/src/cmd/compile/internal/ssa/rewriteARM64latelower.go b/src/cmd/compile/internal/ssa/rewriteARM64latelower.go
index 49e1548..0998757 100644
--- a/src/cmd/compile/internal/ssa/rewriteARM64latelower.go
+++ b/src/cmd/compile/internal/ssa/rewriteARM64latelower.go
@@ -1,5 +1,4 @@
-// Code generated from _gen/ARM64latelower.rules; DO NOT EDIT.
-// generated with: cd _gen; go run .
+// Code generated from _gen/ARM64latelower.rules using 'go generate'; DO NOT EDIT.
 
 package ssa
 
diff --git a/src/cmd/compile/internal/ssa/rewriteCond_test.go b/src/cmd/compile/internal/ssa/rewriteCond_test.go
index ca74ed5..eb5c1de 100644
--- a/src/cmd/compile/internal/ssa/rewriteCond_test.go
+++ b/src/cmd/compile/internal/ssa/rewriteCond_test.go
@@ -36,6 +36,7 @@
 	{"AddConst64", testAddConst64},
 	{"AddConst32", testAddConst32},
 	{"AddVar64", testAddVar64},
+	{"AddVar64Cset", testAddVar64Cset},
 	{"AddVar32", testAddVar32},
 	{"MAddVar64", testMAddVar64},
 	{"MAddVar32", testMAddVar32},
@@ -198,6 +199,41 @@
 	}
 }
 
+// var + var, cset
+func testAddVar64Cset(t *testing.T) {
+	var a int
+	if x64+v64 < 0 {
+		a = 1
+	}
+	if a != 1 {
+		t.Errorf("'%#x + %#x < 0' failed", x64, v64)
+	}
+
+	a = 0
+	if y64+v64_n >= 0 {
+		a = 1
+	}
+	if a != 1 {
+		t.Errorf("'%#x + %#x >= 0' failed", y64, v64_n)
+	}
+
+	a = 1
+	if x64+v64 >= 0 {
+		a = 0
+	}
+	if a == 0 {
+		t.Errorf("'%#x + %#x >= 0' failed", x64, v64)
+	}
+
+	a = 1
+	if y64+v64_n < 0 {
+		a = 0
+	}
+	if a == 0 {
+		t.Errorf("'%#x + %#x < 0' failed", y64, v64_n)
+	}
+}
+
 // 32-bit var+var
 func testAddVar32(t *testing.T) {
 	if x32+v32 < 0 {
diff --git a/src/cmd/compile/internal/ssa/rewriteLOONG64.go b/src/cmd/compile/internal/ssa/rewriteLOONG64.go
index f6da0b7..e88b74c 100644
--- a/src/cmd/compile/internal/ssa/rewriteLOONG64.go
+++ b/src/cmd/compile/internal/ssa/rewriteLOONG64.go
@@ -1,5 +1,4 @@
-// Code generated from _gen/LOONG64.rules; DO NOT EDIT.
-// generated with: cd _gen; go run .
+// Code generated from _gen/LOONG64.rules using 'go generate'; DO NOT EDIT.
 
 package ssa
 
@@ -167,7 +166,8 @@
 		v.Op = OpLOONG64DIVD
 		return true
 	case OpDiv64u:
-		return rewriteValueLOONG64_OpDiv64u(v)
+		v.Op = OpLOONG64DIVVU
+		return true
 	case OpDiv8:
 		return rewriteValueLOONG64_OpDiv8(v)
 	case OpDiv8u:
@@ -202,9 +202,11 @@
 	case OpHmul32u:
 		return rewriteValueLOONG64_OpHmul32u(v)
 	case OpHmul64:
-		return rewriteValueLOONG64_OpHmul64(v)
+		v.Op = OpLOONG64MULHV
+		return true
 	case OpHmul64u:
-		return rewriteValueLOONG64_OpHmul64u(v)
+		v.Op = OpLOONG64MULHVU
+		return true
 	case OpInterCall:
 		v.Op = OpLOONG64CALLinter
 		return true
@@ -222,6 +224,10 @@
 		return rewriteValueLOONG64_OpLOONG64AND(v)
 	case OpLOONG64ANDconst:
 		return rewriteValueLOONG64_OpLOONG64ANDconst(v)
+	case OpLOONG64DIVV:
+		return rewriteValueLOONG64_OpLOONG64DIVV(v)
+	case OpLOONG64DIVVU:
+		return rewriteValueLOONG64_OpLOONG64DIVVU(v)
 	case OpLOONG64LoweredAtomicAdd32:
 		return rewriteValueLOONG64_OpLOONG64LoweredAtomicAdd32(v)
 	case OpLOONG64LoweredAtomicAdd64:
@@ -286,6 +292,8 @@
 		return rewriteValueLOONG64_OpLOONG64MOVWstore(v)
 	case OpLOONG64MOVWstorezero:
 		return rewriteValueLOONG64_OpLOONG64MOVWstorezero(v)
+	case OpLOONG64MULV:
+		return rewriteValueLOONG64_OpLOONG64MULV(v)
 	case OpLOONG64NEGV:
 		return rewriteValueLOONG64_OpLOONG64NEGV(v)
 	case OpLOONG64NOR:
@@ -296,6 +304,10 @@
 		return rewriteValueLOONG64_OpLOONG64OR(v)
 	case OpLOONG64ORconst:
 		return rewriteValueLOONG64_OpLOONG64ORconst(v)
+	case OpLOONG64REMV:
+		return rewriteValueLOONG64_OpLOONG64REMV(v)
+	case OpLOONG64REMVU:
+		return rewriteValueLOONG64_OpLOONG64REMVU(v)
 	case OpLOONG64ROTR:
 		return rewriteValueLOONG64_OpLOONG64ROTR(v)
 	case OpLOONG64ROTRV:
@@ -415,7 +427,8 @@
 	case OpMod64:
 		return rewriteValueLOONG64_OpMod64(v)
 	case OpMod64u:
-		return rewriteValueLOONG64_OpMod64u(v)
+		v.Op = OpLOONG64REMVU
+		return true
 	case OpMod8:
 		return rewriteValueLOONG64_OpMod8(v)
 	case OpMod8u:
@@ -423,22 +436,23 @@
 	case OpMove:
 		return rewriteValueLOONG64_OpMove(v)
 	case OpMul16:
-		return rewriteValueLOONG64_OpMul16(v)
+		v.Op = OpLOONG64MULV
+		return true
 	case OpMul32:
-		return rewriteValueLOONG64_OpMul32(v)
+		v.Op = OpLOONG64MULV
+		return true
 	case OpMul32F:
 		v.Op = OpLOONG64MULF
 		return true
 	case OpMul64:
-		return rewriteValueLOONG64_OpMul64(v)
+		v.Op = OpLOONG64MULV
+		return true
 	case OpMul64F:
 		v.Op = OpLOONG64MULD
 		return true
-	case OpMul64uhilo:
-		v.Op = OpLOONG64MULVU
-		return true
 	case OpMul8:
-		return rewriteValueLOONG64_OpMul8(v)
+		v.Op = OpLOONG64MULV
+		return true
 	case OpNeg16:
 		v.Op = OpLOONG64NEGV
 		return true
@@ -911,18 +925,16 @@
 	b := v.Block
 	typ := &b.Func.Config.Types
 	// match: (Div16 x y)
-	// result: (Select1 (DIVV (SignExt16to64 x) (SignExt16to64 y)))
+	// result: (DIVV (SignExt16to64 x) (SignExt16to64 y))
 	for {
 		x := v_0
 		y := v_1
-		v.reset(OpSelect1)
-		v0 := b.NewValue0(v.Pos, OpLOONG64DIVV, types.NewTuple(typ.Int64, typ.Int64))
+		v.reset(OpLOONG64DIVV)
+		v0 := b.NewValue0(v.Pos, OpSignExt16to64, typ.Int64)
+		v0.AddArg(x)
 		v1 := b.NewValue0(v.Pos, OpSignExt16to64, typ.Int64)
-		v1.AddArg(x)
-		v2 := b.NewValue0(v.Pos, OpSignExt16to64, typ.Int64)
-		v2.AddArg(y)
-		v0.AddArg2(v1, v2)
-		v.AddArg(v0)
+		v1.AddArg(y)
+		v.AddArg2(v0, v1)
 		return true
 	}
 }
@@ -932,18 +944,16 @@
 	b := v.Block
 	typ := &b.Func.Config.Types
 	// match: (Div16u x y)
-	// result: (Select1 (DIVVU (ZeroExt16to64 x) (ZeroExt16to64 y)))
+	// result: (DIVVU (ZeroExt16to64 x) (ZeroExt16to64 y))
 	for {
 		x := v_0
 		y := v_1
-		v.reset(OpSelect1)
-		v0 := b.NewValue0(v.Pos, OpLOONG64DIVVU, types.NewTuple(typ.UInt64, typ.UInt64))
+		v.reset(OpLOONG64DIVVU)
+		v0 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64)
+		v0.AddArg(x)
 		v1 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64)
-		v1.AddArg(x)
-		v2 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64)
-		v2.AddArg(y)
-		v0.AddArg2(v1, v2)
-		v.AddArg(v0)
+		v1.AddArg(y)
+		v.AddArg2(v0, v1)
 		return true
 	}
 }
@@ -953,18 +963,16 @@
 	b := v.Block
 	typ := &b.Func.Config.Types
 	// match: (Div32 x y)
-	// result: (Select1 (DIVV (SignExt32to64 x) (SignExt32to64 y)))
+	// result: (DIVV (SignExt32to64 x) (SignExt32to64 y))
 	for {
 		x := v_0
 		y := v_1
-		v.reset(OpSelect1)
-		v0 := b.NewValue0(v.Pos, OpLOONG64DIVV, types.NewTuple(typ.Int64, typ.Int64))
+		v.reset(OpLOONG64DIVV)
+		v0 := b.NewValue0(v.Pos, OpSignExt32to64, typ.Int64)
+		v0.AddArg(x)
 		v1 := b.NewValue0(v.Pos, OpSignExt32to64, typ.Int64)
-		v1.AddArg(x)
-		v2 := b.NewValue0(v.Pos, OpSignExt32to64, typ.Int64)
-		v2.AddArg(y)
-		v0.AddArg2(v1, v2)
-		v.AddArg(v0)
+		v1.AddArg(y)
+		v.AddArg2(v0, v1)
 		return true
 	}
 }
@@ -974,52 +982,29 @@
 	b := v.Block
 	typ := &b.Func.Config.Types
 	// match: (Div32u x y)
-	// result: (Select1 (DIVVU (ZeroExt32to64 x) (ZeroExt32to64 y)))
+	// result: (DIVVU (ZeroExt32to64 x) (ZeroExt32to64 y))
 	for {
 		x := v_0
 		y := v_1
-		v.reset(OpSelect1)
-		v0 := b.NewValue0(v.Pos, OpLOONG64DIVVU, types.NewTuple(typ.UInt64, typ.UInt64))
+		v.reset(OpLOONG64DIVVU)
+		v0 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64)
+		v0.AddArg(x)
 		v1 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64)
-		v1.AddArg(x)
-		v2 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64)
-		v2.AddArg(y)
-		v0.AddArg2(v1, v2)
-		v.AddArg(v0)
+		v1.AddArg(y)
+		v.AddArg2(v0, v1)
 		return true
 	}
 }
 func rewriteValueLOONG64_OpDiv64(v *Value) bool {
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
-	b := v.Block
-	typ := &b.Func.Config.Types
 	// match: (Div64 x y)
-	// result: (Select1 (DIVV x y))
+	// result: (DIVV x y)
 	for {
 		x := v_0
 		y := v_1
-		v.reset(OpSelect1)
-		v0 := b.NewValue0(v.Pos, OpLOONG64DIVV, types.NewTuple(typ.Int64, typ.Int64))
-		v0.AddArg2(x, y)
-		v.AddArg(v0)
-		return true
-	}
-}
-func rewriteValueLOONG64_OpDiv64u(v *Value) bool {
-	v_1 := v.Args[1]
-	v_0 := v.Args[0]
-	b := v.Block
-	typ := &b.Func.Config.Types
-	// match: (Div64u x y)
-	// result: (Select1 (DIVVU x y))
-	for {
-		x := v_0
-		y := v_1
-		v.reset(OpSelect1)
-		v0 := b.NewValue0(v.Pos, OpLOONG64DIVVU, types.NewTuple(typ.UInt64, typ.UInt64))
-		v0.AddArg2(x, y)
-		v.AddArg(v0)
+		v.reset(OpLOONG64DIVV)
+		v.AddArg2(x, y)
 		return true
 	}
 }
@@ -1029,18 +1014,16 @@
 	b := v.Block
 	typ := &b.Func.Config.Types
 	// match: (Div8 x y)
-	// result: (Select1 (DIVV (SignExt8to64 x) (SignExt8to64 y)))
+	// result: (DIVV (SignExt8to64 x) (SignExt8to64 y))
 	for {
 		x := v_0
 		y := v_1
-		v.reset(OpSelect1)
-		v0 := b.NewValue0(v.Pos, OpLOONG64DIVV, types.NewTuple(typ.Int64, typ.Int64))
+		v.reset(OpLOONG64DIVV)
+		v0 := b.NewValue0(v.Pos, OpSignExt8to64, typ.Int64)
+		v0.AddArg(x)
 		v1 := b.NewValue0(v.Pos, OpSignExt8to64, typ.Int64)
-		v1.AddArg(x)
-		v2 := b.NewValue0(v.Pos, OpSignExt8to64, typ.Int64)
-		v2.AddArg(y)
-		v0.AddArg2(v1, v2)
-		v.AddArg(v0)
+		v1.AddArg(y)
+		v.AddArg2(v0, v1)
 		return true
 	}
 }
@@ -1050,18 +1033,16 @@
 	b := v.Block
 	typ := &b.Func.Config.Types
 	// match: (Div8u x y)
-	// result: (Select1 (DIVVU (ZeroExt8to64 x) (ZeroExt8to64 y)))
+	// result: (DIVVU (ZeroExt8to64 x) (ZeroExt8to64 y))
 	for {
 		x := v_0
 		y := v_1
-		v.reset(OpSelect1)
-		v0 := b.NewValue0(v.Pos, OpLOONG64DIVVU, types.NewTuple(typ.UInt64, typ.UInt64))
+		v.reset(OpLOONG64DIVVU)
+		v0 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64)
+		v0.AddArg(x)
 		v1 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64)
-		v1.AddArg(x)
-		v2 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64)
-		v2.AddArg(y)
-		v0.AddArg2(v1, v2)
-		v.AddArg(v0)
+		v1.AddArg(y)
+		v.AddArg2(v0, v1)
 		return true
 	}
 }
@@ -1229,20 +1210,18 @@
 	b := v.Block
 	typ := &b.Func.Config.Types
 	// match: (Hmul32 x y)
-	// result: (SRAVconst (Select1 <typ.Int64> (MULV (SignExt32to64 x) (SignExt32to64 y))) [32])
+	// result: (SRAVconst (MULV (SignExt32to64 x) (SignExt32to64 y)) [32])
 	for {
 		x := v_0
 		y := v_1
 		v.reset(OpLOONG64SRAVconst)
 		v.AuxInt = int64ToAuxInt(32)
-		v0 := b.NewValue0(v.Pos, OpSelect1, typ.Int64)
-		v1 := b.NewValue0(v.Pos, OpLOONG64MULV, types.NewTuple(typ.Int64, typ.Int64))
+		v0 := b.NewValue0(v.Pos, OpLOONG64MULV, typ.Int64)
+		v1 := b.NewValue0(v.Pos, OpSignExt32to64, typ.Int64)
+		v1.AddArg(x)
 		v2 := b.NewValue0(v.Pos, OpSignExt32to64, typ.Int64)
-		v2.AddArg(x)
-		v3 := b.NewValue0(v.Pos, OpSignExt32to64, typ.Int64)
-		v3.AddArg(y)
-		v1.AddArg2(v2, v3)
-		v0.AddArg(v1)
+		v2.AddArg(y)
+		v0.AddArg2(v1, v2)
 		v.AddArg(v0)
 		return true
 	}
@@ -1253,54 +1232,18 @@
 	b := v.Block
 	typ := &b.Func.Config.Types
 	// match: (Hmul32u x y)
-	// result: (SRLVconst (Select1 <typ.UInt64> (MULVU (ZeroExt32to64 x) (ZeroExt32to64 y))) [32])
+	// result: (SRLVconst (MULV (ZeroExt32to64 x) (ZeroExt32to64 y)) [32])
 	for {
 		x := v_0
 		y := v_1
 		v.reset(OpLOONG64SRLVconst)
 		v.AuxInt = int64ToAuxInt(32)
-		v0 := b.NewValue0(v.Pos, OpSelect1, typ.UInt64)
-		v1 := b.NewValue0(v.Pos, OpLOONG64MULVU, types.NewTuple(typ.UInt64, typ.UInt64))
+		v0 := b.NewValue0(v.Pos, OpLOONG64MULV, typ.Int64)
+		v1 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64)
+		v1.AddArg(x)
 		v2 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64)
-		v2.AddArg(x)
-		v3 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64)
-		v3.AddArg(y)
-		v1.AddArg2(v2, v3)
-		v0.AddArg(v1)
-		v.AddArg(v0)
-		return true
-	}
-}
-func rewriteValueLOONG64_OpHmul64(v *Value) bool {
-	v_1 := v.Args[1]
-	v_0 := v.Args[0]
-	b := v.Block
-	typ := &b.Func.Config.Types
-	// match: (Hmul64 x y)
-	// result: (Select0 (MULV x y))
-	for {
-		x := v_0
-		y := v_1
-		v.reset(OpSelect0)
-		v0 := b.NewValue0(v.Pos, OpLOONG64MULV, types.NewTuple(typ.Int64, typ.Int64))
-		v0.AddArg2(x, y)
-		v.AddArg(v0)
-		return true
-	}
-}
-func rewriteValueLOONG64_OpHmul64u(v *Value) bool {
-	v_1 := v.Args[1]
-	v_0 := v.Args[0]
-	b := v.Block
-	typ := &b.Func.Config.Types
-	// match: (Hmul64u x y)
-	// result: (Select0 (MULVU x y))
-	for {
-		x := v_0
-		y := v_1
-		v.reset(OpSelect0)
-		v0 := b.NewValue0(v.Pos, OpLOONG64MULVU, types.NewTuple(typ.UInt64, typ.UInt64))
-		v0.AddArg2(x, y)
+		v2.AddArg(y)
+		v0.AddArg2(v1, v2)
 		v.AddArg(v0)
 		return true
 	}
@@ -1355,8 +1298,8 @@
 func rewriteValueLOONG64_OpLOONG64ADDV(v *Value) bool {
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
-	// match: (ADDV x (MOVVconst [c]))
-	// cond: is32Bit(c)
+	// match: (ADDV x (MOVVconst <t> [c]))
+	// cond: is32Bit(c) && !t.IsPtr()
 	// result: (ADDVconst [c] x)
 	for {
 		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
@@ -1364,8 +1307,9 @@
 			if v_1.Op != OpLOONG64MOVVconst {
 				continue
 			}
+			t := v_1.Type
 			c := auxIntToInt64(v_1.AuxInt)
-			if !(is32Bit(c)) {
+			if !(is32Bit(c) && !t.IsPtr()) {
 				continue
 			}
 			v.reset(OpLOONG64ADDVconst)
@@ -1559,6 +1503,81 @@
 	}
 	return false
 }
+func rewriteValueLOONG64_OpLOONG64DIVV(v *Value) bool {
+	v_1 := v.Args[1]
+	v_0 := v.Args[0]
+	// match: (DIVV (MOVVconst [c]) (MOVVconst [d]))
+	// cond: d != 0
+	// result: (MOVVconst [c/d])
+	for {
+		if v_0.Op != OpLOONG64MOVVconst {
+			break
+		}
+		c := auxIntToInt64(v_0.AuxInt)
+		if v_1.Op != OpLOONG64MOVVconst {
+			break
+		}
+		d := auxIntToInt64(v_1.AuxInt)
+		if !(d != 0) {
+			break
+		}
+		v.reset(OpLOONG64MOVVconst)
+		v.AuxInt = int64ToAuxInt(c / d)
+		return true
+	}
+	return false
+}
+func rewriteValueLOONG64_OpLOONG64DIVVU(v *Value) bool {
+	v_1 := v.Args[1]
+	v_0 := v.Args[0]
+	// match: (DIVVU x (MOVVconst [1]))
+	// result: x
+	for {
+		x := v_0
+		if v_1.Op != OpLOONG64MOVVconst || auxIntToInt64(v_1.AuxInt) != 1 {
+			break
+		}
+		v.copyOf(x)
+		return true
+	}
+	// match: (DIVVU x (MOVVconst [c]))
+	// cond: isPowerOfTwo64(c)
+	// result: (SRLVconst [log64(c)] x)
+	for {
+		x := v_0
+		if v_1.Op != OpLOONG64MOVVconst {
+			break
+		}
+		c := auxIntToInt64(v_1.AuxInt)
+		if !(isPowerOfTwo64(c)) {
+			break
+		}
+		v.reset(OpLOONG64SRLVconst)
+		v.AuxInt = int64ToAuxInt(log64(c))
+		v.AddArg(x)
+		return true
+	}
+	// match: (DIVVU (MOVVconst [c]) (MOVVconst [d]))
+	// cond: d != 0
+	// result: (MOVVconst [int64(uint64(c)/uint64(d))])
+	for {
+		if v_0.Op != OpLOONG64MOVVconst {
+			break
+		}
+		c := auxIntToInt64(v_0.AuxInt)
+		if v_1.Op != OpLOONG64MOVVconst {
+			break
+		}
+		d := auxIntToInt64(v_1.AuxInt)
+		if !(d != 0) {
+			break
+		}
+		v.reset(OpLOONG64MOVVconst)
+		v.AuxInt = int64ToAuxInt(int64(uint64(c) / uint64(d)))
+		return true
+	}
+	return false
+}
 func rewriteValueLOONG64_OpLOONG64LoweredAtomicAdd32(v *Value) bool {
 	v_2 := v.Args[2]
 	v_1 := v.Args[1]
@@ -1644,6 +1663,7 @@
 	return false
 }
 func rewriteValueLOONG64_OpLOONG64MASKEQZ(v *Value) bool {
+	v_1 := v.Args[1]
 	v_0 := v.Args[0]
 	// match: (MASKEQZ (MOVVconst [0]) cond)
 	// result: (MOVVconst [0])
@@ -1655,6 +1675,36 @@
 		v.AuxInt = int64ToAuxInt(0)
 		return true
 	}
+	// match: (MASKEQZ x (MOVVconst [c]))
+	// cond: c == 0
+	// result: (MOVVconst [0])
+	for {
+		if v_1.Op != OpLOONG64MOVVconst {
+			break
+		}
+		c := auxIntToInt64(v_1.AuxInt)
+		if !(c == 0) {
+			break
+		}
+		v.reset(OpLOONG64MOVVconst)
+		v.AuxInt = int64ToAuxInt(0)
+		return true
+	}
+	// match: (MASKEQZ x (MOVVconst [c]))
+	// cond: c != 0
+	// result: x
+	for {
+		x := v_0
+		if v_1.Op != OpLOONG64MOVVconst {
+			break
+		}
+		c := auxIntToInt64(v_1.AuxInt)
+		if !(c != 0) {
+			break
+		}
+		v.copyOf(x)
+		return true
+	}
 	return false
 }
 func rewriteValueLOONG64_OpLOONG64MASKNEZ(v *Value) bool {
@@ -3241,6 +3291,89 @@
 	}
 	return false
 }
+func rewriteValueLOONG64_OpLOONG64MULV(v *Value) bool {
+	v_1 := v.Args[1]
+	v_0 := v.Args[0]
+	// match: (MULV x (MOVVconst [-1]))
+	// result: (NEGV x)
+	for {
+		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
+			x := v_0
+			if v_1.Op != OpLOONG64MOVVconst || auxIntToInt64(v_1.AuxInt) != -1 {
+				continue
+			}
+			v.reset(OpLOONG64NEGV)
+			v.AddArg(x)
+			return true
+		}
+		break
+	}
+	// match: (MULV _ (MOVVconst [0]))
+	// result: (MOVVconst [0])
+	for {
+		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
+			if v_1.Op != OpLOONG64MOVVconst || auxIntToInt64(v_1.AuxInt) != 0 {
+				continue
+			}
+			v.reset(OpLOONG64MOVVconst)
+			v.AuxInt = int64ToAuxInt(0)
+			return true
+		}
+		break
+	}
+	// match: (MULV x (MOVVconst [1]))
+	// result: x
+	for {
+		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
+			x := v_0
+			if v_1.Op != OpLOONG64MOVVconst || auxIntToInt64(v_1.AuxInt) != 1 {
+				continue
+			}
+			v.copyOf(x)
+			return true
+		}
+		break
+	}
+	// match: (MULV x (MOVVconst [c]))
+	// cond: isPowerOfTwo64(c)
+	// result: (SLLVconst [log64(c)] x)
+	for {
+		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
+			x := v_0
+			if v_1.Op != OpLOONG64MOVVconst {
+				continue
+			}
+			c := auxIntToInt64(v_1.AuxInt)
+			if !(isPowerOfTwo64(c)) {
+				continue
+			}
+			v.reset(OpLOONG64SLLVconst)
+			v.AuxInt = int64ToAuxInt(log64(c))
+			v.AddArg(x)
+			return true
+		}
+		break
+	}
+	// match: (MULV (MOVVconst [c]) (MOVVconst [d]))
+	// result: (MOVVconst [c*d])
+	for {
+		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
+			if v_0.Op != OpLOONG64MOVVconst {
+				continue
+			}
+			c := auxIntToInt64(v_0.AuxInt)
+			if v_1.Op != OpLOONG64MOVVconst {
+				continue
+			}
+			d := auxIntToInt64(v_1.AuxInt)
+			v.reset(OpLOONG64MOVVconst)
+			v.AuxInt = int64ToAuxInt(c * d)
+			return true
+		}
+		break
+	}
+	return false
+}
 func rewriteValueLOONG64_OpLOONG64NEGV(v *Value) bool {
 	v_0 := v.Args[0]
 	// match: (NEGV (MOVVconst [c]))
@@ -3386,6 +3519,81 @@
 	}
 	return false
 }
+func rewriteValueLOONG64_OpLOONG64REMV(v *Value) bool {
+	v_1 := v.Args[1]
+	v_0 := v.Args[0]
+	// match: (REMV (MOVVconst [c]) (MOVVconst [d]))
+	// cond: d != 0
+	// result: (MOVVconst [c%d])
+	for {
+		if v_0.Op != OpLOONG64MOVVconst {
+			break
+		}
+		c := auxIntToInt64(v_0.AuxInt)
+		if v_1.Op != OpLOONG64MOVVconst {
+			break
+		}
+		d := auxIntToInt64(v_1.AuxInt)
+		if !(d != 0) {
+			break
+		}
+		v.reset(OpLOONG64MOVVconst)
+		v.AuxInt = int64ToAuxInt(c % d)
+		return true
+	}
+	return false
+}
+func rewriteValueLOONG64_OpLOONG64REMVU(v *Value) bool {
+	v_1 := v.Args[1]
+	v_0 := v.Args[0]
+	// match: (REMVU _ (MOVVconst [1]))
+	// result: (MOVVconst [0])
+	for {
+		if v_1.Op != OpLOONG64MOVVconst || auxIntToInt64(v_1.AuxInt) != 1 {
+			break
+		}
+		v.reset(OpLOONG64MOVVconst)
+		v.AuxInt = int64ToAuxInt(0)
+		return true
+	}
+	// match: (REMVU x (MOVVconst [c]))
+	// cond: isPowerOfTwo64(c)
+	// result: (ANDconst [c-1] x)
+	for {
+		x := v_0
+		if v_1.Op != OpLOONG64MOVVconst {
+			break
+		}
+		c := auxIntToInt64(v_1.AuxInt)
+		if !(isPowerOfTwo64(c)) {
+			break
+		}
+		v.reset(OpLOONG64ANDconst)
+		v.AuxInt = int64ToAuxInt(c - 1)
+		v.AddArg(x)
+		return true
+	}
+	// match: (REMVU (MOVVconst [c]) (MOVVconst [d]))
+	// cond: d != 0
+	// result: (MOVVconst [int64(uint64(c)%uint64(d))])
+	for {
+		if v_0.Op != OpLOONG64MOVVconst {
+			break
+		}
+		c := auxIntToInt64(v_0.AuxInt)
+		if v_1.Op != OpLOONG64MOVVconst {
+			break
+		}
+		d := auxIntToInt64(v_1.AuxInt)
+		if !(d != 0) {
+			break
+		}
+		v.reset(OpLOONG64MOVVconst)
+		v.AuxInt = int64ToAuxInt(int64(uint64(c) % uint64(d)))
+		return true
+	}
+	return false
+}
 func rewriteValueLOONG64_OpLOONG64ROTR(v *Value) bool {
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
@@ -4501,13 +4709,13 @@
 		return true
 	}
 	// match: (Load <t> ptr mem)
-	// cond: (is8BitInt(t) && isSigned(t))
+	// cond: (is8BitInt(t) && t.IsSigned())
 	// result: (MOVBload ptr mem)
 	for {
 		t := v.Type
 		ptr := v_0
 		mem := v_1
-		if !(is8BitInt(t) && isSigned(t)) {
+		if !(is8BitInt(t) && t.IsSigned()) {
 			break
 		}
 		v.reset(OpLOONG64MOVBload)
@@ -4515,13 +4723,13 @@
 		return true
 	}
 	// match: (Load <t> ptr mem)
-	// cond: (is8BitInt(t) && !isSigned(t))
+	// cond: (is8BitInt(t) && !t.IsSigned())
 	// result: (MOVBUload ptr mem)
 	for {
 		t := v.Type
 		ptr := v_0
 		mem := v_1
-		if !(is8BitInt(t) && !isSigned(t)) {
+		if !(is8BitInt(t) && !t.IsSigned()) {
 			break
 		}
 		v.reset(OpLOONG64MOVBUload)
@@ -4529,13 +4737,13 @@
 		return true
 	}
 	// match: (Load <t> ptr mem)
-	// cond: (is16BitInt(t) && isSigned(t))
+	// cond: (is16BitInt(t) && t.IsSigned())
 	// result: (MOVHload ptr mem)
 	for {
 		t := v.Type
 		ptr := v_0
 		mem := v_1
-		if !(is16BitInt(t) && isSigned(t)) {
+		if !(is16BitInt(t) && t.IsSigned()) {
 			break
 		}
 		v.reset(OpLOONG64MOVHload)
@@ -4543,13 +4751,13 @@
 		return true
 	}
 	// match: (Load <t> ptr mem)
-	// cond: (is16BitInt(t) && !isSigned(t))
+	// cond: (is16BitInt(t) && !t.IsSigned())
 	// result: (MOVHUload ptr mem)
 	for {
 		t := v.Type
 		ptr := v_0
 		mem := v_1
-		if !(is16BitInt(t) && !isSigned(t)) {
+		if !(is16BitInt(t) && !t.IsSigned()) {
 			break
 		}
 		v.reset(OpLOONG64MOVHUload)
@@ -4557,13 +4765,13 @@
 		return true
 	}
 	// match: (Load <t> ptr mem)
-	// cond: (is32BitInt(t) && isSigned(t))
+	// cond: (is32BitInt(t) && t.IsSigned())
 	// result: (MOVWload ptr mem)
 	for {
 		t := v.Type
 		ptr := v_0
 		mem := v_1
-		if !(is32BitInt(t) && isSigned(t)) {
+		if !(is32BitInt(t) && t.IsSigned()) {
 			break
 		}
 		v.reset(OpLOONG64MOVWload)
@@ -4571,13 +4779,13 @@
 		return true
 	}
 	// match: (Load <t> ptr mem)
-	// cond: (is32BitInt(t) && !isSigned(t))
+	// cond: (is32BitInt(t) && !t.IsSigned())
 	// result: (MOVWUload ptr mem)
 	for {
 		t := v.Type
 		ptr := v_0
 		mem := v_1
-		if !(is32BitInt(t) && !isSigned(t)) {
+		if !(is32BitInt(t) && !t.IsSigned()) {
 			break
 		}
 		v.reset(OpLOONG64MOVWUload)
@@ -4629,17 +4837,44 @@
 	return false
 }
 func rewriteValueLOONG64_OpLocalAddr(v *Value) bool {
+	v_1 := v.Args[1]
 	v_0 := v.Args[0]
-	// match: (LocalAddr {sym} base _)
-	// result: (MOVVaddr {sym} base)
+	b := v.Block
+	typ := &b.Func.Config.Types
+	// match: (LocalAddr <t> {sym} base mem)
+	// cond: t.Elem().HasPointers()
+	// result: (MOVVaddr {sym} (SPanchored base mem))
 	for {
+		t := v.Type
 		sym := auxToSym(v.Aux)
 		base := v_0
+		mem := v_1
+		if !(t.Elem().HasPointers()) {
+			break
+		}
+		v.reset(OpLOONG64MOVVaddr)
+		v.Aux = symToAux(sym)
+		v0 := b.NewValue0(v.Pos, OpSPanchored, typ.Uintptr)
+		v0.AddArg2(base, mem)
+		v.AddArg(v0)
+		return true
+	}
+	// match: (LocalAddr <t> {sym} base _)
+	// cond: !t.Elem().HasPointers()
+	// result: (MOVVaddr {sym} base)
+	for {
+		t := v.Type
+		sym := auxToSym(v.Aux)
+		base := v_0
+		if !(!t.Elem().HasPointers()) {
+			break
+		}
 		v.reset(OpLOONG64MOVVaddr)
 		v.Aux = symToAux(sym)
 		v.AddArg(base)
 		return true
 	}
+	return false
 }
 func rewriteValueLOONG64_OpLsh16x16(v *Value) bool {
 	v_1 := v.Args[1]
@@ -4647,23 +4882,21 @@
 	b := v.Block
 	typ := &b.Func.Config.Types
 	// match: (Lsh16x16 <t> x y)
-	// result: (AND (NEGV <t> (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt16to64 y))) (SLLV <t> x (ZeroExt16to64 y)))
+	// result: (MASKEQZ (SLLV <t> x (ZeroExt16to64 y)) (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt16to64 y)))
 	for {
 		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpLOONG64AND)
-		v0 := b.NewValue0(v.Pos, OpLOONG64NEGV, t)
-		v1 := b.NewValue0(v.Pos, OpLOONG64SGTU, typ.Bool)
-		v2 := b.NewValue0(v.Pos, OpLOONG64MOVVconst, typ.UInt64)
-		v2.AuxInt = int64ToAuxInt(64)
-		v3 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64)
-		v3.AddArg(y)
-		v1.AddArg2(v2, v3)
-		v0.AddArg(v1)
-		v4 := b.NewValue0(v.Pos, OpLOONG64SLLV, t)
-		v4.AddArg2(x, v3)
-		v.AddArg2(v0, v4)
+		v.reset(OpLOONG64MASKEQZ)
+		v0 := b.NewValue0(v.Pos, OpLOONG64SLLV, t)
+		v1 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64)
+		v1.AddArg(y)
+		v0.AddArg2(x, v1)
+		v2 := b.NewValue0(v.Pos, OpLOONG64SGTU, typ.Bool)
+		v3 := b.NewValue0(v.Pos, OpLOONG64MOVVconst, typ.UInt64)
+		v3.AuxInt = int64ToAuxInt(64)
+		v2.AddArg2(v3, v1)
+		v.AddArg2(v0, v2)
 		return true
 	}
 }
@@ -4673,23 +4906,21 @@
 	b := v.Block
 	typ := &b.Func.Config.Types
 	// match: (Lsh16x32 <t> x y)
-	// result: (AND (NEGV <t> (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt32to64 y))) (SLLV <t> x (ZeroExt32to64 y)))
+	// result: (MASKEQZ (SLLV <t> x (ZeroExt32to64 y)) (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt32to64 y)))
 	for {
 		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpLOONG64AND)
-		v0 := b.NewValue0(v.Pos, OpLOONG64NEGV, t)
-		v1 := b.NewValue0(v.Pos, OpLOONG64SGTU, typ.Bool)
-		v2 := b.NewValue0(v.Pos, OpLOONG64MOVVconst, typ.UInt64)
-		v2.AuxInt = int64ToAuxInt(64)
-		v3 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64)
-		v3.AddArg(y)
-		v1.AddArg2(v2, v3)
-		v0.AddArg(v1)
-		v4 := b.NewValue0(v.Pos, OpLOONG64SLLV, t)
-		v4.AddArg2(x, v3)
-		v.AddArg2(v0, v4)
+		v.reset(OpLOONG64MASKEQZ)
+		v0 := b.NewValue0(v.Pos, OpLOONG64SLLV, t)
+		v1 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64)
+		v1.AddArg(y)
+		v0.AddArg2(x, v1)
+		v2 := b.NewValue0(v.Pos, OpLOONG64SGTU, typ.Bool)
+		v3 := b.NewValue0(v.Pos, OpLOONG64MOVVconst, typ.UInt64)
+		v3.AuxInt = int64ToAuxInt(64)
+		v2.AddArg2(v3, v1)
+		v.AddArg2(v0, v2)
 		return true
 	}
 }
@@ -4699,21 +4930,19 @@
 	b := v.Block
 	typ := &b.Func.Config.Types
 	// match: (Lsh16x64 <t> x y)
-	// result: (AND (NEGV <t> (SGTU (MOVVconst <typ.UInt64> [64]) y)) (SLLV <t> x y))
+	// result: (MASKEQZ (SLLV <t> x y) (SGTU (MOVVconst <typ.UInt64> [64]) y))
 	for {
 		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpLOONG64AND)
-		v0 := b.NewValue0(v.Pos, OpLOONG64NEGV, t)
+		v.reset(OpLOONG64MASKEQZ)
+		v0 := b.NewValue0(v.Pos, OpLOONG64SLLV, t)
+		v0.AddArg2(x, y)
 		v1 := b.NewValue0(v.Pos, OpLOONG64SGTU, typ.Bool)
 		v2 := b.NewValue0(v.Pos, OpLOONG64MOVVconst, typ.UInt64)
 		v2.AuxInt = int64ToAuxInt(64)
 		v1.AddArg2(v2, y)
-		v0.AddArg(v1)
-		v3 := b.NewValue0(v.Pos, OpLOONG64SLLV, t)
-		v3.AddArg2(x, y)
-		v.AddArg2(v0, v3)
+		v.AddArg2(v0, v1)
 		return true
 	}
 }
@@ -4723,23 +4952,21 @@
 	b := v.Block
 	typ := &b.Func.Config.Types
 	// match: (Lsh16x8 <t> x y)
-	// result: (AND (NEGV <t> (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt8to64 y))) (SLLV <t> x (ZeroExt8to64 y)))
+	// result: (MASKEQZ (SLLV <t> x (ZeroExt8to64 y)) (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt8to64 y)))
 	for {
 		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpLOONG64AND)
-		v0 := b.NewValue0(v.Pos, OpLOONG64NEGV, t)
-		v1 := b.NewValue0(v.Pos, OpLOONG64SGTU, typ.Bool)
-		v2 := b.NewValue0(v.Pos, OpLOONG64MOVVconst, typ.UInt64)
-		v2.AuxInt = int64ToAuxInt(64)
-		v3 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64)
-		v3.AddArg(y)
-		v1.AddArg2(v2, v3)
-		v0.AddArg(v1)
-		v4 := b.NewValue0(v.Pos, OpLOONG64SLLV, t)
-		v4.AddArg2(x, v3)
-		v.AddArg2(v0, v4)
+		v.reset(OpLOONG64MASKEQZ)
+		v0 := b.NewValue0(v.Pos, OpLOONG64SLLV, t)
+		v1 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64)
+		v1.AddArg(y)
+		v0.AddArg2(x, v1)
+		v2 := b.NewValue0(v.Pos, OpLOONG64SGTU, typ.Bool)
+		v3 := b.NewValue0(v.Pos, OpLOONG64MOVVconst, typ.UInt64)
+		v3.AuxInt = int64ToAuxInt(64)
+		v2.AddArg2(v3, v1)
+		v.AddArg2(v0, v2)
 		return true
 	}
 }
@@ -4749,23 +4976,21 @@
 	b := v.Block
 	typ := &b.Func.Config.Types
 	// match: (Lsh32x16 <t> x y)
-	// result: (AND (NEGV <t> (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt16to64 y))) (SLLV <t> x (ZeroExt16to64 y)))
+	// result: (MASKEQZ (SLLV <t> x (ZeroExt16to64 y)) (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt16to64 y)))
 	for {
 		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpLOONG64AND)
-		v0 := b.NewValue0(v.Pos, OpLOONG64NEGV, t)
-		v1 := b.NewValue0(v.Pos, OpLOONG64SGTU, typ.Bool)
-		v2 := b.NewValue0(v.Pos, OpLOONG64MOVVconst, typ.UInt64)
-		v2.AuxInt = int64ToAuxInt(64)
-		v3 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64)
-		v3.AddArg(y)
-		v1.AddArg2(v2, v3)
-		v0.AddArg(v1)
-		v4 := b.NewValue0(v.Pos, OpLOONG64SLLV, t)
-		v4.AddArg2(x, v3)
-		v.AddArg2(v0, v4)
+		v.reset(OpLOONG64MASKEQZ)
+		v0 := b.NewValue0(v.Pos, OpLOONG64SLLV, t)
+		v1 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64)
+		v1.AddArg(y)
+		v0.AddArg2(x, v1)
+		v2 := b.NewValue0(v.Pos, OpLOONG64SGTU, typ.Bool)
+		v3 := b.NewValue0(v.Pos, OpLOONG64MOVVconst, typ.UInt64)
+		v3.AuxInt = int64ToAuxInt(64)
+		v2.AddArg2(v3, v1)
+		v.AddArg2(v0, v2)
 		return true
 	}
 }
@@ -4775,23 +5000,21 @@
 	b := v.Block
 	typ := &b.Func.Config.Types
 	// match: (Lsh32x32 <t> x y)
-	// result: (AND (NEGV <t> (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt32to64 y))) (SLLV <t> x (ZeroExt32to64 y)))
+	// result: (MASKEQZ (SLLV <t> x (ZeroExt32to64 y)) (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt32to64 y)))
 	for {
 		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpLOONG64AND)
-		v0 := b.NewValue0(v.Pos, OpLOONG64NEGV, t)
-		v1 := b.NewValue0(v.Pos, OpLOONG64SGTU, typ.Bool)
-		v2 := b.NewValue0(v.Pos, OpLOONG64MOVVconst, typ.UInt64)
-		v2.AuxInt = int64ToAuxInt(64)
-		v3 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64)
-		v3.AddArg(y)
-		v1.AddArg2(v2, v3)
-		v0.AddArg(v1)
-		v4 := b.NewValue0(v.Pos, OpLOONG64SLLV, t)
-		v4.AddArg2(x, v3)
-		v.AddArg2(v0, v4)
+		v.reset(OpLOONG64MASKEQZ)
+		v0 := b.NewValue0(v.Pos, OpLOONG64SLLV, t)
+		v1 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64)
+		v1.AddArg(y)
+		v0.AddArg2(x, v1)
+		v2 := b.NewValue0(v.Pos, OpLOONG64SGTU, typ.Bool)
+		v3 := b.NewValue0(v.Pos, OpLOONG64MOVVconst, typ.UInt64)
+		v3.AuxInt = int64ToAuxInt(64)
+		v2.AddArg2(v3, v1)
+		v.AddArg2(v0, v2)
 		return true
 	}
 }
@@ -4801,21 +5024,19 @@
 	b := v.Block
 	typ := &b.Func.Config.Types
 	// match: (Lsh32x64 <t> x y)
-	// result: (AND (NEGV <t> (SGTU (MOVVconst <typ.UInt64> [64]) y)) (SLLV <t> x y))
+	// result: (MASKEQZ (SLLV <t> x y) (SGTU (MOVVconst <typ.UInt64> [64]) y))
 	for {
 		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpLOONG64AND)
-		v0 := b.NewValue0(v.Pos, OpLOONG64NEGV, t)
+		v.reset(OpLOONG64MASKEQZ)
+		v0 := b.NewValue0(v.Pos, OpLOONG64SLLV, t)
+		v0.AddArg2(x, y)
 		v1 := b.NewValue0(v.Pos, OpLOONG64SGTU, typ.Bool)
 		v2 := b.NewValue0(v.Pos, OpLOONG64MOVVconst, typ.UInt64)
 		v2.AuxInt = int64ToAuxInt(64)
 		v1.AddArg2(v2, y)
-		v0.AddArg(v1)
-		v3 := b.NewValue0(v.Pos, OpLOONG64SLLV, t)
-		v3.AddArg2(x, y)
-		v.AddArg2(v0, v3)
+		v.AddArg2(v0, v1)
 		return true
 	}
 }
@@ -4825,23 +5046,21 @@
 	b := v.Block
 	typ := &b.Func.Config.Types
 	// match: (Lsh32x8 <t> x y)
-	// result: (AND (NEGV <t> (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt8to64 y))) (SLLV <t> x (ZeroExt8to64 y)))
+	// result: (MASKEQZ (SLLV <t> x (ZeroExt8to64 y)) (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt8to64 y)))
 	for {
 		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpLOONG64AND)
-		v0 := b.NewValue0(v.Pos, OpLOONG64NEGV, t)
-		v1 := b.NewValue0(v.Pos, OpLOONG64SGTU, typ.Bool)
-		v2 := b.NewValue0(v.Pos, OpLOONG64MOVVconst, typ.UInt64)
-		v2.AuxInt = int64ToAuxInt(64)
-		v3 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64)
-		v3.AddArg(y)
-		v1.AddArg2(v2, v3)
-		v0.AddArg(v1)
-		v4 := b.NewValue0(v.Pos, OpLOONG64SLLV, t)
-		v4.AddArg2(x, v3)
-		v.AddArg2(v0, v4)
+		v.reset(OpLOONG64MASKEQZ)
+		v0 := b.NewValue0(v.Pos, OpLOONG64SLLV, t)
+		v1 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64)
+		v1.AddArg(y)
+		v0.AddArg2(x, v1)
+		v2 := b.NewValue0(v.Pos, OpLOONG64SGTU, typ.Bool)
+		v3 := b.NewValue0(v.Pos, OpLOONG64MOVVconst, typ.UInt64)
+		v3.AuxInt = int64ToAuxInt(64)
+		v2.AddArg2(v3, v1)
+		v.AddArg2(v0, v2)
 		return true
 	}
 }
@@ -4851,23 +5070,21 @@
 	b := v.Block
 	typ := &b.Func.Config.Types
 	// match: (Lsh64x16 <t> x y)
-	// result: (AND (NEGV <t> (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt16to64 y))) (SLLV <t> x (ZeroExt16to64 y)))
+	// result: (MASKEQZ (SLLV <t> x (ZeroExt16to64 y)) (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt16to64 y)))
 	for {
 		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpLOONG64AND)
-		v0 := b.NewValue0(v.Pos, OpLOONG64NEGV, t)
-		v1 := b.NewValue0(v.Pos, OpLOONG64SGTU, typ.Bool)
-		v2 := b.NewValue0(v.Pos, OpLOONG64MOVVconst, typ.UInt64)
-		v2.AuxInt = int64ToAuxInt(64)
-		v3 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64)
-		v3.AddArg(y)
-		v1.AddArg2(v2, v3)
-		v0.AddArg(v1)
-		v4 := b.NewValue0(v.Pos, OpLOONG64SLLV, t)
-		v4.AddArg2(x, v3)
-		v.AddArg2(v0, v4)
+		v.reset(OpLOONG64MASKEQZ)
+		v0 := b.NewValue0(v.Pos, OpLOONG64SLLV, t)
+		v1 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64)
+		v1.AddArg(y)
+		v0.AddArg2(x, v1)
+		v2 := b.NewValue0(v.Pos, OpLOONG64SGTU, typ.Bool)
+		v3 := b.NewValue0(v.Pos, OpLOONG64MOVVconst, typ.UInt64)
+		v3.AuxInt = int64ToAuxInt(64)
+		v2.AddArg2(v3, v1)
+		v.AddArg2(v0, v2)
 		return true
 	}
 }
@@ -4877,23 +5094,21 @@
 	b := v.Block
 	typ := &b.Func.Config.Types
 	// match: (Lsh64x32 <t> x y)
-	// result: (AND (NEGV <t> (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt32to64 y))) (SLLV <t> x (ZeroExt32to64 y)))
+	// result: (MASKEQZ (SLLV <t> x (ZeroExt32to64 y)) (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt32to64 y)))
 	for {
 		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpLOONG64AND)
-		v0 := b.NewValue0(v.Pos, OpLOONG64NEGV, t)
-		v1 := b.NewValue0(v.Pos, OpLOONG64SGTU, typ.Bool)
-		v2 := b.NewValue0(v.Pos, OpLOONG64MOVVconst, typ.UInt64)
-		v2.AuxInt = int64ToAuxInt(64)
-		v3 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64)
-		v3.AddArg(y)
-		v1.AddArg2(v2, v3)
-		v0.AddArg(v1)
-		v4 := b.NewValue0(v.Pos, OpLOONG64SLLV, t)
-		v4.AddArg2(x, v3)
-		v.AddArg2(v0, v4)
+		v.reset(OpLOONG64MASKEQZ)
+		v0 := b.NewValue0(v.Pos, OpLOONG64SLLV, t)
+		v1 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64)
+		v1.AddArg(y)
+		v0.AddArg2(x, v1)
+		v2 := b.NewValue0(v.Pos, OpLOONG64SGTU, typ.Bool)
+		v3 := b.NewValue0(v.Pos, OpLOONG64MOVVconst, typ.UInt64)
+		v3.AuxInt = int64ToAuxInt(64)
+		v2.AddArg2(v3, v1)
+		v.AddArg2(v0, v2)
 		return true
 	}
 }
@@ -4903,21 +5118,19 @@
 	b := v.Block
 	typ := &b.Func.Config.Types
 	// match: (Lsh64x64 <t> x y)
-	// result: (AND (NEGV <t> (SGTU (MOVVconst <typ.UInt64> [64]) y)) (SLLV <t> x y))
+	// result: (MASKEQZ (SLLV <t> x y) (SGTU (MOVVconst <typ.UInt64> [64]) y))
 	for {
 		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpLOONG64AND)
-		v0 := b.NewValue0(v.Pos, OpLOONG64NEGV, t)
+		v.reset(OpLOONG64MASKEQZ)
+		v0 := b.NewValue0(v.Pos, OpLOONG64SLLV, t)
+		v0.AddArg2(x, y)
 		v1 := b.NewValue0(v.Pos, OpLOONG64SGTU, typ.Bool)
 		v2 := b.NewValue0(v.Pos, OpLOONG64MOVVconst, typ.UInt64)
 		v2.AuxInt = int64ToAuxInt(64)
 		v1.AddArg2(v2, y)
-		v0.AddArg(v1)
-		v3 := b.NewValue0(v.Pos, OpLOONG64SLLV, t)
-		v3.AddArg2(x, y)
-		v.AddArg2(v0, v3)
+		v.AddArg2(v0, v1)
 		return true
 	}
 }
@@ -4927,23 +5140,21 @@
 	b := v.Block
 	typ := &b.Func.Config.Types
 	// match: (Lsh64x8 <t> x y)
-	// result: (AND (NEGV <t> (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt8to64 y))) (SLLV <t> x (ZeroExt8to64 y)))
+	// result: (MASKEQZ (SLLV <t> x (ZeroExt8to64 y)) (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt8to64 y)))
 	for {
 		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpLOONG64AND)
-		v0 := b.NewValue0(v.Pos, OpLOONG64NEGV, t)
-		v1 := b.NewValue0(v.Pos, OpLOONG64SGTU, typ.Bool)
-		v2 := b.NewValue0(v.Pos, OpLOONG64MOVVconst, typ.UInt64)
-		v2.AuxInt = int64ToAuxInt(64)
-		v3 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64)
-		v3.AddArg(y)
-		v1.AddArg2(v2, v3)
-		v0.AddArg(v1)
-		v4 := b.NewValue0(v.Pos, OpLOONG64SLLV, t)
-		v4.AddArg2(x, v3)
-		v.AddArg2(v0, v4)
+		v.reset(OpLOONG64MASKEQZ)
+		v0 := b.NewValue0(v.Pos, OpLOONG64SLLV, t)
+		v1 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64)
+		v1.AddArg(y)
+		v0.AddArg2(x, v1)
+		v2 := b.NewValue0(v.Pos, OpLOONG64SGTU, typ.Bool)
+		v3 := b.NewValue0(v.Pos, OpLOONG64MOVVconst, typ.UInt64)
+		v3.AuxInt = int64ToAuxInt(64)
+		v2.AddArg2(v3, v1)
+		v.AddArg2(v0, v2)
 		return true
 	}
 }
@@ -4953,23 +5164,21 @@
 	b := v.Block
 	typ := &b.Func.Config.Types
 	// match: (Lsh8x16 <t> x y)
-	// result: (AND (NEGV <t> (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt16to64 y))) (SLLV <t> x (ZeroExt16to64 y)))
+	// result: (MASKEQZ (SLLV <t> x (ZeroExt16to64 y)) (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt16to64 y)))
 	for {
 		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpLOONG64AND)
-		v0 := b.NewValue0(v.Pos, OpLOONG64NEGV, t)
-		v1 := b.NewValue0(v.Pos, OpLOONG64SGTU, typ.Bool)
-		v2 := b.NewValue0(v.Pos, OpLOONG64MOVVconst, typ.UInt64)
-		v2.AuxInt = int64ToAuxInt(64)
-		v3 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64)
-		v3.AddArg(y)
-		v1.AddArg2(v2, v3)
-		v0.AddArg(v1)
-		v4 := b.NewValue0(v.Pos, OpLOONG64SLLV, t)
-		v4.AddArg2(x, v3)
-		v.AddArg2(v0, v4)
+		v.reset(OpLOONG64MASKEQZ)
+		v0 := b.NewValue0(v.Pos, OpLOONG64SLLV, t)
+		v1 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64)
+		v1.AddArg(y)
+		v0.AddArg2(x, v1)
+		v2 := b.NewValue0(v.Pos, OpLOONG64SGTU, typ.Bool)
+		v3 := b.NewValue0(v.Pos, OpLOONG64MOVVconst, typ.UInt64)
+		v3.AuxInt = int64ToAuxInt(64)
+		v2.AddArg2(v3, v1)
+		v.AddArg2(v0, v2)
 		return true
 	}
 }
@@ -4979,23 +5188,21 @@
 	b := v.Block
 	typ := &b.Func.Config.Types
 	// match: (Lsh8x32 <t> x y)
-	// result: (AND (NEGV <t> (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt32to64 y))) (SLLV <t> x (ZeroExt32to64 y)))
+	// result: (MASKEQZ (SLLV <t> x (ZeroExt32to64 y)) (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt32to64 y)))
 	for {
 		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpLOONG64AND)
-		v0 := b.NewValue0(v.Pos, OpLOONG64NEGV, t)
-		v1 := b.NewValue0(v.Pos, OpLOONG64SGTU, typ.Bool)
-		v2 := b.NewValue0(v.Pos, OpLOONG64MOVVconst, typ.UInt64)
-		v2.AuxInt = int64ToAuxInt(64)
-		v3 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64)
-		v3.AddArg(y)
-		v1.AddArg2(v2, v3)
-		v0.AddArg(v1)
-		v4 := b.NewValue0(v.Pos, OpLOONG64SLLV, t)
-		v4.AddArg2(x, v3)
-		v.AddArg2(v0, v4)
+		v.reset(OpLOONG64MASKEQZ)
+		v0 := b.NewValue0(v.Pos, OpLOONG64SLLV, t)
+		v1 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64)
+		v1.AddArg(y)
+		v0.AddArg2(x, v1)
+		v2 := b.NewValue0(v.Pos, OpLOONG64SGTU, typ.Bool)
+		v3 := b.NewValue0(v.Pos, OpLOONG64MOVVconst, typ.UInt64)
+		v3.AuxInt = int64ToAuxInt(64)
+		v2.AddArg2(v3, v1)
+		v.AddArg2(v0, v2)
 		return true
 	}
 }
@@ -5005,21 +5212,19 @@
 	b := v.Block
 	typ := &b.Func.Config.Types
 	// match: (Lsh8x64 <t> x y)
-	// result: (AND (NEGV <t> (SGTU (MOVVconst <typ.UInt64> [64]) y)) (SLLV <t> x y))
+	// result: (MASKEQZ (SLLV <t> x y) (SGTU (MOVVconst <typ.UInt64> [64]) y))
 	for {
 		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpLOONG64AND)
-		v0 := b.NewValue0(v.Pos, OpLOONG64NEGV, t)
+		v.reset(OpLOONG64MASKEQZ)
+		v0 := b.NewValue0(v.Pos, OpLOONG64SLLV, t)
+		v0.AddArg2(x, y)
 		v1 := b.NewValue0(v.Pos, OpLOONG64SGTU, typ.Bool)
 		v2 := b.NewValue0(v.Pos, OpLOONG64MOVVconst, typ.UInt64)
 		v2.AuxInt = int64ToAuxInt(64)
 		v1.AddArg2(v2, y)
-		v0.AddArg(v1)
-		v3 := b.NewValue0(v.Pos, OpLOONG64SLLV, t)
-		v3.AddArg2(x, y)
-		v.AddArg2(v0, v3)
+		v.AddArg2(v0, v1)
 		return true
 	}
 }
@@ -5029,23 +5234,21 @@
 	b := v.Block
 	typ := &b.Func.Config.Types
 	// match: (Lsh8x8 <t> x y)
-	// result: (AND (NEGV <t> (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt8to64 y))) (SLLV <t> x (ZeroExt8to64 y)))
+	// result: (MASKEQZ (SLLV <t> x (ZeroExt8to64 y)) (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt8to64 y)))
 	for {
 		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpLOONG64AND)
-		v0 := b.NewValue0(v.Pos, OpLOONG64NEGV, t)
-		v1 := b.NewValue0(v.Pos, OpLOONG64SGTU, typ.Bool)
-		v2 := b.NewValue0(v.Pos, OpLOONG64MOVVconst, typ.UInt64)
-		v2.AuxInt = int64ToAuxInt(64)
-		v3 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64)
-		v3.AddArg(y)
-		v1.AddArg2(v2, v3)
-		v0.AddArg(v1)
-		v4 := b.NewValue0(v.Pos, OpLOONG64SLLV, t)
-		v4.AddArg2(x, v3)
-		v.AddArg2(v0, v4)
+		v.reset(OpLOONG64MASKEQZ)
+		v0 := b.NewValue0(v.Pos, OpLOONG64SLLV, t)
+		v1 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64)
+		v1.AddArg(y)
+		v0.AddArg2(x, v1)
+		v2 := b.NewValue0(v.Pos, OpLOONG64SGTU, typ.Bool)
+		v3 := b.NewValue0(v.Pos, OpLOONG64MOVVconst, typ.UInt64)
+		v3.AuxInt = int64ToAuxInt(64)
+		v2.AddArg2(v3, v1)
+		v.AddArg2(v0, v2)
 		return true
 	}
 }
@@ -5055,18 +5258,16 @@
 	b := v.Block
 	typ := &b.Func.Config.Types
 	// match: (Mod16 x y)
-	// result: (Select0 (DIVV (SignExt16to64 x) (SignExt16to64 y)))
+	// result: (REMV (SignExt16to64 x) (SignExt16to64 y))
 	for {
 		x := v_0
 		y := v_1
-		v.reset(OpSelect0)
-		v0 := b.NewValue0(v.Pos, OpLOONG64DIVV, types.NewTuple(typ.Int64, typ.Int64))
+		v.reset(OpLOONG64REMV)
+		v0 := b.NewValue0(v.Pos, OpSignExt16to64, typ.Int64)
+		v0.AddArg(x)
 		v1 := b.NewValue0(v.Pos, OpSignExt16to64, typ.Int64)
-		v1.AddArg(x)
-		v2 := b.NewValue0(v.Pos, OpSignExt16to64, typ.Int64)
-		v2.AddArg(y)
-		v0.AddArg2(v1, v2)
-		v.AddArg(v0)
+		v1.AddArg(y)
+		v.AddArg2(v0, v1)
 		return true
 	}
 }
@@ -5076,18 +5277,16 @@
 	b := v.Block
 	typ := &b.Func.Config.Types
 	// match: (Mod16u x y)
-	// result: (Select0 (DIVVU (ZeroExt16to64 x) (ZeroExt16to64 y)))
+	// result: (REMVU (ZeroExt16to64 x) (ZeroExt16to64 y))
 	for {
 		x := v_0
 		y := v_1
-		v.reset(OpSelect0)
-		v0 := b.NewValue0(v.Pos, OpLOONG64DIVVU, types.NewTuple(typ.UInt64, typ.UInt64))
+		v.reset(OpLOONG64REMVU)
+		v0 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64)
+		v0.AddArg(x)
 		v1 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64)
-		v1.AddArg(x)
-		v2 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64)
-		v2.AddArg(y)
-		v0.AddArg2(v1, v2)
-		v.AddArg(v0)
+		v1.AddArg(y)
+		v.AddArg2(v0, v1)
 		return true
 	}
 }
@@ -5097,18 +5296,16 @@
 	b := v.Block
 	typ := &b.Func.Config.Types
 	// match: (Mod32 x y)
-	// result: (Select0 (DIVV (SignExt32to64 x) (SignExt32to64 y)))
+	// result: (REMV (SignExt32to64 x) (SignExt32to64 y))
 	for {
 		x := v_0
 		y := v_1
-		v.reset(OpSelect0)
-		v0 := b.NewValue0(v.Pos, OpLOONG64DIVV, types.NewTuple(typ.Int64, typ.Int64))
+		v.reset(OpLOONG64REMV)
+		v0 := b.NewValue0(v.Pos, OpSignExt32to64, typ.Int64)
+		v0.AddArg(x)
 		v1 := b.NewValue0(v.Pos, OpSignExt32to64, typ.Int64)
-		v1.AddArg(x)
-		v2 := b.NewValue0(v.Pos, OpSignExt32to64, typ.Int64)
-		v2.AddArg(y)
-		v0.AddArg2(v1, v2)
-		v.AddArg(v0)
+		v1.AddArg(y)
+		v.AddArg2(v0, v1)
 		return true
 	}
 }
@@ -5118,52 +5315,29 @@
 	b := v.Block
 	typ := &b.Func.Config.Types
 	// match: (Mod32u x y)
-	// result: (Select0 (DIVVU (ZeroExt32to64 x) (ZeroExt32to64 y)))
+	// result: (REMVU (ZeroExt32to64 x) (ZeroExt32to64 y))
 	for {
 		x := v_0
 		y := v_1
-		v.reset(OpSelect0)
-		v0 := b.NewValue0(v.Pos, OpLOONG64DIVVU, types.NewTuple(typ.UInt64, typ.UInt64))
+		v.reset(OpLOONG64REMVU)
+		v0 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64)
+		v0.AddArg(x)
 		v1 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64)
-		v1.AddArg(x)
-		v2 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64)
-		v2.AddArg(y)
-		v0.AddArg2(v1, v2)
-		v.AddArg(v0)
+		v1.AddArg(y)
+		v.AddArg2(v0, v1)
 		return true
 	}
 }
 func rewriteValueLOONG64_OpMod64(v *Value) bool {
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
-	b := v.Block
-	typ := &b.Func.Config.Types
 	// match: (Mod64 x y)
-	// result: (Select0 (DIVV x y))
+	// result: (REMV x y)
 	for {
 		x := v_0
 		y := v_1
-		v.reset(OpSelect0)
-		v0 := b.NewValue0(v.Pos, OpLOONG64DIVV, types.NewTuple(typ.Int64, typ.Int64))
-		v0.AddArg2(x, y)
-		v.AddArg(v0)
-		return true
-	}
-}
-func rewriteValueLOONG64_OpMod64u(v *Value) bool {
-	v_1 := v.Args[1]
-	v_0 := v.Args[0]
-	b := v.Block
-	typ := &b.Func.Config.Types
-	// match: (Mod64u x y)
-	// result: (Select0 (DIVVU x y))
-	for {
-		x := v_0
-		y := v_1
-		v.reset(OpSelect0)
-		v0 := b.NewValue0(v.Pos, OpLOONG64DIVVU, types.NewTuple(typ.UInt64, typ.UInt64))
-		v0.AddArg2(x, y)
-		v.AddArg(v0)
+		v.reset(OpLOONG64REMV)
+		v.AddArg2(x, y)
 		return true
 	}
 }
@@ -5173,18 +5347,16 @@
 	b := v.Block
 	typ := &b.Func.Config.Types
 	// match: (Mod8 x y)
-	// result: (Select0 (DIVV (SignExt8to64 x) (SignExt8to64 y)))
+	// result: (REMV (SignExt8to64 x) (SignExt8to64 y))
 	for {
 		x := v_0
 		y := v_1
-		v.reset(OpSelect0)
-		v0 := b.NewValue0(v.Pos, OpLOONG64DIVV, types.NewTuple(typ.Int64, typ.Int64))
+		v.reset(OpLOONG64REMV)
+		v0 := b.NewValue0(v.Pos, OpSignExt8to64, typ.Int64)
+		v0.AddArg(x)
 		v1 := b.NewValue0(v.Pos, OpSignExt8to64, typ.Int64)
-		v1.AddArg(x)
-		v2 := b.NewValue0(v.Pos, OpSignExt8to64, typ.Int64)
-		v2.AddArg(y)
-		v0.AddArg2(v1, v2)
-		v.AddArg(v0)
+		v1.AddArg(y)
+		v.AddArg2(v0, v1)
 		return true
 	}
 }
@@ -5194,18 +5366,16 @@
 	b := v.Block
 	typ := &b.Func.Config.Types
 	// match: (Mod8u x y)
-	// result: (Select0 (DIVVU (ZeroExt8to64 x) (ZeroExt8to64 y)))
+	// result: (REMVU (ZeroExt8to64 x) (ZeroExt8to64 y))
 	for {
 		x := v_0
 		y := v_1
-		v.reset(OpSelect0)
-		v0 := b.NewValue0(v.Pos, OpLOONG64DIVVU, types.NewTuple(typ.UInt64, typ.UInt64))
+		v.reset(OpLOONG64REMVU)
+		v0 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64)
+		v0.AddArg(x)
 		v1 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64)
-		v1.AddArg(x)
-		v2 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64)
-		v2.AddArg(y)
-		v0.AddArg2(v1, v2)
-		v.AddArg(v0)
+		v1.AddArg(y)
+		v.AddArg2(v0, v1)
 		return true
 	}
 }
@@ -5633,74 +5803,6 @@
 	}
 	return false
 }
-func rewriteValueLOONG64_OpMul16(v *Value) bool {
-	v_1 := v.Args[1]
-	v_0 := v.Args[0]
-	b := v.Block
-	typ := &b.Func.Config.Types
-	// match: (Mul16 x y)
-	// result: (Select1 (MULVU x y))
-	for {
-		x := v_0
-		y := v_1
-		v.reset(OpSelect1)
-		v0 := b.NewValue0(v.Pos, OpLOONG64MULVU, types.NewTuple(typ.UInt64, typ.UInt64))
-		v0.AddArg2(x, y)
-		v.AddArg(v0)
-		return true
-	}
-}
-func rewriteValueLOONG64_OpMul32(v *Value) bool {
-	v_1 := v.Args[1]
-	v_0 := v.Args[0]
-	b := v.Block
-	typ := &b.Func.Config.Types
-	// match: (Mul32 x y)
-	// result: (Select1 (MULVU x y))
-	for {
-		x := v_0
-		y := v_1
-		v.reset(OpSelect1)
-		v0 := b.NewValue0(v.Pos, OpLOONG64MULVU, types.NewTuple(typ.UInt64, typ.UInt64))
-		v0.AddArg2(x, y)
-		v.AddArg(v0)
-		return true
-	}
-}
-func rewriteValueLOONG64_OpMul64(v *Value) bool {
-	v_1 := v.Args[1]
-	v_0 := v.Args[0]
-	b := v.Block
-	typ := &b.Func.Config.Types
-	// match: (Mul64 x y)
-	// result: (Select1 (MULVU x y))
-	for {
-		x := v_0
-		y := v_1
-		v.reset(OpSelect1)
-		v0 := b.NewValue0(v.Pos, OpLOONG64MULVU, types.NewTuple(typ.UInt64, typ.UInt64))
-		v0.AddArg2(x, y)
-		v.AddArg(v0)
-		return true
-	}
-}
-func rewriteValueLOONG64_OpMul8(v *Value) bool {
-	v_1 := v.Args[1]
-	v_0 := v.Args[0]
-	b := v.Block
-	typ := &b.Func.Config.Types
-	// match: (Mul8 x y)
-	// result: (Select1 (MULVU x y))
-	for {
-		x := v_0
-		y := v_1
-		v.reset(OpSelect1)
-		v0 := b.NewValue0(v.Pos, OpLOONG64MULVU, types.NewTuple(typ.UInt64, typ.UInt64))
-		v0.AddArg2(x, y)
-		v.AddArg(v0)
-		return true
-	}
-}
 func rewriteValueLOONG64_OpNeq16(v *Value) bool {
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
@@ -6026,25 +6128,23 @@
 	b := v.Block
 	typ := &b.Func.Config.Types
 	// match: (Rsh16Ux16 <t> x y)
-	// result: (AND (NEGV <t> (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt16to64 y))) (SRLV <t> (ZeroExt16to64 x) (ZeroExt16to64 y)))
+	// result: (MASKEQZ (SRLV <t> (ZeroExt16to64 x) (ZeroExt16to64 y)) (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt16to64 y)))
 	for {
 		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpLOONG64AND)
-		v0 := b.NewValue0(v.Pos, OpLOONG64NEGV, t)
-		v1 := b.NewValue0(v.Pos, OpLOONG64SGTU, typ.Bool)
-		v2 := b.NewValue0(v.Pos, OpLOONG64MOVVconst, typ.UInt64)
-		v2.AuxInt = int64ToAuxInt(64)
-		v3 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64)
-		v3.AddArg(y)
-		v1.AddArg2(v2, v3)
-		v0.AddArg(v1)
-		v4 := b.NewValue0(v.Pos, OpLOONG64SRLV, t)
-		v5 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64)
-		v5.AddArg(x)
-		v4.AddArg2(v5, v3)
-		v.AddArg2(v0, v4)
+		v.reset(OpLOONG64MASKEQZ)
+		v0 := b.NewValue0(v.Pos, OpLOONG64SRLV, t)
+		v1 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64)
+		v1.AddArg(x)
+		v2 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64)
+		v2.AddArg(y)
+		v0.AddArg2(v1, v2)
+		v3 := b.NewValue0(v.Pos, OpLOONG64SGTU, typ.Bool)
+		v4 := b.NewValue0(v.Pos, OpLOONG64MOVVconst, typ.UInt64)
+		v4.AuxInt = int64ToAuxInt(64)
+		v3.AddArg2(v4, v2)
+		v.AddArg2(v0, v3)
 		return true
 	}
 }
@@ -6054,25 +6154,23 @@
 	b := v.Block
 	typ := &b.Func.Config.Types
 	// match: (Rsh16Ux32 <t> x y)
-	// result: (AND (NEGV <t> (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt32to64 y))) (SRLV <t> (ZeroExt16to64 x) (ZeroExt32to64 y)))
+	// result: (MASKEQZ (SRLV <t> (ZeroExt16to64 x) (ZeroExt32to64 y)) (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt32to64 y)))
 	for {
 		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpLOONG64AND)
-		v0 := b.NewValue0(v.Pos, OpLOONG64NEGV, t)
-		v1 := b.NewValue0(v.Pos, OpLOONG64SGTU, typ.Bool)
-		v2 := b.NewValue0(v.Pos, OpLOONG64MOVVconst, typ.UInt64)
-		v2.AuxInt = int64ToAuxInt(64)
-		v3 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64)
-		v3.AddArg(y)
-		v1.AddArg2(v2, v3)
-		v0.AddArg(v1)
-		v4 := b.NewValue0(v.Pos, OpLOONG64SRLV, t)
-		v5 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64)
-		v5.AddArg(x)
-		v4.AddArg2(v5, v3)
-		v.AddArg2(v0, v4)
+		v.reset(OpLOONG64MASKEQZ)
+		v0 := b.NewValue0(v.Pos, OpLOONG64SRLV, t)
+		v1 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64)
+		v1.AddArg(x)
+		v2 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64)
+		v2.AddArg(y)
+		v0.AddArg2(v1, v2)
+		v3 := b.NewValue0(v.Pos, OpLOONG64SGTU, typ.Bool)
+		v4 := b.NewValue0(v.Pos, OpLOONG64MOVVconst, typ.UInt64)
+		v4.AuxInt = int64ToAuxInt(64)
+		v3.AddArg2(v4, v2)
+		v.AddArg2(v0, v3)
 		return true
 	}
 }
@@ -6082,23 +6180,21 @@
 	b := v.Block
 	typ := &b.Func.Config.Types
 	// match: (Rsh16Ux64 <t> x y)
-	// result: (AND (NEGV <t> (SGTU (MOVVconst <typ.UInt64> [64]) y)) (SRLV <t> (ZeroExt16to64 x) y))
+	// result: (MASKEQZ (SRLV <t> (ZeroExt16to64 x) y) (SGTU (MOVVconst <typ.UInt64> [64]) y))
 	for {
 		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpLOONG64AND)
-		v0 := b.NewValue0(v.Pos, OpLOONG64NEGV, t)
-		v1 := b.NewValue0(v.Pos, OpLOONG64SGTU, typ.Bool)
-		v2 := b.NewValue0(v.Pos, OpLOONG64MOVVconst, typ.UInt64)
-		v2.AuxInt = int64ToAuxInt(64)
-		v1.AddArg2(v2, y)
-		v0.AddArg(v1)
-		v3 := b.NewValue0(v.Pos, OpLOONG64SRLV, t)
-		v4 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64)
-		v4.AddArg(x)
-		v3.AddArg2(v4, y)
-		v.AddArg2(v0, v3)
+		v.reset(OpLOONG64MASKEQZ)
+		v0 := b.NewValue0(v.Pos, OpLOONG64SRLV, t)
+		v1 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64)
+		v1.AddArg(x)
+		v0.AddArg2(v1, y)
+		v2 := b.NewValue0(v.Pos, OpLOONG64SGTU, typ.Bool)
+		v3 := b.NewValue0(v.Pos, OpLOONG64MOVVconst, typ.UInt64)
+		v3.AuxInt = int64ToAuxInt(64)
+		v2.AddArg2(v3, y)
+		v.AddArg2(v0, v2)
 		return true
 	}
 }
@@ -6108,25 +6204,23 @@
 	b := v.Block
 	typ := &b.Func.Config.Types
 	// match: (Rsh16Ux8 <t> x y)
-	// result: (AND (NEGV <t> (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt8to64 y))) (SRLV <t> (ZeroExt16to64 x) (ZeroExt8to64 y)))
+	// result: (MASKEQZ (SRLV <t> (ZeroExt16to64 x) (ZeroExt8to64 y)) (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt8to64 y)))
 	for {
 		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpLOONG64AND)
-		v0 := b.NewValue0(v.Pos, OpLOONG64NEGV, t)
-		v1 := b.NewValue0(v.Pos, OpLOONG64SGTU, typ.Bool)
-		v2 := b.NewValue0(v.Pos, OpLOONG64MOVVconst, typ.UInt64)
-		v2.AuxInt = int64ToAuxInt(64)
-		v3 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64)
-		v3.AddArg(y)
-		v1.AddArg2(v2, v3)
-		v0.AddArg(v1)
-		v4 := b.NewValue0(v.Pos, OpLOONG64SRLV, t)
-		v5 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64)
-		v5.AddArg(x)
-		v4.AddArg2(v5, v3)
-		v.AddArg2(v0, v4)
+		v.reset(OpLOONG64MASKEQZ)
+		v0 := b.NewValue0(v.Pos, OpLOONG64SRLV, t)
+		v1 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64)
+		v1.AddArg(x)
+		v2 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64)
+		v2.AddArg(y)
+		v0.AddArg2(v1, v2)
+		v3 := b.NewValue0(v.Pos, OpLOONG64SGTU, typ.Bool)
+		v4 := b.NewValue0(v.Pos, OpLOONG64MOVVconst, typ.UInt64)
+		v4.AuxInt = int64ToAuxInt(64)
+		v3.AddArg2(v4, v2)
+		v.AddArg2(v0, v3)
 		return true
 	}
 }
@@ -6246,25 +6340,23 @@
 	b := v.Block
 	typ := &b.Func.Config.Types
 	// match: (Rsh32Ux16 <t> x y)
-	// result: (AND (NEGV <t> (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt16to64 y))) (SRLV <t> (ZeroExt32to64 x) (ZeroExt16to64 y)))
+	// result: (MASKEQZ (SRLV <t> (ZeroExt32to64 x) (ZeroExt16to64 y)) (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt16to64 y)))
 	for {
 		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpLOONG64AND)
-		v0 := b.NewValue0(v.Pos, OpLOONG64NEGV, t)
-		v1 := b.NewValue0(v.Pos, OpLOONG64SGTU, typ.Bool)
-		v2 := b.NewValue0(v.Pos, OpLOONG64MOVVconst, typ.UInt64)
-		v2.AuxInt = int64ToAuxInt(64)
-		v3 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64)
-		v3.AddArg(y)
-		v1.AddArg2(v2, v3)
-		v0.AddArg(v1)
-		v4 := b.NewValue0(v.Pos, OpLOONG64SRLV, t)
-		v5 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64)
-		v5.AddArg(x)
-		v4.AddArg2(v5, v3)
-		v.AddArg2(v0, v4)
+		v.reset(OpLOONG64MASKEQZ)
+		v0 := b.NewValue0(v.Pos, OpLOONG64SRLV, t)
+		v1 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64)
+		v1.AddArg(x)
+		v2 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64)
+		v2.AddArg(y)
+		v0.AddArg2(v1, v2)
+		v3 := b.NewValue0(v.Pos, OpLOONG64SGTU, typ.Bool)
+		v4 := b.NewValue0(v.Pos, OpLOONG64MOVVconst, typ.UInt64)
+		v4.AuxInt = int64ToAuxInt(64)
+		v3.AddArg2(v4, v2)
+		v.AddArg2(v0, v3)
 		return true
 	}
 }
@@ -6274,25 +6366,23 @@
 	b := v.Block
 	typ := &b.Func.Config.Types
 	// match: (Rsh32Ux32 <t> x y)
-	// result: (AND (NEGV <t> (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt32to64 y))) (SRLV <t> (ZeroExt32to64 x) (ZeroExt32to64 y)))
+	// result: (MASKEQZ (SRLV <t> (ZeroExt32to64 x) (ZeroExt32to64 y)) (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt32to64 y)))
 	for {
 		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpLOONG64AND)
-		v0 := b.NewValue0(v.Pos, OpLOONG64NEGV, t)
-		v1 := b.NewValue0(v.Pos, OpLOONG64SGTU, typ.Bool)
-		v2 := b.NewValue0(v.Pos, OpLOONG64MOVVconst, typ.UInt64)
-		v2.AuxInt = int64ToAuxInt(64)
-		v3 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64)
-		v3.AddArg(y)
-		v1.AddArg2(v2, v3)
-		v0.AddArg(v1)
-		v4 := b.NewValue0(v.Pos, OpLOONG64SRLV, t)
-		v5 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64)
-		v5.AddArg(x)
-		v4.AddArg2(v5, v3)
-		v.AddArg2(v0, v4)
+		v.reset(OpLOONG64MASKEQZ)
+		v0 := b.NewValue0(v.Pos, OpLOONG64SRLV, t)
+		v1 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64)
+		v1.AddArg(x)
+		v2 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64)
+		v2.AddArg(y)
+		v0.AddArg2(v1, v2)
+		v3 := b.NewValue0(v.Pos, OpLOONG64SGTU, typ.Bool)
+		v4 := b.NewValue0(v.Pos, OpLOONG64MOVVconst, typ.UInt64)
+		v4.AuxInt = int64ToAuxInt(64)
+		v3.AddArg2(v4, v2)
+		v.AddArg2(v0, v3)
 		return true
 	}
 }
@@ -6302,23 +6392,21 @@
 	b := v.Block
 	typ := &b.Func.Config.Types
 	// match: (Rsh32Ux64 <t> x y)
-	// result: (AND (NEGV <t> (SGTU (MOVVconst <typ.UInt64> [64]) y)) (SRLV <t> (ZeroExt32to64 x) y))
+	// result: (MASKEQZ (SRLV <t> (ZeroExt32to64 x) y) (SGTU (MOVVconst <typ.UInt64> [64]) y))
 	for {
 		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpLOONG64AND)
-		v0 := b.NewValue0(v.Pos, OpLOONG64NEGV, t)
-		v1 := b.NewValue0(v.Pos, OpLOONG64SGTU, typ.Bool)
-		v2 := b.NewValue0(v.Pos, OpLOONG64MOVVconst, typ.UInt64)
-		v2.AuxInt = int64ToAuxInt(64)
-		v1.AddArg2(v2, y)
-		v0.AddArg(v1)
-		v3 := b.NewValue0(v.Pos, OpLOONG64SRLV, t)
-		v4 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64)
-		v4.AddArg(x)
-		v3.AddArg2(v4, y)
-		v.AddArg2(v0, v3)
+		v.reset(OpLOONG64MASKEQZ)
+		v0 := b.NewValue0(v.Pos, OpLOONG64SRLV, t)
+		v1 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64)
+		v1.AddArg(x)
+		v0.AddArg2(v1, y)
+		v2 := b.NewValue0(v.Pos, OpLOONG64SGTU, typ.Bool)
+		v3 := b.NewValue0(v.Pos, OpLOONG64MOVVconst, typ.UInt64)
+		v3.AuxInt = int64ToAuxInt(64)
+		v2.AddArg2(v3, y)
+		v.AddArg2(v0, v2)
 		return true
 	}
 }
@@ -6328,25 +6416,23 @@
 	b := v.Block
 	typ := &b.Func.Config.Types
 	// match: (Rsh32Ux8 <t> x y)
-	// result: (AND (NEGV <t> (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt8to64 y))) (SRLV <t> (ZeroExt32to64 x) (ZeroExt8to64 y)))
+	// result: (MASKEQZ (SRLV <t> (ZeroExt32to64 x) (ZeroExt8to64 y)) (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt8to64 y)))
 	for {
 		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpLOONG64AND)
-		v0 := b.NewValue0(v.Pos, OpLOONG64NEGV, t)
-		v1 := b.NewValue0(v.Pos, OpLOONG64SGTU, typ.Bool)
-		v2 := b.NewValue0(v.Pos, OpLOONG64MOVVconst, typ.UInt64)
-		v2.AuxInt = int64ToAuxInt(64)
-		v3 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64)
-		v3.AddArg(y)
-		v1.AddArg2(v2, v3)
-		v0.AddArg(v1)
-		v4 := b.NewValue0(v.Pos, OpLOONG64SRLV, t)
-		v5 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64)
-		v5.AddArg(x)
-		v4.AddArg2(v5, v3)
-		v.AddArg2(v0, v4)
+		v.reset(OpLOONG64MASKEQZ)
+		v0 := b.NewValue0(v.Pos, OpLOONG64SRLV, t)
+		v1 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64)
+		v1.AddArg(x)
+		v2 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64)
+		v2.AddArg(y)
+		v0.AddArg2(v1, v2)
+		v3 := b.NewValue0(v.Pos, OpLOONG64SGTU, typ.Bool)
+		v4 := b.NewValue0(v.Pos, OpLOONG64MOVVconst, typ.UInt64)
+		v4.AuxInt = int64ToAuxInt(64)
+		v3.AddArg2(v4, v2)
+		v.AddArg2(v0, v3)
 		return true
 	}
 }
@@ -6466,23 +6552,21 @@
 	b := v.Block
 	typ := &b.Func.Config.Types
 	// match: (Rsh64Ux16 <t> x y)
-	// result: (AND (NEGV <t> (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt16to64 y))) (SRLV <t> x (ZeroExt16to64 y)))
+	// result: (MASKEQZ (SRLV <t> x (ZeroExt16to64 y)) (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt16to64 y)))
 	for {
 		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpLOONG64AND)
-		v0 := b.NewValue0(v.Pos, OpLOONG64NEGV, t)
-		v1 := b.NewValue0(v.Pos, OpLOONG64SGTU, typ.Bool)
-		v2 := b.NewValue0(v.Pos, OpLOONG64MOVVconst, typ.UInt64)
-		v2.AuxInt = int64ToAuxInt(64)
-		v3 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64)
-		v3.AddArg(y)
-		v1.AddArg2(v2, v3)
-		v0.AddArg(v1)
-		v4 := b.NewValue0(v.Pos, OpLOONG64SRLV, t)
-		v4.AddArg2(x, v3)
-		v.AddArg2(v0, v4)
+		v.reset(OpLOONG64MASKEQZ)
+		v0 := b.NewValue0(v.Pos, OpLOONG64SRLV, t)
+		v1 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64)
+		v1.AddArg(y)
+		v0.AddArg2(x, v1)
+		v2 := b.NewValue0(v.Pos, OpLOONG64SGTU, typ.Bool)
+		v3 := b.NewValue0(v.Pos, OpLOONG64MOVVconst, typ.UInt64)
+		v3.AuxInt = int64ToAuxInt(64)
+		v2.AddArg2(v3, v1)
+		v.AddArg2(v0, v2)
 		return true
 	}
 }
@@ -6492,23 +6576,21 @@
 	b := v.Block
 	typ := &b.Func.Config.Types
 	// match: (Rsh64Ux32 <t> x y)
-	// result: (AND (NEGV <t> (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt32to64 y))) (SRLV <t> x (ZeroExt32to64 y)))
+	// result: (MASKEQZ (SRLV <t> x (ZeroExt32to64 y)) (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt32to64 y)))
 	for {
 		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpLOONG64AND)
-		v0 := b.NewValue0(v.Pos, OpLOONG64NEGV, t)
-		v1 := b.NewValue0(v.Pos, OpLOONG64SGTU, typ.Bool)
-		v2 := b.NewValue0(v.Pos, OpLOONG64MOVVconst, typ.UInt64)
-		v2.AuxInt = int64ToAuxInt(64)
-		v3 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64)
-		v3.AddArg(y)
-		v1.AddArg2(v2, v3)
-		v0.AddArg(v1)
-		v4 := b.NewValue0(v.Pos, OpLOONG64SRLV, t)
-		v4.AddArg2(x, v3)
-		v.AddArg2(v0, v4)
+		v.reset(OpLOONG64MASKEQZ)
+		v0 := b.NewValue0(v.Pos, OpLOONG64SRLV, t)
+		v1 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64)
+		v1.AddArg(y)
+		v0.AddArg2(x, v1)
+		v2 := b.NewValue0(v.Pos, OpLOONG64SGTU, typ.Bool)
+		v3 := b.NewValue0(v.Pos, OpLOONG64MOVVconst, typ.UInt64)
+		v3.AuxInt = int64ToAuxInt(64)
+		v2.AddArg2(v3, v1)
+		v.AddArg2(v0, v2)
 		return true
 	}
 }
@@ -6518,21 +6600,19 @@
 	b := v.Block
 	typ := &b.Func.Config.Types
 	// match: (Rsh64Ux64 <t> x y)
-	// result: (AND (NEGV <t> (SGTU (MOVVconst <typ.UInt64> [64]) y)) (SRLV <t> x y))
+	// result: (MASKEQZ (SRLV <t> x y) (SGTU (MOVVconst <typ.UInt64> [64]) y))
 	for {
 		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpLOONG64AND)
-		v0 := b.NewValue0(v.Pos, OpLOONG64NEGV, t)
+		v.reset(OpLOONG64MASKEQZ)
+		v0 := b.NewValue0(v.Pos, OpLOONG64SRLV, t)
+		v0.AddArg2(x, y)
 		v1 := b.NewValue0(v.Pos, OpLOONG64SGTU, typ.Bool)
 		v2 := b.NewValue0(v.Pos, OpLOONG64MOVVconst, typ.UInt64)
 		v2.AuxInt = int64ToAuxInt(64)
 		v1.AddArg2(v2, y)
-		v0.AddArg(v1)
-		v3 := b.NewValue0(v.Pos, OpLOONG64SRLV, t)
-		v3.AddArg2(x, y)
-		v.AddArg2(v0, v3)
+		v.AddArg2(v0, v1)
 		return true
 	}
 }
@@ -6542,23 +6622,21 @@
 	b := v.Block
 	typ := &b.Func.Config.Types
 	// match: (Rsh64Ux8 <t> x y)
-	// result: (AND (NEGV <t> (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt8to64 y))) (SRLV <t> x (ZeroExt8to64 y)))
+	// result: (MASKEQZ (SRLV <t> x (ZeroExt8to64 y)) (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt8to64 y)))
 	for {
 		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpLOONG64AND)
-		v0 := b.NewValue0(v.Pos, OpLOONG64NEGV, t)
-		v1 := b.NewValue0(v.Pos, OpLOONG64SGTU, typ.Bool)
-		v2 := b.NewValue0(v.Pos, OpLOONG64MOVVconst, typ.UInt64)
-		v2.AuxInt = int64ToAuxInt(64)
-		v3 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64)
-		v3.AddArg(y)
-		v1.AddArg2(v2, v3)
-		v0.AddArg(v1)
-		v4 := b.NewValue0(v.Pos, OpLOONG64SRLV, t)
-		v4.AddArg2(x, v3)
-		v.AddArg2(v0, v4)
+		v.reset(OpLOONG64MASKEQZ)
+		v0 := b.NewValue0(v.Pos, OpLOONG64SRLV, t)
+		v1 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64)
+		v1.AddArg(y)
+		v0.AddArg2(x, v1)
+		v2 := b.NewValue0(v.Pos, OpLOONG64SGTU, typ.Bool)
+		v3 := b.NewValue0(v.Pos, OpLOONG64MOVVconst, typ.UInt64)
+		v3.AuxInt = int64ToAuxInt(64)
+		v2.AddArg2(v3, v1)
+		v.AddArg2(v0, v2)
 		return true
 	}
 }
@@ -6670,25 +6748,23 @@
 	b := v.Block
 	typ := &b.Func.Config.Types
 	// match: (Rsh8Ux16 <t> x y)
-	// result: (AND (NEGV <t> (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt16to64 y))) (SRLV <t> (ZeroExt8to64 x) (ZeroExt16to64 y)))
+	// result: (MASKEQZ (SRLV <t> (ZeroExt8to64 x) (ZeroExt16to64 y)) (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt16to64 y)))
 	for {
 		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpLOONG64AND)
-		v0 := b.NewValue0(v.Pos, OpLOONG64NEGV, t)
-		v1 := b.NewValue0(v.Pos, OpLOONG64SGTU, typ.Bool)
-		v2 := b.NewValue0(v.Pos, OpLOONG64MOVVconst, typ.UInt64)
-		v2.AuxInt = int64ToAuxInt(64)
-		v3 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64)
-		v3.AddArg(y)
-		v1.AddArg2(v2, v3)
-		v0.AddArg(v1)
-		v4 := b.NewValue0(v.Pos, OpLOONG64SRLV, t)
-		v5 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64)
-		v5.AddArg(x)
-		v4.AddArg2(v5, v3)
-		v.AddArg2(v0, v4)
+		v.reset(OpLOONG64MASKEQZ)
+		v0 := b.NewValue0(v.Pos, OpLOONG64SRLV, t)
+		v1 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64)
+		v1.AddArg(x)
+		v2 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64)
+		v2.AddArg(y)
+		v0.AddArg2(v1, v2)
+		v3 := b.NewValue0(v.Pos, OpLOONG64SGTU, typ.Bool)
+		v4 := b.NewValue0(v.Pos, OpLOONG64MOVVconst, typ.UInt64)
+		v4.AuxInt = int64ToAuxInt(64)
+		v3.AddArg2(v4, v2)
+		v.AddArg2(v0, v3)
 		return true
 	}
 }
@@ -6698,25 +6774,23 @@
 	b := v.Block
 	typ := &b.Func.Config.Types
 	// match: (Rsh8Ux32 <t> x y)
-	// result: (AND (NEGV <t> (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt32to64 y))) (SRLV <t> (ZeroExt8to64 x) (ZeroExt32to64 y)))
+	// result: (MASKEQZ (SRLV <t> (ZeroExt8to64 x) (ZeroExt32to64 y)) (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt32to64 y)))
 	for {
 		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpLOONG64AND)
-		v0 := b.NewValue0(v.Pos, OpLOONG64NEGV, t)
-		v1 := b.NewValue0(v.Pos, OpLOONG64SGTU, typ.Bool)
-		v2 := b.NewValue0(v.Pos, OpLOONG64MOVVconst, typ.UInt64)
-		v2.AuxInt = int64ToAuxInt(64)
-		v3 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64)
-		v3.AddArg(y)
-		v1.AddArg2(v2, v3)
-		v0.AddArg(v1)
-		v4 := b.NewValue0(v.Pos, OpLOONG64SRLV, t)
-		v5 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64)
-		v5.AddArg(x)
-		v4.AddArg2(v5, v3)
-		v.AddArg2(v0, v4)
+		v.reset(OpLOONG64MASKEQZ)
+		v0 := b.NewValue0(v.Pos, OpLOONG64SRLV, t)
+		v1 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64)
+		v1.AddArg(x)
+		v2 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64)
+		v2.AddArg(y)
+		v0.AddArg2(v1, v2)
+		v3 := b.NewValue0(v.Pos, OpLOONG64SGTU, typ.Bool)
+		v4 := b.NewValue0(v.Pos, OpLOONG64MOVVconst, typ.UInt64)
+		v4.AuxInt = int64ToAuxInt(64)
+		v3.AddArg2(v4, v2)
+		v.AddArg2(v0, v3)
 		return true
 	}
 }
@@ -6726,23 +6800,21 @@
 	b := v.Block
 	typ := &b.Func.Config.Types
 	// match: (Rsh8Ux64 <t> x y)
-	// result: (AND (NEGV <t> (SGTU (MOVVconst <typ.UInt64> [64]) y)) (SRLV <t> (ZeroExt8to64 x) y))
+	// result: (MASKEQZ (SRLV <t> (ZeroExt8to64 x) y) (SGTU (MOVVconst <typ.UInt64> [64]) y))
 	for {
 		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpLOONG64AND)
-		v0 := b.NewValue0(v.Pos, OpLOONG64NEGV, t)
-		v1 := b.NewValue0(v.Pos, OpLOONG64SGTU, typ.Bool)
-		v2 := b.NewValue0(v.Pos, OpLOONG64MOVVconst, typ.UInt64)
-		v2.AuxInt = int64ToAuxInt(64)
-		v1.AddArg2(v2, y)
-		v0.AddArg(v1)
-		v3 := b.NewValue0(v.Pos, OpLOONG64SRLV, t)
-		v4 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64)
-		v4.AddArg(x)
-		v3.AddArg2(v4, y)
-		v.AddArg2(v0, v3)
+		v.reset(OpLOONG64MASKEQZ)
+		v0 := b.NewValue0(v.Pos, OpLOONG64SRLV, t)
+		v1 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64)
+		v1.AddArg(x)
+		v0.AddArg2(v1, y)
+		v2 := b.NewValue0(v.Pos, OpLOONG64SGTU, typ.Bool)
+		v3 := b.NewValue0(v.Pos, OpLOONG64MOVVconst, typ.UInt64)
+		v3.AuxInt = int64ToAuxInt(64)
+		v2.AddArg2(v3, y)
+		v.AddArg2(v0, v2)
 		return true
 	}
 }
@@ -6752,25 +6824,23 @@
 	b := v.Block
 	typ := &b.Func.Config.Types
 	// match: (Rsh8Ux8 <t> x y)
-	// result: (AND (NEGV <t> (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt8to64 y))) (SRLV <t> (ZeroExt8to64 x) (ZeroExt8to64 y)))
+	// result: (MASKEQZ (SRLV <t> (ZeroExt8to64 x) (ZeroExt8to64 y)) (SGTU (MOVVconst <typ.UInt64> [64]) (ZeroExt8to64 y)))
 	for {
 		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpLOONG64AND)
-		v0 := b.NewValue0(v.Pos, OpLOONG64NEGV, t)
-		v1 := b.NewValue0(v.Pos, OpLOONG64SGTU, typ.Bool)
-		v2 := b.NewValue0(v.Pos, OpLOONG64MOVVconst, typ.UInt64)
-		v2.AuxInt = int64ToAuxInt(64)
-		v3 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64)
-		v3.AddArg(y)
-		v1.AddArg2(v2, v3)
-		v0.AddArg(v1)
-		v4 := b.NewValue0(v.Pos, OpLOONG64SRLV, t)
-		v5 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64)
-		v5.AddArg(x)
-		v4.AddArg2(v5, v3)
-		v.AddArg2(v0, v4)
+		v.reset(OpLOONG64MASKEQZ)
+		v0 := b.NewValue0(v.Pos, OpLOONG64SRLV, t)
+		v1 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64)
+		v1.AddArg(x)
+		v2 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64)
+		v2.AddArg(y)
+		v0.AddArg2(v1, v2)
+		v3 := b.NewValue0(v.Pos, OpLOONG64SGTU, typ.Bool)
+		v4 := b.NewValue0(v.Pos, OpLOONG64MOVVconst, typ.UInt64)
+		v4.AuxInt = int64ToAuxInt(64)
+		v3.AddArg2(v4, v2)
+		v.AddArg2(v0, v3)
 		return true
 	}
 }
@@ -6887,20 +6957,28 @@
 func rewriteValueLOONG64_OpSelect0(v *Value) bool {
 	v_0 := v.Args[0]
 	b := v.Block
-	typ := &b.Func.Config.Types
+	// match: (Select0 (Mul64uhilo x y))
+	// result: (MULHVU x y)
+	for {
+		if v_0.Op != OpMul64uhilo {
+			break
+		}
+		y := v_0.Args[1]
+		x := v_0.Args[0]
+		v.reset(OpLOONG64MULHVU)
+		v.AddArg2(x, y)
+		return true
+	}
 	// match: (Select0 (Mul64uover x y))
-	// result: (Select1 <typ.UInt64> (MULVU x y))
+	// result: (MULV x y)
 	for {
 		if v_0.Op != OpMul64uover {
 			break
 		}
 		y := v_0.Args[1]
 		x := v_0.Args[0]
-		v.reset(OpSelect1)
-		v.Type = typ.UInt64
-		v0 := b.NewValue0(v.Pos, OpLOONG64MULVU, types.NewTuple(typ.UInt64, typ.UInt64))
-		v0.AddArg2(x, y)
-		v.AddArg(v0)
+		v.reset(OpLOONG64MULV)
+		v.AddArg2(x, y)
 		return true
 	}
 	// match: (Select0 <t> (Add64carry x y c))
@@ -6935,101 +7013,26 @@
 		v.AddArg2(v0, c)
 		return true
 	}
-	// match: (Select0 (DIVVU _ (MOVVconst [1])))
-	// result: (MOVVconst [0])
-	for {
-		if v_0.Op != OpLOONG64DIVVU {
-			break
-		}
-		_ = v_0.Args[1]
-		v_0_1 := v_0.Args[1]
-		if v_0_1.Op != OpLOONG64MOVVconst || auxIntToInt64(v_0_1.AuxInt) != 1 {
-			break
-		}
-		v.reset(OpLOONG64MOVVconst)
-		v.AuxInt = int64ToAuxInt(0)
-		return true
-	}
-	// match: (Select0 (DIVVU x (MOVVconst [c])))
-	// cond: isPowerOfTwo64(c)
-	// result: (ANDconst [c-1] x)
-	for {
-		if v_0.Op != OpLOONG64DIVVU {
-			break
-		}
-		_ = v_0.Args[1]
-		x := v_0.Args[0]
-		v_0_1 := v_0.Args[1]
-		if v_0_1.Op != OpLOONG64MOVVconst {
-			break
-		}
-		c := auxIntToInt64(v_0_1.AuxInt)
-		if !(isPowerOfTwo64(c)) {
-			break
-		}
-		v.reset(OpLOONG64ANDconst)
-		v.AuxInt = int64ToAuxInt(c - 1)
-		v.AddArg(x)
-		return true
-	}
-	// match: (Select0 (DIVV (MOVVconst [c]) (MOVVconst [d])))
-	// cond: d != 0
-	// result: (MOVVconst [c%d])
-	for {
-		if v_0.Op != OpLOONG64DIVV {
-			break
-		}
-		_ = v_0.Args[1]
-		v_0_0 := v_0.Args[0]
-		if v_0_0.Op != OpLOONG64MOVVconst {
-			break
-		}
-		c := auxIntToInt64(v_0_0.AuxInt)
-		v_0_1 := v_0.Args[1]
-		if v_0_1.Op != OpLOONG64MOVVconst {
-			break
-		}
-		d := auxIntToInt64(v_0_1.AuxInt)
-		if !(d != 0) {
-			break
-		}
-		v.reset(OpLOONG64MOVVconst)
-		v.AuxInt = int64ToAuxInt(c % d)
-		return true
-	}
-	// match: (Select0 (DIVVU (MOVVconst [c]) (MOVVconst [d])))
-	// cond: d != 0
-	// result: (MOVVconst [int64(uint64(c)%uint64(d))])
-	for {
-		if v_0.Op != OpLOONG64DIVVU {
-			break
-		}
-		_ = v_0.Args[1]
-		v_0_0 := v_0.Args[0]
-		if v_0_0.Op != OpLOONG64MOVVconst {
-			break
-		}
-		c := auxIntToInt64(v_0_0.AuxInt)
-		v_0_1 := v_0.Args[1]
-		if v_0_1.Op != OpLOONG64MOVVconst {
-			break
-		}
-		d := auxIntToInt64(v_0_1.AuxInt)
-		if !(d != 0) {
-			break
-		}
-		v.reset(OpLOONG64MOVVconst)
-		v.AuxInt = int64ToAuxInt(int64(uint64(c) % uint64(d)))
-		return true
-	}
 	return false
 }
 func rewriteValueLOONG64_OpSelect1(v *Value) bool {
 	v_0 := v.Args[0]
 	b := v.Block
 	typ := &b.Func.Config.Types
+	// match: (Select1 (Mul64uhilo x y))
+	// result: (MULV x y)
+	for {
+		if v_0.Op != OpMul64uhilo {
+			break
+		}
+		y := v_0.Args[1]
+		x := v_0.Args[0]
+		v.reset(OpLOONG64MULV)
+		v.AddArg2(x, y)
+		return true
+	}
 	// match: (Select1 (Mul64uover x y))
-	// result: (SGTU <typ.Bool> (Select0 <typ.UInt64> (MULVU x y)) (MOVVconst <typ.UInt64> [0]))
+	// result: (SGTU <typ.Bool> (MULHVU x y) (MOVVconst <typ.UInt64> [0]))
 	for {
 		if v_0.Op != OpMul64uover {
 			break
@@ -7038,13 +7041,11 @@
 		x := v_0.Args[0]
 		v.reset(OpLOONG64SGTU)
 		v.Type = typ.Bool
-		v0 := b.NewValue0(v.Pos, OpSelect0, typ.UInt64)
-		v1 := b.NewValue0(v.Pos, OpLOONG64MULVU, types.NewTuple(typ.UInt64, typ.UInt64))
-		v1.AddArg2(x, y)
-		v0.AddArg(v1)
-		v2 := b.NewValue0(v.Pos, OpLOONG64MOVVconst, typ.UInt64)
-		v2.AuxInt = int64ToAuxInt(0)
-		v.AddArg2(v0, v2)
+		v0 := b.NewValue0(v.Pos, OpLOONG64MULHVU, typ.UInt64)
+		v0.AddArg2(x, y)
+		v1 := b.NewValue0(v.Pos, OpLOONG64MOVVconst, typ.UInt64)
+		v1.AuxInt = int64ToAuxInt(0)
+		v.AddArg2(v0, v1)
 		return true
 	}
 	// match: (Select1 <t> (Add64carry x y c))
@@ -7091,201 +7092,6 @@
 		v.AddArg2(v0, v2)
 		return true
 	}
-	// match: (Select1 (MULVU x (MOVVconst [-1])))
-	// result: (NEGV x)
-	for {
-		if v_0.Op != OpLOONG64MULVU {
-			break
-		}
-		_ = v_0.Args[1]
-		v_0_0 := v_0.Args[0]
-		v_0_1 := v_0.Args[1]
-		for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
-			x := v_0_0
-			if v_0_1.Op != OpLOONG64MOVVconst || auxIntToInt64(v_0_1.AuxInt) != -1 {
-				continue
-			}
-			v.reset(OpLOONG64NEGV)
-			v.AddArg(x)
-			return true
-		}
-		break
-	}
-	// match: (Select1 (MULVU _ (MOVVconst [0])))
-	// result: (MOVVconst [0])
-	for {
-		if v_0.Op != OpLOONG64MULVU {
-			break
-		}
-		_ = v_0.Args[1]
-		v_0_0 := v_0.Args[0]
-		v_0_1 := v_0.Args[1]
-		for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
-			if v_0_1.Op != OpLOONG64MOVVconst || auxIntToInt64(v_0_1.AuxInt) != 0 {
-				continue
-			}
-			v.reset(OpLOONG64MOVVconst)
-			v.AuxInt = int64ToAuxInt(0)
-			return true
-		}
-		break
-	}
-	// match: (Select1 (MULVU x (MOVVconst [1])))
-	// result: x
-	for {
-		if v_0.Op != OpLOONG64MULVU {
-			break
-		}
-		_ = v_0.Args[1]
-		v_0_0 := v_0.Args[0]
-		v_0_1 := v_0.Args[1]
-		for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
-			x := v_0_0
-			if v_0_1.Op != OpLOONG64MOVVconst || auxIntToInt64(v_0_1.AuxInt) != 1 {
-				continue
-			}
-			v.copyOf(x)
-			return true
-		}
-		break
-	}
-	// match: (Select1 (MULVU x (MOVVconst [c])))
-	// cond: isPowerOfTwo64(c)
-	// result: (SLLVconst [log64(c)] x)
-	for {
-		if v_0.Op != OpLOONG64MULVU {
-			break
-		}
-		_ = v_0.Args[1]
-		v_0_0 := v_0.Args[0]
-		v_0_1 := v_0.Args[1]
-		for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
-			x := v_0_0
-			if v_0_1.Op != OpLOONG64MOVVconst {
-				continue
-			}
-			c := auxIntToInt64(v_0_1.AuxInt)
-			if !(isPowerOfTwo64(c)) {
-				continue
-			}
-			v.reset(OpLOONG64SLLVconst)
-			v.AuxInt = int64ToAuxInt(log64(c))
-			v.AddArg(x)
-			return true
-		}
-		break
-	}
-	// match: (Select1 (DIVVU x (MOVVconst [1])))
-	// result: x
-	for {
-		if v_0.Op != OpLOONG64DIVVU {
-			break
-		}
-		_ = v_0.Args[1]
-		x := v_0.Args[0]
-		v_0_1 := v_0.Args[1]
-		if v_0_1.Op != OpLOONG64MOVVconst || auxIntToInt64(v_0_1.AuxInt) != 1 {
-			break
-		}
-		v.copyOf(x)
-		return true
-	}
-	// match: (Select1 (DIVVU x (MOVVconst [c])))
-	// cond: isPowerOfTwo64(c)
-	// result: (SRLVconst [log64(c)] x)
-	for {
-		if v_0.Op != OpLOONG64DIVVU {
-			break
-		}
-		_ = v_0.Args[1]
-		x := v_0.Args[0]
-		v_0_1 := v_0.Args[1]
-		if v_0_1.Op != OpLOONG64MOVVconst {
-			break
-		}
-		c := auxIntToInt64(v_0_1.AuxInt)
-		if !(isPowerOfTwo64(c)) {
-			break
-		}
-		v.reset(OpLOONG64SRLVconst)
-		v.AuxInt = int64ToAuxInt(log64(c))
-		v.AddArg(x)
-		return true
-	}
-	// match: (Select1 (MULVU (MOVVconst [c]) (MOVVconst [d])))
-	// result: (MOVVconst [c*d])
-	for {
-		if v_0.Op != OpLOONG64MULVU {
-			break
-		}
-		_ = v_0.Args[1]
-		v_0_0 := v_0.Args[0]
-		v_0_1 := v_0.Args[1]
-		for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
-			if v_0_0.Op != OpLOONG64MOVVconst {
-				continue
-			}
-			c := auxIntToInt64(v_0_0.AuxInt)
-			if v_0_1.Op != OpLOONG64MOVVconst {
-				continue
-			}
-			d := auxIntToInt64(v_0_1.AuxInt)
-			v.reset(OpLOONG64MOVVconst)
-			v.AuxInt = int64ToAuxInt(c * d)
-			return true
-		}
-		break
-	}
-	// match: (Select1 (DIVV (MOVVconst [c]) (MOVVconst [d])))
-	// cond: d != 0
-	// result: (MOVVconst [c/d])
-	for {
-		if v_0.Op != OpLOONG64DIVV {
-			break
-		}
-		_ = v_0.Args[1]
-		v_0_0 := v_0.Args[0]
-		if v_0_0.Op != OpLOONG64MOVVconst {
-			break
-		}
-		c := auxIntToInt64(v_0_0.AuxInt)
-		v_0_1 := v_0.Args[1]
-		if v_0_1.Op != OpLOONG64MOVVconst {
-			break
-		}
-		d := auxIntToInt64(v_0_1.AuxInt)
-		if !(d != 0) {
-			break
-		}
-		v.reset(OpLOONG64MOVVconst)
-		v.AuxInt = int64ToAuxInt(c / d)
-		return true
-	}
-	// match: (Select1 (DIVVU (MOVVconst [c]) (MOVVconst [d])))
-	// cond: d != 0
-	// result: (MOVVconst [int64(uint64(c)/uint64(d))])
-	for {
-		if v_0.Op != OpLOONG64DIVVU {
-			break
-		}
-		_ = v_0.Args[1]
-		v_0_0 := v_0.Args[0]
-		if v_0_0.Op != OpLOONG64MOVVconst {
-			break
-		}
-		c := auxIntToInt64(v_0_0.AuxInt)
-		v_0_1 := v_0.Args[1]
-		if v_0_1.Op != OpLOONG64MOVVconst {
-			break
-		}
-		d := auxIntToInt64(v_0_1.AuxInt)
-		if !(d != 0) {
-			break
-		}
-		v.reset(OpLOONG64MOVVconst)
-		v.AuxInt = int64ToAuxInt(int64(uint64(c) / uint64(d)))
-		return true
-	}
 	return false
 }
 func rewriteValueLOONG64_OpSlicemask(v *Value) bool {
@@ -7339,14 +7145,14 @@
 		return true
 	}
 	// match: (Store {t} ptr val mem)
-	// cond: t.Size() == 4 && !is32BitFloat(val.Type)
+	// cond: t.Size() == 4 && !t.IsFloat()
 	// result: (MOVWstore ptr val mem)
 	for {
 		t := auxToType(v.Aux)
 		ptr := v_0
 		val := v_1
 		mem := v_2
-		if !(t.Size() == 4 && !is32BitFloat(val.Type)) {
+		if !(t.Size() == 4 && !t.IsFloat()) {
 			break
 		}
 		v.reset(OpLOONG64MOVWstore)
@@ -7354,14 +7160,14 @@
 		return true
 	}
 	// match: (Store {t} ptr val mem)
-	// cond: t.Size() == 8 && !is64BitFloat(val.Type)
+	// cond: t.Size() == 8 && !t.IsFloat()
 	// result: (MOVVstore ptr val mem)
 	for {
 		t := auxToType(v.Aux)
 		ptr := v_0
 		val := v_1
 		mem := v_2
-		if !(t.Size() == 8 && !is64BitFloat(val.Type)) {
+		if !(t.Size() == 8 && !t.IsFloat()) {
 			break
 		}
 		v.reset(OpLOONG64MOVVstore)
@@ -7369,14 +7175,14 @@
 		return true
 	}
 	// match: (Store {t} ptr val mem)
-	// cond: t.Size() == 4 && is32BitFloat(val.Type)
+	// cond: t.Size() == 4 && t.IsFloat()
 	// result: (MOVFstore ptr val mem)
 	for {
 		t := auxToType(v.Aux)
 		ptr := v_0
 		val := v_1
 		mem := v_2
-		if !(t.Size() == 4 && is32BitFloat(val.Type)) {
+		if !(t.Size() == 4 && t.IsFloat()) {
 			break
 		}
 		v.reset(OpLOONG64MOVFstore)
@@ -7384,14 +7190,14 @@
 		return true
 	}
 	// match: (Store {t} ptr val mem)
-	// cond: t.Size() == 8 && is64BitFloat(val.Type)
+	// cond: t.Size() == 8 && t.IsFloat()
 	// result: (MOVDstore ptr val mem)
 	for {
 		t := auxToType(v.Aux)
 		ptr := v_0
 		val := v_1
 		mem := v_2
-		if !(t.Size() == 8 && is64BitFloat(val.Type)) {
+		if !(t.Size() == 8 && t.IsFloat()) {
 			break
 		}
 		v.reset(OpLOONG64MOVDstore)
diff --git a/src/cmd/compile/internal/ssa/rewriteMIPS.go b/src/cmd/compile/internal/ssa/rewriteMIPS.go
index 1c8d90a..6a259f5 100644
--- a/src/cmd/compile/internal/ssa/rewriteMIPS.go
+++ b/src/cmd/compile/internal/ssa/rewriteMIPS.go
@@ -1,5 +1,4 @@
-// Code generated from _gen/MIPS.rules; DO NOT EDIT.
-// generated with: cd _gen; go run .
+// Code generated from _gen/MIPS.rules using 'go generate'; DO NOT EDIT.
 
 package ssa
 
@@ -7,6 +6,9 @@
 
 func rewriteValueMIPS(v *Value) bool {
 	switch v.Op {
+	case OpAbs:
+		v.Op = OpMIPSABSD
+		return true
 	case OpAdd16:
 		v.Op = OpMIPSADD
 		return true
@@ -1554,13 +1556,13 @@
 		return true
 	}
 	// match: (Load <t> ptr mem)
-	// cond: (is8BitInt(t) && isSigned(t))
+	// cond: (is8BitInt(t) && t.IsSigned())
 	// result: (MOVBload ptr mem)
 	for {
 		t := v.Type
 		ptr := v_0
 		mem := v_1
-		if !(is8BitInt(t) && isSigned(t)) {
+		if !(is8BitInt(t) && t.IsSigned()) {
 			break
 		}
 		v.reset(OpMIPSMOVBload)
@@ -1568,13 +1570,13 @@
 		return true
 	}
 	// match: (Load <t> ptr mem)
-	// cond: (is8BitInt(t) && !isSigned(t))
+	// cond: (is8BitInt(t) && !t.IsSigned())
 	// result: (MOVBUload ptr mem)
 	for {
 		t := v.Type
 		ptr := v_0
 		mem := v_1
-		if !(is8BitInt(t) && !isSigned(t)) {
+		if !(is8BitInt(t) && !t.IsSigned()) {
 			break
 		}
 		v.reset(OpMIPSMOVBUload)
@@ -1582,13 +1584,13 @@
 		return true
 	}
 	// match: (Load <t> ptr mem)
-	// cond: (is16BitInt(t) && isSigned(t))
+	// cond: (is16BitInt(t) && t.IsSigned())
 	// result: (MOVHload ptr mem)
 	for {
 		t := v.Type
 		ptr := v_0
 		mem := v_1
-		if !(is16BitInt(t) && isSigned(t)) {
+		if !(is16BitInt(t) && t.IsSigned()) {
 			break
 		}
 		v.reset(OpMIPSMOVHload)
@@ -1596,13 +1598,13 @@
 		return true
 	}
 	// match: (Load <t> ptr mem)
-	// cond: (is16BitInt(t) && !isSigned(t))
+	// cond: (is16BitInt(t) && !t.IsSigned())
 	// result: (MOVHUload ptr mem)
 	for {
 		t := v.Type
 		ptr := v_0
 		mem := v_1
-		if !(is16BitInt(t) && !isSigned(t)) {
+		if !(is16BitInt(t) && !t.IsSigned()) {
 			break
 		}
 		v.reset(OpMIPSMOVHUload)
@@ -1654,17 +1656,44 @@
 	return false
 }
 func rewriteValueMIPS_OpLocalAddr(v *Value) bool {
+	v_1 := v.Args[1]
 	v_0 := v.Args[0]
-	// match: (LocalAddr {sym} base _)
-	// result: (MOVWaddr {sym} base)
+	b := v.Block
+	typ := &b.Func.Config.Types
+	// match: (LocalAddr <t> {sym} base mem)
+	// cond: t.Elem().HasPointers()
+	// result: (MOVWaddr {sym} (SPanchored base mem))
 	for {
+		t := v.Type
 		sym := auxToSym(v.Aux)
 		base := v_0
+		mem := v_1
+		if !(t.Elem().HasPointers()) {
+			break
+		}
+		v.reset(OpMIPSMOVWaddr)
+		v.Aux = symToAux(sym)
+		v0 := b.NewValue0(v.Pos, OpSPanchored, typ.Uintptr)
+		v0.AddArg2(base, mem)
+		v.AddArg(v0)
+		return true
+	}
+	// match: (LocalAddr <t> {sym} base _)
+	// cond: !t.Elem().HasPointers()
+	// result: (MOVWaddr {sym} base)
+	for {
+		t := v.Type
+		sym := auxToSym(v.Aux)
+		base := v_0
+		if !(!t.Elem().HasPointers()) {
+			break
+		}
 		v.reset(OpMIPSMOVWaddr)
 		v.Aux = symToAux(sym)
 		v.AddArg(base)
 		return true
 	}
+	return false
 }
 func rewriteValueMIPS_OpLsh16x16(v *Value) bool {
 	v_1 := v.Args[1]
@@ -1999,7 +2028,8 @@
 func rewriteValueMIPS_OpMIPSADD(v *Value) bool {
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
-	// match: (ADD x (MOVWconst [c]))
+	// match: (ADD x (MOVWconst <t> [c]))
+	// cond: !t.IsPtr()
 	// result: (ADDconst [c] x)
 	for {
 		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
@@ -2007,7 +2037,11 @@
 			if v_1.Op != OpMIPSMOVWconst {
 				continue
 			}
+			t := v_1.Type
 			c := auxIntToInt32(v_1.AuxInt)
+			if !(!t.IsPtr()) {
+				continue
+			}
 			v.reset(OpMIPSADDconst)
 			v.AuxInt = int32ToAuxInt(c)
 			v.AddArg(x)
@@ -2940,6 +2974,23 @@
 func rewriteValueMIPS_OpMIPSMOVFload(v *Value) bool {
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
+	// match: (MOVFload [off] {sym} ptr (MOVWstore [off] {sym} ptr val _))
+	// result: (MOVWgpfp val)
+	for {
+		off := auxIntToInt32(v.AuxInt)
+		sym := auxToSym(v.Aux)
+		ptr := v_0
+		if v_1.Op != OpMIPSMOVWstore || auxIntToInt32(v_1.AuxInt) != off || auxToSym(v_1.Aux) != sym {
+			break
+		}
+		val := v_1.Args[1]
+		if ptr != v_1.Args[0] {
+			break
+		}
+		v.reset(OpMIPSMOVWgpfp)
+		v.AddArg(val)
+		return true
+	}
 	// match: (MOVFload [off1] {sym} x:(ADDconst [off2] ptr) mem)
 	// cond: (is16Bit(int64(off1+off2)) || x.Uses == 1)
 	// result: (MOVFload [off1+off2] {sym} ptr mem)
@@ -3010,6 +3061,23 @@
 	v_2 := v.Args[2]
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
+	// match: (MOVFstore [off] {sym} ptr (MOVWgpfp val) mem)
+	// result: (MOVWstore [off] {sym} ptr val mem)
+	for {
+		off := auxIntToInt32(v.AuxInt)
+		sym := auxToSym(v.Aux)
+		ptr := v_0
+		if v_1.Op != OpMIPSMOVWgpfp {
+			break
+		}
+		val := v_1.Args[0]
+		mem := v_2
+		v.reset(OpMIPSMOVWstore)
+		v.AuxInt = int32ToAuxInt(off)
+		v.Aux = symToAux(sym)
+		v.AddArg3(ptr, val, mem)
+		return true
+	}
 	// match: (MOVFstore [off1] {sym} x:(ADDconst [off2] ptr) val mem)
 	// cond: (is16Bit(int64(off1+off2)) || x.Uses == 1)
 	// result: (MOVFstore [off1+off2] {sym} ptr val mem)
@@ -3589,6 +3657,23 @@
 func rewriteValueMIPS_OpMIPSMOVWload(v *Value) bool {
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
+	// match: (MOVWload [off] {sym} ptr (MOVFstore [off] {sym} ptr val _))
+	// result: (MOVWfpgp val)
+	for {
+		off := auxIntToInt32(v.AuxInt)
+		sym := auxToSym(v.Aux)
+		ptr := v_0
+		if v_1.Op != OpMIPSMOVFstore || auxIntToInt32(v_1.AuxInt) != off || auxToSym(v_1.Aux) != sym {
+			break
+		}
+		val := v_1.Args[1]
+		if ptr != v_1.Args[0] {
+			break
+		}
+		v.reset(OpMIPSMOVWfpgp)
+		v.AddArg(val)
+		return true
+	}
 	// match: (MOVWload [off1] {sym} x:(ADDconst [off2] ptr) mem)
 	// cond: (is16Bit(int64(off1+off2)) || x.Uses == 1)
 	// result: (MOVWload [off1+off2] {sym} ptr mem)
@@ -3701,6 +3786,23 @@
 	v_2 := v.Args[2]
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
+	// match: (MOVWstore [off] {sym} ptr (MOVWfpgp val) mem)
+	// result: (MOVFstore [off] {sym} ptr val mem)
+	for {
+		off := auxIntToInt32(v.AuxInt)
+		sym := auxToSym(v.Aux)
+		ptr := v_0
+		if v_1.Op != OpMIPSMOVWfpgp {
+			break
+		}
+		val := v_1.Args[0]
+		mem := v_2
+		v.reset(OpMIPSMOVFstore)
+		v.AuxInt = int32ToAuxInt(off)
+		v.Aux = symToAux(sym)
+		v.AddArg3(ptr, val, mem)
+		return true
+	}
 	// match: (MOVWstore [off1] {sym} x:(ADDconst [off2] ptr) val mem)
 	// cond: (is16Bit(int64(off1+off2)) || x.Uses == 1)
 	// result: (MOVWstore [off1+off2] {sym} ptr val mem)
@@ -6754,14 +6856,14 @@
 		return true
 	}
 	// match: (Store {t} ptr val mem)
-	// cond: t.Size() == 4 && !is32BitFloat(val.Type)
+	// cond: t.Size() == 4 && !t.IsFloat()
 	// result: (MOVWstore ptr val mem)
 	for {
 		t := auxToType(v.Aux)
 		ptr := v_0
 		val := v_1
 		mem := v_2
-		if !(t.Size() == 4 && !is32BitFloat(val.Type)) {
+		if !(t.Size() == 4 && !t.IsFloat()) {
 			break
 		}
 		v.reset(OpMIPSMOVWstore)
@@ -6769,14 +6871,14 @@
 		return true
 	}
 	// match: (Store {t} ptr val mem)
-	// cond: t.Size() == 4 && is32BitFloat(val.Type)
+	// cond: t.Size() == 4 && t.IsFloat()
 	// result: (MOVFstore ptr val mem)
 	for {
 		t := auxToType(v.Aux)
 		ptr := v_0
 		val := v_1
 		mem := v_2
-		if !(t.Size() == 4 && is32BitFloat(val.Type)) {
+		if !(t.Size() == 4 && t.IsFloat()) {
 			break
 		}
 		v.reset(OpMIPSMOVFstore)
@@ -6784,14 +6886,14 @@
 		return true
 	}
 	// match: (Store {t} ptr val mem)
-	// cond: t.Size() == 8 && is64BitFloat(val.Type)
+	// cond: t.Size() == 8 && t.IsFloat()
 	// result: (MOVDstore ptr val mem)
 	for {
 		t := auxToType(v.Aux)
 		ptr := v_0
 		val := v_1
 		mem := v_2
-		if !(t.Size() == 8 && is64BitFloat(val.Type)) {
+		if !(t.Size() == 8 && t.IsFloat()) {
 			break
 		}
 		v.reset(OpMIPSMOVDstore)
diff --git a/src/cmd/compile/internal/ssa/rewriteMIPS64.go b/src/cmd/compile/internal/ssa/rewriteMIPS64.go
index c0d42b5..de316e9 100644
--- a/src/cmd/compile/internal/ssa/rewriteMIPS64.go
+++ b/src/cmd/compile/internal/ssa/rewriteMIPS64.go
@@ -1,5 +1,4 @@
-// Code generated from _gen/MIPS64.rules; DO NOT EDIT.
-// generated with: cd _gen; go run .
+// Code generated from _gen/MIPS64.rules using 'go generate'; DO NOT EDIT.
 
 package ssa
 
@@ -7,6 +6,9 @@
 
 func rewriteValueMIPS64(v *Value) bool {
 	switch v.Op {
+	case OpAbs:
+		v.Op = OpMIPS64ABSD
+		return true
 	case OpAdd16:
 		v.Op = OpMIPS64ADDV
 		return true
@@ -51,6 +53,11 @@
 	case OpAtomicAdd64:
 		v.Op = OpMIPS64LoweredAtomicAdd64
 		return true
+	case OpAtomicAnd32:
+		v.Op = OpMIPS64LoweredAtomicAnd32
+		return true
+	case OpAtomicAnd8:
+		return rewriteValueMIPS64_OpAtomicAnd8(v)
 	case OpAtomicCompareAndSwap32:
 		return rewriteValueMIPS64_OpAtomicCompareAndSwap32(v)
 	case OpAtomicCompareAndSwap64:
@@ -74,6 +81,11 @@
 	case OpAtomicLoadPtr:
 		v.Op = OpMIPS64LoweredAtomicLoad64
 		return true
+	case OpAtomicOr32:
+		v.Op = OpMIPS64LoweredAtomicOr32
+		return true
+	case OpAtomicOr8:
+		return rewriteValueMIPS64_OpAtomicOr8(v)
 	case OpAtomicStore32:
 		v.Op = OpMIPS64LoweredAtomicStore32
 		return true
@@ -696,6 +708,92 @@
 		return true
 	}
 }
+func rewriteValueMIPS64_OpAtomicAnd8(v *Value) bool {
+	v_2 := v.Args[2]
+	v_1 := v.Args[1]
+	v_0 := v.Args[0]
+	b := v.Block
+	config := b.Func.Config
+	typ := &b.Func.Config.Types
+	// match: (AtomicAnd8 ptr val mem)
+	// cond: !config.BigEndian
+	// result: (LoweredAtomicAnd32 (AND <typ.UInt32Ptr> (MOVVconst [^3]) ptr) (OR <typ.UInt64> (SLLV <typ.UInt32> (ZeroExt8to32 val) (SLLVconst <typ.UInt64> [3] (ANDconst <typ.UInt64> [3] ptr))) (NORconst [0] <typ.UInt64> (SLLV <typ.UInt64> (MOVVconst [0xff]) (SLLVconst <typ.UInt64> [3] (ANDconst <typ.UInt64> [3] ptr))))) mem)
+	for {
+		ptr := v_0
+		val := v_1
+		mem := v_2
+		if !(!config.BigEndian) {
+			break
+		}
+		v.reset(OpMIPS64LoweredAtomicAnd32)
+		v0 := b.NewValue0(v.Pos, OpMIPS64AND, typ.UInt32Ptr)
+		v1 := b.NewValue0(v.Pos, OpMIPS64MOVVconst, typ.UInt64)
+		v1.AuxInt = int64ToAuxInt(^3)
+		v0.AddArg2(v1, ptr)
+		v2 := b.NewValue0(v.Pos, OpMIPS64OR, typ.UInt64)
+		v3 := b.NewValue0(v.Pos, OpMIPS64SLLV, typ.UInt32)
+		v4 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
+		v4.AddArg(val)
+		v5 := b.NewValue0(v.Pos, OpMIPS64SLLVconst, typ.UInt64)
+		v5.AuxInt = int64ToAuxInt(3)
+		v6 := b.NewValue0(v.Pos, OpMIPS64ANDconst, typ.UInt64)
+		v6.AuxInt = int64ToAuxInt(3)
+		v6.AddArg(ptr)
+		v5.AddArg(v6)
+		v3.AddArg2(v4, v5)
+		v7 := b.NewValue0(v.Pos, OpMIPS64NORconst, typ.UInt64)
+		v7.AuxInt = int64ToAuxInt(0)
+		v8 := b.NewValue0(v.Pos, OpMIPS64SLLV, typ.UInt64)
+		v9 := b.NewValue0(v.Pos, OpMIPS64MOVVconst, typ.UInt64)
+		v9.AuxInt = int64ToAuxInt(0xff)
+		v8.AddArg2(v9, v5)
+		v7.AddArg(v8)
+		v2.AddArg2(v3, v7)
+		v.AddArg3(v0, v2, mem)
+		return true
+	}
+	// match: (AtomicAnd8 ptr val mem)
+	// cond: config.BigEndian
+	// result: (LoweredAtomicAnd32 (AND <typ.UInt32Ptr> (MOVVconst [^3]) ptr) (OR <typ.UInt64> (SLLV <typ.UInt32> (ZeroExt8to32 val) (SLLVconst <typ.UInt64> [3] (ANDconst <typ.UInt64> [3] (XORconst <typ.UInt64> [3] ptr)))) (NORconst [0] <typ.UInt64> (SLLV <typ.UInt64> (MOVVconst [0xff]) (SLLVconst <typ.UInt64> [3] (ANDconst <typ.UInt64> [3] (XORconst <typ.UInt64> [3] ptr)))))) mem)
+	for {
+		ptr := v_0
+		val := v_1
+		mem := v_2
+		if !(config.BigEndian) {
+			break
+		}
+		v.reset(OpMIPS64LoweredAtomicAnd32)
+		v0 := b.NewValue0(v.Pos, OpMIPS64AND, typ.UInt32Ptr)
+		v1 := b.NewValue0(v.Pos, OpMIPS64MOVVconst, typ.UInt64)
+		v1.AuxInt = int64ToAuxInt(^3)
+		v0.AddArg2(v1, ptr)
+		v2 := b.NewValue0(v.Pos, OpMIPS64OR, typ.UInt64)
+		v3 := b.NewValue0(v.Pos, OpMIPS64SLLV, typ.UInt32)
+		v4 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
+		v4.AddArg(val)
+		v5 := b.NewValue0(v.Pos, OpMIPS64SLLVconst, typ.UInt64)
+		v5.AuxInt = int64ToAuxInt(3)
+		v6 := b.NewValue0(v.Pos, OpMIPS64ANDconst, typ.UInt64)
+		v6.AuxInt = int64ToAuxInt(3)
+		v7 := b.NewValue0(v.Pos, OpMIPS64XORconst, typ.UInt64)
+		v7.AuxInt = int64ToAuxInt(3)
+		v7.AddArg(ptr)
+		v6.AddArg(v7)
+		v5.AddArg(v6)
+		v3.AddArg2(v4, v5)
+		v8 := b.NewValue0(v.Pos, OpMIPS64NORconst, typ.UInt64)
+		v8.AuxInt = int64ToAuxInt(0)
+		v9 := b.NewValue0(v.Pos, OpMIPS64SLLV, typ.UInt64)
+		v10 := b.NewValue0(v.Pos, OpMIPS64MOVVconst, typ.UInt64)
+		v10.AuxInt = int64ToAuxInt(0xff)
+		v9.AddArg2(v10, v5)
+		v8.AddArg(v9)
+		v2.AddArg2(v3, v8)
+		v.AddArg3(v0, v2, mem)
+		return true
+	}
+	return false
+}
 func rewriteValueMIPS64_OpAtomicCompareAndSwap32(v *Value) bool {
 	v_3 := v.Args[3]
 	v_2 := v.Args[2]
@@ -717,6 +815,74 @@
 		return true
 	}
 }
+func rewriteValueMIPS64_OpAtomicOr8(v *Value) bool {
+	v_2 := v.Args[2]
+	v_1 := v.Args[1]
+	v_0 := v.Args[0]
+	b := v.Block
+	config := b.Func.Config
+	typ := &b.Func.Config.Types
+	// match: (AtomicOr8 ptr val mem)
+	// cond: !config.BigEndian
+	// result: (LoweredAtomicOr32 (AND <typ.UInt32Ptr> (MOVVconst [^3]) ptr) (SLLV <typ.UInt32> (ZeroExt8to32 val) (SLLVconst <typ.UInt64> [3] (ANDconst <typ.UInt64> [3] ptr))) mem)
+	for {
+		ptr := v_0
+		val := v_1
+		mem := v_2
+		if !(!config.BigEndian) {
+			break
+		}
+		v.reset(OpMIPS64LoweredAtomicOr32)
+		v0 := b.NewValue0(v.Pos, OpMIPS64AND, typ.UInt32Ptr)
+		v1 := b.NewValue0(v.Pos, OpMIPS64MOVVconst, typ.UInt64)
+		v1.AuxInt = int64ToAuxInt(^3)
+		v0.AddArg2(v1, ptr)
+		v2 := b.NewValue0(v.Pos, OpMIPS64SLLV, typ.UInt32)
+		v3 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
+		v3.AddArg(val)
+		v4 := b.NewValue0(v.Pos, OpMIPS64SLLVconst, typ.UInt64)
+		v4.AuxInt = int64ToAuxInt(3)
+		v5 := b.NewValue0(v.Pos, OpMIPS64ANDconst, typ.UInt64)
+		v5.AuxInt = int64ToAuxInt(3)
+		v5.AddArg(ptr)
+		v4.AddArg(v5)
+		v2.AddArg2(v3, v4)
+		v.AddArg3(v0, v2, mem)
+		return true
+	}
+	// match: (AtomicOr8 ptr val mem)
+	// cond: config.BigEndian
+	// result: (LoweredAtomicOr32 (AND <typ.UInt32Ptr> (MOVVconst [^3]) ptr) (SLLV <typ.UInt32> (ZeroExt8to32 val) (SLLVconst <typ.UInt64> [3] (ANDconst <typ.UInt64> [3] (XORconst <typ.UInt64> [3] ptr)))) mem)
+	for {
+		ptr := v_0
+		val := v_1
+		mem := v_2
+		if !(config.BigEndian) {
+			break
+		}
+		v.reset(OpMIPS64LoweredAtomicOr32)
+		v0 := b.NewValue0(v.Pos, OpMIPS64AND, typ.UInt32Ptr)
+		v1 := b.NewValue0(v.Pos, OpMIPS64MOVVconst, typ.UInt64)
+		v1.AuxInt = int64ToAuxInt(^3)
+		v0.AddArg2(v1, ptr)
+		v2 := b.NewValue0(v.Pos, OpMIPS64SLLV, typ.UInt32)
+		v3 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
+		v3.AddArg(val)
+		v4 := b.NewValue0(v.Pos, OpMIPS64SLLVconst, typ.UInt64)
+		v4.AuxInt = int64ToAuxInt(3)
+		v5 := b.NewValue0(v.Pos, OpMIPS64ANDconst, typ.UInt64)
+		v5.AuxInt = int64ToAuxInt(3)
+		v6 := b.NewValue0(v.Pos, OpMIPS64XORconst, typ.UInt64)
+		v6.AuxInt = int64ToAuxInt(3)
+		v6.AddArg(ptr)
+		v5.AddArg(v6)
+		v4.AddArg(v5)
+		v2.AddArg2(v3, v4)
+		v.AddArg3(v0, v2, mem)
+		return true
+	}
+	return false
+}
 func rewriteValueMIPS64_OpAvg64u(v *Value) bool {
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
@@ -1721,13 +1887,13 @@
 		return true
 	}
 	// match: (Load <t> ptr mem)
-	// cond: (is8BitInt(t) && isSigned(t))
+	// cond: (is8BitInt(t) && t.IsSigned())
 	// result: (MOVBload ptr mem)
 	for {
 		t := v.Type
 		ptr := v_0
 		mem := v_1
-		if !(is8BitInt(t) && isSigned(t)) {
+		if !(is8BitInt(t) && t.IsSigned()) {
 			break
 		}
 		v.reset(OpMIPS64MOVBload)
@@ -1735,13 +1901,13 @@
 		return true
 	}
 	// match: (Load <t> ptr mem)
-	// cond: (is8BitInt(t) && !isSigned(t))
+	// cond: (is8BitInt(t) && !t.IsSigned())
 	// result: (MOVBUload ptr mem)
 	for {
 		t := v.Type
 		ptr := v_0
 		mem := v_1
-		if !(is8BitInt(t) && !isSigned(t)) {
+		if !(is8BitInt(t) && !t.IsSigned()) {
 			break
 		}
 		v.reset(OpMIPS64MOVBUload)
@@ -1749,13 +1915,13 @@
 		return true
 	}
 	// match: (Load <t> ptr mem)
-	// cond: (is16BitInt(t) && isSigned(t))
+	// cond: (is16BitInt(t) && t.IsSigned())
 	// result: (MOVHload ptr mem)
 	for {
 		t := v.Type
 		ptr := v_0
 		mem := v_1
-		if !(is16BitInt(t) && isSigned(t)) {
+		if !(is16BitInt(t) && t.IsSigned()) {
 			break
 		}
 		v.reset(OpMIPS64MOVHload)
@@ -1763,13 +1929,13 @@
 		return true
 	}
 	// match: (Load <t> ptr mem)
-	// cond: (is16BitInt(t) && !isSigned(t))
+	// cond: (is16BitInt(t) && !t.IsSigned())
 	// result: (MOVHUload ptr mem)
 	for {
 		t := v.Type
 		ptr := v_0
 		mem := v_1
-		if !(is16BitInt(t) && !isSigned(t)) {
+		if !(is16BitInt(t) && !t.IsSigned()) {
 			break
 		}
 		v.reset(OpMIPS64MOVHUload)
@@ -1777,13 +1943,13 @@
 		return true
 	}
 	// match: (Load <t> ptr mem)
-	// cond: (is32BitInt(t) && isSigned(t))
+	// cond: (is32BitInt(t) && t.IsSigned())
 	// result: (MOVWload ptr mem)
 	for {
 		t := v.Type
 		ptr := v_0
 		mem := v_1
-		if !(is32BitInt(t) && isSigned(t)) {
+		if !(is32BitInt(t) && t.IsSigned()) {
 			break
 		}
 		v.reset(OpMIPS64MOVWload)
@@ -1791,13 +1957,13 @@
 		return true
 	}
 	// match: (Load <t> ptr mem)
-	// cond: (is32BitInt(t) && !isSigned(t))
+	// cond: (is32BitInt(t) && !t.IsSigned())
 	// result: (MOVWUload ptr mem)
 	for {
 		t := v.Type
 		ptr := v_0
 		mem := v_1
-		if !(is32BitInt(t) && !isSigned(t)) {
+		if !(is32BitInt(t) && !t.IsSigned()) {
 			break
 		}
 		v.reset(OpMIPS64MOVWUload)
@@ -1849,17 +2015,44 @@
 	return false
 }
 func rewriteValueMIPS64_OpLocalAddr(v *Value) bool {
+	v_1 := v.Args[1]
 	v_0 := v.Args[0]
-	// match: (LocalAddr {sym} base _)
-	// result: (MOVVaddr {sym} base)
+	b := v.Block
+	typ := &b.Func.Config.Types
+	// match: (LocalAddr <t> {sym} base mem)
+	// cond: t.Elem().HasPointers()
+	// result: (MOVVaddr {sym} (SPanchored base mem))
 	for {
+		t := v.Type
 		sym := auxToSym(v.Aux)
 		base := v_0
+		mem := v_1
+		if !(t.Elem().HasPointers()) {
+			break
+		}
+		v.reset(OpMIPS64MOVVaddr)
+		v.Aux = symToAux(sym)
+		v0 := b.NewValue0(v.Pos, OpSPanchored, typ.Uintptr)
+		v0.AddArg2(base, mem)
+		v.AddArg(v0)
+		return true
+	}
+	// match: (LocalAddr <t> {sym} base _)
+	// cond: !t.Elem().HasPointers()
+	// result: (MOVVaddr {sym} base)
+	for {
+		t := v.Type
+		sym := auxToSym(v.Aux)
+		base := v_0
+		if !(!t.Elem().HasPointers()) {
+			break
+		}
 		v.reset(OpMIPS64MOVVaddr)
 		v.Aux = symToAux(sym)
 		v.AddArg(base)
 		return true
 	}
+	return false
 }
 func rewriteValueMIPS64_OpLsh16x16(v *Value) bool {
 	v_1 := v.Args[1]
@@ -2272,8 +2465,8 @@
 func rewriteValueMIPS64_OpMIPS64ADDV(v *Value) bool {
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
-	// match: (ADDV x (MOVVconst [c]))
-	// cond: is32Bit(c)
+	// match: (ADDV x (MOVVconst <t> [c]))
+	// cond: is32Bit(c) && !t.IsPtr()
 	// result: (ADDVconst [c] x)
 	for {
 		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
@@ -2281,8 +2474,9 @@
 			if v_1.Op != OpMIPS64MOVVconst {
 				continue
 			}
+			t := v_1.Type
 			c := auxIntToInt64(v_1.AuxInt)
-			if !(is32Bit(c)) {
+			if !(is32Bit(c) && !t.IsPtr()) {
 				continue
 			}
 			v.reset(OpMIPS64ADDVconst)
@@ -2563,8 +2757,10 @@
 func rewriteValueMIPS64_OpMIPS64MOVBUload(v *Value) bool {
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
+	b := v.Block
+	config := b.Func.Config
 	// match: (MOVBUload [off1] {sym} (ADDVconst [off2] ptr) mem)
-	// cond: is32Bit(int64(off1)+off2)
+	// cond: is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)
 	// result: (MOVBUload [off1+int32(off2)] {sym} ptr mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -2575,7 +2771,7 @@
 		off2 := auxIntToInt64(v_0.AuxInt)
 		ptr := v_0.Args[0]
 		mem := v_1
-		if !(is32Bit(int64(off1) + off2)) {
+		if !(is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) {
 			break
 		}
 		v.reset(OpMIPS64MOVBUload)
@@ -2585,7 +2781,7 @@
 		return true
 	}
 	// match: (MOVBUload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem)
-	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)
 	// result: (MOVBUload [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -2597,7 +2793,7 @@
 		sym2 := auxToSym(v_0.Aux)
 		ptr := v_0.Args[0]
 		mem := v_1
-		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) {
+		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) {
 			break
 		}
 		v.reset(OpMIPS64MOVBUload)
@@ -2648,8 +2844,10 @@
 func rewriteValueMIPS64_OpMIPS64MOVBload(v *Value) bool {
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
+	b := v.Block
+	config := b.Func.Config
 	// match: (MOVBload [off1] {sym} (ADDVconst [off2] ptr) mem)
-	// cond: is32Bit(int64(off1)+off2)
+	// cond: is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)
 	// result: (MOVBload [off1+int32(off2)] {sym} ptr mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -2660,7 +2858,7 @@
 		off2 := auxIntToInt64(v_0.AuxInt)
 		ptr := v_0.Args[0]
 		mem := v_1
-		if !(is32Bit(int64(off1) + off2)) {
+		if !(is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) {
 			break
 		}
 		v.reset(OpMIPS64MOVBload)
@@ -2670,7 +2868,7 @@
 		return true
 	}
 	// match: (MOVBload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem)
-	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)
 	// result: (MOVBload [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -2682,7 +2880,7 @@
 		sym2 := auxToSym(v_0.Aux)
 		ptr := v_0.Args[0]
 		mem := v_1
-		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) {
+		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) {
 			break
 		}
 		v.reset(OpMIPS64MOVBload)
@@ -2747,8 +2945,10 @@
 	v_2 := v.Args[2]
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
+	b := v.Block
+	config := b.Func.Config
 	// match: (MOVBstore [off1] {sym} (ADDVconst [off2] ptr) val mem)
-	// cond: is32Bit(int64(off1)+off2)
+	// cond: is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)
 	// result: (MOVBstore [off1+int32(off2)] {sym} ptr val mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -2760,7 +2960,7 @@
 		ptr := v_0.Args[0]
 		val := v_1
 		mem := v_2
-		if !(is32Bit(int64(off1) + off2)) {
+		if !(is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) {
 			break
 		}
 		v.reset(OpMIPS64MOVBstore)
@@ -2770,7 +2970,7 @@
 		return true
 	}
 	// match: (MOVBstore [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) val mem)
-	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)
 	// result: (MOVBstore [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr val mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -2783,7 +2983,7 @@
 		ptr := v_0.Args[0]
 		val := v_1
 		mem := v_2
-		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) {
+		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) {
 			break
 		}
 		v.reset(OpMIPS64MOVBstore)
@@ -2915,8 +3115,10 @@
 func rewriteValueMIPS64_OpMIPS64MOVBstorezero(v *Value) bool {
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
+	b := v.Block
+	config := b.Func.Config
 	// match: (MOVBstorezero [off1] {sym} (ADDVconst [off2] ptr) mem)
-	// cond: is32Bit(int64(off1)+off2)
+	// cond: is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)
 	// result: (MOVBstorezero [off1+int32(off2)] {sym} ptr mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -2927,7 +3129,7 @@
 		off2 := auxIntToInt64(v_0.AuxInt)
 		ptr := v_0.Args[0]
 		mem := v_1
-		if !(is32Bit(int64(off1) + off2)) {
+		if !(is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) {
 			break
 		}
 		v.reset(OpMIPS64MOVBstorezero)
@@ -2937,7 +3139,7 @@
 		return true
 	}
 	// match: (MOVBstorezero [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem)
-	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)
 	// result: (MOVBstorezero [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -2949,7 +3151,7 @@
 		sym2 := auxToSym(v_0.Aux)
 		ptr := v_0.Args[0]
 		mem := v_1
-		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) {
+		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) {
 			break
 		}
 		v.reset(OpMIPS64MOVBstorezero)
@@ -2963,8 +3165,27 @@
 func rewriteValueMIPS64_OpMIPS64MOVDload(v *Value) bool {
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
+	b := v.Block
+	config := b.Func.Config
+	// match: (MOVDload [off] {sym} ptr (MOVVstore [off] {sym} ptr val _))
+	// result: (MOVVgpfp val)
+	for {
+		off := auxIntToInt32(v.AuxInt)
+		sym := auxToSym(v.Aux)
+		ptr := v_0
+		if v_1.Op != OpMIPS64MOVVstore || auxIntToInt32(v_1.AuxInt) != off || auxToSym(v_1.Aux) != sym {
+			break
+		}
+		val := v_1.Args[1]
+		if ptr != v_1.Args[0] {
+			break
+		}
+		v.reset(OpMIPS64MOVVgpfp)
+		v.AddArg(val)
+		return true
+	}
 	// match: (MOVDload [off1] {sym} (ADDVconst [off2] ptr) mem)
-	// cond: is32Bit(int64(off1)+off2)
+	// cond: is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)
 	// result: (MOVDload [off1+int32(off2)] {sym} ptr mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -2975,7 +3196,7 @@
 		off2 := auxIntToInt64(v_0.AuxInt)
 		ptr := v_0.Args[0]
 		mem := v_1
-		if !(is32Bit(int64(off1) + off2)) {
+		if !(is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) {
 			break
 		}
 		v.reset(OpMIPS64MOVDload)
@@ -2985,7 +3206,7 @@
 		return true
 	}
 	// match: (MOVDload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem)
-	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)
 	// result: (MOVDload [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -2997,7 +3218,7 @@
 		sym2 := auxToSym(v_0.Aux)
 		ptr := v_0.Args[0]
 		mem := v_1
-		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) {
+		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) {
 			break
 		}
 		v.reset(OpMIPS64MOVDload)
@@ -3012,8 +3233,27 @@
 	v_2 := v.Args[2]
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
+	b := v.Block
+	config := b.Func.Config
+	// match: (MOVDstore [off] {sym} ptr (MOVVgpfp val) mem)
+	// result: (MOVVstore [off] {sym} ptr val mem)
+	for {
+		off := auxIntToInt32(v.AuxInt)
+		sym := auxToSym(v.Aux)
+		ptr := v_0
+		if v_1.Op != OpMIPS64MOVVgpfp {
+			break
+		}
+		val := v_1.Args[0]
+		mem := v_2
+		v.reset(OpMIPS64MOVVstore)
+		v.AuxInt = int32ToAuxInt(off)
+		v.Aux = symToAux(sym)
+		v.AddArg3(ptr, val, mem)
+		return true
+	}
 	// match: (MOVDstore [off1] {sym} (ADDVconst [off2] ptr) val mem)
-	// cond: is32Bit(int64(off1)+off2)
+	// cond: is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)
 	// result: (MOVDstore [off1+int32(off2)] {sym} ptr val mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -3025,7 +3265,7 @@
 		ptr := v_0.Args[0]
 		val := v_1
 		mem := v_2
-		if !(is32Bit(int64(off1) + off2)) {
+		if !(is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) {
 			break
 		}
 		v.reset(OpMIPS64MOVDstore)
@@ -3035,7 +3275,7 @@
 		return true
 	}
 	// match: (MOVDstore [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) val mem)
-	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)
 	// result: (MOVDstore [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr val mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -3048,7 +3288,7 @@
 		ptr := v_0.Args[0]
 		val := v_1
 		mem := v_2
-		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) {
+		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) {
 			break
 		}
 		v.reset(OpMIPS64MOVDstore)
@@ -3062,8 +3302,27 @@
 func rewriteValueMIPS64_OpMIPS64MOVFload(v *Value) bool {
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
+	b := v.Block
+	config := b.Func.Config
+	// match: (MOVFload [off] {sym} ptr (MOVWstore [off] {sym} ptr val _))
+	// result: (MOVWgpfp val)
+	for {
+		off := auxIntToInt32(v.AuxInt)
+		sym := auxToSym(v.Aux)
+		ptr := v_0
+		if v_1.Op != OpMIPS64MOVWstore || auxIntToInt32(v_1.AuxInt) != off || auxToSym(v_1.Aux) != sym {
+			break
+		}
+		val := v_1.Args[1]
+		if ptr != v_1.Args[0] {
+			break
+		}
+		v.reset(OpMIPS64MOVWgpfp)
+		v.AddArg(val)
+		return true
+	}
 	// match: (MOVFload [off1] {sym} (ADDVconst [off2] ptr) mem)
-	// cond: is32Bit(int64(off1)+off2)
+	// cond: is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)
 	// result: (MOVFload [off1+int32(off2)] {sym} ptr mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -3074,7 +3333,7 @@
 		off2 := auxIntToInt64(v_0.AuxInt)
 		ptr := v_0.Args[0]
 		mem := v_1
-		if !(is32Bit(int64(off1) + off2)) {
+		if !(is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) {
 			break
 		}
 		v.reset(OpMIPS64MOVFload)
@@ -3084,7 +3343,7 @@
 		return true
 	}
 	// match: (MOVFload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem)
-	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)
 	// result: (MOVFload [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -3096,7 +3355,7 @@
 		sym2 := auxToSym(v_0.Aux)
 		ptr := v_0.Args[0]
 		mem := v_1
-		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) {
+		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) {
 			break
 		}
 		v.reset(OpMIPS64MOVFload)
@@ -3111,8 +3370,27 @@
 	v_2 := v.Args[2]
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
+	b := v.Block
+	config := b.Func.Config
+	// match: (MOVFstore [off] {sym} ptr (MOVWgpfp val) mem)
+	// result: (MOVWstore [off] {sym} ptr val mem)
+	for {
+		off := auxIntToInt32(v.AuxInt)
+		sym := auxToSym(v.Aux)
+		ptr := v_0
+		if v_1.Op != OpMIPS64MOVWgpfp {
+			break
+		}
+		val := v_1.Args[0]
+		mem := v_2
+		v.reset(OpMIPS64MOVWstore)
+		v.AuxInt = int32ToAuxInt(off)
+		v.Aux = symToAux(sym)
+		v.AddArg3(ptr, val, mem)
+		return true
+	}
 	// match: (MOVFstore [off1] {sym} (ADDVconst [off2] ptr) val mem)
-	// cond: is32Bit(int64(off1)+off2)
+	// cond: is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)
 	// result: (MOVFstore [off1+int32(off2)] {sym} ptr val mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -3124,7 +3402,7 @@
 		ptr := v_0.Args[0]
 		val := v_1
 		mem := v_2
-		if !(is32Bit(int64(off1) + off2)) {
+		if !(is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) {
 			break
 		}
 		v.reset(OpMIPS64MOVFstore)
@@ -3134,7 +3412,7 @@
 		return true
 	}
 	// match: (MOVFstore [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) val mem)
-	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)
 	// result: (MOVFstore [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr val mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -3147,7 +3425,7 @@
 		ptr := v_0.Args[0]
 		val := v_1
 		mem := v_2
-		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) {
+		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) {
 			break
 		}
 		v.reset(OpMIPS64MOVFstore)
@@ -3161,8 +3439,10 @@
 func rewriteValueMIPS64_OpMIPS64MOVHUload(v *Value) bool {
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
+	b := v.Block
+	config := b.Func.Config
 	// match: (MOVHUload [off1] {sym} (ADDVconst [off2] ptr) mem)
-	// cond: is32Bit(int64(off1)+off2)
+	// cond: is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)
 	// result: (MOVHUload [off1+int32(off2)] {sym} ptr mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -3173,7 +3453,7 @@
 		off2 := auxIntToInt64(v_0.AuxInt)
 		ptr := v_0.Args[0]
 		mem := v_1
-		if !(is32Bit(int64(off1) + off2)) {
+		if !(is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) {
 			break
 		}
 		v.reset(OpMIPS64MOVHUload)
@@ -3183,7 +3463,7 @@
 		return true
 	}
 	// match: (MOVHUload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem)
-	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)
 	// result: (MOVHUload [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -3195,7 +3475,7 @@
 		sym2 := auxToSym(v_0.Aux)
 		ptr := v_0.Args[0]
 		mem := v_1
-		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) {
+		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) {
 			break
 		}
 		v.reset(OpMIPS64MOVHUload)
@@ -3271,7 +3551,7 @@
 	b := v.Block
 	config := b.Func.Config
 	// match: (MOVHload [off1] {sym} (ADDVconst [off2] ptr) mem)
-	// cond: is32Bit(int64(off1)+off2)
+	// cond: is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)
 	// result: (MOVHload [off1+int32(off2)] {sym} ptr mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -3282,7 +3562,7 @@
 		off2 := auxIntToInt64(v_0.AuxInt)
 		ptr := v_0.Args[0]
 		mem := v_1
-		if !(is32Bit(int64(off1) + off2)) {
+		if !(is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) {
 			break
 		}
 		v.reset(OpMIPS64MOVHload)
@@ -3292,7 +3572,7 @@
 		return true
 	}
 	// match: (MOVHload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem)
-	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)
 	// result: (MOVHload [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -3304,7 +3584,7 @@
 		sym2 := auxToSym(v_0.Aux)
 		ptr := v_0.Args[0]
 		mem := v_1
-		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) {
+		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) {
 			break
 		}
 		v.reset(OpMIPS64MOVHload)
@@ -3413,8 +3693,10 @@
 	v_2 := v.Args[2]
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
+	b := v.Block
+	config := b.Func.Config
 	// match: (MOVHstore [off1] {sym} (ADDVconst [off2] ptr) val mem)
-	// cond: is32Bit(int64(off1)+off2)
+	// cond: is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)
 	// result: (MOVHstore [off1+int32(off2)] {sym} ptr val mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -3426,7 +3708,7 @@
 		ptr := v_0.Args[0]
 		val := v_1
 		mem := v_2
-		if !(is32Bit(int64(off1) + off2)) {
+		if !(is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) {
 			break
 		}
 		v.reset(OpMIPS64MOVHstore)
@@ -3436,7 +3718,7 @@
 		return true
 	}
 	// match: (MOVHstore [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) val mem)
-	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)
 	// result: (MOVHstore [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr val mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -3449,7 +3731,7 @@
 		ptr := v_0.Args[0]
 		val := v_1
 		mem := v_2
-		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) {
+		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) {
 			break
 		}
 		v.reset(OpMIPS64MOVHstore)
@@ -3547,8 +3829,10 @@
 func rewriteValueMIPS64_OpMIPS64MOVHstorezero(v *Value) bool {
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
+	b := v.Block
+	config := b.Func.Config
 	// match: (MOVHstorezero [off1] {sym} (ADDVconst [off2] ptr) mem)
-	// cond: is32Bit(int64(off1)+off2)
+	// cond: is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)
 	// result: (MOVHstorezero [off1+int32(off2)] {sym} ptr mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -3559,7 +3843,7 @@
 		off2 := auxIntToInt64(v_0.AuxInt)
 		ptr := v_0.Args[0]
 		mem := v_1
-		if !(is32Bit(int64(off1) + off2)) {
+		if !(is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) {
 			break
 		}
 		v.reset(OpMIPS64MOVHstorezero)
@@ -3569,7 +3853,7 @@
 		return true
 	}
 	// match: (MOVHstorezero [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem)
-	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)
 	// result: (MOVHstorezero [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -3581,7 +3865,7 @@
 		sym2 := auxToSym(v_0.Aux)
 		ptr := v_0.Args[0]
 		mem := v_1
-		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) {
+		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) {
 			break
 		}
 		v.reset(OpMIPS64MOVHstorezero)
@@ -3597,8 +3881,25 @@
 	v_0 := v.Args[0]
 	b := v.Block
 	config := b.Func.Config
+	// match: (MOVVload [off] {sym} ptr (MOVDstore [off] {sym} ptr val _))
+	// result: (MOVVfpgp val)
+	for {
+		off := auxIntToInt32(v.AuxInt)
+		sym := auxToSym(v.Aux)
+		ptr := v_0
+		if v_1.Op != OpMIPS64MOVDstore || auxIntToInt32(v_1.AuxInt) != off || auxToSym(v_1.Aux) != sym {
+			break
+		}
+		val := v_1.Args[1]
+		if ptr != v_1.Args[0] {
+			break
+		}
+		v.reset(OpMIPS64MOVVfpgp)
+		v.AddArg(val)
+		return true
+	}
 	// match: (MOVVload [off1] {sym} (ADDVconst [off2] ptr) mem)
-	// cond: is32Bit(int64(off1)+off2)
+	// cond: is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)
 	// result: (MOVVload [off1+int32(off2)] {sym} ptr mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -3609,7 +3910,7 @@
 		off2 := auxIntToInt64(v_0.AuxInt)
 		ptr := v_0.Args[0]
 		mem := v_1
-		if !(is32Bit(int64(off1) + off2)) {
+		if !(is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) {
 			break
 		}
 		v.reset(OpMIPS64MOVVload)
@@ -3619,7 +3920,7 @@
 		return true
 	}
 	// match: (MOVVload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem)
-	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)
 	// result: (MOVVload [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -3631,7 +3932,7 @@
 		sym2 := auxToSym(v_0.Aux)
 		ptr := v_0.Args[0]
 		mem := v_1
-		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) {
+		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) {
 			break
 		}
 		v.reset(OpMIPS64MOVVload)
@@ -3701,8 +4002,27 @@
 	v_2 := v.Args[2]
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
+	b := v.Block
+	config := b.Func.Config
+	// match: (MOVVstore [off] {sym} ptr (MOVVfpgp val) mem)
+	// result: (MOVDstore [off] {sym} ptr val mem)
+	for {
+		off := auxIntToInt32(v.AuxInt)
+		sym := auxToSym(v.Aux)
+		ptr := v_0
+		if v_1.Op != OpMIPS64MOVVfpgp {
+			break
+		}
+		val := v_1.Args[0]
+		mem := v_2
+		v.reset(OpMIPS64MOVDstore)
+		v.AuxInt = int32ToAuxInt(off)
+		v.Aux = symToAux(sym)
+		v.AddArg3(ptr, val, mem)
+		return true
+	}
 	// match: (MOVVstore [off1] {sym} (ADDVconst [off2] ptr) val mem)
-	// cond: is32Bit(int64(off1)+off2)
+	// cond: is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)
 	// result: (MOVVstore [off1+int32(off2)] {sym} ptr val mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -3714,7 +4034,7 @@
 		ptr := v_0.Args[0]
 		val := v_1
 		mem := v_2
-		if !(is32Bit(int64(off1) + off2)) {
+		if !(is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) {
 			break
 		}
 		v.reset(OpMIPS64MOVVstore)
@@ -3724,7 +4044,7 @@
 		return true
 	}
 	// match: (MOVVstore [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) val mem)
-	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)
 	// result: (MOVVstore [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr val mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -3737,7 +4057,7 @@
 		ptr := v_0.Args[0]
 		val := v_1
 		mem := v_2
-		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) {
+		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) {
 			break
 		}
 		v.reset(OpMIPS64MOVVstore)
@@ -3767,8 +4087,10 @@
 func rewriteValueMIPS64_OpMIPS64MOVVstorezero(v *Value) bool {
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
+	b := v.Block
+	config := b.Func.Config
 	// match: (MOVVstorezero [off1] {sym} (ADDVconst [off2] ptr) mem)
-	// cond: is32Bit(int64(off1)+off2)
+	// cond: is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)
 	// result: (MOVVstorezero [off1+int32(off2)] {sym} ptr mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -3779,7 +4101,7 @@
 		off2 := auxIntToInt64(v_0.AuxInt)
 		ptr := v_0.Args[0]
 		mem := v_1
-		if !(is32Bit(int64(off1) + off2)) {
+		if !(is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) {
 			break
 		}
 		v.reset(OpMIPS64MOVVstorezero)
@@ -3789,7 +4111,7 @@
 		return true
 	}
 	// match: (MOVVstorezero [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem)
-	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)
 	// result: (MOVVstorezero [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -3801,7 +4123,7 @@
 		sym2 := auxToSym(v_0.Aux)
 		ptr := v_0.Args[0]
 		mem := v_1
-		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) {
+		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) {
 			break
 		}
 		v.reset(OpMIPS64MOVVstorezero)
@@ -3815,8 +4137,30 @@
 func rewriteValueMIPS64_OpMIPS64MOVWUload(v *Value) bool {
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
+	b := v.Block
+	config := b.Func.Config
+	typ := &b.Func.Config.Types
+	// match: (MOVWUload [off] {sym} ptr (MOVFstore [off] {sym} ptr val _))
+	// result: (ZeroExt32to64 (MOVWfpgp <typ.Float32> val))
+	for {
+		off := auxIntToInt32(v.AuxInt)
+		sym := auxToSym(v.Aux)
+		ptr := v_0
+		if v_1.Op != OpMIPS64MOVFstore || auxIntToInt32(v_1.AuxInt) != off || auxToSym(v_1.Aux) != sym {
+			break
+		}
+		val := v_1.Args[1]
+		if ptr != v_1.Args[0] {
+			break
+		}
+		v.reset(OpZeroExt32to64)
+		v0 := b.NewValue0(v_1.Pos, OpMIPS64MOVWfpgp, typ.Float32)
+		v0.AddArg(val)
+		v.AddArg(v0)
+		return true
+	}
 	// match: (MOVWUload [off1] {sym} (ADDVconst [off2] ptr) mem)
-	// cond: is32Bit(int64(off1)+off2)
+	// cond: is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)
 	// result: (MOVWUload [off1+int32(off2)] {sym} ptr mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -3827,7 +4171,7 @@
 		off2 := auxIntToInt64(v_0.AuxInt)
 		ptr := v_0.Args[0]
 		mem := v_1
-		if !(is32Bit(int64(off1) + off2)) {
+		if !(is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) {
 			break
 		}
 		v.reset(OpMIPS64MOVWUload)
@@ -3837,7 +4181,7 @@
 		return true
 	}
 	// match: (MOVWUload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem)
-	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)
 	// result: (MOVWUload [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -3849,7 +4193,7 @@
 		sym2 := auxToSym(v_0.Aux)
 		ptr := v_0.Args[0]
 		mem := v_1
-		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) {
+		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) {
 			break
 		}
 		v.reset(OpMIPS64MOVWUload)
@@ -3947,7 +4291,7 @@
 	b := v.Block
 	config := b.Func.Config
 	// match: (MOVWload [off1] {sym} (ADDVconst [off2] ptr) mem)
-	// cond: is32Bit(int64(off1)+off2)
+	// cond: is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)
 	// result: (MOVWload [off1+int32(off2)] {sym} ptr mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -3958,7 +4302,7 @@
 		off2 := auxIntToInt64(v_0.AuxInt)
 		ptr := v_0.Args[0]
 		mem := v_1
-		if !(is32Bit(int64(off1) + off2)) {
+		if !(is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) {
 			break
 		}
 		v.reset(OpMIPS64MOVWload)
@@ -3968,7 +4312,7 @@
 		return true
 	}
 	// match: (MOVWload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem)
-	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)
 	// result: (MOVWload [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -3980,7 +4324,7 @@
 		sym2 := auxToSym(v_0.Aux)
 		ptr := v_0.Args[0]
 		mem := v_1
-		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) {
+		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) {
 			break
 		}
 		v.reset(OpMIPS64MOVWload)
@@ -4122,8 +4466,27 @@
 	v_2 := v.Args[2]
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
+	b := v.Block
+	config := b.Func.Config
+	// match: (MOVWstore [off] {sym} ptr (MOVWfpgp val) mem)
+	// result: (MOVFstore [off] {sym} ptr val mem)
+	for {
+		off := auxIntToInt32(v.AuxInt)
+		sym := auxToSym(v.Aux)
+		ptr := v_0
+		if v_1.Op != OpMIPS64MOVWfpgp {
+			break
+		}
+		val := v_1.Args[0]
+		mem := v_2
+		v.reset(OpMIPS64MOVFstore)
+		v.AuxInt = int32ToAuxInt(off)
+		v.Aux = symToAux(sym)
+		v.AddArg3(ptr, val, mem)
+		return true
+	}
 	// match: (MOVWstore [off1] {sym} (ADDVconst [off2] ptr) val mem)
-	// cond: is32Bit(int64(off1)+off2)
+	// cond: is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)
 	// result: (MOVWstore [off1+int32(off2)] {sym} ptr val mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -4135,7 +4498,7 @@
 		ptr := v_0.Args[0]
 		val := v_1
 		mem := v_2
-		if !(is32Bit(int64(off1) + off2)) {
+		if !(is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) {
 			break
 		}
 		v.reset(OpMIPS64MOVWstore)
@@ -4145,7 +4508,7 @@
 		return true
 	}
 	// match: (MOVWstore [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) val mem)
-	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)
 	// result: (MOVWstore [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr val mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -4158,7 +4521,7 @@
 		ptr := v_0.Args[0]
 		val := v_1
 		mem := v_2
-		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) {
+		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) {
 			break
 		}
 		v.reset(OpMIPS64MOVWstore)
@@ -4222,8 +4585,10 @@
 func rewriteValueMIPS64_OpMIPS64MOVWstorezero(v *Value) bool {
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
+	b := v.Block
+	config := b.Func.Config
 	// match: (MOVWstorezero [off1] {sym} (ADDVconst [off2] ptr) mem)
-	// cond: is32Bit(int64(off1)+off2)
+	// cond: is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)
 	// result: (MOVWstorezero [off1+int32(off2)] {sym} ptr mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -4234,7 +4599,7 @@
 		off2 := auxIntToInt64(v_0.AuxInt)
 		ptr := v_0.Args[0]
 		mem := v_1
-		if !(is32Bit(int64(off1) + off2)) {
+		if !(is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) {
 			break
 		}
 		v.reset(OpMIPS64MOVWstorezero)
@@ -4244,7 +4609,7 @@
 		return true
 	}
 	// match: (MOVWstorezero [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem)
-	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+	// cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)
 	// result: (MOVWstorezero [off1+int32(off2)] {mergeSym(sym1,sym2)} ptr mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -4256,7 +4621,7 @@
 		sym2 := auxToSym(v_0.Aux)
 		ptr := v_0.Args[0]
 		mem := v_1
-		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) {
+		if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2)) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) {
 			break
 		}
 		v.reset(OpMIPS64MOVWstorezero)
@@ -7310,14 +7675,14 @@
 		return true
 	}
 	// match: (Store {t} ptr val mem)
-	// cond: t.Size() == 4 && !is32BitFloat(val.Type)
+	// cond: t.Size() == 4 && !t.IsFloat()
 	// result: (MOVWstore ptr val mem)
 	for {
 		t := auxToType(v.Aux)
 		ptr := v_0
 		val := v_1
 		mem := v_2
-		if !(t.Size() == 4 && !is32BitFloat(val.Type)) {
+		if !(t.Size() == 4 && !t.IsFloat()) {
 			break
 		}
 		v.reset(OpMIPS64MOVWstore)
@@ -7325,14 +7690,14 @@
 		return true
 	}
 	// match: (Store {t} ptr val mem)
-	// cond: t.Size() == 8 && !is64BitFloat(val.Type)
+	// cond: t.Size() == 8 && !t.IsFloat()
 	// result: (MOVVstore ptr val mem)
 	for {
 		t := auxToType(v.Aux)
 		ptr := v_0
 		val := v_1
 		mem := v_2
-		if !(t.Size() == 8 && !is64BitFloat(val.Type)) {
+		if !(t.Size() == 8 && !t.IsFloat()) {
 			break
 		}
 		v.reset(OpMIPS64MOVVstore)
@@ -7340,14 +7705,14 @@
 		return true
 	}
 	// match: (Store {t} ptr val mem)
-	// cond: t.Size() == 4 && is32BitFloat(val.Type)
+	// cond: t.Size() == 4 && t.IsFloat()
 	// result: (MOVFstore ptr val mem)
 	for {
 		t := auxToType(v.Aux)
 		ptr := v_0
 		val := v_1
 		mem := v_2
-		if !(t.Size() == 4 && is32BitFloat(val.Type)) {
+		if !(t.Size() == 4 && t.IsFloat()) {
 			break
 		}
 		v.reset(OpMIPS64MOVFstore)
@@ -7355,14 +7720,14 @@
 		return true
 	}
 	// match: (Store {t} ptr val mem)
-	// cond: t.Size() == 8 && is64BitFloat(val.Type)
+	// cond: t.Size() == 8 && t.IsFloat()
 	// result: (MOVDstore ptr val mem)
 	for {
 		t := auxToType(v.Aux)
 		ptr := v_0
 		val := v_1
 		mem := v_2
-		if !(t.Size() == 8 && is64BitFloat(val.Type)) {
+		if !(t.Size() == 8 && t.IsFloat()) {
 			break
 		}
 		v.reset(OpMIPS64MOVDstore)
diff --git a/src/cmd/compile/internal/ssa/rewritePPC64.go b/src/cmd/compile/internal/ssa/rewritePPC64.go
index bc59312..d1c0c2b 100644
--- a/src/cmd/compile/internal/ssa/rewritePPC64.go
+++ b/src/cmd/compile/internal/ssa/rewritePPC64.go
@@ -1,5 +1,4 @@
-// Code generated from _gen/PPC64.rules; DO NOT EDIT.
-// generated with: cd _gen; go run .
+// Code generated from _gen/PPC64.rules using 'go generate'; DO NOT EDIT.
 
 package ssa
 
@@ -108,6 +107,12 @@
 		return rewriteValuePPC64_OpBitLen32(v)
 	case OpBitLen64:
 		return rewriteValuePPC64_OpBitLen64(v)
+	case OpBswap16:
+		return rewriteValuePPC64_OpBswap16(v)
+	case OpBswap32:
+		return rewriteValuePPC64_OpBswap32(v)
+	case OpBswap64:
+		return rewriteValuePPC64_OpBswap64(v)
 	case OpCeil:
 		v.Op = OpPPC64FCEIL
 		return true
@@ -436,8 +441,16 @@
 		return rewriteValuePPC64_OpPPC64ADDconst(v)
 	case OpPPC64AND:
 		return rewriteValuePPC64_OpPPC64AND(v)
+	case OpPPC64ANDCCconst:
+		return rewriteValuePPC64_OpPPC64ANDCCconst(v)
 	case OpPPC64ANDN:
 		return rewriteValuePPC64_OpPPC64ANDN(v)
+	case OpPPC64BRD:
+		return rewriteValuePPC64_OpPPC64BRD(v)
+	case OpPPC64BRH:
+		return rewriteValuePPC64_OpPPC64BRH(v)
+	case OpPPC64BRW:
+		return rewriteValuePPC64_OpPPC64BRW(v)
 	case OpPPC64CLRLSLDI:
 		return rewriteValuePPC64_OpPPC64CLRLSLDI(v)
 	case OpPPC64CMP:
@@ -500,8 +513,6 @@
 		return rewriteValuePPC64_OpPPC64GreaterThan(v)
 	case OpPPC64ISEL:
 		return rewriteValuePPC64_OpPPC64ISEL(v)
-	case OpPPC64ISELB:
-		return rewriteValuePPC64_OpPPC64ISELB(v)
 	case OpPPC64LessEqual:
 		return rewriteValuePPC64_OpPPC64LessEqual(v)
 	case OpPPC64LessThan:
@@ -596,6 +607,10 @@
 		return rewriteValuePPC64_OpPPC64ROTLW(v)
 	case OpPPC64ROTLWconst:
 		return rewriteValuePPC64_OpPPC64ROTLWconst(v)
+	case OpPPC64SETBC:
+		return rewriteValuePPC64_OpPPC64SETBC(v)
+	case OpPPC64SETBCR:
+		return rewriteValuePPC64_OpPPC64SETBCR(v)
 	case OpPPC64SLD:
 		return rewriteValuePPC64_OpPPC64SLD(v)
 	case OpPPC64SLDconst:
@@ -1123,6 +1138,175 @@
 		return true
 	}
 }
+func rewriteValuePPC64_OpBswap16(v *Value) bool {
+	v_0 := v.Args[0]
+	b := v.Block
+	typ := &b.Func.Config.Types
+	// match: (Bswap16 x)
+	// cond: buildcfg.GOPPC64>=10
+	// result: (BRH x)
+	for {
+		x := v_0
+		if !(buildcfg.GOPPC64 >= 10) {
+			break
+		}
+		v.reset(OpPPC64BRH)
+		v.AddArg(x)
+		return true
+	}
+	// match: (Bswap16 x:(MOVHZload [off] {sym} ptr mem))
+	// result: @x.Block (MOVHBRload (MOVDaddr <ptr.Type> [off] {sym} ptr) mem)
+	for {
+		x := v_0
+		if x.Op != OpPPC64MOVHZload {
+			break
+		}
+		off := auxIntToInt32(x.AuxInt)
+		sym := auxToSym(x.Aux)
+		mem := x.Args[1]
+		ptr := x.Args[0]
+		b = x.Block
+		v0 := b.NewValue0(x.Pos, OpPPC64MOVHBRload, typ.UInt16)
+		v.copyOf(v0)
+		v1 := b.NewValue0(x.Pos, OpPPC64MOVDaddr, ptr.Type)
+		v1.AuxInt = int32ToAuxInt(off)
+		v1.Aux = symToAux(sym)
+		v1.AddArg(ptr)
+		v0.AddArg2(v1, mem)
+		return true
+	}
+	// match: (Bswap16 x:(MOVHZloadidx ptr idx mem))
+	// result: @x.Block (MOVHZreg (MOVHBRloadidx ptr idx mem))
+	for {
+		x := v_0
+		if x.Op != OpPPC64MOVHZloadidx {
+			break
+		}
+		mem := x.Args[2]
+		ptr := x.Args[0]
+		idx := x.Args[1]
+		b = x.Block
+		v0 := b.NewValue0(v.Pos, OpPPC64MOVHZreg, typ.Int64)
+		v.copyOf(v0)
+		v1 := b.NewValue0(v.Pos, OpPPC64MOVHBRloadidx, typ.Int16)
+		v1.AddArg3(ptr, idx, mem)
+		v0.AddArg(v1)
+		return true
+	}
+	return false
+}
+func rewriteValuePPC64_OpBswap32(v *Value) bool {
+	v_0 := v.Args[0]
+	b := v.Block
+	typ := &b.Func.Config.Types
+	// match: (Bswap32 x)
+	// cond: buildcfg.GOPPC64>=10
+	// result: (BRW x)
+	for {
+		x := v_0
+		if !(buildcfg.GOPPC64 >= 10) {
+			break
+		}
+		v.reset(OpPPC64BRW)
+		v.AddArg(x)
+		return true
+	}
+	// match: (Bswap32 x:(MOVWZload [off] {sym} ptr mem))
+	// result: @x.Block (MOVWBRload (MOVDaddr <ptr.Type> [off] {sym} ptr) mem)
+	for {
+		x := v_0
+		if x.Op != OpPPC64MOVWZload {
+			break
+		}
+		off := auxIntToInt32(x.AuxInt)
+		sym := auxToSym(x.Aux)
+		mem := x.Args[1]
+		ptr := x.Args[0]
+		b = x.Block
+		v0 := b.NewValue0(x.Pos, OpPPC64MOVWBRload, typ.UInt32)
+		v.copyOf(v0)
+		v1 := b.NewValue0(x.Pos, OpPPC64MOVDaddr, ptr.Type)
+		v1.AuxInt = int32ToAuxInt(off)
+		v1.Aux = symToAux(sym)
+		v1.AddArg(ptr)
+		v0.AddArg2(v1, mem)
+		return true
+	}
+	// match: (Bswap32 x:(MOVWZloadidx ptr idx mem))
+	// result: @x.Block (MOVWZreg (MOVWBRloadidx ptr idx mem))
+	for {
+		x := v_0
+		if x.Op != OpPPC64MOVWZloadidx {
+			break
+		}
+		mem := x.Args[2]
+		ptr := x.Args[0]
+		idx := x.Args[1]
+		b = x.Block
+		v0 := b.NewValue0(v.Pos, OpPPC64MOVWZreg, typ.Int64)
+		v.copyOf(v0)
+		v1 := b.NewValue0(v.Pos, OpPPC64MOVWBRloadidx, typ.Int32)
+		v1.AddArg3(ptr, idx, mem)
+		v0.AddArg(v1)
+		return true
+	}
+	return false
+}
+func rewriteValuePPC64_OpBswap64(v *Value) bool {
+	v_0 := v.Args[0]
+	b := v.Block
+	typ := &b.Func.Config.Types
+	// match: (Bswap64 x)
+	// cond: buildcfg.GOPPC64>=10
+	// result: (BRD x)
+	for {
+		x := v_0
+		if !(buildcfg.GOPPC64 >= 10) {
+			break
+		}
+		v.reset(OpPPC64BRD)
+		v.AddArg(x)
+		return true
+	}
+	// match: (Bswap64 x:(MOVDload [off] {sym} ptr mem))
+	// result: @x.Block (MOVDBRload (MOVDaddr <ptr.Type> [off] {sym} ptr) mem)
+	for {
+		x := v_0
+		if x.Op != OpPPC64MOVDload {
+			break
+		}
+		off := auxIntToInt32(x.AuxInt)
+		sym := auxToSym(x.Aux)
+		mem := x.Args[1]
+		ptr := x.Args[0]
+		b = x.Block
+		v0 := b.NewValue0(x.Pos, OpPPC64MOVDBRload, typ.UInt64)
+		v.copyOf(v0)
+		v1 := b.NewValue0(x.Pos, OpPPC64MOVDaddr, ptr.Type)
+		v1.AuxInt = int32ToAuxInt(off)
+		v1.Aux = symToAux(sym)
+		v1.AddArg(ptr)
+		v0.AddArg2(v1, mem)
+		return true
+	}
+	// match: (Bswap64 x:(MOVDloadidx ptr idx mem))
+	// result: @x.Block (MOVDBRloadidx ptr idx mem)
+	for {
+		x := v_0
+		if x.Op != OpPPC64MOVDloadidx {
+			break
+		}
+		mem := x.Args[2]
+		ptr := x.Args[0]
+		idx := x.Args[1]
+		b = x.Block
+		v0 := b.NewValue0(v.Pos, OpPPC64MOVDBRloadidx, typ.Int64)
+		v.copyOf(v0)
+		v0.AddArg3(ptr, idx, mem)
+		return true
+	}
+	return false
+}
 func rewriteValuePPC64_OpCom16(v *Value) bool {
 	v_0 := v.Args[0]
 	// match: (Com16 x)
@@ -1173,6 +1357,36 @@
 	v_0 := v.Args[0]
 	b := v.Block
 	typ := &b.Func.Config.Types
+	// match: (CondSelect x y (SETBC [a] cmp))
+	// result: (ISEL [a] x y cmp)
+	for {
+		x := v_0
+		y := v_1
+		if v_2.Op != OpPPC64SETBC {
+			break
+		}
+		a := auxIntToInt32(v_2.AuxInt)
+		cmp := v_2.Args[0]
+		v.reset(OpPPC64ISEL)
+		v.AuxInt = int32ToAuxInt(a)
+		v.AddArg3(x, y, cmp)
+		return true
+	}
+	// match: (CondSelect x y (SETBCR [a] cmp))
+	// result: (ISEL [a+4] x y cmp)
+	for {
+		x := v_0
+		y := v_1
+		if v_2.Op != OpPPC64SETBCR {
+			break
+		}
+		a := auxIntToInt32(v_2.AuxInt)
+		cmp := v_2.Args[0]
+		v.reset(OpPPC64ISEL)
+		v.AuxInt = int32ToAuxInt(a + 4)
+		v.AddArg3(x, y, cmp)
+		return true
+	}
 	// match: (CondSelect x y bool)
 	// cond: flagArg(bool) == nil
 	// result: (ISEL [6] x y (Select1 <types.TypeFlags> (ANDCCconst [1] bool)))
@@ -1615,13 +1829,13 @@
 	b := v.Block
 	typ := &b.Func.Config.Types
 	// match: (Eq16 x y)
-	// cond: isSigned(x.Type) && isSigned(y.Type)
+	// cond: x.Type.IsSigned() && y.Type.IsSigned()
 	// result: (Equal (CMPW (SignExt16to32 x) (SignExt16to32 y)))
 	for {
 		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
 			x := v_0
 			y := v_1
-			if !(isSigned(x.Type) && isSigned(y.Type)) {
+			if !(x.Type.IsSigned() && y.Type.IsSigned()) {
 				continue
 			}
 			v.reset(OpPPC64Equal)
@@ -1722,13 +1936,13 @@
 	b := v.Block
 	typ := &b.Func.Config.Types
 	// match: (Eq8 x y)
-	// cond: isSigned(x.Type) && isSigned(y.Type)
+	// cond: x.Type.IsSigned() && y.Type.IsSigned()
 	// result: (Equal (CMPW (SignExt8to32 x) (SignExt8to32 y)))
 	for {
 		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
 			x := v_0
 			y := v_1
-			if !(isSigned(x.Type) && isSigned(y.Type)) {
+			if !(x.Type.IsSigned() && y.Type.IsSigned()) {
 				continue
 			}
 			v.reset(OpPPC64Equal)
@@ -2223,13 +2437,13 @@
 		return true
 	}
 	// match: (Load <t> ptr mem)
-	// cond: is32BitInt(t) && isSigned(t)
+	// cond: is32BitInt(t) && t.IsSigned()
 	// result: (MOVWload ptr mem)
 	for {
 		t := v.Type
 		ptr := v_0
 		mem := v_1
-		if !(is32BitInt(t) && isSigned(t)) {
+		if !(is32BitInt(t) && t.IsSigned()) {
 			break
 		}
 		v.reset(OpPPC64MOVWload)
@@ -2237,13 +2451,13 @@
 		return true
 	}
 	// match: (Load <t> ptr mem)
-	// cond: is32BitInt(t) && !isSigned(t)
+	// cond: is32BitInt(t) && !t.IsSigned()
 	// result: (MOVWZload ptr mem)
 	for {
 		t := v.Type
 		ptr := v_0
 		mem := v_1
-		if !(is32BitInt(t) && !isSigned(t)) {
+		if !(is32BitInt(t) && !t.IsSigned()) {
 			break
 		}
 		v.reset(OpPPC64MOVWZload)
@@ -2251,13 +2465,13 @@
 		return true
 	}
 	// match: (Load <t> ptr mem)
-	// cond: is16BitInt(t) && isSigned(t)
+	// cond: is16BitInt(t) && t.IsSigned()
 	// result: (MOVHload ptr mem)
 	for {
 		t := v.Type
 		ptr := v_0
 		mem := v_1
-		if !(is16BitInt(t) && isSigned(t)) {
+		if !(is16BitInt(t) && t.IsSigned()) {
 			break
 		}
 		v.reset(OpPPC64MOVHload)
@@ -2265,13 +2479,13 @@
 		return true
 	}
 	// match: (Load <t> ptr mem)
-	// cond: is16BitInt(t) && !isSigned(t)
+	// cond: is16BitInt(t) && !t.IsSigned()
 	// result: (MOVHZload ptr mem)
 	for {
 		t := v.Type
 		ptr := v_0
 		mem := v_1
-		if !(is16BitInt(t) && !isSigned(t)) {
+		if !(is16BitInt(t) && !t.IsSigned()) {
 			break
 		}
 		v.reset(OpPPC64MOVHZload)
@@ -2293,13 +2507,13 @@
 		return true
 	}
 	// match: (Load <t> ptr mem)
-	// cond: is8BitInt(t) && isSigned(t)
+	// cond: is8BitInt(t) && t.IsSigned()
 	// result: (MOVBreg (MOVBZload ptr mem))
 	for {
 		t := v.Type
 		ptr := v_0
 		mem := v_1
-		if !(is8BitInt(t) && isSigned(t)) {
+		if !(is8BitInt(t) && t.IsSigned()) {
 			break
 		}
 		v.reset(OpPPC64MOVBreg)
@@ -2309,13 +2523,13 @@
 		return true
 	}
 	// match: (Load <t> ptr mem)
-	// cond: is8BitInt(t) && !isSigned(t)
+	// cond: is8BitInt(t) && !t.IsSigned()
 	// result: (MOVBZload ptr mem)
 	for {
 		t := v.Type
 		ptr := v_0
 		mem := v_1
-		if !(is8BitInt(t) && !isSigned(t)) {
+		if !(is8BitInt(t) && !t.IsSigned()) {
 			break
 		}
 		v.reset(OpPPC64MOVBZload)
@@ -2353,17 +2567,44 @@
 	return false
 }
 func rewriteValuePPC64_OpLocalAddr(v *Value) bool {
+	v_1 := v.Args[1]
 	v_0 := v.Args[0]
-	// match: (LocalAddr {sym} base _)
-	// result: (MOVDaddr {sym} base)
+	b := v.Block
+	typ := &b.Func.Config.Types
+	// match: (LocalAddr <t> {sym} base mem)
+	// cond: t.Elem().HasPointers()
+	// result: (MOVDaddr {sym} (SPanchored base mem))
 	for {
+		t := v.Type
 		sym := auxToSym(v.Aux)
 		base := v_0
+		mem := v_1
+		if !(t.Elem().HasPointers()) {
+			break
+		}
+		v.reset(OpPPC64MOVDaddr)
+		v.Aux = symToAux(sym)
+		v0 := b.NewValue0(v.Pos, OpSPanchored, typ.Uintptr)
+		v0.AddArg2(base, mem)
+		v.AddArg(v0)
+		return true
+	}
+	// match: (LocalAddr <t> {sym} base _)
+	// cond: !t.Elem().HasPointers()
+	// result: (MOVDaddr {sym} base)
+	for {
+		t := v.Type
+		sym := auxToSym(v.Aux)
+		base := v_0
+		if !(!t.Elem().HasPointers()) {
+			break
+		}
 		v.reset(OpPPC64MOVDaddr)
 		v.Aux = symToAux(sym)
 		v.AddArg(base)
 		return true
 	}
+	return false
 }
 func rewriteValuePPC64_OpLsh16x16(v *Value) bool {
 	v_1 := v.Args[1]
@@ -2372,35 +2613,37 @@
 	typ := &b.Func.Config.Types
 	// match: (Lsh16x16 x y)
 	// cond: shiftIsBounded(v)
-	// result: (SLW x y)
+	// result: (SLD x y)
 	for {
 		x := v_0
 		y := v_1
 		if !(shiftIsBounded(v)) {
 			break
 		}
-		v.reset(OpPPC64SLW)
+		v.reset(OpPPC64SLD)
 		v.AddArg2(x, y)
 		return true
 	}
-	// match: (Lsh16x16 x y)
-	// result: (SLW x (ISEL [0] y (MOVDconst [-1]) (CMPU (ZeroExt16to64 y) (MOVDconst [16]))))
+	// match: (Lsh16x16 <t> x y)
+	// result: (ISEL [2] (SLD <t> (MOVHZreg x) y) (MOVDconst [0]) (Select1 <types.TypeFlags> (ANDCCconst [0xFFF0] y)))
 	for {
+		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpPPC64SLW)
-		v0 := b.NewValue0(v.Pos, OpPPC64ISEL, typ.Int32)
-		v0.AuxInt = int32ToAuxInt(0)
-		v1 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v1.AuxInt = int64ToAuxInt(-1)
-		v2 := b.NewValue0(v.Pos, OpPPC64CMPU, types.TypeFlags)
-		v3 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64)
-		v3.AddArg(y)
-		v4 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v4.AuxInt = int64ToAuxInt(16)
-		v2.AddArg2(v3, v4)
-		v0.AddArg3(y, v1, v2)
-		v.AddArg2(x, v0)
+		v.reset(OpPPC64ISEL)
+		v.AuxInt = int32ToAuxInt(2)
+		v0 := b.NewValue0(v.Pos, OpPPC64SLD, t)
+		v1 := b.NewValue0(v.Pos, OpPPC64MOVHZreg, typ.Int64)
+		v1.AddArg(x)
+		v0.AddArg2(v1, y)
+		v2 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
+		v2.AuxInt = int64ToAuxInt(0)
+		v3 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags)
+		v4 := b.NewValue0(v.Pos, OpPPC64ANDCCconst, types.NewTuple(typ.Int, types.TypeFlags))
+		v4.AuxInt = int64ToAuxInt(0xFFF0)
+		v4.AddArg(y)
+		v3.AddArg(v4)
+		v.AddArg3(v0, v2, v3)
 		return true
 	}
 }
@@ -2411,33 +2654,35 @@
 	typ := &b.Func.Config.Types
 	// match: (Lsh16x32 x y)
 	// cond: shiftIsBounded(v)
-	// result: (SLW x y)
+	// result: (SLD x y)
 	for {
 		x := v_0
 		y := v_1
 		if !(shiftIsBounded(v)) {
 			break
 		}
-		v.reset(OpPPC64SLW)
+		v.reset(OpPPC64SLD)
 		v.AddArg2(x, y)
 		return true
 	}
-	// match: (Lsh16x32 x y)
-	// result: (SLW x (ISEL [0] y (MOVDconst [-1]) (CMPU y (MOVDconst [16]))))
+	// match: (Lsh16x32 <t> x y)
+	// result: (ISEL [0] (SLD <t> (MOVHZreg x) y) (MOVDconst [0]) (CMPWUconst y [16]))
 	for {
+		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpPPC64SLW)
-		v0 := b.NewValue0(v.Pos, OpPPC64ISEL, typ.Int32)
-		v0.AuxInt = int32ToAuxInt(0)
-		v1 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v1.AuxInt = int64ToAuxInt(-1)
-		v2 := b.NewValue0(v.Pos, OpPPC64CMPU, types.TypeFlags)
-		v3 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v3.AuxInt = int64ToAuxInt(16)
-		v2.AddArg2(y, v3)
-		v0.AddArg3(y, v1, v2)
-		v.AddArg2(x, v0)
+		v.reset(OpPPC64ISEL)
+		v.AuxInt = int32ToAuxInt(0)
+		v0 := b.NewValue0(v.Pos, OpPPC64SLD, t)
+		v1 := b.NewValue0(v.Pos, OpPPC64MOVHZreg, typ.Int64)
+		v1.AddArg(x)
+		v0.AddArg2(v1, y)
+		v2 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
+		v2.AuxInt = int64ToAuxInt(0)
+		v3 := b.NewValue0(v.Pos, OpPPC64CMPWUconst, types.TypeFlags)
+		v3.AuxInt = int32ToAuxInt(16)
+		v3.AddArg(y)
+		v.AddArg3(v0, v2, v3)
 		return true
 	}
 }
@@ -2465,33 +2710,35 @@
 	}
 	// match: (Lsh16x64 x y)
 	// cond: shiftIsBounded(v)
-	// result: (SLW x y)
+	// result: (SLD x y)
 	for {
 		x := v_0
 		y := v_1
 		if !(shiftIsBounded(v)) {
 			break
 		}
-		v.reset(OpPPC64SLW)
+		v.reset(OpPPC64SLD)
 		v.AddArg2(x, y)
 		return true
 	}
-	// match: (Lsh16x64 x y)
-	// result: (SLW x (ISEL [0] y (MOVDconst [-1]) (CMPU y (MOVDconst [16]))))
+	// match: (Lsh16x64 <t> x y)
+	// result: (ISEL [0] (SLD <t> (MOVHZreg x) y) (MOVDconst [0]) (CMPUconst y [16]))
 	for {
+		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpPPC64SLW)
-		v0 := b.NewValue0(v.Pos, OpPPC64ISEL, typ.Int32)
-		v0.AuxInt = int32ToAuxInt(0)
-		v1 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v1.AuxInt = int64ToAuxInt(-1)
-		v2 := b.NewValue0(v.Pos, OpPPC64CMPU, types.TypeFlags)
-		v3 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
+		v.reset(OpPPC64ISEL)
+		v.AuxInt = int32ToAuxInt(0)
+		v0 := b.NewValue0(v.Pos, OpPPC64SLD, t)
+		v1 := b.NewValue0(v.Pos, OpPPC64MOVHZreg, typ.Int64)
+		v1.AddArg(x)
+		v0.AddArg2(v1, y)
+		v2 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
+		v2.AuxInt = int64ToAuxInt(0)
+		v3 := b.NewValue0(v.Pos, OpPPC64CMPUconst, types.TypeFlags)
 		v3.AuxInt = int64ToAuxInt(16)
-		v2.AddArg2(y, v3)
-		v0.AddArg3(y, v1, v2)
-		v.AddArg2(x, v0)
+		v3.AddArg(y)
+		v.AddArg3(v0, v2, v3)
 		return true
 	}
 }
@@ -2502,35 +2749,37 @@
 	typ := &b.Func.Config.Types
 	// match: (Lsh16x8 x y)
 	// cond: shiftIsBounded(v)
-	// result: (SLW x y)
+	// result: (SLD x y)
 	for {
 		x := v_0
 		y := v_1
 		if !(shiftIsBounded(v)) {
 			break
 		}
-		v.reset(OpPPC64SLW)
+		v.reset(OpPPC64SLD)
 		v.AddArg2(x, y)
 		return true
 	}
-	// match: (Lsh16x8 x y)
-	// result: (SLW x (ISEL [0] y (MOVDconst [-1]) (CMPU (ZeroExt8to64 y) (MOVDconst [16]))))
+	// match: (Lsh16x8 <t> x y)
+	// result: (ISEL [2] (SLD <t> (MOVHZreg x) y) (MOVDconst [0]) (Select1 <types.TypeFlags> (ANDCCconst [0x00F0] y)))
 	for {
+		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpPPC64SLW)
-		v0 := b.NewValue0(v.Pos, OpPPC64ISEL, typ.Int32)
-		v0.AuxInt = int32ToAuxInt(0)
-		v1 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v1.AuxInt = int64ToAuxInt(-1)
-		v2 := b.NewValue0(v.Pos, OpPPC64CMPU, types.TypeFlags)
-		v3 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64)
-		v3.AddArg(y)
-		v4 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v4.AuxInt = int64ToAuxInt(16)
-		v2.AddArg2(v3, v4)
-		v0.AddArg3(y, v1, v2)
-		v.AddArg2(x, v0)
+		v.reset(OpPPC64ISEL)
+		v.AuxInt = int32ToAuxInt(2)
+		v0 := b.NewValue0(v.Pos, OpPPC64SLD, t)
+		v1 := b.NewValue0(v.Pos, OpPPC64MOVHZreg, typ.Int64)
+		v1.AddArg(x)
+		v0.AddArg2(v1, y)
+		v2 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
+		v2.AuxInt = int64ToAuxInt(0)
+		v3 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags)
+		v4 := b.NewValue0(v.Pos, OpPPC64ANDCCconst, types.NewTuple(typ.Int, types.TypeFlags))
+		v4.AuxInt = int64ToAuxInt(0x00F0)
+		v4.AddArg(y)
+		v3.AddArg(v4)
+		v.AddArg3(v0, v2, v3)
 		return true
 	}
 }
@@ -2552,24 +2801,24 @@
 		v.AddArg2(x, y)
 		return true
 	}
-	// match: (Lsh32x16 x y)
-	// result: (SLW x (ISEL [0] y (MOVDconst [-1]) (CMPU (ZeroExt16to64 y) (MOVDconst [32]))))
+	// match: (Lsh32x16 <t> x y)
+	// result: (ISEL [2] (SLW <t> x y) (MOVDconst [0]) (Select1 <types.TypeFlags> (ANDCCconst [0xFFE0] y)))
 	for {
+		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpPPC64SLW)
-		v0 := b.NewValue0(v.Pos, OpPPC64ISEL, typ.Int32)
-		v0.AuxInt = int32ToAuxInt(0)
+		v.reset(OpPPC64ISEL)
+		v.AuxInt = int32ToAuxInt(2)
+		v0 := b.NewValue0(v.Pos, OpPPC64SLW, t)
+		v0.AddArg2(x, y)
 		v1 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v1.AuxInt = int64ToAuxInt(-1)
-		v2 := b.NewValue0(v.Pos, OpPPC64CMPU, types.TypeFlags)
-		v3 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64)
+		v1.AuxInt = int64ToAuxInt(0)
+		v2 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags)
+		v3 := b.NewValue0(v.Pos, OpPPC64ANDCCconst, types.NewTuple(typ.Int, types.TypeFlags))
+		v3.AuxInt = int64ToAuxInt(0xFFE0)
 		v3.AddArg(y)
-		v4 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v4.AuxInt = int64ToAuxInt(32)
-		v2.AddArg2(v3, v4)
-		v0.AddArg3(y, v1, v2)
-		v.AddArg2(x, v0)
+		v2.AddArg(v3)
+		v.AddArg3(v0, v1, v2)
 		return true
 	}
 }
@@ -2591,22 +2840,22 @@
 		v.AddArg2(x, y)
 		return true
 	}
-	// match: (Lsh32x32 x y)
-	// result: (SLW x (ISEL [0] y (MOVDconst [-1]) (CMPU y (MOVDconst [32]))))
+	// match: (Lsh32x32 <t> x y)
+	// result: (ISEL [0] (SLW <t> x y) (MOVDconst [0]) (CMPWUconst y [32]))
 	for {
+		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpPPC64SLW)
-		v0 := b.NewValue0(v.Pos, OpPPC64ISEL, typ.Int32)
-		v0.AuxInt = int32ToAuxInt(0)
+		v.reset(OpPPC64ISEL)
+		v.AuxInt = int32ToAuxInt(0)
+		v0 := b.NewValue0(v.Pos, OpPPC64SLW, t)
+		v0.AddArg2(x, y)
 		v1 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v1.AuxInt = int64ToAuxInt(-1)
-		v2 := b.NewValue0(v.Pos, OpPPC64CMPU, types.TypeFlags)
-		v3 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v3.AuxInt = int64ToAuxInt(32)
-		v2.AddArg2(y, v3)
-		v0.AddArg3(y, v1, v2)
-		v.AddArg2(x, v0)
+		v1.AuxInt = int64ToAuxInt(0)
+		v2 := b.NewValue0(v.Pos, OpPPC64CMPWUconst, types.TypeFlags)
+		v2.AuxInt = int32ToAuxInt(32)
+		v2.AddArg(y)
+		v.AddArg3(v0, v1, v2)
 		return true
 	}
 }
@@ -2645,22 +2894,22 @@
 		v.AddArg2(x, y)
 		return true
 	}
-	// match: (Lsh32x64 x y)
-	// result: (SLW x (ISEL [0] y (MOVDconst [-1]) (CMPU y (MOVDconst [32]))))
+	// match: (Lsh32x64 <t> x y)
+	// result: (ISEL [0] (SLW <t> x y) (MOVDconst [0]) (CMPUconst y [32]))
 	for {
+		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpPPC64SLW)
-		v0 := b.NewValue0(v.Pos, OpPPC64ISEL, typ.Int32)
-		v0.AuxInt = int32ToAuxInt(0)
+		v.reset(OpPPC64ISEL)
+		v.AuxInt = int32ToAuxInt(0)
+		v0 := b.NewValue0(v.Pos, OpPPC64SLW, t)
+		v0.AddArg2(x, y)
 		v1 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v1.AuxInt = int64ToAuxInt(-1)
-		v2 := b.NewValue0(v.Pos, OpPPC64CMPU, types.TypeFlags)
-		v3 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v3.AuxInt = int64ToAuxInt(32)
-		v2.AddArg2(y, v3)
-		v0.AddArg3(y, v1, v2)
-		v.AddArg2(x, v0)
+		v1.AuxInt = int64ToAuxInt(0)
+		v2 := b.NewValue0(v.Pos, OpPPC64CMPUconst, types.TypeFlags)
+		v2.AuxInt = int64ToAuxInt(32)
+		v2.AddArg(y)
+		v.AddArg3(v0, v1, v2)
 		return true
 	}
 }
@@ -2682,24 +2931,24 @@
 		v.AddArg2(x, y)
 		return true
 	}
-	// match: (Lsh32x8 x y)
-	// result: (SLW x (ISEL [0] y (MOVDconst [-1]) (CMPU (ZeroExt8to64 y) (MOVDconst [32]))))
+	// match: (Lsh32x8 <t> x y)
+	// result: (ISEL [2] (SLW <t> x y) (MOVDconst [0]) (Select1 <types.TypeFlags> (ANDCCconst [0x00E0] y)))
 	for {
+		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpPPC64SLW)
-		v0 := b.NewValue0(v.Pos, OpPPC64ISEL, typ.Int32)
-		v0.AuxInt = int32ToAuxInt(0)
+		v.reset(OpPPC64ISEL)
+		v.AuxInt = int32ToAuxInt(2)
+		v0 := b.NewValue0(v.Pos, OpPPC64SLW, t)
+		v0.AddArg2(x, y)
 		v1 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v1.AuxInt = int64ToAuxInt(-1)
-		v2 := b.NewValue0(v.Pos, OpPPC64CMPU, types.TypeFlags)
-		v3 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64)
+		v1.AuxInt = int64ToAuxInt(0)
+		v2 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags)
+		v3 := b.NewValue0(v.Pos, OpPPC64ANDCCconst, types.NewTuple(typ.Int, types.TypeFlags))
+		v3.AuxInt = int64ToAuxInt(0x00E0)
 		v3.AddArg(y)
-		v4 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v4.AuxInt = int64ToAuxInt(32)
-		v2.AddArg2(v3, v4)
-		v0.AddArg3(y, v1, v2)
-		v.AddArg2(x, v0)
+		v2.AddArg(v3)
+		v.AddArg3(v0, v1, v2)
 		return true
 	}
 }
@@ -2721,24 +2970,24 @@
 		v.AddArg2(x, y)
 		return true
 	}
-	// match: (Lsh64x16 x y)
-	// result: (SLD x (ISEL [0] y (MOVDconst [-1]) (CMPU (ZeroExt16to64 y) (MOVDconst [64]))))
+	// match: (Lsh64x16 <t> x y)
+	// result: (ISEL [2] (SLD <t> x y) (MOVDconst [0]) (Select1 <types.TypeFlags> (ANDCCconst [0xFFC0] y)))
 	for {
+		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpPPC64SLD)
-		v0 := b.NewValue0(v.Pos, OpPPC64ISEL, typ.Int32)
-		v0.AuxInt = int32ToAuxInt(0)
+		v.reset(OpPPC64ISEL)
+		v.AuxInt = int32ToAuxInt(2)
+		v0 := b.NewValue0(v.Pos, OpPPC64SLD, t)
+		v0.AddArg2(x, y)
 		v1 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v1.AuxInt = int64ToAuxInt(-1)
-		v2 := b.NewValue0(v.Pos, OpPPC64CMPU, types.TypeFlags)
-		v3 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64)
+		v1.AuxInt = int64ToAuxInt(0)
+		v2 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags)
+		v3 := b.NewValue0(v.Pos, OpPPC64ANDCCconst, types.NewTuple(typ.Int, types.TypeFlags))
+		v3.AuxInt = int64ToAuxInt(0xFFC0)
 		v3.AddArg(y)
-		v4 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v4.AuxInt = int64ToAuxInt(64)
-		v2.AddArg2(v3, v4)
-		v0.AddArg3(y, v1, v2)
-		v.AddArg2(x, v0)
+		v2.AddArg(v3)
+		v.AddArg3(v0, v1, v2)
 		return true
 	}
 }
@@ -2760,22 +3009,22 @@
 		v.AddArg2(x, y)
 		return true
 	}
-	// match: (Lsh64x32 x y)
-	// result: (SLD x (ISEL [0] y (MOVDconst [-1]) (CMPU y (MOVDconst [64]))))
+	// match: (Lsh64x32 <t> x y)
+	// result: (ISEL [0] (SLD <t> x y) (MOVDconst [0]) (CMPWUconst y [64]))
 	for {
+		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpPPC64SLD)
-		v0 := b.NewValue0(v.Pos, OpPPC64ISEL, typ.Int32)
-		v0.AuxInt = int32ToAuxInt(0)
+		v.reset(OpPPC64ISEL)
+		v.AuxInt = int32ToAuxInt(0)
+		v0 := b.NewValue0(v.Pos, OpPPC64SLD, t)
+		v0.AddArg2(x, y)
 		v1 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v1.AuxInt = int64ToAuxInt(-1)
-		v2 := b.NewValue0(v.Pos, OpPPC64CMPU, types.TypeFlags)
-		v3 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v3.AuxInt = int64ToAuxInt(64)
-		v2.AddArg2(y, v3)
-		v0.AddArg3(y, v1, v2)
-		v.AddArg2(x, v0)
+		v1.AuxInt = int64ToAuxInt(0)
+		v2 := b.NewValue0(v.Pos, OpPPC64CMPWUconst, types.TypeFlags)
+		v2.AuxInt = int32ToAuxInt(64)
+		v2.AddArg(y)
+		v.AddArg3(v0, v1, v2)
 		return true
 	}
 }
@@ -2814,22 +3063,22 @@
 		v.AddArg2(x, y)
 		return true
 	}
-	// match: (Lsh64x64 x y)
-	// result: (SLD x (ISEL [0] y (MOVDconst [-1]) (CMPU y (MOVDconst [64]))))
+	// match: (Lsh64x64 <t> x y)
+	// result: (ISEL [0] (SLD <t> x y) (MOVDconst [0]) (CMPUconst y [64]))
 	for {
+		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpPPC64SLD)
-		v0 := b.NewValue0(v.Pos, OpPPC64ISEL, typ.Int32)
-		v0.AuxInt = int32ToAuxInt(0)
+		v.reset(OpPPC64ISEL)
+		v.AuxInt = int32ToAuxInt(0)
+		v0 := b.NewValue0(v.Pos, OpPPC64SLD, t)
+		v0.AddArg2(x, y)
 		v1 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v1.AuxInt = int64ToAuxInt(-1)
-		v2 := b.NewValue0(v.Pos, OpPPC64CMPU, types.TypeFlags)
-		v3 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v3.AuxInt = int64ToAuxInt(64)
-		v2.AddArg2(y, v3)
-		v0.AddArg3(y, v1, v2)
-		v.AddArg2(x, v0)
+		v1.AuxInt = int64ToAuxInt(0)
+		v2 := b.NewValue0(v.Pos, OpPPC64CMPUconst, types.TypeFlags)
+		v2.AuxInt = int64ToAuxInt(64)
+		v2.AddArg(y)
+		v.AddArg3(v0, v1, v2)
 		return true
 	}
 }
@@ -2851,24 +3100,24 @@
 		v.AddArg2(x, y)
 		return true
 	}
-	// match: (Lsh64x8 x y)
-	// result: (SLD x (ISEL [0] y (MOVDconst [-1]) (CMPU (ZeroExt8to64 y) (MOVDconst [64]))))
+	// match: (Lsh64x8 <t> x y)
+	// result: (ISEL [2] (SLD <t> x y) (MOVDconst [0]) (Select1 <types.TypeFlags> (ANDCCconst [0x00C0] y)))
 	for {
+		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpPPC64SLD)
-		v0 := b.NewValue0(v.Pos, OpPPC64ISEL, typ.Int32)
-		v0.AuxInt = int32ToAuxInt(0)
+		v.reset(OpPPC64ISEL)
+		v.AuxInt = int32ToAuxInt(2)
+		v0 := b.NewValue0(v.Pos, OpPPC64SLD, t)
+		v0.AddArg2(x, y)
 		v1 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v1.AuxInt = int64ToAuxInt(-1)
-		v2 := b.NewValue0(v.Pos, OpPPC64CMPU, types.TypeFlags)
-		v3 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64)
+		v1.AuxInt = int64ToAuxInt(0)
+		v2 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags)
+		v3 := b.NewValue0(v.Pos, OpPPC64ANDCCconst, types.NewTuple(typ.Int, types.TypeFlags))
+		v3.AuxInt = int64ToAuxInt(0x00C0)
 		v3.AddArg(y)
-		v4 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v4.AuxInt = int64ToAuxInt(64)
-		v2.AddArg2(v3, v4)
-		v0.AddArg3(y, v1, v2)
-		v.AddArg2(x, v0)
+		v2.AddArg(v3)
+		v.AddArg3(v0, v1, v2)
 		return true
 	}
 }
@@ -2879,35 +3128,37 @@
 	typ := &b.Func.Config.Types
 	// match: (Lsh8x16 x y)
 	// cond: shiftIsBounded(v)
-	// result: (SLW x y)
+	// result: (SLD x y)
 	for {
 		x := v_0
 		y := v_1
 		if !(shiftIsBounded(v)) {
 			break
 		}
-		v.reset(OpPPC64SLW)
+		v.reset(OpPPC64SLD)
 		v.AddArg2(x, y)
 		return true
 	}
-	// match: (Lsh8x16 x y)
-	// result: (SLW x (ISEL [0] y (MOVDconst [-1]) (CMPU (ZeroExt16to64 y) (MOVDconst [8]))))
+	// match: (Lsh8x16 <t> x y)
+	// result: (ISEL [2] (SLD <t> (MOVBZreg x) y) (MOVDconst [0]) (Select1 <types.TypeFlags> (ANDCCconst [0xFFF8] y)))
 	for {
+		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpPPC64SLW)
-		v0 := b.NewValue0(v.Pos, OpPPC64ISEL, typ.Int32)
-		v0.AuxInt = int32ToAuxInt(0)
-		v1 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v1.AuxInt = int64ToAuxInt(-1)
-		v2 := b.NewValue0(v.Pos, OpPPC64CMPU, types.TypeFlags)
-		v3 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64)
-		v3.AddArg(y)
-		v4 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v4.AuxInt = int64ToAuxInt(8)
-		v2.AddArg2(v3, v4)
-		v0.AddArg3(y, v1, v2)
-		v.AddArg2(x, v0)
+		v.reset(OpPPC64ISEL)
+		v.AuxInt = int32ToAuxInt(2)
+		v0 := b.NewValue0(v.Pos, OpPPC64SLD, t)
+		v1 := b.NewValue0(v.Pos, OpPPC64MOVBZreg, typ.Int64)
+		v1.AddArg(x)
+		v0.AddArg2(v1, y)
+		v2 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
+		v2.AuxInt = int64ToAuxInt(0)
+		v3 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags)
+		v4 := b.NewValue0(v.Pos, OpPPC64ANDCCconst, types.NewTuple(typ.Int, types.TypeFlags))
+		v4.AuxInt = int64ToAuxInt(0xFFF8)
+		v4.AddArg(y)
+		v3.AddArg(v4)
+		v.AddArg3(v0, v2, v3)
 		return true
 	}
 }
@@ -2918,33 +3169,35 @@
 	typ := &b.Func.Config.Types
 	// match: (Lsh8x32 x y)
 	// cond: shiftIsBounded(v)
-	// result: (SLW x y)
+	// result: (SLD x y)
 	for {
 		x := v_0
 		y := v_1
 		if !(shiftIsBounded(v)) {
 			break
 		}
-		v.reset(OpPPC64SLW)
+		v.reset(OpPPC64SLD)
 		v.AddArg2(x, y)
 		return true
 	}
-	// match: (Lsh8x32 x y)
-	// result: (SLW x (ISEL [0] y (MOVDconst [-1]) (CMPU y (MOVDconst [8]))))
+	// match: (Lsh8x32 <t> x y)
+	// result: (ISEL [0] (SLD <t> (MOVBZreg x) y) (MOVDconst [0]) (CMPWUconst y [8]))
 	for {
+		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpPPC64SLW)
-		v0 := b.NewValue0(v.Pos, OpPPC64ISEL, typ.Int32)
-		v0.AuxInt = int32ToAuxInt(0)
-		v1 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v1.AuxInt = int64ToAuxInt(-1)
-		v2 := b.NewValue0(v.Pos, OpPPC64CMPU, types.TypeFlags)
-		v3 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v3.AuxInt = int64ToAuxInt(8)
-		v2.AddArg2(y, v3)
-		v0.AddArg3(y, v1, v2)
-		v.AddArg2(x, v0)
+		v.reset(OpPPC64ISEL)
+		v.AuxInt = int32ToAuxInt(0)
+		v0 := b.NewValue0(v.Pos, OpPPC64SLD, t)
+		v1 := b.NewValue0(v.Pos, OpPPC64MOVBZreg, typ.Int64)
+		v1.AddArg(x)
+		v0.AddArg2(v1, y)
+		v2 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
+		v2.AuxInt = int64ToAuxInt(0)
+		v3 := b.NewValue0(v.Pos, OpPPC64CMPWUconst, types.TypeFlags)
+		v3.AuxInt = int32ToAuxInt(8)
+		v3.AddArg(y)
+		v.AddArg3(v0, v2, v3)
 		return true
 	}
 }
@@ -2972,33 +3225,35 @@
 	}
 	// match: (Lsh8x64 x y)
 	// cond: shiftIsBounded(v)
-	// result: (SLW x y)
+	// result: (SLD x y)
 	for {
 		x := v_0
 		y := v_1
 		if !(shiftIsBounded(v)) {
 			break
 		}
-		v.reset(OpPPC64SLW)
+		v.reset(OpPPC64SLD)
 		v.AddArg2(x, y)
 		return true
 	}
-	// match: (Lsh8x64 x y)
-	// result: (SLW x (ISEL [0] y (MOVDconst [-1]) (CMPU y (MOVDconst [8]))))
+	// match: (Lsh8x64 <t> x y)
+	// result: (ISEL [0] (SLD <t> (MOVBZreg x) y) (MOVDconst [0]) (CMPUconst y [8]))
 	for {
+		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpPPC64SLW)
-		v0 := b.NewValue0(v.Pos, OpPPC64ISEL, typ.Int32)
-		v0.AuxInt = int32ToAuxInt(0)
-		v1 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v1.AuxInt = int64ToAuxInt(-1)
-		v2 := b.NewValue0(v.Pos, OpPPC64CMPU, types.TypeFlags)
-		v3 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
+		v.reset(OpPPC64ISEL)
+		v.AuxInt = int32ToAuxInt(0)
+		v0 := b.NewValue0(v.Pos, OpPPC64SLD, t)
+		v1 := b.NewValue0(v.Pos, OpPPC64MOVBZreg, typ.Int64)
+		v1.AddArg(x)
+		v0.AddArg2(v1, y)
+		v2 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
+		v2.AuxInt = int64ToAuxInt(0)
+		v3 := b.NewValue0(v.Pos, OpPPC64CMPUconst, types.TypeFlags)
 		v3.AuxInt = int64ToAuxInt(8)
-		v2.AddArg2(y, v3)
-		v0.AddArg3(y, v1, v2)
-		v.AddArg2(x, v0)
+		v3.AddArg(y)
+		v.AddArg3(v0, v2, v3)
 		return true
 	}
 }
@@ -3009,35 +3264,37 @@
 	typ := &b.Func.Config.Types
 	// match: (Lsh8x8 x y)
 	// cond: shiftIsBounded(v)
-	// result: (SLW x y)
+	// result: (SLD x y)
 	for {
 		x := v_0
 		y := v_1
 		if !(shiftIsBounded(v)) {
 			break
 		}
-		v.reset(OpPPC64SLW)
+		v.reset(OpPPC64SLD)
 		v.AddArg2(x, y)
 		return true
 	}
-	// match: (Lsh8x8 x y)
-	// result: (SLW x (ISEL [0] y (MOVDconst [-1]) (CMPU (ZeroExt8to64 y) (MOVDconst [8]))))
+	// match: (Lsh8x8 <t> x y)
+	// result: (ISEL [2] (SLD <t> (MOVBZreg x) y) (MOVDconst [0]) (Select1 <types.TypeFlags> (ANDCCconst [0x00F8] y)))
 	for {
+		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpPPC64SLW)
-		v0 := b.NewValue0(v.Pos, OpPPC64ISEL, typ.Int32)
-		v0.AuxInt = int32ToAuxInt(0)
-		v1 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v1.AuxInt = int64ToAuxInt(-1)
-		v2 := b.NewValue0(v.Pos, OpPPC64CMPU, types.TypeFlags)
-		v3 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64)
-		v3.AddArg(y)
-		v4 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v4.AuxInt = int64ToAuxInt(8)
-		v2.AddArg2(v3, v4)
-		v0.AddArg3(y, v1, v2)
-		v.AddArg2(x, v0)
+		v.reset(OpPPC64ISEL)
+		v.AuxInt = int32ToAuxInt(2)
+		v0 := b.NewValue0(v.Pos, OpPPC64SLD, t)
+		v1 := b.NewValue0(v.Pos, OpPPC64MOVBZreg, typ.Int64)
+		v1.AddArg(x)
+		v0.AddArg2(v1, y)
+		v2 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
+		v2.AuxInt = int64ToAuxInt(0)
+		v3 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags)
+		v4 := b.NewValue0(v.Pos, OpPPC64ANDCCconst, types.NewTuple(typ.Int, types.TypeFlags))
+		v4.AuxInt = int64ToAuxInt(0x00F8)
+		v4.AddArg(y)
+		v3.AddArg(v4)
+		v.AddArg3(v0, v2, v3)
 		return true
 	}
 }
@@ -3487,13 +3744,13 @@
 	b := v.Block
 	typ := &b.Func.Config.Types
 	// match: (Neq16 x y)
-	// cond: isSigned(x.Type) && isSigned(y.Type)
+	// cond: x.Type.IsSigned() && y.Type.IsSigned()
 	// result: (NotEqual (CMPW (SignExt16to32 x) (SignExt16to32 y)))
 	for {
 		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
 			x := v_0
 			y := v_1
-			if !(isSigned(x.Type) && isSigned(y.Type)) {
+			if !(x.Type.IsSigned() && y.Type.IsSigned()) {
 				continue
 			}
 			v.reset(OpPPC64NotEqual)
@@ -3594,13 +3851,13 @@
 	b := v.Block
 	typ := &b.Func.Config.Types
 	// match: (Neq8 x y)
-	// cond: isSigned(x.Type) && isSigned(y.Type)
+	// cond: x.Type.IsSigned() && y.Type.IsSigned()
 	// result: (NotEqual (CMPW (SignExt8to32 x) (SignExt8to32 y)))
 	for {
 		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
 			x := v_0
 			y := v_1
-			if !(isSigned(x.Type) && isSigned(y.Type)) {
+			if !(x.Type.IsSigned() && y.Type.IsSigned()) {
 				continue
 			}
 			v.reset(OpPPC64NotEqual)
@@ -3699,8 +3956,8 @@
 		}
 		break
 	}
-	// match: (ADD x (MOVDconst [c]))
-	// cond: is32Bit(c)
+	// match: (ADD x (MOVDconst <t> [c]))
+	// cond: is32Bit(c) && !t.IsPtr()
 	// result: (ADDconst [c] x)
 	for {
 		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
@@ -3708,8 +3965,9 @@
 			if v_1.Op != OpPPC64MOVDconst {
 				continue
 			}
+			t := v_1.Type
 			c := auxIntToInt64(v_1.AuxInt)
-			if !(is32Bit(c)) {
+			if !(is32Bit(c) && !t.IsPtr()) {
 				continue
 			}
 			v.reset(OpPPC64ADDconst)
@@ -4049,6 +4307,28 @@
 	}
 	return false
 }
+func rewriteValuePPC64_OpPPC64ANDCCconst(v *Value) bool {
+	v_0 := v.Args[0]
+	// match: (ANDCCconst [c] (Select0 (ANDCCconst [d] x)))
+	// result: (ANDCCconst [c&d] x)
+	for {
+		c := auxIntToInt64(v.AuxInt)
+		if v_0.Op != OpSelect0 {
+			break
+		}
+		v_0_0 := v_0.Args[0]
+		if v_0_0.Op != OpPPC64ANDCCconst {
+			break
+		}
+		d := auxIntToInt64(v_0_0.AuxInt)
+		x := v_0_0.Args[0]
+		v.reset(OpPPC64ANDCCconst)
+		v.AuxInt = int64ToAuxInt(c & d)
+		v.AddArg(x)
+		return true
+	}
+	return false
+}
 func rewriteValuePPC64_OpPPC64ANDN(v *Value) bool {
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
@@ -4069,6 +4349,163 @@
 	}
 	return false
 }
+func rewriteValuePPC64_OpPPC64BRD(v *Value) bool {
+	v_0 := v.Args[0]
+	b := v.Block
+	typ := &b.Func.Config.Types
+	// match: (BRD x:(MOVDload [off] {sym} ptr mem))
+	// cond: x.Uses == 1
+	// result: @x.Block (MOVDBRload (MOVDaddr <ptr.Type> [off] {sym} ptr) mem)
+	for {
+		x := v_0
+		if x.Op != OpPPC64MOVDload {
+			break
+		}
+		off := auxIntToInt32(x.AuxInt)
+		sym := auxToSym(x.Aux)
+		mem := x.Args[1]
+		ptr := x.Args[0]
+		if !(x.Uses == 1) {
+			break
+		}
+		b = x.Block
+		v0 := b.NewValue0(x.Pos, OpPPC64MOVDBRload, typ.UInt64)
+		v.copyOf(v0)
+		v1 := b.NewValue0(x.Pos, OpPPC64MOVDaddr, ptr.Type)
+		v1.AuxInt = int32ToAuxInt(off)
+		v1.Aux = symToAux(sym)
+		v1.AddArg(ptr)
+		v0.AddArg2(v1, mem)
+		return true
+	}
+	// match: (BRD x:(MOVDloadidx ptr idx mem))
+	// cond: x.Uses == 1
+	// result: @x.Block (MOVDBRloadidx ptr idx mem)
+	for {
+		x := v_0
+		if x.Op != OpPPC64MOVDloadidx {
+			break
+		}
+		mem := x.Args[2]
+		ptr := x.Args[0]
+		idx := x.Args[1]
+		if !(x.Uses == 1) {
+			break
+		}
+		b = x.Block
+		v0 := b.NewValue0(v.Pos, OpPPC64MOVDBRloadidx, typ.Int64)
+		v.copyOf(v0)
+		v0.AddArg3(ptr, idx, mem)
+		return true
+	}
+	return false
+}
+func rewriteValuePPC64_OpPPC64BRH(v *Value) bool {
+	v_0 := v.Args[0]
+	b := v.Block
+	typ := &b.Func.Config.Types
+	// match: (BRH x:(MOVHZload [off] {sym} ptr mem))
+	// cond: x.Uses == 1
+	// result: @x.Block (MOVHBRload (MOVDaddr <ptr.Type> [off] {sym} ptr) mem)
+	for {
+		x := v_0
+		if x.Op != OpPPC64MOVHZload {
+			break
+		}
+		off := auxIntToInt32(x.AuxInt)
+		sym := auxToSym(x.Aux)
+		mem := x.Args[1]
+		ptr := x.Args[0]
+		if !(x.Uses == 1) {
+			break
+		}
+		b = x.Block
+		v0 := b.NewValue0(x.Pos, OpPPC64MOVHBRload, typ.UInt16)
+		v.copyOf(v0)
+		v1 := b.NewValue0(x.Pos, OpPPC64MOVDaddr, ptr.Type)
+		v1.AuxInt = int32ToAuxInt(off)
+		v1.Aux = symToAux(sym)
+		v1.AddArg(ptr)
+		v0.AddArg2(v1, mem)
+		return true
+	}
+	// match: (BRH x:(MOVHZloadidx ptr idx mem))
+	// cond: x.Uses == 1
+	// result: @x.Block (MOVHZreg (MOVHBRloadidx ptr idx mem))
+	for {
+		x := v_0
+		if x.Op != OpPPC64MOVHZloadidx {
+			break
+		}
+		mem := x.Args[2]
+		ptr := x.Args[0]
+		idx := x.Args[1]
+		if !(x.Uses == 1) {
+			break
+		}
+		b = x.Block
+		v0 := b.NewValue0(v.Pos, OpPPC64MOVHZreg, typ.Int64)
+		v.copyOf(v0)
+		v1 := b.NewValue0(v.Pos, OpPPC64MOVHBRloadidx, typ.Int16)
+		v1.AddArg3(ptr, idx, mem)
+		v0.AddArg(v1)
+		return true
+	}
+	return false
+}
+func rewriteValuePPC64_OpPPC64BRW(v *Value) bool {
+	v_0 := v.Args[0]
+	b := v.Block
+	typ := &b.Func.Config.Types
+	// match: (BRW x:(MOVWZload [off] {sym} ptr mem))
+	// cond: x.Uses == 1
+	// result: @x.Block (MOVWBRload (MOVDaddr <ptr.Type> [off] {sym} ptr) mem)
+	for {
+		x := v_0
+		if x.Op != OpPPC64MOVWZload {
+			break
+		}
+		off := auxIntToInt32(x.AuxInt)
+		sym := auxToSym(x.Aux)
+		mem := x.Args[1]
+		ptr := x.Args[0]
+		if !(x.Uses == 1) {
+			break
+		}
+		b = x.Block
+		v0 := b.NewValue0(x.Pos, OpPPC64MOVWBRload, typ.UInt32)
+		v.copyOf(v0)
+		v1 := b.NewValue0(x.Pos, OpPPC64MOVDaddr, ptr.Type)
+		v1.AuxInt = int32ToAuxInt(off)
+		v1.Aux = symToAux(sym)
+		v1.AddArg(ptr)
+		v0.AddArg2(v1, mem)
+		return true
+	}
+	// match: (BRW x:(MOVWZloadidx ptr idx mem))
+	// cond: x.Uses == 1
+	// result: @x.Block (MOVWZreg (MOVWBRloadidx ptr idx mem))
+	for {
+		x := v_0
+		if x.Op != OpPPC64MOVWZloadidx {
+			break
+		}
+		mem := x.Args[2]
+		ptr := x.Args[0]
+		idx := x.Args[1]
+		if !(x.Uses == 1) {
+			break
+		}
+		b = x.Block
+		v0 := b.NewValue0(v.Pos, OpPPC64MOVWZreg, typ.Int64)
+		v.copyOf(v0)
+		v1 := b.NewValue0(v.Pos, OpPPC64MOVWBRloadidx, typ.Int32)
+		v1.AddArg3(ptr, idx, mem)
+		v0.AddArg(v1)
+		return true
+	}
+	return false
+}
 func rewriteValuePPC64_OpPPC64CLRLSLDI(v *Value) bool {
 	v_0 := v.Args[0]
 	// match: (CLRLSLDI [c] (SRWconst [s] x))
@@ -4226,6 +4663,25 @@
 }
 func rewriteValuePPC64_OpPPC64CMPUconst(v *Value) bool {
 	v_0 := v.Args[0]
+	// match: (CMPUconst [d] (Select0 (ANDCCconst z [c])))
+	// cond: uint64(d) > uint64(c)
+	// result: (FlagLT)
+	for {
+		d := auxIntToInt64(v.AuxInt)
+		if v_0.Op != OpSelect0 {
+			break
+		}
+		v_0_0 := v_0.Args[0]
+		if v_0_0.Op != OpPPC64ANDCCconst {
+			break
+		}
+		c := auxIntToInt64(v_0_0.AuxInt)
+		if !(uint64(d) > uint64(c)) {
+			break
+		}
+		v.reset(OpPPC64FlagLT)
+		return true
+	}
 	// match: (CMPUconst (MOVDconst [x]) [y])
 	// cond: x==y
 	// result: (FlagEQ)
@@ -4437,6 +4893,25 @@
 }
 func rewriteValuePPC64_OpPPC64CMPWUconst(v *Value) bool {
 	v_0 := v.Args[0]
+	// match: (CMPWUconst [d] (Select0 (ANDCCconst z [c])))
+	// cond: uint64(d) > uint64(c)
+	// result: (FlagLT)
+	for {
+		d := auxIntToInt32(v.AuxInt)
+		if v_0.Op != OpSelect0 {
+			break
+		}
+		v_0_0 := v_0.Args[0]
+		if v_0_0.Op != OpPPC64ANDCCconst {
+			break
+		}
+		c := auxIntToInt64(v_0_0.AuxInt)
+		if !(uint64(d) > uint64(c)) {
+			break
+		}
+		v.reset(OpPPC64FlagLT)
+		return true
+	}
 	// match: (CMPWUconst (MOVDconst [x]) [y])
 	// cond: int32(x)==int32(y)
 	// result: (FlagEQ)
@@ -4584,8 +5059,6 @@
 }
 func rewriteValuePPC64_OpPPC64Equal(v *Value) bool {
 	v_0 := v.Args[0]
-	b := v.Block
-	typ := &b.Func.Config.Types
 	// match: (Equal (FlagEQ))
 	// result: (MOVDconst [1])
 	for {
@@ -4628,14 +5101,12 @@
 		return true
 	}
 	// match: (Equal cmp)
-	// result: (ISELB [2] (MOVDconst [1]) cmp)
+	// result: (SETBC [2] cmp)
 	for {
 		cmp := v_0
-		v.reset(OpPPC64ISELB)
+		v.reset(OpPPC64SETBC)
 		v.AuxInt = int32ToAuxInt(2)
-		v0 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v0.AuxInt = int64ToAuxInt(1)
-		v.AddArg2(v0, cmp)
+		v.AddArg(cmp)
 		return true
 	}
 }
@@ -4749,33 +5220,29 @@
 	b := v.Block
 	typ := &b.Func.Config.Types
 	// match: (FGreaterEqual cmp)
-	// result: (ISEL [2] (MOVDconst [1]) (ISELB [1] (MOVDconst [1]) cmp) cmp)
+	// result: (OR (SETBC [2] cmp) (SETBC [1] cmp))
 	for {
 		cmp := v_0
-		v.reset(OpPPC64ISEL)
-		v.AuxInt = int32ToAuxInt(2)
-		v0 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v0.AuxInt = int64ToAuxInt(1)
-		v1 := b.NewValue0(v.Pos, OpPPC64ISELB, typ.Int32)
+		v.reset(OpPPC64OR)
+		v0 := b.NewValue0(v.Pos, OpPPC64SETBC, typ.Int32)
+		v0.AuxInt = int32ToAuxInt(2)
+		v0.AddArg(cmp)
+		v1 := b.NewValue0(v.Pos, OpPPC64SETBC, typ.Int32)
 		v1.AuxInt = int32ToAuxInt(1)
-		v1.AddArg2(v0, cmp)
-		v.AddArg3(v0, v1, cmp)
+		v1.AddArg(cmp)
+		v.AddArg2(v0, v1)
 		return true
 	}
 }
 func rewriteValuePPC64_OpPPC64FGreaterThan(v *Value) bool {
 	v_0 := v.Args[0]
-	b := v.Block
-	typ := &b.Func.Config.Types
 	// match: (FGreaterThan cmp)
-	// result: (ISELB [1] (MOVDconst [1]) cmp)
+	// result: (SETBC [1] cmp)
 	for {
 		cmp := v_0
-		v.reset(OpPPC64ISELB)
+		v.reset(OpPPC64SETBC)
 		v.AuxInt = int32ToAuxInt(1)
-		v0 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v0.AuxInt = int64ToAuxInt(1)
-		v.AddArg2(v0, cmp)
+		v.AddArg(cmp)
 		return true
 	}
 }
@@ -4784,33 +5251,29 @@
 	b := v.Block
 	typ := &b.Func.Config.Types
 	// match: (FLessEqual cmp)
-	// result: (ISEL [2] (MOVDconst [1]) (ISELB [0] (MOVDconst [1]) cmp) cmp)
+	// result: (OR (SETBC [2] cmp) (SETBC [0] cmp))
 	for {
 		cmp := v_0
-		v.reset(OpPPC64ISEL)
-		v.AuxInt = int32ToAuxInt(2)
-		v0 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v0.AuxInt = int64ToAuxInt(1)
-		v1 := b.NewValue0(v.Pos, OpPPC64ISELB, typ.Int32)
+		v.reset(OpPPC64OR)
+		v0 := b.NewValue0(v.Pos, OpPPC64SETBC, typ.Int32)
+		v0.AuxInt = int32ToAuxInt(2)
+		v0.AddArg(cmp)
+		v1 := b.NewValue0(v.Pos, OpPPC64SETBC, typ.Int32)
 		v1.AuxInt = int32ToAuxInt(0)
-		v1.AddArg2(v0, cmp)
-		v.AddArg3(v0, v1, cmp)
+		v1.AddArg(cmp)
+		v.AddArg2(v0, v1)
 		return true
 	}
 }
 func rewriteValuePPC64_OpPPC64FLessThan(v *Value) bool {
 	v_0 := v.Args[0]
-	b := v.Block
-	typ := &b.Func.Config.Types
 	// match: (FLessThan cmp)
-	// result: (ISELB [0] (MOVDconst [1]) cmp)
+	// result: (SETBC [0] cmp)
 	for {
 		cmp := v_0
-		v.reset(OpPPC64ISELB)
+		v.reset(OpPPC64SETBC)
 		v.AuxInt = int32ToAuxInt(0)
-		v0 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v0.AuxInt = int64ToAuxInt(1)
-		v.AddArg2(v0, cmp)
+		v.AddArg(cmp)
 		return true
 	}
 }
@@ -4835,7 +5298,7 @@
 		return true
 	}
 	// match: (FMOVDload [off1] {sym1} p:(MOVDaddr [off2] {sym2} ptr) mem)
-	// cond: canMergeSym(sym1,sym2) && is16Bit(int64(off1+off2)) && (ptr.Op != OpSB || p.Uses == 1)
+	// cond: canMergeSym(sym1,sym2) && ((is16Bit(int64(off1+off2)) && (ptr.Op != OpSB || p.Uses == 1)) || (supportsPPC64PCRel() && is32Bit(int64(off1+off2))))
 	// result: (FMOVDload [off1+off2] {mergeSym(sym1,sym2)} ptr mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -4848,7 +5311,7 @@
 		sym2 := auxToSym(p.Aux)
 		ptr := p.Args[0]
 		mem := v_1
-		if !(canMergeSym(sym1, sym2) && is16Bit(int64(off1+off2)) && (ptr.Op != OpSB || p.Uses == 1)) {
+		if !(canMergeSym(sym1, sym2) && ((is16Bit(int64(off1+off2)) && (ptr.Op != OpSB || p.Uses == 1)) || (supportsPPC64PCRel() && is32Bit(int64(off1+off2))))) {
 			break
 		}
 		v.reset(OpPPC64FMOVDload)
@@ -4858,7 +5321,7 @@
 		return true
 	}
 	// match: (FMOVDload [off1] {sym} (ADDconst [off2] ptr) mem)
-	// cond: is16Bit(int64(off1)+off2)
+	// cond: (is16Bit(int64(off1)+off2) || (supportsPPC64PCRel() && is32Bit(int64(off1)+off2)))
 	// result: (FMOVDload [off1+int32(off2)] {sym} ptr mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -4869,7 +5332,7 @@
 		off2 := auxIntToInt64(v_0.AuxInt)
 		ptr := v_0.Args[0]
 		mem := v_1
-		if !(is16Bit(int64(off1) + off2)) {
+		if !(is16Bit(int64(off1)+off2) || (supportsPPC64PCRel() && is32Bit(int64(off1)+off2))) {
 			break
 		}
 		v.reset(OpPPC64FMOVDload)
@@ -4902,7 +5365,7 @@
 		return true
 	}
 	// match: (FMOVDstore [off1] {sym} (ADDconst [off2] ptr) val mem)
-	// cond: is16Bit(int64(off1)+off2)
+	// cond: (is16Bit(int64(off1)+off2) || (supportsPPC64PCRel() && is32Bit(int64(off1)+off2)))
 	// result: (FMOVDstore [off1+int32(off2)] {sym} ptr val mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -4914,7 +5377,7 @@
 		ptr := v_0.Args[0]
 		val := v_1
 		mem := v_2
-		if !(is16Bit(int64(off1) + off2)) {
+		if !(is16Bit(int64(off1)+off2) || (supportsPPC64PCRel() && is32Bit(int64(off1)+off2))) {
 			break
 		}
 		v.reset(OpPPC64FMOVDstore)
@@ -4924,7 +5387,7 @@
 		return true
 	}
 	// match: (FMOVDstore [off1] {sym1} p:(MOVDaddr [off2] {sym2} ptr) val mem)
-	// cond: canMergeSym(sym1,sym2) && is16Bit(int64(off1+off2)) && (ptr.Op != OpSB || p.Uses == 1)
+	// cond: canMergeSym(sym1,sym2) && ((is16Bit(int64(off1+off2)) && (ptr.Op != OpSB || p.Uses == 1)) || (supportsPPC64PCRel() && is32Bit(int64(off1+off2))))
 	// result: (FMOVDstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -4938,7 +5401,7 @@
 		ptr := p.Args[0]
 		val := v_1
 		mem := v_2
-		if !(canMergeSym(sym1, sym2) && is16Bit(int64(off1+off2)) && (ptr.Op != OpSB || p.Uses == 1)) {
+		if !(canMergeSym(sym1, sym2) && ((is16Bit(int64(off1+off2)) && (ptr.Op != OpSB || p.Uses == 1)) || (supportsPPC64PCRel() && is32Bit(int64(off1+off2))))) {
 			break
 		}
 		v.reset(OpPPC64FMOVDstore)
@@ -4953,7 +5416,7 @@
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
 	// match: (FMOVSload [off1] {sym1} p:(MOVDaddr [off2] {sym2} ptr) mem)
-	// cond: canMergeSym(sym1,sym2) && is16Bit(int64(off1+off2)) && (ptr.Op != OpSB || p.Uses == 1)
+	// cond: canMergeSym(sym1,sym2) && ((is16Bit(int64(off1+off2)) && (ptr.Op != OpSB || p.Uses == 1)) || (supportsPPC64PCRel() && is32Bit(int64(off1+off2))))
 	// result: (FMOVSload [off1+off2] {mergeSym(sym1,sym2)} ptr mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -4966,7 +5429,7 @@
 		sym2 := auxToSym(p.Aux)
 		ptr := p.Args[0]
 		mem := v_1
-		if !(canMergeSym(sym1, sym2) && is16Bit(int64(off1+off2)) && (ptr.Op != OpSB || p.Uses == 1)) {
+		if !(canMergeSym(sym1, sym2) && ((is16Bit(int64(off1+off2)) && (ptr.Op != OpSB || p.Uses == 1)) || (supportsPPC64PCRel() && is32Bit(int64(off1+off2))))) {
 			break
 		}
 		v.reset(OpPPC64FMOVSload)
@@ -4976,7 +5439,7 @@
 		return true
 	}
 	// match: (FMOVSload [off1] {sym} (ADDconst [off2] ptr) mem)
-	// cond: is16Bit(int64(off1)+off2)
+	// cond: (is16Bit(int64(off1)+off2) || (supportsPPC64PCRel() && is32Bit(int64(off1)+off2)))
 	// result: (FMOVSload [off1+int32(off2)] {sym} ptr mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -4987,7 +5450,7 @@
 		off2 := auxIntToInt64(v_0.AuxInt)
 		ptr := v_0.Args[0]
 		mem := v_1
-		if !(is16Bit(int64(off1) + off2)) {
+		if !(is16Bit(int64(off1)+off2) || (supportsPPC64PCRel() && is32Bit(int64(off1)+off2))) {
 			break
 		}
 		v.reset(OpPPC64FMOVSload)
@@ -5003,7 +5466,7 @@
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
 	// match: (FMOVSstore [off1] {sym} (ADDconst [off2] ptr) val mem)
-	// cond: is16Bit(int64(off1)+off2)
+	// cond: (is16Bit(int64(off1)+off2) || (supportsPPC64PCRel() && is32Bit(int64(off1)+off2)))
 	// result: (FMOVSstore [off1+int32(off2)] {sym} ptr val mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -5015,7 +5478,7 @@
 		ptr := v_0.Args[0]
 		val := v_1
 		mem := v_2
-		if !(is16Bit(int64(off1) + off2)) {
+		if !(is16Bit(int64(off1)+off2) || (supportsPPC64PCRel() && is32Bit(int64(off1)+off2))) {
 			break
 		}
 		v.reset(OpPPC64FMOVSstore)
@@ -5025,7 +5488,7 @@
 		return true
 	}
 	// match: (FMOVSstore [off1] {sym1} p:(MOVDaddr [off2] {sym2} ptr) val mem)
-	// cond: canMergeSym(sym1,sym2) && is16Bit(int64(off1+off2)) && (ptr.Op != OpSB || p.Uses == 1)
+	// cond: canMergeSym(sym1,sym2) && ((is16Bit(int64(off1+off2)) && (ptr.Op != OpSB || p.Uses == 1)) || (supportsPPC64PCRel() && is32Bit(int64(off1+off2))))
 	// result: (FMOVSstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -5039,7 +5502,7 @@
 		ptr := p.Args[0]
 		val := v_1
 		mem := v_2
-		if !(canMergeSym(sym1, sym2) && is16Bit(int64(off1+off2)) && (ptr.Op != OpSB || p.Uses == 1)) {
+		if !(canMergeSym(sym1, sym2) && ((is16Bit(int64(off1+off2)) && (ptr.Op != OpSB || p.Uses == 1)) || (supportsPPC64PCRel() && is32Bit(int64(off1+off2))))) {
 			break
 		}
 		v.reset(OpPPC64FMOVSstore)
@@ -5168,8 +5631,6 @@
 }
 func rewriteValuePPC64_OpPPC64GreaterEqual(v *Value) bool {
 	v_0 := v.Args[0]
-	b := v.Block
-	typ := &b.Func.Config.Types
 	// match: (GreaterEqual (FlagEQ))
 	// result: (MOVDconst [1])
 	for {
@@ -5212,21 +5673,17 @@
 		return true
 	}
 	// match: (GreaterEqual cmp)
-	// result: (ISELB [4] (MOVDconst [1]) cmp)
+	// result: (SETBCR [0] cmp)
 	for {
 		cmp := v_0
-		v.reset(OpPPC64ISELB)
-		v.AuxInt = int32ToAuxInt(4)
-		v0 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v0.AuxInt = int64ToAuxInt(1)
-		v.AddArg2(v0, cmp)
+		v.reset(OpPPC64SETBCR)
+		v.AuxInt = int32ToAuxInt(0)
+		v.AddArg(cmp)
 		return true
 	}
 }
 func rewriteValuePPC64_OpPPC64GreaterThan(v *Value) bool {
 	v_0 := v.Args[0]
-	b := v.Block
-	typ := &b.Func.Config.Types
 	// match: (GreaterThan (FlagEQ))
 	// result: (MOVDconst [0])
 	for {
@@ -5269,14 +5726,12 @@
 		return true
 	}
 	// match: (GreaterThan cmp)
-	// result: (ISELB [1] (MOVDconst [1]) cmp)
+	// result: (SETBC [1] cmp)
 	for {
 		cmp := v_0
-		v.reset(OpPPC64ISELB)
+		v.reset(OpPPC64SETBC)
 		v.AuxInt = int32ToAuxInt(1)
-		v0 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v0.AuxInt = int64ToAuxInt(1)
-		v.AddArg2(v0, cmp)
+		v.AddArg(cmp)
 		return true
 	}
 }
@@ -5286,79 +5741,7 @@
 	v_0 := v.Args[0]
 	b := v.Block
 	typ := &b.Func.Config.Types
-	// match: (ISEL [0] (Select0 (ANDCCconst [d] y)) (MOVDconst [-1]) (CMPU (Select0 (ANDCCconst [d] y)) (MOVDconst [c])))
-	// cond: c >= d
-	// result: (Select0 (ANDCCconst [d] y))
-	for {
-		if auxIntToInt32(v.AuxInt) != 0 || v_0.Op != OpSelect0 {
-			break
-		}
-		v_0_0 := v_0.Args[0]
-		if v_0_0.Op != OpPPC64ANDCCconst {
-			break
-		}
-		d := auxIntToInt64(v_0_0.AuxInt)
-		y := v_0_0.Args[0]
-		if v_1.Op != OpPPC64MOVDconst || auxIntToInt64(v_1.AuxInt) != -1 || v_2.Op != OpPPC64CMPU {
-			break
-		}
-		_ = v_2.Args[1]
-		v_2_0 := v_2.Args[0]
-		if v_2_0.Op != OpSelect0 {
-			break
-		}
-		v_2_0_0 := v_2_0.Args[0]
-		if v_2_0_0.Op != OpPPC64ANDCCconst || auxIntToInt64(v_2_0_0.AuxInt) != d || y != v_2_0_0.Args[0] {
-			break
-		}
-		v_2_1 := v_2.Args[1]
-		if v_2_1.Op != OpPPC64MOVDconst {
-			break
-		}
-		c := auxIntToInt64(v_2_1.AuxInt)
-		if !(c >= d) {
-			break
-		}
-		v.reset(OpSelect0)
-		v0 := b.NewValue0(v.Pos, OpPPC64ANDCCconst, types.NewTuple(typ.Int, types.TypeFlags))
-		v0.AuxInt = int64ToAuxInt(d)
-		v0.AddArg(y)
-		v.AddArg(v0)
-		return true
-	}
-	// match: (ISEL [0] (Select0 (ANDCCconst [d] y)) (MOVDconst [-1]) (CMPUconst [c] (Select0 (ANDCCconst [d] y))))
-	// cond: c >= d
-	// result: (Select0 (ANDCCconst [d] y))
-	for {
-		if auxIntToInt32(v.AuxInt) != 0 || v_0.Op != OpSelect0 {
-			break
-		}
-		v_0_0 := v_0.Args[0]
-		if v_0_0.Op != OpPPC64ANDCCconst {
-			break
-		}
-		d := auxIntToInt64(v_0_0.AuxInt)
-		y := v_0_0.Args[0]
-		if v_1.Op != OpPPC64MOVDconst || auxIntToInt64(v_1.AuxInt) != -1 || v_2.Op != OpPPC64CMPUconst {
-			break
-		}
-		c := auxIntToInt64(v_2.AuxInt)
-		v_2_0 := v_2.Args[0]
-		if v_2_0.Op != OpSelect0 {
-			break
-		}
-		v_2_0_0 := v_2_0.Args[0]
-		if v_2_0_0.Op != OpPPC64ANDCCconst || auxIntToInt64(v_2_0_0.AuxInt) != d || y != v_2_0_0.Args[0] || !(c >= d) {
-			break
-		}
-		v.reset(OpSelect0)
-		v0 := b.NewValue0(v.Pos, OpPPC64ANDCCconst, types.NewTuple(typ.Int, types.TypeFlags))
-		v0.AuxInt = int64ToAuxInt(d)
-		v0.AddArg(y)
-		v.AddArg(v0)
-		return true
-	}
-	// match: (ISEL [6] x y (Select1 (ANDCCconst [1] (ISELB [c] one cmp))))
+	// match: (ISEL [6] x y (Select1 (ANDCCconst [1] (SETBC [c] cmp))))
 	// result: (ISEL [c] x y cmp)
 	for {
 		if auxIntToInt32(v.AuxInt) != 6 {
@@ -5374,16 +5757,104 @@
 			break
 		}
 		v_2_0_0 := v_2_0.Args[0]
-		if v_2_0_0.Op != OpPPC64ISELB {
+		if v_2_0_0.Op != OpPPC64SETBC {
 			break
 		}
 		c := auxIntToInt32(v_2_0_0.AuxInt)
-		cmp := v_2_0_0.Args[1]
+		cmp := v_2_0_0.Args[0]
 		v.reset(OpPPC64ISEL)
 		v.AuxInt = int32ToAuxInt(c)
 		v.AddArg3(x, y, cmp)
 		return true
 	}
+	// match: (ISEL [6] x y (CMPconst [0] (SETBC [c] cmp)))
+	// result: (ISEL [c] x y cmp)
+	for {
+		if auxIntToInt32(v.AuxInt) != 6 {
+			break
+		}
+		x := v_0
+		y := v_1
+		if v_2.Op != OpPPC64CMPconst || auxIntToInt64(v_2.AuxInt) != 0 {
+			break
+		}
+		v_2_0 := v_2.Args[0]
+		if v_2_0.Op != OpPPC64SETBC {
+			break
+		}
+		c := auxIntToInt32(v_2_0.AuxInt)
+		cmp := v_2_0.Args[0]
+		v.reset(OpPPC64ISEL)
+		v.AuxInt = int32ToAuxInt(c)
+		v.AddArg3(x, y, cmp)
+		return true
+	}
+	// match: (ISEL [6] x y (CMPWconst [0] (SETBC [c] cmp)))
+	// result: (ISEL [c] x y cmp)
+	for {
+		if auxIntToInt32(v.AuxInt) != 6 {
+			break
+		}
+		x := v_0
+		y := v_1
+		if v_2.Op != OpPPC64CMPWconst || auxIntToInt32(v_2.AuxInt) != 0 {
+			break
+		}
+		v_2_0 := v_2.Args[0]
+		if v_2_0.Op != OpPPC64SETBC {
+			break
+		}
+		c := auxIntToInt32(v_2_0.AuxInt)
+		cmp := v_2_0.Args[0]
+		v.reset(OpPPC64ISEL)
+		v.AuxInt = int32ToAuxInt(c)
+		v.AddArg3(x, y, cmp)
+		return true
+	}
+	// match: (ISEL [6] x y (CMPconst [0] (SETBCR [c] cmp)))
+	// result: (ISEL [c+4] x y cmp)
+	for {
+		if auxIntToInt32(v.AuxInt) != 6 {
+			break
+		}
+		x := v_0
+		y := v_1
+		if v_2.Op != OpPPC64CMPconst || auxIntToInt64(v_2.AuxInt) != 0 {
+			break
+		}
+		v_2_0 := v_2.Args[0]
+		if v_2_0.Op != OpPPC64SETBCR {
+			break
+		}
+		c := auxIntToInt32(v_2_0.AuxInt)
+		cmp := v_2_0.Args[0]
+		v.reset(OpPPC64ISEL)
+		v.AuxInt = int32ToAuxInt(c + 4)
+		v.AddArg3(x, y, cmp)
+		return true
+	}
+	// match: (ISEL [6] x y (CMPWconst [0] (SETBCR [c] cmp)))
+	// result: (ISEL [c+4] x y cmp)
+	for {
+		if auxIntToInt32(v.AuxInt) != 6 {
+			break
+		}
+		x := v_0
+		y := v_1
+		if v_2.Op != OpPPC64CMPWconst || auxIntToInt32(v_2.AuxInt) != 0 {
+			break
+		}
+		v_2_0 := v_2.Args[0]
+		if v_2_0.Op != OpPPC64SETBCR {
+			break
+		}
+		c := auxIntToInt32(v_2_0.AuxInt)
+		cmp := v_2_0.Args[0]
+		v.reset(OpPPC64ISEL)
+		v.AuxInt = int32ToAuxInt(c + 4)
+		v.AddArg3(x, y, cmp)
+		return true
+	}
 	// match: (ISEL [2] x _ (FlagEQ))
 	// result: x
 	for {
@@ -5801,596 +6272,8 @@
 	}
 	return false
 }
-func rewriteValuePPC64_OpPPC64ISELB(v *Value) bool {
-	v_1 := v.Args[1]
-	v_0 := v.Args[0]
-	b := v.Block
-	typ := &b.Func.Config.Types
-	// match: (ISELB [0] _ (FlagLT))
-	// result: (MOVDconst [1])
-	for {
-		if auxIntToInt32(v.AuxInt) != 0 || v_1.Op != OpPPC64FlagLT {
-			break
-		}
-		v.reset(OpPPC64MOVDconst)
-		v.AuxInt = int64ToAuxInt(1)
-		return true
-	}
-	// match: (ISELB [0] _ (FlagGT))
-	// result: (MOVDconst [0])
-	for {
-		if auxIntToInt32(v.AuxInt) != 0 || v_1.Op != OpPPC64FlagGT {
-			break
-		}
-		v.reset(OpPPC64MOVDconst)
-		v.AuxInt = int64ToAuxInt(0)
-		return true
-	}
-	// match: (ISELB [0] _ (FlagEQ))
-	// result: (MOVDconst [0])
-	for {
-		if auxIntToInt32(v.AuxInt) != 0 || v_1.Op != OpPPC64FlagEQ {
-			break
-		}
-		v.reset(OpPPC64MOVDconst)
-		v.AuxInt = int64ToAuxInt(0)
-		return true
-	}
-	// match: (ISELB [1] _ (FlagGT))
-	// result: (MOVDconst [1])
-	for {
-		if auxIntToInt32(v.AuxInt) != 1 || v_1.Op != OpPPC64FlagGT {
-			break
-		}
-		v.reset(OpPPC64MOVDconst)
-		v.AuxInt = int64ToAuxInt(1)
-		return true
-	}
-	// match: (ISELB [1] _ (FlagLT))
-	// result: (MOVDconst [0])
-	for {
-		if auxIntToInt32(v.AuxInt) != 1 || v_1.Op != OpPPC64FlagLT {
-			break
-		}
-		v.reset(OpPPC64MOVDconst)
-		v.AuxInt = int64ToAuxInt(0)
-		return true
-	}
-	// match: (ISELB [1] _ (FlagEQ))
-	// result: (MOVDconst [0])
-	for {
-		if auxIntToInt32(v.AuxInt) != 1 || v_1.Op != OpPPC64FlagEQ {
-			break
-		}
-		v.reset(OpPPC64MOVDconst)
-		v.AuxInt = int64ToAuxInt(0)
-		return true
-	}
-	// match: (ISELB [2] _ (FlagEQ))
-	// result: (MOVDconst [1])
-	for {
-		if auxIntToInt32(v.AuxInt) != 2 || v_1.Op != OpPPC64FlagEQ {
-			break
-		}
-		v.reset(OpPPC64MOVDconst)
-		v.AuxInt = int64ToAuxInt(1)
-		return true
-	}
-	// match: (ISELB [2] _ (FlagLT))
-	// result: (MOVDconst [0])
-	for {
-		if auxIntToInt32(v.AuxInt) != 2 || v_1.Op != OpPPC64FlagLT {
-			break
-		}
-		v.reset(OpPPC64MOVDconst)
-		v.AuxInt = int64ToAuxInt(0)
-		return true
-	}
-	// match: (ISELB [2] _ (FlagGT))
-	// result: (MOVDconst [0])
-	for {
-		if auxIntToInt32(v.AuxInt) != 2 || v_1.Op != OpPPC64FlagGT {
-			break
-		}
-		v.reset(OpPPC64MOVDconst)
-		v.AuxInt = int64ToAuxInt(0)
-		return true
-	}
-	// match: (ISELB [4] _ (FlagLT))
-	// result: (MOVDconst [0])
-	for {
-		if auxIntToInt32(v.AuxInt) != 4 || v_1.Op != OpPPC64FlagLT {
-			break
-		}
-		v.reset(OpPPC64MOVDconst)
-		v.AuxInt = int64ToAuxInt(0)
-		return true
-	}
-	// match: (ISELB [4] _ (FlagGT))
-	// result: (MOVDconst [1])
-	for {
-		if auxIntToInt32(v.AuxInt) != 4 || v_1.Op != OpPPC64FlagGT {
-			break
-		}
-		v.reset(OpPPC64MOVDconst)
-		v.AuxInt = int64ToAuxInt(1)
-		return true
-	}
-	// match: (ISELB [4] _ (FlagEQ))
-	// result: (MOVDconst [1])
-	for {
-		if auxIntToInt32(v.AuxInt) != 4 || v_1.Op != OpPPC64FlagEQ {
-			break
-		}
-		v.reset(OpPPC64MOVDconst)
-		v.AuxInt = int64ToAuxInt(1)
-		return true
-	}
-	// match: (ISELB [5] _ (FlagGT))
-	// result: (MOVDconst [0])
-	for {
-		if auxIntToInt32(v.AuxInt) != 5 || v_1.Op != OpPPC64FlagGT {
-			break
-		}
-		v.reset(OpPPC64MOVDconst)
-		v.AuxInt = int64ToAuxInt(0)
-		return true
-	}
-	// match: (ISELB [5] _ (FlagLT))
-	// result: (MOVDconst [1])
-	for {
-		if auxIntToInt32(v.AuxInt) != 5 || v_1.Op != OpPPC64FlagLT {
-			break
-		}
-		v.reset(OpPPC64MOVDconst)
-		v.AuxInt = int64ToAuxInt(1)
-		return true
-	}
-	// match: (ISELB [5] _ (FlagEQ))
-	// result: (MOVDconst [1])
-	for {
-		if auxIntToInt32(v.AuxInt) != 5 || v_1.Op != OpPPC64FlagEQ {
-			break
-		}
-		v.reset(OpPPC64MOVDconst)
-		v.AuxInt = int64ToAuxInt(1)
-		return true
-	}
-	// match: (ISELB [6] _ (FlagEQ))
-	// result: (MOVDconst [0])
-	for {
-		if auxIntToInt32(v.AuxInt) != 6 || v_1.Op != OpPPC64FlagEQ {
-			break
-		}
-		v.reset(OpPPC64MOVDconst)
-		v.AuxInt = int64ToAuxInt(0)
-		return true
-	}
-	// match: (ISELB [6] _ (FlagLT))
-	// result: (MOVDconst [1])
-	for {
-		if auxIntToInt32(v.AuxInt) != 6 || v_1.Op != OpPPC64FlagLT {
-			break
-		}
-		v.reset(OpPPC64MOVDconst)
-		v.AuxInt = int64ToAuxInt(1)
-		return true
-	}
-	// match: (ISELB [6] _ (FlagGT))
-	// result: (MOVDconst [1])
-	for {
-		if auxIntToInt32(v.AuxInt) != 6 || v_1.Op != OpPPC64FlagGT {
-			break
-		}
-		v.reset(OpPPC64MOVDconst)
-		v.AuxInt = int64ToAuxInt(1)
-		return true
-	}
-	// match: (ISELB [2] x (CMPconst [0] (Select0 (ANDCCconst [1] z))))
-	// result: (XORconst [1] (Select0 <typ.UInt64> (ANDCCconst [1] z )))
-	for {
-		if auxIntToInt32(v.AuxInt) != 2 {
-			break
-		}
-		if v_1.Op != OpPPC64CMPconst || auxIntToInt64(v_1.AuxInt) != 0 {
-			break
-		}
-		v_1_0 := v_1.Args[0]
-		if v_1_0.Op != OpSelect0 {
-			break
-		}
-		v_1_0_0 := v_1_0.Args[0]
-		if v_1_0_0.Op != OpPPC64ANDCCconst || auxIntToInt64(v_1_0_0.AuxInt) != 1 {
-			break
-		}
-		z := v_1_0_0.Args[0]
-		v.reset(OpPPC64XORconst)
-		v.AuxInt = int64ToAuxInt(1)
-		v0 := b.NewValue0(v.Pos, OpSelect0, typ.UInt64)
-		v1 := b.NewValue0(v.Pos, OpPPC64ANDCCconst, types.NewTuple(typ.Int, types.TypeFlags))
-		v1.AuxInt = int64ToAuxInt(1)
-		v1.AddArg(z)
-		v0.AddArg(v1)
-		v.AddArg(v0)
-		return true
-	}
-	// match: (ISELB [2] x (CMPWconst [0] (Select0 (ANDCCconst [1] z))))
-	// result: (XORconst [1] (Select0 <typ.UInt64> (ANDCCconst [1] z )))
-	for {
-		if auxIntToInt32(v.AuxInt) != 2 {
-			break
-		}
-		if v_1.Op != OpPPC64CMPWconst || auxIntToInt32(v_1.AuxInt) != 0 {
-			break
-		}
-		v_1_0 := v_1.Args[0]
-		if v_1_0.Op != OpSelect0 {
-			break
-		}
-		v_1_0_0 := v_1_0.Args[0]
-		if v_1_0_0.Op != OpPPC64ANDCCconst || auxIntToInt64(v_1_0_0.AuxInt) != 1 {
-			break
-		}
-		z := v_1_0_0.Args[0]
-		v.reset(OpPPC64XORconst)
-		v.AuxInt = int64ToAuxInt(1)
-		v0 := b.NewValue0(v.Pos, OpSelect0, typ.UInt64)
-		v1 := b.NewValue0(v.Pos, OpPPC64ANDCCconst, types.NewTuple(typ.Int, types.TypeFlags))
-		v1.AuxInt = int64ToAuxInt(1)
-		v1.AddArg(z)
-		v0.AddArg(v1)
-		v.AddArg(v0)
-		return true
-	}
-	// match: (ISELB [6] x (CMPconst [0] (Select0 (ANDCCconst [1] z))))
-	// result: (Select0 <typ.UInt64> (ANDCCconst [1] z ))
-	for {
-		if auxIntToInt32(v.AuxInt) != 6 {
-			break
-		}
-		if v_1.Op != OpPPC64CMPconst || auxIntToInt64(v_1.AuxInt) != 0 {
-			break
-		}
-		v_1_0 := v_1.Args[0]
-		if v_1_0.Op != OpSelect0 {
-			break
-		}
-		v_1_0_0 := v_1_0.Args[0]
-		if v_1_0_0.Op != OpPPC64ANDCCconst || auxIntToInt64(v_1_0_0.AuxInt) != 1 {
-			break
-		}
-		z := v_1_0_0.Args[0]
-		v.reset(OpSelect0)
-		v.Type = typ.UInt64
-		v0 := b.NewValue0(v.Pos, OpPPC64ANDCCconst, types.NewTuple(typ.Int, types.TypeFlags))
-		v0.AuxInt = int64ToAuxInt(1)
-		v0.AddArg(z)
-		v.AddArg(v0)
-		return true
-	}
-	// match: (ISELB [6] x (CMPWconst [0] (Select0 (ANDCCconst [1] z))))
-	// result: (Select0 <typ.UInt64> (ANDCCconst [1] z ))
-	for {
-		if auxIntToInt32(v.AuxInt) != 6 {
-			break
-		}
-		if v_1.Op != OpPPC64CMPWconst || auxIntToInt32(v_1.AuxInt) != 0 {
-			break
-		}
-		v_1_0 := v_1.Args[0]
-		if v_1_0.Op != OpSelect0 {
-			break
-		}
-		v_1_0_0 := v_1_0.Args[0]
-		if v_1_0_0.Op != OpPPC64ANDCCconst || auxIntToInt64(v_1_0_0.AuxInt) != 1 {
-			break
-		}
-		z := v_1_0_0.Args[0]
-		v.reset(OpSelect0)
-		v.Type = typ.UInt64
-		v0 := b.NewValue0(v.Pos, OpPPC64ANDCCconst, types.NewTuple(typ.Int, types.TypeFlags))
-		v0.AuxInt = int64ToAuxInt(1)
-		v0.AddArg(z)
-		v.AddArg(v0)
-		return true
-	}
-	// match: (ISELB [2] x (CMPWconst [0] (Select0 (ANDCCconst [n] z))))
-	// result: (ISELB [2] x (Select1 <types.TypeFlags> (ANDCCconst [n] z )))
-	for {
-		if auxIntToInt32(v.AuxInt) != 2 {
-			break
-		}
-		x := v_0
-		if v_1.Op != OpPPC64CMPWconst || auxIntToInt32(v_1.AuxInt) != 0 {
-			break
-		}
-		v_1_0 := v_1.Args[0]
-		if v_1_0.Op != OpSelect0 {
-			break
-		}
-		v_1_0_0 := v_1_0.Args[0]
-		if v_1_0_0.Op != OpPPC64ANDCCconst {
-			break
-		}
-		n := auxIntToInt64(v_1_0_0.AuxInt)
-		z := v_1_0_0.Args[0]
-		v.reset(OpPPC64ISELB)
-		v.AuxInt = int32ToAuxInt(2)
-		v0 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags)
-		v1 := b.NewValue0(v.Pos, OpPPC64ANDCCconst, types.NewTuple(typ.Int, types.TypeFlags))
-		v1.AuxInt = int64ToAuxInt(n)
-		v1.AddArg(z)
-		v0.AddArg(v1)
-		v.AddArg2(x, v0)
-		return true
-	}
-	// match: (ISELB [6] x (CMPWconst [0] (Select0 (ANDCCconst [n] z))))
-	// result: (ISELB [6] x (Select1 <types.TypeFlags> (ANDCCconst [n] z )))
-	for {
-		if auxIntToInt32(v.AuxInt) != 6 {
-			break
-		}
-		x := v_0
-		if v_1.Op != OpPPC64CMPWconst || auxIntToInt32(v_1.AuxInt) != 0 {
-			break
-		}
-		v_1_0 := v_1.Args[0]
-		if v_1_0.Op != OpSelect0 {
-			break
-		}
-		v_1_0_0 := v_1_0.Args[0]
-		if v_1_0_0.Op != OpPPC64ANDCCconst {
-			break
-		}
-		n := auxIntToInt64(v_1_0_0.AuxInt)
-		z := v_1_0_0.Args[0]
-		v.reset(OpPPC64ISELB)
-		v.AuxInt = int32ToAuxInt(6)
-		v0 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags)
-		v1 := b.NewValue0(v.Pos, OpPPC64ANDCCconst, types.NewTuple(typ.Int, types.TypeFlags))
-		v1.AuxInt = int64ToAuxInt(n)
-		v1.AddArg(z)
-		v0.AddArg(v1)
-		v.AddArg2(x, v0)
-		return true
-	}
-	// match: (ISELB [2] x (CMPconst [0] a:(AND y z)))
-	// cond: a.Uses == 1
-	// result: (ISELB [2] x (Select1 <types.TypeFlags> (ANDCC y z )))
-	for {
-		if auxIntToInt32(v.AuxInt) != 2 {
-			break
-		}
-		x := v_0
-		if v_1.Op != OpPPC64CMPconst || auxIntToInt64(v_1.AuxInt) != 0 {
-			break
-		}
-		a := v_1.Args[0]
-		if a.Op != OpPPC64AND {
-			break
-		}
-		z := a.Args[1]
-		y := a.Args[0]
-		if !(a.Uses == 1) {
-			break
-		}
-		v.reset(OpPPC64ISELB)
-		v.AuxInt = int32ToAuxInt(2)
-		v0 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags)
-		v1 := b.NewValue0(v.Pos, OpPPC64ANDCC, types.NewTuple(typ.Int64, types.TypeFlags))
-		v1.AddArg2(y, z)
-		v0.AddArg(v1)
-		v.AddArg2(x, v0)
-		return true
-	}
-	// match: (ISELB [6] x (CMPconst [0] a:(AND y z)))
-	// cond: a.Uses == 1
-	// result: (ISELB [6] x (Select1 <types.TypeFlags> (ANDCC y z )))
-	for {
-		if auxIntToInt32(v.AuxInt) != 6 {
-			break
-		}
-		x := v_0
-		if v_1.Op != OpPPC64CMPconst || auxIntToInt64(v_1.AuxInt) != 0 {
-			break
-		}
-		a := v_1.Args[0]
-		if a.Op != OpPPC64AND {
-			break
-		}
-		z := a.Args[1]
-		y := a.Args[0]
-		if !(a.Uses == 1) {
-			break
-		}
-		v.reset(OpPPC64ISELB)
-		v.AuxInt = int32ToAuxInt(6)
-		v0 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags)
-		v1 := b.NewValue0(v.Pos, OpPPC64ANDCC, types.NewTuple(typ.Int64, types.TypeFlags))
-		v1.AddArg2(y, z)
-		v0.AddArg(v1)
-		v.AddArg2(x, v0)
-		return true
-	}
-	// match: (ISELB [2] x (CMPconst [0] o:(OR y z)))
-	// cond: o.Uses == 1
-	// result: (ISELB [2] x (Select1 <types.TypeFlags> (ORCC y z )))
-	for {
-		if auxIntToInt32(v.AuxInt) != 2 {
-			break
-		}
-		x := v_0
-		if v_1.Op != OpPPC64CMPconst || auxIntToInt64(v_1.AuxInt) != 0 {
-			break
-		}
-		o := v_1.Args[0]
-		if o.Op != OpPPC64OR {
-			break
-		}
-		z := o.Args[1]
-		y := o.Args[0]
-		if !(o.Uses == 1) {
-			break
-		}
-		v.reset(OpPPC64ISELB)
-		v.AuxInt = int32ToAuxInt(2)
-		v0 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags)
-		v1 := b.NewValue0(v.Pos, OpPPC64ORCC, types.NewTuple(typ.Int, types.TypeFlags))
-		v1.AddArg2(y, z)
-		v0.AddArg(v1)
-		v.AddArg2(x, v0)
-		return true
-	}
-	// match: (ISELB [6] x (CMPconst [0] o:(OR y z)))
-	// cond: o.Uses == 1
-	// result: (ISELB [6] x (Select1 <types.TypeFlags> (ORCC y z )))
-	for {
-		if auxIntToInt32(v.AuxInt) != 6 {
-			break
-		}
-		x := v_0
-		if v_1.Op != OpPPC64CMPconst || auxIntToInt64(v_1.AuxInt) != 0 {
-			break
-		}
-		o := v_1.Args[0]
-		if o.Op != OpPPC64OR {
-			break
-		}
-		z := o.Args[1]
-		y := o.Args[0]
-		if !(o.Uses == 1) {
-			break
-		}
-		v.reset(OpPPC64ISELB)
-		v.AuxInt = int32ToAuxInt(6)
-		v0 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags)
-		v1 := b.NewValue0(v.Pos, OpPPC64ORCC, types.NewTuple(typ.Int, types.TypeFlags))
-		v1.AddArg2(y, z)
-		v0.AddArg(v1)
-		v.AddArg2(x, v0)
-		return true
-	}
-	// match: (ISELB [2] x (CMPconst [0] a:(XOR y z)))
-	// cond: a.Uses == 1
-	// result: (ISELB [2] x (Select1 <types.TypeFlags> (XORCC y z )))
-	for {
-		if auxIntToInt32(v.AuxInt) != 2 {
-			break
-		}
-		x := v_0
-		if v_1.Op != OpPPC64CMPconst || auxIntToInt64(v_1.AuxInt) != 0 {
-			break
-		}
-		a := v_1.Args[0]
-		if a.Op != OpPPC64XOR {
-			break
-		}
-		z := a.Args[1]
-		y := a.Args[0]
-		if !(a.Uses == 1) {
-			break
-		}
-		v.reset(OpPPC64ISELB)
-		v.AuxInt = int32ToAuxInt(2)
-		v0 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags)
-		v1 := b.NewValue0(v.Pos, OpPPC64XORCC, types.NewTuple(typ.Int, types.TypeFlags))
-		v1.AddArg2(y, z)
-		v0.AddArg(v1)
-		v.AddArg2(x, v0)
-		return true
-	}
-	// match: (ISELB [6] x (CMPconst [0] a:(XOR y z)))
-	// cond: a.Uses == 1
-	// result: (ISELB [6] x (Select1 <types.TypeFlags> (XORCC y z )))
-	for {
-		if auxIntToInt32(v.AuxInt) != 6 {
-			break
-		}
-		x := v_0
-		if v_1.Op != OpPPC64CMPconst || auxIntToInt64(v_1.AuxInt) != 0 {
-			break
-		}
-		a := v_1.Args[0]
-		if a.Op != OpPPC64XOR {
-			break
-		}
-		z := a.Args[1]
-		y := a.Args[0]
-		if !(a.Uses == 1) {
-			break
-		}
-		v.reset(OpPPC64ISELB)
-		v.AuxInt = int32ToAuxInt(6)
-		v0 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags)
-		v1 := b.NewValue0(v.Pos, OpPPC64XORCC, types.NewTuple(typ.Int, types.TypeFlags))
-		v1.AddArg2(y, z)
-		v0.AddArg(v1)
-		v.AddArg2(x, v0)
-		return true
-	}
-	// match: (ISELB [n] (MOVDconst [1]) (InvertFlags bool))
-	// cond: n%4 == 0
-	// result: (ISELB [n+1] (MOVDconst [1]) bool)
-	for {
-		n := auxIntToInt32(v.AuxInt)
-		if v_0.Op != OpPPC64MOVDconst || auxIntToInt64(v_0.AuxInt) != 1 || v_1.Op != OpPPC64InvertFlags {
-			break
-		}
-		bool := v_1.Args[0]
-		if !(n%4 == 0) {
-			break
-		}
-		v.reset(OpPPC64ISELB)
-		v.AuxInt = int32ToAuxInt(n + 1)
-		v0 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v0.AuxInt = int64ToAuxInt(1)
-		v.AddArg2(v0, bool)
-		return true
-	}
-	// match: (ISELB [n] (MOVDconst [1]) (InvertFlags bool))
-	// cond: n%4 == 1
-	// result: (ISELB [n-1] (MOVDconst [1]) bool)
-	for {
-		n := auxIntToInt32(v.AuxInt)
-		if v_0.Op != OpPPC64MOVDconst || auxIntToInt64(v_0.AuxInt) != 1 || v_1.Op != OpPPC64InvertFlags {
-			break
-		}
-		bool := v_1.Args[0]
-		if !(n%4 == 1) {
-			break
-		}
-		v.reset(OpPPC64ISELB)
-		v.AuxInt = int32ToAuxInt(n - 1)
-		v0 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v0.AuxInt = int64ToAuxInt(1)
-		v.AddArg2(v0, bool)
-		return true
-	}
-	// match: (ISELB [n] (MOVDconst [1]) (InvertFlags bool))
-	// cond: n%4 == 2
-	// result: (ISELB [n] (MOVDconst [1]) bool)
-	for {
-		n := auxIntToInt32(v.AuxInt)
-		if v_0.Op != OpPPC64MOVDconst || auxIntToInt64(v_0.AuxInt) != 1 || v_1.Op != OpPPC64InvertFlags {
-			break
-		}
-		bool := v_1.Args[0]
-		if !(n%4 == 2) {
-			break
-		}
-		v.reset(OpPPC64ISELB)
-		v.AuxInt = int32ToAuxInt(n)
-		v0 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v0.AuxInt = int64ToAuxInt(1)
-		v.AddArg2(v0, bool)
-		return true
-	}
-	return false
-}
 func rewriteValuePPC64_OpPPC64LessEqual(v *Value) bool {
 	v_0 := v.Args[0]
-	b := v.Block
-	typ := &b.Func.Config.Types
 	// match: (LessEqual (FlagEQ))
 	// result: (MOVDconst [1])
 	for {
@@ -6433,21 +6316,17 @@
 		return true
 	}
 	// match: (LessEqual cmp)
-	// result: (ISELB [5] (MOVDconst [1]) cmp)
+	// result: (SETBCR [1] cmp)
 	for {
 		cmp := v_0
-		v.reset(OpPPC64ISELB)
-		v.AuxInt = int32ToAuxInt(5)
-		v0 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v0.AuxInt = int64ToAuxInt(1)
-		v.AddArg2(v0, cmp)
+		v.reset(OpPPC64SETBCR)
+		v.AuxInt = int32ToAuxInt(1)
+		v.AddArg(cmp)
 		return true
 	}
 }
 func rewriteValuePPC64_OpPPC64LessThan(v *Value) bool {
 	v_0 := v.Args[0]
-	b := v.Block
-	typ := &b.Func.Config.Types
 	// match: (LessThan (FlagEQ))
 	// result: (MOVDconst [0])
 	for {
@@ -6490,14 +6369,12 @@
 		return true
 	}
 	// match: (LessThan cmp)
-	// result: (ISELB [0] (MOVDconst [1]) cmp)
+	// result: (SETBC [0] cmp)
 	for {
 		cmp := v_0
-		v.reset(OpPPC64ISELB)
+		v.reset(OpPPC64SETBC)
 		v.AuxInt = int32ToAuxInt(0)
-		v0 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v0.AuxInt = int64ToAuxInt(1)
-		v.AddArg2(v0, cmp)
+		v.AddArg(cmp)
 		return true
 	}
 }
@@ -6545,7 +6422,7 @@
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
 	// match: (MOVBZload [off1] {sym1} p:(MOVDaddr [off2] {sym2} ptr) mem)
-	// cond: canMergeSym(sym1,sym2) && is16Bit(int64(off1+off2)) && (ptr.Op != OpSB || p.Uses == 1)
+	// cond: canMergeSym(sym1,sym2) && ((is16Bit(int64(off1+off2)) && (ptr.Op != OpSB || p.Uses == 1)) || (supportsPPC64PCRel() && is32Bit(int64(off1+off2))))
 	// result: (MOVBZload [off1+off2] {mergeSym(sym1,sym2)} ptr mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -6558,7 +6435,7 @@
 		sym2 := auxToSym(p.Aux)
 		ptr := p.Args[0]
 		mem := v_1
-		if !(canMergeSym(sym1, sym2) && is16Bit(int64(off1+off2)) && (ptr.Op != OpSB || p.Uses == 1)) {
+		if !(canMergeSym(sym1, sym2) && ((is16Bit(int64(off1+off2)) && (ptr.Op != OpSB || p.Uses == 1)) || (supportsPPC64PCRel() && is32Bit(int64(off1+off2))))) {
 			break
 		}
 		v.reset(OpPPC64MOVBZload)
@@ -6568,7 +6445,7 @@
 		return true
 	}
 	// match: (MOVBZload [off1] {sym} (ADDconst [off2] x) mem)
-	// cond: is16Bit(int64(off1)+off2)
+	// cond: (is16Bit(int64(off1)+off2) || (supportsPPC64PCRel() && is32Bit(int64(off1)+off2)))
 	// result: (MOVBZload [off1+int32(off2)] {sym} x mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -6579,7 +6456,7 @@
 		off2 := auxIntToInt64(v_0.AuxInt)
 		x := v_0.Args[0]
 		mem := v_1
-		if !(is16Bit(int64(off1) + off2)) {
+		if !(is16Bit(int64(off1)+off2) || (supportsPPC64PCRel() && is32Bit(int64(off1)+off2))) {
 			break
 		}
 		v.reset(OpPPC64MOVBZload)
@@ -6617,7 +6494,7 @@
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
 	// match: (MOVBZloadidx ptr (MOVDconst [c]) mem)
-	// cond: is16Bit(c)
+	// cond: (is16Bit(c) || (buildcfg.GOPPC64 >= 10 && is32Bit(c)))
 	// result: (MOVBZload [int32(c)] ptr mem)
 	for {
 		ptr := v_0
@@ -6626,7 +6503,7 @@
 		}
 		c := auxIntToInt64(v_1.AuxInt)
 		mem := v_2
-		if !(is16Bit(c)) {
+		if !(is16Bit(c) || (buildcfg.GOPPC64 >= 10 && is32Bit(c))) {
 			break
 		}
 		v.reset(OpPPC64MOVBZload)
@@ -6635,7 +6512,7 @@
 		return true
 	}
 	// match: (MOVBZloadidx (MOVDconst [c]) ptr mem)
-	// cond: is16Bit(c)
+	// cond: (is16Bit(c) || (buildcfg.GOPPC64 >= 10 && is32Bit(c)))
 	// result: (MOVBZload [int32(c)] ptr mem)
 	for {
 		if v_0.Op != OpPPC64MOVDconst {
@@ -6644,7 +6521,7 @@
 		c := auxIntToInt64(v_0.AuxInt)
 		ptr := v_1
 		mem := v_2
-		if !(is16Bit(c)) {
+		if !(is16Bit(c) || (buildcfg.GOPPC64 >= 10 && is32Bit(c))) {
 			break
 		}
 		v.reset(OpPPC64MOVBZload)
@@ -7056,7 +6933,7 @@
 		return true
 	}
 	// match: (MOVBZreg x:(Arg <t>))
-	// cond: is8BitInt(t) && !isSigned(t)
+	// cond: is8BitInt(t) && !t.IsSigned()
 	// result: x
 	for {
 		x := v_0
@@ -7064,7 +6941,7 @@
 			break
 		}
 		t := x.Type
-		if !(is8BitInt(t) && !isSigned(t)) {
+		if !(is8BitInt(t) && !t.IsSigned()) {
 			break
 		}
 		v.copyOf(x)
@@ -7266,7 +7143,7 @@
 		return true
 	}
 	// match: (MOVBreg x:(Arg <t>))
-	// cond: is8BitInt(t) && isSigned(t)
+	// cond: is8BitInt(t) && t.IsSigned()
 	// result: x
 	for {
 		x := v_0
@@ -7274,7 +7151,7 @@
 			break
 		}
 		t := x.Type
-		if !(is8BitInt(t) && isSigned(t)) {
+		if !(is8BitInt(t) && t.IsSigned()) {
 			break
 		}
 		v.copyOf(x)
@@ -7298,10 +7175,9 @@
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
 	b := v.Block
-	config := b.Func.Config
 	typ := &b.Func.Config.Types
 	// match: (MOVBstore [off1] {sym} (ADDconst [off2] x) val mem)
-	// cond: is16Bit(int64(off1)+off2)
+	// cond: (is16Bit(int64(off1)+off2) || (supportsPPC64PCRel() && is32Bit(int64(off1)+off2)))
 	// result: (MOVBstore [off1+int32(off2)] {sym} x val mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -7313,7 +7189,7 @@
 		x := v_0.Args[0]
 		val := v_1
 		mem := v_2
-		if !(is16Bit(int64(off1) + off2)) {
+		if !(is16Bit(int64(off1)+off2) || (supportsPPC64PCRel() && is32Bit(int64(off1)+off2))) {
 			break
 		}
 		v.reset(OpPPC64MOVBstore)
@@ -7323,7 +7199,7 @@
 		return true
 	}
 	// match: (MOVBstore [off1] {sym1} p:(MOVDaddr [off2] {sym2} ptr) val mem)
-	// cond: canMergeSym(sym1,sym2) && is16Bit(int64(off1+off2)) && (ptr.Op != OpSB || p.Uses == 1)
+	// cond: canMergeSym(sym1,sym2) && ((is16Bit(int64(off1+off2)) && (ptr.Op != OpSB || p.Uses == 1)) || (supportsPPC64PCRel() && is32Bit(int64(off1+off2))))
 	// result: (MOVBstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -7337,7 +7213,7 @@
 		ptr := p.Args[0]
 		val := v_1
 		mem := v_2
-		if !(canMergeSym(sym1, sym2) && is16Bit(int64(off1+off2)) && (ptr.Op != OpSB || p.Uses == 1)) {
+		if !(canMergeSym(sym1, sym2) && ((is16Bit(int64(off1+off2)) && (ptr.Op != OpSB || p.Uses == 1)) || (supportsPPC64PCRel() && is32Bit(int64(off1+off2))))) {
 			break
 		}
 		v.reset(OpPPC64MOVBstore)
@@ -7603,437 +7479,6 @@
 		v.AddArg3(ptr, v0, mem)
 		return true
 	}
-	// match: (MOVBstore [i1] {s} p (SRWconst w [24]) x0:(MOVBstore [i0] {s} p (SRWconst w [16]) mem))
-	// cond: !config.BigEndian && x0.Uses == 1 && i1 == i0+1 && clobber(x0)
-	// result: (MOVHstore [i0] {s} p (SRWconst <typ.UInt16> w [16]) mem)
-	for {
-		i1 := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p := v_0
-		if v_1.Op != OpPPC64SRWconst || auxIntToInt64(v_1.AuxInt) != 24 {
-			break
-		}
-		w := v_1.Args[0]
-		x0 := v_2
-		if x0.Op != OpPPC64MOVBstore {
-			break
-		}
-		i0 := auxIntToInt32(x0.AuxInt)
-		if auxToSym(x0.Aux) != s {
-			break
-		}
-		mem := x0.Args[2]
-		if p != x0.Args[0] {
-			break
-		}
-		x0_1 := x0.Args[1]
-		if x0_1.Op != OpPPC64SRWconst || auxIntToInt64(x0_1.AuxInt) != 16 || w != x0_1.Args[0] || !(!config.BigEndian && x0.Uses == 1 && i1 == i0+1 && clobber(x0)) {
-			break
-		}
-		v.reset(OpPPC64MOVHstore)
-		v.AuxInt = int32ToAuxInt(i0)
-		v.Aux = symToAux(s)
-		v0 := b.NewValue0(x0.Pos, OpPPC64SRWconst, typ.UInt16)
-		v0.AuxInt = int64ToAuxInt(16)
-		v0.AddArg(w)
-		v.AddArg3(p, v0, mem)
-		return true
-	}
-	// match: (MOVBstore [i1] {s} p (SRDconst w [24]) x0:(MOVBstore [i0] {s} p (SRDconst w [16]) mem))
-	// cond: !config.BigEndian && x0.Uses == 1 && i1 == i0+1 && clobber(x0)
-	// result: (MOVHstore [i0] {s} p (SRWconst <typ.UInt16> w [16]) mem)
-	for {
-		i1 := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p := v_0
-		if v_1.Op != OpPPC64SRDconst || auxIntToInt64(v_1.AuxInt) != 24 {
-			break
-		}
-		w := v_1.Args[0]
-		x0 := v_2
-		if x0.Op != OpPPC64MOVBstore {
-			break
-		}
-		i0 := auxIntToInt32(x0.AuxInt)
-		if auxToSym(x0.Aux) != s {
-			break
-		}
-		mem := x0.Args[2]
-		if p != x0.Args[0] {
-			break
-		}
-		x0_1 := x0.Args[1]
-		if x0_1.Op != OpPPC64SRDconst || auxIntToInt64(x0_1.AuxInt) != 16 || w != x0_1.Args[0] || !(!config.BigEndian && x0.Uses == 1 && i1 == i0+1 && clobber(x0)) {
-			break
-		}
-		v.reset(OpPPC64MOVHstore)
-		v.AuxInt = int32ToAuxInt(i0)
-		v.Aux = symToAux(s)
-		v0 := b.NewValue0(x0.Pos, OpPPC64SRWconst, typ.UInt16)
-		v0.AuxInt = int64ToAuxInt(16)
-		v0.AddArg(w)
-		v.AddArg3(p, v0, mem)
-		return true
-	}
-	// match: (MOVBstore [i1] {s} p (SRWconst w [8]) x0:(MOVBstore [i0] {s} p w mem))
-	// cond: !config.BigEndian && x0.Uses == 1 && i1 == i0+1 && clobber(x0)
-	// result: (MOVHstore [i0] {s} p w mem)
-	for {
-		i1 := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p := v_0
-		if v_1.Op != OpPPC64SRWconst || auxIntToInt64(v_1.AuxInt) != 8 {
-			break
-		}
-		w := v_1.Args[0]
-		x0 := v_2
-		if x0.Op != OpPPC64MOVBstore {
-			break
-		}
-		i0 := auxIntToInt32(x0.AuxInt)
-		if auxToSym(x0.Aux) != s {
-			break
-		}
-		mem := x0.Args[2]
-		if p != x0.Args[0] || w != x0.Args[1] || !(!config.BigEndian && x0.Uses == 1 && i1 == i0+1 && clobber(x0)) {
-			break
-		}
-		v.reset(OpPPC64MOVHstore)
-		v.AuxInt = int32ToAuxInt(i0)
-		v.Aux = symToAux(s)
-		v.AddArg3(p, w, mem)
-		return true
-	}
-	// match: (MOVBstore [i1] {s} p (SRDconst w [8]) x0:(MOVBstore [i0] {s} p w mem))
-	// cond: !config.BigEndian && x0.Uses == 1 && i1 == i0+1 && clobber(x0)
-	// result: (MOVHstore [i0] {s} p w mem)
-	for {
-		i1 := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p := v_0
-		if v_1.Op != OpPPC64SRDconst || auxIntToInt64(v_1.AuxInt) != 8 {
-			break
-		}
-		w := v_1.Args[0]
-		x0 := v_2
-		if x0.Op != OpPPC64MOVBstore {
-			break
-		}
-		i0 := auxIntToInt32(x0.AuxInt)
-		if auxToSym(x0.Aux) != s {
-			break
-		}
-		mem := x0.Args[2]
-		if p != x0.Args[0] || w != x0.Args[1] || !(!config.BigEndian && x0.Uses == 1 && i1 == i0+1 && clobber(x0)) {
-			break
-		}
-		v.reset(OpPPC64MOVHstore)
-		v.AuxInt = int32ToAuxInt(i0)
-		v.Aux = symToAux(s)
-		v.AddArg3(p, w, mem)
-		return true
-	}
-	// match: (MOVBstore [i3] {s} p w x0:(MOVBstore [i2] {s} p (SRWconst w [8]) x1:(MOVBstore [i1] {s} p (SRWconst w [16]) x2:(MOVBstore [i0] {s} p (SRWconst w [24]) mem))))
-	// cond: !config.BigEndian && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && clobber(x0, x1, x2)
-	// result: (MOVWBRstore (MOVDaddr <typ.Uintptr> [i0] {s} p) w mem)
-	for {
-		i3 := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p := v_0
-		w := v_1
-		x0 := v_2
-		if x0.Op != OpPPC64MOVBstore {
-			break
-		}
-		i2 := auxIntToInt32(x0.AuxInt)
-		if auxToSym(x0.Aux) != s {
-			break
-		}
-		_ = x0.Args[2]
-		if p != x0.Args[0] {
-			break
-		}
-		x0_1 := x0.Args[1]
-		if x0_1.Op != OpPPC64SRWconst || auxIntToInt64(x0_1.AuxInt) != 8 || w != x0_1.Args[0] {
-			break
-		}
-		x1 := x0.Args[2]
-		if x1.Op != OpPPC64MOVBstore {
-			break
-		}
-		i1 := auxIntToInt32(x1.AuxInt)
-		if auxToSym(x1.Aux) != s {
-			break
-		}
-		_ = x1.Args[2]
-		if p != x1.Args[0] {
-			break
-		}
-		x1_1 := x1.Args[1]
-		if x1_1.Op != OpPPC64SRWconst || auxIntToInt64(x1_1.AuxInt) != 16 || w != x1_1.Args[0] {
-			break
-		}
-		x2 := x1.Args[2]
-		if x2.Op != OpPPC64MOVBstore {
-			break
-		}
-		i0 := auxIntToInt32(x2.AuxInt)
-		if auxToSym(x2.Aux) != s {
-			break
-		}
-		mem := x2.Args[2]
-		if p != x2.Args[0] {
-			break
-		}
-		x2_1 := x2.Args[1]
-		if x2_1.Op != OpPPC64SRWconst || auxIntToInt64(x2_1.AuxInt) != 24 || w != x2_1.Args[0] || !(!config.BigEndian && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && clobber(x0, x1, x2)) {
-			break
-		}
-		v.reset(OpPPC64MOVWBRstore)
-		v0 := b.NewValue0(x2.Pos, OpPPC64MOVDaddr, typ.Uintptr)
-		v0.AuxInt = int32ToAuxInt(i0)
-		v0.Aux = symToAux(s)
-		v0.AddArg(p)
-		v.AddArg3(v0, w, mem)
-		return true
-	}
-	// match: (MOVBstore [i1] {s} p w x0:(MOVBstore [i0] {s} p (SRWconst w [8]) mem))
-	// cond: !config.BigEndian && x0.Uses == 1 && i1 == i0+1 && clobber(x0)
-	// result: (MOVHBRstore (MOVDaddr <typ.Uintptr> [i0] {s} p) w mem)
-	for {
-		i1 := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p := v_0
-		w := v_1
-		x0 := v_2
-		if x0.Op != OpPPC64MOVBstore {
-			break
-		}
-		i0 := auxIntToInt32(x0.AuxInt)
-		if auxToSym(x0.Aux) != s {
-			break
-		}
-		mem := x0.Args[2]
-		if p != x0.Args[0] {
-			break
-		}
-		x0_1 := x0.Args[1]
-		if x0_1.Op != OpPPC64SRWconst || auxIntToInt64(x0_1.AuxInt) != 8 || w != x0_1.Args[0] || !(!config.BigEndian && x0.Uses == 1 && i1 == i0+1 && clobber(x0)) {
-			break
-		}
-		v.reset(OpPPC64MOVHBRstore)
-		v0 := b.NewValue0(x0.Pos, OpPPC64MOVDaddr, typ.Uintptr)
-		v0.AuxInt = int32ToAuxInt(i0)
-		v0.Aux = symToAux(s)
-		v0.AddArg(p)
-		v.AddArg3(v0, w, mem)
-		return true
-	}
-	// match: (MOVBstore [i7] {s} p (SRDconst w [56]) x0:(MOVBstore [i6] {s} p (SRDconst w [48]) x1:(MOVBstore [i5] {s} p (SRDconst w [40]) x2:(MOVBstore [i4] {s} p (SRDconst w [32]) x3:(MOVWstore [i0] {s} p w mem)))))
-	// cond: !config.BigEndian && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && clobber(x0, x1, x2, x3)
-	// result: (MOVDstore [i0] {s} p w mem)
-	for {
-		i7 := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p := v_0
-		if v_1.Op != OpPPC64SRDconst || auxIntToInt64(v_1.AuxInt) != 56 {
-			break
-		}
-		w := v_1.Args[0]
-		x0 := v_2
-		if x0.Op != OpPPC64MOVBstore {
-			break
-		}
-		i6 := auxIntToInt32(x0.AuxInt)
-		if auxToSym(x0.Aux) != s {
-			break
-		}
-		_ = x0.Args[2]
-		if p != x0.Args[0] {
-			break
-		}
-		x0_1 := x0.Args[1]
-		if x0_1.Op != OpPPC64SRDconst || auxIntToInt64(x0_1.AuxInt) != 48 || w != x0_1.Args[0] {
-			break
-		}
-		x1 := x0.Args[2]
-		if x1.Op != OpPPC64MOVBstore {
-			break
-		}
-		i5 := auxIntToInt32(x1.AuxInt)
-		if auxToSym(x1.Aux) != s {
-			break
-		}
-		_ = x1.Args[2]
-		if p != x1.Args[0] {
-			break
-		}
-		x1_1 := x1.Args[1]
-		if x1_1.Op != OpPPC64SRDconst || auxIntToInt64(x1_1.AuxInt) != 40 || w != x1_1.Args[0] {
-			break
-		}
-		x2 := x1.Args[2]
-		if x2.Op != OpPPC64MOVBstore {
-			break
-		}
-		i4 := auxIntToInt32(x2.AuxInt)
-		if auxToSym(x2.Aux) != s {
-			break
-		}
-		_ = x2.Args[2]
-		if p != x2.Args[0] {
-			break
-		}
-		x2_1 := x2.Args[1]
-		if x2_1.Op != OpPPC64SRDconst || auxIntToInt64(x2_1.AuxInt) != 32 || w != x2_1.Args[0] {
-			break
-		}
-		x3 := x2.Args[2]
-		if x3.Op != OpPPC64MOVWstore {
-			break
-		}
-		i0 := auxIntToInt32(x3.AuxInt)
-		if auxToSym(x3.Aux) != s {
-			break
-		}
-		mem := x3.Args[2]
-		if p != x3.Args[0] || w != x3.Args[1] || !(!config.BigEndian && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && clobber(x0, x1, x2, x3)) {
-			break
-		}
-		v.reset(OpPPC64MOVDstore)
-		v.AuxInt = int32ToAuxInt(i0)
-		v.Aux = symToAux(s)
-		v.AddArg3(p, w, mem)
-		return true
-	}
-	// match: (MOVBstore [i7] {s} p w x0:(MOVBstore [i6] {s} p (SRDconst w [8]) x1:(MOVBstore [i5] {s} p (SRDconst w [16]) x2:(MOVBstore [i4] {s} p (SRDconst w [24]) x3:(MOVBstore [i3] {s} p (SRDconst w [32]) x4:(MOVBstore [i2] {s} p (SRDconst w [40]) x5:(MOVBstore [i1] {s} p (SRDconst w [48]) x6:(MOVBstore [i0] {s} p (SRDconst w [56]) mem))))))))
-	// cond: !config.BigEndian && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && clobber(x0, x1, x2, x3, x4, x5, x6)
-	// result: (MOVDBRstore (MOVDaddr <typ.Uintptr> [i0] {s} p) w mem)
-	for {
-		i7 := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p := v_0
-		w := v_1
-		x0 := v_2
-		if x0.Op != OpPPC64MOVBstore {
-			break
-		}
-		i6 := auxIntToInt32(x0.AuxInt)
-		if auxToSym(x0.Aux) != s {
-			break
-		}
-		_ = x0.Args[2]
-		if p != x0.Args[0] {
-			break
-		}
-		x0_1 := x0.Args[1]
-		if x0_1.Op != OpPPC64SRDconst || auxIntToInt64(x0_1.AuxInt) != 8 || w != x0_1.Args[0] {
-			break
-		}
-		x1 := x0.Args[2]
-		if x1.Op != OpPPC64MOVBstore {
-			break
-		}
-		i5 := auxIntToInt32(x1.AuxInt)
-		if auxToSym(x1.Aux) != s {
-			break
-		}
-		_ = x1.Args[2]
-		if p != x1.Args[0] {
-			break
-		}
-		x1_1 := x1.Args[1]
-		if x1_1.Op != OpPPC64SRDconst || auxIntToInt64(x1_1.AuxInt) != 16 || w != x1_1.Args[0] {
-			break
-		}
-		x2 := x1.Args[2]
-		if x2.Op != OpPPC64MOVBstore {
-			break
-		}
-		i4 := auxIntToInt32(x2.AuxInt)
-		if auxToSym(x2.Aux) != s {
-			break
-		}
-		_ = x2.Args[2]
-		if p != x2.Args[0] {
-			break
-		}
-		x2_1 := x2.Args[1]
-		if x2_1.Op != OpPPC64SRDconst || auxIntToInt64(x2_1.AuxInt) != 24 || w != x2_1.Args[0] {
-			break
-		}
-		x3 := x2.Args[2]
-		if x3.Op != OpPPC64MOVBstore {
-			break
-		}
-		i3 := auxIntToInt32(x3.AuxInt)
-		if auxToSym(x3.Aux) != s {
-			break
-		}
-		_ = x3.Args[2]
-		if p != x3.Args[0] {
-			break
-		}
-		x3_1 := x3.Args[1]
-		if x3_1.Op != OpPPC64SRDconst || auxIntToInt64(x3_1.AuxInt) != 32 || w != x3_1.Args[0] {
-			break
-		}
-		x4 := x3.Args[2]
-		if x4.Op != OpPPC64MOVBstore {
-			break
-		}
-		i2 := auxIntToInt32(x4.AuxInt)
-		if auxToSym(x4.Aux) != s {
-			break
-		}
-		_ = x4.Args[2]
-		if p != x4.Args[0] {
-			break
-		}
-		x4_1 := x4.Args[1]
-		if x4_1.Op != OpPPC64SRDconst || auxIntToInt64(x4_1.AuxInt) != 40 || w != x4_1.Args[0] {
-			break
-		}
-		x5 := x4.Args[2]
-		if x5.Op != OpPPC64MOVBstore {
-			break
-		}
-		i1 := auxIntToInt32(x5.AuxInt)
-		if auxToSym(x5.Aux) != s {
-			break
-		}
-		_ = x5.Args[2]
-		if p != x5.Args[0] {
-			break
-		}
-		x5_1 := x5.Args[1]
-		if x5_1.Op != OpPPC64SRDconst || auxIntToInt64(x5_1.AuxInt) != 48 || w != x5_1.Args[0] {
-			break
-		}
-		x6 := x5.Args[2]
-		if x6.Op != OpPPC64MOVBstore {
-			break
-		}
-		i0 := auxIntToInt32(x6.AuxInt)
-		if auxToSym(x6.Aux) != s {
-			break
-		}
-		mem := x6.Args[2]
-		if p != x6.Args[0] {
-			break
-		}
-		x6_1 := x6.Args[1]
-		if x6_1.Op != OpPPC64SRDconst || auxIntToInt64(x6_1.AuxInt) != 56 || w != x6_1.Args[0] || !(!config.BigEndian && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && clobber(x0, x1, x2, x3, x4, x5, x6)) {
-			break
-		}
-		v.reset(OpPPC64MOVDBRstore)
-		v0 := b.NewValue0(x6.Pos, OpPPC64MOVDaddr, typ.Uintptr)
-		v0.AuxInt = int32ToAuxInt(i0)
-		v0.Aux = symToAux(s)
-		v0.AddArg(p)
-		v.AddArg3(v0, w, mem)
-		return true
-	}
 	return false
 }
 func rewriteValuePPC64_OpPPC64MOVBstoreidx(v *Value) bool {
@@ -8044,7 +7489,7 @@
 	b := v.Block
 	typ := &b.Func.Config.Types
 	// match: (MOVBstoreidx ptr (MOVDconst [c]) val mem)
-	// cond: is16Bit(c)
+	// cond: (is16Bit(c) || (buildcfg.GOPPC64 >= 10 && is32Bit(c)))
 	// result: (MOVBstore [int32(c)] ptr val mem)
 	for {
 		ptr := v_0
@@ -8054,7 +7499,7 @@
 		c := auxIntToInt64(v_1.AuxInt)
 		val := v_2
 		mem := v_3
-		if !(is16Bit(c)) {
+		if !(is16Bit(c) || (buildcfg.GOPPC64 >= 10 && is32Bit(c))) {
 			break
 		}
 		v.reset(OpPPC64MOVBstore)
@@ -8063,7 +7508,7 @@
 		return true
 	}
 	// match: (MOVBstoreidx (MOVDconst [c]) ptr val mem)
-	// cond: is16Bit(c)
+	// cond: (is16Bit(c) || (buildcfg.GOPPC64 >= 10 && is32Bit(c)))
 	// result: (MOVBstore [int32(c)] ptr val mem)
 	for {
 		if v_0.Op != OpPPC64MOVDconst {
@@ -8073,7 +7518,7 @@
 		ptr := v_1
 		val := v_2
 		mem := v_3
-		if !(is16Bit(c)) {
+		if !(is16Bit(c) || (buildcfg.GOPPC64 >= 10 && is32Bit(c))) {
 			break
 		}
 		v.reset(OpPPC64MOVBstore)
@@ -8275,7 +7720,7 @@
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
 	// match: (MOVBstorezero [off1] {sym} (ADDconst [off2] x) mem)
-	// cond: is16Bit(int64(off1)+off2)
+	// cond: ((supportsPPC64PCRel() && is32Bit(int64(off1)+off2)) || (is16Bit(int64(off1)+off2)))
 	// result: (MOVBstorezero [off1+int32(off2)] {sym} x mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -8286,7 +7731,7 @@
 		off2 := auxIntToInt64(v_0.AuxInt)
 		x := v_0.Args[0]
 		mem := v_1
-		if !(is16Bit(int64(off1) + off2)) {
+		if !((supportsPPC64PCRel() && is32Bit(int64(off1)+off2)) || (is16Bit(int64(off1) + off2))) {
 			break
 		}
 		v.reset(OpPPC64MOVBstorezero)
@@ -8296,7 +7741,7 @@
 		return true
 	}
 	// match: (MOVBstorezero [off1] {sym1} p:(MOVDaddr [off2] {sym2} x) mem)
-	// cond: canMergeSym(sym1,sym2) && (x.Op != OpSB || p.Uses == 1)
+	// cond: canMergeSym(sym1,sym2) && ((is16Bit(int64(off1+off2)) && (x.Op != OpSB || p.Uses == 1)) || (supportsPPC64PCRel() && is32Bit(int64(off1+off2))))
 	// result: (MOVBstorezero [off1+off2] {mergeSym(sym1,sym2)} x mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -8309,7 +7754,7 @@
 		sym2 := auxToSym(p.Aux)
 		x := p.Args[0]
 		mem := v_1
-		if !(canMergeSym(sym1, sym2) && (x.Op != OpSB || p.Uses == 1)) {
+		if !(canMergeSym(sym1, sym2) && ((is16Bit(int64(off1+off2)) && (x.Op != OpSB || p.Uses == 1)) || (supportsPPC64PCRel() && is32Bit(int64(off1+off2))))) {
 			break
 		}
 		v.reset(OpPPC64MOVBstorezero)
@@ -8341,7 +7786,7 @@
 		return true
 	}
 	// match: (MOVDload [off1] {sym1} p:(MOVDaddr [off2] {sym2} ptr) mem)
-	// cond: canMergeSym(sym1,sym2) && is16Bit(int64(off1+off2)) && (ptr.Op != OpSB || p.Uses == 1)
+	// cond: canMergeSym(sym1,sym2) && ((is16Bit(int64(off1+off2)) && (ptr.Op != OpSB || p.Uses == 1)) || (supportsPPC64PCRel() && is32Bit(int64(off1+off2))))
 	// result: (MOVDload [off1+off2] {mergeSym(sym1,sym2)} ptr mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -8354,7 +7799,7 @@
 		sym2 := auxToSym(p.Aux)
 		ptr := p.Args[0]
 		mem := v_1
-		if !(canMergeSym(sym1, sym2) && is16Bit(int64(off1+off2)) && (ptr.Op != OpSB || p.Uses == 1)) {
+		if !(canMergeSym(sym1, sym2) && ((is16Bit(int64(off1+off2)) && (ptr.Op != OpSB || p.Uses == 1)) || (supportsPPC64PCRel() && is32Bit(int64(off1+off2))))) {
 			break
 		}
 		v.reset(OpPPC64MOVDload)
@@ -8364,7 +7809,7 @@
 		return true
 	}
 	// match: (MOVDload [off1] {sym} (ADDconst [off2] x) mem)
-	// cond: is16Bit(int64(off1)+off2)
+	// cond: (is16Bit(int64(off1)+off2) || (supportsPPC64PCRel() && is32Bit(int64(off1)+off2)))
 	// result: (MOVDload [off1+int32(off2)] {sym} x mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -8375,7 +7820,7 @@
 		off2 := auxIntToInt64(v_0.AuxInt)
 		x := v_0.Args[0]
 		mem := v_1
-		if !(is16Bit(int64(off1) + off2)) {
+		if !(is16Bit(int64(off1)+off2) || (supportsPPC64PCRel() && is32Bit(int64(off1)+off2))) {
 			break
 		}
 		v.reset(OpPPC64MOVDload)
@@ -8413,7 +7858,7 @@
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
 	// match: (MOVDloadidx ptr (MOVDconst [c]) mem)
-	// cond: is16Bit(c) && c%4 == 0
+	// cond: ((is16Bit(c) && c%4 == 0) || (buildcfg.GOPPC64 >= 10 && is32Bit(c)))
 	// result: (MOVDload [int32(c)] ptr mem)
 	for {
 		ptr := v_0
@@ -8422,7 +7867,7 @@
 		}
 		c := auxIntToInt64(v_1.AuxInt)
 		mem := v_2
-		if !(is16Bit(c) && c%4 == 0) {
+		if !((is16Bit(c) && c%4 == 0) || (buildcfg.GOPPC64 >= 10 && is32Bit(c))) {
 			break
 		}
 		v.reset(OpPPC64MOVDload)
@@ -8431,7 +7876,7 @@
 		return true
 	}
 	// match: (MOVDloadidx (MOVDconst [c]) ptr mem)
-	// cond: is16Bit(c) && c%4 == 0
+	// cond: ((is16Bit(c) && c%4 == 0) || (buildcfg.GOPPC64 >= 10 && is32Bit(c)))
 	// result: (MOVDload [int32(c)] ptr mem)
 	for {
 		if v_0.Op != OpPPC64MOVDconst {
@@ -8440,7 +7885,7 @@
 		c := auxIntToInt64(v_0.AuxInt)
 		ptr := v_1
 		mem := v_2
-		if !(is16Bit(c) && c%4 == 0) {
+		if !((is16Bit(c) && c%4 == 0) || (buildcfg.GOPPC64 >= 10 && is32Bit(c))) {
 			break
 		}
 		v.reset(OpPPC64MOVDload)
@@ -8454,6 +7899,7 @@
 	v_2 := v.Args[2]
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
+	b := v.Block
 	// match: (MOVDstore [off] {sym} ptr (MFVSRD x) mem)
 	// result: (FMOVDstore [off] {sym} ptr x mem)
 	for {
@@ -8472,7 +7918,7 @@
 		return true
 	}
 	// match: (MOVDstore [off1] {sym} (ADDconst [off2] x) val mem)
-	// cond: is16Bit(int64(off1)+off2)
+	// cond: (is16Bit(int64(off1)+off2) || (supportsPPC64PCRel() && is32Bit(int64(off1)+off2)))
 	// result: (MOVDstore [off1+int32(off2)] {sym} x val mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -8484,7 +7930,7 @@
 		x := v_0.Args[0]
 		val := v_1
 		mem := v_2
-		if !(is16Bit(int64(off1) + off2)) {
+		if !(is16Bit(int64(off1)+off2) || (supportsPPC64PCRel() && is32Bit(int64(off1)+off2))) {
 			break
 		}
 		v.reset(OpPPC64MOVDstore)
@@ -8494,7 +7940,7 @@
 		return true
 	}
 	// match: (MOVDstore [off1] {sym1} p:(MOVDaddr [off2] {sym2} ptr) val mem)
-	// cond: canMergeSym(sym1,sym2) && is16Bit(int64(off1+off2)) && (ptr.Op != OpSB || p.Uses == 1)
+	// cond: canMergeSym(sym1,sym2) && ((is16Bit(int64(off1+off2)) && (ptr.Op != OpSB || p.Uses == 1)) || (supportsPPC64PCRel() && is32Bit(int64(off1+off2))))
 	// result: (MOVDstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -8508,7 +7954,7 @@
 		ptr := p.Args[0]
 		val := v_1
 		mem := v_2
-		if !(canMergeSym(sym1, sym2) && is16Bit(int64(off1+off2)) && (ptr.Op != OpSB || p.Uses == 1)) {
+		if !(canMergeSym(sym1, sym2) && ((is16Bit(int64(off1+off2)) && (ptr.Op != OpSB || p.Uses == 1)) || (supportsPPC64PCRel() && is32Bit(int64(off1+off2))))) {
 			break
 		}
 		v.reset(OpPPC64MOVDstore)
@@ -8556,6 +8002,49 @@
 		v.AddArg4(ptr, idx, val, mem)
 		return true
 	}
+	// match: (MOVDstore [off] {sym} ptr r:(BRD val) mem)
+	// cond: r.Uses == 1
+	// result: (MOVDBRstore (MOVDaddr <ptr.Type> [off] {sym} ptr) val mem)
+	for {
+		off := auxIntToInt32(v.AuxInt)
+		sym := auxToSym(v.Aux)
+		ptr := v_0
+		r := v_1
+		if r.Op != OpPPC64BRD {
+			break
+		}
+		val := r.Args[0]
+		mem := v_2
+		if !(r.Uses == 1) {
+			break
+		}
+		v.reset(OpPPC64MOVDBRstore)
+		v0 := b.NewValue0(v.Pos, OpPPC64MOVDaddr, ptr.Type)
+		v0.AuxInt = int32ToAuxInt(off)
+		v0.Aux = symToAux(sym)
+		v0.AddArg(ptr)
+		v.AddArg3(v0, val, mem)
+		return true
+	}
+	// match: (MOVDstore [off] {sym} ptr (Bswap64 val) mem)
+	// result: (MOVDBRstore (MOVDaddr <ptr.Type> [off] {sym} ptr) val mem)
+	for {
+		off := auxIntToInt32(v.AuxInt)
+		sym := auxToSym(v.Aux)
+		ptr := v_0
+		if v_1.Op != OpBswap64 {
+			break
+		}
+		val := v_1.Args[0]
+		mem := v_2
+		v.reset(OpPPC64MOVDBRstore)
+		v0 := b.NewValue0(v.Pos, OpPPC64MOVDaddr, ptr.Type)
+		v0.AuxInt = int32ToAuxInt(off)
+		v0.Aux = symToAux(sym)
+		v0.AddArg(ptr)
+		v.AddArg3(v0, val, mem)
+		return true
+	}
 	return false
 }
 func rewriteValuePPC64_OpPPC64MOVDstoreidx(v *Value) bool {
@@ -8564,7 +8053,7 @@
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
 	// match: (MOVDstoreidx ptr (MOVDconst [c]) val mem)
-	// cond: is16Bit(c) && c%4 == 0
+	// cond: ((is16Bit(c) && c%4 == 0) || (buildcfg.GOPPC64 >= 10 && is32Bit(c)))
 	// result: (MOVDstore [int32(c)] ptr val mem)
 	for {
 		ptr := v_0
@@ -8574,7 +8063,7 @@
 		c := auxIntToInt64(v_1.AuxInt)
 		val := v_2
 		mem := v_3
-		if !(is16Bit(c) && c%4 == 0) {
+		if !((is16Bit(c) && c%4 == 0) || (buildcfg.GOPPC64 >= 10 && is32Bit(c))) {
 			break
 		}
 		v.reset(OpPPC64MOVDstore)
@@ -8583,7 +8072,7 @@
 		return true
 	}
 	// match: (MOVDstoreidx (MOVDconst [c]) ptr val mem)
-	// cond: is16Bit(c) && c%4 == 0
+	// cond: ((is16Bit(c) && c%4 == 0) || (buildcfg.GOPPC64 >= 10 && is32Bit(c)))
 	// result: (MOVDstore [int32(c)] ptr val mem)
 	for {
 		if v_0.Op != OpPPC64MOVDconst {
@@ -8593,7 +8082,7 @@
 		ptr := v_1
 		val := v_2
 		mem := v_3
-		if !(is16Bit(c) && c%4 == 0) {
+		if !((is16Bit(c) && c%4 == 0) || (buildcfg.GOPPC64 >= 10 && is32Bit(c))) {
 			break
 		}
 		v.reset(OpPPC64MOVDstore)
@@ -8601,13 +8090,46 @@
 		v.AddArg3(ptr, val, mem)
 		return true
 	}
+	// match: (MOVDstoreidx ptr idx r:(BRD val) mem)
+	// cond: r.Uses == 1
+	// result: (MOVDBRstoreidx ptr idx val mem)
+	for {
+		ptr := v_0
+		idx := v_1
+		r := v_2
+		if r.Op != OpPPC64BRD {
+			break
+		}
+		val := r.Args[0]
+		mem := v_3
+		if !(r.Uses == 1) {
+			break
+		}
+		v.reset(OpPPC64MOVDBRstoreidx)
+		v.AddArg4(ptr, idx, val, mem)
+		return true
+	}
+	// match: (MOVDstoreidx ptr idx (Bswap64 val) mem)
+	// result: (MOVDBRstoreidx ptr idx val mem)
+	for {
+		ptr := v_0
+		idx := v_1
+		if v_2.Op != OpBswap64 {
+			break
+		}
+		val := v_2.Args[0]
+		mem := v_3
+		v.reset(OpPPC64MOVDBRstoreidx)
+		v.AddArg4(ptr, idx, val, mem)
+		return true
+	}
 	return false
 }
 func rewriteValuePPC64_OpPPC64MOVDstorezero(v *Value) bool {
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
 	// match: (MOVDstorezero [off1] {sym} (ADDconst [off2] x) mem)
-	// cond: is16Bit(int64(off1)+off2)
+	// cond: ((supportsPPC64PCRel() && is32Bit(int64(off1)+off2)) || (is16Bit(int64(off1)+off2)))
 	// result: (MOVDstorezero [off1+int32(off2)] {sym} x mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -8618,7 +8140,7 @@
 		off2 := auxIntToInt64(v_0.AuxInt)
 		x := v_0.Args[0]
 		mem := v_1
-		if !(is16Bit(int64(off1) + off2)) {
+		if !((supportsPPC64PCRel() && is32Bit(int64(off1)+off2)) || (is16Bit(int64(off1) + off2))) {
 			break
 		}
 		v.reset(OpPPC64MOVDstorezero)
@@ -8628,7 +8150,7 @@
 		return true
 	}
 	// match: (MOVDstorezero [off1] {sym1} p:(MOVDaddr [off2] {sym2} x) mem)
-	// cond: canMergeSym(sym1,sym2) && (x.Op != OpSB || p.Uses == 1)
+	// cond: canMergeSym(sym1,sym2) && ((is16Bit(int64(off1+off2)) && (x.Op != OpSB || p.Uses == 1)) || (supportsPPC64PCRel() && is32Bit(int64(off1+off2))))
 	// result: (MOVDstorezero [off1+off2] {mergeSym(sym1,sym2)} x mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -8641,7 +8163,7 @@
 		sym2 := auxToSym(p.Aux)
 		x := p.Args[0]
 		mem := v_1
-		if !(canMergeSym(sym1, sym2) && (x.Op != OpSB || p.Uses == 1)) {
+		if !(canMergeSym(sym1, sym2) && ((is16Bit(int64(off1+off2)) && (x.Op != OpSB || p.Uses == 1)) || (supportsPPC64PCRel() && is32Bit(int64(off1+off2))))) {
 			break
 		}
 		v.reset(OpPPC64MOVDstorezero)
@@ -8656,10 +8178,9 @@
 	v_2 := v.Args[2]
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
-	// match: (MOVHBRstore {sym} ptr (MOVHreg x) mem)
-	// result: (MOVHBRstore {sym} ptr x mem)
+	// match: (MOVHBRstore ptr (MOVHreg x) mem)
+	// result: (MOVHBRstore ptr x mem)
 	for {
-		sym := auxToSym(v.Aux)
 		ptr := v_0
 		if v_1.Op != OpPPC64MOVHreg {
 			break
@@ -8667,14 +8188,12 @@
 		x := v_1.Args[0]
 		mem := v_2
 		v.reset(OpPPC64MOVHBRstore)
-		v.Aux = symToAux(sym)
 		v.AddArg3(ptr, x, mem)
 		return true
 	}
-	// match: (MOVHBRstore {sym} ptr (MOVHZreg x) mem)
-	// result: (MOVHBRstore {sym} ptr x mem)
+	// match: (MOVHBRstore ptr (MOVHZreg x) mem)
+	// result: (MOVHBRstore ptr x mem)
 	for {
-		sym := auxToSym(v.Aux)
 		ptr := v_0
 		if v_1.Op != OpPPC64MOVHZreg {
 			break
@@ -8682,14 +8201,12 @@
 		x := v_1.Args[0]
 		mem := v_2
 		v.reset(OpPPC64MOVHBRstore)
-		v.Aux = symToAux(sym)
 		v.AddArg3(ptr, x, mem)
 		return true
 	}
-	// match: (MOVHBRstore {sym} ptr (MOVWreg x) mem)
-	// result: (MOVHBRstore {sym} ptr x mem)
+	// match: (MOVHBRstore ptr (MOVWreg x) mem)
+	// result: (MOVHBRstore ptr x mem)
 	for {
-		sym := auxToSym(v.Aux)
 		ptr := v_0
 		if v_1.Op != OpPPC64MOVWreg {
 			break
@@ -8697,14 +8214,12 @@
 		x := v_1.Args[0]
 		mem := v_2
 		v.reset(OpPPC64MOVHBRstore)
-		v.Aux = symToAux(sym)
 		v.AddArg3(ptr, x, mem)
 		return true
 	}
-	// match: (MOVHBRstore {sym} ptr (MOVWZreg x) mem)
-	// result: (MOVHBRstore {sym} ptr x mem)
+	// match: (MOVHBRstore ptr (MOVWZreg x) mem)
+	// result: (MOVHBRstore ptr x mem)
 	for {
-		sym := auxToSym(v.Aux)
 		ptr := v_0
 		if v_1.Op != OpPPC64MOVWZreg {
 			break
@@ -8712,7 +8227,6 @@
 		x := v_1.Args[0]
 		mem := v_2
 		v.reset(OpPPC64MOVHBRstore)
-		v.Aux = symToAux(sym)
 		v.AddArg3(ptr, x, mem)
 		return true
 	}
@@ -8722,7 +8236,7 @@
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
 	// match: (MOVHZload [off1] {sym1} p:(MOVDaddr [off2] {sym2} ptr) mem)
-	// cond: canMergeSym(sym1,sym2) && is16Bit(int64(off1+off2)) && (ptr.Op != OpSB || p.Uses == 1)
+	// cond: canMergeSym(sym1,sym2) && ((is16Bit(int64(off1+off2)) && (ptr.Op != OpSB || p.Uses == 1)) || (supportsPPC64PCRel() && is32Bit(int64(off1+off2))))
 	// result: (MOVHZload [off1+off2] {mergeSym(sym1,sym2)} ptr mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -8735,7 +8249,7 @@
 		sym2 := auxToSym(p.Aux)
 		ptr := p.Args[0]
 		mem := v_1
-		if !(canMergeSym(sym1, sym2) && is16Bit(int64(off1+off2)) && (ptr.Op != OpSB || p.Uses == 1)) {
+		if !(canMergeSym(sym1, sym2) && ((is16Bit(int64(off1+off2)) && (ptr.Op != OpSB || p.Uses == 1)) || (supportsPPC64PCRel() && is32Bit(int64(off1+off2))))) {
 			break
 		}
 		v.reset(OpPPC64MOVHZload)
@@ -8745,7 +8259,7 @@
 		return true
 	}
 	// match: (MOVHZload [off1] {sym} (ADDconst [off2] x) mem)
-	// cond: is16Bit(int64(off1)+off2)
+	// cond: (is16Bit(int64(off1)+off2) || (supportsPPC64PCRel() && is32Bit(int64(off1)+off2)))
 	// result: (MOVHZload [off1+int32(off2)] {sym} x mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -8756,7 +8270,7 @@
 		off2 := auxIntToInt64(v_0.AuxInt)
 		x := v_0.Args[0]
 		mem := v_1
-		if !(is16Bit(int64(off1) + off2)) {
+		if !(is16Bit(int64(off1)+off2) || (supportsPPC64PCRel() && is32Bit(int64(off1)+off2))) {
 			break
 		}
 		v.reset(OpPPC64MOVHZload)
@@ -8794,7 +8308,7 @@
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
 	// match: (MOVHZloadidx ptr (MOVDconst [c]) mem)
-	// cond: is16Bit(c)
+	// cond: (is16Bit(c) || (buildcfg.GOPPC64 >= 10 && is32Bit(c)))
 	// result: (MOVHZload [int32(c)] ptr mem)
 	for {
 		ptr := v_0
@@ -8803,7 +8317,7 @@
 		}
 		c := auxIntToInt64(v_1.AuxInt)
 		mem := v_2
-		if !(is16Bit(c)) {
+		if !(is16Bit(c) || (buildcfg.GOPPC64 >= 10 && is32Bit(c))) {
 			break
 		}
 		v.reset(OpPPC64MOVHZload)
@@ -8812,7 +8326,7 @@
 		return true
 	}
 	// match: (MOVHZloadidx (MOVDconst [c]) ptr mem)
-	// cond: is16Bit(c)
+	// cond: (is16Bit(c) || (buildcfg.GOPPC64 >= 10 && is32Bit(c)))
 	// result: (MOVHZload [int32(c)] ptr mem)
 	for {
 		if v_0.Op != OpPPC64MOVDconst {
@@ -8821,7 +8335,7 @@
 		c := auxIntToInt64(v_0.AuxInt)
 		ptr := v_1
 		mem := v_2
-		if !(is16Bit(c)) {
+		if !(is16Bit(c) || (buildcfg.GOPPC64 >= 10 && is32Bit(c))) {
 			break
 		}
 		v.reset(OpPPC64MOVHZload)
@@ -9225,7 +8739,7 @@
 		return true
 	}
 	// match: (MOVHZreg x:(Arg <t>))
-	// cond: (is8BitInt(t) || is16BitInt(t)) && !isSigned(t)
+	// cond: (is8BitInt(t) || is16BitInt(t)) && !t.IsSigned()
 	// result: x
 	for {
 		x := v_0
@@ -9233,7 +8747,7 @@
 			break
 		}
 		t := x.Type
-		if !((is8BitInt(t) || is16BitInt(t)) && !isSigned(t)) {
+		if !((is8BitInt(t) || is16BitInt(t)) && !t.IsSigned()) {
 			break
 		}
 		v.copyOf(x)
@@ -9256,7 +8770,7 @@
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
 	// match: (MOVHload [off1] {sym1} p:(MOVDaddr [off2] {sym2} ptr) mem)
-	// cond: canMergeSym(sym1,sym2) && is16Bit(int64(off1+off2)) && (ptr.Op != OpSB || p.Uses == 1)
+	// cond: canMergeSym(sym1,sym2) && ((is16Bit(int64(off1+off2)) && (ptr.Op != OpSB || p.Uses == 1)) || (supportsPPC64PCRel() && is32Bit(int64(off1+off2))))
 	// result: (MOVHload [off1+off2] {mergeSym(sym1,sym2)} ptr mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -9269,7 +8783,7 @@
 		sym2 := auxToSym(p.Aux)
 		ptr := p.Args[0]
 		mem := v_1
-		if !(canMergeSym(sym1, sym2) && is16Bit(int64(off1+off2)) && (ptr.Op != OpSB || p.Uses == 1)) {
+		if !(canMergeSym(sym1, sym2) && ((is16Bit(int64(off1+off2)) && (ptr.Op != OpSB || p.Uses == 1)) || (supportsPPC64PCRel() && is32Bit(int64(off1+off2))))) {
 			break
 		}
 		v.reset(OpPPC64MOVHload)
@@ -9279,7 +8793,7 @@
 		return true
 	}
 	// match: (MOVHload [off1] {sym} (ADDconst [off2] x) mem)
-	// cond: is16Bit(int64(off1)+off2)
+	// cond: (is16Bit(int64(off1)+off2) || (supportsPPC64PCRel() && is32Bit(int64(off1)+off2)))
 	// result: (MOVHload [off1+int32(off2)] {sym} x mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -9290,7 +8804,7 @@
 		off2 := auxIntToInt64(v_0.AuxInt)
 		x := v_0.Args[0]
 		mem := v_1
-		if !(is16Bit(int64(off1) + off2)) {
+		if !(is16Bit(int64(off1)+off2) || (supportsPPC64PCRel() && is32Bit(int64(off1)+off2))) {
 			break
 		}
 		v.reset(OpPPC64MOVHload)
@@ -9328,7 +8842,7 @@
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
 	// match: (MOVHloadidx ptr (MOVDconst [c]) mem)
-	// cond: is16Bit(c)
+	// cond: (is16Bit(c) || (buildcfg.GOPPC64 >= 10 && is32Bit(c)))
 	// result: (MOVHload [int32(c)] ptr mem)
 	for {
 		ptr := v_0
@@ -9337,7 +8851,7 @@
 		}
 		c := auxIntToInt64(v_1.AuxInt)
 		mem := v_2
-		if !(is16Bit(c)) {
+		if !(is16Bit(c) || (buildcfg.GOPPC64 >= 10 && is32Bit(c))) {
 			break
 		}
 		v.reset(OpPPC64MOVHload)
@@ -9346,7 +8860,7 @@
 		return true
 	}
 	// match: (MOVHloadidx (MOVDconst [c]) ptr mem)
-	// cond: is16Bit(c)
+	// cond: (is16Bit(c) || (buildcfg.GOPPC64 >= 10 && is32Bit(c)))
 	// result: (MOVHload [int32(c)] ptr mem)
 	for {
 		if v_0.Op != OpPPC64MOVDconst {
@@ -9355,7 +8869,7 @@
 		c := auxIntToInt64(v_0.AuxInt)
 		ptr := v_1
 		mem := v_2
-		if !(is16Bit(c)) {
+		if !(is16Bit(c) || (buildcfg.GOPPC64 >= 10 && is32Bit(c))) {
 			break
 		}
 		v.reset(OpPPC64MOVHload)
@@ -9598,7 +9112,7 @@
 		return true
 	}
 	// match: (MOVHreg x:(Arg <t>))
-	// cond: (is8BitInt(t) || is16BitInt(t)) && isSigned(t)
+	// cond: (is8BitInt(t) || is16BitInt(t)) && t.IsSigned()
 	// result: x
 	for {
 		x := v_0
@@ -9606,7 +9120,7 @@
 			break
 		}
 		t := x.Type
-		if !((is8BitInt(t) || is16BitInt(t)) && isSigned(t)) {
+		if !((is8BitInt(t) || is16BitInt(t)) && t.IsSigned()) {
 			break
 		}
 		v.copyOf(x)
@@ -9630,9 +9144,8 @@
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
 	b := v.Block
-	config := b.Func.Config
 	// match: (MOVHstore [off1] {sym} (ADDconst [off2] x) val mem)
-	// cond: is16Bit(int64(off1)+off2)
+	// cond: (is16Bit(int64(off1)+off2) || (supportsPPC64PCRel() && is32Bit(int64(off1)+off2)))
 	// result: (MOVHstore [off1+int32(off2)] {sym} x val mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -9644,7 +9157,7 @@
 		x := v_0.Args[0]
 		val := v_1
 		mem := v_2
-		if !(is16Bit(int64(off1) + off2)) {
+		if !(is16Bit(int64(off1)+off2) || (supportsPPC64PCRel() && is32Bit(int64(off1)+off2))) {
 			break
 		}
 		v.reset(OpPPC64MOVHstore)
@@ -9654,7 +9167,7 @@
 		return true
 	}
 	// match: (MOVHstore [off1] {sym1} p:(MOVDaddr [off2] {sym2} ptr) val mem)
-	// cond: canMergeSym(sym1,sym2) && is16Bit(int64(off1+off2)) && (ptr.Op != OpSB || p.Uses == 1)
+	// cond: canMergeSym(sym1,sym2) && ((is16Bit(int64(off1+off2)) && (ptr.Op != OpSB || p.Uses == 1)) || (supportsPPC64PCRel() && is32Bit(int64(off1+off2))))
 	// result: (MOVHstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -9668,7 +9181,7 @@
 		ptr := p.Args[0]
 		val := v_1
 		mem := v_2
-		if !(canMergeSym(sym1, sym2) && is16Bit(int64(off1+off2)) && (ptr.Op != OpSB || p.Uses == 1)) {
+		if !(canMergeSym(sym1, sym2) && ((is16Bit(int64(off1+off2)) && (ptr.Op != OpSB || p.Uses == 1)) || (supportsPPC64PCRel() && is32Bit(int64(off1+off2))))) {
 			break
 		}
 		v.reset(OpPPC64MOVHstore)
@@ -9784,62 +9297,47 @@
 		v.AddArg3(ptr, x, mem)
 		return true
 	}
-	// match: (MOVHstore [i1] {s} p (SRWconst w [16]) x0:(MOVHstore [i0] {s} p w mem))
-	// cond: !config.BigEndian && x0.Uses == 1 && i1 == i0+2 && clobber(x0)
-	// result: (MOVWstore [i0] {s} p w mem)
+	// match: (MOVHstore [off] {sym} ptr r:(BRH val) mem)
+	// cond: r.Uses == 1
+	// result: (MOVHBRstore (MOVDaddr <ptr.Type> [off] {sym} ptr) val mem)
 	for {
-		i1 := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p := v_0
-		if v_1.Op != OpPPC64SRWconst || auxIntToInt64(v_1.AuxInt) != 16 {
+		off := auxIntToInt32(v.AuxInt)
+		sym := auxToSym(v.Aux)
+		ptr := v_0
+		r := v_1
+		if r.Op != OpPPC64BRH {
 			break
 		}
-		w := v_1.Args[0]
-		x0 := v_2
-		if x0.Op != OpPPC64MOVHstore {
+		val := r.Args[0]
+		mem := v_2
+		if !(r.Uses == 1) {
 			break
 		}
-		i0 := auxIntToInt32(x0.AuxInt)
-		if auxToSym(x0.Aux) != s {
-			break
-		}
-		mem := x0.Args[2]
-		if p != x0.Args[0] || w != x0.Args[1] || !(!config.BigEndian && x0.Uses == 1 && i1 == i0+2 && clobber(x0)) {
-			break
-		}
-		v.reset(OpPPC64MOVWstore)
-		v.AuxInt = int32ToAuxInt(i0)
-		v.Aux = symToAux(s)
-		v.AddArg3(p, w, mem)
+		v.reset(OpPPC64MOVHBRstore)
+		v0 := b.NewValue0(v.Pos, OpPPC64MOVDaddr, ptr.Type)
+		v0.AuxInt = int32ToAuxInt(off)
+		v0.Aux = symToAux(sym)
+		v0.AddArg(ptr)
+		v.AddArg3(v0, val, mem)
 		return true
 	}
-	// match: (MOVHstore [i1] {s} p (SRDconst w [16]) x0:(MOVHstore [i0] {s} p w mem))
-	// cond: !config.BigEndian && x0.Uses == 1 && i1 == i0+2 && clobber(x0)
-	// result: (MOVWstore [i0] {s} p w mem)
+	// match: (MOVHstore [off] {sym} ptr (Bswap16 val) mem)
+	// result: (MOVHBRstore (MOVDaddr <ptr.Type> [off] {sym} ptr) val mem)
 	for {
-		i1 := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p := v_0
-		if v_1.Op != OpPPC64SRDconst || auxIntToInt64(v_1.AuxInt) != 16 {
+		off := auxIntToInt32(v.AuxInt)
+		sym := auxToSym(v.Aux)
+		ptr := v_0
+		if v_1.Op != OpBswap16 {
 			break
 		}
-		w := v_1.Args[0]
-		x0 := v_2
-		if x0.Op != OpPPC64MOVHstore {
-			break
-		}
-		i0 := auxIntToInt32(x0.AuxInt)
-		if auxToSym(x0.Aux) != s {
-			break
-		}
-		mem := x0.Args[2]
-		if p != x0.Args[0] || w != x0.Args[1] || !(!config.BigEndian && x0.Uses == 1 && i1 == i0+2 && clobber(x0)) {
-			break
-		}
-		v.reset(OpPPC64MOVWstore)
-		v.AuxInt = int32ToAuxInt(i0)
-		v.Aux = symToAux(s)
-		v.AddArg3(p, w, mem)
+		val := v_1.Args[0]
+		mem := v_2
+		v.reset(OpPPC64MOVHBRstore)
+		v0 := b.NewValue0(v.Pos, OpPPC64MOVDaddr, ptr.Type)
+		v0.AuxInt = int32ToAuxInt(off)
+		v0.Aux = symToAux(sym)
+		v0.AddArg(ptr)
+		v.AddArg3(v0, val, mem)
 		return true
 	}
 	return false
@@ -9850,7 +9348,7 @@
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
 	// match: (MOVHstoreidx ptr (MOVDconst [c]) val mem)
-	// cond: is16Bit(c)
+	// cond: (is16Bit(c) || (buildcfg.GOPPC64 >= 10 && is32Bit(c)))
 	// result: (MOVHstore [int32(c)] ptr val mem)
 	for {
 		ptr := v_0
@@ -9860,7 +9358,7 @@
 		c := auxIntToInt64(v_1.AuxInt)
 		val := v_2
 		mem := v_3
-		if !(is16Bit(c)) {
+		if !(is16Bit(c) || (buildcfg.GOPPC64 >= 10 && is32Bit(c))) {
 			break
 		}
 		v.reset(OpPPC64MOVHstore)
@@ -9869,7 +9367,7 @@
 		return true
 	}
 	// match: (MOVHstoreidx (MOVDconst [c]) ptr val mem)
-	// cond: is16Bit(c)
+	// cond: (is16Bit(c) || (buildcfg.GOPPC64 >= 10 && is32Bit(c)))
 	// result: (MOVHstore [int32(c)] ptr val mem)
 	for {
 		if v_0.Op != OpPPC64MOVDconst {
@@ -9879,7 +9377,7 @@
 		ptr := v_1
 		val := v_2
 		mem := v_3
-		if !(is16Bit(c)) {
+		if !(is16Bit(c) || (buildcfg.GOPPC64 >= 10 && is32Bit(c))) {
 			break
 		}
 		v.reset(OpPPC64MOVHstore)
@@ -9943,13 +9441,46 @@
 		v.AddArg4(ptr, idx, x, mem)
 		return true
 	}
+	// match: (MOVHstoreidx ptr idx r:(BRH val) mem)
+	// cond: r.Uses == 1
+	// result: (MOVHBRstoreidx ptr idx val mem)
+	for {
+		ptr := v_0
+		idx := v_1
+		r := v_2
+		if r.Op != OpPPC64BRH {
+			break
+		}
+		val := r.Args[0]
+		mem := v_3
+		if !(r.Uses == 1) {
+			break
+		}
+		v.reset(OpPPC64MOVHBRstoreidx)
+		v.AddArg4(ptr, idx, val, mem)
+		return true
+	}
+	// match: (MOVHstoreidx ptr idx (Bswap16 val) mem)
+	// result: (MOVHBRstoreidx ptr idx val mem)
+	for {
+		ptr := v_0
+		idx := v_1
+		if v_2.Op != OpBswap16 {
+			break
+		}
+		val := v_2.Args[0]
+		mem := v_3
+		v.reset(OpPPC64MOVHBRstoreidx)
+		v.AddArg4(ptr, idx, val, mem)
+		return true
+	}
 	return false
 }
 func rewriteValuePPC64_OpPPC64MOVHstorezero(v *Value) bool {
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
 	// match: (MOVHstorezero [off1] {sym} (ADDconst [off2] x) mem)
-	// cond: is16Bit(int64(off1)+off2)
+	// cond: ((supportsPPC64PCRel() && is32Bit(int64(off1)+off2)) || (is16Bit(int64(off1)+off2)))
 	// result: (MOVHstorezero [off1+int32(off2)] {sym} x mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -9960,7 +9491,7 @@
 		off2 := auxIntToInt64(v_0.AuxInt)
 		x := v_0.Args[0]
 		mem := v_1
-		if !(is16Bit(int64(off1) + off2)) {
+		if !((supportsPPC64PCRel() && is32Bit(int64(off1)+off2)) || (is16Bit(int64(off1) + off2))) {
 			break
 		}
 		v.reset(OpPPC64MOVHstorezero)
@@ -9970,7 +9501,7 @@
 		return true
 	}
 	// match: (MOVHstorezero [off1] {sym1} p:(MOVDaddr [off2] {sym2} x) mem)
-	// cond: canMergeSym(sym1,sym2) && (x.Op != OpSB || p.Uses == 1)
+	// cond: canMergeSym(sym1,sym2) && ((is16Bit(int64(off1+off2)) && (x.Op != OpSB || p.Uses == 1)) || (supportsPPC64PCRel() && is32Bit(int64(off1+off2))))
 	// result: (MOVHstorezero [off1+off2] {mergeSym(sym1,sym2)} x mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -9983,7 +9514,7 @@
 		sym2 := auxToSym(p.Aux)
 		x := p.Args[0]
 		mem := v_1
-		if !(canMergeSym(sym1, sym2) && (x.Op != OpSB || p.Uses == 1)) {
+		if !(canMergeSym(sym1, sym2) && ((is16Bit(int64(off1+off2)) && (x.Op != OpSB || p.Uses == 1)) || (supportsPPC64PCRel() && is32Bit(int64(off1+off2))))) {
 			break
 		}
 		v.reset(OpPPC64MOVHstorezero)
@@ -9998,10 +9529,9 @@
 	v_2 := v.Args[2]
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
-	// match: (MOVWBRstore {sym} ptr (MOVWreg x) mem)
-	// result: (MOVWBRstore {sym} ptr x mem)
+	// match: (MOVWBRstore ptr (MOVWreg x) mem)
+	// result: (MOVWBRstore ptr x mem)
 	for {
-		sym := auxToSym(v.Aux)
 		ptr := v_0
 		if v_1.Op != OpPPC64MOVWreg {
 			break
@@ -10009,14 +9539,12 @@
 		x := v_1.Args[0]
 		mem := v_2
 		v.reset(OpPPC64MOVWBRstore)
-		v.Aux = symToAux(sym)
 		v.AddArg3(ptr, x, mem)
 		return true
 	}
-	// match: (MOVWBRstore {sym} ptr (MOVWZreg x) mem)
-	// result: (MOVWBRstore {sym} ptr x mem)
+	// match: (MOVWBRstore ptr (MOVWZreg x) mem)
+	// result: (MOVWBRstore ptr x mem)
 	for {
-		sym := auxToSym(v.Aux)
 		ptr := v_0
 		if v_1.Op != OpPPC64MOVWZreg {
 			break
@@ -10024,7 +9552,6 @@
 		x := v_1.Args[0]
 		mem := v_2
 		v.reset(OpPPC64MOVWBRstore)
-		v.Aux = symToAux(sym)
 		v.AddArg3(ptr, x, mem)
 		return true
 	}
@@ -10034,7 +9561,7 @@
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
 	// match: (MOVWZload [off1] {sym1} p:(MOVDaddr [off2] {sym2} ptr) mem)
-	// cond: canMergeSym(sym1,sym2) && is16Bit(int64(off1+off2)) && (ptr.Op != OpSB || p.Uses == 1)
+	// cond: canMergeSym(sym1,sym2) && ((is16Bit(int64(off1+off2)) && (ptr.Op != OpSB || p.Uses == 1)) || (supportsPPC64PCRel() && is32Bit(int64(off1+off2))))
 	// result: (MOVWZload [off1+off2] {mergeSym(sym1,sym2)} ptr mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -10047,7 +9574,7 @@
 		sym2 := auxToSym(p.Aux)
 		ptr := p.Args[0]
 		mem := v_1
-		if !(canMergeSym(sym1, sym2) && is16Bit(int64(off1+off2)) && (ptr.Op != OpSB || p.Uses == 1)) {
+		if !(canMergeSym(sym1, sym2) && ((is16Bit(int64(off1+off2)) && (ptr.Op != OpSB || p.Uses == 1)) || (supportsPPC64PCRel() && is32Bit(int64(off1+off2))))) {
 			break
 		}
 		v.reset(OpPPC64MOVWZload)
@@ -10057,7 +9584,7 @@
 		return true
 	}
 	// match: (MOVWZload [off1] {sym} (ADDconst [off2] x) mem)
-	// cond: is16Bit(int64(off1)+off2)
+	// cond: (is16Bit(int64(off1)+off2) || (supportsPPC64PCRel() && is32Bit(int64(off1)+off2)))
 	// result: (MOVWZload [off1+int32(off2)] {sym} x mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -10068,7 +9595,7 @@
 		off2 := auxIntToInt64(v_0.AuxInt)
 		x := v_0.Args[0]
 		mem := v_1
-		if !(is16Bit(int64(off1) + off2)) {
+		if !(is16Bit(int64(off1)+off2) || (supportsPPC64PCRel() && is32Bit(int64(off1)+off2))) {
 			break
 		}
 		v.reset(OpPPC64MOVWZload)
@@ -10106,7 +9633,7 @@
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
 	// match: (MOVWZloadidx ptr (MOVDconst [c]) mem)
-	// cond: is16Bit(c)
+	// cond: (is16Bit(c) || (buildcfg.GOPPC64 >= 10 && is32Bit(c)))
 	// result: (MOVWZload [int32(c)] ptr mem)
 	for {
 		ptr := v_0
@@ -10115,7 +9642,7 @@
 		}
 		c := auxIntToInt64(v_1.AuxInt)
 		mem := v_2
-		if !(is16Bit(c)) {
+		if !(is16Bit(c) || (buildcfg.GOPPC64 >= 10 && is32Bit(c))) {
 			break
 		}
 		v.reset(OpPPC64MOVWZload)
@@ -10124,7 +9651,7 @@
 		return true
 	}
 	// match: (MOVWZloadidx (MOVDconst [c]) ptr mem)
-	// cond: is16Bit(c)
+	// cond: (is16Bit(c) || (buildcfg.GOPPC64 >= 10 && is32Bit(c)))
 	// result: (MOVWZload [int32(c)] ptr mem)
 	for {
 		if v_0.Op != OpPPC64MOVDconst {
@@ -10133,7 +9660,7 @@
 		c := auxIntToInt64(v_0.AuxInt)
 		ptr := v_1
 		mem := v_2
-		if !(is16Bit(c)) {
+		if !(is16Bit(c) || (buildcfg.GOPPC64 >= 10 && is32Bit(c))) {
 			break
 		}
 		v.reset(OpPPC64MOVWZload)
@@ -10562,7 +10089,7 @@
 		return true
 	}
 	// match: (MOVWZreg x:(Arg <t>))
-	// cond: (is8BitInt(t) || is16BitInt(t) || is32BitInt(t)) && !isSigned(t)
+	// cond: (is8BitInt(t) || is16BitInt(t) || is32BitInt(t)) && !t.IsSigned()
 	// result: x
 	for {
 		x := v_0
@@ -10570,7 +10097,7 @@
 			break
 		}
 		t := x.Type
-		if !((is8BitInt(t) || is16BitInt(t) || is32BitInt(t)) && !isSigned(t)) {
+		if !((is8BitInt(t) || is16BitInt(t) || is32BitInt(t)) && !t.IsSigned()) {
 			break
 		}
 		v.copyOf(x)
@@ -10593,7 +10120,7 @@
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
 	// match: (MOVWload [off1] {sym1} p:(MOVDaddr [off2] {sym2} ptr) mem)
-	// cond: canMergeSym(sym1,sym2) && is16Bit(int64(off1+off2)) && (ptr.Op != OpSB || p.Uses == 1)
+	// cond: canMergeSym(sym1,sym2) && ((is16Bit(int64(off1+off2)) && (ptr.Op != OpSB || p.Uses == 1)) || (supportsPPC64PCRel() && is32Bit(int64(off1+off2))))
 	// result: (MOVWload [off1+off2] {mergeSym(sym1,sym2)} ptr mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -10606,7 +10133,7 @@
 		sym2 := auxToSym(p.Aux)
 		ptr := p.Args[0]
 		mem := v_1
-		if !(canMergeSym(sym1, sym2) && is16Bit(int64(off1+off2)) && (ptr.Op != OpSB || p.Uses == 1)) {
+		if !(canMergeSym(sym1, sym2) && ((is16Bit(int64(off1+off2)) && (ptr.Op != OpSB || p.Uses == 1)) || (supportsPPC64PCRel() && is32Bit(int64(off1+off2))))) {
 			break
 		}
 		v.reset(OpPPC64MOVWload)
@@ -10616,7 +10143,7 @@
 		return true
 	}
 	// match: (MOVWload [off1] {sym} (ADDconst [off2] x) mem)
-	// cond: is16Bit(int64(off1)+off2)
+	// cond: (is16Bit(int64(off1)+off2) || (supportsPPC64PCRel() && is32Bit(int64(off1)+off2)))
 	// result: (MOVWload [off1+int32(off2)] {sym} x mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -10627,7 +10154,7 @@
 		off2 := auxIntToInt64(v_0.AuxInt)
 		x := v_0.Args[0]
 		mem := v_1
-		if !(is16Bit(int64(off1) + off2)) {
+		if !(is16Bit(int64(off1)+off2) || (supportsPPC64PCRel() && is32Bit(int64(off1)+off2))) {
 			break
 		}
 		v.reset(OpPPC64MOVWload)
@@ -10665,7 +10192,7 @@
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
 	// match: (MOVWloadidx ptr (MOVDconst [c]) mem)
-	// cond: is16Bit(c) && c%4 == 0
+	// cond: ((is16Bit(c) && c%4 == 0) || (buildcfg.GOPPC64 >= 10 && is32Bit(c)))
 	// result: (MOVWload [int32(c)] ptr mem)
 	for {
 		ptr := v_0
@@ -10674,7 +10201,7 @@
 		}
 		c := auxIntToInt64(v_1.AuxInt)
 		mem := v_2
-		if !(is16Bit(c) && c%4 == 0) {
+		if !((is16Bit(c) && c%4 == 0) || (buildcfg.GOPPC64 >= 10 && is32Bit(c))) {
 			break
 		}
 		v.reset(OpPPC64MOVWload)
@@ -10683,7 +10210,7 @@
 		return true
 	}
 	// match: (MOVWloadidx (MOVDconst [c]) ptr mem)
-	// cond: is16Bit(c) && c%4 == 0
+	// cond: ((is16Bit(c) && c%4 == 0) || (buildcfg.GOPPC64 >= 10 && is32Bit(c)))
 	// result: (MOVWload [int32(c)] ptr mem)
 	for {
 		if v_0.Op != OpPPC64MOVDconst {
@@ -10692,7 +10219,7 @@
 		c := auxIntToInt64(v_0.AuxInt)
 		ptr := v_1
 		mem := v_2
-		if !(is16Bit(c) && c%4 == 0) {
+		if !((is16Bit(c) && c%4 == 0) || (buildcfg.GOPPC64 >= 10 && is32Bit(c))) {
 			break
 		}
 		v.reset(OpPPC64MOVWload)
@@ -10956,7 +10483,7 @@
 		return true
 	}
 	// match: (MOVWreg x:(Arg <t>))
-	// cond: (is8BitInt(t) || is16BitInt(t) || is32BitInt(t)) && isSigned(t)
+	// cond: (is8BitInt(t) || is16BitInt(t) || is32BitInt(t)) && t.IsSigned()
 	// result: x
 	for {
 		x := v_0
@@ -10964,7 +10491,7 @@
 			break
 		}
 		t := x.Type
-		if !((is8BitInt(t) || is16BitInt(t) || is32BitInt(t)) && isSigned(t)) {
+		if !((is8BitInt(t) || is16BitInt(t) || is32BitInt(t)) && t.IsSigned()) {
 			break
 		}
 		v.copyOf(x)
@@ -10987,8 +10514,9 @@
 	v_2 := v.Args[2]
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
+	b := v.Block
 	// match: (MOVWstore [off1] {sym} (ADDconst [off2] x) val mem)
-	// cond: is16Bit(int64(off1)+off2)
+	// cond: (is16Bit(int64(off1)+off2) || (supportsPPC64PCRel() && is32Bit(int64(off1)+off2)))
 	// result: (MOVWstore [off1+int32(off2)] {sym} x val mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -11000,7 +10528,7 @@
 		x := v_0.Args[0]
 		val := v_1
 		mem := v_2
-		if !(is16Bit(int64(off1) + off2)) {
+		if !(is16Bit(int64(off1)+off2) || (supportsPPC64PCRel() && is32Bit(int64(off1)+off2))) {
 			break
 		}
 		v.reset(OpPPC64MOVWstore)
@@ -11010,7 +10538,7 @@
 		return true
 	}
 	// match: (MOVWstore [off1] {sym1} p:(MOVDaddr [off2] {sym2} ptr) val mem)
-	// cond: canMergeSym(sym1,sym2) && is16Bit(int64(off1+off2)) && (ptr.Op != OpSB || p.Uses == 1)
+	// cond: canMergeSym(sym1,sym2) && ((is16Bit(int64(off1+off2)) && (ptr.Op != OpSB || p.Uses == 1)) || (supportsPPC64PCRel() && is32Bit(int64(off1+off2))))
 	// result: (MOVWstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -11024,7 +10552,7 @@
 		ptr := p.Args[0]
 		val := v_1
 		mem := v_2
-		if !(canMergeSym(sym1, sym2) && is16Bit(int64(off1+off2)) && (ptr.Op != OpSB || p.Uses == 1)) {
+		if !(canMergeSym(sym1, sym2) && ((is16Bit(int64(off1+off2)) && (ptr.Op != OpSB || p.Uses == 1)) || (supportsPPC64PCRel() && is32Bit(int64(off1+off2))))) {
 			break
 		}
 		v.reset(OpPPC64MOVWstore)
@@ -11106,6 +10634,49 @@
 		v.AddArg3(ptr, x, mem)
 		return true
 	}
+	// match: (MOVWstore [off] {sym} ptr r:(BRW val) mem)
+	// cond: r.Uses == 1
+	// result: (MOVWBRstore (MOVDaddr <ptr.Type> [off] {sym} ptr) val mem)
+	for {
+		off := auxIntToInt32(v.AuxInt)
+		sym := auxToSym(v.Aux)
+		ptr := v_0
+		r := v_1
+		if r.Op != OpPPC64BRW {
+			break
+		}
+		val := r.Args[0]
+		mem := v_2
+		if !(r.Uses == 1) {
+			break
+		}
+		v.reset(OpPPC64MOVWBRstore)
+		v0 := b.NewValue0(v.Pos, OpPPC64MOVDaddr, ptr.Type)
+		v0.AuxInt = int32ToAuxInt(off)
+		v0.Aux = symToAux(sym)
+		v0.AddArg(ptr)
+		v.AddArg3(v0, val, mem)
+		return true
+	}
+	// match: (MOVWstore [off] {sym} ptr (Bswap32 val) mem)
+	// result: (MOVWBRstore (MOVDaddr <ptr.Type> [off] {sym} ptr) val mem)
+	for {
+		off := auxIntToInt32(v.AuxInt)
+		sym := auxToSym(v.Aux)
+		ptr := v_0
+		if v_1.Op != OpBswap32 {
+			break
+		}
+		val := v_1.Args[0]
+		mem := v_2
+		v.reset(OpPPC64MOVWBRstore)
+		v0 := b.NewValue0(v.Pos, OpPPC64MOVDaddr, ptr.Type)
+		v0.AuxInt = int32ToAuxInt(off)
+		v0.Aux = symToAux(sym)
+		v0.AddArg(ptr)
+		v.AddArg3(v0, val, mem)
+		return true
+	}
 	return false
 }
 func rewriteValuePPC64_OpPPC64MOVWstoreidx(v *Value) bool {
@@ -11114,7 +10685,7 @@
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
 	// match: (MOVWstoreidx ptr (MOVDconst [c]) val mem)
-	// cond: is16Bit(c)
+	// cond: (is16Bit(c) || (buildcfg.GOPPC64 >= 10 && is32Bit(c)))
 	// result: (MOVWstore [int32(c)] ptr val mem)
 	for {
 		ptr := v_0
@@ -11124,7 +10695,7 @@
 		c := auxIntToInt64(v_1.AuxInt)
 		val := v_2
 		mem := v_3
-		if !(is16Bit(c)) {
+		if !(is16Bit(c) || (buildcfg.GOPPC64 >= 10 && is32Bit(c))) {
 			break
 		}
 		v.reset(OpPPC64MOVWstore)
@@ -11133,7 +10704,7 @@
 		return true
 	}
 	// match: (MOVWstoreidx (MOVDconst [c]) ptr val mem)
-	// cond: is16Bit(c)
+	// cond: (is16Bit(c) || (buildcfg.GOPPC64 >= 10 && is32Bit(c)))
 	// result: (MOVWstore [int32(c)] ptr val mem)
 	for {
 		if v_0.Op != OpPPC64MOVDconst {
@@ -11143,7 +10714,7 @@
 		ptr := v_1
 		val := v_2
 		mem := v_3
-		if !(is16Bit(c)) {
+		if !(is16Bit(c) || (buildcfg.GOPPC64 >= 10 && is32Bit(c))) {
 			break
 		}
 		v.reset(OpPPC64MOVWstore)
@@ -11179,13 +10750,46 @@
 		v.AddArg4(ptr, idx, x, mem)
 		return true
 	}
+	// match: (MOVWstoreidx ptr idx r:(BRW val) mem)
+	// cond: r.Uses == 1
+	// result: (MOVWBRstoreidx ptr idx val mem)
+	for {
+		ptr := v_0
+		idx := v_1
+		r := v_2
+		if r.Op != OpPPC64BRW {
+			break
+		}
+		val := r.Args[0]
+		mem := v_3
+		if !(r.Uses == 1) {
+			break
+		}
+		v.reset(OpPPC64MOVWBRstoreidx)
+		v.AddArg4(ptr, idx, val, mem)
+		return true
+	}
+	// match: (MOVWstoreidx ptr idx (Bswap32 val) mem)
+	// result: (MOVWBRstoreidx ptr idx val mem)
+	for {
+		ptr := v_0
+		idx := v_1
+		if v_2.Op != OpBswap32 {
+			break
+		}
+		val := v_2.Args[0]
+		mem := v_3
+		v.reset(OpPPC64MOVWBRstoreidx)
+		v.AddArg4(ptr, idx, val, mem)
+		return true
+	}
 	return false
 }
 func rewriteValuePPC64_OpPPC64MOVWstorezero(v *Value) bool {
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
 	// match: (MOVWstorezero [off1] {sym} (ADDconst [off2] x) mem)
-	// cond: is16Bit(int64(off1)+off2)
+	// cond: ((supportsPPC64PCRel() && is32Bit(int64(off1)+off2)) || (is16Bit(int64(off1)+off2)))
 	// result: (MOVWstorezero [off1+int32(off2)] {sym} x mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -11196,7 +10800,7 @@
 		off2 := auxIntToInt64(v_0.AuxInt)
 		x := v_0.Args[0]
 		mem := v_1
-		if !(is16Bit(int64(off1) + off2)) {
+		if !((supportsPPC64PCRel() && is32Bit(int64(off1)+off2)) || (is16Bit(int64(off1) + off2))) {
 			break
 		}
 		v.reset(OpPPC64MOVWstorezero)
@@ -11206,7 +10810,7 @@
 		return true
 	}
 	// match: (MOVWstorezero [off1] {sym1} p:(MOVDaddr [off2] {sym2} x) mem)
-	// cond: canMergeSym(sym1,sym2) && (x.Op != OpSB || p.Uses == 1)
+	// cond: canMergeSym(sym1,sym2) && ((is16Bit(int64(off1+off2)) && (x.Op != OpSB || p.Uses == 1)) || (supportsPPC64PCRel() && is32Bit(int64(off1+off2))))
 	// result: (MOVWstorezero [off1+off2] {mergeSym(sym1,sym2)} x mem)
 	for {
 		off1 := auxIntToInt32(v.AuxInt)
@@ -11219,7 +10823,7 @@
 		sym2 := auxToSym(p.Aux)
 		x := p.Args[0]
 		mem := v_1
-		if !(canMergeSym(sym1, sym2) && (x.Op != OpSB || p.Uses == 1)) {
+		if !(canMergeSym(sym1, sym2) && ((is16Bit(int64(off1+off2)) && (x.Op != OpSB || p.Uses == 1)) || (supportsPPC64PCRel() && is32Bit(int64(off1+off2))))) {
 			break
 		}
 		v.reset(OpPPC64MOVWstorezero)
@@ -11409,8 +11013,6 @@
 }
 func rewriteValuePPC64_OpPPC64NotEqual(v *Value) bool {
 	v_0 := v.Args[0]
-	b := v.Block
-	typ := &b.Func.Config.Types
 	// match: (NotEqual (FlagEQ))
 	// result: (MOVDconst [0])
 	for {
@@ -11453,23 +11055,18 @@
 		return true
 	}
 	// match: (NotEqual cmp)
-	// result: (ISELB [6] (MOVDconst [1]) cmp)
+	// result: (SETBCR [2] cmp)
 	for {
 		cmp := v_0
-		v.reset(OpPPC64ISELB)
-		v.AuxInt = int32ToAuxInt(6)
-		v0 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v0.AuxInt = int64ToAuxInt(1)
-		v.AddArg2(v0, cmp)
+		v.reset(OpPPC64SETBCR)
+		v.AuxInt = int32ToAuxInt(2)
+		v.AddArg(cmp)
 		return true
 	}
 }
 func rewriteValuePPC64_OpPPC64OR(v *Value) bool {
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
-	b := v.Block
-	config := b.Func.Config
-	typ := &b.Func.Config.Types
 	// match: (OR x (NOR y y))
 	// result: (ORN x y)
 	for {
@@ -11526,1293 +11123,6 @@
 		}
 		break
 	}
-	// match: (OR <t> x0:(MOVBZload [i0] {s} p mem) o1:(SLWconst x1:(MOVBZload [i1] {s} p mem) [8]))
-	// cond: !config.BigEndian && i1 == i0+1 && x0.Uses ==1 && x1.Uses == 1 && o1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0, x1, o1)
-	// result: @mergePoint(b,x0,x1) (MOVHZload <t> {s} [i0] p mem)
-	for {
-		t := v.Type
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			x0 := v_0
-			if x0.Op != OpPPC64MOVBZload {
-				continue
-			}
-			i0 := auxIntToInt32(x0.AuxInt)
-			s := auxToSym(x0.Aux)
-			mem := x0.Args[1]
-			p := x0.Args[0]
-			o1 := v_1
-			if o1.Op != OpPPC64SLWconst || auxIntToInt64(o1.AuxInt) != 8 {
-				continue
-			}
-			x1 := o1.Args[0]
-			if x1.Op != OpPPC64MOVBZload {
-				continue
-			}
-			i1 := auxIntToInt32(x1.AuxInt)
-			if auxToSym(x1.Aux) != s {
-				continue
-			}
-			_ = x1.Args[1]
-			if p != x1.Args[0] || mem != x1.Args[1] || !(!config.BigEndian && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && o1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0, x1, o1)) {
-				continue
-			}
-			b = mergePoint(b, x0, x1)
-			v0 := b.NewValue0(x1.Pos, OpPPC64MOVHZload, t)
-			v.copyOf(v0)
-			v0.AuxInt = int32ToAuxInt(i0)
-			v0.Aux = symToAux(s)
-			v0.AddArg2(p, mem)
-			return true
-		}
-		break
-	}
-	// match: (OR <t> x0:(MOVBZload [i0] {s} p mem) o1:(SLDconst x1:(MOVBZload [i1] {s} p mem) [8]))
-	// cond: !config.BigEndian && i1 == i0+1 && x0.Uses ==1 && x1.Uses == 1 && o1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0, x1, o1)
-	// result: @mergePoint(b,x0,x1) (MOVHZload <t> {s} [i0] p mem)
-	for {
-		t := v.Type
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			x0 := v_0
-			if x0.Op != OpPPC64MOVBZload {
-				continue
-			}
-			i0 := auxIntToInt32(x0.AuxInt)
-			s := auxToSym(x0.Aux)
-			mem := x0.Args[1]
-			p := x0.Args[0]
-			o1 := v_1
-			if o1.Op != OpPPC64SLDconst || auxIntToInt64(o1.AuxInt) != 8 {
-				continue
-			}
-			x1 := o1.Args[0]
-			if x1.Op != OpPPC64MOVBZload {
-				continue
-			}
-			i1 := auxIntToInt32(x1.AuxInt)
-			if auxToSym(x1.Aux) != s {
-				continue
-			}
-			_ = x1.Args[1]
-			if p != x1.Args[0] || mem != x1.Args[1] || !(!config.BigEndian && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && o1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0, x1, o1)) {
-				continue
-			}
-			b = mergePoint(b, x0, x1)
-			v0 := b.NewValue0(x1.Pos, OpPPC64MOVHZload, t)
-			v.copyOf(v0)
-			v0.AuxInt = int32ToAuxInt(i0)
-			v0.Aux = symToAux(s)
-			v0.AddArg2(p, mem)
-			return true
-		}
-		break
-	}
-	// match: (OR <t> x0:(MOVBZload [i1] {s} p mem) o1:(SLWconst x1:(MOVBZload [i0] {s} p mem) [8]))
-	// cond: !config.BigEndian && i1 == i0+1 && x0.Uses ==1 && x1.Uses == 1 && o1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0, x1, o1)
-	// result: @mergePoint(b,x0,x1) (MOVHBRload <t> (MOVDaddr <typ.Uintptr> [i0] {s} p) mem)
-	for {
-		t := v.Type
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			x0 := v_0
-			if x0.Op != OpPPC64MOVBZload {
-				continue
-			}
-			i1 := auxIntToInt32(x0.AuxInt)
-			s := auxToSym(x0.Aux)
-			mem := x0.Args[1]
-			p := x0.Args[0]
-			o1 := v_1
-			if o1.Op != OpPPC64SLWconst || auxIntToInt64(o1.AuxInt) != 8 {
-				continue
-			}
-			x1 := o1.Args[0]
-			if x1.Op != OpPPC64MOVBZload {
-				continue
-			}
-			i0 := auxIntToInt32(x1.AuxInt)
-			if auxToSym(x1.Aux) != s {
-				continue
-			}
-			_ = x1.Args[1]
-			if p != x1.Args[0] || mem != x1.Args[1] || !(!config.BigEndian && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && o1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0, x1, o1)) {
-				continue
-			}
-			b = mergePoint(b, x0, x1)
-			v0 := b.NewValue0(x1.Pos, OpPPC64MOVHBRload, t)
-			v.copyOf(v0)
-			v1 := b.NewValue0(x1.Pos, OpPPC64MOVDaddr, typ.Uintptr)
-			v1.AuxInt = int32ToAuxInt(i0)
-			v1.Aux = symToAux(s)
-			v1.AddArg(p)
-			v0.AddArg2(v1, mem)
-			return true
-		}
-		break
-	}
-	// match: (OR <t> x0:(MOVBZload [i1] {s} p mem) o1:(SLDconst x1:(MOVBZload [i0] {s} p mem) [8]))
-	// cond: !config.BigEndian && i1 == i0+1 && x0.Uses ==1 && x1.Uses == 1 && o1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0, x1, o1)
-	// result: @mergePoint(b,x0,x1) (MOVHBRload <t> (MOVDaddr <typ.Uintptr> [i0] {s} p) mem)
-	for {
-		t := v.Type
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			x0 := v_0
-			if x0.Op != OpPPC64MOVBZload {
-				continue
-			}
-			i1 := auxIntToInt32(x0.AuxInt)
-			s := auxToSym(x0.Aux)
-			mem := x0.Args[1]
-			p := x0.Args[0]
-			o1 := v_1
-			if o1.Op != OpPPC64SLDconst || auxIntToInt64(o1.AuxInt) != 8 {
-				continue
-			}
-			x1 := o1.Args[0]
-			if x1.Op != OpPPC64MOVBZload {
-				continue
-			}
-			i0 := auxIntToInt32(x1.AuxInt)
-			if auxToSym(x1.Aux) != s {
-				continue
-			}
-			_ = x1.Args[1]
-			if p != x1.Args[0] || mem != x1.Args[1] || !(!config.BigEndian && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && o1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0, x1, o1)) {
-				continue
-			}
-			b = mergePoint(b, x0, x1)
-			v0 := b.NewValue0(x1.Pos, OpPPC64MOVHBRload, t)
-			v.copyOf(v0)
-			v1 := b.NewValue0(x1.Pos, OpPPC64MOVDaddr, typ.Uintptr)
-			v1.AuxInt = int32ToAuxInt(i0)
-			v1.Aux = symToAux(s)
-			v1.AddArg(p)
-			v0.AddArg2(v1, mem)
-			return true
-		}
-		break
-	}
-	// match: (OR <t> s0:(SLWconst x0:(MOVBZload [i1] {s} p mem) [n1]) s1:(SLWconst x1:(MOVBZload [i0] {s} p mem) [n2]))
-	// cond: !config.BigEndian && i1 == i0+1 && n1%8 == 0 && n2 == n1+8 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0, x1, s0, s1)
-	// result: @mergePoint(b,x0,x1) (SLDconst <t> (MOVHBRload <t> (MOVDaddr <typ.Uintptr> [i0] {s} p) mem) [n1])
-	for {
-		t := v.Type
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			s0 := v_0
-			if s0.Op != OpPPC64SLWconst {
-				continue
-			}
-			n1 := auxIntToInt64(s0.AuxInt)
-			x0 := s0.Args[0]
-			if x0.Op != OpPPC64MOVBZload {
-				continue
-			}
-			i1 := auxIntToInt32(x0.AuxInt)
-			s := auxToSym(x0.Aux)
-			mem := x0.Args[1]
-			p := x0.Args[0]
-			s1 := v_1
-			if s1.Op != OpPPC64SLWconst {
-				continue
-			}
-			n2 := auxIntToInt64(s1.AuxInt)
-			x1 := s1.Args[0]
-			if x1.Op != OpPPC64MOVBZload {
-				continue
-			}
-			i0 := auxIntToInt32(x1.AuxInt)
-			if auxToSym(x1.Aux) != s {
-				continue
-			}
-			_ = x1.Args[1]
-			if p != x1.Args[0] || mem != x1.Args[1] || !(!config.BigEndian && i1 == i0+1 && n1%8 == 0 && n2 == n1+8 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0, x1, s0, s1)) {
-				continue
-			}
-			b = mergePoint(b, x0, x1)
-			v0 := b.NewValue0(x1.Pos, OpPPC64SLDconst, t)
-			v.copyOf(v0)
-			v0.AuxInt = int64ToAuxInt(n1)
-			v1 := b.NewValue0(x1.Pos, OpPPC64MOVHBRload, t)
-			v2 := b.NewValue0(x1.Pos, OpPPC64MOVDaddr, typ.Uintptr)
-			v2.AuxInt = int32ToAuxInt(i0)
-			v2.Aux = symToAux(s)
-			v2.AddArg(p)
-			v1.AddArg2(v2, mem)
-			v0.AddArg(v1)
-			return true
-		}
-		break
-	}
-	// match: (OR <t> s0:(SLDconst x0:(MOVBZload [i1] {s} p mem) [n1]) s1:(SLDconst x1:(MOVBZload [i0] {s} p mem) [n2]))
-	// cond: !config.BigEndian && i1 == i0+1 && n1%8 == 0 && n2 == n1+8 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0, x1, s0, s1)
-	// result: @mergePoint(b,x0,x1) (SLDconst <t> (MOVHBRload <t> (MOVDaddr <typ.Uintptr> [i0] {s} p) mem) [n1])
-	for {
-		t := v.Type
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			s0 := v_0
-			if s0.Op != OpPPC64SLDconst {
-				continue
-			}
-			n1 := auxIntToInt64(s0.AuxInt)
-			x0 := s0.Args[0]
-			if x0.Op != OpPPC64MOVBZload {
-				continue
-			}
-			i1 := auxIntToInt32(x0.AuxInt)
-			s := auxToSym(x0.Aux)
-			mem := x0.Args[1]
-			p := x0.Args[0]
-			s1 := v_1
-			if s1.Op != OpPPC64SLDconst {
-				continue
-			}
-			n2 := auxIntToInt64(s1.AuxInt)
-			x1 := s1.Args[0]
-			if x1.Op != OpPPC64MOVBZload {
-				continue
-			}
-			i0 := auxIntToInt32(x1.AuxInt)
-			if auxToSym(x1.Aux) != s {
-				continue
-			}
-			_ = x1.Args[1]
-			if p != x1.Args[0] || mem != x1.Args[1] || !(!config.BigEndian && i1 == i0+1 && n1%8 == 0 && n2 == n1+8 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0, x1, s0, s1)) {
-				continue
-			}
-			b = mergePoint(b, x0, x1)
-			v0 := b.NewValue0(x1.Pos, OpPPC64SLDconst, t)
-			v.copyOf(v0)
-			v0.AuxInt = int64ToAuxInt(n1)
-			v1 := b.NewValue0(x1.Pos, OpPPC64MOVHBRload, t)
-			v2 := b.NewValue0(x1.Pos, OpPPC64MOVDaddr, typ.Uintptr)
-			v2.AuxInt = int32ToAuxInt(i0)
-			v2.Aux = symToAux(s)
-			v2.AddArg(p)
-			v1.AddArg2(v2, mem)
-			v0.AddArg(v1)
-			return true
-		}
-		break
-	}
-	// match: (OR <t> s1:(SLWconst x2:(MOVBZload [i3] {s} p mem) [24]) o0:(OR <t> s0:(SLWconst x1:(MOVBZload [i2] {s} p mem) [16]) x0:(MOVHZload [i0] {s} p mem)))
-	// cond: !config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses ==1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0, x1, x2, s0, s1, o0)
-	// result: @mergePoint(b,x0,x1,x2) (MOVWZload <t> {s} [i0] p mem)
-	for {
-		t := v.Type
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			s1 := v_0
-			if s1.Op != OpPPC64SLWconst || auxIntToInt64(s1.AuxInt) != 24 {
-				continue
-			}
-			x2 := s1.Args[0]
-			if x2.Op != OpPPC64MOVBZload {
-				continue
-			}
-			i3 := auxIntToInt32(x2.AuxInt)
-			s := auxToSym(x2.Aux)
-			mem := x2.Args[1]
-			p := x2.Args[0]
-			o0 := v_1
-			if o0.Op != OpPPC64OR || o0.Type != t {
-				continue
-			}
-			_ = o0.Args[1]
-			o0_0 := o0.Args[0]
-			o0_1 := o0.Args[1]
-			for _i1 := 0; _i1 <= 1; _i1, o0_0, o0_1 = _i1+1, o0_1, o0_0 {
-				s0 := o0_0
-				if s0.Op != OpPPC64SLWconst || auxIntToInt64(s0.AuxInt) != 16 {
-					continue
-				}
-				x1 := s0.Args[0]
-				if x1.Op != OpPPC64MOVBZload {
-					continue
-				}
-				i2 := auxIntToInt32(x1.AuxInt)
-				if auxToSym(x1.Aux) != s {
-					continue
-				}
-				_ = x1.Args[1]
-				if p != x1.Args[0] || mem != x1.Args[1] {
-					continue
-				}
-				x0 := o0_1
-				if x0.Op != OpPPC64MOVHZload {
-					continue
-				}
-				i0 := auxIntToInt32(x0.AuxInt)
-				if auxToSym(x0.Aux) != s {
-					continue
-				}
-				_ = x0.Args[1]
-				if p != x0.Args[0] || mem != x0.Args[1] || !(!config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0, x1, x2, s0, s1, o0)) {
-					continue
-				}
-				b = mergePoint(b, x0, x1, x2)
-				v0 := b.NewValue0(x0.Pos, OpPPC64MOVWZload, t)
-				v.copyOf(v0)
-				v0.AuxInt = int32ToAuxInt(i0)
-				v0.Aux = symToAux(s)
-				v0.AddArg2(p, mem)
-				return true
-			}
-		}
-		break
-	}
-	// match: (OR <t> s1:(SLDconst x2:(MOVBZload [i3] {s} p mem) [24]) o0:(OR <t> s0:(SLDconst x1:(MOVBZload [i2] {s} p mem) [16]) x0:(MOVHZload [i0] {s} p mem)))
-	// cond: !config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses ==1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0, x1, x2, s0, s1, o0)
-	// result: @mergePoint(b,x0,x1,x2) (MOVWZload <t> {s} [i0] p mem)
-	for {
-		t := v.Type
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			s1 := v_0
-			if s1.Op != OpPPC64SLDconst || auxIntToInt64(s1.AuxInt) != 24 {
-				continue
-			}
-			x2 := s1.Args[0]
-			if x2.Op != OpPPC64MOVBZload {
-				continue
-			}
-			i3 := auxIntToInt32(x2.AuxInt)
-			s := auxToSym(x2.Aux)
-			mem := x2.Args[1]
-			p := x2.Args[0]
-			o0 := v_1
-			if o0.Op != OpPPC64OR || o0.Type != t {
-				continue
-			}
-			_ = o0.Args[1]
-			o0_0 := o0.Args[0]
-			o0_1 := o0.Args[1]
-			for _i1 := 0; _i1 <= 1; _i1, o0_0, o0_1 = _i1+1, o0_1, o0_0 {
-				s0 := o0_0
-				if s0.Op != OpPPC64SLDconst || auxIntToInt64(s0.AuxInt) != 16 {
-					continue
-				}
-				x1 := s0.Args[0]
-				if x1.Op != OpPPC64MOVBZload {
-					continue
-				}
-				i2 := auxIntToInt32(x1.AuxInt)
-				if auxToSym(x1.Aux) != s {
-					continue
-				}
-				_ = x1.Args[1]
-				if p != x1.Args[0] || mem != x1.Args[1] {
-					continue
-				}
-				x0 := o0_1
-				if x0.Op != OpPPC64MOVHZload {
-					continue
-				}
-				i0 := auxIntToInt32(x0.AuxInt)
-				if auxToSym(x0.Aux) != s {
-					continue
-				}
-				_ = x0.Args[1]
-				if p != x0.Args[0] || mem != x0.Args[1] || !(!config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0, x1, x2, s0, s1, o0)) {
-					continue
-				}
-				b = mergePoint(b, x0, x1, x2)
-				v0 := b.NewValue0(x0.Pos, OpPPC64MOVWZload, t)
-				v.copyOf(v0)
-				v0.AuxInt = int32ToAuxInt(i0)
-				v0.Aux = symToAux(s)
-				v0.AddArg2(p, mem)
-				return true
-			}
-		}
-		break
-	}
-	// match: (OR <t> s1:(SLWconst x2:(MOVBZload [i0] {s} p mem) [24]) o0:(OR <t> s0:(SLWconst x1:(MOVBZload [i1] {s} p mem) [16]) x0:(MOVHBRload <t> (MOVDaddr <typ.Uintptr> [i2] {s} p) mem)))
-	// cond: !config.BigEndian && i1 == i0+1 && i2 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0, x1, x2, s0, s1, o0)
-	// result: @mergePoint(b,x0,x1,x2) (MOVWBRload <t> (MOVDaddr <typ.Uintptr> [i0] {s} p) mem)
-	for {
-		t := v.Type
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			s1 := v_0
-			if s1.Op != OpPPC64SLWconst || auxIntToInt64(s1.AuxInt) != 24 {
-				continue
-			}
-			x2 := s1.Args[0]
-			if x2.Op != OpPPC64MOVBZload {
-				continue
-			}
-			i0 := auxIntToInt32(x2.AuxInt)
-			s := auxToSym(x2.Aux)
-			mem := x2.Args[1]
-			p := x2.Args[0]
-			o0 := v_1
-			if o0.Op != OpPPC64OR || o0.Type != t {
-				continue
-			}
-			_ = o0.Args[1]
-			o0_0 := o0.Args[0]
-			o0_1 := o0.Args[1]
-			for _i1 := 0; _i1 <= 1; _i1, o0_0, o0_1 = _i1+1, o0_1, o0_0 {
-				s0 := o0_0
-				if s0.Op != OpPPC64SLWconst || auxIntToInt64(s0.AuxInt) != 16 {
-					continue
-				}
-				x1 := s0.Args[0]
-				if x1.Op != OpPPC64MOVBZload {
-					continue
-				}
-				i1 := auxIntToInt32(x1.AuxInt)
-				if auxToSym(x1.Aux) != s {
-					continue
-				}
-				_ = x1.Args[1]
-				if p != x1.Args[0] || mem != x1.Args[1] {
-					continue
-				}
-				x0 := o0_1
-				if x0.Op != OpPPC64MOVHBRload || x0.Type != t {
-					continue
-				}
-				_ = x0.Args[1]
-				x0_0 := x0.Args[0]
-				if x0_0.Op != OpPPC64MOVDaddr || x0_0.Type != typ.Uintptr {
-					continue
-				}
-				i2 := auxIntToInt32(x0_0.AuxInt)
-				if auxToSym(x0_0.Aux) != s || p != x0_0.Args[0] || mem != x0.Args[1] || !(!config.BigEndian && i1 == i0+1 && i2 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0, x1, x2, s0, s1, o0)) {
-					continue
-				}
-				b = mergePoint(b, x0, x1, x2)
-				v0 := b.NewValue0(x0.Pos, OpPPC64MOVWBRload, t)
-				v.copyOf(v0)
-				v1 := b.NewValue0(x0.Pos, OpPPC64MOVDaddr, typ.Uintptr)
-				v1.AuxInt = int32ToAuxInt(i0)
-				v1.Aux = symToAux(s)
-				v1.AddArg(p)
-				v0.AddArg2(v1, mem)
-				return true
-			}
-		}
-		break
-	}
-	// match: (OR <t> s1:(SLDconst x2:(MOVBZload [i0] {s} p mem) [24]) o0:(OR <t> s0:(SLDconst x1:(MOVBZload [i1] {s} p mem) [16]) x0:(MOVHBRload <t> (MOVDaddr <typ.Uintptr> [i2] {s} p) mem)))
-	// cond: !config.BigEndian && i1 == i0+1 && i2 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0, x1, x2, s0, s1, o0)
-	// result: @mergePoint(b,x0,x1,x2) (MOVWBRload <t> (MOVDaddr <typ.Uintptr> [i0] {s} p) mem)
-	for {
-		t := v.Type
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			s1 := v_0
-			if s1.Op != OpPPC64SLDconst || auxIntToInt64(s1.AuxInt) != 24 {
-				continue
-			}
-			x2 := s1.Args[0]
-			if x2.Op != OpPPC64MOVBZload {
-				continue
-			}
-			i0 := auxIntToInt32(x2.AuxInt)
-			s := auxToSym(x2.Aux)
-			mem := x2.Args[1]
-			p := x2.Args[0]
-			o0 := v_1
-			if o0.Op != OpPPC64OR || o0.Type != t {
-				continue
-			}
-			_ = o0.Args[1]
-			o0_0 := o0.Args[0]
-			o0_1 := o0.Args[1]
-			for _i1 := 0; _i1 <= 1; _i1, o0_0, o0_1 = _i1+1, o0_1, o0_0 {
-				s0 := o0_0
-				if s0.Op != OpPPC64SLDconst || auxIntToInt64(s0.AuxInt) != 16 {
-					continue
-				}
-				x1 := s0.Args[0]
-				if x1.Op != OpPPC64MOVBZload {
-					continue
-				}
-				i1 := auxIntToInt32(x1.AuxInt)
-				if auxToSym(x1.Aux) != s {
-					continue
-				}
-				_ = x1.Args[1]
-				if p != x1.Args[0] || mem != x1.Args[1] {
-					continue
-				}
-				x0 := o0_1
-				if x0.Op != OpPPC64MOVHBRload || x0.Type != t {
-					continue
-				}
-				_ = x0.Args[1]
-				x0_0 := x0.Args[0]
-				if x0_0.Op != OpPPC64MOVDaddr || x0_0.Type != typ.Uintptr {
-					continue
-				}
-				i2 := auxIntToInt32(x0_0.AuxInt)
-				if auxToSym(x0_0.Aux) != s || p != x0_0.Args[0] || mem != x0.Args[1] || !(!config.BigEndian && i1 == i0+1 && i2 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0, x1, x2, s0, s1, o0)) {
-					continue
-				}
-				b = mergePoint(b, x0, x1, x2)
-				v0 := b.NewValue0(x0.Pos, OpPPC64MOVWBRload, t)
-				v.copyOf(v0)
-				v1 := b.NewValue0(x0.Pos, OpPPC64MOVDaddr, typ.Uintptr)
-				v1.AuxInt = int32ToAuxInt(i0)
-				v1.Aux = symToAux(s)
-				v1.AddArg(p)
-				v0.AddArg2(v1, mem)
-				return true
-			}
-		}
-		break
-	}
-	// match: (OR <t> x0:(MOVBZload [i3] {s} p mem) o0:(OR <t> s0:(SLWconst x1:(MOVBZload [i2] {s} p mem) [8]) s1:(SLWconst x2:(MOVHBRload <t> (MOVDaddr <typ.Uintptr> [i0] {s} p) mem) [16])))
-	// cond: !config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0, x1, x2, s0, s1, o0)
-	// result: @mergePoint(b,x0,x1,x2) (MOVWBRload <t> (MOVDaddr <typ.Uintptr> [i0] {s} p) mem)
-	for {
-		t := v.Type
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			x0 := v_0
-			if x0.Op != OpPPC64MOVBZload {
-				continue
-			}
-			i3 := auxIntToInt32(x0.AuxInt)
-			s := auxToSym(x0.Aux)
-			mem := x0.Args[1]
-			p := x0.Args[0]
-			o0 := v_1
-			if o0.Op != OpPPC64OR || o0.Type != t {
-				continue
-			}
-			_ = o0.Args[1]
-			o0_0 := o0.Args[0]
-			o0_1 := o0.Args[1]
-			for _i1 := 0; _i1 <= 1; _i1, o0_0, o0_1 = _i1+1, o0_1, o0_0 {
-				s0 := o0_0
-				if s0.Op != OpPPC64SLWconst || auxIntToInt64(s0.AuxInt) != 8 {
-					continue
-				}
-				x1 := s0.Args[0]
-				if x1.Op != OpPPC64MOVBZload {
-					continue
-				}
-				i2 := auxIntToInt32(x1.AuxInt)
-				if auxToSym(x1.Aux) != s {
-					continue
-				}
-				_ = x1.Args[1]
-				if p != x1.Args[0] || mem != x1.Args[1] {
-					continue
-				}
-				s1 := o0_1
-				if s1.Op != OpPPC64SLWconst || auxIntToInt64(s1.AuxInt) != 16 {
-					continue
-				}
-				x2 := s1.Args[0]
-				if x2.Op != OpPPC64MOVHBRload || x2.Type != t {
-					continue
-				}
-				_ = x2.Args[1]
-				x2_0 := x2.Args[0]
-				if x2_0.Op != OpPPC64MOVDaddr || x2_0.Type != typ.Uintptr {
-					continue
-				}
-				i0 := auxIntToInt32(x2_0.AuxInt)
-				if auxToSym(x2_0.Aux) != s || p != x2_0.Args[0] || mem != x2.Args[1] || !(!config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0, x1, x2, s0, s1, o0)) {
-					continue
-				}
-				b = mergePoint(b, x0, x1, x2)
-				v0 := b.NewValue0(x2.Pos, OpPPC64MOVWBRload, t)
-				v.copyOf(v0)
-				v1 := b.NewValue0(x2.Pos, OpPPC64MOVDaddr, typ.Uintptr)
-				v1.AuxInt = int32ToAuxInt(i0)
-				v1.Aux = symToAux(s)
-				v1.AddArg(p)
-				v0.AddArg2(v1, mem)
-				return true
-			}
-		}
-		break
-	}
-	// match: (OR <t> x0:(MOVBZload [i3] {s} p mem) o0:(OR <t> s0:(SLDconst x1:(MOVBZload [i2] {s} p mem) [8]) s1:(SLDconst x2:(MOVHBRload <t> (MOVDaddr <typ.Uintptr> [i0] {s} p) mem) [16])))
-	// cond: !config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0, x1, x2, s0, s1, o0)
-	// result: @mergePoint(b,x0,x1,x2) (MOVWBRload <t> (MOVDaddr <typ.Uintptr> [i0] {s} p) mem)
-	for {
-		t := v.Type
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			x0 := v_0
-			if x0.Op != OpPPC64MOVBZload {
-				continue
-			}
-			i3 := auxIntToInt32(x0.AuxInt)
-			s := auxToSym(x0.Aux)
-			mem := x0.Args[1]
-			p := x0.Args[0]
-			o0 := v_1
-			if o0.Op != OpPPC64OR || o0.Type != t {
-				continue
-			}
-			_ = o0.Args[1]
-			o0_0 := o0.Args[0]
-			o0_1 := o0.Args[1]
-			for _i1 := 0; _i1 <= 1; _i1, o0_0, o0_1 = _i1+1, o0_1, o0_0 {
-				s0 := o0_0
-				if s0.Op != OpPPC64SLDconst || auxIntToInt64(s0.AuxInt) != 8 {
-					continue
-				}
-				x1 := s0.Args[0]
-				if x1.Op != OpPPC64MOVBZload {
-					continue
-				}
-				i2 := auxIntToInt32(x1.AuxInt)
-				if auxToSym(x1.Aux) != s {
-					continue
-				}
-				_ = x1.Args[1]
-				if p != x1.Args[0] || mem != x1.Args[1] {
-					continue
-				}
-				s1 := o0_1
-				if s1.Op != OpPPC64SLDconst || auxIntToInt64(s1.AuxInt) != 16 {
-					continue
-				}
-				x2 := s1.Args[0]
-				if x2.Op != OpPPC64MOVHBRload || x2.Type != t {
-					continue
-				}
-				_ = x2.Args[1]
-				x2_0 := x2.Args[0]
-				if x2_0.Op != OpPPC64MOVDaddr || x2_0.Type != typ.Uintptr {
-					continue
-				}
-				i0 := auxIntToInt32(x2_0.AuxInt)
-				if auxToSym(x2_0.Aux) != s || p != x2_0.Args[0] || mem != x2.Args[1] || !(!config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0, x1, x2, s0, s1, o0)) {
-					continue
-				}
-				b = mergePoint(b, x0, x1, x2)
-				v0 := b.NewValue0(x2.Pos, OpPPC64MOVWBRload, t)
-				v.copyOf(v0)
-				v1 := b.NewValue0(x2.Pos, OpPPC64MOVDaddr, typ.Uintptr)
-				v1.AuxInt = int32ToAuxInt(i0)
-				v1.Aux = symToAux(s)
-				v1.AddArg(p)
-				v0.AddArg2(v1, mem)
-				return true
-			}
-		}
-		break
-	}
-	// match: (OR <t> s2:(SLDconst x2:(MOVBZload [i3] {s} p mem) [32]) o0:(OR <t> s1:(SLDconst x1:(MOVBZload [i2] {s} p mem) [40]) s0:(SLDconst x0:(MOVHBRload <t> (MOVDaddr <typ.Uintptr> [i0] {s} p) mem) [48])))
-	// cond: !config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0, x1, x2, s0, s1, s2, o0)
-	// result: @mergePoint(b,x0,x1,x2) (SLDconst <t> (MOVWBRload <t> (MOVDaddr <typ.Uintptr> [i0] {s} p) mem) [32])
-	for {
-		t := v.Type
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			s2 := v_0
-			if s2.Op != OpPPC64SLDconst || auxIntToInt64(s2.AuxInt) != 32 {
-				continue
-			}
-			x2 := s2.Args[0]
-			if x2.Op != OpPPC64MOVBZload {
-				continue
-			}
-			i3 := auxIntToInt32(x2.AuxInt)
-			s := auxToSym(x2.Aux)
-			mem := x2.Args[1]
-			p := x2.Args[0]
-			o0 := v_1
-			if o0.Op != OpPPC64OR || o0.Type != t {
-				continue
-			}
-			_ = o0.Args[1]
-			o0_0 := o0.Args[0]
-			o0_1 := o0.Args[1]
-			for _i1 := 0; _i1 <= 1; _i1, o0_0, o0_1 = _i1+1, o0_1, o0_0 {
-				s1 := o0_0
-				if s1.Op != OpPPC64SLDconst || auxIntToInt64(s1.AuxInt) != 40 {
-					continue
-				}
-				x1 := s1.Args[0]
-				if x1.Op != OpPPC64MOVBZload {
-					continue
-				}
-				i2 := auxIntToInt32(x1.AuxInt)
-				if auxToSym(x1.Aux) != s {
-					continue
-				}
-				_ = x1.Args[1]
-				if p != x1.Args[0] || mem != x1.Args[1] {
-					continue
-				}
-				s0 := o0_1
-				if s0.Op != OpPPC64SLDconst || auxIntToInt64(s0.AuxInt) != 48 {
-					continue
-				}
-				x0 := s0.Args[0]
-				if x0.Op != OpPPC64MOVHBRload || x0.Type != t {
-					continue
-				}
-				_ = x0.Args[1]
-				x0_0 := x0.Args[0]
-				if x0_0.Op != OpPPC64MOVDaddr || x0_0.Type != typ.Uintptr {
-					continue
-				}
-				i0 := auxIntToInt32(x0_0.AuxInt)
-				if auxToSym(x0_0.Aux) != s || p != x0_0.Args[0] || mem != x0.Args[1] || !(!config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0, x1, x2, s0, s1, s2, o0)) {
-					continue
-				}
-				b = mergePoint(b, x0, x1, x2)
-				v0 := b.NewValue0(x0.Pos, OpPPC64SLDconst, t)
-				v.copyOf(v0)
-				v0.AuxInt = int64ToAuxInt(32)
-				v1 := b.NewValue0(x0.Pos, OpPPC64MOVWBRload, t)
-				v2 := b.NewValue0(x0.Pos, OpPPC64MOVDaddr, typ.Uintptr)
-				v2.AuxInt = int32ToAuxInt(i0)
-				v2.Aux = symToAux(s)
-				v2.AddArg(p)
-				v1.AddArg2(v2, mem)
-				v0.AddArg(v1)
-				return true
-			}
-		}
-		break
-	}
-	// match: (OR <t> s2:(SLDconst x2:(MOVBZload [i0] {s} p mem) [56]) o0:(OR <t> s1:(SLDconst x1:(MOVBZload [i1] {s} p mem) [48]) s0:(SLDconst x0:(MOVHBRload <t> (MOVDaddr <typ.Uintptr> [i2] {s} p) mem) [32])))
-	// cond: !config.BigEndian && i1 == i0+1 && i2 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0, x1, x2, s0, s1, s2, o0)
-	// result: @mergePoint(b,x0,x1,x2) (SLDconst <t> (MOVWBRload <t> (MOVDaddr <typ.Uintptr> [i0] {s} p) mem) [32])
-	for {
-		t := v.Type
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			s2 := v_0
-			if s2.Op != OpPPC64SLDconst || auxIntToInt64(s2.AuxInt) != 56 {
-				continue
-			}
-			x2 := s2.Args[0]
-			if x2.Op != OpPPC64MOVBZload {
-				continue
-			}
-			i0 := auxIntToInt32(x2.AuxInt)
-			s := auxToSym(x2.Aux)
-			mem := x2.Args[1]
-			p := x2.Args[0]
-			o0 := v_1
-			if o0.Op != OpPPC64OR || o0.Type != t {
-				continue
-			}
-			_ = o0.Args[1]
-			o0_0 := o0.Args[0]
-			o0_1 := o0.Args[1]
-			for _i1 := 0; _i1 <= 1; _i1, o0_0, o0_1 = _i1+1, o0_1, o0_0 {
-				s1 := o0_0
-				if s1.Op != OpPPC64SLDconst || auxIntToInt64(s1.AuxInt) != 48 {
-					continue
-				}
-				x1 := s1.Args[0]
-				if x1.Op != OpPPC64MOVBZload {
-					continue
-				}
-				i1 := auxIntToInt32(x1.AuxInt)
-				if auxToSym(x1.Aux) != s {
-					continue
-				}
-				_ = x1.Args[1]
-				if p != x1.Args[0] || mem != x1.Args[1] {
-					continue
-				}
-				s0 := o0_1
-				if s0.Op != OpPPC64SLDconst || auxIntToInt64(s0.AuxInt) != 32 {
-					continue
-				}
-				x0 := s0.Args[0]
-				if x0.Op != OpPPC64MOVHBRload || x0.Type != t {
-					continue
-				}
-				_ = x0.Args[1]
-				x0_0 := x0.Args[0]
-				if x0_0.Op != OpPPC64MOVDaddr || x0_0.Type != typ.Uintptr {
-					continue
-				}
-				i2 := auxIntToInt32(x0_0.AuxInt)
-				if auxToSym(x0_0.Aux) != s || p != x0_0.Args[0] || mem != x0.Args[1] || !(!config.BigEndian && i1 == i0+1 && i2 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0, x1, x2, s0, s1, s2, o0)) {
-					continue
-				}
-				b = mergePoint(b, x0, x1, x2)
-				v0 := b.NewValue0(x0.Pos, OpPPC64SLDconst, t)
-				v.copyOf(v0)
-				v0.AuxInt = int64ToAuxInt(32)
-				v1 := b.NewValue0(x0.Pos, OpPPC64MOVWBRload, t)
-				v2 := b.NewValue0(x0.Pos, OpPPC64MOVDaddr, typ.Uintptr)
-				v2.AuxInt = int32ToAuxInt(i0)
-				v2.Aux = symToAux(s)
-				v2.AddArg(p)
-				v1.AddArg2(v2, mem)
-				v0.AddArg(v1)
-				return true
-			}
-		}
-		break
-	}
-	// match: (OR <t> s6:(SLDconst x7:(MOVBZload [i7] {s} p mem) [56]) o5:(OR <t> s5:(SLDconst x6:(MOVBZload [i6] {s} p mem) [48]) o4:(OR <t> s4:(SLDconst x5:(MOVBZload [i5] {s} p mem) [40]) o3:(OR <t> s3:(SLDconst x4:(MOVBZload [i4] {s} p mem) [32]) x0:(MOVWZload {s} [i0] p mem)))))
-	// cond: !config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses ==1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s3.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x0, x4, x5, x6, x7) != nil && clobber(x0, x4, x5, x6, x7, s3, s4, s5, s6, o3, o4, o5)
-	// result: @mergePoint(b,x0,x4,x5,x6,x7) (MOVDload <t> {s} [i0] p mem)
-	for {
-		t := v.Type
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			s6 := v_0
-			if s6.Op != OpPPC64SLDconst || auxIntToInt64(s6.AuxInt) != 56 {
-				continue
-			}
-			x7 := s6.Args[0]
-			if x7.Op != OpPPC64MOVBZload {
-				continue
-			}
-			i7 := auxIntToInt32(x7.AuxInt)
-			s := auxToSym(x7.Aux)
-			mem := x7.Args[1]
-			p := x7.Args[0]
-			o5 := v_1
-			if o5.Op != OpPPC64OR || o5.Type != t {
-				continue
-			}
-			_ = o5.Args[1]
-			o5_0 := o5.Args[0]
-			o5_1 := o5.Args[1]
-			for _i1 := 0; _i1 <= 1; _i1, o5_0, o5_1 = _i1+1, o5_1, o5_0 {
-				s5 := o5_0
-				if s5.Op != OpPPC64SLDconst || auxIntToInt64(s5.AuxInt) != 48 {
-					continue
-				}
-				x6 := s5.Args[0]
-				if x6.Op != OpPPC64MOVBZload {
-					continue
-				}
-				i6 := auxIntToInt32(x6.AuxInt)
-				if auxToSym(x6.Aux) != s {
-					continue
-				}
-				_ = x6.Args[1]
-				if p != x6.Args[0] || mem != x6.Args[1] {
-					continue
-				}
-				o4 := o5_1
-				if o4.Op != OpPPC64OR || o4.Type != t {
-					continue
-				}
-				_ = o4.Args[1]
-				o4_0 := o4.Args[0]
-				o4_1 := o4.Args[1]
-				for _i2 := 0; _i2 <= 1; _i2, o4_0, o4_1 = _i2+1, o4_1, o4_0 {
-					s4 := o4_0
-					if s4.Op != OpPPC64SLDconst || auxIntToInt64(s4.AuxInt) != 40 {
-						continue
-					}
-					x5 := s4.Args[0]
-					if x5.Op != OpPPC64MOVBZload {
-						continue
-					}
-					i5 := auxIntToInt32(x5.AuxInt)
-					if auxToSym(x5.Aux) != s {
-						continue
-					}
-					_ = x5.Args[1]
-					if p != x5.Args[0] || mem != x5.Args[1] {
-						continue
-					}
-					o3 := o4_1
-					if o3.Op != OpPPC64OR || o3.Type != t {
-						continue
-					}
-					_ = o3.Args[1]
-					o3_0 := o3.Args[0]
-					o3_1 := o3.Args[1]
-					for _i3 := 0; _i3 <= 1; _i3, o3_0, o3_1 = _i3+1, o3_1, o3_0 {
-						s3 := o3_0
-						if s3.Op != OpPPC64SLDconst || auxIntToInt64(s3.AuxInt) != 32 {
-							continue
-						}
-						x4 := s3.Args[0]
-						if x4.Op != OpPPC64MOVBZload {
-							continue
-						}
-						i4 := auxIntToInt32(x4.AuxInt)
-						if auxToSym(x4.Aux) != s {
-							continue
-						}
-						_ = x4.Args[1]
-						if p != x4.Args[0] || mem != x4.Args[1] {
-							continue
-						}
-						x0 := o3_1
-						if x0.Op != OpPPC64MOVWZload {
-							continue
-						}
-						i0 := auxIntToInt32(x0.AuxInt)
-						if auxToSym(x0.Aux) != s {
-							continue
-						}
-						_ = x0.Args[1]
-						if p != x0.Args[0] || mem != x0.Args[1] || !(!config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s3.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x0, x4, x5, x6, x7) != nil && clobber(x0, x4, x5, x6, x7, s3, s4, s5, s6, o3, o4, o5)) {
-							continue
-						}
-						b = mergePoint(b, x0, x4, x5, x6, x7)
-						v0 := b.NewValue0(x0.Pos, OpPPC64MOVDload, t)
-						v.copyOf(v0)
-						v0.AuxInt = int32ToAuxInt(i0)
-						v0.Aux = symToAux(s)
-						v0.AddArg2(p, mem)
-						return true
-					}
-				}
-			}
-		}
-		break
-	}
-	// match: (OR <t> s0:(SLDconst x0:(MOVBZload [i0] {s} p mem) [56]) o0:(OR <t> s1:(SLDconst x1:(MOVBZload [i1] {s} p mem) [48]) o1:(OR <t> s2:(SLDconst x2:(MOVBZload [i2] {s} p mem) [40]) o2:(OR <t> s3:(SLDconst x3:(MOVBZload [i3] {s} p mem) [32]) x4:(MOVWBRload <t> (MOVDaddr <typ.Uintptr> [i4] p) mem)))))
-	// cond: !config.BigEndian && i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4) != nil && clobber(x0, x1, x2, x3, x4, o0, o1, o2, s0, s1, s2, s3)
-	// result: @mergePoint(b,x0,x1,x2,x3,x4) (MOVDBRload <t> (MOVDaddr <typ.Uintptr> [i0] {s} p) mem)
-	for {
-		t := v.Type
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			s0 := v_0
-			if s0.Op != OpPPC64SLDconst || auxIntToInt64(s0.AuxInt) != 56 {
-				continue
-			}
-			x0 := s0.Args[0]
-			if x0.Op != OpPPC64MOVBZload {
-				continue
-			}
-			i0 := auxIntToInt32(x0.AuxInt)
-			s := auxToSym(x0.Aux)
-			mem := x0.Args[1]
-			p := x0.Args[0]
-			o0 := v_1
-			if o0.Op != OpPPC64OR || o0.Type != t {
-				continue
-			}
-			_ = o0.Args[1]
-			o0_0 := o0.Args[0]
-			o0_1 := o0.Args[1]
-			for _i1 := 0; _i1 <= 1; _i1, o0_0, o0_1 = _i1+1, o0_1, o0_0 {
-				s1 := o0_0
-				if s1.Op != OpPPC64SLDconst || auxIntToInt64(s1.AuxInt) != 48 {
-					continue
-				}
-				x1 := s1.Args[0]
-				if x1.Op != OpPPC64MOVBZload {
-					continue
-				}
-				i1 := auxIntToInt32(x1.AuxInt)
-				if auxToSym(x1.Aux) != s {
-					continue
-				}
-				_ = x1.Args[1]
-				if p != x1.Args[0] || mem != x1.Args[1] {
-					continue
-				}
-				o1 := o0_1
-				if o1.Op != OpPPC64OR || o1.Type != t {
-					continue
-				}
-				_ = o1.Args[1]
-				o1_0 := o1.Args[0]
-				o1_1 := o1.Args[1]
-				for _i2 := 0; _i2 <= 1; _i2, o1_0, o1_1 = _i2+1, o1_1, o1_0 {
-					s2 := o1_0
-					if s2.Op != OpPPC64SLDconst || auxIntToInt64(s2.AuxInt) != 40 {
-						continue
-					}
-					x2 := s2.Args[0]
-					if x2.Op != OpPPC64MOVBZload {
-						continue
-					}
-					i2 := auxIntToInt32(x2.AuxInt)
-					if auxToSym(x2.Aux) != s {
-						continue
-					}
-					_ = x2.Args[1]
-					if p != x2.Args[0] || mem != x2.Args[1] {
-						continue
-					}
-					o2 := o1_1
-					if o2.Op != OpPPC64OR || o2.Type != t {
-						continue
-					}
-					_ = o2.Args[1]
-					o2_0 := o2.Args[0]
-					o2_1 := o2.Args[1]
-					for _i3 := 0; _i3 <= 1; _i3, o2_0, o2_1 = _i3+1, o2_1, o2_0 {
-						s3 := o2_0
-						if s3.Op != OpPPC64SLDconst || auxIntToInt64(s3.AuxInt) != 32 {
-							continue
-						}
-						x3 := s3.Args[0]
-						if x3.Op != OpPPC64MOVBZload {
-							continue
-						}
-						i3 := auxIntToInt32(x3.AuxInt)
-						if auxToSym(x3.Aux) != s {
-							continue
-						}
-						_ = x3.Args[1]
-						if p != x3.Args[0] || mem != x3.Args[1] {
-							continue
-						}
-						x4 := o2_1
-						if x4.Op != OpPPC64MOVWBRload || x4.Type != t {
-							continue
-						}
-						_ = x4.Args[1]
-						x4_0 := x4.Args[0]
-						if x4_0.Op != OpPPC64MOVDaddr || x4_0.Type != typ.Uintptr {
-							continue
-						}
-						i4 := auxIntToInt32(x4_0.AuxInt)
-						if p != x4_0.Args[0] || mem != x4.Args[1] || !(!config.BigEndian && i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4) != nil && clobber(x0, x1, x2, x3, x4, o0, o1, o2, s0, s1, s2, s3)) {
-							continue
-						}
-						b = mergePoint(b, x0, x1, x2, x3, x4)
-						v0 := b.NewValue0(x4.Pos, OpPPC64MOVDBRload, t)
-						v.copyOf(v0)
-						v1 := b.NewValue0(x4.Pos, OpPPC64MOVDaddr, typ.Uintptr)
-						v1.AuxInt = int32ToAuxInt(i0)
-						v1.Aux = symToAux(s)
-						v1.AddArg(p)
-						v0.AddArg2(v1, mem)
-						return true
-					}
-				}
-			}
-		}
-		break
-	}
-	// match: (OR <t> x7:(MOVBZload [i7] {s} p mem) o5:(OR <t> s6:(SLDconst x6:(MOVBZload [i6] {s} p mem) [8]) o4:(OR <t> s5:(SLDconst x5:(MOVBZload [i5] {s} p mem) [16]) o3:(OR <t> s4:(SLDconst x4:(MOVBZload [i4] {s} p mem) [24]) s0:(SLWconst x3:(MOVWBRload <t> (MOVDaddr <typ.Uintptr> [i0] {s} p) mem) [32])))))
-	// cond: !config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3, x4, x5, x6, x7, o3, o4, o5, s0, s4, s5, s6)
-	// result: @mergePoint(b,x3,x4,x5,x6,x7) (MOVDBRload <t> (MOVDaddr <typ.Uintptr> [i0] {s} p) mem)
-	for {
-		t := v.Type
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			x7 := v_0
-			if x7.Op != OpPPC64MOVBZload {
-				continue
-			}
-			i7 := auxIntToInt32(x7.AuxInt)
-			s := auxToSym(x7.Aux)
-			mem := x7.Args[1]
-			p := x7.Args[0]
-			o5 := v_1
-			if o5.Op != OpPPC64OR || o5.Type != t {
-				continue
-			}
-			_ = o5.Args[1]
-			o5_0 := o5.Args[0]
-			o5_1 := o5.Args[1]
-			for _i1 := 0; _i1 <= 1; _i1, o5_0, o5_1 = _i1+1, o5_1, o5_0 {
-				s6 := o5_0
-				if s6.Op != OpPPC64SLDconst || auxIntToInt64(s6.AuxInt) != 8 {
-					continue
-				}
-				x6 := s6.Args[0]
-				if x6.Op != OpPPC64MOVBZload {
-					continue
-				}
-				i6 := auxIntToInt32(x6.AuxInt)
-				if auxToSym(x6.Aux) != s {
-					continue
-				}
-				_ = x6.Args[1]
-				if p != x6.Args[0] || mem != x6.Args[1] {
-					continue
-				}
-				o4 := o5_1
-				if o4.Op != OpPPC64OR || o4.Type != t {
-					continue
-				}
-				_ = o4.Args[1]
-				o4_0 := o4.Args[0]
-				o4_1 := o4.Args[1]
-				for _i2 := 0; _i2 <= 1; _i2, o4_0, o4_1 = _i2+1, o4_1, o4_0 {
-					s5 := o4_0
-					if s5.Op != OpPPC64SLDconst || auxIntToInt64(s5.AuxInt) != 16 {
-						continue
-					}
-					x5 := s5.Args[0]
-					if x5.Op != OpPPC64MOVBZload {
-						continue
-					}
-					i5 := auxIntToInt32(x5.AuxInt)
-					if auxToSym(x5.Aux) != s {
-						continue
-					}
-					_ = x5.Args[1]
-					if p != x5.Args[0] || mem != x5.Args[1] {
-						continue
-					}
-					o3 := o4_1
-					if o3.Op != OpPPC64OR || o3.Type != t {
-						continue
-					}
-					_ = o3.Args[1]
-					o3_0 := o3.Args[0]
-					o3_1 := o3.Args[1]
-					for _i3 := 0; _i3 <= 1; _i3, o3_0, o3_1 = _i3+1, o3_1, o3_0 {
-						s4 := o3_0
-						if s4.Op != OpPPC64SLDconst || auxIntToInt64(s4.AuxInt) != 24 {
-							continue
-						}
-						x4 := s4.Args[0]
-						if x4.Op != OpPPC64MOVBZload {
-							continue
-						}
-						i4 := auxIntToInt32(x4.AuxInt)
-						if auxToSym(x4.Aux) != s {
-							continue
-						}
-						_ = x4.Args[1]
-						if p != x4.Args[0] || mem != x4.Args[1] {
-							continue
-						}
-						s0 := o3_1
-						if s0.Op != OpPPC64SLWconst || auxIntToInt64(s0.AuxInt) != 32 {
-							continue
-						}
-						x3 := s0.Args[0]
-						if x3.Op != OpPPC64MOVWBRload || x3.Type != t {
-							continue
-						}
-						_ = x3.Args[1]
-						x3_0 := x3.Args[0]
-						if x3_0.Op != OpPPC64MOVDaddr || x3_0.Type != typ.Uintptr {
-							continue
-						}
-						i0 := auxIntToInt32(x3_0.AuxInt)
-						if auxToSym(x3_0.Aux) != s || p != x3_0.Args[0] || mem != x3.Args[1] || !(!config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3, x4, x5, x6, x7, o3, o4, o5, s0, s4, s5, s6)) {
-							continue
-						}
-						b = mergePoint(b, x3, x4, x5, x6, x7)
-						v0 := b.NewValue0(x3.Pos, OpPPC64MOVDBRload, t)
-						v.copyOf(v0)
-						v1 := b.NewValue0(x3.Pos, OpPPC64MOVDaddr, typ.Uintptr)
-						v1.AuxInt = int32ToAuxInt(i0)
-						v1.Aux = symToAux(s)
-						v1.AddArg(p)
-						v0.AddArg2(v1, mem)
-						return true
-					}
-				}
-			}
-		}
-		break
-	}
-	// match: (OR <t> x7:(MOVBZload [i7] {s} p mem) o5:(OR <t> s6:(SLDconst x6:(MOVBZload [i6] {s} p mem) [8]) o4:(OR <t> s5:(SLDconst x5:(MOVBZload [i5] {s} p mem) [16]) o3:(OR <t> s4:(SLDconst x4:(MOVBZload [i4] {s} p mem) [24]) s0:(SLDconst x3:(MOVWBRload <t> (MOVDaddr <typ.Uintptr> [i0] {s} p) mem) [32])))))
-	// cond: !config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3, x4, x5, x6, x7, o3, o4, o5, s0, s4, s5, s6)
-	// result: @mergePoint(b,x3,x4,x5,x6,x7) (MOVDBRload <t> (MOVDaddr <typ.Uintptr> [i0] {s} p) mem)
-	for {
-		t := v.Type
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			x7 := v_0
-			if x7.Op != OpPPC64MOVBZload {
-				continue
-			}
-			i7 := auxIntToInt32(x7.AuxInt)
-			s := auxToSym(x7.Aux)
-			mem := x7.Args[1]
-			p := x7.Args[0]
-			o5 := v_1
-			if o5.Op != OpPPC64OR || o5.Type != t {
-				continue
-			}
-			_ = o5.Args[1]
-			o5_0 := o5.Args[0]
-			o5_1 := o5.Args[1]
-			for _i1 := 0; _i1 <= 1; _i1, o5_0, o5_1 = _i1+1, o5_1, o5_0 {
-				s6 := o5_0
-				if s6.Op != OpPPC64SLDconst || auxIntToInt64(s6.AuxInt) != 8 {
-					continue
-				}
-				x6 := s6.Args[0]
-				if x6.Op != OpPPC64MOVBZload {
-					continue
-				}
-				i6 := auxIntToInt32(x6.AuxInt)
-				if auxToSym(x6.Aux) != s {
-					continue
-				}
-				_ = x6.Args[1]
-				if p != x6.Args[0] || mem != x6.Args[1] {
-					continue
-				}
-				o4 := o5_1
-				if o4.Op != OpPPC64OR || o4.Type != t {
-					continue
-				}
-				_ = o4.Args[1]
-				o4_0 := o4.Args[0]
-				o4_1 := o4.Args[1]
-				for _i2 := 0; _i2 <= 1; _i2, o4_0, o4_1 = _i2+1, o4_1, o4_0 {
-					s5 := o4_0
-					if s5.Op != OpPPC64SLDconst || auxIntToInt64(s5.AuxInt) != 16 {
-						continue
-					}
-					x5 := s5.Args[0]
-					if x5.Op != OpPPC64MOVBZload {
-						continue
-					}
-					i5 := auxIntToInt32(x5.AuxInt)
-					if auxToSym(x5.Aux) != s {
-						continue
-					}
-					_ = x5.Args[1]
-					if p != x5.Args[0] || mem != x5.Args[1] {
-						continue
-					}
-					o3 := o4_1
-					if o3.Op != OpPPC64OR || o3.Type != t {
-						continue
-					}
-					_ = o3.Args[1]
-					o3_0 := o3.Args[0]
-					o3_1 := o3.Args[1]
-					for _i3 := 0; _i3 <= 1; _i3, o3_0, o3_1 = _i3+1, o3_1, o3_0 {
-						s4 := o3_0
-						if s4.Op != OpPPC64SLDconst || auxIntToInt64(s4.AuxInt) != 24 {
-							continue
-						}
-						x4 := s4.Args[0]
-						if x4.Op != OpPPC64MOVBZload {
-							continue
-						}
-						i4 := auxIntToInt32(x4.AuxInt)
-						if auxToSym(x4.Aux) != s {
-							continue
-						}
-						_ = x4.Args[1]
-						if p != x4.Args[0] || mem != x4.Args[1] {
-							continue
-						}
-						s0 := o3_1
-						if s0.Op != OpPPC64SLDconst || auxIntToInt64(s0.AuxInt) != 32 {
-							continue
-						}
-						x3 := s0.Args[0]
-						if x3.Op != OpPPC64MOVWBRload || x3.Type != t {
-							continue
-						}
-						_ = x3.Args[1]
-						x3_0 := x3.Args[0]
-						if x3_0.Op != OpPPC64MOVDaddr || x3_0.Type != typ.Uintptr {
-							continue
-						}
-						i0 := auxIntToInt32(x3_0.AuxInt)
-						if auxToSym(x3_0.Aux) != s || p != x3_0.Args[0] || mem != x3.Args[1] || !(!config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3, x4, x5, x6, x7, o3, o4, o5, s0, s4, s5, s6)) {
-							continue
-						}
-						b = mergePoint(b, x3, x4, x5, x6, x7)
-						v0 := b.NewValue0(x3.Pos, OpPPC64MOVDBRload, t)
-						v.copyOf(v0)
-						v1 := b.NewValue0(x3.Pos, OpPPC64MOVDaddr, typ.Uintptr)
-						v1.AuxInt = int32ToAuxInt(i0)
-						v1.Aux = symToAux(s)
-						v1.AddArg(p)
-						v0.AddArg2(v1, mem)
-						return true
-					}
-				}
-			}
-		}
-		break
-	}
 	return false
 }
 func rewriteValuePPC64_OpPPC64ORN(v *Value) bool {
@@ -12972,6 +11282,594 @@
 	}
 	return false
 }
+func rewriteValuePPC64_OpPPC64SETBC(v *Value) bool {
+	v_0 := v.Args[0]
+	b := v.Block
+	typ := &b.Func.Config.Types
+	// match: (SETBC [0] (FlagLT))
+	// result: (MOVDconst [1])
+	for {
+		if auxIntToInt32(v.AuxInt) != 0 || v_0.Op != OpPPC64FlagLT {
+			break
+		}
+		v.reset(OpPPC64MOVDconst)
+		v.AuxInt = int64ToAuxInt(1)
+		return true
+	}
+	// match: (SETBC [0] (FlagGT))
+	// result: (MOVDconst [0])
+	for {
+		if auxIntToInt32(v.AuxInt) != 0 || v_0.Op != OpPPC64FlagGT {
+			break
+		}
+		v.reset(OpPPC64MOVDconst)
+		v.AuxInt = int64ToAuxInt(0)
+		return true
+	}
+	// match: (SETBC [0] (FlagEQ))
+	// result: (MOVDconst [0])
+	for {
+		if auxIntToInt32(v.AuxInt) != 0 || v_0.Op != OpPPC64FlagEQ {
+			break
+		}
+		v.reset(OpPPC64MOVDconst)
+		v.AuxInt = int64ToAuxInt(0)
+		return true
+	}
+	// match: (SETBC [1] (FlagGT))
+	// result: (MOVDconst [1])
+	for {
+		if auxIntToInt32(v.AuxInt) != 1 || v_0.Op != OpPPC64FlagGT {
+			break
+		}
+		v.reset(OpPPC64MOVDconst)
+		v.AuxInt = int64ToAuxInt(1)
+		return true
+	}
+	// match: (SETBC [1] (FlagLT))
+	// result: (MOVDconst [0])
+	for {
+		if auxIntToInt32(v.AuxInt) != 1 || v_0.Op != OpPPC64FlagLT {
+			break
+		}
+		v.reset(OpPPC64MOVDconst)
+		v.AuxInt = int64ToAuxInt(0)
+		return true
+	}
+	// match: (SETBC [1] (FlagEQ))
+	// result: (MOVDconst [0])
+	for {
+		if auxIntToInt32(v.AuxInt) != 1 || v_0.Op != OpPPC64FlagEQ {
+			break
+		}
+		v.reset(OpPPC64MOVDconst)
+		v.AuxInt = int64ToAuxInt(0)
+		return true
+	}
+	// match: (SETBC [2] (FlagEQ))
+	// result: (MOVDconst [1])
+	for {
+		if auxIntToInt32(v.AuxInt) != 2 || v_0.Op != OpPPC64FlagEQ {
+			break
+		}
+		v.reset(OpPPC64MOVDconst)
+		v.AuxInt = int64ToAuxInt(1)
+		return true
+	}
+	// match: (SETBC [2] (FlagLT))
+	// result: (MOVDconst [0])
+	for {
+		if auxIntToInt32(v.AuxInt) != 2 || v_0.Op != OpPPC64FlagLT {
+			break
+		}
+		v.reset(OpPPC64MOVDconst)
+		v.AuxInt = int64ToAuxInt(0)
+		return true
+	}
+	// match: (SETBC [2] (FlagGT))
+	// result: (MOVDconst [0])
+	for {
+		if auxIntToInt32(v.AuxInt) != 2 || v_0.Op != OpPPC64FlagGT {
+			break
+		}
+		v.reset(OpPPC64MOVDconst)
+		v.AuxInt = int64ToAuxInt(0)
+		return true
+	}
+	// match: (SETBC [0] (InvertFlags bool))
+	// result: (SETBC [1] bool)
+	for {
+		if auxIntToInt32(v.AuxInt) != 0 || v_0.Op != OpPPC64InvertFlags {
+			break
+		}
+		bool := v_0.Args[0]
+		v.reset(OpPPC64SETBC)
+		v.AuxInt = int32ToAuxInt(1)
+		v.AddArg(bool)
+		return true
+	}
+	// match: (SETBC [1] (InvertFlags bool))
+	// result: (SETBC [0] bool)
+	for {
+		if auxIntToInt32(v.AuxInt) != 1 || v_0.Op != OpPPC64InvertFlags {
+			break
+		}
+		bool := v_0.Args[0]
+		v.reset(OpPPC64SETBC)
+		v.AuxInt = int32ToAuxInt(0)
+		v.AddArg(bool)
+		return true
+	}
+	// match: (SETBC [2] (InvertFlags bool))
+	// result: (SETBC [2] bool)
+	for {
+		if auxIntToInt32(v.AuxInt) != 2 || v_0.Op != OpPPC64InvertFlags {
+			break
+		}
+		bool := v_0.Args[0]
+		v.reset(OpPPC64SETBC)
+		v.AuxInt = int32ToAuxInt(2)
+		v.AddArg(bool)
+		return true
+	}
+	// match: (SETBC [n] (InvertFlags bool))
+	// result: (SETBCR [n] bool)
+	for {
+		n := auxIntToInt32(v.AuxInt)
+		if v_0.Op != OpPPC64InvertFlags {
+			break
+		}
+		bool := v_0.Args[0]
+		v.reset(OpPPC64SETBCR)
+		v.AuxInt = int32ToAuxInt(n)
+		v.AddArg(bool)
+		return true
+	}
+	// match: (SETBC [2] (CMPconst [0] (Select0 (ANDCCconst [1] z))))
+	// result: (XORconst [1] (Select0 <typ.UInt64> (ANDCCconst [1] z )))
+	for {
+		if auxIntToInt32(v.AuxInt) != 2 || v_0.Op != OpPPC64CMPconst || auxIntToInt64(v_0.AuxInt) != 0 {
+			break
+		}
+		v_0_0 := v_0.Args[0]
+		if v_0_0.Op != OpSelect0 {
+			break
+		}
+		v_0_0_0 := v_0_0.Args[0]
+		if v_0_0_0.Op != OpPPC64ANDCCconst || auxIntToInt64(v_0_0_0.AuxInt) != 1 {
+			break
+		}
+		z := v_0_0_0.Args[0]
+		v.reset(OpPPC64XORconst)
+		v.AuxInt = int64ToAuxInt(1)
+		v0 := b.NewValue0(v.Pos, OpSelect0, typ.UInt64)
+		v1 := b.NewValue0(v.Pos, OpPPC64ANDCCconst, types.NewTuple(typ.Int, types.TypeFlags))
+		v1.AuxInt = int64ToAuxInt(1)
+		v1.AddArg(z)
+		v0.AddArg(v1)
+		v.AddArg(v0)
+		return true
+	}
+	// match: (SETBC [2] (CMPWconst [0] (Select0 (ANDCCconst [1] z))))
+	// result: (XORconst [1] (Select0 <typ.UInt64> (ANDCCconst [1] z )))
+	for {
+		if auxIntToInt32(v.AuxInt) != 2 || v_0.Op != OpPPC64CMPWconst || auxIntToInt32(v_0.AuxInt) != 0 {
+			break
+		}
+		v_0_0 := v_0.Args[0]
+		if v_0_0.Op != OpSelect0 {
+			break
+		}
+		v_0_0_0 := v_0_0.Args[0]
+		if v_0_0_0.Op != OpPPC64ANDCCconst || auxIntToInt64(v_0_0_0.AuxInt) != 1 {
+			break
+		}
+		z := v_0_0_0.Args[0]
+		v.reset(OpPPC64XORconst)
+		v.AuxInt = int64ToAuxInt(1)
+		v0 := b.NewValue0(v.Pos, OpSelect0, typ.UInt64)
+		v1 := b.NewValue0(v.Pos, OpPPC64ANDCCconst, types.NewTuple(typ.Int, types.TypeFlags))
+		v1.AuxInt = int64ToAuxInt(1)
+		v1.AddArg(z)
+		v0.AddArg(v1)
+		v.AddArg(v0)
+		return true
+	}
+	// match: (SETBC [2] (CMPWconst [0] (Select0 (ANDCCconst [n] z))))
+	// result: (SETBC [2] (Select1 <types.TypeFlags> (ANDCCconst [n] z )))
+	for {
+		if auxIntToInt32(v.AuxInt) != 2 || v_0.Op != OpPPC64CMPWconst || auxIntToInt32(v_0.AuxInt) != 0 {
+			break
+		}
+		v_0_0 := v_0.Args[0]
+		if v_0_0.Op != OpSelect0 {
+			break
+		}
+		v_0_0_0 := v_0_0.Args[0]
+		if v_0_0_0.Op != OpPPC64ANDCCconst {
+			break
+		}
+		n := auxIntToInt64(v_0_0_0.AuxInt)
+		z := v_0_0_0.Args[0]
+		v.reset(OpPPC64SETBC)
+		v.AuxInt = int32ToAuxInt(2)
+		v0 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags)
+		v1 := b.NewValue0(v.Pos, OpPPC64ANDCCconst, types.NewTuple(typ.Int, types.TypeFlags))
+		v1.AuxInt = int64ToAuxInt(n)
+		v1.AddArg(z)
+		v0.AddArg(v1)
+		v.AddArg(v0)
+		return true
+	}
+	// match: (SETBC [2] (CMPconst [0] a:(AND y z)))
+	// cond: a.Uses == 1
+	// result: (SETBC [2] (Select1 <types.TypeFlags> (ANDCC y z )))
+	for {
+		if auxIntToInt32(v.AuxInt) != 2 || v_0.Op != OpPPC64CMPconst || auxIntToInt64(v_0.AuxInt) != 0 {
+			break
+		}
+		a := v_0.Args[0]
+		if a.Op != OpPPC64AND {
+			break
+		}
+		z := a.Args[1]
+		y := a.Args[0]
+		if !(a.Uses == 1) {
+			break
+		}
+		v.reset(OpPPC64SETBC)
+		v.AuxInt = int32ToAuxInt(2)
+		v0 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags)
+		v1 := b.NewValue0(v.Pos, OpPPC64ANDCC, types.NewTuple(typ.Int64, types.TypeFlags))
+		v1.AddArg2(y, z)
+		v0.AddArg(v1)
+		v.AddArg(v0)
+		return true
+	}
+	// match: (SETBC [2] (CMPconst [0] o:(OR y z)))
+	// cond: o.Uses == 1
+	// result: (SETBC [2] (Select1 <types.TypeFlags> (ORCC y z )))
+	for {
+		if auxIntToInt32(v.AuxInt) != 2 || v_0.Op != OpPPC64CMPconst || auxIntToInt64(v_0.AuxInt) != 0 {
+			break
+		}
+		o := v_0.Args[0]
+		if o.Op != OpPPC64OR {
+			break
+		}
+		z := o.Args[1]
+		y := o.Args[0]
+		if !(o.Uses == 1) {
+			break
+		}
+		v.reset(OpPPC64SETBC)
+		v.AuxInt = int32ToAuxInt(2)
+		v0 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags)
+		v1 := b.NewValue0(v.Pos, OpPPC64ORCC, types.NewTuple(typ.Int, types.TypeFlags))
+		v1.AddArg2(y, z)
+		v0.AddArg(v1)
+		v.AddArg(v0)
+		return true
+	}
+	// match: (SETBC [2] (CMPconst [0] a:(XOR y z)))
+	// cond: a.Uses == 1
+	// result: (SETBC [2] (Select1 <types.TypeFlags> (XORCC y z )))
+	for {
+		if auxIntToInt32(v.AuxInt) != 2 || v_0.Op != OpPPC64CMPconst || auxIntToInt64(v_0.AuxInt) != 0 {
+			break
+		}
+		a := v_0.Args[0]
+		if a.Op != OpPPC64XOR {
+			break
+		}
+		z := a.Args[1]
+		y := a.Args[0]
+		if !(a.Uses == 1) {
+			break
+		}
+		v.reset(OpPPC64SETBC)
+		v.AuxInt = int32ToAuxInt(2)
+		v0 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags)
+		v1 := b.NewValue0(v.Pos, OpPPC64XORCC, types.NewTuple(typ.Int, types.TypeFlags))
+		v1.AddArg2(y, z)
+		v0.AddArg(v1)
+		v.AddArg(v0)
+		return true
+	}
+	return false
+}
+func rewriteValuePPC64_OpPPC64SETBCR(v *Value) bool {
+	v_0 := v.Args[0]
+	b := v.Block
+	typ := &b.Func.Config.Types
+	// match: (SETBCR [0] (FlagLT))
+	// result: (MOVDconst [0])
+	for {
+		if auxIntToInt32(v.AuxInt) != 0 || v_0.Op != OpPPC64FlagLT {
+			break
+		}
+		v.reset(OpPPC64MOVDconst)
+		v.AuxInt = int64ToAuxInt(0)
+		return true
+	}
+	// match: (SETBCR [0] (FlagGT))
+	// result: (MOVDconst [1])
+	for {
+		if auxIntToInt32(v.AuxInt) != 0 || v_0.Op != OpPPC64FlagGT {
+			break
+		}
+		v.reset(OpPPC64MOVDconst)
+		v.AuxInt = int64ToAuxInt(1)
+		return true
+	}
+	// match: (SETBCR [0] (FlagEQ))
+	// result: (MOVDconst [1])
+	for {
+		if auxIntToInt32(v.AuxInt) != 0 || v_0.Op != OpPPC64FlagEQ {
+			break
+		}
+		v.reset(OpPPC64MOVDconst)
+		v.AuxInt = int64ToAuxInt(1)
+		return true
+	}
+	// match: (SETBCR [1] (FlagGT))
+	// result: (MOVDconst [0])
+	for {
+		if auxIntToInt32(v.AuxInt) != 1 || v_0.Op != OpPPC64FlagGT {
+			break
+		}
+		v.reset(OpPPC64MOVDconst)
+		v.AuxInt = int64ToAuxInt(0)
+		return true
+	}
+	// match: (SETBCR [1] (FlagLT))
+	// result: (MOVDconst [1])
+	for {
+		if auxIntToInt32(v.AuxInt) != 1 || v_0.Op != OpPPC64FlagLT {
+			break
+		}
+		v.reset(OpPPC64MOVDconst)
+		v.AuxInt = int64ToAuxInt(1)
+		return true
+	}
+	// match: (SETBCR [1] (FlagEQ))
+	// result: (MOVDconst [1])
+	for {
+		if auxIntToInt32(v.AuxInt) != 1 || v_0.Op != OpPPC64FlagEQ {
+			break
+		}
+		v.reset(OpPPC64MOVDconst)
+		v.AuxInt = int64ToAuxInt(1)
+		return true
+	}
+	// match: (SETBCR [2] (FlagEQ))
+	// result: (MOVDconst [0])
+	for {
+		if auxIntToInt32(v.AuxInt) != 2 || v_0.Op != OpPPC64FlagEQ {
+			break
+		}
+		v.reset(OpPPC64MOVDconst)
+		v.AuxInt = int64ToAuxInt(0)
+		return true
+	}
+	// match: (SETBCR [2] (FlagLT))
+	// result: (MOVDconst [1])
+	for {
+		if auxIntToInt32(v.AuxInt) != 2 || v_0.Op != OpPPC64FlagLT {
+			break
+		}
+		v.reset(OpPPC64MOVDconst)
+		v.AuxInt = int64ToAuxInt(1)
+		return true
+	}
+	// match: (SETBCR [2] (FlagGT))
+	// result: (MOVDconst [1])
+	for {
+		if auxIntToInt32(v.AuxInt) != 2 || v_0.Op != OpPPC64FlagGT {
+			break
+		}
+		v.reset(OpPPC64MOVDconst)
+		v.AuxInt = int64ToAuxInt(1)
+		return true
+	}
+	// match: (SETBCR [0] (InvertFlags bool))
+	// result: (SETBCR [1] bool)
+	for {
+		if auxIntToInt32(v.AuxInt) != 0 || v_0.Op != OpPPC64InvertFlags {
+			break
+		}
+		bool := v_0.Args[0]
+		v.reset(OpPPC64SETBCR)
+		v.AuxInt = int32ToAuxInt(1)
+		v.AddArg(bool)
+		return true
+	}
+	// match: (SETBCR [1] (InvertFlags bool))
+	// result: (SETBCR [0] bool)
+	for {
+		if auxIntToInt32(v.AuxInt) != 1 || v_0.Op != OpPPC64InvertFlags {
+			break
+		}
+		bool := v_0.Args[0]
+		v.reset(OpPPC64SETBCR)
+		v.AuxInt = int32ToAuxInt(0)
+		v.AddArg(bool)
+		return true
+	}
+	// match: (SETBCR [2] (InvertFlags bool))
+	// result: (SETBCR [2] bool)
+	for {
+		if auxIntToInt32(v.AuxInt) != 2 || v_0.Op != OpPPC64InvertFlags {
+			break
+		}
+		bool := v_0.Args[0]
+		v.reset(OpPPC64SETBCR)
+		v.AuxInt = int32ToAuxInt(2)
+		v.AddArg(bool)
+		return true
+	}
+	// match: (SETBCR [n] (InvertFlags bool))
+	// result: (SETBC [n] bool)
+	for {
+		n := auxIntToInt32(v.AuxInt)
+		if v_0.Op != OpPPC64InvertFlags {
+			break
+		}
+		bool := v_0.Args[0]
+		v.reset(OpPPC64SETBC)
+		v.AuxInt = int32ToAuxInt(n)
+		v.AddArg(bool)
+		return true
+	}
+	// match: (SETBCR [2] (CMPconst [0] (Select0 (ANDCCconst [1] z))))
+	// result: (Select0 <typ.UInt64> (ANDCCconst [1] z ))
+	for {
+		if auxIntToInt32(v.AuxInt) != 2 || v_0.Op != OpPPC64CMPconst || auxIntToInt64(v_0.AuxInt) != 0 {
+			break
+		}
+		v_0_0 := v_0.Args[0]
+		if v_0_0.Op != OpSelect0 {
+			break
+		}
+		v_0_0_0 := v_0_0.Args[0]
+		if v_0_0_0.Op != OpPPC64ANDCCconst || auxIntToInt64(v_0_0_0.AuxInt) != 1 {
+			break
+		}
+		z := v_0_0_0.Args[0]
+		v.reset(OpSelect0)
+		v.Type = typ.UInt64
+		v0 := b.NewValue0(v.Pos, OpPPC64ANDCCconst, types.NewTuple(typ.Int, types.TypeFlags))
+		v0.AuxInt = int64ToAuxInt(1)
+		v0.AddArg(z)
+		v.AddArg(v0)
+		return true
+	}
+	// match: (SETBCR [2] (CMPWconst [0] (Select0 (ANDCCconst [1] z))))
+	// result: (Select0 <typ.UInt64> (ANDCCconst [1] z ))
+	for {
+		if auxIntToInt32(v.AuxInt) != 2 || v_0.Op != OpPPC64CMPWconst || auxIntToInt32(v_0.AuxInt) != 0 {
+			break
+		}
+		v_0_0 := v_0.Args[0]
+		if v_0_0.Op != OpSelect0 {
+			break
+		}
+		v_0_0_0 := v_0_0.Args[0]
+		if v_0_0_0.Op != OpPPC64ANDCCconst || auxIntToInt64(v_0_0_0.AuxInt) != 1 {
+			break
+		}
+		z := v_0_0_0.Args[0]
+		v.reset(OpSelect0)
+		v.Type = typ.UInt64
+		v0 := b.NewValue0(v.Pos, OpPPC64ANDCCconst, types.NewTuple(typ.Int, types.TypeFlags))
+		v0.AuxInt = int64ToAuxInt(1)
+		v0.AddArg(z)
+		v.AddArg(v0)
+		return true
+	}
+	// match: (SETBCR [2] (CMPWconst [0] (Select0 (ANDCCconst [n] z))))
+	// result: (SETBCR [2] (Select1 <types.TypeFlags> (ANDCCconst [n] z )))
+	for {
+		if auxIntToInt32(v.AuxInt) != 2 || v_0.Op != OpPPC64CMPWconst || auxIntToInt32(v_0.AuxInt) != 0 {
+			break
+		}
+		v_0_0 := v_0.Args[0]
+		if v_0_0.Op != OpSelect0 {
+			break
+		}
+		v_0_0_0 := v_0_0.Args[0]
+		if v_0_0_0.Op != OpPPC64ANDCCconst {
+			break
+		}
+		n := auxIntToInt64(v_0_0_0.AuxInt)
+		z := v_0_0_0.Args[0]
+		v.reset(OpPPC64SETBCR)
+		v.AuxInt = int32ToAuxInt(2)
+		v0 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags)
+		v1 := b.NewValue0(v.Pos, OpPPC64ANDCCconst, types.NewTuple(typ.Int, types.TypeFlags))
+		v1.AuxInt = int64ToAuxInt(n)
+		v1.AddArg(z)
+		v0.AddArg(v1)
+		v.AddArg(v0)
+		return true
+	}
+	// match: (SETBCR [2] (CMPconst [0] a:(AND y z)))
+	// cond: a.Uses == 1
+	// result: (SETBCR [2] (Select1 <types.TypeFlags> (ANDCC y z )))
+	for {
+		if auxIntToInt32(v.AuxInt) != 2 || v_0.Op != OpPPC64CMPconst || auxIntToInt64(v_0.AuxInt) != 0 {
+			break
+		}
+		a := v_0.Args[0]
+		if a.Op != OpPPC64AND {
+			break
+		}
+		z := a.Args[1]
+		y := a.Args[0]
+		if !(a.Uses == 1) {
+			break
+		}
+		v.reset(OpPPC64SETBCR)
+		v.AuxInt = int32ToAuxInt(2)
+		v0 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags)
+		v1 := b.NewValue0(v.Pos, OpPPC64ANDCC, types.NewTuple(typ.Int64, types.TypeFlags))
+		v1.AddArg2(y, z)
+		v0.AddArg(v1)
+		v.AddArg(v0)
+		return true
+	}
+	// match: (SETBCR [2] (CMPconst [0] o:(OR y z)))
+	// cond: o.Uses == 1
+	// result: (SETBCR [2] (Select1 <types.TypeFlags> (ORCC y z )))
+	for {
+		if auxIntToInt32(v.AuxInt) != 2 || v_0.Op != OpPPC64CMPconst || auxIntToInt64(v_0.AuxInt) != 0 {
+			break
+		}
+		o := v_0.Args[0]
+		if o.Op != OpPPC64OR {
+			break
+		}
+		z := o.Args[1]
+		y := o.Args[0]
+		if !(o.Uses == 1) {
+			break
+		}
+		v.reset(OpPPC64SETBCR)
+		v.AuxInt = int32ToAuxInt(2)
+		v0 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags)
+		v1 := b.NewValue0(v.Pos, OpPPC64ORCC, types.NewTuple(typ.Int, types.TypeFlags))
+		v1.AddArg2(y, z)
+		v0.AddArg(v1)
+		v.AddArg(v0)
+		return true
+	}
+	// match: (SETBCR [2] (CMPconst [0] a:(XOR y z)))
+	// cond: a.Uses == 1
+	// result: (SETBCR [2] (Select1 <types.TypeFlags> (XORCC y z )))
+	for {
+		if auxIntToInt32(v.AuxInt) != 2 || v_0.Op != OpPPC64CMPconst || auxIntToInt64(v_0.AuxInt) != 0 {
+			break
+		}
+		a := v_0.Args[0]
+		if a.Op != OpPPC64XOR {
+			break
+		}
+		z := a.Args[1]
+		y := a.Args[0]
+		if !(a.Uses == 1) {
+			break
+		}
+		v.reset(OpPPC64SETBCR)
+		v.AuxInt = int32ToAuxInt(2)
+		v0 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags)
+		v1 := b.NewValue0(v.Pos, OpPPC64XORCC, types.NewTuple(typ.Int, types.TypeFlags))
+		v1.AddArg2(y, z)
+		v0.AddArg(v1)
+		v.AddArg(v0)
+		return true
+	}
+	return false
+}
 func rewriteValuePPC64_OpPPC64SLD(v *Value) bool {
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
@@ -13590,8 +12488,6 @@
 }
 func rewriteValuePPC64_OpPPC64XORconst(v *Value) bool {
 	v_0 := v.Args[0]
-	b := v.Block
-	typ := &b.Func.Config.Types
 	// match: (XORconst [c] (XORconst [d] x))
 	// result: (XORconst [c^d] x)
 	for {
@@ -13616,58 +12512,30 @@
 		v.copyOf(x)
 		return true
 	}
-	// match: (XORconst [1] (ISELB [6] (MOVDconst [1]) cmp))
-	// result: (ISELB [2] (MOVDconst [1]) cmp)
+	// match: (XORconst [1] (SETBCR [n] cmp))
+	// result: (SETBC [n] cmp)
 	for {
-		if auxIntToInt64(v.AuxInt) != 1 || v_0.Op != OpPPC64ISELB || auxIntToInt32(v_0.AuxInt) != 6 {
+		if auxIntToInt64(v.AuxInt) != 1 || v_0.Op != OpPPC64SETBCR {
 			break
 		}
-		cmp := v_0.Args[1]
-		v_0_0 := v_0.Args[0]
-		if v_0_0.Op != OpPPC64MOVDconst || auxIntToInt64(v_0_0.AuxInt) != 1 {
-			break
-		}
-		v.reset(OpPPC64ISELB)
-		v.AuxInt = int32ToAuxInt(2)
-		v0 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v0.AuxInt = int64ToAuxInt(1)
-		v.AddArg2(v0, cmp)
+		n := auxIntToInt32(v_0.AuxInt)
+		cmp := v_0.Args[0]
+		v.reset(OpPPC64SETBC)
+		v.AuxInt = int32ToAuxInt(n)
+		v.AddArg(cmp)
 		return true
 	}
-	// match: (XORconst [1] (ISELB [5] (MOVDconst [1]) cmp))
-	// result: (ISELB [1] (MOVDconst [1]) cmp)
+	// match: (XORconst [1] (SETBC [n] cmp))
+	// result: (SETBCR [n] cmp)
 	for {
-		if auxIntToInt64(v.AuxInt) != 1 || v_0.Op != OpPPC64ISELB || auxIntToInt32(v_0.AuxInt) != 5 {
+		if auxIntToInt64(v.AuxInt) != 1 || v_0.Op != OpPPC64SETBC {
 			break
 		}
-		cmp := v_0.Args[1]
-		v_0_0 := v_0.Args[0]
-		if v_0_0.Op != OpPPC64MOVDconst || auxIntToInt64(v_0_0.AuxInt) != 1 {
-			break
-		}
-		v.reset(OpPPC64ISELB)
-		v.AuxInt = int32ToAuxInt(1)
-		v0 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v0.AuxInt = int64ToAuxInt(1)
-		v.AddArg2(v0, cmp)
-		return true
-	}
-	// match: (XORconst [1] (ISELB [4] (MOVDconst [1]) cmp))
-	// result: (ISELB [0] (MOVDconst [1]) cmp)
-	for {
-		if auxIntToInt64(v.AuxInt) != 1 || v_0.Op != OpPPC64ISELB || auxIntToInt32(v_0.AuxInt) != 4 {
-			break
-		}
-		cmp := v_0.Args[1]
-		v_0_0 := v_0.Args[0]
-		if v_0_0.Op != OpPPC64MOVDconst || auxIntToInt64(v_0_0.AuxInt) != 1 {
-			break
-		}
-		v.reset(OpPPC64ISELB)
-		v.AuxInt = int32ToAuxInt(0)
-		v0 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v0.AuxInt = int64ToAuxInt(1)
-		v.AddArg2(v0, cmp)
+		n := auxIntToInt32(v_0.AuxInt)
+		cmp := v_0.Args[0]
+		v.reset(OpPPC64SETBCR)
+		v.AuxInt = int32ToAuxInt(n)
+		v.AddArg(cmp)
 		return true
 	}
 	return false
@@ -13862,39 +12730,39 @@
 	typ := &b.Func.Config.Types
 	// match: (Rsh16Ux16 x y)
 	// cond: shiftIsBounded(v)
-	// result: (SRW (MOVHZreg x) y)
+	// result: (SRD (MOVHZreg x) y)
 	for {
 		x := v_0
 		y := v_1
 		if !(shiftIsBounded(v)) {
 			break
 		}
-		v.reset(OpPPC64SRW)
+		v.reset(OpPPC64SRD)
 		v0 := b.NewValue0(v.Pos, OpPPC64MOVHZreg, typ.Int64)
 		v0.AddArg(x)
 		v.AddArg2(v0, y)
 		return true
 	}
-	// match: (Rsh16Ux16 x y)
-	// result: (SRW (ZeroExt16to32 x) (ISEL [0] y (MOVDconst [-1]) (CMPU (ZeroExt16to64 y) (MOVDconst [16]))))
+	// match: (Rsh16Ux16 <t> x y)
+	// result: (ISEL [2] (SRD <t> (MOVHZreg x) y) (MOVDconst [0]) (Select1 <types.TypeFlags> (ANDCCconst [0xFFF0] y)))
 	for {
+		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpPPC64SRW)
-		v0 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
-		v0.AddArg(x)
-		v1 := b.NewValue0(v.Pos, OpPPC64ISEL, typ.Int32)
-		v1.AuxInt = int32ToAuxInt(0)
+		v.reset(OpPPC64ISEL)
+		v.AuxInt = int32ToAuxInt(2)
+		v0 := b.NewValue0(v.Pos, OpPPC64SRD, t)
+		v1 := b.NewValue0(v.Pos, OpPPC64MOVHZreg, typ.Int64)
+		v1.AddArg(x)
+		v0.AddArg2(v1, y)
 		v2 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v2.AuxInt = int64ToAuxInt(-1)
-		v3 := b.NewValue0(v.Pos, OpPPC64CMPU, types.TypeFlags)
-		v4 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64)
+		v2.AuxInt = int64ToAuxInt(0)
+		v3 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags)
+		v4 := b.NewValue0(v.Pos, OpPPC64ANDCCconst, types.NewTuple(typ.Int, types.TypeFlags))
+		v4.AuxInt = int64ToAuxInt(0xFFF0)
 		v4.AddArg(y)
-		v5 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v5.AuxInt = int64ToAuxInt(16)
-		v3.AddArg2(v4, v5)
-		v1.AddArg3(y, v2, v3)
-		v.AddArg2(v0, v1)
+		v3.AddArg(v4)
+		v.AddArg3(v0, v2, v3)
 		return true
 	}
 }
@@ -13905,37 +12773,37 @@
 	typ := &b.Func.Config.Types
 	// match: (Rsh16Ux32 x y)
 	// cond: shiftIsBounded(v)
-	// result: (SRW (MOVHZreg x) y)
+	// result: (SRD (MOVHZreg x) y)
 	for {
 		x := v_0
 		y := v_1
 		if !(shiftIsBounded(v)) {
 			break
 		}
-		v.reset(OpPPC64SRW)
+		v.reset(OpPPC64SRD)
 		v0 := b.NewValue0(v.Pos, OpPPC64MOVHZreg, typ.Int64)
 		v0.AddArg(x)
 		v.AddArg2(v0, y)
 		return true
 	}
-	// match: (Rsh16Ux32 x y)
-	// result: (SRW (ZeroExt16to32 x) (ISEL [0] y (MOVDconst [-1]) (CMPU y (MOVDconst [16]))))
+	// match: (Rsh16Ux32 <t> x y)
+	// result: (ISEL [0] (SRD <t> (MOVHZreg x) y) (MOVDconst [0]) (CMPWUconst y [16]))
 	for {
+		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpPPC64SRW)
-		v0 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
-		v0.AddArg(x)
-		v1 := b.NewValue0(v.Pos, OpPPC64ISEL, typ.Int32)
-		v1.AuxInt = int32ToAuxInt(0)
+		v.reset(OpPPC64ISEL)
+		v.AuxInt = int32ToAuxInt(0)
+		v0 := b.NewValue0(v.Pos, OpPPC64SRD, t)
+		v1 := b.NewValue0(v.Pos, OpPPC64MOVHZreg, typ.Int64)
+		v1.AddArg(x)
+		v0.AddArg2(v1, y)
 		v2 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v2.AuxInt = int64ToAuxInt(-1)
-		v3 := b.NewValue0(v.Pos, OpPPC64CMPU, types.TypeFlags)
-		v4 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v4.AuxInt = int64ToAuxInt(16)
-		v3.AddArg2(y, v4)
-		v1.AddArg3(y, v2, v3)
-		v.AddArg2(v0, v1)
+		v2.AuxInt = int64ToAuxInt(0)
+		v3 := b.NewValue0(v.Pos, OpPPC64CMPWUconst, types.TypeFlags)
+		v3.AuxInt = int32ToAuxInt(16)
+		v3.AddArg(y)
+		v.AddArg3(v0, v2, v3)
 		return true
 	}
 }
@@ -13965,37 +12833,37 @@
 	}
 	// match: (Rsh16Ux64 x y)
 	// cond: shiftIsBounded(v)
-	// result: (SRW (MOVHZreg x) y)
+	// result: (SRD (MOVHZreg x) y)
 	for {
 		x := v_0
 		y := v_1
 		if !(shiftIsBounded(v)) {
 			break
 		}
-		v.reset(OpPPC64SRW)
+		v.reset(OpPPC64SRD)
 		v0 := b.NewValue0(v.Pos, OpPPC64MOVHZreg, typ.Int64)
 		v0.AddArg(x)
 		v.AddArg2(v0, y)
 		return true
 	}
-	// match: (Rsh16Ux64 x y)
-	// result: (SRW (ZeroExt16to32 x) (ISEL [0] y (MOVDconst [-1]) (CMPU y (MOVDconst [16]))))
+	// match: (Rsh16Ux64 <t> x y)
+	// result: (ISEL [0] (SRD <t> (MOVHZreg x) y) (MOVDconst [0]) (CMPUconst y [16]))
 	for {
+		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpPPC64SRW)
-		v0 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
-		v0.AddArg(x)
-		v1 := b.NewValue0(v.Pos, OpPPC64ISEL, typ.Int32)
-		v1.AuxInt = int32ToAuxInt(0)
+		v.reset(OpPPC64ISEL)
+		v.AuxInt = int32ToAuxInt(0)
+		v0 := b.NewValue0(v.Pos, OpPPC64SRD, t)
+		v1 := b.NewValue0(v.Pos, OpPPC64MOVHZreg, typ.Int64)
+		v1.AddArg(x)
+		v0.AddArg2(v1, y)
 		v2 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v2.AuxInt = int64ToAuxInt(-1)
-		v3 := b.NewValue0(v.Pos, OpPPC64CMPU, types.TypeFlags)
-		v4 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v4.AuxInt = int64ToAuxInt(16)
-		v3.AddArg2(y, v4)
-		v1.AddArg3(y, v2, v3)
-		v.AddArg2(v0, v1)
+		v2.AuxInt = int64ToAuxInt(0)
+		v3 := b.NewValue0(v.Pos, OpPPC64CMPUconst, types.TypeFlags)
+		v3.AuxInt = int64ToAuxInt(16)
+		v3.AddArg(y)
+		v.AddArg3(v0, v2, v3)
 		return true
 	}
 }
@@ -14006,39 +12874,39 @@
 	typ := &b.Func.Config.Types
 	// match: (Rsh16Ux8 x y)
 	// cond: shiftIsBounded(v)
-	// result: (SRW (MOVHZreg x) y)
+	// result: (SRD (MOVHZreg x) y)
 	for {
 		x := v_0
 		y := v_1
 		if !(shiftIsBounded(v)) {
 			break
 		}
-		v.reset(OpPPC64SRW)
+		v.reset(OpPPC64SRD)
 		v0 := b.NewValue0(v.Pos, OpPPC64MOVHZreg, typ.Int64)
 		v0.AddArg(x)
 		v.AddArg2(v0, y)
 		return true
 	}
-	// match: (Rsh16Ux8 x y)
-	// result: (SRW (ZeroExt16to32 x) (ISEL [0] y (MOVDconst [-1]) (CMPU (ZeroExt8to64 y) (MOVDconst [16]))))
+	// match: (Rsh16Ux8 <t> x y)
+	// result: (ISEL [2] (SRD <t> (MOVHZreg x) y) (MOVDconst [0]) (Select1 <types.TypeFlags> (ANDCCconst [0x00F0] y)))
 	for {
+		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpPPC64SRW)
-		v0 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
-		v0.AddArg(x)
-		v1 := b.NewValue0(v.Pos, OpPPC64ISEL, typ.Int32)
-		v1.AuxInt = int32ToAuxInt(0)
+		v.reset(OpPPC64ISEL)
+		v.AuxInt = int32ToAuxInt(2)
+		v0 := b.NewValue0(v.Pos, OpPPC64SRD, t)
+		v1 := b.NewValue0(v.Pos, OpPPC64MOVHZreg, typ.Int64)
+		v1.AddArg(x)
+		v0.AddArg2(v1, y)
 		v2 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v2.AuxInt = int64ToAuxInt(-1)
-		v3 := b.NewValue0(v.Pos, OpPPC64CMPU, types.TypeFlags)
-		v4 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64)
+		v2.AuxInt = int64ToAuxInt(0)
+		v3 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags)
+		v4 := b.NewValue0(v.Pos, OpPPC64ANDCCconst, types.NewTuple(typ.Int, types.TypeFlags))
+		v4.AuxInt = int64ToAuxInt(0x00F0)
 		v4.AddArg(y)
-		v5 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v5.AuxInt = int64ToAuxInt(16)
-		v3.AddArg2(v4, v5)
-		v1.AddArg3(y, v2, v3)
-		v.AddArg2(v0, v1)
+		v3.AddArg(v4)
+		v.AddArg3(v0, v2, v3)
 		return true
 	}
 }
@@ -14049,39 +12917,40 @@
 	typ := &b.Func.Config.Types
 	// match: (Rsh16x16 x y)
 	// cond: shiftIsBounded(v)
-	// result: (SRAW (MOVHreg x) y)
+	// result: (SRAD (MOVHreg x) y)
 	for {
 		x := v_0
 		y := v_1
 		if !(shiftIsBounded(v)) {
 			break
 		}
-		v.reset(OpPPC64SRAW)
+		v.reset(OpPPC64SRAD)
 		v0 := b.NewValue0(v.Pos, OpPPC64MOVHreg, typ.Int64)
 		v0.AddArg(x)
 		v.AddArg2(v0, y)
 		return true
 	}
-	// match: (Rsh16x16 x y)
-	// result: (SRAW (SignExt16to32 x) (ISEL [0] y (MOVDconst [-1]) (CMPU (ZeroExt16to64 y) (MOVDconst [16]))))
+	// match: (Rsh16x16 <t> x y)
+	// result: (ISEL [2] (SRAD <t> (MOVHreg x) y) (SRADconst <t> (MOVHreg x) [15]) (Select1 <types.TypeFlags> (ANDCCconst [0xFFF0] y)))
 	for {
+		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpPPC64SRAW)
-		v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32)
-		v0.AddArg(x)
-		v1 := b.NewValue0(v.Pos, OpPPC64ISEL, typ.Int32)
-		v1.AuxInt = int32ToAuxInt(0)
-		v2 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v2.AuxInt = int64ToAuxInt(-1)
-		v3 := b.NewValue0(v.Pos, OpPPC64CMPU, types.TypeFlags)
-		v4 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64)
+		v.reset(OpPPC64ISEL)
+		v.AuxInt = int32ToAuxInt(2)
+		v0 := b.NewValue0(v.Pos, OpPPC64SRAD, t)
+		v1 := b.NewValue0(v.Pos, OpPPC64MOVHreg, typ.Int64)
+		v1.AddArg(x)
+		v0.AddArg2(v1, y)
+		v2 := b.NewValue0(v.Pos, OpPPC64SRADconst, t)
+		v2.AuxInt = int64ToAuxInt(15)
+		v2.AddArg(v1)
+		v3 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags)
+		v4 := b.NewValue0(v.Pos, OpPPC64ANDCCconst, types.NewTuple(typ.Int, types.TypeFlags))
+		v4.AuxInt = int64ToAuxInt(0xFFF0)
 		v4.AddArg(y)
-		v5 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v5.AuxInt = int64ToAuxInt(16)
-		v3.AddArg2(v4, v5)
-		v1.AddArg3(y, v2, v3)
-		v.AddArg2(v0, v1)
+		v3.AddArg(v4)
+		v.AddArg3(v0, v2, v3)
 		return true
 	}
 }
@@ -14092,37 +12961,38 @@
 	typ := &b.Func.Config.Types
 	// match: (Rsh16x32 x y)
 	// cond: shiftIsBounded(v)
-	// result: (SRAW (MOVHreg x) y)
+	// result: (SRAD (MOVHreg x) y)
 	for {
 		x := v_0
 		y := v_1
 		if !(shiftIsBounded(v)) {
 			break
 		}
-		v.reset(OpPPC64SRAW)
+		v.reset(OpPPC64SRAD)
 		v0 := b.NewValue0(v.Pos, OpPPC64MOVHreg, typ.Int64)
 		v0.AddArg(x)
 		v.AddArg2(v0, y)
 		return true
 	}
-	// match: (Rsh16x32 x y)
-	// result: (SRAW (SignExt16to32 x) (ISEL [0] y (MOVDconst [-1]) (CMPU y (MOVDconst [16]))))
+	// match: (Rsh16x32 <t> x y)
+	// result: (ISEL [0] (SRAD <t> (MOVHreg x) y) (SRADconst <t> (MOVHreg x) [15]) (CMPWUconst y [16]))
 	for {
+		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpPPC64SRAW)
-		v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32)
-		v0.AddArg(x)
-		v1 := b.NewValue0(v.Pos, OpPPC64ISEL, typ.Int32)
-		v1.AuxInt = int32ToAuxInt(0)
-		v2 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v2.AuxInt = int64ToAuxInt(-1)
-		v3 := b.NewValue0(v.Pos, OpPPC64CMPU, types.TypeFlags)
-		v4 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v4.AuxInt = int64ToAuxInt(16)
-		v3.AddArg2(y, v4)
-		v1.AddArg3(y, v2, v3)
-		v.AddArg2(v0, v1)
+		v.reset(OpPPC64ISEL)
+		v.AuxInt = int32ToAuxInt(0)
+		v0 := b.NewValue0(v.Pos, OpPPC64SRAD, t)
+		v1 := b.NewValue0(v.Pos, OpPPC64MOVHreg, typ.Int64)
+		v1.AddArg(x)
+		v0.AddArg2(v1, y)
+		v2 := b.NewValue0(v.Pos, OpPPC64SRADconst, t)
+		v2.AuxInt = int64ToAuxInt(15)
+		v2.AddArg(v1)
+		v3 := b.NewValue0(v.Pos, OpPPC64CMPWUconst, types.TypeFlags)
+		v3.AuxInt = int32ToAuxInt(16)
+		v3.AddArg(y)
+		v.AddArg3(v0, v2, v3)
 		return true
 	}
 }
@@ -14171,37 +13041,38 @@
 	}
 	// match: (Rsh16x64 x y)
 	// cond: shiftIsBounded(v)
-	// result: (SRAW (MOVHreg x) y)
+	// result: (SRAD (MOVHreg x) y)
 	for {
 		x := v_0
 		y := v_1
 		if !(shiftIsBounded(v)) {
 			break
 		}
-		v.reset(OpPPC64SRAW)
+		v.reset(OpPPC64SRAD)
 		v0 := b.NewValue0(v.Pos, OpPPC64MOVHreg, typ.Int64)
 		v0.AddArg(x)
 		v.AddArg2(v0, y)
 		return true
 	}
-	// match: (Rsh16x64 x y)
-	// result: (SRAW (SignExt16to32 x) (ISEL [0] y (MOVDconst [-1]) (CMPU y (MOVDconst [16]))))
+	// match: (Rsh16x64 <t> x y)
+	// result: (ISEL [0] (SRAD <t> (MOVHreg x) y) (SRADconst <t> (MOVHreg x) [15]) (CMPUconst y [16]))
 	for {
+		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpPPC64SRAW)
-		v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32)
-		v0.AddArg(x)
-		v1 := b.NewValue0(v.Pos, OpPPC64ISEL, typ.Int32)
-		v1.AuxInt = int32ToAuxInt(0)
-		v2 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v2.AuxInt = int64ToAuxInt(-1)
-		v3 := b.NewValue0(v.Pos, OpPPC64CMPU, types.TypeFlags)
-		v4 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v4.AuxInt = int64ToAuxInt(16)
-		v3.AddArg2(y, v4)
-		v1.AddArg3(y, v2, v3)
-		v.AddArg2(v0, v1)
+		v.reset(OpPPC64ISEL)
+		v.AuxInt = int32ToAuxInt(0)
+		v0 := b.NewValue0(v.Pos, OpPPC64SRAD, t)
+		v1 := b.NewValue0(v.Pos, OpPPC64MOVHreg, typ.Int64)
+		v1.AddArg(x)
+		v0.AddArg2(v1, y)
+		v2 := b.NewValue0(v.Pos, OpPPC64SRADconst, t)
+		v2.AuxInt = int64ToAuxInt(15)
+		v2.AddArg(v1)
+		v3 := b.NewValue0(v.Pos, OpPPC64CMPUconst, types.TypeFlags)
+		v3.AuxInt = int64ToAuxInt(16)
+		v3.AddArg(y)
+		v.AddArg3(v0, v2, v3)
 		return true
 	}
 }
@@ -14212,39 +13083,40 @@
 	typ := &b.Func.Config.Types
 	// match: (Rsh16x8 x y)
 	// cond: shiftIsBounded(v)
-	// result: (SRAW (MOVHreg x) y)
+	// result: (SRAD (MOVHreg x) y)
 	for {
 		x := v_0
 		y := v_1
 		if !(shiftIsBounded(v)) {
 			break
 		}
-		v.reset(OpPPC64SRAW)
+		v.reset(OpPPC64SRAD)
 		v0 := b.NewValue0(v.Pos, OpPPC64MOVHreg, typ.Int64)
 		v0.AddArg(x)
 		v.AddArg2(v0, y)
 		return true
 	}
-	// match: (Rsh16x8 x y)
-	// result: (SRAW (SignExt16to32 x) (ISEL [0] y (MOVDconst [-1]) (CMPU (ZeroExt8to64 y) (MOVDconst [16]))))
+	// match: (Rsh16x8 <t> x y)
+	// result: (ISEL [2] (SRAD <t> (MOVHreg x) y) (SRADconst <t> (MOVHreg x) [15]) (Select1 <types.TypeFlags> (ANDCCconst [0x00F0] y)))
 	for {
+		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpPPC64SRAW)
-		v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32)
-		v0.AddArg(x)
-		v1 := b.NewValue0(v.Pos, OpPPC64ISEL, typ.Int32)
-		v1.AuxInt = int32ToAuxInt(0)
-		v2 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v2.AuxInt = int64ToAuxInt(-1)
-		v3 := b.NewValue0(v.Pos, OpPPC64CMPU, types.TypeFlags)
-		v4 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64)
+		v.reset(OpPPC64ISEL)
+		v.AuxInt = int32ToAuxInt(2)
+		v0 := b.NewValue0(v.Pos, OpPPC64SRAD, t)
+		v1 := b.NewValue0(v.Pos, OpPPC64MOVHreg, typ.Int64)
+		v1.AddArg(x)
+		v0.AddArg2(v1, y)
+		v2 := b.NewValue0(v.Pos, OpPPC64SRADconst, t)
+		v2.AuxInt = int64ToAuxInt(15)
+		v2.AddArg(v1)
+		v3 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags)
+		v4 := b.NewValue0(v.Pos, OpPPC64ANDCCconst, types.NewTuple(typ.Int, types.TypeFlags))
+		v4.AuxInt = int64ToAuxInt(0x00F0)
 		v4.AddArg(y)
-		v5 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v5.AuxInt = int64ToAuxInt(16)
-		v3.AddArg2(v4, v5)
-		v1.AddArg3(y, v2, v3)
-		v.AddArg2(v0, v1)
+		v3.AddArg(v4)
+		v.AddArg3(v0, v2, v3)
 		return true
 	}
 }
@@ -14266,24 +13138,24 @@
 		v.AddArg2(x, y)
 		return true
 	}
-	// match: (Rsh32Ux16 x y)
-	// result: (SRW x (ISEL [0] y (MOVDconst [-1]) (CMPU (ZeroExt16to64 y) (MOVDconst [32]))))
+	// match: (Rsh32Ux16 <t> x y)
+	// result: (ISEL [2] (SRW <t> x y) (MOVDconst [0]) (Select1 <types.TypeFlags> (ANDCCconst [0xFFE0] y)))
 	for {
+		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpPPC64SRW)
-		v0 := b.NewValue0(v.Pos, OpPPC64ISEL, typ.Int32)
-		v0.AuxInt = int32ToAuxInt(0)
+		v.reset(OpPPC64ISEL)
+		v.AuxInt = int32ToAuxInt(2)
+		v0 := b.NewValue0(v.Pos, OpPPC64SRW, t)
+		v0.AddArg2(x, y)
 		v1 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v1.AuxInt = int64ToAuxInt(-1)
-		v2 := b.NewValue0(v.Pos, OpPPC64CMPU, types.TypeFlags)
-		v3 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64)
+		v1.AuxInt = int64ToAuxInt(0)
+		v2 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags)
+		v3 := b.NewValue0(v.Pos, OpPPC64ANDCCconst, types.NewTuple(typ.Int, types.TypeFlags))
+		v3.AuxInt = int64ToAuxInt(0xFFE0)
 		v3.AddArg(y)
-		v4 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v4.AuxInt = int64ToAuxInt(32)
-		v2.AddArg2(v3, v4)
-		v0.AddArg3(y, v1, v2)
-		v.AddArg2(x, v0)
+		v2.AddArg(v3)
+		v.AddArg3(v0, v1, v2)
 		return true
 	}
 }
@@ -14305,22 +13177,22 @@
 		v.AddArg2(x, y)
 		return true
 	}
-	// match: (Rsh32Ux32 x y)
-	// result: (SRW x (ISEL [0] y (MOVDconst [-1]) (CMPU y (MOVDconst [32]))))
+	// match: (Rsh32Ux32 <t> x y)
+	// result: (ISEL [0] (SRW <t> x y) (MOVDconst [0]) (CMPWUconst y [32]))
 	for {
+		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpPPC64SRW)
-		v0 := b.NewValue0(v.Pos, OpPPC64ISEL, typ.Int32)
-		v0.AuxInt = int32ToAuxInt(0)
+		v.reset(OpPPC64ISEL)
+		v.AuxInt = int32ToAuxInt(0)
+		v0 := b.NewValue0(v.Pos, OpPPC64SRW, t)
+		v0.AddArg2(x, y)
 		v1 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v1.AuxInt = int64ToAuxInt(-1)
-		v2 := b.NewValue0(v.Pos, OpPPC64CMPU, types.TypeFlags)
-		v3 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v3.AuxInt = int64ToAuxInt(32)
-		v2.AddArg2(y, v3)
-		v0.AddArg3(y, v1, v2)
-		v.AddArg2(x, v0)
+		v1.AuxInt = int64ToAuxInt(0)
+		v2 := b.NewValue0(v.Pos, OpPPC64CMPWUconst, types.TypeFlags)
+		v2.AuxInt = int32ToAuxInt(32)
+		v2.AddArg(y)
+		v.AddArg3(v0, v1, v2)
 		return true
 	}
 }
@@ -14359,22 +13231,22 @@
 		v.AddArg2(x, y)
 		return true
 	}
-	// match: (Rsh32Ux64 x y)
-	// result: (SRW x (ISEL [0] y (MOVDconst [-1]) (CMPU y (MOVDconst [32]))))
+	// match: (Rsh32Ux64 <t> x y)
+	// result: (ISEL [0] (SRW <t> x y) (MOVDconst [0]) (CMPUconst y [32]))
 	for {
+		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpPPC64SRW)
-		v0 := b.NewValue0(v.Pos, OpPPC64ISEL, typ.Int32)
-		v0.AuxInt = int32ToAuxInt(0)
+		v.reset(OpPPC64ISEL)
+		v.AuxInt = int32ToAuxInt(0)
+		v0 := b.NewValue0(v.Pos, OpPPC64SRW, t)
+		v0.AddArg2(x, y)
 		v1 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v1.AuxInt = int64ToAuxInt(-1)
-		v2 := b.NewValue0(v.Pos, OpPPC64CMPU, types.TypeFlags)
-		v3 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v3.AuxInt = int64ToAuxInt(32)
-		v2.AddArg2(y, v3)
-		v0.AddArg3(y, v1, v2)
-		v.AddArg2(x, v0)
+		v1.AuxInt = int64ToAuxInt(0)
+		v2 := b.NewValue0(v.Pos, OpPPC64CMPUconst, types.TypeFlags)
+		v2.AuxInt = int64ToAuxInt(32)
+		v2.AddArg(y)
+		v.AddArg3(v0, v1, v2)
 		return true
 	}
 }
@@ -14396,24 +13268,24 @@
 		v.AddArg2(x, y)
 		return true
 	}
-	// match: (Rsh32Ux8 x y)
-	// result: (SRW x (ISEL [0] y (MOVDconst [-1]) (CMPU (ZeroExt8to64 y) (MOVDconst [32]))))
+	// match: (Rsh32Ux8 <t> x y)
+	// result: (ISEL [2] (SRW <t> x y) (MOVDconst [0]) (Select1 <types.TypeFlags> (ANDCCconst [0x00E0] y)))
 	for {
+		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpPPC64SRW)
-		v0 := b.NewValue0(v.Pos, OpPPC64ISEL, typ.Int32)
-		v0.AuxInt = int32ToAuxInt(0)
+		v.reset(OpPPC64ISEL)
+		v.AuxInt = int32ToAuxInt(2)
+		v0 := b.NewValue0(v.Pos, OpPPC64SRW, t)
+		v0.AddArg2(x, y)
 		v1 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v1.AuxInt = int64ToAuxInt(-1)
-		v2 := b.NewValue0(v.Pos, OpPPC64CMPU, types.TypeFlags)
-		v3 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64)
+		v1.AuxInt = int64ToAuxInt(0)
+		v2 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags)
+		v3 := b.NewValue0(v.Pos, OpPPC64ANDCCconst, types.NewTuple(typ.Int, types.TypeFlags))
+		v3.AuxInt = int64ToAuxInt(0x00E0)
 		v3.AddArg(y)
-		v4 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v4.AuxInt = int64ToAuxInt(32)
-		v2.AddArg2(v3, v4)
-		v0.AddArg3(y, v1, v2)
-		v.AddArg2(x, v0)
+		v2.AddArg(v3)
+		v.AddArg3(v0, v1, v2)
 		return true
 	}
 }
@@ -14435,24 +13307,25 @@
 		v.AddArg2(x, y)
 		return true
 	}
-	// match: (Rsh32x16 x y)
-	// result: (SRAW x (ISEL [0] y (MOVDconst [-1]) (CMPU (ZeroExt16to64 y) (MOVDconst [32]))))
+	// match: (Rsh32x16 <t> x y)
+	// result: (ISEL [2] (SRAW <t> x y) (SRAWconst <t> x [31]) (Select1 <types.TypeFlags> (ANDCCconst [0xFFE0] y)))
 	for {
+		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpPPC64SRAW)
-		v0 := b.NewValue0(v.Pos, OpPPC64ISEL, typ.Int32)
-		v0.AuxInt = int32ToAuxInt(0)
-		v1 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v1.AuxInt = int64ToAuxInt(-1)
-		v2 := b.NewValue0(v.Pos, OpPPC64CMPU, types.TypeFlags)
-		v3 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64)
+		v.reset(OpPPC64ISEL)
+		v.AuxInt = int32ToAuxInt(2)
+		v0 := b.NewValue0(v.Pos, OpPPC64SRAW, t)
+		v0.AddArg2(x, y)
+		v1 := b.NewValue0(v.Pos, OpPPC64SRAWconst, t)
+		v1.AuxInt = int64ToAuxInt(31)
+		v1.AddArg(x)
+		v2 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags)
+		v3 := b.NewValue0(v.Pos, OpPPC64ANDCCconst, types.NewTuple(typ.Int, types.TypeFlags))
+		v3.AuxInt = int64ToAuxInt(0xFFE0)
 		v3.AddArg(y)
-		v4 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v4.AuxInt = int64ToAuxInt(32)
-		v2.AddArg2(v3, v4)
-		v0.AddArg3(y, v1, v2)
-		v.AddArg2(x, v0)
+		v2.AddArg(v3)
+		v.AddArg3(v0, v1, v2)
 		return true
 	}
 }
@@ -14460,7 +13333,6 @@
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
 	b := v.Block
-	typ := &b.Func.Config.Types
 	// match: (Rsh32x32 x y)
 	// cond: shiftIsBounded(v)
 	// result: (SRAW x y)
@@ -14474,22 +13346,23 @@
 		v.AddArg2(x, y)
 		return true
 	}
-	// match: (Rsh32x32 x y)
-	// result: (SRAW x (ISEL [0] y (MOVDconst [-1]) (CMPU y (MOVDconst [32]))))
+	// match: (Rsh32x32 <t> x y)
+	// result: (ISEL [0] (SRAW <t> x y) (SRAWconst <t> x [31]) (CMPWUconst y [32]))
 	for {
+		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpPPC64SRAW)
-		v0 := b.NewValue0(v.Pos, OpPPC64ISEL, typ.Int32)
-		v0.AuxInt = int32ToAuxInt(0)
-		v1 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v1.AuxInt = int64ToAuxInt(-1)
-		v2 := b.NewValue0(v.Pos, OpPPC64CMPU, types.TypeFlags)
-		v3 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v3.AuxInt = int64ToAuxInt(32)
-		v2.AddArg2(y, v3)
-		v0.AddArg3(y, v1, v2)
-		v.AddArg2(x, v0)
+		v.reset(OpPPC64ISEL)
+		v.AuxInt = int32ToAuxInt(0)
+		v0 := b.NewValue0(v.Pos, OpPPC64SRAW, t)
+		v0.AddArg2(x, y)
+		v1 := b.NewValue0(v.Pos, OpPPC64SRAWconst, t)
+		v1.AuxInt = int64ToAuxInt(31)
+		v1.AddArg(x)
+		v2 := b.NewValue0(v.Pos, OpPPC64CMPWUconst, types.TypeFlags)
+		v2.AuxInt = int32ToAuxInt(32)
+		v2.AddArg(y)
+		v.AddArg3(v0, v1, v2)
 		return true
 	}
 }
@@ -14497,7 +13370,6 @@
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
 	b := v.Block
-	typ := &b.Func.Config.Types
 	// match: (Rsh32x64 x (MOVDconst [c]))
 	// cond: uint64(c) >= 32
 	// result: (SRAWconst x [63])
@@ -14545,22 +13417,23 @@
 		v.AddArg2(x, y)
 		return true
 	}
-	// match: (Rsh32x64 x y)
-	// result: (SRAW x (ISEL [0] y (MOVDconst [-1]) (CMPU y (MOVDconst [32]))))
+	// match: (Rsh32x64 <t> x y)
+	// result: (ISEL [0] (SRAW <t> x y) (SRAWconst <t> x [31]) (CMPUconst y [32]))
 	for {
+		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpPPC64SRAW)
-		v0 := b.NewValue0(v.Pos, OpPPC64ISEL, typ.Int32)
-		v0.AuxInt = int32ToAuxInt(0)
-		v1 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v1.AuxInt = int64ToAuxInt(-1)
-		v2 := b.NewValue0(v.Pos, OpPPC64CMPU, types.TypeFlags)
-		v3 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v3.AuxInt = int64ToAuxInt(32)
-		v2.AddArg2(y, v3)
-		v0.AddArg3(y, v1, v2)
-		v.AddArg2(x, v0)
+		v.reset(OpPPC64ISEL)
+		v.AuxInt = int32ToAuxInt(0)
+		v0 := b.NewValue0(v.Pos, OpPPC64SRAW, t)
+		v0.AddArg2(x, y)
+		v1 := b.NewValue0(v.Pos, OpPPC64SRAWconst, t)
+		v1.AuxInt = int64ToAuxInt(31)
+		v1.AddArg(x)
+		v2 := b.NewValue0(v.Pos, OpPPC64CMPUconst, types.TypeFlags)
+		v2.AuxInt = int64ToAuxInt(32)
+		v2.AddArg(y)
+		v.AddArg3(v0, v1, v2)
 		return true
 	}
 }
@@ -14582,24 +13455,25 @@
 		v.AddArg2(x, y)
 		return true
 	}
-	// match: (Rsh32x8 x y)
-	// result: (SRAW x (ISEL [0] y (MOVDconst [-1]) (CMPU (ZeroExt8to64 y) (MOVDconst [32]))))
+	// match: (Rsh32x8 <t> x y)
+	// result: (ISEL [2] (SRAW <t> x y) (SRAWconst <t> x [31]) (Select1 <types.TypeFlags> (ANDCCconst [0x00E0] y)))
 	for {
+		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpPPC64SRAW)
-		v0 := b.NewValue0(v.Pos, OpPPC64ISEL, typ.Int32)
-		v0.AuxInt = int32ToAuxInt(0)
-		v1 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v1.AuxInt = int64ToAuxInt(-1)
-		v2 := b.NewValue0(v.Pos, OpPPC64CMPU, types.TypeFlags)
-		v3 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64)
+		v.reset(OpPPC64ISEL)
+		v.AuxInt = int32ToAuxInt(2)
+		v0 := b.NewValue0(v.Pos, OpPPC64SRAW, t)
+		v0.AddArg2(x, y)
+		v1 := b.NewValue0(v.Pos, OpPPC64SRAWconst, t)
+		v1.AuxInt = int64ToAuxInt(31)
+		v1.AddArg(x)
+		v2 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags)
+		v3 := b.NewValue0(v.Pos, OpPPC64ANDCCconst, types.NewTuple(typ.Int, types.TypeFlags))
+		v3.AuxInt = int64ToAuxInt(0x00E0)
 		v3.AddArg(y)
-		v4 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v4.AuxInt = int64ToAuxInt(32)
-		v2.AddArg2(v3, v4)
-		v0.AddArg3(y, v1, v2)
-		v.AddArg2(x, v0)
+		v2.AddArg(v3)
+		v.AddArg3(v0, v1, v2)
 		return true
 	}
 }
@@ -14621,24 +13495,24 @@
 		v.AddArg2(x, y)
 		return true
 	}
-	// match: (Rsh64Ux16 x y)
-	// result: (SRD x (ISEL [0] y (MOVDconst [-1]) (CMPU (ZeroExt16to64 y) (MOVDconst [64]))))
+	// match: (Rsh64Ux16 <t> x y)
+	// result: (ISEL [2] (SRD <t> x y) (MOVDconst [0]) (Select1 <types.TypeFlags> (ANDCCconst [0xFFC0] y)))
 	for {
+		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpPPC64SRD)
-		v0 := b.NewValue0(v.Pos, OpPPC64ISEL, typ.Int32)
-		v0.AuxInt = int32ToAuxInt(0)
+		v.reset(OpPPC64ISEL)
+		v.AuxInt = int32ToAuxInt(2)
+		v0 := b.NewValue0(v.Pos, OpPPC64SRD, t)
+		v0.AddArg2(x, y)
 		v1 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v1.AuxInt = int64ToAuxInt(-1)
-		v2 := b.NewValue0(v.Pos, OpPPC64CMPU, types.TypeFlags)
-		v3 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64)
+		v1.AuxInt = int64ToAuxInt(0)
+		v2 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags)
+		v3 := b.NewValue0(v.Pos, OpPPC64ANDCCconst, types.NewTuple(typ.Int, types.TypeFlags))
+		v3.AuxInt = int64ToAuxInt(0xFFC0)
 		v3.AddArg(y)
-		v4 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v4.AuxInt = int64ToAuxInt(64)
-		v2.AddArg2(v3, v4)
-		v0.AddArg3(y, v1, v2)
-		v.AddArg2(x, v0)
+		v2.AddArg(v3)
+		v.AddArg3(v0, v1, v2)
 		return true
 	}
 }
@@ -14660,22 +13534,22 @@
 		v.AddArg2(x, y)
 		return true
 	}
-	// match: (Rsh64Ux32 x y)
-	// result: (SRD x (ISEL [0] y (MOVDconst [-1]) (CMPU y (MOVDconst [64]))))
+	// match: (Rsh64Ux32 <t> x y)
+	// result: (ISEL [0] (SRD <t> x y) (MOVDconst [0]) (CMPWUconst y [64]))
 	for {
+		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpPPC64SRD)
-		v0 := b.NewValue0(v.Pos, OpPPC64ISEL, typ.Int32)
-		v0.AuxInt = int32ToAuxInt(0)
+		v.reset(OpPPC64ISEL)
+		v.AuxInt = int32ToAuxInt(0)
+		v0 := b.NewValue0(v.Pos, OpPPC64SRD, t)
+		v0.AddArg2(x, y)
 		v1 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v1.AuxInt = int64ToAuxInt(-1)
-		v2 := b.NewValue0(v.Pos, OpPPC64CMPU, types.TypeFlags)
-		v3 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v3.AuxInt = int64ToAuxInt(64)
-		v2.AddArg2(y, v3)
-		v0.AddArg3(y, v1, v2)
-		v.AddArg2(x, v0)
+		v1.AuxInt = int64ToAuxInt(0)
+		v2 := b.NewValue0(v.Pos, OpPPC64CMPWUconst, types.TypeFlags)
+		v2.AuxInt = int32ToAuxInt(64)
+		v2.AddArg(y)
+		v.AddArg3(v0, v1, v2)
 		return true
 	}
 }
@@ -14714,22 +13588,22 @@
 		v.AddArg2(x, y)
 		return true
 	}
-	// match: (Rsh64Ux64 x y)
-	// result: (SRD x (ISEL [0] y (MOVDconst [-1]) (CMPU y (MOVDconst [64]))))
+	// match: (Rsh64Ux64 <t> x y)
+	// result: (ISEL [0] (SRD <t> x y) (MOVDconst [0]) (CMPUconst y [64]))
 	for {
+		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpPPC64SRD)
-		v0 := b.NewValue0(v.Pos, OpPPC64ISEL, typ.Int32)
-		v0.AuxInt = int32ToAuxInt(0)
+		v.reset(OpPPC64ISEL)
+		v.AuxInt = int32ToAuxInt(0)
+		v0 := b.NewValue0(v.Pos, OpPPC64SRD, t)
+		v0.AddArg2(x, y)
 		v1 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v1.AuxInt = int64ToAuxInt(-1)
-		v2 := b.NewValue0(v.Pos, OpPPC64CMPU, types.TypeFlags)
-		v3 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v3.AuxInt = int64ToAuxInt(64)
-		v2.AddArg2(y, v3)
-		v0.AddArg3(y, v1, v2)
-		v.AddArg2(x, v0)
+		v1.AuxInt = int64ToAuxInt(0)
+		v2 := b.NewValue0(v.Pos, OpPPC64CMPUconst, types.TypeFlags)
+		v2.AuxInt = int64ToAuxInt(64)
+		v2.AddArg(y)
+		v.AddArg3(v0, v1, v2)
 		return true
 	}
 }
@@ -14751,24 +13625,24 @@
 		v.AddArg2(x, y)
 		return true
 	}
-	// match: (Rsh64Ux8 x y)
-	// result: (SRD x (ISEL [0] y (MOVDconst [-1]) (CMPU (ZeroExt8to64 y) (MOVDconst [64]))))
+	// match: (Rsh64Ux8 <t> x y)
+	// result: (ISEL [2] (SRD <t> x y) (MOVDconst [0]) (Select1 <types.TypeFlags> (ANDCCconst [0x00C0] y)))
 	for {
+		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpPPC64SRD)
-		v0 := b.NewValue0(v.Pos, OpPPC64ISEL, typ.Int32)
-		v0.AuxInt = int32ToAuxInt(0)
+		v.reset(OpPPC64ISEL)
+		v.AuxInt = int32ToAuxInt(2)
+		v0 := b.NewValue0(v.Pos, OpPPC64SRD, t)
+		v0.AddArg2(x, y)
 		v1 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v1.AuxInt = int64ToAuxInt(-1)
-		v2 := b.NewValue0(v.Pos, OpPPC64CMPU, types.TypeFlags)
-		v3 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64)
+		v1.AuxInt = int64ToAuxInt(0)
+		v2 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags)
+		v3 := b.NewValue0(v.Pos, OpPPC64ANDCCconst, types.NewTuple(typ.Int, types.TypeFlags))
+		v3.AuxInt = int64ToAuxInt(0x00C0)
 		v3.AddArg(y)
-		v4 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v4.AuxInt = int64ToAuxInt(64)
-		v2.AddArg2(v3, v4)
-		v0.AddArg3(y, v1, v2)
-		v.AddArg2(x, v0)
+		v2.AddArg(v3)
+		v.AddArg3(v0, v1, v2)
 		return true
 	}
 }
@@ -14790,24 +13664,25 @@
 		v.AddArg2(x, y)
 		return true
 	}
-	// match: (Rsh64x16 x y)
-	// result: (SRAD x (ISEL [0] y (MOVDconst [-1]) (CMPU (ZeroExt16to64 y) (MOVDconst [64]))))
+	// match: (Rsh64x16 <t> x y)
+	// result: (ISEL [2] (SRAD <t> x y) (SRADconst <t> x [63]) (Select1 <types.TypeFlags> (ANDCCconst [0xFFC0] y)))
 	for {
+		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpPPC64SRAD)
-		v0 := b.NewValue0(v.Pos, OpPPC64ISEL, typ.Int32)
-		v0.AuxInt = int32ToAuxInt(0)
-		v1 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v1.AuxInt = int64ToAuxInt(-1)
-		v2 := b.NewValue0(v.Pos, OpPPC64CMPU, types.TypeFlags)
-		v3 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64)
+		v.reset(OpPPC64ISEL)
+		v.AuxInt = int32ToAuxInt(2)
+		v0 := b.NewValue0(v.Pos, OpPPC64SRAD, t)
+		v0.AddArg2(x, y)
+		v1 := b.NewValue0(v.Pos, OpPPC64SRADconst, t)
+		v1.AuxInt = int64ToAuxInt(63)
+		v1.AddArg(x)
+		v2 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags)
+		v3 := b.NewValue0(v.Pos, OpPPC64ANDCCconst, types.NewTuple(typ.Int, types.TypeFlags))
+		v3.AuxInt = int64ToAuxInt(0xFFC0)
 		v3.AddArg(y)
-		v4 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v4.AuxInt = int64ToAuxInt(64)
-		v2.AddArg2(v3, v4)
-		v0.AddArg3(y, v1, v2)
-		v.AddArg2(x, v0)
+		v2.AddArg(v3)
+		v.AddArg3(v0, v1, v2)
 		return true
 	}
 }
@@ -14815,7 +13690,6 @@
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
 	b := v.Block
-	typ := &b.Func.Config.Types
 	// match: (Rsh64x32 x y)
 	// cond: shiftIsBounded(v)
 	// result: (SRAD x y)
@@ -14829,22 +13703,23 @@
 		v.AddArg2(x, y)
 		return true
 	}
-	// match: (Rsh64x32 x y)
-	// result: (SRAD x (ISEL [0] y (MOVDconst [-1]) (CMPU y (MOVDconst [64]))))
+	// match: (Rsh64x32 <t> x y)
+	// result: (ISEL [0] (SRAD <t> x y) (SRADconst <t> x [63]) (CMPWUconst y [64]))
 	for {
+		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpPPC64SRAD)
-		v0 := b.NewValue0(v.Pos, OpPPC64ISEL, typ.Int32)
-		v0.AuxInt = int32ToAuxInt(0)
-		v1 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v1.AuxInt = int64ToAuxInt(-1)
-		v2 := b.NewValue0(v.Pos, OpPPC64CMPU, types.TypeFlags)
-		v3 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v3.AuxInt = int64ToAuxInt(64)
-		v2.AddArg2(y, v3)
-		v0.AddArg3(y, v1, v2)
-		v.AddArg2(x, v0)
+		v.reset(OpPPC64ISEL)
+		v.AuxInt = int32ToAuxInt(0)
+		v0 := b.NewValue0(v.Pos, OpPPC64SRAD, t)
+		v0.AddArg2(x, y)
+		v1 := b.NewValue0(v.Pos, OpPPC64SRADconst, t)
+		v1.AuxInt = int64ToAuxInt(63)
+		v1.AddArg(x)
+		v2 := b.NewValue0(v.Pos, OpPPC64CMPWUconst, types.TypeFlags)
+		v2.AuxInt = int32ToAuxInt(64)
+		v2.AddArg(y)
+		v.AddArg3(v0, v1, v2)
 		return true
 	}
 }
@@ -14852,7 +13727,6 @@
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
 	b := v.Block
-	typ := &b.Func.Config.Types
 	// match: (Rsh64x64 x (MOVDconst [c]))
 	// cond: uint64(c) >= 64
 	// result: (SRADconst x [63])
@@ -14900,22 +13774,23 @@
 		v.AddArg2(x, y)
 		return true
 	}
-	// match: (Rsh64x64 x y)
-	// result: (SRAD x (ISEL [0] y (MOVDconst [-1]) (CMPU y (MOVDconst [64]))))
+	// match: (Rsh64x64 <t> x y)
+	// result: (ISEL [0] (SRAD <t> x y) (SRADconst <t> x [63]) (CMPUconst y [64]))
 	for {
+		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpPPC64SRAD)
-		v0 := b.NewValue0(v.Pos, OpPPC64ISEL, typ.Int32)
-		v0.AuxInt = int32ToAuxInt(0)
-		v1 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v1.AuxInt = int64ToAuxInt(-1)
-		v2 := b.NewValue0(v.Pos, OpPPC64CMPU, types.TypeFlags)
-		v3 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v3.AuxInt = int64ToAuxInt(64)
-		v2.AddArg2(y, v3)
-		v0.AddArg3(y, v1, v2)
-		v.AddArg2(x, v0)
+		v.reset(OpPPC64ISEL)
+		v.AuxInt = int32ToAuxInt(0)
+		v0 := b.NewValue0(v.Pos, OpPPC64SRAD, t)
+		v0.AddArg2(x, y)
+		v1 := b.NewValue0(v.Pos, OpPPC64SRADconst, t)
+		v1.AuxInt = int64ToAuxInt(63)
+		v1.AddArg(x)
+		v2 := b.NewValue0(v.Pos, OpPPC64CMPUconst, types.TypeFlags)
+		v2.AuxInt = int64ToAuxInt(64)
+		v2.AddArg(y)
+		v.AddArg3(v0, v1, v2)
 		return true
 	}
 }
@@ -14937,24 +13812,25 @@
 		v.AddArg2(x, y)
 		return true
 	}
-	// match: (Rsh64x8 x y)
-	// result: (SRAD x (ISEL [0] y (MOVDconst [-1]) (CMPU (ZeroExt8to64 y) (MOVDconst [64]))))
+	// match: (Rsh64x8 <t> x y)
+	// result: (ISEL [2] (SRAD <t> x y) (SRADconst <t> x [63]) (Select1 <types.TypeFlags> (ANDCCconst [0x00C0] y)))
 	for {
+		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpPPC64SRAD)
-		v0 := b.NewValue0(v.Pos, OpPPC64ISEL, typ.Int32)
-		v0.AuxInt = int32ToAuxInt(0)
-		v1 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v1.AuxInt = int64ToAuxInt(-1)
-		v2 := b.NewValue0(v.Pos, OpPPC64CMPU, types.TypeFlags)
-		v3 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64)
+		v.reset(OpPPC64ISEL)
+		v.AuxInt = int32ToAuxInt(2)
+		v0 := b.NewValue0(v.Pos, OpPPC64SRAD, t)
+		v0.AddArg2(x, y)
+		v1 := b.NewValue0(v.Pos, OpPPC64SRADconst, t)
+		v1.AuxInt = int64ToAuxInt(63)
+		v1.AddArg(x)
+		v2 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags)
+		v3 := b.NewValue0(v.Pos, OpPPC64ANDCCconst, types.NewTuple(typ.Int, types.TypeFlags))
+		v3.AuxInt = int64ToAuxInt(0x00C0)
 		v3.AddArg(y)
-		v4 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v4.AuxInt = int64ToAuxInt(64)
-		v2.AddArg2(v3, v4)
-		v0.AddArg3(y, v1, v2)
-		v.AddArg2(x, v0)
+		v2.AddArg(v3)
+		v.AddArg3(v0, v1, v2)
 		return true
 	}
 }
@@ -14965,39 +13841,39 @@
 	typ := &b.Func.Config.Types
 	// match: (Rsh8Ux16 x y)
 	// cond: shiftIsBounded(v)
-	// result: (SRW (MOVBZreg x) y)
+	// result: (SRD (MOVBZreg x) y)
 	for {
 		x := v_0
 		y := v_1
 		if !(shiftIsBounded(v)) {
 			break
 		}
-		v.reset(OpPPC64SRW)
+		v.reset(OpPPC64SRD)
 		v0 := b.NewValue0(v.Pos, OpPPC64MOVBZreg, typ.Int64)
 		v0.AddArg(x)
 		v.AddArg2(v0, y)
 		return true
 	}
-	// match: (Rsh8Ux16 x y)
-	// result: (SRW (ZeroExt8to32 x) (ISEL [0] y (MOVDconst [-1]) (CMPU (ZeroExt16to64 y) (MOVDconst [8]))))
+	// match: (Rsh8Ux16 <t> x y)
+	// result: (ISEL [2] (SRD <t> (MOVBZreg x) y) (MOVDconst [0]) (Select1 <types.TypeFlags> (ANDCCconst [0xFFF8] y)))
 	for {
+		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpPPC64SRW)
-		v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
-		v0.AddArg(x)
-		v1 := b.NewValue0(v.Pos, OpPPC64ISEL, typ.Int32)
-		v1.AuxInt = int32ToAuxInt(0)
+		v.reset(OpPPC64ISEL)
+		v.AuxInt = int32ToAuxInt(2)
+		v0 := b.NewValue0(v.Pos, OpPPC64SRD, t)
+		v1 := b.NewValue0(v.Pos, OpPPC64MOVBZreg, typ.Int64)
+		v1.AddArg(x)
+		v0.AddArg2(v1, y)
 		v2 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v2.AuxInt = int64ToAuxInt(-1)
-		v3 := b.NewValue0(v.Pos, OpPPC64CMPU, types.TypeFlags)
-		v4 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64)
+		v2.AuxInt = int64ToAuxInt(0)
+		v3 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags)
+		v4 := b.NewValue0(v.Pos, OpPPC64ANDCCconst, types.NewTuple(typ.Int, types.TypeFlags))
+		v4.AuxInt = int64ToAuxInt(0xFFF8)
 		v4.AddArg(y)
-		v5 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v5.AuxInt = int64ToAuxInt(8)
-		v3.AddArg2(v4, v5)
-		v1.AddArg3(y, v2, v3)
-		v.AddArg2(v0, v1)
+		v3.AddArg(v4)
+		v.AddArg3(v0, v2, v3)
 		return true
 	}
 }
@@ -15008,37 +13884,37 @@
 	typ := &b.Func.Config.Types
 	// match: (Rsh8Ux32 x y)
 	// cond: shiftIsBounded(v)
-	// result: (SRW (MOVBZreg x) y)
+	// result: (SRD (MOVBZreg x) y)
 	for {
 		x := v_0
 		y := v_1
 		if !(shiftIsBounded(v)) {
 			break
 		}
-		v.reset(OpPPC64SRW)
+		v.reset(OpPPC64SRD)
 		v0 := b.NewValue0(v.Pos, OpPPC64MOVBZreg, typ.Int64)
 		v0.AddArg(x)
 		v.AddArg2(v0, y)
 		return true
 	}
-	// match: (Rsh8Ux32 x y)
-	// result: (SRW (ZeroExt8to32 x) (ISEL [0] y (MOVDconst [-1]) (CMPU y (MOVDconst [8]))))
+	// match: (Rsh8Ux32 <t> x y)
+	// result: (ISEL [0] (SRD <t> (MOVBZreg x) y) (MOVDconst [0]) (CMPWUconst y [8]))
 	for {
+		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpPPC64SRW)
-		v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
-		v0.AddArg(x)
-		v1 := b.NewValue0(v.Pos, OpPPC64ISEL, typ.Int32)
-		v1.AuxInt = int32ToAuxInt(0)
+		v.reset(OpPPC64ISEL)
+		v.AuxInt = int32ToAuxInt(0)
+		v0 := b.NewValue0(v.Pos, OpPPC64SRD, t)
+		v1 := b.NewValue0(v.Pos, OpPPC64MOVBZreg, typ.Int64)
+		v1.AddArg(x)
+		v0.AddArg2(v1, y)
 		v2 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v2.AuxInt = int64ToAuxInt(-1)
-		v3 := b.NewValue0(v.Pos, OpPPC64CMPU, types.TypeFlags)
-		v4 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v4.AuxInt = int64ToAuxInt(8)
-		v3.AddArg2(y, v4)
-		v1.AddArg3(y, v2, v3)
-		v.AddArg2(v0, v1)
+		v2.AuxInt = int64ToAuxInt(0)
+		v3 := b.NewValue0(v.Pos, OpPPC64CMPWUconst, types.TypeFlags)
+		v3.AuxInt = int32ToAuxInt(8)
+		v3.AddArg(y)
+		v.AddArg3(v0, v2, v3)
 		return true
 	}
 }
@@ -15068,37 +13944,37 @@
 	}
 	// match: (Rsh8Ux64 x y)
 	// cond: shiftIsBounded(v)
-	// result: (SRW (MOVBZreg x) y)
+	// result: (SRD (MOVBZreg x) y)
 	for {
 		x := v_0
 		y := v_1
 		if !(shiftIsBounded(v)) {
 			break
 		}
-		v.reset(OpPPC64SRW)
+		v.reset(OpPPC64SRD)
 		v0 := b.NewValue0(v.Pos, OpPPC64MOVBZreg, typ.Int64)
 		v0.AddArg(x)
 		v.AddArg2(v0, y)
 		return true
 	}
-	// match: (Rsh8Ux64 x y)
-	// result: (SRW (ZeroExt8to32 x) (ISEL [0] y (MOVDconst [-1]) (CMPU y (MOVDconst [8]))))
+	// match: (Rsh8Ux64 <t> x y)
+	// result: (ISEL [0] (SRD <t> (MOVBZreg x) y) (MOVDconst [0]) (CMPUconst y [8]))
 	for {
+		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpPPC64SRW)
-		v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
-		v0.AddArg(x)
-		v1 := b.NewValue0(v.Pos, OpPPC64ISEL, typ.Int32)
-		v1.AuxInt = int32ToAuxInt(0)
+		v.reset(OpPPC64ISEL)
+		v.AuxInt = int32ToAuxInt(0)
+		v0 := b.NewValue0(v.Pos, OpPPC64SRD, t)
+		v1 := b.NewValue0(v.Pos, OpPPC64MOVBZreg, typ.Int64)
+		v1.AddArg(x)
+		v0.AddArg2(v1, y)
 		v2 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v2.AuxInt = int64ToAuxInt(-1)
-		v3 := b.NewValue0(v.Pos, OpPPC64CMPU, types.TypeFlags)
-		v4 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v4.AuxInt = int64ToAuxInt(8)
-		v3.AddArg2(y, v4)
-		v1.AddArg3(y, v2, v3)
-		v.AddArg2(v0, v1)
+		v2.AuxInt = int64ToAuxInt(0)
+		v3 := b.NewValue0(v.Pos, OpPPC64CMPUconst, types.TypeFlags)
+		v3.AuxInt = int64ToAuxInt(8)
+		v3.AddArg(y)
+		v.AddArg3(v0, v2, v3)
 		return true
 	}
 }
@@ -15109,39 +13985,39 @@
 	typ := &b.Func.Config.Types
 	// match: (Rsh8Ux8 x y)
 	// cond: shiftIsBounded(v)
-	// result: (SRW (MOVBZreg x) y)
+	// result: (SRD (MOVBZreg x) y)
 	for {
 		x := v_0
 		y := v_1
 		if !(shiftIsBounded(v)) {
 			break
 		}
-		v.reset(OpPPC64SRW)
+		v.reset(OpPPC64SRD)
 		v0 := b.NewValue0(v.Pos, OpPPC64MOVBZreg, typ.Int64)
 		v0.AddArg(x)
 		v.AddArg2(v0, y)
 		return true
 	}
-	// match: (Rsh8Ux8 x y)
-	// result: (SRW (ZeroExt8to32 x) (ISEL [0] y (MOVDconst [-1]) (CMPU (ZeroExt8to64 y) (MOVDconst [8]))))
+	// match: (Rsh8Ux8 <t> x y)
+	// result: (ISEL [2] (SRD <t> (MOVBZreg x) y) (MOVDconst [0]) (Select1 <types.TypeFlags> (ANDCCconst [0x00F8] y)))
 	for {
+		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpPPC64SRW)
-		v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
-		v0.AddArg(x)
-		v1 := b.NewValue0(v.Pos, OpPPC64ISEL, typ.Int32)
-		v1.AuxInt = int32ToAuxInt(0)
+		v.reset(OpPPC64ISEL)
+		v.AuxInt = int32ToAuxInt(2)
+		v0 := b.NewValue0(v.Pos, OpPPC64SRD, t)
+		v1 := b.NewValue0(v.Pos, OpPPC64MOVBZreg, typ.Int64)
+		v1.AddArg(x)
+		v0.AddArg2(v1, y)
 		v2 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v2.AuxInt = int64ToAuxInt(-1)
-		v3 := b.NewValue0(v.Pos, OpPPC64CMPU, types.TypeFlags)
-		v4 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64)
+		v2.AuxInt = int64ToAuxInt(0)
+		v3 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags)
+		v4 := b.NewValue0(v.Pos, OpPPC64ANDCCconst, types.NewTuple(typ.Int, types.TypeFlags))
+		v4.AuxInt = int64ToAuxInt(0x00F8)
 		v4.AddArg(y)
-		v5 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v5.AuxInt = int64ToAuxInt(8)
-		v3.AddArg2(v4, v5)
-		v1.AddArg3(y, v2, v3)
-		v.AddArg2(v0, v1)
+		v3.AddArg(v4)
+		v.AddArg3(v0, v2, v3)
 		return true
 	}
 }
@@ -15152,39 +14028,40 @@
 	typ := &b.Func.Config.Types
 	// match: (Rsh8x16 x y)
 	// cond: shiftIsBounded(v)
-	// result: (SRAW (MOVBreg x) y)
+	// result: (SRAD (MOVBreg x) y)
 	for {
 		x := v_0
 		y := v_1
 		if !(shiftIsBounded(v)) {
 			break
 		}
-		v.reset(OpPPC64SRAW)
+		v.reset(OpPPC64SRAD)
 		v0 := b.NewValue0(v.Pos, OpPPC64MOVBreg, typ.Int64)
 		v0.AddArg(x)
 		v.AddArg2(v0, y)
 		return true
 	}
-	// match: (Rsh8x16 x y)
-	// result: (SRAW (SignExt8to32 x) (ISEL [0] y (MOVDconst [-1]) (CMPU (ZeroExt16to64 y) (MOVDconst [8]))))
+	// match: (Rsh8x16 <t> x y)
+	// result: (ISEL [2] (SRAD <t> (MOVBreg x) y) (SRADconst <t> (MOVBreg x) [7]) (Select1 <types.TypeFlags> (ANDCCconst [0xFFF8] y)))
 	for {
+		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpPPC64SRAW)
-		v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32)
-		v0.AddArg(x)
-		v1 := b.NewValue0(v.Pos, OpPPC64ISEL, typ.Int32)
-		v1.AuxInt = int32ToAuxInt(0)
-		v2 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v2.AuxInt = int64ToAuxInt(-1)
-		v3 := b.NewValue0(v.Pos, OpPPC64CMPU, types.TypeFlags)
-		v4 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64)
+		v.reset(OpPPC64ISEL)
+		v.AuxInt = int32ToAuxInt(2)
+		v0 := b.NewValue0(v.Pos, OpPPC64SRAD, t)
+		v1 := b.NewValue0(v.Pos, OpPPC64MOVBreg, typ.Int64)
+		v1.AddArg(x)
+		v0.AddArg2(v1, y)
+		v2 := b.NewValue0(v.Pos, OpPPC64SRADconst, t)
+		v2.AuxInt = int64ToAuxInt(7)
+		v2.AddArg(v1)
+		v3 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags)
+		v4 := b.NewValue0(v.Pos, OpPPC64ANDCCconst, types.NewTuple(typ.Int, types.TypeFlags))
+		v4.AuxInt = int64ToAuxInt(0xFFF8)
 		v4.AddArg(y)
-		v5 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v5.AuxInt = int64ToAuxInt(8)
-		v3.AddArg2(v4, v5)
-		v1.AddArg3(y, v2, v3)
-		v.AddArg2(v0, v1)
+		v3.AddArg(v4)
+		v.AddArg3(v0, v2, v3)
 		return true
 	}
 }
@@ -15195,37 +14072,38 @@
 	typ := &b.Func.Config.Types
 	// match: (Rsh8x32 x y)
 	// cond: shiftIsBounded(v)
-	// result: (SRAW (MOVBreg x) y)
+	// result: (SRAD (MOVBreg x) y)
 	for {
 		x := v_0
 		y := v_1
 		if !(shiftIsBounded(v)) {
 			break
 		}
-		v.reset(OpPPC64SRAW)
+		v.reset(OpPPC64SRAD)
 		v0 := b.NewValue0(v.Pos, OpPPC64MOVBreg, typ.Int64)
 		v0.AddArg(x)
 		v.AddArg2(v0, y)
 		return true
 	}
-	// match: (Rsh8x32 x y)
-	// result: (SRAW (SignExt8to32 x) (ISEL [0] y (MOVDconst [-1]) (CMPU y (MOVDconst [8]))))
+	// match: (Rsh8x32 <t> x y)
+	// result: (ISEL [0] (SRAD <t> (MOVBreg x) y) (SRADconst <t> (MOVBreg x) [7]) (CMPWUconst y [8]))
 	for {
+		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpPPC64SRAW)
-		v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32)
-		v0.AddArg(x)
-		v1 := b.NewValue0(v.Pos, OpPPC64ISEL, typ.Int32)
-		v1.AuxInt = int32ToAuxInt(0)
-		v2 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v2.AuxInt = int64ToAuxInt(-1)
-		v3 := b.NewValue0(v.Pos, OpPPC64CMPU, types.TypeFlags)
-		v4 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v4.AuxInt = int64ToAuxInt(8)
-		v3.AddArg2(y, v4)
-		v1.AddArg3(y, v2, v3)
-		v.AddArg2(v0, v1)
+		v.reset(OpPPC64ISEL)
+		v.AuxInt = int32ToAuxInt(0)
+		v0 := b.NewValue0(v.Pos, OpPPC64SRAD, t)
+		v1 := b.NewValue0(v.Pos, OpPPC64MOVBreg, typ.Int64)
+		v1.AddArg(x)
+		v0.AddArg2(v1, y)
+		v2 := b.NewValue0(v.Pos, OpPPC64SRADconst, t)
+		v2.AuxInt = int64ToAuxInt(7)
+		v2.AddArg(v1)
+		v3 := b.NewValue0(v.Pos, OpPPC64CMPWUconst, types.TypeFlags)
+		v3.AuxInt = int32ToAuxInt(8)
+		v3.AddArg(y)
+		v.AddArg3(v0, v2, v3)
 		return true
 	}
 }
@@ -15274,37 +14152,38 @@
 	}
 	// match: (Rsh8x64 x y)
 	// cond: shiftIsBounded(v)
-	// result: (SRAW (MOVBreg x) y)
+	// result: (SRAD (MOVBreg x) y)
 	for {
 		x := v_0
 		y := v_1
 		if !(shiftIsBounded(v)) {
 			break
 		}
-		v.reset(OpPPC64SRAW)
+		v.reset(OpPPC64SRAD)
 		v0 := b.NewValue0(v.Pos, OpPPC64MOVBreg, typ.Int64)
 		v0.AddArg(x)
 		v.AddArg2(v0, y)
 		return true
 	}
-	// match: (Rsh8x64 x y)
-	// result: (SRAW (SignExt8to32 x) (ISEL [0] y (MOVDconst [-1]) (CMPU y (MOVDconst [8]))))
+	// match: (Rsh8x64 <t> x y)
+	// result: (ISEL [0] (SRAD <t> (MOVBreg x) y) (SRADconst <t> (MOVBreg x) [7]) (CMPUconst y [8]))
 	for {
+		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpPPC64SRAW)
-		v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32)
-		v0.AddArg(x)
-		v1 := b.NewValue0(v.Pos, OpPPC64ISEL, typ.Int32)
-		v1.AuxInt = int32ToAuxInt(0)
-		v2 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v2.AuxInt = int64ToAuxInt(-1)
-		v3 := b.NewValue0(v.Pos, OpPPC64CMPU, types.TypeFlags)
-		v4 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v4.AuxInt = int64ToAuxInt(8)
-		v3.AddArg2(y, v4)
-		v1.AddArg3(y, v2, v3)
-		v.AddArg2(v0, v1)
+		v.reset(OpPPC64ISEL)
+		v.AuxInt = int32ToAuxInt(0)
+		v0 := b.NewValue0(v.Pos, OpPPC64SRAD, t)
+		v1 := b.NewValue0(v.Pos, OpPPC64MOVBreg, typ.Int64)
+		v1.AddArg(x)
+		v0.AddArg2(v1, y)
+		v2 := b.NewValue0(v.Pos, OpPPC64SRADconst, t)
+		v2.AuxInt = int64ToAuxInt(7)
+		v2.AddArg(v1)
+		v3 := b.NewValue0(v.Pos, OpPPC64CMPUconst, types.TypeFlags)
+		v3.AuxInt = int64ToAuxInt(8)
+		v3.AddArg(y)
+		v.AddArg3(v0, v2, v3)
 		return true
 	}
 }
@@ -15315,39 +14194,40 @@
 	typ := &b.Func.Config.Types
 	// match: (Rsh8x8 x y)
 	// cond: shiftIsBounded(v)
-	// result: (SRAW (MOVBreg x) y)
+	// result: (SRAD (MOVBreg x) y)
 	for {
 		x := v_0
 		y := v_1
 		if !(shiftIsBounded(v)) {
 			break
 		}
-		v.reset(OpPPC64SRAW)
+		v.reset(OpPPC64SRAD)
 		v0 := b.NewValue0(v.Pos, OpPPC64MOVBreg, typ.Int64)
 		v0.AddArg(x)
 		v.AddArg2(v0, y)
 		return true
 	}
-	// match: (Rsh8x8 x y)
-	// result: (SRAW (SignExt8to32 x) (ISEL [0] y (MOVDconst [-1]) (CMPU (ZeroExt8to64 y) (MOVDconst [8]))))
+	// match: (Rsh8x8 <t> x y)
+	// result: (ISEL [2] (SRAD <t> (MOVBreg x) y) (SRADconst <t> (MOVBreg x) [7]) (Select1 <types.TypeFlags> (ANDCCconst [0x00F8] y)))
 	for {
+		t := v.Type
 		x := v_0
 		y := v_1
-		v.reset(OpPPC64SRAW)
-		v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32)
-		v0.AddArg(x)
-		v1 := b.NewValue0(v.Pos, OpPPC64ISEL, typ.Int32)
-		v1.AuxInt = int32ToAuxInt(0)
-		v2 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v2.AuxInt = int64ToAuxInt(-1)
-		v3 := b.NewValue0(v.Pos, OpPPC64CMPU, types.TypeFlags)
-		v4 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64)
+		v.reset(OpPPC64ISEL)
+		v.AuxInt = int32ToAuxInt(2)
+		v0 := b.NewValue0(v.Pos, OpPPC64SRAD, t)
+		v1 := b.NewValue0(v.Pos, OpPPC64MOVBreg, typ.Int64)
+		v1.AddArg(x)
+		v0.AddArg2(v1, y)
+		v2 := b.NewValue0(v.Pos, OpPPC64SRADconst, t)
+		v2.AuxInt = int64ToAuxInt(7)
+		v2.AddArg(v1)
+		v3 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags)
+		v4 := b.NewValue0(v.Pos, OpPPC64ANDCCconst, types.NewTuple(typ.Int, types.TypeFlags))
+		v4.AuxInt = int64ToAuxInt(0x00F8)
 		v4.AddArg(y)
-		v5 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
-		v5.AuxInt = int64ToAuxInt(8)
-		v3.AddArg2(v4, v5)
-		v1.AddArg3(y, v2, v3)
-		v.AddArg2(v0, v1)
+		v3.AddArg(v4)
+		v.AddArg3(v0, v2, v3)
 		return true
 	}
 }
@@ -15495,30 +14375,6 @@
 		v.AddArg(x)
 		return true
 	}
-	// match: (Select0 (ANDCCconst [c] (Select0 (ANDCCconst [d] x))))
-	// result: (Select0 (ANDCCconst [c&d] x))
-	for {
-		if v_0.Op != OpPPC64ANDCCconst {
-			break
-		}
-		c := auxIntToInt64(v_0.AuxInt)
-		v_0_0 := v_0.Args[0]
-		if v_0_0.Op != OpSelect0 {
-			break
-		}
-		v_0_0_0 := v_0_0.Args[0]
-		if v_0_0_0.Op != OpPPC64ANDCCconst {
-			break
-		}
-		d := auxIntToInt64(v_0_0_0.AuxInt)
-		x := v_0_0_0.Args[0]
-		v.reset(OpSelect0)
-		v0 := b.NewValue0(v.Pos, OpPPC64ANDCCconst, types.NewTuple(typ.Int, types.TypeFlags))
-		v0.AuxInt = int64ToAuxInt(c & d)
-		v0.AddArg(x)
-		v.AddArg(v0)
-		return true
-	}
 	// match: (Select0 (ANDCCconst [-1] x))
 	// result: x
 	for {
@@ -15554,17 +14410,19 @@
 		v.copyOf(y)
 		return true
 	}
-	// match: (Select0 (ANDCCconst [0xFF] y:(MOVBreg _)))
-	// result: y
+	// match: (Select0 (ANDCCconst [0xFF] (MOVBreg x)))
+	// result: (MOVBZreg x)
 	for {
 		if v_0.Op != OpPPC64ANDCCconst || auxIntToInt64(v_0.AuxInt) != 0xFF {
 			break
 		}
-		y := v_0.Args[0]
-		if y.Op != OpPPC64MOVBreg {
+		v_0_0 := v_0.Args[0]
+		if v_0_0.Op != OpPPC64MOVBreg {
 			break
 		}
-		v.copyOf(y)
+		x := v_0_0.Args[0]
+		v.reset(OpPPC64MOVBZreg)
+		v.AddArg(x)
 		return true
 	}
 	// match: (Select0 (ANDCCconst [c] y:(MOVHZreg _)))
@@ -15582,36 +14440,19 @@
 		v.copyOf(y)
 		return true
 	}
-	// match: (Select0 (ANDCCconst [0xFFFF] y:(MOVHreg _)))
-	// result: y
+	// match: (Select0 (ANDCCconst [0xFFFF] (MOVHreg x)))
+	// result: (MOVHZreg x)
 	for {
 		if v_0.Op != OpPPC64ANDCCconst || auxIntToInt64(v_0.AuxInt) != 0xFFFF {
 			break
 		}
-		y := v_0.Args[0]
-		if y.Op != OpPPC64MOVHreg {
-			break
-		}
-		v.copyOf(y)
-		return true
-	}
-	// match: (Select0 (ANDCCconst [c] (MOVBreg x)))
-	// result: (Select0 (ANDCCconst [c&0xFF] x))
-	for {
-		if v_0.Op != OpPPC64ANDCCconst {
-			break
-		}
-		c := auxIntToInt64(v_0.AuxInt)
 		v_0_0 := v_0.Args[0]
-		if v_0_0.Op != OpPPC64MOVBreg {
+		if v_0_0.Op != OpPPC64MOVHreg {
 			break
 		}
 		x := v_0_0.Args[0]
-		v.reset(OpSelect0)
-		v0 := b.NewValue0(v.Pos, OpPPC64ANDCCconst, types.NewTuple(typ.Int, types.TypeFlags))
-		v0.AuxInt = int64ToAuxInt(c & 0xFF)
-		v0.AddArg(x)
-		v.AddArg(v0)
+		v.reset(OpPPC64MOVHZreg)
+		v.AddArg(x)
 		return true
 	}
 	// match: (Select0 (ANDCCconst [c] (MOVBZreg x)))
@@ -15633,25 +14474,6 @@
 		v.AddArg(v0)
 		return true
 	}
-	// match: (Select0 (ANDCCconst [c] (MOVHreg x)))
-	// result: (Select0 (ANDCCconst [c&0xFFFF] x))
-	for {
-		if v_0.Op != OpPPC64ANDCCconst {
-			break
-		}
-		c := auxIntToInt64(v_0.AuxInt)
-		v_0_0 := v_0.Args[0]
-		if v_0_0.Op != OpPPC64MOVHreg {
-			break
-		}
-		x := v_0_0.Args[0]
-		v.reset(OpSelect0)
-		v0 := b.NewValue0(v.Pos, OpPPC64ANDCCconst, types.NewTuple(typ.Int, types.TypeFlags))
-		v0.AuxInt = int64ToAuxInt(c & 0xFFFF)
-		v0.AddArg(x)
-		v.AddArg(v0)
-		return true
-	}
 	// match: (Select0 (ANDCCconst [c] (MOVHZreg x)))
 	// result: (Select0 (ANDCCconst [c&0xFFFF] x))
 	for {
@@ -15671,25 +14493,6 @@
 		v.AddArg(v0)
 		return true
 	}
-	// match: (Select0 (ANDCCconst [c] (MOVWreg x)))
-	// result: (Select0 (ANDCCconst [c&0xFFFFFFFF] x))
-	for {
-		if v_0.Op != OpPPC64ANDCCconst {
-			break
-		}
-		c := auxIntToInt64(v_0.AuxInt)
-		v_0_0 := v_0.Args[0]
-		if v_0_0.Op != OpPPC64MOVWreg {
-			break
-		}
-		x := v_0_0.Args[0]
-		v.reset(OpSelect0)
-		v0 := b.NewValue0(v.Pos, OpPPC64ANDCCconst, types.NewTuple(typ.Int, types.TypeFlags))
-		v0.AuxInt = int64ToAuxInt(c & 0xFFFFFFFF)
-		v0.AddArg(x)
-		v.AddArg(v0)
-		return true
-	}
 	// match: (Select0 (ANDCCconst [c] (MOVWZreg x)))
 	// result: (Select0 (ANDCCconst [c&0xFFFFFFFF] x))
 	for {
@@ -15813,6 +14616,15 @@
 		v.copyOf(x)
 		return true
 	}
+	// match: (Select1 (ANDCCconst [0] _))
+	// result: (FlagEQ)
+	for {
+		if v_0.Op != OpPPC64ANDCCconst || auxIntToInt64(v_0.AuxInt) != 0 {
+			break
+		}
+		v.reset(OpPPC64FlagEQ)
+		return true
+	}
 	return false
 }
 func rewriteValuePPC64_OpSelectN(v *Value) bool {
@@ -15912,14 +14724,14 @@
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
 	// match: (Store {t} ptr val mem)
-	// cond: t.Size() == 8 && is64BitFloat(val.Type)
+	// cond: t.Size() == 8 && t.IsFloat()
 	// result: (FMOVDstore ptr val mem)
 	for {
 		t := auxToType(v.Aux)
 		ptr := v_0
 		val := v_1
 		mem := v_2
-		if !(t.Size() == 8 && is64BitFloat(val.Type)) {
+		if !(t.Size() == 8 && t.IsFloat()) {
 			break
 		}
 		v.reset(OpPPC64FMOVDstore)
@@ -15927,29 +14739,14 @@
 		return true
 	}
 	// match: (Store {t} ptr val mem)
-	// cond: t.Size() == 8 && is32BitFloat(val.Type)
-	// result: (FMOVDstore ptr val mem)
-	for {
-		t := auxToType(v.Aux)
-		ptr := v_0
-		val := v_1
-		mem := v_2
-		if !(t.Size() == 8 && is32BitFloat(val.Type)) {
-			break
-		}
-		v.reset(OpPPC64FMOVDstore)
-		v.AddArg3(ptr, val, mem)
-		return true
-	}
-	// match: (Store {t} ptr val mem)
-	// cond: t.Size() == 4 && is32BitFloat(val.Type)
+	// cond: t.Size() == 4 && t.IsFloat()
 	// result: (FMOVSstore ptr val mem)
 	for {
 		t := auxToType(v.Aux)
 		ptr := v_0
 		val := v_1
 		mem := v_2
-		if !(t.Size() == 4 && is32BitFloat(val.Type)) {
+		if !(t.Size() == 4 && t.IsFloat()) {
 			break
 		}
 		v.reset(OpPPC64FMOVSstore)
@@ -15957,14 +14754,14 @@
 		return true
 	}
 	// match: (Store {t} ptr val mem)
-	// cond: t.Size() == 8 && !is64BitFloat(val.Type)
+	// cond: t.Size() == 8 && !t.IsFloat()
 	// result: (MOVDstore ptr val mem)
 	for {
 		t := auxToType(v.Aux)
 		ptr := v_0
 		val := v_1
 		mem := v_2
-		if !(t.Size() == 8 && !is64BitFloat(val.Type)) {
+		if !(t.Size() == 8 && !t.IsFloat()) {
 			break
 		}
 		v.reset(OpPPC64MOVDstore)
@@ -15972,14 +14769,14 @@
 		return true
 	}
 	// match: (Store {t} ptr val mem)
-	// cond: t.Size() == 4 && is32BitInt(val.Type)
+	// cond: t.Size() == 4 && !t.IsFloat()
 	// result: (MOVWstore ptr val mem)
 	for {
 		t := auxToType(v.Aux)
 		ptr := v_0
 		val := v_1
 		mem := v_2
-		if !(t.Size() == 4 && is32BitInt(val.Type)) {
+		if !(t.Size() == 4 && !t.IsFloat()) {
 			break
 		}
 		v.reset(OpPPC64MOVWstore)
@@ -16021,12 +14818,12 @@
 func rewriteValuePPC64_OpTrunc16to8(v *Value) bool {
 	v_0 := v.Args[0]
 	// match: (Trunc16to8 <t> x)
-	// cond: isSigned(t)
+	// cond: t.IsSigned()
 	// result: (MOVBreg x)
 	for {
 		t := v.Type
 		x := v_0
-		if !(isSigned(t)) {
+		if !(t.IsSigned()) {
 			break
 		}
 		v.reset(OpPPC64MOVBreg)
@@ -16045,12 +14842,12 @@
 func rewriteValuePPC64_OpTrunc32to16(v *Value) bool {
 	v_0 := v.Args[0]
 	// match: (Trunc32to16 <t> x)
-	// cond: isSigned(t)
+	// cond: t.IsSigned()
 	// result: (MOVHreg x)
 	for {
 		t := v.Type
 		x := v_0
-		if !(isSigned(t)) {
+		if !(t.IsSigned()) {
 			break
 		}
 		v.reset(OpPPC64MOVHreg)
@@ -16069,12 +14866,12 @@
 func rewriteValuePPC64_OpTrunc32to8(v *Value) bool {
 	v_0 := v.Args[0]
 	// match: (Trunc32to8 <t> x)
-	// cond: isSigned(t)
+	// cond: t.IsSigned()
 	// result: (MOVBreg x)
 	for {
 		t := v.Type
 		x := v_0
-		if !(isSigned(t)) {
+		if !(t.IsSigned()) {
 			break
 		}
 		v.reset(OpPPC64MOVBreg)
@@ -16093,12 +14890,12 @@
 func rewriteValuePPC64_OpTrunc64to16(v *Value) bool {
 	v_0 := v.Args[0]
 	// match: (Trunc64to16 <t> x)
-	// cond: isSigned(t)
+	// cond: t.IsSigned()
 	// result: (MOVHreg x)
 	for {
 		t := v.Type
 		x := v_0
-		if !(isSigned(t)) {
+		if !(t.IsSigned()) {
 			break
 		}
 		v.reset(OpPPC64MOVHreg)
@@ -16117,12 +14914,12 @@
 func rewriteValuePPC64_OpTrunc64to32(v *Value) bool {
 	v_0 := v.Args[0]
 	// match: (Trunc64to32 <t> x)
-	// cond: isSigned(t)
+	// cond: t.IsSigned()
 	// result: (MOVWreg x)
 	for {
 		t := v.Type
 		x := v_0
-		if !(isSigned(t)) {
+		if !(t.IsSigned()) {
 			break
 		}
 		v.reset(OpPPC64MOVWreg)
@@ -16141,12 +14938,12 @@
 func rewriteValuePPC64_OpTrunc64to8(v *Value) bool {
 	v_0 := v.Args[0]
 	// match: (Trunc64to8 <t> x)
-	// cond: isSigned(t)
+	// cond: t.IsSigned()
 	// result: (MOVBreg x)
 	for {
 		t := v.Type
 		x := v_0
-		if !(isSigned(t)) {
+		if !(t.IsSigned()) {
 			break
 		}
 		v.reset(OpPPC64MOVBreg)
diff --git a/src/cmd/compile/internal/ssa/rewritePPC64latelower.go b/src/cmd/compile/internal/ssa/rewritePPC64latelower.go
index d687f59..56acbe4 100644
--- a/src/cmd/compile/internal/ssa/rewritePPC64latelower.go
+++ b/src/cmd/compile/internal/ssa/rewritePPC64latelower.go
@@ -1,12 +1,17 @@
-// Code generated from _gen/PPC64latelower.rules; DO NOT EDIT.
-// generated with: cd _gen; go run .
+// Code generated from _gen/PPC64latelower.rules using 'go generate'; DO NOT EDIT.
 
 package ssa
 
+import "internal/buildcfg"
+
 func rewriteValuePPC64latelower(v *Value) bool {
 	switch v.Op {
 	case OpPPC64ISEL:
 		return rewriteValuePPC64latelower_OpPPC64ISEL(v)
+	case OpPPC64SETBC:
+		return rewriteValuePPC64latelower_OpPPC64SETBC(v)
+	case OpPPC64SETBCR:
+		return rewriteValuePPC64latelower_OpPPC64SETBCR(v)
 	}
 	return false
 }
@@ -44,6 +49,126 @@
 	}
 	return false
 }
+func rewriteValuePPC64latelower_OpPPC64SETBC(v *Value) bool {
+	v_0 := v.Args[0]
+	b := v.Block
+	typ := &b.Func.Config.Types
+	// match: (SETBC [2] cmp)
+	// cond: buildcfg.GOPPC64 <= 9
+	// result: (ISELZ [2] (MOVDconst [1]) cmp)
+	for {
+		if auxIntToInt32(v.AuxInt) != 2 {
+			break
+		}
+		cmp := v_0
+		if !(buildcfg.GOPPC64 <= 9) {
+			break
+		}
+		v.reset(OpPPC64ISELZ)
+		v.AuxInt = int32ToAuxInt(2)
+		v0 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
+		v0.AuxInt = int64ToAuxInt(1)
+		v.AddArg2(v0, cmp)
+		return true
+	}
+	// match: (SETBC [0] cmp)
+	// cond: buildcfg.GOPPC64 <= 9
+	// result: (ISELZ [0] (MOVDconst [1]) cmp)
+	for {
+		if auxIntToInt32(v.AuxInt) != 0 {
+			break
+		}
+		cmp := v_0
+		if !(buildcfg.GOPPC64 <= 9) {
+			break
+		}
+		v.reset(OpPPC64ISELZ)
+		v.AuxInt = int32ToAuxInt(0)
+		v0 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
+		v0.AuxInt = int64ToAuxInt(1)
+		v.AddArg2(v0, cmp)
+		return true
+	}
+	// match: (SETBC [1] cmp)
+	// cond: buildcfg.GOPPC64 <= 9
+	// result: (ISELZ [1] (MOVDconst [1]) cmp)
+	for {
+		if auxIntToInt32(v.AuxInt) != 1 {
+			break
+		}
+		cmp := v_0
+		if !(buildcfg.GOPPC64 <= 9) {
+			break
+		}
+		v.reset(OpPPC64ISELZ)
+		v.AuxInt = int32ToAuxInt(1)
+		v0 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
+		v0.AuxInt = int64ToAuxInt(1)
+		v.AddArg2(v0, cmp)
+		return true
+	}
+	return false
+}
+func rewriteValuePPC64latelower_OpPPC64SETBCR(v *Value) bool {
+	v_0 := v.Args[0]
+	b := v.Block
+	typ := &b.Func.Config.Types
+	// match: (SETBCR [2] cmp)
+	// cond: buildcfg.GOPPC64 <= 9
+	// result: (ISELZ [6] (MOVDconst [1]) cmp)
+	for {
+		if auxIntToInt32(v.AuxInt) != 2 {
+			break
+		}
+		cmp := v_0
+		if !(buildcfg.GOPPC64 <= 9) {
+			break
+		}
+		v.reset(OpPPC64ISELZ)
+		v.AuxInt = int32ToAuxInt(6)
+		v0 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
+		v0.AuxInt = int64ToAuxInt(1)
+		v.AddArg2(v0, cmp)
+		return true
+	}
+	// match: (SETBCR [0] cmp)
+	// cond: buildcfg.GOPPC64 <= 9
+	// result: (ISELZ [4] (MOVDconst [1]) cmp)
+	for {
+		if auxIntToInt32(v.AuxInt) != 0 {
+			break
+		}
+		cmp := v_0
+		if !(buildcfg.GOPPC64 <= 9) {
+			break
+		}
+		v.reset(OpPPC64ISELZ)
+		v.AuxInt = int32ToAuxInt(4)
+		v0 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
+		v0.AuxInt = int64ToAuxInt(1)
+		v.AddArg2(v0, cmp)
+		return true
+	}
+	// match: (SETBCR [1] cmp)
+	// cond: buildcfg.GOPPC64 <= 9
+	// result: (ISELZ [5] (MOVDconst [1]) cmp)
+	for {
+		if auxIntToInt32(v.AuxInt) != 1 {
+			break
+		}
+		cmp := v_0
+		if !(buildcfg.GOPPC64 <= 9) {
+			break
+		}
+		v.reset(OpPPC64ISELZ)
+		v.AuxInt = int32ToAuxInt(5)
+		v0 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64)
+		v0.AuxInt = int64ToAuxInt(1)
+		v.AddArg2(v0, cmp)
+		return true
+	}
+	return false
+}
 func rewriteBlockPPC64latelower(b *Block) bool {
 	return false
 }
diff --git a/src/cmd/compile/internal/ssa/rewriteRISCV64.go b/src/cmd/compile/internal/ssa/rewriteRISCV64.go
index 961230d..ffbeb1d 100644
--- a/src/cmd/compile/internal/ssa/rewriteRISCV64.go
+++ b/src/cmd/compile/internal/ssa/rewriteRISCV64.go
@@ -1,5 +1,4 @@
-// Code generated from _gen/RISCV64.rules; DO NOT EDIT.
-// generated with: cd _gen; go run .
+// Code generated from _gen/RISCV64.rules using 'go generate'; DO NOT EDIT.
 
 package ssa
 
@@ -1480,13 +1479,13 @@
 		return true
 	}
 	// match: (Load <t> ptr mem)
-	// cond: ( is8BitInt(t) && isSigned(t))
+	// cond: ( is8BitInt(t) && t.IsSigned())
 	// result: (MOVBload ptr mem)
 	for {
 		t := v.Type
 		ptr := v_0
 		mem := v_1
-		if !(is8BitInt(t) && isSigned(t)) {
+		if !(is8BitInt(t) && t.IsSigned()) {
 			break
 		}
 		v.reset(OpRISCV64MOVBload)
@@ -1494,13 +1493,13 @@
 		return true
 	}
 	// match: (Load <t> ptr mem)
-	// cond: ( is8BitInt(t) && !isSigned(t))
+	// cond: ( is8BitInt(t) && !t.IsSigned())
 	// result: (MOVBUload ptr mem)
 	for {
 		t := v.Type
 		ptr := v_0
 		mem := v_1
-		if !(is8BitInt(t) && !isSigned(t)) {
+		if !(is8BitInt(t) && !t.IsSigned()) {
 			break
 		}
 		v.reset(OpRISCV64MOVBUload)
@@ -1508,13 +1507,13 @@
 		return true
 	}
 	// match: (Load <t> ptr mem)
-	// cond: (is16BitInt(t) && isSigned(t))
+	// cond: (is16BitInt(t) && t.IsSigned())
 	// result: (MOVHload ptr mem)
 	for {
 		t := v.Type
 		ptr := v_0
 		mem := v_1
-		if !(is16BitInt(t) && isSigned(t)) {
+		if !(is16BitInt(t) && t.IsSigned()) {
 			break
 		}
 		v.reset(OpRISCV64MOVHload)
@@ -1522,13 +1521,13 @@
 		return true
 	}
 	// match: (Load <t> ptr mem)
-	// cond: (is16BitInt(t) && !isSigned(t))
+	// cond: (is16BitInt(t) && !t.IsSigned())
 	// result: (MOVHUload ptr mem)
 	for {
 		t := v.Type
 		ptr := v_0
 		mem := v_1
-		if !(is16BitInt(t) && !isSigned(t)) {
+		if !(is16BitInt(t) && !t.IsSigned()) {
 			break
 		}
 		v.reset(OpRISCV64MOVHUload)
@@ -1536,13 +1535,13 @@
 		return true
 	}
 	// match: (Load <t> ptr mem)
-	// cond: (is32BitInt(t) && isSigned(t))
+	// cond: (is32BitInt(t) && t.IsSigned())
 	// result: (MOVWload ptr mem)
 	for {
 		t := v.Type
 		ptr := v_0
 		mem := v_1
-		if !(is32BitInt(t) && isSigned(t)) {
+		if !(is32BitInt(t) && t.IsSigned()) {
 			break
 		}
 		v.reset(OpRISCV64MOVWload)
@@ -1550,13 +1549,13 @@
 		return true
 	}
 	// match: (Load <t> ptr mem)
-	// cond: (is32BitInt(t) && !isSigned(t))
+	// cond: (is32BitInt(t) && !t.IsSigned())
 	// result: (MOVWUload ptr mem)
 	for {
 		t := v.Type
 		ptr := v_0
 		mem := v_1
-		if !(is32BitInt(t) && !isSigned(t)) {
+		if !(is32BitInt(t) && !t.IsSigned()) {
 			break
 		}
 		v.reset(OpRISCV64MOVWUload)
@@ -1608,17 +1607,44 @@
 	return false
 }
 func rewriteValueRISCV64_OpLocalAddr(v *Value) bool {
+	v_1 := v.Args[1]
 	v_0 := v.Args[0]
-	// match: (LocalAddr {sym} base _)
-	// result: (MOVaddr {sym} base)
+	b := v.Block
+	typ := &b.Func.Config.Types
+	// match: (LocalAddr <t> {sym} base mem)
+	// cond: t.Elem().HasPointers()
+	// result: (MOVaddr {sym} (SPanchored base mem))
 	for {
+		t := v.Type
 		sym := auxToSym(v.Aux)
 		base := v_0
+		mem := v_1
+		if !(t.Elem().HasPointers()) {
+			break
+		}
+		v.reset(OpRISCV64MOVaddr)
+		v.Aux = symToAux(sym)
+		v0 := b.NewValue0(v.Pos, OpSPanchored, typ.Uintptr)
+		v0.AddArg2(base, mem)
+		v.AddArg(v0)
+		return true
+	}
+	// match: (LocalAddr <t> {sym} base _)
+	// cond: !t.Elem().HasPointers()
+	// result: (MOVaddr {sym} base)
+	for {
+		t := v.Type
+		sym := auxToSym(v.Aux)
+		base := v_0
+		if !(!t.Elem().HasPointers()) {
+			break
+		}
 		v.reset(OpRISCV64MOVaddr)
 		v.Aux = symToAux(sym)
 		v.AddArg(base)
 		return true
 	}
+	return false
 }
 func rewriteValueRISCV64_OpLsh16x16(v *Value) bool {
 	v_1 := v.Args[1]
@@ -3124,17 +3150,18 @@
 func rewriteValueRISCV64_OpRISCV64ADD(v *Value) bool {
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
-	// match: (ADD (MOVDconst [val]) x)
-	// cond: is32Bit(val)
+	// match: (ADD (MOVDconst <t> [val]) x)
+	// cond: is32Bit(val) && !t.IsPtr()
 	// result: (ADDI [val] x)
 	for {
 		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
 			if v_0.Op != OpRISCV64MOVDconst {
 				continue
 			}
+			t := v_0.Type
 			val := auxIntToInt64(v_0.AuxInt)
 			x := v_1
-			if !(is32Bit(val)) {
+			if !(is32Bit(val) && !t.IsPtr()) {
 				continue
 			}
 			v.reset(OpRISCV64ADDI)
@@ -3295,7 +3322,7 @@
 	v_0 := v.Args[0]
 	// match: (FMADDD neg:(FNEGD x) y z)
 	// cond: neg.Uses == 1
-	// result: (FNMADDD x y z)
+	// result: (FNMSUBD x y z)
 	for {
 		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
 			neg := v_0
@@ -3308,7 +3335,7 @@
 			if !(neg.Uses == 1) {
 				continue
 			}
-			v.reset(OpRISCV64FNMADDD)
+			v.reset(OpRISCV64FNMSUBD)
 			v.AddArg3(x, y, z)
 			return true
 		}
@@ -3340,7 +3367,7 @@
 	v_0 := v.Args[0]
 	// match: (FMSUBD neg:(FNEGD x) y z)
 	// cond: neg.Uses == 1
-	// result: (FNMSUBD x y z)
+	// result: (FNMADDD x y z)
 	for {
 		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
 			neg := v_0
@@ -3353,7 +3380,7 @@
 			if !(neg.Uses == 1) {
 				continue
 			}
-			v.reset(OpRISCV64FNMSUBD)
+			v.reset(OpRISCV64FNMADDD)
 			v.AddArg3(x, y, z)
 			return true
 		}
@@ -3385,7 +3412,7 @@
 	v_0 := v.Args[0]
 	// match: (FNMADDD neg:(FNEGD x) y z)
 	// cond: neg.Uses == 1
-	// result: (FMADDD x y z)
+	// result: (FMSUBD x y z)
 	for {
 		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
 			neg := v_0
@@ -3398,7 +3425,7 @@
 			if !(neg.Uses == 1) {
 				continue
 			}
-			v.reset(OpRISCV64FMADDD)
+			v.reset(OpRISCV64FMSUBD)
 			v.AddArg3(x, y, z)
 			return true
 		}
@@ -3430,7 +3457,7 @@
 	v_0 := v.Args[0]
 	// match: (FNMSUBD neg:(FNEGD x) y z)
 	// cond: neg.Uses == 1
-	// result: (FMSUBD x y z)
+	// result: (FMADDD x y z)
 	for {
 		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
 			neg := v_0
@@ -3443,7 +3470,7 @@
 			if !(neg.Uses == 1) {
 				continue
 			}
-			v.reset(OpRISCV64FMSUBD)
+			v.reset(OpRISCV64FMADDD)
 			v.AddArg3(x, y, z)
 			return true
 		}
@@ -7835,14 +7862,14 @@
 		return true
 	}
 	// match: (Store {t} ptr val mem)
-	// cond: t.Size() == 4 && !is32BitFloat(val.Type)
+	// cond: t.Size() == 4 && !t.IsFloat()
 	// result: (MOVWstore ptr val mem)
 	for {
 		t := auxToType(v.Aux)
 		ptr := v_0
 		val := v_1
 		mem := v_2
-		if !(t.Size() == 4 && !is32BitFloat(val.Type)) {
+		if !(t.Size() == 4 && !t.IsFloat()) {
 			break
 		}
 		v.reset(OpRISCV64MOVWstore)
@@ -7850,14 +7877,14 @@
 		return true
 	}
 	// match: (Store {t} ptr val mem)
-	// cond: t.Size() == 8 && !is64BitFloat(val.Type)
+	// cond: t.Size() == 8 && !t.IsFloat()
 	// result: (MOVDstore ptr val mem)
 	for {
 		t := auxToType(v.Aux)
 		ptr := v_0
 		val := v_1
 		mem := v_2
-		if !(t.Size() == 8 && !is64BitFloat(val.Type)) {
+		if !(t.Size() == 8 && !t.IsFloat()) {
 			break
 		}
 		v.reset(OpRISCV64MOVDstore)
@@ -7865,14 +7892,14 @@
 		return true
 	}
 	// match: (Store {t} ptr val mem)
-	// cond: t.Size() == 4 && is32BitFloat(val.Type)
+	// cond: t.Size() == 4 && t.IsFloat()
 	// result: (FMOVWstore ptr val mem)
 	for {
 		t := auxToType(v.Aux)
 		ptr := v_0
 		val := v_1
 		mem := v_2
-		if !(t.Size() == 4 && is32BitFloat(val.Type)) {
+		if !(t.Size() == 4 && t.IsFloat()) {
 			break
 		}
 		v.reset(OpRISCV64FMOVWstore)
@@ -7880,14 +7907,14 @@
 		return true
 	}
 	// match: (Store {t} ptr val mem)
-	// cond: t.Size() == 8 && is64BitFloat(val.Type)
+	// cond: t.Size() == 8 && t.IsFloat()
 	// result: (FMOVDstore ptr val mem)
 	for {
 		t := auxToType(v.Aux)
 		ptr := v_0
 		val := v_1
 		mem := v_2
-		if !(t.Size() == 8 && is64BitFloat(val.Type)) {
+		if !(t.Size() == 8 && t.IsFloat()) {
 			break
 		}
 		v.reset(OpRISCV64FMOVDstore)
diff --git a/src/cmd/compile/internal/ssa/rewriteRISCV64latelower.go b/src/cmd/compile/internal/ssa/rewriteRISCV64latelower.go
index 04a9691..6dd97d6 100644
--- a/src/cmd/compile/internal/ssa/rewriteRISCV64latelower.go
+++ b/src/cmd/compile/internal/ssa/rewriteRISCV64latelower.go
@@ -1,5 +1,4 @@
-// Code generated from _gen/RISCV64latelower.rules; DO NOT EDIT.
-// generated with: cd _gen; go run .
+// Code generated from _gen/RISCV64latelower.rules using 'go generate'; DO NOT EDIT.
 
 package ssa
 
diff --git a/src/cmd/compile/internal/ssa/rewriteS390X.go b/src/cmd/compile/internal/ssa/rewriteS390X.go
index 8f40ecd..a3d6218 100644
--- a/src/cmd/compile/internal/ssa/rewriteS390X.go
+++ b/src/cmd/compile/internal/ssa/rewriteS390X.go
@@ -1,5 +1,4 @@
-// Code generated from _gen/S390X.rules; DO NOT EDIT.
-// generated with: cd _gen; go run .
+// Code generated from _gen/S390X.rules using 'go generate'; DO NOT EDIT.
 
 package ssa
 
@@ -91,6 +90,8 @@
 		return rewriteValueS390X_OpAvg64u(v)
 	case OpBitLen64:
 		return rewriteValueS390X_OpBitLen64(v)
+	case OpBswap16:
+		return rewriteValueS390X_OpBswap16(v)
 	case OpBswap32:
 		v.Op = OpS390XMOVWBR
 		return true
@@ -631,6 +632,8 @@
 		return rewriteValueS390X_OpS390XMOVBstore(v)
 	case OpS390XMOVBstoreconst:
 		return rewriteValueS390X_OpS390XMOVBstoreconst(v)
+	case OpS390XMOVDBR:
+		return rewriteValueS390X_OpS390XMOVDBR(v)
 	case OpS390XMOVDaddridx:
 		return rewriteValueS390X_OpS390XMOVDaddridx(v)
 	case OpS390XMOVDload:
@@ -639,8 +642,8 @@
 		return rewriteValueS390X_OpS390XMOVDstore(v)
 	case OpS390XMOVDstoreconst:
 		return rewriteValueS390X_OpS390XMOVDstoreconst(v)
-	case OpS390XMOVHBRstore:
-		return rewriteValueS390X_OpS390XMOVHBRstore(v)
+	case OpS390XMOVDstoreidx:
+		return rewriteValueS390X_OpS390XMOVDstoreidx(v)
 	case OpS390XMOVHZload:
 		return rewriteValueS390X_OpS390XMOVHZload(v)
 	case OpS390XMOVHZreg:
@@ -653,8 +656,10 @@
 		return rewriteValueS390X_OpS390XMOVHstore(v)
 	case OpS390XMOVHstoreconst:
 		return rewriteValueS390X_OpS390XMOVHstoreconst(v)
-	case OpS390XMOVWBRstore:
-		return rewriteValueS390X_OpS390XMOVWBRstore(v)
+	case OpS390XMOVHstoreidx:
+		return rewriteValueS390X_OpS390XMOVHstoreidx(v)
+	case OpS390XMOVWBR:
+		return rewriteValueS390X_OpS390XMOVWBR(v)
 	case OpS390XMOVWZload:
 		return rewriteValueS390X_OpS390XMOVWZload(v)
 	case OpS390XMOVWZreg:
@@ -667,6 +672,8 @@
 		return rewriteValueS390X_OpS390XMOVWstore(v)
 	case OpS390XMOVWstoreconst:
 		return rewriteValueS390X_OpS390XMOVWstoreconst(v)
+	case OpS390XMOVWstoreidx:
+		return rewriteValueS390X_OpS390XMOVWstoreidx(v)
 	case OpS390XMULLD:
 		return rewriteValueS390X_OpS390XMULLD(v)
 	case OpS390XMULLDconst:
@@ -1271,6 +1278,55 @@
 		return true
 	}
 }
+func rewriteValueS390X_OpBswap16(v *Value) bool {
+	v_0 := v.Args[0]
+	b := v.Block
+	typ := &b.Func.Config.Types
+	// match: (Bswap16 x:(MOVHZload [off] {sym} ptr mem))
+	// result: @x.Block (MOVHZreg (MOVHBRload [off] {sym} ptr mem))
+	for {
+		x := v_0
+		if x.Op != OpS390XMOVHZload {
+			break
+		}
+		off := auxIntToInt32(x.AuxInt)
+		sym := auxToSym(x.Aux)
+		mem := x.Args[1]
+		ptr := x.Args[0]
+		b = x.Block
+		v0 := b.NewValue0(x.Pos, OpS390XMOVHZreg, typ.UInt64)
+		v.copyOf(v0)
+		v1 := b.NewValue0(x.Pos, OpS390XMOVHBRload, typ.UInt16)
+		v1.AuxInt = int32ToAuxInt(off)
+		v1.Aux = symToAux(sym)
+		v1.AddArg2(ptr, mem)
+		v0.AddArg(v1)
+		return true
+	}
+	// match: (Bswap16 x:(MOVHZloadidx [off] {sym} ptr idx mem))
+	// result: @x.Block (MOVHZreg (MOVHBRloadidx [off] {sym} ptr idx mem))
+	for {
+		x := v_0
+		if x.Op != OpS390XMOVHZloadidx {
+			break
+		}
+		off := auxIntToInt32(x.AuxInt)
+		sym := auxToSym(x.Aux)
+		mem := x.Args[2]
+		ptr := x.Args[0]
+		idx := x.Args[1]
+		b = x.Block
+		v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
+		v.copyOf(v0)
+		v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16)
+		v1.AuxInt = int32ToAuxInt(off)
+		v1.Aux = symToAux(sym)
+		v1.AddArg3(ptr, idx, mem)
+		v0.AddArg(v1)
+		return true
+	}
+	return false
+}
 func rewriteValueS390X_OpCeil(v *Value) bool {
 	v_0 := v.Args[0]
 	// match: (Ceil x)
@@ -2347,13 +2403,13 @@
 		return true
 	}
 	// match: (Load <t> ptr mem)
-	// cond: is32BitInt(t) && isSigned(t)
+	// cond: is32BitInt(t) && t.IsSigned()
 	// result: (MOVWload ptr mem)
 	for {
 		t := v.Type
 		ptr := v_0
 		mem := v_1
-		if !(is32BitInt(t) && isSigned(t)) {
+		if !(is32BitInt(t) && t.IsSigned()) {
 			break
 		}
 		v.reset(OpS390XMOVWload)
@@ -2361,13 +2417,13 @@
 		return true
 	}
 	// match: (Load <t> ptr mem)
-	// cond: is32BitInt(t) && !isSigned(t)
+	// cond: is32BitInt(t) && !t.IsSigned()
 	// result: (MOVWZload ptr mem)
 	for {
 		t := v.Type
 		ptr := v_0
 		mem := v_1
-		if !(is32BitInt(t) && !isSigned(t)) {
+		if !(is32BitInt(t) && !t.IsSigned()) {
 			break
 		}
 		v.reset(OpS390XMOVWZload)
@@ -2375,13 +2431,13 @@
 		return true
 	}
 	// match: (Load <t> ptr mem)
-	// cond: is16BitInt(t) && isSigned(t)
+	// cond: is16BitInt(t) && t.IsSigned()
 	// result: (MOVHload ptr mem)
 	for {
 		t := v.Type
 		ptr := v_0
 		mem := v_1
-		if !(is16BitInt(t) && isSigned(t)) {
+		if !(is16BitInt(t) && t.IsSigned()) {
 			break
 		}
 		v.reset(OpS390XMOVHload)
@@ -2389,13 +2445,13 @@
 		return true
 	}
 	// match: (Load <t> ptr mem)
-	// cond: is16BitInt(t) && !isSigned(t)
+	// cond: is16BitInt(t) && !t.IsSigned()
 	// result: (MOVHZload ptr mem)
 	for {
 		t := v.Type
 		ptr := v_0
 		mem := v_1
-		if !(is16BitInt(t) && !isSigned(t)) {
+		if !(is16BitInt(t) && !t.IsSigned()) {
 			break
 		}
 		v.reset(OpS390XMOVHZload)
@@ -2403,13 +2459,13 @@
 		return true
 	}
 	// match: (Load <t> ptr mem)
-	// cond: is8BitInt(t) && isSigned(t)
+	// cond: is8BitInt(t) && t.IsSigned()
 	// result: (MOVBload ptr mem)
 	for {
 		t := v.Type
 		ptr := v_0
 		mem := v_1
-		if !(is8BitInt(t) && isSigned(t)) {
+		if !(is8BitInt(t) && t.IsSigned()) {
 			break
 		}
 		v.reset(OpS390XMOVBload)
@@ -2417,13 +2473,13 @@
 		return true
 	}
 	// match: (Load <t> ptr mem)
-	// cond: (t.IsBoolean() || (is8BitInt(t) && !isSigned(t)))
+	// cond: (t.IsBoolean() || (is8BitInt(t) && !t.IsSigned()))
 	// result: (MOVBZload ptr mem)
 	for {
 		t := v.Type
 		ptr := v_0
 		mem := v_1
-		if !(t.IsBoolean() || (is8BitInt(t) && !isSigned(t))) {
+		if !(t.IsBoolean() || (is8BitInt(t) && !t.IsSigned())) {
 			break
 		}
 		v.reset(OpS390XMOVBZload)
@@ -2461,17 +2517,44 @@
 	return false
 }
 func rewriteValueS390X_OpLocalAddr(v *Value) bool {
+	v_1 := v.Args[1]
 	v_0 := v.Args[0]
-	// match: (LocalAddr {sym} base _)
-	// result: (MOVDaddr {sym} base)
+	b := v.Block
+	typ := &b.Func.Config.Types
+	// match: (LocalAddr <t> {sym} base mem)
+	// cond: t.Elem().HasPointers()
+	// result: (MOVDaddr {sym} (SPanchored base mem))
 	for {
+		t := v.Type
 		sym := auxToSym(v.Aux)
 		base := v_0
+		mem := v_1
+		if !(t.Elem().HasPointers()) {
+			break
+		}
+		v.reset(OpS390XMOVDaddr)
+		v.Aux = symToAux(sym)
+		v0 := b.NewValue0(v.Pos, OpSPanchored, typ.Uintptr)
+		v0.AddArg2(base, mem)
+		v.AddArg(v0)
+		return true
+	}
+	// match: (LocalAddr <t> {sym} base _)
+	// cond: !t.Elem().HasPointers()
+	// result: (MOVDaddr {sym} base)
+	for {
+		t := v.Type
+		sym := auxToSym(v.Aux)
+		base := v_0
+		if !(!t.Elem().HasPointers()) {
+			break
+		}
 		v.reset(OpS390XMOVDaddr)
 		v.Aux = symToAux(sym)
 		v.AddArg(base)
 		return true
 	}
+	return false
 }
 func rewriteValueS390X_OpLsh16x16(v *Value) bool {
 	v_1 := v.Args[1]
@@ -5260,8 +5343,8 @@
 func rewriteValueS390X_OpS390XADD(v *Value) bool {
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
-	// match: (ADD x (MOVDconst [c]))
-	// cond: is32Bit(c)
+	// match: (ADD x (MOVDconst <t> [c]))
+	// cond: is32Bit(c) && !t.IsPtr()
 	// result: (ADDconst [int32(c)] x)
 	for {
 		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
@@ -5269,8 +5352,9 @@
 			if v_1.Op != OpS390XMOVDconst {
 				continue
 			}
+			t := v_1.Type
 			c := auxIntToInt64(v_1.AuxInt)
-			if !(is32Bit(c)) {
+			if !(is32Bit(c) && !t.IsPtr()) {
 				continue
 			}
 			v.reset(OpS390XADDconst)
@@ -8624,280 +8708,6 @@
 		v.AddArg3(base, val, mem)
 		return true
 	}
-	// match: (MOVBstore [i] {s} p w x:(MOVBstore [i-1] {s} p (SRDconst [8] w) mem))
-	// cond: p.Op != OpSB && x.Uses == 1 && clobber(x)
-	// result: (MOVHstore [i-1] {s} p w mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p := v_0
-		w := v_1
-		x := v_2
-		if x.Op != OpS390XMOVBstore || auxIntToInt32(x.AuxInt) != i-1 || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		if p != x.Args[0] {
-			break
-		}
-		x_1 := x.Args[1]
-		if x_1.Op != OpS390XSRDconst || auxIntToUint8(x_1.AuxInt) != 8 || w != x_1.Args[0] || !(p.Op != OpSB && x.Uses == 1 && clobber(x)) {
-			break
-		}
-		v.reset(OpS390XMOVHstore)
-		v.AuxInt = int32ToAuxInt(i - 1)
-		v.Aux = symToAux(s)
-		v.AddArg3(p, w, mem)
-		return true
-	}
-	// match: (MOVBstore [i] {s} p w0:(SRDconst [j] w) x:(MOVBstore [i-1] {s} p (SRDconst [j+8] w) mem))
-	// cond: p.Op != OpSB && x.Uses == 1 && clobber(x)
-	// result: (MOVHstore [i-1] {s} p w0 mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p := v_0
-		w0 := v_1
-		if w0.Op != OpS390XSRDconst {
-			break
-		}
-		j := auxIntToUint8(w0.AuxInt)
-		w := w0.Args[0]
-		x := v_2
-		if x.Op != OpS390XMOVBstore || auxIntToInt32(x.AuxInt) != i-1 || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		if p != x.Args[0] {
-			break
-		}
-		x_1 := x.Args[1]
-		if x_1.Op != OpS390XSRDconst || auxIntToUint8(x_1.AuxInt) != j+8 || w != x_1.Args[0] || !(p.Op != OpSB && x.Uses == 1 && clobber(x)) {
-			break
-		}
-		v.reset(OpS390XMOVHstore)
-		v.AuxInt = int32ToAuxInt(i - 1)
-		v.Aux = symToAux(s)
-		v.AddArg3(p, w0, mem)
-		return true
-	}
-	// match: (MOVBstore [i] {s} p w x:(MOVBstore [i-1] {s} p (SRWconst [8] w) mem))
-	// cond: p.Op != OpSB && x.Uses == 1 && clobber(x)
-	// result: (MOVHstore [i-1] {s} p w mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p := v_0
-		w := v_1
-		x := v_2
-		if x.Op != OpS390XMOVBstore || auxIntToInt32(x.AuxInt) != i-1 || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		if p != x.Args[0] {
-			break
-		}
-		x_1 := x.Args[1]
-		if x_1.Op != OpS390XSRWconst || auxIntToUint8(x_1.AuxInt) != 8 || w != x_1.Args[0] || !(p.Op != OpSB && x.Uses == 1 && clobber(x)) {
-			break
-		}
-		v.reset(OpS390XMOVHstore)
-		v.AuxInt = int32ToAuxInt(i - 1)
-		v.Aux = symToAux(s)
-		v.AddArg3(p, w, mem)
-		return true
-	}
-	// match: (MOVBstore [i] {s} p w0:(SRWconst [j] w) x:(MOVBstore [i-1] {s} p (SRWconst [j+8] w) mem))
-	// cond: p.Op != OpSB && x.Uses == 1 && clobber(x)
-	// result: (MOVHstore [i-1] {s} p w0 mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p := v_0
-		w0 := v_1
-		if w0.Op != OpS390XSRWconst {
-			break
-		}
-		j := auxIntToUint8(w0.AuxInt)
-		w := w0.Args[0]
-		x := v_2
-		if x.Op != OpS390XMOVBstore || auxIntToInt32(x.AuxInt) != i-1 || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		if p != x.Args[0] {
-			break
-		}
-		x_1 := x.Args[1]
-		if x_1.Op != OpS390XSRWconst || auxIntToUint8(x_1.AuxInt) != j+8 || w != x_1.Args[0] || !(p.Op != OpSB && x.Uses == 1 && clobber(x)) {
-			break
-		}
-		v.reset(OpS390XMOVHstore)
-		v.AuxInt = int32ToAuxInt(i - 1)
-		v.Aux = symToAux(s)
-		v.AddArg3(p, w0, mem)
-		return true
-	}
-	// match: (MOVBstore [i] {s} p (SRDconst [8] w) x:(MOVBstore [i-1] {s} p w mem))
-	// cond: p.Op != OpSB && x.Uses == 1 && clobber(x)
-	// result: (MOVHBRstore [i-1] {s} p w mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p := v_0
-		if v_1.Op != OpS390XSRDconst || auxIntToUint8(v_1.AuxInt) != 8 {
-			break
-		}
-		w := v_1.Args[0]
-		x := v_2
-		if x.Op != OpS390XMOVBstore || auxIntToInt32(x.AuxInt) != i-1 || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		if p != x.Args[0] || w != x.Args[1] || !(p.Op != OpSB && x.Uses == 1 && clobber(x)) {
-			break
-		}
-		v.reset(OpS390XMOVHBRstore)
-		v.AuxInt = int32ToAuxInt(i - 1)
-		v.Aux = symToAux(s)
-		v.AddArg3(p, w, mem)
-		return true
-	}
-	// match: (MOVBstore [i] {s} p (SRDconst [j] w) x:(MOVBstore [i-1] {s} p w0:(SRDconst [j-8] w) mem))
-	// cond: p.Op != OpSB && x.Uses == 1 && clobber(x)
-	// result: (MOVHBRstore [i-1] {s} p w0 mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p := v_0
-		if v_1.Op != OpS390XSRDconst {
-			break
-		}
-		j := auxIntToUint8(v_1.AuxInt)
-		w := v_1.Args[0]
-		x := v_2
-		if x.Op != OpS390XMOVBstore || auxIntToInt32(x.AuxInt) != i-1 || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		if p != x.Args[0] {
-			break
-		}
-		w0 := x.Args[1]
-		if w0.Op != OpS390XSRDconst || auxIntToUint8(w0.AuxInt) != j-8 || w != w0.Args[0] || !(p.Op != OpSB && x.Uses == 1 && clobber(x)) {
-			break
-		}
-		v.reset(OpS390XMOVHBRstore)
-		v.AuxInt = int32ToAuxInt(i - 1)
-		v.Aux = symToAux(s)
-		v.AddArg3(p, w0, mem)
-		return true
-	}
-	// match: (MOVBstore [i] {s} p (SRWconst [8] w) x:(MOVBstore [i-1] {s} p w mem))
-	// cond: p.Op != OpSB && x.Uses == 1 && clobber(x)
-	// result: (MOVHBRstore [i-1] {s} p w mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p := v_0
-		if v_1.Op != OpS390XSRWconst || auxIntToUint8(v_1.AuxInt) != 8 {
-			break
-		}
-		w := v_1.Args[0]
-		x := v_2
-		if x.Op != OpS390XMOVBstore || auxIntToInt32(x.AuxInt) != i-1 || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		if p != x.Args[0] || w != x.Args[1] || !(p.Op != OpSB && x.Uses == 1 && clobber(x)) {
-			break
-		}
-		v.reset(OpS390XMOVHBRstore)
-		v.AuxInt = int32ToAuxInt(i - 1)
-		v.Aux = symToAux(s)
-		v.AddArg3(p, w, mem)
-		return true
-	}
-	// match: (MOVBstore [i] {s} p (SRWconst [j] w) x:(MOVBstore [i-1] {s} p w0:(SRWconst [j-8] w) mem))
-	// cond: p.Op != OpSB && x.Uses == 1 && clobber(x)
-	// result: (MOVHBRstore [i-1] {s} p w0 mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p := v_0
-		if v_1.Op != OpS390XSRWconst {
-			break
-		}
-		j := auxIntToUint8(v_1.AuxInt)
-		w := v_1.Args[0]
-		x := v_2
-		if x.Op != OpS390XMOVBstore || auxIntToInt32(x.AuxInt) != i-1 || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		if p != x.Args[0] {
-			break
-		}
-		w0 := x.Args[1]
-		if w0.Op != OpS390XSRWconst || auxIntToUint8(w0.AuxInt) != j-8 || w != w0.Args[0] || !(p.Op != OpSB && x.Uses == 1 && clobber(x)) {
-			break
-		}
-		v.reset(OpS390XMOVHBRstore)
-		v.AuxInt = int32ToAuxInt(i - 1)
-		v.Aux = symToAux(s)
-		v.AddArg3(p, w0, mem)
-		return true
-	}
-	// match: (MOVBstore [7] {s} p1 (SRDconst w) x1:(MOVHBRstore [5] {s} p1 (SRDconst w) x2:(MOVWBRstore [1] {s} p1 (SRDconst w) x3:(MOVBstore [0] {s} p1 w mem))))
-	// cond: x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && clobber(x1, x2, x3)
-	// result: (MOVDBRstore {s} p1 w mem)
-	for {
-		if auxIntToInt32(v.AuxInt) != 7 {
-			break
-		}
-		s := auxToSym(v.Aux)
-		p1 := v_0
-		if v_1.Op != OpS390XSRDconst {
-			break
-		}
-		w := v_1.Args[0]
-		x1 := v_2
-		if x1.Op != OpS390XMOVHBRstore || auxIntToInt32(x1.AuxInt) != 5 || auxToSym(x1.Aux) != s {
-			break
-		}
-		_ = x1.Args[2]
-		if p1 != x1.Args[0] {
-			break
-		}
-		x1_1 := x1.Args[1]
-		if x1_1.Op != OpS390XSRDconst || w != x1_1.Args[0] {
-			break
-		}
-		x2 := x1.Args[2]
-		if x2.Op != OpS390XMOVWBRstore || auxIntToInt32(x2.AuxInt) != 1 || auxToSym(x2.Aux) != s {
-			break
-		}
-		_ = x2.Args[2]
-		if p1 != x2.Args[0] {
-			break
-		}
-		x2_1 := x2.Args[1]
-		if x2_1.Op != OpS390XSRDconst || w != x2_1.Args[0] {
-			break
-		}
-		x3 := x2.Args[2]
-		if x3.Op != OpS390XMOVBstore || auxIntToInt32(x3.AuxInt) != 0 || auxToSym(x3.Aux) != s {
-			break
-		}
-		mem := x3.Args[2]
-		if p1 != x3.Args[0] || w != x3.Args[1] || !(x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && clobber(x1, x2, x3)) {
-			break
-		}
-		v.reset(OpS390XMOVDBRstore)
-		v.Aux = symToAux(s)
-		v.AddArg3(p1, w, mem)
-		return true
-	}
 	return false
 }
 func rewriteValueS390X_OpS390XMOVBstoreconst(v *Value) bool {
@@ -8946,29 +8756,57 @@
 		v.AddArg2(ptr, mem)
 		return true
 	}
-	// match: (MOVBstoreconst [c] {s} p x:(MOVBstoreconst [a] {s} p mem))
-	// cond: p.Op != OpSB && x.Uses == 1 && a.Off() + 1 == c.Off() && clobber(x)
-	// result: (MOVHstoreconst [makeValAndOff(c.Val()&0xff | a.Val()<<8, a.Off())] {s} p mem)
+	return false
+}
+func rewriteValueS390X_OpS390XMOVDBR(v *Value) bool {
+	v_0 := v.Args[0]
+	b := v.Block
+	typ := &b.Func.Config.Types
+	// match: (MOVDBR x:(MOVDload [off] {sym} ptr mem))
+	// cond: x.Uses == 1
+	// result: @x.Block (MOVDBRload [off] {sym} ptr mem)
 	for {
-		c := auxIntToValAndOff(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p := v_0
-		x := v_1
-		if x.Op != OpS390XMOVBstoreconst {
+		x := v_0
+		if x.Op != OpS390XMOVDload {
 			break
 		}
-		a := auxIntToValAndOff(x.AuxInt)
-		if auxToSym(x.Aux) != s {
-			break
-		}
+		off := auxIntToInt32(x.AuxInt)
+		sym := auxToSym(x.Aux)
 		mem := x.Args[1]
-		if p != x.Args[0] || !(p.Op != OpSB && x.Uses == 1 && a.Off()+1 == c.Off() && clobber(x)) {
+		ptr := x.Args[0]
+		if !(x.Uses == 1) {
 			break
 		}
-		v.reset(OpS390XMOVHstoreconst)
-		v.AuxInt = valAndOffToAuxInt(makeValAndOff(c.Val()&0xff|a.Val()<<8, a.Off()))
-		v.Aux = symToAux(s)
-		v.AddArg2(p, mem)
+		b = x.Block
+		v0 := b.NewValue0(x.Pos, OpS390XMOVDBRload, typ.UInt64)
+		v.copyOf(v0)
+		v0.AuxInt = int32ToAuxInt(off)
+		v0.Aux = symToAux(sym)
+		v0.AddArg2(ptr, mem)
+		return true
+	}
+	// match: (MOVDBR x:(MOVDloadidx [off] {sym} ptr idx mem))
+	// cond: x.Uses == 1
+	// result: @x.Block (MOVDBRloadidx [off] {sym} ptr idx mem)
+	for {
+		x := v_0
+		if x.Op != OpS390XMOVDloadidx {
+			break
+		}
+		off := auxIntToInt32(x.AuxInt)
+		sym := auxToSym(x.Aux)
+		mem := x.Args[2]
+		ptr := x.Args[0]
+		idx := x.Args[1]
+		if !(x.Uses == 1) {
+			break
+		}
+		b = x.Block
+		v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, typ.Int64)
+		v.copyOf(v0)
+		v0.AuxInt = int32ToAuxInt(off)
+		v0.Aux = symToAux(sym)
+		v0.AddArg3(ptr, idx, mem)
 		return true
 	}
 	return false
@@ -9302,6 +9140,28 @@
 		v.AddArg6(p, w0, w1, w2, w3, mem)
 		return true
 	}
+	// match: (MOVDstore [off] {sym} ptr r:(MOVDBR x) mem)
+	// cond: r.Uses == 1
+	// result: (MOVDBRstore [off] {sym} ptr x mem)
+	for {
+		off := auxIntToInt32(v.AuxInt)
+		sym := auxToSym(v.Aux)
+		ptr := v_0
+		r := v_1
+		if r.Op != OpS390XMOVDBR {
+			break
+		}
+		x := r.Args[0]
+		mem := v_2
+		if !(r.Uses == 1) {
+			break
+		}
+		v.reset(OpS390XMOVDBRstore)
+		v.AuxInt = int32ToAuxInt(off)
+		v.Aux = symToAux(sym)
+		v.AddArg3(ptr, x, mem)
+		return true
+	}
 	return false
 }
 func rewriteValueS390X_OpS390XMOVDstoreconst(v *Value) bool {
@@ -9352,118 +9212,32 @@
 	}
 	return false
 }
-func rewriteValueS390X_OpS390XMOVHBRstore(v *Value) bool {
+func rewriteValueS390X_OpS390XMOVDstoreidx(v *Value) bool {
+	v_3 := v.Args[3]
 	v_2 := v.Args[2]
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
-	// match: (MOVHBRstore [i] {s} p (SRDconst [16] w) x:(MOVHBRstore [i-2] {s} p w mem))
-	// cond: x.Uses == 1 && clobber(x)
-	// result: (MOVWBRstore [i-2] {s} p w mem)
+	// match: (MOVDstoreidx [off] {sym} ptr idx r:(MOVDBR x) mem)
+	// cond: r.Uses == 1
+	// result: (MOVDBRstoreidx [off] {sym} ptr idx x mem)
 	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p := v_0
-		if v_1.Op != OpS390XSRDconst || auxIntToUint8(v_1.AuxInt) != 16 {
+		off := auxIntToInt32(v.AuxInt)
+		sym := auxToSym(v.Aux)
+		ptr := v_0
+		idx := v_1
+		r := v_2
+		if r.Op != OpS390XMOVDBR {
 			break
 		}
-		w := v_1.Args[0]
-		x := v_2
-		if x.Op != OpS390XMOVHBRstore || auxIntToInt32(x.AuxInt) != i-2 || auxToSym(x.Aux) != s {
+		x := r.Args[0]
+		mem := v_3
+		if !(r.Uses == 1) {
 			break
 		}
-		mem := x.Args[2]
-		if p != x.Args[0] || w != x.Args[1] || !(x.Uses == 1 && clobber(x)) {
-			break
-		}
-		v.reset(OpS390XMOVWBRstore)
-		v.AuxInt = int32ToAuxInt(i - 2)
-		v.Aux = symToAux(s)
-		v.AddArg3(p, w, mem)
-		return true
-	}
-	// match: (MOVHBRstore [i] {s} p (SRDconst [j] w) x:(MOVHBRstore [i-2] {s} p w0:(SRDconst [j-16] w) mem))
-	// cond: x.Uses == 1 && clobber(x)
-	// result: (MOVWBRstore [i-2] {s} p w0 mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p := v_0
-		if v_1.Op != OpS390XSRDconst {
-			break
-		}
-		j := auxIntToUint8(v_1.AuxInt)
-		w := v_1.Args[0]
-		x := v_2
-		if x.Op != OpS390XMOVHBRstore || auxIntToInt32(x.AuxInt) != i-2 || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		if p != x.Args[0] {
-			break
-		}
-		w0 := x.Args[1]
-		if w0.Op != OpS390XSRDconst || auxIntToUint8(w0.AuxInt) != j-16 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) {
-			break
-		}
-		v.reset(OpS390XMOVWBRstore)
-		v.AuxInt = int32ToAuxInt(i - 2)
-		v.Aux = symToAux(s)
-		v.AddArg3(p, w0, mem)
-		return true
-	}
-	// match: (MOVHBRstore [i] {s} p (SRWconst [16] w) x:(MOVHBRstore [i-2] {s} p w mem))
-	// cond: x.Uses == 1 && clobber(x)
-	// result: (MOVWBRstore [i-2] {s} p w mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p := v_0
-		if v_1.Op != OpS390XSRWconst || auxIntToUint8(v_1.AuxInt) != 16 {
-			break
-		}
-		w := v_1.Args[0]
-		x := v_2
-		if x.Op != OpS390XMOVHBRstore || auxIntToInt32(x.AuxInt) != i-2 || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		if p != x.Args[0] || w != x.Args[1] || !(x.Uses == 1 && clobber(x)) {
-			break
-		}
-		v.reset(OpS390XMOVWBRstore)
-		v.AuxInt = int32ToAuxInt(i - 2)
-		v.Aux = symToAux(s)
-		v.AddArg3(p, w, mem)
-		return true
-	}
-	// match: (MOVHBRstore [i] {s} p (SRWconst [j] w) x:(MOVHBRstore [i-2] {s} p w0:(SRWconst [j-16] w) mem))
-	// cond: x.Uses == 1 && clobber(x)
-	// result: (MOVWBRstore [i-2] {s} p w0 mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p := v_0
-		if v_1.Op != OpS390XSRWconst {
-			break
-		}
-		j := auxIntToUint8(v_1.AuxInt)
-		w := v_1.Args[0]
-		x := v_2
-		if x.Op != OpS390XMOVHBRstore || auxIntToInt32(x.AuxInt) != i-2 || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		if p != x.Args[0] {
-			break
-		}
-		w0 := x.Args[1]
-		if w0.Op != OpS390XSRWconst || auxIntToUint8(w0.AuxInt) != j-16 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) {
-			break
-		}
-		v.reset(OpS390XMOVWBRstore)
-		v.AuxInt = int32ToAuxInt(i - 2)
-		v.Aux = symToAux(s)
-		v.AddArg3(p, w0, mem)
+		v.reset(OpS390XMOVDBRstoreidx)
+		v.AuxInt = int32ToAuxInt(off)
+		v.Aux = symToAux(sym)
+		v.AddArg4(ptr, idx, x, mem)
 		return true
 	}
 	return false
@@ -10087,118 +9861,21 @@
 		v.AddArg3(base, val, mem)
 		return true
 	}
-	// match: (MOVHstore [i] {s} p w x:(MOVHstore [i-2] {s} p (SRDconst [16] w) mem))
-	// cond: p.Op != OpSB && x.Uses == 1 && clobber(x)
-	// result: (MOVWstore [i-2] {s} p w mem)
+	// match: (MOVHstore [off] {sym} ptr (Bswap16 val) mem)
+	// result: (MOVHBRstore [off] {sym} ptr val mem)
 	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p := v_0
-		w := v_1
-		x := v_2
-		if x.Op != OpS390XMOVHstore || auxIntToInt32(x.AuxInt) != i-2 || auxToSym(x.Aux) != s {
+		off := auxIntToInt32(v.AuxInt)
+		sym := auxToSym(v.Aux)
+		ptr := v_0
+		if v_1.Op != OpBswap16 {
 			break
 		}
-		mem := x.Args[2]
-		if p != x.Args[0] {
-			break
-		}
-		x_1 := x.Args[1]
-		if x_1.Op != OpS390XSRDconst || auxIntToUint8(x_1.AuxInt) != 16 || w != x_1.Args[0] || !(p.Op != OpSB && x.Uses == 1 && clobber(x)) {
-			break
-		}
-		v.reset(OpS390XMOVWstore)
-		v.AuxInt = int32ToAuxInt(i - 2)
-		v.Aux = symToAux(s)
-		v.AddArg3(p, w, mem)
-		return true
-	}
-	// match: (MOVHstore [i] {s} p w0:(SRDconst [j] w) x:(MOVHstore [i-2] {s} p (SRDconst [j+16] w) mem))
-	// cond: p.Op != OpSB && x.Uses == 1 && clobber(x)
-	// result: (MOVWstore [i-2] {s} p w0 mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p := v_0
-		w0 := v_1
-		if w0.Op != OpS390XSRDconst {
-			break
-		}
-		j := auxIntToUint8(w0.AuxInt)
-		w := w0.Args[0]
-		x := v_2
-		if x.Op != OpS390XMOVHstore || auxIntToInt32(x.AuxInt) != i-2 || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		if p != x.Args[0] {
-			break
-		}
-		x_1 := x.Args[1]
-		if x_1.Op != OpS390XSRDconst || auxIntToUint8(x_1.AuxInt) != j+16 || w != x_1.Args[0] || !(p.Op != OpSB && x.Uses == 1 && clobber(x)) {
-			break
-		}
-		v.reset(OpS390XMOVWstore)
-		v.AuxInt = int32ToAuxInt(i - 2)
-		v.Aux = symToAux(s)
-		v.AddArg3(p, w0, mem)
-		return true
-	}
-	// match: (MOVHstore [i] {s} p w x:(MOVHstore [i-2] {s} p (SRWconst [16] w) mem))
-	// cond: p.Op != OpSB && x.Uses == 1 && clobber(x)
-	// result: (MOVWstore [i-2] {s} p w mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p := v_0
-		w := v_1
-		x := v_2
-		if x.Op != OpS390XMOVHstore || auxIntToInt32(x.AuxInt) != i-2 || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		if p != x.Args[0] {
-			break
-		}
-		x_1 := x.Args[1]
-		if x_1.Op != OpS390XSRWconst || auxIntToUint8(x_1.AuxInt) != 16 || w != x_1.Args[0] || !(p.Op != OpSB && x.Uses == 1 && clobber(x)) {
-			break
-		}
-		v.reset(OpS390XMOVWstore)
-		v.AuxInt = int32ToAuxInt(i - 2)
-		v.Aux = symToAux(s)
-		v.AddArg3(p, w, mem)
-		return true
-	}
-	// match: (MOVHstore [i] {s} p w0:(SRWconst [j] w) x:(MOVHstore [i-2] {s} p (SRWconst [j+16] w) mem))
-	// cond: p.Op != OpSB && x.Uses == 1 && clobber(x)
-	// result: (MOVWstore [i-2] {s} p w0 mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p := v_0
-		w0 := v_1
-		if w0.Op != OpS390XSRWconst {
-			break
-		}
-		j := auxIntToUint8(w0.AuxInt)
-		w := w0.Args[0]
-		x := v_2
-		if x.Op != OpS390XMOVHstore || auxIntToInt32(x.AuxInt) != i-2 || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		if p != x.Args[0] {
-			break
-		}
-		x_1 := x.Args[1]
-		if x_1.Op != OpS390XSRWconst || auxIntToUint8(x_1.AuxInt) != j+16 || w != x_1.Args[0] || !(p.Op != OpSB && x.Uses == 1 && clobber(x)) {
-			break
-		}
-		v.reset(OpS390XMOVWstore)
-		v.AuxInt = int32ToAuxInt(i - 2)
-		v.Aux = symToAux(s)
-		v.AddArg3(p, w0, mem)
+		val := v_1.Args[0]
+		mem := v_2
+		v.reset(OpS390XMOVHBRstore)
+		v.AuxInt = int32ToAuxInt(off)
+		v.Aux = symToAux(sym)
+		v.AddArg3(ptr, val, mem)
 		return true
 	}
 	return false
@@ -10206,8 +9883,6 @@
 func rewriteValueS390X_OpS390XMOVHstoreconst(v *Value) bool {
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
-	b := v.Block
-	typ := &b.Func.Config.Types
 	// match: (MOVHstoreconst [sc] {s} (ADDconst [off] ptr) mem)
 	// cond: isU12Bit(sc.Off64()+int64(off))
 	// result: (MOVHstoreconst [sc.addOffset32(off)] {s} ptr mem)
@@ -10251,92 +9926,86 @@
 		v.AddArg2(ptr, mem)
 		return true
 	}
-	// match: (MOVHstoreconst [c] {s} p x:(MOVHstoreconst [a] {s} p mem))
-	// cond: p.Op != OpSB && x.Uses == 1 && a.Off() + 2 == c.Off() && clobber(x)
-	// result: (MOVWstore [a.Off()] {s} p (MOVDconst [int64(c.Val()&0xffff | a.Val()<<16)]) mem)
+	return false
+}
+func rewriteValueS390X_OpS390XMOVHstoreidx(v *Value) bool {
+	v_3 := v.Args[3]
+	v_2 := v.Args[2]
+	v_1 := v.Args[1]
+	v_0 := v.Args[0]
+	// match: (MOVHstoreidx [off] {sym} ptr idx (Bswap16 val) mem)
+	// result: (MOVHBRstoreidx [off] {sym} ptr idx val mem)
 	for {
-		c := auxIntToValAndOff(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p := v_0
-		x := v_1
-		if x.Op != OpS390XMOVHstoreconst {
+		off := auxIntToInt32(v.AuxInt)
+		sym := auxToSym(v.Aux)
+		ptr := v_0
+		idx := v_1
+		if v_2.Op != OpBswap16 {
 			break
 		}
-		a := auxIntToValAndOff(x.AuxInt)
-		if auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[1]
-		if p != x.Args[0] || !(p.Op != OpSB && x.Uses == 1 && a.Off()+2 == c.Off() && clobber(x)) {
-			break
-		}
-		v.reset(OpS390XMOVWstore)
-		v.AuxInt = int32ToAuxInt(a.Off())
-		v.Aux = symToAux(s)
-		v0 := b.NewValue0(x.Pos, OpS390XMOVDconst, typ.UInt64)
-		v0.AuxInt = int64ToAuxInt(int64(c.Val()&0xffff | a.Val()<<16))
-		v.AddArg3(p, v0, mem)
+		val := v_2.Args[0]
+		mem := v_3
+		v.reset(OpS390XMOVHBRstoreidx)
+		v.AuxInt = int32ToAuxInt(off)
+		v.Aux = symToAux(sym)
+		v.AddArg4(ptr, idx, val, mem)
 		return true
 	}
 	return false
 }
-func rewriteValueS390X_OpS390XMOVWBRstore(v *Value) bool {
-	v_2 := v.Args[2]
-	v_1 := v.Args[1]
+func rewriteValueS390X_OpS390XMOVWBR(v *Value) bool {
 	v_0 := v.Args[0]
-	// match: (MOVWBRstore [i] {s} p (SRDconst [32] w) x:(MOVWBRstore [i-4] {s} p w mem))
-	// cond: x.Uses == 1 && clobber(x)
-	// result: (MOVDBRstore [i-4] {s} p w mem)
+	b := v.Block
+	typ := &b.Func.Config.Types
+	// match: (MOVWBR x:(MOVWZload [off] {sym} ptr mem))
+	// cond: x.Uses == 1
+	// result: @x.Block (MOVWZreg (MOVWBRload [off] {sym} ptr mem))
 	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p := v_0
-		if v_1.Op != OpS390XSRDconst || auxIntToUint8(v_1.AuxInt) != 32 {
+		x := v_0
+		if x.Op != OpS390XMOVWZload {
 			break
 		}
-		w := v_1.Args[0]
-		x := v_2
-		if x.Op != OpS390XMOVWBRstore || auxIntToInt32(x.AuxInt) != i-4 || auxToSym(x.Aux) != s {
+		off := auxIntToInt32(x.AuxInt)
+		sym := auxToSym(x.Aux)
+		mem := x.Args[1]
+		ptr := x.Args[0]
+		if !(x.Uses == 1) {
 			break
 		}
-		mem := x.Args[2]
-		if p != x.Args[0] || w != x.Args[1] || !(x.Uses == 1 && clobber(x)) {
-			break
-		}
-		v.reset(OpS390XMOVDBRstore)
-		v.AuxInt = int32ToAuxInt(i - 4)
-		v.Aux = symToAux(s)
-		v.AddArg3(p, w, mem)
+		b = x.Block
+		v0 := b.NewValue0(x.Pos, OpS390XMOVWZreg, typ.UInt64)
+		v.copyOf(v0)
+		v1 := b.NewValue0(x.Pos, OpS390XMOVWBRload, typ.UInt32)
+		v1.AuxInt = int32ToAuxInt(off)
+		v1.Aux = symToAux(sym)
+		v1.AddArg2(ptr, mem)
+		v0.AddArg(v1)
 		return true
 	}
-	// match: (MOVWBRstore [i] {s} p (SRDconst [j] w) x:(MOVWBRstore [i-4] {s} p w0:(SRDconst [j-32] w) mem))
-	// cond: x.Uses == 1 && clobber(x)
-	// result: (MOVDBRstore [i-4] {s} p w0 mem)
+	// match: (MOVWBR x:(MOVWZloadidx [off] {sym} ptr idx mem))
+	// cond: x.Uses == 1
+	// result: @x.Block (MOVWZreg (MOVWBRloadidx [off] {sym} ptr idx mem))
 	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p := v_0
-		if v_1.Op != OpS390XSRDconst {
+		x := v_0
+		if x.Op != OpS390XMOVWZloadidx {
 			break
 		}
-		j := auxIntToUint8(v_1.AuxInt)
-		w := v_1.Args[0]
-		x := v_2
-		if x.Op != OpS390XMOVWBRstore || auxIntToInt32(x.AuxInt) != i-4 || auxToSym(x.Aux) != s {
-			break
-		}
+		off := auxIntToInt32(x.AuxInt)
+		sym := auxToSym(x.Aux)
 		mem := x.Args[2]
-		if p != x.Args[0] {
+		ptr := x.Args[0]
+		idx := x.Args[1]
+		if !(x.Uses == 1) {
 			break
 		}
-		w0 := x.Args[1]
-		if w0.Op != OpS390XSRDconst || auxIntToUint8(w0.AuxInt) != j-32 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) {
-			break
-		}
-		v.reset(OpS390XMOVDBRstore)
-		v.AuxInt = int32ToAuxInt(i - 4)
-		v.Aux = symToAux(s)
-		v.AddArg3(p, w0, mem)
+		b = x.Block
+		v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64)
+		v.copyOf(v0)
+		v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32)
+		v1.AuxInt = int32ToAuxInt(off)
+		v1.Aux = symToAux(sym)
+		v1.AddArg3(ptr, idx, mem)
+		v0.AddArg(v1)
 		return true
 	}
 	return false
@@ -10925,62 +10594,6 @@
 		v.AddArg3(base, val, mem)
 		return true
 	}
-	// match: (MOVWstore [i] {s} p (SRDconst [32] w) x:(MOVWstore [i-4] {s} p w mem))
-	// cond: p.Op != OpSB && x.Uses == 1 && clobber(x)
-	// result: (MOVDstore [i-4] {s} p w mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p := v_0
-		if v_1.Op != OpS390XSRDconst || auxIntToUint8(v_1.AuxInt) != 32 {
-			break
-		}
-		w := v_1.Args[0]
-		x := v_2
-		if x.Op != OpS390XMOVWstore || auxIntToInt32(x.AuxInt) != i-4 || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		if p != x.Args[0] || w != x.Args[1] || !(p.Op != OpSB && x.Uses == 1 && clobber(x)) {
-			break
-		}
-		v.reset(OpS390XMOVDstore)
-		v.AuxInt = int32ToAuxInt(i - 4)
-		v.Aux = symToAux(s)
-		v.AddArg3(p, w, mem)
-		return true
-	}
-	// match: (MOVWstore [i] {s} p w0:(SRDconst [j] w) x:(MOVWstore [i-4] {s} p (SRDconst [j+32] w) mem))
-	// cond: p.Op != OpSB && x.Uses == 1 && clobber(x)
-	// result: (MOVDstore [i-4] {s} p w0 mem)
-	for {
-		i := auxIntToInt32(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p := v_0
-		w0 := v_1
-		if w0.Op != OpS390XSRDconst {
-			break
-		}
-		j := auxIntToUint8(w0.AuxInt)
-		w := w0.Args[0]
-		x := v_2
-		if x.Op != OpS390XMOVWstore || auxIntToInt32(x.AuxInt) != i-4 || auxToSym(x.Aux) != s {
-			break
-		}
-		mem := x.Args[2]
-		if p != x.Args[0] {
-			break
-		}
-		x_1 := x.Args[1]
-		if x_1.Op != OpS390XSRDconst || auxIntToUint8(x_1.AuxInt) != j+32 || w != x_1.Args[0] || !(p.Op != OpSB && x.Uses == 1 && clobber(x)) {
-			break
-		}
-		v.reset(OpS390XMOVDstore)
-		v.AuxInt = int32ToAuxInt(i - 4)
-		v.Aux = symToAux(s)
-		v.AddArg3(p, w0, mem)
-		return true
-	}
 	// match: (MOVWstore [i] {s} p w1 x:(MOVWstore [i-4] {s} p w0 mem))
 	// cond: p.Op != OpSB && x.Uses == 1 && is20Bit(int64(i)-4) && clobber(x)
 	// result: (STM2 [i-4] {s} p w0 w1 mem)
@@ -11062,13 +10675,33 @@
 		v.AddArg6(p, w0, w1, w2, w3, mem)
 		return true
 	}
+	// match: (MOVWstore [off] {sym} ptr r:(MOVWBR x) mem)
+	// cond: r.Uses == 1
+	// result: (MOVWBRstore [off] {sym} ptr x mem)
+	for {
+		off := auxIntToInt32(v.AuxInt)
+		sym := auxToSym(v.Aux)
+		ptr := v_0
+		r := v_1
+		if r.Op != OpS390XMOVWBR {
+			break
+		}
+		x := r.Args[0]
+		mem := v_2
+		if !(r.Uses == 1) {
+			break
+		}
+		v.reset(OpS390XMOVWBRstore)
+		v.AuxInt = int32ToAuxInt(off)
+		v.Aux = symToAux(sym)
+		v.AddArg3(ptr, x, mem)
+		return true
+	}
 	return false
 }
 func rewriteValueS390X_OpS390XMOVWstoreconst(v *Value) bool {
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
-	b := v.Block
-	typ := &b.Func.Config.Types
 	// match: (MOVWstoreconst [sc] {s} (ADDconst [off] ptr) mem)
 	// cond: isU12Bit(sc.Off64()+int64(off))
 	// result: (MOVWstoreconst [sc.addOffset32(off)] {s} ptr mem)
@@ -11112,31 +10745,34 @@
 		v.AddArg2(ptr, mem)
 		return true
 	}
-	// match: (MOVWstoreconst [c] {s} p x:(MOVWstoreconst [a] {s} p mem))
-	// cond: p.Op != OpSB && x.Uses == 1 && a.Off() + 4 == c.Off() && clobber(x)
-	// result: (MOVDstore [a.Off()] {s} p (MOVDconst [c.Val64()&0xffffffff | a.Val64()<<32]) mem)
+	return false
+}
+func rewriteValueS390X_OpS390XMOVWstoreidx(v *Value) bool {
+	v_3 := v.Args[3]
+	v_2 := v.Args[2]
+	v_1 := v.Args[1]
+	v_0 := v.Args[0]
+	// match: (MOVWstoreidx [off] {sym} ptr idx r:(MOVWBR x) mem)
+	// cond: r.Uses == 1
+	// result: (MOVWBRstoreidx [off] {sym} ptr idx x mem)
 	for {
-		c := auxIntToValAndOff(v.AuxInt)
-		s := auxToSym(v.Aux)
-		p := v_0
-		x := v_1
-		if x.Op != OpS390XMOVWstoreconst {
+		off := auxIntToInt32(v.AuxInt)
+		sym := auxToSym(v.Aux)
+		ptr := v_0
+		idx := v_1
+		r := v_2
+		if r.Op != OpS390XMOVWBR {
 			break
 		}
-		a := auxIntToValAndOff(x.AuxInt)
-		if auxToSym(x.Aux) != s {
+		x := r.Args[0]
+		mem := v_3
+		if !(r.Uses == 1) {
 			break
 		}
-		mem := x.Args[1]
-		if p != x.Args[0] || !(p.Op != OpSB && x.Uses == 1 && a.Off()+4 == c.Off() && clobber(x)) {
-			break
-		}
-		v.reset(OpS390XMOVDstore)
-		v.AuxInt = int32ToAuxInt(a.Off())
-		v.Aux = symToAux(s)
-		v0 := b.NewValue0(x.Pos, OpS390XMOVDconst, typ.UInt64)
-		v0.AuxInt = int64ToAuxInt(c.Val64()&0xffffffff | a.Val64()<<32)
-		v.AddArg3(p, v0, mem)
+		v.reset(OpS390XMOVWBRstoreidx)
+		v.AuxInt = int32ToAuxInt(off)
+		v.Aux = symToAux(sym)
+		v.AddArg4(ptr, idx, x, mem)
 		return true
 	}
 	return false
@@ -11630,7 +11266,6 @@
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
 	b := v.Block
-	typ := &b.Func.Config.Types
 	// match: (OR x (MOVDconst [c]))
 	// cond: isU32Bit(c)
 	// result: (ORconst [c] x)
@@ -11789,531 +11424,11 @@
 		}
 		break
 	}
-	// match: (OR x1:(MOVBZload [i1] {s} p mem) sh:(SLDconst [8] x0:(MOVBZload [i0] {s} p mem)))
-	// cond: i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0, x1, sh)
-	// result: @mergePoint(b,x0,x1) (MOVHZload [i0] {s} p mem)
-	for {
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			x1 := v_0
-			if x1.Op != OpS390XMOVBZload {
-				continue
-			}
-			i1 := auxIntToInt32(x1.AuxInt)
-			s := auxToSym(x1.Aux)
-			mem := x1.Args[1]
-			p := x1.Args[0]
-			sh := v_1
-			if sh.Op != OpS390XSLDconst || auxIntToUint8(sh.AuxInt) != 8 {
-				continue
-			}
-			x0 := sh.Args[0]
-			if x0.Op != OpS390XMOVBZload {
-				continue
-			}
-			i0 := auxIntToInt32(x0.AuxInt)
-			if auxToSym(x0.Aux) != s {
-				continue
-			}
-			_ = x0.Args[1]
-			if p != x0.Args[0] || mem != x0.Args[1] || !(i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0, x1, sh)) {
-				continue
-			}
-			b = mergePoint(b, x0, x1)
-			v0 := b.NewValue0(x0.Pos, OpS390XMOVHZload, typ.UInt16)
-			v.copyOf(v0)
-			v0.AuxInt = int32ToAuxInt(i0)
-			v0.Aux = symToAux(s)
-			v0.AddArg2(p, mem)
-			return true
-		}
-		break
-	}
-	// match: (OR x1:(MOVHZload [i1] {s} p mem) sh:(SLDconst [16] x0:(MOVHZload [i0] {s} p mem)))
-	// cond: i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0, x1, sh)
-	// result: @mergePoint(b,x0,x1) (MOVWZload [i0] {s} p mem)
-	for {
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			x1 := v_0
-			if x1.Op != OpS390XMOVHZload {
-				continue
-			}
-			i1 := auxIntToInt32(x1.AuxInt)
-			s := auxToSym(x1.Aux)
-			mem := x1.Args[1]
-			p := x1.Args[0]
-			sh := v_1
-			if sh.Op != OpS390XSLDconst || auxIntToUint8(sh.AuxInt) != 16 {
-				continue
-			}
-			x0 := sh.Args[0]
-			if x0.Op != OpS390XMOVHZload {
-				continue
-			}
-			i0 := auxIntToInt32(x0.AuxInt)
-			if auxToSym(x0.Aux) != s {
-				continue
-			}
-			_ = x0.Args[1]
-			if p != x0.Args[0] || mem != x0.Args[1] || !(i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0, x1, sh)) {
-				continue
-			}
-			b = mergePoint(b, x0, x1)
-			v0 := b.NewValue0(x0.Pos, OpS390XMOVWZload, typ.UInt32)
-			v.copyOf(v0)
-			v0.AuxInt = int32ToAuxInt(i0)
-			v0.Aux = symToAux(s)
-			v0.AddArg2(p, mem)
-			return true
-		}
-		break
-	}
-	// match: (OR x1:(MOVWZload [i1] {s} p mem) sh:(SLDconst [32] x0:(MOVWZload [i0] {s} p mem)))
-	// cond: i1 == i0+4 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0, x1, sh)
-	// result: @mergePoint(b,x0,x1) (MOVDload [i0] {s} p mem)
-	for {
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			x1 := v_0
-			if x1.Op != OpS390XMOVWZload {
-				continue
-			}
-			i1 := auxIntToInt32(x1.AuxInt)
-			s := auxToSym(x1.Aux)
-			mem := x1.Args[1]
-			p := x1.Args[0]
-			sh := v_1
-			if sh.Op != OpS390XSLDconst || auxIntToUint8(sh.AuxInt) != 32 {
-				continue
-			}
-			x0 := sh.Args[0]
-			if x0.Op != OpS390XMOVWZload {
-				continue
-			}
-			i0 := auxIntToInt32(x0.AuxInt)
-			if auxToSym(x0.Aux) != s {
-				continue
-			}
-			_ = x0.Args[1]
-			if p != x0.Args[0] || mem != x0.Args[1] || !(i1 == i0+4 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0, x1, sh)) {
-				continue
-			}
-			b = mergePoint(b, x0, x1)
-			v0 := b.NewValue0(x0.Pos, OpS390XMOVDload, typ.UInt64)
-			v.copyOf(v0)
-			v0.AuxInt = int32ToAuxInt(i0)
-			v0.Aux = symToAux(s)
-			v0.AddArg2(p, mem)
-			return true
-		}
-		break
-	}
-	// match: (OR s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem)) or:(OR s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem)) y))
-	// cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0, x1, s0, s1, or)
-	// result: @mergePoint(b,x0,x1,y) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y)
-	for {
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			s0 := v_0
-			if s0.Op != OpS390XSLDconst {
-				continue
-			}
-			j0 := auxIntToUint8(s0.AuxInt)
-			x0 := s0.Args[0]
-			if x0.Op != OpS390XMOVBZload {
-				continue
-			}
-			i0 := auxIntToInt32(x0.AuxInt)
-			s := auxToSym(x0.Aux)
-			mem := x0.Args[1]
-			p := x0.Args[0]
-			or := v_1
-			if or.Op != OpS390XOR {
-				continue
-			}
-			_ = or.Args[1]
-			or_0 := or.Args[0]
-			or_1 := or.Args[1]
-			for _i1 := 0; _i1 <= 1; _i1, or_0, or_1 = _i1+1, or_1, or_0 {
-				s1 := or_0
-				if s1.Op != OpS390XSLDconst {
-					continue
-				}
-				j1 := auxIntToUint8(s1.AuxInt)
-				x1 := s1.Args[0]
-				if x1.Op != OpS390XMOVBZload {
-					continue
-				}
-				i1 := auxIntToInt32(x1.AuxInt)
-				if auxToSym(x1.Aux) != s {
-					continue
-				}
-				_ = x1.Args[1]
-				if p != x1.Args[0] || mem != x1.Args[1] {
-					continue
-				}
-				y := or_1
-				if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0, x1, s0, s1, or)) {
-					continue
-				}
-				b = mergePoint(b, x0, x1, y)
-				v0 := b.NewValue0(x1.Pos, OpS390XOR, v.Type)
-				v.copyOf(v0)
-				v1 := b.NewValue0(x1.Pos, OpS390XSLDconst, v.Type)
-				v1.AuxInt = uint8ToAuxInt(j1)
-				v2 := b.NewValue0(x1.Pos, OpS390XMOVHZload, typ.UInt16)
-				v2.AuxInt = int32ToAuxInt(i0)
-				v2.Aux = symToAux(s)
-				v2.AddArg2(p, mem)
-				v1.AddArg(v2)
-				v0.AddArg2(v1, y)
-				return true
-			}
-		}
-		break
-	}
-	// match: (OR s0:(SLDconst [j0] x0:(MOVHZload [i0] {s} p mem)) or:(OR s1:(SLDconst [j1] x1:(MOVHZload [i1] {s} p mem)) y))
-	// cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0, x1, s0, s1, or)
-	// result: @mergePoint(b,x0,x1,y) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZload [i0] {s} p mem)) y)
-	for {
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			s0 := v_0
-			if s0.Op != OpS390XSLDconst {
-				continue
-			}
-			j0 := auxIntToUint8(s0.AuxInt)
-			x0 := s0.Args[0]
-			if x0.Op != OpS390XMOVHZload {
-				continue
-			}
-			i0 := auxIntToInt32(x0.AuxInt)
-			s := auxToSym(x0.Aux)
-			mem := x0.Args[1]
-			p := x0.Args[0]
-			or := v_1
-			if or.Op != OpS390XOR {
-				continue
-			}
-			_ = or.Args[1]
-			or_0 := or.Args[0]
-			or_1 := or.Args[1]
-			for _i1 := 0; _i1 <= 1; _i1, or_0, or_1 = _i1+1, or_1, or_0 {
-				s1 := or_0
-				if s1.Op != OpS390XSLDconst {
-					continue
-				}
-				j1 := auxIntToUint8(s1.AuxInt)
-				x1 := s1.Args[0]
-				if x1.Op != OpS390XMOVHZload {
-					continue
-				}
-				i1 := auxIntToInt32(x1.AuxInt)
-				if auxToSym(x1.Aux) != s {
-					continue
-				}
-				_ = x1.Args[1]
-				if p != x1.Args[0] || mem != x1.Args[1] {
-					continue
-				}
-				y := or_1
-				if !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0, x1, s0, s1, or)) {
-					continue
-				}
-				b = mergePoint(b, x0, x1, y)
-				v0 := b.NewValue0(x1.Pos, OpS390XOR, v.Type)
-				v.copyOf(v0)
-				v1 := b.NewValue0(x1.Pos, OpS390XSLDconst, v.Type)
-				v1.AuxInt = uint8ToAuxInt(j1)
-				v2 := b.NewValue0(x1.Pos, OpS390XMOVWZload, typ.UInt32)
-				v2.AuxInt = int32ToAuxInt(i0)
-				v2.Aux = symToAux(s)
-				v2.AddArg2(p, mem)
-				v1.AddArg(v2)
-				v0.AddArg2(v1, y)
-				return true
-			}
-		}
-		break
-	}
-	// match: (OR x0:(MOVBZload [i0] {s} p mem) sh:(SLDconst [8] x1:(MOVBZload [i1] {s} p mem)))
-	// cond: p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0, x1, sh)
-	// result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRload [i0] {s} p mem))
-	for {
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			x0 := v_0
-			if x0.Op != OpS390XMOVBZload {
-				continue
-			}
-			i0 := auxIntToInt32(x0.AuxInt)
-			s := auxToSym(x0.Aux)
-			mem := x0.Args[1]
-			p := x0.Args[0]
-			sh := v_1
-			if sh.Op != OpS390XSLDconst || auxIntToUint8(sh.AuxInt) != 8 {
-				continue
-			}
-			x1 := sh.Args[0]
-			if x1.Op != OpS390XMOVBZload {
-				continue
-			}
-			i1 := auxIntToInt32(x1.AuxInt)
-			if auxToSym(x1.Aux) != s {
-				continue
-			}
-			_ = x1.Args[1]
-			if p != x1.Args[0] || mem != x1.Args[1] || !(p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0, x1, sh)) {
-				continue
-			}
-			b = mergePoint(b, x0, x1)
-			v0 := b.NewValue0(x1.Pos, OpS390XMOVHZreg, typ.UInt64)
-			v.copyOf(v0)
-			v1 := b.NewValue0(x1.Pos, OpS390XMOVHBRload, typ.UInt16)
-			v1.AuxInt = int32ToAuxInt(i0)
-			v1.Aux = symToAux(s)
-			v1.AddArg2(p, mem)
-			v0.AddArg(v1)
-			return true
-		}
-		break
-	}
-	// match: (OR r0:(MOVHZreg x0:(MOVHBRload [i0] {s} p mem)) sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRload [i1] {s} p mem))))
-	// cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0, x1, r0, r1, sh)
-	// result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRload [i0] {s} p mem))
-	for {
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			r0 := v_0
-			if r0.Op != OpS390XMOVHZreg {
-				continue
-			}
-			x0 := r0.Args[0]
-			if x0.Op != OpS390XMOVHBRload {
-				continue
-			}
-			i0 := auxIntToInt32(x0.AuxInt)
-			s := auxToSym(x0.Aux)
-			mem := x0.Args[1]
-			p := x0.Args[0]
-			sh := v_1
-			if sh.Op != OpS390XSLDconst || auxIntToUint8(sh.AuxInt) != 16 {
-				continue
-			}
-			r1 := sh.Args[0]
-			if r1.Op != OpS390XMOVHZreg {
-				continue
-			}
-			x1 := r1.Args[0]
-			if x1.Op != OpS390XMOVHBRload {
-				continue
-			}
-			i1 := auxIntToInt32(x1.AuxInt)
-			if auxToSym(x1.Aux) != s {
-				continue
-			}
-			_ = x1.Args[1]
-			if p != x1.Args[0] || mem != x1.Args[1] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0, x1, r0, r1, sh)) {
-				continue
-			}
-			b = mergePoint(b, x0, x1)
-			v0 := b.NewValue0(x1.Pos, OpS390XMOVWZreg, typ.UInt64)
-			v.copyOf(v0)
-			v1 := b.NewValue0(x1.Pos, OpS390XMOVWBRload, typ.UInt32)
-			v1.AuxInt = int32ToAuxInt(i0)
-			v1.Aux = symToAux(s)
-			v1.AddArg2(p, mem)
-			v0.AddArg(v1)
-			return true
-		}
-		break
-	}
-	// match: (OR r0:(MOVWZreg x0:(MOVWBRload [i0] {s} p mem)) sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRload [i1] {s} p mem))))
-	// cond: i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0, x1, r0, r1, sh)
-	// result: @mergePoint(b,x0,x1) (MOVDBRload [i0] {s} p mem)
-	for {
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			r0 := v_0
-			if r0.Op != OpS390XMOVWZreg {
-				continue
-			}
-			x0 := r0.Args[0]
-			if x0.Op != OpS390XMOVWBRload {
-				continue
-			}
-			i0 := auxIntToInt32(x0.AuxInt)
-			s := auxToSym(x0.Aux)
-			mem := x0.Args[1]
-			p := x0.Args[0]
-			sh := v_1
-			if sh.Op != OpS390XSLDconst || auxIntToUint8(sh.AuxInt) != 32 {
-				continue
-			}
-			r1 := sh.Args[0]
-			if r1.Op != OpS390XMOVWZreg {
-				continue
-			}
-			x1 := r1.Args[0]
-			if x1.Op != OpS390XMOVWBRload {
-				continue
-			}
-			i1 := auxIntToInt32(x1.AuxInt)
-			if auxToSym(x1.Aux) != s {
-				continue
-			}
-			_ = x1.Args[1]
-			if p != x1.Args[0] || mem != x1.Args[1] || !(i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0, x1, r0, r1, sh)) {
-				continue
-			}
-			b = mergePoint(b, x0, x1)
-			v0 := b.NewValue0(x1.Pos, OpS390XMOVDBRload, typ.UInt64)
-			v.copyOf(v0)
-			v0.AuxInt = int32ToAuxInt(i0)
-			v0.Aux = symToAux(s)
-			v0.AddArg2(p, mem)
-			return true
-		}
-		break
-	}
-	// match: (OR s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem)) or:(OR s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem)) y))
-	// cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0, x1, s0, s1, or)
-	// result: @mergePoint(b,x0,x1,y) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y)
-	for {
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			s1 := v_0
-			if s1.Op != OpS390XSLDconst {
-				continue
-			}
-			j1 := auxIntToUint8(s1.AuxInt)
-			x1 := s1.Args[0]
-			if x1.Op != OpS390XMOVBZload {
-				continue
-			}
-			i1 := auxIntToInt32(x1.AuxInt)
-			s := auxToSym(x1.Aux)
-			mem := x1.Args[1]
-			p := x1.Args[0]
-			or := v_1
-			if or.Op != OpS390XOR {
-				continue
-			}
-			_ = or.Args[1]
-			or_0 := or.Args[0]
-			or_1 := or.Args[1]
-			for _i1 := 0; _i1 <= 1; _i1, or_0, or_1 = _i1+1, or_1, or_0 {
-				s0 := or_0
-				if s0.Op != OpS390XSLDconst {
-					continue
-				}
-				j0 := auxIntToUint8(s0.AuxInt)
-				x0 := s0.Args[0]
-				if x0.Op != OpS390XMOVBZload {
-					continue
-				}
-				i0 := auxIntToInt32(x0.AuxInt)
-				if auxToSym(x0.Aux) != s {
-					continue
-				}
-				_ = x0.Args[1]
-				if p != x0.Args[0] || mem != x0.Args[1] {
-					continue
-				}
-				y := or_1
-				if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0, x1, s0, s1, or)) {
-					continue
-				}
-				b = mergePoint(b, x0, x1, y)
-				v0 := b.NewValue0(x0.Pos, OpS390XOR, v.Type)
-				v.copyOf(v0)
-				v1 := b.NewValue0(x0.Pos, OpS390XSLDconst, v.Type)
-				v1.AuxInt = uint8ToAuxInt(j0)
-				v2 := b.NewValue0(x0.Pos, OpS390XMOVHZreg, typ.UInt64)
-				v3 := b.NewValue0(x0.Pos, OpS390XMOVHBRload, typ.UInt16)
-				v3.AuxInt = int32ToAuxInt(i0)
-				v3.Aux = symToAux(s)
-				v3.AddArg2(p, mem)
-				v2.AddArg(v3)
-				v1.AddArg(v2)
-				v0.AddArg2(v1, y)
-				return true
-			}
-		}
-		break
-	}
-	// match: (OR s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRload [i1] {s} p mem))) or:(OR s0:(SLDconst [j0] r0:(MOVHZreg x0:(MOVHBRload [i0] {s} p mem))) y))
-	// cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0, x1, r0, r1, s0, s1, or)
-	// result: @mergePoint(b,x0,x1,y) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRload [i0] {s} p mem))) y)
-	for {
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			s1 := v_0
-			if s1.Op != OpS390XSLDconst {
-				continue
-			}
-			j1 := auxIntToUint8(s1.AuxInt)
-			r1 := s1.Args[0]
-			if r1.Op != OpS390XMOVHZreg {
-				continue
-			}
-			x1 := r1.Args[0]
-			if x1.Op != OpS390XMOVHBRload {
-				continue
-			}
-			i1 := auxIntToInt32(x1.AuxInt)
-			s := auxToSym(x1.Aux)
-			mem := x1.Args[1]
-			p := x1.Args[0]
-			or := v_1
-			if or.Op != OpS390XOR {
-				continue
-			}
-			_ = or.Args[1]
-			or_0 := or.Args[0]
-			or_1 := or.Args[1]
-			for _i1 := 0; _i1 <= 1; _i1, or_0, or_1 = _i1+1, or_1, or_0 {
-				s0 := or_0
-				if s0.Op != OpS390XSLDconst {
-					continue
-				}
-				j0 := auxIntToUint8(s0.AuxInt)
-				r0 := s0.Args[0]
-				if r0.Op != OpS390XMOVHZreg {
-					continue
-				}
-				x0 := r0.Args[0]
-				if x0.Op != OpS390XMOVHBRload {
-					continue
-				}
-				i0 := auxIntToInt32(x0.AuxInt)
-				if auxToSym(x0.Aux) != s {
-					continue
-				}
-				_ = x0.Args[1]
-				if p != x0.Args[0] || mem != x0.Args[1] {
-					continue
-				}
-				y := or_1
-				if !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0, x1, r0, r1, s0, s1, or)) {
-					continue
-				}
-				b = mergePoint(b, x0, x1, y)
-				v0 := b.NewValue0(x0.Pos, OpS390XOR, v.Type)
-				v.copyOf(v0)
-				v1 := b.NewValue0(x0.Pos, OpS390XSLDconst, v.Type)
-				v1.AuxInt = uint8ToAuxInt(j0)
-				v2 := b.NewValue0(x0.Pos, OpS390XMOVWZreg, typ.UInt64)
-				v3 := b.NewValue0(x0.Pos, OpS390XMOVWBRload, typ.UInt32)
-				v3.AuxInt = int32ToAuxInt(i0)
-				v3.Aux = symToAux(s)
-				v3.AddArg2(p, mem)
-				v2.AddArg(v3)
-				v1.AddArg(v2)
-				v0.AddArg2(v1, y)
-				return true
-			}
-		}
-		break
-	}
 	return false
 }
 func rewriteValueS390X_OpS390XORW(v *Value) bool {
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
-	b := v.Block
-	typ := &b.Func.Config.Types
 	// match: (ORW x (MOVDconst [c]))
 	// result: (ORWconst [int32(c)] x)
 	for {
@@ -12394,300 +11509,6 @@
 		}
 		break
 	}
-	// match: (ORW x1:(MOVBZload [i1] {s} p mem) sh:(SLWconst [8] x0:(MOVBZload [i0] {s} p mem)))
-	// cond: i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0, x1, sh)
-	// result: @mergePoint(b,x0,x1) (MOVHZload [i0] {s} p mem)
-	for {
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			x1 := v_0
-			if x1.Op != OpS390XMOVBZload {
-				continue
-			}
-			i1 := auxIntToInt32(x1.AuxInt)
-			s := auxToSym(x1.Aux)
-			mem := x1.Args[1]
-			p := x1.Args[0]
-			sh := v_1
-			if sh.Op != OpS390XSLWconst || auxIntToUint8(sh.AuxInt) != 8 {
-				continue
-			}
-			x0 := sh.Args[0]
-			if x0.Op != OpS390XMOVBZload {
-				continue
-			}
-			i0 := auxIntToInt32(x0.AuxInt)
-			if auxToSym(x0.Aux) != s {
-				continue
-			}
-			_ = x0.Args[1]
-			if p != x0.Args[0] || mem != x0.Args[1] || !(i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0, x1, sh)) {
-				continue
-			}
-			b = mergePoint(b, x0, x1)
-			v0 := b.NewValue0(x0.Pos, OpS390XMOVHZload, typ.UInt16)
-			v.copyOf(v0)
-			v0.AuxInt = int32ToAuxInt(i0)
-			v0.Aux = symToAux(s)
-			v0.AddArg2(p, mem)
-			return true
-		}
-		break
-	}
-	// match: (ORW x1:(MOVHZload [i1] {s} p mem) sh:(SLWconst [16] x0:(MOVHZload [i0] {s} p mem)))
-	// cond: i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0, x1, sh)
-	// result: @mergePoint(b,x0,x1) (MOVWZload [i0] {s} p mem)
-	for {
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			x1 := v_0
-			if x1.Op != OpS390XMOVHZload {
-				continue
-			}
-			i1 := auxIntToInt32(x1.AuxInt)
-			s := auxToSym(x1.Aux)
-			mem := x1.Args[1]
-			p := x1.Args[0]
-			sh := v_1
-			if sh.Op != OpS390XSLWconst || auxIntToUint8(sh.AuxInt) != 16 {
-				continue
-			}
-			x0 := sh.Args[0]
-			if x0.Op != OpS390XMOVHZload {
-				continue
-			}
-			i0 := auxIntToInt32(x0.AuxInt)
-			if auxToSym(x0.Aux) != s {
-				continue
-			}
-			_ = x0.Args[1]
-			if p != x0.Args[0] || mem != x0.Args[1] || !(i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0, x1, sh)) {
-				continue
-			}
-			b = mergePoint(b, x0, x1)
-			v0 := b.NewValue0(x0.Pos, OpS390XMOVWZload, typ.UInt32)
-			v.copyOf(v0)
-			v0.AuxInt = int32ToAuxInt(i0)
-			v0.Aux = symToAux(s)
-			v0.AddArg2(p, mem)
-			return true
-		}
-		break
-	}
-	// match: (ORW s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem)) or:(ORW s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem)) y))
-	// cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0, x1, s0, s1, or)
-	// result: @mergePoint(b,x0,x1,y) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y)
-	for {
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			s0 := v_0
-			if s0.Op != OpS390XSLWconst {
-				continue
-			}
-			j0 := auxIntToUint8(s0.AuxInt)
-			x0 := s0.Args[0]
-			if x0.Op != OpS390XMOVBZload {
-				continue
-			}
-			i0 := auxIntToInt32(x0.AuxInt)
-			s := auxToSym(x0.Aux)
-			mem := x0.Args[1]
-			p := x0.Args[0]
-			or := v_1
-			if or.Op != OpS390XORW {
-				continue
-			}
-			_ = or.Args[1]
-			or_0 := or.Args[0]
-			or_1 := or.Args[1]
-			for _i1 := 0; _i1 <= 1; _i1, or_0, or_1 = _i1+1, or_1, or_0 {
-				s1 := or_0
-				if s1.Op != OpS390XSLWconst {
-					continue
-				}
-				j1 := auxIntToUint8(s1.AuxInt)
-				x1 := s1.Args[0]
-				if x1.Op != OpS390XMOVBZload {
-					continue
-				}
-				i1 := auxIntToInt32(x1.AuxInt)
-				if auxToSym(x1.Aux) != s {
-					continue
-				}
-				_ = x1.Args[1]
-				if p != x1.Args[0] || mem != x1.Args[1] {
-					continue
-				}
-				y := or_1
-				if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0, x1, s0, s1, or)) {
-					continue
-				}
-				b = mergePoint(b, x0, x1, y)
-				v0 := b.NewValue0(x1.Pos, OpS390XORW, v.Type)
-				v.copyOf(v0)
-				v1 := b.NewValue0(x1.Pos, OpS390XSLWconst, v.Type)
-				v1.AuxInt = uint8ToAuxInt(j1)
-				v2 := b.NewValue0(x1.Pos, OpS390XMOVHZload, typ.UInt16)
-				v2.AuxInt = int32ToAuxInt(i0)
-				v2.Aux = symToAux(s)
-				v2.AddArg2(p, mem)
-				v1.AddArg(v2)
-				v0.AddArg2(v1, y)
-				return true
-			}
-		}
-		break
-	}
-	// match: (ORW x0:(MOVBZload [i0] {s} p mem) sh:(SLWconst [8] x1:(MOVBZload [i1] {s} p mem)))
-	// cond: p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0, x1, sh)
-	// result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRload [i0] {s} p mem))
-	for {
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			x0 := v_0
-			if x0.Op != OpS390XMOVBZload {
-				continue
-			}
-			i0 := auxIntToInt32(x0.AuxInt)
-			s := auxToSym(x0.Aux)
-			mem := x0.Args[1]
-			p := x0.Args[0]
-			sh := v_1
-			if sh.Op != OpS390XSLWconst || auxIntToUint8(sh.AuxInt) != 8 {
-				continue
-			}
-			x1 := sh.Args[0]
-			if x1.Op != OpS390XMOVBZload {
-				continue
-			}
-			i1 := auxIntToInt32(x1.AuxInt)
-			if auxToSym(x1.Aux) != s {
-				continue
-			}
-			_ = x1.Args[1]
-			if p != x1.Args[0] || mem != x1.Args[1] || !(p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0, x1, sh)) {
-				continue
-			}
-			b = mergePoint(b, x0, x1)
-			v0 := b.NewValue0(x1.Pos, OpS390XMOVHZreg, typ.UInt64)
-			v.copyOf(v0)
-			v1 := b.NewValue0(x1.Pos, OpS390XMOVHBRload, typ.UInt16)
-			v1.AuxInt = int32ToAuxInt(i0)
-			v1.Aux = symToAux(s)
-			v1.AddArg2(p, mem)
-			v0.AddArg(v1)
-			return true
-		}
-		break
-	}
-	// match: (ORW r0:(MOVHZreg x0:(MOVHBRload [i0] {s} p mem)) sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRload [i1] {s} p mem))))
-	// cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0, x1, r0, r1, sh)
-	// result: @mergePoint(b,x0,x1) (MOVWBRload [i0] {s} p mem)
-	for {
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			r0 := v_0
-			if r0.Op != OpS390XMOVHZreg {
-				continue
-			}
-			x0 := r0.Args[0]
-			if x0.Op != OpS390XMOVHBRload {
-				continue
-			}
-			i0 := auxIntToInt32(x0.AuxInt)
-			s := auxToSym(x0.Aux)
-			mem := x0.Args[1]
-			p := x0.Args[0]
-			sh := v_1
-			if sh.Op != OpS390XSLWconst || auxIntToUint8(sh.AuxInt) != 16 {
-				continue
-			}
-			r1 := sh.Args[0]
-			if r1.Op != OpS390XMOVHZreg {
-				continue
-			}
-			x1 := r1.Args[0]
-			if x1.Op != OpS390XMOVHBRload {
-				continue
-			}
-			i1 := auxIntToInt32(x1.AuxInt)
-			if auxToSym(x1.Aux) != s {
-				continue
-			}
-			_ = x1.Args[1]
-			if p != x1.Args[0] || mem != x1.Args[1] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0, x1, r0, r1, sh)) {
-				continue
-			}
-			b = mergePoint(b, x0, x1)
-			v0 := b.NewValue0(x1.Pos, OpS390XMOVWBRload, typ.UInt32)
-			v.copyOf(v0)
-			v0.AuxInt = int32ToAuxInt(i0)
-			v0.Aux = symToAux(s)
-			v0.AddArg2(p, mem)
-			return true
-		}
-		break
-	}
-	// match: (ORW s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem)) or:(ORW s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem)) y))
-	// cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0, x1, s0, s1, or)
-	// result: @mergePoint(b,x0,x1,y) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y)
-	for {
-		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
-			s1 := v_0
-			if s1.Op != OpS390XSLWconst {
-				continue
-			}
-			j1 := auxIntToUint8(s1.AuxInt)
-			x1 := s1.Args[0]
-			if x1.Op != OpS390XMOVBZload {
-				continue
-			}
-			i1 := auxIntToInt32(x1.AuxInt)
-			s := auxToSym(x1.Aux)
-			mem := x1.Args[1]
-			p := x1.Args[0]
-			or := v_1
-			if or.Op != OpS390XORW {
-				continue
-			}
-			_ = or.Args[1]
-			or_0 := or.Args[0]
-			or_1 := or.Args[1]
-			for _i1 := 0; _i1 <= 1; _i1, or_0, or_1 = _i1+1, or_1, or_0 {
-				s0 := or_0
-				if s0.Op != OpS390XSLWconst {
-					continue
-				}
-				j0 := auxIntToUint8(s0.AuxInt)
-				x0 := s0.Args[0]
-				if x0.Op != OpS390XMOVBZload {
-					continue
-				}
-				i0 := auxIntToInt32(x0.AuxInt)
-				if auxToSym(x0.Aux) != s {
-					continue
-				}
-				_ = x0.Args[1]
-				if p != x0.Args[0] || mem != x0.Args[1] {
-					continue
-				}
-				y := or_1
-				if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0, x1, s0, s1, or)) {
-					continue
-				}
-				b = mergePoint(b, x0, x1, y)
-				v0 := b.NewValue0(x0.Pos, OpS390XORW, v.Type)
-				v.copyOf(v0)
-				v1 := b.NewValue0(x0.Pos, OpS390XSLWconst, v.Type)
-				v1.AuxInt = uint8ToAuxInt(j0)
-				v2 := b.NewValue0(x0.Pos, OpS390XMOVHZreg, typ.UInt64)
-				v3 := b.NewValue0(x0.Pos, OpS390XMOVHBRload, typ.UInt16)
-				v3.AuxInt = int32ToAuxInt(i0)
-				v3.Aux = symToAux(s)
-				v3.AddArg2(p, mem)
-				v2.AddArg(v3)
-				v1.AddArg(v2)
-				v0.AddArg2(v1, y)
-				return true
-			}
-		}
-		break
-	}
 	return false
 }
 func rewriteValueS390X_OpS390XORWconst(v *Value) bool {
@@ -15619,14 +14440,14 @@
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
 	// match: (Store {t} ptr val mem)
-	// cond: t.Size() == 8 && is64BitFloat(val.Type)
+	// cond: t.Size() == 8 && t.IsFloat()
 	// result: (FMOVDstore ptr val mem)
 	for {
 		t := auxToType(v.Aux)
 		ptr := v_0
 		val := v_1
 		mem := v_2
-		if !(t.Size() == 8 && is64BitFloat(val.Type)) {
+		if !(t.Size() == 8 && t.IsFloat()) {
 			break
 		}
 		v.reset(OpS390XFMOVDstore)
@@ -15634,14 +14455,14 @@
 		return true
 	}
 	// match: (Store {t} ptr val mem)
-	// cond: t.Size() == 4 && is32BitFloat(val.Type)
+	// cond: t.Size() == 4 && t.IsFloat()
 	// result: (FMOVSstore ptr val mem)
 	for {
 		t := auxToType(v.Aux)
 		ptr := v_0
 		val := v_1
 		mem := v_2
-		if !(t.Size() == 4 && is32BitFloat(val.Type)) {
+		if !(t.Size() == 4 && t.IsFloat()) {
 			break
 		}
 		v.reset(OpS390XFMOVSstore)
@@ -15649,14 +14470,14 @@
 		return true
 	}
 	// match: (Store {t} ptr val mem)
-	// cond: t.Size() == 8
+	// cond: t.Size() == 8 && !t.IsFloat()
 	// result: (MOVDstore ptr val mem)
 	for {
 		t := auxToType(v.Aux)
 		ptr := v_0
 		val := v_1
 		mem := v_2
-		if !(t.Size() == 8) {
+		if !(t.Size() == 8 && !t.IsFloat()) {
 			break
 		}
 		v.reset(OpS390XMOVDstore)
@@ -15664,14 +14485,14 @@
 		return true
 	}
 	// match: (Store {t} ptr val mem)
-	// cond: t.Size() == 4
+	// cond: t.Size() == 4 && !t.IsFloat()
 	// result: (MOVWstore ptr val mem)
 	for {
 		t := auxToType(v.Aux)
 		ptr := v_0
 		val := v_1
 		mem := v_2
-		if !(t.Size() == 4) {
+		if !(t.Size() == 4 && !t.IsFloat()) {
 			break
 		}
 		v.reset(OpS390XMOVWstore)
diff --git a/src/cmd/compile/internal/ssa/rewriteWasm.go b/src/cmd/compile/internal/ssa/rewriteWasm.go
index a5be792..6f83aea 100644
--- a/src/cmd/compile/internal/ssa/rewriteWasm.go
+++ b/src/cmd/compile/internal/ssa/rewriteWasm.go
@@ -1,5 +1,4 @@
-// Code generated from _gen/Wasm.rules; DO NOT EDIT.
-// generated with: cd _gen; go run .
+// Code generated from _gen/Wasm.rules using 'go generate'; DO NOT EDIT.
 
 package ssa
 
@@ -1488,17 +1487,44 @@
 	return false
 }
 func rewriteValueWasm_OpLocalAddr(v *Value) bool {
+	v_1 := v.Args[1]
 	v_0 := v.Args[0]
-	// match: (LocalAddr {sym} base _)
-	// result: (LoweredAddr {sym} base)
+	b := v.Block
+	typ := &b.Func.Config.Types
+	// match: (LocalAddr <t> {sym} base mem)
+	// cond: t.Elem().HasPointers()
+	// result: (LoweredAddr {sym} (SPanchored base mem))
 	for {
+		t := v.Type
 		sym := auxToSym(v.Aux)
 		base := v_0
+		mem := v_1
+		if !(t.Elem().HasPointers()) {
+			break
+		}
+		v.reset(OpWasmLoweredAddr)
+		v.Aux = symToAux(sym)
+		v0 := b.NewValue0(v.Pos, OpSPanchored, typ.Uintptr)
+		v0.AddArg2(base, mem)
+		v.AddArg(v0)
+		return true
+	}
+	// match: (LocalAddr <t> {sym} base _)
+	// cond: !t.Elem().HasPointers()
+	// result: (LoweredAddr {sym} base)
+	for {
+		t := v.Type
+		sym := auxToSym(v.Aux)
+		base := v_0
+		if !(!t.Elem().HasPointers()) {
+			break
+		}
 		v.reset(OpWasmLoweredAddr)
 		v.Aux = symToAux(sym)
 		v.AddArg(base)
 		return true
 	}
+	return false
 }
 func rewriteValueWasm_OpLsh16x16(v *Value) bool {
 	v_1 := v.Args[1]
@@ -3594,14 +3620,19 @@
 		v.AddArg2(y, v0)
 		return true
 	}
-	// match: (I64Add x (I64Const [y]))
+	// match: (I64Add x (I64Const <t> [y]))
+	// cond: !t.IsPtr()
 	// result: (I64AddConst [y] x)
 	for {
 		x := v_0
 		if v_1.Op != OpWasmI64Const {
 			break
 		}
+		t := v_1.Type
 		y := auxIntToInt64(v_1.AuxInt)
+		if !(!t.IsPtr()) {
+			break
+		}
 		v.reset(OpWasmI64AddConst)
 		v.AuxInt = int64ToAuxInt(y)
 		v.AddArg(x)
diff --git a/src/cmd/compile/internal/ssa/rewritedec.go b/src/cmd/compile/internal/ssa/rewritedec.go
index 1b92fb8..5c04708 100644
--- a/src/cmd/compile/internal/ssa/rewritedec.go
+++ b/src/cmd/compile/internal/ssa/rewritedec.go
@@ -1,5 +1,4 @@
-// Code generated from _gen/dec.rules; DO NOT EDIT.
-// generated with: cd _gen; go run .
+// Code generated from _gen/dec.rules using 'go generate'; DO NOT EDIT.
 
 package ssa
 
diff --git a/src/cmd/compile/internal/ssa/rewritedec64.go b/src/cmd/compile/internal/ssa/rewritedec64.go
index 26036b2..901dc75 100644
--- a/src/cmd/compile/internal/ssa/rewritedec64.go
+++ b/src/cmd/compile/internal/ssa/rewritedec64.go
@@ -1,5 +1,4 @@
-// Code generated from _gen/dec64.rules; DO NOT EDIT.
-// generated with: cd _gen; go run .
+// Code generated from _gen/dec64.rules using 'go generate'; DO NOT EDIT.
 
 package ssa
 
diff --git a/src/cmd/compile/internal/ssa/rewritegeneric.go b/src/cmd/compile/internal/ssa/rewritegeneric.go
index f8c64e6..e5bd8bc 100644
--- a/src/cmd/compile/internal/ssa/rewritegeneric.go
+++ b/src/cmd/compile/internal/ssa/rewritegeneric.go
@@ -1,10 +1,11 @@
-// Code generated from _gen/generic.rules; DO NOT EDIT.
-// generated with: cd _gen; go run .
+// Code generated from _gen/generic.rules using 'go generate'; DO NOT EDIT.
 
 package ssa
 
 import "math"
+import "cmd/internal/obj"
 import "cmd/compile/internal/types"
+import "cmd/compile/internal/ir"
 
 func rewriteValuegeneric(v *Value) bool {
 	switch v.Op {
@@ -560,6 +561,33 @@
 		}
 		break
 	}
+	// match: (Add16 (Sub16 x t) (Add16 t y))
+	// result: (Add16 x y)
+	for {
+		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
+			if v_0.Op != OpSub16 {
+				continue
+			}
+			t := v_0.Args[1]
+			x := v_0.Args[0]
+			if v_1.Op != OpAdd16 {
+				continue
+			}
+			_ = v_1.Args[1]
+			v_1_0 := v_1.Args[0]
+			v_1_1 := v_1.Args[1]
+			for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
+				if t != v_1_0 {
+					continue
+				}
+				y := v_1_1
+				v.reset(OpAdd16)
+				v.AddArg2(x, y)
+				return true
+			}
+		}
+		break
+	}
 	// match: (Add16 (Const16 [1]) (Com16 x))
 	// result: (Neg16 x)
 	for {
@@ -1146,6 +1174,33 @@
 		}
 		break
 	}
+	// match: (Add32 (Sub32 x t) (Add32 t y))
+	// result: (Add32 x y)
+	for {
+		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
+			if v_0.Op != OpSub32 {
+				continue
+			}
+			t := v_0.Args[1]
+			x := v_0.Args[0]
+			if v_1.Op != OpAdd32 {
+				continue
+			}
+			_ = v_1.Args[1]
+			v_1_0 := v_1.Args[0]
+			v_1_1 := v_1.Args[1]
+			for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
+				if t != v_1_0 {
+					continue
+				}
+				y := v_1_1
+				v.reset(OpAdd32)
+				v.AddArg2(x, y)
+				return true
+			}
+		}
+		break
+	}
 	// match: (Add32 (Const32 [1]) (Com32 x))
 	// result: (Neg32 x)
 	for {
@@ -1759,6 +1814,33 @@
 		}
 		break
 	}
+	// match: (Add64 (Sub64 x t) (Add64 t y))
+	// result: (Add64 x y)
+	for {
+		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
+			if v_0.Op != OpSub64 {
+				continue
+			}
+			t := v_0.Args[1]
+			x := v_0.Args[0]
+			if v_1.Op != OpAdd64 {
+				continue
+			}
+			_ = v_1.Args[1]
+			v_1_0 := v_1.Args[0]
+			v_1_1 := v_1.Args[1]
+			for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
+				if t != v_1_0 {
+					continue
+				}
+				y := v_1_1
+				v.reset(OpAdd64)
+				v.AddArg2(x, y)
+				return true
+			}
+		}
+		break
+	}
 	// match: (Add64 (Const64 [1]) (Com64 x))
 	// result: (Neg64 x)
 	for {
@@ -2372,6 +2454,33 @@
 		}
 		break
 	}
+	// match: (Add8 (Sub8 x t) (Add8 t y))
+	// result: (Add8 x y)
+	for {
+		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
+			if v_0.Op != OpSub8 {
+				continue
+			}
+			t := v_0.Args[1]
+			x := v_0.Args[0]
+			if v_1.Op != OpAdd8 {
+				continue
+			}
+			_ = v_1.Args[1]
+			v_1_0 := v_1.Args[0]
+			v_1_1 := v_1.Args[1]
+			for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
+				if t != v_1_0 {
+					continue
+				}
+				y := v_1_1
+				v.reset(OpAdd8)
+				v.AddArg2(x, y)
+				return true
+			}
+		}
+		break
+	}
 	// match: (Add8 (Const8 [1]) (Com8 x))
 	// result: (Neg8 x)
 	for {
@@ -2912,6 +3021,27 @@
 		}
 		break
 	}
+	// match: (And16 <t> (Com16 x) (Com16 y))
+	// result: (Com16 (Or16 <t> x y))
+	for {
+		t := v.Type
+		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
+			if v_0.Op != OpCom16 {
+				continue
+			}
+			x := v_0.Args[0]
+			if v_1.Op != OpCom16 {
+				continue
+			}
+			y := v_1.Args[0]
+			v.reset(OpCom16)
+			v0 := b.NewValue0(v.Pos, OpOr16, t)
+			v0.AddArg2(x, y)
+			v.AddArg(v0)
+			return true
+		}
+		break
+	}
 	// match: (And16 (Const16 [m]) (Rsh16Ux64 _ (Const64 [c])))
 	// cond: c >= int64(16-ntz16(m))
 	// result: (Const16 [0])
@@ -3127,6 +3257,27 @@
 		}
 		break
 	}
+	// match: (And32 <t> (Com32 x) (Com32 y))
+	// result: (Com32 (Or32 <t> x y))
+	for {
+		t := v.Type
+		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
+			if v_0.Op != OpCom32 {
+				continue
+			}
+			x := v_0.Args[0]
+			if v_1.Op != OpCom32 {
+				continue
+			}
+			y := v_1.Args[0]
+			v.reset(OpCom32)
+			v0 := b.NewValue0(v.Pos, OpOr32, t)
+			v0.AddArg2(x, y)
+			v.AddArg(v0)
+			return true
+		}
+		break
+	}
 	// match: (And32 (Const32 [m]) (Rsh32Ux64 _ (Const64 [c])))
 	// cond: c >= int64(32-ntz32(m))
 	// result: (Const32 [0])
@@ -3342,6 +3493,27 @@
 		}
 		break
 	}
+	// match: (And64 <t> (Com64 x) (Com64 y))
+	// result: (Com64 (Or64 <t> x y))
+	for {
+		t := v.Type
+		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
+			if v_0.Op != OpCom64 {
+				continue
+			}
+			x := v_0.Args[0]
+			if v_1.Op != OpCom64 {
+				continue
+			}
+			y := v_1.Args[0]
+			v.reset(OpCom64)
+			v0 := b.NewValue0(v.Pos, OpOr64, t)
+			v0.AddArg2(x, y)
+			v.AddArg(v0)
+			return true
+		}
+		break
+	}
 	// match: (And64 (Const64 [m]) (Rsh64Ux64 _ (Const64 [c])))
 	// cond: c >= int64(64-ntz64(m))
 	// result: (Const64 [0])
@@ -3557,6 +3729,27 @@
 		}
 		break
 	}
+	// match: (And8 <t> (Com8 x) (Com8 y))
+	// result: (Com8 (Or8 <t> x y))
+	for {
+		t := v.Type
+		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
+			if v_0.Op != OpCom8 {
+				continue
+			}
+			x := v_0.Args[0]
+			if v_1.Op != OpCom8 {
+				continue
+			}
+			y := v_1.Args[0]
+			v.reset(OpCom8)
+			v0 := b.NewValue0(v.Pos, OpOr8, t)
+			v0.AddArg2(x, y)
+			v.AddArg(v0)
+			return true
+		}
+		break
+	}
 	// match: (And8 (Const8 [m]) (Rsh8Ux64 _ (Const64 [c])))
 	// cond: c >= int64(8-ntz8(m))
 	// result: (Const8 [0])
@@ -10009,6 +10202,28 @@
 		}
 		break
 	}
+	// match: (EqPtr (Convert (Addr {x} _) _) (Addr {y} _))
+	// result: (ConstBool [x==y])
+	for {
+		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
+			if v_0.Op != OpConvert {
+				continue
+			}
+			v_0_0 := v_0.Args[0]
+			if v_0_0.Op != OpAddr {
+				continue
+			}
+			x := auxToSym(v_0_0.Aux)
+			if v_1.Op != OpAddr {
+				continue
+			}
+			y := auxToSym(v_1.Aux)
+			v.reset(OpConstBool)
+			v.AuxInt = boolToAuxInt(x == y)
+			return true
+		}
+		break
+	}
 	// match: (EqPtr (LocalAddr _ _) (Addr _))
 	// result: (ConstBool [false])
 	for {
@@ -10213,41 +10428,22 @@
 	return false
 }
 func rewriteValuegeneric_OpInterLECall(v *Value) bool {
-	// match: (InterLECall [argsize] {auxCall} (Load (OffPtr [off] (ITab (IMake (Addr {itab} (SB)) _))) _) ___)
-	// cond: devirtLESym(v, auxCall, itab, off) != nil
-	// result: devirtLECall(v, devirtLESym(v, auxCall, itab, off))
+	// match: (InterLECall [argsize] {auxCall} (Addr {fn} (SB)) ___)
+	// result: devirtLECall(v, fn.(*obj.LSym))
 	for {
 		if len(v.Args) < 1 {
 			break
 		}
-		auxCall := auxToCall(v.Aux)
 		v_0 := v.Args[0]
-		if v_0.Op != OpLoad {
+		if v_0.Op != OpAddr {
 			break
 		}
+		fn := auxToSym(v_0.Aux)
 		v_0_0 := v_0.Args[0]
-		if v_0_0.Op != OpOffPtr {
+		if v_0_0.Op != OpSB {
 			break
 		}
-		off := auxIntToInt64(v_0_0.AuxInt)
-		v_0_0_0 := v_0_0.Args[0]
-		if v_0_0_0.Op != OpITab {
-			break
-		}
-		v_0_0_0_0 := v_0_0_0.Args[0]
-		if v_0_0_0_0.Op != OpIMake {
-			break
-		}
-		v_0_0_0_0_0 := v_0_0_0_0.Args[0]
-		if v_0_0_0_0_0.Op != OpAddr {
-			break
-		}
-		itab := auxToSym(v_0_0_0_0_0.Aux)
-		v_0_0_0_0_0_0 := v_0_0_0_0_0.Args[0]
-		if v_0_0_0_0_0_0.Op != OpSB || !(devirtLESym(v, auxCall, itab, off) != nil) {
-			break
-		}
-		v.copyOf(devirtLECall(v, devirtLESym(v, auxCall, itab, off)))
+		v.copyOf(devirtLECall(v, fn.(*obj.LSym)))
 		return true
 	}
 	return false
@@ -10978,7 +11174,7 @@
 		v.AuxInt = boolToAuxInt(c != 0)
 		return true
 	}
-	// match: (IsNonNil (Addr _))
+	// match: (IsNonNil (Addr _) )
 	// result: (ConstBool [true])
 	for {
 		if v_0.Op != OpAddr {
@@ -10988,6 +11184,20 @@
 		v.AuxInt = boolToAuxInt(true)
 		return true
 	}
+	// match: (IsNonNil (Convert (Addr _) _))
+	// result: (ConstBool [true])
+	for {
+		if v_0.Op != OpConvert {
+			break
+		}
+		v_0_0 := v_0.Args[0]
+		if v_0_0.Op != OpAddr {
+			break
+		}
+		v.reset(OpConstBool)
+		v.AuxInt = boolToAuxInt(true)
+		return true
+	}
 	// match: (IsNonNil (LocalAddr _ _))
 	// result: (ConstBool [true])
 	for {
@@ -11137,6 +11347,7 @@
 func rewriteValuegeneric_OpLeq16(v *Value) bool {
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
+	b := v.Block
 	// match: (Leq16 (Const16 [c]) (Const16 [d]))
 	// result: (ConstBool [c <= d])
 	for {
@@ -11196,11 +11407,46 @@
 		v.AuxInt = boolToAuxInt(true)
 		return true
 	}
+	// match: (Leq16 x (Const16 <t> [-1]))
+	// result: (Less16 x (Const16 <t> [0]))
+	for {
+		x := v_0
+		if v_1.Op != OpConst16 {
+			break
+		}
+		t := v_1.Type
+		if auxIntToInt16(v_1.AuxInt) != -1 {
+			break
+		}
+		v.reset(OpLess16)
+		v0 := b.NewValue0(v.Pos, OpConst16, t)
+		v0.AuxInt = int16ToAuxInt(0)
+		v.AddArg2(x, v0)
+		return true
+	}
+	// match: (Leq16 (Const16 <t> [1]) x)
+	// result: (Less16 (Const16 <t> [0]) x)
+	for {
+		if v_0.Op != OpConst16 {
+			break
+		}
+		t := v_0.Type
+		if auxIntToInt16(v_0.AuxInt) != 1 {
+			break
+		}
+		x := v_1
+		v.reset(OpLess16)
+		v0 := b.NewValue0(v.Pos, OpConst16, t)
+		v0.AuxInt = int16ToAuxInt(0)
+		v.AddArg2(v0, x)
+		return true
+	}
 	return false
 }
 func rewriteValuegeneric_OpLeq16U(v *Value) bool {
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
+	b := v.Block
 	// match: (Leq16U (Const16 [c]) (Const16 [d]))
 	// result: (ConstBool [uint16(c) <= uint16(d)])
 	for {
@@ -11216,6 +11462,23 @@
 		v.AuxInt = boolToAuxInt(uint16(c) <= uint16(d))
 		return true
 	}
+	// match: (Leq16U (Const16 <t> [1]) x)
+	// result: (Neq16 (Const16 <t> [0]) x)
+	for {
+		if v_0.Op != OpConst16 {
+			break
+		}
+		t := v_0.Type
+		if auxIntToInt16(v_0.AuxInt) != 1 {
+			break
+		}
+		x := v_1
+		v.reset(OpNeq16)
+		v0 := b.NewValue0(v.Pos, OpConst16, t)
+		v0.AuxInt = int16ToAuxInt(0)
+		v.AddArg2(v0, x)
+		return true
+	}
 	// match: (Leq16U (Const16 [0]) _)
 	// result: (ConstBool [true])
 	for {
@@ -11231,6 +11494,7 @@
 func rewriteValuegeneric_OpLeq32(v *Value) bool {
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
+	b := v.Block
 	// match: (Leq32 (Const32 [c]) (Const32 [d]))
 	// result: (ConstBool [c <= d])
 	for {
@@ -11290,6 +11554,40 @@
 		v.AuxInt = boolToAuxInt(true)
 		return true
 	}
+	// match: (Leq32 x (Const32 <t> [-1]))
+	// result: (Less32 x (Const32 <t> [0]))
+	for {
+		x := v_0
+		if v_1.Op != OpConst32 {
+			break
+		}
+		t := v_1.Type
+		if auxIntToInt32(v_1.AuxInt) != -1 {
+			break
+		}
+		v.reset(OpLess32)
+		v0 := b.NewValue0(v.Pos, OpConst32, t)
+		v0.AuxInt = int32ToAuxInt(0)
+		v.AddArg2(x, v0)
+		return true
+	}
+	// match: (Leq32 (Const32 <t> [1]) x)
+	// result: (Less32 (Const32 <t> [0]) x)
+	for {
+		if v_0.Op != OpConst32 {
+			break
+		}
+		t := v_0.Type
+		if auxIntToInt32(v_0.AuxInt) != 1 {
+			break
+		}
+		x := v_1
+		v.reset(OpLess32)
+		v0 := b.NewValue0(v.Pos, OpConst32, t)
+		v0.AuxInt = int32ToAuxInt(0)
+		v.AddArg2(v0, x)
+		return true
+	}
 	return false
 }
 func rewriteValuegeneric_OpLeq32F(v *Value) bool {
@@ -11315,6 +11613,7 @@
 func rewriteValuegeneric_OpLeq32U(v *Value) bool {
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
+	b := v.Block
 	// match: (Leq32U (Const32 [c]) (Const32 [d]))
 	// result: (ConstBool [uint32(c) <= uint32(d)])
 	for {
@@ -11330,6 +11629,23 @@
 		v.AuxInt = boolToAuxInt(uint32(c) <= uint32(d))
 		return true
 	}
+	// match: (Leq32U (Const32 <t> [1]) x)
+	// result: (Neq32 (Const32 <t> [0]) x)
+	for {
+		if v_0.Op != OpConst32 {
+			break
+		}
+		t := v_0.Type
+		if auxIntToInt32(v_0.AuxInt) != 1 {
+			break
+		}
+		x := v_1
+		v.reset(OpNeq32)
+		v0 := b.NewValue0(v.Pos, OpConst32, t)
+		v0.AuxInt = int32ToAuxInt(0)
+		v.AddArg2(v0, x)
+		return true
+	}
 	// match: (Leq32U (Const32 [0]) _)
 	// result: (ConstBool [true])
 	for {
@@ -11345,6 +11661,7 @@
 func rewriteValuegeneric_OpLeq64(v *Value) bool {
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
+	b := v.Block
 	// match: (Leq64 (Const64 [c]) (Const64 [d]))
 	// result: (ConstBool [c <= d])
 	for {
@@ -11404,6 +11721,40 @@
 		v.AuxInt = boolToAuxInt(true)
 		return true
 	}
+	// match: (Leq64 x (Const64 <t> [-1]))
+	// result: (Less64 x (Const64 <t> [0]))
+	for {
+		x := v_0
+		if v_1.Op != OpConst64 {
+			break
+		}
+		t := v_1.Type
+		if auxIntToInt64(v_1.AuxInt) != -1 {
+			break
+		}
+		v.reset(OpLess64)
+		v0 := b.NewValue0(v.Pos, OpConst64, t)
+		v0.AuxInt = int64ToAuxInt(0)
+		v.AddArg2(x, v0)
+		return true
+	}
+	// match: (Leq64 (Const64 <t> [1]) x)
+	// result: (Less64 (Const64 <t> [0]) x)
+	for {
+		if v_0.Op != OpConst64 {
+			break
+		}
+		t := v_0.Type
+		if auxIntToInt64(v_0.AuxInt) != 1 {
+			break
+		}
+		x := v_1
+		v.reset(OpLess64)
+		v0 := b.NewValue0(v.Pos, OpConst64, t)
+		v0.AuxInt = int64ToAuxInt(0)
+		v.AddArg2(v0, x)
+		return true
+	}
 	return false
 }
 func rewriteValuegeneric_OpLeq64F(v *Value) bool {
@@ -11429,6 +11780,7 @@
 func rewriteValuegeneric_OpLeq64U(v *Value) bool {
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
+	b := v.Block
 	// match: (Leq64U (Const64 [c]) (Const64 [d]))
 	// result: (ConstBool [uint64(c) <= uint64(d)])
 	for {
@@ -11444,6 +11796,23 @@
 		v.AuxInt = boolToAuxInt(uint64(c) <= uint64(d))
 		return true
 	}
+	// match: (Leq64U (Const64 <t> [1]) x)
+	// result: (Neq64 (Const64 <t> [0]) x)
+	for {
+		if v_0.Op != OpConst64 {
+			break
+		}
+		t := v_0.Type
+		if auxIntToInt64(v_0.AuxInt) != 1 {
+			break
+		}
+		x := v_1
+		v.reset(OpNeq64)
+		v0 := b.NewValue0(v.Pos, OpConst64, t)
+		v0.AuxInt = int64ToAuxInt(0)
+		v.AddArg2(v0, x)
+		return true
+	}
 	// match: (Leq64U (Const64 [0]) _)
 	// result: (ConstBool [true])
 	for {
@@ -11459,6 +11828,7 @@
 func rewriteValuegeneric_OpLeq8(v *Value) bool {
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
+	b := v.Block
 	// match: (Leq8 (Const8 [c]) (Const8 [d]))
 	// result: (ConstBool [c <= d])
 	for {
@@ -11518,11 +11888,46 @@
 		v.AuxInt = boolToAuxInt(true)
 		return true
 	}
+	// match: (Leq8 x (Const8 <t> [-1]))
+	// result: (Less8 x (Const8 <t> [0]))
+	for {
+		x := v_0
+		if v_1.Op != OpConst8 {
+			break
+		}
+		t := v_1.Type
+		if auxIntToInt8(v_1.AuxInt) != -1 {
+			break
+		}
+		v.reset(OpLess8)
+		v0 := b.NewValue0(v.Pos, OpConst8, t)
+		v0.AuxInt = int8ToAuxInt(0)
+		v.AddArg2(x, v0)
+		return true
+	}
+	// match: (Leq8 (Const8 <t> [1]) x)
+	// result: (Less8 (Const8 <t> [0]) x)
+	for {
+		if v_0.Op != OpConst8 {
+			break
+		}
+		t := v_0.Type
+		if auxIntToInt8(v_0.AuxInt) != 1 {
+			break
+		}
+		x := v_1
+		v.reset(OpLess8)
+		v0 := b.NewValue0(v.Pos, OpConst8, t)
+		v0.AuxInt = int8ToAuxInt(0)
+		v.AddArg2(v0, x)
+		return true
+	}
 	return false
 }
 func rewriteValuegeneric_OpLeq8U(v *Value) bool {
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
+	b := v.Block
 	// match: (Leq8U (Const8 [c]) (Const8 [d]))
 	// result: (ConstBool [ uint8(c) <= uint8(d)])
 	for {
@@ -11538,6 +11943,23 @@
 		v.AuxInt = boolToAuxInt(uint8(c) <= uint8(d))
 		return true
 	}
+	// match: (Leq8U (Const8 <t> [1]) x)
+	// result: (Neq8 (Const8 <t> [0]) x)
+	for {
+		if v_0.Op != OpConst8 {
+			break
+		}
+		t := v_0.Type
+		if auxIntToInt8(v_0.AuxInt) != 1 {
+			break
+		}
+		x := v_1
+		v.reset(OpNeq8)
+		v0 := b.NewValue0(v.Pos, OpConst8, t)
+		v0.AuxInt = int8ToAuxInt(0)
+		v.AddArg2(v0, x)
+		return true
+	}
 	// match: (Leq8U (Const8 [0]) _)
 	// result: (ConstBool [true])
 	for {
@@ -11608,11 +12030,46 @@
 		v.AddArg2(v0, x)
 		return true
 	}
+	// match: (Less16 x (Const16 <t> [1]))
+	// result: (Leq16 x (Const16 <t> [0]))
+	for {
+		x := v_0
+		if v_1.Op != OpConst16 {
+			break
+		}
+		t := v_1.Type
+		if auxIntToInt16(v_1.AuxInt) != 1 {
+			break
+		}
+		v.reset(OpLeq16)
+		v0 := b.NewValue0(v.Pos, OpConst16, t)
+		v0.AuxInt = int16ToAuxInt(0)
+		v.AddArg2(x, v0)
+		return true
+	}
+	// match: (Less16 (Const16 <t> [-1]) x)
+	// result: (Leq16 (Const16 <t> [0]) x)
+	for {
+		if v_0.Op != OpConst16 {
+			break
+		}
+		t := v_0.Type
+		if auxIntToInt16(v_0.AuxInt) != -1 {
+			break
+		}
+		x := v_1
+		v.reset(OpLeq16)
+		v0 := b.NewValue0(v.Pos, OpConst16, t)
+		v0.AuxInt = int16ToAuxInt(0)
+		v.AddArg2(v0, x)
+		return true
+	}
 	return false
 }
 func rewriteValuegeneric_OpLess16U(v *Value) bool {
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
+	b := v.Block
 	// match: (Less16U (Const16 [c]) (Const16 [d]))
 	// result: (ConstBool [uint16(c) < uint16(d)])
 	for {
@@ -11628,6 +12085,23 @@
 		v.AuxInt = boolToAuxInt(uint16(c) < uint16(d))
 		return true
 	}
+	// match: (Less16U x (Const16 <t> [1]))
+	// result: (Eq16 (Const16 <t> [0]) x)
+	for {
+		x := v_0
+		if v_1.Op != OpConst16 {
+			break
+		}
+		t := v_1.Type
+		if auxIntToInt16(v_1.AuxInt) != 1 {
+			break
+		}
+		v.reset(OpEq16)
+		v0 := b.NewValue0(v.Pos, OpConst16, t)
+		v0.AuxInt = int16ToAuxInt(0)
+		v.AddArg2(v0, x)
+		return true
+	}
 	// match: (Less16U _ (Const16 [0]))
 	// result: (ConstBool [false])
 	for {
@@ -11698,6 +12172,40 @@
 		v.AddArg2(v0, x)
 		return true
 	}
+	// match: (Less32 x (Const32 <t> [1]))
+	// result: (Leq32 x (Const32 <t> [0]))
+	for {
+		x := v_0
+		if v_1.Op != OpConst32 {
+			break
+		}
+		t := v_1.Type
+		if auxIntToInt32(v_1.AuxInt) != 1 {
+			break
+		}
+		v.reset(OpLeq32)
+		v0 := b.NewValue0(v.Pos, OpConst32, t)
+		v0.AuxInt = int32ToAuxInt(0)
+		v.AddArg2(x, v0)
+		return true
+	}
+	// match: (Less32 (Const32 <t> [-1]) x)
+	// result: (Leq32 (Const32 <t> [0]) x)
+	for {
+		if v_0.Op != OpConst32 {
+			break
+		}
+		t := v_0.Type
+		if auxIntToInt32(v_0.AuxInt) != -1 {
+			break
+		}
+		x := v_1
+		v.reset(OpLeq32)
+		v0 := b.NewValue0(v.Pos, OpConst32, t)
+		v0.AuxInt = int32ToAuxInt(0)
+		v.AddArg2(v0, x)
+		return true
+	}
 	return false
 }
 func rewriteValuegeneric_OpLess32F(v *Value) bool {
@@ -11723,6 +12231,7 @@
 func rewriteValuegeneric_OpLess32U(v *Value) bool {
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
+	b := v.Block
 	// match: (Less32U (Const32 [c]) (Const32 [d]))
 	// result: (ConstBool [uint32(c) < uint32(d)])
 	for {
@@ -11738,6 +12247,23 @@
 		v.AuxInt = boolToAuxInt(uint32(c) < uint32(d))
 		return true
 	}
+	// match: (Less32U x (Const32 <t> [1]))
+	// result: (Eq32 (Const32 <t> [0]) x)
+	for {
+		x := v_0
+		if v_1.Op != OpConst32 {
+			break
+		}
+		t := v_1.Type
+		if auxIntToInt32(v_1.AuxInt) != 1 {
+			break
+		}
+		v.reset(OpEq32)
+		v0 := b.NewValue0(v.Pos, OpConst32, t)
+		v0.AuxInt = int32ToAuxInt(0)
+		v.AddArg2(v0, x)
+		return true
+	}
 	// match: (Less32U _ (Const32 [0]))
 	// result: (ConstBool [false])
 	for {
@@ -11808,6 +12334,40 @@
 		v.AddArg2(v0, x)
 		return true
 	}
+	// match: (Less64 x (Const64 <t> [1]))
+	// result: (Leq64 x (Const64 <t> [0]))
+	for {
+		x := v_0
+		if v_1.Op != OpConst64 {
+			break
+		}
+		t := v_1.Type
+		if auxIntToInt64(v_1.AuxInt) != 1 {
+			break
+		}
+		v.reset(OpLeq64)
+		v0 := b.NewValue0(v.Pos, OpConst64, t)
+		v0.AuxInt = int64ToAuxInt(0)
+		v.AddArg2(x, v0)
+		return true
+	}
+	// match: (Less64 (Const64 <t> [-1]) x)
+	// result: (Leq64 (Const64 <t> [0]) x)
+	for {
+		if v_0.Op != OpConst64 {
+			break
+		}
+		t := v_0.Type
+		if auxIntToInt64(v_0.AuxInt) != -1 {
+			break
+		}
+		x := v_1
+		v.reset(OpLeq64)
+		v0 := b.NewValue0(v.Pos, OpConst64, t)
+		v0.AuxInt = int64ToAuxInt(0)
+		v.AddArg2(v0, x)
+		return true
+	}
 	return false
 }
 func rewriteValuegeneric_OpLess64F(v *Value) bool {
@@ -11833,6 +12393,7 @@
 func rewriteValuegeneric_OpLess64U(v *Value) bool {
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
+	b := v.Block
 	// match: (Less64U (Const64 [c]) (Const64 [d]))
 	// result: (ConstBool [uint64(c) < uint64(d)])
 	for {
@@ -11848,6 +12409,23 @@
 		v.AuxInt = boolToAuxInt(uint64(c) < uint64(d))
 		return true
 	}
+	// match: (Less64U x (Const64 <t> [1]))
+	// result: (Eq64 (Const64 <t> [0]) x)
+	for {
+		x := v_0
+		if v_1.Op != OpConst64 {
+			break
+		}
+		t := v_1.Type
+		if auxIntToInt64(v_1.AuxInt) != 1 {
+			break
+		}
+		v.reset(OpEq64)
+		v0 := b.NewValue0(v.Pos, OpConst64, t)
+		v0.AuxInt = int64ToAuxInt(0)
+		v.AddArg2(v0, x)
+		return true
+	}
 	// match: (Less64U _ (Const64 [0]))
 	// result: (ConstBool [false])
 	for {
@@ -11918,11 +12496,46 @@
 		v.AddArg2(v0, x)
 		return true
 	}
+	// match: (Less8 x (Const8 <t> [1]))
+	// result: (Leq8 x (Const8 <t> [0]))
+	for {
+		x := v_0
+		if v_1.Op != OpConst8 {
+			break
+		}
+		t := v_1.Type
+		if auxIntToInt8(v_1.AuxInt) != 1 {
+			break
+		}
+		v.reset(OpLeq8)
+		v0 := b.NewValue0(v.Pos, OpConst8, t)
+		v0.AuxInt = int8ToAuxInt(0)
+		v.AddArg2(x, v0)
+		return true
+	}
+	// match: (Less8 (Const8 <t> [-1]) x)
+	// result: (Leq8 (Const8 <t> [0]) x)
+	for {
+		if v_0.Op != OpConst8 {
+			break
+		}
+		t := v_0.Type
+		if auxIntToInt8(v_0.AuxInt) != -1 {
+			break
+		}
+		x := v_1
+		v.reset(OpLeq8)
+		v0 := b.NewValue0(v.Pos, OpConst8, t)
+		v0.AuxInt = int8ToAuxInt(0)
+		v.AddArg2(v0, x)
+		return true
+	}
 	return false
 }
 func rewriteValuegeneric_OpLess8U(v *Value) bool {
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
+	b := v.Block
 	// match: (Less8U (Const8 [c]) (Const8 [d]))
 	// result: (ConstBool [ uint8(c) < uint8(d)])
 	for {
@@ -11938,6 +12551,23 @@
 		v.AuxInt = boolToAuxInt(uint8(c) < uint8(d))
 		return true
 	}
+	// match: (Less8U x (Const8 <t> [1]))
+	// result: (Eq8 (Const8 <t> [0]) x)
+	for {
+		x := v_0
+		if v_1.Op != OpConst8 {
+			break
+		}
+		t := v_1.Type
+		if auxIntToInt8(v_1.AuxInt) != 1 {
+			break
+		}
+		v.reset(OpEq8)
+		v0 := b.NewValue0(v.Pos, OpConst8, t)
+		v0.AuxInt = int8ToAuxInt(0)
+		v.AddArg2(v0, x)
+		return true
+	}
 	// match: (Less8U _ (Const8 [0]))
 	// result: (ConstBool [false])
 	for {
@@ -11954,6 +12584,7 @@
 	v_1 := v.Args[1]
 	v_0 := v.Args[0]
 	b := v.Block
+	config := b.Func.Config
 	fe := b.Func.fe
 	// match: (Load <t1> p1 (Store {t2} p2 x _))
 	// cond: isSamePtr(p1, p2) && t1.Compare(x.Type) == types.CMPeq && t1.Size() == t2.Size()
@@ -12645,6 +13276,230 @@
 		v.AddArg(v0)
 		return true
 	}
+	// match: (Load <t> (OffPtr [off] (Addr {s} sb) ) _)
+	// cond: t.IsUintptr() && isFixedSym(s, off)
+	// result: (Addr {fixedSym(b.Func, s, off)} sb)
+	for {
+		t := v.Type
+		if v_0.Op != OpOffPtr {
+			break
+		}
+		off := auxIntToInt64(v_0.AuxInt)
+		v_0_0 := v_0.Args[0]
+		if v_0_0.Op != OpAddr {
+			break
+		}
+		s := auxToSym(v_0_0.Aux)
+		sb := v_0_0.Args[0]
+		if !(t.IsUintptr() && isFixedSym(s, off)) {
+			break
+		}
+		v.reset(OpAddr)
+		v.Aux = symToAux(fixedSym(b.Func, s, off))
+		v.AddArg(sb)
+		return true
+	}
+	// match: (Load <t> (OffPtr [off] (Convert (Addr {s} sb) _) ) _)
+	// cond: t.IsUintptr() && isFixedSym(s, off)
+	// result: (Addr {fixedSym(b.Func, s, off)} sb)
+	for {
+		t := v.Type
+		if v_0.Op != OpOffPtr {
+			break
+		}
+		off := auxIntToInt64(v_0.AuxInt)
+		v_0_0 := v_0.Args[0]
+		if v_0_0.Op != OpConvert {
+			break
+		}
+		v_0_0_0 := v_0_0.Args[0]
+		if v_0_0_0.Op != OpAddr {
+			break
+		}
+		s := auxToSym(v_0_0_0.Aux)
+		sb := v_0_0_0.Args[0]
+		if !(t.IsUintptr() && isFixedSym(s, off)) {
+			break
+		}
+		v.reset(OpAddr)
+		v.Aux = symToAux(fixedSym(b.Func, s, off))
+		v.AddArg(sb)
+		return true
+	}
+	// match: (Load <t> (OffPtr [off] (ITab (IMake (Addr {s} sb) _))) _)
+	// cond: t.IsUintptr() && isFixedSym(s, off)
+	// result: (Addr {fixedSym(b.Func, s, off)} sb)
+	for {
+		t := v.Type
+		if v_0.Op != OpOffPtr {
+			break
+		}
+		off := auxIntToInt64(v_0.AuxInt)
+		v_0_0 := v_0.Args[0]
+		if v_0_0.Op != OpITab {
+			break
+		}
+		v_0_0_0 := v_0_0.Args[0]
+		if v_0_0_0.Op != OpIMake {
+			break
+		}
+		v_0_0_0_0 := v_0_0_0.Args[0]
+		if v_0_0_0_0.Op != OpAddr {
+			break
+		}
+		s := auxToSym(v_0_0_0_0.Aux)
+		sb := v_0_0_0_0.Args[0]
+		if !(t.IsUintptr() && isFixedSym(s, off)) {
+			break
+		}
+		v.reset(OpAddr)
+		v.Aux = symToAux(fixedSym(b.Func, s, off))
+		v.AddArg(sb)
+		return true
+	}
+	// match: (Load <t> (OffPtr [off] (ITab (IMake (Convert (Addr {s} sb) _) _))) _)
+	// cond: t.IsUintptr() && isFixedSym(s, off)
+	// result: (Addr {fixedSym(b.Func, s, off)} sb)
+	for {
+		t := v.Type
+		if v_0.Op != OpOffPtr {
+			break
+		}
+		off := auxIntToInt64(v_0.AuxInt)
+		v_0_0 := v_0.Args[0]
+		if v_0_0.Op != OpITab {
+			break
+		}
+		v_0_0_0 := v_0_0.Args[0]
+		if v_0_0_0.Op != OpIMake {
+			break
+		}
+		v_0_0_0_0 := v_0_0_0.Args[0]
+		if v_0_0_0_0.Op != OpConvert {
+			break
+		}
+		v_0_0_0_0_0 := v_0_0_0_0.Args[0]
+		if v_0_0_0_0_0.Op != OpAddr {
+			break
+		}
+		s := auxToSym(v_0_0_0_0_0.Aux)
+		sb := v_0_0_0_0_0.Args[0]
+		if !(t.IsUintptr() && isFixedSym(s, off)) {
+			break
+		}
+		v.reset(OpAddr)
+		v.Aux = symToAux(fixedSym(b.Func, s, off))
+		v.AddArg(sb)
+		return true
+	}
+	// match: (Load <t> (OffPtr [off] (Addr {sym} _) ) _)
+	// cond: t.IsInteger() && t.Size() == 4 && isFixed32(config, sym, off)
+	// result: (Const32 [fixed32(config, sym, off)])
+	for {
+		t := v.Type
+		if v_0.Op != OpOffPtr {
+			break
+		}
+		off := auxIntToInt64(v_0.AuxInt)
+		v_0_0 := v_0.Args[0]
+		if v_0_0.Op != OpAddr {
+			break
+		}
+		sym := auxToSym(v_0_0.Aux)
+		if !(t.IsInteger() && t.Size() == 4 && isFixed32(config, sym, off)) {
+			break
+		}
+		v.reset(OpConst32)
+		v.AuxInt = int32ToAuxInt(fixed32(config, sym, off))
+		return true
+	}
+	// match: (Load <t> (OffPtr [off] (Convert (Addr {sym} _) _) ) _)
+	// cond: t.IsInteger() && t.Size() == 4 && isFixed32(config, sym, off)
+	// result: (Const32 [fixed32(config, sym, off)])
+	for {
+		t := v.Type
+		if v_0.Op != OpOffPtr {
+			break
+		}
+		off := auxIntToInt64(v_0.AuxInt)
+		v_0_0 := v_0.Args[0]
+		if v_0_0.Op != OpConvert {
+			break
+		}
+		v_0_0_0 := v_0_0.Args[0]
+		if v_0_0_0.Op != OpAddr {
+			break
+		}
+		sym := auxToSym(v_0_0_0.Aux)
+		if !(t.IsInteger() && t.Size() == 4 && isFixed32(config, sym, off)) {
+			break
+		}
+		v.reset(OpConst32)
+		v.AuxInt = int32ToAuxInt(fixed32(config, sym, off))
+		return true
+	}
+	// match: (Load <t> (OffPtr [off] (ITab (IMake (Addr {sym} _) _))) _)
+	// cond: t.IsInteger() && t.Size() == 4 && isFixed32(config, sym, off)
+	// result: (Const32 [fixed32(config, sym, off)])
+	for {
+		t := v.Type
+		if v_0.Op != OpOffPtr {
+			break
+		}
+		off := auxIntToInt64(v_0.AuxInt)
+		v_0_0 := v_0.Args[0]
+		if v_0_0.Op != OpITab {
+			break
+		}
+		v_0_0_0 := v_0_0.Args[0]
+		if v_0_0_0.Op != OpIMake {
+			break
+		}
+		v_0_0_0_0 := v_0_0_0.Args[0]
+		if v_0_0_0_0.Op != OpAddr {
+			break
+		}
+		sym := auxToSym(v_0_0_0_0.Aux)
+		if !(t.IsInteger() && t.Size() == 4 && isFixed32(config, sym, off)) {
+			break
+		}
+		v.reset(OpConst32)
+		v.AuxInt = int32ToAuxInt(fixed32(config, sym, off))
+		return true
+	}
+	// match: (Load <t> (OffPtr [off] (ITab (IMake (Convert (Addr {sym} _) _) _))) _)
+	// cond: t.IsInteger() && t.Size() == 4 && isFixed32(config, sym, off)
+	// result: (Const32 [fixed32(config, sym, off)])
+	for {
+		t := v.Type
+		if v_0.Op != OpOffPtr {
+			break
+		}
+		off := auxIntToInt64(v_0.AuxInt)
+		v_0_0 := v_0.Args[0]
+		if v_0_0.Op != OpITab {
+			break
+		}
+		v_0_0_0 := v_0_0.Args[0]
+		if v_0_0_0.Op != OpIMake {
+			break
+		}
+		v_0_0_0_0 := v_0_0_0.Args[0]
+		if v_0_0_0_0.Op != OpConvert {
+			break
+		}
+		v_0_0_0_0_0 := v_0_0_0_0.Args[0]
+		if v_0_0_0_0_0.Op != OpAddr {
+			break
+		}
+		sym := auxToSym(v_0_0_0_0_0.Aux)
+		if !(t.IsInteger() && t.Size() == 4 && isFixed32(config, sym, off)) {
+			break
+		}
+		v.reset(OpConst32)
+		v.AuxInt = int32ToAuxInt(fixed32(config, sym, off))
+		return true
+	}
 	return false
 }
 func rewriteValuegeneric_OpLsh16x16(v *Value) bool {
@@ -17934,6 +18789,28 @@
 		}
 		break
 	}
+	// match: (NeqPtr (Convert (Addr {x} _) _) (Addr {y} _))
+	// result: (ConstBool [x!=y])
+	for {
+		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
+			if v_0.Op != OpConvert {
+				continue
+			}
+			v_0_0 := v_0.Args[0]
+			if v_0_0.Op != OpAddr {
+				continue
+			}
+			x := auxToSym(v_0_0.Aux)
+			if v_1.Op != OpAddr {
+				continue
+			}
+			y := auxToSym(v_1.Aux)
+			v.reset(OpConstBool)
+			v.AuxInt = boolToAuxInt(x != y)
+			return true
+		}
+		break
+	}
 	// match: (NeqPtr (LocalAddr _ _) (Addr _))
 	// result: (ConstBool [true])
 	for {
@@ -18135,6 +19012,36 @@
 		v.reset(OpInvalid)
 		return true
 	}
+	// match: (NilCheck (Addr {_} (SB)) _)
+	// result: (Invalid)
+	for {
+		if v_0.Op != OpAddr {
+			break
+		}
+		v_0_0 := v_0.Args[0]
+		if v_0_0.Op != OpSB {
+			break
+		}
+		v.reset(OpInvalid)
+		return true
+	}
+	// match: (NilCheck (Convert (Addr {_} (SB)) _) _)
+	// result: (Invalid)
+	for {
+		if v_0.Op != OpConvert {
+			break
+		}
+		v_0_0 := v_0.Args[0]
+		if v_0_0.Op != OpAddr {
+			break
+		}
+		v_0_0_0 := v_0_0.Args[0]
+		if v_0_0_0.Op != OpSB {
+			break
+		}
+		v.reset(OpInvalid)
+		return true
+	}
 	return false
 }
 func rewriteValuegeneric_OpNot(v *Value) bool {
@@ -18591,6 +19498,27 @@
 		}
 		break
 	}
+	// match: (Or16 <t> (Com16 x) (Com16 y))
+	// result: (Com16 (And16 <t> x y))
+	for {
+		t := v.Type
+		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
+			if v_0.Op != OpCom16 {
+				continue
+			}
+			x := v_0.Args[0]
+			if v_1.Op != OpCom16 {
+				continue
+			}
+			y := v_1.Args[0]
+			v.reset(OpCom16)
+			v0 := b.NewValue0(v.Pos, OpAnd16, t)
+			v0.AddArg2(x, y)
+			v.AddArg(v0)
+			return true
+		}
+		break
+	}
 	// match: (Or16 x x)
 	// result: x
 	for {
@@ -19095,6 +20023,27 @@
 		}
 		break
 	}
+	// match: (Or32 <t> (Com32 x) (Com32 y))
+	// result: (Com32 (And32 <t> x y))
+	for {
+		t := v.Type
+		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
+			if v_0.Op != OpCom32 {
+				continue
+			}
+			x := v_0.Args[0]
+			if v_1.Op != OpCom32 {
+				continue
+			}
+			y := v_1.Args[0]
+			v.reset(OpCom32)
+			v0 := b.NewValue0(v.Pos, OpAnd32, t)
+			v0.AddArg2(x, y)
+			v.AddArg(v0)
+			return true
+		}
+		break
+	}
 	// match: (Or32 x x)
 	// result: x
 	for {
@@ -19599,6 +20548,27 @@
 		}
 		break
 	}
+	// match: (Or64 <t> (Com64 x) (Com64 y))
+	// result: (Com64 (And64 <t> x y))
+	for {
+		t := v.Type
+		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
+			if v_0.Op != OpCom64 {
+				continue
+			}
+			x := v_0.Args[0]
+			if v_1.Op != OpCom64 {
+				continue
+			}
+			y := v_1.Args[0]
+			v.reset(OpCom64)
+			v0 := b.NewValue0(v.Pos, OpAnd64, t)
+			v0.AddArg2(x, y)
+			v.AddArg(v0)
+			return true
+		}
+		break
+	}
 	// match: (Or64 x x)
 	// result: x
 	for {
@@ -20103,6 +21073,27 @@
 		}
 		break
 	}
+	// match: (Or8 <t> (Com8 x) (Com8 y))
+	// result: (Com8 (And8 <t> x y))
+	for {
+		t := v.Type
+		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
+			if v_0.Op != OpCom8 {
+				continue
+			}
+			x := v_0.Args[0]
+			if v_1.Op != OpCom8 {
+				continue
+			}
+			y := v_1.Args[0]
+			v.reset(OpCom8)
+			v0 := b.NewValue0(v.Pos, OpAnd8, t)
+			v0.AddArg2(x, y)
+			v.AddArg(v0)
+			return true
+		}
+		break
+	}
 	// match: (Or8 x x)
 	// result: x
 	for {
@@ -26410,6 +27401,62 @@
 		v.copyOf(z)
 		return true
 	}
+	// match: (SelectN [0] call:(StaticCall {sym} sptr (Const64 [c]) mem))
+	// cond: isInlinableMemclr(config, int64(c)) && isSameCall(sym, "runtime.memclrNoHeapPointers") && call.Uses == 1 && clobber(call)
+	// result: (Zero {types.Types[types.TUINT8]} [int64(c)] sptr mem)
+	for {
+		if auxIntToInt64(v.AuxInt) != 0 {
+			break
+		}
+		call := v_0
+		if call.Op != OpStaticCall || len(call.Args) != 3 {
+			break
+		}
+		sym := auxToCall(call.Aux)
+		mem := call.Args[2]
+		sptr := call.Args[0]
+		call_1 := call.Args[1]
+		if call_1.Op != OpConst64 {
+			break
+		}
+		c := auxIntToInt64(call_1.AuxInt)
+		if !(isInlinableMemclr(config, int64(c)) && isSameCall(sym, "runtime.memclrNoHeapPointers") && call.Uses == 1 && clobber(call)) {
+			break
+		}
+		v.reset(OpZero)
+		v.AuxInt = int64ToAuxInt(int64(c))
+		v.Aux = typeToAux(types.Types[types.TUINT8])
+		v.AddArg2(sptr, mem)
+		return true
+	}
+	// match: (SelectN [0] call:(StaticCall {sym} sptr (Const32 [c]) mem))
+	// cond: isInlinableMemclr(config, int64(c)) && isSameCall(sym, "runtime.memclrNoHeapPointers") && call.Uses == 1 && clobber(call)
+	// result: (Zero {types.Types[types.TUINT8]} [int64(c)] sptr mem)
+	for {
+		if auxIntToInt64(v.AuxInt) != 0 {
+			break
+		}
+		call := v_0
+		if call.Op != OpStaticCall || len(call.Args) != 3 {
+			break
+		}
+		sym := auxToCall(call.Aux)
+		mem := call.Args[2]
+		sptr := call.Args[0]
+		call_1 := call.Args[1]
+		if call_1.Op != OpConst32 {
+			break
+		}
+		c := auxIntToInt32(call_1.AuxInt)
+		if !(isInlinableMemclr(config, int64(c)) && isSameCall(sym, "runtime.memclrNoHeapPointers") && call.Uses == 1 && clobber(call)) {
+			break
+		}
+		v.reset(OpZero)
+		v.AuxInt = int64ToAuxInt(int64(c))
+		v.Aux = typeToAux(types.Types[types.TUINT8])
+		v.AddArg2(sptr, mem)
+		return true
+	}
 	// match: (SelectN [0] call:(StaticCall {sym} s1:(Store _ (Const64 [sz]) s2:(Store _ src s3:(Store {t} _ dst mem)))))
 	// cond: sz >= 0 && isSameCall(sym, "runtime.memmove") && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && isInlinableMemmove(dst, src, int64(sz), config) && clobber(s1, s2, s3, call)
 	// result: (Move {types.Types[types.TUINT8]} [int64(sz)] dst src mem)
@@ -27209,6 +28256,39 @@
 		v.AddArg2(v0, mem)
 		return true
 	}
+	// match: (StaticLECall {callAux} (Addr {scon} (SB)) sptr (Const64 [1]) mem)
+	// cond: isSameCall(callAux, "runtime.memequal") && symIsRO(scon)
+	// result: (MakeResult (Eq8 (Load <typ.Int8> sptr mem) (Const8 <typ.Int8> [int8(read8(scon,0))])) mem)
+	for {
+		if len(v.Args) != 4 {
+			break
+		}
+		callAux := auxToCall(v.Aux)
+		mem := v.Args[3]
+		v_0 := v.Args[0]
+		if v_0.Op != OpAddr {
+			break
+		}
+		scon := auxToSym(v_0.Aux)
+		v_0_0 := v_0.Args[0]
+		if v_0_0.Op != OpSB {
+			break
+		}
+		sptr := v.Args[1]
+		v_2 := v.Args[2]
+		if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 1 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon)) {
+			break
+		}
+		v.reset(OpMakeResult)
+		v0 := b.NewValue0(v.Pos, OpEq8, typ.Bool)
+		v1 := b.NewValue0(v.Pos, OpLoad, typ.Int8)
+		v1.AddArg2(sptr, mem)
+		v2 := b.NewValue0(v.Pos, OpConst8, typ.Int8)
+		v2.AuxInt = int8ToAuxInt(int8(read8(scon, 0)))
+		v0.AddArg2(v1, v2)
+		v.AddArg2(v0, mem)
+		return true
+	}
 	// match: (StaticLECall {callAux} sptr (Addr {scon} (SB)) (Const64 [2]) mem)
 	// cond: isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config)
 	// result: (MakeResult (Eq16 (Load <typ.Int16> sptr mem) (Const16 <typ.Int16> [int16(read16(scon,0,config.ctxt.Arch.ByteOrder))])) mem)
@@ -27242,6 +28322,39 @@
 		v.AddArg2(v0, mem)
 		return true
 	}
+	// match: (StaticLECall {callAux} (Addr {scon} (SB)) sptr (Const64 [2]) mem)
+	// cond: isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config)
+	// result: (MakeResult (Eq16 (Load <typ.Int16> sptr mem) (Const16 <typ.Int16> [int16(read16(scon,0,config.ctxt.Arch.ByteOrder))])) mem)
+	for {
+		if len(v.Args) != 4 {
+			break
+		}
+		callAux := auxToCall(v.Aux)
+		mem := v.Args[3]
+		v_0 := v.Args[0]
+		if v_0.Op != OpAddr {
+			break
+		}
+		scon := auxToSym(v_0.Aux)
+		v_0_0 := v_0.Args[0]
+		if v_0_0.Op != OpSB {
+			break
+		}
+		sptr := v.Args[1]
+		v_2 := v.Args[2]
+		if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 2 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config)) {
+			break
+		}
+		v.reset(OpMakeResult)
+		v0 := b.NewValue0(v.Pos, OpEq16, typ.Bool)
+		v1 := b.NewValue0(v.Pos, OpLoad, typ.Int16)
+		v1.AddArg2(sptr, mem)
+		v2 := b.NewValue0(v.Pos, OpConst16, typ.Int16)
+		v2.AuxInt = int16ToAuxInt(int16(read16(scon, 0, config.ctxt.Arch.ByteOrder)))
+		v0.AddArg2(v1, v2)
+		v.AddArg2(v0, mem)
+		return true
+	}
 	// match: (StaticLECall {callAux} sptr (Addr {scon} (SB)) (Const64 [4]) mem)
 	// cond: isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config)
 	// result: (MakeResult (Eq32 (Load <typ.Int32> sptr mem) (Const32 <typ.Int32> [int32(read32(scon,0,config.ctxt.Arch.ByteOrder))])) mem)
@@ -27275,6 +28388,39 @@
 		v.AddArg2(v0, mem)
 		return true
 	}
+	// match: (StaticLECall {callAux} (Addr {scon} (SB)) sptr (Const64 [4]) mem)
+	// cond: isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config)
+	// result: (MakeResult (Eq32 (Load <typ.Int32> sptr mem) (Const32 <typ.Int32> [int32(read32(scon,0,config.ctxt.Arch.ByteOrder))])) mem)
+	for {
+		if len(v.Args) != 4 {
+			break
+		}
+		callAux := auxToCall(v.Aux)
+		mem := v.Args[3]
+		v_0 := v.Args[0]
+		if v_0.Op != OpAddr {
+			break
+		}
+		scon := auxToSym(v_0.Aux)
+		v_0_0 := v_0.Args[0]
+		if v_0_0.Op != OpSB {
+			break
+		}
+		sptr := v.Args[1]
+		v_2 := v.Args[2]
+		if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 4 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config)) {
+			break
+		}
+		v.reset(OpMakeResult)
+		v0 := b.NewValue0(v.Pos, OpEq32, typ.Bool)
+		v1 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
+		v1.AddArg2(sptr, mem)
+		v2 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
+		v2.AuxInt = int32ToAuxInt(int32(read32(scon, 0, config.ctxt.Arch.ByteOrder)))
+		v0.AddArg2(v1, v2)
+		v.AddArg2(v0, mem)
+		return true
+	}
 	// match: (StaticLECall {callAux} sptr (Addr {scon} (SB)) (Const64 [8]) mem)
 	// cond: isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config) && config.PtrSize == 8
 	// result: (MakeResult (Eq64 (Load <typ.Int64> sptr mem) (Const64 <typ.Int64> [int64(read64(scon,0,config.ctxt.Arch.ByteOrder))])) mem)
@@ -27308,6 +28454,108 @@
 		v.AddArg2(v0, mem)
 		return true
 	}
+	// match: (StaticLECall {callAux} (Addr {scon} (SB)) sptr (Const64 [8]) mem)
+	// cond: isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config) && config.PtrSize == 8
+	// result: (MakeResult (Eq64 (Load <typ.Int64> sptr mem) (Const64 <typ.Int64> [int64(read64(scon,0,config.ctxt.Arch.ByteOrder))])) mem)
+	for {
+		if len(v.Args) != 4 {
+			break
+		}
+		callAux := auxToCall(v.Aux)
+		mem := v.Args[3]
+		v_0 := v.Args[0]
+		if v_0.Op != OpAddr {
+			break
+		}
+		scon := auxToSym(v_0.Aux)
+		v_0_0 := v_0.Args[0]
+		if v_0_0.Op != OpSB {
+			break
+		}
+		sptr := v.Args[1]
+		v_2 := v.Args[2]
+		if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 8 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config) && config.PtrSize == 8) {
+			break
+		}
+		v.reset(OpMakeResult)
+		v0 := b.NewValue0(v.Pos, OpEq64, typ.Bool)
+		v1 := b.NewValue0(v.Pos, OpLoad, typ.Int64)
+		v1.AddArg2(sptr, mem)
+		v2 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
+		v2.AuxInt = int64ToAuxInt(int64(read64(scon, 0, config.ctxt.Arch.ByteOrder)))
+		v0.AddArg2(v1, v2)
+		v.AddArg2(v0, mem)
+		return true
+	}
+	// match: (StaticLECall {callAux} _ _ (Const64 [0]) mem)
+	// cond: isSameCall(callAux, "runtime.memequal")
+	// result: (MakeResult (ConstBool <typ.Bool> [true]) mem)
+	for {
+		if len(v.Args) != 4 {
+			break
+		}
+		callAux := auxToCall(v.Aux)
+		mem := v.Args[3]
+		v_2 := v.Args[2]
+		if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 0 || !(isSameCall(callAux, "runtime.memequal")) {
+			break
+		}
+		v.reset(OpMakeResult)
+		v0 := b.NewValue0(v.Pos, OpConstBool, typ.Bool)
+		v0.AuxInt = boolToAuxInt(true)
+		v.AddArg2(v0, mem)
+		return true
+	}
+	// match: (StaticLECall {callAux} _ (Const64 [0]) (Const64 [0]) mem)
+	// cond: isSameCall(callAux, "runtime.makeslice")
+	// result: (MakeResult (Addr <v.Type.FieldType(0)> {ir.Syms.Zerobase} (SB)) mem)
+	for {
+		if len(v.Args) != 4 {
+			break
+		}
+		callAux := auxToCall(v.Aux)
+		mem := v.Args[3]
+		v_1 := v.Args[1]
+		if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
+			break
+		}
+		v_2 := v.Args[2]
+		if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 0 || !(isSameCall(callAux, "runtime.makeslice")) {
+			break
+		}
+		v.reset(OpMakeResult)
+		v0 := b.NewValue0(v.Pos, OpAddr, v.Type.FieldType(0))
+		v0.Aux = symToAux(ir.Syms.Zerobase)
+		v1 := b.NewValue0(v.Pos, OpSB, typ.Uintptr)
+		v0.AddArg(v1)
+		v.AddArg2(v0, mem)
+		return true
+	}
+	// match: (StaticLECall {callAux} _ (Const32 [0]) (Const32 [0]) mem)
+	// cond: isSameCall(callAux, "runtime.makeslice")
+	// result: (MakeResult (Addr <v.Type.FieldType(0)> {ir.Syms.Zerobase} (SB)) mem)
+	for {
+		if len(v.Args) != 4 {
+			break
+		}
+		callAux := auxToCall(v.Aux)
+		mem := v.Args[3]
+		v_1 := v.Args[1]
+		if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 0 {
+			break
+		}
+		v_2 := v.Args[2]
+		if v_2.Op != OpConst32 || auxIntToInt32(v_2.AuxInt) != 0 || !(isSameCall(callAux, "runtime.makeslice")) {
+			break
+		}
+		v.reset(OpMakeResult)
+		v0 := b.NewValue0(v.Pos, OpAddr, v.Type.FieldType(0))
+		v0.Aux = symToAux(ir.Syms.Zerobase)
+		v1 := b.NewValue0(v.Pos, OpSB, typ.Uintptr)
+		v0.AddArg(v1)
+		v.AddArg2(v0, mem)
+		return true
+	}
 	return false
 }
 func rewriteValuegeneric_OpStore(v *Value) bool {
@@ -28450,6 +29698,36 @@
 		v.AuxInt = int16ToAuxInt(-1)
 		return true
 	}
+	// match: (Sub16 (Add16 t x) (Add16 t y))
+	// result: (Sub16 x y)
+	for {
+		if v_0.Op != OpAdd16 {
+			break
+		}
+		_ = v_0.Args[1]
+		v_0_0 := v_0.Args[0]
+		v_0_1 := v_0.Args[1]
+		for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
+			t := v_0_0
+			x := v_0_1
+			if v_1.Op != OpAdd16 {
+				continue
+			}
+			_ = v_1.Args[1]
+			v_1_0 := v_1.Args[0]
+			v_1_1 := v_1.Args[1]
+			for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
+				if t != v_1_0 {
+					continue
+				}
+				y := v_1_1
+				v.reset(OpSub16)
+				v.AddArg2(x, y)
+				return true
+			}
+		}
+		break
+	}
 	// match: (Sub16 (Add16 x y) x)
 	// result: y
 	for {
@@ -28793,6 +30071,36 @@
 		v.AuxInt = int32ToAuxInt(-1)
 		return true
 	}
+	// match: (Sub32 (Add32 t x) (Add32 t y))
+	// result: (Sub32 x y)
+	for {
+		if v_0.Op != OpAdd32 {
+			break
+		}
+		_ = v_0.Args[1]
+		v_0_0 := v_0.Args[0]
+		v_0_1 := v_0.Args[1]
+		for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
+			t := v_0_0
+			x := v_0_1
+			if v_1.Op != OpAdd32 {
+				continue
+			}
+			_ = v_1.Args[1]
+			v_1_0 := v_1.Args[0]
+			v_1_1 := v_1.Args[1]
+			for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
+				if t != v_1_0 {
+					continue
+				}
+				y := v_1_1
+				v.reset(OpSub32)
+				v.AddArg2(x, y)
+				return true
+			}
+		}
+		break
+	}
 	// match: (Sub32 (Add32 x y) x)
 	// result: y
 	for {
@@ -29160,6 +30468,36 @@
 		v.AuxInt = int64ToAuxInt(-1)
 		return true
 	}
+	// match: (Sub64 (Add64 t x) (Add64 t y))
+	// result: (Sub64 x y)
+	for {
+		if v_0.Op != OpAdd64 {
+			break
+		}
+		_ = v_0.Args[1]
+		v_0_0 := v_0.Args[0]
+		v_0_1 := v_0.Args[1]
+		for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
+			t := v_0_0
+			x := v_0_1
+			if v_1.Op != OpAdd64 {
+				continue
+			}
+			_ = v_1.Args[1]
+			v_1_0 := v_1.Args[0]
+			v_1_1 := v_1.Args[1]
+			for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
+				if t != v_1_0 {
+					continue
+				}
+				y := v_1_1
+				v.reset(OpSub64)
+				v.AddArg2(x, y)
+				return true
+			}
+		}
+		break
+	}
 	// match: (Sub64 (Add64 x y) x)
 	// result: y
 	for {
@@ -29527,6 +30865,36 @@
 		v.AuxInt = int8ToAuxInt(-1)
 		return true
 	}
+	// match: (Sub8 (Add8 t x) (Add8 t y))
+	// result: (Sub8 x y)
+	for {
+		if v_0.Op != OpAdd8 {
+			break
+		}
+		_ = v_0.Args[1]
+		v_0_0 := v_0.Args[0]
+		v_0_1 := v_0.Args[1]
+		for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
+			t := v_0_0
+			x := v_0_1
+			if v_1.Op != OpAdd8 {
+				continue
+			}
+			_ = v_1.Args[1]
+			v_1_0 := v_1.Args[0]
+			v_1_1 := v_1.Args[1]
+			for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
+				if t != v_1_0 {
+					continue
+				}
+				y := v_1_1
+				v.reset(OpSub8)
+				v.AddArg2(x, y)
+				return true
+			}
+		}
+		break
+	}
 	// match: (Sub8 (Add8 x y) x)
 	// result: y
 	for {
diff --git a/src/cmd/compile/internal/ssa/schedule.go b/src/cmd/compile/internal/ssa/schedule.go
index 4e762f7..19b98cc 100644
--- a/src/cmd/compile/internal/ssa/schedule.go
+++ b/src/cmd/compile/internal/ssa/schedule.go
@@ -5,18 +5,19 @@
 package ssa
 
 import (
+	"cmd/compile/internal/base"
 	"cmd/compile/internal/types"
+	"cmd/internal/src"
 	"container/heap"
 	"sort"
 )
 
 const (
-	ScorePhi = iota // towards top of block
-	ScoreArg
+	ScorePhi       = iota // towards top of block
+	ScoreArg              // must occur at the top of the entry block
+	ScoreInitMem          // after the args - used as mark by debug info generation
+	ScoreReadTuple        // must occur immediately after tuple-generating insn (or call)
 	ScoreNilCheck
-	ScoreReadTuple
-	ScoreVarDef
-	ScoreCarryChainTail
 	ScoreMemory
 	ScoreReadFlags
 	ScoreDefault
@@ -25,8 +26,9 @@
 )
 
 type ValHeap struct {
-	a     []*Value
-	score []int8
+	a           []*Value
+	score       []int8
+	inBlockUses []bool
 }
 
 func (h ValHeap) Len() int      { return len(h.a) }
@@ -51,29 +53,42 @@
 	sx := h.score[x.ID]
 	sy := h.score[y.ID]
 	if c := sx - sy; c != 0 {
-		return c > 0 // higher score comes later.
+		return c < 0 // lower scores come earlier.
 	}
+	// Note: only scores are required for correct scheduling.
+	// Everything else is just heuristics.
+
+	ix := h.inBlockUses[x.ID]
+	iy := h.inBlockUses[y.ID]
+	if ix != iy {
+		return ix // values with in-block uses come earlier
+	}
+
 	if x.Pos != y.Pos { // Favor in-order line stepping
-		return x.Pos.After(y.Pos)
+		if x.Block == x.Block.Func.Entry && x.Pos.IsStmt() != y.Pos.IsStmt() {
+			// In the entry block, put statement-marked instructions earlier.
+			return x.Pos.IsStmt() == src.PosIsStmt && y.Pos.IsStmt() != src.PosIsStmt
+		}
+		return x.Pos.Before(y.Pos)
 	}
 	if x.Op != OpPhi {
 		if c := len(x.Args) - len(y.Args); c != 0 {
-			return c < 0 // smaller args comes later
+			return c > 0 // smaller args come later
 		}
 	}
 	if c := x.Uses - y.Uses; c != 0 {
-		return c < 0 // smaller uses come later
+		return c > 0 // smaller uses come later
 	}
 	// These comparisons are fairly arbitrary.
 	// The goal here is stability in the face
 	// of unrelated changes elsewhere in the compiler.
 	if c := x.AuxInt - y.AuxInt; c != 0 {
-		return c > 0
+		return c < 0
 	}
 	if cmp := x.Type.Compare(y.Type); cmp != types.CMPeq {
-		return cmp == types.CMPgt
+		return cmp == types.CMPlt
 	}
-	return x.ID > y.ID
+	return x.ID < y.ID
 }
 
 func (op Op) isLoweredGetClosurePtr() bool {
@@ -92,11 +107,6 @@
 // reasonable valid schedule using a priority queue. TODO(khr):
 // schedule smarter.
 func schedule(f *Func) {
-	// For each value, the number of times it is used in the block
-	// by values that have not been scheduled yet.
-	uses := f.Cache.allocInt32Slice(f.NumValues())
-	defer f.Cache.freeInt32Slice(uses)
-
 	// reusable priority queue
 	priq := new(ValHeap)
 
@@ -104,16 +114,26 @@
 	score := f.Cache.allocInt8Slice(f.NumValues())
 	defer f.Cache.freeInt8Slice(score)
 
-	// scheduling order. We queue values in this list in reverse order.
-	// A constant bound allows this to be stack-allocated. 64 is
-	// enough to cover almost every schedule call.
-	order := make([]*Value, 0, 64)
-
 	// maps mem values to the next live memory value
 	nextMem := f.Cache.allocValueSlice(f.NumValues())
 	defer f.Cache.freeValueSlice(nextMem)
-	// additional pretend arguments for each Value. Used to enforce load/store ordering.
-	additionalArgs := make([][]*Value, f.NumValues())
+
+	// inBlockUses records whether a value is used in the block
+	// in which it lives. (block control values don't count as uses.)
+	inBlockUses := f.Cache.allocBoolSlice(f.NumValues())
+	defer f.Cache.freeBoolSlice(inBlockUses)
+	if f.Config.optimize {
+		for _, b := range f.Blocks {
+			for _, v := range b.Values {
+				for _, a := range v.Args {
+					if a.Block == b {
+						inBlockUses[a.ID] = true
+					}
+				}
+			}
+		}
+	}
+	priq.inBlockUses = inBlockUses
 
 	for _, b := range f.Blocks {
 		// Compute score. Larger numbers are scheduled closer to the end of the block.
@@ -128,68 +148,45 @@
 					f.Fatalf("LoweredGetClosurePtr appeared outside of entry block, b=%s", b.String())
 				}
 				score[v.ID] = ScorePhi
-			case v.Op == OpAMD64LoweredNilCheck || v.Op == OpPPC64LoweredNilCheck ||
-				v.Op == OpARMLoweredNilCheck || v.Op == OpARM64LoweredNilCheck ||
-				v.Op == Op386LoweredNilCheck || v.Op == OpMIPS64LoweredNilCheck ||
-				v.Op == OpS390XLoweredNilCheck || v.Op == OpMIPSLoweredNilCheck ||
-				v.Op == OpRISCV64LoweredNilCheck || v.Op == OpWasmLoweredNilCheck ||
-				v.Op == OpLOONG64LoweredNilCheck:
+			case opcodeTable[v.Op].nilCheck:
 				// Nil checks must come before loads from the same address.
 				score[v.ID] = ScoreNilCheck
 			case v.Op == OpPhi:
 				// We want all the phis first.
 				score[v.ID] = ScorePhi
-			case v.Op == OpVarDef:
-				// We want all the vardefs next.
-				score[v.ID] = ScoreVarDef
 			case v.Op == OpArgIntReg || v.Op == OpArgFloatReg:
-				// In-register args must be scheduled as early as possible to ensure that the
-				// context register is not stomped. They should only appear in the entry block.
+				// In-register args must be scheduled as early as possible to ensure that they
+				// are not stomped (similar to the closure pointer above).
+				// In particular, they need to come before regular OpArg operations because
+				// of how regalloc places spill code (see regalloc.go:placeSpills:mustBeFirst).
 				if b != f.Entry {
 					f.Fatalf("%s appeared outside of entry block, b=%s", v.Op, b.String())
 				}
 				score[v.ID] = ScorePhi
-			case v.Op == OpArg:
+			case v.Op == OpArg || v.Op == OpSP || v.Op == OpSB:
 				// We want all the args as early as possible, for better debugging.
 				score[v.ID] = ScoreArg
+			case v.Op == OpInitMem:
+				// Early, but after args. See debug.go:buildLocationLists
+				score[v.ID] = ScoreInitMem
 			case v.Type.IsMemory():
 				// Schedule stores as early as possible. This tends to
-				// reduce register pressure. It also helps make sure
-				// VARDEF ops are scheduled before the corresponding LEA.
+				// reduce register pressure.
 				score[v.ID] = ScoreMemory
 			case v.Op == OpSelect0 || v.Op == OpSelect1 || v.Op == OpSelectN:
-				if (v.Op == OpSelect1 || v.Op == OpSelect0) && (v.Args[0].isCarry() || v.Type.IsFlags()) {
-					// When the Select pseudo op is being used for a carry or flag from
-					// a tuple then score it as ScoreFlags so it happens later. This
-					// prevents the bit from being clobbered before it is used.
-					score[v.ID] = ScoreFlags
-				} else {
-					score[v.ID] = ScoreReadTuple
-				}
-			case v.isCarry():
-				if w := v.getCarryInput(); w != nil && w.Block == b {
-					// The producing op is not the final user of the carry bit. Its
-					// current score is one of unscored, Flags, or CarryChainTail.
-					// These occur if the producer has not been scored, another user
-					// of the producers carry flag was scored (there are >1 users of
-					// the carry out flag), or it was visited earlier and already
-					// scored CarryChainTail (and prove w is not a tail).
-					score[w.ID] = ScoreFlags
-				}
-				// Verify v has not been scored. If v has not been visited, v may be
-				// the final (tail) operation in a carry chain. If v is not, v will be
-				// rescored above when v's carry-using op is scored. When scoring is done,
-				// only tail operations will retain the CarryChainTail score.
-				if score[v.ID] != ScoreFlags {
-					// Score the tail of carry chain operations to a lower (earlier in the
-					// block) priority. This creates a priority inversion which allows only
-					// one chain to be scheduled, if possible.
-					score[v.ID] = ScoreCarryChainTail
-				}
+				// Tuple selectors need to appear immediately after the instruction
+				// that generates the tuple.
+				score[v.ID] = ScoreReadTuple
+			case v.hasFlagInput():
+				// Schedule flag-reading ops earlier, to minimize the lifetime
+				// of flag values.
+				score[v.ID] = ScoreReadFlags
 			case v.isFlagOp():
 				// Schedule flag register generation as late as possible.
 				// This makes sure that we only have one live flags
 				// value at a time.
+				// Note that this case is after the case above, so values
+				// which both read and generate flags are given ScoreReadFlags.
 				score[v.ID] = ScoreFlags
 			default:
 				score[v.ID] = ScoreDefault
@@ -201,23 +198,35 @@
 				}
 			}
 		}
+		for _, c := range b.ControlValues() {
+			// Force the control values to be scheduled at the end,
+			// unless they have other special priority.
+			if c.Block != b || score[c.ID] < ScoreReadTuple {
+				continue
+			}
+			if score[c.ID] == ScoreReadTuple {
+				score[c.Args[0].ID] = ScoreControl
+				continue
+			}
+			score[c.ID] = ScoreControl
+		}
 	}
+	priq.score = score
+
+	// An edge represents a scheduling constraint that x must appear before y in the schedule.
+	type edge struct {
+		x, y *Value
+	}
+	edges := make([]edge, 0, 64)
+
+	// inEdges is the number of scheduling edges incoming from values that haven't been scheduled yet.
+	// i.e. inEdges[y.ID] = |e in edges where e.y == y and e.x is not in the schedule yet|.
+	inEdges := f.Cache.allocInt32Slice(f.NumValues())
+	defer f.Cache.freeInt32Slice(inEdges)
 
 	for _, b := range f.Blocks {
-		// Find store chain for block.
-		// Store chains for different blocks overwrite each other, so
-		// the calculated store chain is good only for this block.
-		for _, v := range b.Values {
-			if v.Op != OpPhi && v.Type.IsMemory() {
-				for _, w := range v.Args {
-					if w.Type.IsMemory() {
-						nextMem[w.ID] = v
-					}
-				}
-			}
-		}
-
-		// Compute uses.
+		edges = edges[:0]
+		// Standard edges: from the argument of a value to that value.
 		for _, v := range b.Values {
 			if v.Op == OpPhi {
 				// If a value is used by a phi, it does not induce
@@ -225,145 +234,110 @@
 				// previous iteration.
 				continue
 			}
-			for _, w := range v.Args {
-				if w.Block == b {
-					uses[w.ID]++
-				}
-				// Any load must come before the following store.
-				if !v.Type.IsMemory() && w.Type.IsMemory() {
-					// v is a load.
-					s := nextMem[w.ID]
-					if s == nil || s.Block != b {
-						continue
-					}
-					additionalArgs[s.ID] = append(additionalArgs[s.ID], v)
-					uses[v.ID]++
+			for _, a := range v.Args {
+				if a.Block == b {
+					edges = append(edges, edge{a, v})
 				}
 			}
 		}
 
-		for _, c := range b.ControlValues() {
-			// Force the control values to be scheduled at the end,
-			// unless they are phi values (which must be first).
-			// OpArg also goes first -- if it is stack it register allocates
-			// to a LoadReg, if it is register it is from the beginning anyway.
-			if score[c.ID] == ScorePhi || score[c.ID] == ScoreArg {
+		// Find store chain for block.
+		// Store chains for different blocks overwrite each other, so
+		// the calculated store chain is good only for this block.
+		for _, v := range b.Values {
+			if v.Op != OpPhi && v.Op != OpInitMem && v.Type.IsMemory() {
+				nextMem[v.MemoryArg().ID] = v
+			}
+		}
+
+		// Add edges to enforce that any load must come before the following store.
+		for _, v := range b.Values {
+			if v.Op == OpPhi || v.Type.IsMemory() {
 				continue
 			}
-			score[c.ID] = ScoreControl
-
-			// Schedule values dependent on the control values at the end.
-			// This reduces the number of register spills. We don't find
-			// all values that depend on the controls, just values with a
-			// direct dependency. This is cheaper and in testing there
-			// was no difference in the number of spills.
-			for _, v := range b.Values {
-				if v.Op != OpPhi {
-					for _, a := range v.Args {
-						if a == c {
-							score[v.ID] = ScoreControl
-						}
-					}
-				}
+			w := v.MemoryArg()
+			if w == nil {
+				continue
+			}
+			if s := nextMem[w.ID]; s != nil && s.Block == b {
+				edges = append(edges, edge{v, s})
 			}
 		}
 
-		// To put things into a priority queue
-		// The values that should come last are least.
-		priq.score = score
-		priq.a = priq.a[:0]
+		// Sort all the edges by source Value ID.
+		sort.Slice(edges, func(i, j int) bool {
+			return edges[i].x.ID < edges[j].x.ID
+		})
+		// Compute inEdges for values in this block.
+		for _, e := range edges {
+			inEdges[e.y.ID]++
+		}
 
 		// Initialize priority queue with schedulable values.
+		priq.a = priq.a[:0]
 		for _, v := range b.Values {
-			if uses[v.ID] == 0 {
+			if inEdges[v.ID] == 0 {
 				heap.Push(priq, v)
 			}
 		}
 
-		// Schedule highest priority value, update use counts, repeat.
-		order = order[:0]
-		tuples := make(map[ID][]*Value)
+		// Produce the schedule. Pick the highest priority scheduleable value,
+		// add it to the schedule, add any of its uses that are now scheduleable
+		// to the queue, and repeat.
+		nv := len(b.Values)
+		b.Values = b.Values[:0]
 		for priq.Len() > 0 {
-			// Find highest priority schedulable value.
-			// Note that schedule is assembled backwards.
-
+			// Schedule the next schedulable value in priority order.
 			v := heap.Pop(priq).(*Value)
+			b.Values = append(b.Values, v)
 
-			if f.pass.debug > 1 && score[v.ID] == ScoreCarryChainTail && v.isCarry() {
-				// Add some debugging noise if the chain of carrying ops will not
-				// likely be scheduled without potential carry flag clobbers.
-				if !isCarryChainReady(v, uses) {
-					f.Warnl(v.Pos, "carry chain ending with %v not ready", v)
-				}
-			}
-
-			// Add it to the schedule.
-			// Do not emit tuple-reading ops until we're ready to emit the tuple-generating op.
-			//TODO: maybe remove ReadTuple score above, if it does not help on performance
-			switch {
-			case v.Op == OpSelect0:
-				if tuples[v.Args[0].ID] == nil {
-					tuples[v.Args[0].ID] = make([]*Value, 2)
-				}
-				tuples[v.Args[0].ID][0] = v
-			case v.Op == OpSelect1:
-				if tuples[v.Args[0].ID] == nil {
-					tuples[v.Args[0].ID] = make([]*Value, 2)
-				}
-				tuples[v.Args[0].ID][1] = v
-			case v.Op == OpSelectN:
-				if tuples[v.Args[0].ID] == nil {
-					tuples[v.Args[0].ID] = make([]*Value, v.Args[0].Type.NumFields())
-				}
-				tuples[v.Args[0].ID][v.AuxInt] = v
-			case v.Type.IsResults() && tuples[v.ID] != nil:
-				tup := tuples[v.ID]
-				for i := len(tup) - 1; i >= 0; i-- {
-					if tup[i] != nil {
-						order = append(order, tup[i])
-					}
-				}
-				delete(tuples, v.ID)
-				order = append(order, v)
-			case v.Type.IsTuple() && tuples[v.ID] != nil:
-				if tuples[v.ID][1] != nil {
-					order = append(order, tuples[v.ID][1])
-				}
-				if tuples[v.ID][0] != nil {
-					order = append(order, tuples[v.ID][0])
-				}
-				delete(tuples, v.ID)
-				fallthrough
-			default:
-				order = append(order, v)
-			}
-
-			// Update use counts of arguments.
-			for _, w := range v.Args {
-				if w.Block != b {
-					continue
-				}
-				uses[w.ID]--
-				if uses[w.ID] == 0 {
-					// All uses scheduled, w is now schedulable.
-					heap.Push(priq, w)
-				}
-			}
-			for _, w := range additionalArgs[v.ID] {
-				uses[w.ID]--
-				if uses[w.ID] == 0 {
-					// All uses scheduled, w is now schedulable.
-					heap.Push(priq, w)
+			// Find all the scheduling edges out from this value.
+			i := sort.Search(len(edges), func(i int) bool {
+				return edges[i].x.ID >= v.ID
+			})
+			j := sort.Search(len(edges), func(i int) bool {
+				return edges[i].x.ID > v.ID
+			})
+			// Decrement inEdges for each target of edges from v.
+			for _, e := range edges[i:j] {
+				inEdges[e.y.ID]--
+				if inEdges[e.y.ID] == 0 {
+					heap.Push(priq, e.y)
 				}
 			}
 		}
-		if len(order) != len(b.Values) {
+		if len(b.Values) != nv {
 			f.Fatalf("schedule does not include all values in block %s", b)
 		}
-		for i := 0; i < len(b.Values); i++ {
-			b.Values[i] = order[len(b.Values)-1-i]
+	}
+
+	// Remove SPanchored now that we've scheduled.
+	for _, b := range f.Blocks {
+		for _, v := range b.Values {
+			for i, a := range v.Args {
+				if a.Op == OpSPanchored {
+					v.SetArg(i, a.Args[0])
+				}
+			}
 		}
 	}
+	for _, b := range f.Blocks {
+		i := 0
+		for _, v := range b.Values {
+			if v.Op == OpSPanchored {
+				// Free this value
+				if v.Uses != 0 {
+					base.Fatalf("SPAnchored still has %d uses", v.Uses)
+				}
+				v.resetArgs()
+				f.freeValue(v)
+			} else {
+				b.Values[i] = v
+				i++
+			}
+		}
+		b.truncateValues(i)
+	}
 
 	f.scheduled = true
 }
@@ -555,74 +529,32 @@
 
 // isFlagOp reports if v is an OP with the flag type.
 func (v *Value) isFlagOp() bool {
-	return v.Type.IsFlags() || v.Type.IsTuple() && v.Type.FieldType(1).IsFlags()
-}
-
-// isCarryChainReady reports whether all dependent carry ops can be scheduled after this.
-func isCarryChainReady(v *Value, uses []int32) bool {
-	// A chain can be scheduled in it's entirety if
-	// the use count of each dependent op is 1. If none,
-	// schedule the first.
-	j := 1 // The first op uses[k.ID] == 0. Dependent ops are always >= 1.
-	for k := v; k != nil; k = k.getCarryInput() {
-		j += int(uses[k.ID]) - 1
+	if v.Type.IsFlags() || v.Type.IsTuple() && v.Type.FieldType(1).IsFlags() {
+		return true
 	}
-	return j == 0
+	// PPC64 carry generators put their carry in a non-flag-typed register
+	// in their output.
+	switch v.Op {
+	case OpPPC64SUBC, OpPPC64ADDC, OpPPC64SUBCconst, OpPPC64ADDCconst:
+		return true
+	}
+	return false
 }
 
-// isCarryInput reports whether v accepts a carry value as input.
-func (v *Value) isCarryInput() bool {
-	return v.getCarryInput() != nil
-}
-
-// isCarryOutput reports whether v generates a carry as output.
-func (v *Value) isCarryOutput() bool {
-	// special cases for PPC64 which put their carry values in XER instead of flags
-	switch v.Block.Func.Config.arch {
-	case "ppc64", "ppc64le":
-		switch v.Op {
-		case OpPPC64SUBC, OpPPC64ADDC, OpPPC64SUBCconst, OpPPC64ADDCconst:
+// hasFlagInput reports whether v has a flag value as any of its inputs.
+func (v *Value) hasFlagInput() bool {
+	for _, a := range v.Args {
+		if a.isFlagOp() {
 			return true
 		}
-		return false
 	}
-	return v.isFlagOp() && v.Op != OpSelect1
-}
-
-// isCarryCreator reports whether op is an operation which produces a carry bit value,
-// but does not consume it.
-func (v *Value) isCarryCreator() bool {
-	return v.isCarryOutput() && !v.isCarryInput()
-}
-
-// isCarry reports whether op consumes or creates a carry a bit value.
-func (v *Value) isCarry() bool {
-	return v.isCarryOutput() || v.isCarryInput()
-}
-
-// getCarryInput returns the producing *Value of the carry bit of this op, or nil if none.
-func (v *Value) getCarryInput() *Value {
-	// special cases for PPC64 which put their carry values in XER instead of flags
-	switch v.Block.Func.Config.arch {
-	case "ppc64", "ppc64le":
-		switch v.Op {
-		case OpPPC64SUBE, OpPPC64ADDE, OpPPC64SUBZEzero, OpPPC64ADDZEzero:
-			// PPC64 carry dependencies are conveyed through their final argument.
-			// Likewise, there is always an OpSelect1 between them.
-			return v.Args[len(v.Args)-1].Args[0]
-		}
-		return nil
+	// PPC64 carry dependencies are conveyed through their final argument,
+	// so we treat those operations as taking flags as well.
+	switch v.Op {
+	case OpPPC64SUBE, OpPPC64ADDE, OpPPC64SUBZEzero, OpPPC64ADDZEzero:
+		return true
 	}
-	for _, a := range v.Args {
-		if !a.isFlagOp() {
-			continue
-		}
-		if a.Op == OpSelect1 {
-			a = a.Args[0]
-		}
-		return a
-	}
-	return nil
+	return false
 }
 
 type bySourcePos []*Value
diff --git a/src/cmd/compile/internal/ssa/stmtlines_test.go b/src/cmd/compile/internal/ssa/stmtlines_test.go
index 4dadfe8..79bcab0 100644
--- a/src/cmd/compile/internal/ssa/stmtlines_test.go
+++ b/src/cmd/compile/internal/ssa/stmtlines_test.go
@@ -12,6 +12,7 @@
 	"debug/macho"
 	"debug/pe"
 	"fmt"
+	"internal/platform"
 	"internal/testenv"
 	"internal/xcoff"
 	"io"
@@ -53,8 +54,8 @@
 }
 
 func TestStmtLines(t *testing.T) {
-	if runtime.GOOS == "plan9" {
-		t.Skip("skipping on plan9; no DWARF symbol table in executables")
+	if !platform.ExecutableHasDWARF(runtime.GOOS, runtime.GOARCH) {
+		t.Skipf("skipping on %s/%s: no DWARF symbol table in executables", runtime.GOOS, runtime.GOARCH)
 	}
 
 	if runtime.GOOS == "aix" {
@@ -75,8 +76,15 @@
 		}
 	}
 
+	// Build cmd/go forcing DWARF enabled, as a large test case.
+	dir := t.TempDir()
+	out, err := testenv.Command(t, testenv.GoToolPath(t), "build", "-ldflags=-w=0", "-o", dir+"/test.exe", "cmd/go").CombinedOutput()
+	if err != nil {
+		t.Fatalf("go build: %v\n%s", err, out)
+	}
+
 	lines := map[Line]bool{}
-	dw, err := open(testenv.GoToolPath(t))
+	dw, err := open(dir + "/test.exe")
 	must(err)
 	rdr := dw.Reader()
 	rdr.Seek(0)
diff --git a/src/cmd/compile/internal/ssa/tighten.go b/src/cmd/compile/internal/ssa/tighten.go
index edae6a1..85b6a84 100644
--- a/src/cmd/compile/internal/ssa/tighten.go
+++ b/src/cmd/compile/internal/ssa/tighten.go
@@ -4,14 +4,31 @@
 
 package ssa
 
+import "cmd/compile/internal/base"
+
 // tighten moves Values closer to the Blocks in which they are used.
 // This can reduce the amount of register spilling required,
 // if it doesn't also create more live values.
 // A Value can be moved to any block that
 // dominates all blocks in which it is used.
 func tighten(f *Func) {
+	if base.Flag.N != 0 && len(f.Blocks) < 10000 {
+		// Skip the optimization in -N mode, except for huge functions.
+		// Too many values live across blocks can cause pathological
+		// behavior in the register allocator (see issue 52180).
+		return
+	}
+
 	canMove := f.Cache.allocBoolSlice(f.NumValues())
 	defer f.Cache.freeBoolSlice(canMove)
+
+	// Compute the memory states of each block.
+	startMem := f.Cache.allocValueSlice(f.NumBlocks())
+	defer f.Cache.freeValueSlice(startMem)
+	endMem := f.Cache.allocValueSlice(f.NumBlocks())
+	defer f.Cache.freeValueSlice(endMem)
+	memState(f, startMem, endMem)
+
 	for _, b := range f.Blocks {
 		for _, v := range b.Values {
 			if v.Op.isLoweredGetClosurePtr() {
@@ -26,15 +43,12 @@
 				// SelectN is typically, ultimately, a register.
 				continue
 			}
-			if v.MemoryArg() != nil {
-				// We can't move values which have a memory arg - it might
-				// make two memory values live across a block boundary.
-				continue
-			}
 			// Count arguments which will need a register.
 			narg := 0
 			for _, a := range v.Args {
-				if !a.rematerializeable() {
+				// SP and SB are special registers and have no effect on
+				// the allocation of general-purpose registers.
+				if a.needRegister() && a.Op != OpSB && a.Op != OpSP {
 					narg++
 				}
 			}
@@ -129,6 +143,16 @@
 					// v is not moveable, or is already in correct place.
 					continue
 				}
+				if mem := v.MemoryArg(); mem != nil {
+					if startMem[t.ID] != mem {
+						// We can't move a value with a memory arg unless the target block
+						// has that memory arg as its starting memory.
+						continue
+					}
+				}
+				if f.pass.debug > 0 {
+					b.Func.Warnl(v.Pos, "%v is moved", v.Op)
+				}
 				// Move v to the block which dominates its uses.
 				t.Values = append(t.Values, v)
 				v.Block = t
@@ -165,3 +189,81 @@
 		}
 	}
 }
+
+// memState computes the memory state at the beginning and end of each block of
+// the function. The memory state is represented by a value of mem type.
+// The returned result is stored in startMem and endMem, and endMem is nil for
+// blocks with no successors (Exit,Ret,RetJmp blocks). This algorithm is not
+// suitable for infinite loop blocks that do not contain any mem operations.
+// For example:
+// b1:
+//
+//	(some values)
+//
+// plain -> b2
+// b2: <- b1 b2
+// Plain -> b2
+//
+// Algorithm introduction:
+//  1. The start memory state of a block is InitMem, a Phi node of type mem or
+//     an incoming memory value.
+//  2. The start memory state of a block is consistent with the end memory state
+//     of its parent nodes. If the start memory state of a block is a Phi value,
+//     then the end memory state of its parent nodes is consistent with the
+//     corresponding argument value of the Phi node.
+//  3. The algorithm first obtains the memory state of some blocks in the tree
+//     in the first step. Then floods the known memory state to other nodes in
+//     the second step.
+func memState(f *Func, startMem, endMem []*Value) {
+	// This slice contains the set of blocks that have had their startMem set but this
+	// startMem value has not yet been propagated to the endMem of its predecessors
+	changed := make([]*Block, 0)
+	// First step, init the memory state of some blocks.
+	for _, b := range f.Blocks {
+		for _, v := range b.Values {
+			var mem *Value
+			if v.Op == OpPhi {
+				if v.Type.IsMemory() {
+					mem = v
+				}
+			} else if v.Op == OpInitMem {
+				mem = v // This is actually not needed.
+			} else if a := v.MemoryArg(); a != nil && a.Block != b {
+				// The only incoming memory value doesn't belong to this block.
+				mem = a
+			}
+			if mem != nil {
+				if old := startMem[b.ID]; old != nil {
+					if old == mem {
+						continue
+					}
+					f.Fatalf("func %s, startMem[%v] has different values, old %v, new %v", f.Name, b, old, mem)
+				}
+				startMem[b.ID] = mem
+				changed = append(changed, b)
+			}
+		}
+	}
+
+	// Second step, floods the known memory state of some blocks to others.
+	for len(changed) != 0 {
+		top := changed[0]
+		changed = changed[1:]
+		mem := startMem[top.ID]
+		for i, p := range top.Preds {
+			pb := p.b
+			if endMem[pb.ID] != nil {
+				continue
+			}
+			if mem.Op == OpPhi && mem.Block == top {
+				endMem[pb.ID] = mem.Args[i]
+			} else {
+				endMem[pb.ID] = mem
+			}
+			if startMem[pb.ID] == nil {
+				startMem[pb.ID] = endMem[pb.ID]
+				changed = append(changed, pb)
+			}
+		}
+	}
+}
diff --git a/src/cmd/compile/internal/ssa/value.go b/src/cmd/compile/internal/ssa/value.go
index 643fa36..e89024b 100644
--- a/src/cmd/compile/internal/ssa/value.go
+++ b/src/cmd/compile/internal/ssa/value.go
@@ -84,6 +84,13 @@
 	return int8(v.AuxInt)
 }
 
+func (v *Value) AuxUInt8() uint8 {
+	if opcodeTable[v.Op].auxType != auxUInt8 {
+		v.Fatalf("op %s doesn't have a uint8 aux field", v.Op)
+	}
+	return uint8(v.AuxInt)
+}
+
 func (v *Value) AuxInt16() int16 {
 	if opcodeTable[v.Op].auxType != auxInt16 {
 		v.Fatalf("op %s doesn't have an int16 aux field", v.Op)
@@ -190,6 +197,8 @@
 		return fmt.Sprintf(" [%d]", v.AuxInt32())
 	case auxInt64, auxInt128:
 		return fmt.Sprintf(" [%d]", v.AuxInt)
+	case auxUInt8:
+		return fmt.Sprintf(" [%d]", v.AuxUInt8())
 	case auxARM64BitField:
 		lsb := v.AuxArm64BitField().getARM64BFlsb()
 		width := v.AuxArm64BitField().getARM64BFwidth()
@@ -202,6 +211,7 @@
 		if v.Aux != nil {
 			return fmt.Sprintf(" {%v}", v.Aux)
 		}
+		return ""
 	case auxSymOff, auxCallOff, auxTypSize, auxNameOffsetInt8:
 		s := ""
 		if v.Aux != nil {
@@ -223,8 +233,12 @@
 		return fmt.Sprintf(" {%v}", v.Aux)
 	case auxFlagConstant:
 		return fmt.Sprintf("[%s]", flagConstant(v.AuxInt))
+	case auxNone:
+		return ""
+	default:
+		// If you see this, add a case above instead.
+		return fmt.Sprintf("[auxtype=%d AuxInt=%d Aux=%v]", opcodeTable[v.Op].auxType, v.AuxInt, v.Aux)
 	}
-	return ""
 }
 
 // If/when midstack inlining is enabled (-l=4), the compiler gets both larger and slower.
@@ -554,9 +568,6 @@
 	return true
 }
 
-// TODO(mdempsky): Shouldn't be necessary; see discussion at golang.org/cl/275756
-func (*Value) CanBeAnSSAAux() {}
-
 // AutoVar returns a *Name and int64 representing the auto variable and offset within it
 // where v should be spilled.
 func AutoVar(v *Value) (*ir.Name, int64) {
diff --git a/src/cmd/compile/internal/ssa/writebarrier.go b/src/cmd/compile/internal/ssa/writebarrier.go
index 1676a93..bd9e0b8 100644
--- a/src/cmd/compile/internal/ssa/writebarrier.go
+++ b/src/cmd/compile/internal/ssa/writebarrier.go
@@ -11,6 +11,7 @@
 	"cmd/internal/objabi"
 	"cmd/internal/src"
 	"fmt"
+	"internal/buildcfg"
 )
 
 // A ZeroRegion records parts of an object which are known to be zero.
@@ -24,10 +25,63 @@
 	mask uint64
 }
 
+// mightBeHeapPointer reports whether v might point to the heap.
+// v must have pointer type.
+func mightBeHeapPointer(v *Value) bool {
+	if IsGlobalAddr(v) {
+		return false
+	}
+	return true
+}
+
+// mightContainHeapPointer reports whether the data currently at addresses
+// [ptr,ptr+size) might contain heap pointers. "currently" means at memory state mem.
+// zeroes contains ZeroRegion data to help make that decision (see computeZeroMap).
+func mightContainHeapPointer(ptr *Value, size int64, mem *Value, zeroes map[ID]ZeroRegion) bool {
+	if IsReadOnlyGlobalAddr(ptr) {
+		// The read-only globals section cannot contain any heap pointers.
+		return false
+	}
+
+	// See if we can prove that the queried memory is all zero.
+
+	// Find base pointer and offset. Hopefully, the base is the result of a new(T).
+	var off int64
+	for ptr.Op == OpOffPtr {
+		off += ptr.AuxInt
+		ptr = ptr.Args[0]
+	}
+
+	ptrSize := ptr.Block.Func.Config.PtrSize
+	if off%ptrSize != 0 {
+		return true // see issue 61187
+	}
+	if size%ptrSize != 0 {
+		ptr.Fatalf("unaligned pointer write")
+	}
+	if off < 0 || off+size > 64*ptrSize {
+		// memory range goes off end of tracked offsets
+		return true
+	}
+	z := zeroes[mem.ID]
+	if ptr != z.base {
+		// This isn't the object we know about at this memory state.
+		return true
+	}
+	// Mask of bits we're asking about
+	m := (uint64(1)<<(size/ptrSize) - 1) << (off / ptrSize)
+
+	if z.mask&m == m {
+		// All locations are known to be zero, so no heap pointers.
+		return false
+	}
+	return true
+}
+
 // needwb reports whether we need write barrier for store op v.
 // v must be Store/Move/Zero.
 // zeroes provides known zero information (keyed by ID of memory-type values).
-func needwb(v *Value, zeroes map[ID]ZeroRegion, select1 []*Value) bool {
+func needwb(v *Value, zeroes map[ID]ZeroRegion) bool {
 	t, ok := v.Aux.(*types.Type)
 	if !ok {
 		v.Fatalf("store aux is not a type: %s", v.LongString())
@@ -35,56 +89,75 @@
 	if !t.HasPointers() {
 		return false
 	}
-	if IsStackAddr(v.Args[0]) {
-		return false // write on stack doesn't need write barrier
+	dst := v.Args[0]
+	if IsStackAddr(dst) {
+		return false // writes into the stack don't need write barrier
 	}
-	if v.Op == OpMove && IsReadOnlyGlobalAddr(v.Args[1]) {
-		if mem, ok := IsNewObject(v.Args[0], select1); ok && mem == v.MemoryArg() {
-			// Copying data from readonly memory into a fresh object doesn't need a write barrier.
+	// If we're writing to a place that might have heap pointers, we need
+	// the write barrier.
+	if mightContainHeapPointer(dst, t.Size(), v.MemoryArg(), zeroes) {
+		return true
+	}
+	// Lastly, check if the values we're writing might be heap pointers.
+	// If they aren't, we don't need a write barrier.
+	switch v.Op {
+	case OpStore:
+		if !mightBeHeapPointer(v.Args[1]) {
 			return false
 		}
-	}
-	if v.Op == OpStore && IsGlobalAddr(v.Args[1]) {
-		// Storing pointers to non-heap locations into zeroed memory doesn't need a write barrier.
-		ptr := v.Args[0]
-		var off int64
-		size := v.Aux.(*types.Type).Size()
-		for ptr.Op == OpOffPtr {
-			off += ptr.AuxInt
-			ptr = ptr.Args[0]
+	case OpZero:
+		return false // nil is not a heap pointer
+	case OpMove:
+		if !mightContainHeapPointer(v.Args[1], t.Size(), v.Args[2], zeroes) {
+			return false
 		}
-		ptrSize := v.Block.Func.Config.PtrSize
-		if off%ptrSize != 0 || size%ptrSize != 0 {
-			v.Fatalf("unaligned pointer write")
-		}
-		if off < 0 || off+size > 64*ptrSize {
-			// write goes off end of tracked offsets
-			return true
-		}
-		z := zeroes[v.MemoryArg().ID]
-		if ptr != z.base {
-			return true
-		}
-		for i := off; i < off+size; i += ptrSize {
-			if z.mask>>uint(i/ptrSize)&1 == 0 {
-				return true // not known to be zero
-			}
-		}
-		// All written locations are known to be zero - write barrier not needed.
-		return false
+	default:
+		v.Fatalf("store op unknown: %s", v.LongString())
 	}
 	return true
 }
 
+// needWBsrc reports whether GC needs to see v when it is the source of a store.
+func needWBsrc(v *Value) bool {
+	return !IsGlobalAddr(v)
+}
+
+// needWBdst reports whether GC needs to see what used to be in *ptr when ptr is
+// the target of a pointer store.
+func needWBdst(ptr, mem *Value, zeroes map[ID]ZeroRegion) bool {
+	// Detect storing to zeroed memory.
+	var off int64
+	for ptr.Op == OpOffPtr {
+		off += ptr.AuxInt
+		ptr = ptr.Args[0]
+	}
+	ptrSize := ptr.Block.Func.Config.PtrSize
+	if off%ptrSize != 0 {
+		return true // see issue 61187
+	}
+	if off < 0 || off >= 64*ptrSize {
+		// write goes off end of tracked offsets
+		return true
+	}
+	z := zeroes[mem.ID]
+	if ptr != z.base {
+		return true
+	}
+	// If destination is known to be zeroed, we don't need the write barrier
+	// to record the old value in *ptr.
+	return z.mask>>uint(off/ptrSize)&1 == 0
+}
+
 // writebarrier pass inserts write barriers for store ops (Store, Move, Zero)
 // when necessary (the condition above). It rewrites store ops to branches
 // and runtime calls, like
 //
 //	if writeBarrier.enabled {
-//		gcWriteBarrier(ptr, val)	// Not a regular Go call
-//	} else {
-//		*ptr = val
+//		buf := gcWriteBarrier2()	// Not a regular Go call
+//		buf[0] = val
+//		buf[1] = *ptr
 //	}
+//	*ptr = val
 //
 // A sequence of WB stores for many pointer fields of a single type will
 // be emitted together, with a single branch.
@@ -93,10 +166,16 @@
 		return
 	}
 
+	// Number of write buffer entries we can request at once.
+	// Must match runtime/mwbbuf.go:wbMaxEntriesPerCall.
+	// It must also match the number of instances of runtime.gcWriteBarrier{X}.
+	const maxEntries = 8
+
 	var sb, sp, wbaddr, const0 *Value
-	var typedmemmove, typedmemclr, gcWriteBarrier *obj.LSym
+	var cgoCheckPtrWrite, cgoCheckMemmove *obj.LSym
+	var wbZero, wbMove *obj.LSym
 	var stores, after []*Value
-	var sset *sparseSet
+	var sset, sset2 *sparseSet
 	var storeNumber []int32
 
 	// Compute map from a value to the SelectN [1] value that uses it.
@@ -122,7 +201,7 @@
 		for _, v := range b.Values {
 			switch v.Op {
 			case OpStore, OpMove, OpZero:
-				if needwb(v, zeroes, select1) {
+				if needwb(v, zeroes) {
 					switch v.Op {
 					case OpStore:
 						v.Op = OpStoreWB
@@ -146,22 +225,25 @@
 			sp, sb = f.spSb()
 			wbsym := f.fe.Syslook("writeBarrier")
 			wbaddr = f.Entry.NewValue1A(initpos, OpAddr, f.Config.Types.UInt32Ptr, wbsym, sb)
-			gcWriteBarrier = f.fe.Syslook("gcWriteBarrier")
-			typedmemmove = f.fe.Syslook("typedmemmove")
-			typedmemclr = f.fe.Syslook("typedmemclr")
+			wbZero = f.fe.Syslook("wbZero")
+			wbMove = f.fe.Syslook("wbMove")
+			if buildcfg.Experiment.CgoCheck2 {
+				cgoCheckPtrWrite = f.fe.Syslook("cgoCheckPtrWrite")
+				cgoCheckMemmove = f.fe.Syslook("cgoCheckMemmove")
+			}
 			const0 = f.ConstInt32(f.Config.Types.UInt32, 0)
 
 			// allocate auxiliary data structures for computing store order
 			sset = f.newSparseSet(f.NumValues())
 			defer f.retSparseSet(sset)
+			sset2 = f.newSparseSet(f.NumValues())
+			defer f.retSparseSet(sset2)
 			storeNumber = f.Cache.allocInt32Slice(f.NumValues())
 			defer f.Cache.freeInt32Slice(storeNumber)
 		}
 
 		// order values in store order
 		b.Values = storeOrder(b.Values, sset, storeNumber)
-
-		firstSplit := true
 	again:
 		// find the start and end of the last contiguous WB store sequence.
 		// a branch will be inserted there. values after it will be moved
@@ -195,15 +277,58 @@
 		// find the memory before the WB stores
 		mem := stores[0].MemoryArg()
 		pos := stores[0].Pos
+
+		// If the source of a MoveWB is volatile (will be clobbered by a
+		// function call), we need to copy it to a temporary location, as
+		// marshaling the args of wbMove might clobber the value we're
+		// trying to move.
+		// Look for volatile source, copy it to temporary before we check
+		// the write barrier flag.
+		// It is unlikely to have more than one of them. Just do a linear
+		// search instead of using a map.
+		// See issue 15854.
+		type volatileCopy struct {
+			src *Value // address of original volatile value
+			tmp *Value // address of temporary we've copied the volatile value into
+		}
+		var volatiles []volatileCopy
+
+		if !(f.ABIDefault == f.ABI1 && len(f.Config.intParamRegs) >= 3) {
+			// We don't need to do this if the calls we're going to do take
+			// all their arguments in registers.
+			// 3 is the magic number because it covers wbZero, wbMove, cgoCheckMemmove.
+		copyLoop:
+			for _, w := range stores {
+				if w.Op == OpMoveWB {
+					val := w.Args[1]
+					if isVolatile(val) {
+						for _, c := range volatiles {
+							if val == c.src {
+								continue copyLoop // already copied
+							}
+						}
+
+						t := val.Type.Elem()
+						tmp := f.fe.Auto(w.Pos, t)
+						mem = b.NewValue1A(w.Pos, OpVarDef, types.TypeMem, tmp, mem)
+						tmpaddr := b.NewValue2A(w.Pos, OpLocalAddr, t.PtrTo(), tmp, sp, mem)
+						siz := t.Size()
+						mem = b.NewValue3I(w.Pos, OpMove, types.TypeMem, siz, tmpaddr, val, mem)
+						mem.Aux = t
+						volatiles = append(volatiles, volatileCopy{val, tmpaddr})
+					}
+				}
+			}
+		}
+
+		// Build branch point.
 		bThen := f.NewBlock(BlockPlain)
-		bElse := f.NewBlock(BlockPlain)
 		bEnd := f.NewBlock(b.Kind)
 		bThen.Pos = pos
-		bElse.Pos = pos
 		bEnd.Pos = b.Pos
 		b.Pos = pos
 
-		// set up control flow for end block
+		// Set up control flow for end block.
 		bEnd.CopyControls(b)
 		bEnd.Likely = b.Likely
 		for _, e := range b.Succs {
@@ -221,133 +346,158 @@
 		b.Likely = BranchUnlikely
 		b.Succs = b.Succs[:0]
 		b.AddEdgeTo(bThen)
-		b.AddEdgeTo(bElse)
-		// TODO: For OpStoreWB and the buffered write barrier,
-		// we could move the write out of the write barrier,
-		// which would lead to fewer branches. We could do
-		// something similar to OpZeroWB, since the runtime
-		// could provide just the barrier half and then we
-		// could unconditionally do an OpZero (which could
-		// also generate better zeroing code). OpMoveWB is
-		// trickier and would require changing how
-		// cgoCheckMemmove works.
+		b.AddEdgeTo(bEnd)
 		bThen.AddEdgeTo(bEnd)
-		bElse.AddEdgeTo(bEnd)
 
-		// for each write barrier store, append write barrier version to bThen
-		// and simple store version to bElse
+		// For each write barrier store, append write barrier code to bThen.
 		memThen := mem
-		memElse := mem
-
-		// If the source of a MoveWB is volatile (will be clobbered by a
-		// function call), we need to copy it to a temporary location, as
-		// marshaling the args of typedmemmove might clobber the value we're
-		// trying to move.
-		// Look for volatile source, copy it to temporary before we emit any
-		// call.
-		// It is unlikely to have more than one of them. Just do a linear
-		// search instead of using a map.
-		type volatileCopy struct {
-			src *Value // address of original volatile value
-			tmp *Value // address of temporary we've copied the volatile value into
-		}
-		var volatiles []volatileCopy
-	copyLoop:
-		for _, w := range stores {
-			if w.Op == OpMoveWB {
-				val := w.Args[1]
-				if isVolatile(val) {
-					for _, c := range volatiles {
-						if val == c.src {
-							continue copyLoop // already copied
-						}
-					}
-
-					t := val.Type.Elem()
-					tmp := f.fe.Auto(w.Pos, t)
-					memThen = bThen.NewValue1A(w.Pos, OpVarDef, types.TypeMem, tmp, memThen)
-					tmpaddr := bThen.NewValue2A(w.Pos, OpLocalAddr, t.PtrTo(), tmp, sp, memThen)
-					siz := t.Size()
-					memThen = bThen.NewValue3I(w.Pos, OpMove, types.TypeMem, siz, tmpaddr, val, memThen)
-					memThen.Aux = t
-					volatiles = append(volatiles, volatileCopy{val, tmpaddr})
-				}
+		var curCall *Value
+		var curPtr *Value
+		addEntry := func(v *Value) {
+			if curCall == nil || curCall.AuxInt == maxEntries {
+				t := types.NewTuple(types.Types[types.TUINTPTR].PtrTo(), types.TypeMem)
+				curCall = bThen.NewValue1(pos, OpWB, t, memThen)
+				curPtr = bThen.NewValue1(pos, OpSelect0, types.Types[types.TUINTPTR].PtrTo(), curCall)
+				memThen = bThen.NewValue1(pos, OpSelect1, types.TypeMem, curCall)
 			}
+			// Store value in write buffer
+			num := curCall.AuxInt
+			curCall.AuxInt = num + 1
+			wbuf := bThen.NewValue1I(pos, OpOffPtr, types.Types[types.TUINTPTR].PtrTo(), num*f.Config.PtrSize, curPtr)
+			memThen = bThen.NewValue3A(pos, OpStore, types.TypeMem, types.Types[types.TUINTPTR], wbuf, v, memThen)
 		}
 
+		// Note: we can issue the write barrier code in any order. In particular,
+		// it doesn't matter if they are in a different order *even if* they end
+		// up referring to overlapping memory regions. For instance if an OpStore
+		// stores to a location that is later read by an OpMove. In all cases
+		// any pointers we must get into the write barrier buffer still make it,
+		// possibly in a different order and possibly a different (but definitely
+		// more than 0) number of times.
+		// In light of that, we process all the OpStoreWBs first. This minimizes
+		// the amount of spill/restore code we need around the Zero/Move calls.
+
+		// srcs contains the value IDs of pointer values we've put in the write barrier buffer.
+		srcs := sset
+		srcs.clear()
+		// dsts contains the value IDs of locations which we've read a pointer out of
+		// and put the result in the write barrier buffer.
+		dsts := sset2
+		dsts.clear()
+
 		for _, w := range stores {
-			ptr := w.Args[0]
+			if w.Op != OpStoreWB {
+				continue
+			}
 			pos := w.Pos
+			ptr := w.Args[0]
+			val := w.Args[1]
+			if !srcs.contains(val.ID) && needWBsrc(val) {
+				srcs.add(val.ID)
+				addEntry(val)
+			}
+			if !dsts.contains(ptr.ID) && needWBdst(ptr, w.Args[2], zeroes) {
+				dsts.add(ptr.ID)
+				// Load old value from store target.
+				// Note: This turns bad pointer writes into bad
+				// pointer reads, which could be confusing. We could avoid
+				// reading from obviously bad pointers, which would
+				// take care of the vast majority of these. We could
+				// patch this up in the signal handler, or use XCHG to
+				// combine the read and the write.
+				oldVal := bThen.NewValue2(pos, OpLoad, types.Types[types.TUINTPTR], ptr, memThen)
+				// Save old value to write buffer.
+				addEntry(oldVal)
+			}
+			f.fe.Func().SetWBPos(pos)
+			nWBops--
+		}
 
-			var fn *obj.LSym
-			var typ *obj.LSym
-			var val *Value
+		for _, w := range stores {
+			pos := w.Pos
 			switch w.Op {
-			case OpStoreWB:
-				val = w.Args[1]
+			case OpZeroWB:
+				dst := w.Args[0]
+				typ := reflectdata.TypeLinksym(w.Aux.(*types.Type))
+				// zeroWB(&typ, dst)
+				taddr := b.NewValue1A(pos, OpAddr, b.Func.Config.Types.Uintptr, typ, sb)
+				memThen = wbcall(pos, bThen, wbZero, sp, memThen, taddr, dst)
+				f.fe.Func().SetWBPos(pos)
 				nWBops--
 			case OpMoveWB:
-				fn = typedmemmove
-				val = w.Args[1]
-				typ = reflectdata.TypeLinksym(w.Aux.(*types.Type))
-				nWBops--
-			case OpZeroWB:
-				fn = typedmemclr
-				typ = reflectdata.TypeLinksym(w.Aux.(*types.Type))
-				nWBops--
-			case OpVarDef, OpVarLive:
-			}
-
-			// then block: emit write barrier call
-			switch w.Op {
-			case OpStoreWB, OpMoveWB, OpZeroWB:
-				if w.Op == OpStoreWB {
-					memThen = bThen.NewValue3A(pos, OpWB, types.TypeMem, gcWriteBarrier, ptr, val, memThen)
-				} else {
-					srcval := val
-					if w.Op == OpMoveWB && isVolatile(srcval) {
-						for _, c := range volatiles {
-							if srcval == c.src {
-								srcval = c.tmp
-								break
-							}
+				dst := w.Args[0]
+				src := w.Args[1]
+				if isVolatile(src) {
+					for _, c := range volatiles {
+						if src == c.src {
+							src = c.tmp
+							break
 						}
 					}
-					memThen = wbcall(pos, bThen, fn, typ, ptr, srcval, memThen, sp, sb)
 				}
-				// Note that we set up a writebarrier function call.
-				f.fe.SetWBPos(pos)
-			case OpVarDef, OpVarLive:
-				memThen = bThen.NewValue1A(pos, w.Op, types.TypeMem, w.Aux, memThen)
-			}
-
-			// else block: normal store
-			switch w.Op {
-			case OpStoreWB:
-				memElse = bElse.NewValue3A(pos, OpStore, types.TypeMem, w.Aux, ptr, val, memElse)
-			case OpMoveWB:
-				memElse = bElse.NewValue3I(pos, OpMove, types.TypeMem, w.AuxInt, ptr, val, memElse)
-				memElse.Aux = w.Aux
-			case OpZeroWB:
-				memElse = bElse.NewValue2I(pos, OpZero, types.TypeMem, w.AuxInt, ptr, memElse)
-				memElse.Aux = w.Aux
-			case OpVarDef, OpVarLive:
-				memElse = bElse.NewValue1A(pos, w.Op, types.TypeMem, w.Aux, memElse)
+				typ := reflectdata.TypeLinksym(w.Aux.(*types.Type))
+				// moveWB(&typ, dst, src)
+				taddr := b.NewValue1A(pos, OpAddr, b.Func.Config.Types.Uintptr, typ, sb)
+				memThen = wbcall(pos, bThen, wbMove, sp, memThen, taddr, dst, src)
+				f.fe.Func().SetWBPos(pos)
+				nWBops--
 			}
 		}
 
 		// merge memory
-		// Splice memory Phi into the last memory of the original sequence,
-		// which may be used in subsequent blocks. Other memories in the
-		// sequence must be dead after this block since there can be only
-		// one memory live.
+		mem = bEnd.NewValue2(pos, OpPhi, types.TypeMem, mem, memThen)
+
+		// Do raw stores after merge point.
+		for _, w := range stores {
+			switch w.Op {
+			case OpStoreWB:
+				ptr := w.Args[0]
+				val := w.Args[1]
+				if buildcfg.Experiment.CgoCheck2 {
+					// Issue cgo checking code.
+					mem = wbcall(pos, bEnd, cgoCheckPtrWrite, sp, mem, ptr, val)
+				}
+				mem = bEnd.NewValue3A(pos, OpStore, types.TypeMem, w.Aux, ptr, val, mem)
+			case OpZeroWB:
+				dst := w.Args[0]
+				mem = bEnd.NewValue2I(pos, OpZero, types.TypeMem, w.AuxInt, dst, mem)
+				mem.Aux = w.Aux
+			case OpMoveWB:
+				dst := w.Args[0]
+				src := w.Args[1]
+				if isVolatile(src) {
+					for _, c := range volatiles {
+						if src == c.src {
+							src = c.tmp
+							break
+						}
+					}
+				}
+				if buildcfg.Experiment.CgoCheck2 {
+					// Issue cgo checking code.
+					typ := reflectdata.TypeLinksym(w.Aux.(*types.Type))
+					taddr := b.NewValue1A(pos, OpAddr, b.Func.Config.Types.Uintptr, typ, sb)
+					mem = wbcall(pos, bEnd, cgoCheckMemmove, sp, mem, taddr, dst, src)
+				}
+				mem = bEnd.NewValue3I(pos, OpMove, types.TypeMem, w.AuxInt, dst, src, mem)
+				mem.Aux = w.Aux
+			case OpVarDef, OpVarLive:
+				mem = bEnd.NewValue1A(pos, w.Op, types.TypeMem, w.Aux, mem)
+			}
+		}
+
+		// The last store becomes the WBend marker. This marker is used by the liveness
+		// pass to determine what parts of the code are preemption-unsafe.
+		// All subsequent memory operations use this memory, so we have to sacrifice the
+		// previous last memory op to become this new value.
 		bEnd.Values = append(bEnd.Values, last)
 		last.Block = bEnd
-		last.reset(OpPhi)
+		last.reset(OpWBend)
 		last.Pos = last.Pos.WithNotStmt()
 		last.Type = types.TypeMem
-		last.AddArg(memThen)
-		last.AddArg(memElse)
+		last.AddArg(mem)
+
+		// Free all the old stores, except last which became the WBend marker.
 		for _, w := range stores {
 			if w != last {
 				w.resetArgs()
@@ -365,23 +515,6 @@
 			w.Block = bEnd
 		}
 
-		// Preemption is unsafe between loading the write
-		// barrier-enabled flag and performing the write
-		// because that would allow a GC phase transition,
-		// which would invalidate the flag. Remember the
-		// conditional block so liveness analysis can disable
-		// safe-points. This is somewhat subtle because we're
-		// splitting b bottom-up.
-		if firstSplit {
-			// Add b itself.
-			b.Func.WBLoads = append(b.Func.WBLoads, b)
-			firstSplit = false
-		} else {
-			// We've already split b, so we just pushed a
-			// write barrier test into bEnd.
-			b.Func.WBLoads = append(b.Func.WBLoads, bEnd)
-		}
-
 		// if we have more stores in this block, do this block again
 		if nWBops > 0 {
 			goto again
@@ -497,58 +630,35 @@
 }
 
 // wbcall emits write barrier runtime call in b, returns memory.
-func wbcall(pos src.XPos, b *Block, fn, typ *obj.LSym, ptr, val, mem, sp, sb *Value) *Value {
+func wbcall(pos src.XPos, b *Block, fn *obj.LSym, sp, mem *Value, args ...*Value) *Value {
 	config := b.Func.Config
+	typ := config.Types.Uintptr // type of all argument values
+	nargs := len(args)
 
-	var wbargs []*Value
 	// TODO (register args) this is a bit of a hack.
 	inRegs := b.Func.ABIDefault == b.Func.ABI1 && len(config.intParamRegs) >= 3
 
-	// put arguments on stack
-	off := config.ctxt.Arch.FixedFrameSize
-
-	var argTypes []*types.Type
-	if typ != nil { // for typedmemmove
-		taddr := b.NewValue1A(pos, OpAddr, b.Func.Config.Types.Uintptr, typ, sb)
-		argTypes = append(argTypes, b.Func.Config.Types.Uintptr)
-		off = round(off, taddr.Type.Alignment())
-		if inRegs {
-			wbargs = append(wbargs, taddr)
-		} else {
-			arg := b.NewValue1I(pos, OpOffPtr, taddr.Type.PtrTo(), off, sp)
-			mem = b.NewValue3A(pos, OpStore, types.TypeMem, ptr.Type, arg, taddr, mem)
+	if !inRegs {
+		// Store arguments to the appropriate stack slot.
+		off := config.ctxt.Arch.FixedFrameSize
+		for _, arg := range args {
+			stkaddr := b.NewValue1I(pos, OpOffPtr, typ.PtrTo(), off, sp)
+			mem = b.NewValue3A(pos, OpStore, types.TypeMem, typ, stkaddr, arg, mem)
+			off += typ.Size()
 		}
-		off += taddr.Type.Size()
+		args = args[:0]
 	}
 
-	argTypes = append(argTypes, ptr.Type)
-	off = round(off, ptr.Type.Alignment())
-	if inRegs {
-		wbargs = append(wbargs, ptr)
-	} else {
-		arg := b.NewValue1I(pos, OpOffPtr, ptr.Type.PtrTo(), off, sp)
-		mem = b.NewValue3A(pos, OpStore, types.TypeMem, ptr.Type, arg, ptr, mem)
-	}
-	off += ptr.Type.Size()
-
-	if val != nil {
-		argTypes = append(argTypes, val.Type)
-		off = round(off, val.Type.Alignment())
-		if inRegs {
-			wbargs = append(wbargs, val)
-		} else {
-			arg := b.NewValue1I(pos, OpOffPtr, val.Type.PtrTo(), off, sp)
-			mem = b.NewValue3A(pos, OpStore, types.TypeMem, val.Type, arg, val, mem)
-		}
-		off += val.Type.Size()
-	}
-	off = round(off, config.PtrSize)
-	wbargs = append(wbargs, mem)
+	args = append(args, mem)
 
 	// issue call
+	argTypes := make([]*types.Type, nargs, 3) // at most 3 args; allows stack allocation
+	for i := 0; i < nargs; i++ {
+		argTypes[i] = typ
+	}
 	call := b.NewValue0A(pos, OpStaticCall, types.TypeResultMem, StaticAuxCall(fn, b.Func.ABIDefault.ABIAnalyzeTypes(nil, argTypes, nil)))
-	call.AddArgs(wbargs...)
-	call.AuxInt = off - config.ctxt.Arch.FixedFrameSize
+	call.AddArgs(args...)
+	call.AuxInt = int64(nargs) * typ.Size()
 	return b.NewValue1I(pos, OpSelectN, types.TypeMem, 0, call)
 }
 
@@ -592,7 +702,7 @@
 		// Nil pointers are read only. See issue 33438.
 		return true
 	}
-	if v.Op == OpAddr && v.Aux.(*obj.LSym).Type == objabi.SRODATA {
+	if v.Op == OpAddr && v.Aux != nil && v.Aux.(*obj.LSym).Type == objabi.SRODATA {
 		return true
 	}
 	return false
diff --git a/src/cmd/compile/internal/ssagen/abi.go b/src/cmd/compile/internal/ssagen/abi.go
index 84d5b59..c97d60b 100644
--- a/src/cmd/compile/internal/ssagen/abi.go
+++ b/src/cmd/compile/internal/ssagen/abi.go
@@ -11,11 +11,14 @@
 	"os"
 	"strings"
 
+	"cmd/compile/internal/abi"
 	"cmd/compile/internal/base"
 	"cmd/compile/internal/ir"
+	"cmd/compile/internal/objw"
 	"cmd/compile/internal/typecheck"
 	"cmd/compile/internal/types"
 	"cmd/internal/obj"
+	"cmd/internal/obj/wasm"
 )
 
 // SymABIs records information provided by the assembler about symbol
@@ -143,7 +146,7 @@
 		defABI, hasDefABI := s.defs[symName]
 		if hasDefABI {
 			if len(fn.Body) != 0 {
-				base.ErrorfAt(fn.Pos(), "%v defined in both Go and assembly", fn)
+				base.ErrorfAt(fn.Pos(), 0, "%v defined in both Go and assembly", fn)
 			}
 			fn.ABI = defABI
 		}
@@ -248,7 +251,7 @@
 	// below to handle the receiver. Panic if we see this scenario.
 	ft := f.Nname.Type()
 	if ft.NumRecvs() != 0 {
-		base.ErrorfAt(f.Pos(), "makeABIWrapper support for wrapping methods not implemented")
+		base.ErrorfAt(f.Pos(), 0, "makeABIWrapper support for wrapping methods not implemented")
 		return
 	}
 
@@ -324,9 +327,6 @@
 	fn.Body.Append(tail)
 
 	typecheck.FinishFuncBody()
-	if base.Debug.DclStack != 0 {
-		types.CheckDclstack()
-	}
 
 	typecheck.Func(fn)
 	ir.CurFunc = fn
@@ -339,3 +339,113 @@
 	typecheck.DeclContext = savedclcontext
 	ir.CurFunc = savedcurfn
 }
+
+// CreateWasmImportWrapper creates a wrapper for imported WASM functions to
+// adapt them to the Go calling convention. The body for this function is
+// generated in cmd/internal/obj/wasm/wasmobj.go
+func CreateWasmImportWrapper(fn *ir.Func) bool {
+	if fn.WasmImport == nil {
+		return false
+	}
+	if buildcfg.GOARCH != "wasm" {
+		base.FatalfAt(fn.Pos(), "CreateWasmImportWrapper call not supported on %s: func was %v", buildcfg.GOARCH, fn)
+	}
+
+	ir.InitLSym(fn, true)
+
+	setupWasmABI(fn)
+
+	pp := objw.NewProgs(fn, 0)
+	defer pp.Free()
+	pp.Text.To.Type = obj.TYPE_TEXTSIZE
+	pp.Text.To.Val = int32(types.RoundUp(fn.Type().ArgWidth(), int64(types.RegSize)))
+	// Wrapper functions never need their own stack frame
+	pp.Text.To.Offset = 0
+	pp.Flush()
+
+	return true
+}
+
+func paramsToWasmFields(f *ir.Func, result *abi.ABIParamResultInfo, abiParams []abi.ABIParamAssignment) []obj.WasmField {
+	wfs := make([]obj.WasmField, len(abiParams))
+	for i, p := range abiParams {
+		t := p.Type
+		switch t.Kind() {
+		case types.TINT32, types.TUINT32:
+			wfs[i].Type = obj.WasmI32
+		case types.TINT64, types.TUINT64:
+			wfs[i].Type = obj.WasmI64
+		case types.TFLOAT32:
+			wfs[i].Type = obj.WasmF32
+		case types.TFLOAT64:
+			wfs[i].Type = obj.WasmF64
+		case types.TUNSAFEPTR:
+			wfs[i].Type = obj.WasmPtr
+		default:
+			base.ErrorfAt(f.Pos(), 0, "go:wasmimport %s %s: unsupported parameter type %s", f.WasmImport.Module, f.WasmImport.Name, t.String())
+		}
+		wfs[i].Offset = p.FrameOffset(result)
+	}
+	return wfs
+}
+
+func resultsToWasmFields(f *ir.Func, result *abi.ABIParamResultInfo, abiParams []abi.ABIParamAssignment) []obj.WasmField {
+	if len(abiParams) > 1 {
+		base.ErrorfAt(f.Pos(), 0, "go:wasmimport %s %s: too many return values", f.WasmImport.Module, f.WasmImport.Name)
+		return nil
+	}
+	wfs := make([]obj.WasmField, len(abiParams))
+	for i, p := range abiParams {
+		t := p.Type
+		switch t.Kind() {
+		case types.TINT32, types.TUINT32:
+			wfs[i].Type = obj.WasmI32
+		case types.TINT64, types.TUINT64:
+			wfs[i].Type = obj.WasmI64
+		case types.TFLOAT32:
+			wfs[i].Type = obj.WasmF32
+		case types.TFLOAT64:
+			wfs[i].Type = obj.WasmF64
+		default:
+			base.ErrorfAt(f.Pos(), 0, "go:wasmimport %s %s: unsupported result type %s", f.WasmImport.Module, f.WasmImport.Name, t.String())
+		}
+		wfs[i].Offset = p.FrameOffset(result)
+	}
+	return wfs
+}
+
+// setupTextLSym initializes the LSym for a with-body text symbol.
+func setupWasmABI(f *ir.Func) {
+	wi := obj.WasmImport{
+		Module: f.WasmImport.Module,
+		Name:   f.WasmImport.Name,
+	}
+	if wi.Module == wasm.GojsModule {
+		// Functions that are imported from the "gojs" module use a special
+		// ABI that just accepts the stack pointer.
+		// Example:
+		//
+		// 	//go:wasmimport gojs add
+		// 	func importedAdd(a, b uint) uint
+		//
+		// will roughly become
+		//
+		// 	(import "gojs" "add" (func (param i32)))
+		wi.Params = []obj.WasmField{{Type: obj.WasmI32}}
+	} else {
+		// All other imported functions use the normal WASM ABI.
+		// Example:
+		//
+		// 	//go:wasmimport a_module add
+		// 	func importedAdd(a, b uint) uint
+		//
+		// will roughly become
+		//
+		// 	(import "a_module" "add" (func (param i32 i32) (result i32)))
+		abiConfig := AbiForBodylessFuncStackMap(f)
+		abiInfo := abiConfig.ABIAnalyzeFuncType(f.Type().FuncType())
+		wi.Params = paramsToWasmFields(f, abiInfo, abiInfo.InParams())
+		wi.Results = resultsToWasmFields(f, abiInfo, abiInfo.OutParams())
+	}
+	f.LSym.Func().WasmImport = &wi
+}
diff --git a/src/cmd/compile/internal/ssagen/nowb.go b/src/cmd/compile/internal/ssagen/nowb.go
index 909319d..9de1b9a 100644
--- a/src/cmd/compile/internal/ssagen/nowb.go
+++ b/src/cmd/compile/internal/ssagen/nowb.go
@@ -154,7 +154,7 @@
 		}
 		// Check go:nowritebarrier functions.
 		if fn.Pragma&ir.Nowritebarrier != 0 && fn.WBPos.IsKnown() {
-			base.ErrorfAt(fn.WBPos, "write barrier prohibited")
+			base.ErrorfAt(fn.WBPos, 0, "write barrier prohibited")
 		}
 	}
 
@@ -185,7 +185,7 @@
 				fmt.Fprintf(&err, "\n\t%v: called by %v", base.FmtPos(call.lineno), call.target.Nname)
 				call = funcs[call.target]
 			}
-			base.ErrorfAt(fn.WBPos, "write barrier prohibited by caller; %v%s", fn.Nname, err.String())
+			base.ErrorfAt(fn.WBPos, 0, "write barrier prohibited by caller; %v%s", fn.Nname, err.String())
 			continue
 		}
 
diff --git a/src/cmd/compile/internal/ssagen/pgen.go b/src/cmd/compile/internal/ssagen/pgen.go
index ffd51f1..9fd3f2a 100644
--- a/src/cmd/compile/internal/ssagen/pgen.go
+++ b/src/cmd/compile/internal/ssagen/pgen.go
@@ -5,7 +5,9 @@
 package ssagen
 
 import (
+	"fmt"
 	"internal/buildcfg"
+	"os"
 	"sort"
 	"sync"
 
@@ -208,10 +210,56 @@
 	}
 
 	pp.Flush() // assemble, fill in boilerplate, etc.
+
+	// If we're compiling the package init function, search for any
+	// relocations that target global map init outline functions and
+	// turn them into weak relocs.
+	if fn.IsPackageInit() && base.Debug.WrapGlobalMapCtl != 1 {
+		weakenGlobalMapInitRelocs(fn)
+	}
+
 	// fieldtrack must be called after pp.Flush. See issue 20014.
 	fieldtrack(pp.Text.From.Sym, fn.FieldTrack)
 }
 
+// globalMapInitLsyms records the LSym of each map.init.NNN outlined
+// map initializer function created by the compiler.
+var globalMapInitLsyms map[*obj.LSym]struct{}
+
+// RegisterMapInitLsym records "s" in the set of outlined map initializer
+// functions.
+func RegisterMapInitLsym(s *obj.LSym) {
+	if globalMapInitLsyms == nil {
+		globalMapInitLsyms = make(map[*obj.LSym]struct{})
+	}
+	globalMapInitLsyms[s] = struct{}{}
+}
+
+// weakenGlobalMapInitRelocs walks through all of the relocations on a
+// given a package init function "fn" and looks for relocs that target
+// outlined global map initializer functions; if it finds any such
+// relocs, it flags them as R_WEAK.
+func weakenGlobalMapInitRelocs(fn *ir.Func) {
+	if globalMapInitLsyms == nil {
+		return
+	}
+	for i := range fn.LSym.R {
+		tgt := fn.LSym.R[i].Sym
+		if tgt == nil {
+			continue
+		}
+		if _, ok := globalMapInitLsyms[tgt]; !ok {
+			continue
+		}
+		if base.Debug.WrapGlobalMapDbg > 1 {
+			fmt.Fprintf(os.Stderr, "=-= weakify fn %v reloc %d %+v\n", fn, i,
+				fn.LSym.R[i])
+		}
+		// set the R_WEAK bit, leave rest of reloc type intact
+		fn.LSym.R[i].Type |= objabi.R_WEAK
+	}
+}
+
 // StackOffset returns the stack location of a LocalSlot relative to the
 // stack pointer, suitable for use in a DWARF location entry. This has nothing
 // to do with its offset in the user variable.
@@ -279,9 +327,9 @@
 	})
 	for _, large := range largeStackFrames {
 		if large.callee != 0 {
-			base.ErrorfAt(large.pos, "stack frame too large (>1GB): %d MB locals + %d MB args + %d MB callee", large.locals>>20, large.args>>20, large.callee>>20)
+			base.ErrorfAt(large.pos, 0, "stack frame too large (>1GB): %d MB locals + %d MB args + %d MB callee", large.locals>>20, large.args>>20, large.callee>>20)
 		} else {
-			base.ErrorfAt(large.pos, "stack frame too large (>1GB): %d MB locals + %d MB args", large.locals>>20, large.args>>20)
+			base.ErrorfAt(large.pos, 0, "stack frame too large (>1GB): %d MB locals + %d MB args", large.locals>>20, large.args>>20)
 		}
 	}
 }
diff --git a/src/cmd/compile/internal/ssagen/ssa.go b/src/cmd/compile/internal/ssagen/ssa.go
index 52f9403..597a196 100644
--- a/src/cmd/compile/internal/ssagen/ssa.go
+++ b/src/cmd/compile/internal/ssagen/ssa.go
@@ -7,7 +7,6 @@
 import (
 	"bufio"
 	"bytes"
-	"cmd/compile/internal/abi"
 	"fmt"
 	"go/constant"
 	"html"
@@ -17,6 +16,7 @@
 	"sort"
 	"strings"
 
+	"cmd/compile/internal/abi"
 	"cmd/compile/internal/base"
 	"cmd/compile/internal/ir"
 	"cmd/compile/internal/liveness"
@@ -27,10 +27,10 @@
 	"cmd/compile/internal/typecheck"
 	"cmd/compile/internal/types"
 	"cmd/internal/obj"
-	"cmd/internal/obj/x86"
-	"cmd/internal/objabi"
 	"cmd/internal/src"
 	"cmd/internal/sys"
+
+	rtabi "internal/abi"
 )
 
 var ssaConfig *ssa.Config
@@ -96,13 +96,22 @@
 	ir.Syms.AssertE2I2 = typecheck.LookupRuntimeFunc("assertE2I2")
 	ir.Syms.AssertI2I = typecheck.LookupRuntimeFunc("assertI2I")
 	ir.Syms.AssertI2I2 = typecheck.LookupRuntimeFunc("assertI2I2")
+	ir.Syms.CgoCheckMemmove = typecheck.LookupRuntimeFunc("cgoCheckMemmove")
+	ir.Syms.CgoCheckPtrWrite = typecheck.LookupRuntimeFunc("cgoCheckPtrWrite")
 	ir.Syms.CheckPtrAlignment = typecheck.LookupRuntimeFunc("checkptrAlignment")
 	ir.Syms.Deferproc = typecheck.LookupRuntimeFunc("deferproc")
 	ir.Syms.DeferprocStack = typecheck.LookupRuntimeFunc("deferprocStack")
 	ir.Syms.Deferreturn = typecheck.LookupRuntimeFunc("deferreturn")
 	ir.Syms.Duffcopy = typecheck.LookupRuntimeFunc("duffcopy")
 	ir.Syms.Duffzero = typecheck.LookupRuntimeFunc("duffzero")
-	ir.Syms.GCWriteBarrier = typecheck.LookupRuntimeFunc("gcWriteBarrier")
+	ir.Syms.GCWriteBarrier[0] = typecheck.LookupRuntimeFunc("gcWriteBarrier1")
+	ir.Syms.GCWriteBarrier[1] = typecheck.LookupRuntimeFunc("gcWriteBarrier2")
+	ir.Syms.GCWriteBarrier[2] = typecheck.LookupRuntimeFunc("gcWriteBarrier3")
+	ir.Syms.GCWriteBarrier[3] = typecheck.LookupRuntimeFunc("gcWriteBarrier4")
+	ir.Syms.GCWriteBarrier[4] = typecheck.LookupRuntimeFunc("gcWriteBarrier5")
+	ir.Syms.GCWriteBarrier[5] = typecheck.LookupRuntimeFunc("gcWriteBarrier6")
+	ir.Syms.GCWriteBarrier[6] = typecheck.LookupRuntimeFunc("gcWriteBarrier7")
+	ir.Syms.GCWriteBarrier[7] = typecheck.LookupRuntimeFunc("gcWriteBarrier8")
 	ir.Syms.Goschedguarded = typecheck.LookupRuntimeFunc("goschedguarded")
 	ir.Syms.Growslice = typecheck.LookupRuntimeFunc("growslice")
 	ir.Syms.Memmove = typecheck.LookupRuntimeFunc("memmove")
@@ -123,32 +132,19 @@
 	ir.Syms.Racereadrange = typecheck.LookupRuntimeFunc("racereadrange")
 	ir.Syms.Racewrite = typecheck.LookupRuntimeFunc("racewrite")
 	ir.Syms.Racewriterange = typecheck.LookupRuntimeFunc("racewriterange")
+	ir.Syms.WBZero = typecheck.LookupRuntimeFunc("wbZero")
+	ir.Syms.WBMove = typecheck.LookupRuntimeFunc("wbMove")
 	ir.Syms.X86HasPOPCNT = typecheck.LookupRuntimeVar("x86HasPOPCNT")       // bool
 	ir.Syms.X86HasSSE41 = typecheck.LookupRuntimeVar("x86HasSSE41")         // bool
 	ir.Syms.X86HasFMA = typecheck.LookupRuntimeVar("x86HasFMA")             // bool
 	ir.Syms.ARMHasVFPv4 = typecheck.LookupRuntimeVar("armHasVFPv4")         // bool
 	ir.Syms.ARM64HasATOMICS = typecheck.LookupRuntimeVar("arm64HasATOMICS") // bool
 	ir.Syms.Staticuint64s = typecheck.LookupRuntimeVar("staticuint64s")
-	ir.Syms.Typedmemclr = typecheck.LookupRuntimeFunc("typedmemclr")
 	ir.Syms.Typedmemmove = typecheck.LookupRuntimeFunc("typedmemmove")
 	ir.Syms.Udiv = typecheck.LookupRuntimeVar("udiv")                 // asm func with special ABI
 	ir.Syms.WriteBarrier = typecheck.LookupRuntimeVar("writeBarrier") // struct { bool; ... }
 	ir.Syms.Zerobase = typecheck.LookupRuntimeVar("zerobase")
 
-	// asm funcs with special ABI
-	if base.Ctxt.Arch.Name == "amd64" {
-		GCWriteBarrierReg = map[int16]*obj.LSym{
-			x86.REG_AX: typecheck.LookupRuntimeFunc("gcWriteBarrier"),
-			x86.REG_CX: typecheck.LookupRuntimeFunc("gcWriteBarrierCX"),
-			x86.REG_DX: typecheck.LookupRuntimeFunc("gcWriteBarrierDX"),
-			x86.REG_BX: typecheck.LookupRuntimeFunc("gcWriteBarrierBX"),
-			x86.REG_BP: typecheck.LookupRuntimeFunc("gcWriteBarrierBP"),
-			x86.REG_SI: typecheck.LookupRuntimeFunc("gcWriteBarrierSI"),
-			x86.REG_R8: typecheck.LookupRuntimeFunc("gcWriteBarrierR8"),
-			x86.REG_R9: typecheck.LookupRuntimeFunc("gcWriteBarrierR9"),
-		}
-	}
-
 	if Arch.LinkArch.Family == sys.Wasm {
 		BoundsCheckFunc[ssa.BoundsIndex] = typecheck.LookupRuntimeFunc("goPanicIndex")
 		BoundsCheckFunc[ssa.BoundsIndexU] = typecheck.LookupRuntimeFunc("goPanicIndexU")
@@ -722,7 +718,7 @@
 		count = s.constInt(types.Types[types.TUINTPTR], 1)
 	}
 	if count.Type.Size() != s.config.PtrSize {
-		s.Fatalf("expected count fit to an uintptr size, have: %d, want: %d", count.Type.Size(), s.config.PtrSize)
+		s.Fatalf("expected count fit to a uintptr size, have: %d, want: %d", count.Type.Size(), s.config.PtrSize)
 	}
 	var rtype *ssa.Value
 	if rtypeExpr != nil {
@@ -1801,6 +1797,7 @@
 		// OFOR: for Ninit; Left; Right { Nbody }
 		// cond (Left); body (Nbody); incr (Right)
 		n := n.(*ir.ForStmt)
+		base.Assert(!n.DistinctVars) // Should all be rewritten before escape analysis
 		bCond := s.f.NewBlock(ssa.BlockPlain)
 		bBody := s.f.NewBlock(ssa.BlockPlain)
 		bIncr := s.f.NewBlock(ssa.BlockPlain)
@@ -3203,7 +3200,10 @@
 		n := n.(*ir.UnaryExpr)
 		a := s.expr(n.X)
 		if n.X.Type().IsSlice() {
-			return s.newValue1(ssa.OpSlicePtr, n.Type(), a)
+			if n.Bounded() {
+				return s.newValue1(ssa.OpSlicePtr, n.Type(), a)
+			}
+			return s.newValue1(ssa.OpSlicePtrUnchecked, n.Type(), a)
 		} else {
 			return s.newValue1(ssa.OpStringPtr, n.Type(), a)
 		}
@@ -3278,10 +3278,15 @@
 		// slice.ptr
 		n := n.(*ir.ConvExpr)
 		v := s.expr(n.X)
-		arrlen := s.constInt(types.Types[types.TINT], n.Type().Elem().NumElem())
+		nelem := n.Type().Elem().NumElem()
+		arrlen := s.constInt(types.Types[types.TINT], nelem)
 		cap := s.newValue1(ssa.OpSliceLen, types.Types[types.TINT], v)
 		s.boundsCheck(arrlen, cap, ssa.BoundsConvert, false)
-		return s.newValue1(ssa.OpSlicePtrUnchecked, n.Type(), v)
+		op := ssa.OpSlicePtr
+		if nelem == 0 {
+			op = ssa.OpSlicePtrUnchecked
+		}
+		return s.newValue1(op, n.Type(), v)
 
 	case ir.OCALLFUNC:
 		n := n.(*ir.CallExpr)
@@ -3304,11 +3309,14 @@
 
 	case ir.OGETCALLERSP:
 		n := n.(*ir.CallExpr)
-		return s.newValue0(ssa.OpGetCallerSP, n.Type())
+		return s.newValue1(ssa.OpGetCallerSP, n.Type(), s.mem())
 
 	case ir.OAPPEND:
 		return s.append(n.(*ir.CallExpr), false)
 
+	case ir.OMIN, ir.OMAX:
+		return s.minMax(n.(*ir.CallExpr))
+
 	case ir.OSTRUCTLIT, ir.OARRAYLIT:
 		// All literals with nonzero fields have already been
 		// rewritten during walk. Any that remain are just T{}
@@ -3525,6 +3533,10 @@
 		}
 	}
 
+	// The following deletions have no practical effect at this time
+	// because state.vars has been reset by the preceding state.startBlock.
+	// They only enforce the fact that these variables are no longer need in
+	// the current scope.
 	delete(s.vars, ptrVar)
 	delete(s.vars, lenVar)
 	if !inplace {
@@ -3538,6 +3550,104 @@
 	return s.newValue3(ssa.OpSliceMake, n.Type(), p, l, c)
 }
 
+// minMax converts an OMIN/OMAX builtin call into SSA.
+func (s *state) minMax(n *ir.CallExpr) *ssa.Value {
+	// The OMIN/OMAX builtin is variadic, but its semantics are
+	// equivalent to left-folding a binary min/max operation across the
+	// arguments list.
+	fold := func(op func(x, a *ssa.Value) *ssa.Value) *ssa.Value {
+		x := s.expr(n.Args[0])
+		for _, arg := range n.Args[1:] {
+			x = op(x, s.expr(arg))
+		}
+		return x
+	}
+
+	typ := n.Type()
+
+	if typ.IsFloat() || typ.IsString() {
+		// min/max semantics for floats are tricky because of NaNs and
+		// negative zero, so we let the runtime handle this instead.
+		//
+		// Strings are conceptually simpler, but we currently desugar
+		// string comparisons during walk, not ssagen.
+
+		var name string
+		switch typ.Kind() {
+		case types.TFLOAT32:
+			switch n.Op() {
+			case ir.OMIN:
+				name = "fmin32"
+			case ir.OMAX:
+				name = "fmax32"
+			}
+		case types.TFLOAT64:
+			switch n.Op() {
+			case ir.OMIN:
+				name = "fmin64"
+			case ir.OMAX:
+				name = "fmax64"
+			}
+		case types.TSTRING:
+			switch n.Op() {
+			case ir.OMIN:
+				name = "strmin"
+			case ir.OMAX:
+				name = "strmax"
+			}
+		}
+		fn := typecheck.LookupRuntimeFunc(name)
+
+		return fold(func(x, a *ssa.Value) *ssa.Value {
+			return s.rtcall(fn, true, []*types.Type{typ}, x, a)[0]
+		})
+	}
+
+	lt := s.ssaOp(ir.OLT, typ)
+
+	return fold(func(x, a *ssa.Value) *ssa.Value {
+		switch n.Op() {
+		case ir.OMIN:
+			// a < x ? a : x
+			return s.ternary(s.newValue2(lt, types.Types[types.TBOOL], a, x), a, x)
+		case ir.OMAX:
+			// x < a ? a : x
+			return s.ternary(s.newValue2(lt, types.Types[types.TBOOL], x, a), a, x)
+		}
+		panic("unreachable")
+	})
+}
+
+// ternary emits code to evaluate cond ? x : y.
+func (s *state) ternary(cond, x, y *ssa.Value) *ssa.Value {
+	// Note that we need a new ternaryVar each time (unlike okVar where we can
+	// reuse the variable) because it might have a different type every time.
+	ternaryVar := ssaMarker("ternary")
+
+	bThen := s.f.NewBlock(ssa.BlockPlain)
+	bElse := s.f.NewBlock(ssa.BlockPlain)
+	bEnd := s.f.NewBlock(ssa.BlockPlain)
+
+	b := s.endBlock()
+	b.Kind = ssa.BlockIf
+	b.SetControl(cond)
+	b.AddEdgeTo(bThen)
+	b.AddEdgeTo(bElse)
+
+	s.startBlock(bThen)
+	s.vars[ternaryVar] = x
+	s.endBlock().AddEdgeTo(bEnd)
+
+	s.startBlock(bElse)
+	s.vars[ternaryVar] = y
+	s.endBlock().AddEdgeTo(bEnd)
+
+	s.startBlock(bEnd)
+	r := s.variable(ternaryVar, x.Type)
+	delete(s.vars, ternaryVar)
+	return r
+}
+
 // condBranch evaluates the boolean expression cond and branches to yes
 // if cond is true and no if cond is false.
 // This function is intended to handle && and || better than just calling
@@ -3989,7 +4099,7 @@
 
 	add("runtime", "getcallersp",
 		func(s *state, n *ir.CallExpr, args []*ssa.Value) *ssa.Value {
-			return s.newValue0(ssa.OpGetCallerSP, s.f.Config.Types.Uintptr)
+			return s.newValue1(ssa.OpGetCallerSP, s.f.Config.Types.Uintptr, s.mem())
 		},
 		all...)
 
@@ -4000,17 +4110,23 @@
 		},
 		sys.ARM64, sys.PPC64)
 
+	brev_arch := []sys.ArchFamily{sys.AMD64, sys.I386, sys.ARM64, sys.ARM, sys.S390X}
+	if buildcfg.GOPPC64 >= 10 {
+		// Use only on Power10 as the new byte reverse instructions that Power10 provide
+		// make it worthwhile as an intrinsic
+		brev_arch = append(brev_arch, sys.PPC64)
+	}
 	/******** runtime/internal/sys ********/
 	addF("runtime/internal/sys", "Bswap32",
 		func(s *state, n *ir.CallExpr, args []*ssa.Value) *ssa.Value {
 			return s.newValue1(ssa.OpBswap32, types.Types[types.TUINT32], args[0])
 		},
-		sys.AMD64, sys.ARM64, sys.ARM, sys.S390X)
+		brev_arch...)
 	addF("runtime/internal/sys", "Bswap64",
 		func(s *state, n *ir.CallExpr, args []*ssa.Value) *ssa.Value {
 			return s.newValue1(ssa.OpBswap64, types.Types[types.TUINT64], args[0])
 		},
-		sys.AMD64, sys.ARM64, sys.ARM, sys.S390X)
+		brev_arch...)
 
 	/****** Prefetch ******/
 	makePrefetchFunc := func(op ssa.Op) func(s *state, n *ir.CallExpr, args []*ssa.Value) *ssa.Value {
@@ -4235,25 +4351,25 @@
 			s.vars[memVar] = s.newValue3(ssa.OpAtomicAnd8, types.TypeMem, args[0], args[1], s.mem())
 			return nil
 		},
-		sys.AMD64, sys.MIPS, sys.PPC64, sys.RISCV64, sys.S390X)
+		sys.AMD64, sys.MIPS, sys.MIPS64, sys.PPC64, sys.RISCV64, sys.S390X)
 	addF("runtime/internal/atomic", "And",
 		func(s *state, n *ir.CallExpr, args []*ssa.Value) *ssa.Value {
 			s.vars[memVar] = s.newValue3(ssa.OpAtomicAnd32, types.TypeMem, args[0], args[1], s.mem())
 			return nil
 		},
-		sys.AMD64, sys.MIPS, sys.PPC64, sys.RISCV64, sys.S390X)
+		sys.AMD64, sys.MIPS, sys.MIPS64, sys.PPC64, sys.RISCV64, sys.S390X)
 	addF("runtime/internal/atomic", "Or8",
 		func(s *state, n *ir.CallExpr, args []*ssa.Value) *ssa.Value {
 			s.vars[memVar] = s.newValue3(ssa.OpAtomicOr8, types.TypeMem, args[0], args[1], s.mem())
 			return nil
 		},
-		sys.AMD64, sys.ARM64, sys.MIPS, sys.PPC64, sys.RISCV64, sys.S390X)
+		sys.AMD64, sys.ARM64, sys.MIPS, sys.MIPS64, sys.PPC64, sys.RISCV64, sys.S390X)
 	addF("runtime/internal/atomic", "Or",
 		func(s *state, n *ir.CallExpr, args []*ssa.Value) *ssa.Value {
 			s.vars[memVar] = s.newValue3(ssa.OpAtomicOr32, types.TypeMem, args[0], args[1], s.mem())
 			return nil
 		},
-		sys.AMD64, sys.MIPS, sys.PPC64, sys.RISCV64, sys.S390X)
+		sys.AMD64, sys.MIPS, sys.MIPS64, sys.PPC64, sys.RISCV64, sys.S390X)
 
 	atomicAndOrEmitterARM64 := func(s *state, n *ir.CallExpr, args []*ssa.Value, op ssa.Op, typ types.Kind) {
 		s.vars[memVar] = s.newValue3(op, types.TypeMem, args[0], args[1], s.mem())
@@ -4354,7 +4470,7 @@
 		func(s *state, n *ir.CallExpr, args []*ssa.Value) *ssa.Value {
 			return s.newValue1(ssa.OpAbs, types.Types[types.TFLOAT64], args[0])
 		},
-		sys.ARM64, sys.ARM, sys.PPC64, sys.RISCV64, sys.Wasm)
+		sys.ARM64, sys.ARM, sys.PPC64, sys.RISCV64, sys.Wasm, sys.MIPS, sys.MIPS64)
 	addF("math", "Copysign",
 		func(s *state, n *ir.CallExpr, args []*ssa.Value) *ssa.Value {
 			return s.newValue2(ssa.OpCopysign, types.Types[types.TFLOAT64], args[0], args[1])
@@ -4486,12 +4602,12 @@
 		func(s *state, n *ir.CallExpr, args []*ssa.Value) *ssa.Value {
 			return s.newValue1(ssa.OpCtz64, types.Types[types.TINT], args[0])
 		},
-		sys.AMD64, sys.ARM64, sys.ARM, sys.S390X, sys.MIPS, sys.PPC64, sys.Wasm)
+		sys.AMD64, sys.I386, sys.ARM64, sys.ARM, sys.S390X, sys.MIPS, sys.PPC64, sys.Wasm)
 	addF("math/bits", "TrailingZeros32",
 		func(s *state, n *ir.CallExpr, args []*ssa.Value) *ssa.Value {
 			return s.newValue1(ssa.OpCtz32, types.Types[types.TINT], args[0])
 		},
-		sys.AMD64, sys.ARM64, sys.ARM, sys.S390X, sys.MIPS, sys.PPC64, sys.Wasm)
+		sys.AMD64, sys.I386, sys.ARM64, sys.ARM, sys.S390X, sys.MIPS, sys.PPC64, sys.Wasm)
 	addF("math/bits", "TrailingZeros16",
 		func(s *state, n *ir.CallExpr, args []*ssa.Value) *ssa.Value {
 			x := s.newValue1(ssa.OpZeroExt16to32, types.Types[types.TUINT32], args[0])
@@ -4525,7 +4641,7 @@
 		func(s *state, n *ir.CallExpr, args []*ssa.Value) *ssa.Value {
 			return s.newValue1(ssa.OpCtz8, types.Types[types.TINT], args[0])
 		},
-		sys.AMD64, sys.ARM, sys.ARM64, sys.Wasm)
+		sys.AMD64, sys.I386, sys.ARM, sys.ARM64, sys.Wasm)
 	addF("math/bits", "TrailingZeros8",
 		func(s *state, n *ir.CallExpr, args []*ssa.Value) *ssa.Value {
 			x := s.newValue1(ssa.OpZeroExt8to64, types.Types[types.TUINT64], args[0])
@@ -4537,7 +4653,16 @@
 	alias("math/bits", "ReverseBytes64", "runtime/internal/sys", "Bswap64", all...)
 	alias("math/bits", "ReverseBytes32", "runtime/internal/sys", "Bswap32", all...)
 	// ReverseBytes inlines correctly, no need to intrinsify it.
-	// ReverseBytes16 lowers to a rotate, no need for anything special here.
+	// Nothing special is needed for targets where ReverseBytes16 lowers to a rotate
+	// On Power10, 16-bit rotate is not available so use BRH instruction
+	if buildcfg.GOPPC64 >= 10 {
+		addF("math/bits", "ReverseBytes16",
+			func(s *state, n *ir.CallExpr, args []*ssa.Value) *ssa.Value {
+				return s.newValue1(ssa.OpBswap16, types.Types[types.TUINT], args[0])
+			},
+			sys.PPC64)
+	}
+
 	addF("math/bits", "Len64",
 		func(s *state, n *ir.CallExpr, args []*ssa.Value) *ssa.Value {
 			return s.newValue1(ssa.OpBitLen64, types.Types[types.TINT], args[0])
@@ -6368,7 +6493,7 @@
 			idata := s.newValue1(ssa.OpIData, byteptr, iface)
 			res = s.newValue2(ssa.OpIMake, dst, s.variable(typVar, byteptr), idata)
 			resok = cond
-			delete(s.vars, typVar)
+			delete(s.vars, typVar) // no practical effect, just to indicate typVar is no longer live.
 			return
 		}
 		// converting to a nonempty interface needs a runtime call.
@@ -6493,12 +6618,12 @@
 	s.startBlock(bEnd)
 	if tmp == nil {
 		res = s.variable(valVar, dst)
-		delete(s.vars, valVar)
+		delete(s.vars, valVar) // no practical effect, just to indicate typVar is no longer live.
 	} else {
 		res = s.load(dst, addr)
 	}
 	resok = s.variable(okVar, types.Types[types.TBOOL])
-	delete(s.vars, okVar)
+	delete(s.vars, okVar) // ditto
 	return res, resok
 }
 
@@ -6703,7 +6828,7 @@
 
 	// Emit a funcdata pointing at the arg info data.
 	p := pp.Prog(obj.AFUNCDATA)
-	p.From.SetConst(objabi.FUNCDATA_ArgInfo)
+	p.From.SetConst(rtabi.FUNCDATA_ArgInfo)
 	p.To.Type = obj.TYPE_MEM
 	p.To.Name = obj.NAME_EXTERN
 	p.To.Sym = x
@@ -6870,7 +6995,7 @@
 
 	// Emit a funcdata pointing at the wrap info data.
 	p := pp.Prog(obj.AFUNCDATA)
-	p.From.SetConst(objabi.FUNCDATA_WrapInfo)
+	p.From.SetConst(rtabi.FUNCDATA_WrapInfo)
 	p.To.Type = obj.TYPE_MEM
 	p.To.Name = obj.NAME_EXTERN
 	p.To.Sym = x
@@ -6892,7 +7017,7 @@
 		// This function uses open-coded defers -- write out the funcdata
 		// info that we computed at the end of genssa.
 		p := pp.Prog(obj.AFUNCDATA)
-		p.From.SetConst(objabi.FUNCDATA_OpenCodedDeferInfo)
+		p.From.SetConst(rtabi.FUNCDATA_OpenCodedDeferInfo)
 		p.To.Type = obj.TYPE_MEM
 		p.To.Name = obj.NAME_EXTERN
 		p.To.Sym = openDeferInfo
@@ -6928,7 +7053,7 @@
 	// debuggers may attribute it to previous function in program.
 	firstPos := src.NoXPos
 	for _, v := range f.Entry.Values {
-		if v.Pos.IsStmt() == src.PosIsStmt {
+		if v.Pos.IsStmt() == src.PosIsStmt && v.Op != ssa.OpArg && v.Op != ssa.OpArgIntReg && v.Op != ssa.OpArgFloatReg && v.Op != ssa.OpLoadReg && v.Op != ssa.OpStoreReg {
 			firstPos = v.Pos
 			v.Pos = firstPos.WithDefaultStmt()
 			break
@@ -6958,13 +7083,26 @@
 		// for an empty block this will be used for its control
 		// instruction. We won't use the actual liveness map on a
 		// control instruction. Just mark it something that is
-		// preemptible, unless this function is "all unsafe".
-		s.pp.NextLive = objw.LivenessIndex{StackMapIndex: -1, IsUnsafePoint: liveness.IsUnsafe(f)}
+		// preemptible, unless this function is "all unsafe", or
+		// the empty block is in a write barrier.
+		unsafe := liveness.IsUnsafe(f)
+		if b.Kind == ssa.BlockPlain {
+			// Empty blocks that are part of write barriers need
+			// to have their control instructions marked unsafe.
+			c := b.Succs[0].Block()
+			for _, v := range c.Values {
+				if v.Op == ssa.OpWBend {
+					unsafe = true
+					break
+				}
+			}
+		}
+		s.pp.NextLive = objw.LivenessIndex{StackMapIndex: -1, IsUnsafePoint: unsafe}
 
 		if idx, ok := argLiveBlockMap[b.ID]; ok && idx != argLiveIdx {
 			argLiveIdx = idx
 			p := s.pp.Prog(obj.APCDATA)
-			p.From.SetConst(objabi.PCDATA_ArgLiveIndex)
+			p.From.SetConst(rtabi.PCDATA_ArgLiveIndex)
 			p.To.SetConst(int64(idx))
 		}
 
@@ -6990,7 +7128,7 @@
 			case ssa.OpGetG:
 				// nothing to do when there's a g register,
 				// and checkLower complains if there's not
-			case ssa.OpVarDef, ssa.OpVarLive, ssa.OpKeepAlive:
+			case ssa.OpVarDef, ssa.OpVarLive, ssa.OpKeepAlive, ssa.OpWBend:
 				// nothing to do; already used by liveness
 			case ssa.OpPhi:
 				CheckLoweredPhi(v)
@@ -7009,6 +7147,7 @@
 				inlMarkList = append(inlMarkList, p)
 				pos := v.Pos.AtColumn1()
 				inlMarksByPos[pos] = append(inlMarksByPos[pos], p)
+				firstPos = src.NoXPos
 
 			default:
 				// Special case for first line in function; move it to the start (which cannot be a register-valued instruction)
@@ -7027,7 +7166,7 @@
 			if idx, ok := argLiveValueMap[v.ID]; ok && idx != argLiveIdx {
 				argLiveIdx = idx
 				p := s.pp.Prog(obj.APCDATA)
-				p.From.SetConst(objabi.PCDATA_ArgLiveIndex)
+				p.From.SetConst(rtabi.PCDATA_ArgLiveIndex)
 				p.To.SetConst(int64(idx))
 			}
 
@@ -7104,6 +7243,8 @@
 	}
 
 	if inlMarks != nil {
+		hasCall := false
+
 		// We have some inline marks. Try to find other instructions we're
 		// going to emit anyway, and use those instructions instead of the
 		// inline marks.
@@ -7121,6 +7262,9 @@
 				// whether they will be zero-sized or not yet.
 				continue
 			}
+			if p.As == obj.ACALL || p.As == obj.ADUFFCOPY || p.As == obj.ADUFFZERO {
+				hasCall = true
+			}
 			pos := p.Pos.AtColumn1()
 			s := inlMarksByPos[pos]
 			if len(s) == 0 {
@@ -7146,6 +7290,45 @@
 				pp.CurFunc.LSym.Func().AddInlMark(p, inlMarks[p])
 			}
 		}
+
+		if e.stksize == 0 && !hasCall {
+			// Frameless leaf function. It doesn't need any preamble,
+			// so make sure its first instruction isn't from an inlined callee.
+			// If it is, add a nop at the start of the function with a position
+			// equal to the start of the function.
+			// This ensures that runtime.FuncForPC(uintptr(reflect.ValueOf(fn).Pointer())).Name()
+			// returns the right answer. See issue 58300.
+			for p := pp.Text; p != nil; p = p.Link {
+				if p.As == obj.AFUNCDATA || p.As == obj.APCDATA || p.As == obj.ATEXT || p.As == obj.ANOP {
+					continue
+				}
+				if base.Ctxt.PosTable.Pos(p.Pos).Base().InliningIndex() >= 0 {
+					// Make a real (not 0-sized) nop.
+					nop := Arch.Ginsnop(pp)
+					nop.Pos = e.curfn.Pos().WithIsStmt()
+
+					// Unfortunately, Ginsnop puts the instruction at the
+					// end of the list. Move it up to just before p.
+
+					// Unlink from the current list.
+					for x := pp.Text; x != nil; x = x.Link {
+						if x.Link == nop {
+							x.Link = nop.Link
+							break
+						}
+					}
+					// Splice in right before p.
+					for x := pp.Text; x != nil; x = x.Link {
+						if x.Link == p {
+							nop.Link = p
+							x.Link = nop
+							break
+						}
+					}
+				}
+				break
+			}
+		}
 	}
 
 	if base.Ctxt.Flag_locationlists {
@@ -7262,7 +7445,7 @@
 		fi := f.DumpFileForPhase("genssa")
 		if fi != nil {
 
-			// inliningDiffers if any filename changes or if any line number except the innermost (index 0) changes.
+			// inliningDiffers if any filename changes or if any line number except the innermost (last index) changes.
 			inliningDiffers := func(a, b []src.Pos) bool {
 				if len(a) != len(b) {
 					return true
@@ -7271,7 +7454,7 @@
 					if a[i].Filename() != b[i].Filename() {
 						return true
 					}
-					if i > 0 && a[i].Line() != b[i].Line() {
+					if i != len(a)-1 && a[i].Line() != b[i].Line() {
 						return true
 					}
 				}
@@ -7283,10 +7466,10 @@
 
 			for p := pp.Text; p != nil; p = p.Link {
 				if p.Pos.IsKnown() {
-					allPos = p.AllPos(allPos)
+					allPos = allPos[:0]
+					p.Ctxt.AllPos(p.Pos, func(pos src.Pos) { allPos = append(allPos, pos) })
 					if inliningDiffers(allPos, allPosOld) {
-						for i := len(allPos) - 1; i >= 0; i-- {
-							pos := allPos[i]
+						for _, pos := range allPos {
 							fmt.Fprintf(fi, "# %s:%d\n", pos.Filename(), pos.Line())
 						}
 						allPos, allPosOld = allPosOld, allPos // swap, not copy, so that they do not share slice storage.
@@ -7699,7 +7882,7 @@
 	idx := s.livenessMap.Get(v)
 	if !idx.StackMapValid() {
 		// See Liveness.hasStackMap.
-		if sym, ok := v.Aux.(*ssa.AuxCall); !ok || !(sym.Fn == ir.Syms.Typedmemclr || sym.Fn == ir.Syms.Typedmemmove) {
+		if sym, ok := v.Aux.(*ssa.AuxCall); !ok || !(sym.Fn == ir.Syms.WBZero || sym.Fn == ir.Syms.WBMove) {
 			base.Fatalf("missing stack map index for %v", v.LongString())
 		}
 	}
@@ -7809,10 +7992,6 @@
 	return TypeOK(t)
 }
 
-func (e *ssafn) Line(pos src.XPos) string {
-	return base.FmtPos(pos)
-}
-
 // Logf logs a message from the compiler.
 func (e *ssafn) Logf(msg string, args ...interface{}) {
 	if e.log {
@@ -7851,27 +8030,25 @@
 		return ir.Syms.Goschedguarded
 	case "writeBarrier":
 		return ir.Syms.WriteBarrier
-	case "gcWriteBarrier":
-		return ir.Syms.GCWriteBarrier
-	case "typedmemmove":
-		return ir.Syms.Typedmemmove
-	case "typedmemclr":
-		return ir.Syms.Typedmemclr
+	case "wbZero":
+		return ir.Syms.WBZero
+	case "wbMove":
+		return ir.Syms.WBMove
+	case "cgoCheckMemmove":
+		return ir.Syms.CgoCheckMemmove
+	case "cgoCheckPtrWrite":
+		return ir.Syms.CgoCheckPtrWrite
 	}
 	e.Fatalf(src.NoXPos, "unknown Syslook func %v", name)
 	return nil
 }
 
-func (e *ssafn) SetWBPos(pos src.XPos) {
-	e.curfn.SetWBPos(pos)
-}
-
 func (e *ssafn) MyImportPath() string {
 	return base.Ctxt.Pkgpath
 }
 
-func (e *ssafn) LSym() string {
-	return e.curfn.LSym.Name
+func (e *ssafn) Func() *ir.Func {
+	return e.curfn
 }
 
 func clobberBase(n ir.Node) ir.Node {
@@ -7893,10 +8070,9 @@
 // callTargetLSym returns the correct LSym to call 'callee' using its ABI.
 func callTargetLSym(callee *ir.Name) *obj.LSym {
 	if callee.Func == nil {
-		// TODO(austin): This happens in a few cases of
-		// compiler-generated functions. These are all
-		// ABIInternal. It would be better if callee.Func was
-		// never nil and we didn't need this case.
+		// TODO(austin): This happens in case of interface method I.M from imported package.
+		// It's ABIInternal, and would be better if callee.Func was never nil and we didn't
+		// need this case.
 		return callee.Linksym()
 	}
 
@@ -7946,7 +8122,7 @@
 	}
 
 	// build struct holding the above fields
-	s := types.NewStruct(types.NoPkg, fields)
+	s := types.NewStruct(fields)
 	s.SetNoalg(true)
 	types.CalcStructSize(s)
 	return s
@@ -7969,6 +8145,3 @@
 	BoundsCheckFunc [ssa.BoundsKindCount]*obj.LSym
 	ExtendCheckFunc [ssa.BoundsKindCount]*obj.LSym
 )
-
-// GCWriteBarrierReg maps from registers to gcWriteBarrier implementation LSyms.
-var GCWriteBarrierReg map[int16]*obj.LSym
diff --git a/src/cmd/compile/internal/staticdata/data.go b/src/cmd/compile/internal/staticdata/data.go
index 662580f..e39d0ee 100644
--- a/src/cmd/compile/internal/staticdata/data.go
+++ b/src/cmd/compile/internal/staticdata/data.go
@@ -214,7 +214,7 @@
 	// causing a cryptic error message by the linker. Check for oversize objects here
 	// and provide a useful error message instead.
 	if int64(len(t)) > 2e9 {
-		base.ErrorfAt(pos, "%v with length %v is too big", what, len(t))
+		base.ErrorfAt(pos, 0, "%v with length %v is too big", what, len(t))
 		return 0
 	}
 
diff --git a/src/cmd/compile/internal/staticdata/embed.go b/src/cmd/compile/internal/staticdata/embed.go
index 8d4dedf..a4d493c 100644
--- a/src/cmd/compile/internal/staticdata/embed.go
+++ b/src/cmd/compile/internal/staticdata/embed.go
@@ -31,11 +31,11 @@
 		for _, pattern := range e.Patterns {
 			files, ok := base.Flag.Cfg.Embed.Patterns[pattern]
 			if !ok {
-				base.ErrorfAt(e.Pos, "invalid go:embed: build system did not map pattern: %s", pattern)
+				base.ErrorfAt(e.Pos, 0, "invalid go:embed: build system did not map pattern: %s", pattern)
 			}
 			for _, file := range files {
 				if base.Flag.Cfg.Embed.Files[file] == "" {
-					base.ErrorfAt(e.Pos, "invalid go:embed: build system did not map file: %s", file)
+					base.ErrorfAt(e.Pos, 0, "invalid go:embed: build system did not map file: %s", file)
 					continue
 				}
 				if !have[file] {
@@ -57,7 +57,7 @@
 
 	if kind == embedString || kind == embedBytes {
 		if len(list) > 1 {
-			base.ErrorfAt(v.Pos(), "invalid go:embed: multiple files for type %v", v.Type())
+			base.ErrorfAt(v.Pos(), 0, "invalid go:embed: multiple files for type %v", v.Type())
 			return nil
 		}
 	}
@@ -109,12 +109,12 @@
 
 	commentPos := (*v.Embed)[0].Pos
 	if base.Flag.Cfg.Embed.Patterns == nil {
-		base.ErrorfAt(commentPos, "invalid go:embed: build system did not supply embed configuration")
+		base.ErrorfAt(commentPos, 0, "invalid go:embed: build system did not supply embed configuration")
 		return
 	}
 	kind := embedKind(v.Type())
 	if kind == embedUnknown {
-		base.ErrorfAt(v.Pos(), "go:embed cannot apply to var of type %v", v.Type())
+		base.ErrorfAt(v.Pos(), 0, "go:embed cannot apply to var of type %v", v.Type())
 		return
 	}
 
@@ -124,7 +124,7 @@
 		file := files[0]
 		fsym, size, err := fileStringSym(v.Pos(), base.Flag.Cfg.Embed.Files[file], kind == embedString, nil)
 		if err != nil {
-			base.ErrorfAt(v.Pos(), "embed %s: %v", file, err)
+			base.ErrorfAt(v.Pos(), 0, "embed %s: %v", file, err)
 		}
 		sym := v.Linksym()
 		off := 0
@@ -160,7 +160,7 @@
 			} else {
 				fsym, size, err := fileStringSym(v.Pos(), base.Flag.Cfg.Embed.Files[file], true, hash)
 				if err != nil {
-					base.ErrorfAt(v.Pos(), "embed %s: %v", file, err)
+					base.ErrorfAt(v.Pos(), 0, "embed %s: %v", file, err)
 				}
 				off = objw.SymPtr(slicedata, off, fsym, 0) // data string
 				off = objw.Uintptr(slicedata, off, uint64(size))
diff --git a/src/cmd/compile/internal/staticinit/sched.go b/src/cmd/compile/internal/staticinit/sched.go
index 2bfb5d7..7d1dfcb 100644
--- a/src/cmd/compile/internal/staticinit/sched.go
+++ b/src/cmd/compile/internal/staticinit/sched.go
@@ -8,6 +8,8 @@
 	"fmt"
 	"go/constant"
 	"go/token"
+	"os"
+	"strings"
 
 	"cmd/compile/internal/base"
 	"cmd/compile/internal/ir"
@@ -16,6 +18,7 @@
 	"cmd/compile/internal/typecheck"
 	"cmd/compile/internal/types"
 	"cmd/internal/obj"
+	"cmd/internal/objabi"
 	"cmd/internal/src"
 )
 
@@ -55,6 +58,28 @@
 	}
 }
 
+// varToMapInit holds book-keeping state for global map initialization;
+// it records the init function created by the compiler to host the
+// initialization code for the map in question.
+var varToMapInit map[*ir.Name]*ir.Func
+
+// MapInitToVar is the inverse of VarToMapInit; it maintains a mapping
+// from a compiler-generated init function to the map the function is
+// initializing.
+var MapInitToVar map[*ir.Func]*ir.Name
+
+// recordFuncForVar establishes a mapping between global map var "v" and
+// outlined init function "fn" (and vice versa); so that we can use
+// the mappings later on to update relocations.
+func recordFuncForVar(v *ir.Name, fn *ir.Func) {
+	if varToMapInit == nil {
+		varToMapInit = make(map[*ir.Name]*ir.Func)
+		MapInitToVar = make(map[*ir.Func]*ir.Name)
+	}
+	varToMapInit[v] = fn
+	MapInitToVar[fn] = v
+}
+
 // tryStaticInit attempts to statically execute an initialization
 // statement and reports whether it succeeded.
 func (s *Schedule) tryStaticInit(nn ir.Node) bool {
@@ -305,6 +330,12 @@
 			if base.Debug.Closure > 0 {
 				base.WarnfAt(r.Pos(), "closure converted to global")
 			}
+			// Issue 59680: if the closure we're looking at was produced
+			// by inlining, it could be marked as hidden, which we don't
+			// want (moving the func to a static init will effectively
+			// hide it from escape analysis). Mark as non-hidden here.
+			// so that it will participated in escape analysis.
+			r.Func.SetIsHiddenClosure(false)
 			// Closures with no captured variables are globals,
 			// so the assignment can be done at link time.
 			// TODO if roff != 0 { panic }
@@ -333,7 +364,7 @@
 			return val.Op() == ir.ONIL
 		}
 
-		if base.Debug.Unified != 0 && val.Type().HasShape() {
+		if val.Type().HasShape() {
 			// See comment in cmd/compile/internal/walk/convert.go:walkConvInterface
 			return false
 		}
@@ -842,20 +873,22 @@
 		}
 		x = ir.Copy(x)
 		ir.EditChildrenWithHidden(x, edit)
-		if x, ok := x.(*ir.ConvExpr); ok && x.X.Op() == ir.OLITERAL {
-			// A conversion of variable or expression involving variables
-			// may become a conversion of constant after inlining the parameters
-			// and doing constant evaluation. Truncations that were valid
-			// on variables are not valid on constants, so we might have
-			// generated invalid code that will trip up the rest of the compiler.
-			// Fix those by truncating the constants.
-			if x, ok := truncate(x.X.(*ir.ConstExpr), x.Type()); ok {
+
+		// TODO: handle more operations, see details discussion in go.dev/cl/466277.
+		switch x.Op() {
+		case ir.OCONV:
+			x := x.(*ir.ConvExpr)
+			if x.X.Op() == ir.OLITERAL {
+				if x, ok := truncate(x.X, x.Type()); ok {
+					return x
+				}
+				valid = false
 				return x
 			}
-			valid = false
-			return x
+		case ir.OADDSTR:
+			return addStr(x.(*ir.AddStringExpr))
 		}
-		return typecheck.EvalConst(x)
+		return x
 	}
 	n = edit(n)
 	return n, valid
@@ -864,7 +897,7 @@
 // truncate returns the result of force converting c to type t,
 // truncating its value as needed, like a conversion of a variable.
 // If the conversion is too difficult, truncate returns nil, false.
-func truncate(c *ir.ConstExpr, t *types.Type) (*ir.ConstExpr, bool) {
+func truncate(c ir.Node, t *types.Type) (ir.Node, bool) {
 	ct := c.Type()
 	cv := c.Val()
 	if ct.Kind() != t.Kind() {
@@ -886,7 +919,211 @@
 			}
 		}
 	}
-	c = ir.NewConstExpr(cv, c).(*ir.ConstExpr)
+	c = ir.NewConstExpr(cv, c)
 	c.SetType(t)
 	return c, true
 }
+
+func addStr(n *ir.AddStringExpr) ir.Node {
+	// Merge adjacent constants in the argument list.
+	s := n.List
+	need := 0
+	for i := 0; i < len(s); i++ {
+		if i == 0 || !ir.IsConst(s[i-1], constant.String) || !ir.IsConst(s[i], constant.String) {
+			// Can't merge s[i] into s[i-1]; need a slot in the list.
+			need++
+		}
+	}
+	if need == len(s) {
+		return n
+	}
+	if need == 1 {
+		var strs []string
+		for _, c := range s {
+			strs = append(strs, ir.StringVal(c))
+		}
+		return typecheck.OrigConst(n, constant.MakeString(strings.Join(strs, "")))
+	}
+	newList := make([]ir.Node, 0, need)
+	for i := 0; i < len(s); i++ {
+		if ir.IsConst(s[i], constant.String) && i+1 < len(s) && ir.IsConst(s[i+1], constant.String) {
+			// merge from i up to but not including i2
+			var strs []string
+			i2 := i
+			for i2 < len(s) && ir.IsConst(s[i2], constant.String) {
+				strs = append(strs, ir.StringVal(s[i2]))
+				i2++
+			}
+
+			nl := ir.Copy(n).(*ir.AddStringExpr)
+			nl.List = s[i:i2]
+			newList = append(newList, typecheck.OrigConst(nl, constant.MakeString(strings.Join(strs, ""))))
+			i = i2 - 1
+		} else {
+			newList = append(newList, s[i])
+		}
+	}
+
+	nn := ir.Copy(n).(*ir.AddStringExpr)
+	nn.List = newList
+	return nn
+}
+
+const wrapGlobalMapInitSizeThreshold = 20
+
+// tryWrapGlobalMapInit examines the node 'n' to see if it is a map
+// variable initialization, and if so, possibly returns the mapvar
+// being assigned, a new function containing the init code, and a call
+// to the function passing the mapvar. Returns will be nil if the
+// assignment is not to a map, or the map init is not big enough,
+// or if the expression being assigned to the map has side effects.
+func tryWrapGlobalMapInit(n ir.Node) (mapvar *ir.Name, genfn *ir.Func, call ir.Node) {
+	// Look for "X = ..." where X has map type.
+	// FIXME: might also be worth trying to look for cases where
+	// the LHS is of interface type but RHS is map type.
+	if n.Op() != ir.OAS {
+		return nil, nil, nil
+	}
+	as := n.(*ir.AssignStmt)
+	if ir.IsBlank(as.X) || as.X.Op() != ir.ONAME {
+		return nil, nil, nil
+	}
+	nm := as.X.(*ir.Name)
+	if !nm.Type().IsMap() {
+		return nil, nil, nil
+	}
+
+	// Determine size of RHS.
+	rsiz := 0
+	ir.Any(as.Y, func(n ir.Node) bool {
+		rsiz++
+		return false
+	})
+	if base.Debug.WrapGlobalMapDbg > 0 {
+		fmt.Fprintf(os.Stderr, "=-= mapassign %s %v rhs size %d\n",
+			base.Ctxt.Pkgpath, n, rsiz)
+	}
+
+	// Reject smaller candidates if not in stress mode.
+	if rsiz < wrapGlobalMapInitSizeThreshold && base.Debug.WrapGlobalMapCtl != 2 {
+		if base.Debug.WrapGlobalMapDbg > 1 {
+			fmt.Fprintf(os.Stderr, "=-= skipping %v size too small at %d\n",
+				nm, rsiz)
+		}
+		return nil, nil, nil
+	}
+
+	// Reject right hand sides with side effects.
+	if AnySideEffects(as.Y) {
+		if base.Debug.WrapGlobalMapDbg > 0 {
+			fmt.Fprintf(os.Stderr, "=-= rejected %v due to side effects\n", nm)
+		}
+		return nil, nil, nil
+	}
+
+	if base.Debug.WrapGlobalMapDbg > 1 {
+		fmt.Fprintf(os.Stderr, "=-= committed for: %+v\n", n)
+	}
+
+	// Create a new function that will (eventually) have this form:
+	//
+	//    func map.init.%d() {
+	//      globmapvar = <map initialization>
+	//    }
+	//
+	minitsym := typecheck.LookupNum("map.init.", mapinitgen)
+	mapinitgen++
+	newfn := typecheck.DeclFunc(minitsym, nil, nil, nil)
+	if base.Debug.WrapGlobalMapDbg > 0 {
+		fmt.Fprintf(os.Stderr, "=-= generated func is %v\n", newfn)
+	}
+
+	// NB: we're relying on this phase being run before inlining;
+	// if for some reason we need to move it after inlining, we'll
+	// need code here that relocates or duplicates inline temps.
+
+	// Insert assignment into function body; mark body finished.
+	newfn.Body = append(newfn.Body, as)
+	typecheck.FinishFuncBody()
+
+	typecheck.Func(newfn)
+
+	const no = `
+	// Register new function with decls.
+	typecheck.Target.Decls = append(typecheck.Target.Decls, newfn)
+`
+
+	// Create call to function, passing mapvar.
+	fncall := ir.NewCallExpr(n.Pos(), ir.OCALL, newfn.Nname, nil)
+
+	if base.Debug.WrapGlobalMapDbg > 1 {
+		fmt.Fprintf(os.Stderr, "=-= mapvar is %v\n", nm)
+		fmt.Fprintf(os.Stderr, "=-= newfunc is %+v\n", newfn)
+		fmt.Fprintf(os.Stderr, "=-= call is %+v\n", fncall)
+	}
+
+	return nm, newfn, typecheck.Stmt(fncall)
+}
+
+// mapinitgen is a counter used to uniquify compiler-generated
+// map init functions.
+var mapinitgen int
+
+// AddKeepRelocations adds a dummy "R_KEEP" relocation from each
+// global map variable V to its associated outlined init function.
+// These relocation ensure that if the map var itself is determined to
+// be reachable at link time, we also mark the init function as
+// reachable.
+func AddKeepRelocations() {
+	if varToMapInit == nil {
+		return
+	}
+	for k, v := range varToMapInit {
+		// Add R_KEEP relocation from map to init function.
+		fs := v.Linksym()
+		if fs == nil {
+			base.Fatalf("bad: func %v has no linksym", v)
+		}
+		vs := k.Linksym()
+		if vs == nil {
+			base.Fatalf("bad: mapvar %v has no linksym", k)
+		}
+		r := obj.Addrel(vs)
+		r.Sym = fs
+		r.Type = objabi.R_KEEP
+		if base.Debug.WrapGlobalMapDbg > 1 {
+			fmt.Fprintf(os.Stderr, "=-= add R_KEEP relo from %s to %s\n",
+				vs.Name, fs.Name)
+		}
+	}
+	varToMapInit = nil
+}
+
+// OutlineMapInits walks through a list of init statements (candidates
+// for inclusion in the package "init" function) and returns an
+// updated list in which items corresponding to map variable
+// initializations have been replaced with calls to outline "map init"
+// functions (if legal/profitable). Return value is an updated list
+// and a list of any newly generated "map init" functions.
+func OutlineMapInits(stmts []ir.Node) ([]ir.Node, []*ir.Func) {
+	if base.Debug.WrapGlobalMapCtl == 1 {
+		return stmts, nil
+	}
+	newfuncs := []*ir.Func{}
+	for i := range stmts {
+		s := stmts[i]
+		// Call the helper tryWrapGlobalMapInit to see if the LHS of
+		// this assignment is to a map var, and if so whether the RHS
+		// should be outlined into a separate init function. If the
+		// outline goes through, then replace the original init
+		// statement with the call to the outlined func, and append
+		// the new outlined func to our return list.
+		if mapvar, genfn, call := tryWrapGlobalMapInit(s); call != nil {
+			stmts[i] = call
+			newfuncs = append(newfuncs, genfn)
+			recordFuncForVar(mapvar, genfn)
+		}
+	}
+
+	return stmts, newfuncs
+}
diff --git a/src/cmd/compile/internal/syntax/nodes.go b/src/cmd/compile/internal/syntax/nodes.go
index e943a9a..6580f05 100644
--- a/src/cmd/compile/internal/syntax/nodes.go
+++ b/src/cmd/compile/internal/syntax/nodes.go
@@ -34,10 +34,11 @@
 
 // package PkgName; DeclList[0], DeclList[1], ...
 type File struct {
-	Pragma   Pragma
-	PkgName  *Name
-	DeclList []Decl
-	EOF      Pos
+	Pragma    Pragma
+	PkgName   *Name
+	DeclList  []Decl
+	EOF       Pos
+	GoVersion string
 	node
 }
 
diff --git a/src/cmd/compile/internal/syntax/parser.go b/src/cmd/compile/internal/syntax/parser.go
index ee9761e..b5602fc 100644
--- a/src/cmd/compile/internal/syntax/parser.go
+++ b/src/cmd/compile/internal/syntax/parser.go
@@ -6,6 +6,7 @@
 
 import (
 	"fmt"
+	"go/build/constraint"
 	"io"
 	"strconv"
 	"strings"
@@ -21,17 +22,20 @@
 	pragh PragmaHandler
 	scanner
 
-	base   *PosBase // current position base
-	first  error    // first error encountered
-	errcnt int      // number of errors encountered
-	pragma Pragma   // pragmas
+	base      *PosBase // current position base
+	first     error    // first error encountered
+	errcnt    int      // number of errors encountered
+	pragma    Pragma   // pragmas
+	goVersion string   // Go version from //go:build line
 
+	top    bool   // in top of file (before package clause)
 	fnest  int    // function nesting level (for error handling)
 	xnest  int    // expression nesting level (for complit ambiguity resolution)
 	indent []byte // tracing support
 }
 
 func (p *parser) init(file *PosBase, r io.Reader, errh ErrorHandler, pragh PragmaHandler, mode Mode) {
+	p.top = true
 	p.file = file
 	p.errh = errh
 	p.mode = mode
@@ -70,8 +74,15 @@
 			}
 
 			// go: directive (but be conservative and test)
-			if pragh != nil && strings.HasPrefix(text, "go:") {
-				p.pragma = pragh(p.posAt(line, col+2), p.scanner.blank, text, p.pragma) // +2 to skip over // or /*
+			if strings.HasPrefix(text, "go:") {
+				if p.top && strings.HasPrefix(msg, "//go:build") {
+					if x, err := constraint.Parse(msg); err == nil {
+						p.goVersion = constraint.GoVersion(x)
+					}
+				}
+				if pragh != nil {
+					p.pragma = pragh(p.posAt(line, col+2), p.scanner.blank, text, p.pragma) // +2 to skip over // or /*
+				}
 			}
 		},
 		directives,
@@ -388,6 +399,8 @@
 	f.pos = p.pos()
 
 	// PackageClause
+	f.GoVersion = p.goVersion
+	p.top = false
 	if !p.got(_Package) {
 		p.syntaxError("package statement must be first")
 		return nil
@@ -2356,10 +2369,8 @@
 		// further confusion.
 		var str string
 		if as, ok := s.(*AssignStmt); ok && as.Op == 0 {
-			// Emphasize Lhs and Rhs of assignment with parentheses to highlight '='.
-			// Do it always - it's not worth going through the trouble of doing it
-			// only for "complex" left and right sides.
-			str = "assignment (" + String(as.Lhs) + ") = (" + String(as.Rhs) + ")"
+			// Emphasize complex Lhs and Rhs of assignment with parentheses to highlight '='.
+			str = "assignment " + emphasize(as.Lhs) + " = " + emphasize(as.Rhs)
 		} else {
 			str = String(s)
 		}
@@ -2370,6 +2381,17 @@
 	return
 }
 
+// emphasize returns a string representation of x, with (top-level)
+// binary expressions emphasized by enclosing them in parentheses.
+func emphasize(x Expr) string {
+	s := String(x)
+	if op, _ := x.(*Operation); op != nil && op.Y != nil {
+		// binary expression
+		return "(" + s + ")"
+	}
+	return s
+}
+
 func (p *parser) ifStmt() *IfStmt {
 	if trace {
 		defer p.trace("ifStmt")()
diff --git a/src/cmd/compile/internal/syntax/parser_test.go b/src/cmd/compile/internal/syntax/parser_test.go
index 74583ca..d5d4290 100644
--- a/src/cmd/compile/internal/syntax/parser_test.go
+++ b/src/cmd/compile/internal/syntax/parser_test.go
@@ -70,6 +70,18 @@
 			filepath.Join(goroot, "src"),
 			filepath.Join(goroot, "misc"),
 		} {
+			if filepath.Base(dir) == "misc" {
+				// cmd/distpack deletes GOROOT/misc, so skip that directory if it isn't present.
+				// cmd/distpack also requires GOROOT/VERSION to exist, so use that to
+				// suppress false-positive skips.
+				if _, err := os.Stat(dir); os.IsNotExist(err) {
+					if _, err := os.Stat(filepath.Join(testenv.GOROOT(t), "VERSION")); err == nil {
+						fmt.Printf("%s not present; skipping\n", dir)
+						continue
+					}
+				}
+			}
+
 			walkDirs(t, dir, func(filename string) {
 				if skipRx != nil && skipRx.MatchString(filename) {
 					// Always report skipped files since regexp
diff --git a/src/cmd/compile/internal/syntax/pos.go b/src/cmd/compile/internal/syntax/pos.go
index b5e53d2..dd25d4f 100644
--- a/src/cmd/compile/internal/syntax/pos.go
+++ b/src/cmd/compile/internal/syntax/pos.go
@@ -8,6 +8,8 @@
 
 // PosMax is the largest line or column value that can be represented without loss.
 // Incoming values (arguments) larger than PosMax will be set to PosMax.
+//
+// Keep this consistent with maxLineCol in go/scanner.
 const PosMax = 1 << 30
 
 // A Pos represents an absolute (line, col) source position
diff --git a/src/cmd/compile/internal/syntax/testdata/issue60599.go b/src/cmd/compile/internal/syntax/testdata/issue60599.go
new file mode 100644
index 0000000..711d97b
--- /dev/null
+++ b/src/cmd/compile/internal/syntax/testdata/issue60599.go
@@ -0,0 +1,11 @@
+// Copyright 2023 The Go Authors. 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
+
+func _(x, y, z int) {
+	if x /* ERROR cannot use assignment x = y as value */ = y {}
+	if x || y /* ERROR cannot use assignment \(x || y\) = z as value */ = z {}
+	if x /* ERROR cannot use assignment x = \(y || z\) as value */ = y || z {}
+}
diff --git a/src/cmd/compile/internal/syntax/testing.go b/src/cmd/compile/internal/syntax/testing.go
index 6a97dc0..202b2ef 100644
--- a/src/cmd/compile/internal/syntax/testing.go
+++ b/src/cmd/compile/internal/syntax/testing.go
@@ -9,7 +9,6 @@
 import (
 	"io"
 	"regexp"
-	"strings"
 )
 
 // CommentsDo parses the given source and calls the provided handler for each
@@ -23,21 +22,18 @@
 	}
 }
 
-// ERROR comments must start with text `ERROR "msg"` or `ERROR msg`.
-// Space around "msg" or msg is ignored.
-var errRx = regexp.MustCompile(`^ *ERROR *"?([^"]*)"?`)
-
-// ErrorMap collects all comments with comment text of the form
-// `ERROR "msg"` or `ERROR msg` from the given src and returns them
-// as []Error lists in a map indexed by line number. The position
-// for each Error is the position of the token immediately preceding
-// the comment, the Error message is the message msg extracted from
-// the comment, with all errors that are on the same line collected
-// in a slice, in source order. If there is no preceding token (the
-// `ERROR` comment appears in the beginning of the file), then the
-// recorded position is unknown (line, col = 0, 0). If there are no
-// ERROR comments, the result is nil.
-func ErrorMap(src io.Reader) (errmap map[uint][]Error) {
+// CommentMap collects all comments in the given src with comment text
+// that matches the supplied regular expression rx and returns them as
+// []Error lists in a map indexed by line number. The comment text is
+// the comment with any comment markers ("//", "/*", or "*/") stripped.
+// The position for each Error is the position of the token immediately
+// preceding the comment and the Error message is the comment text,
+// with all comments that are on the same line collected in a slice, in
+// source order. If there is no preceding token (the matching comment
+// appears at the beginning of the file), then the recorded position
+// is unknown (line, col = 0, 0). If there are no matching comments,
+// the result is nil.
+func CommentMap(src io.Reader, rx *regexp.Regexp) (res map[uint][]Error) {
 	// position of previous token
 	var base *PosBase
 	var prev struct{ line, col uint }
@@ -45,18 +41,19 @@
 	var s scanner
 	s.init(src, func(_, _ uint, text string) {
 		if text[0] != '/' {
-			return // error, ignore
+			return // not a comment, ignore
 		}
 		if text[1] == '*' {
 			text = text[:len(text)-2] // strip trailing */
 		}
-		if s := errRx.FindStringSubmatch(text[2:]); len(s) == 2 {
+		text = text[2:] // strip leading // or /*
+		if rx.MatchString(text) {
 			pos := MakePos(base, prev.line, prev.col)
-			err := Error{pos, strings.TrimSpace(s[1])}
-			if errmap == nil {
-				errmap = make(map[uint][]Error)
+			err := Error{pos, text}
+			if res == nil {
+				res = make(map[uint][]Error)
 			}
-			errmap[prev.line] = append(errmap[prev.line], err)
+			res[prev.line] = append(res[prev.line], err)
 		}
 	}, comments)
 
diff --git a/src/cmd/compile/internal/syntax/testing_test.go b/src/cmd/compile/internal/syntax/testing_test.go
index d34e5ea..7e439c5 100644
--- a/src/cmd/compile/internal/syntax/testing_test.go
+++ b/src/cmd/compile/internal/syntax/testing_test.go
@@ -6,22 +6,23 @@
 
 import (
 	"fmt"
+	"regexp"
 	"strings"
 	"testing"
 )
 
-func TestErrorMap(t *testing.T) {
-	const src = `/* ERROR 0:0 */ /* ERROR "0:0" */ // ERROR 0:0
+func TestCommentMap(t *testing.T) {
+	const src = `/* ERROR "0:0" */ /* ERROR "0:0" */ // ERROR "0:0"
 // ERROR "0:0"
-x /* ERROR 3:1 */                // ignore automatically inserted semicolon here
-/* ERROR 3:1 */                  // position of x on previous line
-   x /* ERROR 5:4 */ ;           // do not ignore this semicolon
-/* ERROR 5:22 */                 // position of ; on previous line
-	package /* ERROR 7:2 */  // indented with tab
-        import  /* ERROR 8:9 */  // indented with blanks
+x /* ERROR "3:1" */                // ignore automatically inserted semicolon here
+/* ERROR "3:1" */                  // position of x on previous line
+   x /* ERROR "5:4" */ ;           // do not ignore this semicolon
+/* ERROR "5:24" */                 // position of ; on previous line
+	package /* ERROR "7:2" */  // indented with tab
+        import  /* ERROR "8:9" */  // indented with blanks
 `
-	m := ErrorMap(strings.NewReader(src))
-	got := 0 // number of errors found
+	m := CommentMap(strings.NewReader(src), regexp.MustCompile("^ ERROR "))
+	found := 0 // number of errors found
 	for line, errlist := range m {
 		for _, err := range errlist {
 			if err.Pos.Line() != line {
@@ -29,17 +30,19 @@
 				continue
 			}
 			// err.Pos.Line() == line
-			msg := fmt.Sprintf("%d:%d", line, err.Pos.Col())
-			if err.Msg != msg {
-				t.Errorf("%v: got msg %q; want %q", err, err.Msg, msg)
+
+			got := strings.TrimSpace(err.Msg[len(" ERROR "):])
+			want := fmt.Sprintf(`"%d:%d"`, line, err.Pos.Col())
+			if got != want {
+				t.Errorf("%v: got msg %q; want %q", err, got, want)
 				continue
 			}
+			found++
 		}
-		got += len(errlist)
 	}
 
-	want := strings.Count(src, "ERROR")
-	if got != want {
-		t.Errorf("ErrorMap got %d errors; want %d", got, want)
+	want := strings.Count(src, " ERROR ")
+	if found != want {
+		t.Errorf("CommentMap got %d errors; want %d", found, want)
 	}
 }
diff --git a/src/cmd/compile/internal/syntax/walk.go b/src/cmd/compile/internal/syntax/walk.go
index 8f1d566..b03a7c1 100644
--- a/src/cmd/compile/internal/syntax/walk.go
+++ b/src/cmd/compile/internal/syntax/walk.go
@@ -8,10 +8,9 @@
 
 import "fmt"
 
-// Inspect traverses an AST in pre-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).
+// Inspect traverses an AST in pre-order: it starts by calling f(root);
+// root must not be nil. If f returns true, Inspect invokes f recursively
+// for each of the non-nil children of root, followed by a call of f(nil).
 //
 // See Walk for caveats about shared nodes.
 func Inspect(root Node, f func(Node) bool) {
@@ -27,21 +26,6 @@
 	return nil
 }
 
-// Crawl traverses a syntax in pre-order: It starts by calling f(root);
-// root must not be nil. If f returns false (== "continue"), Crawl calls
-// f recursively for each of the non-nil children of that node; if f
-// returns true (== "stop"), Crawl does not traverse the respective node's
-// children.
-//
-// See Walk for caveats about shared nodes.
-//
-// Deprecated: Use Inspect instead.
-func Crawl(root Node, f func(Node) bool) {
-	Inspect(root, func(node Node) bool {
-		return node != nil && !f(node)
-	})
-}
-
 // Walk traverses an AST in pre-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
diff --git a/src/cmd/compile/internal/test/abiutils_test.go b/src/cmd/compile/internal/test/abiutils_test.go
index 3f8ee3d..8ed7622 100644
--- a/src/cmd/compile/internal/test/abiutils_test.go
+++ b/src/cmd/compile/internal/test/abiutils_test.go
@@ -313,7 +313,7 @@
 	fldt := mkFuncType(types.FakeRecvType(), []*types.Type{},
 		[]*types.Type{types.Types[types.TSTRING]})
 	field := types.NewField(src.NoXPos, typecheck.Lookup("F"), fldt)
-	nei := types.NewInterface(types.LocalPkg, []*types.Field{field}, false)
+	nei := types.NewInterface([]*types.Field{field})
 	i16 := types.Types[types.TINT16]
 	tb := types.Types[types.TBOOL]
 	s1 := mkstruct([]*types.Type{i16, i16, tb})
diff --git a/src/cmd/compile/internal/test/abiutilsaux_test.go b/src/cmd/compile/internal/test/abiutilsaux_test.go
index b945633..07b8eb7 100644
--- a/src/cmd/compile/internal/test/abiutilsaux_test.go
+++ b/src/cmd/compile/internal/test/abiutilsaux_test.go
@@ -39,7 +39,7 @@
 		f := types.NewField(src.NoXPos, nil, t)
 		fields[k] = f
 	}
-	s := types.NewStruct(types.LocalPkg, fields)
+	s := types.NewStruct(fields)
 	return s
 }
 
@@ -57,7 +57,7 @@
 	if rcvr != nil {
 		rf = mkParamResultField(rcvr, q, ir.PPARAM)
 	}
-	return types.NewSignature(types.LocalPkg, rf, nil, inf, outf)
+	return types.NewSignature(rf, inf, outf)
 }
 
 type expectedDump struct {
diff --git a/src/cmd/compile/internal/test/fixedbugs_test.go b/src/cmd/compile/internal/test/fixedbugs_test.go
index cf607b7..8ff7a60 100644
--- a/src/cmd/compile/internal/test/fixedbugs_test.go
+++ b/src/cmd/compile/internal/test/fixedbugs_test.go
@@ -58,14 +58,10 @@
 // Test that the generated assembly has line numbers (Issue #16214).
 func TestIssue16214(t *testing.T) {
 	testenv.MustHaveGoBuild(t)
-	dir, err := os.MkdirTemp("", "TestLineNumber")
-	if err != nil {
-		t.Fatalf("could not create directory: %v", err)
-	}
-	defer os.RemoveAll(dir)
+	dir := t.TempDir()
 
 	src := filepath.Join(dir, "x.go")
-	err = os.WriteFile(src, []byte(issue16214src), 0644)
+	err := os.WriteFile(src, []byte(issue16214src), 0644)
 	if err != nil {
 		t.Fatalf("could not write file: %v", err)
 	}
diff --git a/src/cmd/compile/internal/test/global_test.go b/src/cmd/compile/internal/test/global_test.go
index 2cf93dc..c8b3370 100644
--- a/src/cmd/compile/internal/test/global_test.go
+++ b/src/cmd/compile/internal/test/global_test.go
@@ -20,11 +20,7 @@
 	t.Parallel()
 
 	// Make a directory to work in.
-	dir, err := os.MkdirTemp("", "issue6853a-")
-	if err != nil {
-		t.Fatalf("could not create directory: %v", err)
-	}
-	defer os.RemoveAll(dir)
+	dir := t.TempDir()
 
 	// Create source.
 	src := filepath.Join(dir, "test.go")
@@ -68,11 +64,7 @@
 	t.Parallel()
 
 	// Make a directory to work in.
-	dir, err := os.MkdirTemp("", "issue14515-")
-	if err != nil {
-		t.Fatalf("could not create directory: %v", err)
-	}
-	defer os.RemoveAll(dir)
+	dir := t.TempDir()
 
 	// Create source.
 	src := filepath.Join(dir, "test.go")
diff --git a/src/cmd/compile/internal/test/inl_test.go b/src/cmd/compile/internal/test/inl_test.go
index 201f577..205b746 100644
--- a/src/cmd/compile/internal/test/inl_test.go
+++ b/src/cmd/compile/internal/test/inl_test.go
@@ -6,7 +6,6 @@
 
 import (
 	"bufio"
-	"internal/buildcfg"
 	"internal/goexperiment"
 	"internal/testenv"
 	"io"
@@ -88,6 +87,8 @@
 			"(*mspan).markBitsForIndex",
 			"(*muintptr).set",
 			"(*puintptr).set",
+			"(*wbBuf).get1",
+			"(*wbBuf).get2",
 		},
 		"runtime/internal/sys": {},
 		"runtime/internal/math": {
@@ -123,6 +124,9 @@
 			"AppendRune",
 			"ValidRune",
 		},
+		"unicode/utf16": {
+			"Decode",
+		},
 		"reflect": {
 			"Value.Bool",
 			"Value.Bytes",
@@ -176,6 +180,15 @@
 		"net": {
 			"(*UDPConn).ReadFromUDP",
 		},
+		"sync": {
+			// Both OnceFunc and its returned closure need to be inlinable so
+			// that the returned closure can be inlined into the caller of OnceFunc.
+			"OnceFunc",
+			"OnceFunc.func2", // The returned closure.
+			// TODO(austin): It would be good to check OnceValue and OnceValues,
+			// too, but currently they aren't reported because they have type
+			// parameters and aren't instantiated in sync.
+		},
 		"sync/atomic": {
 			// (*Bool).CompareAndSwap handled below.
 			"(*Bool).Load",
@@ -206,7 +219,10 @@
 			"(*Uintptr).Load",
 			"(*Uintptr).Store",
 			"(*Uintptr).Swap",
-			// (*Pointer[T])'s methods' handled below.
+			"(*Pointer[go.shape.int]).CompareAndSwap",
+			"(*Pointer[go.shape.int]).Load",
+			"(*Pointer[go.shape.int]).Store",
+			"(*Pointer[go.shape.int]).Swap",
 		},
 	}
 
@@ -232,14 +248,6 @@
 		// (*Bool).CompareAndSwap is just over budget on 32-bit systems (386, arm).
 		want["sync/atomic"] = append(want["sync/atomic"], "(*Bool).CompareAndSwap")
 	}
-	if buildcfg.Experiment.Unified {
-		// Non-unified IR does not report "inlining call ..." for atomic.Pointer[T]'s methods.
-		// TODO(cuonglm): remove once non-unified IR frontend gone.
-		want["sync/atomic"] = append(want["sync/atomic"], "(*Pointer[go.shape.int]).CompareAndSwap")
-		want["sync/atomic"] = append(want["sync/atomic"], "(*Pointer[go.shape.int]).Load")
-		want["sync/atomic"] = append(want["sync/atomic"], "(*Pointer[go.shape.int]).Store")
-		want["sync/atomic"] = append(want["sync/atomic"], "(*Pointer[go.shape.int]).Swap")
-	}
 
 	switch runtime.GOARCH {
 	case "386", "wasm", "arm":
diff --git a/src/cmd/compile/internal/test/inst_test.go b/src/cmd/compile/internal/test/inst_test.go
index de435de..069e2ff 100644
--- a/src/cmd/compile/internal/test/inst_test.go
+++ b/src/cmd/compile/internal/test/inst_test.go
@@ -18,21 +18,14 @@
 	testenv.MustHaveGoBuild(t)
 	testenv.MustHaveGoRun(t)
 
-	var tmpdir string
-	var err error
-	tmpdir, err = os.MkdirTemp("", "TestDict")
-	if err != nil {
-		t.Fatalf("Failed to create temporary directory: %v", err)
-	}
-	defer os.RemoveAll(tmpdir)
-
 	// Build ptrsort.go, which uses package mysort.
 	var output []byte
+	var err error
 	filename := "ptrsort.go"
 	exename := "ptrsort"
 	outname := "ptrsort.out"
 	gotool := testenv.GoToolPath(t)
-	dest := filepath.Join(tmpdir, exename)
+	dest := filepath.Join(t.TempDir(), exename)
 	cmd := testenv.Command(t, gotool, "build", "-o", dest, filepath.Join("testdata", filename))
 	if output, err = cmd.CombinedOutput(); err != nil {
 		t.Fatalf("Failed: %v:\nOutput: %s\n", err, output)
diff --git a/src/cmd/compile/internal/test/issue57434_test.go b/src/cmd/compile/internal/test/issue57434_test.go
new file mode 100644
index 0000000..6a34b54
--- /dev/null
+++ b/src/cmd/compile/internal/test/issue57434_test.go
@@ -0,0 +1,38 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package test
+
+import (
+	"testing"
+)
+
+var output int
+
+type Object struct {
+	Val int
+}
+
+func (o *Object) Initialize() *Object {
+	o.Val = 5
+	return o
+}
+
+func (o *Object) Update() *Object {
+	o.Val = o.Val + 1
+	return o
+}
+
+func TestAutotmpLoopDepth(t *testing.T) {
+	f := func() {
+		for i := 0; i < 10; i++ {
+			var obj Object
+			obj.Initialize().Update()
+			output = obj.Val
+		}
+	}
+	if n := testing.AllocsPerRun(10, f); n > 0 {
+		t.Error("obj moved to heap")
+	}
+}
diff --git a/src/cmd/compile/internal/test/lang_test.go b/src/cmd/compile/internal/test/lang_test.go
index 0b957dc..34ed378 100644
--- a/src/cmd/compile/internal/test/lang_test.go
+++ b/src/cmd/compile/internal/test/lang_test.go
@@ -22,11 +22,7 @@
 
 	testenv.MustHaveGoBuild(t)
 
-	dir, err := os.MkdirTemp("", "TestInvalidLang")
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer os.RemoveAll(dir)
+	dir := t.TempDir()
 
 	src := filepath.Join(dir, "alias.go")
 	if err := os.WriteFile(src, []byte(aliasSrc), 0644); err != nil {
diff --git a/src/cmd/compile/internal/test/math_test.go b/src/cmd/compile/internal/test/math_test.go
new file mode 100644
index 0000000..6bcb460
--- /dev/null
+++ b/src/cmd/compile/internal/test/math_test.go
@@ -0,0 +1,167 @@
+package test
+
+import (
+	"testing"
+)
+
+var Output int
+
+func BenchmarkDiv64UnsignedSmall(b *testing.B) {
+	q := uint64(1)
+	for i := 1; i <= b.N; i++ {
+		q = (q + uint64(i)) / uint64(i)
+	}
+	Output = int(q)
+}
+
+func BenchmarkDiv64Small(b *testing.B) {
+	q := int64(1)
+	for i := 1; i <= b.N; i++ {
+		q = (q + int64(i)) / int64(i)
+	}
+	Output = int(q)
+}
+
+func BenchmarkDiv64SmallNegDivisor(b *testing.B) {
+	q := int64(-1)
+	for i := 1; i <= b.N; i++ {
+		q = (int64(i) - q) / -int64(i)
+	}
+	Output = int(q)
+}
+
+func BenchmarkDiv64SmallNegDividend(b *testing.B) {
+	q := int64(-1)
+	for i := 1; i <= b.N; i++ {
+		q = -(int64(i) - q) / int64(i)
+	}
+	Output = int(q)
+}
+
+func BenchmarkDiv64SmallNegBoth(b *testing.B) {
+	q := int64(1)
+	for i := 1; i <= b.N; i++ {
+		q = -(int64(i) + q) / -int64(i)
+	}
+	Output = int(q)
+}
+
+func BenchmarkDiv64Unsigned(b *testing.B) {
+	q := uint64(1)
+	for i := 1; i <= b.N; i++ {
+		q = (uint64(0x7fffffffffffffff) - uint64(i) - (q & 1)) / uint64(i)
+	}
+	Output = int(q)
+}
+
+func BenchmarkDiv64(b *testing.B) {
+	q := int64(1)
+	for i := 1; i <= b.N; i++ {
+		q = (int64(0x7fffffffffffffff) - int64(i) - (q & 1)) / int64(i)
+	}
+	Output = int(q)
+}
+
+func BenchmarkDiv64NegDivisor(b *testing.B) {
+	q := int64(-1)
+	for i := 1; i <= b.N; i++ {
+		q = (int64(0x7fffffffffffffff) - int64(i) - (q & 1)) / -int64(i)
+	}
+	Output = int(q)
+}
+
+func BenchmarkDiv64NegDividend(b *testing.B) {
+	q := int64(-1)
+	for i := 1; i <= b.N; i++ {
+		q = -(int64(0x7fffffffffffffff) - int64(i) - (q & 1)) / int64(i)
+	}
+	Output = int(q)
+}
+
+func BenchmarkDiv64NegBoth(b *testing.B) {
+	q := int64(-1)
+	for i := 1; i <= b.N; i++ {
+		q = -(int64(0x7fffffffffffffff) - int64(i) - (q & 1)) / -int64(i)
+	}
+	Output = int(q)
+}
+
+func BenchmarkMod64UnsignedSmall(b *testing.B) {
+	r := uint64(1)
+	for i := 1; i <= b.N; i++ {
+		r = (uint64(i) + r) % uint64(i)
+	}
+	Output = int(r)
+}
+
+func BenchmarkMod64Small(b *testing.B) {
+	r := int64(1)
+	for i := 1; i <= b.N; i++ {
+		r = (int64(i) + r) % int64(i)
+	}
+	Output = int(r)
+}
+
+func BenchmarkMod64SmallNegDivisor(b *testing.B) {
+	r := int64(-1)
+	for i := 1; i <= b.N; i++ {
+		r = (int64(i) - r) % -int64(i)
+	}
+	Output = int(r)
+}
+
+func BenchmarkMod64SmallNegDividend(b *testing.B) {
+	r := int64(-1)
+	for i := 1; i <= b.N; i++ {
+		r = -(int64(i) - r) % int64(i)
+	}
+	Output = int(r)
+}
+
+func BenchmarkMod64SmallNegBoth(b *testing.B) {
+	r := int64(1)
+	for i := 1; i <= b.N; i++ {
+		r = -(int64(i) + r) % -int64(i)
+	}
+	Output = int(r)
+}
+
+func BenchmarkMod64Unsigned(b *testing.B) {
+	r := uint64(1)
+	for i := 1; i <= b.N; i++ {
+		r = (uint64(0x7fffffffffffffff) - uint64(i) - (r & 1)) % uint64(i)
+	}
+	Output = int(r)
+}
+
+func BenchmarkMod64(b *testing.B) {
+	r := int64(1)
+	for i := 1; i <= b.N; i++ {
+		r = (int64(0x7fffffffffffffff) - int64(i) - (r & 1)) % int64(i)
+	}
+	Output = int(r)
+}
+
+func BenchmarkMod64NegDivisor(b *testing.B) {
+	r := int64(-1)
+	for i := 1; i <= b.N; i++ {
+		r = (int64(0x7fffffffffffffff) - int64(i) - (r & 1)) % -int64(i)
+	}
+	Output = int(r)
+}
+
+func BenchmarkMod64NegDividend(b *testing.B) {
+	r := int64(-1)
+	for i := 1; i <= b.N; i++ {
+		r = -(int64(0x7fffffffffffffff) - int64(i) - (r & 1)) % int64(i)
+	}
+	Output = int(r)
+}
+
+func BenchmarkMod64NegBoth(b *testing.B) {
+	r := int64(1)
+	for i := 1; i <= b.N; i++ {
+		r = -(int64(0x7fffffffffffffff) - int64(i) - (r & 1)) % -int64(i)
+	}
+	Output = int(r)
+}
diff --git a/src/cmd/compile/internal/test/memcombine_test.go b/src/cmd/compile/internal/test/memcombine_test.go
new file mode 100644
index 0000000..c7e7a20
--- /dev/null
+++ b/src/cmd/compile/internal/test/memcombine_test.go
@@ -0,0 +1,73 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package test
+
+import (
+	"encoding/binary"
+	"testing"
+)
+
+var gv = [16]byte{0, 1, 2, 3, 4, 5, 6, 7, 8}
+
+//go:noinline
+func readGlobalUnaligned() uint64 {
+	return binary.LittleEndian.Uint64(gv[1:])
+}
+
+func TestUnalignedGlobal(t *testing.T) {
+	// Note: this is a test not so much of the result of the read, but of
+	// the correct compilation of that read. On s390x unaligned global
+	// accesses fail to compile.
+	if got, want := readGlobalUnaligned(), uint64(0x0807060504030201); got != want {
+		t.Errorf("read global %x, want %x", got, want)
+	}
+}
+
+func TestSpillOfExtendedEndianLoads(t *testing.T) {
+	b := []byte{0xaa, 0xbb, 0xcc, 0xdd}
+
+	var testCases = []struct {
+		fn   func([]byte) uint64
+		want uint64
+	}{
+		{readUint16le, 0xbbaa},
+		{readUint16be, 0xaabb},
+		{readUint32le, 0xddccbbaa},
+		{readUint32be, 0xaabbccdd},
+	}
+	for _, test := range testCases {
+		if got := test.fn(b); got != test.want {
+			t.Errorf("got %x, want %x", got, test.want)
+		}
+	}
+}
+
+func readUint16le(b []byte) uint64 {
+	y := uint64(binary.LittleEndian.Uint16(b))
+	nop() // force spill
+	return y
+}
+
+func readUint16be(b []byte) uint64 {
+	y := uint64(binary.BigEndian.Uint16(b))
+	nop() // force spill
+	return y
+}
+
+func readUint32le(b []byte) uint64 {
+	y := uint64(binary.LittleEndian.Uint32(b))
+	nop() // force spill
+	return y
+}
+
+func readUint32be(b []byte) uint64 {
+	y := uint64(binary.BigEndian.Uint32(b))
+	nop() // force spill
+	return y
+}
+
+//go:noinline
+func nop() {
+}
diff --git a/src/cmd/compile/internal/test/pgo_devirtualize_test.go b/src/cmd/compile/internal/test/pgo_devirtualize_test.go
new file mode 100644
index 0000000..49e95e9
--- /dev/null
+++ b/src/cmd/compile/internal/test/pgo_devirtualize_test.go
@@ -0,0 +1,128 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package test
+
+import (
+	"bufio"
+	"fmt"
+	"internal/testenv"
+	"os"
+	"path/filepath"
+	"regexp"
+	"testing"
+)
+
+// testPGODevirtualize tests that specific PGO devirtualize rewrites are performed.
+func testPGODevirtualize(t *testing.T, dir string) {
+	testenv.MustHaveGoRun(t)
+	t.Parallel()
+
+	const pkg = "example.com/pgo/devirtualize"
+
+	// Add a go.mod so we have a consistent symbol names in this temp dir.
+	goMod := fmt.Sprintf(`module %s
+go 1.19
+`, pkg)
+	if err := os.WriteFile(filepath.Join(dir, "go.mod"), []byte(goMod), 0644); err != nil {
+		t.Fatalf("error writing go.mod: %v", err)
+	}
+
+	// Build the test with the profile.
+	pprof := filepath.Join(dir, "devirt.pprof")
+	gcflag := fmt.Sprintf("-gcflags=-m=2 -pgoprofile=%s -d=pgodebug=2", pprof)
+	out := filepath.Join(dir, "test.exe")
+	cmd := testenv.CleanCmdEnv(testenv.Command(t, testenv.GoToolPath(t), "build", "-o", out, gcflag, "."))
+	cmd.Dir = dir
+
+	pr, pw, err := os.Pipe()
+	if err != nil {
+		t.Fatalf("error creating pipe: %v", err)
+	}
+	defer pr.Close()
+	cmd.Stdout = pw
+	cmd.Stderr = pw
+
+	err = cmd.Start()
+	pw.Close()
+	if err != nil {
+		t.Fatalf("error starting go test: %v", err)
+	}
+
+	type devirtualization struct {
+		pos    string
+		callee string
+	}
+
+	want := []devirtualization{
+		{
+			pos:    "./devirt.go:61:21",
+			callee: "mult.Mult.Multiply",
+		},
+		{
+			pos:    "./devirt.go:61:31",
+			callee: "Add.Add",
+		},
+	}
+
+	got := make(map[devirtualization]struct{})
+
+	devirtualizedLine := regexp.MustCompile(`(.*): PGO devirtualizing .* to (.*)`)
+
+	scanner := bufio.NewScanner(pr)
+	for scanner.Scan() {
+		line := scanner.Text()
+		t.Logf("child: %s", line)
+
+		m := devirtualizedLine.FindStringSubmatch(line)
+		if m == nil {
+			continue
+		}
+
+		d := devirtualization{
+			pos:    m[1],
+			callee: m[2],
+		}
+		got[d] = struct{}{}
+	}
+	if err := cmd.Wait(); err != nil {
+		t.Fatalf("error running go test: %v", err)
+	}
+	if err := scanner.Err(); err != nil {
+		t.Fatalf("error reading go test output: %v", err)
+	}
+
+	if len(got) != len(want) {
+		t.Errorf("mismatched devirtualization count; got %v want %v", got, want)
+	}
+	for _, w := range want {
+		if _, ok := got[w]; ok {
+			continue
+		}
+		t.Errorf("devirtualization %v missing; got %v", w, got)
+	}
+}
+
+// TestPGODevirtualize tests that specific functions are devirtualized when PGO
+// is applied to the exact source that was profiled.
+func TestPGODevirtualize(t *testing.T) {
+	wd, err := os.Getwd()
+	if err != nil {
+		t.Fatalf("error getting wd: %v", err)
+	}
+	srcDir := filepath.Join(wd, "testdata", "pgo", "devirtualize")
+
+	// Copy the module to a scratch location so we can add a go.mod.
+	dir := t.TempDir()
+	if err := os.Mkdir(filepath.Join(dir, "mult"), 0755); err != nil {
+		t.Fatalf("error creating dir: %v", err)
+	}
+	for _, file := range []string{"devirt.go", "devirt_test.go", "devirt.pprof", filepath.Join("mult", "mult.go")} {
+		if err := copyFile(filepath.Join(dir, file), filepath.Join(srcDir, file)); err != nil {
+			t.Fatalf("error copying %s: %v", file, err)
+		}
+	}
+
+	testPGODevirtualize(t, dir)
+}
diff --git a/src/cmd/compile/internal/test/reproduciblebuilds_test.go b/src/cmd/compile/internal/test/reproduciblebuilds_test.go
index a803e74..466e0c3 100644
--- a/src/cmd/compile/internal/test/reproduciblebuilds_test.go
+++ b/src/cmd/compile/internal/test/reproduciblebuilds_test.go
@@ -76,11 +76,7 @@
 		{tag: "serial", args: "-c=1"},
 		{tag: "concurrent", args: "-c=2"}}
 
-	tmpdir, err := os.MkdirTemp("", "TestIssue38068")
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer os.RemoveAll(tmpdir)
+	tmpdir := t.TempDir()
 
 	src := filepath.Join("testdata", "reproducible", "issue38068.go")
 	for i := range scenarios {
diff --git a/src/cmd/compile/internal/test/shift_test.go b/src/cmd/compile/internal/test/shift_test.go
index 278a47d..dd893a1 100644
--- a/src/cmd/compile/internal/test/shift_test.go
+++ b/src/cmd/compile/internal/test/shift_test.go
@@ -1061,3 +1061,92 @@
 		t.Errorf("got %x want 0", got)
 	}
 }
+
+//go:noinline
+func variableShiftOverflow64x8(x int64, y, z uint8) (a, b, c int64) {
+	// Verify junk bits are ignored when doing a variable shift.
+	return x >> (y + z), x << (y + z), int64(uint64(x) >> (y + z))
+}
+
+//go:noinline
+func variableShiftOverflow32x8(x int32, y, z uint8) (a, b, c int32) {
+	// Verify junk bits are ignored when doing a variable shift.
+	return x >> (y + z), x << (y + z), int32(uint32(x) >> (y + z))
+}
+
+//go:noinline
+func variableShiftOverflow16x8(x int16, y, z uint8) (a, b, c int16) {
+	// Verify junk bits are ignored when doing a variable shift.
+	return x >> (y + z), x << (y + z), int16(uint16(x) >> (y + z))
+}
+
+//go:noinline
+func variableShiftOverflow8x8(x int8, y, z uint8) (a, b, c int8) {
+	// Verify junk bits are ignored when doing a variable shift.
+	return x >> (y + z), x << (y + z), int8(uint8(x) >> (y + z))
+}
+
+//go:noinline
+func variableShiftOverflow64x16(x int64, y, z uint16) (a, b, c int64) {
+	// Verify junk bits are ignored when doing a variable shift.
+	return x >> (y + z), x << (y + z), int64(uint64(x) >> (y + z))
+}
+
+//go:noinline
+func variableShiftOverflow32x16(x int32, y, z uint16) (a, b, c int32) {
+	// Verify junk bits are ignored when doing a variable shift.
+	return x >> (y + z), x << (y + z), int32(uint32(x) >> (y + z))
+}
+
+//go:noinline
+func variableShiftOverflow16x16(x int16, y, z uint16) (a, b, c int16) {
+	// Verify junk bits are ignored when doing a variable shift.
+	return x >> (y + z), x << (y + z), int16(uint16(x) >> (y + z))
+}
+
+//go:noinline
+func variableShiftOverflow8x16(x int8, y, z uint16) (a, b, c int8) {
+	// Verify junk bits are ignored when doing a variable shift.
+	return x >> (y + z), x << (y + z), int8(uint8(x) >> (y + z))
+}
+
+//go:noinline
+func makeU8(x uint64) uint8 {
+	// Ensure the upper portions of the register are clear before testing large shift values
+	// using non-native types (e.g uint8 on PPC64).
+	return uint8(x)
+}
+
+//go:noinline
+func makeU16(x uint64) uint16 {
+	// Ensure the upper portions of the register are clear before testing large shift values
+	// using non-native types (e.g uint8 on PPC64).
+	return uint16(x)
+}
+
+func TestShiftOverflow(t *testing.T) {
+	if v, w, z := variableShiftOverflow64x8(-64, makeU8(255), 2); v != -32 || w != -128 || z != 0x7fffffffffffffe0 {
+		t.Errorf("got %d %d 0x%x, expected -32 -128 0x7fffffffffffffe0", v, w, z)
+	}
+	if v, w, z := variableShiftOverflow32x8(-64, makeU8(255), 2); v != -32 || w != -128 || z != 0x7fffffe0 {
+		t.Errorf("got %d %d 0x%x, expected -32 -128 0x7fffffe0", v, w, z)
+	}
+	if v, w, z := variableShiftOverflow16x8(-64, makeU8(255), 2); v != -32 || w != -128 || z != 0x7fe0 {
+		t.Errorf("got %d %d 0x%x, expected -32 -128 0x7fe0", v, w, z)
+	}
+	if v, w, z := variableShiftOverflow8x8(-64, makeU8(255), 2); v != -32 || w != -128 || z != 0x60 {
+		t.Errorf("got %d %d 0x%x, expected -32 -128 0x60", v, w, z)
+	}
+	if v, w, z := variableShiftOverflow64x16(-64, makeU16(0xffff), 2); v != -32 || w != -128 || z != 0x7fffffffffffffe0 {
+		t.Errorf("got %d %d 0x%x, expected -32 -128 0x7fffffffffffffe0", v, w, z)
+	}
+	if v, w, z := variableShiftOverflow32x16(-64, makeU16(0xffff), 2); v != -32 || w != -128 || z != 0x7fffffe0 {
+		t.Errorf("got %d %d 0x%x, expected -32 -128 0x7fffffe0,", v, w, z)
+	}
+	if v, w, z := variableShiftOverflow16x16(-64, makeU16(0xffff), 2); v != -32 || w != -128 || z != 0x7fe0 {
+		t.Errorf("got %d %d 0x%x, expected -32 -128 0x7fe0", v, w, z)
+	}
+	if v, w, z := variableShiftOverflow8x16(-64, makeU16(0xffff), 2); v != -32 || w != -128 || z != 0x60 {
+		t.Errorf("got %d %d 0x%x, expected -32 -128 0x60", v, w, z)
+	}
+}
diff --git a/src/cmd/compile/internal/test/ssa_test.go b/src/cmd/compile/internal/test/ssa_test.go
index 0b6a675..5f8acdc 100644
--- a/src/cmd/compile/internal/test/ssa_test.go
+++ b/src/cmd/compile/internal/test/ssa_test.go
@@ -33,14 +33,8 @@
 		t.Fatalf("Failed: %v:\nOut: %s\nStderr: %s\n", err, &stdout, &stderr)
 	}
 	// Write stdout into a temporary file
-	tmpdir, ok := os.MkdirTemp("", tmpname)
-	if ok != nil {
-		t.Fatalf("Failed to create temporary directory")
-	}
-	defer os.RemoveAll(tmpdir)
-
-	rungo := filepath.Join(tmpdir, "run.go")
-	ok = os.WriteFile(rungo, stdout.Bytes(), 0600)
+	rungo := filepath.Join(t.TempDir(), "run.go")
+	ok := os.WriteFile(rungo, stdout.Bytes(), 0600)
 	if ok != nil {
 		t.Fatalf("Failed to create temporary file " + rungo)
 	}
@@ -79,11 +73,7 @@
 	gotool := testenv.GoToolPath(t)
 
 	// Make a temporary directory to work in.
-	tmpdir, err := os.MkdirTemp("", "TestCode")
-	if err != nil {
-		t.Fatalf("Failed to create temporary directory: %v", err)
-	}
-	defer os.RemoveAll(tmpdir)
+	tmpdir := t.TempDir()
 
 	// Find all the test functions (and the files containing them).
 	var srcs []string // files containing Test functions
diff --git a/src/cmd/compile/internal/test/testdata/arith_test.go b/src/cmd/compile/internal/test/testdata/arith_test.go
index 253142a..2b8cd9f 100644
--- a/src/cmd/compile/internal/test/testdata/arith_test.go
+++ b/src/cmd/compile/internal/test/testdata/arith_test.go
@@ -223,7 +223,7 @@
 	}
 }
 
-// overflowConstShift_ssa verifes that constant folding for shift
+// overflowConstShift_ssa verifies that constant folding for shift
 // doesn't wrap (i.e. x << MAX_INT << 1 doesn't get folded to x << 0).
 //
 //go:noinline
diff --git a/src/cmd/compile/internal/test/testdata/pgo/devirtualize/devirt.go b/src/cmd/compile/internal/test/testdata/pgo/devirtualize/devirt.go
new file mode 100644
index 0000000..390b6c3
--- /dev/null
+++ b/src/cmd/compile/internal/test/testdata/pgo/devirtualize/devirt.go
@@ -0,0 +1,73 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// WARNING: Please avoid updating this file. If this file needs to be updated,
+// then a new devirt.pprof file should be generated:
+//
+//	$ cd $GOROOT/src/cmd/compile/internal/test/testdata/pgo/devirtualize/
+//	$ go mod init example.com/pgo/devirtualize
+//	$ go test -bench=. -cpuprofile ./devirt.pprof
+
+package devirt
+
+import "example.com/pgo/devirtualize/mult"
+
+var sink int
+
+type Adder interface {
+	Add(a, b int) int
+}
+
+type Add struct{}
+
+func (Add) Add(a, b int) int {
+	for i := 0; i < 1000; i++ {
+		sink++
+	}
+	return a + b
+}
+
+type Sub struct{}
+
+func (Sub) Add(a, b int) int {
+	for i := 0; i < 1000; i++ {
+		sink++
+	}
+	return a - b
+}
+
+// Exercise calls mostly a1 and m1.
+//
+//go:noinline
+func Exercise(iter int, a1, a2 Adder, m1, m2 mult.Multiplier) {
+	for i := 0; i < iter; i++ {
+		a := a1
+		m := m1
+		if i%10 == 0 {
+			a = a2
+			m = m2
+		}
+
+		// N.B. Profiles only distinguish calls on a per-line level,
+		// making the two calls ambiguous. However because the
+		// interfaces and implementations are mutually exclusive,
+		// devirtualization can still select the correct callee for
+		// each.
+		//
+		// If they were not mutually exclusive (for example, two Add
+		// calls), then we could not definitively select the correct
+		// callee.
+		sink += m.Multiply(42, a.Add(1, 2))
+	}
+}
+
+func init() {
+	// TODO: until https://golang.org/cl/497175 or similar lands,
+	// we need to create an explicit reference to callees
+	// in another package for devirtualization to work.
+	m := mult.Mult{}
+	m.Multiply(42, 0)
+	n := mult.NegMult{}
+	n.Multiply(42, 0)
+}
diff --git a/src/cmd/compile/internal/test/testdata/pgo/devirtualize/devirt.pprof b/src/cmd/compile/internal/test/testdata/pgo/devirtualize/devirt.pprof
new file mode 100644
index 0000000..5fe5dd6
--- /dev/null
+++ b/src/cmd/compile/internal/test/testdata/pgo/devirtualize/devirt.pprof
Binary files differ
diff --git a/src/cmd/compile/internal/test/testdata/pgo/devirtualize/devirt_test.go b/src/cmd/compile/internal/test/testdata/pgo/devirtualize/devirt_test.go
new file mode 100644
index 0000000..f4cbbb8
--- /dev/null
+++ b/src/cmd/compile/internal/test/testdata/pgo/devirtualize/devirt_test.go
@@ -0,0 +1,29 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// WARNING: Please avoid updating this file. If this file needs to be updated,
+// then a new devirt.pprof file should be generated:
+//
+//	$ cd $GOROOT/src/cmd/compile/internal/test/testdata/pgo/devirtualize/
+//	$ go mod init example.com/pgo/devirtualize
+//	$ go test -bench=. -cpuprofile ./devirt.pprof
+
+package devirt
+
+import (
+	"testing"
+
+	"example.com/pgo/devirtualize/mult"
+)
+
+func BenchmarkDevirt(b *testing.B) {
+	var (
+		a1 Add
+		a2 Sub
+		m1 mult.Mult
+		m2 mult.NegMult
+	)
+
+	Exercise(b.N, a1, a2, m1, m2)
+}
diff --git a/src/cmd/compile/internal/test/testdata/pgo/devirtualize/mult/mult.go b/src/cmd/compile/internal/test/testdata/pgo/devirtualize/mult/mult.go
new file mode 100644
index 0000000..8a026a5
--- /dev/null
+++ b/src/cmd/compile/internal/test/testdata/pgo/devirtualize/mult/mult.go
@@ -0,0 +1,32 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// WARNING: Please avoid updating this file.
+// See the warning in ../devirt.go for more details.
+
+package mult
+
+var sink int
+
+type Multiplier interface {
+	Multiply(a, b int) int
+}
+
+type Mult struct{}
+
+func (Mult) Multiply(a, b int) int {
+	for i := 0; i < 1000; i++ {
+		sink++
+	}
+	return a * b
+}
+
+type NegMult struct{}
+
+func (NegMult) Multiply(a, b int) int {
+	for i := 0; i < 1000; i++ {
+		sink++
+	}
+	return -1 * a * b
+}
diff --git a/src/cmd/compile/internal/typecheck/_builtin/runtime.go b/src/cmd/compile/internal/typecheck/_builtin/runtime.go
index 69c456a..2e1e94b 100644
--- a/src/cmd/compile/internal/typecheck/_builtin/runtime.go
+++ b/src/cmd/compile/internal/typecheck/_builtin/runtime.go
@@ -207,20 +207,20 @@
 func interequal(p, q unsafe.Pointer) bool
 func nilinterequal(p, q unsafe.Pointer) bool
 
-func memhash(p unsafe.Pointer, h uintptr, size uintptr) uintptr
+func memhash(x *any, h uintptr, size uintptr) uintptr
 func memhash0(p unsafe.Pointer, h uintptr) uintptr
 func memhash8(p unsafe.Pointer, h uintptr) uintptr
 func memhash16(p unsafe.Pointer, h uintptr) uintptr
 func memhash32(p unsafe.Pointer, h uintptr) uintptr
 func memhash64(p unsafe.Pointer, h uintptr) uintptr
 func memhash128(p unsafe.Pointer, h uintptr) uintptr
-func f32hash(p unsafe.Pointer, h uintptr) uintptr
-func f64hash(p unsafe.Pointer, h uintptr) uintptr
-func c64hash(p unsafe.Pointer, h uintptr) uintptr
-func c128hash(p unsafe.Pointer, h uintptr) uintptr
-func strhash(a unsafe.Pointer, h uintptr) uintptr
-func interhash(p unsafe.Pointer, h uintptr) uintptr
-func nilinterhash(p unsafe.Pointer, h uintptr) uintptr
+func f32hash(p *any, h uintptr) uintptr
+func f64hash(p *any, h uintptr) uintptr
+func c64hash(p *any, h uintptr) uintptr
+func c128hash(p *any, h uintptr) uintptr
+func strhash(a *any, h uintptr) uintptr
+func interhash(p *any, h uintptr) uintptr
+func nilinterhash(p *any, h uintptr) uintptr
 
 // only used on 32-bit
 func int64div(int64, int64) int64
diff --git a/src/cmd/compile/internal/typecheck/bexport.go b/src/cmd/compile/internal/typecheck/bexport.go
index 352f7a9..ed9a011 100644
--- a/src/cmd/compile/internal/typecheck/bexport.go
+++ b/src/cmd/compile/internal/typecheck/bexport.go
@@ -4,11 +4,6 @@
 
 package typecheck
 
-import "cmd/compile/internal/types"
-
-// ----------------------------------------------------------------------------
-// Export format
-
 // Tags. Must be < 0.
 const (
 	// Objects
@@ -18,91 +13,4 @@
 	varTag
 	funcTag
 	endTag
-
-	// Types
-	namedTag
-	arrayTag
-	sliceTag
-	dddTag
-	structTag
-	pointerTag
-	signatureTag
-	interfaceTag
-	mapTag
-	chanTag
-
-	// Values
-	falseTag
-	trueTag
-	int64Tag
-	floatTag
-	fractionTag // not used by gc
-	complexTag
-	stringTag
-	nilTag
-	unknownTag // not used by gc (only appears in packages with errors)
-
-	// Type aliases
-	aliasTag
 )
-
-var predecl []*types.Type // initialized lazily
-
-func predeclared() []*types.Type {
-	if predecl == nil {
-		// initialize lazily to be sure that all
-		// elements have been initialized before
-		predecl = []*types.Type{
-			// basic types
-			types.Types[types.TBOOL],
-			types.Types[types.TINT],
-			types.Types[types.TINT8],
-			types.Types[types.TINT16],
-			types.Types[types.TINT32],
-			types.Types[types.TINT64],
-			types.Types[types.TUINT],
-			types.Types[types.TUINT8],
-			types.Types[types.TUINT16],
-			types.Types[types.TUINT32],
-			types.Types[types.TUINT64],
-			types.Types[types.TUINTPTR],
-			types.Types[types.TFLOAT32],
-			types.Types[types.TFLOAT64],
-			types.Types[types.TCOMPLEX64],
-			types.Types[types.TCOMPLEX128],
-			types.Types[types.TSTRING],
-
-			// basic type aliases
-			types.ByteType,
-			types.RuneType,
-
-			// error
-			types.ErrorType,
-
-			// untyped types
-			types.UntypedBool,
-			types.UntypedInt,
-			types.UntypedRune,
-			types.UntypedFloat,
-			types.UntypedComplex,
-			types.UntypedString,
-			types.Types[types.TNIL],
-
-			// package unsafe
-			types.Types[types.TUNSAFEPTR],
-
-			// invalid type (package contains errors)
-			types.Types[types.Txxx],
-
-			// any type, for builtin export data
-			types.Types[types.TANY],
-
-			// comparable
-			types.ComparableType,
-
-			// any
-			types.AnyType,
-		}
-	}
-	return predecl
-}
diff --git a/src/cmd/compile/internal/typecheck/builtin.go b/src/cmd/compile/internal/typecheck/builtin.go
index 7de24ad..bf87b4d 100644
--- a/src/cmd/compile/internal/typecheck/builtin.go
+++ b/src/cmd/compile/internal/typecheck/builtin.go
@@ -11,7 +11,7 @@
 //
 //go:noinline
 func newSig(params, results []*types.Field) *types.Type {
-	return types.NewSignature(types.NoPkg, nil, nil, params, results)
+	return types.NewSignature(nil, params, results)
 }
 
 func params(tlist ...*types.Type) []*types.Field {
@@ -180,52 +180,52 @@
 	{"memhash32", funcTag, 127},
 	{"memhash64", funcTag, 127},
 	{"memhash128", funcTag, 127},
-	{"f32hash", funcTag, 127},
-	{"f64hash", funcTag, 127},
-	{"c64hash", funcTag, 127},
-	{"c128hash", funcTag, 127},
-	{"strhash", funcTag, 127},
-	{"interhash", funcTag, 127},
-	{"nilinterhash", funcTag, 127},
-	{"int64div", funcTag, 128},
-	{"uint64div", funcTag, 129},
-	{"int64mod", funcTag, 128},
-	{"uint64mod", funcTag, 129},
-	{"float64toint64", funcTag, 130},
-	{"float64touint64", funcTag, 131},
-	{"float64touint32", funcTag, 132},
-	{"int64tofloat64", funcTag, 133},
-	{"int64tofloat32", funcTag, 135},
-	{"uint64tofloat64", funcTag, 136},
-	{"uint64tofloat32", funcTag, 137},
-	{"uint32tofloat64", funcTag, 138},
-	{"complex128div", funcTag, 139},
-	{"getcallerpc", funcTag, 140},
-	{"getcallersp", funcTag, 140},
+	{"f32hash", funcTag, 128},
+	{"f64hash", funcTag, 128},
+	{"c64hash", funcTag, 128},
+	{"c128hash", funcTag, 128},
+	{"strhash", funcTag, 128},
+	{"interhash", funcTag, 128},
+	{"nilinterhash", funcTag, 128},
+	{"int64div", funcTag, 129},
+	{"uint64div", funcTag, 130},
+	{"int64mod", funcTag, 129},
+	{"uint64mod", funcTag, 130},
+	{"float64toint64", funcTag, 131},
+	{"float64touint64", funcTag, 132},
+	{"float64touint32", funcTag, 133},
+	{"int64tofloat64", funcTag, 134},
+	{"int64tofloat32", funcTag, 136},
+	{"uint64tofloat64", funcTag, 137},
+	{"uint64tofloat32", funcTag, 138},
+	{"uint32tofloat64", funcTag, 139},
+	{"complex128div", funcTag, 140},
+	{"getcallerpc", funcTag, 141},
+	{"getcallersp", funcTag, 141},
 	{"racefuncenter", funcTag, 31},
 	{"racefuncexit", funcTag, 9},
 	{"raceread", funcTag, 31},
 	{"racewrite", funcTag, 31},
-	{"racereadrange", funcTag, 141},
-	{"racewriterange", funcTag, 141},
-	{"msanread", funcTag, 141},
-	{"msanwrite", funcTag, 141},
-	{"msanmove", funcTag, 142},
-	{"asanread", funcTag, 141},
-	{"asanwrite", funcTag, 141},
-	{"checkptrAlignment", funcTag, 143},
-	{"checkptrArithmetic", funcTag, 145},
-	{"libfuzzerTraceCmp1", funcTag, 146},
-	{"libfuzzerTraceCmp2", funcTag, 147},
-	{"libfuzzerTraceCmp4", funcTag, 148},
-	{"libfuzzerTraceCmp8", funcTag, 149},
-	{"libfuzzerTraceConstCmp1", funcTag, 146},
-	{"libfuzzerTraceConstCmp2", funcTag, 147},
-	{"libfuzzerTraceConstCmp4", funcTag, 148},
-	{"libfuzzerTraceConstCmp8", funcTag, 149},
-	{"libfuzzerHookStrCmp", funcTag, 150},
-	{"libfuzzerHookEqualFold", funcTag, 150},
-	{"addCovMeta", funcTag, 152},
+	{"racereadrange", funcTag, 142},
+	{"racewriterange", funcTag, 142},
+	{"msanread", funcTag, 142},
+	{"msanwrite", funcTag, 142},
+	{"msanmove", funcTag, 143},
+	{"asanread", funcTag, 142},
+	{"asanwrite", funcTag, 142},
+	{"checkptrAlignment", funcTag, 144},
+	{"checkptrArithmetic", funcTag, 146},
+	{"libfuzzerTraceCmp1", funcTag, 147},
+	{"libfuzzerTraceCmp2", funcTag, 148},
+	{"libfuzzerTraceCmp4", funcTag, 149},
+	{"libfuzzerTraceCmp8", funcTag, 150},
+	{"libfuzzerTraceConstCmp1", funcTag, 147},
+	{"libfuzzerTraceConstCmp2", funcTag, 148},
+	{"libfuzzerTraceConstCmp4", funcTag, 149},
+	{"libfuzzerTraceConstCmp8", funcTag, 150},
+	{"libfuzzerHookStrCmp", funcTag, 151},
+	{"libfuzzerHookEqualFold", funcTag, 151},
+	{"addCovMeta", funcTag, 153},
 	{"x86HasPOPCNT", varTag, 6},
 	{"x86HasSSE41", varTag, 6},
 	{"x86HasFMA", varTag, 6},
@@ -234,7 +234,7 @@
 }
 
 func runtimeTypes() []*types.Type {
-	var typs [153]*types.Type
+	var typs [154]*types.Type
 	typs[0] = types.ByteType
 	typs[1] = types.NewPtr(typs[0])
 	typs[2] = types.Types[types.TANY]
@@ -340,7 +340,7 @@
 	typs[102] = types.NewChan(typs[2], types.Csend)
 	typs[103] = newSig(params(typs[102], typs[3]), nil)
 	typs[104] = types.NewArray(typs[0], 3)
-	typs[105] = types.NewStruct(types.NoPkg, []*types.Field{types.NewField(src.NoXPos, Lookup("enabled"), typs[6]), types.NewField(src.NoXPos, Lookup("pad"), typs[104]), types.NewField(src.NoXPos, Lookup("needed"), typs[6]), types.NewField(src.NoXPos, Lookup("cgo"), typs[6]), types.NewField(src.NoXPos, Lookup("alignme"), typs[24])})
+	typs[105] = types.NewStruct([]*types.Field{types.NewField(src.NoXPos, Lookup("enabled"), typs[6]), types.NewField(src.NoXPos, Lookup("pad"), typs[104]), types.NewField(src.NoXPos, Lookup("needed"), typs[6]), types.NewField(src.NoXPos, Lookup("cgo"), typs[6]), types.NewField(src.NoXPos, Lookup("alignme"), typs[24])})
 	typs[106] = newSig(params(typs[1], typs[3], typs[3]), nil)
 	typs[107] = newSig(params(typs[1], typs[3]), nil)
 	typs[108] = newSig(params(typs[1], typs[3], typs[15], typs[3], typs[15]), params(typs[15]))
@@ -361,33 +361,34 @@
 	typs[123] = newSig(params(typs[3], typs[3], typs[5]), params(typs[6]))
 	typs[124] = newSig(params(typs[3], typs[3]), params(typs[6]))
 	typs[125] = newSig(params(typs[7], typs[7]), params(typs[6]))
-	typs[126] = newSig(params(typs[7], typs[5], typs[5]), params(typs[5]))
+	typs[126] = newSig(params(typs[3], typs[5], typs[5]), params(typs[5]))
 	typs[127] = newSig(params(typs[7], typs[5]), params(typs[5]))
-	typs[128] = newSig(params(typs[22], typs[22]), params(typs[22]))
-	typs[129] = newSig(params(typs[24], typs[24]), params(typs[24]))
-	typs[130] = newSig(params(typs[20]), params(typs[22]))
-	typs[131] = newSig(params(typs[20]), params(typs[24]))
-	typs[132] = newSig(params(typs[20]), params(typs[62]))
-	typs[133] = newSig(params(typs[22]), params(typs[20]))
-	typs[134] = types.Types[types.TFLOAT32]
-	typs[135] = newSig(params(typs[22]), params(typs[134]))
-	typs[136] = newSig(params(typs[24]), params(typs[20]))
-	typs[137] = newSig(params(typs[24]), params(typs[134]))
-	typs[138] = newSig(params(typs[62]), params(typs[20]))
-	typs[139] = newSig(params(typs[26], typs[26]), params(typs[26]))
-	typs[140] = newSig(nil, params(typs[5]))
-	typs[141] = newSig(params(typs[5], typs[5]), nil)
-	typs[142] = newSig(params(typs[5], typs[5], typs[5]), nil)
-	typs[143] = newSig(params(typs[7], typs[1], typs[5]), nil)
-	typs[144] = types.NewSlice(typs[7])
-	typs[145] = newSig(params(typs[7], typs[144]), nil)
-	typs[146] = newSig(params(typs[66], typs[66], typs[17]), nil)
-	typs[147] = newSig(params(typs[60], typs[60], typs[17]), nil)
-	typs[148] = newSig(params(typs[62], typs[62], typs[17]), nil)
-	typs[149] = newSig(params(typs[24], typs[24], typs[17]), nil)
-	typs[150] = newSig(params(typs[28], typs[28], typs[17]), nil)
-	typs[151] = types.NewArray(typs[0], 16)
-	typs[152] = newSig(params(typs[7], typs[62], typs[151], typs[28], typs[15], typs[66], typs[66]), params(typs[62]))
+	typs[128] = newSig(params(typs[3], typs[5]), params(typs[5]))
+	typs[129] = newSig(params(typs[22], typs[22]), params(typs[22]))
+	typs[130] = newSig(params(typs[24], typs[24]), params(typs[24]))
+	typs[131] = newSig(params(typs[20]), params(typs[22]))
+	typs[132] = newSig(params(typs[20]), params(typs[24]))
+	typs[133] = newSig(params(typs[20]), params(typs[62]))
+	typs[134] = newSig(params(typs[22]), params(typs[20]))
+	typs[135] = types.Types[types.TFLOAT32]
+	typs[136] = newSig(params(typs[22]), params(typs[135]))
+	typs[137] = newSig(params(typs[24]), params(typs[20]))
+	typs[138] = newSig(params(typs[24]), params(typs[135]))
+	typs[139] = newSig(params(typs[62]), params(typs[20]))
+	typs[140] = newSig(params(typs[26], typs[26]), params(typs[26]))
+	typs[141] = newSig(nil, params(typs[5]))
+	typs[142] = newSig(params(typs[5], typs[5]), nil)
+	typs[143] = newSig(params(typs[5], typs[5], typs[5]), nil)
+	typs[144] = newSig(params(typs[7], typs[1], typs[5]), nil)
+	typs[145] = types.NewSlice(typs[7])
+	typs[146] = newSig(params(typs[7], typs[145]), nil)
+	typs[147] = newSig(params(typs[66], typs[66], typs[17]), nil)
+	typs[148] = newSig(params(typs[60], typs[60], typs[17]), nil)
+	typs[149] = newSig(params(typs[62], typs[62], typs[17]), nil)
+	typs[150] = newSig(params(typs[24], typs[24], typs[17]), nil)
+	typs[151] = newSig(params(typs[28], typs[28], typs[17]), nil)
+	typs[152] = types.NewArray(typs[0], 16)
+	typs[153] = newSig(params(typs[7], typs[62], typs[152], typs[28], typs[15], typs[66], typs[66]), params(typs[62]))
 	return typs[:]
 }
 
diff --git a/src/cmd/compile/internal/typecheck/const.go b/src/cmd/compile/internal/typecheck/const.go
index 6855f05..f4fb614 100644
--- a/src/cmd/compile/internal/typecheck/const.go
+++ b/src/cmd/compile/internal/typecheck/const.go
@@ -8,9 +8,9 @@
 	"fmt"
 	"go/constant"
 	"go/token"
+	"internal/types/errors"
 	"math"
 	"math/big"
-	"strings"
 	"unicode"
 
 	"cmd/compile/internal/base"
@@ -348,182 +348,6 @@
 	ir.ORSH: token.SHR,
 }
 
-// EvalConst returns a constant-evaluated expression equivalent to n.
-// If n is not a constant, EvalConst returns n.
-// Otherwise, EvalConst returns a new OLITERAL with the same value as n,
-// and with .Orig pointing back to n.
-func EvalConst(n ir.Node) ir.Node {
-	// Pick off just the opcodes that can be constant evaluated.
-	switch n.Op() {
-	case ir.OPLUS, ir.ONEG, ir.OBITNOT, ir.ONOT:
-		n := n.(*ir.UnaryExpr)
-		nl := n.X
-		if nl.Op() == ir.OLITERAL {
-			var prec uint
-			if n.Type().IsUnsigned() {
-				prec = uint(n.Type().Size() * 8)
-			}
-			return OrigConst(n, constant.UnaryOp(tokenForOp[n.Op()], nl.Val(), prec))
-		}
-
-	case ir.OADD, ir.OSUB, ir.OMUL, ir.ODIV, ir.OMOD, ir.OOR, ir.OXOR, ir.OAND, ir.OANDNOT:
-		n := n.(*ir.BinaryExpr)
-		nl, nr := n.X, n.Y
-		if nl.Op() == ir.OLITERAL && nr.Op() == ir.OLITERAL {
-			rval := nr.Val()
-
-			// check for divisor underflow in complex division (see issue 20227)
-			if n.Op() == ir.ODIV && n.Type().IsComplex() && constant.Sign(square(constant.Real(rval))) == 0 && constant.Sign(square(constant.Imag(rval))) == 0 {
-				base.Errorf("complex division by zero")
-				n.SetType(nil)
-				return n
-			}
-			if (n.Op() == ir.ODIV || n.Op() == ir.OMOD) && constant.Sign(rval) == 0 {
-				base.Errorf("division by zero")
-				n.SetType(nil)
-				return n
-			}
-
-			tok := tokenForOp[n.Op()]
-			if n.Op() == ir.ODIV && n.Type().IsInteger() {
-				tok = token.QUO_ASSIGN // integer division
-			}
-			return OrigConst(n, constant.BinaryOp(nl.Val(), tok, rval))
-		}
-
-	case ir.OOROR, ir.OANDAND:
-		n := n.(*ir.LogicalExpr)
-		nl, nr := n.X, n.Y
-		if nl.Op() == ir.OLITERAL && nr.Op() == ir.OLITERAL {
-			return OrigConst(n, constant.BinaryOp(nl.Val(), tokenForOp[n.Op()], nr.Val()))
-		}
-
-	case ir.OEQ, ir.ONE, ir.OLT, ir.OLE, ir.OGT, ir.OGE:
-		n := n.(*ir.BinaryExpr)
-		nl, nr := n.X, n.Y
-		if nl.Op() == ir.OLITERAL && nr.Op() == ir.OLITERAL {
-			return OrigBool(n, constant.Compare(nl.Val(), tokenForOp[n.Op()], nr.Val()))
-		}
-
-	case ir.OLSH, ir.ORSH:
-		n := n.(*ir.BinaryExpr)
-		nl, nr := n.X, n.Y
-		if nl.Op() == ir.OLITERAL && nr.Op() == ir.OLITERAL {
-			// shiftBound from go/types; "so we can express smallestFloat64" (see issue #44057)
-			const shiftBound = 1023 - 1 + 52
-			s, ok := constant.Uint64Val(nr.Val())
-			if !ok || s > shiftBound {
-				base.Errorf("invalid shift count %v", nr)
-				n.SetType(nil)
-				break
-			}
-			return OrigConst(n, constant.Shift(toint(nl.Val()), tokenForOp[n.Op()], uint(s)))
-		}
-
-	case ir.OCONV, ir.ORUNESTR:
-		n := n.(*ir.ConvExpr)
-		nl := n.X
-		if ir.OKForConst[n.Type().Kind()] && nl.Op() == ir.OLITERAL {
-			return OrigConst(n, convertVal(nl.Val(), n.Type(), true))
-		}
-
-	case ir.OCONVNOP:
-		n := n.(*ir.ConvExpr)
-		nl := n.X
-		if ir.OKForConst[n.Type().Kind()] && nl.Op() == ir.OLITERAL {
-			// set so n.Orig gets OCONV instead of OCONVNOP
-			n.SetOp(ir.OCONV)
-			return OrigConst(n, nl.Val())
-		}
-
-	case ir.OADDSTR:
-		// Merge adjacent constants in the argument list.
-		n := n.(*ir.AddStringExpr)
-		s := n.List
-		need := 0
-		for i := 0; i < len(s); i++ {
-			if i == 0 || !ir.IsConst(s[i-1], constant.String) || !ir.IsConst(s[i], constant.String) {
-				// Can't merge s[i] into s[i-1]; need a slot in the list.
-				need++
-			}
-		}
-		if need == len(s) {
-			return n
-		}
-		if need == 1 {
-			var strs []string
-			for _, c := range s {
-				strs = append(strs, ir.StringVal(c))
-			}
-			return OrigConst(n, constant.MakeString(strings.Join(strs, "")))
-		}
-		newList := make([]ir.Node, 0, need)
-		for i := 0; i < len(s); i++ {
-			if ir.IsConst(s[i], constant.String) && i+1 < len(s) && ir.IsConst(s[i+1], constant.String) {
-				// merge from i up to but not including i2
-				var strs []string
-				i2 := i
-				for i2 < len(s) && ir.IsConst(s[i2], constant.String) {
-					strs = append(strs, ir.StringVal(s[i2]))
-					i2++
-				}
-
-				nl := ir.Copy(n).(*ir.AddStringExpr)
-				nl.List = s[i:i2]
-				newList = append(newList, OrigConst(nl, constant.MakeString(strings.Join(strs, ""))))
-				i = i2 - 1
-			} else {
-				newList = append(newList, s[i])
-			}
-		}
-
-		nn := ir.Copy(n).(*ir.AddStringExpr)
-		nn.List = newList
-		return nn
-
-	case ir.OCAP, ir.OLEN:
-		n := n.(*ir.UnaryExpr)
-		nl := n.X
-		switch nl.Type().Kind() {
-		case types.TSTRING:
-			if ir.IsConst(nl, constant.String) {
-				return OrigInt(n, int64(len(ir.StringVal(nl))))
-			}
-		case types.TARRAY:
-			if !anyCallOrChan(nl) {
-				return OrigInt(n, nl.Type().NumElem())
-			}
-		}
-
-	case ir.OALIGNOF, ir.OOFFSETOF, ir.OSIZEOF:
-		n := n.(*ir.UnaryExpr)
-		return OrigInt(n, evalunsafe(n))
-
-	case ir.OREAL:
-		n := n.(*ir.UnaryExpr)
-		nl := n.X
-		if nl.Op() == ir.OLITERAL {
-			return OrigConst(n, constant.Real(nl.Val()))
-		}
-
-	case ir.OIMAG:
-		n := n.(*ir.UnaryExpr)
-		nl := n.X
-		if nl.Op() == ir.OLITERAL {
-			return OrigConst(n, constant.Imag(nl.Val()))
-		}
-
-	case ir.OCOMPLEX:
-		n := n.(*ir.BinaryExpr)
-		nl, nr := n.X, n.Y
-		if nl.Op() == ir.OLITERAL && nr.Op() == ir.OLITERAL {
-			return OrigConst(n, makeComplex(nl.Val(), nr.Val()))
-		}
-	}
-
-	return n
-}
-
 func makeFloat64(f float64) constant.Value {
 	if math.IsInf(f, 0) {
 		base.Fatalf("infinity is not a valid constant")
@@ -535,10 +359,6 @@
 	return constant.BinaryOp(constant.ToFloat(real), token.ADD, constant.MakeImag(constant.ToFloat(imag)))
 }
 
-func square(x constant.Value) constant.Value {
-	return constant.BinaryOp(x, token.MUL, x)
-}
-
 // For matching historical "constant OP overflow" error messages.
 // TODO(mdempsky): Replace with error messages like go/types uses.
 var overflowNames = [...]string{
@@ -567,7 +387,7 @@
 		if what == "" {
 			base.Fatalf("unexpected overflow: %v", n.Op())
 		}
-		base.ErrorfAt(n.Pos(), "constant %v overflow", what)
+		base.ErrorfAt(n.Pos(), errors.NumericOverflow, "constant %v overflow", what)
 		n.SetType(nil)
 		return n
 	}
@@ -711,6 +531,7 @@
 		ir.OCALLINTER,
 		ir.OCALLMETH,
 		ir.OCAP,
+		ir.OCLEAR,
 		ir.OCLOSE,
 		ir.OCOMPLEX,
 		ir.OCOPY,
@@ -718,6 +539,8 @@
 		ir.OIMAG,
 		ir.OLEN,
 		ir.OMAKE,
+		ir.OMAX,
+		ir.OMIN,
 		ir.ONEW,
 		ir.OPANIC,
 		ir.OPRINT,
@@ -735,13 +558,6 @@
 	return false
 }
 
-// anyCallOrChan reports whether n contains any calls or channel operations.
-func anyCallOrChan(n ir.Node) bool {
-	return ir.Any(n, func(n ir.Node) bool {
-		return callOrChan(n)
-	})
-}
-
 // evalunsafe evaluates a package unsafe operation and returns the result.
 func evalunsafe(n ir.Node) int64 {
 	switch n.Op() {
diff --git a/src/cmd/compile/internal/typecheck/crawler.go b/src/cmd/compile/internal/typecheck/crawler.go
deleted file mode 100644
index f14d885..0000000
--- a/src/cmd/compile/internal/typecheck/crawler.go
+++ /dev/null
@@ -1,399 +0,0 @@
-// Copyright 2021 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package typecheck
-
-import (
-	"cmd/compile/internal/base"
-	"cmd/compile/internal/ir"
-	"cmd/compile/internal/types"
-	"cmd/internal/src"
-)
-
-// crawlExports crawls the type/object graph rooted at the given list of exported
-// objects (which are variables, functions, and types). It descends through all parts
-// of types and follows methods on defined types. Any functions that are found to be
-// potentially callable by importers directly or after inlining are marked with
-// ExportInline, so that iexport.go knows to export their inline body.
-//
-// The overall purpose of crawlExports is to AVOID exporting inlineable methods
-// that cannot actually be referenced, thereby reducing the size of the exports
-// significantly.
-//
-// For non-generic defined types reachable from global variables, we only set
-// ExportInline for exported methods. For defined types that are directly named or are
-// embedded recursively in such a type, we set ExportInline for all methods, since
-// these types can be embedded in another local type. For instantiated types that are
-// used anywhere in a inlineable function, we set ExportInline on all methods of the
-// base generic type, since all methods will be needed for creating any instantiated
-// type.
-func crawlExports(exports []*ir.Name) {
-	p := crawler{
-		marked:         make(map[*types.Type]bool),
-		embedded:       make(map[*types.Type]bool),
-		generic:        make(map[*types.Type]bool),
-		checkFullyInst: make(map[*types.Type]bool),
-	}
-	for _, n := range exports {
-		p.markObject(n)
-	}
-}
-
-type crawler struct {
-	marked         map[*types.Type]bool // types already seen by markType
-	embedded       map[*types.Type]bool // types already seen by markEmbed
-	generic        map[*types.Type]bool // types already seen by markGeneric
-	checkFullyInst map[*types.Type]bool // types already seen by checkForFullyInst
-}
-
-// markObject visits a reachable object (function, method, global type, or global variable)
-func (p *crawler) markObject(n *ir.Name) {
-	if n.Op() == ir.ONAME && n.Class == ir.PFUNC {
-		p.markInlBody(n)
-	}
-
-	// If a declared type name is reachable, users can embed it in their
-	// own types, which makes even its unexported methods reachable.
-	if n.Op() == ir.OTYPE {
-		p.markEmbed(n.Type())
-	}
-
-	p.markType(n.Type())
-}
-
-// markType recursively visits types reachable from t to identify functions whose
-// inline bodies may be needed. For instantiated generic types, it visits the base
-// generic type, which has the relevant methods.
-func (p *crawler) markType(t *types.Type) {
-	if orig := t.OrigType(); orig != nil {
-		// Convert to the base generic type.
-		t = orig
-	}
-	if p.marked[t] {
-		return
-	}
-	p.marked[t] = true
-
-	// If this is a defined type, mark all of its associated
-	// methods. Skip interface types because t.Methods contains
-	// only their unexpanded method set (i.e., exclusive of
-	// interface embeddings), and the switch statement below
-	// handles their full method set.
-	if t.Sym() != nil && t.Kind() != types.TINTER {
-		for _, m := range t.Methods().Slice() {
-			if types.IsExported(m.Sym.Name) {
-				p.markObject(m.Nname.(*ir.Name))
-			}
-		}
-	}
-
-	// Recursively mark any types that can be produced given a
-	// value of type t: dereferencing a pointer; indexing or
-	// iterating over an array, slice, or map; receiving from a
-	// channel; accessing a struct field or interface method; or
-	// calling a function.
-	//
-	// Notably, we don't mark function parameter types, because
-	// the user already needs some way to construct values of
-	// those types.
-	switch t.Kind() {
-	case types.TPTR, types.TARRAY, types.TSLICE:
-		p.markType(t.Elem())
-
-	case types.TCHAN:
-		if t.ChanDir().CanRecv() {
-			p.markType(t.Elem())
-		}
-
-	case types.TMAP:
-		p.markType(t.Key())
-		p.markType(t.Elem())
-
-	case types.TSTRUCT:
-		if t.IsFuncArgStruct() {
-			break
-		}
-		for _, f := range t.FieldSlice() {
-			// Mark the type of a unexported field if it is a
-			// fully-instantiated type, since we create and instantiate
-			// the methods of any fully-instantiated type that we see
-			// during import (see end of typecheck.substInstType).
-			if types.IsExported(f.Sym.Name) || f.Embedded != 0 ||
-				isPtrFullyInstantiated(f.Type) {
-				p.markType(f.Type)
-			}
-		}
-
-	case types.TFUNC:
-		for _, f := range t.Results().FieldSlice() {
-			p.markType(f.Type)
-		}
-
-	case types.TINTER:
-		for _, f := range t.AllMethods().Slice() {
-			if types.IsExported(f.Sym.Name) {
-				p.markType(f.Type)
-			}
-		}
-
-	case types.TTYPEPARAM:
-		// No other type that needs to be followed.
-	}
-}
-
-// markEmbed is similar to markType, but handles finding methods that
-// need to be re-exported because t can be embedded in user code
-// (possibly transitively).
-func (p *crawler) markEmbed(t *types.Type) {
-	if t.IsPtr() {
-		// Defined pointer type; not allowed to embed anyway.
-		if t.Sym() != nil {
-			return
-		}
-		t = t.Elem()
-	}
-
-	if orig := t.OrigType(); orig != nil {
-		// Convert to the base generic type.
-		t = orig
-	}
-
-	if p.embedded[t] {
-		return
-	}
-	p.embedded[t] = true
-
-	// If t is a defined type, then re-export all of its methods. Unlike
-	// in markType, we include even unexported methods here, because we
-	// still need to generate wrappers for them, even if the user can't
-	// refer to them directly.
-	if t.Sym() != nil && t.Kind() != types.TINTER {
-		for _, m := range t.Methods().Slice() {
-			p.markObject(m.Nname.(*ir.Name))
-		}
-	}
-
-	// If t is a struct, recursively visit its embedded fields.
-	if t.IsStruct() {
-		for _, f := range t.FieldSlice() {
-			if f.Embedded != 0 {
-				p.markEmbed(f.Type)
-			}
-		}
-	}
-}
-
-// markGeneric takes an instantiated type or a base generic type t, and marks all the
-// methods of the base generic type of t. If a base generic type is written out for
-// export, even if not explicitly marked for export, then all of its methods need to
-// be available for instantiation, since we always create all methods of a specified
-// instantiated type. Non-exported methods must generally be instantiated, since they may
-// be called by the exported methods or other generic function in the same package.
-func (p *crawler) markGeneric(t *types.Type) {
-	if t.IsPtr() {
-		t = t.Elem()
-	}
-	if orig := t.OrigType(); orig != nil {
-		// Convert to the base generic type.
-		t = orig
-	}
-	if p.generic[t] {
-		return
-	}
-	p.generic[t] = true
-
-	if t.Sym() != nil && t.Kind() != types.TINTER {
-		for _, m := range t.Methods().Slice() {
-			p.markObject(m.Nname.(*ir.Name))
-		}
-	}
-}
-
-// checkForFullyInst looks for fully-instantiated types in a type (at any nesting
-// level). If it finds a fully-instantiated type, it ensures that the necessary
-// dictionary and shape methods are exported. It updates p.checkFullyInst, so it
-// traverses each particular type only once.
-func (p *crawler) checkForFullyInst(t *types.Type) {
-	if p.checkFullyInst[t] {
-		return
-	}
-	p.checkFullyInst[t] = true
-
-	if t.IsFullyInstantiated() && !t.HasShape() && !t.IsInterface() && t.Methods().Len() > 0 {
-		// For any fully-instantiated type, the relevant
-		// dictionaries and shape instantiations will have
-		// already been created or are in the import data.
-		// Make sure that they are exported, so that any
-		// other package that inlines this function will have
-		// them available for import, and so will not need
-		// another round of method and dictionary
-		// instantiation after inlining.
-		baseType := t.OrigType()
-		shapes := make([]*types.Type, len(t.RParams()))
-		for i, t1 := range t.RParams() {
-			shapes[i] = Shapify(t1, i, baseType.RParams()[i])
-		}
-		for j, tmethod := range t.Methods().Slice() {
-			baseNname := baseType.Methods().Slice()[j].Nname.(*ir.Name)
-			dictsym := MakeDictSym(baseNname.Sym(), t.RParams(), true)
-			if dictsym.Def == nil {
-				in := Resolve(ir.NewIdent(src.NoXPos, dictsym))
-				dictsym = in.Sym()
-			}
-			Export(dictsym.Def.(*ir.Name))
-			methsym := MakeFuncInstSym(baseNname.Sym(), shapes, false, true)
-			if methsym.Def == nil {
-				in := Resolve(ir.NewIdent(src.NoXPos, methsym))
-				methsym = in.Sym()
-			}
-			methNode := methsym.Def.(*ir.Name)
-			Export(methNode)
-			if HaveInlineBody(methNode.Func) {
-				// Export the body as well if
-				// instantiation is inlineable.
-				ImportedBody(methNode.Func)
-				methNode.Func.SetExportInline(true)
-			}
-			// Make sure that any associated types are also exported. (See #52279)
-			p.checkForFullyInst(tmethod.Type)
-		}
-	}
-
-	// Descend into the type. We descend even if it is a fully-instantiated type,
-	// since the instantiated type may have other instantiated types inside of
-	// it (in fields, methods, etc.).
-	switch t.Kind() {
-	case types.TPTR, types.TARRAY, types.TSLICE:
-		p.checkForFullyInst(t.Elem())
-
-	case types.TCHAN:
-		p.checkForFullyInst(t.Elem())
-
-	case types.TMAP:
-		p.checkForFullyInst(t.Key())
-		p.checkForFullyInst(t.Elem())
-
-	case types.TSTRUCT:
-		if t.IsFuncArgStruct() {
-			break
-		}
-		for _, f := range t.FieldSlice() {
-			p.checkForFullyInst(f.Type)
-		}
-
-	case types.TFUNC:
-		if recv := t.Recv(); recv != nil {
-			p.checkForFullyInst(t.Recv().Type)
-		}
-		for _, f := range t.Params().FieldSlice() {
-			p.checkForFullyInst(f.Type)
-		}
-		for _, f := range t.Results().FieldSlice() {
-			p.checkForFullyInst(f.Type)
-		}
-
-	case types.TINTER:
-		for _, f := range t.AllMethods().Slice() {
-			p.checkForFullyInst(f.Type)
-		}
-	}
-}
-
-// markInlBody marks n's inline body for export and recursively
-// ensures all called functions are marked too.
-func (p *crawler) markInlBody(n *ir.Name) {
-	if n == nil {
-		return
-	}
-	if n.Op() != ir.ONAME || n.Class != ir.PFUNC {
-		base.Fatalf("markInlBody: unexpected %v, %v, %v", n, n.Op(), n.Class)
-	}
-	fn := n.Func
-	if fn == nil {
-		base.Fatalf("markInlBody: missing Func on %v", n)
-	}
-	if !HaveInlineBody(fn) {
-		return
-	}
-
-	if fn.ExportInline() {
-		return
-	}
-	fn.SetExportInline(true)
-
-	ImportedBody(fn)
-
-	var doFlood func(n ir.Node)
-	doFlood = func(n ir.Node) {
-		t := n.Type()
-		if t != nil {
-			if t.HasTParam() {
-				// If any generic types are used, then make sure that
-				// the methods of the generic type are exported and
-				// scanned for other possible exports.
-				p.markGeneric(t)
-			} else {
-				p.checkForFullyInst(t)
-			}
-			if base.Debug.Unified == 0 {
-				// If a method of un-exported type is promoted and accessible by
-				// embedding in an exported type, it makes that type reachable.
-				//
-				// Example:
-				//
-				//     type t struct {}
-				//     func (t) M() {}
-				//
-				//     func F() interface{} { return struct{ t }{} }
-				//
-				// We generate the wrapper for "struct{ t }".M, and inline call
-				// to "struct{ t }".M, which makes "t.M" reachable.
-				if t.IsStruct() {
-					for _, f := range t.FieldSlice() {
-						if f.Embedded != 0 {
-							p.markEmbed(f.Type)
-						}
-					}
-				}
-			}
-		}
-
-		switch n.Op() {
-		case ir.OMETHEXPR, ir.ODOTMETH:
-			p.markInlBody(ir.MethodExprName(n))
-		case ir.ONAME:
-			n := n.(*ir.Name)
-			switch n.Class {
-			case ir.PFUNC:
-				p.markInlBody(n)
-				// Note: this Export() and the one below seem unneeded,
-				// since any function/extern name encountered in an
-				// exported function body will be exported
-				// automatically via qualifiedIdent() in iexport.go.
-				Export(n)
-			case ir.PEXTERN:
-				Export(n)
-			}
-		case ir.OMETHVALUE:
-			// Okay, because we don't yet inline indirect
-			// calls to method values.
-		case ir.OCLOSURE:
-			// VisitList doesn't visit closure bodies, so force a
-			// recursive call to VisitList on the body of the closure.
-			ir.VisitList(n.(*ir.ClosureExpr).Func.Body, doFlood)
-		}
-	}
-
-	// Recursively identify all referenced functions for
-	// reexport. We want to include even non-called functions,
-	// because after inlining they might be callable.
-	ir.VisitList(fn.Inl.Body, doFlood)
-}
-
-// isPtrFullyInstantiated returns true if t is a fully-instantiated type, or it is a
-// pointer to a fully-instantiated type.
-func isPtrFullyInstantiated(t *types.Type) bool {
-	return t.IsPtr() && t.Elem().IsFullyInstantiated() ||
-		t.IsFullyInstantiated()
-}
diff --git a/src/cmd/compile/internal/typecheck/dcl.go b/src/cmd/compile/internal/typecheck/dcl.go
index fce7d3d..029c14f 100644
--- a/src/cmd/compile/internal/typecheck/dcl.go
+++ b/src/cmd/compile/internal/typecheck/dcl.go
@@ -6,6 +6,7 @@
 
 import (
 	"fmt"
+	"internal/types/errors"
 	"sync"
 
 	"cmd/compile/internal/base"
@@ -29,7 +30,7 @@
 		recv1 = declareParam(ir.PPARAM, -1, recv)
 	}
 
-	typ := types.NewSignature(types.LocalPkg, recv1, nil, declareParams(ir.PPARAM, params), declareParams(ir.PPARAMOUT, results))
+	typ := types.NewSignature(recv1, declareParams(ir.PPARAM, params), declareParams(ir.PPARAMOUT, results))
 	checkdupfields("argument", typ.Recvs().FieldSlice(), typ.Params().FieldSlice(), typ.Results().FieldSlice())
 	fn.Nname.SetType(typ)
 	fn.Nname.SetTypecheck(1)
@@ -48,17 +49,18 @@
 
 	// kludgy: TypecheckAllowed means we're past parsing. Eg reflectdata.methodWrapper may declare out of package names later.
 	if !inimport && !TypecheckAllowed && s.Pkg != types.LocalPkg {
-		base.ErrorfAt(n.Pos(), "cannot declare name %v", s)
+		base.ErrorfAt(n.Pos(), 0, "cannot declare name %v", s)
 	}
 
 	if ctxt == ir.PEXTERN {
 		if s.Name == "init" {
-			base.ErrorfAt(n.Pos(), "cannot declare init - must be func")
+			base.ErrorfAt(n.Pos(), errors.InvalidInitDecl, "cannot declare init - must be func")
 		}
 		if s.Name == "main" && s.Pkg.Name == "main" {
-			base.ErrorfAt(n.Pos(), "cannot declare main - must be func")
+			base.ErrorfAt(n.Pos(), errors.InvalidMainDecl, "cannot declare main - must be func")
 		}
 		Target.Externs = append(Target.Externs, n)
+		s.Def = n
 	} else {
 		if ir.CurFunc == nil && ctxt == ir.PAUTO {
 			base.Pos = n.Pos()
@@ -67,7 +69,6 @@
 		if ir.CurFunc != nil && ctxt != ir.PFUNC && n.Op() == ir.ONAME {
 			ir.CurFunc.Dcl = append(ir.CurFunc.Dcl, n)
 		}
-		types.Pushdcl(s)
 		n.Curfn = ir.CurFunc
 	}
 
@@ -75,7 +76,6 @@
 		n.SetFrameOffset(0)
 	}
 
-	s.Def = n
 	n.Class = ctxt
 	if ctxt == ir.PFUNC {
 		n.Sym().SetFunc(true)
@@ -107,8 +107,6 @@
 	funcStack = append(funcStack, funcStackEnt{ir.CurFunc, DeclContext})
 	ir.CurFunc = fn
 	DeclContext = ir.PAUTO
-
-	types.Markdcl()
 }
 
 // finish the body.
@@ -116,7 +114,6 @@
 // returns in extern-declaration context.
 func FinishFuncBody() {
 	// change the declaration context from auto to previous context
-	types.Popdcl()
 	var e funcStackEnt
 	funcStack, e = funcStack[:len(funcStack)-1], funcStack[len(funcStack)-1]
 	ir.CurFunc, DeclContext = e.curfn, e.dclcontext
@@ -158,7 +155,7 @@
 				continue
 			}
 			if seen[f.Sym] {
-				base.ErrorfAt(f.Pos, "duplicate %s %s", what, f.Sym.Name)
+				base.ErrorfAt(f.Pos, errors.DuplicateFieldAndMethod, "duplicate %s %s", what, f.Sym.Name)
 				continue
 			}
 			seen[f.Sym] = true
@@ -305,12 +302,6 @@
 // f is method type, with receiver.
 // return function type, receiver as first argument (or not).
 func NewMethodType(sig *types.Type, recv *types.Type) *types.Type {
-	if sig.HasTParam() {
-		base.Fatalf("NewMethodType with type parameters in signature %+v", sig)
-	}
-	if recv != nil && recv.HasTParam() {
-		base.Fatalf("NewMethodType with type parameters in receiver %+v", recv)
-	}
 	nrecvs := 0
 	if recv != nil {
 		nrecvs++
@@ -334,5 +325,5 @@
 		results[i] = types.NewField(base.Pos, nil, t.Type)
 	}
 
-	return types.NewSignature(types.LocalPkg, nil, nil, params, results)
+	return types.NewSignature(nil, params, results)
 }
diff --git a/src/cmd/compile/internal/typecheck/expr.go b/src/cmd/compile/internal/typecheck/expr.go
index 0cd69ab..2d25f80 100644
--- a/src/cmd/compile/internal/typecheck/expr.go
+++ b/src/cmd/compile/internal/typecheck/expr.go
@@ -184,13 +184,6 @@
 		}
 	}
 
-	if (op == ir.ODIV || op == ir.OMOD) && ir.IsConst(r, constant.Int) {
-		if constant.Sign(r.Val()) == 0 {
-			base.Errorf("division by zero")
-			return l, r, nil
-		}
-	}
-
 	return l, r, t
 }
 
@@ -516,18 +509,6 @@
 	return n
 }
 
-func wrongTypeFor(haveSym *types.Sym, haveType *types.Type, wantSym *types.Sym, wantType *types.Type) string {
-	haveT := fmt.Sprintf("%S", haveType)
-	wantT := fmt.Sprintf("%S", wantType)
-	if haveT == wantT {
-		// Add packages instead of reporting "got Foo but wanted Foo", see #54258.
-		haveT = haveType.Pkg().Path + "." + haveT
-		wantT = wantType.Pkg().Path + "." + wantT
-	}
-	return fmt.Sprintf("(wrong type for %v method)\n"+
-		"\t\thave %v%s\n\t\twant %v%s", wantSym, haveSym, haveT, wantSym, wantT)
-}
-
 // tcDotType typechecks an ODOTTYPE node.
 func tcDotType(n *ir.TypeAssertExpr) ir.Node {
 	n.X = Expr(n.X)
@@ -547,20 +528,9 @@
 	base.AssertfAt(n.Type() != nil, n.Pos(), "missing type: %v", n)
 
 	if n.Type() != nil && !n.Type().IsInterface() {
-		var missing, have *types.Field
-		var ptr int
-		if !implements(n.Type(), t, &missing, &have, &ptr) {
-			if have != nil && have.Sym == missing.Sym {
-				base.Errorf("impossible type assertion:\n\t%v does not implement %v %s", n.Type(), t,
-					wrongTypeFor(have.Sym, have.Type, missing.Sym, missing.Type))
-			} else if ptr != 0 {
-				base.Errorf("impossible type assertion:\n\t%v does not implement %v (%v method has pointer receiver)", n.Type(), t, missing.Sym)
-			} else if have != nil {
-				base.Errorf("impossible type assertion:\n\t%v does not implement %v (missing %v method)\n"+
-					"\t\thave %v%S\n\t\twant %v%S", n.Type(), t, missing.Sym, have.Sym, have.Type, missing.Sym, missing.Type)
-			} else {
-				base.Errorf("impossible type assertion:\n\t%v does not implement %v (missing %v method)", n.Type(), t, missing.Sym)
-			}
+		why := ImplementsExplain(n.Type(), t)
+		if why != "" {
+			base.Fatalf("impossible type assertion:\n\t%s", why)
 			n.SetType(nil)
 			return n
 		}
diff --git a/src/cmd/compile/internal/typecheck/func.go b/src/cmd/compile/internal/typecheck/func.go
index 7cf9d5c..47d6c1e 100644
--- a/src/cmd/compile/internal/typecheck/func.go
+++ b/src/cmd/compile/internal/typecheck/func.go
@@ -76,6 +76,15 @@
 	call.Args = args
 }
 
+func AssertFixedCall(call *ir.CallExpr) {
+	if call.X.Type().IsVariadic() && !call.IsDDD {
+		base.FatalfAt(call.Pos(), "missed FixVariadicCall")
+	}
+	if call.Op() == ir.OCALLMETH {
+		base.FatalfAt(call.Pos(), "missed FixMethodCall")
+	}
+}
+
 // ClosureType returns the struct type used to hold all the information
 // needed in the closure for clo (clo must be a OCLOSURE node).
 // The address of a variable of the returned type can be cast to a func.
@@ -85,42 +94,26 @@
 	// and has one float64 argument and no results,
 	// the generated code looks like:
 	//
-	//	clos = &struct{.F uintptr; i *int; s *string}{func.1, &i, &s}
+	//	clos = &struct{F uintptr; X0 *int; X1 *string}{func.1, &i, &s}
 	//
 	// The use of the struct provides type information to the garbage
-	// collector so that it can walk the closure. We could use (in this case)
-	// [3]unsafe.Pointer instead, but that would leave the gc in the dark.
-	// The information appears in the binary in the form of type descriptors;
-	// the struct is unnamed so that closures in multiple packages with the
-	// same struct type can share the descriptor.
+	// collector so that it can walk the closure. We could use (in this
+	// case) [3]unsafe.Pointer instead, but that would leave the gc in
+	// the dark. The information appears in the binary in the form of
+	// type descriptors; the struct is unnamed and uses exported field
+	// names so that closures in multiple packages with the same struct
+	// type can share the descriptor.
 
-	// Make sure the .F field is in the same package as the rest of the
-	// fields. This deals with closures in instantiated functions, which are
-	// compiled as if from the source package of the generic function.
-	var pkg *types.Pkg
-	if len(clo.Func.ClosureVars) == 0 {
-		pkg = types.LocalPkg
-	} else {
-		for _, v := range clo.Func.ClosureVars {
-			if pkg == nil {
-				pkg = v.Sym().Pkg
-			} else if pkg != v.Sym().Pkg {
-				base.Fatalf("Closure variables from multiple packages: %+v", clo)
-			}
-		}
-	}
-
-	fields := []*types.Field{
-		types.NewField(base.Pos, pkg.Lookup(".F"), types.Types[types.TUINTPTR]),
-	}
-	for _, v := range clo.Func.ClosureVars {
+	fields := make([]*types.Field, 1+len(clo.Func.ClosureVars))
+	fields[0] = types.NewField(base.AutogeneratedPos, types.LocalPkg.Lookup("F"), types.Types[types.TUINTPTR])
+	for i, v := range clo.Func.ClosureVars {
 		typ := v.Type()
 		if !v.Byval() {
 			typ = types.NewPtr(typ)
 		}
-		fields = append(fields, types.NewField(base.Pos, v.Sym(), typ))
+		fields[1+i] = types.NewField(base.AutogeneratedPos, types.LocalPkg.LookupNum("X", i), typ)
 	}
-	typ := types.NewStruct(types.NoPkg, fields)
+	typ := types.NewStruct(fields)
 	typ.SetNoalg(true)
 	return typ
 }
@@ -129,7 +122,7 @@
 // needed in the closure for a OMETHVALUE node. The address of a variable of
 // the returned type can be cast to a func.
 func MethodValueType(n *ir.SelectorExpr) *types.Type {
-	t := types.NewStruct(types.NoPkg, []*types.Field{
+	t := types.NewStruct([]*types.Field{
 		types.NewField(base.Pos, Lookup("F"), types.Types[types.TUINTPTR]),
 		types.NewField(base.Pos, Lookup("R"), n.X.Type()),
 	})
@@ -137,54 +130,6 @@
 	return t
 }
 
-// ImportedBody returns immediately if the inlining information for fn is
-// populated. Otherwise, fn must be an imported function. If so, ImportedBody
-// loads in the dcls and body for fn, and typechecks as needed.
-func ImportedBody(fn *ir.Func) {
-	if fn.Inl.Body != nil {
-		return
-	}
-	lno := ir.SetPos(fn.Nname)
-
-	// When we load an inlined body, we need to allow OADDR
-	// operations on untyped expressions. We will fix the
-	// addrtaken flags on all the arguments of the OADDR with the
-	// computeAddrtaken call below (after we typecheck the body).
-	// TODO: export/import types and addrtaken marks along with inlined bodies,
-	// so this will be unnecessary.
-	IncrementalAddrtaken = false
-	defer func() {
-		if DirtyAddrtaken {
-			// We do ComputeAddrTaken on function instantiations, but not
-			// generic functions (since we may not yet know if x in &x[i]
-			// is an array or a slice).
-			if !fn.Type().HasTParam() {
-				ComputeAddrtaken(fn.Inl.Body) // compute addrtaken marks once types are available
-			}
-			DirtyAddrtaken = false
-		}
-		IncrementalAddrtaken = true
-	}()
-
-	ImportBody(fn)
-
-	// Stmts(fn.Inl.Body) below is only for imported functions;
-	// their bodies may refer to unsafe as long as the package
-	// was marked safe during import (which was checked then).
-	// the ->inl of a local function has been typechecked before CanInline copied it.
-	pkg := fnpkg(fn.Nname)
-
-	if pkg == types.LocalPkg || pkg == nil {
-		return // ImportedBody on local function
-	}
-
-	if base.Flag.LowerM > 2 || base.Debug.Export != 0 {
-		fmt.Printf("typecheck import [%v] %L { %v }\n", fn.Sym(), fn, ir.Nodes(fn.Inl.Body))
-	}
-
-	base.Pos = lno
-}
-
 // Get the function's package. For ordinary functions it's on the ->sym, but for imported methods
 // the ->sym can be re-used in the local package, so peel it off the receiver's type.
 func fnpkg(fn *ir.Name) *types.Pkg {
@@ -293,13 +238,13 @@
 		default:
 			base.Fatalf("unknown builtin %v", l)
 
-		case ir.OAPPEND, ir.ODELETE, ir.OMAKE, ir.OPRINT, ir.OPRINTN, ir.ORECOVER:
+		case ir.OAPPEND, ir.ODELETE, ir.OMAKE, ir.OMAX, ir.OMIN, ir.OPRINT, ir.OPRINTN, ir.ORECOVER:
 			n.SetOp(l.BuiltinOp)
 			n.X = nil
 			n.SetTypecheck(0) // re-typechecking new op is OK, not a loop
 			return typecheck(n, top)
 
-		case ir.OCAP, ir.OCLOSE, ir.OIMAG, ir.OLEN, ir.OPANIC, ir.OREAL, ir.OUNSAFESTRINGDATA, ir.OUNSAFESLICEDATA:
+		case ir.OCAP, ir.OCLEAR, ir.OCLOSE, ir.OIMAG, ir.OLEN, ir.OPANIC, ir.OREAL, ir.OUNSAFESTRINGDATA, ir.OUNSAFESLICEDATA:
 			typecheckargs(n)
 			fallthrough
 		case ir.ONEW, ir.OALIGNOF, ir.OOFFSETOF, ir.OSIZEOF:
@@ -387,6 +332,7 @@
 	}
 
 	typecheckaste(ir.OCALL, n.X, n.IsDDD, t.Params(), n.Args, func() string { return fmt.Sprintf("argument to %v", n.X) })
+	FixVariadicCall(n)
 	FixMethodCall(n)
 	if t.NumResults() == 0 {
 		return n
@@ -479,6 +425,28 @@
 	return n
 }
 
+// tcClear typechecks an OCLEAR node.
+func tcClear(n *ir.UnaryExpr) ir.Node {
+	n.X = Expr(n.X)
+	n.X = DefaultLit(n.X, nil)
+	l := n.X
+	t := l.Type()
+	if t == nil {
+		n.SetType(nil)
+		return n
+	}
+
+	switch {
+	case t.IsMap(), t.IsSlice():
+	default:
+		base.Errorf("invalid operation: %v (argument must be a map or slice)", n)
+		n.SetType(nil)
+		return n
+	}
+
+	return n
+}
+
 // tcClose typechecks an OCLOSE node.
 func tcClose(n *ir.UnaryExpr) ir.Node {
 	n.X = Expr(n.X)
@@ -694,7 +662,7 @@
 				return n
 			}
 		} else {
-			l = ir.NewInt(0)
+			l = ir.NewInt(base.Pos, 0)
 		}
 		nn = ir.NewMakeExpr(n.Pos(), ir.OMAKEMAP, l, nil)
 		nn.SetEsc(n.Esc())
@@ -715,7 +683,7 @@
 				return n
 			}
 		} else {
-			l = ir.NewInt(0)
+			l = ir.NewInt(base.Pos, 0)
 		}
 		nn = ir.NewMakeExpr(n.Pos(), ir.OMAKECHAN, l, nil)
 	}
@@ -819,6 +787,19 @@
 	return n
 }
 
+// tcMinMax typechecks an OMIN or OMAX node.
+func tcMinMax(n *ir.CallExpr) ir.Node {
+	typecheckargs(n)
+	arg0 := n.Args[0]
+	for _, arg := range n.Args[1:] {
+		if !types.Identical(arg.Type(), arg0.Type()) {
+			base.FatalfAt(n.Pos(), "mismatched arguments: %L and %L", arg0, arg)
+		}
+	}
+	n.SetType(arg0.Type())
+	return n
+}
+
 // tcRealImag typechecks an OREAL or OIMAG node.
 func tcRealImag(n *ir.UnaryExpr) ir.Node {
 	n.X = Expr(n.X)
diff --git a/src/cmd/compile/internal/typecheck/iexport.go b/src/cmd/compile/internal/typecheck/iexport.go
index 3e65425..df579b7 100644
--- a/src/cmd/compile/internal/typecheck/iexport.go
+++ b/src/cmd/compile/internal/typecheck/iexport.go
@@ -235,37 +235,13 @@
 package typecheck
 
 import (
-	"bytes"
-	"encoding/binary"
-	"fmt"
 	"go/constant"
-	"io"
-	"math/big"
-	"sort"
 	"strconv"
 	"strings"
 
 	"cmd/compile/internal/base"
 	"cmd/compile/internal/ir"
 	"cmd/compile/internal/types"
-	"cmd/internal/goobj"
-	"cmd/internal/notsha256"
-	"cmd/internal/src"
-)
-
-// Current indexed export format version. Increase with each format change.
-// 0: Go1.11 encoding
-// 1: added column details to Pos
-// 2: added information for generic function/types.  The export of non-generic
-// functions/types remains largely backward-compatible.  Breaking changes include:
-//   - a 'kind' byte is added to constant values
-const (
-	iexportVersionGo1_11   = 0
-	iexportVersionPosCol   = 1
-	iexportVersionGenerics = 2
-	iexportVersionGo1_18   = 2
-
-	iexportVersionCurrent = 2
 )
 
 // predeclReserved is the number of type offsets reserved for types
@@ -297,429 +273,6 @@
 	magic = 0x6742937dc293105
 )
 
-// WriteExports writes the indexed export format to out. If extensions
-// is true, then the compiler-only extensions are included.
-func WriteExports(out io.Writer, extensions bool) {
-	if extensions {
-		// If we're exporting inline bodies, invoke the crawler to mark
-		// which bodies to include.
-		crawlExports(Target.Exports)
-	}
-
-	p := iexporter{
-		allPkgs:     map[*types.Pkg]bool{},
-		stringIndex: map[string]uint64{},
-		declIndex:   map[*types.Sym]uint64{},
-		inlineIndex: map[*types.Sym]uint64{},
-		typIndex:    map[*types.Type]uint64{},
-		extensions:  extensions,
-	}
-
-	for i, pt := range predeclared() {
-		p.typIndex[pt] = uint64(i)
-	}
-	if len(p.typIndex) > predeclReserved {
-		base.Fatalf("too many predeclared types: %d > %d", len(p.typIndex), predeclReserved)
-	}
-
-	// Initialize work queue with exported declarations.
-	for _, n := range Target.Exports {
-		p.pushDecl(n)
-	}
-
-	// Loop until no more work. We use a queue because while
-	// writing out inline bodies, we may discover additional
-	// declarations that are needed.
-	for !p.declTodo.Empty() {
-		p.doDecl(p.declTodo.PopLeft())
-	}
-
-	// Append indices to data0 section.
-	dataLen := uint64(p.data0.Len())
-	w := p.newWriter()
-	w.writeIndex(p.declIndex, true)
-	w.writeIndex(p.inlineIndex, false)
-	w.flush()
-
-	if *base.Flag.LowerV {
-		fmt.Printf("export: hdr strings %v, data %v, index %v\n", p.strings.Len(), dataLen, p.data0.Len())
-	}
-
-	// Assemble header.
-	var hdr intWriter
-	hdr.WriteByte('i')
-	hdr.uint64(iexportVersionCurrent)
-	hdr.uint64(uint64(p.strings.Len()))
-	hdr.uint64(dataLen)
-
-	// Flush output.
-	h := notsha256.New()
-	wr := io.MultiWriter(out, h)
-	io.Copy(wr, &hdr)
-	io.Copy(wr, &p.strings)
-	io.Copy(wr, &p.data0)
-
-	// Add fingerprint (used by linker object file).
-	// Attach this to the end, so tools (e.g. gcimporter) don't care.
-	copy(base.Ctxt.Fingerprint[:], h.Sum(nil)[:])
-	out.Write(base.Ctxt.Fingerprint[:])
-}
-
-// writeIndex writes out a symbol index. mainIndex indicates whether
-// we're writing out the main index, which is also read by
-// non-compiler tools and includes a complete package description
-// (i.e., name and height).
-func (w *exportWriter) writeIndex(index map[*types.Sym]uint64, mainIndex bool) {
-	// Build a map from packages to symbols from that package.
-	pkgSyms := map[*types.Pkg][]*types.Sym{}
-
-	// For the main index, make sure to include every package that
-	// we reference, even if we're not exporting (or reexporting)
-	// any symbols from it.
-	if mainIndex {
-		pkgSyms[types.LocalPkg] = nil
-		for pkg := range w.p.allPkgs {
-			pkgSyms[pkg] = nil
-		}
-	}
-
-	// Group symbols by package.
-	for sym := range index {
-		pkgSyms[sym.Pkg] = append(pkgSyms[sym.Pkg], sym)
-	}
-
-	// Sort packages by path.
-	var pkgs []*types.Pkg
-	for pkg := range pkgSyms {
-		pkgs = append(pkgs, pkg)
-	}
-	sort.Slice(pkgs, func(i, j int) bool {
-		return exportPath(pkgs[i]) < exportPath(pkgs[j])
-	})
-	if mainIndex {
-		base.Assertf(pkgs[0] == types.LocalPkg, "LocalPkg must be first")
-	}
-
-	w.uint64(uint64(len(pkgs)))
-	for _, pkg := range pkgs {
-		w.string(exportPath(pkg))
-		if mainIndex {
-			w.string(pkg.Name)
-			w.uint64(0) // was package height, but not necessary anymore.
-		}
-
-		// Sort symbols within a package by name.
-		syms := pkgSyms[pkg]
-		sort.Slice(syms, func(i, j int) bool {
-			return syms[i].Name < syms[j].Name
-		})
-
-		w.uint64(uint64(len(syms)))
-		for _, sym := range syms {
-			w.string(sym.Name)
-			w.uint64(index[sym])
-		}
-	}
-}
-
-type iexporter struct {
-	// allPkgs tracks all packages that have been referenced by
-	// the export data, so we can ensure to include them in the
-	// main index.
-	allPkgs map[*types.Pkg]bool
-
-	declTodo ir.NameQueue
-
-	strings     intWriter
-	stringIndex map[string]uint64
-
-	data0       intWriter
-	declIndex   map[*types.Sym]uint64
-	inlineIndex map[*types.Sym]uint64
-	typIndex    map[*types.Type]uint64
-
-	extensions bool
-}
-
-// stringOff returns the offset of s within the string section.
-// If not already present, it's added to the end.
-func (p *iexporter) stringOff(s string) uint64 {
-	off, ok := p.stringIndex[s]
-	if !ok {
-		off = uint64(p.strings.Len())
-		p.stringIndex[s] = off
-
-		if *base.Flag.LowerV {
-			fmt.Printf("export: str %v %.40q\n", off, s)
-		}
-
-		p.strings.uint64(uint64(len(s)))
-		p.strings.WriteString(s)
-	}
-	return off
-}
-
-// pushDecl adds n to the declaration work queue, if not already present.
-func (p *iexporter) pushDecl(n *ir.Name) {
-	if n.Sym() == nil || n.Sym().Def != n && n.Op() != ir.OTYPE {
-		base.Fatalf("weird Sym: %v, %v", n, n.Sym())
-	}
-
-	// Don't export predeclared declarations.
-	if n.Sym().Pkg == types.BuiltinPkg || n.Sym().Pkg == types.UnsafePkg {
-		return
-	}
-
-	if _, ok := p.declIndex[n.Sym()]; ok {
-		return
-	}
-
-	p.declIndex[n.Sym()] = ^uint64(0) // mark n present in work queue
-	p.declTodo.PushRight(n)
-}
-
-// exportWriter handles writing out individual data section chunks.
-type exportWriter struct {
-	p *iexporter
-
-	data       intWriter
-	currPkg    *types.Pkg
-	prevFile   string
-	prevLine   int64
-	prevColumn int64
-
-	// dclIndex maps function-scoped declarations to an int used to refer to
-	// them later in the function. For local variables/params, the int is
-	// non-negative and in order of the appearance in the Func's Dcl list. For
-	// closure variables, the index is negative starting at -2.
-	dclIndex           map[*ir.Name]int
-	maxDclIndex        int
-	maxClosureVarIndex int
-}
-
-func (p *iexporter) doDecl(n *ir.Name) {
-	w := p.newWriter()
-	w.setPkg(n.Sym().Pkg, false)
-
-	switch n.Op() {
-	case ir.ONAME:
-		switch n.Class {
-		case ir.PEXTERN:
-			// Variable.
-			w.tag('V')
-			w.pos(n.Pos())
-			w.typ(n.Type())
-			if w.p.extensions {
-				w.varExt(n)
-			}
-
-		case ir.PFUNC:
-			if ir.IsMethod(n) {
-				base.Fatalf("unexpected method: %v", n)
-			}
-
-			// Function.
-			if n.Type().TParams().NumFields() == 0 {
-				w.tag('F')
-			} else {
-				w.tag('G')
-			}
-			w.pos(n.Pos())
-			// The tparam list of the function type is the
-			// declaration of the type params. So, write out the type
-			// params right now. Then those type params will be
-			// referenced via their type offset (via typOff) in all
-			// other places in the signature and function that they
-			// are used.
-			if n.Type().TParams().NumFields() > 0 {
-				w.tparamList(n.Type().TParams().FieldSlice())
-			}
-			w.signature(n.Type())
-			if w.p.extensions {
-				w.funcExt(n)
-			}
-
-		default:
-			base.Fatalf("unexpected class: %v, %v", n, n.Class)
-		}
-
-	case ir.OLITERAL:
-		// TODO(mdempsky): Extend check to all declarations.
-		if n.Typecheck() == 0 {
-			base.FatalfAt(n.Pos(), "missed typecheck: %v", n)
-		}
-
-		// Constant.
-		w.tag('C')
-		w.pos(n.Pos())
-		w.value(n.Type(), n.Val())
-		if w.p.extensions {
-			w.constExt(n)
-		}
-
-	case ir.OTYPE:
-		if n.Type().IsTypeParam() && n.Type().Underlying() == n.Type() {
-			// Even though it has local scope, a typeparam requires a
-			// declaration via its package and unique name, because it
-			// may be referenced within its type bound during its own
-			// definition.
-			w.tag('P')
-			// A typeparam has a name, and has a type bound rather
-			// than an underlying type.
-			w.pos(n.Pos())
-			if iexportVersionCurrent >= iexportVersionGo1_18 {
-				implicit := n.Type().Bound().IsImplicit()
-				w.bool(implicit)
-			}
-			w.typ(n.Type().Bound())
-			break
-		}
-
-		if n.Alias() {
-			// Alias.
-			w.tag('A')
-			w.pos(n.Pos())
-			w.typ(n.Type())
-			break
-		}
-
-		// Defined type.
-		if len(n.Type().RParams()) == 0 {
-			w.tag('T')
-		} else {
-			w.tag('U')
-		}
-		w.pos(n.Pos())
-
-		if len(n.Type().RParams()) > 0 {
-			// Export type parameters, if any, needed for this type
-			w.typeList(n.Type().RParams())
-		}
-
-		underlying := n.Type().Underlying()
-		if underlying == types.ErrorType.Underlying() {
-			// For "type T error", use error as the
-			// underlying type instead of error's own
-			// underlying anonymous interface. This
-			// ensures consistency with how importers may
-			// declare error (e.g., go/types uses nil Pkg
-			// for predeclared objects).
-			underlying = types.ErrorType
-		}
-		if underlying == types.ComparableType.Underlying() {
-			// Do same for ComparableType as for ErrorType.
-			underlying = types.ComparableType
-		}
-		if underlying == types.AnyType.Underlying() {
-			// Do same for AnyType as for ErrorType.
-			underlying = types.AnyType
-		}
-		w.typ(underlying)
-
-		t := n.Type()
-		if t.IsInterface() {
-			if w.p.extensions {
-				w.typeExt(t)
-			}
-			break
-		}
-
-		methods := t.Methods().Slice()
-		w.uint64(uint64(len(methods)))
-		for _, m := range methods {
-			w.pos(m.Pos)
-			w.selector(m.Sym)
-			w.param(m.Type.Recv())
-			w.signature(m.Type)
-		}
-
-		if w.p.extensions {
-			w.typeExt(t)
-			for _, m := range methods {
-				w.methExt(m)
-			}
-		}
-
-	default:
-		base.Fatalf("unexpected node: %v", n)
-	}
-
-	w.finish("dcl", p.declIndex, n.Sym())
-}
-
-func (w *exportWriter) tag(tag byte) {
-	w.data.WriteByte(tag)
-}
-
-func (w *exportWriter) finish(what string, index map[*types.Sym]uint64, sym *types.Sym) {
-	off := w.flush()
-	if *base.Flag.LowerV {
-		fmt.Printf("export: %v %v %v\n", what, off, sym)
-	}
-	index[sym] = off
-}
-
-func (p *iexporter) doInline(f *ir.Name) {
-	w := p.newWriter()
-	w.setPkg(fnpkg(f), false)
-
-	w.dclIndex = make(map[*ir.Name]int, len(f.Func.Inl.Dcl))
-	w.funcBody(f.Func)
-
-	w.finish("inl", p.inlineIndex, f.Sym())
-}
-
-func (w *exportWriter) pos(pos src.XPos) {
-	p := base.Ctxt.PosTable.Pos(pos)
-	file := p.Base().AbsFilename()
-	line := int64(p.RelLine())
-	column := int64(p.RelCol())
-
-	// Encode position relative to the last position: column
-	// delta, then line delta, then file name. We reserve the
-	// bottom bit of the column and line deltas to encode whether
-	// the remaining fields are present.
-	//
-	// Note: Because data objects may be read out of order (or not
-	// at all), we can only apply delta encoding within a single
-	// object. This is handled implicitly by tracking prevFile,
-	// prevLine, and prevColumn as fields of exportWriter.
-
-	deltaColumn := (column - w.prevColumn) << 1
-	deltaLine := (line - w.prevLine) << 1
-
-	if file != w.prevFile {
-		deltaLine |= 1
-	}
-	if deltaLine != 0 {
-		deltaColumn |= 1
-	}
-
-	w.int64(deltaColumn)
-	if deltaColumn&1 != 0 {
-		w.int64(deltaLine)
-		if deltaLine&1 != 0 {
-			w.string(file)
-		}
-	}
-
-	w.prevFile = file
-	w.prevLine = line
-	w.prevColumn = column
-}
-
-func (w *exportWriter) pkg(pkg *types.Pkg) {
-	// TODO(mdempsky): Add flag to types.Pkg to mark pseudo-packages.
-	if pkg == ir.Pkgs.Go {
-		base.Fatalf("export of pseudo-package: %q", pkg.Path)
-	}
-
-	// Ensure any referenced packages are declared in the main index.
-	w.p.allPkgs[pkg] = true
-
-	w.string(exportPath(pkg))
-}
-
 // exportPath returns the path for pkg as it appears in the iexport
 // file format. For historical reasons (before cmd/compile required
 // the -p flag), the local package is represented as the empty string,
@@ -731,15 +284,6 @@
 	return pkg.Path
 }
 
-func (w *exportWriter) qualifiedIdent(n *ir.Name) {
-	// Ensure any referenced declarations are written out too.
-	w.p.pushDecl(n)
-
-	s := n.Sym()
-	w.string(s.Name)
-	w.pkg(s.Pkg)
-}
-
 const blankMarker = "$"
 
 // TparamExportName creates a unique name for type param in a method or a generic
@@ -770,378 +314,6 @@
 	return name
 }
 
-func (w *exportWriter) selector(s *types.Sym) {
-	if w.currPkg == nil {
-		base.Fatalf("missing currPkg")
-	}
-
-	// If the selector being written is unexported, it comes with a package qualifier.
-	// If the selector being written is exported, it is not package-qualified.
-	// See the spec: https://golang.org/ref/spec#Uniqueness_of_identifiers
-	// As an optimization, we don't actually write the package every time - instead we
-	// call setPkg before a group of selectors (all of which must have the same package qualifier).
-	pkg := w.currPkg
-	if types.IsExported(s.Name) {
-		pkg = types.LocalPkg
-	}
-	if s.Pkg != pkg {
-		base.Fatalf("package mismatch in selector: %v in package %q, but want %q", s, s.Pkg.Path, pkg.Path)
-	}
-
-	w.string(s.Name)
-}
-
-func (w *exportWriter) typ(t *types.Type) {
-	w.data.uint64(w.p.typOff(t))
-}
-
-// The "exotic" functions in this section encode a wider range of
-// items than the standard encoding functions above. These include
-// types that do not appear in declarations, only in code, such as
-// method types. These methods need to be separate from the standard
-// encoding functions because we don't want to modify the encoding
-// generated by the standard functions (because that exported
-// information is read by tools besides the compiler).
-
-// exoticType exports a type to the writer.
-func (w *exportWriter) exoticType(t *types.Type) {
-	switch {
-	case t == nil:
-		// Calls-as-statements have no type.
-		w.data.uint64(exoticTypeNil)
-	case t.IsStruct() && t.StructType().Funarg != types.FunargNone:
-		// These are weird structs for representing tuples of types returned
-		// by multi-return functions.
-		// They don't fit the standard struct type mold. For instance,
-		// they don't have any package info.
-		w.data.uint64(exoticTypeTuple)
-		w.uint64(uint64(t.StructType().Funarg))
-		w.uint64(uint64(t.NumFields()))
-		for _, f := range t.FieldSlice() {
-			w.pos(f.Pos)
-			s := f.Sym
-			if s == nil {
-				w.uint64(0)
-			} else if s.Pkg == nil {
-				w.uint64(exoticTypeSymNoPkg)
-				w.string(s.Name)
-			} else {
-				w.uint64(exoticTypeSymWithPkg)
-				w.pkg(s.Pkg)
-				w.string(s.Name)
-			}
-			w.typ(f.Type)
-			if f.Embedded != 0 || f.Note != "" {
-				panic("extra info in funarg struct field")
-			}
-		}
-	case t.Kind() == types.TFUNC && t.Recv() != nil:
-		w.data.uint64(exoticTypeRecv)
-		// interface method types have a fake receiver type.
-		isFakeRecv := t.Recv().Type == types.FakeRecvType()
-		w.bool(isFakeRecv)
-		if !isFakeRecv {
-			w.exoticParam(t.Recv())
-		}
-		w.exoticSignature(t)
-
-	default:
-		// A regular type.
-		w.data.uint64(exoticTypeRegular)
-		w.typ(t)
-	}
-}
-
-const (
-	exoticTypeNil = iota
-	exoticTypeTuple
-	exoticTypeRecv
-	exoticTypeRegular
-)
-const (
-	exoticTypeSymNil = iota
-	exoticTypeSymNoPkg
-	exoticTypeSymWithPkg
-)
-
-// Export a selector, but one whose package may not match
-// the package being compiled. This is a separate function
-// because the standard selector() serialization format is fixed
-// by the go/types reader. This one can only be used during
-// inline/generic body exporting.
-func (w *exportWriter) exoticSelector(s *types.Sym) {
-	pkg := w.currPkg
-	if types.IsExported(s.Name) {
-		pkg = types.LocalPkg
-	}
-
-	w.string(s.Name)
-	if s.Pkg == pkg {
-		w.uint64(0)
-	} else {
-		w.uint64(1)
-		w.pkg(s.Pkg)
-	}
-}
-
-func (w *exportWriter) exoticSignature(t *types.Type) {
-	hasPkg := t.Pkg() != nil
-	w.bool(hasPkg)
-	if hasPkg {
-		w.pkg(t.Pkg())
-	}
-	w.exoticParamList(t.Params().FieldSlice())
-	w.exoticParamList(t.Results().FieldSlice())
-}
-
-func (w *exportWriter) exoticParamList(fs []*types.Field) {
-	w.uint64(uint64(len(fs)))
-	for _, f := range fs {
-		w.exoticParam(f)
-	}
-
-}
-func (w *exportWriter) exoticParam(f *types.Field) {
-	w.pos(f.Pos)
-	w.exoticSym(f.Sym)
-	w.uint64(uint64(f.Offset))
-	w.exoticType(f.Type)
-	w.bool(f.IsDDD())
-}
-
-func (w *exportWriter) exoticField(f *types.Field) {
-	w.pos(f.Pos)
-	w.exoticSym(f.Sym)
-	w.uint64(uint64(f.Offset))
-	w.exoticType(f.Type)
-	w.string(f.Note)
-}
-
-func (w *exportWriter) exoticSym(s *types.Sym) {
-	if s == nil {
-		w.string("")
-		return
-	}
-	if s.Name == "" {
-		base.Fatalf("empty symbol name")
-	}
-	w.string(s.Name)
-	if !types.IsExported(s.Name) {
-		w.pkg(s.Pkg)
-	}
-}
-
-func (p *iexporter) newWriter() *exportWriter {
-	return &exportWriter{p: p}
-}
-
-func (w *exportWriter) flush() uint64 {
-	off := uint64(w.p.data0.Len())
-	io.Copy(&w.p.data0, &w.data)
-	return off
-}
-
-func (p *iexporter) typOff(t *types.Type) uint64 {
-	off, ok := p.typIndex[t]
-	if !ok {
-		w := p.newWriter()
-		w.doTyp(t)
-		rawOff := w.flush()
-		if *base.Flag.LowerV {
-			fmt.Printf("export: typ %v %v\n", rawOff, t)
-		}
-		off = predeclReserved + rawOff
-		p.typIndex[t] = off
-	}
-	return off
-}
-
-func (w *exportWriter) startType(k itag) {
-	w.data.uint64(uint64(k))
-}
-
-func (w *exportWriter) doTyp(t *types.Type) {
-	s := t.Sym()
-	if s != nil && t.OrigType() != nil {
-		// This is an instantiated type - could be a re-instantiation like
-		// Value[T2] or a full instantiation like Value[int].
-		if strings.Index(s.Name, "[") < 0 {
-			base.Fatalf("incorrect name for instantiated type")
-		}
-		w.startType(instanceType)
-		w.pos(t.Pos())
-		// Export the type arguments for the instantiated type. The
-		// instantiated type could be in a method header (e.g. "func (v
-		// *Value[T2]) set (...) { ... }"), so the type args are "new"
-		// typeparams. Or the instantiated type could be in a
-		// function/method body, so the type args are either concrete
-		// types or existing typeparams from the function/method header.
-		w.typeList(t.RParams())
-		// Export a reference to the base type.
-		baseType := t.OrigType()
-		w.typ(baseType)
-		return
-	}
-
-	// The 't.Underlying() == t' check is to confirm this is a base typeparam
-	// type, rather than a defined type with typeparam underlying type, like:
-	// type orderedAbs[T any] T
-	if t.IsTypeParam() && t.Underlying() == t {
-		if s.Pkg == types.BuiltinPkg || s.Pkg == types.UnsafePkg {
-			base.Fatalf("builtin type missing from typIndex: %v", t)
-		}
-		// Write out the first use of a type param as a qualified ident.
-		// This will force a "declaration" of the type param.
-		w.startType(typeParamType)
-		w.qualifiedIdent(t.Obj().(*ir.Name))
-		return
-	}
-
-	if s != nil {
-		if s.Pkg == types.BuiltinPkg || s.Pkg == types.UnsafePkg {
-			base.Fatalf("builtin type missing from typIndex: %v", t)
-		}
-
-		w.startType(definedType)
-		w.qualifiedIdent(t.Obj().(*ir.Name))
-		return
-	}
-
-	switch t.Kind() {
-	case types.TPTR:
-		w.startType(pointerType)
-		w.typ(t.Elem())
-
-	case types.TSLICE:
-		w.startType(sliceType)
-		w.typ(t.Elem())
-
-	case types.TARRAY:
-		w.startType(arrayType)
-		w.uint64(uint64(t.NumElem()))
-		w.typ(t.Elem())
-
-	case types.TCHAN:
-		w.startType(chanType)
-		w.uint64(uint64(t.ChanDir()))
-		w.typ(t.Elem())
-
-	case types.TMAP:
-		w.startType(mapType)
-		w.typ(t.Key())
-		w.typ(t.Elem())
-
-	case types.TFUNC:
-		w.startType(signatureType)
-		w.setPkg(t.Pkg(), true)
-		w.signature(t)
-
-	case types.TSTRUCT:
-		w.startType(structType)
-		w.setPkg(t.Pkg(), true)
-
-		w.uint64(uint64(t.NumFields()))
-		for _, f := range t.FieldSlice() {
-			w.pos(f.Pos)
-			w.selector(f.Sym)
-			w.typ(f.Type)
-			w.bool(f.Embedded != 0)
-			w.string(f.Note)
-		}
-
-	case types.TINTER:
-		var embeddeds, methods []*types.Field
-		for _, m := range t.Methods().Slice() {
-			if m.Sym != nil {
-				methods = append(methods, m)
-			} else {
-				embeddeds = append(embeddeds, m)
-			}
-		}
-
-		w.startType(interfaceType)
-		w.setPkg(t.Pkg(), true)
-
-		w.uint64(uint64(len(embeddeds)))
-		for _, f := range embeddeds {
-			w.pos(f.Pos)
-			w.typ(f.Type)
-		}
-
-		w.uint64(uint64(len(methods)))
-		for _, f := range methods {
-			w.pos(f.Pos)
-			w.selector(f.Sym)
-			w.signature(f.Type)
-		}
-
-	case types.TUNION:
-		// TODO(danscales): possibly put out the tilde bools in more
-		// compact form.
-		w.startType(unionType)
-		nt := t.NumTerms()
-		w.uint64(uint64(nt))
-		for i := 0; i < nt; i++ {
-			typ, tilde := t.Term(i)
-			w.bool(tilde)
-			w.typ(typ)
-		}
-
-	default:
-		base.Fatalf("unexpected type: %v", t)
-	}
-}
-
-func (w *exportWriter) setPkg(pkg *types.Pkg, write bool) {
-	if pkg == types.NoPkg {
-		base.Fatalf("missing pkg")
-	}
-
-	if write {
-		w.pkg(pkg)
-	}
-
-	w.currPkg = pkg
-}
-
-func (w *exportWriter) signature(t *types.Type) {
-	w.paramList(t.Params().FieldSlice())
-	w.paramList(t.Results().FieldSlice())
-	if n := t.Params().NumFields(); n > 0 {
-		w.bool(t.Params().Field(n - 1).IsDDD())
-	}
-}
-
-func (w *exportWriter) typeList(ts []*types.Type) {
-	w.uint64(uint64(len(ts)))
-	for _, rparam := range ts {
-		w.typ(rparam)
-	}
-}
-
-func (w *exportWriter) tparamList(fs []*types.Field) {
-	w.uint64(uint64(len(fs)))
-	for _, f := range fs {
-		if !f.Type.IsTypeParam() {
-			base.Fatalf("unexpected non-typeparam")
-		}
-		w.typ(f.Type)
-	}
-}
-
-func (w *exportWriter) paramList(fs []*types.Field) {
-	w.uint64(uint64(len(fs)))
-	for _, f := range fs {
-		w.param(f)
-	}
-}
-
-func (w *exportWriter) param(f *types.Field) {
-	w.pos(f.Pos)
-	w.localIdent(types.OrigSym(f.Sym))
-	w.typ(f.Type)
-}
-
 func constTypeOf(typ *types.Type) constant.Kind {
 	switch typ {
 	case types.UntypedInt, types.UntypedRune:
@@ -1170,61 +342,6 @@
 	return 0
 }
 
-func (w *exportWriter) value(typ *types.Type, v constant.Value) {
-	w.typ(typ)
-
-	if iexportVersionCurrent >= iexportVersionGo1_18 {
-		w.int64(int64(v.Kind()))
-	}
-
-	var kind constant.Kind
-	var valType *types.Type
-
-	if typ.IsTypeParam() {
-		kind = v.Kind()
-		if iexportVersionCurrent < iexportVersionGo1_18 {
-			// A constant will have a TYPEPARAM type if it appears in a place
-			// where it must match that typeparam type (e.g. in a binary
-			// operation with a variable of that typeparam type). If so, then
-			// we must write out its actual constant kind as well, so its
-			// constant val can be read in properly during import.
-			w.int64(int64(kind))
-		}
-
-		switch kind {
-		case constant.Int:
-			valType = types.Types[types.TINT64]
-		case constant.Float:
-			valType = types.Types[types.TFLOAT64]
-		case constant.Complex:
-			valType = types.Types[types.TCOMPLEX128]
-		}
-	} else {
-		ir.AssertValidTypeForConst(typ, v)
-		kind = constTypeOf(typ)
-		valType = typ
-	}
-
-	// Each type has only one admissible constant representation, so we could
-	// type switch directly on v.Kind() here. However, switching on the type
-	// (in the non-typeparam case) increases symmetry with import logic and
-	// provides a useful consistency check.
-
-	switch kind {
-	case constant.Bool:
-		w.bool(constant.BoolVal(v))
-	case constant.String:
-		w.string(constant.StringVal(v))
-	case constant.Int:
-		w.mpint(v, valType)
-	case constant.Float:
-		w.mpfloat(v, valType)
-	case constant.Complex:
-		w.mpfloat(constant.Real(v), valType)
-		w.mpfloat(constant.Imag(v), valType)
-	}
-}
-
 func intSize(typ *types.Type) (signed bool, maxBytes uint) {
 	if typ.IsUntyped() {
 		return true, ir.ConstPrec / 8
@@ -1250,290 +367,6 @@
 	return
 }
 
-// mpint exports a multi-precision integer.
-//
-// For unsigned types, small values are written out as a single
-// byte. Larger values are written out as a length-prefixed big-endian
-// byte string, where the length prefix is encoded as its complement.
-// For example, bytes 0, 1, and 2 directly represent the integer
-// values 0, 1, and 2; while bytes 255, 254, and 253 indicate a 1-,
-// 2-, and 3-byte big-endian string follow.
-//
-// Encoding for signed types use the same general approach as for
-// unsigned types, except small values use zig-zag encoding and the
-// bottom bit of length prefix byte for large values is reserved as a
-// sign bit.
-//
-// The exact boundary between small and large encodings varies
-// according to the maximum number of bytes needed to encode a value
-// of type typ. As a special case, 8-bit types are always encoded as a
-// single byte.
-func (w *exportWriter) mpint(x constant.Value, typ *types.Type) {
-	signed, maxBytes := intSize(typ)
-
-	negative := constant.Sign(x) < 0
-	if !signed && negative {
-		base.Fatalf("negative unsigned integer; type %v, value %v", typ, x)
-	}
-
-	b := constant.Bytes(x) // little endian
-	for i, j := 0, len(b)-1; i < j; i, j = i+1, j-1 {
-		b[i], b[j] = b[j], b[i]
-	}
-
-	if len(b) > 0 && b[0] == 0 {
-		base.Fatalf("leading zeros")
-	}
-	if uint(len(b)) > maxBytes {
-		base.Fatalf("bad mpint length: %d > %d (type %v, value %v)", len(b), maxBytes, typ, x)
-	}
-
-	maxSmall := 256 - maxBytes
-	if signed {
-		maxSmall = 256 - 2*maxBytes
-	}
-	if maxBytes == 1 {
-		maxSmall = 256
-	}
-
-	// Check if x can use small value encoding.
-	if len(b) <= 1 {
-		var ux uint
-		if len(b) == 1 {
-			ux = uint(b[0])
-		}
-		if signed {
-			ux <<= 1
-			if negative {
-				ux--
-			}
-		}
-		if ux < maxSmall {
-			w.data.WriteByte(byte(ux))
-			return
-		}
-	}
-
-	n := 256 - uint(len(b))
-	if signed {
-		n = 256 - 2*uint(len(b))
-		if negative {
-			n |= 1
-		}
-	}
-	if n < maxSmall || n >= 256 {
-		base.Fatalf("encoding mistake: %d, %v, %v => %d", len(b), signed, negative, n)
-	}
-
-	w.data.WriteByte(byte(n))
-	w.data.Write(b)
-}
-
-// mpfloat exports a multi-precision floating point number.
-//
-// The number's value is decomposed into mantissa × 2**exponent, where
-// mantissa is an integer. The value is written out as mantissa (as a
-// multi-precision integer) and then the exponent, except exponent is
-// omitted if mantissa is zero.
-func (w *exportWriter) mpfloat(v constant.Value, typ *types.Type) {
-	f := ir.BigFloat(v)
-	if f.IsInf() {
-		base.Fatalf("infinite constant")
-	}
-
-	// Break into f = mant × 2**exp, with 0.5 <= mant < 1.
-	var mant big.Float
-	exp := int64(f.MantExp(&mant))
-
-	// Scale so that mant is an integer.
-	prec := mant.MinPrec()
-	mant.SetMantExp(&mant, int(prec))
-	exp -= int64(prec)
-
-	manti, acc := mant.Int(nil)
-	if acc != big.Exact {
-		base.Fatalf("mantissa scaling failed for %f (%s)", f, acc)
-	}
-	w.mpint(constant.Make(manti), typ)
-	if manti.Sign() != 0 {
-		w.int64(exp)
-	}
-}
-
-func (w *exportWriter) mprat(v constant.Value) {
-	r, ok := constant.Val(v).(*big.Rat)
-	if !w.bool(ok) {
-		return
-	}
-	// TODO(mdempsky): Come up with a more efficient binary
-	// encoding before bumping iexportVersion to expose to
-	// gcimporter.
-	w.string(r.String())
-}
-
-func (w *exportWriter) bool(b bool) bool {
-	var x uint64
-	if b {
-		x = 1
-	}
-	w.uint64(x)
-	return b
-}
-
-func (w *exportWriter) int64(x int64)   { w.data.int64(x) }
-func (w *exportWriter) uint64(x uint64) { w.data.uint64(x) }
-func (w *exportWriter) string(s string) { w.uint64(w.p.stringOff(s)) }
-
-// Compiler-specific extensions.
-
-func (w *exportWriter) constExt(n *ir.Name) {
-	// Internally, we now represent untyped float and complex
-	// constants with infinite-precision rational numbers using
-	// go/constant, but the "public" export data format known to
-	// gcimporter only supports 512-bit floating point constants.
-	// In case rationals turn out to be a bad idea and we want to
-	// switch back to fixed-precision constants, for now we
-	// continue writing out the 512-bit truncation in the public
-	// data section, and write the exact, rational constant in the
-	// compiler's extension data. Also, we only need to worry
-	// about exporting rationals for declared constants, because
-	// constants that appear in an expression will already have
-	// been coerced to a concrete, fixed-precision type.
-	//
-	// Eventually, assuming we stick with using rationals, we
-	// should bump iexportVersion to support rationals, and do the
-	// whole gcimporter update song-and-dance.
-	//
-	// TODO(mdempsky): Prepare vocals for that.
-
-	switch n.Type() {
-	case types.UntypedFloat:
-		w.mprat(n.Val())
-	case types.UntypedComplex:
-		v := n.Val()
-		w.mprat(constant.Real(v))
-		w.mprat(constant.Imag(v))
-	}
-}
-
-func (w *exportWriter) varExt(n *ir.Name) {
-	w.linkname(n.Sym())
-	w.symIdx(n.Sym())
-}
-
-func (w *exportWriter) funcExt(n *ir.Name) {
-	w.linkname(n.Sym())
-	w.symIdx(n.Sym())
-
-	// Record definition ABI so cross-ABI calls can be direct.
-	// This is important for the performance of calling some
-	// common functions implemented in assembly (e.g., bytealg).
-	w.uint64(uint64(n.Func.ABI))
-
-	w.uint64(uint64(n.Func.Pragma))
-
-	// Escape analysis.
-	for _, fs := range &types.RecvsParams {
-		for _, f := range fs(n.Type()).FieldSlice() {
-			w.string(f.Note)
-		}
-	}
-
-	// Write out inline body or body of a generic function/method.
-	if n.Type().HasTParam() && n.Func.Body != nil && n.Func.Inl == nil {
-		base.FatalfAt(n.Pos(), "generic function is not marked inlineable")
-	}
-	if n.Func.Inl != nil {
-		w.uint64(1 + uint64(n.Func.Inl.Cost))
-		w.bool(n.Func.Inl.CanDelayResults)
-		if n.Func.ExportInline() || n.Type().HasTParam() {
-			if n.Type().HasTParam() {
-				// If this generic function/method is from another
-				// package, but we didn't use for instantiation in
-				// this package, we may not yet have imported it.
-				ImportedBody(n.Func)
-			}
-			w.p.doInline(n)
-		}
-
-		// Endlineno for inlined function.
-		w.pos(n.Func.Endlineno)
-	} else {
-		w.uint64(0)
-	}
-}
-
-func (w *exportWriter) methExt(m *types.Field) {
-	w.bool(m.Nointerface())
-	w.funcExt(m.Nname.(*ir.Name))
-}
-
-func (w *exportWriter) linkname(s *types.Sym) {
-	w.string(s.Linkname)
-}
-
-func (w *exportWriter) symIdx(s *types.Sym) {
-	lsym := s.Linksym()
-	if lsym.PkgIdx > goobj.PkgIdxSelf || (lsym.PkgIdx == goobj.PkgIdxInvalid && !lsym.Indexed()) || s.Linkname != "" {
-		// Don't export index for non-package symbols, linkname'd symbols,
-		// and symbols without an index. They can only be referenced by
-		// name.
-		w.int64(-1)
-	} else {
-		// For a defined symbol, export its index.
-		// For re-exporting an imported symbol, pass its index through.
-		w.int64(int64(lsym.SymIdx))
-	}
-}
-
-func (w *exportWriter) typeExt(t *types.Type) {
-	// Export whether this type is marked notinheap.
-	w.bool(t.NotInHeap())
-	// For type T, export the index of type descriptor symbols of T and *T.
-	if i, ok := typeSymIdx[t]; ok {
-		w.int64(i[0])
-		w.int64(i[1])
-		return
-	}
-	w.symIdx(types.TypeSym(t))
-	w.symIdx(types.TypeSym(t.PtrTo()))
-}
-
-// Inline bodies.
-
-func (w *exportWriter) writeNames(dcl []*ir.Name) {
-	w.int64(int64(len(dcl)))
-	for i, n := range dcl {
-		w.pos(n.Pos())
-		w.localIdent(n.Sym())
-		w.typ(n.Type())
-		w.dclIndex[n] = w.maxDclIndex + i
-	}
-	w.maxDclIndex += len(dcl)
-}
-
-func (w *exportWriter) funcBody(fn *ir.Func) {
-	//fmt.Printf("Exporting %s\n", fn.Nname.Sym().Name)
-	w.writeNames(fn.Inl.Dcl)
-
-	w.stmtList(fn.Inl.Body)
-}
-
-func (w *exportWriter) stmtList(list []ir.Node) {
-	for _, n := range list {
-		w.node(n)
-	}
-	w.op(ir.OEND)
-}
-
-func (w *exportWriter) node(n ir.Node) {
-	if ir.OpPrec[n.Op()] < 0 {
-		w.stmt(n)
-	} else {
-		w.expr(n)
-	}
-}
-
 func isNonEmptyAssign(n ir.Node) bool {
 	switch n.Op() {
 	case ir.OAS:
@@ -1545,188 +378,11 @@
 	}
 	return false
 }
-
-// Caution: stmt will emit more than one node for statement nodes n that have a
-// non-empty n.Ninit and where n is not a non-empty assignment or a node with a natural init
-// section (such as in "if", "for", etc.).
-func (w *exportWriter) stmt(n ir.Node) {
-	if len(n.Init()) > 0 && !ir.StmtWithInit(n.Op()) && !isNonEmptyAssign(n) && n.Op() != ir.ORANGE {
-		// can't use stmtList here since we don't want the final OEND
-		for _, n := range n.Init() {
-			w.stmt(n)
-		}
-	}
-
-	switch n.Op() {
-	case ir.OBLOCK:
-		// No OBLOCK in export data.
-		// Inline content into this statement list,
-		// like the init list above.
-		// (At the moment neither the parser nor the typechecker
-		// generate OBLOCK nodes except to denote an empty
-		// function body, although that may change.)
-		n := n.(*ir.BlockStmt)
-		for _, n := range n.List {
-			w.stmt(n)
-		}
-
-	case ir.ODCL:
-		n := n.(*ir.Decl)
-		if ir.IsBlank(n.X) {
-			return // blank declarations not useful to importers
-		}
-		w.op(ir.ODCL)
-		w.localName(n.X)
-
-	case ir.OAS:
-		// Don't export "v = <N>" initializing statements, hope they're always
-		// preceded by the DCL which will be re-parsed and typecheck to reproduce
-		// the "v = <N>" again.
-		n := n.(*ir.AssignStmt)
-		if n.Y != nil {
-			w.op(ir.OAS)
-			w.pos(n.Pos())
-			w.stmtList(n.Init())
-			w.expr(n.X)
-			w.expr(n.Y)
-			w.bool(n.Def)
-		}
-
-	case ir.OASOP:
-		n := n.(*ir.AssignOpStmt)
-		w.op(ir.OASOP)
-		w.pos(n.Pos())
-		w.op(n.AsOp)
-		w.expr(n.X)
-		if w.bool(!n.IncDec) {
-			w.expr(n.Y)
-		}
-
-	case ir.OAS2, ir.OAS2DOTTYPE, ir.OAS2FUNC, ir.OAS2MAPR, ir.OAS2RECV:
-		n := n.(*ir.AssignListStmt)
-		w.op(n.Op())
-		w.pos(n.Pos())
-		w.stmtList(n.Init())
-		w.exprList(n.Lhs)
-		w.exprList(n.Rhs)
-		w.bool(n.Def)
-
-	case ir.ORETURN:
-		n := n.(*ir.ReturnStmt)
-		w.op(ir.ORETURN)
-		w.pos(n.Pos())
-		w.exprList(n.Results)
-
-	// case ORETJMP:
-	// 	unreachable - generated by compiler for trampoline routines
-
-	case ir.OGO, ir.ODEFER:
-		n := n.(*ir.GoDeferStmt)
-		w.op(n.Op())
-		w.pos(n.Pos())
-		w.expr(n.Call)
-
-	case ir.OIF:
-		n := n.(*ir.IfStmt)
-		w.op(ir.OIF)
-		w.pos(n.Pos())
-		w.stmtList(n.Init())
-		w.expr(n.Cond)
-		w.stmtList(n.Body)
-		w.stmtList(n.Else)
-
-	case ir.OFOR:
-		n := n.(*ir.ForStmt)
-		w.op(ir.OFOR)
-		w.pos(n.Pos())
-		w.stmtList(n.Init())
-		w.exprsOrNil(n.Cond, n.Post)
-		w.stmtList(n.Body)
-
-	case ir.ORANGE:
-		n := n.(*ir.RangeStmt)
-		w.op(ir.ORANGE)
-		w.pos(n.Pos())
-		w.stmtList(n.Init())
-		w.exprsOrNil(n.Key, n.Value)
-		w.expr(n.X)
-		w.stmtList(n.Body)
-
-	case ir.OSELECT:
-		n := n.(*ir.SelectStmt)
-		w.op(n.Op())
-		w.pos(n.Pos())
-		w.stmtList(n.Init())
-		w.commList(n.Cases)
-
-	case ir.OSWITCH:
-		n := n.(*ir.SwitchStmt)
-		w.op(n.Op())
-		w.pos(n.Pos())
-		w.stmtList(n.Init())
-		w.exprsOrNil(n.Tag, nil)
-		w.caseList(n.Cases, isNamedTypeSwitch(n.Tag))
-
-	// case OCASE:
-	//	handled by caseList
-
-	case ir.OFALL:
-		n := n.(*ir.BranchStmt)
-		w.op(ir.OFALL)
-		w.pos(n.Pos())
-
-	case ir.OBREAK, ir.OCONTINUE, ir.OGOTO, ir.OLABEL:
-		w.op(n.Op())
-		w.pos(n.Pos())
-		label := ""
-		if sym := n.Sym(); sym != nil {
-			label = sym.Name
-		}
-		w.string(label)
-
-	default:
-		base.Fatalf("exporter: CANNOT EXPORT: %v\nPlease notify gri@\n", n.Op())
-	}
-}
-
 func isNamedTypeSwitch(x ir.Node) bool {
 	guard, ok := x.(*ir.TypeSwitchGuard)
 	return ok && guard.Tag != nil
 }
 
-func (w *exportWriter) caseList(cases []*ir.CaseClause, namedTypeSwitch bool) {
-	w.uint64(uint64(len(cases)))
-	for _, cas := range cases {
-		w.pos(cas.Pos())
-		w.stmtList(cas.List)
-		if namedTypeSwitch {
-			w.localName(cas.Var)
-		}
-		w.stmtList(cas.Body)
-	}
-}
-
-func (w *exportWriter) commList(cases []*ir.CommClause) {
-	w.uint64(uint64(len(cases)))
-	for _, cas := range cases {
-		w.pos(cas.Pos())
-		defaultCase := cas.Comm == nil
-		w.bool(defaultCase)
-		if !defaultCase {
-			// Only call w.node for non-default cause (cas.Comm is non-nil)
-			w.node(cas.Comm)
-		}
-		w.stmtList(cas.Body)
-	}
-}
-
-func (w *exportWriter) exprList(list ir.Nodes) {
-	for _, n := range list {
-		w.expr(n)
-	}
-	w.op(ir.OEND)
-}
-
 func simplifyForExport(n ir.Node) ir.Node {
 	switch n.Op() {
 	case ir.OPAREN:
@@ -1736,501 +392,5 @@
 	return n
 }
 
-func (w *exportWriter) expr(n ir.Node) {
-	n = simplifyForExport(n)
-	switch n.Op() {
-	// expressions
-	// (somewhat closely following the structure of exprfmt in fmt.go)
-	case ir.ONIL:
-		n := n.(*ir.NilExpr)
-		// If n is a typeparam, it will have already been checked
-		// for proper use by the types2 typechecker.
-		if !n.Type().IsTypeParam() && !n.Type().HasNil() {
-			base.Fatalf("unexpected type for nil: %v", n.Type())
-		}
-		w.op(ir.ONIL)
-		w.pos(n.Pos())
-		w.typ(n.Type())
-
-	case ir.OLITERAL:
-		w.op(ir.OLITERAL)
-		if ir.HasUniquePos(n) {
-			w.pos(n.Pos())
-		} else {
-			w.pos(src.NoXPos)
-		}
-		w.value(n.Type(), n.Val())
-
-	case ir.ONAME:
-		// Package scope name.
-		n := n.(*ir.Name)
-		if (n.Class == ir.PEXTERN || n.Class == ir.PFUNC) && !ir.IsBlank(n) {
-			w.op(ir.ONONAME)
-			// Indicate that this is not an OKEY entry.
-			w.bool(false)
-			w.qualifiedIdent(n)
-			w.typ(n.Type())
-			break
-		}
-
-		// Function scope name.
-		// We don't need a type here, as the type will be provided at the
-		// declaration of n.
-		w.op(ir.ONAME)
-
-		// This handles the case where we haven't yet transformed a call
-		// to a builtin, so we must write out the builtin as a name in the
-		// builtin package.
-		isBuiltin := n.BuiltinOp != ir.OXXX
-		w.bool(isBuiltin)
-		if isBuiltin {
-			w.bool(n.Sym().Pkg == types.UnsafePkg)
-			w.string(n.Sym().Name)
-			break
-		}
-		w.localName(n)
-
-	case ir.ONONAME:
-		w.op(ir.ONONAME)
-		// This can only be for OKEY nodes in generic functions. Mark it
-		// as a key entry.
-		w.bool(true)
-		s := n.Sym()
-		w.string(s.Name)
-		w.pkg(s.Pkg)
-		w.typ(n.Type())
-
-	// case OPACK:
-	// 	should have been resolved by typechecking - handled by default case
-
-	case ir.OTYPE:
-		w.op(ir.OTYPE)
-		w.typ(n.Type())
-
-	case ir.ODYNAMICTYPE:
-		n := n.(*ir.DynamicType)
-		w.op(ir.ODYNAMICTYPE)
-		w.pos(n.Pos())
-		w.expr(n.RType)
-		if w.bool(n.ITab != nil) {
-			w.expr(n.ITab)
-		}
-		w.typ(n.Type())
-
-	case ir.OTYPESW:
-		n := n.(*ir.TypeSwitchGuard)
-		w.op(ir.OTYPESW)
-		w.pos(n.Pos())
-		var s *types.Sym
-		if n.Tag != nil {
-			if n.Tag.Op() != ir.ONONAME {
-				base.Fatalf("expected ONONAME, got %v", n.Tag)
-			}
-			s = n.Tag.Sym()
-		}
-		w.localIdent(s) // declared pseudo-variable, if any
-		w.expr(n.X)
-
-	// case OTARRAY, OTMAP, OTCHAN, OTSTRUCT, OTINTER, OTFUNC:
-	// 	should have been resolved by typechecking - handled by default case
-
-	case ir.OCLOSURE:
-		n := n.(*ir.ClosureExpr)
-		w.op(ir.OCLOSURE)
-		w.pos(n.Pos())
-		old := w.currPkg
-		w.setPkg(n.Type().Pkg(), true)
-		w.signature(n.Type())
-		w.setPkg(old, true)
-
-		// Write out id for the Outer of each conditional variable. The
-		// conditional variable itself for this closure will be re-created
-		// during import.
-		w.int64(int64(len(n.Func.ClosureVars)))
-		for i, cv := range n.Func.ClosureVars {
-			w.pos(cv.Pos())
-			w.localName(cv.Outer)
-			// Closure variable (which will be re-created during
-			// import) is given via a negative id, starting at -2,
-			// which is used to refer to it later in the function
-			// during export. -1 represents blanks.
-			w.dclIndex[cv] = -(i + 2) - w.maxClosureVarIndex
-		}
-		w.maxClosureVarIndex += len(n.Func.ClosureVars)
-
-		// like w.funcBody(n.Func), but not for .Inl
-		w.writeNames(n.Func.Dcl)
-		w.stmtList(n.Func.Body)
-
-	// case OCOMPLIT:
-	// 	should have been resolved by typechecking - handled by default case
-
-	case ir.OPTRLIT:
-		n := n.(*ir.AddrExpr)
-		w.op(ir.OPTRLIT)
-		w.pos(n.Pos())
-		w.expr(n.X)
-		w.typ(n.Type())
-
-	case ir.OSTRUCTLIT:
-		n := n.(*ir.CompLitExpr)
-		w.op(ir.OSTRUCTLIT)
-		w.pos(n.Pos())
-		w.typ(n.Type())
-		w.fieldList(n.List) // special handling of field names
-
-	case ir.OCOMPLIT, ir.OARRAYLIT, ir.OSLICELIT, ir.OMAPLIT:
-		n := n.(*ir.CompLitExpr)
-		w.op(n.Op())
-		w.pos(n.Pos())
-		w.typ(n.Type())
-		w.exprList(n.List)
-		if n.Op() == ir.OSLICELIT {
-			w.uint64(uint64(n.Len))
-		}
-	case ir.OKEY:
-		n := n.(*ir.KeyExpr)
-		w.op(ir.OKEY)
-		w.pos(n.Pos())
-		w.expr(n.Key)
-		w.expr(n.Value)
-
-	// case OSTRUCTKEY:
-	//	unreachable - handled in case OSTRUCTLIT by elemList
-
-	case ir.OXDOT, ir.ODOT, ir.ODOTPTR, ir.ODOTINTER, ir.ODOTMETH, ir.OMETHVALUE, ir.OMETHEXPR:
-		n := n.(*ir.SelectorExpr)
-		w.op(n.Op())
-		w.pos(n.Pos())
-		w.expr(n.X)
-		w.exoticSelector(n.Sel)
-		w.exoticType(n.Type())
-		if n.Op() == ir.OXDOT {
-			// n.Selection for method references will be
-			// reconstructed during import.
-			w.bool(n.Selection != nil)
-		} else if n.Op() == ir.ODOT || n.Op() == ir.ODOTPTR || n.Op() == ir.ODOTINTER {
-			w.exoticField(n.Selection)
-		}
-		// n.Selection is not required for OMETHEXPR, ODOTMETH, and OMETHVALUE. It will
-		// be reconstructed during import.  n.Selection is computed during
-		// transformDot() for OXDOT.
-
-	case ir.ODOTTYPE, ir.ODOTTYPE2:
-		n := n.(*ir.TypeAssertExpr)
-		w.op(n.Op())
-		w.pos(n.Pos())
-		w.expr(n.X)
-		w.typ(n.Type())
-
-	case ir.ODYNAMICDOTTYPE, ir.ODYNAMICDOTTYPE2:
-		n := n.(*ir.DynamicTypeAssertExpr)
-		w.op(n.Op())
-		w.pos(n.Pos())
-		w.expr(n.X)
-		if w.bool(n.RType != nil) {
-			w.expr(n.RType)
-		}
-		if w.bool(n.ITab != nil) {
-			w.expr(n.ITab)
-		}
-		w.typ(n.Type())
-
-	case ir.OINDEX, ir.OINDEXMAP:
-		n := n.(*ir.IndexExpr)
-		w.op(n.Op())
-		w.pos(n.Pos())
-		w.expr(n.X)
-		w.expr(n.Index)
-		w.exoticType(n.Type())
-		if n.Op() == ir.OINDEXMAP {
-			w.bool(n.Assigned)
-		}
-
-	case ir.OSLICE, ir.OSLICESTR, ir.OSLICEARR:
-		n := n.(*ir.SliceExpr)
-		w.op(n.Op())
-		w.pos(n.Pos())
-		w.expr(n.X)
-		w.exprsOrNil(n.Low, n.High)
-		w.typ(n.Type())
-
-	case ir.OSLICE3, ir.OSLICE3ARR:
-		n := n.(*ir.SliceExpr)
-		w.op(n.Op())
-		w.pos(n.Pos())
-		w.expr(n.X)
-		w.exprsOrNil(n.Low, n.High)
-		w.expr(n.Max)
-		w.typ(n.Type())
-
-	case ir.OCOPY, ir.OCOMPLEX, ir.OUNSAFEADD, ir.OUNSAFESLICE, ir.OUNSAFESTRING:
-		// treated like other builtin calls (see e.g., OREAL)
-		n := n.(*ir.BinaryExpr)
-		w.op(n.Op())
-		w.pos(n.Pos())
-		w.stmtList(n.Init())
-		w.expr(n.X)
-		w.expr(n.Y)
-		w.typ(n.Type())
-
-	case ir.OCONV, ir.OCONVIFACE, ir.OCONVIDATA, ir.OCONVNOP, ir.OBYTES2STR, ir.ORUNES2STR, ir.OSTR2BYTES, ir.OSTR2RUNES, ir.ORUNESTR, ir.OSLICE2ARR, ir.OSLICE2ARRPTR:
-		n := n.(*ir.ConvExpr)
-		w.op(n.Op())
-		w.pos(n.Pos())
-		w.typ(n.Type())
-		w.expr(n.X)
-		w.bool(n.Implicit())
-
-	case ir.OREAL, ir.OIMAG, ir.OCAP, ir.OCLOSE, ir.OLEN, ir.ONEW, ir.OPANIC, ir.OUNSAFESTRINGDATA, ir.OUNSAFESLICEDATA:
-		n := n.(*ir.UnaryExpr)
-		w.op(n.Op())
-		w.pos(n.Pos())
-		w.expr(n.X)
-		if n.Op() != ir.OPANIC {
-			w.typ(n.Type())
-		}
-
-	case ir.OAPPEND, ir.ODELETE, ir.ORECOVER, ir.OPRINT, ir.OPRINTN:
-		n := n.(*ir.CallExpr)
-		w.op(n.Op())
-		w.pos(n.Pos())
-		w.stmtList(n.Init())
-		w.exprList(n.Args) // emits terminating OEND
-		// only append() calls may contain '...' arguments
-		if n.Op() == ir.OAPPEND {
-			w.bool(n.IsDDD)
-		} else if n.IsDDD {
-			base.Fatalf("exporter: unexpected '...' with %v call", n.Op())
-		}
-		if n.Op() != ir.ODELETE && n.Op() != ir.OPRINT && n.Op() != ir.OPRINTN {
-			w.typ(n.Type())
-		}
-
-	case ir.OCALL, ir.OCALLFUNC, ir.OCALLMETH, ir.OCALLINTER, ir.OGETG:
-		n := n.(*ir.CallExpr)
-		w.op(n.Op())
-		w.pos(n.Pos())
-		w.stmtList(n.Init())
-		w.expr(n.X)
-		w.exprList(n.Args)
-		w.bool(n.IsDDD)
-		w.exoticType(n.Type())
-
-	case ir.OMAKEMAP, ir.OMAKECHAN, ir.OMAKESLICE:
-		n := n.(*ir.MakeExpr)
-		w.op(n.Op()) // must keep separate from OMAKE for importer
-		w.pos(n.Pos())
-		w.typ(n.Type())
-		switch {
-		default:
-			// empty list
-			w.op(ir.OEND)
-		case n.Cap != nil:
-			w.expr(n.Len)
-			w.expr(n.Cap)
-			w.op(ir.OEND)
-		case n.Len != nil && (n.Op() == ir.OMAKESLICE || !n.Len.Type().IsUntyped()):
-			// Note: the extra conditional exists because make(T) for
-			// T a map or chan type, gets an untyped zero added as
-			// an argument. Don't serialize that argument here.
-			w.expr(n.Len)
-			w.op(ir.OEND)
-		case n.Len != nil:
-			w.expr(n.Len)
-			w.op(ir.OEND)
-		}
-
-	case ir.OLINKSYMOFFSET:
-		n := n.(*ir.LinksymOffsetExpr)
-		w.op(ir.OLINKSYMOFFSET)
-		w.pos(n.Pos())
-		w.string(n.Linksym.Name)
-		w.uint64(uint64(n.Offset_))
-		w.typ(n.Type())
-
-	// unary expressions
-	case ir.OPLUS, ir.ONEG, ir.OBITNOT, ir.ONOT, ir.ORECV, ir.OIDATA:
-		n := n.(*ir.UnaryExpr)
-		w.op(n.Op())
-		w.pos(n.Pos())
-		w.expr(n.X)
-		w.typ(n.Type())
-
-	case ir.OADDR:
-		n := n.(*ir.AddrExpr)
-		w.op(n.Op())
-		w.pos(n.Pos())
-		w.expr(n.X)
-		w.typ(n.Type())
-
-	case ir.ODEREF:
-		n := n.(*ir.StarExpr)
-		w.op(n.Op())
-		w.pos(n.Pos())
-		w.expr(n.X)
-		w.typ(n.Type())
-
-	case ir.OSEND:
-		n := n.(*ir.SendStmt)
-		w.op(n.Op())
-		w.pos(n.Pos())
-		w.expr(n.Chan)
-		w.expr(n.Value)
-
-	// binary expressions
-	case ir.OADD, ir.OAND, ir.OANDNOT, ir.ODIV, ir.OEQ, ir.OGE, ir.OGT, ir.OLE, ir.OLT,
-		ir.OLSH, ir.OMOD, ir.OMUL, ir.ONE, ir.OOR, ir.ORSH, ir.OSUB, ir.OXOR, ir.OEFACE:
-		n := n.(*ir.BinaryExpr)
-		w.op(n.Op())
-		w.pos(n.Pos())
-		w.expr(n.X)
-		w.expr(n.Y)
-		w.typ(n.Type())
-
-	case ir.OANDAND, ir.OOROR:
-		n := n.(*ir.LogicalExpr)
-		w.op(n.Op())
-		w.pos(n.Pos())
-		w.expr(n.X)
-		w.expr(n.Y)
-		w.typ(n.Type())
-
-	case ir.OADDSTR:
-		n := n.(*ir.AddStringExpr)
-		w.op(ir.OADDSTR)
-		w.pos(n.Pos())
-		w.exprList(n.List)
-		w.typ(n.Type())
-
-	case ir.ODCLCONST:
-		// if exporting, DCLCONST should just be removed as its usage
-		// has already been replaced with literals
-
-	case ir.OFUNCINST:
-		n := n.(*ir.InstExpr)
-		w.op(ir.OFUNCINST)
-		w.pos(n.Pos())
-		w.expr(n.X)
-		w.uint64(uint64(len(n.Targs)))
-		for _, targ := range n.Targs {
-			w.typ(targ.Type())
-		}
-		w.typ(n.Type())
-
-	case ir.OSELRECV2:
-		n := n.(*ir.AssignListStmt)
-		w.op(ir.OSELRECV2)
-		w.pos(n.Pos())
-		w.stmtList(n.Init())
-		w.exprList(n.Lhs)
-		w.exprList(n.Rhs)
-		w.bool(n.Def)
-
-	default:
-		base.Fatalf("cannot export %v (%d) node\n"+
-			"\t==> please file an issue and assign to gri@", n.Op(), int(n.Op()))
-	}
-}
-
-func (w *exportWriter) op(op ir.Op) {
-	if debug {
-		w.uint64(magic)
-	}
-	w.uint64(uint64(op))
-}
-
-func (w *exportWriter) exprsOrNil(a, b ir.Node) {
-	ab := 0
-	if a != nil {
-		ab |= 1
-	}
-	if b != nil {
-		ab |= 2
-	}
-	w.uint64(uint64(ab))
-	if ab&1 != 0 {
-		w.expr(a)
-	}
-	if ab&2 != 0 {
-		w.node(b)
-	}
-}
-
-func (w *exportWriter) fieldList(list ir.Nodes) {
-	w.uint64(uint64(len(list)))
-	for _, n := range list {
-		n := n.(*ir.StructKeyExpr)
-		w.pos(n.Pos())
-		w.exoticField(n.Field)
-		w.expr(n.Value)
-	}
-}
-
-func (w *exportWriter) localName(n *ir.Name) {
-	if ir.IsBlank(n) {
-		w.int64(-1)
-		return
-	}
-
-	i, ok := w.dclIndex[n]
-	if !ok {
-		base.FatalfAt(n.Pos(), "missing from dclIndex: %+v", n)
-	}
-	w.int64(int64(i))
-}
-
-func (w *exportWriter) localIdent(s *types.Sym) {
-	if w.currPkg == nil {
-		base.Fatalf("missing currPkg")
-	}
-
-	// Anonymous parameters.
-	if s == nil {
-		w.string("")
-		return
-	}
-
-	name := s.Name
-	if name == "_" {
-		w.string("_")
-		return
-	}
-
-	// The name of autotmp variables isn't important; they just need to
-	// be unique. To stabilize the export data, simply write out "$" as
-	// a marker and let the importer generate its own unique name.
-	if strings.HasPrefix(name, ".autotmp_") {
-		w.string("$autotmp")
-		return
-	}
-
-	if i := strings.LastIndex(name, "."); i >= 0 && !strings.HasPrefix(name, LocalDictName) && !strings.HasPrefix(name, ".rcvr") {
-		base.Fatalf("unexpected dot in identifier: %v", name)
-	}
-
-	if s.Pkg != w.currPkg {
-		base.Fatalf("weird package in name: %v => %v from %q, not %q", s, name, s.Pkg.Path, w.currPkg.Path)
-	}
-
-	w.string(name)
-}
-
-type intWriter struct {
-	bytes.Buffer
-}
-
-func (w *intWriter) int64(x int64) {
-	var buf [binary.MaxVarintLen64]byte
-	n := binary.PutVarint(buf[:], x)
-	w.Write(buf[:n])
-}
-
-func (w *intWriter) uint64(x uint64) {
-	var buf [binary.MaxVarintLen64]byte
-	n := binary.PutUvarint(buf[:], x)
-	w.Write(buf[:n])
-}
-
 // The name used for dictionary parameters or local variables.
 const LocalDictName = ".dict"
diff --git a/src/cmd/compile/internal/typecheck/iimport.go b/src/cmd/compile/internal/typecheck/iimport.go
index c55b409..cb3feb1 100644
--- a/src/cmd/compile/internal/typecheck/iimport.go
+++ b/src/cmd/compile/internal/typecheck/iimport.go
@@ -8,1024 +8,21 @@
 package typecheck
 
 import (
-	"encoding/binary"
-	"fmt"
-	"go/constant"
-	"io"
-	"math/big"
-	"strings"
-
 	"cmd/compile/internal/base"
 	"cmd/compile/internal/ir"
 	"cmd/compile/internal/types"
-	"cmd/internal/obj"
-	"cmd/internal/src"
 )
 
-// An iimporterAndOffset identifies an importer and an offset within
-// its data section.
-type iimporterAndOffset struct {
-	p   *iimporter
-	off uint64
-}
-
-var (
-	// DeclImporter maps from imported identifiers to an importer
-	// and offset where that identifier's declaration can be read.
-	DeclImporter = map[*types.Sym]iimporterAndOffset{}
-
-	// inlineImporter is like DeclImporter, but for inline bodies
-	// for function and method symbols.
-	inlineImporter = map[*types.Sym]iimporterAndOffset{}
-)
-
-// expandDecl returns immediately if n is already a Name node. Otherwise, n should
-// be an Ident node, and expandDecl reads in the definition of the specified
-// identifier from the appropriate package.
-func expandDecl(n ir.Node) ir.Node {
-	if n, ok := n.(*ir.Name); ok {
-		return n
-	}
-
-	id := n.(*ir.Ident)
-	if n := id.Sym().PkgDef(); n != nil {
-		return n.(*ir.Name)
-	}
-
-	r := importReaderFor(id.Sym(), DeclImporter)
-	if r == nil {
-		// Can happen if user tries to reference an undeclared name.
-		return n
-	}
-
-	return r.doDecl(n.Sym())
-}
-
-// ImportBody reads in the dcls and body of an imported function (which should not
-// yet have been read in).
-func ImportBody(fn *ir.Func) {
-	if fn.Inl.Body != nil {
-		base.Fatalf("%v already has inline body", fn)
-	}
-
-	r := importReaderFor(fn.Nname.Sym(), inlineImporter)
-	if r == nil {
-		base.Fatalf("missing import reader for %v", fn)
-	}
-
-	if inimport {
-		base.Fatalf("recursive inimport")
-	}
-	inimport = true
-	r.doInline(fn)
-	inimport = false
-}
-
 // HaveInlineBody reports whether we have fn's inline body available
 // for inlining.
 //
 // It's a function literal so that it can be overridden for
 // GOEXPERIMENT=unified.
 var HaveInlineBody = func(fn *ir.Func) bool {
-	if fn.Inl == nil {
-		return false
-	}
-
-	if fn.Inl.Body != nil {
-		return true
-	}
-
-	_, ok := inlineImporter[fn.Nname.Sym()]
-	return ok
-}
-
-func importReaderFor(sym *types.Sym, importers map[*types.Sym]iimporterAndOffset) *importReader {
-	x, ok := importers[sym]
-	if !ok {
-		return nil
-	}
-
-	return x.p.newReader(x.off, sym.Pkg)
-}
-
-type intReader struct {
-	*strings.Reader
-	pkg *types.Pkg
-}
-
-func (r *intReader) int64() int64 {
-	i, err := binary.ReadVarint(r.Reader)
-	if err != nil {
-		base.Errorf("import %q: read error: %v", r.pkg.Path, err)
-		base.ErrorExit()
-	}
-	return i
-}
-
-func (r *intReader) uint64() uint64 {
-	i, err := binary.ReadUvarint(r.Reader)
-	if err != nil {
-		base.Errorf("import %q: read error: %v", r.pkg.Path, err)
-		base.ErrorExit()
-	}
-	return i
-}
-
-func ReadImports(pkg *types.Pkg, data string) {
-	ird := &intReader{strings.NewReader(data), pkg}
-
-	version := ird.uint64()
-	switch version {
-	case iexportVersionGo1_18, iexportVersionPosCol, iexportVersionGo1_11:
-	default:
-		base.Errorf("import %q: unknown export format version %d", pkg.Path, version)
-		base.ErrorExit()
-	}
-
-	sLen := int64(ird.uint64())
-	dLen := int64(ird.uint64())
-
-	whence, _ := ird.Seek(0, io.SeekCurrent)
-	stringData := data[whence : whence+sLen]
-	declData := data[whence+sLen : whence+sLen+dLen]
-	ird.Seek(sLen+dLen, io.SeekCurrent)
-
-	p := &iimporter{
-		exportVersion: version,
-		ipkg:          pkg,
-
-		pkgCache:     map[uint64]*types.Pkg{},
-		posBaseCache: map[uint64]*src.PosBase{},
-		typCache:     map[uint64]*types.Type{},
-
-		stringData: stringData,
-		declData:   declData,
-	}
-
-	for i, pt := range predeclared() {
-		p.typCache[uint64(i)] = pt
-	}
-
-	// Declaration index.
-	for nPkgs := ird.uint64(); nPkgs > 0; nPkgs-- {
-		pkg := p.pkgAt(ird.uint64())
-		pkgName := p.stringAt(ird.uint64())
-		_ = int(ird.uint64()) // was package height, but not necessary anymore.
-		if pkg.Name == "" {
-			pkg.Name = pkgName
-			types.NumImport[pkgName]++
-
-			// TODO(mdempsky): This belongs somewhere else.
-			pkg.Lookup("_").Def = ir.BlankNode
-		} else {
-			if pkg.Name != pkgName {
-				base.Fatalf("conflicting package names %v and %v for path %q", pkg.Name, pkgName, pkg.Path)
-			}
-		}
-
-		for nSyms := ird.uint64(); nSyms > 0; nSyms-- {
-			s := pkg.Lookup(p.stringAt(ird.uint64()))
-			off := ird.uint64()
-
-			if _, ok := DeclImporter[s]; !ok {
-				DeclImporter[s] = iimporterAndOffset{p, off}
-			}
-		}
-	}
-
-	// Inline body index.
-	for nPkgs := ird.uint64(); nPkgs > 0; nPkgs-- {
-		pkg := p.pkgAt(ird.uint64())
-
-		for nSyms := ird.uint64(); nSyms > 0; nSyms-- {
-			s := pkg.Lookup(p.stringAt(ird.uint64()))
-			off := ird.uint64()
-
-			if _, ok := inlineImporter[s]; !ok {
-				inlineImporter[s] = iimporterAndOffset{p, off}
-			}
-		}
-	}
-}
-
-type iimporter struct {
-	exportVersion uint64
-	ipkg          *types.Pkg
-
-	pkgCache     map[uint64]*types.Pkg
-	posBaseCache map[uint64]*src.PosBase
-	typCache     map[uint64]*types.Type
-
-	stringData string
-	declData   string
-}
-
-func (p *iimporter) stringAt(off uint64) string {
-	var x [binary.MaxVarintLen64]byte
-	n := copy(x[:], p.stringData[off:])
-
-	slen, n := binary.Uvarint(x[:n])
-	if n <= 0 {
-		base.Fatalf("varint failed")
-	}
-	spos := off + uint64(n)
-	return p.stringData[spos : spos+slen]
-}
-
-func (p *iimporter) posBaseAt(off uint64) *src.PosBase {
-	if posBase, ok := p.posBaseCache[off]; ok {
-		return posBase
-	}
-
-	file := p.stringAt(off)
-	posBase := src.NewFileBase(file, file)
-	p.posBaseCache[off] = posBase
-	return posBase
-}
-
-func (p *iimporter) pkgAt(off uint64) *types.Pkg {
-	if pkg, ok := p.pkgCache[off]; ok {
-		return pkg
-	}
-
-	pkg := p.ipkg
-	if pkgPath := p.stringAt(off); pkgPath != "" {
-		pkg = types.NewPkg(pkgPath, "")
-	}
-	p.pkgCache[off] = pkg
-	return pkg
-}
-
-// An importReader keeps state for reading an individual imported
-// object (declaration or inline body).
-type importReader struct {
-	strings.Reader
-	p *iimporter
-
-	currPkg    *types.Pkg
-	prevBase   *src.PosBase
-	prevLine   int64
-	prevColumn int64
-
-	// curfn is the current function we're importing into.
-	curfn *ir.Func
-	// Slice of all dcls for function, including any interior closures
-	allDcls        []*ir.Name
-	allClosureVars []*ir.Name
-	autotmpgen     int
-}
-
-func (p *iimporter) newReader(off uint64, pkg *types.Pkg) *importReader {
-	r := &importReader{
-		p:       p,
-		currPkg: pkg,
-	}
-	r.Reader.Reset(p.declData[off:])
-	return r
-}
-
-func (r *importReader) string() string        { return r.p.stringAt(r.uint64()) }
-func (r *importReader) posBase() *src.PosBase { return r.p.posBaseAt(r.uint64()) }
-func (r *importReader) pkg() *types.Pkg       { return r.p.pkgAt(r.uint64()) }
-
-func (r *importReader) setPkg() {
-	r.currPkg = r.pkg()
-}
-
-func (r *importReader) doDecl(sym *types.Sym) *ir.Name {
-	tag := r.byte()
-	pos := r.pos()
-
-	switch tag {
-	case 'A':
-		typ := r.typ()
-
-		return importalias(pos, sym, typ)
-
-	case 'C':
-		typ := r.typ()
-		val := r.value(typ)
-
-		n := importconst(pos, sym, typ, val)
-		r.constExt(n)
-		return n
-
-	case 'F', 'G':
-		var tparams []*types.Field
-		if tag == 'G' {
-			tparams = r.tparamList()
-		}
-		typ := r.signature(nil, tparams)
-
-		n := importfunc(pos, sym, typ)
-		r.funcExt(n)
-		return n
-
-	case 'T', 'U':
-		// Types can be recursive. We need to setup a stub
-		// declaration before recursing.
-		n := importtype(pos, sym)
-		t := n.Type()
-
-		// Because of recursion, we need to defer width calculations and
-		// instantiations on intermediate types until the top-level type is
-		// fully constructed. Note that we can have recursion via type
-		// constraints.
-		types.DeferCheckSize()
-		deferDoInst()
-		if tag == 'U' {
-			rparams := r.typeList()
-			t.SetRParams(rparams)
-		}
-
-		underlying := r.typ()
-		t.SetUnderlying(underlying)
-
-		if underlying.IsInterface() {
-			// Finish up all type instantiations and CheckSize calls
-			// now that a top-level type is fully constructed.
-			resumeDoInst()
-			types.ResumeCheckSize()
-			r.typeExt(t)
-			return n
-		}
-
-		ms := make([]*types.Field, r.uint64())
-		for i := range ms {
-			mpos := r.pos()
-			msym := r.selector()
-			recv := r.param()
-			mtyp := r.signature(recv, nil)
-
-			// MethodSym already marked m.Sym as a function.
-			m := ir.NewNameAt(mpos, ir.MethodSym(recv.Type, msym))
-			m.Class = ir.PFUNC
-			m.SetType(mtyp)
-
-			m.Func = ir.NewFunc(mpos)
-			m.Func.Nname = m
-
-			f := types.NewField(mpos, msym, mtyp)
-			f.Nname = m
-			ms[i] = f
-		}
-		t.Methods().Set(ms)
-
-		// Finish up all instantiations and CheckSize calls now
-		// that a top-level type is fully constructed.
-		resumeDoInst()
-		types.ResumeCheckSize()
-
-		r.typeExt(t)
-		for _, m := range ms {
-			r.methExt(m)
-		}
-		return n
-
-	case 'P':
-		if r.p.exportVersion < iexportVersionGenerics {
-			base.Fatalf("unexpected type param type")
-		}
-		if sym.Def != nil {
-			// Make sure we use the same type param type for the same
-			// name, whether it is created during types1-import or
-			// this types2-to-types1 translation.
-			return sym.Def.(*ir.Name)
-		}
-		n := importsym(pos, sym, ir.OTYPE, ir.PTYPEPARAM)
-		// The typeparam index is set at the point where the containing type
-		// param list is imported.
-		t := types.NewTypeParam(n, 0)
-		n.SetType(t)
-		implicit := false
-		if r.p.exportVersion >= iexportVersionGo1_18 {
-			implicit = r.bool()
-		}
-		bound := r.typ()
-		if implicit {
-			bound.MarkImplicit()
-		}
-		t.SetBound(bound)
-		return n
-
-	case 'V':
-		typ := r.typ()
-
-		n := importvar(pos, sym, typ)
-		r.varExt(n)
-		return n
-
-	default:
-		base.Fatalf("unexpected tag: %v", tag)
-		panic("unreachable")
-	}
-}
-
-func (r *importReader) value(typ *types.Type) constant.Value {
-	var kind constant.Kind
-	var valType *types.Type
-
-	if r.p.exportVersion >= iexportVersionGo1_18 {
-		// TODO: add support for using the kind in the non-typeparam case.
-		kind = constant.Kind(r.int64())
-	}
-
-	if typ.IsTypeParam() {
-		if r.p.exportVersion < iexportVersionGo1_18 {
-			// If a constant had a typeparam type, then we wrote out its
-			// actual constant kind as well.
-			kind = constant.Kind(r.int64())
-		}
-		switch kind {
-		case constant.Int:
-			valType = types.Types[types.TINT64]
-		case constant.Float:
-			valType = types.Types[types.TFLOAT64]
-		case constant.Complex:
-			valType = types.Types[types.TCOMPLEX128]
-		}
-	} else {
-		kind = constTypeOf(typ)
-		valType = typ
-	}
-
-	switch kind {
-	case constant.Bool:
-		return constant.MakeBool(r.bool())
-	case constant.String:
-		return constant.MakeString(r.string())
-	case constant.Int:
-		var i big.Int
-		r.mpint(&i, valType)
-		return constant.Make(&i)
-	case constant.Float:
-		return r.float(valType)
-	case constant.Complex:
-		return makeComplex(r.float(valType), r.float(valType))
-	}
-
-	base.Fatalf("unexpected value type: %v", typ)
+	base.Fatalf("HaveInlineBody not overridden")
 	panic("unreachable")
 }
 
-func (r *importReader) mpint(x *big.Int, typ *types.Type) {
-	signed, maxBytes := intSize(typ)
-
-	maxSmall := 256 - maxBytes
-	if signed {
-		maxSmall = 256 - 2*maxBytes
-	}
-	if maxBytes == 1 {
-		maxSmall = 256
-	}
-
-	n, _ := r.ReadByte()
-	if uint(n) < maxSmall {
-		v := int64(n)
-		if signed {
-			v >>= 1
-			if n&1 != 0 {
-				v = ^v
-			}
-		}
-		x.SetInt64(v)
-		return
-	}
-
-	v := -n
-	if signed {
-		v = -(n &^ 1) >> 1
-	}
-	if v < 1 || uint(v) > maxBytes {
-		base.Fatalf("weird decoding: %v, %v => %v", n, signed, v)
-	}
-	b := make([]byte, v)
-	r.Read(b)
-	x.SetBytes(b)
-	if signed && n&1 != 0 {
-		x.Neg(x)
-	}
-}
-
-func (r *importReader) float(typ *types.Type) constant.Value {
-	var mant big.Int
-	r.mpint(&mant, typ)
-	var f big.Float
-	f.SetInt(&mant)
-	if f.Sign() != 0 {
-		f.SetMantExp(&f, int(r.int64()))
-	}
-	return constant.Make(&f)
-}
-
-func (r *importReader) mprat(orig constant.Value) constant.Value {
-	if !r.bool() {
-		return orig
-	}
-	var rat big.Rat
-	rat.SetString(r.string())
-	return constant.Make(&rat)
-}
-
-func (r *importReader) ident(selector bool) *types.Sym {
-	name := r.string()
-	if name == "" {
-		return nil
-	}
-	pkg := r.currPkg
-	if selector {
-		if types.IsExported(name) {
-			pkg = types.LocalPkg
-		}
-	} else {
-		if name == "$autotmp" {
-			name = autotmpname(r.autotmpgen)
-			r.autotmpgen++
-		}
-	}
-	return pkg.Lookup(name)
-}
-
-func (r *importReader) localIdent() *types.Sym { return r.ident(false) }
-func (r *importReader) selector() *types.Sym   { return r.ident(true) }
-
-func (r *importReader) qualifiedIdent() *ir.Ident {
-	name := r.string()
-	pkg := r.pkg()
-	sym := pkg.Lookup(name)
-	return ir.NewIdent(src.NoXPos, sym)
-}
-
-func (r *importReader) pos() src.XPos {
-	delta := r.int64()
-	r.prevColumn += delta >> 1
-	if delta&1 != 0 {
-		delta = r.int64()
-		r.prevLine += delta >> 1
-		if delta&1 != 0 {
-			r.prevBase = r.posBase()
-		}
-	}
-
-	if (r.prevBase == nil || r.prevBase.AbsFilename() == "") && r.prevLine == 0 && r.prevColumn == 0 {
-		// TODO(mdempsky): Remove once we reliably write
-		// position information for all nodes.
-		return src.NoXPos
-	}
-
-	if r.prevBase == nil {
-		base.Fatalf("missing posbase")
-	}
-	pos := src.MakePos(r.prevBase, uint(r.prevLine), uint(r.prevColumn))
-	return base.Ctxt.PosTable.XPos(pos)
-}
-
-func (r *importReader) typ() *types.Type {
-	// If this is a top-level type call, defer type instantiations until the
-	// type is fully constructed.
-	types.DeferCheckSize()
-	deferDoInst()
-	t := r.p.typAt(r.uint64())
-	resumeDoInst()
-	types.ResumeCheckSize()
-	return t
-}
-
-func (r *importReader) exoticType() *types.Type {
-	switch r.uint64() {
-	case exoticTypeNil:
-		return nil
-	case exoticTypeTuple:
-		funarg := types.Funarg(r.uint64())
-		n := r.uint64()
-		fs := make([]*types.Field, n)
-		for i := range fs {
-			pos := r.pos()
-			var sym *types.Sym
-			switch r.uint64() {
-			case exoticTypeSymNil:
-				sym = nil
-			case exoticTypeSymNoPkg:
-				sym = types.NoPkg.Lookup(r.string())
-			case exoticTypeSymWithPkg:
-				pkg := r.pkg()
-				sym = pkg.Lookup(r.string())
-			default:
-				base.Fatalf("unknown symbol kind")
-			}
-			typ := r.typ()
-			f := types.NewField(pos, sym, typ)
-			fs[i] = f
-		}
-		t := types.NewStruct(types.NoPkg, fs)
-		t.StructType().Funarg = funarg
-		return t
-	case exoticTypeRecv:
-		var rcvr *types.Field
-		if r.bool() { // isFakeRecv
-			rcvr = types.FakeRecv()
-		} else {
-			rcvr = r.exoticParam()
-		}
-		return r.exoticSignature(rcvr)
-	case exoticTypeRegular:
-		return r.typ()
-	default:
-		base.Fatalf("bad kind of call type")
-		return nil
-	}
-}
-
-func (r *importReader) exoticSelector() *types.Sym {
-	name := r.string()
-	if name == "" {
-		return nil
-	}
-	pkg := r.currPkg
-	if types.IsExported(name) {
-		pkg = types.LocalPkg
-	}
-	if r.uint64() != 0 {
-		pkg = r.pkg()
-	}
-	return pkg.Lookup(name)
-}
-
-func (r *importReader) exoticSignature(recv *types.Field) *types.Type {
-	var pkg *types.Pkg
-	if r.bool() { // hasPkg
-		pkg = r.pkg()
-	}
-	params := r.exoticParamList()
-	results := r.exoticParamList()
-	return types.NewSignature(pkg, recv, nil, params, results)
-}
-
-func (r *importReader) exoticParamList() []*types.Field {
-	n := r.uint64()
-	fs := make([]*types.Field, n)
-	for i := range fs {
-		fs[i] = r.exoticParam()
-	}
-	return fs
-}
-
-func (r *importReader) exoticParam() *types.Field {
-	pos := r.pos()
-	sym := r.exoticSym()
-	off := r.uint64()
-	typ := r.exoticType()
-	ddd := r.bool()
-	f := types.NewField(pos, sym, typ)
-	f.Offset = int64(off)
-	if sym != nil {
-		f.Nname = ir.NewNameAt(pos, sym)
-	}
-	f.SetIsDDD(ddd)
-	return f
-}
-
-func (r *importReader) exoticField() *types.Field {
-	pos := r.pos()
-	sym := r.exoticSym()
-	off := r.uint64()
-	typ := r.exoticType()
-	note := r.string()
-	f := types.NewField(pos, sym, typ)
-	f.Offset = int64(off)
-	if sym != nil {
-		f.Nname = ir.NewNameAt(pos, sym)
-	}
-	f.Note = note
-	return f
-}
-
-func (r *importReader) exoticSym() *types.Sym {
-	name := r.string()
-	if name == "" {
-		return nil
-	}
-	var pkg *types.Pkg
-	if types.IsExported(name) {
-		pkg = types.LocalPkg
-	} else {
-		pkg = r.pkg()
-	}
-	return pkg.Lookup(name)
-}
-
-func (p *iimporter) typAt(off uint64) *types.Type {
-	t, ok := p.typCache[off]
-	if !ok {
-		if off < predeclReserved {
-			base.Fatalf("predeclared type missing from cache: %d", off)
-		}
-		t = p.newReader(off-predeclReserved, nil).typ1()
-		// Ensure size is calculated for imported types. Since CL 283313, the compiler
-		// does not compile the function immediately when it sees them. Instead, functions
-		// are pushed to compile queue, then draining from the queue for compiling.
-		// During this process, the size calculation is disabled, so it is not safe for
-		// calculating size during SSA generation anymore. See issue #44732.
-		//
-		// No need to calc sizes for re-instantiated generic types, and
-		// they are not necessarily resolved until the top-level type is
-		// defined (because of recursive types).
-		if t.OrigType() == nil || !t.HasTParam() {
-			types.CheckSize(t)
-		}
-		p.typCache[off] = t
-	}
-	return t
-}
-
-func (r *importReader) typ1() *types.Type {
-	switch k := r.kind(); k {
-	default:
-		base.Fatalf("unexpected kind tag in %q: %v", r.p.ipkg.Path, k)
-		return nil
-
-	case definedType:
-		// We might be called from within doInline, in which
-		// case Sym.Def can point to declared parameters
-		// instead of the top-level types. Also, we don't
-		// support inlining functions with local defined
-		// types. Therefore, this must be a package-scope
-		// type.
-		n := expandDecl(r.qualifiedIdent())
-		if n.Op() != ir.OTYPE {
-			base.Fatalf("expected OTYPE, got %v: %v, %v", n.Op(), n.Sym(), n)
-		}
-		return n.Type()
-	case pointerType:
-		return types.NewPtr(r.typ())
-	case sliceType:
-		return types.NewSlice(r.typ())
-	case arrayType:
-		n := r.uint64()
-		return types.NewArray(r.typ(), int64(n))
-	case chanType:
-		dir := types.ChanDir(r.uint64())
-		return types.NewChan(r.typ(), dir)
-	case mapType:
-		return types.NewMap(r.typ(), r.typ())
-
-	case signatureType:
-		r.setPkg()
-		return r.signature(nil, nil)
-
-	case structType:
-		r.setPkg()
-
-		fs := make([]*types.Field, r.uint64())
-		for i := range fs {
-			pos := r.pos()
-			sym := r.selector()
-			typ := r.typ()
-			emb := r.bool()
-			note := r.string()
-
-			f := types.NewField(pos, sym, typ)
-			if emb {
-				f.Embedded = 1
-			}
-			f.Note = note
-			fs[i] = f
-		}
-
-		return types.NewStruct(r.currPkg, fs)
-
-	case interfaceType:
-		r.setPkg()
-
-		embeddeds := make([]*types.Field, r.uint64())
-		for i := range embeddeds {
-			pos := r.pos()
-			typ := r.typ()
-
-			embeddeds[i] = types.NewField(pos, nil, typ)
-		}
-
-		methods := make([]*types.Field, r.uint64())
-		for i := range methods {
-			pos := r.pos()
-			sym := r.selector()
-			typ := r.signature(types.FakeRecv(), nil)
-
-			methods[i] = types.NewField(pos, sym, typ)
-		}
-
-		if len(embeddeds)+len(methods) == 0 {
-			return types.Types[types.TINTER]
-		}
-
-		t := types.NewInterface(r.currPkg, append(embeddeds, methods...), false)
-
-		// Ensure we expand the interface in the frontend (#25055).
-		types.CheckSize(t)
-		return t
-
-	case typeParamType:
-		if r.p.exportVersion < iexportVersionGenerics {
-			base.Fatalf("unexpected type param type")
-		}
-		// Similar to code for defined types, since we "declared"
-		// typeparams to deal with recursion (typeparam is used within its
-		// own type bound).
-		ident := r.qualifiedIdent()
-		if ident.Sym().Def != nil {
-			return ident.Sym().Def.(*ir.Name).Type()
-		}
-		n := expandDecl(ident)
-		if n.Op() != ir.OTYPE {
-			base.Fatalf("expected OTYPE, got %v: %v, %v", n.Op(), n.Sym(), n)
-		}
-		return n.Type()
-
-	case instanceType:
-		if r.p.exportVersion < iexportVersionGenerics {
-			base.Fatalf("unexpected instantiation type")
-		}
-		pos := r.pos()
-		len := r.uint64()
-		targs := make([]*types.Type, len)
-		for i := range targs {
-			targs[i] = r.typ()
-		}
-		baseType := r.typ()
-		t := Instantiate(pos, baseType, targs)
-		return t
-
-	case unionType:
-		if r.p.exportVersion < iexportVersionGenerics {
-			base.Fatalf("unexpected instantiation type")
-		}
-		nt := int(r.uint64())
-		terms := make([]*types.Type, nt)
-		tildes := make([]bool, nt)
-		for i := range terms {
-			tildes[i] = r.bool()
-			terms[i] = r.typ()
-		}
-		return types.NewUnion(terms, tildes)
-	}
-}
-
-func (r *importReader) kind() itag {
-	return itag(r.uint64())
-}
-
-func (r *importReader) signature(recv *types.Field, tparams []*types.Field) *types.Type {
-	params := r.paramList()
-	results := r.paramList()
-	if n := len(params); n > 0 {
-		params[n-1].SetIsDDD(r.bool())
-	}
-	return types.NewSignature(r.currPkg, recv, tparams, params, results)
-}
-
-func (r *importReader) typeList() []*types.Type {
-	n := r.uint64()
-	if n == 0 {
-		return nil
-	}
-	ts := make([]*types.Type, n)
-	for i := range ts {
-		ts[i] = r.typ()
-		if ts[i].IsTypeParam() {
-			ts[i].SetIndex(i)
-		}
-	}
-	return ts
-}
-
-func (r *importReader) tparamList() []*types.Field {
-	n := r.uint64()
-	if n == 0 {
-		return nil
-	}
-	fs := make([]*types.Field, n)
-	for i := range fs {
-		typ := r.typ()
-		typ.SetIndex(i)
-		fs[i] = types.NewField(typ.Pos(), typ.Sym(), typ)
-	}
-	return fs
-}
-
-func (r *importReader) paramList() []*types.Field {
-	fs := make([]*types.Field, r.uint64())
-	for i := range fs {
-		fs[i] = r.param()
-	}
-	return fs
-}
-
-func (r *importReader) param() *types.Field {
-	return types.NewField(r.pos(), r.localIdent(), r.typ())
-}
-
-func (r *importReader) bool() bool {
-	return r.uint64() != 0
-}
-
-func (r *importReader) int64() int64 {
-	n, err := binary.ReadVarint(r)
-	if err != nil {
-		base.Fatalf("readVarint: %v", err)
-	}
-	return n
-}
-
-func (r *importReader) uint64() uint64 {
-	n, err := binary.ReadUvarint(r)
-	if err != nil {
-		base.Fatalf("readVarint: %v", err)
-	}
-	return n
-}
-
-func (r *importReader) byte() byte {
-	x, err := r.ReadByte()
-	if err != nil {
-		base.Fatalf("declReader.ReadByte: %v", err)
-	}
-	return x
-}
-
-// Compiler-specific extensions.
-
-func (r *importReader) constExt(n *ir.Name) {
-	switch n.Type() {
-	case types.UntypedFloat:
-		n.SetVal(r.mprat(n.Val()))
-	case types.UntypedComplex:
-		v := n.Val()
-		re := r.mprat(constant.Real(v))
-		im := r.mprat(constant.Imag(v))
-		n.SetVal(makeComplex(re, im))
-	}
-}
-
-func (r *importReader) varExt(n *ir.Name) {
-	r.linkname(n.Sym())
-	r.symIdx(n.Sym())
-}
-
-func (r *importReader) funcExt(n *ir.Name) {
-	r.linkname(n.Sym())
-	r.symIdx(n.Sym())
-
-	n.Func.ABI = obj.ABI(r.uint64())
-
-	// Make sure //go:noinline pragma is imported (so stenciled functions have
-	// same noinline status as the corresponding generic function.)
-	n.Func.Pragma = ir.PragmaFlag(r.uint64())
-
-	// Escape analysis.
-	for _, fs := range &types.RecvsParams {
-		for _, f := range fs(n.Type()).FieldSlice() {
-			f.Note = r.string()
-		}
-	}
-
-	// Inline body.
-	if u := r.uint64(); u > 0 {
-		n.Func.Inl = &ir.Inline{
-			Cost:            int32(u - 1),
-			CanDelayResults: r.bool(),
-		}
-		n.Func.Endlineno = r.pos()
-	}
-}
-
-func (r *importReader) methExt(m *types.Field) {
-	if r.bool() {
-		m.SetNointerface(true)
-	}
-	r.funcExt(m.Nname.(*ir.Name))
-}
-
-func (r *importReader) linkname(s *types.Sym) {
-	s.Linkname = r.string()
-}
-
-func (r *importReader) symIdx(s *types.Sym) {
-	lsym := s.Linksym()
-	idx := int32(r.int64())
-	if idx != -1 {
-		if s.Linkname != "" {
-			base.Fatalf("bad index for linknamed symbol: %v %d\n", lsym, idx)
-		}
-		lsym.SymIdx = idx
-		lsym.Set(obj.AttrIndexed, true)
-	}
-}
-
-func (r *importReader) typeExt(t *types.Type) {
-	t.SetNotInHeap(r.bool())
-	SetBaseTypeIndex(t, r.int64(), r.int64())
-}
-
 func SetBaseTypeIndex(t *types.Type, i, pi int64) {
 	if t.Obj() == nil {
 		base.Fatalf("SetBaseTypeIndex on non-defined type %v", t)
@@ -1054,848 +51,3 @@
 	}
 	return i[0]
 }
-
-func (r *importReader) doInline(fn *ir.Func) {
-	if len(fn.Inl.Body) != 0 {
-		base.Fatalf("%v already has inline body", fn)
-	}
-
-	//fmt.Printf("Importing %s\n", fn.Nname.Sym().Name)
-	r.funcBody(fn)
-
-	importlist = append(importlist, fn)
-
-	if base.Flag.E > 0 && base.Flag.LowerM > 2 {
-		if base.Flag.LowerM > 3 {
-			fmt.Printf("inl body for %v %v: %+v\n", fn, fn.Type(), ir.Nodes(fn.Inl.Body))
-		} else {
-			fmt.Printf("inl body for %v %v: %v\n", fn, fn.Type(), ir.Nodes(fn.Inl.Body))
-		}
-	}
-}
-
-// ----------------------------------------------------------------------------
-// Inlined function bodies
-
-// Approach: Read nodes and use them to create/declare the same data structures
-// as done originally by the (hidden) parser by closely following the parser's
-// original code. In other words, "parsing" the import data (which happens to
-// be encoded in binary rather textual form) is the best way at the moment to
-// re-establish the syntax tree's invariants. At some future point we might be
-// able to avoid this round-about way and create the rewritten nodes directly,
-// possibly avoiding a lot of duplicate work (name resolution, type checking).
-//
-// Refined nodes (e.g., ODOTPTR as a refinement of OXDOT) are exported as their
-// unrefined nodes (since this is what the importer uses). The respective case
-// entries are unreachable in the importer.
-
-func (r *importReader) funcBody(fn *ir.Func) {
-	outerfn := r.curfn
-	r.curfn = fn
-
-	// Import local declarations.
-	fn.Inl.Dcl = r.readFuncDcls(fn)
-
-	// Import function body.
-	body := r.stmtList()
-	if body == nil {
-		// Make sure empty body is not interpreted as
-		// no inlineable body (see also parser.fnbody)
-		// (not doing so can cause significant performance
-		// degradation due to unnecessary calls to empty
-		// functions).
-		body = []ir.Node{}
-	}
-	ir.VisitList(body, func(n ir.Node) {
-		n.SetTypecheck(1)
-	})
-	fn.Inl.Body = body
-
-	r.curfn = outerfn
-	if base.Flag.W >= 3 {
-		fmt.Printf("Imported for %v", fn)
-		ir.DumpList("", fn.Inl.Body)
-	}
-}
-
-func (r *importReader) readNames(fn *ir.Func) []*ir.Name {
-	dcls := make([]*ir.Name, r.int64())
-	for i := range dcls {
-		n := ir.NewDeclNameAt(r.pos(), ir.ONAME, r.localIdent())
-		n.Class = ir.PAUTO // overwritten below for parameters/results
-		n.Curfn = fn
-		n.SetType(r.typ())
-		dcls[i] = n
-	}
-	r.allDcls = append(r.allDcls, dcls...)
-	return dcls
-}
-
-func (r *importReader) readFuncDcls(fn *ir.Func) []*ir.Name {
-	dcls := r.readNames(fn)
-
-	// Fixup parameter classes and associate with their
-	// signature's type fields.
-	i := 0
-	fix := func(f *types.Field, class ir.Class) {
-		if class == ir.PPARAM && (f.Sym == nil || f.Sym.Name == "_") {
-			return
-		}
-		n := dcls[i]
-		n.Class = class
-		f.Nname = n
-		i++
-	}
-
-	typ := fn.Type()
-	if recv := typ.Recv(); recv != nil {
-		fix(recv, ir.PPARAM)
-	}
-	for _, f := range typ.Params().FieldSlice() {
-		fix(f, ir.PPARAM)
-	}
-	for _, f := range typ.Results().FieldSlice() {
-		fix(f, ir.PPARAMOUT)
-	}
-	return dcls
-}
-
-func (r *importReader) localName() *ir.Name {
-	i := r.int64()
-	if i == -1 {
-		return ir.BlankNode.(*ir.Name)
-	}
-	if i < 0 {
-		return r.allClosureVars[-i-2]
-	}
-	return r.allDcls[i]
-}
-
-func (r *importReader) stmtList() []ir.Node {
-	var list []ir.Node
-	for {
-		n := r.node()
-		if n == nil {
-			break
-		}
-		// OBLOCK nodes are not written to the import data directly,
-		// but the handling of ODCL calls liststmt, which creates one.
-		// Inline them into the statement list.
-		if n.Op() == ir.OBLOCK {
-			n := n.(*ir.BlockStmt)
-			list = append(list, n.List...)
-			continue
-		}
-		if len(list) > 0 {
-			// check for an optional label that can only immediately
-			// precede a for/range/select/switch statement.
-			if last := list[len(list)-1]; last.Op() == ir.OLABEL {
-				label := last.(*ir.LabelStmt).Label
-				switch n.Op() {
-				case ir.OFOR:
-					n.(*ir.ForStmt).Label = label
-				case ir.ORANGE:
-					n.(*ir.RangeStmt).Label = label
-				case ir.OSELECT:
-					n.(*ir.SelectStmt).Label = label
-				case ir.OSWITCH:
-					n.(*ir.SwitchStmt).Label = label
-				}
-			}
-		}
-		list = append(list, n)
-	}
-	return list
-}
-
-func (r *importReader) caseList(switchExpr ir.Node) []*ir.CaseClause {
-	namedTypeSwitch := isNamedTypeSwitch(switchExpr)
-
-	cases := make([]*ir.CaseClause, r.uint64())
-	for i := range cases {
-		cas := ir.NewCaseStmt(r.pos(), nil, nil)
-		cas.List = r.stmtList()
-		if namedTypeSwitch {
-			cas.Var = r.localName()
-			cas.Var.Defn = switchExpr
-		}
-		cas.Body = r.stmtList()
-		cases[i] = cas
-	}
-	return cases
-}
-
-func (r *importReader) commList() []*ir.CommClause {
-	cases := make([]*ir.CommClause, r.uint64())
-	for i := range cases {
-		pos := r.pos()
-		defaultCase := r.bool()
-		var comm ir.Node
-		if !defaultCase {
-			comm = r.node()
-		}
-		cases[i] = ir.NewCommStmt(pos, comm, r.stmtList())
-	}
-	return cases
-}
-
-func (r *importReader) exprList() []ir.Node {
-	var list []ir.Node
-	for {
-		n := r.expr()
-		if n == nil {
-			break
-		}
-		list = append(list, n)
-	}
-	return list
-}
-
-func (r *importReader) expr() ir.Node {
-	n := r.node()
-	if n != nil && n.Op() == ir.OBLOCK {
-		n := n.(*ir.BlockStmt)
-		base.Fatalf("unexpected block node: %v", n)
-	}
-	return n
-}
-
-// TODO(gri) split into expr and stmt
-func (r *importReader) node() ir.Node {
-	op := r.op()
-	switch op {
-	// expressions
-	// case OPAREN:
-	// 	unreachable - unpacked by exporter
-
-	case ir.ONIL:
-		pos := r.pos()
-		typ := r.typ()
-
-		n := ir.NewNilExpr(pos)
-		n.SetType(typ)
-		return n
-
-	case ir.OLITERAL:
-		pos := r.pos()
-		typ := r.typ()
-
-		n := ir.NewBasicLit(pos, r.value(typ))
-		n.SetType(typ)
-		return n
-
-	case ir.ONONAME:
-		isKey := r.bool()
-		var n ir.Node = r.qualifiedIdent()
-		// Key ONONAME entries should not be resolved - they should
-		// stay as identifiers.
-		if !isKey {
-			n = Resolve(n)
-		}
-		typ := r.typ()
-		if n.Type() == nil {
-			n.SetType(typ)
-		}
-		return n
-
-	case ir.ONAME:
-		isBuiltin := r.bool()
-		if isBuiltin {
-			pkg := types.BuiltinPkg
-			if r.bool() {
-				pkg = types.UnsafePkg
-			}
-			return pkg.Lookup(r.string()).Def.(*ir.Name)
-		}
-		return r.localName()
-
-	// case OPACK, ONONAME:
-	// 	unreachable - should have been resolved by typechecking
-
-	case ir.OTYPE:
-		return ir.TypeNode(r.typ())
-
-	case ir.ODYNAMICTYPE:
-		n := ir.NewDynamicType(r.pos(), r.expr())
-		if r.bool() {
-			n.ITab = r.expr()
-		}
-		n.SetType(r.typ())
-		return n
-
-	case ir.OTYPESW:
-		pos := r.pos()
-		var tag *ir.Ident
-		if s := r.localIdent(); s != nil {
-			tag = ir.NewIdent(pos, s)
-		}
-		return ir.NewTypeSwitchGuard(pos, tag, r.expr())
-
-	// case OTARRAY, OTMAP, OTCHAN, OTSTRUCT, OTINTER, OTFUNC:
-	//      unreachable - should have been resolved by typechecking
-
-	case ir.OCLOSURE:
-		//println("Importing CLOSURE")
-		pos := r.pos()
-		r.setPkg()
-		typ := r.signature(nil, nil)
-		r.setPkg()
-
-		// All the remaining code below is similar to (*noder).funcLit(), but
-		// with Dcls and ClosureVars lists already set up
-		fn := ir.NewClosureFunc(pos, true)
-		fn.Nname.SetType(typ)
-
-		cvars := make([]*ir.Name, r.int64())
-		for i := range cvars {
-			cvars[i] = ir.CaptureName(r.pos(), fn, r.localName().Canonical())
-			if cvars[i].Defn == nil {
-				base.Fatalf("bad import of closure variable")
-			}
-		}
-		fn.ClosureVars = cvars
-		r.allClosureVars = append(r.allClosureVars, cvars...)
-
-		fn.Inl = &ir.Inline{}
-		// Read in the Dcls and Body of the closure after temporarily
-		// setting r.curfn to fn.
-		r.funcBody(fn)
-		fn.Dcl = fn.Inl.Dcl
-		fn.Body = fn.Inl.Body
-		if len(fn.Body) == 0 {
-			// An empty closure must be represented as a single empty
-			// block statement, else it will be dropped.
-			fn.Body = []ir.Node{ir.NewBlockStmt(src.NoXPos, nil)}
-		}
-		fn.Inl = nil
-
-		ir.FinishCaptureNames(pos, r.curfn, fn)
-
-		clo := fn.OClosure
-		clo.SetType(typ)
-		return clo
-
-	case ir.OSTRUCTLIT:
-		pos := r.pos()
-		typ := r.typ()
-		list := r.fieldList()
-		return ir.NewCompLitExpr(pos, ir.OSTRUCTLIT, typ, list)
-
-	case ir.OCOMPLIT:
-		pos := r.pos()
-		t := r.typ()
-		return ir.NewCompLitExpr(pos, ir.OCOMPLIT, t, r.exprList())
-
-	case ir.OARRAYLIT, ir.OSLICELIT, ir.OMAPLIT:
-		pos := r.pos()
-		typ := r.typ()
-		list := r.exprList()
-		n := ir.NewCompLitExpr(pos, op, typ, list)
-		if op == ir.OSLICELIT {
-			n.Len = int64(r.uint64())
-		}
-		return n
-
-	case ir.OKEY:
-		return ir.NewKeyExpr(r.pos(), r.expr(), r.expr())
-
-	// case OSTRUCTKEY:
-	//	unreachable - handled in case OSTRUCTLIT by elemList
-
-	case ir.OXDOT, ir.ODOT, ir.ODOTPTR, ir.ODOTINTER, ir.ODOTMETH, ir.OMETHVALUE, ir.OMETHEXPR:
-		pos := r.pos()
-		expr := r.expr()
-		sel := r.exoticSelector()
-		n := ir.NewSelectorExpr(pos, op, expr, sel)
-		n.SetType(r.exoticType())
-		switch op {
-		case ir.OXDOT:
-			hasSelection := r.bool()
-			// We reconstruct n.Selection for method calls on
-			// generic types and method calls due to type param
-			// bounds.  Otherwise, n.Selection is nil.
-			if hasSelection {
-				n1 := ir.NewSelectorExpr(pos, op, expr, sel)
-				AddImplicitDots(n1)
-				var m *types.Field
-				if n1.X.Type().IsTypeParam() {
-					genType := n1.X.Type().Bound()
-					m = Lookdot1(n1, sel, genType, genType.AllMethods(), 1)
-				} else {
-					genType := types.ReceiverBaseType(n1.X.Type())
-					if genType.IsInstantiatedGeneric() {
-						genType = genType.OrigType()
-					}
-					m = Lookdot1(n1, sel, genType, genType.Methods(), 1)
-				}
-				assert(m != nil)
-				n.Selection = m
-			}
-		case ir.ODOT, ir.ODOTPTR, ir.ODOTINTER:
-			n.Selection = r.exoticField()
-		case ir.OMETHEXPR:
-			n = typecheckMethodExpr(n).(*ir.SelectorExpr)
-		case ir.ODOTMETH, ir.OMETHVALUE:
-			// These require a Lookup to link to the correct declaration.
-			rcvrType := expr.Type()
-			typ := n.Type()
-			n.Selection = Lookdot(n, rcvrType, 1)
-			if op == ir.OMETHVALUE {
-				// Lookdot clobbers the opcode and type, undo that.
-				n.SetOp(op)
-				n.SetType(typ)
-			}
-		}
-		return n
-
-	case ir.ODOTTYPE, ir.ODOTTYPE2:
-		n := ir.NewTypeAssertExpr(r.pos(), r.expr(), r.typ())
-		n.SetOp(op)
-		return n
-
-	case ir.ODYNAMICDOTTYPE, ir.ODYNAMICDOTTYPE2:
-		n := ir.NewDynamicTypeAssertExpr(r.pos(), op, r.expr(), nil)
-		if r.bool() {
-			n.RType = r.expr()
-		}
-		if r.bool() {
-			n.ITab = r.expr()
-		}
-		n.SetType(r.typ())
-		return n
-
-	case ir.OINDEX, ir.OINDEXMAP:
-		n := ir.NewIndexExpr(r.pos(), r.expr(), r.expr())
-		n.SetOp(op)
-		n.SetType(r.exoticType())
-		if op == ir.OINDEXMAP {
-			n.Assigned = r.bool()
-		}
-		return n
-
-	case ir.OSLICE, ir.OSLICESTR, ir.OSLICEARR, ir.OSLICE3, ir.OSLICE3ARR:
-		pos, x := r.pos(), r.expr()
-		low, high := r.exprsOrNil()
-		var max ir.Node
-		if op.IsSlice3() {
-			max = r.expr()
-		}
-		n := ir.NewSliceExpr(pos, op, x, low, high, max)
-		n.SetType(r.typ())
-		return n
-
-	case ir.OCONV, ir.OCONVIFACE, ir.OCONVIDATA, ir.OCONVNOP, ir.OBYTES2STR, ir.ORUNES2STR, ir.OSTR2BYTES, ir.OSTR2RUNES, ir.ORUNESTR, ir.OSLICE2ARR, ir.OSLICE2ARRPTR:
-		n := ir.NewConvExpr(r.pos(), op, r.typ(), r.expr())
-		n.SetImplicit(r.bool())
-		return n
-
-	case ir.OCOPY, ir.OCOMPLEX, ir.OREAL, ir.OIMAG, ir.OAPPEND, ir.OCAP, ir.OCLOSE, ir.ODELETE, ir.OLEN, ir.OMAKE,
-		ir.ONEW, ir.OPANIC, ir.ORECOVER, ir.OPRINT, ir.OPRINTN,
-		ir.OUNSAFEADD, ir.OUNSAFESLICE, ir.OUNSAFESLICEDATA, ir.OUNSAFESTRING, ir.OUNSAFESTRINGDATA:
-		pos := r.pos()
-		switch op {
-		case ir.OCOPY, ir.OCOMPLEX, ir.OUNSAFEADD, ir.OUNSAFESLICE, ir.OUNSAFESTRING:
-			init := r.stmtList()
-			n := ir.NewBinaryExpr(pos, op, r.expr(), r.expr())
-			n.SetInit(init)
-			n.SetType(r.typ())
-			return n
-		case ir.OREAL, ir.OIMAG, ir.OCAP, ir.OCLOSE, ir.OLEN, ir.ONEW, ir.OPANIC, ir.OUNSAFESTRINGDATA, ir.OUNSAFESLICEDATA:
-			n := ir.NewUnaryExpr(pos, op, r.expr())
-			if op != ir.OPANIC {
-				n.SetType(r.typ())
-			}
-			return n
-		case ir.OAPPEND, ir.ODELETE, ir.ORECOVER, ir.OPRINT, ir.OPRINTN:
-			init := r.stmtList()
-			n := ir.NewCallExpr(pos, op, nil, r.exprList())
-			n.SetInit(init)
-			if op == ir.OAPPEND {
-				n.IsDDD = r.bool()
-			}
-			if op == ir.OAPPEND || op == ir.ORECOVER {
-				n.SetType(r.typ())
-			}
-			return n
-		}
-		// ir.OMAKE
-		goto error
-
-	case ir.OCALL, ir.OCALLFUNC, ir.OCALLMETH, ir.OCALLINTER, ir.OGETG:
-		pos := r.pos()
-		init := r.stmtList()
-		n := ir.NewCallExpr(pos, ir.OCALL, r.expr(), r.exprList())
-		n.SetOp(op)
-		n.SetInit(init)
-		n.IsDDD = r.bool()
-		n.SetType(r.exoticType())
-		return n
-
-	case ir.OMAKEMAP, ir.OMAKECHAN, ir.OMAKESLICE:
-		pos := r.pos()
-		typ := r.typ()
-		list := r.exprList()
-		var len_, cap_ ir.Node
-		if len(list) > 0 {
-			len_ = list[0]
-		}
-		if len(list) > 1 {
-			cap_ = list[1]
-		}
-		n := ir.NewMakeExpr(pos, op, len_, cap_)
-		n.SetType(typ)
-		return n
-
-	case ir.OLINKSYMOFFSET:
-		pos := r.pos()
-		name := r.string()
-		off := r.uint64()
-		typ := r.typ()
-		return ir.NewLinksymOffsetExpr(pos, Lookup(name).Linksym(), int64(off), typ)
-
-	// unary expressions
-	case ir.OPLUS, ir.ONEG, ir.OBITNOT, ir.ONOT, ir.ORECV, ir.OIDATA:
-		n := ir.NewUnaryExpr(r.pos(), op, r.expr())
-		n.SetType(r.typ())
-		return n
-
-	case ir.OADDR, ir.OPTRLIT:
-		pos := r.pos()
-		expr := r.expr()
-		expr.SetTypecheck(1) // we do this for all nodes after importing, but do it now so markAddrOf can see it.
-		n := NodAddrAt(pos, expr)
-		n.SetOp(op)
-		n.SetType(r.typ())
-		return n
-
-	case ir.ODEREF:
-		n := ir.NewStarExpr(r.pos(), r.expr())
-		n.SetType(r.typ())
-		return n
-
-	// binary expressions
-	case ir.OADD, ir.OAND, ir.OANDNOT, ir.ODIV, ir.OEQ, ir.OGE, ir.OGT, ir.OLE, ir.OLT,
-		ir.OLSH, ir.OMOD, ir.OMUL, ir.ONE, ir.OOR, ir.ORSH, ir.OSUB, ir.OXOR, ir.OEFACE:
-		n := ir.NewBinaryExpr(r.pos(), op, r.expr(), r.expr())
-		n.SetType(r.typ())
-		return n
-
-	case ir.OANDAND, ir.OOROR:
-		n := ir.NewLogicalExpr(r.pos(), op, r.expr(), r.expr())
-		n.SetType(r.typ())
-		return n
-
-	case ir.OSEND:
-		return ir.NewSendStmt(r.pos(), r.expr(), r.expr())
-
-	case ir.OADDSTR:
-		pos := r.pos()
-		list := r.exprList()
-		n := ir.NewAddStringExpr(pos, list)
-		n.SetType(r.typ())
-		return n
-
-	// --------------------------------------------------------------------
-	// statements
-	case ir.ODCL:
-		var stmts ir.Nodes
-		n := r.localName()
-		stmts.Append(ir.NewDecl(n.Pos(), ir.ODCL, n))
-		stmts.Append(ir.NewAssignStmt(n.Pos(), n, nil))
-		return ir.NewBlockStmt(n.Pos(), stmts)
-
-	// case OASWB:
-	// 	unreachable - never exported
-
-	case ir.OAS:
-		pos := r.pos()
-		init := r.stmtList()
-		n := ir.NewAssignStmt(pos, r.expr(), r.expr())
-		n.SetInit(init)
-		n.Def = r.bool()
-		return n
-
-	case ir.OASOP:
-		n := ir.NewAssignOpStmt(r.pos(), r.op(), r.expr(), nil)
-		if !r.bool() {
-			n.Y = ir.NewInt(1)
-			n.IncDec = true
-		} else {
-			n.Y = r.expr()
-		}
-		return n
-
-	case ir.OAS2, ir.OAS2DOTTYPE, ir.OAS2FUNC, ir.OAS2MAPR, ir.OAS2RECV:
-		pos := r.pos()
-		init := r.stmtList()
-		n := ir.NewAssignListStmt(pos, op, r.exprList(), r.exprList())
-		n.SetInit(init)
-		n.Def = r.bool()
-		return n
-
-	case ir.ORETURN:
-		return ir.NewReturnStmt(r.pos(), r.exprList())
-
-	// case ORETJMP:
-	// 	unreachable - generated by compiler for trampolin routines (not exported)
-
-	case ir.OGO, ir.ODEFER:
-		return ir.NewGoDeferStmt(r.pos(), op, r.expr())
-
-	case ir.OIF:
-		pos, init := r.pos(), r.stmtList()
-		n := ir.NewIfStmt(pos, r.expr(), r.stmtList(), r.stmtList())
-		n.SetInit(init)
-		return n
-
-	case ir.OFOR:
-		pos, init := r.pos(), r.stmtList()
-		cond, post := r.exprsOrNil()
-		n := ir.NewForStmt(pos, nil, cond, post, r.stmtList())
-		n.SetInit(init)
-		return n
-
-	case ir.ORANGE:
-		pos, init := r.pos(), r.stmtList()
-		k, v := r.exprsOrNil()
-		n := ir.NewRangeStmt(pos, k, v, r.expr(), r.stmtList())
-		n.SetInit(init)
-		return n
-
-	case ir.OSELECT:
-		pos := r.pos()
-		init := r.stmtList()
-		n := ir.NewSelectStmt(pos, r.commList())
-		n.SetInit(init)
-		return n
-
-	case ir.OSWITCH:
-		pos := r.pos()
-		init := r.stmtList()
-		x, _ := r.exprsOrNil()
-		n := ir.NewSwitchStmt(pos, x, r.caseList(x))
-		n.SetInit(init)
-		return n
-
-	// case OCASE:
-	//	handled by caseList
-
-	case ir.OFALL:
-		return ir.NewBranchStmt(r.pos(), ir.OFALL, nil)
-
-	// case OEMPTY:
-	// 	unreachable - not emitted by exporter
-
-	case ir.OBREAK, ir.OCONTINUE, ir.OGOTO:
-		pos := r.pos()
-		var sym *types.Sym
-		if label := r.string(); label != "" {
-			sym = Lookup(label)
-		}
-		return ir.NewBranchStmt(pos, op, sym)
-
-	case ir.OLABEL:
-		return ir.NewLabelStmt(r.pos(), Lookup(r.string()))
-
-	case ir.OEND:
-		return nil
-
-	case ir.OFUNCINST:
-		pos := r.pos()
-		x := r.expr()
-		targs := make([]ir.Ntype, r.uint64())
-		for i := range targs {
-			targs[i] = ir.TypeNode(r.typ())
-		}
-		n := ir.NewInstExpr(pos, ir.OFUNCINST, x, targs)
-		n.SetType(r.typ())
-		return n
-
-	case ir.OSELRECV2:
-		pos := r.pos()
-		init := r.stmtList()
-		n := ir.NewAssignListStmt(pos, ir.OSELRECV2, r.exprList(), r.exprList())
-		n.SetInit(init)
-		n.Def = r.bool()
-		return n
-
-	default:
-		base.Fatalf("cannot import %v (%d) node\n"+
-			"\t==> please file an issue and assign to gri@", op, int(op))
-		panic("unreachable") // satisfy compiler
-	}
-error:
-	base.Fatalf("cannot import %v (%d) node\n"+
-		"\t==> please file an issue and assign to khr@", op, int(op))
-	panic("unreachable") // satisfy compiler
-}
-
-func (r *importReader) op() ir.Op {
-	if debug && r.uint64() != magic {
-		base.Fatalf("import stream has desynchronized")
-	}
-	return ir.Op(r.uint64())
-}
-
-func (r *importReader) fieldList() []ir.Node {
-	list := make([]ir.Node, r.uint64())
-	for i := range list {
-		list[i] = ir.NewStructKeyExpr(r.pos(), r.exoticField(), r.expr())
-	}
-	return list
-}
-
-func (r *importReader) exprsOrNil() (a, b ir.Node) {
-	ab := r.uint64()
-	if ab&1 != 0 {
-		a = r.expr()
-	}
-	if ab&2 != 0 {
-		b = r.node()
-	}
-	return
-}
-
-// NewIncompleteNamedType returns a TFORW type t with name specified by sym, such
-// that t.nod and sym.Def are set correctly. If there are any RParams for the type,
-// they should be set soon after creating the TFORW type, before creating the
-// underlying type. That ensures that the HasTParam and HasShape flags will be set
-// properly, in case this type is part of some mutually recursive type.
-func NewIncompleteNamedType(pos src.XPos, sym *types.Sym) *types.Type {
-	name := ir.NewDeclNameAt(pos, ir.OTYPE, sym)
-	forw := types.NewNamed(name)
-	name.SetType(forw)
-	sym.Def = name
-	return forw
-}
-
-// Instantiate creates a new named type which is the instantiation of the base
-// named generic type, with the specified type args.
-func Instantiate(pos src.XPos, baseType *types.Type, targs []*types.Type) *types.Type {
-	baseSym := baseType.Sym()
-	if strings.Index(baseSym.Name, "[") >= 0 {
-		base.Fatalf("arg to Instantiate is not a base generic type")
-	}
-	name := InstTypeName(baseSym.Name, targs)
-	instSym := baseSym.Pkg.Lookup(name)
-	if instSym.Def != nil {
-		// May match existing type from previous import or
-		// types2-to-types1 conversion.
-		t := instSym.Def.Type()
-		if t.Kind() != types.TFORW {
-			return t
-		}
-		// Or, we have started creating this type in (*TSubster).Typ, but its
-		// underlying type was not completed yet, so we need to add this type
-		// to deferredInstStack, if not already there.
-		found := false
-		for _, t2 := range deferredInstStack {
-			if t2 == t {
-				found = true
-				break
-			}
-		}
-		if !found {
-			deferredInstStack = append(deferredInstStack, t)
-		}
-		return t
-	}
-
-	t := NewIncompleteNamedType(baseType.Pos(), instSym)
-	t.SetRParams(targs)
-	t.SetOrigType(baseType)
-
-	// baseType may still be TFORW or its methods may not be fully filled in
-	// (since we are in the middle of importing it). So, delay call to
-	// substInstType until we get back up to the top of the current top-most
-	// type import.
-	deferredInstStack = append(deferredInstStack, t)
-
-	return t
-}
-
-var deferredInstStack []*types.Type
-var deferInst int
-
-// deferDoInst defers substitution on instantiated types until we are at the
-// top-most defined type, so the base types are fully defined.
-func deferDoInst() {
-	deferInst++
-}
-
-func resumeDoInst() {
-	if deferInst == 1 {
-		for len(deferredInstStack) > 0 {
-			t := deferredInstStack[0]
-			deferredInstStack = deferredInstStack[1:]
-			substInstType(t, t.OrigType(), t.RParams())
-		}
-	}
-	deferInst--
-}
-
-// doInst creates a new instantiation type (which will be added to
-// deferredInstStack for completion later) for an incomplete type encountered
-// during a type substitution for an instantiation. This is needed for
-// instantiations of mutually recursive types.
-func doInst(t *types.Type) *types.Type {
-	assert(t.Kind() == types.TFORW)
-	return Instantiate(t.Pos(), t.OrigType(), t.RParams())
-}
-
-// substInstType completes the instantiation of a generic type by doing a
-// substitution on the underlying type itself and any methods. t is the
-// instantiation being created, baseType is the base generic type, and targs are
-// the type arguments that baseType is being instantiated with.
-func substInstType(t *types.Type, baseType *types.Type, targs []*types.Type) {
-	assert(t.Kind() == types.TFORW)
-	subst := Tsubster{
-		Tparams:       baseType.RParams(),
-		Targs:         targs,
-		SubstForwFunc: doInst,
-	}
-	t.SetUnderlying(subst.Typ(baseType.Underlying()))
-
-	newfields := make([]*types.Field, baseType.Methods().Len())
-	for i, f := range baseType.Methods().Slice() {
-		if !f.IsMethod() || types.IsInterfaceMethod(f.Type) {
-			// Do a normal substitution if this is a non-method (which
-			// means this must be an interface used as a constraint) or
-			// an interface method.
-			t2 := subst.Typ(f.Type)
-			newfields[i] = types.NewField(f.Pos, f.Sym, t2)
-			continue
-		}
-		recvType := f.Type.Recv().Type
-		if recvType.IsPtr() {
-			recvType = recvType.Elem()
-		}
-		// Substitute in the method using the type params used in the
-		// method (not the type params in the definition of the generic type).
-		msubst := Tsubster{
-			Tparams:       recvType.RParams(),
-			Targs:         targs,
-			SubstForwFunc: doInst,
-		}
-		t2 := msubst.Typ(f.Type)
-		oldsym := f.Nname.Sym()
-		newsym := MakeFuncInstSym(oldsym, targs, true, true)
-		var nname *ir.Name
-		if newsym.Def != nil {
-			nname = newsym.Def.(*ir.Name)
-		} else {
-			nname = ir.NewNameAt(f.Pos, newsym)
-			nname.SetType(t2)
-			ir.MarkFunc(nname)
-			newsym.Def = nname
-		}
-		newfields[i] = types.NewField(f.Pos, f.Sym, t2)
-		newfields[i].Nname = nname
-	}
-	t.Methods().Set(newfields)
-	if !t.HasTParam() && !t.HasShape() && t.Kind() != types.TINTER && t.Methods().Len() > 0 {
-		// Generate all the methods for a new fully-instantiated,
-		// non-interface, non-shape type.
-		NeedInstType(t)
-	}
-}
diff --git a/src/cmd/compile/internal/typecheck/mkbuiltin.go b/src/cmd/compile/internal/typecheck/mkbuiltin.go
index 0ac3e47..28afac5 100644
--- a/src/cmd/compile/internal/typecheck/mkbuiltin.go
+++ b/src/cmd/compile/internal/typecheck/mkbuiltin.go
@@ -44,7 +44,7 @@
 // Not inlining this function removes a significant chunk of init code.
 //go:noinline
 func newSig(params, results []*types.Field) *types.Type {
-	return types.NewSignature(types.NoPkg, nil, nil, params, results)
+	return types.NewSignature(nil, params, results)
 }
 
 func params(tlist ...*types.Type) []*types.Field {
@@ -201,7 +201,7 @@
 	case *ast.StarExpr:
 		return fmt.Sprintf("types.NewPtr(%s)", i.subtype(t.X))
 	case *ast.StructType:
-		return fmt.Sprintf("types.NewStruct(types.NoPkg, %s)", i.fields(t.Fields, true))
+		return fmt.Sprintf("types.NewStruct(%s)", i.fields(t.Fields, true))
 
 	default:
 		log.Fatalf("unhandled type: %#v", t)
diff --git a/src/cmd/compile/internal/typecheck/stmt.go b/src/cmd/compile/internal/typecheck/stmt.go
index 9d57edb..9dea261 100644
--- a/src/cmd/compile/internal/typecheck/stmt.go
+++ b/src/cmd/compile/internal/typecheck/stmt.go
@@ -9,6 +9,7 @@
 	"cmd/compile/internal/ir"
 	"cmd/compile/internal/types"
 	"cmd/internal/src"
+	"internal/types/errors"
 )
 
 func RangeExprType(t *types.Type) *types.Type {
@@ -37,7 +38,7 @@
 	toomany := false
 	switch t.Kind() {
 	default:
-		base.ErrorfAt(n.Pos(), "cannot range over %L", n.X)
+		base.ErrorfAt(n.Pos(), errors.InvalidRangeExpr, "cannot range over %L", n.X)
 		return
 
 	case types.TARRAY, types.TSLICE:
@@ -50,7 +51,7 @@
 
 	case types.TCHAN:
 		if !t.ChanDir().CanRecv() {
-			base.ErrorfAt(n.Pos(), "invalid operation: range %v (receive from send-only type %v)", n.X, n.X.Type())
+			base.ErrorfAt(n.Pos(), errors.InvalidRangeExpr, "invalid operation: range %v (receive from send-only type %v)", n.X, n.X.Type())
 			return
 		}
 
@@ -66,16 +67,16 @@
 	}
 
 	if toomany {
-		base.ErrorfAt(n.Pos(), "too many variables in range")
+		base.ErrorfAt(n.Pos(), errors.InvalidIterVar, "too many variables in range")
 	}
 
 	do := func(nn ir.Node, t *types.Type) {
 		if nn != nil {
-			if ir.DeclaredBy(nn, n) {
+			if ir.DeclaredBy(nn, n) && nn.Type() == nil {
 				nn.SetType(t)
 			} else if nn.Type() != nil {
 				if op, why := Assignop(t, nn.Type()); op == ir.OXXX {
-					base.ErrorfAt(n.Pos(), "cannot assign type %v to %L in range%s", t, nn, why)
+					base.ErrorfAt(n.Pos(), errors.InvalidIterVar, "cannot assign type %v to %L in range%s", t, nn, why)
 				}
 			}
 			checkassign(nn)
@@ -185,10 +186,10 @@
 	if len(lhs) != cr {
 		if r, ok := rhs[0].(*ir.CallExpr); ok && len(rhs) == 1 {
 			if r.Type() != nil {
-				base.ErrorfAt(stmt.Pos(), "assignment mismatch: %d variable%s but %v returns %d value%s", len(lhs), plural(len(lhs)), r.X, cr, plural(cr))
+				base.ErrorfAt(stmt.Pos(), errors.WrongAssignCount, "assignment mismatch: %d variable%s but %v returns %d value%s", len(lhs), plural(len(lhs)), r.X, cr, plural(cr))
 			}
 		} else {
-			base.ErrorfAt(stmt.Pos(), "assignment mismatch: %d variable%s but %v value%s", len(lhs), plural(len(lhs)), len(rhs), plural(len(rhs)))
+			base.ErrorfAt(stmt.Pos(), errors.WrongAssignCount, "assignment mismatch: %d variable%s but %v value%s", len(lhs), plural(len(lhs)), len(rhs), plural(len(rhs)))
 		}
 
 		for i := range lhs {
@@ -273,9 +274,12 @@
 	case ir.OCALLINTER,
 		ir.OCALLMETH,
 		ir.OCALLFUNC,
+		ir.OCLEAR,
 		ir.OCLOSE,
 		ir.OCOPY,
 		ir.ODELETE,
+		ir.OMAX,
+		ir.OMIN,
 		ir.OPANIC,
 		ir.OPRINT,
 		ir.OPRINTN,
@@ -297,7 +301,7 @@
 		if orig := ir.Orig(n.Call); orig.Op() == ir.OCONV {
 			break
 		}
-		base.ErrorfAt(n.Pos(), "%s discards result of %v", what, n.Call)
+		base.ErrorfAt(n.Pos(), errors.UnusedResults, "%s discards result of %v", what, n.Call)
 		return
 	}
 
@@ -378,7 +382,7 @@
 		if ncase.Comm == nil {
 			// default
 			if def != nil {
-				base.ErrorfAt(ncase.Pos(), "multiple defaults in select (first at %v)", ir.Line(def))
+				base.ErrorfAt(ncase.Pos(), errors.DuplicateDefault, "multiple defaults in select (first at %v)", ir.Line(def))
 			} else {
 				def = ncase
 			}
@@ -402,7 +406,7 @@
 					// on the same line). This matches the approach before 1.10.
 					pos = ncase.Pos()
 				}
-				base.ErrorfAt(pos, "select case must be receive, send or assign recv")
+				base.ErrorfAt(pos, errors.InvalidSelectCase, "select case must be receive, send or assign recv")
 
 			case ir.OAS:
 				// convert x = <-c into x, _ = <-c
@@ -416,7 +420,7 @@
 					}
 				}
 				if n.Y.Op() != ir.ORECV {
-					base.ErrorfAt(n.Pos(), "select assignment must have receive on right hand side")
+					base.ErrorfAt(n.Pos(), errors.InvalidSelectCase, "select assignment must have receive on right hand side")
 					break
 				}
 				oselrecv2(n.X, n.Y, n.Def)
@@ -424,7 +428,7 @@
 			case ir.OAS2RECV:
 				n := n.(*ir.AssignListStmt)
 				if n.Rhs[0].Op() != ir.ORECV {
-					base.ErrorfAt(n.Pos(), "select assignment must have receive on right hand side")
+					base.ErrorfAt(n.Pos(), errors.InvalidSelectCase, "select assignment must have receive on right hand side")
 					break
 				}
 				n.SetOp(ir.OSELRECV2)
@@ -501,9 +505,9 @@
 
 		case !types.IsComparable(t):
 			if t.IsStruct() {
-				base.ErrorfAt(n.Pos(), "cannot switch on %L (struct containing %v cannot be compared)", n.Tag, types.IncomparableField(t).Type)
+				base.ErrorfAt(n.Pos(), errors.InvalidExprSwitch, "cannot switch on %L (struct containing %v cannot be compared)", n.Tag, types.IncomparableField(t).Type)
 			} else {
-				base.ErrorfAt(n.Pos(), "cannot switch on %L", n.Tag)
+				base.ErrorfAt(n.Pos(), errors.InvalidExprSwitch, "cannot switch on %L", n.Tag)
 			}
 			t = nil
 		}
@@ -514,7 +518,7 @@
 		ls := ncase.List
 		if len(ls) == 0 { // default:
 			if defCase != nil {
-				base.ErrorfAt(ncase.Pos(), "multiple defaults in switch (first at %v)", ir.Line(defCase))
+				base.ErrorfAt(ncase.Pos(), errors.DuplicateDefault, "multiple defaults in switch (first at %v)", ir.Line(defCase))
 			} else {
 				defCase = ncase
 			}
@@ -530,17 +534,17 @@
 			}
 
 			if nilonly != "" && !ir.IsNil(n1) {
-				base.ErrorfAt(ncase.Pos(), "invalid case %v in switch (can only compare %s %v to nil)", n1, nilonly, n.Tag)
+				base.ErrorfAt(ncase.Pos(), errors.MismatchedTypes, "invalid case %v in switch (can only compare %s %v to nil)", n1, nilonly, n.Tag)
 			} else if t.IsInterface() && !n1.Type().IsInterface() && !types.IsComparable(n1.Type()) {
-				base.ErrorfAt(ncase.Pos(), "invalid case %L in switch (incomparable type)", n1)
+				base.ErrorfAt(ncase.Pos(), errors.UndefinedOp, "invalid case %L in switch (incomparable type)", n1)
 			} else {
 				op1, _ := Assignop(n1.Type(), t)
 				op2, _ := Assignop(t, n1.Type())
 				if op1 == ir.OXXX && op2 == ir.OXXX {
 					if n.Tag != nil {
-						base.ErrorfAt(ncase.Pos(), "invalid case %v in switch on %v (mismatched types %v and %v)", n1, n.Tag, n1.Type(), t)
+						base.ErrorfAt(ncase.Pos(), errors.MismatchedTypes, "invalid case %v in switch on %v (mismatched types %v and %v)", n1, n.Tag, n1.Type(), t)
 					} else {
-						base.ErrorfAt(ncase.Pos(), "invalid case %v in switch (mismatched types %v and bool)", n1, n1.Type())
+						base.ErrorfAt(ncase.Pos(), errors.MismatchedTypes, "invalid case %v in switch (mismatched types %v and bool)", n1, n1.Type())
 					}
 				}
 			}
@@ -555,7 +559,7 @@
 	guard.X = Expr(guard.X)
 	t := guard.X.Type()
 	if t != nil && !t.IsInterface() {
-		base.ErrorfAt(n.Pos(), "cannot type switch on non-interface value %L", guard.X)
+		base.ErrorfAt(n.Pos(), errors.InvalidTypeSwitch, "cannot type switch on non-interface value %L", guard.X)
 		t = nil
 	}
 
@@ -563,7 +567,7 @@
 	// declaration itself. So if there are no cases, we won't
 	// notice that it went unused.
 	if v := guard.Tag; v != nil && !ir.IsBlank(v) && len(n.Cases) == 0 {
-		base.ErrorfAt(v.Pos(), "%v declared but not used", v.Sym())
+		base.ErrorfAt(v.Pos(), errors.UnusedVar, "%v declared but not used", v.Sym())
 	}
 
 	var defCase, nilCase ir.Node
@@ -572,7 +576,7 @@
 		ls := ncase.List
 		if len(ls) == 0 { // default:
 			if defCase != nil {
-				base.ErrorfAt(ncase.Pos(), "multiple defaults in switch (first at %v)", ir.Line(defCase))
+				base.ErrorfAt(ncase.Pos(), errors.DuplicateDefault, "multiple defaults in switch (first at %v)", ir.Line(defCase))
 			} else {
 				defCase = ncase
 			}
@@ -585,11 +589,9 @@
 				continue
 			}
 
-			var missing, have *types.Field
-			var ptr int
 			if ir.IsNil(n1) { // case nil:
 				if nilCase != nil {
-					base.ErrorfAt(ncase.Pos(), "multiple nil cases in type switch (first at %v)", ir.Line(nilCase))
+					base.ErrorfAt(ncase.Pos(), errors.DuplicateCase, "multiple nil cases in type switch (first at %v)", ir.Line(nilCase))
 				} else {
 					nilCase = ncase
 				}
@@ -599,19 +601,13 @@
 				continue
 			}
 			if n1.Op() != ir.OTYPE {
-				base.ErrorfAt(ncase.Pos(), "%L is not a type", n1)
+				base.ErrorfAt(ncase.Pos(), errors.NotAType, "%L is not a type", n1)
 				continue
 			}
-			if !n1.Type().IsInterface() && !implements(n1.Type(), t, &missing, &have, &ptr) {
-				if have != nil {
-					base.ErrorfAt(ncase.Pos(), "impossible type switch case: %L cannot have dynamic type %v %s", guard.X, n1.Type(),
-						wrongTypeFor(have.Sym, have.Type, missing.Sym, missing.Type))
-				} else if ptr != 0 {
-					base.ErrorfAt(ncase.Pos(), "impossible type switch case: %L cannot have dynamic type %v"+
-						" (%v method has pointer receiver)", guard.X, n1.Type(), missing.Sym)
-				} else {
-					base.ErrorfAt(ncase.Pos(), "impossible type switch case: %L cannot have dynamic type %v"+
-						" (missing %v method)", guard.X, n1.Type(), missing.Sym)
+			if !n1.Type().IsInterface() {
+				why := ImplementsExplain(n1.Type(), t)
+				if why != "" {
+					base.ErrorfAt(ncase.Pos(), errors.ImpossibleAssert, "impossible type switch case: %L cannot have dynamic type %v (%s)", guard.X, n1.Type(), why)
 				}
 				continue
 			}
@@ -658,7 +654,7 @@
 
 	ls := typ.LinkString()
 	if prev, ok := s.m[ls]; ok {
-		base.ErrorfAt(pos, "duplicate case %v in type switch\n\tprevious case at %s", typ, base.FmtPos(prev))
+		base.ErrorfAt(pos, errors.DuplicateCase, "duplicate case %v in type switch\n\tprevious case at %s", typ, base.FmtPos(prev))
 		return
 	}
 	s.m[ls] = pos
diff --git a/src/cmd/compile/internal/typecheck/subr.go b/src/cmd/compile/internal/typecheck/subr.go
index 9760e36..2bb978a 100644
--- a/src/cmd/compile/internal/typecheck/subr.go
+++ b/src/cmd/compile/internal/typecheck/subr.go
@@ -5,7 +5,6 @@
 package typecheck
 
 import (
-	"bytes"
 	"fmt"
 	"sort"
 	"strings"
@@ -14,7 +13,6 @@
 	"cmd/compile/internal/ir"
 	"cmd/compile/internal/types"
 	"cmd/internal/obj"
-	"cmd/internal/objabi"
 	"cmd/internal/src"
 )
 
@@ -374,40 +372,23 @@
 
 	// 3. dst is an interface type and src implements dst.
 	if dst.IsInterface() && src.Kind() != types.TNIL {
-		var missing, have *types.Field
-		var ptr int
 		if src.IsShape() {
 			// Shape types implement things they have already
 			// been typechecked to implement, even if they
 			// don't have the methods for them.
 			return ir.OCONVIFACE, ""
 		}
-		if base.Debug.Unified != 0 && src.HasShape() {
+		if src.HasShape() {
 			// Unified IR uses OCONVIFACE for converting all derived types
 			// to interface type, not just type arguments themselves.
 			return ir.OCONVIFACE, ""
 		}
-		if implements(src, dst, &missing, &have, &ptr) {
+
+		why := ImplementsExplain(src, dst)
+		if why == "" {
 			return ir.OCONVIFACE, ""
 		}
-
-		var why string
-		if isptrto(src, types.TINTER) {
-			why = fmt.Sprintf(":\n\t%v is pointer to interface, not interface", src)
-		} else if have != nil && have.Sym == missing.Sym && have.Nointerface() {
-			why = fmt.Sprintf(":\n\t%v does not implement %v (%v method is marked 'nointerface')", src, dst, missing.Sym)
-		} else if have != nil && have.Sym == missing.Sym {
-			why = fmt.Sprintf(":\n\t%v does not implement %v %s", src, dst, wrongTypeFor(have.Sym, have.Type, missing.Sym, missing.Type))
-		} else if ptr != 0 {
-			why = fmt.Sprintf(":\n\t%v does not implement %v (%v method has pointer receiver)", src, dst, missing.Sym)
-		} else if have != nil {
-			why = fmt.Sprintf(":\n\t%v does not implement %v (missing %v method)\n"+
-				"\t\thave %v%S\n\t\twant %v%S", src, dst, missing.Sym, have.Sym, have.Type, missing.Sym, missing.Type)
-		} else {
-			why = fmt.Sprintf(":\n\t%v does not implement %v (missing %v method)", src, dst, missing.Sym)
-		}
-
-		return ir.OXXX, why
+		return ir.OXXX, ":\n\t" + why
 	}
 
 	if isptrto(dst, types.TINTER) {
@@ -416,10 +397,8 @@
 	}
 
 	if src.IsInterface() && dst.Kind() != types.TBLANK {
-		var missing, have *types.Field
-		var ptr int
 		var why string
-		if implements(dst, src, &missing, &have, &ptr) {
+		if Implements(dst, src) {
 			why = ": need type assertion"
 		}
 		return ir.OXXX, why
@@ -692,32 +671,56 @@
 	t.SetRecur(false)
 }
 
-func ifacelookdot(s *types.Sym, t *types.Type, ignorecase bool) (m *types.Field, followptr bool) {
+func ifacelookdot(s *types.Sym, t *types.Type, ignorecase bool) *types.Field {
 	if t == nil {
-		return nil, false
+		return nil
 	}
 
-	path, ambig := dotpath(s, t, &m, ignorecase)
+	var m *types.Field
+	path, _ := dotpath(s, t, &m, ignorecase)
 	if path == nil {
-		if ambig {
-			base.Errorf("%v.%v is ambiguous", t, s)
-		}
-		return nil, false
-	}
-
-	for _, d := range path {
-		if d.field.Type.IsPtr() {
-			followptr = true
-			break
-		}
+		return nil
 	}
 
 	if !m.IsMethod() {
-		base.Errorf("%v.%v is a field, not a method", t, s)
-		return nil, followptr
+		return nil
 	}
 
-	return m, followptr
+	return m
+}
+
+// Implements reports whether t implements the interface iface. t can be
+// an interface, a type parameter, or a concrete type.
+func Implements(t, iface *types.Type) bool {
+	var missing, have *types.Field
+	var ptr int
+	return implements(t, iface, &missing, &have, &ptr)
+}
+
+// ImplementsExplain reports whether t implements the interface iface. t can be
+// an interface, a type parameter, or a concrete type. If t does not implement
+// iface, a non-empty string is returned explaining why.
+func ImplementsExplain(t, iface *types.Type) string {
+	var missing, have *types.Field
+	var ptr int
+	if implements(t, iface, &missing, &have, &ptr) {
+		return ""
+	}
+
+	if isptrto(t, types.TINTER) {
+		return fmt.Sprintf("%v is pointer to interface, not interface", t)
+	} else if have != nil && have.Sym == missing.Sym && have.Nointerface() {
+		return fmt.Sprintf("%v does not implement %v (%v method is marked 'nointerface')", t, iface, missing.Sym)
+	} else if have != nil && have.Sym == missing.Sym {
+		return fmt.Sprintf("%v does not implement %v (wrong type for %v method)\n"+
+			"\t\thave %v%S\n\t\twant %v%S", t, iface, missing.Sym, have.Sym, have.Type, missing.Sym, missing.Type)
+	} else if ptr != 0 {
+		return fmt.Sprintf("%v does not implement %v (%v method has pointer receiver)", t, iface, missing.Sym)
+	} else if have != nil {
+		return fmt.Sprintf("%v does not implement %v (missing %v method)\n"+
+			"\t\thave %v%S\n\t\twant %v%S", t, iface, missing.Sym, have.Sym, have.Type, missing.Sym, missing.Type)
+	}
+	return fmt.Sprintf("%v does not implement %v (missing %v method)", t, iface, missing.Sym)
 }
 
 // implements reports whether t implements the interface iface. t can be
@@ -731,19 +734,7 @@
 		return false
 	}
 
-	if t.IsInterface() || t.IsTypeParam() {
-		if t.IsTypeParam() {
-			// If t is a simple type parameter T, its type and underlying is the same.
-			// If t is a type definition:'type P[T any] T', its type is P[T] and its
-			// underlying is T. Therefore we use 't.Underlying() != t' to distinguish them.
-			if t.Underlying() != t {
-				CalcMethods(t)
-			} else {
-				// A typeparam satisfies an interface if its type bound
-				// has all the methods of that interface.
-				t = t.Bound()
-			}
-		}
+	if t.IsInterface() {
 		i := 0
 		tms := t.AllMethods().Slice()
 		for _, im := range iface.AllMethods().Slice() {
@@ -781,7 +772,7 @@
 		}
 		if i == len(tms) {
 			*m = im
-			*samename, _ = ifacelookdot(im.Sym, t, true)
+			*samename = ifacelookdot(im.Sym, t, true)
 			*ptr = 0
 			return false
 		}
@@ -887,696 +878,6 @@
 	field *types.Field
 }
 
-// TypesOf converts a list of nodes to a list
-// of types of those nodes.
-func TypesOf(x []ir.Ntype) []*types.Type {
-	r := make([]*types.Type, len(x))
-	for i, n := range x {
-		r[i] = n.Type()
-	}
-	return r
-}
-
-// addTargs writes out the targs to buffer b as a comma-separated list enclosed by
-// brackets.
-func addTargs(b *bytes.Buffer, targs []*types.Type) {
-	b.WriteByte('[')
-	for i, targ := range targs {
-		if i > 0 {
-			b.WriteByte(',')
-		}
-		// Make sure that type arguments (including type params), are
-		// uniquely specified. LinkString() eliminates all spaces
-		// and includes the package path (local package path is "" before
-		// linker substitution).
-		tstring := targ.LinkString()
-		b.WriteString(tstring)
-	}
-	b.WriteString("]")
-}
-
-// InstTypeName creates a name for an instantiated type, based on the name of the
-// generic type and the type args.
-func InstTypeName(name string, targs []*types.Type) string {
-	b := bytes.NewBufferString(name)
-	addTargs(b, targs)
-	return b.String()
-}
-
-// makeInstName1 returns the name of the generic function instantiated with the
-// given types, which can have type params or shapes, or be concrete types. name is
-// the name of the generic function or method.
-func makeInstName1(name string, targs []*types.Type, hasBrackets bool) string {
-	b := bytes.NewBufferString("")
-	i := strings.Index(name, "[")
-	assert(hasBrackets == (i >= 0))
-	if i >= 0 {
-		b.WriteString(name[0:i])
-	} else {
-		b.WriteString(name)
-	}
-	addTargs(b, targs)
-	if i >= 0 {
-		i2 := strings.LastIndex(name[i:], "]")
-		assert(i2 >= 0)
-		b.WriteString(name[i+i2+1:])
-	}
-	return b.String()
-}
-
-// MakeFuncInstSym makes the unique sym for a stenciled generic function or method,
-// based on the name of the function gf and the targs. It replaces any
-// existing bracket type list in the name. MakeInstName asserts that gf has
-// brackets in its name if and only if hasBrackets is true.
-//
-// Names of declared generic functions have no brackets originally, so hasBrackets
-// should be false. Names of generic methods already have brackets, since the new
-// type parameter is specified in the generic type of the receiver (e.g. func
-// (func (v *value[T]).set(...) { ... } has the original name (*value[T]).set.
-//
-// The standard naming is something like: 'genFn[int,bool]' for functions and
-// '(*genType[int,bool]).methodName' for methods
-//
-// isMethodNode specifies if the name of a method node is being generated (as opposed
-// to a name of an instantiation of generic function or name of the shape-based
-// function that helps implement a method of an instantiated type). For method nodes
-// on shape types, we prepend "nofunc.", because method nodes for shape types will
-// have no body, and we want to avoid a name conflict with the shape-based function
-// that helps implement the same method for fully-instantiated types. Function names
-// are also created at the end of (*Tsubster).typ1, so we append "nofunc" there as
-// well, as needed.
-func MakeFuncInstSym(gf *types.Sym, targs []*types.Type, isMethodNode, hasBrackets bool) *types.Sym {
-	nm := makeInstName1(gf.Name, targs, hasBrackets)
-	if targs[0].HasShape() && isMethodNode {
-		nm = "nofunc." + nm
-	}
-	return gf.Pkg.Lookup(nm)
-}
-
-func MakeDictSym(gf *types.Sym, targs []*types.Type, hasBrackets bool) *types.Sym {
-	for _, targ := range targs {
-		if targ.HasTParam() {
-			fmt.Printf("FUNCTION %s\n", gf.Name)
-			for _, targ := range targs {
-				fmt.Printf("  PARAM %+v\n", targ)
-			}
-			panic("dictionary should always have concrete type args")
-		}
-	}
-	name := makeInstName1(gf.Name, targs, hasBrackets)
-	name = fmt.Sprintf("%s.%s", objabi.GlobalDictPrefix, name)
-	return gf.Pkg.Lookup(name)
-}
-
 func assert(p bool) {
 	base.Assert(p)
 }
-
-// List of newly fully-instantiated types who should have their methods generated.
-var instTypeList []*types.Type
-
-// NeedInstType adds a new fully-instantiated type to instTypeList.
-func NeedInstType(t *types.Type) {
-	instTypeList = append(instTypeList, t)
-}
-
-// GetInstTypeList returns the current contents of instTypeList.
-func GetInstTypeList() []*types.Type {
-	r := instTypeList
-	return r
-}
-
-// ClearInstTypeList clears the contents of instTypeList.
-func ClearInstTypeList() {
-	instTypeList = nil
-}
-
-// General type substituter, for replacing typeparams with type args.
-type Tsubster struct {
-	Tparams []*types.Type
-	Targs   []*types.Type
-	// If non-nil, the substitution map from name nodes in the generic function to the
-	// name nodes in the new stenciled function.
-	Vars map[*ir.Name]*ir.Name
-	// If non-nil, function to substitute an incomplete (TFORW) type.
-	SubstForwFunc func(*types.Type) *types.Type
-	// Prevent endless recursion on functions. See #51832.
-	Funcs map[*types.Type]bool
-}
-
-// Typ computes the type obtained by substituting any type parameter or shape in t
-// that appears in subst.Tparams with the corresponding type argument in subst.Targs.
-// If t contains no type parameters, the result is t; otherwise the result is a new
-// type. It deals with recursive types by using TFORW types and finding partially or
-// fully created types via sym.Def.
-func (ts *Tsubster) Typ(t *types.Type) *types.Type {
-	// Defer the CheckSize calls until we have fully-defined
-	// (possibly-recursive) top-level type.
-	types.DeferCheckSize()
-	r := ts.typ1(t)
-	types.ResumeCheckSize()
-	return r
-}
-
-func (ts *Tsubster) typ1(t *types.Type) *types.Type {
-	hasParamOrShape := t.HasTParam() || t.HasShape()
-	if !hasParamOrShape && t.Kind() != types.TFUNC {
-		// Note: function types need to be copied regardless, as the
-		// types of closures may contain declarations that need
-		// to be copied. See #45738.
-		return t
-	}
-
-	if t.IsTypeParam() || t.IsShape() {
-		for i, tp := range ts.Tparams {
-			if tp == t {
-				return ts.Targs[i]
-			}
-		}
-		// If t is a simple typeparam T, then t has the name/symbol 'T'
-		// and t.Underlying() == t.
-		//
-		// However, consider the type definition: 'type P[T any] T'. We
-		// might use this definition so we can have a variant of type T
-		// that we can add new methods to. Suppose t is a reference to
-		// P[T]. t has the name 'P[T]', but its kind is TTYPEPARAM,
-		// because P[T] is defined as T. If we look at t.Underlying(), it
-		// is different, because the name of t.Underlying() is 'T' rather
-		// than 'P[T]'. But the kind of t.Underlying() is also TTYPEPARAM.
-		// In this case, we do the needed recursive substitution in the
-		// case statement below.
-		if t.Underlying() == t {
-			// t is a simple typeparam that didn't match anything in tparam
-			return t
-		}
-		// t is a more complex typeparam (e.g. P[T], as above, whose
-		// definition is just T).
-		assert(t.Sym() != nil)
-	}
-
-	var newsym *types.Sym
-	var neededTargs []*types.Type
-	var targsChanged bool // == are there any substitutions from this
-	var forw *types.Type
-
-	if t.Sym() != nil && hasParamOrShape {
-		// Need to test for t.HasTParam() again because of special TFUNC case above.
-		// Translate the type params for this type according to
-		// the tparam/targs mapping from subst.
-		neededTargs = make([]*types.Type, len(t.RParams()))
-		for i, rparam := range t.RParams() {
-			neededTargs[i] = ts.typ1(rparam)
-			if !types.IdenticalStrict(neededTargs[i], rparam) {
-				targsChanged = true
-			}
-		}
-		// For a named (defined) type, we have to change the name of the
-		// type as well. We do this first, so we can look up if we've
-		// already seen this type during this substitution or other
-		// definitions/substitutions.
-		genName := genericTypeName(t.Sym())
-		newsym = t.Sym().Pkg.Lookup(InstTypeName(genName, neededTargs))
-		if newsym.Def != nil {
-			// We've already created this instantiated defined type.
-			return newsym.Def.Type()
-		}
-
-		// In order to deal with recursive generic types, create a TFORW
-		// type initially and set the Def field of its sym, so it can be
-		// found if this type appears recursively within the type.
-		forw = NewIncompleteNamedType(t.Pos(), newsym)
-		//println("Creating new type by sub", newsym.Name, forw.HasTParam())
-		forw.SetRParams(neededTargs)
-		// Copy the OrigType from the re-instantiated type (which is the sym of
-		// the base generic type).
-		assert(t.OrigType() != nil)
-		forw.SetOrigType(t.OrigType())
-	}
-
-	var newt *types.Type
-
-	switch t.Kind() {
-	case types.TTYPEPARAM:
-		if t.Sym() == newsym && !targsChanged {
-			// The substitution did not change the type.
-			return t
-		}
-		// Substitute the underlying typeparam (e.g. T in P[T], see
-		// the example describing type P[T] above).
-		newt = ts.typ1(t.Underlying())
-		assert(newt != t)
-
-	case types.TARRAY:
-		elem := t.Elem()
-		newelem := ts.typ1(elem)
-		if newelem != elem || targsChanged {
-			newt = types.NewArray(newelem, t.NumElem())
-		}
-
-	case types.TPTR:
-		elem := t.Elem()
-		newelem := ts.typ1(elem)
-		if newelem != elem || targsChanged {
-			newt = types.NewPtr(newelem)
-		}
-
-	case types.TSLICE:
-		elem := t.Elem()
-		newelem := ts.typ1(elem)
-		if newelem != elem || targsChanged {
-			newt = types.NewSlice(newelem)
-		}
-
-	case types.TSTRUCT:
-		newt = ts.tstruct(t, targsChanged)
-		if newt == t {
-			newt = nil
-		}
-
-	case types.TFUNC:
-		// watch out for endless recursion on plain function types that mention themselves, e.g. "type T func() T"
-		if !hasParamOrShape {
-			if ts.Funcs[t] { // Visit such function types only once.
-				return t
-			}
-			if ts.Funcs == nil {
-				// allocate lazily
-				ts.Funcs = make(map[*types.Type]bool)
-			}
-			ts.Funcs[t] = true
-		}
-		newrecvs := ts.tstruct(t.Recvs(), false)
-		newparams := ts.tstruct(t.Params(), false)
-		newresults := ts.tstruct(t.Results(), false)
-		// Translate the tparams of a signature.
-		newtparams := ts.tstruct(t.TParams(), false)
-		if newrecvs != t.Recvs() || newparams != t.Params() ||
-			newresults != t.Results() || newtparams != t.TParams() || targsChanged {
-			// If any types have changed, then the all the fields of
-			// of recv, params, and results must be copied, because they have
-			// offset fields that are dependent, and so must have an
-			// independent copy for each new signature.
-			var newrecv *types.Field
-			if newrecvs.NumFields() > 0 {
-				if newrecvs == t.Recvs() {
-					newrecvs = ts.tstruct(t.Recvs(), true)
-				}
-				newrecv = newrecvs.Field(0)
-			}
-			if newparams == t.Params() {
-				newparams = ts.tstruct(t.Params(), true)
-			}
-			if newresults == t.Results() {
-				newresults = ts.tstruct(t.Results(), true)
-			}
-			var tparamfields []*types.Field
-			if newtparams.HasTParam() {
-				tparamfields = newtparams.FieldSlice()
-			} else {
-				// Completely remove the tparams from the resulting
-				// signature, if the tparams are now concrete types.
-				tparamfields = nil
-			}
-			newt = types.NewSignature(t.Pkg(), newrecv, tparamfields,
-				newparams.FieldSlice(), newresults.FieldSlice())
-		}
-		if !hasParamOrShape {
-			delete(ts.Funcs, t)
-		}
-
-	case types.TINTER:
-		newt = ts.tinter(t, targsChanged)
-		if newt == t {
-			newt = nil
-		}
-
-	case types.TMAP:
-		newkey := ts.typ1(t.Key())
-		newval := ts.typ1(t.Elem())
-		if newkey != t.Key() || newval != t.Elem() || targsChanged {
-			newt = types.NewMap(newkey, newval)
-		}
-
-	case types.TCHAN:
-		elem := t.Elem()
-		newelem := ts.typ1(elem)
-		if newelem != elem || targsChanged {
-			newt = types.NewChan(newelem, t.ChanDir())
-		}
-	case types.TFORW:
-		if ts.SubstForwFunc != nil {
-			return ts.SubstForwFunc(forw)
-		} else {
-			assert(false)
-		}
-	case types.TINT, types.TINT8, types.TINT16, types.TINT32, types.TINT64,
-		types.TUINT, types.TUINT8, types.TUINT16, types.TUINT32, types.TUINT64,
-		types.TUINTPTR, types.TBOOL, types.TSTRING, types.TFLOAT32, types.TFLOAT64, types.TCOMPLEX64, types.TCOMPLEX128, types.TUNSAFEPTR:
-		newt = t.Underlying()
-	case types.TUNION:
-		nt := t.NumTerms()
-		newterms := make([]*types.Type, nt)
-		tildes := make([]bool, nt)
-		changed := false
-		for i := 0; i < nt; i++ {
-			term, tilde := t.Term(i)
-			tildes[i] = tilde
-			newterms[i] = ts.typ1(term)
-			if newterms[i] != term {
-				changed = true
-			}
-		}
-		if changed {
-			newt = types.NewUnion(newterms, tildes)
-		}
-	default:
-		panic(fmt.Sprintf("Bad type in (*TSubster).Typ: %v", t.Kind()))
-	}
-	if newt == nil {
-		// Even though there were typeparams in the type, there may be no
-		// change if this is a function type for a function call (which will
-		// have its own tparams/targs in the function instantiation).
-		return t
-	}
-
-	if forw != nil {
-		forw.SetUnderlying(newt)
-		newt = forw
-	}
-
-	if !newt.HasTParam() && !newt.IsFuncArgStruct() {
-		// Calculate the size of any new types created. These will be
-		// deferred until the top-level ts.Typ() or g.typ() (if this is
-		// called from g.fillinMethods()).
-		types.CheckSize(newt)
-	}
-
-	if t.Kind() != types.TINTER && t.Methods().Len() > 0 {
-		// Fill in the method info for the new type.
-		var newfields []*types.Field
-		newfields = make([]*types.Field, t.Methods().Len())
-		for i, f := range t.Methods().Slice() {
-			t2 := ts.typ1(f.Type)
-			oldsym := f.Nname.Sym()
-
-			// Use the name of the substituted receiver to create the
-			// method name, since the receiver name may have many levels
-			// of nesting (brackets) with type names to be substituted.
-			recvType := t2.Recv().Type
-			var nm string
-			if recvType.IsPtr() {
-				recvType = recvType.Elem()
-				nm = "(*" + recvType.Sym().Name + ")." + f.Sym.Name
-			} else {
-				nm = recvType.Sym().Name + "." + f.Sym.Name
-			}
-			if recvType.RParams()[0].HasShape() {
-				// We add "nofunc" to methods of shape type to avoid
-				// conflict with the name of the shape-based helper
-				// function. See header comment of MakeFuncInstSym.
-				nm = "nofunc." + nm
-			}
-			newsym := oldsym.Pkg.Lookup(nm)
-			var nname *ir.Name
-			if newsym.Def != nil {
-				nname = newsym.Def.(*ir.Name)
-			} else {
-				nname = ir.NewNameAt(f.Pos, newsym)
-				nname.SetType(t2)
-				ir.MarkFunc(nname)
-				newsym.Def = nname
-			}
-			newfields[i] = types.NewField(f.Pos, f.Sym, t2)
-			newfields[i].Nname = nname
-		}
-		newt.Methods().Set(newfields)
-		if !newt.HasTParam() && !newt.HasShape() {
-			// Generate all the methods for a new fully-instantiated type.
-
-			NeedInstType(newt)
-		}
-	}
-	return newt
-}
-
-// tstruct substitutes type params in types of the fields of a structure type. For
-// each field, tstruct copies the Nname, and translates it if Nname is in
-// ts.vars. To always force the creation of a new (top-level) struct,
-// regardless of whether anything changed with the types or names of the struct's
-// fields, set force to true.
-func (ts *Tsubster) tstruct(t *types.Type, force bool) *types.Type {
-	if t.NumFields() == 0 {
-		if t.HasTParam() || t.HasShape() {
-			// For an empty struct, we need to return a new type, if
-			// substituting from a generic type or shape type, since it
-			// will change HasTParam/HasShape flags.
-			return types.NewStruct(t.Pkg(), nil)
-		}
-		return t
-	}
-	var newfields []*types.Field
-	if force {
-		newfields = make([]*types.Field, t.NumFields())
-	}
-	for i, f := range t.Fields().Slice() {
-		t2 := ts.typ1(f.Type)
-		if (t2 != f.Type || f.Nname != nil) && newfields == nil {
-			newfields = make([]*types.Field, t.NumFields())
-			for j := 0; j < i; j++ {
-				newfields[j] = t.Field(j)
-			}
-		}
-		if newfields != nil {
-			newfields[i] = types.NewField(f.Pos, f.Sym, t2)
-			newfields[i].Embedded = f.Embedded
-			newfields[i].Note = f.Note
-			if f.IsDDD() {
-				newfields[i].SetIsDDD(true)
-			}
-			if f.Nointerface() {
-				newfields[i].SetNointerface(true)
-			}
-			if f.Nname != nil && ts.Vars != nil {
-				n := f.Nname.(*ir.Name)
-				v := ts.Vars[n]
-				if v != nil {
-					// This is the case where we are
-					// translating the type of the function we
-					// are substituting, so its dcls are in
-					// the subst.ts.vars table, and we want to
-					// change to reference the new dcl.
-					newfields[i].Nname = v
-				} else if ir.IsBlank(n) {
-					// Blank variable is not dcl list. Make a
-					// new one to not share.
-					m := ir.NewNameAt(n.Pos(), ir.BlankNode.Sym())
-					m.SetType(n.Type())
-					m.SetTypecheck(1)
-					newfields[i].Nname = m
-				} else {
-					// This is the case where we are
-					// translating the type of a function
-					// reference inside the function we are
-					// substituting, so we leave the Nname
-					// value as is.
-					newfields[i].Nname = f.Nname
-				}
-			}
-		}
-	}
-	if newfields != nil {
-		news := types.NewStruct(t.Pkg(), newfields)
-		news.StructType().Funarg = t.StructType().Funarg
-		return news
-	}
-	return t
-
-}
-
-// tinter substitutes type params in types of the methods of an interface type.
-func (ts *Tsubster) tinter(t *types.Type, force bool) *types.Type {
-	if t.Methods().Len() == 0 {
-		if t.HasTParam() || t.HasShape() {
-			// For an empty interface, we need to return a new type, if
-			// substituting from a generic type or shape type, since
-			// since it will change HasTParam/HasShape flags.
-			return types.NewInterface(t.Pkg(), nil, false)
-		}
-		return t
-	}
-	var newfields []*types.Field
-	if force {
-		newfields = make([]*types.Field, t.Methods().Len())
-	}
-	for i, f := range t.Methods().Slice() {
-		t2 := ts.typ1(f.Type)
-		if (t2 != f.Type || f.Nname != nil) && newfields == nil {
-			newfields = make([]*types.Field, t.Methods().Len())
-			for j := 0; j < i; j++ {
-				newfields[j] = t.Methods().Index(j)
-			}
-		}
-		if newfields != nil {
-			newfields[i] = types.NewField(f.Pos, f.Sym, t2)
-		}
-	}
-	if newfields != nil {
-		return types.NewInterface(t.Pkg(), newfields, t.IsImplicit())
-	}
-	return t
-}
-
-// genericTypeName returns the name of the base generic type for the type named by
-// sym. It simply returns the name obtained by removing everything after the
-// first bracket ("[").
-func genericTypeName(sym *types.Sym) string {
-	return sym.Name[0:strings.Index(sym.Name, "[")]
-}
-
-// getShapes appends the list of the shape types that are used within type t to
-// listp. The type traversal is simplified for two reasons: (1) we can always stop a
-// type traversal when t.HasShape() is false; and (2) shape types can't appear inside
-// a named type, except for the type args of a generic type. So, the traversal will
-// always stop before we have to deal with recursive types.
-func getShapes(t *types.Type, listp *[]*types.Type) {
-	if !t.HasShape() {
-		return
-	}
-	if t.IsShape() {
-		*listp = append(*listp, t)
-		return
-	}
-
-	if t.Sym() != nil {
-		// A named type can't have shapes in it, except for type args of a
-		// generic type. We will have to deal with this differently once we
-		// alloc local types in generic functions (#47631).
-		for _, rparam := range t.RParams() {
-			getShapes(rparam, listp)
-		}
-		return
-	}
-
-	switch t.Kind() {
-	case types.TARRAY, types.TPTR, types.TSLICE, types.TCHAN:
-		getShapes(t.Elem(), listp)
-
-	case types.TSTRUCT:
-		for _, f := range t.FieldSlice() {
-			getShapes(f.Type, listp)
-		}
-
-	case types.TFUNC:
-		for _, f := range t.Recvs().FieldSlice() {
-			getShapes(f.Type, listp)
-		}
-		for _, f := range t.Params().FieldSlice() {
-			getShapes(f.Type, listp)
-		}
-		for _, f := range t.Results().FieldSlice() {
-			getShapes(f.Type, listp)
-		}
-		for _, f := range t.TParams().FieldSlice() {
-			getShapes(f.Type, listp)
-		}
-
-	case types.TINTER:
-		for _, f := range t.Methods().Slice() {
-			getShapes(f.Type, listp)
-		}
-
-	case types.TMAP:
-		getShapes(t.Key(), listp)
-		getShapes(t.Elem(), listp)
-
-	default:
-		panic(fmt.Sprintf("Bad type in getShapes: %v", t.Kind()))
-	}
-
-}
-
-// Shapify takes a concrete type and a type param index, and returns a GCshape type that can
-// be used in place of the input type and still generate identical code.
-// No methods are added - all methods calls directly on a shape should
-// be done by converting to an interface using the dictionary.
-//
-// For now, we only consider two types to have the same shape, if they have exactly
-// the same underlying type or they are both pointer types.
-//
-// tparam is the associated typeparam - it must be TTYPEPARAM type. If there is a
-// structural type for the associated type param (not common), then a pointer type t
-// is mapped to its underlying type, rather than being merged with other pointers.
-//
-// Shape types are also distinguished by the index of the type in a type param/arg
-// list. We need to do this so we can distinguish and substitute properly for two
-// type params in the same function that have the same shape for a particular
-// instantiation.
-func Shapify(t *types.Type, index int, tparam *types.Type) *types.Type {
-	assert(!t.IsShape())
-	if t.HasShape() {
-		// We are sometimes dealing with types from a shape instantiation
-		// that were constructed from existing shape types, so t may
-		// sometimes have shape types inside it. In that case, we find all
-		// those shape types with getShapes() and replace them with their
-		// underlying type.
-		//
-		// If we don't do this, we may create extra unneeded shape types that
-		// have these other shape types embedded in them. This may lead to
-		// generating extra shape instantiations, and a mismatch between the
-		// instantiations that we used in generating dictionaries and the
-		// instantations that are actually called. (#51303).
-		list := []*types.Type{}
-		getShapes(t, &list)
-		list2 := make([]*types.Type, len(list))
-		for i, shape := range list {
-			list2[i] = shape.Underlying()
-		}
-		ts := Tsubster{
-			Tparams: list,
-			Targs:   list2,
-		}
-		t = ts.Typ(t)
-	}
-	// Map all types with the same underlying type to the same shape.
-	u := t.Underlying()
-
-	// All pointers have the same shape.
-	// TODO: Make unsafe.Pointer the same shape as normal pointers.
-	// Note: pointers to arrays are special because of slice-to-array-pointer
-	// conversions. See issue 49295.
-	if u.Kind() == types.TPTR && u.Elem().Kind() != types.TARRAY &&
-		tparam.Bound().StructuralType() == nil && !u.Elem().NotInHeap() {
-		u = types.Types[types.TUINT8].PtrTo()
-	}
-
-	submap := shapeMap[index]
-	if submap == nil {
-		submap = map[*types.Type]*types.Type{}
-		shapeMap[index] = submap
-	}
-	if s := submap[u]; s != nil {
-		return s
-	}
-
-	// LinkString specifies the type uniquely, but has no spaces.
-	nm := fmt.Sprintf("%s_%d", u.LinkString(), index)
-	sym := types.ShapePkg.Lookup(nm)
-	if sym.Def != nil {
-		// Use any existing type with the same name
-		submap[u] = sym.Def.Type()
-		return submap[u]
-	}
-	name := ir.NewDeclNameAt(u.Pos(), ir.OTYPE, sym)
-	s := types.NewNamed(name)
-	sym.Def = name
-	s.SetUnderlying(u)
-	s.SetIsShape(true)
-	s.SetHasShape(true)
-	types.CalcSize(s)
-	name.SetType(s)
-	name.SetTypecheck(1)
-	submap[u] = s
-	return s
-}
-
-var shapeMap = map[int]map[*types.Type]*types.Type{}
diff --git a/src/cmd/compile/internal/typecheck/typecheck.go b/src/cmd/compile/internal/typecheck/typecheck.go
index 1857994..6e4feec 100644
--- a/src/cmd/compile/internal/typecheck/typecheck.go
+++ b/src/cmd/compile/internal/typecheck/typecheck.go
@@ -8,6 +8,7 @@
 	"fmt"
 	"go/constant"
 	"go/token"
+	"internal/types/errors"
 	"strings"
 
 	"cmd/compile/internal/base"
@@ -45,18 +46,6 @@
 	return typecheck(n, ctxExpr|ctxCallee)
 }
 
-var importlist []*ir.Func
-
-// AllImportedBodies reads in the bodies of all imported functions and typechecks
-// them, if needed.
-func AllImportedBodies() {
-	for _, n := range importlist {
-		if n.Inl != nil {
-			ImportedBody(n)
-		}
-	}
-}
-
 var traceIndent []byte
 
 func tracePrint(title string, n ir.Node) func(np *ir.Node) {
@@ -126,21 +115,8 @@
 		return n
 	}
 
-	// only trace if there's work to do
-	if base.EnableTrace && base.Flag.LowerT {
-		defer tracePrint("resolve", n)(&res)
-	}
-
-	if sym := n.Sym(); sym.Pkg != types.LocalPkg {
-		return expandDecl(n)
-	}
-
-	r := ir.AsNode(n.Sym().Def)
-	if r == nil {
-		return n
-	}
-
-	return r
+	base.Fatalf("unexpected NONAME node: %+v", n)
+	panic("unreachable")
 }
 
 func typecheckslice(l []ir.Node, top int) {
@@ -309,7 +285,7 @@
 						return n
 					}
 				}
-				base.ErrorfAt(n.Pos(), "invalid recursive type alias %v%s", n, cycleTrace(cycle))
+				base.ErrorfAt(n.Pos(), errors.InvalidDeclCycle, "invalid recursive type alias %v%s", n, cycleTrace(cycle))
 			}
 
 		case ir.OLITERAL:
@@ -317,7 +293,7 @@
 				base.Errorf("%v is not a type", n)
 				break
 			}
-			base.ErrorfAt(n.Pos(), "constant definition loop%s", cycleTrace(cycleFor(n)))
+			base.ErrorfAt(n.Pos(), errors.InvalidInitCycle, "constant definition loop%s", cycleTrace(cycleFor(n)))
 		}
 
 		if base.Errors() == 0 {
@@ -356,10 +332,10 @@
 				isExpr = false
 			}
 		}
-	case ir.OAPPEND:
-		// Must be used (and not BinaryExpr/UnaryExpr).
+	case ir.OAPPEND, ir.OMIN, ir.OMAX:
+		// Must be used.
 		isStmt = false
-	case ir.OCLOSE, ir.ODELETE, ir.OPANIC, ir.OPRINT, ir.OPRINTN:
+	case ir.OCLEAR, ir.OCLOSE, ir.ODELETE, ir.OPANIC, ir.OPRINT, ir.OPRINTN:
 		// Must not be used.
 		isExpr = false
 		isStmt = true
@@ -379,10 +355,6 @@
 			types.CheckSize(t)
 		}
 	}
-	if t != nil {
-		n = EvalConst(n)
-		t = n.Type()
-	}
 
 	// TODO(rsc): Lots of the complexity here is because typecheck can
 	// see OTYPE, ONAME, and OLITERAL nodes multiple times.
@@ -540,9 +512,6 @@
 		if t != nil {
 			n.X, n.Y = l, r
 			n.SetType(types.UntypedBool)
-			if con := EvalConst(n); con.Op() == ir.OLITERAL {
-				return con
-			}
 			n.X, n.Y = defaultlit2(l, r, true)
 		}
 		return n
@@ -630,12 +599,16 @@
 	case ir.OALIGNOF, ir.OOFFSETOF, ir.OSIZEOF:
 		n := n.(*ir.UnaryExpr)
 		n.SetType(types.Types[types.TUINTPTR])
-		return n
+		return OrigInt(n, evalunsafe(n))
 
 	case ir.OCAP, ir.OLEN:
 		n := n.(*ir.UnaryExpr)
 		return tcLenCap(n)
 
+	case ir.OMIN, ir.OMAX:
+		n := n.(*ir.CallExpr)
+		return tcMinMax(n)
+
 	case ir.OREAL, ir.OIMAG:
 		n := n.(*ir.UnaryExpr)
 		return tcRealImag(n)
@@ -644,6 +617,10 @@
 		n := n.(*ir.BinaryExpr)
 		return tcComplex(n)
 
+	case ir.OCLEAR:
+		n := n.(*ir.UnaryExpr)
+		return tcClear(n)
+
 	case ir.OCLOSE:
 		n := n.(*ir.UnaryExpr)
 		return tcClose(n)
@@ -907,7 +884,7 @@
 
 	tmp := Temp((*np).Type())
 	as := ir.NewAssignStmt(base.Pos, tmp, *np)
-	as.Def = true
+	as.PtrInit().Append(Stmt(ir.NewDecl(n.Pos(), ir.ODCL, tmp)))
 	*np = tmp
 
 	if static {
@@ -1469,7 +1446,7 @@
 	return t.String()
 }
 
-// sigerr returns the signature of the types at the call or return.
+// fmtSignature returns the signature of the types at the call or return.
 func fmtSignature(nl ir.Nodes, isddd bool) string {
 	if len(nl) < 1 {
 		return "()"
@@ -1624,7 +1601,7 @@
 	var l []ir.Node
 	i := 0
 	for _, r := range ir.StringVal(n.X) {
-		l = append(l, ir.NewKeyExpr(base.Pos, ir.NewInt(int64(i)), ir.NewInt(int64(r))))
+		l = append(l, ir.NewKeyExpr(base.Pos, ir.NewInt(base.Pos, int64(i)), ir.NewInt(base.Pos, int64(r))))
 		i++
 	}
 
@@ -1692,147 +1669,6 @@
 	return true
 }
 
-// markBreak marks control statements containing break statements with SetHasBreak(true).
-func markBreak(fn *ir.Func) {
-	var labels map[*types.Sym]ir.Node
-	var implicit ir.Node
-
-	var mark func(ir.Node) bool
-	mark = func(n ir.Node) bool {
-		switch n.Op() {
-		default:
-			ir.DoChildren(n, mark)
-
-		case ir.OBREAK:
-			n := n.(*ir.BranchStmt)
-			if n.Label == nil {
-				setHasBreak(implicit)
-			} else {
-				setHasBreak(labels[n.Label])
-			}
-
-		case ir.OFOR, ir.OSWITCH, ir.OSELECT, ir.ORANGE:
-			old := implicit
-			implicit = n
-			var sym *types.Sym
-			switch n := n.(type) {
-			case *ir.ForStmt:
-				sym = n.Label
-			case *ir.RangeStmt:
-				sym = n.Label
-			case *ir.SelectStmt:
-				sym = n.Label
-			case *ir.SwitchStmt:
-				sym = n.Label
-			}
-			if sym != nil {
-				if labels == nil {
-					// Map creation delayed until we need it - most functions don't.
-					labels = make(map[*types.Sym]ir.Node)
-				}
-				labels[sym] = n
-			}
-			ir.DoChildren(n, mark)
-			if sym != nil {
-				delete(labels, sym)
-			}
-			implicit = old
-		}
-		return false
-	}
-
-	mark(fn)
-}
-
-func setHasBreak(n ir.Node) {
-	switch n := n.(type) {
-	default:
-		base.Fatalf("setHasBreak %+v", n.Op())
-	case nil:
-		// ignore
-	case *ir.ForStmt:
-		n.HasBreak = true
-	case *ir.RangeStmt:
-		n.HasBreak = true
-	case *ir.SelectStmt:
-		n.HasBreak = true
-	case *ir.SwitchStmt:
-		n.HasBreak = true
-	}
-}
-
-// isTermNodes reports whether the Nodes list ends with a terminating statement.
-func isTermNodes(l ir.Nodes) bool {
-	s := l
-	c := len(s)
-	if c == 0 {
-		return false
-	}
-	return isTermNode(s[c-1])
-}
-
-// isTermNode reports whether the node n, the last one in a
-// statement list, is a terminating statement.
-func isTermNode(n ir.Node) bool {
-	switch n.Op() {
-	// NOTE: OLABEL is treated as a separate statement,
-	// not a separate prefix, so skipping to the last statement
-	// in the block handles the labeled statement case by
-	// skipping over the label. No case OLABEL here.
-
-	case ir.OBLOCK:
-		n := n.(*ir.BlockStmt)
-		return isTermNodes(n.List)
-
-	case ir.OGOTO, ir.ORETURN, ir.OTAILCALL, ir.OPANIC, ir.OFALL:
-		return true
-
-	case ir.OFOR:
-		n := n.(*ir.ForStmt)
-		if n.Cond != nil {
-			return false
-		}
-		if n.HasBreak {
-			return false
-		}
-		return true
-
-	case ir.OIF:
-		n := n.(*ir.IfStmt)
-		return isTermNodes(n.Body) && isTermNodes(n.Else)
-
-	case ir.OSWITCH:
-		n := n.(*ir.SwitchStmt)
-		if n.HasBreak {
-			return false
-		}
-		def := false
-		for _, cas := range n.Cases {
-			if !isTermNodes(cas.Body) {
-				return false
-			}
-			if len(cas.List) == 0 { // default
-				def = true
-			}
-		}
-		return def
-
-	case ir.OSELECT:
-		n := n.(*ir.SelectStmt)
-		if n.HasBreak {
-			return false
-		}
-		for _, cas := range n.Cases {
-			if !isTermNodes(cas.Body) {
-				return false
-			}
-		}
-		return true
-	}
-
-	return false
-}
-
 func Conv(n ir.Node, t *types.Type) ir.Node {
 	if types.IdenticalStrict(n.Type(), t) {
 		return n
diff --git a/src/cmd/compile/internal/typecheck/universe.go b/src/cmd/compile/internal/typecheck/universe.go
index 828a8db..e43bede 100644
--- a/src/cmd/compile/internal/typecheck/universe.go
+++ b/src/cmd/compile/internal/typecheck/universe.go
@@ -34,6 +34,7 @@
 }{
 	{"append", ir.OAPPEND},
 	{"cap", ir.OCAP},
+	{"clear", ir.OCLEAR},
 	{"close", ir.OCLOSE},
 	{"complex", ir.OCOMPLEX},
 	{"copy", ir.OCOPY},
@@ -41,6 +42,8 @@
 	{"imag", ir.OIMAG},
 	{"len", ir.OLEN},
 	{"make", ir.OMAKE},
+	{"max", ir.OMAX},
+	{"min", ir.OMIN},
 	{"new", ir.ONEW},
 	{"panic", ir.OPANIC},
 	{"print", ir.OPRINT},
@@ -95,8 +98,8 @@
 	s = Lookup("_")
 	types.BlankSym = s
 	s.Def = NewName(s)
-	ir.AsNode(s.Def).SetType(types.Types[types.TBLANK])
 	ir.BlankNode = ir.AsNode(s.Def)
+	ir.BlankNode.SetType(types.Types[types.TBLANK])
 	ir.BlankNode.SetTypecheck(1)
 
 	s = types.BuiltinPkg.Lookup("_")
diff --git a/src/cmd/compile/internal/types/alg.go b/src/cmd/compile/internal/types/alg.go
index c1f93fc..8d56dec 100644
--- a/src/cmd/compile/internal/types/alg.go
+++ b/src/cmd/compile/internal/types/alg.go
@@ -13,7 +13,6 @@
 //go:generate stringer -type AlgKind -trimprefix A alg.go
 
 const (
-	// These values are known by runtime.
 	ANOEQ AlgKind = iota
 	AMEM0
 	AMEM8
diff --git a/src/cmd/compile/internal/types/fmt.go b/src/cmd/compile/internal/types/fmt.go
index 990f2e5..c5d9941 100644
--- a/src/cmd/compile/internal/types/fmt.go
+++ b/src/cmd/compile/internal/types/fmt.go
@@ -488,9 +488,6 @@
 			}
 			b.WriteString("func")
 		}
-		if t.NumTParams() > 0 {
-			tconv2(b, t.TParams(), 0, mode, visited)
-		}
 		tconv2(b, t.Params(), 0, mode, visited)
 
 		switch t.NumResults() {
@@ -571,27 +568,6 @@
 	case TUNSAFEPTR:
 		b.WriteString("unsafe.Pointer")
 
-	case TTYPEPARAM:
-		if t.Sym() != nil {
-			sconv2(b, t.Sym(), 'v', mode)
-		} else {
-			b.WriteString("tp")
-			// Print out the pointer value for now to disambiguate type params
-			fmt.Fprintf(b, "%p", t)
-		}
-
-	case TUNION:
-		for i := 0; i < t.NumTerms(); i++ {
-			if i > 0 {
-				b.WriteString("|")
-			}
-			elem, tilde := t.Term(i)
-			if tilde {
-				b.WriteString("~")
-			}
-			tconv2(b, elem, 0, mode, visited)
-		}
-
 	case Txxx:
 		b.WriteString("Txxx")
 
@@ -666,9 +642,6 @@
 				name = fmt.Sprint(f.Nname)
 			} else if verb == 'L' {
 				name = s.Name
-				if name == ".F" {
-					name = "F" // Hack for toolstash -cmp.
-				}
 				if !IsExported(name) && mode != fmtTypeIDName {
 					name = sconv(s, 0, mode) // qualify non-exported names (used on structs, not on funarg)
 				}
diff --git a/src/cmd/compile/internal/types/goversion.go b/src/cmd/compile/internal/types/goversion.go
index 3ece95b..c57493a 100644
--- a/src/cmd/compile/internal/types/goversion.go
+++ b/src/cmd/compile/internal/types/goversion.go
@@ -7,8 +7,8 @@
 import (
 	"fmt"
 	"internal/goversion"
+	"internal/lazyregexp"
 	"log"
-	"regexp"
 	"strconv"
 
 	"cmd/compile/internal/base"
@@ -81,4 +81,4 @@
 
 // goVersionRE is a regular expression that matches the valid
 // arguments to the -lang flag.
-var goVersionRE = regexp.MustCompile(`^go([1-9]\d*)\.(0|[1-9]\d*)$`)
+var goVersionRE = lazyregexp.New(`^go([1-9]\d*)\.(0|[1-9]\d*)$`)
diff --git a/src/cmd/compile/internal/types/kind_string.go b/src/cmd/compile/internal/types/kind_string.go
index 3e6a8bc..1e1e846 100644
--- a/src/cmd/compile/internal/types/kind_string.go
+++ b/src/cmd/compile/internal/types/kind_string.go
@@ -37,22 +37,20 @@
 	_ = x[TANY-26]
 	_ = x[TSTRING-27]
 	_ = x[TUNSAFEPTR-28]
-	_ = x[TTYPEPARAM-29]
-	_ = x[TUNION-30]
-	_ = x[TIDEAL-31]
-	_ = x[TNIL-32]
-	_ = x[TBLANK-33]
-	_ = x[TFUNCARGS-34]
-	_ = x[TCHANARGS-35]
-	_ = x[TSSA-36]
-	_ = x[TTUPLE-37]
-	_ = x[TRESULTS-38]
-	_ = x[NTYPE-39]
+	_ = x[TIDEAL-29]
+	_ = x[TNIL-30]
+	_ = x[TBLANK-31]
+	_ = x[TFUNCARGS-32]
+	_ = x[TCHANARGS-33]
+	_ = x[TSSA-34]
+	_ = x[TTUPLE-35]
+	_ = x[TRESULTS-36]
+	_ = x[NTYPE-37]
 }
 
-const _Kind_name = "xxxINT8UINT8INT16UINT16INT32UINT32INT64UINT64INTUINTUINTPTRCOMPLEX64COMPLEX128FLOAT32FLOAT64BOOLPTRFUNCSLICEARRAYSTRUCTCHANMAPINTERFORWANYSTRINGUNSAFEPTRTYPEPARAMUNIONIDEALNILBLANKFUNCARGSCHANARGSSSATUPLERESULTSNTYPE"
+const _Kind_name = "xxxINT8UINT8INT16UINT16INT32UINT32INT64UINT64INTUINTUINTPTRCOMPLEX64COMPLEX128FLOAT32FLOAT64BOOLPTRFUNCSLICEARRAYSTRUCTCHANMAPINTERFORWANYSTRINGUNSAFEPTRIDEALNILBLANKFUNCARGSCHANARGSSSATUPLERESULTSNTYPE"
 
-var _Kind_index = [...]uint8{0, 3, 7, 12, 17, 23, 28, 34, 39, 45, 48, 52, 59, 68, 78, 85, 92, 96, 99, 103, 108, 113, 119, 123, 126, 131, 135, 138, 144, 153, 162, 167, 172, 175, 180, 188, 196, 199, 204, 211, 216}
+var _Kind_index = [...]uint8{0, 3, 7, 12, 17, 23, 28, 34, 39, 45, 48, 52, 59, 68, 78, 85, 92, 96, 99, 103, 108, 113, 119, 123, 126, 131, 135, 138, 144, 153, 158, 161, 166, 174, 182, 185, 190, 197, 202}
 
 func (i Kind) String() string {
 	if i >= Kind(len(_Kind_index)-1) {
diff --git a/src/cmd/compile/internal/types/scope.go b/src/cmd/compile/internal/types/scope.go
index e577b7a..438a3f9 100644
--- a/src/cmd/compile/internal/types/scope.go
+++ b/src/cmd/compile/internal/types/scope.go
@@ -4,96 +4,8 @@
 
 package types
 
-import (
-	"cmd/compile/internal/base"
-)
-
-// Declaration stack & operations
-
-// A dsym stores a symbol's shadowed declaration so that it can be
-// restored once the block scope ends.
-type dsym struct {
-	sym *Sym // sym == nil indicates stack mark
-	def Object
-}
-
-// dclstack maintains a stack of shadowed symbol declarations so that
-// Popdcl can restore their declarations when a block scope ends.
-var dclstack []dsym
-
-// Pushdcl pushes the current declaration for symbol s (if any) so that
-// it can be shadowed by a new declaration within a nested block scope.
-func Pushdcl(s *Sym) {
-	dclstack = append(dclstack, dsym{
-		sym: s,
-		def: s.Def,
-	})
-}
-
-// Popdcl pops the innermost block scope and restores all symbol declarations
-// to their previous state.
-func Popdcl() {
-	for i := len(dclstack); i > 0; i-- {
-		d := &dclstack[i-1]
-		s := d.sym
-		if s == nil {
-			// pop stack mark
-			dclstack = dclstack[:i-1]
-			return
-		}
-
-		s.Def = d.def
-
-		// Clear dead pointer fields.
-		d.sym = nil
-		d.def = nil
-	}
-	base.Fatalf("popdcl: no stack mark")
-}
-
-// Markdcl records the start of a new block scope for declarations.
-func Markdcl() {
-	dclstack = append(dclstack, dsym{
-		sym: nil, // stack mark
-	})
-}
-
-func isDclstackValid() bool {
-	for _, d := range dclstack {
-		if d.sym == nil {
-			return false
-		}
-	}
-	return true
-}
-
 // PkgDef returns the definition associated with s at package scope.
-func (s *Sym) PkgDef() Object {
-	return *s.pkgDefPtr()
-}
+func (s *Sym) PkgDef() Object { return s.Def }
 
 // SetPkgDef sets the definition associated with s at package scope.
-func (s *Sym) SetPkgDef(n Object) {
-	*s.pkgDefPtr() = n
-}
-
-func (s *Sym) pkgDefPtr() *Object {
-	// Look for outermost saved declaration, which must be the
-	// package scope definition, if present.
-	for i := range dclstack {
-		d := &dclstack[i]
-		if s == d.sym {
-			return &d.def
-		}
-	}
-
-	// Otherwise, the declaration hasn't been shadowed within a
-	// function scope.
-	return &s.Def
-}
-
-func CheckDclstack() {
-	if !isDclstackValid() {
-		base.Fatalf("mark left on the dclstack")
-	}
-}
+func (s *Sym) SetPkgDef(n Object) { s.Def = n }
diff --git a/src/cmd/compile/internal/types/size.go b/src/cmd/compile/internal/types/size.go
index e655a36..1c20350 100644
--- a/src/cmd/compile/internal/types/size.go
+++ b/src/cmd/compile/internal/types/size.go
@@ -9,6 +9,7 @@
 
 	"cmd/compile/internal/base"
 	"cmd/internal/src"
+	"internal/types/errors"
 )
 
 var PtrSize int
@@ -84,7 +85,7 @@
 		case !explicit && Identical(m.Type, prev.Type):
 			return
 		default:
-			base.ErrorfAt(m.Pos, "duplicate method %s", m.Sym.Name)
+			base.ErrorfAt(m.Pos, errors.DuplicateDecl, "duplicate method %s", m.Sym.Name)
 		}
 		methods = append(methods, m)
 	}
@@ -123,10 +124,6 @@
 			continue
 		}
 
-		if m.Type.IsUnion() {
-			continue
-		}
-
 		// In 1.18, embedded types can be anything. In Go 1.17, we disallow
 		// embedding anything other than interfaces. This requirement was caught
 		// by types2 already, so allow non-interface here.
@@ -151,7 +148,7 @@
 	sort.Sort(MethodsByName(methods))
 
 	if int64(len(methods)) >= MaxWidth/int64(PtrSize) {
-		base.ErrorfAt(typePos(t), "interface too large")
+		base.ErrorfAt(typePos(t), 0, "interface too large")
 	}
 	for i, m := range methods {
 		m.Offset = int64(i) * int64(PtrSize)
@@ -216,7 +213,7 @@
 			maxwidth = 1<<31 - 1
 		}
 		if o >= maxwidth {
-			base.ErrorfAt(typePos(errtype), "type %L too large", errtype)
+			base.ErrorfAt(typePos(errtype), 0, "type %L too large", errtype)
 			o = 8 // small but nonzero
 		}
 	}
@@ -343,12 +340,6 @@
 		t.align = uint8(PtrSize)
 		expandiface(t)
 
-	case TUNION:
-		// Always part of an interface for now, so size/align don't matter.
-		// Pretend a union is represented like an interface.
-		w = 2 * int64(PtrSize)
-		t.align = uint8(PtrSize)
-
 	case TCHAN: // implemented as pointer
 		w = int64(PtrSize)
 
@@ -445,11 +436,6 @@
 			base.Warn("bad type %v %d\n", t1, w)
 		}
 		t.align = 1
-
-	case TTYPEPARAM:
-		// TODO(danscales) - remove when we eliminate the need
-		// to do CalcSize in noder2 (which shouldn't be needed in the noder)
-		w = int64(PtrSize)
 	}
 
 	if PtrSize == 4 && w != int64(int32(w)) {
diff --git a/src/cmd/compile/internal/types/sizeof_test.go b/src/cmd/compile/internal/types/sizeof_test.go
index e834266..76ccbd5 100644
--- a/src/cmd/compile/internal/types/sizeof_test.go
+++ b/src/cmd/compile/internal/types/sizeof_test.go
@@ -21,12 +21,12 @@
 		_64bit uintptr     // size on 64bit platforms
 	}{
 		{Sym{}, 32, 64},
-		{Type{}, 60, 104},
+		{Type{}, 56, 96},
 		{Map{}, 20, 40},
 		{Forward{}, 20, 32},
-		{Func{}, 28, 48},
-		{Struct{}, 16, 32},
-		{Interface{}, 8, 16},
+		{Func{}, 20, 32},
+		{Struct{}, 12, 24},
+		{Interface{}, 0, 0},
 		{Chan{}, 8, 16},
 		{Array{}, 12, 16},
 		{FuncArgs{}, 4, 8},
diff --git a/src/cmd/compile/internal/types/structuraltype.go b/src/cmd/compile/internal/types/structuraltype.go
deleted file mode 100644
index ee1341b..0000000
--- a/src/cmd/compile/internal/types/structuraltype.go
+++ /dev/null
@@ -1,191 +0,0 @@
-// Copyright 2022 The Go Authors. 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
-
-// Implementation of structural type computation for types.
-
-// TODO: we would like to depend only on the types2 computation of structural type,
-// but we can only do that the next time we change the export format and export
-// structural type info along with each constraint type, since the compiler imports
-// types directly into types1 format.
-
-// A term describes elementary type sets:
-//
-// term{false, T}  set of type T
-// term{true, T}   set of types with underlying type t
-// term{}          empty set (we specifically check for typ == nil)
-type term struct {
-	tilde bool
-	typ   *Type
-}
-
-// StructuralType returns the structural type of an interface, or nil if it has no
-// structural type.
-func (t *Type) StructuralType() *Type {
-	sts, _ := specificTypes(t)
-	var su *Type
-	for _, st := range sts {
-		u := st.typ.Underlying()
-		if su != nil {
-			u = match(su, u)
-			if u == nil {
-				return nil
-			}
-		}
-		// su == nil || match(su, u) != nil
-		su = u
-	}
-	return su
-}
-
-// If x and y are identical, match returns x.
-// If x and y are identical channels but for their direction
-// and one of them is unrestricted, match returns the channel
-// with the restricted direction.
-// In all other cases, match returns nil.
-// x and y are assumed to be underlying types, hence are not named types.
-func match(x, y *Type) *Type {
-	if IdenticalStrict(x, y) {
-		return x
-	}
-
-	if x.IsChan() && y.IsChan() && IdenticalStrict(x.Elem(), y.Elem()) {
-		// We have channels that differ in direction only.
-		// If there's an unrestricted channel, select the restricted one.
-		// If both have the same direction, return x (either is fine).
-		switch {
-		case x.ChanDir().CanSend() && x.ChanDir().CanRecv():
-			return y
-		case y.ChanDir().CanSend() && y.ChanDir().CanRecv():
-			return x
-		}
-	}
-	return nil
-}
-
-// specificTypes returns the list of specific types of an interface type or nil if
-// there are none. It also returns a flag that indicates, for an empty term list
-// result, whether it represents the empty set, or the infinite set of all types (in
-// both cases, there are no specific types).
-func specificTypes(t *Type) (list []term, inf bool) {
-	t.wantEtype(TINTER)
-
-	// We have infinite term list before processing any type elements
-	// (or if there are no type elements).
-	inf = true
-	for _, m := range t.Methods().Slice() {
-		var r2 []term
-		inf2 := false
-
-		switch {
-		case m.IsMethod():
-			inf2 = true
-
-		case m.Type.IsUnion():
-			nt := m.Type.NumTerms()
-			for i := 0; i < nt; i++ {
-				t, tilde := m.Type.Term(i)
-				if t.IsInterface() {
-					r3, r3inf := specificTypes(t)
-					if r3inf {
-						// Union with an infinite set of types is
-						// infinite, so skip remaining terms.
-						r2 = nil
-						inf2 = true
-						break
-					}
-					// Add the elements of r3 to r2.
-					for _, r3e := range r3 {
-						r2 = insertType(r2, r3e)
-					}
-				} else {
-					r2 = insertType(r2, term{tilde, t})
-				}
-			}
-
-		case m.Type.IsInterface():
-			r2, inf2 = specificTypes(m.Type)
-
-		default:
-			// m.Type is a single non-interface type, so r2 is just a
-			// one-element list, inf2 is false.
-			r2 = []term{{false, m.Type}}
-		}
-
-		if inf2 {
-			// If the current type element has infinite types,
-			// its intersection with r is just r, so skip this type element.
-			continue
-		}
-
-		if inf {
-			// If r is infinite, then the intersection of r and r2 is just r2.
-			list = r2
-			inf = false
-			continue
-		}
-
-		// r and r2 are finite, so intersect r and r2.
-		var r3 []term
-		for _, re := range list {
-			for _, r2e := range r2 {
-				if tm := intersect(re, r2e); tm.typ != nil {
-					r3 = append(r3, tm)
-				}
-			}
-		}
-		list = r3
-	}
-	return
-}
-
-// insertType adds t to the returned list if it is not already in list.
-func insertType(list []term, tm term) []term {
-	for i, elt := range list {
-		if new := union(elt, tm); new.typ != nil {
-			// Replace existing elt with the union of elt and new.
-			list[i] = new
-			return list
-		}
-	}
-	return append(list, tm)
-}
-
-// If x and y are disjoint, return term with nil typ (which means the union should
-// include both types). If x and y are not disjoint, return the single type which is
-// the union of x and y.
-func union(x, y term) term {
-	if disjoint(x, y) {
-		return term{false, nil}
-	}
-	if x.tilde || !y.tilde {
-		return x
-	}
-	return y
-}
-
-// intersect returns the intersection x ∩ y.
-func intersect(x, y term) term {
-	if disjoint(x, y) {
-		return term{false, nil}
-	}
-	if !x.tilde || y.tilde {
-		return x
-	}
-	return y
-}
-
-// disjoint reports whether x ∩ y == ∅.
-func disjoint(x, y term) bool {
-	ux := x.typ
-	if y.tilde {
-		ux = ux.Underlying()
-	}
-	uy := y.typ
-	if x.tilde {
-		uy = uy.Underlying()
-	}
-	return !IdenticalStrict(ux, uy)
-}
diff --git a/src/cmd/compile/internal/types/structuraltype_test.go b/src/cmd/compile/internal/types/structuraltype_test.go
deleted file mode 100644
index cce3334..0000000
--- a/src/cmd/compile/internal/types/structuraltype_test.go
+++ /dev/null
@@ -1,138 +0,0 @@
-// Copyright 2022 The Go 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 StructuralType() calculates the correct value of structural type for
-// unusual cases.
-
-package types_test
-
-import (
-	"cmd/compile/internal/ir"
-	. "cmd/compile/internal/types"
-	"cmd/internal/src"
-	"testing"
-)
-
-type test struct {
-	typ            *Type
-	structuralType *Type
-}
-
-func TestStructuralType(t *testing.T) {
-	// These are the few constants that need to be initialized in order to use
-	// the types package without using the typecheck package by calling
-	// typecheck.InitUniverse() (the normal way to initialize the types package).
-	PtrSize = 8
-	RegSize = 8
-	MaxWidth = 1 << 50
-
-	InitTypes(func(sym *Sym, typ *Type) Object {
-		obj := ir.NewDeclNameAt(src.NoXPos, ir.OTYPE, sym)
-		obj.SetType(typ)
-		sym.Def = obj
-		return obj
-	})
-
-	// type intType = int
-	intType := Types[TINT]
-	// type structf = struct { f int }
-	structf := NewStruct(nil, []*Field{
-		NewField(src.NoXPos, LocalPkg.Lookup("f"), intType),
-	})
-
-	defNamed := func(name string, underlying *Type) *Type {
-		sym := LocalPkg.Lookup(name)
-		obj := ir.NewDeclNameAt(src.NoXPos, ir.OTYPE, sym)
-		typ := NewNamed(obj)
-		typ.SetUnderlying(underlying)
-		return typ
-	}
-
-	Sf := defNamed("Sf", structf) // type Sf structf
-	A := defNamed("A", intType)   // type A int
-	B := defNamed("B", intType)   // type B int
-
-	any := AnyType
-
-	// The tests marked NONE have no structural type; all the others have a
-	// structural type of structf - "struct { f int }"
-	tests := []*test{
-		{
-			// interface { struct { f int } }
-			embed(structf),
-			structf,
-		},
-		{
-			// interface { struct { f int }; any }
-			embed(structf, any),
-			structf,
-		},
-		{
-			// interface { Sf }
-			embed(Sf),
-			structf,
-		},
-		{
-			// interface { any; Sf }
-			embed(any, Sf),
-			structf,
-		},
-		{
-			// interface { struct { f int }; Sf } - NONE
-			embed(structf, Sf),
-			nil,
-		},
-		{
-			// interface { struct { f int } | ~struct { f int } }
-			embed(NewUnion([]*Type{structf, structf}, []bool{false, true})),
-			structf,
-		},
-		{
-			// interface { ~struct { f int } ; Sf }
-			embed(NewUnion([]*Type{structf}, []bool{true}), Sf),
-			structf,
-		},
-		{
-			// interface { struct { f int } ; Sf } - NONE
-			embed(NewUnion([]*Type{structf}, []bool{false}), Sf),
-			nil,
-		},
-		{
-			// interface { Sf | A; B | Sf}
-			embed(NewUnion([]*Type{Sf, A}, []bool{false, false}),
-				NewUnion([]*Type{B, Sf}, []bool{false, false})),
-			structf,
-		},
-		{
-			// interface { Sf | A; A | Sf } - NONE
-			embed(NewUnion([]*Type{Sf, A}, []bool{false, false}),
-				NewUnion([]*Type{A, Sf}, []bool{false, false})),
-			nil,
-		},
-		{
-			// interface { Sf | any } - NONE
-			embed(NewUnion([]*Type{Sf, any}, []bool{false, false})),
-			nil,
-		},
-		{
-			// interface { Sf | any; Sf }
-			embed(NewUnion([]*Type{Sf, any}, []bool{false, false}), Sf),
-			structf,
-		},
-	}
-	for i, tst := range tests {
-		if got, want := tst.typ.StructuralType(), tst.structuralType; got != want {
-			t.Errorf("#%v: StructuralType(%v) = %v, wanted %v",
-				i, tst.typ, got, want)
-		}
-	}
-}
-
-func embed(types ...*Type) *Type {
-	fields := make([]*Field, len(types))
-	for i, t := range types {
-		fields[i] = NewField(src.NoXPos, nil, t)
-	}
-	return NewInterface(LocalPkg, fields, false)
-}
diff --git a/src/cmd/compile/internal/types/sym.go b/src/cmd/compile/internal/types/sym.go
index 9d8707b..67fa6bb 100644
--- a/src/cmd/compile/internal/types/sym.go
+++ b/src/cmd/compile/internal/types/sym.go
@@ -35,8 +35,6 @@
 	// bound to within the current scope. (Most parts of the compiler should
 	// prefer passing the Node directly, rather than relying on this field.)
 	//
-	// Def is saved and restored by Pushdcl/Popdcl.
-	//
 	// Deprecated: New code should avoid depending on Sym.Def. Add
 	// mdempsky@ as a reviewer for any CLs involving Sym.Def.
 	Def Object
diff --git a/src/cmd/compile/internal/types/type.go b/src/cmd/compile/internal/types/type.go
index 4bdbc3d..c390b81 100644
--- a/src/cmd/compile/internal/types/type.go
+++ b/src/cmd/compile/internal/types/type.go
@@ -8,7 +8,7 @@
 	"cmd/compile/internal/base"
 	"cmd/internal/src"
 	"fmt"
-	"strings"
+	"internal/types/errors"
 	"sync"
 )
 
@@ -61,8 +61,6 @@
 	TANY
 	TSTRING
 	TUNSAFEPTR
-	TTYPEPARAM
-	TUNION
 
 	// pseudo-types for literals
 	TIDEAL // untyped numeric constants
@@ -155,8 +153,6 @@
 	// TARRAY: *Array
 	// TSLICE: Slice
 	// TSSA: string
-	// TTYPEPARAM:  *Typeparam
-	// TUNION: *Union
 	extra interface{}
 
 	// width is the width of this Type in bytes.
@@ -194,11 +190,6 @@
 	// instantiated from a generic type, and is otherwise set to nil.
 	// TODO(danscales): choose a better name.
 	rparams *[]*Type
-
-	// For an instantiated generic type, the base generic type.
-	// This backpointer is useful, because the base type is the type that has
-	// the method bodies.
-	origType *Type
 }
 
 func (*Type) CanBeAnSSAAux() {}
@@ -208,16 +199,14 @@
 	typeNoalg                  // suppress hash and eq algorithm generation
 	typeDeferwidth             // width computation has been deferred and type is on deferredTypeStack
 	typeRecur
-	typeHasTParam // there is a typeparam somewhere in the type (generic function or type)
-	typeIsShape   // represents a set of closely related types, for generics
-	typeHasShape  // there is a shape somewhere in the type
+	typeIsShape  // represents a set of closely related types, for generics
+	typeHasShape // there is a shape somewhere in the type
 )
 
 func (t *Type) NotInHeap() bool  { return t.flags&typeNotInHeap != 0 }
 func (t *Type) Noalg() bool      { return t.flags&typeNoalg != 0 }
 func (t *Type) Deferwidth() bool { return t.flags&typeDeferwidth != 0 }
 func (t *Type) Recur() bool      { return t.flags&typeRecur != 0 }
-func (t *Type) HasTParam() bool  { return t.flags&typeHasTParam != 0 }
 func (t *Type) IsShape() bool    { return t.flags&typeIsShape != 0 }
 func (t *Type) HasShape() bool   { return t.flags&typeHasShape != 0 }
 
@@ -226,9 +215,6 @@
 func (t *Type) SetDeferwidth(b bool) { t.flags.set(typeDeferwidth, b) }
 func (t *Type) SetRecur(b bool)      { t.flags.set(typeRecur, b) }
 
-// Generic types should never have alg functions.
-func (t *Type) SetHasTParam(b bool) { t.flags.set(typeHasTParam, b); t.flags.set(typeNoalg, b) }
-
 // Should always do SetHasShape(true) when doing SetIsShape(true).
 func (t *Type) SetIsShape(b bool)  { t.flags.set(typeIsShape, b) }
 func (t *Type) SetHasShape(b bool) { t.flags.set(typeHasShape, b) }
@@ -244,11 +230,6 @@
 	return nil
 }
 
-// OrigType returns the original generic type that t is an
-// instantiation of, if any.
-func (t *Type) OrigType() *Type        { return t.origType }
-func (t *Type) SetOrigType(orig *Type) { t.origType = orig }
-
 // Underlying returns the underlying type of type t.
 func (t *Type) Underlying() *Type { return t.underlying }
 
@@ -273,14 +254,8 @@
 		base.Fatalf("Setting nil or zero-length rparams")
 	}
 	t.rparams = &rparams
-	// HasTParam should be set if any rparam is or has a type param. This is
-	// to handle the case of a generic type which doesn't reference any of its
-	// type params (e.g. most commonly, an empty struct).
+	// HasShape should be set if any type argument is or has a shape type.
 	for _, rparam := range rparams {
-		if rparam.HasTParam() {
-			t.SetHasTParam(true)
-			break
-		}
 		if rparam.HasShape() {
 			t.SetHasShape(true)
 			break
@@ -288,49 +263,11 @@
 	}
 }
 
-// IsBaseGeneric returns true if t is a generic type (not reinstantiated with
-// another type params or fully instantiated.
-func (t *Type) IsBaseGeneric() bool {
-	return len(t.RParams()) > 0 && strings.Index(t.Sym().Name, "[") < 0
-}
-
-// IsInstantiatedGeneric returns t if t ia generic type that has been
-// reinstantiated with new typeparams (i.e. is not fully instantiated).
-func (t *Type) IsInstantiatedGeneric() bool {
-	return len(t.RParams()) > 0 && strings.Index(t.Sym().Name, "[") >= 0 &&
-		t.HasTParam()
-}
-
 // IsFullyInstantiated reports whether t is a fully instantiated generic type; i.e. an
 // instantiated generic type where all type arguments are non-generic or fully
 // instantiated generic types.
 func (t *Type) IsFullyInstantiated() bool {
-	return len(t.RParams()) > 0 && !t.HasTParam()
-}
-
-// NoPkg is a nil *Pkg value for clarity.
-// It's intended for use when constructing types that aren't exported
-// and thus don't need to be associated with any package.
-var NoPkg *Pkg = nil
-
-// Pkg returns the package that t appeared in.
-//
-// Pkg is only defined for function, struct, and interface types
-// (i.e., types with named elements). This information isn't used by
-// cmd/compile itself, but we need to track it because it's exposed by
-// the go/types API.
-func (t *Type) Pkg() *Pkg {
-	switch t.kind {
-	case TFUNC:
-		return t.extra.(*Func).pkg
-	case TSTRUCT:
-		return t.extra.(*Struct).pkg
-	case TINTER:
-		return t.extra.(*Interface).pkg
-	default:
-		base.Fatalf("Pkg: unexpected kind: %v", t)
-		return nil
-	}
+	return len(t.RParams()) > 0
 }
 
 // Map contains Type fields specific to maps.
@@ -366,9 +303,6 @@
 	Receiver *Type // function receiver
 	Results  *Type // function results
 	Params   *Type // function params
-	TParams  *Type // type params of receiver (if method) or function
-
-	pkg *Pkg
 
 	// Argwid is the total width of the function receiver, params, and results.
 	// It gets calculated via a temporary TFUNCARGS type.
@@ -385,7 +319,6 @@
 // StructType contains Type fields specific to struct types.
 type Struct struct {
 	fields Fields
-	pkg    *Pkg
 
 	// Maps have three associated internal structs (see struct MapType).
 	// Map links such structs back to their map type.
@@ -413,20 +346,6 @@
 
 // Interface contains Type fields specific to interface types.
 type Interface struct {
-	pkg      *Pkg
-	implicit bool
-}
-
-// Typeparam contains Type fields specific to typeparam types.
-type Typeparam struct {
-	index int // type parameter index in source order, starting at 0
-	bound *Type
-}
-
-// Union contains Type fields specific to union types.
-type Union struct {
-	terms  []*Type
-	tildes []bool // whether terms[i] is of form ~T
 }
 
 // Ptr contains Type fields specific to pointer types.
@@ -579,7 +498,7 @@
 	*f.s = append(*f.s, s...)
 }
 
-// New returns a new Type of the specified kind.
+// newType returns a new Type of the specified kind.
 func newType(et Kind) *Type {
 	t := &Type{
 		kind:  et,
@@ -610,10 +529,6 @@
 		t.extra = new(Tuple)
 	case TRESULTS:
 		t.extra = new(Results)
-	case TTYPEPARAM:
-		t.extra = new(Typeparam)
-	case TUNION:
-		t.extra = new(Union)
 	}
 	return t
 }
@@ -625,9 +540,6 @@
 	}
 	t := newType(TARRAY)
 	t.extra = &Array{Elem: elem, Bound: bound}
-	if elem.HasTParam() {
-		t.SetHasTParam(true)
-	}
 	if elem.HasShape() {
 		t.SetHasShape(true)
 	}
@@ -640,8 +552,8 @@
 		if t.Elem() != elem {
 			base.Fatalf("elem mismatch")
 		}
-		if elem.HasTParam() != t.HasTParam() || elem.HasShape() != t.HasShape() {
-			base.Fatalf("Incorrect HasTParam/HasShape flag for cached slice type")
+		if elem.HasShape() != t.HasShape() {
+			base.Fatalf("Incorrect HasShape flag for cached slice type")
 		}
 		return t
 	}
@@ -649,9 +561,6 @@
 	t := newType(TSLICE)
 	t.extra = Slice{Elem: elem}
 	elem.cache.slice = t
-	if elem.HasTParam() {
-		t.SetHasTParam(true)
-	}
 	if elem.HasShape() {
 		t.SetHasShape(true)
 	}
@@ -664,9 +573,6 @@
 	ct := t.ChanType()
 	ct.Elem = elem
 	ct.Dir = dir
-	if elem.HasTParam() {
-		t.SetHasTParam(true)
-	}
 	if elem.HasShape() {
 		t.SetHasShape(true)
 	}
@@ -677,9 +583,6 @@
 	t := newType(TTUPLE)
 	t.extra.(*Tuple).first = t1
 	t.extra.(*Tuple).second = t2
-	if t1.HasTParam() || t2.HasTParam() {
-		t.SetHasTParam(true)
-	}
 	if t1.HasShape() || t2.HasShape() {
 		t.SetHasShape(true)
 	}
@@ -711,9 +614,6 @@
 	mt := t.MapType()
 	mt.Key = k
 	mt.Elem = v
-	if k.HasTParam() || v.HasTParam() {
-		t.SetHasTParam(true)
-	}
 	if k.HasShape() || v.HasShape() {
 		t.SetHasShape(true)
 	}
@@ -735,8 +635,8 @@
 		if t.Elem() != elem {
 			base.Fatalf("NewPtr: elem mismatch")
 		}
-		if elem.HasTParam() != t.HasTParam() || elem.HasShape() != t.HasShape() {
-			base.Fatalf("Incorrect HasTParam/HasShape flag for cached pointer type")
+		if elem.HasShape() != t.HasShape() {
+			base.Fatalf("Incorrect HasShape flag for cached pointer type")
 		}
 		return t
 	}
@@ -748,9 +648,6 @@
 	if NewPtrCacheEnabled {
 		elem.cache.ptr = t
 	}
-	if elem.HasTParam() {
-		t.SetHasTParam(true)
-	}
 	if elem.HasShape() {
 		t.SetHasShape(true)
 	}
@@ -897,8 +794,6 @@
 	case TARRAY:
 		x := *t.extra.(*Array)
 		nt.extra = &x
-	case TTYPEPARAM:
-		base.Fatalf("typeparam types cannot be copied")
 	case TTUPLE, TSSA, TRESULTS:
 		base.Fatalf("ssa types cannot be copied")
 	}
@@ -921,12 +816,10 @@
 }
 
 func (t *Type) Recvs() *Type   { return t.FuncType().Receiver }
-func (t *Type) TParams() *Type { return t.FuncType().TParams }
 func (t *Type) Params() *Type  { return t.FuncType().Params }
 func (t *Type) Results() *Type { return t.FuncType().Results }
 
 func (t *Type) NumRecvs() int   { return t.FuncType().Receiver.NumFields() }
-func (t *Type) NumTParams() int { return t.FuncType().TParams.NumFields() }
 func (t *Type) NumParams() int  { return t.FuncType().Params.NumFields() }
 func (t *Type) NumResults() int { return t.FuncType().Results.NumFields() }
 
@@ -1452,7 +1345,7 @@
 	return t.kind == TUNSAFEPTR
 }
 
-// IsUintptr reports whether t is an uintptr.
+// IsUintptr reports whether t is a uintptr.
 func (t *Type) IsUintptr() bool {
 	return t.kind == TUINTPTR
 }
@@ -1504,14 +1397,6 @@
 	return t.kind == TINTER
 }
 
-func (t *Type) IsUnion() bool {
-	return t.kind == TUNION
-}
-
-func (t *Type) IsTypeParam() bool {
-	return t.kind == TTYPEPARAM
-}
-
 // IsEmptyInterface reports whether t is an empty interface type.
 func (t *Type) IsEmptyInterface() bool {
 	return t.IsInterface() && t.AllMethods().Len() == 0
@@ -1759,9 +1644,6 @@
 	if underlying.NotInHeap() {
 		t.SetNotInHeap(true)
 	}
-	if underlying.HasTParam() {
-		t.SetHasTParam(true)
-	}
 	if underlying.HasShape() {
 		t.SetHasShape(true)
 	}
@@ -1782,20 +1664,11 @@
 	// Double-check use of type as embedded type.
 	if ft.Embedlineno.IsKnown() {
 		if t.IsPtr() || t.IsUnsafePtr() {
-			base.ErrorfAt(ft.Embedlineno, "embedded type cannot be a pointer")
+			base.ErrorfAt(ft.Embedlineno, errors.InvalidPtrEmbed, "embedded type cannot be a pointer")
 		}
 	}
 }
 
-func fieldsHasTParam(fields []*Field) bool {
-	for _, f := range fields {
-		if f.Type != nil && f.Type.HasTParam() {
-			return true
-		}
-	}
-	return false
-}
-
 func fieldsHasShape(fields []*Field) bool {
 	for _, f := range fields {
 		if f.Type != nil && f.Type.HasShape() {
@@ -1814,107 +1687,19 @@
 
 // NewInterface returns a new interface for the given methods and
 // embedded types. Embedded types are specified as fields with no Sym.
-func NewInterface(pkg *Pkg, methods []*Field, implicit bool) *Type {
+func NewInterface(methods []*Field) *Type {
 	t := newType(TINTER)
 	t.SetInterface(methods)
 	for _, f := range methods {
 		// f.Type could be nil for a broken interface declaration
-		if f.Type != nil && f.Type.HasTParam() {
-			t.SetHasTParam(true)
-			break
-		}
 		if f.Type != nil && f.Type.HasShape() {
 			t.SetHasShape(true)
 			break
 		}
 	}
-	t.extra.(*Interface).pkg = pkg
-	t.extra.(*Interface).implicit = implicit
 	return t
 }
 
-// NewTypeParam returns a new type param with the specified sym (package and name)
-// and specified index within the typeparam list.
-func NewTypeParam(obj Object, index int) *Type {
-	t := newType(TTYPEPARAM)
-	t.obj = obj
-	t.extra.(*Typeparam).index = index
-	t.SetHasTParam(true)
-	return t
-}
-
-// Index returns the index of the type param within its param list.
-func (t *Type) Index() int {
-	t.wantEtype(TTYPEPARAM)
-	return t.extra.(*Typeparam).index
-}
-
-// SetIndex sets the index of the type param within its param list.
-func (t *Type) SetIndex(i int) {
-	t.wantEtype(TTYPEPARAM)
-	t.extra.(*Typeparam).index = i
-}
-
-// SetBound sets the bound of a typeparam.
-func (t *Type) SetBound(bound *Type) {
-	t.wantEtype(TTYPEPARAM)
-	t.extra.(*Typeparam).bound = bound
-}
-
-// Bound returns the bound of a typeparam.
-func (t *Type) Bound() *Type {
-	t.wantEtype(TTYPEPARAM)
-	return t.extra.(*Typeparam).bound
-}
-
-// IsImplicit reports whether an interface is implicit (i.e. elided from a type
-// parameter constraint).
-func (t *Type) IsImplicit() bool {
-	t.wantEtype(TINTER)
-	return t.extra.(*Interface).implicit
-}
-
-// MarkImplicit marks the interface as implicit.
-func (t *Type) MarkImplicit() {
-	t.wantEtype(TINTER)
-	t.extra.(*Interface).implicit = true
-}
-
-// NewUnion returns a new union with the specified set of terms (types). If
-// tildes[i] is true, then terms[i] represents ~T, rather than just T.
-func NewUnion(terms []*Type, tildes []bool) *Type {
-	t := newType(TUNION)
-	if len(terms) != len(tildes) {
-		base.Fatalf("Mismatched terms and tildes for NewUnion")
-	}
-	t.extra.(*Union).terms = terms
-	t.extra.(*Union).tildes = tildes
-	nt := len(terms)
-	for i := 0; i < nt; i++ {
-		if terms[i].HasTParam() {
-			t.SetHasTParam(true)
-		}
-		if terms[i].HasShape() {
-			t.SetHasShape(true)
-		}
-	}
-	return t
-}
-
-// NumTerms returns the number of terms in a union type.
-func (t *Type) NumTerms() int {
-	t.wantEtype(TUNION)
-	return len(t.extra.(*Union).terms)
-}
-
-// Term returns ith term of a union type as (term, tilde). If tilde is true, term
-// represents ~T, rather than just T.
-func (t *Type) Term(i int) (*Type, bool) {
-	t.wantEtype(TUNION)
-	u := t.extra.(*Union)
-	return u.terms[i], u.tildes[i]
-}
-
 const BOGUS_FUNARG_OFFSET = -1000000000
 
 func unzeroFieldOffsets(f []*Field) {
@@ -1924,8 +1709,8 @@
 }
 
 // NewSignature returns a new function type for the given receiver,
-// parameters, results, and type parameters, any of which may be nil.
-func NewSignature(pkg *Pkg, recv *Field, tparams, params, results []*Field) *Type {
+// parameters, and results, any of which may be nil.
+func NewSignature(recv *Field, params, results []*Field) *Type {
 	var recvs []*Field
 	if recv != nil {
 		recvs = []*Field{recv}
@@ -1935,7 +1720,7 @@
 	ft := t.FuncType()
 
 	funargs := func(fields []*Field, funarg Funarg) *Type {
-		s := NewStruct(NoPkg, fields)
+		s := NewStruct(fields)
 		s.StructType().Funarg = funarg
 		return s
 	}
@@ -1946,15 +1731,8 @@
 	unzeroFieldOffsets(params)
 	unzeroFieldOffsets(results)
 	ft.Receiver = funargs(recvs, FunargRcvr)
-	// TODO(danscales): just use nil here (save memory) if no tparams
-	ft.TParams = funargs(tparams, FunargTparams)
 	ft.Params = funargs(params, FunargParams)
 	ft.Results = funargs(results, FunargResults)
-	ft.pkg = pkg
-	if len(tparams) > 0 || fieldsHasTParam(recvs) || fieldsHasTParam(params) ||
-		fieldsHasTParam(results) {
-		t.SetHasTParam(true)
-	}
 	if fieldsHasShape(recvs) || fieldsHasShape(params) || fieldsHasShape(results) {
 		t.SetHasShape(true)
 	}
@@ -1963,13 +1741,9 @@
 }
 
 // NewStruct returns a new struct with the given fields.
-func NewStruct(pkg *Pkg, fields []*Field) *Type {
+func NewStruct(fields []*Field) *Type {
 	t := newType(TSTRUCT)
 	t.SetFields(fields)
-	t.extra.(*Struct).pkg = pkg
-	if fieldsHasTParam(fields) {
-		t.SetHasTParam(true)
-	}
 	if fieldsHasShape(fields) {
 		t.SetHasShape(true)
 	}
@@ -2084,6 +1858,33 @@
 	return p.Path == "reflect"
 }
 
+// IsTypePkg reports whether p is pesudo package type.
+func IsTypePkg(p *Pkg) bool {
+	return p == typepkg
+}
+
+// IsNoInstrumentPkg reports whether p is a package that
+// should not be instrumented.
+func IsNoInstrumentPkg(p *Pkg) bool {
+	for _, np := range base.NoInstrumentPkgs {
+		if p.Path == np {
+			return true
+		}
+	}
+	return false
+}
+
+// IsNoRacePkg reports whether p is a package that
+// should not be race instrumented.
+func IsNoRacePkg(p *Pkg) bool {
+	for _, np := range base.NoRacePkgs {
+		if p.Path == np {
+			return true
+		}
+	}
+	return false
+}
+
 // ReceiverBaseType returns the underlying type, if any,
 // that owns methods with receiver parameter t.
 // The result is either a named type or an anonymous struct.
diff --git a/src/cmd/compile/internal/types/universe.go b/src/cmd/compile/internal/types/universe.go
index 4733110..d1800f2 100644
--- a/src/cmd/compile/internal/types/universe.go
+++ b/src/cmd/compile/internal/types/universe.go
@@ -58,7 +58,7 @@
 	}
 
 	Types[TANY] = newType(TANY) // note: an old placeholder type, NOT the new builtin 'any' alias for interface{}
-	Types[TINTER] = NewInterface(LocalPkg, nil, false)
+	Types[TINTER] = NewInterface(nil)
 	CheckSize(Types[TINTER])
 
 	defBasic := func(kind Kind, pkg *Pkg, name string) *Type {
@@ -111,7 +111,7 @@
 	// any type (interface)
 	DeferCheckSize()
 	AnyType = defBasic(TFORW, BuiltinPkg, "any")
-	AnyType.SetUnderlying(NewInterface(BuiltinPkg, []*Field{}, false))
+	AnyType.SetUnderlying(NewInterface(nil))
 	ResumeCheckSize()
 
 	Types[TUNSAFEPTR] = defBasic(TUNSAFEPTR, UnsafePkg, "Pointer")
@@ -140,15 +140,15 @@
 }
 
 func makeErrorInterface() *Type {
-	sig := NewSignature(NoPkg, FakeRecv(), nil, nil, []*Field{
+	sig := NewSignature(FakeRecv(), nil, []*Field{
 		NewField(src.NoXPos, nil, Types[TSTRING]),
 	})
 	method := NewField(src.NoXPos, LocalPkg.Lookup("Error"), sig)
-	return NewInterface(NoPkg, []*Field{method}, false)
+	return NewInterface([]*Field{method})
 }
 
 // makeComparableInterface makes the predefined "comparable" interface in the
 // built-in package. It has a unique name, but no methods.
 func makeComparableInterface() *Type {
-	return NewInterface(NoPkg, nil, false)
+	return NewInterface(nil)
 }
diff --git a/src/cmd/compile/internal/types2/api.go b/src/cmd/compile/internal/types2/api.go
index 47075c4..d0c0cdb 100644
--- a/src/cmd/compile/internal/types2/api.go
+++ b/src/cmd/compile/internal/types2/api.go
@@ -27,6 +27,7 @@
 	"cmd/compile/internal/syntax"
 	"fmt"
 	"go/constant"
+	. "internal/types/errors"
 	"strings"
 )
 
@@ -39,6 +40,7 @@
 	Msg  string     // default error message, user-friendly
 	Full string     // full error message, for debugging (may contain internal details)
 	Soft bool       // if set, error is "soft"
+	Code Code       // error code
 }
 
 // Error returns an error string formatted as follows:
@@ -108,11 +110,11 @@
 	// type checker will initialize this field with a newly created context.
 	Context *Context
 
-	// GoVersion describes the accepted Go language version. The string
-	// must follow the format "go%d.%d" (e.g. "go1.12") or ist must be
-	// empty; an empty string indicates the latest language version.
-	// If the format is invalid, invoking the type checker will cause a
-	// panic.
+	// GoVersion describes the accepted Go language version. The string must
+	// start with a prefix of the form "go%d.%d" (e.g. "go1.20", "go1.21rc1", or
+	// "go1.21.0") or it must be empty; an empty string disables Go language
+	// version checks. If the format is invalid, invoking the type checker will
+	// result in an error.
 	GoVersion string
 
 	// If IgnoreFuncBodies is set, function bodies are not
@@ -168,10 +170,11 @@
 	// for unused imports.
 	DisableUnusedImportCheck bool
 
-	// If OldComparableSemantics is set, ordinary (non-type parameter)
-	// interfaces do not satisfy the comparable constraint.
-	// TODO(gri) remove this flag for Go 1.21
-	OldComparableSemantics bool
+	// If a non-empty ErrorURL format string is provided, it is used
+	// to format an error URL link that is appended to the first line
+	// of an error message. ErrorURL must be a format string containing
+	// exactly one "%s" format, e.g. "[go.dev/e/%s]".
+	ErrorURL string
 }
 
 func srcimporter_setUsesCgo(conf *Config) {
@@ -447,7 +450,7 @@
 	if T.Underlying() == Typ[Invalid] {
 		return false
 	}
-	return (*Checker)(nil).newAssertableTo(V, T)
+	return (*Checker)(nil).newAssertableTo(nopos, V, T, nil)
 }
 
 // AssignableTo reports whether a value of type V is assignable to a variable
@@ -485,7 +488,7 @@
 	if V.Underlying() == Typ[Invalid] {
 		return false
 	}
-	return (*Checker)(nil).implements(V, T, false, nil)
+	return (*Checker)(nil).implements(nopos, V, T, false, nil)
 }
 
 // Satisfies reports whether type V satisfies the constraint T.
@@ -493,17 +496,20 @@
 // The behavior of Satisfies is unspecified if V is Typ[Invalid] or an uninstantiated
 // generic type.
 func Satisfies(V Type, T *Interface) bool {
-	return (*Checker)(nil).implements(V, T, true, nil)
+	return (*Checker)(nil).implements(nopos, V, T, true, nil)
 }
 
 // Identical reports whether x and y are identical types.
 // Receivers of Signature types are ignored.
 func Identical(x, y Type) bool {
-	return identical(x, y, true, nil)
+	var c comparer
+	return c.identical(x, y, nil)
 }
 
 // IdenticalIgnoreTags reports whether x and y are identical types if tags are ignored.
 // Receivers of Signature types are ignored.
 func IdenticalIgnoreTags(x, y Type) bool {
-	return identical(x, y, false, nil)
+	var c comparer
+	c.ignoreTags = true
+	return c.identical(x, y, nil)
 }
diff --git a/src/cmd/compile/internal/types2/api_test.go b/src/cmd/compile/internal/types2/api_test.go
index fe84720..0f50650 100644
--- a/src/cmd/compile/internal/types2/api_test.go
+++ b/src/cmd/compile/internal/types2/api_test.go
@@ -18,39 +18,50 @@
 	. "cmd/compile/internal/types2"
 )
 
-func parse(path, src string) (*syntax.File, error) {
-	errh := func(error) {} // dummy error handler so that parsing continues in presence of errors
-	return syntax.Parse(syntax.NewFileBase(path), strings.NewReader(src), errh, nil, 0)
-}
+// nopos indicates an unknown position
+var nopos syntax.Pos
 
-func mustParse(path, src string) *syntax.File {
-	f, err := parse(path, src)
+func mustParse(src string) *syntax.File {
+	f, err := syntax.Parse(syntax.NewFileBase(pkgName(src)), strings.NewReader(src), nil, nil, 0)
 	if err != nil {
 		panic(err) // so we don't need to pass *testing.T
 	}
 	return f
 }
 
-func typecheck(path, src string, info *Info) (*Package, error) {
-	f, err := parse(path, src)
-	if f == nil { // ignore errors unless f is nil
-		return nil, err
-	}
-	conf := Config{
-		Error:    func(err error) {}, // collect all errors
-		Importer: defaultImporter(),
+func typecheck(src string, conf *Config, info *Info) (*Package, error) {
+	f := mustParse(src)
+	if conf == nil {
+		conf = &Config{
+			Error:    func(err error) {}, // collect all errors
+			Importer: defaultImporter(),
+		}
 	}
 	return conf.Check(f.PkgName.Value, []*syntax.File{f}, info)
 }
 
-func mustTypecheck(path, src string, info *Info) *Package {
-	pkg, err := typecheck(path, src, info)
+func mustTypecheck(src string, conf *Config, info *Info) *Package {
+	pkg, err := typecheck(src, conf, info)
 	if err != nil {
 		panic(err) // so we don't need to pass *testing.T
 	}
 	return pkg
 }
 
+// pkgName extracts the package name from src, which must contain a package header.
+func pkgName(src string) string {
+	const kw = "package "
+	if i := strings.Index(src, kw); i >= 0 {
+		after := src[i+len(kw):]
+		n := len(after)
+		if i := strings.IndexAny(after, "\n\t ;/"); i >= 0 {
+			n = i
+		}
+		return after[:n]
+	}
+	panic("missing package header: " + src)
+}
+
 func TestValuesInfo(t *testing.T) {
 	var tests = []struct {
 		src  string
@@ -126,15 +137,15 @@
 		{`package f6b; var _            =  1e-2000i`, `1e-2000i`, `complex128`, `(0 + 0i)`},
 		{`package f7b; var _            = -1e-2000i`, `-1e-2000i`, `complex128`, `(0 + 0i)`},
 
-		{`package g0; const (a = len([iota]int{}); b; c); const _ = c`, `c`, `int`, `2`}, // issue #22341
-		{`package g1; var(j int32; s int; n = 1.0<<s == j)`, `1.0`, `int32`, `1`},        // issue #48422
+		{`package g0; const (a = len([iota]int{}); b; c); const _ = c`, `c`, `int`, `2`}, // go.dev/issue/22341
+		{`package g1; var(j int32; s int; n = 1.0<<s == j)`, `1.0`, `int32`, `1`},        // go.dev/issue/48422
 	}
 
 	for _, test := range tests {
 		info := Info{
 			Types: make(map[syntax.Expr]TypeAndValue),
 		}
-		name := mustTypecheck("ValuesInfo", test.src, &info).Name()
+		name := mustTypecheck(test.src, nil, &info).Name()
 
 		// look for expression
 		var expr syntax.Expr
@@ -244,7 +255,7 @@
 			`(string, bool)`,
 		},
 
-		// issue 6796
+		// go.dev/issue/6796
 		{`package issue6796_a; var x interface{}; var _, _ = (x.(int))`,
 			`x.(int)`,
 			`(int, bool)`,
@@ -266,7 +277,7 @@
 			`(string, bool)`,
 		},
 
-		// issue 7060
+		// go.dev/issue/7060
 		{`package issue7060_a; var ( m map[int]string; x, ok = m[0] )`,
 			`m[0]`,
 			`(string, bool)`,
@@ -292,7 +303,7 @@
 			`(string, bool)`,
 		},
 
-		// issue 28277
+		// go.dev/issue/28277
 		{`package issue28277_a; func f(...int)`,
 			`...int`,
 			`[]int`,
@@ -302,7 +313,7 @@
 			`[][]struct{}`,
 		},
 
-		// issue 47243
+		// go.dev/issue/47243
 		{`package issue47243_a; var x int32; var _ = x << 3`, `3`, `untyped int`},
 		{`package issue47243_b; var x int32; var _ = x << 3.`, `3.`, `untyped float`},
 		{`package issue47243_c; var x int32; var _ = 1 << x`, `1 << x`, `int`},
@@ -314,7 +325,7 @@
 		{`package issue47243_i; var x int32; var _ = 1 << (2 << x)`, `(2 << x)`, `untyped int`},
 		{`package issue47243_j; var x int32; var _ = 1 << (2 << x)`, `2`, `untyped int`},
 
-		// tests for broken code that doesn't parse or type-check
+		// tests for broken code that doesn't type-check
 		{brokenPkg + `x0; func _() { var x struct {f string}; x.f := 0 }`, `x.f`, `string`},
 		{brokenPkg + `x1; func _() { var z string; type x struct {f string}; y := &x{q: z}}`, `z`, `string`},
 		{brokenPkg + `x2; func _() { var a, b string; type x struct {f string}; z := &x{f: a, f: b,}}`, `b`, `string`},
@@ -340,13 +351,13 @@
 		// instantiated types must be sanitized
 		{`package g0; type t[P any] int; var x struct{ f t[int] }; var _ = x.f`, `x.f`, `g0.t[int]`},
 
-		// issue 45096
+		// go.dev/issue/45096
 		{`package issue45096; func _[T interface{ ~int8 | ~int16 | ~int32 }](x T) { _ = x < 0 }`, `0`, `T`},
 
-		// issue 47895
+		// go.dev/issue/47895
 		{`package p; import "unsafe"; type S struct { f int }; var s S; var _ = unsafe.Offsetof(s.f)`, `s.f`, `int`},
 
-		// issue 50093
+		// go.dev/issue/50093
 		{`package u0a; func _[_ interface{int}]() {}`, `int`, `int`},
 		{`package u1a; func _[_ interface{~int}]() {}`, `~int`, `~int`},
 		{`package u2a; func _[_ interface{int | string}]() {}`, `int | string`, `int | string`},
@@ -370,13 +381,33 @@
 		{`package u3c; type _ interface{int | string | ~bool}`, `int | string`, `int | string`},
 		{`package u3c; type _ interface{int | string | ~bool}`, `~bool`, `~bool`},
 		{`package u3c; type _ interface{int | string | ~float64|~bool}`, `int | string | ~float64`, `int | string | ~float64`},
+
+		// reverse type inference
+		{`package r1; var _ func(int) = g; func g[P any](P) {}`, `g`, `func(int)`},
+		{`package r2; var _ func(int) = g[int]; func g[P any](P) {}`, `g`, `func[P any](P)`}, // go.dev/issues/60212
+		{`package r3; var _ func(int) = g[int]; func g[P any](P) {}`, `g[int]`, `func(int)`},
+		{`package r4; var _ func(int, string) = g; func g[P, Q any](P, Q) {}`, `g`, `func(int, string)`},
+		{`package r5; var _ func(int, string) = g[int]; func g[P, Q any](P, Q) {}`, `g`, `func[P, Q any](P, Q)`}, // go.dev/issues/60212
+		{`package r6; var _ func(int, string) = g[int]; func g[P, Q any](P, Q) {}`, `g[int]`, `func(int, string)`},
+
+		{`package s1; func _() { f(g) }; func f(func(int)) {}; func g[P any](P) {}`, `g`, `func(int)`},
+		{`package s2; func _() { f(g[int]) }; func f(func(int)) {}; func g[P any](P) {}`, `g`, `func[P any](P)`}, // go.dev/issues/60212
+		{`package s3; func _() { f(g[int]) }; func f(func(int)) {}; func g[P any](P) {}`, `g[int]`, `func(int)`},
+		{`package s4; func _() { f(g) }; func f(func(int, string)) {}; func g[P, Q any](P, Q) {}`, `g`, `func(int, string)`},
+		{`package s5; func _() { f(g[int]) }; func f(func(int, string)) {}; func g[P, Q any](P, Q) {}`, `g`, `func[P, Q any](P, Q)`}, // go.dev/issues/60212
+		{`package s6; func _() { f(g[int]) }; func f(func(int, string)) {}; func g[P, Q any](P, Q) {}`, `g[int]`, `func(int, string)`},
+
+		{`package s7; func _() { f(g, h) }; func f[P any](func(int, P), func(P, string)) {}; func g[P any](P, P) {}; func h[P, Q any](P, Q) {}`, `g`, `func(int, int)`},
+		{`package s8; func _() { f(g, h) }; func f[P any](func(int, P), func(P, string)) {}; func g[P any](P, P) {}; func h[P, Q any](P, Q) {}`, `h`, `func(int, string)`},
+		{`package s9; func _() { f(g, h[int]) }; func f[P any](func(int, P), func(P, string)) {}; func g[P any](P, P) {}; func h[P, Q any](P, Q) {}`, `h`, `func[P, Q any](P, Q)`}, // go.dev/issues/60212
+		{`package s10; func _() { f(g, h[int]) }; func f[P any](func(int, P), func(P, string)) {}; func g[P any](P, P) {}; func h[P, Q any](P, Q) {}`, `h[int]`, `func(int, string)`},
 	}
 
 	for _, test := range tests {
 		info := Info{Types: make(map[syntax.Expr]TypeAndValue)}
 		var name string
 		if strings.HasPrefix(test.src, brokenPkg) {
-			pkg, err := typecheck("TypesInfo", test.src, &info)
+			pkg, err := typecheck(test.src, nil, &info)
 			if err == nil {
 				t.Errorf("package %s: expected to fail but passed", pkg.Name())
 				continue
@@ -385,7 +416,7 @@
 				name = pkg.Name()
 			}
 		} else {
-			name = mustTypecheck("TypesInfo", test.src, &info).Name()
+			name = mustTypecheck(test.src, nil, &info).Name()
 		}
 
 		// look for expression type
@@ -403,7 +434,7 @@
 
 		// check that type is correct
 		if got := typ.String(); got != test.typ {
-			t.Errorf("package %s: got %s; want %s", name, got, test.typ)
+			t.Errorf("package %s: expr = %s: got %s; want %s", name, test.expr, got, test.typ)
 		}
 	}
 }
@@ -539,19 +570,62 @@
 		{`package issue51803; func foo[T any](T) {}; func _() { foo[int]( /* leave arg away on purpose */ ) }`,
 			[]testInst{{`foo`, []string{`int`}, `func(int)`}},
 		},
+
+		// reverse type inference
+		{`package reverse1a; var f func(int) = g; func g[P any](P) {}`,
+			[]testInst{{`g`, []string{`int`}, `func(int)`}},
+		},
+		{`package reverse1b; func f(func(int)) {}; func g[P any](P) {}; func _() { f(g) }`,
+			[]testInst{{`g`, []string{`int`}, `func(int)`}},
+		},
+		{`package reverse2a; var f func(int, string) = g; func g[P, Q any](P, Q) {}`,
+			[]testInst{{`g`, []string{`int`, `string`}, `func(int, string)`}},
+		},
+		{`package reverse2b; func f(func(int, string)) {}; func g[P, Q any](P, Q) {}; func _() { f(g) }`,
+			[]testInst{{`g`, []string{`int`, `string`}, `func(int, string)`}},
+		},
+		{`package reverse2c; func f(func(int, string)) {}; func g[P, Q any](P, Q) {}; func _() { f(g[int]) }`,
+			[]testInst{{`g`, []string{`int`, `string`}, `func(int, string)`}},
+		},
+		// reverse3a not possible (cannot assign to generic function outside of argument passing)
+		{`package reverse3b; func f[R any](func(int) R) {}; func g[P any](P) string { return "" }; func _() { f(g) }`,
+			[]testInst{
+				{`f`, []string{`string`}, `func(func(int) string)`},
+				{`g`, []string{`int`}, `func(int) string`},
+			},
+		},
+		{`package reverse4a; var _, _ func([]int, *float32) = g, h; func g[P, Q any]([]P, *Q) {}; func h[R any]([]R, *float32) {}`,
+			[]testInst{
+				{`g`, []string{`int`, `float32`}, `func([]int, *float32)`},
+				{`h`, []string{`int`}, `func([]int, *float32)`},
+			},
+		},
+		{`package reverse4b; func f(_, _ func([]int, *float32)) {}; func g[P, Q any]([]P, *Q) {}; func h[R any]([]R, *float32) {}; func _() { f(g, h) }`,
+			[]testInst{
+				{`g`, []string{`int`, `float32`}, `func([]int, *float32)`},
+				{`h`, []string{`int`}, `func([]int, *float32)`},
+			},
+		},
+		{`package issue59956; func f(func(int), func(string), func(bool)) {}; func g[P any](P) {}; func _() { f(g, g, g) }`,
+			[]testInst{
+				{`g`, []string{`int`}, `func(int)`},
+				{`g`, []string{`string`}, `func(string)`},
+				{`g`, []string{`bool`}, `func(bool)`},
+			},
+		},
 	}
 
 	for _, test := range tests {
 		imports := make(testImporter)
-		conf := Config{
-			Importer: imports,
-			Error:    func(error) {}, // ignore errors
-		}
+		conf := Config{Importer: imports}
 		instMap := make(map[*syntax.Name]Instance)
 		useMap := make(map[*syntax.Name]Object)
 		makePkg := func(src string) *Package {
-			f := mustParse("p.go", src)
-			pkg, _ := conf.Check("", []*syntax.File{f}, &Info{Instances: instMap, Uses: useMap})
+			pkg, err := typecheck(src, &conf, &Info{Instances: instMap, Uses: useMap})
+			// allow error for issue51803
+			if err != nil && (pkg == nil || pkg.Name() != "issue51803") {
+				t.Fatal(err)
+			}
 			imports[pkg.Name()] = pkg
 			return pkg
 		}
@@ -619,7 +693,7 @@
 		instances = append(instances, recordedInstance{id, inst})
 	}
 	sort.Slice(instances, func(i, j int) bool {
-		return instances[i].Name.Pos().Cmp(instances[j].Name.Pos()) < 0
+		return CmpPos(instances[i].Name.Pos(), instances[j].Name.Pos()) < 0
 	})
 	return instances
 }
@@ -647,7 +721,7 @@
 		info := Info{
 			Defs: make(map[*syntax.Name]Object),
 		}
-		name := mustTypecheck("DefsInfo", test.src, &info).Name()
+		name := mustTypecheck(test.src, nil, &info).Name()
 
 		// find object
 		var def Object
@@ -712,7 +786,7 @@
 		info := Info{
 			Uses: make(map[*syntax.Name]Object),
 		}
-		name := mustTypecheck("UsesInfo", test.src, &info).Name()
+		name := mustTypecheck(test.src, nil, &info).Name()
 
 		// find object
 		var use Object
@@ -744,7 +818,7 @@
 
 func (r *N[C]) n() {  }
 `
-	f := mustParse("p.go", src)
+	f := mustParse(src)
 	info := Info{
 		Defs:       make(map[*syntax.Name]Object),
 		Uses:       make(map[*syntax.Name]Object),
@@ -852,7 +926,7 @@
 		info := Info{
 			Implicits: make(map[syntax.Node]Object),
 		}
-		name := mustTypecheck("ImplicitsInfo", test.src, &info).Name()
+		name := mustTypecheck(test.src, nil, &info).Name()
 
 		// the test cases expect at most one Implicits entry
 		if len(info.Implicits) > 1 {
@@ -980,7 +1054,7 @@
 
 	for _, test := range tests {
 		info := Info{Types: make(map[syntax.Expr]TypeAndValue)}
-		name := mustTypecheck("PredicatesInfo", test.src, &info).Name()
+		name := mustTypecheck(test.src, nil, &info).Name()
 
 		// look for expression predicates
 		got := "<missing>"
@@ -1072,7 +1146,7 @@
 
 	for _, test := range tests {
 		info := Info{Scopes: make(map[syntax.Node]*Scope)}
-		name := mustTypecheck("ScopesInfo", test.src, &info).Name()
+		name := mustTypecheck(test.src, nil, &info).Name()
 
 		// number of scopes must match
 		if len(info.Scopes) != len(test.scopes) {
@@ -1183,7 +1257,7 @@
 		}`, []string{
 			"d = 3", "b = f()", "c = f()", "a = c + b",
 		}},
-		// test case for issue 7131
+		// test case for go.dev/issue/7131
 		{`package main
 
 		var counter int
@@ -1198,7 +1272,7 @@
 		`, []string{
 			"a = next()", "b = next()", "c = next()", "d = next()", "e = next()", "f = next()", "_ = makeOrder()",
 		}},
-		// test case for issue 10709
+		// test case for go.dev/issue/10709
 		{`package p13
 
 		var (
@@ -1218,7 +1292,7 @@
 		}`, []string{
 			"t = makeT(0)", "v = t.m()",
 		}},
-		// test case for issue 10709: same as test before, but variable decls swapped
+		// test case for go.dev/issue/10709: same as test before, but variable decls swapped
 		{`package p14
 
 		var (
@@ -1238,7 +1312,7 @@
 		}`, []string{
 			"t = makeT(0)", "v = t.m()",
 		}},
-		// another candidate possibly causing problems with issue 10709
+		// another candidate possibly causing problems with go.dev/issue/10709
 		{`package p15
 
 		var y1 = f1()
@@ -1260,7 +1334,7 @@
 
 	for _, test := range tests {
 		info := Info{}
-		name := mustTypecheck("InitOrderInfo", test.src, &info).Name()
+		name := mustTypecheck(test.src, nil, &info).Name()
 
 		// number of initializers must match
 		if len(info.InitOrder) != len(test.inits) {
@@ -1280,8 +1354,8 @@
 }
 
 func TestMultiFileInitOrder(t *testing.T) {
-	fileA := mustParse("", `package main; var a = 1`)
-	fileB := mustParse("", `package main; var b = 2`)
+	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
@@ -1316,10 +1390,8 @@
 	var info Info
 	check := NewChecker(&conf, pkg, &info)
 
-	for i, src := range sources {
-		filename := fmt.Sprintf("sources%d", i)
-		f := mustParse(filename, src)
-		if err := check.Files([]*syntax.File{f}); err != nil {
+	for _, src := range sources {
+		if err := check.Files([]*syntax.File{mustParse(src)}); err != nil {
 			t.Error(err)
 		}
 	}
@@ -1351,11 +1423,7 @@
 	imports := make(testImporter)
 	conf := Config{Importer: imports}
 	makePkg := func(path, src string) {
-		f := mustParse(path+".go", src)
-		pkg, err := conf.Check(path, []*syntax.File{f}, &Info{Selections: selections})
-		if err != nil {
-			t.Fatal(err)
-		}
+		pkg := mustTypecheck(src, &conf, &Info{Selections: selections})
 		imports[path] = pkg
 	}
 
@@ -1541,9 +1609,7 @@
 		Importer: imports,
 	}
 	makePkg := func(path, src string) {
-		f := mustParse(path, src)
-		pkg, _ := conf.Check(path, []*syntax.File{f}, nil) // errors logged via conf.Error
-		imports[path] = pkg
+		imports[path], _ = conf.Check(path, []*syntax.File{mustParse(src)}, nil) // errors logged via conf.Error
 	}
 
 	const libSrc = `
@@ -1564,6 +1630,31 @@
 	makePkg("main", mainSrc) // don't crash when type-checking this package
 }
 
+func TestIssue59603(t *testing.T) {
+	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) {
+		imports[path], _ = conf.Check(path, []*syntax.File{mustParse(src)}, nil) // errors logged via conf.Error
+	}
+
+	const libSrc = `
+package a
+const C = foo
+`
+
+	const mainSrc = `
+package main
+import "a"
+const _ = a.C
+`
+
+	makePkg("a", libSrc)
+	makePkg("main", mainSrc) // don't crash when type-checking this package
+}
+
 func TestLookupFieldOrMethodOnNil(t *testing.T) {
 	// LookupFieldOrMethod on a nil type is expected to produce a run-time panic.
 	defer func() {
@@ -1623,13 +1714,13 @@
 		// outside method set of a generic type
 		{"var x T[int]; type T[P any] struct{}; func (*T[P]) f() {}", false, nil, true},
 
-		// recursive generic types; see golang/go#52715
+		// recursive generic types; see go.dev/issue/52715
 		{"var a T[int]; type ( T[P any] struct { *N[P] }; N[P any] struct { *T[P] } ); func (N[P]) f() {}", true, []int{0, 0}, true},
 		{"var a T[int]; type ( T[P any] struct { *N[P] }; N[P any] struct { *T[P] } ); func (T[P]) f() {}", true, []int{0}, false},
 	}
 
 	for _, test := range tests {
-		pkg := mustTypecheck("test", "package p;"+test.src, nil)
+		pkg := mustTypecheck("package p;"+test.src, nil, nil)
 
 		obj := pkg.Scope().Lookup("a")
 		if obj == nil {
@@ -1656,7 +1747,7 @@
 	}
 }
 
-// Test for golang/go#52715
+// Test for go.dev/issue/52715
 func TestLookupFieldOrMethod_RecursiveGeneric(t *testing.T) {
 	const src = `
 package pkg
@@ -1674,7 +1765,7 @@
 type Instance = *Tree[int]
 `
 
-	f := mustParse("foo.go", src)
+	f := mustParse(src)
 	pkg := NewPackage("pkg", f.PkgName.Value)
 	if err := NewChecker(nil, pkg, nil).Files([]*syntax.File{f}); err != nil {
 		panic(err)
@@ -1703,9 +1794,8 @@
 	conf := Config{Importer: imports}
 	var info Info
 	makePkg := func(path, src string) {
-		f := mustParse(path, src)
 		var err error
-		imports[path], err = conf.Check(path, []*syntax.File{f}, &info)
+		imports[path], err = conf.Check(path, []*syntax.File{mustParse(src)}, &info)
 		if err != nil {
 			t.Fatal(err)
 		}
@@ -1821,8 +1911,6 @@
 	}
 }
 
-var nopos syntax.Pos
-
 // newDefined creates a new defined type named T with the given underlying type.
 func newDefined(underlying Type) *Named {
 	tname := NewTypeName(nopos, nil, "T", nil)
@@ -1901,7 +1989,7 @@
 		{`func X(int) string { return "" }; func Y(int) {}`, false},
 
 		// Generic functions. Type parameters should be considered identical modulo
-		// renaming. See also issue #49722.
+		// renaming. See also go.dev/issue/49722.
 		{`func X[P ~int](){}; func Y[Q ~int]() {}`, true},
 		{`func X[P1 any, P2 ~*P1](){}; func Y[Q1 any, Q2 ~*Q1]() {}`, true},
 		{`func X[P1 any, P2 ~[]P1](){}; func Y[Q1 any, Q2 ~*Q1]() {}`, false},
@@ -1911,7 +1999,7 @@
 	}
 
 	for _, test := range tests {
-		pkg := mustTypecheck("test", "package p;"+test.src, nil)
+		pkg := mustTypecheck("package p;"+test.src, nil, nil)
 		X := pkg.Scope().Lookup("X")
 		Y := pkg.Scope().Lookup("Y")
 		if X == nil || Y == nil {
@@ -1982,9 +2070,32 @@
 	}
 }
 
+func TestIssue61737(t *testing.T) {
+	// This test verifies that it is possible to construct invalid interfaces
+	// containing duplicate methods using the go/types API.
+	//
+	// It must be possible for importers to construct such invalid interfaces.
+	// Previously, this panicked.
+
+	sig1 := NewSignatureType(nil, nil, nil, NewTuple(NewParam(nopos, nil, "", Typ[Int])), nil, false)
+	sig2 := NewSignatureType(nil, nil, nil, NewTuple(NewParam(nopos, nil, "", Typ[String])), nil, false)
+
+	methods := []*Func{
+		NewFunc(nopos, nil, "M", sig1),
+		NewFunc(nopos, nil, "M", sig2),
+	}
+
+	embeddedMethods := []*Func{
+		NewFunc(nopos, nil, "M", sig2),
+	}
+	embedded := NewInterfaceType(embeddedMethods, nil)
+	iface := NewInterfaceType(methods, []Type{embedded})
+	iface.NumMethods() // unlike go/types, there is no Complete() method, so we complete implicitly
+}
+
 func TestIssue15305(t *testing.T) {
 	const src = "package p; func f() int16; var _ = f(undef)"
-	f := mustParse("issue15305.go", src)
+	f := mustParse(src)
 	conf := Config{
 		Error: func(err error) {}, // allow errors
 	}
@@ -2007,19 +2118,19 @@
 // types for composite literal expressions and composite literal type
 // expressions.
 func TestCompositeLitTypes(t *testing.T) {
-	for _, test := range []struct {
+	for i, test := range []struct {
 		lit, typ string
 	}{
 		{`[16]byte{}`, `[16]byte`},
-		{`[...]byte{}`, `[0]byte`},                // test for issue #14092
-		{`[...]int{1, 2, 3}`, `[3]int`},           // test for issue #14092
-		{`[...]int{90: 0, 98: 1, 2}`, `[100]int`}, // test for issue #14092
+		{`[...]byte{}`, `[0]byte`},                // test for go.dev/issue/14092
+		{`[...]int{1, 2, 3}`, `[3]int`},           // test for go.dev/issue/14092
+		{`[...]int{90: 0, 98: 1, 2}`, `[100]int`}, // test for go.dev/issue/14092
 		{`[]int{}`, `[]int`},
 		{`map[string]bool{"foo": true}`, `map[string]bool`},
 		{`struct{}{}`, `struct{}`},
 		{`struct{x, y int; z complex128}{}`, `struct{x int; y int; z complex128}`},
 	} {
-		f := mustParse(test.lit, "package p; var _ = "+test.lit)
+		f := mustParse(fmt.Sprintf("package p%d; var _ = %s", i, test.lit))
 		types := make(map[syntax.Expr]TypeAndValue)
 		if _, err := new(Config).Check("p", []*syntax.File{f}, &Info{Types: types}); err != nil {
 			t.Fatalf("%s: %v", test.lit, err)
@@ -2073,7 +2184,7 @@
 func f(x int) { y := x; print(y) }
 `
 
-	f := mustParse("src", src)
+	f := mustParse(src)
 
 	info := &Info{
 		Defs: make(map[*syntax.Name]Object),
@@ -2131,7 +2242,7 @@
 var v T = c
 func f(x T) T { return foo.F(x) }
 `
-	f := mustParse("src", src)
+	f := mustParse(src)
 	files := []*syntax.File{f}
 
 	// type-check using all possible importers
@@ -2186,7 +2297,7 @@
 func TestInstantiate(t *testing.T) {
 	// eventually we like more tests but this is a start
 	const src = "package p; type T[P any] *T[P]"
-	pkg := mustTypecheck(".", src, nil)
+	pkg := mustTypecheck(src, nil, nil)
 
 	// type T should have one type parameter
 	T := pkg.Scope().Lookup("T").Type().(*Named)
@@ -2221,7 +2332,7 @@
 
 	for _, test := range tests {
 		src := "package p; " + test.src
-		pkg := mustTypecheck(".", src, nil)
+		pkg := mustTypecheck(src, nil, nil)
 
 		T := pkg.Scope().Lookup("T").Type().(*Named)
 
@@ -2259,7 +2370,7 @@
 	imports := make(testImporter)
 	conf := Config{Importer: imports}
 	makePkg := func(src string) {
-		f := mustParse("", src)
+		f := mustParse(src)
 		name := f.PkgName.Value
 		pkg, err := conf.Check(name, []*syntax.File{f}, nil)
 		if err != nil {
@@ -2315,7 +2426,7 @@
 	info := &Info{
 		Defs: make(map[*syntax.Name]Object),
 	}
-	f := mustParse("p.go", src)
+	f := mustParse(src)
 	conf := Config{}
 	pkg, err := conf.Check(f.PkgName.Value, []*syntax.File{f}, info)
 	if err != nil {
@@ -2446,7 +2557,7 @@
 type Bad Bad // invalid type
 `
 
-	f := mustParse("p.go", src)
+	f := mustParse(src)
 	conf := Config{Error: func(error) {}}
 	pkg, _ := conf.Check(f.PkgName.Value, []*syntax.File{f}, nil)
 
@@ -2541,7 +2652,7 @@
 func (V4) M()
 `
 
-	pkg := mustTypecheck("p.go", src, nil)
+	pkg := mustTypecheck(src, nil, nil)
 
 	T := pkg.Scope().Lookup("T").Type().Underlying().(*Interface)
 	lookup := func(name string) (*Func, bool) {
@@ -2573,3 +2684,28 @@
 	// V4 has no method m but has M. Should not report wrongType.
 	checkMissingMethod("V4", false)
 }
+
+func TestErrorURL(t *testing.T) {
+	conf := Config{ErrorURL: " [go.dev/e/%s]"}
+
+	// test case for a one-line error
+	const src1 = `
+package p
+var _ T
+`
+	_, err := typecheck(src1, &conf, nil)
+	if err == nil || !strings.HasSuffix(err.Error(), " [go.dev/e/UndeclaredName]") {
+		t.Errorf("src1: unexpected error: got %v", err)
+	}
+
+	// test case for a multi-line error
+	const src2 = `
+package p
+func f() int { return 0 }
+var _ = f(1, 2)
+`
+	_, err = typecheck(src2, &conf, nil)
+	if err == nil || !strings.Contains(err.Error(), " [go.dev/e/WrongArgCount]\n") {
+		t.Errorf("src1: unexpected error: got %v", err)
+	}
+}
diff --git a/src/cmd/compile/internal/types2/assignments.go b/src/cmd/compile/internal/types2/assignments.go
index 73c126c..cba102e 100644
--- a/src/cmd/compile/internal/types2/assignments.go
+++ b/src/cmd/compile/internal/types2/assignments.go
@@ -17,7 +17,7 @@
 // if necessary by attempting to convert untyped values to the appropriate
 // type. context describes the context in which the assignment takes place.
 // Use T == nil to indicate assignment to an untyped blank identifier.
-// x.mode is set to invalid if the assignment failed.
+// If the assignment check fails, x.mode is set to invalid.
 func (check *Checker) assignment(x *operand, T Type, context string) {
 	check.singleValue(x)
 
@@ -27,9 +27,10 @@
 	case constant_, variable, mapindex, value, nilvalue, commaok, commaerr:
 		// ok
 	default:
-		// we may get here because of other problems (issue #39634, crash 12)
+		// we may get here because of other problems (go.dev/issue/39634, crash 12)
 		// TODO(gri) do we need a new "generic" error code here?
 		check.errorf(x, IncompatibleAssign, "cannot assign %s to %s in %s", x, T, context)
+		x.mode = invalid
 		return
 	}
 
@@ -78,6 +79,8 @@
 	// A generic (non-instantiated) function value cannot be assigned to a variable.
 	if sig, _ := under(x.typ).(*Signature); sig != nil && sig.TypeParams().Len() > 0 {
 		check.errorf(x, WrongTypeArgCount, "cannot use generic function %s without instantiation in %s", x, context)
+		x.mode = invalid
+		return
 	}
 
 	// spec: "If a left-hand side is the blank identifier, any typed or
@@ -129,18 +132,20 @@
 	lhs.val = x.val
 }
 
-func (check *Checker) initVar(lhs *Var, x *operand, context string) Type {
+// initVar checks the initialization lhs = x in a variable declaration.
+// If lhs doesn't have a type yet, it is given the type of x,
+// or Typ[Invalid] in case of an error.
+// If the initialization check fails, x.mode is set to invalid.
+func (check *Checker) initVar(lhs *Var, x *operand, context string) {
 	if x.mode == invalid || x.typ == Typ[Invalid] || lhs.typ == Typ[Invalid] {
 		if lhs.typ == nil {
 			lhs.typ = Typ[Invalid]
 		}
-		// Note: This was reverted in go/types (https://golang.org/cl/292751).
-		// TODO(gri): decide what to do (also affects test/run.go exclusion list)
-		lhs.used = true // avoid follow-on "declared and not used" errors
-		return nil
+		x.mode = invalid
+		return
 	}
 
-	// If the lhs doesn't have a type yet, use the type of x.
+	// If lhs doesn't have a type yet, use the type of x.
 	if lhs.typ == nil {
 		typ := x.typ
 		if isUntyped(typ) {
@@ -148,7 +153,8 @@
 			if typ == Typ[UntypedNil] {
 				check.errorf(x, UntypedNilUse, "use of untyped nil in %s", context)
 				lhs.typ = Typ[Invalid]
-				return nil
+				x.mode = invalid
+				return
 			}
 			typ = Default(typ)
 		}
@@ -156,34 +162,23 @@
 	}
 
 	check.assignment(x, lhs.typ, context)
-	if x.mode == invalid {
-		lhs.used = true // avoid follow-on "declared and not used" errors
-		return nil
-	}
-
-	return x.typ
 }
 
-func (check *Checker) assignVar(lhs syntax.Expr, x *operand) Type {
-	if x.mode == invalid || x.typ == Typ[Invalid] {
-		check.use(lhs)
-		return nil
-	}
-
+// lhsVar checks a lhs variable in an assignment and returns its type.
+// lhsVar takes care of not counting a lhs identifier as a "use" of
+// that identifier. The result is nil if it is the blank identifier,
+// and Typ[Invalid] if it is an invalid lhs expression.
+func (check *Checker) lhsVar(lhs syntax.Expr) Type {
 	// Determine if the lhs is a (possibly parenthesized) identifier.
 	ident, _ := unparen(lhs).(*syntax.Name)
 
 	// Don't evaluate lhs if it is the blank identifier.
 	if ident != nil && ident.Value == "_" {
 		check.recordDef(ident, nil)
-		check.assignment(x, nil, "assignment to _ identifier")
-		if x.mode == invalid {
-			return nil
-		}
-		return x.typ
+		return nil
 	}
 
-	// If the lhs is an identifier denoting a variable v, this assignment
+	// If the lhs is an identifier denoting a variable v, this reference
 	// is not a 'use' of v. Remember current value of v.used and restore
 	// after evaluating the lhs via check.expr.
 	var v *Var
@@ -200,44 +195,66 @@
 		}
 	}
 
-	var z operand
-	check.expr(&z, lhs)
+	var x operand
+	check.expr(nil, &x, lhs)
+
 	if v != nil {
 		v.used = v_used // restore v.used
 	}
 
-	if z.mode == invalid || z.typ == Typ[Invalid] {
-		return nil
+	if x.mode == invalid || x.typ == Typ[Invalid] {
+		return Typ[Invalid]
 	}
 
 	// spec: "Each left-hand side operand must be addressable, a map index
 	// expression, or the blank identifier. Operands may be parenthesized."
-	switch z.mode {
+	switch x.mode {
 	case invalid:
-		return nil
+		return Typ[Invalid]
 	case variable, mapindex:
 		// ok
 	default:
-		if sel, ok := z.expr.(*syntax.SelectorExpr); ok {
+		if sel, ok := x.expr.(*syntax.SelectorExpr); ok {
 			var op operand
-			check.expr(&op, sel.X)
+			check.expr(nil, &op, sel.X)
 			if op.mode == mapindex {
-				check.errorf(&z, UnaddressableFieldAssign, "cannot assign to struct field %s in map", syntax.String(z.expr))
-				return nil
+				check.errorf(&x, UnaddressableFieldAssign, "cannot assign to struct field %s in map", syntax.String(x.expr))
+				return Typ[Invalid]
 			}
 		}
-		check.errorf(&z, UnassignableOperand, "cannot assign to %s", &z)
-		return nil
-	}
-
-	check.assignment(x, z.typ, "assignment")
-	if x.mode == invalid {
-		return nil
+		check.errorf(&x, UnassignableOperand, "cannot assign to %s (neither addressable nor a map index expression)", x.expr)
+		return Typ[Invalid]
 	}
 
 	return x.typ
 }
 
+// assignVar checks the assignment lhs = rhs (if x == nil), or lhs = x (if x != nil).
+// If x != nil, it must be the evaluation of rhs (and rhs will be ignored).
+// If the assignment check fails and x != nil, x.mode is set to invalid.
+func (check *Checker) assignVar(lhs, rhs syntax.Expr, x *operand) {
+	T := check.lhsVar(lhs) // nil if lhs is _
+	if T == Typ[Invalid] {
+		if x != nil {
+			x.mode = invalid
+		} else {
+			check.use(rhs)
+		}
+		return
+	}
+
+	if x == nil {
+		x = new(operand)
+		check.expr(T, x, rhs)
+	}
+
+	context := "assignment"
+	if T == nil {
+		context = "assignment to _ identifier"
+	}
+	check.assignment(x, T, context)
+}
+
 // operandTypes returns the list of types for the given operands.
 func operandTypes(list []*operand) (res []Type) {
 	for _, x := range list {
@@ -266,7 +283,7 @@
 		case t == nil:
 			fallthrough // should not happen but be cautious
 		case t == Typ[Invalid]:
-			s = "<T>"
+			s = "unknown type"
 		case isUntyped(t):
 			if isNumeric(t) {
 				// Do not imply a specific type requirement:
@@ -297,9 +314,9 @@
 	return fmt.Sprintf("%d %s", x, unit)
 }
 
-func (check *Checker) assignError(rhs []syntax.Expr, nvars, nvals int) {
-	vars := measure(nvars, "variable")
-	vals := measure(nvals, "value")
+func (check *Checker) assignError(rhs []syntax.Expr, l, r int) {
+	vars := measure(l, "variable")
+	vals := measure(r, "value")
 	rhs0 := rhs[0]
 
 	if len(rhs) == 1 {
@@ -311,123 +328,162 @@
 	check.errorf(rhs0, WrongAssignCount, "assignment mismatch: %s but %s", vars, vals)
 }
 
-// If returnStmt != nil, initVars is called to type-check the assignment
-// of return expressions, and returnStmt is the return statement.
-func (check *Checker) initVars(lhs []*Var, orig_rhs []syntax.Expr, returnStmt syntax.Stmt) {
-	rhs, commaOk := check.exprList(orig_rhs, len(lhs) == 2 && returnStmt == nil)
-
-	if len(lhs) != len(rhs) {
-		// invalidate lhs
-		for _, obj := range lhs {
-			obj.used = true // avoid declared and not used errors
-			if obj.typ == nil {
-				obj.typ = Typ[Invalid]
-			}
-		}
-		// don't report an error if we already reported one
-		for _, x := range rhs {
-			if x.mode == invalid {
-				return
-			}
-		}
-		if returnStmt != nil {
-			var at poser = returnStmt
-			qualifier := "not enough"
-			if len(rhs) > len(lhs) {
-				at = rhs[len(lhs)].expr // report at first extra value
-				qualifier = "too many"
-			} else if len(rhs) > 0 {
-				at = rhs[len(rhs)-1].expr // report at last value
-			}
-			var err error_
-			err.code = WrongResultCount
-			err.errorf(at, "%s return values", qualifier)
-			err.errorf(nopos, "have %s", check.typesSummary(operandTypes(rhs), false))
-			err.errorf(nopos, "want %s", check.typesSummary(varTypes(lhs), false))
-			check.report(&err)
-			return
-		}
-		check.assignError(orig_rhs, len(lhs), len(rhs))
-		return
+func (check *Checker) returnError(at poser, lhs []*Var, rhs []*operand) {
+	l, r := len(lhs), len(rhs)
+	qualifier := "not enough"
+	if r > l {
+		at = rhs[l] // report at first extra value
+		qualifier = "too many"
+	} else if r > 0 {
+		at = rhs[r-1] // report at last value
 	}
+	var err error_
+	err.code = WrongResultCount
+	err.errorf(at, "%s return values", qualifier)
+	err.errorf(nopos, "have %s", check.typesSummary(operandTypes(rhs), false))
+	err.errorf(nopos, "want %s", check.typesSummary(varTypes(lhs), false))
+	check.report(&err)
+}
 
+// initVars type-checks assignments of initialization expressions orig_rhs
+// to variables lhs.
+// If returnStmt is non-nil, initVars type-checks the implicit assignment
+// of result expressions orig_rhs to function result parameters lhs.
+func (check *Checker) initVars(lhs []*Var, orig_rhs []syntax.Expr, returnStmt syntax.Stmt) {
 	context := "assignment"
 	if returnStmt != nil {
 		context = "return statement"
 	}
 
-	if commaOk {
-		var a [2]Type
-		for i := range a {
-			a[i] = check.initVar(lhs[i], rhs[i], context)
+	l, r := len(lhs), len(orig_rhs)
+
+	// If l == 1 and the rhs is a single call, for a better
+	// error message don't handle it as n:n mapping below.
+	isCall := false
+	if r == 1 {
+		_, isCall = unparen(orig_rhs[0]).(*syntax.CallExpr)
+	}
+
+	// If we have a n:n mapping from lhs variable to rhs expression,
+	// each value can be assigned to its corresponding variable.
+	if l == r && !isCall {
+		var x operand
+		for i, lhs := range lhs {
+			check.expr(lhs.typ, &x, orig_rhs[i])
+			check.initVar(lhs, &x, context)
 		}
-		check.recordCommaOkTypes(orig_rhs[0], a)
 		return
 	}
 
-	ok := true
-	for i, lhs := range lhs {
-		if check.initVar(lhs, rhs[i], context) == nil {
-			ok = false
+	// If we don't have an n:n mapping, the rhs must be a single expression
+	// resulting in 2 or more values; otherwise we have an assignment mismatch.
+	if r != 1 {
+		// Only report a mismatch error if there are no other errors on the rhs.
+		if check.use(orig_rhs...) {
+			if returnStmt != nil {
+				rhs := check.exprList(orig_rhs)
+				check.returnError(returnStmt, lhs, rhs)
+			} else {
+				check.assignError(orig_rhs, l, r)
+			}
 		}
+		// ensure that LHS variables have a type
+		for _, v := range lhs {
+			if v.typ == nil {
+				v.typ = Typ[Invalid]
+			}
+		}
+		return
 	}
 
-	// avoid follow-on "declared and not used" errors if any initialization failed
-	if !ok {
-		for _, lhs := range lhs {
-			lhs.used = true
+	rhs, commaOk := check.multiExpr(orig_rhs[0], l == 2 && returnStmt == nil)
+	r = len(rhs)
+	if l == r {
+		for i, lhs := range lhs {
+			check.initVar(lhs, rhs[i], context)
+		}
+		// Only record comma-ok expression if both initializations succeeded
+		// (go.dev/issue/59371).
+		if commaOk && rhs[0].mode != invalid && rhs[1].mode != invalid {
+			check.recordCommaOkTypes(orig_rhs[0], rhs)
+		}
+		return
+	}
+
+	// In all other cases we have an assignment mismatch.
+	// Only report a mismatch error if there are no other errors on the rhs.
+	if rhs[0].mode != invalid {
+		if returnStmt != nil {
+			check.returnError(returnStmt, lhs, rhs)
+		} else {
+			check.assignError(orig_rhs, l, r)
 		}
 	}
+	// ensure that LHS variables have a type
+	for _, v := range lhs {
+		if v.typ == nil {
+			v.typ = Typ[Invalid]
+		}
+	}
+	// orig_rhs[0] was already evaluated
 }
 
+// assignVars type-checks assignments of expressions orig_rhs to variables lhs.
 func (check *Checker) assignVars(lhs, orig_rhs []syntax.Expr) {
-	rhs, commaOk := check.exprList(orig_rhs, len(lhs) == 2)
+	l, r := len(lhs), len(orig_rhs)
 
-	if len(lhs) != len(rhs) {
-		check.use(lhs...)
-		// don't report an error if we already reported one
-		for _, x := range rhs {
-			if x.mode == invalid {
-				return
-			}
+	// If l == 1 and the rhs is a single call, for a better
+	// error message don't handle it as n:n mapping below.
+	isCall := false
+	if r == 1 {
+		_, isCall = unparen(orig_rhs[0]).(*syntax.CallExpr)
+	}
+
+	// If we have a n:n mapping from lhs variable to rhs expression,
+	// each value can be assigned to its corresponding variable.
+	if l == r && !isCall {
+		for i, lhs := range lhs {
+			check.assignVar(lhs, orig_rhs[i], nil)
 		}
-		check.assignError(orig_rhs, len(lhs), len(rhs))
 		return
 	}
 
-	if commaOk {
-		var a [2]Type
-		for i := range a {
-			a[i] = check.assignVar(lhs[i], rhs[i])
+	// If we don't have an n:n mapping, the rhs must be a single expression
+	// resulting in 2 or more values; otherwise we have an assignment mismatch.
+	if r != 1 {
+		// Only report a mismatch error if there are no other errors on the lhs or rhs.
+		okLHS := check.useLHS(lhs...)
+		okRHS := check.use(orig_rhs...)
+		if okLHS && okRHS {
+			check.assignError(orig_rhs, l, r)
 		}
-		check.recordCommaOkTypes(orig_rhs[0], a)
 		return
 	}
 
-	ok := true
-	for i, lhs := range lhs {
-		if check.assignVar(lhs, rhs[i]) == nil {
-			ok = false
+	rhs, commaOk := check.multiExpr(orig_rhs[0], l == 2)
+	r = len(rhs)
+	if l == r {
+		for i, lhs := range lhs {
+			check.assignVar(lhs, nil, rhs[i])
 		}
+		// Only record comma-ok expression if both assignments succeeded
+		// (go.dev/issue/59371).
+		if commaOk && rhs[0].mode != invalid && rhs[1].mode != invalid {
+			check.recordCommaOkTypes(orig_rhs[0], rhs)
+		}
+		return
 	}
 
-	// avoid follow-on "declared and not used" errors if any assignment failed
-	if !ok {
-		// don't call check.use to avoid re-evaluation of the lhs expressions
-		for _, lhs := range lhs {
-			if name, _ := unparen(lhs).(*syntax.Name); name != nil {
-				if obj := check.lookup(name.Value); obj != nil {
-					// see comment in assignVar
-					if v, _ := obj.(*Var); v != nil && v.pkg == check.pkg {
-						v.used = true
-					}
-				}
-			}
-		}
+	// In all other cases we have an assignment mismatch.
+	// Only report a mismatch error if there are no other errors on the rhs.
+	if rhs[0].mode != invalid {
+		check.assignError(orig_rhs, l, r)
 	}
+	check.useLHS(lhs...)
+	// orig_rhs[0] was already evaluated
 }
 
-// unpack unpacks a *syntax.ListExpr into a list of syntax.Expr.
+// unpackExpr unpacks a *syntax.ListExpr into a list of syntax.Expr.
 // Helper introduced for the go/types -> types2 port.
 // TODO(gri) Should find a more efficient solution that doesn't
 // require introduction of a new slice for simple
@@ -454,7 +510,7 @@
 	for i, lhs := range lhs {
 		ident, _ := lhs.(*syntax.Name)
 		if ident == nil {
-			check.use(lhs)
+			check.useLHS(lhs)
 			check.errorf(lhs, BadDecl, "non-name %s on left side of :=", lhs)
 			hasErr = true
 			continue
diff --git a/src/cmd/compile/internal/types2/builtins.go b/src/cmd/compile/internal/types2/builtins.go
index 531e41d..7a209e7 100644
--- a/src/cmd/compile/internal/types2/builtins.go
+++ b/src/cmd/compile/internal/types2/builtins.go
@@ -18,12 +18,16 @@
 // 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 *syntax.CallExpr, id builtinId) (_ bool) {
+	argList := call.ArgList
+
 	// append is the only built-in that permits the use of ... for the last argument
 	bin := predeclaredFuncs[id]
 	if call.HasDots && id != _Append {
 		//check.errorf(call.Ellipsis, invalidOp + "invalid use of ... with built-in %s", bin.name)
-		check.errorf(call, InvalidDotDotDot, invalidOp+"invalid use of ... with built-in %s", bin.name)
-		check.use(call.ArgList...)
+		check.errorf(call,
+			InvalidDotDotDot,
+			invalidOp+"invalid use of ... with built-in %s", bin.name)
+		check.use(argList...)
 		return
 	}
 
@@ -39,24 +43,28 @@
 		check.hasCallOrRecv = false
 	}
 
-	// determine actual arguments
-	var arg func(*operand, int) // TODO(gri) remove use of arg getter in favor of using xlist directly
-	nargs := len(call.ArgList)
+	// Evaluate arguments for built-ins that use ordinary (value) arguments.
+	// For built-ins with special argument handling (make, new, etc.),
+	// evaluation is done by the respective built-in code.
+	var args []*operand // not valid for _Make, _New, _Offsetof, _Trace
+	var nargs int
 	switch id {
 	default:
-		// make argument getter
-		xlist, _ := check.exprList(call.ArgList, false)
-		arg = func(x *operand, i int) { *x = *xlist[i] }
-		nargs = len(xlist)
-		// evaluate first argument, if present
-		if nargs > 0 {
-			arg(x, 0)
-			if x.mode == invalid {
+		// check all arguments
+		args = check.exprList(argList)
+		nargs = len(args)
+		for _, a := range args {
+			if a.mode == invalid {
 				return
 			}
 		}
+		// first argument is always in x
+		if nargs > 0 {
+			*x = *args[0]
+		}
 	case _Make, _New, _Offsetof, _Trace:
 		// arguments require special handling
+		nargs = len(argList)
 	}
 
 	// check argument count
@@ -103,21 +111,15 @@
 			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.HasDots {
 			if ok, _ := x.assignableTo(check, NewSlice(universeByte), nil); ok {
-				arg(x, 1)
-				if x.mode == invalid {
-					return
-				}
-				if t := coreString(x.typ); t != nil && isString(t) {
+				y := args[1]
+				if t := coreString(y.typ); t != nil && isString(t) {
 					if check.recordTypes() {
-						sig := makeSig(S, S, x.typ)
+						sig := makeSig(S, S, y.typ)
 						sig.variadic = true
 						check.recordBuiltinType(call.Fun, sig)
 					}
@@ -125,25 +127,13 @@
 					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
-		var xlist []*operand
-		// convert []operand to []*operand
-		for i := range alist {
-			xlist = append(xlist, &alist[i])
-		}
-		for i := len(alist); i < nargs; i++ {
-			var x operand
-			arg(&x, i)
-			xlist = append(xlist, &x)
-		}
-		check.arguments(call, sig, nil, xlist, nil) // discard result (we know the result type)
+		check.arguments(call, sig, nil, nil, args, nil, nil) // discard result (we know the result type)
 		// ok to continue even if check.arguments reported errors
 
 		x.mode = value
@@ -214,12 +204,15 @@
 			}
 		}
 
-		if mode == invalid && under(x.typ) != Typ[Invalid] {
-			code := InvalidCap
-			if id == _Len {
-				code = InvalidLen
+		if mode == invalid {
+			// avoid error if underlying type is invalid
+			if under(x.typ) != Typ[Invalid] {
+				code := InvalidCap
+				if id == _Len {
+					code = InvalidLen
+				}
+				check.errorf(x, code, invalidArg+"%s for %s", x, bin.name)
 			}
-			check.errorf(x, code, invalidArg+"%s for %s", x, bin.name)
 			return
 		}
 
@@ -234,21 +227,14 @@
 
 	case _Clear:
 		// clear(m)
-		if !check.allowVersion(check.pkg, 1, 21) {
-			check.versionErrorf(call.Fun, "go1.21", "clear")
-			return
-		}
+		check.verifyVersionf(call.Fun, go1_21, "clear")
 
 		if !underIs(x.typ, func(u Type) bool {
-			switch u := u.(type) {
+			switch u.(type) {
 			case *Map, *Slice:
 				return true
-			case *Pointer:
-				if _, ok := under(u.base).(*Array); ok {
-					return true
-				}
 			}
-			check.errorf(x, InvalidClear, invalidArg+"cannot clear %s: argument must be (or constrained by) map, slice, or array pointer", x)
+			check.errorf(x, InvalidClear, invalidArg+"cannot clear %s: argument must be (or constrained by) map or slice", x)
 			return false
 		}) {
 			return
@@ -282,11 +268,7 @@
 
 	case _Complex:
 		// complex(x, y floatT) complexT
-		var y operand
-		arg(&y, 1)
-		if y.mode == invalid {
-			return
-		}
+		y := args[1]
 
 		// convert or check untyped arguments
 		d := 0
@@ -304,7 +286,7 @@
 			check.convertUntyped(x, y.typ)
 		case 2:
 			// only y is untyped => convert to type of x
-			check.convertUntyped(&y, x.typ)
+			check.convertUntyped(y, x.typ)
 		case 3:
 			// x and y are untyped =>
 			// 1) if both are constants, convert them to untyped
@@ -321,10 +303,10 @@
 					}
 				}
 				toFloat(x)
-				toFloat(&y)
+				toFloat(y)
 			} else {
 				check.convertUntyped(x, Typ[Float64])
-				check.convertUntyped(&y, Typ[Float64])
+				check.convertUntyped(y, Typ[Float64])
 				// x and y should be invalid now, but be conservative
 				// and check below
 			}
@@ -378,11 +360,7 @@
 		// copy(x, y []T) int
 		dst, _ := coreType(x.typ).(*Slice)
 
-		var y operand
-		arg(&y, 1)
-		if y.mode == invalid {
-			return
-		}
+		y := args[1]
 		src0 := coreString(y.typ)
 		if src0 != nil && isString(src0) {
 			src0 = NewSlice(universeByte)
@@ -390,12 +368,12 @@
 		src, _ := src0.(*Slice)
 
 		if dst == nil || src == nil {
-			check.errorf(x, InvalidCopy, invalidArg+"copy expects slice arguments; found %s and %s", x, &y)
+			check.errorf(x, InvalidCopy, invalidArg+"copy expects slice arguments; found %s and %s", x, y)
 			return
 		}
 
 		if !Identical(dst.elem, src.elem) {
-			check.errorf(x, InvalidCopy, invalidArg+"arguments to copy %s and %s have different element types %s and %s", x, &y, dst.elem, src.elem)
+			check.errorf(x, InvalidCopy, invalidArg+"arguments to copy %s and %s have different element types %s and %s", x, y, dst.elem, src.elem)
 			return
 		}
 
@@ -427,11 +405,7 @@
 			return
 		}
 
-		arg(x, 1) // k
-		if x.mode == invalid {
-			return
-		}
-
+		*x = *args[1] // key
 		check.assignment(x, key, "argument to delete")
 		if x.mode == invalid {
 			return
@@ -514,7 +488,7 @@
 		// make(T, n)
 		// make(T, n, m)
 		// (no argument evaluated yet)
-		arg0 := call.ArgList[0]
+		arg0 := argList[0]
 		T := check.varType(arg0)
 		if T == Typ[Invalid] {
 			return
@@ -540,7 +514,7 @@
 
 		types := []Type{T}
 		var sizes []int64 // constant integer arguments, if any
-		for _, arg := range call.ArgList[1:] {
+		for _, arg := range argList[1:] {
 			typ, size := check.index(arg, -1) // ok to continue with typ == Typ[Invalid]
 			types = append(types, typ)
 			if size >= 0 {
@@ -548,7 +522,7 @@
 			}
 		}
 		if len(sizes) == 2 && sizes[0] > sizes[1] {
-			check.error(call.ArgList[1], SwappedMakeArgs, invalidArg+"length and capacity swapped")
+			check.error(argList[1], SwappedMakeArgs, invalidArg+"length and capacity swapped")
 			// safe to continue
 		}
 		x.mode = value
@@ -557,10 +531,75 @@
 			check.recordBuiltinType(call.Fun, makeSig(x.typ, types...))
 		}
 
+	case _Max, _Min:
+		// max(x, ...)
+		// min(x, ...)
+		check.verifyVersionf(call.Fun, go1_21, bin.name)
+
+		op := token.LSS
+		if id == _Max {
+			op = token.GTR
+		}
+
+		for i, a := range args {
+			if a.mode == invalid {
+				return
+			}
+
+			if !allOrdered(a.typ) {
+				check.errorf(a, InvalidMinMaxOperand, invalidArg+"%s cannot be ordered", a)
+				return
+			}
+
+			// The first argument is already in x and there's nothing left to do.
+			if i > 0 {
+				check.matchTypes(x, a)
+				if x.mode == invalid {
+					return
+				}
+
+				if !Identical(x.typ, a.typ) {
+					check.errorf(a, MismatchedTypes, invalidArg+"mismatched types %s (previous argument) and %s (type of %s)", x.typ, a.typ, a.expr)
+					return
+				}
+
+				if x.mode == constant_ && a.mode == constant_ {
+					if constant.Compare(a.val, op, x.val) {
+						*x = *a
+					}
+				} else {
+					x.mode = value
+				}
+			}
+		}
+
+		// If nargs == 1, make sure x.mode is either a value or a constant.
+		if x.mode != constant_ {
+			x.mode = value
+			// A value must not be untyped.
+			check.assignment(x, &emptyInterface, "argument to "+bin.name)
+			if x.mode == invalid {
+				return
+			}
+		}
+
+		// Use the final type computed above for all arguments.
+		for _, a := range args {
+			check.updateExprType(a.expr, x.typ, true)
+		}
+
+		if check.recordTypes() && x.mode != constant_ {
+			types := make([]Type, nargs)
+			for i := range types {
+				types[i] = x.typ
+			}
+			check.recordBuiltinType(call.Fun, makeSig(x.typ, types...))
+		}
+
 	case _New:
 		// new(T)
 		// (no argument evaluated yet)
-		T := check.varType(call.ArgList[0])
+		T := check.varType(argList[0])
 		if T == Typ[Invalid] {
 			return
 		}
@@ -602,16 +641,12 @@
 		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
-				}
-				check.assignment(x, nil, "argument to "+predeclaredFuncs[id].name)
-				if x.mode == invalid {
-					// TODO(gri) "use" all arguments?
+			for i, a := range args {
+				check.assignment(a, nil, "argument to "+predeclaredFuncs[id].name)
+				if a.mode == invalid {
 					return
 				}
-				params[i] = x.typ
+				params[i] = a.typ
 			}
 		}
 
@@ -630,19 +665,15 @@
 
 	case _Add:
 		// unsafe.Add(ptr unsafe.Pointer, len IntegerType) unsafe.Pointer
-		if !check.allowVersion(check.pkg, 1, 17) {
-			check.versionErrorf(call.Fun, "go1.17", "unsafe.Add")
-			return
-		}
+		check.verifyVersionf(call.Fun, go1_17, "unsafe.Add")
 
 		check.assignment(x, Typ[UnsafePointer], "argument to unsafe.Add")
 		if x.mode == invalid {
 			return
 		}
 
-		var y operand
-		arg(&y, 1)
-		if !check.isValidIndex(&y, InvalidUnsafeAdd, "length", true) {
+		y := args[1]
+		if !check.isValidIndex(y, InvalidUnsafeAdd, "length", true) {
 			return
 		}
 
@@ -674,7 +705,7 @@
 	case _Offsetof:
 		// unsafe.Offsetof(x T) uintptr, where x must be a selector
 		// (no argument evaluated yet)
-		arg0 := call.ArgList[0]
+		arg0 := argList[0]
 		selx, _ := unparen(arg0).(*syntax.SelectorExpr)
 		if selx == nil {
 			check.errorf(arg0, BadOffsetofSyntax, invalidArg+"%s is not a selector expression", arg0)
@@ -682,7 +713,7 @@
 			return
 		}
 
-		check.expr(x, selx.X)
+		check.expr(nil, x, selx.X)
 		if x.mode == invalid {
 			return
 		}
@@ -710,7 +741,7 @@
 		// TODO(gri) Should we pass x.typ instead of base (and have indirect report if derefStructPtr indirected)?
 		check.recordSelection(selx, FieldVal, base, obj, index, false)
 
-		// record the selector expression (was bug - issue #47895)
+		// record the selector expression (was bug - go.dev/issue/47895)
 		{
 			mode := value
 			if x.mode == variable || indirect {
@@ -729,8 +760,13 @@
 				check.recordBuiltinType(call.Fun, makeSig(Typ[Uintptr], obj.Type()))
 			}
 		} else {
+			offs := check.conf.offsetof(base, index)
+			if offs < 0 {
+				check.errorf(x, TypeTooLarge, "%s is too large", x)
+				return
+			}
 			x.mode = constant_
-			x.val = constant.MakeInt64(check.conf.offsetof(base, index))
+			x.val = constant.MakeInt64(offs)
 			// result is constant - no need to record signature
 		}
 		x.typ = Typ[Uintptr]
@@ -748,18 +784,20 @@
 				check.recordBuiltinType(call.Fun, makeSig(Typ[Uintptr], x.typ))
 			}
 		} else {
+			size := check.conf.sizeof(x.typ)
+			if size < 0 {
+				check.errorf(x, TypeTooLarge, "%s is too large", x)
+				return
+			}
 			x.mode = constant_
-			x.val = constant.MakeInt64(check.conf.sizeof(x.typ))
+			x.val = constant.MakeInt64(size)
 			// result is constant - no need to record signature
 		}
 		x.typ = Typ[Uintptr]
 
 	case _Slice:
 		// unsafe.Slice(ptr *T, len IntegerType) []T
-		if !check.allowVersion(check.pkg, 1, 17) {
-			check.versionErrorf(call.Fun, "go1.17", "unsafe.Slice")
-			return
-		}
+		check.verifyVersionf(call.Fun, go1_17, "unsafe.Slice")
 
 		ptr, _ := under(x.typ).(*Pointer) // TODO(gri) should this be coreType rather than under?
 		if ptr == nil {
@@ -767,9 +805,8 @@
 			return
 		}
 
-		var y operand
-		arg(&y, 1)
-		if !check.isValidIndex(&y, InvalidUnsafeSlice, "length", false) {
+		y := args[1]
+		if !check.isValidIndex(y, InvalidUnsafeSlice, "length", false) {
 			return
 		}
 
@@ -781,10 +818,7 @@
 
 	case _SliceData:
 		// unsafe.SliceData(slice []T) *T
-		if !check.allowVersion(check.pkg, 1, 20) {
-			check.versionErrorf(call.Fun, "go1.20", "unsafe.SliceData")
-			return
-		}
+		check.verifyVersionf(call.Fun, go1_20, "unsafe.SliceData")
 
 		slice, _ := under(x.typ).(*Slice) // TODO(gri) should this be coreType rather than under?
 		if slice == nil {
@@ -800,19 +834,15 @@
 
 	case _String:
 		// unsafe.String(ptr *byte, len IntegerType) string
-		if !check.allowVersion(check.pkg, 1, 20) {
-			check.versionErrorf(call.Fun, "go1.20", "unsafe.String")
-			return
-		}
+		check.verifyVersionf(call.Fun, go1_20, "unsafe.String")
 
 		check.assignment(x, NewPointer(universeByte), "argument to unsafe.String")
 		if x.mode == invalid {
 			return
 		}
 
-		var y operand
-		arg(&y, 1)
-		if !check.isValidIndex(&y, InvalidUnsafeString, "length", false) {
+		y := args[1]
+		if !check.isValidIndex(y, InvalidUnsafeString, "length", false) {
 			return
 		}
 
@@ -824,10 +854,7 @@
 
 	case _StringData:
 		// unsafe.StringData(str string) *byte
-		if !check.allowVersion(check.pkg, 1, 20) {
-			check.versionErrorf(call.Fun, "go1.20", "unsafe.StringData")
-			return
-		}
+		check.verifyVersionf(call.Fun, go1_20, "unsafe.StringData")
 
 		check.assignment(x, Typ[String], "argument to unsafe.StringData")
 		if x.mode == invalid {
@@ -865,23 +892,27 @@
 		// Note: trace is only available in self-test mode.
 		// (no argument evaluated yet)
 		if nargs == 0 {
-			check.dump("%v: trace() without arguments", posFor(call))
+			check.dump("%v: trace() without arguments", atPos(call))
 			x.mode = novalue
 			break
 		}
 		var t operand
 		x1 := x
-		for _, arg := range call.ArgList {
-			check.rawExpr(x1, arg, nil, false) // permit trace for types, e.g.: new(trace(T))
-			check.dump("%v: %s", posFor(x1), x1)
+		for _, arg := range argList {
+			check.rawExpr(nil, x1, arg, nil, false) // permit trace for types, e.g.: new(trace(T))
+			check.dump("%v: %s", atPos(x1), x1)
 			x1 = &t // use incoming x only for first argument
 		}
+		if x.mode == invalid {
+			return
+		}
 		// trace is only available in test mode - no need to record signature
 
 	default:
 		unreachable()
 	}
 
+	assert(x.mode != invalid)
 	return true
 }
 
@@ -949,8 +980,8 @@
 
 		// We can type-check this fine but we're introducing a synthetic
 		// type parameter for the result. It's not clear what the API
-		// implications are here. Report an error for 1.18 but continue
-		// type-checking.
+		// implications are here. Report an error for 1.18 (see go.dev/issue/50912),
+		// but continue type-checking.
 		var code Code
 		switch id {
 		case _Real:
@@ -962,7 +993,7 @@
 		default:
 			unreachable()
 		}
-		check.softErrorf(x, code, "%s not supported as argument to %s for go1.18 (see issue #50937)", x, predeclaredFuncs[id].name)
+		check.softErrorf(x, code, "%s not supported as argument to %s for go1.18 (see go.dev/issue/50937)", x, predeclaredFuncs[id].name)
 
 		// Construct a suitable new type parameter for the result type.
 		// The type parameter is placed in the current package so export/import
diff --git a/src/cmd/compile/internal/types2/builtins_test.go b/src/cmd/compile/internal/types2/builtins_test.go
index 12c139f..875ee5a 100644
--- a/src/cmd/compile/internal/types2/builtins_test.go
+++ b/src/cmd/compile/internal/types2/builtins_test.go
@@ -7,7 +7,6 @@
 import (
 	"cmd/compile/internal/syntax"
 	"fmt"
-	"strings"
 	"testing"
 
 	. "cmd/compile/internal/types2"
@@ -43,8 +42,6 @@
 
 	{"clear", `var m map[float64]int; clear(m)`, `func(map[float64]int)`},
 	{"clear", `var s []byte; clear(s)`, `func([]byte)`},
-	{"clear", `var p *[10]int; clear(p)`, `func(*[10]int)`},
-	{"clear", `var s P; clear(s)`, `func(P)`},
 
 	{"close", `var c chan int; close(c)`, `func(chan int)`},
 	{"close", `var c chan<- chan string; close(c)`, `func(chan<- chan string)`},
@@ -79,7 +76,7 @@
 	{"make", `_ = make([]int, 10)`, `func([]int, int) []int`},
 	{"make", `type T []byte; _ = make(T, 10, 20)`, `func(p.T, int, int) p.T`},
 
-	// issue #37349
+	// go.dev/issue/37349
 	{"make", `              _ = make([]int, 0   )`, `func([]int, int) []int`},
 	{"make", `var l    int; _ = make([]int, l   )`, `func([]int, int) []int`},
 	{"make", `              _ = make([]int, 0, 0)`, `func([]int, int, int) []int`},
@@ -87,7 +84,7 @@
 	{"make", `var    c int; _ = make([]int, 0, c)`, `func([]int, int, int) []int`},
 	{"make", `var l, c int; _ = make([]int, l, c)`, `func([]int, int, int) []int`},
 
-	// issue #37393
+	// go.dev/issue/37393
 	{"make", `                _ = make([]int       , 0   )`, `func([]int, int) []int`},
 	{"make", `var l    byte ; _ = make([]int8      , l   )`, `func([]int8, byte) []int8`},
 	{"make", `                _ = make([]int16     , 0, 0)`, `func([]int16, int, int) []int16`},
@@ -95,9 +92,21 @@
 	{"make", `var    c int32; _ = make([]float64   , 0, c)`, `func([]float64, int, int32) []float64`},
 	{"make", `var l, c uint ; _ = make([]complex128, l, c)`, `func([]complex128, uint, uint) []complex128`},
 
-	// issue #45667
+	// go.dev/issue/45667
 	{"make", `const l uint = 1; _ = make([]int, l)`, `func([]int, uint) []int`},
 
+	{"max", `               _ = max(0        )`, `invalid type`}, // constant
+	{"max", `var x int    ; _ = max(x        )`, `func(int) int`},
+	{"max", `var x int    ; _ = max(0, x     )`, `func(int, int) int`},
+	{"max", `var x string ; _ = max("a", x   )`, `func(string, string) string`},
+	{"max", `var x float32; _ = max(0, 1.0, x)`, `func(float32, float32, float32) float32`},
+
+	{"min", `               _ = min(0        )`, `invalid type`}, // constant
+	{"min", `var x int    ; _ = min(x        )`, `func(int) int`},
+	{"min", `var x int    ; _ = min(0, x     )`, `func(int, int) int`},
+	{"min", `var x string ; _ = min("a", x   )`, `func(string, string) string`},
+	{"min", `var x float32; _ = min(0, 1.0, x)`, `func(float32, float32, float32) float32`},
+
 	{"new", `_ = new(int)`, `func(int) *int`},
 	{"new", `type T struct{}; _ = new(T)`, `func(p.T) *p.T`},
 
@@ -172,27 +181,12 @@
 	}
 }
 
-func parseGenericSrc(path, src string) (*syntax.File, error) {
-	errh := func(error) {} // dummy error handler so that parsing continues in presence of errors
-	return syntax.Parse(syntax.NewFileBase(path), strings.NewReader(src), errh, nil, 0)
-}
-
 func testBuiltinSignature(t *testing.T, name, src0, want string) {
 	src := fmt.Sprintf(`package p; import "unsafe"; type _ unsafe.Pointer /* use unsafe */; func _[P ~[]byte]() { %s }`, src0)
-	f, err := parseGenericSrc("", src)
-	if err != nil {
-		t.Errorf("%s: %s", src0, err)
-		return
-	}
 
-	conf := Config{Importer: defaultImporter()}
 	uses := make(map[*syntax.Name]Object)
 	types := make(map[syntax.Expr]TypeAndValue)
-	_, err = conf.Check(f.PkgName.Value, []*syntax.File{f}, &Info{Uses: uses, Types: types})
-	if err != nil {
-		t.Errorf("%s: %s", src0, err)
-		return
-	}
+	mustTypecheck(src, nil, &Info{Uses: uses, Types: types})
 
 	// find called function
 	n := 0
diff --git a/src/cmd/compile/internal/types2/call.go b/src/cmd/compile/internal/types2/call.go
index 7d660ca..24f54c3 100644
--- a/src/cmd/compile/internal/types2/call.go
+++ b/src/cmd/compile/internal/types2/call.go
@@ -13,54 +13,126 @@
 	"unicode"
 )
 
-// funcInst type-checks a function instantiation inst and returns the result in x.
-// The operand x must be the evaluation of inst.X and its type must be a signature.
-func (check *Checker) funcInst(x *operand, inst *syntax.IndexExpr) {
-	if !check.allowVersion(check.pkg, 1, 18) {
-		check.versionErrorf(inst.Pos(), "go1.18", "function instantiation")
+// funcInst type-checks a function instantiation.
+// The incoming x must be a generic function.
+// If inst != nil, it provides some or all of the type arguments (inst.Index).
+// If target type tsig != nil, the signature may be used to infer missing type
+// arguments of x, if any. At least one of tsig or inst must be provided.
+//
+// There are two modes of operation:
+//
+//  1. If infer == true, funcInst infers missing type arguments as needed and
+//     instantiates the function x. The returned results are nil.
+//
+//  2. If infer == false and inst provides all type arguments, funcInst
+//     instantiates the function x. The returned results are nil.
+//     If inst doesn't provide enough type arguments, funcInst returns the
+//     available arguments and the corresponding expression list; x remains
+//     unchanged.
+//
+// If an error (other than a version error) occurs in any case, it is reported
+// and x.mode is set to invalid.
+func (check *Checker) funcInst(tsig *Signature, pos syntax.Pos, x *operand, inst *syntax.IndexExpr, infer bool) ([]Type, []syntax.Expr) {
+	assert(tsig != nil || inst != nil)
+
+	var instErrPos poser
+	if inst != nil {
+		instErrPos = inst.Pos()
+	} else {
+		instErrPos = pos
+	}
+	versionErr := !check.verifyVersionf(instErrPos, go1_18, "function instantiation")
+
+	// targs and xlist are the type arguments and corresponding type expressions, or nil.
+	var targs []Type
+	var xlist []syntax.Expr
+	if inst != nil {
+		xlist = unpackExpr(inst.Index)
+		targs = check.typeList(xlist)
+		if targs == nil {
+			x.mode = invalid
+			x.expr = inst
+			return nil, nil
+		}
+		assert(len(targs) == len(xlist))
 	}
 
-	xlist := unpackExpr(inst.Index)
-	targs := check.typeList(xlist)
-	if targs == nil {
-		x.mode = invalid
-		x.expr = inst
-		return
-	}
-	assert(len(targs) == len(xlist))
-
-	// check number of type arguments (got) vs number of type parameters (want)
+	// Check the number of type arguments (got) vs number of type parameters (want).
+	// Note that x is a function value, not a type expression, so we don't need to
+	// call under below.
 	sig := x.typ.(*Signature)
 	got, want := len(targs), sig.TypeParams().Len()
-	if !useConstraintTypeInference && got != want || got > want {
+	if got > want {
+		// Providing too many type arguments is always an error.
 		check.errorf(xlist[got-1], WrongTypeArgCount, "got %d type arguments but want %d", got, want)
 		x.mode = invalid
 		x.expr = inst
-		return
+		return nil, nil
 	}
 
 	if got < want {
-		targs = check.infer(inst.Pos(), sig.TypeParams().list(), targs, nil, nil)
+		if !infer {
+			return targs, xlist
+		}
+
+		// If the uninstantiated or partially instantiated function x is used in
+		// an assignment (tsig != nil), infer missing type arguments by treating
+		// the assignment
+		//
+		//    var tvar tsig = x
+		//
+		// like a call g(tvar) of the synthetic generic function g
+		//
+		//    func g[type_parameters_of_x](func_type_of_x)
+		//
+		var args []*operand
+		var params []*Var
+		if tsig != nil && sig.tparams != nil {
+			if !versionErr && !check.allowVersion(check.pkg, instErrPos, go1_21) {
+				if inst != nil {
+					check.versionErrorf(instErrPos, go1_21, "partially instantiated function in assignment")
+				} else {
+					check.versionErrorf(instErrPos, go1_21, "implicitly instantiated function in assignment")
+				}
+			}
+			gsig := NewSignatureType(nil, nil, nil, sig.params, sig.results, sig.variadic)
+			params = []*Var{NewVar(x.Pos(), check.pkg, "", gsig)}
+			// The type of the argument operand is tsig, which is the type of the LHS in an assignment
+			// or the result type in a return statement. Create a pseudo-expression for that operand
+			// that makes sense when reported in error messages from infer, below.
+			expr := syntax.NewName(x.Pos(), "variable in assignment")
+			args = []*operand{{mode: value, expr: expr, typ: tsig}}
+		}
+
+		// Rename type parameters to avoid problems with recursive instantiations.
+		// Note that NewTuple(params...) below is (*Tuple)(nil) if len(params) == 0, as desired.
+		tparams, params2 := check.renameTParams(pos, sig.TypeParams().list(), NewTuple(params...))
+
+		targs = check.infer(pos, tparams, targs, params2.(*Tuple), args)
 		if targs == nil {
 			// error was already reported
 			x.mode = invalid
 			x.expr = inst
-			return
+			return nil, nil
 		}
 		got = len(targs)
 	}
 	assert(got == want)
 
 	// instantiate function signature
-	sig = check.instantiateSignature(x.Pos(), sig, targs, xlist)
-	assert(sig.TypeParams().Len() == 0) // signature is not generic anymore
-	check.recordInstance(inst.X, targs, sig)
+	expr := x.expr // if we don't have an index expression, keep the existing expression of x
+	if inst != nil {
+		expr = inst
+	}
+	sig = check.instantiateSignature(x.Pos(), expr, sig, targs, xlist)
+
 	x.typ = sig
 	x.mode = value
-	x.expr = inst
+	x.expr = expr
+	return nil, nil
 }
 
-func (check *Checker) instantiateSignature(pos syntax.Pos, typ *Signature, targs []Type, xlist []syntax.Expr) (res *Signature) {
+func (check *Checker) instantiateSignature(pos syntax.Pos, expr syntax.Expr, typ *Signature, targs []Type, xlist []syntax.Expr) (res *Signature) {
 	assert(check != nil)
 	assert(len(targs) == typ.TypeParams().Len())
 
@@ -74,9 +146,11 @@
 	}
 
 	inst := check.instance(pos, typ, targs, nil, check.context()).(*Signature)
+	assert(inst.TypeParams().Len() == 0) // signature is not generic anymore
+	check.recordInstance(expr, targs, inst)
 	assert(len(xlist) <= len(targs))
 
-	// verify instantiation lazily (was issue #50450)
+	// verify instantiation lazily (was go.dev/issue/50450)
 	check.later(func() {
 		tparams := typ.TypeParams().list()
 		if i, err := check.verify(pos, tparams, targs, check.context()); err != nil {
@@ -119,7 +193,7 @@
 
 	case typexpr:
 		// conversion
-		check.nonGeneric(x)
+		check.nonGeneric(nil, x)
 		if x.mode == invalid {
 			return conversion
 		}
@@ -129,7 +203,7 @@
 		case 0:
 			check.errorf(call, WrongArgCount, "missing argument in conversion to %s", T)
 		case 1:
-			check.expr(x, call.ArgList[0])
+			check.expr(nil, x, call.ArgList[0])
 			if x.mode != invalid {
 				if t, _ := under(T).(*Interface); t != nil && !isTypeParam(T) {
 					if !t.IsMethodSet() {
@@ -210,14 +284,8 @@
 		// is an error checking its arguments (for example, if an incorrect number
 		// of arguments is supplied).
 		if got == want && want > 0 {
-			if !check.allowVersion(check.pkg, 1, 18) {
-				check.versionErrorf(inst.Pos(), "go1.18", "function instantiation")
-			}
-
-			sig = check.instantiateSignature(inst.Pos(), sig, targs, xlist)
-			assert(sig.TypeParams().Len() == 0) // signature is not generic anymore
-			check.recordInstance(inst, targs, sig)
-
+			check.verifyVersionf(inst, go1_18, "function instantiation")
+			sig = check.instantiateSignature(inst.Pos(), inst, sig, targs, xlist)
 			// targs have been consumed; proceed with checking arguments of the
 			// non-generic signature.
 			targs = nil
@@ -226,8 +294,8 @@
 	}
 
 	// evaluate arguments
-	args, _ := check.exprList(call.ArgList, false)
-	sig = check.arguments(call, sig, targs, args, xlist)
+	args, atargs, atxlist := check.genericExprList(call.ArgList)
+	sig = check.arguments(call, sig, targs, xlist, args, atargs, atxlist)
 
 	if wasGeneric && sig.TypeParams().Len() == 0 {
 		// update the recorded type of call.Fun to its instantiated type
@@ -252,8 +320,8 @@
 	x.expr = call
 	check.hasCallOrRecv = true
 
-	// if type inference failed, a parametrized result must be invalidated
-	// (operands cannot have a parametrized type)
+	// if type inference failed, a parameterized result must be invalidated
+	// (operands cannot have a parameterized type)
 	if x.mode == value && sig.TypeParams().Len() > 0 && isParameterized(sig.TypeParams().list(), x.typ) {
 		x.mode = invalid
 	}
@@ -261,61 +329,136 @@
 	return statement
 }
 
-func (check *Checker) exprList(elist []syntax.Expr, allowCommaOk bool) (xlist []*operand, commaOk bool) {
-	switch len(elist) {
-	case 0:
-		// nothing to do
-
-	case 1:
-		// single (possibly comma-ok) value, or function returning multiple values
-		e := elist[0]
-		var x operand
-		check.multiExpr(&x, e)
-		if t, ok := x.typ.(*Tuple); ok && x.mode != invalid {
-			// multiple values
-			xlist = make([]*operand, t.Len())
-			for i, v := range t.vars {
-				xlist[i] = &operand{mode: value, expr: e, typ: v.typ}
-			}
-			break
-		}
-
-		// exactly one (possibly invalid or comma-ok) value
-		xlist = []*operand{&x}
-		if allowCommaOk && (x.mode == mapindex || x.mode == commaok || x.mode == commaerr) {
-			x.mode = value
-			xlist = append(xlist, &operand{mode: value, expr: e, typ: Typ[UntypedBool]})
-			commaOk = true
-		}
-
-	default:
+// exprList evaluates a list of expressions and returns the corresponding operands.
+// A single-element expression list may evaluate to multiple operands.
+func (check *Checker) exprList(elist []syntax.Expr) (xlist []*operand) {
+	if n := len(elist); n == 1 {
+		xlist, _ = check.multiExpr(elist[0], false)
+	} else if n > 1 {
 		// multiple (possibly invalid) values
-		xlist = make([]*operand, len(elist))
+		xlist = make([]*operand, n)
 		for i, e := range elist {
 			var x operand
-			check.expr(&x, e)
+			check.expr(nil, &x, e)
 			xlist[i] = &x
 		}
 	}
+	return
+}
+
+// genericExprList is like exprList but result operands may be uninstantiated or partially
+// instantiated generic functions (where constraint information is insufficient to infer
+// the missing type arguments) for Go 1.21 and later.
+// For each non-generic or uninstantiated generic operand, the corresponding targsList and
+// xlistList elements do not exist (targsList and xlistList are nil) or the elements are nil.
+// For each partially instantiated generic function operand, the corresponding targsList and
+// xlistList elements are the operand's partial type arguments and type expression lists.
+func (check *Checker) genericExprList(elist []syntax.Expr) (resList []*operand, targsList [][]Type, xlistList [][]syntax.Expr) {
+	if debug {
+		defer func() {
+			// targsList and xlistList must have matching lengths
+			assert(len(targsList) == len(xlistList))
+			// type arguments must only exist for partially instantiated functions
+			for i, x := range resList {
+				if i < len(targsList) {
+					if n := len(targsList[i]); n > 0 {
+						// x must be a partially instantiated function
+						assert(n < x.typ.(*Signature).TypeParams().Len())
+					}
+				}
+			}
+		}()
+	}
+
+	// Before Go 1.21, uninstantiated or partially instantiated argument functions are
+	// nor permitted. Checker.funcInst must infer missing type arguments in that case.
+	infer := true // for -lang < go1.21
+	n := len(elist)
+	if n > 0 && check.allowVersion(check.pkg, elist[0], go1_21) {
+		infer = false
+	}
+
+	if n == 1 {
+		// single value (possibly a partially instantiated function), or a multi-valued expression
+		e := elist[0]
+		var x operand
+		if inst, _ := e.(*syntax.IndexExpr); inst != nil && check.indexExpr(&x, inst) {
+			// x is a generic function.
+			targs, xlist := check.funcInst(nil, x.Pos(), &x, inst, infer)
+			if targs != nil {
+				// x was not instantiated: collect the (partial) type arguments.
+				targsList = [][]Type{targs}
+				xlistList = [][]syntax.Expr{xlist}
+				// Update x.expr so that we can record the partially instantiated function.
+				x.expr = inst
+			} else {
+				// x was instantiated: we must record it here because we didn't
+				// use the usual expression evaluators.
+				check.record(&x)
+			}
+			resList = []*operand{&x}
+		} else {
+			// x is not a function instantiation (it may still be a generic function).
+			check.rawExpr(nil, &x, e, nil, true)
+			check.exclude(&x, 1<<novalue|1<<builtin|1<<typexpr)
+			if t, ok := x.typ.(*Tuple); ok && x.mode != invalid {
+				// x is a function call returning multiple values; it cannot be generic.
+				resList = make([]*operand, t.Len())
+				for i, v := range t.vars {
+					resList[i] = &operand{mode: value, expr: e, typ: v.typ}
+				}
+			} else {
+				// x is exactly one value (possibly invalid or uninstantiated generic function).
+				resList = []*operand{&x}
+			}
+		}
+	} else if n > 1 {
+		// multiple values
+		resList = make([]*operand, n)
+		targsList = make([][]Type, n)
+		xlistList = make([][]syntax.Expr, n)
+		for i, e := range elist {
+			var x operand
+			if inst, _ := e.(*syntax.IndexExpr); inst != nil && check.indexExpr(&x, inst) {
+				// x is a generic function.
+				targs, xlist := check.funcInst(nil, x.Pos(), &x, inst, infer)
+				if targs != nil {
+					// x was not instantiated: collect the (partial) type arguments.
+					targsList[i] = targs
+					xlistList[i] = xlist
+					// Update x.expr so that we can record the partially instantiated function.
+					x.expr = inst
+				} else {
+					// x was instantiated: we must record it here because we didn't
+					// use the usual expression evaluators.
+					check.record(&x)
+				}
+			} else {
+				// x is exactly one value (possibly invalid or uninstantiated generic function).
+				check.genericExpr(&x, e)
+			}
+			resList[i] = &x
+		}
+	}
 
 	return
 }
 
-// xlist is the list of type argument expressions supplied in the source code.
-func (check *Checker) arguments(call *syntax.CallExpr, sig *Signature, targs []Type, args []*operand, xlist []syntax.Expr) (rsig *Signature) {
+// arguments type-checks arguments passed to a function call with the given signature.
+// The function and its arguments may be generic, and possibly partially instantiated.
+// targs and xlist are the function's type arguments (and corresponding expressions).
+// args are the function arguments. If an argument args[i] is a partially instantiated
+// generic function, atargs[i] and atxlist[i] are the corresponding type arguments
+// (and corresponding expressions).
+// If the callee is variadic, arguments adjusts its signature to match the provided
+// arguments. The type parameters and arguments of the callee and all its arguments
+// are used together to infer any missing type arguments, and the callee and argument
+// functions are instantiated as necessary.
+// The result signature is the (possibly adjusted and instantiated) function signature.
+// If an error occurred, the result signature is the incoming sig.
+func (check *Checker) arguments(call *syntax.CallExpr, sig *Signature, targs []Type, xlist []syntax.Expr, args []*operand, atargs [][]Type, atxlist [][]syntax.Expr) (rsig *Signature) {
 	rsig = sig
 
-	// TODO(gri) try to eliminate this extra verification loop
-	for _, a := range args {
-		switch a.mode {
-		case typexpr:
-			check.errorf(a, NotAnExpr, "%s used as value", a)
-			return
-		case invalid:
-			return
-		}
-	}
-
 	// Function call argument/parameter count requirements
 	//
 	//               | standard call    | dotdotdot call |
@@ -331,7 +474,7 @@
 
 	// set up parameters
 	sigParams := sig.params // adjusted for variadic functions (may be nil for empty parameter lists!)
-	adjusted := false       // indicates if sigParams is different from t.params
+	adjusted := false       // indicates if sigParams is different from sig.params
 	if sig.variadic {
 		if ddd {
 			// variadic_func(a, b, c...)
@@ -396,32 +539,108 @@
 		return
 	}
 
-	// infer type arguments and instantiate signature if necessary
-	if sig.TypeParams().Len() > 0 {
-		if !check.allowVersion(check.pkg, 1, 18) {
+	// collect type parameters of callee and generic function arguments
+	var tparams []*TypeParam
+
+	// collect type parameters of callee
+	n := sig.TypeParams().Len()
+	if n > 0 {
+		if !check.allowVersion(check.pkg, call.Pos(), go1_18) {
 			if iexpr, _ := call.Fun.(*syntax.IndexExpr); iexpr != nil {
-				check.versionErrorf(iexpr.Pos(), "go1.18", "function instantiation")
+				check.versionErrorf(iexpr, go1_18, "function instantiation")
 			} else {
-				check.versionErrorf(call.Pos(), "go1.18", "implicit function instantiation")
+				check.versionErrorf(call, go1_18, "implicit function instantiation")
 			}
 		}
-		targs := check.infer(call.Pos(), sig.TypeParams().list(), targs, sigParams, args)
+		// rename type parameters to avoid problems with recursive calls
+		var tmp Type
+		tparams, tmp = check.renameTParams(call.Pos(), sig.TypeParams().list(), sigParams)
+		sigParams = tmp.(*Tuple)
+		// make sure targs and tparams have the same length
+		for len(targs) < len(tparams) {
+			targs = append(targs, nil)
+		}
+	}
+	assert(len(tparams) == len(targs))
+
+	// collect type parameters from generic function arguments
+	var genericArgs []int // indices of generic function arguments
+	if enableReverseTypeInference {
+		for i, arg := range args {
+			// generic arguments cannot have a defined (*Named) type - no need for underlying type below
+			if asig, _ := arg.typ.(*Signature); asig != nil && asig.TypeParams().Len() > 0 {
+				// The argument type is a generic function signature. This type is
+				// pointer-identical with (it's copied from) the type of the generic
+				// function argument and thus the function object.
+				// Before we change the type (type parameter renaming, below), make
+				// a clone of it as otherwise we implicitly modify the object's type
+				// (go.dev/issues/63260).
+				clone := *asig
+				asig = &clone
+				// Rename type parameters for cases like f(g, g); this gives each
+				// generic function argument a unique type identity (go.dev/issues/59956).
+				// TODO(gri) Consider only doing this if a function argument appears
+				//           multiple times, which is rare (possible optimization).
+				atparams, tmp := check.renameTParams(call.Pos(), asig.TypeParams().list(), asig)
+				asig = tmp.(*Signature)
+				asig.tparams = &TypeParamList{atparams} // renameTParams doesn't touch associated type parameters
+				arg.typ = asig                          // new type identity for the function argument
+				tparams = append(tparams, atparams...)
+				// add partial list of type arguments, if any
+				if i < len(atargs) {
+					targs = append(targs, atargs[i]...)
+				}
+				// make sure targs and tparams have the same length
+				for len(targs) < len(tparams) {
+					targs = append(targs, nil)
+				}
+				genericArgs = append(genericArgs, i)
+			}
+		}
+	}
+	assert(len(tparams) == len(targs))
+
+	// at the moment we only support implicit instantiations of argument functions
+	_ = len(genericArgs) > 0 && check.verifyVersionf(args[genericArgs[0]], go1_21, "implicitly instantiated function as argument")
+
+	// tparams holds the type parameters of the callee and generic function arguments, if any:
+	// the first n type parameters belong to the callee, followed by mi type parameters for each
+	// of the generic function arguments, where mi = args[i].typ.(*Signature).TypeParams().Len().
+
+	// infer missing type arguments of callee and function arguments
+	if len(tparams) > 0 {
+		targs = check.infer(call.Pos(), tparams, targs, sigParams, args)
 		if targs == nil {
+			// TODO(gri) If infer inferred the first targs[:n], consider instantiating
+			//           the call signature for better error messages/gopls behavior.
+			//           Perhaps instantiate as much as we can, also for arguments.
+			//           This will require changes to how infer returns its results.
 			return // error already reported
 		}
 
-		// compute result signature
-		rsig = check.instantiateSignature(call.Pos(), sig, targs, xlist)
-		assert(rsig.TypeParams().Len() == 0) // signature is not generic anymore
-		check.recordInstance(call.Fun, targs, rsig)
+		// update result signature: instantiate if needed
+		if n > 0 {
+			rsig = check.instantiateSignature(call.Pos(), call.Fun, sig, targs[:n], xlist)
+			// If the callee's parameter list was adjusted we need to update (instantiate)
+			// it separately. Otherwise we can simply use the result signature's parameter
+			// list.
+			if adjusted {
+				sigParams = check.subst(call.Pos(), sigParams, makeSubstMap(tparams[:n], targs[:n]), nil, check.context()).(*Tuple)
+			} else {
+				sigParams = rsig.params
+			}
+		}
 
-		// Optimization: Only if the parameter list was adjusted do we
-		// need to compute it from the adjusted list; otherwise we can
-		// simply use the result signature's parameter list.
-		if adjusted {
-			sigParams = check.subst(call.Pos(), sigParams, makeSubstMap(sig.TypeParams().list(), targs), nil, check.context()).(*Tuple)
-		} else {
-			sigParams = rsig.params
+		// compute argument signatures: instantiate if needed
+		j := n
+		for _, i := range genericArgs {
+			arg := args[i]
+			asig := arg.typ.(*Signature)
+			k := j + asig.TypeParams().Len()
+			// targs[j:k] are the inferred type arguments for asig
+			arg.typ = check.instantiateSignature(call.Pos(), arg.expr, asig, targs[j:k], nil) // TODO(gri) provide xlist if possible (partial instantiations)
+			check.record(arg)                                                                 // record here because we didn't use the usual expr evaluators
+			j = k
 		}
 	}
 
@@ -536,7 +755,7 @@
 				x.typ = exp.typ
 				x.id = exp.id
 			default:
-				check.dump("%v: unexpected object %v", posFor(e.Sel), exp)
+				check.dump("%v: unexpected object %v", atPos(e.Sel), exp)
 				unreachable()
 			}
 			x.expr = e
@@ -547,7 +766,7 @@
 	check.exprOrType(x, e.X, false)
 	switch x.mode {
 	case typexpr:
-		// don't crash for "type T T.x" (was issue #51509)
+		// don't crash for "type T T.x" (was go.dev/issue/51509)
 		if def != nil && x.typ == def {
 			check.cycleError([]Object{def.obj})
 			goto Error
@@ -569,7 +788,7 @@
 	// All codepaths below return a non-type expression. If we get here while
 	// expecting a type expression, it is an error.
 	//
-	// See issue #57522 for more details.
+	// See go.dev/issue/57522 for more details.
 	//
 	// TODO(rfindley): We should do better by refusing to check selectors in all cases where
 	// x.typ is incomplete.
@@ -580,7 +799,7 @@
 
 	obj, index, indirect = LookupFieldOrMethod(x.typ, x.mode == variable, check.pkg, sel)
 	if obj == nil {
-		// Don't report another error if the underlying type was invalid (issue #49541).
+		// Don't report another error if the underlying type was invalid (go.dev/issue/49541).
 		if under(x.typ) == Typ[Invalid] {
 			goto Error
 		}
@@ -719,26 +938,61 @@
 
 // use type-checks each argument.
 // Useful to make sure expressions are evaluated
-// (and variables are "used") in the presence of other errors.
-// The arguments may be nil.
-// TODO(gri) make this accept a []syntax.Expr and use an unpack function when we have a ListExpr?
-func (check *Checker) use(arg ...syntax.Expr) {
-	var x operand
-	for _, e := range arg {
-		switch n := e.(type) {
-		case nil:
-			// some AST fields may be nil (e.g., elements of syntax.SliceExpr.Index)
-			// TODO(gri) can those fields really make it here?
-			continue
-		case *syntax.Name:
-			// don't report an error evaluating blank
-			if n.Value == "_" {
-				continue
-			}
-		case *syntax.ListExpr:
-			check.use(n.ElemList...)
-			continue
+// (and variables are "used") in the presence of
+// other errors. Arguments may be nil.
+// Reports if all arguments evaluated without error.
+func (check *Checker) use(args ...syntax.Expr) bool { return check.useN(args, false) }
+
+// useLHS is like use, but doesn't "use" top-level identifiers.
+// It should be called instead of use if the arguments are
+// expressions on the lhs of an assignment.
+func (check *Checker) useLHS(args ...syntax.Expr) bool { return check.useN(args, true) }
+
+func (check *Checker) useN(args []syntax.Expr, lhs bool) bool {
+	ok := true
+	for _, e := range args {
+		if !check.use1(e, lhs) {
+			ok = false
 		}
-		check.rawExpr(&x, e, nil, false)
 	}
+	return ok
+}
+
+func (check *Checker) use1(e syntax.Expr, lhs bool) bool {
+	var x operand
+	x.mode = value // anything but invalid
+	switch n := unparen(e).(type) {
+	case nil:
+		// nothing to do
+	case *syntax.Name:
+		// don't report an error evaluating blank
+		if n.Value == "_" {
+			break
+		}
+		// 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.rawExpr.
+		var v *Var
+		var v_used bool
+		if lhs {
+			if _, obj := check.scope.LookupParent(n.Value, nopos); obj != nil {
+				// It's ok to mark non-local variables, but ignore variables
+				// from other packages to avoid potential race conditions with
+				// dot-imported variables.
+				if w, _ := obj.(*Var); w != nil && w.pkg == check.pkg {
+					v = w
+					v_used = v.used
+				}
+			}
+		}
+		check.exprOrType(&x, n, true)
+		if v != nil {
+			v.used = v_used // restore v.used
+		}
+	case *syntax.ListExpr:
+		return check.useN(n.ElemList, lhs)
+	default:
+		check.rawExpr(nil, &x, e, nil, true)
+	}
+	return x.mode != invalid
 }
diff --git a/src/cmd/compile/internal/types2/check.go b/src/cmd/compile/internal/types2/check.go
index c495293..0a2a490 100644
--- a/src/cmd/compile/internal/types2/check.go
+++ b/src/cmd/compile/internal/types2/check.go
@@ -11,9 +11,11 @@
 	"errors"
 	"fmt"
 	"go/constant"
+	"internal/goversion"
 	. "internal/types/errors"
 )
 
+// nopos indicates an unknown position
 var nopos syntax.Pos
 
 // debugging/development support
@@ -115,6 +117,7 @@
 	// (initialized by Files, valid only for the duration of check.Files;
 	// maps and lists are allocated on demand)
 	files         []*syntax.File              // list of package files
+	posVers       map[*syntax.PosBase]version // Pos -> Go version mapping
 	imports       []*PkgName                  // list of imported packages
 	dotImportMap  map[dotImportKey]*PkgName   // maps dot-imported objects to the package they were dot-imported through
 	recvTParamMap map[*syntax.Name]*TypeParam // maps blank receiver type parameters to their type
@@ -229,19 +232,19 @@
 		info = new(Info)
 	}
 
-	version, err := parseGoVersion(conf.GoVersion)
-	if err != nil {
-		panic(fmt.Sprintf("invalid Go version %q (%v)", conf.GoVersion, err))
-	}
+	// Note: clients may call NewChecker with the Unsafe package, which is
+	// globally shared and must not be mutated. Therefore NewChecker must not
+	// mutate *pkg.
+	//
+	// (previously, pkg.goVersion was mutated here: go.dev/issue/61212)
 
 	return &Checker{
-		conf:    conf,
-		ctxt:    conf.Context,
-		pkg:     pkg,
-		Info:    info,
-		version: version,
-		objMap:  make(map[Object]*declInfo),
-		impMap:  make(map[importKey]*Package),
+		conf:   conf,
+		ctxt:   conf.Context,
+		pkg:    pkg,
+		Info:   info,
+		objMap: make(map[Object]*declInfo),
+		impMap: make(map[importKey]*Package),
 	}
 }
 
@@ -280,6 +283,35 @@
 			// ignore this file
 		}
 	}
+
+	for _, file := range check.files {
+		v, _ := parseGoVersion(file.GoVersion)
+		if v.major > 0 {
+			if v.equal(check.version) {
+				continue
+			}
+			// Go 1.21 introduced the feature of setting the go.mod
+			// go line to an early version of Go and allowing //go:build lines
+			// to “upgrade” the Go version in a given file.
+			// We can do that backwards compatibly.
+			// Go 1.21 also introduced the feature of allowing //go:build lines
+			// to “downgrade” the Go version in a given file.
+			// That can't be done compatibly in general, since before the
+			// build lines were ignored and code got the module's Go version.
+			// To work around this, downgrades are only allowed when the
+			// module's Go version is Go 1.21 or later.
+			// If there is no check.version, then we don't really know what Go version to apply.
+			// Legacy tools may do this, and they historically have accepted everything.
+			// Preserve that behavior by ignoring //go:build constraints entirely in that case.
+			if (v.before(check.version) && check.version.before(version{1, 21})) || check.version.equal(version{0, 0}) {
+				continue
+			}
+			if check.posVers == nil {
+				check.posVers = make(map[*syntax.PosBase]version)
+			}
+			check.posVers[base(file.Pos())] = v
+		}
+	}
 }
 
 // A bailout panic is used for early termination.
@@ -302,6 +334,20 @@
 var errBadCgo = errors.New("cannot use FakeImportC and go115UsesCgo together")
 
 func (check *Checker) checkFiles(files []*syntax.File) (err error) {
+	if check.pkg == Unsafe {
+		// Defensive handling for Unsafe, which cannot be type checked, and must
+		// not be mutated. See https://go.dev/issue/61212 for an example of where
+		// Unsafe is passed to NewChecker.
+		return nil
+	}
+
+	check.version, err = parseGoVersion(check.conf.GoVersion)
+	if err != nil {
+		return err
+	}
+	if check.version.after(version{1, goversion.Version}) {
+		return fmt.Errorf("package requires newer Go version %v", check.version)
+	}
 	if check.conf.FakeImportC && check.conf.go115UsesCgo {
 		return errBadCgo
 	}
@@ -346,6 +392,7 @@
 		check.monomorph()
 	}
 
+	check.pkg.goVersion = check.conf.GoVersion
 	check.pkg.complete = true
 
 	// no longer needed - release memory
@@ -432,7 +479,7 @@
 
 	for x, info := range check.untyped {
 		if debug && isTyped(info.typ) {
-			check.dump("%v: %s (type %s) is typed", posFor(x), x, info.typ)
+			check.dump("%v: %s (type %s) is typed", atPos(x), x, info.typ)
 			unreachable()
 		}
 		check.recordTypeAndValue(x, info.mode, info.typ, info.val)
@@ -503,22 +550,27 @@
 	}
 }
 
-func (check *Checker) recordCommaOkTypes(x syntax.Expr, a [2]Type) {
+// recordCommaOkTypes updates recorded types to reflect that x is used in a commaOk context
+// (and therefore has tuple type).
+func (check *Checker) recordCommaOkTypes(x syntax.Expr, a []*operand) {
 	assert(x != nil)
-	if a[0] == nil || a[1] == nil {
+	assert(len(a) == 2)
+	if a[0].mode == invalid {
 		return
 	}
-	assert(isTyped(a[0]) && isTyped(a[1]) && (isBoolean(a[1]) || a[1] == universeError))
+	t0, t1 := a[0].typ, a[1].typ
+	assert(isTyped(t0) && isTyped(t1) && (isBoolean(t1) || t1 == universeError))
 	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]),
+				NewVar(pos, check.pkg, "", t0),
+				NewVar(pos, check.pkg, "", t1),
 			)
 			m[x] = tv
+			// if x is a parenthesized expression (p.X), update p.X
 			p, _ := x.(*syntax.ParenExpr)
 			if p == nil {
 				break
@@ -534,8 +586,8 @@
 			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]),
+				NewVar(pos, check.pkg, "", t0),
+				NewVar(pos, check.pkg, "", t1),
 			)
 			x.SetTypeInfo(tv)
 			p, _ := x.(*syntax.ParenExpr)
diff --git a/src/cmd/compile/internal/types2/check_test.go b/src/cmd/compile/internal/types2/check_test.go
index c4c28cc..8cb3000 100644
--- a/src/cmd/compile/internal/types2/check_test.go
+++ b/src/cmd/compile/internal/types2/check_test.go
@@ -4,20 +4,27 @@
 
 // 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.
+// compared against the errors 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.
+// Expected errors are indicated in the test files by putting comments
+// of the form /* ERROR pattern */ or /* ERRORx pattern */ (or a similar
+// //-style line comment) immediately following the tokens where errors
+// are reported. There must be exactly one blank before and after the
+// ERROR/ERRORx indicator, and the pattern must be a properly quoted Go
+// string.
 //
-// For instance, the following test file indicates that a "not declared"
+// The harness will verify that each ERROR pattern is a substring of the
+// error reported at that source position, and that each ERRORx pattern
+// is a regular expression matching the respective error.
+// Consecutive comments may be used to indicate multiple errors reported
+// at the same position.
+//
+// For instance, the following test source indicates that an "undeclared"
 // error should be reported for the undeclared variable x:
 //
 //	package p
 //	func f() {
-//		_ = x /* ERROR "not declared" */ + 1
+//		_ = x /* ERROR "undeclared" */ + 1
 //	}
 
 package types2_test
@@ -30,8 +37,9 @@
 	"internal/testenv"
 	"os"
 	"path/filepath"
+	"reflect"
 	"regexp"
-	"sort"
+	"strconv"
 	"strings"
 	"testing"
 
@@ -43,12 +51,14 @@
 	verifyErrors = flag.Bool("verify", false, "verify errors (rather than list them) in TestManual")
 )
 
-func parseFiles(t *testing.T, filenames []string, mode syntax.Mode) ([]*syntax.File, []error) {
+func parseFiles(t *testing.T, filenames []string, srcs [][]byte, mode syntax.Mode) ([]*syntax.File, []error) {
 	var files []*syntax.File
 	var errlist []error
 	errh := func(err error) { errlist = append(errlist, err) }
-	for _, filename := range filenames {
-		file, err := syntax.ParseFile(filename, errh, nil, mode)
+	for i, filename := range filenames {
+		base := syntax.NewFileBase(filename)
+		r := bytes.NewReader(srcs[i])
+		file, err := syntax.Parse(base, r, errh, nil, mode)
 		if file == nil {
 			t.Fatalf("%s: %s", filename, err)
 		}
@@ -57,53 +67,29 @@
 	return files, errlist
 }
 
-func unpackError(err error) syntax.Error {
+func unpackError(err error) (syntax.Pos, string) {
 	switch err := err.(type) {
 	case syntax.Error:
-		return err
+		return err.Pos, err.Msg
 	case Error:
-		return syntax.Error{Pos: err.Pos, Msg: err.Msg}
+		return err.Pos, err.Msg
 	default:
-		return syntax.Error{Msg: err.Error()}
+		return nopos, err.Error()
 	}
 }
 
-// delta returns the absolute difference between x and y.
-func delta(x, y uint) uint {
-	switch {
-	case x < y:
+// absDiff returns the absolute difference between x and y.
+func absDiff(x, y uint) uint {
+	if x < y {
 		return y - x
-	case x > y:
-		return x - y
-	default:
-		return 0
 	}
+	return x - y
 }
 
-// Note: parseFlags is identical to the version in go/types which is
-//       why it has a src argument even though here it is always nil.
-
-// parseFlags parses flags from the first line of the given source
-// (from src if present, or by reading from the file) if the line
-// starts with "//" (line comment) followed by "-" (possibly with
-// spaces between). Otherwise the line is ignored.
-func parseFlags(filename string, src []byte, flags *flag.FlagSet) error {
-	// If there is no src, read from the file.
-	const maxLen = 256
-	if len(src) == 0 {
-		f, err := os.Open(filename)
-		if err != nil {
-			return err
-		}
-
-		var buf [maxLen]byte
-		n, err := f.Read(buf[:])
-		if err != nil {
-			return err
-		}
-		src = buf[:n]
-	}
-
+// parseFlags parses flags from the first line of the given source if the line
+// starts with "//" (line comment) followed by "-" (possibly with spaces
+// between). Otherwise the line is ignored.
+func parseFlags(src []byte, flags *flag.FlagSet) error {
 	// we must have a line comment that starts with a "-"
 	const prefix = "//"
 	if !bytes.HasPrefix(src, []byte(prefix)) {
@@ -114,6 +100,7 @@
 		return nil // comment doesn't start with a "-"
 	}
 	end := bytes.Index(src, []byte("\n"))
+	const maxLen = 256
 	if end < 0 || end > maxLen {
 		return fmt.Errorf("flags comment line too long")
 	}
@@ -121,7 +108,16 @@
 	return flags.Parse(strings.Fields(string(src[:end])))
 }
 
-func testFiles(t *testing.T, filenames []string, colDelta uint, manual bool) {
+// testFiles type-checks the package consisting of the given files, and
+// compares the resulting errors with the ERROR annotations in the source.
+//
+// The srcs slice contains the file content for the files named in the
+// filenames slice. The colDelta parameter specifies the tolerance for position
+// mismatch when comparing errors. The manual parameter specifies whether this
+// is a 'manual' test.
+//
+// If provided, opts may be used to mutate the Config before type-checking.
+func testFiles(t *testing.T, filenames []string, srcs [][]byte, colDelta uint, manual bool, opts ...func(*Config)) {
 	if len(filenames) == 0 {
 		t.Fatal("no source files")
 	}
@@ -130,12 +126,11 @@
 	flags := flag.NewFlagSet("", flag.PanicOnError)
 	flags.StringVar(&conf.GoVersion, "lang", "", "")
 	flags.BoolVar(&conf.FakeImportC, "fakeImportC", false, "")
-	flags.BoolVar(&conf.OldComparableSemantics, "oldComparableSemantics", false, "")
-	if err := parseFlags(filenames[0], nil, flags); err != nil {
+	if err := parseFlags(srcs[0], flags); err != nil {
 		t.Fatal(err)
 	}
 
-	files, errlist := parseFiles(t, filenames, 0)
+	files, errlist := parseFiles(t, filenames, srcs, 0)
 
 	pkgName := "<no package>"
 	if len(files) > 0 {
@@ -163,78 +158,98 @@
 		}
 		errlist = append(errlist, err)
 	}
+
+	for _, opt := range opts {
+		opt(&conf)
+	}
+
 	conf.Check(pkgName, files, nil)
 
 	if listErrors {
 		return
 	}
 
-	// sort errlist in source order
-	sort.Slice(errlist, func(i, j int) bool {
-		pi := unpackError(errlist[i]).Pos
-		pj := unpackError(errlist[j]).Pos
-		return pi.Cmp(pj) < 0
-	})
-
 	// collect expected errors
 	errmap := make(map[string]map[uint][]syntax.Error)
-	for _, filename := range filenames {
-		f, err := os.Open(filename)
-		if err != nil {
-			t.Error(err)
-			continue
-		}
-		if m := syntax.ErrorMap(f); len(m) > 0 {
+	for i, filename := range filenames {
+		if m := syntax.CommentMap(bytes.NewReader(srcs[i]), regexp.MustCompile("^ ERRORx? ")); len(m) > 0 {
 			errmap[filename] = m
 		}
-		f.Close()
 	}
 
 	// match against found errors
+	var indices []int // list indices of matching errors, reused for each error
 	for _, err := range errlist {
-		got := unpackError(err)
+		gotPos, gotMsg := unpackError(err)
 
 		// find list of errors for the respective error line
-		filename := got.Pos.Base().Filename()
+		filename := gotPos.Base().Filename()
 		filemap := errmap[filename]
-		line := got.Pos.Line()
-		var list []syntax.Error
+		line := gotPos.Line()
+		var errList []syntax.Error
 		if filemap != nil {
-			list = filemap[line]
+			errList = filemap[line]
 		}
-		// list may be nil
 
-		// one of errors in list should match the current error
-		index := -1 // list index of matching message, if any
-		for i, want := range list {
-			rx, err := regexp.Compile(want.Msg)
+		// At least one of the errors in errList should match the current error.
+		indices = indices[:0]
+		for i, want := range errList {
+			pattern, substr := strings.CutPrefix(want.Msg, " ERROR ")
+			if !substr {
+				var found bool
+				pattern, found = strings.CutPrefix(want.Msg, " ERRORx ")
+				if !found {
+					panic("unreachable")
+				}
+			}
+			pattern, err := strconv.Unquote(strings.TrimSpace(pattern))
 			if err != nil {
 				t.Errorf("%s:%d:%d: %v", filename, line, want.Pos.Col(), err)
 				continue
 			}
-			if rx.MatchString(got.Msg) {
-				index = i
-				break
+			if substr {
+				if !strings.Contains(gotMsg, pattern) {
+					continue
+				}
+			} else {
+				rx, err := regexp.Compile(pattern)
+				if err != nil {
+					t.Errorf("%s:%d:%d: %v", filename, line, want.Pos.Col(), err)
+					continue
+				}
+				if !rx.MatchString(gotMsg) {
+					continue
+				}
 			}
+			indices = append(indices, i)
 		}
-		if index < 0 {
-			t.Errorf("%s: no error expected: %q", got.Pos, got.Msg)
+		if len(indices) == 0 {
+			t.Errorf("%s: no error expected: %q", gotPos, gotMsg)
 			continue
 		}
+		// len(indices) > 0
 
-		// column position must be within expected colDelta
-		want := list[index]
-		if delta(got.Pos.Col(), want.Pos.Col()) > colDelta {
-			t.Errorf("%s: got col = %d; want %d", got.Pos, got.Pos.Col(), want.Pos.Col())
+		// If there are multiple matching errors, select the one with the closest column position.
+		index := -1 // index of matching error
+		var delta uint
+		for _, i := range indices {
+			if d := absDiff(gotPos.Col(), errList[i].Pos.Col()); index < 0 || d < delta {
+				index, delta = i, d
+			}
 		}
 
-		// eliminate from list
-		if n := len(list) - 1; n > 0 {
+		// The closest column position must be within expected colDelta.
+		if delta > colDelta {
+			t.Errorf("%s: got col = %d; want %d", gotPos, gotPos.Col(), errList[index].Pos.Col())
+		}
+
+		// eliminate from errList
+		if n := len(errList) - 1; n > 0 {
 			// not the last entry - slide entries down (don't reorder)
-			copy(list[index:], list[index+1:])
-			filemap[line] = list[:n]
+			copy(errList[index:], errList[index+1:])
+			filemap[line] = errList[:n]
 		} else {
-			// last entry - remove list from filemap
+			// last entry - remove errList from filemap
 			delete(filemap, line)
 		}
 
@@ -248,8 +263,8 @@
 	if len(errmap) > 0 {
 		t.Errorf("--- %s: unreported errors:", pkgName)
 		for filename, filemap := range errmap {
-			for line, list := range filemap {
-				for _, err := range list {
+			for line, errList := range filemap {
+				for _, err := range errList {
 					t.Errorf("%s:%d:%d: %s", filename, line, err.Pos.Col(), err.Msg)
 				}
 			}
@@ -257,6 +272,13 @@
 	}
 }
 
+// boolFieldAddr(conf, name) returns the address of the boolean field conf.<name>.
+// For accessing unexported fields.
+func boolFieldAddr(conf *Config, name string) *bool {
+	v := reflect.Indirect(reflect.ValueOf(conf))
+	return (*bool)(v.FieldByName(name).Addr().UnsafePointer())
+}
+
 // TestManual is for manual testing of a package - either provided
 // as a list of filenames belonging to the package, or a directory
 // name containing the package files - after the test arguments
@@ -291,11 +313,36 @@
 		}
 		testDir(t, filenames[0], 0, true)
 	} else {
-		testFiles(t, filenames, 0, true)
+		testPkg(t, filenames, 0, true)
 	}
 }
 
-// TODO(gri) go/types has extra TestLongConstants and TestIndexRepresentability tests
+func TestLongConstants(t *testing.T) {
+	format := `package longconst; const _ = %s /* ERROR "constant overflow" */; const _ = %s // ERROR "excessively long constant"`
+	src := fmt.Sprintf(format, strings.Repeat("1", 9999), strings.Repeat("1", 10001))
+	testFiles(t, []string{"longconst.go"}, [][]byte{[]byte(src)}, 0, false)
+}
+
+func withSizes(sizes Sizes) func(*Config) {
+	return func(cfg *Config) {
+		cfg.Sizes = sizes
+	}
+}
+
+// TestIndexRepresentability tests that constant index operands must
+// be representable as int even if they already have a type that can
+// represent larger values.
+func TestIndexRepresentability(t *testing.T) {
+	const src = `package index; var s []byte; var _ = s[int64 /* ERRORx "int64\\(1\\) << 40 \\(.*\\) overflows int" */ (1) << 40]`
+	testFiles(t, []string{"index.go"}, [][]byte{[]byte(src)}, 0, false, withSizes(&StdSizes{4, 4}))
+}
+
+func TestIssue47243_TypedRHS(t *testing.T) {
+	// The RHS of the shift expression below overflows uint on 32bit platforms,
+	// but this is OK as it is explicitly typed.
+	const src = `package issue47243; var a uint64; var _ = a << uint64(4294967296)` // uint64(1<<32)
+	testFiles(t, []string{"p.go"}, [][]byte{[]byte(src)}, 0, false, withSizes(&StdSizes{4, 4}))
+}
 
 func TestCheck(t *testing.T) {
 	DefPredeclaredTestFuncs()
@@ -303,7 +350,7 @@
 }
 func TestSpec(t *testing.T) { testDirFiles(t, "../../../../internal/types/testdata/spec", 0, false) }
 func TestExamples(t *testing.T) {
-	testDirFiles(t, "../../../../internal/types/testdata/examples", 45, false)
+	testDirFiles(t, "../../../../internal/types/testdata/examples", 125, false)
 } // TODO(gri) narrow column tolerance
 func TestFixedbugs(t *testing.T) {
 	testDirFiles(t, "../../../../internal/types/testdata/fixedbugs", 100, false)
@@ -328,7 +375,7 @@
 			testDir(t, path, colDelta, manual)
 		} else {
 			t.Run(filepath.Base(path), func(t *testing.T) {
-				testFiles(t, []string{path}, colDelta, manual)
+				testPkg(t, []string{path}, colDelta, manual)
 			})
 		}
 	}
@@ -347,6 +394,18 @@
 	}
 
 	t.Run(filepath.Base(dir), func(t *testing.T) {
-		testFiles(t, filenames, colDelta, manual)
+		testPkg(t, filenames, colDelta, manual)
 	})
 }
+
+func testPkg(t *testing.T, filenames []string, colDelta uint, manual bool) {
+	srcs := make([][]byte, len(filenames))
+	for i, filename := range filenames {
+		src, err := os.ReadFile(filename)
+		if err != nil {
+			t.Fatalf("could not read %s: %v", filename, err)
+		}
+		srcs[i] = src
+	}
+	testFiles(t, filenames, srcs, colDelta, manual)
+}
diff --git a/src/cmd/compile/internal/types2/const.go b/src/cmd/compile/internal/types2/const.go
new file mode 100644
index 0000000..af27c72
--- /dev/null
+++ b/src/cmd/compile/internal/types2/const.go
@@ -0,0 +1,306 @@
+// Copyright 2023 The Go 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 functions for untyped constant operands.
+
+package types2
+
+import (
+	"cmd/compile/internal/syntax"
+	"go/constant"
+	"go/token"
+	. "internal/types/errors"
+	"math"
+)
+
+// overflow checks that the constant x is representable by its type.
+// For untyped constants, it checks that the value doesn't become
+// arbitrarily large.
+func (check *Checker) overflow(x *operand, opPos syntax.Pos) {
+	assert(x.mode == constant_)
+
+	if x.val.Kind() == constant.Unknown {
+		// TODO(gri) We should report exactly what went wrong. At the
+		//           moment we don't have the (go/constant) API for that.
+		//           See also TODO in go/constant/value.go.
+		check.error(atPos(opPos), InvalidConstVal, "constant result is not representable")
+		return
+	}
+
+	// Typed constants must be representable in
+	// their type after each constant operation.
+	// x.typ cannot be a type parameter (type
+	// parameters cannot be constant types).
+	if isTyped(x.typ) {
+		check.representable(x, under(x.typ).(*Basic))
+		return
+	}
+
+	// Untyped integer values must not grow arbitrarily.
+	const prec = 512 // 512 is the constant precision
+	if x.val.Kind() == constant.Int && constant.BitLen(x.val) > prec {
+		op := opName(x.expr)
+		if op != "" {
+			op += " "
+		}
+		check.errorf(atPos(opPos), InvalidConstVal, "constant %soverflow", op)
+		x.val = constant.MakeUnknown()
+	}
+}
+
+// representableConst reports whether x can be represented as
+// value of the given basic type 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 and complex values, and to an Int
+// value for integer values; it is left alone otherwise.
+// It is ok to provide the addressof the first argument for rounded.
+//
+// The check parameter may be nil if representableConst is invoked
+// (indirectly) through an exported API call (AssignableTo, ConvertibleTo)
+// because we don't need the Checker's config for those calls.
+func representableConst(x constant.Value, check *Checker, typ *Basic, rounded *constant.Value) bool {
+	if x.Kind() == constant.Unknown {
+		return true // avoid follow-up errors
+	}
+
+	var conf *Config
+	if check != nil {
+		conf = check.conf
+	}
+
+	sizeof := func(T Type) int64 {
+		s := conf.sizeof(T)
+		return s
+	}
+
+	switch {
+	case isInteger(typ):
+		x := constant.ToInt(x)
+		if x.Kind() != constant.Int {
+			return false
+		}
+		if rounded != nil {
+			*rounded = x
+		}
+		if x, ok := constant.Int64Val(x); ok {
+			switch typ.kind {
+			case Int:
+				var s = uint(sizeof(typ)) * 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, UntypedInt:
+				return true
+			case Uint, Uintptr:
+				if s := uint(sizeof(typ)) * 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
+			default:
+				unreachable()
+			}
+		}
+		// x does not fit into int64
+		switch n := constant.BitLen(x); typ.kind {
+		case Uint, Uintptr:
+			var s = uint(sizeof(typ)) * 8
+			return constant.Sign(x) >= 0 && n <= int(s)
+		case Uint64:
+			return constant.Sign(x) >= 0 && n <= 64
+		case UntypedInt:
+			return true
+		}
+
+	case isFloat(typ):
+		x := constant.ToFloat(x)
+		if x.Kind() != constant.Float {
+			return false
+		}
+		switch typ.kind {
+		case Float32:
+			if rounded == nil {
+				return fitsFloat32(x)
+			}
+			r := roundFloat32(x)
+			if r != nil {
+				*rounded = r
+				return true
+			}
+		case Float64:
+			if rounded == nil {
+				return fitsFloat64(x)
+			}
+			r := roundFloat64(x)
+			if r != nil {
+				*rounded = r
+				return true
+			}
+		case UntypedFloat:
+			return true
+		default:
+			unreachable()
+		}
+
+	case isComplex(typ):
+		x := constant.ToComplex(x)
+		if x.Kind() != constant.Complex {
+			return false
+		}
+		switch typ.kind {
+		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
+		default:
+			unreachable()
+		}
+
+	case isString(typ):
+		return x.Kind() == constant.String
+
+	case isBoolean(typ):
+		return x.Kind() == constant.Bool
+	}
+
+	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
+}
+
+// representable checks that a constant operand is representable in the given
+// basic type.
+func (check *Checker) representable(x *operand, typ *Basic) {
+	v, code := check.representation(x, typ)
+	if code != 0 {
+		check.invalidConversion(code, x, typ)
+		x.mode = invalid
+		return
+	}
+	assert(v != nil)
+	x.val = v
+}
+
+// representation returns the representation of the constant operand x as the
+// basic type typ.
+//
+// If no such representation is possible, it returns a non-zero error code.
+func (check *Checker) representation(x *operand, typ *Basic) (constant.Value, Code) {
+	assert(x.mode == constant_)
+	v := x.val
+	if !representableConst(x.val, check, typ, &v) {
+		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) {
+				return nil, TruncatedFloat
+			} else {
+				return nil, NumericOverflow
+			}
+		}
+		return nil, InvalidConstVal
+	}
+	return v, 0
+}
+
+func (check *Checker) invalidConversion(code Code, x *operand, target Type) {
+	msg := "cannot convert %s to type %s"
+	switch code {
+	case TruncatedFloat:
+		msg = "%s truncated to %s"
+	case NumericOverflow:
+		msg = "%s overflows %s"
+	}
+	check.errorf(x, code, msg, x, target)
+}
+
+// convertUntyped attempts to set the type of an untyped value to the target type.
+func (check *Checker) convertUntyped(x *operand, target Type) {
+	newType, val, code := check.implicitTypeAndValue(x, target)
+	if code != 0 {
+		t := target
+		if !isTypeParam(target) {
+			t = safeUnderlying(target)
+		}
+		check.invalidConversion(code, x, t)
+		x.mode = invalid
+		return
+	}
+	if val != nil {
+		x.val = val
+		check.updateExprVal(x.expr, val)
+	}
+	if newType != x.typ {
+		x.typ = newType
+		check.updateExprType(x.expr, newType, false)
+	}
+}
diff --git a/src/cmd/compile/internal/types2/conversions.go b/src/cmd/compile/internal/types2/conversions.go
index 865b49c..ef0094d 100644
--- a/src/cmd/compile/internal/types2/conversions.go
+++ b/src/cmd/compile/internal/types2/conversions.go
@@ -12,7 +12,7 @@
 	"unicode"
 )
 
-// Conversion type-checks the conversion T(x).
+// conversion type-checks the conversion T(x).
 // The result is in x.
 func (check *Checker) conversion(x *operand, T Type) {
 	constArg := x.mode == constant_
@@ -113,7 +113,7 @@
 // the spec) is that we cannot shift a floating-point value: 1 in 1<<s should
 // be converted to UntypedFloat because of the addition of 1.0. Fixing this
 // is tricky because we'd have to run updateExprType on the argument first.
-// (Issue #21982.)
+// (go.dev/issue/21982.)
 
 // convertibleTo reports whether T(x) is valid. In the failure case, *cause
 // may be set to the cause for the failure.
@@ -183,7 +183,7 @@
 		switch a := Tu.(type) {
 		case *Array:
 			if Identical(s.Elem(), a.Elem()) {
-				if check == nil || check.allowVersion(check.pkg, 1, 20) {
+				if check == nil || check.allowVersion(check.pkg, x, go1_20) {
 					return true
 				}
 				// check != nil
@@ -196,7 +196,7 @@
 		case *Pointer:
 			if a, _ := under(a.Elem()).(*Array); a != nil {
 				if Identical(s.Elem(), a.Elem()) {
-					if check == nil || check.allowVersion(check.pkg, 1, 17) {
+					if check == nil || check.allowVersion(check.pkg, x, go1_17) {
 						return true
 					}
 					// check != nil
diff --git a/src/cmd/compile/internal/types2/decl.go b/src/cmd/compile/internal/types2/decl.go
index 530a8f5..88864cb 100644
--- a/src/cmd/compile/internal/types2/decl.go
+++ b/src/cmd/compile/internal/types2/decl.go
@@ -307,7 +307,7 @@
 func (check *Checker) cycleError(cycle []Object) {
 	// name returns the (possibly qualified) object name.
 	// This is needed because with generic types, cycles
-	// may refer to imported types. See issue #50788.
+	// may refer to imported types. See go.dev/issue/50788.
 	// TODO(gri) This functionality is used elsewhere. Factor it out.
 	name := func(obj Object) string {
 		return packagePrefix(obj.Pkg(), check.qualifier) + obj.Name()
@@ -360,7 +360,7 @@
 func firstInSrc(path []Object) int {
 	fst, pos := 0, path[0].Pos()
 	for i, t := range path[1:] {
-		if t.Pos().Cmp(pos) < 0 {
+		if cmpPos(t.Pos(), pos) < 0 {
 			fst, pos = i+1, t.Pos()
 		}
 	}
@@ -386,7 +386,7 @@
 		t := check.typ(typ)
 		if !isConstType(t) {
 			// don't report an error if the type is an invalid C (defined) type
-			// (issue #22090)
+			// (go.dev/issue/22090)
 			if under(t) != Typ[Invalid] {
 				check.errorf(typ, InvalidConstType, "invalid constant type %s", t)
 			}
@@ -405,10 +405,10 @@
 			// expression and not the current constant declaration. Use
 			// the constant identifier position for any errors during
 			// init expression evaluation since that is all we have
-			// (see issues #42991, #42992).
+			// (see issues go.dev/issue/42991, go.dev/issue/42992).
 			check.errpos = obj.pos
 		}
-		check.expr(&x, init)
+		check.expr(nil, &x, init)
 	}
 	check.initConst(obj, &x)
 }
@@ -416,20 +416,6 @@
 func (check *Checker) varDecl(obj *Var, lhs []*Var, typ, init syntax.Expr) {
 	assert(obj.typ == nil)
 
-	// If we have undefined variable types due to errors,
-	// mark variables as used to avoid follow-on errors.
-	// Matches compiler behavior.
-	defer func() {
-		if obj.typ == Typ[Invalid] {
-			obj.used = true
-		}
-		for _, lhs := range lhs {
-			if lhs.typ == Typ[Invalid] {
-				lhs.used = true
-			}
-		}
-	}()
-
 	// determine type, if any
 	if typ != nil {
 		obj.typ = check.varType(typ)
@@ -455,7 +441,7 @@
 	if lhs == nil || len(lhs) == 1 {
 		assert(lhs == nil || lhs[0] == obj)
 		var x operand
-		check.expr(&x, init)
+		check.expr(obj.typ, &x, init)
 		check.initVar(obj, &x, "variable declaration")
 		return
 	}
@@ -477,7 +463,7 @@
 	// We have multiple variables on the lhs and one init expr.
 	// Make sure all variables have been given the same type if
 	// one was specified, otherwise they assume the type of the
-	// init expression values (was issue #15755).
+	// init expression values (was go.dev/issue/15755).
 	if typ != nil {
 		for _, lhs := range lhs {
 			lhs.typ = obj.typ
@@ -506,9 +492,7 @@
 			check.validType(t)
 		}
 		// If typ is local, an error was already reported where typ is specified/defined.
-		if check.isImportedConstraint(rhs) && !check.allowVersion(check.pkg, 1, 18) {
-			check.versionErrorf(tdecl.Type, "go1.18", "using type constraint %s", rhs)
-		}
+		_ = check.isImportedConstraint(rhs) && check.verifyVersionf(tdecl.Type, go1_18, "using type constraint %s", rhs)
 	}).describef(obj, "validType(%s)", obj.Name())
 
 	alias := tdecl.Alias
@@ -521,10 +505,7 @@
 
 	// alias declaration
 	if alias {
-		if !check.allowVersion(check.pkg, 1, 9) {
-			check.versionErrorf(tdecl, "go1.9", "type aliases")
-		}
-
+		check.verifyVersionf(tdecl, go1_9, "type aliases")
 		check.brokenAlias(obj)
 		rhs = check.typ(tdecl.Type)
 		check.validAlias(obj, rhs)
@@ -552,7 +533,7 @@
 		named.underlying = Typ[Invalid]
 	}
 
-	// Disallow a lone type parameter as the RHS of a type declaration (issue #45639).
+	// Disallow a lone type parameter as the RHS of a type declaration (go.dev/issue/45639).
 	// We don't need this restriction anymore if we make the underlying type of a type
 	// parameter its constraint interface: if the RHS is a lone type parameter, we will
 	// use its underlying type (like we do for any RHS in a type declaration), and its
@@ -574,7 +555,7 @@
 	}
 
 	// Set the type parameters before collecting the type constraints because
-	// the parameterized type may be used by the constraints (issue #47887).
+	// the parameterized type may be used by the constraints (go.dev/issue/47887).
 	// Example: type T[P T[P]] interface{}
 	*dst = bindTParams(tparams)
 
@@ -661,7 +642,7 @@
 	if base != nil {
 		assert(base.TypeArgs().Len() == 0) // collectMethods should not be called on an instantiated type
 
-		// See issue #52529: we must delay the expansion of underlying here, as
+		// See go.dev/issue/52529: we must delay the expansion of underlying here, as
 		// base may not be fully set-up.
 		check.later(func() {
 			check.checkFieldUniqueness(base)
diff --git a/src/cmd/compile/internal/types2/errorcalls_test.go b/src/cmd/compile/internal/types2/errorcalls_test.go
index edf2a51..6153b42 100644
--- a/src/cmd/compile/internal/types2/errorcalls_test.go
+++ b/src/cmd/compile/internal/types2/errorcalls_test.go
@@ -6,13 +6,18 @@
 
 import (
 	"cmd/compile/internal/syntax"
+	"strconv"
 	"testing"
 )
 
-const errorfMinArgCount = 4
+const (
+	errorfMinArgCount = 4
+	errorfFormatIndex = 2
+)
 
 // TestErrorCalls makes sure that check.errorf calls have at least
-// errorfMinArgCount arguments (otherwise we should use check.error).
+// errorfMinArgCount arguments (otherwise we should use check.error)
+// and use balanced parentheses/brackets.
 func TestErrorCalls(t *testing.T) {
 	files, err := pkgFiles(".")
 	if err != nil {
@@ -20,17 +25,17 @@
 	}
 
 	for _, file := range files {
-		syntax.Crawl(file, func(n syntax.Node) bool {
+		syntax.Inspect(file, func(n syntax.Node) bool {
 			call, _ := n.(*syntax.CallExpr)
 			if call == nil {
-				return false
+				return true
 			}
 			selx, _ := call.Fun.(*syntax.SelectorExpr)
 			if selx == nil {
-				return false
+				return true
 			}
 			if !(isName(selx.X, "check") && isName(selx.Sel, "errorf")) {
-				return false
+				return true
 			}
 			// check.errorf calls should have at least errorfMinArgCount arguments:
 			// position, code, format string, and arguments to format
@@ -38,6 +43,18 @@
 				t.Errorf("%s: got %d arguments, want at least %d", call.Pos(), n, errorfMinArgCount)
 				return false
 			}
+			format := call.ArgList[errorfFormatIndex]
+			syntax.Inspect(format, func(n syntax.Node) bool {
+				if lit, _ := n.(*syntax.BasicLit); lit != nil && lit.Kind == syntax.StringLit {
+					if s, err := strconv.Unquote(lit.Value); err == nil {
+						if !balancedParentheses(s) {
+							t.Errorf("%s: unbalanced parentheses/brackets", lit.Pos())
+						}
+					}
+					return false
+				}
+				return true
+			})
 			return false
 		})
 	}
@@ -49,3 +66,30 @@
 	}
 	return false
 }
+
+func balancedParentheses(s string) bool {
+	var stack []byte
+	for _, ch := range s {
+		var open byte
+		switch ch {
+		case '(', '[', '{':
+			stack = append(stack, byte(ch))
+			continue
+		case ')':
+			open = '('
+		case ']':
+			open = '['
+		case '}':
+			open = '{'
+		default:
+			continue
+		}
+		// closing parenthesis/bracket must have matching opening
+		top := len(stack) - 1
+		if top < 0 || stack[top] != open {
+			return false
+		}
+		stack = stack[:top]
+	}
+	return len(stack) == 0
+}
diff --git a/src/cmd/compile/internal/types2/errors.go b/src/cmd/compile/internal/types2/errors.go
index 8bbd719..7db06d9 100644
--- a/src/cmd/compile/internal/types2/errors.go
+++ b/src/cmd/compile/internal/types2/errors.go
@@ -87,7 +87,7 @@
 // errorf adds formatted error information to err.
 // It may be called multiple times to provide additional information.
 func (err *error_) errorf(at poser, format string, args ...interface{}) {
-	err.desc = append(err.desc, errorDesc{posFor(at), format, args})
+	err.desc = append(err.desc, errorDesc{atPos(at), format, args})
 }
 
 func sprintf(qf Qualifier, tpSubscripts bool, format string, args ...interface{}) string {
@@ -237,7 +237,7 @@
 		return
 	}
 
-	pos := posFor(at)
+	pos := atPos(at)
 
 	// If we are encountering an error while evaluating an inherited
 	// constant initialization expression, pos is the position of in
@@ -250,7 +250,17 @@
 		pos = check.errpos
 	}
 
-	err := Error{pos, stripAnnotations(msg), msg, soft}
+	// If we have an URL for error codes, add a link to the first line.
+	if code != 0 && check.conf.ErrorURL != "" {
+		u := fmt.Sprintf(check.conf.ErrorURL, code)
+		if i := strings.Index(msg, "\n"); i >= 0 {
+			msg = msg[:i] + u + msg[i:]
+		} else {
+			msg += u
+		}
+	}
+
+	err := Error{pos, stripAnnotations(msg), msg, soft, code}
 	if check.firstErr == nil {
 		check.firstErr = err
 	}
@@ -287,14 +297,14 @@
 	check.err(at, code, check.sprintf(format, args...), true)
 }
 
-func (check *Checker) versionErrorf(at poser, goVersion string, format string, args ...interface{}) {
+func (check *Checker) versionErrorf(at poser, v version, format string, args ...interface{}) {
 	msg := check.sprintf(format, args...)
-	msg = fmt.Sprintf("%s requires %s or later", msg, goVersion)
+	msg = fmt.Sprintf("%s requires %s or later", msg, v)
 	check.err(at, UnsupportedFeature, msg, true)
 }
 
-// posFor reports the left (= start) position of at.
-func posFor(at poser) syntax.Pos {
+// atPos reports the left (= start) position of at.
+func atPos(at poser) syntax.Pos {
 	switch x := at.(type) {
 	case *operand:
 		if x.expr != nil {
diff --git a/src/cmd/compile/internal/types2/example_test.go b/src/cmd/compile/internal/types2/example_test.go
index b89cadf..7031fdb 100644
--- a/src/cmd/compile/internal/types2/example_test.go
+++ b/src/cmd/compile/internal/types2/example_test.go
@@ -5,7 +5,7 @@
 // Only run where builders (build.golang.org) have
 // access to compiled packages for import.
 //
-//go:build !android && !ios && !js
+//go:build !android && !ios && !js && !wasip1
 
 package types2_test
 
@@ -30,25 +30,23 @@
 func ExampleScope() {
 	// Parse the source files for a package.
 	var files []*syntax.File
-	for _, file := range []struct{ name, input string }{
-		{"main.go", `
-package main
+	for _, src := range []string{
+		`package main
 import "fmt"
 func main() {
 	freezing := FToC(-18)
 	fmt.Println(freezing, Boiling) }
-`},
-		{"celsius.go", `
-package main
+`,
+		`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
 func Unused() { {}; {{ var x int; _ = x }} } // make sure empty block scopes get printed
-`},
+`,
 	} {
-		files = append(files, mustParse(file.name, file.input))
+		files = append(files, mustParse(src))
 	}
 
 	// Type-check a package consisting of these files.
@@ -74,13 +72,13 @@
 	// .  func temperature.FToC(f float64) temperature.Celsius
 	// .  func temperature.Unused()
 	// .  func temperature.main()
-	// .  main.go scope {
+	// .  main scope {
 	// .  .  package fmt
 	// .  .  function scope {
 	// .  .  .  var freezing temperature.Celsius
 	// .  .  }
 	// .  }
-	// .  celsius.go scope {
+	// .  main scope {
 	// .  .  package fmt
 	// .  .  function scope {
 	// .  .  .  var c temperature.Celsius
@@ -119,8 +117,6 @@
 	}
 	return fib(x-1) - fib(x-2)
 }`
-	f := mustParse("fib.go", input)
-
 	// Type-check the package.
 	// We create an empty map for each kind of input
 	// we're interested in, and Check populates them.
@@ -129,11 +125,7 @@
 		Defs:  make(map[*syntax.Name]types2.Object),
 		Uses:  make(map[*syntax.Name]types2.Object),
 	}
-	var conf types2.Config
-	pkg, err := conf.Check("fib", []*syntax.File{f}, &info)
-	if err != nil {
-		log.Fatal(err)
-	}
+	pkg := mustTypecheck(input, nil, &info)
 
 	// Print package-level variables in initialization order.
 	fmt.Printf("InitOrder: %v\n\n", info.InitOrder)
@@ -187,10 +179,10 @@
 	//   defined at <unknown position>
 	//   used at 6:15
 	// func fib(x int) int:
-	//   defined at fib.go:8:6
+	//   defined at fib:8:6
 	//   used at 12:20, 12:9
 	// type S string:
-	//   defined at fib.go:4:6
+	//   defined at fib:4:6
 	//   used at 6:23
 	// type int:
 	//   defined at <unknown position>
@@ -199,13 +191,13 @@
 	//   defined at <unknown position>
 	//   used at 4:8
 	// var b S:
-	//   defined at fib.go:6:8
+	//   defined at fib:6:8
 	//   used at 6:19
 	// var c string:
-	//   defined at fib.go:6:11
+	//   defined at fib:6:11
 	//   used at 6:25
 	// var x int:
-	//   defined at fib.go:8:10
+	//   defined at fib:8:10
 	//   used at 10:10, 12:13, 12:24, 9:5
 }
 
diff --git a/src/cmd/compile/internal/types2/expr.go b/src/cmd/compile/internal/types2/expr.go
index a3abbb9..67afbfb 100644
--- a/src/cmd/compile/internal/types2/expr.go
+++ b/src/cmd/compile/internal/types2/expr.go
@@ -12,7 +12,6 @@
 	"go/constant"
 	"go/token"
 	. "internal/types/errors"
-	"math"
 )
 
 /*
@@ -84,41 +83,6 @@
 	return true
 }
 
-// overflow checks that the constant x is representable by its type.
-// For untyped constants, it checks that the value doesn't become
-// arbitrarily large.
-func (check *Checker) overflow(x *operand) {
-	assert(x.mode == constant_)
-
-	if x.val.Kind() == constant.Unknown {
-		// TODO(gri) We should report exactly what went wrong. At the
-		//           moment we don't have the (go/constant) API for that.
-		//           See also TODO in go/constant/value.go.
-		check.error(opPos(x.expr), InvalidConstVal, "constant result is not representable")
-		return
-	}
-
-	// Typed constants must be representable in
-	// their type after each constant operation.
-	// x.typ cannot be a type parameter (type
-	// parameters cannot be constant types).
-	if isTyped(x.typ) {
-		check.representable(x, under(x.typ).(*Basic))
-		return
-	}
-
-	// Untyped integer values must not grow arbitrarily.
-	const prec = 512 // 512 is the constant precision
-	if x.val.Kind() == constant.Int && constant.BitLen(x.val) > prec {
-		op := opName(x.expr)
-		if op != "" {
-			op += " "
-		}
-		check.errorf(opPos(x.expr), InvalidConstVal, "constant %soverflow", op)
-		x.val = constant.MakeUnknown()
-	}
-}
-
 // opPos returns the position of the operator if x is an operation;
 // otherwise it returns the start position of x.
 func opPos(x syntax.Expr) syntax.Pos {
@@ -173,12 +137,13 @@
 }
 
 func (check *Checker) unary(x *operand, e *syntax.Operation) {
-	check.expr(x, e.X)
+	check.expr(nil, x, e.X)
 	if x.mode == invalid {
 		return
 	}
 
-	switch e.Op {
+	op := e.Op
+	switch op {
 	case syntax.And:
 		// spec: "As an exception to the addressability
 		// requirement x may also be a composite literal."
@@ -215,13 +180,17 @@
 		return
 
 	case syntax.Tilde:
-		// Provide a better error position and message than what check.op below could do.
-		check.error(e, UndefinedOp, "cannot use ~ outside of interface or type constraint")
-		x.mode = invalid
-		return
+		// Provide a better error position and message than what check.op below would do.
+		if !allInteger(x.typ) {
+			check.error(e, UndefinedOp, "cannot use ~ outside of interface or type constraint")
+			x.mode = invalid
+			return
+		}
+		check.error(e, UndefinedOp, "cannot use ~ outside of interface or type constraint (use ^ for bitwise complement)")
+		op = syntax.Xor
 	}
 
-	if !check.op(unaryOpPredicates, x, e.Op) {
+	if !check.op(unaryOpPredicates, x, op) {
 		x.mode = invalid
 		return
 	}
@@ -235,9 +204,9 @@
 		if isUnsigned(x.typ) {
 			prec = uint(check.conf.sizeof(x.typ) * 8)
 		}
-		x.val = constant.UnaryOp(op2tok[e.Op], x.val, prec)
+		x.val = constant.UnaryOp(op2tok[op], x.val, prec)
 		x.expr = e
-		check.overflow(x)
+		check.overflow(x, opPos(x.expr))
 		return
 	}
 
@@ -258,235 +227,6 @@
 	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 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 and complex values, and to an Int
-// value for integer values; it is left alone otherwise.
-// It is ok to provide the addressof the first argument for rounded.
-//
-// The check parameter may be nil if representableConst is invoked
-// (indirectly) through an exported API call (AssignableTo, ConvertibleTo)
-// because we don't need the Checker's config for those calls.
-func representableConst(x constant.Value, check *Checker, typ *Basic, rounded *constant.Value) bool {
-	if x.Kind() == constant.Unknown {
-		return true // avoid follow-up errors
-	}
-
-	var conf *Config
-	if check != nil {
-		conf = check.conf
-	}
-
-	switch {
-	case isInteger(typ):
-		x := constant.ToInt(x)
-		if x.Kind() != constant.Int {
-			return false
-		}
-		if rounded != nil {
-			*rounded = x
-		}
-		if x, ok := constant.Int64Val(x); ok {
-			switch typ.kind {
-			case Int:
-				var s = uint(conf.sizeof(typ)) * 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, UntypedInt:
-				return true
-			case Uint, Uintptr:
-				if s := uint(conf.sizeof(typ)) * 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
-			default:
-				unreachable()
-			}
-		}
-		// x does not fit into int64
-		switch n := constant.BitLen(x); typ.kind {
-		case Uint, Uintptr:
-			var s = uint(conf.sizeof(typ)) * 8
-			return constant.Sign(x) >= 0 && n <= int(s)
-		case Uint64:
-			return constant.Sign(x) >= 0 && n <= 64
-		case UntypedInt:
-			return true
-		}
-
-	case isFloat(typ):
-		x := constant.ToFloat(x)
-		if x.Kind() != constant.Float {
-			return false
-		}
-		switch typ.kind {
-		case Float32:
-			if rounded == nil {
-				return fitsFloat32(x)
-			}
-			r := roundFloat32(x)
-			if r != nil {
-				*rounded = r
-				return true
-			}
-		case Float64:
-			if rounded == nil {
-				return fitsFloat64(x)
-			}
-			r := roundFloat64(x)
-			if r != nil {
-				*rounded = r
-				return true
-			}
-		case UntypedFloat:
-			return true
-		default:
-			unreachable()
-		}
-
-	case isComplex(typ):
-		x := constant.ToComplex(x)
-		if x.Kind() != constant.Complex {
-			return false
-		}
-		switch typ.kind {
-		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
-		default:
-			unreachable()
-		}
-
-	case isString(typ):
-		return x.Kind() == constant.String
-
-	case isBoolean(typ):
-		return x.Kind() == constant.Bool
-	}
-
-	return false
-}
-
-// representable checks that a constant operand is representable in the given
-// basic type.
-func (check *Checker) representable(x *operand, typ *Basic) {
-	v, code := check.representation(x, typ)
-	if code != 0 {
-		check.invalidConversion(code, x, typ)
-		x.mode = invalid
-		return
-	}
-	assert(v != nil)
-	x.val = v
-}
-
-// representation returns the representation of the constant operand x as the
-// basic type typ.
-//
-// If no such representation is possible, it returns a non-zero error code.
-func (check *Checker) representation(x *operand, typ *Basic) (constant.Value, Code) {
-	assert(x.mode == constant_)
-	v := x.val
-	if !representableConst(x.val, check, typ, &v) {
-		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) {
-				return nil, TruncatedFloat
-			} else {
-				return nil, NumericOverflow
-			}
-		}
-		return nil, InvalidConstVal
-	}
-	return v, 0
-}
-
-func (check *Checker) invalidConversion(code Code, x *operand, target Type) {
-	msg := "cannot convert %s to type %s"
-	switch code {
-	case TruncatedFloat:
-		msg = "%s truncated to %s"
-	case NumericOverflow:
-		msg = "%s overflows %s"
-	}
-	check.errorf(x, code, msg, x, target)
-}
-
 // 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
@@ -527,7 +267,7 @@
 		// The respective sub-expressions got their final types
 		// upon assignment or use.
 		if debug {
-			check.dump("%v: found old type(%s): %s (new: %s)", posFor(x), x, old.typ, typ)
+			check.dump("%v: found old type(%s): %s (new: %s)", atPos(x), x, old.typ, typ)
 			unreachable()
 		}
 		return
@@ -622,7 +362,7 @@
 		}
 		// Even if we have an integer, if the value is a constant we
 		// still must check that it is representable as the specific
-		// int type requested (was issue #22969). Fall through here.
+		// int type requested (was go.dev/issue/22969). Fall through here.
 	}
 	if old.val != nil {
 		// If x is a constant, it must be representable as a value of typ.
@@ -645,28 +385,6 @@
 	}
 }
 
-// convertUntyped attempts to set the type of an untyped value to the target type.
-func (check *Checker) convertUntyped(x *operand, target Type) {
-	newType, val, code := check.implicitTypeAndValue(x, target)
-	if code != 0 {
-		t := target
-		if !isTypeParam(target) {
-			t = safeUnderlying(target)
-		}
-		check.invalidConversion(code, x, t)
-		x.mode = invalid
-		return
-	}
-	if val != nil {
-		x.val = val
-		check.updateExprVal(x.expr, val)
-	}
-	if newType != x.typ {
-		x.typ = newType
-		check.updateExprType(x.expr, newType, false)
-	}
-}
-
 // implicitTypeAndValue returns the implicit type of x when used in a context
 // where the target type is expected. If no such implicit conversion is
 // possible, it returns a nil Type and non-zero error code.
@@ -677,19 +395,14 @@
 	if x.mode == invalid || isTyped(x.typ) || target == Typ[Invalid] {
 		return x.typ, nil, 0
 	}
+	// x is untyped
 
 	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 {
-				return target, nil, 0
-			}
-		} else if xkind != tkind {
-			return nil, nil, InvalidUntypedConversion
+		if m := maxType(x.typ, target); m != nil {
+			return m, nil, 0
 		}
-		return x.typ, nil, 0
+		return nil, nil, InvalidUntypedConversion
 	}
 
 	if x.isNil() {
@@ -760,7 +473,7 @@
 
 // If switchCase is true, the operator op is ignored.
 func (check *Checker) comparison(x, y *operand, op syntax.Operator, switchCase bool) {
-	// Avoid spurious errors if any of the operands has an invalid type (issue #54405).
+	// Avoid spurious errors if any of the operands has an invalid type (go.dev/issue/54405).
 	if x.typ == Typ[Invalid] || y.typ == Typ[Invalid] {
 		x.mode = invalid
 		return
@@ -942,7 +655,7 @@
 	// or be an untyped constant representable by a value of type uint."
 
 	// Check that constants are representable by uint, but do not convert them
-	// (see also issue #47243).
+	// (see also go.dev/issue/47243).
 	var yval constant.Value
 	if y.mode == constant_ {
 		// Provide a good error message for negative shift counts.
@@ -955,7 +668,7 @@
 
 		if isUntyped(y.typ) {
 			// Caution: Check for representability here, rather than in the switch
-			// below, because isInteger includes untyped integers (was bug #43697).
+			// below, because isInteger includes untyped integers (was bug go.dev/issue/43697).
 			check.representable(y, Typ[Uint])
 			if y.mode == invalid {
 				x.mode = invalid
@@ -966,14 +679,13 @@
 		// Check that RHS is otherwise at least of integer type.
 		switch {
 		case allInteger(y.typ):
-			if !allUnsigned(y.typ) && !check.allowVersion(check.pkg, 1, 13) {
-				check.versionErrorf(y, "go1.13", invalidOp+"signed shift count %s", y)
+			if !allUnsigned(y.typ) && !check.verifyVersionf(y, go1_13, invalidOp+"signed shift count %s", y) {
 				x.mode = invalid
 				return
 			}
 		case isUntyped(y.typ):
 			// This is incorrect, but preserves pre-existing behavior.
-			// See also bug #47410.
+			// See also go.dev/issue/47410.
 			check.convertUntyped(y, Typ[Uint])
 			if y.mode == invalid {
 				x.mode = invalid
@@ -998,7 +710,7 @@
 				return
 			}
 			// rhs must be within reasonable bounds in constant shifts
-			const shiftBound = 1023 - 1 + 52 // so we can express smallestFloat64 (see issue #44057)
+			const shiftBound = 1023 - 1 + 52 // so we can express smallestFloat64 (see go.dev/issue/44057)
 			s, ok := constant.Uint64Val(yval)
 			if !ok || s > shiftBound {
 				check.errorf(y, InvalidShiftCount, invalidOp+"invalid shift count %s", y)
@@ -1015,7 +727,7 @@
 			// x is a constant so xval != nil and it must be of Int kind.
 			x.val = constant.Shift(xval, op2tok[op], uint(s))
 			x.expr = e
-			check.overflow(x)
+			check.overflow(x, opPos(x.expr))
 			return
 		}
 
@@ -1039,7 +751,7 @@
 			// the same expr node still just leads to one entry for
 			// that node, and it can only be deleted once).
 			// Be cautious and check for presence of entry.
-			// Example: var e, f = int(1<<""[f]) // issue 11347
+			// Example: var e, f = int(1<<""[f]) // go.dev/issue/11347
 			if info, found := check.untyped[x.expr]; found {
 				info.isLhs = true
 				check.untyped[x.expr] = info
@@ -1086,8 +798,8 @@
 func (check *Checker) binary(x *operand, e syntax.Expr, lhs, rhs syntax.Expr, op syntax.Operator) {
 	var y operand
 
-	check.expr(x, lhs)
-	check.expr(&y, rhs)
+	check.expr(nil, x, lhs)
+	check.expr(nil, &y, rhs)
 
 	if x.mode == invalid {
 		return
@@ -1103,6 +815,80 @@
 		return
 	}
 
+	check.matchTypes(x, &y)
+	if x.mode == invalid {
+		return
+	}
+
+	if isComparison(op) {
+		check.comparison(x, &y, op, false)
+		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] {
+			if e != nil {
+				check.errorf(x, MismatchedTypes, invalidOp+"%s (mismatched types %s and %s)", e, x.typ, y.typ)
+			} else {
+				check.errorf(x, MismatchedTypes, invalidOp+"%s %s= %s (mismatched types %s and %s)", lhs, op, rhs, x.typ, y.typ)
+			}
+		}
+		x.mode = invalid
+		return
+	}
+
+	if !check.op(binaryOpPredicates, x, op) {
+		x.mode = invalid
+		return
+	}
+
+	if op == syntax.Div || op == syntax.Rem {
+		// check for zero divisor
+		if (x.mode == constant_ || allInteger(x.typ)) && y.mode == constant_ && constant.Sign(y.val) == 0 {
+			check.error(&y, DivByZero, invalidOp+"division by zero")
+			x.mode = invalid
+			return
+		}
+
+		// check for divisor underflow in complex division (see go.dev/issue/20227)
+		if x.mode == constant_ && y.mode == constant_ && isComplex(x.typ) {
+			re, im := constant.Real(y.val), constant.Imag(y.val)
+			re2, im2 := constant.BinaryOp(re, token.MUL, re), constant.BinaryOp(im, token.MUL, im)
+			if constant.Sign(re2) == 0 && constant.Sign(im2) == 0 {
+				check.error(&y, DivByZero, invalidOp+"division by zero")
+				x.mode = invalid
+				return
+			}
+		}
+	}
+
+	if x.mode == constant_ && y.mode == constant_ {
+		// if either x or y has an unknown value, the result is unknown
+		if x.val.Kind() == constant.Unknown || y.val.Kind() == constant.Unknown {
+			x.val = constant.MakeUnknown()
+			// x.typ is unchanged
+			return
+		}
+		// force integer division for integer operands
+		tok := op2tok[op]
+		if op == syntax.Div && isInteger(x.typ) {
+			tok = token.QUO_ASSIGN
+		}
+		x.val = constant.BinaryOp(x.val, tok, y.val)
+		x.expr = e
+		check.overflow(x, opPos(x.expr))
+		return
+	}
+
+	x.mode = value
+	// x.typ is unchanged
+}
+
+// matchTypes attempts to convert any untyped types x and y such that they match.
+// If an error occurs, x.mode is set to invalid.
+func (check *Checker) matchTypes(x, y *operand) {
 	// mayConvert reports whether the operands x and y may
 	// possibly have matching types after converting one
 	// untyped operand to the type of the other.
@@ -1146,82 +932,18 @@
 		}
 		return true
 	}
-	if mayConvert(x, &y) {
+
+	if mayConvert(x, y) {
 		check.convertUntyped(x, y.typ)
 		if x.mode == invalid {
 			return
 		}
-		check.convertUntyped(&y, x.typ)
+		check.convertUntyped(y, x.typ)
 		if y.mode == invalid {
 			x.mode = invalid
 			return
 		}
 	}
-
-	if isComparison(op) {
-		check.comparison(x, &y, op, false)
-		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] {
-			if e != nil {
-				check.errorf(x, MismatchedTypes, invalidOp+"%s (mismatched types %s and %s)", e, x.typ, y.typ)
-			} else {
-				check.errorf(x, MismatchedTypes, invalidOp+"%s %s= %s (mismatched types %s and %s)", lhs, op, rhs, x.typ, y.typ)
-			}
-		}
-		x.mode = invalid
-		return
-	}
-
-	if !check.op(binaryOpPredicates, x, op) {
-		x.mode = invalid
-		return
-	}
-
-	if op == syntax.Div || op == syntax.Rem {
-		// check for zero divisor
-		if (x.mode == constant_ || allInteger(x.typ)) && y.mode == constant_ && constant.Sign(y.val) == 0 {
-			check.error(&y, DivByZero, invalidOp+"division by zero")
-			x.mode = invalid
-			return
-		}
-
-		// check for divisor underflow in complex division (see issue 20227)
-		if x.mode == constant_ && y.mode == constant_ && isComplex(x.typ) {
-			re, im := constant.Real(y.val), constant.Imag(y.val)
-			re2, im2 := constant.BinaryOp(re, token.MUL, re), constant.BinaryOp(im, token.MUL, im)
-			if constant.Sign(re2) == 0 && constant.Sign(im2) == 0 {
-				check.error(&y, DivByZero, invalidOp+"division by zero")
-				x.mode = invalid
-				return
-			}
-		}
-	}
-
-	if x.mode == constant_ && y.mode == constant_ {
-		// if either x or y has an unknown value, the result is unknown
-		if x.val.Kind() == constant.Unknown || y.val.Kind() == constant.Unknown {
-			x.val = constant.MakeUnknown()
-			// x.typ is unchanged
-			return
-		}
-		// force integer division for integer operands
-		tok := op2tok[op]
-		if op == syntax.Div && isInteger(x.typ) {
-			tok = token.QUO_ASSIGN
-		}
-		x.val = constant.BinaryOp(x.val, tok, y.val)
-		x.expr = e
-		check.overflow(x)
-		return
-	}
-
-	x.mode = value
-	// x.typ is unchanged
 }
 
 // exprKind describes the kind of an expression; the kind
@@ -1234,12 +956,18 @@
 	statement
 )
 
+// TODO(gri) In rawExpr below, consider using T instead of hint and
+//           some sort of "operation mode" instead of allowGeneric.
+//           May be clearer and less error-prone.
+
 // rawExpr typechecks expression e and initializes x with the expression
 // value or type. If an error occurred, x.mode is set to invalid.
+// If a non-nil target type T is given and e is a generic function
+// or function call, T is used to infer the type arguments for e.
 // If hint != nil, it is the type of a composite literal element.
 // If allowGeneric is set, the operand type may be an uninstantiated
 // parameterized type or function value.
-func (check *Checker) rawExpr(x *operand, e syntax.Expr, hint Type, allowGeneric bool) exprKind {
+func (check *Checker) rawExpr(T Type, x *operand, e syntax.Expr, hint Type, allowGeneric bool) exprKind {
 	if check.conf.Trace {
 		check.trace(e.Pos(), "-- expr %s", e)
 		check.indent++
@@ -1249,10 +977,10 @@
 		}()
 	}
 
-	kind := check.exprInternal(x, e, hint)
+	kind := check.exprInternal(T, x, e, hint)
 
 	if !allowGeneric {
-		check.nonGeneric(x)
+		check.nonGeneric(T, x)
 	}
 
 	check.record(x)
@@ -1260,9 +988,10 @@
 	return kind
 }
 
-// If x is a generic function or type, nonGeneric reports an error and invalidates x.mode and x.typ.
+// If x is a generic type, or a generic function whose type arguments cannot be inferred
+// from a non-nil target type T, nonGeneric reports an error and invalidates x.mode and x.typ.
 // Otherwise it leaves x alone.
-func (check *Checker) nonGeneric(x *operand) {
+func (check *Checker) nonGeneric(T Type, x *operand) {
 	if x.mode == invalid || x.mode == novalue {
 		return
 	}
@@ -1274,6 +1003,12 @@
 		}
 	case *Signature:
 		if t.tparams != nil {
+			if enableReverseTypeInference && T != nil {
+				if tsig, _ := under(T).(*Signature); tsig != nil {
+					check.funcInst(tsig, x.Pos(), x, nil, true)
+					return
+				}
+			}
 			what = "function"
 		}
 	}
@@ -1286,9 +1021,10 @@
 
 // exprInternal contains the core of type checking of expressions.
 // Must only be called by rawExpr.
-func (check *Checker) exprInternal(x *operand, e syntax.Expr, hint Type) exprKind {
+// (See rawExpr for an explanation of the parameters.)
+func (check *Checker) exprInternal(T Type, x *operand, e syntax.Expr, hint Type) exprKind {
 	// make sure x has a valid state in case of bailout
-	// (was issue 5770)
+	// (was go.dev/issue/5770)
 	x.mode = invalid
 	x.typ = Typ[Invalid]
 
@@ -1339,9 +1075,9 @@
 			check.errorf(e, InvalidConstVal, "malformed constant: %s", e.Value)
 			goto Error
 		}
-		// Ensure that integer values don't overflow (issue #54280).
+		// Ensure that integer values don't overflow (go.dev/issue/54280).
 		x.expr = e // make sure that check.overflow below has an error position
-		check.overflow(x)
+		check.overflow(x, opPos(x.expr))
 
 	case *syntax.FuncLit:
 		if sig, ok := check.typ(e.Type).(*Signature); ok {
@@ -1350,11 +1086,11 @@
 				// init expression/func declaration which contains
 				// them: use existing package-level declaration info.
 				decl := check.decl // capture for use in closure below
-				iota := check.iota // capture for use in closure below (#22345)
+				iota := check.iota // capture for use in closure below (go.dev/issue/22345)
 				// Don't type-check right away because the function may
 				// be part of a type definition to which the function
 				// body refers. Instead, type-check as soon as possible,
-				// but before the enclosing scope contents changes (#22992).
+				// but before the enclosing scope contents changes (go.dev/issue/22992).
 				check.later(func() {
 					check.funcBody(decl, "<function literal>", sig, e.Body, iota)
 				}).describef(e, "func literal")
@@ -1427,7 +1163,7 @@
 					key, _ := kv.Key.(*syntax.Name)
 					// do all possible checks early (before exiting due to errors)
 					// so we don't drop information on the floor
-					check.expr(x, kv.Value)
+					check.expr(nil, x, kv.Value)
 					if key == nil {
 						check.errorf(kv, InvalidLitField, "invalid field name %s in struct literal", kv.Key)
 						continue
@@ -1455,7 +1191,7 @@
 						check.error(kv, MixedStructLit, "mixture of field:value and value elements in struct literal")
 						continue
 					}
-					check.expr(x, e)
+					check.expr(nil, x, e)
 					if i >= len(fields) {
 						check.errorf(x, InvalidStructLit, "too many values in struct literal of type %s", base)
 						break // cannot continue
@@ -1476,7 +1212,7 @@
 			}
 
 		case *Array:
-			// Prevent crash if the array referred to is not yet set up. Was issue #18643.
+			// Prevent crash if the array referred to is not yet set up. Was go.dev/issue/18643.
 			// This is a stop-gap solution. Should use Checker.objPath to report entire
 			// path starting with earliest declaration in the source. TODO(gri) fix this.
 			if utyp.elem == nil {
@@ -1491,7 +1227,7 @@
 			// length the same here because it makes sense to "guess" the length for
 			// the latter if we have a composite literal; e.g. for [n]int{1, 2, 3}
 			// where n is invalid for some reason, it seems fair to assume it should
-			// be 3 (see also Checked.arrayLength and issue #27346).
+			// be 3 (see also Checked.arrayLength and go.dev/issue/27346).
 			if utyp.len < 0 {
 				utyp.len = n
 				// e.Type is missing if we have a composite literal element
@@ -1582,7 +1318,8 @@
 		x.typ = typ
 
 	case *syntax.ParenExpr:
-		kind := check.rawExpr(x, e.X, nil, false)
+		// type inference doesn't go past parentheses (targe type T = nil)
+		kind := check.rawExpr(nil, x, e.X, nil, false)
 		x.expr = e
 		return kind
 
@@ -1591,7 +1328,11 @@
 
 	case *syntax.IndexExpr:
 		if check.indexExpr(x, e) {
-			check.funcInst(x, e)
+			var tsig *Signature
+			if enableReverseTypeInference && T != nil {
+				tsig, _ = under(T).(*Signature)
+			}
+			check.funcInst(tsig, e.Pos(), x, e, true)
 		}
 		if x.mode == invalid {
 			goto Error
@@ -1604,11 +1345,15 @@
 		}
 
 	case *syntax.AssertExpr:
-		check.expr(x, e.X)
+		check.expr(nil, x, e.X)
 		if x.mode == invalid {
 			goto Error
 		}
-		// TODO(gri) we may want to permit type assertions on type parameter values at some point
+		// x.(type) expressions are encoded via TypeSwitchGuards
+		if e.Type == nil {
+			check.error(e, InvalidSyntaxTree, "invalid use of AssertExpr")
+			goto Error
+		}
 		if isTypeParam(x.typ) {
 			check.errorf(x, InvalidAssert, invalidOp+"cannot use type assertion on type parameter value %s", x)
 			goto Error
@@ -1617,11 +1362,6 @@
 			check.errorf(x, InvalidAssert, invalidOp+"%s is not an interface", x)
 			goto Error
 		}
-		// x.(type) expressions are encoded via TypeSwitchGuards
-		if e.Type == nil {
-			check.error(e, InvalidSyntaxTree, "invalid use of AssertExpr")
-			goto Error
-		}
 		T := check.varType(e.Type)
 		if T == Typ[Invalid] {
 			goto Error
@@ -1633,6 +1373,7 @@
 	case *syntax.TypeSwitchGuard:
 		// x.(type) expressions are handled explicitly in type switches
 		check.error(e, InvalidSyntaxTree, "use of .(type) outside type switch")
+		check.use(e.X)
 		goto Error
 
 	case *syntax.CallExpr:
@@ -1731,7 +1472,7 @@
 		// types, which are comparatively rare.
 
 	default:
-		panic(fmt.Sprintf("%s: unknown expression type %T", posFor(e), e))
+		panic(fmt.Sprintf("%s: unknown expression type %T", atPos(e), e))
 	}
 
 	// everything went well
@@ -1788,13 +1529,11 @@
 
 // typeAssertion checks x.(T). The type of x must be an interface.
 func (check *Checker) typeAssertion(e syntax.Expr, x *operand, T Type, typeSwitch bool) {
-	method, alt := check.assertableTo(under(x.typ).(*Interface), T)
-	if method == nil {
+	var cause string
+	if check.assertableTo(x.typ, T, &cause) {
 		return // success
 	}
 
-	cause := check.missingMethodCause(T, x.typ, method, alt)
-
 	if typeSwitch {
 		check.errorf(e, ImpossibleAssert, "impossible type switch case: %s\n\t%s cannot have dynamic type %s %s", e, x, T, cause)
 		return
@@ -1804,18 +1543,54 @@
 }
 
 // expr typechecks expression e and initializes x with the expression value.
+// If a non-nil target type T is given and e is a generic function
+// or function call, T is used to infer the type arguments for e.
 // The result must be a single value.
 // If an error occurred, x.mode is set to invalid.
-func (check *Checker) expr(x *operand, e syntax.Expr) {
-	check.rawExpr(x, e, nil, false)
+func (check *Checker) expr(T Type, x *operand, e syntax.Expr) {
+	check.rawExpr(T, x, e, nil, false)
 	check.exclude(x, 1<<novalue|1<<builtin|1<<typexpr)
 	check.singleValue(x)
 }
 
-// multiExpr is like expr but the result may also be a multi-value.
-func (check *Checker) multiExpr(x *operand, e syntax.Expr) {
-	check.rawExpr(x, e, nil, false)
+// genericExpr is like expr but the result may also be generic.
+func (check *Checker) genericExpr(x *operand, e syntax.Expr) {
+	check.rawExpr(nil, x, e, nil, true)
 	check.exclude(x, 1<<novalue|1<<builtin|1<<typexpr)
+	check.singleValue(x)
+}
+
+// multiExpr typechecks e and returns its value (or values) in list.
+// If allowCommaOk is set and e is a map index, comma-ok, or comma-err
+// expression, the result is a two-element list containing the value
+// of e, and an untyped bool value or an error value, respectively.
+// If an error occurred, list[0] is not valid.
+func (check *Checker) multiExpr(e syntax.Expr, allowCommaOk bool) (list []*operand, commaOk bool) {
+	var x operand
+	check.rawExpr(nil, &x, e, nil, false)
+	check.exclude(&x, 1<<novalue|1<<builtin|1<<typexpr)
+
+	if t, ok := x.typ.(*Tuple); ok && x.mode != invalid {
+		// multiple values
+		list = make([]*operand, t.Len())
+		for i, v := range t.vars {
+			list[i] = &operand{mode: value, expr: e, typ: v.typ}
+		}
+		return
+	}
+
+	// exactly one (possibly invalid or comma-ok) value
+	list = []*operand{&x}
+	if allowCommaOk && (x.mode == mapindex || x.mode == commaok || x.mode == commaerr) {
+		x2 := &operand{mode: value, expr: e, typ: Typ[UntypedBool]}
+		if x.mode == commaerr {
+			x2.typ = universeError
+		}
+		list = append(list, x2)
+		commaOk = true
+	}
+
+	return
 }
 
 // exprWithHint typechecks expression e and initializes x with the expression value;
@@ -1823,7 +1598,7 @@
 // If an error occurred, x.mode is set to invalid.
 func (check *Checker) exprWithHint(x *operand, e syntax.Expr, hint Type) {
 	assert(hint != nil)
-	check.rawExpr(x, e, hint, false)
+	check.rawExpr(nil, x, e, hint, false)
 	check.exclude(x, 1<<novalue|1<<builtin|1<<typexpr)
 	check.singleValue(x)
 }
@@ -1833,7 +1608,7 @@
 // value.
 // If an error occurred, x.mode is set to invalid.
 func (check *Checker) exprOrType(x *operand, e syntax.Expr, allowGeneric bool) {
-	check.rawExpr(x, e, nil, allowGeneric)
+	check.rawExpr(nil, x, e, nil, allowGeneric)
 	check.exclude(x, 1<<novalue)
 	check.singleValue(x)
 }
diff --git a/src/cmd/compile/internal/types2/gccgosizes.go b/src/cmd/compile/internal/types2/gccgosizes.go
index 05aba53..4602001 100644
--- a/src/cmd/compile/internal/types2/gccgosizes.go
+++ b/src/cmd/compile/internal/types2/gccgosizes.go
@@ -17,6 +17,7 @@
 	"arm64":       {8, 8},
 	"arm64be":     {8, 8},
 	"ia64":        {8, 8},
+	"loong64":     {8, 8},
 	"m68k":        {4, 2},
 	"mips":        {4, 8},
 	"mipsle":      {4, 8},
diff --git a/src/cmd/compile/internal/types2/hilbert_test.go b/src/cmd/compile/internal/types2/hilbert_test.go
index 391a498..df8a3e7 100644
--- a/src/cmd/compile/internal/types2/hilbert_test.go
+++ b/src/cmd/compile/internal/types2/hilbert_test.go
@@ -11,7 +11,6 @@
 	"os"
 	"testing"
 
-	"cmd/compile/internal/syntax"
 	. "cmd/compile/internal/types2"
 )
 
@@ -28,19 +27,8 @@
 		return
 	}
 
-	// parse source
-	f, err := syntax.Parse(syntax.NewFileBase("hilbert.go"), bytes.NewReader(src), nil, nil, 0)
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	// type-check file
-	DefPredeclaredTestFuncs() // define assert built-in
-	conf := Config{Importer: defaultImporter()}
-	_, err = conf.Check(f.PkgName.Value, []*syntax.File{f}, nil)
-	if err != nil {
-		t.Fatal(err)
-	}
+	DefPredeclaredTestFuncs() // declare assert (used by code generated by verify)
+	mustTypecheck(string(src), nil, nil)
 }
 
 func program(n int, out string) []byte {
diff --git a/src/cmd/compile/internal/types2/index.go b/src/cmd/compile/internal/types2/index.go
index 9e5c4d8..3ebe851 100644
--- a/src/cmd/compile/internal/types2/index.go
+++ b/src/cmd/compile/internal/types2/index.go
@@ -42,7 +42,7 @@
 	}
 
 	// x should not be generic at this point, but be safe and check
-	check.nonGeneric(x)
+	check.nonGeneric(nil, x)
 	if x.mode == invalid {
 		return false
 	}
@@ -92,7 +92,7 @@
 			return false
 		}
 		var key operand
-		check.expr(&key, index)
+		check.expr(nil, &key, index)
 		check.assignment(&key, typ.key, "map index")
 		// ok to continue even if indexing failed - map element type is known
 		x.mode = mapindex
@@ -166,7 +166,7 @@
 					return false
 				}
 				var k operand
-				check.expr(&k, index)
+				check.expr(nil, &k, index)
 				check.assignment(&k, key, "map index")
 				// ok to continue even if indexing failed - map element type is known
 				x.mode = mapindex
@@ -184,6 +184,7 @@
 
 	if !valid {
 		check.errorf(e.Pos(), NonSliceableOperand, invalidOp+"cannot index %s", x)
+		check.use(e.Index)
 		x.mode = invalid
 		return false
 	}
@@ -206,7 +207,7 @@
 }
 
 func (check *Checker) sliceExpr(x *operand, e *syntax.SliceExpr) {
-	check.expr(x, e.X)
+	check.expr(nil, x, e.X)
 	if x.mode == invalid {
 		check.use(e.Index[:]...)
 		return
@@ -353,7 +354,7 @@
 	val = -1
 
 	var x operand
-	check.expr(&x, index)
+	check.expr(nil, &x, index)
 	if !check.isValidIndex(&x, InvalidIndex, "index", false) {
 		return
 	}
@@ -415,7 +416,7 @@
 	return true
 }
 
-// indexElts checks the elements (elts) of an array or slice composite literal
+// indexedElts 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).
diff --git a/src/cmd/compile/internal/types2/infer.go b/src/cmd/compile/internal/types2/infer.go
index 5750ece..5eb916c 100644
--- a/src/cmd/compile/internal/types2/infer.go
+++ b/src/cmd/compile/internal/types2/infer.go
@@ -13,38 +13,30 @@
 	"strings"
 )
 
-const useConstraintTypeInference = true
+// If enableReverseTypeInference is set, uninstantiated and
+// partially instantiated generic functions may be assigned
+// (incl. returned) to variables of function type and type
+// inference will attempt to infer the missing type arguments.
+// Available with go1.21.
+const enableReverseTypeInference = true // disable for debugging
 
 // infer attempts to infer the complete set of type arguments for generic function instantiation/call
 // based on the given type parameters tparams, type arguments targs, function parameters params, and
 // function arguments args, if any. There must be at least one type parameter, no more type arguments
 // than type parameters, and params and args must match in number (incl. zero).
-// If successful, infer returns the complete list of type arguments, one for each type parameter.
-// Otherwise the result is nil and appropriate errors will be reported.
-//
-// Inference proceeds as follows. Starting with given type arguments:
-//
-//  1. apply FTI (function type inference) with typed arguments,
-//  2. apply CTI (constraint type inference),
-//  3. apply FTI with untyped function arguments,
-//  4. apply CTI.
-//
-// The process stops as soon as all type arguments are known or an error occurs.
-func (check *Checker) infer(pos syntax.Pos, tparams []*TypeParam, targs []Type, params *Tuple, args []*operand) (result []Type) {
+// If successful, infer returns the complete list of given and inferred type arguments, one for each
+// type parameter. Otherwise the result is nil and appropriate errors will be reported.
+func (check *Checker) infer(pos syntax.Pos, tparams []*TypeParam, targs []Type, params *Tuple, args []*operand) (inferred []Type) {
 	if debug {
 		defer func() {
-			assert(result == nil || len(result) == len(tparams))
-			for _, targ := range result {
-				assert(targ != nil)
-			}
-			//check.dump("### inferred targs = %s", result)
+			assert(inferred == nil || len(inferred) == len(tparams) && !containsNil(inferred))
 		}()
 	}
 
 	if traceInference {
-		check.dump("-- inferA %s%s ➞ %s", tparams, params, targs)
+		check.dump("== infer : %s%s ➞ %s", tparams, params, targs) // aligned with rename print below
 		defer func() {
-			check.dump("=> inferA %s ➞ %s", tparams, result)
+			check.dump("=> %s ➞ %s\n", tparams, inferred)
 		}()
 	}
 
@@ -52,115 +44,16 @@
 	n := len(tparams)
 	assert(n > 0 && len(targs) <= n)
 
-	// Function parameters and arguments must match in number.
+	// Parameters and arguments must match in number.
 	assert(params.Len() == len(args))
 
 	// If we already have all type arguments, we're done.
-	if len(targs) == n {
+	if len(targs) == n && !containsNil(targs) {
 		return targs
 	}
-	// len(targs) < n
 
-	const enableTparamRenaming = true
-	if enableTparamRenaming {
-		// For the purpose of type inference we must differentiate type parameters
-		// occurring in explicit type or value function arguments from the type
-		// parameters we are solving for via unification, because they may be the
-		// same in self-recursive calls. For example:
-		//
-		//  func f[P *Q, Q any](p P, q Q) {
-		//    f(p)
-		//  }
-		//
-		// In this example, the fact that the P used in the instantation f[P] has
-		// the same pointer identity as the P we are trying to solve for via
-		// unification is coincidental: there is nothing special about recursive
-		// calls that should cause them to conflate the identity of type arguments
-		// with type parameters. To put it another way: any such self-recursive
-		// call is equivalent to a mutually recursive call, which does not run into
-		// any problems of type parameter identity. For example, the following code
-		// is equivalent to the code above.
-		//
-		//  func f[P interface{*Q}, Q any](p P, q Q) {
-		//    f2(p)
-		//  }
-		//
-		//  func f2[P interface{*Q}, Q any](p P, q Q) {
-		//    f(p)
-		//  }
-		//
-		// We turn the first example into the second example by renaming type
-		// parameters in the original signature to give them a new identity.
-		tparams2 := make([]*TypeParam, len(tparams))
-		for i, tparam := range tparams {
-			tname := NewTypeName(tparam.Obj().Pos(), tparam.Obj().Pkg(), tparam.Obj().Name(), nil)
-			tparams2[i] = NewTypeParam(tname, nil)
-			tparams2[i].index = tparam.index // == i
-		}
-
-		renameMap := makeRenameMap(tparams, tparams2)
-		for i, tparam := range tparams {
-			tparams2[i].bound = check.subst(pos, tparam.bound, renameMap, nil, check.context())
-		}
-
-		tparams = tparams2
-		params = check.subst(pos, params, renameMap, nil, check.context()).(*Tuple)
-	}
-
-	// If we have more than 2 arguments, we may have arguments with named and unnamed types.
-	// If that is the case, permutate params and args such that the arguments with named
-	// types are first in the list. This doesn't affect type inference if all types are taken
-	// as is. But when we have inexact unification enabled (as is the case for function type
-	// inference), when a named type is unified with an unnamed type, unification proceeds
-	// with the underlying type of the named type because otherwise unification would fail
-	// right away. This leads to an asymmetry in type inference: in cases where arguments of
-	// named and unnamed types are passed to parameters with identical type, different types
-	// (named vs underlying) may be inferred depending on the order of the arguments.
-	// By ensuring that named types are seen first, order dependence is avoided and unification
-	// succeeds where it can (issue #43056).
-	const enableArgSorting = true
-	if m := len(args); m >= 2 && enableArgSorting {
-		// Determine indices of arguments with named and unnamed types.
-		var named, unnamed []int
-		for i, arg := range args {
-			if hasName(arg.typ) {
-				named = append(named, i)
-			} else {
-				unnamed = append(unnamed, i)
-			}
-		}
-
-		// If we have named and unnamed types, move the arguments with
-		// named types first. Update the parameter list accordingly.
-		// Make copies so as not to clobber the incoming slices.
-		if len(named) != 0 && len(unnamed) != 0 {
-			params2 := make([]*Var, m)
-			args2 := make([]*operand, m)
-			i := 0
-			for _, j := range named {
-				params2[i] = params.At(j)
-				args2[i] = args[j]
-				i++
-			}
-			for _, j := range unnamed {
-				params2[i] = params.At(j)
-				args2[i] = args[j]
-				i++
-			}
-			params = NewTuple(params2...)
-			args = args2
-		}
-	}
-
-	// --- 1 ---
-	// Continue with the type arguments we have. Avoid matching generic
-	// parameters that already have type arguments against function arguments:
-	// It may fail because matching uses type identity while parameter passing
-	// uses assignment rules. Instantiate the parameter list with the type
-	// arguments we have, and continue with that parameter list.
-
-	// First, make sure we have a "full" list of type arguments, some of which
-	// may be nil (unknown). Make a copy so as to not clobber the incoming slice.
+	// Make sure we have a "full" list of type arguments, some of which may
+	// be nil (unknown). Make a copy so as to not clobber the incoming slice.
 	if len(targs) < n {
 		targs2 := make([]Type, n)
 		copy(targs2, targs)
@@ -168,10 +61,33 @@
 	}
 	// len(targs) == n
 
+	// Continue with the type arguments we have. Avoid matching generic
+	// parameters that already have type arguments against function arguments:
+	// It may fail because matching uses type identity while parameter passing
+	// uses assignment rules. Instantiate the parameter list with the type
+	// arguments we have, and continue with that parameter list.
+
 	// Substitute type arguments for their respective type parameters in params,
 	// if any. Note that nil targs entries are ignored by check.subst.
-	// TODO(gri) Can we avoid this (we're setting known type arguments below,
-	//           but that doesn't impact the isParameterized check for now).
+	// We do this for better error messages; it's not needed for correctness.
+	// For instance, given:
+	//
+	//   func f[P, Q any](P, Q) {}
+	//
+	//   func _(s string) {
+	//           f[int](s, s) // ERROR
+	//   }
+	//
+	// With substitution, we get the error:
+	//   "cannot use s (variable of type string) as int value in argument to f[int]"
+	//
+	// Without substitution we get the (worse) error:
+	//   "type string of s does not match inferred type int for P"
+	// even though the type int was provided (not inferred) for P.
+	//
+	// TODO(gri) We might be able to finesse this in the error message reporting
+	//           (which only happens in case of an error) and then avoid doing
+	//           the substitution (which always happens).
 	if params.Len() > 0 {
 		smap := makeSubstMap(tparams, targs)
 		params = check.subst(nopos, params, smap, nil, check.context()).(*Tuple)
@@ -180,20 +96,12 @@
 	// Unify parameter and argument types for generic parameters with typed arguments
 	// and collect the indices of generic parameters with untyped arguments.
 	// Terminology: generic parameter = function parameter with a type-parameterized type
-	u := newUnifier(false)
-	u.x.init(tparams)
-
-	// Set the type arguments which we know already.
-	for i, targ := range targs {
-		if targ != nil {
-			u.x.set(i, targ)
-		}
-	}
+	u := newUnifier(tparams, targs, check.allowVersion(check.pkg, pos, go1_21))
 
 	errorf := func(kind string, tpar, targ Type, arg *operand) {
 		// provide a better error message if we can
-		targs, index := u.x.types()
-		if index == 0 {
+		targs := u.inferred(tparams)
+		if targs[0] == nil {
 			// The first type parameter couldn't be inferred.
 			// If none of them could be inferred, don't try
 			// to provide the inferred type in the error msg.
@@ -210,11 +118,12 @@
 			}
 		}
 		smap := makeSubstMap(tparams, targs)
+		// TODO(gri): pass a poser here, rather than arg.Pos().
 		inferred := check.subst(arg.Pos(), tpar, smap, nil, check.context())
-		// _CannotInferTypeArgs indicates a failure of inference, though the actual
+		// CannotInferTypeArgs indicates a failure of inference, though the actual
 		// error may be better attributed to a user-provided type argument (hence
-		// _InvalidTypeArg). We can't differentiate these cases, so fall back on
-		// the more general _CannotInferTypeArgs.
+		// InvalidTypeArg). We can't differentiate these cases, so fall back on
+		// the more general CannotInferTypeArgs.
 		if inferred != tpar {
 			check.errorf(arg, CannotInferTypeArgs, "%s %s of %s does not match inferred type %s for %s", kind, targ, arg.expr, inferred, tpar)
 		} else {
@@ -222,101 +131,357 @@
 		}
 	}
 
-	// indices of the generic parameters with untyped arguments - save for later
-	var indices []int
+	// indices of generic parameters with untyped arguments, for later use
+	var untyped []int
+
+	// --- 1 ---
+	// use information from function arguments
+
+	if traceInference {
+		u.tracef("== function parameters: %s", params)
+		u.tracef("-- function arguments : %s", args)
+	}
+
 	for i, arg := range args {
+		if arg.mode == invalid {
+			// An error was reported earlier. Ignore this arg
+			// and continue, we may still be able to infer all
+			// targs resulting in fewer follow-on errors.
+			// TODO(gri) determine if we still need this check
+			continue
+		}
 		par := params.At(i)
-		// If we permit bidirectional unification, this conditional code needs to be
-		// executed even if par.typ is not parameterized since the argument may be a
-		// generic function (for which we want to infer its type arguments).
-		if isParameterized(tparams, par.typ) {
-			if arg.mode == invalid {
-				// An error was reported earlier. Ignore this targ
-				// and continue, we may still be able to infer all
-				// targs resulting in fewer follow-on errors.
-				continue
-			}
-			if targ := arg.typ; isTyped(targ) {
-				// If we permit bidirectional unification, and targ is
-				// a generic function, we need to initialize u.y with
-				// the respective type parameters of targ.
-				if !u.unify(par.typ, targ) {
-					errorf("type", par.typ, targ, arg)
+		if isParameterized(tparams, par.typ) || isParameterized(tparams, arg.typ) {
+			// Function parameters are always typed. Arguments may be untyped.
+			// Collect the indices of untyped arguments and handle them later.
+			if isTyped(arg.typ) {
+				if !u.unify(par.typ, arg.typ, assign) {
+					errorf("type", par.typ, arg.typ, arg)
 					return nil
 				}
-			} else if _, ok := par.typ.(*TypeParam); ok {
+			} else if _, ok := par.typ.(*TypeParam); ok && !arg.isNil() {
 				// Since default types are all basic (i.e., non-composite) types, an
 				// untyped argument will never match a composite parameter type; the
 				// only parameter type it can possibly match against is a *TypeParam.
 				// Thus, for untyped arguments we only need to look at parameter types
 				// that are single type parameters.
-				indices = append(indices, i)
+				// Also, untyped nils don't have a default type and can be ignored.
+				untyped = append(untyped, i)
 			}
 		}
 	}
 
-	// If we've got all type arguments, we're done.
-	var index int
-	targs, index = u.x.types()
-	if index < 0 {
-		return targs
+	if traceInference {
+		inferred := u.inferred(tparams)
+		u.tracef("=> %s ➞ %s\n", tparams, inferred)
 	}
 
 	// --- 2 ---
-	// See how far we get with constraint type inference.
-	// Note that even if we don't have any type arguments, constraint type inference
-	// may produce results for constraints that explicitly specify a type.
-	if useConstraintTypeInference {
-		targs, index = check.inferB(pos, tparams, targs)
-		if targs == nil || index < 0 {
-			return targs
+	// use information from type parameter constraints
+
+	if traceInference {
+		u.tracef("== type parameters: %s", tparams)
+	}
+
+	// Unify type parameters with their constraints as long
+	// as progress is being made.
+	//
+	// This is an O(n^2) algorithm where n is the number of
+	// type parameters: if there is progress, at least one
+	// type argument is inferred per iteration, and we have
+	// a doubly nested loop.
+	//
+	// In practice this is not a problem because the number
+	// of type parameters tends to be very small (< 5 or so).
+	// (It should be possible for unification to efficiently
+	// signal newly inferred type arguments; then the loops
+	// here could handle the respective type parameters only,
+	// but that will come at a cost of extra complexity which
+	// may not be worth it.)
+	for i := 0; ; i++ {
+		nn := u.unknowns()
+		if traceInference {
+			if i > 0 {
+				fmt.Println()
+			}
+			u.tracef("-- iteration %d", i)
 		}
+
+		for _, tpar := range tparams {
+			tx := u.at(tpar)
+			core, single := coreTerm(tpar)
+			if traceInference {
+				u.tracef("-- type parameter %s = %s: core(%s) = %s, single = %v", tpar, tx, tpar, core, single)
+			}
+
+			// If there is a core term (i.e., a core type with tilde information)
+			// unify the type parameter with the core type.
+			if core != nil {
+				// A type parameter can be unified with its core type in two cases.
+				switch {
+				case tx != nil:
+					// The corresponding type argument tx is known. There are 2 cases:
+					// 1) If the core type has a tilde, per spec requirement for tilde
+					//    elements, the core type is an underlying (literal) type.
+					//    And because of the tilde, the underlying type of tx must match
+					//    against the core type.
+					//    But because unify automatically matches a defined type against
+					//    an underlying literal type, we can simply unify tx with the
+					//    core type.
+					// 2) If the core type doesn't have a tilde, we also must unify tx
+					//    with the core type.
+					if !u.unify(tx, core.typ, 0) {
+						// TODO(gri) Type parameters that appear in the constraint and
+						//           for which we have type arguments inferred should
+						//           use those type arguments for a better error message.
+						check.errorf(pos, CannotInferTypeArgs, "%s (type %s) does not satisfy %s", tpar, tx, tpar.Constraint())
+						return nil
+					}
+				case single && !core.tilde:
+					// The corresponding type argument tx is unknown and there's a single
+					// specific type and no tilde.
+					// In this case the type argument must be that single type; set it.
+					u.set(tpar, core.typ)
+				}
+			} else {
+				if tx != nil {
+					// We don't have a core type, but the type argument tx is known.
+					// It must have (at least) all the methods of the type constraint,
+					// and the method signatures must unify; otherwise tx cannot satisfy
+					// the constraint.
+					// TODO(gri) Now that unification handles interfaces, this code can
+					//           be reduced to calling u.unify(tx, tpar.iface(), assign)
+					//           (which will compare signatures exactly as we do below).
+					//           We leave it as is for now because missingMethod provides
+					//           a failure cause which allows for a better error message.
+					//           Eventually, unify should return an error with cause.
+					var cause string
+					constraint := tpar.iface()
+					if m, _ := check.missingMethod(tx, constraint, true, func(x, y Type) bool { return u.unify(x, y, exact) }, &cause); m != nil {
+						// TODO(gri) better error message (see TODO above)
+						check.errorf(pos, CannotInferTypeArgs, "%s (type %s) does not satisfy %s %s", tpar, tx, tpar.Constraint(), cause)
+						return nil
+					}
+				}
+			}
+		}
+
+		if u.unknowns() == nn {
+			break // no progress
+		}
+	}
+
+	if traceInference {
+		inferred := u.inferred(tparams)
+		u.tracef("=> %s ➞ %s\n", tparams, inferred)
 	}
 
 	// --- 3 ---
-	// Use any untyped arguments to infer additional type arguments.
-	// Some generic parameters with untyped arguments may have been given
-	// a type by now, we can ignore them.
-	for _, i := range indices {
-		tpar := params.At(i).typ.(*TypeParam) // is type parameter by construction of indices
-		// Only consider untyped arguments for which the corresponding type
-		// parameter doesn't have an inferred type yet.
-		if targs[tpar.index] == nil {
-			arg := args[i]
-			targ := Default(arg.typ)
-			// The default type for an untyped nil is untyped nil. We must not
-			// infer an untyped nil type as type parameter type. Ignore untyped
-			// nil by making sure all default argument types are typed.
-			if isTyped(targ) && !u.unify(tpar, targ) {
-				errorf("default type", tpar, targ, arg)
-				return nil
+	// use information from untyped constants
+
+	if traceInference {
+		u.tracef("== untyped arguments: %v", untyped)
+	}
+
+	// Some generic parameters with untyped arguments may have been given a type by now.
+	// Collect all remaining parameters that don't have a type yet and determine the
+	// maximum untyped type for each of those parameters, if possible.
+	var maxUntyped map[*TypeParam]Type // lazily allocated (we may not need it)
+	for _, index := range untyped {
+		tpar := params.At(index).typ.(*TypeParam) // is type parameter by construction of untyped
+		if u.at(tpar) == nil {
+			arg := args[index] // arg corresponding to tpar
+			if maxUntyped == nil {
+				maxUntyped = make(map[*TypeParam]Type)
+			}
+			max := maxUntyped[tpar]
+			if max == nil {
+				max = arg.typ
+			} else {
+				m := maxType(max, arg.typ)
+				if m == nil {
+					check.errorf(arg, CannotInferTypeArgs, "mismatched types %s and %s (cannot infer %s)", max, arg.typ, tpar)
+					return nil
+				}
+				max = m
+			}
+			maxUntyped[tpar] = max
+		}
+	}
+	// maxUntyped contains the maximum untyped type for each type parameter
+	// which doesn't have a type yet. Set the respective default types.
+	for tpar, typ := range maxUntyped {
+		d := Default(typ)
+		assert(isTyped(d))
+		u.set(tpar, d)
+	}
+
+	// --- simplify ---
+
+	// u.inferred(tparams) now contains the incoming type arguments plus any additional type
+	// arguments which were inferred. The inferred non-nil entries may still contain
+	// references to other type parameters found in constraints.
+	// For instance, for [A any, B interface{ []C }, C interface{ *A }], if A == int
+	// was given, unification produced the type list [int, []C, *A]. We eliminate the
+	// remaining type parameters by substituting the type parameters in this type list
+	// until nothing changes anymore.
+	inferred = u.inferred(tparams)
+	if debug {
+		for i, targ := range targs {
+			assert(targ == nil || inferred[i] == targ)
+		}
+	}
+
+	// The data structure of each (provided or inferred) type represents a graph, where
+	// each node corresponds to a type and each (directed) vertex points to a component
+	// type. The substitution process described above repeatedly replaces type parameter
+	// nodes in these graphs with the graphs of the types the type parameters stand for,
+	// which creates a new (possibly bigger) graph for each type.
+	// The substitution process will not stop if the replacement graph for a type parameter
+	// also contains that type parameter.
+	// For instance, for [A interface{ *A }], without any type argument provided for A,
+	// unification produces the type list [*A]. Substituting A in *A with the value for
+	// A will lead to infinite expansion by producing [**A], [****A], [********A], etc.,
+	// because the graph A -> *A has a cycle through A.
+	// Generally, cycles may occur across multiple type parameters and inferred types
+	// (for instance, consider [P interface{ *Q }, Q interface{ func(P) }]).
+	// We eliminate cycles by walking the graphs for all type parameters. If a cycle
+	// through a type parameter is detected, killCycles nils out the respective type
+	// (in the inferred list) which kills the cycle, and marks the corresponding type
+	// parameter as not inferred.
+	//
+	// TODO(gri) If useful, we could report the respective cycle as an error. We don't
+	//           do this now because type inference will fail anyway, and furthermore,
+	//           constraints with cycles of this kind cannot currently be satisfied by
+	//           any user-supplied type. But should that change, reporting an error
+	//           would be wrong.
+	killCycles(tparams, inferred)
+
+	// dirty tracks the indices of all types that may still contain type parameters.
+	// We know that nil type entries and entries corresponding to provided (non-nil)
+	// type arguments are clean, so exclude them from the start.
+	var dirty []int
+	for i, typ := range inferred {
+		if typ != nil && (i >= len(targs) || targs[i] == nil) {
+			dirty = append(dirty, i)
+		}
+	}
+
+	for len(dirty) > 0 {
+		if traceInference {
+			u.tracef("-- simplify %s ➞ %s", tparams, inferred)
+		}
+		// TODO(gri) Instead of creating a new substMap for each iteration,
+		// provide an update operation for substMaps and only change when
+		// needed. Optimization.
+		smap := makeSubstMap(tparams, inferred)
+		n := 0
+		for _, index := range dirty {
+			t0 := inferred[index]
+			if t1 := check.subst(nopos, t0, smap, nil, check.context()); t1 != t0 {
+				// t0 was simplified to t1.
+				// If t0 was a generic function, but the simplified signature t1 does
+				// not contain any type parameters anymore, the function is not generic
+				// anymore. Remove it's type parameters. (go.dev/issue/59953)
+				// Note that if t0 was a signature, t1 must be a signature, and t1
+				// can only be a generic signature if it originated from a generic
+				// function argument. Those signatures are never defined types and
+				// thus there is no need to call under below.
+				// TODO(gri) Consider doing this in Checker.subst.
+				//           Then this would fall out automatically here and also
+				//           in instantiation (where we also explicitly nil out
+				//           type parameters). See the *Signature TODO in subst.
+				if sig, _ := t1.(*Signature); sig != nil && sig.TypeParams().Len() > 0 && !isParameterized(tparams, sig) {
+					sig.tparams = nil
+				}
+				inferred[index] = t1
+				dirty[n] = index
+				n++
 			}
 		}
+		dirty = dirty[:n]
 	}
 
-	// If we've got all type arguments, we're done.
-	targs, index = u.x.types()
-	if index < 0 {
-		return targs
-	}
-
-	// --- 4 ---
-	// Again, follow up with constraint type inference.
-	if useConstraintTypeInference {
-		targs, index = check.inferB(pos, tparams, targs)
-		if targs == nil || index < 0 {
-			return targs
+	// Once nothing changes anymore, we may still have type parameters left;
+	// e.g., a constraint with core type *P may match a type parameter Q but
+	// we don't have any type arguments to fill in for *P or Q (go.dev/issue/45548).
+	// Don't let such inferences escape; instead treat them as unresolved.
+	for i, typ := range inferred {
+		if typ == nil || isParameterized(tparams, typ) {
+			obj := tparams[i].obj
+			check.errorf(pos, CannotInferTypeArgs, "cannot infer %s (%s)", obj.name, obj.pos)
+			return nil
 		}
 	}
 
-	// At least one type argument couldn't be inferred.
-	assert(targs != nil && index >= 0 && targs[index] == nil)
-	tpar := tparams[index]
-	check.errorf(pos, CannotInferTypeArgs, "cannot infer %s (%s)", tpar.obj.name, tpar.obj.pos)
-	return nil
+	return
 }
 
-// typeParamsString produces a string of the type parameter names
+// containsNil reports whether list contains a nil entry.
+func containsNil(list []Type) bool {
+	for _, t := range list {
+		if t == nil {
+			return true
+		}
+	}
+	return false
+}
+
+// renameTParams renames the type parameters in the given type such that each type
+// parameter is given a new identity. renameTParams returns the new type parameters
+// and updated type. If the result type is unchanged from the argument type, none
+// of the type parameters in tparams occurred in the type.
+// If typ is a generic function, type parameters held with typ are not changed and
+// must be updated separately if desired.
+// The positions is only used for debug traces.
+func (check *Checker) renameTParams(pos syntax.Pos, tparams []*TypeParam, typ Type) ([]*TypeParam, Type) {
+	// For the purpose of type inference we must differentiate type parameters
+	// occurring in explicit type or value function arguments from the type
+	// parameters we are solving for via unification because they may be the
+	// same in self-recursive calls:
+	//
+	//   func f[P constraint](x P) {
+	//           f(x)
+	//   }
+	//
+	// In this example, without type parameter renaming, the P used in the
+	// instantiation f[P] has the same pointer identity as the P we are trying
+	// to solve for through type inference. This causes problems for type
+	// unification. Because any such self-recursive call is equivalent to
+	// a mutually recursive call, type parameter renaming can be used to
+	// create separate, disentangled type parameters. The above example
+	// can be rewritten into the following equivalent code:
+	//
+	//   func f[P constraint](x P) {
+	//           f2(x)
+	//   }
+	//
+	//   func f2[P2 constraint](x P2) {
+	//           f(x)
+	//   }
+	//
+	// Type parameter renaming turns the first example into the second
+	// example by renaming the type parameter P into P2.
+	if len(tparams) == 0 {
+		return nil, typ // nothing to do
+	}
+
+	tparams2 := make([]*TypeParam, len(tparams))
+	for i, tparam := range tparams {
+		tname := NewTypeName(tparam.Obj().Pos(), tparam.Obj().Pkg(), tparam.Obj().Name(), nil)
+		tparams2[i] = NewTypeParam(tname, nil)
+		tparams2[i].index = tparam.index // == i
+	}
+
+	renameMap := makeRenameMap(tparams, tparams2)
+	for i, tparam := range tparams {
+		tparams2[i].bound = check.subst(pos, tparam.bound, renameMap, nil, check.context())
+	}
+
+	return tparams2, check.subst(pos, typ, renameMap, nil, check.context())
+}
+
+// typeParamsString produces a string containing all the type parameter names
 // in list suitable for human consumption.
 func typeParamsString(list []*TypeParam) string {
 	// common cases
@@ -344,17 +509,19 @@
 }
 
 // isParameterized reports whether typ contains any of the type parameters of tparams.
+// If typ is a generic function, isParameterized ignores the type parameter declarations;
+// it only considers the signature proper (incoming and result parameters).
 func isParameterized(tparams []*TypeParam, typ Type) bool {
 	w := tpWalker{
-		seen:    make(map[Type]bool),
 		tparams: tparams,
+		seen:    make(map[Type]bool),
 	}
 	return w.isParameterized(typ)
 }
 
 type tpWalker struct {
-	seen    map[Type]bool
 	tparams []*TypeParam
+	seen    map[Type]bool
 }
 
 func (w *tpWalker) isParameterized(typ Type) (res bool) {
@@ -368,8 +535,8 @@
 	}()
 
 	switch t := typ.(type) {
-	case nil, *Basic: // TODO(gri) should nil be handled here?
-		break
+	case *Basic:
+		// nothing to do
 
 	case *Array:
 		return w.isParameterized(t.elem)
@@ -378,32 +545,28 @@
 		return w.isParameterized(t.elem)
 
 	case *Struct:
-		for _, fld := range t.fields {
-			if w.isParameterized(fld.typ) {
-				return true
-			}
-		}
+		return w.varList(t.fields)
 
 	case *Pointer:
 		return w.isParameterized(t.base)
 
 	case *Tuple:
-		n := t.Len()
-		for i := 0; i < n; i++ {
-			if w.isParameterized(t.At(i).typ) {
-				return true
-			}
-		}
+		// This case does not occur from within isParameterized
+		// because tuples only appear in signatures where they
+		// are handled explicitly. But isParameterized is also
+		// called by Checker.callExpr with a function result tuple
+		// if instantiation failed (go.dev/issue/59890).
+		return t != nil && w.varList(t.vars)
 
 	case *Signature:
 		// t.tparams may not be nil if we are looking at a signature
 		// of a generic function type (or an interface method) that is
 		// part of the type we're testing. We don't care about these type
 		// parameters.
-		// Similarly, the receiver of a method may declare (rather then
+		// Similarly, the receiver of a method may declare (rather than
 		// use) type parameters, we don't care about those either.
 		// Thus, we only need to look at the input and result parameters.
-		return w.isParameterized(t.params) || w.isParameterized(t.results)
+		return t.params != nil && w.varList(t.params.vars) || t.results != nil && w.varList(t.results.vars)
 
 	case *Interface:
 		tset := t.typeSet()
@@ -423,229 +586,31 @@
 		return w.isParameterized(t.elem)
 
 	case *Named:
-		return w.isParameterizedTypeList(t.TypeArgs().list())
+		for _, t := range t.TypeArgs().list() {
+			if w.isParameterized(t) {
+				return true
+			}
+		}
 
 	case *TypeParam:
-		// t must be one of w.tparams
 		return tparamIndex(w.tparams, t) >= 0
 
 	default:
-		unreachable()
+		panic(fmt.Sprintf("unexpected %T", typ))
 	}
 
 	return false
 }
 
-func (w *tpWalker) isParameterizedTypeList(list []Type) bool {
-	for _, t := range list {
-		if w.isParameterized(t) {
+func (w *tpWalker) varList(list []*Var) bool {
+	for _, v := range list {
+		if w.isParameterized(v.typ) {
 			return true
 		}
 	}
 	return false
 }
 
-// inferB returns the list of actual type arguments inferred from the type parameters'
-// bounds and an initial set of type arguments. If type inference is impossible because
-// unification fails, an error is reported if report is set to true, the resulting types
-// list is nil, and index is 0.
-// Otherwise, types is the list of inferred type arguments, and index is the index of the
-// first type argument in that list that couldn't be inferred (and thus is nil). If all
-// type arguments were inferred successfully, index is < 0. The number of type arguments
-// provided may be less than the number of type parameters, but there must be at least one.
-func (check *Checker) inferB(pos syntax.Pos, tparams []*TypeParam, targs []Type) (types []Type, index int) {
-	assert(len(tparams) >= len(targs) && len(targs) > 0)
-
-	if traceInference {
-		check.dump("-- inferB %s ➞ %s", tparams, targs)
-		defer func() {
-			check.dump("=> inferB %s ➞ %s", tparams, types)
-		}()
-	}
-
-	// Setup bidirectional unification between constraints
-	// and the corresponding type arguments (which may be nil!).
-	u := newUnifier(false)
-	u.x.init(tparams)
-	u.y = u.x // type parameters between LHS and RHS of unification are identical
-
-	// Set the type arguments which we know already.
-	for i, targ := range targs {
-		if targ != nil {
-			u.x.set(i, targ)
-		}
-	}
-
-	// Repeatedly apply constraint type inference as long as
-	// there are still unknown type arguments and progress is
-	// being made.
-	//
-	// This is an O(n^2) algorithm where n is the number of
-	// type parameters: if there is progress (and iteration
-	// continues), at least one type argument is inferred
-	// per iteration and we have a doubly nested loop.
-	// In practice this is not a problem because the number
-	// of type parameters tends to be very small (< 5 or so).
-	// (It should be possible for unification to efficiently
-	// signal newly inferred type arguments; then the loops
-	// here could handle the respective type parameters only,
-	// but that will come at a cost of extra complexity which
-	// may not be worth it.)
-	for n := u.x.unknowns(); n > 0; {
-		nn := n
-
-		for i, tpar := range tparams {
-			// If there is a core term (i.e., a core type with tilde information)
-			// unify the type parameter with the core type.
-			if core, single := coreTerm(tpar); core != nil {
-				// A type parameter can be unified with its core type in two cases.
-				tx := u.x.at(i)
-				switch {
-				case tx != nil:
-					// The corresponding type argument tx is known.
-					// In this case, if the core type has a tilde, the type argument's underlying
-					// type must match the core type, otherwise the type argument and the core type
-					// must match.
-					// If tx is an external type parameter, don't consider its underlying type
-					// (which is an interface). Core type unification will attempt to unify against
-					// core.typ.
-					// Note also that even with inexact unification we cannot leave away the under
-					// call here because it's possible that both tx and core.typ are named types,
-					// with under(tx) being a (named) basic type matching core.typ. Such cases do
-					// not match with inexact unification.
-					if core.tilde && !isTypeParam(tx) {
-						tx = under(tx)
-					}
-					if !u.unify(tx, core.typ) {
-						// TODO(gri) improve error message by providing the type arguments
-						//           which we know already
-						// Don't use term.String() as it always qualifies types, even if they
-						// are in the current package.
-						tilde := ""
-						if core.tilde {
-							tilde = "~"
-						}
-						check.errorf(pos, InvalidTypeArg, "%s does not match %s%s", tx, tilde, core.typ)
-						return nil, 0
-					}
-
-				case single && !core.tilde:
-					// The corresponding type argument tx is unknown and there's a single
-					// specific type and no tilde.
-					// In this case the type argument must be that single type; set it.
-					u.x.set(i, core.typ)
-
-				default:
-					// Unification is not possible and no progress was made.
-					continue
-				}
-
-				// The number of known type arguments may have changed.
-				nn = u.x.unknowns()
-				if nn == 0 {
-					break // all type arguments are known
-				}
-			}
-		}
-
-		assert(nn <= n)
-		if nn == n {
-			break // no progress
-		}
-		n = nn
-	}
-
-	// u.x.types() now contains the incoming type arguments plus any additional type
-	// arguments which were inferred from core terms. The newly inferred non-nil
-	// entries may still contain references to other type parameters.
-	// For instance, for [A any, B interface{ []C }, C interface{ *A }], if A == int
-	// was given, unification produced the type list [int, []C, *A]. We eliminate the
-	// remaining type parameters by substituting the type parameters in this type list
-	// until nothing changes anymore.
-	types, _ = u.x.types()
-	if debug {
-		for i, targ := range targs {
-			assert(targ == nil || types[i] == targ)
-		}
-	}
-
-	// The data structure of each (provided or inferred) type represents a graph, where
-	// each node corresponds to a type and each (directed) vertice points to a component
-	// type. The substitution process described above repeatedly replaces type parameter
-	// nodes in these graphs with the graphs of the types the type parameters stand for,
-	// which creates a new (possibly bigger) graph for each type.
-	// The substitution process will not stop if the replacement graph for a type parameter
-	// also contains that type parameter.
-	// For instance, for [A interface{ *A }], without any type argument provided for A,
-	// unification produces the type list [*A]. Substituting A in *A with the value for
-	// A will lead to infinite expansion by producing [**A], [****A], [********A], etc.,
-	// because the graph A -> *A has a cycle through A.
-	// Generally, cycles may occur across multiple type parameters and inferred types
-	// (for instance, consider [P interface{ *Q }, Q interface{ func(P) }]).
-	// We eliminate cycles by walking the graphs for all type parameters. If a cycle
-	// through a type parameter is detected, cycleFinder nils out the respectice type
-	// which kills the cycle; this also means that the respective type could not be
-	// inferred.
-	//
-	// TODO(gri) If useful, we could report the respective cycle as an error. We don't
-	//           do this now because type inference will fail anyway, and furthermore,
-	//           constraints with cycles of this kind cannot currently be satisfied by
-	//           any user-suplied type. But should that change, reporting an error
-	//           would be wrong.
-	w := cycleFinder{tparams, types, make(map[Type]bool)}
-	for _, t := range tparams {
-		w.typ(t) // t != nil
-	}
-
-	// dirty tracks the indices of all types that may still contain type parameters.
-	// We know that nil type entries and entries corresponding to provided (non-nil)
-	// type arguments are clean, so exclude them from the start.
-	var dirty []int
-	for i, typ := range types {
-		if typ != nil && (i >= len(targs) || targs[i] == nil) {
-			dirty = append(dirty, i)
-		}
-	}
-
-	for len(dirty) > 0 {
-		// TODO(gri) Instead of creating a new substMap for each iteration,
-		// provide an update operation for substMaps and only change when
-		// needed. Optimization.
-		smap := makeSubstMap(tparams, types)
-		n := 0
-		for _, index := range dirty {
-			t0 := types[index]
-			if t1 := check.subst(nopos, t0, smap, nil, check.context()); t1 != t0 {
-				types[index] = t1
-				dirty[n] = index
-				n++
-			}
-		}
-		dirty = dirty[:n]
-	}
-
-	// Once nothing changes anymore, we may still have type parameters left;
-	// e.g., a constraint with core type *P may match a type parameter Q but
-	// we don't have any type arguments to fill in for *P or Q (issue #45548).
-	// Don't let such inferences escape, instead nil them out.
-	for i, typ := range types {
-		if typ != nil && isParameterized(tparams, typ) {
-			types[i] = nil
-		}
-	}
-
-	// update index
-	index = -1
-	for i, typ := range types {
-		if typ == nil {
-			index = i
-			break
-		}
-	}
-
-	return
-}
-
 // If the type parameter has a single specific type S, coreTerm returns (S, true).
 // Otherwise, if tpar has a core type T, it returns a term corresponding to that
 // core type and false. In that case, if any term of tpar has a tilde, the core
@@ -682,21 +647,35 @@
 	return nil, false
 }
 
+// killCycles walks through the given type parameters and looks for cycles
+// created by type parameters whose inferred types refer back to that type
+// parameter, either directly or indirectly. If such a cycle is detected,
+// it is killed by setting the corresponding inferred type to nil.
+//
+// TODO(gri) Determine if we can simply abort inference as soon as we have
+// found a single cycle.
+func killCycles(tparams []*TypeParam, inferred []Type) {
+	w := cycleFinder{tparams, inferred, make(map[Type]bool)}
+	for _, t := range tparams {
+		w.typ(t) // t != nil
+	}
+}
+
 type cycleFinder struct {
-	tparams []*TypeParam
-	types   []Type
-	seen    map[Type]bool
+	tparams  []*TypeParam
+	inferred []Type
+	seen     map[Type]bool
 }
 
 func (w *cycleFinder) typ(typ Type) {
 	if w.seen[typ] {
 		// We have seen typ before. If it is one of the type parameters
-		// in tparams, iterative substitution will lead to infinite expansion.
+		// in w.tparams, iterative substitution will lead to infinite expansion.
 		// Nil out the corresponding type which effectively kills the cycle.
 		if tpar, _ := typ.(*TypeParam); tpar != nil {
 			if i := tparamIndex(w.tparams, tpar); i >= 0 {
 				// cycle through tpar
-				w.types[i] = nil
+				w.inferred[i] = nil
 			}
 		}
 		// If we don't have one of our type parameters, the cycle is due
@@ -760,8 +739,8 @@
 		}
 
 	case *TypeParam:
-		if i := tparamIndex(w.tparams, t); i >= 0 && w.types[i] != nil {
-			w.typ(w.types[i])
+		if i := tparamIndex(w.tparams, t); i >= 0 && w.inferred[i] != nil {
+			w.typ(w.inferred[i])
 		}
 
 	default:
@@ -774,3 +753,14 @@
 		w.typ(v.typ)
 	}
 }
+
+// If tpar is a type parameter in list, tparamIndex returns the index
+// of the type parameter in list. Otherwise the result is < 0.
+func tparamIndex(list []*TypeParam, tpar *TypeParam) int {
+	for i, p := range list {
+		if p == tpar {
+			return i
+		}
+	}
+	return -1
+}
diff --git a/src/cmd/compile/internal/types2/instantiate.go b/src/cmd/compile/internal/types2/instantiate.go
index 8193682..6024035 100644
--- a/src/cmd/compile/internal/types2/instantiate.go
+++ b/src/cmd/compile/internal/types2/instantiate.go
@@ -168,7 +168,7 @@
 func (check *Checker) verify(pos syntax.Pos, tparams []*TypeParam, targs []Type, ctxt *Context) (int, error) {
 	smap := makeSubstMap(tparams, targs)
 	for i, tpar := range tparams {
-		// Ensure that we have a (possibly implicit) interface as type bound (issue #51048).
+		// Ensure that we have a (possibly implicit) interface as type bound (go.dev/issue/51048).
 		tpar.iface()
 		// The type parameter bound is parameterized with the same type parameters
 		// as the instantiated type; before we can use it for bounds checking we
@@ -176,7 +176,7 @@
 		// the parameterized type.
 		bound := check.subst(pos, tpar.bound, smap, nil, ctxt)
 		var cause string
-		if !check.implements(targs[i], bound, true, &cause) {
+		if !check.implements(pos, targs[i], bound, true, &cause) {
 			return i, errors.New(cause)
 		}
 	}
@@ -189,14 +189,14 @@
 //
 // If the provided cause is non-nil, it may be set to an error string
 // explaining why V does not implement (or satisfy, for constraints) T.
-func (check *Checker) implements(V, T Type, constraint bool, cause *string) bool {
+func (check *Checker) implements(pos syntax.Pos, V, T Type, constraint bool, cause *string) bool {
 	Vu := under(V)
 	Tu := under(T)
 	if Vu == Typ[Invalid] || Tu == Typ[Invalid] {
 		return true // avoid follow-on errors
 	}
 	if p, _ := Vu.(*Pointer); p != nil && under(p.base) == Typ[Invalid] {
-		return true // avoid follow-on errors (see issue #49541 for an example)
+		return true // avoid follow-on errors (see go.dev/issue/49541 for an example)
 	}
 
 	verb := "implement"
@@ -241,9 +241,9 @@
 	}
 
 	// V must implement T's methods, if any.
-	if m, wrong := check.missingMethod(V, Ti, true); m != nil /* !Implements(V, Ti) */ {
+	if m, _ := check.missingMethod(V, T, true, Identical, cause); m != nil /* !Implements(V, T) */ {
 		if cause != nil {
-			*cause = check.sprintf("%s does not %s %s %s", V, verb, T, check.missingMethodCause(V, T, m, wrong))
+			*cause = check.sprintf("%s does not %s %s %s", V, verb, T, *cause)
 		}
 		return false
 	}
@@ -258,20 +258,11 @@
 		if comparable(V, false /* strict comparability */, nil, nil) {
 			return true
 		}
-		// If check.conf.OldComparableSemantics is set (by the compiler or
-		// a test), we only consider strict comparability and we're done.
-		// TODO(gri) remove this check for Go 1.21
-		if check != nil && check.conf.OldComparableSemantics {
-			if cause != nil {
-				*cause = check.sprintf("%s does not %s comparable", V, verb)
-			}
-			return false
-		}
 		// For constraint satisfaction, use dynamic (spec) comparability
 		// so that ordinary, non-type parameter interfaces implement comparable.
 		if constraint && comparable(V, true /* spec comparability */, nil, nil) {
 			// V is comparable if we are at Go 1.20 or higher.
-			if check == nil || check.allowVersion(check.pkg, 1, 20) {
+			if check == nil || check.allowVersion(check.pkg, atPos(pos), go1_20) { // atPos needed so that go/types generate passes
 				return true
 			}
 			if cause != nil {
diff --git a/src/cmd/compile/internal/types2/instantiate_test.go b/src/cmd/compile/internal/types2/instantiate_test.go
index 33a34d7..af772b9 100644
--- a/src/cmd/compile/internal/types2/instantiate_test.go
+++ b/src/cmd/compile/internal/types2/instantiate_test.go
@@ -107,7 +107,7 @@
 	}
 
 	for _, test := range tests {
-		pkg := mustTypecheck(".", test.src, nil)
+		pkg := mustTypecheck(test.src, nil, nil)
 
 		t.Run(pkg.Name(), func(t *testing.T) {
 			ctxt := NewContext()
@@ -133,8 +133,8 @@
 
 func TestInstantiateNonEquality(t *testing.T) {
 	const src = "package p; type T[P any] int"
-	pkg1 := mustTypecheck(".", src, nil)
-	pkg2 := mustTypecheck(".", src, nil)
+	pkg1 := mustTypecheck(src, nil, nil)
+	pkg2 := mustTypecheck(src, nil, nil)
 	// We consider T1 and T2 to be distinct types, so their instances should not
 	// be deduplicated by the context.
 	T1 := pkg1.Scope().Lookup("T").Type().(*Named)
@@ -179,7 +179,7 @@
 
 	for _, test := range tests {
 		src := prefix + test.decl
-		pkg := mustTypecheck(".", src, nil)
+		pkg := mustTypecheck(src, nil, nil)
 		typ := NewPointer(pkg.Scope().Lookup("X").Type())
 		obj, _, _ := LookupFieldOrMethod(typ, false, pkg, "m")
 		m, _ := obj.(*Func)
@@ -201,7 +201,7 @@
 
 var _ T[int]
 `
-	pkg := mustTypecheck(".", src, nil)
+	pkg := mustTypecheck(src, nil, nil)
 	typ := pkg.Scope().Lookup("T").Type().(*Named)
 	obj, _, _ := LookupFieldOrMethod(typ, false, pkg, "m")
 	if obj == nil {
diff --git a/src/cmd/compile/internal/types2/interface.go b/src/cmd/compile/internal/types2/interface.go
index 0978989..872a321 100644
--- a/src/cmd/compile/internal/types2/interface.go
+++ b/src/cmd/compile/internal/types2/interface.go
@@ -127,7 +127,7 @@
 
 	for _, f := range iface.MethodList {
 		if f.Name == nil {
-			addEmbedded(posFor(f.Type), parseUnion(check, f.Type))
+			addEmbedded(atPos(f.Type), parseUnion(check, f.Type))
 			continue
 		}
 		// f.Name != nil
diff --git a/src/cmd/compile/internal/types2/issues_test.go b/src/cmd/compile/internal/types2/issues_test.go
index 5278420..3ac3457 100644
--- a/src/cmd/compile/internal/types2/issues_test.go
+++ b/src/cmd/compile/internal/types2/issues_test.go
@@ -19,9 +19,7 @@
 )
 
 func TestIssue5770(t *testing.T) {
-	f := mustParse("", `package p; type S struct{T}`)
-	var conf Config
-	_, err := conf.Check(f.PkgName.Value, []*syntax.File{f}, nil) // do not crash
+	_, err := typecheck(`package p; type S struct{T}`, nil, nil)
 	const want = "undefined: T"
 	if err == nil || !strings.Contains(err.Error(), want) {
 		t.Errorf("got: %v; want: %s", err, want)
@@ -41,7 +39,7 @@
 	_ = (interface{})(nil)
 )`
 	types := make(map[syntax.Expr]TypeAndValue)
-	mustTypecheck("p", src, &Info{Types: types})
+	mustTypecheck(src, nil, &Info{Types: types})
 
 	for x, tv := range types {
 		var want Type
@@ -80,7 +78,7 @@
 }
 `
 	types := make(map[syntax.Expr]TypeAndValue)
-	mustTypecheck("p", src, &Info{Types: types})
+	mustTypecheck(src, nil, &Info{Types: types})
 
 	want := Typ[Int]
 	n := 0
@@ -104,7 +102,7 @@
 func (T) m() (res bool) { return }
 type T struct{} // receiver type after method declaration
 `
-	f := mustParse("", src)
+	f := mustParse(src)
 
 	var conf Config
 	defs := make(map[*syntax.Name]Object)
@@ -135,8 +133,6 @@
         _, _, _ = x, y, z  // uses x, y, z
 }
 `
-	f := mustParse("", src)
-
 	const want = `L3 defs func p._()
 L4 defs const w untyped int
 L5 defs var x int
@@ -152,8 +148,8 @@
 	conf := Config{Error: func(err error) { t.Log(err) }}
 	defs := make(map[*syntax.Name]Object)
 	uses := make(map[*syntax.Name]Object)
-	_, err := conf.Check(f.PkgName.Value, []*syntax.File{f}, &Info{Defs: defs, Uses: uses})
-	if s := fmt.Sprint(err); !strings.HasSuffix(s, "cannot assign to w") {
+	_, err := typecheck(src, &conf, &Info{Defs: defs, Uses: uses})
+	if s := err.Error(); !strings.HasSuffix(s, "cannot assign to w") {
 		t.Errorf("Check: unexpected error: %s", s)
 	}
 
@@ -231,13 +227,8 @@
 }
 `
 	f := func(test, src string) {
-		f := mustParse("", src)
-		conf := Config{Importer: defaultImporter()}
-		info := Info{Uses: make(map[*syntax.Name]Object)}
-		_, err := conf.Check("main", []*syntax.File{f}, &info)
-		if err != nil {
-			t.Fatal(err)
-		}
+		info := &Info{Uses: make(map[*syntax.Name]Object)}
+		mustTypecheck(src, nil, info)
 
 		var pkg *Package
 		count := 0
@@ -261,17 +252,17 @@
 }
 
 func TestIssue22525(t *testing.T) {
-	f := mustParse("", `package p; func f() { var a, b, c, d, e int }`)
+	const src = `package p; func f() { var a, b, c, d, e int }`
 
 	got := "\n"
 	conf := Config{Error: func(err error) { got += err.Error() + "\n" }}
-	conf.Check(f.PkgName.Value, []*syntax.File{f}, nil) // do not crash
+	typecheck(src, &conf, nil) // do not crash
 	want := `
-:1:27: a declared and not used
-:1:30: b declared and not used
-:1:33: c declared and not used
-:1:36: d declared and not used
-:1:39: e declared and not used
+p:1:27: a declared and not used
+p:1:30: b declared and not used
+p:1:33: c declared and not used
+p:1:36: d declared and not used
+p:1:39: e declared and not used
 `
 	if got != want {
 		t.Errorf("got: %swant: %s", got, want)
@@ -291,7 +282,7 @@
 		`struct { *I }`,
 		`struct { a int; b Missing; *Missing }`,
 	} {
-		f := mustParse("", prefix+src)
+		f := mustParse(prefix + src)
 
 		conf := Config{Importer: defaultImporter(), Error: func(err error) {}}
 		info := &Info{Types: make(map[syntax.Expr]TypeAndValue)}
@@ -302,7 +293,7 @@
 			}
 		}
 
-		syntax.Crawl(f, func(n syntax.Node) bool {
+		syntax.Inspect(f, func(n syntax.Node) bool {
 			if decl, _ := n.(*syntax.TypeDecl); decl != nil {
 				if tv, ok := info.Types[decl.Type]; ok && decl.Name.Value == "T" {
 					want := strings.Count(src, ";") + 1
@@ -311,7 +302,7 @@
 					}
 				}
 			}
-			return false
+			return true
 		})
 	}
 }
@@ -328,7 +319,7 @@
 	// compute original file ASTs
 	var orig [len(sources)]*syntax.File
 	for i, src := range sources {
-		orig[i] = mustParse("", src)
+		orig[i] = mustParse(src)
 	}
 
 	// run the test for all order permutations of the incoming files
@@ -403,8 +394,8 @@
 }
 
 func TestIssue29029(t *testing.T) {
-	f1 := mustParse("", `package p; type A interface { M() }`)
-	f2 := mustParse("", `package p; var B interface { A }`)
+	f1 := mustParse(`package p; type A interface { M() }`)
+	f2 := mustParse(`package p; var B interface { A }`)
 
 	// printInfo prints the *Func definitions recorded in info, one *Func per line.
 	printInfo := func(info *Info) string {
@@ -450,14 +441,10 @@
 	const asrc = `package a; type I interface{ M() }; type T struct { F interface { I } }`
 	const bsrc = `package b; import "a"; type T struct { F interface { a.I } }; var _ = a.T(T{})`
 
-	a := mustTypecheck("a", asrc, nil)
+	a := mustTypecheck(asrc, nil, nil)
 
-	bast := mustParse("", bsrc)
 	conf := Config{Importer: importHelper{pkg: a}}
-	b, err := conf.Check(bast.PkgName.Value, []*syntax.File{bast}, nil)
-	if err != nil {
-		t.Errorf("package %s failed to typecheck: %v", b.Name(), err)
-	}
+	mustTypecheck(bsrc, &conf, nil)
 }
 
 type importHelper struct {
@@ -495,13 +482,8 @@
 
 	var pkg *Package
 	for _, src := range sources {
-		f := mustParse("", src)
 		conf := Config{Importer: importHelper{pkg: pkg}}
-		res, err := conf.Check(f.PkgName.Value, []*syntax.File{f}, nil)
-		if err != nil {
-			t.Errorf("%q failed to typecheck: %v", src, err)
-		}
-		pkg = res // res is imported by the next package in this test
+		pkg = mustTypecheck(src, &conf, nil) // pkg imported by the next package in this test
 	}
 }
 
@@ -515,14 +497,14 @@
 	//                 _ T2
 	//         }
 	// }
-	n1 := NewTypeName(syntax.Pos{}, nil, "T1", nil)
+	n1 := NewTypeName(nopos, nil, "T1", nil)
 	T1 := NewNamed(n1, nil, nil)
-	n2 := NewTypeName(syntax.Pos{}, nil, "T2", nil)
+	n2 := NewTypeName(nopos, nil, "T2", nil)
 	T2 := NewNamed(n2, nil, nil)
-	s1 := NewStruct([]*Var{NewField(syntax.Pos{}, nil, "_", T2, false)}, nil)
+	s1 := NewStruct([]*Var{NewField(nopos, nil, "_", T2, false)}, nil)
 	T1.SetUnderlying(s1)
-	s2 := NewStruct([]*Var{NewField(syntax.Pos{}, nil, "_", T2, false)}, nil)
-	s3 := NewStruct([]*Var{NewField(syntax.Pos{}, nil, "_", s2, false)}, nil)
+	s2 := NewStruct([]*Var{NewField(nopos, nil, "_", T2, false)}, nil)
+	s3 := NewStruct([]*Var{NewField(nopos, nil, "_", s2, false)}, nil)
 	T2.SetUnderlying(s3)
 
 	// These calls must terminate (no endless recursion).
@@ -553,40 +535,69 @@
 }
 
 func TestIssue43124(t *testing.T) {
-	testenv.MustHaveGoBuild(t)
+	// TODO(rFindley) move this to testdata by enhancing support for importing.
+
+	testenv.MustHaveGoBuild(t) // The go command is needed for the importer to determine the locations of stdlib .a files.
 
 	// All involved packages have the same name (template). Error messages should
 	// disambiguate between text/template and html/template by printing the full
 	// path.
 	const (
 		asrc = `package a; import "text/template"; func F(template.Template) {}; func G(int) {}`
-		bsrc = `package b; import ("a"; "html/template"); func _() { a.F(template.Template{}) }`
-		csrc = `package c; import ("a"; "html/template"); func _() { a.G(template.Template{}) }`
-	)
+		bsrc = `
+package b
 
-	a := mustTypecheck("a", asrc, nil)
-	conf := Config{Importer: importHelper{pkg: a, fallback: defaultImporter()}}
+import (
+	"a"
+	"html/template"
+)
 
+func _() {
 	// Packages should be fully qualified when there is ambiguity within the
 	// error string itself.
-	bast := mustParse("", bsrc)
-	_, err := conf.Check(bast.PkgName.Value, []*syntax.File{bast}, nil)
-	if err == nil {
-		t.Fatal("package b had no errors")
-	}
-	if !strings.Contains(err.Error(), "text/template") || !strings.Contains(err.Error(), "html/template") {
-		t.Errorf("type checking error for b does not disambiguate package template: %q", err)
+	a.F(template /* ERRORx "cannot use.*html/template.* as .*text/template" */ .Template{})
+}
+`
+		csrc = `
+package c
+
+import (
+	"a"
+	"fmt"
+	"html/template"
+)
+
+// go.dev/issue/46905: make sure template is not the first package qualified.
+var _ fmt.Stringer = 1 // ERRORx "cannot use 1.*as fmt\\.Stringer"
+
+// Packages should be fully qualified when there is ambiguity in reachable
+// packages. In this case both a (and for that matter html/template) import
+// text/template.
+func _() { a.G(template /* ERRORx "cannot use .*html/template.*Template" */ .Template{}) }
+`
+
+		tsrc = `
+package template
+
+import "text/template"
+
+type T int
+
+// Verify that the current package name also causes disambiguation.
+var _ T = template /* ERRORx "cannot use.*text/template.* as T value" */.Template{}
+`
+	)
+
+	a := mustTypecheck(asrc, nil, nil)
+	imp := importHelper{pkg: a, fallback: defaultImporter()}
+
+	withImporter := func(cfg *Config) {
+		cfg.Importer = imp
 	}
 
-	// ...and also when there is any ambiguity in reachable packages.
-	cast := mustParse("", csrc)
-	_, err = conf.Check(cast.PkgName.Value, []*syntax.File{cast}, nil)
-	if err == nil {
-		t.Fatal("package c had no errors")
-	}
-	if !strings.Contains(err.Error(), "html/template") {
-		t.Errorf("type checking error for c does not disambiguate package template: %q", err)
-	}
+	testFiles(t, []string{"b.go"}, [][]byte{[]byte(bsrc)}, 0, false, withImporter)
+	testFiles(t, []string{"c.go"}, [][]byte{[]byte(csrc)}, 0, false, withImporter)
+	testFiles(t, []string{"t.go"}, [][]byte{[]byte(tsrc)}, 0, false, withImporter)
 }
 
 func TestIssue50646(t *testing.T) {
@@ -678,7 +689,7 @@
 	for _, test := range tests {
 		src := fmt.Sprintf("package p; func _[P %s]() { _ = P(%s) }", test.typ, test.val)
 		types := make(map[syntax.Expr]TypeAndValue)
-		mustTypecheck("p", src, &Info{Types: types})
+		mustTypecheck(src, nil, &Info{Types: types})
 
 		var n int
 		for x, tv := range types {
@@ -808,8 +819,8 @@
 
 	test := func(main, b, want string) {
 		re := regexp.MustCompile(want)
-		bpkg := mustTypecheck("b", b, nil)
-		mast := mustParse("main.go", main)
+		bpkg := mustTypecheck(b, nil, nil)
+		mast := mustParse(main)
 		conf := Config{Importer: importHelper{pkg: bpkg}}
 		_, err := conf.Check(mast.PkgName.Value, []*syntax.File{mast}, nil)
 		if err == nil {
@@ -824,3 +835,132 @@
 		test(t.main, t.b, t.want)
 	}
 }
+
+func TestIssue59944(t *testing.T) {
+	testenv.MustHaveCGO(t)
+
+	// The typechecker should resolve methods declared on aliases of cgo types.
+	const src = `
+package p
+
+/*
+struct layout {
+	int field;
+};
+*/
+import "C"
+
+type Layout = C.struct_layout
+
+func (l *Layout) Binding() {}
+
+func _() {
+	_ = (*Layout).Binding
+}
+`
+
+	// code generated by cmd/cgo for the above source.
+	const cgoTypes = `
+// Code generated by cmd/cgo; DO NOT EDIT.
+
+package p
+
+import "unsafe"
+
+import "syscall"
+
+import _cgopackage "runtime/cgo"
+
+type _ _cgopackage.Incomplete
+var _ syscall.Errno
+func _Cgo_ptr(ptr unsafe.Pointer) unsafe.Pointer { return ptr }
+
+//go:linkname _Cgo_always_false runtime.cgoAlwaysFalse
+var _Cgo_always_false bool
+//go:linkname _Cgo_use runtime.cgoUse
+func _Cgo_use(interface{})
+type _Ctype_int int32
+
+type _Ctype_struct_layout struct {
+	field _Ctype_int
+}
+
+type _Ctype_void [0]byte
+
+//go:linkname _cgo_runtime_cgocall runtime.cgocall
+func _cgo_runtime_cgocall(unsafe.Pointer, uintptr) int32
+
+//go:linkname _cgoCheckPointer runtime.cgoCheckPointer
+func _cgoCheckPointer(interface{}, interface{})
+
+//go:linkname _cgoCheckResult runtime.cgoCheckResult
+func _cgoCheckResult(interface{})
+`
+	testFiles(t, []string{"p.go", "_cgo_gotypes.go"}, [][]byte{[]byte(src), []byte(cgoTypes)}, 0, false, func(cfg *Config) {
+		*boolFieldAddr(cfg, "go115UsesCgo") = true
+	})
+}
+
+func TestIssue61931(t *testing.T) {
+	const src = `
+package p
+
+func A(func(any), ...any) {}
+func B[T any](T)          {}
+
+func _() {
+	A(B, nil // syntax error: missing ',' before newline in argument list
+}
+`
+	f, err := syntax.Parse(syntax.NewFileBase(pkgName(src)), strings.NewReader(src), func(error) {}, nil, 0)
+	if err == nil {
+		t.Fatal("expected syntax error")
+	}
+
+	var conf Config
+	conf.Check(f.PkgName.Value, []*syntax.File{f}, nil) // must not panic
+}
+
+func TestIssue63260(t *testing.T) {
+	const src = `
+package p
+
+func _() {
+        use(f[*string])
+}
+
+func use(func()) {}
+
+func f[I *T, T any]() {
+        var v T
+        _ = v
+}`
+
+	info := Info{
+		Defs: make(map[*syntax.Name]Object),
+	}
+	pkg := mustTypecheck(src, nil, &info)
+
+	// get type parameter T in signature of f
+	T := pkg.Scope().Lookup("f").Type().(*Signature).TypeParams().At(1)
+	if T.Obj().Name() != "T" {
+		t.Fatalf("got type parameter %s, want T", T)
+	}
+
+	// get type of variable v in body of f
+	var v Object
+	for name, obj := range info.Defs {
+		if name.Value == "v" {
+			v = obj
+			break
+		}
+	}
+	if v == nil {
+		t.Fatal("variable v not found")
+	}
+
+	// type of v and T must be pointer-identical
+	if v.Type() != T {
+		t.Fatalf("types of v and T are not pointer-identical: %p != %p", v.Type().(*TypeParam), T)
+	}
+}
diff --git a/src/cmd/compile/internal/types2/lookup.go b/src/cmd/compile/internal/types2/lookup.go
index f66f2ef..b7370ca 100644
--- a/src/cmd/compile/internal/types2/lookup.go
+++ b/src/cmd/compile/internal/types2/lookup.go
@@ -8,6 +8,7 @@
 
 import (
 	"bytes"
+	"cmd/compile/internal/syntax"
 	"strings"
 )
 
@@ -52,10 +53,10 @@
 	// 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).
+	// not have found it for T (see also go.dev/issue/8590).
 	if t, _ := T.(*Named); t != nil {
 		if p, _ := t.Underlying().(*Pointer); p != nil {
-			obj, index, indirect = lookupFieldOrMethod(p, false, pkg, name, false)
+			obj, index, indirect = lookupFieldOrMethodImpl(p, false, pkg, name, false)
 			if _, ok := obj.(*Func); ok {
 				return nil, nil, false
 			}
@@ -63,16 +64,16 @@
 		}
 	}
 
-	obj, index, indirect = lookupFieldOrMethod(T, addressable, pkg, name, false)
+	obj, index, indirect = lookupFieldOrMethodImpl(T, addressable, pkg, name, false)
 
 	// If we didn't find anything and if we have a type parameter with a core type,
 	// see if there is a matching field (but not a method, those need to be declared
 	// explicitly in the constraint). If the constraint is a named pointer type (see
 	// above), we are ok here because only fields are accepted as results.
-	const enableTParamFieldLookup = false // see issue #51576
+	const enableTParamFieldLookup = false // see go.dev/issue/51576
 	if enableTParamFieldLookup && obj == nil && isTypeParam(T) {
 		if t := coreType(T); t != nil {
-			obj, index, indirect = lookupFieldOrMethod(t, addressable, pkg, name, false)
+			obj, index, indirect = lookupFieldOrMethodImpl(t, addressable, pkg, name, false)
 			if _, ok := obj.(*Var); !ok {
 				obj, index, indirect = nil, nil, false // accept fields (variables) only
 			}
@@ -81,18 +82,33 @@
 	return
 }
 
-// lookupFieldOrMethod should only be called by LookupFieldOrMethod and missingMethod.
-// If foldCase is true, the lookup for methods will include looking for any method
-// which case-folds to the same as 'name' (used for giving helpful error messages).
+// lookupFieldOrMethodImpl is the implementation of LookupFieldOrMethod.
+// Notably, in contrast to LookupFieldOrMethod, it won't find struct fields
+// in base types of defined (*Named) pointer types T. For instance, given
+// the declaration:
+//
+//	type T *struct{f int}
+//
+// lookupFieldOrMethodImpl won't find the field f in the defined (*Named) type T
+// (methods on T are not permitted in the first place).
+//
+// Thus, lookupFieldOrMethodImpl should only be called by LookupFieldOrMethod
+// and missingMethod (the latter doesn't care about struct fields).
+//
+// If foldCase is true, method names are considered equal if they are equal
+// with case folding.
 //
 // The resulting object may not be fully type-checked.
-func lookupFieldOrMethod(T Type, addressable bool, pkg *Package, name string, foldCase bool) (obj Object, index []int, indirect bool) {
+func lookupFieldOrMethodImpl(T Type, addressable bool, pkg *Package, name string, foldCase bool) (obj Object, index []int, indirect bool) {
 	// WARNING: The code in this function is extremely subtle - do not modify casually!
 
 	if name == "_" {
 		return // blank fields/methods are never found
 	}
 
+	// Importantly, we must not call under before the call to deref below (nor
+	// does deref call under), as doing so could incorrectly result in finding
+	// methods of the pointer base type when T is a (*Named) pointer type.
 	typ, isPtr := deref(T)
 
 	// *typ where typ is an interface (incl. a type parameter) has no methods.
@@ -297,7 +313,7 @@
 
 // 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.
+// just has the wrong type: either a pointer receiver or wrong signature.
 //
 // 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
@@ -305,122 +321,144 @@
 // 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) {
-	m, alt := (*Checker)(nil).missingMethod(V, T, static)
-	// Only report a wrong type if the alternative method has the same name as m.
-	return m, alt != nil && alt.name == m.name // alt != nil implies m != nil
+	return (*Checker)(nil).missingMethod(V, T, static, Identical, nil)
 }
 
-// missingMethod is like MissingMethod but accepts a *Checker as receiver.
+// missingMethod is like MissingMethod but accepts a *Checker as receiver,
+// a comparator equivalent for type comparison, and a *string for error causes.
 // The receiver may be nil if missingMethod is invoked through an exported
 // API call (such as MissingMethod), i.e., when all methods have been type-
 // checked.
-//
-// If a method is missing on T but is found on *T, or if a method is found
-// on T when looked up with case-folding, this alternative method is returned
-// as the second result.
-func (check *Checker) missingMethod(V Type, T *Interface, static bool) (method, alt *Func) {
-	if T.NumMethods() == 0 {
-		return
+// The underlying type of T must be an interface; T (rather than its under-
+// lying type) is used for better error messages (reported through *cause).
+// The comparator is used to compare signatures.
+// If a method is missing and cause is not nil, *cause describes the error.
+func (check *Checker) missingMethod(V, T Type, static bool, equivalent func(x, y Type) bool, cause *string) (method *Func, wrongType bool) {
+	methods := under(T).(*Interface).typeSet().methods // T must be an interface
+	if len(methods) == 0 {
+		return nil, false
 	}
 
-	// V is an interface
+	const (
+		ok = iota
+		notFound
+		wrongName
+		wrongSig
+		ambigSel
+		ptrRecv
+		field
+	)
+
+	state := ok
+	var m *Func // method on T we're trying to implement
+	var f *Func // method on V, if found (state is one of ok, wrongName, wrongSig)
+
 	if u, _ := under(V).(*Interface); u != nil {
 		tset := u.typeSet()
-		for _, m := range T.typeSet().methods {
-			_, f := tset.LookupMethod(m.pkg, m.name, false)
+		for _, m = range methods {
+			_, f = tset.LookupMethod(m.pkg, m.name, false)
 
 			if f == nil {
 				if !static {
 					continue
 				}
-				return m, nil
+				state = notFound
+				break
 			}
 
-			if !Identical(f.typ, m.typ) {
-				return m, f
+			if !equivalent(f.typ, m.typ) {
+				state = wrongSig
+				break
 			}
 		}
+	} else {
+		for _, m = range methods {
+			obj, index, indirect := lookupFieldOrMethodImpl(V, false, m.pkg, m.name, false)
 
-		return
-	}
-
-	// V is not an interface
-	for _, m := range T.typeSet().methods {
-		// TODO(gri) should this be calling LookupFieldOrMethod instead (and why not)?
-		obj, _, _ := lookupFieldOrMethod(V, false, m.pkg, m.name, false)
-
-		// check if m is on *V, or on V with case-folding
-		found := obj != nil
-		if !found {
-			// TODO(gri) Instead of NewPointer(V) below, can we just set the "addressable" argument?
-			obj, _, _ = lookupFieldOrMethod(NewPointer(V), false, m.pkg, m.name, false)
+			// check if m is ambiguous, on *V, or on V with case-folding
 			if obj == nil {
-				obj, _, _ = lookupFieldOrMethod(V, false, m.pkg, m.name, true /* fold case */)
+				switch {
+				case index != nil:
+					state = ambigSel
+				case indirect:
+					state = ptrRecv
+				default:
+					state = notFound
+					obj, _, _ = lookupFieldOrMethodImpl(V, false, m.pkg, m.name, true /* fold case */)
+					f, _ = obj.(*Func)
+					if f != nil {
+						state = wrongName
+					}
+				}
+				break
+			}
+
+			// we must have a method (not a struct field)
+			f, _ = obj.(*Func)
+			if f == nil {
+				state = field
+				break
+			}
+
+			// methods may not have a fully set up signature yet
+			if check != nil {
+				check.objDecl(f, nil)
+			}
+
+			if !equivalent(f.typ, m.typ) {
+				state = wrongSig
+				break
 			}
 		}
+	}
 
-		// we must have a method (not a struct field)
-		f, _ := obj.(*Func)
-		if f == nil {
-			return m, nil
+	if state == ok {
+		return nil, false
+	}
+
+	if cause != nil {
+		if f != nil {
+			// This method may be formatted in funcString below, so must have a fully
+			// set up signature.
+			if check != nil {
+				check.objDecl(f, nil)
+			}
 		}
-
-		// methods may not have a fully set up signature yet
-		if check != nil {
-			check.objDecl(f, nil)
-		}
-
-		if !found || !Identical(f.typ, m.typ) {
-			return m, f
+		switch state {
+		case notFound:
+			switch {
+			case isInterfacePtr(V):
+				*cause = "(" + check.interfacePtrError(V) + ")"
+			case isInterfacePtr(T):
+				*cause = "(" + check.interfacePtrError(T) + ")"
+			default:
+				*cause = check.sprintf("(missing method %s)", m.Name())
+			}
+		case wrongName:
+			fs, ms := check.funcString(f, false), check.funcString(m, false)
+			*cause = check.sprintf("(missing method %s)\n\t\thave %s\n\t\twant %s",
+				m.Name(), fs, ms)
+		case wrongSig:
+			fs, ms := check.funcString(f, false), check.funcString(m, false)
+			if fs == ms {
+				// Don't report "want Foo, have Foo".
+				// Add package information to disambiguate (go.dev/issue/54258).
+				fs, ms = check.funcString(f, true), check.funcString(m, true)
+			}
+			*cause = check.sprintf("(wrong type for method %s)\n\t\thave %s\n\t\twant %s",
+				m.Name(), fs, ms)
+		case ambigSel:
+			*cause = check.sprintf("(ambiguous selector %s.%s)", V, m.Name())
+		case ptrRecv:
+			*cause = check.sprintf("(method %s has pointer receiver)", m.Name())
+		case field:
+			*cause = check.sprintf("(%s.%s is a field, not a method)", V, m.Name())
+		default:
+			unreachable()
 		}
 	}
 
-	return
-}
-
-// missingMethodCause returns a string giving the detailed cause for a missing method m,
-// where m is missing from V, but required by T. It puts the cause in parentheses,
-// and may include more have/want info after that. If non-nil, alt is a relevant
-// method that matches in some way. It may have the correct name, but wrong type, or
-// it may have a pointer receiver, or it may have the correct name except wrong case.
-// check may be nil.
-func (check *Checker) missingMethodCause(V, T Type, m, alt *Func) string {
-	mname := "method " + m.Name()
-
-	if alt != nil {
-		if m.Name() != alt.Name() {
-			return check.sprintf("(missing %s)\n\t\thave %s\n\t\twant %s",
-				mname, check.funcString(alt, false), check.funcString(m, false))
-		}
-
-		if Identical(m.typ, alt.typ) {
-			return check.sprintf("(%s has pointer receiver)", mname)
-		}
-
-		altS, mS := check.funcString(alt, false), check.funcString(m, false)
-		if altS == mS {
-			// Would tell the user that Foo isn't a Foo, add package information to disambiguate.  See #54258.
-			altS, mS = check.funcString(alt, true), check.funcString(m, true)
-		}
-
-		return check.sprintf("(wrong type for %s)\n\t\thave %s\n\t\twant %s",
-			mname, altS, mS)
-	}
-
-	if isInterfacePtr(V) {
-		return "(" + check.interfacePtrError(V) + ")"
-	}
-
-	if isInterfacePtr(T) {
-		return "(" + check.interfacePtrError(T) + ")"
-	}
-
-	obj, _, _ := lookupFieldOrMethod(V, true /* auto-deref */, m.pkg, m.name, false)
-	if fld, _ := obj.(*Var); fld != nil {
-		return check.sprintf("(%s.%s is a field, not a method)", V, fld.Name())
-	}
-
-	return check.sprintf("(missing %s)", mname)
+	return m, state == wrongSig || state == ptrRecv
 }
 
 func isInterfacePtr(T Type) bool {
@@ -453,36 +491,40 @@
 }
 
 // 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.
 // The receiver may be nil if assertableTo is invoked through an exported API call
 // (such as AssertableTo), i.e., when all methods have been type-checked.
+// The underlying type of V must be an interface.
+// If the result is false and cause is not nil, *cause describes the error.
 // TODO(gri) replace calls to this function with calls to newAssertableTo.
-func (check *Checker) assertableTo(V *Interface, T Type) (method, wrongType *Func) {
-	// 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 IsInterface(T) {
-		return
-	}
-	// TODO(gri) fix this for generalized interfaces
-	return check.missingMethod(T, V, false)
-}
-
-// newAssertableTo reports whether a value of type V can be asserted to have type T.
-// It also implements behavior for interfaces that currently are only permitted
-// in constraint position (we have not yet defined that behavior in the spec).
-func (check *Checker) newAssertableTo(V *Interface, T Type) bool {
+func (check *Checker) assertableTo(V, T Type, cause *string) 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 IsInterface(T) {
 		return true
 	}
-	return check.implements(T, V, false, nil)
+	// TODO(gri) fix this for generalized interfaces
+	m, _ := check.missingMethod(T, V, false, Identical, cause)
+	return m == nil
 }
 
-// deref dereferences typ if it is a *Pointer and returns its base and true.
+// newAssertableTo reports whether a value of type V can be asserted to have type T.
+// It also implements behavior for interfaces that currently are only permitted
+// in constraint position (we have not yet defined that behavior in the spec).
+// The underlying type of V must be an interface.
+// If the result is false and cause is not nil, *cause is set to the error cause.
+func (check *Checker) newAssertableTo(pos syntax.Pos, V, T Type, cause *string) 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 IsInterface(T) {
+		return true
+	}
+	return check.implements(pos, T, V, false, cause)
+}
+
+// deref dereferences typ if it is a *Pointer (but not a *Named type
+// with an underlying pointer type!) and returns its base and true.
 // Otherwise it returns (typ, false).
 func deref(typ Type) (Type, bool) {
 	if p, _ := typ.(*Pointer); p != nil {
diff --git a/src/cmd/compile/internal/types2/mono.go b/src/cmd/compile/internal/types2/mono.go
index eb1d5e7..5b68f2a 100644
--- a/src/cmd/compile/internal/types2/mono.go
+++ b/src/cmd/compile/internal/types2/mono.go
@@ -284,7 +284,7 @@
 	// parameters that it's implicitly parameterized by.
 	for scope := obj.Parent(); scope != root; scope = scope.Parent() {
 		for _, elem := range scope.elems {
-			if elem, ok := elem.(*TypeName); ok && !elem.IsAlias() && elem.Pos().Cmp(obj.Pos()) < 0 {
+			if elem, ok := elem.(*TypeName); ok && !elem.IsAlias() && cmpPos(elem.Pos(), obj.Pos()) < 0 {
 				if tpar, ok := elem.Type().(*TypeParam); ok {
 					if idx < 0 {
 						idx = len(w.vertices)
diff --git a/src/cmd/compile/internal/types2/mono_test.go b/src/cmd/compile/internal/types2/mono_test.go
index 8900992..c2955a2 100644
--- a/src/cmd/compile/internal/types2/mono_test.go
+++ b/src/cmd/compile/internal/types2/mono_test.go
@@ -5,7 +5,6 @@
 package types2_test
 
 import (
-	"cmd/compile/internal/syntax"
 	"cmd/compile/internal/types2"
 	"errors"
 	"fmt"
@@ -15,18 +14,13 @@
 
 func checkMono(t *testing.T, body string) error {
 	src := "package x; import `unsafe`; var _ unsafe.Pointer;\n" + body
-	file, err := syntax.Parse(syntax.NewFileBase("x.go"), strings.NewReader(src), nil, nil, 0)
-	if err != nil {
-		t.Fatal(err)
-	}
-	files := []*syntax.File{file}
 
 	var buf strings.Builder
 	conf := types2.Config{
 		Error:    func(err error) { fmt.Fprintln(&buf, err) },
 		Importer: defaultImporter(),
 	}
-	conf.Check("x", files, nil)
+	typecheck(src, &conf, nil)
 	if buf.Len() == 0 {
 		return nil
 	}
diff --git a/src/cmd/compile/internal/types2/named.go b/src/cmd/compile/internal/types2/named.go
index 2cf6d38..5408c7e 100644
--- a/src/cmd/compile/internal/types2/named.go
+++ b/src/cmd/compile/internal/types2/named.go
@@ -539,7 +539,7 @@
 	for n := range seen {
 		// We should never have to update the underlying type of an imported type;
 		// those underlying types should have been resolved during the import.
-		// Also, doing so would lead to a race condition (was issue #31749).
+		// Also, doing so would lead to a race condition (was go.dev/issue/31749).
 		// Do this check always, not just in debug mode (it's cheap).
 		if n.obj.pkg != check.pkg {
 			panic("imported type with unresolved underlying type")
diff --git a/src/cmd/compile/internal/types2/named_test.go b/src/cmd/compile/internal/types2/named_test.go
index 4140bca..705dcae 100644
--- a/src/cmd/compile/internal/types2/named_test.go
+++ b/src/cmd/compile/internal/types2/named_test.go
@@ -31,7 +31,7 @@
 
 type Inst = G[int]
 	`
-	pkg := mustTypecheck("p", src, nil)
+	pkg := mustTypecheck(src, nil, nil)
 
 	var (
 		T        = pkg.Scope().Lookup("T").Type()
@@ -72,7 +72,7 @@
 	return inst
 }
 
-// Test that types do not expand infinitely, as in golang/go#52715.
+// Test that types do not expand infinitely, as in go.dev/issue/52715.
 func TestFiniteTypeExpansion(t *testing.T) {
 	const src = `
 package p
@@ -92,7 +92,7 @@
 type Inst = *Tree[int]
 `
 
-	f := mustParse("foo.go", src)
+	f := mustParse(src)
 	pkg := NewPackage("p", f.PkgName.Value)
 	if err := NewChecker(nil, pkg, nil).Files([]*syntax.File{f}); err != nil {
 		t.Fatal(err)
diff --git a/src/cmd/compile/internal/types2/object_test.go b/src/cmd/compile/internal/types2/object_test.go
index fa036ec..ef1a864 100644
--- a/src/cmd/compile/internal/types2/object_test.go
+++ b/src/cmd/compile/internal/types2/object_test.go
@@ -5,7 +5,6 @@
 package types2_test
 
 import (
-	"cmd/compile/internal/syntax"
 	"internal/testenv"
 	"strings"
 	"testing"
@@ -54,17 +53,10 @@
 }
 
 // TestEmbeddedMethod checks that an embedded method is represented by
-// the same Func Object as the original method. See also issue #34421.
+// the same Func Object as the original method. See also go.dev/issue/34421.
 func TestEmbeddedMethod(t *testing.T) {
 	const src = `package p; type I interface { error }`
-
-	// type-check src
-	f := mustParse("", src)
-	var conf Config
-	pkg, err := conf.Check(f.PkgName.Value, []*syntax.File{f}, nil)
-	if err != nil {
-		t.Fatalf("typecheck failed: %s", err)
-	}
+	pkg := mustTypecheck(src, nil, nil)
 
 	// get original error.Error method
 	eface := Universe.Lookup("error")
@@ -118,7 +110,7 @@
 
 	for _, test := range testObjects {
 		src := "package p; " + test.src
-		pkg, err := typecheck(filename, src, nil)
+		pkg, err := typecheck(src, nil, nil)
 		if err != nil {
 			t.Errorf("%s: %s", src, err)
 			continue
diff --git a/src/cmd/compile/internal/types2/operand.go b/src/cmd/compile/internal/types2/operand.go
index e49afee..0469b00 100644
--- a/src/cmd/compile/internal/types2/operand.go
+++ b/src/cmd/compile/internal/types2/operand.go
@@ -235,7 +235,7 @@
 	x.val = val
 }
 
-// isNil reports whether x is a typed or the untyped nil value.
+// isNil reports whether x is the (untyped) nil value.
 func (x *operand) isNil() bool { return x.mode == nilvalue }
 
 // assignableTo reports whether x is assignable to a variable of type T. If the
@@ -290,18 +290,26 @@
 		return true, 0
 	}
 
-	// T is an interface type and x implements T and T is not a type parameter.
-	// Also handle the case where T is a pointer to an interface.
+	// T is an interface type, but not a type parameter, and V implements T.
+	// Also handle the case where T is a pointer to an interface so that we get
+	// the Checker.implements error cause.
 	if _, ok := Tu.(*Interface); ok && Tp == nil || isInterfacePtr(Tu) {
-		if !check.implements(V, T, false, cause) {
+		if check.implements(x.Pos(), V, T, false, cause) {
+			return true, 0
+		}
+		// V doesn't implement T but V may still be assignable to T if V
+		// is a type parameter; do not report an error in that case yet.
+		if Vp == nil {
 			return false, InvalidIfaceAssign
 		}
-		return true, 0
+		if cause != nil {
+			*cause = ""
+		}
 	}
 
 	// If V is an interface, check if a missing type assertion is the problem.
 	if Vi, _ := Vu.(*Interface); Vi != nil && Vp == nil {
-		if check.implements(T, V, false, nil) {
+		if check.implements(x.Pos(), T, V, false, nil) {
 			// T implements V, so give hint about type assertion.
 			if cause != nil {
 				*cause = "need type assertion"
diff --git a/src/cmd/compile/internal/types2/package.go b/src/cmd/compile/internal/types2/package.go
index 61670f6..e08099d 100644
--- a/src/cmd/compile/internal/types2/package.go
+++ b/src/cmd/compile/internal/types2/package.go
@@ -10,13 +10,14 @@
 
 // A Package describes a Go package.
 type Package struct {
-	path     string
-	name     string
-	scope    *Scope
-	imports  []*Package
-	complete bool
-	fake     bool // scope lookup errors are silently dropped if package is fake (internal use only)
-	cgo      bool // uses of this package will be rewritten into uses of declarations from _cgo_gotypes.go
+	path      string
+	name      string
+	scope     *Scope
+	imports   []*Package
+	complete  bool
+	fake      bool   // scope lookup errors are silently dropped if package is fake (internal use only)
+	cgo       bool   // uses of this package will be rewritten into uses of declarations from _cgo_gotypes.go
+	goVersion string // minimum Go version required for package (by Config.GoVersion, typically from go.mod)
 }
 
 // NewPackage returns a new Package for the given package path and name.
@@ -35,6 +36,12 @@
 // SetName sets the package name.
 func (pkg *Package) SetName(name string) { pkg.name = name }
 
+// GoVersion returns the minimum Go version required by this package.
+// If the minimum version is unknown, GoVersion returns the empty string.
+// Individual source files may specify a different minimum Go version,
+// as reported in the [go/ast.File.GoVersion] field.
+func (pkg *Package) GoVersion() string { return pkg.goVersion }
+
 // Scope returns the (complete or incomplete) package scope
 // holding the objects declared at package level (TypeNames,
 // Consts, Vars, and Funcs).
diff --git a/src/cmd/compile/internal/types2/predicates.go b/src/cmd/compile/internal/types2/predicates.go
index acc1549..13a3bf8 100644
--- a/src/cmd/compile/internal/types2/predicates.go
+++ b/src/cmd/compile/internal/types2/predicates.go
@@ -64,6 +64,17 @@
 	return false
 }
 
+// isTypeLit reports whether t is a type literal.
+// This includes all non-defined types, but also basic types.
+// isTypeLit may be called with types that are not fully set up.
+func isTypeLit(t Type) bool {
+	switch t.(type) {
+	case *Named, *TypeParam:
+		return false
+	}
+	return true
+}
+
 // isTyped reports whether t is typed; i.e., not an untyped
 // constant or boolean. isTyped may be called with types that
 // are not fully set up.
@@ -199,12 +210,22 @@
 	return p.x == q.x && p.y == q.y || p.x == q.y && p.y == q.x
 }
 
+// A comparer is used to compare types.
+type comparer struct {
+	ignoreTags     bool // if set, identical ignores struct tags
+	ignoreInvalids bool // if set, identical treats an invalid type as identical to any type
+}
+
 // For changes to this code the corresponding changes should be made to unifier.nify.
-func identical(x, y Type, cmpTags bool, p *ifacePair) bool {
+func (c *comparer) identical(x, y Type, p *ifacePair) bool {
 	if x == y {
 		return true
 	}
 
+	if c.ignoreInvalids && (x == Typ[Invalid] || y == Typ[Invalid]) {
+		return true
+	}
+
 	switch x := x.(type) {
 	case *Basic:
 		// Basic types are singletons except for the rune and byte
@@ -220,13 +241,13 @@
 		if y, ok := y.(*Array); ok {
 			// If one or both array lengths are unknown (< 0) due to some error,
 			// assume they are the same to avoid spurious follow-on errors.
-			return (x.len < 0 || y.len < 0 || x.len == y.len) && identical(x.elem, y.elem, cmpTags, p)
+			return (x.len < 0 || y.len < 0 || x.len == y.len) && c.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, cmpTags, p)
+			return c.identical(x.elem, y.elem, p)
 		}
 
 	case *Struct:
@@ -239,9 +260,9 @@
 				for i, f := range x.fields {
 					g := y.fields[i]
 					if f.embedded != g.embedded ||
-						cmpTags && x.Tag(i) != y.Tag(i) ||
+						!c.ignoreTags && x.Tag(i) != y.Tag(i) ||
 						!f.sameId(g.pkg, g.name) ||
-						!identical(f.typ, g.typ, cmpTags, p) {
+						!c.identical(f.typ, g.typ, p) {
 						return false
 					}
 				}
@@ -252,7 +273,7 @@
 	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, cmpTags, p)
+			return c.identical(x.base, y.base, p)
 		}
 
 	case *Tuple:
@@ -263,7 +284,7 @@
 				if x != nil {
 					for i, v := range x.vars {
 						w := y.vars[i]
-						if !identical(v.typ, w.typ, cmpTags, p) {
+						if !c.identical(v.typ, w.typ, p) {
 							return false
 						}
 					}
@@ -311,7 +332,7 @@
 			// Constraints must be pair-wise identical, after substitution.
 			for i, xtparam := range xtparams {
 				ybound := check.subst(nopos, ytparams[i].bound, smap, nil, ctxt)
-				if !identical(xtparam.bound, ybound, cmpTags, p) {
+				if !c.identical(xtparam.bound, ybound, p) {
 					return false
 				}
 			}
@@ -321,8 +342,8 @@
 		}
 
 		return x.variadic == y.variadic &&
-			identical(x.params, yparams, cmpTags, p) &&
-			identical(x.results, yresults, cmpTags, p)
+			c.identical(x.params, yparams, p) &&
+			c.identical(x.results, yresults, p)
 
 	case *Union:
 		if y, _ := y.(*Union); y != nil {
@@ -389,7 +410,7 @@
 				}
 				for i, f := range a {
 					g := b[i]
-					if f.Id() != g.Id() || !identical(f.typ, g.typ, cmpTags, q) {
+					if f.Id() != g.Id() || !c.identical(f.typ, g.typ, q) {
 						return false
 					}
 				}
@@ -400,45 +421,35 @@
 	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, cmpTags, p) && identical(x.elem, y.elem, cmpTags, p)
+			return c.identical(x.key, y.key, p) && c.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, cmpTags, p)
+			return x.dir == y.dir && c.identical(x.elem, y.elem, p)
 		}
 
 	case *Named:
 		// Two named types are identical if their type names originate
-		// in the same type declaration.
+		// in the same type declaration; if they are instantiated they
+		// must have identical type argument lists.
 		if y, ok := y.(*Named); ok {
+			// check type arguments before origins to match unifier
+			// (for correct source code we need to do all checks so
+			// order doesn't matter)
 			xargs := x.TypeArgs().list()
 			yargs := y.TypeArgs().list()
-
 			if len(xargs) != len(yargs) {
 				return false
 			}
-
-			if len(xargs) > 0 {
-				// Instances are identical if their original type and type arguments
-				// are identical.
-				if !Identical(x.Origin(), y.Origin()) {
+			for i, xarg := range xargs {
+				if !Identical(xarg, yargs[i]) {
 					return false
 				}
-				for i, xa := range xargs {
-					if !Identical(xa, yargs[i]) {
-						return false
-					}
-				}
-				return true
 			}
-
-			// TODO(gri) Why is x == y not sufficient? And if it is,
-			//           we can just return false here because x == y
-			//           is caught in the very beginning of this function.
-			return x.obj == y.obj
+			return indenticalOrigin(x, y)
 		}
 
 	case *TypeParam:
@@ -454,6 +465,12 @@
 	return false
 }
 
+// identicalOrigin reports whether x and y originated in the same declaration.
+func indenticalOrigin(x, y *Named) bool {
+	// TODO(gri) is this correct?
+	return x.Origin().obj == y.Origin().obj
+}
+
 // identicalInstance reports if two type instantiations are identical.
 // Instantiations are identical if their origin and type arguments are
 // identical.
@@ -493,3 +510,23 @@
 	}
 	return t
 }
+
+// maxType returns the "largest" type that encompasses both x and y.
+// If x and y are different untyped numeric types, the result is the type of x or y
+// that appears later in this list: integer, rune, floating-point, complex.
+// Otherwise, if x != y, the result is nil.
+func maxType(x, y Type) Type {
+	// We only care about untyped types (for now), so == is good enough.
+	// TODO(gri) investigate generalizing this function to simplify code elsewhere
+	if x == y {
+		return x
+	}
+	if isUntyped(x) && isUntyped(y) && isNumeric(x) && isNumeric(y) {
+		// untyped types are basic types
+		if x.(*Basic).kind > y.(*Basic).kind {
+			return x
+		}
+		return y
+	}
+	return nil
+}
diff --git a/src/cmd/compile/internal/types2/resolver.go b/src/cmd/compile/internal/types2/resolver.go
index cb29f72..d051fb5 100644
--- a/src/cmd/compile/internal/types2/resolver.go
+++ b/src/cmd/compile/internal/types2/resolver.go
@@ -223,7 +223,7 @@
 		// but there is no corresponding package object.
 		check.recordDef(file.PkgName, nil)
 
-		fileScope := NewScope(check.pkg.scope, syntax.StartPos(file), syntax.EndPos(file), check.filename(fileNo))
+		fileScope := NewScope(pkg.scope, syntax.StartPos(file), syntax.EndPos(file), check.filename(fileNo))
 		fileScopes = append(fileScopes, fileScope)
 		check.recordScope(file, fileScope)
 
@@ -312,7 +312,7 @@
 							// (Do not use check.declare because it modifies the object
 							// via Object.setScopePos, which leads to a race condition;
 							// the object may be imported into more than one file scope
-							// concurrently. See issue #32154.)
+							// concurrently. See go.dev/issue/32154.)
 							if alt := fileScope.Lookup(name); alt != nil {
 								var err error_
 								err.code = DuplicateDecl
@@ -406,9 +406,7 @@
 				}
 
 			case *syntax.TypeDecl:
-				if len(s.TParamList) != 0 && !check.allowVersion(pkg, 1, 18) {
-					check.versionErrorf(s.TParamList[0], "go1.18", "type parameter")
-				}
+				_ = len(s.TParamList) != 0 && check.verifyVersionf(s.TParamList[0], go1_18, "type parameter")
 				obj := NewTypeName(s.Name.Pos(), pkg, s.Name.Value, nil)
 				check.declarePkgObj(s.Name, obj, &declInfo{file: fileScope, tdecl: s})
 
@@ -455,9 +453,7 @@
 					}
 					check.recordDef(s.Name, obj)
 				}
-				if len(s.TParamList) != 0 && !check.allowVersion(pkg, 1, 18) && !hasTParamError {
-					check.versionErrorf(s.TParamList[0], "go1.18", "type parameter")
-				}
+				_ = len(s.TParamList) != 0 && !hasTParamError && check.verifyVersionf(s.TParamList[0], go1_18, "type parameter")
 				info := &declInfo{file: fileScope, fdecl: s}
 				// Methods are not package-level objects but we still track them in the
 				// object map so that we can handle them like regular functions (if the
@@ -501,7 +497,7 @@
 		for i := range methods {
 			m := &methods[i]
 			// Determine the receiver base type and associate m with it.
-			ptr, base := check.resolveBaseTypeName(m.ptr, m.recv)
+			ptr, base := check.resolveBaseTypeName(m.ptr, m.recv, fileScopes)
 			if base != nil {
 				m.obj.hasPtrRecv_ = ptr
 				check.methods[base] = append(check.methods[base], m.obj)
@@ -575,7 +571,7 @@
 // there was a pointer indirection to get to it. The base type name must be declared
 // in package scope, and there can be at most one pointer indirection. If no such type
 // name exists, the returned base is nil.
-func (check *Checker) resolveBaseTypeName(seenPtr bool, typ syntax.Expr) (ptr bool, base *TypeName) {
+func (check *Checker) resolveBaseTypeName(seenPtr bool, typ syntax.Expr, fileScopes []*Scope) (ptr bool, base *TypeName) {
 	// Algorithm: Starting from a type expression, which may be a name,
 	// we follow that type through alias declarations until we reach a
 	// non-alias type name. If we encounter anything but pointer types or
@@ -584,8 +580,6 @@
 	ptr = seenPtr
 	var seen map[*TypeName]bool
 	for {
-		typ = unparen(typ)
-
 		// check if we have a pointer type
 		// if pexpr, _ := typ.(*ast.StarExpr); pexpr != nil {
 		if pexpr, _ := typ.(*syntax.Operation); pexpr != nil && pexpr.Op == syntax.Mul && pexpr.Y == nil {
@@ -597,15 +591,43 @@
 			typ = unparen(pexpr.X) // continue with pointer base type
 		}
 
-		// typ must be a name
-		name, _ := typ.(*syntax.Name)
-		if name == nil {
+		// typ must be a name, or a C.name cgo selector.
+		var name string
+		switch typ := typ.(type) {
+		case *syntax.Name:
+			name = typ.Value
+		case *syntax.SelectorExpr:
+			// C.struct_foo is a valid type name for packages using cgo.
+			//
+			// Detect this case, and adjust name so that the correct TypeName is
+			// resolved below.
+			if ident, _ := typ.X.(*syntax.Name); ident != nil && ident.Value == "C" {
+				// Check whether "C" actually resolves to an import of "C", by looking
+				// in the appropriate file scope.
+				var obj Object
+				for _, scope := range fileScopes {
+					if scope.Contains(ident.Pos()) {
+						obj = scope.Lookup(ident.Value)
+					}
+				}
+				// If Config.go115UsesCgo is set, the typechecker will resolve Cgo
+				// selectors to their cgo name. We must do the same here.
+				if pname, _ := obj.(*PkgName); pname != nil {
+					if pname.imported.cgo { // only set if Config.go115UsesCgo is set
+						name = "_Ctype_" + typ.Sel.Value
+					}
+				}
+			}
+			if name == "" {
+				return false, nil
+			}
+		default:
 			return false, nil
 		}
 
 		// name must denote an object found in the current package scope
 		// (note that dot-imported objects are not in the package scope!)
-		obj := check.pkg.scope.Lookup(name.Value)
+		obj := check.pkg.scope.Lookup(name)
 		if obj == nil {
 			return false, nil
 		}
@@ -658,7 +680,7 @@
 	// We process non-alias type declarations first, followed by alias declarations,
 	// and then everything else. This appears to avoid most situations where the type
 	// of an alias is needed before it is available.
-	// There may still be cases where this is not good enough (see also issue #25838).
+	// There may still be cases where this is not good enough (see also go.dev/issue/25838).
 	// In those cases Checker.ident will report an error ("invalid use of type alias").
 	var aliasList []*TypeName
 	var othersList []Object // everything that's not a type
diff --git a/src/cmd/compile/internal/types2/resolver_test.go b/src/cmd/compile/internal/types2/resolver_test.go
index e303d34..8105d8a 100644
--- a/src/cmd/compile/internal/types2/resolver_test.go
+++ b/src/cmd/compile/internal/types2/resolver_test.go
@@ -116,8 +116,8 @@
 
 	// parse package files
 	var files []*syntax.File
-	for i, src := range sources {
-		files = append(files, mustParse(fmt.Sprintf("sources[%d]", i), src))
+	for _, src := range sources {
+		files = append(files, mustParse(src))
 	}
 
 	// resolve and type-check package AST
@@ -139,23 +139,23 @@
 
 	// check that qualified identifiers are resolved
 	for _, f := range files {
-		syntax.Crawl(f, func(n syntax.Node) bool {
+		syntax.Inspect(f, func(n syntax.Node) bool {
 			if s, ok := n.(*syntax.SelectorExpr); ok {
 				if x, ok := s.X.(*syntax.Name); ok {
 					obj := uses[x]
 					if obj == nil {
 						t.Errorf("%s: unresolved qualified identifier %s", x.Pos(), x.Value)
-						return true
+						return false
 					}
 					if _, ok := obj.(*PkgName); ok && uses[s.Sel] == nil {
 						t.Errorf("%s: unresolved selector %s", s.Sel.Pos(), s.Sel.Value)
-						return true
+						return false
 					}
-					return true
+					return false
 				}
 				return true
 			}
-			return false
+			return true
 		})
 	}
 
@@ -166,14 +166,14 @@
 	}
 
 	// Check that each identifier in the source is found in uses or defs or both.
-	// We need the foundUses/Defs maps (rather then just deleting the found objects
+	// We need the foundUses/Defs maps (rather than just deleting the found objects
 	// from the uses and defs maps) because syntax.Walk traverses shared nodes multiple
 	// times (e.g. types in field lists such as "a, b, c int").
 	foundUses := make(map[*syntax.Name]bool)
 	foundDefs := make(map[*syntax.Name]bool)
 	var both []string
 	for _, f := range files {
-		syntax.Crawl(f, func(n syntax.Node) bool {
+		syntax.Inspect(f, func(n syntax.Node) bool {
 			if x, ok := n.(*syntax.Name); ok {
 				var objects int
 				if _, found := uses[x]; found {
@@ -190,9 +190,9 @@
 				case 3:
 					both = append(both, x.Value)
 				}
-				return true
+				return false
 			}
-			return false
+			return true
 		})
 	}
 
diff --git a/src/cmd/compile/internal/types2/return.go b/src/cmd/compile/internal/types2/return.go
index 7cdea99..ab611ef 100644
--- a/src/cmd/compile/internal/types2/return.go
+++ b/src/cmd/compile/internal/types2/return.go
@@ -64,7 +64,7 @@
 	case *syntax.ForStmt:
 		if _, ok := s.Init.(*syntax.RangeClause); ok {
 			// Range clauses guarantee that the loop terminates,
-			// so the loop is not a terminating statement. See issue 49003.
+			// so the loop is not a terminating statement. See go.dev/issue/49003.
 			break
 		}
 		if s.Cond == nil && !hasBreak(s.Body, label, true) {
diff --git a/src/cmd/compile/internal/types2/scope.go b/src/cmd/compile/internal/types2/scope.go
index a679a3d..25bde6a 100644
--- a/src/cmd/compile/internal/types2/scope.go
+++ b/src/cmd/compile/internal/types2/scope.go
@@ -83,7 +83,7 @@
 // whose scope is the scope of the package that exported them.
 func (s *Scope) LookupParent(name string, pos syntax.Pos) (*Scope, Object) {
 	for ; s != nil; s = s.parent {
-		if obj := s.Lookup(name); obj != nil && (!pos.IsKnown() || obj.scopePos().Cmp(pos) <= 0) {
+		if obj := s.Lookup(name); obj != nil && (!pos.IsKnown() || cmpPos(obj.scopePos(), pos) <= 0) {
 			return s, obj
 		}
 	}
@@ -175,7 +175,7 @@
 // The result is guaranteed to be valid only if the type-checked
 // AST has complete position information.
 func (s *Scope) Contains(pos syntax.Pos) bool {
-	return s.pos.Cmp(pos) <= 0 && pos.Cmp(s.end) < 0
+	return cmpPos(s.pos, pos) <= 0 && cmpPos(pos, s.end) < 0
 }
 
 // Innermost returns the innermost (child) scope containing
diff --git a/src/cmd/compile/internal/types2/self_test.go b/src/cmd/compile/internal/types2/self_test.go
index e68d52d..3c8bec1 100644
--- a/src/cmd/compile/internal/types2/self_test.go
+++ b/src/cmd/compile/internal/types2/self_test.go
@@ -100,7 +100,7 @@
 }
 
 func pkgFiles(path string) ([]*syntax.File, error) {
-	filenames, err := pkgFilenames(path) // from stdlib_test.go
+	filenames, err := pkgFilenames(path, true) // from stdlib_test.go
 	if err != nil {
 		return nil, err
 	}
diff --git a/src/cmd/compile/internal/types2/signature.go b/src/cmd/compile/internal/types2/signature.go
index 61c6721..8e0dfe2 100644
--- a/src/cmd/compile/internal/types2/signature.go
+++ b/src/cmd/compile/internal/types2/signature.go
@@ -154,7 +154,7 @@
 			} else if len(tparams) < len(recvTParams) {
 				// Reporting an error here is a stop-gap measure to avoid crashes in the
 				// compiler when a type parameter/argument cannot be inferred later. It
-				// may lead to follow-on errors (see issues #51339, #51343).
+				// may lead to follow-on errors (see issues go.dev/issue/51339, go.dev/issue/51343).
 				// TODO(gri) find a better solution
 				got := measure(len(tparams), "type parameter")
 				check.errorf(recvPar, BadRecv, "got %s, but receiver base type declares %d", got, len(recvTParams))
@@ -204,7 +204,7 @@
 		sig.recv = recv
 
 		// Delay validation of receiver type as it may cause premature expansion
-		// of types the receiver type is dependent on (see issues #51232, #51233).
+		// of types the receiver type is dependent on (see issues go.dev/issue/51232, go.dev/issue/51233).
 		check.later(func() {
 			// spec: "The receiver type must be of the form T or *T where T is a type name."
 			rtyp, _ := deref(recv.typ)
diff --git a/src/cmd/compile/internal/types2/sizeof_test.go b/src/cmd/compile/internal/types2/sizeof_test.go
index af82b3f..740dbc9 100644
--- a/src/cmd/compile/internal/types2/sizeof_test.go
+++ b/src/cmd/compile/internal/types2/sizeof_test.go
@@ -47,7 +47,7 @@
 
 		// Misc
 		{Scope{}, 60, 104},
-		{Package{}, 36, 72},
+		{Package{}, 44, 88},
 		{_TypeSet{}, 28, 56},
 	}
 
diff --git a/src/cmd/compile/internal/types2/sizes.go b/src/cmd/compile/internal/types2/sizes.go
index c99a12b..59f600a 100644
--- a/src/cmd/compile/internal/types2/sizes.go
+++ b/src/cmd/compile/internal/types2/sizes.go
@@ -10,14 +10,17 @@
 type Sizes interface {
 	// Alignof returns the alignment of a variable of type T.
 	// Alignof must implement the alignment guarantees required by the spec.
+	// The result must be >= 1.
 	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.
+	// A negative entry in the result indicates that the struct is too large.
 	Offsetsof(fields []*Var) []int64
 
 	// Sizeof returns the size of a variable of type T.
 	// Sizeof must implement the size guarantees required by the spec.
+	// A negative result indicates that T is too large.
 	Sizeof(T Type) int64
 }
 
@@ -44,7 +47,11 @@
 	MaxAlign int64 // maximum alignment in bytes - must be >= 1
 }
 
-func (s *StdSizes) Alignof(T Type) int64 {
+func (s *StdSizes) Alignof(T Type) (result int64) {
+	defer func() {
+		assert(result >= 1)
+	}()
+
 	// For arrays and structs, alignment is defined in terms
 	// of alignment of the elements and fields, respectively.
 	switch t := under(T).(type) {
@@ -89,7 +96,7 @@
 	case *TypeParam, *Union:
 		unreachable()
 	}
-	a := s.Sizeof(T) // may be 0
+	a := s.Sizeof(T) // may be 0 or negative
 	// spec: "For a variable x of any type: unsafe.Alignof(x) is at least 1."
 	if a < 1 {
 		return 1
@@ -118,12 +125,22 @@
 
 func (s *StdSizes) Offsetsof(fields []*Var) []int64 {
 	offsets := make([]int64, len(fields))
-	var o int64
+	var offs int64
 	for i, f := range fields {
+		if offs < 0 {
+			// all remaining offsets are too large
+			offsets[i] = -1
+			continue
+		}
+		// offs >= 0
 		a := s.Alignof(f.typ)
-		o = align(o, a)
-		offsets[i] = o
-		o += s.Sizeof(f.typ)
+		offs = align(offs, a) // possibly < 0 if align overflows
+		offsets[i] = offs
+		if d := s.Sizeof(f.typ); d >= 0 && offs >= 0 {
+			offs += d // ok to overflow to < 0
+		} else {
+			offs = -1 // f.typ or offs is too large
+		}
 	}
 	return offsets
 }
@@ -163,9 +180,27 @@
 			return 0
 		}
 		// n > 0
+		esize := s.Sizeof(t.elem)
+		if esize < 0 {
+			return -1 // element too large
+		}
+		if esize == 0 {
+			return 0 // 0-size element
+		}
+		// esize > 0
 		a := s.Alignof(t.elem)
-		z := s.Sizeof(t.elem)
-		return align(z, a)*(n-1) + z
+		ea := align(esize, a) // possibly < 0 if align overflows
+		if ea < 0 {
+			return -1
+		}
+		// ea >= 1
+		n1 := n - 1 // n1 >= 0
+		// Final size is ea*n1 + esize; and size must be <= maxInt64.
+		const maxInt64 = 1<<63 - 1
+		if n1 > 0 && ea > maxInt64/n1 {
+			return -1 // ea*n1 overflows
+		}
+		return ea*n1 + esize // may still overflow to < 0 which is ok
 	case *Slice:
 		return s.WordSize * 3
 	case *Struct:
@@ -174,7 +209,12 @@
 			return 0
 		}
 		offsets := s.Offsetsof(t.fields)
-		return offsets[n-1] + s.Sizeof(t.fields[n-1].typ)
+		offs := offsets[n-1]
+		size := s.Sizeof(t.fields[n-1].typ)
+		if offs < 0 || size < 0 {
+			return -1 // type too large
+		}
+		return offs + size // may overflow to < 0 which is ok
 	case *Interface:
 		// Type parameters lead to variable sizes/alignments;
 		// StdSizes.Sizeof won't be called for them.
@@ -235,62 +275,69 @@
 var stdSizes = SizesFor("gc", "amd64")
 
 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")
+	f := stdSizes.Alignof
+	if conf.Sizes != nil {
+		f = conf.Sizes.Alignof
 	}
-	return stdSizes.Alignof(T)
+	if a := f(T); a >= 1 {
+		return a
+	}
+	panic("implementation of alignof returned an alignment < 1")
 }
 
 func (conf *Config) offsetsof(T *Struct) []int64 {
 	var offsets []int64
 	if 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)
+		f := stdSizes.Offsetsof
+		if conf.Sizes != nil {
+			f = conf.Sizes.Offsetsof
+		}
+		offsets = f(T.fields)
+		// sanity checks
+		if len(offsets) != T.NumFields() {
+			panic("implementation of offsetsof returned the wrong number of 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
+// the index sequence relative to T. All embedded fields
+// must be structs (rather than pointers to structs).
+// If the offset is too large (because T is too large),
+// the result is negative.
+func (conf *Config) offsetof(T Type, index []int) int64 {
+	var offs int64
 	for _, i := range index {
-		s := under(typ).(*Struct)
-		o += conf.offsetsof(s)[i]
-		typ = s.fields[i].typ
+		s := under(T).(*Struct)
+		d := conf.offsetsof(s)[i]
+		if d < 0 {
+			return -1
+		}
+		offs += d
+		if offs < 0 {
+			return -1
+		}
+		T = s.fields[i].typ
 	}
-	return o
+	return offs
 }
 
+// sizeof returns the size of T.
+// If T is too large, the result is negative.
 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")
+	f := stdSizes.Sizeof
+	if conf.Sizes != nil {
+		f = conf.Sizes.Sizeof
 	}
-	return stdSizes.Sizeof(T)
+	return f(T)
 }
 
 // align returns the smallest y >= x such that y % a == 0.
+// a must be within 1 and 8 and it must be a power of 2.
+// The result may be negative due to overflow.
 func align(x, a int64) int64 {
-	y := x + a - 1
-	return y - y%a
+	assert(x >= 0 && 1 <= a && a <= 8 && a&(a-1) == 0)
+	return (x + a - 1) &^ (a - 1)
 }
diff --git a/src/cmd/compile/internal/types2/sizes_test.go b/src/cmd/compile/internal/types2/sizes_test.go
index e548c2d..7af8958 100644
--- a/src/cmd/compile/internal/types2/sizes_test.go
+++ b/src/cmd/compile/internal/types2/sizes_test.go
@@ -20,7 +20,7 @@
 
 func findStructTypeConfig(t *testing.T, src string, conf *types2.Config) *types2.Struct {
 	types := make(map[syntax.Expr]types2.TypeAndValue)
-	mustTypecheck("x", src, &types2.Info{Types: types})
+	mustTypecheck(src, nil, &types2.Info{Types: types})
 	for _, tv := range types {
 		if ts, ok := tv.Type.(*types2.Struct); ok {
 			return ts
@@ -30,7 +30,7 @@
 	return nil
 }
 
-// Issue 16316
+// go.dev/issue/16316
 func TestMultipleSizeUse(t *testing.T) {
 	const src = `
 package main
@@ -53,7 +53,7 @@
 	}
 }
 
-// Issue 16464
+// go.dev/issue/16464
 func TestAlignofNaclSlice(t *testing.T) {
 	const src = `
 package main
@@ -84,23 +84,19 @@
 
 const _ = unsafe.Offsetof(struct{ x int64 }{}.x)
 `
-	f := mustParse("x.go", src)
 	info := types2.Info{Types: make(map[syntax.Expr]types2.TypeAndValue)}
 	conf := types2.Config{
 		Importer: defaultImporter(),
 		Sizes:    &types2.StdSizes{WordSize: 8, MaxAlign: 8},
 	}
-	_, err := conf.Check("x", []*syntax.File{f}, &info)
-	if err != nil {
-		t.Fatal(err)
-	}
+	mustTypecheck(src, &conf, &info)
 	for _, tv := range info.Types {
 		_ = conf.Sizes.Sizeof(tv.Type)
 		_ = conf.Sizes.Alignof(tv.Type)
 	}
 }
 
-// Issue #53884.
+// go.dev/issue/53884.
 func TestAtomicAlign(t *testing.T) {
 	testenv.MustHaveGoBuild(t) // The Go command is needed for the importer to determine the locations of stdlib .a files.
 
diff --git a/src/cmd/compile/internal/types2/stdlib_test.go b/src/cmd/compile/internal/types2/stdlib_test.go
index 28df06c..ee852f5 100644
--- a/src/cmd/compile/internal/types2/stdlib_test.go
+++ b/src/cmd/compile/internal/types2/stdlib_test.go
@@ -10,12 +10,15 @@
 import (
 	"bytes"
 	"cmd/compile/internal/syntax"
+	"errors"
 	"fmt"
 	"go/build"
 	"internal/testenv"
 	"os"
 	"path/filepath"
+	"runtime"
 	"strings"
+	"sync"
 	"testing"
 	"time"
 
@@ -25,17 +28,130 @@
 var stdLibImporter = defaultImporter()
 
 func TestStdlib(t *testing.T) {
+	if testing.Short() {
+		t.Skip("skipping in short mode")
+	}
+
 	testenv.MustHaveGoBuild(t)
 
-	pkgCount := 0
-	duration := walkPkgDirs(filepath.Join(testenv.GOROOT(t), "src"), func(dir string, filenames []string) {
-		typecheckFiles(t, dir, filenames)
-		pkgCount++
+	// Collect non-test files.
+	dirFiles := make(map[string][]string)
+	root := filepath.Join(testenv.GOROOT(t), "src")
+	walkPkgDirs(root, func(dir string, filenames []string) {
+		dirFiles[dir] = filenames
 	}, t.Error)
 
-	if testing.Verbose() {
-		fmt.Println(pkgCount, "packages typechecked in", duration)
+	c := &stdlibChecker{
+		dirFiles: dirFiles,
+		pkgs:     make(map[string]*futurePackage),
 	}
+
+	start := time.Now()
+
+	// Though we read files while parsing, type-checking is otherwise CPU bound.
+	//
+	// This doesn't achieve great CPU utilization as many packages may block
+	// waiting for a common import, but in combination with the non-deterministic
+	// map iteration below this should provide decent coverage of concurrent
+	// type-checking (see golang/go#47729).
+	cpulimit := make(chan struct{}, runtime.GOMAXPROCS(0))
+	var wg sync.WaitGroup
+
+	for dir := range dirFiles {
+		dir := dir
+
+		cpulimit <- struct{}{}
+		wg.Add(1)
+		go func() {
+			defer func() {
+				wg.Done()
+				<-cpulimit
+			}()
+
+			_, err := c.getDirPackage(dir)
+			if err != nil {
+				t.Errorf("error checking %s: %v", dir, err)
+			}
+		}()
+	}
+
+	wg.Wait()
+
+	if testing.Verbose() {
+		fmt.Println(len(dirFiles), "packages typechecked in", time.Since(start))
+	}
+}
+
+// stdlibChecker implements concurrent type-checking of the packages defined by
+// dirFiles, which must define a closed set of packages (such as GOROOT/src).
+type stdlibChecker struct {
+	dirFiles map[string][]string // non-test files per directory; must be pre-populated
+
+	mu   sync.Mutex
+	pkgs map[string]*futurePackage // future cache of type-checking results
+}
+
+// A futurePackage is a future result of type-checking.
+type futurePackage struct {
+	done chan struct{} // guards pkg and err
+	pkg  *Package
+	err  error
+}
+
+func (c *stdlibChecker) Import(path string) (*Package, error) {
+	panic("unimplemented: use ImportFrom")
+}
+
+func (c *stdlibChecker) ImportFrom(path, dir string, _ ImportMode) (*Package, error) {
+	if path == "unsafe" {
+		// unsafe cannot be type checked normally.
+		return Unsafe, nil
+	}
+
+	p, err := build.Default.Import(path, dir, build.FindOnly)
+	if err != nil {
+		return nil, err
+	}
+
+	pkg, err := c.getDirPackage(p.Dir)
+	if pkg != nil {
+		// As long as pkg is non-nil, avoid redundant errors related to failed
+		// imports. TestStdlib will collect errors once for each package.
+		return pkg, nil
+	}
+	return nil, err
+}
+
+// getDirPackage gets the package defined in dir from the future cache.
+//
+// If this is the first goroutine requesting the package, getDirPackage
+// type-checks.
+func (c *stdlibChecker) getDirPackage(dir string) (*Package, error) {
+	c.mu.Lock()
+	fut, ok := c.pkgs[dir]
+	if !ok {
+		// First request for this package dir; type check.
+		fut = &futurePackage{
+			done: make(chan struct{}),
+		}
+		c.pkgs[dir] = fut
+		files, ok := c.dirFiles[dir]
+		c.mu.Unlock()
+		if !ok {
+			fut.err = fmt.Errorf("no files for %s", dir)
+		} else {
+			// Using dir as the package path here may be inconsistent with the behavior
+			// of a normal importer, but is sufficient as dir is by construction unique
+			// to this package.
+			fut.pkg, fut.err = typecheckFiles(dir, files, c)
+		}
+		close(fut.done)
+	} else {
+		// Otherwise, await the result.
+		c.mu.Unlock()
+		<-fut.done
+	}
+	return fut.pkg, fut.err
 }
 
 // firstComment returns the contents of the first non-empty comment in
@@ -90,6 +206,14 @@
 func testTestDir(t *testing.T, path string, ignore ...string) {
 	files, err := os.ReadDir(path)
 	if err != nil {
+		// cmd/distpack deletes GOROOT/test, so skip the test if it isn't present.
+		// cmd/distpack also requires GOROOT/VERSION to exist, so use that to
+		// suppress false-positive skips.
+		if _, err := os.Stat(filepath.Join(testenv.GOROOT(t), "test")); os.IsNotExist(err) {
+			if _, err := os.Stat(filepath.Join(testenv.GOROOT(t), "VERSION")); err == nil {
+				t.Skipf("skipping: GOROOT/test not present")
+			}
+		}
 		t.Fatal(err)
 	}
 
@@ -138,7 +262,10 @@
 		}
 		file, err := syntax.ParseFile(filename, nil, nil, 0)
 		if err == nil {
-			conf := Config{GoVersion: goVersion, Importer: stdLibImporter}
+			conf := Config{
+				GoVersion: goVersion,
+				Importer:  stdLibImporter,
+			}
 			_, err = conf.Check(filename, []*syntax.File{file}, nil)
 		}
 
@@ -222,39 +349,56 @@
 var excluded = map[string]bool{
 	"builtin": true,
 
-	// See #46027: some imports are missing for this submodule.
+	// go.dev/issue/46027: some imports are missing for this submodule.
 	"crypto/internal/edwards25519/field/_asm": true,
 	"crypto/internal/bigmod/_asm":             true,
 }
 
+// printPackageMu synchronizes the printing of type-checked package files in
+// the typecheckFiles function.
+//
+// Without synchronization, package files may be interleaved during concurrent
+// type-checking.
+var printPackageMu sync.Mutex
+
 // typecheckFiles typechecks the given package files.
-func typecheckFiles(t *testing.T, path string, filenames []string) {
-	// parse package files
+func typecheckFiles(path string, filenames []string, importer Importer) (*Package, error) {
+	// Parse package files.
 	var files []*syntax.File
 	for _, filename := range filenames {
-		errh := func(err error) { t.Error(err) }
+		var errs []error
+		errh := func(err error) { errs = append(errs, err) }
 		file, err := syntax.ParseFile(filename, errh, nil, 0)
 		if err != nil {
-			return
-		}
-
-		if testing.Verbose() {
-			if len(files) == 0 {
-				fmt.Println("package", file.PkgName.Value)
-			}
-			fmt.Println("\t", filename)
+			return nil, errors.Join(errs...)
 		}
 
 		files = append(files, file)
 	}
 
-	// typecheck package files
+	if testing.Verbose() {
+		printPackageMu.Lock()
+		fmt.Println("package", files[0].PkgName.Value)
+		for _, filename := range filenames {
+			fmt.Println("\t", filename)
+		}
+		printPackageMu.Unlock()
+	}
+
+	// Typecheck package files.
+	var errs []error
 	conf := Config{
-		Error:    func(err error) { t.Error(err) },
-		Importer: stdLibImporter,
+		Error: func(err error) {
+			errs = append(errs, err)
+		},
+		Importer: importer,
 	}
 	info := Info{Uses: make(map[*syntax.Name]Object)}
-	conf.Check(path, files, &info)
+	pkg, _ := conf.Check(path, files, &info)
+	err := errors.Join(errs...)
+	if err != nil {
+		return pkg, err
+	}
 
 	// Perform checks of API invariants.
 
@@ -265,16 +409,18 @@
 		if predeclared == (obj.Pkg() != nil) {
 			posn := id.Pos()
 			if predeclared {
-				t.Errorf("%s: predeclared object with package: %s", posn, obj)
+				return nil, fmt.Errorf("%s: predeclared object with package: %s", posn, obj)
 			} else {
-				t.Errorf("%s: user-defined object without package: %s", posn, obj)
+				return nil, fmt.Errorf("%s: user-defined object without package: %s", posn, obj)
 			}
 		}
 	}
+
+	return pkg, nil
 }
 
 // pkgFilenames returns the list of package filenames for the given directory.
-func pkgFilenames(dir string) ([]string, error) {
+func pkgFilenames(dir string, includeTest bool) ([]string, error) {
 	ctxt := build.Default
 	ctxt.CgoEnabled = false
 	pkg, err := ctxt.ImportDir(dir, 0)
@@ -291,31 +437,25 @@
 	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))
+	if includeTest {
+		for _, name := range pkg.TestGoFiles {
+			filenames = append(filenames, filepath.Join(pkg.Dir, name))
+		}
 	}
 	return filenames, nil
 }
 
-func walkPkgDirs(dir string, pkgh func(dir string, filenames []string), errh func(args ...interface{})) time.Duration {
-	w := walker{time.Now(), 10 * time.Millisecond, pkgh, errh}
+func walkPkgDirs(dir string, pkgh func(dir string, filenames []string), errh func(args ...interface{})) {
+	w := walker{pkgh, errh}
 	w.walk(dir)
-	return time.Since(w.start)
 }
 
 type walker struct {
-	start time.Time
-	dmax  time.Duration
-	pkgh  func(dir string, filenames []string)
-	errh  func(args ...interface{})
+	pkgh func(dir string, filenames []string)
+	errh func(args ...any)
 }
 
 func (w *walker) walk(dir string) {
-	// limit run time for short tests
-	if testing.Short() && time.Since(w.start) >= w.dmax {
-		return
-	}
-
 	files, err := os.ReadDir(dir)
 	if err != nil {
 		w.errh(err)
@@ -323,7 +463,9 @@
 	}
 
 	// apply pkgh to the files in directory dir
-	pkgFiles, err := pkgFilenames(dir)
+
+	// Don't get test files as these packages are imported.
+	pkgFiles, err := pkgFilenames(dir, false)
 	if err != nil {
 		w.errh(err)
 		return
diff --git a/src/cmd/compile/internal/types2/stmt.go b/src/cmd/compile/internal/types2/stmt.go
index 9edcaa1..f13ab69 100644
--- a/src/cmd/compile/internal/types2/stmt.go
+++ b/src/cmd/compile/internal/types2/stmt.go
@@ -64,7 +64,7 @@
 		}
 	}
 	sort.Slice(unused, func(i, j int) bool {
-		return unused[i].pos.Cmp(unused[j].pos) < 0
+		return cmpPos(unused[i].pos, unused[j].pos) < 0
 	})
 	for _, v := range unused {
 		check.softErrorf(v.pos, UnusedVar, "%s declared and not used", v.name)
@@ -180,7 +180,7 @@
 
 	var x operand
 	var msg string
-	switch check.rawExpr(&x, call, nil, false) {
+	switch check.rawExpr(nil, &x, call, nil, false) {
 	case conversion:
 		msg = "requires function call, not conversion"
 	case expression:
@@ -240,7 +240,7 @@
 L:
 	for _, e := range values {
 		var v operand
-		check.expr(&v, e)
+		check.expr(nil, &v, e)
 		if x.mode == invalid || v.mode == invalid {
 			continue L
 		}
@@ -294,7 +294,7 @@
 		// The spec allows the value nil instead of a type.
 		if check.isNil(e) {
 			T = nil
-			check.expr(&dummy, e) // run e through expr so we get the usual Info recordings
+			check.expr(nil, &dummy, e) // run e through expr so we get the usual Info recordings
 		} else {
 			T = check.varType(e)
 			if T == Typ[Invalid] {
@@ -336,7 +336,7 @@
 // 		// The spec allows the value nil instead of a type.
 // 		var hash string
 // 		if check.isNil(e) {
-// 			check.expr(&dummy, e) // run e through expr so we get the usual Info recordings
+// 			check.expr(nil, &dummy, e) // run e through expr so we get the usual Info recordings
 // 			T = nil
 // 			hash = "<nil>" // avoid collision with a type named nil
 // 		} else {
@@ -403,7 +403,7 @@
 		// 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, false)
+		kind := check.rawExpr(nil, &x, s.X, nil, false)
 		var msg string
 		var code Code
 		switch x.mode {
@@ -424,8 +424,8 @@
 
 	case *syntax.SendStmt:
 		var ch, val operand
-		check.expr(&ch, s.Chan)
-		check.expr(&val, s.Value)
+		check.expr(nil, &ch, s.Chan)
+		check.expr(nil, &val, s.Value)
 		if ch.mode == invalid || val.mode == invalid {
 			return
 		}
@@ -446,26 +446,23 @@
 		check.assignment(&val, uch.elem, "send")
 
 	case *syntax.AssignStmt:
-		lhs := unpackExpr(s.Lhs)
 		if s.Rhs == nil {
 			// x++ or x--
-			if len(lhs) != 1 {
-				check.errorf(s, InvalidSyntaxTree, "%s%s requires one operand", s.Op, s.Op)
-				return
-			}
+			// (no need to call unpackExpr as s.Lhs must be single-valued)
 			var x operand
-			check.expr(&x, lhs[0])
+			check.expr(nil, &x, s.Lhs)
 			if x.mode == invalid {
 				return
 			}
 			if !allNumeric(x.typ) {
-				check.errorf(lhs[0], NonNumericIncDec, invalidOp+"%s%s%s (non-numeric type %s)", lhs[0], s.Op, s.Op, x.typ)
+				check.errorf(s.Lhs, NonNumericIncDec, invalidOp+"%s%s%s (non-numeric type %s)", s.Lhs, s.Op, s.Op, x.typ)
 				return
 			}
-			check.assignVar(lhs[0], &x)
+			check.assignVar(s.Lhs, nil, &x)
 			return
 		}
 
+		lhs := unpackExpr(s.Lhs)
 		rhs := unpackExpr(s.Rhs)
 		switch s.Op {
 		case 0:
@@ -484,7 +481,7 @@
 
 		var x operand
 		check.binary(&x, nil, lhs[0], rhs[0], s.Op)
-		check.assignVar(lhs[0], &x)
+		check.assignVar(lhs[0], nil, &x)
 
 	case *syntax.CallStmt:
 		kind := "go"
@@ -569,7 +566,7 @@
 
 		check.simpleStmt(s.Init)
 		var x operand
-		check.expr(&x, s.Cond)
+		check.expr(nil, &x, s.Cond)
 		if x.mode != invalid && !allBoolean(x.typ) {
 			check.error(s.Cond, InvalidCond, "non-boolean condition in if statement")
 		}
@@ -659,7 +656,7 @@
 		check.simpleStmt(s.Init)
 		if s.Cond != nil {
 			var x operand
-			check.expr(&x, s.Cond)
+			check.expr(nil, &x, s.Cond)
 			if x.mode != invalid && !allBoolean(x.typ) {
 				check.error(s.Cond, InvalidCond, "non-boolean condition in for statement")
 			}
@@ -683,7 +680,7 @@
 
 	var x operand
 	if s.Tag != nil {
-		check.expr(&x, s.Tag)
+		check.expr(nil, &x, s.Tag)
 		// By checking assignment of x to an invisible temporary
 		// (as a compiler would), we get all the relevant checks.
 		check.assignment(&x, nil, "switch expression")
@@ -750,7 +747,7 @@
 
 	// check rhs
 	var x operand
-	check.expr(&x, guard.X)
+	check.expr(nil, &x, guard.X)
 	if x.mode == invalid {
 		return
 	}
@@ -796,7 +793,7 @@
 			}
 			obj := NewVar(lhs.Pos(), check.pkg, lhs.Value, T)
 			// TODO(mdempsky): Just use clause.Colon? Why did I even suggest
-			// "at the end of the TypeSwitchCase" in #16794 instead?
+			// "at the end of the TypeSwitchCase" in go.dev/issue/16794 instead?
 			scopePos := clause.Pos() // for default clause (len(List) == 0)
 			if n := len(cases); n > 0 {
 				scopePos = syntax.EndPos(cases[n-1])
@@ -850,7 +847,7 @@
 
 	// check expression to iterate over
 	var x operand
-	check.expr(&x, rclause.X)
+	check.expr(nil, &x, rclause.X)
 
 	// determine key/value types
 	var key, val Type
@@ -887,7 +884,7 @@
 	}
 
 	// Open the for-statement block scope now, after the range clause.
-	// Iteration variables declared with := need to go in this scope (was issue #51437).
+	// Iteration variables declared with := need to go in this scope (was go.dev/issue/51437).
 	check.openScope(s, "range")
 	defer check.closeScope()
 
@@ -953,7 +950,7 @@
 				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.assignVar(lhs, nil, &x)
 			}
 		}
 	}
diff --git a/src/cmd/compile/internal/types2/struct.go b/src/cmd/compile/internal/types2/struct.go
index 5e93cb9..125e946 100644
--- a/src/cmd/compile/internal/types2/struct.go
+++ b/src/cmd/compile/internal/types2/struct.go
@@ -100,7 +100,7 @@
 	// addInvalid adds an embedded field of invalid type to the struct for
 	// fields with errors; this keeps the number of struct fields in sync
 	// with the source as long as the fields are _ or have different names
-	// (issue #25627).
+	// (go.dev/issue/25627).
 	addInvalid := func(ident *syntax.Name, pos syntax.Pos) {
 		typ = Typ[Invalid]
 		tag = ""
@@ -127,7 +127,7 @@
 			// 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."
-			pos := syntax.StartPos(f.Type)
+			pos := syntax.StartPos(f.Type) // position of type, for errors
 			name := embeddedFieldIdent(f.Type)
 			if name == nil {
 				check.errorf(pos, InvalidSyntaxTree, "invalid embedded field type %s", f.Type)
@@ -135,7 +135,7 @@
 				addInvalid(name, pos)
 				continue
 			}
-			add(name, true, pos)
+			add(name, true, name.Pos()) // struct{p.T} field has position of T
 
 			// Because we have a name, typ must be of the form T or *T, where T is the name
 			// of a (named or alias) type, and t (= deref(typ)) must be the type of T.
diff --git a/src/cmd/compile/internal/types2/testdata/local/issue47996.go b/src/cmd/compile/internal/types2/testdata/local/issue47996.go
index 2c4b661..375a931 100644
--- a/src/cmd/compile/internal/types2/testdata/local/issue47996.go
+++ b/src/cmd/compile/internal/types2/testdata/local/issue47996.go
@@ -5,4 +5,4 @@
 package p
 
 // don't crash
-func T /* ERROR missing */ [P] /* ERROR missing */ m /* ERROR unexpected */ () /* ERROR \) */ { /* ERROR { */ } /* ERROR } */
+func T /* ERROR "missing" */ [P] /* ERROR "missing" */ m /* ERROR "unexpected" */ () /* ERROR ")" */ { /* ERROR "{" */ } /* ERROR "}" */
diff --git a/src/cmd/compile/internal/types2/testdata/manual.go b/src/cmd/compile/internal/types2/testdata/manual.go
index 96d4ba6..57dcc22 100644
--- a/src/cmd/compile/internal/types2/testdata/manual.go
+++ b/src/cmd/compile/internal/types2/testdata/manual.go
@@ -1,4 +1,4 @@
-// Copyright 2022 The Go Authors. All rights reserved.
+// Copyright 2023 The Go Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
diff --git a/src/cmd/compile/internal/types2/type.go b/src/cmd/compile/internal/types2/type.go
index 92ecf11..bd19421 100644
--- a/src/cmd/compile/internal/types2/type.go
+++ b/src/cmd/compile/internal/types2/type.go
@@ -9,112 +9,3 @@
 // A Type represents a type of Go.
 // All types implement the Type interface.
 type Type = syntax.Type
-
-// under returns the true expanded underlying type.
-// If it doesn't exist, the result is Typ[Invalid].
-// under must only be called when a type is known
-// to be fully set up.
-func under(t Type) Type {
-	if t, _ := t.(*Named); t != nil {
-		return t.under()
-	}
-	return t.Underlying()
-}
-
-// If t is not a type parameter, coreType returns the underlying type.
-// If t is a type parameter, coreType returns the single underlying
-// type of all types in its type set if it exists, or nil otherwise. If the
-// type set contains only unrestricted and restricted channel types (with
-// identical element types), the single underlying type is the restricted
-// channel type if the restrictions are always the same, or nil otherwise.
-func coreType(t Type) Type {
-	tpar, _ := t.(*TypeParam)
-	if tpar == nil {
-		return under(t)
-	}
-
-	var su Type
-	if tpar.underIs(func(u Type) bool {
-		if u == nil {
-			return false
-		}
-		if su != nil {
-			u = match(su, u)
-			if u == nil {
-				return false
-			}
-		}
-		// su == nil || match(su, u) != nil
-		su = u
-		return true
-	}) {
-		return su
-	}
-	return nil
-}
-
-// coreString is like coreType but also considers []byte
-// and strings as identical. In this case, if successful and we saw
-// a string, the result is of type (possibly untyped) string.
-func coreString(t Type) Type {
-	tpar, _ := t.(*TypeParam)
-	if tpar == nil {
-		return under(t) // string or untyped string
-	}
-
-	var su Type
-	hasString := false
-	if tpar.underIs(func(u Type) bool {
-		if u == nil {
-			return false
-		}
-		if isString(u) {
-			u = NewSlice(universeByte)
-			hasString = true
-		}
-		if su != nil {
-			u = match(su, u)
-			if u == nil {
-				return false
-			}
-		}
-		// su == nil || match(su, u) != nil
-		su = u
-		return true
-	}) {
-		if hasString {
-			return Typ[String]
-		}
-		return su
-	}
-	return nil
-}
-
-// If x and y are identical, match returns x.
-// If x and y are identical channels but for their direction
-// and one of them is unrestricted, match returns the channel
-// with the restricted direction.
-// In all other cases, match returns nil.
-func match(x, y Type) Type {
-	// Common case: we don't have channels.
-	if Identical(x, y) {
-		return x
-	}
-
-	// We may have channels that differ in direction only.
-	if x, _ := x.(*Chan); x != nil {
-		if y, _ := y.(*Chan); y != nil && Identical(x.elem, y.elem) {
-			// We have channels that differ in direction only.
-			// If there's an unrestricted channel, select the restricted one.
-			switch {
-			case x.dir == SendRecv:
-				return y
-			case y.dir == SendRecv:
-				return x
-			}
-		}
-	}
-
-	// types are different
-	return nil
-}
diff --git a/src/cmd/compile/internal/types2/typeparam.go b/src/cmd/compile/internal/types2/typeparam.go
index 2e9a2ad..aebbec2 100644
--- a/src/cmd/compile/internal/types2/typeparam.go
+++ b/src/cmd/compile/internal/types2/typeparam.go
@@ -24,9 +24,6 @@
 	bound Type      // any type, but underlying is eventually *Interface for correct programs (see TypeParam.iface)
 }
 
-// Obj returns the type name for the type parameter t.
-func (t *TypeParam) Obj() *TypeName { return t.obj }
-
 // NewTypeParam returns a new TypeParam. Type parameters may be set on a Named
 // or Signature type by calling SetTypeParams. Setting a type parameter on more
 // than one type will result in a panic.
@@ -59,6 +56,9 @@
 	return typ
 }
 
+// Obj returns the type name for the type parameter t.
+func (t *TypeParam) Obj() *TypeName { return t.obj }
+
 // Index returns the index of the type param within its param list, or -1 if
 // the type parameter has not yet been bound to a type.
 func (t *TypeParam) Index() int {
diff --git a/src/cmd/compile/internal/types2/typeset.go b/src/cmd/compile/internal/types2/typeset.go
index 673cadc..70b9e36 100644
--- a/src/cmd/compile/internal/types2/typeset.go
+++ b/src/cmd/compile/internal/types2/typeset.go
@@ -6,7 +6,6 @@
 
 import (
 	"cmd/compile/internal/syntax"
-	"fmt"
 	. "internal/types/errors"
 	"sort"
 	"strings"
@@ -204,7 +203,7 @@
 	// the method m in an interface that embeds interface I. On the other hand,
 	// if a method is embedded via multiple overlapping embedded interfaces, we
 	// don't provide a guarantee which "original m" got chosen for the embedding
-	// interface. See also issue #34421.
+	// interface. See also go.dev/issue/34421.
 	//
 	// If we don't care to provide this identity guarantee anymore, instead of
 	// reusing the original method in embeddings, we can clone the method's Func
@@ -212,7 +211,6 @@
 	// we can get rid of the mpos map below and simply use the cloned method's
 	// position.
 
-	var todo []*Func
 	var seen objset
 	var allMethods []*Func
 	mpos := make(map[*Func]syntax.Pos) // method specification or method embedding position, for good error messages
@@ -222,36 +220,30 @@
 			allMethods = append(allMethods, m)
 			mpos[m] = pos
 		case explicit:
-			if check == nil {
-				panic(fmt.Sprintf("%s: duplicate method %s", m.pos, m.name))
+			if check != nil {
+				var err error_
+				err.code = DuplicateDecl
+				err.errorf(pos, "duplicate method %s", m.name)
+				err.errorf(mpos[other.(*Func)], "other declaration of %s", m.name)
+				check.report(&err)
 			}
-			// check != nil
-			var err error_
-			err.code = DuplicateDecl
-			err.errorf(pos, "duplicate method %s", m.name)
-			err.errorf(mpos[other.(*Func)], "other declaration of %s", m.name)
-			check.report(&err)
 		default:
 			// We have a duplicate method name in an embedded (not explicitly declared) method.
-			// Check method signatures after all types are computed (issue #33656).
+			// Check method signatures after all types are computed (go.dev/issue/33656).
 			// If we're pre-go1.14 (overlapping embeddings are not permitted), report that
 			// error here as well (even though we could do it eagerly) because it's the same
 			// error message.
-			if check == nil {
-				// check method signatures after all locally embedded interfaces are computed
-				todo = append(todo, m, other.(*Func))
-				break
+			if check != nil {
+				check.later(func() {
+					if !check.allowVersion(m.pkg, pos, go1_14) || !Identical(m.typ, other.Type()) {
+						var err error_
+						err.code = DuplicateDecl
+						err.errorf(pos, "duplicate method %s", m.name)
+						err.errorf(mpos[other.(*Func)], "other declaration of %s", m.name)
+						check.report(&err)
+					}
+				}).describef(pos, "duplicate method check for %s", m.name)
 			}
-			// check != nil
-			check.later(func() {
-				if !check.allowVersion(m.pkg, 1, 14) || !Identical(m.typ, other.Type()) {
-					var err error_
-					err.code = DuplicateDecl
-					err.errorf(pos, "duplicate method %s", m.name)
-					err.errorf(mpos[other.(*Func)], "other declaration of %s", m.name)
-					check.report(&err)
-				}
-			}).describef(pos, "duplicate method check for %s", m.name)
 		}
 	}
 
@@ -278,8 +270,7 @@
 			assert(!isTypeParam(typ))
 			tset := computeInterfaceTypeSet(check, pos, u)
 			// If typ is local, an error was already reported where typ is specified/defined.
-			if check != nil && check.isImportedConstraint(typ) && !check.allowVersion(check.pkg, 1, 18) {
-				check.versionErrorf(pos, "go1.18", "embedding constraint interface %s", typ)
+			if check != nil && check.isImportedConstraint(typ) && !check.verifyVersionf(pos, go1_18, "embedding constraint interface %s", typ) {
 				continue
 			}
 			comparable = tset.comparable
@@ -288,8 +279,7 @@
 			}
 			terms = tset.terms
 		case *Union:
-			if check != nil && !check.allowVersion(check.pkg, 1, 18) {
-				check.versionErrorf(pos, "go1.18", "embedding interface element %s", u)
+			if check != nil && !check.verifyVersionf(pos, go1_18, "embedding interface element %s", u) {
 				continue
 			}
 			tset := computeUnionTypeSet(check, unionSets, pos, u)
@@ -303,8 +293,7 @@
 			if u == Typ[Invalid] {
 				continue
 			}
-			if check != nil && !check.allowVersion(check.pkg, 1, 18) {
-				check.versionErrorf(pos, "go1.18", "embedding non-interface type %s", typ)
+			if check != nil && !check.verifyVersionf(pos, go1_18, "embedding non-interface type %s", typ) {
 				continue
 			}
 			terms = termlist{{false, typ}}
@@ -317,15 +306,6 @@
 	}
 	ityp.embedPos = nil // not needed anymore (errors have been reported)
 
-	// process todo's (this only happens if check == nil)
-	for i := 0; i < len(todo); i += 2 {
-		m := todo[i]
-		other := todo[i+1]
-		if !Identical(m.typ, other.typ) {
-			panic(fmt.Sprintf("%s: duplicate method %s", m.pos, m.name))
-		}
-	}
-
 	ityp.tset.comparable = allComparable
 	if len(allMethods) != 0 {
 		sortMethods(allMethods)
diff --git a/src/cmd/compile/internal/types2/typestring.go b/src/cmd/compile/internal/types2/typestring.go
index 2307b61..2f4fb52 100644
--- a/src/cmd/compile/internal/types2/typestring.go
+++ b/src/cmd/compile/internal/types2/typestring.go
@@ -160,7 +160,7 @@
 
 			// This doesn't do the right thing for embedded type
 			// aliases where we should print the alias name, not
-			// the aliased type (see issue #44410).
+			// the aliased type (see go.dev/issue/44410).
 			if !f.embedded {
 				w.string(f.name)
 				w.byte(' ')
@@ -317,6 +317,13 @@
 			if w.tpSubscripts || w.ctxt != nil {
 				w.string(subscript(t.id))
 			}
+			// If the type parameter name is the same as a predeclared object
+			// (say int), point out where it is declared to avoid confusing
+			// error messages. This doesn't need to be super-elegant; we just
+			// need a clear indication that this is not a predeclared name.
+			if w.ctxt == nil && Universe.Lookup(t.obj.name) != nil {
+				w.string(sprintf(nil, false, " /* with %s declared at %s */", t.obj.name, t.obj.Pos()))
+			}
 		}
 
 	default:
diff --git a/src/cmd/compile/internal/types2/typestring_test.go b/src/cmd/compile/internal/types2/typestring_test.go
index 7dd9b35..c2be40d 100644
--- a/src/cmd/compile/internal/types2/typestring_test.go
+++ b/src/cmd/compile/internal/types2/typestring_test.go
@@ -118,7 +118,7 @@
 
 	for _, test := range tests {
 		src := `package generic_p; import "io"; type _ io.Writer; type T ` + test.src
-		pkg, err := typecheck(filename, src, nil)
+		pkg, err := typecheck(src, nil, nil)
 		if err != nil {
 			t.Errorf("%s: %s", src, err)
 			continue
@@ -136,8 +136,8 @@
 }
 
 func TestQualifiedTypeString(t *testing.T) {
-	p := mustTypecheck("p.go", "package p; type T int", nil)
-	q := mustTypecheck("q.go", "package q", nil)
+	p := mustTypecheck("package p; type T int", nil, nil)
+	q := mustTypecheck("package q", nil, nil)
 
 	pT := p.Scope().Lookup("T").Type()
 	for _, test := range []struct {
diff --git a/src/cmd/compile/internal/types2/typexpr.go b/src/cmd/compile/internal/types2/typexpr.go
index 0f3106d..ca717fe 100644
--- a/src/cmd/compile/internal/types2/typexpr.go
+++ b/src/cmd/compile/internal/types2/typexpr.go
@@ -42,8 +42,7 @@
 		}
 		return
 	case universeAny, universeComparable:
-		if !check.allowVersion(check.pkg, 1, 18) {
-			check.versionErrorf(e, "go1.18", "predeclared %s", e.Value)
+		if !check.verifyVersionf(e, go1_18, "predeclared %s", e.Value) {
 			return // avoid follow-on errors
 		}
 	}
@@ -56,7 +55,7 @@
 	// a cycle which needs to be reported). Otherwise we can skip the
 	// call and avoid a possible cycle error in favor of the more
 	// informative "not a type/value" error that this function's caller
-	// will issue (see issue #25790).
+	// will issue (see go.dev/issue/25790).
 	typ := obj.Type()
 	if _, gotType := obj.(*TypeName); typ == nil || gotType && wantType {
 		check.objDecl(obj, def)
@@ -96,7 +95,7 @@
 
 	case *TypeName:
 		if check.isBrokenAlias(obj) {
-			check.errorf(e, InvalidDeclCycle, "invalid use of type alias %s in recursive type (see issue #50729)", obj.name)
+			check.errorf(e, InvalidDeclCycle, "invalid use of type alias %s in recursive type (see go.dev/issue/50729)", obj.name)
 			return
 		}
 		x.mode = typexpr
@@ -272,9 +271,7 @@
 		}
 
 	case *syntax.IndexExpr:
-		if !check.allowVersion(check.pkg, 1, 18) {
-			check.versionErrorf(e.Pos(), "go1.18", "type instantiation")
-		}
+		check.verifyVersionf(e, go1_18, "type instantiation")
 		return check.instantiatedType(e.X, unpackExpr(e.Index), def)
 
 	case *syntax.ParenExpr:
@@ -325,7 +322,7 @@
 			// If typ.base is invalid, it's unlikely that *base is particularly
 			// useful - even a valid dereferenciation will lead to an invalid
 			// type again, and in some cases we get unexpected follow-on errors
-			// (e.g., see #49005). Return an invalid type instead.
+			// (e.g., go.dev/issue/49005). Return an invalid type instead.
 			if typ.base == Typ[Invalid] {
 				return Typ[Invalid]
 			}
@@ -359,7 +356,7 @@
 		// function, map, or slice."
 		//
 		// Delay this check because it requires fully setup types;
-		// it is safe to continue in any case (was issue 6667).
+		// it is safe to continue in any case (was go.dev/issue/6667).
 		check.later(func() {
 			if !Comparable(typ.key) {
 				var why string
@@ -489,7 +486,7 @@
 	}
 
 	var x operand
-	check.expr(&x, e)
+	check.expr(nil, &x, e)
 	if x.mode != constant_ {
 		if x.mode != invalid {
 			check.errorf(&x, InvalidArrayLen, "array length %s must be constant", &x)
@@ -503,13 +500,17 @@
 				if n, ok := constant.Int64Val(val); ok && n >= 0 {
 					return n
 				}
-				check.errorf(&x, InvalidArrayLen, "invalid array length %s", &x)
-				return -1
 			}
 		}
 	}
 
-	check.errorf(&x, InvalidArrayLen, "array length %s must be integer", &x)
+	var msg string
+	if isInteger(x.typ) {
+		msg = "invalid array length %s"
+	} else {
+		msg = "array length %s must be integer"
+	}
+	check.errorf(&x, InvalidArrayLen, msg, &x)
 	return -1
 }
 
diff --git a/src/cmd/compile/internal/types2/under.go b/src/cmd/compile/internal/types2/under.go
new file mode 100644
index 0000000..887f781
--- /dev/null
+++ b/src/cmd/compile/internal/types2/under.go
@@ -0,0 +1,114 @@
+// Copyright 2011 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package types2
+
+// under returns the true expanded underlying type.
+// If it doesn't exist, the result is Typ[Invalid].
+// under must only be called when a type is known
+// to be fully set up.
+func under(t Type) Type {
+	if t, _ := t.(*Named); t != nil {
+		return t.under()
+	}
+	return t.Underlying()
+}
+
+// If t is not a type parameter, coreType returns the underlying type.
+// If t is a type parameter, coreType returns the single underlying
+// type of all types in its type set if it exists, or nil otherwise. If the
+// type set contains only unrestricted and restricted channel types (with
+// identical element types), the single underlying type is the restricted
+// channel type if the restrictions are always the same, or nil otherwise.
+func coreType(t Type) Type {
+	tpar, _ := t.(*TypeParam)
+	if tpar == nil {
+		return under(t)
+	}
+
+	var su Type
+	if tpar.underIs(func(u Type) bool {
+		if u == nil {
+			return false
+		}
+		if su != nil {
+			u = match(su, u)
+			if u == nil {
+				return false
+			}
+		}
+		// su == nil || match(su, u) != nil
+		su = u
+		return true
+	}) {
+		return su
+	}
+	return nil
+}
+
+// coreString is like coreType but also considers []byte
+// and strings as identical. In this case, if successful and we saw
+// a string, the result is of type (possibly untyped) string.
+func coreString(t Type) Type {
+	tpar, _ := t.(*TypeParam)
+	if tpar == nil {
+		return under(t) // string or untyped string
+	}
+
+	var su Type
+	hasString := false
+	if tpar.underIs(func(u Type) bool {
+		if u == nil {
+			return false
+		}
+		if isString(u) {
+			u = NewSlice(universeByte)
+			hasString = true
+		}
+		if su != nil {
+			u = match(su, u)
+			if u == nil {
+				return false
+			}
+		}
+		// su == nil || match(su, u) != nil
+		su = u
+		return true
+	}) {
+		if hasString {
+			return Typ[String]
+		}
+		return su
+	}
+	return nil
+}
+
+// If x and y are identical, match returns x.
+// If x and y are identical channels but for their direction
+// and one of them is unrestricted, match returns the channel
+// with the restricted direction.
+// In all other cases, match returns nil.
+func match(x, y Type) Type {
+	// Common case: we don't have channels.
+	if Identical(x, y) {
+		return x
+	}
+
+	// We may have channels that differ in direction only.
+	if x, _ := x.(*Chan); x != nil {
+		if y, _ := y.(*Chan); y != nil && Identical(x.elem, y.elem) {
+			// We have channels that differ in direction only.
+			// If there's an unrestricted channel, select the restricted one.
+			switch {
+			case x.dir == SendRecv:
+				return y
+			case y.dir == SendRecv:
+				return x
+			}
+		}
+	}
+
+	// types are different
+	return nil
+}
diff --git a/src/cmd/compile/internal/types2/unify.go b/src/cmd/compile/internal/types2/unify.go
index 7063789..4e9c771 100644
--- a/src/cmd/compile/internal/types2/unify.go
+++ b/src/cmd/compile/internal/types2/unify.go
@@ -3,40 +3,45 @@
 // license that can be found in the LICENSE file.
 
 // This file implements type unification.
+//
+// Type unification attempts to make two types x and y structurally
+// equivalent by determining the types for a given list of (bound)
+// type parameters which may occur within x and y. If x and y are
+// structurally different (say []T vs chan T), or conflicting
+// types are determined for type parameters, unification fails.
+// If unification succeeds, as a side-effect, the types of the
+// bound type parameters may be determined.
+//
+// Unification typically requires multiple calls u.unify(x, y) to
+// a given unifier u, with various combinations of types x and y.
+// In each call, additional type parameter types may be determined
+// as a side effect and recorded in u.
+// If a call fails (returns false), unification fails.
+//
+// In the unification context, structural equivalence of two types
+// ignores the difference between a defined type and its underlying
+// type if one type is a defined type and the other one is not.
+// It also ignores the difference between an (external, unbound)
+// type parameter and its core type.
+// If two types are not structurally equivalent, they cannot be Go
+// identical types. On the other hand, if they are structurally
+// equivalent, they may be Go identical or at least assignable, or
+// they may be in the type set of a constraint.
+// Whether they indeed are identical or assignable is determined
+// upon instantiation and function argument passing.
 
 package types2
 
 import (
 	"bytes"
 	"fmt"
+	"sort"
 	"strings"
 )
 
-// The unifier maintains two separate sets of type parameters x and y
-// which are used to resolve type parameters in the x and y arguments
-// provided to the unify call. For unidirectional unification, only
-// one of these sets (say x) is provided, and then type parameters are
-// only resolved for the x argument passed to unify, not the y argument
-// (even if that also contains possibly the same type parameters). This
-// is crucial to infer the type parameters of self-recursive calls:
-//
-//	func f[P any](a P) { f(a) }
-//
-// For the call f(a) we want to infer that the type argument for P is P.
-// During unification, the parameter type P must be resolved to the type
-// parameter P ("x" side), but the argument type P must be left alone so
-// that unification resolves the type parameter P to P.
-//
-// For bidirectional unification, both sets are provided. This enables
-// unification to go from argument to parameter type and vice versa.
-// For constraint type inference, we use bidirectional unification
-// where both the x and y type parameters are identical. This is done
-// by setting up one of them (using init) and then assigning its value
-// to the other.
-
 const (
 	// Upper limit for recursion depth. Used to catch infinite recursions
-	// due to implementation issues (e.g., see issues #48619, #48656).
+	// due to implementation issues (e.g., see issues go.dev/issue/48619, go.dev/issue/48656).
 	unificationDepthLimit = 50
 
 	// Whether to panic when unificationDepthLimit is reached.
@@ -58,239 +63,241 @@
 	traceInference = false
 )
 
-// A unifier maintains the current type parameters for x and y
-// and the respective types inferred for each type parameter.
+// A unifier maintains a list of type parameters and
+// corresponding types inferred for each type parameter.
 // A unifier is created by calling newUnifier.
 type unifier struct {
-	exact bool
-	x, y  tparamsList // x and y must initialized via tparamsList.init
-	types []Type      // inferred types, shared by x and y
-	depth int         // recursion depth during unification
+	// handles maps each type parameter to its inferred type through
+	// an indirection *Type called (inferred type) "handle".
+	// Initially, each type parameter has its own, separate handle,
+	// with a nil (i.e., not yet inferred) type.
+	// After a type parameter P is unified with a type parameter Q,
+	// P and Q share the same handle (and thus type). This ensures
+	// that inferring the type for a given type parameter P will
+	// automatically infer the same type for all other parameters
+	// unified (joined) with P.
+	handles                  map[*TypeParam]*Type
+	depth                    int  // recursion depth during unification
+	enableInterfaceInference bool // use shared methods for better inference
 }
 
-// newUnifier returns a new unifier.
-// If exact is set, unification requires unified types to match
-// exactly. If exact is not set, a named type's underlying type
-// is considered if unification would fail otherwise, and the
-// direction of channels is ignored.
-// TODO(gri) exact is not set anymore by a caller. Consider removing it.
-func newUnifier(exact bool) *unifier {
-	u := &unifier{exact: exact}
-	u.x.unifier = u
-	u.y.unifier = u
-	return u
+// newUnifier returns a new unifier initialized with the given type parameter
+// and corresponding type argument lists. The type argument list may be shorter
+// than the type parameter list, and it may contain nil types. Matching type
+// parameters and arguments must have the same index.
+func newUnifier(tparams []*TypeParam, targs []Type, enableInterfaceInference bool) *unifier {
+	assert(len(tparams) >= len(targs))
+	handles := make(map[*TypeParam]*Type, len(tparams))
+	// Allocate all handles up-front: in a correct program, all type parameters
+	// must be resolved and thus eventually will get a handle.
+	// Also, sharing of handles caused by unified type parameters is rare and
+	// so it's ok to not optimize for that case (and delay handle allocation).
+	for i, x := range tparams {
+		var t Type
+		if i < len(targs) {
+			t = targs[i]
+		}
+		handles[x] = &t
+	}
+	return &unifier{handles, 0, enableInterfaceInference}
+}
+
+// unifyMode controls the behavior of the unifier.
+type unifyMode uint
+
+const (
+	// If assign is set, we are unifying types involved in an assignment:
+	// they may match inexactly at the top, but element types must match
+	// exactly.
+	assign unifyMode = 1 << iota
+
+	// If exact is set, types unify if they are identical (or can be
+	// made identical with suitable arguments for type parameters).
+	// Otherwise, a named type and a type literal unify if their
+	// underlying types unify, channel directions are ignored, and
+	// if there is an interface, the other type must implement the
+	// interface.
+	exact
+)
+
+func (m unifyMode) String() string {
+	switch m {
+	case 0:
+		return "inexact"
+	case assign:
+		return "assign"
+	case exact:
+		return "exact"
+	case assign | exact:
+		return "assign, exact"
+	}
+	return fmt.Sprintf("mode %d", m)
 }
 
 // unify attempts to unify x and y and reports whether it succeeded.
-func (u *unifier) unify(x, y Type) bool {
-	return u.nify(x, y, nil)
+// As a side-effect, types may be inferred for type parameters.
+// The mode parameter controls how types are compared.
+func (u *unifier) unify(x, y Type, mode unifyMode) bool {
+	return u.nify(x, y, mode, nil)
 }
 
 func (u *unifier) tracef(format string, args ...interface{}) {
 	fmt.Println(strings.Repeat(".  ", u.depth) + sprintf(nil, true, format, args...))
 }
 
-// A tparamsList describes a list of type parameters and the types inferred for them.
-type tparamsList struct {
-	unifier *unifier
-	tparams []*TypeParam
-	// For each tparams element, there is a corresponding type slot index in indices.
-	// index  < 0: unifier.types[-index-1] == nil
-	// index == 0: no type slot allocated yet
-	// index  > 0: unifier.types[index-1] == typ
-	// Joined tparams elements share the same type slot and thus have the same index.
-	// By using a negative index for nil types we don't need to check unifier.types
-	// to see if we have a type or not.
-	indices []int // len(d.indices) == len(d.tparams)
-}
+// String returns a string representation of the current mapping
+// from type parameters to types.
+func (u *unifier) String() string {
+	// sort type parameters for reproducible strings
+	tparams := make(typeParamsById, len(u.handles))
+	i := 0
+	for tpar := range u.handles {
+		tparams[i] = tpar
+		i++
+	}
+	sort.Sort(tparams)
 
-// String returns a string representation for a tparamsList. For debugging.
-func (d *tparamsList) String() string {
 	var buf bytes.Buffer
 	w := newTypeWriter(&buf, nil)
 	w.byte('[')
-	for i, tpar := range d.tparams {
+	for i, x := range tparams {
 		if i > 0 {
 			w.string(", ")
 		}
-		w.typ(tpar)
+		w.typ(x)
 		w.string(": ")
-		w.typ(d.at(i))
+		w.typ(u.at(x))
 	}
 	w.byte(']')
 	return buf.String()
 }
 
-// init initializes d with the given type parameters.
-// The type parameters must be in the order in which they appear in their declaration
-// (this ensures that the tparams indices match the respective type parameter index).
-func (d *tparamsList) init(tparams []*TypeParam) {
-	if len(tparams) == 0 {
-		return
-	}
-	if debug {
-		for i, tpar := range tparams {
-			assert(i == tpar.index)
-		}
-	}
-	d.tparams = tparams
-	d.indices = make([]int, len(tparams))
-}
+type typeParamsById []*TypeParam
 
-// join unifies the i'th type parameter of x with the j'th type parameter of y.
-// If both type parameters already have a type associated with them and they are
-// not joined, join fails and returns false.
-func (u *unifier) join(i, j int) bool {
+func (s typeParamsById) Len() int           { return len(s) }
+func (s typeParamsById) Less(i, j int) bool { return s[i].id < s[j].id }
+func (s typeParamsById) Swap(i, j int)      { s[i], s[j] = s[j], s[i] }
+
+// join unifies the given type parameters x and y.
+// If both type parameters already have a type associated with them
+// and they are not joined, join fails and returns false.
+func (u *unifier) join(x, y *TypeParam) bool {
 	if traceInference {
-		u.tracef("%s ⇄ %s", u.x.tparams[i], u.y.tparams[j])
+		u.tracef("%s ⇄ %s", x, y)
 	}
-	ti := u.x.indices[i]
-	tj := u.y.indices[j]
-	switch {
-	case ti == 0 && tj == 0:
-		// Neither type parameter has a type slot associated with them.
-		// Allocate a new joined nil type slot (negative index).
-		u.types = append(u.types, nil)
-		u.x.indices[i] = -len(u.types)
-		u.y.indices[j] = -len(u.types)
-	case ti == 0:
-		// The type parameter for x has no type slot yet. Use slot of y.
-		u.x.indices[i] = tj
-	case tj == 0:
-		// The type parameter for y has no type slot yet. Use slot of x.
-		u.y.indices[j] = ti
-
-	// Both type parameters have a slot: ti != 0 && tj != 0.
-	case ti == tj:
-		// Both type parameters already share the same slot. Nothing to do.
-		break
-	case ti > 0 && tj > 0:
+	switch hx, hy := u.handles[x], u.handles[y]; {
+	case hx == hy:
+		// Both type parameters already share the same handle. Nothing to do.
+	case *hx != nil && *hy != nil:
 		// Both type parameters have (possibly different) inferred types. Cannot join.
-		// TODO(gri) Should we check if types are identical? Investigate.
 		return false
-	case ti > 0:
-		// Only the type parameter for x has an inferred type. Use x slot for y.
-		u.y.setIndex(j, ti)
-	// This case is handled like the default case.
-	// case tj > 0:
-	// 	// Only the type parameter for y has an inferred type. Use y slot for x.
-	// 	u.x.setIndex(i, tj)
+	case *hx != nil:
+		// Only type parameter x has an inferred type. Use handle of x.
+		u.setHandle(y, hx)
+	// This case is treated like the default case.
+	// case *hy != nil:
+	// 	// Only type parameter y has an inferred type. Use handle of y.
+	//	u.setHandle(x, hy)
 	default:
-		// Neither type parameter has an inferred type. Use y slot for x
-		// (or x slot for y, it doesn't matter).
-		u.x.setIndex(i, tj)
+		// Neither type parameter has an inferred type. Use handle of y.
+		u.setHandle(x, hy)
 	}
 	return true
 }
 
-// If typ is a type parameter of d, index returns the type parameter index.
-// Otherwise, the result is < 0.
-func (d *tparamsList) index(typ Type) int {
-	if tpar, ok := typ.(*TypeParam); ok {
-		return tparamIndex(d.tparams, tpar)
-	}
-	return -1
-}
-
-// If tpar is a type parameter in list, tparamIndex returns the type parameter index.
-// Otherwise, the result is < 0. tpar must not be nil.
-func tparamIndex(list []*TypeParam, tpar *TypeParam) int {
-	// Once a type parameter is bound its index is >= 0. However, there are some
-	// code paths (namely tracing and type hashing) by which it is possible to
-	// arrive here with a type parameter that has not been bound, hence the check
-	// for 0 <= i below.
-	// TODO(rfindley): investigate a better approach for guarding against using
-	// unbound type parameters.
-	if i := tpar.index; 0 <= i && i < len(list) && list[i] == tpar {
-		return i
-	}
-	return -1
-}
-
-// setIndex sets the type slot index for the i'th type parameter
-// (and all its joined parameters) to tj. The type parameter
-// must have a (possibly nil) type slot associated with it.
-func (d *tparamsList) setIndex(i, tj int) {
-	ti := d.indices[i]
-	assert(ti != 0 && tj != 0)
-	for k, tk := range d.indices {
-		if tk == ti {
-			d.indices[k] = tj
+// asTypeParam returns x.(*TypeParam) if x is a type parameter recorded with u.
+// Otherwise, the result is nil.
+func (u *unifier) asTypeParam(x Type) *TypeParam {
+	if x, _ := x.(*TypeParam); x != nil {
+		if _, found := u.handles[x]; found {
+			return x
 		}
 	}
-}
-
-// at returns the type set for the i'th type parameter; or nil.
-func (d *tparamsList) at(i int) Type {
-	if ti := d.indices[i]; ti > 0 {
-		return d.unifier.types[ti-1]
-	}
 	return nil
 }
 
-// set sets the type typ for the i'th type parameter;
-// typ must not be nil and it must not have been set before.
-func (d *tparamsList) set(i int, typ Type) {
-	assert(typ != nil)
-	u := d.unifier
-	if traceInference {
-		u.tracef("%s ➞ %s", d.tparams[i], typ)
-	}
-	switch ti := d.indices[i]; {
-	case ti < 0:
-		u.types[-ti-1] = typ
-		d.setIndex(i, -ti)
-	case ti == 0:
-		u.types = append(u.types, typ)
-		d.indices[i] = len(u.types)
-	default:
-		panic("type already set")
+// setHandle sets the handle for type parameter x
+// (and all its joined type parameters) to h.
+func (u *unifier) setHandle(x *TypeParam, h *Type) {
+	hx := u.handles[x]
+	assert(hx != nil)
+	for y, hy := range u.handles {
+		if hy == hx {
+			u.handles[y] = h
+		}
 	}
 }
 
+// at returns the (possibly nil) type for type parameter x.
+func (u *unifier) at(x *TypeParam) Type {
+	return *u.handles[x]
+}
+
+// set sets the type t for type parameter x;
+// t must not be nil.
+func (u *unifier) set(x *TypeParam, t Type) {
+	assert(t != nil)
+	if traceInference {
+		u.tracef("%s ➞ %s", x, t)
+	}
+	*u.handles[x] = t
+}
+
 // unknowns returns the number of type parameters for which no type has been set yet.
-func (d *tparamsList) unknowns() int {
+func (u *unifier) unknowns() int {
 	n := 0
-	for _, ti := range d.indices {
-		if ti <= 0 {
+	for _, h := range u.handles {
+		if *h == nil {
 			n++
 		}
 	}
 	return n
 }
 
-// types returns the list of inferred types (via unification) for the type parameters
-// described by d, and an index. If all types were inferred, the returned index is < 0.
-// Otherwise, it is the index of the first type parameter which couldn't be inferred;
-// i.e., for which list[index] is nil.
-func (d *tparamsList) types() (list []Type, index int) {
-	list = make([]Type, len(d.tparams))
-	index = -1
-	for i := range d.tparams {
-		t := d.at(i)
-		list[i] = t
-		if index < 0 && t == nil {
-			index = i
-		}
+// inferred returns the list of inferred types for the given type parameter list.
+// The result is never nil and has the same length as tparams; result types that
+// could not be inferred are nil. Corresponding type parameters and result types
+// have identical indices.
+func (u *unifier) inferred(tparams []*TypeParam) []Type {
+	list := make([]Type, len(tparams))
+	for i, x := range tparams {
+		list[i] = u.at(x)
 	}
-	return
+	return list
 }
 
-func (u *unifier) nifyEq(x, y Type, p *ifacePair) bool {
-	return x == y || u.nify(x, y, p)
+// asInterface returns the underlying type of x as an interface if
+// it is a non-type parameter interface. Otherwise it returns nil.
+func asInterface(x Type) (i *Interface) {
+	if _, ok := x.(*TypeParam); !ok {
+		i, _ = under(x).(*Interface)
+	}
+	return i
 }
 
 // nify implements the core unification algorithm which is an
 // adapted version of Checker.identical. For changes to that
 // code the corresponding changes should be made here.
 // Must not be called directly from outside the unifier.
-func (u *unifier) nify(x, y Type, p *ifacePair) (result bool) {
+func (u *unifier) nify(x, y Type, mode unifyMode, p *ifacePair) (result bool) {
+	u.depth++
 	if traceInference {
-		u.tracef("%s ≡ %s", x, y)
+		u.tracef("%s ≡ %s\t// %s", x, y, mode)
+	}
+	defer func() {
+		if traceInference && !result {
+			u.tracef("%s ≢ %s", x, y)
+		}
+		u.depth--
+	}()
+
+	// nothing to do if x == y
+	if x == y {
+		return true
 	}
 
 	// Stop gap for cases where unification fails.
-	if u.depth >= unificationDepthLimit {
+	if u.depth > unificationDepthLimit {
 		if traceInference {
 			u.tracef("depth %d >= %d", u.depth, unificationDepthLimit)
 		}
@@ -299,99 +306,269 @@
 		}
 		return false
 	}
-	u.depth++
-	defer func() {
-		u.depth--
-		if traceInference && !result {
-			u.tracef("%s ≢ %s", x, y)
-		}
-	}()
 
-	if !u.exact {
-		// If exact unification is known to fail because we attempt to
-		// match a type name against an unnamed type literal, consider
-		// the underlying type of the named type.
-		// (We use !hasName to exclude any type with a name, including
-		// basic types and type parameters; the rest are unamed types.)
-		if nx, _ := x.(*Named); nx != nil && !hasName(y) {
-			if traceInference {
-				u.tracef("under %s ≡ %s", nx, y)
-			}
-			return u.nify(nx.under(), y, p)
-		} else if ny, _ := y.(*Named); ny != nil && !hasName(x) {
-			if traceInference {
-				u.tracef("%s ≡ under %s", x, ny)
-			}
-			return u.nify(x, ny.under(), p)
+	// Unification is symmetric, so we can swap the operands.
+	// Ensure that if we have at least one
+	// - defined type, make sure one is in y
+	// - type parameter recorded with u, make sure one is in x
+	if _, ok := x.(*Named); ok || u.asTypeParam(y) != nil {
+		if traceInference {
+			u.tracef("%s ≡ %s\t// swap", y, x)
+		}
+		x, y = y, x
+	}
+
+	// Unification will fail if we match a defined type against a type literal.
+	// If we are matching types in an assignment, at the top-level, types with
+	// the same type structure are permitted as long as at least one of them
+	// is not a defined type. To accommodate for that possibility, we continue
+	// unification with the underlying type of a defined type if the other type
+	// is a type literal. This is controlled by the exact unification mode.
+	// We also continue if the other type is a basic type because basic types
+	// are valid underlying types and may appear as core types of type constraints.
+	// If we exclude them, inferred defined types for type parameters may not
+	// match against the core types of their constraints (even though they might
+	// correctly match against some of the types in the constraint's type set).
+	// Finally, if unification (incorrectly) succeeds by matching the underlying
+	// type of a defined type against a basic type (because we include basic types
+	// as type literals here), and if that leads to an incorrectly inferred type,
+	// we will fail at function instantiation or argument assignment time.
+	//
+	// If we have at least one defined type, there is one in y.
+	if ny, _ := y.(*Named); mode&exact == 0 && ny != nil && isTypeLit(x) && !(u.enableInterfaceInference && IsInterface(x)) {
+		if traceInference {
+			u.tracef("%s ≡ under %s", x, ny)
+		}
+		y = ny.under()
+		// Per the spec, a defined type cannot have an underlying type
+		// that is a type parameter.
+		assert(!isTypeParam(y))
+		// x and y may be identical now
+		if x == y {
+			return true
 		}
 	}
 
-	// Cases where at least one of x or y is a type parameter.
-	switch i, j := u.x.index(x), u.y.index(y); {
-	case i >= 0 && j >= 0:
+	// Cases where at least one of x or y is a type parameter recorded with u.
+	// If we have at least one type parameter, there is one in x.
+	// If we have exactly one type parameter, because it is in x,
+	// isTypeLit(x) is false and y was not changed above. In other
+	// words, if y was a defined type, it is still a defined type
+	// (relevant for the logic below).
+	switch px, py := u.asTypeParam(x), u.asTypeParam(y); {
+	case px != nil && py != nil:
 		// both x and y are type parameters
-		if u.join(i, j) {
+		if u.join(px, py) {
 			return true
 		}
 		// both x and y have an inferred type - they must match
-		return u.nifyEq(u.x.at(i), u.y.at(j), p)
+		return u.nify(u.at(px), u.at(py), mode, p)
 
-	case i >= 0:
+	case px != nil:
 		// x is a type parameter, y is not
-		if tx := u.x.at(i); tx != nil {
-			return u.nifyEq(tx, y, p)
+		if x := u.at(px); x != nil {
+			// x has an inferred type which must match y
+			if u.nify(x, y, mode, p) {
+				// We have a match, possibly through underlying types.
+				xi := asInterface(x)
+				yi := asInterface(y)
+				_, xn := x.(*Named)
+				_, yn := y.(*Named)
+				// If we have two interfaces, what to do depends on
+				// whether they are named and their method sets.
+				if xi != nil && yi != nil {
+					// Both types are interfaces.
+					// If both types are defined types, they must be identical
+					// because unification doesn't know which type has the "right" name.
+					if xn && yn {
+						return Identical(x, y)
+					}
+					// In all other cases, the method sets must match.
+					// The types unified so we know that corresponding methods
+					// match and we can simply compare the number of methods.
+					// TODO(gri) We may be able to relax this rule and select
+					// the more general interface. But if one of them is a defined
+					// type, it's not clear how to choose and whether we introduce
+					// an order dependency or not. Requiring the same method set
+					// is conservative.
+					if len(xi.typeSet().methods) != len(yi.typeSet().methods) {
+						return false
+					}
+				} else if xi != nil || yi != nil {
+					// One but not both of them are interfaces.
+					// In this case, either x or y could be viable matches for the corresponding
+					// type parameter, which means choosing either introduces an order dependence.
+					// Therefore, we must fail unification (go.dev/issue/60933).
+					return false
+				}
+				// If we have inexact unification and one of x or y is a defined type, select the
+				// defined type. This ensures that in a series of types, all matching against the
+				// same type parameter, we infer a defined type if there is one, independent of
+				// order. Type inference or assignment may fail, which is ok.
+				// Selecting a defined type, if any, ensures that we don't lose the type name;
+				// and since we have inexact unification, a value of equally named or matching
+				// undefined type remains assignable (go.dev/issue/43056).
+				//
+				// Similarly, if we have inexact unification and there are no defined types but
+				// channel types, select a directed channel, if any. This ensures that in a series
+				// of unnamed types, all matching against the same type parameter, we infer the
+				// directed channel if there is one, independent of order.
+				// Selecting a directional channel, if any, ensures that a value of another
+				// inexactly unifying channel type remains assignable (go.dev/issue/62157).
+				//
+				// If we have multiple defined channel types, they are either identical or we
+				// have assignment conflicts, so we can ignore directionality in this case.
+				//
+				// If we have defined and literal channel types, a defined type wins to avoid
+				// order dependencies.
+				if mode&exact == 0 {
+					switch {
+					case xn:
+						// x is a defined type: nothing to do.
+					case yn:
+						// x is not a defined type and y is a defined type: select y.
+						u.set(px, y)
+					default:
+						// Neither x nor y are defined types.
+						if yc, _ := under(y).(*Chan); yc != nil && yc.dir != SendRecv {
+							// y is a directed channel type: select y.
+							u.set(px, y)
+						}
+					}
+				}
+				return true
+			}
+			return false
 		}
 		// otherwise, infer type from y
-		u.x.set(i, y)
-		return true
-
-	case j >= 0:
-		// y is a type parameter, x is not
-		if ty := u.y.at(j); ty != nil {
-			return u.nifyEq(x, ty, p)
-		}
-		// otherwise, infer type from x
-		u.y.set(j, x)
+		u.set(px, y)
 		return true
 	}
 
-	// If we get here and x or y is a type parameter, they are type parameters
-	// from outside our declaration list. Try to unify their core types, if any
-	// (see issue #50755 for a test case).
-	if enableCoreTypeUnification && !u.exact {
-		if isTypeParam(x) && !hasName(y) {
-			// When considering the type parameter for unification
-			// we look at the adjusted core term (adjusted core type
-			// with tilde information).
-			// If the adjusted core type is a named type N; the
-			// corresponding core type is under(N). Since !u.exact
-			// and y doesn't have a name, unification will end up
-			// comparing under(N) to y, so we can just use the core
-			// type instead. And we can ignore the tilde because we
-			// already look at the underlying types on both sides
-			// and we have known types on both sides.
-			// Optimization.
-			if cx := coreType(x); cx != nil {
-				if traceInference {
-					u.tracef("core %s ≡ %s", x, y)
-				}
-				return u.nify(cx, y, p)
+	// x != y if we get here
+	assert(x != y)
+
+	// Type elements (array, slice, etc. elements) use emode for unification.
+	// Element types must match exactly if the types are used in an assignment.
+	emode := mode
+	if mode&assign != 0 {
+		emode |= exact
+	}
+
+	// If u.EnableInterfaceInference is set and we don't require exact unification,
+	// if both types are interfaces, one interface must have a subset of the
+	// methods of the other and corresponding method signatures must unify.
+	// If only one type is an interface, all its methods must be present in the
+	// other type and corresponding method signatures must unify.
+	if u.enableInterfaceInference && mode&exact == 0 {
+		// One or both interfaces may be defined types.
+		// Look under the name, but not under type parameters (go.dev/issue/60564).
+		xi := asInterface(x)
+		yi := asInterface(y)
+		// If we have two interfaces, check the type terms for equivalence,
+		// and unify common methods if possible.
+		if xi != nil && yi != nil {
+			xset := xi.typeSet()
+			yset := yi.typeSet()
+			if xset.comparable != yset.comparable {
+				return false
 			}
-		} else if isTypeParam(y) && !hasName(x) {
-			// see comment above
-			if cy := coreType(y); cy != nil {
-				if traceInference {
-					u.tracef("%s ≡ core %s", x, y)
-				}
-				return u.nify(x, cy, p)
+			// For now we require terms to be equal.
+			// We should be able to relax this as well, eventually.
+			if !xset.terms.equal(yset.terms) {
+				return false
 			}
+			// 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{xi, yi, p}
+			for p != nil {
+				if p.identical(q) {
+					return true // same pair was compared before
+				}
+				p = p.prev
+			}
+			// The method set of x must be a subset of the method set
+			// of y or vice versa, and the common methods must unify.
+			xmethods := xset.methods
+			ymethods := yset.methods
+			// The smaller method set must be the subset, if it exists.
+			if len(xmethods) > len(ymethods) {
+				xmethods, ymethods = ymethods, xmethods
+			}
+			// len(xmethods) <= len(ymethods)
+			// Collect the ymethods in a map for quick lookup.
+			ymap := make(map[string]*Func, len(ymethods))
+			for _, ym := range ymethods {
+				ymap[ym.Id()] = ym
+			}
+			// All xmethods must exist in ymethods and corresponding signatures must unify.
+			for _, xm := range xmethods {
+				if ym := ymap[xm.Id()]; ym == nil || !u.nify(xm.typ, ym.typ, exact, p) {
+					return false
+				}
+			}
+			return true
+		}
+
+		// We don't have two interfaces. If we have one, make sure it's in xi.
+		if yi != nil {
+			xi = yi
+			y = x
+		}
+
+		// If we have one interface, at a minimum each of the interface methods
+		// must be implemented and thus unify with a corresponding method from
+		// the non-interface type, otherwise unification fails.
+		if xi != nil {
+			// All xi methods must exist in y and corresponding signatures must unify.
+			xmethods := xi.typeSet().methods
+			for _, xm := range xmethods {
+				obj, _, _ := LookupFieldOrMethod(y, false, xm.pkg, xm.name)
+				if ym, _ := obj.(*Func); ym == nil || !u.nify(xm.typ, ym.typ, exact, p) {
+					return false
+				}
+			}
+			return true
 		}
 	}
 
-	// For type unification, do not shortcut (x == y) for identical
-	// types. Instead keep comparing them element-wise to unify the
-	// matching (and equal type parameter types). A simple test case
-	// where this matters is: func f[P any](a P) { f(a) } .
+	// Unless we have exact unification, neither x nor y are interfaces now.
+	// Except for unbound type parameters (see below), x and y must be structurally
+	// equivalent to unify.
+
+	// If we get here and x or y is a type parameter, they are unbound
+	// (not recorded with the unifier).
+	// Ensure that if we have at least one type parameter, it is in x
+	// (the earlier swap checks for _recorded_ type parameters only).
+	// This ensures that the switch switches on the type parameter.
+	//
+	// TODO(gri) Factor out type parameter handling from the switch.
+	if isTypeParam(y) {
+		if traceInference {
+			u.tracef("%s ≡ %s\t// swap", y, x)
+		}
+		x, y = y, x
+	}
 
 	switch x := x.(type) {
 	case *Basic:
@@ -403,24 +580,24 @@
 		}
 
 	case *Array:
-		// Two array types are identical if they have identical element types
-		// and the same array length.
+		// Two array types unify if they have the same array length
+		// and their element types unify.
 		if y, ok := y.(*Array); ok {
 			// If one or both array lengths are unknown (< 0) due to some error,
 			// assume they are the same to avoid spurious follow-on errors.
-			return (x.len < 0 || y.len < 0 || x.len == y.len) && u.nify(x.elem, y.elem, p)
+			return (x.len < 0 || y.len < 0 || x.len == y.len) && u.nify(x.elem, y.elem, emode, p)
 		}
 
 	case *Slice:
-		// Two slice types are identical if they have identical element types.
+		// Two slice types unify if their element types unify.
 		if y, ok := y.(*Slice); ok {
-			return u.nify(x.elem, y.elem, p)
+			return u.nify(x.elem, y.elem, emode, 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 embedded fields are considered to have the same
+		// Two struct types unify if they have the same sequence of fields,
+		// and if corresponding fields have the same names, their (field) types unify,
+		// and they have identical tags. Two embedded 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() {
@@ -429,7 +606,7 @@
 					if f.embedded != g.embedded ||
 						x.Tag(i) != y.Tag(i) ||
 						!f.sameId(g.pkg, g.name) ||
-						!u.nify(f.typ, g.typ, p) {
+						!u.nify(f.typ, g.typ, emode, p) {
 						return false
 					}
 				}
@@ -438,20 +615,20 @@
 		}
 
 	case *Pointer:
-		// Two pointer types are identical if they have identical base types.
+		// Two pointer types unify if their base types unify.
 		if y, ok := y.(*Pointer); ok {
-			return u.nify(x.base, y.base, p)
+			return u.nify(x.base, y.base, emode, p)
 		}
 
 	case *Tuple:
-		// Two tuples types are identical if they have the same number of elements
-		// and corresponding elements have identical types.
+		// Two tuples types unify if they have the same number of elements
+		// and the types of corresponding elements unify.
 		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 !u.nify(v.typ, w.typ, p) {
+						if !u.nify(v.typ, w.typ, mode, p) {
 							return false
 						}
 					}
@@ -461,21 +638,24 @@
 		}
 
 	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.
+		// Two function types unify if they have the same number of parameters
+		// and result values, corresponding parameter and result types unify,
+		// and either both functions are variadic or neither is.
+		// Parameter and result names are not required to match.
 		// TODO(gri) handle type parameters or document why we can ignore them.
 		if y, ok := y.(*Signature); ok {
 			return x.variadic == y.variadic &&
-				u.nify(x.params, y.params, p) &&
-				u.nify(x.results, y.results, p)
+				u.nify(x.params, y.params, emode, p) &&
+				u.nify(x.results, y.results, emode, 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.
+		assert(!u.enableInterfaceInference || mode&exact != 0) // handled before this switch
+
+		// Two interface types unify if they have the same set of methods with
+		// the same names, and corresponding function types unify.
+		// Lower-case method names from different packages are always different.
+		// The order of the methods is irrelevant.
 		if y, ok := y.(*Interface); ok {
 			xset := x.typeSet()
 			yset := y.typeSet()
@@ -523,7 +703,7 @@
 				}
 				for i, f := range a {
 					g := b[i]
-					if f.Id() != g.Id() || !u.nify(f.typ, g.typ, q) {
+					if f.Id() != g.Id() || !u.nify(f.typ, g.typ, exact, q) {
 						return false
 					}
 				}
@@ -532,51 +712,81 @@
 		}
 
 	case *Map:
-		// Two map types are identical if they have identical key and value types.
+		// Two map types unify if their key and value types unify.
 		if y, ok := y.(*Map); ok {
-			return u.nify(x.key, y.key, p) && u.nify(x.elem, y.elem, p)
+			return u.nify(x.key, y.key, emode, p) && u.nify(x.elem, y.elem, emode, p)
 		}
 
 	case *Chan:
-		// Two channel types are identical if they have identical value types.
+		// Two channel types unify if their value types unify
+		// and if they have the same direction.
+		// The channel direction is ignored for inexact unification.
 		if y, ok := y.(*Chan); ok {
-			return (!u.exact || x.dir == y.dir) && u.nify(x.elem, y.elem, p)
+			return (mode&exact == 0 || x.dir == y.dir) && u.nify(x.elem, y.elem, emode, p)
 		}
 
 	case *Named:
-		// TODO(gri) This code differs now from the parallel code in Checker.identical. Investigate.
+		// Two named types unify if their type names originate in the same type declaration.
+		// If they are instantiated, their type argument lists must unify.
 		if y, ok := y.(*Named); ok {
+			// Check type arguments before origins so they unify
+			// even if the origins don't match; for better error
+			// messages (see go.dev/issue/53692).
 			xargs := x.TypeArgs().list()
 			yargs := y.TypeArgs().list()
-
 			if len(xargs) != len(yargs) {
 				return false
 			}
-
-			// TODO(gri) This is not always correct: two types may have the same names
-			//           in the same package if one of them is nested in a function.
-			//           Extremely unlikely but we need an always correct solution.
-			if x.obj.pkg == y.obj.pkg && x.obj.name == y.obj.name {
-				for i, x := range xargs {
-					if !u.nify(x, yargs[i], p) {
-						return false
-					}
+			for i, xarg := range xargs {
+				if !u.nify(xarg, yargs[i], mode, p) {
+					return false
 				}
-				return true
 			}
+			return indenticalOrigin(x, y)
 		}
 
 	case *TypeParam:
-		// Two type parameters (which are not part of the type parameters of the
-		// enclosing type as those are handled in the beginning of this function)
-		// are identical if they originate in the same declaration.
-		return x == y
+		// x must be an unbound type parameter (see comment above).
+		if debug {
+			assert(u.asTypeParam(x) == nil)
+		}
+		// By definition, a valid type argument must be in the type set of
+		// the respective type constraint. Therefore, the type argument's
+		// underlying type must be in the set of underlying types of that
+		// constraint. If there is a single such underlying type, it's the
+		// constraint's core type. It must match the type argument's under-
+		// lying type, irrespective of whether the actual type argument,
+		// which may be a defined type, is actually in the type set (that
+		// will be determined at instantiation time).
+		// Thus, if we have the core type of an unbound type parameter,
+		// we know the structure of the possible types satisfying such
+		// parameters. Use that core type for further unification
+		// (see go.dev/issue/50755 for a test case).
+		if enableCoreTypeUnification {
+			// Because the core type is always an underlying type,
+			// unification will take care of matching against a
+			// defined or literal type automatically.
+			// If y is also an unbound type parameter, we will end
+			// up here again with x and y swapped, so we don't
+			// need to take care of that case separately.
+			if cx := coreType(x); cx != nil {
+				if traceInference {
+					u.tracef("core %s ≡ %s", x, y)
+				}
+				// If y is a defined type, it may not match against cx which
+				// is an underlying type (incl. int, string, etc.). Use assign
+				// mode here so that the unifier automatically takes under(y)
+				// if necessary.
+				return u.nify(cx, y, assign, p)
+			}
+		}
+		// x != y and there's nothing to do
 
 	case nil:
 		// avoid a crash in case of nil type
 
 	default:
-		panic(sprintf(nil, true, "u.nify(%s, %s), u.x.tparams = %s", x, y, u.x.tparams))
+		panic(sprintf(nil, true, "u.nify(%s, %s, %d)", x, y, mode))
 	}
 
 	return false
diff --git a/src/cmd/compile/internal/types2/union.go b/src/cmd/compile/internal/types2/union.go
index 1fafb05..8f354a7 100644
--- a/src/cmd/compile/internal/types2/union.go
+++ b/src/cmd/compile/internal/types2/union.go
@@ -143,7 +143,7 @@
 		tilde = true
 	}
 	typ := check.typ(x)
-	// Embedding stand-alone type parameters is not permitted (issue #47127).
+	// Embedding stand-alone type parameters is not permitted (go.dev/issue/47127).
 	// We don't need this restriction anymore if we make the underlying type of a type
 	// parameter its constraint interface: if we embed a lone type parameter, we will
 	// simply use its underlying type (like we do for other named, embedded interfaces),
diff --git a/src/cmd/compile/internal/types2/universe.go b/src/cmd/compile/internal/types2/universe.go
index 3fe849e..79cd8cb 100644
--- a/src/cmd/compile/internal/types2/universe.go
+++ b/src/cmd/compile/internal/types2/universe.go
@@ -153,6 +153,8 @@
 	_Imag
 	_Len
 	_Make
+	_Max
+	_Min
 	_New
 	_Panic
 	_Print
@@ -191,6 +193,9 @@
 	_Imag:    {"imag", 1, false, expression},
 	_Len:     {"len", 1, false, expression},
 	_Make:    {"make", 1, true, expression},
+	// To disable max/min, remove the next two lines.
+	_Max:     {"max", 1, true, expression},
+	_Min:     {"min", 1, true, expression},
 	_New:     {"new", 1, false, expression},
 	_Panic:   {"panic", 1, false, statement},
 	_Print:   {"print", 0, true, statement},
diff --git a/src/cmd/compile/internal/types2/util.go b/src/cmd/compile/internal/types2/util.go
new file mode 100644
index 0000000..01da1c1
--- /dev/null
+++ b/src/cmd/compile/internal/types2/util.go
@@ -0,0 +1,22 @@
+// Copyright 2023 The Go 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 various functionality that is
+// different between go/types and types2. Factoring
+// out this code allows more of the rest of the code
+// to be shared.
+
+package types2
+
+import "cmd/compile/internal/syntax"
+
+// cmpPos compares the positions p and q and returns a result r as follows:
+//
+// r <  0: p is before q
+// r == 0: p and q are the same position (but may not be identical)
+// r >  0: p is after q
+//
+// If p and q are in different files, p is before q if the filename
+// of p sorts lexicographically before the filename of q.
+func cmpPos(p, q syntax.Pos) int { return p.Cmp(q) }
diff --git a/src/cmd/compile/internal/types2/util_test.go b/src/cmd/compile/internal/types2/util_test.go
new file mode 100644
index 0000000..4cbd002
--- /dev/null
+++ b/src/cmd/compile/internal/types2/util_test.go
@@ -0,0 +1,12 @@
+// Copyright 2023 The Go 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 exports various functionality of util.go
+// so that it can be used in (package-external) tests.
+
+package types2
+
+import "cmd/compile/internal/syntax"
+
+func CmpPos(p, q syntax.Pos) int { return cmpPos(p, q) }
diff --git a/src/cmd/compile/internal/types2/validtype.go b/src/cmd/compile/internal/types2/validtype.go
index b0ebc02..dbe91dc 100644
--- a/src/cmd/compile/internal/types2/validtype.go
+++ b/src/cmd/compile/internal/types2/validtype.go
@@ -198,7 +198,7 @@
 //         nest = A[A[string]]->B[P]
 //         path = A[A[string]]->B[P]
 //
-// Eventutally we reach the type parameter P of type B (P₂):
+// Eventually we reach the type parameter P of type B (P₂):
 //
 //   P₂
 //         nest = A[A[string]]->B[P]
diff --git a/src/cmd/compile/internal/types2/version.go b/src/cmd/compile/internal/types2/version.go
index b649f09..e525f16 100644
--- a/src/cmd/compile/internal/types2/version.go
+++ b/src/cmd/compile/internal/types2/version.go
@@ -7,21 +7,101 @@
 import (
 	"cmd/compile/internal/syntax"
 	"fmt"
-	"regexp"
-	"strconv"
 	"strings"
 )
 
+// A version represents a released Go version.
+type version struct {
+	major, minor int
+}
+
+func (v version) String() string {
+	return fmt.Sprintf("go%d.%d", v.major, v.minor)
+}
+
+func (v version) equal(u version) bool {
+	return v.major == u.major && v.minor == u.minor
+}
+
+func (v version) before(u version) bool {
+	return v.major < u.major || v.major == u.major && v.minor < u.minor
+}
+
+func (v version) after(u version) bool {
+	return v.major > u.major || v.major == u.major && v.minor > u.minor
+}
+
+// Go versions that introduced language changes.
+var (
+	go0_0  = version{0, 0} // no version specified
+	go1_9  = version{1, 9}
+	go1_13 = version{1, 13}
+	go1_14 = version{1, 14}
+	go1_17 = version{1, 17}
+	go1_18 = version{1, 18}
+	go1_20 = version{1, 20}
+	go1_21 = version{1, 21}
+)
+
+// parseGoVersion parses a Go version string (such as "go1.12")
+// and returns the version, or an error. If s is the empty
+// string, the version is 0.0.
+func parseGoVersion(s string) (v version, err error) {
+	bad := func() (version, error) {
+		return version{}, fmt.Errorf("invalid Go version syntax %q", s)
+	}
+	if s == "" {
+		return
+	}
+	if !strings.HasPrefix(s, "go") {
+		return bad()
+	}
+	s = s[len("go"):]
+	i := 0
+	for ; i < len(s) && '0' <= s[i] && s[i] <= '9'; i++ {
+		if i >= 10 || i == 0 && s[i] == '0' {
+			return bad()
+		}
+		v.major = 10*v.major + int(s[i]) - '0'
+	}
+	if i > 0 && i == len(s) {
+		return
+	}
+	if i == 0 || s[i] != '.' {
+		return bad()
+	}
+	s = s[i+1:]
+	if s == "0" {
+		// We really should not accept "go1.0",
+		// but we didn't reject it from the start
+		// and there are now programs that use it.
+		// So accept it.
+		return
+	}
+	i = 0
+	for ; i < len(s) && '0' <= s[i] && s[i] <= '9'; i++ {
+		if i >= 10 || i == 0 && s[i] == '0' {
+			return bad()
+		}
+		v.minor = 10*v.minor + int(s[i]) - '0'
+	}
+	// Accept any suffix after the minor number.
+	// We are only looking for the language version (major.minor)
+	// but want to accept any valid Go version, like go1.21.0
+	// and go1.21rc2.
+	return
+}
+
 // langCompat reports an error if the representation of a numeric
 // literal is not compatible with the current language version.
 func (check *Checker) langCompat(lit *syntax.BasicLit) {
 	s := lit.Value
-	if len(s) <= 2 || check.allowVersion(check.pkg, 1, 13) {
+	if len(s) <= 2 || check.allowVersion(check.pkg, lit, go1_13) {
 		return
 	}
 	// len(s) > 2
 	if strings.Contains(s, "_") {
-		check.versionErrorf(lit, "go1.13", "underscores in numeric literals")
+		check.versionErrorf(lit, go1_13, "underscores in numeric literals")
 		return
 	}
 	if s[0] != '0' {
@@ -29,53 +109,59 @@
 	}
 	radix := s[1]
 	if radix == 'b' || radix == 'B' {
-		check.versionErrorf(lit, "go1.13", "binary literals")
+		check.versionErrorf(lit, go1_13, "binary literals")
 		return
 	}
 	if radix == 'o' || radix == 'O' {
-		check.versionErrorf(lit, "go1.13", "0o/0O-style octal literals")
+		check.versionErrorf(lit, go1_13, "0o/0O-style octal literals")
 		return
 	}
 	if lit.Kind != syntax.IntLit && (radix == 'x' || radix == 'X') {
-		check.versionErrorf(lit, "go1.13", "hexadecimal floating-point literals")
+		check.versionErrorf(lit, go1_13, "hexadecimal floating-point literals")
 	}
 }
 
 // allowVersion reports whether the given package
 // is allowed to use version major.minor.
-func (check *Checker) allowVersion(pkg *Package, major, minor int) bool {
+func (check *Checker) allowVersion(pkg *Package, at poser, v version) bool {
 	// We assume that imported packages have all been checked,
 	// so we only have to check for the local package.
 	if pkg != check.pkg {
 		return true
 	}
-	ma, mi := check.version.major, check.version.minor
-	return ma == 0 && mi == 0 || ma > major || ma == major && mi >= minor
+
+	// If the source file declares its Go version, use that to decide.
+	if check.posVers != nil {
+		if src, ok := check.posVers[base(at.Pos())]; ok && src.major >= 1 {
+			return !src.before(v)
+		}
+	}
+
+	// Otherwise fall back to the version in the checker.
+	return check.version.equal(go0_0) || !check.version.before(v)
 }
 
-type version struct {
-	major, minor int
+// verifyVersionf is like allowVersion but also accepts a format string and arguments
+// which are used to report a version error if allowVersion returns false. It uses the
+// current package.
+func (check *Checker) verifyVersionf(at poser, v version, format string, args ...interface{}) bool {
+	if !check.allowVersion(check.pkg, at, v) {
+		check.versionErrorf(at, v, format, args...)
+		return false
+	}
+	return true
 }
 
-// parseGoVersion parses a Go version string (such as "go1.12")
-// and returns the version, or an error. If s is the empty
-// string, the version is 0.0.
-func parseGoVersion(s string) (v version, err error) {
-	if s == "" {
-		return
+// base finds the underlying PosBase of the source file containing pos,
+// skipping over intermediate PosBase layers created by //line directives.
+func base(pos syntax.Pos) *syntax.PosBase {
+	b := pos.Base()
+	for {
+		bb := b.Pos().Base()
+		if bb == nil || bb == b {
+			break
+		}
+		b = bb
 	}
-	matches := goVersionRx.FindStringSubmatch(s)
-	if matches == nil {
-		err = fmt.Errorf(`should be something like "go1.12"`)
-		return
-	}
-	v.major, err = strconv.Atoi(matches[1])
-	if err != nil {
-		return
-	}
-	v.minor, err = strconv.Atoi(matches[2])
-	return
+	return b
 }
-
-// goVersionRx matches a Go version string, e.g. "go1.12".
-var goVersionRx = regexp.MustCompile(`^go([1-9][0-9]*)\.(0|[1-9][0-9]*)$`)
diff --git a/src/cmd/compile/internal/types2/version_test.go b/src/cmd/compile/internal/types2/version_test.go
new file mode 100644
index 0000000..651758e
--- /dev/null
+++ b/src/cmd/compile/internal/types2/version_test.go
@@ -0,0 +1,24 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package types2
+
+import "testing"
+
+var parseGoVersionTests = []struct {
+	in  string
+	out version
+}{
+	{"go1.21", version{1, 21}},
+	{"go1.21.0", version{1, 21}},
+	{"go1.21rc2", version{1, 21}},
+}
+
+func TestParseGoVersion(t *testing.T) {
+	for _, tt := range parseGoVersionTests {
+		if out, err := parseGoVersion(tt.in); out != tt.out || err != nil {
+			t.Errorf("parseGoVersion(%q) = %v, %v, want %v, nil", tt.in, out, err, tt.out)
+		}
+	}
+}
diff --git a/src/cmd/compile/internal/walk/assign.go b/src/cmd/compile/internal/walk/assign.go
index 1450ec6..4207b48 100644
--- a/src/cmd/compile/internal/walk/assign.go
+++ b/src/cmd/compile/internal/walk/assign.go
@@ -559,7 +559,7 @@
 
 		fn := typecheck.LookupRuntime("slicecopy")
 		fn = typecheck.SubstArgTypes(fn, ptr1.Type().Elem(), ptr2.Type().Elem())
-		ncopy = mkcall1(fn, types.Types[types.TINT], &nodes, ptr1, len1, ptr2, len2, ir.NewInt(elemtype.Size()))
+		ncopy = mkcall1(fn, types.Types[types.TINT], &nodes, ptr1, len1, ptr2, len2, ir.NewInt(base.Pos, elemtype.Size()))
 	} else {
 		// memmove(&s[idx], &l2[0], len(l2)*sizeof(T))
 		ix := ir.NewIndexExpr(base.Pos, s, idx)
@@ -569,7 +569,7 @@
 		sptr := ir.NewUnaryExpr(base.Pos, ir.OSPTR, l2)
 
 		nwid := cheapExpr(typecheck.Conv(ir.NewUnaryExpr(base.Pos, ir.OLEN, l2), types.Types[types.TUINTPTR]), &nodes)
-		nwid = ir.NewBinaryExpr(base.Pos, ir.OMUL, nwid, ir.NewInt(elemtype.Size()))
+		nwid = ir.NewBinaryExpr(base.Pos, ir.OMUL, nwid, ir.NewInt(base.Pos, elemtype.Size()))
 
 		// instantiate func memmove(to *any, frm *any, length uintptr)
 		fn := typecheck.LookupRuntime("memmove")
@@ -609,7 +609,7 @@
 	}
 
 	// y must be either an integer constant or the largest possible positive value
-	// of variable y needs to fit into an uint.
+	// of variable y needs to fit into a uint.
 
 	// typecheck made sure that constant arguments to make are not negative and fit into an int.
 
@@ -652,7 +652,7 @@
 //	growslice will have done the clearing for us.
 
 func extendSlice(n *ir.CallExpr, init *ir.Nodes) ir.Node {
-	// isAppendOfMake made sure all possible positive values of l2 fit into an uint.
+	// isAppendOfMake made sure all possible positive values of l2 fit into a uint.
 	// The case of l2 overflow when converting from e.g. uint to int is handled by an explicit
 	// check of l2 < 0 at runtime which is generated below.
 	l2 := typecheck.Conv(n.Args[1].(*ir.MakeExpr).Len, types.Types[types.TINT])
@@ -667,7 +667,7 @@
 	var nodes []ir.Node
 
 	// if l2 >= 0 (likely happens), do nothing
-	nifneg := ir.NewIfStmt(base.Pos, ir.NewBinaryExpr(base.Pos, ir.OGE, l2, ir.NewInt(0)), nil, nil)
+	nifneg := ir.NewIfStmt(base.Pos, ir.NewBinaryExpr(base.Pos, ir.OGE, l2, ir.NewInt(base.Pos, 0)), nil, nil)
 	nifneg.Likely = true
 
 	// else panicmakeslicelen()
@@ -718,7 +718,7 @@
 	hp := typecheck.ConvNop(typecheck.NodAddr(ix), types.Types[types.TUNSAFEPTR])
 
 	// hn := l2 * sizeof(elem(s))
-	hn := typecheck.Conv(ir.NewBinaryExpr(base.Pos, ir.OMUL, l2, ir.NewInt(elemtype.Size())), types.Types[types.TUINTPTR])
+	hn := typecheck.Conv(ir.NewBinaryExpr(base.Pos, ir.OMUL, l2, ir.NewInt(base.Pos, elemtype.Size())), types.Types[types.TUINTPTR])
 
 	clrname := "memclrNoHeapPointers"
 	hasPointers := elemtype.HasPointers()
diff --git a/src/cmd/compile/internal/walk/builtin.go b/src/cmd/compile/internal/walk/builtin.go
index 31c4b06..0bb5018 100644
--- a/src/cmd/compile/internal/walk/builtin.go
+++ b/src/cmd/compile/internal/walk/builtin.go
@@ -83,7 +83,7 @@
 	l = append(l, ir.NewAssignStmt(base.Pos, s, nsrc))
 
 	// num = number of things to append
-	num := ir.NewInt(int64(argc))
+	num := ir.NewInt(base.Pos, int64(argc))
 
 	// newLen := s.len + num
 	newLen := typecheck.Temp(types.Types[types.TINT])
@@ -119,7 +119,7 @@
 	ls = n.Args[1:]
 	for i, n := range ls {
 		// s[s.len-argc+i] = arg
-		ix := ir.NewIndexExpr(base.Pos, s, ir.NewBinaryExpr(base.Pos, ir.OSUB, newLen, ir.NewInt(int64(argc-i))))
+		ix := ir.NewIndexExpr(base.Pos, s, ir.NewBinaryExpr(base.Pos, ir.OSUB, newLen, ir.NewInt(base.Pos, int64(argc-i))))
 		ix.SetBounded(true)
 		l = append(l, ir.NewAssignStmt(base.Pos, ix, n))
 	}
@@ -130,6 +130,22 @@
 	return s
 }
 
+// walkClear walks an OCLEAR node.
+func walkClear(n *ir.UnaryExpr) ir.Node {
+	typ := n.X.Type()
+	switch {
+	case typ.IsSlice():
+		if n := arrayClear(n.X.Pos(), n.X, nil); n != nil {
+			return n
+		}
+		// If n == nil, we are clearing an array which takes zero memory, do nothing.
+		return ir.NewBlockStmt(n.Pos(), nil)
+	case typ.IsMap():
+		return mapClear(n.X, reflectdata.TypePtrAt(n.X.Pos(), n.X.Type()))
+	}
+	panic("unreachable")
+}
+
 // walkClose walks an OCLOSE node.
 func walkClose(n *ir.UnaryExpr, init *ir.Nodes) ir.Node {
 	// cannot use chanfn - closechan takes any, not chan any
@@ -172,7 +188,7 @@
 		fn := typecheck.LookupRuntime("slicecopy")
 		fn = typecheck.SubstArgTypes(fn, ptrL.Type().Elem(), ptrR.Type().Elem())
 
-		return mkcall1(fn, n.Type(), init, ptrL, lenL, ptrR, lenR, ir.NewInt(n.X.Type().Elem().Size()))
+		return mkcall1(fn, n.Type(), init, ptrL, lenL, ptrR, lenR, ir.NewInt(base.Pos, n.X.Type().Elem().Size()))
 	}
 
 	n.X = walkExpr(n.X, init)
@@ -208,7 +224,7 @@
 	nwid := ir.Node(typecheck.Temp(types.Types[types.TUINTPTR]))
 	setwid := ir.NewAssignStmt(base.Pos, nwid, typecheck.Conv(nlen, types.Types[types.TUINTPTR]))
 	ne.Body.Append(setwid)
-	nwid = ir.NewBinaryExpr(base.Pos, ir.OMUL, nwid, ir.NewInt(nl.Type().Elem().Size()))
+	nwid = ir.NewBinaryExpr(base.Pos, ir.OMUL, nwid, ir.NewInt(base.Pos, nl.Type().Elem().Size()))
 	call := mkcall1(fn, nil, init, nto, nfrm, nwid)
 	ne.Body.Append(call)
 
@@ -238,6 +254,13 @@
 		// Replace len([]rune(string)) with runtime.countrunes(string).
 		return mkcall("countrunes", n.Type(), init, typecheck.Conv(n.X.(*ir.ConvExpr).X, types.Types[types.TSTRING]))
 	}
+	if isByteCount(n) {
+		conv := n.X.(*ir.ConvExpr)
+		walkStmtList(conv.Init())
+		init.Append(ir.TakeInit(conv)...)
+		_, len := backingArrayPtrLen(cheapExpr(conv.X, init))
+		return len
+	}
 
 	n.X = walkExpr(n.X, init)
 
@@ -308,7 +331,7 @@
 			//     h.buckets = b
 			// }
 
-			nif := ir.NewIfStmt(base.Pos, ir.NewBinaryExpr(base.Pos, ir.OLE, hint, ir.NewInt(reflectdata.BUCKETSIZE)), nil, nil)
+			nif := ir.NewIfStmt(base.Pos, ir.NewBinaryExpr(base.Pos, ir.OLE, hint, ir.NewInt(base.Pos, reflectdata.BUCKETSIZE)), nil, nil)
 			nif.Likely = true
 
 			// var bv bmap
@@ -404,8 +427,8 @@
 		//     if len < 0 { panicmakeslicelen() }
 		//     panicmakeslicecap()
 		// }
-		nif := ir.NewIfStmt(base.Pos, ir.NewBinaryExpr(base.Pos, ir.OGT, typecheck.Conv(l, types.Types[types.TUINT64]), ir.NewInt(i)), nil, nil)
-		niflen := ir.NewIfStmt(base.Pos, ir.NewBinaryExpr(base.Pos, ir.OLT, l, ir.NewInt(0)), nil, nil)
+		nif := ir.NewIfStmt(base.Pos, ir.NewBinaryExpr(base.Pos, ir.OGT, typecheck.Conv(l, types.Types[types.TUINT64]), ir.NewInt(base.Pos, i)), nil, nil)
+		niflen := ir.NewIfStmt(base.Pos, ir.NewBinaryExpr(base.Pos, ir.OLT, l, ir.NewInt(base.Pos, 0)), nil, nil)
 		niflen.Body = []ir.Node{mkcall("panicmakeslicelen", nil, init)}
 		nif.Body.Append(niflen, mkcall("panicmakeslicecap", nil, init))
 		init.Append(typecheck.Stmt(nif))
@@ -466,11 +489,11 @@
 		// We do not check for overflow of len(to)*elem.Width here
 		// since len(from) is an existing checked slice capacity
 		// with same elem.Width for the from slice.
-		size := ir.NewBinaryExpr(base.Pos, ir.OMUL, typecheck.Conv(length, types.Types[types.TUINTPTR]), typecheck.Conv(ir.NewInt(t.Elem().Size()), types.Types[types.TUINTPTR]))
+		size := ir.NewBinaryExpr(base.Pos, ir.OMUL, typecheck.Conv(length, types.Types[types.TUINTPTR]), typecheck.Conv(ir.NewInt(base.Pos, t.Elem().Size()), types.Types[types.TUINTPTR]))
 
 		// instantiate mallocgc(size uintptr, typ *byte, needszero bool) unsafe.Pointer
 		fn := typecheck.LookupRuntime("mallocgc")
-		ptr := mkcall1(fn, types.Types[types.TUNSAFEPTR], init, size, typecheck.NodNil(), ir.NewBool(false))
+		ptr := mkcall1(fn, types.Types[types.TUNSAFEPTR], init, size, typecheck.NodNil(), ir.NewBool(base.Pos, false))
 		ptr.MarkNonNil()
 		sh := ir.NewSliceHeaderExpr(base.Pos, t, ptr, length, length)
 
@@ -513,6 +536,12 @@
 	return n
 }
 
+func walkMinMax(n *ir.CallExpr, init *ir.Nodes) ir.Node {
+	init.Append(ir.TakeInit(n)...)
+	walkExprList(n.Args, init)
+	return n
+}
+
 // generate code for print.
 func walkPrint(nn *ir.CallExpr, init *ir.Nodes) ir.Node {
 	// Hoist all the argument evaluation up before the lock.
@@ -524,11 +553,11 @@
 		t := make([]ir.Node, 0, len(s)*2)
 		for i, n := range s {
 			if i != 0 {
-				t = append(t, ir.NewString(" "))
+				t = append(t, ir.NewString(base.Pos, " "))
 			}
 			t = append(t, n)
 		}
-		t = append(t, ir.NewString("\n"))
+		t = append(t, ir.NewString(base.Pos, "\n"))
 		nn.Args = t
 	}
 
@@ -542,7 +571,7 @@
 			i++
 		}
 		if len(strs) > 0 {
-			t = append(t, ir.NewString(strings.Join(strs, "")))
+			t = append(t, ir.NewString(base.Pos, strings.Join(strs, "")))
 		}
 		if i < len(s) {
 			t = append(t, s[i])
@@ -652,7 +681,7 @@
 	return walkStmt(typecheck.Stmt(r))
 }
 
-// walkRecover walks an ORECOVERFP node.
+// walkRecoverFP walks an ORECOVERFP node.
 func walkRecoverFP(nn *ir.CallExpr, init *ir.Nodes) ir.Node {
 	return mkcall("gorecover", nn.Type(), init, walkExpr(nn.Args[0], init))
 }
@@ -701,7 +730,7 @@
 
 		// if len < 0 { panicunsafeslicelen() }
 		nif := ir.NewIfStmt(base.Pos, nil, nil, nil)
-		nif.Cond = ir.NewBinaryExpr(base.Pos, ir.OLT, typecheck.Conv(len, lenType), ir.NewInt(0))
+		nif.Cond = ir.NewBinaryExpr(base.Pos, ir.OLT, typecheck.Conv(len, lenType), ir.NewInt(base.Pos, 0))
 		nif.Body.Append(mkcall("panicunsafeslicelen", nil, &nif.Body))
 		appendWalkStmt(init, nif)
 
@@ -711,7 +740,7 @@
 			// }
 			nifPtr := ir.NewIfStmt(base.Pos, nil, nil, nil)
 			isNil := ir.NewBinaryExpr(base.Pos, ir.OEQ, unsafePtr, typecheck.NodNil())
-			gtZero := ir.NewBinaryExpr(base.Pos, ir.OGT, typecheck.Conv(len, lenType), ir.NewInt(0))
+			gtZero := ir.NewBinaryExpr(base.Pos, ir.OGT, typecheck.Conv(len, lenType), ir.NewInt(base.Pos, 0))
 			nifPtr.Cond =
 				ir.NewLogicalExpr(base.Pos, ir.OANDAND, isNil, gtZero)
 			nifPtr.Body.Append(mkcall("panicunsafeslicenilptr", nil, &nifPtr.Body))
@@ -728,7 +757,7 @@
 		mem := typecheck.Temp(types.Types[types.TUINTPTR])
 		overflow := typecheck.Temp(types.Types[types.TBOOL])
 		fn := typecheck.LookupRuntime("mulUintptr")
-		call := mkcall1(fn, fn.Type().Results(), init, ir.NewInt(sliceType.Elem().Size()), typecheck.Conv(typecheck.Conv(len, lenType), types.Types[types.TUINTPTR]))
+		call := mkcall1(fn, fn.Type().Results(), init, ir.NewInt(base.Pos, sliceType.Elem().Size()), typecheck.Conv(typecheck.Conv(len, lenType), types.Types[types.TUINTPTR]))
 		appendWalkStmt(init, ir.NewAssignListStmt(base.Pos, ir.OAS2, []ir.Node{mem, overflow}, []ir.Node{call}))
 
 		// if overflow || mem > -uintptr(ptr) {
@@ -787,7 +816,7 @@
 
 		// if len < 0 { panicunsafestringlen() }
 		nif := ir.NewIfStmt(base.Pos, nil, nil, nil)
-		nif.Cond = ir.NewBinaryExpr(base.Pos, ir.OLT, typecheck.Conv(len, lenType), ir.NewInt(0))
+		nif.Cond = ir.NewBinaryExpr(base.Pos, ir.OLT, typecheck.Conv(len, lenType), ir.NewInt(base.Pos, 0))
 		nif.Body.Append(mkcall("panicunsafestringlen", nil, &nif.Body))
 		appendWalkStmt(init, nif)
 
@@ -844,3 +873,9 @@
 func isRuneCount(n ir.Node) bool {
 	return base.Flag.N == 0 && !base.Flag.Cfg.Instrumenting && n.Op() == ir.OLEN && n.(*ir.UnaryExpr).X.Op() == ir.OSTR2RUNES
 }
+
+// isByteCount reports whether n is of the form len(string([]byte)).
+func isByteCount(n ir.Node) bool {
+	return base.Flag.N == 0 && !base.Flag.Cfg.Instrumenting && n.Op() == ir.OLEN &&
+		(n.(*ir.UnaryExpr).X.Op() == ir.OBYTES2STR || n.(*ir.UnaryExpr).X.Op() == ir.OBYTES2STRTMP)
+}
diff --git a/src/cmd/compile/internal/walk/closure.go b/src/cmd/compile/internal/walk/closure.go
index 590c9a3..1fa3ac0 100644
--- a/src/cmd/compile/internal/walk/closure.go
+++ b/src/cmd/compile/internal/walk/closure.go
@@ -68,7 +68,7 @@
 
 	// Create new function type with parameters prepended, and
 	// then update type and declarations.
-	typ = types.NewSignature(typ.Pkg(), nil, nil, append(params, typ.Params().FieldSlice()...), typ.Results().FieldSlice())
+	typ = types.NewSignature(nil, append(params, typ.Params().FieldSlice()...), typ.Results().FieldSlice())
 	f.SetType(typ)
 	clofn.Dcl = append(decls, clofn.Dcl...)
 
@@ -217,7 +217,6 @@
 		base.Fatalf("methodValueWrapper: unexpected %v (%v)", dot, dot.Op())
 	}
 
-	t0 := dot.Type()
 	meth := dot.Sel
 	rcvrtype := dot.X.Type()
 	sym := ir.MethodSymSuffix(rcvrtype, meth, "-fm")
@@ -227,48 +226,6 @@
 	}
 	sym.SetUniq(true)
 
-	if base.Debug.Unified != 0 {
-		base.FatalfAt(dot.Pos(), "missing wrapper for %v", meth)
-	}
-
-	savecurfn := ir.CurFunc
-	saveLineNo := base.Pos
-	ir.CurFunc = nil
-
-	base.Pos = base.AutogeneratedPos
-
-	fn := typecheck.DeclFunc(sym, nil,
-		typecheck.NewFuncParams(t0.Params(), true),
-		typecheck.NewFuncParams(t0.Results(), false))
-	fn.SetDupok(true)
-	fn.SetWrapper(true)
-
-	// Declare and initialize variable holding receiver.
-	ptr := ir.NewHiddenParam(base.Pos, fn, typecheck.Lookup(".this"), rcvrtype)
-
-	call := ir.NewCallExpr(base.Pos, ir.OCALL, ir.NewSelectorExpr(base.Pos, ir.OXDOT, ptr, meth), nil)
-	call.Args = ir.ParamNames(fn.Type())
-	call.IsDDD = fn.Type().IsVariadic()
-
-	var body ir.Node = call
-	if t0.NumResults() != 0 {
-		ret := ir.NewReturnStmt(base.Pos, nil)
-		ret.Results = []ir.Node{call}
-		body = ret
-	}
-
-	fn.Body = []ir.Node{body}
-	typecheck.FinishFuncBody()
-
-	typecheck.Func(fn)
-	// Need to typecheck the body of the just-generated wrapper.
-	// typecheckslice() requires that Curfn is set when processing an ORETURN.
-	ir.CurFunc = fn
-	typecheck.Stmts(fn.Body)
-	sym.Def = fn.Nname
-	typecheck.Target.Decls = append(typecheck.Target.Decls, fn)
-	ir.CurFunc = savecurfn
-	base.Pos = saveLineNo
-
-	return fn.Nname
+	base.FatalfAt(dot.Pos(), "missing wrapper for %v", meth)
+	panic("unreachable")
 }
diff --git a/src/cmd/compile/internal/walk/compare.go b/src/cmd/compile/internal/walk/compare.go
index fe9c5d8..625cfec 100644
--- a/src/cmd/compile/internal/walk/compare.go
+++ b/src/cmd/compile/internal/walk/compare.go
@@ -33,7 +33,7 @@
 	// those get the same `src.XPos`
 	io.WriteString(hash, fmt.Sprintf("%v", n))
 
-	return ir.NewInt(int64(hash.Sum32()))
+	return ir.NewInt(base.Pos, int64(hash.Sum32()))
 }
 
 // The result of walkCompare MUST be assigned back to n, e.g.
@@ -186,12 +186,16 @@
 			base.Fatalf("arguments of comparison must be lvalues - %v %v", cmpl, cmpr)
 		}
 
-		fn, needsize := eqFor(t)
+		// Should only arrive here with large memory or
+		// a struct/array containing a non-memory field/element.
+		// Small memory is handled inline, and single non-memory
+		// is handled by walkCompare.
+		fn, needsLength := reflectdata.EqFor(t)
 		call := ir.NewCallExpr(base.Pos, ir.OCALL, fn, nil)
 		call.Args.Append(typecheck.NodAddr(cmpl))
 		call.Args.Append(typecheck.NodAddr(cmpr))
-		if needsize {
-			call.Args.Append(ir.NewInt(t.Size()))
+		if needsLength {
+			call.Args.Append(ir.NewInt(base.Pos, t.Size()))
 		}
 		res := ir.Node(call)
 		if n.Op() != ir.OEQ {
@@ -224,7 +228,7 @@
 	cmpl = safeExpr(cmpl, init)
 	cmpr = safeExpr(cmpr, init)
 	if t.IsStruct() {
-		conds := compare.EqStruct(t, cmpl, cmpr)
+		conds, _ := compare.EqStruct(t, cmpl, cmpr)
 		if n.Op() == ir.OEQ {
 			for _, cond := range conds {
 				and(cond)
@@ -258,31 +262,31 @@
 			}
 			if step == 1 {
 				comp(
-					ir.NewIndexExpr(base.Pos, cmpl, ir.NewInt(i)),
-					ir.NewIndexExpr(base.Pos, cmpr, ir.NewInt(i)),
+					ir.NewIndexExpr(base.Pos, cmpl, ir.NewInt(base.Pos, i)),
+					ir.NewIndexExpr(base.Pos, cmpr, ir.NewInt(base.Pos, i)),
 				)
 				i++
 				remains -= t.Elem().Size()
 			} else {
 				elemType := t.Elem().ToUnsigned()
-				cmplw := ir.Node(ir.NewIndexExpr(base.Pos, cmpl, ir.NewInt(i)))
+				cmplw := ir.Node(ir.NewIndexExpr(base.Pos, cmpl, ir.NewInt(base.Pos, i)))
 				cmplw = typecheck.Conv(cmplw, elemType) // convert to unsigned
 				cmplw = typecheck.Conv(cmplw, convType) // widen
-				cmprw := ir.Node(ir.NewIndexExpr(base.Pos, cmpr, ir.NewInt(i)))
+				cmprw := ir.Node(ir.NewIndexExpr(base.Pos, cmpr, ir.NewInt(base.Pos, i)))
 				cmprw = typecheck.Conv(cmprw, elemType)
 				cmprw = typecheck.Conv(cmprw, convType)
 				// For code like this:  uint32(s[0]) | uint32(s[1])<<8 | uint32(s[2])<<16 ...
 				// ssa will generate a single large load.
 				for offset := int64(1); offset < step; offset++ {
-					lb := ir.Node(ir.NewIndexExpr(base.Pos, cmpl, ir.NewInt(i+offset)))
+					lb := ir.Node(ir.NewIndexExpr(base.Pos, cmpl, ir.NewInt(base.Pos, i+offset)))
 					lb = typecheck.Conv(lb, elemType)
 					lb = typecheck.Conv(lb, convType)
-					lb = ir.NewBinaryExpr(base.Pos, ir.OLSH, lb, ir.NewInt(8*t.Elem().Size()*offset))
+					lb = ir.NewBinaryExpr(base.Pos, ir.OLSH, lb, ir.NewInt(base.Pos, 8*t.Elem().Size()*offset))
 					cmplw = ir.NewBinaryExpr(base.Pos, ir.OOR, cmplw, lb)
-					rb := ir.Node(ir.NewIndexExpr(base.Pos, cmpr, ir.NewInt(i+offset)))
+					rb := ir.Node(ir.NewIndexExpr(base.Pos, cmpr, ir.NewInt(base.Pos, i+offset)))
 					rb = typecheck.Conv(rb, elemType)
 					rb = typecheck.Conv(rb, convType)
-					rb = ir.NewBinaryExpr(base.Pos, ir.OLSH, rb, ir.NewInt(8*t.Elem().Size()*offset))
+					rb = ir.NewBinaryExpr(base.Pos, ir.OLSH, rb, ir.NewInt(base.Pos, 8*t.Elem().Size()*offset))
 					cmprw = ir.NewBinaryExpr(base.Pos, ir.OOR, cmprw, rb)
 				}
 				comp(cmplw, cmprw)
@@ -292,7 +296,7 @@
 		}
 	}
 	if expr == nil {
-		expr = ir.NewBool(n.Op() == ir.OEQ)
+		expr = ir.NewBool(base.Pos, n.Op() == ir.OEQ)
 		// We still need to use cmpl and cmpr, in case they contain
 		// an expression which might panic. See issue 23837.
 		a1 := typecheck.Stmt(ir.NewAssignStmt(base.Pos, ir.BlankNode, cmpl))
@@ -378,12 +382,12 @@
 			if len(s) > 0 {
 				ncs = safeExpr(ncs, init)
 			}
-			r := ir.Node(ir.NewBinaryExpr(base.Pos, cmp, ir.NewUnaryExpr(base.Pos, ir.OLEN, ncs), ir.NewInt(int64(len(s)))))
+			r := ir.Node(ir.NewBinaryExpr(base.Pos, cmp, ir.NewUnaryExpr(base.Pos, ir.OLEN, ncs), ir.NewInt(base.Pos, int64(len(s)))))
 			remains := len(s)
 			for i := 0; remains > 0; {
 				if remains == 1 || !canCombineLoads {
-					cb := ir.NewInt(int64(s[i]))
-					ncb := ir.NewIndexExpr(base.Pos, ncs, ir.NewInt(int64(i)))
+					cb := ir.NewInt(base.Pos, int64(s[i]))
+					ncb := ir.NewIndexExpr(base.Pos, ncs, ir.NewInt(base.Pos, int64(i)))
 					r = ir.NewLogicalExpr(base.Pos, and, r, ir.NewBinaryExpr(base.Pos, cmp, ncb, cb))
 					remains--
 					i++
@@ -402,18 +406,18 @@
 					convType = types.Types[types.TUINT16]
 					step = 2
 				}
-				ncsubstr := typecheck.Conv(ir.NewIndexExpr(base.Pos, ncs, ir.NewInt(int64(i))), convType)
+				ncsubstr := typecheck.Conv(ir.NewIndexExpr(base.Pos, ncs, ir.NewInt(base.Pos, int64(i))), convType)
 				csubstr := int64(s[i])
 				// Calculate large constant from bytes as sequence of shifts and ors.
 				// Like this:  uint32(s[0]) | uint32(s[1])<<8 | uint32(s[2])<<16 ...
 				// ssa will combine this into a single large load.
 				for offset := 1; offset < step; offset++ {
-					b := typecheck.Conv(ir.NewIndexExpr(base.Pos, ncs, ir.NewInt(int64(i+offset))), convType)
-					b = ir.NewBinaryExpr(base.Pos, ir.OLSH, b, ir.NewInt(int64(8*offset)))
+					b := typecheck.Conv(ir.NewIndexExpr(base.Pos, ncs, ir.NewInt(base.Pos, int64(i+offset))), convType)
+					b = ir.NewBinaryExpr(base.Pos, ir.OLSH, b, ir.NewInt(base.Pos, int64(8*offset)))
 					ncsubstr = ir.NewBinaryExpr(base.Pos, ir.OOR, ncsubstr, b)
 					csubstr |= int64(s[i+offset]) << uint8(8*offset)
 				}
-				csubstrPart := ir.NewInt(csubstr)
+				csubstrPart := ir.NewInt(base.Pos, csubstr)
 				// Compare "step" bytes as once
 				r = ir.NewLogicalExpr(base.Pos, and, r, ir.NewBinaryExpr(base.Pos, cmp, csubstrPart, ncsubstr))
 				remains -= step
@@ -442,7 +446,7 @@
 	} else {
 		// sys_cmpstring(s1, s2) :: 0
 		r = mkcall("cmpstring", types.Types[types.TINT], init, typecheck.Conv(n.X, types.Types[types.TSTRING]), typecheck.Conv(n.Y, types.Types[types.TSTRING]))
-		r = ir.NewBinaryExpr(base.Pos, n.Op(), r, ir.NewInt(0))
+		r = ir.NewBinaryExpr(base.Pos, n.Op(), r, ir.NewInt(base.Pos, 0))
 	}
 
 	return finishCompare(n, r, init)
@@ -458,33 +462,6 @@
 	return r
 }
 
-func eqFor(t *types.Type) (n ir.Node, needsize bool) {
-	// Should only arrive here with large memory or
-	// a struct/array containing a non-memory field/element.
-	// Small memory is handled inline, and single non-memory
-	// is handled by walkCompare.
-	switch a, _ := types.AlgType(t); a {
-	case types.AMEM:
-		n := typecheck.LookupRuntime("memequal")
-		n = typecheck.SubstArgTypes(n, t, t)
-		return n, true
-	case types.ASPECIAL:
-		sym := reflectdata.TypeSymPrefix(".eq", t)
-		// TODO(austin): This creates an ir.Name with a nil Func.
-		n := typecheck.NewName(sym)
-		ir.MarkFunc(n)
-		n.SetType(types.NewSignature(types.NoPkg, nil, nil, []*types.Field{
-			types.NewField(base.Pos, nil, types.NewPtr(t)),
-			types.NewField(base.Pos, nil, types.NewPtr(t)),
-		}, []*types.Field{
-			types.NewField(base.Pos, nil, types.Types[types.TBOOL]),
-		}))
-		return n, false
-	}
-	base.Fatalf("eqFor %v", t)
-	return nil, false
-}
-
 // brcom returns !(op).
 // For example, brcom(==) is !=.
 func brcom(op ir.Op) ir.Op {
diff --git a/src/cmd/compile/internal/walk/complit.go b/src/cmd/compile/internal/walk/complit.go
index 187c28b..6330530 100644
--- a/src/cmd/compile/internal/walk/complit.go
+++ b/src/cmd/compile/internal/walk/complit.go
@@ -204,7 +204,7 @@
 				}
 				r = kv.Value
 			}
-			a := ir.NewIndexExpr(base.Pos, var_, ir.NewInt(k))
+			a := ir.NewIndexExpr(base.Pos, var_, ir.NewInt(base.Pos, k))
 			k++
 			if isBlank {
 				return ir.BlankNode, r
@@ -377,7 +377,7 @@
 			}
 			value = kv.Value
 		}
-		a := ir.NewIndexExpr(base.Pos, vauto, ir.NewInt(index))
+		a := ir.NewIndexExpr(base.Pos, vauto, ir.NewInt(base.Pos, index))
 		a.SetBounded(true)
 		index++
 
@@ -416,7 +416,7 @@
 
 func maplit(n *ir.CompLitExpr, m ir.Node, init *ir.Nodes) {
 	// make the map var
-	args := []ir.Node{ir.TypeNode(n.Type()), ir.NewInt(n.Len + int64(len(n.List)))}
+	args := []ir.Node{ir.TypeNode(n.Type()), ir.NewInt(base.Pos, n.Len+int64(len(n.List)))}
 	a := typecheck.Expr(ir.NewCallExpr(base.Pos, ir.OMAKE, nil, args)).(*ir.MakeExpr)
 	a.RType = n.RType
 	a.SetEsc(n.Esc())
@@ -476,15 +476,15 @@
 		base.AssertfAt(lhs.Op() == ir.OINDEXMAP, lhs.Pos(), "want OINDEXMAP, have %+v", lhs)
 		lhs.RType = n.RType
 
-		zero := ir.NewAssignStmt(base.Pos, i, ir.NewInt(0))
-		cond := ir.NewBinaryExpr(base.Pos, ir.OLT, i, ir.NewInt(tk.NumElem()))
-		incr := ir.NewAssignStmt(base.Pos, i, ir.NewBinaryExpr(base.Pos, ir.OADD, i, ir.NewInt(1)))
+		zero := ir.NewAssignStmt(base.Pos, i, ir.NewInt(base.Pos, 0))
+		cond := ir.NewBinaryExpr(base.Pos, ir.OLT, i, ir.NewInt(base.Pos, tk.NumElem()))
+		incr := ir.NewAssignStmt(base.Pos, i, ir.NewBinaryExpr(base.Pos, ir.OADD, i, ir.NewInt(base.Pos, 1)))
 
 		var body ir.Node = ir.NewAssignStmt(base.Pos, lhs, rhs)
 		body = typecheck.Stmt(body)
 		body = orderStmtInPlace(body, map[string][]*ir.Name{})
 
-		loop := ir.NewForStmt(base.Pos, nil, cond, incr, nil)
+		loop := ir.NewForStmt(base.Pos, nil, cond, incr, nil, false)
 		loop.Body = []ir.Node{body}
 		loop.SetInit([]ir.Node{zero})
 
diff --git a/src/cmd/compile/internal/walk/convert.go b/src/cmd/compile/internal/walk/convert.go
index bf06ed6..bfa0c54 100644
--- a/src/cmd/compile/internal/walk/convert.go
+++ b/src/cmd/compile/internal/walk/convert.go
@@ -45,7 +45,7 @@
 	toType := n.Type()
 	if !fromType.IsInterface() && !ir.IsBlank(ir.CurFunc.Nname) {
 		// skip unnamed functions (func _())
-		if base.Debug.Unified != 0 && fromType.HasShape() {
+		if fromType.HasShape() {
 			// Unified IR uses OCONVIFACE for converting all derived types
 			// to interface type. Avoid assertion failure in
 			// MarkTypeUsedInInterface, because we've marked used types
@@ -140,9 +140,9 @@
 		n = cheapExpr(n, init)
 		n = soleComponent(init, n)
 		// byteindex widens n so that the multiplication doesn't overflow.
-		index := ir.NewBinaryExpr(base.Pos, ir.OLSH, byteindex(n), ir.NewInt(3))
+		index := ir.NewBinaryExpr(base.Pos, ir.OLSH, byteindex(n), ir.NewInt(base.Pos, 3))
 		if ssagen.Arch.LinkArch.ByteOrder == binary.BigEndian {
-			index = ir.NewBinaryExpr(base.Pos, ir.OADD, index, ir.NewInt(7))
+			index = ir.NewBinaryExpr(base.Pos, ir.OADD, index, ir.NewInt(base.Pos, 7))
 		}
 		// The actual type is [256]uint64, but we use [256*8]uint8 so we can address
 		// individual bytes.
@@ -281,7 +281,9 @@
 
 		// Copy from the static string data to the [n]byte.
 		if len(sc) > 0 {
-			as := ir.NewAssignStmt(base.Pos, ir.NewStarExpr(base.Pos, p), ir.NewStarExpr(base.Pos, typecheck.ConvNop(ir.NewUnaryExpr(base.Pos, ir.OSPTR, s), t.PtrTo())))
+			sptr := ir.NewUnaryExpr(base.Pos, ir.OSPTR, s)
+			sptr.SetBounded(true)
+			as := ir.NewAssignStmt(base.Pos, ir.NewStarExpr(base.Pos, p), ir.NewStarExpr(base.Pos, typecheck.ConvNop(sptr, t.PtrTo())))
 			appendWalkStmt(init, as)
 		}
 
@@ -418,7 +420,7 @@
 			}
 			n = typecheck.Expr(ir.NewSelectorExpr(n.Pos(), ir.OXDOT, n, n.Type().Field(0).Sym))
 		case n.Type().IsArray():
-			n = typecheck.Expr(ir.NewIndexExpr(n.Pos(), n, ir.NewInt(0)))
+			n = typecheck.Expr(ir.NewIndexExpr(n.Pos(), n, ir.NewInt(base.Pos, 0)))
 		default:
 			return n
 		}
diff --git a/src/cmd/compile/internal/walk/expr.go b/src/cmd/compile/internal/walk/expr.go
index 24fe0d0..909e7d6 100644
--- a/src/cmd/compile/internal/walk/expr.go
+++ b/src/cmd/compile/internal/walk/expr.go
@@ -98,6 +98,10 @@
 		n := n.(*ir.SelectorExpr)
 		return n.FuncName()
 
+	case ir.OMIN, ir.OMAX:
+		n := n.(*ir.CallExpr)
+		return walkMinMax(n, init)
+
 	case ir.ONOT, ir.ONEG, ir.OPLUS, ir.OBITNOT, ir.OREAL, ir.OIMAG, ir.OSPTR, ir.OITAB, ir.OIDATA:
 		n := n.(*ir.UnaryExpr)
 		n.X = walkExpr(n.X, init)
@@ -279,6 +283,10 @@
 	case ir.OCOPY:
 		return walkCopy(n.(*ir.BinaryExpr), init, base.Flag.Cfg.Instrumenting && !base.Flag.CompilingRuntime)
 
+	case ir.OCLEAR:
+		n := n.(*ir.UnaryExpr)
+		return walkClear(n)
+
 	case ir.OCLOSE:
 		n := n.(*ir.UnaryExpr)
 		return walkClose(n, init)
@@ -556,7 +564,7 @@
 			fn := arg.(*ir.ConvExpr).X.(*ir.Name)
 			abi := fn.Func.ABI
 			if abi != wantABI {
-				base.ErrorfAt(n.Pos(), "internal/abi.%s expects an %v function, %s is defined as %v", name, wantABI, fn.Sym().Name, abi)
+				base.ErrorfAt(n.Pos(), 0, "internal/abi.%s expects an %v function, %s is defined as %v", name, wantABI, fn.Sym().Name, abi)
 			}
 			var e ir.Node = ir.NewLinksymExpr(n.Pos(), fn.Sym().LinksymABI(abi), types.Types[types.TUINTPTR])
 			e = ir.NewAddrExpr(n.Pos(), e)
@@ -566,7 +574,7 @@
 		// fn is not a defined function. It must be ABIInternal.
 		// Read the address from func value, i.e. *(*uintptr)(idata(fn)).
 		if wantABI != obj.ABIInternal {
-			base.ErrorfAt(n.Pos(), "internal/abi.%s does not accept func expression, which is ABIInternal", name)
+			base.ErrorfAt(n.Pos(), 0, "internal/abi.%s does not accept func expression, which is ABIInternal", name)
 		}
 		arg = walkExpr(arg, init)
 		var e ir.Node = ir.NewUnaryExpr(n.Pos(), ir.OIDATA, arg)
@@ -617,7 +625,6 @@
 		}
 	}
 
-	n.Args = args
 	funSym := n.X.Sym()
 	if base.Debug.Libfuzzer != 0 && funSym != nil {
 		if hook, found := hooks[funSym.Pkg.Path+"."+funSym.Name]; found {
@@ -755,7 +762,7 @@
 
 // mapKeyArg returns an expression for key that is suitable to be passed
 // as the key argument for runtime map* functions.
-// n is is the map indexing or delete Node (to provide Pos).
+// n is the map indexing or delete Node (to provide Pos).
 func mapKeyArg(fast int, n, key ir.Node, assigned bool) ir.Node {
 	if fast == mapslow {
 		// standard version takes key by reference.
diff --git a/src/cmd/compile/internal/walk/order.go b/src/cmd/compile/internal/walk/order.go
index c7c3d97..057e0b7 100644
--- a/src/cmd/compile/internal/walk/order.go
+++ b/src/cmd/compile/internal/walk/order.go
@@ -303,7 +303,7 @@
 // For:
 //
 //	x = m[string(k)]
-//	x = m[T1{... Tn{..., string(k), ...}]
+//	x = m[T1{... Tn{..., string(k), ...}}]
 //
 // where k is []byte, T1 to Tn is a nesting of struct and array literals,
 // the allocation of backing bytes for the string can be avoided
@@ -433,9 +433,9 @@
 	// freezes the counter when it reaches the value of 255. However, a range
 	// of experiments showed that that decreases overall performance.
 	o.append(ir.NewIfStmt(base.Pos,
-		ir.NewBinaryExpr(base.Pos, ir.OEQ, counter, ir.NewInt(0xff)),
-		[]ir.Node{ir.NewAssignStmt(base.Pos, counter, ir.NewInt(1))},
-		[]ir.Node{ir.NewAssignOpStmt(base.Pos, ir.OADD, counter, ir.NewInt(1))}))
+		ir.NewBinaryExpr(base.Pos, ir.OEQ, counter, ir.NewInt(base.Pos, 0xff)),
+		[]ir.Node{ir.NewAssignStmt(base.Pos, counter, ir.NewInt(base.Pos, 1))},
+		[]ir.Node{ir.NewAssignOpStmt(base.Pos, ir.OADD, counter, ir.NewInt(base.Pos, 1))}))
 }
 
 // orderBlock orders the block of statements in n into a new slice,
@@ -536,7 +536,7 @@
 	}
 
 	n := nn.(*ir.CallExpr)
-	typecheck.FixVariadicCall(n)
+	typecheck.AssertFixedCall(n)
 
 	if isFuncPCIntrinsic(n) && isIfaceOfFunc(n.Args[0]) {
 		// For internal/abi.FuncPCABIxxx(fn), if fn is a defined function,
@@ -740,7 +740,7 @@
 			}
 		}
 
-	case ir.OCHECKNIL, ir.OCLOSE, ir.OPANIC, ir.ORECV:
+	case ir.OCHECKNIL, ir.OCLEAR, ir.OCLOSE, ir.OPANIC, ir.ORECV:
 		n := n.(*ir.UnaryExpr)
 		t := o.markTemp()
 		n.X = o.expr(n.X, nil)
@@ -1247,6 +1247,8 @@
 		ir.OMAKEMAP,
 		ir.OMAKESLICE,
 		ir.OMAKESLICECOPY,
+		ir.OMAX,
+		ir.OMIN,
 		ir.ONEW,
 		ir.OREAL,
 		ir.ORECOVERFP,
diff --git a/src/cmd/compile/internal/walk/range.go b/src/cmd/compile/internal/walk/range.go
index 64af26b..38479b3 100644
--- a/src/cmd/compile/internal/walk/range.go
+++ b/src/cmd/compile/internal/walk/range.go
@@ -13,6 +13,7 @@
 	"cmd/compile/internal/ssagen"
 	"cmd/compile/internal/typecheck"
 	"cmd/compile/internal/types"
+	"cmd/internal/src"
 	"cmd/internal/sys"
 )
 
@@ -37,11 +38,12 @@
 // Node n may also be modified in place, and may also be
 // the returned node.
 func walkRange(nrange *ir.RangeStmt) ir.Node {
+	base.Assert(!nrange.DistinctVars) // Should all be rewritten before escape analysis
 	if isMapClear(nrange) {
-		return mapClear(nrange)
+		return mapRangeClear(nrange)
 	}
 
-	nfor := ir.NewForStmt(nrange.Pos(), nil, nil, nil, nil)
+	nfor := ir.NewForStmt(nrange.Pos(), nil, nil, nil, nil, nrange.DistinctVars)
 	nfor.SetInit(nrange.Init())
 	nfor.Label = nrange.Label
 
@@ -77,7 +79,7 @@
 		base.Fatalf("walkRange")
 
 	case types.TARRAY, types.TSLICE, types.TPTR: // TPTR is pointer-to-array
-		if nn := arrayClear(nrange, v1, v2, a); nn != nil {
+		if nn := arrayRangeClear(nrange, v1, v2, a); nn != nil {
 			base.Pos = lno
 			return nn
 		}
@@ -101,7 +103,7 @@
 		init = append(init, ir.NewAssignStmt(base.Pos, hn, ir.NewUnaryExpr(base.Pos, ir.OLEN, ha)))
 
 		nfor.Cond = ir.NewBinaryExpr(base.Pos, ir.OLT, hv1, hn)
-		nfor.Post = ir.NewAssignStmt(base.Pos, hv1, ir.NewBinaryExpr(base.Pos, ir.OADD, hv1, ir.NewInt(1)))
+		nfor.Post = ir.NewAssignStmt(base.Pos, hv1, ir.NewBinaryExpr(base.Pos, ir.OADD, hv1, ir.NewInt(base.Pos, 1)))
 
 		// for range ha { body }
 		if v1 == nil {
@@ -191,12 +193,13 @@
 		// Pointer to current iteration position. Start on entry to the loop
 		// with the pointer in hu.
 		ptr := ir.NewUnaryExpr(base.Pos, ir.OSPTR, hs)
+		ptr.SetBounded(true)
 		huVal := ir.NewConvExpr(base.Pos, ir.OCONVNOP, types.Types[types.TUNSAFEPTR], ptr)
 		huVal = ir.NewConvExpr(base.Pos, ir.OCONVNOP, types.Types[types.TUINTPTR], huVal)
 		hu := typecheck.Temp(types.Types[types.TUINTPTR])
 		init = append(init, ir.NewAssignStmt(base.Pos, hu, huVal))
 
-		// Convert hu to hp at the top of the loop (afer the condition has been checked).
+		// Convert hu to hp at the top of the loop (after the condition has been checked).
 		hpVal := ir.NewConvExpr(base.Pos, ir.OCONVNOP, types.Types[types.TUNSAFEPTR], hu)
 		hpVal.SetCheckPtr(true) // disable checkptr on this conversion
 		hpVal = ir.NewConvExpr(base.Pos, ir.OCONVNOP, elem.PtrTo(), hpVal)
@@ -213,7 +216,7 @@
 		// This reads from hp and writes to hu.
 		huVal = ir.NewConvExpr(base.Pos, ir.OCONVNOP, types.Types[types.TUNSAFEPTR], hp)
 		huVal = ir.NewConvExpr(base.Pos, ir.OCONVNOP, types.Types[types.TUINTPTR], huVal)
-		as := ir.NewAssignStmt(base.Pos, hu, ir.NewBinaryExpr(base.Pos, ir.OADD, huVal, ir.NewInt(elem.Size())))
+		as := ir.NewAssignStmt(base.Pos, hu, ir.NewBinaryExpr(base.Pos, ir.OADD, huVal, ir.NewInt(base.Pos, elem.Size())))
 		nfor.Post = ir.NewBlockStmt(base.Pos, []ir.Node{nfor.Post, as})
 
 	case types.TMAP:
@@ -259,7 +262,7 @@
 		}
 		hb := typecheck.Temp(types.Types[types.TBOOL])
 
-		nfor.Cond = ir.NewBinaryExpr(base.Pos, ir.ONE, hb, ir.NewBool(false))
+		nfor.Cond = ir.NewBinaryExpr(base.Pos, ir.ONE, hb, ir.NewBool(base.Pos, false))
 		lhs := []ir.Node{hv1, hb}
 		rhs := []ir.Node{ir.NewUnaryExpr(base.Pos, ir.ORECV, ha)}
 		a := ir.NewAssignListStmt(base.Pos, ir.OAS2RECV, lhs, rhs)
@@ -316,10 +319,10 @@
 
 		// if hv2 < utf8.RuneSelf
 		nif := ir.NewIfStmt(base.Pos, nil, nil, nil)
-		nif.Cond = ir.NewBinaryExpr(base.Pos, ir.OLT, hv2, ir.NewInt(utf8.RuneSelf))
+		nif.Cond = ir.NewBinaryExpr(base.Pos, ir.OLT, hv2, ir.NewInt(base.Pos, utf8.RuneSelf))
 
 		// hv1++
-		nif.Body = []ir.Node{ir.NewAssignStmt(base.Pos, hv1, ir.NewBinaryExpr(base.Pos, ir.OADD, hv1, ir.NewInt(1)))}
+		nif.Body = []ir.Node{ir.NewAssignStmt(base.Pos, hv1, ir.NewBinaryExpr(base.Pos, ir.OADD, hv1, ir.NewInt(base.Pos, 1)))}
 
 		// } else {
 		// hv2, hv1 = decoderune(ha, hv1)
@@ -437,18 +440,23 @@
 	return true
 }
 
-// mapClear constructs a call to runtime.mapclear for the map m.
-func mapClear(nrange *ir.RangeStmt) ir.Node {
+// mapRangeClear constructs a call to runtime.mapclear for the map range idiom.
+func mapRangeClear(nrange *ir.RangeStmt) ir.Node {
 	m := nrange.X
 	origPos := ir.SetPos(m)
 	defer func() { base.Pos = origPos }()
 
+	return mapClear(m, reflectdata.RangeMapRType(base.Pos, nrange))
+}
+
+// mapClear constructs a call to runtime.mapclear for the map m.
+func mapClear(m, rtyp ir.Node) ir.Node {
 	t := m.Type()
 
 	// instantiate mapclear(typ *type, hmap map[any]any)
 	fn := typecheck.LookupRuntime("mapclear")
 	fn = typecheck.SubstArgTypes(fn, t.Key(), t.Elem())
-	n := mkcallstmt1(fn, reflectdata.RangeMapRType(base.Pos, nrange), m)
+	n := mkcallstmt1(fn, rtyp, m)
 	return walkStmt(typecheck.Stmt(n))
 }
 
@@ -463,7 +471,7 @@
 // in which the evaluation of a is side-effect-free.
 //
 // Parameters are as in walkRange: "for v1, v2 = range a".
-func arrayClear(loop *ir.RangeStmt, v1, v2, a ir.Node) ir.Node {
+func arrayRangeClear(loop *ir.RangeStmt, v1, v2, a ir.Node) ir.Node {
 	if base.Flag.N != 0 || base.Flag.Cfg.Instrumenting {
 		return nil
 	}
@@ -496,8 +504,17 @@
 		return nil
 	}
 
-	elemsize := typecheck.RangeExprType(loop.X.Type()).Elem().Size()
-	if elemsize <= 0 || !ir.IsZero(stmt.Y) {
+	if !ir.IsZero(stmt.Y) {
+		return nil
+	}
+
+	return arrayClear(stmt.Pos(), a, loop)
+}
+
+// arrayClear constructs a call to runtime.memclr for fast zeroing of slices and arrays.
+func arrayClear(wbPos src.XPos, a ir.Node, nrange *ir.RangeStmt) ir.Node {
+	elemsize := typecheck.RangeExprType(a.Type()).Elem().Size()
+	if elemsize <= 0 {
 		return nil
 	}
 
@@ -509,25 +526,25 @@
 	// 	i = len(a) - 1
 	// }
 	n := ir.NewIfStmt(base.Pos, nil, nil, nil)
-	n.Cond = ir.NewBinaryExpr(base.Pos, ir.ONE, ir.NewUnaryExpr(base.Pos, ir.OLEN, a), ir.NewInt(0))
+	n.Cond = ir.NewBinaryExpr(base.Pos, ir.ONE, ir.NewUnaryExpr(base.Pos, ir.OLEN, a), ir.NewInt(base.Pos, 0))
 
 	// hp = &a[0]
 	hp := typecheck.Temp(types.Types[types.TUNSAFEPTR])
 
-	ix := ir.NewIndexExpr(base.Pos, a, ir.NewInt(0))
+	ix := ir.NewIndexExpr(base.Pos, a, ir.NewInt(base.Pos, 0))
 	ix.SetBounded(true)
 	addr := typecheck.ConvNop(typecheck.NodAddr(ix), types.Types[types.TUNSAFEPTR])
 	n.Body.Append(ir.NewAssignStmt(base.Pos, hp, addr))
 
 	// hn = len(a) * sizeof(elem(a))
 	hn := typecheck.Temp(types.Types[types.TUINTPTR])
-	mul := typecheck.Conv(ir.NewBinaryExpr(base.Pos, ir.OMUL, ir.NewUnaryExpr(base.Pos, ir.OLEN, a), ir.NewInt(elemsize)), types.Types[types.TUINTPTR])
+	mul := typecheck.Conv(ir.NewBinaryExpr(base.Pos, ir.OMUL, ir.NewUnaryExpr(base.Pos, ir.OLEN, a), ir.NewInt(base.Pos, elemsize)), types.Types[types.TUINTPTR])
 	n.Body.Append(ir.NewAssignStmt(base.Pos, hn, mul))
 
 	var fn ir.Node
 	if a.Type().Elem().HasPointers() {
 		// memclrHasPointers(hp, hn)
-		ir.CurFunc.SetWBPos(stmt.Pos())
+		ir.CurFunc.SetWBPos(wbPos)
 		fn = mkcallstmt("memclrHasPointers", hp, hn)
 	} else {
 		// memclrNoHeapPointers(hp, hn)
@@ -536,10 +553,11 @@
 
 	n.Body.Append(fn)
 
-	// i = len(a) - 1
-	v1 = ir.NewAssignStmt(base.Pos, v1, ir.NewBinaryExpr(base.Pos, ir.OSUB, ir.NewUnaryExpr(base.Pos, ir.OLEN, a), ir.NewInt(1)))
-
-	n.Body.Append(v1)
+	// For array range clear, also set "i = len(a) - 1"
+	if nrange != nil {
+		idx := ir.NewAssignStmt(base.Pos, nrange.Key, ir.NewBinaryExpr(base.Pos, ir.OSUB, ir.NewUnaryExpr(base.Pos, ir.OLEN, a), ir.NewInt(base.Pos, 1)))
+		n.Body.Append(idx)
+	}
 
 	n.Cond = typecheck.Expr(n.Cond)
 	n.Cond = typecheck.DefaultLit(n.Cond, nil)
@@ -554,7 +572,7 @@
 	p = ir.NewConvExpr(base.Pos, ir.OCONVNOP, nil, p)
 	p.SetType(types.Types[types.TUINTPTR])
 
-	p = ir.NewBinaryExpr(base.Pos, ir.OADD, p, ir.NewInt(n))
+	p = ir.NewBinaryExpr(base.Pos, ir.OADD, p, ir.NewInt(base.Pos, n))
 
 	p = ir.NewConvExpr(base.Pos, ir.OCONVNOP, nil, p)
 	p.SetType(t)
diff --git a/src/cmd/compile/internal/walk/select.go b/src/cmd/compile/internal/walk/select.go
index 570e9b5..c676a76 100644
--- a/src/cmd/compile/internal/walk/select.go
+++ b/src/cmd/compile/internal/walk/select.go
@@ -157,7 +157,7 @@
 	var pc0, pcs ir.Node
 	if base.Flag.Race {
 		pcs = typecheck.Temp(types.NewArray(types.Types[types.TUINTPTR], int64(ncas)))
-		pc0 = typecheck.Expr(typecheck.NodAddr(ir.NewIndexExpr(base.Pos, pcs, ir.NewInt(0))))
+		pc0 = typecheck.Expr(typecheck.NodAddr(ir.NewIndexExpr(base.Pos, pcs, ir.NewInt(base.Pos, 0))))
 	} else {
 		pc0 = typecheck.NodNil()
 	}
@@ -196,7 +196,7 @@
 		casorder[i] = cas
 
 		setField := func(f string, val ir.Node) {
-			r := ir.NewAssignStmt(base.Pos, ir.NewSelectorExpr(base.Pos, ir.ODOT, ir.NewIndexExpr(base.Pos, selv, ir.NewInt(int64(i))), typecheck.Lookup(f)), val)
+			r := ir.NewAssignStmt(base.Pos, ir.NewSelectorExpr(base.Pos, ir.ODOT, ir.NewIndexExpr(base.Pos, selv, ir.NewInt(base.Pos, int64(i))), typecheck.Lookup(f)), val)
 			init = append(init, typecheck.Stmt(r))
 		}
 
@@ -210,7 +210,7 @@
 		// TODO(mdempsky): There should be a cleaner way to
 		// handle this.
 		if base.Flag.Race {
-			r := mkcallstmt("selectsetpc", typecheck.NodAddr(ir.NewIndexExpr(base.Pos, pcs, ir.NewInt(int64(i)))))
+			r := mkcallstmt("selectsetpc", typecheck.NodAddr(ir.NewIndexExpr(base.Pos, pcs, ir.NewInt(base.Pos, int64(i)))))
 			init = append(init, r)
 		}
 	}
@@ -226,7 +226,7 @@
 	r.Lhs = []ir.Node{chosen, recvOK}
 	fn := typecheck.LookupRuntime("selectgo")
 	var fnInit ir.Nodes
-	r.Rhs = []ir.Node{mkcall1(fn, fn.Type().Results(), &fnInit, bytePtrToIndex(selv, 0), bytePtrToIndex(order, 0), pc0, ir.NewInt(int64(nsends)), ir.NewInt(int64(nrecvs)), ir.NewBool(dflt == nil))}
+	r.Rhs = []ir.Node{mkcall1(fn, fn.Type().Results(), &fnInit, bytePtrToIndex(selv, 0), bytePtrToIndex(order, 0), pc0, ir.NewInt(base.Pos, int64(nsends)), ir.NewInt(base.Pos, int64(nrecvs)), ir.NewBool(base.Pos, dflt == nil))}
 	init = append(init, fnInit...)
 	init = append(init, typecheck.Stmt(r))
 
@@ -261,7 +261,7 @@
 
 	if dflt != nil {
 		ir.SetPos(dflt)
-		dispatch(ir.NewBinaryExpr(base.Pos, ir.OLT, chosen, ir.NewInt(0)), dflt)
+		dispatch(ir.NewBinaryExpr(base.Pos, ir.OLT, chosen, ir.NewInt(base.Pos, 0)), dflt)
 	}
 	for i, cas := range casorder {
 		ir.SetPos(cas)
@@ -269,7 +269,7 @@
 			dispatch(nil, cas)
 			break
 		}
-		dispatch(ir.NewBinaryExpr(base.Pos, ir.OEQ, chosen, ir.NewInt(int64(i))), cas)
+		dispatch(ir.NewBinaryExpr(base.Pos, ir.OEQ, chosen, ir.NewInt(base.Pos, int64(i))), cas)
 	}
 
 	return init
@@ -277,7 +277,7 @@
 
 // bytePtrToIndex returns a Node representing "(*byte)(&n[i])".
 func bytePtrToIndex(n ir.Node, i int64) ir.Node {
-	s := typecheck.NodAddr(ir.NewIndexExpr(base.Pos, n, ir.NewInt(i)))
+	s := typecheck.NodAddr(ir.NewIndexExpr(base.Pos, n, ir.NewInt(base.Pos, i)))
 	t := types.NewPtr(types.Types[types.TUINT8])
 	return typecheck.ConvNop(s, t)
 }
@@ -287,7 +287,7 @@
 // Keep in sync with src/runtime/select.go.
 func scasetype() *types.Type {
 	if scase == nil {
-		scase = types.NewStruct(types.NoPkg, []*types.Field{
+		scase = types.NewStruct([]*types.Field{
 			types.NewField(base.Pos, typecheck.Lookup("c"), types.Types[types.TUNSAFEPTR]),
 			types.NewField(base.Pos, typecheck.Lookup("elem"), types.Types[types.TUNSAFEPTR]),
 		})
diff --git a/src/cmd/compile/internal/walk/stmt.go b/src/cmd/compile/internal/walk/stmt.go
index ceee1b1..c6a03d2 100644
--- a/src/cmd/compile/internal/walk/stmt.go
+++ b/src/cmd/compile/internal/walk/stmt.go
@@ -39,6 +39,7 @@
 		ir.OAS2RECV,
 		ir.OAS2FUNC,
 		ir.OAS2MAPR,
+		ir.OCLEAR,
 		ir.OCLOSE,
 		ir.OCOPY,
 		ir.OCALLINTER,
diff --git a/src/cmd/compile/internal/walk/switch.go b/src/cmd/compile/internal/walk/switch.go
index 8ca8fa8..1a167d3 100644
--- a/src/cmd/compile/internal/walk/switch.go
+++ b/src/cmd/compile/internal/walk/switch.go
@@ -42,7 +42,7 @@
 
 	// convert switch {...} to switch true {...}
 	if cond == nil {
-		cond = ir.NewBool(true)
+		cond = ir.NewBool(base.Pos, true)
 		cond = typecheck.Expr(cond)
 		cond = typecheck.DefaultLit(cond, nil)
 	}
@@ -286,11 +286,10 @@
 
 // Try to implement the clauses with a jump table. Returns true if successful.
 func (s *exprSwitch) tryJumpTable(cc []exprClause, out *ir.Nodes) bool {
-	const go119UseJumpTables = true
 	const minCases = 8   // have at least minCases cases in the switch
 	const minDensity = 4 // use at least 1 out of every minDensity entries
 
-	if !go119UseJumpTables || base.Flag.N != 0 || !ssagen.Arch.LinkArch.CanJumpTable || base.Ctxt.Retpoline {
+	if base.Flag.N != 0 || !ssagen.Arch.LinkArch.CanJumpTable || base.Ctxt.Retpoline {
 		return false
 	}
 	if len(cc) < minCases {
@@ -621,13 +620,13 @@
 	// TODO: figure out if we could use a jump table using some low bits of the type hashes.
 	binarySearch(len(cc), &s.done,
 		func(i int) ir.Node {
-			return ir.NewBinaryExpr(base.Pos, ir.OLE, s.hashname, ir.NewInt(int64(cc[i-1].hash)))
+			return ir.NewBinaryExpr(base.Pos, ir.OLE, s.hashname, ir.NewInt(base.Pos, int64(cc[i-1].hash)))
 		},
 		func(i int, nif *ir.IfStmt) {
 			// TODO(mdempsky): Omit hash equality check if
 			// there's only one type.
 			c := cc[i]
-			nif.Cond = ir.NewBinaryExpr(base.Pos, ir.OEQ, s.hashname, ir.NewInt(int64(c.hash)))
+			nif.Cond = ir.NewBinaryExpr(base.Pos, ir.OEQ, s.hashname, ir.NewInt(base.Pos, int64(c.hash)))
 			nif.Body.Append(c.body.Take()...)
 		},
 	)
@@ -738,9 +737,9 @@
 	slice := ir.NewConvExpr(base.Pos, ir.OSTR2BYTESTMP, types.NewSlice(types.Types[types.TINT8]), expr)
 	slice.SetTypecheck(1) // legacy typechecker doesn't handle this op
 	// Load the byte we're splitting on.
-	load := ir.NewIndexExpr(base.Pos, slice, ir.NewInt(int64(bestIdx)))
+	load := ir.NewIndexExpr(base.Pos, slice, ir.NewInt(base.Pos, int64(bestIdx)))
 	// Compare with the value we're splitting on.
-	cmp := ir.Node(ir.NewBinaryExpr(base.Pos, ir.OLE, load, ir.NewInt(int64(bestByte))))
+	cmp := ir.Node(ir.NewBinaryExpr(base.Pos, ir.OLE, load, ir.NewInt(base.Pos, int64(bestByte))))
 	cmp = typecheck.DefaultLit(typecheck.Expr(cmp), nil)
 	nif := ir.NewIfStmt(base.Pos, cmp, nil, nil)
 
diff --git a/src/cmd/compile/internal/walk/temp.go b/src/cmd/compile/internal/walk/temp.go
index 9879a6c..d2ffb22 100644
--- a/src/cmd/compile/internal/walk/temp.go
+++ b/src/cmd/compile/internal/walk/temp.go
@@ -28,7 +28,7 @@
 	return initStackTemp(init, typecheck.Temp(typ), nil)
 }
 
-// stackBufAddr returns thte expression &tmp, where tmp is a newly
+// stackBufAddr returns the expression &tmp, where tmp is a newly
 // allocated temporary variable of type [len]elem. This variable is
 // initialized, and elem must not contain pointers.
 func stackBufAddr(len int64, elem *types.Type) *ir.AddrExpr {
diff --git a/src/cmd/compile/internal/walk/walk.go b/src/cmd/compile/internal/walk/walk.go
index f5a2f9b..149e23a 100644
--- a/src/cmd/compile/internal/walk/walk.go
+++ b/src/cmd/compile/internal/walk/walk.go
@@ -278,8 +278,10 @@
 	} else {
 		ptr.SetType(n.Type().Elem().PtrTo())
 	}
+	ptr.SetTypecheck(1)
 	length = ir.NewUnaryExpr(base.Pos, ir.OLEN, n)
 	length.SetType(types.Types[types.TINT])
+	length.SetTypecheck(1)
 	return ptr, length
 }
 
@@ -337,6 +339,10 @@
 			n := n.(*ir.ConvExpr)
 			return ssagen.Arch.SoftFloat && (isSoftFloat(n.Type()) || isSoftFloat(n.X.Type()))
 
+		case ir.OMIN, ir.OMAX:
+			// string or float requires runtime call, see (*ssagen.state).minmax method.
+			return n.Type().IsString() || n.Type().IsFloat()
+
 		case ir.OLITERAL, ir.ONIL, ir.ONAME, ir.OLINKSYMOFFSET, ir.OMETHEXPR,
 			ir.OAND, ir.OANDNOT, ir.OLSH, ir.OOR, ir.ORSH, ir.OXOR, ir.OCOMPLEX, ir.OEFACE,
 			ir.OADDR, ir.OBITNOT, ir.ONOT, ir.OPLUS,
diff --git a/src/cmd/compile/internal/wasm/ssa.go b/src/cmd/compile/internal/wasm/ssa.go
index 0578c20..85f34a7 100644
--- a/src/cmd/compile/internal/wasm/ssa.go
+++ b/src/cmd/compile/internal/wasm/ssa.go
@@ -285,10 +285,10 @@
 		}
 
 	case ssa.OpWasmLoweredWB:
-		getValue64(s, v.Args[0])
-		getValue64(s, v.Args[1])
-		p := s.Prog(wasm.ACALLNORESUME) // TODO(neelance): If possible, turn this into a simple wasm.ACall).
-		p.To = obj.Addr{Type: obj.TYPE_MEM, Name: obj.NAME_EXTERN, Sym: v.Aux.(*obj.LSym)}
+		p := s.Prog(wasm.ACall)
+		// AuxInt encodes how many buffer entries we need.
+		p.To = obj.Addr{Type: obj.TYPE_MEM, Name: obj.NAME_EXTERN, Sym: ir.Syms.GCWriteBarrier[v.AuxInt-1]}
+		setReg(s, v.Reg0()) // move result from wasm stack to register local
 
 	case ssa.OpWasmI64Store8, ssa.OpWasmI64Store16, ssa.OpWasmI64Store32, ssa.OpWasmI64Store, ssa.OpWasmF32Store, ssa.OpWasmF64Store:
 		getValue32(s, v.Args[0])
diff --git a/src/cmd/compile/internal/x86/ssa.go b/src/cmd/compile/internal/x86/ssa.go
index 40a483f..42ec44a 100644
--- a/src/cmd/compile/internal/x86/ssa.go
+++ b/src/cmd/compile/internal/x86/ssa.go
@@ -28,7 +28,7 @@
 		v := b.Values[i]
 		if flive && v.Op == ssa.Op386MOVLconst {
 			// The "mark" is any non-nil Aux value.
-			v.Aux = v
+			v.Aux = ssa.AuxMark
 		}
 		if v.Type.IsFlags() {
 			flive = false
@@ -345,7 +345,7 @@
 		p.From.Offset = v.AuxInt
 		p.To.Type = obj.TYPE_REG
 		p.To.Reg = r
-		p.SetFrom3Reg(v.Args[0].Reg())
+		p.AddRestSourceReg(v.Args[0].Reg())
 
 	case ssa.Op386SUBLconst,
 		ssa.Op386ADCLconst,
@@ -737,7 +737,8 @@
 		p := s.Prog(obj.ACALL)
 		p.To.Type = obj.TYPE_MEM
 		p.To.Name = obj.NAME_EXTERN
-		p.To.Sym = v.Aux.(*obj.LSym)
+		// AuxInt encodes how many buffer entries we need.
+		p.To.Sym = ir.Syms.GCWriteBarrier[v.AuxInt-1]
 
 	case ssa.Op386LoweredPanicBoundsA, ssa.Op386LoweredPanicBoundsB, ssa.Op386LoweredPanicBoundsC:
 		p := s.Prog(obj.ACALL)
@@ -830,6 +831,29 @@
 		if base.Debug.Nil != 0 && v.Pos.Line() > 1 { // v.Pos.Line()==1 in generated wrappers
 			base.WarnfAt(v.Pos, "generated nil check")
 		}
+	case ssa.Op386LoweredCtz32:
+		// BSFL in, out
+		p := s.Prog(x86.ABSFL)
+		p.From.Type = obj.TYPE_REG
+		p.From.Reg = v.Args[0].Reg()
+		p.To.Type = obj.TYPE_REG
+		p.To.Reg = v.Reg()
+
+		// JNZ 2(PC)
+		p1 := s.Prog(x86.AJNE)
+		p1.To.Type = obj.TYPE_BRANCH
+
+		// MOVL $32, out
+		p2 := s.Prog(x86.AMOVL)
+		p2.From.Type = obj.TYPE_CONST
+		p2.From.Offset = 32
+		p2.To.Type = obj.TYPE_REG
+		p2.To.Reg = v.Reg()
+
+		// NOP (so the JNZ has somewhere to land)
+		nop := s.Prog(obj.ANOP)
+		p1.To.SetTarget(nop)
+
 	case ssa.OpClobber:
 		p := s.Prog(x86.AMOVL)
 		p.From.Type = obj.TYPE_CONST
diff --git a/src/cmd/compile/profile.sh b/src/cmd/compile/profile.sh
new file mode 100644
index 0000000..37d65d8
--- /dev/null
+++ b/src/cmd/compile/profile.sh
@@ -0,0 +1,21 @@
+# Copyright 2023 The Go 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 collects a CPU profile of the compiler
+# for building all targets in std and cmd, and puts
+# the profile at cmd/compile/default.pgo.
+
+dir=$(mktemp -d)
+cd $dir
+seed=$(date)
+
+for p in $(go list std cmd); do
+	h=$(echo $seed $p | md5sum | cut -d ' ' -f 1)
+	echo $p $h
+	go build -o /dev/null -gcflags=-cpuprofile=$PWD/prof.$h $p
+done
+
+go tool pprof -proto prof.* > $(go env GOROOT)/src/cmd/compile/default.pgo
+
+rm -r $dir
diff --git a/src/cmd/covdata/argsmerge.go b/src/cmd/covdata/argsmerge.go
index 8815a4a..8af1432 100644
--- a/src/cmd/covdata/argsmerge.go
+++ b/src/cmd/covdata/argsmerge.go
@@ -4,7 +4,11 @@
 
 package main
 
-import "fmt"
+import (
+	"fmt"
+	"slices"
+	"strconv"
+)
 
 type argvalues struct {
 	osargs []string
@@ -17,25 +21,13 @@
 	initialized bool
 }
 
-func ssleq(s1 []string, s2 []string) bool {
-	if len(s1) != len(s2) {
-		return false
-	}
-	for i := range s1 {
-		if s1[i] != s2[i] {
-			return false
-		}
-	}
-	return true
-}
-
 func (a *argstate) Merge(state argvalues) {
 	if !a.initialized {
 		a.state = state
 		a.initialized = true
 		return
 	}
-	if !ssleq(a.state.osargs, state.osargs) {
+	if !slices.Equal(a.state.osargs, state.osargs) {
 		a.state.osargs = nil
 	}
 	if state.goos != a.state.goos {
@@ -49,7 +41,7 @@
 func (a *argstate) ArgsSummary() map[string]string {
 	m := make(map[string]string)
 	if len(a.state.osargs) != 0 {
-		m["argc"] = fmt.Sprintf("%d", len(a.state.osargs))
+		m["argc"] = strconv.Itoa(len(a.state.osargs))
 		for k, a := range a.state.osargs {
 			m[fmt.Sprintf("argv%d", k)] = a
 		}
diff --git a/src/cmd/covdata/doc.go b/src/cmd/covdata/doc.go
index 924a742..1836bb8 100644
--- a/src/cmd/covdata/doc.go
+++ b/src/cmd/covdata/doc.go
@@ -3,82 +3,78 @@
 // license that can be found in the LICENSE file.
 
 /*
-//
-// Covdata is a program for manipulating and generating reports
-// from 2nd-generation coverage testing output files, those produced
-// from running applications or integration tests. E.g.
-//
-//		$ mkdir ./profiledir
-//		$ go build -cover -o myapp.exe .
-//		$ GOCOVERDIR=./profiledir ./myapp.exe <arguments>
-//		$ ls ./profiledir
-//		covcounters.cce1b350af34b6d0fb59cc1725f0ee27.821598.1663006712821344241
-//		covmeta.cce1b350af34b6d0fb59cc1725f0ee27
-//		$
-//
-// Run covdata via "go tool covdata <mode>", where 'mode' is a subcommand
-// selecting a specific reporting, merging, or data manipulation operation.
-// Descriptions on the various modes (run "go tool cover <mode> -help" for
-// specifics on usage of a given mode:
-//
-// 1. Report percent of statements covered in each profiled package
-//
-//		$ go tool covdata percent -i=profiledir
-//		cov-example/p	coverage: 41.1% of statements
-//		main	coverage: 87.5% of statements
-//      $
-//
-//
-// 2. Report import paths of packages profiled
-//
-//		$ go tool covdata pkglist -i=profiledir
-//		cov-example/p
-//		main
-//      $
-//
-// 3. Report percent statements covered by function:
-//
-//		$ go tool covdata func -i=profiledir
-//		cov-example/p/p.go:12:		emptyFn			0.0%
-//		cov-example/p/p.go:32:		Small			100.0%
-//		cov-example/p/p.go:47:		Medium			90.9%
-//      ...
-//      $
-//
-// 4. Convert coverage data to legacy textual format:
-//
-//		$ go tool covdata textfmt -i=profiledir -o=cov.txt
-//      $ head cov.txt
-//      mode: set
-//      cov-example/p/p.go:12.22,13.2 0 0
-//      cov-example/p/p.go:15.31,16.2 1 0
-//      cov-example/p/p.go:16.3,18.3 0 0
-//      cov-example/p/p.go:19.3,21.3 0 0
-//      ...
-//      $ go tool cover -html=cov.txt
-//      $
-//
-// 5. Merge profiles together:
-//
-//		$ go tool covdata merge -i=indir1,indir2 -o=outdir -modpaths=github.com/go-delve/delve
-//      $
-//
-// 6. Subtract one profile from another
-//
-//		$ go tool covdata subtract -i=indir1,indir2 -o=outdir
-//      $
-//
-// 7. Intersect profiles
-//
-//		$ go tool covdata intersect -i=indir1,indir2 -o=outdir
-//      $
-//
-// 8. Dump a profile for debugging purposes.
-//
-//		$ go tool covdata debugdump -i=indir
-//      <human readable output>
-//      $
-//
-*/
+Covdata is a program for manipulating and generating reports
+from 2nd-generation coverage testing output files, those produced
+from running applications or integration tests. E.g.
 
+	$ mkdir ./profiledir
+	$ go build -cover -o myapp.exe .
+	$ GOCOVERDIR=./profiledir ./myapp.exe <arguments>
+	$ ls ./profiledir
+	covcounters.cce1b350af34b6d0fb59cc1725f0ee27.821598.1663006712821344241
+	covmeta.cce1b350af34b6d0fb59cc1725f0ee27
+	$
+
+Run covdata via "go tool covdata <mode>", where 'mode' is a subcommand
+selecting a specific reporting, merging, or data manipulation operation.
+Descriptions on the various modes (run "go tool cover <mode> -help" for
+specifics on usage of a given mode:
+
+1. Report percent of statements covered in each profiled package
+
+	$ go tool covdata percent -i=profiledir
+	cov-example/p	coverage: 41.1% of statements
+	main	coverage: 87.5% of statements
+	$
+
+2. Report import paths of packages profiled
+
+	$ go tool covdata pkglist -i=profiledir
+	cov-example/p
+	main
+	$
+
+3. Report percent statements covered by function:
+
+	$ go tool covdata func -i=profiledir
+	cov-example/p/p.go:12:		emptyFn			0.0%
+	cov-example/p/p.go:32:		Small			100.0%
+	cov-example/p/p.go:47:		Medium			90.9%
+	...
+	$
+
+4. Convert coverage data to legacy textual format:
+
+	$ go tool covdata textfmt -i=profiledir -o=cov.txt
+	$ head cov.txt
+	mode: set
+	cov-example/p/p.go:12.22,13.2 0 0
+	cov-example/p/p.go:15.31,16.2 1 0
+	cov-example/p/p.go:16.3,18.3 0 0
+	cov-example/p/p.go:19.3,21.3 0 0
+	...
+	$ go tool cover -html=cov.txt
+	$
+
+5. Merge profiles together:
+
+	$ go tool covdata merge -i=indir1,indir2 -o=outdir -modpaths=github.com/go-delve/delve
+	$
+
+6. Subtract one profile from another
+
+	$ go tool covdata subtract -i=indir1,indir2 -o=outdir
+	$
+
+7. Intersect profiles
+
+	$ go tool covdata intersect -i=indir1,indir2 -o=outdir
+	$
+
+8. Dump a profile for debugging purposes.
+
+	$ go tool covdata debugdump -i=indir
+	<human readable output>
+	$
+*/
 package main
diff --git a/src/cmd/covdata/dump.go b/src/cmd/covdata/dump.go
index 6226717..a51762f 100644
--- a/src/cmd/covdata/dump.go
+++ b/src/cmd/covdata/dump.go
@@ -38,6 +38,14 @@
 		cmd: cmd,
 		cm:  &cmerge.Merger{},
 	}
+	// For these modes (percent, pkglist, func, etc), use a relaxed
+	// policy when it comes to counter mode clashes. For a percent
+	// report, for example, we only care whether a given line is
+	// executed at least once, so it's ok to (effectively) merge
+	// together runs derived from different counter modes.
+	if d.cmd == percentMode || d.cmd == funcMode || d.cmd == pkglistMode {
+		d.cm.SetModeMergePolicy(cmerge.ModeMergeRelaxed)
+	}
 	if d.cmd == pkglistMode {
 		d.pkgpaths = make(map[string]struct{})
 	}
@@ -317,7 +325,7 @@
 	// d.format maybe nil here if the specified input dir was empty.
 	if d.format != nil {
 		if d.cmd == percentMode {
-			d.format.EmitPercent(os.Stdout, "", false)
+			d.format.EmitPercent(os.Stdout, "", false, false)
 		}
 		if d.cmd == funcMode {
 			d.format.EmitFuncs(os.Stdout)
diff --git a/src/cmd/covdata/merge.go b/src/cmd/covdata/merge.go
index 225861d..63e823d 100644
--- a/src/cmd/covdata/merge.go
+++ b/src/cmd/covdata/merge.go
@@ -11,6 +11,7 @@
 	"flag"
 	"fmt"
 	"internal/coverage"
+	"internal/coverage/cmerge"
 	"internal/coverage/decodecounter"
 	"internal/coverage/decodemeta"
 	"internal/coverage/pods"
@@ -60,6 +61,7 @@
 	if *outdirflag == "" {
 		m.Usage("select output directory with '-o' option")
 	}
+	m.mm.SetModeMergePolicy(cmerge.ModeMergeRelaxed)
 }
 
 func (m *mstate) BeginPod(p pods.Pod) {
diff --git a/src/cmd/covdata/metamerge.go b/src/cmd/covdata/metamerge.go
index 7f15742..6c68e0c 100644
--- a/src/cmd/covdata/metamerge.go
+++ b/src/cmd/covdata/metamerge.go
@@ -160,13 +160,13 @@
 // the things in a pod -- counter files and meta-data file. There are
 // three cases of interest here:
 //
-// Case 1: in an unconditonal merge (we're not selecting a specific set of
+// Case 1: in an unconditional merge (we're not selecting a specific set of
 // packages using "-pkg", and the "-pcombine" option is not in use),
 // we can simply copy over the meta-data file from input to output.
 //
 // Case 2: if this is a select merge (-pkg is in effect), then at
 // this point we write out a new smaller meta-data file that includes
-// only the packages of interest). At this point we also emit a merged
+// only the packages of interest. At this point we also emit a merged
 // counter data file as well.
 //
 // Case 3: if "-pcombine" is in effect, we don't write anything at
@@ -273,17 +273,6 @@
 	mm.astate = &argstate{}
 }
 
-// NumFuncs is used while writing the counter data files; it
-// implements the 'NumFuncs' method required by the interface
-// internal/coverage/encodecounter/CounterVisitor.
-func (mm *metaMerge) NumFuncs() (int, error) {
-	rval := 0
-	for _, p := range mm.pkgs {
-		rval += len(p.ctab)
-	}
-	return rval, nil
-}
-
 // VisitFuncs is used while writing the counter data files; it
 // implements the 'VisitFuncs' method required by the interface
 // internal/coverage/encodecounter/CounterVisitor.
diff --git a/src/cmd/covdata/tool_test.go b/src/cmd/covdata/tool_test.go
index 42334ea..d99113e 100644
--- a/src/cmd/covdata/tool_test.go
+++ b/src/cmd/covdata/tool_test.go
@@ -672,7 +672,7 @@
 		t.Errorf("merge run produced unexpected output: %v", lines)
 	}
 
-	// We expect the merge tool to produce exacty two files: a meta
+	// We expect the merge tool to produce exactly two files: a meta
 	// data file and a counter file. If we get more than just this one
 	// pair, something went wrong.
 	podlist, err := pods.CollectPods([]string{moutdir}, true)
@@ -808,7 +808,7 @@
 
 	// Try to merge covdata0 (from prog1.go -countermode=set) with
 	// covdata1 (from prog1.go -countermode=atomic"). This should
-	// produce a counter mode clash error.
+	// work properly, but result in multiple meta-data files.
 	ins := fmt.Sprintf("-i=%s,%s", s.outdirs[0], s.outdirs[3])
 	out := fmt.Sprintf("-o=%s", ccoutdir)
 	args := append([]string{}, "merge", ins, out, "-pcombine")
@@ -818,13 +818,27 @@
 	cmd := testenv.Command(t, s.tool, args...)
 	b, err := cmd.CombinedOutput()
 	t.Logf("%% output: %s\n", string(b))
+	if err != nil {
+		t.Fatalf("clash merge failed: %v", err)
+	}
+
+	// Ask for a textual report from the two dirs. Here we have
+	// to report the mode clash.
+	out = "-o=" + filepath.Join(ccoutdir, "file.txt")
+	args = append([]string{}, "textfmt", ins, out)
+	if debugtrace {
+		t.Logf("clash textfmt command is %s %v\n", s.tool, args)
+	}
+	cmd = testenv.Command(t, s.tool, args...)
+	b, err = cmd.CombinedOutput()
+	t.Logf("%% output: %s\n", string(b))
 	if err == nil {
-		t.Fatalf("clash merge passed unexpectedly")
+		t.Fatalf("expected mode clash")
 	}
 	got := string(b)
 	want := "counter mode clash while reading meta-data"
 	if !strings.Contains(got, want) {
-		t.Errorf("counter clash merge: wanted %s got %s", want, got)
+		t.Errorf("counter clash textfmt: wanted %s got %s", want, got)
 	}
 }
 
diff --git a/src/cmd/cover/cfg_test.go b/src/cmd/cover/cfg_test.go
index 0a29567..6782ec8 100644
--- a/src/cmd/cover/cfg_test.go
+++ b/src/cmd/cover/cfg_test.go
@@ -41,7 +41,9 @@
 func writeOutFileList(t *testing.T, infiles []string, outdir, tag string) ([]string, string) {
 	outfilelist := filepath.Join(outdir, tag+"outfilelist.txt")
 	var sb strings.Builder
-	outfs := []string{}
+	cv := filepath.Join(outdir, "covervars.go")
+	outfs := []string{cv}
+	fmt.Fprintf(&sb, "%s\n", cv)
 	for _, inf := range infiles {
 		base := filepath.Base(inf)
 		of := filepath.Join(outdir, tag+".cov."+base)
diff --git a/src/cmd/cover/cover.go b/src/cmd/cover/cover.go
index 74bb500..a4b837c 100644
--- a/src/cmd/cover/cover.go
+++ b/src/cmd/cover/cover.go
@@ -74,7 +74,14 @@
 
 var pkgconfig coverage.CoverPkgConfig
 
-var outputfiles []string // set when -pkgcfg is in use
+// outputfiles is the list of *.cover.go instrumented outputs to write,
+// one per input (set when -pkgcfg is in use)
+var outputfiles []string
+
+// covervarsoutfile is an additional Go source file into which we'll
+// write definitions of coverage counter variables + meta data variables
+// (set when -pkgcfg is in use).
+var covervarsoutfile string
 
 var profile string // The profile to read; the value of -html or -func
 
@@ -88,7 +95,7 @@
 func main() {
 	objabi.AddVersionFlag()
 	flag.Usage = usage
-	flag.Parse()
+	objabi.Flagparse(usage)
 
 	// Usage information when no arguments.
 	if flag.NFlag() == 0 && flag.NArg() == 0 {
@@ -165,6 +172,8 @@
 				if outputfiles, err = readOutFileList(*outfilelist); err != nil {
 					return err
 				}
+				covervarsoutfile = outputfiles[0]
+				outputfiles = outputfiles[1:]
 				numInputs := len(flag.Args())
 				numOutputs := len(outputfiles)
 				if numOutputs != numInputs {
@@ -568,9 +577,9 @@
 	}
 	// TODO: process files in parallel here if it matters.
 	for k, name := range names {
-		last := false
-		if k == len(names)-1 {
-			last = true
+		if strings.ContainsAny(name, "\r\n") {
+			// annotateFile uses '//line' directives, which don't permit newlines.
+			log.Fatalf("cover: input path contains newline character: %q", name)
 		}
 
 		fd := os.Stdout
@@ -590,16 +599,27 @@
 			}
 			isStdout = false
 		}
-		p.annotateFile(name, fd, last)
+		p.annotateFile(name, fd)
 		if !isStdout {
 			if err := fd.Close(); err != nil {
 				log.Fatalf("cover: %s", err)
 			}
 		}
 	}
+
+	if *pkgcfg != "" {
+		fd, err := os.Create(covervarsoutfile)
+		if err != nil {
+			log.Fatalf("cover: %s", err)
+		}
+		p.emitMetaData(fd)
+		if err := fd.Close(); err != nil {
+			log.Fatalf("cover: %s", err)
+		}
+	}
 }
 
-func (p *Package) annotateFile(name string, fd io.Writer, last bool) {
+func (p *Package) annotateFile(name string, fd io.Writer) {
 	fset := token.NewFileSet()
 	content, err := os.ReadFile(name)
 	if err != nil {
@@ -645,6 +665,11 @@
 	}
 	newContent := file.edit.Bytes()
 
+	if strings.ContainsAny(name, "\r\n") {
+		// This should have been checked by the caller already, but we double check
+		// here just to be sure we haven't missed a caller somewhere.
+		panic(fmt.Sprintf("annotateFile: name contains unexpected newline character: %q", name))
+	}
 	fmt.Fprintf(fd, "//line %s:1:1\n", name)
 	fd.Write(newContent)
 
@@ -656,12 +681,7 @@
 	// Emit a reference to the atomic package to avoid
 	// import and not used error when there's no code in a file.
 	if *mode == "atomic" {
-		fmt.Fprintf(fd, "var _ = %sLoadUint32\n", atomicPackagePrefix())
-	}
-
-	// Last file? Emit meta-data and converage config.
-	if last {
-		p.emitMetaData(fd)
+		fmt.Fprintf(fd, "\nvar _ = %sLoadUint32\n", atomicPackagePrefix())
 	}
 }
 
@@ -1073,6 +1093,9 @@
 		panic("internal error: seen functions with regonly/testmain")
 	}
 
+	// Emit package name.
+	fmt.Fprintf(w, "\npackage %s\n\n", pkgconfig.PkgName)
+
 	// Emit package ID var.
 	fmt.Fprintf(w, "\nvar %sP uint32\n", *varVar)
 
diff --git a/src/cmd/cover/cover_test.go b/src/cmd/cover/cover_test.go
index af266b5..7bfe2d0 100644
--- a/src/cmd/cover/cover_test.go
+++ b/src/cmd/cover/cover_test.go
@@ -126,6 +126,9 @@
 	t.Run("FuncWithDuplicateLines", func(t *testing.T) {
 		testFuncWithDuplicateLines(t, toolexecArg)
 	})
+	t.Run("MissingTrailingNewlineIssue58370", func(t *testing.T) {
+		testMissingTrailingNewlineIssue58370(t, toolexecArg)
+	})
 }
 
 // Execute this command sequence:
@@ -574,3 +577,73 @@
 	}
 	return string(out)
 }
+
+// Test instrumentation of package that ends before an expected
+// trailing newline following package clause. Issue #58370.
+func testMissingTrailingNewlineIssue58370(t *testing.T, toolexecArg string) {
+	testenv.MustHaveGoBuild(t)
+	dir := tempDir(t)
+
+	t.Parallel()
+
+	noeolDir := filepath.Join(dir, "issue58370")
+	noeolGo := filepath.Join(noeolDir, "noeol.go")
+	noeolTestGo := filepath.Join(noeolDir, "noeol_test.go")
+
+	if err := os.Mkdir(noeolDir, 0777); err != nil {
+		t.Fatal(err)
+	}
+
+	if err := os.WriteFile(filepath.Join(noeolDir, "go.mod"), []byte("module noeol\n"), 0666); err != nil {
+		t.Fatal(err)
+	}
+	const noeolContents = `package noeol`
+	if err := os.WriteFile(noeolGo, []byte(noeolContents), 0444); err != nil {
+		t.Fatal(err)
+	}
+	const noeolTestContents = `
+package noeol
+import "testing"
+func TestCoverage(t *testing.T) { }
+`
+	if err := os.WriteFile(noeolTestGo, []byte(noeolTestContents), 0444); err != nil {
+		t.Fatal(err)
+	}
+
+	// go test -covermode atomic
+	cmd := testenv.Command(t, testenv.GoToolPath(t), "test", toolexecArg, "-covermode", "atomic")
+	cmd.Env = append(cmd.Environ(), "CMDCOVER_TOOLEXEC=true")
+	cmd.Dir = noeolDir
+	run(cmd, t)
+}
+
+func TestSrcPathWithNewline(t *testing.T) {
+	testenv.MustHaveExec(t)
+	t.Parallel()
+
+	// srcPath is intentionally not clean so that the path passed to testcover
+	// will not normalize the trailing / to a \ on Windows.
+	srcPath := t.TempDir() + string(filepath.Separator) + "\npackage main\nfunc main() { panic(string([]rune{'u', 'h', '-', 'o', 'h'}))\n/*/main.go"
+	mainSrc := ` package main
+
+func main() {
+	/* nothing here */
+	println("ok")
+}
+`
+	if err := os.MkdirAll(filepath.Dir(srcPath), 0777); err != nil {
+		t.Skipf("creating directory with bogus path: %v", err)
+	}
+	if err := os.WriteFile(srcPath, []byte(mainSrc), 0666); err != nil {
+		t.Skipf("writing file with bogus directory: %v", err)
+	}
+
+	cmd := testenv.Command(t, testcover(t), "-mode=atomic", srcPath)
+	cmd.Stderr = new(bytes.Buffer)
+	out, err := cmd.Output()
+	t.Logf("%v:\n%s", cmd, out)
+	t.Logf("stderr:\n%s", cmd.Stderr)
+	if err == nil {
+		t.Errorf("unexpected success; want failure due to newline in file path")
+	}
+}
diff --git a/src/cmd/dist/build.go b/src/cmd/dist/build.go
index c36a12e..8973a87 100644
--- a/src/cmd/dist/build.go
+++ b/src/cmd/dist/build.go
@@ -9,6 +9,8 @@
 	"encoding/json"
 	"flag"
 	"fmt"
+	"io"
+	"io/fs"
 	"log"
 	"os"
 	"os/exec"
@@ -46,15 +48,16 @@
 	tooldir          string
 	oldgoos          string
 	oldgoarch        string
+	oldgocache       string
 	exe              string
 	defaultcc        map[string]string
 	defaultcxx       map[string]string
 	defaultpkgconfig string
 	defaultldso      string
 
-	rebuildall   bool
-	defaultclang bool
-	noOpt        bool
+	rebuildall bool
+	noOpt      bool
+	isRelease  bool
 
 	vflag int // verbosity
 )
@@ -85,6 +88,7 @@
 	"illumos",
 	"ios",
 	"js",
+	"wasip1",
 	"linux",
 	"android",
 	"solaris",
@@ -210,12 +214,8 @@
 	gogcflags = os.Getenv("BOOT_GO_GCFLAGS")
 	goldflags = os.Getenv("BOOT_GO_LDFLAGS")
 
-	cc, cxx := "gcc", "g++"
-	if defaultclang {
-		cc, cxx = "clang", "clang++"
-	}
-	defaultcc = compilerEnv("CC", cc)
-	defaultcxx = compilerEnv("CXX", cxx)
+	defaultcc = compilerEnv("CC", "")
+	defaultcxx = compilerEnv("CXX", "")
 
 	b = os.Getenv("PKG_CONFIG")
 	if b == "" {
@@ -239,11 +239,6 @@
 	os.Setenv("GOROOT", goroot)
 	os.Setenv("GOROOT_FINAL", goroot_final)
 
-	// Use a build cache separate from the default user one.
-	// Also one that will be wiped out during startup, so that
-	// make.bash really does start from a clean slate.
-	os.Setenv("GOCACHE", pathf("%s/pkg/obj/go-build", goroot))
-
 	// Set GOBIN to GOROOT/bin. The meaning of GOBIN has drifted over time
 	// (see https://go.dev/issue/3269, https://go.dev/cl/183058,
 	// https://go.dev/issue/31576). Since we want binaries installed by 'dist' to
@@ -265,6 +260,9 @@
 	xatexit(rmworkdir)
 
 	tooldir = pathf("%s/pkg/tool/%s_%s", goroot, gohostos, gohostarch)
+
+	goversion := findgoversion()
+	isRelease = strings.HasPrefix(goversion, "release.") || strings.HasPrefix(goversion, "go")
 }
 
 // compilerEnv returns a map from "goos/goarch" to the
@@ -308,12 +306,37 @@
 	return m
 }
 
+// clangos lists the operating systems where we prefer clang to gcc.
+var clangos = []string{
+	"darwin", "ios", // macOS 10.9 and later require clang
+	"freebsd", // FreeBSD 10 and later do not ship gcc
+	"openbsd", // OpenBSD ships with GCC 4.2, which is now quite old.
+}
+
 // compilerEnvLookup returns the compiler settings for goos/goarch in map m.
-func compilerEnvLookup(m map[string]string, goos, goarch string) string {
+// kind is "CC" or "CXX".
+func compilerEnvLookup(kind string, m map[string]string, goos, goarch string) string {
+	if !needCC() {
+		return ""
+	}
 	if cc := m[goos+"/"+goarch]; cc != "" {
 		return cc
 	}
-	return m[""]
+	if cc := m[""]; cc != "" {
+		return cc
+	}
+	for _, os := range clangos {
+		if goos == os {
+			if kind == "CXX" {
+				return "clang++"
+			}
+			return "clang"
+		}
+	}
+	if kind == "CXX" {
+		return "g++"
+	}
+	return "gcc"
 }
 
 // rmworkdir deletes the work directory.
@@ -330,38 +353,46 @@
 }
 
 // findgoversion determines the Go version to use in the version string.
+// It also parses any other metadata found in the version file.
 func findgoversion() string {
 	// The $GOROOT/VERSION file takes priority, for distributions
 	// without the source repo.
 	path := pathf("%s/VERSION", goroot)
 	if isfile(path) {
 		b := chomp(readfile(path))
+
+		// Starting in Go 1.21 the VERSION file starts with the
+		// version on a line by itself but then can contain other
+		// metadata about the release, one item per line.
+		if i := strings.Index(b, "\n"); i >= 0 {
+			rest := b[i+1:]
+			b = chomp(b[:i])
+			for _, line := range strings.Split(rest, "\n") {
+				f := strings.Fields(line)
+				if len(f) == 0 {
+					continue
+				}
+				switch f[0] {
+				default:
+					fatalf("VERSION: unexpected line: %s", line)
+				case "time":
+					if len(f) != 2 {
+						fatalf("VERSION: unexpected time line: %s", line)
+					}
+					_, err := time.Parse(time.RFC3339, f[1])
+					if err != nil {
+						fatalf("VERSION: bad time: %s", err)
+					}
+				}
+			}
+		}
+
 		// Commands such as "dist version > VERSION" will cause
 		// the shell to create an empty VERSION file and set dist's
 		// stdout to its fd. dist in turn looks at VERSION and uses
 		// its content if available, which is empty at this point.
 		// Only use the VERSION file if it is non-empty.
 		if b != "" {
-			// Some builders cross-compile the toolchain on linux-amd64
-			// and then copy the toolchain to the target builder (say, linux-arm)
-			// for use there. But on non-release (devel) branches, the compiler
-			// used on linux-amd64 will be an amd64 binary, and the compiler
-			// shipped to linux-arm will be an arm binary, so they will have different
-			// content IDs (they are binaries for different architectures) and so the
-			// packages compiled by the running-on-amd64 compiler will appear
-			// stale relative to the running-on-arm compiler. Avoid this by setting
-			// the version string to something that doesn't begin with devel.
-			// Then the version string will be used in place of the content ID,
-			// and the packages will look up-to-date.
-			// TODO(rsc): Really the builders could be writing out a better VERSION file instead,
-			// but it is easier to change cmd/dist than to try to make changes to
-			// the builder while Brad is away.
-			if strings.HasPrefix(b, "devel") {
-				if hostType := os.Getenv("META_BUILDLET_HOST_TYPE"); strings.Contains(hostType, "-cross") {
-					fmt.Fprintf(os.Stderr, "warning: changing VERSION from %q to %q\n", b, "builder "+hostType)
-					b = "builder " + hostType
-				}
-			}
 			return b
 		}
 	}
@@ -524,9 +555,9 @@
 		xremove(pathf("%s/bin/%s", goroot, old))
 	}
 
-	// For release, make sure excluded things are excluded.
-	goversion := findgoversion()
-	if strings.HasPrefix(goversion, "release.") || (strings.HasPrefix(goversion, "go") && !strings.Contains(goversion, "beta")) {
+	// Special release-specific setup.
+	if isRelease {
+		// Make sure release-excluded things are excluded.
 		for _, dir := range unreleased {
 			if p := pathf("%s/%s", goroot, dir); isdir(p) {
 				fatalf("%s should not exist in release build", p)
@@ -539,25 +570,50 @@
  * Tool building
  */
 
-// deptab lists changes to the default dependencies for a given prefix.
-// deps ending in /* read the whole directory; deps beginning with -
-// exclude files with that prefix.
-// Note that this table applies only to the build of cmd/go,
-// after the main compiler bootstrap.
-var deptab = []struct {
-	prefix string   // prefix of target
-	dep    []string // dependency tweaks for targets with that prefix
-}{
-	{"cmd/go/internal/cfg", []string{
-		"zdefaultcc.go",
-		"zosarch.go",
-	}},
-	{"runtime/internal/sys", []string{
-		"zversion.go",
-	}},
-	{"go/build", []string{
-		"zcgo.go",
-	}},
+// mustLinkExternal is a copy of internal/platform.MustLinkExternal,
+// duplicated here to avoid version skew in the MustLinkExternal function
+// during bootstrapping.
+func mustLinkExternal(goos, goarch string, cgoEnabled bool) bool {
+	if cgoEnabled {
+		switch goarch {
+		case "loong64",
+			"mips", "mipsle", "mips64", "mips64le",
+			"riscv64":
+			// Internally linking cgo is incomplete on some architectures.
+			// https://golang.org/issue/14449
+			return true
+		case "arm64":
+			if goos == "windows" {
+				// windows/arm64 internal linking is not implemented.
+				return true
+			}
+		case "ppc64":
+			// Big Endian PPC64 cgo internal linking is not implemented for aix or linux.
+			return true
+		}
+
+		switch goos {
+		case "android":
+			return true
+		case "dragonfly":
+			// It seems that on Dragonfly thread local storage is
+			// set up by the dynamic linker, so internal cgo linking
+			// doesn't work. Test case is "go test runtime/cgo".
+			return true
+		}
+	}
+
+	switch goos {
+	case "android":
+		if goarch != "arm64" {
+			return true
+		}
+	case "ios":
+		if goarch == "arm64" {
+			return true
+		}
+	}
+	return false
 }
 
 // depsuffix records the allowed suffixes for source files.
@@ -567,21 +623,16 @@
 }
 
 // gentab records how to generate some trivial files.
+// Files listed here should also be listed in ../distpack/pack.go's srcArch.Remove list.
 var gentab = []struct {
-	nameprefix string
-	gen        func(string, string)
+	pkg  string // Relative to $GOROOT/src
+	file string
+	gen  func(dir, file string)
 }{
-	{"zdefaultcc.go", mkzdefaultcc},
-	{"zosarch.go", mkzosarch},
-	{"zversion.go", mkzversion},
-	{"zcgo.go", mkzcgo},
-
-	// not generated anymore, but delete the file if we see it
-	{"enam.c", nil},
-	{"anames5.c", nil},
-	{"anames6.c", nil},
-	{"anames8.c", nil},
-	{"anames9.c", nil},
+	{"go/build", "zcgo.go", mkzcgo},
+	{"cmd/go/internal/cfg", "zdefaultcc.go", mkzdefaultcc},
+	{"runtime/internal/sys", "zversion.go", mkzversion},
+	{"time/tzdata", "zzipdata.go", mktzdata},
 }
 
 // installed maps from a dir name (as given to install) to a chan
@@ -605,7 +656,7 @@
 	return ch
 }
 
-// runInstall installs the library, package, or binary associated with dir,
+// runInstall installs the library, package, or binary associated with pkg,
 // which is relative to $GOROOT/src.
 func runInstall(pkg string, ch chan struct{}) {
 	if pkg == "net" || pkg == "os/user" || pkg == "crypto/x509" {
@@ -671,7 +722,7 @@
 		if goldflags != "" {
 			link = append(link, goldflags)
 		}
-		link = append(link, "-extld="+compilerEnvLookup(defaultcc, goos, goarch))
+		link = append(link, "-extld="+compilerEnvLookup("CC", defaultcc, goos, goarch))
 		link = append(link, "-L="+pathf("%s/pkg/obj/go-bootstrap/%s_%s", goroot, goos, goarch))
 		link = append(link, "-o", pathf("%s/%s%s", tooldir, elem, exe))
 		targ = len(link) - 1
@@ -692,12 +743,10 @@
 		return !strings.HasPrefix(p, ".") && (!strings.HasPrefix(p, "_") || !strings.HasSuffix(p, ".go"))
 	})
 
-	for _, dt := range deptab {
-		if pkg == dt.prefix || strings.HasSuffix(dt.prefix, "/") && strings.HasPrefix(pkg, dt.prefix) {
-			for _, p := range dt.dep {
-				p = os.ExpandEnv(p)
-				files = append(files, p)
-			}
+	// Add generated files for this package.
+	for _, gt := range gentab {
+		if gt.pkg == pkg {
+			files = append(files, gt.file)
 		}
 	}
 	files = uniq(files)
@@ -710,7 +759,7 @@
 	}
 
 	// Is the target up-to-date?
-	var gofiles, sfiles, missing []string
+	var gofiles, sfiles []string
 	stale := rebuildall
 	files = filter(files, func(p string) bool {
 		for _, suf := range depsuffix {
@@ -732,9 +781,6 @@
 		if t.After(ttarg) {
 			stale = true
 		}
-		if t.IsZero() {
-			missing = append(missing, p)
-		}
 		return true
 	})
 
@@ -762,32 +808,22 @@
 	}
 
 	// Generate any missing files; regenerate existing ones.
-	for _, p := range files {
-		elem := filepath.Base(p)
-		for _, gt := range gentab {
-			if gt.gen == nil {
-				continue
-			}
-			if strings.HasPrefix(elem, gt.nameprefix) {
-				if vflag > 1 {
-					errprintf("generate %s\n", p)
-				}
-				gt.gen(dir, p)
-				// Do not add generated file to clean list.
-				// In runtime, we want to be able to
-				// build the package with the go tool,
-				// and it assumes these generated files already
-				// exist (it does not know how to build them).
-				// The 'clean' command can remove
-				// the generated files.
-				goto built
-			}
+	for _, gt := range gentab {
+		if gt.pkg != pkg {
+			continue
 		}
-		// Did not rebuild p.
-		if find(p, missing) >= 0 {
-			fatalf("missing file %s", p)
+		p := pathf("%s/%s", dir, gt.file)
+		if vflag > 1 {
+			errprintf("generate %s\n", p)
 		}
-	built:
+		gt.gen(dir, p)
+		// Do not add generated file to clean list.
+		// In runtime, we want to be able to
+		// build the package with the go tool,
+		// and it assumes these generated files already
+		// exist (it does not know how to build them).
+		// The 'clean' command can remove
+		// the generated files.
 	}
 
 	// Resolve imported packages to actual package paths.
@@ -1076,7 +1112,7 @@
 	return true
 }
 
-// copy copies the file src to dst, via memory (so only good for small files).
+// copyfile copies the file src to dst, via memory (so only good for small files).
 func copyfile(dst, src string, flag int) {
 	if vflag > 1 {
 		errprintf("cp %s %s\n", src, dst)
@@ -1106,41 +1142,36 @@
 	writefile(bdst.String(), dst, 0)
 }
 
-var runtimegen = []string{
-	"zaexperiment.h",
-	"zversion.go",
-}
-
-// cleanlist is a list of packages with generated files and commands.
-var cleanlist = []string{
-	"runtime/internal/sys",
-	"cmd/cgo",
-	"cmd/go/internal/cfg",
-	"go/build",
-}
-
 func clean() {
-	for _, name := range cleanlist {
-		path := pathf("%s/src/%s", goroot, name)
-		// Remove generated files.
-		for _, elem := range xreaddir(path) {
-			for _, gt := range gentab {
-				if strings.HasPrefix(elem, gt.nameprefix) {
-					xremove(pathf("%s/%s", path, elem))
-				}
+	generated := []byte(generatedHeader)
+
+	// Remove generated source files.
+	filepath.WalkDir(pathf("%s/src", goroot), func(path string, d fs.DirEntry, err error) error {
+		switch {
+		case err != nil:
+			// ignore
+		case d.IsDir() && (d.Name() == "vendor" || d.Name() == "testdata"):
+			return filepath.SkipDir
+		case d.IsDir() && d.Name() != "dist":
+			// Remove generated binary named for directory, but not dist out from under us.
+			exe := filepath.Join(path, d.Name())
+			if info, err := os.Stat(exe); err == nil && !info.IsDir() {
+				xremove(exe)
+			}
+			xremove(exe + ".exe")
+		case !d.IsDir() && strings.HasPrefix(d.Name(), "z"):
+			// Remove generated file, identified by marker string.
+			head := make([]byte, 512)
+			if f, err := os.Open(path); err == nil {
+				io.ReadFull(f, head)
+				f.Close()
+			}
+			if bytes.HasPrefix(head, generated) {
+				xremove(path)
 			}
 		}
-		// Remove generated binary named for directory.
-		if strings.HasPrefix(name, "cmd/") {
-			xremove(pathf("%s/%s", path, name[4:]))
-		}
-	}
-
-	// remove runtimegen files.
-	path := pathf("%s/src/runtime", goroot)
-	for _, elem := range runtimegen {
-		xremove(pathf("%s/%s", path, elem))
-	}
+		return nil
+	})
 
 	if rebuildall {
 		// Remove object tree.
@@ -1155,6 +1186,9 @@
 
 		// Remove cached version info.
 		xremove(pathf("%s/VERSION.cache", goroot))
+
+		// Remove distribution packages.
+		xremoveall(pathf("%s/pkg/distpack", goroot))
 	}
 }
 
@@ -1169,7 +1203,7 @@
 	windows := flag.Bool("w", gohostos == "windows", "emit windows syntax")
 	xflagparse(0)
 
-	format := "%s=\"%s\"\n"
+	format := "%s=\"%s\";\n" // Include ; to separate variables when 'dist env' output is used with eval.
 	switch {
 	case *plan9:
 		format = "%s='%s'\n"
@@ -1180,7 +1214,6 @@
 	xprintf(format, "GO111MODULE", "")
 	xprintf(format, "GOARCH", goarch)
 	xprintf(format, "GOBIN", gorootBin)
-	xprintf(format, "GOCACHE", os.Getenv("GOCACHE"))
 	xprintf(format, "GODEBUG", os.Getenv("GODEBUG"))
 	xprintf(format, "GOENV", "off")
 	xprintf(format, "GOFLAGS", "")
@@ -1217,6 +1250,17 @@
 			sep = ";"
 		}
 		xprintf(format, "PATH", fmt.Sprintf("%s%s%s", gorootBin, sep, os.Getenv("PATH")))
+
+		// Also include $DIST_UNMODIFIED_PATH with the original $PATH
+		// for the internal needs of "dist banner", along with export
+		// so that it reaches the dist process. See its comment below.
+		var exportFormat string
+		if !*windows && !*plan9 {
+			exportFormat = "export " + format
+		} else {
+			exportFormat = format
+		}
+		xprintf(exportFormat, "DIST_UNMODIFIED_PATH", os.Getenv("PATH"))
 	}
 }
 
@@ -1259,6 +1303,31 @@
 	fmt.Fprintf(timeLogFile, "%s %+.1fs %s %s\n", t.Format(time.UnixDate), t.Sub(timeLogStart).Seconds(), op, name)
 }
 
+// toolenv returns the environment to use when building commands in cmd.
+//
+// This is a function instead of a variable because the exact toolenv depends
+// on the GOOS and GOARCH, and (at least for now) those are modified in place
+// to switch between the host and target configurations when cross-compiling.
+func toolenv() []string {
+	var env []string
+	if !mustLinkExternal(goos, goarch, false) {
+		// Unless the platform requires external linking,
+		// we disable cgo to get static binaries for cmd/go and cmd/pprof,
+		// so that they work on systems without the same dynamic libraries
+		// as the original build system.
+		env = append(env, "CGO_ENABLED=0")
+	}
+	if isRelease || os.Getenv("GO_BUILDER_NAME") != "" {
+		// Add -trimpath for reproducible builds of releases.
+		// Include builders so that -trimpath is well-tested ahead of releases.
+		// Do not include local development, so that people working in the
+		// main branch for day-to-day work on the Go toolchain itself can
+		// still have full paths for stack traces for compiler crashes and the like.
+		env = append(env, "GOFLAGS=-trimpath -ldflags=-w -gcflags=cmd/...=-dwarf=false")
+	}
+	return env
+}
+
 var toolchain = []string{"cmd/asm", "cmd/cgo", "cmd/compile", "cmd/link"}
 
 // The bootstrap command runs a build from scratch,
@@ -1272,10 +1341,11 @@
 	timelog("start", "dist bootstrap")
 	defer timelog("end", "dist bootstrap")
 
-	var noBanner, noClean bool
-	var debug bool
+	var debug, distpack, force, noBanner, noClean bool
 	flag.BoolVar(&rebuildall, "a", rebuildall, "rebuild all")
 	flag.BoolVar(&debug, "d", debug, "enable debugging of bootstrap process")
+	flag.BoolVar(&distpack, "distpack", distpack, "write distribution files to pkg/distpack")
+	flag.BoolVar(&force, "force", force, "build even if the port is marked as broken")
 	flag.BoolVar(&noBanner, "no-banner", noBanner, "do not print banner")
 	flag.BoolVar(&noClean, "no-clean", noClean, "print deprecation warning")
 
@@ -1285,6 +1355,12 @@
 		xprintf("warning: --no-clean is deprecated and has no effect; use 'go install std cmd' instead\n")
 	}
 
+	// Don't build broken ports by default.
+	if broken[goos+"/"+goarch] && !force {
+		fatalf("build stopped because the port %s/%s is marked as broken\n\n"+
+			"Use the -force flag to build anyway.\n", goos, goarch)
+	}
+
 	// Set GOPATH to an internal directory. We shouldn't actually
 	// need to store files here, since the toolchain won't
 	// depend on modules outside of vendor directories, but if
@@ -1292,6 +1368,12 @@
 	// go tool may complain.
 	os.Setenv("GOPATH", pathf("%s/pkg/obj/gopath", goroot))
 
+	// Use a build cache separate from the default user one.
+	// Also one that will be wiped out during startup, so that
+	// make.bash really does start from a clean slate.
+	oldgocache = os.Getenv("GOCACHE")
+	os.Setenv("GOCACHE", pathf("%s/pkg/obj/go-build", goroot))
+
 	// Disable GOEXPERIMENT when building toolchain1 and
 	// go_bootstrap. We don't need any experiments for the
 	// bootstrap toolchain, and this lets us avoid duplicating the
@@ -1332,7 +1414,10 @@
 	bootstrapBuildTools()
 
 	// Remember old content of $GOROOT/bin for comparison below.
-	oldBinFiles, _ := filepath.Glob(pathf("%s/bin/*", goroot))
+	oldBinFiles, err := filepath.Glob(pathf("%s/bin/*", goroot))
+	if err != nil {
+		fatalf("glob: %v", err)
+	}
 
 	// For the main bootstrap, building for host os/arch.
 	oldgoos = goos
@@ -1346,7 +1431,8 @@
 
 	timelog("build", "go_bootstrap")
 	xprintf("Building Go bootstrap cmd/go (go_bootstrap) using Go toolchain1.\n")
-	install("runtime") // dependency not visible in sources; also sets up textflag.h
+	install("runtime")     // dependency not visible in sources; also sets up textflag.h
+	install("time/tzdata") // no dependency in sources; creates generated file
 	install("cmd/go")
 	if vflag > 0 {
 		xprintf("\n")
@@ -1356,7 +1442,6 @@
 	setNoOpt()
 	goldflags = os.Getenv("GO_LDFLAGS") // we were using $BOOT_GO_LDFLAGS until now
 	goBootstrap := pathf("%s/go_bootstrap", tooldir)
-	cmdGo := pathf("%s/go", gorootBin)
 	if debug {
 		run("", ShowOutput|CheckExit, pathf("%s/compile", tooldir), "-V=full")
 		copyfile(pathf("%s/compile1", tooldir), pathf("%s/compile", tooldir), writeExec)
@@ -1383,10 +1468,11 @@
 		xprintf("\n")
 	}
 	xprintf("Building Go toolchain2 using go_bootstrap and Go toolchain1.\n")
-	os.Setenv("CC", compilerEnvLookup(defaultcc, goos, goarch))
+	os.Setenv("CC", compilerEnvLookup("CC", defaultcc, goos, goarch))
 	// Now that cmd/go is in charge of the build process, enable GOEXPERIMENT.
 	os.Setenv("GOEXPERIMENT", goexperiment)
-	goInstall(goBootstrap, toolchain...)
+	// No need to enable PGO for toolchain2.
+	goInstall(toolenv(), goBootstrap, append([]string{"-pgo=off"}, toolchain...)...)
 	if debug {
 		run("", ShowOutput|CheckExit, pathf("%s/compile", tooldir), "-V=full")
 		copyfile(pathf("%s/compile2", tooldir), pathf("%s/compile", tooldir), writeExec)
@@ -1413,12 +1499,28 @@
 		xprintf("\n")
 	}
 	xprintf("Building Go toolchain3 using go_bootstrap and Go toolchain2.\n")
-	goInstall(goBootstrap, append([]string{"-a"}, toolchain...)...)
+	goInstall(toolenv(), goBootstrap, append([]string{"-a"}, toolchain...)...)
 	if debug {
 		run("", ShowOutput|CheckExit, pathf("%s/compile", tooldir), "-V=full")
 		copyfile(pathf("%s/compile3", tooldir), pathf("%s/compile", tooldir), writeExec)
 	}
 
+	// Now that toolchain3 has been built from scratch, its compiler and linker
+	// should have accurate build IDs suitable for caching.
+	// Now prime the build cache with the rest of the standard library for
+	// testing, and so that the user can run 'go install std cmd' to quickly
+	// iterate on local changes without waiting for a full rebuild.
+	if _, err := os.Stat(pathf("%s/VERSION", goroot)); err == nil {
+		// If we have a VERSION file, then we use the Go version
+		// instead of build IDs as a cache key, and there is no guarantee
+		// that code hasn't changed since the last time we ran a build
+		// with this exact VERSION file (especially if someone is working
+		// on a release branch). We must not fall back to the shared build cache
+		// in this case. Leave $GOCACHE alone.
+	} else {
+		os.Setenv("GOCACHE", oldgocache)
+	}
+
 	if goos == oldgoos && goarch == oldgoarch {
 		// Common case - not setting up for cross-compilation.
 		timelog("build", "toolchain")
@@ -1434,10 +1536,10 @@
 		if vflag > 0 {
 			xprintf("\n")
 		}
-		xprintf("Building packages and commands for host, %s/%s.\n", goos, goarch)
-		goInstall(goBootstrap, "std", "cmd")
-		checkNotStale(goBootstrap, "std", "cmd")
-		checkNotStale(cmdGo, "std", "cmd")
+		xprintf("Building commands for host, %s/%s.\n", goos, goarch)
+		goInstall(toolenv(), goBootstrap, "cmd")
+		checkNotStale(toolenv(), goBootstrap, "cmd")
+		checkNotStale(toolenv(), gorootBinGo, "cmd")
 
 		timelog("build", "target toolchain")
 		if vflag > 0 {
@@ -1447,23 +1549,29 @@
 		goarch = oldgoarch
 		os.Setenv("GOOS", goos)
 		os.Setenv("GOARCH", goarch)
-		os.Setenv("CC", compilerEnvLookup(defaultcc, goos, goarch))
+		os.Setenv("CC", compilerEnvLookup("CC", defaultcc, goos, goarch))
 		xprintf("Building packages and commands for target, %s/%s.\n", goos, goarch)
 	}
-	targets := []string{"std", "cmd"}
-	goInstall(goBootstrap, targets...)
-	checkNotStale(goBootstrap, append(toolchain, "runtime/internal/sys")...)
-	checkNotStale(goBootstrap, targets...)
-	checkNotStale(cmdGo, targets...)
+	goInstall(nil, goBootstrap, "std")
+	goInstall(toolenv(), goBootstrap, "cmd")
+	checkNotStale(toolenv(), goBootstrap, toolchain...)
+	checkNotStale(nil, goBootstrap, "std")
+	checkNotStale(toolenv(), goBootstrap, "cmd")
+	checkNotStale(nil, gorootBinGo, "std")
+	checkNotStale(toolenv(), gorootBinGo, "cmd")
 	if debug {
 		run("", ShowOutput|CheckExit, pathf("%s/compile", tooldir), "-V=full")
-		checkNotStale(goBootstrap, append(toolchain, "runtime/internal/sys")...)
+		checkNotStale(toolenv(), goBootstrap, toolchain...)
 		copyfile(pathf("%s/compile4", tooldir), pathf("%s/compile", tooldir), writeExec)
 	}
 
 	// Check that there are no new files in $GOROOT/bin other than
 	// go and gofmt and $GOOS_$GOARCH (target bin when cross-compiling).
-	binFiles, _ := filepath.Glob(pathf("%s/bin/*", goroot))
+	binFiles, err := filepath.Glob(pathf("%s/bin/*", goroot))
+	if err != nil {
+		fatalf("glob: %v", err)
+	}
+
 	ok := map[string]bool{}
 	for _, f := range oldBinFiles {
 		ok[f] = true
@@ -1476,7 +1584,7 @@
 	}
 
 	// Remove go_bootstrap now that we're done.
-	xremove(pathf("%s/go_bootstrap", tooldir))
+	xremove(pathf("%s/go_bootstrap"+exe, tooldir))
 
 	if goos == "android" {
 		// Make sure the exec wrapper will sync a fresh $GOROOT to the device.
@@ -1487,8 +1595,8 @@
 		oldcc := os.Getenv("CC")
 		os.Setenv("GOOS", gohostos)
 		os.Setenv("GOARCH", gohostarch)
-		os.Setenv("CC", compilerEnvLookup(defaultcc, gohostos, gohostarch))
-		goCmd(cmdGo, "build", "-o", pathf("%s/go_%s_%s_exec%s", gorootBin, goos, goarch, exe), wrapperPath)
+		os.Setenv("CC", compilerEnvLookup("CC", defaultcc, gohostos, gohostarch))
+		goCmd(nil, gorootBinGo, "build", "-o", pathf("%s/go_%s_%s_exec%s", gorootBin, goos, goarch, exe), wrapperPath)
 		// Restore environment.
 		// TODO(elias.naur): support environment variables in goCmd?
 		os.Setenv("GOOS", goos)
@@ -1496,6 +1604,11 @@
 		os.Setenv("CC", oldcc)
 	}
 
+	if distpack {
+		xprintf("Packaging archives for %s/%s.\n", goos, goarch)
+		run("", ShowOutput|CheckExit, pathf("%s/distpack", tooldir))
+	}
+
 	// Print trailing banner unless instructed otherwise.
 	if !noBanner {
 		banner()
@@ -1506,7 +1619,7 @@
 	switch {
 	case goos == "android":
 		if gohostos != "android" {
-			return pathf("%s/misc/android/go_android_exec.go", goroot)
+			return pathf("%s/misc/go_android_exec/main.go", goroot)
 		}
 	case goos == "ios":
 		if gohostos != "ios" {
@@ -1516,8 +1629,8 @@
 	return ""
 }
 
-func goInstall(goBinary string, args ...string) {
-	goCmd(goBinary, "install", args...)
+func goInstall(env []string, goBinary string, args ...string) {
+	goCmd(env, goBinary, "install", args...)
 }
 
 func appendCompilerFlags(args []string) []string {
@@ -1530,7 +1643,7 @@
 	return args
 }
 
-func goCmd(goBinary string, cmd string, args ...string) {
+func goCmd(env []string, goBinary string, cmd string, args ...string) {
 	goCmd := []string{goBinary, cmd}
 	if noOpt {
 		goCmd = append(goCmd, "-tags=noopt")
@@ -1545,10 +1658,10 @@
 		goCmd = append(goCmd, "-p=1")
 	}
 
-	run(workdir, ShowOutput|CheckExit, append(goCmd, args...)...)
+	runEnv(workdir, ShowOutput|CheckExit, env, append(goCmd, args...)...)
 }
 
-func checkNotStale(goBinary string, targets ...string) {
+func checkNotStale(env []string, goBinary string, targets ...string) {
 	goCmd := []string{goBinary, "list"}
 	if noOpt {
 		goCmd = append(goCmd, "-tags=noopt")
@@ -1556,7 +1669,7 @@
 	goCmd = appendCompilerFlags(goCmd)
 	goCmd = append(goCmd, "-f={{if .Stale}}\tSTALE {{.ImportPath}}: {{.StaleReason}}{{end}}")
 
-	out := run(workdir, CheckExit, append(goCmd, targets...)...)
+	out := runEnv(workdir, CheckExit, env, append(goCmd, targets...)...)
 	if strings.Contains(out, "\tSTALE ") {
 		os.Setenv("GODEBUG", "gocachehash=1")
 		for _, target := range []string{"runtime/internal/sys", "cmd/dist", "cmd/link"} {
@@ -1608,6 +1721,7 @@
 	"ios/arm64":       true,
 	"ios/amd64":       true,
 	"js/wasm":         false,
+	"wasip1/wasm":     false,
 	"netbsd/386":      true,
 	"netbsd/amd64":    true,
 	"netbsd/arm":      true,
@@ -1617,6 +1731,7 @@
 	"openbsd/arm":     true,
 	"openbsd/arm64":   true,
 	"openbsd/mips64":  true,
+	"openbsd/ppc64":   false,
 	"plan9/386":       false,
 	"plan9/amd64":     false,
 	"plan9/arm":       false,
@@ -1627,13 +1742,17 @@
 	"windows/arm64":   true,
 }
 
-// List of platforms which are supported but not complete yet. These get
-// filtered out of cgoEnabled for 'dist list'. See golang.org/issue/28944
-var incomplete = map[string]bool{
-	"linux/sparc64": true,
+// List of platforms that are marked as broken ports.
+// These require -force flag to build, and also
+// get filtered out of cgoEnabled for 'dist list'.
+// See go.dev/issue/56679.
+var broken = map[string]bool{
+	"linux/sparc64":  true, // An incomplete port. See CL 132155.
+	"openbsd/ppc64":  true, // An incomplete port: go.dev/issue/56001.
+	"openbsd/mips64": true, // Broken: go.dev/issue/58110.
 }
 
-// List of platforms which are first class ports. See golang.org/issue/38874.
+// List of platforms which are first class ports. See go.dev/issue/38874.
 var firstClass = map[string]bool{
 	"darwin/amd64":  true,
 	"darwin/arm64":  true,
@@ -1645,21 +1764,27 @@
 	"windows/amd64": true,
 }
 
+// We only need CC if cgo is forced on, or if the platform requires external linking.
+// Otherwise the go command will automatically disable it.
 func needCC() bool {
-	switch os.Getenv("CGO_ENABLED") {
-	case "1":
-		return true
-	case "0":
-		return false
-	}
-	return cgoEnabled[gohostos+"/"+gohostarch]
+	return os.Getenv("CGO_ENABLED") == "1" || mustLinkExternal(gohostos, gohostarch, false)
 }
 
 func checkCC() {
 	if !needCC() {
 		return
 	}
-	cc, err := quotedSplit(defaultcc[""])
+	cc1 := defaultcc[""]
+	if cc1 == "" {
+		cc1 = "gcc"
+		for _, os := range clangos {
+			if gohostos == os {
+				cc1 = "clang"
+				break
+			}
+		}
+	}
+	cc, err := quotedSplit(cc1)
 	if err != nil {
 		fatalf("split CC: %v", err)
 	}
@@ -1744,7 +1869,15 @@
 		if gohostos == "windows" {
 			pathsep = ";"
 		}
-		if !strings.Contains(pathsep+os.Getenv("PATH")+pathsep, pathsep+gorootBin+pathsep) {
+		path := os.Getenv("PATH")
+		if p, ok := os.LookupEnv("DIST_UNMODIFIED_PATH"); ok {
+			// Scripts that modify $PATH and then run dist should also provide
+			// dist with an unmodified copy of $PATH via $DIST_UNMODIFIED_PATH.
+			// Use it here when determining if the user still needs to update
+			// their $PATH. See go.dev/issue/42563.
+			path = p
+		}
+		if !strings.Contains(pathsep+path+pathsep, pathsep+gorootBin+pathsep) {
 			xprintf("*** You need to add %s to your PATH.\n", gorootBin)
 		}
 	}
@@ -1765,11 +1898,12 @@
 // cmdlist lists all supported platforms.
 func cmdlist() {
 	jsonFlag := flag.Bool("json", false, "produce JSON output")
+	brokenFlag := flag.Bool("broken", false, "include broken ports")
 	xflagparse(0)
 
 	var plats []string
 	for p := range cgoEnabled {
-		if incomplete[p] {
+		if broken[p] && !*brokenFlag {
 			continue
 		}
 		plats = append(plats, p)
@@ -1788,6 +1922,7 @@
 		GOARCH       string
 		CgoSupported bool
 		FirstClass   bool
+		Broken       bool `json:",omitempty"`
 	}
 	var results []jsonResult
 	for _, p := range plats {
@@ -1796,7 +1931,9 @@
 			GOOS:         fields[0],
 			GOARCH:       fields[1],
 			CgoSupported: cgoEnabled[p],
-			FirstClass:   firstClass[p]})
+			FirstClass:   firstClass[p],
+			Broken:       broken[p],
+		})
 	}
 	out, err := json.MarshalIndent(results, "", "\t")
 	if err != nil {
diff --git a/src/cmd/dist/build_test.go b/src/cmd/dist/build_test.go
new file mode 100644
index 0000000..158ac26
--- /dev/null
+++ b/src/cmd/dist/build_test.go
@@ -0,0 +1,26 @@
+// Copyright 2023 The Go Authors. 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/platform"
+	"testing"
+)
+
+// TestMustLinkExternal verifies that the mustLinkExternal helper
+// function matches internal/platform.MustLinkExternal.
+func TestMustLinkExternal(t *testing.T) {
+	for _, goos := range okgoos {
+		for _, goarch := range okgoarch {
+			for _, cgoEnabled := range []bool{true, false} {
+				got := mustLinkExternal(goos, goarch, cgoEnabled)
+				want := platform.MustLinkExternal(goos, goarch, cgoEnabled)
+				if got != want {
+					t.Errorf("mustLinkExternal(%q, %q, %v) = %v; want %v", goos, goarch, cgoEnabled, got, want)
+				}
+			}
+		}
+	}
+}
diff --git a/src/cmd/dist/buildgo.go b/src/cmd/dist/buildgo.go
index 29b0167..884e9d7 100644
--- a/src/cmd/dist/buildgo.go
+++ b/src/cmd/dist/buildgo.go
@@ -6,6 +6,7 @@
 
 import (
 	"fmt"
+	"io"
 	"os"
 	"path/filepath"
 	"sort"
@@ -16,6 +17,24 @@
  * Helpers for building cmd/go and cmd/cgo.
  */
 
+// generatedHeader is the string that all source files generated by dist start with.
+//
+// DO NOT CHANGE THIS STRING. If this string is changed then during
+//
+//	./make.bash
+//	git checkout other-rev
+//	./make.bash
+//
+// the second make.bash will not find the files generated by the first make.bash
+// and will not clean up properly.
+const generatedHeader = "// Code generated by go tool dist; DO NOT EDIT.\n\n"
+
+// writeHeader emits the standard "generated by" header for all files generated
+// by dist.
+func writeHeader(w io.Writer) {
+	fmt.Fprint(w, generatedHeader)
+}
+
 // mkzdefaultcc writes zdefaultcc.go:
 //
 //	package main
@@ -28,8 +47,7 @@
 func mkzdefaultcc(dir, file string) {
 	if strings.Contains(file, filepath.FromSlash("go/internal/cfg")) {
 		var buf strings.Builder
-		fmt.Fprintf(&buf, "// Code generated by go tool dist; DO NOT EDIT.\n")
-		fmt.Fprintln(&buf)
+		writeHeader(&buf)
 		fmt.Fprintf(&buf, "package cfg\n")
 		fmt.Fprintln(&buf)
 		fmt.Fprintf(&buf, "const DefaultPkgConfig = `%s`\n", defaultpkgconfig)
@@ -40,8 +58,7 @@
 	}
 
 	var buf strings.Builder
-	fmt.Fprintf(&buf, "// Code generated by go tool dist; DO NOT EDIT.\n")
-	fmt.Fprintln(&buf)
+	writeHeader(&buf)
 	fmt.Fprintf(&buf, "package main\n")
 	fmt.Fprintln(&buf)
 	fmt.Fprintf(&buf, "const defaultPkgConfig = `%s`\n", defaultpkgconfig)
@@ -63,64 +80,83 @@
 	}
 	sort.Strings(keys)
 	for _, k := range keys {
-		fmt.Fprintf(&buf, "\tcase %q:\n\t\treturn %q\n", k, defaultcc[k])
+		fmt.Fprintf(&buf, "\tcase %s:\n\t\treturn %s\n", quote(k), quote(defaultcc[k]))
 	}
 	fmt.Fprintf(&buf, "\t}\n")
-	fmt.Fprintf(&buf, "\treturn %q\n", defaultcc[""])
+	if cc := defaultcc[""]; cc != "" {
+		fmt.Fprintf(&buf, "\treturn %s\n", quote(cc))
+	} else {
+		clang, gcc := "clang", "gcc"
+		if strings.HasSuffix(name, "CXX") {
+			clang, gcc = "clang++", "g++"
+		}
+		fmt.Fprintf(&buf, "\tswitch goos {\n")
+		fmt.Fprintf(&buf, "\tcase ")
+		for i, os := range clangos {
+			if i > 0 {
+				fmt.Fprintf(&buf, ", ")
+			}
+			fmt.Fprintf(&buf, "%s", quote(os))
+		}
+		fmt.Fprintf(&buf, ":\n")
+		fmt.Fprintf(&buf, "\t\treturn %s\n", quote(clang))
+		fmt.Fprintf(&buf, "\t}\n")
+		fmt.Fprintf(&buf, "\treturn %s\n", quote(gcc))
+	}
 	fmt.Fprintf(&buf, "}\n")
 
 	return buf.String()
 }
 
-// mkzcgo writes zosarch.go for cmd/go.
-func mkzosarch(dir, file string) {
-	// sort for deterministic zosarch.go file
-	var list []string
-	for plat := range cgoEnabled {
-		list = append(list, plat)
-	}
-	sort.Strings(list)
-
+// mkzcgo writes zcgo.go for the go/build package:
+//
+//	package build
+//	const defaultCGO_ENABLED = <CGO_ENABLED>
+//
+// It is invoked to write go/build/zcgo.go.
+func mkzcgo(dir, file string) {
 	var buf strings.Builder
-	fmt.Fprintf(&buf, "// Code generated by go tool dist; DO NOT EDIT.\n\n")
-	fmt.Fprintf(&buf, "package cfg\n\n")
-	fmt.Fprintf(&buf, "var OSArchSupportsCgo = map[string]bool{\n")
-	for _, plat := range list {
-		fmt.Fprintf(&buf, "\t%q: %v,\n", plat, cgoEnabled[plat])
-	}
-	fmt.Fprintf(&buf, "}\n")
+	writeHeader(&buf)
+	fmt.Fprintf(&buf, "package build\n")
+	fmt.Fprintln(&buf)
+	fmt.Fprintf(&buf, "const defaultCGO_ENABLED = %s\n", quote(os.Getenv("CGO_ENABLED")))
 
 	writefile(buf.String(), file, writeSkipSame)
 }
 
-// mkzcgo writes zcgo.go for the go/build package:
+// mktzdata src/time/tzdata/zzipdata.go:
 //
-//	package build
-//	var cgoEnabled = map[string]bool{}
-//
-// It is invoked to write go/build/zcgo.go.
-func mkzcgo(dir, file string) {
-	// sort for deterministic zcgo.go file
-	var list []string
-	for plat, hasCgo := range cgoEnabled {
-		if hasCgo {
-			list = append(list, plat)
-		}
-	}
-	sort.Strings(list)
+//	package tzdata
+//	const zipdata = "PK..."
+func mktzdata(dir, file string) {
+	zip := readfile(filepath.Join(dir, "../../../lib/time/zoneinfo.zip"))
 
 	var buf strings.Builder
-	fmt.Fprintf(&buf, "// Code generated by go tool dist; DO NOT EDIT.\n")
+	writeHeader(&buf)
+	fmt.Fprintf(&buf, "package tzdata\n")
 	fmt.Fprintln(&buf)
-	fmt.Fprintf(&buf, "package build\n")
-	fmt.Fprintln(&buf)
-	fmt.Fprintf(&buf, "const defaultCGO_ENABLED = %q\n", os.Getenv("CGO_ENABLED"))
-	fmt.Fprintln(&buf)
-	fmt.Fprintf(&buf, "var cgoEnabled = map[string]bool{\n")
-	for _, plat := range list {
-		fmt.Fprintf(&buf, "\t%q: true,\n", plat)
-	}
-	fmt.Fprintf(&buf, "}\n")
+	fmt.Fprintf(&buf, "const zipdata = %s\n", quote(zip))
 
 	writefile(buf.String(), file, writeSkipSame)
 }
+
+// quote is like strconv.Quote but simpler and has output
+// that does not depend on the exact Go bootstrap version.
+func quote(s string) string {
+	const hex = "0123456789abcdef"
+	var out strings.Builder
+	out.WriteByte('"')
+	for i := 0; i < len(s); i++ {
+		c := s[i]
+		if 0x20 <= c && c <= 0x7E && c != '"' && c != '\\' {
+			out.WriteByte(c)
+		} else {
+			out.WriteByte('\\')
+			out.WriteByte('x')
+			out.WriteByte(hex[c>>4])
+			out.WriteByte(hex[c&0xf])
+		}
+	}
+	out.WriteByte('"')
+	return out.String()
+}
diff --git a/src/cmd/dist/buildruntime.go b/src/cmd/dist/buildruntime.go
index 932c509..1de78f0 100644
--- a/src/cmd/dist/buildruntime.go
+++ b/src/cmd/dist/buildruntime.go
@@ -20,8 +20,7 @@
 // (Nothing right now!)
 func mkzversion(dir, file string) {
 	var buf strings.Builder
-	fmt.Fprintf(&buf, "// Code generated by go tool dist; DO NOT EDIT.\n")
-	fmt.Fprintln(&buf)
+	writeHeader(&buf)
 	fmt.Fprintf(&buf, "package sys\n")
 	writefile(buf.String(), file, writeSkipSame)
 }
@@ -47,8 +46,7 @@
 // original target (in this example, a Mac).
 func mkbuildcfg(file string) {
 	var buf strings.Builder
-	fmt.Fprintf(&buf, "// Code generated by go tool dist; DO NOT EDIT.\n")
-	fmt.Fprintln(&buf)
+	writeHeader(&buf)
 	fmt.Fprintf(&buf, "package buildcfg\n")
 	fmt.Fprintln(&buf)
 	fmt.Fprintf(&buf, "import \"runtime\"\n")
@@ -76,8 +74,7 @@
 // (Nothing right now!)
 func mkobjabi(file string) {
 	var buf strings.Builder
-	fmt.Fprintf(&buf, "// Code generated by go tool dist; DO NOT EDIT.\n")
-	fmt.Fprintln(&buf)
+	writeHeader(&buf)
 	fmt.Fprintf(&buf, "package objabi\n")
 
 	writefile(buf.String(), file, writeSkipSame)
diff --git a/src/cmd/dist/buildtool.go b/src/cmd/dist/buildtool.go
index c4e3660..a528d7a 100644
--- a/src/cmd/dist/buildtool.go
+++ b/src/cmd/dist/buildtool.go
@@ -59,20 +59,32 @@
 	"debug/elf",
 	"debug/macho",
 	"debug/pe",
+	"go/build/constraint",
 	"go/constant",
+	"internal/abi",
 	"internal/coverage",
+	"internal/bisect",
 	"internal/buildcfg",
+	"internal/goarch",
+	"internal/godebugs",
 	"internal/goexperiment",
 	"internal/goroot",
 	"internal/goversion",
+	// internal/lazyregexp is provided by Go 1.17, which permits it to
+	// be imported by other packages in this list, but is not provided
+	// by the Go 1.17 version of gccgo. It's on this list only to
+	// support gccgo, and can be removed if we require gccgo 14 or later.
+	"internal/lazyregexp",
 	"internal/pkgbits",
+	"internal/platform",
 	"internal/profile",
 	"internal/race",
 	"internal/saferio",
-	"internal/platform",
+	"internal/syscall/unix",
 	"internal/types/errors",
 	"internal/unsafeheader",
 	"internal/xcoff",
+	"internal/zstd",
 	"math/big",
 	"math/bits",
 	"sort",
@@ -93,6 +105,10 @@
 var ignoreSuffixes = []string{
 	"_test.s",
 	"_test.go",
+	// Skip PGO profile. No need to build toolchain1 compiler
+	// with PGO. And as it is not a text file the import path
+	// rewrite will break it.
+	".pgo",
 }
 
 var tryDirs = []string{
@@ -128,7 +144,7 @@
 	xmkdirall(base)
 
 	// Copy source code into $GOROOT/pkg/bootstrap and rewrite import paths.
-	writefile("module bootstrap\n", pathf("%s/%s", base, "go.mod"), 0)
+	writefile("module bootstrap\ngo 1.20\n", pathf("%s/%s", base, "go.mod"), 0)
 	for _, dir := range bootstrapDirs {
 		recurse := strings.HasSuffix(dir, "/...")
 		dir = strings.TrimSuffix(dir, "/...")
@@ -271,13 +287,11 @@
 	// binary that works for the current gohostarch.
 	// This saves 6+ seconds of bootstrap.
 	if archCaps, ok := isUnneededSSARewriteFile(srcFile, gohostarch); ok {
-		return fmt.Sprintf(`// Code generated by go tool dist; DO NOT EDIT.
-
-package ssa
+		return fmt.Sprintf(`%spackage ssa
 
 func rewriteValue%s(v *Value) bool { panic("unused during bootstrap") }
 func rewriteBlock%s(b *Block) bool { panic("unused during bootstrap") }
-`, archCaps, archCaps)
+`, generatedHeader, archCaps, archCaps)
 	}
 
 	return bootstrapFixImports(srcFile)
@@ -300,7 +314,7 @@
 			continue
 		}
 		if strings.HasPrefix(line, `import "`) || strings.HasPrefix(line, `import . "`) ||
-			inBlock && (strings.HasPrefix(line, "\t\"") || strings.HasPrefix(line, "\t. \"") || strings.HasPrefix(line, "\texec \"")) {
+			inBlock && (strings.HasPrefix(line, "\t\"") || strings.HasPrefix(line, "\t. \"") || strings.HasPrefix(line, "\texec \"") || strings.HasPrefix(line, "\trtabi \"")) {
 			line = strings.Replace(line, `"cmd/`, `"bootstrap/cmd/`, -1)
 			for _, dir := range bootstrapDirs {
 				if strings.HasPrefix(dir, "cmd/") {
@@ -312,7 +326,7 @@
 		}
 	}
 
-	lines[0] = "// Code generated by go tool dist; DO NOT EDIT.\n// This is a bootstrap copy of " + srcFile + "\n\n//line " + srcFile + ":1\n" + lines[0]
+	lines[0] = generatedHeader + "// This is a bootstrap copy of " + srcFile + "\n\n//line " + srcFile + ":1\n" + lines[0]
 
 	return strings.Join(lines, "")
 }
diff --git a/src/cmd/dist/main.go b/src/cmd/dist/main.go
index 6194ea9..f3425a9 100644
--- a/src/cmd/dist/main.go
+++ b/src/cmd/dist/main.go
@@ -16,14 +16,14 @@
 	xprintf(`usage: go tool dist [command]
 Commands are:
 
-banner         print installation banner
-bootstrap      rebuild everything
-clean          deletes all built files
-env [-p]       print environment (-p: include $PATH)
-install [dir]  install individual directory
-list [-json]   list all supported platforms
-test [-h]      run Go test(s)
-version        print Go version
+banner                  print installation banner
+bootstrap               rebuild everything
+clean                   deletes all built files
+env [-p]                print environment (-p: include $PATH)
+install [dir]           install individual directory
+list [-json] [-broken]  list all supported platforms
+test [-h]               run Go test(s)
+version                 print Go version
 
 All commands take -v flags to emit extra information.
 `)
@@ -59,15 +59,6 @@
 	case "aix":
 		// uname -m doesn't work under AIX
 		gohostarch = "ppc64"
-	case "darwin":
-		// macOS 10.9 and later require clang
-		defaultclang = true
-	case "freebsd":
-		// Since FreeBSD 10 gcc is no longer part of the base system.
-		defaultclang = true
-	case "openbsd":
-		// OpenBSD ships with GCC 4.2, which is now quite old.
-		defaultclang = true
 	case "plan9":
 		gohostarch = os.Getenv("objtype")
 		if gohostarch == "" {
@@ -147,6 +138,8 @@
 			if strings.Contains(run("", CheckExit, "uname", "-p"), "riscv64") {
 				gohostarch = "riscv64"
 			}
+		case gohostos == "openbsd" && strings.Contains(out, "powerpc64"):
+			gohostarch = "ppc64"
 		case gohostos == "openbsd":
 			if strings.Contains(run("", CheckExit, "uname", "-p"), "mips64") {
 				gohostarch = "mips64"
diff --git a/src/cmd/dist/supported_test.go b/src/cmd/dist/supported_test.go
new file mode 100644
index 0000000..27c0b92
--- /dev/null
+++ b/src/cmd/dist/supported_test.go
@@ -0,0 +1,48 @@
+// Copyright 2023 The Go Authors. 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/platform"
+	"testing"
+)
+
+// TestSupportedBuildModes tests that dist and the main tools agree on
+// which build modes are supported for a given target. We do things
+// this way because the dist tool needs to be buildable directly by
+// the bootstrap compiler, and as such can't import internal packages.
+func TestSupported(t *testing.T) {
+	defer func(a, o string) {
+		goarch = a
+		goos = o
+	}(goarch, goos)
+
+	var modes = []string{
+		// we assume that "exe" and "archive" always work
+		"pie",
+		"c-archive",
+		"c-shared",
+		"shared",
+		"plugin",
+	}
+
+	for _, a := range okgoarch {
+		goarch = a
+		for _, o := range okgoos {
+			if _, ok := cgoEnabled[o+"/"+a]; !ok {
+				continue
+			}
+			goos = o
+			for _, mode := range modes {
+				var dt tester
+				dist := dt.supportedBuildmode(mode)
+				std := platform.BuildModeSupported("gc", mode, o, a)
+				if dist != std {
+					t.Errorf("discrepancy for %s-%s %s: dist says %t, standard library says %t", o, a, mode, dist, std)
+				}
+			}
+		}
+	}
+}
diff --git a/src/cmd/dist/test.go b/src/cmd/dist/test.go
index 9f26606..36a20e8 100644
--- a/src/cmd/dist/test.go
+++ b/src/cmd/dist/test.go
@@ -6,8 +6,10 @@
 
 import (
 	"bytes"
+	"encoding/json"
 	"flag"
 	"fmt"
+	"io"
 	"io/fs"
 	"log"
 	"os"
@@ -18,7 +20,6 @@
 	"runtime"
 	"strconv"
 	"strings"
-	"sync"
 	"time"
 )
 
@@ -34,13 +35,14 @@
 	flag.BoolVar(&noRebuild, "no-rebuild", false, "overrides -rebuild (historical dreg)")
 	flag.BoolVar(&t.keepGoing, "k", false, "keep going even when error occurred")
 	flag.BoolVar(&t.race, "race", false, "run in race builder mode (different set of tests)")
-	flag.BoolVar(&t.compileOnly, "compile-only", false, "compile tests, but don't run them. This is for some builders. Not all dist tests respect this flag, but most do.")
+	flag.BoolVar(&t.compileOnly, "compile-only", false, "compile tests, but don't run them")
 	flag.StringVar(&t.banner, "banner", "##### ", "banner prefix; blank means no section banners")
-	flag.StringVar(&t.runRxStr, "run", os.Getenv("GOTESTONLY"),
+	flag.StringVar(&t.runRxStr, "run", "",
 		"run only those tests matching the regular expression; empty means to run all. "+
 			"Special exception: if the string begins with '!', the match is inverted.")
 	flag.BoolVar(&t.msan, "msan", false, "run in memory sanitizer builder mode")
 	flag.BoolVar(&t.asan, "asan", false, "run in address sanitizer builder mode")
+	flag.BoolVar(&t.json, "json", false, "report test results in JSON")
 
 	xflagparse(-1) // any number of args
 	if noRebuild {
@@ -70,11 +72,10 @@
 	short      bool
 	cgoEnabled bool
 	partial    bool
+	json       bool
 
-	goExe    string // For host tests
-	goTmpDir string // For host tests
-
-	tests        []distTest
+	tests        []distTest // use addTest to extend
+	testNames    map[string]bool
 	timeoutScale int
 
 	worklist []*work
@@ -82,13 +83,37 @@
 
 type work struct {
 	dt    *distTest
-	cmd   *exec.Cmd
+	cmd   *exec.Cmd // Must write stdout/stderr to work.out
+	flush func()    // If non-nil, called after cmd.Run
 	start chan bool
-	out   []byte
+	out   bytes.Buffer
 	err   error
 	end   chan bool
 }
 
+// printSkip prints a skip message for all of work.
+func (w *work) printSkip(t *tester, msg string) {
+	if t.json {
+		type event struct {
+			Time    time.Time
+			Action  string
+			Package string
+			Output  string `json:",omitempty"`
+		}
+		enc := json.NewEncoder(&w.out)
+		ev := event{Time: time.Now(), Package: w.dt.name, Action: "start"}
+		enc.Encode(ev)
+		ev.Action = "output"
+		ev.Output = msg
+		enc.Encode(ev)
+		ev.Action = "skip"
+		ev.Output = ""
+		enc.Encode(ev)
+		return
+	}
+	fmt.Fprintln(&w.out, msg)
+}
+
 // A distTest is a test run by dist test.
 // Each test has a unique name and belongs to a group (heading)
 type distTest struct {
@@ -111,19 +136,17 @@
 		t.short = short
 	}
 
-	cmd := exec.Command(gorootBinGo, "env", "CGO_ENABLED", "GOEXE", "GOTMPDIR")
+	cmd := exec.Command(gorootBinGo, "env", "CGO_ENABLED")
 	cmd.Stderr = new(bytes.Buffer)
 	slurp, err := cmd.Output()
 	if err != nil {
 		fatalf("Error running %s: %v\n%s", cmd, err, cmd.Stderr)
 	}
 	parts := strings.Split(string(slurp), "\n")
-	if len(parts) < 3 {
-		fatalf("Error running %s: output contains <3 lines\n%s", cmd, cmd.Stderr)
+	if nlines := len(parts) - 1; nlines < 1 {
+		fatalf("Error running %s: output contains <1 lines\n%s", cmd, cmd.Stderr)
 	}
 	t.cgoEnabled, _ = strconv.ParseBool(parts[0])
-	t.goExe = parts[1]
-	t.goTmpDir = parts[2]
 
 	if flag.NArg() > 0 && t.runRxStr != "" {
 		fatalf("the -run regular expression flag is mutually exclusive with test name arguments")
@@ -149,55 +172,30 @@
 	if t.rebuild {
 		t.out("Building packages and commands.")
 		// Force rebuild the whole toolchain.
-		goInstall("go", append([]string{"-a"}, toolchain...)...)
+		goInstall(toolenv(), gorootBinGo, append([]string{"-a"}, toolchain...)...)
 	}
 
 	if !t.listMode {
 		if builder := os.Getenv("GO_BUILDER_NAME"); builder == "" {
-			// Complete rebuild bootstrap, even with -no-rebuild.
+			// Ensure that installed commands are up to date, even with -no-rebuild,
+			// so that tests that run commands end up testing what's actually on disk.
 			// If everything is up-to-date, this is a no-op.
-			// If everything is not up-to-date, the first checkNotStale
-			// during the test process will kill the tests, so we might
-			// as well install the world.
-			// Now that for example "go install cmd/compile" does not
-			// also install runtime (you need "go install -i cmd/compile"
-			// for that), it's easy for previous workflows like
-			// "rebuild the compiler and then run run.bash"
-			// to break if we don't automatically refresh things here.
-			// Rebuilding is a shortened bootstrap.
+			// We first build the toolchain twice to allow it to converge,
+			// as when we first bootstrap.
 			// See cmdbootstrap for a description of the overall process.
-			goInstall("go", toolchain...)
-			goInstall("go", toolchain...)
-			goInstall("go", "std", "cmd")
-		} else {
-			// The Go builder infrastructure should always begin running tests from a
-			// clean, non-stale state, so there is no need to rebuild the world.
-			// Instead, we can just check that it is not stale, which may be less
-			// expensive (and is also more likely to catch bugs in the builder
-			// implementation).
-			// The cache used by dist when building is different from that used when
-			// running dist test, so rebuild (but don't install) std and cmd to make
-			// sure packages without install targets are cached so they are not stale.
-			goCmd("go", "build", "std", "cmd") // make sure dependencies of targets are cached
-			if builder == "aix-ppc64" {
-				// The aix-ppc64 builder for some reason does not have deterministic cgo
-				// builds, so "cmd" is stale. Fortunately, most of the tests don't care.
-				// TODO(#56896): remove this special case once the builder supports
-				// determistic cgo builds.
-				checkNotStale("go", "std")
-			} else {
-				checkNotStale("go", "std", "cmd")
-			}
+			//
+			// On the builders, we skip this step: we assume that 'dist test' is
+			// already using the result of a clean build, and because of test sharding
+			// and virtualization we usually start with a clean GOCACHE, so we would
+			// end up rebuilding large parts of the standard library that aren't
+			// otherwise relevant to the actual set of packages under test.
+			goInstall(toolenv(), gorootBinGo, toolchain...)
+			goInstall(toolenv(), gorootBinGo, toolchain...)
+			goInstall(toolenv(), gorootBinGo, "cmd")
 		}
 	}
 
 	t.timeoutScale = 1
-	switch goarch {
-	case "arm":
-		t.timeoutScale = 2
-	case "mips", "mipsle", "mips64", "mips64le":
-		t.timeoutScale = 4
-	}
 	if s := os.Getenv("GO_TEST_TIMEOUT_SCALE"); s != "" {
 		t.timeoutScale, err = strconv.Atoi(s)
 		if err != nil {
@@ -224,7 +222,7 @@
 	}
 
 	for _, name := range t.runNames {
-		if !t.isRegisteredTestName(name) {
+		if !t.testNames[name] {
 			fatalf("unknown test %q", name)
 		}
 	}
@@ -239,12 +237,14 @@
 		}
 	}
 
-	if err := t.maybeLogMetadata(); err != nil {
-		t.failed = true
-		if t.keepGoing {
-			log.Printf("Failed logging metadata: %v", err)
-		} else {
-			fatalf("Failed logging metadata: %v", err)
+	if !t.json {
+		if err := t.maybeLogMetadata(); err != nil {
+			t.failed = true
+			if t.keepGoing {
+				log.Printf("Failed logging metadata: %v", err)
+			} else {
+				fatalf("Failed logging metadata: %v", err)
+			}
 		}
 	}
 
@@ -267,19 +267,17 @@
 	t.runPending(nil)
 	timelog("end", "dist test")
 
+	if !t.json {
+		if t.failed {
+			fmt.Println("\nFAILED")
+		} else if t.partial {
+			fmt.Println("\nALL TESTS PASSED (some were excluded)")
+		} else {
+			fmt.Println("\nALL TESTS PASSED")
+		}
+	}
 	if t.failed {
-		fmt.Println("\nFAILED")
 		xexit(1)
-	} else if incomplete[goos+"/"+goarch] {
-		// The test succeeded, but consider it as failed so we don't
-		// forget to remove the port from the incomplete map once the
-		// port is complete.
-		fmt.Println("\nFAILED (incomplete port)")
-		xexit(1)
-	} else if t.partial {
-		fmt.Println("\nALL TESTS PASSED (some were excluded)")
-	} else {
-		fmt.Println("\nALL TESTS PASSED")
 	}
 }
 
@@ -311,7 +309,16 @@
 	//
 	// TODO(prattmic): If we split dist bootstrap and dist test then this
 	// could be simplified to directly use internal/sysinfo here.
-	return t.dirCmd(filepath.Join(goroot, "src/cmd/internal/metadata"), "go", []string{"run", "main.go"}).Run()
+	return t.dirCmd(filepath.Join(goroot, "src/cmd/internal/metadata"), gorootBinGo, []string{"run", "main.go"}).Run()
+}
+
+// testName returns the dist test name for a given package and variant.
+func testName(pkg, variant string) string {
+	name := pkg
+	if variant != "" {
+		name += ":" + variant
+	}
+	return name
 }
 
 // goTest represents all options to a "go test" command. The final command will
@@ -324,144 +331,106 @@
 	bench    bool          // Run benchmarks (briefly), not tests.
 	runTests string        // Regexp of tests to run
 	cpu      string        // If non-empty, -cpu flag
-	goroot   string        // If non-empty, use alternate goroot for go command
 
 	gcflags   string // If non-empty, build with -gcflags=all=X
 	ldflags   string // If non-empty, build with -ldflags=X
 	buildmode string // If non-empty, -buildmode flag
 
-	dir string   // If non-empty, run in GOROOT/src-relative directory dir
 	env []string // Environment variables to add, as KEY=VAL. KEY= unsets a variable
 
+	runOnHost bool // When cross-compiling, run this test on the host instead of guest
+
+	// variant, if non-empty, is a name used to distinguish different
+	// configurations of the same test package(s). If set and omitVariant is false,
+	// the Package field in test2json output is rewritten to pkg:variant.
+	variant string
+	// omitVariant indicates that variant is used solely for the dist test name and
+	// that the set of test names run by each variant (including empty) of a package
+	// is non-overlapping.
+	omitVariant bool
+
 	// We have both pkg and pkgs as a convenience. Both may be set, in which
-	// case they will be combined. If both are empty, the default is ".".
+	// case they will be combined. At least one must be set.
 	pkgs []string // Multiple packages to test
 	pkg  string   // A single package to test
 
 	testFlags []string // Additional flags accepted by this test
 }
 
-// bgCommand returns a go test Cmd. The result has Stdout and Stderr set to nil
-// and is intended to be added to the work queue.
-func (opts *goTest) bgCommand(t *tester) *exec.Cmd {
-	goCmd, build, run, pkgs, setupCmd := opts.buildArgs(t)
+// bgCommand returns a go test Cmd and a post-Run flush function. The result
+// will write its output to stdout and stderr. If stdout==stderr, bgCommand
+// ensures Writes are serialized. The caller should call flush() after Cmd exits.
+func (opts *goTest) bgCommand(t *tester, stdout, stderr io.Writer) (cmd *exec.Cmd, flush func()) {
+	build, run, pkgs, testFlags, setupCmd := opts.buildArgs(t)
 
 	// Combine the flags.
 	args := append([]string{"test"}, build...)
 	if t.compileOnly {
-		// We can't pass -c with multiple packages, so run the tests but
-		// tell them not to do anything.
-		args = append(args, "-run=^$")
+		args = append(args, "-c", "-o", os.DevNull)
 	} else {
 		args = append(args, run...)
 	}
 	args = append(args, pkgs...)
 	if !t.compileOnly {
-		args = append(args, opts.testFlags...)
+		args = append(args, testFlags...)
 	}
 
-	cmd := exec.Command(goCmd, args...)
+	cmd = exec.Command(gorootBinGo, args...)
 	setupCmd(cmd)
-
-	return cmd
-}
-
-// command returns a go test Cmd intended to be run immediately.
-func (opts *goTest) command(t *tester) *exec.Cmd {
-	cmd := opts.bgCommand(t)
-	cmd.Stdout = os.Stdout
-	cmd.Stderr = os.Stderr
-	return cmd
-}
-
-func (opts *goTest) run(t *tester) error {
-	return opts.command(t).Run()
-}
-
-// runHostTest runs a test that should be built and run on the host GOOS/GOARCH,
-// but run with GOOS/GOARCH set to the target GOOS/GOARCH. This is for tests
-// that do nothing but compile and run other binaries. If the host and target
-// are different, then the assumption is that the target is running in an
-// emulator and does not have a Go toolchain at all, so the test needs to run on
-// the host, but its resulting binaries will be run through a go_exec wrapper
-// that runs them on the target.
-func (opts *goTest) runHostTest(t *tester) error {
-	goCmd, build, run, pkgs, setupCmd := opts.buildArgs(t)
-
-	// Build the host test binary
-	if len(pkgs) != 1 {
-		// We can't compile more than one package.
-		panic("host tests must have a single test package")
-	}
-	if len(opts.env) != 0 {
-		// It's not clear if these are for the host or the target.
-		panic("host tests must not have environment variables")
-	}
-
-	f, err := os.CreateTemp(t.goTmpDir, "test.test-*"+t.goExe)
-	if err != nil {
-		fatalf("failed to create temporary file: %s", err)
-	}
-	bin := f.Name()
-	f.Close()
-	xatexit(func() { os.Remove(bin) })
-
-	args := append([]string{"test", "-c", "-o", bin}, build...)
-	args = append(args, pkgs...)
-	cmd := exec.Command(goCmd, args...)
-	setupCmd(cmd)
-	cmd.Stdout = os.Stdout
-	cmd.Stderr = os.Stderr
-	setEnv(cmd, "GOARCH", gohostarch)
-	setEnv(cmd, "GOOS", gohostos)
-	if vflag > 1 {
-		errprintf("%s\n", cmd)
-	}
-	if err := cmd.Run(); err != nil {
-		return err
-	}
-
-	if t.compileOnly {
-		return nil
-	}
-
-	// Transform run flags to be passed directly to a test binary.
-	for i, f := range run {
-		if !strings.HasPrefix(f, "-") {
-			panic("run flag does not start with -: " + f)
+	if t.json && opts.variant != "" && !opts.omitVariant {
+		// Rewrite Package in the JSON output to be pkg:variant. When omitVariant
+		// is true, pkg.TestName is already unambiguous, so we don't need to
+		// rewrite the Package field.
+		//
+		// We only want to process JSON on the child's stdout. Ideally if
+		// stdout==stderr, we would also use the same testJSONFilter for
+		// cmd.Stdout and cmd.Stderr in order to keep the underlying
+		// interleaving of writes, but then it would see even partial writes
+		// interleaved, which would corrupt the JSON. So, we only process
+		// cmd.Stdout. This has another consequence though: if stdout==stderr,
+		// we have to serialize Writes in case the Writer is not concurrent
+		// safe. If we were just passing stdout/stderr through to exec, it would
+		// do this for us, but since we're wrapping stdout, we have to do it
+		// ourselves.
+		if stdout == stderr {
+			stdout = &lockedWriter{w: stdout}
+			stderr = stdout
 		}
-		run[i] = "-test." + f[1:]
+		f := &testJSONFilter{w: stdout, variant: opts.variant}
+		cmd.Stdout = f
+		flush = f.Flush
+	} else {
+		cmd.Stdout = stdout
+		flush = func() {}
 	}
+	cmd.Stderr = stderr
 
-	// Run the test
-	args = append(run, opts.testFlags...)
-	cmd = exec.Command(bin, args...)
-	setupCmd(cmd)
-	cmd.Stdout = os.Stdout
-	cmd.Stderr = os.Stderr
-	if vflag > 1 {
-		errprintf("%s\n", cmd)
-	}
-	return cmd.Run()
+	return cmd, flush
+}
+
+// run runs a go test and returns an error if it does not succeed.
+func (opts *goTest) run(t *tester) error {
+	cmd, flush := opts.bgCommand(t, os.Stdout, os.Stderr)
+	err := cmd.Run()
+	flush()
+	return err
 }
 
 // buildArgs is in internal helper for goTest that constructs the elements of
-// the "go test" command line. goCmd is the path to the go command to use. build
-// is the flags for building the test. run is the flags for running the test.
-// pkgs is the list of packages to build and run.
+// the "go test" command line. build is the flags for building the test. run is
+// the flags for running the test. pkgs is the list of packages to build and
+// run. testFlags is the list of flags to pass to the test package.
 //
-// The caller is responsible for adding opts.testFlags, and must call setupCmd
-// on the resulting exec.Cmd to set its directory and environment.
-func (opts *goTest) buildArgs(t *tester) (goCmd string, build, run, pkgs []string, setupCmd func(*exec.Cmd)) {
-	goCmd = gorootBinGo
-	if opts.goroot != "" {
-		goCmd = filepath.Join(opts.goroot, "bin", "go")
-	}
-
+// The caller must call setupCmd on the resulting exec.Cmd to set its directory
+// and environment.
+func (opts *goTest) buildArgs(t *tester) (build, run, pkgs, testFlags []string, setupCmd func(*exec.Cmd)) {
 	run = append(run, "-count=1") // Disallow caching
 	if opts.timeout != 0 {
 		d := opts.timeout * time.Duration(t.timeoutScale)
 		run = append(run, "-timeout="+d.String())
+	} else if t.timeoutScale != 1 {
+		const goTestDefaultTimeout = 10 * time.Minute // Default value of go test -timeout flag.
+		run = append(run, "-timeout="+(goTestDefaultTimeout*time.Duration(t.timeoutScale)).String())
 	}
 	if opts.short || t.short {
 		run = append(run, "-short")
@@ -489,7 +458,7 @@
 	if opts.bench {
 		// Run no tests.
 		run = append(run, "-run=^$")
-		// Run benchmarks as a smoke test
+		// Run benchmarks briefly as a smoke test.
 		run = append(run, "-bench=.*", "-benchtime=.1s")
 	} else if opts.runTests != "" {
 		run = append(run, "-run="+opts.runTests)
@@ -497,6 +466,9 @@
 	if opts.cpu != "" {
 		run = append(run, "-cpu="+opts.cpu)
 	}
+	if t.json {
+		run = append(run, "-json")
+	}
 
 	if opts.gcflags != "" {
 		build = append(build, "-gcflags=all="+opts.gcflags)
@@ -508,29 +480,20 @@
 		build = append(build, "-buildmode="+opts.buildmode)
 	}
 
-	pkgs = opts.pkgs
-	if opts.pkg != "" {
-		pkgs = append(pkgs[:len(pkgs):len(pkgs)], opts.pkg)
+	pkgs = opts.packages()
+
+	runOnHost := opts.runOnHost && (goarch != gohostarch || goos != gohostos)
+	needTestFlags := len(opts.testFlags) > 0 || runOnHost
+	if needTestFlags {
+		testFlags = append([]string{"-args"}, opts.testFlags...)
 	}
-	if len(pkgs) == 0 {
-		pkgs = []string{"."}
+	if runOnHost {
+		// -target is a special flag understood by tests that can run on the host
+		testFlags = append(testFlags, "-target="+goos+"/"+goarch)
 	}
 
-	thisGoroot := goroot
-	if opts.goroot != "" {
-		thisGoroot = opts.goroot
-	}
-	var dir string
-	if opts.dir != "" {
-		if filepath.IsAbs(opts.dir) {
-			panic("dir must be relative, got: " + opts.dir)
-		}
-		dir = filepath.Join(thisGoroot, "src", opts.dir)
-	} else {
-		dir = filepath.Join(thisGoroot, "src")
-	}
 	setupCmd = func(cmd *exec.Cmd) {
-		setDir(cmd, dir)
+		setDir(cmd, filepath.Join(goroot, "src"))
 		if len(opts.env) != 0 {
 			for _, kv := range opts.env {
 				if i := strings.Index(kv, "="); i < 0 {
@@ -540,11 +503,28 @@
 				}
 			}
 		}
+		if runOnHost {
+			setEnv(cmd, "GOARCH", gohostarch)
+			setEnv(cmd, "GOOS", gohostos)
+		}
 	}
 
 	return
 }
 
+// packages returns the full list of packages to be run by this goTest. This
+// will always include at least one package.
+func (opts *goTest) packages() []string {
+	pkgs := opts.pkgs
+	if opts.pkg != "" {
+		pkgs = append(pkgs[:len(pkgs):len(pkgs)], opts.pkg)
+	}
+	if len(pkgs) == 0 {
+		panic("no packages")
+	}
+	return pkgs
+}
+
 // ranGoTest and stdMatches are state closed over by the stdlib
 // testing func in registerStdTest below. The tests are run
 // sequentially, so there's no need for locks.
@@ -560,81 +540,87 @@
 )
 
 func (t *tester) registerStdTest(pkg string) {
-	heading := "Testing packages."
-	testPrefix := "go_test:"
+	const stdTestHeading = "Testing packages." // known to addTest for a safety check
 	gcflags := gogcflags
-
-	testName := testPrefix + pkg
-	if t.runRx == nil || t.runRx.MatchString(testName) == t.runRxWant {
+	name := testName(pkg, "")
+	if t.runRx == nil || t.runRx.MatchString(name) == t.runRxWant {
 		stdMatches = append(stdMatches, pkg)
 	}
+	t.addTest(name, stdTestHeading, func(dt *distTest) error {
+		if ranGoTest {
+			return nil
+		}
+		t.runPending(dt)
+		timelog("start", dt.name)
+		defer timelog("end", dt.name)
+		ranGoTest = true
 
-	t.tests = append(t.tests, distTest{
-		name:    testName,
-		heading: heading,
-		fn: func(dt *distTest) error {
-			if ranGoTest {
-				return nil
+		timeoutSec := 180 * time.Second
+		for _, pkg := range stdMatches {
+			if pkg == "cmd/go" {
+				timeoutSec *= 3
+				break
 			}
-			t.runPending(dt)
-			timelog("start", dt.name)
-			defer timelog("end", dt.name)
-			ranGoTest = true
-
-			timeoutSec := 180 * time.Second
-			for _, pkg := range stdMatches {
-				if pkg == "cmd/go" {
-					timeoutSec *= 3
-					break
-				}
-			}
-			return (&goTest{
-				timeout: timeoutSec,
-				gcflags: gcflags,
-				pkgs:    stdMatches,
-			}).run(t)
-		},
+		}
+		return (&goTest{
+			timeout: timeoutSec,
+			gcflags: gcflags,
+			pkgs:    stdMatches,
+		}).run(t)
 	})
 }
 
 func (t *tester) registerRaceBenchTest(pkg string) {
-	testName := "go_test_bench:" + pkg
-	if t.runRx == nil || t.runRx.MatchString(testName) == t.runRxWant {
+	const raceBenchHeading = "Running benchmarks briefly." // known to addTest for a safety check
+	name := testName(pkg, "racebench")
+	if t.runRx == nil || t.runRx.MatchString(name) == t.runRxWant {
 		benchMatches = append(benchMatches, pkg)
 	}
-	t.tests = append(t.tests, distTest{
-		name:    testName,
-		heading: "Running benchmarks briefly.",
-		fn: func(dt *distTest) error {
-			if ranGoBench {
-				return nil
-			}
-			t.runPending(dt)
-			timelog("start", dt.name)
-			defer timelog("end", dt.name)
-			ranGoBench = true
-			return (&goTest{
-				timeout: 1200 * time.Second, // longer timeout for race with benchmarks
-				race:    true,
-				bench:   true,
-				cpu:     "4",
-				pkgs:    benchMatches,
-			}).run(t)
-		},
+	t.addTest(name, raceBenchHeading, func(dt *distTest) error {
+		if ranGoBench {
+			return nil
+		}
+		t.runPending(dt)
+		timelog("start", dt.name)
+		defer timelog("end", dt.name)
+		ranGoBench = true
+		return (&goTest{
+			variant:     "racebench",
+			omitVariant: true,               // The only execution of benchmarks in dist; benchmark names are guaranteed not to overlap with test names.
+			timeout:     1200 * time.Second, // longer timeout for race with benchmarks
+			race:        true,
+			bench:       true,
+			cpu:         "4",
+			pkgs:        benchMatches,
+		}).run(t)
 	})
 }
 
 func (t *tester) registerTests() {
+	// registerStdTestSpecially tracks import paths in the standard library
+	// whose test registration happens in a special way.
+	//
+	// These tests *must* be able to run normally as part of "go test std cmd",
+	// even if they are also registered separately by dist, because users often
+	// run go test directly. Use skips or build tags in preference to expanding
+	// this list.
+	registerStdTestSpecially := map[string]bool{
+		// testdir can run normally as part of "go test std cmd", but because
+		// it's a very large test, we register is specially as several shards to
+		// enable better load balancing on sharded builders. Ideally the build
+		// system would know how to shard any large test package.
+		"cmd/internal/testdir": true,
+	}
+
 	// Fast path to avoid the ~1 second of `go list std cmd` when
 	// the caller lists specific tests to run. (as the continuous
 	// build coordinator does).
 	if len(t.runNames) > 0 {
 		for _, name := range t.runNames {
-			if strings.HasPrefix(name, "go_test:") {
-				t.registerStdTest(strings.TrimPrefix(name, "go_test:"))
-			}
-			if strings.HasPrefix(name, "go_test_bench:") {
-				t.registerRaceBenchTest(strings.TrimPrefix(name, "go_test_bench:"))
+			if !strings.Contains(name, ":") {
+				t.registerStdTest(name)
+			} else if strings.HasSuffix(name, ":racebench") {
+				t.registerRaceBenchTest(strings.TrimSuffix(name, ":racebench"))
 			}
 		}
 	} else {
@@ -652,6 +638,9 @@
 		}
 		pkgs := strings.Fields(string(all))
 		for _, pkg := range pkgs {
+			if registerStdTestSpecially[pkg] {
+				continue
+			}
 			t.registerStdTest(pkg)
 		}
 		if t.race {
@@ -669,18 +658,27 @@
 
 	// Test the os/user package in the pure-Go mode too.
 	if !t.compileOnly {
-		t.registerTest("osusergo", "os/user with tag osusergo",
+		t.registerTest("os/user with tag osusergo",
 			&goTest{
+				variant: "osusergo",
 				timeout: 300 * time.Second,
 				tags:    []string{"osusergo"},
 				pkg:     "os/user",
 			})
+		t.registerTest("hash/maphash purego implementation",
+			&goTest{
+				variant: "purego",
+				timeout: 300 * time.Second,
+				tags:    []string{"purego"},
+				pkg:     "hash/maphash",
+			})
 	}
 
 	// Test ios/amd64 for the iOS simulator.
 	if goos == "darwin" && goarch == "amd64" && t.cgoEnabled {
-		t.registerTest("amd64ios", "GOOS=ios on darwin/amd64",
+		t.registerTest("GOOS=ios on darwin/amd64",
 			&goTest{
+				variant:  "amd64ios",
 				timeout:  300 * time.Second,
 				runTests: "SystemRoots",
 				env:      []string{"GOOS=ios", "CGO_ENABLED=1"},
@@ -689,9 +687,10 @@
 	}
 
 	// Runtime CPU tests.
-	if !t.compileOnly && goos != "js" { // js can't handle -cpu != 1
-		t.registerTest("runtime:cpu124", "GOMAXPROCS=2 runtime -cpu=1,2,4 -quick",
+	if !t.compileOnly && t.hasParallelism() {
+		t.registerTest("GOMAXPROCS=2 runtime -cpu=1,2,4 -quick",
 			&goTest{
+				variant:   "cpu124",
 				timeout:   300 * time.Second,
 				cpu:       "1,2,4",
 				short:     true,
@@ -710,8 +709,6 @@
 	if !t.compileOnly && !t.short {
 		// hooks is the set of maymorestack hooks to test with.
 		hooks := []string{"mayMoreStackPreempt", "mayMoreStackMove"}
-		// pkgs is the set of test packages to run.
-		pkgs := []string{"runtime", "reflect", "sync"}
 		// hookPkgs is the set of package patterns to apply
 		// the maymorestack hook to.
 		hookPkgs := []string{"runtime/...", "reflect", "sync"}
@@ -736,65 +733,17 @@
 			}
 			goFlags := strings.Join(goFlagsList, " ")
 
-			for _, pkg := range pkgs {
-				t.registerTest(hook+":"+pkg, "maymorestack="+hook,
-					&goTest{
-						timeout: 600 * time.Second,
-						short:   true,
-						env:     []string{"GOFLAGS=" + goFlags},
-						pkg:     pkg,
-					})
-			}
+			t.registerTest("maymorestack="+hook,
+				&goTest{
+					variant: hook,
+					timeout: 600 * time.Second,
+					short:   true,
+					env:     []string{"GOFLAGS=" + goFlags},
+					pkgs:    []string{"runtime", "reflect", "sync"},
+				})
 		}
 	}
 
-	// On the builders only, test that a moved GOROOT still works.
-	// Fails on iOS because CC_FOR_TARGET refers to clangwrap.sh
-	// in the unmoved GOROOT.
-	// Fails on Android and js/wasm with an exec format error.
-	// Fails on plan9 with "cannot find GOROOT" (issue #21016).
-	if os.Getenv("GO_BUILDER_NAME") != "" && goos != "android" && !t.iOS() && goos != "plan9" && goos != "js" {
-		t.tests = append(t.tests, distTest{
-			name:    "moved_goroot",
-			heading: "moved GOROOT",
-			fn: func(dt *distTest) error {
-				t.runPending(dt)
-				timelog("start", dt.name)
-				defer timelog("end", dt.name)
-				moved := goroot + "-moved"
-				if err := os.Rename(goroot, moved); err != nil {
-					if goos == "windows" {
-						// Fails on Windows (with "Access is denied") if a process
-						// or binary is in this directory. For instance, using all.bat
-						// when run from c:\workdir\go\src fails here
-						// if GO_BUILDER_NAME is set. Our builders invoke tests
-						// a different way which happens to work when sharding
-						// tests, but we should be tolerant of the non-sharded
-						// all.bat case.
-						log.Printf("skipping test on Windows")
-						return nil
-					}
-					return err
-				}
-
-				// Run `go test fmt` in the moved GOROOT, without explicitly setting
-				// GOROOT in the environment. The 'go' command should find itself.
-				cmd := (&goTest{
-					goroot: moved,
-					pkg:    "fmt",
-				}).command(t)
-				unsetEnv(cmd, "GOROOT")
-				unsetEnv(cmd, "GOCACHE") // TODO(bcmills): ...why‽
-				err := cmd.Run()
-
-				if rerr := os.Rename(moved, goroot); rerr != nil {
-					fatalf("failed to restore GOROOT: %v", rerr)
-				}
-				return err
-			},
-		})
-	}
-
 	// Test that internal linking of standard packages does not
 	// require libgcc. This ensures that we can install a Go
 	// release on a system that does not have a C compiler
@@ -815,8 +764,9 @@
 		if pkg == "net" {
 			run = "TestTCPStress"
 		}
-		t.registerTest("nolibgcc:"+pkg, "Testing without libgcc.",
+		t.registerTest("Testing without libgcc.",
 			&goTest{
+				variant:  "nolibgcc",
 				ldflags:  "-linkmode=internal -libgcc=none",
 				runTests: run,
 				pkg:      pkg,
@@ -829,8 +779,9 @@
 
 	// Test internal linking of PIE binaries where it is supported.
 	if t.internalLinkPIE() && !disablePIE {
-		t.registerTest("pie_internal", "internal linking of -buildmode=pie",
+		t.registerTest("internal linking of -buildmode=pie",
 			&goTest{
+				variant:   "pie_internal",
 				timeout:   60 * time.Second,
 				buildmode: "pie",
 				ldflags:   "-linkmode=internal",
@@ -839,8 +790,9 @@
 			})
 		// Also test a cgo package.
 		if t.cgoEnabled && t.internalLink() && !disablePIE {
-			t.registerTest("pie_internal_cgo", "internal linking of -buildmode=pie",
+			t.registerTest("internal linking of -buildmode=pie",
 				&goTest{
+					variant:   "pie_internal",
 					timeout:   60 * time.Second,
 					buildmode: "pie",
 					ldflags:   "-linkmode=internal",
@@ -850,9 +802,10 @@
 	}
 
 	// sync tests
-	if goos != "js" { // js doesn't support -cpu=10
-		t.registerTest("sync_cpu", "sync -cpu=10",
+	if t.hasParallelism() {
+		t.registerTest("sync -cpu=10",
 			&goTest{
+				variant: "cpu10",
 				timeout: 120 * time.Second,
 				cpu:     "10",
 				pkg:     "sync",
@@ -863,71 +816,22 @@
 		t.registerRaceTests()
 	}
 
-	if t.cgoEnabled && !t.iOS() {
-		// Disabled on iOS. golang.org/issue/15919
-		t.registerTest("cgo_stdio", "", &goTest{dir: "../misc/cgo/stdio", timeout: 5 * time.Minute}, rtHostTest{})
-		t.registerTest("cgo_life", "", &goTest{dir: "../misc/cgo/life", timeout: 5 * time.Minute}, rtHostTest{})
-		if goos != "android" {
-			t.registerTest("cgo_fortran", "", &goTest{dir: "../misc/cgo/fortran", timeout: 5 * time.Minute}, rtHostTest{})
-		}
-		if t.hasSwig() && goos != "android" {
-			t.registerTest("swig_stdio", "", &goTest{dir: "../misc/swig/stdio"})
-			if t.hasCxx() {
-				t.registerTest("swig_callback", "", &goTest{dir: "../misc/swig/callback"})
-				const cflags = "-flto -Wno-lto-type-mismatch -Wno-unknown-warning-option"
-				t.registerTest("swig_callback_lto", "",
-					&goTest{
-						dir: "../misc/swig/callback",
-						env: []string{
-							"CGO_CFLAGS=" + cflags,
-							"CGO_CXXFLAGS=" + cflags,
-							"CGO_LDFLAGS=" + cflags,
-						},
-					})
-			}
-		}
-	}
+	const cgoHeading = "Testing cgo"
 	if t.cgoEnabled {
-		t.registerCgoTests()
+		t.registerCgoTests(cgoHeading)
 	}
 
-	// Don't run these tests with $GO_GCFLAGS because most of them
-	// assume that they can run "go install" with no -gcflags and not
-	// recompile the entire standard library. If make.bash ran with
-	// special -gcflags, that's not true.
-	if t.cgoEnabled && gogcflags == "" {
-		t.registerTest("testgodefs", "", &goTest{dir: "../misc/cgo/testgodefs", timeout: 5 * time.Minute}, rtHostTest{})
-
-		t.registerTest("testso", "", &goTest{dir: "../misc/cgo/testso", timeout: 600 * time.Second})
-		t.registerTest("testsovar", "", &goTest{dir: "../misc/cgo/testsovar", timeout: 600 * time.Second})
-		if t.supportedBuildmode("c-archive") {
-			t.registerTest("testcarchive", "", &goTest{dir: "../misc/cgo/testcarchive", timeout: 5 * time.Minute}, rtHostTest{})
-		}
-		if t.supportedBuildmode("c-shared") {
-			t.registerTest("testcshared", "", &goTest{dir: "../misc/cgo/testcshared", timeout: 5 * time.Minute}, rtHostTest{})
-		}
-		if t.supportedBuildmode("shared") {
-			t.registerTest("testshared", "", &goTest{dir: "../misc/cgo/testshared", timeout: 600 * time.Second})
-		}
-		if t.supportedBuildmode("plugin") {
-			t.registerTest("testplugin", "", &goTest{dir: "../misc/cgo/testplugin", timeout: 600 * time.Second})
-		}
-		if goos == "linux" || (goos == "freebsd" && goarch == "amd64") {
-			// because Pdeathsig of syscall.SysProcAttr struct used in misc/cgo/testsanitizers is only
-			// supported on Linux and FreeBSD.
-			t.registerTest("testsanitizers", "", &goTest{dir: "../misc/cgo/testsanitizers", timeout: 5 * time.Minute}, rtHostTest{})
-		}
-		if t.hasBash() && goos != "android" && !t.iOS() && gohostos != "windows" {
-			t.registerTest("cgo_errors", "", &goTest{dir: "../misc/cgo/errors", timeout: 5 * time.Minute}, rtHostTest{})
-		}
+	if goos == "wasip1" {
+		t.registerTest("wasip1 host tests",
+			&goTest{
+				variant:   "host",
+				pkg:       "runtime/internal/wasitest",
+				timeout:   1 * time.Minute,
+				runOnHost: true,
+			})
 	}
 
 	if goos != "android" && !t.iOS() {
-		// There are no tests in this directory, only benchmarks.
-		// Check that the test binary builds.
-		t.registerTest("bench_go1", "", &goTest{dir: "../test/bench/go1"})
-	}
-	if goos != "android" && !t.iOS() {
 		// Only start multiple test dir shards on builders,
 		// where they get distributed to multiple machines.
 		// See issues 20141 and 31834.
@@ -939,12 +843,16 @@
 			nShards = n
 		}
 		for shard := 0; shard < nShards; shard++ {
-			shard := shard
-			t.tests = append(t.tests, distTest{
-				name:    fmt.Sprintf("test:%d_%d", shard, nShards),
-				heading: "../test",
-				fn:      func(dt *distTest) error { return t.testDirTest(dt, shard, nShards) },
-			})
+			id := fmt.Sprintf("%d_%d", shard, nShards)
+			t.registerTest("../test",
+				&goTest{
+					variant:     id,
+					omitVariant: true, // Shards of the same Go package; tests are guaranteed not to overlap.
+					pkg:         "cmd/internal/testdir",
+					testFlags:   []string{fmt.Sprintf("-shard=%d", shard), fmt.Sprintf("-shards=%d", nShards)},
+					runOnHost:   true,
+				},
+			)
 		}
 	}
 	// Only run the API check on fast development platforms.
@@ -953,109 +861,123 @@
 	// To help developers avoid trybot-only failures, we try to run on typical developer machines
 	// which is darwin,linux,windows/amd64 and darwin/arm64.
 	if goos == "darwin" || ((goos == "linux" || goos == "windows") && goarch == "amd64") {
-		t.registerTest("api", "", &goTest{dir: "cmd/api", timeout: 5 * time.Minute, testFlags: []string{"-check"}})
-	}
-
-	// Ensure that the toolchain can bootstrap itself.
-	// This test adds another ~45s to all.bash if run sequentially, so run it only on the builders.
-	if os.Getenv("GO_BUILDER_NAME") != "" && goos != "android" && !t.iOS() {
-		t.registerTest("reboot", "", &goTest{dir: "../misc/reboot", timeout: 5 * time.Minute}, rtHostTest{})
+		t.registerTest("API check", &goTest{variant: "check", pkg: "cmd/api", timeout: 5 * time.Minute, testFlags: []string{"-check"}})
 	}
 }
 
-// isRegisteredTestName reports whether a test named testName has already
-// been registered.
-func (t *tester) isRegisteredTestName(testName string) bool {
-	for _, tt := range t.tests {
-		if tt.name == testName {
-			return true
-		}
+// addTest adds an arbitrary test callback to the test list.
+//
+// name must uniquely identify the test and heading must be non-empty.
+func (t *tester) addTest(name, heading string, fn func(*distTest) error) {
+	if t.testNames[name] {
+		panic("duplicate registered test name " + name)
 	}
-	return false
+	if heading == "" {
+		panic("empty heading")
+	}
+	// Two simple checks for cases that would conflict with the fast path in registerTests.
+	if !strings.Contains(name, ":") && heading != "Testing packages." {
+		panic("empty variant is reserved exclusively for registerStdTest")
+	} else if strings.HasSuffix(name, ":racebench") && heading != "Running benchmarks briefly." {
+		panic("racebench variant is reserved exclusively for registerRaceBenchTest")
+	}
+	if t.testNames == nil {
+		t.testNames = make(map[string]bool)
+	}
+	t.testNames[name] = true
+	t.tests = append(t.tests, distTest{
+		name:    name,
+		heading: heading,
+		fn:      fn,
+	})
 }
 
 type registerTestOpt interface {
 	isRegisterTestOpt()
 }
 
-// rtSequential is a registerTest option that causes the registered test to run
-// sequentially.
-type rtSequential struct{}
-
-func (rtSequential) isRegisterTestOpt() {}
-
-// rtPreFunc is a registerTest option that runs a pre function before running
-// the test.
-type rtPreFunc struct {
-	pre func(*distTest) bool // Return false to skip the test
+// rtSkipFunc is a registerTest option that runs a skip check function before
+// running the test.
+type rtSkipFunc struct {
+	skip func(*distTest) (string, bool) // Return message, true to skip the test
 }
 
-func (rtPreFunc) isRegisterTestOpt() {}
-
-// rtHostTest is a registerTest option that indicates this is a host test that
-// should be run using goTest.runHostTest. It implies rtSequential.
-type rtHostTest struct{}
-
-func (rtHostTest) isRegisterTestOpt() {}
+func (rtSkipFunc) isRegisterTestOpt() {}
 
 // registerTest registers a test that runs the given goTest.
 //
-// If heading is "", it uses test.dir as the heading.
-func (t *tester) registerTest(name, heading string, test *goTest, opts ...registerTestOpt) {
-	seq := false
-	hostTest := false
-	var preFunc func(*distTest) bool
+// Each Go package in goTest will have a corresponding test
+// "<pkg>:<variant>", which must uniquely identify the test.
+//
+// heading and test.variant must be non-empty.
+func (t *tester) registerTest(heading string, test *goTest, opts ...registerTestOpt) {
+	var skipFunc func(*distTest) (string, bool)
 	for _, opt := range opts {
 		switch opt := opt.(type) {
-		case rtSequential:
-			seq = true
-		case rtPreFunc:
-			preFunc = opt.pre
-		case rtHostTest:
-			seq, hostTest = true, true
+		case rtSkipFunc:
+			skipFunc = opt.skip
 		}
 	}
-	if t.isRegisteredTestName(name) {
-		panic("duplicate registered test name " + name)
-	}
-	if heading == "" {
-		heading = test.dir
-	}
-	t.tests = append(t.tests, distTest{
-		name:    name,
-		heading: heading,
-		fn: func(dt *distTest) error {
-			if preFunc != nil && !preFunc(dt) {
-				return nil
-			}
-			if seq {
-				t.runPending(dt)
-				if hostTest {
-					return test.runHostTest(t)
+	// Register each test package as a separate test.
+	register1 := func(test *goTest) {
+		if test.variant == "" {
+			panic("empty variant")
+		}
+		name := testName(test.pkg, test.variant)
+		t.addTest(name, heading, func(dt *distTest) error {
+			if skipFunc != nil {
+				msg, skip := skipFunc(dt)
+				if skip {
+					t.printSkip(test, msg)
+					return nil
 				}
-				return test.run(t)
 			}
-			w := &work{
-				dt:  dt,
-				cmd: test.bgCommand(t),
-			}
+			w := &work{dt: dt}
+			w.cmd, w.flush = test.bgCommand(t, &w.out, &w.out)
 			t.worklist = append(t.worklist, w)
 			return nil
-		},
-	})
+		})
+	}
+	if test.pkg != "" && len(test.pkgs) == 0 {
+		// Common case. Avoid copying.
+		register1(test)
+		return
+	}
+	// TODO(dmitshur,austin): It might be better to unify the execution of 'go test pkg'
+	// invocations for the same variant to be done with a single 'go test pkg1 pkg2 pkg3'
+	// command, just like it's already done in registerStdTest and registerRaceBenchTest.
+	// Those methods accumulate matched packages in stdMatches and benchMatches slices,
+	// and we can extend that mechanism to work for all other equal variant registrations.
+	// Do the simple thing to start with.
+	for _, pkg := range test.packages() {
+		test1 := *test
+		test1.pkg, test1.pkgs = pkg, nil
+		register1(&test1)
+	}
 }
 
-// bgDirCmd constructs a Cmd intended to be run in the background as
-// part of the worklist. The worklist runner will buffer its output
-// and replay it sequentially. The command will be run in dir.
-func (t *tester) bgDirCmd(dir, bin string, args ...string) *exec.Cmd {
-	cmd := exec.Command(bin, args...)
-	if filepath.IsAbs(dir) {
-		setDir(cmd, dir)
-	} else {
-		setDir(cmd, filepath.Join(goroot, dir))
+func (t *tester) printSkip(test *goTest, msg string) {
+	if !t.json {
+		fmt.Println(msg)
+		return
 	}
-	return cmd
+	type event struct {
+		Time    time.Time
+		Action  string
+		Package string
+		Output  string `json:",omitempty"`
+	}
+	out := json.NewEncoder(os.Stdout)
+	for _, pkg := range test.packages() {
+		ev := event{Time: time.Now(), Package: testName(pkg, test.variant), Action: "start"}
+		out.Encode(ev)
+		ev.Action = "output"
+		ev.Output = msg
+		out.Encode(ev)
+		ev.Action = "skip"
+		ev.Output = ""
+		out.Encode(ev)
+	}
 }
 
 // dirCmd constructs a Cmd intended to be run in the foreground.
@@ -1063,7 +985,12 @@
 // and os.Stderr.
 func (t *tester) dirCmd(dir string, cmdline ...interface{}) *exec.Cmd {
 	bin, args := flattenCmdline(cmdline)
-	cmd := t.bgDirCmd(dir, bin, args...)
+	cmd := exec.Command(bin, args...)
+	if filepath.IsAbs(dir) {
+		setDir(cmd, dir)
+	} else {
+		setDir(cmd, filepath.Join(goroot, dir))
+	}
 	cmd.Stdout = os.Stdout
 	cmd.Stderr = os.Stderr
 	if vflag > 1 {
@@ -1083,56 +1010,39 @@
 		case []string:
 			list = append(list, x...)
 		default:
-			panic("invalid addCmd argument type: " + reflect.TypeOf(x).String())
+			panic("invalid dirCmd argument type: " + reflect.TypeOf(x).String())
 		}
 	}
 
 	bin = list[0]
-	if bin == "go" {
-		bin = gorootBinGo
+	if !filepath.IsAbs(bin) {
+		panic("command is not absolute: " + bin)
 	}
 	return bin, list[1:]
 }
 
-// addCmd adds a command to the worklist. Commands can be run in
-// parallel, but their output will be buffered and replayed in the
-// order they were added to worklist.
-func (t *tester) addCmd(dt *distTest, dir string, cmdline ...interface{}) *exec.Cmd {
-	bin, args := flattenCmdline(cmdline)
-	w := &work{
-		dt:  dt,
-		cmd: t.bgDirCmd(dir, bin, args...),
-	}
-	t.worklist = append(t.worklist, w)
-	return w.cmd
-}
-
 func (t *tester) iOS() bool {
 	return goos == "ios"
 }
 
 func (t *tester) out(v string) {
+	if t.json {
+		return
+	}
 	if t.banner == "" {
 		return
 	}
 	fmt.Println("\n" + t.banner + v)
 }
 
+// extLink reports whether the current goos/goarch supports
+// external linking. This should match the test in determineLinkMode
+// in cmd/link/internal/ld/config.go.
 func (t *tester) extLink() bool {
-	pair := gohostos + "-" + goarch
-	switch pair {
-	case "aix-ppc64",
-		"android-arm", "android-arm64",
-		"darwin-amd64", "darwin-arm64",
-		"dragonfly-amd64",
-		"freebsd-386", "freebsd-amd64", "freebsd-arm", "freebsd-riscv64",
-		"linux-386", "linux-amd64", "linux-arm", "linux-arm64", "linux-loong64", "linux-ppc64le", "linux-mips64", "linux-mips64le", "linux-mips", "linux-mipsle", "linux-riscv64", "linux-s390x",
-		"netbsd-386", "netbsd-amd64",
-		"openbsd-386", "openbsd-amd64",
-		"windows-386", "windows-amd64":
-		return true
+	if goarch == "ppc64" && goos != "aix" {
+		return false
 	}
-	return false
+	return true
 }
 
 func (t *tester) internalLink() bool {
@@ -1173,73 +1083,29 @@
 	return false
 }
 
+// supportedBuildMode reports whether the given build mode is supported.
 func (t *tester) supportedBuildmode(mode string) bool {
-	pair := goos + "-" + goarch
 	switch mode {
-	case "c-archive":
-		if !t.extLink() {
-			return false
-		}
-		switch pair {
-		case "aix-ppc64",
-			"darwin-amd64", "darwin-arm64", "ios-arm64",
-			"linux-amd64", "linux-386", "linux-ppc64le", "linux-riscv64", "linux-s390x",
-			"freebsd-amd64",
-			"windows-amd64", "windows-386":
-			return true
-		}
-		return false
-	case "c-shared":
-		switch pair {
-		case "linux-386", "linux-amd64", "linux-arm", "linux-arm64", "linux-ppc64le", "linux-riscv64", "linux-s390x",
-			"darwin-amd64", "darwin-arm64",
-			"freebsd-amd64",
-			"android-arm", "android-arm64", "android-386",
-			"windows-amd64", "windows-386", "windows-arm64":
-			return true
-		}
-		return false
-	case "shared":
-		switch pair {
-		case "linux-386", "linux-amd64", "linux-arm", "linux-arm64", "linux-ppc64le", "linux-s390x":
-			return true
-		}
-		return false
-	case "plugin":
-		switch pair {
-		case "linux-386", "linux-amd64", "linux-arm", "linux-arm64", "linux-s390x", "linux-ppc64le":
-			return true
-		case "darwin-amd64", "darwin-arm64":
-			return true
-		case "freebsd-amd64":
-			return true
-		}
-		return false
-	case "pie":
-		switch pair {
-		case "aix/ppc64",
-			"linux-386", "linux-amd64", "linux-arm", "linux-arm64", "linux-ppc64le", "linux-riscv64", "linux-s390x",
-			"android-amd64", "android-arm", "android-arm64", "android-386":
-			return true
-		case "darwin-amd64", "darwin-arm64":
-			return true
-		case "windows-amd64", "windows-386", "windows-arm":
-			return true
-		}
-		return false
-
+	case "c-archive", "c-shared", "shared", "plugin", "pie":
 	default:
 		fatalf("internal error: unknown buildmode %s", mode)
 		return false
 	}
+
+	return buildModeSupported("gc", mode, goos, goarch)
 }
 
-func (t *tester) registerCgoTests() {
-	cgoTest := func(name string, subdir, linkmode, buildmode string, opts ...registerTestOpt) *goTest {
+func (t *tester) registerCgoTests(heading string) {
+	cgoTest := func(variant string, subdir, linkmode, buildmode string, opts ...registerTestOpt) *goTest {
 		gt := &goTest{
-			dir:       "../misc/cgo/" + subdir,
+			variant:   variant,
+			pkg:       "cmd/cgo/internal/" + subdir,
 			buildmode: buildmode,
-			ldflags:   "-linkmode=" + linkmode,
+		}
+		var ldflags []string
+		if linkmode != "auto" {
+			// "auto" is the default, so avoid cluttering the command line for "auto"
+			ldflags = append(ldflags, "-linkmode="+linkmode)
 		}
 
 		if linkmode == "internal" {
@@ -1253,7 +1119,7 @@
 			// cgoTest we want static linking.
 			gt.buildmode = ""
 			if linkmode == "external" {
-				gt.ldflags += ` -extldflags "-static -pthread"`
+				ldflags = append(ldflags, `-extldflags "-static -pthread"`)
 			} else if linkmode == "auto" {
 				gt.env = append(gt.env, "CGO_LDFLAGS=-static -pthread")
 			} else {
@@ -1261,19 +1127,22 @@
 			}
 			gt.tags = append(gt.tags, "static")
 		}
+		gt.ldflags = strings.Join(ldflags, " ")
 
-		t.registerTest("cgo:"+name, "../misc/cgo/test", gt, opts...)
+		t.registerTest(heading, gt, opts...)
 		return gt
 	}
 
-	cgoTest("test-auto", "test", "auto", "")
+	// test, testtls, and testnocgo are run with linkmode="auto", buildmode=""
+	// as part of go test cmd. Here we only have to register the non-default
+	// build modes of these tests.
 
 	// Stub out various buildmode=pie tests  on alpine until 54354 resolved.
 	builderName := os.Getenv("GO_BUILDER_NAME")
 	disablePIE := strings.HasSuffix(builderName, "-alpine")
 
 	if t.internalLink() {
-		cgoTest("test-internal", "test", "internal", "")
+		cgoTest("internal", "test", "internal", "")
 	}
 
 	os := gohostos
@@ -1284,24 +1153,23 @@
 			break
 		}
 		// test linkmode=external, but __thread not supported, so skip testtls.
-		cgoTest("test-external", "test", "external", "")
+		cgoTest("external", "test", "external", "")
 
-		gt := cgoTest("test-external-s", "test", "external", "")
+		gt := cgoTest("external-s", "test", "external", "")
 		gt.ldflags += " -s"
 
 		if t.supportedBuildmode("pie") && !disablePIE {
-			cgoTest("test-auto-pie", "test", "auto", "pie")
+			cgoTest("auto-pie", "test", "auto", "pie")
 			if t.internalLink() && t.internalLinkPIE() {
-				cgoTest("test-internal-pie", "test", "internal", "pie")
+				cgoTest("internal-pie", "test", "internal", "pie")
 			}
 		}
 
 	case os == "aix", os == "android", os == "dragonfly", os == "freebsd", os == "linux", os == "netbsd", os == "openbsd":
-		gt := cgoTest("test-external-g0", "test", "external", "")
+		gt := cgoTest("external-g0", "test", "external", "")
 		gt.env = append(gt.env, "CGO_CFLAGS=-g0 -fdiagnostics-color")
 
-		cgoTest("testtls-auto", "testtls", "auto", "")
-		cgoTest("testtls-external", "testtls", "external", "")
+		cgoTest("external", "testtls", "external", "")
 		switch {
 		case os == "aix":
 			// no static linking
@@ -1313,46 +1181,61 @@
 			// -fPIC fundamentally.)
 		default:
 			// Check for static linking support
-			var staticCheck rtPreFunc
-			cmd := t.dirCmd("misc/cgo/test",
-				compilerEnvLookup(defaultcc, goos, goarch), "-xc", "-o", "/dev/null", "-static", "-")
-			cmd.Stdin = strings.NewReader("int main() {}")
-			cmd.Stdout, cmd.Stderr = nil, nil // Discard output
-			if err := cmd.Run(); err != nil {
-				// Skip these tests
-				staticCheck.pre = func(*distTest) bool {
-					fmt.Println("No support for static linking found (lacks libc.a?), skip cgo static linking test.")
-					return false
+			var staticCheck rtSkipFunc
+			ccName := compilerEnvLookup("CC", defaultcc, goos, goarch)
+			cc, err := exec.LookPath(ccName)
+			if err != nil {
+				staticCheck.skip = func(*distTest) (string, bool) {
+					return fmt.Sprintf("$CC (%q) not found, skip cgo static linking test.", ccName), true
+				}
+			} else {
+				cmd := t.dirCmd("src/cmd/cgo/internal/test", cc, "-xc", "-o", "/dev/null", "-static", "-")
+				cmd.Stdin = strings.NewReader("int main() {}")
+				cmd.Stdout, cmd.Stderr = nil, nil // Discard output
+				if err := cmd.Run(); err != nil {
+					// Skip these tests
+					staticCheck.skip = func(*distTest) (string, bool) {
+						return "No support for static linking found (lacks libc.a?), skip cgo static linking test.", true
+					}
+				}
+			}
+
+			// Doing a static link with boringcrypto gets
+			// a C linker warning on Linux.
+			// in function `bio_ip_and_port_to_socket_and_addr':
+			// warning: Using 'getaddrinfo' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
+			if staticCheck.skip == nil && goos == "linux" && strings.Contains(goexperiment, "boringcrypto") {
+				staticCheck.skip = func(*distTest) (string, bool) {
+					return "skipping static linking check on Linux when using boringcrypto to avoid C linker warning about getaddrinfo", true
 				}
 			}
 
 			// Static linking tests
 			if goos != "android" && p != "netbsd/arm" {
 				// TODO(#56629): Why does this fail on netbsd-arm?
-				cgoTest("testtls-static", "testtls", "external", "static", staticCheck)
+				cgoTest("static", "testtls", "external", "static", staticCheck)
 			}
-			cgoTest("nocgo-auto", "nocgo", "auto", "", staticCheck)
-			cgoTest("nocgo-external", "nocgo", "external", "", staticCheck)
+			cgoTest("external", "testnocgo", "external", "", staticCheck)
 			if goos != "android" {
-				cgoTest("nocgo-static", "nocgo", "external", "static", staticCheck)
-				cgoTest("test-static", "test", "external", "static", staticCheck)
+				cgoTest("static", "testnocgo", "external", "static", staticCheck)
+				cgoTest("static", "test", "external", "static", staticCheck)
 				// -static in CGO_LDFLAGS triggers a different code path
 				// than -static in -extldflags, so test both.
 				// See issue #16651.
 				if goarch != "loong64" {
 					// TODO(#56623): Why does this fail on loong64?
-					cgoTest("test-static-env", "test", "auto", "static", staticCheck)
+					cgoTest("auto-static", "test", "auto", "static", staticCheck)
 				}
 			}
 
 			// PIE linking tests
 			if t.supportedBuildmode("pie") && !disablePIE {
-				cgoTest("test-pie", "test", "auto", "pie")
+				cgoTest("auto-pie", "test", "auto", "pie")
 				if t.internalLink() && t.internalLinkPIE() {
-					cgoTest("test-pie-internal", "test", "internal", "pie")
+					cgoTest("internal-pie", "test", "internal", "pie")
 				}
-				cgoTest("testtls-pie", "testtls", "auto", "pie")
-				cgoTest("nocgo-pie", "nocgo", "auto", "pie")
+				cgoTest("auto-pie", "testtls", "auto", "pie")
+				cgoTest("auto-pie", "testnocgo", "auto", "pie")
 			}
 		}
 	}
@@ -1365,23 +1248,31 @@
 // running in parallel with earlier tests, or if it has some other reason
 // for needing the earlier tests to be done.
 func (t *tester) runPending(nextTest *distTest) {
-	checkNotStale("go", "std")
 	worklist := t.worklist
 	t.worklist = nil
 	for _, w := range worklist {
 		w.start = make(chan bool)
 		w.end = make(chan bool)
+		// w.cmd must be set up to write to w.out. We can't check that, but we
+		// can check for easy mistakes.
+		if w.cmd.Stdout == nil || w.cmd.Stdout == os.Stdout || w.cmd.Stderr == nil || w.cmd.Stderr == os.Stderr {
+			panic("work.cmd.Stdout/Stderr must be redirected")
+		}
 		go func(w *work) {
 			if !<-w.start {
 				timelog("skip", w.dt.name)
-				w.out = []byte(fmt.Sprintf("skipped due to earlier error\n"))
+				w.printSkip(t, "skipped due to earlier error")
 			} else {
 				timelog("start", w.dt.name)
-				w.out, w.err = w.cmd.CombinedOutput()
+				w.err = w.cmd.Run()
+				if w.flush != nil {
+					w.flush()
+				}
 				if w.err != nil {
 					if isUnsupportedVMASize(w) {
 						timelog("skip", w.dt.name)
-						w.out = []byte(fmt.Sprintf("skipped due to unsupported VMA\n"))
+						w.out.Reset()
+						w.printSkip(t, "skipped due to unsupported VMA")
 						w.err = nil
 					}
 				}
@@ -1402,7 +1293,7 @@
 		}
 		w := worklist[ended]
 		dt := w.dt
-		if dt.heading != "" && t.lastHeading != dt.heading {
+		if t.lastHeading != dt.heading {
 			t.lastHeading = dt.heading
 			t.out(dt.heading)
 		}
@@ -1418,19 +1309,20 @@
 		}
 		ended++
 		<-w.end
-		os.Stdout.Write(w.out)
+		os.Stdout.Write(w.out.Bytes())
+		// We no longer need the output, so drop the buffer.
+		w.out = bytes.Buffer{}
 		if w.err != nil {
 			log.Printf("Failed: %v", w.err)
 			t.failed = true
 		}
-		checkNotStale("go", "std")
 	}
 	if t.failed && !t.keepGoing {
 		fatalf("FAILED")
 	}
 
 	if dt := nextTest; dt != nil {
-		if dt.heading != "" && t.lastHeading != dt.heading {
+		if t.lastHeading != dt.heading {
 			t.lastHeading = dt.heading
 			t.out(dt.heading)
 		}
@@ -1448,82 +1340,14 @@
 	return true
 }
 
-func (t *tester) hasCxx() bool {
-	cxx, _ := exec.LookPath(compilerEnvLookup(defaultcxx, goos, goarch))
-	return cxx != ""
-}
-
-func (t *tester) hasSwig() bool {
-	swig, err := exec.LookPath("swig")
-	if err != nil {
+// hasParallelism is a copy of the function
+// internal/testenv.HasParallelism, which can't be used here
+// because cmd/dist can not import internal packages during bootstrap.
+func (t *tester) hasParallelism() bool {
+	switch goos {
+	case "js", "wasip1":
 		return false
 	}
-
-	// Check that swig was installed with Go support by checking
-	// that a go directory exists inside the swiglib directory.
-	// See https://golang.org/issue/23469.
-	output, err := exec.Command(swig, "-go", "-swiglib").Output()
-	if err != nil {
-		return false
-	}
-	swigDir := strings.TrimSpace(string(output))
-
-	_, err = os.Stat(filepath.Join(swigDir, "go"))
-	if err != nil {
-		return false
-	}
-
-	// Check that swig has a new enough version.
-	// See https://golang.org/issue/22858.
-	out, err := exec.Command(swig, "-version").CombinedOutput()
-	if err != nil {
-		return false
-	}
-
-	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 true
-	}
-
-	major, err := strconv.Atoi(string(matches[1]))
-	if err != nil {
-		// Can't find version number; hope for the best.
-		return true
-	}
-	if major < 3 {
-		return false
-	}
-	if major > 3 {
-		// 4.0 or later
-		return true
-	}
-
-	// We have SWIG version 3.x.
-	if len(matches[2]) > 0 {
-		minor, err := strconv.Atoi(string(matches[2][1:]))
-		if err != nil {
-			return true
-		}
-		if minor > 0 {
-			// 3.1 or later
-			return true
-		}
-	}
-
-	// We have SWIG version 3.0.x.
-	if len(matches[3]) > 0 {
-		patch, err := strconv.Atoi(string(matches[3][1:]))
-		if err != nil {
-			return true
-		}
-		if patch < 6 {
-			// Before 3.0.6.
-			return false
-		}
-	}
-
 	return true
 }
 
@@ -1560,14 +1384,16 @@
 
 func (t *tester) registerRaceTests() {
 	hdr := "Testing race detector"
-	t.registerTest("race:runtime/race", hdr,
+	t.registerTest(hdr,
 		&goTest{
+			variant:  "race",
 			race:     true,
 			runTests: "Output",
 			pkg:      "runtime/race",
 		})
-	t.registerTest("race", hdr,
+	t.registerTest(hdr,
 		&goTest{
+			variant:  "race",
 			race:     true,
 			runTests: "TestParse|TestEcho|TestStdinCloseRace|TestClosedPipeRace|TestTypeRace|TestFdRace|TestFdReadRace|TestFileCloseRace",
 			pkgs:     []string{"flag", "net", "os", "os/exec", "encoding/gob"},
@@ -1576,71 +1402,27 @@
 	// slows down all.bash (by 10 seconds on my laptop).
 	// The race builder should catch any error here, but doesn't.
 	// TODO(iant): Figure out how to catch this.
-	// t.registerTest("race:cmd/go", hdr, &goTest{race: true, runTests: "TestParallelTest", pkg: "cmd/go"})
+	// t.registerTest(hdr, &goTest{variant: "race", race: true, runTests: "TestParallelTest", pkg: "cmd/go"})
 	if t.cgoEnabled {
-		// Building misc/cgo/test takes a long time.
+		// Building cmd/cgo/internal/test takes a long time.
 		// There are already cgo-enabled packages being tested with the race detector.
-		// We shouldn't need to redo all of misc/cgo/test too.
+		// We shouldn't need to redo all of cmd/cgo/internal/test too.
 		// The race buildler will take care of this.
-		// t.registerTest("race:misc/cgo/test", hdr, &goTest{dir: "../misc/cgo/test", race: true, env: []string{"GOTRACEBACK=2"}})
+		// t.registerTest(hdr, &goTest{variant: "race", race: true, env: []string{"GOTRACEBACK=2"}, pkg: "cmd/cgo/internal/test"})
 	}
 	if t.extLink() {
-		var oldWindows rtPreFunc
-		if strings.HasPrefix(os.Getenv("GO_BUILDER_NAME"), "windows-amd64-2008") {
-			oldWindows.pre = func(*distTest) bool {
-				fmt.Println("skipping -race with external linkage on older windows builder, see https://github.com/golang/go/issues/56904 for details")
-				return false
-			}
-		}
 		// Test with external linking; see issue 9133.
-		t.registerTest("race:external", hdr,
+		t.registerTest(hdr,
 			&goTest{
+				variant:  "race-external",
 				race:     true,
 				ldflags:  "-linkmode=external",
 				runTests: "TestParse|TestEcho|TestStdinCloseRace",
 				pkgs:     []string{"flag", "os/exec"},
-			}, oldWindows)
+			})
 	}
 }
 
-var runtest struct {
-	sync.Once
-	exe string
-	err error
-}
-
-func (t *tester) testDirTest(dt *distTest, shard, shards int) error {
-	runtest.Do(func() {
-		f, err := os.CreateTemp("", "runtest-*.exe") // named exe for Windows, but harmless elsewhere
-		if err != nil {
-			runtest.err = err
-			return
-		}
-		f.Close()
-
-		runtest.exe = f.Name()
-		xatexit(func() {
-			os.Remove(runtest.exe)
-		})
-
-		cmd := t.dirCmd("test", "go", "build", "-o", runtest.exe, "run.go")
-		setEnv(cmd, "GOOS", gohostos)
-		setEnv(cmd, "GOARCH", gohostarch)
-		runtest.err = cmd.Run()
-	})
-	if runtest.err != nil {
-		return runtest.err
-	}
-	if t.compileOnly {
-		return nil
-	}
-	t.addCmd(dt, "test", runtest.exe,
-		fmt.Sprintf("--shard=%d", shard),
-		fmt.Sprintf("--shards=%d", shards),
-	)
-	return nil
-}
-
 // cgoPackages is the standard packages that use cgo.
 var cgoPackages = []string{
 	"net",
@@ -1702,18 +1484,8 @@
 		}
 	}
 
-	gocache := os.Getenv("GOCACHE")
-	if gocache == "" {
-		panic("GOCACHE not set")
-	}
-	gocacheSubdir, _ := filepath.Rel(dir, gocache)
-
 	filepath.WalkDir(dir, func(path string, d fs.DirEntry, err error) error {
 		if suffix := strings.TrimPrefix(path, dir+string(filepath.Separator)); suffix != "" {
-			if suffix == gocacheSubdir {
-				// Leave GOCACHE writable: we may need to write test binaries into it.
-				return filepath.SkipDir
-			}
 			if suffix == ".git" {
 				// Leave Git metadata in whatever state it was in. It may contain a lot
 				// of files, and it is highly unlikely that a test will try to modify
@@ -1771,12 +1543,102 @@
 	}
 }
 
+// buildModeSupports is a copy of the function
+// internal/platform.BuildModeSupported, which can't be used here
+// because cmd/dist can not import internal packages during bootstrap.
+func buildModeSupported(compiler, buildmode, goos, goarch string) bool {
+	if compiler == "gccgo" {
+		return true
+	}
+
+	platform := goos + "/" + goarch
+
+	switch buildmode {
+	case "archive":
+		return true
+
+	case "c-archive":
+		switch goos {
+		case "aix", "darwin", "ios", "windows":
+			return true
+		case "linux":
+			switch goarch {
+			case "386", "amd64", "arm", "armbe", "arm64", "arm64be", "loong64", "ppc64le", "riscv64", "s390x":
+				// linux/ppc64 not supported because it does
+				// not support external linking mode yet.
+				return true
+			default:
+				// Other targets do not support -shared,
+				// per ParseFlags in
+				// cmd/compile/internal/base/flag.go.
+				// For c-archive the Go tool passes -shared,
+				// so that the result is suitable for inclusion
+				// in a PIE or shared library.
+				return false
+			}
+		case "freebsd":
+			return goarch == "amd64"
+		}
+		return false
+
+	case "c-shared":
+		switch platform {
+		case "linux/amd64", "linux/arm", "linux/arm64", "linux/loong64", "linux/386", "linux/ppc64le", "linux/riscv64", "linux/s390x",
+			"android/amd64", "android/arm", "android/arm64", "android/386",
+			"freebsd/amd64",
+			"darwin/amd64", "darwin/arm64",
+			"windows/amd64", "windows/386", "windows/arm64":
+			return true
+		}
+		return false
+
+	case "default":
+		return true
+
+	case "exe":
+		return true
+
+	case "pie":
+		switch platform {
+		case "linux/386", "linux/amd64", "linux/arm", "linux/arm64", "linux/loong64", "linux/ppc64le", "linux/riscv64", "linux/s390x",
+			"android/amd64", "android/arm", "android/arm64", "android/386",
+			"freebsd/amd64",
+			"darwin/amd64", "darwin/arm64",
+			"ios/amd64", "ios/arm64",
+			"aix/ppc64",
+			"windows/386", "windows/amd64", "windows/arm", "windows/arm64":
+			return true
+		}
+		return false
+
+	case "shared":
+		switch platform {
+		case "linux/386", "linux/amd64", "linux/arm", "linux/arm64", "linux/ppc64le", "linux/s390x":
+			return true
+		}
+		return false
+
+	case "plugin":
+		switch platform {
+		case "linux/amd64", "linux/arm", "linux/arm64", "linux/386", "linux/s390x", "linux/ppc64le",
+			"android/amd64", "android/386",
+			"darwin/amd64", "darwin/arm64",
+			"freebsd/amd64":
+			return true
+		}
+		return false
+
+	default:
+		return false
+	}
+}
+
 // isUnsupportedVMASize reports whether the failure is caused by an unsupported
 // VMA for the race detector (for example, running the race detector on an
 // arm64 machine configured with 39-bit VMA)
 func isUnsupportedVMASize(w *work) bool {
 	unsupportedVMA := []byte("unsupported VMA range")
-	return w.dt.name == "race" && bytes.Contains(w.out, unsupportedVMA)
+	return w.dt.name == "race" && bytes.Contains(w.out.Bytes(), unsupportedVMA)
 }
 
 // isEnvSet reports whether the environment variable evar is
diff --git a/src/cmd/dist/testjson.go b/src/cmd/dist/testjson.go
new file mode 100644
index 0000000..7408f95
--- /dev/null
+++ b/src/cmd/dist/testjson.go
@@ -0,0 +1,186 @@
+// Copyright 2023 The Go Authors. 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"
+	"io"
+	"sync"
+)
+
+// lockedWriter serializes Write calls to an underlying Writer.
+type lockedWriter struct {
+	lock sync.Mutex
+	w    io.Writer
+}
+
+func (w *lockedWriter) Write(b []byte) (int, error) {
+	w.lock.Lock()
+	defer w.lock.Unlock()
+	return w.w.Write(b)
+}
+
+// testJSONFilter is an io.Writer filter that replaces the Package field in
+// test2json output.
+type testJSONFilter struct {
+	w       io.Writer // Underlying writer
+	variant string    // Add ":variant" to Package field
+
+	lineBuf bytes.Buffer // Buffer for incomplete lines
+}
+
+func (f *testJSONFilter) Write(b []byte) (int, error) {
+	bn := len(b)
+
+	// Process complete lines, and buffer any incomplete lines.
+	for len(b) > 0 {
+		nl := bytes.IndexByte(b, '\n')
+		if nl < 0 {
+			f.lineBuf.Write(b)
+			break
+		}
+		var line []byte
+		if f.lineBuf.Len() > 0 {
+			// We have buffered data. Add the rest of the line from b and
+			// process the complete line.
+			f.lineBuf.Write(b[:nl+1])
+			line = f.lineBuf.Bytes()
+		} else {
+			// Process a complete line from b.
+			line = b[:nl+1]
+		}
+		b = b[nl+1:]
+		f.process(line)
+		f.lineBuf.Reset()
+	}
+
+	return bn, nil
+}
+
+func (f *testJSONFilter) Flush() {
+	// Write any remaining partial line to the underlying writer.
+	if f.lineBuf.Len() > 0 {
+		f.w.Write(f.lineBuf.Bytes())
+		f.lineBuf.Reset()
+	}
+}
+
+func (f *testJSONFilter) process(line []byte) {
+	if len(line) > 0 && line[0] == '{' {
+		// Plausible test2json output. Parse it generically.
+		//
+		// We go to some effort here to preserve key order while doing this
+		// generically. This will stay robust to changes in the test2json
+		// struct, or other additions outside of it. If humans are ever looking
+		// at the output, it's really nice to keep field order because it
+		// preserves a lot of regularity in the output.
+		dec := json.NewDecoder(bytes.NewBuffer(line))
+		dec.UseNumber()
+		val, err := decodeJSONValue(dec)
+		if err == nil && val.atom == json.Delim('{') {
+			// Rewrite the Package field.
+			found := false
+			for i := 0; i < len(val.seq); i += 2 {
+				if val.seq[i].atom == "Package" {
+					if pkg, ok := val.seq[i+1].atom.(string); ok {
+						val.seq[i+1].atom = pkg + ":" + f.variant
+						found = true
+						break
+					}
+				}
+			}
+			if found {
+				data, err := json.Marshal(val)
+				if err != nil {
+					// Should never happen.
+					panic(fmt.Sprintf("failed to round-trip JSON %q: %s", string(line), err))
+				}
+				f.w.Write(data)
+				// Copy any trailing text. We expect at most a "\n" here, but
+				// there could be other text and we want to feed that through.
+				io.Copy(f.w, dec.Buffered())
+				return
+			}
+		}
+	}
+
+	// Something went wrong. Just pass the line through.
+	f.w.Write(line)
+}
+
+type jsonValue struct {
+	atom json.Token  // If json.Delim, then seq will be filled
+	seq  []jsonValue // If atom == json.Delim('{'), alternating pairs
+}
+
+var jsonPop = errors.New("end of JSON sequence")
+
+func decodeJSONValue(dec *json.Decoder) (jsonValue, error) {
+	t, err := dec.Token()
+	if err != nil {
+		if err == io.EOF {
+			err = io.ErrUnexpectedEOF
+		}
+		return jsonValue{}, err
+	}
+
+	switch t := t.(type) {
+	case json.Delim:
+		if t == '}' || t == ']' {
+			return jsonValue{}, jsonPop
+		}
+
+		var seq []jsonValue
+		for {
+			val, err := decodeJSONValue(dec)
+			if err == jsonPop {
+				break
+			} else if err != nil {
+				return jsonValue{}, err
+			}
+			seq = append(seq, val)
+		}
+		return jsonValue{t, seq}, nil
+	default:
+		return jsonValue{t, nil}, nil
+	}
+}
+
+func (v jsonValue) MarshalJSON() ([]byte, error) {
+	var buf bytes.Buffer
+	var marshal1 func(v jsonValue) error
+	marshal1 = func(v jsonValue) error {
+		if t, ok := v.atom.(json.Delim); ok {
+			buf.WriteRune(rune(t))
+			for i, v2 := range v.seq {
+				if t == '{' && i%2 == 1 {
+					buf.WriteByte(':')
+				} else if i > 0 {
+					buf.WriteByte(',')
+				}
+				if err := marshal1(v2); err != nil {
+					return err
+				}
+			}
+			if t == '{' {
+				buf.WriteByte('}')
+			} else {
+				buf.WriteByte(']')
+			}
+			return nil
+		}
+		bytes, err := json.Marshal(v.atom)
+		if err != nil {
+			return err
+		}
+		buf.Write(bytes)
+		return nil
+	}
+	err := marshal1(v)
+	return buf.Bytes(), err
+}
diff --git a/src/cmd/dist/testjson_test.go b/src/cmd/dist/testjson_test.go
new file mode 100644
index 0000000..0a52aec
--- /dev/null
+++ b/src/cmd/dist/testjson_test.go
@@ -0,0 +1,85 @@
+// Copyright 2023 The Go Authors. 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 (
+	"strings"
+	"testing"
+)
+
+func TestJSONFilterRewritePackage(t *testing.T) {
+	const in = `{"Package":"abc"}
+{"Field1":"1","Package":"abc","Field3":"3"}
+{"Package":123}
+{}
+{"Package":"abc","Unexpected":[null,true,false,99999999999999999999]}
+`
+	want := strings.ReplaceAll(in, `"Package":"abc"`, `"Package":"abc:variant"`)
+
+	checkJSONFilter(t, in, want)
+}
+
+func TestJSONFilterMalformed(t *testing.T) {
+	const in = `unexpected text
+{"Package":"abc"}
+more text
+{"Package":"abc"}trailing text
+{not json}
+no newline`
+	const want = `unexpected text
+{"Package":"abc:variant"}
+more text
+{"Package":"abc:variant"}trailing text
+{not json}
+no newline`
+	checkJSONFilter(t, in, want)
+}
+
+func TestJSONFilterBoundaries(t *testing.T) {
+	const in = `{"Package":"abc"}
+{"Package":"def"}
+{"Package":"ghi"}
+`
+	want := strings.ReplaceAll(in, `"}`, `:variant"}`)
+
+	// Write one bytes at a time.
+	t.Run("bytes", func(t *testing.T) {
+		checkJSONFilterWith(t, want, func(f *testJSONFilter) {
+			for i := 0; i < len(in); i++ {
+				f.Write([]byte{in[i]})
+			}
+		})
+	})
+	// Write a block containing a whole line bordered by two partial lines.
+	t.Run("bytes", func(t *testing.T) {
+		checkJSONFilterWith(t, want, func(f *testJSONFilter) {
+			const b1 = 5
+			const b2 = len(in) - 5
+			f.Write([]byte(in[:b1]))
+			f.Write([]byte(in[b1:b2]))
+			f.Write([]byte(in[b2:]))
+		})
+	})
+}
+
+func checkJSONFilter(t *testing.T, in, want string) {
+	t.Helper()
+	checkJSONFilterWith(t, want, func(f *testJSONFilter) {
+		f.Write([]byte(in))
+	})
+}
+
+func checkJSONFilterWith(t *testing.T, want string, write func(*testJSONFilter)) {
+	t.Helper()
+
+	out := new(strings.Builder)
+	f := &testJSONFilter{w: out, variant: "variant"}
+	write(f)
+	f.Flush()
+	got := out.String()
+	if want != got {
+		t.Errorf("want:\n%s\ngot:\n%s", want, got)
+	}
+}
diff --git a/src/cmd/dist/util.go b/src/cmd/dist/util.go
index fe36230..2eeab18 100644
--- a/src/cmd/dist/util.go
+++ b/src/cmd/dist/util.go
@@ -58,23 +58,27 @@
 
 var outputLock sync.Mutex
 
-// run runs the command line cmd in dir.
+// run is like runEnv with no additional environment.
+func run(dir string, mode int, cmd ...string) string {
+	return runEnv(dir, mode, nil, cmd...)
+}
+
+// runEnv runs the command line cmd in dir with additional environment env.
 // If mode has ShowOutput set and Background unset, run passes cmd's output to
 // stdout/stderr directly. Otherwise, run returns cmd's output as a string.
 // If mode has CheckExit set and the command fails, run calls fatalf.
 // If mode has Background set, this command is being run as a
 // Background job. Only bgrun should use the Background mode,
 // not other callers.
-func run(dir string, mode int, cmd ...string) string {
+func runEnv(dir string, mode int, env []string, cmd ...string) string {
 	if vflag > 1 {
 		errprintf("run: %s\n", strings.Join(cmd, " "))
 	}
 
-	bin := cmd[0]
-	if bin == "go" {
-		bin = gorootBinGo
+	xcmd := exec.Command(cmd[0], cmd[1:]...)
+	if env != nil {
+		xcmd.Env = append(os.Environ(), env...)
 	}
-	xcmd := exec.Command(bin, cmd[1:]...)
 	setDir(xcmd, dir)
 	var data []byte
 	var err error
@@ -369,35 +373,36 @@
 }
 
 func xgetgoarm() string {
-	if goos == "android" {
-		// Assume all android devices have VFPv3.
-		// These ports are also mostly cross-compiled, so it makes little
-		// sense to auto-detect the setting.
-		return "7"
-	}
-	if goos == "windows" {
-		// windows/arm only works with ARMv7 executables.
-		return "7"
-	}
-	if gohostarch != "arm" || goos != gohostos {
-		// Conservative default for cross-compilation.
+	// If we're building on an actual arm system, and not building
+	// a cross-compiling toolchain, try to exec ourselves
+	// to detect whether VFP is supported and set the default GOARM.
+	// Windows requires ARMv7, so we can skip the check.
+	// We've always assumed Android is ARMv7 too.
+	if gohostarch == "arm" && goarch == "arm" && goos == gohostos && goos != "windows" && goos != "android" {
+		// Try to exec ourselves in a mode to detect VFP support.
+		// Seeing how far it gets determines which instructions failed.
+		// The test is OS-agnostic.
+		out := run("", 0, os.Args[0], "-check-goarm")
+		v1ok := strings.Contains(out, "VFPv1 OK.")
+		v3ok := strings.Contains(out, "VFPv3 OK.")
+		if v1ok && v3ok {
+			return "7"
+		}
+		if v1ok {
+			return "6"
+		}
 		return "5"
 	}
 
-	// Try to exec ourselves in a mode to detect VFP support.
-	// Seeing how far it gets determines which instructions failed.
-	// The test is OS-agnostic.
-	out := run("", 0, os.Args[0], "-check-goarm")
-	v1ok := strings.Contains(out, "VFPv1 OK.")
-	v3ok := strings.Contains(out, "VFPv3 OK.")
-
-	if v1ok && v3ok {
-		return "7"
-	}
-	if v1ok {
-		return "6"
-	}
-	return "5"
+	// Otherwise, in the absence of local information, assume GOARM=7.
+	//
+	// We used to assume GOARM=5 in certain contexts but not others,
+	// which produced inconsistent results. For example if you cross-compiled
+	// for linux/arm from a windows/amd64 machine, you got GOARM=7 binaries,
+	// but if you cross-compiled for linux/arm from a linux/amd64 machine,
+	// you got GOARM=5 binaries. Now the default is independent of the
+	// host operating system, for better reproducibility of builds.
+	return "7"
 }
 
 func min(a, b int) int {
diff --git a/src/cmd/distpack/archive.go b/src/cmd/distpack/archive.go
new file mode 100644
index 0000000..24ed077
--- /dev/null
+++ b/src/cmd/distpack/archive.go
@@ -0,0 +1,211 @@
+// Copyright 2023 The Go Authors. 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/fs"
+	"log"
+	"os"
+	"path"
+	"path/filepath"
+	"sort"
+	"strings"
+	"time"
+)
+
+// An Archive describes an archive to write: a collection of files.
+// Directories are implied by the files and not explicitly listed.
+type Archive struct {
+	Files []File
+}
+
+// A File describes a single file to write to an archive.
+type File struct {
+	Name string    // name in archive
+	Time time.Time // modification time
+	Mode fs.FileMode
+	Size int64
+	Src  string // source file in OS file system
+}
+
+// Info returns a FileInfo about the file, for use with tar.FileInfoHeader
+// and zip.FileInfoHeader.
+func (f *File) Info() fs.FileInfo {
+	return fileInfo{f}
+}
+
+// A fileInfo is an implementation of fs.FileInfo describing a File.
+type fileInfo struct {
+	f *File
+}
+
+func (i fileInfo) Name() string       { return path.Base(i.f.Name) }
+func (i fileInfo) ModTime() time.Time { return i.f.Time }
+func (i fileInfo) Mode() fs.FileMode  { return i.f.Mode }
+func (i fileInfo) IsDir() bool        { return i.f.Mode&fs.ModeDir != 0 }
+func (i fileInfo) Size() int64        { return i.f.Size }
+func (i fileInfo) Sys() any           { return nil }
+
+func (i fileInfo) String() string {
+	return fs.FormatFileInfo(i)
+}
+
+// NewArchive returns a new Archive containing all the files in the directory dir.
+// The archive can be amended afterward using methods like Add and Filter.
+func NewArchive(dir string) (*Archive, error) {
+	a := new(Archive)
+	err := fs.WalkDir(os.DirFS(dir), ".", func(name string, d fs.DirEntry, err error) error {
+		if err != nil {
+			return err
+		}
+		if d.IsDir() {
+			return nil
+		}
+		info, err := d.Info()
+		if err != nil {
+			return err
+		}
+		a.Add(name, filepath.Join(dir, name), info)
+		return nil
+	})
+	if err != nil {
+		return nil, err
+	}
+	a.Sort()
+	return a, nil
+}
+
+// Add adds a file with the given name and info to the archive.
+// The content of the file comes from the operating system file src.
+// After a sequence of one or more calls to Add,
+// the caller should invoke Sort to re-sort the archive's files.
+func (a *Archive) Add(name, src string, info fs.FileInfo) {
+	a.Files = append(a.Files, File{
+		Name: name,
+		Time: info.ModTime(),
+		Mode: info.Mode(),
+		Size: info.Size(),
+		Src:  src,
+	})
+}
+
+// Sort sorts the files in the archive.
+// It is only necessary to call Sort after calling Add or RenameGoMod.
+// ArchiveDir returns a sorted archive, and the other methods
+// preserve the sorting of the archive.
+func (a *Archive) Sort() {
+	sort.Slice(a.Files, func(i, j int) bool {
+		return a.Files[i].Name < a.Files[j].Name
+	})
+}
+
+// Clone returns a copy of the Archive.
+// Method calls like Add and Filter invoked on the copy do not affect the original,
+// nor do calls on the original affect the copy.
+func (a *Archive) Clone() *Archive {
+	b := &Archive{
+		Files: make([]File, len(a.Files)),
+	}
+	copy(b.Files, a.Files)
+	return b
+}
+
+// AddPrefix adds a prefix to all file names in the archive.
+func (a *Archive) AddPrefix(prefix string) {
+	for i := range a.Files {
+		a.Files[i].Name = path.Join(prefix, a.Files[i].Name)
+	}
+}
+
+// Filter removes files from the archive for which keep(name) returns false.
+func (a *Archive) Filter(keep func(name string) bool) {
+	files := a.Files[:0]
+	for _, f := range a.Files {
+		if keep(f.Name) {
+			files = append(files, f)
+		}
+	}
+	a.Files = files
+}
+
+// SetMode changes the mode of every file in the archive
+// to be mode(name, m), where m is the file's current mode.
+func (a *Archive) SetMode(mode func(name string, m fs.FileMode) fs.FileMode) {
+	for i := range a.Files {
+		a.Files[i].Mode = mode(a.Files[i].Name, a.Files[i].Mode)
+	}
+}
+
+// Remove removes files matching any of the patterns from the archive.
+// The patterns use the syntax of path.Match, with an extension of allowing
+// a leading **/ or trailing /**, which match any number of path elements
+// (including no path elements) before or after the main match.
+func (a *Archive) Remove(patterns ...string) {
+	a.Filter(func(name string) bool {
+		for _, pattern := range patterns {
+			match, err := amatch(pattern, name)
+			if err != nil {
+				log.Fatalf("archive remove: %v", err)
+			}
+			if match {
+				return false
+			}
+		}
+		return true
+	})
+}
+
+// SetTime sets the modification time of all files in the archive to t.
+func (a *Archive) SetTime(t time.Time) {
+	for i := range a.Files {
+		a.Files[i].Time = t
+	}
+}
+
+// RenameGoMod renames the go.mod files in the archive to _go.mod,
+// for use with the module form, which cannot contain other go.mod files.
+func (a *Archive) RenameGoMod() {
+	for i, f := range a.Files {
+		if strings.HasSuffix(f.Name, "/go.mod") {
+			a.Files[i].Name = strings.TrimSuffix(f.Name, "go.mod") + "_go.mod"
+		}
+	}
+}
+
+func amatch(pattern, name string) (bool, error) {
+	// firstN returns the prefix of name corresponding to the first n path elements.
+	// If n <= 0, firstN returns the entire name.
+	firstN := func(name string, n int) string {
+		for i := 0; i < len(name); i++ {
+			if name[i] == '/' {
+				if n--; n == 0 {
+					return name[:i]
+				}
+			}
+		}
+		return name
+	}
+
+	// lastN returns the suffix of name corresponding to the last n path elements.
+	// If n <= 0, lastN returns the entire name.
+	lastN := func(name string, n int) string {
+		for i := len(name) - 1; i >= 0; i-- {
+			if name[i] == '/' {
+				if n--; n == 0 {
+					return name[i+1:]
+				}
+			}
+		}
+		return name
+	}
+
+	if p, ok := strings.CutPrefix(pattern, "**/"); ok {
+		return path.Match(p, lastN(name, 1+strings.Count(p, "/")))
+	}
+	if p, ok := strings.CutSuffix(pattern, "/**"); ok {
+		return path.Match(p, firstN(name, 1+strings.Count(p, "/")))
+	}
+	return path.Match(pattern, name)
+}
diff --git a/src/cmd/distpack/archive_test.go b/src/cmd/distpack/archive_test.go
new file mode 100644
index 0000000..620b970
--- /dev/null
+++ b/src/cmd/distpack/archive_test.go
@@ -0,0 +1,39 @@
+// Copyright 2023 The Go Authors. 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 amatchTests = []struct {
+	pattern string
+	name    string
+	ok      bool
+}{
+	{"a", "a", true},
+	{"a", "b", false},
+	{"a/**", "a", true},
+	{"a/**", "b", false},
+	{"a/**", "a/b", true},
+	{"a/**", "b/b", false},
+	{"a/**", "a/b/c/d/e/f", true},
+	{"a/**", "z/a/b/c/d/e/f", false},
+	{"**/a", "a", true},
+	{"**/a", "b", false},
+	{"**/a", "x/a", true},
+	{"**/a", "x/a/b", false},
+	{"**/a", "x/y/z/a", true},
+	{"**/a", "x/y/z/a/b", false},
+
+	{"go/pkg/tool/*/compile", "go/pkg/tool/darwin_amd64/compile", true},
+}
+
+func TestAmatch(t *testing.T) {
+	for _, tt := range amatchTests {
+		ok, err := amatch(tt.pattern, tt.name)
+		if ok != tt.ok || err != nil {
+			t.Errorf("amatch(%q, %q) = %v, %v, want %v, nil", tt.pattern, tt.name, ok, err, tt.ok)
+		}
+	}
+}
diff --git a/src/cmd/distpack/pack.go b/src/cmd/distpack/pack.go
new file mode 100644
index 0000000..cf507ed
--- /dev/null
+++ b/src/cmd/distpack/pack.go
@@ -0,0 +1,434 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Distpack creates the tgz and zip files for a Go distribution.
+// It writes into GOROOT/pkg/distpack:
+//
+//   - a binary distribution (tgz or zip) for the current GOOS and GOARCH
+//   - a source distribution that is independent of GOOS/GOARCH
+//   - the module mod, info, and zip files for a distribution in module form
+//     (as used by GOTOOLCHAIN support in the go command).
+//
+// Distpack is typically invoked by the -distpack flag to make.bash.
+// A cross-compiled distribution for goos/goarch can be built using:
+//
+//	GOOS=goos GOARCH=goarch ./make.bash -distpack
+//
+// To test that the module downloads are usable with the go command:
+//
+//	./make.bash -distpack
+//	mkdir -p /tmp/goproxy/golang.org/toolchain/
+//	ln -sf $(pwd)/../pkg/distpack /tmp/goproxy/golang.org/toolchain/@v
+//	GOPROXY=file:///tmp/goproxy GOTOOLCHAIN=$(sed 1q ../VERSION) gotip version
+//
+// gotip can be replaced with an older released Go version once there is one.
+// It just can't be the one make.bash built, because it knows it is already that
+// version and will skip the download.
+package main
+
+import (
+	"archive/tar"
+	"archive/zip"
+	"compress/flate"
+	"compress/gzip"
+	"crypto/sha256"
+	"flag"
+	"fmt"
+	"io"
+	"io/fs"
+	"log"
+	"os"
+	"path"
+	"path/filepath"
+	"runtime"
+	"strings"
+	"time"
+)
+
+func usage() {
+	fmt.Fprintf(os.Stderr, "usage: distpack\n")
+	os.Exit(2)
+}
+
+const (
+	modPath          = "golang.org/toolchain"
+	modVersionPrefix = "v0.0.1"
+)
+
+var (
+	goroot     string
+	gohostos   string
+	gohostarch string
+	goos       string
+	goarch     string
+)
+
+func main() {
+	log.SetPrefix("distpack: ")
+	log.SetFlags(0)
+	flag.Usage = usage
+	flag.Parse()
+	if flag.NArg() != 0 {
+		usage()
+	}
+
+	// Load context.
+	goroot = runtime.GOROOT()
+	if goroot == "" {
+		log.Fatalf("missing $GOROOT")
+	}
+	gohostos = runtime.GOOS
+	gohostarch = runtime.GOARCH
+	goos = os.Getenv("GOOS")
+	if goos == "" {
+		goos = gohostos
+	}
+	goarch = os.Getenv("GOARCH")
+	if goarch == "" {
+		goarch = gohostarch
+	}
+	goosUnderGoarch := goos + "_" + goarch
+	goosDashGoarch := goos + "-" + goarch
+	exe := ""
+	if goos == "windows" {
+		exe = ".exe"
+	}
+	version, versionTime := readVERSION(goroot)
+
+	// Start with files from GOROOT, filtering out non-distribution files.
+	base, err := NewArchive(goroot)
+	if err != nil {
+		log.Fatal(err)
+	}
+	base.SetTime(versionTime)
+	base.SetMode(mode)
+	base.Remove(
+		".git/**",
+		".gitattributes",
+		".github/**",
+		".gitignore",
+		"VERSION.cache",
+		"misc/cgo/*/_obj/**",
+		"**/.DS_Store",
+		"**/*.exe~", // go.dev/issue/23894
+		// Generated during make.bat/make.bash.
+		"src/cmd/dist/dist",
+		"src/cmd/dist/dist.exe",
+	)
+
+	// The source distribution removes files generated during the release build.
+	// See ../dist/build.go's deptab.
+	srcArch := base.Clone()
+	srcArch.Remove(
+		"bin/**",
+		"pkg/**",
+
+		// Generated during cmd/dist. See ../dist/build.go:/gentab.
+		"src/cmd/go/internal/cfg/zdefaultcc.go",
+		"src/go/build/zcgo.go",
+		"src/runtime/internal/sys/zversion.go",
+		"src/time/tzdata/zzipdata.go",
+
+		// Generated during cmd/dist by bootstrapBuildTools.
+		"src/cmd/cgo/zdefaultcc.go",
+		"src/cmd/internal/objabi/zbootstrap.go",
+		"src/internal/buildcfg/zbootstrap.go",
+
+		// Generated by earlier versions of cmd/dist .
+		"src/cmd/go/internal/cfg/zosarch.go",
+	)
+	srcArch.AddPrefix("go")
+	testSrc(srcArch)
+
+	// The binary distribution includes only a subset of bin and pkg.
+	binArch := base.Clone()
+	binArch.Filter(func(name string) bool {
+		// Discard bin/ for now, will add back later.
+		if strings.HasPrefix(name, "bin/") {
+			return false
+		}
+		// Discard most of pkg.
+		if strings.HasPrefix(name, "pkg/") {
+			// Keep pkg/include.
+			if strings.HasPrefix(name, "pkg/include/") {
+				return true
+			}
+			// Discard other pkg except pkg/tool.
+			if !strings.HasPrefix(name, "pkg/tool/") {
+				return false
+			}
+			// Inside pkg/tool, keep only $GOOS_$GOARCH.
+			if !strings.HasPrefix(name, "pkg/tool/"+goosUnderGoarch+"/") {
+				return false
+			}
+			// Inside pkg/tool/$GOOS_$GOARCH, discard helper tools.
+			switch strings.TrimSuffix(path.Base(name), ".exe") {
+			case "api", "dist", "distpack", "metadata":
+				return false
+			}
+		}
+		return true
+	})
+
+	// Add go and gofmt to bin, using cross-compiled binaries
+	// if this is a cross-compiled distribution.
+	binExes := []string{
+		"go",
+		"gofmt",
+	}
+	crossBin := "bin"
+	if goos != gohostos || goarch != gohostarch {
+		crossBin = "bin/" + goosUnderGoarch
+	}
+	for _, b := range binExes {
+		name := "bin/" + b + exe
+		src := filepath.Join(goroot, crossBin, b+exe)
+		info, err := os.Stat(src)
+		if err != nil {
+			log.Fatal(err)
+		}
+		binArch.Add(name, src, info)
+	}
+	binArch.Sort()
+	binArch.SetTime(versionTime) // fix added files
+	binArch.SetMode(mode)        // fix added files
+
+	zipArch := binArch.Clone()
+	zipArch.AddPrefix("go")
+	testZip(zipArch)
+
+	// The module distribution is the binary distribution with unnecessary files removed
+	// and file names using the necessary prefix for the module.
+	modArch := binArch.Clone()
+	modArch.Remove(
+		"api/**",
+		"doc/**",
+		"misc/**",
+		"test/**",
+	)
+	modVers := modVersionPrefix + "-" + version + "." + goosDashGoarch
+	modArch.AddPrefix(modPath + "@" + modVers)
+	modArch.RenameGoMod()
+	modArch.Sort()
+	testMod(modArch)
+
+	// distpack returns the full path to name in the distpack directory.
+	distpack := func(name string) string {
+		return filepath.Join(goroot, "pkg/distpack", name)
+	}
+	if err := os.MkdirAll(filepath.Join(goroot, "pkg/distpack"), 0777); err != nil {
+		log.Fatal(err)
+	}
+
+	writeTgz(distpack(version+".src.tar.gz"), srcArch)
+
+	if goos == "windows" {
+		writeZip(distpack(version+"."+goos+"-"+goarch+".zip"), zipArch)
+	} else {
+		writeTgz(distpack(version+"."+goos+"-"+goarch+".tar.gz"), zipArch)
+	}
+
+	writeZip(distpack(modVers+".zip"), modArch)
+	writeFile(distpack(modVers+".mod"),
+		[]byte(fmt.Sprintf("module %s\n", modPath)))
+	writeFile(distpack(modVers+".info"),
+		[]byte(fmt.Sprintf("{%q:%q, %q:%q}\n",
+			"Version", modVers,
+			"Time", versionTime.Format(time.RFC3339))))
+}
+
+// mode computes the mode for the given file name.
+func mode(name string, _ fs.FileMode) fs.FileMode {
+	if strings.HasPrefix(name, "bin/") ||
+		strings.HasPrefix(name, "pkg/tool/") ||
+		strings.HasSuffix(name, ".bash") ||
+		strings.HasSuffix(name, ".sh") ||
+		strings.HasSuffix(name, ".pl") ||
+		strings.HasSuffix(name, ".rc") {
+		return 0o755
+	} else if ok, _ := amatch("**/go_?*_?*_exec", name); ok {
+		return 0o755
+	}
+	return 0o644
+}
+
+// readVERSION reads the VERSION file.
+// The first line of the file is the Go version.
+// Additional lines are 'key value' pairs setting other data.
+// The only valid key at the moment is 'time', which sets the modification time for file archives.
+func readVERSION(goroot string) (version string, t time.Time) {
+	data, err := os.ReadFile(filepath.Join(goroot, "VERSION"))
+	if err != nil {
+		log.Fatal(err)
+	}
+	version, rest, _ := strings.Cut(string(data), "\n")
+	for _, line := range strings.Split(rest, "\n") {
+		f := strings.Fields(line)
+		if len(f) == 0 {
+			continue
+		}
+		switch f[0] {
+		default:
+			log.Fatalf("VERSION: unexpected line: %s", line)
+		case "time":
+			if len(f) != 2 {
+				log.Fatalf("VERSION: unexpected time line: %s", line)
+			}
+			t, err = time.ParseInLocation(time.RFC3339, f[1], time.UTC)
+			if err != nil {
+				log.Fatalf("VERSION: bad time: %s", err)
+			}
+		}
+	}
+	return version, t
+}
+
+// writeFile writes a file with the given name and data or fatals.
+func writeFile(name string, data []byte) {
+	if err := os.WriteFile(name, data, 0666); err != nil {
+		log.Fatal(err)
+	}
+	reportHash(name)
+}
+
+// check panics if err is not nil. Otherwise it returns x.
+// It is only meant to be used in a function that has deferred
+// a function to recover appropriately from the panic.
+func check[T any](x T, err error) T {
+	check1(err)
+	return x
+}
+
+// check1 panics if err is not nil.
+// It is only meant to be used in a function that has deferred
+// a function to recover appropriately from the panic.
+func check1(err error) {
+	if err != nil {
+		panic(err)
+	}
+}
+
+// writeTgz writes the archive in tgz form to the file named name.
+func writeTgz(name string, a *Archive) {
+	out, err := os.Create(name)
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	var f File
+	defer func() {
+		if err := recover(); err != nil {
+			extra := ""
+			if f.Name != "" {
+				extra = " " + f.Name
+			}
+			log.Fatalf("writing %s%s: %v", name, extra, err)
+		}
+	}()
+
+	zw := check(gzip.NewWriterLevel(out, gzip.BestCompression))
+	tw := tar.NewWriter(zw)
+
+	// Find the mode and mtime to use for directory entries,
+	// based on the mode and mtime of the first file we see.
+	// We know that modes and mtimes are uniform across the archive.
+	var dirMode fs.FileMode
+	var mtime time.Time
+	for _, f := range a.Files {
+		dirMode = fs.ModeDir | f.Mode | (f.Mode&0444)>>2 // copy r bits down to x bits
+		mtime = f.Time
+		break
+	}
+
+	// mkdirAll ensures that the tar file contains directory
+	// entries for dir and all its parents. Some programs reading
+	// these tar files expect that. See go.dev/issue/61862.
+	haveDir := map[string]bool{".": true}
+	var mkdirAll func(string)
+	mkdirAll = func(dir string) {
+		if dir == "/" {
+			panic("mkdirAll /")
+		}
+		if haveDir[dir] {
+			return
+		}
+		haveDir[dir] = true
+		mkdirAll(path.Dir(dir))
+		df := &File{
+			Name: dir + "/",
+			Time: mtime,
+			Mode: dirMode,
+		}
+		h := check(tar.FileInfoHeader(df.Info(), ""))
+		h.Name = dir + "/"
+		if err := tw.WriteHeader(h); err != nil {
+			panic(err)
+		}
+	}
+
+	for _, f = range a.Files {
+		h := check(tar.FileInfoHeader(f.Info(), ""))
+		mkdirAll(path.Dir(f.Name))
+		h.Name = f.Name
+		if err := tw.WriteHeader(h); err != nil {
+			panic(err)
+		}
+		r := check(os.Open(f.Src))
+		check(io.Copy(tw, r))
+		check1(r.Close())
+	}
+	f.Name = ""
+	check1(tw.Close())
+	check1(zw.Close())
+	check1(out.Close())
+	reportHash(name)
+}
+
+// writeZip writes the archive in zip form to the file named name.
+func writeZip(name string, a *Archive) {
+	out, err := os.Create(name)
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	var f File
+	defer func() {
+		if err := recover(); err != nil {
+			extra := ""
+			if f.Name != "" {
+				extra = " " + f.Name
+			}
+			log.Fatalf("writing %s%s: %v", name, extra, err)
+		}
+	}()
+
+	zw := zip.NewWriter(out)
+	zw.RegisterCompressor(zip.Deflate, func(out io.Writer) (io.WriteCloser, error) {
+		return flate.NewWriter(out, flate.BestCompression)
+	})
+	for _, f = range a.Files {
+		h := check(zip.FileInfoHeader(f.Info()))
+		h.Name = f.Name
+		h.Method = zip.Deflate
+		w := check(zw.CreateHeader(h))
+		r := check(os.Open(f.Src))
+		check(io.Copy(w, r))
+		check1(r.Close())
+	}
+	f.Name = ""
+	check1(zw.Close())
+	check1(out.Close())
+	reportHash(name)
+}
+
+func reportHash(name string) {
+	f, err := os.Open(name)
+	if err != nil {
+		log.Fatal(err)
+	}
+	h := sha256.New()
+	io.Copy(h, f)
+	f.Close()
+	fmt.Printf("distpack: %x %s\n", h.Sum(nil)[:8], filepath.Base(name))
+}
diff --git a/src/cmd/distpack/test.go b/src/cmd/distpack/test.go
new file mode 100644
index 0000000..4544d72
--- /dev/null
+++ b/src/cmd/distpack/test.go
@@ -0,0 +1,170 @@
+// Copyright 2023 The Go 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 applied to the archives before they are written.
+
+package main
+
+import (
+	"bytes"
+	"fmt"
+	"log"
+	"os"
+	"path"
+	"path/filepath"
+	"strings"
+)
+
+type testRule struct {
+	name    string
+	goos    string
+	exclude bool
+}
+
+var srcRules = []testRule{
+	{name: "go/VERSION"},
+	{name: "go/src/cmd/go/main.go"},
+	{name: "go/src/bytes/bytes.go"},
+	{name: "go/.DS_Store", exclude: true},
+	{name: "go/.git", exclude: true},
+	{name: "go/.gitattributes", exclude: true},
+	{name: "go/.github", exclude: true},
+	{name: "go/VERSION.cache", exclude: true},
+	{name: "go/bin/**", exclude: true},
+	{name: "go/pkg/**", exclude: true},
+	{name: "go/src/cmd/dist/dist", exclude: true},
+	{name: "go/src/cmd/dist/dist.exe", exclude: true},
+	{name: "go/src/runtime/internal/sys/zversion.go", exclude: true},
+	{name: "go/src/time/tzdata/zzipdata.go", exclude: true},
+}
+
+var zipRules = []testRule{
+	{name: "go/VERSION"},
+	{name: "go/src/cmd/go/main.go"},
+	{name: "go/src/bytes/bytes.go"},
+
+	{name: "go/.DS_Store", exclude: true},
+	{name: "go/.git", exclude: true},
+	{name: "go/.gitattributes", exclude: true},
+	{name: "go/.github", exclude: true},
+	{name: "go/VERSION.cache", exclude: true},
+	{name: "go/bin", exclude: true},
+	{name: "go/pkg", exclude: true},
+	{name: "go/src/cmd/dist/dist", exclude: true},
+	{name: "go/src/cmd/dist/dist.exe", exclude: true},
+
+	{name: "go/bin/go", goos: "linux"},
+	{name: "go/bin/go", goos: "darwin"},
+	{name: "go/bin/go", goos: "windows", exclude: true},
+	{name: "go/bin/go.exe", goos: "windows"},
+	{name: "go/bin/gofmt", goos: "linux"},
+	{name: "go/bin/gofmt", goos: "darwin"},
+	{name: "go/bin/gofmt", goos: "windows", exclude: true},
+	{name: "go/bin/gofmt.exe", goos: "windows"},
+	{name: "go/pkg/tool/*/compile", goos: "linux"},
+	{name: "go/pkg/tool/*/compile", goos: "darwin"},
+	{name: "go/pkg/tool/*/compile", goos: "windows", exclude: true},
+	{name: "go/pkg/tool/*/compile.exe", goos: "windows"},
+}
+
+var modRules = []testRule{
+	{name: "golang.org/toolchain@*/VERSION"},
+	{name: "golang.org/toolchain@*/src/cmd/go/main.go"},
+	{name: "golang.org/toolchain@*/src/bytes/bytes.go"},
+
+	{name: "golang.org/toolchain@*/.DS_Store", exclude: true},
+	{name: "golang.org/toolchain@*/.git", exclude: true},
+	{name: "golang.org/toolchain@*/.gitattributes", exclude: true},
+	{name: "golang.org/toolchain@*/.github", exclude: true},
+	{name: "golang.org/toolchain@*/VERSION.cache", exclude: true},
+	{name: "golang.org/toolchain@*/bin", exclude: true},
+	{name: "golang.org/toolchain@*/pkg", exclude: true},
+	{name: "golang.org/toolchain@*/src/cmd/dist/dist", exclude: true},
+	{name: "golang.org/toolchain@*/src/cmd/dist/dist.exe", exclude: true},
+
+	{name: "golang.org/toolchain@*/bin/go", goos: "linux"},
+	{name: "golang.org/toolchain@*/bin/go", goos: "darwin"},
+	{name: "golang.org/toolchain@*/bin/go", goos: "windows", exclude: true},
+	{name: "golang.org/toolchain@*/bin/go.exe", goos: "windows"},
+	{name: "golang.org/toolchain@*/bin/gofmt", goos: "linux"},
+	{name: "golang.org/toolchain@*/bin/gofmt", goos: "darwin"},
+	{name: "golang.org/toolchain@*/bin/gofmt", goos: "windows", exclude: true},
+	{name: "golang.org/toolchain@*/bin/gofmt.exe", goos: "windows"},
+	{name: "golang.org/toolchain@*/pkg/tool/*/compile", goos: "linux"},
+	{name: "golang.org/toolchain@*/pkg/tool/*/compile", goos: "darwin"},
+	{name: "golang.org/toolchain@*/pkg/tool/*/compile", goos: "windows", exclude: true},
+	{name: "golang.org/toolchain@*/pkg/tool/*/compile.exe", goos: "windows"},
+
+	// go.mod are renamed to _go.mod.
+	{name: "**/go.mod", exclude: true},
+	{name: "**/_go.mod"},
+}
+
+func testSrc(a *Archive) {
+	test("source", a, srcRules)
+
+	// Check that no generated files slip in, even if new ones are added.
+	for _, f := range a.Files {
+		if strings.HasPrefix(path.Base(f.Name), "z") {
+			data, err := os.ReadFile(filepath.Join(goroot, strings.TrimPrefix(f.Name, "go/")))
+			if err != nil {
+				log.Fatalf("checking source archive: %v", err)
+			}
+			if strings.Contains(string(data), "generated by go tool dist; DO NOT EDIT") {
+				log.Fatalf("unexpected source archive file: %s (generated by dist)", f.Name)
+			}
+		}
+	}
+}
+
+func testZip(a *Archive) { test("binary", a, zipRules) }
+func testMod(a *Archive) { test("module", a, modRules) }
+
+func test(kind string, a *Archive, rules []testRule) {
+	ok := true
+	have := make([]bool, len(rules))
+	for _, f := range a.Files {
+		for i, r := range rules {
+			if r.goos != "" && r.goos != goos {
+				continue
+			}
+			match, err := amatch(r.name, f.Name)
+			if err != nil {
+				log.Fatal(err)
+			}
+			if match {
+				if r.exclude {
+					ok = false
+					if !have[i] {
+						log.Printf("unexpected %s archive file: %s", kind, f.Name)
+						have[i] = true // silence future prints for excluded directory
+					}
+				} else {
+					have[i] = true
+				}
+			}
+		}
+	}
+	missing := false
+	for i, r := range rules {
+		if r.goos != "" && r.goos != goos {
+			continue
+		}
+		if !r.exclude && !have[i] {
+			missing = true
+			log.Printf("missing %s archive file: %s", kind, r.name)
+		}
+	}
+	if missing {
+		ok = false
+		var buf bytes.Buffer
+		for _, f := range a.Files {
+			fmt.Fprintf(&buf, "\n\t%s", f.Name)
+		}
+		log.Printf("archive contents: %d files%s", len(a.Files), buf.Bytes())
+	}
+	if !ok {
+		log.Fatalf("bad archive file")
+	}
+}
diff --git a/src/cmd/doc/doc_test.go b/src/cmd/doc/doc_test.go
index 6a259ae..7690a93 100644
--- a/src/cmd/doc/doc_test.go
+++ b/src/cmd/doc/doc_test.go
@@ -157,6 +157,7 @@
 			`Method`,                           // No methods.
 			`someArgument[5-8]`,                // No truncated arguments.
 			`type T1 T2`,                       // Type alias does not display as type declaration.
+			`ignore:directive`,                 // Directives should be dropped.
 		},
 	},
 	// Package dump -all
@@ -224,6 +225,7 @@
 			`func internalFunc`,
 			`unexportedField`,
 			`func \(unexportedType\)`,
+			`ignore:directive`,
 		},
 	},
 	// Package with just the package declaration. Issue 31457.
@@ -260,6 +262,7 @@
 			`Comment about block of constants`, // No comment for constant block.
 			`Comment about internal function`,  // No comment for internal function.
 			`MultiLine(String|Method|Field)`,   // No data from multi line portions.
+			`ignore:directive`,
 		},
 	},
 	// Package dump -u -all
@@ -312,7 +315,9 @@
 			`func \(unexportedType\) ExportedMethod\(\) bool`,
 			`func \(unexportedType\) unexportedMethod\(\) bool`,
 		},
-		nil,
+		[]string{
+			`ignore:directive`,
+		},
 	},
 
 	// Single constant.
@@ -831,7 +836,39 @@
     // Text after pre-formatted block\.`,
 			`ExportedField int`,
 		},
-		nil,
+		[]string{"ignore:directive"},
+	},
+	{
+		"formatted doc on entire type",
+		[]string{p, "ExportedFormattedType"},
+		[]string{
+			`type ExportedFormattedType struct`,
+			`	// Comment before exported field with formatting\.
+	//
+	// Example
+	//
+	//	a\.ExportedField = 123
+	//
+	// Text after pre-formatted block\.`,
+			`ExportedField int`,
+		},
+		[]string{"ignore:directive"},
+	},
+	{
+		"formatted doc on entire type with -all",
+		[]string{"-all", p, "ExportedFormattedType"},
+		[]string{
+			`type ExportedFormattedType struct`,
+			`	// Comment before exported field with formatting\.
+	//
+	// Example
+	//
+	//	a\.ExportedField = 123
+	//
+	// Text after pre-formatted block\.`,
+			`ExportedField int`,
+		},
+		[]string{"ignore:directive"},
 	},
 }
 
diff --git a/src/cmd/doc/pkg.go b/src/cmd/doc/pkg.go
index 4cebdc9..9779275 100644
--- a/src/cmd/doc/pkg.go
+++ b/src/cmd/doc/pkg.go
@@ -849,7 +849,7 @@
 // structs and methods from interfaces (unless the unexported flag is set or we
 // are asked to show the original source).
 func trimUnexportedElems(spec *ast.TypeSpec) {
-	if unexported || showSrc {
+	if showSrc {
 		return
 	}
 	switch typ := spec.Type.(type) {
@@ -870,6 +870,43 @@
 	trimmed := false
 	list := make([]*ast.Field, 0, len(fields.List))
 	for _, field := range fields.List {
+		// When printing fields we normally print field.Doc.
+		// Here we are going to pass the AST to go/format,
+		// which will print the comments from the AST,
+		// not field.Doc which is from go/doc.
+		// The two are similar but not identical;
+		// for example, field.Doc does not include directives.
+		// In order to consistently print field.Doc,
+		// we replace the comment in the AST with field.Doc.
+		// That will cause go/format to print what we want.
+		// See issue #56592.
+		if field.Doc != nil {
+			doc := field.Doc
+			text := doc.Text()
+
+			trailingBlankLine := len(doc.List[len(doc.List)-1].Text) == 2
+			if !trailingBlankLine {
+				// Remove trailing newline.
+				lt := len(text)
+				if lt > 0 && text[lt-1] == '\n' {
+					text = text[:lt-1]
+				}
+			}
+
+			start := doc.List[0].Slash
+			doc.List = doc.List[:0]
+			for _, line := range strings.Split(text, "\n") {
+				prefix := "// "
+				if len(line) > 0 && line[0] == '\t' {
+					prefix = "//"
+				}
+				doc.List = append(doc.List, &ast.Comment{
+					Text: prefix + line,
+				})
+			}
+			doc.List[0].Slash = start
+		}
+
 		names := field.Names
 		if len(names) == 0 {
 			// Embedded type. Use the name of the type. It must be of the form ident or
@@ -908,11 +945,13 @@
 		}
 		// Trims if any is unexported. Good enough in practice.
 		ok := true
-		for _, name := range names {
-			if !isExported(name.Name) {
-				trimmed = true
-				ok = false
-				break
+		if !unexported {
+			for _, name := range names {
+				if !isExported(name.Name) {
+					trimmed = true
+					ok = false
+					break
+				}
 			}
 		}
 		if ok {
diff --git a/src/cmd/doc/testdata/pkg.go b/src/cmd/doc/testdata/pkg.go
index a693c74..1b1b8fb 100644
--- a/src/cmd/doc/testdata/pkg.go
+++ b/src/cmd/doc/testdata/pkg.go
@@ -236,6 +236,7 @@
 	//	a.ExportedField = 123
 	//
 	// Text after pre-formatted block.
+	//ignore:directive
 	ExportedField int
 }
 
diff --git a/src/cmd/fix/main_test.go b/src/cmd/fix/main_test.go
index 2b29307..cafd116 100644
--- a/src/cmd/fix/main_test.go
+++ b/src/cmd/fix/main_test.go
@@ -14,20 +14,6 @@
 	"testing"
 )
 
-func init() {
-	// If cgo is enabled, enforce that cgo commands invoked by cmd/fix
-	// do not fail during testing.
-	if testenv.HasCGO() && testenv.HasGoBuild() {
-		// The reportCgoError hook is global, so we can't set it per-test
-		// if we want to be able to run those tests in parallel.
-		// Instead, simply set it to panic on error: the goroutine dump
-		// from the panic should help us determine which test failed.
-		reportCgoError = func(err error) {
-			panic(fmt.Sprintf("unexpected cgo error: %v", err))
-		}
-	}
-}
-
 type testCase struct {
 	Name    string
 	Fn      func(*ast.File) bool
@@ -91,6 +77,22 @@
 }
 
 func TestRewrite(t *testing.T) {
+	// If cgo is enabled, enforce that cgo commands invoked by cmd/fix
+	// do not fail during testing.
+	if testenv.HasCGO() {
+		testenv.MustHaveGoBuild(t) // Really just 'go tool cgo', but close enough.
+
+		// The reportCgoError hook is global, so we can't set it per-test
+		// if we want to be able to run those tests in parallel.
+		// Instead, simply set it to panic on error: the goroutine dump
+		// from the panic should help us determine which test failed.
+		prevReportCgoError := reportCgoError
+		reportCgoError = func(err error) {
+			panic(fmt.Sprintf("unexpected cgo error: %v", err))
+		}
+		t.Cleanup(func() { reportCgoError = prevReportCgoError })
+	}
+
 	for _, tt := range testCases {
 		tt := tt
 		t.Run(tt.Name, func(t *testing.T) {
diff --git a/src/cmd/go.mod b/src/cmd/go.mod
index d2e3949..ac8c9e4 100644
--- a/src/cmd/go.mod
+++ b/src/cmd/go.mod
@@ -1,15 +1,15 @@
 module cmd
 
-go 1.20
+go 1.21
 
 require (
 	github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26
-	golang.org/x/arch v0.1.1-0.20221116201807-1bb480fc256a
-	golang.org/x/mod v0.7.0
-	golang.org/x/sync v0.1.0
-	golang.org/x/sys v0.3.0
-	golang.org/x/term v0.2.0
-	golang.org/x/tools v0.3.1-0.20230118190848-070db2996ebe
+	golang.org/x/arch v0.4.0
+	golang.org/x/mod v0.12.0
+	golang.org/x/sync v0.3.0
+	golang.org/x/sys v0.10.0
+	golang.org/x/term v0.10.0
+	golang.org/x/tools v0.11.1-0.20230712164437-1ca21856af7b
 )
 
 require github.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2 // indirect
diff --git a/src/cmd/go.sum b/src/cmd/go.sum
index da5f720..b7245ea 100644
--- a/src/cmd/go.sum
+++ b/src/cmd/go.sum
@@ -2,15 +2,15 @@
 github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26/go.mod h1:dDKJzRmX4S37WGHujM7tX//fmj1uioxKzKxz3lo4HJo=
 github.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2 h1:rcanfLhLDA8nozr/K289V1zcntHr3V+SHlXwzz1ZI2g=
 github.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=
-golang.org/x/arch v0.1.1-0.20221116201807-1bb480fc256a h1:TpDpIG2bYSheFxm9xw8NNrBKrurU1ZJ59ZMXnpQwPLQ=
-golang.org/x/arch v0.1.1-0.20221116201807-1bb480fc256a/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
-golang.org/x/mod v0.7.0 h1:LapD9S96VoQRhi/GrNTqeBJFrUjs5UHCAtTlgwA5oZA=
-golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
-golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o=
-golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sys v0.3.0 h1:w8ZOecv6NaNa/zC8944JTU3vz4u6Lagfk4RPQxv92NQ=
-golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/term v0.2.0 h1:z85xZCsEl7bi/KwbNADeBYoOP0++7W1ipu+aGnpwzRM=
-golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc=
-golang.org/x/tools v0.3.1-0.20230118190848-070db2996ebe h1:1B2tjdkEp2f885xTfSsY+7mi5fNZHRxWciDl8Hz3EXg=
-golang.org/x/tools v0.3.1-0.20230118190848-070db2996ebe/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k=
+golang.org/x/arch v0.4.0 h1:A8WCeEWhLwPBKNbFi5Wv5UTCBx5zzubnXDlMOFAzFMc=
+golang.org/x/arch v0.4.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
+golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc=
+golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
+golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E=
+golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
+golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA=
+golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/term v0.10.0 h1:3R7pNqamzBraeqj/Tj8qt1aQ2HpmlC+Cx/qL/7hn4/c=
+golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o=
+golang.org/x/tools v0.11.1-0.20230712164437-1ca21856af7b h1:KIZCni6lCdxd4gxHx49Zp9mhckTFRbI/ZPDbR3jKu90=
+golang.org/x/tools v0.11.1-0.20230712164437-1ca21856af7b/go.mod h1:anzJrxPjNtfgiYQYirP2CPGzGLxrH2u2QBhn6Bf3qY8=
diff --git a/src/cmd/go/alldocs.go b/src/cmd/go/alldocs.go
index 84afcab..bb28756 100644
--- a/src/cmd/go/alldocs.go
+++ b/src/cmd/go/alldocs.go
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// Code generated by mkalldocs.sh; DO NOT EDIT.
-// Edit the documentation in other files and rerun mkalldocs.sh to generate this one.
+// Code generated by 'go test cmd/go -v -run=TestDocsUpToDate -fixdocs'; DO NOT EDIT.
+// Edit the documentation in other files and then execute 'go generate cmd/go' to generate this one.
 
 // Go is a tool for managing Go source code.
 //
@@ -104,6 +104,7 @@
 //		Change to dir before running the command.
 //		Any files named on the command line are interpreted after
 //		changing directories.
+//		If used, this flag must be the first one in the command line.
 //	-a
 //		force rebuilding of packages that are already up-to-date.
 //	-n
@@ -127,8 +128,17 @@
 //		Supported only on linux/amd64 or linux/arm64 and only with GCC 7 and higher
 //		or Clang/LLVM 9 and higher.
 //	-cover
-//		enable code coverage instrumentation (requires
-//		that GOEXPERIMENT=coverageredesign be set).
+//		enable code coverage instrumentation.
+//	-covermode set,count,atomic
+//		set the mode for coverage analysis.
+//		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 pattern1,pattern2,pattern3
 //		For a build that targets package 'main' (e.g. building a Go
 //		executable), apply coverage analysis to each package matching
@@ -142,7 +152,6 @@
 //		do not delete it when exiting.
 //	-x
 //		print the commands.
-//
 //	-asmflags '[pattern=]arg list'
 //		arguments to pass on each go tool asm invocation.
 //	-buildmode mode
@@ -202,9 +211,11 @@
 //		run through go run and go test respectively.
 //	-pgo file
 //		specify the file path of a profile for profile-guided optimization (PGO).
-//		Special name "auto" lets the go command select a file named
-//		"default.pgo" in the main package's directory if that file exists.
-//		Special name "off" turns off PGO.
+//		When the special name "auto" is specified, for each main package in the
+//		build, the go command selects a file named "default.pgo" in the package's
+//		directory if that file exists, and applies it to the (transitive)
+//		dependencies of the main package (other packages are not affected).
+//		Special name "off" turns off PGO. The default is "auto".
 //	-pkgdir dir
 //		install and load all packages from dir instead of the usual locations.
 //		For example, when building with a non-standard configuration,
@@ -565,6 +576,11 @@
 //		generator, containing the Go toolchain and standard library.
 //	$DOLLAR
 //		A dollar sign.
+//	$PATH
+//		The $PATH of the parent process, with $GOROOT/bin
+//		placed at the beginning. This causes generators
+//		that execute 'go' commands to use the same 'go'
+//		as the parent 'go generate' command.
 //
 // Other than variable substitution and quoted-string evaluation, no
 // special processing such as "globbing" is performed on the command
@@ -656,6 +672,14 @@
 //
 //	go get example.com/mod@none
 //
+// To upgrade the minimum required Go version to the latest released Go version:
+//
+//	go get go@latest
+//
+// To upgrade the Go toolchain to the latest patch release of the current Go toolchain:
+//
+//	go get toolchain@patch
+//
 // See https://golang.org/ref/mod#go-get for details.
 //
 // In earlier versions of Go, 'go get' was used to build and install packages.
@@ -690,6 +714,9 @@
 //
 // For more about modules, see https://golang.org/ref/mod.
 //
+// For more about using 'go get' to update the minimum Go version and
+// suggested Go toolchain, see https://go.dev/doc/toolchain.
+//
 // For more about specifying packages, see 'go help packages'.
 //
 // This text describes the behavior of get using modules to manage source
@@ -756,7 +783,8 @@
 // Setting GODEBUG=installgoroot=all restores the use of
 // $GOROOT/pkg/$GOOS_$GOARCH.
 //
-// For more about the build flags, see 'go help build'.
+// For more about build flags, see 'go help build'.
+//
 // For more about specifying packages, see 'go help packages'.
 //
 // See also: go build, go get, go clean.
@@ -784,44 +812,45 @@
 // 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?
-//	    StaleReason   string   // explanation for Stale==true
-//	    Root          string   // Go root or Go path dir containing this package
-//	    ConflictDir   string   // this directory shadows Dir in $GOPATH
-//	    BinaryOnly    bool     // binary-only package (no longer supported)
-//	    ForTest       string   // package is only for use in named test
-//	    Export        string   // file containing export data (when using -export)
-//	    BuildID       string   // build ID of the compiled package (when using -export)
-//	    Module        *Module  // info about package's containing module, if any (can be nil)
-//	    Match         []string // command-line patterns matching this package
-//	    DepOnly       bool     // package is only a dependency, not explicitly listed
+//	    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?
+//	    StaleReason    string   // explanation for Stale==true
+//	    Root           string   // Go root or Go path dir containing this package
+//	    ConflictDir    string   // this directory shadows Dir in $GOPATH
+//	    BinaryOnly     bool     // binary-only package (no longer supported)
+//	    ForTest        string   // package is only for use in named test
+//	    Export         string   // file containing export data (when using -export)
+//	    BuildID        string   // build ID of the compiled package (when using -export)
+//	    Module         *Module  // info about package's containing module, if any (can be nil)
+//	    Match          []string // command-line patterns matching this package
+//	    DepOnly        bool     // package is only a dependency, not explicitly listed
+//	    DefaultGODEBUG string  // default GODEBUG setting, for main packages
 //
 //	    // Source files
-//	    GoFiles         []string   // .go source files (excluding CgoFiles, TestGoFiles, XTestGoFiles)
-//	    CgoFiles        []string   // .go source files that import "C"
-//	    CompiledGoFiles []string   // .go files presented to compiler (when using -compiled)
-//	    IgnoredGoFiles  []string   // .go source files ignored due to build constraints
+//	    GoFiles           []string   // .go source files (excluding CgoFiles, TestGoFiles, XTestGoFiles)
+//	    CgoFiles          []string   // .go source files that import "C"
+//	    CompiledGoFiles   []string   // .go files presented to compiler (when using -compiled)
+//	    IgnoredGoFiles    []string   // .go source files ignored due to build constraints
 //	    IgnoredOtherFiles []string // non-.go source files 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
-//	    FFiles          []string   // .f, .F, .for and .f90 Fortran source files
-//	    SFiles          []string   // .s source files
-//	    SwigFiles       []string   // .swig files
-//	    SwigCXXFiles    []string   // .swigcxx files
-//	    SysoFiles       []string   // .syso object files to add to archive
-//	    TestGoFiles     []string   // _test.go files in package
-//	    XTestGoFiles    []string   // _test.go files outside package
+//	    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
+//	    FFiles            []string   // .f, .F, .for and .f90 Fortran source files
+//	    SFiles            []string   // .s source files
+//	    SwigFiles         []string   // .swig files
+//	    SwigCXXFiles      []string   // .swigcxx files
+//	    SysoFiles         []string   // .syso object files to add to archive
+//	    TestGoFiles       []string   // _test.go files in package
+//	    XTestGoFiles      []string   // _test.go files outside package
 //
 //	    // Embedded files
 //	    EmbedPatterns      []string // //go:embed patterns
@@ -879,9 +908,9 @@
 //	    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
+//	    UseAllFiles   bool     // use files regardless of //go:build lines, file names
 //	    Compiler      string   // compiler to assume when computing target paths
-//	    BuildTags     []string // build constraints to match in +build lines
+//	    BuildTags     []string // build constraints to match in //go:build lines
 //	    ToolTags      []string // toolchain-specific build constraints
 //	    ReleaseTags   []string // releases the current release is compatible with
 //	    InstallSuffix string   // suffix to use in the name of the install dir
@@ -924,6 +953,8 @@
 //
 // The -find flag causes list to identify the named packages but not
 // resolve their dependencies: the Imports and Deps lists will be empty.
+// With the -find flag, the -deps, -test and -export commands cannot be
+// used.
 //
 // The -test flag causes list to report not only the named packages
 // but also their test binaries (for packages with tests), to convey to
@@ -1199,6 +1230,8 @@
 //
 // The -go=version flag sets the expected Go language version.
 //
+// The -toolchain=name flag sets the Go toolchain to use.
+//
 // The -print flag prints the final go.mod in its text format instead of
 // writing it back to go.mod.
 //
@@ -1211,12 +1244,13 @@
 //	}
 //
 //	type GoMod struct {
-//		Module  ModPath
-//		Go      string
-//		Require []Require
-//		Exclude []Module
-//		Replace []Replace
-//		Retract []Retract
+//		Module    ModPath
+//		Go        string
+//		Toolchain string
+//		Require   []Require
+//		Exclude   []Module
+//		Replace   []Replace
+//		Retract   []Retract
 //	}
 //
 //	type ModPath struct {
@@ -1512,6 +1546,8 @@
 //
 // The -go=version flag sets the expected Go language version.
 //
+// The -toolchain=name flag sets the Go toolchain to use.
+//
 // The -print flag prints the final go.work in its text format instead of
 // writing it back to go.mod.
 //
@@ -1519,9 +1555,10 @@
 // writing it back to go.mod. The JSON output corresponds to these Go types:
 //
 //	type GoWork struct {
-//		Go      string
-//		Use     []Use
-//		Replace []Replace
+//		Go        string
+//		Toolchain string
+//		Use       []Use
+//		Replace   []Replace
 //	}
 //
 //	type Use struct {
@@ -1591,14 +1628,21 @@
 //
 // Usage:
 //
-//	go work use [-r] moddirs
+//	go work use [-r] [moddirs]
 //
 // Use provides a command-line interface for adding
 // directories, optionally recursively, to a go.work file.
 //
 // A use directive will be added to the go.work file for each argument
-// directory listed on the command line go.work file, if it exists on disk,
-// or removed from the go.work file if it does not exist on disk.
+// directory listed on the command line go.work file, if it exists,
+// or removed from the go.work file if it does not exist.
+// Use fails if any remaining use directives refer to modules that
+// do not exist.
+//
+// Use updates the go line in go.work to specify a version at least as
+// new as all the go lines in the used modules, both preexisting ones
+// and newly added ones. With no arguments, this update is the only
+// thing that go work use does.
 //
 // The -r flag searches recursively for modules in the argument
 // directories, and the use command operates as if each of the directories
@@ -1686,8 +1730,8 @@
 // and its test source files to identify significant problems. If go vet
 // finds any problems, go test reports those and does not run the test
 // binary. Only a high-confidence subset of the default go vet checks are
-// used. That subset is: 'atomic', 'bool', 'buildtags', 'errorsas',
-// 'ifaceassert', 'nilfunc', 'printf', and 'stringintconv'. You can see
+// used. That subset is: atomic, bool, buildtags, directive, errorsas,
+// ifaceassert, nilfunc, printf, and stringintconv. You can see
 // the documentation for these and other vet tests via "go doc cmd/vet".
 // To disable the running of go vet, use the -vet=off flag. To run all
 // checks, use the -vet=all flag.
@@ -1697,6 +1741,10 @@
 // error. (The go command's standard error is reserved for printing
 // errors building the tests.)
 //
+// The go command places $GOROOT/bin at the beginning of $PATH
+// in the test's environment, so that tests that execute
+// 'go' commands use the same 'go' as the parent 'go test' command.
+//
 // Go test runs in two different modes:
 //
 // The first, called local directory mode, occurs when go test is
@@ -1751,9 +1799,9 @@
 //	    the package list (if present) must appear before this flag.
 //
 //	-c
-//	    Compile the test binary to pkg.test but do not run it
+//	    Compile the test binary to pkg.test in the current directory 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.
+//	    The file name or target directory can be changed with the -o flag.
 //
 //	-exec xprog
 //	    Run the test binary using xprog. The behavior is the same as
@@ -1766,6 +1814,8 @@
 //	-o file
 //	    Compile the test binary to the named file.
 //	    The test still runs (unless -c or -i is specified).
+//	    If file ends in a slash or names an existing directory,
+//	    the test is written to pkg.test in that directory.
 //
 // 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.
@@ -1818,7 +1868,7 @@
 //
 // Usage:
 //
-//	go vet [-C dir] [-n] [-x] [-vettool prog] [build flags] [vet flags] [packages]
+//	go vet [build flags] [-vettool prog] [vet flags] [packages]
 //
 // Vet runs the Go vet command on the packages named by the import paths.
 //
@@ -1827,10 +1877,6 @@
 // For a list of checkers and their flags, see 'go tool vet help'.
 // For details of a specific checker such as 'printf', see 'go tool vet help printf'.
 //
-// The -C flag changes to dir before running the 'go vet' command.
-// The -n flag prints commands that would be executed.
-// The -x flag prints commands as they are executed.
-//
 // The -vettool=prog flag selects a different analysis tool with alternative
 // or additional checks.
 // For example, the 'shadow' analyzer can be built and run using these commands:
@@ -1839,7 +1885,7 @@
 //	go vet -vettool=$(which shadow)
 //
 // The build flags supported by go vet are those that control package resolution
-// and execution, such as -n, -x, -v, -tags, and -toolexec.
+// and execution, such as -C, -n, -x, -v, -tags, and -toolexec.
 // For more about these flags, see 'go help build'.
 //
 // See also: go fmt, go fix.
@@ -2083,9 +2129,9 @@
 // # Environment variables
 //
 // The go command and the tools it invokes consult environment variables
-// for configuration. If an environment variable is unset, the go command
-// uses a sensible default setting. To see the effective setting of the
-// variable <NAME>, run 'go env <NAME>'. To change the default setting,
+// for configuration. If an environment variable is unset or empty, the go
+// command uses a sensible default setting. To see the effective setting of
+// the variable <NAME>, run 'go env <NAME>'. To change the default setting,
 // run 'go env -w <NAME>=<VALUE>'. Defaults changed using 'go env -w'
 // are recorded in a Go environment configuration file stored in the
 // per-user configuration directory, as reported by os.UserConfigDir.
@@ -2113,7 +2159,7 @@
 //	GOMODCACHE
 //		The directory where the go command will store downloaded modules.
 //	GODEBUG
-//		Enable various debugging facilities. See 'go doc runtime'
+//		Enable various debugging facilities. See https://go.dev/doc/godebug
 //		for details.
 //	GOENV
 //		The location of the Go environment configuration file.
@@ -2137,7 +2183,7 @@
 //		The operating system for which to compile code.
 //		Examples are linux, darwin, windows, netbsd.
 //	GOPATH
-//		For more details see: 'go help gopath'.
+//		Controls where various files are stored. See: 'go help gopath'.
 //	GOPROXY
 //		URL of Go module proxy. See https://golang.org/ref/mod#environment-variables
 //		and https://golang.org/ref/mod#module-proxy for details.
@@ -2151,6 +2197,8 @@
 //	GOSUMDB
 //		The name of checksum database to use and optionally its public key and
 //		URL. See https://golang.org/ref/mod#authenticating.
+//	GOTOOLCHAIN
+//		Controls which Go toolchain is used. See https://go.dev/doc/toolchain.
 //	GOTMPDIR
 //		The directory where the go command will write
 //		temporary source files, packages, and binaries.
@@ -2547,6 +2595,8 @@
 //
 // Get never checks out or updates code stored in vendor directories.
 //
+// For more about build flags, see 'go help build'.
+//
 // For more about specifying packages, see 'go help packages'.
 //
 // For more about how 'go get' finds source code to
@@ -2796,7 +2846,7 @@
 //
 // Many commands apply to a set of packages:
 //
-//	go action [packages]
+//	go <action> [packages]
 //
 // Usually, [packages] is a list of import paths.
 //
@@ -2987,6 +3037,9 @@
 //	-failfast
 //	    Do not start new tests after the first test failure.
 //
+//	-fullpath
+//	    Show full file names in the error messages.
+//
 //	-fuzz regexp
 //	    Run the fuzz test matching the regular expression. When specified,
 //	    the command line argument must match exactly one package within the
diff --git a/src/cmd/go/go_test.go b/src/cmd/go/go_test.go
index ef22499..54249f6 100644
--- a/src/cmd/go/go_test.go
+++ b/src/cmd/go/go_test.go
@@ -19,6 +19,7 @@
 	"io"
 	"io/fs"
 	"log"
+	"math"
 	"os"
 	"os/exec"
 	"path/filepath"
@@ -29,10 +30,13 @@
 	"testing"
 	"time"
 
+	"cmd/go/internal/base"
 	"cmd/go/internal/cache"
 	"cmd/go/internal/cfg"
+	"cmd/go/internal/gover"
 	"cmd/go/internal/robustio"
 	"cmd/go/internal/search"
+	"cmd/go/internal/toolchain"
 	"cmd/go/internal/vcs"
 	"cmd/go/internal/vcweb/vcstest"
 	"cmd/go/internal/web"
@@ -52,7 +56,6 @@
 
 var (
 	canRace = false // whether we can run the race detector
-	canCgo  = false // whether we can use cgo
 	canMSan = false // whether we can run the memory sanitizer
 	canASan = false // whether we can run the address sanitizer
 )
@@ -62,6 +65,12 @@
 	cgoEnabled           string // raw value from 'go env CGO_ENABLED'
 )
 
+// netTestSem is a semaphore limiting the number of tests that may use the
+// external network in parallel. If non-nil, it contains one buffer slot per
+// test (send to acquire), with a low enough limit that the overall number of
+// connections (summed across subprocesses) stays at or below base.NetLimit.
+var netTestSem chan struct{}
+
 var exeSuffix string = func() string {
 	if runtime.GOOS == "windows" {
 		return ".exe"
@@ -69,14 +78,10 @@
 	return ""
 }()
 
-func tooSlow(t *testing.T) {
+func tooSlow(t *testing.T, reason string) {
 	if testing.Short() {
-		// In -short mode; skip test, except run it on the {darwin,linux,windows}/amd64 builders.
-		if testenv.Builder() != "" && runtime.GOARCH == "amd64" && (runtime.GOOS == "linux" || runtime.GOOS == "darwin" || runtime.GOOS == "windows") {
-			return
-		}
 		t.Helper()
-		t.Skip("skipping test in -short mode")
+		t.Skipf("skipping test in -short mode: %s", reason)
 	}
 }
 
@@ -104,9 +109,10 @@
 	// We set CMDGO_TEST_RUN_MAIN via os.Setenv and testScript.setup.
 	if os.Getenv("CMDGO_TEST_RUN_MAIN") != "" {
 		cfg.SetGOROOT(cfg.GOROOT, true)
-
-		if v := os.Getenv("TESTGO_VERSION"); v != "" {
-			work.RuntimeVersion = v
+		gover.TestVersion = os.Getenv("TESTGO_VERSION")
+		toolchain.TestVersionSwitch = os.Getenv("TESTGO_VERSION_SWITCH")
+		if v := os.Getenv("TESTGO_TOOLCHAIN_VERSION"); v != "" {
+			work.ToolchainVersion = v
 		}
 
 		if testGOROOT := os.Getenv("TESTGO_GOROOT"); testGOROOT != "" {
@@ -240,11 +246,6 @@
 		os.Setenv("TESTGO_GOHOSTARCH", goHostArch)
 
 		cgoEnabled = goEnv("CGO_ENABLED")
-		canCgo, err = strconv.ParseBool(cgoEnabled)
-		if err != nil {
-			fmt.Fprintf(os.Stderr, "can't parse go env CGO_ENABLED output: %q\n", strings.TrimSpace(cgoEnabled))
-			os.Exit(2)
-		}
 
 		// Duplicate the test executable into the path at testGo, for $PATH.
 		// If the OS supports symlinks, use them instead of copying bytes.
@@ -281,9 +282,9 @@
 		}
 		testGOCACHE = strings.TrimSpace(string(out))
 
-		canMSan = canCgo && platform.MSanSupported(runtime.GOOS, runtime.GOARCH)
-		canASan = canCgo && platform.ASanSupported(runtime.GOOS, runtime.GOARCH)
-		canRace = canCgo && platform.RaceDetectorSupported(runtime.GOOS, runtime.GOARCH)
+		canMSan = testenv.HasCGO() && platform.MSanSupported(runtime.GOOS, runtime.GOARCH)
+		canASan = testenv.HasCGO() && platform.ASanSupported(runtime.GOOS, runtime.GOARCH)
+		canRace = testenv.HasCGO() && platform.RaceDetectorSupported(runtime.GOOS, runtime.GOARCH)
 		// The race detector doesn't work on Alpine Linux:
 		// golang.org/issue/14481
 		// gccgo does not support the race detector.
@@ -292,6 +293,17 @@
 		}
 	}
 
+	if n, limited := base.NetLimit(); limited && n > 0 {
+		// Split the network limit into chunks, so that each parallel script can
+		// have one chunk. We want to run as many parallel scripts as possible, but
+		// also want to give each script as high a limit as possible.
+		// We arbitrarily split by sqrt(n) to try to balance those two goals.
+		netTestLimit := int(math.Sqrt(float64(n)))
+		netTestSem = make(chan struct{}, netTestLimit)
+		reducedLimit := fmt.Sprintf(",%s=%d", base.NetLimitGodebug.Name(), n/netTestLimit)
+		os.Setenv("GODEBUG", os.Getenv("GODEBUG")+reducedLimit)
+	}
+
 	// Don't let these environment variables confuse the test.
 	os.Setenv("GOENV", "off")
 	os.Unsetenv("GOFLAGS")
@@ -322,16 +334,33 @@
 
 	if !*testWork {
 		// There shouldn't be anything left in topTmpdir.
-		dirf, err := os.Open(topTmpdir)
+		var extraFiles, extraDirs []string
+		err := filepath.WalkDir(topTmpdir, func(path string, d fs.DirEntry, err error) error {
+			if err != nil {
+				return err
+			}
+			if path == topTmpdir {
+				return nil
+			}
+
+			if rel, err := filepath.Rel(topTmpdir, path); err == nil {
+				path = rel
+			}
+			if d.IsDir() {
+				extraDirs = append(extraDirs, path)
+			} else {
+				extraFiles = append(extraFiles, path)
+			}
+			return nil
+		})
 		if err != nil {
 			log.Fatal(err)
 		}
-		names, err := dirf.Readdirnames(0)
-		if err != nil {
-			log.Fatal(err)
-		}
-		if len(names) > 0 {
-			log.Fatalf("unexpected files left in tmpdir: %v", names)
+
+		if len(extraFiles) > 0 {
+			log.Fatalf("unexpected files left in tmpdir: %q", extraFiles)
+		} else if len(extraDirs) > 0 {
+			log.Fatalf("unexpected subdirectories left in tmpdir: %q", extraDirs)
 		}
 
 		removeAll(topTmpdir)
@@ -362,6 +391,7 @@
 	tempdir        string
 	ran            bool
 	inParallel     bool
+	hasNet         bool
 	stdout, stderr bytes.Buffer
 	execDir        string // dir for tg.run
 }
@@ -404,6 +434,9 @@
 	if tg.ran {
 		tg.t.Fatal("internal testsuite error: call to parallel after run")
 	}
+	if tg.hasNet {
+		tg.t.Fatal("internal testsuite error: call to parallel after acquireNet")
+	}
 	for _, e := range tg.env {
 		if strings.HasPrefix(e, "GOROOT=") || strings.HasPrefix(e, "GOPATH=") || strings.HasPrefix(e, "GOBIN=") {
 			val := e[strings.Index(e, "=")+1:]
@@ -416,6 +449,25 @@
 	tg.t.Parallel()
 }
 
+// acquireNet skips t if the network is unavailable, and otherwise acquires a
+// netTestSem token for t to be released at the end of the test.
+//
+// t.Parallel must not be called after acquireNet.
+func (tg *testgoData) acquireNet() {
+	tg.t.Helper()
+	if tg.hasNet {
+		return
+	}
+
+	testenv.MustHaveExternalNetwork(tg.t)
+	if netTestSem != nil {
+		netTestSem <- struct{}{}
+		tg.t.Cleanup(func() { <-netTestSem })
+	}
+	tg.setenv("TESTGONETWORK", "")
+	tg.hasNet = true
+}
+
 // pwd returns the current directory.
 func (tg *testgoData) pwd() string {
 	tg.t.Helper()
@@ -437,9 +489,6 @@
 // command.
 func (tg *testgoData) setenv(name, val string) {
 	tg.t.Helper()
-	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)
 }
@@ -448,7 +497,10 @@
 func (tg *testgoData) unsetenv(name string) {
 	if tg.env == nil {
 		tg.env = append([]string(nil), os.Environ()...)
-		tg.env = append(tg.env, "GO111MODULE=off")
+		tg.env = append(tg.env, "GO111MODULE=off", "TESTGONETWORK=panic")
+		if testing.Short() {
+			tg.env = append(tg.env, "TESTGOVCS=panic")
+		}
 	}
 	for i, v := range tg.env {
 		if strings.HasPrefix(v, name+"=") {
@@ -909,6 +961,7 @@
 		"src/internal/coverage/rtcov",
 		"src/internal/cpu",
 		"src/internal/goarch",
+		"src/internal/godebugs",
 		"src/internal/goexperiment",
 		"src/internal/goos",
 		"src/internal/coverage/rtcov",
@@ -1004,12 +1057,13 @@
 
 // cmd/go: custom import path checking should not apply to Go packages without import comment.
 func TestIssue10952(t *testing.T) {
-	testenv.MustHaveExternalNetwork(t)
 	testenv.MustHaveExecPath(t, "git")
 
 	tg := testgo(t)
 	defer tg.cleanup()
 	tg.parallel()
+	tg.acquireNet()
+
 	tg.tempDir("src")
 	tg.setenv("GOPATH", tg.path("."))
 	const importPath = "github.com/zombiezen/go-get-issue-10952"
@@ -1021,12 +1075,13 @@
 
 // Test git clone URL that uses SCP-like syntax and custom import path checking.
 func TestIssue11457(t *testing.T) {
-	testenv.MustHaveExternalNetwork(t)
 	testenv.MustHaveExecPath(t, "git")
 
 	tg := testgo(t)
 	defer tg.cleanup()
 	tg.parallel()
+	tg.acquireNet()
+
 	tg.tempDir("src")
 	tg.setenv("GOPATH", tg.path("."))
 	const importPath = "rsc.io/go-get-issue-11457"
@@ -1046,12 +1101,13 @@
 }
 
 func TestGetGitDefaultBranch(t *testing.T) {
-	testenv.MustHaveExternalNetwork(t)
 	testenv.MustHaveExecPath(t, "git")
 
 	tg := testgo(t)
 	defer tg.cleanup()
 	tg.parallel()
+	tg.acquireNet()
+
 	tg.tempDir("src")
 	tg.setenv("GOPATH", tg.path("."))
 
@@ -1085,7 +1141,8 @@
 
 // Issue 4104.
 func TestGoTestWithPackageListedMultipleTimes(t *testing.T) {
-	tooSlow(t)
+	tooSlow(t, "links and runs a test")
+
 	tg := testgo(t)
 	defer tg.cleanup()
 	tg.parallel()
@@ -1096,7 +1153,8 @@
 }
 
 func TestGoListHasAConsistentOrder(t *testing.T) {
-	tooSlow(t)
+	tooSlow(t, "walks all of GOROOT/src twice")
+
 	tg := testgo(t)
 	defer tg.cleanup()
 	tg.parallel()
@@ -1109,7 +1167,8 @@
 }
 
 func TestGoListStdDoesNotIncludeCommands(t *testing.T) {
-	tooSlow(t)
+	tooSlow(t, "walks all of GOROOT/src")
+
 	tg := testgo(t)
 	defer tg.cleanup()
 	tg.parallel()
@@ -1119,7 +1178,8 @@
 
 func TestGoListCmdOnlyShowsCommands(t *testing.T) {
 	skipIfGccgo(t, "gccgo does not have GOROOT")
-	tooSlow(t)
+	tooSlow(t, "walks all of GOROOT/src/cmd")
+
 	tg := testgo(t)
 	defer tg.cleanup()
 	tg.parallel()
@@ -1202,7 +1262,8 @@
 }
 
 func TestGoListCompiledCgo(t *testing.T) {
-	tooSlow(t)
+	tooSlow(t, "compiles cgo files")
+
 	tg := testgo(t)
 	defer tg.cleanup()
 	tg.parallel()
@@ -1382,12 +1443,13 @@
 }
 
 func TestDefaultGOPATHGet(t *testing.T) {
-	testenv.MustHaveExternalNetwork(t)
 	testenv.MustHaveExecPath(t, "git")
 
 	tg := testgo(t)
 	defer tg.cleanup()
 	tg.parallel()
+	tg.acquireNet()
+
 	tg.setenv("GOPATH", "")
 	tg.tempDir("home")
 	tg.setenv(homeEnvName(), tg.path("home"))
@@ -1423,7 +1485,8 @@
 
 func TestLdflagsArgumentsWithSpacesIssue3941(t *testing.T) {
 	skipIfGccgo(t, "gccgo does not support -ldflags -X")
-	tooSlow(t)
+	tooSlow(t, "compiles and links a binary")
+
 	tg := testgo(t)
 	defer tg.cleanup()
 	tg.parallel()
@@ -1440,7 +1503,8 @@
 	// Test the extremely long command line arguments that contain '\n' characters
 	// get encoded and passed correctly.
 	skipIfGccgo(t, "gccgo does not support -ldflags -X")
-	tooSlow(t)
+	tooSlow(t, "compiles and links a binary")
+
 	tg := testgo(t)
 	defer tg.cleanup()
 	tg.parallel()
@@ -1462,7 +1526,8 @@
 
 func TestGoTestDashCDashOControlsBinaryLocation(t *testing.T) {
 	skipIfGccgo(t, "gccgo has no standard packages")
-	tooSlow(t)
+	tooSlow(t, "compiles and links a test binary")
+
 	tg := testgo(t)
 	defer tg.cleanup()
 	tg.parallel()
@@ -1473,7 +1538,8 @@
 
 func TestGoTestDashOWritesBinary(t *testing.T) {
 	skipIfGccgo(t, "gccgo has no standard packages")
-	tooSlow(t)
+	tooSlow(t, "compiles and runs a test binary")
+
 	tg := testgo(t)
 	defer tg.cleanup()
 	tg.parallel()
@@ -1484,7 +1550,8 @@
 
 // Issue 4515.
 func TestInstallWithTags(t *testing.T) {
-	tooSlow(t)
+	tooSlow(t, "compiles and links binaries")
+
 	tg := testgo(t)
 	defer tg.cleanup()
 	tg.parallel()
@@ -1536,9 +1603,7 @@
 }
 
 func TestCgoShowsFullPathNames(t *testing.T) {
-	if !canCgo {
-		t.Skip("skipping because cgo not enabled")
-	}
+	testenv.MustHaveCGO(t)
 
 	tg := testgo(t)
 	defer tg.cleanup()
@@ -1553,10 +1618,8 @@
 }
 
 func TestCgoHandlesWlORIGIN(t *testing.T) {
-	tooSlow(t)
-	if !canCgo {
-		t.Skip("skipping because cgo not enabled")
-	}
+	tooSlow(t, "compiles cgo files")
+	testenv.MustHaveCGO(t)
 
 	tg := testgo(t)
 	defer tg.cleanup()
@@ -1571,10 +1634,9 @@
 }
 
 func TestCgoPkgConfig(t *testing.T) {
-	tooSlow(t)
-	if !canCgo {
-		t.Skip("skipping because cgo not enabled")
-	}
+	tooSlow(t, "compiles cgo files")
+	testenv.MustHaveCGO(t)
+
 	tg := testgo(t)
 	defer tg.cleanup()
 	tg.parallel()
@@ -1616,6 +1678,22 @@
 `)
 	tg.setenv("PKG_CONFIG_PATH", tg.path("."))
 	tg.run("run", tg.path("foo.go"))
+
+	// test for ldflags
+	tg.tempFile("bar.pc", `
+Name: bar
+Description: The bar library
+Version: 1.0.0
+Libs: -Wl,-rpath=/path\ with\ spaces/bin
+`)
+	tg.tempFile("bar.go", `package main
+/*
+#cgo pkg-config: bar
+*/
+import "C"
+func main() {}
+`)
+	tg.run("run", tg.path("bar.go"))
 }
 
 func TestListTemplateContextFunction(t *testing.T) {
@@ -1656,7 +1734,7 @@
 // accessed by a non-local import (found in a GOPATH/GOROOT).
 // See golang.org/issue/17475.
 func TestImportLocal(t *testing.T) {
-	tooSlow(t)
+	tooSlow(t, "builds a lot of sequential packages")
 
 	tg := testgo(t)
 	tg.parallel()
@@ -1808,13 +1886,11 @@
 
 func TestGoInstallPkgdir(t *testing.T) {
 	skipIfGccgo(t, "gccgo has no standard packages")
-	if !canCgo {
-		// Only the stdlib packages that use cgo have install
-		// targets, (we're using net below) so cgo is required
-		// for the install.
-		t.Skip("skipping because cgo not enabled")
-	}
-	tooSlow(t)
+	tooSlow(t, "builds a package with cgo dependencies")
+	// Only the stdlib packages that use cgo have install
+	// targets, (we're using net below) so cgo is required
+	// for the install.
+	testenv.MustHaveCGO(t)
 
 	tg := testgo(t)
 	tg.parallel()
@@ -1829,7 +1905,8 @@
 
 // For issue 14337.
 func TestParallelTest(t *testing.T) {
-	tooSlow(t)
+	tooSlow(t, "links and runs test binaries")
+
 	tg := testgo(t)
 	tg.parallel()
 	defer tg.cleanup()
@@ -1849,7 +1926,7 @@
 }
 
 func TestBinaryOnlyPackages(t *testing.T) {
-	tooSlow(t)
+	tooSlow(t, "compiles several packages sequentially")
 
 	tg := testgo(t)
 	defer tg.cleanup()
@@ -2023,9 +2100,7 @@
 
 // Issue 18975.
 func TestFFLAGS(t *testing.T) {
-	if !canCgo {
-		t.Skip("skipping because cgo not enabled")
-	}
+	testenv.MustHaveCGO(t)
 
 	tg := testgo(t)
 	defer tg.cleanup()
@@ -2051,13 +2126,11 @@
 // This is really a cmd/link issue but this is a convenient place to test it.
 func TestDuplicateGlobalAsmSymbols(t *testing.T) {
 	skipIfGccgo(t, "gccgo does not use cmd/asm")
-	tooSlow(t)
+	tooSlow(t, "links a binary with cgo dependencies")
 	if runtime.GOARCH != "386" && runtime.GOARCH != "amd64" {
 		t.Skipf("skipping test on %s", runtime.GOARCH)
 	}
-	if !canCgo {
-		t.Skip("skipping because cgo not enabled")
-	}
+	testenv.MustHaveCGO(t)
 
 	tg := testgo(t)
 	defer tg.cleanup()
@@ -2120,25 +2193,16 @@
 	tg.parallel()
 	tg.tempFile("goversion.go", `package main; func main() {}`)
 	path := tg.path("goversion.go")
-	tg.setenv("TESTGO_VERSION", "go1.testgo")
+	tg.setenv("TESTGO_TOOLCHAIN_VERSION", "go1.testgo")
 	tg.runFail("run", path)
 	tg.grepStderr("compile", "does not match go tool version")
 }
 
 func TestBuildmodePIE(t *testing.T) {
-	if testing.Short() && testenv.Builder() == "" {
-		t.Skipf("skipping in -short mode on non-builder")
-	}
+	tooSlow(t, "links binaries")
 
-	platform := fmt.Sprintf("%s/%s", runtime.GOOS, runtime.GOARCH)
-	switch platform {
-	case "linux/386", "linux/amd64", "linux/arm", "linux/arm64", "linux/ppc64le", "linux/riscv64", "linux/s390x",
-		"android/amd64", "android/arm", "android/arm64", "android/386",
-		"freebsd/amd64",
-		"windows/386", "windows/amd64", "windows/arm", "windows/arm64":
-	case "darwin/amd64":
-	default:
-		t.Skipf("skipping test because buildmode=pie is not supported on %s", platform)
+	if !platform.BuildModeSupported(runtime.Compiler, "pie", runtime.GOOS, runtime.GOARCH) {
+		t.Skipf("skipping test because buildmode=pie is not supported on %s/%s", runtime.GOOS, runtime.GOARCH)
 	}
 	// Skip on alpine until https://go.dev/issues/54354 resolved.
 	if strings.HasSuffix(testenv.Builder(), "-alpine") {
@@ -2147,33 +2211,25 @@
 	t.Run("non-cgo", func(t *testing.T) {
 		testBuildmodePIE(t, false, true)
 	})
-	if canCgo {
-		switch runtime.GOOS {
-		case "darwin", "freebsd", "linux", "windows":
-			t.Run("cgo", func(t *testing.T) {
-				testBuildmodePIE(t, true, true)
-			})
-		}
-	}
+	t.Run("cgo", func(t *testing.T) {
+		testenv.MustHaveCGO(t)
+		testBuildmodePIE(t, true, true)
+	})
 }
 
 func TestWindowsDefaultBuildmodIsPIE(t *testing.T) {
-	if testing.Short() && testenv.Builder() == "" {
-		t.Skipf("skipping in -short mode on non-builder")
-	}
-
 	if runtime.GOOS != "windows" {
 		t.Skip("skipping windows only test")
 	}
+	tooSlow(t, "links binaries")
 
 	t.Run("non-cgo", func(t *testing.T) {
 		testBuildmodePIE(t, false, false)
 	})
-	if canCgo {
-		t.Run("cgo", func(t *testing.T) {
-			testBuildmodePIE(t, true, false)
-		})
-	}
+	t.Run("cgo", func(t *testing.T) {
+		testenv.MustHaveCGO(t)
+		testBuildmodePIE(t, true, false)
+	})
 }
 
 func testBuildmodePIE(t *testing.T, useCgo, setBuildmodeToPIE bool) {
@@ -2205,7 +2261,7 @@
 		if f.Type != elf.ET_DYN {
 			t.Errorf("PIE type must be ET_DYN, but %s", f.Type)
 		}
-	case "darwin":
+	case "darwin", "ios":
 		f, err := macho.Open(obj)
 		if err != nil {
 			t.Fatal(err)
@@ -2277,7 +2333,9 @@
 			}
 		}
 	default:
-		panic("unreachable")
+		// testBuildmodePIE opens object files, so it needs to understand the object
+		// file format.
+		t.Skipf("skipping test: test helper does not support %s", runtime.GOOS)
 	}
 
 	out, err := testenv.Command(t, obj).CombinedOutput()
@@ -2347,13 +2405,14 @@
 	}
 }
 
-var gocacheverify = godebug.New("gocacheverify")
+var gocacheverify = godebug.New("#gocacheverify")
 
 func TestCacheListStale(t *testing.T) {
-	tooSlow(t)
+	tooSlow(t, "links a binary")
 	if gocacheverify.Value() == "1" {
 		t.Skip("GODEBUG gocacheverify")
 	}
+
 	tg := testgo(t)
 	defer tg.cleanup()
 	tg.parallel()
@@ -2372,8 +2431,7 @@
 }
 
 func TestCacheCoverage(t *testing.T) {
-	tooSlow(t)
-
+	tooSlow(t, "links and runs a test binary with coverage enabled")
 	if gocacheverify.Value() == "1" {
 		t.Skip("GODEBUG gocacheverify")
 	}
@@ -2407,10 +2465,11 @@
 }
 
 func TestIssue22531(t *testing.T) {
-	tooSlow(t)
+	tooSlow(t, "links binaries")
 	if gocacheverify.Value() == "1" {
 		t.Skip("GODEBUG gocacheverify")
 	}
+
 	tg := testgo(t)
 	defer tg.cleanup()
 	tg.parallel()
@@ -2436,10 +2495,11 @@
 }
 
 func TestIssue22596(t *testing.T) {
-	tooSlow(t)
+	tooSlow(t, "links binaries")
 	if gocacheverify.Value() == "1" {
 		t.Skip("GODEBUG gocacheverify")
 	}
+
 	tg := testgo(t)
 	defer tg.cleanup()
 	tg.parallel()
@@ -2465,11 +2525,11 @@
 }
 
 func TestTestCache(t *testing.T) {
-	tooSlow(t)
-
+	tooSlow(t, "links and runs test binaries")
 	if gocacheverify.Value() == "1" {
 		t.Skip("GODEBUG gocacheverify")
 	}
+
 	tg := testgo(t)
 	defer tg.cleanup()
 	tg.parallel()
@@ -2572,7 +2632,8 @@
 }
 
 func TestTestVetRebuild(t *testing.T) {
-	tooSlow(t)
+	tooSlow(t, "links and runs test binaries")
+
 	tg := testgo(t)
 	defer tg.cleanup()
 	tg.parallel()
@@ -2612,7 +2673,8 @@
 }
 
 func TestInstallDeps(t *testing.T) {
-	tooSlow(t)
+	tooSlow(t, "links a binary")
+
 	tg := testgo(t)
 	defer tg.cleanup()
 	tg.parallel()
@@ -2643,7 +2705,8 @@
 
 // Issue 22986.
 func TestImportPath(t *testing.T) {
-	tooSlow(t)
+	tooSlow(t, "links and runs a test binary")
+
 	tg := testgo(t)
 	defer tg.cleanup()
 	tg.parallel()
@@ -2738,13 +2801,12 @@
 }
 
 func TestTwoPkgConfigs(t *testing.T) {
-	if !canCgo {
-		t.Skip("no cgo")
-	}
+	testenv.MustHaveCGO(t)
 	if runtime.GOOS == "windows" || runtime.GOOS == "plan9" {
 		t.Skipf("no shell scripts on %s", runtime.GOOS)
 	}
-	tooSlow(t)
+	tooSlow(t, "builds a package with cgo dependencies")
+
 	tg := testgo(t)
 	defer tg.cleanup()
 	tg.parallel()
@@ -2772,10 +2834,8 @@
 }
 
 func TestCgoCache(t *testing.T) {
-	if !canCgo {
-		t.Skip("no cgo")
-	}
-	tooSlow(t)
+	testenv.MustHaveCGO(t)
+	tooSlow(t, "builds a package with cgo dependencies")
 
 	tg := testgo(t)
 	defer tg.cleanup()
@@ -2825,10 +2885,8 @@
 // Issue 24704.
 func TestLinkerTmpDirIsDeleted(t *testing.T) {
 	skipIfGccgo(t, "gccgo does not use cmd/link")
-	if !canCgo {
-		t.Skip("skipping because cgo not enabled")
-	}
-	tooSlow(t)
+	testenv.MustHaveCGO(t)
+	tooSlow(t, "builds a package with cgo dependencies")
 
 	tg := testgo(t)
 	defer tg.cleanup()
@@ -2875,7 +2933,8 @@
 // Issue 25093.
 func TestCoverpkgTestOnly(t *testing.T) {
 	skipIfGccgo(t, "gccgo has no cover tool")
-	tooSlow(t)
+	tooSlow(t, "links and runs a test binary with coverage enabled")
+
 	tg := testgo(t)
 	defer tg.cleanup()
 	tg.parallel()
diff --git a/src/cmd/go/go_unix_test.go b/src/cmd/go/go_unix_test.go
index bab9494..d04e496 100644
--- a/src/cmd/go/go_unix_test.go
+++ b/src/cmd/go/go_unix_test.go
@@ -2,12 +2,19 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris
+//go:build unix
 
 package main_test
 
 import (
+	"bufio"
+	"context"
+	"internal/testenv"
+	"io"
 	"os"
+	"os/exec"
+	"slices"
+	"strings"
 	"syscall"
 	"testing"
 )
@@ -33,3 +40,80 @@
 		t.Fatalf("wrote x with mode=%v, wanted no 0077 bits", mode)
 	}
 }
+
+// TestTestInterrupt verifies the fix for issue #60203.
+//
+// If the whole process group for a 'go test' invocation receives
+// SIGINT (as would be sent by pressing ^C on a console),
+// it should return quickly, not deadlock.
+func TestTestInterrupt(t *testing.T) {
+	if testing.Short() {
+		t.Skipf("skipping in short mode: test executes many subprocesses")
+	}
+	// Don't run this test in parallel, for the same reason.
+
+	tg := testgo(t)
+	defer tg.cleanup()
+	tg.setenv("GOROOT", testGOROOT)
+
+	ctx, cancel := context.WithCancel(context.Background())
+	cmd := testenv.CommandContext(t, ctx, tg.goTool(), "test", "std", "-short", "-count=1")
+	cmd.Dir = tg.execDir
+
+	// Override $TMPDIR when running the tests: since we're terminating the tests
+	// with a signal they might fail to clean up some temp files, and we don't
+	// want that to cause an "unexpected files" failure at the end of the run.
+	cmd.Env = append(slices.Clip(tg.env), tempEnvName()+"="+t.TempDir())
+
+	cmd.SysProcAttr = &syscall.SysProcAttr{
+		Setpgid: true,
+	}
+	cmd.Cancel = func() error {
+		pgid := cmd.Process.Pid
+		return syscall.Kill(-pgid, syscall.SIGINT)
+	}
+
+	pipe, err := cmd.StdoutPipe()
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	t.Logf("running %v", cmd)
+	if err := cmd.Start(); err != nil {
+		t.Fatal(err)
+	}
+
+	stdout := new(strings.Builder)
+	r := bufio.NewReader(pipe)
+	line, err := r.ReadString('\n')
+	if err != nil {
+		t.Fatal(err)
+	}
+	stdout.WriteString(line)
+
+	// The output line for some test was written, so we know things are in progress.
+	//
+	// Cancel the rest of the run by sending SIGINT to the process group:
+	// it should finish up and exit with a nonzero status,
+	// not have to be killed with SIGKILL.
+	cancel()
+
+	io.Copy(stdout, r)
+	if stdout.Len() > 0 {
+		t.Logf("stdout:\n%s", stdout)
+	}
+	err = cmd.Wait()
+
+	ee, _ := err.(*exec.ExitError)
+	if ee == nil {
+		t.Fatalf("unexpectedly finished with nonzero status")
+	}
+	if len(ee.Stderr) > 0 {
+		t.Logf("stderr:\n%s", ee.Stderr)
+	}
+	if !ee.Exited() {
+		t.Fatalf("'go test' did not exit after interrupt: %v", err)
+	}
+
+	t.Logf("interrupted tests without deadlocking")
+}
diff --git a/src/cmd/go/help_test.go b/src/cmd/go/help_test.go
index 3e1d817..de3b966 100644
--- a/src/cmd/go/help_test.go
+++ b/src/cmd/go/help_test.go
@@ -5,37 +5,59 @@
 package main_test
 
 import (
-	"bytes"
+	"flag"
 	"go/format"
-	diffpkg "internal/diff"
+	"internal/diff"
+	"internal/testenv"
 	"os"
+	"strings"
 	"testing"
-
-	"cmd/go/internal/help"
-	"cmd/go/internal/modload"
 )
 
+var fixDocs = flag.Bool("fixdocs", false, "if true, update alldocs.go")
+
 func TestDocsUpToDate(t *testing.T) {
-	t.Parallel()
-
-	if !modload.Enabled() {
-		t.Skipf("help.Help in GOPATH mode is configured by main.main")
+	testenv.MustHaveGoBuild(t)
+	if !*fixDocs {
+		t.Parallel()
 	}
 
-	buf := new(bytes.Buffer)
-	// Match the command in mkalldocs.sh that generates alldocs.go.
-	help.Help(buf, []string{"documentation"})
-	internal := buf.Bytes()
-	internal, err := format.Source(internal)
+	// We run 'go help documentation' as a subprocess instead of
+	// calling help.Help directly because it may be sensitive to
+	// init-time configuration
+	cmd := testenv.Command(t, testGo, "help", "documentation")
+	// Unset GO111MODULE so that the 'go get' section matches
+	// the default 'go get' implementation.
+	cmd.Env = append(cmd.Environ(), "GO111MODULE=")
+	cmd.Stderr = new(strings.Builder)
+	out, err := cmd.Output()
 	if err != nil {
-		t.Fatalf("gofmt docs: %v", err)
+		t.Fatalf("%v: %v\n%s", cmd, err, cmd.Stderr)
 	}
-	alldocs, err := os.ReadFile("alldocs.go")
+
+	alldocs, err := format.Source(out)
 	if err != nil {
-		t.Fatalf("error reading alldocs.go: %v", err)
+		t.Fatalf("format.Source($(%v)): %v", cmd, err)
 	}
-	if !bytes.Equal(internal, alldocs) {
-		t.Errorf("alldocs.go is not up to date; run mkalldocs.sh to regenerate it\n%s",
-			diffpkg.Diff("go help documentation | gofmt", internal, "alldocs.go", alldocs))
+
+	const srcPath = `alldocs.go`
+	old, err := os.ReadFile(srcPath)
+	if err != nil {
+		t.Fatalf("error reading %s: %v", srcPath, err)
+	}
+	diff := diff.Diff(srcPath, old, "go help documentation | gofmt", alldocs)
+	if diff == nil {
+		t.Logf("%s is up to date.", srcPath)
+		return
+	}
+
+	if *fixDocs {
+		if err := os.WriteFile(srcPath, alldocs, 0666); err != nil {
+			t.Fatal(err)
+		}
+		t.Logf("wrote %d bytes to %s", len(alldocs), srcPath)
+	} else {
+		t.Logf("\n%s", diff)
+		t.Errorf("%s is stale. To update, run 'go generate cmd/go'.", srcPath)
 	}
 }
diff --git a/src/cmd/go/internal/base/base.go b/src/cmd/go/internal/base/base.go
index d4af4db..2171d13 100644
--- a/src/cmd/go/internal/base/base.go
+++ b/src/cmd/go/internal/base/base.go
@@ -13,6 +13,7 @@
 	"log"
 	"os"
 	"os/exec"
+	"reflect"
 	"strings"
 	"sync"
 
@@ -56,6 +57,20 @@
 	// Commands initialized in package main
 }
 
+// Lookup returns the subcommand with the given name, if any.
+// Otherwise it returns nil.
+//
+// Lookup ignores subcommands that have len(c.Commands) == 0 and c.Run == nil.
+// Such subcommands are only for use as arguments to "help".
+func (c *Command) Lookup(name string) *Command {
+	for _, sub := range c.Commands {
+		if sub.Name() == name && (len(c.Commands) > 0 || c.Runnable()) {
+			return sub
+		}
+	}
+	return nil
+}
+
 // hasFlag reports whether a command or any of its subcommands contain the given
 // flag.
 func hasFlag(c *Command, name string) bool {
@@ -133,6 +148,28 @@
 	}
 }
 
+func Error(err error) {
+	// We use errors.Join to return multiple errors from various routines.
+	// If we receive multiple errors joined with a basic errors.Join,
+	// handle each one separately so that they all have the leading "go: " prefix.
+	// A plain interface check is not good enough because there might be
+	// other kinds of structured errors that are logically one unit and that
+	// add other context: only handling the wrapped errors would lose
+	// that context.
+	if err != nil && reflect.TypeOf(err).String() == "*errors.joinError" {
+		for _, e := range err.(interface{ Unwrap() []error }).Unwrap() {
+			Error(e)
+		}
+		return
+	}
+	Errorf("go: %v", err)
+}
+
+func Fatal(err error) {
+	Error(err)
+	Exit()
+}
+
 var exitStatus = 0
 var exitMu sync.Mutex
 
diff --git a/src/cmd/go/internal/base/flag.go b/src/cmd/go/internal/base/flag.go
index 9d8d1c0..74e1275 100644
--- a/src/cmd/go/internal/base/flag.go
+++ b/src/cmd/go/internal/base/flag.go
@@ -6,7 +6,7 @@
 
 import (
 	"flag"
-	"os"
+	"fmt"
 
 	"cmd/go/internal/cfg"
 	"cmd/go/internal/fsys"
@@ -62,7 +62,7 @@
 func AddChdirFlag(flags *flag.FlagSet) {
 	// The usage message is never printed, but it's used in chdir_test.go
 	// to identify that the -C flag is from AddChdirFlag.
-	flags.Func("C", "AddChdirFlag", os.Chdir)
+	flags.Func("C", "AddChdirFlag", ChdirFlag)
 }
 
 // AddModFlag adds the -mod build flag to the flag set.
@@ -77,3 +77,9 @@
 	flags.StringVar(&cfg.ModFile, "modfile", "", "")
 	flags.StringVar(&fsys.OverlayFile, "overlay", "", "")
 }
+
+func ChdirFlag(s string) error {
+	// main handles -C by removing it from the command line.
+	// If we see one during flag parsing, that's an error.
+	return fmt.Errorf("-C flag must be first flag on command line")
+}
diff --git a/src/cmd/go/internal/base/limit.go b/src/cmd/go/internal/base/limit.go
new file mode 100644
index 0000000..b4160bd
--- /dev/null
+++ b/src/cmd/go/internal/base/limit.go
@@ -0,0 +1,84 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package base
+
+import (
+	"fmt"
+	"internal/godebug"
+	"runtime"
+	"strconv"
+	"sync"
+)
+
+var NetLimitGodebug = godebug.New("#cmdgonetlimit")
+
+// NetLimit returns the limit on concurrent network operations
+// configured by GODEBUG=cmdgonetlimit, if any.
+//
+// A limit of 0 (indicated by 0, true) means that network operations should not
+// be allowed.
+func NetLimit() (int, bool) {
+	netLimitOnce.Do(func() {
+		s := NetLimitGodebug.Value()
+		if s == "" {
+			return
+		}
+
+		n, err := strconv.Atoi(s)
+		if err != nil {
+			Fatalf("invalid %s: %v", NetLimitGodebug.Name(), err)
+		}
+		if n < 0 {
+			// Treat negative values as unlimited.
+			return
+		}
+		netLimitSem = make(chan struct{}, n)
+	})
+
+	return cap(netLimitSem), netLimitSem != nil
+}
+
+// AcquireNet acquires a semaphore token for a network operation.
+func AcquireNet() (release func(), err error) {
+	hasToken := false
+	if n, ok := NetLimit(); ok {
+		if n == 0 {
+			return nil, fmt.Errorf("network disabled by %v=%v", NetLimitGodebug.Name(), NetLimitGodebug.Value())
+		}
+		netLimitSem <- struct{}{}
+		hasToken = true
+	}
+
+	checker := new(netTokenChecker)
+	runtime.SetFinalizer(checker, (*netTokenChecker).panicUnreleased)
+
+	return func() {
+		if checker.released {
+			panic("internal error: net token released twice")
+		}
+		checker.released = true
+		if hasToken {
+			<-netLimitSem
+		}
+		runtime.SetFinalizer(checker, nil)
+	}, nil
+}
+
+var (
+	netLimitOnce sync.Once
+	netLimitSem  chan struct{}
+)
+
+type netTokenChecker struct {
+	released bool
+	// We want to use a finalizer to check that all acquired tokens are returned,
+	// so we arbitrarily pad the tokens with a string to defeat the runtime's
+	// “tiny allocator”.
+	unusedAvoidTinyAllocator string
+}
+
+func (c *netTokenChecker) panicUnreleased() {
+	panic("internal error: net token acquired but not released")
+}
diff --git a/src/cmd/go/internal/base/path.go b/src/cmd/go/internal/base/path.go
index ebe4f15..64f213b 100644
--- a/src/cmd/go/internal/base/path.go
+++ b/src/cmd/go/internal/base/path.go
@@ -15,14 +15,22 @@
 var cwd string
 var cwdOnce sync.Once
 
+// UncachedCwd returns the current working directory.
+// Most callers should use Cwd, which caches the result for future use.
+// UncachedCwd is appropriate to call early in program startup before flag parsing,
+// because the -C flag may change the current directory.
+func UncachedCwd() string {
+	wd, err := os.Getwd()
+	if err != nil {
+		Fatalf("cannot determine current directory: %v", err)
+	}
+	return wd
+}
+
 // Cwd returns the current working directory at the time of the first call.
 func Cwd() string {
 	cwdOnce.Do(func() {
-		var err error
-		cwd, err = os.Getwd()
-		if err != nil {
-			Fatalf("cannot determine current directory: %v", err)
-		}
+		cwd = UncachedCwd()
 	})
 	return cwd
 }
diff --git a/src/cmd/go/internal/base/signal_unix.go b/src/cmd/go/internal/base/signal_unix.go
index f198df6..0905971 100644
--- a/src/cmd/go/internal/base/signal_unix.go
+++ b/src/cmd/go/internal/base/signal_unix.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build unix || js
+//go:build unix || js || wasip1
 
 package base
 
diff --git a/src/cmd/go/internal/base/tool.go b/src/cmd/go/internal/base/tool.go
index 202e314..ab623da 100644
--- a/src/cmd/go/internal/base/tool.go
+++ b/src/cmd/go/internal/base/tool.go
@@ -11,20 +11,31 @@
 	"path/filepath"
 
 	"cmd/go/internal/cfg"
+	"cmd/go/internal/par"
 )
 
 // Tool returns the path to the named tool (for example, "vet").
 // If the tool cannot be found, Tool exits the process.
 func Tool(toolName string) string {
-	toolPath := filepath.Join(build.ToolDir, toolName) + cfg.ToolExeSuffix()
-	if len(cfg.BuildToolexec) > 0 {
-		return toolPath
-	}
-	// Give a nice message if there is no tool with that name.
-	if _, err := os.Stat(toolPath); err != nil {
+	toolPath, err := ToolPath(toolName)
+	if err != nil && len(cfg.BuildToolexec) == 0 {
+		// Give a nice message if there is no tool with that name.
 		fmt.Fprintf(os.Stderr, "go: no such tool %q\n", toolName)
 		SetExitStatus(2)
 		Exit()
 	}
 	return toolPath
 }
+
+// Tool returns the path at which we expect to find the named tool
+// (for example, "vet"), and the error (if any) from statting that path.
+func ToolPath(toolName string) (string, error) {
+	toolPath := filepath.Join(build.ToolDir, toolName) + cfg.ToolExeSuffix()
+	err := toolStatCache.Do(toolPath, func() error {
+		_, err := os.Stat(toolPath)
+		return err
+	})
+	return toolPath, err
+}
+
+var toolStatCache par.Cache[string, error]
diff --git a/src/cmd/go/internal/cache/cache.go b/src/cmd/go/internal/cache/cache.go
index c30d7c8..4a82d27 100644
--- a/src/cmd/go/internal/cache/cache.go
+++ b/src/cmd/go/internal/cache/cache.go
@@ -11,6 +11,7 @@
 	"encoding/hex"
 	"errors"
 	"fmt"
+	"internal/godebug"
 	"io"
 	"io/fs"
 	"os"
@@ -31,8 +32,50 @@
 // An OutputID is a cache output key, the hash of an output of a computation.
 type OutputID [HashSize]byte
 
+// Cache is the interface as used by the cmd/go.
+type Cache interface {
+	// Get returns the cache entry for the provided ActionID.
+	// On miss, the error type should be of type *entryNotFoundError.
+	//
+	// After a success call to Get, OutputFile(Entry.OutputID) must
+	// exist on disk for until Close is called (at the end of the process).
+	Get(ActionID) (Entry, error)
+
+	// Put adds an item to the cache.
+	//
+	// The seeker is only used to seek to the beginning. After a call to Put,
+	// the seek position is not guaranteed to be in any particular state.
+	//
+	// As a special case, if the ReadSeeker is of type noVerifyReadSeeker,
+	// the verification from GODEBUG=goverifycache=1 is skipped.
+	//
+	// After a success call to Get, OutputFile(Entry.OutputID) must
+	// exist on disk for until Close is called (at the end of the process).
+	Put(ActionID, io.ReadSeeker) (_ OutputID, size int64, _ error)
+
+	// Close is called at the end of the go process. Implementations can do
+	// cache cleanup work at this phase, or wait for and report any errors from
+	// background cleanup work started earlier. Any cache trimming should in one
+	// process should not violate cause the invariants of this interface to be
+	// violated in another process. Namely, a cache trim from one process should
+	// not delete an ObjectID from disk that was recently Get or Put from
+	// another process. As a rule of thumb, don't trim things used in the last
+	// day.
+	Close() error
+
+	// OutputFile returns the path on disk where OutputID is stored.
+	//
+	// It's only called after a successful get or put call so it doesn't need
+	// to return an error; it's assumed that if the previous get or put succeeded,
+	// it's already on disk.
+	OutputFile(OutputID) string
+
+	// FuzzDir returns where fuzz files are stored.
+	FuzzDir() string
+}
+
 // A Cache is a package cache, backed by a file system directory tree.
-type Cache struct {
+type DiskCache struct {
 	dir string
 	now func() time.Time
 }
@@ -48,7 +91,7 @@
 // to share a cache directory (for example, if the directory were stored
 // in a network file system). File locking is notoriously unreliable in
 // network file systems and may not suffice to protect the cache.
-func Open(dir string) (*Cache, error) {
+func Open(dir string) (*DiskCache, error) {
 	info, err := os.Stat(dir)
 	if err != nil {
 		return nil, err
@@ -62,7 +105,7 @@
 			return nil, err
 		}
 	}
-	c := &Cache{
+	c := &DiskCache{
 		dir: dir,
 		now: time.Now,
 	}
@@ -70,7 +113,7 @@
 }
 
 // fileName returns the name of the file corresponding to the given id.
-func (c *Cache) fileName(id [HashSize]byte, key string) string {
+func (c *DiskCache) fileName(id [HashSize]byte, key string) string {
 	return filepath.Join(c.dir, fmt.Sprintf("%02x", id[0]), fmt.Sprintf("%x", id)+"-"+key)
 }
 
@@ -115,20 +158,24 @@
 
 func init() { initEnv() }
 
+var (
+	goCacheVerify = godebug.New("gocacheverify")
+	goDebugHash   = godebug.New("gocachehash")
+	goCacheTest   = godebug.New("gocachetest")
+)
+
 func initEnv() {
-	verify = false
-	debugHash = false
-	debug := strings.Split(os.Getenv("GODEBUG"), ",")
-	for _, f := range debug {
-		if f == "gocacheverify=1" {
-			verify = true
-		}
-		if f == "gocachehash=1" {
-			debugHash = true
-		}
-		if f == "gocachetest=1" {
-			DebugTest = true
-		}
+	if goCacheVerify.Value() == "1" {
+		goCacheVerify.IncNonDefault()
+		verify = true
+	}
+	if goDebugHash.Value() == "1" {
+		goDebugHash.IncNonDefault()
+		debugHash = true
+	}
+	if goCacheTest.Value() == "1" {
+		goCacheTest.IncNonDefault()
+		DebugTest = true
 	}
 }
 
@@ -136,7 +183,7 @@
 // returning the corresponding output ID and file size, if any.
 // Note that finding an output ID does not guarantee that the
 // saved file for that output ID is still available.
-func (c *Cache) Get(id ActionID) (Entry, error) {
+func (c *DiskCache) Get(id ActionID) (Entry, error) {
 	if verify {
 		return Entry{}, &entryNotFoundError{Err: errVerifyMode}
 	}
@@ -146,11 +193,11 @@
 type Entry struct {
 	OutputID OutputID
 	Size     int64
-	Time     time.Time
+	Time     time.Time // when added to cache
 }
 
 // get is Get but does not respect verify mode, so that Put can use it.
-func (c *Cache) get(id ActionID) (Entry, error) {
+func (c *DiskCache) get(id ActionID) (Entry, error) {
 	missing := func(reason error) (Entry, error) {
 		return Entry{}, &entryNotFoundError{Err: reason}
 	}
@@ -214,7 +261,7 @@
 
 // GetFile looks up the action ID in the cache and returns
 // the name of the corresponding data file.
-func (c *Cache) GetFile(id ActionID) (file string, entry Entry, err error) {
+func GetFile(c Cache, id ActionID) (file string, entry Entry, err error) {
 	entry, err = c.Get(id)
 	if err != nil {
 		return "", Entry{}, err
@@ -233,7 +280,7 @@
 // GetBytes looks up the action ID in the cache and returns
 // the corresponding output bytes.
 // GetBytes should only be used for data that can be expected to fit in memory.
-func (c *Cache) GetBytes(id ActionID) ([]byte, Entry, error) {
+func GetBytes(c Cache, id ActionID) ([]byte, Entry, error) {
 	entry, err := c.Get(id)
 	if err != nil {
 		return nil, entry, err
@@ -248,7 +295,7 @@
 // GetMmap looks up the action ID in the cache and returns
 // the corresponding output bytes.
 // GetMmap should only be used for data that can be expected to fit in memory.
-func (c *Cache) GetMmap(id ActionID) ([]byte, Entry, error) {
+func GetMmap(c Cache, id ActionID) ([]byte, Entry, error) {
 	entry, err := c.Get(id)
 	if err != nil {
 		return nil, entry, err
@@ -264,7 +311,7 @@
 }
 
 // OutputFile returns the name of the cache file storing output with the given OutputID.
-func (c *Cache) OutputFile(out OutputID) string {
+func (c *DiskCache) OutputFile(out OutputID) string {
 	file := c.fileName(out, "d")
 	c.used(file)
 	return file
@@ -297,7 +344,7 @@
 // mtime is more than an hour old. This heuristic eliminates
 // nearly all of the mtime updates that would otherwise happen,
 // while still keeping the mtimes useful for cache trimming.
-func (c *Cache) used(file string) {
+func (c *DiskCache) used(file string) {
 	info, err := os.Stat(file)
 	if err == nil && c.now().Sub(info.ModTime()) < mtimeInterval {
 		return
@@ -305,8 +352,10 @@
 	os.Chtimes(file, c.now(), c.now())
 }
 
+func (c *DiskCache) Close() error { return c.Trim() }
+
 // Trim removes old cache entries that are likely not to be reused.
-func (c *Cache) Trim() {
+func (c *DiskCache) Trim() error {
 	now := c.now()
 
 	// We maintain in dir/trim.txt the time of the last completed cache trim.
@@ -320,7 +369,7 @@
 		if t, err := strconv.ParseInt(strings.TrimSpace(string(data)), 10, 64); err == nil {
 			lastTrim := time.Unix(t, 0)
 			if d := now.Sub(lastTrim); d < trimInterval && d > -mtimeInterval {
-				return
+				return nil
 			}
 		}
 	}
@@ -339,12 +388,14 @@
 	var b bytes.Buffer
 	fmt.Fprintf(&b, "%d", now.Unix())
 	if err := lockedfile.Write(filepath.Join(c.dir, "trim.txt"), &b, 0666); err != nil {
-		return
+		return err
 	}
+
+	return nil
 }
 
 // trimSubdir trims a single cache subdirectory.
-func (c *Cache) trimSubdir(subdir string, cutoff time.Time) {
+func (c *DiskCache) trimSubdir(subdir string, cutoff time.Time) {
 	// Read all directory entries from subdir before removing
 	// any files, in case removing files invalidates the file offset
 	// in the directory scan. Also, ignore error from f.Readdirnames,
@@ -372,7 +423,7 @@
 
 // putIndexEntry adds an entry to the cache recording that executing the action
 // with the given id produces an output with the given output id (hash) and size.
-func (c *Cache) putIndexEntry(id ActionID, out OutputID, size int64, allowVerify bool) error {
+func (c *DiskCache) putIndexEntry(id ActionID, out OutputID, size int64, allowVerify bool) error {
 	// Note: We expect that for one reason or another it may happen
 	// that repeating an action produces a different output hash
 	// (for example, if the output contains a time stamp or temp dir name).
@@ -426,21 +477,32 @@
 	return nil
 }
 
+// noVerifyReadSeeker is a io.ReadSeeker wrapper sentinel type
+// that says that Cache.Put should skip the verify check
+// (from GODEBUG=goverifycache=1).
+type noVerifyReadSeeker struct {
+	io.ReadSeeker
+}
+
 // Put stores the given output in the cache as the output for the action ID.
 // It may read file twice. The content of file must not change between the two passes.
-func (c *Cache) Put(id ActionID, file io.ReadSeeker) (OutputID, int64, error) {
-	return c.put(id, file, true)
+func (c *DiskCache) Put(id ActionID, file io.ReadSeeker) (OutputID, int64, error) {
+	wrapper, isNoVerify := file.(noVerifyReadSeeker)
+	if isNoVerify {
+		file = wrapper.ReadSeeker
+	}
+	return c.put(id, file, !isNoVerify)
 }
 
 // PutNoVerify is like Put but disables the verify check
 // when GODEBUG=goverifycache=1 is set.
 // It is meant for data that is OK to cache but that we expect to vary slightly from run to run,
 // like test output containing times and the like.
-func (c *Cache) PutNoVerify(id ActionID, file io.ReadSeeker) (OutputID, int64, error) {
-	return c.put(id, file, false)
+func PutNoVerify(c Cache, id ActionID, file io.ReadSeeker) (OutputID, int64, error) {
+	return c.Put(id, noVerifyReadSeeker{file})
 }
 
-func (c *Cache) put(id ActionID, file io.ReadSeeker, allowVerify bool) (OutputID, int64, error) {
+func (c *DiskCache) put(id ActionID, file io.ReadSeeker, allowVerify bool) (OutputID, int64, error) {
 	// Compute output ID.
 	h := sha256.New()
 	if _, err := file.Seek(0, 0); err != nil {
@@ -463,14 +525,14 @@
 }
 
 // PutBytes stores the given bytes in the cache as the output for the action ID.
-func (c *Cache) PutBytes(id ActionID, data []byte) error {
+func PutBytes(c Cache, id ActionID, data []byte) error {
 	_, _, err := c.Put(id, bytes.NewReader(data))
 	return err
 }
 
 // copyFile copies file into the cache, expecting it to have the given
 // output ID and size, if that file is not present already.
-func (c *Cache) copyFile(file io.ReadSeeker, out OutputID, size int64) error {
+func (c *DiskCache) copyFile(file io.ReadSeeker, out OutputID, size int64) error {
 	name := c.fileName(out, "d")
 	info, err := os.Stat(name)
 	if err == nil && info.Size() == size {
@@ -560,6 +622,6 @@
 // They may be removed with 'go clean -fuzzcache'.
 //
 // TODO(#48526): make Trim remove unused files from this directory.
-func (c *Cache) FuzzDir() string {
+func (c *DiskCache) FuzzDir() string {
 	return filepath.Join(c.dir, "fuzz")
 }
diff --git a/src/cmd/go/internal/cache/cache_test.go b/src/cmd/go/internal/cache/cache_test.go
index 5527d44..a12f1d2 100644
--- a/src/cmd/go/internal/cache/cache_test.go
+++ b/src/cmd/go/internal/cache/cache_test.go
@@ -11,7 +11,6 @@
 	"internal/testenv"
 	"os"
 	"path/filepath"
-	"runtime"
 	"testing"
 	"time"
 )
@@ -131,7 +130,7 @@
 	}
 
 	id := ActionID(dummyID(1))
-	if err := c.PutBytes(id, []byte("abc")); err != nil {
+	if err := PutBytes(c, id, []byte("abc")); err != nil {
 		t.Fatal(err)
 	}
 
@@ -141,7 +140,7 @@
 			return
 		}
 	}()
-	c.PutBytes(id, []byte("def"))
+	PutBytes(c, id, []byte("def"))
 	t.Fatal("mismatched Put did not panic in verify mode")
 }
 
@@ -152,10 +151,6 @@
 }
 
 func TestCacheTrim(t *testing.T) {
-	if runtime.GOOS == "js" {
-		testenv.SkipFlaky(t, 35220)
-	}
-
 	dir, err := os.MkdirTemp("", "cachetest-")
 	if err != nil {
 		t.Fatal(err)
@@ -183,9 +178,9 @@
 	}
 
 	id := ActionID(dummyID(1))
-	c.PutBytes(id, []byte("abc"))
+	PutBytes(c, id, []byte("abc"))
 	entry, _ := c.Get(id)
-	c.PutBytes(ActionID(dummyID(2)), []byte("def"))
+	PutBytes(c, ActionID(dummyID(2)), []byte("def"))
 	mtime := now
 	checkTime(fmt.Sprintf("%x-a", id), mtime)
 	checkTime(fmt.Sprintf("%x-d", entry.OutputID), mtime)
@@ -207,7 +202,12 @@
 	checkTime(fmt.Sprintf("%x-d", entry.OutputID), mtime2)
 
 	// Trim should leave everything alone: it's all too new.
-	c.Trim()
+	if err := c.Trim(); err != nil {
+		if testenv.SyscallIsNotSupported(err) {
+			t.Skipf("skipping: Trim is unsupported (%v)", err)
+		}
+		t.Fatal(err)
+	}
 	if _, err := c.Get(id); err != nil {
 		t.Fatal(err)
 	}
@@ -220,7 +220,9 @@
 
 	// Trim less than a day later should not do any work at all.
 	now = start + 80000
-	c.Trim()
+	if err := c.Trim(); err != nil {
+		t.Fatal(err)
+	}
 	if _, err := c.Get(id); err != nil {
 		t.Fatal(err)
 	}
@@ -240,7 +242,9 @@
 	// and we haven't looked at it since, so 5 days later it should be gone.
 	now += 5 * 86400
 	checkTime(fmt.Sprintf("%x-a", dummyID(2)), start)
-	c.Trim()
+	if err := c.Trim(); err != nil {
+		t.Fatal(err)
+	}
 	if _, err := c.Get(id); err != nil {
 		t.Fatal(err)
 	}
@@ -254,7 +258,9 @@
 	// Check that another 5 days later it is still not gone,
 	// but check by using checkTime, which doesn't bring mtime forward.
 	now += 5 * 86400
-	c.Trim()
+	if err := c.Trim(); err != nil {
+		t.Fatal(err)
+	}
 	checkTime(fmt.Sprintf("%x-a", id), mtime3)
 	checkTime(fmt.Sprintf("%x-d", entry.OutputID), mtime3)
 
@@ -262,13 +268,17 @@
 	// Even though the entry for id is now old enough to be trimmed,
 	// it gets a reprieve until the time comes for a new Trim scan.
 	now += 86400 / 2
-	c.Trim()
+	if err := c.Trim(); err != nil {
+		t.Fatal(err)
+	}
 	checkTime(fmt.Sprintf("%x-a", id), mtime3)
 	checkTime(fmt.Sprintf("%x-d", entry.OutputID), mtime3)
 
 	// Another half a day later, Trim should actually run, and it should remove id.
 	now += 86400/2 + 1
-	c.Trim()
+	if err := c.Trim(); err != nil {
+		t.Fatal(err)
+	}
 	if _, err := c.Get(dummyID(1)); err == nil {
 		t.Fatal("Trim did not remove dummyID(1)")
 	}
diff --git a/src/cmd/go/internal/cache/default.go b/src/cmd/go/internal/cache/default.go
index 426dddf..b5650ea 100644
--- a/src/cmd/go/internal/cache/default.go
+++ b/src/cmd/go/internal/cache/default.go
@@ -12,17 +12,19 @@
 
 	"cmd/go/internal/base"
 	"cmd/go/internal/cfg"
+	"internal/goexperiment"
 )
 
-// Default returns the default cache to use, or nil if no cache should be used.
-func Default() *Cache {
+// Default returns the default cache to use.
+// It never returns nil.
+func Default() Cache {
 	defaultOnce.Do(initDefaultCache)
 	return defaultCache
 }
 
 var (
 	defaultOnce  sync.Once
-	defaultCache *Cache
+	defaultCache Cache
 )
 
 // cacheREADME is a message stored in a README in the cache directory.
@@ -52,11 +54,16 @@
 		os.WriteFile(filepath.Join(dir, "README"), []byte(cacheREADME), 0666)
 	}
 
-	c, err := Open(dir)
+	diskCache, err := Open(dir)
 	if err != nil {
 		base.Fatalf("failed to initialize build cache at %s: %s\n", dir, err)
 	}
-	defaultCache = c
+
+	if v := cfg.Getenv("GOCACHEPROG"); v != "" && goexperiment.CacheProg {
+		defaultCache = startCacheProg(v, diskCache)
+	} else {
+		defaultCache = diskCache
+	}
 }
 
 var (
diff --git a/src/cmd/go/internal/cache/prog.go b/src/cmd/go/internal/cache/prog.go
new file mode 100644
index 0000000..30f69b3
--- /dev/null
+++ b/src/cmd/go/internal/cache/prog.go
@@ -0,0 +1,427 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package cache
+
+import (
+	"bufio"
+	"cmd/go/internal/base"
+	"cmd/internal/quoted"
+	"context"
+	"crypto/sha256"
+	"encoding/base64"
+	"encoding/json"
+	"errors"
+	"fmt"
+	"io"
+	"log"
+	"os"
+	"os/exec"
+	"sync"
+	"sync/atomic"
+	"time"
+)
+
+// ProgCache implements Cache via JSON messages over stdin/stdout to a child
+// helper process which can then implement whatever caching policy/mechanism it
+// wants.
+//
+// See https://github.com/golang/go/issues/59719
+type ProgCache struct {
+	cmd    *exec.Cmd
+	stdout io.ReadCloser  // from the child process
+	stdin  io.WriteCloser // to the child process
+	bw     *bufio.Writer  // to stdin
+	jenc   *json.Encoder  // to bw
+
+	// can are the commands that the child process declared that it supports.
+	// This is effectively the versioning mechanism.
+	can map[ProgCmd]bool
+
+	// fuzzDirCache is another Cache implementation to use for the FuzzDir
+	// method. In practice this is the default GOCACHE disk-based
+	// implementation.
+	//
+	// TODO(bradfitz): maybe this isn't ideal. But we'd need to extend the Cache
+	// interface and the fuzzing callers to be less disk-y to do more here.
+	fuzzDirCache Cache
+
+	closing      atomic.Bool
+	ctx          context.Context    // valid until Close via ctxClose
+	ctxCancel    context.CancelFunc // called on Close
+	readLoopDone chan struct{}      // closed when readLoop returns
+
+	mu         sync.Mutex // guards following fields
+	nextID     int64
+	inFlight   map[int64]chan<- *ProgResponse
+	outputFile map[OutputID]string // object => abs path on disk
+
+	// writeMu serializes writing to the child process.
+	// It must never be held at the same time as mu.
+	writeMu sync.Mutex
+}
+
+// ProgCmd is a command that can be issued to a child process.
+//
+// If the interface needs to grow, we can add new commands or new versioned
+// commands like "get2".
+type ProgCmd string
+
+const (
+	cmdGet   = ProgCmd("get")
+	cmdPut   = ProgCmd("put")
+	cmdClose = ProgCmd("close")
+)
+
+// ProgRequest is the JSON-encoded message that's sent from cmd/go to
+// the GOCACHEPROG child process over stdin. Each JSON object is on its
+// own line. A ProgRequest of Type "put" with BodySize > 0 will be followed
+// by a line containing a base64-encoded JSON string literal of the body.
+type ProgRequest struct {
+	// ID is a unique number per process across all requests.
+	// It must be echoed in the ProgResponse from the child.
+	ID int64
+
+	// Command is the type of request.
+	// The cmd/go tool will only send commands that were declared
+	// as supported by the child.
+	Command ProgCmd
+
+	// ActionID is non-nil for get and puts.
+	ActionID []byte `json:",omitempty"` // or nil if not used
+
+	// ObjectID is set for Type "put" and "output-file".
+	ObjectID []byte `json:",omitempty"` // or nil if not used
+
+	// Body is the body for "put" requests. It's sent after the JSON object
+	// as a base64-encoded JSON string when BodySize is non-zero.
+	// It's sent as a separate JSON value instead of being a struct field
+	// send in this JSON object so large values can be streamed in both directions.
+	// The base64 string body of a ProgRequest will always be written
+	// immediately after the JSON object and a newline.
+	Body io.Reader `json:"-"`
+
+	// BodySize is the number of bytes of Body. If zero, the body isn't written.
+	BodySize int64 `json:",omitempty"`
+}
+
+// ProgResponse is the JSON response from the child process to cmd/go.
+//
+// With the exception of the first protocol message that the child writes to its
+// stdout with ID==0 and KnownCommands populated, these are only sent in
+// response to a ProgRequest from cmd/go.
+//
+// ProgResponses can be sent in any order. The ID must match the request they're
+// replying to.
+type ProgResponse struct {
+	ID  int64  // that corresponds to ProgRequest; they can be answered out of order
+	Err string `json:",omitempty"` // if non-empty, the error
+
+	// KnownCommands is included in the first message that cache helper program
+	// writes to stdout on startup (with ID==0). It includes the
+	// ProgRequest.Command types that are supported by the program.
+	//
+	// This lets us extend the protocol gracefully over time (adding "get2",
+	// etc), or fail gracefully when needed. It also lets us verify the program
+	// wants to be a cache helper.
+	KnownCommands []ProgCmd `json:",omitempty"`
+
+	// For Get requests.
+
+	Miss     bool       `json:",omitempty"` // cache miss
+	OutputID []byte     `json:",omitempty"`
+	Size     int64      `json:",omitempty"` // in bytes
+	Time     *time.Time `json:",omitempty"` // an Entry.Time; when the object was added to the docs
+
+	// DiskPath is the absolute path on disk of the ObjectID corresponding
+	// a "get" request's ActionID (on cache hit) or a "put" request's
+	// provided ObjectID.
+	DiskPath string `json:",omitempty"`
+}
+
+// startCacheProg starts the prog binary (with optional space-separated flags)
+// and returns a Cache implementation that talks to it.
+//
+// It blocks a few seconds to wait for the child process to successfully start
+// and advertise its capabilities.
+func startCacheProg(progAndArgs string, fuzzDirCache Cache) Cache {
+	if fuzzDirCache == nil {
+		panic("missing fuzzDirCache")
+	}
+	args, err := quoted.Split(progAndArgs)
+	if err != nil {
+		base.Fatalf("GOCACHEPROG args: %v", err)
+	}
+	var prog string
+	if len(args) > 0 {
+		prog = args[0]
+		args = args[1:]
+	}
+
+	ctx, ctxCancel := context.WithCancel(context.Background())
+
+	cmd := exec.CommandContext(ctx, prog, args...)
+	out, err := cmd.StdoutPipe()
+	if err != nil {
+		base.Fatalf("StdoutPipe to GOCACHEPROG: %v", err)
+	}
+	in, err := cmd.StdinPipe()
+	if err != nil {
+		base.Fatalf("StdinPipe to GOCACHEPROG: %v", err)
+	}
+	cmd.Stderr = os.Stderr
+	cmd.Cancel = in.Close
+
+	if err := cmd.Start(); err != nil {
+		base.Fatalf("error starting GOCACHEPROG program %q: %v", prog, err)
+	}
+
+	pc := &ProgCache{
+		ctx:          ctx,
+		ctxCancel:    ctxCancel,
+		fuzzDirCache: fuzzDirCache,
+		cmd:          cmd,
+		stdout:       out,
+		stdin:        in,
+		bw:           bufio.NewWriter(in),
+		inFlight:     make(map[int64]chan<- *ProgResponse),
+		outputFile:   make(map[OutputID]string),
+		readLoopDone: make(chan struct{}),
+	}
+
+	// Register our interest in the initial protocol message from the child to
+	// us, saying what it can do.
+	capResc := make(chan *ProgResponse, 1)
+	pc.inFlight[0] = capResc
+
+	pc.jenc = json.NewEncoder(pc.bw)
+	go pc.readLoop(pc.readLoopDone)
+
+	// Give the child process a few seconds to report its capabilities. This
+	// should be instant and not require any slow work by the program.
+	timer := time.NewTicker(5 * time.Second)
+	defer timer.Stop()
+	for {
+		select {
+		case <-timer.C:
+			log.Printf("# still waiting for GOCACHEPROG %v ...", prog)
+		case capRes := <-capResc:
+			can := map[ProgCmd]bool{}
+			for _, cmd := range capRes.KnownCommands {
+				can[cmd] = true
+			}
+			if len(can) == 0 {
+				base.Fatalf("GOCACHEPROG %v declared no supported commands", prog)
+			}
+			pc.can = can
+			return pc
+		}
+	}
+}
+
+func (c *ProgCache) readLoop(readLoopDone chan<- struct{}) {
+	defer close(readLoopDone)
+	jd := json.NewDecoder(c.stdout)
+	for {
+		res := new(ProgResponse)
+		if err := jd.Decode(res); err != nil {
+			if c.closing.Load() {
+				return // quietly
+			}
+			if errors.Is(err, io.EOF) {
+				c.mu.Lock()
+				inFlight := len(c.inFlight)
+				c.mu.Unlock()
+				base.Fatalf("GOCACHEPROG exited pre-Close with %v pending requests", inFlight)
+			}
+			base.Fatalf("error reading JSON from GOCACHEPROG: %v", err)
+		}
+		c.mu.Lock()
+		ch, ok := c.inFlight[res.ID]
+		delete(c.inFlight, res.ID)
+		c.mu.Unlock()
+		if ok {
+			ch <- res
+		} else {
+			base.Fatalf("GOCACHEPROG sent response for unknown request ID %v", res.ID)
+		}
+	}
+}
+
+func (c *ProgCache) send(ctx context.Context, req *ProgRequest) (*ProgResponse, error) {
+	resc := make(chan *ProgResponse, 1)
+	if err := c.writeToChild(req, resc); err != nil {
+		return nil, err
+	}
+	select {
+	case res := <-resc:
+		if res.Err != "" {
+			return nil, errors.New(res.Err)
+		}
+		return res, nil
+	case <-ctx.Done():
+		return nil, ctx.Err()
+	}
+}
+
+func (c *ProgCache) writeToChild(req *ProgRequest, resc chan<- *ProgResponse) (err error) {
+	c.mu.Lock()
+	c.nextID++
+	req.ID = c.nextID
+	c.inFlight[req.ID] = resc
+	c.mu.Unlock()
+
+	defer func() {
+		if err != nil {
+			c.mu.Lock()
+			delete(c.inFlight, req.ID)
+			c.mu.Unlock()
+		}
+	}()
+
+	c.writeMu.Lock()
+	defer c.writeMu.Unlock()
+
+	if err := c.jenc.Encode(req); err != nil {
+		return err
+	}
+	if err := c.bw.WriteByte('\n'); err != nil {
+		return err
+	}
+	if req.Body != nil && req.BodySize > 0 {
+		if err := c.bw.WriteByte('"'); err != nil {
+			return err
+		}
+		e := base64.NewEncoder(base64.StdEncoding, c.bw)
+		wrote, err := io.Copy(e, req.Body)
+		if err != nil {
+			return err
+		}
+		if err := e.Close(); err != nil {
+			return nil
+		}
+		if wrote != req.BodySize {
+			return fmt.Errorf("short write writing body to GOCACHEPROG for action %x, object %x: wrote %v; expected %v",
+				req.ActionID, req.ObjectID, wrote, req.BodySize)
+		}
+		if _, err := c.bw.WriteString("\"\n"); err != nil {
+			return err
+		}
+	}
+	if err := c.bw.Flush(); err != nil {
+		return err
+	}
+	return nil
+}
+
+func (c *ProgCache) Get(a ActionID) (Entry, error) {
+	if !c.can[cmdGet] {
+		// They can't do a "get". Maybe they're a write-only cache.
+		//
+		// TODO(bradfitz,bcmills): figure out the proper error type here. Maybe
+		// errors.ErrUnsupported? Is entryNotFoundError even appropriate? There
+		// might be places where we rely on the fact that a recent Put can be
+		// read through a corresponding Get. Audit callers and check, and document
+		// error types on the Cache interface.
+		return Entry{}, &entryNotFoundError{}
+	}
+	res, err := c.send(c.ctx, &ProgRequest{
+		Command:  cmdGet,
+		ActionID: a[:],
+	})
+	if err != nil {
+		return Entry{}, err // TODO(bradfitz): or entryNotFoundError? Audit callers.
+	}
+	if res.Miss {
+		return Entry{}, &entryNotFoundError{}
+	}
+	e := Entry{
+		Size: res.Size,
+	}
+	if res.Time != nil {
+		e.Time = *res.Time
+	} else {
+		e.Time = time.Now()
+	}
+	if res.DiskPath == "" {
+		return Entry{}, &entryNotFoundError{errors.New("GOCACHEPROG didn't populate DiskPath on get hit")}
+	}
+	if copy(e.OutputID[:], res.OutputID) != len(res.OutputID) {
+		return Entry{}, &entryNotFoundError{errors.New("incomplete ProgResponse OutputID")}
+	}
+	c.noteOutputFile(e.OutputID, res.DiskPath)
+	return e, nil
+}
+
+func (c *ProgCache) noteOutputFile(o OutputID, diskPath string) {
+	c.mu.Lock()
+	defer c.mu.Unlock()
+	c.outputFile[o] = diskPath
+}
+
+func (c *ProgCache) OutputFile(o OutputID) string {
+	c.mu.Lock()
+	defer c.mu.Unlock()
+	return c.outputFile[o]
+}
+
+func (c *ProgCache) Put(a ActionID, file io.ReadSeeker) (_ OutputID, size int64, _ error) {
+	// Compute output ID.
+	h := sha256.New()
+	if _, err := file.Seek(0, 0); err != nil {
+		return OutputID{}, 0, err
+	}
+	size, err := io.Copy(h, file)
+	if err != nil {
+		return OutputID{}, 0, err
+	}
+	var out OutputID
+	h.Sum(out[:0])
+
+	if _, err := file.Seek(0, 0); err != nil {
+		return OutputID{}, 0, err
+	}
+
+	if !c.can[cmdPut] {
+		// Child is a read-only cache. Do nothing.
+		return out, size, nil
+	}
+
+	res, err := c.send(c.ctx, &ProgRequest{
+		Command:  cmdPut,
+		ActionID: a[:],
+		ObjectID: out[:],
+		Body:     file,
+		BodySize: size,
+	})
+	if err != nil {
+		return OutputID{}, 0, err
+	}
+	if res.DiskPath == "" {
+		return OutputID{}, 0, errors.New("GOCACHEPROG didn't return DiskPath in put response")
+	}
+	c.noteOutputFile(out, res.DiskPath)
+	return out, size, err
+}
+
+func (c *ProgCache) Close() error {
+	c.closing.Store(true)
+	var err error
+
+	// First write a "close" message to the child so it can exit nicely
+	// and clean up if it wants. Only after that exchange do we cancel
+	// the context that kills the process.
+	if c.can[cmdClose] {
+		_, err = c.send(c.ctx, &ProgRequest{Command: cmdClose})
+	}
+	c.ctxCancel()
+	<-c.readLoopDone
+	return err
+}
+
+func (c *ProgCache) FuzzDir() string {
+	// TODO(bradfitz): figure out what to do here. For now just use the
+	// disk-based default.
+	return c.fuzzDirCache.FuzzDir()
+}
diff --git a/src/cmd/go/internal/cfg/cfg.go b/src/cmd/go/internal/cfg/cfg.go
index 3257140..8caa22a 100644
--- a/src/cmd/go/internal/cfg/cfg.go
+++ b/src/cmd/go/internal/cfg/cfg.go
@@ -8,6 +8,7 @@
 
 import (
 	"bytes"
+	"context"
 	"fmt"
 	"go/build"
 	"internal/buildcfg"
@@ -81,7 +82,6 @@
 	BuildO                 string                  // -o flag
 	BuildP                 = runtime.GOMAXPROCS(0) // -p flag
 	BuildPGO               string                  // -pgo flag
-	BuildPGOFile           string                  // profile selected by -pgo flag, an absolute path (if not empty)
 	BuildPkgdir            string                  // -pkgdir flag
 	BuildRace              bool                    // -race flag
 	BuildToolexec          []string                // -toolexec flag
@@ -98,8 +98,9 @@
 
 	CmdName string // "build", "install", "list", "mod tidy", etc.
 
-	DebugActiongraph string // -debug-actiongraph flag (undocumented, unstable)
-	DebugTrace       string // -debug-trace flag
+	DebugActiongraph  string // -debug-actiongraph flag (undocumented, unstable)
+	DebugTrace        string // -debug-trace flag
+	DebugRuntimeTrace string // -debug-runtime-trace flag (undocumented, unstable)
 
 	// GoPathError is set when GOPATH is not set. it contains an
 	// explanation why GOPATH is unset.
@@ -141,6 +142,7 @@
 		// (1) environment, (2) go/env file, (3) runtime constants,
 		// while go/build.Default.GOOS/GOARCH are derived from the preference list
 		// (1) environment, (2) runtime constants.
+		//
 		// We know ctxt.GOOS/GOARCH == runtime.GOOS/GOARCH;
 		// no matter how that happened, go/build.Default will make the
 		// same decision (either the environment variables are set explicitly
@@ -179,7 +181,7 @@
 }
 
 func init() {
-	SetGOROOT(findGOROOT(), false)
+	SetGOROOT(Getenv("GOROOT"), false)
 	BuildToolchainCompiler = func() string { return "missing-compiler" }
 	BuildToolchainLinker = func() string { return "missing-linker" }
 }
@@ -303,7 +305,22 @@
 
 func initEnvCache() {
 	envCache.m = make(map[string]string)
-	file, _ := EnvFile()
+	if file, _ := EnvFile(); file != "" {
+		readEnvFile(file, "user")
+	}
+	goroot := findGOROOT(envCache.m["GOROOT"])
+	if goroot != "" {
+		readEnvFile(filepath.Join(goroot, "go.env"), "GOROOT")
+	}
+
+	// Save the goroot for func init calling SetGOROOT,
+	// and also overwrite anything that might have been in go.env.
+	// It makes no sense for GOROOT/go.env to specify
+	// a different GOROOT.
+	envCache.m["GOROOT"] = goroot
+}
+
+func readEnvFile(file string, source string) {
 	if file == "" {
 		return
 	}
@@ -325,13 +342,21 @@
 		i = bytes.IndexByte(line, '=')
 		if i < 0 || line[0] < 'A' || 'Z' < line[0] {
 			// Line is missing = (or empty) or a comment or not a valid env name. Ignore.
-			// (This should not happen, since the file should be maintained almost
+			// This should not happen in the user file, since the file should be maintained almost
 			// exclusively by "go env -w", but better to silently ignore than to make
 			// the go command unusable just because somehow the env file has
-			// gotten corrupted.)
+			// gotten corrupted.
+			// In the GOROOT/go.env file, we expect comments.
 			continue
 		}
 		key, val := line[:i], line[i+1:]
+
+		if source == "GOROOT" {
+			// In the GOROOT/go.env file, do not overwrite fields loaded from the user's go/env file.
+			if _, ok := envCache.m[string(key)]; ok {
+				continue
+			}
+		}
 		envCache.m[string(key)] = string(val)
 	}
 }
@@ -362,17 +387,26 @@
 
 // CanGetenv reports whether key is a valid go/env configuration key.
 func CanGetenv(key string) bool {
+	envCache.once.Do(initEnvCache)
+	if _, ok := envCache.m[key]; ok {
+		// Assume anything in the user file or go.env file is valid.
+		return true
+	}
 	return strings.Contains(cfg.KnownEnv, "\t"+key+"\n")
 }
 
 var (
-	GOROOT       string
-	GOROOTbin    string
-	GOROOTpkg    string
-	GOROOTsrc    string
+	GOROOT string
+
+	// Either empty or produced by filepath.Join(GOROOT, …).
+	GOROOTbin string
+	GOROOTpkg string
+	GOROOTsrc string
+
 	GOROOT_FINAL string
-	GOBIN        = Getenv("GOBIN")
-	GOMODCACHE   = envOr("GOMODCACHE", gopathDir("pkg/mod"))
+
+	GOBIN      = Getenv("GOBIN")
+	GOMODCACHE = envOr("GOMODCACHE", gopathDir("pkg/mod"))
 
 	// Used in envcmd.MkEnv and build ID computations.
 	GOARM    = envOr("GOARM", fmt.Sprint(buildcfg.GOARM))
@@ -383,8 +417,8 @@
 	GOPPC64  = envOr("GOPPC64", fmt.Sprintf("%s%d", "power", buildcfg.GOPPC64))
 	GOWASM   = envOr("GOWASM", fmt.Sprint(buildcfg.GOWASM))
 
-	GOPROXY    = envOr("GOPROXY", "https://proxy.golang.org,direct")
-	GOSUMDB    = envOr("GOSUMDB", "sum.golang.org")
+	GOPROXY    = envOr("GOPROXY", "")
+	GOSUMDB    = envOr("GOSUMDB", "")
 	GOPRIVATE  = Getenv("GOPRIVATE")
 	GONOPROXY  = envOr("GONOPROXY", GOPRIVATE)
 	GONOSUMDB  = envOr("GONOSUMDB", GOPRIVATE)
@@ -437,8 +471,14 @@
 // with from runtime.GOROOT().
 //
 // There is a copy of this code in x/tools/cmd/godoc/goroot.go.
-func findGOROOT() string {
-	if env := Getenv("GOROOT"); env != "" {
+func findGOROOT(env string) string {
+	if env == "" {
+		// Not using Getenv because findGOROOT is called
+		// to find the GOROOT/go.env file. initEnvCache
+		// has passed in the setting from the user go/env file.
+		env = os.Getenv("GOROOT")
+	}
+	if env != "" {
 		return filepath.Clean(env)
 	}
 	def := ""
@@ -450,25 +490,43 @@
 		// depend on the executable's location.
 		return def
 	}
+
+	// canonical returns a directory path that represents
+	// the same directory as dir,
+	// preferring the spelling in def if the two are the same.
+	canonical := func(dir string) string {
+		if isSameDir(def, dir) {
+			return def
+		}
+		return dir
+	}
+
 	exe, err := os.Executable()
 	if err == nil {
 		exe, err = filepath.Abs(exe)
 		if err == nil {
+			// cmd/go may be installed in GOROOT/bin or GOROOT/bin/GOOS_GOARCH,
+			// depending on whether it was cross-compiled with a different
+			// GOHOSTOS (see https://go.dev/issue/62119). Try both.
 			if dir := filepath.Join(exe, "../.."); isGOROOT(dir) {
-				// If def (runtime.GOROOT()) and dir are the same
-				// directory, prefer the spelling used in def.
-				if isSameDir(def, dir) {
-					return def
-				}
-				return dir
+				return canonical(dir)
 			}
+			if dir := filepath.Join(exe, "../../.."); isGOROOT(dir) {
+				return canonical(dir)
+			}
+
+			// Depending on what was passed on the command line, it is possible
+			// that os.Executable is a symlink (like /usr/local/bin/go) referring
+			// to a binary installed in a real GOROOT elsewhere
+			// (like /usr/lib/go/bin/go).
+			// Try to find that GOROOT by resolving the symlinks.
 			exe, err = filepath.EvalSymlinks(exe)
 			if err == nil {
 				if dir := filepath.Join(exe, "../.."); isGOROOT(dir) {
-					if isSameDir(def, dir) {
-						return def
-					}
-					return dir
+					return canonical(dir)
+				}
+				if dir := filepath.Join(exe, "../../.."); isGOROOT(dir) {
+					return canonical(dir)
 				}
 			}
 		}
@@ -539,3 +597,23 @@
 	GoPathError = fmt.Sprintf("%s is not set", env)
 	return ""
 }
+
+// WithBuildXWriter returns a Context in which BuildX output is written
+// to given io.Writer.
+func WithBuildXWriter(ctx context.Context, xLog io.Writer) context.Context {
+	return context.WithValue(ctx, buildXContextKey{}, xLog)
+}
+
+type buildXContextKey struct{}
+
+// BuildXWriter returns nil if BuildX is false, or
+// the writer to which BuildX output should be written otherwise.
+func BuildXWriter(ctx context.Context) (io.Writer, bool) {
+	if !BuildX {
+		return nil, false
+	}
+	if v := ctx.Value(buildXContextKey{}); v != nil {
+		return v.(io.Writer), true
+	}
+	return os.Stderr, true
+}
diff --git a/src/cmd/go/internal/clean/clean.go b/src/cmd/go/internal/clean/clean.go
index 368288f..e011237 100644
--- a/src/cmd/go/internal/clean/clean.go
+++ b/src/cmd/go/internal/clean/clean.go
@@ -172,7 +172,7 @@
 						// This also mimics what os.RemoveAll(dir) would do.
 						if err := os.RemoveAll(d); err != nil && !printedErrors {
 							printedErrors = true
-							base.Errorf("go: %v", err)
+							base.Error(err)
 						}
 					}
 				}
@@ -185,7 +185,7 @@
 			if !cfg.BuildN {
 				if err := os.RemoveAll(logFile); err != nil && !printedErrors {
 					printedErrors = true
-					base.Errorf("go: %v", err)
+					base.Error(err)
 				}
 			}
 		}
@@ -215,7 +215,7 @@
 			}
 			if err != nil {
 				if _, statErr := os.Stat(dir); !os.IsNotExist(statErr) {
-					base.Errorf("go: %v", err)
+					base.Error(err)
 				}
 			}
 		}
@@ -230,7 +230,7 @@
 		}
 		if !cfg.BuildN {
 			if err := modfetch.RemoveAll(cfg.GOMODCACHE); err != nil {
-				base.Errorf("go: %v", err)
+				base.Error(err)
 			}
 		}
 	}
@@ -242,7 +242,7 @@
 		}
 		if !cfg.BuildN {
 			if err := os.RemoveAll(fuzzDir); err != nil {
-				base.Errorf("go: %v", err)
+				base.Error(err)
 			}
 		}
 	}
@@ -372,7 +372,7 @@
 					}
 				}
 				if err := os.RemoveAll(filepath.Join(p.Dir, name)); err != nil {
-					base.Errorf("go: %v", err)
+					base.Error(err)
 				}
 			}
 			continue
@@ -424,5 +424,5 @@
 			return
 		}
 	}
-	base.Errorf("go: %v", err)
+	base.Error(err)
 }
diff --git a/src/cmd/go/internal/envcmd/env.go b/src/cmd/go/internal/envcmd/env.go
index 66ef5ce..c7c2e83 100644
--- a/src/cmd/go/internal/envcmd/env.go
+++ b/src/cmd/go/internal/envcmd/env.go
@@ -6,6 +6,7 @@
 package envcmd
 
 import (
+	"bytes"
 	"context"
 	"encoding/json"
 	"fmt"
@@ -17,6 +18,7 @@
 	"runtime"
 	"sort"
 	"strings"
+	"unicode"
 	"unicode/utf8"
 
 	"cmd/go/internal/base"
@@ -98,6 +100,7 @@
 		{Name: "GOROOT", Value: cfg.GOROOT},
 		{Name: "GOSUMDB", Value: cfg.GOSUMDB},
 		{Name: "GOTMPDIR", Value: cfg.Getenv("GOTMPDIR")},
+		{Name: "GOTOOLCHAIN", Value: cfg.Getenv("GOTOOLCHAIN")},
 		{Name: "GOTOOLDIR", Value: build.ToolDir},
 		{Name: "GOVCS", Value: cfg.GOVCS},
 		{Name: "GOVERSION", Value: runtime.Version()},
@@ -149,6 +152,9 @@
 			return e.Value
 		}
 	}
+	if cfg.CanGetenv(name) {
+		return cfg.Getenv(name)
+	}
 	return ""
 }
 
@@ -179,7 +185,7 @@
 	b := work.NewBuilder("")
 	defer func() {
 		if err := b.Close(); err != nil {
-			base.Fatalf("go: %v", err)
+			base.Fatal(err)
 		}
 	}()
 
@@ -245,14 +251,20 @@
 
 	buildcfg.Check()
 	if cfg.ExperimentErr != nil {
-		base.Fatalf("go: %v", cfg.ExperimentErr)
+		base.Fatal(cfg.ExperimentErr)
+	}
+
+	for _, arg := range args {
+		if strings.Contains(arg, "=") {
+			base.Fatalf("go: invalid variable name %q (use -w to set variable)", arg)
+		}
 	}
 
 	env := cfg.CmdEnv
 	env = append(env, ExtraEnvVars()...)
 
 	if err := fsys.Init(base.Cwd()); err != nil {
-		base.Fatalf("go: %v", err)
+		base.Fatal(err)
 	}
 
 	// Do we need to call ExtraEnvVarsCostly, which is a bit expensive?
@@ -325,7 +337,7 @@
 			base.Fatalf("go: arguments must be KEY=VALUE: invalid argument: %s", arg)
 		}
 		if err := checkEnvWrite(key, val); err != nil {
-			base.Fatalf("go: %v", err)
+			base.Fatal(err)
 		}
 		if _, ok := add[key]; ok {
 			base.Fatalf("go: multiple values for key: %s", key)
@@ -337,7 +349,7 @@
 	}
 
 	if err := checkBuildConfig(add, nil); err != nil {
-		base.Fatalf("go: %v", err)
+		base.Fatal(err)
 	}
 
 	gotmp, okGOTMP := add["GOTMPDIR"]
@@ -358,13 +370,13 @@
 	del := make(map[string]bool)
 	for _, arg := range args {
 		if err := checkEnvWrite(arg, ""); err != nil {
-			base.Fatalf("go: %v", err)
+			base.Fatal(err)
 		}
 		del[arg] = true
 	}
 
 	if err := checkBuildConfig(nil, del); err != nil {
-		base.Fatalf("go: %v", err)
+		base.Fatal(err)
 	}
 
 	updateEnvFile(nil, del)
@@ -413,9 +425,12 @@
 func PrintEnv(w io.Writer, env []cfg.EnvVar) {
 	for _, e := range env {
 		if e.Name != "TERM" {
+			if runtime.GOOS != "plan9" && bytes.Contains([]byte(e.Value), []byte{0}) {
+				base.Fatalf("go: internal error: encountered null byte in environment variable %s on non-plan9 platform", e.Name)
+			}
 			switch runtime.GOOS {
 			default:
-				fmt.Fprintf(w, "%s=\"%s\"\n", e.Name, e.Value)
+				fmt.Fprintf(w, "%s=%s\n", e.Name, shellQuote(e.Value))
 			case "plan9":
 				if strings.IndexByte(e.Value, '\x00') < 0 {
 					fmt.Fprintf(w, "%s='%s'\n", e.Name, strings.ReplaceAll(e.Value, "'", "''"))
@@ -426,17 +441,67 @@
 						if x > 0 {
 							fmt.Fprintf(w, " ")
 						}
-						fmt.Fprintf(w, "%s", s)
+						fmt.Fprintf(w, "'%s'", strings.ReplaceAll(s, "'", "''"))
 					}
 					fmt.Fprintf(w, ")\n")
 				}
 			case "windows":
-				fmt.Fprintf(w, "set %s=%s\n", e.Name, e.Value)
+				if hasNonGraphic(e.Value) {
+					base.Errorf("go: stripping unprintable or unescapable characters from %%%q%%", e.Name)
+				}
+				fmt.Fprintf(w, "set %s=%s\n", e.Name, batchEscape(e.Value))
 			}
 		}
 	}
 }
 
+func hasNonGraphic(s string) bool {
+	for _, c := range []byte(s) {
+		if c == '\r' || c == '\n' || (!unicode.IsGraphic(rune(c)) && !unicode.IsSpace(rune(c))) {
+			return true
+		}
+	}
+	return false
+}
+
+func shellQuote(s string) string {
+	var b bytes.Buffer
+	b.WriteByte('\'')
+	for _, x := range []byte(s) {
+		if x == '\'' {
+			// Close the single quoted string, add an escaped single quote,
+			// and start another single quoted string.
+			b.WriteString(`'\''`)
+		} else {
+			b.WriteByte(x)
+		}
+	}
+	b.WriteByte('\'')
+	return b.String()
+}
+
+func batchEscape(s string) string {
+	var b bytes.Buffer
+	for _, x := range []byte(s) {
+		if x == '\r' || x == '\n' || (!unicode.IsGraphic(rune(x)) && !unicode.IsSpace(rune(x))) {
+			b.WriteRune(unicode.ReplacementChar)
+			continue
+		}
+		switch x {
+		case '%':
+			b.WriteString("%%")
+		case '<', '>', '|', '&', '^':
+			// These are special characters that need to be escaped with ^. See
+			// https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/set_1.
+			b.WriteByte('^')
+			b.WriteByte(x)
+		default:
+			b.WriteByte(x)
+		}
+	}
+	return b.String()
+}
+
 func printEnvAsJSON(env []cfg.EnvVar) {
 	m := make(map[string]string)
 	for _, e := range env {
@@ -470,6 +535,7 @@
 	}
 
 	// To catch typos and the like, check that we know the variable.
+	// If it's already in the env file, we assume it's known.
 	if !cfg.CanGetenv(key) {
 		return fmt.Errorf("unknown go command variable %s", key)
 	}
@@ -523,22 +589,29 @@
 	return nil
 }
 
-func updateEnvFile(add map[string]string, del map[string]bool) {
+func readEnvFileLines(mustExist bool) []string {
 	file, err := cfg.EnvFile()
 	if file == "" {
-		base.Fatalf("go: cannot find go env config: %v", err)
+		if mustExist {
+			base.Fatalf("go: cannot find go env config: %v", err)
+		}
+		return nil
 	}
 	data, err := os.ReadFile(file)
-	if err != nil && (!os.IsNotExist(err) || len(add) == 0) {
+	if err != nil && (!os.IsNotExist(err) || mustExist) {
 		base.Fatalf("go: reading go env config: %v", err)
 	}
-
 	lines := strings.SplitAfter(string(data), "\n")
 	if lines[len(lines)-1] == "" {
 		lines = lines[:len(lines)-1]
 	} else {
 		lines[len(lines)-1] += "\n"
 	}
+	return lines
+}
+
+func updateEnvFile(add map[string]string, del map[string]bool) {
+	lines := readEnvFileLines(len(add) == 0)
 
 	// Delete all but last copy of any duplicated variables,
 	// since the last copy is the one that takes effect.
@@ -581,7 +654,11 @@
 		}
 	}
 
-	data = []byte(strings.Join(lines, ""))
+	file, err := cfg.EnvFile()
+	if file == "" {
+		base.Fatalf("go: cannot find go env config: %v", err)
+	}
+	data := []byte(strings.Join(lines, ""))
 	err = os.WriteFile(file, data, 0666)
 	if err != nil {
 		// Try creating directory.
diff --git a/src/cmd/go/internal/envcmd/env_test.go b/src/cmd/go/internal/envcmd/env_test.go
new file mode 100644
index 0000000..7419cf3
--- /dev/null
+++ b/src/cmd/go/internal/envcmd/env_test.go
@@ -0,0 +1,93 @@
+// Copyright 2022 The Go 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:build unix || windows
+
+package envcmd
+
+import (
+	"bytes"
+	"cmd/go/internal/cfg"
+	"fmt"
+	"internal/testenv"
+	"os"
+	"os/exec"
+	"path/filepath"
+	"runtime"
+	"testing"
+	"unicode"
+)
+
+func FuzzPrintEnvEscape(f *testing.F) {
+	f.Add(`$(echo 'cc"'; echo 'OOPS="oops')`)
+	f.Add("$(echo shell expansion 1>&2)")
+	f.Add("''")
+	f.Add(`C:\"Program Files"\`)
+	f.Add(`\\"Quoted Host"\\share`)
+	f.Add("\xfb")
+	f.Add("0")
+	f.Add("")
+	f.Add("''''''''")
+	f.Add("\r")
+	f.Add("\n")
+	f.Add("E,%")
+	f.Fuzz(func(t *testing.T, s string) {
+		t.Parallel()
+
+		for _, c := range []byte(s) {
+			if c == 0 {
+				t.Skipf("skipping %q: contains a null byte. Null bytes can't occur in the environment"+
+					" outside of Plan 9, which has different code path than Windows and Unix that this test"+
+					" isn't testing.", s)
+			}
+			if c > unicode.MaxASCII {
+				t.Skipf("skipping %#q: contains a non-ASCII character %q", s, c)
+			}
+			if !unicode.IsGraphic(rune(c)) && !unicode.IsSpace(rune(c)) {
+				t.Skipf("skipping %#q: contains non-graphic character %q", s, c)
+			}
+			if runtime.GOOS == "windows" && c == '\r' || c == '\n' {
+				t.Skipf("skipping %#q on Windows: contains unescapable character %q", s, c)
+			}
+		}
+
+		var b bytes.Buffer
+		if runtime.GOOS == "windows" {
+			b.WriteString("@echo off\n")
+		}
+		PrintEnv(&b, []cfg.EnvVar{{Name: "var", Value: s}})
+		var want string
+		if runtime.GOOS == "windows" {
+			fmt.Fprintf(&b, "echo \"%%var%%\"\n")
+			want += "\"" + s + "\"\r\n"
+		} else {
+			fmt.Fprintf(&b, "printf '%%s\\n' \"$var\"\n")
+			want += s + "\n"
+		}
+		scriptfilename := "script.sh"
+		if runtime.GOOS == "windows" {
+			scriptfilename = "script.bat"
+		}
+		var cmd *exec.Cmd
+		if runtime.GOOS == "windows" {
+			scriptfile := filepath.Join(t.TempDir(), scriptfilename)
+			if err := os.WriteFile(scriptfile, b.Bytes(), 0777); err != nil {
+				t.Fatal(err)
+			}
+			cmd = testenv.Command(t, "cmd.exe", "/C", scriptfile)
+		} else {
+			cmd = testenv.Command(t, "sh", "-c", b.String())
+		}
+		out, err := cmd.Output()
+		t.Log(string(out))
+		if err != nil {
+			t.Fatal(err)
+		}
+
+		if string(out) != want {
+			t.Fatalf("output of running PrintEnv script and echoing variable: got: %q, want: %q",
+				string(out), want)
+		}
+	})
+}
diff --git a/src/cmd/go/internal/fsys/fsys.go b/src/cmd/go/internal/fsys/fsys.go
index 454574a..b83c5a3 100644
--- a/src/cmd/go/internal/fsys/fsys.go
+++ b/src/cmd/go/internal/fsys/fsys.go
@@ -48,9 +48,9 @@
 	traceFile *os.File
 	traceMu   sync.Mutex
 
-	gofsystrace      = godebug.New("gofsystrace")
-	gofsystracelog   = godebug.New("gofsystracelog")
-	gofsystracestack = godebug.New("gofsystracestack")
+	gofsystrace      = godebug.New("#gofsystrace")
+	gofsystracelog   = godebug.New("#gofsystracelog")
+	gofsystracestack = godebug.New("#gofsystracestack")
 )
 
 func init() {
@@ -295,6 +295,10 @@
 // return an error.
 var errNotDir = errors.New("not a directory")
 
+func nonFileInOverlayError(overlayPath string) error {
+	return fmt.Errorf("replacement path %q is a directory, not a file", overlayPath)
+}
+
 // readDir reads a dir on disk, returning an error that is errNotDir if the dir is not a directory.
 // Unfortunately, the error returned by os.ReadDir if dir is not a directory
 // can vary depending on the OS (Linux, Mac, Windows return ENOTDIR; BSD returns EINVAL).
@@ -354,18 +358,21 @@
 		case to.isDeleted():
 			delete(files, name)
 		default:
-			// This is a regular file.
-			f, err := os.Lstat(to.actualFilePath)
+			// To keep the data model simple, if the overlay contains a symlink we
+			// always stat through it (using Stat, not Lstat). That way we don't need
+			// to worry about the interaction between Lstat and directories: if a
+			// symlink in the overlay points to a directory, we reject it like an
+			// ordinary directory.
+			fi, err := os.Stat(to.actualFilePath)
 			if err != nil {
 				files[name] = missingFile(name)
 				continue
-			} else if f.IsDir() {
-				return nil, fmt.Errorf("for overlay of %q to %q: overlay Replace entries can't point to directories",
-					filepath.Join(dir, name), to.actualFilePath)
+			} else if fi.IsDir() {
+				return nil, &fs.PathError{Op: "Stat", Path: filepath.Join(dir, name), Err: nonFileInOverlayError(to.actualFilePath)}
 			}
 			// Add a fileinfo for the overlaid file, so that it has
 			// the original file's name, but the overlaid file's metadata.
-			files[name] = fakeFile{name, f}
+			files[name] = fakeFile{name, fi}
 		}
 	}
 	sortedFiles := diskfis[:0]
@@ -541,14 +548,22 @@
 
 	switch {
 	case node.isDeleted():
-		return nil, &fs.PathError{Op: "lstat", Path: cpath, Err: fs.ErrNotExist}
+		return nil, &fs.PathError{Op: opName, Path: cpath, Err: fs.ErrNotExist}
 	case node.isDir():
 		return fakeDir(filepath.Base(path)), nil
 	default:
-		fi, err := osStat(node.actualFilePath)
+		// To keep the data model simple, if the overlay contains a symlink we
+		// always stat through it (using Stat, not Lstat). That way we don't need to
+		// worry about the interaction between Lstat and directories: if a symlink
+		// in the overlay points to a directory, we reject it like an ordinary
+		// directory.
+		fi, err := os.Stat(node.actualFilePath)
 		if err != nil {
 			return nil, err
 		}
+		if fi.IsDir() {
+			return nil, &fs.PathError{Op: opName, Path: cpath, Err: nonFileInOverlayError(node.actualFilePath)}
+		}
 		return fakeFile{name: filepath.Base(path), real: fi}, nil
 	}
 }
@@ -568,6 +583,10 @@
 func (f fakeFile) IsDir() bool        { return f.real.IsDir() }
 func (f fakeFile) Sys() any           { return f.real.Sys() }
 
+func (f fakeFile) String() string {
+	return fs.FormatFileInfo(f)
+}
+
 // missingFile provides an fs.FileInfo for an overlaid file where the
 // destination file in the overlay doesn't exist. It returns zero values
 // for the fileInfo methods other than Name, set to the file's name, and Mode
@@ -581,6 +600,10 @@
 func (f missingFile) IsDir() bool        { return false }
 func (f missingFile) Sys() any           { return nil }
 
+func (f missingFile) String() string {
+	return fs.FormatFileInfo(f)
+}
+
 // fakeDir provides an fs.FileInfo implementation for directories that are
 // implicitly created by overlaid files. Each directory in the
 // path of an overlaid file is considered to exist in the overlay filesystem.
@@ -593,6 +616,10 @@
 func (f fakeDir) IsDir() bool        { return true }
 func (f fakeDir) Sys() any           { return nil }
 
+func (f fakeDir) String() string {
+	return fs.FormatFileInfo(f)
+}
+
 // Glob is like filepath.Glob but uses the overlay file system.
 func Glob(pattern string) (matches []string, err error) {
 	Trace("Glob", pattern)
diff --git a/src/cmd/go/internal/fsys/fsys_test.go b/src/cmd/go/internal/fsys/fsys_test.go
index b441e19..2ab2bb2 100644
--- a/src/cmd/go/internal/fsys/fsys_test.go
+++ b/src/cmd/go/internal/fsys/fsys_test.go
@@ -827,7 +827,7 @@
 	testenv.MustHaveSymlink(t)
 
 	initOverlay(t, `{
-	"Replace": {"overlay_symlink": "symlink"}
+	"Replace": {"overlay_symlink/file": "symlink/file"}
 }
 -- dir/file --`)
 
@@ -841,11 +841,15 @@
 		dir       string
 		wantFiles []string
 	}{
-		{"control", "dir", []string{"dir", "dir" + string(filepath.Separator) + "file"}},
+		{"control", "dir", []string{"dir", filepath.Join("dir", "file")}},
 		// ensure Walk doesn't walk into the directory pointed to by the symlink
 		// (because it's supposed to use Lstat instead of Stat).
 		{"symlink_to_dir", "symlink", []string{"symlink"}},
-		{"overlay_to_symlink_to_dir", "overlay_symlink", []string{"overlay_symlink"}},
+		{"overlay_to_symlink_to_dir", "overlay_symlink", []string{"overlay_symlink", filepath.Join("overlay_symlink", "file")}},
+
+		// However, adding filepath.Separator should cause the link to be resolved.
+		{"symlink_with_slash", "symlink" + string(filepath.Separator), []string{"symlink" + string(filepath.Separator), filepath.Join("symlink", "file")}},
+		{"overlay_to_symlink_to_dir", "overlay_symlink" + string(filepath.Separator), []string{"overlay_symlink" + string(filepath.Separator), filepath.Join("overlay_symlink", "file")}},
 	}
 
 	for _, tc := range testCases {
@@ -853,6 +857,7 @@
 			var got []string
 
 			err := Walk(tc.dir, func(path string, info fs.FileInfo, err error) error {
+				t.Logf("walk %q", path)
 				got = append(got, path)
 				if err != nil {
 					t.Errorf("walkfn: got non nil err argument: %v, want nil err argument", err)
diff --git a/src/cmd/go/internal/generate/generate.go b/src/cmd/go/internal/generate/generate.go
index 3eda6c7..f1f4a6c 100644
--- a/src/cmd/go/internal/generate/generate.go
+++ b/src/cmd/go/internal/generate/generate.go
@@ -18,6 +18,7 @@
 	"os/exec"
 	"path/filepath"
 	"regexp"
+	"slices"
 	"strconv"
 	"strings"
 
@@ -89,6 +90,11 @@
 		generator, containing the Go toolchain and standard library.
 	$DOLLAR
 		A dollar sign.
+	$PATH
+		The $PATH of the parent process, with $GOROOT/bin
+		placed at the beginning. This causes generators
+		that execute 'go' commands to use the same 'go'
+		as the parent 'go generate' command.
 
 Other than variable substitution and quoted-string evaluation, no
 special processing such as "globbing" is performed on the command
@@ -461,7 +467,7 @@
 	if g.commands[command] != nil {
 		g.errorf("command %q multiply defined", command)
 	}
-	g.commands[command] = words[2:len(words):len(words)] // force later append to make copy
+	g.commands[command] = slices.Clip(words[2:])
 }
 
 // exec runs the command specified by the argument. The first word is
diff --git a/src/cmd/go/internal/get/get.go b/src/cmd/go/internal/get/get.go
index 1c1f103..06b567a 100644
--- a/src/cmd/go/internal/get/get.go
+++ b/src/cmd/go/internal/get/get.go
@@ -69,6 +69,8 @@
 
 Get never checks out or updates code stored in vendor directories.
 
+For more about build flags, see 'go help build'.
+
 For more about specifying packages, see 'go help packages'.
 
 For more about how 'go get' finds source code to
@@ -258,9 +260,13 @@
 	load1 := func(path string, mode int) *load.Package {
 		if parent == nil {
 			mode := 0 // don't do module or vendor resolution
-			return load.LoadImport(ctx, load.PackageOpts{}, path, base.Cwd(), nil, stk, nil, mode)
+			return load.LoadPackage(ctx, load.PackageOpts{}, path, base.Cwd(), stk, nil, mode)
 		}
-		return load.LoadImport(ctx, load.PackageOpts{}, path, parent.Dir, parent, stk, nil, mode|load.ResolveModule)
+		p, err := load.LoadImport(ctx, load.PackageOpts{}, path, parent.Dir, parent, stk, nil, mode|load.ResolveModule)
+		if err != nil {
+			base.Errorf("%s", err)
+		}
+		return p
 	}
 
 	p := load1(arg, mode)
diff --git a/src/cmd/go/internal/gover/gomod.go b/src/cmd/go/internal/gover/gomod.go
new file mode 100644
index 0000000..4a4ae53
--- /dev/null
+++ b/src/cmd/go/internal/gover/gomod.go
@@ -0,0 +1,43 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package gover
+
+import (
+	"bytes"
+	"strings"
+)
+
+var nl = []byte("\n")
+
+// GoModLookup takes go.mod or go.work content,
+// finds the first line in the file starting with the given key,
+// and returns the value associated with that key.
+//
+// Lookup should only be used with non-factored verbs
+// such as "go" and "toolchain", usually to find versions
+// or version-like strings.
+func GoModLookup(gomod []byte, key string) string {
+	for len(gomod) > 0 {
+		var line []byte
+		line, gomod, _ = bytes.Cut(gomod, nl)
+		line = bytes.TrimSpace(line)
+		if v, ok := parseKey(line, key); ok {
+			return v
+		}
+	}
+	return ""
+}
+
+func parseKey(line []byte, key string) (string, bool) {
+	if !strings.HasPrefix(string(line), key) {
+		return "", false
+	}
+	s := strings.TrimPrefix(string(line), key)
+	if len(s) == 0 || (s[0] != ' ' && s[0] != '\t') {
+		return "", false
+	}
+	s, _, _ = strings.Cut(s, "//") // strip comments
+	return strings.TrimSpace(s), true
+}
diff --git a/src/cmd/go/internal/gover/gover.go b/src/cmd/go/internal/gover/gover.go
new file mode 100644
index 0000000..b2a8261
--- /dev/null
+++ b/src/cmd/go/internal/gover/gover.go
@@ -0,0 +1,254 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package gover implements support for Go toolchain versions like 1.21.0 and 1.21rc1.
+// (For historical reasons, Go does not use semver for its toolchains.)
+// This package provides the same basic analysis that golang.org/x/mod/semver does for semver.
+// It also provides some helpers for extracting versions from go.mod files
+// and for dealing with module.Versions that may use Go versions or semver
+// depending on the module path.
+package gover
+
+import (
+	"cmp"
+)
+
+// A version is a parsed Go version: major[.minor[.patch]][kind[pre]]
+// The numbers are the original decimal strings to avoid integer overflows
+// and since there is very little actual math. (Probably overflow doesn't matter in practice,
+// but at the time this code was written, there was an existing test that used
+// go1.99999999999, which does not fit in an int on 32-bit platforms.
+// The "big decimal" representation avoids the problem entirely.)
+type version struct {
+	major string // decimal
+	minor string // decimal or ""
+	patch string // decimal or ""
+	kind  string // "", "alpha", "beta", "rc"
+	pre   string // decimal or ""
+}
+
+// Compare returns -1, 0, or +1 depending on whether
+// x < y, x == y, or x > y, interpreted as toolchain versions.
+// The versions x and y must not begin with a "go" prefix: just "1.21" not "go1.21".
+// Malformed versions compare less than well-formed versions and equal to each other.
+// The language version "1.21" compares less than the release candidate and eventual releases "1.21rc1" and "1.21.0".
+func Compare(x, y string) int {
+	vx := parse(x)
+	vy := parse(y)
+
+	if c := cmpInt(vx.major, vy.major); c != 0 {
+		return c
+	}
+	if c := cmpInt(vx.minor, vy.minor); c != 0 {
+		return c
+	}
+	if c := cmpInt(vx.patch, vy.patch); c != 0 {
+		return c
+	}
+	if c := cmp.Compare(vx.kind, vy.kind); c != 0 { // "" < alpha < beta < rc
+		return c
+	}
+	if c := cmpInt(vx.pre, vy.pre); c != 0 {
+		return c
+	}
+	return 0
+}
+
+// Max returns the maximum of x and y interpreted as toolchain versions,
+// compared using Compare.
+// If x and y compare equal, Max returns x.
+func Max(x, y string) string {
+	if Compare(x, y) < 0 {
+		return y
+	}
+	return x
+}
+
+// Toolchain returns the maximum of x and y interpreted as toolchain names,
+// compared using Compare(FromToolchain(x), FromToolchain(y)).
+// If x and y compare equal, Max returns x.
+func ToolchainMax(x, y string) string {
+	if Compare(FromToolchain(x), FromToolchain(y)) < 0 {
+		return y
+	}
+	return x
+}
+
+// IsLang reports whether v denotes the overall Go language version
+// and not a specific release. Starting with the Go 1.21 release, "1.x" denotes
+// the overall language version; the first release is "1.x.0".
+// The distinction is important because the relative ordering is
+//
+//	1.21 < 1.21rc1 < 1.21.0
+//
+// meaning that Go 1.21rc1 and Go 1.21.0 will both handle go.mod files that
+// say "go 1.21", but Go 1.21rc1 will not handle files that say "go 1.21.0".
+func IsLang(x string) bool {
+	v := parse(x)
+	return v != version{} && v.patch == "" && v.kind == "" && v.pre == ""
+}
+
+// Lang returns the Go language version. For example, Lang("1.2.3") == "1.2".
+func Lang(x string) string {
+	v := parse(x)
+	if v.minor == "" {
+		return v.major
+	}
+	return v.major + "." + v.minor
+}
+
+// IsPrerelease reports whether v denotes a Go prerelease version.
+func IsPrerelease(x string) bool {
+	return parse(x).kind != ""
+}
+
+// Prev returns the Go major release immediately preceding v,
+// or v itself if v is the first Go major release (1.0) or not a supported
+// Go version.
+//
+// Examples:
+//
+//	Prev("1.2") = "1.1"
+//	Prev("1.3rc4") = "1.2"
+func Prev(x string) string {
+	v := parse(x)
+	if cmpInt(v.minor, "1") <= 0 {
+		return v.major
+	}
+	return v.major + "." + decInt(v.minor)
+}
+
+// IsValid reports whether the version x is valid.
+func IsValid(x string) bool {
+	return parse(x) != version{}
+}
+
+// parse parses the Go version string x into a version.
+// It returns the zero version if x is malformed.
+func parse(x string) version {
+	var v version
+
+	// Parse major version.
+	var ok bool
+	v.major, x, ok = cutInt(x)
+	if !ok {
+		return version{}
+	}
+	if x == "" {
+		// Interpret "1" as "1.0.0".
+		v.minor = "0"
+		v.patch = "0"
+		return v
+	}
+
+	// Parse . before minor version.
+	if x[0] != '.' {
+		return version{}
+	}
+
+	// Parse minor version.
+	v.minor, x, ok = cutInt(x[1:])
+	if !ok {
+		return version{}
+	}
+	if x == "" {
+		// Patch missing is same as "0" for older versions.
+		// Starting in Go 1.21, patch missing is different from explicit .0.
+		if cmpInt(v.minor, "21") < 0 {
+			v.patch = "0"
+		}
+		return v
+	}
+
+	// Parse patch if present.
+	if x[0] == '.' {
+		v.patch, x, ok = cutInt(x[1:])
+		if !ok || x != "" {
+			// Note that we are disallowing prereleases (alpha, beta, rc) for patch releases here (x != "").
+			// Allowing them would be a bit confusing because we already have:
+			//	1.21 < 1.21rc1
+			// But a prerelease of a patch would have the opposite effect:
+			//	1.21.3rc1 < 1.21.3
+			// We've never needed them before, so let's not start now.
+			return version{}
+		}
+		return v
+	}
+
+	// Parse prerelease.
+	i := 0
+	for i < len(x) && (x[i] < '0' || '9' < x[i]) {
+		if x[i] < 'a' || 'z' < x[i] {
+			return version{}
+		}
+		i++
+	}
+	if i == 0 {
+		return version{}
+	}
+	v.kind, x = x[:i], x[i:]
+	if x == "" {
+		return v
+	}
+	v.pre, x, ok = cutInt(x)
+	if !ok || x != "" {
+		return version{}
+	}
+
+	return v
+}
+
+// cutInt scans the leading decimal number at the start of x to an integer
+// and returns that value and the rest of the string.
+func cutInt(x string) (n, rest string, ok bool) {
+	i := 0
+	for i < len(x) && '0' <= x[i] && x[i] <= '9' {
+		i++
+	}
+	if i == 0 || x[0] == '0' && i != 1 {
+		return "", "", false
+	}
+	return x[:i], x[i:], true
+}
+
+// cmpInt returns cmp.Compare(x, y) interpreting x and y as decimal numbers.
+// (Copied from golang.org/x/mod/semver's compareInt.)
+func cmpInt(x, y string) int {
+	if x == y {
+		return 0
+	}
+	if len(x) < len(y) {
+		return -1
+	}
+	if len(x) > len(y) {
+		return +1
+	}
+	if x < y {
+		return -1
+	} else {
+		return +1
+	}
+}
+
+// decInt returns the decimal string decremented by 1, or the empty string
+// if the decimal is all zeroes.
+// (Copied from golang.org/x/mod/module's decDecimal.)
+func decInt(decimal string) string {
+	// Scan right to left turning 0s to 9s until you find a digit to decrement.
+	digits := []byte(decimal)
+	i := len(digits) - 1
+	for ; i >= 0 && digits[i] == '0'; i-- {
+		digits[i] = '9'
+	}
+	if i < 0 {
+		// decimal is all zeros
+		return ""
+	}
+	if i == 0 && digits[i] == '1' && len(digits) > 1 {
+		digits = digits[1:]
+	} else {
+		digits[i]--
+	}
+	return string(digits)
+}
diff --git a/src/cmd/go/internal/gover/gover_test.go b/src/cmd/go/internal/gover/gover_test.go
new file mode 100644
index 0000000..3a0bf10
--- /dev/null
+++ b/src/cmd/go/internal/gover/gover_test.go
@@ -0,0 +1,160 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package gover
+
+import (
+	"reflect"
+	"testing"
+)
+
+func TestCompare(t *testing.T) { test2(t, compareTests, "Compare", Compare) }
+
+var compareTests = []testCase2[string, string, int]{
+	{"", "", 0},
+	{"x", "x", 0},
+	{"", "x", 0},
+	{"1", "1.1", -1},
+	{"1.5", "1.6", -1},
+	{"1.5", "1.10", -1},
+	{"1.6", "1.6.1", -1},
+	{"1.19", "1.19.0", 0},
+	{"1.19rc1", "1.19", -1},
+	{"1.20", "1.20.0", 0},
+	{"1.20rc1", "1.20", -1},
+	{"1.21", "1.21.0", -1},
+	{"1.21", "1.21rc1", -1},
+	{"1.21rc1", "1.21.0", -1},
+	{"1.6", "1.19", -1},
+	{"1.19", "1.19.1", -1},
+	{"1.19rc1", "1.19", -1},
+	{"1.19rc1", "1.19.1", -1},
+	{"1.19rc1", "1.19rc2", -1},
+	{"1.19.0", "1.19.1", -1},
+	{"1.19rc1", "1.19.0", -1},
+	{"1.19alpha3", "1.19beta2", -1},
+	{"1.19beta2", "1.19rc1", -1},
+	{"1.1", "1.99999999999999998", -1},
+	{"1.99999999999999998", "1.99999999999999999", -1},
+}
+
+func TestParse(t *testing.T) { test1(t, parseTests, "parse", parse) }
+
+var parseTests = []testCase1[string, version]{
+	{"1", version{"1", "0", "0", "", ""}},
+	{"1.2", version{"1", "2", "0", "", ""}},
+	{"1.2.3", version{"1", "2", "3", "", ""}},
+	{"1.2rc3", version{"1", "2", "", "rc", "3"}},
+	{"1.20", version{"1", "20", "0", "", ""}},
+	{"1.21", version{"1", "21", "", "", ""}},
+	{"1.21rc3", version{"1", "21", "", "rc", "3"}},
+	{"1.21.0", version{"1", "21", "0", "", ""}},
+	{"1.24", version{"1", "24", "", "", ""}},
+	{"1.24rc3", version{"1", "24", "", "rc", "3"}},
+	{"1.24.0", version{"1", "24", "0", "", ""}},
+	{"1.999testmod", version{"1", "999", "", "testmod", ""}},
+	{"1.99999999999999999", version{"1", "99999999999999999", "", "", ""}},
+}
+
+func TestLang(t *testing.T) { test1(t, langTests, "Lang", Lang) }
+
+var langTests = []testCase1[string, string]{
+	{"1.2rc3", "1.2"},
+	{"1.2.3", "1.2"},
+	{"1.2", "1.2"},
+	{"1", "1.0"},
+	{"1.999testmod", "1.999"},
+}
+
+func TestIsLang(t *testing.T) { test1(t, isLangTests, "IsLang", IsLang) }
+
+var isLangTests = []testCase1[string, bool]{
+	{"1.2rc3", false},
+	{"1.2.3", false},
+	{"1.999testmod", false},
+	{"1.22", true},
+	{"1.21", true},
+	{"1.20", false}, // == 1.20.0
+	{"1.19", false}, // == 1.20.0
+	{"1.3", false},  // == 1.3.0
+	{"1.2", false},  // == 1.2.0
+	{"1", false},    // == 1.0.0
+}
+
+func TestPrev(t *testing.T) { test1(t, prevTests, "Prev", Prev) }
+
+var prevTests = []testCase1[string, string]{
+	{"", ""},
+	{"0", "0"},
+	{"1.3rc4", "1.2"},
+	{"1.3.5", "1.2"},
+	{"1.3", "1.2"},
+	{"1", "1"},
+	{"1.99999999999999999", "1.99999999999999998"},
+	{"1.40000000000000000", "1.39999999999999999"},
+}
+
+func TestIsValid(t *testing.T) { test1(t, isValidTests, "IsValid", IsValid) }
+
+var isValidTests = []testCase1[string, bool]{
+	{"1.2rc3", true},
+	{"1.2.3", true},
+	{"1.999testmod", true},
+	{"1.600+auto", false},
+	{"1.22", true},
+	{"1.21.0", true},
+	{"1.21rc2", true},
+	{"1.21", true},
+	{"1.20.0", true},
+	{"1.20", true},
+	{"1.19", true},
+	{"1.3", true},
+	{"1.2", true},
+	{"1", true},
+}
+
+type testCase1[In, Out any] struct {
+	in  In
+	out Out
+}
+
+type testCase2[In1, In2, Out any] struct {
+	in1 In1
+	in2 In2
+	out Out
+}
+
+type testCase3[In1, In2, In3, Out any] struct {
+	in1 In1
+	in2 In2
+	in3 In3
+	out Out
+}
+
+func test1[In, Out any](t *testing.T, tests []testCase1[In, Out], name string, f func(In) Out) {
+	t.Helper()
+	for _, tt := range tests {
+		if out := f(tt.in); !reflect.DeepEqual(out, tt.out) {
+			t.Errorf("%s(%v) = %v, want %v", name, tt.in, out, tt.out)
+		}
+	}
+}
+
+func test2[In1, In2, Out any](t *testing.T, tests []testCase2[In1, In2, Out], name string, f func(In1, In2) Out) {
+	t.Helper()
+	for _, tt := range tests {
+		if out := f(tt.in1, tt.in2); !reflect.DeepEqual(out, tt.out) {
+			t.Errorf("%s(%+v, %+v) = %+v, want %+v", name, tt.in1, tt.in2, out, tt.out)
+		}
+	}
+}
+
+func test3[In1, In2, In3, Out any](t *testing.T, tests []testCase3[In1, In2, In3, Out], name string, f func(In1, In2, In3) Out) {
+	t.Helper()
+	for _, tt := range tests {
+		if out := f(tt.in1, tt.in2, tt.in3); !reflect.DeepEqual(out, tt.out) {
+			t.Errorf("%s(%+v, %+v, %+v) = %+v, want %+v", name, tt.in1, tt.in2, tt.in3, out, tt.out)
+		}
+	}
+}
diff --git a/src/cmd/go/internal/gover/local.go b/src/cmd/go/internal/gover/local.go
new file mode 100644
index 0000000..8183a5c
--- /dev/null
+++ b/src/cmd/go/internal/gover/local.go
@@ -0,0 +1,42 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package gover
+
+import (
+	"internal/goversion"
+	"runtime"
+	"strconv"
+)
+
+// TestVersion is initialized in the go command test binary
+// to be $TESTGO_VERSION, to allow tests to override the
+// go command's idea of its own version as returned by Local.
+var TestVersion string
+
+// Local returns the local Go version, the one implemented by this go command.
+func Local() string {
+	v, _ := local()
+	return v
+}
+
+// LocalToolchain returns the local toolchain name, the one implemented by this go command.
+func LocalToolchain() string {
+	_, t := local()
+	return t
+}
+
+func local() (goVers, toolVers string) {
+	toolVers = runtime.Version()
+	if TestVersion != "" {
+		toolVers = TestVersion
+	}
+	goVers = FromToolchain(toolVers)
+	if goVers == "" {
+		// Development branch. Use "Dev" version with just 1.N, no rc1 or .0 suffix.
+		goVers = "1." + strconv.Itoa(goversion.Version)
+		toolVers = "go" + goVers
+	}
+	return goVers, toolVers
+}
diff --git a/src/cmd/go/internal/gover/mod.go b/src/cmd/go/internal/gover/mod.go
new file mode 100644
index 0000000..d3cc170
--- /dev/null
+++ b/src/cmd/go/internal/gover/mod.go
@@ -0,0 +1,127 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package gover
+
+import (
+	"sort"
+	"strings"
+
+	"golang.org/x/mod/module"
+	"golang.org/x/mod/semver"
+)
+
+// IsToolchain reports whether the module path corresponds to the
+// virtual, non-downloadable module tracking go or toolchain directives in the go.mod file.
+//
+// Note that IsToolchain only matches "go" and "toolchain", not the
+// real, downloadable module "golang.org/toolchain" containing toolchain files.
+//
+//	IsToolchain("go") = true
+//	IsToolchain("toolchain") = true
+//	IsToolchain("golang.org/x/tools") = false
+//	IsToolchain("golang.org/toolchain") = false
+func IsToolchain(path string) bool {
+	return path == "go" || path == "toolchain"
+}
+
+// ModCompare returns the result of comparing the versions x and y
+// for the module with the given path.
+// The path is necessary because the "go" and "toolchain" modules
+// use a different version syntax and semantics (gover, this package)
+// than most modules (semver).
+func ModCompare(path string, x, y string) int {
+	if path == "go" {
+		return Compare(x, y)
+	}
+	if path == "toolchain" {
+		return Compare(maybeToolchainVersion(x), maybeToolchainVersion(y))
+	}
+	return semver.Compare(x, y)
+}
+
+// ModSort is like module.Sort but understands the "go" and "toolchain"
+// modules and their version ordering.
+func ModSort(list []module.Version) {
+	sort.Slice(list, func(i, j int) bool {
+		mi := list[i]
+		mj := list[j]
+		if mi.Path != mj.Path {
+			return mi.Path < mj.Path
+		}
+		// To help go.sum formatting, allow version/file.
+		// Compare semver prefix by semver rules,
+		// file by string order.
+		vi := mi.Version
+		vj := mj.Version
+		var fi, fj string
+		if k := strings.Index(vi, "/"); k >= 0 {
+			vi, fi = vi[:k], vi[k:]
+		}
+		if k := strings.Index(vj, "/"); k >= 0 {
+			vj, fj = vj[:k], vj[k:]
+		}
+		if vi != vj {
+			return ModCompare(mi.Path, vi, vj) < 0
+		}
+		return fi < fj
+	})
+}
+
+// ModIsValid reports whether vers is a valid version syntax for the module with the given path.
+func ModIsValid(path, vers string) bool {
+	if IsToolchain(path) {
+		if path == "toolchain" {
+			return IsValid(FromToolchain(vers))
+		}
+		return IsValid(vers)
+	}
+	return semver.IsValid(vers)
+}
+
+// ModIsPrefix reports whether v is a valid version syntax prefix for the module with the given path.
+// The caller is assumed to have checked that ModIsValid(path, vers) is true.
+func ModIsPrefix(path, vers string) bool {
+	if IsToolchain(path) {
+		if path == "toolchain" {
+			return IsLang(FromToolchain(vers))
+		}
+		return IsLang(vers)
+	}
+	// Semver
+	dots := 0
+	for i := 0; i < len(vers); i++ {
+		switch vers[i] {
+		case '-', '+':
+			return false
+		case '.':
+			dots++
+			if dots >= 2 {
+				return false
+			}
+		}
+	}
+	return true
+}
+
+// ModIsPrerelease reports whether v is a prerelease version for the module with the given path.
+// The caller is assumed to have checked that ModIsValid(path, vers) is true.
+func ModIsPrerelease(path, vers string) bool {
+	if IsToolchain(path) {
+		return IsPrerelease(vers)
+	}
+	return semver.Prerelease(vers) != ""
+}
+
+// ModMajorMinor returns the "major.minor" truncation of the version v,
+// for use as a prefix in "@patch" queries.
+func ModMajorMinor(path, vers string) string {
+	if IsToolchain(path) {
+		if path == "toolchain" {
+			return "go" + Lang(FromToolchain(vers))
+		}
+		return Lang(vers)
+	}
+	return semver.MajorMinor(vers)
+}
diff --git a/src/cmd/go/internal/gover/mod_test.go b/src/cmd/go/internal/gover/mod_test.go
new file mode 100644
index 0000000..c92169c
--- /dev/null
+++ b/src/cmd/go/internal/gover/mod_test.go
@@ -0,0 +1,72 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package gover
+
+import (
+	"slices"
+	"strings"
+	"testing"
+
+	"golang.org/x/mod/module"
+)
+
+func TestIsToolchain(t *testing.T) { test1(t, isToolchainTests, "IsToolchain", IsToolchain) }
+
+var isToolchainTests = []testCase1[string, bool]{
+	{"go", true},
+	{"toolchain", true},
+	{"anything", false},
+	{"golang.org/toolchain", false},
+}
+
+func TestModCompare(t *testing.T) { test3(t, modCompareTests, "ModCompare", ModCompare) }
+
+var modCompareTests = []testCase3[string, string, string, int]{
+	{"go", "1.2", "1.3", -1},
+	{"go", "v1.2", "v1.3", 0}, // equal because invalid
+	{"go", "1.2", "1.2", 0},
+	{"toolchain", "go1.2", "go1.3", -1},
+	{"toolchain", "go1.2", "go1.2", 0},
+	{"toolchain", "1.2", "1.3", -1},  // accepted but non-standard
+	{"toolchain", "v1.2", "v1.3", 0}, // equal because invalid
+	{"rsc.io/quote", "v1.2", "v1.3", -1},
+	{"rsc.io/quote", "1.2", "1.3", 0}, // equal because invalid
+}
+
+func TestModIsValid(t *testing.T) { test2(t, modIsValidTests, "ModIsValid", ModIsValid) }
+
+var modIsValidTests = []testCase2[string, string, bool]{
+	{"go", "1.2", true},
+	{"go", "v1.2", false},
+	{"toolchain", "go1.2", true},
+	{"toolchain", "v1.2", false},
+	{"rsc.io/quote", "v1.2", true},
+	{"rsc.io/quote", "1.2", false},
+}
+
+func TestModSort(t *testing.T) {
+	test1(t, modSortTests, "ModSort", func(list []module.Version) []module.Version {
+		out := slices.Clone(list)
+		ModSort(out)
+		return out
+	})
+}
+
+var modSortTests = []testCase1[[]module.Version, []module.Version]{
+	{
+		mvl(`z v1.1; a v1.2; a v1.1; go 1.3; toolchain 1.3; toolchain 1.2; go 1.2`),
+		mvl(`a v1.1; a v1.2; go 1.2; go 1.3; toolchain 1.2; toolchain 1.3; z v1.1`),
+	},
+}
+
+func mvl(s string) []module.Version {
+	var list []module.Version
+	for _, f := range strings.Split(s, ";") {
+		f = strings.TrimSpace(f)
+		path, vers, _ := strings.Cut(f, " ")
+		list = append(list, module.Version{Path: path, Version: vers})
+	}
+	return list
+}
diff --git a/src/cmd/go/internal/gover/toolchain.go b/src/cmd/go/internal/gover/toolchain.go
new file mode 100644
index 0000000..a24df98
--- /dev/null
+++ b/src/cmd/go/internal/gover/toolchain.go
@@ -0,0 +1,98 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package gover
+
+import (
+	"cmd/go/internal/base"
+	"context"
+	"errors"
+	"fmt"
+	"strings"
+)
+
+// FromToolchain returns the Go version for the named toolchain,
+// derived from the name itself (not by running the toolchain).
+// A toolchain is named "goVERSION".
+// A suffix after the VERSION introduced by a -, space, or tab is removed.
+// Examples:
+//
+//	FromToolchain("go1.2.3") == "1.2.3"
+//	FromToolchain("go1.2.3-bigcorp") == "1.2.3"
+//	FromToolchain("invalid") == ""
+func FromToolchain(name string) string {
+	if strings.ContainsAny(name, "\\/") {
+		// The suffix must not include a path separator, since that would cause
+		// exec.LookPath to resolve it from a relative directory instead of from
+		// $PATH.
+		return ""
+	}
+
+	var v string
+	if strings.HasPrefix(name, "go") {
+		v = name[2:]
+	} else {
+		return ""
+	}
+	// Some builds use custom suffixes; strip them.
+	if i := strings.IndexAny(v, " \t-"); i >= 0 {
+		v = v[:i]
+	}
+	if !IsValid(v) {
+		return ""
+	}
+	return v
+}
+
+func maybeToolchainVersion(name string) string {
+	if IsValid(name) {
+		return name
+	}
+	return FromToolchain(name)
+}
+
+// Startup records the information that went into the startup-time version switch.
+// It is initialized by switchGoToolchain.
+var Startup struct {
+	GOTOOLCHAIN   string // $GOTOOLCHAIN setting
+	AutoFile      string // go.mod or go.work file consulted
+	AutoGoVersion string // go line found in file
+	AutoToolchain string // toolchain line found in file
+}
+
+// A TooNewError explains that a module is too new for this version of Go.
+type TooNewError struct {
+	What      string
+	GoVersion string
+	Toolchain string // for callers if they want to use it, but not printed
+}
+
+func (e *TooNewError) Error() string {
+	var explain string
+	if Startup.GOTOOLCHAIN != "" && Startup.GOTOOLCHAIN != "auto" {
+		explain = "; GOTOOLCHAIN=" + Startup.GOTOOLCHAIN
+	}
+	if Startup.AutoFile != "" && (Startup.AutoGoVersion != "" || Startup.AutoToolchain != "") {
+		explain += fmt.Sprintf("; %s sets ", base.ShortPath(Startup.AutoFile))
+		if Startup.AutoToolchain != "" {
+			explain += "toolchain " + Startup.AutoToolchain
+		} else {
+			explain += "go " + Startup.AutoGoVersion
+		}
+	}
+	return fmt.Sprintf("%v requires go >= %v (running go %v%v)", e.What, e.GoVersion, Local(), explain)
+}
+
+var ErrTooNew = errors.New("module too new")
+
+func (e *TooNewError) Is(err error) bool {
+	return err == ErrTooNew
+}
+
+// A Switcher provides the ability to switch to a new toolchain in response to TooNewErrors.
+// See [cmd/go/internal/toolchain.Switcher] for documentation.
+type Switcher interface {
+	Error(err error)
+	Switch(ctx context.Context)
+}
diff --git a/src/cmd/go/internal/gover/toolchain_test.go b/src/cmd/go/internal/gover/toolchain_test.go
new file mode 100644
index 0000000..d1c22fb
--- /dev/null
+++ b/src/cmd/go/internal/gover/toolchain_test.go
@@ -0,0 +1,19 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package gover
+
+import "testing"
+
+func TestFromToolchain(t *testing.T) { test1(t, fromToolchainTests, "FromToolchain", FromToolchain) }
+
+var fromToolchainTests = []testCase1[string, string]{
+	{"go1.2.3", "1.2.3"},
+	{"1.2.3", ""},
+	{"go1.2.3+bigcorp", ""},
+	{"go1.2.3-bigcorp", "1.2.3"},
+	{"go1.2.3-bigcorp more text", "1.2.3"},
+	{"gccgo-go1.23rc4", ""},
+	{"gccgo-go1.23rc4-bigdwarf", ""},
+}
diff --git a/src/cmd/go/internal/gover/version.go b/src/cmd/go/internal/gover/version.go
new file mode 100644
index 0000000..2681013
--- /dev/null
+++ b/src/cmd/go/internal/gover/version.go
@@ -0,0 +1,74 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package gover
+
+import "golang.org/x/mod/modfile"
+
+const (
+	// narrowAllVersion is the Go version at which the
+	// module-module "all" pattern no longer closes over the dependencies of
+	// tests outside of the main module.
+	NarrowAllVersion = "1.16"
+
+	// DefaultGoModVersion is the Go version to assume for go.mod files
+	// that do not declare a Go version. The go command has been
+	// writing go versions to modules since Go 1.12, so a go.mod
+	// without a version is either very old or recently hand-written.
+	// Since we can't tell which, we have to assume it's very old.
+	// The semantics of the go.mod changed at Go 1.17 to support
+	// graph pruning. If see a go.mod without a go line, we have to
+	// assume Go 1.16 so that we interpret the requirements correctly.
+	// Note that this default must stay at Go 1.16; it cannot be moved forward.
+	DefaultGoModVersion = "1.16"
+
+	// DefaultGoWorkVersion is the Go version to assume for go.work files
+	// that do not declare a Go version. Workspaces were added in Go 1.18,
+	// so use that.
+	DefaultGoWorkVersion = "1.18"
+
+	// ExplicitIndirectVersion is the Go version at which a
+	// module's go.mod file is expected to list explicit requirements on every
+	// module that provides any package transitively imported by that module.
+	//
+	// Other indirect dependencies of such a module can be safely pruned out of
+	// the module graph; see https://golang.org/ref/mod#graph-pruning.
+	ExplicitIndirectVersion = "1.17"
+
+	// separateIndirectVersion is the Go version at which
+	// "// indirect" dependencies are added in a block separate from the direct
+	// ones. See https://golang.org/issue/45965.
+	SeparateIndirectVersion = "1.17"
+
+	// tidyGoModSumVersion is the Go version at which
+	// 'go mod tidy' preserves go.mod checksums needed to build test dependencies
+	// of packages in "all", so that 'go test all' can be run without checksum
+	// errors.
+	// See https://go.dev/issue/56222.
+	TidyGoModSumVersion = "1.21"
+
+	// goStrictVersion is the Go version at which the Go versions
+	// became "strict" in the sense that, restricted to modules at this version
+	// or later, every module must have a go version line ≥ all its dependencies.
+	// It is also the version after which "too new" a version is considered a fatal error.
+	GoStrictVersion = "1.21"
+)
+
+// FromGoMod returns the go version from the go.mod file.
+// It returns DefaultGoModVersion if the go.mod file does not contain a go line or if mf is nil.
+func FromGoMod(mf *modfile.File) string {
+	if mf == nil || mf.Go == nil {
+		return DefaultGoModVersion
+	}
+	return mf.Go.Version
+}
+
+// FromGoWork returns the go version from the go.mod file.
+// It returns DefaultGoWorkVersion if the go.mod file does not contain a go line or if wf is nil.
+func FromGoWork(wf *modfile.WorkFile) string {
+	if wf == nil || wf.Go == nil {
+		return DefaultGoWorkVersion
+	}
+	return wf.Go.Version
+}
diff --git a/src/cmd/go/internal/help/help.go b/src/cmd/go/internal/help/help.go
index 804c910..aeaba78 100644
--- a/src/cmd/go/internal/help/help.go
+++ b/src/cmd/go/internal/help/help.go
@@ -27,8 +27,8 @@
 		fmt.Fprintln(w, "// Use of this source code is governed by a BSD-style")
 		fmt.Fprintln(w, "// license that can be found in the LICENSE file.")
 		fmt.Fprintln(w)
-		fmt.Fprintln(w, "// Code generated by mkalldocs.sh; DO NOT EDIT.")
-		fmt.Fprintln(w, "// Edit the documentation in other files and rerun mkalldocs.sh to generate this one.")
+		fmt.Fprintln(w, "// Code generated by 'go test cmd/go -v -run=TestDocsUpToDate -fixdocs'; DO NOT EDIT.")
+		fmt.Fprintln(w, "// Edit the documentation in other files and then execute 'go generate cmd/go' to generate this one.")
 		fmt.Fprintln(w)
 		buf := new(strings.Builder)
 		PrintUsage(buf, base.Go)
diff --git a/src/cmd/go/internal/help/helpdoc.go b/src/cmd/go/internal/help/helpdoc.go
index dddb785..68ac4d2 100644
--- a/src/cmd/go/internal/help/helpdoc.go
+++ b/src/cmd/go/internal/help/helpdoc.go
@@ -34,7 +34,7 @@
 	Long: `
 Many commands apply to a set of packages:
 
-	go action [packages]
+	go <action> [packages]
 
 Usually, [packages] is a list of import paths.
 
@@ -471,9 +471,9 @@
 	Long: `
 
 The go command and the tools it invokes consult environment variables
-for configuration. If an environment variable is unset, the go command
-uses a sensible default setting. To see the effective setting of the
-variable <NAME>, run 'go env <NAME>'. To change the default setting,
+for configuration. If an environment variable is unset or empty, the go
+command uses a sensible default setting. To see the effective setting of
+the variable <NAME>, run 'go env <NAME>'. To change the default setting,
 run 'go env -w <NAME>=<VALUE>'. Defaults changed using 'go env -w'
 are recorded in a Go environment configuration file stored in the
 per-user configuration directory, as reported by os.UserConfigDir.
@@ -501,7 +501,7 @@
 	GOMODCACHE
 		The directory where the go command will store downloaded modules.
 	GODEBUG
-		Enable various debugging facilities. See 'go doc runtime'
+		Enable various debugging facilities. See https://go.dev/doc/godebug
 		for details.
 	GOENV
 		The location of the Go environment configuration file.
@@ -525,7 +525,7 @@
 		The operating system for which to compile code.
 		Examples are linux, darwin, windows, netbsd.
 	GOPATH
-		For more details see: 'go help gopath'.
+		Controls where various files are stored. See: 'go help gopath'.
 	GOPROXY
 		URL of Go module proxy. See https://golang.org/ref/mod#environment-variables
 		and https://golang.org/ref/mod#module-proxy for details.
@@ -539,6 +539,8 @@
 	GOSUMDB
 		The name of checksum database to use and optionally its public key and
 		URL. See https://golang.org/ref/mod#authenticating.
+	GOTOOLCHAIN
+		Controls which Go toolchain is used. See https://go.dev/doc/toolchain.
 	GOTMPDIR
 		The directory where the go command will write
 		temporary source files, packages, and binaries.
diff --git a/src/cmd/go/internal/imports/build.go b/src/cmd/go/internal/imports/build.go
index be308ce..3a4a66b 100644
--- a/src/cmd/go/internal/imports/build.go
+++ b/src/cmd/go/internal/imports/build.go
@@ -323,6 +323,7 @@
 	"openbsd":   true,
 	"plan9":     true,
 	"solaris":   true,
+	"wasip1":    true,
 	"windows":   true,
 	"zos":       true,
 }
diff --git a/src/cmd/go/internal/list/context.go b/src/cmd/go/internal/list/context.go
index 2dc6376..9d6494c 100644
--- a/src/cmd/go/internal/list/context.go
+++ b/src/cmd/go/internal/list/context.go
@@ -14,7 +14,7 @@
 	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
+	UseAllFiles   bool     `json:",omitempty"` // use files regardless of //go: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
 	ToolTags      []string `json:",omitempty"` // toolchain-specific build constraints
diff --git a/src/cmd/go/internal/list/list.go b/src/cmd/go/internal/list/list.go
index 811d659..92020da 100644
--- a/src/cmd/go/internal/list/list.go
+++ b/src/cmd/go/internal/list/list.go
@@ -10,15 +10,20 @@
 	"bytes"
 	"context"
 	"encoding/json"
+	"errors"
 	"fmt"
 	"io"
 	"os"
 	"reflect"
+	"runtime"
 	"sort"
 	"strconv"
 	"strings"
+	"sync"
 	"text/template"
 
+	"golang.org/x/sync/semaphore"
+
 	"cmd/go/internal/base"
 	"cmd/go/internal/cache"
 	"cmd/go/internal/cfg"
@@ -52,44 +57,45 @@
 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?
-        StaleReason   string   // explanation for Stale==true
-        Root          string   // Go root or Go path dir containing this package
-        ConflictDir   string   // this directory shadows Dir in $GOPATH
-        BinaryOnly    bool     // binary-only package (no longer supported)
-        ForTest       string   // package is only for use in named test
-        Export        string   // file containing export data (when using -export)
-        BuildID       string   // build ID of the compiled package (when using -export)
-        Module        *Module  // info about package's containing module, if any (can be nil)
-        Match         []string // command-line patterns matching this package
-        DepOnly       bool     // package is only a dependency, not explicitly listed
+        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?
+        StaleReason    string   // explanation for Stale==true
+        Root           string   // Go root or Go path dir containing this package
+        ConflictDir    string   // this directory shadows Dir in $GOPATH
+        BinaryOnly     bool     // binary-only package (no longer supported)
+        ForTest        string   // package is only for use in named test
+        Export         string   // file containing export data (when using -export)
+        BuildID        string   // build ID of the compiled package (when using -export)
+        Module         *Module  // info about package's containing module, if any (can be nil)
+        Match          []string // command-line patterns matching this package
+        DepOnly        bool     // package is only a dependency, not explicitly listed
+        DefaultGODEBUG string  // default GODEBUG setting, for main packages
 
         // Source files
-        GoFiles         []string   // .go source files (excluding CgoFiles, TestGoFiles, XTestGoFiles)
-        CgoFiles        []string   // .go source files that import "C"
-        CompiledGoFiles []string   // .go files presented to compiler (when using -compiled)
-        IgnoredGoFiles  []string   // .go source files ignored due to build constraints
+        GoFiles           []string   // .go source files (excluding CgoFiles, TestGoFiles, XTestGoFiles)
+        CgoFiles          []string   // .go source files that import "C"
+        CompiledGoFiles   []string   // .go files presented to compiler (when using -compiled)
+        IgnoredGoFiles    []string   // .go source files ignored due to build constraints
         IgnoredOtherFiles []string // non-.go source files 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
-        FFiles          []string   // .f, .F, .for and .f90 Fortran source files
-        SFiles          []string   // .s source files
-        SwigFiles       []string   // .swig files
-        SwigCXXFiles    []string   // .swigcxx files
-        SysoFiles       []string   // .syso object files to add to archive
-        TestGoFiles     []string   // _test.go files in package
-        XTestGoFiles    []string   // _test.go files outside package
+        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
+        FFiles            []string   // .f, .F, .for and .f90 Fortran source files
+        SFiles            []string   // .s source files
+        SwigFiles         []string   // .swig files
+        SwigCXXFiles      []string   // .swigcxx files
+        SysoFiles         []string   // .syso object files to add to archive
+        TestGoFiles       []string   // _test.go files in package
+        XTestGoFiles      []string   // _test.go files outside package
 
         // Embedded files
         EmbedPatterns      []string // //go:embed patterns
@@ -147,9 +153,9 @@
         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
+        UseAllFiles   bool     // use files regardless of //go:build lines, file names
         Compiler      string   // compiler to assume when computing target paths
-        BuildTags     []string // build constraints to match in +build lines
+        BuildTags     []string // build constraints to match in //go:build lines
         ToolTags      []string // toolchain-specific build constraints
         ReleaseTags   []string // releases the current release is compatible with
         InstallSuffix string   // suffix to use in the name of the install dir
@@ -192,6 +198,8 @@
 
 The -find flag causes list to identify the named packages but not
 resolve their dependencies: the Imports and Deps lists will be empty.
+With the -find flag, the -deps, -test and -export commands cannot be
+used.
 
 The -test flag causes list to report not only the named packages
 but also their test binaries (for packages with tests), to convey to
@@ -445,7 +453,7 @@
 				// Clear all non-requested fields.
 				for i := 0; i < v.NumField(); i++ {
 					if !listJsonFields.needAny(v.Type().Field(i).Name) {
-						v.Field(i).Set(reflect.Zero(v.Type().Field(i).Type))
+						v.Field(i).SetZero()
 					}
 				}
 			}
@@ -562,11 +570,11 @@
 		if !*listE {
 			for _, m := range mods {
 				if m.Error != nil {
-					base.Errorf("go: %v", m.Error.Err)
+					base.Error(errors.New(m.Error.Err))
 				}
 			}
 			if err != nil {
-				base.Errorf("go: %v", err)
+				base.Error(err)
 			}
 			base.ExitIfErrors()
 		}
@@ -591,19 +599,16 @@
 	if *listFind && *listTest {
 		base.Fatalf("go list -test cannot be used with -find")
 	}
+	if *listFind && *listExport {
+		base.Fatalf("go list -export cannot be used with -find")
+	}
 
 	pkgOpts := load.PackageOpts{
-		IgnoreImports:   *listFind,
-		ModResolveTests: *listTest,
-		AutoVCS:         true,
-		// SuppressDeps is set if the user opts to explicitly ask for the json fields they
-		// need, don't ask for Deps or DepsErrors. It's not set when using a template string,
-		// even if *listFmt doesn't contain .Deps because Deps are used to find import cycles
-		// for test variants of packages and users who have been providing format strings
-		// might not expect those errors to stop showing up.
-		// See issue #52443.
-		SuppressDeps:      !listJsonFields.needAny("Deps", "DepsErrors"),
-		SuppressBuildInfo: !listJsonFields.needAny("Stale", "StaleReason"),
+		IgnoreImports:      *listFind,
+		ModResolveTests:    *listTest,
+		AutoVCS:            true,
+		SuppressBuildInfo:  !*listExport && !listJsonFields.needAny("Stale", "StaleReason"),
+		SuppressEmbedFiles: !*listExport && !listJsonFields.needAny("EmbedFiles", "TestEmbedFiles", "XTestEmbedFiles"),
 	}
 	pkgs := load.PackagesAndErrors(ctx, pkgOpts, args)
 	if !*listE {
@@ -620,38 +625,46 @@
 		base.ExitIfErrors()
 	}
 
-	if cache.Default() == nil {
-		// These flags return file names pointing into the build cache,
-		// so the build cache must exist.
-		if *listCompiled {
-			base.Fatalf("go list -compiled requires build cache")
-		}
-		if *listExport {
-			base.Fatalf("go list -export requires build cache")
-		}
-		if *listTest {
-			base.Fatalf("go list -test requires build cache")
-		}
-	}
-
 	if *listTest {
 		c := cache.Default()
 		// Add test binaries to packages to be listed.
+
+		var wg sync.WaitGroup
+		sema := semaphore.NewWeighted(int64(runtime.GOMAXPROCS(0)))
+		type testPackageSet struct {
+			p, pmain, ptest, pxtest *load.Package
+		}
+		var testPackages []testPackageSet
 		for _, p := range pkgs {
 			if len(p.TestGoFiles)+len(p.XTestGoFiles) > 0 {
 				var pmain, ptest, pxtest *load.Package
 				var err error
 				if *listE {
-					pmain, ptest, pxtest = load.TestPackagesAndErrors(ctx, pkgOpts, p, nil)
+					sema.Acquire(ctx, 1)
+					wg.Add(1)
+					done := func() {
+						sema.Release(1)
+						wg.Done()
+					}
+					pmain, ptest, pxtest = load.TestPackagesAndErrors(ctx, done, pkgOpts, p, nil)
 				} else {
 					pmain, ptest, pxtest, err = load.TestPackagesFor(ctx, pkgOpts, p, nil)
 					if err != nil {
-						base.Errorf("can't load test package: %s", err)
+						base.Fatalf("go: can't load test package: %s", err)
 					}
 				}
-				if pmain != nil {
-					pkgs = append(pkgs, pmain)
-					data := *pmain.Internal.TestmainGo
+				testPackages = append(testPackages, testPackageSet{p, pmain, ptest, pxtest})
+			}
+		}
+		wg.Wait()
+		for _, pkgset := range testPackages {
+			p, pmain, ptest, pxtest := pkgset.p, pkgset.pmain, pkgset.ptest, pkgset.pxtest
+			if pmain != nil {
+				pkgs = append(pkgs, pmain)
+				data := *pmain.Internal.TestmainGo
+				sema.Acquire(ctx, 1)
+				wg.Add(1)
+				go func() {
 					h := cache.NewHash("testmain")
 					h.Write([]byte("testmain\n"))
 					h.Write(data)
@@ -660,15 +673,20 @@
 						base.Fatalf("%s", err)
 					}
 					pmain.GoFiles[0] = c.OutputFile(out)
-				}
-				if ptest != nil && ptest != p {
-					pkgs = append(pkgs, ptest)
-				}
-				if pxtest != nil {
-					pkgs = append(pkgs, pxtest)
-				}
+					sema.Release(1)
+					wg.Done()
+				}()
+
+			}
+			if ptest != nil && ptest != p {
+				pkgs = append(pkgs, ptest)
+			}
+			if pxtest != nil {
+				pkgs = append(pkgs, pxtest)
 			}
 		}
+
+		wg.Wait()
 	}
 
 	// Remember which packages are named on the command line.
@@ -698,7 +716,7 @@
 		}
 		defer func() {
 			if err := b.Close(); err != nil {
-				base.Fatalf("go: %v", err)
+				base.Fatal(err)
 			}
 		}()
 
@@ -712,6 +730,9 @@
 				a.Deps = append(a.Deps, b.AutoAction(work.ModeInstall, work.ModeInstall, p))
 			}
 		}
+		if cfg.Experiment.CoverageRedesign && cfg.BuildCover {
+			load.PrepareForCoverageBuild(pkgs)
+		}
 		b.Do(ctx, a)
 	}
 
@@ -726,19 +747,20 @@
 		}
 	}
 
-	if *listTest {
+	if *listTest || (cfg.BuildPGO == "auto" && len(cmdline) > 1) {
 		all := pkgs
 		if !*listDeps {
 			all = loadPackageList(pkgs)
 		}
 		// Update import paths to distinguish the real package p
-		// from p recompiled for q.test.
+		// from p recompiled for q.test, or to distinguish between
+		// p compiled with different PGO profiles.
 		// This must happen only once the build code is done
 		// looking at import paths, because it will get very confused
 		// if it sees these.
 		old := make(map[string]string)
 		for _, p := range all {
-			if p.ForTest != "" {
+			if p.ForTest != "" || p.Internal.ForMain != "" {
 				new := p.Desc()
 				old[new] = p.ImportPath
 				p.ImportPath = new
@@ -749,7 +771,7 @@
 		m := make(map[string]string)
 		for _, p := range all {
 			for _, p1 := range p.Internal.Imports {
-				if p1.ForTest != "" {
+				if p1.ForTest != "" || p1.Internal.ForMain != "" {
 					m[old[p1.ImportPath]] = p1.ImportPath
 				}
 			}
@@ -762,20 +784,30 @@
 				delete(m, old)
 			}
 		}
-		// Recompute deps lists using new strings, from the leaves up.
-		for _, p := range all {
-			deps := make(map[string]bool)
-			for _, p1 := range p.Internal.Imports {
-				deps[p1.ImportPath] = true
-				for _, d := range p1.Deps {
-					deps[d] = true
-				}
+	}
+
+	if listJsonFields.needAny("Deps", "DepsErrors") {
+		all := pkgs
+		// Make sure we iterate through packages in a postorder traversal,
+		// which load.PackageList guarantees. If *listDeps, then all is
+		// already in PackageList order. Otherwise, calling load.PackageList
+		// provides the guarantee. In the case of an import cycle, the last package
+		// visited in the cycle, importing the first encountered package in the cycle,
+		// is visited first. The cycle import error will be bubbled up in the traversal
+		// order up to the first package in the cycle, covering all the packages
+		// in the cycle.
+		if !*listDeps {
+			all = load.PackageList(pkgs)
+		}
+		if listJsonFields.needAny("Deps") {
+			for _, p := range all {
+				collectDeps(p)
 			}
-			p.Deps = make([]string, 0, len(deps))
-			for d := range deps {
-				p.Deps = append(p.Deps, d)
+		}
+		if listJsonFields.needAny("DepsErrors") {
+			for _, p := range all {
+				collectDepsErrors(p)
 			}
-			sort.Strings(p.Deps)
 		}
 	}
 
@@ -819,7 +851,7 @@
 			}
 			rmods, err := modload.ListModules(ctx, args, mode, *listReuse)
 			if err != nil && !*listE {
-				base.Errorf("go: %v", err)
+				base.Error(err)
 			}
 			for i, arg := range args {
 				rmod := rmods[i]
@@ -878,6 +910,65 @@
 	return pkgs
 }
 
+// collectDeps populates p.Deps by iterating over p.Internal.Imports.
+// collectDeps must be called on all of p's Imports before being called on p.
+func collectDeps(p *load.Package) {
+	deps := make(map[string]bool)
+
+	for _, p := range p.Internal.Imports {
+		deps[p.ImportPath] = true
+		for _, q := range p.Deps {
+			deps[q] = true
+		}
+	}
+
+	p.Deps = make([]string, 0, len(deps))
+	for dep := range deps {
+		p.Deps = append(p.Deps, dep)
+	}
+	sort.Strings(p.Deps)
+}
+
+// collectDeps populates p.DepsErrors by iterating over p.Internal.Imports.
+// collectDepsErrors must be called on all of p's Imports before being called on p.
+func collectDepsErrors(p *load.Package) {
+	depsErrors := make(map[*load.PackageError]bool)
+
+	for _, p := range p.Internal.Imports {
+		if p.Error != nil {
+			depsErrors[p.Error] = true
+		}
+		for _, q := range p.DepsErrors {
+			depsErrors[q] = true
+		}
+	}
+
+	p.DepsErrors = make([]*load.PackageError, 0, len(depsErrors))
+	for deperr := range depsErrors {
+		p.DepsErrors = append(p.DepsErrors, deperr)
+	}
+	// Sort packages by the package on the top of the stack, which should be
+	// the package the error was produced for. Each package can have at most
+	// one error set on it.
+	sort.Slice(p.DepsErrors, func(i, j int) bool {
+		stki, stkj := p.DepsErrors[i].ImportStack, p.DepsErrors[j].ImportStack
+		// Some packages are missing import stacks. To ensure deterministic
+		// sort order compare two errors that are missing import stacks by
+		// their errors' error texts.
+		if len(stki) == 0 {
+			if len(stkj) != 0 {
+				return true
+			}
+
+			return p.DepsErrors[i].Err.Error() < p.DepsErrors[j].Err.Error()
+		} else if len(stkj) == 0 {
+			return false
+		}
+		pathi, pathj := stki[len(stki)-1], stkj[len(stkj)-1]
+		return pathi < pathj
+	})
+}
+
 // 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.
diff --git a/src/cmd/go/internal/load/godebug.go b/src/cmd/go/internal/load/godebug.go
new file mode 100644
index 0000000..c79245e
--- /dev/null
+++ b/src/cmd/go/internal/load/godebug.go
@@ -0,0 +1,126 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package load
+
+import (
+	"cmd/go/internal/modload"
+	"errors"
+	"fmt"
+	"go/build"
+	"internal/godebugs"
+	"sort"
+	"strconv"
+	"strings"
+)
+
+var ErrNotGoDebug = errors.New("not //go:debug line")
+
+func ParseGoDebug(text string) (key, value string, err error) {
+	if !strings.HasPrefix(text, "//go:debug") {
+		return "", "", ErrNotGoDebug
+	}
+	i := strings.IndexAny(text, " \t")
+	if i < 0 {
+		if strings.TrimSpace(text) == "//go:debug" {
+			return "", "", fmt.Errorf("missing key=value")
+		}
+		return "", "", ErrNotGoDebug
+	}
+	k, v, ok := strings.Cut(strings.TrimSpace(text[i:]), "=")
+	if !ok {
+		return "", "", fmt.Errorf("missing key=value")
+	}
+	if strings.ContainsAny(k, " \t") {
+		return "", "", fmt.Errorf("key contains space")
+	}
+	if strings.ContainsAny(v, " \t") {
+		return "", "", fmt.Errorf("value contains space")
+	}
+	if strings.ContainsAny(k, ",") {
+		return "", "", fmt.Errorf("key contains comma")
+	}
+	if strings.ContainsAny(v, ",") {
+		return "", "", fmt.Errorf("value contains comma")
+	}
+
+	for _, info := range godebugs.All {
+		if k == info.Name {
+			return k, v, nil
+		}
+	}
+	return "", "", fmt.Errorf("unknown //go:debug setting %q", k)
+}
+
+// defaultGODEBUG returns the default GODEBUG setting for the main package p.
+// When building a test binary, directives, testDirectives, and xtestDirectives
+// list additional directives from the package under test.
+func defaultGODEBUG(p *Package, directives, testDirectives, xtestDirectives []build.Directive) string {
+	if p.Name != "main" {
+		return ""
+	}
+	goVersion := modload.MainModules.GoVersion()
+	if modload.RootMode == modload.NoRoot && p.Module != nil {
+		// This is go install pkg@version or go run pkg@version.
+		// Use the Go version from the package.
+		// If there isn't one, then
+		goVersion = p.Module.GoVersion
+		if goVersion == "" {
+			goVersion = "1.20"
+		}
+	}
+
+	m := godebugForGoVersion(goVersion)
+	for _, list := range [][]build.Directive{p.Internal.Build.Directives, directives, testDirectives, xtestDirectives} {
+		for _, d := range list {
+			k, v, err := ParseGoDebug(d.Text)
+			if err != nil {
+				continue
+			}
+			if m == nil {
+				m = make(map[string]string)
+			}
+			m[k] = v
+		}
+	}
+	var keys []string
+	for k := range m {
+		keys = append(keys, k)
+	}
+	sort.Strings(keys)
+	var b strings.Builder
+	for _, k := range keys {
+		if b.Len() > 0 {
+			b.WriteString(",")
+		}
+		b.WriteString(k)
+		b.WriteString("=")
+		b.WriteString(m[k])
+	}
+	return b.String()
+}
+
+func godebugForGoVersion(v string) map[string]string {
+	if strings.Count(v, ".") >= 2 {
+		i := strings.Index(v, ".")
+		j := i + 1 + strings.Index(v[i+1:], ".")
+		v = v[:j]
+	}
+
+	if !strings.HasPrefix(v, "1.") {
+		return nil
+	}
+	n, err := strconv.Atoi(v[len("1."):])
+	if err != nil {
+		return nil
+	}
+
+	def := make(map[string]string)
+	for _, info := range godebugs.All {
+		if n < info.Changed {
+			def[info.Name] = info.Old
+		}
+	}
+	return def
+}
diff --git a/src/cmd/go/internal/load/pkg.go b/src/cmd/go/internal/load/pkg.go
index 56a4e5e..c0e6265 100644
--- a/src/cmd/go/internal/load/pkg.go
+++ b/src/cmd/go/internal/load/pkg.go
@@ -23,6 +23,7 @@
 	"path/filepath"
 	"runtime"
 	"runtime/debug"
+	"slices"
 	"sort"
 	"strconv"
 	"strings"
@@ -33,6 +34,7 @@
 	"cmd/go/internal/base"
 	"cmd/go/internal/cfg"
 	"cmd/go/internal/fsys"
+	"cmd/go/internal/gover"
 	"cmd/go/internal/imports"
 	"cmd/go/internal/modfetch"
 	"cmd/go/internal/modindex"
@@ -58,7 +60,7 @@
 type PackagePublic 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
+	// remove existing ones. Keep in sync with ../list/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
@@ -79,6 +81,8 @@
 	BinaryOnly    bool                  `json:",omitempty"` // package cannot be recompiled
 	Incomplete    bool                  `json:",omitempty"` // was there an error loading this package or dependencies?
 
+	DefaultGODEBUG string `json:",omitempty"` // default GODEBUG setting (only for Name=="main")
+
 	// Stale and StaleReason remain here *only* for the list command.
 	// They are only initialized in preparation for list execution.
 	// The regular build determines staleness on the fly during action execution.
@@ -124,7 +128,7 @@
 	// Error information
 	// Incomplete is above, packed into the other bools
 	Error      *PackageError   `json:",omitempty"` // error loading this package (not dependencies)
-	DepsErrors []*PackageError `json:",omitempty"` // errors loading dependencies
+	DepsErrors []*PackageError `json:",omitempty"` // errors loading dependencies, collected by go list before output
 
 	// Test information
 	// If you add to this list you MUST add to p.AllFiles (below) too.
@@ -192,6 +196,9 @@
 	if p.ForTest != "" {
 		return p.ImportPath + " [" + p.ForTest + ".test]"
 	}
+	if p.Internal.ForMain != "" {
+		return p.ImportPath + " [" + p.Internal.ForMain + "]"
+	}
 	return p.ImportPath
 }
 
@@ -226,10 +233,12 @@
 	CoverageCfg       string               // coverage info config file path (passed to compiler)
 	OmitDebug         bool                 // tell linker not to write debug information
 	GobinSubdir       bool                 // install target would be subdir of GOBIN
-	BuildInfo         string               // add this info to package main
+	BuildInfo         *debug.BuildInfo     // add this info to package main
 	TestmainGo        *[]byte              // content for _testmain.go
 	Embed             map[string][]string  // //go:embed comment mapping
 	OrigImportPath    string               // original import path before adding '_test' suffix
+	PGOProfile        string               // path to PGO profile
+	ForMain           string               // the main package if this package is built specifically for it
 
 	Asmflags   []string // -asmflags for this package
 	Gcflags    []string // -gcflags for this package
@@ -328,6 +337,7 @@
 		Pos:         pos,
 		Err:         err,
 	}
+	p.Incomplete = true
 
 	if path != stk.Top() {
 		p.Error.setPos(importPos)
@@ -612,11 +622,11 @@
 			delete(packageCache, arg)
 		}
 	}
-	resolvedImportCache.DeleteIf(func(key any) bool {
-		return shouldDelete[key.(importSpec).path]
+	resolvedImportCache.DeleteIf(func(key importSpec) bool {
+		return shouldDelete[key.path]
 	})
-	packageDataCache.DeleteIf(func(key any) bool {
-		return shouldDelete[key.(string)]
+	packageDataCache.DeleteIf(func(key string) bool {
+		return shouldDelete[key]
 	})
 }
 
@@ -628,12 +638,12 @@
 	p := packageCache[arg]
 	if p != nil {
 		delete(packageCache, arg)
-		resolvedImportCache.DeleteIf(func(key any) bool {
-			return key.(importSpec).path == p.ImportPath
+		resolvedImportCache.DeleteIf(func(key importSpec) bool {
+			return key.path == p.ImportPath
 		})
 		packageDataCache.Delete(p.ImportPath)
 	}
-	return LoadImport(context.TODO(), PackageOpts{}, arg, base.Cwd(), nil, stk, nil, 0)
+	return LoadPackage(context.TODO(), PackageOpts{}, arg, base.Cwd(), stk, nil, 0)
 }
 
 // dirToImportPath returns the pseudo-import path we use for a package
@@ -676,6 +686,15 @@
 	// GetTestDeps is for download (part of "go get") and indicates
 	// that test dependencies should be fetched too.
 	GetTestDeps
+
+	// The remainder are internal modes for calls to loadImport.
+
+	// cmdlinePkg is for a package mentioned on the command line.
+	cmdlinePkg
+
+	// cmdlinePkgLiteral is for a package mentioned on the command line
+	// without using any wildcards or meta-patterns.
+	cmdlinePkgLiteral
 )
 
 // LoadImport scans the directory named by path, which must be an import path,
@@ -685,11 +704,23 @@
 // LoadImport does not set tool flags and should only be used by
 // this package, as part of a bigger load operation, and by GOPATH-based "go get".
 // TODO(rsc): When GOPATH-based "go get" is removed, unexport this function.
-func LoadImport(ctx context.Context, opts PackageOpts, path, srcDir string, parent *Package, stk *ImportStack, importPos []token.Position, mode int) *Package {
+// The returned PackageError, if any, describes why parent is not allowed
+// to import the named package, with the error referring to importPos.
+// The PackageError can only be non-nil when parent is not nil.
+func LoadImport(ctx context.Context, opts PackageOpts, path, srcDir string, parent *Package, stk *ImportStack, importPos []token.Position, mode int) (*Package, *PackageError) {
 	return loadImport(ctx, opts, nil, path, srcDir, parent, stk, importPos, mode)
 }
 
-func loadImport(ctx context.Context, opts PackageOpts, pre *preload, path, srcDir string, parent *Package, stk *ImportStack, importPos []token.Position, mode int) *Package {
+// LoadPackage does Load import, but without a parent package load contezt
+func LoadPackage(ctx context.Context, opts PackageOpts, path, srcDir string, stk *ImportStack, importPos []token.Position, mode int) *Package {
+	p, err := loadImport(ctx, opts, nil, path, srcDir, nil, stk, importPos, mode)
+	if err != nil {
+		base.Fatalf("internal error: loadImport of %q with nil parent returned an error", path)
+	}
+	return p
+}
+
+func loadImport(ctx context.Context, opts PackageOpts, pre *preload, path, srcDir string, parent *Package, stk *ImportStack, importPos []token.Position, mode int) (*Package, *PackageError) {
 	ctx, span := trace.StartSpan(ctx, "modload.loadImport "+path)
 	defer span.Done()
 
@@ -727,7 +758,16 @@
 			defer stk.Pop()
 		}
 		p.setLoadPackageDataError(err, path, stk, nil)
-		return p
+		return p, nil
+	}
+
+	setCmdline := func(p *Package) {
+		if mode&cmdlinePkg != 0 {
+			p.Internal.CmdlinePkg = true
+		}
+		if mode&cmdlinePkgLiteral != 0 {
+			p.Internal.CmdlinePkgLiteral = true
+		}
 	}
 
 	importPath := bp.ImportPath
@@ -736,12 +776,15 @@
 		stk.Push(path)
 		p = reusePackage(p, stk)
 		stk.Pop()
+		setCmdline(p)
 	} else {
 		p = new(Package)
 		p.Internal.Local = build.IsLocalImport(path)
 		p.ImportPath = importPath
 		packageCache[importPath] = p
 
+		setCmdline(p)
+
 		// Load package.
 		// loadPackageData may return bp != nil even if an error occurs,
 		// in order to return partial information.
@@ -758,44 +801,42 @@
 	}
 
 	// Checked on every import because the rules depend on the code doing the importing.
-	if perr := disallowInternal(ctx, srcDir, parent, parentPath, p, stk); perr != p {
-		perr.Error.setPos(importPos)
-		return perr
+	if perr := disallowInternal(ctx, srcDir, parent, parentPath, p, stk); perr != nil {
+		perr.setPos(importPos)
+		return p, perr
 	}
 	if mode&ResolveImport != 0 {
-		if perr := disallowVendor(srcDir, path, parentPath, p, stk); perr != p {
-			perr.Error.setPos(importPos)
-			return perr
+		if perr := disallowVendor(srcDir, path, parentPath, p, stk); perr != nil {
+			perr.setPos(importPos)
+			return p, perr
 		}
 	}
 
 	if p.Name == "main" && parent != nil && parent.Dir != p.Dir {
-		perr := *p
-		perr.Error = &PackageError{
+		perr := &PackageError{
 			ImportStack: stk.Copy(),
 			Err:         ImportErrorf(path, "import %q is a program, not an importable package", path),
 		}
-		perr.Error.setPos(importPos)
-		return &perr
+		perr.setPos(importPos)
+		return p, perr
 	}
 
 	if p.Internal.Local && parent != nil && !parent.Internal.Local {
-		perr := *p
 		var err error
 		if path == "." {
 			err = ImportErrorf(path, "%s: cannot import current directory", path)
 		} else {
 			err = ImportErrorf(path, "local import %q in non-local package", path)
 		}
-		perr.Error = &PackageError{
+		perr := &PackageError{
 			ImportStack: stk.Copy(),
 			Err:         err,
 		}
-		perr.Error.setPos(importPos)
-		return &perr
+		perr.setPos(importPos)
+		return p, perr
 	}
 
-	return p
+	return p, nil
 }
 
 // loadPackageData loads information needed to construct a *Package. The result
@@ -846,7 +887,7 @@
 		parentIsStd: parentIsStd,
 		mode:        mode,
 	}
-	r := resolvedImportCache.Do(importKey, func() any {
+	r := resolvedImportCache.Do(importKey, func() resolvedImport {
 		var r resolvedImport
 		if cfg.ModulesEnabled {
 			r.dir, r.path, r.err = modload.Lookup(parentPath, parentIsStd, path)
@@ -866,16 +907,19 @@
 			r.path = path
 		}
 		return r
-	}).(resolvedImport)
+	})
 	// Invariant: r.path is set to the resolved import path. If the path cannot
 	// be resolved, r.path is set to path, the source import path.
 	// r.path is never empty.
 
 	// Load the package from its directory. If we already found the package's
 	// directory when resolving its import path, use that.
-	data := packageDataCache.Do(r.path, func() any {
+	p, err := packageDataCache.Do(r.path, func() (*build.Package, error) {
 		loaded = true
-		var data packageData
+		var data struct {
+			p   *build.Package
+			err error
+		}
 		if r.dir != "" {
 			var buildMode build.ImportMode
 			buildContext := cfg.BuildContext
@@ -887,8 +931,9 @@
 			modroot := modload.PackageModRoot(ctx, r.path)
 			if modroot == "" && str.HasPathPrefix(r.dir, cfg.GOROOTsrc) {
 				modroot = cfg.GOROOTsrc
-				if str.HasPathPrefix(r.dir, cfg.GOROOTsrc+string(filepath.Separator)+"cmd") {
-					modroot += string(filepath.Separator) + "cmd"
+				gorootSrcCmd := filepath.Join(cfg.GOROOTsrc, "cmd")
+				if str.HasPathPrefix(r.dir, gorootSrcCmd) {
+					modroot = gorootSrcCmd
 				}
 			}
 			if modroot != "" {
@@ -896,7 +941,7 @@
 					data.p, data.err = rp.Import(cfg.BuildContext, buildMode)
 					goto Happy
 				} else if !errors.Is(err, modindex.ErrNotIndexed) {
-					base.Fatalf("go: %v", err)
+					base.Fatal(err)
 				}
 			}
 			data.p, data.err = buildContext.ImportDir(r.dir, buildMode)
@@ -960,10 +1005,10 @@
 			!strings.Contains(path, "/vendor/") && !strings.HasPrefix(path, "vendor/") {
 			data.err = fmt.Errorf("code in directory %s expects import %q", data.p.Dir, data.p.ImportComment)
 		}
-		return data
-	}).(packageData)
+		return data.p, data.err
+	})
 
-	return data.p, loaded, data.err
+	return p, loaded, err
 }
 
 // importSpec describes an import declaration in source code. It is used as a
@@ -983,20 +1028,11 @@
 	err       error
 }
 
-// packageData holds information loaded from a package. It is the value type
-// in packageDataCache.
-type packageData struct {
-	p   *build.Package
-	err error
-}
+// resolvedImportCache maps import strings to canonical package names.
+var resolvedImportCache par.Cache[importSpec, resolvedImport]
 
-// resolvedImportCache maps import strings (importSpec) to canonical package names
-// (resolvedImport).
-var resolvedImportCache par.Cache
-
-// packageDataCache maps canonical package names (string) to package metadata
-// (packageData).
-var packageDataCache par.Cache
+// packageDataCache maps canonical package names (string) to package metadata.
+var packageDataCache par.ErrCache[string, *build.Package]
 
 // preloadWorkerCount is the number of concurrent goroutines that can load
 // packages. Experimentally, there are diminishing returns with more than
@@ -1108,13 +1144,13 @@
 	return path
 }
 
-var isDirCache par.Cache
+var isDirCache par.Cache[string, bool]
 
 func isDir(path string) bool {
-	return isDirCache.Do(path, func() any {
+	return isDirCache.Do(path, func() bool {
 		fi, err := fsys.Stat(path)
 		return err == nil && fi.IsDir()
-	}).(bool)
+	})
 }
 
 // ResolveImportPath returns the true meaning of path when it appears in parent.
@@ -1235,12 +1271,12 @@
 
 var (
 	modulePrefix   = []byte("\nmodule ")
-	goModPathCache par.Cache
+	goModPathCache par.Cache[string, string]
 )
 
 // goModPath returns the module path in the go.mod in dir, if any.
 func goModPath(dir string) (path string) {
-	return goModPathCache.Do(dir, func() any {
+	return goModPathCache.Do(dir, func() string {
 		data, err := os.ReadFile(filepath.Join(dir, "go.mod"))
 		if err != nil {
 			return ""
@@ -1276,7 +1312,7 @@
 			path = s
 		}
 		return path
-	}).(string)
+	})
 }
 
 // findVersionElement returns the slice indices of the final version element /vN in path.
@@ -1433,7 +1469,7 @@
 // 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(ctx context.Context, srcDir string, importer *Package, importerPath string, p *Package, stk *ImportStack) *Package {
+func disallowInternal(ctx context.Context, srcDir string, importer *Package, importerPath string, p *Package, stk *ImportStack) *PackageError {
 	// golang.org/s/go14internal:
 	// An import of a path containing the element “internal”
 	// is disallowed if the importing code is outside the tree
@@ -1441,7 +1477,7 @@
 
 	// There was an error loading the package; stop here.
 	if p.Error != nil {
-		return p
+		return nil
 	}
 
 	// The generated 'testmain' package is allowed to access testing/internal/...,
@@ -1449,32 +1485,32 @@
 	// (it's actually in a temporary directory outside any Go tree).
 	// This cleans up a former kludge in passing functionality to the testing package.
 	if str.HasPathPrefix(p.ImportPath, "testing/internal") && importerPath == "testmain" {
-		return p
+		return nil
 	}
 
 	// We can't check standard packages with gccgo.
 	if cfg.BuildContext.Compiler == "gccgo" && p.Standard {
-		return p
+		return nil
 	}
 
 	// The sort package depends on internal/reflectlite, but during bootstrap
 	// the path rewriting causes the normal internal checks to fail.
 	// Instead, just ignore the internal rules during bootstrap.
 	if p.Standard && strings.HasPrefix(importerPath, "bootstrap/") {
-		return p
+		return nil
 	}
 
 	// importerPath is empty: we started
 	// with a name given on the command line, not an
 	// import. Anything listed on the command line is fine.
 	if importerPath == "" {
-		return p
+		return nil
 	}
 
 	// Check for "internal" element: three cases depending on begin of string and/or end of string.
 	i, ok := findInternal(p.ImportPath)
 	if !ok {
-		return p
+		return nil
 	}
 
 	// Internal is present.
@@ -1487,14 +1523,14 @@
 		parent := p.Dir[:i+len(p.Dir)-len(p.ImportPath)]
 
 		if str.HasFilePathPrefix(filepath.Clean(srcDir), filepath.Clean(parent)) {
-			return p
+			return nil
 		}
 
 		// Look for symlinks before reporting error.
 		srcDir = expandPath(srcDir)
 		parent = expandPath(parent)
 		if str.HasFilePathPrefix(filepath.Clean(srcDir), filepath.Clean(parent)) {
-			return p
+			return nil
 		}
 	} else {
 		// p is in a module, so make it available based on the importer's import path instead
@@ -1509,19 +1545,17 @@
 		}
 		parentOfInternal := p.ImportPath[:i]
 		if str.HasPathPrefix(importerPath, parentOfInternal) {
-			return p
+			return nil
 		}
 	}
 
 	// Internal is present, and srcDir is outside parent's tree. Not allowed.
-	perr := *p
-	perr.Error = &PackageError{
+	perr := &PackageError{
 		alwaysPrintStack: true,
 		ImportStack:      stk.Copy(),
 		Err:              ImportErrorf(p.ImportPath, "use of internal package "+p.ImportPath+" not allowed"),
 	}
-	perr.Incomplete = true
-	return &perr
+	return perr
 }
 
 // findInternal looks for the final "internal" path element in the given import path.
@@ -1545,31 +1579,29 @@
 
 // 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 string, path string, importerPath string, p *Package, stk *ImportStack) *Package {
+// If not, it returns a PackageError.
+func disallowVendor(srcDir string, path string, importerPath string, p *Package, stk *ImportStack) *PackageError {
 	// If the importerPath is empty, we started
 	// with a name given on the command line, not an
 	// import. Anything listed on the command line is fine.
 	if importerPath == "" {
-		return p
+		return nil
 	}
 
-	if perr := disallowVendorVisibility(srcDir, p, importerPath, stk); perr != p {
+	if perr := disallowVendorVisibility(srcDir, p, importerPath, stk); perr != nil {
 		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{
+		perr := &PackageError{
 			ImportStack: stk.Copy(),
 			Err:         ImportErrorf(path, "%s must be imported as %s", path, path[i+len("vendor/"):]),
 		}
-		perr.Incomplete = true
-		return &perr
+		return perr
 	}
 
-	return p
+	return nil
 }
 
 // disallowVendorVisibility checks that srcDir is allowed to import p.
@@ -1577,19 +1609,19 @@
 // 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, importerPath string, stk *ImportStack) *Package {
+func disallowVendorVisibility(srcDir string, p *Package, importerPath string, stk *ImportStack) *PackageError {
 	// The stack does not include p.ImportPath.
 	// If there's nothing 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 importerPath == "" {
-		return p
+		return nil
 	}
 
 	// Check for "vendor" element.
 	i, ok := FindVendor(p.ImportPath)
 	if !ok {
-		return p
+		return nil
 	}
 
 	// Vendor is present.
@@ -1599,28 +1631,27 @@
 	}
 	truncateTo := i + len(p.Dir) - len(p.ImportPath)
 	if truncateTo < 0 || len(p.Dir) < truncateTo {
-		return p
+		return nil
 	}
 	parent := p.Dir[:truncateTo]
 	if str.HasFilePathPrefix(filepath.Clean(srcDir), filepath.Clean(parent)) {
-		return p
+		return nil
 	}
 
 	// Look for symlinks before reporting error.
 	srcDir = expandPath(srcDir)
 	parent = expandPath(parent)
 	if str.HasFilePathPrefix(filepath.Clean(srcDir), filepath.Clean(parent)) {
-		return p
+		return nil
 	}
 
 	// Vendor is present, and srcDir is outside parent's tree. Not allowed.
-	perr := *p
-	perr.Error = &PackageError{
+
+	perr := &PackageError{
 		ImportStack: stk.Copy(),
 		Err:         errors.New("use of vendored package not allowed"),
 	}
-	perr.Incomplete = true
-	return &perr
+	return perr
 }
 
 // FindVendor looks for the last non-terminating "vendor" path element in the given import path.
@@ -1747,6 +1778,7 @@
 				ImportStack: stk.Copy(),
 				Err:         err,
 			}
+			p.Incomplete = true
 
 			// Add the importer's position information if the import position exists, and
 			// the current package being examined is the importer.
@@ -1784,7 +1816,7 @@
 			return
 		}
 		elem := p.DefaultExecName() + cfg.ExeSuffix
-		full := cfg.BuildContext.GOOS + "_" + cfg.BuildContext.GOARCH + string(filepath.Separator) + elem
+		full := filepath.Join(cfg.BuildContext.GOOS+"_"+cfg.BuildContext.GOARCH, elem)
 		if cfg.BuildContext.GOOS != runtime.GOOS || cfg.BuildContext.GOARCH != runtime.GOARCH {
 			// Install cross-compiled binaries to subdirectories of bin.
 			elem = full
@@ -1820,7 +1852,7 @@
 	} else {
 		p.Target = p.Internal.Build.PkgObj
 		if cfg.BuildBuildmode == "shared" && p.Internal.Build.PkgTargetRoot != "" {
-			// TODO(matloob): This shouldn't be necessary, but the misc/cgo/testshared
+			// TODO(matloob): This shouldn't be necessary, but the cmd/cgo/internal/testshared
 			// test fails without Target set for this condition. Figure out why and
 			// fix it.
 			p.Target = filepath.Join(p.Internal.Build.PkgTargetRoot, p.ImportPath+".a")
@@ -1923,13 +1955,16 @@
 	if cfg.ModulesEnabled {
 		p.Module = modload.PackageModuleInfo(ctx, pkgPath)
 	}
+	p.DefaultGODEBUG = defaultGODEBUG(p, nil, nil, nil)
 
-	p.EmbedFiles, p.Internal.Embed, err = resolveEmbed(p.Dir, p.EmbedPatterns)
-	if err != nil {
-		p.Incomplete = true
-		setError(err)
-		embedErr := err.(*EmbedError)
-		p.Error.setPos(p.Internal.Build.EmbedPatternPos[embedErr.Pattern])
+	if !opts.SuppressEmbedFiles {
+		p.EmbedFiles, p.Internal.Embed, err = resolveEmbed(p.Dir, p.EmbedPatterns)
+		if err != nil {
+			p.Incomplete = true
+			setError(err)
+			embedErr := err.(*EmbedError)
+			p.Error.setPos(p.Internal.Build.EmbedPatternPos[embedErr.Pattern])
+		}
 	}
 
 	// Check for case-insensitive collision of input files.
@@ -1960,6 +1995,10 @@
 		setError(fmt.Errorf("invalid input directory name %q", name))
 		return
 	}
+	if strings.ContainsAny(p.Dir, "\r\n") {
+		setError(fmt.Errorf("invalid package directory %q", p.Dir))
+		return
+	}
 
 	// Build list of imported packages and full dependency list.
 	imports := make([]*Package, 0, len(p.Imports))
@@ -1967,7 +2006,11 @@
 		if path == "C" {
 			continue
 		}
-		p1 := LoadImport(ctx, opts, path, p.Dir, p, stk, p.Internal.Build.ImportPos[path], ResolveImport)
+		p1, err := LoadImport(ctx, opts, path, p.Dir, p, stk, p.Internal.Build.ImportPos[path], ResolveImport)
+		if err != nil && p.Error == nil {
+			p.Error = err
+			p.Incomplete = true
+		}
 
 		path = p1.ImportPath
 		importPaths[i] = path
@@ -1981,15 +2024,12 @@
 		}
 	}
 	p.Internal.Imports = imports
-	if !opts.SuppressDeps {
-		p.collectDeps()
-	}
-	if p.Error == nil && p.Name == "main" && !p.Internal.ForceLibrary && len(p.DepsErrors) == 0 && !opts.SuppressBuildInfo {
+	if p.Error == nil && p.Name == "main" && !p.Internal.ForceLibrary && !p.Incomplete && !opts.SuppressBuildInfo {
 		// TODO(bcmills): loading VCS metadata can be fairly slow.
 		// Consider starting this as a background goroutine and retrieving the result
 		// asynchronously when we're actually ready to build the package, or when we
 		// actually need to evaluate whether the package's metadata is stale.
-		p.setBuildInfo(opts.AutoVCS)
+		p.setBuildInfo(ctx, opts.AutoVCS)
 	}
 
 	// If cgo is not enabled, ignore cgo supporting sources
@@ -2086,7 +2126,7 @@
 		}
 
 		// Glob to find matches.
-		match, err := fsys.Glob(str.QuoteGlob(pkgdir) + string(filepath.Separator) + filepath.FromSlash(glob))
+		match, err := fsys.Glob(str.QuoteGlob(str.WithFilePathSeparator(pkgdir)) + filepath.FromSlash(glob))
 		if err != nil {
 			return nil, nil, err
 		}
@@ -2220,64 +2260,29 @@
 	return false
 }
 
-// collectDeps populates p.Deps and p.DepsErrors by iterating over
-// p.Internal.Imports.
-//
-// TODO(jayconrod): collectDeps iterates over transitive imports for every
-// package. We should only need to visit direct imports.
-func (p *Package) collectDeps() {
-	deps := make(map[string]*Package)
-	var q []*Package
-	q = append(q, p.Internal.Imports...)
-	for i := 0; i < len(q); i++ {
-		p1 := q[i]
-		path := p1.ImportPath
-		// 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.
-		p0 := deps[path]
-		if p0 == nil || p1.Error != nil && (p0.Error == nil || len(p0.Error.ImportStack) > len(p1.Error.ImportStack)) {
-			deps[path] = p1
-			for _, p2 := range p1.Internal.Imports {
-				if deps[p2.ImportPath] != p2 {
-					q = append(q, p2)
-				}
-			}
-		}
-	}
+// vcsStatusCache maps repository directories (string)
+// to their VCS information.
+var vcsStatusCache par.ErrCache[string, vcs.Status]
 
-	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)
-		}
-		if p1.Error != nil {
-			p.DepsErrors = append(p.DepsErrors, p1.Error)
-		}
-	}
+func appendBuildSetting(info *debug.BuildInfo, key, value string) {
+	value = strings.ReplaceAll(value, "\n", " ") // make value safe
+	info.Settings = append(info.Settings, debug.BuildSetting{Key: key, Value: value})
 }
 
-// vcsStatusCache maps repository directories (string)
-// to their VCS information (vcsStatusError).
-var vcsStatusCache par.Cache
-
-// setBuildInfo gathers build information, formats it as a string to be
-// embedded in the binary, then sets p.Internal.BuildInfo to that string.
-// setBuildInfo should only be called on a main package with no errors.
+// setBuildInfo gathers build information and sets it into
+// p.Internal.BuildInfo, which will later be formatted as a string and embedded
+// in the binary. setBuildInfo should only be called on a main package with no
+// errors.
 //
 // This information can be retrieved using debug.ReadBuildInfo.
 //
 // Note that the GoVersion field is not set here to avoid encoding it twice.
 // It is stored separately in the binary, mostly for historical reasons.
-func (p *Package) setBuildInfo(autoVCS bool) {
+func (p *Package) setBuildInfo(ctx context.Context, autoVCS bool) {
 	setPkgErrorf := func(format string, args ...any) {
 		if p.Error == nil {
 			p.Error = &PackageError{Err: fmt.Errorf(format, args...)}
+			p.Incomplete = true
 		}
 	}
 
@@ -2294,7 +2299,7 @@
 		if mi.Replace != nil {
 			dm.Replace = debugModFromModinfo(mi.Replace)
 		} else if mi.Version != "" {
-			dm.Sum = modfetch.Sum(module.Version{Path: mi.Path, Version: mi.Version})
+			dm.Sum = modfetch.Sum(ctx, module.Version{Path: mi.Path, Version: mi.Version})
 		}
 		return dm
 	}
@@ -2327,7 +2332,7 @@
 	for mod := range mdeps {
 		sortedMods = append(sortedMods, mod)
 	}
-	module.Sort(sortedMods)
+	gover.ModSort(sortedMods)
 	deps := make([]*debug.Module, len(sortedMods))
 	for i, mod := range sortedMods {
 		deps[i] = mdeps[mod]
@@ -2343,8 +2348,7 @@
 		Deps: deps,
 	}
 	appendSetting := func(key, value string) {
-		value = strings.ReplaceAll(value, "\n", " ") // make value safe
-		info.Settings = append(info.Settings, debug.BuildSetting{Key: key, Value: value})
+		appendBuildSetting(info, key, value)
 	}
 
 	// Add command-line flags relevant to the build.
@@ -2385,13 +2389,7 @@
 			appendSetting("-ldflags", ldflags)
 		}
 	}
-	if cfg.BuildPGOFile != "" {
-		if cfg.BuildTrimpath {
-			appendSetting("-pgo", filepath.Base(cfg.BuildPGOFile))
-		} else {
-			appendSetting("-pgo", cfg.BuildPGOFile)
-		}
-	}
+	// N.B. -pgo added later by setPGOProfilePath.
 	if cfg.BuildMSan {
 		appendSetting("-msan", "true")
 	}
@@ -2404,6 +2402,9 @@
 	if cfg.BuildTrimpath {
 		appendSetting("-trimpath", "true")
 	}
+	if p.DefaultGODEBUG != "" {
+		appendSetting("DefaultGODEBUG", p.DefaultGODEBUG)
+	}
 	cgo := "0"
 	if cfg.BuildContext.CgoEnabled {
 		cgo = "1"
@@ -2516,19 +2517,13 @@
 			goto omitVCS
 		}
 
-		type vcsStatusError struct {
-			Status vcs.Status
-			Err    error
-		}
-		cached := vcsStatusCache.Do(repoDir, func() any {
-			st, err := vcsCmd.Status(vcsCmd, repoDir)
-			return vcsStatusError{st, err}
-		}).(vcsStatusError)
-		if err := cached.Err; err != nil {
+		st, err := vcsStatusCache.Do(repoDir, func() (vcs.Status, error) {
+			return vcsCmd.Status(vcsCmd, repoDir)
+		})
+		if err != nil {
 			setVCSError(err)
 			return
 		}
-		st := cached.Status
 
 		appendSetting("vcs", vcsCmd.Cmd)
 		if st.Revision != "" {
@@ -2542,7 +2537,7 @@
 	}
 omitVCS:
 
-	p.Internal.BuildInfo = info.String()
+	p.Internal.BuildInfo = info
 }
 
 // SafeArg reports whether arg is a "safe" command-line argument,
@@ -2603,23 +2598,38 @@
 	}
 
 	// Some targets must use external linking even inside GOROOT.
-	switch cfg.BuildContext.GOOS {
-	case "android":
-		if cfg.BuildContext.GOARCH != "arm64" {
-			return true
-		}
-	case "ios":
+	if platform.MustLinkExternal(cfg.BuildContext.GOOS, cfg.BuildContext.GOARCH, false) {
 		return true
 	}
 
-	// Currently build modes c-shared, pie (on systems that do not
-	// support PIE with internal linking mode (currently all
-	// systems: issue #18968)), plugin, and -linkshared force
-	// external linking mode, as of course does
-	// -ldflags=-linkmode=external. External linking mode forces
-	// an import of runtime/cgo.
+	// Some build modes always require external linking.
+	switch cfg.BuildBuildmode {
+	case "c-shared", "plugin":
+		return true
+	}
+
+	// Using -linkshared always requires external linking.
+	if cfg.BuildLinkshared {
+		return true
+	}
+
+	// Decide whether we are building a PIE,
+	// bearing in mind that some systems default to PIE.
+	isPIE := false
+	if cfg.BuildBuildmode == "pie" {
+		isPIE = true
+	} else if cfg.BuildBuildmode == "default" && platform.DefaultPIE(cfg.BuildContext.GOOS, cfg.BuildContext.GOARCH, cfg.BuildRace) {
+		isPIE = true
+	}
+	// If we are building a PIE, and we are on a system
+	// that does not support PIE with internal linking mode,
+	// then we must use external linking.
+	if isPIE && !platform.InternalLinkPIESupported(cfg.BuildContext.GOOS, cfg.BuildContext.GOARCH) {
+		return true
+	}
+
+	// Using -ldflags=-linkmode=external forces external linking.
 	// If there are multiple -linkmode options, the last one wins.
-	pieCgo := cfg.BuildBuildmode == "pie" && !platform.InternalLinkPIESupported(cfg.BuildContext.GOOS, cfg.BuildContext.GOARCH)
 	linkmodeExternal := false
 	if p != nil {
 		ldflags := BuildLdflags.For(p)
@@ -2635,8 +2645,7 @@
 			}
 		}
 	}
-
-	return cfg.BuildBuildmode == "c-shared" || cfg.BuildBuildmode == "plugin" || pieCgo || cfg.BuildLinkshared || linkmodeExternal
+	return linkmodeExternal
 }
 
 // mkAbs rewrites list, which must be paths relative to p.Dir,
@@ -2662,19 +2671,19 @@
 	return p.mkAbs(p.XTestGoFiles)
 }
 
-// InternalGoFiles returns the list of all Go files possibly relevant for the package,
+// InternalAllGoFiles returns the list of all Go files possibly relevant for the package,
 // using absolute paths. "Possibly relevant" means that files are not excluded
 // due to build tags, but files with names beginning with . or _ are still excluded.
 func (p *Package) InternalAllGoFiles() []string {
 	return p.mkAbs(str.StringList(p.IgnoredGoFiles, p.GoFiles, p.CgoFiles, p.TestGoFiles, p.XTestGoFiles))
 }
 
-// usesSwig reports whether the package needs to run SWIG.
+// 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
+// UsesCgo reports whether the package needs to run cgo
 func (p *Package) UsesCgo() bool {
 	return len(p.CgoFiles) > 0
 }
@@ -2720,7 +2729,12 @@
 	}
 	walkTest := func(root *Package, path string) {
 		var stk ImportStack
-		p1 := LoadImport(ctx, opts, path, root.Dir, root, &stk, root.Internal.Build.TestImportPos[path], ResolveImport)
+		p1, err := LoadImport(ctx, opts, path, root.Dir, root, &stk, root.Internal.Build.TestImportPos[path], ResolveImport)
+		if err != nil && root.Error == nil {
+			// Assign error importing the package to the importer.
+			root.Error = err
+			root.Incomplete = true
+		}
 		if p1.Error == nil {
 			walk(p1)
 		}
@@ -2742,8 +2756,16 @@
 // dependencies (like sync/atomic for coverage).
 // TODO(jayconrod): delete this function and set flags automatically
 // in LoadImport instead.
-func LoadImportWithFlags(path, srcDir string, parent *Package, stk *ImportStack, importPos []token.Position, mode int) *Package {
-	p := LoadImport(context.TODO(), PackageOpts{}, path, srcDir, parent, stk, importPos, mode)
+func LoadImportWithFlags(path, srcDir string, parent *Package, stk *ImportStack, importPos []token.Position, mode int) (*Package, *PackageError) {
+	p, err := LoadImport(context.TODO(), PackageOpts{}, path, srcDir, parent, stk, importPos, mode)
+	setToolFlags(p)
+	return p, err
+}
+
+// LoadPackageWithFlags is the same as LoadImportWithFlags but without a parent.
+// It's then guaranteed to not return an error
+func LoadPackageWithFlags(path, srcDir string, stk *ImportStack, importPos []token.Position, mode int) *Package {
+	p := LoadPackage(context.TODO(), PackageOpts{}, path, srcDir, stk, importPos, mode)
 	setToolFlags(p)
 	return p
 }
@@ -2776,15 +2798,13 @@
 	// when -buildvcs=auto (the default).
 	AutoVCS bool
 
-	// SuppressDeps is true if the caller does not need Deps and DepsErrors to be populated
-	// on the package. TestPackagesAndErrors examines the  Deps field to determine if the test
-	// variant has an import cycle, so SuppressDeps should not be set if TestPackagesAndErrors
-	// will be called on the package.
-	SuppressDeps bool
-
 	// SuppressBuildInfo is true if the caller does not need p.Stale, p.StaleReason, or p.Internal.BuildInfo
 	// to be populated on the package.
 	SuppressBuildInfo bool
+
+	// SuppressEmbedFiles is true if the caller does not need any embed files to be populated on the
+	// package.
+	SuppressEmbedFiles bool
 }
 
 // PackagesAndErrors returns the packages named by the command line arguments
@@ -2842,15 +2862,18 @@
 			if pkg == "" {
 				panic(fmt.Sprintf("ImportPaths returned empty package for pattern %s", m.Pattern()))
 			}
-			p := loadImport(ctx, opts, pre, pkg, base.Cwd(), nil, &stk, nil, 0)
-			p.Match = append(p.Match, m.Pattern())
-			p.Internal.CmdlinePkg = true
+			mode := cmdlinePkg
 			if m.IsLiteral() {
 				// Note: do not set = m.IsLiteral unconditionally
 				// because maybe we'll see p matching both
 				// a literal and also a non-literal pattern.
-				p.Internal.CmdlinePkgLiteral = true
+				mode |= cmdlinePkgLiteral
 			}
+			p, perr := loadImport(ctx, opts, pre, pkg, base.Cwd(), nil, &stk, nil, mode)
+			if perr != nil {
+				base.Fatalf("internal error: loadImport of %q with nil parent returned an error", pkg)
+			}
+			p.Match = append(p.Match, m.Pattern())
 			if seenPkg[p] {
 				continue
 			}
@@ -2893,51 +2916,97 @@
 	return pkgs
 }
 
-// setPGOProfilePath sets cfg.BuildPGOFile to the PGO profile path.
+// setPGOProfilePath sets the PGO profile path for pkgs.
 // In -pgo=auto mode, it finds the default PGO profile.
 func setPGOProfilePath(pkgs []*Package) {
+	updateBuildInfo := func(p *Package, file string) {
+		// Don't create BuildInfo for packages that didn't already have it.
+		if p.Internal.BuildInfo == nil {
+			return
+		}
+
+		if cfg.BuildTrimpath {
+			appendBuildSetting(p.Internal.BuildInfo, "-pgo", filepath.Base(file))
+		} else {
+			appendBuildSetting(p.Internal.BuildInfo, "-pgo", file)
+		}
+	}
+
 	switch cfg.BuildPGO {
-	case "":
-		fallthrough // default to "off"
 	case "off":
 		return
 
 	case "auto":
-		// Locate PGO profile from the main package.
-
-		setError := func(p *Package) {
-			if p.Error == nil {
-				p.Error = &PackageError{Err: errors.New("-pgo=auto requires exactly one main package")}
-			}
-		}
-
-		var mainpkg *Package
+		// Locate PGO profiles from the main packages, and
+		// attach the profile to the main package and its
+		// dependencies.
+		// If we're building multiple main packages, they may
+		// have different profiles. We may need to split (unshare)
+		// the dependency graph so they can attach different
+		// profiles.
 		for _, p := range pkgs {
-			if p.Name == "main" {
-				if mainpkg != nil {
-					setError(p)
-					setError(mainpkg)
-					continue
-				}
-				mainpkg = p
+			if p.Name != "main" {
+				continue
 			}
-		}
-		if mainpkg == nil {
-			// No main package, no default.pgo to look for.
-			return
-		}
-		file := filepath.Join(mainpkg.Dir, "default.pgo")
-		if fi, err := os.Stat(file); err == nil && !fi.IsDir() {
-			cfg.BuildPGOFile = file
+			pmain := p
+			file := filepath.Join(pmain.Dir, "default.pgo")
+			if _, err := os.Stat(file); err != nil {
+				continue // no profile
+			}
+
+			// Packages already visited. The value should replace
+			// the key, as it may be a forked copy of the original
+			// Package.
+			visited := make(map[*Package]*Package)
+			var split func(p *Package) *Package
+			split = func(p *Package) *Package {
+				if p1 := visited[p]; p1 != nil {
+					return p1
+				}
+
+				if len(pkgs) > 1 && p != pmain {
+					// Make a copy, then attach profile.
+					// No need to copy if there is only one root package (we can
+					// attach profile directly in-place).
+					// Also no need to copy the main package.
+					if p.Internal.PGOProfile != "" {
+						panic("setPGOProfilePath: already have profile")
+					}
+					p1 := new(Package)
+					*p1 = *p
+					// Unalias the Internal.Imports slice, which is we're going to
+					// modify. We don't copy other slices as we don't change them.
+					p1.Internal.Imports = slices.Clone(p.Internal.Imports)
+					p1.Internal.ForMain = pmain.ImportPath
+					visited[p] = p1
+					p = p1
+				} else {
+					visited[p] = p
+				}
+				p.Internal.PGOProfile = file
+				updateBuildInfo(p, file)
+				// Recurse to dependencies.
+				for i, pp := range p.Internal.Imports {
+					p.Internal.Imports[i] = split(pp)
+				}
+				return p
+			}
+
+			// Replace the package and imports with the PGO version.
+			split(pmain)
 		}
 
 	default:
 		// Profile specified from the command line.
 		// Make it absolute path, as the compiler runs on various directories.
-		if p, err := filepath.Abs(cfg.BuildPGO); err != nil {
+		file, err := filepath.Abs(cfg.BuildPGO)
+		if err != nil {
 			base.Fatalf("fail to get absolute path of PGO file %s: %v", cfg.BuildPGO, err)
-		} else {
-			cfg.BuildPGOFile = p
+		}
+
+		for _, p := range PackageList(pkgs) {
+			p.Internal.PGOProfile = file
+			updateBuildInfo(p, file)
 		}
 	}
 }
@@ -2945,20 +3014,17 @@
 // CheckPackageErrors prints errors encountered loading pkgs and their
 // dependencies, then exits with a non-zero status if any errors were found.
 func CheckPackageErrors(pkgs []*Package) {
-	printed := map[*PackageError]bool{}
+	var anyIncomplete bool
 	for _, pkg := range pkgs {
-		if pkg.Error != nil {
-			base.Errorf("%v", pkg.Error)
-			printed[pkg.Error] = true
+		if pkg.Incomplete {
+			anyIncomplete = true
 		}
-		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
-				base.Errorf("%v", err)
+	}
+	if anyIncomplete {
+		all := PackageList(pkgs)
+		for _, p := range all {
+			if p.Error != nil {
+				base.Errorf("%v", p.Error)
 			}
 		}
 	}
@@ -2972,11 +3038,18 @@
 	seen := map[string]bool{}
 	reported := map[string]bool{}
 	for _, pkg := range PackageList(pkgs) {
-		if seen[pkg.ImportPath] && !reported[pkg.ImportPath] {
-			reported[pkg.ImportPath] = true
+		// -pgo=auto with multiple main packages can cause a package being
+		// built multiple times (with different profiles).
+		// We check that package import path + profile path is unique.
+		key := pkg.ImportPath
+		if pkg.Internal.PGOProfile != "" {
+			key += " pgo:" + pkg.Internal.PGOProfile
+		}
+		if seen[key] && !reported[key] {
+			reported[key] = true
 			base.Errorf("internal error: duplicate loads of %s", pkg.ImportPath)
 		}
-		seen[pkg.ImportPath] = true
+		seen[key] = true
 	}
 	base.ExitIfErrors()
 }
@@ -3019,6 +3092,7 @@
 		if treatAsMain[pkg.ImportPath] {
 			if pkg.Error == nil {
 				pkg.Error = &PackageError{Err: &mainPackageError{importPath: pkg.ImportPath}}
+				pkg.Incomplete = true
 			}
 			mains = append(mains, pkg)
 		}
@@ -3079,6 +3153,7 @@
 			pkg.Error = &PackageError{
 				Err: fmt.Errorf("named files must be .go files: %s", pkg.Name),
 			}
+			pkg.Incomplete = true
 			return pkg
 		}
 	}
@@ -3148,6 +3223,7 @@
 
 	if opts.MainOnly && pkg.Name != "main" && pkg.Error == nil {
 		pkg.Error = &PackageError{Err: &mainPackageError{importPath: pkg.ImportPath}}
+		pkg.Incomplete = true
 	}
 	setToolFlags(pkg)
 
@@ -3179,9 +3255,10 @@
 
 	// Check that the arguments satisfy syntactic constraints.
 	var version string
+	var firstPath string
 	for _, arg := range args {
 		if i := strings.Index(arg, "@"); i >= 0 {
-			version = arg[i+1:]
+			firstPath, version = arg[:i], arg[i+1:]
 			if version == "" {
 				return nil, fmt.Errorf("%s: version must not be empty", arg)
 			}
@@ -3219,7 +3296,7 @@
 	// later arguments, and other modules would. Let's not try to be too
 	// magical though.
 	allowed := modload.CheckAllowed
-	if modload.IsRevisionQuery(version) {
+	if modload.IsRevisionQuery(firstPath, version) {
 		// Don't check for retractions if a specific revision is requested.
 		allowed = nil
 	}
@@ -3229,7 +3306,7 @@
 		return nil, fmt.Errorf("%s: %w", args[0], err)
 	}
 	rootMod := qrs[0].Mod
-	data, err := modfetch.GoMod(rootMod.Path, rootMod.Version)
+	data, err := modfetch.GoMod(ctx, rootMod.Path, rootMod.Version)
 	if err != nil {
 		return nil, fmt.Errorf("%s: %w", args[0], err)
 	}
@@ -3270,6 +3347,7 @@
 		}
 		if pkgErr != nil && pkg.Error == nil {
 			pkg.Error = &PackageError{Err: pkgErr}
+			pkg.Incomplete = true
 		}
 	}
 
@@ -3290,7 +3368,10 @@
 		}
 	}
 
-	p1 := LoadImportWithFlags(pkg, p.Dir, p, &ImportStack{}, nil, 0)
+	p1, err := LoadImportWithFlags(pkg, p.Dir, p, &ImportStack{}, nil, 0)
+	if err != nil {
+		base.Fatalf("load %s: %v", pkg, err)
+	}
 	if p1.Error != nil {
 		base.Fatalf("load %s: %v", pkg, p1.Error)
 	}
@@ -3433,7 +3514,7 @@
 	return covered
 }
 
-// declareCoverVars attaches the required cover variables names
+// DeclareCoverVars attaches the required cover variables names
 // to the files, to be used when annotating the files. This
 // function only called when using legacy coverage test/build
 // (e.g. GOEXPERIMENT=coverageredesign is off).
diff --git a/src/cmd/go/internal/load/test.go b/src/cmd/go/internal/load/test.go
index 0c20a23..e9ed0d3 100644
--- a/src/cmd/go/internal/load/test.go
+++ b/src/cmd/go/internal/load/test.go
@@ -16,6 +16,7 @@
 	"go/token"
 	"internal/lazytemplate"
 	"path/filepath"
+	"slices"
 	"sort"
 	"strings"
 	"unicode"
@@ -47,7 +48,7 @@
 // an error if the test packages or their dependencies have errors.
 // Only test packages without errors are returned.
 func TestPackagesFor(ctx context.Context, opts PackageOpts, p *Package, cover *TestCover) (pmain, ptest, pxtest *Package, err error) {
-	pmain, ptest, pxtest = TestPackagesAndErrors(ctx, opts, p, cover)
+	pmain, ptest, pxtest = TestPackagesAndErrors(ctx, nil, opts, p, cover)
 	for _, p1 := range []*Package{ptest, pxtest, pmain} {
 		if p1 == nil {
 			// pxtest may be nil
@@ -57,19 +58,24 @@
 			err = p1.Error
 			break
 		}
-		if len(p1.DepsErrors) > 0 {
-			perr := p1.DepsErrors[0]
-			err = perr
+		if p1.Incomplete {
+			ps := PackageList([]*Package{p1})
+			for _, p := range ps {
+				if p.Error != nil {
+					err = p.Error
+					break
+				}
+			}
 			break
 		}
 	}
-	if pmain.Error != nil || len(pmain.DepsErrors) > 0 {
+	if pmain.Error != nil || pmain.Incomplete {
 		pmain = nil
 	}
-	if ptest.Error != nil || len(ptest.DepsErrors) > 0 {
+	if ptest.Error != nil || ptest.Incomplete {
 		ptest = nil
 	}
-	if pxtest != nil && (pxtest.Error != nil || len(pxtest.DepsErrors) > 0) {
+	if pxtest != nil && (pxtest.Error != nil || pxtest.Incomplete) {
 		pxtest = nil
 	}
 	return pmain, ptest, pxtest, err
@@ -86,14 +92,13 @@
 // package p need not be instrumented for coverage or any other reason),
 // then the returned ptest == p.
 //
-// An error is returned if the testmain source cannot be completely generated
-// (for example, due to a syntax error in a test file). No error will be
-// returned for errors loading packages, but the Error or DepsError fields
-// of the returned packages may be set.
+// If done is non-nil, TestPackagesAndErrors will finish filling out the returned
+// package structs in a goroutine and call done once finished. The members of the
+// returned packages should not be accessed until done is called.
 //
 // The caller is expected to have checked that len(p.TestGoFiles)+len(p.XTestGoFiles) > 0,
 // or else there's no point in any of this.
-func TestPackagesAndErrors(ctx context.Context, opts PackageOpts, p *Package, cover *TestCover) (pmain, ptest, pxtest *Package) {
+func TestPackagesAndErrors(ctx context.Context, done func(), opts PackageOpts, p *Package, cover *TestCover) (pmain, ptest, pxtest *Package) {
 	ctx, span := trace.StartSpan(ctx, "load.TestPackagesAndErrors")
 	defer span.Done()
 
@@ -107,30 +112,29 @@
 	var imports, ximports []*Package
 	var stk ImportStack
 	var testEmbed, xtestEmbed map[string][]string
+	var incomplete bool
 	stk.Push(p.ImportPath + " (test)")
 	rawTestImports := str.StringList(p.TestImports)
 	for i, path := range p.TestImports {
-		p1 := loadImport(ctx, opts, pre, path, p.Dir, p, &stk, p.Internal.Build.TestImportPos[path], ResolveImport)
-		if str.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.
-			ptestErr = &PackageError{
-				ImportStack:   importCycleStack(p1, p.ImportPath),
-				Err:           errors.New("import cycle not allowed in test"),
-				IsImportCycle: true,
-			}
+		p1, err := loadImport(ctx, opts, pre, path, p.Dir, p, &stk, p.Internal.Build.TestImportPos[path], ResolveImport)
+		if err != nil && ptestErr == nil {
+			ptestErr = err
+			incomplete = true
+		}
+		if p1.Incomplete {
+			incomplete = true
 		}
 		p.TestImports[i] = p1.ImportPath
 		imports = append(imports, p1)
 	}
 	var err error
 	p.TestEmbedFiles, testEmbed, err = resolveEmbed(p.Dir, p.TestEmbedPatterns)
-	if err != nil && ptestErr == nil {
+	if err != nil {
 		ptestErr = &PackageError{
 			ImportStack: stk.Copy(),
 			Err:         err,
 		}
+		incomplete = true
 		embedErr := err.(*EmbedError)
 		ptestErr.setPos(p.Internal.Build.TestEmbedPatternPos[embedErr.Pattern])
 	}
@@ -138,9 +142,16 @@
 
 	stk.Push(p.ImportPath + "_test")
 	pxtestNeedsPtest := false
+	var pxtestIncomplete bool
 	rawXTestImports := str.StringList(p.XTestImports)
 	for i, path := range p.XTestImports {
-		p1 := loadImport(ctx, opts, pre, path, p.Dir, p, &stk, p.Internal.Build.XTestImportPos[path], ResolveImport)
+		p1, err := loadImport(ctx, opts, pre, path, p.Dir, p, &stk, p.Internal.Build.XTestImportPos[path], ResolveImport)
+		if err != nil && pxtestErr == nil {
+			pxtestErr = err
+		}
+		if p1.Incomplete {
+			pxtestIncomplete = true
+		}
 		if p1.ImportPath == p.ImportPath {
 			pxtestNeedsPtest = true
 		} else {
@@ -157,6 +168,7 @@
 		embedErr := err.(*EmbedError)
 		pxtestErr.setPos(p.Internal.Build.XTestEmbedPatternPos[embedErr.Pattern])
 	}
+	pxtestIncomplete = pxtestIncomplete || pxtestErr != nil
 	stk.Pop()
 
 	// Test package.
@@ -164,6 +176,7 @@
 		ptest = new(Package)
 		*ptest = *p
 		ptest.Error = ptestErr
+		ptest.Incomplete = incomplete
 		ptest.ForTest = p.ImportPath
 		ptest.GoFiles = nil
 		ptest.GoFiles = append(ptest.GoFiles, p.GoFiles...)
@@ -185,7 +198,7 @@
 		ptest.Internal.Imports = append(imports, p.Internal.Imports...)
 		ptest.Internal.RawImports = str.StringList(rawTestImports, p.Internal.RawImports)
 		ptest.Internal.ForceLibrary = true
-		ptest.Internal.BuildInfo = ""
+		ptest.Internal.BuildInfo = nil
 		ptest.Internal.Build = new(build.Package)
 		*ptest.Internal.Build = *p.Internal.Build
 		m := map[string][]token.Position{}
@@ -205,7 +218,8 @@
 		ptest.Internal.Embed = testEmbed
 		ptest.EmbedFiles = str.StringList(p.EmbedFiles, p.TestEmbedFiles)
 		ptest.Internal.OrigImportPath = p.Internal.OrigImportPath
-		ptest.collectDeps()
+		ptest.Internal.PGOProfile = p.Internal.PGOProfile
+		ptest.Internal.Build.Directives = append(slices.Clip(p.Internal.Build.Directives), p.Internal.Build.TestDirectives...)
 	} else {
 		ptest = p
 	}
@@ -224,12 +238,14 @@
 				ForTest:    p.ImportPath,
 				Module:     p.Module,
 				Error:      pxtestErr,
+				Incomplete: pxtestIncomplete,
 				EmbedFiles: p.XTestEmbedFiles,
 			},
 			Internal: PackageInternal{
 				LocalPrefix: p.Internal.LocalPrefix,
 				Build: &build.Package{
-					ImportPos: p.Internal.Build.XTestImportPos,
+					ImportPos:  p.Internal.Build.XTestImportPos,
+					Directives: p.Internal.Build.XTestDirectives,
 				},
 				Imports:    ximports,
 				RawImports: rawXTestImports,
@@ -240,14 +256,18 @@
 				Gccgoflags:     p.Internal.Gccgoflags,
 				Embed:          xtestEmbed,
 				OrigImportPath: p.Internal.OrigImportPath,
+				PGOProfile:     p.Internal.PGOProfile,
 			},
 		}
 		if pxtestNeedsPtest {
 			pxtest.Internal.Imports = append(pxtest.Internal.Imports, ptest)
 		}
-		pxtest.collectDeps()
 	}
 
+	// Arrange for testing.Testing to report true.
+	ldflags := append(p.Internal.Ldflags, "-X", "testing.testBinary=1")
+	gccgoflags := append(p.Internal.Gccgoflags, "-Wl,--defsym,testing.gccgoTestBinary=1")
+
 	// Build main package.
 	pmain = &Package{
 		PackagePublic: PackagePublic{
@@ -264,12 +284,16 @@
 			BuildInfo:      p.Internal.BuildInfo,
 			Asmflags:       p.Internal.Asmflags,
 			Gcflags:        p.Internal.Gcflags,
-			Ldflags:        p.Internal.Ldflags,
-			Gccgoflags:     p.Internal.Gccgoflags,
+			Ldflags:        ldflags,
+			Gccgoflags:     gccgoflags,
 			OrigImportPath: p.Internal.OrigImportPath,
+			PGOProfile:     p.Internal.PGOProfile,
 		},
 	}
 
+	pb := p.Internal.Build
+	pmain.DefaultGODEBUG = defaultGODEBUG(pmain, pb.Directives, pb.TestDirectives, pb.XTestDirectives)
+
 	// The generated main also imports testing, regexp, and os.
 	// Also the linker introduces implicit dependencies reported by LinkerDeps.
 	stk.Push("testmain")
@@ -281,155 +305,134 @@
 		if dep == ptest.ImportPath {
 			pmain.Internal.Imports = append(pmain.Internal.Imports, ptest)
 		} else {
-			p1 := loadImport(ctx, opts, pre, dep, "", nil, &stk, nil, 0)
+			p1, err := loadImport(ctx, opts, pre, dep, "", nil, &stk, nil, 0)
+			if err != nil && pmain.Error == nil {
+				pmain.Error = err
+				pmain.Incomplete = true
+			}
 			pmain.Internal.Imports = append(pmain.Internal.Imports, p1)
 		}
 	}
 	stk.Pop()
 
-	if cover != nil && cover.Pkgs != nil && !cfg.Experiment.CoverageRedesign {
-		// Add imports, but avoid duplicates.
-		seen := map[*Package]bool{p: true, ptest: true}
-		for _, p1 := range pmain.Internal.Imports {
-			seen[p1] = true
-		}
-		for _, p1 := range cover.Pkgs {
-			if seen[p1] {
-				// Don't add duplicate imports.
-				continue
+	parallelizablePart := func() {
+		if cover != nil && cover.Pkgs != nil && !cfg.Experiment.CoverageRedesign {
+			// Add imports, but avoid duplicates.
+			seen := map[*Package]bool{p: true, ptest: true}
+			for _, p1 := range pmain.Internal.Imports {
+				seen[p1] = true
 			}
-			seen[p1] = true
-			pmain.Internal.Imports = append(pmain.Internal.Imports, p1)
+			for _, p1 := range cover.Pkgs {
+				if seen[p1] {
+					// Don't add duplicate imports.
+					continue
+				}
+				seen[p1] = true
+				pmain.Internal.Imports = append(pmain.Internal.Imports, p1)
+			}
 		}
-	}
 
-	allTestImports := make([]*Package, 0, len(pmain.Internal.Imports)+len(imports)+len(ximports))
-	allTestImports = append(allTestImports, pmain.Internal.Imports...)
-	allTestImports = append(allTestImports, imports...)
-	allTestImports = append(allTestImports, ximports...)
-	setToolFlags(allTestImports...)
+		allTestImports := make([]*Package, 0, len(pmain.Internal.Imports)+len(imports)+len(ximports))
+		allTestImports = append(allTestImports, pmain.Internal.Imports...)
+		allTestImports = append(allTestImports, imports...)
+		allTestImports = append(allTestImports, ximports...)
+		setToolFlags(allTestImports...)
 
-	// 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 && pmain.Error == nil {
-		pmain.setLoadPackageDataError(err, p.ImportPath, &stk, nil)
-	}
-	t.Cover = cover
-	if len(ptest.GoFiles)+len(ptest.CgoFiles) > 0 {
-		pmain.Internal.Imports = append(pmain.Internal.Imports, ptest)
-		pmain.Imports = append(pmain.Imports, ptest.ImportPath)
-		t.ImportTest = true
-	}
-	if pxtest != nil {
-		pmain.Internal.Imports = append(pmain.Internal.Imports, pxtest)
-		pmain.Imports = append(pmain.Imports, pxtest.ImportPath)
-		t.ImportXtest = true
-	}
-	pmain.collectDeps()
-
-	// Sort and dedup pmain.Imports.
-	// Only matters for go list -test output.
-	sort.Strings(pmain.Imports)
-	w := 0
-	for _, path := range pmain.Imports {
-		if w == 0 || path != pmain.Imports[w-1] {
-			pmain.Imports[w] = path
-			w++
+		// 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(p)
+		if err != nil && pmain.Error == nil {
+			pmain.setLoadPackageDataError(err, p.ImportPath, &stk, nil)
 		}
-	}
-	pmain.Imports = pmain.Imports[:w]
-	pmain.Internal.RawImports = str.StringList(pmain.Imports)
-
-	// Replace pmain's transitive dependencies with test copies, as necessary.
-	recompileForTest(pmain, p, ptest, pxtest)
-
-	if cover != nil {
-		if cfg.Experiment.CoverageRedesign {
-			// Here ptest needs to inherit the proper coverage mode (since
-			// it contains p's Go files), whereas pmain contains only
-			// test harness code (don't want to instrument it, and
-			// we don't want coverage hooks in the pkg init).
-			ptest.Internal.CoverMode = p.Internal.CoverMode
-			pmain.Internal.CoverMode = "testmain"
+		t.Cover = cover
+		if len(ptest.GoFiles)+len(ptest.CgoFiles) > 0 {
+			pmain.Internal.Imports = append(pmain.Internal.Imports, ptest)
+			pmain.Imports = append(pmain.Imports, ptest.ImportPath)
+			t.ImportTest = true
 		}
-		// 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.
-		if cover.Local {
-			ptest.Internal.CoverMode = cover.Mode
+		if pxtest != nil {
+			pmain.Internal.Imports = append(pmain.Internal.Imports, pxtest)
+			pmain.Imports = append(pmain.Imports, pxtest.ImportPath)
+			t.ImportXtest = true
+		}
+
+		// Sort and dedup pmain.Imports.
+		// Only matters for go list -test output.
+		sort.Strings(pmain.Imports)
+		w := 0
+		for _, path := range pmain.Imports {
+			if w == 0 || path != pmain.Imports[w-1] {
+				pmain.Imports[w] = path
+				w++
+			}
+		}
+		pmain.Imports = pmain.Imports[:w]
+		pmain.Internal.RawImports = str.StringList(pmain.Imports)
+
+		// Replace pmain's transitive dependencies with test copies, as necessary.
+		cycleErr := recompileForTest(pmain, p, ptest, pxtest)
+		if cycleErr != nil {
+			ptest.Error = cycleErr
+			ptest.Incomplete = true
+		}
+
+		if cover != nil {
+			if cfg.Experiment.CoverageRedesign {
+				// Here ptest needs to inherit the proper coverage mode (since
+				// it contains p's Go files), whereas pmain contains only
+				// test harness code (don't want to instrument it, and
+				// we don't want coverage hooks in the pkg init).
+				ptest.Internal.CoverMode = p.Internal.CoverMode
+				pmain.Internal.CoverMode = "testmain"
+			}
+			// 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.
+			if cover.Local {
+				ptest.Internal.CoverMode = cover.Mode
+
+				if !cfg.Experiment.CoverageRedesign {
+					var coverFiles []string
+					coverFiles = append(coverFiles, ptest.GoFiles...)
+					coverFiles = append(coverFiles, ptest.CgoFiles...)
+					ptest.Internal.CoverVars = DeclareCoverVars(ptest, coverFiles...)
+				}
+			}
 
 			if !cfg.Experiment.CoverageRedesign {
-				var coverFiles []string
-				coverFiles = append(coverFiles, ptest.GoFiles...)
-				coverFiles = append(coverFiles, ptest.CgoFiles...)
-				ptest.Internal.CoverVars = DeclareCoverVars(ptest, coverFiles...)
-			}
-		}
-
-		if !cfg.Experiment.CoverageRedesign {
-			for _, cp := range pmain.Internal.Imports {
-				if len(cp.Internal.CoverVars) > 0 {
-					t.Cover.Vars = append(t.Cover.Vars, coverInfo{cp, cp.Internal.CoverVars})
+				for _, cp := range pmain.Internal.Imports {
+					if len(cp.Internal.CoverVars) > 0 {
+						t.Cover.Vars = append(t.Cover.Vars, coverInfo{cp, cp.Internal.CoverVars})
+					}
 				}
 			}
 		}
+
+		data, err := formatTestmain(t)
+		if err != nil && pmain.Error == nil {
+			pmain.Error = &PackageError{Err: err}
+			pmain.Incomplete = true
+		}
+		// Set TestmainGo even if it is empty: the presence of a TestmainGo
+		// indicates that this package is, in fact, a test main.
+		pmain.Internal.TestmainGo = &data
 	}
 
-	data, err := formatTestmain(t)
-	if err != nil && pmain.Error == nil {
-		pmain.Error = &PackageError{Err: err}
+	if done != nil {
+		go func() {
+			parallelizablePart()
+			done()
+		}()
+	} else {
+		parallelizablePart()
 	}
-	// Set TestmainGo even if it is empty: the presence of a TestmainGo
-	// indicates that this package is, in fact, a test main.
-	pmain.Internal.TestmainGo = &data
 
 	return pmain, ptest, pxtest
 }
 
-// importCycleStack returns an import stack from p to the package whose import
-// path is target.
-func importCycleStack(p *Package, target string) []string {
-	// importerOf maps each import path to its importer nearest to p.
-	importerOf := map[string]string{p.ImportPath: ""}
-
-	// q is a breadth-first queue of packages to search for target.
-	// Every package added to q has a corresponding entry in pathTo.
-	//
-	// We search breadth-first for two reasons:
-	//
-	// 	1. We want to report the shortest cycle.
-	//
-	// 	2. If p contains multiple cycles, the first cycle we encounter might not
-	// 	   contain target. To ensure termination, we have to break all cycles
-	// 	   other than the first.
-	q := []*Package{p}
-
-	for len(q) > 0 {
-		p := q[0]
-		q = q[1:]
-		if path := p.ImportPath; path == target {
-			var stk []string
-			for path != "" {
-				stk = append(stk, path)
-				path = importerOf[path]
-			}
-			return stk
-		}
-		for _, dep := range p.Internal.Imports {
-			if _, ok := importerOf[dep.ImportPath]; !ok {
-				importerOf[dep.ImportPath] = p.ImportPath
-				q = append(q, dep)
-			}
-		}
-	}
-
-	panic("lost path to cycle")
-}
-
 // recompileForTest copies and replaces certain packages in pmain's dependency
 // graph. This is necessary for two reasons. First, if ptest is different than
 // preal, packages that import the package under test should get ptest instead
@@ -439,7 +442,7 @@
 // clear p.Internal.BuildInfo in the test copy to prevent link conflicts.
 // This may happen if both -coverpkg and the command line patterns include
 // multiple main packages.
-func recompileForTest(pmain, preal, ptest, pxtest *Package) {
+func recompileForTest(pmain, preal, ptest, pxtest *Package) *PackageError {
 	// 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.
@@ -449,7 +452,7 @@
 			continue
 		}
 		// Copy on write.
-		didSplit := p == pmain || p == pxtest
+		didSplit := p == pmain || p == pxtest || p == ptest
 		split := func() {
 			if didSplit {
 				return
@@ -468,14 +471,19 @@
 			copy(p1.Imports, p.Imports)
 			p = p1
 			p.Target = ""
-			p.Internal.BuildInfo = ""
+			p.Internal.BuildInfo = nil
 			p.Internal.ForceLibrary = true
+			p.Internal.PGOProfile = preal.Internal.PGOProfile
 		}
 
 		// Update p.Internal.Imports to use test copies.
 		for i, imp := range p.Internal.Imports {
 			if p1 := testCopy[imp]; p1 != nil && p1 != imp {
 				split()
+
+				// If the test dependencies cause a cycle with pmain, this is
+				// where it is introduced.
+				// (There are no cycles in the graph until this assignment occurs.)
 				p.Internal.Imports[i] = p1
 			}
 		}
@@ -489,7 +497,66 @@
 		if p.Name == "main" && p != pmain && p != ptest {
 			split()
 		}
+		// Split and attach PGO information to test dependencies if preal
+		// is built with PGO.
+		if preal.Internal.PGOProfile != "" && p.Internal.PGOProfile == "" {
+			split()
+		}
 	}
+
+	// Do search to find cycle.
+	// importerOf maps each import path to its importer nearest to p.
+	importerOf := map[*Package]*Package{}
+	for _, p := range ptest.Internal.Imports {
+		importerOf[p] = nil
+	}
+
+	// q is a breadth-first queue of packages to search for target.
+	// Every package added to q has a corresponding entry in pathTo.
+	//
+	// We search breadth-first for two reasons:
+	//
+	// 	1. We want to report the shortest cycle.
+	//
+	// 	2. If p contains multiple cycles, the first cycle we encounter might not
+	// 	   contain target. To ensure termination, we have to break all cycles
+	// 	   other than the first.
+	q := slices.Clip(ptest.Internal.Imports)
+	for len(q) > 0 {
+		p := q[0]
+		q = q[1:]
+		if p == ptest {
+			// The stack is supposed to be in the order x imports y imports z.
+			// We collect in the reverse order: z is imported by y is imported
+			// by x, and then we reverse it.
+			var stk []string
+			for p != nil {
+				stk = append(stk, p.ImportPath)
+				p = importerOf[p]
+			}
+			// complete the cycle: we set importer[p] = nil to break the cycle
+			// in importerOf, it's an implicit importerOf[p] == pTest. Add it
+			// back here since we reached nil in the loop above to demonstrate
+			// the cycle as (for example) package p imports package q imports package r
+			// imports package p.
+			stk = append(stk, ptest.ImportPath)
+			slices.Reverse(stk)
+
+			return &PackageError{
+				ImportStack:   stk,
+				Err:           errors.New("import cycle not allowed in test"),
+				IsImportCycle: true,
+			}
+		}
+		for _, dep := range p.Internal.Imports {
+			if _, ok := importerOf[dep]; !ok {
+				importerOf[dep] = p
+				q = append(q, dep)
+			}
+		}
+	}
+
+	return nil
 }
 
 // isTestFunc tells whether fn has the type of a testing function. arg
@@ -882,11 +949,14 @@
 func runtime_coverage_processCoverTestDir(dir string, cfile string, cmode string, cpkgs string) error
 
 //go:linkname testing_registerCover2 testing.registerCover2
-func testing_registerCover2(mode string, tearDown func(coverprofile string, gocoverdir string) (string, error))
+func testing_registerCover2(mode string, tearDown func(coverprofile string, gocoverdir string) (string, error), snapcov func() float64)
 
 //go:linkname runtime_coverage_markProfileEmitted runtime/coverage.markProfileEmitted
 func runtime_coverage_markProfileEmitted(val bool)
 
+//go:linkname runtime_coverage_snapshot runtime/coverage.snapshot
+func runtime_coverage_snapshot() float64
+
 func coverTearDown(coverprofile string, gocoverdir string) (string, error) {
 	var err error
 	if gocoverdir == "" {
@@ -907,7 +977,7 @@
 
 func main() {
 {{if .Cover}}
-	testing_registerCover2({{printf "%q" .Cover.Mode}}, coverTearDown)
+	testing_registerCover2({{printf "%q" .Cover.Mode}}, coverTearDown, runtime_coverage_snapshot)
 {{end}}
 	m := testing.MainStart(testdeps.TestDeps{}, tests, benchmarks, fuzzTargets, examples)
 {{with .TestMain}}
diff --git a/src/cmd/go/internal/lockedfile/internal/filelock/filelock.go b/src/cmd/go/internal/lockedfile/internal/filelock/filelock.go
index 05f27c3..d373318 100644
--- a/src/cmd/go/internal/lockedfile/internal/filelock/filelock.go
+++ b/src/cmd/go/internal/lockedfile/internal/filelock/filelock.go
@@ -10,7 +10,6 @@
 import (
 	"errors"
 	"io/fs"
-	"os"
 )
 
 // A File provides the minimal set of methods required to lock an open file.
@@ -78,22 +77,7 @@
 
 // IsNotSupported returns a boolean indicating whether the error is known to
 // report that a function is not supported (possibly for a specific input).
-// It is satisfied by ErrNotSupported as well as some syscall errors.
+// It is satisfied by errors.ErrUnsupported as well as some syscall errors.
 func IsNotSupported(err error) bool {
-	return isNotSupported(underlyingError(err))
-}
-
-var ErrNotSupported = errors.New("operation not supported")
-
-// underlyingError returns the underlying error for known os error types.
-func underlyingError(err error) error {
-	switch err := err.(type) {
-	case *fs.PathError:
-		return err.Err
-	case *os.LinkError:
-		return err.Err
-	case *os.SyscallError:
-		return err.Err
-	}
-	return err
+	return errors.Is(err, errors.ErrUnsupported)
 }
diff --git a/src/cmd/go/internal/lockedfile/internal/filelock/filelock_fcntl.go b/src/cmd/go/internal/lockedfile/internal/filelock/filelock_fcntl.go
index 8568048..8a62839 100644
--- a/src/cmd/go/internal/lockedfile/internal/filelock/filelock_fcntl.go
+++ b/src/cmd/go/internal/lockedfile/internal/filelock/filelock_fcntl.go
@@ -208,7 +208,3 @@
 		}
 	}
 }
-
-func isNotSupported(err error) bool {
-	return err == syscall.ENOSYS || err == syscall.ENOTSUP || err == syscall.EOPNOTSUPP || err == ErrNotSupported
-}
diff --git a/src/cmd/go/internal/lockedfile/internal/filelock/filelock_other.go b/src/cmd/go/internal/lockedfile/internal/filelock/filelock_other.go
index c18dbdf..b16709e 100644
--- a/src/cmd/go/internal/lockedfile/internal/filelock/filelock_other.go
+++ b/src/cmd/go/internal/lockedfile/internal/filelock/filelock_other.go
@@ -2,11 +2,14 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build !unix && !plan9 && !windows
+//go:build !unix && !windows
 
 package filelock
 
-import "io/fs"
+import (
+	"errors"
+	"io/fs"
+)
 
 type lockType int8
 
@@ -19,7 +22,7 @@
 	return &fs.PathError{
 		Op:   lt.String(),
 		Path: f.Name(),
-		Err:  ErrNotSupported,
+		Err:  errors.ErrUnsupported,
 	}
 }
 
@@ -27,10 +30,6 @@
 	return &fs.PathError{
 		Op:   "Unlock",
 		Path: f.Name(),
-		Err:  ErrNotSupported,
+		Err:  errors.ErrUnsupported,
 	}
 }
-
-func isNotSupported(err error) bool {
-	return err == ErrNotSupported
-}
diff --git a/src/cmd/go/internal/lockedfile/internal/filelock/filelock_plan9.go b/src/cmd/go/internal/lockedfile/internal/filelock/filelock_plan9.go
deleted file mode 100644
index 54b2c94..0000000
--- a/src/cmd/go/internal/lockedfile/internal/filelock/filelock_plan9.go
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2018 The Go 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:build plan9
-
-package filelock
-
-import "io/fs"
-
-type lockType int8
-
-const (
-	readLock = iota + 1
-	writeLock
-)
-
-func lock(f File, lt lockType) error {
-	return &fs.PathError{
-		Op:   lt.String(),
-		Path: f.Name(),
-		Err:  ErrNotSupported,
-	}
-}
-
-func unlock(f File) error {
-	return &fs.PathError{
-		Op:   "Unlock",
-		Path: f.Name(),
-		Err:  ErrNotSupported,
-	}
-}
-
-func isNotSupported(err error) bool {
-	return err == ErrNotSupported
-}
diff --git a/src/cmd/go/internal/lockedfile/internal/filelock/filelock_test.go b/src/cmd/go/internal/lockedfile/internal/filelock/filelock_test.go
index 8e2c6ab..d32bf06 100644
--- a/src/cmd/go/internal/lockedfile/internal/filelock/filelock_test.go
+++ b/src/cmd/go/internal/lockedfile/internal/filelock/filelock_test.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build !js && !plan9
+//go:build !js && !plan9 && !wasip1
 
 package filelock_test
 
diff --git a/src/cmd/go/internal/lockedfile/internal/filelock/filelock_unix.go b/src/cmd/go/internal/lockedfile/internal/filelock/filelock_unix.go
index d7778d0..6f73b1b 100644
--- a/src/cmd/go/internal/lockedfile/internal/filelock/filelock_unix.go
+++ b/src/cmd/go/internal/lockedfile/internal/filelock/filelock_unix.go
@@ -38,7 +38,3 @@
 func unlock(f File) error {
 	return lock(f, syscall.LOCK_UN)
 }
-
-func isNotSupported(err error) bool {
-	return err == syscall.ENOSYS || err == syscall.ENOTSUP || err == syscall.EOPNOTSUPP || err == ErrNotSupported
-}
diff --git a/src/cmd/go/internal/lockedfile/internal/filelock/filelock_windows.go b/src/cmd/go/internal/lockedfile/internal/filelock/filelock_windows.go
index e2ca538..647ee99 100644
--- a/src/cmd/go/internal/lockedfile/internal/filelock/filelock_windows.go
+++ b/src/cmd/go/internal/lockedfile/internal/filelock/filelock_windows.go
@@ -55,12 +55,3 @@
 	}
 	return nil
 }
-
-func isNotSupported(err error) bool {
-	switch err {
-	case windows.ERROR_NOT_SUPPORTED, windows.ERROR_CALL_NOT_IMPLEMENTED, ErrNotSupported:
-		return true
-	default:
-		return false
-	}
-}
diff --git a/src/cmd/go/internal/lockedfile/lockedfile_test.go b/src/cmd/go/internal/lockedfile/lockedfile_test.go
index 5f6153c..8dea8f7 100644
--- a/src/cmd/go/internal/lockedfile/lockedfile_test.go
+++ b/src/cmd/go/internal/lockedfile/lockedfile_test.go
@@ -2,9 +2,9 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// js does not support inter-process file locking.
+// js and wasip1 do not support inter-process file locking.
 //
-//go:build !js
+//go:build !js && !wasip1
 
 package lockedfile_test
 
@@ -43,19 +43,32 @@
 		close(done)
 	}()
 
+	timer := time.NewTimer(quiescent)
+	defer timer.Stop()
 	select {
 	case <-done:
 		t.Fatalf("%s unexpectedly did not block", desc)
-		return nil
+	case <-timer.C:
+	}
 
-	case <-time.After(quiescent):
-		return func(t *testing.T) {
+	return func(t *testing.T) {
+		logTimer := time.NewTimer(quiescent)
+		defer logTimer.Stop()
+
+		select {
+		case <-logTimer.C:
+			// We expect the operation to have unblocked by now,
+			// but maybe it's just slow. Write to the test log
+			// in case the test times out, but don't fail it.
 			t.Helper()
-			select {
-			case <-time.After(probablyStillBlocked):
-				t.Fatalf("%s is unexpectedly still blocked after %v", desc, probablyStillBlocked)
-			case <-done:
-			}
+			t.Logf("%s is unexpectedly still blocked after %v", desc, quiescent)
+
+			// Wait for the operation to actually complete, no matter how long it
+			// takes. If the test has deadlocked, this will cause the test to time out
+			// and dump goroutines.
+			<-done
+
+		case <-done:
 		}
 	}
 }
@@ -244,10 +257,12 @@
 		if _, err := os.Stat(filepath.Join(dir, "locked")); !os.IsNotExist(err) {
 			break locked
 		}
+		timer := time.NewTimer(1 * time.Millisecond)
 		select {
 		case <-qDone:
+			timer.Stop()
 			break locked
-		case <-time.After(1 * time.Millisecond):
+		case <-timer.C:
 		}
 	}
 
diff --git a/src/cmd/go/internal/lockedfile/transform_test.go b/src/cmd/go/internal/lockedfile/transform_test.go
index 833cbf7..f8b2802 100644
--- a/src/cmd/go/internal/lockedfile/transform_test.go
+++ b/src/cmd/go/internal/lockedfile/transform_test.go
@@ -2,9 +2,9 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// js does not support inter-process file locking.
+// js and wasip1 do not support inter-process file locking.
 //
-//go:build !js
+//go:build !js && !wasip1
 
 package lockedfile_test
 
diff --git a/src/cmd/go/internal/mmap/mmap_other.go b/src/cmd/go/internal/mmap/mmap_other.go
index d146a42..22e9395 100644
--- a/src/cmd/go/internal/mmap/mmap_other.go
+++ b/src/cmd/go/internal/mmap/mmap_other.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build (js && wasm) || plan9
+//go:build (js && wasm) || wasip1 || plan9
 
 package mmap
 
diff --git a/src/cmd/go/internal/modcmd/download.go b/src/cmd/go/internal/modcmd/download.go
index f0b62e8..e49cd9f 100644
--- a/src/cmd/go/internal/modcmd/download.go
+++ b/src/cmd/go/internal/modcmd/download.go
@@ -7,17 +7,18 @@
 import (
 	"context"
 	"encoding/json"
+	"errors"
 	"os"
 	"runtime"
 
 	"cmd/go/internal/base"
 	"cmd/go/internal/cfg"
+	"cmd/go/internal/gover"
 	"cmd/go/internal/modfetch"
 	"cmd/go/internal/modfetch/codehost"
 	"cmd/go/internal/modload"
 
 	"golang.org/x/mod/module"
-	"golang.org/x/mod/semver"
 )
 
 var cmdDownload = &base.Command{
@@ -88,7 +89,8 @@
 	base.AddModCommonFlags(&cmdDownload.Flag)
 }
 
-type moduleJSON struct {
+// A ModuleJSON describes the result of go mod download.
+type ModuleJSON struct {
 	Path     string `json:",omitempty"`
 	Version  string `json:",omitempty"`
 	Query    string `json:",omitempty"`
@@ -134,7 +136,7 @@
 		} else {
 			mainModule := modload.MainModules.Versions()[0]
 			modFile := modload.MainModules.ModFile(mainModule)
-			if modFile.Go == nil || semver.Compare("v"+modFile.Go.Version, modload.ExplicitIndirectVersionV) < 0 {
+			if modFile.Go == nil || gover.Compare(modFile.Go.Version, gover.ExplicitIndirectVersion) < 0 {
 				if len(modFile.Require) > 0 {
 					args = []string{"all"}
 				}
@@ -149,7 +151,10 @@
 				// However, we also need to load the full module graph, to ensure that
 				// we have downloaded enough of the module graph to run 'go list all',
 				// 'go mod graph', and similar commands.
-				_ = modload.LoadModGraph(ctx, "")
+				_, err := modload.LoadModGraph(ctx, "")
+				if err != nil {
+					base.Fatal(err)
+				}
 
 				for _, m := range modFile.Require {
 					args = append(args, m.Mod.Path)
@@ -167,46 +172,31 @@
 		base.Exit()
 	}
 
-	downloadModule := func(m *moduleJSON) {
-		_, file, err := modfetch.InfoFile(m.Path, m.Version)
-		if err != nil {
-			m.Error = err.Error()
-			return
-		}
-		m.Info = file
-		m.GoMod, err = modfetch.GoModFile(m.Path, m.Version)
-		if err != nil {
-			m.Error = err.Error()
-			return
-		}
-		m.GoModSum, err = modfetch.GoModSum(m.Path, m.Version)
-		if err != nil {
-			m.Error = err.Error()
-			return
-		}
-		mod := module.Version{Path: m.Path, Version: m.Version}
-		m.Zip, err = modfetch.DownloadZip(ctx, mod)
-		if err != nil {
-			m.Error = err.Error()
-			return
-		}
-		m.Sum = modfetch.Sum(mod)
-		m.Dir, err = modfetch.Download(ctx, mod)
-		if err != nil {
-			m.Error = err.Error()
-			return
-		}
-	}
-
-	var mods []*moduleJSON
-
 	if *downloadReuse != "" && modload.HasModRoot() {
 		base.Fatalf("go mod download -reuse cannot be used inside a module")
 	}
 
+	var mods []*ModuleJSON
 	type token struct{}
 	sem := make(chan token, runtime.GOMAXPROCS(0))
 	infos, infosErr := modload.ListModules(ctx, args, 0, *downloadReuse)
+
+	// There is a bit of a chicken-and-egg problem here: ideally we need to know
+	// which Go version to switch to to download the requested modules, but if we
+	// haven't downloaded the module's go.mod file yet the GoVersion field of its
+	// info struct is not yet populated.
+	//
+	// We also need to be careful to only print the info for each module once
+	// if the -json flag is set.
+	//
+	// In theory we could go through each module in the list, attempt to download
+	// its go.mod file, and record the maximum version (either from the file or
+	// from the resulting TooNewError), all before we try the actual full download
+	// of each module.
+	//
+	// For now, we just let it fail: the user can explicitly set GOTOOLCHAIN
+	// and retry if they want to.
+
 	if !haveExplicitArgs && modload.WorkFilePath() == "" {
 		// 'go mod download' is sometimes run without arguments to pre-populate the
 		// module cache. In modules that aren't at go 1.17 or higher, it may fetch
@@ -218,8 +208,8 @@
 		// TODO(#45551): In the future, report an error if go.mod or go.sum need to
 		// be updated after loading the build list. This may require setting
 		// the mode to "mod" or "readonly" depending on haveExplicitArgs.
-		if err := modload.WriteGoMod(ctx); err != nil {
-			base.Fatalf("go: %v", err)
+		if err := modload.WriteGoMod(ctx, modload.WriteOpts{}); err != nil {
+			base.Fatal(err)
 		}
 	}
 
@@ -232,7 +222,7 @@
 			// Nothing to download.
 			continue
 		}
-		m := &moduleJSON{
+		m := &ModuleJSON{
 			Path:    info.Path,
 			Version: info.Version,
 			Query:   info.Query,
@@ -249,7 +239,7 @@
 		}
 		sem <- token{}
 		go func() {
-			downloadModule(m)
+			DownloadModule(ctx, m)
 			<-sem
 		}()
 	}
@@ -263,7 +253,7 @@
 		for _, m := range mods {
 			b, err := json.MarshalIndent(m, "", "\t")
 			if err != nil {
-				base.Fatalf("go: %v", err)
+				base.Fatal(err)
 			}
 			os.Stdout.Write(append(b, '\n'))
 			if m.Error != "" {
@@ -273,7 +263,7 @@
 	} else {
 		for _, m := range mods {
 			if m.Error != "" {
-				base.Errorf("go: %v", m.Error)
+				base.Error(errors.New(m.Error))
 			}
 		}
 		base.ExitIfErrors()
@@ -297,8 +287,8 @@
 	// Don't save sums for 'go mod download' without arguments unless we're in
 	// workspace mode; see comment above.
 	if haveExplicitArgs || modload.WorkFilePath() != "" {
-		if err := modload.WriteGoMod(ctx); err != nil {
-			base.Errorf("go: %v", err)
+		if err := modload.WriteGoMod(ctx, modload.WriteOpts{}); err != nil {
+			base.Error(err)
 		}
 	}
 
@@ -306,6 +296,40 @@
 	// (after we've written the checksums for the modules that were downloaded
 	// successfully).
 	if infosErr != nil {
-		base.Errorf("go: %v", infosErr)
+		base.Error(infosErr)
+	}
+}
+
+// DownloadModule runs 'go mod download' for m.Path@m.Version,
+// leaving the results (including any error) in m itself.
+func DownloadModule(ctx context.Context, m *ModuleJSON) {
+	var err error
+	_, file, err := modfetch.InfoFile(ctx, m.Path, m.Version)
+	if err != nil {
+		m.Error = err.Error()
+		return
+	}
+	m.Info = file
+	m.GoMod, err = modfetch.GoModFile(ctx, m.Path, m.Version)
+	if err != nil {
+		m.Error = err.Error()
+		return
+	}
+	m.GoModSum, err = modfetch.GoModSum(ctx, m.Path, m.Version)
+	if err != nil {
+		m.Error = err.Error()
+		return
+	}
+	mod := module.Version{Path: m.Path, Version: m.Version}
+	m.Zip, err = modfetch.DownloadZip(ctx, mod)
+	if err != nil {
+		m.Error = err.Error()
+		return
+	}
+	m.Sum = modfetch.Sum(ctx, mod)
+	m.Dir, err = modfetch.Download(ctx, mod)
+	if err != nil {
+		m.Error = err.Error()
+		return
 	}
 }
diff --git a/src/cmd/go/internal/modcmd/edit.go b/src/cmd/go/internal/modcmd/edit.go
index 5fd13f2..96bd608 100644
--- a/src/cmd/go/internal/modcmd/edit.go
+++ b/src/cmd/go/internal/modcmd/edit.go
@@ -16,6 +16,7 @@
 	"strings"
 
 	"cmd/go/internal/base"
+	"cmd/go/internal/gover"
 	"cmd/go/internal/lockedfile"
 	"cmd/go/internal/modfetch"
 	"cmd/go/internal/modload"
@@ -78,6 +79,8 @@
 
 The -go=version flag sets the expected Go language version.
 
+The -toolchain=name flag sets the Go toolchain to use.
+
 The -print flag prints the final go.mod in its text format instead of
 writing it back to go.mod.
 
@@ -90,12 +93,13 @@
 	}
 
 	type GoMod struct {
-		Module  ModPath
-		Go      string
-		Require []Require
-		Exclude []Module
-		Replace []Replace
-		Retract []Retract
+		Module    ModPath
+		Go        string
+		Toolchain string
+		Require   []Require
+		Exclude   []Module
+		Replace   []Replace
+		Retract   []Retract
 	}
 
 	type ModPath struct {
@@ -134,12 +138,13 @@
 }
 
 var (
-	editFmt    = cmdEdit.Flag.Bool("fmt", false, "")
-	editGo     = cmdEdit.Flag.String("go", "", "")
-	editJSON   = cmdEdit.Flag.Bool("json", false, "")
-	editPrint  = cmdEdit.Flag.Bool("print", false, "")
-	editModule = cmdEdit.Flag.String("module", "", "")
-	edits      []func(*modfile.File) // edits specified in flags
+	editFmt       = cmdEdit.Flag.Bool("fmt", false, "")
+	editGo        = cmdEdit.Flag.String("go", "", "")
+	editToolchain = cmdEdit.Flag.String("toolchain", "", "")
+	editJSON      = cmdEdit.Flag.Bool("json", false, "")
+	editPrint     = cmdEdit.Flag.Bool("print", false, "")
+	editModule    = cmdEdit.Flag.String("module", "", "")
+	edits         []func(*modfile.File) // edits specified in flags
 )
 
 type flagFunc func(string)
@@ -165,13 +170,13 @@
 }
 
 func runEdit(ctx context.Context, cmd *base.Command, args []string) {
-	anyFlags :=
-		*editModule != "" ||
-			*editGo != "" ||
-			*editJSON ||
-			*editPrint ||
-			*editFmt ||
-			len(edits) > 0
+	anyFlags := *editModule != "" ||
+		*editGo != "" ||
+		*editToolchain != "" ||
+		*editJSON ||
+		*editPrint ||
+		*editFmt ||
+		len(edits) > 0
 
 	if !anyFlags {
 		base.Fatalf("go: no flags specified (see 'go help mod edit').")
@@ -197,15 +202,20 @@
 		}
 	}
 
-	if *editGo != "" {
+	if *editGo != "" && *editGo != "none" {
 		if !modfile.GoVersionRE.MatchString(*editGo) {
-			base.Fatalf(`go mod: invalid -go option; expecting something like "-go %s"`, modload.LatestGoVersion())
+			base.Fatalf(`go mod: invalid -go option; expecting something like "-go %s"`, gover.Local())
+		}
+	}
+	if *editToolchain != "" && *editToolchain != "none" {
+		if !modfile.ToolchainRE.MatchString(*editToolchain) {
+			base.Fatalf(`go mod: invalid -toolchain option; expecting something like "-toolchain go%s"`, gover.Local())
 		}
 	}
 
 	data, err := lockedfile.Read(gomod)
 	if err != nil {
-		base.Fatalf("go: %v", err)
+		base.Fatal(err)
 	}
 
 	modFile, err := modfile.Parse(gomod, data, nil)
@@ -217,11 +227,20 @@
 		modFile.AddModuleStmt(*editModule)
 	}
 
-	if *editGo != "" {
+	if *editGo == "none" {
+		modFile.DropGoStmt()
+	} else if *editGo != "" {
 		if err := modFile.AddGoStmt(*editGo); err != nil {
 			base.Fatalf("go: internal error: %v", err)
 		}
 	}
+	if *editToolchain == "none" {
+		modFile.DropToolchainStmt()
+	} else if *editToolchain != "" {
+		if err := modFile.AddToolchainStmt(*editToolchain); err != nil {
+			base.Fatalf("go: internal error: %v", err)
+		}
+	}
 
 	if len(edits) > 0 {
 		for _, edit := range edits {
@@ -238,7 +257,7 @@
 
 	out, err := modFile.Format()
 	if err != nil {
-		base.Fatalf("go: %v", err)
+		base.Fatal(err)
 	}
 
 	if *editPrint {
@@ -248,7 +267,7 @@
 
 	// Make a best-effort attempt to acquire the side lock, only to exclude
 	// previous versions of the 'go' command from making simultaneous edits.
-	if unlock, err := modfetch.SideLock(); err == nil {
+	if unlock, err := modfetch.SideLock(ctx); err == nil {
 		defer unlock()
 	}
 
@@ -259,7 +278,7 @@
 		return out, nil
 	})
 	if err != nil {
-		base.Fatalf("go: %v", err)
+		base.Fatal(err)
 	}
 }
 
@@ -459,12 +478,13 @@
 
 // fileJSON is the -json output data structure.
 type fileJSON struct {
-	Module  editModuleJSON
-	Go      string `json:",omitempty"`
-	Require []requireJSON
-	Exclude []module.Version
-	Replace []replaceJSON
-	Retract []retractJSON
+	Module    editModuleJSON
+	Go        string `json:",omitempty"`
+	Toolchain string `json:",omitempty"`
+	Require   []requireJSON
+	Exclude   []module.Version
+	Replace   []replaceJSON
+	Retract   []retractJSON
 }
 
 type editModuleJSON struct {
@@ -501,6 +521,9 @@
 	if modFile.Go != nil {
 		f.Go = modFile.Go.Version
 	}
+	if modFile.Toolchain != nil {
+		f.Toolchain = modFile.Toolchain.Name
+	}
 	for _, r := range modFile.Require {
 		f.Require = append(f.Require, requireJSON{Path: r.Mod.Path, Version: r.Mod.Version, Indirect: r.Indirect})
 	}
diff --git a/src/cmd/go/internal/modcmd/graph.go b/src/cmd/go/internal/modcmd/graph.go
index 555604d..172c1dd 100644
--- a/src/cmd/go/internal/modcmd/graph.go
+++ b/src/cmd/go/internal/modcmd/graph.go
@@ -13,7 +13,9 @@
 
 	"cmd/go/internal/base"
 	"cmd/go/internal/cfg"
+	"cmd/go/internal/gover"
 	"cmd/go/internal/modload"
+	"cmd/go/internal/toolchain"
 
 	"golang.org/x/mod/module"
 )
@@ -57,7 +59,19 @@
 	}
 	modload.ForceUseModules = true
 	modload.RootMode = modload.NeedRoot
-	mg := modload.LoadModGraph(ctx, graphGo.String())
+
+	goVersion := graphGo.String()
+	if goVersion != "" && gover.Compare(gover.Local(), goVersion) < 0 {
+		toolchain.SwitchOrFatal(ctx, &gover.TooNewError{
+			What:      "-go flag",
+			GoVersion: goVersion,
+		})
+	}
+
+	mg, err := modload.LoadModGraph(ctx, goVersion)
+	if err != nil {
+		base.Fatal(err)
+	}
 
 	w := bufio.NewWriter(os.Stdout)
 	defer w.Flush()
diff --git a/src/cmd/go/internal/modcmd/tidy.go b/src/cmd/go/internal/modcmd/tidy.go
index 7e33ad2..36be926 100644
--- a/src/cmd/go/internal/modcmd/tidy.go
+++ b/src/cmd/go/internal/modcmd/tidy.go
@@ -9,13 +9,14 @@
 import (
 	"cmd/go/internal/base"
 	"cmd/go/internal/cfg"
+	"cmd/go/internal/gover"
 	"cmd/go/internal/imports"
 	"cmd/go/internal/modload"
+	"cmd/go/internal/toolchain"
 	"context"
 	"fmt"
 
 	"golang.org/x/mod/modfile"
-	"golang.org/x/mod/semver"
 )
 
 var cmdTidy = &base.Command{
@@ -84,11 +85,11 @@
 
 func (f *goVersionFlag) Set(s string) error {
 	if s != "" {
-		latest := modload.LatestGoVersion()
+		latest := gover.Local()
 		if !modfile.GoVersionRE.MatchString(s) {
 			return fmt.Errorf("expecting a Go version like %q", latest)
 		}
-		if semver.Compare("v"+s, "v"+latest) > 0 {
+		if gover.Compare(s, latest) > 0 {
 			return fmt.Errorf("maximum supported Go version is %s", latest)
 		}
 	}
@@ -115,8 +116,16 @@
 	modload.ForceUseModules = true
 	modload.RootMode = modload.NeedRoot
 
+	goVersion := tidyGo.String()
+	if goVersion != "" && gover.Compare(gover.Local(), goVersion) < 0 {
+		toolchain.SwitchOrFatal(ctx, &gover.TooNewError{
+			What:      "-go flag",
+			GoVersion: goVersion,
+		})
+	}
+
 	modload.LoadPackages(ctx, modload.PackageOpts{
-		GoVersion:                tidyGo.String(),
+		TidyGoVersion:            tidyGo.String(),
 		Tags:                     imports.AnyTags(),
 		Tidy:                     true,
 		TidyCompatibleVersion:    tidyCompat.String(),
@@ -125,5 +134,6 @@
 		LoadTests:                true,
 		AllowErrors:              tidyE,
 		SilenceMissingStdImports: true,
+		Switcher:                 new(toolchain.Switcher),
 	}, "all")
 }
diff --git a/src/cmd/go/internal/modcmd/vendor.go b/src/cmd/go/internal/modcmd/vendor.go
index 2bb2eb8..1a0d69e 100644
--- a/src/cmd/go/internal/modcmd/vendor.go
+++ b/src/cmd/go/internal/modcmd/vendor.go
@@ -21,13 +21,13 @@
 	"cmd/go/internal/base"
 	"cmd/go/internal/cfg"
 	"cmd/go/internal/fsys"
+	"cmd/go/internal/gover"
 	"cmd/go/internal/imports"
 	"cmd/go/internal/load"
 	"cmd/go/internal/modload"
 	"cmd/go/internal/str"
 
 	"golang.org/x/mod/module"
-	"golang.org/x/mod/semver"
 )
 
 var cmdVendor = &base.Command{
@@ -92,7 +92,7 @@
 		vdir = filepath.Join(modload.VendorDir())
 	}
 	if err := os.RemoveAll(vdir); err != nil {
-		base.Fatalf("go: %v", err)
+		base.Fatal(err)
 	}
 
 	modpkgs := make(map[module.Version][]string)
@@ -108,7 +108,7 @@
 	includeGoVersions := false
 	isExplicit := map[module.Version]bool{}
 	if gv := modload.ModFile().Go; gv != nil {
-		if semver.Compare("v"+gv.Version, "v1.14") >= 0 {
+		if gover.Compare(gv.Version, "1.14") >= 0 {
 			// If the Go version is at least 1.14, annotate all explicit 'require' and
 			// 'replace' targets found in the go.mod file so that we can perform a
 			// stronger consistency check when -mod=vendor is set.
@@ -117,7 +117,7 @@
 			}
 			includeAllReplacements = true
 		}
-		if semver.Compare("v"+gv.Version, "v1.17") >= 0 {
+		if gover.Compare(gv.Version, "1.17") >= 0 {
 			// If the Go version is at least 1.17, annotate all modules with their
 			// 'go' version directives.
 			includeGoVersions = true
@@ -133,7 +133,7 @@
 			vendorMods = append(vendorMods, m)
 		}
 	}
-	module.Sort(vendorMods)
+	gover.ModSort(vendorMods)
 
 	var (
 		buf bytes.Buffer
@@ -194,11 +194,11 @@
 	}
 
 	if err := os.MkdirAll(vdir, 0777); err != nil {
-		base.Fatalf("go: %v", err)
+		base.Fatal(err)
 	}
 
 	if err := os.WriteFile(filepath.Join(vdir, "modules.txt"), buf.Bytes(), 0666); err != nil {
-		base.Fatalf("go: %v", err)
+		base.Fatal(err)
 	}
 }
 
@@ -211,7 +211,7 @@
 		b.WriteString(m.Version)
 	}
 	if r.Path != "" {
-		if strings.HasPrefix(r.Path, "./vendor") || strings.HasPrefix(r.Path, ".\vendor") {
+		if str.HasFilePathPrefix(filepath.Clean(r.Path), "vendor") {
 			base.Fatalf("go: replacement path %s inside vendor directory", r.Path)
 		}
 		b.WriteString(" => ")
@@ -274,7 +274,7 @@
 	embedPatterns := str.StringList(bp.EmbedPatterns, bp.TestEmbedPatterns, bp.XTestEmbedPatterns)
 	embeds, err := load.ResolveEmbed(bp.Dir, embedPatterns)
 	if err != nil {
-		base.Fatalf("go: %v", err)
+		base.Fatal(err)
 	}
 	for _, embed := range embeds {
 		embedDst := filepath.Join(dst, embed)
@@ -285,21 +285,21 @@
 		// Copy the file as is done by copyDir below.
 		r, err := os.Open(filepath.Join(src, embed))
 		if err != nil {
-			base.Fatalf("go: %v", err)
+			base.Fatal(err)
 		}
 		if err := os.MkdirAll(filepath.Dir(embedDst), 0777); err != nil {
-			base.Fatalf("go: %v", err)
+			base.Fatal(err)
 		}
 		w, err := os.Create(embedDst)
 		if err != nil {
-			base.Fatalf("go: %v", err)
+			base.Fatal(err)
 		}
 		if _, err := io.Copy(w, r); err != nil {
-			base.Fatalf("go: %v", err)
+			base.Fatal(err)
 		}
 		r.Close()
 		if err := w.Close(); err != nil {
-			base.Fatalf("go: %v", err)
+			base.Fatal(err)
 		}
 	}
 }
@@ -367,7 +367,7 @@
 		return false
 	}
 	if info.Name() == "go.mod" || info.Name() == "go.sum" {
-		if gv := modload.ModFile().Go; gv != nil && semver.Compare("v"+gv.Version, "v1.17") >= 0 {
+		if gv := modload.ModFile().Go; gv != nil && gover.Compare(gv.Version, "1.17") >= 0 {
 			// As of Go 1.17, we strip go.mod and go.sum files from dependency modules.
 			// Otherwise, 'go' commands invoked within the vendor subtree may misidentify
 			// an arbitrary directory within the vendor tree as a module root.
@@ -378,7 +378,7 @@
 	if strings.HasSuffix(info.Name(), ".go") {
 		f, err := fsys.Open(filepath.Join(dir, info.Name()))
 		if err != nil {
-			base.Fatalf("go: %v", err)
+			base.Fatal(err)
 		}
 		defer f.Close()
 
@@ -400,10 +400,10 @@
 func copyDir(dst, src string, match func(dir string, info fs.DirEntry) bool, copiedFiles map[string]bool) {
 	files, err := os.ReadDir(src)
 	if err != nil {
-		base.Fatalf("go: %v", err)
+		base.Fatal(err)
 	}
 	if err := os.MkdirAll(dst, 0777); err != nil {
-		base.Fatalf("go: %v", err)
+		base.Fatal(err)
 	}
 	for _, file := range files {
 		if file.IsDir() || !file.Type().IsRegular() || !match(src, file) {
@@ -412,20 +412,20 @@
 		copiedFiles[file.Name()] = true
 		r, err := os.Open(filepath.Join(src, file.Name()))
 		if err != nil {
-			base.Fatalf("go: %v", err)
+			base.Fatal(err)
 		}
 		dstPath := filepath.Join(dst, file.Name())
 		copiedFiles[dstPath] = true
 		w, err := os.Create(dstPath)
 		if err != nil {
-			base.Fatalf("go: %v", err)
+			base.Fatal(err)
 		}
 		if _, err := io.Copy(w, r); err != nil {
-			base.Fatalf("go: %v", err)
+			base.Fatal(err)
 		}
 		r.Close()
 		if err := w.Close(); err != nil {
-			base.Fatalf("go: %v", err)
+			base.Fatal(err)
 		}
 	}
 }
diff --git a/src/cmd/go/internal/modcmd/verify.go b/src/cmd/go/internal/modcmd/verify.go
index a5f7f24..4552ed1 100644
--- a/src/cmd/go/internal/modcmd/verify.go
+++ b/src/cmd/go/internal/modcmd/verify.go
@@ -14,6 +14,7 @@
 	"runtime"
 
 	"cmd/go/internal/base"
+	"cmd/go/internal/gover"
 	"cmd/go/internal/modfetch"
 	"cmd/go/internal/modload"
 
@@ -56,9 +57,12 @@
 	type token struct{}
 	sem := make(chan token, runtime.GOMAXPROCS(0))
 
+	mg, err := modload.LoadModGraph(ctx, "")
+	if err != nil {
+		base.Fatal(err)
+	}
+	mods := mg.BuildList()[modload.MainModules.Len():]
 	// Use a slice of result channels, so that the output is deterministic.
-	const defaultGoVersion = ""
-	mods := modload.LoadModGraph(ctx, defaultGoVersion).BuildList()[1:]
 	errsChans := make([]<-chan []error, len(mods))
 
 	for i, mod := range mods {
@@ -67,7 +71,7 @@
 		errsChans[i] = errsc
 		mod := mod // use a copy to avoid data races
 		go func() {
-			errsc <- verifyMod(mod)
+			errsc <- verifyMod(ctx, mod)
 			<-sem
 		}()
 	}
@@ -85,13 +89,17 @@
 	}
 }
 
-func verifyMod(mod module.Version) []error {
+func verifyMod(ctx context.Context, mod module.Version) []error {
+	if gover.IsToolchain(mod.Path) {
+		// "go" and "toolchain" have no disk footprint; nothing to verify.
+		return nil
+	}
 	var errs []error
-	zip, zipErr := modfetch.CachePath(mod, "zip")
+	zip, zipErr := modfetch.CachePath(ctx, mod, "zip")
 	if zipErr == nil {
 		_, zipErr = os.Stat(zip)
 	}
-	dir, dirErr := modfetch.DownloadDir(mod)
+	dir, dirErr := modfetch.DownloadDir(ctx, mod)
 	data, err := os.ReadFile(zip + "hash")
 	if err != nil {
 		if zipErr != nil && errors.Is(zipErr, fs.ErrNotExist) &&
diff --git a/src/cmd/go/internal/modcmd/why.go b/src/cmd/go/internal/modcmd/why.go
index 729c88f..198672d 100644
--- a/src/cmd/go/internal/modcmd/why.go
+++ b/src/cmd/go/internal/modcmd/why.go
@@ -85,7 +85,7 @@
 
 		mods, err := modload.ListModules(ctx, args, 0, "")
 		if err != nil {
-			base.Fatalf("go: %v", err)
+			base.Fatal(err)
 		}
 
 		byModule := make(map[string][]string)
diff --git a/src/cmd/go/internal/modfetch/cache.go b/src/cmd/go/internal/modfetch/cache.go
index 928eb1f..5a727c6 100644
--- a/src/cmd/go/internal/modfetch/cache.go
+++ b/src/cmd/go/internal/modfetch/cache.go
@@ -6,6 +6,7 @@
 
 import (
 	"bytes"
+	"context"
 	"encoding/json"
 	"errors"
 	"fmt"
@@ -20,6 +21,7 @@
 
 	"cmd/go/internal/base"
 	"cmd/go/internal/cfg"
+	"cmd/go/internal/gover"
 	"cmd/go/internal/lockedfile"
 	"cmd/go/internal/modfetch/codehost"
 	"cmd/go/internal/par"
@@ -29,8 +31,8 @@
 	"golang.org/x/mod/semver"
 )
 
-func cacheDir(path string) (string, error) {
-	if err := checkCacheDir(); err != nil {
+func cacheDir(ctx context.Context, path string) (string, error) {
+	if err := checkCacheDir(ctx); err != nil {
 		return "", err
 	}
 	enc, err := module.EscapePath(path)
@@ -40,12 +42,15 @@
 	return filepath.Join(cfg.GOMODCACHE, "cache/download", enc, "/@v"), nil
 }
 
-func CachePath(m module.Version, suffix string) (string, error) {
-	dir, err := cacheDir(m.Path)
+func CachePath(ctx context.Context, m module.Version, suffix string) (string, error) {
+	if gover.IsToolchain(m.Path) {
+		return "", ErrToolchain
+	}
+	dir, err := cacheDir(ctx, m.Path)
 	if err != nil {
 		return "", err
 	}
-	if !semver.IsValid(m.Version) {
+	if !gover.ModIsValid(m.Path, m.Version) {
 		return "", fmt.Errorf("non-semver module version %q", m.Version)
 	}
 	if module.CanonicalVersion(m.Version) != m.Version {
@@ -63,15 +68,18 @@
 // An error satisfying errors.Is(err, fs.ErrNotExist) will be returned
 // along with the directory if the directory does not exist or if the directory
 // is not completely populated.
-func DownloadDir(m module.Version) (string, error) {
-	if err := checkCacheDir(); err != nil {
+func DownloadDir(ctx context.Context, m module.Version) (string, error) {
+	if gover.IsToolchain(m.Path) {
+		return "", ErrToolchain
+	}
+	if err := checkCacheDir(ctx); err != nil {
 		return "", err
 	}
 	enc, err := module.EscapePath(m.Path)
 	if err != nil {
 		return "", err
 	}
-	if !semver.IsValid(m.Version) {
+	if !gover.ModIsValid(m.Path, m.Version) {
 		return "", fmt.Errorf("non-semver module version %q", m.Version)
 	}
 	if module.CanonicalVersion(m.Version) != m.Version {
@@ -94,7 +102,7 @@
 
 	// Check if a .partial file exists. This is created at the beginning of
 	// a download and removed after the zip is extracted.
-	partialPath, err := CachePath(m, "partial")
+	partialPath, err := CachePath(ctx, m, "partial")
 	if err != nil {
 		return dir, err
 	}
@@ -109,7 +117,7 @@
 	// to re-calculate it. Note that checkMod will repopulate the ziphash
 	// file if it doesn't exist, but if the module is excluded by checks
 	// through GONOSUMDB or GOPRIVATE, that check and repopulation won't happen.
-	ziphashPath, err := CachePath(m, "ziphash")
+	ziphashPath, err := CachePath(ctx, m, "ziphash")
 	if err != nil {
 		return dir, err
 	}
@@ -135,8 +143,8 @@
 
 // lockVersion locks a file within the module cache that guards the downloading
 // and extraction of the zipfile for the given module version.
-func lockVersion(mod module.Version) (unlock func(), err error) {
-	path, err := CachePath(mod, "lock")
+func lockVersion(ctx context.Context, mod module.Version) (unlock func(), err error) {
+	path, err := CachePath(ctx, mod, "lock")
 	if err != nil {
 		return nil, err
 	}
@@ -150,8 +158,8 @@
 // edits to files outside the cache, such as go.sum and go.mod files in the
 // user's working directory.
 // If err is nil, the caller MUST eventually call the unlock function.
-func SideLock() (unlock func(), err error) {
-	if err := checkCacheDir(); err != nil {
+func SideLock(ctx context.Context) (unlock func(), err error) {
+	if err := checkCacheDir(ctx); err != nil {
 		return nil, err
 	}
 
@@ -169,25 +177,28 @@
 // (so that it can be returned from Lookup multiple times).
 // It serializes calls to the underlying Repo.
 type cachingRepo struct {
-	path  string
-	cache par.Cache // cache for all operations
+	path          string
+	versionsCache par.ErrCache[string, *Versions]
+	statCache     par.ErrCache[string, *RevInfo]
+	latestCache   par.ErrCache[struct{}, *RevInfo]
+	gomodCache    par.ErrCache[string, []byte]
 
 	once     sync.Once
-	initRepo func() (Repo, error)
+	initRepo func(context.Context) (Repo, error)
 	r        Repo
 }
 
-func newCachingRepo(path string, initRepo func() (Repo, error)) *cachingRepo {
+func newCachingRepo(ctx context.Context, path string, initRepo func(context.Context) (Repo, error)) *cachingRepo {
 	return &cachingRepo{
 		path:     path,
 		initRepo: initRepo,
 	}
 }
 
-func (r *cachingRepo) repo() Repo {
+func (r *cachingRepo) repo(ctx context.Context) Repo {
 	r.once.Do(func() {
 		var err error
-		r.r, err = r.initRepo()
+		r.r, err = r.initRepo(ctx)
 		if err != nil {
 			r.r = errRepo{r.path, err}
 		}
@@ -195,32 +206,26 @@
 	return r.r
 }
 
-func (r *cachingRepo) CheckReuse(old *codehost.Origin) error {
-	return r.repo().CheckReuse(old)
+func (r *cachingRepo) CheckReuse(ctx context.Context, old *codehost.Origin) error {
+	return r.repo(ctx).CheckReuse(ctx, old)
 }
 
 func (r *cachingRepo) ModulePath() string {
 	return r.path
 }
 
-func (r *cachingRepo) Versions(prefix string) (*Versions, error) {
-	type cached struct {
-		v   *Versions
-		err error
-	}
-	c := r.cache.Do("versions:"+prefix, func() any {
-		v, err := r.repo().Versions(prefix)
-		return cached{v, err}
-	}).(cached)
+func (r *cachingRepo) Versions(ctx context.Context, prefix string) (*Versions, error) {
+	v, err := r.versionsCache.Do(prefix, func() (*Versions, error) {
+		return r.repo(ctx).Versions(ctx, prefix)
+	})
 
-	if c.err != nil {
-		return nil, c.err
+	if err != nil {
+		return nil, err
 	}
-	v := &Versions{
-		Origin: c.v.Origin,
-		List:   append([]string(nil), c.v.List...),
-	}
-	return v, nil
+	return &Versions{
+		Origin: v.Origin,
+		List:   append([]string(nil), v.List...),
+	}, nil
 }
 
 type cachedInfo struct {
@@ -228,113 +233,119 @@
 	err  error
 }
 
-func (r *cachingRepo) Stat(rev string) (*RevInfo, error) {
-	c := r.cache.Do("stat:"+rev, func() any {
-		file, info, err := readDiskStat(r.path, rev)
+func (r *cachingRepo) Stat(ctx context.Context, rev string) (*RevInfo, error) {
+	if gover.IsToolchain(r.path) {
+		// Skip disk cache; the underlying golang.org/toolchain repo is cached instead.
+		return r.repo(ctx).Stat(ctx, rev)
+	}
+	info, err := r.statCache.Do(rev, func() (*RevInfo, error) {
+		file, info, err := readDiskStat(ctx, r.path, rev)
 		if err == nil {
-			return cachedInfo{info, nil}
+			return info, err
 		}
 
-		info, err = r.repo().Stat(rev)
+		info, err = r.repo(ctx).Stat(ctx, rev)
 		if err == nil {
 			// If we resolved, say, 1234abcde to v0.0.0-20180604122334-1234abcdef78,
 			// then save the information under the proper version, for future use.
 			if info.Version != rev {
-				file, _ = CachePath(module.Version{Path: r.path, Version: info.Version}, "info")
-				r.cache.Do("stat:"+info.Version, func() any {
-					return cachedInfo{info, err}
+				file, _ = CachePath(ctx, module.Version{Path: r.path, Version: info.Version}, "info")
+				r.statCache.Do(info.Version, func() (*RevInfo, error) {
+					return info, nil
 				})
 			}
 
-			if err := writeDiskStat(file, info); err != nil {
+			if err := writeDiskStat(ctx, file, info); err != nil {
 				fmt.Fprintf(os.Stderr, "go: writing stat cache: %v\n", err)
 			}
 		}
-		return cachedInfo{info, err}
-	}).(cachedInfo)
-
-	info := c.info
+		return info, err
+	})
 	if info != nil {
 		copy := *info
 		info = &copy
 	}
-	return info, c.err
+	return info, err
 }
 
-func (r *cachingRepo) Latest() (*RevInfo, error) {
-	c := r.cache.Do("latest:", func() any {
-		info, err := r.repo().Latest()
+func (r *cachingRepo) Latest(ctx context.Context) (*RevInfo, error) {
+	if gover.IsToolchain(r.path) {
+		// Skip disk cache; the underlying golang.org/toolchain repo is cached instead.
+		return r.repo(ctx).Latest(ctx)
+	}
+	info, err := r.latestCache.Do(struct{}{}, func() (*RevInfo, error) {
+		info, err := r.repo(ctx).Latest(ctx)
 
 		// Save info for likely future Stat call.
 		if err == nil {
-			r.cache.Do("stat:"+info.Version, func() any {
-				return cachedInfo{info, err}
+			r.statCache.Do(info.Version, func() (*RevInfo, error) {
+				return info, nil
 			})
-			if file, _, err := readDiskStat(r.path, info.Version); err != nil {
-				writeDiskStat(file, info)
+			if file, _, err := readDiskStat(ctx, r.path, info.Version); err != nil {
+				writeDiskStat(ctx, file, info)
 			}
 		}
 
-		return cachedInfo{info, err}
-	}).(cachedInfo)
-
-	info := c.info
+		return info, err
+	})
 	if info != nil {
 		copy := *info
 		info = &copy
 	}
-	return info, c.err
+	return info, err
 }
 
-func (r *cachingRepo) GoMod(version string) ([]byte, error) {
-	type cached struct {
-		text []byte
-		err  error
+func (r *cachingRepo) GoMod(ctx context.Context, version string) ([]byte, error) {
+	if gover.IsToolchain(r.path) {
+		// Skip disk cache; the underlying golang.org/toolchain repo is cached instead.
+		return r.repo(ctx).GoMod(ctx, version)
 	}
-	c := r.cache.Do("gomod:"+version, func() any {
-		file, text, err := readDiskGoMod(r.path, version)
+	text, err := r.gomodCache.Do(version, func() ([]byte, error) {
+		file, text, err := readDiskGoMod(ctx, r.path, version)
 		if err == nil {
 			// Note: readDiskGoMod already called checkGoMod.
-			return cached{text, nil}
+			return text, nil
 		}
 
-		text, err = r.repo().GoMod(version)
+		text, err = r.repo(ctx).GoMod(ctx, version)
 		if err == nil {
 			if err := checkGoMod(r.path, version, text); err != nil {
-				return cached{text, err}
+				return text, err
 			}
-			if err := writeDiskGoMod(file, text); err != nil {
+			if err := writeDiskGoMod(ctx, file, text); err != nil {
 				fmt.Fprintf(os.Stderr, "go: writing go.mod cache: %v\n", err)
 			}
 		}
-		return cached{text, err}
-	}).(cached)
-
-	if c.err != nil {
-		return nil, c.err
+		return text, err
+	})
+	if err != nil {
+		return nil, err
 	}
-	return append([]byte(nil), c.text...), nil
+	return append([]byte(nil), text...), nil
 }
 
-func (r *cachingRepo) Zip(dst io.Writer, version string) error {
-	return r.repo().Zip(dst, version)
+func (r *cachingRepo) Zip(ctx context.Context, dst io.Writer, version string) error {
+	if gover.IsToolchain(r.path) {
+		return ErrToolchain
+	}
+	return r.repo(ctx).Zip(ctx, dst, version)
 }
 
-// InfoFile is like Lookup(path).Stat(version) but also returns the name of the file
+// InfoFile is like Lookup(ctx, path).Stat(version) but also returns the name of the file
 // containing the cached information.
-func InfoFile(path, version string) (*RevInfo, string, error) {
-	if !semver.IsValid(version) {
+func InfoFile(ctx context.Context, path, version string) (*RevInfo, string, error) {
+	if !gover.ModIsValid(path, version) {
 		return nil, "", fmt.Errorf("invalid version %q", version)
 	}
 
-	if file, info, err := readDiskStat(path, version); err == nil {
+	if file, info, err := readDiskStat(ctx, path, version); err == nil {
 		return info, file, nil
 	}
 
 	var info *RevInfo
 	var err2info map[error]*RevInfo
 	err := TryProxies(func(proxy string) error {
-		i, err := Lookup(proxy, path).Stat(version)
+		i, err := Lookup(ctx, proxy, path).Stat(ctx, version)
 		if err == nil {
 			info = i
 		} else {
@@ -350,28 +361,28 @@
 	}
 
 	// Stat should have populated the disk cache for us.
-	file, err := CachePath(module.Version{Path: path, Version: version}, "info")
+	file, err := CachePath(ctx, module.Version{Path: path, Version: version}, "info")
 	if err != nil {
 		return nil, "", err
 	}
 	return info, file, nil
 }
 
-// GoMod is like Lookup(path).GoMod(rev) but avoids the
+// GoMod is like Lookup(ctx, path).GoMod(rev) but avoids the
 // repository path resolution in Lookup if the result is
 // already cached on local disk.
-func GoMod(path, rev string) ([]byte, error) {
+func GoMod(ctx context.Context, path, rev string) ([]byte, error) {
 	// Convert commit hash to pseudo-version
 	// to increase cache hit rate.
-	if !semver.IsValid(rev) {
-		if _, info, err := readDiskStat(path, rev); err == nil {
+	if !gover.ModIsValid(path, rev) {
+		if _, info, err := readDiskStat(ctx, path, rev); err == nil {
 			rev = info.Version
 		} else {
 			if errors.Is(err, statCacheErr) {
 				return nil, err
 			}
 			err := TryProxies(func(proxy string) error {
-				info, err := Lookup(proxy, path).Stat(rev)
+				info, err := Lookup(ctx, proxy, path).Stat(ctx, rev)
 				if err == nil {
 					rev = info.Version
 				}
@@ -383,13 +394,13 @@
 		}
 	}
 
-	_, data, err := readDiskGoMod(path, rev)
+	_, data, err := readDiskGoMod(ctx, path, rev)
 	if err == nil {
 		return data, nil
 	}
 
 	err = TryProxies(func(proxy string) (err error) {
-		data, err = Lookup(proxy, path).GoMod(rev)
+		data, err = Lookup(ctx, proxy, path).GoMod(ctx, rev)
 		return err
 	})
 	return data, err
@@ -397,15 +408,15 @@
 
 // GoModFile is like GoMod but returns the name of the file containing
 // the cached information.
-func GoModFile(path, version string) (string, error) {
-	if !semver.IsValid(version) {
+func GoModFile(ctx context.Context, path, version string) (string, error) {
+	if !gover.ModIsValid(path, version) {
 		return "", fmt.Errorf("invalid version %q", version)
 	}
-	if _, err := GoMod(path, version); err != nil {
+	if _, err := GoMod(ctx, path, version); err != nil {
 		return "", err
 	}
 	// GoMod should have populated the disk cache for us.
-	file, err := CachePath(module.Version{Path: path, Version: version}, "mod")
+	file, err := CachePath(ctx, module.Version{Path: path, Version: version}, "mod")
 	if err != nil {
 		return "", err
 	}
@@ -414,11 +425,11 @@
 
 // GoModSum returns the go.sum entry for the module version's go.mod file.
 // (That is, it returns the entry listed in go.sum as "path version/go.mod".)
-func GoModSum(path, version string) (string, error) {
-	if !semver.IsValid(version) {
+func GoModSum(ctx context.Context, path, version string) (string, error) {
+	if !gover.ModIsValid(path, version) {
 		return "", fmt.Errorf("invalid version %q", version)
 	}
-	data, err := GoMod(path, version)
+	data, err := GoMod(ctx, path, version)
 	if err != nil {
 		return "", err
 	}
@@ -435,8 +446,11 @@
 // returning the name of the cache file and the result.
 // If the read fails, the caller can use
 // writeDiskStat(file, info) to write a new cache entry.
-func readDiskStat(path, rev string) (file string, info *RevInfo, err error) {
-	file, data, err := readDiskCache(path, rev, "info")
+func readDiskStat(ctx context.Context, path, rev string) (file string, info *RevInfo, err error) {
+	if gover.IsToolchain(path) {
+		return "", nil, errNotCached
+	}
+	file, data, err := readDiskCache(ctx, path, rev, "info")
 	if err != nil {
 		// If the cache already contains a pseudo-version with the given hash, we
 		// would previously return that pseudo-version without checking upstream.
@@ -458,7 +472,7 @@
 		// Fall back to this resolution scheme only if the GOPROXY setting prohibits
 		// us from resolving upstream tags.
 		if cfg.GOPROXY == "off" {
-			if file, info, err := readDiskStatByHash(path, rev); err == nil {
+			if file, info, err := readDiskStatByHash(ctx, path, rev); err == nil {
 				return file, info, nil
 			}
 		}
@@ -473,7 +487,7 @@
 	// Remarshal and update the cache file if needed.
 	data2, err := json.Marshal(info)
 	if err == nil && !bytes.Equal(data2, data) {
-		writeDiskCache(file, data)
+		writeDiskCache(ctx, file, data)
 	}
 	return file, info, nil
 }
@@ -487,7 +501,10 @@
 // Without this check we'd be doing network I/O to the remote repo
 // just to find out about a commit we already know about
 // (and have cached under its pseudo-version).
-func readDiskStatByHash(path, rev string) (file string, info *RevInfo, err error) {
+func readDiskStatByHash(ctx context.Context, path, rev string) (file string, info *RevInfo, err error) {
+	if gover.IsToolchain(path) {
+		return "", nil, errNotCached
+	}
 	if cfg.GOMODCACHE == "" {
 		// Do not download to current directory.
 		return "", nil, errNotCached
@@ -497,7 +514,7 @@
 		return "", nil, errNotCached
 	}
 	rev = rev[:12]
-	cdir, err := cacheDir(path)
+	cdir, err := cacheDir(ctx, path)
 	if err != nil {
 		return "", nil, errNotCached
 	}
@@ -522,7 +539,7 @@
 			v := strings.TrimSuffix(name, ".info")
 			if module.IsPseudoVersion(v) && semver.Compare(v, maxVersion) > 0 {
 				maxVersion = v
-				file, info, err = readDiskStat(path, strings.TrimSuffix(name, ".info"))
+				file, info, err = readDiskStat(ctx, path, strings.TrimSuffix(name, ".info"))
 			}
 		}
 	}
@@ -540,8 +557,11 @@
 // returning the name of the cache file and the result.
 // If the read fails, the caller can use
 // writeDiskGoMod(file, data) to write a new cache entry.
-func readDiskGoMod(path, rev string) (file string, data []byte, err error) {
-	file, data, err = readDiskCache(path, rev, "mod")
+func readDiskGoMod(ctx context.Context, path, rev string) (file string, data []byte, err error) {
+	if gover.IsToolchain(path) {
+		return "", nil, errNotCached
+	}
+	file, data, err = readDiskCache(ctx, path, rev, "mod")
 
 	// If the file has an old auto-conversion prefix, pretend it's not there.
 	if bytes.HasPrefix(data, oldVgoPrefix) {
@@ -563,8 +583,11 @@
 // It returns the name of the cache file and the content of the file.
 // If the read fails, the caller can use
 // writeDiskCache(file, data) to write a new cache entry.
-func readDiskCache(path, rev, suffix string) (file string, data []byte, err error) {
-	file, err = CachePath(module.Version{Path: path, Version: rev}, suffix)
+func readDiskCache(ctx context.Context, path, rev, suffix string) (file string, data []byte, err error) {
+	if gover.IsToolchain(path) {
+		return "", nil, errNotCached
+	}
+	file, err = CachePath(ctx, module.Version{Path: path, Version: rev}, suffix)
 	if err != nil {
 		return "", nil, errNotCached
 	}
@@ -577,7 +600,7 @@
 
 // writeDiskStat writes a stat result cache entry.
 // The file name must have been returned by a previous call to readDiskStat.
-func writeDiskStat(file string, info *RevInfo) error {
+func writeDiskStat(ctx context.Context, file string, info *RevInfo) error {
 	if file == "" {
 		return nil
 	}
@@ -605,18 +628,18 @@
 	if err != nil {
 		return err
 	}
-	return writeDiskCache(file, js)
+	return writeDiskCache(ctx, file, js)
 }
 
 // writeDiskGoMod writes a go.mod cache entry.
 // The file name must have been returned by a previous call to readDiskGoMod.
-func writeDiskGoMod(file string, text []byte) error {
-	return writeDiskCache(file, text)
+func writeDiskGoMod(ctx context.Context, file string, text []byte) error {
+	return writeDiskCache(ctx, file, text)
 }
 
 // writeDiskCache is the generic "write to a cache file" implementation.
 // The file must have been returned by a previous call to readDiskCache.
-func writeDiskCache(file string, data []byte) error {
+func writeDiskCache(ctx context.Context, file string, data []byte) error {
 	if file == "" {
 		return nil
 	}
@@ -627,7 +650,7 @@
 
 	// Write the file to a temporary location, and then rename it to its final
 	// path to reduce the likelihood of a corrupt file existing at that final path.
-	f, err := tempFile(filepath.Dir(file), filepath.Base(file), 0666)
+	f, err := tempFile(ctx, filepath.Dir(file), filepath.Base(file), 0666)
 	if err != nil {
 		return err
 	}
@@ -652,17 +675,20 @@
 	}
 
 	if strings.HasSuffix(file, ".mod") {
-		rewriteVersionList(filepath.Dir(file))
+		rewriteVersionList(ctx, filepath.Dir(file))
 	}
 	return nil
 }
 
 // tempFile creates a new temporary file with given permission bits.
-func tempFile(dir, prefix string, perm fs.FileMode) (f *os.File, err error) {
+func tempFile(ctx context.Context, dir, prefix string, perm fs.FileMode) (f *os.File, err error) {
 	for i := 0; i < 10000; i++ {
 		name := filepath.Join(dir, prefix+strconv.Itoa(rand.Intn(1000000000))+".tmp")
 		f, err = os.OpenFile(name, os.O_RDWR|os.O_CREATE|os.O_EXCL, perm)
 		if os.IsExist(err) {
+			if ctx.Err() != nil {
+				return nil, ctx.Err()
+			}
 			continue
 		}
 		break
@@ -672,7 +698,7 @@
 
 // rewriteVersionList rewrites the version list in dir
 // after a new *.mod file has been written.
-func rewriteVersionList(dir string) (err error) {
+func rewriteVersionList(ctx context.Context, dir string) (err error) {
 	if filepath.Base(dir) != "@v" {
 		base.Fatalf("go: internal error: misuse of rewriteVersionList")
 	}
@@ -755,7 +781,7 @@
 
 // checkCacheDir checks if the directory specified by GOMODCACHE exists. An
 // error is returned if it does not.
-func checkCacheDir() error {
+func checkCacheDir(ctx context.Context) error {
 	if cfg.GOMODCACHE == "" {
 		// modload.Init exits if GOPATH[0] is empty, and cfg.GOMODCACHE
 		// is set to GOPATH[0]/pkg/mod if GOMODCACHE is empty, so this should never happen.
diff --git a/src/cmd/go/internal/modfetch/cache_test.go b/src/cmd/go/internal/modfetch/cache_test.go
index 722c984..6aada66 100644
--- a/src/cmd/go/internal/modfetch/cache_test.go
+++ b/src/cmd/go/internal/modfetch/cache_test.go
@@ -5,19 +5,22 @@
 package modfetch
 
 import (
+	"context"
 	"os"
 	"path/filepath"
 	"testing"
 )
 
 func TestWriteDiskCache(t *testing.T) {
+	ctx := context.Background()
+
 	tmpdir, err := os.MkdirTemp("", "go-writeCache-test-")
 	if err != nil {
 		t.Fatal(err)
 	}
 	defer os.RemoveAll(tmpdir)
 
-	err = writeDiskCache(filepath.Join(tmpdir, "file"), []byte("data"))
+	err = writeDiskCache(ctx, filepath.Join(tmpdir, "file"), []byte("data"))
 	if err != nil {
 		t.Fatal(err)
 	}
diff --git a/src/cmd/go/internal/modfetch/codehost/codehost.go b/src/cmd/go/internal/modfetch/codehost/codehost.go
index 855b694..ca57762 100644
--- a/src/cmd/go/internal/modfetch/codehost/codehost.go
+++ b/src/cmd/go/internal/modfetch/codehost/codehost.go
@@ -8,6 +8,7 @@
 
 import (
 	"bytes"
+	"context"
 	"crypto/sha256"
 	"fmt"
 	"io"
@@ -46,26 +47,26 @@
 	// taken from can be reused.
 	// The subdir gives subdirectory name where the module root is expected to be found,
 	// "" for the root or "sub/dir" for a subdirectory (no trailing slash).
-	CheckReuse(old *Origin, subdir string) error
+	CheckReuse(ctx context.Context, old *Origin, subdir string) error
 
 	// List lists all tags with the given prefix.
-	Tags(prefix string) (*Tags, error)
+	Tags(ctx context.Context, prefix string) (*Tags, error)
 
 	// Stat returns information about the revision rev.
 	// A revision can be any identifier known to the underlying service:
 	// commit hash, branch, tag, and so on.
-	Stat(rev string) (*RevInfo, error)
+	Stat(ctx context.Context, rev string) (*RevInfo, error)
 
 	// Latest returns the latest revision on the default branch,
 	// whatever that means in the underlying implementation.
-	Latest() (*RevInfo, error)
+	Latest(ctx context.Context) (*RevInfo, error)
 
 	// ReadFile reads the given file in the file tree corresponding to revision rev.
 	// It should refuse to read more than maxSize bytes.
 	//
 	// If the requested file does not exist it should return an error for which
 	// os.IsNotExist(err) returns true.
-	ReadFile(rev, file string, maxSize int64) (data []byte, err error)
+	ReadFile(ctx context.Context, rev, file string, maxSize int64) (data []byte, err error)
 
 	// ReadZip downloads a zip file for the subdir subdirectory
 	// of the given revision to a new file in a given temporary directory.
@@ -73,17 +74,17 @@
 	// It returns a ReadCloser for a streamed copy of the zip file.
 	// All files in the zip file are expected to be
 	// nested in a single top-level directory, whose name is not specified.
-	ReadZip(rev, subdir string, maxSize int64) (zip io.ReadCloser, err error)
+	ReadZip(ctx context.Context, rev, subdir string, maxSize int64) (zip io.ReadCloser, err error)
 
 	// RecentTag returns the most recent tag on rev or one of its predecessors
 	// with the given prefix. allowed may be used to filter out unwanted versions.
-	RecentTag(rev, prefix string, allowed func(tag string) bool) (tag string, err error)
+	RecentTag(ctx context.Context, rev, prefix string, allowed func(tag string) bool) (tag string, err error)
 
 	// DescendsFrom reports whether rev or any of its ancestors has the given tag.
 	//
 	// DescendsFrom must return true for any tag returned by RecentTag for the
 	// same revision.
-	DescendsFrom(rev, tag string) (bool, error)
+	DescendsFrom(ctx context.Context, rev, tag string) (bool, error)
 }
 
 // An Origin describes the provenance of a given repo method result.
@@ -201,19 +202,6 @@
 	return err == fs.ErrNotExist
 }
 
-// ErrUnsupported indicates that a requested operation cannot be performed,
-// because it is unsupported. This error indicates that there is no alternative
-// way to perform the operation.
-//
-// TODO(#41198): Remove this declaration and use errors.ErrUnsupported instead.
-var ErrUnsupported = unsupportedOperationError{}
-
-type unsupportedOperationError struct{}
-
-func (unsupportedOperationError) Error() string {
-	return "unsupported operation"
-}
-
 // AllHex reports whether the revision rev is entirely lower-case hexadecimal digits.
 func AllHex(rev string) bool {
 	for i := 0; i < len(rev); i++ {
@@ -237,7 +225,7 @@
 
 // WorkDir returns the name of the cached work directory to use for the
 // given repository type and name.
-func WorkDir(typ, name string) (dir, lockfile string, err error) {
+func WorkDir(ctx context.Context, typ, name string) (dir, lockfile string, err error) {
 	if cfg.GOMODCACHE == "" {
 		return "", "", fmt.Errorf("neither GOPATH nor GOMODCACHE are set")
 	}
@@ -253,16 +241,17 @@
 	key := typ + ":" + name
 	dir = filepath.Join(cfg.GOMODCACHE, "cache/vcs", fmt.Sprintf("%x", sha256.Sum256([]byte(key))))
 
-	if cfg.BuildX {
-		fmt.Fprintf(os.Stderr, "mkdir -p %s # %s %s\n", filepath.Dir(dir), typ, name)
+	xLog, buildX := cfg.BuildXWriter(ctx)
+	if buildX {
+		fmt.Fprintf(xLog, "mkdir -p %s # %s %s\n", filepath.Dir(dir), typ, name)
 	}
 	if err := os.MkdirAll(filepath.Dir(dir), 0777); err != nil {
 		return "", "", err
 	}
 
 	lockfile = dir + ".lock"
-	if cfg.BuildX {
-		fmt.Fprintf(os.Stderr, "# lock %s\n", lockfile)
+	if buildX {
+		fmt.Fprintf(xLog, "# lock %s\n", lockfile)
 	}
 
 	unlock, err := lockedfile.MutexAt(lockfile).Lock()
@@ -279,15 +268,15 @@
 		if have != key {
 			return "", "", fmt.Errorf("%s exists with wrong content (have %q want %q)", dir+".info", have, key)
 		}
-		if cfg.BuildX {
-			fmt.Fprintf(os.Stderr, "# %s for %s %s\n", dir, typ, name)
+		if buildX {
+			fmt.Fprintf(xLog, "# %s for %s %s\n", dir, typ, name)
 		}
 		return dir, lockfile, nil
 	}
 
 	// Info file or directory missing. Start from scratch.
-	if cfg.BuildX {
-		fmt.Fprintf(os.Stderr, "mkdir -p %s # %s %s\n", dir, typ, name)
+	if xLog != nil {
+		fmt.Fprintf(xLog, "mkdir -p %s # %s %s\n", dir, typ, name)
 	}
 	os.RemoveAll(dir)
 	if err := os.MkdirAll(dir, 0777); err != nil {
@@ -326,15 +315,15 @@
 // It returns the standard output and, for a non-zero exit,
 // a *RunError indicating the command, exit status, and standard error.
 // Standard error is unavailable for commands that exit successfully.
-func Run(dir string, cmdline ...any) ([]byte, error) {
-	return RunWithStdin(dir, nil, cmdline...)
+func Run(ctx context.Context, dir string, cmdline ...any) ([]byte, error) {
+	return RunWithStdin(ctx, dir, nil, cmdline...)
 }
 
 // bashQuoter escapes characters that have special meaning in double-quoted strings in the bash shell.
 // See https://www.gnu.org/software/bash/manual/html_node/Double-Quotes.html.
 var bashQuoter = strings.NewReplacer(`"`, `\"`, `$`, `\$`, "`", "\\`", `\`, `\\`)
 
-func RunWithStdin(dir string, stdin io.Reader, cmdline ...any) ([]byte, error) {
+func RunWithStdin(ctx context.Context, dir string, stdin io.Reader, cmdline ...any) ([]byte, error) {
 	if dir != "" {
 		muIface, ok := dirLock.Load(dir)
 		if !ok {
@@ -349,7 +338,7 @@
 	if os.Getenv("TESTGOVCS") == "panic" {
 		panic(fmt.Sprintf("use of vcs: %v", cmd))
 	}
-	if cfg.BuildX {
+	if xLog, ok := cfg.BuildXWriter(ctx); ok {
 		text := new(strings.Builder)
 		if dir != "" {
 			text.WriteString("cd ")
@@ -375,21 +364,24 @@
 				text.WriteString(arg)
 			}
 		}
-		fmt.Fprintf(os.Stderr, "%s\n", text)
+		fmt.Fprintf(xLog, "%s\n", text)
 		start := time.Now()
 		defer func() {
-			fmt.Fprintf(os.Stderr, "%.3fs # %s\n", time.Since(start).Seconds(), text)
+			fmt.Fprintf(xLog, "%.3fs # %s\n", time.Since(start).Seconds(), text)
 		}()
 	}
 	// TODO: Impose limits on command output size.
 	// TODO: Set environment to get English error messages.
 	var stderr bytes.Buffer
 	var stdout bytes.Buffer
-	c := exec.Command(cmd[0], cmd[1:]...)
+	c := exec.CommandContext(ctx, cmd[0], cmd[1:]...)
+	c.Cancel = func() error { return c.Process.Signal(os.Interrupt) }
 	c.Dir = dir
 	c.Stdin = stdin
 	c.Stderr = &stderr
 	c.Stdout = &stdout
+	// For Git commands, manually supply GIT_DIR so Git works with safe.bareRepository=explicit set. Noop for other commands.
+	c.Env = append(c.Environ(), "GIT_DIR="+dir)
 	err := c.Run()
 	if err != nil {
 		err = &RunError{Cmd: strings.Join(cmd, " ") + " in " + dir, Stderr: stderr.Bytes(), Err: err}
diff --git a/src/cmd/go/internal/modfetch/codehost/git.go b/src/cmd/go/internal/modfetch/codehost/git.go
index 127ad26..d1a18a8 100644
--- a/src/cmd/go/internal/modfetch/codehost/git.go
+++ b/src/cmd/go/internal/modfetch/codehost/git.go
@@ -6,6 +6,7 @@
 
 import (
 	"bytes"
+	"context"
 	"crypto/sha256"
 	"encoding/base64"
 	"errors"
@@ -16,12 +17,14 @@
 	"os"
 	"os/exec"
 	"path/filepath"
+	"runtime"
 	"sort"
 	"strconv"
 	"strings"
 	"sync"
 	"time"
 
+	"cmd/go/internal/base"
 	"cmd/go/internal/lockedfile"
 	"cmd/go/internal/par"
 	"cmd/go/internal/web"
@@ -31,8 +34,8 @@
 
 // LocalGitRepo is like Repo but accepts both Git remote references
 // and paths to repositories on the local file system.
-func LocalGitRepo(remote string) (Repo, error) {
-	return newGitRepoCached(remote, true)
+func LocalGitRepo(ctx context.Context, remote string) (Repo, error) {
+	return newGitRepoCached(ctx, remote, true)
 }
 
 // A notExistError wraps another error to retain its original text
@@ -46,32 +49,25 @@
 
 const gitWorkDirType = "git3"
 
-var gitRepoCache par.Cache
+var gitRepoCache par.ErrCache[gitCacheKey, Repo]
 
-func newGitRepoCached(remote string, localOK bool) (Repo, error) {
-	type key struct {
-		remote  string
-		localOK bool
-	}
-	type cached struct {
-		repo Repo
-		err  error
-	}
-
-	c := gitRepoCache.Do(key{remote, localOK}, func() any {
-		repo, err := newGitRepo(remote, localOK)
-		return cached{repo, err}
-	}).(cached)
-
-	return c.repo, c.err
+type gitCacheKey struct {
+	remote  string
+	localOK bool
 }
 
-func newGitRepo(remote string, localOK bool) (Repo, error) {
+func newGitRepoCached(ctx context.Context, remote string, localOK bool) (Repo, error) {
+	return gitRepoCache.Do(gitCacheKey{remote, localOK}, func() (Repo, error) {
+		return newGitRepo(ctx, remote, localOK)
+	})
+}
+
+func newGitRepo(ctx context.Context, remote string, localOK bool) (Repo, error) {
 	r := &gitRepo{remote: remote}
 	if strings.Contains(remote, "://") {
 		// This is a remote path.
 		var err error
-		r.dir, r.mu.Path, err = WorkDir(gitWorkDirType, r.remote)
+		r.dir, r.mu.Path, err = WorkDir(ctx, gitWorkDirType, r.remote)
 		if err != nil {
 			return nil, err
 		}
@@ -83,7 +79,7 @@
 		defer unlock()
 
 		if _, err := os.Stat(filepath.Join(r.dir, "objects")); err != nil {
-			if _, err := Run(r.dir, "git", "init", "--bare"); err != nil {
+			if _, err := Run(ctx, r.dir, "git", "init", "--bare"); err != nil {
 				os.RemoveAll(r.dir)
 				return nil, err
 			}
@@ -91,10 +87,25 @@
 			// but this lets us say git fetch origin instead, which
 			// is a little nicer. More importantly, using a named remote
 			// avoids a problem with Git LFS. See golang.org/issue/25605.
-			if _, err := Run(r.dir, "git", "remote", "add", "origin", "--", r.remote); err != nil {
+			if _, err := Run(ctx, r.dir, "git", "remote", "add", "origin", "--", r.remote); err != nil {
 				os.RemoveAll(r.dir)
 				return nil, err
 			}
+			if runtime.GOOS == "windows" {
+				// Git for Windows by default does not support paths longer than
+				// MAX_PATH (260 characters) because that may interfere with navigation
+				// in some Windows programs. However, cmd/go should be able to handle
+				// long paths just fine, and we expect people to use 'go clean' to
+				// manipulate the module cache, so it should be harmless to set here,
+				// and in some cases may be necessary in order to download modules with
+				// long branch names.
+				//
+				// See https://github.com/git-for-windows/git/wiki/Git-cannot-create-a-file-or-directory-with-a-long-path.
+				if _, err := Run(ctx, r.dir, "git", "config", "core.longpaths", "true"); err != nil {
+					os.RemoveAll(r.dir)
+					return nil, err
+				}
+			}
 		}
 		r.remoteURL = r.remote
 		r.remote = "origin"
@@ -124,6 +135,8 @@
 }
 
 type gitRepo struct {
+	ctx context.Context
+
 	remote, remoteURL string
 	local             bool
 	dir               string
@@ -132,7 +145,7 @@
 
 	fetchLevel int
 
-	statCache par.Cache
+	statCache par.ErrCache[string, *RevInfo]
 
 	refsOnce sync.Once
 	// refs maps branch and tag refs (e.g., "HEAD", "refs/heads/master")
@@ -154,11 +167,11 @@
 // loadLocalTags loads tag references from the local git cache
 // into the map r.localTags.
 // Should only be called as r.localTagsOnce.Do(r.loadLocalTags).
-func (r *gitRepo) loadLocalTags() {
+func (r *gitRepo) loadLocalTags(ctx context.Context) {
 	// The git protocol sends all known refs and ls-remote filters them on the client side,
 	// so we might as well record both heads and tags in one shot.
 	// Most of the time we only care about tags but sometimes we care about heads too.
-	out, err := Run(r.dir, "git", "tag", "-l")
+	out, err := Run(ctx, r.dir, "git", "tag", "-l")
 	if err != nil {
 		return
 	}
@@ -171,7 +184,7 @@
 	}
 }
 
-func (r *gitRepo) CheckReuse(old *Origin, subdir string) error {
+func (r *gitRepo) CheckReuse(ctx context.Context, old *Origin, subdir string) error {
 	if old == nil {
 		return fmt.Errorf("missing origin")
 	}
@@ -191,7 +204,7 @@
 		return fmt.Errorf("non-specific origin")
 	}
 
-	r.loadRefs()
+	r.loadRefs(ctx)
 	if r.refsErr != nil {
 		return r.refsErr
 	}
@@ -206,7 +219,7 @@
 		}
 	}
 	if old.TagSum != "" {
-		tags, err := r.Tags(old.TagPrefix)
+		tags, err := r.Tags(ctx, old.TagPrefix)
 		if err != nil {
 			return err
 		}
@@ -224,12 +237,19 @@
 
 // loadRefs loads heads and tags references from the remote into the map r.refs.
 // The result is cached in memory.
-func (r *gitRepo) loadRefs() (map[string]string, error) {
+func (r *gitRepo) loadRefs(ctx context.Context) (map[string]string, error) {
 	r.refsOnce.Do(func() {
 		// The git protocol sends all known refs and ls-remote filters them on the client side,
 		// so we might as well record both heads and tags in one shot.
 		// Most of the time we only care about tags but sometimes we care about heads too.
-		out, gitErr := Run(r.dir, "git", "ls-remote", "-q", r.remote)
+		release, err := base.AcquireNet()
+		if err != nil {
+			r.refsErr = err
+			return
+		}
+		out, gitErr := Run(ctx, r.dir, "git", "ls-remote", "-q", r.remote)
+		release()
+
 		if gitErr != nil {
 			if rerr, ok := gitErr.(*RunError); ok {
 				if bytes.Contains(rerr.Stderr, []byte("fatal: could not read Username")) {
@@ -272,8 +292,8 @@
 	return r.refs, r.refsErr
 }
 
-func (r *gitRepo) Tags(prefix string) (*Tags, error) {
-	refs, err := r.loadRefs()
+func (r *gitRepo) Tags(ctx context.Context, prefix string) (*Tags, error) {
+	refs, err := r.loadRefs(ctx)
 	if err != nil {
 		return nil, err
 	}
@@ -340,15 +360,15 @@
 	}
 }
 
-func (r *gitRepo) Latest() (*RevInfo, error) {
-	refs, err := r.loadRefs()
+func (r *gitRepo) Latest(ctx context.Context) (*RevInfo, error) {
+	refs, err := r.loadRefs(ctx)
 	if err != nil {
 		return nil, err
 	}
 	if refs["HEAD"] == "" {
 		return nil, ErrNoCommits
 	}
-	statInfo, err := r.Stat(refs["HEAD"])
+	statInfo, err := r.Stat(ctx, refs["HEAD"])
 	if err != nil {
 		return nil, err
 	}
@@ -370,8 +390,8 @@
 // for use when the server requires giving a ref instead of a hash.
 // There may be multiple ref names for a given hash,
 // in which case this returns some name - it doesn't matter which.
-func (r *gitRepo) findRef(hash string) (ref string, ok bool) {
-	refs, err := r.loadRefs()
+func (r *gitRepo) findRef(ctx context.Context, hash string) (ref string, ok bool) {
+	refs, err := r.loadRefs(ctx)
 	if err != nil {
 		return "", false
 	}
@@ -393,15 +413,15 @@
 
 // stat stats the given rev in the local repository,
 // or else it fetches more info from the remote repository and tries again.
-func (r *gitRepo) stat(rev string) (info *RevInfo, err error) {
+func (r *gitRepo) stat(ctx context.Context, rev string) (info *RevInfo, err error) {
 	if r.local {
-		return r.statLocal(rev, rev)
+		return r.statLocal(ctx, rev, rev)
 	}
 
 	// Fast path: maybe rev is a hash we already have locally.
 	didStatLocal := false
 	if len(rev) >= minHashDigits && len(rev) <= 40 && AllHex(rev) {
-		if info, err := r.statLocal(rev, rev); err == nil {
+		if info, err := r.statLocal(ctx, rev, rev); err == nil {
 			return info, nil
 		}
 		didStatLocal = true
@@ -409,15 +429,15 @@
 
 	// Maybe rev is a tag we already have locally.
 	// (Note that we're excluding branches, which can be stale.)
-	r.localTagsOnce.Do(r.loadLocalTags)
+	r.localTagsOnce.Do(func() { r.loadLocalTags(ctx) })
 	if r.localTags[rev] {
-		return r.statLocal(rev, "refs/tags/"+rev)
+		return r.statLocal(ctx, rev, "refs/tags/"+rev)
 	}
 
 	// Maybe rev is the name of a tag or branch on the remote server.
 	// Or maybe it's the prefix of a hash of a named ref.
 	// Try to resolve to both a ref (git name) and full (40-hex-digit) commit hash.
-	refs, err := r.loadRefs()
+	refs, err := r.loadRefs(ctx)
 	if err != nil {
 		return nil, err
 	}
@@ -485,10 +505,10 @@
 	// (or already have the hash we need, just without its tag).
 	// Either way, try a local stat before falling back to network I/O.
 	if !didStatLocal {
-		if info, err := r.statLocal(rev, hash); err == nil {
+		if info, err := r.statLocal(ctx, rev, hash); err == nil {
 			if after, found := strings.CutPrefix(ref, "refs/tags/"); found {
 				// Make sure tag exists, so it will be in localTags next time the go command is run.
-				Run(r.dir, "git", "tag", after, hash)
+				Run(ctx, r.dir, "git", "tag", after, hash)
 			}
 			return info, nil
 		}
@@ -519,9 +539,16 @@
 			ref = hash
 			refspec = hash + ":refs/dummy"
 		}
-		_, err := Run(r.dir, "git", "fetch", "-f", "--depth=1", r.remote, refspec)
+
+		release, err := base.AcquireNet()
+		if err != nil {
+			return nil, err
+		}
+		_, err = Run(ctx, r.dir, "git", "fetch", "-f", "--depth=1", r.remote, refspec)
+		release()
+
 		if err == nil {
-			return r.statLocal(rev, ref)
+			return r.statLocal(ctx, rev, ref)
 		}
 		// Don't try to be smart about parsing the error.
 		// It's too complex and varies too much by git version.
@@ -530,11 +557,11 @@
 
 	// Last resort.
 	// Fetch all heads and tags and hope the hash we want is in the history.
-	if err := r.fetchRefsLocked(); err != nil {
+	if err := r.fetchRefsLocked(ctx); err != nil {
 		return nil, err
 	}
 
-	return r.statLocal(rev, rev)
+	return r.statLocal(ctx, rev, rev)
 }
 
 // fetchRefsLocked fetches all heads and tags from the origin, along with the
@@ -546,7 +573,7 @@
 // for more detail.)
 //
 // fetchRefsLocked requires that r.mu remain locked for the duration of the call.
-func (r *gitRepo) fetchRefsLocked() error {
+func (r *gitRepo) fetchRefsLocked(ctx context.Context) error {
 	if r.fetchLevel < fetchAll {
 		// NOTE: To work around a bug affecting Git clients up to at least 2.23.0
 		// (2019-08-16), we must first expand the set of local refs, and only then
@@ -554,12 +581,18 @@
 		// golang.org/issue/34266 and
 		// https://github.com/git/git/blob/4c86140027f4a0d2caaa3ab4bd8bfc5ce3c11c8a/transport.c#L1303-L1309.)
 
-		if _, err := Run(r.dir, "git", "fetch", "-f", r.remote, "refs/heads/*:refs/heads/*", "refs/tags/*:refs/tags/*"); err != nil {
+		release, err := base.AcquireNet()
+		if err != nil {
+			return err
+		}
+		defer release()
+
+		if _, err := Run(ctx, r.dir, "git", "fetch", "-f", r.remote, "refs/heads/*:refs/heads/*", "refs/tags/*:refs/tags/*"); err != nil {
 			return err
 		}
 
 		if _, err := os.Stat(filepath.Join(r.dir, "shallow")); err == nil {
-			if _, err := Run(r.dir, "git", "fetch", "--unshallow", "-f", r.remote); err != nil {
+			if _, err := Run(ctx, r.dir, "git", "fetch", "--unshallow", "-f", r.remote); err != nil {
 				return err
 			}
 		}
@@ -571,12 +604,12 @@
 
 // statLocal returns a new RevInfo describing rev in the local git repository.
 // It uses version as info.Version.
-func (r *gitRepo) statLocal(version, rev string) (*RevInfo, error) {
-	out, err := Run(r.dir, "git", "-c", "log.showsignature=false", "log", "--no-decorate", "-n1", "--format=format:%H %ct %D", rev, "--")
+func (r *gitRepo) statLocal(ctx context.Context, version, rev string) (*RevInfo, error) {
+	out, err := Run(ctx, r.dir, "git", "-c", "log.showsignature=false", "log", "--no-decorate", "-n1", "--format=format:%H %ct %D", rev, "--")
 	if err != nil {
 		// Return info with Origin.RepoSum if possible to allow caching of negative lookup.
 		var info *RevInfo
-		if refs, err := r.loadRefs(); err == nil {
+		if refs, err := r.loadRefs(ctx); err == nil {
 			info = r.unknownRevisionInfo(refs)
 		}
 		return info, &UnknownRevisionError{Rev: rev}
@@ -633,36 +666,30 @@
 	return info, nil
 }
 
-func (r *gitRepo) Stat(rev string) (*RevInfo, error) {
+func (r *gitRepo) Stat(ctx context.Context, rev string) (*RevInfo, error) {
 	if rev == "latest" {
-		return r.Latest()
+		return r.Latest(ctx)
 	}
-	type cached struct {
-		info *RevInfo
-		err  error
-	}
-	c := r.statCache.Do(rev, func() any {
-		info, err := r.stat(rev)
-		return cached{info, err}
-	}).(cached)
-	return c.info, c.err
+	return r.statCache.Do(rev, func() (*RevInfo, error) {
+		return r.stat(ctx, rev)
+	})
 }
 
-func (r *gitRepo) ReadFile(rev, file string, maxSize int64) ([]byte, error) {
+func (r *gitRepo) ReadFile(ctx context.Context, rev, file string, maxSize int64) ([]byte, error) {
 	// TODO: Could use git cat-file --batch.
-	info, err := r.Stat(rev) // download rev into local git repo
+	info, err := r.Stat(ctx, rev) // download rev into local git repo
 	if err != nil {
 		return nil, err
 	}
-	out, err := Run(r.dir, "git", "cat-file", "blob", info.Name+":"+file)
+	out, err := Run(ctx, r.dir, "git", "cat-file", "blob", info.Name+":"+file)
 	if err != nil {
 		return nil, fs.ErrNotExist
 	}
 	return out, nil
 }
 
-func (r *gitRepo) RecentTag(rev, prefix string, allowed func(tag string) bool) (tag string, err error) {
-	info, err := r.Stat(rev)
+func (r *gitRepo) RecentTag(ctx context.Context, rev, prefix string, allowed func(tag string) bool) (tag string, err error) {
+	info, err := r.Stat(ctx, rev)
 	if err != nil {
 		return "", err
 	}
@@ -672,7 +699,7 @@
 	// result is definitive.
 	describe := func() (definitive bool) {
 		var out []byte
-		out, err = Run(r.dir, "git", "for-each-ref", "--format", "%(refname)", "refs/tags", "--merged", rev)
+		out, err = Run(ctx, r.dir, "git", "for-each-ref", "--format", "%(refname)", "refs/tags", "--merged", rev)
 		if err != nil {
 			return true
 		}
@@ -714,7 +741,7 @@
 
 	// Git didn't find a version tag preceding the requested rev.
 	// See whether any plausible tag exists.
-	tags, err := r.Tags(prefix + "v")
+	tags, err := r.Tags(ctx, prefix+"v")
 	if err != nil {
 		return "", err
 	}
@@ -731,7 +758,7 @@
 	}
 	defer unlock()
 
-	if err := r.fetchRefsLocked(); err != nil {
+	if err := r.fetchRefsLocked(ctx); err != nil {
 		return "", err
 	}
 
@@ -749,14 +776,14 @@
 	return tag, err
 }
 
-func (r *gitRepo) DescendsFrom(rev, tag string) (bool, error) {
+func (r *gitRepo) DescendsFrom(ctx context.Context, rev, tag string) (bool, error) {
 	// The "--is-ancestor" flag was added to "git merge-base" in version 1.8.0, so
 	// this won't work with Git 1.7.1. According to golang.org/issue/28550, cmd/go
 	// already doesn't work with Git 1.7.1, so at least it's not a regression.
 	//
 	// git merge-base --is-ancestor exits with status 0 if rev is an ancestor, or
 	// 1 if not.
-	_, err := Run(r.dir, "git", "merge-base", "--is-ancestor", "--", tag, rev)
+	_, err := Run(ctx, r.dir, "git", "merge-base", "--is-ancestor", "--", tag, rev)
 
 	// Git reports "is an ancestor" with exit code 0 and "not an ancestor" with
 	// exit code 1.
@@ -768,7 +795,7 @@
 	}
 
 	// See whether the tag and rev even exist.
-	tags, err := r.Tags(tag)
+	tags, err := r.Tags(ctx, tag)
 	if err != nil {
 		return false, err
 	}
@@ -779,7 +806,7 @@
 	// NOTE: r.stat is very careful not to fetch commits that we shouldn't know
 	// about, like rejected GitHub pull requests, so don't try to short-circuit
 	// that here.
-	if _, err = r.stat(rev); err != nil {
+	if _, err = r.stat(ctx, rev); err != nil {
 		return false, err
 	}
 
@@ -795,12 +822,12 @@
 		// efficient to only fetch the history from rev to tag, but that's much more
 		// complicated, and any kind of shallow fetch is fairly likely to trigger
 		// bugs in JGit servers and/or the go command anyway.
-		if err := r.fetchRefsLocked(); err != nil {
+		if err := r.fetchRefsLocked(ctx); err != nil {
 			return false, err
 		}
 	}
 
-	_, err = Run(r.dir, "git", "merge-base", "--is-ancestor", "--", tag, rev)
+	_, err = Run(ctx, r.dir, "git", "merge-base", "--is-ancestor", "--", tag, rev)
 	if err == nil {
 		return true, nil
 	}
@@ -810,13 +837,13 @@
 	return false, err
 }
 
-func (r *gitRepo) ReadZip(rev, subdir string, maxSize int64) (zip io.ReadCloser, err error) {
+func (r *gitRepo) ReadZip(ctx context.Context, rev, subdir string, maxSize int64) (zip io.ReadCloser, err error) {
 	// TODO: Use maxSize or drop it.
 	args := []string{}
 	if subdir != "" {
 		args = append(args, "--", subdir)
 	}
-	info, err := r.Stat(rev) // download rev into local git repo
+	info, err := r.Stat(ctx, rev) // download rev into local git repo
 	if err != nil {
 		return nil, err
 	}
@@ -836,7 +863,7 @@
 	// text file line endings. Setting -c core.autocrlf=input means only
 	// translate files on the way into the repo, not on the way out (archive).
 	// The -c core.eol=lf should be unnecessary but set it anyway.
-	archive, err := Run(r.dir, "git", "-c", "core.autocrlf=input", "-c", "core.eol=lf", "archive", "--format=zip", "--prefix=prefix/", info.Name, args)
+	archive, err := Run(ctx, r.dir, "git", "-c", "core.autocrlf=input", "-c", "core.eol=lf", "archive", "--format=zip", "--prefix=prefix/", info.Name, args)
 	if err != nil {
 		if bytes.Contains(err.(*RunError).Stderr, []byte("did not match any files")) {
 			return nil, fs.ErrNotExist
diff --git a/src/cmd/go/internal/modfetch/codehost/git_test.go b/src/cmd/go/internal/modfetch/codehost/git_test.go
index ec95097..328ab5b 100644
--- a/src/cmd/go/internal/modfetch/codehost/git_test.go
+++ b/src/cmd/go/internal/modfetch/codehost/git_test.go
@@ -9,31 +9,31 @@
 	"bytes"
 	"cmd/go/internal/cfg"
 	"cmd/go/internal/vcweb/vcstest"
+	"context"
 	"flag"
 	"internal/testenv"
 	"io"
 	"io/fs"
 	"log"
 	"os"
-	"os/exec"
 	"path"
 	"path/filepath"
 	"reflect"
+	"runtime"
 	"strings"
+	"sync"
 	"testing"
 	"time"
 )
 
 func TestMain(m *testing.M) {
-	// needed for initializing the test environment variables as testing.Short
-	// and HasExternalNetwork
 	flag.Parse()
 	if err := testMain(m); err != nil {
 		log.Fatal(err)
 	}
 }
 
-var gitrepo1, hgrepo1 string
+var gitrepo1, hgrepo1, vgotest1 string
 
 var altRepos = func() []string {
 	return []string{
@@ -45,11 +45,51 @@
 // TODO: Convert gitrepo1 to svn, bzr, fossil and add tests.
 // For now, at least the hgrepo1 tests check the general vcs.go logic.
 
-// localGitRepo is like gitrepo1 but allows archive access.
-var localGitRepo, localGitURL string
+// localGitRepo is like gitrepo1 but allows archive access
+// (although that doesn't really matter after CL 120041),
+// and has a file:// URL instead of http:// or https://
+// (which might still matter).
+var localGitRepo string
+
+// localGitURL initializes the repo in localGitRepo and returns its URL.
+func localGitURL(t testing.TB) string {
+	testenv.MustHaveExecPath(t, "git")
+	if runtime.GOOS == "android" && strings.HasSuffix(testenv.Builder(), "-corellium") {
+		testenv.SkipFlaky(t, 59940)
+	}
+
+	localGitURLOnce.Do(func() {
+		// Clone gitrepo1 into a local directory.
+		// If we use a file:// URL to access the local directory,
+		// then git starts up all the usual protocol machinery,
+		// which will let us test remote git archive invocations.
+		_, localGitURLErr = Run(context.Background(), "", "git", "clone", "--mirror", gitrepo1, localGitRepo)
+		if localGitURLErr != nil {
+			return
+		}
+		_, localGitURLErr = Run(context.Background(), localGitRepo, "git", "config", "daemon.uploadarch", "true")
+	})
+
+	if localGitURLErr != nil {
+		t.Fatal(localGitURLErr)
+	}
+	// Convert absolute path to file URL. LocalGitRepo will not accept
+	// Windows absolute paths because they look like a host:path remote.
+	// TODO(golang.org/issue/32456): use url.FromFilePath when implemented.
+	if strings.HasPrefix(localGitRepo, "/") {
+		return "file://" + localGitRepo
+	} else {
+		return "file:///" + filepath.ToSlash(localGitRepo)
+	}
+}
+
+var (
+	localGitURLOnce sync.Once
+	localGitURLErr  error
+)
 
 func testMain(m *testing.M) (err error) {
-	cfg.BuildX = true
+	cfg.BuildX = testing.Verbose()
 
 	srv, err := vcstest.NewServer()
 	if err != nil {
@@ -63,6 +103,7 @@
 
 	gitrepo1 = srv.HTTP.URL + "/git/gitrepo1"
 	hgrepo1 = srv.HTTP.URL + "/hg/hgrepo1"
+	vgotest1 = srv.HTTP.URL + "/git/vgotest1"
 
 	dir, err := os.MkdirTemp("", "gitrepo-test-")
 	if err != nil {
@@ -74,44 +115,63 @@
 		}
 	}()
 
+	localGitRepo = filepath.Join(dir, "gitrepo2")
+
 	// Redirect the module cache to a fresh directory to avoid crosstalk, and make
 	// it read/write so that the test can still clean it up easily when done.
 	cfg.GOMODCACHE = filepath.Join(dir, "modcache")
 	cfg.ModCacheRW = true
 
-	if !testing.Short() && testenv.HasExec() {
-		if _, err := exec.LookPath("git"); err == nil {
-			// Clone gitrepo1 into a local directory.
-			// If we use a file:// URL to access the local directory,
-			// then git starts up all the usual protocol machinery,
-			// which will let us test remote git archive invocations.
-			localGitRepo = filepath.Join(dir, "gitrepo2")
-			if _, err := Run("", "git", "clone", "--mirror", gitrepo1, localGitRepo); err != nil {
-				return err
-			}
-			if _, err := Run(localGitRepo, "git", "config", "daemon.uploadarch", "true"); err != nil {
-				return err
-			}
-
-			// Convert absolute path to file URL. LocalGitRepo will not accept
-			// Windows absolute paths because they look like a host:path remote.
-			// TODO(golang.org/issue/32456): use url.FromFilePath when implemented.
-			if strings.HasPrefix(localGitRepo, "/") {
-				localGitURL = "file://" + localGitRepo
-			} else {
-				localGitURL = "file:///" + filepath.ToSlash(localGitRepo)
-			}
-		}
-	}
-
 	m.Run()
 	return nil
 }
 
-func testRepo(t *testing.T, remote string) (Repo, error) {
+func testContext(t testing.TB) context.Context {
+	w := newTestWriter(t)
+	return cfg.WithBuildXWriter(context.Background(), w)
+}
+
+// A testWriter is an io.Writer that writes to a test's log.
+//
+// The writer batches written data until the last byte of a write is a newline
+// character, then flushes the batched data as a single call to Logf.
+// Any remaining unflushed data is logged during Cleanup.
+type testWriter struct {
+	t testing.TB
+
+	mu  sync.Mutex
+	buf bytes.Buffer
+}
+
+func newTestWriter(t testing.TB) *testWriter {
+	w := &testWriter{t: t}
+
+	t.Cleanup(func() {
+		w.mu.Lock()
+		defer w.mu.Unlock()
+		if b := w.buf.Bytes(); len(b) > 0 {
+			w.t.Logf("%s", b)
+			w.buf.Reset()
+		}
+	})
+
+	return w
+}
+
+func (w *testWriter) Write(p []byte) (int, error) {
+	w.mu.Lock()
+	defer w.mu.Unlock()
+	n, err := w.buf.Write(p)
+	if b := w.buf.Bytes(); len(b) > 0 && b[len(b)-1] == '\n' {
+		w.t.Logf("%s", b)
+		w.buf.Reset()
+	}
+	return n, err
+}
+
+func testRepo(ctx context.Context, t *testing.T, remote string) (Repo, error) {
 	if remote == "localGitRepo" {
-		testenv.MustHaveExecPath(t, "git")
-		return LocalGitRepo(localGitURL)
+		return LocalGitRepo(ctx, localGitURL(t))
 	}
 	vcsName := "git"
 	for _, k := range []string{"hg"} {
@@ -119,13 +179,17 @@
 			vcsName = k
 		}
 	}
+	if testing.Short() && vcsName == "hg" {
+		t.Skipf("skipping hg test in short mode: hg is slow")
+	}
 	testenv.MustHaveExecPath(t, vcsName)
-	return NewRepo(vcsName, remote)
+	if runtime.GOOS == "android" && strings.HasSuffix(testenv.Builder(), "-corellium") {
+		testenv.SkipFlaky(t, 59940)
+	}
+	return NewRepo(ctx, vcsName, remote)
 }
 
 func TestTags(t *testing.T) {
-	testenv.MustHaveExternalNetwork(t)
-	testenv.MustHaveExec(t)
 	t.Parallel()
 
 	type tagsTest struct {
@@ -137,12 +201,13 @@
 	runTest := func(tt tagsTest) func(*testing.T) {
 		return func(t *testing.T) {
 			t.Parallel()
+			ctx := testContext(t)
 
-			r, err := testRepo(t, tt.repo)
+			r, err := testRepo(ctx, t, tt.repo)
 			if err != nil {
 				t.Fatal(err)
 			}
-			tags, err := r.Tags(tt.prefix)
+			tags, err := r.Tags(ctx, tt.prefix)
 			if err != nil {
 				t.Fatal(err)
 			}
@@ -195,8 +260,6 @@
 }
 
 func TestLatest(t *testing.T) {
-	testenv.MustHaveExternalNetwork(t)
-	testenv.MustHaveExec(t)
 	t.Parallel()
 
 	type latestTest struct {
@@ -206,16 +269,20 @@
 	runTest := func(tt latestTest) func(*testing.T) {
 		return func(t *testing.T) {
 			t.Parallel()
+			ctx := testContext(t)
 
-			r, err := testRepo(t, tt.repo)
+			r, err := testRepo(ctx, t, tt.repo)
 			if err != nil {
 				t.Fatal(err)
 			}
-			info, err := r.Latest()
+			info, err := r.Latest(ctx)
 			if err != nil {
 				t.Fatal(err)
 			}
 			if !reflect.DeepEqual(info, tt.info) {
+				if !reflect.DeepEqual(info.Tags, tt.info.Tags) {
+					testenv.SkipFlaky(t, 56881)
+				}
 				t.Errorf("Latest: incorrect info\nhave %+v (origin %+v)\nwant %+v (origin %+v)", info, info.Origin, tt.info, tt.info.Origin)
 			}
 		}
@@ -260,15 +327,13 @@
 			tt.info = &info
 			o := *info.Origin
 			info.Origin = &o
-			o.URL = localGitURL
+			o.URL = localGitURL(t)
 			t.Run(path.Base(tt.repo), runTest(tt))
 		}
 	}
 }
 
 func TestReadFile(t *testing.T) {
-	testenv.MustHaveExternalNetwork(t)
-	testenv.MustHaveExec(t)
 	t.Parallel()
 
 	type readFileTest struct {
@@ -281,12 +346,13 @@
 	runTest := func(tt readFileTest) func(*testing.T) {
 		return func(t *testing.T) {
 			t.Parallel()
+			ctx := testContext(t)
 
-			r, err := testRepo(t, tt.repo)
+			r, err := testRepo(ctx, t, tt.repo)
 			if err != nil {
 				t.Fatal(err)
 			}
-			data, err := r.ReadFile(tt.rev, tt.file, 100)
+			data, err := r.ReadFile(ctx, tt.rev, tt.file, 100)
 			if err != nil {
 				if tt.err == "" {
 					t.Fatalf("ReadFile: unexpected error %v", err)
@@ -343,8 +409,6 @@
 }
 
 func TestReadZip(t *testing.T) {
-	testenv.MustHaveExternalNetwork(t)
-	testenv.MustHaveExec(t)
 	t.Parallel()
 
 	type readZipTest struct {
@@ -357,12 +421,13 @@
 	runTest := func(tt readZipTest) func(*testing.T) {
 		return func(t *testing.T) {
 			t.Parallel()
+			ctx := testContext(t)
 
-			r, err := testRepo(t, tt.repo)
+			r, err := testRepo(ctx, t, tt.repo)
 			if err != nil {
 				t.Fatal(err)
 			}
-			rc, err := r.ReadZip(tt.rev, tt.subdir, 100000)
+			rc, err := r.ReadZip(ctx, tt.rev, tt.subdir, 100000)
 			if err != nil {
 				if tt.err == "" {
 					t.Fatalf("ReadZip: unexpected error %v", err)
@@ -535,7 +600,7 @@
 		},
 
 		{
-			repo:   "https://github.com/rsc/vgotest1",
+			repo:   vgotest1,
 			rev:    "submod/v1.0.4",
 			subdir: "submod",
 			files: map[string]uint64{
@@ -564,8 +629,6 @@
 }
 
 func TestStat(t *testing.T) {
-	testenv.MustHaveExternalNetwork(t)
-	testenv.MustHaveExec(t)
 	t.Parallel()
 
 	type statTest struct {
@@ -577,12 +640,13 @@
 	runTest := func(tt statTest) func(*testing.T) {
 		return func(t *testing.T) {
 			t.Parallel()
+			ctx := testContext(t)
 
-			r, err := testRepo(t, tt.repo)
+			r, err := testRepo(ctx, t, tt.repo)
 			if err != nil {
 				t.Fatal(err)
 			}
-			info, err := r.Stat(tt.rev)
+			info, err := r.Stat(ctx, tt.rev)
 			if err != nil {
 				if tt.err == "" {
 					t.Fatalf("Stat: unexpected error %v", err)
@@ -597,6 +661,9 @@
 			}
 			info.Origin = nil // TestLatest and ../../../testdata/script/reuse_git.txt test Origin well enough
 			if !reflect.DeepEqual(info, tt.info) {
+				if !reflect.DeepEqual(info.Tags, tt.info.Tags) {
+					testenv.SkipFlaky(t, 56881)
+				}
 				t.Errorf("Stat: incorrect info\nhave %+v\nwant %+v", *info, *tt.info)
 			}
 		}
diff --git a/src/cmd/go/internal/modfetch/codehost/svn.go b/src/cmd/go/internal/modfetch/codehost/svn.go
index 6ec9e59..9c1c100 100644
--- a/src/cmd/go/internal/modfetch/codehost/svn.go
+++ b/src/cmd/go/internal/modfetch/codehost/svn.go
@@ -6,13 +6,17 @@
 
 import (
 	"archive/zip"
+	"context"
 	"encoding/xml"
 	"fmt"
 	"io"
 	"os"
 	"path"
 	"path/filepath"
+	"strconv"
 	"time"
+
+	"cmd/go/internal/base"
 )
 
 func svnParseStat(rev, out string) (*RevInfo, error) {
@@ -32,7 +36,7 @@
 	}
 
 	info := &RevInfo{
-		Name:    fmt.Sprintf("%d", log.Logentry.Revision),
+		Name:    strconv.FormatInt(log.Logentry.Revision, 10),
 		Short:   fmt.Sprintf("%012d", log.Logentry.Revision),
 		Time:    t.UTC(),
 		Version: rev,
@@ -40,7 +44,7 @@
 	return info, nil
 }
 
-func svnReadZip(dst io.Writer, workDir, rev, subdir, remote string) (err error) {
+func svnReadZip(ctx context.Context, dst io.Writer, workDir, rev, subdir, remote string) (err error) {
 	// The subversion CLI doesn't provide a command to write the repository
 	// directly to an archive, so we need to export it to the local filesystem
 	// instead. Unfortunately, the local filesystem might apply arbitrary
@@ -64,7 +68,11 @@
 		remotePath += "/" + subdir
 	}
 
-	out, err := Run(workDir, []string{
+	release, err := base.AcquireNet()
+	if err != nil {
+		return err
+	}
+	out, err := Run(ctx, workDir, []string{
 		"svn", "list",
 		"--non-interactive",
 		"--xml",
@@ -73,6 +81,7 @@
 		"--revision", rev,
 		"--", remotePath,
 	})
+	release()
 	if err != nil {
 		return err
 	}
@@ -96,7 +105,11 @@
 	}
 	defer os.RemoveAll(exportDir) // best-effort
 
-	_, err = Run(workDir, []string{
+	release, err = base.AcquireNet()
+	if err != nil {
+		return err
+	}
+	_, err = Run(ctx, workDir, []string{
 		"svn", "export",
 		"--non-interactive",
 		"--quiet",
@@ -110,6 +123,7 @@
 		"--", remotePath,
 		exportDir,
 	})
+	release()
 	if err != nil {
 		return err
 	}
diff --git a/src/cmd/go/internal/modfetch/codehost/vcs.go b/src/cmd/go/internal/modfetch/codehost/vcs.go
index 300a23c..5bd1005 100644
--- a/src/cmd/go/internal/modfetch/codehost/vcs.go
+++ b/src/cmd/go/internal/modfetch/codehost/vcs.go
@@ -5,6 +5,7 @@
 package codehost
 
 import (
+	"context"
 	"errors"
 	"fmt"
 	"internal/lazyregexp"
@@ -18,6 +19,7 @@
 	"sync"
 	"time"
 
+	"cmd/go/internal/base"
 	"cmd/go/internal/lockedfile"
 	"cmd/go/internal/par"
 	"cmd/go/internal/str"
@@ -44,27 +46,22 @@
 	return &VCSError{Err: fmt.Errorf(format, a...)}
 }
 
-func NewRepo(vcs, remote string) (Repo, error) {
-	type key struct {
-		vcs    string
-		remote string
-	}
-	type cached struct {
-		repo Repo
-		err  error
-	}
-	c := vcsRepoCache.Do(key{vcs, remote}, func() any {
-		repo, err := newVCSRepo(vcs, remote)
-		if err != nil {
-			err = &VCSError{err}
-		}
-		return cached{repo, err}
-	}).(cached)
-
-	return c.repo, c.err
+type vcsCacheKey struct {
+	vcs    string
+	remote string
 }
 
-var vcsRepoCache par.Cache
+func NewRepo(ctx context.Context, vcs, remote string) (Repo, error) {
+	return vcsRepoCache.Do(vcsCacheKey{vcs, remote}, func() (Repo, error) {
+		repo, err := newVCSRepo(ctx, vcs, remote)
+		if err != nil {
+			return nil, &VCSError{err}
+		}
+		return repo, nil
+	})
+}
+
+var vcsRepoCache par.ErrCache[vcsCacheKey, Repo]
 
 type vcsRepo struct {
 	mu lockedfile.Mutex // protects all commands, so we don't have to decide which are safe on a per-VCS basis
@@ -83,9 +80,9 @@
 	fetchErr  error
 }
 
-func newVCSRepo(vcs, remote string) (Repo, error) {
+func newVCSRepo(ctx context.Context, vcs, remote string) (Repo, error) {
 	if vcs == "git" {
-		return newGitRepo(remote, false)
+		return newGitRepo(ctx, remote, false)
 	}
 	cmd := vcsCmds[vcs]
 	if cmd == nil {
@@ -97,7 +94,7 @@
 
 	r := &vcsRepo{remote: remote, cmd: cmd}
 	var err error
-	r.dir, r.mu.Path, err = WorkDir(vcsWorkDirType+vcs, r.remote)
+	r.dir, r.mu.Path, err = WorkDir(ctx, vcsWorkDirType+vcs, r.remote)
 	if err != nil {
 		return nil, err
 	}
@@ -113,7 +110,14 @@
 	defer unlock()
 
 	if _, err := os.Stat(filepath.Join(r.dir, "."+vcs)); err != nil {
-		if _, err := Run(r.dir, cmd.init(r.remote)); err != nil {
+		release, err := base.AcquireNet()
+		if err != nil {
+			return nil, err
+		}
+		_, err = Run(ctx, r.dir, cmd.init(r.remote))
+		release()
+
+		if err != nil {
 			os.RemoveAll(r.dir)
 			return nil, err
 		}
@@ -124,20 +128,20 @@
 const vcsWorkDirType = "vcs1."
 
 type vcsCmd struct {
-	vcs           string                                                         // vcs name "hg"
-	init          func(remote string) []string                                   // cmd to init repo to track remote
-	tags          func(remote string) []string                                   // cmd to list local tags
-	tagRE         *lazyregexp.Regexp                                             // regexp to extract tag names from output of tags cmd
-	branches      func(remote string) []string                                   // cmd to list local branches
-	branchRE      *lazyregexp.Regexp                                             // regexp to extract branch names from output of tags cmd
-	badLocalRevRE *lazyregexp.Regexp                                             // regexp of names that must not be served out of local cache without doing fetch first
-	statLocal     func(rev, remote string) []string                              // cmd to stat local rev
-	parseStat     func(rev, out string) (*RevInfo, error)                        // cmd to parse output of statLocal
-	fetch         []string                                                       // cmd to fetch everything from remote
-	latest        string                                                         // name of latest commit on remote (tip, HEAD, etc)
-	readFile      func(rev, file, remote string) []string                        // cmd to read rev's file
-	readZip       func(rev, subdir, remote, target string) []string              // cmd to read rev's subdir as zip file
-	doReadZip     func(dst io.Writer, workDir, rev, subdir, remote string) error // arbitrary function to read rev's subdir as zip file
+	vcs           string                                                                              // vcs name "hg"
+	init          func(remote string) []string                                                        // cmd to init repo to track remote
+	tags          func(remote string) []string                                                        // cmd to list local tags
+	tagRE         *lazyregexp.Regexp                                                                  // regexp to extract tag names from output of tags cmd
+	branches      func(remote string) []string                                                        // cmd to list local branches
+	branchRE      *lazyregexp.Regexp                                                                  // regexp to extract branch names from output of tags cmd
+	badLocalRevRE *lazyregexp.Regexp                                                                  // regexp of names that must not be served out of local cache without doing fetch first
+	statLocal     func(rev, remote string) []string                                                   // cmd to stat local rev
+	parseStat     func(rev, out string) (*RevInfo, error)                                             // cmd to parse output of statLocal
+	fetch         []string                                                                            // cmd to fetch everything from remote
+	latest        string                                                                              // name of latest commit on remote (tip, HEAD, etc)
+	readFile      func(rev, file, remote string) []string                                             // cmd to read rev's file
+	readZip       func(rev, subdir, remote, target string) []string                                   // cmd to read rev's subdir as zip file
+	doReadZip     func(ctx context.Context, dst io.Writer, workDir, rev, subdir, remote string) error // arbitrary function to read rev's subdir as zip file
 }
 
 var re = lazyregexp.New
@@ -257,8 +261,8 @@
 	},
 }
 
-func (r *vcsRepo) loadTags() {
-	out, err := Run(r.dir, r.cmd.tags(r.remote))
+func (r *vcsRepo) loadTags(ctx context.Context) {
+	out, err := Run(ctx, r.dir, r.cmd.tags(r.remote))
 	if err != nil {
 		return
 	}
@@ -273,12 +277,12 @@
 	}
 }
 
-func (r *vcsRepo) loadBranches() {
+func (r *vcsRepo) loadBranches(ctx context.Context) {
 	if r.cmd.branches == nil {
 		return
 	}
 
-	out, err := Run(r.dir, r.cmd.branches(r.remote))
+	out, err := Run(ctx, r.dir, r.cmd.branches(r.remote))
 	if err != nil {
 		return
 	}
@@ -292,18 +296,18 @@
 	}
 }
 
-func (r *vcsRepo) CheckReuse(old *Origin, subdir string) error {
-	return fmt.Errorf("vcs %s: CheckReuse: %w", r.cmd.vcs, ErrUnsupported)
+func (r *vcsRepo) CheckReuse(ctx context.Context, old *Origin, subdir string) error {
+	return fmt.Errorf("vcs %s: CheckReuse: %w", r.cmd.vcs, errors.ErrUnsupported)
 }
 
-func (r *vcsRepo) Tags(prefix string) (*Tags, error) {
+func (r *vcsRepo) Tags(ctx context.Context, prefix string) (*Tags, error) {
 	unlock, err := r.mu.Lock()
 	if err != nil {
 		return nil, err
 	}
 	defer unlock()
 
-	r.tagsOnce.Do(r.loadTags)
+	r.tagsOnce.Do(func() { r.loadTags(ctx) })
 	tags := &Tags{
 		// None of the other VCS provide a reasonable way to compute TagSum
 		// without downloading the whole repo, so we only include VCS and URL
@@ -325,7 +329,7 @@
 	return tags, nil
 }
 
-func (r *vcsRepo) Stat(rev string) (*RevInfo, error) {
+func (r *vcsRepo) Stat(ctx context.Context, rev string) (*RevInfo, error) {
 	unlock, err := r.mu.Lock()
 	if err != nil {
 		return nil, err
@@ -335,19 +339,19 @@
 	if rev == "latest" {
 		rev = r.cmd.latest
 	}
-	r.branchesOnce.Do(r.loadBranches)
+	r.branchesOnce.Do(func() { r.loadBranches(ctx) })
 	revOK := (r.cmd.badLocalRevRE == nil || !r.cmd.badLocalRevRE.MatchString(rev)) && !r.branches[rev]
 	if revOK {
-		if info, err := r.statLocal(rev); err == nil {
+		if info, err := r.statLocal(ctx, rev); err == nil {
 			return info, nil
 		}
 	}
 
-	r.fetchOnce.Do(r.fetch)
+	r.fetchOnce.Do(func() { r.fetch(ctx) })
 	if r.fetchErr != nil {
 		return nil, r.fetchErr
 	}
-	info, err := r.statLocal(rev)
+	info, err := r.statLocal(ctx, rev)
 	if err != nil {
 		return nil, err
 	}
@@ -357,14 +361,20 @@
 	return info, nil
 }
 
-func (r *vcsRepo) fetch() {
+func (r *vcsRepo) fetch(ctx context.Context) {
 	if len(r.cmd.fetch) > 0 {
-		_, r.fetchErr = Run(r.dir, r.cmd.fetch)
+		release, err := base.AcquireNet()
+		if err != nil {
+			r.fetchErr = err
+			return
+		}
+		_, r.fetchErr = Run(ctx, r.dir, r.cmd.fetch)
+		release()
 	}
 }
 
-func (r *vcsRepo) statLocal(rev string) (*RevInfo, error) {
-	out, err := Run(r.dir, r.cmd.statLocal(rev, r.remote))
+func (r *vcsRepo) statLocal(ctx context.Context, rev string) (*RevInfo, error) {
+	out, err := Run(ctx, r.dir, r.cmd.statLocal(rev, r.remote))
 	if err != nil {
 		return nil, &UnknownRevisionError{Rev: rev}
 	}
@@ -380,15 +390,15 @@
 	return info, nil
 }
 
-func (r *vcsRepo) Latest() (*RevInfo, error) {
-	return r.Stat("latest")
+func (r *vcsRepo) Latest(ctx context.Context) (*RevInfo, error) {
+	return r.Stat(ctx, "latest")
 }
 
-func (r *vcsRepo) ReadFile(rev, file string, maxSize int64) ([]byte, error) {
+func (r *vcsRepo) ReadFile(ctx context.Context, rev, file string, maxSize int64) ([]byte, error) {
 	if rev == "latest" {
 		rev = r.cmd.latest
 	}
-	_, err := r.Stat(rev) // download rev into local repo
+	_, err := r.Stat(ctx, rev) // download rev into local repo
 	if err != nil {
 		return nil, err
 	}
@@ -400,14 +410,14 @@
 	}
 	defer unlock()
 
-	out, err := Run(r.dir, r.cmd.readFile(rev, file, r.remote))
+	out, err := Run(ctx, r.dir, r.cmd.readFile(rev, file, r.remote))
 	if err != nil {
 		return nil, fs.ErrNotExist
 	}
 	return out, nil
 }
 
-func (r *vcsRepo) RecentTag(rev, prefix string, allowed func(string) bool) (tag string, err error) {
+func (r *vcsRepo) RecentTag(ctx context.Context, rev, prefix string, allowed func(string) bool) (tag string, err error) {
 	// We don't technically need to lock here since we're returning an error
 	// uncondititonally, but doing so anyway will help to avoid baking in
 	// lock-inversion bugs.
@@ -417,22 +427,22 @@
 	}
 	defer unlock()
 
-	return "", vcsErrorf("vcs %s: RecentTag: %w", r.cmd.vcs, ErrUnsupported)
+	return "", vcsErrorf("vcs %s: RecentTag: %w", r.cmd.vcs, errors.ErrUnsupported)
 }
 
-func (r *vcsRepo) DescendsFrom(rev, tag string) (bool, error) {
+func (r *vcsRepo) DescendsFrom(ctx context.Context, rev, tag string) (bool, error) {
 	unlock, err := r.mu.Lock()
 	if err != nil {
 		return false, err
 	}
 	defer unlock()
 
-	return false, vcsErrorf("vcs %s: DescendsFrom: %w", r.cmd.vcs, ErrUnsupported)
+	return false, vcsErrorf("vcs %s: DescendsFrom: %w", r.cmd.vcs, errors.ErrUnsupported)
 }
 
-func (r *vcsRepo) ReadZip(rev, subdir string, maxSize int64) (zip io.ReadCloser, err error) {
+func (r *vcsRepo) ReadZip(ctx context.Context, rev, subdir string, maxSize int64) (zip io.ReadCloser, err error) {
 	if r.cmd.readZip == nil && r.cmd.doReadZip == nil {
-		return nil, vcsErrorf("vcs %s: ReadZip: %w", r.cmd.vcs, ErrUnsupported)
+		return nil, vcsErrorf("vcs %s: ReadZip: %w", r.cmd.vcs, errors.ErrUnsupported)
 	}
 
 	unlock, err := r.mu.Lock()
@@ -454,7 +464,7 @@
 			N:               maxSize,
 			ErrLimitReached: errors.New("ReadZip: encoded file exceeds allowed size"),
 		}
-		err = r.cmd.doReadZip(lw, r.dir, rev, subdir, r.remote)
+		err = r.cmd.doReadZip(ctx, lw, r.dir, rev, subdir, r.remote)
 		if err == nil {
 			_, err = f.Seek(0, io.SeekStart)
 		}
@@ -470,9 +480,9 @@
 				args[i] = filepath.Join(r.dir, ".fossil")
 			}
 		}
-		_, err = Run(filepath.Dir(f.Name()), args)
+		_, err = Run(ctx, filepath.Dir(f.Name()), args)
 	} else {
-		_, err = Run(r.dir, r.cmd.readZip(rev, subdir, r.remote, f.Name()))
+		_, err = Run(ctx, r.dir, r.cmd.readZip(rev, subdir, r.remote, f.Name()))
 	}
 	if err != nil {
 		f.Close()
@@ -493,7 +503,7 @@
 }
 
 func hgParseStat(rev, out string) (*RevInfo, error) {
-	f := strings.Fields(string(out))
+	f := strings.Fields(out)
 	if len(f) < 3 {
 		return nil, vcsErrorf("unexpected response from hg log: %q", out)
 	}
@@ -572,7 +582,7 @@
 	}
 
 	info := &RevInfo{
-		Name:    fmt.Sprintf("%d", revno),
+		Name:    strconv.FormatInt(revno, 10),
 		Short:   fmt.Sprintf("%012d", revno),
 		Time:    tm,
 		Version: rev,
diff --git a/src/cmd/go/internal/modfetch/coderepo.go b/src/cmd/go/internal/modfetch/coderepo.go
index 04164ff..8fe432a 100644
--- a/src/cmd/go/internal/modfetch/coderepo.go
+++ b/src/cmd/go/internal/modfetch/coderepo.go
@@ -7,16 +7,19 @@
 import (
 	"archive/zip"
 	"bytes"
+	"context"
 	"errors"
 	"fmt"
 	"io"
 	"io/fs"
 	"os"
 	"path"
+	"path/filepath"
 	"sort"
 	"strings"
 	"time"
 
+	"cmd/go/internal/gover"
 	"cmd/go/internal/modfetch/codehost"
 
 	"golang.org/x/mod/modfile"
@@ -130,11 +133,11 @@
 	return r.modPath
 }
 
-func (r *codeRepo) CheckReuse(old *codehost.Origin) error {
-	return r.code.CheckReuse(old, r.codeDir)
+func (r *codeRepo) CheckReuse(ctx context.Context, old *codehost.Origin) error {
+	return r.code.CheckReuse(ctx, old, r.codeDir)
 }
 
-func (r *codeRepo) Versions(prefix string) (*Versions, error) {
+func (r *codeRepo) Versions(ctx context.Context, prefix string) (*Versions, error) {
 	// Special case: gopkg.in/macaroon-bakery.v2-unstable
 	// does not use the v2 tags (those are for macaroon-bakery.v2).
 	// It has no possible tags at all.
@@ -146,7 +149,7 @@
 	if r.codeDir != "" {
 		p = r.codeDir + "/" + p
 	}
-	tags, err := r.code.Tags(p)
+	tags, err := r.code.Tags(ctx, p)
 	if err != nil {
 		return nil, &module.ModuleError{
 			Path: r.modPath,
@@ -195,7 +198,7 @@
 	semver.Sort(list)
 	semver.Sort(incompatible)
 
-	return r.appendIncompatibleVersions(tags.Origin, list, incompatible)
+	return r.appendIncompatibleVersions(ctx, tags.Origin, list, incompatible)
 }
 
 // appendIncompatibleVersions appends "+incompatible" versions to list if
@@ -205,7 +208,7 @@
 // prefix.
 //
 // Both list and incompatible must be sorted in semantic order.
-func (r *codeRepo) appendIncompatibleVersions(origin *codehost.Origin, list, incompatible []string) (*Versions, error) {
+func (r *codeRepo) appendIncompatibleVersions(ctx context.Context, origin *codehost.Origin, list, incompatible []string) (*Versions, error) {
 	versions := &Versions{
 		Origin: origin,
 		List:   list,
@@ -216,7 +219,7 @@
 	}
 
 	versionHasGoMod := func(v string) (bool, error) {
-		_, err := r.code.ReadFile(v, "go.mod", codehost.MaxGoMod)
+		_, err := r.code.ReadFile(ctx, v, "go.mod", codehost.MaxGoMod)
 		if err == nil {
 			return true, nil
 		}
@@ -290,12 +293,12 @@
 	return versions, nil
 }
 
-func (r *codeRepo) Stat(rev string) (*RevInfo, error) {
+func (r *codeRepo) Stat(ctx context.Context, rev string) (*RevInfo, error) {
 	if rev == "latest" {
-		return r.Latest()
+		return r.Latest(ctx)
 	}
 	codeRev := r.revToRev(rev)
-	info, err := r.code.Stat(codeRev)
+	info, err := r.code.Stat(ctx, codeRev)
 	if err != nil {
 		// Note: info may be non-nil to supply Origin for caching error.
 		var revInfo *RevInfo
@@ -313,15 +316,15 @@
 			},
 		}
 	}
-	return r.convert(info, rev)
+	return r.convert(ctx, info, rev)
 }
 
-func (r *codeRepo) Latest() (*RevInfo, error) {
-	info, err := r.code.Latest()
+func (r *codeRepo) Latest(ctx context.Context) (*RevInfo, error) {
+	info, err := r.code.Latest(ctx)
 	if err != nil {
 		return nil, err
 	}
-	return r.convert(info, "")
+	return r.convert(ctx, info, "")
 }
 
 // convert converts a version as reported by the code host to a version as
@@ -329,7 +332,7 @@
 //
 // If statVers is a valid module version, it is used for the Version field.
 // Otherwise, the Version is derived from the passed-in info and recent tags.
-func (r *codeRepo) convert(info *codehost.RevInfo, statVers string) (*RevInfo, error) {
+func (r *codeRepo) convert(ctx context.Context, info *codehost.RevInfo, statVers string) (*RevInfo, error) {
 	// If this is a plain tag (no dir/ prefix)
 	// and the module path is unversioned,
 	// and if the underlying file tree has no go.mod,
@@ -349,7 +352,7 @@
 
 		ok, seen := incompatibleOk[""]
 		if !seen {
-			_, errGoMod := r.code.ReadFile(info.Name, "go.mod", codehost.MaxGoMod)
+			_, errGoMod := r.code.ReadFile(ctx, info.Name, "go.mod", codehost.MaxGoMod)
 			ok = (errGoMod != nil)
 			incompatibleOk[""] = ok
 		}
@@ -367,7 +370,7 @@
 			major := semver.Major(v)
 			ok, seen = incompatibleOk[major]
 			if !seen {
-				_, errGoModSub := r.code.ReadFile(info.Name, path.Join(major, "go.mod"), codehost.MaxGoMod)
+				_, errGoModSub := r.code.ReadFile(ctx, info.Name, path.Join(major, "go.mod"), codehost.MaxGoMod)
 				ok = (errGoModSub != nil)
 				incompatibleOk[major] = ok
 			}
@@ -395,7 +398,7 @@
 		// r.findDir verifies both of these conditions. Execute it now so that
 		// r.Stat will correctly return a notExistError if the go.mod location or
 		// declared module path doesn't match.
-		_, _, _, err := r.findDir(v)
+		_, _, _, err := r.findDir(ctx, v)
 		if err != nil {
 			// TODO: It would be nice to return an error like "not a module".
 			// Right now we return "missing go.mod", which is a little confusing.
@@ -474,7 +477,7 @@
 				if r.pathMajor != "" { // "/v2" or "/.v2"
 					prefix += r.pathMajor[1:] + "." // += "v2."
 				}
-				tags, err := r.code.Tags(prefix)
+				tags, err := r.code.Tags(ctx, prefix)
 				if err != nil {
 					return nil, err
 				}
@@ -495,7 +498,7 @@
 	// Determine version.
 
 	if module.IsPseudoVersion(statVers) {
-		if err := r.validatePseudoVersion(info, statVers); err != nil {
+		if err := r.validatePseudoVersion(ctx, info, statVers); err != nil {
 			return nil, err
 		}
 		return checkCanonical(statVers)
@@ -512,7 +515,7 @@
 		tagPrefix = r.codeDir + "/"
 	}
 
-	isRetracted, err := r.retractedVersions()
+	isRetracted, err := r.retractedVersions(ctx)
 	if err != nil {
 		isRetracted = func(string) bool { return false }
 	}
@@ -607,8 +610,8 @@
 		return !isRetracted(v)
 	}
 	if pseudoBase == "" {
-		tag, err := r.code.RecentTag(info.Name, tagPrefix, tagAllowed)
-		if err != nil && !errors.Is(err, codehost.ErrUnsupported) {
+		tag, err := r.code.RecentTag(ctx, info.Name, tagPrefix, tagAllowed)
+		if err != nil && !errors.Is(err, errors.ErrUnsupported) {
 			return nil, err
 		}
 		if tag != "" {
@@ -628,7 +631,7 @@
 // enough of the commit history to find a path between version and its base.
 // Fortunately, many pseudo-versions — such as those for untagged repositories —
 // have trivial bases!
-func (r *codeRepo) validatePseudoVersion(info *codehost.RevInfo, version string) (err error) {
+func (r *codeRepo) validatePseudoVersion(ctx context.Context, info *codehost.RevInfo, version string) (err error) {
 	defer func() {
 		if err != nil {
 			if _, ok := err.(*module.ModuleError); !ok {
@@ -715,7 +718,7 @@
 		}
 	}
 
-	tags, err := r.code.Tags(tagPrefix + base)
+	tags, err := r.code.Tags(ctx, tagPrefix+base)
 	if err != nil {
 		return err
 	}
@@ -726,7 +729,7 @@
 		versionOnly := strings.TrimPrefix(tag.Name, tagPrefix)
 		if semver.Compare(versionOnly, base) == 0 {
 			lastTag = tag.Name
-			ancestorFound, err = r.code.DescendsFrom(info.Name, tag.Name)
+			ancestorFound, err = r.code.DescendsFrom(ctx, info.Name, tag.Name)
 			if ancestorFound {
 				break
 			}
@@ -784,7 +787,7 @@
 //
 // If r.pathMajor is non-empty, this can be either r.codeDir or — if a go.mod
 // file exists — r.codeDir/r.pathMajor[1:].
-func (r *codeRepo) findDir(version string) (rev, dir string, gomod []byte, err error) {
+func (r *codeRepo) findDir(ctx context.Context, version string) (rev, dir string, gomod []byte, err error) {
 	rev, err = r.versionToRev(version)
 	if err != nil {
 		return "", "", nil, err
@@ -793,7 +796,7 @@
 	// Load info about go.mod but delay consideration
 	// (except I/O error) until we rule out v2/go.mod.
 	file1 := path.Join(r.codeDir, "go.mod")
-	gomod1, err1 := r.code.ReadFile(rev, file1, codehost.MaxGoMod)
+	gomod1, err1 := r.code.ReadFile(ctx, rev, file1, codehost.MaxGoMod)
 	if err1 != nil && !os.IsNotExist(err1) {
 		return "", "", nil, fmt.Errorf("reading %s/%s at revision %s: %v", r.codeRoot, file1, rev, err1)
 	}
@@ -811,7 +814,7 @@
 		// a replace directive.
 		dir2 := path.Join(r.codeDir, r.pathMajor[1:])
 		file2 = path.Join(dir2, "go.mod")
-		gomod2, err2 := r.code.ReadFile(rev, file2, codehost.MaxGoMod)
+		gomod2, err2 := r.code.ReadFile(ctx, rev, file2, codehost.MaxGoMod)
 		if err2 != nil && !os.IsNotExist(err2) {
 			return "", "", nil, fmt.Errorf("reading %s/%s at revision %s: %v", r.codeRoot, file2, rev, err2)
 		}
@@ -918,7 +921,7 @@
 	return unversioned && replacingGopkgIn
 }
 
-func (r *codeRepo) GoMod(version string) (data []byte, err error) {
+func (r *codeRepo) GoMod(ctx context.Context, version string) (data []byte, err error) {
 	if version != module.CanonicalVersion(version) {
 		return nil, fmt.Errorf("version %s is not canonical", version)
 	}
@@ -928,20 +931,20 @@
 		// only using the revision at the end.
 		// Invoke Stat to verify the metadata explicitly so we don't return
 		// a bogus file for an invalid version.
-		_, err := r.Stat(version)
+		_, err := r.Stat(ctx, version)
 		if err != nil {
 			return nil, err
 		}
 	}
 
-	rev, dir, gomod, err := r.findDir(version)
+	rev, dir, gomod, err := r.findDir(ctx, version)
 	if err != nil {
 		return nil, err
 	}
 	if gomod != nil {
 		return gomod, nil
 	}
-	data, err = r.code.ReadFile(rev, path.Join(dir, "go.mod"), codehost.MaxGoMod)
+	data, err = r.code.ReadFile(ctx, rev, path.Join(dir, "go.mod"), codehost.MaxGoMod)
 	if err != nil {
 		if os.IsNotExist(err) {
 			return LegacyGoMod(r.modPath), nil
@@ -969,8 +972,8 @@
 	return r.modPath + "@" + rev
 }
 
-func (r *codeRepo) retractedVersions() (func(string) bool, error) {
-	vs, err := r.Versions("")
+func (r *codeRepo) retractedVersions(ctx context.Context) (func(string) bool, error) {
+	vs, err := r.Versions(ctx, "")
 	if err != nil {
 		return nil, err
 	}
@@ -1002,7 +1005,7 @@
 		highest = versions[len(versions)-1]
 	}
 
-	data, err := r.GoMod(highest)
+	data, err := r.GoMod(ctx, highest)
 	if err != nil {
 		return nil, err
 	}
@@ -1010,7 +1013,7 @@
 	if err != nil {
 		return nil, err
 	}
-	retractions := make([]modfile.VersionInterval, len(f.Retract))
+	retractions := make([]modfile.VersionInterval, 0, len(f.Retract))
 	for _, r := range f.Retract {
 		retractions = append(retractions, r.VersionInterval)
 	}
@@ -1025,7 +1028,7 @@
 	}, nil
 }
 
-func (r *codeRepo) Zip(dst io.Writer, version string) error {
+func (r *codeRepo) Zip(ctx context.Context, dst io.Writer, version string) error {
 	if version != module.CanonicalVersion(version) {
 		return fmt.Errorf("version %s is not canonical", version)
 	}
@@ -1035,17 +1038,27 @@
 		// only using the revision at the end.
 		// Invoke Stat to verify the metadata explicitly so we don't return
 		// a bogus file for an invalid version.
-		_, err := r.Stat(version)
+		_, err := r.Stat(ctx, version)
 		if err != nil {
 			return err
 		}
 	}
 
-	rev, subdir, _, err := r.findDir(version)
+	rev, subdir, _, err := r.findDir(ctx, version)
 	if err != nil {
 		return err
 	}
-	dl, err := r.code.ReadZip(rev, subdir, codehost.MaxZipFile)
+
+	if gomod, err := r.code.ReadFile(ctx, rev, filepath.Join(subdir, "go.mod"), codehost.MaxGoMod); err == nil {
+		goVers := gover.GoModLookup(gomod, "go")
+		if gover.Compare(goVers, gover.Local()) > 0 {
+			return &gover.TooNewError{What: r.ModulePath() + "@" + version, GoVersion: goVers}
+		}
+	} else if !errors.Is(err, fs.ErrNotExist) {
+		return err
+	}
+
+	dl, err := r.code.ReadZip(ctx, rev, subdir, codehost.MaxZipFile)
 	if err != nil {
 		return err
 	}
@@ -1115,7 +1128,7 @@
 	}
 
 	if !haveLICENSE && subdir != "" {
-		data, err := r.code.ReadFile(rev, "LICENSE", codehost.MaxLICENSE)
+		data, err := r.code.ReadFile(ctx, rev, "LICENSE", codehost.MaxLICENSE)
 		if err == nil {
 			files = append(files, dataFile{name: "LICENSE", data: data})
 		}
@@ -1155,6 +1168,10 @@
 func (fi dataFileInfo) IsDir() bool        { return false }
 func (fi dataFileInfo) Sys() any           { return nil }
 
+func (fi dataFileInfo) String() string {
+	return fs.FormatFileInfo(fi)
+}
+
 // hasPathPrefix reports whether the path s begins with the
 // elements in prefix.
 func hasPathPrefix(s, prefix string) bool {
diff --git a/src/cmd/go/internal/modfetch/coderepo_test.go b/src/cmd/go/internal/modfetch/coderepo_test.go
index 8ccd9b2..aad7872 100644
--- a/src/cmd/go/internal/modfetch/coderepo_test.go
+++ b/src/cmd/go/internal/modfetch/coderepo_test.go
@@ -6,6 +6,7 @@
 
 import (
 	"archive/zip"
+	"context"
 	"crypto/sha256"
 	"encoding/hex"
 	"flag"
@@ -600,8 +601,9 @@
 				if tt.vcs != "mod" {
 					testenv.MustHaveExecPath(t, tt.vcs)
 				}
+				ctx := context.Background()
 
-				repo := Lookup("direct", tt.path)
+				repo := Lookup(ctx, "direct", tt.path)
 
 				if tt.mpath == "" {
 					tt.mpath = tt.path
@@ -610,7 +612,7 @@
 					t.Errorf("repo.ModulePath() = %q, want %q", mpath, tt.mpath)
 				}
 
-				info, err := repo.Stat(tt.rev)
+				info, err := repo.Stat(ctx, tt.rev)
 				if err != nil {
 					if tt.err != "" {
 						if !strings.Contains(err.Error(), tt.err) {
@@ -637,7 +639,7 @@
 				}
 
 				if tt.gomod != "" || tt.gomodErr != "" {
-					data, err := repo.GoMod(tt.version)
+					data, err := repo.GoMod(ctx, tt.version)
 					if err != nil && tt.gomodErr == "" {
 						t.Errorf("repo.GoMod(%q): %v", tt.version, err)
 					} else if err != nil && tt.gomodErr != "" {
@@ -671,7 +673,7 @@
 					} else {
 						w = f
 					}
-					err = repo.Zip(w, tt.version)
+					err = repo.Zip(ctx, w, tt.version)
 					f.Close()
 					if err != nil {
 						if tt.zipErr != "" {
@@ -816,36 +818,29 @@
 func TestCodeRepoVersions(t *testing.T) {
 	testenv.MustHaveExternalNetwork(t)
 
-	tmpdir, err := os.MkdirTemp("", "vgo-modfetch-test-")
-	if err != nil {
-		t.Fatal(err)
+	for _, tt := range codeRepoVersionsTests {
+		tt := tt
+		t.Run(strings.ReplaceAll(tt.path, "/", "_"), func(t *testing.T) {
+			if strings.Contains(tt.path, "gopkg.in") {
+				testenv.SkipFlaky(t, 54503)
+			}
+
+			t.Parallel()
+			if tt.vcs != "mod" {
+				testenv.MustHaveExecPath(t, tt.vcs)
+			}
+			ctx := context.Background()
+
+			repo := Lookup(ctx, "direct", tt.path)
+			list, err := repo.Versions(ctx, tt.prefix)
+			if err != nil {
+				t.Fatalf("Versions(%q): %v", tt.prefix, err)
+			}
+			if !reflect.DeepEqual(list.List, tt.versions) {
+				t.Fatalf("Versions(%q):\nhave %v\nwant %v", tt.prefix, list, tt.versions)
+			}
+		})
 	}
-	defer os.RemoveAll(tmpdir)
-
-	t.Run("parallel", func(t *testing.T) {
-		for _, tt := range codeRepoVersionsTests {
-			tt := tt
-			t.Run(strings.ReplaceAll(tt.path, "/", "_"), func(t *testing.T) {
-				if strings.Contains(tt.path, "gopkg.in") {
-					testenv.SkipFlaky(t, 54503)
-				}
-
-				t.Parallel()
-				if tt.vcs != "mod" {
-					testenv.MustHaveExecPath(t, tt.vcs)
-				}
-
-				repo := Lookup("direct", tt.path)
-				list, err := repo.Versions(tt.prefix)
-				if err != nil {
-					t.Fatalf("Versions(%q): %v", tt.prefix, err)
-				}
-				if !reflect.DeepEqual(list.List, tt.versions) {
-					t.Fatalf("Versions(%q):\nhave %v\nwant %v", tt.prefix, list, tt.versions)
-				}
-			})
-		}
-	})
 }
 
 var latestTests = []struct {
@@ -894,42 +889,35 @@
 func TestLatest(t *testing.T) {
 	testenv.MustHaveExternalNetwork(t)
 
-	tmpdir, err := os.MkdirTemp("", "vgo-modfetch-test-")
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer os.RemoveAll(tmpdir)
+	for _, tt := range latestTests {
+		name := strings.ReplaceAll(tt.path, "/", "_")
+		t.Run(name, func(t *testing.T) {
+			tt := tt
+			t.Parallel()
+			if tt.vcs != "mod" {
+				testenv.MustHaveExecPath(t, tt.vcs)
+			}
+			ctx := context.Background()
 
-	t.Run("parallel", func(t *testing.T) {
-		for _, tt := range latestTests {
-			name := strings.ReplaceAll(tt.path, "/", "_")
-			t.Run(name, func(t *testing.T) {
-				tt := tt
-				t.Parallel()
-				if tt.vcs != "mod" {
-					testenv.MustHaveExecPath(t, tt.vcs)
-				}
-
-				repo := Lookup("direct", tt.path)
-				info, err := repo.Latest()
-				if err != nil {
-					if tt.err != "" {
-						if err.Error() == tt.err {
-							return
-						}
-						t.Fatalf("Latest(): %v, want %q", err, tt.err)
-					}
-					t.Fatalf("Latest(): %v", err)
-				}
+			repo := Lookup(ctx, "direct", tt.path)
+			info, err := repo.Latest(ctx)
+			if err != nil {
 				if tt.err != "" {
-					t.Fatalf("Latest() = %v, want error %q", info.Version, tt.err)
+					if err.Error() == tt.err {
+						return
+					}
+					t.Fatalf("Latest(): %v, want %q", err, tt.err)
 				}
-				if info.Version != tt.version {
-					t.Fatalf("Latest() = %v, want %v", info.Version, tt.version)
-				}
-			})
-		}
-	})
+				t.Fatalf("Latest(): %v", err)
+			}
+			if tt.err != "" {
+				t.Fatalf("Latest() = %v, want error %q", info.Version, tt.err)
+			}
+			if info.Version != tt.version {
+				t.Fatalf("Latest() = %v, want %v", info.Version, tt.version)
+			}
+		})
+	}
 }
 
 // fixedTagsRepo is a fake codehost.Repo that returns a fixed list of tags
@@ -938,7 +926,7 @@
 	codehost.Repo
 }
 
-func (ch *fixedTagsRepo) Tags(string) (*codehost.Tags, error) {
+func (ch *fixedTagsRepo) Tags(ctx context.Context, prefix string) (*codehost.Tags, error) {
 	tags := &codehost.Tags{}
 	for _, t := range ch.tags {
 		tags.List = append(tags.List, codehost.Tag{Name: t})
@@ -947,6 +935,9 @@
 }
 
 func TestNonCanonicalSemver(t *testing.T) {
+	t.Parallel()
+	ctx := context.Background()
+
 	root := "golang.org/x/issue24476"
 	ch := &fixedTagsRepo{
 		tags: []string{
@@ -964,7 +955,7 @@
 		t.Fatal(err)
 	}
 
-	v, err := cr.Versions("")
+	v, err := cr.Versions(ctx, "")
 	if err != nil {
 		t.Fatal(err)
 	}
diff --git a/src/cmd/go/internal/modfetch/fetch.go b/src/cmd/go/internal/modfetch/fetch.go
index dfe5da6..4279686 100644
--- a/src/cmd/go/internal/modfetch/fetch.go
+++ b/src/cmd/go/internal/modfetch/fetch.go
@@ -23,6 +23,7 @@
 	"cmd/go/internal/base"
 	"cmd/go/internal/cfg"
 	"cmd/go/internal/fsys"
+	"cmd/go/internal/gover"
 	"cmd/go/internal/lockedfile"
 	"cmd/go/internal/par"
 	"cmd/go/internal/robustio"
@@ -34,37 +35,48 @@
 	modzip "golang.org/x/mod/zip"
 )
 
-var downloadCache par.Cache
+var downloadCache par.ErrCache[module.Version, string] // version → directory
+
+var ErrToolchain = errors.New("internal error: invalid operation on toolchain module")
 
 // Download downloads the specific module version to the
 // local download cache and returns the name of the directory
 // corresponding to the root of the module's file tree.
 func Download(ctx context.Context, mod module.Version) (dir string, err error) {
-	if err := checkCacheDir(); err != nil {
-		base.Fatalf("go: %v", err)
+	if gover.IsToolchain(mod.Path) {
+		return "", ErrToolchain
+	}
+	if err := checkCacheDir(ctx); err != nil {
+		base.Fatal(err)
 	}
 
 	// The par.Cache here avoids duplicate work.
-	type cached struct {
-		dir string
-		err error
-	}
-	c := downloadCache.Do(mod, func() any {
+	return downloadCache.Do(mod, func() (string, error) {
 		dir, err := download(ctx, mod)
 		if err != nil {
-			return cached{"", err}
+			return "", err
 		}
-		checkMod(mod)
-		return cached{dir, nil}
-	}).(cached)
-	return c.dir, c.err
+		checkMod(ctx, mod)
+
+		// If go.mod exists (not an old legacy module), check version is not too new.
+		if data, err := os.ReadFile(filepath.Join(dir, "go.mod")); err == nil {
+			goVersion := gover.GoModLookup(data, "go")
+			if gover.Compare(goVersion, gover.Local()) > 0 {
+				return "", &gover.TooNewError{What: mod.String(), GoVersion: goVersion}
+			}
+		} else if !errors.Is(err, fs.ErrNotExist) {
+			return "", err
+		}
+
+		return dir, nil
+	})
 }
 
 func download(ctx context.Context, mod module.Version) (dir string, err error) {
 	ctx, span := trace.StartSpan(ctx, "modfetch.download "+mod.String())
 	defer span.Done()
 
-	dir, err = DownloadDir(mod)
+	dir, err = DownloadDir(ctx, mod)
 	if err == nil {
 		// The directory has already been completely extracted (no .partial file exists).
 		return dir, nil
@@ -80,7 +92,7 @@
 		return "", err
 	}
 
-	unlock, err := lockVersion(mod)
+	unlock, err := lockVersion(ctx, mod)
 	if err != nil {
 		return "", err
 	}
@@ -90,7 +102,7 @@
 	defer span.Done()
 
 	// Check whether the directory was populated while we were waiting on the lock.
-	_, dirErr := DownloadDir(mod)
+	_, dirErr := DownloadDir(ctx, mod)
 	if dirErr == nil {
 		return dir, nil
 	}
@@ -114,7 +126,7 @@
 		}
 	}
 
-	partialPath, err := CachePath(mod, "partial")
+	partialPath, err := CachePath(ctx, mod, "partial")
 	if err != nil {
 		return "", err
 	}
@@ -156,46 +168,52 @@
 	return dir, nil
 }
 
-var downloadZipCache par.Cache
+var downloadZipCache par.ErrCache[module.Version, string]
 
 // DownloadZip downloads the specific module version to the
 // local zip cache and returns the name of the zip file.
 func DownloadZip(ctx context.Context, mod module.Version) (zipfile string, err error) {
 	// The par.Cache here avoids duplicate work.
-	type cached struct {
-		zipfile string
-		err     error
-	}
-	c := downloadZipCache.Do(mod, func() any {
-		zipfile, err := CachePath(mod, "zip")
+	return downloadZipCache.Do(mod, func() (string, error) {
+		zipfile, err := CachePath(ctx, mod, "zip")
 		if err != nil {
-			return cached{"", err}
+			return "", err
 		}
 		ziphashfile := zipfile + "hash"
 
 		// Return without locking if the zip and ziphash files exist.
 		if _, err := os.Stat(zipfile); err == nil {
 			if _, err := os.Stat(ziphashfile); err == nil {
-				return cached{zipfile, nil}
+				return zipfile, nil
 			}
 		}
 
 		// The zip or ziphash file does not exist. Acquire the lock and create them.
 		if cfg.CmdName != "mod download" {
-			fmt.Fprintf(os.Stderr, "go: downloading %s %s\n", mod.Path, mod.Version)
+			vers := mod.Version
+			if mod.Path == "golang.org/toolchain" {
+				// Shorten v0.0.1-go1.13.1.darwin-amd64 to go1.13.1.darwin-amd64
+				_, vers, _ = strings.Cut(vers, "-")
+				if i := strings.LastIndex(vers, "."); i >= 0 {
+					goos, goarch, _ := strings.Cut(vers[i+1:], "-")
+					vers = vers[:i] + " (" + goos + "/" + goarch + ")"
+				}
+				fmt.Fprintf(os.Stderr, "go: downloading %s\n", vers)
+			} else {
+				fmt.Fprintf(os.Stderr, "go: downloading %s %s\n", mod.Path, vers)
+			}
 		}
-		unlock, err := lockVersion(mod)
+		unlock, err := lockVersion(ctx, mod)
 		if err != nil {
-			return cached{"", err}
+			return "", err
 		}
 		defer unlock()
 
 		if err := downloadZip(ctx, mod, zipfile); err != nil {
-			return cached{"", err}
+			return "", err
 		}
-		return cached{zipfile, nil}
-	}).(cached)
-	return c.zipfile, c.err
+		return zipfile, nil
+	})
 }
 
 func downloadZip(ctx context.Context, mod module.Version, zipfile string) (err error) {
@@ -242,7 +260,7 @@
 	// contents of the file (by hashing it) before we commit it. Because the file
 	// is zip-compressed, we need an actual file — or at least an io.ReaderAt — to
 	// validate it: we can't just tee the stream as we write it.
-	f, err := tempFile(filepath.Dir(zipfile), filepath.Base(zipfile), 0666)
+	f, err := tempFile(ctx, filepath.Dir(zipfile), filepath.Base(zipfile), 0666)
 	if err != nil {
 		return err
 	}
@@ -258,8 +276,8 @@
 		if unrecoverableErr != nil {
 			return unrecoverableErr
 		}
-		repo := Lookup(proxy, mod.Path)
-		err := repo.Zip(f, mod.Version)
+		repo := Lookup(ctx, proxy, mod.Path)
+		err := repo.Zip(ctx, f, mod.Version)
 		if err != nil {
 			// Zip may have partially written to f before failing.
 			// (Perhaps the server crashed while sending the file?)
@@ -416,8 +434,8 @@
 	// Uses of lookupCache and downloadCache both can call checkModSum,
 	// which in turn sets the used bit on goSum.status for modules.
 	// Reset them so used can be computed properly.
-	lookupCache = par.Cache{}
-	downloadCache = par.Cache{}
+	lookupCache = par.Cache[lookupCacheKey, Repo]{}
+	downloadCache = par.ErrCache[module.Version, string]{}
 
 	// Clear all fields on goSum. It will be initialized later
 	goSum.mu.Lock()
@@ -547,10 +565,10 @@
 	return false
 }
 
-// checkMod checks the given module's checksum.
-func checkMod(mod module.Version) {
+// checkMod checks the given module's checksum and Go version.
+func checkMod(ctx context.Context, mod module.Version) {
 	// Do the file I/O before acquiring the go.sum lock.
-	ziphash, err := CachePath(mod, "ziphash")
+	ziphash, err := CachePath(ctx, mod, "ziphash")
 	if err != nil {
 		base.Fatalf("verifying %v", module.VersionError(mod, err))
 	}
@@ -561,7 +579,7 @@
 	data = bytes.TrimSpace(data)
 	if !isValidSum(data) {
 		// Recreate ziphash file from zip file and use that to check the mod sum.
-		zip, err := CachePath(mod, "zip")
+		zip, err := CachePath(ctx, mod, "zip")
 		if err != nil {
 			base.Fatalf("verifying %v", module.VersionError(mod, err))
 		}
@@ -723,13 +741,13 @@
 
 // Sum returns the checksum for the downloaded copy of the given module,
 // if present in the download cache.
-func Sum(mod module.Version) string {
+func Sum(ctx context.Context, mod module.Version) string {
 	if cfg.GOMODCACHE == "" {
 		// Do not use current directory.
 		return ""
 	}
 
-	ziphash, err := CachePath(mod, "ziphash")
+	ziphash, err := CachePath(ctx, mod, "ziphash")
 	if err != nil {
 		return ""
 	}
@@ -769,7 +787,7 @@
 // It should have entries for both module content sums and go.mod sums
 // (version ends with "/go.mod"). Existing sums will be preserved unless they
 // have been marked for deletion with TrimGoSum.
-func WriteGoSum(keep map[module.Version]bool, readonly bool) error {
+func WriteGoSum(ctx context.Context, keep map[module.Version]bool, readonly bool) error {
 	goSum.mu.Lock()
 	defer goSum.mu.Unlock()
 
@@ -804,7 +822,7 @@
 
 	// Make a best-effort attempt to acquire the side lock, only to exclude
 	// previous versions of the 'go' command from making simultaneous edits.
-	if unlock, err := SideLock(); err == nil {
+	if unlock, err := SideLock(ctx); err == nil {
 		defer unlock()
 	}
 
diff --git a/src/cmd/go/internal/modfetch/proxy.go b/src/cmd/go/internal/modfetch/proxy.go
index d237468..dd37ba9 100644
--- a/src/cmd/go/internal/modfetch/proxy.go
+++ b/src/cmd/go/internal/modfetch/proxy.go
@@ -5,6 +5,7 @@
 package modfetch
 
 import (
+	"context"
 	"encoding/json"
 	"errors"
 	"fmt"
@@ -227,7 +228,7 @@
 
 var errProxyReuse = fmt.Errorf("proxy does not support CheckReuse")
 
-func (p *proxyRepo) CheckReuse(old *codehost.Origin) error {
+func (p *proxyRepo) CheckReuse(ctx context.Context, old *codehost.Origin) error {
 	return errProxyReuse
 }
 
@@ -251,8 +252,8 @@
 	}
 }
 
-func (p *proxyRepo) getBytes(path string) ([]byte, error) {
-	body, err := p.getBody(path)
+func (p *proxyRepo) getBytes(ctx context.Context, path string) ([]byte, error) {
+	body, err := p.getBody(ctx, path)
 	if err != nil {
 		return nil, err
 	}
@@ -262,12 +263,12 @@
 	if err != nil {
 		// net/http doesn't add context to Body errors, so add it here.
 		// (See https://go.dev/issue/52727.)
-		return b, &url.Error{Op: "read", URL: pathpkg.Join(p.redactedURL, path), Err: err}
+		return b, &url.Error{Op: "read", URL: strings.TrimSuffix(p.redactedURL, "/") + "/" + path, Err: err}
 	}
 	return b, nil
 }
 
-func (p *proxyRepo) getBody(path string) (r io.ReadCloser, err error) {
+func (p *proxyRepo) getBody(ctx context.Context, path string) (r io.ReadCloser, err error) {
 	fullPath := pathpkg.Join(p.url.Path, path)
 
 	target := *p.url
@@ -285,8 +286,8 @@
 	return resp.Body, nil
 }
 
-func (p *proxyRepo) Versions(prefix string) (*Versions, error) {
-	data, err := p.getBytes("@v/list")
+func (p *proxyRepo) Versions(ctx context.Context, prefix string) (*Versions, error) {
+	data, err := p.getBytes(ctx, "@v/list")
 	if err != nil {
 		p.listLatestOnce.Do(func() {
 			p.listLatest, p.listLatestErr = nil, p.versionError("", err)
@@ -302,26 +303,26 @@
 		}
 	}
 	p.listLatestOnce.Do(func() {
-		p.listLatest, p.listLatestErr = p.latestFromList(allLine)
+		p.listLatest, p.listLatestErr = p.latestFromList(ctx, allLine)
 	})
 	semver.Sort(list)
 	return &Versions{List: list}, nil
 }
 
-func (p *proxyRepo) latest() (*RevInfo, error) {
+func (p *proxyRepo) latest(ctx context.Context) (*RevInfo, error) {
 	p.listLatestOnce.Do(func() {
-		data, err := p.getBytes("@v/list")
+		data, err := p.getBytes(ctx, "@v/list")
 		if err != nil {
 			p.listLatestErr = p.versionError("", err)
 			return
 		}
 		list := strings.Split(string(data), "\n")
-		p.listLatest, p.listLatestErr = p.latestFromList(list)
+		p.listLatest, p.listLatestErr = p.latestFromList(ctx, list)
 	})
 	return p.listLatest, p.listLatestErr
 }
 
-func (p *proxyRepo) latestFromList(allLine []string) (*RevInfo, error) {
+func (p *proxyRepo) latestFromList(ctx context.Context, allLine []string) (*RevInfo, error) {
 	var (
 		bestTime    time.Time
 		bestVersion string
@@ -355,15 +356,15 @@
 	}
 
 	// Call Stat to get all the other fields, including Origin information.
-	return p.Stat(bestVersion)
+	return p.Stat(ctx, bestVersion)
 }
 
-func (p *proxyRepo) Stat(rev string) (*RevInfo, error) {
+func (p *proxyRepo) Stat(ctx context.Context, rev string) (*RevInfo, error) {
 	encRev, err := module.EscapeVersion(rev)
 	if err != nil {
 		return nil, p.versionError(rev, err)
 	}
-	data, err := p.getBytes("@v/" + encRev + ".info")
+	data, err := p.getBytes(ctx, "@v/"+encRev+".info")
 	if err != nil {
 		return nil, p.versionError(rev, err)
 	}
@@ -380,13 +381,13 @@
 	return info, nil
 }
 
-func (p *proxyRepo) Latest() (*RevInfo, error) {
-	data, err := p.getBytes("@latest")
+func (p *proxyRepo) Latest(ctx context.Context) (*RevInfo, error) {
+	data, err := p.getBytes(ctx, "@latest")
 	if err != nil {
 		if !errors.Is(err, fs.ErrNotExist) {
 			return nil, p.versionError("", err)
 		}
-		return p.latest()
+		return p.latest(ctx)
 	}
 	info := new(RevInfo)
 	if err := json.Unmarshal(data, info); err != nil {
@@ -395,7 +396,7 @@
 	return info, nil
 }
 
-func (p *proxyRepo) GoMod(version string) ([]byte, error) {
+func (p *proxyRepo) GoMod(ctx context.Context, version string) ([]byte, error) {
 	if version != module.CanonicalVersion(version) {
 		return nil, p.versionError(version, fmt.Errorf("internal error: version passed to GoMod is not canonical"))
 	}
@@ -404,14 +405,14 @@
 	if err != nil {
 		return nil, p.versionError(version, err)
 	}
-	data, err := p.getBytes("@v/" + encVer + ".mod")
+	data, err := p.getBytes(ctx, "@v/"+encVer+".mod")
 	if err != nil {
 		return nil, p.versionError(version, err)
 	}
 	return data, nil
 }
 
-func (p *proxyRepo) Zip(dst io.Writer, version string) error {
+func (p *proxyRepo) Zip(ctx context.Context, dst io.Writer, version string) error {
 	if version != module.CanonicalVersion(version) {
 		return p.versionError(version, fmt.Errorf("internal error: version passed to Zip is not canonical"))
 	}
@@ -421,7 +422,7 @@
 		return p.versionError(version, err)
 	}
 	path := "@v/" + encVer + ".zip"
-	body, err := p.getBody(path)
+	body, err := p.getBody(ctx, path)
 	if err != nil {
 		return p.versionError(version, err)
 	}
diff --git a/src/cmd/go/internal/modfetch/repo.go b/src/cmd/go/internal/modfetch/repo.go
index d4c57bb..25fb02d 100644
--- a/src/cmd/go/internal/modfetch/repo.go
+++ b/src/cmd/go/internal/modfetch/repo.go
@@ -5,6 +5,7 @@
 package modfetch
 
 import (
+	"context"
 	"fmt"
 	"io"
 	"io/fs"
@@ -33,7 +34,7 @@
 	// are still satisfied on the server corresponding to this module.
 	// If so, the caller can reuse any cached Versions or RevInfo containing
 	// this origin rather than redownloading those from the server.
-	CheckReuse(old *codehost.Origin) error
+	CheckReuse(ctx context.Context, old *codehost.Origin) error
 
 	// Versions lists all known versions with the given prefix.
 	// Pseudo-versions are not included.
@@ -48,23 +49,23 @@
 	//
 	// If the underlying repository does not exist,
 	// Versions returns an error matching errors.Is(_, os.NotExist).
-	Versions(prefix string) (*Versions, error)
+	Versions(ctx context.Context, prefix string) (*Versions, error)
 
 	// Stat returns information about the revision rev.
 	// A revision can be any identifier known to the underlying service:
 	// commit hash, branch, tag, and so on.
-	Stat(rev string) (*RevInfo, error)
+	Stat(ctx context.Context, rev string) (*RevInfo, error)
 
 	// Latest returns the latest revision on the default branch,
 	// whatever that means in the underlying source code repository.
 	// It is only used when there are no tagged versions.
-	Latest() (*RevInfo, error)
+	Latest(ctx context.Context) (*RevInfo, error)
 
 	// GoMod returns the go.mod file for the given version.
-	GoMod(version string) (data []byte, err error)
+	GoMod(ctx context.Context, version string) (data []byte, err error)
 
 	// Zip writes a zip file for the given version to dst.
-	Zip(dst io.Writer, version string) error
+	Zip(ctx context.Context, dst io.Writer, version string) error
 }
 
 // A Versions describes the available versions in a module repository.
@@ -185,7 +186,7 @@
 // To avoid version control access except when absolutely necessary,
 // Lookup does not attempt to connect to the repository itself.
 
-var lookupCache par.Cache
+var lookupCache par.Cache[lookupCacheKey, Repo]
 
 type lookupCacheKey struct {
 	proxy, path string
@@ -203,38 +204,37 @@
 //
 // A successful return does not guarantee that the module
 // has any defined versions.
-func Lookup(proxy, path string) Repo {
+func Lookup(ctx context.Context, proxy, path string) Repo {
 	if traceRepo {
 		defer logCall("Lookup(%q, %q)", proxy, path)()
 	}
 
-	type cached struct {
-		r Repo
-	}
-	c := lookupCache.Do(lookupCacheKey{proxy, path}, func() any {
-		r := newCachingRepo(path, func() (Repo, error) {
-			r, err := lookup(proxy, path)
+	return lookupCache.Do(lookupCacheKey{proxy, path}, func() Repo {
+		return newCachingRepo(ctx, path, func(ctx context.Context) (Repo, error) {
+			r, err := lookup(ctx, proxy, path)
 			if err == nil && traceRepo {
 				r = newLoggingRepo(r)
 			}
 			return r, err
 		})
-		return cached{r}
-	}).(cached)
-
-	return c.r
+	})
 }
 
 // lookup returns the module with the given module path.
-func lookup(proxy, path string) (r Repo, err error) {
+func lookup(ctx context.Context, proxy, path string) (r Repo, err error) {
 	if cfg.BuildMod == "vendor" {
 		return nil, errLookupDisabled
 	}
 
+	switch path {
+	case "go", "toolchain":
+		return &toolchainRepo{path, Lookup(ctx, proxy, "golang.org/toolchain")}, nil
+	}
+
 	if module.MatchPrefixPatterns(cfg.GONOPROXY, path) {
 		switch proxy {
 		case "noproxy", "direct":
-			return lookupDirect(path)
+			return lookupDirect(ctx, path)
 		default:
 			return nil, errNoproxy
 		}
@@ -244,7 +244,7 @@
 	case "off":
 		return errRepo{path, errProxyOff}, nil
 	case "direct":
-		return lookupDirect(path)
+		return lookupDirect(ctx, path)
 	case "noproxy":
 		return nil, errUseProxy
 	default:
@@ -269,7 +269,7 @@
 	errUseProxy error = notExistErrorf("path does not match GOPRIVATE/GONOPROXY")
 )
 
-func lookupDirect(path string) (Repo, error) {
+func lookupDirect(ctx context.Context, path string) (Repo, error) {
 	security := web.SecureOnly
 
 	if module.MatchPrefixPatterns(cfg.GOINSECURE, path) {
@@ -286,15 +286,15 @@
 		return newProxyRepo(rr.Repo, path)
 	}
 
-	code, err := lookupCodeRepo(rr)
+	code, err := lookupCodeRepo(ctx, rr)
 	if err != nil {
 		return nil, err
 	}
 	return newCodeRepo(code, rr.Root, path)
 }
 
-func lookupCodeRepo(rr *vcs.RepoRoot) (codehost.Repo, error) {
-	code, err := codehost.NewRepo(rr.VCS.Cmd, rr.Repo)
+func lookupCodeRepo(ctx context.Context, rr *vcs.RepoRoot) (codehost.Repo, error) {
+	code, err := codehost.NewRepo(ctx, rr.VCS.Cmd, rr.Repo)
 	if err != nil {
 		if _, ok := err.(*codehost.VCSError); ok {
 			return nil, err
@@ -335,40 +335,40 @@
 	return l.r.ModulePath()
 }
 
-func (l *loggingRepo) CheckReuse(old *codehost.Origin) (err error) {
+func (l *loggingRepo) CheckReuse(ctx context.Context, old *codehost.Origin) (err error) {
 	defer func() {
 		logCall("CheckReuse[%s]: %v", l.r.ModulePath(), err)
 	}()
-	return l.r.CheckReuse(old)
+	return l.r.CheckReuse(ctx, old)
 }
 
-func (l *loggingRepo) Versions(prefix string) (*Versions, error) {
+func (l *loggingRepo) Versions(ctx context.Context, prefix string) (*Versions, error) {
 	defer logCall("Repo[%s]: Versions(%q)", l.r.ModulePath(), prefix)()
-	return l.r.Versions(prefix)
+	return l.r.Versions(ctx, prefix)
 }
 
-func (l *loggingRepo) Stat(rev string) (*RevInfo, error) {
+func (l *loggingRepo) Stat(ctx context.Context, rev string) (*RevInfo, error) {
 	defer logCall("Repo[%s]: Stat(%q)", l.r.ModulePath(), rev)()
-	return l.r.Stat(rev)
+	return l.r.Stat(ctx, rev)
 }
 
-func (l *loggingRepo) Latest() (*RevInfo, error) {
+func (l *loggingRepo) Latest(ctx context.Context) (*RevInfo, error) {
 	defer logCall("Repo[%s]: Latest()", l.r.ModulePath())()
-	return l.r.Latest()
+	return l.r.Latest(ctx)
 }
 
-func (l *loggingRepo) GoMod(version string) ([]byte, error) {
+func (l *loggingRepo) GoMod(ctx context.Context, version string) ([]byte, error) {
 	defer logCall("Repo[%s]: GoMod(%q)", l.r.ModulePath(), version)()
-	return l.r.GoMod(version)
+	return l.r.GoMod(ctx, version)
 }
 
-func (l *loggingRepo) Zip(dst io.Writer, version string) error {
+func (l *loggingRepo) Zip(ctx context.Context, dst io.Writer, version string) error {
 	dstName := "_"
 	if dst, ok := dst.(interface{ Name() string }); ok {
 		dstName = strconv.Quote(dst.Name())
 	}
 	defer logCall("Repo[%s]: Zip(%s, %q)", l.r.ModulePath(), dstName, version)()
-	return l.r.Zip(dst, version)
+	return l.r.Zip(ctx, dst, version)
 }
 
 // errRepo is a Repo that returns the same error for all operations.
@@ -382,12 +382,12 @@
 
 func (r errRepo) ModulePath() string { return r.modulePath }
 
-func (r errRepo) CheckReuse(old *codehost.Origin) error     { return r.err }
-func (r errRepo) Versions(prefix string) (*Versions, error) { return nil, r.err }
-func (r errRepo) Stat(rev string) (*RevInfo, error)         { return nil, r.err }
-func (r errRepo) Latest() (*RevInfo, error)                 { return nil, r.err }
-func (r errRepo) GoMod(version string) ([]byte, error)      { return nil, r.err }
-func (r errRepo) Zip(dst io.Writer, version string) error   { return r.err }
+func (r errRepo) CheckReuse(ctx context.Context, old *codehost.Origin) error     { return r.err }
+func (r errRepo) Versions(ctx context.Context, prefix string) (*Versions, error) { return nil, r.err }
+func (r errRepo) Stat(ctx context.Context, rev string) (*RevInfo, error)         { return nil, r.err }
+func (r errRepo) Latest(ctx context.Context) (*RevInfo, error)                   { return nil, r.err }
+func (r errRepo) GoMod(ctx context.Context, version string) ([]byte, error)      { return nil, r.err }
+func (r errRepo) Zip(ctx context.Context, dst io.Writer, version string) error   { return r.err }
 
 // A notExistError is like fs.ErrNotExist, but with a custom message
 type notExistError struct {
diff --git a/src/cmd/go/internal/modfetch/sumdb.go b/src/cmd/go/internal/modfetch/sumdb.go
index 492b03b..ea7d561 100644
--- a/src/cmd/go/internal/modfetch/sumdb.go
+++ b/src/cmd/go/internal/modfetch/sumdb.go
@@ -33,6 +33,36 @@
 
 // useSumDB reports whether to use the Go checksum database for the given module.
 func useSumDB(mod module.Version) bool {
+	if mod.Path == "golang.org/toolchain" {
+		must := true
+		// Downloaded toolchains cannot be listed in go.sum,
+		// so we require checksum database lookups even if
+		// GOSUMDB=off or GONOSUMDB matches the pattern.
+		// If GOSUMDB=off, then the eventual lookup will fail
+		// with a good error message.
+
+		// Exception #1: using GOPROXY=file:// to test a distpack.
+		if strings.HasPrefix(cfg.GOPROXY, "file://") && !strings.ContainsAny(cfg.GOPROXY, ",|") {
+			must = false
+		}
+		// Exception #2: the Go proxy+checksum database cannot check itself
+		// while doing the initial download.
+		if strings.Contains(os.Getenv("GIT_HTTP_USER_AGENT"), "proxy.golang.org") {
+			must = false
+		}
+
+		// Another potential exception would be GOPROXY=direct,
+		// but that would make toolchain downloads only as secure
+		// as HTTPS, and in particular they'd be susceptible to MITM
+		// attacks on systems with less-than-trustworthy root certificates.
+		// The checksum database provides a stronger guarantee,
+		// so we don't make that exception.
+
+		// Otherwise, require the checksum database.
+		if must {
+			return true
+		}
+	}
 	return cfg.GOSUMDB != "off" && !module.MatchPrefixPatterns(cfg.GONOSUMDB, mod.Path)
 }
 
@@ -70,6 +100,10 @@
 		gosumdb = "sum.golang.org https://sum.golang.google.cn"
 	}
 
+	if gosumdb == "off" {
+		return "", nil, fmt.Errorf("checksum database disabled by GOSUMDB=off")
+	}
+
 	key := strings.Fields(gosumdb)
 	if len(key) >= 1 {
 		if k := knownGOSUMDB[key[0]]; k != "" {
diff --git a/src/cmd/go/internal/modfetch/toolchain.go b/src/cmd/go/internal/modfetch/toolchain.go
new file mode 100644
index 0000000..0d7cfcf
--- /dev/null
+++ b/src/cmd/go/internal/modfetch/toolchain.go
@@ -0,0 +1,181 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package modfetch
+
+import (
+	"context"
+	"fmt"
+	"io"
+	"sort"
+	"strings"
+
+	"cmd/go/internal/gover"
+	"cmd/go/internal/modfetch/codehost"
+)
+
+// A toolchainRepo is a synthesized repository reporting Go toolchain versions.
+// It has path "go" or "toolchain". The "go" repo reports versions like "1.2".
+// The "toolchain" repo reports versions like "go1.2".
+//
+// Note that the repo ONLY reports versions. It does not actually support
+// downloading of the actual toolchains. Instead, that is done using
+// the regular repo code with "golang.org/toolchain".
+// The naming conflict is unfortunate: "golang.org/toolchain"
+// should perhaps have been "go.dev/dl", but it's too late.
+//
+// For clarity, this file refers to golang.org/toolchain as the "DL" repo,
+// the one you can actually download.
+type toolchainRepo struct {
+	path string // either "go" or "toolchain"
+	repo Repo   // underlying DL repo
+}
+
+func (r *toolchainRepo) ModulePath() string {
+	return r.path
+}
+
+func (r *toolchainRepo) Versions(ctx context.Context, prefix string) (*Versions, error) {
+	// Read DL repo list and convert to "go" or "toolchain" version list.
+	versions, err := r.repo.Versions(ctx, "")
+	if err != nil {
+		return nil, err
+	}
+	versions.Origin = nil
+	var list []string
+	have := make(map[string]bool)
+	goPrefix := ""
+	if r.path == "toolchain" {
+		goPrefix = "go"
+	}
+	for _, v := range versions.List {
+		v, ok := dlToGo(v)
+		if !ok {
+			continue
+		}
+		if !have[v] {
+			have[v] = true
+			list = append(list, goPrefix+v)
+		}
+	}
+
+	// Always include our own version.
+	// This means that the development branch of Go 1.21 (say) will allow 'go get go@1.21'
+	// even though there are no Go 1.21 releases yet.
+	// Once there is a release, 1.21 will be treated as a query matching the latest available release.
+	// Before then, 1.21 will be treated as a query that resolves to this entry we are adding (1.21).
+	if v := gover.Local(); !have[v] {
+		list = append(list, goPrefix+v)
+	}
+
+	if r.path == "go" {
+		sort.Slice(list, func(i, j int) bool {
+			return gover.Compare(list[i], list[j]) < 0
+		})
+	} else {
+		sort.Slice(list, func(i, j int) bool {
+			return gover.Compare(gover.FromToolchain(list[i]), gover.FromToolchain(list[j])) < 0
+		})
+	}
+	versions.List = list
+	return versions, nil
+}
+
+func (r *toolchainRepo) Stat(ctx context.Context, rev string) (*RevInfo, error) {
+	// Convert rev to DL version and stat that to make sure it exists.
+	// In theory the go@ versions should be like 1.21.0
+	// and the toolchain@ versions should be like go1.21.0
+	// but people will type the wrong one, and so we accept
+	// both and silently correct it to the standard form.
+	prefix := ""
+	v := rev
+	v = strings.TrimPrefix(v, "go")
+	if r.path == "toolchain" {
+		prefix = "go"
+	}
+
+	if !gover.IsValid(v) {
+		return nil, fmt.Errorf("invalid %s version %s", r.path, rev)
+	}
+
+	// If we're asking about "go" (not "toolchain"), pretend to have
+	// all earlier Go versions available without network access:
+	// we will provide those ourselves, at least in GOTOOLCHAIN=auto mode.
+	if r.path == "go" && gover.Compare(v, gover.Local()) <= 0 {
+		return &RevInfo{Version: prefix + v}, nil
+	}
+
+	// Similarly, if we're asking about *exactly* the current toolchain,
+	// we don't need to access the network to know that it exists.
+	if r.path == "toolchain" && v == gover.Local() {
+		return &RevInfo{Version: prefix + v}, nil
+	}
+
+	if gover.IsLang(v) {
+		// We can only use a language (development) version if the current toolchain
+		// implements that version, and the two checks above have ruled that out.
+		return nil, fmt.Errorf("go language version %s is not a toolchain version", rev)
+	}
+
+	// Check that the underlying toolchain exists.
+	// We always ask about linux-amd64 because that one
+	// has always existed and is likely to always exist in the future.
+	// This avoids different behavior validating go versions on different
+	// architectures. The eventual download uses the right GOOS-GOARCH.
+	info, err := r.repo.Stat(ctx, goToDL(v, "linux", "amd64"))
+	if err != nil {
+		return nil, err
+	}
+
+	// Return the info using the canonicalized rev
+	// (toolchain 1.2 => toolchain go1.2).
+	return &RevInfo{Version: prefix + v, Time: info.Time}, nil
+}
+
+func (r *toolchainRepo) Latest(ctx context.Context) (*RevInfo, error) {
+	versions, err := r.Versions(ctx, "")
+	if err != nil {
+		return nil, err
+	}
+	var max string
+	for _, v := range versions.List {
+		if max == "" || gover.ModCompare(r.path, v, max) > 0 {
+			max = v
+		}
+	}
+	return r.Stat(ctx, max)
+}
+
+func (r *toolchainRepo) GoMod(ctx context.Context, version string) (data []byte, err error) {
+	return []byte("module " + r.path + "\n"), nil
+}
+
+func (r *toolchainRepo) Zip(ctx context.Context, dst io.Writer, version string) error {
+	return fmt.Errorf("invalid use of toolchainRepo: Zip")
+}
+
+func (r *toolchainRepo) CheckReuse(ctx context.Context, old *codehost.Origin) error {
+	return fmt.Errorf("invalid use of toolchainRepo: CheckReuse")
+}
+
+// goToDL converts a Go version like "1.2" to a DL module version like "v0.0.1-go1.2.linux-amd64".
+func goToDL(v, goos, goarch string) string {
+	return "v0.0.1-go" + v + ".linux-amd64"
+}
+
+// dlToGo converts a DL module version like "v0.0.1-go1.2.linux-amd64" to a Go version like "1.2".
+func dlToGo(v string) (string, bool) {
+	// v0.0.1-go1.19.7.windows-amd64
+	// cut v0.0.1-
+	_, v, ok := strings.Cut(v, "-")
+	if !ok {
+		return "", false
+	}
+	// cut .windows-amd64
+	i := strings.LastIndex(v, ".")
+	if i < 0 || !strings.Contains(v[i+1:], "-") {
+		return "", false
+	}
+	return strings.TrimPrefix(v[:i], "go"), true
+}
diff --git a/src/cmd/go/internal/modfetch/zip_sum_test/zip_sum_test.go b/src/cmd/go/internal/modfetch/zip_sum_test/zip_sum_test.go
index d9ba8ef..16cc145 100644
--- a/src/cmd/go/internal/modfetch/zip_sum_test/zip_sum_test.go
+++ b/src/cmd/go/internal/modfetch/zip_sum_test/zip_sum_test.go
@@ -119,7 +119,9 @@
 		name := fmt.Sprintf("%s@%s", strings.ReplaceAll(test.m.Path, "/", "_"), test.m.Version)
 		t.Run(name, func(t *testing.T) {
 			t.Parallel()
-			zipPath, err := modfetch.DownloadZip(context.Background(), test.m)
+			ctx := context.Background()
+
+			zipPath, err := modfetch.DownloadZip(ctx, test.m)
 			if err != nil {
 				if *updateTestData {
 					t.Logf("%s: could not download module: %s (will remove from testdata)", test.m, err)
@@ -131,7 +133,7 @@
 				return
 			}
 
-			sum := modfetch.Sum(test.m)
+			sum := modfetch.Sum(ctx, test.m)
 			if sum != test.wantSum {
 				if *updateTestData {
 					t.Logf("%s: updating content sum to %s", test.m, sum)
diff --git a/src/cmd/go/internal/modget/get.go b/src/cmd/go/internal/modget/get.go
index 08a474f..37befa3 100644
--- a/src/cmd/go/internal/modget/get.go
+++ b/src/cmd/go/internal/modget/get.go
@@ -36,16 +36,18 @@
 	"sync"
 
 	"cmd/go/internal/base"
+	"cmd/go/internal/cfg"
+	"cmd/go/internal/gover"
 	"cmd/go/internal/imports"
 	"cmd/go/internal/modfetch"
 	"cmd/go/internal/modload"
 	"cmd/go/internal/par"
 	"cmd/go/internal/search"
+	"cmd/go/internal/toolchain"
 	"cmd/go/internal/work"
 
 	"golang.org/x/mod/modfile"
 	"golang.org/x/mod/module"
-	"golang.org/x/mod/semver"
 )
 
 var CmdGet = &base.Command{
@@ -70,6 +72,14 @@
 
 	go get example.com/mod@none
 
+To upgrade the minimum required Go version to the latest released Go version:
+
+	go get go@latest
+
+To upgrade the Go toolchain to the latest patch release of the current Go toolchain:
+
+	go get toolchain@patch
+
 See https://golang.org/ref/mod#go-get for details.
 
 In earlier versions of Go, 'go get' was used to build and install packages.
@@ -104,6 +114,9 @@
 
 For more about modules, see https://golang.org/ref/mod.
 
+For more about using 'go get' to update the minimum Go version and
+suggested Go toolchain, see https://go.dev/doc/toolchain.
+
 For more about specifying packages, see 'go help packages'.
 
 This text describes the behavior of get using modules to manage source
@@ -301,7 +314,15 @@
 			"\tor run 'go help get' or 'go help install'.")
 	}
 
-	queries := parseArgs(ctx, args)
+	dropToolchain, queries := parseArgs(ctx, args)
+	opts := modload.WriteOpts{
+		DropToolchain: dropToolchain,
+	}
+	for _, q := range queries {
+		if q.pattern == "toolchain" {
+			opts.ExplicitToolchain = true
+		}
+	}
 
 	r := newResolver(ctx, queries)
 	r.performLocalQueries(ctx)
@@ -323,7 +344,7 @@
 			// The result of any version query for a given module — even "upgrade" or
 			// "patch" — is always relative to the build list at the start of
 			// the 'go get' command, not an intermediate state, and is therefore
-			// dederministic and therefore cachable, and the constraints on the
+			// deterministic and therefore cachable, and the constraints on the
 			// selected version of each module can only narrow as we iterate.
 			//
 			// "all" is functionally very similar to a wildcard pattern. The set of
@@ -338,7 +359,7 @@
 
 		// When we load imports, we detect the following conditions:
 		//
-		// - missing transitive depencies that need to be resolved from outside the
+		// - missing transitive dependencies that need to be resolved from outside the
 		//   current build list (note that these may add new matches for existing
 		//   pattern queries!)
 		//
@@ -373,29 +394,51 @@
 	// Everything succeeded. Update go.mod.
 	oldReqs := reqsFromGoMod(modload.ModFile())
 
-	if err := modload.WriteGoMod(ctx); err != nil {
-		base.Fatalf("go: %v", err)
+	if err := modload.WriteGoMod(ctx, opts); err != nil {
+		// A TooNewError can happen for 'go get go@newversion'
+		// when all the required modules are old enough
+		// but the command line is not.
+		// TODO(bcmills): modload.EditBuildList should catch this instead,
+		// and then this can be changed to base.Fatal(err).
+		toolchain.SwitchOrFatal(ctx, err)
 	}
 
 	newReqs := reqsFromGoMod(modload.ModFile())
 	r.reportChanges(oldReqs, newReqs)
+
+	if gowork := modload.FindGoWork(base.Cwd()); gowork != "" {
+		wf, err := modload.ReadWorkFile(gowork)
+		if err == nil && modload.UpdateWorkGoVersion(wf, modload.MainModules.GoVersion()) {
+			modload.WriteWorkFile(gowork, wf)
+		}
+	}
 }
 
 // parseArgs parses command-line arguments and reports errors.
 //
 // The command-line arguments are of the form path@version or simply path, with
 // implicit @upgrade. path@none is "downgrade away".
-func parseArgs(ctx context.Context, rawArgs []string) []*query {
+func parseArgs(ctx context.Context, rawArgs []string) (dropToolchain bool, queries []*query) {
 	defer base.ExitIfErrors()
 
-	var queries []*query
 	for _, arg := range search.CleanPatterns(rawArgs) {
 		q, err := newQuery(arg)
 		if err != nil {
-			base.Errorf("go: %v", err)
+			base.Error(err)
 			continue
 		}
 
+		if q.version == "none" {
+			switch q.pattern {
+			case "go":
+				base.Errorf("go: cannot use go@none")
+				continue
+			case "toolchain":
+				dropToolchain = true
+				continue
+			}
+		}
+
 		// If there were no arguments, CleanPatterns returns ".". Set the raw
 		// string back to "" for better errors.
 		if len(rawArgs) == 0 {
@@ -419,7 +462,7 @@
 		queries = append(queries, q)
 	}
 
-	return queries
+	return dropToolchain, queries
 }
 
 type resolver struct {
@@ -447,7 +490,7 @@
 
 	work *par.Queue
 
-	matchInModuleCache par.Cache
+	matchInModuleCache par.ErrCache[matchInModuleKey, []string]
 }
 
 type versionReason struct {
@@ -455,11 +498,18 @@
 	reason  *query
 }
 
+type matchInModuleKey struct {
+	pattern string
+	m       module.Version
+}
+
 func newResolver(ctx context.Context, queries []*query) *resolver {
 	// LoadModGraph also sets modload.Target, which is needed by various resolver
 	// methods.
-	const defaultGoVersion = ""
-	mg := modload.LoadModGraph(ctx, defaultGoVersion)
+	mg, err := modload.LoadModGraph(ctx, "")
+	if err != nil {
+		toolchain.SwitchOrFatal(ctx, err)
+	}
 
 	buildList := mg.BuildList()
 	initialVersion := make(map[string]string, len(buildList))
@@ -547,7 +597,7 @@
 	return module.Version{Path: mPath, Version: rev.Version}, nil
 }
 
-// queryPackage wraps modload.QueryPackage, substituting r.checkAllowedOr to
+// queryPackages wraps modload.QueryPackage, substituting r.checkAllowedOr to
 // decide allowed versions.
 func (r *resolver) queryPackages(ctx context.Context, pattern, query string, selected func(string) string) (pkgMods []module.Version, err error) {
 	results, err := modload.QueryPackages(ctx, pattern, query, selected, r.checkAllowedOr(query, selected))
@@ -592,24 +642,13 @@
 
 // matchInModule is a caching wrapper around modload.MatchInModule.
 func (r *resolver) matchInModule(ctx context.Context, pattern string, m module.Version) (packages []string, err error) {
-	type key struct {
-		pattern string
-		m       module.Version
-	}
-	type entry struct {
-		packages []string
-		err      error
-	}
-
-	e := r.matchInModuleCache.Do(key{pattern, m}, func() any {
+	return r.matchInModuleCache.Do(matchInModuleKey{pattern, m}, func() ([]string, error) {
 		match := modload.MatchInModule(ctx, pattern, m, imports.AnyTags())
 		if len(match.Errs) > 0 {
-			return entry{match.Pkgs, match.Errs[0]}
+			return match.Pkgs, match.Errs[0]
 		}
-		return entry{match.Pkgs, nil}
-	}).(entry)
-
-	return e.packages, e.err
+		return match.Pkgs, nil
+	})
 }
 
 // queryNone adds a candidate set to q for each module matching q.pattern.
@@ -1121,6 +1160,7 @@
 		LoadTests:                *getT,
 		AssumeRootsImported:      true, // After 'go get foo', imports of foo should build.
 		SilencePackageErrors:     true, // May be fixed by subsequent upgrades or downgrades.
+		Switcher:                 new(toolchain.Switcher),
 	}
 
 	opts.AllowPackage = func(ctx context.Context, path string, m module.Version) error {
@@ -1202,6 +1242,23 @@
 	for {
 		prevResolved := resolved
 
+		// If we found modules that were too new, find the max of the required versions
+		// and then try to switch to a newer toolchain.
+		var sw toolchain.Switcher
+		for _, q := range queries {
+			for _, cs := range q.candidates {
+				sw.Error(cs.err)
+			}
+		}
+		// Only switch if we need a newer toolchain.
+		// Otherwise leave the cs.err for reporting later.
+		if sw.NeedSwitch() {
+			sw.Switch(ctx)
+			// If NeedSwitch is true and Switch returns, Switch has failed to locate a newer toolchain.
+			// It printed the errors along with one more about not finding a good toolchain.
+			base.Exit()
+		}
+
 		for _, q := range queries {
 			unresolved := q.candidates[:0]
 
@@ -1292,7 +1349,7 @@
 	var tentative []module.Version
 	for _, cs := range upgrades {
 		if cs.err != nil {
-			base.Errorf("go: %v", cs.err)
+			base.Error(cs.err)
 			continue
 		}
 
@@ -1592,7 +1649,7 @@
 		r.work.Add(func() {
 			if _, err := modfetch.DownloadZip(ctx, mActual); err != nil {
 				verb := "upgraded"
-				if semver.Compare(m.Version, old.Version) < 0 {
+				if gover.ModCompare(m.Path, m.Version, old.Version) < 0 {
 					verb = "downgraded"
 				}
 				replaced := ""
@@ -1630,7 +1687,7 @@
 	}
 	for _, err := range sumErrs {
 		if err != nil {
-			base.Errorf("go: %v", err)
+			base.Error(err)
 		}
 	}
 	base.ExitIfErrors()
@@ -1651,6 +1708,9 @@
 
 	// Collect changes in modules matched by command line arguments.
 	for path, reason := range r.resolvedVersion {
+		if gover.IsToolchain(path) {
+			continue
+		}
 		old := r.initialVersion[path]
 		new := reason.version
 		if old != new && (old != "" || new != "none") {
@@ -1660,6 +1720,9 @@
 
 	// Collect changes to explicit requirements in go.mod.
 	for _, req := range oldReqs {
+		if gover.IsToolchain(req.Path) {
+			continue
+		}
 		path := req.Path
 		old := req.Version
 		new := r.buildListVersion[path]
@@ -1668,6 +1731,9 @@
 		}
 	}
 	for _, req := range newReqs {
+		if gover.IsToolchain(req.Path) {
+			continue
+		}
 		path := req.Path
 		old := r.initialVersion[path]
 		new := req.Version
@@ -1676,20 +1742,62 @@
 		}
 	}
 
+	// Toolchain diffs are easier than requirements: diff old and new directly.
+	toolchainVersions := func(reqs []module.Version) (goV, toolchain string) {
+		for _, req := range reqs {
+			if req.Path == "go" {
+				goV = req.Version
+			}
+			if req.Path == "toolchain" {
+				toolchain = req.Version
+			}
+		}
+		return
+	}
+	oldGo, oldToolchain := toolchainVersions(oldReqs)
+	newGo, newToolchain := toolchainVersions(newReqs)
+	if oldGo != newGo {
+		changes["go"] = change{"go", oldGo, newGo}
+	}
+	if oldToolchain != newToolchain {
+		changes["toolchain"] = change{"toolchain", oldToolchain, newToolchain}
+	}
+
 	sortedChanges := make([]change, 0, len(changes))
 	for _, c := range changes {
 		sortedChanges = append(sortedChanges, c)
 	}
 	sort.Slice(sortedChanges, func(i, j int) bool {
-		return sortedChanges[i].path < sortedChanges[j].path
+		pi := sortedChanges[i].path
+		pj := sortedChanges[j].path
+		if pi == pj {
+			return false
+		}
+		// go first; toolchain second
+		switch {
+		case pi == "go":
+			return true
+		case pj == "go":
+			return false
+		case pi == "toolchain":
+			return true
+		case pj == "toolchain":
+			return false
+		}
+		return pi < pj
 	})
+
 	for _, c := range sortedChanges {
 		if c.old == "" {
 			fmt.Fprintf(os.Stderr, "go: added %s %s\n", c.path, c.new)
 		} else if c.new == "none" || c.new == "" {
 			fmt.Fprintf(os.Stderr, "go: removed %s %s\n", c.path, c.old)
-		} else if semver.Compare(c.new, c.old) > 0 {
+		} else if gover.ModCompare(c.path, c.new, c.old) > 0 {
 			fmt.Fprintf(os.Stderr, "go: upgraded %s %s => %s\n", c.path, c.old, c.new)
+			if c.path == "go" && gover.Compare(c.old, gover.ExplicitIndirectVersion) < 0 && gover.Compare(c.new, gover.ExplicitIndirectVersion) >= 0 {
+				fmt.Fprintf(os.Stderr, "\tnote: expanded dependencies to upgrade to go %s or higher; run 'go mod tidy' to clean up\n", gover.ExplicitIndirectVersion)
+			}
+
 		} else {
 			fmt.Fprintf(os.Stderr, "go: downgraded %s %s => %s\n", c.path, c.old, c.new)
 		}
@@ -1748,21 +1856,44 @@
 
 	changed, err := modload.EditBuildList(ctx, additions, resolved)
 	if err != nil {
-		var constraint *modload.ConstraintError
-		if !errors.As(err, &constraint) {
-			base.Errorf("go: %v", err)
-			return false
+		if errors.Is(err, gover.ErrTooNew) {
+			toolchain.SwitchOrFatal(ctx, err)
 		}
 
+		var constraint *modload.ConstraintError
+		if !errors.As(err, &constraint) {
+			base.Fatal(err)
+		}
+
+		if cfg.BuildV {
+			// Log complete paths for the conflicts before we summarize them.
+			for _, c := range constraint.Conflicts {
+				fmt.Fprintf(os.Stderr, "go: %v\n", c.String())
+			}
+		}
+
+		// modload.EditBuildList reports constraint errors at
+		// the module level, but 'go get' operates on packages.
+		// Rewrite the errors to explain them in terms of packages.
 		reason := func(m module.Version) string {
 			rv, ok := r.resolvedVersion[m.Path]
 			if !ok {
-				panic(fmt.Sprintf("internal error: can't find reason for requirement on %v", m))
+				return fmt.Sprintf("(INTERNAL ERROR: no reason found for %v)", m)
 			}
 			return rv.reason.ResolvedString(module.Version{Path: m.Path, Version: rv.version})
 		}
 		for _, c := range constraint.Conflicts {
-			base.Errorf("go: %v requires %v, not %v", reason(c.Source), c.Dep, reason(c.Constraint))
+			adverb := ""
+			if len(c.Path) > 2 {
+				adverb = "indirectly "
+			}
+			firstReason := reason(c.Path[0])
+			last := c.Path[len(c.Path)-1]
+			if c.Err != nil {
+				base.Errorf("go: %v %srequires %v: %v", firstReason, adverb, last, c.UnwrapModuleError())
+			} else {
+				base.Errorf("go: %v %srequires %v, not %v", firstReason, adverb, last, reason(c.Constraint))
+			}
 		}
 		return false
 	}
@@ -1770,8 +1901,12 @@
 		return false
 	}
 
-	const defaultGoVersion = ""
-	r.buildList = modload.LoadModGraph(ctx, defaultGoVersion).BuildList()
+	mg, err := modload.LoadModGraph(ctx, "")
+	if err != nil {
+		toolchain.SwitchOrFatal(ctx, err)
+	}
+
+	r.buildList = mg.BuildList()
 	r.buildListVersion = make(map[string]string, len(r.buildList))
 	for _, m := range r.buildList {
 		r.buildListVersion[m.Path] = m.Version
@@ -1780,10 +1915,16 @@
 }
 
 func reqsFromGoMod(f *modfile.File) []module.Version {
-	reqs := make([]module.Version, len(f.Require))
+	reqs := make([]module.Version, len(f.Require), 2+len(f.Require))
 	for i, r := range f.Require {
 		reqs[i] = r.Mod
 	}
+	if f.Go != nil {
+		reqs = append(reqs, module.Version{Path: "go", Version: f.Go.Version})
+	}
+	if f.Toolchain != nil {
+		reqs = append(reqs, module.Version{Path: "toolchain", Version: f.Toolchain.Name})
+	}
 	return reqs
 }
 
diff --git a/src/cmd/go/internal/modget/query.go b/src/cmd/go/internal/modget/query.go
index d18770e..b78c1c4 100644
--- a/src/cmd/go/internal/modget/query.go
+++ b/src/cmd/go/internal/modget/query.go
@@ -12,6 +12,7 @@
 	"sync"
 
 	"cmd/go/internal/base"
+	"cmd/go/internal/gover"
 	"cmd/go/internal/modload"
 	"cmd/go/internal/search"
 	"cmd/go/internal/str"
@@ -97,7 +98,7 @@
 	resolved []module.Version
 
 	// matchesPackages is true if the resolved modules provide at least one
-	// package mathcing q.pattern.
+	// package matching q.pattern.
 	matchesPackages bool
 }
 
@@ -229,7 +230,7 @@
 
 // matchesPath reports whether the given path matches q.pattern.
 func (q *query) matchesPath(path string) bool {
-	if q.matchWildcard != nil {
+	if q.matchWildcard != nil && !gover.IsToolchain(path) {
 		return q.matchWildcard(path)
 	}
 	return path == q.pattern
@@ -238,6 +239,9 @@
 // canMatchInModule reports whether the given module path can potentially
 // contain q.pattern.
 func (q *query) canMatchInModule(mPath string) bool {
+	if gover.IsToolchain(mPath) {
+		return false
+	}
 	if q.canMatchWildcardInModule != nil {
 		return q.canMatchWildcardInModule(mPath)
 	}
diff --git a/src/cmd/go/internal/modindex/build.go b/src/cmd/go/internal/modindex/build.go
index e438097..b57f2f6 100644
--- a/src/cmd/go/internal/modindex/build.go
+++ b/src/cmd/go/internal/modindex/build.go
@@ -10,9 +10,11 @@
 import (
 	"bytes"
 	"cmd/go/internal/fsys"
+	"cmd/go/internal/str"
 	"errors"
 	"fmt"
 	"go/ast"
+	"go/build"
 	"go/build/constraint"
 	"go/token"
 	"io"
@@ -40,7 +42,7 @@
 	Dir string
 
 	CgoEnabled  bool   // whether cgo files are included
-	UseAllFiles bool   // use files regardless of +build lines, file names
+	UseAllFiles bool   // use files regardless of //go:build lines, file names
 	Compiler    string // compiler to assume when computing target paths
 
 	// The build, tool, and release tags specify build constraints
@@ -165,11 +167,7 @@
 
 // hasSubdir reports if dir is within root by performing lexical analysis only.
 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
-	}
+	root = str.WithFilePathSeparator(filepath.Clean(root))
 	dir = filepath.Clean(dir)
 	if !strings.HasPrefix(dir, root) {
 		return "", false
@@ -210,80 +208,6 @@
 
 var defaultToolTags, defaultReleaseTags []string
 
-// 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
-	BinaryOnly    bool     // cannot be rebuilt from source (has //go:binary-only-package comment)
-
-	// 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 (including ignored _test.go files)
-	InvalidGoFiles    []string // .go source files with detected problems (parse error, wrong package name, and so on)
-	IgnoredOtherFiles []string // non-.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
-	FFiles            []string // .f, .F, .for and .f90 Fortran 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
-	CgoFFLAGS    []string // Cgo FFLAGS directives
-	CgoLDFLAGS   []string // Cgo LDFLAGS directives
-	CgoPkgConfig []string // Cgo pkg-config directives
-
-	// Test information
-	TestGoFiles  []string // _test.go files in package
-	XTestGoFiles []string // _test.go files outside package
-
-	// Dependency information
-	Imports        []string                    // import paths from GoFiles, CgoFiles
-	ImportPos      map[string][]token.Position // line information for Imports
-	TestImports    []string                    // import paths from TestGoFiles
-	TestImportPos  map[string][]token.Position // line information for TestImports
-	XTestImports   []string                    // import paths from XTestGoFiles
-	XTestImportPos map[string][]token.Position // line information for XTestImports
-
-	// //go:embed patterns found in Go source files
-	// For example, if a source file says
-	//	//go:embed a* b.c
-	// then the list will contain those two strings as separate entries.
-	// (See package embed for more details about //go:embed.)
-	EmbedPatterns        []string                    // patterns from GoFiles, CgoFiles
-	EmbedPatternPos      map[string][]token.Position // line information for EmbedPatterns
-	TestEmbedPatterns    []string                    // patterns from TestGoFiles
-	TestEmbedPatternPos  map[string][]token.Position // line information for TestEmbedPatterns
-	XTestEmbedPatterns   []string                    // patterns from XTestGoFiles
-	XTestEmbedPatternPos map[string][]token.Position // line information for XTestEmbedPatternPos
-}
-
-// 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"
-}
-
 // 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.)
@@ -316,7 +240,7 @@
 	return name[i:]
 }
 
-func fileListForExt(p *Package, ext string) *[]string {
+func fileListForExt(p *build.Package, ext string) *[]string {
 	switch ext {
 	case ".c":
 		return &p.CFiles
@@ -448,17 +372,18 @@
 	return word, rest
 }
 
-var dummyPkg Package
+var dummyPkg build.Package
 
 // fileInfo records information learned about a file included in a build.
 type fileInfo struct {
-	name     string // full name including dir
-	header   []byte
-	fset     *token.FileSet
-	parsed   *ast.File
-	parseErr error
-	imports  []fileImport
-	embeds   []fileEmbed
+	name       string // full name including dir
+	header     []byte
+	fset       *token.FileSet
+	parsed     *ast.File
+	parseErr   error
+	imports    []fileImport
+	embeds     []fileEmbed
+	directives []build.Directive
 
 	// Additional fields added to go/build's fileinfo for the purposes of the modindex package.
 	binaryOnly           bool
@@ -685,7 +610,7 @@
 // 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, text string) error {
+func (ctxt *Context) saveCgo(filename string, di *build.Package, text string) error {
 	for _, line := range strings.Split(text, "\n") {
 		orig := line
 
diff --git a/src/cmd/go/internal/modindex/build_read.go b/src/cmd/go/internal/modindex/build_read.go
index d2fdfcb..9137200 100644
--- a/src/cmd/go/internal/modindex/build_read.go
+++ b/src/cmd/go/internal/modindex/build_read.go
@@ -13,6 +13,7 @@
 	"errors"
 	"fmt"
 	"go/ast"
+	"go/build"
 	"go/parser"
 	"go/token"
 	"io"
@@ -474,6 +475,18 @@
 		}
 	}
 
+	// Extract directives.
+	for _, group := range info.parsed.Comments {
+		if group.Pos() >= info.parsed.Package {
+			break
+		}
+		for _, c := range group.List {
+			if strings.HasPrefix(c.Text, "//go:") {
+				info.directives = append(info.directives, build.Directive{Text: c.Text, Pos: info.fset.Position(c.Slash)})
+			}
+		}
+	}
+
 	// If the file imports "embed",
 	// we have to look for //go:embed comments
 	// in the remainder of the file.
diff --git a/src/cmd/go/internal/modindex/index_format.txt b/src/cmd/go/internal/modindex/index_format.txt
index a593391..8b1d2c6 100644
--- a/src/cmd/go/internal/modindex/index_format.txt
+++ b/src/cmd/go/internal/modindex/index_format.txt
@@ -3,18 +3,19 @@
 
 Field names refer to fields on RawPackage and rawFile.
 The file uses little endian encoding for the uint32s.
-Strings are written into the string table at the end of the file. Each string
-is null-terminated. String offsets are relative to the start of the string table.
+Strings are written into the string table at the end of the file.
+Each string is prefixed with a uvarint-encoded length.
 Bools are written as uint32s: 0 for false and 1 for true.
 
 The following is the format for a full module:
 
-“go index v0\n”
+“go index v2\n”
 str uint32 - offset of string table
 n uint32 - number of packages
-dirnames [n]uint32 - offsets to package names in string table; names sorted by raw string
-packages [n]uint32 - offset where package begins
-for each RawPackage:
+for each rawPackage:
+	dirname - string offset
+	package - offset where package begins
+for each rawPackage:
 	error uint32 - string offset // error is produced by fsys.ReadDir or fmt.Errorf
 	dir uint32 - string offset (directory path relative to module root)
 	len(sourceFiles) uint32
@@ -35,11 +36,16 @@
 		for each rawImport:
 			path - string offset
 			position - file, offset, line, column - uint32
-		len(embeds) numEmbeds uint32
+		len(embeds) uint32
 		for each embed:
 			pattern - string offset
 			position - file, offset, line, column - uint32
+		len(directives) uint32
+		for each directive:
+			text - string offset
+			position - file, offset, line, column - uint32
 [string table]
+0xFF (marker)
 
 The following is the format for a single indexed package:
 
diff --git a/src/cmd/go/internal/modindex/read.go b/src/cmd/go/internal/modindex/read.go
index 7c4fa7a..83d5faf 100644
--- a/src/cmd/go/internal/modindex/read.go
+++ b/src/cmd/go/internal/modindex/read.go
@@ -37,7 +37,7 @@
 // It will be removed before the release.
 // TODO(matloob): Remove enabled once we have more confidence on the
 // module index.
-var enabled = godebug.New("goindex").Value() != "0"
+var enabled = godebug.New("#goindex").Value() != "0"
 
 // Module represents and encoded module index file. It is used to
 // do the equivalent of build.Import of packages in the module and answer other
@@ -61,7 +61,7 @@
 		//
 		// Note that this is true even for modules in GOROOT/src: non-release builds
 		// of the Go toolchain may have arbitrary development changes on top of the
-		// commit reported by runtime.Version, or could be completly artificial due
+		// commit reported by runtime.Version, or could be completely artificial due
 		// to lacking a `git` binary (like "devel gomote.XXXXX", as synthesized by
 		// "gomote push" as of 2022-06-15). (Release builds shouldn't have
 		// modifications, but we don't want to use a behavior for releases that we
@@ -117,8 +117,6 @@
 	return h.Sum(), nil
 }
 
-var modrootCache par.Cache
-
 var ErrNotIndexed = errors.New("not in module index")
 
 var (
@@ -128,7 +126,7 @@
 
 // GetPackage returns the IndexPackage for the package at the given path.
 // It will return ErrNotIndexed if the directory should be read without
-// using the index, for instance because the index is disabled, or the packgae
+// using the index, for instance because the index is disabled, or the package
 // is not in a module.
 func GetPackage(modroot, pkgdir string) (*IndexPackage, error) {
 	mi, err := GetModule(modroot)
@@ -146,7 +144,7 @@
 
 // GetModule returns the Module for the given modroot.
 // It will return ErrNotIndexed if the directory should be read without
-// using the index, for instance because the index is disabled, or the packgae
+// using the index, for instance because the index is disabled, or the package
 // is not in a module.
 func GetModule(modroot string) (*Module, error) {
 	if !enabled || cache.DefaultDir() == "off" {
@@ -162,78 +160,68 @@
 		return nil, errNotFromModuleCache
 	}
 	modroot = filepath.Clean(modroot)
-	if !str.HasFilePathPrefix(modroot, cfg.GOMODCACHE) {
+	if str.HasFilePathPrefix(modroot, cfg.GOROOTsrc) || !str.HasFilePathPrefix(modroot, cfg.GOMODCACHE) {
 		return nil, errNotFromModuleCache
 	}
 	return openIndexModule(modroot, true)
 }
 
-var mcache par.Cache
+var mcache par.ErrCache[string, *Module]
 
 // openIndexModule returns the module index for modPath.
 // It will return ErrNotIndexed if the module can not be read
 // using the index because it contains symlinks.
 func openIndexModule(modroot string, ismodcache bool) (*Module, error) {
-	type result struct {
-		mi  *Module
-		err error
-	}
-	r := mcache.Do(modroot, func() any {
+	return mcache.Do(modroot, func() (*Module, error) {
 		fsys.Trace("openIndexModule", modroot)
 		id, err := moduleHash(modroot, ismodcache)
 		if err != nil {
-			return result{nil, err}
+			return nil, err
 		}
-		data, _, err := cache.Default().GetMmap(id)
+		data, _, err := cache.GetMmap(cache.Default(), id)
 		if err != nil {
 			// Couldn't read from modindex. Assume we couldn't read from
 			// the index because the module hasn't been indexed yet.
 			data, err = indexModule(modroot)
 			if err != nil {
-				return result{nil, err}
+				return nil, err
 			}
-			if err = cache.Default().PutBytes(id, data); err != nil {
-				return result{nil, err}
+			if err = cache.PutBytes(cache.Default(), id, data); err != nil {
+				return nil, err
 			}
 		}
 		mi, err := fromBytes(modroot, data)
 		if err != nil {
-			return result{nil, err}
+			return nil, err
 		}
-		return result{mi, nil}
-	}).(result)
-	return r.mi, r.err
+		return mi, nil
+	})
 }
 
-var pcache par.Cache
+var pcache par.ErrCache[[2]string, *IndexPackage]
 
 func openIndexPackage(modroot, pkgdir string) (*IndexPackage, error) {
-	type result struct {
-		pkg *IndexPackage
-		err error
-	}
-	r := pcache.Do([2]string{modroot, pkgdir}, func() any {
+	return pcache.Do([2]string{modroot, pkgdir}, func() (*IndexPackage, error) {
 		fsys.Trace("openIndexPackage", pkgdir)
 		id, err := dirHash(modroot, pkgdir)
 		if err != nil {
-			return result{nil, err}
+			return nil, err
 		}
-		data, _, err := cache.Default().GetMmap(id)
+		data, _, err := cache.GetMmap(cache.Default(), id)
 		if err != nil {
 			// Couldn't read from index. Assume we couldn't read from
 			// the index because the package hasn't been indexed yet.
 			data = indexPackage(modroot, pkgdir)
-			if err = cache.Default().PutBytes(id, data); err != nil {
-				return result{nil, err}
+			if err = cache.PutBytes(cache.Default(), id, data); err != nil {
+				return nil, err
 			}
 		}
 		pkg, err := packageFromBytes(modroot, data)
 		if err != nil {
-			return result{nil, err}
+			return nil, err
 		}
-		return result{pkg, nil}
-	}).(result)
-	return r.pkg, r.err
+		return pkg, nil
+	})
 }
 
 var errCorrupt = errors.New("corrupt index")
@@ -515,7 +503,7 @@
 		if !shouldBuild || tf.ignoreFile() {
 			if ext == ".go" {
 				p.IgnoredGoFiles = append(p.IgnoredGoFiles, name)
-			} else if fileListForExt((*Package)(p), ext) != nil {
+			} else if fileListForExt(p, ext) != nil {
 				p.IgnoredOtherFiles = append(p.IgnoredOtherFiles, name)
 			}
 			continue
@@ -530,7 +518,7 @@
 			Sfiles = append(Sfiles, name)
 			continue
 		default:
-			if list := fileListForExt((*Package)(p), ext); list != nil {
+			if list := fileListForExt(p, ext); list != nil {
 				*list = append(*list, name)
 			}
 			continue
@@ -585,13 +573,14 @@
 			}
 		}
 		if directives := tf.cgoDirectives(); directives != "" {
-			if err := ctxt.saveCgo(name, (*Package)(p), directives); err != nil {
+			if err := ctxt.saveCgo(name, p, directives); err != nil {
 				badGoFile(name, err)
 			}
 		}
 
 		var fileList *[]string
 		var importMap, embedMap map[string][]token.Position
+		var directives *[]build.Directive
 		switch {
 		case isCgo:
 			allTags["cgo"] = true
@@ -599,6 +588,7 @@
 				fileList = &p.CgoFiles
 				importMap = importPos
 				embedMap = embedPos
+				directives = &p.Directives
 			} else {
 				// Ignore Imports and Embeds from cgo files if cgo is disabled.
 				fileList = &p.IgnoredGoFiles
@@ -607,14 +597,17 @@
 			fileList = &p.XTestGoFiles
 			importMap = xTestImportPos
 			embedMap = xTestEmbedPos
+			directives = &p.XTestDirectives
 		case isTest:
 			fileList = &p.TestGoFiles
 			importMap = testImportPos
 			embedMap = testEmbedPos
+			directives = &p.TestDirectives
 		default:
 			fileList = &p.GoFiles
 			importMap = importPos
 			embedMap = embedPos
+			directives = &p.Directives
 		}
 		*fileList = append(*fileList, name)
 		if importMap != nil {
@@ -627,6 +620,9 @@
 				embedMap[e.pattern] = append(embedMap[e.pattern], e.position)
 			}
 		}
+		if directives != nil {
+			*directives = append(*directives, tf.directives()...)
+		}
 	}
 
 	p.EmbedPatterns, p.EmbedPatternPos = cleanDecls(embedPos)
@@ -819,7 +815,7 @@
 	return m.pkg(i)
 }
 
-// pkgAt returns the i'th IndexPackage in m.
+// pkg returns the i'th IndexPackage in m.
 func (m *Module) pkg(i int) *IndexPackage {
 	r := m.d.readAt(m.pkgOff(i))
 	p := new(IndexPackage)
@@ -914,6 +910,13 @@
 	return pos + 4 + n*(4*5)
 }
 
+func (sf *sourceFile) directivesOffset() int {
+	pos := sf.embedsOffset()
+	n := sf.d.intAt(pos)
+	// each embed is 5 uint32s (string + tokpos)
+	return pos + 4 + n*(4*5)
+}
+
 func (sf *sourceFile) imports() []rawImport {
 	sf.onceReadImports.Do(func() {
 		importsOffset := sf.importsOffset()
@@ -939,6 +942,17 @@
 	return ret
 }
 
+func (sf *sourceFile) directives() []build.Directive {
+	directivesOffset := sf.directivesOffset()
+	r := sf.d.readAt(directivesOffset)
+	numDirectives := r.int()
+	ret := make([]build.Directive, numDirectives)
+	for i := range ret {
+		ret[i] = build.Directive{Text: r.string(), Pos: r.tokpos()}
+	}
+	return ret
+}
+
 func asString(b []byte) string {
 	return unsafe.String(unsafe.SliceData(b), len(b))
 }
@@ -966,7 +980,7 @@
 	return d.intAt(off) != 0
 }
 
-// stringTableAt returns the string pointed at by the int at the given offset in d.data.
+// stringAt returns the string pointed at by the int at the given offset in d.data.
 func (d *decoder) stringAt(off int) string {
 	return d.stringTableAt(d.intAt(off))
 }
diff --git a/src/cmd/go/internal/modindex/scan.go b/src/cmd/go/internal/modindex/scan.go
index 712257a..6ca73e2 100644
--- a/src/cmd/go/internal/modindex/scan.go
+++ b/src/cmd/go/internal/modindex/scan.go
@@ -7,11 +7,11 @@
 import (
 	"cmd/go/internal/base"
 	"cmd/go/internal/fsys"
-	"cmd/go/internal/par"
 	"cmd/go/internal/str"
 	"encoding/json"
 	"errors"
 	"fmt"
+	"go/build"
 	"go/doc"
 	"go/scanner"
 	"go/token"
@@ -23,12 +23,12 @@
 // moduleWalkErr returns filepath.SkipDir if the directory isn't relevant
 // when indexing a module or generating a filehash, ErrNotIndexed,
 // if the module shouldn't be indexed, and nil otherwise.
-func moduleWalkErr(modroot string, path string, info fs.FileInfo, err error) error {
+func moduleWalkErr(root string, path string, info fs.FileInfo, err error) error {
 	if err != nil {
 		return ErrNotIndexed
 	}
 	// stop at module boundaries
-	if info.IsDir() && path != modroot {
+	if info.IsDir() && path != root {
 		if fi, err := fsys.Stat(filepath.Join(path, "go.mod")); err == nil && !fi.IsDir() {
 			return filepath.SkipDir
 		}
@@ -52,18 +52,23 @@
 func indexModule(modroot string) ([]byte, error) {
 	fsys.Trace("indexModule", modroot)
 	var packages []*rawPackage
-	err := fsys.Walk(modroot, func(path string, info fs.FileInfo, err error) error {
-		if err := moduleWalkErr(modroot, path, info, err); err != nil {
+
+	// If the root itself is a symlink to a directory,
+	// we want to follow it (see https://go.dev/issue/50807).
+	// Add a trailing separator to force that to happen.
+	root := str.WithFilePathSeparator(modroot)
+	err := fsys.Walk(root, func(path string, info fs.FileInfo, err error) error {
+		if err := moduleWalkErr(root, path, info, err); err != nil {
 			return err
 		}
 
 		if !info.IsDir() {
 			return nil
 		}
-		if !str.HasFilePathPrefix(path, modroot) {
+		if !strings.HasPrefix(path, root) {
 			panic(fmt.Errorf("path %v in walk doesn't have modroot %v as prefix", path, modroot))
 		}
-		rel := str.TrimFilePathPrefix(path, modroot)
+		rel := path[len(root):]
 		packages = append(packages, importRaw(modroot, rel))
 		return nil
 	})
@@ -155,6 +160,7 @@
 	plusBuildConstraints []string
 	imports              []rawImport
 	embeds               []embed
+	directives           []build.Directive
 }
 
 type rawImport struct {
@@ -167,8 +173,6 @@
 	position token.Position
 }
 
-var pkgcache par.Cache // for packages not in modcache
-
 // importRaw fills the rawPackage from the package files in srcDir.
 // dir is the package's path relative to the modroot.
 func importRaw(modroot, reldir string) *rawPackage {
@@ -181,7 +185,7 @@
 	// We still haven't checked
 	// that p.dir directory exists. This is the right time to do that check.
 	// We can't do it earlier, because we want to gather partial information for the
-	// non-nil *Package returned when an error occurs.
+	// non-nil *build.Package returned when an error occurs.
 	// We need to do this before we return early on FindOnly flag.
 	if !isDir(absdir) {
 		// package was not found
@@ -229,6 +233,7 @@
 			goBuildConstraint:    info.goBuildConstraint,
 			plusBuildConstraints: info.plusBuildConstraints,
 			binaryOnly:           info.binaryOnly,
+			directives:           info.directives,
 		}
 		if info.parsed != nil {
 			rf.pkgName = info.parsed.Name.Name
diff --git a/src/cmd/go/internal/modindex/syslist.go b/src/cmd/go/internal/modindex/syslist.go
index 69b8fac..41adcc5 100644
--- a/src/cmd/go/internal/modindex/syslist.go
+++ b/src/cmd/go/internal/modindex/syslist.go
@@ -25,6 +25,7 @@
 	"openbsd":   true,
 	"plan9":     true,
 	"solaris":   true,
+	"wasip1":    true,
 	"windows":   true,
 	"zos":       true,
 }
diff --git a/src/cmd/go/internal/modindex/write.go b/src/cmd/go/internal/modindex/write.go
index df1467d..cd18ad9 100644
--- a/src/cmd/go/internal/modindex/write.go
+++ b/src/cmd/go/internal/modindex/write.go
@@ -11,7 +11,7 @@
 	"sort"
 )
 
-const indexVersion = "go index v1" // 11 bytes (plus \n), to align uint32s in index
+const indexVersion = "go index v2" // 11 bytes (plus \n), to align uint32s in index
 
 // encodeModuleBytes produces the encoded representation of the module index.
 // encodeModuleBytes may modify the packages slice.
@@ -84,6 +84,12 @@
 		e.String(embed.pattern)
 		e.Position(embed.position)
 	}
+
+	e.Int(len(f.directives))
+	for _, d := range f.directives {
+		e.String(d.Text)
+		e.Position(d.Pos)
+	}
 }
 
 func newEncoder() *encoder {
diff --git a/src/cmd/go/internal/modload/build.go b/src/cmd/go/internal/modload/build.go
index 30b248e..bb513ea 100644
--- a/src/cmd/go/internal/modload/build.go
+++ b/src/cmd/go/internal/modload/build.go
@@ -16,6 +16,7 @@
 
 	"cmd/go/internal/base"
 	"cmd/go/internal/cfg"
+	"cmd/go/internal/gover"
 	"cmd/go/internal/modfetch"
 	"cmd/go/internal/modfetch/codehost"
 	"cmd/go/internal/modindex"
@@ -23,7 +24,6 @@
 	"cmd/go/internal/search"
 
 	"golang.org/x/mod/module"
-	"golang.org/x/mod/semver"
 )
 
 var (
@@ -105,7 +105,7 @@
 	if !ok {
 		mg, err := rs.Graph(ctx)
 		if err != nil {
-			base.Fatalf("go: %v", err)
+			base.Fatal(err)
 		}
 		v = mg.Selected(path)
 	}
@@ -152,7 +152,7 @@
 		return
 	}
 
-	if semver.Compare(info.Version, m.Version) > 0 {
+	if gover.ModCompare(m.Path, info.Version, m.Version) > 0 {
 		m.Update = &modinfo.ModulePublic{
 			Path:    m.Path,
 			Version: info.Version,
@@ -309,6 +309,10 @@
 
 	// completeFromModCache fills in the extra fields in m using the module cache.
 	completeFromModCache := func(m *modinfo.ModulePublic) {
+		if gover.IsToolchain(m.Path) {
+			return
+		}
+
 		if old := reuse[module.Version{Path: m.Path, Version: m.Version}]; old != nil {
 			if err := checkReuse(ctx, m.Path, old.Origin); err == nil {
 				*m = *old
@@ -343,7 +347,7 @@
 
 		if m.Version != "" {
 			if checksumOk("/go.mod") {
-				gomod, err := modfetch.CachePath(mod, "mod")
+				gomod, err := modfetch.CachePath(ctx, mod, "mod")
 				if err == nil {
 					if info, err := os.Stat(gomod); err == nil && info.Mode().IsRegular() {
 						m.GoMod = gomod
@@ -351,7 +355,7 @@
 				}
 			}
 			if checksumOk("") {
-				dir, err := modfetch.DownloadDir(mod)
+				dir, err := modfetch.DownloadDir(ctx, mod)
 				if err == nil {
 					m.Dir = dir
 				}
@@ -417,7 +421,7 @@
 // If the package was loaded, its containing module and true are returned.
 // Otherwise, module.Version{} and false are returned.
 func findModule(ld *loader, path string) (module.Version, bool) {
-	if pkg, ok := ld.pkgCache.Get(path).(*loadPkg); ok {
+	if pkg, ok := ld.pkgCache.Get(path); ok {
 		return pkg.mod, pkg.mod != module.Version{}
 	}
 	return module.Version{}, false
diff --git a/src/cmd/go/internal/modload/buildlist.go b/src/cmd/go/internal/modload/buildlist.go
index aa59611..8d3af08 100644
--- a/src/cmd/go/internal/modload/buildlist.go
+++ b/src/cmd/go/internal/modload/buildlist.go
@@ -5,28 +5,26 @@
 package modload
 
 import (
-	"cmd/go/internal/base"
-	"cmd/go/internal/cfg"
-	"cmd/go/internal/mvs"
-	"cmd/go/internal/par"
 	"context"
+	"errors"
 	"fmt"
 	"os"
 	"reflect"
 	"runtime"
 	"runtime/debug"
+	"slices"
 	"strings"
 	"sync"
 	"sync/atomic"
 
-	"golang.org/x/mod/module"
-	"golang.org/x/mod/semver"
-)
+	"cmd/go/internal/base"
+	"cmd/go/internal/cfg"
+	"cmd/go/internal/gover"
+	"cmd/go/internal/mvs"
+	"cmd/go/internal/par"
 
-// capVersionSlice returns s with its cap reduced to its length.
-func capVersionSlice(s []module.Version) []module.Version {
-	return s[:len(s):len(s)]
-}
+	"golang.org/x/mod/module"
+)
 
 // A Requirements represents a logically-immutable set of root module requirements.
 type Requirements struct {
@@ -46,9 +44,12 @@
 
 	// rootModules is the set of root modules of the graph, sorted and capped to
 	// length. It may contain duplicates, and may contain multiple versions for a
-	// given module path. The root modules of the groph are the set of main
+	// given module path. The root modules of the graph are the set of main
 	// modules in workspace mode, and the main module's direct requirements
 	// outside workspace mode.
+	//
+	// The roots are always expected to contain an entry for the "go" module,
+	// indicating the Go language version in use.
 	rootModules    []module.Version
 	maxRootVersion map[string]string
 
@@ -94,61 +95,80 @@
 // accept and/or return an explicit parameter.
 var requirements *Requirements
 
+func mustHaveGoRoot(roots []module.Version) {
+	for _, m := range roots {
+		if m.Path == "go" {
+			return
+		}
+	}
+	panic("go: internal error: missing go root module")
+}
+
 // newRequirements returns a new requirement set with the given root modules.
 // The dependencies of the roots will be loaded lazily at the first call to the
 // Graph method.
 //
-// The rootModules slice must be sorted according to module.Sort.
+// The rootModules slice must be sorted according to gover.ModSort.
 // The caller must not modify the rootModules slice or direct map after passing
 // them to newRequirements.
 //
 // If vendoring is in effect, the caller must invoke initVendor on the returned
 // *Requirements before any other method.
 func newRequirements(pruning modPruning, rootModules []module.Version, direct map[string]bool) *Requirements {
-	if pruning == workspace {
-		return &Requirements{
-			pruning:        pruning,
-			rootModules:    capVersionSlice(rootModules),
-			maxRootVersion: nil,
-			direct:         direct,
+	mustHaveGoRoot(rootModules)
+
+	if pruning != workspace {
+		if workFilePath != "" {
+			panic("in workspace mode, but pruning is not workspace in newRequirements")
 		}
 	}
 
-	if workFilePath != "" && pruning != workspace {
-		panic("in workspace mode, but pruning is not workspace in newRequirements")
-	}
-
-	for i, m := range rootModules {
-		if m.Version == "" && MainModules.Contains(m.Path) {
-			panic(fmt.Sprintf("newRequirements called with untrimmed build list: rootModules[%v] is a main module", i))
+	if pruning != workspace {
+		if workFilePath != "" {
+			panic("in workspace mode, but pruning is not workspace in newRequirements")
 		}
-		if m.Path == "" || m.Version == "" {
-			panic(fmt.Sprintf("bad requirement: rootModules[%v] = %v", i, m))
-		}
-		if i > 0 {
-			prev := rootModules[i-1]
-			if prev.Path > m.Path || (prev.Path == m.Path && semver.Compare(prev.Version, m.Version) > 0) {
-				panic(fmt.Sprintf("newRequirements called with unsorted roots: %v", rootModules))
+		for i, m := range rootModules {
+			if m.Version == "" && MainModules.Contains(m.Path) {
+				panic(fmt.Sprintf("newRequirements called with untrimmed build list: rootModules[%v] is a main module", i))
+			}
+			if m.Path == "" || m.Version == "" {
+				panic(fmt.Sprintf("bad requirement: rootModules[%v] = %v", i, m))
 			}
 		}
 	}
 
 	rs := &Requirements{
 		pruning:        pruning,
-		rootModules:    capVersionSlice(rootModules),
+		rootModules:    rootModules,
 		maxRootVersion: make(map[string]string, len(rootModules)),
 		direct:         direct,
 	}
 
-	for _, m := range rootModules {
-		if v, ok := rs.maxRootVersion[m.Path]; ok && cmpVersion(v, m.Version) >= 0 {
+	for i, m := range rootModules {
+		if i > 0 {
+			prev := rootModules[i-1]
+			if prev.Path > m.Path || (prev.Path == m.Path && gover.ModCompare(m.Path, prev.Version, m.Version) > 0) {
+				panic(fmt.Sprintf("newRequirements called with unsorted roots: %v", rootModules))
+			}
+		}
+
+		if v, ok := rs.maxRootVersion[m.Path]; ok && gover.ModCompare(m.Path, v, m.Version) >= 0 {
 			continue
 		}
 		rs.maxRootVersion[m.Path] = m.Version
 	}
+
+	if rs.maxRootVersion["go"] == "" {
+		panic(`newRequirements called without a "go" version`)
+	}
 	return rs
 }
 
+// String returns a string describing the Requirements for debugging.
+func (rs *Requirements) String() string {
+	return fmt.Sprintf("{%v %v}", rs.pruning, rs.rootModules)
+}
+
 // initVendor initializes rs.graph from the given list of vendored module
 // dependencies, overriding the graph that would normally be loaded from module
 // requirements.
@@ -177,7 +197,7 @@
 				}
 			}
 			if inconsistent {
-				base.Fatalf("go: %v", errGoModDirty)
+				base.Fatal(errGoModDirty)
 			}
 
 			// Now we can treat the rest of the module graph as effectively “pruned
@@ -203,6 +223,15 @@
 	})
 }
 
+// GoVersion returns the Go language version for the Requirements.
+func (rs *Requirements) GoVersion() string {
+	v, _ := rs.rootSelected("go")
+	if v == "" {
+		panic("internal error: missing go version in modload.Requirements")
+	}
+	return v
+}
+
 // rootSelected returns the version of the root dependency with the given module
 // path, or the zero module.Version and ok=false if the module is not a root
 // dependency.
@@ -239,7 +268,7 @@
 // returns a non-nil error of type *mvs.BuildListError.
 func (rs *Requirements) Graph(ctx context.Context) (*ModuleGraph, error) {
 	rs.graphOnce.Do(func() {
-		mg, mgErr := readModGraph(ctx, rs.pruning, rs.rootModules)
+		mg, mgErr := readModGraph(ctx, rs.pruning, rs.rootModules, nil)
 		rs.graph.Store(&cachedGraph{mg, mgErr})
 	})
 	cached := rs.graph.Load()
@@ -259,27 +288,24 @@
 // transitive dependencies of non-root (implicit) dependencies.
 type ModuleGraph struct {
 	g         *mvs.Graph
-	loadCache par.Cache // module.Version → summaryError
+	loadCache par.ErrCache[module.Version, *modFileSummary]
 
 	buildListOnce sync.Once
 	buildList     []module.Version
 }
 
-// A summaryError is either a non-nil modFileSummary or a non-nil error
-// encountered while reading or parsing that summary.
-type summaryError struct {
-	summary *modFileSummary
-	err     error
-}
-
 var readModGraphDebugOnce sync.Once
 
 // readModGraph reads and returns the module dependency graph starting at the
 // given roots.
 //
+// The requirements of the module versions found in the unprune map are included
+// in the graph even if they would normally be pruned out.
+//
 // Unlike LoadModGraph, readModGraph does not attempt to diagnose or update
 // inconsistent roots.
-func readModGraph(ctx context.Context, pruning modPruning, roots []module.Version) (*ModuleGraph, error) {
+func readModGraph(ctx context.Context, pruning modPruning, roots []module.Version, unprune map[module.Version]bool) (*ModuleGraph, error) {
+	mustHaveGoRoot(roots)
 	if pruning == pruned {
 		// Enable diagnostics for lazy module loading
 		// (https://golang.org/ref/mod#lazy-loading) only if the module graph is
@@ -303,13 +329,20 @@
 		})
 	}
 
+	var graphRoots []module.Version
+	if inWorkspaceMode() {
+		graphRoots = roots
+	} else {
+		graphRoots = MainModules.Versions()
+	}
 	var (
 		mu       sync.Mutex // guards mg.g and hasError during loading
 		hasError bool
 		mg       = &ModuleGraph{
-			g: mvs.NewGraph(cmpVersion, MainModules.Versions()),
+			g: mvs.NewGraph(cmpVersion, graphRoots),
 		}
 	)
+
 	if pruning != workspace {
 		if inWorkspaceMode() {
 			panic("pruning is not workspace in workspace mode")
@@ -317,16 +350,20 @@
 		mg.g.Require(MainModules.mustGetSingleMainModule(), roots)
 	}
 
+	type dedupKey struct {
+		m       module.Version
+		pruning modPruning
+	}
 	var (
-		loadQueue       = par.NewQueue(runtime.GOMAXPROCS(0))
-		loadingUnpruned sync.Map // module.Version → nil; the set of modules that have been or are being loaded via roots that do not support pruning
+		loadQueue = par.NewQueue(runtime.GOMAXPROCS(0))
+		loading   sync.Map // dedupKey → nil; the set of modules that have been or are being loaded
 	)
 
 	// loadOne synchronously loads the explicit requirements for module m.
 	// It does not load the transitive requirements of m even if the go version in
 	// m's go.mod file indicates that it supports graph pruning.
 	loadOne := func(m module.Version) (*modFileSummary, error) {
-		cached := mg.loadCache.Do(m, func() any {
+		return mg.loadCache.Do(m, func() (*modFileSummary, error) {
 			summary, err := goModSummary(m)
 
 			mu.Lock()
@@ -337,10 +374,8 @@
 			}
 			mu.Unlock()
 
-			return summaryError{summary, err}
-		}).(summaryError)
-
-		return cached.summary, cached.err
+			return summary, err
+		})
 	}
 
 	var enqueue func(m module.Version, pruning modPruning)
@@ -349,13 +384,11 @@
 			return
 		}
 
-		if pruning == unpruned {
-			if _, dup := loadingUnpruned.LoadOrStore(m, nil); dup {
-				// m has already been enqueued for loading. Since unpruned loading may
-				// follow cycles in the requirement graph, we need to return early
-				// to avoid making the load queue infinitely long.
-				return
-			}
+		if _, dup := loading.LoadOrStore(dedupKey{m, pruning}, nil); dup {
+			// m has already been enqueued for loading. Since unpruned loading may
+			// follow cycles in the requirement graph, we need to return early
+			// to avoid making the load queue infinitely long.
+			return
 		}
 
 		loadQueue.Add(func() {
@@ -368,19 +401,21 @@
 			// cannot assume that the explicit requirements of m (added by loadOne)
 			// are sufficient to build the packages it contains. We must load its full
 			// transitive dependency graph to be sure that we see all relevant
-			// dependencies.
-			if pruning != pruned || summary.pruning == unpruned {
-				nextPruning := summary.pruning
-				if pruning == unpruned {
-					nextPruning = unpruned
-				}
-				for _, r := range summary.require {
+			// dependencies. In addition, we must load the requirements of any module
+			// that is explicitly marked as unpruned.
+			nextPruning := summary.pruning
+			if pruning == unpruned {
+				nextPruning = unpruned
+			}
+			for _, r := range summary.require {
+				if pruning != pruned || summary.pruning == unpruned || unprune[r] {
 					enqueue(r, nextPruning)
 				}
 			}
 		})
 	}
 
+	mustHaveGoRoot(roots)
 	for _, m := range roots {
 		enqueue(m, pruning)
 	}
@@ -412,7 +447,7 @@
 				reqs, _ := mg.g.RequiredBy(m)
 				for _, r := range reqs {
 					s := module.Version{Path: r.Path, Version: mg.g.Selected(r.Path)}
-					if cmpVersion(s.Version, r.Version) > 0 && !seen[s] {
+					if gover.ModCompare(r.Path, s.Version, r.Version) > 0 && !seen[s] {
 						needsEnqueueing[s] = true
 					}
 				}
@@ -461,7 +496,7 @@
 }
 
 // BuildList returns the selected versions of all modules present in the graph,
-// beginning with Target.
+// beginning with the main modules.
 //
 // The order of the remaining elements in the list is deterministic
 // but arbitrary.
@@ -470,18 +505,18 @@
 // and may rely on it not to be modified.
 func (mg *ModuleGraph) BuildList() []module.Version {
 	mg.buildListOnce.Do(func() {
-		mg.buildList = capVersionSlice(mg.g.BuildList())
+		mg.buildList = slices.Clip(mg.g.BuildList())
 	})
 	return mg.buildList
 }
 
 func (mg *ModuleGraph) findError() error {
 	errStack := mg.g.FindPath(func(m module.Version) bool {
-		cached := mg.loadCache.Get(m)
-		return cached != nil && cached.(summaryError).err != nil
+		_, err := mg.loadCache.Get(m)
+		return err != nil && err != par.ErrCacheEntryNotFound
 	})
 	if len(errStack) > 0 {
-		err := mg.loadCache.Get(errStack[len(errStack)-1]).(summaryError).err
+		_, err := mg.loadCache.Get(errStack[len(errStack)-1])
 		var noUpgrade func(from, to module.Version) bool
 		return mvs.NewBuildListError(err, errStack, noUpgrade)
 	}
@@ -514,10 +549,18 @@
 // Modules are loaded automatically (and lazily) in LoadPackages:
 // LoadModGraph need only be called if LoadPackages is not,
 // typically in commands that care about modules but no particular package.
-func LoadModGraph(ctx context.Context, goVersion string) *ModuleGraph {
-	rs := LoadModFile(ctx)
+func LoadModGraph(ctx context.Context, goVersion string) (*ModuleGraph, error) {
+	rs, err := loadModFile(ctx, nil)
+	if err != nil {
+		return nil, err
+	}
 
 	if goVersion != "" {
+		v, _ := rs.rootSelected("go")
+		if gover.Compare(v, gover.GoStrictVersion) >= 0 && gover.Compare(goVersion, v) < 0 {
+			return nil, fmt.Errorf("requested Go version %s cannot load module graph (requires Go >= %s)", goVersion, v)
+		}
+
 		pruning := pruningForGoVersion(goVersion)
 		if pruning == unpruned && rs.pruning != unpruned {
 			// Use newRequirements instead of convertDepth because convertDepth
@@ -526,21 +569,15 @@
 			rs = newRequirements(unpruned, rs.rootModules, rs.direct)
 		}
 
-		mg, err := rs.Graph(ctx)
-		if err != nil {
-			base.Fatalf("go: %v", err)
-		}
-		return mg
+		return rs.Graph(ctx)
 	}
 
 	rs, mg, err := expandGraph(ctx, rs)
 	if err != nil {
-		base.Fatalf("go: %v", err)
+		return nil, err
 	}
-
 	requirements = rs
-
-	return mg
+	return mg, err
 }
 
 // expandGraph loads the complete module graph from rs.
@@ -608,6 +645,27 @@
 	return changed, err
 }
 
+// OverrideRoots edits the global requirement roots by replacing the specific module versions.
+func OverrideRoots(ctx context.Context, replace []module.Version) {
+	requirements = overrideRoots(ctx, requirements, replace)
+}
+
+func overrideRoots(ctx context.Context, rs *Requirements, replace []module.Version) *Requirements {
+	drop := make(map[string]bool)
+	for _, m := range replace {
+		drop[m.Path] = true
+	}
+	var roots []module.Version
+	for _, m := range rs.rootModules {
+		if !drop[m.Path] {
+			roots = append(roots, m)
+		}
+	}
+	roots = append(roots, replace...)
+	gover.ModSort(roots)
+	return newRequirements(rs.pruning, roots, rs.direct)
+}
+
 // A ConstraintError describes inconsistent constraints in EditBuildList
 type ConstraintError struct {
 	// Conflict lists the source of the conflict for each version in mustSelect
@@ -620,17 +678,90 @@
 	b := new(strings.Builder)
 	b.WriteString("version constraints conflict:")
 	for _, c := range e.Conflicts {
-		fmt.Fprintf(b, "\n\t%v requires %v, but %v is requested", c.Source, c.Dep, c.Constraint)
+		fmt.Fprintf(b, "\n\t%s", c.Summary())
 	}
 	return b.String()
 }
 
-// A Conflict documents that Source requires Dep, which conflicts with Constraint.
-// (That is, Dep has the same module path as Constraint but a higher version.)
+// A Conflict is a path of requirements starting at a root or proposed root in
+// the requirement graph, explaining why that root either causes a module passed
+// in the mustSelect list to EditBuildList to be unattainable, or introduces an
+// unresolvable error in loading the requirement graph.
 type Conflict struct {
-	Source     module.Version
-	Dep        module.Version
+	// Path is a path of requirements starting at some module version passed in
+	// the mustSelect argument and ending at a module whose requirements make that
+	// version unacceptable. (Path always has len ≥ 1.)
+	Path []module.Version
+
+	// If Err is nil, Constraint is a module version passed in the mustSelect
+	// argument that has the same module path as, and a lower version than,
+	// the last element of the Path slice.
 	Constraint module.Version
+
+	// If Constraint is unset, Err is an error encountered when loading the
+	// requirements of the last element in Path.
+	Err error
+}
+
+// UnwrapModuleError returns c.Err, but unwraps it if it is a module.ModuleError
+// with a version and path matching the last entry in the Path slice.
+func (c Conflict) UnwrapModuleError() error {
+	me, ok := c.Err.(*module.ModuleError)
+	if ok && len(c.Path) > 0 {
+		last := c.Path[len(c.Path)-1]
+		if me.Path == last.Path && me.Version == last.Version {
+			return me.Err
+		}
+	}
+	return c.Err
+}
+
+// Summary returns a string that describes only the first and last modules in
+// the conflict path.
+func (c Conflict) Summary() string {
+	if len(c.Path) == 0 {
+		return "(internal error: invalid Conflict struct)"
+	}
+	first := c.Path[0]
+	last := c.Path[len(c.Path)-1]
+	if len(c.Path) == 1 {
+		if c.Err != nil {
+			return fmt.Sprintf("%s: %v", first, c.UnwrapModuleError())
+		}
+		return fmt.Sprintf("%s is above %s", first, c.Constraint.Version)
+	}
+
+	adverb := ""
+	if len(c.Path) > 2 {
+		adverb = "indirectly "
+	}
+	if c.Err != nil {
+		return fmt.Sprintf("%s %srequires %s: %v", first, adverb, last, c.UnwrapModuleError())
+	}
+	return fmt.Sprintf("%s %srequires %s, but %s is requested", first, adverb, last, c.Constraint.Version)
+}
+
+// String returns a string that describes the full conflict path.
+func (c Conflict) String() string {
+	if len(c.Path) == 0 {
+		return "(internal error: invalid Conflict struct)"
+	}
+	b := new(strings.Builder)
+	fmt.Fprintf(b, "%v", c.Path[0])
+	if len(c.Path) == 1 {
+		fmt.Fprintf(b, " found")
+	} else {
+		for _, r := range c.Path[1:] {
+			fmt.Fprintf(b, " requires\n\t%v", r)
+		}
+	}
+	if c.Constraint != (module.Version{}) {
+		fmt.Fprintf(b, ", but %v is requested", c.Constraint.Version)
+	}
+	if c.Err != nil {
+		fmt.Fprintf(b, ": %v", c.UnwrapModuleError())
+	}
+	return b.String()
 }
 
 // tidyRoots trims the root dependencies to the minimal requirements needed to
@@ -639,9 +770,9 @@
 func tidyRoots(ctx context.Context, rs *Requirements, pkgs []*loadPkg) (*Requirements, error) {
 	mainModule := MainModules.mustGetSingleMainModule()
 	if rs.pruning == unpruned {
-		return tidyUnprunedRoots(ctx, mainModule, rs.direct, pkgs)
+		return tidyUnprunedRoots(ctx, mainModule, rs, pkgs)
 	}
-	return tidyPrunedRoots(ctx, mainModule, rs.direct, pkgs)
+	return tidyPrunedRoots(ctx, mainModule, rs, pkgs)
 }
 
 func updateRoots(ctx context.Context, direct map[string]bool, rs *Requirements, pkgs []*loadPkg, add []module.Version, rootsImported bool) (*Requirements, error) {
@@ -687,11 +818,19 @@
 // To ensure that the loading process eventually converges, the caller should
 // add any needed roots from the tidy root set (without removing existing untidy
 // roots) until the set of roots has converged.
-func tidyPrunedRoots(ctx context.Context, mainModule module.Version, direct map[string]bool, pkgs []*loadPkg) (*Requirements, error) {
+func tidyPrunedRoots(ctx context.Context, mainModule module.Version, old *Requirements, pkgs []*loadPkg) (*Requirements, error) {
 	var (
-		roots        []module.Version
-		pathIncluded = map[string]bool{mainModule.Path: true}
+		roots      []module.Version
+		pathIsRoot = map[string]bool{mainModule.Path: true}
 	)
+	if v, ok := old.rootSelected("go"); ok {
+		roots = append(roots, module.Version{Path: "go", Version: v})
+		pathIsRoot["go"] = true
+	}
+	if v, ok := old.rootSelected("toolchain"); ok {
+		roots = append(roots, module.Version{Path: "toolchain", Version: v})
+		pathIsRoot["toolchain"] = true
+	}
 	// We start by adding roots for every package in "all".
 	//
 	// Once that is done, we may still need to add more roots to cover upgraded or
@@ -710,15 +849,15 @@
 		if !pkg.flags.has(pkgInAll) {
 			continue
 		}
-		if pkg.fromExternalModule() && !pathIncluded[pkg.mod.Path] {
+		if pkg.fromExternalModule() && !pathIsRoot[pkg.mod.Path] {
 			roots = append(roots, pkg.mod)
-			pathIncluded[pkg.mod.Path] = true
+			pathIsRoot[pkg.mod.Path] = true
 		}
 		queue = append(queue, pkg)
 		queued[pkg] = true
 	}
-	module.Sort(roots)
-	tidy := newRequirements(pruned, roots, direct)
+	gover.ModSort(roots)
+	tidy := newRequirements(pruned, roots, old.direct)
 
 	for len(queue) > 0 {
 		roots = tidy.rootModules
@@ -744,24 +883,77 @@
 				queue = append(queue, pkg.test)
 				queued[pkg.test] = true
 			}
-			if !pathIncluded[m.Path] {
-				if s := mg.Selected(m.Path); cmpVersion(s, m.Version) < 0 {
+
+			if !pathIsRoot[m.Path] {
+				if s := mg.Selected(m.Path); gover.ModCompare(m.Path, s, m.Version) < 0 {
 					roots = append(roots, m)
+					pathIsRoot[m.Path] = true
 				}
-				pathIncluded[m.Path] = true
 			}
 		}
 
 		if len(roots) > len(tidy.rootModules) {
-			module.Sort(roots)
+			gover.ModSort(roots)
 			tidy = newRequirements(pruned, roots, tidy.direct)
 		}
 	}
 
+	roots = tidy.rootModules
 	_, err := tidy.Graph(ctx)
 	if err != nil {
 		return nil, err
 	}
+
+	// We try to avoid adding explicit requirements for test-only dependencies of
+	// packages in external modules. However, if we drop the explicit
+	// requirements, that may change an import from unambiguous (due to lazy
+	// module loading) to ambiguous (because lazy module loading no longer
+	// disambiguates it). For any package that has become ambiguous, we try
+	// to fix it by promoting its module to an explicit root.
+	// (See https://go.dev/issue/60313.)
+	q := par.NewQueue(runtime.GOMAXPROCS(0))
+	for {
+		var disambiguateRoot sync.Map
+		for _, pkg := range pkgs {
+			if pkg.mod.Path == "" || pathIsRoot[pkg.mod.Path] {
+				// Lazy module loading will cause pkg.mod to be checked before any other modules
+				// that are only indirectly required. It is as unambiguous as possible.
+				continue
+			}
+			pkg := pkg
+			q.Add(func() {
+				skipModFile := true
+				_, _, _, _, err := importFromModules(ctx, pkg.path, tidy, nil, skipModFile)
+				if aie := (*AmbiguousImportError)(nil); errors.As(err, &aie) {
+					disambiguateRoot.Store(pkg.mod, true)
+				}
+			})
+		}
+		<-q.Idle()
+
+		disambiguateRoot.Range(func(k, _ any) bool {
+			m := k.(module.Version)
+			roots = append(roots, m)
+			pathIsRoot[m.Path] = true
+			return true
+		})
+
+		if len(roots) > len(tidy.rootModules) {
+			module.Sort(roots)
+			tidy = newRequirements(pruned, roots, tidy.direct)
+			_, err = tidy.Graph(ctx)
+			if err != nil {
+				return nil, err
+			}
+			// Adding these roots may have pulled additional modules into the module
+			// graph, causing additional packages to become ambiguous. Keep iterating
+			// until we reach a fixed point.
+			continue
+		}
+
+		break
+	}
+
 	return tidy, nil
 }
 
@@ -802,7 +994,7 @@
 //     to the build is required by either the main module or one of the modules
 //     it requires explicitly. This invariant is left up to the caller, who must
 //     not load packages from outside the module graph but may add roots to the
-//     graph, but is facilited by (3). If the caller adds roots to the graph in
+//     graph, but is facilitated by (3). If the caller adds roots to the graph in
 //     order to resolve missing packages, then updatePrunedRoots will retain them,
 //     the selected versions of those roots cannot regress, and they will
 //     eventually be written back to the main module's go.mod file.
@@ -904,14 +1096,14 @@
 	}
 
 	for _, m := range add {
-		if v, ok := rs.rootSelected(m.Path); !ok || cmpVersion(v, m.Version) < 0 {
+		if v, ok := rs.rootSelected(m.Path); !ok || gover.ModCompare(m.Path, v, m.Version) < 0 {
 			roots = append(roots, m)
 			rootsUpgraded = true
 			needSort = true
 		}
 	}
 	if needSort {
-		module.Sort(roots)
+		gover.ModSort(roots)
 	}
 
 	// "Each root appears only once, at the selected version of its path ….”
@@ -1052,7 +1244,7 @@
 			}
 
 			for _, r := range summary.require {
-				if v, ok := rs.rootSelected(r.Path); ok && cmpVersion(v, r.Version) < 0 {
+				if v, ok := rs.rootSelected(r.Path); ok && gover.ModCompare(r.Path, v, r.Version) < 0 {
 					cancel()
 					return
 				}
@@ -1074,7 +1266,7 @@
 // the selected version of every module that provided or lexically could have
 // provided a package in pkgs, and includes the selected version of every such
 // module in direct as a root.
-func tidyUnprunedRoots(ctx context.Context, mainModule module.Version, direct map[string]bool, pkgs []*loadPkg) (*Requirements, error) {
+func tidyUnprunedRoots(ctx context.Context, mainModule module.Version, old *Requirements, pkgs []*loadPkg) (*Requirements, error) {
 	var (
 		// keep is a set of of modules that provide packages or are needed to
 		// disambiguate imports.
@@ -1102,6 +1294,14 @@
 		// without its sum. See #47738.
 		altMods = map[string]string{}
 	)
+	if v, ok := old.rootSelected("go"); ok {
+		keep = append(keep, module.Version{Path: "go", Version: v})
+		keptPath["go"] = true
+	}
+	if v, ok := old.rootSelected("toolchain"); ok {
+		keep = append(keep, module.Version{Path: "toolchain", Version: v})
+		keptPath["toolchain"] = true
+	}
 	for _, pkg := range pkgs {
 		if !pkg.fromExternalModule() {
 			continue
@@ -1109,7 +1309,7 @@
 		if m := pkg.mod; !keptPath[m.Path] {
 			keep = append(keep, m)
 			keptPath[m.Path] = true
-			if direct[m.Path] && !inRootPaths[m.Path] {
+			if old.direct[m.Path] && !inRootPaths[m.Path] {
 				rootPaths = append(rootPaths, m.Path)
 				inRootPaths[m.Path] = true
 			}
@@ -1136,7 +1336,7 @@
 	// in go.mod. See comment on altMods above.
 	keptAltMod := false
 	for _, m := range buildList {
-		if v, ok := altMods[m.Path]; ok && semver.Compare(m.Version, v) < 0 {
+		if v, ok := altMods[m.Path]; ok && gover.ModCompare(m.Path, m.Version, v) < 0 {
 			keep = append(keep, module.Version{Path: m.Path, Version: v})
 			keptAltMod = true
 		}
@@ -1152,7 +1352,7 @@
 		}
 	}
 
-	return newRequirements(unpruned, min, direct), nil
+	return newRequirements(unpruned, min, old.direct), nil
 }
 
 // updateUnprunedRoots returns a set of root requirements that includes the selected
@@ -1254,7 +1454,7 @@
 		roots = append(roots, min...)
 	}
 	if MainModules.Len() > 1 {
-		module.Sort(roots)
+		gover.ModSort(roots)
 	}
 	if rs.pruning == unpruned && reflect.DeepEqual(roots, rs.rootModules) && reflect.DeepEqual(direct, rs.direct) {
 		// The root set is unchanged and rs was already unpruned, so keep rs to
@@ -1271,12 +1471,12 @@
 	if rs.pruning == pruning {
 		return rs, nil
 	} else if rs.pruning == workspace || pruning == workspace {
-		panic("attempthing to convert to/from workspace pruning and another pruning type")
+		panic("attempting to convert to/from workspace pruning and another pruning type")
 	}
 
 	if pruning == unpruned {
 		// We are converting a pruned module to an unpruned one. The roots of a
-		// ppruned module graph are a superset of the roots of an unpruned one, so
+		// pruned module graph are a superset of the roots of an unpruned one, so
 		// we don't need to add any new roots — we just need to drop the ones that
 		// are redundant, which is exactly what updateUnprunedRoots does.
 		return updateUnprunedRoots(ctx, rs.direct, rs, nil)
diff --git a/src/cmd/go/internal/modload/edit.go b/src/cmd/go/internal/modload/edit.go
index f6937a4..63ee15c 100644
--- a/src/cmd/go/internal/modload/edit.go
+++ b/src/cmd/go/internal/modload/edit.go
@@ -5,13 +5,18 @@
 package modload
 
 import (
+	"cmd/go/internal/cfg"
+	"cmd/go/internal/gover"
 	"cmd/go/internal/mvs"
+	"cmd/go/internal/par"
 	"context"
-	"reflect"
-	"sort"
+	"errors"
+	"fmt"
+	"maps"
+	"os"
+	"slices"
 
 	"golang.org/x/mod/module"
-	"golang.org/x/mod/semver"
 )
 
 // editRequirements returns an edited version of rs such that:
@@ -20,73 +25,500 @@
 //
 //  2. Each module version in tryUpgrade is upgraded toward the indicated
 //     version as far as can be done without violating (1).
+//     (Other upgrades are also allowed if they are caused by
+//     transitive requirements of versions in mustSelect or
+//     tryUpgrade.)
 //
 //  3. Each module version in rs.rootModules (or rs.graph, if rs is unpruned)
-//     is downgraded from its original version only to the extent needed to
-//     satisfy (1), or upgraded only to the extent needed to satisfy (1) and
-//     (2).
-//
-//  4. No module is upgraded above the maximum version of its path found in the
-//     dependency graph of rs, the combined dependency graph of the versions in
-//     mustSelect, or the dependencies of each individual module version in
-//     tryUpgrade.
+//     is downgraded or upgraded from its original version only to the extent
+//     needed to satisfy (1) and (2).
 //
 // Generally, the module versions in mustSelect are due to the module or a
 // package within the module matching an explicit command line argument to 'go
 // get', and the versions in tryUpgrade are transitive dependencies that are
 // either being upgraded by 'go get -u' or being added to satisfy some
 // otherwise-missing package import.
+//
+// If pruning is enabled, the roots of the edited requirements include an
+// explicit entry for each module path in tryUpgrade, mustSelect, and the roots
+// of rs, unless the selected version for the module path is "none".
 func editRequirements(ctx context.Context, rs *Requirements, tryUpgrade, mustSelect []module.Version) (edited *Requirements, changed bool, err error) {
-	limiter, err := limiterForEdit(ctx, rs, tryUpgrade, mustSelect)
-	if err != nil {
-		return rs, false, err
+	if rs.pruning == workspace {
+		panic("editRequirements cannot edit workspace requirements")
 	}
 
-	var conflicts []Conflict
+	orig := rs
+	// If we already know what go version we will end up on after the edit, and
+	// the pruning for that version is different, go ahead and apply it now.
+	//
+	// If we are changing from pruned to unpruned, then we MUST check the unpruned
+	// graph for conflicts from the start. (Checking only for pruned conflicts
+	// would miss some that would be introduced later.)
+	//
+	// If we are changing from unpruned to pruned, then we would like to avoid
+	// unnecessary downgrades due to conflicts that would be pruned out of the
+	// final graph anyway.
+	//
+	// Note that even if we don't find a go version in mustSelect, it is possible
+	// that we will switch from unpruned to pruned (but not the other way around!)
+	// after applying the edits if we find a dependency that requires a high
+	// enough go version to trigger an upgrade.
+	rootPruning := orig.pruning
 	for _, m := range mustSelect {
-		conflict, err := limiter.Select(m)
+		if m.Path == "go" {
+			rootPruning = pruningForGoVersion(m.Version)
+			break
+		} else if m.Path == "toolchain" && pruningForGoVersion(gover.FromToolchain(m.Version)) == unpruned {
+			// We don't know exactly what go version we will end up at, but we know
+			// that it must be a version supported by the requested toolchain, and
+			// that toolchain does not support pruning.
+			//
+			// TODO(bcmills): 'go get' ought to reject explicit toolchain versions
+			// older than gover.GoStrictVersion. Once that is fixed, is this still
+			// needed?
+			rootPruning = unpruned
+			break
+		}
+	}
+
+	if rootPruning != rs.pruning {
+		rs, err = convertPruning(ctx, rs, rootPruning)
 		if err != nil {
-			return rs, false, err
-		}
-		if conflict.Path != "" {
-			conflicts = append(conflicts, Conflict{
-				Source: m,
-				Dep:    conflict,
-				Constraint: module.Version{
-					Path:    conflict.Path,
-					Version: limiter.max[conflict.Path],
-				},
-			})
+			return orig, false, err
 		}
 	}
-	if len(conflicts) > 0 {
-		return rs, false, &ConstraintError{Conflicts: conflicts}
-	}
 
-	mods, changed, err := selectPotentiallyImportedModules(ctx, limiter, rs, tryUpgrade)
-	if err != nil {
-		return rs, false, err
-	}
-
-	var roots []module.Version
-	if rs.pruning == unpruned {
+	// selectedRoot records the edited version (possibly "none") for each module
+	// path that would be a root in the edited requirements.
+	var selectedRoot map[string]string // module path → edited version
+	if rootPruning == pruned {
+		selectedRoot = maps.Clone(rs.maxRootVersion)
+	} else {
 		// In a module without graph pruning, modules that provide packages imported
 		// by the main module may either be explicit roots or implicit transitive
-		// dependencies. We promote the modules in mustSelect to be explicit
-		// requirements.
+		// dependencies. To the extent possible, we want to preserve those implicit
+		// dependencies, so we need to treat everything in the build list as
+		// potentially relevant — that is, as what would be a “root” in a module
+		// with graph pruning enabled.
+		mg, err := rs.Graph(ctx)
+		if err != nil {
+			// If we couldn't load the graph, we don't know what its requirements were
+			// to begin with, so we can't edit those requirements in a coherent way.
+			return orig, false, err
+		}
+		bl := mg.BuildList()[MainModules.Len():]
+		selectedRoot = make(map[string]string, len(bl))
+		for _, m := range bl {
+			selectedRoot[m.Path] = m.Version
+		}
+	}
+
+	for _, r := range tryUpgrade {
+		if v, ok := selectedRoot[r.Path]; ok && gover.ModCompare(r.Path, v, r.Version) >= 0 {
+			continue
+		}
+		if cfg.BuildV {
+			fmt.Fprintf(os.Stderr, "go: trying upgrade to %v\n", r)
+		}
+		selectedRoot[r.Path] = r.Version
+	}
+
+	// conflicts is a list of conflicts that we cannot resolve without violating
+	// some version in mustSelect. It may be incomplete, but we want to report
+	// as many conflicts as we can so that the user can solve more of them at once.
+	var conflicts []Conflict
+
+	// mustSelectVersion is an index of the versions in mustSelect.
+	mustSelectVersion := make(map[string]string, len(mustSelect))
+	for _, r := range mustSelect {
+		if v, ok := mustSelectVersion[r.Path]; ok && v != r.Version {
+			prev := module.Version{Path: r.Path, Version: v}
+			if gover.ModCompare(r.Path, v, r.Version) > 0 {
+				conflicts = append(conflicts, Conflict{Path: []module.Version{prev}, Constraint: r})
+			} else {
+				conflicts = append(conflicts, Conflict{Path: []module.Version{r}, Constraint: prev})
+			}
+			continue
+		}
+
+		mustSelectVersion[r.Path] = r.Version
+		selectedRoot[r.Path] = r.Version
+	}
+
+	// We've indexed all of the data we need and we've computed the initial
+	// versions of the roots. Now we need to load the actual module graph and
+	// restore the invariant that every root is the selected version of its path.
+	//
+	// For 'go mod tidy' we would do that using expandGraph, which upgrades the
+	// roots until their requirements are internally consistent and then drops out
+	// the old roots. However, here we need to do more: we also need to make sure
+	// the modules in mustSelect don't get upgraded above their intended versions.
+	// To do that, we repeatedly walk the module graph, identify paths of
+	// requirements that result in versions that are too high, and downgrade the
+	// roots that lead to those paths. When no conflicts remain, we're done.
+	//
+	// Since we want to report accurate paths to each conflict, we don't drop out
+	// older-than-selected roots until the process completes. That might mean that
+	// we do some extra downgrades when they could be skipped, but for the benefit
+	// of being able to explain the reason for every downgrade that seems
+	// worthwhile.
+	//
+	// Graph pruning adds an extra wrinkle: a given node in the module graph
+	// may be reached from a root whose dependencies are pruned, and from a root
+	// whose dependencies are not pruned. It may be the case that the path from
+	// the unpruned root leads to a conflict, while the path from the pruned root
+	// prunes out the requirements that would lead to that conflict.
+	// So we need to track the two kinds of paths independently.
+	// They join back together at the roots of the graph: if a root r1 with pruned
+	// requirements depends on a root r2 with unpruned requirements, then
+	// selecting r1 would cause r2 to become a root and pull in all of its
+	// unpruned dependencies.
+	//
+	// The dqTracker type implements the logic for propagating conflict paths
+	// through the pruned and unpruned parts of the module graph.
+	//
+	// We make a best effort to fix incompatibilities, subject to two properties:
+	//
+	// 	1. If the user runs 'go get' with a set of mutually-compatible module
+	// 	versions, we should accept those versions.
+	//
+	// 	2. If we end up upgrading or downgrading a module, it should be
+	// 	clear why we did so.
+	//
+	// We don't try to find an optimal SAT solution,
+	// especially given the complex interactions with graph pruning.
+
+	var (
+		roots      []module.Version // the current versions in selectedRoot, in sorted order
+		rootsDirty = true           // true if roots does not match selectedRoot
+	)
+
+	// rejectedRoot records the set of module versions that have been disqualified
+	// as roots of the module graph. When downgrading due to a conflict or error,
+	// we skip any version that has already been rejected.
+	//
+	// NOTE(bcmills): I am not sure that the rejectedRoot map is really necessary,
+	// since we normally only downgrade roots or accept indirect upgrades to
+	// known-good versions. However, I am having trouble proving that accepting an
+	// indirect upgrade never introduces a conflict that leads to further
+	// downgrades. I really want to be able to prove that editRequirements
+	// terminates, and the easiest way to prove it is to add this map.
+	//
+	// Then the proof of termination is this:
+	// On every iteration where we mark the roots as dirty, we add some new module
+	// version to the map. The universe of module versions is finite, so we must
+	// eventually reach a state in which we do not add any version to the map.
+	// In that state, we either report a conflict or succeed in the edit.
+	rejectedRoot := map[module.Version]bool{}
+
+	for rootsDirty && len(conflicts) == 0 {
+		roots = roots[:0]
+		for p, v := range selectedRoot {
+			if v != "none" {
+				roots = append(roots, module.Version{Path: p, Version: v})
+			}
+		}
+		gover.ModSort(roots)
+
+		// First, we extend the graph so that it includes the selected version
+		// of every root. The upgraded roots are in addition to the original
+		// roots, so we will have enough information to trace a path to each
+		// conflict we discover from one or more of the original roots.
+		mg, upgradedRoots, err := extendGraph(ctx, rootPruning, roots, selectedRoot)
+		if err != nil {
+			var tooNew *gover.TooNewError
+			if mg == nil || errors.As(err, &tooNew) {
+				return orig, false, err
+			}
+			// We're about to walk the entire extended module graph, so we will find
+			// any error then — and we will either try to resolve it by downgrading
+			// something or report it as a conflict with more detail.
+		}
+
+		// extendedRootPruning is an index of the pruning used to load each root in
+		// the extended module graph.
+		extendedRootPruning := make(map[module.Version]modPruning, len(roots)+len(upgradedRoots))
+		findPruning := func(m module.Version) modPruning {
+			if rootPruning == pruned {
+				summary, _ := mg.loadCache.Get(m)
+				if summary != nil && summary.pruning == unpruned {
+					return unpruned
+				}
+			}
+			return rootPruning
+		}
+		for _, m := range roots {
+			extendedRootPruning[m] = findPruning(m)
+		}
+		for m := range upgradedRoots {
+			extendedRootPruning[m] = findPruning(m)
+		}
+
+		// Now check the resulting extended graph for errors and incompatibilities.
+		t := dqTracker{extendedRootPruning: extendedRootPruning}
+		mg.g.WalkBreadthFirst(func(m module.Version) {
+			if max, ok := mustSelectVersion[m.Path]; ok && gover.ModCompare(m.Path, m.Version, max) > 0 {
+				// m itself violates mustSelect, so it cannot appear in the module graph
+				// even if its transitive dependencies would be pruned out.
+				t.disqualify(m, pruned, dqState{dep: m})
+				return
+			}
+
+			summary, err := mg.loadCache.Get(m)
+			if err != nil && err != par.ErrCacheEntryNotFound {
+				// We can't determine the requirements of m, so we don't know whether
+				// they would be allowed. This may be a transient error reaching the
+				// repository, rather than a permanent error with the retrieved version.
+				//
+				// TODO(golang.org/issue/31730, golang.org/issue/30134):
+				// decide what to do based on the actual error.
+				t.disqualify(m, pruned, dqState{err: err})
+				return
+			}
+
+			reqs, ok := mg.RequiredBy(m)
+			if !ok {
+				// The dependencies of m do not appear in the module graph, so they
+				// can't be causing any problems this time.
+				return
+			}
+
+			if summary == nil {
+				if m.Version != "" {
+					panic(fmt.Sprintf("internal error: %d reqs present for %v, but summary is nil", len(reqs), m))
+				}
+				// m is the main module: we are editing its dependencies, so it cannot
+				// become disqualified.
+				return
+			}
+
+			// Before we check for problems due to transitive dependencies, first
+			// check m's direct requirements. A requirement on a version r that
+			// violates mustSelect disqualifies m, even if the requirements of r are
+			// themselves pruned out.
+			for _, r := range reqs {
+				if max, ok := mustSelectVersion[r.Path]; ok && gover.ModCompare(r.Path, r.Version, max) > 0 {
+					t.disqualify(m, pruned, dqState{dep: r})
+					return
+				}
+			}
+			for _, r := range reqs {
+				if !t.require(m, r) {
+					break
+				}
+			}
+		})
+
+		// We have now marked all of the versions in the graph that have conflicts,
+		// with a path to each conflict from one or more roots that introduce it.
+		// Now we need to identify those roots and change their versions
+		// (if possible) in order to resolve the conflicts.
+		rootsDirty = false
+		for _, m := range roots {
+			path, err := t.path(m, extendedRootPruning[m])
+			if len(path) == 0 && err == nil {
+				continue // Nothing wrong with m; we can keep it.
+			}
+
+			// path leads to a module with a problem: either it violates a constraint,
+			// or some error prevents us from determining whether it violates a
+			// constraint. We might end up logging or returning the conflict
+			// information, so go ahead and fill in the details about it.
+			conflict := Conflict{
+				Path: path,
+				Err:  err,
+			}
+			if err == nil {
+				var last module.Version = path[len(path)-1]
+				mustV, ok := mustSelectVersion[last.Path]
+				if !ok {
+					fmt.Fprintf(os.Stderr, "go: %v\n", conflict)
+					panic("internal error: found a version conflict, but no constraint it violates")
+				}
+				conflict.Constraint = module.Version{
+					Path:    last.Path,
+					Version: mustV,
+				}
+			}
+
+			if v, ok := mustSelectVersion[m.Path]; ok && v == m.Version {
+				// m is in mustSelect, but is marked as disqualified due to a transitive
+				// dependency.
+				//
+				// In theory we could try removing module paths that don't appear in
+				// mustSelect (added by tryUpgrade or already present in rs) in order to
+				// get graph pruning to take effect, but (a) it is likely that 'go mod
+				// tidy' would re-add those roots and reintroduce unwanted upgrades,
+				// causing confusion, and (b) deciding which roots to try to eliminate
+				// would add a lot of complexity.
+				//
+				// Instead, we report the path to the conflict as an error.
+				// If users want to explicitly prune out nodes from the dependency
+				// graph, they can always add an explicit 'exclude' directive.
+				conflicts = append(conflicts, conflict)
+				continue
+			}
+
+			// If m is not the selected version of its path, we have two options: we
+			// can either upgrade to the version that actually is selected (dropping m
+			// itself out of the bottom of the module graph), or we can try
+			// downgrading it.
+			//
+			// If the version we would be upgrading to is ok to use, we will just plan
+			// to do that and avoid the overhead of trying to find some lower version
+			// to downgrade to.
+			//
+			// However, it is possible that m depends on something that leads to its
+			// own upgrade, so if the upgrade isn't viable we should go ahead and try
+			// to downgrade (like with any other root).
+			if v := mg.Selected(m.Path); v != m.Version {
+				u := module.Version{Path: m.Path, Version: v}
+				uPruning, ok := t.extendedRootPruning[m]
+				if !ok {
+					fmt.Fprintf(os.Stderr, "go: %v\n", conflict)
+					panic(fmt.Sprintf("internal error: selected version of root %v is %v, but it was not expanded as a new root", m, u))
+				}
+				if !t.check(u, uPruning).isDisqualified() && !rejectedRoot[u] {
+					// Applying the upgrade from m to u will resolve the conflict,
+					// so plan to do that if there are no other conflicts to resolve.
+					continue
+				}
+			}
+
+			// Figure out what version of m's path was present before we started
+			// the edit. We want to make sure we consider keeping it as-is,
+			// even if it wouldn't normally be included. (For example, it might
+			// be a pseudo-version or pre-release.)
+			origMG, _ := orig.Graph(ctx)
+			origV := origMG.Selected(m.Path)
+
+			if conflict.Err != nil && origV == m.Version {
+				// This version of m.Path was already in the module graph before we
+				// started editing, and the problem with it is that we can't load its
+				// (transitive) requirements.
+				//
+				// If this conflict was just one step in a longer chain of downgrades,
+				// then we would want to keep going past it until we find a version
+				// that doesn't have that problem. However, we only want to downgrade
+				// away from an *existing* requirement if we can confirm that it actually
+				// conflicts with mustSelect. (For example, we don't want
+				// 'go get -u ./...' to incidentally downgrade some dependency whose
+				// go.mod file is unavailable or has a bad checksum.)
+				conflicts = append(conflicts, conflict)
+				continue
+			}
+
+			// We need to downgrade m's path to some lower version to try to resolve
+			// the conflict. Find the next-lowest candidate and apply it.
+			rejectedRoot[m] = true
+			prev := m
+			for {
+				prev, err = previousVersion(ctx, prev)
+				if gover.ModCompare(m.Path, m.Version, origV) > 0 && (gover.ModCompare(m.Path, prev.Version, origV) < 0 || err != nil) {
+					// previousVersion skipped over origV. Insert it into the order.
+					prev.Version = origV
+				} else if err != nil {
+					// We don't know the next downgrade to try. Give up.
+					return orig, false, err
+				}
+				if rejectedRoot[prev] {
+					// We already rejected prev in a previous round.
+					// To ensure that this algorithm terminates, don't try it again.
+					continue
+				}
+				pruning := rootPruning
+				if pruning == pruned {
+					if summary, err := mg.loadCache.Get(m); err == nil {
+						pruning = summary.pruning
+					}
+				}
+				if t.check(prev, pruning).isDisqualified() {
+					// We found a problem with prev this round that would also disqualify
+					// it as a root. Don't bother trying it next round.
+					rejectedRoot[prev] = true
+					continue
+				}
+				break
+			}
+			selectedRoot[m.Path] = prev.Version
+			rootsDirty = true
+
+			// If this downgrade is potentially interesting, log the reason for it.
+			if conflict.Err != nil || cfg.BuildV {
+				var action string
+				if prev.Version == "none" {
+					action = fmt.Sprintf("removing %s", m)
+				} else if prev.Version == origV {
+					action = fmt.Sprintf("restoring %s", prev)
+				} else {
+					action = fmt.Sprintf("trying %s", prev)
+				}
+				fmt.Fprintf(os.Stderr, "go: %s\n\t%s\n", conflict.Summary(), action)
+			}
+		}
+		if rootsDirty {
+			continue
+		}
+
+		// We didn't resolve any issues by downgrading, but we may still need to
+		// resolve some conflicts by locking in upgrades. Do that now.
+		//
+		// We don't do these upgrades until we're done downgrading because the
+		// downgrade process might reveal or remove conflicts (by changing which
+		// requirement edges are pruned out).
+		var upgradedFrom []module.Version // for logging only
+		for p, v := range selectedRoot {
+			if _, ok := mustSelectVersion[p]; !ok {
+				if actual := mg.Selected(p); actual != v {
+					if cfg.BuildV {
+						upgradedFrom = append(upgradedFrom, module.Version{Path: p, Version: v})
+					}
+					selectedRoot[p] = actual
+					// Accepting the upgrade to m.Path might cause the selected versions
+					// of other modules to fall, because they were being increased by
+					// dependencies of m that are no longer present in the graph.
+					//
+					// TODO(bcmills): Can removing m as a root also cause the selected
+					// versions of other modules to rise? I think not: we're strictly
+					// removing non-root nodes from the module graph, which can't cause
+					// any root to decrease (because they're roots), and the dependencies
+					// of non-roots don't matter because they're either always unpruned or
+					// always pruned out.
+					//
+					// At any rate, it shouldn't cost much to reload the module graph one
+					// last time and confirm that it is stable.
+					rootsDirty = true
+				}
+			}
+		}
+		if rootsDirty {
+			if cfg.BuildV {
+				gover.ModSort(upgradedFrom) // Make logging deterministic.
+				for _, m := range upgradedFrom {
+					fmt.Fprintf(os.Stderr, "go: accepting indirect upgrade from %v to %s\n", m, selectedRoot[m.Path])
+				}
+			}
+			continue
+		}
+		break
+	}
+	if len(conflicts) > 0 {
+		return orig, false, &ConstraintError{Conflicts: conflicts}
+	}
+
+	if rootPruning == unpruned {
+		// An unpruned go.mod file lists only a subset of the requirements needed
+		// for building packages. Figure out which requirements need to be explicit.
 		var rootPaths []string
+
+		// The modules in mustSelect are always promoted to be explicit.
 		for _, m := range mustSelect {
 			if m.Version != "none" && !MainModules.Contains(m.Path) {
 				rootPaths = append(rootPaths, m.Path)
 			}
 		}
-		if !changed && len(rootPaths) == 0 {
-			// The build list hasn't changed and we have no new roots to add.
-			// We don't need to recompute the minimal roots for the module.
-			return rs, false, nil
-		}
 
-		for _, m := range mods {
+		for _, m := range roots {
 			if v, ok := rs.rootSelected(m.Path); ok && (v == m.Version || rs.direct[m.Path]) {
 				// m.Path was formerly a root, and either its version hasn't changed or
 				// we believe that it provides a package directly imported by a package
@@ -98,25 +530,27 @@
 			}
 		}
 
-		roots, err = mvs.Req(MainModules.mustGetSingleMainModule(), rootPaths, &mvsReqs{roots: mods})
+		roots, err = mvs.Req(MainModules.mustGetSingleMainModule(), rootPaths, &mvsReqs{roots: roots})
 		if err != nil {
 			return nil, false, err
 		}
-	} else {
-		// In a module with a pruned graph, every module that provides a package
-		// imported by the main module must be retained as a root.
-		roots = mods
-		if !changed {
-			// Because the roots we just computed are unchanged, the entire graph must
-			// be the same as it was before. Save the original rs, since we have
-			// probably already loaded its requirement graph.
-			return rs, false, nil
-		}
+	}
+
+	changed = rootPruning != orig.pruning || !slices.Equal(roots, orig.rootModules)
+	if !changed {
+		// Because the roots we just computed are unchanged, the entire graph must
+		// be the same as it was before. Save the original rs, since we have
+		// probably already loaded its requirement graph.
+		return orig, false, nil
 	}
 
 	// A module that is not even in the build list necessarily cannot provide
 	// any imported packages. Mark as direct only the direct modules that are
-	// still in the build list.
+	// still in the build list. (We assume that any module path that provided a
+	// direct import before the edit continues to do so after. There are a few
+	// edge cases where that can change, such as if a package moves into or out of
+	// a nested module or disappears entirely. If that happens, the user can run
+	// 'go mod tidy' to clean up the direct/indirect annotations.)
 	//
 	// TODO(bcmills): Would it make more sense to leave the direct map as-is
 	// but allow it to refer to modules that are no longer in the build list?
@@ -127,329 +561,139 @@
 			direct[m.Path] = true
 		}
 	}
-	return newRequirements(rs.pruning, roots, direct), changed, nil
-}
+	edited = newRequirements(rootPruning, roots, direct)
 
-// limiterForEdit returns a versionLimiter with its max versions set such that
-// the max version for every module path in mustSelect is the version listed
-// there, and the max version for every other module path is the maximum version
-// of its path found in the dependency graph of rs, the combined dependency
-// graph of the versions in mustSelect, or the dependencies of each individual
-// module version in tryUpgrade.
-func limiterForEdit(ctx context.Context, rs *Requirements, tryUpgrade, mustSelect []module.Version) (*versionLimiter, error) {
-	mg, err := rs.Graph(ctx)
-	if err != nil {
-		return nil, err
-	}
-
-	maxVersion := map[string]string{} // module path → version
-	restrictTo := func(m module.Version) {
-		v, ok := maxVersion[m.Path]
-		if !ok || cmpVersion(v, m.Version) > 0 {
-			maxVersion[m.Path] = m.Version
-		}
-	}
-
-	if rs.pruning == unpruned {
-		// go.mod files that do not support graph pruning don't indicate which
-		// transitive dependencies are actually relevant to the main module, so we
-		// have to assume that any module that could have provided any package —
-		// that is, any module whose selected version was not "none" — may be
-		// relevant.
-		for _, m := range mg.BuildList() {
-			restrictTo(m)
-		}
-	} else {
-		// The go.mod file explicitly records every module that provides a package
-		// imported by the main module.
-		//
-		// If we need to downgrade an existing root or a new root found in
-		// tryUpgrade, we don't want to allow that downgrade to incidentally upgrade
-		// a module imported by the main module to some arbitrary version.
-		// However, we don't particularly care about arbitrary upgrades to modules
-		// that are (at best) only providing packages imported by tests of
-		// dependencies outside the main module.
-		for _, m := range rs.rootModules {
-			restrictTo(module.Version{
-				Path:    m.Path,
-				Version: mg.Selected(m.Path),
-			})
-		}
-	}
-
-	if err := raiseLimitsForUpgrades(ctx, maxVersion, rs.pruning, tryUpgrade, mustSelect); err != nil {
-		return nil, err
-	}
-
-	// The versions in mustSelect override whatever we would naively select —
-	// we will downgrade other modules as needed in order to meet them.
-	for _, m := range mustSelect {
-		restrictTo(m)
-	}
-
-	return newVersionLimiter(rs.pruning, maxVersion), nil
-}
-
-// raiseLimitsForUpgrades increases the module versions in maxVersions to the
-// versions that would be needed to allow each of the modules in tryUpgrade
-// (individually or in any combination) and all of the modules in mustSelect
-// (simultaneously) to be added as roots.
-//
-// Versions not present in maxVersion are unrestricted, and it is assumed that
-// they will not be promoted to root requirements (and thus will not contribute
-// their own dependencies if the main module supports graph pruning).
-//
-// These limits provide an upper bound on how far a module may be upgraded as
-// part of an incidental downgrade, if downgrades are needed in order to select
-// the versions in mustSelect.
-func raiseLimitsForUpgrades(ctx context.Context, maxVersion map[string]string, pruning modPruning, tryUpgrade []module.Version, mustSelect []module.Version) error {
-	// allow raises the limit for m.Path to at least m.Version.
-	// If m.Path was already unrestricted, it remains unrestricted.
-	allow := func(m module.Version) {
-		v, ok := maxVersion[m.Path]
-		if !ok {
-			return // m.Path is unrestricted.
-		}
-		if cmpVersion(v, m.Version) < 0 {
-			maxVersion[m.Path] = m.Version
-		}
-	}
-
-	var (
-		unprunedUpgrades []module.Version
-		isPrunedRootPath map[string]bool
-	)
-	if pruning == unpruned {
-		unprunedUpgrades = tryUpgrade
-	} else {
-		isPrunedRootPath = make(map[string]bool, len(maxVersion))
-		for p := range maxVersion {
-			isPrunedRootPath[p] = true
-		}
-		for _, m := range tryUpgrade {
-			isPrunedRootPath[m.Path] = true
-		}
-		for _, m := range mustSelect {
-			isPrunedRootPath[m.Path] = true
-		}
-
-		allowedRoot := map[module.Version]bool{}
-
-		var allowRoot func(m module.Version) error
-		allowRoot = func(m module.Version) error {
-			if allowedRoot[m] {
-				return nil
-			}
-			allowedRoot[m] = true
-
-			if MainModules.Contains(m.Path) {
-				// The main module versions are already considered to be higher than any
-				// possible m, so m cannot be selected as a root and there is no point
-				// scanning its dependencies.
-				return nil
-			}
-
-			allow(m)
-
-			summary, err := goModSummary(m)
+	// If we ended up adding a dependency that upgrades our go version far enough
+	// to activate pruning, we must convert the edited Requirements in order to
+	// avoid dropping transitive dependencies from the build list the next time
+	// someone uses the updated go.mod file.
+	//
+	// Note that it isn't possible to go in the other direction (from pruned to
+	// unpruned) unless the "go" or "toolchain" module is explicitly listed in
+	// mustSelect, which we already handled at the very beginning of the edit.
+	// That is because the virtual "go" module only requires a "toolchain",
+	// and the "toolchain" module never requires anything else, which means that
+	// those two modules will never be downgraded due to a conflict with any other
+	// constraint.
+	if rootPruning == unpruned {
+		if v, ok := edited.rootSelected("go"); ok && pruningForGoVersion(v) == pruned {
+			// Since we computed the edit with the unpruned graph, and the pruned
+			// graph is a strict subset of the unpruned graph, this conversion
+			// preserves the exact (edited) build list that we already computed.
+			//
+			// However, it does that by shoving the whole build list into the roots of
+			// the graph. 'go get' will check for that sort of transition and log a
+			// message reminding the user how to clean up this mess we're about to
+			// make. 😅
+			edited, err = convertPruning(ctx, edited, pruned)
 			if err != nil {
-				return err
-			}
-			if summary.pruning == unpruned {
-				// For efficiency, we'll load all of the unpruned upgrades as one big
-				// graph, rather than loading the (potentially-overlapping) subgraph for
-				// each upgrade individually.
-				unprunedUpgrades = append(unprunedUpgrades, m)
-				return nil
-			}
-			for _, r := range summary.require {
-				if isPrunedRootPath[r.Path] {
-					// r could become a root as the result of an upgrade or downgrade,
-					// in which case its dependencies will not be pruned out.
-					// We need to allow those dependencies to be upgraded too.
-					if err := allowRoot(r); err != nil {
-						return err
-					}
-				} else {
-					// r will not become a root, so its dependencies don't matter.
-					// Allow only r itself.
-					allow(r)
-				}
-			}
-			return nil
-		}
-
-		for _, m := range tryUpgrade {
-			allowRoot(m)
-		}
-	}
-
-	if len(unprunedUpgrades) > 0 {
-		// Compute the max versions for unpruned upgrades all together.
-		// Since these modules are unpruned, we'll end up scanning all of their
-		// transitive dependencies no matter which versions end up selected,
-		// and since we have a large dependency graph to scan we might get
-		// a significant benefit from not revisiting dependencies that are at
-		// common versions among multiple upgrades.
-		upgradeGraph, err := readModGraph(ctx, unpruned, unprunedUpgrades)
-		if err != nil {
-			// Compute the requirement path from a module path in tryUpgrade to the
-			// error, and the requirement path (if any) from rs.rootModules to the
-			// tryUpgrade module path. Return a *mvs.BuildListError showing the
-			// concatenation of the paths (with an upgrade in the middle).
-			return err
-		}
-
-		for _, r := range upgradeGraph.BuildList() {
-			// Upgrading to m would upgrade to r, and the caller requested that we
-			// try to upgrade to m, so it's ok to upgrade to r.
-			allow(r)
-		}
-	}
-
-	// Explicitly allow any (transitive) upgrades implied by mustSelect.
-	nextRoots := append([]module.Version(nil), mustSelect...)
-	for nextRoots != nil {
-		module.Sort(nextRoots)
-		rs := newRequirements(pruning, nextRoots, nil)
-		nextRoots = nil
-
-		rs, mustGraph, err := expandGraph(ctx, rs)
-		if err != nil {
-			return err
-		}
-
-		for _, r := range mustGraph.BuildList() {
-			// Some module in mustSelect requires r, so we must allow at least
-			// r.Version (unless it conflicts with another entry in mustSelect, in
-			// which case we will error out either way).
-			allow(r)
-
-			if isPrunedRootPath[r.Path] {
-				if v, ok := rs.rootSelected(r.Path); ok && r.Version == v {
-					// r is already a root, so its requirements are already included in
-					// the build list.
-					continue
-				}
-
-				// The dependencies in mustSelect may upgrade (or downgrade) an existing
-				// root to match r, which will remain as a root. However, since r is not
-				// a root of rs, its dependencies have been pruned out of this build
-				// list. We need to add it back explicitly so that we allow any
-				// transitive upgrades that r will pull in.
-				if nextRoots == nil {
-					nextRoots = rs.rootModules // already capped
-				}
-				nextRoots = append(nextRoots, r)
+				return orig, false, err
 			}
 		}
 	}
-
-	return nil
+	return edited, true, nil
 }
 
-// selectPotentiallyImportedModules increases the limiter-selected version of
-// every module in rs that potentially provides a package imported (directly or
-// indirectly) by the main module, and every module in tryUpgrade, toward the
-// highest version seen in rs or tryUpgrade, but not above the maximums enforced
-// by the limiter.
+// extendGraph loads the module graph from roots, and iteratively extends it by
+// unpruning the selected version of each module path that is a root in rs or in
+// the roots slice until the graph reaches a fixed point.
 //
-// It returns the list of module versions selected by the limiter, sorted by
-// path, along with a boolean indicating whether that list is different from the
-// list of modules read from rs.
-func selectPotentiallyImportedModules(ctx context.Context, limiter *versionLimiter, rs *Requirements, tryUpgrade []module.Version) (mods []module.Version, changed bool, err error) {
-	for _, m := range tryUpgrade {
-		if err := limiter.UpgradeToward(ctx, m); err != nil {
-			return nil, false, err
-		}
-	}
+// The graph is guaranteed to converge to a fixed point because unpruning a
+// module version can only increase (never decrease) the selected versions,
+// and the set of versions for each module is finite.
+//
+// The extended graph is useful for diagnosing version conflicts: for each
+// selected module version, it can provide a complete path of requirements from
+// some root to that version.
+func extendGraph(ctx context.Context, rootPruning modPruning, roots []module.Version, selectedRoot map[string]string) (mg *ModuleGraph, upgradedRoot map[module.Version]bool, err error) {
+	for {
+		mg, err = readModGraph(ctx, rootPruning, roots, upgradedRoot)
+		// We keep on going even if err is non-nil until we reach a steady state.
+		// (Note that readModGraph returns a non-nil *ModuleGraph even in case of
+		// errors.) The caller may be able to fix the errors by adjusting versions,
+		// so we really want to return as complete a result as we can.
 
-	var initial []module.Version
-	if rs.pruning == unpruned {
-		mg, err := rs.Graph(ctx)
-		if err != nil {
-			return nil, false, err
+		if rootPruning == unpruned {
+			// Everything is already unpruned, so there isn't anything we can do to
+			// extend it further.
+			break
 		}
-		initial = mg.BuildList()[MainModules.Len():]
-	} else {
-		initial = rs.rootModules
-	}
-	for _, m := range initial {
-		if err := limiter.UpgradeToward(ctx, m); err != nil {
-			return nil, false, err
-		}
-	}
 
-	mods = make([]module.Version, 0, len(limiter.selected))
-	for path, v := range limiter.selected {
-		if v != "none" && !MainModules.Contains(path) {
-			mods = append(mods, module.Version{Path: path, Version: v})
-		}
-	}
-
-	// We've identified acceptable versions for each of the modules, but those
-	// versions are not necessarily consistent with each other: one upgraded or
-	// downgraded module may require a higher (but still allowed) version of
-	// another. The lower version may require extraneous dependencies that aren't
-	// actually relevant, so we need to compute the actual selected versions.
-	mg, err := readModGraph(ctx, rs.pruning, mods)
-	if err != nil {
-		return nil, false, err
-	}
-	mods = make([]module.Version, 0, len(limiter.selected))
-	for path, _ := range limiter.selected {
-		if !MainModules.Contains(path) {
-			if v := mg.Selected(path); v != "none" {
-				mods = append(mods, module.Version{Path: path, Version: v})
+		nPrevRoots := len(upgradedRoot)
+		for p := range selectedRoot {
+			// Since p is a root path, when we fix up the module graph to be
+			// consistent with the selected versions, p will be promoted to a root,
+			// which will pull in its dependencies. Ensure that its dependencies are
+			// included in the module graph.
+			v := mg.g.Selected(p)
+			if v == "none" {
+				// Version “none” always has no requirements, so it doesn't need
+				// an explicit node in the module graph.
+				continue
+			}
+			m := module.Version{Path: p, Version: v}
+			if _, ok := mg.g.RequiredBy(m); !ok && !upgradedRoot[m] {
+				// The dependencies of the selected version of p were not loaded.
+				// Mark it as an upgrade so that we will load its dependencies
+				// in the next iteration.
+				//
+				// Note that we don't remove any of the existing roots, even if they are
+				// no longer the selected version: with graph pruning in effect this may
+				// leave some spurious dependencies in the graph, but it at least
+				// preserves enough of the graph to explain why each upgrade occurred:
+				// this way, we can report a complete path from the passed-in roots
+				// to every node in the module graph.
+				//
+				// This process is guaranteed to reach a fixed point: since we are only
+				// adding roots (never removing them), the selected version of each module
+				// can only increase, never decrease, and the set of module versions in the
+				// universe is finite.
+				if upgradedRoot == nil {
+					upgradedRoot = make(map[module.Version]bool)
+				}
+				upgradedRoot[m] = true
 			}
 		}
+		if len(upgradedRoot) == nPrevRoots {
+			break
+		}
 	}
-	module.Sort(mods)
 
-	changed = !reflect.DeepEqual(mods, initial)
-
-	return mods, changed, err
+	return mg, upgradedRoot, err
 }
 
-// A versionLimiter tracks the versions that may be selected for each module
-// subject to constraints on the maximum versions of transitive dependencies.
-type versionLimiter struct {
-	// pruning is the pruning at which the dependencies of the modules passed to
-	// Select and UpgradeToward are loaded.
-	pruning modPruning
+type perPruning[T any] struct {
+	pruned   T
+	unpruned T
+}
 
-	// max maps each module path to the maximum version that may be selected for
-	// that path.
-	//
-	// Paths with no entry are unrestricted, and we assume that they will not be
-	// promoted to root dependencies (so will not contribute dependencies if the
-	// main module supports graph pruning).
-	max map[string]string
+func (pp perPruning[T]) from(p modPruning) T {
+	if p == unpruned {
+		return pp.unpruned
+	}
+	return pp.pruned
+}
 
-	// selected maps each module path to a version of that path (if known) whose
-	// transitive dependencies do not violate any max version. The version kept
-	// is the highest one found during any call to UpgradeToward for the given
-	// module path.
-	//
-	// If a higher acceptable version is found during a call to UpgradeToward for
-	// some *other* module path, that does not update the selected version.
-	// Ignoring those versions keeps the downgrades computed for two modules
-	// together close to the individual downgrades that would be computed for each
-	// module in isolation. (The only way one module can affect another is if the
-	// final downgraded version of the one module explicitly requires a higher
-	// version of the other.)
-	//
-	// Version "none" of every module is always known not to violate any max
-	// version, so paths at version "none" are omitted.
-	selected map[string]string
+// A dqTracker tracks and propagates the reason that each module version
+// cannot be included in the module graph.
+type dqTracker struct {
+	// extendedRootPruning is the modPruning given the go.mod file for each root
+	// in the extended module graph.
+	extendedRootPruning map[module.Version]modPruning
 
 	// dqReason records whether and why each each encountered version is
-	// disqualified.
-	dqReason map[module.Version]dqState
+	// disqualified in a pruned or unpruned context.
+	dqReason map[module.Version]perPruning[dqState]
 
 	// requiring maps each not-yet-disqualified module version to the versions
-	// that directly require it. If that version becomes disqualified, the
-	// disqualification will be propagated to all of the versions in the list.
+	// that would cause that module's requirements to be included in a pruned or
+	// unpruned context. If that version becomes disqualified, the
+	// disqualification will be propagated to all of the versions in the
+	// corresponding list.
+	//
+	// This map is similar to the module requirement graph, but includes more
+	// detail about whether a given dependency edge appears in a pruned or
+	// unpruned context. (Other commands do not need this level of detail.)
 	requiring map[module.Version][]module.Version
 }
 
@@ -460,178 +704,152 @@
 // disqualified, either because it is ok or because we are currently traversing
 // a cycle that includes it.
 type dqState struct {
-	err      error          // if non-nil, disqualified because the requirements of the module could not be read
-	conflict module.Version // disqualified because the module (transitively) requires dep, which exceeds the maximum version constraint for its path
+	err error          // if non-nil, disqualified because the requirements of the module could not be read
+	dep module.Version // disqualified because the module is or requires dep
 }
 
 func (dq dqState) isDisqualified() bool {
 	return dq != dqState{}
 }
 
-// newVersionLimiter returns a versionLimiter that restricts the module paths
-// that appear as keys in max.
-//
-// max maps each module path to its maximum version; paths that are not present
-// in the map are unrestricted. The limiter assumes that unrestricted paths will
-// not be promoted to root dependencies.
-//
-// If module graph pruning is in effect, then if a module passed to
-// UpgradeToward or Select supports pruning, its unrestricted dependencies are
-// skipped when scanning requirements.
-func newVersionLimiter(pruning modPruning, max map[string]string) *versionLimiter {
-	selected := make(map[string]string)
-	for _, m := range MainModules.Versions() {
-		selected[m.Path] = m.Version
+func (dq dqState) String() string {
+	if dq.err != nil {
+		return dq.err.Error()
 	}
-	return &versionLimiter{
-		pruning:   pruning,
-		max:       max,
-		selected:  selected,
-		dqReason:  map[module.Version]dqState{},
-		requiring: map[module.Version][]module.Version{},
+	if dq.dep != (module.Version{}) {
+		return dq.dep.String()
 	}
+	return "(no conflict)"
 }
 
-// UpgradeToward attempts to upgrade the selected version of m.Path as close as
-// possible to m.Version without violating l's maximum version limits.
+// require records that m directly requires r, in case r becomes disqualified.
+// (These edges are in the opposite direction from the edges in an mvs.Graph.)
 //
-// If module graph pruning is in effect and m itself supports pruning, the
-// dependencies of unrestricted dependencies of m will not be followed.
-func (l *versionLimiter) UpgradeToward(ctx context.Context, m module.Version) error {
-	selected, ok := l.selected[m.Path]
-	if ok {
-		if cmpVersion(selected, m.Version) >= 0 {
-			// The selected version is already at least m, so no upgrade is needed.
-			return nil
+// If r is already disqualified, require propagates the disqualification to m
+// and returns the reason for the disqualification.
+func (t *dqTracker) require(m, r module.Version) (ok bool) {
+	rdq := t.dqReason[r]
+	rootPruning, isRoot := t.extendedRootPruning[r]
+	if isRoot && rdq.from(rootPruning).isDisqualified() {
+		// When we pull in m's dependencies, we will have an edge from m to r, and r
+		// is disqualified (it is a root, which causes its problematic dependencies
+		// to always be included). So we cannot pull in m's dependencies at all:
+		// m is completely disqualified.
+		t.disqualify(m, pruned, dqState{dep: r})
+		return false
+	}
+
+	if dq := rdq.from(unpruned); dq.isDisqualified() {
+		t.disqualify(m, unpruned, dqState{dep: r})
+		if _, ok := t.extendedRootPruning[m]; !ok {
+			// Since m is not a root, its dependencies can't be included in the pruned
+			// part of the module graph, and will never be disqualified from a pruned
+			// reason. We've already disqualified everything that matters.
+			return false
+		}
+	}
+
+	// Record that m is a dependant of r, so that if r is later disqualified
+	// m will be disqualified as well.
+	if t.requiring == nil {
+		t.requiring = make(map[module.Version][]module.Version)
+	}
+	t.requiring[r] = append(t.requiring[r], m)
+	return true
+}
+
+// disqualify records why the dependencies of m cannot be included in the module
+// graph if reached from a part of the graph with the given pruning.
+//
+// Since the pruned graph is a subgraph of the unpruned graph, disqualifying a
+// module from a pruned part of the graph also disqualifies it in the unpruned
+// parts.
+func (t *dqTracker) disqualify(m module.Version, fromPruning modPruning, reason dqState) {
+	if !reason.isDisqualified() {
+		panic("internal error: disqualify called with a non-disqualifying dqState")
+	}
+
+	dq := t.dqReason[m]
+	if dq.from(fromPruning).isDisqualified() {
+		return // Already disqualified for some other reason; don't overwrite it.
+	}
+	rootPruning, isRoot := t.extendedRootPruning[m]
+	if fromPruning == pruned {
+		dq.pruned = reason
+		if !dq.unpruned.isDisqualified() {
+			// Since the pruned graph of m is a subgraph of the unpruned graph, if it
+			// is disqualified due to something in the pruned graph, it is certainly
+			// disqualified in the unpruned graph from the same reason.
+			dq.unpruned = reason
 		}
 	} else {
-		selected = "none"
-	}
-
-	if l.check(m, l.pruning).isDisqualified() {
-		candidates, _, err := versions(ctx, m.Path, CheckAllowed)
-		if err != nil {
-			// This is likely a transient error reaching the repository,
-			// rather than a permanent error with the retrieved version.
-			//
-			// TODO(golang.org/issue/31730, golang.org/issue/30134):
-			// decode what to do based on the actual error.
-			return err
+		dq.unpruned = reason
+		if dq.pruned.isDisqualified() {
+			panic(fmt.Sprintf("internal error: %v is marked as disqualified when pruned, but not when unpruned", m))
 		}
-
-		// Skip to candidates < m.Version.
-		i := sort.Search(len(candidates), func(i int) bool {
-			return semver.Compare(candidates[i], m.Version) >= 0
-		})
-		candidates = candidates[:i]
-
-		for l.check(m, l.pruning).isDisqualified() {
-			n := len(candidates)
-			if n == 0 || cmpVersion(selected, candidates[n-1]) >= 0 {
-				// We couldn't find a suitable candidate above the already-selected version.
-				// Retain that version unmodified.
-				return nil
-			}
-			m.Version, candidates = candidates[n-1], candidates[:n-1]
+		if isRoot && rootPruning == unpruned {
+			// Since m is a root that is always unpruned, any other roots — even
+			// pruned ones! — that cause it to be selected would also cause the reason
+			// for is disqualification to be included in the module graph.
+			dq.pruned = reason
 		}
 	}
-
-	l.selected[m.Path] = m.Version
-	return nil
-}
-
-// Select attempts to set the selected version of m.Path to exactly m.Version.
-func (l *versionLimiter) Select(m module.Version) (conflict module.Version, err error) {
-	dq := l.check(m, l.pruning)
-	if !dq.isDisqualified() {
-		l.selected[m.Path] = m.Version
+	if t.dqReason == nil {
+		t.dqReason = make(map[module.Version]perPruning[dqState])
 	}
-	return dq.conflict, dq.err
+	t.dqReason[m] = dq
+
+	if isRoot && (fromPruning == pruned || rootPruning == unpruned) {
+		// Either m is disqualified even when its dependencies are pruned,
+		// or m's go.mod file causes its dependencies to *always* be unpruned.
+		// Everything that depends on it must be disqualified.
+		for _, p := range t.requiring[m] {
+			t.disqualify(p, pruned, dqState{dep: m})
+			// Note that since the pruned graph is a subset of the unpruned graph,
+			// disqualifying p in the pruned graph also disqualifies it in the
+			// unpruned graph.
+		}
+		// Everything in t.requiring[m] is now fully disqualified.
+		// We won't need to use it again.
+		delete(t.requiring, m)
+		return
+	}
+
+	// Either m is not a root, or it is a pruned root but only being disqualified
+	// when reached from the unpruned parts of the module graph.
+	// Either way, the reason for this disqualification is only visible to the
+	// unpruned parts of the module graph.
+	for _, p := range t.requiring[m] {
+		t.disqualify(p, unpruned, dqState{dep: m})
+	}
+	if !isRoot {
+		// Since m is not a root, its dependencies can't be included in the pruned
+		// part of the module graph, and will never be disqualified from a pruned
+		// reason. We've already disqualified everything that matters.
+		delete(t.requiring, m)
+	}
 }
 
-// check determines whether m (or its transitive dependencies) would violate l's
-// maximum version limits if added to the module requirement graph.
+// check reports whether m is disqualified in the given pruning context.
+func (t *dqTracker) check(m module.Version, pruning modPruning) dqState {
+	return t.dqReason[m].from(pruning)
+}
+
+// path returns the path from m to the reason it is disqualified, which may be
+// either a module that violates constraints or an error in loading
+// requirements.
 //
-// If pruning is in effect and m itself supports graph pruning, the dependencies
-// of unrestricted dependencies of m will not be followed. If the graph-pruning
-// invariants hold for the main module up to this point, the packages in those
-// modules are at best only imported by tests of dependencies that are
-// themselves loaded from outside modules. Although we would like to keep
-// 'go test all' as reproducible as is feasible, we don't want to retain test
-// dependencies that are only marginally relevant at best.
-func (l *versionLimiter) check(m module.Version, pruning modPruning) dqState {
-	if m.Version == "none" || m == MainModules.mustGetSingleMainModule() {
-		// version "none" has no requirements, and the dependencies of Target are
-		// tautological.
-		return dqState{}
-	}
-
-	if dq, seen := l.dqReason[m]; seen {
-		return dq
-	}
-	l.dqReason[m] = dqState{}
-
-	if max, ok := l.max[m.Path]; ok && cmpVersion(m.Version, max) > 0 {
-		return l.disqualify(m, dqState{conflict: m})
-	}
-
-	summary, err := goModSummary(m)
-	if err != nil {
-		// If we can't load the requirements, we couldn't load the go.mod file.
-		// There are a number of reasons this can happen, but this usually
-		// means an older version of the module had a missing or invalid
-		// go.mod file. For example, if example.com/mod released v2.0.0 before
-		// migrating to modules (v2.0.0+incompatible), then added a valid go.mod
-		// in v2.0.1, downgrading from v2.0.1 would cause this error.
-		//
-		// TODO(golang.org/issue/31730, golang.org/issue/30134): if the error
-		// is transient (we couldn't download go.mod), return the error from
-		// Downgrade. Currently, we can't tell what kind of error it is.
-		return l.disqualify(m, dqState{err: err})
-	}
-
-	if summary.pruning == unpruned {
-		pruning = unpruned
-	}
-	for _, r := range summary.require {
-		if pruning == pruned {
-			if _, restricted := l.max[r.Path]; !restricted {
-				// r.Path is unrestricted, so we don't care at what version it is
-				// selected. We assume that r.Path will not become a root dependency, so
-				// since m supports pruning, r's dependencies won't be followed.
-				continue
-			}
+// If m is not disqualified, path returns (nil, nil).
+func (t *dqTracker) path(m module.Version, pruning modPruning) (path []module.Version, err error) {
+	for {
+		dq := t.dqReason[m].from(pruning)
+		if !dq.isDisqualified() {
+			return path, nil
 		}
-
-		if dq := l.check(r, pruning); dq.isDisqualified() {
-			return l.disqualify(m, dq)
+		path = append(path, m)
+		if dq.err != nil || dq.dep == m {
+			return path, dq.err // m itself is the conflict.
 		}
-
-		// r and its dependencies are (perhaps provisionally) ok.
-		//
-		// However, if there are cycles in the requirement graph, we may have only
-		// checked a portion of the requirement graph so far, and r (and thus m) may
-		// yet be disqualified by some path we have not yet visited. Remember this edge
-		// so that we can disqualify m and its dependents if that occurs.
-		l.requiring[r] = append(l.requiring[r], m)
+		m = dq.dep
 	}
-
-	return dqState{}
-}
-
-// disqualify records that m (or one of its transitive dependencies)
-// violates l's maximum version limits.
-func (l *versionLimiter) disqualify(m module.Version, dq dqState) dqState {
-	if dq := l.dqReason[m]; dq.isDisqualified() {
-		return dq
-	}
-	l.dqReason[m] = dq
-
-	for _, p := range l.requiring[m] {
-		l.disqualify(p, dqState{conflict: m})
-	}
-	// Now that we have disqualified the modules that depend on m, we can forget
-	// about them — we won't need to disqualify them again.
-	delete(l.requiring, m)
-	return dq
 }
diff --git a/src/cmd/go/internal/modload/import.go b/src/cmd/go/internal/modload/import.go
index 2815ba9..83b9ad4 100644
--- a/src/cmd/go/internal/modload/import.go
+++ b/src/cmd/go/internal/modload/import.go
@@ -18,6 +18,7 @@
 
 	"cmd/go/internal/cfg"
 	"cmd/go/internal/fsys"
+	"cmd/go/internal/gover"
 	"cmd/go/internal/modfetch"
 	"cmd/go/internal/modindex"
 	"cmd/go/internal/par"
@@ -25,7 +26,6 @@
 	"cmd/go/internal/str"
 
 	"golang.org/x/mod/module"
-	"golang.org/x/mod/semver"
 )
 
 type ImportMissingError struct {
@@ -57,7 +57,7 @@
 func (e *ImportMissingError) Error() string {
 	if e.Module.Path == "" {
 		if e.isStd {
-			msg := fmt.Sprintf("package %s is not in GOROOT (%s)", e.Path, filepath.Join(cfg.GOROOT, "src", e.Path))
+			msg := fmt.Sprintf("package %s is not in std (%s)", e.Path, filepath.Join(cfg.GOROOT, "src", e.Path))
 			if e.importerGoVersion != "" {
 				msg += fmt.Sprintf("\nnote: imported by a module that requires go %s", e.importerGoVersion)
 			}
@@ -164,7 +164,7 @@
 // We might need sums for multiple modules to verify the package is unique.
 //
 // TODO(#43653): consolidate multiple errors of this type into a single error
-// that suggests a 'go get' command for root packages that transtively import
+// that suggests a 'go get' command for root packages that transitively import
 // packages from modules with missing sums. load.CheckPackageErrors would be
 // a good place to consolidate errors, but we'll need to attach the import
 // stack here.
@@ -256,7 +256,13 @@
 // If the package is present in exactly one module, importFromModules will
 // return the module, its root directory, and a list of other modules that
 // lexically could have provided the package but did not.
-func importFromModules(ctx context.Context, path string, rs *Requirements, mg *ModuleGraph) (m module.Version, modroot, dir string, altMods []module.Version, err error) {
+//
+// If skipModFile is true, the go.mod file for the package is not loaded. This
+// allows 'go mod tidy' to preserve a minor checksum-preservation bug
+// (https://go.dev/issue/56222) for modules with 'go' versions between 1.17 and
+// 1.20, preventing unnecessary go.sum churn and network access in those
+// modules.
+func importFromModules(ctx context.Context, path string, rs *Requirements, mg *ModuleGraph, skipModFile bool) (m module.Version, modroot, dir string, altMods []module.Version, err error) {
 	invalidf := func(format string, args ...interface{}) (module.Version, string, string, []module.Version, error) {
 		return module.Version{}, "", "", nil, &invalidImportError{
 			importPath: path,
@@ -365,6 +371,10 @@
 	for {
 		var sumErrMods, altMods []module.Version
 		for prefix := path; prefix != "."; prefix = pathpkg.Dir(prefix) {
+			if gover.IsToolchain(prefix) {
+				// Do not use the synthetic "go" module for "go/ast".
+				continue
+			}
 			var (
 				v  string
 				ok bool
@@ -435,6 +445,18 @@
 		}
 
 		if len(mods) == 1 {
+			// We've found the unique module containing the package.
+			// However, in order to actually compile it we need to know what
+			// Go language version to use, which requires its go.mod file.
+			//
+			// If the module graph is pruned and this is a test-only dependency
+			// of a package in "all", we didn't necessarily load that file
+			// when we read the module graph, so do it now to be sure.
+			if !skipModFile && cfg.BuildMod != "vendor" && mods[0].Path != "" && !MainModules.Contains(mods[0].Path) {
+				if _, err := goModSummary(mods[0]); err != nil {
+					return module.Version{}, "", "", nil, err
+				}
+			}
 			return mods[0], roots[0], dirs[0], altMods, nil
 		}
 
@@ -491,7 +513,7 @@
 			if err != nil {
 				return module.Version{}, err
 			}
-			if cmpVersion(mg.Selected(mp), mv) >= 0 {
+			if gover.ModCompare(mp, mg.Selected(mp), mv) >= 0 {
 				// We can't resolve the import by adding mp@mv to the module graph,
 				// because the selected version of mp is already at least mv.
 				continue
@@ -546,10 +568,12 @@
 		return module.Version{}, &ImportMissingError{Path: path, isStd: true}
 	}
 
-	if cfg.BuildMod == "readonly" && !allowMissingModuleImports {
+	if (cfg.BuildMod == "readonly" || cfg.BuildMod == "vendor") && !allowMissingModuleImports {
 		// In readonly mode, we can't write go.mod, so we shouldn't try to look up
 		// the module. If readonly mode was enabled explicitly, include that in
 		// the error message.
+		// In vendor mode, we cannot use the network or module cache, so we
+		// shouldn't try to look up the module
 		var queryErr error
 		if cfg.BuildModExplicit {
 			queryErr = fmt.Errorf("import lookup disabled by -mod=%s", cfg.BuildMod)
@@ -561,7 +585,7 @@
 
 	// Look up module containing the package, for addition to the build list.
 	// Goal is to determine the module, download it to dir,
-	// and return m, dir, ImpportMissingError.
+	// and return m, dir, ImportMissingError.
 	fmt.Fprintf(os.Stderr, "go: finding module for package %s\n", path)
 
 	mg, err := rs.Graph(ctx)
@@ -582,7 +606,7 @@
 
 	candidate0MissingVersion := ""
 	for i, c := range candidates {
-		if v := mg.Selected(c.Mod.Path); semver.Compare(v, c.Mod.Version) > 0 {
+		if v := mg.Selected(c.Mod.Path); gover.ModCompare(c.Mod.Path, v, c.Mod.Version) > 0 {
 			// QueryPattern proposed that we add module c.Mod to provide the package,
 			// but we already depend on a newer version of that module (and that
 			// version doesn't have the package).
@@ -614,15 +638,10 @@
 }
 
 var (
-	haveGoModCache   par.Cache // dir → bool
-	haveGoFilesCache par.Cache // dir → goFilesEntry
+	haveGoModCache   par.Cache[string, bool]    // dir → bool
+	haveGoFilesCache par.ErrCache[string, bool] // dir → haveGoFiles
 )
 
-type goFilesEntry struct {
-	haveGoFiles bool
-	err         error
-}
-
 // dirInModule locates the directory that would hold the package named by the given path,
 // if it were in the module with module path mpath and root mdir.
 // If path is syntactically not within mpath,
@@ -655,10 +674,10 @@
 	// (the main module, and any directory trees pointed at by replace directives).
 	if isLocal {
 		for d := dir; d != mdir && len(d) > len(mdir); {
-			haveGoMod := haveGoModCache.Do(d, func() any {
+			haveGoMod := haveGoModCache.Do(d, func() bool {
 				fi, err := fsys.Stat(filepath.Join(d, "go.mod"))
 				return err == nil && !fi.IsDir()
-			}).(bool)
+			})
 
 			if haveGoMod {
 				return "", false, nil
@@ -678,21 +697,19 @@
 	// Are there Go source files in the directory?
 	// We don't care about build tags, not even "+build ignore".
 	// We're just looking for a plausible directory.
-	res := haveGoFilesCache.Do(dir, func() any {
+	haveGoFiles, err = haveGoFilesCache.Do(dir, func() (bool, error) {
 		// modindex.GetPackage will return ErrNotIndexed for any directories which
 		// are reached through a symlink, so that they will be handled by
 		// fsys.IsDirWithGoFiles below.
 		if ip, err := modindex.GetPackage(mdir, dir); err == nil {
-			isDirWithGoFiles, err := ip.IsDirWithGoFiles()
-			return goFilesEntry{isDirWithGoFiles, err}
+			return ip.IsDirWithGoFiles()
 		} else if !errors.Is(err, modindex.ErrNotIndexed) {
-			return goFilesEntry{err: err}
+			return false, err
 		}
-		ok, err := fsys.IsDirWithGoFiles(dir)
-		return goFilesEntry{haveGoFiles: ok, err: err}
-	}).(goFilesEntry)
+		return fsys.IsDirWithGoFiles(dir)
+	})
 
-	return dir, res.haveGoFiles, res.err
+	return dir, haveGoFiles, err
 }
 
 // fetch downloads the given module (or its replacement)
@@ -715,6 +732,9 @@
 			// so if we don't report the error now, later failures will be
 			// very mysterious.
 			if _, err := fsys.Stat(dir); err != nil {
+				// TODO(bcmills): We should also read dir/go.mod here and check its Go version,
+				// and return a gover.TooNewError if appropriate.
+
 				if os.IsNotExist(err) {
 					// Semantically the module version itself “exists” — we just don't
 					// have its source code. Remove the equivalence to os.ErrNotExist,
diff --git a/src/cmd/go/internal/modload/init.go b/src/cmd/go/internal/modload/init.go
index 34b00d5..1c6f7d9 100644
--- a/src/cmd/go/internal/modload/init.go
+++ b/src/cmd/go/internal/modload/init.go
@@ -10,11 +10,11 @@
 	"encoding/json"
 	"errors"
 	"fmt"
-	"go/build"
 	"internal/lazyregexp"
 	"os"
 	"path"
 	"path/filepath"
+	"slices"
 	"strconv"
 	"strings"
 	"sync"
@@ -22,6 +22,7 @@
 	"cmd/go/internal/base"
 	"cmd/go/internal/cfg"
 	"cmd/go/internal/fsys"
+	"cmd/go/internal/gover"
 	"cmd/go/internal/lockedfile"
 	"cmd/go/internal/modconv"
 	"cmd/go/internal/modfetch"
@@ -29,7 +30,6 @@
 
 	"golang.org/x/mod/modfile"
 	"golang.org/x/mod/module"
-	"golang.org/x/mod/semver"
 )
 
 // Variables set by other packages.
@@ -61,7 +61,7 @@
 	initialized bool
 
 	// These are primarily used to initialize the MainModules, and should be
-	// eventually superceded by them but are still used in cases where the module
+	// eventually superseded by them but are still used in cases where the module
 	// roots are required but MainModules hasn't been initialized yet. Set to
 	// the modRoots of the main modules.
 	// modRoots != nil implies len(modRoots) > 0
@@ -90,6 +90,7 @@
 	// versions are the module.Version values of each of the main modules.
 	// For each of them, the Path fields are ordinary module paths and the Version
 	// fields are empty strings.
+	// versions is clipped (len=cap).
 	versions []module.Version
 
 	// modRoot maps each module in versions to its absolute filesystem path.
@@ -108,7 +109,7 @@
 
 	modContainingCWD module.Version
 
-	workFileGoVersion string
+	workFile *modfile.WorkFile
 
 	workFileReplaceMap map[module.Version]module.Version
 	// highest replaced version of each module path; empty string for wildcard-only replacements
@@ -220,15 +221,44 @@
 // GoVersion returns the go version set on the single module, in module mode,
 // or the go.work file in workspace mode.
 func (mms *MainModuleSet) GoVersion() string {
-	if !inWorkspaceMode() {
-		return modFileGoVersion(mms.ModFile(mms.mustGetSingleMainModule()))
+	if inWorkspaceMode() {
+		return gover.FromGoWork(mms.workFile)
 	}
-	v := mms.workFileGoVersion
-	if v == "" {
-		// Fall back to 1.18 for go.work files.
-		v = "1.18"
+	if mms != nil && len(mms.versions) == 1 {
+		f := mms.ModFile(mms.mustGetSingleMainModule())
+		if f == nil {
+			// Special case: we are outside a module, like 'go run x.go'.
+			// Assume the local Go version.
+			// TODO(#49228): Clean this up; see loadModFile.
+			return gover.Local()
+		}
+		return gover.FromGoMod(f)
 	}
-	return v
+	return gover.DefaultGoModVersion
+}
+
+// Toolchain returns the toolchain set on the single module, in module mode,
+// or the go.work file in workspace mode.
+func (mms *MainModuleSet) Toolchain() string {
+	if inWorkspaceMode() {
+		if mms.workFile != nil && mms.workFile.Toolchain != nil {
+			return mms.workFile.Toolchain.Name
+		}
+		return "go" + mms.GoVersion()
+	}
+	if mms != nil && len(mms.versions) == 1 {
+		f := mms.ModFile(mms.mustGetSingleMainModule())
+		if f == nil {
+			// Special case: we are outside a module, like 'go run x.go'.
+			// Assume the local Go version.
+			// TODO(#49228): Clean this up; see loadModFile.
+			return gover.LocalToolchain()
+		}
+		if f.Toolchain != nil {
+			return f.Toolchain.Name
+		}
+	}
+	return "go" + mms.GoVersion()
 }
 
 func (mms *MainModuleSet) WorkFileReplaceMap() map[module.Version]module.Version {
@@ -287,21 +317,29 @@
 // operate in workspace mode. It should not be called by other commands,
 // for example 'go mod tidy', that don't operate in workspace mode.
 func InitWorkfile() {
+	workFilePath = FindGoWork(base.Cwd())
+}
+
+// FindGoWork returns the name of the go.work file for this command,
+// or the empty string if there isn't one.
+// Most code should use Init and Enabled rather than use this directly.
+// It is exported mainly for Go toolchain switching, which must process
+// the go.work very early at startup.
+func FindGoWork(wd string) string {
 	if RootMode == NoRoot {
-		workFilePath = ""
-		return
+		return ""
 	}
 
 	switch gowork := cfg.Getenv("GOWORK"); gowork {
 	case "off":
-		workFilePath = ""
+		return ""
 	case "", "auto":
-		workFilePath = findWorkspaceFile(base.Cwd())
+		return findWorkspaceFile(wd)
 	default:
 		if !filepath.IsAbs(gowork) {
-			base.Fatalf("the path provided to GOWORK must be an absolute path")
+			base.Fatalf("go: invalid GOWORK: not an absolute path")
 		}
-		workFilePath = gowork
+		return gowork
 	}
 }
 
@@ -311,6 +349,20 @@
 	return workFilePath
 }
 
+// Reset clears all the initialized, cached state about the use of modules,
+// so that we can start over.
+func Reset() {
+	initialized = false
+	ForceUseModules = false
+	RootMode = 0
+	modRoots = nil
+	cfg.ModulesEnabled = false
+	MainModules = nil
+	requirements = nil
+	workFilePath = ""
+	modfetch.Reset()
+}
+
 // Init determines whether module mode is enabled, locates the root of the
 // current module (if any), sets environment variables for Git subprocesses, and
 // configures the cfg, codehost, load, modfetch, and search packages for use
@@ -342,7 +394,7 @@
 	}
 
 	if err := fsys.Init(base.Cwd()); err != nil {
-		base.Fatalf("go: %v", err)
+		base.Fatal(err)
 	}
 
 	// Disable any prompting for passwords by Git.
@@ -383,15 +435,18 @@
 			base.Fatalf("go: -modfile cannot be used with commands that ignore the current module")
 		}
 		modRoots = nil
-	} else if inWorkspaceMode() {
-		// We're in workspace mode.
+	} else if workFilePath != "" {
+		// We're in workspace mode, which implies module mode.
+		if cfg.ModFile != "" {
+			base.Fatalf("go: -modfile cannot be used in workspace mode")
+		}
 	} else {
 		if modRoot := findModuleRoot(base.Cwd()); modRoot == "" {
 			if cfg.ModFile != "" {
 				base.Fatalf("go: cannot find main module, but -modfile was set.\n\t-modfile cannot be used to set the module root directory.")
 			}
 			if RootMode == NeedRoot {
-				base.Fatalf("go: %v", ErrNoModRoot)
+				base.Fatal(ErrNoModRoot)
 			}
 			if !mustUseModules {
 				// GO111MODULE is 'auto', and we can't find a module root.
@@ -405,6 +460,9 @@
 			// It's a bit of a peculiar thing to disallow but quite mysterious
 			// when it happens. See golang.org/issue/26708.
 			fmt.Fprintf(os.Stderr, "go: warning: ignoring go.mod in system temp root %v\n", os.TempDir())
+			if RootMode == NeedRoot {
+				base.Fatal(ErrNoModRoot)
+			}
 			if !mustUseModules {
 				return
 			}
@@ -459,19 +517,30 @@
 		return false
 	}
 
-	if modRoot := findModuleRoot(base.Cwd()); modRoot == "" {
+	return FindGoMod(base.Cwd()) != ""
+}
+
+// FindGoMod returns the name of the go.mod file for this command,
+// or the empty string if there isn't one.
+// Most code should use Init and Enabled rather than use this directly.
+// It is exported mainly for Go toolchain switching, which must process
+// the go.mod very early at startup.
+func FindGoMod(wd string) string {
+	modRoot := findModuleRoot(wd)
+	if modRoot == "" {
 		// GO111MODULE is 'auto', and we can't find a module root.
 		// Stay in GOPATH mode.
-		return false
-	} else if search.InDir(modRoot, os.TempDir()) == "." {
+		return ""
+	}
+	if search.InDir(modRoot, os.TempDir()) == "." {
 		// If you create /tmp/go.mod for experimenting,
 		// then any tests that create work directories under /tmp
 		// will find it and get modules when they're not expecting them.
 		// It's a bit of a peculiar thing to disallow but quite mysterious
 		// when it happens. See golang.org/issue/26708.
-		return false
+		return ""
 	}
-	return true
+	return filepath.Join(modRoot, "go.mod")
 }
 
 // Enabled reports whether modules are (or must be) enabled.
@@ -491,6 +560,9 @@
 	if !initialized {
 		panic("inWorkspaceMode called before modload.Init called")
 	}
+	if !Enabled() {
+		return false
+	}
 	return workFilePath != ""
 }
 
@@ -544,7 +616,7 @@
 		}
 		base.Fatalf("go: cannot find main module, but found %s in %s\n\tto create a module there, run:\n\t%sgo mod init", name, dir, cdCmd)
 	}
-	base.Fatalf("go: %v", ErrNoModRoot)
+	base.Fatal(ErrNoModRoot)
 }
 
 var ErrNoModRoot = errors.New("go.mod file not found in current directory or any parent directory; see 'go help modules'")
@@ -563,14 +635,11 @@
 
 var errGoModDirty error = goModDirtyError{}
 
-func loadWorkFile(path string) (goVersion string, modRoots []string, replaces []*modfile.Replace, err error) {
+func loadWorkFile(path string) (workFile *modfile.WorkFile, modRoots []string, err error) {
 	workDir := filepath.Dir(path)
 	wf, err := ReadWorkFile(path)
 	if err != nil {
-		return "", nil, nil, err
-	}
-	if wf.Go != nil {
-		goVersion = wf.Go.Version
+		return nil, nil, err
 	}
 	seen := map[string]bool{}
 	for _, d := range wf.Use {
@@ -580,13 +649,13 @@
 		}
 
 		if seen[modRoot] {
-			return "", nil, nil, fmt.Errorf("path %s appears multiple times in workspace", modRoot)
+			return nil, nil, fmt.Errorf("path %s appears multiple times in workspace", modRoot)
 		}
 		seen[modRoot] = true
 		modRoots = append(modRoots, modRoot)
 	}
 
-	return goVersion, modRoots, wf.Replace, nil
+	return wf, modRoots, nil
 }
 
 // ReadWorkFile reads and parses the go.work file at the given path.
@@ -596,7 +665,14 @@
 		return nil, err
 	}
 
-	return modfile.ParseWork(path, workData, nil)
+	f, err := modfile.ParseWork(path, workData, nil)
+	if err != nil {
+		return nil, err
+	}
+	if f.Go != nil && gover.Compare(f.Go.Version, gover.Local()) > 0 && cfg.CmdName != "work edit" {
+		base.Fatal(&gover.TooNewError{What: base.ShortPath(path), GoVersion: f.Go.Version})
+	}
+	return f, nil
 }
 
 // WriteWorkFile cleans and writes out the go.work file to the given path.
@@ -608,6 +684,47 @@
 	return os.WriteFile(path, out, 0666)
 }
 
+// UpdateWorkGoVersion updates the go line in wf to be at least goVers,
+// reporting whether it changed the file.
+func UpdateWorkGoVersion(wf *modfile.WorkFile, goVers string) (changed bool) {
+	old := gover.FromGoWork(wf)
+	if gover.Compare(old, goVers) >= 0 {
+		return false
+	}
+
+	wf.AddGoStmt(goVers)
+
+	// We wrote a new go line. For reproducibility,
+	// if the toolchain running right now is newer than the new toolchain line,
+	// update the toolchain line to record the newer toolchain.
+	// The user never sets the toolchain explicitly in a 'go work' command,
+	// so this is only happening as a result of a go or toolchain line found
+	// in a module.
+	// If the toolchain running right now is a dev toolchain (like "go1.21")
+	// writing 'toolchain go1.21' will not be useful, since that's not an actual
+	// toolchain you can download and run. In that case fall back to at least
+	// checking that the toolchain is new enough for the Go version.
+	toolchain := "go" + old
+	if wf.Toolchain != nil {
+		toolchain = wf.Toolchain.Name
+	}
+	if gover.IsLang(gover.Local()) {
+		toolchain = gover.ToolchainMax(toolchain, "go"+goVers)
+	} else {
+		toolchain = gover.ToolchainMax(toolchain, "go"+gover.Local())
+	}
+
+	// Drop the toolchain line if it is implied by the go line
+	// or if it is asking for a toolchain older than Go 1.21,
+	// which will not understand the toolchain line.
+	if toolchain == "go"+goVers || gover.Compare(gover.FromToolchain(toolchain), gover.GoStrictVersion) < 0 {
+		wf.DropToolchainStmt()
+	} else {
+		wf.AddToolchainStmt(toolchain)
+	}
+	return true
+}
+
 // UpdateWorkFile updates comments on directory directives in the go.work
 // file to include the associated module path.
 func UpdateWorkFile(wf *modfile.WorkFile) {
@@ -653,20 +770,25 @@
 // it for global consistency. Most callers outside of the modload package should
 // use LoadModGraph instead.
 func LoadModFile(ctx context.Context) *Requirements {
+	rs, err := loadModFile(ctx, nil)
+	if err != nil {
+		base.Fatal(err)
+	}
+	return rs
+}
+
+func loadModFile(ctx context.Context, opts *PackageOpts) (*Requirements, error) {
 	if requirements != nil {
-		return requirements
+		return requirements, nil
 	}
 
 	Init()
-	var (
-		workFileGoVersion string
-		workFileReplaces  []*modfile.Replace
-	)
+	var workFile *modfile.WorkFile
 	if inWorkspaceMode() {
 		var err error
-		workFileGoVersion, modRoots, workFileReplaces, err = loadWorkFile(workFilePath)
+		workFile, modRoots, err = loadWorkFile(workFilePath)
 		if err != nil {
-			base.Fatalf("reading go.work: %v", err)
+			return nil, fmt.Errorf("reading go.work: %w", err)
 		}
 		for _, modRoot := range modRoots {
 			sumFile := strings.TrimSuffix(modFilePath(modRoot), ".mod") + ".sum"
@@ -699,35 +821,76 @@
 		// make MainModules.Len() == 0 mean that we're in module mode but not inside
 		// any module.
 		mainModule := module.Version{Path: "command-line-arguments"}
-		MainModules = makeMainModules([]module.Version{mainModule}, []string{""}, []*modfile.File{nil}, []*modFileIndex{nil}, "", nil)
-		goVersion := LatestGoVersion()
-		rawGoVersion.Store(mainModule, goVersion)
-		pruning := pruningForGoVersion(goVersion)
+		MainModules = makeMainModules([]module.Version{mainModule}, []string{""}, []*modfile.File{nil}, []*modFileIndex{nil}, nil)
+		var (
+			goVersion string
+			pruning   modPruning
+			roots     []module.Version
+			direct    = map[string]bool{"go": true}
+		)
 		if inWorkspaceMode() {
+			// Since we are in a workspace, the Go version for the synthetic
+			// "command-line-arguments" module must not exceed the Go version
+			// for the workspace.
+			goVersion = MainModules.GoVersion()
 			pruning = workspace
+			roots = []module.Version{
+				mainModule,
+				{Path: "go", Version: goVersion},
+				{Path: "toolchain", Version: gover.LocalToolchain()},
+			}
+		} else {
+			goVersion = gover.Local()
+			pruning = pruningForGoVersion(goVersion)
+			roots = []module.Version{
+				{Path: "go", Version: goVersion},
+				{Path: "toolchain", Version: gover.LocalToolchain()},
+			}
 		}
-		requirements = newRequirements(pruning, nil, nil)
+		rawGoVersion.Store(mainModule, goVersion)
+		requirements = newRequirements(pruning, roots, direct)
 		if cfg.BuildMod == "vendor" {
 			// For issue 56536: Some users may have GOFLAGS=-mod=vendor set.
 			// Make sure it behaves as though the fake module is vendored
 			// with no dependencies.
 			requirements.initVendor(nil)
 		}
-		return requirements
+		return requirements, nil
 	}
 
 	var modFiles []*modfile.File
 	var mainModules []module.Version
 	var indices []*modFileIndex
+	var errs []error
 	for _, modroot := range modRoots {
 		gomod := modFilePath(modroot)
 		var fixed bool
 		data, f, err := ReadModFile(gomod, fixVersion(ctx, &fixed))
 		if err != nil {
 			if inWorkspaceMode() {
-				base.Fatalf("go: cannot load module listed in go.work file: %v", err)
-			} else {
-				base.Fatalf("go: %v", err)
+				if tooNew, ok := err.(*gover.TooNewError); ok && !strings.HasPrefix(cfg.CmdName, "work ") {
+					// Switching to a newer toolchain won't help - the go.work has the wrong version.
+					// Report this more specific error, unless we are a command like 'go work use'
+					// or 'go work sync', which will fix the problem after the caller sees the TooNewError
+					// and switches to a newer toolchain.
+					err = errWorkTooOld(gomod, workFile, tooNew.GoVersion)
+				} else {
+					err = fmt.Errorf("cannot load module %s listed in go.work file: %w",
+						base.ShortPath(filepath.Dir(gomod)), err)
+				}
+			}
+			errs = append(errs, err)
+			continue
+		}
+		if inWorkspaceMode() && !strings.HasPrefix(cfg.CmdName, "work ") {
+			// Refuse to use workspace if its go version is too old.
+			// Disable this check if we are a workspace command like work use or work sync,
+			// which will fix the problem.
+			mv := gover.FromGoMod(f)
+			wv := gover.FromGoWork(workFile)
+			if gover.Compare(mv, wv) > 0 && gover.Compare(mv, gover.GoStrictVersion) >= 0 {
+				errs = append(errs, errWorkTooOld(gomod, workFile, mv))
+				continue
 			}
 		}
 
@@ -740,19 +903,22 @@
 			if pathErr, ok := err.(*module.InvalidPathError); ok {
 				pathErr.Kind = "module"
 			}
-			base.Fatalf("go: %v", err)
+			errs = append(errs, err)
 		}
 	}
+	if len(errs) > 0 {
+		return nil, errors.Join(errs...)
+	}
 
-	MainModules = makeMainModules(mainModules, modRoots, modFiles, indices, workFileGoVersion, workFileReplaces)
+	MainModules = makeMainModules(mainModules, modRoots, modFiles, indices, workFile)
 	setDefaultBuildMod() // possibly enable automatic vendoring
-	rs := requirementsFromModFiles(ctx, modFiles)
+	rs := requirementsFromModFiles(ctx, workFile, modFiles, opts)
 
 	if inWorkspaceMode() {
 		// We don't need to do anything for vendor or update the mod file so
 		// return early.
 		requirements = rs
-		return rs
+		return rs, nil
 	}
 
 	mainModule := MainModules.mustGetSingleMainModule()
@@ -772,33 +938,46 @@
 		var err error
 		rs, err = updateRoots(ctx, rs.direct, rs, nil, nil, false)
 		if err != nil {
-			base.Fatalf("go: %v", err)
+			return nil, err
 		}
 	}
 
-	if MainModules.Index(mainModule).goVersionV == "" && rs.pruning != workspace {
+	if MainModules.Index(mainModule).goVersion == "" && rs.pruning != workspace {
 		// TODO(#45551): Do something more principled instead of checking
 		// cfg.CmdName directly here.
 		if cfg.BuildMod == "mod" && cfg.CmdName != "mod graph" && cfg.CmdName != "mod why" {
-			addGoStmt(MainModules.ModFile(mainModule), mainModule, LatestGoVersion())
+			// go line is missing from go.mod; add one there and add to derived requirements.
+			v := gover.Local()
+			if opts != nil && opts.TidyGoVersion != "" {
+				v = opts.TidyGoVersion
+			}
+			addGoStmt(MainModules.ModFile(mainModule), mainModule, v)
+			rs = overrideRoots(ctx, rs, []module.Version{{Path: "go", Version: v}})
 
 			// We need to add a 'go' version to the go.mod file, but we must assume
 			// that its existing contents match something between Go 1.11 and 1.16.
 			// Go 1.11 through 1.16 do not support graph pruning, but the latest Go
 			// version uses a pruned module graph — so we need to convert the
 			// requirements to support pruning.
-			var err error
-			rs, err = convertPruning(ctx, rs, pruned)
-			if err != nil {
-				base.Fatalf("go: %v", err)
+			if gover.Compare(v, gover.ExplicitIndirectVersion) >= 0 {
+				var err error
+				rs, err = convertPruning(ctx, rs, pruned)
+				if err != nil {
+					return nil, err
+				}
 			}
 		} else {
-			rawGoVersion.Store(mainModule, modFileGoVersion(MainModules.ModFile(mainModule)))
+			rawGoVersion.Store(mainModule, gover.DefaultGoModVersion)
 		}
 	}
 
 	requirements = rs
-	return requirements
+	return requirements, nil
+}
+
+func errWorkTooOld(gomod string, wf *modfile.WorkFile, goVers string) error {
+	return fmt.Errorf("module %s listed in go.work file requires go >= %s, but go.work lists go %s; to update it:\n\tgo work use",
+		base.ShortPath(filepath.Dir(gomod)), goVers, gover.FromGoWork(wf))
 }
 
 // CreateModFile initializes a new module by creating a go.mod file.
@@ -823,7 +1002,7 @@
 		var err error
 		modPath, err = findModulePath(modRoot)
 		if err != nil {
-			base.Fatalf("go: %v", err)
+			base.Fatal(err)
 		}
 	} else if err := module.CheckImportPath(modPath); err != nil {
 		if pathErr, ok := err.(*module.InvalidPathError); ok {
@@ -834,7 +1013,7 @@
 				pathErr.Err = errors.New("is a local import path")
 			}
 		}
-		base.Fatalf("go: %v", err)
+		base.Fatal(err)
 	} else if _, _, ok := module.SplitPathVersion(modPath); !ok {
 		if strings.HasPrefix(modPath, "gopkg.in/") {
 			invalidMajorVersionMsg := fmt.Errorf("module paths beginning with gopkg.in/ must always have a major version suffix in the form of .vN:\n\tgo mod init %s", suggestGopkgIn(modPath))
@@ -847,25 +1026,25 @@
 	fmt.Fprintf(os.Stderr, "go: creating new go.mod: module %s\n", modPath)
 	modFile := new(modfile.File)
 	modFile.AddModuleStmt(modPath)
-	MainModules = makeMainModules([]module.Version{modFile.Module.Mod}, []string{modRoot}, []*modfile.File{modFile}, []*modFileIndex{nil}, "", nil)
-	addGoStmt(modFile, modFile.Module.Mod, LatestGoVersion()) // Add the go directive before converted module requirements.
+	MainModules = makeMainModules([]module.Version{modFile.Module.Mod}, []string{modRoot}, []*modfile.File{modFile}, []*modFileIndex{nil}, nil)
+	addGoStmt(modFile, modFile.Module.Mod, gover.Local()) // Add the go directive before converted module requirements.
 
 	convertedFrom, err := convertLegacyConfig(modFile, modRoot)
 	if convertedFrom != "" {
 		fmt.Fprintf(os.Stderr, "go: copying requirements from %s\n", base.ShortPath(convertedFrom))
 	}
 	if err != nil {
-		base.Fatalf("go: %v", err)
+		base.Fatal(err)
 	}
 
-	rs := requirementsFromModFiles(ctx, []*modfile.File{modFile})
+	rs := requirementsFromModFiles(ctx, nil, []*modfile.File{modFile}, nil)
 	rs, err = updateRoots(ctx, rs.direct, rs, nil, nil, false)
 	if err != nil {
-		base.Fatalf("go: %v", err)
+		base.Fatal(err)
 	}
 	requirements = rs
-	if err := commitRequirements(ctx); err != nil {
-		base.Fatalf("go: %v", err)
+	if err := commitRequirements(ctx, WriteOpts{}); err != nil {
+		base.Fatal(err)
 	}
 
 	// Suggest running 'go mod tidy' unless the project is empty. Even if we
@@ -892,32 +1071,6 @@
 	}
 }
 
-// CreateWorkFile initializes a new workspace by creating a go.work file.
-func CreateWorkFile(ctx context.Context, workFile string, modDirs []string) {
-	if _, err := fsys.Stat(workFile); err == nil {
-		base.Fatalf("go: %s already exists", workFile)
-	}
-
-	goV := LatestGoVersion() // Use current Go version by default
-	workF := new(modfile.WorkFile)
-	workF.Syntax = new(modfile.FileSyntax)
-	workF.AddGoStmt(goV)
-
-	for _, dir := range modDirs {
-		_, f, err := ReadModFile(filepath.Join(dir, "go.mod"), nil)
-		if err != nil {
-			if os.IsNotExist(err) {
-				base.Fatalf("go: creating workspace file: no go.mod file exists in directory %v", dir)
-			}
-			base.Fatalf("go: error parsing go.mod in directory %s: %v", dir, err)
-		}
-		workF.AddUse(ToDirectoryPath(dir), f.Module.Mod.Path)
-	}
-
-	UpdateWorkFile(workF)
-	WriteWorkFile(workFile, workF)
-}
-
 // fixVersion returns a modfile.VersionFixer implemented using the Query function.
 //
 // It resolves commit hashes and branch names to versions,
@@ -982,7 +1135,7 @@
 
 // makeMainModules creates a MainModuleSet and associated variables according to
 // the given main modules.
-func makeMainModules(ms []module.Version, rootDirs []string, modFiles []*modfile.File, indices []*modFileIndex, workFileGoVersion string, workFileReplaces []*modfile.Replace) *MainModuleSet {
+func makeMainModules(ms []module.Version, rootDirs []string, modFiles []*modfile.File, indices []*modFileIndex, workFile *modfile.WorkFile) *MainModuleSet {
 	for _, m := range ms {
 		if m.Version != "" {
 			panic("mainModulesCalled with module.Version with non empty Version field: " + fmt.Sprintf("%#v", m))
@@ -990,15 +1143,19 @@
 	}
 	modRootContainingCWD := findModuleRoot(base.Cwd())
 	mainModules := &MainModuleSet{
-		versions:           ms[:len(ms):len(ms)],
-		inGorootSrc:        map[module.Version]bool{},
-		pathPrefix:         map[module.Version]string{},
-		modRoot:            map[module.Version]string{},
-		modFiles:           map[module.Version]*modfile.File{},
-		indices:            map[module.Version]*modFileIndex{},
-		workFileGoVersion:  workFileGoVersion,
-		workFileReplaceMap: toReplaceMap(workFileReplaces),
-		highestReplaced:    map[string]string{},
+		versions:        slices.Clip(ms),
+		inGorootSrc:     map[module.Version]bool{},
+		pathPrefix:      map[module.Version]string{},
+		modRoot:         map[module.Version]string{},
+		modFiles:        map[module.Version]*modfile.File{},
+		indices:         map[module.Version]*modFileIndex{},
+		highestReplaced: map[string]string{},
+		workFile:        workFile,
+	}
+	var workFileReplaces []*modfile.Replace
+	if workFile != nil {
+		workFileReplaces = workFile.Replace
+		mainModules.workFileReplaceMap = toReplaceMap(workFile.Replace)
 	}
 	mainModulePaths := make(map[string]bool)
 	for _, m := range ms {
@@ -1015,7 +1172,7 @@
 		}
 		replacedByWorkFile[r.Old.Path] = true
 		v, ok := mainModules.highestReplaced[r.Old.Path]
-		if !ok || semver.Compare(r.Old.Version, v) > 0 {
+		if !ok || gover.ModCompare(r.Old.Path, r.Old.Version, v) > 0 {
 			mainModules.highestReplaced[r.Old.Path] = r.Old.Version
 		}
 		replacements[r.Old] = r.New
@@ -1071,7 +1228,7 @@
 				replacements[r.Old] = newV
 
 				v, ok := mainModules.highestReplaced[r.Old.Path]
-				if !ok || semver.Compare(r.Old.Version, v) > 0 {
+				if !ok || gover.ModCompare(r.Old.Path, r.Old.Version, v) > 0 {
 					mainModules.highestReplaced[r.Old.Path] = r.Old.Version
 				}
 			}
@@ -1082,21 +1239,26 @@
 
 // requirementsFromModFiles returns the set of non-excluded requirements from
 // the global modFile.
-func requirementsFromModFiles(ctx context.Context, modFiles []*modfile.File) *Requirements {
+func requirementsFromModFiles(ctx context.Context, workFile *modfile.WorkFile, modFiles []*modfile.File, opts *PackageOpts) *Requirements {
 	var roots []module.Version
 	direct := map[string]bool{}
 	var pruning modPruning
+	var goVersion, toolchain string
 	if inWorkspaceMode() {
 		pruning = workspace
-		roots = make([]module.Version, len(MainModules.Versions()))
+		roots = make([]module.Version, len(MainModules.Versions()), 2+len(MainModules.Versions()))
 		copy(roots, MainModules.Versions())
+		goVersion = gover.FromGoWork(workFile)
+		if workFile.Toolchain != nil {
+			toolchain = workFile.Toolchain.Name
+		}
 	} else {
 		pruning = pruningForGoVersion(MainModules.GoVersion())
 		if len(modFiles) != 1 {
 			panic(fmt.Errorf("requirementsFromModFiles called with %v modfiles outside workspace mode", len(modFiles)))
 		}
 		modFile := modFiles[0]
-		roots = make([]module.Version, 0, len(modFile.Require))
+		roots = make([]module.Version, 0, 2+len(modFile.Require))
 		mm := MainModules.mustGetSingleMainModule()
 		for _, r := range modFile.Require {
 			if index := MainModules.Index(mm); index != nil && index.exclude[r.Mod] {
@@ -1113,8 +1275,26 @@
 				direct[r.Mod.Path] = true
 			}
 		}
+		goVersion = gover.FromGoMod(modFile)
+		if modFile.Toolchain != nil {
+			toolchain = modFile.Toolchain.Name
+		}
 	}
-	module.Sort(roots)
+
+	// Add explicit go and toolchain versions, inferring as needed.
+	roots = append(roots, module.Version{Path: "go", Version: goVersion})
+	direct["go"] = true // Every module directly uses the language and runtime.
+
+	if toolchain != "" {
+		roots = append(roots, module.Version{Path: "toolchain", Version: toolchain})
+		// Leave the toolchain as indirect: nothing in the user's module directly
+		// imports a package from the toolchain, and (like an indirect dependency in
+		// a module without graph pruning) we may remove the toolchain line
+		// automatically if the 'go' version is changed so that it implies the exact
+		// same toolchain.
+	}
+
+	gover.ModSort(roots)
 	rs := newRequirements(pruning, roots, direct)
 	return rs
 }
@@ -1164,15 +1344,15 @@
 		index := MainModules.GetSingleIndexOrNil()
 		if fi, err := fsys.Stat(filepath.Join(modRoots[0], "vendor")); err == nil && fi.IsDir() {
 			modGo := "unspecified"
-			if index != nil && index.goVersionV != "" {
-				if semver.Compare(index.goVersionV, "v1.14") >= 0 {
+			if index != nil && index.goVersion != "" {
+				if gover.Compare(index.goVersion, "1.14") >= 0 {
 					// The Go version is at least 1.14, and a vendor directory exists.
 					// Set -mod=vendor by default.
 					cfg.BuildMod = "vendor"
 					cfg.BuildModReason = "Go version in go.mod is at least 1.14 and vendor directory exists."
 					return
 				} else {
-					modGo = index.goVersionV[1:]
+					modGo = index.goVersion
 				}
 			}
 
@@ -1226,45 +1406,16 @@
 	if modFile.Go != nil && modFile.Go.Version != "" {
 		return
 	}
+	forceGoStmt(modFile, mod, v)
+}
+
+func forceGoStmt(modFile *modfile.File, mod module.Version, v string) {
 	if err := modFile.AddGoStmt(v); err != nil {
 		base.Fatalf("go: internal error: %v", err)
 	}
 	rawGoVersion.Store(mod, v)
 }
 
-// LatestGoVersion returns the latest version of the Go language supported by
-// this toolchain, like "1.17".
-func LatestGoVersion() string {
-	tags := build.Default.ReleaseTags
-	version := tags[len(tags)-1]
-	if !strings.HasPrefix(version, "go") || !modfile.GoVersionRE.MatchString(version[2:]) {
-		base.Fatalf("go: internal error: unrecognized default version %q", version)
-	}
-	return version[2:]
-}
-
-// priorGoVersion returns the Go major release immediately preceding v,
-// or v itself if v is the first Go major release (1.0) or not a supported
-// Go version.
-func priorGoVersion(v string) string {
-	vTag := "go" + v
-	tags := build.Default.ReleaseTags
-	for i, tag := range tags {
-		if tag == vTag {
-			if i == 0 {
-				return v
-			}
-
-			version := tags[i-1]
-			if !strings.HasPrefix(version, "go") || !modfile.GoVersionRE.MatchString(version[2:]) {
-				base.Fatalf("go: internal error: unrecognized version %q", version)
-			}
-			return version[2:]
-		}
-	}
-	return v
-}
-
 var altConfigs = []string{
 	"Gopkg.lock",
 
@@ -1452,10 +1603,20 @@
 	return path
 }
 
+// WriteOpts control the behavior of WriteGoMod.
+type WriteOpts struct {
+	DropToolchain     bool // go get toolchain@none
+	ExplicitToolchain bool // go get has set explicit toolchain version
+
+	// TODO(bcmills): Make 'go mod tidy' update the go version in the Requirements
+	// instead of writing directly to the modfile.File
+	TidyWroteGo bool // Go.Version field already updated by 'go mod tidy'
+}
+
 // WriteGoMod writes the current build list back to go.mod.
-func WriteGoMod(ctx context.Context) error {
+func WriteGoMod(ctx context.Context, opts WriteOpts) error {
 	requirements = LoadModFile(ctx)
-	return commitRequirements(ctx)
+	return commitRequirements(ctx, opts)
 }
 
 // commitRequirements ensures go.mod and go.sum are up to date with the current
@@ -1467,11 +1628,11 @@
 // go.mod or go.sum are out of date in a semantically significant way.
 //
 // In workspace mode, commitRequirements only writes changes to go.work.sum.
-func commitRequirements(ctx context.Context) (err error) {
+func commitRequirements(ctx context.Context, opts WriteOpts) (err error) {
 	if inWorkspaceMode() {
 		// go.mod files aren't updated in workspace mode, but we still want to
 		// update the go.work.sum file.
-		return modfetch.WriteGoSum(keepSums(ctx, loaded, requirements, addBuildListZipSums), mustHaveCompleteRequirements())
+		return modfetch.WriteGoSum(ctx, keepSums(ctx, loaded, requirements, addBuildListZipSums), mustHaveCompleteRequirements())
 	}
 	if MainModules.Len() != 1 || MainModules.ModRoot(MainModules.Versions()[0]) == "" {
 		// We aren't in a module, so we don't have anywhere to write a go.mod file.
@@ -1486,16 +1647,75 @@
 	modFilePath := modFilePath(MainModules.ModRoot(mainModule))
 
 	var list []*modfile.Require
+	toolchain := ""
+	goVersion := ""
 	for _, m := range requirements.rootModules {
+		if m.Path == "go" {
+			goVersion = m.Version
+			continue
+		}
+		if m.Path == "toolchain" {
+			toolchain = m.Version
+			continue
+		}
 		list = append(list, &modfile.Require{
 			Mod:      m,
 			Indirect: !requirements.direct[m.Path],
 		})
 	}
-	if modFile.Go == nil || modFile.Go.Version == "" {
-		modFile.AddGoStmt(modFileGoVersion(modFile))
+
+	// Update go line.
+	// Every MVS graph we consider should have go as a root,
+	// and toolchain is either implied by the go line or explicitly a root.
+	if goVersion == "" {
+		base.Fatalf("go: internal error: missing go root module in WriteGoMod")
 	}
-	if semver.Compare("v"+modFileGoVersion(modFile), separateIndirectVersionV) < 0 {
+	if gover.Compare(goVersion, gover.Local()) > 0 {
+		// We cannot assume that we know how to update a go.mod to a newer version.
+		return &gover.TooNewError{What: "updating go.mod", GoVersion: goVersion}
+	}
+	wroteGo := opts.TidyWroteGo
+	if !wroteGo && modFile.Go == nil || modFile.Go.Version != goVersion {
+		alwaysUpdate := cfg.BuildMod == "mod" || cfg.CmdName == "mod tidy" || cfg.CmdName == "get"
+		if modFile.Go == nil && goVersion == gover.DefaultGoModVersion && !alwaysUpdate {
+			// The go.mod has no go line, the implied default Go version matches
+			// what we've computed for the graph, and we're not in one of the
+			// traditional go.mod-updating programs, so leave it alone.
+		} else {
+			wroteGo = true
+			forceGoStmt(modFile, mainModule, goVersion)
+		}
+	}
+	if toolchain == "" {
+		toolchain = "go" + goVersion
+	}
+
+	// For reproducibility, if we are writing a new go line,
+	// and we're not explicitly modifying the toolchain line with 'go get toolchain@something',
+	// and the go version is one that supports switching toolchains,
+	// and the toolchain running right now is newer than the current toolchain line,
+	// then update the toolchain line to record the newer toolchain.
+	//
+	// TODO(#57001): This condition feels too complicated. Can we simplify it?
+	// TODO(#57001): Add more tests for toolchain lines.
+	toolVers := gover.FromToolchain(toolchain)
+	if wroteGo && !opts.DropToolchain && !opts.ExplicitToolchain &&
+		gover.Compare(goVersion, gover.GoStrictVersion) >= 0 &&
+		(gover.Compare(gover.Local(), toolVers) > 0 && !gover.IsLang(gover.Local())) {
+		toolchain = "go" + gover.Local()
+		toolVers = gover.FromToolchain(toolchain)
+	}
+
+	if opts.DropToolchain || toolchain == "go"+goVersion || (gover.Compare(toolVers, gover.GoStrictVersion) < 0 && !opts.ExplicitToolchain) {
+		// go get toolchain@none or toolchain matches go line or isn't valid; drop it.
+		// TODO(#57001): 'go get' should reject explicit toolchains below GoStrictVersion.
+		modFile.DropToolchainStmt()
+	} else {
+		modFile.AddToolchainStmt(toolchain)
+	}
+
+	// Update require blocks.
+	if gover.Compare(goVersion, gover.SeparateIndirectVersion) < 0 {
 		modFile.SetRequire(list)
 	} else {
 		modFile.SetRequireSeparateIndirect(list)
@@ -1516,7 +1736,7 @@
 		// Don't write go.mod, but write go.sum in case we added or trimmed sums.
 		// 'go mod init' shouldn't write go.sum, since it will be incomplete.
 		if cfg.CmdName != "mod init" {
-			if err := modfetch.WriteGoSum(keepSums(ctx, loaded, requirements, addBuildListZipSums), mustHaveCompleteRequirements()); err != nil {
+			if err := modfetch.WriteGoSum(ctx, keepSums(ctx, loaded, requirements, addBuildListZipSums), mustHaveCompleteRequirements()); err != nil {
 				return err
 			}
 		}
@@ -1541,14 +1761,14 @@
 		// 'go mod init' shouldn't write go.sum, since it will be incomplete.
 		if cfg.CmdName != "mod init" {
 			if err == nil {
-				err = modfetch.WriteGoSum(keepSums(ctx, loaded, requirements, addBuildListZipSums), mustHaveCompleteRequirements())
+				err = modfetch.WriteGoSum(ctx, keepSums(ctx, loaded, requirements, addBuildListZipSums), mustHaveCompleteRequirements())
 			}
 		}
 	}()
 
 	// Make a best-effort attempt to acquire the side lock, only to exclude
 	// previous versions of the 'go' command from making simultaneous edits.
-	if unlock, err := modfetch.SideLock(); err == nil {
+	if unlock, err := modfetch.SideLock(ctx); err == nil {
 		defer unlock()
 	}
 
@@ -1583,7 +1803,8 @@
 // keepSums returns the set of modules (and go.mod file entries) for which
 // checksums would be needed in order to reload the same set of packages
 // loaded by the most recent call to LoadPackages or ImportFromFiles,
-// including any go.mod files needed to reconstruct the MVS result,
+// including any go.mod files needed to reconstruct the MVS result
+// or identify go versions,
 // in addition to the checksums for every module in keepMods.
 func keepSums(ctx context.Context, ld *loader, rs *Requirements, which whichSums) map[module.Version]bool {
 	// Every module in the full module graph contributes its requirements,
@@ -1596,7 +1817,17 @@
 	// paths of loaded packages. We need to retain sums for all of these modules —
 	// not just the modules containing the actual packages — in order to rule out
 	// ambiguous import errors the next time we load the package.
-	if ld != nil {
+	keepModSumsForZipSums := true
+	if ld == nil {
+		if gover.Compare(MainModules.GoVersion(), gover.TidyGoModSumVersion) < 0 && cfg.BuildMod != "mod" {
+			keepModSumsForZipSums = false
+		}
+	} else {
+		keepPkgGoModSums := true
+		if gover.Compare(ld.requirements.GoVersion(), gover.TidyGoModSumVersion) < 0 && (ld.Tidy || cfg.BuildMod != "mod") {
+			keepPkgGoModSums = false
+			keepModSumsForZipSums = false
+		}
 		for _, pkg := range ld.pkgs {
 			// We check pkg.mod.Path here instead of pkg.inStd because the
 			// pseudo-package "C" is not in std, but not provided by any module (and
@@ -1605,6 +1836,16 @@
 				continue
 			}
 
+			// We need the checksum for the go.mod file for pkg.mod
+			// so that we know what Go version to use to compile pkg.
+			// However, we didn't do so before Go 1.21, and the bug is relatively
+			// minor, so we maintain the previous (buggy) behavior in 'go mod tidy' to
+			// avoid introducing unnecessary churn.
+			if keepPkgGoModSums {
+				r := resolveReplacement(pkg.mod)
+				keep[modkey(r)] = true
+			}
+
 			if rs.pruning == pruned && pkg.mod.Path != "" {
 				if v, ok := rs.rootSelected(pkg.mod.Path); ok && v == pkg.mod.Version {
 					// pkg was loaded from a root module, and because the main module has
@@ -1660,6 +1901,9 @@
 		if which == addBuildListZipSums {
 			for _, m := range mg.BuildList() {
 				r := resolveReplacement(m)
+				if keepModSumsForZipSums {
+					keep[modkey(r)] = true // we need the go version from the go.mod file to do anything useful with the zipfile
+				}
 				keep[r] = true
 			}
 		}
diff --git a/src/cmd/go/internal/modload/list.go b/src/cmd/go/internal/modload/list.go
index f77901f..e8872ba 100644
--- a/src/cmd/go/internal/modload/list.go
+++ b/src/cmd/go/internal/modload/list.go
@@ -17,6 +17,7 @@
 
 	"cmd/go/internal/base"
 	"cmd/go/internal/cfg"
+	"cmd/go/internal/gover"
 	"cmd/go/internal/modfetch/codehost"
 	"cmd/go/internal/modinfo"
 	"cmd/go/internal/search"
@@ -109,8 +110,14 @@
 
 	if err == nil {
 		requirements = rs
-		if !ExplicitWriteGoMod {
-			err = commitRequirements(ctx)
+		// TODO(#61605): The extra ListU clause fixes a problem with Go 1.21rc3
+		// where "go mod tidy" and "go list -m -u all" fight over whether the go.sum
+		// should be considered up-to-date. The fix for now is to always treat the
+		// go.sum as up-to-date during list -m -u. Probably the right fix is more targeted,
+		// but in general list -u is looking up other checksums in the checksum database
+		// that won't be necessary later, so it makes sense not to write the go.sum back out.
+		if !ExplicitWriteGoMod && mode&ListU == 0 {
+			err = commitRequirements(ctx, WriteOpts{})
 		}
 	}
 	return mods, err
@@ -120,6 +127,9 @@
 	if len(args) == 0 {
 		var ms []*modinfo.ModulePublic
 		for _, m := range MainModules.Versions() {
+			if gover.IsToolchain(m.Path) {
+				continue
+			}
 			ms = append(ms, moduleInfo(ctx, rs, m, mode, reuse))
 		}
 		return rs, ms, nil
@@ -183,7 +193,7 @@
 			}
 
 			allowed := CheckAllowed
-			if IsRevisionQuery(vers) || mode&ListRetracted != 0 {
+			if IsRevisionQuery(path, vers) || mode&ListRetracted != 0 {
 				// Allow excluded and retracted versions if the user asked for a
 				// specific revision or used 'go list -retracted'.
 				allowed = nil
@@ -219,9 +229,10 @@
 		// Module path or pattern.
 		var match func(string) bool
 		if arg == "all" {
-			match = func(string) bool { return true }
+			match = func(p string) bool { return !gover.IsToolchain(p) }
 		} else if strings.Contains(arg, "...") {
-			match = pkgpattern.MatchPattern(arg)
+			mp := pkgpattern.MatchPattern(arg)
+			match = func(p string) bool { return mp(p) && !gover.IsToolchain(p) }
 		} else {
 			var v string
 			if mg == nil {
diff --git a/src/cmd/go/internal/modload/load.go b/src/cmd/go/internal/modload/load.go
index e4f6a95..a993fe8 100644
--- a/src/cmd/go/internal/modload/load.go
+++ b/src/cmd/go/internal/modload/load.go
@@ -113,6 +113,7 @@
 	"cmd/go/internal/base"
 	"cmd/go/internal/cfg"
 	"cmd/go/internal/fsys"
+	"cmd/go/internal/gover"
 	"cmd/go/internal/imports"
 	"cmd/go/internal/modfetch"
 	"cmd/go/internal/modindex"
@@ -122,7 +123,6 @@
 	"cmd/go/internal/str"
 
 	"golang.org/x/mod/module"
-	"golang.org/x/mod/semver"
 )
 
 // loaded is the most recently-used package loader.
@@ -135,13 +135,13 @@
 
 // PackageOpts control the behavior of the LoadPackages function.
 type PackageOpts struct {
-	// GoVersion is the Go version to which the go.mod file should be updated
+	// TidyGoVersion is the Go version to which the go.mod file should be updated
 	// after packages have been loaded.
 	//
-	// An empty GoVersion means to use the Go version already specified in the
+	// An empty TidyGoVersion means to use the Go version already specified in the
 	// main module's go.mod file, or the latest Go version if there is no main
 	// module.
-	GoVersion string
+	TidyGoVersion string
 
 	// Tags are the build tags in effect (as interpreted by the
 	// cmd/go/internal/imports package).
@@ -149,7 +149,7 @@
 	Tags map[string]bool
 
 	// Tidy, if true, requests that the build list and go.sum file be reduced to
-	// the minimial dependencies needed to reproducibly reload the requested
+	// the minimal dependencies needed to reproducibly reload the requested
 	// packages.
 	Tidy bool
 
@@ -234,6 +234,10 @@
 
 	// Resolve the query against this module.
 	MainModule module.Version
+
+	// If Switcher is non-nil, then LoadPackages passes all encountered errors
+	// to Switcher.Error and tries Switcher.Switch before base.ExitIfErrors.
+	Switcher gover.Switcher
 }
 
 // LoadPackages identifies the set of packages matching the given patterns and
@@ -338,7 +342,10 @@
 		}
 	}
 
-	initialRS := LoadModFile(ctx)
+	initialRS, err := loadModFile(ctx, &opts)
+	if err != nil {
+		base.Fatal(err)
+	}
 
 	ld := loadFromRoots(ctx, loaderParams{
 		PackageOpts:  opts,
@@ -363,11 +370,11 @@
 	if !ld.SilencePackageErrors {
 		for _, match := range matches {
 			for _, err := range match.Errs {
-				ld.errorf("%v\n", err)
+				ld.error(err)
 			}
 		}
 	}
-	base.ExitIfErrors()
+	ld.exitIfErrors(ctx)
 
 	if !opts.SilenceUnmatchedWarnings {
 		search.WarnUnmatched(matches)
@@ -376,7 +383,6 @@
 	if opts.Tidy {
 		if cfg.BuildV {
 			mg, _ := ld.requirements.Graph(ctx)
-
 			for _, m := range initialRS.rootModules {
 				var unused bool
 				if ld.requirements.pruning == unpruned {
@@ -398,9 +404,26 @@
 		}
 
 		keep := keepSums(ctx, ld, ld.requirements, loadedZipSumsOnly)
-		if compatDepth := pruningForGoVersion(ld.TidyCompatibleVersion); compatDepth != ld.requirements.pruning {
-			compatRS := newRequirements(compatDepth, ld.requirements.rootModules, ld.requirements.direct)
-			ld.checkTidyCompatibility(ctx, compatRS)
+		compatVersion := ld.TidyCompatibleVersion
+		goVersion := ld.requirements.GoVersion()
+		if compatVersion == "" {
+			if gover.Compare(goVersion, gover.GoStrictVersion) < 0 {
+				compatVersion = gover.Prev(goVersion)
+			} else {
+				// Starting at GoStrictVersion, we no longer maintain compatibility with
+				// versions older than what is listed in the go.mod file.
+				compatVersion = goVersion
+			}
+		}
+		if gover.Compare(compatVersion, goVersion) > 0 {
+			// Each version of the Go toolchain knows how to interpret go.mod and
+			// go.sum files produced by all previous versions, so a compatibility
+			// version higher than the go.mod version adds nothing.
+			compatVersion = goVersion
+		}
+		if compatPruning := pruningForGoVersion(compatVersion); compatPruning != ld.requirements.pruning {
+			compatRS := newRequirements(compatPruning, ld.requirements.rootModules, ld.requirements.direct)
+			ld.checkTidyCompatibility(ctx, compatRS, compatVersion)
 
 			for m := range keepSums(ctx, ld, compatRS, loadedZipSumsOnly) {
 				keep[m] = true
@@ -415,15 +438,10 @@
 			// loaded.requirements, but here we may have also loaded (and want to
 			// preserve checksums for) additional entities from compatRS, which are
 			// only needed for compatibility with ld.TidyCompatibleVersion.
-			if err := modfetch.WriteGoSum(keep, mustHaveCompleteRequirements()); err != nil {
-				base.Fatalf("go: %v", err)
+			if err := modfetch.WriteGoSum(ctx, keep, mustHaveCompleteRequirements()); err != nil {
+				base.Fatal(err)
 			}
 		}
-
-		// Update the go.mod file's Go version if necessary.
-		if modFile := ModFile(); modFile != nil && ld.GoVersion != "" {
-			modFile.AddGoStmt(ld.GoVersion)
-		}
 	}
 
 	// Success! Update go.mod and go.sum (if needed) and return the results.
@@ -441,8 +459,8 @@
 	sort.Strings(loadedPackages)
 
 	if !ExplicitWriteGoMod && opts.ResolveMissingImports {
-		if err := commitRequirements(ctx); err != nil {
-			base.Fatalf("go: %v", err)
+		if err := commitRequirements(ctx, WriteOpts{}); err != nil {
+			base.Fatal(err)
 		}
 	}
 
@@ -546,9 +564,9 @@
 	pkgNotFoundLongestPrefix := ""
 	for _, mainModule := range MainModules.Versions() {
 		modRoot := MainModules.ModRoot(mainModule)
-		if modRoot != "" && strings.HasPrefix(absDir, modRoot+string(filepath.Separator)) && !strings.Contains(absDir[len(modRoot):], "@") {
-			suffix := filepath.ToSlash(absDir[len(modRoot):])
-			if pkg, found := strings.CutPrefix(suffix, "/vendor/"); found {
+		if modRoot != "" && str.HasFilePathPrefix(absDir, modRoot) && !strings.Contains(absDir[len(modRoot):], "@") {
+			suffix := filepath.ToSlash(str.TrimFilePathPrefix(absDir, modRoot))
+			if pkg, found := strings.CutPrefix(suffix, "vendor/"); found {
 				if cfg.BuildMod != "vendor" {
 					return "", fmt.Errorf("without -mod=vendor, directory %s has no package path", absDir)
 				}
@@ -562,7 +580,7 @@
 
 			mainModulePrefix := MainModules.PathPrefix(mainModule)
 			if mainModulePrefix == "" {
-				pkg := strings.TrimPrefix(suffix, "/")
+				pkg := suffix
 				if pkg == "builtin" {
 					// "builtin" is a pseudo-package with a real source file.
 					// It's not included in "std", so it shouldn't resolve from "."
@@ -572,7 +590,7 @@
 				return pkg, nil
 			}
 
-			pkg := mainModulePrefix + suffix
+			pkg := pathpkg.Join(mainModulePrefix, suffix)
 			if _, ok, err := dirInModule(pkg, mainModulePrefix, modRoot, true); err != nil {
 				return "", err
 			} else if !ok {
@@ -628,6 +646,9 @@
 // if dir is in the module cache copy of a module in our build list.
 func pathInModuleCache(ctx context.Context, dir string, rs *Requirements) string {
 	tryMod := func(m module.Version) (string, bool) {
+		if gover.IsToolchain(m.Path) {
+			return "", false
+		}
 		var root string
 		var err error
 		if repl := Replacement(m); repl.Path != "" && repl.Version == "" {
@@ -636,9 +657,9 @@
 				root = filepath.Join(replaceRelativeTo(), root)
 			}
 		} else if repl.Path != "" {
-			root, err = modfetch.DownloadDir(repl)
+			root, err = modfetch.DownloadDir(ctx, repl)
 		} else {
-			root, err = modfetch.DownloadDir(m)
+			root, err = modfetch.DownloadDir(ctx, m)
 		}
 		if err != nil {
 			return "", false
@@ -702,7 +723,7 @@
 	tags := imports.Tags()
 	imports, testImports, err := imports.ScanFiles(gofiles, tags)
 	if err != nil {
-		base.Fatalf("go: %v", err)
+		base.Fatal(err)
 	}
 
 	loaded = loadFromRoots(ctx, loaderParams{
@@ -721,8 +742,8 @@
 	requirements = loaded.requirements
 
 	if !ExplicitWriteGoMod {
-		if err := commitRequirements(ctx); err != nil {
-			base.Fatalf("go: %v", err)
+		if err := commitRequirements(ctx, WriteOpts{}); err != nil {
+			base.Fatal(err)
 		}
 	}
 }
@@ -749,17 +770,17 @@
 		if dir == modRoot {
 			return mms.PathPrefix(v), v
 		}
-		if strings.HasPrefix(dir, modRoot+string(filepath.Separator)) {
+		if str.HasFilePathPrefix(dir, modRoot) {
 			pathPrefix := MainModules.PathPrefix(v)
 			if pathPrefix > longestPrefix {
 				longestPrefix = pathPrefix
 				longestPrefixVersion = v
-				suffix := filepath.ToSlash(dir[len(modRoot):])
-				if strings.HasPrefix(suffix, "/vendor/") {
-					longestPrefixPath = strings.TrimPrefix(suffix, "/vendor/")
+				suffix := filepath.ToSlash(str.TrimFilePathPrefix(dir, modRoot))
+				if strings.HasPrefix(suffix, "vendor/") {
+					longestPrefixPath = strings.TrimPrefix(suffix, "vendor/")
 					continue
 				}
-				longestPrefixPath = mms.PathPrefix(v) + suffix
+				longestPrefixPath = pathpkg.Join(mms.PathPrefix(v), suffix)
 			}
 		}
 	}
@@ -772,7 +793,7 @@
 
 // PackageModule returns the module providing the package named by the import path.
 func PackageModule(path string) module.Version {
-	pkg, ok := loaded.pkgCache.Get(path).(*loadPkg)
+	pkg, ok := loaded.pkgCache.Get(path)
 	if !ok {
 		return module.Version{}
 	}
@@ -791,7 +812,7 @@
 	if parentIsStd {
 		path = loaded.stdVendor(parentPath, path)
 	}
-	pkg, ok := loaded.pkgCache.Get(path).(*loadPkg)
+	pkg, ok := loaded.pkgCache.Get(path)
 	if !ok {
 		// The loader should have found all the relevant paths.
 		// There are a few exceptions, though:
@@ -823,11 +844,15 @@
 	// transitively *imported by* the packages and tests in the main module.)
 	allClosesOverTests bool
 
+	// skipImportModFiles indicates whether we may skip loading go.mod files
+	// for imported packages (as in 'go mod tidy' in Go 1.17–1.20).
+	skipImportModFiles bool
+
 	work *par.Queue
 
 	// reset on each iteration
 	roots    []*loadPkg
-	pkgCache *par.Cache // package path (string) → *loadPkg
+	pkgCache *par.Cache[string, *loadPkg]
 	pkgs     []*loadPkg // transitive closure of loaded packages and tests; populated in buildStacks
 }
 
@@ -850,20 +875,46 @@
 	}
 
 	ld.roots = nil
-	ld.pkgCache = new(par.Cache)
+	ld.pkgCache = new(par.Cache[string, *loadPkg])
 	ld.pkgs = nil
 }
 
-// errorf reports an error via either os.Stderr or base.Errorf,
+// error reports an error via either os.Stderr or base.Error,
 // according to whether ld.AllowErrors is set.
-func (ld *loader) errorf(format string, args ...any) {
+func (ld *loader) error(err error) {
 	if ld.AllowErrors {
-		fmt.Fprintf(os.Stderr, format, args...)
+		fmt.Fprintf(os.Stderr, "go: %v\n", err)
+	} else if ld.Switcher != nil {
+		ld.Switcher.Error(err)
 	} else {
-		base.Errorf(format, args...)
+		base.Error(err)
 	}
 }
 
+// switchIfErrors switches toolchains if a switch is needed.
+func (ld *loader) switchIfErrors(ctx context.Context) {
+	if ld.Switcher != nil {
+		ld.Switcher.Switch(ctx)
+	}
+}
+
+// exitIfErrors switches toolchains if a switch is needed
+// or else exits if any errors have been reported.
+func (ld *loader) exitIfErrors(ctx context.Context) {
+	ld.switchIfErrors(ctx)
+	base.ExitIfErrors()
+}
+
+// goVersion reports the Go version that should be used for the loader's
+// requirements: ld.TidyGoVersion if set, or ld.requirements.GoVersion()
+// otherwise.
+func (ld *loader) goVersion() string {
+	if ld.TidyGoVersion != "" {
+		return ld.TidyGoVersion
+	}
+	return ld.requirements.GoVersion()
+}
+
 // A loadPkg records information about a single loaded package.
 type loadPkg struct {
 	// Populated at construction time:
@@ -985,42 +1036,6 @@
 		work:         par.NewQueue(runtime.GOMAXPROCS(0)),
 	}
 
-	if ld.GoVersion == "" {
-		ld.GoVersion = MainModules.GoVersion()
-
-		if ld.Tidy && versionLess(LatestGoVersion(), ld.GoVersion) {
-			ld.errorf("go: go.mod file indicates go %s, but maximum version supported by tidy is %s\n", ld.GoVersion, LatestGoVersion())
-			base.ExitIfErrors()
-		}
-	}
-
-	if ld.Tidy {
-		if ld.TidyCompatibleVersion == "" {
-			ld.TidyCompatibleVersion = priorGoVersion(ld.GoVersion)
-		} else if versionLess(ld.GoVersion, ld.TidyCompatibleVersion) {
-			// Each version of the Go toolchain knows how to interpret go.mod and
-			// go.sum files produced by all previous versions, so a compatibility
-			// version higher than the go.mod version adds nothing.
-			ld.TidyCompatibleVersion = ld.GoVersion
-		}
-	}
-
-	if semver.Compare("v"+ld.GoVersion, narrowAllVersionV) < 0 && !ld.UseVendorAll {
-		// The module's go version explicitly predates the change in "all" for graph
-		// pruning, so continue to use the older interpretation.
-		ld.allClosesOverTests = true
-	}
-
-	var err error
-	desiredPruning := pruningForGoVersion(ld.GoVersion)
-	if ld.requirements.pruning == workspace {
-		desiredPruning = workspace
-	}
-	ld.requirements, err = convertPruning(ctx, ld.requirements, desiredPruning)
-	if err != nil {
-		ld.errorf("go: %v\n", err)
-	}
-
 	if ld.requirements.pruning == unpruned {
 		// If the module graph does not support pruning, we assume that we will need
 		// the full module graph in order to load package dependencies.
@@ -1033,12 +1048,36 @@
 		var err error
 		ld.requirements, _, err = expandGraph(ctx, ld.requirements)
 		if err != nil {
-			ld.errorf("go: %v\n", err)
+			ld.error(err)
 		}
 	}
+	ld.exitIfErrors(ctx)
+
+	updateGoVersion := func() {
+		goVersion := ld.goVersion()
+
+		if ld.requirements.pruning != workspace {
+			var err error
+			ld.requirements, err = convertPruning(ctx, ld.requirements, pruningForGoVersion(goVersion))
+			if err != nil {
+				ld.error(err)
+				ld.exitIfErrors(ctx)
+			}
+		}
+
+		// If the module's Go version omits go.sum entries for go.mod files for test
+		// dependencies of external packages, avoid loading those files in the first
+		// place.
+		ld.skipImportModFiles = ld.Tidy && gover.Compare(goVersion, gover.TidyGoModSumVersion) < 0
+
+		// If the module's go version explicitly predates the change in "all" for
+		// graph pruning, continue to use the older interpretation.
+		ld.allClosesOverTests = gover.Compare(goVersion, gover.NarrowAllVersion) < 0 && !ld.UseVendorAll
+	}
 
 	for {
 		ld.reset()
+		updateGoVersion()
 
 		// Load the root packages and their imports.
 		// Note: the returned roots can change on each iteration,
@@ -1084,7 +1123,7 @@
 
 		changed, err := ld.updateRequirements(ctx)
 		if err != nil {
-			ld.errorf("go: %v\n", err)
+			ld.error(err)
 			break
 		}
 		if changed {
@@ -1101,7 +1140,11 @@
 			break
 		}
 
-		modAddedBy := ld.resolveMissingImports(ctx)
+		modAddedBy, err := ld.resolveMissingImports(ctx)
+		if err != nil {
+			ld.error(err)
+			break
+		}
 		if len(modAddedBy) == 0 {
 			// The roots are stable, and we've resolved all of the missing packages
 			// that we can.
@@ -1112,7 +1155,7 @@
 		for m := range modAddedBy {
 			toAdd = append(toAdd, m)
 		}
-		module.Sort(toAdd) // to make errors deterministic
+		gover.ModSort(toAdd) // to make errors deterministic
 
 		// We ran updateRequirements before resolving missing imports and it didn't
 		// make any changes, so we know that the requirement graph is already
@@ -1131,11 +1174,11 @@
 			// are more descriptive.
 			if err, ok := err.(*mvs.BuildListError); ok {
 				if pkg := modAddedBy[err.Module()]; pkg != nil {
-					ld.errorf("go: %s: %v\n", pkg.stackText(), err.Err)
+					ld.error(fmt.Errorf("%s: %w", pkg.stackText(), err.Err))
 					break
 				}
 			}
-			ld.errorf("go: %v\n", err)
+			ld.error(err)
 			break
 		}
 		if reflect.DeepEqual(rs.rootModules, ld.requirements.rootModules) {
@@ -1147,31 +1190,62 @@
 		}
 		ld.requirements = rs
 	}
-	base.ExitIfErrors() // TODO(bcmills): Is this actually needed?
+	ld.exitIfErrors(ctx)
 
 	// Tidy the build list, if applicable, before we report errors.
 	// (The process of tidying may remove errors from irrelevant dependencies.)
 	if ld.Tidy {
 		rs, err := tidyRoots(ctx, ld.requirements, ld.pkgs)
 		if err != nil {
-			ld.errorf("go: %v\n", err)
-			base.ExitIfErrors()
+			ld.error(err)
 		} else {
+			if ld.TidyGoVersion != "" {
+				// Attempt to switch to the requested Go version. We have been using its
+				// pruning and semantics all along, but there may have been — and may
+				// still be — requirements on higher versions in the graph.
+				tidy := overrideRoots(ctx, rs, []module.Version{{Path: "go", Version: ld.TidyGoVersion}})
+				mg, err := tidy.Graph(ctx)
+				if err != nil {
+					ld.error(err)
+				}
+				if v := mg.Selected("go"); v == ld.TidyGoVersion {
+					rs = tidy
+				} else {
+					conflict := Conflict{
+						Path: mg.g.FindPath(func(m module.Version) bool {
+							return m.Path == "go" && m.Version == v
+						})[1:],
+						Constraint: module.Version{Path: "go", Version: ld.TidyGoVersion},
+					}
+					msg := conflict.Summary()
+					if cfg.BuildV {
+						msg = conflict.String()
+					}
+					ld.error(errors.New(msg))
+				}
+			}
+
 			if ld.requirements.pruning == pruned {
-				// We continuously add tidy roots to ld.requirements during loading, so at
-				// this point the tidy roots should be a subset of the roots of
-				// ld.requirements, ensuring that no new dependencies are brought inside
-				// the graph-pruning horizon.
+				// We continuously add tidy roots to ld.requirements during loading, so
+				// at this point the tidy roots (other than possibly the "go" version
+				// edited above) should be a subset of the roots of ld.requirements,
+				// ensuring that no new dependencies are brought inside the
+				// graph-pruning horizon.
 				// If that is not the case, there is a bug in the loading loop above.
 				for _, m := range rs.rootModules {
+					if m.Path == "go" && ld.TidyGoVersion != "" {
+						continue
+					}
 					if v, ok := ld.requirements.rootSelected(m.Path); !ok || v != m.Version {
-						ld.errorf("go: internal error: a requirement on %v is needed but was not added during package loading\n", m)
-						base.ExitIfErrors()
+						ld.error(fmt.Errorf("internal error: a requirement on %v is needed but was not added during package loading (selected %s)", m, v))
 					}
 				}
 			}
+
 			ld.requirements = rs
 		}
+
+		ld.exitIfErrors(ctx)
 	}
 
 	// Report errors, if any.
@@ -1193,7 +1267,7 @@
 			// Add importer go version information to import errors of standard
 			// library packages arising from newer releases.
 			if importer := pkg.stack; importer != nil {
-				if v, ok := rawGoVersion.Load(importer.mod); ok && versionLess(LatestGoVersion(), v.(string)) {
+				if v, ok := rawGoVersion.Load(importer.mod); ok && gover.Compare(gover.Local(), v.(string)) < 0 {
 					stdErr.importerGoVersion = v.(string)
 				}
 			}
@@ -1208,19 +1282,13 @@
 			continue
 		}
 
-		ld.errorf("%s: %v\n", pkg.stackText(), pkg.err)
+		ld.error(fmt.Errorf("%s: %w", pkg.stackText(), pkg.err))
 	}
 
 	ld.checkMultiplePaths()
 	return ld
 }
 
-// versionLess returns whether a < b according to semantic version precedence.
-// Both strings are interpreted as go version strings, e.g. "1.19".
-func versionLess(a, b string) bool {
-	return semver.Compare("v"+a, "v"+b) < 0
-}
-
 // updateRequirements ensures that ld.requirements is consistent with the
 // information gained from ld.pkgs.
 //
@@ -1264,10 +1332,19 @@
 		}
 	}
 
+	var maxTooNew *gover.TooNewError
 	for _, pkg := range ld.pkgs {
+		if pkg.err != nil {
+			if tooNew := (*gover.TooNewError)(nil); errors.As(pkg.err, &tooNew) {
+				if maxTooNew == nil || gover.Compare(tooNew.GoVersion, maxTooNew.GoVersion) > 0 {
+					maxTooNew = tooNew
+				}
+			}
+		}
 		if pkg.mod.Version != "" || !MainModules.Contains(pkg.mod.Path) {
 			continue
 		}
+
 		for _, dep := range pkg.imports {
 			if !dep.fromExternalModule() {
 				continue
@@ -1318,6 +1395,9 @@
 			direct[dep.mod.Path] = true
 		}
 	}
+	if maxTooNew != nil {
+		return false, maxTooNew
+	}
 
 	var addRoots []module.Version
 	if ld.Tidy {
@@ -1369,7 +1449,14 @@
 		return false, err
 	}
 
-	if rs != ld.requirements && !reflect.DeepEqual(rs.rootModules, ld.requirements.rootModules) {
+	if rs.GoVersion() != ld.requirements.GoVersion() {
+		// A change in the selected Go version may or may not affect the set of
+		// loaded packages, but in some cases it can change the meaning of the "all"
+		// pattern, the level of pruning in the module graph, and even the set of
+		// packages present in the standard library. If it has changed, it's best to
+		// reload packages once more to be sure everything is stable.
+		changed = true
+	} else if rs != ld.requirements && !reflect.DeepEqual(rs.rootModules, ld.requirements.rootModules) {
 		// The roots of the module graph have changed in some way (not just the
 		// "direct" markings). Check whether the changes affected any of the loaded
 		// packages.
@@ -1398,7 +1485,7 @@
 				//
 				// In some sense, we can think of this as ‘upgraded the module providing
 				// pkg.path from "none" to a version higher than "none"’.
-				if _, _, _, _, err = importFromModules(ctx, pkg.path, rs, nil); err == nil {
+				if _, _, _, _, err = importFromModules(ctx, pkg.path, rs, nil, ld.skipImportModFiles); err == nil {
 					changed = true
 					break
 				}
@@ -1416,7 +1503,7 @@
 // The newly-resolved packages are added to the addedModuleFor map, and
 // resolveMissingImports returns a map from each new module version to
 // the first missing package that module would resolve.
-func (ld *loader) resolveMissingImports(ctx context.Context) (modAddedBy map[module.Version]*loadPkg) {
+func (ld *loader) resolveMissingImports(ctx context.Context) (modAddedBy map[module.Version]*loadPkg, err error) {
 	type pkgMod struct {
 		pkg *loadPkg
 		mod *module.Version
@@ -1477,6 +1564,24 @@
 	<-ld.work.Idle()
 
 	modAddedBy = map[module.Version]*loadPkg{}
+
+	var (
+		maxTooNew    *gover.TooNewError
+		maxTooNewPkg *loadPkg
+	)
+	for _, pm := range pkgMods {
+		if tooNew := (*gover.TooNewError)(nil); errors.As(pm.pkg.err, &tooNew) {
+			if maxTooNew == nil || gover.Compare(tooNew.GoVersion, maxTooNew.GoVersion) > 0 {
+				maxTooNew = tooNew
+				maxTooNewPkg = pm.pkg
+			}
+		}
+	}
+	if maxTooNew != nil {
+		fmt.Fprintf(os.Stderr, "go: toolchain upgrade needed to resolve %s\n", maxTooNewPkg.path)
+		return nil, maxTooNew
+	}
+
 	for _, pm := range pkgMods {
 		pkg, mod := pm.pkg, *pm.mod
 		if mod.Path == "" {
@@ -1489,7 +1594,7 @@
 		}
 	}
 
-	return modAddedBy
+	return modAddedBy, nil
 }
 
 // pkg locates the *loadPkg for path, creating and queuing it for loading if
@@ -1504,7 +1609,7 @@
 		panic("internal error: (*loader).pkg called with pkgImportsLoaded flag set")
 	}
 
-	pkg := ld.pkgCache.Do(path, func() any {
+	pkg := ld.pkgCache.Do(path, func() *loadPkg {
 		pkg := &loadPkg{
 			path: path,
 		}
@@ -1512,7 +1617,7 @@
 
 		ld.work.Add(func() { ld.load(ctx, pkg) })
 		return pkg
-	}).(*loadPkg)
+	})
 
 	ld.applyPkgFlags(ctx, pkg, flags)
 	return pkg
@@ -1609,7 +1714,7 @@
 			// If the main module is tidy and the package is in "all" — or if we're
 			// lucky — we can identify all of its imports without actually loading the
 			// full module graph.
-			m, _, _, _, err := importFromModules(ctx, path, ld.requirements, nil)
+			m, _, _, _, err := importFromModules(ctx, path, ld.requirements, nil, ld.skipImportModFiles)
 			if err != nil {
 				var missing *ImportMissingError
 				if errors.As(err, &missing) && ld.ResolveMissingImports {
@@ -1654,15 +1759,15 @@
 	for m := range need {
 		toAdd = append(toAdd, m)
 	}
-	module.Sort(toAdd)
+	gover.ModSort(toAdd)
 
 	rs, err := updateRoots(ctx, ld.requirements.direct, ld.requirements, nil, toAdd, ld.AssumeRootsImported)
 	if err != nil {
 		// We are missing some root dependency, and for some reason we can't load
 		// enough of the module dependency graph to add the missing root. Package
 		// loading is doomed to fail, so fail quickly.
-		ld.errorf("go: %v\n", err)
-		base.ExitIfErrors()
+		ld.error(err)
+		ld.exitIfErrors(ctx)
 		return false
 	}
 	if reflect.DeepEqual(rs.rootModules, ld.requirements.rootModules) {
@@ -1697,7 +1802,7 @@
 	}
 
 	var modroot string
-	pkg.mod, modroot, pkg.dir, pkg.altMods, pkg.err = importFromModules(ctx, pkg.path, ld.requirements, mg)
+	pkg.mod, modroot, pkg.dir, pkg.altMods, pkg.err = importFromModules(ctx, pkg.path, ld.requirements, mg, ld.skipImportModFiles)
 	if pkg.dir == "" {
 		return
 	}
@@ -1866,14 +1971,15 @@
 		if prev, ok := firstPath[src]; !ok {
 			firstPath[src] = mod.Path
 		} else if prev != mod.Path {
-			ld.errorf("go: %s@%s used for two different module paths (%s and %s)\n", src.Path, src.Version, prev, mod.Path)
+			ld.error(fmt.Errorf("%s@%s used for two different module paths (%s and %s)", src.Path, src.Version, prev, mod.Path))
 		}
 	}
 }
 
 // checkTidyCompatibility emits an error if any package would be loaded from a
 // different module under rs than under ld.requirements.
-func (ld *loader) checkTidyCompatibility(ctx context.Context, rs *Requirements) {
+func (ld *loader) checkTidyCompatibility(ctx context.Context, rs *Requirements, compatVersion string) {
+	goVersion := rs.GoVersion()
 	suggestUpgrade := false
 	suggestEFlag := false
 	suggestFixes := func() {
@@ -1890,13 +1996,13 @@
 		fmt.Fprintln(os.Stderr)
 
 		goFlag := ""
-		if ld.GoVersion != MainModules.GoVersion() {
-			goFlag = " -go=" + ld.GoVersion
+		if goVersion != MainModules.GoVersion() {
+			goFlag = " -go=" + goVersion
 		}
 
 		compatFlag := ""
-		if ld.TidyCompatibleVersion != priorGoVersion(ld.GoVersion) {
-			compatFlag = " -compat=" + ld.TidyCompatibleVersion
+		if compatVersion != gover.Prev(goVersion) {
+			compatFlag = " -compat=" + compatVersion
 		}
 		if suggestUpgrade {
 			eDesc := ""
@@ -1905,16 +2011,16 @@
 				eDesc = ", leaving some packages unresolved"
 				eFlag = " -e"
 			}
-			fmt.Fprintf(os.Stderr, "To upgrade to the versions selected by go %s%s:\n\tgo mod tidy%s -go=%s && go mod tidy%s -go=%s%s\n", ld.TidyCompatibleVersion, eDesc, eFlag, ld.TidyCompatibleVersion, eFlag, ld.GoVersion, compatFlag)
+			fmt.Fprintf(os.Stderr, "To upgrade to the versions selected by go %s%s:\n\tgo mod tidy%s -go=%s && go mod tidy%s -go=%s%s\n", compatVersion, eDesc, eFlag, compatVersion, eFlag, goVersion, compatFlag)
 		} else if suggestEFlag {
 			// If some packages are missing but no package is upgraded, then we
 			// shouldn't suggest upgrading to the Go 1.16 versions explicitly — that
 			// wouldn't actually fix anything for Go 1.16 users, and *would* break
 			// something for Go 1.17 users.
-			fmt.Fprintf(os.Stderr, "To proceed despite packages unresolved in go %s:\n\tgo mod tidy -e%s%s\n", ld.TidyCompatibleVersion, goFlag, compatFlag)
+			fmt.Fprintf(os.Stderr, "To proceed despite packages unresolved in go %s:\n\tgo mod tidy -e%s%s\n", compatVersion, goFlag, compatFlag)
 		}
 
-		fmt.Fprintf(os.Stderr, "If reproducibility with go %s is not needed:\n\tgo mod tidy%s -compat=%s\n", ld.TidyCompatibleVersion, goFlag, ld.GoVersion)
+		fmt.Fprintf(os.Stderr, "If reproducibility with go %s is not needed:\n\tgo mod tidy%s -compat=%s\n", compatVersion, goFlag, goVersion)
 
 		// TODO(#46141): Populate the linked wiki page.
 		fmt.Fprintf(os.Stderr, "For other options, see:\n\thttps://golang.org/doc/modules/pruning\n")
@@ -1922,8 +2028,10 @@
 
 	mg, err := rs.Graph(ctx)
 	if err != nil {
-		ld.errorf("go: error loading go %s module graph: %v\n", ld.TidyCompatibleVersion, err)
+		ld.error(fmt.Errorf("error loading go %s module graph: %w", compatVersion, err))
+		ld.switchIfErrors(ctx)
 		suggestFixes()
+		ld.exitIfErrors(ctx)
 		return
 	}
 
@@ -1956,7 +2064,7 @@
 
 		pkg := pkg
 		ld.work.Add(func() {
-			mod, _, _, _, err := importFromModules(ctx, pkg.path, rs, mg)
+			mod, _, _, _, err := importFromModules(ctx, pkg.path, rs, mg, ld.skipImportModFiles)
 			if mod != pkg.mod {
 				mismatches := <-mismatchMu
 				mismatches[pkg] = mismatch{mod: mod, err: err}
@@ -1982,7 +2090,7 @@
 		for _, m := range ld.requirements.rootModules {
 			if v := mg.Selected(m.Path); v != m.Version {
 				fmt.Fprintln(os.Stderr)
-				base.Fatalf("go: internal error: failed to diagnose selected-version mismatch for module %s: go %s selects %s, but go %s selects %s\n\tPlease report this at https://golang.org/issue.", m.Path, ld.GoVersion, m.Version, ld.TidyCompatibleVersion, v)
+				base.Fatalf("go: internal error: failed to diagnose selected-version mismatch for module %s: go %s selects %s, but go %s selects %s\n\tPlease report this at https://golang.org/issue.", m.Path, goVersion, m.Version, compatVersion, v)
 			}
 		}
 		return
@@ -1998,7 +2106,7 @@
 
 		if pkg.isTest() {
 			// We already did (or will) report an error for the package itself,
-			// so don't report a duplicate (and more vebose) error for its test.
+			// so don't report a duplicate (and more verbose) error for its test.
 			if _, ok := mismatches[pkg.testOf]; !ok {
 				base.Fatalf("go: internal error: mismatch recorded for test %s, but not its non-test package", pkg.path)
 			}
@@ -2023,12 +2131,12 @@
 					Path:    pkg.mod.Path,
 					Version: mg.Selected(pkg.mod.Path),
 				}
-				ld.errorf("%s loaded from %v,\n\tbut go %s would fail to locate it in %s\n", pkg.stackText(), pkg.mod, ld.TidyCompatibleVersion, selected)
+				ld.error(fmt.Errorf("%s loaded from %v,\n\tbut go %s would fail to locate it in %s", pkg.stackText(), pkg.mod, compatVersion, selected))
 			} else {
 				if ambiguous := (*AmbiguousImportError)(nil); errors.As(mismatch.err, &ambiguous) {
 					// TODO: Is this check needed?
 				}
-				ld.errorf("%s loaded from %v,\n\tbut go %s would fail to locate it:\n\t%v\n", pkg.stackText(), pkg.mod, ld.TidyCompatibleVersion, mismatch.err)
+				ld.error(fmt.Errorf("%s loaded from %v,\n\tbut go %s would fail to locate it:\n\t%v", pkg.stackText(), pkg.mod, compatVersion, mismatch.err))
 			}
 
 			suggestEFlag = true
@@ -2066,7 +2174,7 @@
 			// pkg.err should have already been logged elsewhere — along with a
 			// stack trace — so log only the import path and non-error info here.
 			suggestUpgrade = true
-			ld.errorf("%s failed to load from any module,\n\tbut go %s would load it from %v\n", pkg.path, ld.TidyCompatibleVersion, mismatch.mod)
+			ld.error(fmt.Errorf("%s failed to load from any module,\n\tbut go %s would load it from %v", pkg.path, compatVersion, mismatch.mod))
 
 		case pkg.mod != mismatch.mod:
 			// The package is loaded successfully by both Go versions, but from a
@@ -2074,15 +2182,16 @@
 			// unnoticed!) variations in behavior between builds with different
 			// toolchains.
 			suggestUpgrade = true
-			ld.errorf("%s loaded from %v,\n\tbut go %s would select %v\n", pkg.stackText(), pkg.mod, ld.TidyCompatibleVersion, mismatch.mod.Version)
+			ld.error(fmt.Errorf("%s loaded from %v,\n\tbut go %s would select %v\n", pkg.stackText(), pkg.mod, compatVersion, mismatch.mod.Version))
 
 		default:
 			base.Fatalf("go: internal error: mismatch recorded for package %s, but no differences found", pkg.path)
 		}
 	}
 
+	ld.switchIfErrors(ctx)
 	suggestFixes()
-	base.ExitIfErrors()
+	ld.exitIfErrors(ctx)
 }
 
 // scanDir is like imports.ScanDir but elides known magic imports from the list,
@@ -2214,7 +2323,7 @@
 // If there is no reason for the package to be in the current build,
 // Why returns an empty string.
 func Why(path string) string {
-	pkg, ok := loaded.pkgCache.Get(path).(*loadPkg)
+	pkg, ok := loaded.pkgCache.Get(path)
 	if !ok {
 		return ""
 	}
@@ -2226,7 +2335,7 @@
 // WhyDepth returns 0.
 func WhyDepth(path string) int {
 	n := 0
-	pkg, _ := loaded.pkgCache.Get(path).(*loadPkg)
+	pkg, _ := loaded.pkgCache.Get(path)
 	for p := pkg; p != nil; p = p.stack {
 		n++
 	}
diff --git a/src/cmd/go/internal/modload/modfile.go b/src/cmd/go/internal/modload/modfile.go
index 75c278a..d6c395f 100644
--- a/src/cmd/go/internal/modload/modfile.go
+++ b/src/cmd/go/internal/modload/modfile.go
@@ -17,6 +17,7 @@
 	"cmd/go/internal/base"
 	"cmd/go/internal/cfg"
 	"cmd/go/internal/fsys"
+	"cmd/go/internal/gover"
 	"cmd/go/internal/lockedfile"
 	"cmd/go/internal/modfetch"
 	"cmd/go/internal/par"
@@ -24,32 +25,12 @@
 
 	"golang.org/x/mod/modfile"
 	"golang.org/x/mod/module"
-	"golang.org/x/mod/semver"
-)
-
-const (
-	// narrowAllVersionV is the Go version (plus leading "v") at which the
-	// module-module "all" pattern no longer closes over the dependencies of
-	// tests outside of the main module.
-	narrowAllVersionV = "v1.16"
-
-	// ExplicitIndirectVersionV is the Go version (plus leading "v") at which a
-	// module's go.mod file is expected to list explicit requirements on every
-	// module that provides any package transitively imported by that module.
-	//
-	// Other indirect dependencies of such a module can be safely pruned out of
-	// the module graph; see https://golang.org/ref/mod#graph-pruning.
-	ExplicitIndirectVersionV = "v1.17"
-
-	// separateIndirectVersionV is the Go version (plus leading "v") at which
-	// "// indirect" dependencies are added in a block separate from the direct
-	// ones. See https://golang.org/issue/45965.
-	separateIndirectVersionV = "v1.17"
 )
 
 // ReadModFile reads and parses the mod file at gomod. ReadModFile properly applies the
 // overlay, locks the file while reading, and applies fix, if applicable.
 func ReadModFile(gomod string, fix modfile.VersionFixer) (data []byte, f *modfile.File, err error) {
+	gomod = base.ShortPath(gomod) // use short path in any errors
 	if gomodActual, ok := fsys.OverlayPath(gomod); ok {
 		// Don't lock go.mod if it's part of the overlay.
 		// On Plan 9, locking requires chmod, and we don't want to modify any file
@@ -65,44 +46,31 @@
 	f, err = modfile.Parse(gomod, data, fix)
 	if err != nil {
 		// Errors returned by modfile.Parse begin with file:line.
-		return nil, nil, fmt.Errorf("errors parsing go.mod:\n%s\n", err)
+		return nil, nil, fmt.Errorf("errors parsing %s:\n%w", gomod, err)
+	}
+	if f.Go != nil && gover.Compare(f.Go.Version, gover.Local()) > 0 {
+		toolchain := ""
+		if f.Toolchain != nil {
+			toolchain = f.Toolchain.Name
+		}
+		return nil, nil, &gover.TooNewError{What: gomod, GoVersion: f.Go.Version, Toolchain: toolchain}
 	}
 	if f.Module == nil {
 		// No module declaration. Must add module path.
-		return nil, nil, errors.New("no module declaration in go.mod. To specify the module path:\n\tgo mod edit -module=example.com/mod")
+		return nil, nil, fmt.Errorf("error reading %s: missing module declaration. To specify the module path:\n\tgo mod edit -module=example.com/mod", gomod)
 	}
 
 	return data, f, err
 }
 
-// modFileGoVersion returns the (non-empty) Go version at which the requirements
-// in modFile are interpreted, or the latest Go version if modFile is nil.
-func modFileGoVersion(modFile *modfile.File) string {
-	if modFile == nil {
-		return LatestGoVersion()
-	}
-	if modFile.Go == nil || modFile.Go.Version == "" {
-		// The main module necessarily has a go.mod file, and that file lacks a
-		// 'go' directive. The 'go' command has been adding that directive
-		// automatically since Go 1.12, so this module either dates to Go 1.11 or
-		// has been erroneously hand-edited.
-		//
-		// The semantics of the go.mod file are more-or-less the same from Go 1.11
-		// through Go 1.16, changing at 1.17 to support module graph pruning.
-		// So even though a go.mod file without a 'go' directive is theoretically a
-		// Go 1.11 file, scripts may assume that it ends up as a Go 1.16 module.
-		return "1.16"
-	}
-	return modFile.Go.Version
-}
-
 // A modFileIndex is an index of data corresponding to a modFile
 // at a specific point in time.
 type modFileIndex struct {
 	data         []byte
 	dataNeedsFix bool // true if fixVersion applied a change while parsing data
 	module       module.Version
-	goVersionV   string // GoVersion with "v" prefix
+	goVersion    string // Go version (no "v" or "go" prefix)
+	toolchain    string
 	require      map[module.Version]requireMeta
 	replace      map[module.Version]module.Version
 	exclude      map[module.Version]bool
@@ -123,8 +91,21 @@
 	workspace                   // pruned to the union of modules in the workspace
 )
 
+func (p modPruning) String() string {
+	switch p {
+	case pruned:
+		return "pruned"
+	case unpruned:
+		return "unpruned"
+	case workspace:
+		return "workspace"
+	default:
+		return fmt.Sprintf("%T(%d)", p, p)
+	}
+}
+
 func pruningForGoVersion(goVersion string) modPruning {
-	if semver.Compare("v"+goVersion, ExplicitIndirectVersionV) < 0 {
+	if gover.Compare(goVersion, gover.ExplicitIndirectVersion) < 0 {
 		// The go.mod file does not duplicate relevant information about transitive
 		// dependencies, so they cannot be pruned out.
 		return unpruned
@@ -216,7 +197,7 @@
 	var rationale []string
 	isRetracted := false
 	for _, r := range summary.retract {
-		if semver.Compare(r.Low, m.Version) <= 0 && semver.Compare(m.Version, r.High) <= 0 {
+		if gover.ModCompare(m.Path, r.Low, m.Version) <= 0 && gover.ModCompare(m.Path, m.Version, r.High) <= 0 {
 			isRetracted = true
 			if r.Rationale != "" {
 				rationale = append(rationale, r.Rationale)
@@ -425,15 +406,16 @@
 		i.module = modFile.Module.Mod
 	}
 
-	i.goVersionV = ""
+	i.goVersion = ""
 	if modFile.Go == nil {
 		rawGoVersion.Store(mod, "")
 	} else {
-		// We're going to use the semver package to compare Go versions, so go ahead
-		// and add the "v" prefix it expects once instead of every time.
-		i.goVersionV = "v" + modFile.Go.Version
+		i.goVersion = modFile.Go.Version
 		rawGoVersion.Store(mod, modFile.Go.Version)
 	}
+	if modFile.Toolchain != nil {
+		i.toolchain = modFile.Toolchain.Name
+	}
 
 	i.require = make(map[module.Version]requireMeta, len(modFile.Require))
 	for _, r := range modFile.Require {
@@ -471,21 +453,17 @@
 		return true
 	}
 
-	if modFile.Go == nil {
-		if i.goVersionV != "" {
-			return true
-		}
-	} else if "v"+modFile.Go.Version != i.goVersionV {
-		if i.goVersionV == "" && cfg.BuildMod != "mod" {
-			// go.mod files did not always require a 'go' version, so do not error out
-			// if one is missing — we may be inside an older module in the module
-			// cache, and should bias toward providing useful behavior.
-		} else {
-			return true
-		}
+	var goV, toolchain string
+	if modFile.Go != nil {
+		goV = modFile.Go.Version
+	}
+	if modFile.Toolchain != nil {
+		toolchain = modFile.Toolchain.Name
 	}
 
-	if len(modFile.Require) != len(i.require) ||
+	if goV != i.goVersion ||
+		toolchain != i.toolchain ||
+		len(modFile.Require) != len(i.require) ||
 		len(modFile.Replace) != len(i.replace) ||
 		len(modFile.Exclude) != len(i.exclude) {
 		return true
@@ -533,6 +511,7 @@
 type modFileSummary struct {
 	module     module.Version
 	goVersion  string
+	toolchain  string
 	pruning    modPruning
 	require    []module.Version
 	retract    []retraction
@@ -561,11 +540,16 @@
 	if m.Version == "" && !inWorkspaceMode() && MainModules.Contains(m.Path) {
 		panic("internal error: goModSummary called on a main module")
 	}
+	if gover.IsToolchain(m.Path) {
+		return rawGoModSummary(m)
+	}
 
 	if cfg.BuildMod == "vendor" {
 		summary := &modFileSummary{
 			module: module.Version{Path: m.Path},
 		}
+
+		readVendorList(MainModules.mustGetSingleMainModule())
 		if vendorVersion[m.Path] != m.Version {
 			// This module is not vendored, so packages cannot be loaded from it and
 			// it cannot be relevant to the build.
@@ -574,8 +558,6 @@
 
 		// For every module other than the target,
 		// return the full list of modules from modules.txt.
-		readVendorList(MainModules.mustGetSingleMainModule())
-
 		// We don't know what versions the vendored module actually relies on,
 		// so assume that it requires everything.
 		summary.require = vendorList
@@ -583,10 +565,10 @@
 	}
 
 	actual := resolveReplacement(m)
-	if HasModRoot() && cfg.BuildMod == "readonly" && !inWorkspaceMode() && actual.Version != "" {
+	if mustHaveSums() && actual.Version != "" {
 		key := module.Version{Path: actual.Path, Version: actual.Version + "/go.mod"}
 		if !modfetch.HaveSum(key) {
-			suggestion := fmt.Sprintf("; to add it:\n\tgo mod download %s", m.Path)
+			suggestion := fmt.Sprintf(" for go.mod file; to add it:\n\tgo mod download %s", m.Path)
 			return nil, module.VersionError(actual, &sumMissingError{suggestion: suggestion})
 		}
 	}
@@ -615,9 +597,10 @@
 		// to leave that validation for when we load actual packages from within the
 		// module.
 		if mpath := summary.module.Path; mpath != m.Path && mpath != actual.Path {
-			return nil, module.VersionError(actual, fmt.Errorf(`parsing go.mod:
-	module declares its path as: %s
-	        but was required as: %s`, mpath, m.Path))
+			return nil, module.VersionError(actual,
+				fmt.Errorf("parsing go.mod:\n"+
+					"\tmodule declares its path as: %s\n"+
+					"\t        but was required as: %s", mpath, m.Path))
 		}
 	}
 
@@ -653,47 +636,67 @@
 // ignoring all replacements that may apply to m and excludes that may apply to
 // its dependencies.
 //
-// rawGoModSummary cannot be used on the Target module.
-
+// rawGoModSummary cannot be used on the main module outside of workspace mode.
 func rawGoModSummary(m module.Version) (*modFileSummary, error) {
-	if m.Path == "" && MainModules.Contains(m.Path) {
-		panic("internal error: rawGoModSummary called on the Target module")
+	if gover.IsToolchain(m.Path) {
+		if m.Path == "go" && gover.Compare(m.Version, gover.GoStrictVersion) >= 0 {
+			// Declare that go 1.21.3 requires toolchain 1.21.3,
+			// so that go get knows that downgrading toolchain implies downgrading go
+			// and similarly upgrading go requires upgrading the toolchain.
+			return &modFileSummary{module: m, require: []module.Version{{Path: "toolchain", Version: "go" + m.Version}}}, nil
+		}
+		return &modFileSummary{module: m}, nil
 	}
-
-	type key struct {
-		m module.Version
+	if m.Version == "" && !inWorkspaceMode() && MainModules.Contains(m.Path) {
+		// Calling rawGoModSummary implies that we are treating m as a module whose
+		// requirements aren't the roots of the module graph and can't be modified.
+		//
+		// If we are not in workspace mode, then the requirements of the main module
+		// are the roots of the module graph and we expect them to be kept consistent.
+		panic("internal error: rawGoModSummary called on a main module")
 	}
-	type cached struct {
-		summary *modFileSummary
-		err     error
+	if m.Version == "" && inWorkspaceMode() && m.Path == "command-line-arguments" {
+		// "go work sync" calls LoadModGraph to make sure the module graph is valid.
+		// If there are no modules in the workspace, we synthesize an empty
+		// command-line-arguments module, which rawGoModData cannot read a go.mod for.
+		return &modFileSummary{module: m}, nil
 	}
-	c := rawGoModSummaryCache.Do(key{m}, func() any {
+	return rawGoModSummaryCache.Do(m, func() (*modFileSummary, error) {
 		summary := new(modFileSummary)
 		name, data, err := rawGoModData(m)
 		if err != nil {
-			return cached{nil, err}
+			return nil, err
 		}
 		f, err := modfile.ParseLax(name, data, nil)
 		if err != nil {
-			return cached{nil, module.VersionError(m, fmt.Errorf("parsing %s: %v", base.ShortPath(name), err))}
+			return nil, module.VersionError(m, fmt.Errorf("parsing %s: %v", base.ShortPath(name), err))
 		}
 		if f.Module != nil {
 			summary.module = f.Module.Mod
 			summary.deprecated = f.Module.Deprecated
 		}
-		if f.Go != nil && f.Go.Version != "" {
+		if f.Go != nil {
 			rawGoVersion.LoadOrStore(m, f.Go.Version)
 			summary.goVersion = f.Go.Version
 			summary.pruning = pruningForGoVersion(f.Go.Version)
 		} else {
 			summary.pruning = unpruned
 		}
+		if f.Toolchain != nil {
+			summary.toolchain = f.Toolchain.Name
+		}
 		if len(f.Require) > 0 {
-			summary.require = make([]module.Version, 0, len(f.Require))
+			summary.require = make([]module.Version, 0, len(f.Require)+1)
 			for _, req := range f.Require {
 				summary.require = append(summary.require, req.Mod)
 			}
 		}
+		if summary.goVersion != "" && gover.Compare(summary.goVersion, gover.GoStrictVersion) >= 0 {
+			if gover.Compare(summary.goVersion, gover.Local()) > 0 {
+				return nil, &gover.TooNewError{What: "module " + m.String(), GoVersion: summary.goVersion}
+			}
+			summary.require = append(summary.require, module.Version{Path: "go", Version: summary.goVersion})
+		}
 		if len(f.Retract) > 0 {
 			summary.retract = make([]retraction, 0, len(f.Retract))
 			for _, ret := range f.Retract {
@@ -704,30 +707,27 @@
 			}
 		}
 
-		return cached{summary, nil}
-	}).(cached)
-
-	return c.summary, c.err
+		return summary, nil
+	})
 }
 
-var rawGoModSummaryCache par.Cache // module.Version → rawGoModSummary result
+var rawGoModSummaryCache par.ErrCache[module.Version, *modFileSummary]
 
 // rawGoModData returns the content of the go.mod file for module m, ignoring
 // all replacements that may apply to m.
 //
-// rawGoModData cannot be used on the Target module.
+// rawGoModData cannot be used on the main module outside of workspace mode.
 //
 // Unlike rawGoModSummary, rawGoModData does not cache its results in memory.
 // Use rawGoModSummary instead unless you specifically need these bytes.
 func rawGoModData(m module.Version) (name string, data []byte, err error) {
 	if m.Version == "" {
-		// m is a replacement module with only a file path.
-
 		dir := m.Path
 		if !filepath.IsAbs(dir) {
 			if inWorkspaceMode() && MainModules.Contains(m.Path) {
 				dir = MainModules.ModRoot(m)
 			} else {
+				// m is a replacement module with only a file path.
 				dir = filepath.Join(replaceRelativeTo(), dir)
 			}
 		}
@@ -744,12 +744,12 @@
 			return "", nil, module.VersionError(m, fmt.Errorf("reading %s: %v", base.ShortPath(name), err))
 		}
 	} else {
-		if !semver.IsValid(m.Version) {
+		if !gover.ModIsValid(m.Path, m.Version) {
 			// Disallow the broader queries supported by fetch.Lookup.
 			base.Fatalf("go: internal error: %s@%s: unexpected invalid semantic version", m.Path, m.Version)
 		}
 		name = "go.mod"
-		data, err = modfetch.GoMod(m.Path, m.Version)
+		data, err = modfetch.GoMod(context.TODO(), m.Path, m.Version)
 	}
 	return name, data, err
 }
@@ -765,18 +765,14 @@
 // If the queried latest version is replaced,
 // queryLatestVersionIgnoringRetractions returns the replacement.
 func queryLatestVersionIgnoringRetractions(ctx context.Context, path string) (latest module.Version, err error) {
-	type entry struct {
-		latest module.Version
-		err    error
-	}
-	e := latestVersionIgnoringRetractionsCache.Do(path, func() any {
+	return latestVersionIgnoringRetractionsCache.Do(path, func() (module.Version, error) {
 		ctx, span := trace.StartSpan(ctx, "queryLatestVersionIgnoringRetractions "+path)
 		defer span.Done()
 
 		if repl := Replacement(module.Version{Path: path}); repl.Path != "" {
 			// All versions of the module were replaced.
 			// No need to query.
-			return &entry{latest: repl}
+			return repl, nil
 		}
 
 		// Find the latest version of the module.
@@ -785,18 +781,17 @@
 		var allowAll AllowedFunc
 		rev, err := Query(ctx, path, "latest", ignoreSelected, allowAll)
 		if err != nil {
-			return &entry{err: err}
+			return module.Version{}, err
 		}
 		latest := module.Version{Path: path, Version: rev.Version}
 		if repl := resolveReplacement(latest); repl.Path != "" {
 			latest = repl
 		}
-		return &entry{latest: latest}
-	}).(*entry)
-	return e.latest, e.err
+		return latest, nil
+	})
 }
 
-var latestVersionIgnoringRetractionsCache par.Cache // path → queryLatestVersionIgnoringRetractions result
+var latestVersionIgnoringRetractionsCache par.ErrCache[string, module.Version] // path → queryLatestVersionIgnoringRetractions result
 
 // ToDirectoryPath adds a prefix if necessary so that path in unambiguously
 // an absolute path or a relative path starting with a '.' or '..'
diff --git a/src/cmd/go/internal/modload/mvs.go b/src/cmd/go/internal/modload/mvs.go
index ea1c21b..8ae2dbf 100644
--- a/src/cmd/go/internal/modload/mvs.go
+++ b/src/cmd/go/internal/modload/mvs.go
@@ -10,20 +10,20 @@
 	"os"
 	"sort"
 
+	"cmd/go/internal/gover"
 	"cmd/go/internal/modfetch"
 	"cmd/go/internal/modfetch/codehost"
 
 	"golang.org/x/mod/module"
-	"golang.org/x/mod/semver"
 )
 
 // cmpVersion implements the comparison for versions in the module loader.
 //
-// It is consistent with semver.Compare except that as a special case,
+// It is consistent with gover.ModCompare except that as a special case,
 // the version "" is considered higher than all other versions.
 // The main module (also known as the target) has no version and must be chosen
 // over other versions of the same module in the module dependency graph.
-func cmpVersion(v1, v2 string) int {
+func cmpVersion(p string, v1, v2 string) int {
 	if v2 == "" {
 		if v1 == "" {
 			return 0
@@ -33,7 +33,7 @@
 	if v1 == "" {
 		return 1
 	}
-	return semver.Compare(v1, v2)
+	return gover.ModCompare(p, v1, v2)
 }
 
 // mvsReqs implements mvs.Reqs for module semantic versions,
@@ -60,14 +60,14 @@
 	return summary.require, nil
 }
 
-// Max returns the maximum of v1 and v2 according to semver.Compare.
+// Max returns the maximum of v1 and v2 according to gover.ModCompare.
 //
 // As a special case, the version "" is considered higher than all other
 // versions. The main module (also known as the target) has no version and must
 // be chosen over other versions of the same module in the module dependency
 // graph.
-func (*mvsReqs) Max(v1, v2 string) string {
-	if cmpVersion(v1, v2) < 0 {
+func (*mvsReqs) Max(p, v1, v2 string) string {
+	if cmpVersion(p, v1, v2) < 0 {
 		return v2
 	}
 	return v1
@@ -83,11 +83,11 @@
 	// Note: modfetch.Lookup and repo.Versions are cached,
 	// so there's no need for us to add extra caching here.
 	err = modfetch.TryProxies(func(proxy string) error {
-		repo, err := lookupRepo(proxy, path)
+		repo, err := lookupRepo(ctx, proxy, path)
 		if err != nil {
 			return err
 		}
-		allVersions, err := repo.Versions("")
+		allVersions, err := repo.Versions(ctx, "")
 		if err != nil {
 			return err
 		}
@@ -111,21 +111,19 @@
 //
 // Since the version of a main module is not found in the version list,
 // it has no previous version.
-func previousVersion(m module.Version) (module.Version, error) {
-	// TODO(golang.org/issue/38714): thread tracing context through MVS.
-
+func previousVersion(ctx context.Context, m module.Version) (module.Version, error) {
 	if m.Version == "" && MainModules.Contains(m.Path) {
 		return module.Version{Path: m.Path, Version: "none"}, nil
 	}
 
-	list, _, err := versions(context.TODO(), m.Path, CheckAllowed)
+	list, _, err := versions(ctx, m.Path, CheckAllowed)
 	if err != nil {
 		if errors.Is(err, os.ErrNotExist) {
 			return module.Version{Path: m.Path, Version: "none"}, nil
 		}
 		return module.Version{}, err
 	}
-	i := sort.Search(len(list), func(i int) bool { return semver.Compare(list[i], m.Version) >= 0 })
+	i := sort.Search(len(list), func(i int) bool { return gover.ModCompare(m.Path, list[i], m.Version) >= 0 })
 	if i > 0 {
 		return module.Version{Path: m.Path, Version: list[i-1]}, nil
 	}
@@ -133,5 +131,6 @@
 }
 
 func (*mvsReqs) Previous(m module.Version) (module.Version, error) {
-	return previousVersion(m)
+	// TODO(golang.org/issue/38714): thread tracing context through MVS.
+	return previousVersion(context.TODO(), m)
 }
diff --git a/src/cmd/go/internal/modload/mvs_test.go b/src/cmd/go/internal/modload/mvs_test.go
index 50e93c3..e0a38b9 100644
--- a/src/cmd/go/internal/modload/mvs_test.go
+++ b/src/cmd/go/internal/modload/mvs_test.go
@@ -23,7 +23,7 @@
 		{a: "none", b: "", want: ""},
 		{a: "", b: "none", want: ""},
 	} {
-		max := reqs.Max(tc.a, tc.b)
+		max := reqs.Max("", tc.a, tc.b)
 		if max != tc.want {
 			t.Errorf("(%T).Max(%q, %q) = %q; want %q", reqs, tc.a, tc.b, max, tc.want)
 		}
diff --git a/src/cmd/go/internal/modload/query.go b/src/cmd/go/internal/modload/query.go
index c3764b4..f8ddf11 100644
--- a/src/cmd/go/internal/modload/query.go
+++ b/src/cmd/go/internal/modload/query.go
@@ -12,12 +12,14 @@
 	"io/fs"
 	"os"
 	pathpkg "path"
+	"slices"
 	"sort"
 	"strings"
 	"sync"
 	"time"
 
 	"cmd/go/internal/cfg"
+	"cmd/go/internal/gover"
 	"cmd/go/internal/imports"
 	"cmd/go/internal/modfetch"
 	"cmd/go/internal/modfetch/codehost"
@@ -100,11 +102,11 @@
 // for a given module may be reused, according to the information in origin.
 func checkReuse(ctx context.Context, path string, old *codehost.Origin) error {
 	return modfetch.TryProxies(func(proxy string) error {
-		repo, err := lookupRepo(proxy, path)
+		repo, err := lookupRepo(ctx, proxy, path)
 		if err != nil {
 			return err
 		}
-		return repo.CheckReuse(old)
+		return repo.CheckReuse(ctx, old)
 	})
 }
 
@@ -116,7 +118,7 @@
 // version. Any other error indicates the function was unable to determine
 // whether the version should be allowed, for example, the function was unable
 // to fetch or parse a go.mod file containing retractions. Typically, errors
-// other than ErrDisallowd may be ignored.
+// other than ErrDisallowed may be ignored.
 type AllowedFunc func(context.Context, module.Version) error
 
 var errQueryDisabled error = queryDisabledError{}
@@ -134,8 +136,8 @@
 	ctx, span := trace.StartSpan(ctx, "modload.queryProxy "+path+" "+query)
 	defer span.Done()
 
-	if current != "" && current != "none" && !semver.IsValid(current) {
-		return nil, fmt.Errorf("invalid previous version %q", current)
+	if current != "" && current != "none" && !gover.ModIsValid(path, current) {
+		return nil, fmt.Errorf("invalid previous version %v@%v", path, current)
 	}
 	if cfg.BuildMod == "vendor" {
 		return nil, errQueryDisabled
@@ -156,13 +158,13 @@
 		return nil, fmt.Errorf("can't query specific version (%q) of standard-library module %q", query, path)
 	}
 
-	repo, err := lookupRepo(proxy, path)
+	repo, err := lookupRepo(ctx, proxy, path)
 	if err != nil {
 		return nil, err
 	}
 
 	if old := reuse[module.Version{Path: path, Version: query}]; old != nil {
-		if err := repo.CheckReuse(old.Origin); err == nil {
+		if err := repo.CheckReuse(ctx, old.Origin); err == nil {
 			info := &modfetch.RevInfo{
 				Version: old.Version,
 				Origin:  old.Origin,
@@ -184,7 +186,7 @@
 		// If the identifier is not a canonical semver tag — including if it's a
 		// semver tag with a +metadata suffix — then modfetch.Stat will populate
 		// info.Version with a suitable pseudo-version.
-		info, err := repo.Stat(query)
+		info, err := repo.Stat(ctx, query)
 		if err != nil {
 			queryErr := err
 			// The full query doesn't correspond to a tag. If it is a semantic version
@@ -192,7 +194,7 @@
 			// semantic versioning defines them to be equivalent.
 			canonicalQuery := module.CanonicalVersion(query)
 			if canonicalQuery != "" && query != canonicalQuery {
-				info, err = repo.Stat(canonicalQuery)
+				info, err = repo.Stat(ctx, canonicalQuery)
 				if err != nil && !errors.Is(err, fs.ErrNotExist) {
 					return info, err
 				}
@@ -210,7 +212,7 @@
 	}
 
 	// Load versions and execute query.
-	versions, err := repo.Versions(qm.prefix)
+	versions, err := repo.Versions(ctx, qm.prefix)
 	if err != nil {
 		return nil, err
 	}
@@ -233,7 +235,7 @@
 	}
 
 	lookup := func(v string) (*modfetch.RevInfo, error) {
-		rev, err := repo.Stat(v)
+		rev, err := repo.Stat(ctx, v)
 		// Stat can return a non-nil rev and a non-nil err,
 		// in order to provide origin information to make the error cacheable.
 		if rev == nil && err != nil {
@@ -268,7 +270,7 @@
 				if err := allowed(ctx, module.Version{Path: path, Version: current}); errors.Is(err, ErrDisallowed) {
 					return revErr, err
 				}
-				rev, err = repo.Stat(current)
+				rev, err = repo.Stat(ctx, current)
 				if rev == nil && err != nil {
 					return revErr, err
 				}
@@ -297,7 +299,7 @@
 	}
 
 	if qm.mayUseLatest {
-		latest, err := repo.Latest()
+		latest, err := repo.Latest(ctx)
 		if err == nil {
 			if qm.allowsVersion(ctx, latest.Version) {
 				return lookup(latest.Version)
@@ -322,36 +324,18 @@
 // a particular version or revision in a repository like "v1.0.0", "master",
 // or "0123abcd". IsRevisionQuery returns false if vers is a query that
 // chooses from among available versions like "latest" or ">v1.0.0".
-func IsRevisionQuery(vers string) bool {
+func IsRevisionQuery(path, vers string) bool {
 	if vers == "latest" ||
 		vers == "upgrade" ||
 		vers == "patch" ||
 		strings.HasPrefix(vers, "<") ||
 		strings.HasPrefix(vers, ">") ||
-		(semver.IsValid(vers) && isSemverPrefix(vers)) {
+		(gover.ModIsValid(path, vers) && gover.ModIsPrefix(path, vers)) {
 		return false
 	}
 	return true
 }
 
-// isSemverPrefix reports whether v is a semantic version prefix: v1 or v1.2 (not v1.2.3).
-// The caller is assumed to have checked that semver.IsValid(v) is true.
-func isSemverPrefix(v string) bool {
-	dots := 0
-	for i := 0; i < len(v); i++ {
-		switch v[i] {
-		case '-', '+':
-			return false
-		case '.':
-			dots++
-			if dots >= 2 {
-				return false
-			}
-		}
-	}
-	return true
-}
-
 type queryMatcher struct {
 	path               string
 	prefix             string
@@ -398,7 +382,7 @@
 			qm.mayUseLatest = true
 		} else {
 			qm.mayUseLatest = module.IsPseudoVersion(current)
-			qm.filter = func(mv string) bool { return semver.Compare(mv, current) >= 0 }
+			qm.filter = func(mv string) bool { return gover.ModCompare(qm.path, mv, current) >= 0 }
 		}
 
 	case query == "patch":
@@ -409,40 +393,40 @@
 			qm.mayUseLatest = true
 		} else {
 			qm.mayUseLatest = module.IsPseudoVersion(current)
-			qm.prefix = semver.MajorMinor(current) + "."
-			qm.filter = func(mv string) bool { return semver.Compare(mv, current) >= 0 }
+			qm.prefix = gover.ModMajorMinor(qm.path, current) + "."
+			qm.filter = func(mv string) bool { return gover.ModCompare(qm.path, mv, current) >= 0 }
 		}
 
 	case strings.HasPrefix(query, "<="):
 		v := query[len("<="):]
-		if !semver.IsValid(v) {
+		if !gover.ModIsValid(path, v) {
 			return badVersion(v)
 		}
-		if isSemverPrefix(v) {
+		if gover.ModIsPrefix(path, v) {
 			// Refuse to say whether <=v1.2 allows v1.2.3 (remember, @v1.2 might mean v1.2.3).
 			return nil, fmt.Errorf("ambiguous semantic version %q in range %q", v, query)
 		}
-		qm.filter = func(mv string) bool { return semver.Compare(mv, v) <= 0 }
+		qm.filter = func(mv string) bool { return gover.ModCompare(qm.path, mv, v) <= 0 }
 		if !matchesMajor(v) {
 			qm.preferIncompatible = true
 		}
 
 	case strings.HasPrefix(query, "<"):
 		v := query[len("<"):]
-		if !semver.IsValid(v) {
+		if !gover.ModIsValid(path, v) {
 			return badVersion(v)
 		}
-		qm.filter = func(mv string) bool { return semver.Compare(mv, v) < 0 }
+		qm.filter = func(mv string) bool { return gover.ModCompare(qm.path, mv, v) < 0 }
 		if !matchesMajor(v) {
 			qm.preferIncompatible = true
 		}
 
 	case strings.HasPrefix(query, ">="):
 		v := query[len(">="):]
-		if !semver.IsValid(v) {
+		if !gover.ModIsValid(path, v) {
 			return badVersion(v)
 		}
-		qm.filter = func(mv string) bool { return semver.Compare(mv, v) >= 0 }
+		qm.filter = func(mv string) bool { return gover.ModCompare(qm.path, mv, v) >= 0 }
 		qm.preferLower = true
 		if !matchesMajor(v) {
 			qm.preferIncompatible = true
@@ -450,28 +434,28 @@
 
 	case strings.HasPrefix(query, ">"):
 		v := query[len(">"):]
-		if !semver.IsValid(v) {
+		if !gover.ModIsValid(path, v) {
 			return badVersion(v)
 		}
-		if isSemverPrefix(v) {
+		if gover.ModIsPrefix(path, v) {
 			// Refuse to say whether >v1.2 allows v1.2.3 (remember, @v1.2 might mean v1.2.3).
 			return nil, fmt.Errorf("ambiguous semantic version %q in range %q", v, query)
 		}
-		qm.filter = func(mv string) bool { return semver.Compare(mv, v) > 0 }
+		qm.filter = func(mv string) bool { return gover.ModCompare(qm.path, mv, v) > 0 }
 		qm.preferLower = true
 		if !matchesMajor(v) {
 			qm.preferIncompatible = true
 		}
 
-	case semver.IsValid(query):
-		if isSemverPrefix(query) {
+	case gover.ModIsValid(path, query):
+		if gover.ModIsPrefix(path, query) {
 			qm.prefix = query + "."
 			// Do not allow the query "v1.2" to match versions lower than "v1.2.0",
 			// such as prereleases for that version. (https://golang.org/issue/31972)
-			qm.filter = func(mv string) bool { return semver.Compare(mv, query) >= 0 }
+			qm.filter = func(mv string) bool { return gover.ModCompare(qm.path, mv, query) >= 0 }
 		} else {
 			qm.canStat = true
-			qm.filter = func(mv string) bool { return semver.Compare(mv, query) == 0 }
+			qm.filter = func(mv string) bool { return gover.ModCompare(qm.path, mv, query) == 0 }
 			qm.prefix = semver.Canonical(query)
 		}
 		if !matchesMajor(query) {
@@ -489,7 +473,11 @@
 // AllowedFunc of qm.
 func (qm *queryMatcher) allowsVersion(ctx context.Context, v string) bool {
 	if qm.prefix != "" && !strings.HasPrefix(v, qm.prefix) {
-		return false
+		if gover.IsToolchain(qm.path) && strings.TrimSuffix(qm.prefix, ".") == v {
+			// Allow 1.21 to match "1.21." prefix.
+		} else {
+			return false
+		}
 	}
 	if qm.filter != nil && !qm.filter(v) {
 		return false
@@ -520,7 +508,7 @@
 		}
 
 		if !needIncompatible {
-			// We're not yet sure whether we need to include +incomptaible versions.
+			// We're not yet sure whether we need to include +incompatible versions.
 			// Keep track of the last compatible version we've seen, and use the
 			// presence (or absence) of a go.mod file in that version to decide: a
 			// go.mod file implies that the module author is supporting modules at a
@@ -562,7 +550,7 @@
 			}
 		}
 
-		if semver.Prerelease(v) != "" {
+		if gover.ModIsPrerelease(qm.path, v) {
 			prereleases = append(prereleases, v)
 		} else {
 			releases = append(releases, v)
@@ -729,6 +717,9 @@
 				return r, err
 			}
 			r.Mod.Version = r.Rev.Version
+			if gover.IsToolchain(r.Mod.Path) {
+				return r, nil
+			}
 			root, isLocal, err := fetch(ctx, r.Mod)
 			if err != nil {
 				return r, err
@@ -768,7 +759,7 @@
 			Query:   query,
 		}
 	}
-	return results[:len(results):len(results)], modOnly, err
+	return slices.Clip(results), modOnly, err
 }
 
 // modulePrefixesExcludingTarget returns all prefixes of path that may plausibly
@@ -1017,7 +1008,7 @@
 // 1.12 at least have a go directive.
 //
 // This function is a heuristic, since it's possible to commit a file that would
-// pass this test. However, we only need a heurstic for determining whether
+// pass this test. However, we only need a heuristic for determining whether
 // +incompatible versions may be "latest", which is what this function is used
 // for.
 //
@@ -1040,18 +1031,20 @@
 // available versions, but cannot fetch specific source files.
 type versionRepo interface {
 	ModulePath() string
-	CheckReuse(*codehost.Origin) error
-	Versions(prefix string) (*modfetch.Versions, error)
-	Stat(rev string) (*modfetch.RevInfo, error)
-	Latest() (*modfetch.RevInfo, error)
+	CheckReuse(context.Context, *codehost.Origin) error
+	Versions(ctx context.Context, prefix string) (*modfetch.Versions, error)
+	Stat(ctx context.Context, rev string) (*modfetch.RevInfo, error)
+	Latest(context.Context) (*modfetch.RevInfo, error)
 }
 
 var _ versionRepo = modfetch.Repo(nil)
 
-func lookupRepo(proxy, path string) (repo versionRepo, err error) {
-	err = module.CheckPath(path)
+func lookupRepo(ctx context.Context, proxy, path string) (repo versionRepo, err error) {
+	if path != "go" && path != "toolchain" {
+		err = module.CheckPath(path)
+	}
 	if err == nil {
-		repo = modfetch.Lookup(proxy, path)
+		repo = modfetch.Lookup(ctx, proxy, path)
 	} else {
 		repo = emptyRepo{path: path, err: err}
 	}
@@ -1074,14 +1067,16 @@
 var _ versionRepo = emptyRepo{}
 
 func (er emptyRepo) ModulePath() string { return er.path }
-func (er emptyRepo) CheckReuse(old *codehost.Origin) error {
+func (er emptyRepo) CheckReuse(ctx context.Context, old *codehost.Origin) error {
 	return fmt.Errorf("empty repo")
 }
-func (er emptyRepo) Versions(prefix string) (*modfetch.Versions, error) {
+func (er emptyRepo) Versions(ctx context.Context, prefix string) (*modfetch.Versions, error) {
 	return &modfetch.Versions{}, nil
 }
-func (er emptyRepo) Stat(rev string) (*modfetch.RevInfo, error) { return nil, er.err }
-func (er emptyRepo) Latest() (*modfetch.RevInfo, error)         { return nil, er.err }
+func (er emptyRepo) Stat(ctx context.Context, rev string) (*modfetch.RevInfo, error) {
+	return nil, er.err
+}
+func (er emptyRepo) Latest(ctx context.Context) (*modfetch.RevInfo, error) { return nil, er.err }
 
 // A replacementRepo augments a versionRepo to include the replacement versions
 // (if any) found in the main module's go.mod file.
@@ -1097,14 +1092,14 @@
 
 func (rr *replacementRepo) ModulePath() string { return rr.repo.ModulePath() }
 
-func (rr *replacementRepo) CheckReuse(old *codehost.Origin) error {
+func (rr *replacementRepo) CheckReuse(ctx context.Context, old *codehost.Origin) error {
 	return fmt.Errorf("replacement repo")
 }
 
 // Versions returns the versions from rr.repo augmented with any matching
 // replacement versions.
-func (rr *replacementRepo) Versions(prefix string) (*modfetch.Versions, error) {
-	repoVersions, err := rr.repo.Versions(prefix)
+func (rr *replacementRepo) Versions(ctx context.Context, prefix string) (*modfetch.Versions, error) {
+	repoVersions, err := rr.repo.Versions(ctx, prefix)
 	if err != nil {
 		if !errors.Is(err, os.ErrNotExist) {
 			return nil, err
@@ -1128,15 +1123,16 @@
 		return repoVersions, nil
 	}
 
+	path := rr.ModulePath()
 	sort.Slice(versions, func(i, j int) bool {
-		return semver.Compare(versions[i], versions[j]) < 0
+		return gover.ModCompare(path, versions[i], versions[j]) < 0
 	})
 	str.Uniq(&versions)
 	return &modfetch.Versions{List: versions}, nil
 }
 
-func (rr *replacementRepo) Stat(rev string) (*modfetch.RevInfo, error) {
-	info, err := rr.repo.Stat(rev)
+func (rr *replacementRepo) Stat(ctx context.Context, rev string) (*modfetch.RevInfo, error) {
+	info, err := rr.repo.Stat(ctx, rev)
 	if err == nil {
 		return info, err
 	}
@@ -1171,8 +1167,8 @@
 	return rr.replacementStat(v)
 }
 
-func (rr *replacementRepo) Latest() (*modfetch.RevInfo, error) {
-	info, err := rr.repo.Latest()
+func (rr *replacementRepo) Latest(ctx context.Context) (*modfetch.RevInfo, error) {
+	info, err := rr.repo.Latest(ctx)
 	path := rr.ModulePath()
 
 	if v, ok := MainModules.HighestReplaced()[path]; ok {
@@ -1189,7 +1185,7 @@
 			}
 		}
 
-		if err != nil || semver.Compare(v, info.Version) > 0 {
+		if err != nil || gover.ModCompare(path, v, info.Version) > 0 {
 			return rr.replacementStat(v)
 		}
 	}
diff --git a/src/cmd/go/internal/modload/query_test.go b/src/cmd/go/internal/modload/query_test.go
index fe9ae9f..93f8f0d 100644
--- a/src/cmd/go/internal/modload/query_test.go
+++ b/src/cmd/go/internal/modload/query_test.go
@@ -55,6 +55,7 @@
 	os.Setenv("GOPATH", dir)
 	cfg.BuildContext.GOPATH = dir
 	cfg.GOMODCACHE = filepath.Join(dir, "pkg/mod")
+	cfg.SumdbDir = filepath.Join(dir, "pkg/sumdb")
 	m.Run()
 	return nil
 }
diff --git a/src/cmd/go/internal/modload/search.go b/src/cmd/go/internal/modload/search.go
index 1da46a4..cb03b69 100644
--- a/src/cmd/go/internal/modload/search.go
+++ b/src/cmd/go/internal/modload/search.go
@@ -19,10 +19,12 @@
 
 	"cmd/go/internal/cfg"
 	"cmd/go/internal/fsys"
+	"cmd/go/internal/gover"
 	"cmd/go/internal/imports"
 	"cmd/go/internal/modindex"
 	"cmd/go/internal/par"
 	"cmd/go/internal/search"
+	"cmd/go/internal/str"
 	"cmd/go/internal/trace"
 	"cmd/internal/pkgpattern"
 
@@ -77,8 +79,11 @@
 		_, span := trace.StartSpan(ctx, "walkPkgs "+root)
 		defer span.Done()
 
-		root = filepath.Clean(root)
-		err := fsys.Walk(root, func(path string, fi fs.FileInfo, err error) error {
+		// If the root itself is a symlink to a directory,
+		// we want to follow it (see https://go.dev/issue/50807).
+		// Add a trailing separator to force that to happen.
+		root = str.WithFilePathSeparator(filepath.Clean(root))
+		err := fsys.Walk(root, func(pkgDir string, fi fs.FileInfo, err error) error {
 			if err != nil {
 				m.AddError(err)
 				return nil
@@ -88,30 +93,27 @@
 			elem := ""
 
 			// Don't use GOROOT/src but do walk down into it.
-			if path == root {
+			if pkgDir == root {
 				if importPathRoot == "" {
 					return nil
 				}
 			} else {
 				// Avoid .foo, _foo, and testdata subdirectory trees.
-				_, elem = filepath.Split(path)
+				_, elem = filepath.Split(pkgDir)
 				if strings.HasPrefix(elem, ".") || strings.HasPrefix(elem, "_") || elem == "testdata" {
 					want = false
 				}
 			}
 
-			name := importPathRoot + filepath.ToSlash(path[len(root):])
-			if importPathRoot == "" {
-				name = name[1:] // cut leading slash
-			}
+			name := path.Join(importPathRoot, filepath.ToSlash(pkgDir[len(root):]))
 			if !treeCanMatch(name) {
 				want = false
 			}
 
 			if !fi.IsDir() {
 				if fi.Mode()&fs.ModeSymlink != 0 && want && strings.Contains(m.Pattern(), "...") {
-					if target, err := fsys.Stat(path); err == nil && target.IsDir() {
-						fmt.Fprintf(os.Stderr, "warning: ignoring symlink %s\n", path)
+					if target, err := fsys.Stat(pkgDir); err == nil && target.IsDir() {
+						fmt.Fprintf(os.Stderr, "warning: ignoring symlink %s\n", pkgDir)
 					}
 				}
 				return nil
@@ -121,8 +123,8 @@
 				return filepath.SkipDir
 			}
 			// Stop at module boundaries.
-			if (prune&pruneGoMod != 0) && path != root {
-				if fi, err := os.Stat(filepath.Join(path, "go.mod")); err == nil && !fi.IsDir() {
+			if (prune&pruneGoMod != 0) && pkgDir != root {
+				if fi, err := os.Stat(filepath.Join(pkgDir, "go.mod")); err == nil && !fi.IsDir() {
 					return filepath.SkipDir
 				}
 			}
@@ -131,7 +133,7 @@
 				have[name] = true
 				if isMatch(name) {
 					q.Add(func() {
-						if _, _, err := scanDir(root, path, tags); err != imports.ErrNoGo {
+						if _, _, err := scanDir(root, pkgDir, tags); err != imports.ErrNoGo {
 							addPkg(name)
 						}
 					})
@@ -171,7 +173,7 @@
 	}
 
 	for _, mod := range modules {
-		if !treeCanMatch(mod.Path) {
+		if gover.IsToolchain(mod.Path) || !treeCanMatch(mod.Path) {
 			continue
 		}
 
diff --git a/src/cmd/go/internal/modload/vendor.go b/src/cmd/go/internal/modload/vendor.go
index e369049..ffc79bb 100644
--- a/src/cmd/go/internal/modload/vendor.go
+++ b/src/cmd/go/internal/modload/vendor.go
@@ -14,6 +14,7 @@
 	"sync"
 
 	"cmd/go/internal/base"
+	"cmd/go/internal/gover"
 
 	"golang.org/x/mod/modfile"
 	"golang.org/x/mod/module"
@@ -42,7 +43,8 @@
 		vendorPkgModule = make(map[string]module.Version)
 		vendorVersion = make(map[string]string)
 		vendorMeta = make(map[module.Version]vendorMetadata)
-		data, err := os.ReadFile(filepath.Join(MainModules.ModRoot(mainModule), "vendor/modules.txt"))
+		vendorFile := filepath.Join(MainModules.ModRoot(mainModule), "vendor/modules.txt")
+		data, err := os.ReadFile(vendorFile)
 		if err != nil {
 			if !errors.Is(err, fs.ErrNotExist) {
 				base.Fatalf("go: %s", err)
@@ -98,10 +100,10 @@
 				continue
 			}
 
-			if annonations, ok := strings.CutPrefix(line, "## "); ok {
+			if annotations, ok := strings.CutPrefix(line, "## "); ok {
 				// Metadata. Take the union of annotations across multiple lines, if present.
 				meta := vendorMeta[mod]
-				for _, entry := range strings.Split(annonations, ";") {
+				for _, entry := range strings.Split(annotations, ";") {
 					entry = strings.TrimSpace(entry)
 					if entry == "explicit" {
 						meta.Explicit = true
@@ -109,6 +111,9 @@
 					if goVersion, ok := strings.CutPrefix(entry, "go "); ok {
 						meta.GoVersion = goVersion
 						rawGoVersion.Store(mod, meta.GoVersion)
+						if gover.Compare(goVersion, gover.Local()) > 0 {
+							base.Fatal(&gover.TooNewError{What: mod.Path + " in " + base.ShortPath(vendorFile), GoVersion: goVersion})
+						}
 					}
 					// All other tokens are reserved for future use.
 				}
@@ -123,7 +128,7 @@
 				// Since this module provides a package for the build, we know that it
 				// is in the build list and is the selected version of its path.
 				// If this information is new, record it.
-				if v, ok := vendorVersion[mod.Path]; !ok || semver.Compare(v, mod.Version) < 0 {
+				if v, ok := vendorVersion[mod.Path]; !ok || gover.ModCompare(mod.Path, v, mod.Version) < 0 {
 					vendorList = append(vendorList, mod)
 					vendorVersion[mod.Path] = mod.Version
 				}
@@ -139,7 +144,7 @@
 	readVendorList(MainModules.mustGetSingleMainModule())
 
 	pre114 := false
-	if semver.Compare(index.goVersionV, "v1.14") < 0 {
+	if gover.Compare(index.goVersion, "1.14") < 0 {
 		// Go versions before 1.14 did not include enough information in
 		// vendor/modules.txt to check for consistency.
 		// If we know that we're on an earlier version, relax the consistency check.
diff --git a/src/cmd/go/internal/mvs/errors.go b/src/cmd/go/internal/mvs/errors.go
index bf183ce..8db65d6 100644
--- a/src/cmd/go/internal/mvs/errors.go
+++ b/src/cmd/go/internal/mvs/errors.go
@@ -101,3 +101,5 @@
 	}
 	return b.String()
 }
+
+func (e *BuildListError) Unwrap() error { return e.Err }
diff --git a/src/cmd/go/internal/mvs/graph.go b/src/cmd/go/internal/mvs/graph.go
index c5de486..56b3c60 100644
--- a/src/cmd/go/internal/mvs/graph.go
+++ b/src/cmd/go/internal/mvs/graph.go
@@ -6,6 +6,9 @@
 
 import (
 	"fmt"
+	"slices"
+
+	"cmd/go/internal/gover"
 
 	"golang.org/x/mod/module"
 )
@@ -13,7 +16,7 @@
 // Graph implements an incremental version of the MVS algorithm, with the
 // requirements pushed by the caller instead of pulled by the MVS traversal.
 type Graph struct {
-	cmp   func(v1, v2 string) int
+	cmp   func(p, v1, v2 string) int
 	roots []module.Version
 
 	required map[module.Version][]module.Version
@@ -27,10 +30,10 @@
 //
 // The caller must ensure that the root slice is not modified while the Graph
 // may be in use.
-func NewGraph(cmp func(v1, v2 string) int, roots []module.Version) *Graph {
+func NewGraph(cmp func(p, v1, v2 string) int, roots []module.Version) *Graph {
 	g := &Graph{
 		cmp:      cmp,
-		roots:    roots[:len(roots):len(roots)],
+		roots:    slices.Clip(roots),
 		required: make(map[module.Version][]module.Version),
 		isRoot:   make(map[module.Version]bool),
 		selected: make(map[string]string),
@@ -38,7 +41,7 @@
 
 	for _, m := range roots {
 		g.isRoot[m] = true
-		if g.cmp(g.Selected(m.Path), m.Version) < 0 {
+		if g.cmp(m.Path, g.Selected(m.Path), m.Version) < 0 {
 			g.selected[m.Path] = m.Version
 		}
 	}
@@ -64,7 +67,7 @@
 
 	// Truncate reqs to its capacity to avoid aliasing bugs if it is later
 	// returned from RequiredBy and appended to.
-	reqs = reqs[:len(reqs):len(reqs)]
+	reqs = slices.Clip(reqs)
 
 	if _, dup := g.required[m]; dup {
 		panic(fmt.Sprintf("requirements of %v have already been set", m))
@@ -77,7 +80,7 @@
 			g.isRoot[dep] = false
 		}
 
-		if g.cmp(g.Selected(dep.Path), dep.Version) < 0 {
+		if g.cmp(dep.Path, g.Selected(dep.Path), dep.Version) < 0 {
 			g.selected[dep.Path] = dep.Version
 		}
 	}
@@ -137,7 +140,7 @@
 			list = append(list, module.Version{Path: path, Version: version})
 		}
 	}
-	module.Sort(list[len(uniqueRoots):])
+	gover.ModSort(list[len(uniqueRoots):])
 
 	return list
 }
diff --git a/src/cmd/go/internal/mvs/mvs.go b/src/cmd/go/internal/mvs/mvs.go
index eb33ebd..468a985 100644
--- a/src/cmd/go/internal/mvs/mvs.go
+++ b/src/cmd/go/internal/mvs/mvs.go
@@ -32,7 +32,8 @@
 	// The caller must not modify the returned list.
 	Required(m module.Version) ([]module.Version, error)
 
-	// Max returns the maximum of v1 and v2 (it returns either v1 or v2).
+	// Max returns the maximum of v1 and v2 (it returns either v1 or v2)
+	// in the module with path p.
 	//
 	// For all versions v, Max(v, "none") must be v,
 	// and for the target passed as the first argument to MVS functions,
@@ -40,7 +41,7 @@
 	//
 	// Note that v1 < v2 can be written Max(v1, v2) != v1
 	// and similarly v1 <= v2 can be written Max(v1, v2) == v2.
-	Max(v1, v2 string) string
+	Max(p, v1, v2 string) string
 }
 
 // An UpgradeReqs is a Reqs that can also identify available upgrades.
@@ -91,11 +92,11 @@
 }
 
 func buildList(targets []module.Version, reqs Reqs, upgrade func(module.Version) (module.Version, error)) ([]module.Version, error) {
-	cmp := func(v1, v2 string) int {
-		if reqs.Max(v1, v2) != v1 {
+	cmp := func(p, v1, v2 string) int {
+		if reqs.Max(p, v1, v2) != v1 {
 			return -1
 		}
-		if reqs.Max(v2, v1) != v2 {
+		if reqs.Max(p, v2, v1) != v2 {
 			return 1
 		}
 		return 0
@@ -110,12 +111,11 @@
 
 	// Explore work graph in parallel in case reqs.Required
 	// does high-latency network operations.
-	var work par.Work
+	var work par.Work[module.Version]
 	for _, target := range targets {
 		work.Add(target)
 	}
-	work.Do(10, func(item any) {
-		m := item.(module.Version)
+	work.Do(10, func(m module.Version) {
 
 		var required []module.Version
 		var err error
@@ -303,7 +303,7 @@
 			list = append(list, module.Version{Path: u.Path, Version: "none"})
 		}
 		if prev, dup := upgradeTo[u.Path]; dup {
-			upgradeTo[u.Path] = reqs.Max(prev, u.Version)
+			upgradeTo[u.Path] = reqs.Max(u.Path, prev, u.Version)
 		} else {
 			upgradeTo[u.Path] = u.Version
 		}
@@ -343,7 +343,7 @@
 		max[r.Path] = r.Version
 	}
 	for _, d := range downgrade {
-		if v, ok := max[d.Path]; !ok || reqs.Max(v, d.Version) != d.Version {
+		if v, ok := max[d.Path]; !ok || reqs.Max(d.Path, v, d.Version) != d.Version {
 			max[d.Path] = d.Version
 		}
 	}
@@ -369,7 +369,7 @@
 			return
 		}
 		added[m] = true
-		if v, ok := max[m.Path]; ok && reqs.Max(m.Version, v) != v {
+		if v, ok := max[m.Path]; ok && reqs.Max(m.Path, m.Version, v) != v {
 			// m would upgrade an existing dependency — it is not a strict downgrade,
 			// and because it was already present as a dependency, it could affect the
 			// behavior of other relevant packages.
@@ -420,7 +420,7 @@
 			// included when iterating over prior versions using reqs.Previous.
 			// Insert it into the right place in the iteration.
 			// If v is excluded, p should be returned again by reqs.Previous on the next iteration.
-			if v := max[r.Path]; reqs.Max(v, r.Version) != v && reqs.Max(p.Version, v) != p.Version {
+			if v := max[r.Path]; reqs.Max(r.Path, v, r.Version) != v && reqs.Max(r.Path, p.Version, v) != p.Version {
 				p.Version = v
 			}
 			if p.Version == "none" {
diff --git a/src/cmd/go/internal/mvs/mvs_test.go b/src/cmd/go/internal/mvs/mvs_test.go
index 26d004f..6e1e71c 100644
--- a/src/cmd/go/internal/mvs/mvs_test.go
+++ b/src/cmd/go/internal/mvs/mvs_test.go
@@ -587,7 +587,7 @@
 
 type reqsMap map[module.Version][]module.Version
 
-func (r reqsMap) Max(v1, v2 string) string {
+func (r reqsMap) Max(_, v1, v2 string) string {
 	if v1 == "none" || v2 == "" {
 		return v2
 	}
@@ -603,7 +603,7 @@
 func (r reqsMap) Upgrade(m module.Version) (module.Version, error) {
 	u := module.Version{Version: "none"}
 	for k := range r {
-		if k.Path == m.Path && r.Max(u.Version, k.Version) == k.Version && !strings.HasSuffix(k.Version, ".hidden") {
+		if k.Path == m.Path && r.Max(k.Path, u.Version, k.Version) == k.Version && !strings.HasSuffix(k.Version, ".hidden") {
 			u = k
 		}
 	}
diff --git a/src/cmd/go/internal/par/work.go b/src/cmd/go/internal/par/work.go
index 7626251..5b6de94 100644
--- a/src/cmd/go/internal/par/work.go
+++ b/src/cmd/go/internal/par/work.go
@@ -6,6 +6,7 @@
 package par
 
 import (
+	"errors"
 	"math/rand"
 	"sync"
 	"sync/atomic"
@@ -13,25 +14,25 @@
 
 // Work manages a set of work items to be executed in parallel, at most once each.
 // The items in the set must all be valid map keys.
-type Work struct {
-	f       func(any) // function to run for each item
-	running int       // total number of runners
+type Work[T comparable] struct {
+	f       func(T) // function to run for each item
+	running int     // total number of runners
 
 	mu      sync.Mutex
-	added   map[any]bool // items added to set
-	todo    []any        // items yet to be run
-	wait    sync.Cond    // wait when todo is empty
-	waiting int          // number of runners waiting for todo
+	added   map[T]bool // items added to set
+	todo    []T        // items yet to be run
+	wait    sync.Cond  // wait when todo is empty
+	waiting int        // number of runners waiting for todo
 }
 
-func (w *Work) init() {
+func (w *Work[T]) init() {
 	if w.added == nil {
-		w.added = make(map[any]bool)
+		w.added = make(map[T]bool)
 	}
 }
 
 // Add adds item to the work set, if it hasn't already been added.
-func (w *Work) Add(item any) {
+func (w *Work[T]) Add(item T) {
 	w.mu.Lock()
 	w.init()
 	if !w.added[item] {
@@ -51,7 +52,7 @@
 // before calling Do (or else Do returns immediately),
 // but it is allowed for f(item) to add new items to the set.
 // Do should only be used once on a given Work.
-func (w *Work) Do(n int, f func(item any)) {
+func (w *Work[T]) Do(n int, f func(item T)) {
 	if n < 1 {
 		panic("par.Work.Do: n < 1")
 	}
@@ -72,7 +73,7 @@
 // runner executes work in w until both nothing is left to do
 // and all the runners are waiting for work.
 // (Then all the runners return.)
-func (w *Work) runner() {
+func (w *Work[T]) runner() {
 	for {
 		// Wait for something to do.
 		w.mu.Lock()
@@ -102,26 +103,57 @@
 	}
 }
 
+// ErrCache is like Cache except that it also stores
+// an error value alongside the cached value V.
+type ErrCache[K comparable, V any] struct {
+	Cache[K, errValue[V]]
+}
+
+type errValue[V any] struct {
+	v   V
+	err error
+}
+
+func (c *ErrCache[K, V]) Do(key K, f func() (V, error)) (V, error) {
+	v := c.Cache.Do(key, func() errValue[V] {
+		v, err := f()
+		return errValue[V]{v, err}
+	})
+	return v.v, v.err
+}
+
+var ErrCacheEntryNotFound = errors.New("cache entry not found")
+
+// Get returns the cached result associated with key.
+// It returns ErrCacheEntryNotFound if there is no such result.
+func (c *ErrCache[K, V]) Get(key K) (V, error) {
+	v, ok := c.Cache.Get(key)
+	if !ok {
+		v.err = ErrCacheEntryNotFound
+	}
+	return v.v, v.err
+}
+
 // Cache runs an action once per key and caches the result.
-type Cache struct {
+type Cache[K comparable, V any] struct {
 	m sync.Map
 }
 
-type cacheEntry struct {
+type cacheEntry[V any] struct {
 	done   atomic.Bool
 	mu     sync.Mutex
-	result any
+	result V
 }
 
 // Do calls the function f if and only if Do is being called for the first time with this key.
 // No call to Do with a given key returns until the one call to f returns.
 // Do returns the value returned by the one call to f.
-func (c *Cache) Do(key any, f func() any) any {
+func (c *Cache[K, V]) Do(key K, f func() V) V {
 	entryIface, ok := c.m.Load(key)
 	if !ok {
-		entryIface, _ = c.m.LoadOrStore(key, new(cacheEntry))
+		entryIface, _ = c.m.LoadOrStore(key, new(cacheEntry[V]))
 	}
-	e := entryIface.(*cacheEntry)
+	e := entryIface.(*cacheEntry[V])
 	if !e.done.Load() {
 		e.mu.Lock()
 		if !e.done.Load() {
@@ -133,19 +165,20 @@
 	return e.result
 }
 
-// Get returns the cached result associated with key.
-// It returns nil if there is no such result.
+// Get returns the cached result associated with key
+// and reports whether there is such a result.
+//
 // If the result for key is being computed, Get does not wait for the computation to finish.
-func (c *Cache) Get(key any) any {
+func (c *Cache[K, V]) Get(key K) (V, bool) {
 	entryIface, ok := c.m.Load(key)
 	if !ok {
-		return nil
+		return *new(V), false
 	}
-	e := entryIface.(*cacheEntry)
+	e := entryIface.(*cacheEntry[V])
 	if !e.done.Load() {
-		return nil
+		return *new(V), false
 	}
-	return e.result
+	return e.result, true
 }
 
 // Clear removes all entries in the cache.
@@ -155,7 +188,7 @@
 //
 // TODO(jayconrod): Delete this after the package cache clearing functions
 // in internal/load have been removed.
-func (c *Cache) Clear() {
+func (c *Cache[K, V]) Clear() {
 	c.m.Range(func(key, value any) bool {
 		c.m.Delete(key)
 		return true
@@ -169,7 +202,7 @@
 //
 // TODO(jayconrod): Delete this after the package cache clearing functions
 // in internal/load have been removed.
-func (c *Cache) Delete(key any) {
+func (c *Cache[K, V]) Delete(key K) {
 	c.m.Delete(key)
 }
 
@@ -180,9 +213,9 @@
 //
 // TODO(jayconrod): Delete this after the package cache clearing functions
 // in internal/load have been removed.
-func (c *Cache) DeleteIf(pred func(key any) bool) {
+func (c *Cache[K, V]) DeleteIf(pred func(key K) bool) {
 	c.m.Range(func(key, _ any) bool {
-		if pred(key) {
+		if key := key.(K); pred(key) {
 			c.Delete(key)
 		}
 		return true
diff --git a/src/cmd/go/internal/par/work_test.go b/src/cmd/go/internal/par/work_test.go
index add0e64..9d96ffa 100644
--- a/src/cmd/go/internal/par/work_test.go
+++ b/src/cmd/go/internal/par/work_test.go
@@ -11,14 +11,13 @@
 )
 
 func TestWork(t *testing.T) {
-	var w Work
+	var w Work[int]
 
 	const N = 10000
 	n := int32(0)
 	w.Add(N)
-	w.Do(100, func(x any) {
+	w.Do(100, func(i int) {
 		atomic.AddInt32(&n, 1)
-		i := x.(int)
 		if i >= 2 {
 			w.Add(i - 1)
 			w.Add(i - 2)
@@ -33,14 +32,14 @@
 
 func TestWorkParallel(t *testing.T) {
 	for tries := 0; tries < 10; tries++ {
-		var w Work
+		var w Work[int]
 		const N = 100
 		for i := 0; i < N; i++ {
 			w.Add(i)
 		}
 		start := time.Now()
 		var n int32
-		w.Do(N, func(x any) {
+		w.Do(N, func(x int) {
 			time.Sleep(1 * time.Millisecond)
 			atomic.AddInt32(&n, +1)
 		})
@@ -55,22 +54,22 @@
 }
 
 func TestCache(t *testing.T) {
-	var cache Cache
+	var cache Cache[int, int]
 
 	n := 1
-	v := cache.Do(1, func() any { n++; return n })
+	v := cache.Do(1, func() int { n++; return n })
 	if v != 2 {
 		t.Fatalf("cache.Do(1) did not run f")
 	}
-	v = cache.Do(1, func() any { n++; return n })
+	v = cache.Do(1, func() int { n++; return n })
 	if v != 2 {
 		t.Fatalf("cache.Do(1) ran f again!")
 	}
-	v = cache.Do(2, func() any { n++; return n })
+	v = cache.Do(2, func() int { n++; return n })
 	if v != 3 {
 		t.Fatalf("cache.Do(2) did not run f")
 	}
-	v = cache.Do(1, func() any { n++; return n })
+	v = cache.Do(1, func() int { n++; return n })
 	if v != 2 {
 		t.Fatalf("cache.Do(1) did not returned saved value from original cache.Do(1)")
 	}
diff --git a/src/cmd/go/internal/run/run.go b/src/cmd/go/internal/run/run.go
index 137ee1d..4a3dcf0 100644
--- a/src/cmd/go/internal/run/run.go
+++ b/src/cmd/go/internal/run/run.go
@@ -97,7 +97,7 @@
 	b := work.NewBuilder("")
 	defer func() {
 		if err := b.Close(); err != nil {
-			base.Fatalf("go: %v", err)
+			base.Fatal(err)
 		}
 	}()
 	b.Print = printStderr
@@ -125,7 +125,7 @@
 			var err error
 			pkgs, err = load.PackagesAndErrorsOutsideModule(ctx, pkgOpts, args[:1])
 			if err != nil {
-				base.Fatalf("go: %v", err)
+				base.Fatal(err)
 			}
 		} else {
 			pkgs = load.PackagesAndErrors(ctx, pkgOpts, args[:1])
diff --git a/src/cmd/go/internal/script/cmds.go b/src/cmd/go/internal/script/cmds.go
index 666d2d6..36e16c5 100644
--- a/src/cmd/go/internal/script/cmds.go
+++ b/src/cmd/go/internal/script/cmds.go
@@ -414,7 +414,7 @@
 				return nil, ErrUsage
 			}
 
-			// Use the script's PATH to look up the command if it contains a separator
+			// Use the script's PATH to look up the command (if it does not contain a separator)
 			// instead of the test process's PATH (see lookPath).
 			// Don't use filepath.Clean, since that changes "./foo" to "foo".
 			name := filepath.FromSlash(args[0])
@@ -513,6 +513,18 @@
 
 	pathEnv, _ := s.LookupEnv(pathEnvName())
 	for _, dir := range strings.Split(pathEnv, string(filepath.ListSeparator)) {
+		if dir == "" {
+			continue
+		}
+
+		// Determine whether dir needs a trailing path separator.
+		// Note: we avoid filepath.Join in this function because it cleans the
+		// result: we want to preserve the exact dir prefix from the environment.
+		sep := string(filepath.Separator)
+		if os.IsPathSeparator(dir[len(dir)-1]) {
+			sep = ""
+		}
+
 		if searchExt {
 			ents, err := os.ReadDir(dir)
 			if err != nil {
@@ -521,12 +533,12 @@
 			for _, ent := range ents {
 				for _, ext := range pathExt {
 					if !ent.IsDir() && strEqual(ent.Name(), command+ext) {
-						return dir + string(filepath.Separator) + ent.Name(), nil
+						return dir + sep + ent.Name(), nil
 					}
 				}
 			}
 		} else {
-			path := dir + string(filepath.Separator) + command
+			path := dir + sep + command
 			if fi, err := os.Stat(path); err == nil && isExecutable(fi) {
 				return path, nil
 			}
diff --git a/src/cmd/go/internal/script/engine.go b/src/cmd/go/internal/script/engine.go
index dfce755..43054a2 100644
--- a/src/cmd/go/internal/script/engine.go
+++ b/src/cmd/go/internal/script/engine.go
@@ -295,7 +295,7 @@
 				// Since the 'stop' command halts execution of the entire script,
 				// log its message separately from the section in which it appears.
 				err = endSection(true)
-				s.Logf("%v\n", s)
+				s.Logf("%v\n", stop)
 				if err == nil {
 					return nil
 				}
diff --git a/src/cmd/go/internal/script/state.go b/src/cmd/go/internal/script/state.go
index f40c442..548f673 100644
--- a/src/cmd/go/internal/script/state.go
+++ b/src/cmd/go/internal/script/state.go
@@ -147,10 +147,14 @@
 // originally created.
 func (s *State) ExtractFiles(ar *txtar.Archive) error {
 	wd := s.workdir
+
 	// Add trailing separator to terminate wd.
 	// This prevents extracting to outside paths which prefix wd,
 	// e.g. extracting to /home/foobar when wd is /home/foo
-	if !strings.HasSuffix(wd, string(filepath.Separator)) {
+	if wd == "" {
+		panic("s.workdir is unexpectedly empty")
+	}
+	if !os.IsPathSeparator(wd[len(wd)-1]) {
 		wd += string(filepath.Separator)
 	}
 
@@ -194,7 +198,7 @@
 	return v, ok
 }
 
-// Path returns the absolute path in the host operaating system for a
+// Path returns the absolute path in the host operating system for a
 // script-based (generally slash-separated and relative) path.
 func (s *State) Path(path string) string {
 	if filepath.IsAbs(path) {
diff --git a/src/cmd/go/internal/search/search.go b/src/cmd/go/internal/search/search.go
index c107a02..9f216d5 100644
--- a/src/cmd/go/internal/search/search.go
+++ b/src/cmd/go/internal/search/search.go
@@ -8,6 +8,7 @@
 	"cmd/go/internal/base"
 	"cmd/go/internal/cfg"
 	"cmd/go/internal/fsys"
+	"cmd/go/internal/str"
 	"cmd/internal/pkgpattern"
 	"fmt"
 	"go/build"
@@ -45,20 +46,20 @@
 	m.Errs = append(m.Errs, &MatchError{Match: m, Err: err})
 }
 
-// Literal reports whether the pattern is free of wildcards and meta-patterns.
+// IsLiteral reports whether the pattern is free of wildcards and meta-patterns.
 //
 // A literal pattern must match at most one package.
 func (m *Match) IsLiteral() bool {
 	return !strings.Contains(m.pattern, "...") && !m.IsMeta()
 }
 
-// Local reports whether the pattern must be resolved from a specific root or
+// IsLocal reports whether the pattern must be resolved from a specific root or
 // directory, such as a filesystem path or a single module.
 func (m *Match) IsLocal() bool {
 	return build.IsLocalImport(m.pattern) || filepath.IsAbs(m.pattern)
 }
 
-// Meta reports whether the pattern is a “meta-package” keyword that represents
+// IsMeta reports whether the pattern is a “meta-package” keyword that represents
 // multiple packages, such as "std", "cmd", or "all".
 func (m *Match) IsMeta() bool {
 	return IsMetaPackage(m.pattern)
@@ -124,11 +125,16 @@
 		if (m.pattern == "std" || m.pattern == "cmd") && src != cfg.GOROOTsrc {
 			continue
 		}
-		src = filepath.Clean(src) + string(filepath.Separator)
+
+		// If the root itself is a symlink to a directory,
+		// we want to follow it (see https://go.dev/issue/50807).
+		// Add a trailing separator to force that to happen.
+		src = str.WithFilePathSeparator(filepath.Clean(src))
 		root := src
 		if m.pattern == "cmd" {
 			root += "cmd" + string(filepath.Separator)
 		}
+
 		err := fsys.Walk(root, func(path string, fi fs.FileInfo, err error) error {
 			if err != nil {
 				return err // Likely a permission error, which could interfere with matching.
@@ -255,7 +261,7 @@
 		}
 		var found bool
 		for _, modRoot := range modRoots {
-			if modRoot != "" && hasFilepathPrefix(abs, modRoot) {
+			if modRoot != "" && str.HasFilePathPrefix(abs, modRoot) {
 				found = true
 			}
 		}
@@ -268,6 +274,10 @@
 		}
 	}
 
+	// If dir is actually a symlink to a directory,
+	// we want to follow it (see https://go.dev/issue/50807).
+	// Add a trailing separator to force that to happen.
+	dir = str.WithFilePathSeparator(dir)
 	err := fsys.Walk(dir, func(path string, fi fs.FileInfo, err error) error {
 		if err != nil {
 			return err // Likely a permission error, which could interfere with matching.
@@ -428,22 +438,6 @@
 	return out
 }
 
-// hasFilepathPrefix reports whether the path s begins with the
-// elements in prefix.
-func hasFilepathPrefix(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] == filepath.Separator {
-			return strings.HasPrefix(s, prefix)
-		}
-		return s[len(prefix)] == filepath.Separator && s[:len(prefix)] == prefix
-	}
-}
-
 // IsStandardImportPath reports whether $GOROOT/src/path should be considered
 // part of the standard distribution. For historical reasons we allow people to add
 // their own code to $GOROOT instead of using $GOPATH, but we assume that
@@ -475,67 +469,44 @@
 // If not, InDir returns an empty string.
 // InDir makes some effort to succeed even in the presence of symbolic links.
 func InDir(path, dir string) string {
-	if rel := inDirLex(path, dir); rel != "" {
+	// inDirLex reports whether path is lexically in dir,
+	// without considering symbolic or hard links.
+	inDirLex := func(path, dir string) (string, bool) {
+		if dir == "" {
+			return path, true
+		}
+		rel := str.TrimFilePathPrefix(path, dir)
+		if rel == path {
+			return "", false
+		}
+		if rel == "" {
+			return ".", true
+		}
+		return rel, true
+	}
+
+	if rel, ok := inDirLex(path, dir); ok {
 		return rel
 	}
 	xpath, err := filepath.EvalSymlinks(path)
 	if err != nil || xpath == path {
 		xpath = ""
 	} else {
-		if rel := inDirLex(xpath, dir); rel != "" {
+		if rel, ok := inDirLex(xpath, dir); ok {
 			return rel
 		}
 	}
 
 	xdir, err := filepath.EvalSymlinks(dir)
 	if err == nil && xdir != dir {
-		if rel := inDirLex(path, xdir); rel != "" {
+		if rel, ok := inDirLex(path, xdir); ok {
 			return rel
 		}
 		if xpath != "" {
-			if rel := inDirLex(xpath, xdir); rel != "" {
+			if rel, ok := inDirLex(xpath, xdir); ok {
 				return rel
 			}
 		}
 	}
 	return ""
 }
-
-// inDirLex is like inDir but only checks the lexical form of the file names.
-// It does not consider symbolic links.
-// TODO(rsc): This is a copy of str.HasFilePathPrefix, modified to
-// return the suffix. Most uses of str.HasFilePathPrefix should probably
-// be calling InDir instead.
-func inDirLex(path, dir string) string {
-	pv := strings.ToUpper(filepath.VolumeName(path))
-	dv := strings.ToUpper(filepath.VolumeName(dir))
-	path = path[len(pv):]
-	dir = dir[len(dv):]
-	switch {
-	default:
-		return ""
-	case pv != dv:
-		return ""
-	case len(path) == len(dir):
-		if path == dir {
-			return "."
-		}
-		return ""
-	case dir == "":
-		return path
-	case len(path) > len(dir):
-		if dir[len(dir)-1] == filepath.Separator {
-			if path[:len(dir)] == dir {
-				return path[len(dir):]
-			}
-			return ""
-		}
-		if path[len(dir)] == filepath.Separator && path[:len(dir)] == dir {
-			if len(path) == len(dir)+1 {
-				return "."
-			}
-			return path[len(dir)+1:]
-		}
-		return ""
-	}
-}
diff --git a/src/cmd/go/internal/str/path.go b/src/cmd/go/internal/str/path.go
index c165b91..83a3d0e 100644
--- a/src/cmd/go/internal/str/path.go
+++ b/src/cmd/go/internal/str/path.go
@@ -5,7 +5,9 @@
 package str
 
 import (
+	"os"
 	"path/filepath"
+	"runtime"
 	"strings"
 )
 
@@ -28,11 +30,32 @@
 
 // HasFilePathPrefix reports whether the filesystem path s
 // begins with the elements in prefix.
+//
+// HasFilePathPrefix is case-sensitive (except for volume names) even if the
+// filesystem is not, does not apply Unicode normalization even if the
+// filesystem does, and assumes that all path separators are canonicalized to
+// filepath.Separator (as returned by filepath.Clean).
 func HasFilePathPrefix(s, prefix string) bool {
-	sv := strings.ToUpper(filepath.VolumeName(s))
-	pv := strings.ToUpper(filepath.VolumeName(prefix))
+	sv := filepath.VolumeName(s)
+	pv := filepath.VolumeName(prefix)
+
+	// Strip the volume from both paths before canonicalizing sv and pv:
+	// it's unlikely that strings.ToUpper will change the length of the string,
+	// but doesn't seem impossible.
 	s = s[len(sv):]
 	prefix = prefix[len(pv):]
+
+	// Always treat Windows volume names as case-insensitive, even though
+	// we don't treat the rest of the path as such.
+	//
+	// TODO(bcmills): Why do we care about case only for the volume name? It's
+	// been this way since https://go.dev/cl/11316, but I don't understand why
+	// that problem doesn't apply to case differences in the entire path.
+	if sv != pv {
+		sv = strings.ToUpper(sv)
+		pv = strings.ToUpper(pv)
+	}
+
 	switch {
 	default:
 		return false
@@ -50,21 +73,45 @@
 	}
 }
 
-// TrimFilePathPrefix returns s without the leading path elements in prefix.
+// TrimFilePathPrefix returns s without the leading path elements in prefix,
+// such that joining the string to prefix produces s.
+//
 // If s does not start with prefix (HasFilePathPrefix with the same arguments
 // returns false), TrimFilePathPrefix returns s. If s equals prefix,
 // TrimFilePathPrefix returns "".
 func TrimFilePathPrefix(s, prefix string) string {
+	if prefix == "" {
+		// Trimming the empty string from a path should join to produce that path.
+		// (Trim("/tmp/foo", "") should give "/tmp/foo", not "tmp/foo".)
+		return s
+	}
 	if !HasFilePathPrefix(s, prefix) {
 		return s
 	}
+
 	trimmed := s[len(prefix):]
-	if len(trimmed) == 0 || trimmed[0] != filepath.Separator {
-		// Prefix either is equal to s, or ends with a separator
-		// (for example, if it is exactly "/").
-		return trimmed
+	if len(trimmed) > 0 && os.IsPathSeparator(trimmed[0]) {
+		if runtime.GOOS == "windows" && prefix == filepath.VolumeName(prefix) && len(prefix) == 2 && prefix[1] == ':' {
+			// Joining a relative path to a bare Windows drive letter produces a path
+			// relative to the working directory on that drive, but the original path
+			// was absolute, not relative. Keep the leading path separator so that it
+			// remains absolute when joined to prefix.
+		} else {
+			// Prefix ends in a regular path element, so strip the path separator that
+			// follows it.
+			trimmed = trimmed[1:]
+		}
 	}
-	return trimmed[1:]
+	return trimmed
+}
+
+// WithFilePathSeparator returns s with a trailing path separator, or the empty
+// string if s is empty.
+func WithFilePathSeparator(s string) string {
+	if s == "" || os.IsPathSeparator(s[len(s)-1]) {
+		return s
+	}
+	return s + string(filepath.Separator)
 }
 
 // QuoteGlob returns s with all Glob metacharacters quoted.
diff --git a/src/cmd/go/internal/str/str_test.go b/src/cmd/go/internal/str/str_test.go
index 158fe65..7c19877 100644
--- a/src/cmd/go/internal/str/str_test.go
+++ b/src/cmd/go/internal/str/str_test.go
@@ -6,7 +6,9 @@
 
 import (
 	"os"
+	"path/filepath"
 	"runtime"
+	"strings"
 	"testing"
 )
 
@@ -30,29 +32,75 @@
 	}
 }
 
-type trimFilePathPrefixTest struct {
-	s, prefix, want string
+func TestHasPathPrefix(t *testing.T) {
+	type testCase struct {
+		s, prefix string
+		want      bool
+	}
+	for _, tt := range []testCase{
+		{"", "", true},
+		{"", "/", false},
+		{"foo", "", true},
+		{"foo", "/", false},
+		{"foo", "foo", true},
+		{"foo", "foo/", false},
+		{"foo", "/foo", false},
+		{"foo/bar", "", true},
+		{"foo/bar", "foo", true},
+		{"foo/bar", "foo/", true},
+		{"foo/bar", "/foo", false},
+		{"foo/bar", "foo/bar", true},
+		{"foo/bar", "foo/bar/", false},
+		{"foo/bar", "/foo/bar", false},
+	} {
+		got := HasPathPrefix(tt.s, tt.prefix)
+		if got != tt.want {
+			t.Errorf("HasPathPrefix(%q, %q) = %v; want %v", tt.s, tt.prefix, got, tt.want)
+		}
+	}
 }
 
 func TestTrimFilePathPrefixSlash(t *testing.T) {
 	if os.PathSeparator != '/' {
 		t.Skipf("test requires slash-separated file paths")
 	}
-	tests := []trimFilePathPrefixTest{
-		{"/foo", "", "foo"},
+
+	type testCase struct {
+		s, prefix, want string
+	}
+	for _, tt := range []testCase{
+		{"/", "", "/"},
+		{"/", "/", ""},
+		{"/foo", "", "/foo"},
 		{"/foo", "/", "foo"},
 		{"/foo", "/foo", ""},
 		{"/foo/bar", "/foo", "bar"},
 		{"/foo/bar", "/foo/", "bar"},
+		{"/foo/", "/", "foo/"},
+		{"/foo/", "/foo", ""},
+		{"/foo/", "/foo/", ""},
+
 		// if prefix is not s's prefix, return s
+		{"", "/", ""},
 		{"/foo", "/bar", "/foo"},
 		{"/foo", "/foo/bar", "/foo"},
-	}
-
-	for _, tt := range tests {
-		if got := TrimFilePathPrefix(tt.s, tt.prefix); got != tt.want {
+		{"foo", "/foo", "foo"},
+		{"/foo", "foo", "/foo"},
+		{"/foo", "/foo/", "/foo"},
+	} {
+		got := TrimFilePathPrefix(tt.s, tt.prefix)
+		if got == tt.want {
+			t.Logf("TrimFilePathPrefix(%q, %q) = %q", tt.s, tt.prefix, got)
+		} else {
 			t.Errorf("TrimFilePathPrefix(%q, %q) = %q, want %q", tt.s, tt.prefix, got, tt.want)
 		}
+
+		if HasFilePathPrefix(tt.s, tt.prefix) {
+			joined := filepath.Join(tt.prefix, got)
+			if clean := filepath.Clean(tt.s); joined != clean {
+				t.Errorf("filepath.Join(%q, %q) = %q, want %q", tt.prefix, got, joined, clean)
+			}
+		}
 	}
 }
 
@@ -60,16 +108,29 @@
 	if runtime.GOOS != "windows" {
 		t.Skipf("test requires Windows file paths")
 	}
-	tests := []trimFilePathPrefixTest{
-		{`C:\foo`, `C:`, `foo`},
+	type testCase struct {
+		s, prefix, want string
+	}
+	for _, tt := range []testCase{
+		{`\`, ``, `\`},
+		{`\`, `\`, ``},
+		{`C:`, `C:`, ``},
+		{`C:\`, `C:`, `\`},
+		{`C:\`, `C:\`, ``},
+		{`C:\foo`, ``, `C:\foo`},
+		{`C:\foo`, `C:`, `\foo`},
 		{`C:\foo`, `C:\`, `foo`},
 		{`C:\foo`, `C:\foo`, ``},
+		{`C:\foo\`, `C:\foo`, ``},
 		{`C:\foo\bar`, `C:\foo`, `bar`},
 		{`C:\foo\bar`, `C:\foo\`, `bar`},
 		// if prefix is not s's prefix, return s
 		{`C:\foo`, `C:\bar`, `C:\foo`},
 		{`C:\foo`, `C:\foo\bar`, `C:\foo`},
+		{`C:`, `C:\`, `C:`},
 		// if volumes are different, return s
+		{`C:`, ``, `C:`},
+		{`C:\`, ``, `C:\`},
 		{`C:\foo`, ``, `C:\foo`},
 		{`C:\foo`, `\foo`, `C:\foo`},
 		{`C:\foo`, `D:\foo`, `C:\foo`},
@@ -90,11 +151,35 @@
 		{`\\host\share\foo`, `\\other\share\`, `\\host\share\foo`},
 		{`\\host\share\foo`, `\\host\`, `\\host\share\foo`},
 		{`\\host\share\foo`, `\share\`, `\\host\share\foo`},
-	}
 
-	for _, tt := range tests {
-		if got := TrimFilePathPrefix(tt.s, tt.prefix); got != tt.want {
-			t.Errorf("TrimFilePathPrefix(%q, %q) = %q, want %q", tt.s, tt.prefix, got, tt.want)
+		// only volume names are case-insensitive
+		{`C:\foo`, `c:`, `\foo`},
+		{`C:\foo`, `c:\foo`, ``},
+		{`c:\foo`, `C:`, `\foo`},
+		{`c:\foo`, `C:\foo`, ``},
+		{`C:\foo`, `C:\Foo`, `C:\foo`},
+		{`\\Host\Share\foo`, `\\host\share`, `foo`},
+		{`\\Host\Share\foo`, `\\host\share\foo`, ``},
+		{`\\host\share\foo`, `\\Host\Share`, `foo`},
+		{`\\host\share\foo`, `\\Host\Share\foo`, ``},
+		{`\\Host\Share\foo`, `\\Host\Share\Foo`, `\\Host\Share\foo`},
+	} {
+		got := TrimFilePathPrefix(tt.s, tt.prefix)
+		if got == tt.want {
+			t.Logf("TrimFilePathPrefix(%#q, %#q) = %#q", tt.s, tt.prefix, got)
+		} else {
+			t.Errorf("TrimFilePathPrefix(%#q, %#q) = %#q, want %#q", tt.s, tt.prefix, got, tt.want)
+		}
+
+		if HasFilePathPrefix(tt.s, tt.prefix) {
+			// Although TrimFilePathPrefix is only case-insensitive in the volume name,
+			// what we care about in testing Join is that absolute paths remain
+			// absolute and relative paths remaining relative — there is no harm in
+			// over-normalizing letters in the comparison, so we use EqualFold.
+			joined := filepath.Join(tt.prefix, got)
+			if clean := filepath.Clean(tt.s); !strings.EqualFold(joined, clean) {
+				t.Errorf("filepath.Join(%#q, %#q) = %#q, want %#q", tt.prefix, got, joined, clean)
+			}
 		}
 	}
 }
diff --git a/src/cmd/go/internal/test/flagdefs.go b/src/cmd/go/internal/test/flagdefs.go
index 3f3709f..947c27e 100644
--- a/src/cmd/go/internal/test/flagdefs.go
+++ b/src/cmd/go/internal/test/flagdefs.go
@@ -19,6 +19,7 @@
 	"cpu":                  true,
 	"cpuprofile":           true,
 	"failfast":             true,
+	"fullpath":             true,
 	"fuzz":                 true,
 	"fuzzminimizetime":     true,
 	"fuzztime":             true,
@@ -49,6 +50,7 @@
 	"cgocall":          true,
 	"composites":       true,
 	"copylocks":        true,
+	"directive":        true,
 	"errorsas":         true,
 	"framepointer":     true,
 	"httpresponse":     true,
@@ -61,6 +63,7 @@
 	"rangeloops":       true,
 	"shift":            true,
 	"sigchanyzer":      true,
+	"slog":             true,
 	"stdmethods":       true,
 	"stringintconv":    true,
 	"structtag":        true,
diff --git a/src/cmd/go/internal/test/flagdefs_test.go b/src/cmd/go/internal/test/flagdefs_test.go
index d5facb7..5461b2d 100644
--- a/src/cmd/go/internal/test/flagdefs_test.go
+++ b/src/cmd/go/internal/test/flagdefs_test.go
@@ -7,11 +7,9 @@
 import (
 	"cmd/go/internal/cfg"
 	"cmd/go/internal/test/internal/genflags"
-	"flag"
 	"internal/testenv"
+	"maps"
 	"os"
-	"reflect"
-	"strings"
 	"testing"
 )
 
@@ -20,50 +18,59 @@
 	os.Exit(m.Run())
 }
 
-func TestPassFlagToTestIncludesAllTestFlags(t *testing.T) {
-	flag.VisitAll(func(f *flag.Flag) {
-		if !strings.HasPrefix(f.Name, "test.") {
-			return
-		}
-		name := strings.TrimPrefix(f.Name, "test.")
-		switch name {
-		case "testlogfile", "paniconexit0", "fuzzcachedir", "fuzzworker",
-			"gocoverdir":
-			// These are internal flags.
-		default:
-			if !passFlagToTest[name] {
-				t.Errorf("passFlagToTest missing entry for %q (flag test.%s)", name, name)
-				t.Logf("(Run 'go generate cmd/go/internal/test' if it should be added.)")
-			}
-		}
-	})
+func TestPassFlagToTest(t *testing.T) {
+	wantNames := genflags.ShortTestFlags()
 
-	for name := range passFlagToTest {
-		if flag.Lookup("test."+name) == nil {
-			t.Errorf("passFlagToTest contains %q, but flag -test.%s does not exist in test binary", name, name)
+	missing := map[string]bool{}
+	for _, name := range wantNames {
+		if !passFlagToTest[name] {
+			missing[name] = true
 		}
+	}
+	if len(missing) > 0 {
+		t.Errorf("passFlagToTest is missing entries: %v", missing)
+	}
 
-		if CmdTest.Flag.Lookup(name) == nil {
-			t.Errorf("passFlagToTest contains %q, but flag -%s does not exist in 'go test' subcommand", name, name)
-		}
+	extra := maps.Clone(passFlagToTest)
+	for _, name := range wantNames {
+		delete(extra, name)
+	}
+	if len(extra) > 0 {
+		t.Errorf("passFlagToTest contains extra entries: %v", extra)
+	}
+
+	if t.Failed() {
+		t.Logf("To regenerate:\n\tgo generate cmd/go/internal/test")
 	}
 }
 
-func TestVetAnalyzersSetIsCorrect(t *testing.T) {
+func TestPassAnalyzersToVet(t *testing.T) {
 	testenv.MustHaveGoBuild(t) // runs 'go tool vet -flags'
 
-	vetAns, err := genflags.VetAnalyzers()
+	wantNames, err := genflags.VetAnalyzers()
 	if err != nil {
 		t.Fatal(err)
 	}
 
-	want := make(map[string]bool)
-	for _, a := range vetAns {
-		want[a] = true
+	missing := map[string]bool{}
+	for _, name := range wantNames {
+		if !passAnalyzersToVet[name] {
+			missing[name] = true
+		}
+	}
+	if len(missing) > 0 {
+		t.Errorf("passAnalyzersToVet is missing entries: %v", missing)
 	}
 
-	if !reflect.DeepEqual(want, passAnalyzersToVet) {
-		t.Errorf("stale vet analyzers: want %v; got %v", want, passAnalyzersToVet)
-		t.Logf("(Run 'go generate cmd/go/internal/test' to refresh the set of analyzers.)")
+	extra := maps.Clone(passAnalyzersToVet)
+	for _, name := range wantNames {
+		delete(extra, name)
+	}
+	if len(extra) > 0 {
+		t.Errorf("passFlagToTest contains extra entries: %v", extra)
+	}
+
+	if t.Failed() {
+		t.Logf("To regenerate:\n\tgo generate cmd/go/internal/test")
 	}
 }
diff --git a/src/cmd/go/internal/test/genflags.go b/src/cmd/go/internal/test/genflags.go
index 625f941..bb5ceb6 100644
--- a/src/cmd/go/internal/test/genflags.go
+++ b/src/cmd/go/internal/test/genflags.go
@@ -8,12 +8,9 @@
 
 import (
 	"bytes"
-	"flag"
 	"log"
 	"os"
 	"os/exec"
-	"strings"
-	"testing"
 	"text/template"
 
 	"cmd/go/internal/test/internal/genflags"
@@ -33,7 +30,7 @@
 
 	t := template.Must(template.New("fileTemplate").Parse(fileTemplate))
 	tData := map[string][]string{
-		"testFlags":    testFlags(),
+		"testFlags":    genflags.ShortTestFlags(),
 		"vetAnalyzers": vetAnalyzers,
 	}
 	buf := bytes.NewBuffer(nil)
@@ -63,28 +60,6 @@
 	return nil
 }
 
-func testFlags() []string {
-	testing.Init()
-
-	var names []string
-	flag.VisitAll(func(f *flag.Flag) {
-		var name string
-		var found bool
-		if name, found = strings.CutPrefix(f.Name, "test."); !found {
-			return
-		}
-
-		switch name {
-		case "testlogfile", "paniconexit0", "fuzzcachedir", "fuzzworker", "gocoverdir":
-			// These flags are only for use by cmd/go.
-		default:
-			names = append(names, name)
-		}
-	})
-
-	return names
-}
-
 const fileTemplate = `// Copyright 2019 The Go Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
diff --git a/src/cmd/go/internal/test/internal/genflags/testflag.go b/src/cmd/go/internal/test/internal/genflags/testflag.go
new file mode 100644
index 0000000..712428d
--- /dev/null
+++ b/src/cmd/go/internal/test/internal/genflags/testflag.go
@@ -0,0 +1,35 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package genflags
+
+import (
+	"flag"
+	"strings"
+	"testing"
+)
+
+// ShortTestFlags returns the set of "-test." flag shorthand names that end
+// users may pass to 'go test'.
+func ShortTestFlags() []string {
+	testing.Init()
+
+	var names []string
+	flag.VisitAll(func(f *flag.Flag) {
+		var name string
+		var found bool
+		if name, found = strings.CutPrefix(f.Name, "test."); !found {
+			return
+		}
+
+		switch name {
+		case "testlogfile", "paniconexit0", "fuzzcachedir", "fuzzworker", "gocoverdir":
+			// These flags are only for use by cmd/go.
+		default:
+			names = append(names, name)
+		}
+	})
+
+	return names
+}
diff --git a/src/cmd/go/internal/test/test.go b/src/cmd/go/internal/test/test.go
index fe6e733..3bce026 100644
--- a/src/cmd/go/internal/test/test.go
+++ b/src/cmd/go/internal/test/test.go
@@ -16,6 +16,7 @@
 	"os/exec"
 	"path/filepath"
 	"regexp"
+	"slices"
 	"strconv"
 	"strings"
 	"sync"
@@ -75,8 +76,8 @@
 and its test source files to identify significant problems. If go vet
 finds any problems, go test reports those and does not run the test
 binary. Only a high-confidence subset of the default go vet checks are
-used. That subset is: 'atomic', 'bool', 'buildtags', 'errorsas',
-'ifaceassert', 'nilfunc', 'printf', and 'stringintconv'. You can see
+used. That subset is: atomic, bool, buildtags, directive, errorsas,
+ifaceassert, nilfunc, printf, and stringintconv. You can see
 the documentation for these and other vet tests via "go doc cmd/vet".
 To disable the running of go vet, use the -vet=off flag. To run all
 checks, use the -vet=all flag.
@@ -86,6 +87,10 @@
 error. (The go command's standard error is reserved for printing
 errors building the tests.)
 
+The go command places $GOROOT/bin at the beginning of $PATH
+in the test's environment, so that tests that execute
+'go' commands use the same 'go' as the parent 'go test' command.
+
 Go test runs in two different modes:
 
 The first, called local directory mode, occurs when go test is
@@ -140,9 +145,9 @@
 	    the package list (if present) must appear before this flag.
 
 	-c
-	    Compile the test binary to pkg.test but do not run it
+	    Compile the test binary to pkg.test in the current directory 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.
+	    The file name or target directory can be changed with the -o flag.
 
 	-exec xprog
 	    Run the test binary using xprog. The behavior is the same as
@@ -155,6 +160,8 @@
 	-o file
 	    Compile the test binary to the named file.
 	    The test still runs (unless -c or -i is specified).
+	    If file ends in a slash or names an existing directory,
+	    the test is written to pkg.test in that directory.
 
 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.
@@ -239,6 +246,9 @@
 	-failfast
 	    Do not start new tests after the first test failure.
 
+	-fullpath
+	    Show full file names in the error messages.
+
 	-fuzz regexp
 	    Run the fuzz test matching the regular expression. When specified,
 	    the command line argument must match exactly one package within the
@@ -579,9 +589,12 @@
 	testHelp bool // -help option passed to test via -args
 
 	testKillTimeout = 100 * 365 * 24 * time.Hour // backup alarm; defaults to about a century if no timeout is set
+	testWaitDelay   time.Duration                // how long to wait for output to close after a test binary exits; zero means unlimited
 	testCacheExpire time.Time                    // ignore cached test results before this time
 
 	testBlockProfile, testCPUProfile, testMemProfile, testMutexProfile, testTrace string // profiling flag that limits test to one package
+
+	testODir = false
 )
 
 // testProfile returns the name of an arbitrary single-package profiling flag
@@ -637,6 +650,7 @@
 	// "-cgocall",
 	// "-composites",
 	// "-copylocks",
+	"-directive",
 	"-errorsas",
 	// "-httpresponse",
 	"-ifaceassert",
@@ -646,6 +660,7 @@
 	"-printf",
 	// "-rangeloops",
 	// "-shift",
+	"-slog",
 	"-stringintconv",
 	// "-structtags",
 	// "-tests",
@@ -688,12 +703,6 @@
 		base.Fatalf("no packages to test")
 	}
 
-	if testC && len(pkgs) != 1 {
-		base.Fatalf("cannot use -c flag with multiple packages")
-	}
-	if testO != "" && len(pkgs) != 1 {
-		base.Fatalf("cannot use -o flag with multiple packages")
-	}
 	if testFuzz != "" {
 		if !platform.FuzzSupported(cfg.Goos, cfg.Goarch) {
 			base.Fatalf("-fuzz flag is not supported on %s/%s", cfg.Goos, cfg.Goarch)
@@ -743,6 +752,42 @@
 	if testProfile() != "" && len(pkgs) != 1 {
 		base.Fatalf("cannot use %s flag with multiple packages", testProfile())
 	}
+
+	if testO != "" {
+		if strings.HasSuffix(testO, "/") || strings.HasSuffix(testO, string(os.PathSeparator)) {
+			testODir = true
+		} else if fi, err := os.Stat(testO); err == nil && fi.IsDir() {
+			testODir = true
+		}
+	}
+
+	if len(pkgs) > 1 && (testC || testO != "") && !base.IsNull(testO) {
+		if testO != "" && !testODir {
+			base.Fatalf("with multiple packages, -o must refer to a directory or %s", os.DevNull)
+		}
+
+		pkgsForBinary := map[string][]*load.Package{}
+
+		for _, p := range pkgs {
+			testBinary := testBinaryName(p)
+			pkgsForBinary[testBinary] = append(pkgsForBinary[testBinary], p)
+		}
+
+		for testBinary, pkgs := range pkgsForBinary {
+			if len(pkgs) > 1 {
+				var buf strings.Builder
+				for _, pkg := range pkgs {
+					buf.WriteString(pkg.ImportPath)
+					buf.WriteString("\n")
+				}
+
+				base.Errorf("cannot write test binary %s for multiple packages:\n%s", testBinary, buf.String())
+			}
+		}
+
+		base.ExitIfErrors()
+	}
+
 	initCoverProfile()
 	defer closeCoverProfile()
 
@@ -753,7 +798,35 @@
 	// Don't set this if fuzzing, since it should be able to run
 	// indefinitely.
 	if testTimeout > 0 && testFuzz == "" {
-		testKillTimeout = testTimeout + 1*time.Minute
+		// The WaitDelay for the test process depends on both the OS I/O and
+		// scheduling overhead and the amount of I/O generated by the test just
+		// before it exits. We set the minimum at 5 seconds to account for the OS
+		// overhead, and scale it up from there proportional to the overall test
+		// timeout on the assumption that the time to write and read a goroutine
+		// dump from a timed-out test process scales roughly with the overall
+		// running time of the test.
+		//
+		// This is probably too generous when the timeout is very long, but it seems
+		// better to hard-code a scale factor than to hard-code a constant delay.
+		if wd := testTimeout / 10; wd < 5*time.Second {
+			testWaitDelay = 5 * time.Second
+		} else {
+			testWaitDelay = wd
+		}
+
+		// We expect the test binary to terminate itself (and dump stacks) after
+		// exactly testTimeout. We give it up to one WaitDelay or one minute,
+		// whichever is longer, to finish dumping stacks before we send it an
+		// external signal: if the process has a lot of goroutines, dumping stacks
+		// after the timeout can take a while.
+		//
+		// After the signal is delivered, the test process may have up to one
+		// additional WaitDelay to finish writing its output streams.
+		if testWaitDelay < 1*time.Minute {
+			testKillTimeout = testTimeout + 1*time.Minute
+		} else {
+			testKillTimeout = testTimeout + testWaitDelay
+		}
 	}
 
 	// Read testcache expiration time, if present.
@@ -770,7 +843,7 @@
 	b := work.NewBuilder("")
 	defer func() {
 		if err := b.Close(); err != nil {
-			base.Fatalf("go: %v", err)
+			base.Fatal(err)
 		}
 	}()
 
@@ -944,17 +1017,7 @@
 		buildTest.Deps = append(buildTest.Deps, buildP)
 	}
 
-	// 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 = p.DefaultExecName()
-	}
-	testBinary := elem + ".test"
+	testBinary := testBinaryName(p)
 
 	testDir := b.NewObjdir()
 	if err := b.Mkdir(testDir); err != nil {
@@ -1014,14 +1077,25 @@
 		// -c or profiling flag: create action to copy binary to ./test.out.
 		target := filepath.Join(base.Cwd(), testBinary+cfg.ExeSuffix)
 		isNull := false
+
 		if testO != "" {
 			target = testO
-			if base.IsNull(target) {
-				isNull = true
-			} else if !filepath.IsAbs(target) {
-				target = filepath.Join(base.Cwd(), target)
+
+			if testODir {
+				if filepath.IsAbs(target) {
+					target = filepath.Join(target, testBinary+cfg.ExeSuffix)
+				} else {
+					target = filepath.Join(base.Cwd(), target, testBinary+cfg.ExeSuffix)
+				}
+			} else {
+				if base.IsNull(target) {
+					isNull = true
+				} else if !filepath.IsAbs(target) {
+					target = filepath.Join(base.Cwd(), target)
+				}
 			}
 		}
+
 		if isNull {
 			runAction = buildAction
 		} else {
@@ -1144,7 +1218,15 @@
 
 func (r *runTestActor) Act(b *work.Builder, ctx context.Context, a *work.Action) error {
 	// Wait for previous test to get started and print its first json line.
-	<-r.prev
+	select {
+	case <-r.prev:
+	case <-base.Interrupted:
+		// We can't wait for the previous test action to complete: we don't start
+		// new actions after an interrupt, so if that action wasn't already running
+		// it might never happen. Instead, just don't log anything for this action.
+		base.SetExitStatus(1)
+		return nil
+	}
 
 	if a.Failed {
 		// We were unable to build the binary.
@@ -1276,75 +1358,92 @@
 		}
 	}
 
-	cmd := exec.Command(args[0], args[1:]...)
-	cmd.Dir = a.Package.Dir
+	// Normally, the test will terminate itself when the timeout expires,
+	// but add a last-ditch deadline to detect and stop wedged binaries.
+	ctx, cancel := context.WithTimeout(ctx, testKillTimeout)
+	defer cancel()
 
-	env := cfg.OrigEnv[:len(cfg.OrigEnv):len(cfg.OrigEnv)]
-	env = base.AppendPATH(env)
-	env = base.AppendPWD(env, cmd.Dir)
-	cmd.Env = env
-	if addToEnv != "" {
-		cmd.Env = append(cmd.Env, addToEnv)
-	}
+	// Now we're ready to actually run the command.
+	//
+	// If the -o flag is set, or if at some point we change cmd/go to start
+	// copying test executables into the build cache, we may run into spurious
+	// ETXTBSY errors on Unix platforms (see https://go.dev/issue/22315).
+	//
+	// Since we know what causes those, and we know that they should resolve
+	// quickly (the ETXTBSY error will resolve as soon as the subprocess
+	// holding the descriptor open reaches its 'exec' call), we retry them
+	// in a loop.
 
-	cmd.Stdout = stdout
-	cmd.Stderr = stdout
+	var (
+		cmd            *exec.Cmd
+		t0             time.Time
+		cancelKilled   = false
+		cancelSignaled = false
+	)
+	for {
+		cmd = exec.CommandContext(ctx, args[0], args[1:]...)
+		cmd.Dir = a.Package.Dir
 
-	// If there are any local SWIG dependencies, we want to load
-	// the shared library from the build directory.
-	if a.Package.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=.")
-		}
+		env := slices.Clip(cfg.OrigEnv)
+		env = base.AppendPATH(env)
+		env = base.AppendPWD(env, cmd.Dir)
 		cmd.Env = env
-	}
+		if addToEnv != "" {
+			cmd.Env = append(cmd.Env, addToEnv)
+		}
 
-	base.StartSigHandlers()
-	t0 := time.Now()
-	err = cmd.Start()
+		cmd.Stdout = stdout
+		cmd.Stderr = stdout
 
-	// 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)
-		done := make(chan error)
-		go func() {
-			done <- cmd.Wait()
-		}()
-	Outer:
-		select {
-		case err = <-done:
-			// ok
-		case <-tick.C:
-			if base.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(base.SignalTrace)
-				select {
-				case err = <-done:
-					fmt.Fprintf(cmd.Stdout, "*** Test killed with %v: ran too long (%v).\n", base.SignalTrace, testKillTimeout)
-					break Outer
-				case <-time.After(5 * time.Second):
+		// If there are any local SWIG dependencies, we want to load
+		// the shared library from the build directory.
+		if a.Package.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
 				}
 			}
-			cmd.Process.Kill()
-			err = <-done
-			fmt.Fprintf(cmd.Stdout, "*** Test killed: ran too long (%v).\n", testKillTimeout)
+			if !found {
+				env = append(env, "LD_LIBRARY_PATH=.")
+			}
+			cmd.Env = env
 		}
-		tick.Stop()
+
+		cmd.Cancel = func() error {
+			if base.SignalTrace == nil {
+				err := cmd.Process.Kill()
+				if err == nil {
+					cancelKilled = true
+				}
+				return err
+			}
+
+			// Send a quit signal in the hope that the program will print
+			// a stack trace and exit.
+			err := cmd.Process.Signal(base.SignalTrace)
+			if err == nil {
+				cancelSignaled = true
+			}
+			return err
+		}
+		cmd.WaitDelay = testWaitDelay
+
+		base.StartSigHandlers()
+		t0 = time.Now()
+		err = cmd.Run()
+
+		if !isETXTBSY(err) {
+			// We didn't hit the race in #22315, so there is no reason to retry the
+			// command.
+			break
+		}
 	}
+
 	out := buf.Bytes()
 	a.TestOutput = &buf
 	t := fmt.Sprintf("%.3fs", time.Since(t0).Seconds())
@@ -1374,7 +1473,15 @@
 		r.c.saveOutput(a)
 	} else {
 		base.SetExitStatus(1)
-		if len(out) == 0 {
+		if cancelSignaled {
+			fmt.Fprintf(cmd.Stdout, "*** Test killed with %v: ran too long (%v).\n", base.SignalTrace, testKillTimeout)
+		} else if cancelKilled {
+			fmt.Fprintf(cmd.Stdout, "*** Test killed: ran too long (%v).\n", testKillTimeout)
+		} else if errors.Is(err, exec.ErrWaitDelay) {
+			fmt.Fprintf(cmd.Stdout, "*** Test I/O incomplete %v after exiting.\n", cmd.WaitDelay)
+		}
+		var ee *exec.ExitError
+		if len(out) == 0 || !errors.As(err, &ee) || !ee.Exited() {
 			// If there was no test output, print the exit status so that the reason
 			// for failure is clear.
 			fmt.Fprintf(cmd.Stdout, "%s\n", err)
@@ -1467,14 +1574,6 @@
 		}
 	}
 
-	if cache.Default() == nil {
-		if cache.DebugTest {
-			fmt.Fprintf(os.Stderr, "testcache: GOCACHE=off\n")
-		}
-		c.disableCache = true
-		return false
-	}
-
 	// The test cache result fetch is a two-level lookup.
 	//
 	// First, we use the content hash of the test binary
@@ -1514,7 +1613,7 @@
 
 	// Load list of referenced environment variables and files
 	// from last run of testID, and compute hash of that content.
-	data, entry, err := cache.Default().GetBytes(testID)
+	data, entry, err := cache.GetBytes(cache.Default(), testID)
 	if !bytes.HasPrefix(data, testlogMagic) || data[len(data)-1] != '\n' {
 		if cache.DebugTest {
 			if err != nil {
@@ -1535,7 +1634,7 @@
 
 	// Parse cached result in preparation for changing run time to "(cached)".
 	// If we can't parse the cached result, don't use it.
-	data, entry, err = cache.Default().GetBytes(testAndInputKey(testID, testInputsID))
+	data, entry, err = cache.GetBytes(cache.Default(), testAndInputKey(testID, testInputsID))
 	if len(data) == 0 || data[len(data)-1] != '\n' {
 		if cache.DebugTest {
 			if err != nil {
@@ -1747,15 +1846,15 @@
 		if cache.DebugTest {
 			fmt.Fprintf(os.Stderr, "testcache: %s: save test ID %x => input ID %x => %x\n", a.Package.ImportPath, c.id1, testInputsID, testAndInputKey(c.id1, testInputsID))
 		}
-		cache.Default().PutNoVerify(c.id1, bytes.NewReader(testlog))
-		cache.Default().PutNoVerify(testAndInputKey(c.id1, testInputsID), bytes.NewReader(a.TestOutput.Bytes()))
+		cache.PutNoVerify(cache.Default(), c.id1, bytes.NewReader(testlog))
+		cache.PutNoVerify(cache.Default(), testAndInputKey(c.id1, testInputsID), bytes.NewReader(a.TestOutput.Bytes()))
 	}
 	if c.id2 != (cache.ActionID{}) {
 		if cache.DebugTest {
 			fmt.Fprintf(os.Stderr, "testcache: %s: save test ID %x => input ID %x => %x\n", a.Package.ImportPath, c.id2, testInputsID, testAndInputKey(c.id2, testInputsID))
 		}
-		cache.Default().PutNoVerify(c.id2, bytes.NewReader(testlog))
-		cache.Default().PutNoVerify(testAndInputKey(c.id2, testInputsID), bytes.NewReader(a.TestOutput.Bytes()))
+		cache.PutNoVerify(cache.Default(), c.id2, bytes.NewReader(testlog))
+		cache.PutNoVerify(cache.Default(), testAndInputKey(c.id2, testInputsID), bytes.NewReader(a.TestOutput.Bytes()))
 	}
 }
 
@@ -1825,3 +1924,19 @@
 	}
 	return nil
 }
+
+// testBinaryName can be used to create name for test binary executable.
+// 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.
+func testBinaryName(p *load.Package) string {
+	var elem string
+	if p.ImportPath == "command-line-arguments" {
+		elem = p.Name
+	} else {
+		elem = p.DefaultExecName()
+	}
+
+	return elem + ".test"
+}
diff --git a/src/cmd/go/internal/test/test_nonunix.go b/src/cmd/go/internal/test/test_nonunix.go
new file mode 100644
index 0000000..df84487
--- /dev/null
+++ b/src/cmd/go/internal/test/test_nonunix.go
@@ -0,0 +1,12 @@
+// Copyright 2023 The Go 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:build !unix
+
+package test
+
+func isETXTBSY(err error) bool {
+	// syscall.ETXTBSY is only meaningful on Unix platforms.
+	return false
+}
diff --git a/src/cmd/go/internal/test/test_unix.go b/src/cmd/go/internal/test/test_unix.go
new file mode 100644
index 0000000..f50ef98
--- /dev/null
+++ b/src/cmd/go/internal/test/test_unix.go
@@ -0,0 +1,16 @@
+// Copyright 2023 The Go 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:build unix
+
+package test
+
+import (
+	"errors"
+	"syscall"
+)
+
+func isETXTBSY(err error) bool {
+	return errors.Is(err, syscall.ETXTBSY)
+}
diff --git a/src/cmd/go/internal/test/testflag.go b/src/cmd/go/internal/test/testflag.go
index e690689..4253788 100644
--- a/src/cmd/go/internal/test/testflag.go
+++ b/src/cmd/go/internal/test/testflag.go
@@ -50,6 +50,7 @@
 	cf.StringVar(&testCPUProfile, "cpuprofile", "", "")
 	cf.Bool("failfast", false, "")
 	cf.StringVar(&testFuzz, "fuzz", "", "")
+	cf.Bool("fullpath", false, "")
 	cf.StringVar(&testList, "list", "", "")
 	cf.StringVar(&testMemProfile, "memprofile", "", "")
 	cf.String("memprofilerate", "", "")
@@ -60,15 +61,17 @@
 	cf.String("run", "", "")
 	cf.Bool("short", false, "")
 	cf.String("skip", "", "")
-	cf.DurationVar(&testTimeout, "timeout", 10*time.Minute, "")
+	cf.DurationVar(&testTimeout, "timeout", 10*time.Minute, "") // known to cmd/dist
 	cf.String("fuzztime", "", "")
 	cf.String("fuzzminimizetime", "", "")
 	cf.StringVar(&testTrace, "trace", "", "")
 	cf.Var(&testV, "v", "")
 	cf.Var(&testShuffle, "shuffle", "")
 
-	for name := range passFlagToTest {
-		cf.Var(cf.Lookup(name).Value, "test."+name, "")
+	for name, ok := range passFlagToTest {
+		if ok {
+			cf.Var(cf.Lookup(name).Value, "test."+name, "")
+		}
 	}
 }
 
diff --git a/src/cmd/go/internal/tool/tool.go b/src/cmd/go/internal/tool/tool.go
index 069968b..ebe189b 100644
--- a/src/cmd/go/internal/tool/tool.go
+++ b/src/cmd/go/internal/tool/tool.go
@@ -7,8 +7,11 @@
 
 import (
 	"context"
+	"encoding/json"
+	"flag"
 	"fmt"
 	"go/build"
+	"internal/platform"
 	"os"
 	"os/exec"
 	"os/signal"
@@ -68,10 +71,25 @@
 			return
 		}
 	}
-	toolPath := base.Tool(toolName)
-	if toolPath == "" {
-		return
+
+	toolPath, err := base.ToolPath(toolName)
+	if err != nil {
+		if toolName == "dist" && len(args) > 1 && args[1] == "list" {
+			// cmd/distpack removes the 'dist' tool from the toolchain to save space,
+			// since it is normally only used for building the toolchain in the first
+			// place. However, 'go tool dist list' is useful for listing all supported
+			// platforms.
+			//
+			// If the dist tool does not exist, impersonate this command.
+			if impersonateDistList(args[2:]) {
+				return
+			}
+		}
+
+		// Emit the usual error for the missing tool.
+		_ = base.Tool(toolName)
 	}
+
 	if toolN {
 		cmd := toolPath
 		if len(args) > 1 {
@@ -88,7 +106,7 @@
 		Stdout: os.Stdout,
 		Stderr: os.Stderr,
 	}
-	err := toolCmd.Start()
+	err = toolCmd.Start()
 	if err == nil {
 		c := make(chan os.Signal, 100)
 		signal.Notify(c)
@@ -145,3 +163,62 @@
 		fmt.Println(name)
 	}
 }
+
+func impersonateDistList(args []string) (handled bool) {
+	fs := flag.NewFlagSet("go tool dist list", flag.ContinueOnError)
+	jsonFlag := fs.Bool("json", false, "produce JSON output")
+	brokenFlag := fs.Bool("broken", false, "include broken ports")
+
+	// The usage for 'go tool dist' claims that
+	// “All commands take -v flags to emit extra information”,
+	// but list -v appears not to have any effect.
+	_ = fs.Bool("v", false, "emit extra information")
+
+	if err := fs.Parse(args); err != nil || len(fs.Args()) > 0 {
+		// Unrecognized flag or argument.
+		// Force fallback to the real 'go tool dist'.
+		return false
+	}
+
+	if !*jsonFlag {
+		for _, p := range platform.List {
+			if !*brokenFlag && platform.Broken(p.GOOS, p.GOARCH) {
+				continue
+			}
+			fmt.Println(p)
+		}
+		return true
+	}
+
+	type jsonResult struct {
+		GOOS         string
+		GOARCH       string
+		CgoSupported bool
+		FirstClass   bool
+		Broken       bool `json:",omitempty"`
+	}
+
+	var results []jsonResult
+	for _, p := range platform.List {
+		broken := platform.Broken(p.GOOS, p.GOARCH)
+		if broken && !*brokenFlag {
+			continue
+		}
+		if *jsonFlag {
+			results = append(results, jsonResult{
+				GOOS:         p.GOOS,
+				GOARCH:       p.GOARCH,
+				CgoSupported: platform.CgoSupported(p.GOOS, p.GOARCH),
+				FirstClass:   platform.FirstClass(p.GOOS, p.GOARCH),
+				Broken:       broken,
+			})
+		}
+	}
+	out, err := json.MarshalIndent(results, "", "\t")
+	if err != nil {
+		return false
+	}
+
+	os.Stdout.Write(out)
+	return true
+}
diff --git a/src/cmd/go/internal/toolchain/exec.go b/src/cmd/go/internal/toolchain/exec.go
new file mode 100644
index 0000000..820fe93
--- /dev/null
+++ b/src/cmd/go/internal/toolchain/exec.go
@@ -0,0 +1,55 @@
+// Copyright 2023 The Go 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:build !js && !wasip1
+
+package toolchain
+
+import (
+	"cmd/go/internal/base"
+	"internal/godebug"
+	"os"
+	"os/exec"
+	"runtime"
+	"syscall"
+)
+
+// execGoToolchain execs the Go toolchain with the given name (gotoolchain),
+// GOROOT directory, and go command executable.
+// The GOROOT directory is empty if we are invoking a command named
+// gotoolchain found in $PATH.
+func execGoToolchain(gotoolchain, dir, exe string) {
+	os.Setenv(targetEnv, gotoolchain)
+	if dir == "" {
+		os.Unsetenv("GOROOT")
+	} else {
+		os.Setenv("GOROOT", dir)
+	}
+
+	// On Windows, there is no syscall.Exec, so the best we can do
+	// is run a subprocess and exit with the same status.
+	// Doing the same on Unix would be a problem because it wouldn't
+	// propagate signals and such, but there are no signals on Windows.
+	// We also use the exec case when GODEBUG=gotoolchainexec=0,
+	// to allow testing this code even when not on Windows.
+	if godebug.New("#gotoolchainexec").Value() == "0" || runtime.GOOS == "windows" {
+		cmd := exec.Command(exe, os.Args[1:]...)
+		cmd.Stdin = os.Stdin
+		cmd.Stdout = os.Stdout
+		cmd.Stderr = os.Stderr
+		err := cmd.Run()
+		if err != nil {
+			if e, ok := err.(*exec.ExitError); ok && e.ProcessState != nil {
+				if e.ProcessState.Exited() {
+					os.Exit(e.ProcessState.ExitCode())
+				}
+				base.Fatalf("exec %s: %s", gotoolchain, e.ProcessState)
+			}
+			base.Fatalf("exec %s: %s", exe, err)
+		}
+		os.Exit(0)
+	}
+	err := syscall.Exec(exe, os.Args, os.Environ())
+	base.Fatalf("exec %s: %v", gotoolchain, err)
+}
diff --git a/src/cmd/go/internal/toolchain/exec_stub.go b/src/cmd/go/internal/toolchain/exec_stub.go
new file mode 100644
index 0000000..e212379
--- /dev/null
+++ b/src/cmd/go/internal/toolchain/exec_stub.go
@@ -0,0 +1,13 @@
+// Copyright 2023 The Go 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:build js || wasip1
+
+package toolchain
+
+import "cmd/go/internal/base"
+
+func execGoToolchain(gotoolchain, dir, exe string) {
+	base.Fatalf("execGoToolchain unsupported")
+}
diff --git a/src/cmd/go/internal/toolchain/path_none.go b/src/cmd/go/internal/toolchain/path_none.go
new file mode 100644
index 0000000..8fdf71a
--- /dev/null
+++ b/src/cmd/go/internal/toolchain/path_none.go
@@ -0,0 +1,21 @@
+// Copyright 2023 The Go 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:build !unix && !plan9 && !windows
+
+package toolchain
+
+import "io/fs"
+
+// pathDirs returns the directories in the system search path.
+func pathDirs() []string {
+	return nil
+}
+
+// pathVersion returns the Go version implemented by the file
+// described by de and info in directory dir.
+// The analysis only uses the name itself; it does not run the program.
+func pathVersion(dir string, de fs.DirEntry, info fs.FileInfo) (string, bool) {
+	return "", false
+}
diff --git a/src/cmd/go/internal/toolchain/path_plan9.go b/src/cmd/go/internal/toolchain/path_plan9.go
new file mode 100644
index 0000000..3f836a0
--- /dev/null
+++ b/src/cmd/go/internal/toolchain/path_plan9.go
@@ -0,0 +1,29 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package toolchain
+
+import (
+	"io/fs"
+	"os"
+	"path/filepath"
+
+	"cmd/go/internal/gover"
+)
+
+// pathDirs returns the directories in the system search path.
+func pathDirs() []string {
+	return filepath.SplitList(os.Getenv("path"))
+}
+
+// pathVersion returns the Go version implemented by the file
+// described by de and info in directory dir.
+// The analysis only uses the name itself; it does not run the program.
+func pathVersion(dir string, de fs.DirEntry, info fs.FileInfo) (string, bool) {
+	v := gover.FromToolchain(de.Name())
+	if v == "" || info.Mode()&0111 == 0 {
+		return "", false
+	}
+	return v, true
+}
diff --git a/src/cmd/go/internal/toolchain/path_unix.go b/src/cmd/go/internal/toolchain/path_unix.go
new file mode 100644
index 0000000..519c53e
--- /dev/null
+++ b/src/cmd/go/internal/toolchain/path_unix.go
@@ -0,0 +1,46 @@
+// Copyright 2023 The Go 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:build unix
+
+package toolchain
+
+import (
+	"internal/syscall/unix"
+	"io/fs"
+	"os"
+	"path/filepath"
+	"syscall"
+
+	"cmd/go/internal/gover"
+)
+
+// pathDirs returns the directories in the system search path.
+func pathDirs() []string {
+	return filepath.SplitList(os.Getenv("PATH"))
+}
+
+// pathVersion returns the Go version implemented by the file
+// described by de and info in directory dir.
+// The analysis only uses the name itself; it does not run the program.
+func pathVersion(dir string, de fs.DirEntry, info fs.FileInfo) (string, bool) {
+	v := gover.FromToolchain(de.Name())
+	if v == "" {
+		return "", false
+	}
+
+	// Mimicking exec.findExecutable here.
+	// ENOSYS means Eaccess is not available or not implemented.
+	// EPERM can be returned by Linux containers employing seccomp.
+	// In both cases, fall back to checking the permission bits.
+	err := unix.Eaccess(filepath.Join(dir, de.Name()), unix.X_OK)
+	if (err == syscall.ENOSYS || err == syscall.EPERM) && info.Mode()&0111 != 0 {
+		err = nil
+	}
+	if err != nil {
+		return "", false
+	}
+
+	return v, true
+}
diff --git a/src/cmd/go/internal/toolchain/path_windows.go b/src/cmd/go/internal/toolchain/path_windows.go
new file mode 100644
index 0000000..086c591
--- /dev/null
+++ b/src/cmd/go/internal/toolchain/path_windows.go
@@ -0,0 +1,78 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package toolchain
+
+import (
+	"io/fs"
+	"os"
+	"path/filepath"
+	"strings"
+	"sync"
+
+	"cmd/go/internal/gover"
+)
+
+// pathExts is a cached PATHEXT list.
+var pathExts struct {
+	once sync.Once
+	list []string
+}
+
+func initPathExts() {
+	var exts []string
+	x := os.Getenv(`PATHEXT`)
+	if x != "" {
+		for _, e := range strings.Split(strings.ToLower(x), `;`) {
+			if e == "" {
+				continue
+			}
+			if e[0] != '.' {
+				e = "." + e
+			}
+			exts = append(exts, e)
+		}
+	} else {
+		exts = []string{".com", ".exe", ".bat", ".cmd"}
+	}
+	pathExts.list = exts
+}
+
+// pathDirs returns the directories in the system search path.
+func pathDirs() []string {
+	return filepath.SplitList(os.Getenv("PATH"))
+}
+
+// pathVersion returns the Go version implemented by the file
+// described by de and info in directory dir.
+// The analysis only uses the name itself; it does not run the program.
+func pathVersion(dir string, de fs.DirEntry, info fs.FileInfo) (string, bool) {
+	pathExts.once.Do(initPathExts)
+	name, _, ok := cutExt(de.Name(), pathExts.list)
+	if !ok {
+		return "", false
+	}
+	v := gover.FromToolchain(name)
+	if v == "" {
+		return "", false
+	}
+	return v, true
+}
+
+// cutExt looks for any of the known extensions at the end of file.
+// If one is found, cutExt returns the file name with the extension trimmed,
+// the extension itself, and true to signal that an extension was found.
+// Otherwise cutExt returns file, "", false.
+func cutExt(file string, exts []string) (name, ext string, found bool) {
+	i := strings.LastIndex(file, ".")
+	if i < 0 {
+		return file, "", false
+	}
+	for _, x := range exts {
+		if strings.EqualFold(file[i:], x) {
+			return file[:i], file[i:], true
+		}
+	}
+	return file, "", false
+}
diff --git a/src/cmd/go/internal/toolchain/select.go b/src/cmd/go/internal/toolchain/select.go
new file mode 100644
index 0000000..a44f393
--- /dev/null
+++ b/src/cmd/go/internal/toolchain/select.go
@@ -0,0 +1,589 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package toolchain implements dynamic switching of Go toolchains.
+package toolchain
+
+import (
+	"context"
+	"errors"
+	"fmt"
+	"go/build"
+	"io/fs"
+	"log"
+	"os"
+	"os/exec"
+	"path/filepath"
+	"runtime"
+	"strconv"
+	"strings"
+
+	"cmd/go/internal/base"
+	"cmd/go/internal/cfg"
+	"cmd/go/internal/gover"
+	"cmd/go/internal/modfetch"
+	"cmd/go/internal/modload"
+	"cmd/go/internal/run"
+
+	"golang.org/x/mod/module"
+)
+
+const (
+	// We download golang.org/toolchain version v0.0.1-<gotoolchain>.<goos>-<goarch>.
+	// If the 0.0.1 indicates anything at all, its the version of the toolchain packaging:
+	// if for some reason we needed to change the way toolchains are packaged into
+	// module zip files in a future version of Go, we could switch to v0.0.2 and then
+	// older versions expecting the old format could use v0.0.1 and newer versions
+	// would use v0.0.2. Of course, then we'd also have to publish two of each
+	// module zip file. It's not likely we'll ever need to change this.
+	gotoolchainModule  = "golang.org/toolchain"
+	gotoolchainVersion = "v0.0.1"
+
+	// targetEnv is a special environment variable set to the expected
+	// toolchain version during the toolchain switch by the parent
+	// process and cleared in the child process. When set, that indicates
+	// to the child to confirm that it provides the expected toolchain version.
+	targetEnv = "GOTOOLCHAIN_INTERNAL_SWITCH_VERSION"
+
+	// countEnv is a special environment variable
+	// that is incremented during each toolchain switch, to detect loops.
+	// It is cleared before invoking programs in 'go run', 'go test', 'go generate', and 'go tool'
+	// by invoking them in an environment filtered with FilterEnv,
+	// so user programs should not see this in their environment.
+	countEnv = "GOTOOLCHAIN_INTERNAL_SWITCH_COUNT"
+
+	// maxSwitch is the maximum toolchain switching depth.
+	// Most uses should never see more than three.
+	// (Perhaps one for the initial GOTOOLCHAIN dispatch,
+	// a second for go get doing an upgrade, and a third if
+	// for some reason the chosen upgrade version is too small
+	// by a little.)
+	// When the count reaches maxSwitch - 10, we start logging
+	// the switched versions for debugging before crashing with
+	// a fatal error upon reaching maxSwitch.
+	// That should be enough to see the repetition.
+	maxSwitch = 100
+)
+
+// FilterEnv returns a copy of env with internal GOTOOLCHAIN environment
+// variables filtered out.
+func FilterEnv(env []string) []string {
+	// Note: Don't need to filter out targetEnv because Switch does that.
+	var out []string
+	for _, e := range env {
+		if strings.HasPrefix(e, countEnv+"=") {
+			continue
+		}
+		out = append(out, e)
+	}
+	return out
+}
+
+// Select invokes a different Go toolchain if directed by
+// the GOTOOLCHAIN environment variable or the user's configuration
+// or go.mod file.
+// It must be called early in startup.
+// See https://go.dev/doc/toolchain#select.
+func Select() {
+	log.SetPrefix("go: ")
+	defer log.SetPrefix("")
+
+	if !modload.WillBeEnabled() {
+		return
+	}
+
+	// As a special case, let "go env GOTOOLCHAIN" and "go env -w GOTOOLCHAIN=..."
+	// be handled by the local toolchain, since an older toolchain may not understand it.
+	// This provides an easy way out of "go env -w GOTOOLCHAIN=go1.19" and makes
+	// sure that "go env GOTOOLCHAIN" always prints the local go command's interpretation of it.
+	// We look for these specific command lines in order to avoid mishandling
+	//
+	//	GOTOOLCHAIN=go1.999 go env -newflag GOTOOLCHAIN
+	//
+	// where -newflag is a flag known to Go 1.999 but not known to us.
+	if (len(os.Args) == 3 && os.Args[1] == "env" && os.Args[2] == "GOTOOLCHAIN") ||
+		(len(os.Args) == 4 && os.Args[1] == "env" && os.Args[2] == "-w" && strings.HasPrefix(os.Args[3], "GOTOOLCHAIN=")) {
+		return
+	}
+
+	// Interpret GOTOOLCHAIN to select the Go toolchain to run.
+	gotoolchain := cfg.Getenv("GOTOOLCHAIN")
+	gover.Startup.GOTOOLCHAIN = gotoolchain
+	if gotoolchain == "" {
+		// cfg.Getenv should fall back to $GOROOT/go.env,
+		// so this should not happen, unless a packager
+		// has deleted the GOTOOLCHAIN line from go.env.
+		// It can also happen if GOROOT is missing or broken,
+		// in which case best to let the go command keep running
+		// and diagnose the problem.
+		return
+	}
+
+	// Note: minToolchain is what https://go.dev/doc/toolchain#select calls the default toolchain.
+	minToolchain := gover.LocalToolchain()
+	minVers := gover.Local()
+	var mode string
+	if gotoolchain == "auto" {
+		mode = "auto"
+	} else if gotoolchain == "path" {
+		mode = "path"
+	} else {
+		min, suffix, plus := strings.Cut(gotoolchain, "+") // go1.2.3+auto
+		if min != "local" {
+			v := gover.FromToolchain(min)
+			if v == "" {
+				if plus {
+					base.Fatalf("invalid GOTOOLCHAIN %q: invalid minimum toolchain %q", gotoolchain, min)
+				}
+				base.Fatalf("invalid GOTOOLCHAIN %q", gotoolchain)
+			}
+			minToolchain = min
+			minVers = v
+		}
+		if plus && suffix != "auto" && suffix != "path" {
+			base.Fatalf("invalid GOTOOLCHAIN %q: only version suffixes are +auto and +path", gotoolchain)
+		}
+		mode = suffix
+	}
+
+	gotoolchain = minToolchain
+	if (mode == "auto" || mode == "path") && !goInstallVersion() {
+		// Read go.mod to find new minimum and suggested toolchain.
+		file, goVers, toolchain := modGoToolchain()
+		gover.Startup.AutoFile = file
+		if toolchain == "default" {
+			// "default" means always use the default toolchain,
+			// which is already set, so nothing to do here.
+			// Note that if we have Go 1.21 installed originally,
+			// GOTOOLCHAIN=go1.30.0+auto or GOTOOLCHAIN=go1.30.0,
+			// and the go.mod  says "toolchain default", we use Go 1.30, not Go 1.21.
+			// That is, default overrides the "auto" part of the calculation
+			// but not the minimum that the user has set.
+			// Of course, if the go.mod also says "go 1.35", using Go 1.30
+			// will provoke an error about the toolchain being too old.
+			// That's what people who use toolchain default want:
+			// only ever use the toolchain configured by the user
+			// (including its environment and go env -w file).
+			gover.Startup.AutoToolchain = toolchain
+		} else {
+			if toolchain != "" {
+				// Accept toolchain only if it is >= our min.
+				toolVers := gover.FromToolchain(toolchain)
+				if toolVers == "" || (!strings.HasPrefix(toolchain, "go") && !strings.Contains(toolchain, "-go")) {
+					base.Fatalf("invalid toolchain %q in %s", toolchain, base.ShortPath(file))
+				}
+				if gover.Compare(toolVers, minVers) >= 0 {
+					gotoolchain = toolchain
+					minVers = toolVers
+					gover.Startup.AutoToolchain = toolchain
+				}
+			}
+			if gover.Compare(goVers, minVers) > 0 {
+				gotoolchain = "go" + goVers
+				gover.Startup.AutoGoVersion = goVers
+				gover.Startup.AutoToolchain = "" // in case we are overriding it for being too old
+			}
+		}
+	}
+
+	// If we are invoked as a target toolchain, confirm that
+	// we provide the expected version and then run.
+	// This check is delayed until after the handling of auto and path
+	// so that we have initialized gover.Startup for use in error messages.
+	if target := os.Getenv(targetEnv); target != "" && TestVersionSwitch != "loop" {
+		if gover.LocalToolchain() != target {
+			base.Fatalf("toolchain %v invoked to provide %v", gover.LocalToolchain(), target)
+		}
+		os.Unsetenv(targetEnv)
+
+		// Note: It is tempting to check that if gotoolchain != "local"
+		// then target == gotoolchain here, as a sanity check that
+		// the child has made the same version determination as the parent.
+		// This turns out not always to be the case. Specifically, if we are
+		// running Go 1.21 with GOTOOLCHAIN=go1.22+auto, which invokes
+		// Go 1.22, then 'go get go@1.23.0' or 'go get needs_go_1_23'
+		// will invoke Go 1.23, but as the Go 1.23 child the reason for that
+		// will not be apparent here: it will look like we should be using Go 1.22.
+		// We rely on the targetEnv being set to know not to downgrade.
+		// A longer term problem with the sanity check is that the exact details
+		// may change over time: there may be other reasons that a future Go
+		// version might invoke an older one, and the older one won't know why.
+		// Best to just accept that we were invoked to provide a specific toolchain
+		// (which we just checked) and leave it at that.
+		return
+	}
+
+	if gotoolchain == "local" || gotoolchain == gover.LocalToolchain() {
+		// Let the current binary handle the command.
+		return
+	}
+
+	// Minimal sanity check of GOTOOLCHAIN setting before search.
+	// We want to allow things like go1.20.3 but also gccgo-go1.20.3.
+	// We want to disallow mistakes / bad ideas like GOTOOLCHAIN=bash,
+	// since we will find that in the path lookup.
+	if !strings.HasPrefix(gotoolchain, "go1") && !strings.Contains(gotoolchain, "-go1") {
+		base.Fatalf("invalid GOTOOLCHAIN %q", gotoolchain)
+	}
+
+	Exec(gotoolchain)
+}
+
+// TestVersionSwitch is set in the test go binary to the value in $TESTGO_VERSION_SWITCH.
+// Valid settings are:
+//
+//	"switch" - simulate version switches by reinvoking the test go binary with a different TESTGO_VERSION.
+//	"mismatch" - like "switch" but forget to set TESTGO_VERSION, so it looks like we invoked a mismatched toolchain
+//	"loop" - like "mismatch" but forget the target check, causing a toolchain switching loop
+var TestVersionSwitch string
+
+// Exec invokes the specified Go toolchain or else prints an error and exits the process.
+// If $GOTOOLCHAIN is set to path or min+path, Exec only considers the PATH
+// as a source of Go toolchains. Otherwise Exec tries the PATH but then downloads
+// a toolchain if necessary.
+func Exec(gotoolchain string) {
+	log.SetPrefix("go: ")
+
+	writeBits = sysWriteBits()
+
+	count, _ := strconv.Atoi(os.Getenv(countEnv))
+	if count >= maxSwitch-10 {
+		fmt.Fprintf(os.Stderr, "go: switching from go%v to %v [depth %d]\n", gover.Local(), gotoolchain, count)
+	}
+	if count >= maxSwitch {
+		base.Fatalf("too many toolchain switches")
+	}
+	os.Setenv(countEnv, fmt.Sprint(count+1))
+
+	env := cfg.Getenv("GOTOOLCHAIN")
+	pathOnly := env == "path" || strings.HasSuffix(env, "+path")
+
+	// For testing, if TESTGO_VERSION is already in use
+	// (only happens in the cmd/go test binary)
+	// and TESTGO_VERSION_SWITCH=switch is set,
+	// "switch" toolchains by changing TESTGO_VERSION
+	// and reinvoking the current binary.
+	// The special cases =loop and =mismatch skip the
+	// setting of TESTGO_VERSION so that it looks like we
+	// accidentally invoked the wrong toolchain,
+	// to test detection of that failure mode.
+	switch TestVersionSwitch {
+	case "switch":
+		os.Setenv("TESTGO_VERSION", gotoolchain)
+		fallthrough
+	case "loop", "mismatch":
+		exe, err := os.Executable()
+		if err != nil {
+			base.Fatalf("%v", err)
+		}
+		execGoToolchain(gotoolchain, os.Getenv("GOROOT"), exe)
+	}
+
+	// Look in PATH for the toolchain before we download one.
+	// This allows custom toolchains as well as reuse of toolchains
+	// already installed using go install golang.org/dl/go1.2.3@latest.
+	if exe, err := exec.LookPath(gotoolchain); err == nil {
+		execGoToolchain(gotoolchain, "", exe)
+	}
+
+	// GOTOOLCHAIN=auto looks in PATH and then falls back to download.
+	// GOTOOLCHAIN=path only looks in PATH.
+	if pathOnly {
+		base.Fatalf("cannot find %q in PATH", gotoolchain)
+	}
+
+	// Set up modules without an explicit go.mod, to download distribution.
+	modload.Reset()
+	modload.ForceUseModules = true
+	modload.RootMode = modload.NoRoot
+	modload.Init()
+
+	// Download and unpack toolchain module into module cache.
+	// Note that multiple go commands might be doing this at the same time,
+	// and that's OK: the module cache handles that case correctly.
+	m := module.Version{
+		Path:    gotoolchainModule,
+		Version: gotoolchainVersion + "-" + gotoolchain + "." + runtime.GOOS + "-" + runtime.GOARCH,
+	}
+	dir, err := modfetch.Download(context.Background(), m)
+	if err != nil {
+		if errors.Is(err, fs.ErrNotExist) {
+			base.Fatalf("download %s for %s/%s: toolchain not available", gotoolchain, runtime.GOOS, runtime.GOARCH)
+		}
+		base.Fatalf("download %s: %v", gotoolchain, err)
+	}
+
+	// On first use after download, set the execute bits on the commands
+	// so that we can run them. Note that multiple go commands might be
+	// doing this at the same time, but if so no harm done.
+	if runtime.GOOS != "windows" {
+		info, err := os.Stat(filepath.Join(dir, "bin/go"))
+		if err != nil {
+			base.Fatalf("download %s: %v", gotoolchain, err)
+		}
+		if info.Mode()&0111 == 0 {
+			// allowExec sets the exec permission bits on all files found in dir.
+			allowExec := func(dir string) {
+				err := filepath.WalkDir(dir, func(path string, d fs.DirEntry, err error) error {
+					if err != nil {
+						return err
+					}
+					if !d.IsDir() {
+						info, err := os.Stat(path)
+						if err != nil {
+							return err
+						}
+						if err := os.Chmod(path, info.Mode()&0777|0111); err != nil {
+							return err
+						}
+					}
+					return nil
+				})
+				if err != nil {
+					base.Fatalf("download %s: %v", gotoolchain, err)
+				}
+			}
+
+			// Set the bits in pkg/tool before bin/go.
+			// If we are racing with another go command and do bin/go first,
+			// then the check of bin/go above might succeed, the other go command
+			// would skip its own mode-setting, and then the go command might
+			// try to run a tool before we get to setting the bits on pkg/tool.
+			// Setting pkg/tool before bin/go avoids that ordering problem.
+			// The only other tool the go command invokes is gofmt,
+			// so we set that one explicitly before handling bin (which will include bin/go).
+			allowExec(filepath.Join(dir, "pkg/tool"))
+			allowExec(filepath.Join(dir, "bin/gofmt"))
+			allowExec(filepath.Join(dir, "bin"))
+		}
+	}
+
+	srcUGoMod := filepath.Join(dir, "src/_go.mod")
+	srcGoMod := filepath.Join(dir, "src/go.mod")
+	if size(srcGoMod) != size(srcUGoMod) {
+		err := filepath.WalkDir(dir, func(path string, d fs.DirEntry, err error) error {
+			if err != nil {
+				return err
+			}
+			if path == srcUGoMod {
+				// Leave for last, in case we are racing with another go command.
+				return nil
+			}
+			if pdir, name := filepath.Split(path); name == "_go.mod" {
+				if err := raceSafeCopy(path, pdir+"go.mod"); err != nil {
+					return err
+				}
+			}
+			return nil
+		})
+		// Handle src/go.mod; this is the signal to other racing go commands
+		// that everything is okay and they can skip this step.
+		if err == nil {
+			err = raceSafeCopy(srcUGoMod, srcGoMod)
+		}
+		if err != nil {
+			base.Fatalf("download %s: %v", gotoolchain, err)
+		}
+	}
+
+	// Reinvoke the go command.
+	execGoToolchain(gotoolchain, dir, filepath.Join(dir, "bin/go"))
+}
+
+func size(path string) int64 {
+	info, err := os.Stat(path)
+	if err != nil {
+		return -1
+	}
+	return info.Size()
+}
+
+var writeBits fs.FileMode
+
+// raceSafeCopy copies the file old to the file new, being careful to ensure
+// that if multiple go commands call raceSafeCopy(old, new) at the same time,
+// they don't interfere with each other: both will succeed and return and
+// later observe the correct content in new. Like in the build cache, we arrange
+// this by opening new without truncation and then writing the content.
+// Both go commands can do this simultaneously and will write the same thing
+// (old never changes content).
+func raceSafeCopy(old, new string) error {
+	oldInfo, err := os.Stat(old)
+	if err != nil {
+		return err
+	}
+	newInfo, err := os.Stat(new)
+	if err == nil && newInfo.Size() == oldInfo.Size() {
+		return nil
+	}
+	data, err := os.ReadFile(old)
+	if err != nil {
+		return err
+	}
+	// The module cache has unwritable directories by default.
+	// Restore the user write bit in the directory so we can create
+	// the new go.mod file. We clear it again at the end on a
+	// best-effort basis (ignoring failures).
+	dir := filepath.Dir(old)
+	info, err := os.Stat(dir)
+	if err != nil {
+		return err
+	}
+	if err := os.Chmod(dir, info.Mode()|writeBits); err != nil {
+		return err
+	}
+	defer os.Chmod(dir, info.Mode())
+	// Note: create the file writable, so that a racing go command
+	// doesn't get an error before we store the actual data.
+	f, err := os.OpenFile(new, os.O_CREATE|os.O_WRONLY, writeBits&^0o111)
+	if err != nil {
+		// If OpenFile failed because a racing go command completed our work
+		// (and then OpenFile failed because the directory or file is now read-only),
+		// count that as a success.
+		if size(old) == size(new) {
+			return nil
+		}
+		return err
+	}
+	defer os.Chmod(new, oldInfo.Mode())
+	if _, err := f.Write(data); err != nil {
+		f.Close()
+		return err
+	}
+	return f.Close()
+}
+
+// modGoToolchain finds the enclosing go.work or go.mod file
+// and returns the go version and toolchain lines from the file.
+// The toolchain line overrides the version line
+func modGoToolchain() (file, goVers, toolchain string) {
+	wd := base.UncachedCwd()
+	file = modload.FindGoWork(wd)
+	// $GOWORK can be set to a file that does not yet exist, if we are running 'go work init'.
+	// Do not try to load the file in that case
+	if _, err := os.Stat(file); err != nil {
+		file = ""
+	}
+	if file == "" {
+		file = modload.FindGoMod(wd)
+	}
+	if file == "" {
+		return "", "", ""
+	}
+
+	data, err := os.ReadFile(file)
+	if err != nil {
+		base.Fatalf("%v", err)
+	}
+	return file, gover.GoModLookup(data, "go"), gover.GoModLookup(data, "toolchain")
+}
+
+// goInstallVersion reports whether the command line is go install m@v or go run m@v.
+// If so, Select must not read the go.mod or go.work file in "auto" or "path" mode.
+func goInstallVersion() bool {
+	// Note: We assume there are no flags between 'go' and 'install' or 'run'.
+	// During testing there are some debugging flags that are accepted
+	// in that position, but in production go binaries there are not.
+	if len(os.Args) < 3 || (os.Args[1] != "install" && os.Args[1] != "run") {
+		return false
+	}
+
+	// Check for pkg@version.
+	var arg string
+	switch os.Args[1] {
+	default:
+		return false
+	case "install":
+		// We would like to let 'go install -newflag pkg@version' work even
+		// across a toolchain switch. To make that work, assume the pkg@version
+		// is the last argument and skip the flag parsing.
+		arg = os.Args[len(os.Args)-1]
+	case "run":
+		// For run, the pkg@version can be anywhere on the command line,
+		// because it is preceded by run flags and followed by arguments to the
+		// program being run. To handle that precisely, we have to interpret the
+		// flags a little bit, to know whether each flag takes an optional argument.
+		// We can still allow unknown flags as long as they have an explicit =value.
+		args := os.Args[2:]
+		for i := 0; i < len(args); i++ {
+			a := args[i]
+			if !strings.HasPrefix(a, "-") {
+				arg = a
+				break
+			}
+			if a == "-" {
+				// non-flag but also non-pkg@version
+				return false
+			}
+			if a == "--" {
+				if i+1 >= len(args) {
+					return false
+				}
+				arg = args[i+1]
+				break
+			}
+			a = strings.TrimPrefix(a, "-")
+			a = strings.TrimPrefix(a, "-")
+			if strings.HasPrefix(a, "-") {
+				// non-flag but also non-pkg@version
+				return false
+			}
+			if strings.Contains(a, "=") {
+				// already has value
+				continue
+			}
+			f := run.CmdRun.Flag.Lookup(a)
+			if f == nil {
+				// Unknown flag. Give up. The command is going to fail in flag parsing.
+				return false
+			}
+			if bf, ok := f.Value.(interface{ IsBoolFlag() bool }); ok && bf.IsBoolFlag() {
+				// Does not take value.
+				continue
+			}
+			i++ // Does take a value; skip it.
+		}
+	}
+	if !strings.Contains(arg, "@") || build.IsLocalImport(arg) || filepath.IsAbs(arg) {
+		return false
+	}
+	path, version, _ := strings.Cut(arg, "@")
+	if path == "" || version == "" || gover.IsToolchain(path) {
+		return false
+	}
+
+	// It would be correct to simply return true here, bypassing use
+	// of the current go.mod or go.work, and let "go run" or "go install"
+	// do the rest, including a toolchain switch.
+	// Our goal instead is, since we have gone to the trouble of handling
+	// unknown flags to some degree, to run the switch now, so that
+	// these commands can switch to a newer toolchain directed by the
+	// go.mod which may actually understand the flag.
+	// This was brought up during the go.dev/issue/57001 proposal discussion
+	// and may end up being common in self-contained "go install" or "go run"
+	// command lines if we add new flags in the future.
+
+	// Set up modules without an explicit go.mod, to download go.mod.
+	modload.ForceUseModules = true
+	modload.RootMode = modload.NoRoot
+	modload.Init()
+	defer modload.Reset()
+
+	// See internal/load.PackagesAndErrorsOutsideModule
+	ctx := context.Background()
+	allowed := modload.CheckAllowed
+	if modload.IsRevisionQuery(path, version) {
+		// Don't check for retractions if a specific revision is requested.
+		allowed = nil
+	}
+	noneSelected := func(path string) (version string) { return "none" }
+	_, err := modload.QueryPackages(ctx, path, version, noneSelected, allowed)
+	if errors.Is(err, gover.ErrTooNew) {
+		// Run early switch, same one go install or go run would eventually do,
+		// if it understood all the command-line flags.
+		SwitchOrFatal(ctx, err)
+	}
+
+	return true // pkg@version found
+}
diff --git a/src/cmd/go/internal/toolchain/switch.go b/src/cmd/go/internal/toolchain/switch.go
new file mode 100644
index 0000000..2c6a2b8
--- /dev/null
+++ b/src/cmd/go/internal/toolchain/switch.go
@@ -0,0 +1,231 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package toolchain
+
+import (
+	"context"
+	"fmt"
+	"os"
+	"path/filepath"
+	"sort"
+	"strings"
+
+	"cmd/go/internal/base"
+	"cmd/go/internal/cfg"
+	"cmd/go/internal/gover"
+	"cmd/go/internal/modfetch"
+)
+
+// A Switcher collects errors to be reported and then decides
+// between reporting the errors or switching to a new toolchain
+// to resolve them.
+//
+// The client calls [Switcher.Error] repeatedly with errors encountered
+// and then calls [Switcher.Switch]. If the errors included any
+// *gover.TooNewErrors (potentially wrapped) and switching is
+// permitted by GOTOOLCHAIN, Switch switches to a new toolchain.
+// Otherwise Switch prints all the errors using base.Error.
+//
+// See https://go.dev/doc/toolchain#switch.
+type Switcher struct {
+	TooNew *gover.TooNewError // max go requirement observed
+	Errors []error            // errors collected so far
+}
+
+// Error reports the error to the Switcher,
+// which saves it for processing during Switch.
+func (s *Switcher) Error(err error) {
+	s.Errors = append(s.Errors, err)
+	s.addTooNew(err)
+}
+
+// addTooNew adds any TooNew errors that can be found in err.
+func (s *Switcher) addTooNew(err error) {
+	switch err := err.(type) {
+	case interface{ Unwrap() []error }:
+		for _, e := range err.Unwrap() {
+			s.addTooNew(e)
+		}
+
+	case interface{ Unwrap() error }:
+		s.addTooNew(err.Unwrap())
+
+	case *gover.TooNewError:
+		if s.TooNew == nil ||
+			gover.Compare(err.GoVersion, s.TooNew.GoVersion) > 0 ||
+			gover.Compare(err.GoVersion, s.TooNew.GoVersion) == 0 && err.What < s.TooNew.What {
+			s.TooNew = err
+		}
+	}
+}
+
+// NeedSwitch reports whether Switch would attempt to switch toolchains.
+func (s *Switcher) NeedSwitch() bool {
+	return s.TooNew != nil && (HasAuto() || HasPath())
+}
+
+// Switch decides whether to switch to a newer toolchain
+// to resolve any of the saved errors.
+// It switches if toolchain switches are permitted and there is at least one TooNewError.
+//
+// If Switch decides not to switch toolchains, it prints the errors using base.Error and returns.
+//
+// If Switch decides to switch toolchains but cannot identify a toolchain to use.
+// it prints the errors along with one more about not being able to find the toolchain
+// and returns.
+//
+// Otherwise, Switch prints an informational message giving a reason for the
+// switch and the toolchain being invoked and then switches toolchains.
+// This operation never returns.
+func (s *Switcher) Switch(ctx context.Context) {
+	if !s.NeedSwitch() {
+		for _, err := range s.Errors {
+			base.Error(err)
+		}
+		return
+	}
+
+	// Switch to newer Go toolchain if necessary and possible.
+	tv, err := NewerToolchain(ctx, s.TooNew.GoVersion)
+	if err != nil {
+		for _, err := range s.Errors {
+			base.Error(err)
+		}
+		base.Error(fmt.Errorf("switching to go >= %v: %w", s.TooNew.GoVersion, err))
+		return
+	}
+
+	fmt.Fprintf(os.Stderr, "go: %v requires go >= %v; switching to %v\n", s.TooNew.What, s.TooNew.GoVersion, tv)
+	Exec(tv)
+	panic("unreachable")
+}
+
+// SwitchOrFatal attempts a toolchain switch based on the information in err
+// and otherwise falls back to base.Fatal(err).
+func SwitchOrFatal(ctx context.Context, err error) {
+	var s Switcher
+	s.Error(err)
+	s.Switch(ctx)
+	base.Exit()
+}
+
+// NewerToolchain returns the name of the toolchain to use when we need
+// to switch to a newer toolchain that must support at least the given Go version.
+// See https://go.dev/doc/toolchain#switch.
+//
+// If the latest major release is 1.N.0, we use the latest patch release of 1.(N-1) if that's >= version.
+// Otherwise we use the latest 1.N if that's allowed.
+// Otherwise we use the latest release.
+func NewerToolchain(ctx context.Context, version string) (string, error) {
+	fetch := autoToolchains
+	if !HasAuto() {
+		fetch = pathToolchains
+	}
+	list, err := fetch(ctx)
+	if err != nil {
+		return "", err
+	}
+	return newerToolchain(version, list)
+}
+
+// autoToolchains returns the list of toolchain versions available to GOTOOLCHAIN=auto or =min+auto mode.
+func autoToolchains(ctx context.Context) ([]string, error) {
+	var versions *modfetch.Versions
+	err := modfetch.TryProxies(func(proxy string) error {
+		v, err := modfetch.Lookup(ctx, proxy, "go").Versions(ctx, "")
+		if err != nil {
+			return err
+		}
+		versions = v
+		return nil
+	})
+	if err != nil {
+		return nil, err
+	}
+	return versions.List, nil
+}
+
+// pathToolchains returns the list of toolchain versions available to GOTOOLCHAIN=path or =min+path mode.
+func pathToolchains(ctx context.Context) ([]string, error) {
+	have := make(map[string]bool)
+	var list []string
+	for _, dir := range pathDirs() {
+		if dir == "" || !filepath.IsAbs(dir) {
+			// Refuse to use local directories in $PATH (hard-coding exec.ErrDot).
+			continue
+		}
+		entries, err := os.ReadDir(dir)
+		if err != nil {
+			continue
+		}
+		for _, de := range entries {
+			if de.IsDir() || !strings.HasPrefix(de.Name(), "go1.") {
+				continue
+			}
+			info, err := de.Info()
+			if err != nil {
+				continue
+			}
+			v, ok := pathVersion(dir, de, info)
+			if !ok || !strings.HasPrefix(v, "1.") || have[v] {
+				continue
+			}
+			have[v] = true
+			list = append(list, v)
+		}
+	}
+	sort.Slice(list, func(i, j int) bool {
+		return gover.Compare(list[i], list[j]) < 0
+	})
+	return list, nil
+}
+
+// newerToolchain implements NewerToolchain where the list of choices is known.
+// It is separated out for easier testing of this logic.
+func newerToolchain(need string, list []string) (string, error) {
+	// Consider each release in the list, from newest to oldest,
+	// considering only entries >= need and then only entries
+	// that are the latest in their language family
+	// (the latest 1.40, the latest 1.39, and so on).
+	// We prefer the latest patch release before the most recent release family,
+	// so if the latest release is 1.40.1 we'll take the latest 1.39.X.
+	// Failing that, we prefer the latest patch release before the most recent
+	// prerelease family, so if the latest release is 1.40rc1 is out but 1.39 is okay,
+	// we'll still take 1.39.X.
+	// Failing that we'll take the latest release.
+	latest := ""
+	for i := len(list) - 1; i >= 0; i-- {
+		v := list[i]
+		if gover.Compare(v, need) < 0 {
+			break
+		}
+		if gover.Lang(latest) == gover.Lang(v) {
+			continue
+		}
+		newer := latest
+		latest = v
+		if newer != "" && !gover.IsPrerelease(newer) {
+			// latest is the last patch release of Go 1.X, and we saw a non-prerelease of Go 1.(X+1),
+			// so latest is the one we want.
+			break
+		}
+	}
+	if latest == "" {
+		return "", fmt.Errorf("no releases found for go >= %v", need)
+	}
+	return "go" + latest, nil
+}
+
+// HasAuto reports whether the GOTOOLCHAIN setting allows "auto" upgrades.
+func HasAuto() bool {
+	env := cfg.Getenv("GOTOOLCHAIN")
+	return env == "auto" || strings.HasSuffix(env, "+auto")
+}
+
+// HasPath reports whether the GOTOOLCHAIN setting allows "path" upgrades.
+func HasPath() bool {
+	env := cfg.Getenv("GOTOOLCHAIN")
+	return env == "path" || strings.HasSuffix(env, "+path")
+}
diff --git a/src/cmd/go/internal/toolchain/toolchain_test.go b/src/cmd/go/internal/toolchain/toolchain_test.go
new file mode 100644
index 0000000..e8ed566
--- /dev/null
+++ b/src/cmd/go/internal/toolchain/toolchain_test.go
@@ -0,0 +1,66 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package toolchain
+
+import (
+	"strings"
+	"testing"
+)
+
+func TestNewerToolchain(t *testing.T) {
+	for _, tt := range newerToolchainTests {
+		out, err := newerToolchain(tt.need, tt.list)
+		if (err != nil) != (out == "") {
+			t.Errorf("newerToolchain(%v, %v) = %v, %v, want error", tt.need, tt.list, out, err)
+			continue
+		}
+		if out != tt.out {
+			t.Errorf("newerToolchain(%v, %v) = %v, %v want %v, nil", tt.need, tt.list, out, err, tt.out)
+		}
+	}
+}
+
+var f = strings.Fields
+
+var relRC = []string{"1.39.0", "1.39.1", "1.39.2", "1.40.0", "1.40.1", "1.40.2", "1.41rc1"}
+var rel2 = []string{"1.39.0", "1.39.1", "1.39.2", "1.40.0", "1.40.1", "1.40.2"}
+var rel0 = []string{"1.39.0", "1.39.1", "1.39.2", "1.40.0"}
+var newerToolchainTests = []struct {
+	need string
+	list []string
+	out  string
+}{
+	{"1.30", rel0, "go1.39.2"},
+	{"1.30", rel2, "go1.39.2"},
+	{"1.30", relRC, "go1.39.2"},
+	{"1.38", rel0, "go1.39.2"},
+	{"1.38", rel2, "go1.39.2"},
+	{"1.38", relRC, "go1.39.2"},
+	{"1.38.1", rel0, "go1.39.2"},
+	{"1.38.1", rel2, "go1.39.2"},
+	{"1.38.1", relRC, "go1.39.2"},
+	{"1.39", rel0, "go1.39.2"},
+	{"1.39", rel2, "go1.39.2"},
+	{"1.39", relRC, "go1.39.2"},
+	{"1.39.2", rel0, "go1.39.2"},
+	{"1.39.2", rel2, "go1.39.2"},
+	{"1.39.2", relRC, "go1.39.2"},
+	{"1.39.3", rel0, "go1.40.0"},
+	{"1.39.3", rel2, "go1.40.2"},
+	{"1.39.3", relRC, "go1.40.2"},
+	{"1.40", rel0, "go1.40.0"},
+	{"1.40", rel2, "go1.40.2"},
+	{"1.40", relRC, "go1.40.2"},
+	{"1.40.1", rel0, ""},
+	{"1.40.1", rel2, "go1.40.2"},
+	{"1.40.1", relRC, "go1.40.2"},
+	{"1.41", rel0, ""},
+	{"1.41", rel2, ""},
+	{"1.41", relRC, "go1.41rc1"},
+	{"1.41.0", rel0, ""},
+	{"1.41.0", rel2, ""},
+	{"1.41.0", relRC, ""},
+	{"1.40", nil, ""},
+}
diff --git a/src/cmd/go/internal/toolchain/umask_none.go b/src/cmd/go/internal/toolchain/umask_none.go
new file mode 100644
index 0000000..b092fe8
--- /dev/null
+++ b/src/cmd/go/internal/toolchain/umask_none.go
@@ -0,0 +1,13 @@
+// Copyright 2023 The Go 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:build !(darwin || freebsd || linux || netbsd || openbsd)
+
+package toolchain
+
+import "io/fs"
+
+func sysWriteBits() fs.FileMode {
+	return 0700
+}
diff --git a/src/cmd/go/internal/toolchain/umask_unix.go b/src/cmd/go/internal/toolchain/umask_unix.go
new file mode 100644
index 0000000..cbe4307
--- /dev/null
+++ b/src/cmd/go/internal/toolchain/umask_unix.go
@@ -0,0 +1,28 @@
+// Copyright 2023 The Go 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:build darwin || freebsd || linux || netbsd || openbsd
+
+package toolchain
+
+import (
+	"io/fs"
+	"syscall"
+)
+
+// sysWriteBits determines which bits to OR into the mode to make a directory writable.
+// It must be called when there are no other file system operations happening.
+func sysWriteBits() fs.FileMode {
+	// Read current umask. There's no way to read it without also setting it,
+	// so set it conservatively and then restore the original one.
+	m := syscall.Umask(0o777)
+	syscall.Umask(m)    // restore bits
+	if m&0o22 == 0o22 { // group and world are unwritable by default
+		return 0o700
+	}
+	if m&0o2 == 0o2 { // group is writable by default, but not world
+		return 0o770
+	}
+	return 0o777 // everything is writable by default
+}
diff --git a/src/cmd/go/internal/vcs/vcs.go b/src/cmd/go/internal/vcs/vcs.go
index 12ea052..c65dd0f 100644
--- a/src/cmd/go/internal/vcs/vcs.go
+++ b/src/cmd/go/internal/vcs/vcs.go
@@ -22,6 +22,7 @@
 	"sync"
 	"time"
 
+	"cmd/go/internal/base"
 	"cmd/go/internal/cfg"
 	"cmd/go/internal/search"
 	"cmd/go/internal/str"
@@ -719,12 +720,24 @@
 	}
 	os.MkdirAll(dir, 0777) // Ignore errors — if unsuccessful, the command will likely fail.
 
+	release, err := base.AcquireNet()
+	if err != nil {
+		return err
+	}
+	defer release()
+
 	return v.runVerboseOnly(dir, 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 {
+	release, err := base.AcquireNet()
+	if err != nil {
+		return err
+	}
+	defer release()
+
 	for _, cmd := range v.CreateCmd {
 		if err := v.run(filepath.Dir(dir), cmd, "dir", dir, "repo", repo); err != nil {
 			return err
@@ -735,6 +748,12 @@
 
 // Download downloads any new changes for the repo in dir.
 func (v *Cmd) Download(dir string) error {
+	release, err := base.AcquireNet()
+	if err != nil {
+		return err
+	}
+	defer release()
+
 	for _, cmd := range v.DownloadCmd {
 		if err := v.run(dir, cmd); err != nil {
 			return err
@@ -759,7 +778,7 @@
 	return tags, nil
 }
 
-// tagSync syncs the repo in dir to the named tag,
+// TagSync syncs the repo in dir to the named tag,
 // which either is a tag returned by tags or is v.tagDefault.
 func (v *Cmd) TagSync(dir, tag string) error {
 	if v.TagSyncCmd == nil {
@@ -780,6 +799,12 @@
 		}
 	}
 
+	release, err := base.AcquireNet()
+	if err != nil {
+		return err
+	}
+	defer release()
+
 	if tag == "" && v.TagSyncDefault != nil {
 		for _, cmd := range v.TagSyncDefault {
 			if err := v.run(dir, cmd); err != nil {
@@ -1270,7 +1295,7 @@
 }
 
 // repoRootForImportDynamic finds a *RepoRoot for a custom domain that's not
-// statically known by repoRootForImportPathStatic.
+// statically known by repoRootFromVCSPaths.
 //
 // This handles custom import paths like "name.tld/pkg/foo" or just "name.tld".
 func repoRootForImportDynamic(importPath string, mod ModuleMode, security web.SecurityMode) (*RepoRoot, error) {
diff --git a/src/cmd/go/internal/vcweb/auth.go b/src/cmd/go/internal/vcweb/auth.go
index 094a828..383bf75 100644
--- a/src/cmd/go/internal/vcweb/auth.go
+++ b/src/cmd/go/internal/vcweb/auth.go
@@ -7,7 +7,7 @@
 import (
 	"encoding/json"
 	"fmt"
-	"io/ioutil"
+	"io"
 	"log"
 	"net/http"
 	"os"
@@ -77,7 +77,7 @@
 			accessDir = path.Dir(accessDir)
 		}
 
-		data, err := ioutil.ReadAll(accessFile)
+		data, err := io.ReadAll(accessFile)
 		if err != nil {
 			http.Error(w, err.Error(), http.StatusInternalServerError)
 			return
diff --git a/src/cmd/go/internal/vcweb/fossil.go b/src/cmd/go/internal/vcweb/fossil.go
index 4b5db22..cc24f2f 100644
--- a/src/cmd/go/internal/vcweb/fossil.go
+++ b/src/cmd/go/internal/vcweb/fossil.go
@@ -6,7 +6,6 @@
 
 import (
 	"fmt"
-	"io/ioutil"
 	"log"
 	"net/http"
 	"net/http/cgi"
@@ -39,7 +38,7 @@
 
 	cgiPath := db + ".cgi"
 	cgiScript := fmt.Sprintf("#!%s\nrepository: %s\n", h.fossilPath, db)
-	if err := ioutil.WriteFile(cgiPath, []byte(cgiScript), 0755); err != nil {
+	if err := os.WriteFile(cgiPath, []byte(cgiScript), 0755); err != nil {
 		return nil, err
 	}
 
diff --git a/src/cmd/go/internal/vcweb/git.go b/src/cmd/go/internal/vcweb/git.go
index 5f9864e..316c238 100644
--- a/src/cmd/go/internal/vcweb/git.go
+++ b/src/cmd/go/internal/vcweb/git.go
@@ -10,6 +10,7 @@
 	"net/http/cgi"
 	"os/exec"
 	"runtime"
+	"slices"
 	"sync"
 )
 
@@ -41,7 +42,7 @@
 		Logger: logger,
 		Args:   []string{"http-backend"},
 		Dir:    dir,
-		Env: append(env[:len(env):len(env)],
+		Env: append(slices.Clip(env),
 			"GIT_PROJECT_ROOT="+dir,
 			"GIT_HTTP_EXPORT_ALL=1",
 		),
diff --git a/src/cmd/go/internal/vcweb/hg.go b/src/cmd/go/internal/vcweb/hg.go
index e78f850..4571277 100644
--- a/src/cmd/go/internal/vcweb/hg.go
+++ b/src/cmd/go/internal/vcweb/hg.go
@@ -6,6 +6,7 @@
 
 import (
 	"bufio"
+	"context"
 	"errors"
 	"io"
 	"log"
@@ -14,8 +15,10 @@
 	"net/url"
 	"os"
 	"os/exec"
+	"slices"
 	"strings"
 	"sync"
+	"time"
 )
 
 type hgHandler struct {
@@ -47,9 +50,24 @@
 		// if "hg" works at all then "hg serve" works too, and we'll execute that as
 		// a subprocess, using a reverse proxy to forward the request and response.
 
-		cmd := exec.Command(h.hgPath, "serve", "--port", "0", "--address", "localhost", "--accesslog", os.DevNull, "--name", "vcweb", "--print-url")
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+
+		cmd := exec.CommandContext(ctx, h.hgPath, "serve", "--port", "0", "--address", "localhost", "--accesslog", os.DevNull, "--name", "vcweb", "--print-url")
 		cmd.Dir = dir
-		cmd.Env = append(env[:len(env):len(env)], "PWD="+dir)
+		cmd.Env = append(slices.Clip(env), "PWD="+dir)
+
+		cmd.Cancel = func() error {
+			err := cmd.Process.Signal(os.Interrupt)
+			if err != nil && !errors.Is(err, os.ErrProcessDone) {
+				err = cmd.Process.Kill()
+			}
+			return err
+		}
+		// This WaitDelay is arbitrary. After 'hg serve' prints its URL, any further
+		// I/O is only for debugging. (The actual output goes through the HTTP URL,
+		// not the standard I/O streams.)
+		cmd.WaitDelay = 10 * time.Second
 
 		stderr := new(strings.Builder)
 		cmd.Stderr = stderr
@@ -59,62 +77,46 @@
 			http.Error(w, err.Error(), http.StatusInternalServerError)
 			return
 		}
-		readDone := make(chan struct{})
-		defer func() {
-			stdout.Close()
-			<-readDone
-		}()
-
-		hgURL := make(chan *url.URL, 1)
-		hgURLError := make(chan error, 1)
-		go func() {
-			defer close(readDone)
-			r := bufio.NewReader(stdout)
-			for {
-				line, err := r.ReadString('\n')
-				if err != nil {
-					return
-				}
-				u, err := url.Parse(strings.TrimSpace(line))
-				if err == nil {
-					hgURL <- u
-				} else {
-					hgURLError <- err
-				}
-				break
-			}
-			io.Copy(io.Discard, r)
-		}()
 
 		if err := cmd.Start(); err != nil {
 			http.Error(w, err.Error(), http.StatusInternalServerError)
 			return
 		}
+		var wg sync.WaitGroup
 		defer func() {
-			if err := cmd.Process.Signal(os.Interrupt); err != nil && !errors.Is(err, os.ErrProcessDone) {
-				cmd.Process.Kill()
-			}
+			cancel()
 			err := cmd.Wait()
 			if out := strings.TrimSuffix(stderr.String(), "interrupted!\n"); out != "" {
 				logger.Printf("%v: %v\n%s", cmd, err, out)
 			} else {
 				logger.Printf("%v", cmd)
 			}
+			wg.Wait()
 		}()
 
-		select {
-		case <-req.Context().Done():
-			logger.Printf("%v: %v", req.Context().Err(), cmd)
-			http.Error(w, req.Context().Err().Error(), http.StatusBadGateway)
+		r := bufio.NewReader(stdout)
+		line, err := r.ReadString('\n')
+		if err != nil {
 			return
-		case err := <-hgURLError:
+		}
+		// We have read what should be the server URL. 'hg serve' shouldn't need to
+		// write anything else to stdout, but it's not a big deal if it does anyway.
+		// Keep the stdout pipe open so that 'hg serve' won't get a SIGPIPE, but
+		// actively discard its output so that it won't hang on a blocking write.
+		wg.Add(1)
+		go func() {
+			io.Copy(io.Discard, r)
+			wg.Done()
+		}()
+
+		u, err := url.Parse(strings.TrimSpace(line))
+		if err != nil {
 			logger.Printf("%v: %v", cmd, err)
 			http.Error(w, err.Error(), http.StatusBadGateway)
 			return
-		case url := <-hgURL:
-			logger.Printf("proxying hg request to %s", url)
-			httputil.NewSingleHostReverseProxy(url).ServeHTTP(w, req)
 		}
+		logger.Printf("proxying hg request to %s", u)
+		httputil.NewSingleHostReverseProxy(u).ServeHTTP(w, req)
 	})
 
 	return handler, nil
diff --git a/src/cmd/go/internal/vcweb/vcweb.go b/src/cmd/go/internal/vcweb/vcweb.go
index e1f1282..f748b34 100644
--- a/src/cmd/go/internal/vcweb/vcweb.go
+++ b/src/cmd/go/internal/vcweb/vcweb.go
@@ -362,7 +362,7 @@
 	fmt.Fprintf(w, "<title>vcweb</title>\n<pre>\n")
 	fmt.Fprintf(w, "<b>vcweb</b>\n\n")
 	fmt.Fprintf(w, "This server serves various version control repos for testing the go command.\n\n")
-	fmt.Fprintf(w, "For an overview of the script lanugage, see <a href=\"/help\">/help</a>.\n\n")
+	fmt.Fprintf(w, "For an overview of the script language, see <a href=\"/help\">/help</a>.\n\n")
 
 	fmt.Fprintf(w, "<b>cache</b>\n")
 
diff --git a/src/cmd/go/internal/version/version.go b/src/cmd/go/internal/version/version.go
index a0f6123..4a0132a 100644
--- a/src/cmd/go/internal/version/version.go
+++ b/src/cmd/go/internal/version/version.go
@@ -17,6 +17,7 @@
 	"strings"
 
 	"cmd/go/internal/base"
+	"cmd/go/internal/gover"
 )
 
 var CmdVersion = &base.Command{
@@ -73,7 +74,11 @@
 			base.SetExitStatus(2)
 			return
 		}
-		fmt.Printf("go version %s %s/%s\n", runtime.Version(), runtime.GOOS, runtime.GOARCH)
+		v := runtime.Version()
+		if gover.TestVersion != "" {
+			v = gover.TestVersion + " (TESTGO_VERSION)"
+		}
+		fmt.Printf("go version %s %s/%s\n", v, runtime.GOOS, runtime.GOARCH)
 		return
 	}
 
diff --git a/src/cmd/go/internal/vet/vet.go b/src/cmd/go/internal/vet/vet.go
index c73fa5b..2d42097 100644
--- a/src/cmd/go/internal/vet/vet.go
+++ b/src/cmd/go/internal/vet/vet.go
@@ -25,7 +25,7 @@
 
 var CmdVet = &base.Command{
 	CustomFlags: true,
-	UsageLine:   "go vet [-C dir] [-n] [-x] [-vettool prog] [build flags] [vet flags] [packages]",
+	UsageLine:   "go vet [build flags] [-vettool prog] [vet flags] [packages]",
 	Short:       "report likely mistakes in packages",
 	Long: `
 Vet runs the Go vet command on the packages named by the import paths.
@@ -35,10 +35,6 @@
 For a list of checkers and their flags, see 'go tool vet help'.
 For details of a specific checker such as 'printf', see 'go tool vet help printf'.
 
-The -C flag changes to dir before running the 'go vet' command.
-The -n flag prints commands that would be executed.
-The -x flag prints commands as they are executed.
-
 The -vettool=prog flag selects a different analysis tool with alternative
 or additional checks.
 For example, the 'shadow' analyzer can be built and run using these commands:
@@ -47,7 +43,7 @@
   go vet -vettool=$(which shadow)
 
 The build flags supported by go vet are those that control package resolution
-and execution, such as -n, -x, -v, -tags, and -toolexec.
+and execution, such as -C, -n, -x, -v, -tags, and -toolexec.
 For more about these flags, see 'go help build'.
 
 See also: go fmt, go fix.
@@ -98,7 +94,7 @@
 	b := work.NewBuilder("")
 	defer func() {
 		if err := b.Close(); err != nil {
-			base.Fatalf("go: %v", err)
+			base.Fatal(err)
 		}
 	}()
 
diff --git a/src/cmd/go/internal/web/http.go b/src/cmd/go/internal/web/http.go
index a3b7787..4fc939a 100644
--- a/src/cmd/go/internal/web/http.go
+++ b/src/cmd/go/internal/web/http.go
@@ -15,6 +15,7 @@
 	"crypto/tls"
 	"errors"
 	"fmt"
+	"io"
 	"mime"
 	"net"
 	"net/http"
@@ -24,6 +25,7 @@
 	"time"
 
 	"cmd/go/internal/auth"
+	"cmd/go/internal/base"
 	"cmd/go/internal/cfg"
 	"cmd/internal/browser"
 )
@@ -44,7 +46,7 @@
 
 var securityPreservingDefaultClient = securityPreservingHTTPClient(http.DefaultClient)
 
-// securityPreservingDefaultClient returns a client that is like the original
+// securityPreservingHTTPClient returns a client that is like the original
 // but rejects redirects to plain-HTTP URLs if the original URL was secure.
 func securityPreservingHTTPClient(original *http.Client) *http.Client {
 	c := new(http.Client)
@@ -114,7 +116,7 @@
 		return nil, false
 	}
 	for i, t := range testInterceptors {
-		if u.Host == t.FromHost && (t.Scheme == "" || u.Scheme == t.Scheme) {
+		if u.Host == t.FromHost && (u.Scheme == "" || u.Scheme == t.Scheme) {
 			return &testInterceptors[i], true
 		}
 	}
@@ -193,6 +195,11 @@
 			req.URL.Host = t.ToHost
 		}
 
+		release, err := base.AcquireNet()
+		if err != nil {
+			return nil, nil, err
+		}
+
 		var res *http.Response
 		if security == Insecure && url.Scheme == "https" { // fail earlier
 			res, err = impatientInsecureHTTPClient.Do(req)
@@ -204,6 +211,23 @@
 				res, err = securityPreservingDefaultClient.Do(req)
 			}
 		}
+
+		if err != nil {
+			// Per the docs for [net/http.Client.Do], “On error, any Response can be
+			// ignored. A non-nil Response with a non-nil error only occurs when
+			// CheckRedirect fails, and even then the returned Response.Body is
+			// already closed.”
+			release()
+			return nil, nil, err
+		}
+
+		// “If the returned error is nil, the Response will contain a non-nil Body
+		// which the user is expected to close.”
+		body := res.Body
+		res.Body = hookCloser{
+			ReadCloser: body,
+			afterClose: release,
+		}
 		return url, res, err
 	}
 
@@ -358,3 +382,14 @@
 	}
 	return false
 }
+
+type hookCloser struct {
+	io.ReadCloser
+	afterClose func()
+}
+
+func (c hookCloser) Close() error {
+	err := c.ReadCloser.Close()
+	c.afterClose()
+	return err
+}
diff --git a/src/cmd/go/internal/work/action.go b/src/cmd/go/internal/work/action.go
index 8beb134..d4d0a71 100644
--- a/src/cmd/go/internal/work/action.go
+++ b/src/cmd/go/internal/work/action.go
@@ -14,6 +14,7 @@
 	"debug/elf"
 	"encoding/json"
 	"fmt"
+	"internal/platform"
 	"os"
 	"path/filepath"
 	"strings"
@@ -25,6 +26,7 @@
 	"cmd/go/internal/cfg"
 	"cmd/go/internal/load"
 	"cmd/go/internal/robustio"
+	"cmd/go/internal/str"
 	"cmd/go/internal/trace"
 	"cmd/internal/buildid"
 )
@@ -342,7 +344,7 @@
 	builderWorkDirs.Range(func(bi, _ any) bool {
 		leakedBuilders++
 		if err := bi.(*Builder).Close(); err != nil {
-			base.Errorf("go: %v", err)
+			base.Error(err)
 		}
 		return true
 	})
@@ -354,7 +356,7 @@
 }
 
 func CheckGOOSARCHPair(goos, goarch string) error {
-	if _, ok := cfg.OSArchSupportsCgo[goos+"/"+goarch]; !ok && cfg.BuildContext.Compiler == "gc" {
+	if !platform.BuildModeSupported(cfg.BuildContext.Compiler, "default", goos, goarch) {
 		return fmt.Errorf("unsupported GOOS/GOARCH pair %s/%s", goos, goarch)
 	}
 	return nil
@@ -370,7 +372,7 @@
 // be called during action graph execution.
 func (b *Builder) NewObjdir() string {
 	b.objdirSeq++
-	return filepath.Join(b.WorkDir, fmt.Sprintf("b%03d", b.objdirSeq)) + string(filepath.Separator)
+	return str.WithFilePathSeparator(filepath.Join(b.WorkDir, fmt.Sprintf("b%03d", b.objdirSeq)))
 }
 
 // readpkglist returns the list of packages that were built into the shared library
@@ -380,16 +382,23 @@
 func readpkglist(shlibpath string) (pkgs []*load.Package) {
 	var stk load.ImportStack
 	if cfg.BuildToolchainName == "gccgo" {
-		f, _ := elf.Open(shlibpath)
+		f, err := elf.Open(shlibpath)
+		if err != nil {
+			base.Fatal(fmt.Errorf("failed to open shared library: %v", err))
+		}
 		sect := f.Section(".go_export")
-		data, _ := sect.Data()
-		scanner := bufio.NewScanner(bytes.NewBuffer(data))
-		for scanner.Scan() {
-			t := scanner.Text()
-			var found bool
-			if t, found = strings.CutPrefix(t, "pkgpath "); found {
-				t = strings.TrimSuffix(t, ";")
-				pkgs = append(pkgs, load.LoadImportWithFlags(t, base.Cwd(), nil, &stk, nil, 0))
+		if sect == nil {
+			base.Fatal(fmt.Errorf("%s: missing .go_export section", shlibpath))
+		}
+		data, err := sect.Data()
+		if err != nil {
+			base.Fatal(fmt.Errorf("%s: failed to read .go_export section: %v", shlibpath, err))
+		}
+		pkgpath := []byte("pkgpath ")
+		for _, line := range bytes.Split(data, []byte{'\n'}) {
+			if path, found := bytes.CutPrefix(line, pkgpath); found {
+				path = bytes.TrimSuffix(path, []byte{';'})
+				pkgs = append(pkgs, load.LoadPackageWithFlags(string(path), base.Cwd(), &stk, nil, 0))
 			}
 		}
 	} else {
@@ -400,7 +409,7 @@
 		scanner := bufio.NewScanner(bytes.NewBuffer(pkglistbytes))
 		for scanner.Scan() {
 			t := scanner.Text()
-			pkgs = append(pkgs, load.LoadImportWithFlags(t, base.Cwd(), nil, &stk, nil, 0))
+			pkgs = append(pkgs, load.LoadPackageWithFlags(t, base.Cwd(), &stk, nil, 0))
 		}
 	}
 	return
@@ -521,7 +530,10 @@
 		// vet expects to be able to import "fmt".
 		var stk load.ImportStack
 		stk.Push("vet")
-		p1 := load.LoadImportWithFlags("fmt", p.Dir, p, &stk, nil, 0)
+		p1, err := load.LoadImportWithFlags("fmt", p.Dir, p, &stk, nil, 0)
+		if err != nil {
+			base.Fatalf("unexpected error loading fmt package from package %s: %v", p.ImportPath, err)
+		}
 		stk.Pop()
 		aFmt := b.CompileAction(ModeBuild, depMode, p1)
 
@@ -821,7 +833,7 @@
 					}
 				}
 				var stk load.ImportStack
-				p := load.LoadImportWithFlags(pkg, base.Cwd(), nil, &stk, nil, 0)
+				p := load.LoadPackageWithFlags(pkg, base.Cwd(), &stk, nil, 0)
 				if p.Error != nil {
 					base.Fatalf("load %s: %v", pkg, p.Error)
 				}
diff --git a/src/cmd/go/internal/work/build.go b/src/cmd/go/internal/work/build.go
index 2f2860a..e2e0e07 100644
--- a/src/cmd/go/internal/work/build.go
+++ b/src/cmd/go/internal/work/build.go
@@ -61,6 +61,7 @@
 		Change to dir before running the command.
 		Any files named on the command line are interpreted after
 		changing directories.
+		If used, this flag must be the first one in the command line.
 	-a
 		force rebuilding of packages that are already up-to-date.
 	-n
@@ -84,8 +85,17 @@
 		Supported only on linux/amd64 or linux/arm64 and only with GCC 7 and higher
 		or Clang/LLVM 9 and higher.
 	-cover
-		enable code coverage instrumentation (requires
-		that GOEXPERIMENT=coverageredesign be set).
+		enable code coverage instrumentation.
+	-covermode set,count,atomic
+		set the mode for coverage analysis.
+		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 pattern1,pattern2,pattern3
 		For a build that targets package 'main' (e.g. building a Go
 		executable), apply coverage analysis to each package matching
@@ -99,7 +109,6 @@
 		do not delete it when exiting.
 	-x
 		print the commands.
-
 	-asmflags '[pattern=]arg list'
 		arguments to pass on each go tool asm invocation.
 	-buildmode mode
@@ -159,9 +168,11 @@
 		run through go run and go test respectively.
 	-pgo file
 		specify the file path of a profile for profile-guided optimization (PGO).
-		Special name "auto" lets the go command select a file named
-		"default.pgo" in the main package's directory if that file exists.
-		Special name "off" turns off PGO.
+		When the special name "auto" is specified, for each main package in the
+		build, the go command selects a file named "default.pgo" in the package's
+		directory if that file exists, and applies it to the (transitive)
+		dependencies of the main package (other packages are not affected).
+		Special name "off" turns off PGO. The default is "auto".
 	-pkgdir dir
 		install and load all packages from dir instead of the usual locations.
 		For example, when building with a non-standard configuration,
@@ -316,7 +327,7 @@
 	cmd.Flag.StringVar(&cfg.BuildContext.InstallSuffix, "installsuffix", "", "")
 	cmd.Flag.Var(&load.BuildLdflags, "ldflags", "")
 	cmd.Flag.BoolVar(&cfg.BuildLinkshared, "linkshared", false, "")
-	cmd.Flag.StringVar(&cfg.BuildPGO, "pgo", "", "")
+	cmd.Flag.StringVar(&cfg.BuildPGO, "pgo", "auto", "")
 	cmd.Flag.StringVar(&cfg.BuildPkgdir, "pkgdir", "", "")
 	cmd.Flag.BoolVar(&cfg.BuildRace, "race", false, "")
 	cmd.Flag.BoolVar(&cfg.BuildMSan, "msan", false, "")
@@ -330,6 +341,7 @@
 	// Undocumented, unstable debugging flags.
 	cmd.Flag.StringVar(&cfg.DebugActiongraph, "debug-actiongraph", "", "")
 	cmd.Flag.StringVar(&cfg.DebugTrace, "debug-trace", "", "")
+	cmd.Flag.StringVar(&cfg.DebugRuntimeTrace, "debug-runtime-trace", "", "")
 }
 
 // AddCoverFlags adds coverage-related flags to "cmd". If the
@@ -442,15 +454,13 @@
 
 var pkgsFilter = func(pkgs []*load.Package) []*load.Package { return pkgs }
 
-var RuntimeVersion = runtime.Version()
-
 func runBuild(ctx context.Context, cmd *base.Command, args []string) {
 	modload.InitWorkfile()
 	BuildInit()
 	b := NewBuilder("")
 	defer func() {
 		if err := b.Close(); err != nil {
-			base.Fatalf("go: %v", err)
+			base.Fatal(err)
 		}
 	}()
 
@@ -600,7 +610,8 @@
 Setting GODEBUG=installgoroot=all restores the use of
 $GOROOT/pkg/$GOOS_$GOARCH.
 
-For more about the build flags, see 'go help build'.
+For more about build flags, see 'go help build'.
+
 For more about specifying packages, see 'go help packages'.
 
 See also: go build, go get, go clean.
@@ -769,7 +780,7 @@
 	b := NewBuilder("")
 	defer func() {
 		if err := b.Close(); err != nil {
-			base.Fatalf("go: %v", err)
+			base.Fatal(err)
 		}
 	}()
 
@@ -857,7 +868,7 @@
 	pkgOpts := load.PackageOpts{MainOnly: true}
 	pkgs, err := load.PackagesAndErrorsOutsideModule(ctx, pkgOpts, args)
 	if err != nil {
-		base.Fatalf("go: %v", err)
+		base.Fatal(err)
 	}
 	load.CheckPackageErrors(pkgs)
 	patterns := make([]string, len(args))
diff --git a/src/cmd/go/internal/work/build_test.go b/src/cmd/go/internal/work/build_test.go
index 9e32b39..91648a3 100644
--- a/src/cmd/go/internal/work/build_test.go
+++ b/src/cmd/go/internal/work/build_test.go
@@ -6,6 +6,7 @@
 
 import (
 	"fmt"
+	"internal/testenv"
 	"io/fs"
 	"os"
 	"path/filepath"
@@ -41,19 +42,20 @@
 	}{
 		{[]byte(`-r:foo -L/usr/white\ space/lib -lfoo\ bar -lbar\ baz`), []string{"-r:foo", "-L/usr/white space/lib", "-lfoo bar", "-lbar baz"}},
 		{[]byte(`-lextra\ fun\ arg\\`), []string{`-lextra fun arg\`}},
-		{[]byte("\textra     whitespace\r\n"), []string{"extra", "whitespace"}},
-		{[]byte("     \r\n      "), nil},
+		{[]byte("\textra     whitespace\r\n"), []string{"extra", "whitespace\r"}},
+		{[]byte("     \r\n      "), []string{"\r"}},
 		{[]byte(`"-r:foo" "-L/usr/white space/lib" "-lfoo bar" "-lbar baz"`), []string{"-r:foo", "-L/usr/white space/lib", "-lfoo bar", "-lbar baz"}},
 		{[]byte(`"-lextra fun arg\\"`), []string{`-lextra fun arg\`}},
 		{[]byte(`"     \r\n\      "`), []string{`     \r\n\      `}},
-		{[]byte(`""`), nil},
+		{[]byte(`""`), []string{""}},
 		{[]byte(``), nil},
 		{[]byte(`"\\"`), []string{`\`}},
 		{[]byte(`"\x"`), []string{`\x`}},
 		{[]byte(`"\\x"`), []string{`\x`}},
-		{[]byte(`'\\'`), []string{`\`}},
+		{[]byte(`'\\'`), []string{`\\`}},
 		{[]byte(`'\x'`), []string{`\x`}},
 		{[]byte(`"\\x"`), []string{`\x`}},
+		{[]byte("\\\n"), nil},
 		{[]byte(`-fPIC -I/test/include/foo -DQUOTED='"/test/share/doc"'`), []string{"-fPIC", "-I/test/include/foo", `-DQUOTED="/test/share/doc"`}},
 		{[]byte(`-fPIC -I/test/include/foo -DQUOTED="/test/share/doc"`), []string{"-fPIC", "-I/test/include/foo", "-DQUOTED=/test/share/doc"}},
 		{[]byte(`-fPIC -I/test/include/foo -DQUOTED=\"/test/share/doc\"`), []string{"-fPIC", "-I/test/include/foo", `-DQUOTED="/test/share/doc"`}},
@@ -64,11 +66,11 @@
 	} {
 		got, err := splitPkgConfigOutput(test.in)
 		if err != nil {
-			t.Errorf("splitPkgConfigOutput on %v failed with error %v", test.in, err)
+			t.Errorf("splitPkgConfigOutput on %#q failed with error %v", test.in, err)
 			continue
 		}
 		if !reflect.DeepEqual(got, test.want) {
-			t.Errorf("splitPkgConfigOutput(%v) = %v; want %v", test.in, got, test.want)
+			t.Errorf("splitPkgConfigOutput(%#q) = %#q; want %#q", test.in, got, test.want)
 		}
 	}
 
@@ -220,13 +222,6 @@
 // directory.
 // See https://golang.org/issue/18878.
 func TestRespectSetgidDir(t *testing.T) {
-	switch runtime.GOOS {
-	case "ios":
-		t.Skip("can't set SetGID bit with chmod on iOS")
-	case "windows", "plan9":
-		t.Skip("chown/chmod setgid are not supported on Windows or Plan 9")
-	}
-
 	var b Builder
 
 	// Check that `cp` is called instead of `mv` by looking at the output
@@ -249,13 +244,24 @@
 	// the new temporary directory.
 	err = os.Chown(setgiddir, os.Getuid(), os.Getgid())
 	if err != nil {
+		if testenv.SyscallIsNotSupported(err) {
+			t.Skip("skipping: chown is not supported on " + runtime.GOOS)
+		}
 		t.Fatal(err)
 	}
 
 	// Change setgiddir's permissions to include the SetGID bit.
 	if err := os.Chmod(setgiddir, 0755|fs.ModeSetgid); err != nil {
+		if testenv.SyscallIsNotSupported(err) {
+			t.Skip("skipping: chmod is not supported on " + runtime.GOOS)
+		}
 		t.Fatal(err)
 	}
+	if fi, err := os.Stat(setgiddir); err != nil {
+		t.Fatal(err)
+	} else if fi.Mode()&fs.ModeSetgid == 0 {
+		t.Skip("skipping: Chmod ignored ModeSetgid on " + runtime.GOOS)
+	}
 
 	pkgfile, err := os.CreateTemp("", "pkgfile")
 	if err != nil {
diff --git a/src/cmd/go/internal/work/buildid.go b/src/cmd/go/internal/work/buildid.go
index db56714..a1d7599 100644
--- a/src/cmd/go/internal/work/buildid.go
+++ b/src/cmd/go/internal/work/buildid.go
@@ -437,6 +437,8 @@
 		return false
 	}
 
+	c := cache.Default()
+
 	if target != "" {
 		buildID, _ := buildid.ReadFile(target)
 		if strings.HasPrefix(buildID, actionID+buildIDSeparator) {
@@ -474,10 +476,8 @@
 					// If it doesn't work, it doesn't work: reusing the cached binary is more
 					// important than reprinting diagnostic information.
 					if printOutput {
-						if c := cache.Default(); c != nil {
-							showStdout(b, c, a.actionID, "stdout")      // compile output
-							showStdout(b, c, a.actionID, "link-stdout") // link output
-						}
+						showStdout(b, c, a.actionID, "stdout")      // compile output
+						showStdout(b, c, a.actionID, "link-stdout") // link output
 					}
 
 					// Poison a.Target to catch uses later in the build.
@@ -504,10 +504,8 @@
 		// If it doesn't work, it doesn't work: reusing the test result is more
 		// important than reprinting diagnostic information.
 		if printOutput {
-			if c := cache.Default(); c != nil {
-				showStdout(b, c, a.Deps[0].actionID, "stdout")      // compile output
-				showStdout(b, c, a.Deps[0].actionID, "link-stdout") // link output
-			}
+			showStdout(b, c, a.Deps[0].actionID, "stdout")      // compile output
+			showStdout(b, c, a.Deps[0].actionID, "link-stdout") // link output
 		}
 
 		// Poison a.Target to catch uses later in the build.
@@ -517,25 +515,23 @@
 	}
 
 	// Check to see if the action output is cached.
-	if c := cache.Default(); c != nil {
-		if file, _, err := c.GetFile(actionHash); err == nil {
-			if buildID, err := buildid.ReadFile(file); err == nil {
-				if printOutput {
-					showStdout(b, c, a.actionID, "stdout")
-				}
-				a.built = file
-				a.Target = "DO NOT USE - using cache"
-				a.buildID = buildID
-				if a.json != nil {
-					a.json.BuildID = a.buildID
-				}
-				if p := a.Package; p != nil && target != "" {
-					p.Stale = true
-					// Clearer than explaining that something else is stale.
-					p.StaleReason = "not installed but available in build cache"
-				}
-				return true
+	if file, _, err := cache.GetFile(c, actionHash); err == nil {
+		if buildID, err := buildid.ReadFile(file); err == nil {
+			if printOutput {
+				showStdout(b, c, a.actionID, "stdout")
 			}
+			a.built = file
+			a.Target = "DO NOT USE - using cache"
+			a.buildID = buildID
+			if a.json != nil {
+				a.json.BuildID = a.buildID
+			}
+			if p := a.Package; p != nil && target != "" {
+				p.Stale = true
+				// Clearer than explaining that something else is stale.
+				p.StaleReason = "not installed but available in build cache"
+			}
+			return true
 		}
 	}
 
@@ -564,8 +560,8 @@
 	return false
 }
 
-func showStdout(b *Builder, c *cache.Cache, actionID cache.ActionID, key string) error {
-	stdout, stdoutEntry, err := c.GetBytes(cache.Subkey(actionID, key))
+func showStdout(b *Builder, c cache.Cache, actionID cache.ActionID, key string) error {
+	stdout, stdoutEntry, err := cache.GetBytes(c, cache.Subkey(actionID, key))
 	if err != nil {
 		return err
 	}
@@ -609,22 +605,22 @@
 		}
 	}
 
+	c := cache.Default()
+
 	// Cache output from compile/link, even if we don't do the rest.
-	if c := cache.Default(); c != nil {
-		switch a.Mode {
-		case "build":
-			c.PutBytes(cache.Subkey(a.actionID, "stdout"), a.output)
-		case "link":
-			// Even though we don't cache the binary, cache the linker text output.
-			// We might notice that an installed binary is up-to-date but still
-			// want to pretend to have run the linker.
-			// Store it under the main package's action ID
-			// to make it easier to find when that's all we have.
-			for _, a1 := range a.Deps {
-				if p1 := a1.Package; p1 != nil && p1.Name == "main" {
-					c.PutBytes(cache.Subkey(a1.actionID, "link-stdout"), a.output)
-					break
-				}
+	switch a.Mode {
+	case "build":
+		cache.PutBytes(c, cache.Subkey(a.actionID, "stdout"), a.output)
+	case "link":
+		// Even though we don't cache the binary, cache the linker text output.
+		// We might notice that an installed binary is up-to-date but still
+		// want to pretend to have run the linker.
+		// Store it under the main package's action ID
+		// to make it easier to find when that's all we have.
+		for _, a1 := range a.Deps {
+			if p1 := a1.Package; p1 != nil && p1.Name == "main" {
+				cache.PutBytes(c, cache.Subkey(a1.actionID, "link-stdout"), a.output)
+				break
 			}
 		}
 	}
@@ -682,7 +678,7 @@
 	// that will mean the go process is itself writing a binary
 	// and then executing it, so we will need to defend against
 	// ETXTBSY problems as discussed in exec.go and golang.org/issue/22220.
-	if c := cache.Default(); c != nil && a.Mode == "build" {
+	if a.Mode == "build" {
 		r, err := os.Open(target)
 		if err == nil {
 			if a.output == nil {
diff --git a/src/cmd/go/internal/work/exec.go b/src/cmd/go/internal/work/exec.go
index d6fa847..13d2a78 100644
--- a/src/cmd/go/internal/work/exec.go
+++ b/src/cmd/go/internal/work/exec.go
@@ -13,6 +13,7 @@
 	"encoding/json"
 	"errors"
 	"fmt"
+	"go/token"
 	"internal/coverage"
 	"internal/lazyregexp"
 	"io"
@@ -24,6 +25,7 @@
 	"path/filepath"
 	"regexp"
 	"runtime"
+	"slices"
 	"sort"
 	"strconv"
 	"strings"
@@ -34,10 +36,12 @@
 	"cmd/go/internal/cache"
 	"cmd/go/internal/cfg"
 	"cmd/go/internal/fsys"
+	"cmd/go/internal/gover"
 	"cmd/go/internal/load"
 	"cmd/go/internal/modload"
 	"cmd/go/internal/str"
 	"cmd/go/internal/trace"
+	"cmd/internal/buildid"
 	"cmd/internal/quoted"
 	"cmd/internal/sys"
 )
@@ -64,7 +68,7 @@
 	return all
 }
 
-// do runs the action graph rooted at root.
+// Do runs the action graph rooted at root.
 func (b *Builder) Do(ctx context.Context, root *Action) {
 	ctx, span := trace.StartSpan(ctx, "exec.Builder.Do ("+root.Mode+" "+root.Target+")")
 	defer span.Done()
@@ -72,7 +76,11 @@
 	if !b.IsCmdList {
 		// If we're doing real work, take time at the end to trim the cache.
 		c := cache.Default()
-		defer c.Trim()
+		defer func() {
+			if err := c.Close(); err != nil {
+				base.Fatalf("go: failed to trim cache: %v", err)
+			}
+		}()
 	}
 
 	// Build list of all actions, assigning depth-first post-order priority.
@@ -309,8 +317,8 @@
 			fmt.Fprintf(h, "fuzz %q\n", fuzzFlags)
 		}
 	}
-	if p.Internal.BuildInfo != "" {
-		fmt.Fprintf(h, "modinfo %q\n", p.Internal.BuildInfo)
+	if p.Internal.BuildInfo != nil {
+		fmt.Fprintf(h, "modinfo %q\n", p.Internal.BuildInfo.String())
 	}
 
 	// Configuration specific to compiler toolchain.
@@ -382,8 +390,8 @@
 	for _, file := range inputFiles {
 		fmt.Fprintf(h, "file %s %s\n", file, b.fileHash(filepath.Join(p.Dir, file)))
 	}
-	if cfg.BuildPGOFile != "" {
-		fmt.Fprintf(h, "pgofile %s\n", b.fileHash(cfg.BuildPGOFile))
+	if p.Internal.PGOProfile != "" {
+		fmt.Fprintf(h, "pgofile %s\n", b.fileHash(p.Internal.PGOProfile))
 	}
 	for _, a1 := range a.Deps {
 		p1 := a1.Package
@@ -424,17 +432,7 @@
 	if v == "" {
 		return true
 	}
-	// Special case "1.0" means "go1", which is OK.
-	if v == "1.0" {
-		return true
-	}
-	// Otherwise look through release tags of form "go1.23" for one that matches.
-	for _, tag := range cfg.BuildContext.ReleaseTags {
-		if strings.HasPrefix(tag, "go") && tag[2:] == v {
-			return true
-		}
-	}
-	return false
+	return gover.Compare(gover.Local(), v) >= 0
 }
 
 const (
@@ -516,6 +514,12 @@
 		b.Print(p.ImportPath + "\n")
 	}
 
+	if p.Error != nil {
+		// Don't try to build anything for packages with errors. There may be a
+		// problem with the inputs that makes the package unsafe to build.
+		return p.Error
+	}
+
 	if p.BinaryOnly {
 		p.Stale = true
 		p.StaleReason = "binary-only packages are no longer supported"
@@ -525,6 +529,14 @@
 		return errors.New("binary-only packages are no longer supported")
 	}
 
+	if p.Module != nil && !allowedVersion(p.Module.GoVersion) {
+		return errors.New("module requires Go " + p.Module.GoVersion + " or later")
+	}
+
+	if err := b.checkDirectives(a); err != nil {
+		return err
+	}
+
 	if err := b.Mkdir(a.Objdir); err != nil {
 		return err
 	}
@@ -676,10 +688,11 @@
 				if mode == "" {
 					panic("covermode should be set at this point")
 				}
-				pkgcfg := a.Objdir + "pkgcfg.txt"
-				covoutfiles := a.Objdir + "coveroutfiles.txt"
-				if err := b.cover2(a, pkgcfg, covoutfiles, infiles, outfiles, coverVar, mode); err != nil {
+				if newoutfiles, err := b.cover2(a, infiles, outfiles, coverVar, mode); err != nil {
 					return err
+				} else {
+					outfiles = newoutfiles
+					gofiles = append([]string{newoutfiles[0]}, gofiles...)
 				}
 			} else {
 				// If there are no input files passed to cmd/cover,
@@ -827,8 +840,8 @@
 		embedcfg = js
 	}
 
-	if p.Internal.BuildInfo != "" && cfg.ModulesEnabled {
-		prog := modload.ModInfoProg(p.Internal.BuildInfo, cfg.BuildToolchainName == "gccgo")
+	if p.Internal.BuildInfo != nil && cfg.ModulesEnabled {
+		prog := modload.ModInfoProg(p.Internal.BuildInfo.String(), cfg.BuildToolchainName == "gccgo")
 		if len(prog) > 0 {
 			if err := b.writeFile(objdir+"_gomod_.go", prog); err != nil {
 				return err
@@ -842,10 +855,6 @@
 	ofile, out, err := BuildToolchain.gc(b, a, objpkg, icfg.Bytes(), embedcfg, symabis, len(sfiles) > 0, gofiles)
 	if len(out) > 0 {
 		output := b.processOutput(out)
-		if p.Module != nil && !allowedVersion(p.Module.GoVersion) {
-			output += "note: module requires Go " + p.Module.GoVersion + "\n"
-		}
-
 		if err != nil {
 			return formatOutput(b.WorkDir, p.Dir, p.ImportPath, p.Desc(), output)
 		} else {
@@ -853,9 +862,6 @@
 		}
 	}
 	if err != nil {
-		if p.Module != nil && !allowedVersion(p.Module.GoVersion) {
-			b.showOutput(a, p.Dir, p.Desc(), "note: module requires Go "+p.Module.GoVersion+"\n")
-		}
 		return err
 	}
 	if ofile != objpkg {
@@ -954,7 +960,38 @@
 	return nil
 }
 
-func (b *Builder) cacheObjdirFile(a *Action, c *cache.Cache, name string) error {
+func (b *Builder) checkDirectives(a *Action) error {
+	var msg *bytes.Buffer
+	p := a.Package
+	var seen map[string]token.Position
+	for _, d := range p.Internal.Build.Directives {
+		if strings.HasPrefix(d.Text, "//go:debug") {
+			key, _, err := load.ParseGoDebug(d.Text)
+			if err != nil && err != load.ErrNotGoDebug {
+				if msg == nil {
+					msg = new(bytes.Buffer)
+				}
+				fmt.Fprintf(msg, "%s: invalid //go:debug: %v\n", d.Pos, err)
+				continue
+			}
+			if pos, ok := seen[key]; ok {
+				fmt.Fprintf(msg, "%s: repeated //go:debug for %v\n\t%s: previous //go:debug\n", d.Pos, key, pos)
+				continue
+			}
+			if seen == nil {
+				seen = make(map[string]token.Position)
+			}
+			seen[key] = d.Pos
+		}
+	}
+	if msg != nil {
+		return formatOutput(b.WorkDir, p.Dir, p.ImportPath, p.Desc(), b.processOutput(msg.Bytes()))
+
+	}
+	return nil
+}
+
+func (b *Builder) cacheObjdirFile(a *Action, c cache.Cache, name string) error {
 	f, err := os.Open(a.Objdir + name)
 	if err != nil {
 		return err
@@ -964,15 +1001,15 @@
 	return err
 }
 
-func (b *Builder) findCachedObjdirFile(a *Action, c *cache.Cache, name string) (string, error) {
-	file, _, err := c.GetFile(cache.Subkey(a.actionID, name))
+func (b *Builder) findCachedObjdirFile(a *Action, c cache.Cache, name string) (string, error) {
+	file, _, err := cache.GetFile(c, cache.Subkey(a.actionID, name))
 	if err != nil {
 		return "", fmt.Errorf("loading cached file %s: %w", name, err)
 	}
 	return file, nil
 }
 
-func (b *Builder) loadCachedObjdirFile(a *Action, c *cache.Cache, name string) error {
+func (b *Builder) loadCachedObjdirFile(a *Action, c cache.Cache, name string) error {
 	cached, err := b.findCachedObjdirFile(a, c, name)
 	if err != nil {
 		return err
@@ -1008,12 +1045,12 @@
 			return
 		}
 	}
-	c.PutBytes(cache.Subkey(a.actionID, "srcfiles"), buf.Bytes())
+	cache.PutBytes(c, cache.Subkey(a.actionID, "srcfiles"), buf.Bytes())
 }
 
 func (b *Builder) loadCachedVet(a *Action) error {
 	c := cache.Default()
-	list, _, err := c.GetBytes(cache.Subkey(a.actionID, "srcfiles"))
+	list, _, err := cache.GetBytes(c, cache.Subkey(a.actionID, "srcfiles"))
 	if err != nil {
 		return fmt.Errorf("reading srcfiles list: %w", err)
 	}
@@ -1037,7 +1074,7 @@
 
 func (b *Builder) loadCachedCompiledGoFiles(a *Action) error {
 	c := cache.Default()
-	list, _, err := c.GetBytes(cache.Subkey(a.actionID, "srcfiles"))
+	list, _, err := cache.GetBytes(c, cache.Subkey(a.actionID, "srcfiles"))
 	if err != nil {
 		return fmt.Errorf("reading srcfiles list: %w", err)
 	}
@@ -1078,6 +1115,7 @@
 	PackageVetx map[string]string // map package path to vetx data from earlier vet run
 	VetxOnly    bool              // only compute vetx data; don't report detected problems
 	VetxOutput  string            // write vetx data to this output file
+	GoVersion   string            // Go version for package
 
 	SucceedOnTypecheckFailure bool // awful hack; see #18395 and below
 }
@@ -1112,6 +1150,13 @@
 		PackageFile:  make(map[string]string),
 		Standard:     make(map[string]bool),
 	}
+	if a.Package.Module != nil {
+		v := a.Package.Module.GoVersion
+		if v == "" {
+			v = gover.DefaultGoModVersion
+		}
+		vcfg.GoVersion = "go" + v
+	}
 	a.vetCfg = vcfg
 	for i, raw := range a.Package.Internal.RawImports {
 		final := a.Package.Imports[i]
@@ -1240,7 +1285,7 @@
 
 	if vcfg.VetxOnly && !cfg.BuildA {
 		c := cache.Default()
-		if file, _, err := c.GetFile(key); err == nil {
+		if file, _, err := cache.GetFile(c, key); err == nil {
 			a.built = file
 			return nil
 		}
@@ -1435,7 +1480,11 @@
 			fmt.Fprintf(&icfg, "packageshlib %s=%s\n", p1.ImportPath, p1.Shlib)
 		}
 	}
-	fmt.Fprintf(&icfg, "modinfo %q\n", modload.ModInfoData(a.Package.Internal.BuildInfo))
+	info := ""
+	if a.Package.Internal.BuildInfo != nil {
+		info = a.Package.Internal.BuildInfo.String()
+	}
+	fmt.Fprintf(&icfg, "modinfo %q\n", modload.ModInfoData(info))
 	return b.writeFile(file, icfg.Bytes())
 }
 
@@ -1445,64 +1494,110 @@
 	return envList("PKG_CONFIG", cfg.DefaultPkgConfig)[0]
 }
 
-// splitPkgConfigOutput parses the pkg-config output into a slice of
-// flags. This implements the algorithm from pkgconf/libpkgconf/argvsplit.c.
+// splitPkgConfigOutput parses the pkg-config output into a slice of flags.
+// This implements the shell quoting semantics described in
+// https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_02,
+// except that it does not support parameter or arithmetic expansion or command
+// substitution and hard-codes the <blank> delimiters instead of reading them
+// from LC_LOCALE.
 func splitPkgConfigOutput(out []byte) ([]string, error) {
 	if len(out) == 0 {
 		return nil, nil
 	}
 	var flags []string
 	flag := make([]byte, 0, len(out))
-	escaped := false
-	quote := byte(0)
+	didQuote := false // was the current flag parsed from a quoted string?
+	escaped := false  // did we just read `\` in a non-single-quoted context?
+	quote := byte(0)  // what is the quote character around the current string?
 
 	for _, c := range out {
 		if escaped {
-			if quote != 0 {
+			if quote == '"' {
+				// “The <backslash> shall retain its special meaning as an escape
+				// character … only when followed by one of the following characters
+				// when considered special:”
 				switch c {
-				case '$', '`', '"', '\\':
+				case '$', '`', '"', '\\', '\n':
+					// Handle the escaped character normally.
 				default:
-					flag = append(flag, '\\')
+					// Not an escape character after all.
+					flag = append(flag, '\\', c)
+					escaped = false
+					continue
 				}
-				flag = append(flag, c)
+			}
+
+			if c == '\n' {
+				// “If a <newline> follows the <backslash>, the shell shall interpret
+				// this as line continuation.”
 			} else {
 				flag = append(flag, c)
 			}
 			escaped = false
-		} else if quote != 0 {
-			if c == quote {
-				quote = 0
-			} else {
-				switch c {
-				case '\\':
-					escaped = true
-				default:
-					flag = append(flag, c)
-				}
-			}
-		} else if strings.IndexByte(" \t\n\v\f\r", c) < 0 {
+			continue
+		}
+
+		if quote != 0 && c == quote {
+			quote = 0
+			continue
+		}
+		switch quote {
+		case '\'':
+			// “preserve the literal value of each character”
+			flag = append(flag, c)
+			continue
+		case '"':
+			// “preserve the literal value of all characters within the double-quotes,
+			// with the exception of …”
 			switch c {
-			case '\\':
-				escaped = true
-			case '\'', '"':
-				quote = c
+			case '`', '$', '\\':
 			default:
 				flag = append(flag, c)
+				continue
 			}
-		} else if len(flag) != 0 {
-			flags = append(flags, string(flag))
-			flag = flag[:0]
 		}
-	}
-	if escaped {
-		return nil, errors.New("broken character escaping in pkgconf output ")
-	}
-	if quote != 0 {
-		return nil, errors.New("unterminated quoted string in pkgconf output ")
-	} else if len(flag) != 0 {
-		flags = append(flags, string(flag))
+
+		// “The application shall quote the following characters if they are to
+		// represent themselves:”
+		switch c {
+		case '|', '&', ';', '<', '>', '(', ')', '$', '`':
+			return nil, fmt.Errorf("unexpected shell character %q in pkgconf output", c)
+
+		case '\\':
+			// “A <backslash> that is not quoted shall preserve the literal value of
+			// the following character, with the exception of a <newline>.”
+			escaped = true
+			continue
+
+		case '"', '\'':
+			quote = c
+			didQuote = true
+			continue
+
+		case ' ', '\t', '\n':
+			if len(flag) > 0 || didQuote {
+				flags = append(flags, string(flag))
+			}
+			flag, didQuote = flag[:0], false
+			continue
+		}
+
+		flag = append(flag, c)
 	}
 
+	// Prefer to report a missing quote instead of a missing escape. If the string
+	// is something like `"foo\`, it's ambiguous as to whether the trailing
+	// backslash is really an escape at all.
+	if quote != 0 {
+		return nil, errors.New("unterminated quoted string in pkgconf output")
+	}
+	if escaped {
+		return nil, errors.New("broken character escaping in pkgconf output")
+	}
+
+	if len(flag) > 0 || didQuote {
+		flags = append(flags, string(flag))
+	}
 	return flags, nil
 }
 
@@ -1534,7 +1629,7 @@
 			return nil, nil, err
 		}
 		if len(out) > 0 {
-			cflags, err = splitPkgConfigOutput(out)
+			cflags, err = splitPkgConfigOutput(bytes.TrimSpace(out))
 			if err != nil {
 				return nil, nil, err
 			}
@@ -1548,9 +1643,12 @@
 			return nil, nil, err
 		}
 		if len(out) > 0 {
-			// NOTE: we don't attempt to parse quotes and unescapes here. pkg-config
-			// is typically used within shell backticks, which treats quotes literally.
-			ldflags = strings.Fields(string(out))
+			// We need to handle path with spaces so that C:/Program\ Files can pass
+			// checkLinkerFlags. Use splitPkgConfigOutput here just like we treat cflags.
+			ldflags, err = splitPkgConfigOutput(bytes.TrimSpace(out))
+			if err != nil {
+				return nil, nil, err
+			}
 			if err := checkLinkerFlags("LDFLAGS", "pkg-config --libs", ldflags); err != nil {
 				return nil, nil, err
 			}
@@ -1935,9 +2033,19 @@
 // cover2 runs, in effect,
 //
 //	go tool cover -pkgcfg=<config file> -mode=b.coverMode -var="varName" -o <outfiles> <infiles>
-func (b *Builder) cover2(a *Action, pkgcfg, covoutputs string, infiles, outfiles []string, varName string, mode string) error {
+//
+// Return value is an updated output files list; in addition to the
+// regular outputs (instrumented source files) the cover tool also
+// writes a separate file (appearing first in the list of outputs)
+// that will contain coverage counters and meta-data.
+func (b *Builder) cover2(a *Action, infiles, outfiles []string, varName string, mode string) ([]string, error) {
+	pkgcfg := a.Objdir + "pkgcfg.txt"
+	covoutputs := a.Objdir + "coveroutfiles.txt"
+	odir := filepath.Dir(outfiles[0])
+	cv := filepath.Join(odir, "covervars.go")
+	outfiles = append([]string{cv}, outfiles...)
 	if err := b.writeCoverPkgInputs(a, pkgcfg, covoutputs, outfiles); err != nil {
-		return err
+		return nil, err
 	}
 	args := []string{base.Tool("cover"),
 		"-pkgcfg", pkgcfg,
@@ -1946,8 +2054,11 @@
 		"-outfilelist", covoutputs,
 	}
 	args = append(args, infiles...)
-	return b.run(a, a.Objdir, "cover "+a.Package.ImportPath, nil,
-		cfg.BuildToolexec, args)
+	if err := b.run(a, a.Objdir, "cover "+a.Package.ImportPath, nil,
+		cfg.BuildToolexec, args); err != nil {
+		return nil, err
+	}
+	return outfiles, nil
 }
 
 func (b *Builder) writeCoverPkgInputs(a *Action, pconfigfile string, covoutputsfile string, outfiles []string) error {
@@ -2060,7 +2171,7 @@
 	return cmd
 }
 
-// showcmd prints the given command to standard output
+// Showcmd prints the given command to standard output
 // for the implementation of -n or -x.
 func (b *Builder) Showcmd(dir string, format string, args ...any) {
 	b.output.Lock()
@@ -2152,13 +2263,39 @@
 func formatOutput(workDir, dir, importPath, desc, out string) *prefixSuffixError {
 	prefix := "# " + desc
 	suffix := "\n" + out
-	if reldir := base.ShortPath(dir); reldir != dir {
-		suffix = strings.ReplaceAll(suffix, " "+dir, " "+reldir)
-		suffix = strings.ReplaceAll(suffix, "\n"+dir, "\n"+reldir)
-		suffix = strings.ReplaceAll(suffix, "\n\t"+dir, "\n\t"+reldir)
-	}
+
 	suffix = strings.ReplaceAll(suffix, " "+workDir, " $WORK")
 
+	for {
+		// Note that dir starts out long, something like
+		// /foo/bar/baz/root/a
+		// The target string to be reduced is something like
+		// (blah-blah-blah) /foo/bar/baz/root/sibling/whatever.go:blah:blah
+		// /foo/bar/baz/root/a doesn't match /foo/bar/baz/root/sibling, but the prefix
+		// /foo/bar/baz/root does.  And there may be other niblings sharing shorter
+		// prefixes, the only way to find them is to look.
+		// This doesn't always produce a relative path --
+		// /foo is shorter than ../../.., for example.
+		//
+		if reldir := base.ShortPath(dir); reldir != dir {
+			suffix = strings.ReplaceAll(suffix, " "+dir, " "+reldir)
+			suffix = strings.ReplaceAll(suffix, "\n"+dir, "\n"+reldir)
+			suffix = strings.ReplaceAll(suffix, "\n\t"+dir, "\n\t"+reldir)
+			if filepath.Separator == '\\' {
+				// Don't know why, sometimes this comes out with slashes, not backslashes.
+				wdir := strings.ReplaceAll(dir, "\\", "/")
+				suffix = strings.ReplaceAll(suffix, " "+wdir, " "+reldir)
+				suffix = strings.ReplaceAll(suffix, "\n"+wdir, "\n"+reldir)
+				suffix = strings.ReplaceAll(suffix, "\n\t"+wdir, "\n\t"+reldir)
+			}
+		}
+		dirP := filepath.Dir(dir)
+		if dir == dirP {
+			break
+		}
+		dir = dirP
+	}
+
 	return &prefixSuffixError{importPath: importPath, prefix: prefix, suffix: suffix}
 }
 
@@ -2311,7 +2448,7 @@
 	return []string{"TERM=dumb"}
 }
 
-// mkdir makes the named directory.
+// Mkdir makes the named directory.
 func (b *Builder) Mkdir(dir string) error {
 	// Make Mkdir(a.Objdir) a no-op instead of an error when a.Objdir == "".
 	if dir == "" {
@@ -2340,7 +2477,7 @@
 	return nil
 }
 
-// symlink creates a symlink newname -> oldname.
+// Symlink creates a symlink newname -> oldname.
 func (b *Builder) Symlink(oldname, newname string) error {
 	// It's not an error to try to recreate an existing symlink.
 	if link, err := os.Readlink(newname); err == nil && link == oldname {
@@ -2470,30 +2607,56 @@
 	// when -trimpath is enabled.
 	if b.gccSupportsFlag(compiler, "-fdebug-prefix-map=a=b") {
 		if cfg.BuildTrimpath || p.Goroot {
+			prefixMapFlag := "-fdebug-prefix-map"
+			if b.gccSupportsFlag(compiler, "-ffile-prefix-map=a=b") {
+				prefixMapFlag = "-ffile-prefix-map"
+			}
 			// Keep in sync with Action.trimpath.
-			// The trimmed paths are a little different, but we need to trim in the
+			// The trimmed paths are a little different, but we need to trim in mostly the
 			// same situations.
 			var from, toPath string
-			if m := p.Module; m != nil {
-				from = m.Dir
-				toPath = m.Path + "@" + m.Version
+			if m := p.Module; m == nil {
+				if p.Root == "" { // command-line-arguments in GOPATH mode, maybe?
+					from = p.Dir
+					toPath = p.ImportPath
+				} else if p.Goroot {
+					from = p.Root
+					toPath = "GOROOT"
+				} else {
+					from = p.Root
+					toPath = "GOPATH"
+				}
+			} else if m.Dir == "" {
+				// The module is in the vendor directory. Replace the entire vendor
+				// directory path, because the module's Dir is not filled in.
+				from = modload.VendorDir()
+				toPath = "vendor"
 			} else {
-				from = p.Dir
-				toPath = p.ImportPath
+				from = m.Dir
+				toPath = m.Path
+				if m.Version != "" {
+					toPath += "@" + m.Version
+				}
 			}
-			// -fdebug-prefix-map requires an absolute "to" path (or it joins the path
-			// with the working directory). Pick something that makes sense for the
-			// target platform.
+			// -fdebug-prefix-map (or -ffile-prefix-map) requires an absolute "to"
+			// path (or it joins the path  with the working directory). Pick something
+			// that makes sense for the target platform.
 			var to string
 			if cfg.BuildContext.GOOS == "windows" {
 				to = filepath.Join(`\\_\_`, toPath)
 			} else {
 				to = filepath.Join("/_", toPath)
 			}
-			flags = append(flags[:len(flags):len(flags)], "-fdebug-prefix-map="+from+"="+to)
+			flags = append(slices.Clip(flags), prefixMapFlag+"="+from+"="+to)
 		}
 	}
 
+	// Tell gcc to not insert truly random numbers into the build process
+	// this ensures LTO won't create random numbers for symbols.
+	if b.gccSupportsFlag(compiler, "-frandom-seed=1") {
+		flags = append(flags, "-frandom-seed="+buildid.HashToString(a.actionID))
+	}
+
 	overlayPath := file
 	if p, ok := a.nonGoOverlay[overlayPath]; ok {
 		overlayPath = p
@@ -2583,13 +2746,13 @@
 	return err
 }
 
-// gccCmd returns a gcc command line prefix
+// GccCmd returns a gcc command line prefix
 // defaultCC is defined in zdefaultcc.go, written by cmd/dist.
 func (b *Builder) GccCmd(incdir, workdir string) []string {
 	return b.compilerCmd(b.ccExe(), incdir, workdir)
 }
 
-// gxxCmd returns a g++ command line prefix
+// GxxCmd returns a g++ command line prefix
 // defaultCXX is defined in zdefaultcc.go, written by cmd/dist.
 func (b *Builder) GxxCmd(incdir, workdir string) []string {
 	return b.compilerCmd(b.cxxExe(), incdir, workdir)
@@ -2667,7 +2830,11 @@
 			workdir = b.WorkDir
 		}
 		workdir = strings.TrimSuffix(workdir, string(filepath.Separator))
-		a = append(a, "-fdebug-prefix-map="+workdir+"=/tmp/go-build")
+		if b.gccSupportsFlag(compiler, "-ffile-prefix-map=a=b") {
+			a = append(a, "-ffile-prefix-map="+workdir+"=/tmp/go-build")
+		} else {
+			a = append(a, "-fdebug-prefix-map="+workdir+"=/tmp/go-build")
+		}
 	}
 
 	// Tell gcc not to include flags in object files, which defeats the
@@ -2770,7 +2937,7 @@
 	var flagID cache.ActionID
 	if cacheOK {
 		flagID = cache.Subkey(compilerID, "gccSupportsFlag "+flag)
-		if data, _, err := cache.Default().GetBytes(flagID); err == nil {
+		if data, _, err := cache.GetBytes(cache.Default(), flagID); err == nil {
 			supported := string(data) == "true"
 			b.flagCache[key] = supported
 			return supported
@@ -2802,7 +2969,7 @@
 		if supported {
 			s = "true"
 		}
-		cache.Default().PutBytes(flagID, []byte(s))
+		cache.PutBytes(cache.Default(), flagID, []byte(s))
 	}
 
 	b.flagCache[key] = supported
@@ -2854,7 +3021,7 @@
 	h := cache.NewHash("gccCompilerID")
 	fmt.Fprintf(h, "gccCompilerID %q", exe)
 	key := h.Sum()
-	data, _, err := cache.Default().GetBytes(key)
+	data, _, err := cache.GetBytes(cache.Default(), key)
 	if err == nil && len(data) > len(id) {
 		stats := strings.Split(string(data[:len(data)-len(id)]), "\x00")
 		if len(stats)%2 != 0 {
@@ -2902,7 +3069,7 @@
 	}
 	buf.Write(id[:])
 
-	cache.Default().PutBytes(key, buf.Bytes())
+	cache.PutBytes(cache.Default(), key, buf.Bytes())
 	if b.gccCompilerIDCache == nil {
 		b.gccCompilerIDCache = make(map[string]cache.ActionID)
 	}
@@ -3027,6 +3194,36 @@
 		}
 	}
 
+	// Scrutinize CFLAGS and related for flags that might cause
+	// problems if we are using internal linking (for example, use of
+	// plugins, LTO, etc) by calling a helper routine that builds on
+	// the existing CGO flags allow-lists. If we see anything
+	// suspicious, emit a special token file "preferlinkext" (known to
+	// the linker) in the object file to signal the that it should not
+	// try to link internally and should revert to external linking.
+	// The token we pass is a suggestion, not a mandate; if a user is
+	// explicitly asking for a specific linkmode via the "-linkmode"
+	// flag, the token will be ignored. NB: in theory we could ditch
+	// the token approach and just pass a flag to the linker when we
+	// eventually invoke it, and the linker flag could then be
+	// documented (although coming up with a simple explanation of the
+	// flag might be challenging). For more context see issues #58619,
+	// #58620, and #58848.
+	flagSources := []string{"CGO_CFLAGS", "CGO_CXXFLAGS", "CGO_FFLAGS"}
+	flagLists := [][]string{cgoCFLAGS, cgoCXXFLAGS, cgoFFLAGS}
+	if flagsNotCompatibleWithInternalLinking(flagSources, flagLists) {
+		tokenFile := objdir + "preferlinkext"
+		if cfg.BuildN || cfg.BuildX {
+			b.Showcmd("", "echo > %s", tokenFile)
+		}
+		if !cfg.BuildN {
+			if err := os.WriteFile(tokenFile, nil, 0666); err != nil {
+				return nil, nil, err
+			}
+		}
+		outObj = append(outObj, tokenFile)
+	}
+
 	if cfg.BuildMSan {
 		cgoCFLAGS = append([]string{"-fsanitize=memory"}, cgoCFLAGS...)
 		cgoLDFLAGS = append([]string{"-fsanitize=memory"}, cgoLDFLAGS...)
@@ -3276,6 +3473,24 @@
 	return outGo, outObj, nil
 }
 
+// flagsNotCompatibleWithInternalLinking scans the list of cgo
+// compiler flags (C/C++/Fortran) looking for flags that might cause
+// problems if the build in question uses internal linking. The
+// primary culprits are use of plugins or use of LTO, but we err on
+// the side of caution, supporting only those flags that are on the
+// allow-list for safe flags from security perspective. Return is TRUE
+// if a sensitive flag is found, FALSE otherwise.
+func flagsNotCompatibleWithInternalLinking(sourceList []string, flagListList [][]string) bool {
+	for i := range sourceList {
+		sn := sourceList[i]
+		fll := flagListList[i]
+		if err := checkCompilerFlagsForInternalLink(sn, sn, fll); err != nil {
+			return true
+		}
+	}
+	return false
+}
+
 // dynimport creates a Go source file named importGo containing
 // //go:cgo_import_dynamic directives for each symbol or library
 // dynamically imported by the object files outObj.
@@ -3587,8 +3802,13 @@
 	// going to compile.
 	goFile = objdir + goFile
 	newGoFile := objdir + "_" + base + "_swig.go"
-	if err := os.Rename(goFile, newGoFile); err != nil {
-		return "", "", err
+	if cfg.BuildX || cfg.BuildN {
+		b.Showcmd("", "mv %s %s", goFile, newGoFile)
+	}
+	if !cfg.BuildN {
+		if err := os.Rename(goFile, newGoFile); err != nil {
+			return "", "", err
+		}
 	}
 	return newGoFile, objdir + gccBase + gccExt, nil
 }
@@ -3674,7 +3894,7 @@
 	// TODO: Note that other toolchains like CC are missing here for now.
 	prog := strings.TrimSuffix(filepath.Base(path), ".exe")
 	switch prog {
-	case "compile", "link", "cgo", "asm":
+	case "compile", "link", "cgo", "asm", "cover":
 	default:
 		return false
 	}
diff --git a/src/cmd/go/internal/work/gc.go b/src/cmd/go/internal/work/gc.go
index ded751f..26b4e0f 100644
--- a/src/cmd/go/internal/work/gc.go
+++ b/src/cmd/go/internal/work/gc.go
@@ -19,6 +19,7 @@
 	"cmd/go/internal/base"
 	"cmd/go/internal/cfg"
 	"cmd/go/internal/fsys"
+	"cmd/go/internal/gover"
 	"cmd/go/internal/load"
 	"cmd/go/internal/str"
 	"cmd/internal/objabi"
@@ -26,6 +27,9 @@
 	"crypto/sha1"
 )
 
+// Tests can override this by setting $TESTGO_TOOLCHAIN_VERSION.
+var ToolchainVersion = runtime.Version()
+
 // The 'path' used for GOROOT_FINAL when -trimpath is specified
 const trimPathGoRootFinal string = "$GOROOT"
 
@@ -81,22 +85,10 @@
 	if p.Module != nil {
 		v := p.Module.GoVersion
 		if v == "" {
-			// We started adding a 'go' directive to the go.mod file unconditionally
-			// as of Go 1.12, so any module that still lacks such a directive must
-			// either have been authored before then, or have a hand-edited go.mod
-			// file that hasn't been updated by cmd/go since that edit.
-			//
-			// Unfortunately, through at least Go 1.16 we didn't add versions to
-			// vendor/modules.txt. So this could also be a vendored 1.16 dependency.
-			//
-			// Fortunately, there were no breaking changes to the language between Go
-			// 1.11 and 1.16, so if we assume Go 1.16 semantics we will not introduce
-			// any spurious errors — we will only mask errors, and not particularly
-			// important ones at that.
-			v = "1.16"
+			v = gover.DefaultGoModVersion
 		}
 		if allowedVersion(v) {
-			defaultGcFlags = append(defaultGcFlags, "-lang=go"+v)
+			defaultGcFlags = append(defaultGcFlags, "-lang=go"+gover.Lang(v))
 		}
 	}
 	if p.Standard {
@@ -138,14 +130,14 @@
 	if p.Internal.OmitDebug || cfg.Goos == "plan9" || cfg.Goarch == "wasm" {
 		defaultGcFlags = append(defaultGcFlags, "-dwarf=false")
 	}
-	if strings.HasPrefix(RuntimeVersion, "go1") && !strings.Contains(os.Args[0], "go_bootstrap") {
-		defaultGcFlags = append(defaultGcFlags, "-goversion", RuntimeVersion)
+	if strings.HasPrefix(ToolchainVersion, "go1") && !strings.Contains(os.Args[0], "go_bootstrap") {
+		defaultGcFlags = append(defaultGcFlags, "-goversion", ToolchainVersion)
 	}
 	if p.Internal.CoverageCfg != "" {
 		defaultGcFlags = append(defaultGcFlags, "-coveragecfg="+p.Internal.CoverageCfg)
 	}
-	if cfg.BuildPGOFile != "" {
-		defaultGcFlags = append(defaultGcFlags, "-pgoprofile="+cfg.BuildPGOFile)
+	if p.Internal.PGOProfile != "" {
+		defaultGcFlags = append(defaultGcFlags, "-pgoprofile="+p.Internal.PGOProfile)
 	}
 	if symabis != "" {
 		defaultGcFlags = append(defaultGcFlags, "-symabis", symabis)
@@ -169,7 +161,7 @@
 	}
 	// Add -c=N to use concurrent backend compilation, if possible.
 	if c := gcBackendConcurrency(gcflags); c > 1 {
-		gcflags = append(gcflags, fmt.Sprintf("-c=%d", c))
+		defaultGcFlags = append(defaultGcFlags, fmt.Sprintf("-c=%d", c))
 	}
 
 	args := []any{cfg.BuildToolexec, base.Tool("compile"), "-o", ofile, "-trimpath", a.trimpath(), defaultGcFlags, gcflags}
@@ -643,11 +635,16 @@
 		// linker's build id, which will cause our build id to not
 		// match the next time the tool is built.
 		// Rely on the external build id instead.
-		if !platform.MustLinkExternal(cfg.Goos, cfg.Goarch) {
+		if !platform.MustLinkExternal(cfg.Goos, cfg.Goarch, false) {
 			ldflags = append(ldflags, "-X=cmd/internal/objabi.buildID="+root.buildID)
 		}
 	}
 
+	// Store default GODEBUG in binaries.
+	if root.Package.DefaultGODEBUG != "" {
+		ldflags = append(ldflags, "-X=runtime.godebugDefault="+root.Package.DefaultGODEBUG)
+	}
+
 	// 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.
@@ -678,8 +675,10 @@
 	// just the final path element.
 	// On Windows, DLL file name is recorded in PE file
 	// export section, so do like on OS X.
+	// On Linux, for a shared object, at least with the Gold linker,
+	// the output file path is recorded in the .gnu.version_d section.
 	dir := "."
-	if (cfg.Goos == "darwin" || cfg.Goos == "windows") && cfg.BuildBuildmode == "c-shared" {
+	if cfg.BuildBuildmode == "c-shared" || cfg.BuildBuildmode == "plugin" {
 		dir, out = filepath.Split(out)
 	}
 
diff --git a/src/cmd/go/internal/work/gccgo.go b/src/cmd/go/internal/work/gccgo.go
index 08a4c2d..a048b7f 100644
--- a/src/cmd/go/internal/work/gccgo.go
+++ b/src/cmd/go/internal/work/gccgo.go
@@ -280,14 +280,12 @@
 		const ldflagsPrefix = "_CGO_LDFLAGS="
 		for _, line := range strings.Split(string(flags), "\n") {
 			if strings.HasPrefix(line, ldflagsPrefix) {
-				newFlags := strings.Fields(line[len(ldflagsPrefix):])
-				for _, flag := range newFlags {
-					// Every _cgo_flags file has -g and -O2 in _CGO_LDFLAGS
-					// but they don't mean anything to the linker so filter
-					// them out.
-					if flag != "-g" && !strings.HasPrefix(flag, "-O") {
-						cgoldflags = append(cgoldflags, flag)
-					}
+				flag := line[len(ldflagsPrefix):]
+				// Every _cgo_flags file has -g and -O2 in _CGO_LDFLAGS
+				// but they don't mean anything to the linker so filter
+				// them out.
+				if flag != "-g" && !strings.HasPrefix(flag, "-O") {
+					cgoldflags = append(cgoldflags, flag)
 				}
 			}
 		}
diff --git a/src/cmd/go/internal/work/init.go b/src/cmd/go/internal/work/init.go
index cd99a33..29116cb 100644
--- a/src/cmd/go/internal/work/init.go
+++ b/src/cmd/go/internal/work/init.go
@@ -37,7 +37,7 @@
 	instrumentInit()
 	buildModeInit()
 	if err := fsys.Init(base.Cwd()); err != nil {
-		base.Fatalf("go: %v", err)
+		base.Fatal(err)
 	}
 
 	// Make sure -pkgdir is absolute, because we run commands
@@ -86,7 +86,7 @@
 	}
 }
 
-// fuzzInstrumentFlags returns compiler flags that enable fuzzing instrumation
+// fuzzInstrumentFlags returns compiler flags that enable fuzzing instrumentation
 // on supported platforms.
 //
 // On unsupported platforms, fuzzInstrumentFlags returns nil, meaning no
@@ -229,30 +229,12 @@
 		}
 		ldBuildmode = "c-shared"
 	case "default":
-		switch cfg.Goos {
-		case "android":
-			codegenArg = "-shared"
+		ldBuildmode = "exe"
+		if platform.DefaultPIE(cfg.Goos, cfg.Goarch, cfg.BuildRace) {
 			ldBuildmode = "pie"
-		case "windows":
-			if cfg.BuildRace {
-				ldBuildmode = "exe"
-			} else {
-				ldBuildmode = "pie"
-			}
-		case "ios":
-			codegenArg = "-shared"
-			ldBuildmode = "pie"
-		case "darwin":
-			switch cfg.Goarch {
-			case "arm64":
+			if cfg.Goos != "windows" && !gccgo {
 				codegenArg = "-shared"
 			}
-			fallthrough
-		default:
-			ldBuildmode = "exe"
-		}
-		if gccgo {
-			codegenArg = ""
 		}
 	case "exe":
 		pkgsFilter = pkgsMain
@@ -301,7 +283,7 @@
 		base.Fatalf("buildmode=%s not supported", cfg.BuildBuildmode)
 	}
 
-	if !platform.BuildModeSupported(cfg.BuildToolchainName, cfg.BuildBuildmode, cfg.Goos, cfg.Goarch) {
+	if cfg.BuildBuildmode != "default" && !platform.BuildModeSupported(cfg.BuildToolchainName, cfg.BuildBuildmode, cfg.Goos, cfg.Goarch) {
 		base.Fatalf("-buildmode=%s not supported on %s/%s\n", cfg.BuildBuildmode, cfg.Goos, cfg.Goarch)
 	}
 
@@ -414,7 +396,7 @@
 }
 
 // compilerRequiredAsanVersion is a copy of the function defined in
-// misc/cgo/testsanitizers/cc_test.go
+// cmd/cgo/internal/testsanitizers/cc_test.go
 // compilerRequiredAsanVersion reports whether the compiler is the version
 // required by Asan.
 func compilerRequiredAsanVersion() error {
diff --git a/src/cmd/go/internal/work/security.go b/src/cmd/go/internal/work/security.go
index 0bf8763..270a34e 100644
--- a/src/cmd/go/internal/work/security.go
+++ b/src/cmd/go/internal/work/security.go
@@ -180,10 +180,10 @@
 	re(`-Wl,-berok`),
 	re(`-Wl,-Bstatic`),
 	re(`-Wl,-Bsymbolic-functions`),
-	re(`-Wl,-O([^@,\-][^,]*)?`),
+	re(`-Wl,-O[0-9]+`),
 	re(`-Wl,-d[ny]`),
 	re(`-Wl,--disable-new-dtags`),
-	re(`-Wl,-e[=,][a-zA-Z0-9]*`),
+	re(`-Wl,-e[=,][a-zA-Z0-9]+`),
 	re(`-Wl,--enable-new-dtags`),
 	re(`-Wl,--end-group`),
 	re(`-Wl,--(no-)?export-dynamic`),
@@ -192,7 +192,7 @@
 	re(`-Wl,--hash-style=(sysv|gnu|both)`),
 	re(`-Wl,-headerpad_max_install_names`),
 	re(`-Wl,--no-undefined`),
-	re(`-Wl,-R([^@\-][^,@]*$)`),
+	re(`-Wl,-R,?([^@\-,][^,@]*$)`),
 	re(`-Wl,--just-symbols[=,]([^,@\-][^,@]+)`),
 	re(`-Wl,-rpath(-link)?[=,]([^,@\-][^,]+)`),
 	re(`-Wl,-s`),
@@ -230,32 +230,55 @@
 }
 
 func checkCompilerFlags(name, source string, list []string) error {
-	return checkFlags(name, source, list, validCompilerFlags, validCompilerFlagsWithNextArg)
+	checkOverrides := true
+	return checkFlags(name, source, list, validCompilerFlags, validCompilerFlagsWithNextArg, checkOverrides)
 }
 
 func checkLinkerFlags(name, source string, list []string) error {
-	return checkFlags(name, source, list, validLinkerFlags, validLinkerFlagsWithNextArg)
+	checkOverrides := true
+	return checkFlags(name, source, list, validLinkerFlags, validLinkerFlagsWithNextArg, checkOverrides)
 }
 
-func checkFlags(name, source string, list []string, valid []*lazyregexp.Regexp, validNext []string) error {
+// checkCompilerFlagsForInternalLink returns an error if 'list'
+// contains a flag or flags that may not be fully supported by
+// internal linking (meaning that we should punt the link to the
+// external linker).
+func checkCompilerFlagsForInternalLink(name, source string, list []string) error {
+	checkOverrides := false
+	if err := checkFlags(name, source, list, validCompilerFlags, validCompilerFlagsWithNextArg, checkOverrides); err != nil {
+		return err
+	}
+	// Currently the only flag on the allow list that causes problems
+	// for the linker is "-flto"; check for it manually here.
+	for _, fl := range list {
+		if strings.HasPrefix(fl, "-flto") {
+			return fmt.Errorf("flag %q triggers external linking", fl)
+		}
+	}
+	return nil
+}
+
+func checkFlags(name, source string, list []string, valid []*lazyregexp.Regexp, validNext []string, checkOverrides bool) error {
 	// Let users override rules with $CGO_CFLAGS_ALLOW, $CGO_CFLAGS_DISALLOW, etc.
 	var (
 		allow    *regexp.Regexp
 		disallow *regexp.Regexp
 	)
-	if env := cfg.Getenv("CGO_" + name + "_ALLOW"); env != "" {
-		r, err := regexp.Compile(env)
-		if err != nil {
-			return fmt.Errorf("parsing $CGO_%s_ALLOW: %v", name, err)
+	if checkOverrides {
+		if env := cfg.Getenv("CGO_" + name + "_ALLOW"); env != "" {
+			r, err := regexp.Compile(env)
+			if err != nil {
+				return fmt.Errorf("parsing $CGO_%s_ALLOW: %v", name, err)
+			}
+			allow = r
 		}
-		allow = r
-	}
-	if env := cfg.Getenv("CGO_" + name + "_DISALLOW"); env != "" {
-		r, err := regexp.Compile(env)
-		if err != nil {
-			return fmt.Errorf("parsing $CGO_%s_DISALLOW: %v", name, err)
+		if env := cfg.Getenv("CGO_" + name + "_DISALLOW"); env != "" {
+			r, err := regexp.Compile(env)
+			if err != nil {
+				return fmt.Errorf("parsing $CGO_%s_DISALLOW: %v", name, err)
+			}
+			disallow = r
 		}
-		disallow = r
 	}
 
 Args:
diff --git a/src/cmd/go/internal/work/security_test.go b/src/cmd/go/internal/work/security_test.go
index d2aeb54..c05ba7b 100644
--- a/src/cmd/go/internal/work/security_test.go
+++ b/src/cmd/go/internal/work/security_test.go
@@ -6,6 +6,7 @@
 
 import (
 	"os"
+	"strings"
 	"testing"
 )
 
@@ -28,6 +29,7 @@
 	{"-Wp,-Ufoo"},
 	{"-Wp,-Dfoo1"},
 	{"-Wp,-Ufoo1"},
+	{"-flto"},
 	{"-fobjc-arc"},
 	{"-fno-objc-arc"},
 	{"-fomit-frame-pointer"},
@@ -228,6 +230,11 @@
 	{"-Wl,-R,@foo"},
 	{"-Wl,--just-symbols,@foo"},
 	{"../x.o"},
+	{"-Wl,-R,"},
+	{"-Wl,-O"},
+	{"-Wl,-e="},
+	{"-Wl,-e,"},
+	{"-Wl,-R,-flag"},
 }
 
 func TestCheckLinkerFlags(t *testing.T) {
@@ -278,3 +285,34 @@
 		t.Fatalf("missing error for -fplugin=lint.so: %v", err)
 	}
 }
+
+func TestCheckCompilerFlagsForInternalLink(t *testing.T) {
+	// Any "bad" compiler flag should trigger external linking.
+	for _, f := range badCompilerFlags {
+		if err := checkCompilerFlagsForInternalLink("test", "test", f); err == nil {
+			t.Errorf("missing error for %q", f)
+		}
+	}
+
+	// All "good" compiler flags should not trigger external linking,
+	// except for anything that begins with "-flto".
+	for _, f := range goodCompilerFlags {
+		foundLTO := false
+		for _, s := range f {
+			if strings.Contains(s, "-flto") {
+				foundLTO = true
+			}
+		}
+		if err := checkCompilerFlagsForInternalLink("test", "test", f); err != nil {
+			// expect error for -flto
+			if !foundLTO {
+				t.Errorf("unexpected error for %q: %v", f, err)
+			}
+		} else {
+			// expect no error for everything else
+			if foundLTO {
+				t.Errorf("missing error for %q: %v", f, err)
+			}
+		}
+	}
+}
diff --git a/src/cmd/go/internal/work/shell_test.go b/src/cmd/go/internal/work/shell_test.go
new file mode 100644
index 0000000..24bef4e
--- /dev/null
+++ b/src/cmd/go/internal/work/shell_test.go
@@ -0,0 +1,139 @@
+// Copyright 2023 The Go 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:build unix
+
+package work
+
+import (
+	"bytes"
+	"internal/testenv"
+	"strings"
+	"testing"
+	"unicode"
+)
+
+func FuzzSplitPkgConfigOutput(f *testing.F) {
+	testenv.MustHaveExecPath(f, "/bin/sh")
+
+	f.Add([]byte(`$FOO`))
+	f.Add([]byte(`\$FOO`))
+	f.Add([]byte(`${FOO}`))
+	f.Add([]byte(`\${FOO}`))
+	f.Add([]byte(`$(/bin/false)`))
+	f.Add([]byte(`\$(/bin/false)`))
+	f.Add([]byte(`$((0))`))
+	f.Add([]byte(`\$((0))`))
+	f.Add([]byte(`unescaped space`))
+	f.Add([]byte(`escaped\ space`))
+	f.Add([]byte(`"unterminated quote`))
+	f.Add([]byte(`'unterminated quote`))
+	f.Add([]byte(`unterminated escape\`))
+	f.Add([]byte(`"quote with unterminated escape\`))
+	f.Add([]byte(`'quoted "double quotes"'`))
+	f.Add([]byte(`"quoted 'single quotes'"`))
+	f.Add([]byte(`"\$0"`))
+	f.Add([]byte(`"\$\0"`))
+	f.Add([]byte(`"\$"`))
+	f.Add([]byte(`"\$ "`))
+
+	// Example positive inputs from TestSplitPkgConfigOutput.
+	// Some bare newlines have been removed so that the inputs
+	// are valid in the shell script we use for comparison.
+	f.Add([]byte(`-r:foo -L/usr/white\ space/lib -lfoo\ bar -lbar\ baz`))
+	f.Add([]byte(`-lextra\ fun\ arg\\`))
+	f.Add([]byte("\textra     whitespace\r"))
+	f.Add([]byte("     \r      "))
+	f.Add([]byte(`"-r:foo" "-L/usr/white space/lib" "-lfoo bar" "-lbar baz"`))
+	f.Add([]byte(`"-lextra fun arg\\"`))
+	f.Add([]byte(`"     \r\n\      "`))
+	f.Add([]byte(`""`))
+	f.Add([]byte(``))
+	f.Add([]byte(`"\\"`))
+	f.Add([]byte(`"\x"`))
+	f.Add([]byte(`"\\x"`))
+	f.Add([]byte(`'\\'`))
+	f.Add([]byte(`'\x'`))
+	f.Add([]byte(`"\\x"`))
+	f.Add([]byte("\\\n"))
+	f.Add([]byte(`-fPIC -I/test/include/foo -DQUOTED='"/test/share/doc"'`))
+	f.Add([]byte(`-fPIC -I/test/include/foo -DQUOTED="/test/share/doc"`))
+	f.Add([]byte(`-fPIC -I/test/include/foo -DQUOTED=\"/test/share/doc\"`))
+	f.Add([]byte(`-fPIC -I/test/include/foo -DQUOTED='/test/share/doc'`))
+	f.Add([]byte(`-DQUOTED='/te\st/share/d\oc'`))
+	f.Add([]byte(`-Dhello=10 -Dworld=+32 -DDEFINED_FROM_PKG_CONFIG=hello\ world`))
+	f.Add([]byte(`"broken\"" \\\a "a"`))
+
+	// Example negative inputs from TestSplitPkgConfigOutput.
+	f.Add([]byte(`"     \r\n      `))
+	f.Add([]byte(`"-r:foo" "-L/usr/white space/lib "-lfoo bar" "-lbar baz"`))
+	f.Add([]byte(`"-lextra fun arg\\`))
+	f.Add([]byte(`broken flag\`))
+	f.Add([]byte(`extra broken flag \`))
+	f.Add([]byte(`\`))
+	f.Add([]byte(`"broken\"" "extra" \`))
+
+	f.Fuzz(func(t *testing.T, b []byte) {
+		t.Parallel()
+
+		if bytes.ContainsAny(b, "*?[#~%\x00{}!") {
+			t.Skipf("skipping %#q: contains a sometimes-quoted character", b)
+		}
+		// splitPkgConfigOutput itself rejects inputs that contain unquoted
+		// shell operator characters. (Quoted shell characters are fine.)
+
+		for _, c := range b {
+			if c > unicode.MaxASCII {
+				t.Skipf("skipping %#q: contains a non-ASCII character %q", b, c)
+			}
+			if !unicode.IsGraphic(rune(c)) && !unicode.IsSpace(rune(c)) {
+				t.Skipf("skipping %#q: contains non-graphic character %q", b, c)
+			}
+		}
+
+		args, err := splitPkgConfigOutput(b)
+		if err != nil {
+			// We haven't checked that the shell would actually reject this input too,
+			// but if splitPkgConfigOutput rejected it it's probably too dangerous to
+			// run in the script.
+			t.Logf("%#q: %v", b, err)
+			return
+		}
+		t.Logf("splitPkgConfigOutput(%#q) = %#q", b, args)
+		if len(args) == 0 {
+			t.Skipf("skipping %#q: contains no arguments", b)
+		}
+
+		var buf strings.Builder
+		for _, arg := range args {
+			buf.WriteString(arg)
+			buf.WriteString("\n")
+		}
+		wantOut := buf.String()
+
+		if strings.Count(wantOut, "\n") != len(args)+bytes.Count(b, []byte("\n")) {
+			// One of the newlines in b was treated as a delimiter and not part of an
+			// argument. Our bash test script would interpret that as a syntax error.
+			t.Skipf("skipping %#q: contains a bare newline", b)
+		}
+
+		// We use the printf shell command to echo the arguments because, per
+		// https://pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html#tag_20_37_16:
+		// “It is not possible to use echo portably across all POSIX systems unless
+		// both -n (as the first argument) and escape sequences are omitted.”
+		cmd := testenv.Command(t, "/bin/sh", "-c", "printf '%s\n' "+string(b))
+		cmd.Env = append(cmd.Environ(), "LC_ALL=POSIX", "POSIXLY_CORRECT=1")
+		cmd.Stderr = new(strings.Builder)
+		out, err := cmd.Output()
+		if err != nil {
+			t.Fatalf("%#q: %v\n%s", cmd.Args, err, cmd.Stderr)
+		}
+
+		if string(out) != wantOut {
+			t.Logf("%#q:\n%#q", cmd.Args, out)
+			t.Logf("want:\n%#q", wantOut)
+			t.Errorf("parsed args do not match")
+		}
+	})
+}
diff --git a/src/cmd/go/internal/workcmd/edit.go b/src/cmd/go/internal/workcmd/edit.go
index f5e3304..8d975b0 100644
--- a/src/cmd/go/internal/workcmd/edit.go
+++ b/src/cmd/go/internal/workcmd/edit.go
@@ -8,6 +8,7 @@
 
 import (
 	"cmd/go/internal/base"
+	"cmd/go/internal/gover"
 	"cmd/go/internal/modload"
 	"context"
 	"encoding/json"
@@ -57,6 +58,8 @@
 
 The -go=version flag sets the expected Go language version.
 
+The -toolchain=name flag sets the Go toolchain to use.
+
 The -print flag prints the final go.work in its text format instead of
 writing it back to go.mod.
 
@@ -64,9 +67,10 @@
 writing it back to go.mod. The JSON output corresponds to these Go types:
 
 	type GoWork struct {
-		Go      string
-		Use     []Use
-		Replace []Replace
+		Go        string
+		Toolchain string
+		Use       []Use
+		Replace   []Replace
 	}
 
 	type Use struct {
@@ -90,11 +94,12 @@
 }
 
 var (
-	editFmt   = cmdEdit.Flag.Bool("fmt", false, "")
-	editGo    = cmdEdit.Flag.String("go", "", "")
-	editJSON  = cmdEdit.Flag.Bool("json", false, "")
-	editPrint = cmdEdit.Flag.Bool("print", false, "")
-	workedits []func(file *modfile.WorkFile) // edits specified in flags
+	editFmt       = cmdEdit.Flag.Bool("fmt", false, "")
+	editGo        = cmdEdit.Flag.String("go", "", "")
+	editToolchain = cmdEdit.Flag.String("toolchain", "", "")
+	editJSON      = cmdEdit.Flag.Bool("json", false, "")
+	editPrint     = cmdEdit.Flag.Bool("print", false, "")
+	workedits     []func(file *modfile.WorkFile) // edits specified in flags
 )
 
 type flagFunc func(string)
@@ -127,23 +132,27 @@
 		modload.InitWorkfile()
 		gowork = modload.WorkFilePath()
 	}
-
-	if *editGo != "" {
-		if !modfile.GoVersionRE.MatchString(*editGo) {
-			base.Fatalf(`go mod: invalid -go option; expecting something like "-go %s"`, modload.LatestGoVersion())
-		}
-	}
-
 	if gowork == "" {
 		base.Fatalf("go: no go.work file found\n\t(run 'go work init' first or specify path using GOWORK environment variable)")
 	}
 
-	anyFlags :=
-		*editGo != "" ||
-			*editJSON ||
-			*editPrint ||
-			*editFmt ||
-			len(workedits) > 0
+	if *editGo != "" && *editGo != "none" {
+		if !modfile.GoVersionRE.MatchString(*editGo) {
+			base.Fatalf(`go work: invalid -go option; expecting something like "-go %s"`, gover.Local())
+		}
+	}
+	if *editToolchain != "" && *editToolchain != "none" {
+		if !modfile.ToolchainRE.MatchString(*editToolchain) {
+			base.Fatalf(`go work: invalid -toolchain option; expecting something like "-toolchain go%s"`, gover.Local())
+		}
+	}
+
+	anyFlags := *editGo != "" ||
+		*editToolchain != "" ||
+		*editJSON ||
+		*editPrint ||
+		*editFmt ||
+		len(workedits) > 0
 
 	if !anyFlags {
 		base.Fatalf("go: no flags specified (see 'go help work edit').")
@@ -154,11 +163,20 @@
 		base.Fatalf("go: errors parsing %s:\n%s", base.ShortPath(gowork), err)
 	}
 
-	if *editGo != "" {
+	if *editGo == "none" {
+		workFile.DropGoStmt()
+	} else if *editGo != "" {
 		if err := workFile.AddGoStmt(*editGo); err != nil {
 			base.Fatalf("go: internal error: %v", err)
 		}
 	}
+	if *editToolchain == "none" {
+		workFile.DropToolchainStmt()
+	} else if *editToolchain != "" {
+		if err := workFile.AddToolchainStmt(*editToolchain); err != nil {
+			base.Fatalf("go: internal error: %v", err)
+		}
+	}
 
 	if len(workedits) > 0 {
 		for _, edit := range workedits {
@@ -166,11 +184,15 @@
 		}
 	}
 
-	modload.UpdateWorkFile(workFile)
-
 	workFile.SortBlocks()
 	workFile.Cleanup() // clean file after edits
 
+	// Note: No call to modload.UpdateWorkFile here.
+	// Edit's job is only to make the edits on the command line,
+	// not to apply the kinds of semantic changes that
+	// UpdateWorkFile does (or would eventually do, if we
+	// decide to add the module comments in go.work).
+
 	if *editJSON {
 		editPrintJSON(workFile)
 		return
diff --git a/src/cmd/go/internal/workcmd/init.go b/src/cmd/go/internal/workcmd/init.go
index 6fb033e..02240b8 100644
--- a/src/cmd/go/internal/workcmd/init.go
+++ b/src/cmd/go/internal/workcmd/init.go
@@ -7,10 +7,15 @@
 package workcmd
 
 import (
-	"cmd/go/internal/base"
-	"cmd/go/internal/modload"
 	"context"
 	"path/filepath"
+
+	"cmd/go/internal/base"
+	"cmd/go/internal/fsys"
+	"cmd/go/internal/gover"
+	"cmd/go/internal/modload"
+
+	"golang.org/x/mod/modfile"
 )
 
 var cmdInit = &base.Command{
@@ -43,10 +48,19 @@
 
 	modload.ForceUseModules = true
 
-	workFile := modload.WorkFilePath()
-	if workFile == "" {
-		workFile = filepath.Join(base.Cwd(), "go.work")
+	gowork := modload.WorkFilePath()
+	if gowork == "" {
+		gowork = filepath.Join(base.Cwd(), "go.work")
 	}
 
-	modload.CreateWorkFile(ctx, workFile, args)
+	if _, err := fsys.Stat(gowork); err == nil {
+		base.Fatalf("go: %s already exists", gowork)
+	}
+
+	goV := gover.Local() // Use current Go version by default
+	wf := new(modfile.WorkFile)
+	wf.Syntax = new(modfile.FileSyntax)
+	wf.AddGoStmt(goV)
+	workUse(ctx, gowork, wf, args)
+	modload.WriteWorkFile(gowork, wf)
 }
diff --git a/src/cmd/go/internal/workcmd/sync.go b/src/cmd/go/internal/workcmd/sync.go
index 9f99627..719cf76 100644
--- a/src/cmd/go/internal/workcmd/sync.go
+++ b/src/cmd/go/internal/workcmd/sync.go
@@ -8,8 +8,10 @@
 
 import (
 	"cmd/go/internal/base"
+	"cmd/go/internal/gover"
 	"cmd/go/internal/imports"
 	"cmd/go/internal/modload"
+	"cmd/go/internal/toolchain"
 	"context"
 
 	"golang.org/x/mod/module"
@@ -52,8 +54,10 @@
 		base.Fatalf("go: no go.work file found\n\t(run 'go work init' first or specify path using GOWORK environment variable)")
 	}
 
-	workGraph := modload.LoadModGraph(ctx, "")
-	_ = workGraph
+	_, err := modload.LoadModGraph(ctx, "")
+	if err != nil {
+		toolchain.SwitchOrFatal(ctx, err)
+	}
 	mustSelectFor := map[module.Version][]module.Version{}
 
 	mms := modload.MainModules
@@ -83,12 +87,13 @@
 				inMustSelect[r] = true
 			}
 		}
-		module.Sort(mustSelect) // ensure determinism
+		gover.ModSort(mustSelect) // ensure determinism
 		mustSelectFor[m] = mustSelect
 	}
 
 	workFilePath := modload.WorkFilePath() // save go.work path because EnterModule clobbers it.
 
+	var goV string
 	for _, m := range mms.Versions() {
 		if mms.ModRoot(m) == "" && m.Path == "command-line-arguments" {
 			// This is not a real module.
@@ -103,33 +108,39 @@
 
 		// Edit the build list in the same way that 'go get' would if we
 		// requested the relevant module versions explicitly.
+		// TODO(#57001): Do we need a toolchain.SwitchOrFatal here,
+		// and do we need to pass a toolchain.Switcher in LoadPackages?
+		// If so, think about saving the WriteGoMods for after the loop,
+		// so we don't write some go.mods with the "before" toolchain
+		// and others with the "after" toolchain. If nothing else, that
+		// discrepancy could show up in auto-recorded toolchain lines.
 		changed, err := modload.EditBuildList(ctx, nil, mustSelectFor[m])
 		if err != nil {
-			base.Errorf("go: %v", err)
-		}
-		if !changed {
 			continue
 		}
-
-		modload.LoadPackages(ctx, modload.PackageOpts{
-			Tags:                     imports.AnyTags(),
-			Tidy:                     true,
-			VendorModulesInGOROOTSrc: true,
-			ResolveMissingImports:    false,
-			LoadTests:                true,
-			AllowErrors:              true,
-			SilenceMissingStdImports: true,
-			SilencePackageErrors:     true,
-		}, "all")
-		modload.WriteGoMod(ctx)
+		if changed {
+			modload.LoadPackages(ctx, modload.PackageOpts{
+				Tags:                     imports.AnyTags(),
+				Tidy:                     true,
+				VendorModulesInGOROOTSrc: true,
+				ResolveMissingImports:    false,
+				LoadTests:                true,
+				AllowErrors:              true,
+				SilenceMissingStdImports: true,
+				SilencePackageErrors:     true,
+			}, "all")
+			modload.WriteGoMod(ctx, modload.WriteOpts{})
+		}
+		goV = gover.Max(goV, modload.MainModules.GoVersion())
 	}
 
 	wf, err := modload.ReadWorkFile(workFilePath)
 	if err != nil {
-		base.Fatalf("go: %v", err)
+		base.Fatal(err)
 	}
+	modload.UpdateWorkGoVersion(wf, goV)
 	modload.UpdateWorkFile(wf)
 	if err := modload.WriteWorkFile(workFilePath, wf); err != nil {
-		base.Fatalf("go: %v", err)
+		base.Fatal(err)
 	}
 }
diff --git a/src/cmd/go/internal/workcmd/use.go b/src/cmd/go/internal/workcmd/use.go
index be90989..5547711 100644
--- a/src/cmd/go/internal/workcmd/use.go
+++ b/src/cmd/go/internal/workcmd/use.go
@@ -7,32 +7,46 @@
 package workcmd
 
 import (
-	"cmd/go/internal/base"
-	"cmd/go/internal/fsys"
-	"cmd/go/internal/modload"
-	"cmd/go/internal/str"
 	"context"
 	"fmt"
 	"io/fs"
 	"os"
 	"path/filepath"
+
+	"cmd/go/internal/base"
+	"cmd/go/internal/fsys"
+	"cmd/go/internal/gover"
+	"cmd/go/internal/modload"
+	"cmd/go/internal/str"
+	"cmd/go/internal/toolchain"
+
+	"golang.org/x/mod/modfile"
 )
 
 var cmdUse = &base.Command{
-	UsageLine: "go work use [-r] moddirs",
+	UsageLine: "go work use [-r] [moddirs]",
 	Short:     "add modules to workspace file",
 	Long: `Use provides a command-line interface for adding
 directories, optionally recursively, to a go.work file.
 
 A use directive will be added to the go.work file for each argument
-directory listed on the command line go.work file, if it exists on disk,
-or removed from the go.work file if it does not exist on disk.
+directory listed on the command line go.work file, if it exists,
+or removed from the go.work file if it does not exist.
+Use fails if any remaining use directives refer to modules that
+do not exist.
+
+Use updates the go line in go.work to specify a version at least as
+new as all the go lines in the used modules, both preexisting ones
+and newly added ones. With no arguments, this update is the only
+thing that go work use does.
 
 The -r flag searches recursively for modules in the argument
 directories, and the use command operates as if each of the directories
 were specified as arguments: namely, use directives will be added for
 directories that exist, and removed for directories that do not exist.
 
+
+
 See the workspaces reference at https://go.dev/ref/mod#workspaces
 for more information.
 `,
@@ -49,22 +63,24 @@
 
 func runUse(ctx context.Context, cmd *base.Command, args []string) {
 	modload.ForceUseModules = true
-
-	var gowork string
 	modload.InitWorkfile()
-	gowork = modload.WorkFilePath()
-
+	gowork := modload.WorkFilePath()
 	if gowork == "" {
 		base.Fatalf("go: no go.work file found\n\t(run 'go work init' first or specify path using GOWORK environment variable)")
 	}
-	workFile, err := modload.ReadWorkFile(gowork)
+	wf, err := modload.ReadWorkFile(gowork)
 	if err != nil {
-		base.Fatalf("go: %v", err)
+		base.Fatal(err)
 	}
-	workDir := filepath.Dir(gowork) // Absolute, since gowork itself is absolute.
+	workUse(ctx, gowork, wf, args)
+	modload.WriteWorkFile(gowork, wf)
+}
+
+func workUse(ctx context.Context, gowork string, wf *modfile.WorkFile, args []string) {
+	workDir := filepath.Dir(gowork) // absolute, since gowork itself is absolute
 
 	haveDirs := make(map[string][]string) // absolute → original(s)
-	for _, use := range workFile.Use {
+	for _, use := range wf.Use {
 		var abs string
 		if filepath.IsAbs(use.Path) {
 			abs = filepath.Clean(use.Path)
@@ -79,24 +95,28 @@
 	// all entries for the absolute path should be removed.
 	keepDirs := make(map[string]string)
 
+	var sw toolchain.Switcher
+
 	// lookDir updates the entry in keepDirs for the directory dir,
 	// which is either absolute or relative to the current working directory
 	// (not necessarily the directory containing the workfile).
 	lookDir := func(dir string) {
 		absDir, dir := pathRel(workDir, dir)
 
-		fi, err := fsys.Stat(filepath.Join(absDir, "go.mod"))
+		file := base.ShortPath(filepath.Join(absDir, "go.mod"))
+		fi, err := fsys.Stat(file)
 		if err != nil {
 			if os.IsNotExist(err) {
 				keepDirs[absDir] = ""
 			} else {
-				base.Errorf("go: %v", err)
+				sw.Error(err)
 			}
 			return
 		}
 
 		if !fi.Mode().IsRegular() {
-			base.Errorf("go: %v is not regular", filepath.Join(dir, "go.mod"))
+			sw.Error(fmt.Errorf("%v is not a regular file", file))
+			return
 		}
 
 		if dup := keepDirs[absDir]; dup != "" && dup != dir {
@@ -105,23 +125,19 @@
 		keepDirs[absDir] = dir
 	}
 
-	if len(args) == 0 {
-		base.Fatalf("go: 'go work use' requires one or more directory arguments")
-	}
 	for _, useDir := range args {
 		absArg, _ := pathRel(workDir, useDir)
 
-		info, err := fsys.Stat(absArg)
+		info, err := fsys.Stat(base.ShortPath(absArg))
 		if err != nil {
 			// Errors raised from os.Stat are formatted to be more user-friendly.
 			if os.IsNotExist(err) {
-				base.Errorf("go: directory %v does not exist", absArg)
-			} else {
-				base.Errorf("go: %v", err)
+				err = fmt.Errorf("directory %v does not exist", base.ShortPath(absArg))
 			}
+			sw.Error(err)
 			continue
 		} else if !info.IsDir() {
-			base.Errorf("go: %s is not a directory", absArg)
+			sw.Error(fmt.Errorf("%s is not a directory", base.ShortPath(absArg)))
 			continue
 		}
 
@@ -131,7 +147,10 @@
 		}
 
 		// Add or remove entries for any subdirectories that still exist.
-		fsys.Walk(useDir, func(path string, info fs.FileInfo, err error) error {
+		// If the root itself is a symlink to a directory,
+		// we want to follow it (see https://go.dev/issue/50807).
+		// Add a trailing separator to force that to happen.
+		fsys.Walk(str.WithFilePathSeparator(useDir), func(path string, info fs.FileInfo, err error) error {
 			if err != nil {
 				return err
 			}
@@ -139,7 +158,7 @@
 			if !info.IsDir() {
 				if info.Mode()&fs.ModeSymlink != 0 {
 					if target, err := fsys.Stat(path); err == nil && target.IsDir() {
-						fmt.Fprintf(os.Stderr, "warning: ignoring symlink %s\n", path)
+						fmt.Fprintf(os.Stderr, "warning: ignoring symlink %s\n", base.ShortPath(path))
 					}
 				}
 				return nil
@@ -159,34 +178,56 @@
 		}
 	}
 
-	base.ExitIfErrors()
-
+	// Update the work file.
 	for absDir, keepDir := range keepDirs {
 		nKept := 0
 		for _, dir := range haveDirs[absDir] {
 			if dir == keepDir { // (note that dir is always non-empty)
 				nKept++
 			} else {
-				workFile.DropUse(dir)
+				wf.DropUse(dir)
 			}
 		}
 		if keepDir != "" && nKept != 1 {
 			// If we kept more than one copy, delete them all.
 			// We'll recreate a unique copy with AddUse.
 			if nKept > 1 {
-				workFile.DropUse(keepDir)
+				wf.DropUse(keepDir)
 			}
-			workFile.AddUse(keepDir, "")
+			wf.AddUse(keepDir, "")
 		}
 	}
-	modload.UpdateWorkFile(workFile)
-	modload.WriteWorkFile(gowork, workFile)
+
+	// Read the Go versions from all the use entries, old and new (but not dropped).
+	goV := gover.FromGoWork(wf)
+	for _, use := range wf.Use {
+		if use.Path == "" { // deleted
+			continue
+		}
+		var abs string
+		if filepath.IsAbs(use.Path) {
+			abs = filepath.Clean(use.Path)
+		} else {
+			abs = filepath.Join(workDir, use.Path)
+		}
+		_, mf, err := modload.ReadModFile(base.ShortPath(filepath.Join(abs, "go.mod")), nil)
+		if err != nil {
+			sw.Error(err)
+			continue
+		}
+		goV = gover.Max(goV, gover.FromGoMod(mf))
+	}
+	sw.Switch(ctx)
+	base.ExitIfErrors()
+
+	modload.UpdateWorkGoVersion(wf, goV)
+	modload.UpdateWorkFile(wf)
 }
 
 // pathRel returns the absolute and canonical forms of dir for use in a
 // go.work file located in directory workDir.
 //
-// If dir is relative, it is intepreted relative to base.Cwd()
+// If dir is relative, it is interpreted relative to base.Cwd()
 // and its canonical form is relative to workDir if possible.
 // If dir is absolute or cannot be made relative to workDir,
 // its canonical form is absolute.
diff --git a/src/cmd/go/main.go b/src/cmd/go/main.go
index ee705e8..7b73642 100644
--- a/src/cmd/go/main.go
+++ b/src/cmd/go/main.go
@@ -2,11 +2,12 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:generate ./mkalldocs.sh
+//go:generate go test cmd/go -v -run=TestDocsUpToDate -fixdocs
 
 package main
 
 import (
+	"cmd/go/internal/toolchain"
 	"cmd/go/internal/workcmd"
 	"context"
 	"flag"
@@ -16,6 +17,8 @@
 	"os"
 	"path/filepath"
 	"runtime"
+	rtrace "runtime/trace"
+	"slices"
 	"strings"
 
 	"cmd/go/internal/base"
@@ -86,11 +89,15 @@
 	}
 }
 
+var _ = go11tag
+
 func main() {
-	_ = go11tag
+	log.SetFlags(0)
+	handleChdirFlag()
+	toolchain.Select()
+
 	flag.Usage = base.Usage
 	flag.Parse()
-	log.SetFlags(0)
 
 	args := flag.Args()
 	if len(args) < 1 {
@@ -151,43 +158,65 @@
 		os.Exit(2)
 	}
 
-BigCmdLoop:
-	for bigCmd := base.Go; ; {
-		for _, cmd := range bigCmd.Commands {
-			if cmd.Name() != args[0] {
-				continue
-			}
-			if len(cmd.Commands) > 0 {
-				bigCmd = cmd
-				args = args[1:]
-				if len(args) == 0 {
-					help.PrintUsage(os.Stderr, bigCmd)
-					base.SetExitStatus(2)
-					base.Exit()
-				}
-				if args[0] == "help" {
-					// Accept 'go mod help' and 'go mod help foo' for 'go help mod' and 'go help mod foo'.
-					help.Help(os.Stdout, append(strings.Split(cfg.CmdName, " "), args[1:]...))
-					return
-				}
-				cfg.CmdName += " " + args[0]
-				continue BigCmdLoop
-			}
-			if !cmd.Runnable() {
-				continue
-			}
-			invoke(cmd, args)
+	cmd, used := lookupCmd(args)
+	cfg.CmdName = strings.Join(args[:used], " ")
+	if len(cmd.Commands) > 0 {
+		if used >= len(args) {
+			help.PrintUsage(os.Stderr, cmd)
+			base.SetExitStatus(2)
 			base.Exit()
-			return
+		}
+		if args[used] == "help" {
+			// Accept 'go mod help' and 'go mod help foo' for 'go help mod' and 'go help mod foo'.
+			help.Help(os.Stdout, append(slices.Clip(args[:used]), args[used+1:]...))
+			base.Exit()
 		}
 		helpArg := ""
-		if i := strings.LastIndex(cfg.CmdName, " "); i >= 0 {
-			helpArg = " " + cfg.CmdName[:i]
+		if used > 0 {
+			helpArg += " " + strings.Join(args[:used], " ")
 		}
-		fmt.Fprintf(os.Stderr, "go %s: unknown command\nRun 'go help%s' for usage.\n", cfg.CmdName, helpArg)
+		cmdName := cfg.CmdName
+		if cmdName == "" {
+			cmdName = args[0]
+		}
+		fmt.Fprintf(os.Stderr, "go %s: unknown command\nRun 'go help%s' for usage.\n", cmdName, helpArg)
 		base.SetExitStatus(2)
 		base.Exit()
 	}
+	invoke(cmd, args[used-1:])
+	base.Exit()
+}
+
+// lookupCmd interprets the initial elements of args
+// to find a command to run (cmd.Runnable() == true)
+// or else a command group that ran out of arguments
+// or had an unknown subcommand (len(cmd.Commands) > 0).
+// It returns that command and the number of elements of args
+// that it took to arrive at that command.
+func lookupCmd(args []string) (cmd *base.Command, used int) {
+	cmd = base.Go
+	for used < len(args) {
+		c := cmd.Lookup(args[used])
+		if c == nil {
+			break
+		}
+		if c.Runnable() {
+			cmd = c
+			used++
+			break
+		}
+		if len(c.Commands) > 0 {
+			cmd = c
+			used++
+			if used >= len(args) || args[0] == "help" {
+				break
+			}
+			continue
+		}
+		// len(c.Commands) == 0 && !c.Runnable() => help text; stop at "help"
+		break
+	}
+	return cmd, used
 }
 
 func invoke(cmd *base.Command, args []string) {
@@ -195,7 +224,7 @@
 	if cmd != envcmd.CmdEnv {
 		buildcfg.Check()
 		if cfg.ExperimentErr != nil {
-			base.Fatalf("go: %v", cfg.ExperimentErr)
+			base.Fatal(cfg.ExperimentErr)
 		}
 	}
 
@@ -204,7 +233,7 @@
 	// the same default computation of these as we do,
 	// but in practice there might be skew
 	// This makes sure we all agree.
-	cfg.OrigEnv = os.Environ()
+	cfg.OrigEnv = toolchain.FilterEnv(os.Environ())
 	cfg.CmdEnv = envcmd.MkEnv()
 	for _, env := range cfg.CmdEnv {
 		if os.Getenv(env.Name) != env.Value {
@@ -220,6 +249,20 @@
 		cmd.Flag.Parse(args[1:])
 		args = cmd.Flag.Args()
 	}
+
+	if cfg.DebugRuntimeTrace != "" {
+		f, err := os.Create(cfg.DebugRuntimeTrace)
+		if err != nil {
+			base.Fatalf("creating trace file: %v", err)
+		}
+		if err := rtrace.Start(f); err != nil {
+			base.Fatalf("starting event trace: %v", err)
+		}
+		defer func() {
+			rtrace.Stop()
+		}()
+	}
+
 	ctx := maybeStartTrace(context.Background())
 	ctx, span := trace.StartSpan(ctx, fmt.Sprint("Running ", cmd.Name(), " command"))
 	cmd.Run(ctx, cmd, args)
@@ -252,3 +295,44 @@
 
 	return ctx
 }
+
+// handleChdirFlag handles the -C flag before doing anything else.
+// The -C flag must be the first flag on the command line, to make it easy to find
+// even with commands that have custom flag parsing.
+// handleChdirFlag handles the flag by chdir'ing to the directory
+// and then removing that flag from the command line entirely.
+//
+// We have to handle the -C flag this way for two reasons:
+//
+//  1. Toolchain selection needs to be in the right directory to look for go.mod and go.work.
+//
+//  2. A toolchain switch later on reinvokes the new go command with the same arguments.
+//     The parent toolchain has already done the chdir; the child must not try to do it again.
+func handleChdirFlag() {
+	_, used := lookupCmd(os.Args[1:])
+	used++ // because of [1:]
+	if used >= len(os.Args) {
+		return
+	}
+
+	var dir string
+	switch a := os.Args[used]; {
+	default:
+		return
+
+	case a == "-C", a == "--C":
+		if used+1 >= len(os.Args) {
+			return
+		}
+		dir = os.Args[used+1]
+		os.Args = slices.Delete(os.Args, used, used+2)
+
+	case strings.HasPrefix(a, "-C="), strings.HasPrefix(a, "--C="):
+		_, dir, _ = strings.Cut(a, "=")
+		os.Args = slices.Delete(os.Args, used, used+1)
+	}
+
+	if err := os.Chdir(dir); err != nil {
+		base.Fatalf("go: %v", err)
+	}
+}
diff --git a/src/cmd/go/mkalldocs.sh b/src/cmd/go/mkalldocs.sh
deleted file mode 100755
index a2b0aca..0000000
--- a/src/cmd/go/mkalldocs.sh
+++ /dev/null
@@ -1,13 +0,0 @@
-#!/usr/bin/env 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 go.latest
-# If the command used to generate alldocs.go changes, update TestDocsUpToDate in
-# help_test.go.
-GO111MODULE='' ./go.latest help documentation >alldocs.go
-gofmt -w alldocs.go
-rm go.latest
diff --git a/src/cmd/go/note_test.go b/src/cmd/go/note_test.go
index 659366d..ba7ec2a 100644
--- a/src/cmd/go/note_test.go
+++ b/src/cmd/go/note_test.go
@@ -5,7 +5,7 @@
 package main_test
 
 import (
-	"go/build"
+	"internal/testenv"
 	"runtime"
 	"testing"
 
@@ -32,7 +32,7 @@
 	}
 
 	switch {
-	case !build.Default.CgoEnabled:
+	case !testenv.HasCGO():
 		t.Skipf("skipping - no cgo, so assuming external linking not available")
 	case runtime.GOOS == "plan9":
 		t.Skipf("skipping - external linking not supported")
diff --git a/src/cmd/go/proxy_test.go b/src/cmd/go/proxy_test.go
index fc25696..cb3d9f9 100644
--- a/src/cmd/go/proxy_test.go
+++ b/src/cmd/go/proxy_test.go
@@ -105,7 +105,7 @@
 	}
 }
 
-var zipCache par.Cache
+var zipCache par.ErrCache[*txtar.Archive, []byte]
 
 const (
 	testSumDBName        = "localhost.localdev/sumdb"
@@ -353,11 +353,7 @@
 		}
 
 	case "zip":
-		type cached struct {
-			zip []byte
-			err error
-		}
-		c := zipCache.Do(a, func() any {
+		zipBytes, err := zipCache.Do(a, func() ([]byte, error) {
 			var buf bytes.Buffer
 			z := zip.NewWriter(&buf)
 			for _, f := range a.Files {
@@ -372,26 +368,26 @@
 				}
 				zf, err := z.Create(zipName)
 				if err != nil {
-					return cached{nil, err}
+					return nil, err
 				}
 				if _, err := zf.Write(f.Data); err != nil {
-					return cached{nil, err}
+					return nil, err
 				}
 			}
 			if err := z.Close(); err != nil {
-				return cached{nil, err}
+				return nil, err
 			}
-			return cached{buf.Bytes(), nil}
-		}).(cached)
+			return buf.Bytes(), nil
+		})
 
-		if c.err != nil {
+		if err != nil {
 			if testing.Verbose() {
-				fmt.Fprintf(os.Stderr, "go proxy: %v\n", c.err)
+				fmt.Fprintf(os.Stderr, "go proxy: %v\n", err)
 			}
-			http.Error(w, c.err.Error(), 500)
+			http.Error(w, err.Error(), 500)
 			return
 		}
-		w.Write(c.zip)
+		w.Write(zipBytes)
 		return
 
 	}
@@ -415,7 +411,7 @@
 	return info.Short
 }
 
-var archiveCache par.Cache
+var archiveCache par.Cache[string, *txtar.Archive]
 
 var cmdGoDir, _ = os.Getwd()
 
@@ -431,7 +427,7 @@
 
 	prefix := strings.ReplaceAll(enc, "/", "_")
 	name := filepath.Join(cmdGoDir, "testdata/mod", prefix+"_"+encVers+".txt")
-	a := archiveCache.Do(name, func() any {
+	a := archiveCache.Do(name, func() *txtar.Archive {
 		a, err := txtar.ParseFile(name)
 		if err != nil {
 			if testing.Verbose() || !os.IsNotExist(err) {
@@ -440,7 +436,7 @@
 			a = nil
 		}
 		return a
-	}).(*txtar.Archive)
+	})
 	if a == nil {
 		return nil, fs.ErrNotExist
 	}
diff --git a/src/cmd/go/script_test.go b/src/cmd/go/script_test.go
index 4211fb6..624c5bf 100644
--- a/src/cmd/go/script_test.go
+++ b/src/cmd/go/script_test.go
@@ -14,20 +14,18 @@
 	"bytes"
 	"context"
 	"flag"
-	"fmt"
-	"go/build"
 	"internal/testenv"
 	"internal/txtar"
 	"net/url"
 	"os"
 	"path/filepath"
-	"regexp"
 	"runtime"
 	"strings"
 	"testing"
 	"time"
 
 	"cmd/go/internal/cfg"
+	"cmd/go/internal/gover"
 	"cmd/go/internal/script"
 	"cmd/go/internal/script/scripttest"
 	"cmd/go/internal/vcweb/vcstest"
@@ -116,7 +114,7 @@
 				defer removeAll(workdir)
 			}
 
-			s, err := script.NewState(ctx, workdir, env)
+			s, err := script.NewState(tbContext(ctx, t), workdir, env)
 			if err != nil {
 				t.Fatal(err)
 			}
@@ -151,11 +149,32 @@
 				}
 			}
 
-			scripttest.Run(t, engine, s, filepath.Base(file), bytes.NewReader(a.Comment))
+			// Note: Do not use filepath.Base(file) here:
+			// editors that can jump to file:line references in the output
+			// will work better seeing the full path relative to cmd/go
+			// (where the "go test" command is usually run).
+			scripttest.Run(t, engine, s, file, bytes.NewReader(a.Comment))
 		})
 	}
 }
 
+// testingTBKey is the Context key for a testing.TB.
+type testingTBKey struct{}
+
+// tbContext returns a Context derived from ctx and associated with t.
+func tbContext(ctx context.Context, t testing.TB) context.Context {
+	return context.WithValue(ctx, testingTBKey{}, t)
+}
+
+// tbFromContext returns the testing.TB associated with ctx, if any.
+func tbFromContext(ctx context.Context) (testing.TB, bool) {
+	t := ctx.Value(testingTBKey{})
+	if t == nil {
+		return nil, false
+	}
+	return t.(testing.TB), true
+}
+
 // initScriptState creates the initial directory structure in s for unpacking a
 // cmd/go script.
 func initScriptDirs(t testing.TB, s *script.State) {
@@ -188,10 +207,6 @@
 	if err != nil {
 		return nil, err
 	}
-	version, err := goVersion()
-	if err != nil {
-		return nil, err
-	}
 	env := []string{
 		pathEnvName() + "=" + testBin + string(filepath.ListSeparator) + os.Getenv(pathEnvName()),
 		homeEnvName() + "=/no-home",
@@ -210,18 +225,23 @@
 		"GOROOT=" + testGOROOT,
 		"GOROOT_FINAL=" + testGOROOT_FINAL, // causes spurious rebuilds and breaks the "stale" built-in if not propagated
 		"GOTRACEBACK=system",
+		"TESTGONETWORK=panic", // allow only local connections by default; the [net] condition resets this
 		"TESTGO_GOROOT=" + testGOROOT,
 		"TESTGO_EXE=" + testGo,
 		"TESTGO_VCSTEST_HOST=" + httpURL.Host,
 		"TESTGO_VCSTEST_TLS_HOST=" + httpsURL.Host,
 		"TESTGO_VCSTEST_CERT=" + srvCertFile,
+		"TESTGONETWORK=panic", // cleared by the [net] condition
 		"GOSUMDB=" + testSumDBVerifierKey,
 		"GONOPROXY=",
 		"GONOSUMDB=",
 		"GOVCS=*:all",
 		"devnull=" + os.DevNull,
-		"goversion=" + version,
+		"goversion=" + gover.Local(),
 		"CMDGO_TEST_RUN_MAIN=true",
+		"HGRCPATH=",
+		"GOTOOLCHAIN=auto",
+		"newline=\n",
 	}
 
 	if testenv.Builder() != "" || os.Getenv("GIT_TRACE_CURL") == "1" {
@@ -232,9 +252,13 @@
 			"GIT_TRACE_CURL_NO_DATA=1",
 			"GIT_REDACT_COOKIES=o,SSO,GSSO_Uberproxy")
 	}
-	if !testenv.HasExternalNetwork() {
-		env = append(env, "TESTGONETWORK=panic", "TESTGOVCS=panic")
+	if testing.Short() {
+		// VCS commands are always somewhat slow: they either require access to external hosts,
+		// or they require our intercepted vcs-test.golang.org to regenerate the repository.
+		// Require all tests that use VCS commands to be skipped in short mode.
+		env = append(env, "TESTGOVCS=panic")
 	}
+
 	if os.Getenv("CGO_ENABLED") != "" || runtime.GOOS != goHostOS || runtime.GOARCH != goHostArch {
 		// If the actual CGO_ENABLED might not match the cmd/go default, set it
 		// explicitly in the environment. Otherwise, leave it unset so that we also
@@ -251,16 +275,6 @@
 	return env, nil
 }
 
-// goVersion returns the current Go version.
-func goVersion() (string, error) {
-	tags := build.Default.ReleaseTags
-	version := tags[len(tags)-1]
-	if !regexp.MustCompile(`^go([1-9][0-9]*)\.(0|[1-9][0-9]*)$`).MatchString(version) {
-		return "", fmt.Errorf("invalid go version %q", version)
-	}
-	return version[2:], nil
-}
-
 var extraEnvKeys = []string{
 	"SYSTEMROOT",         // must be preserved on Windows to find DLLs; golang.org/issue/25210
 	"WINDIR",             // must be preserved on Windows to be able to run PowerShell command; golang.org/issue/30711
diff --git a/src/cmd/go/scriptconds_test.go b/src/cmd/go/scriptconds_test.go
index 5163750..8dd9b0d 100644
--- a/src/cmd/go/scriptconds_test.go
+++ b/src/cmd/go/scriptconds_test.go
@@ -19,6 +19,7 @@
 	"runtime"
 	"runtime/debug"
 	"strings"
+	"sync"
 )
 
 func scriptConditions() map[string]script.Cond {
@@ -39,17 +40,21 @@
 	add("asan", sysCondition("-asan", platform.ASanSupported, true))
 	add("buildmode", script.PrefixCondition("go supports -buildmode=<suffix>", hasBuildmode))
 	add("case-sensitive", script.OnceCondition("$WORK filesystem is case-sensitive", isCaseSensitive))
-	add("cgo", script.BoolCondition("host CGO_ENABLED", canCgo))
+	add("cc", script.PrefixCondition("go env CC = <suffix> (ignoring the go/env file)", ccIs))
+	add("cgo", script.BoolCondition("host CGO_ENABLED", testenv.HasCGO()))
+	add("cgolinkext", script.Condition("platform requires external linking for cgo", cgoLinkExt))
 	add("cross", script.BoolCondition("cmd/go GOOS/GOARCH != GOHOSTOS/GOHOSTARCH", goHostOS != runtime.GOOS || goHostArch != runtime.GOARCH))
 	add("fuzz", sysCondition("-fuzz", platform.FuzzSupported, false))
 	add("fuzz-instrumented", sysCondition("-fuzz with instrumentation", platform.FuzzInstrumented, false))
 	add("git", lazyBool("the 'git' executable exists and provides the standard CLI", hasWorkingGit))
 	add("GODEBUG", script.PrefixCondition("GODEBUG contains <suffix>", hasGodebug))
 	add("GOEXPERIMENT", script.PrefixCondition("GOEXPERIMENT <suffix> is enabled", hasGoexperiment))
+	add("go-builder", script.BoolCondition("GO_BUILDER_NAME is non-empty", testenv.Builder() != ""))
 	add("link", lazyBool("testenv.HasLink()", testenv.HasLink))
 	add("mismatched-goroot", script.Condition("test's GOROOT_FINAL does not match the real GOROOT", isMismatchedGoroot))
 	add("msan", sysCondition("-msan", platform.MSanSupported, true))
-	add("net", lazyBool("testenv.HasExternalNetwork()", testenv.HasExternalNetwork))
+	add("mustlinkext", script.Condition("platform always requires external linking", mustLinkExt))
+	add("net", script.PrefixCondition("can connect to external network host <suffix>", hasNet))
 	add("race", sysCondition("-race", platform.RaceDetectorSupported, true))
 	add("symlink", lazyBool("testenv.HasSymlink()", testenv.HasSymlink))
 	add("trimpath", script.OnceCondition("test binary was built with -trimpath", isTrimpath))
@@ -69,6 +74,16 @@
 	return false, nil
 }
 
+func ccIs(s *script.State, want string) (bool, error) {
+	CC, _ := s.LookupEnv("CC")
+	if CC != "" {
+		return CC == want, nil
+	}
+	GOOS, _ := s.LookupEnv("GOOS")
+	GOARCH, _ := s.LookupEnv("GOARCH")
+	return cfg.DefaultCC(GOOS, GOARCH) == want, nil
+}
+
 func isMismatchedGoroot(s *script.State) (bool, error) {
 	gorootFinal, _ := s.LookupEnv("GOROOT_FINAL")
 	if gorootFinal == "" {
@@ -84,7 +99,7 @@
 			GOOS, _ := s.LookupEnv("GOOS")
 			GOARCH, _ := s.LookupEnv("GOARCH")
 			cross := goHostOS != GOOS || goHostArch != GOARCH
-			return (!needsCgo || (canCgo && !cross)) && f(GOOS, GOARCH), nil
+			return (!needsCgo || (testenv.HasCGO() && !cross)) && f(GOOS, GOARCH), nil
 		})
 }
 
@@ -94,6 +109,42 @@
 	return platform.BuildModeSupported(runtime.Compiler, mode, GOOS, GOARCH), nil
 }
 
+var scriptNetEnabled sync.Map // testing.TB → already enabled
+
+func hasNet(s *script.State, host string) (bool, error) {
+	if !testenv.HasExternalNetwork() {
+		return false, nil
+	}
+
+	// TODO(bcmills): Add a flag or environment variable to allow skipping tests
+	// for specific hosts and/or skipping all net tests except for specific hosts.
+
+	t, ok := tbFromContext(s.Context())
+	if !ok {
+		return false, errors.New("script Context unexpectedly missing testing.TB key")
+	}
+
+	if netTestSem != nil {
+		// When the number of external network connections is limited, we limit the
+		// number of net tests that can run concurrently so that the overall number
+		// of network connections won't exceed the limit.
+		_, dup := scriptNetEnabled.LoadOrStore(t, true)
+		if !dup {
+			// Acquire a net token for this test until the test completes.
+			netTestSem <- struct{}{}
+			t.Cleanup(func() {
+				<-netTestSem
+				scriptNetEnabled.Delete(t)
+			})
+		}
+	}
+
+	// Since we have confirmed that the network is available,
+	// allow cmd/go to use it.
+	s.Setenv("TESTGONETWORK", "")
+	return true, nil
+}
+
 func hasGodebug(s *script.State, value string) (bool, error) {
 	godebug, _ := s.LookupEnv("GODEBUG")
 	for _, p := range strings.Split(godebug, ",") {
@@ -170,3 +221,15 @@
 	_, err := exec.LookPath("git")
 	return err == nil
 }
+
+func cgoLinkExt(s *script.State) (bool, error) {
+	GOOS, _ := s.LookupEnv("GOOS")
+	GOARCH, _ := s.LookupEnv("GOARCH")
+	return platform.MustLinkExternal(GOOS, GOARCH, true), nil
+}
+
+func mustLinkExt(s *script.State) (bool, error) {
+	GOOS, _ := s.LookupEnv("GOOS")
+	GOARCH, _ := s.LookupEnv("GOARCH")
+	return platform.MustLinkExternal(GOOS, GOARCH, false), nil
+}
diff --git a/src/cmd/go/scriptreadme_test.go b/src/cmd/go/scriptreadme_test.go
index fde1e8e..2a842fb 100644
--- a/src/cmd/go/scriptreadme_test.go
+++ b/src/cmd/go/scriptreadme_test.go
@@ -37,10 +37,6 @@
 	}
 	args.Conditions = conds.String()
 
-	if !testenv.HasExec() {
-		t.Skipf("updating script README requires os/exec")
-	}
-
 	doc := new(strings.Builder)
 	cmd := testenv.Command(t, testGo, "doc", "cmd/go/internal/script")
 	cmd.Env = env
diff --git a/src/cmd/go/testdata/addmod.go b/src/cmd/go/testdata/addmod.go
index e378d7f..0045d50 100644
--- a/src/cmd/go/testdata/addmod.go
+++ b/src/cmd/go/testdata/addmod.go
@@ -16,7 +16,6 @@
 //
 // It is acceptable to edit the archive afterward to remove or shorten files.
 // See mod/README for more information.
-//
 package main
 
 import (
@@ -131,7 +130,7 @@
 				if err != nil {
 					return err
 				}
-				a.Files = append(a.Files, txtar.File{Name: strings.TrimPrefix(path, dir+string(filepath.Separator)), Data: data})
+				a.Files = append(a.Files, txtar.File{Name: str.TrimFilePathPrefix(path, dir), Data: data})
 			}
 			return nil
 		})
diff --git a/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.18.1.linux-amd64.txt b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.18.1.linux-amd64.txt
new file mode 100644
index 0000000..3713de3
--- /dev/null
+++ b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.18.1.linux-amd64.txt
@@ -0,0 +1,8 @@
+golang.org/toolchain v0.0.1-go1.18.1.linux-amd64
+written by hand
+-- .info --
+{"Version":"v0.0.1-go1.18.1.linux-amd64"}
+-- .mod --
+golang.org/toolchain
+-- go.mod --
+golang.org/toolchain
diff --git a/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.18.3.linux-amd64.txt b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.18.3.linux-amd64.txt
new file mode 100644
index 0000000..8eda1ee
--- /dev/null
+++ b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.18.3.linux-amd64.txt
@@ -0,0 +1,8 @@
+golang.org/toolchain v0.0.1-go1.18.3.linux-amd64
+written by hand
+-- .info --
+{"Version":"v0.0.1-go1.18.3.linux-amd64"}
+-- .mod --
+golang.org/toolchain
+-- go.mod --
+golang.org/toolchain
diff --git a/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.18.5.linux-amd64.txt b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.18.5.linux-amd64.txt
new file mode 100644
index 0000000..d74ef25
--- /dev/null
+++ b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.18.5.linux-amd64.txt
@@ -0,0 +1,8 @@
+golang.org/toolchain v0.0.1-go1.18.5.linux-amd64
+written by hand
+-- .info --
+{"Version":"v0.0.1-go1.18.5.linux-amd64"}
+-- .mod --
+golang.org/toolchain
+-- go.mod --
+golang.org/toolchain
diff --git a/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.18.7.linux-amd64.txt b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.18.7.linux-amd64.txt
new file mode 100644
index 0000000..2fc7f85
--- /dev/null
+++ b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.18.7.linux-amd64.txt
@@ -0,0 +1,8 @@
+golang.org/toolchain v0.0.1-go1.18.7.linux-amd64
+written by hand
+-- .info --
+{"Version":"v0.0.1-go1.18.7.linux-amd64"}
+-- .mod --
+golang.org/toolchain
+-- go.mod --
+golang.org/toolchain
diff --git a/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.18.9.linux-amd64.txt b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.18.9.linux-amd64.txt
new file mode 100644
index 0000000..7b07851
--- /dev/null
+++ b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.18.9.linux-amd64.txt
@@ -0,0 +1,8 @@
+golang.org/toolchain v0.0.1-go1.18.9.linux-amd64
+written by hand
+-- .info --
+{"Version":"v0.0.1-go1.18.9.linux-amd64"}
+-- .mod --
+golang.org/toolchain
+-- go.mod --
+golang.org/toolchain
diff --git a/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.18.linux-amd64.txt b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.18.linux-amd64.txt
new file mode 100644
index 0000000..2c80ce5
--- /dev/null
+++ b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.18.linux-amd64.txt
@@ -0,0 +1,8 @@
+golang.org/toolchain v0.0.1-go1.18.linux-amd64
+written by hand
+-- .info --
+{"Version":"v0.0.1-go1.18.linux-amd64"}
+-- .mod --
+golang.org/toolchain
+-- go.mod --
+golang.org/toolchain
diff --git a/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.22.0.linux-amd64.txt b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.22.0.linux-amd64.txt
new file mode 100644
index 0000000..215c547
--- /dev/null
+++ b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.22.0.linux-amd64.txt
@@ -0,0 +1,8 @@
+golang.org/toolchain v0.0.1-go1.22.0.linux-amd64
+written by hand
+-- .info --
+{"Version":"v0.0.1-go1.22.0.linux-amd64"}
+-- .mod --
+golang.org/toolchain
+-- go.mod --
+golang.org/toolchain
diff --git a/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.22.1.linux-amd64.txt b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.22.1.linux-amd64.txt
new file mode 100644
index 0000000..ac36e3f
--- /dev/null
+++ b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.22.1.linux-amd64.txt
@@ -0,0 +1,8 @@
+golang.org/toolchain v0.0.1-go1.22.1.linux-amd64
+written by hand
+-- .info --
+{"Version":"v0.0.1-go1.22.1.linux-amd64"}
+-- .mod --
+golang.org/toolchain
+-- go.mod --
+golang.org/toolchain
diff --git a/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.22.3.linux-amd64.txt b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.22.3.linux-amd64.txt
new file mode 100644
index 0000000..1178a48
--- /dev/null
+++ b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.22.3.linux-amd64.txt
@@ -0,0 +1,8 @@
+golang.org/toolchain v0.0.1-go1.22.3.linux-amd64
+written by hand
+-- .info --
+{"Version":"v0.0.1-go1.22.3.linux-amd64"}
+-- .mod --
+golang.org/toolchain
+-- go.mod --
+golang.org/toolchain
diff --git a/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.22.5.linux-amd64.txt b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.22.5.linux-amd64.txt
new file mode 100644
index 0000000..d330127
--- /dev/null
+++ b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.22.5.linux-amd64.txt
@@ -0,0 +1,8 @@
+golang.org/toolchain v0.0.1-go1.22.5.linux-amd64
+written by hand
+-- .info --
+{"Version":"v0.0.1-go1.22.5.linux-amd64"}
+-- .mod --
+golang.org/toolchain
+-- go.mod --
+golang.org/toolchain
diff --git a/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.22.7.linux-amd64.txt b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.22.7.linux-amd64.txt
new file mode 100644
index 0000000..a72863b
--- /dev/null
+++ b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.22.7.linux-amd64.txt
@@ -0,0 +1,8 @@
+golang.org/toolchain v0.0.1-go1.22.7.linux-amd64
+written by hand
+-- .info --
+{"Version":"v0.0.1-go1.22.7.linux-amd64"}
+-- .mod --
+golang.org/toolchain
+-- go.mod --
+golang.org/toolchain
diff --git a/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.22.9.linux-amd64.txt b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.22.9.linux-amd64.txt
new file mode 100644
index 0000000..ac55849
--- /dev/null
+++ b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.22.9.linux-amd64.txt
@@ -0,0 +1,8 @@
+golang.org/toolchain v0.0.1-go1.22.9.linux-amd64
+written by hand
+-- .info --
+{"Version":"v0.0.1-go1.22.9.linux-amd64"}
+-- .mod --
+golang.org/toolchain
+-- go.mod --
+golang.org/toolchain
diff --git a/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.22rc1.linux-amd64.txt b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.22rc1.linux-amd64.txt
new file mode 100644
index 0000000..b384f28
--- /dev/null
+++ b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.22rc1.linux-amd64.txt
@@ -0,0 +1,8 @@
+golang.org/toolchain v0.0.1-go1.22rc1.linux-amd64
+written by hand
+-- .info --
+{"Version":"v0.0.1-go1.22rc1.linux-amd64"}
+-- .mod --
+golang.org/toolchain
+-- go.mod --
+golang.org/toolchain
diff --git a/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.23.0.linux-amd64.txt b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.23.0.linux-amd64.txt
new file mode 100644
index 0000000..bbc1377
--- /dev/null
+++ b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.23.0.linux-amd64.txt
@@ -0,0 +1,8 @@
+golang.org/toolchain v0.0.1-go1.23.0.linux-amd64
+written by hand
+-- .info --
+{"Version":"v0.0.1-go1.23.0.linux-amd64"}
+-- .mod --
+golang.org/toolchain
+-- go.mod --
+golang.org/toolchain
diff --git a/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.23.5.linux-amd64.txt b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.23.5.linux-amd64.txt
new file mode 100644
index 0000000..206e8ad
--- /dev/null
+++ b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.23.5.linux-amd64.txt
@@ -0,0 +1,8 @@
+golang.org/toolchain v0.0.1-go1.23.5.linux-amd64
+written by hand
+-- .info --
+{"Version":"v0.0.1-go1.23.5.linux-amd64"}
+-- .mod --
+golang.org/toolchain
+-- go.mod --
+golang.org/toolchain
diff --git a/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.23.9.linux-amd64.txt b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.23.9.linux-amd64.txt
new file mode 100644
index 0000000..7d03776
--- /dev/null
+++ b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.23.9.linux-amd64.txt
@@ -0,0 +1,8 @@
+golang.org/toolchain v0.0.1-go1.23.9.linux-amd64
+written by hand
+-- .info --
+{"Version":"v0.0.1-go1.23.9.linux-amd64"}
+-- .mod --
+golang.org/toolchain
+-- go.mod --
+golang.org/toolchain
diff --git a/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.24rc1.linux-amd64.txt b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.24rc1.linux-amd64.txt
new file mode 100644
index 0000000..4b61ddd
--- /dev/null
+++ b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.24rc1.linux-amd64.txt
@@ -0,0 +1,8 @@
+golang.org/toolchain v0.0.1-go1.24rc1.linux-amd64
+written by hand
+-- .info --
+{"Version":"v0.0.1-go1.24rc1.linux-amd64"}
+-- .mod --
+golang.org/toolchain
+-- go.mod --
+golang.org/toolchain
diff --git a/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.aix-ppc64.txt b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.aix-ppc64.txt
new file mode 100644
index 0000000..e70c4d7
--- /dev/null
+++ b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.aix-ppc64.txt
@@ -0,0 +1,14 @@
+golang.org/toolchain@v0.0.1-go1.999testmod.aix-ppc64
+
+-- .mod --
+module golang.org/toolchain
+-- .info --
+{"Version":"v0.0.1-go1.999testmod.aix-ppc64"}
+-- go.mod --
+module golang.org/toolchain
+-- bin/go --
+#!/bin/sh
+echo go1.999testmod here!
+-- bin/gofmt --
+echo i am unused
+-- pkg/tool/fake --
diff --git a/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.android-386.txt b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.android-386.txt
new file mode 100644
index 0000000..981334e
--- /dev/null
+++ b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.android-386.txt
@@ -0,0 +1,14 @@
+golang.org/toolchain@v0.0.1-go1.999testmod.android-386
+
+-- .mod --
+module golang.org/toolchain
+-- .info --
+{"Version":"v0.0.1-go1.999testmod.android-386"}
+-- go.mod --
+module golang.org/toolchain
+-- bin/go --
+#!/bin/sh
+echo go1.999testmod here!
+-- bin/gofmt --
+echo i am unused
+-- pkg/tool/fake --
diff --git a/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.android-amd64.txt b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.android-amd64.txt
new file mode 100644
index 0000000..a01fce8
--- /dev/null
+++ b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.android-amd64.txt
@@ -0,0 +1,14 @@
+golang.org/toolchain@v0.0.1-go1.999testmod.android-amd64
+
+-- .mod --
+module golang.org/toolchain
+-- .info --
+{"Version":"v0.0.1-go1.999testmod.android-amd64"}
+-- go.mod --
+module golang.org/toolchain
+-- bin/go --
+#!/bin/sh
+echo go1.999testmod here!
+-- bin/gofmt --
+echo i am unused
+-- pkg/tool/fake --
diff --git a/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.android-arm.txt b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.android-arm.txt
new file mode 100644
index 0000000..0de1cec
--- /dev/null
+++ b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.android-arm.txt
@@ -0,0 +1,14 @@
+golang.org/toolchain@v0.0.1-go1.999testmod.android-arm
+
+-- .mod --
+module golang.org/toolchain
+-- .info --
+{"Version":"v0.0.1-go1.999testmod.android-arm"}
+-- go.mod --
+module golang.org/toolchain
+-- bin/go --
+#!/bin/sh
+echo go1.999testmod here!
+-- bin/gofmt --
+echo i am unused
+-- pkg/tool/fake --
diff --git a/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.android-arm64.txt b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.android-arm64.txt
new file mode 100644
index 0000000..1ebeadc
--- /dev/null
+++ b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.android-arm64.txt
@@ -0,0 +1,14 @@
+golang.org/toolchain@v0.0.1-go1.999testmod.android-arm64
+
+-- .mod --
+module golang.org/toolchain
+-- .info --
+{"Version":"v0.0.1-go1.999testmod.android-arm64"}
+-- go.mod --
+module golang.org/toolchain
+-- bin/go --
+#!/bin/sh
+echo go1.999testmod here!
+-- bin/gofmt --
+echo i am unused
+-- pkg/tool/fake --
diff --git a/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.darwin-amd64.txt b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.darwin-amd64.txt
new file mode 100644
index 0000000..5091853
--- /dev/null
+++ b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.darwin-amd64.txt
@@ -0,0 +1,14 @@
+golang.org/toolchain@v0.0.1-go1.999testmod.darwin-amd64
+
+-- .mod --
+module golang.org/toolchain
+-- .info --
+{"Version":"v0.0.1-go1.999testmod.darwin-amd64"}
+-- go.mod --
+module golang.org/toolchain
+-- bin/go --
+#!/bin/sh
+echo go1.999testmod here!
+-- bin/gofmt --
+echo i am unused
+-- pkg/tool/fake --
diff --git a/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.darwin-arm64.txt b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.darwin-arm64.txt
new file mode 100644
index 0000000..6b2b132
--- /dev/null
+++ b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.darwin-arm64.txt
@@ -0,0 +1,14 @@
+golang.org/toolchain@v0.0.1-go1.999testmod.darwin-arm64
+
+-- .mod --
+module golang.org/toolchain
+-- .info --
+{"Version":"v0.0.1-go1.999testmod.darwin-arm64"}
+-- go.mod --
+module golang.org/toolchain
+-- bin/go --
+#!/bin/sh
+echo go1.999testmod here!
+-- bin/gofmt --
+echo i am unused
+-- pkg/tool/fake --
diff --git a/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.dragonfly-amd64.txt b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.dragonfly-amd64.txt
new file mode 100644
index 0000000..814180a
--- /dev/null
+++ b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.dragonfly-amd64.txt
@@ -0,0 +1,14 @@
+golang.org/toolchain@v0.0.1-go1.999testmod.dragonfly-amd64
+
+-- .mod --
+module golang.org/toolchain
+-- .info --
+{"Version":"v0.0.1-go1.999testmod.dragonfly-amd64"}
+-- go.mod --
+module golang.org/toolchain
+-- bin/go --
+#!/bin/sh
+echo go1.999testmod here!
+-- bin/gofmt --
+echo i am unused
+-- pkg/tool/fake --
diff --git a/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.freebsd-386.txt b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.freebsd-386.txt
new file mode 100644
index 0000000..12e0df4
--- /dev/null
+++ b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.freebsd-386.txt
@@ -0,0 +1,14 @@
+golang.org/toolchain@v0.0.1-go1.999testmod.freebsd-386
+
+-- .mod --
+module golang.org/toolchain
+-- .info --
+{"Version":"v0.0.1-go1.999testmod.freebsd-386"}
+-- go.mod --
+module golang.org/toolchain
+-- bin/go --
+#!/bin/sh
+echo go1.999testmod here!
+-- bin/gofmt --
+echo i am unused
+-- pkg/tool/fake --
diff --git a/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.freebsd-amd64.txt b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.freebsd-amd64.txt
new file mode 100644
index 0000000..bf470a5
--- /dev/null
+++ b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.freebsd-amd64.txt
@@ -0,0 +1,14 @@
+golang.org/toolchain@v0.0.1-go1.999testmod.freebsd-amd64
+
+-- .mod --
+module golang.org/toolchain
+-- .info --
+{"Version":"v0.0.1-go1.999testmod.freebsd-amd64"}
+-- go.mod --
+module golang.org/toolchain
+-- bin/go --
+#!/bin/sh
+echo go1.999testmod here!
+-- bin/gofmt --
+echo i am unused
+-- pkg/tool/fake --
diff --git a/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.freebsd-arm.txt b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.freebsd-arm.txt
new file mode 100644
index 0000000..dc32e0e
--- /dev/null
+++ b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.freebsd-arm.txt
@@ -0,0 +1,14 @@
+golang.org/toolchain@v0.0.1-go1.999testmod.freebsd-arm
+
+-- .mod --
+module golang.org/toolchain
+-- .info --
+{"Version":"v0.0.1-go1.999testmod.freebsd-arm"}
+-- go.mod --
+module golang.org/toolchain
+-- bin/go --
+#!/bin/sh
+echo go1.999testmod here!
+-- bin/gofmt --
+echo i am unused
+-- pkg/tool/fake --
diff --git a/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.freebsd-arm64.txt b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.freebsd-arm64.txt
new file mode 100644
index 0000000..4335ba6
--- /dev/null
+++ b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.freebsd-arm64.txt
@@ -0,0 +1,14 @@
+golang.org/toolchain@v0.0.1-go1.999testmod.freebsd-arm64
+
+-- .mod --
+module golang.org/toolchain
+-- .info --
+{"Version":"v0.0.1-go1.999testmod.freebsd-arm64"}
+-- go.mod --
+module golang.org/toolchain
+-- bin/go --
+#!/bin/sh
+echo go1.999testmod here!
+-- bin/gofmt --
+echo i am unused
+-- pkg/tool/fake --
diff --git a/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.freebsd-riscv64.txt b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.freebsd-riscv64.txt
new file mode 100644
index 0000000..6161fe2
--- /dev/null
+++ b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.freebsd-riscv64.txt
@@ -0,0 +1,14 @@
+golang.org/toolchain@v0.0.1-go1.999testmod.freebsd-riscv64
+
+-- .mod --
+module golang.org/toolchain
+-- .info --
+{"Version":"v0.0.1-go1.999testmod.freebsd-riscv64"}
+-- go.mod --
+module golang.org/toolchain
+-- bin/go --
+#!/bin/sh
+echo go1.999testmod here!
+-- bin/gofmt --
+echo i am unused
+-- pkg/tool/fake --
diff --git a/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.illumos-amd64.txt b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.illumos-amd64.txt
new file mode 100644
index 0000000..b677457
--- /dev/null
+++ b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.illumos-amd64.txt
@@ -0,0 +1,14 @@
+golang.org/toolchain@v0.0.1-go1.999testmod.illumos-amd64
+
+-- .mod --
+module golang.org/toolchain
+-- .info --
+{"Version":"v0.0.1-go1.999testmod.illumos-amd64"}
+-- go.mod --
+module golang.org/toolchain
+-- bin/go --
+#!/bin/sh
+echo go1.999testmod here!
+-- bin/gofmt --
+echo i am unused
+-- pkg/tool/fake --
diff --git a/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.ios-amd64.txt b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.ios-amd64.txt
new file mode 100644
index 0000000..e8363bc
--- /dev/null
+++ b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.ios-amd64.txt
@@ -0,0 +1,14 @@
+golang.org/toolchain@v0.0.1-go1.999testmod.ios-amd64
+
+-- .mod --
+module golang.org/toolchain
+-- .info --
+{"Version":"v0.0.1-go1.999testmod.ios-amd64"}
+-- go.mod --
+module golang.org/toolchain
+-- bin/go --
+#!/bin/sh
+echo go1.999testmod here!
+-- bin/gofmt --
+echo i am unused
+-- pkg/tool/fake --
diff --git a/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.ios-arm64.txt b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.ios-arm64.txt
new file mode 100644
index 0000000..9585966
--- /dev/null
+++ b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.ios-arm64.txt
@@ -0,0 +1,14 @@
+golang.org/toolchain@v0.0.1-go1.999testmod.ios-arm64
+
+-- .mod --
+module golang.org/toolchain
+-- .info --
+{"Version":"v0.0.1-go1.999testmod.ios-arm64"}
+-- go.mod --
+module golang.org/toolchain
+-- bin/go --
+#!/bin/sh
+echo go1.999testmod here!
+-- bin/gofmt --
+echo i am unused
+-- pkg/tool/fake --
diff --git a/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.js-wasm.txt b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.js-wasm.txt
new file mode 100644
index 0000000..37fa6c0
--- /dev/null
+++ b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.js-wasm.txt
@@ -0,0 +1,14 @@
+golang.org/toolchain@v0.0.1-go1.999testmod.js-wasm
+
+-- .mod --
+module golang.org/toolchain
+-- .info --
+{"Version":"v0.0.1-go1.999testmod.js-wasm"}
+-- go.mod --
+module golang.org/toolchain
+-- bin/go --
+#!/bin/sh
+echo go1.999testmod here!
+-- bin/gofmt --
+echo i am unused
+-- pkg/tool/fake --
diff --git a/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.linux-386.txt b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.linux-386.txt
new file mode 100644
index 0000000..ee96638
--- /dev/null
+++ b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.linux-386.txt
@@ -0,0 +1,14 @@
+golang.org/toolchain@v0.0.1-go1.999testmod.linux-386
+
+-- .mod --
+module golang.org/toolchain
+-- .info --
+{"Version":"v0.0.1-go1.999testmod.linux-386"}
+-- go.mod --
+module golang.org/toolchain
+-- bin/go --
+#!/bin/sh
+echo go1.999testmod here!
+-- bin/gofmt --
+echo i am unused
+-- pkg/tool/fake --
diff --git a/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.linux-amd64.txt b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.linux-amd64.txt
new file mode 100644
index 0000000..6277341
--- /dev/null
+++ b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.linux-amd64.txt
@@ -0,0 +1,14 @@
+golang.org/toolchain@v0.0.1-go1.999testmod.linux-amd64
+
+-- .mod --
+module golang.org/toolchain
+-- .info --
+{"Version":"v0.0.1-go1.999testmod.linux-amd64"}
+-- go.mod --
+module golang.org/toolchain
+-- bin/go --
+#!/bin/sh
+echo go1.999testmod here!
+-- bin/gofmt --
+echo i am unused
+-- pkg/tool/fake --
diff --git a/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.linux-arm.txt b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.linux-arm.txt
new file mode 100644
index 0000000..678711b
--- /dev/null
+++ b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.linux-arm.txt
@@ -0,0 +1,14 @@
+golang.org/toolchain@v0.0.1-go1.999testmod.linux-arm
+
+-- .mod --
+module golang.org/toolchain
+-- .info --
+{"Version":"v0.0.1-go1.999testmod.linux-arm"}
+-- go.mod --
+module golang.org/toolchain
+-- bin/go --
+#!/bin/sh
+echo go1.999testmod here!
+-- bin/gofmt --
+echo i am unused
+-- pkg/tool/fake --
diff --git a/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.linux-arm64.txt b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.linux-arm64.txt
new file mode 100644
index 0000000..bb305ab
--- /dev/null
+++ b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.linux-arm64.txt
@@ -0,0 +1,14 @@
+golang.org/toolchain@v0.0.1-go1.999testmod.linux-arm64
+
+-- .mod --
+module golang.org/toolchain
+-- .info --
+{"Version":"v0.0.1-go1.999testmod.linux-arm64"}
+-- go.mod --
+module golang.org/toolchain
+-- bin/go --
+#!/bin/sh
+echo go1.999testmod here!
+-- bin/gofmt --
+echo i am unused
+-- pkg/tool/fake --
diff --git a/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.linux-loong64.txt b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.linux-loong64.txt
new file mode 100644
index 0000000..52a23d4
--- /dev/null
+++ b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.linux-loong64.txt
@@ -0,0 +1,14 @@
+golang.org/toolchain@v0.0.1-go1.999testmod.linux-loong64
+
+-- .mod --
+module golang.org/toolchain
+-- .info --
+{"Version":"v0.0.1-go1.999testmod.linux-loong64"}
+-- go.mod --
+module golang.org/toolchain
+-- bin/go --
+#!/bin/sh
+echo go1.999testmod here!
+-- bin/gofmt --
+echo i am unused
+-- pkg/tool/fake --
diff --git a/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.linux-mips64x.txt b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.linux-mips64x.txt
new file mode 100644
index 0000000..79fff13
--- /dev/null
+++ b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.linux-mips64x.txt
@@ -0,0 +1,14 @@
+golang.org/toolchain@v0.0.1-go1.999testmod.linux-mips64x
+
+-- .mod --
+module golang.org/toolchain
+-- .info --
+{"Version":"v0.0.1-go1.999testmod.linux-mips64x"}
+-- go.mod --
+module golang.org/toolchain
+-- bin/go --
+#!/bin/sh
+echo go1.999testmod here!
+-- bin/gofmt --
+echo i am unused
+-- pkg/tool/fake --
diff --git a/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.linux-mipsx.txt b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.linux-mipsx.txt
new file mode 100644
index 0000000..a725626
--- /dev/null
+++ b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.linux-mipsx.txt
@@ -0,0 +1,14 @@
+golang.org/toolchain@v0.0.1-go1.999testmod.linux-mipsx
+
+-- .mod --
+module golang.org/toolchain
+-- .info --
+{"Version":"v0.0.1-go1.999testmod.linux-mipsx"}
+-- go.mod --
+module golang.org/toolchain
+-- bin/go --
+#!/bin/sh
+echo go1.999testmod here!
+-- bin/gofmt --
+echo i am unused
+-- pkg/tool/fake --
diff --git a/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.linux-ppc64.txt b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.linux-ppc64.txt
new file mode 100644
index 0000000..f25ae8e
--- /dev/null
+++ b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.linux-ppc64.txt
@@ -0,0 +1,14 @@
+golang.org/toolchain@v0.0.1-go1.999testmod.linux-ppc64
+
+-- .mod --
+module golang.org/toolchain
+-- .info --
+{"Version":"v0.0.1-go1.999testmod.linux-ppc64"}
+-- go.mod --
+module golang.org/toolchain
+-- bin/go --
+#!/bin/sh
+echo go1.999testmod here!
+-- bin/gofmt --
+echo i am unused
+-- pkg/tool/fake --
diff --git a/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.linux-ppc64le.txt b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.linux-ppc64le.txt
new file mode 100644
index 0000000..e22b8ee
--- /dev/null
+++ b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.linux-ppc64le.txt
@@ -0,0 +1,14 @@
+golang.org/toolchain@v0.0.1-go1.999testmod.linux-ppc64le
+
+-- .mod --
+module golang.org/toolchain
+-- .info --
+{"Version":"v0.0.1-go1.999testmod.linux-ppc64le"}
+-- go.mod --
+module golang.org/toolchain
+-- bin/go --
+#!/bin/sh
+echo go1.999testmod here!
+-- bin/gofmt --
+echo i am unused
+-- pkg/tool/fake --
diff --git a/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.linux-riscv64.txt b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.linux-riscv64.txt
new file mode 100644
index 0000000..2e15fe3
--- /dev/null
+++ b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.linux-riscv64.txt
@@ -0,0 +1,14 @@
+golang.org/toolchain@v0.0.1-go1.999testmod.linux-riscv64
+
+-- .mod --
+module golang.org/toolchain
+-- .info --
+{"Version":"v0.0.1-go1.999testmod.linux-riscv64"}
+-- go.mod --
+module golang.org/toolchain
+-- bin/go --
+#!/bin/sh
+echo go1.999testmod here!
+-- bin/gofmt --
+echo i am unused
+-- pkg/tool/fake --
diff --git a/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.linux-s390x.txt b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.linux-s390x.txt
new file mode 100644
index 0000000..1022ee4
--- /dev/null
+++ b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.linux-s390x.txt
@@ -0,0 +1,14 @@
+golang.org/toolchain@v0.0.1-go1.999testmod.linux-s390x
+
+-- .mod --
+module golang.org/toolchain
+-- .info --
+{"Version":"v0.0.1-go1.999testmod.linux-s390x"}
+-- go.mod --
+module golang.org/toolchain
+-- bin/go --
+#!/bin/sh
+echo go1.999testmod here!
+-- bin/gofmt --
+echo i am unused
+-- pkg/tool/fake --
diff --git a/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.netbsd-386.txt b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.netbsd-386.txt
new file mode 100644
index 0000000..8b7b156
--- /dev/null
+++ b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.netbsd-386.txt
@@ -0,0 +1,14 @@
+golang.org/toolchain@v0.0.1-go1.999testmod.netbsd-386
+
+-- .mod --
+module golang.org/toolchain
+-- .info --
+{"Version":"v0.0.1-go1.999testmod.netbsd-386"}
+-- go.mod --
+module golang.org/toolchain
+-- bin/go --
+#!/bin/sh
+echo go1.999testmod here!
+-- bin/gofmt --
+echo i am unused
+-- pkg/tool/fake --
diff --git a/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.netbsd-amd64.txt b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.netbsd-amd64.txt
new file mode 100644
index 0000000..ebdb407
--- /dev/null
+++ b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.netbsd-amd64.txt
@@ -0,0 +1,14 @@
+golang.org/toolchain@v0.0.1-go1.999testmod.netbsd-amd64
+
+-- .mod --
+module golang.org/toolchain
+-- .info --
+{"Version":"v0.0.1-go1.999testmod.netbsd-amd64"}
+-- go.mod --
+module golang.org/toolchain
+-- bin/go --
+#!/bin/sh
+echo go1.999testmod here!
+-- bin/gofmt --
+echo i am unused
+-- pkg/tool/fake --
diff --git a/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.netbsd-arm.txt b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.netbsd-arm.txt
new file mode 100644
index 0000000..fcacf08
--- /dev/null
+++ b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.netbsd-arm.txt
@@ -0,0 +1,14 @@
+golang.org/toolchain@v0.0.1-go1.999testmod.netbsd-arm
+
+-- .mod --
+module golang.org/toolchain
+-- .info --
+{"Version":"v0.0.1-go1.999testmod.netbsd-arm"}
+-- go.mod --
+module golang.org/toolchain
+-- bin/go --
+#!/bin/sh
+echo go1.999testmod here!
+-- bin/gofmt --
+echo i am unused
+-- pkg/tool/fake --
diff --git a/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.netbsd-arm64.txt b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.netbsd-arm64.txt
new file mode 100644
index 0000000..c2bd257
--- /dev/null
+++ b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.netbsd-arm64.txt
@@ -0,0 +1,14 @@
+golang.org/toolchain@v0.0.1-go1.999testmod.netbsd-arm64
+
+-- .mod --
+module golang.org/toolchain
+-- .info --
+{"Version":"v0.0.1-go1.999testmod.netbsd-arm64"}
+-- go.mod --
+module golang.org/toolchain
+-- bin/go --
+#!/bin/sh
+echo go1.999testmod here!
+-- bin/gofmt --
+echo i am unused
+-- pkg/tool/fake --
diff --git a/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.openbsd-386.txt b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.openbsd-386.txt
new file mode 100644
index 0000000..965a054
--- /dev/null
+++ b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.openbsd-386.txt
@@ -0,0 +1,14 @@
+golang.org/toolchain@v0.0.1-go1.999testmod.openbsd-386
+
+-- .mod --
+module golang.org/toolchain
+-- .info --
+{"Version":"v0.0.1-go1.999testmod.openbsd-386"}
+-- go.mod --
+module golang.org/toolchain
+-- bin/go --
+#!/bin/sh
+echo go1.999testmod here!
+-- bin/gofmt --
+echo i am unused
+-- pkg/tool/fake --
diff --git a/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.openbsd-amd64.txt b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.openbsd-amd64.txt
new file mode 100644
index 0000000..1acb7a3
--- /dev/null
+++ b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.openbsd-amd64.txt
@@ -0,0 +1,14 @@
+golang.org/toolchain@v0.0.1-go1.999testmod.openbsd-amd64
+
+-- .mod --
+module golang.org/toolchain
+-- .info --
+{"Version":"v0.0.1-go1.999testmod.openbsd-amd64"}
+-- go.mod --
+module golang.org/toolchain
+-- bin/go --
+#!/bin/sh
+echo go1.999testmod here!
+-- bin/gofmt --
+echo i am unused
+-- pkg/tool/fake --
diff --git a/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.openbsd-arm.txt b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.openbsd-arm.txt
new file mode 100644
index 0000000..0e47d9c
--- /dev/null
+++ b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.openbsd-arm.txt
@@ -0,0 +1,14 @@
+golang.org/toolchain@v0.0.1-go1.999testmod.openbsd-arm
+
+-- .mod --
+module golang.org/toolchain
+-- .info --
+{"Version":"v0.0.1-go1.999testmod.openbsd-arm"}
+-- go.mod --
+module golang.org/toolchain
+-- bin/go --
+#!/bin/sh
+echo go1.999testmod here!
+-- bin/gofmt --
+echo i am unused
+-- pkg/tool/fake --
diff --git a/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.openbsd-arm64.txt b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.openbsd-arm64.txt
new file mode 100644
index 0000000..8c99161
--- /dev/null
+++ b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.openbsd-arm64.txt
@@ -0,0 +1,14 @@
+golang.org/toolchain@v0.0.1-go1.999testmod.openbsd-arm64
+
+-- .mod --
+module golang.org/toolchain
+-- .info --
+{"Version":"v0.0.1-go1.999testmod.openbsd-arm64"}
+-- go.mod --
+module golang.org/toolchain
+-- bin/go --
+#!/bin/sh
+echo go1.999testmod here!
+-- bin/gofmt --
+echo i am unused
+-- pkg/tool/fake --
diff --git a/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.openbsd-mips64.txt b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.openbsd-mips64.txt
new file mode 100644
index 0000000..6c7cdfb
--- /dev/null
+++ b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.openbsd-mips64.txt
@@ -0,0 +1,14 @@
+golang.org/toolchain@v0.0.1-go1.999testmod.openbsd-mips64
+
+-- .mod --
+module golang.org/toolchain
+-- .info --
+{"Version":"v0.0.1-go1.999testmod.openbsd-mips64"}
+-- go.mod --
+module golang.org/toolchain
+-- bin/go --
+#!/bin/sh
+echo go1.999testmod here!
+-- bin/gofmt --
+echo i am unused
+-- pkg/tool/fake --
diff --git a/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.plan9-386.txt b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.plan9-386.txt
new file mode 100644
index 0000000..26f7209
--- /dev/null
+++ b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.plan9-386.txt
@@ -0,0 +1,14 @@
+golang.org/toolchain@v0.0.1-go1.999testmod.plan9-386
+
+-- .mod --
+module golang.org/toolchain
+-- .info --
+{"Version":"v0.0.1-go1.999testmod.plan9-386"}
+-- go.mod --
+module golang.org/toolchain
+-- bin/go --
+#!/bin/rc
+echo go1.999testmod here!
+-- bin/gofmt --
+echo i am unused
+-- pkg/tool/fake --
diff --git a/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.plan9-amd64.txt b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.plan9-amd64.txt
new file mode 100644
index 0000000..7cf1dde
--- /dev/null
+++ b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.plan9-amd64.txt
@@ -0,0 +1,14 @@
+golang.org/toolchain@v0.0.1-go1.999testmod.plan9-amd64
+
+-- .mod --
+module golang.org/toolchain
+-- .info --
+{"Version":"v0.0.1-go1.999testmod.plan9-amd64"}
+-- go.mod --
+module golang.org/toolchain
+-- bin/go --
+#!/bin/rc
+echo go1.999testmod here!
+-- bin/gofmt --
+echo i am unused
+-- pkg/tool/fake --
diff --git a/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.plan9-arm.txt b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.plan9-arm.txt
new file mode 100644
index 0000000..3c3b6a7
--- /dev/null
+++ b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.plan9-arm.txt
@@ -0,0 +1,14 @@
+golang.org/toolchain@v0.0.1-go1.999testmod.plan9-arm
+
+-- .mod --
+module golang.org/toolchain
+-- .info --
+{"Version":"v0.0.1-go1.999testmod.plan9-arm"}
+-- go.mod --
+module golang.org/toolchain
+-- bin/go --
+#!/bin/rc
+echo go1.999testmod here!
+-- bin/gofmt --
+echo i am unused
+-- pkg/tool/fake --
diff --git a/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.solaris-amd64.txt b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.solaris-amd64.txt
new file mode 100644
index 0000000..a750aaf
--- /dev/null
+++ b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.solaris-amd64.txt
@@ -0,0 +1,14 @@
+golang.org/toolchain@v0.0.1-go1.999testmod.solaris-amd64
+
+-- .mod --
+module golang.org/toolchain
+-- .info --
+{"Version":"v0.0.1-go1.999testmod.solaris-amd64"}
+-- go.mod --
+module golang.org/toolchain
+-- bin/go --
+#!/bin/sh
+echo go1.999testmod here!
+-- bin/gofmt --
+echo i am unused
+-- pkg/tool/fake --
diff --git a/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.windows-386.txt b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.windows-386.txt
new file mode 100644
index 0000000..ca0f7aa
--- /dev/null
+++ b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.windows-386.txt
@@ -0,0 +1,10 @@
+golang.org/toolchain@v0.0.1-go1.999testmod.windows-386
+
+-- .mod --
+module golang.org/toolchain
+-- .info --
+{"Version":"v0.0.1-go1.999testmod.windows-386"}
+-- go.mod --
+module golang.org/toolchain
+-- bin/go.bat --
+@echo go1.999testmod here!
diff --git a/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.windows-amd64.txt b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.windows-amd64.txt
new file mode 100644
index 0000000..44e16c7
--- /dev/null
+++ b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.windows-amd64.txt
@@ -0,0 +1,10 @@
+golang.org/toolchain@v0.0.1-go1.999testmod.windows-amd64
+
+-- .mod --
+module golang.org/toolchain
+-- .info --
+{"Version":"v0.0.1-go1.999testmod.windows-amd64"}
+-- go.mod --
+module golang.org/toolchain
+-- bin/go.bat --
+@echo go1.999testmod here!
diff --git a/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.windows-arm.txt b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.windows-arm.txt
new file mode 100644
index 0000000..ee4e016
--- /dev/null
+++ b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.windows-arm.txt
@@ -0,0 +1,10 @@
+golang.org/toolchain@v0.0.1-go1.999testmod.windows-arm
+
+-- .mod --
+module golang.org/toolchain
+-- .info --
+{"Version":"v0.0.1-go1.999testmod.windows-arm"}
+-- go.mod --
+module golang.org/toolchain
+-- bin/go.bat --
+@echo go1.999testmod here!
diff --git a/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.windows-arm64.txt b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.windows-arm64.txt
new file mode 100644
index 0000000..be3ff80
--- /dev/null
+++ b/src/cmd/go/testdata/mod/golang.org_toolchain_v0.0.1-go1.999testmod.windows-arm64.txt
@@ -0,0 +1,10 @@
+golang.org/toolchain@v0.0.1-go1.999testmod.windows-arm64
+
+-- .mod --
+module golang.org/toolchain
+-- .info --
+{"Version":"v0.0.1-go1.999testmod.windows-arm64"}
+-- go.mod --
+module golang.org/toolchain
+-- bin/go.bat --
+@echo go1.999testmod here!
diff --git a/src/cmd/go/testdata/mod/rsc.io_fortune_v0.0.1.txt b/src/cmd/go/testdata/mod/rsc.io_fortune_v0.0.1.txt
new file mode 100644
index 0000000..644695c
--- /dev/null
+++ b/src/cmd/go/testdata/mod/rsc.io_fortune_v0.0.1.txt
@@ -0,0 +1,21 @@
+rsc.io/fortune 0.0.1
+written by hand
+
+-- .mod --
+module rsc.io/fortune
+go 1.21rc999
+
+-- go.mod --
+module rsc.io/fortune
+go 1.21rc999
+
+-- .info --
+{"Version":"v0.0.1"}
+-- fortune.go --
+package main
+
+import "rsc.io/quote"
+
+func main() {
+	println(quote.Hello())
+}
diff --git a/src/cmd/go/testdata/mod/rsc.io_future_v1.0.0.txt b/src/cmd/go/testdata/mod/rsc.io_future_v1.0.0.txt
new file mode 100644
index 0000000..d3826a3
--- /dev/null
+++ b/src/cmd/go/testdata/mod/rsc.io_future_v1.0.0.txt
@@ -0,0 +1,16 @@
+rsc.io/future v1.0.0
+written by hand
+
+-- .mod --
+module rsc.io/future
+go 1.999
+-- .info --
+{"Version":"v1.0.0"}
+-- main.go --
+package main
+
+func main() {
+}
+-- go.mod --
+module rsc.io/future
+go 1.999
diff --git a/src/cmd/go/testdata/mod/rsc.io_needall_v0.0.1.txt b/src/cmd/go/testdata/mod/rsc.io_needall_v0.0.1.txt
new file mode 100644
index 0000000..0a1582a
--- /dev/null
+++ b/src/cmd/go/testdata/mod/rsc.io_needall_v0.0.1.txt
@@ -0,0 +1,25 @@
+rsc.io/needall 0.0.1
+written by hand
+
+-- .mod --
+module rsc.io/needall
+go 1.23
+
+require rsc.io/needgo121 v0.0.1
+require rsc.io/needgo122 v0.0.1
+require rsc.io/needgo123 v0.0.1
+
+-- go.mod --
+module rsc.io/needall
+go 1.23
+
+require rsc.io/needgo121 v0.0.1
+require rsc.io/needgo122 v0.0.1
+require rsc.io/needgo123 v0.0.1
+
+-- .info --
+{"Version":"v0.0.1"}
+-- p.go --
+package p
+
+func F() {}
diff --git a/src/cmd/go/testdata/mod/rsc.io_needgo1183_v0.0.1.txt b/src/cmd/go/testdata/mod/rsc.io_needgo1183_v0.0.1.txt
new file mode 100644
index 0000000..a41296e
--- /dev/null
+++ b/src/cmd/go/testdata/mod/rsc.io_needgo1183_v0.0.1.txt
@@ -0,0 +1,17 @@
+rsc.io/needgo1183 v0.0.1
+written by hand
+
+-- .mod --
+module rsc.io/needgo1183
+go 1.18.3
+
+-- go.mod --
+module rsc.io/needgo1183
+go 1.18.3
+
+-- .info --
+{"Version":"v0.0.1"}
+-- p.go --
+package p
+
+func F() {}
diff --git a/src/cmd/go/testdata/mod/rsc.io_needgo118_v0.0.1.txt b/src/cmd/go/testdata/mod/rsc.io_needgo118_v0.0.1.txt
new file mode 100644
index 0000000..805eac7
--- /dev/null
+++ b/src/cmd/go/testdata/mod/rsc.io_needgo118_v0.0.1.txt
@@ -0,0 +1,17 @@
+rsc.io/needgo118 0.0.1
+written by hand
+
+-- .mod --
+module rsc.io/needgo118
+go 1.18
+
+-- go.mod --
+module rsc.io/needgo118
+go 1.18
+
+-- .info --
+{"Version":"v0.0.1"}
+-- p.go --
+package p
+
+func F() {}
diff --git a/src/cmd/go/testdata/mod/rsc.io_needgo121_v0.0.1.txt b/src/cmd/go/testdata/mod/rsc.io_needgo121_v0.0.1.txt
new file mode 100644
index 0000000..5b05960
--- /dev/null
+++ b/src/cmd/go/testdata/mod/rsc.io_needgo121_v0.0.1.txt
@@ -0,0 +1,17 @@
+rsc.io/needgo121 0.0.1
+written by hand
+
+-- .mod --
+module rsc.io/needgo121
+go 1.21
+
+-- go.mod --
+module rsc.io/needgo121
+go 1.21
+
+-- .info --
+{"Version":"v0.0.1"}
+-- p.go --
+package p
+
+func F() {}
diff --git a/src/cmd/go/testdata/mod/rsc.io_needgo1223_v0.0.1.txt b/src/cmd/go/testdata/mod/rsc.io_needgo1223_v0.0.1.txt
new file mode 100644
index 0000000..f166a82
--- /dev/null
+++ b/src/cmd/go/testdata/mod/rsc.io_needgo1223_v0.0.1.txt
@@ -0,0 +1,17 @@
+rsc.io/needgo1223 0.0.1
+written by hand
+
+-- .mod --
+module rsc.io/needgo1223
+go 1.22.3
+
+-- go.mod --
+module rsc.io/needgo1223
+go 1.22.3
+
+-- .info --
+{"Version":"v0.0.1"}
+-- p.go --
+package p
+
+func F() {}
diff --git a/src/cmd/go/testdata/mod/rsc.io_needgo122_v0.0.1.txt b/src/cmd/go/testdata/mod/rsc.io_needgo122_v0.0.1.txt
new file mode 100644
index 0000000..59116eb
--- /dev/null
+++ b/src/cmd/go/testdata/mod/rsc.io_needgo122_v0.0.1.txt
@@ -0,0 +1,17 @@
+rsc.io/needgo122 0.0.1
+written by hand
+
+-- .mod --
+module rsc.io/needgo122
+go 1.22
+
+-- go.mod --
+module rsc.io/needgo122
+go 1.22
+
+-- .info --
+{"Version":"v0.0.1"}
+-- p.go --
+package p
+
+func F() {}
diff --git a/src/cmd/go/testdata/mod/rsc.io_needgo123_v0.0.1.txt b/src/cmd/go/testdata/mod/rsc.io_needgo123_v0.0.1.txt
new file mode 100644
index 0000000..0ec5571
--- /dev/null
+++ b/src/cmd/go/testdata/mod/rsc.io_needgo123_v0.0.1.txt
@@ -0,0 +1,17 @@
+rsc.io/needgo123 0.0.1
+written by hand
+
+-- .mod --
+module rsc.io/needgo123
+go 1.23
+
+-- go.mod --
+module rsc.io/needgo123
+go 1.23
+
+-- .info --
+{"Version":"v0.0.1"}
+-- p.go --
+package p
+
+func F() {}
diff --git a/src/cmd/go/testdata/mod/rsc.io_needgo124_v0.0.1.txt b/src/cmd/go/testdata/mod/rsc.io_needgo124_v0.0.1.txt
new file mode 100644
index 0000000..634f504
--- /dev/null
+++ b/src/cmd/go/testdata/mod/rsc.io_needgo124_v0.0.1.txt
@@ -0,0 +1,17 @@
+rsc.io/needgo124 0.0.1
+written by hand
+
+-- .mod --
+module rsc.io/needgo124
+go 1.24
+
+-- go.mod --
+module rsc.io/needgo124
+go 1.24
+
+-- .info --
+{"Version":"v0.0.1"}
+-- p.go --
+package p
+
+func F() {}
diff --git a/src/cmd/go/testdata/mod/rsc.io_panicnil_v1.0.0.txt b/src/cmd/go/testdata/mod/rsc.io_panicnil_v1.0.0.txt
new file mode 100644
index 0000000..6ea1b22
--- /dev/null
+++ b/src/cmd/go/testdata/mod/rsc.io_panicnil_v1.0.0.txt
@@ -0,0 +1,13 @@
+rsc.io/panicnil v1.0.0
+written by hand
+
+-- .mod --
+module rsc.io/panicnil
+-- .info --
+{"Version":"v1.0.0"}
+-- fortune.go --
+package main
+
+func main() {
+	panic(nil)
+}
diff --git a/src/cmd/go/testdata/mod/rsc.io_panicnil_v1.1.0.txt b/src/cmd/go/testdata/mod/rsc.io_panicnil_v1.1.0.txt
new file mode 100644
index 0000000..fe67a88
--- /dev/null
+++ b/src/cmd/go/testdata/mod/rsc.io_panicnil_v1.1.0.txt
@@ -0,0 +1,14 @@
+rsc.io/panicnil v1.1.0
+written by hand
+
+-- .mod --
+module rsc.io/panicnil
+go 1.21
+-- .info --
+{"Version":"v1.1.0"}
+-- fortune.go --
+package main
+
+func main() {
+	panic(nil)
+}
diff --git a/src/cmd/go/testdata/savedir.go b/src/cmd/go/testdata/savedir.go
index eaafc5e..9a3ed50 100644
--- a/src/cmd/go/testdata/savedir.go
+++ b/src/cmd/go/testdata/savedir.go
@@ -12,7 +12,6 @@
 //	go run savedir.go /path/to/dir >saved.txt
 //
 // Typically the tree is later extracted during a test with tg.extract("testdata/saved.txt").
-//
 package main
 
 import (
@@ -70,7 +69,7 @@
 			log.Printf("%s: ignoring invalid UTF-8 data", path)
 			return nil
 		}
-		a.Files = append(a.Files, txtar.File{Name: strings.TrimPrefix(path, dir+string(filepath.Separator)), Data: data})
+		a.Files = append(a.Files, txtar.File{Name: str.TrimFilePathPrefix(path, dir), Data: data})
 		return nil
 	})
 
diff --git a/src/cmd/go/testdata/script/README b/src/cmd/go/testdata/script/README
index 7b74799..792a158 100644
--- a/src/cmd/go/testdata/script/README
+++ b/src/cmd/go/testdata/script/README
@@ -380,8 +380,12 @@
 	go supports -buildmode=<suffix>
 [case-sensitive]
 	$WORK filesystem is case-sensitive
+[cc:*]
+	go env CC = <suffix> (ignoring the go/env file)
 [cgo]
 	host CGO_ENABLED
+[cgolinkext]
+	platform requires external linking for cgo
 [compiler:*]
 	runtime.Compiler == <suffix>
 [cross]
@@ -394,14 +398,18 @@
 	GOOS/GOARCH supports -fuzz with instrumentation
 [git]
 	the 'git' executable exists and provides the standard CLI
+[go-builder]
+	GO_BUILDER_NAME is non-empty
 [link]
 	testenv.HasLink()
 [mismatched-goroot]
 	test's GOROOT_FINAL does not match the real GOROOT
 [msan]
 	GOOS/GOARCH supports -msan
-[net]
-	testenv.HasExternalNetwork()
+[mustlinkext]
+	platform always requires external linking
+[net:*]
+	can connect to external network host <suffix>
 [race]
 	GOOS/GOARCH supports -race
 [root]
diff --git a/src/cmd/go/testdata/script/build_cwd_newline.txt b/src/cmd/go/testdata/script/build_cwd_newline.txt
new file mode 100644
index 0000000..91cb57f
--- /dev/null
+++ b/src/cmd/go/testdata/script/build_cwd_newline.txt
@@ -0,0 +1,138 @@
+[GOOS:windows] skip 'filesystem normalizes / to \'
+[GOOS:plan9] skip 'filesystem disallows \n in paths'
+
+# If the directory path containing a package to be built includes a newline,
+# the go command should refuse to even try to build the package.
+
+env DIR=$WORK${/}${newline}'package main'${newline}'func main() { panic("uh-oh")'${newline}'/*'
+
+mkdir $DIR
+cd $DIR
+exec pwd
+cp $WORK/go.mod ./go.mod
+cp $WORK/main.go ./main.go
+cp $WORK/main_nocgo.go ./main_nocgo.go
+cp $WORK/main_test.go ./main_test.go
+
+! go build -o $devnull .
+stderr 'package example: invalid package directory .*uh-oh'
+
+[cgo] ! go build -o $devnull main.go
+[!cgo] ! go build -o $devnull main_nocgo.go
+stderr 'package command-line-arguments: invalid package directory .*uh-oh'
+
+! go run .
+stderr 'package example: invalid package directory .*uh-oh'
+
+[cgo] ! go run main.go
+[!cgo] ! go run main_nocgo.go
+stderr 'package command-line-arguments: invalid package directory .*uh-oh'
+
+! go test .
+stderr 'package example: invalid package directory .*uh-oh'
+
+[cgo] ! go test -v main.go main_test.go
+[!cgo] ! go test -v main_nocgo.go main_test.go
+stderr 'package command-line-arguments: invalid package directory .*uh-oh'
+
+go list -compiled -e -f '{{with .CompiledGoFiles}}{{.}}{{end}}' .
+! stdout .
+! stderr .
+! exists obj_
+
+
+# The cgo tool should only accept the source file if the working directory
+# is not written in line directives in the resulting files.
+
+[cgo] ! go tool cgo main.go
+[cgo] stderr 'cgo: input path contains newline character: .*uh-oh'
+[cgo] ! exists _obj
+
+[cgo] go tool cgo -trimpath=$PWD main.go
+[cgo] grep '//line main\.go:1:1' _obj/main.cgo1.go
+[cgo] ! grep 'uh-oh' _obj/main.cgo1.go
+[cgo] rm _obj
+
+
+# Since we do preserve $PWD (or set it appropriately) for commands, and we do
+# not resolve symlinks unnecessarily, referring to the contents of the unsafe
+# directory via a safe symlink should be ok, and should not inject the data from
+# the symlink target path.
+
+[!symlink] stop 'remainder of test checks symlink behavior'
+[short] stop 'links and runs binaries'
+
+symlink $WORK${/}link -> $DIR
+
+[cgo] go run $WORK${/}link${/}main.go
+[!cgo] go run $WORK${/}link${/}main_nocgo.go
+! stdout panic
+! stderr panic
+stderr '^ok$'
+
+[cgo] go test -v $WORK${/}link${/}main.go $WORK${/}link${/}main_test.go
+[!cgo] go test -v $WORK${/}link${/}main_nocgo.go $WORK${/}link${/}main_test.go
+! stdout panic
+! stderr panic
+stdout '^ok$'   # 'go test' combines the test's stdout into stderr
+
+cd $WORK/link
+
+[cgo] ! go run $DIR${/}main.go
+[!cgo] ! go run $DIR${/}main_nocgo.go
+stderr 'package command-line-arguments: invalid package directory .*uh-oh'
+
+go run .
+! stdout panic
+! stderr panic
+stderr '^ok$'
+
+[cgo] go run main.go
+[!cgo] go run main_nocgo.go
+! stdout panic
+! stderr panic
+stderr '^ok$'
+
+go test -v
+! stdout panic
+! stderr panic
+stdout '^ok$'  # 'go test' combines the test's stdout into stderr
+
+go test -v .
+! stdout panic
+! stderr panic
+stdout '^ok$'  # 'go test' combines the test's stdout into stderr
+
+[cgo] go tool cgo main.go
+[cgo] grep '//line .*'${/}'link'${/}'main\.go:1:1' _obj/main.cgo1.go
+[cgo] ! grep 'uh-oh' _obj/main.cgo1.go
+
+-- $WORK/go.mod --
+module example
+go 1.19
+-- $WORK/main.go --
+package main
+
+import "C"
+
+func main() {
+	/* nothing here */
+	println("ok")
+}
+-- $WORK/main_nocgo.go --
+//go:build !cgo
+
+package main
+
+func main() {
+	/* nothing here */
+	println("ok")
+}
+-- $WORK/main_test.go --
+package main
+
+import "testing"
+
+func TestMain(*testing.M) {
+	main()
+}
diff --git a/src/cmd/go/testdata/script/build_gcflags_order.txt b/src/cmd/go/testdata/script/build_gcflags_order.txt
index 0ffe157..3725c89 100644
--- a/src/cmd/go/testdata/script/build_gcflags_order.txt
+++ b/src/cmd/go/testdata/script/build_gcflags_order.txt
@@ -4,6 +4,8 @@
 cd m
 go build -n -gcflags=-lang=go1.17
 stderr ' -lang=go1.16.* -lang=go1.17'
+! go build -gcflags='-c 0'
+stderr 'compile: -c must be at least 1, got 0'
 
 -- m/go.mod --
 module example.com
diff --git a/src/cmd/go/testdata/script/build_issue59571.txt b/src/cmd/go/testdata/script/build_issue59571.txt
new file mode 100644
index 0000000..2cf3259
--- /dev/null
+++ b/src/cmd/go/testdata/script/build_issue59571.txt
@@ -0,0 +1,40 @@
+# Regression test for https://go.dev/issue/59571
+# Build should be reproducible, even with aliased generic types.
+
+go build -a -o 1.a
+go build -a -o 2.a
+cmp -q 1.a 2.a
+
+-- go.mod --
+module m
+
+go 1.20
+-- m.go --
+package m
+
+type (
+	SliceFlag[T any] struct{}
+
+	Alias1  = SliceFlag[[1]int]
+	Alias2  = SliceFlag[[2]int]
+	Alias3  = SliceFlag[[3]int]
+	Alias4  = SliceFlag[[4]int]
+	Alias5  = SliceFlag[[5]int]
+	Alias6  = SliceFlag[[6]int]
+	Alias7  = SliceFlag[[7]int]
+	Alias8  = SliceFlag[[8]int]
+	Alias9  = SliceFlag[[9]int]
+	Alias10 = SliceFlag[[10]int]
+	Alias11 = SliceFlag[[11]int]
+	Alias12 = SliceFlag[[12]int]
+	Alias13 = SliceFlag[[13]int]
+	Alias14 = SliceFlag[[14]int]
+	Alias15 = SliceFlag[[15]int]
+	Alias16 = SliceFlag[[16]int]
+	Alias17 = SliceFlag[[17]int]
+	Alias18 = SliceFlag[[18]int]
+	Alias19 = SliceFlag[[19]int]
+	Alias20 = SliceFlag[[20]int]
+)
+
+func (x *SliceFlag[T]) String() string { return "zzz" }
diff --git a/src/cmd/go/testdata/script/build_pgo.txt b/src/cmd/go/testdata/script/build_pgo.txt
index 65ecd57..3b0804b 100644
--- a/src/cmd/go/testdata/script/build_pgo.txt
+++ b/src/cmd/go/testdata/script/build_pgo.txt
@@ -1,24 +1,29 @@
 # Test go build -pgo flag.
 # Specifically, the build cache handles profile content correctly.
 
-# this test rebuild runtime with different flags, skip in short mode
-[short] skip
+[short] skip 'compiles and links executables'
 
 # build without PGO
 go build triv.go
 
 # build with PGO, should trigger rebuild
 # starting with an empty profile (the compiler accepts it)
-go build -x -pgo=prof triv.go
+go build -x -pgo=prof -o triv.exe triv.go
 stderr 'compile.*-pgoprofile=.*prof.*triv.go'
 
+# check that PGO appears in build info
+# N.B. we can't start the stdout check with -pgo because the script assumes that
+# if the first arg starts with - it is a grep flag.
+go version -m triv.exe
+stdout 'build\s+-pgo=.*'${/}'prof'
+
 # store the build ID
 go list -export -json=BuildID -pgo=prof triv.go
 stdout '"BuildID":' # check that output actually contains a build ID
 cp stdout list.out
 
 # build again with the same profile, should be cached
-go build -x -pgo=prof triv.go
+go build -x -pgo=prof -o triv.exe triv.go
 ! stderr 'compile.*triv.go'
 
 # check that the build ID is the same
@@ -36,6 +41,13 @@
 go list -export -json=BuildID -pgo=prof triv.go
 ! cmp stdout list.out
 
+# build with trimpath, buildinfo path should be trimmed
+go build -x -pgo=prof -trimpath -o triv.exe triv.go
+
+# check that path is trimmed
+go version -m triv.exe
+stdout 'build\s+-pgo=prof'
+
 -- prof --
 -- triv.go --
 package main
diff --git a/src/cmd/go/testdata/script/build_pgo_auto.txt b/src/cmd/go/testdata/script/build_pgo_auto.txt
index b78137d..5dd799a 100644
--- a/src/cmd/go/testdata/script/build_pgo_auto.txt
+++ b/src/cmd/go/testdata/script/build_pgo_auto.txt
@@ -1,33 +1,42 @@
 # Test go build -pgo=auto flag.
 
+[short] skip 'compiles and links executables'
+
 # use default.pgo for a single main package
-go build -n -pgo=auto ./a/a1
+go build -n -pgo=auto -o a1.exe ./a/a1
 stderr 'compile.*-pgoprofile=.*default\.pgo.*a1.go'
 
 # check that pgo applied to dependencies
 stderr 'compile.*-p test/dep.*-pgoprofile=.*default\.pgo'
 
+# check that pgo appears in build info
+# N.B. we can't start the stdout check with -pgo because the script assumes that
+# if the first arg starts with - it is a grep flag.
+stderr 'build\\t-pgo=.*default\.pgo'
+
 # use default.pgo for ... with a single main package
 go build -n -pgo=auto ./a/...
 stderr 'compile.*-pgoprofile=.*default\.pgo.*a1.go'
 
-# error with multiple packages
-! go build -n -pgo=auto ./b/...
-stderr '-pgo=auto requires exactly one main package'
+# check that pgo appears in build info
+stderr 'build\\t-pgo=.*default\.pgo'
 
 # build succeeds without PGO when default.pgo file is absent
 go build -n -pgo=auto -o nopgo.exe ./nopgo
 stderr 'compile.*nopgo.go'
-! stderr '-pgoprofile'
+! stderr 'compile.*-pgoprofile'
+
+# check that pgo doesn't appear in build info
+! stderr 'build\\t-pgo='
 
 # other build-related commands
-go install -n -pgo=auto ./a/a1
+go install -a -n -pgo=auto ./a/a1
 stderr 'compile.*-pgoprofile=.*default\.pgo.*a1.go'
 
-go run -n -pgo=auto ./a/a1
+go run -a -n -pgo=auto ./a/a1
 stderr 'compile.*-pgoprofile=.*default\.pgo.*a1.go'
 
-go test -n -pgo=auto ./a/a1
+go test -a -n -pgo=auto ./a/a1
 stderr 'compile.*-pgoprofile=.*default\.pgo.*a1.go.*a1_test.go'
 stderr 'compile.*-pgoprofile=.*default\.pgo.*external_test.go'
 
@@ -38,6 +47,30 @@
 
 go list -deps -pgo=auto ./a/a1
 
+# -pgo=auto is the default. Commands without explicit -pgo=auto
+# should work as -pgo=auto.
+go build -a -n -o a1.exe ./a/a1
+stderr 'compile.*-pgoprofile=.*default\.pgo.*a1.go'
+stderr 'compile.*-p test/dep.*-pgoprofile=.*default\.pgo'
+
+# check that pgo appears in build info
+stderr 'build\\t-pgo=.*default\.pgo'
+
+go build -a -n -o nopgo.exe ./nopgo
+stderr 'compile.*nopgo.go'
+! stderr 'compile.*-pgoprofile'
+
+# check that pgo doesn't appear in build info
+! stderr 'build\\t-pgo='
+
+# -pgo=off should turn off PGO.
+go build -a -n -pgo=off -o a1.exe ./a/a1
+stderr 'compile.*a1.go'
+! stderr 'compile.*-pgoprofile'
+
+# check that pgo doesn't appear in build info
+! stderr 'build\\t-pgo='
+
 -- go.mod --
 module test
 go 1.20
@@ -54,14 +87,6 @@
 import "testing"
 func TestExternal(*testing.T) {}
 -- a/a1/default.pgo --
--- b/b1/b1.go --
-package main
-func main() {}
--- b/b1/default.pgo --
--- b/b2/b2.go --
-package main
-func main() {}
--- b/b2/default.pgo --
 -- nopgo/nopgo.go --
 package main
 func main() {}
diff --git a/src/cmd/go/testdata/script/build_pgo_auto_multi.txt b/src/cmd/go/testdata/script/build_pgo_auto_multi.txt
new file mode 100644
index 0000000..991b72c
--- /dev/null
+++ b/src/cmd/go/testdata/script/build_pgo_auto_multi.txt
@@ -0,0 +1,109 @@
+# Test go build -pgo=auto flag with multiple main packages.
+
+go install -a -n -pgo=auto ./a ./b ./nopgo
+
+# a/default.pgo applies to package a and (transitive)
+# dependencies.
+stderr 'compile.*-pgoprofile=.*a(/|\\\\)default\.pgo.*a(/|\\\\)a\.go'
+stderr 'compile.*-pgoprofile=.*a(/|\\\\)default\.pgo.*dep(/|\\\\)dep\.go'
+stderr 'compile.*-pgoprofile=.*a(/|\\\\)default\.pgo.*dep2(/|\\\\)dep2\.go'
+stderr -count=1 'compile.*-pgoprofile=.*a(/|\\\\)default\.pgo.*dep3(/|\\\\)dep3\.go'
+
+# b/default.pgo applies to package b and (transitive)
+# dependencies.
+stderr 'compile.*-pgoprofile=.*b(/|\\\\)default\.pgo.*b(/|\\\\)b\.go'
+stderr 'compile.*-pgoprofile=.*b(/|\\\\)default\.pgo.*dep(/|\\\\)dep\.go'
+stderr 'compile.*-pgoprofile=.*b(/|\\\\)default\.pgo.*dep2(/|\\\\)dep2\.go'
+stderr -count=1 'compile.*-pgoprofile=.*b(/|\\\\)default\.pgo.*dep3(/|\\\\)dep3\.go'
+
+# nopgo should be built without PGO.
+! stderr 'compile.*-pgoprofile=.*nopgo(/|\\\\)nopgo\.go'
+
+# Dependencies should also be built without PGO.
+# Here we want to match a compile action without -pgoprofile,
+# by matching 3 occurrences of "compile dep.go", among which
+# 2 of them have -pgoprofile (therefore one without).
+stderr -count=3 'compile.*dep(/|\\\\)dep.go'
+stderr -count=2 'compile.*-pgoprofile=.*dep(/|\\\\)dep\.go'
+
+stderr -count=3 'compile.*dep2(/|\\\\)dep2.go'
+stderr -count=2 'compile.*-pgoprofile=.*dep2(/|\\\\)dep2\.go'
+
+stderr -count=3 'compile.*dep3(/|\\\\)dep3.go'
+stderr -count=2 'compile.*-pgoprofile=.*dep3(/|\\\\)dep3\.go'
+
+# check that pgo appears or not in build info as expected
+stderr 'path\\ttest/a\\n.*build\\t-pgo=.*a(/|\\\\)default\.pgo'
+stderr 'path\\ttest/b\\n.*build\\t-pgo=.*b(/|\\\\)default\.pgo'
+! stderr 'path\\ttest/nopgo\\n.*build\\t-pgo='
+
+# go test works the same way
+go test -a -n -pgo=auto ./a ./b ./nopgo
+stderr 'compile.*-pgoprofile=.*a(/|\\\\)default\.pgo.*a(/|\\\\)a_test\.go'
+stderr 'compile.*-pgoprofile=.*a(/|\\\\)default\.pgo.*dep(/|\\\\)dep\.go'
+stderr 'compile.*-pgoprofile=.*b(/|\\\\)default\.pgo.*b(/|\\\\)b_test\.go'
+stderr 'compile.*-pgoprofile=.*b(/|\\\\)default\.pgo.*dep(/|\\\\)dep\.go'
+! stderr 'compile.*-pgoprofile=.*nopgo(/|\\\\)nopgo_test\.go'
+
+# test-only dependencies also have profiles attached
+stderr 'compile.*-pgoprofile=.*a(/|\\\\)default\.pgo.*testdep(/|\\\\)testdep\.go'
+stderr 'compile.*-pgoprofile=.*b(/|\\\\)default\.pgo.*testdep(/|\\\\)testdep\.go'
+stderr 'compile.*-pgoprofile=.*a(/|\\\\)default\.pgo.*testdep2(/|\\\\)testdep2\.go'
+stderr 'compile.*-pgoprofile=.*b(/|\\\\)default\.pgo.*testdep2(/|\\\\)testdep2\.go'
+
+# go list -deps prints packages built multiple times.
+go list -pgo=auto -deps ./a ./b ./nopgo
+stdout 'test/dep \[test/a\]'
+stdout 'test/dep \[test/b\]'
+stdout 'test/dep$'
+
+# Here we have 3 main packages, a, b, and nopgo, where a and b each has
+# its own default.pgo profile, and nopgo has none.
+# All 3 main packages import dep and dep2, both of which then import dep3
+# (a diamond-shape import graph).
+-- go.mod --
+module test
+go 1.20
+-- a/a.go --
+package main
+import _ "test/dep"
+import _ "test/dep2"
+func main() {}
+-- a/a_test.go --
+package main
+import "testing"
+import _ "test/testdep"
+func TestA(*testing.T) {}
+-- a/default.pgo --
+-- b/b.go --
+package main
+import _ "test/dep"
+import _ "test/dep2"
+func main() {}
+-- b/b_test.go --
+package main
+import "testing"
+import _ "test/testdep"
+func TestB(*testing.T) {}
+-- b/default.pgo --
+-- nopgo/nopgo.go --
+package main
+import _ "test/dep"
+import _ "test/dep2"
+func main() {}
+-- nopgo/nopgo_test.go --
+package main
+import "testing"
+func TestNopgo(*testing.T) {}
+-- dep/dep.go --
+package dep
+import _ "test/dep3"
+-- dep2/dep2.go --
+package dep2
+-- dep3/dep3.go --
+package dep3
+-- testdep/testdep.go --
+package testdep
+import _ "test/testdep2"
+-- testdep2/testdep2.go --
+package testdep2
diff --git a/src/cmd/go/testdata/script/build_plugin_reproducible.txt b/src/cmd/go/testdata/script/build_plugin_reproducible.txt
new file mode 100644
index 0000000..5369954
--- /dev/null
+++ b/src/cmd/go/testdata/script/build_plugin_reproducible.txt
@@ -0,0 +1,11 @@
+[!buildmode:plugin] skip
+[short] skip
+
+go build -trimpath -buildvcs=false -buildmode=plugin -o a.so main.go
+go build -trimpath -buildvcs=false -buildmode=plugin -o b.so main.go
+cmp -q a.so b.so
+
+-- main.go --
+package main
+
+func main() {}
\ No newline at end of file
diff --git a/src/cmd/go/testdata/script/build_shorten_pkg.txt b/src/cmd/go/testdata/script/build_shorten_pkg.txt
new file mode 100644
index 0000000..38672b6
--- /dev/null
+++ b/src/cmd/go/testdata/script/build_shorten_pkg.txt
@@ -0,0 +1,81 @@
+[short] skip
+
+# This test may go away when the loopvar experiment goes away.
+# Accurate reporting of notable loops in the presence of inlining
+# can create warnings in sibling directories, and it's nice if those
+# can be trimmed like subdirectory paths are.
+
+env GOEXPERIMENT=loopvar
+go build -gcflags=inlines/a=-d=loopvar=2 .
+stderr ^\.[\\/]b[\\/]b\.go:12:6:.*loop.inlined.into.a[\\/]a\.go
+stderr ^\.[\\/]b[\\/]b\.go:12:9:.*loop.inlined.into.a[\\/]a\.go
+
+-- go.mod --
+module inlines
+
+go 1.21
+-- a/a.go --
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package a
+
+import "inlines/b"
+
+func F() []*int {
+	var s []*int
+	for i := 0; i < 10; i++ {
+		s = append(s, &i)
+	}
+	return s
+}
+
+func Fb() []*int {
+	bf, _ := b.F()
+	return bf
+}
+-- b/b.go --
+package b
+
+var slice = []int{1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024}
+
+func F() ([]*int, []*int) {
+	return g()
+}
+
+func g() ([]*int, []*int) {
+	var s []*int
+	var t []*int
+	for i, j := range slice {
+		s = append(s, &i)
+		t = append(t, &j)
+	}
+	return s[:len(s)-1], t
+}
+-- main.go --
+package main
+
+import (
+	"fmt"
+	"inlines/a"
+	"inlines/b"
+)
+
+func sum(s []*int) int {
+	sum := 0
+	for _, pi := range s {
+		sum += *pi
+	}
+	return sum
+}
+
+func main() {
+	af := a.F()
+	bf, _ := b.F()
+	abf := a.Fb()
+
+	saf, sbf, sabf := sum(af), sum(bf), sum(abf)
+
+	fmt.Printf("af, bf, abf sums = %d, %d, %d\n", saf, sbf, sabf)
+}
diff --git a/src/cmd/go/testdata/script/build_static.txt b/src/cmd/go/testdata/script/build_static.txt
new file mode 100644
index 0000000..7db90a1
--- /dev/null
+++ b/src/cmd/go/testdata/script/build_static.txt
@@ -0,0 +1,44 @@
+[short] skip 'links and runs binaries'
+
+# This test requires external linking. Assume that if cgo is supported
+# then external linking works.
+[!cgo] skip 'requires a C linker'
+
+# Only run on Unix systems.
+[GOOS:windows] skip
+[GOOS:plan9] skip
+
+# Ordinary build should work.
+go build
+exec ./hello
+stdout Hello
+
+# Building with -linkmode=external should not say anything about
+# runtime/cgo (issue #31544).
+go build -ldflags=-linkmode=external
+! stderr runtime/cgo
+exec ./hello
+stdout Hello
+
+# Some targets don't support -static
+[GOOS:darwin] skip 'no static linking on Darwin'
+[GOOS:solaris] skip 'no static linking on Solaris'
+
+# Building with -linkmode=external -extldflags=-static should work.
+go build -ldflags='-linkmode=external -extldflags=-static'
+! stderr runtime/cgo
+exec ./hello
+stdout Hello
+
+-- go.mod --
+module hello
+
+go 1.20
+-- hello.go --
+package main
+
+import "fmt"
+
+func main() {
+	fmt.Println("Hello, world")
+}
diff --git a/src/cmd/go/testdata/script/build_unsupported_goos.txt b/src/cmd/go/testdata/script/build_unsupported_goos.txt
index 8c12129..c94d6d2 100644
--- a/src/cmd/go/testdata/script/build_unsupported_goos.txt
+++ b/src/cmd/go/testdata/script/build_unsupported_goos.txt
@@ -1,6 +1,6 @@
 [compiler:gccgo] skip # gccgo assumes cross-compilation is always possible
 
-env GOOS=windwos
+env GOOS=windwos # intentional misspelling of windows
 
 ! go build -n exclude
-stderr 'unsupported GOOS/GOARCH pair'
\ No newline at end of file
+stderr 'unsupported GOOS/GOARCH pair'
diff --git a/src/cmd/go/testdata/script/cache_unix.txt b/src/cmd/go/testdata/script/cache_unix.txt
index 5694800..e11804d 100644
--- a/src/cmd/go/testdata/script/cache_unix.txt
+++ b/src/cmd/go/testdata/script/cache_unix.txt
@@ -2,9 +2,10 @@
 
 # Integration test for cache directory calculation (cmd/go/internal/cache).
 
-[GOOS:windows] skip
-[GOOS:darwin] skip
-[GOOS:plan9] skip
+[GOOS:windows] skip 'windows does not use XDG_CACHE_HOME'
+[GOOS:darwin]  skip 'darwin does not use XDG_CACHE_HOME'
+[GOOS:ios]     skip 'ios does not use XDG_CACHE_HOME'
+[GOOS:plan9]   skip 'plan9 does not use XDG_CACHE_HOME'
 
 mkdir $WORK/gocache
 mkdir $WORK/xdg
diff --git a/src/cmd/go/testdata/script/cgo_badmethod_issue57926.txt b/src/cmd/go/testdata/script/cgo_badmethod_issue57926.txt
new file mode 100644
index 0000000..81ef850
--- /dev/null
+++ b/src/cmd/go/testdata/script/cgo_badmethod_issue57926.txt
@@ -0,0 +1,31 @@
+[short] skip
+[!cgo] skip
+
+# Test that cgo rejects attempts to declare methods
+# on the types C.T or *C.T; see issue #57926.
+
+! go build
+stderr 'cannot define new methods on non-local type C.T'
+stderr 'cannot define new methods on non-local type \*C.T'
+! stderr 'Alias'
+
+-- go.mod --
+module example.com
+go 1.12
+
+-- a.go --
+package a
+
+/*
+typedef int T;
+*/
+import "C"
+
+func (C.T) f() {}
+func (recv *C.T) g() {}
+
+// The check is more education than enforcement,
+// and is easily defeated using a type alias.
+type Alias = C.T
+func (Alias) h() {}
+func (*Alias) i() {}
diff --git a/src/cmd/go/testdata/script/cgo_path.txt b/src/cmd/go/testdata/script/cgo_path.txt
index 88f57f0..be23893 100644
--- a/src/cmd/go/testdata/script/cgo_path.txt
+++ b/src/cmd/go/testdata/script/cgo_path.txt
@@ -1,11 +1,9 @@
 [!cgo] skip
 
-# Set CC explicitly to something that requires a PATH lookup.
+# Require that CC is something that requires a PATH lookup.
 # Normally, the default is gcc or clang, but if CC was set during make.bash,
 # that becomes the default.
-[exec:clang] env CC=clang
-[exec:gcc] env CC=gcc
-[!exec:clang] [!exec:gcc] skip 'Unknown C compiler'
+[!cc:clang] [!cc:gcc] skip 'C compiler is not gcc or clang'
 
 env GOCACHE=$WORK/gocache  # Looking for compile flags, so need a clean cache.
 [!GOOS:windows] env PATH=.:$PATH
diff --git a/src/cmd/go/testdata/script/cgo_suspect_flag_force_external.txt b/src/cmd/go/testdata/script/cgo_suspect_flag_force_external.txt
new file mode 100644
index 0000000..e5bcdc6
--- /dev/null
+++ b/src/cmd/go/testdata/script/cgo_suspect_flag_force_external.txt
@@ -0,0 +1,155 @@
+# Test case to verify that when we have a package that uses CGO in
+# combination with selected "unusual" flags (involving plugins, LTO)
+# that we force external linking.  See related
+# issues 58619,  58620, and 58848.
+
+[compiler:gccgo] skip # only external linking for gccgo
+
+[!cgo] skip 'test verifies behavior that depends on CGO_CFLAGS'
+[mustlinkext] skip 'test expects internal linking for non-cgo programs'
+
+# Here we build three program: one with explicit CGO use, one with no
+# CGO use, and one that uses a stdlib package ("runtime/cgo") that has
+# CGO in it. It used to be that only the explicit use of CGO would
+# trigger external linking, and that the program that only used
+# "runtime/cgo" would always be handled with internal linking. This caused
+# issues when users included odd/unusual flags (ex: -fplugin, -flto)
+# in CGO_CFLAGS, causing the Go linker to have to read and interpret
+# non-standard host objects.
+#
+# As of 1.21 we continue to use internal linking for programs whose
+# CGO use comes only from stdlib packages in the absence of any flag
+# funny business, however if the Go command sees flags that may be suspicious,
+# it signals the Go linker to invoke the external linker.
+
+# The next few tests run builds passing "-n" to the Go command, then
+# checking the output to see if the Go command is trying to pass a
+# "preferlinkext" token to the linker to request external linking.
+
+#-----------------------
+
+# Use a fresh GOCACHE for these next steps, so as to have the real
+# actions for the runtime/cgo package appear in the "-n -x" output.
+env GOCACHE=$WORK/gocache
+mkdir $GOCACHE
+
+# First build: there is no CGO in use, so no token should be present regardless
+# of weird CGO flags.
+go build -x -n -o dummy.exe ./noUseOfCgo
+! stderr preferlinkext
+env CGO_CFLAGS=-flto
+go build -x -n -o dummy.exe ./noUseOfCgo
+! stderr preferlinkext
+env CGO_CFLAGS=
+
+# Second build uses CGO, so we expect to see the token present in the
+# -n output only when strange flags are used.
+go build -x -n -o dummy.exe ./usesInternalCgo
+! stderr preferlinkext
+env CGO_CFLAGS=-flto
+go build -x -n -o dummy.exe ./usesInternalCgo
+stderr preferlinkext
+env CGO_CFLAGS=-fplugin
+go build -x -n -o dummy.exe ./usesInternalCgo
+stderr preferlinkext
+env CGO_CFLAGS=-fprofile-instr-generate
+go build -x -n -o dummy.exe ./usesInternalCgo
+stderr preferlinkext
+env CGO_CFLAGS=
+
+[short] skip
+
+# In the remaining tests below we do actual builds (without -n) to
+# verify that the Go linker is going the right thing in addition to the
+# Go command. Here the idea is to pass "-tmpdir" to the linker, then
+# check after the link is done for the presence of the file
+# <tmpdir>/go.o, which the Go linker creates prior to kicking off the
+# external linker.
+
+mkdir tmp1
+mkdir tmp2
+mkdir tmp3
+mkdir tmp4
+mkdir tmp5
+
+# First build: no external linking expected
+go build -ldflags=-tmpdir=tmp1 -o $devnull ./noUseOfCgo &
+
+# Second build: using only "runtime/cgo", expect internal linking.
+go build -ldflags=-tmpdir=tmp2 -o $devnull ./usesInternalCgo &
+
+# Third build: program uses only "runtime/cgo", so we would normally
+# expect internal linking, except that cflags contain suspicious entries
+# (in this case, a flag that does not appear on the allow list).
+env CGO_CFLAGS=-fmerge-all-constants
+env CGO_LDFLAGS=-fmerge-all-constants
+go build -ldflags=-tmpdir=tmp3 -o $devnull ./usesInternalCgo &
+env CGO_CFLAGS=
+env CGO_LDFLAGS=
+
+# Fourth build: explicit CGO, expect external linking.
+go build -ldflags=-tmpdir=tmp4 -o $devnull ./usesExplicitCgo &
+
+# Fifth build: explicit CGO, but we specifically asked for internal linking
+# via a flag, so using internal linking it is.
+[cgolinkext] go list ./usesInternalCgo
+[!cgolinkext] go build '-ldflags=-tmpdir=tmp5 -linkmode=internal' -o $devnull ./usesInternalCgo &
+
+wait
+
+# Check first build: no external linking expected
+! exists tmp1/go.o
+
+# Check second build: using only "runtime/cgo", expect internal linking.
+[!cgolinkext] ! exists tmp2/go.o
+[cgolinkext] exists tmp2/go.o
+
+# Check third build: has suspicious flag.
+exists tmp3/go.o
+
+# Fourth build: explicit CGO, expect external linking.
+exists tmp4/go.o
+
+# Fifth build: explicit CGO, -linkmode=internal.
+! exists tmp5/go.o
+
+-- go.mod --
+
+module cgo.example
+
+go 1.20
+
+-- noUseOfCgo/main.go --
+
+package main
+
+func main() {
+	println("clean as a whistle")
+}
+
+-- usesInternalCgo/main.go --
+
+package main
+
+import (
+	"runtime/cgo"
+)
+
+func main() {
+	q := "hello"
+	h := cgo.NewHandle(q)
+	h.Delete()
+}
+
+-- usesExplicitCgo/main.go --
+
+package main
+
+/*
+int meaningOfLife() { return 42; }
+*/
+import "C"
+
+func main() {
+     println(C.meaningOfLife())
+}
diff --git a/src/cmd/go/testdata/script/cgo_trimpath_macro.txt b/src/cmd/go/testdata/script/cgo_trimpath_macro.txt
new file mode 100644
index 0000000..b5cc116
--- /dev/null
+++ b/src/cmd/go/testdata/script/cgo_trimpath_macro.txt
@@ -0,0 +1,71 @@
+# This is a test that -trimpath trims the paths of every directory
+# of Cgo dependencies in the module, and trims file paths included
+# through the __FILE__ macro using --file-prefix-map.
+
+[!cgo] skip
+[short] skip 'links and runs binaries'
+
+# Test in main module.
+go run -trimpath -mod=vendor ./main
+stdout '(\\_\\_|/_)[\\/]m[\\/]c[\\/]bar.h'
+
+# Test in vendored module.
+go run -trimpath -mod=vendor v.com/main
+stdout '(\\_\\_|/_)[\\/]vendor[\\/]v.com[\\/]c[\\/]bar.h'
+
+# Test in GOPATH mode.
+env GO111MODULE=off
+go run -trimpath ./main
+stdout '(\\_\\_|/_)[\\/]GOPATH[\\/]src[\\/]c[\\/]bar.h'
+
+-- go.mod --
+module m
+
+require v.com v1.0.0
+-- go.sum --
+v.com v1.0.0 h1:xxx
+v.com v1.0.0/go.mod h1:xxx
+-- vendor/modules.txt --
+# v.com v1.0.0
+## explicit; go 1.20
+v.com/main
+-- vendor/v.com/main/main.go --
+package main
+
+// #cgo CFLAGS: -I../c
+// #include "stdio.h"
+// void printfile();
+import "C"
+
+func main() {
+    C.printfile()
+    C.fflush(C.stdout)
+}
+-- vendor/v.com/main/foo.c --
+#include "bar.h"
+-- vendor/v.com/c/bar.h --
+#include "stdio.h"
+
+void printfile() {
+    printf("%s\n", __FILE__);
+}
+-- main/main.go --
+package main
+
+// #cgo CFLAGS: -I../c
+// #include "stdio.h"
+// void printfile();
+import "C"
+
+func main() {
+    C.printfile()
+    C.fflush(C.stdout)
+}
+-- main/foo.c --
+#include "bar.h"
+-- c/bar.h --
+#include "stdio.h"
+
+void printfile() {
+    printf("%s\n", __FILE__);
+}
\ No newline at end of file
diff --git a/src/cmd/go/testdata/script/chdir.txt b/src/cmd/go/testdata/script/chdir.txt
index 8952d18..a6feed6 100644
--- a/src/cmd/go/testdata/script/chdir.txt
+++ b/src/cmd/go/testdata/script/chdir.txt
@@ -17,15 +17,19 @@
 go env -C $OLD/custom GOMOD
 stdout 'custom[\\/]go.mod'
 ! go env -C ../nonexist
-stderr '^invalid value "../nonexist" for flag -C: chdir ../nonexist:.*$'
+stderr '^go: chdir ../nonexist: '
 
 # go test
-go test -n -C ../strings
+go test -C ../strings -n
 stderr 'strings\.test'
 
 # go vet
-go vet -n -C ../strings
+go vet -C ../strings -n
 stderr strings_test
 
+# -C must be first on command line (as of Go 1.21)
+! go test -n -C ../strings
+stderr '^invalid value "../strings" for flag -C: -C flag must be first flag on command line$'
+
 -- custom/go.mod --
 module m
diff --git a/src/cmd/go/testdata/script/cmd_import_error.txt b/src/cmd/go/testdata/script/cmd_import_error.txt
index dea76f4..89e1dbb 100644
--- a/src/cmd/go/testdata/script/cmd_import_error.txt
+++ b/src/cmd/go/testdata/script/cmd_import_error.txt
@@ -5,10 +5,10 @@
 # a clear error in module mode.
 
 ! go list cmd/unknown
-stderr '^package cmd/unknown is not in GOROOT \('$GOROOT'[/\\]src[/\\]cmd[/\\]unknown\)$'
+stderr '^package cmd/unknown is not in std \('$GOROOT'[/\\]src[/\\]cmd[/\\]unknown\)$'
 
 go list -f '{{range .DepsErrors}}{{.Err}}{{end}}' x.go
-stdout '^package cmd/unknown is not in GOROOT \('$GOROOT'[/\\]src[/\\]cmd[/\\]unknown\)$'
+stdout '^package cmd/unknown is not in std \('$GOROOT'[/\\]src[/\\]cmd[/\\]unknown\)$'
 
 -- x.go --
 package x
diff --git a/src/cmd/go/testdata/script/cover_build_cmdline_pkgs.txt b/src/cmd/go/testdata/script/cover_build_cmdline_pkgs.txt
index ba38263..e14a078 100644
--- a/src/cmd/go/testdata/script/cover_build_cmdline_pkgs.txt
+++ b/src/cmd/go/testdata/script/cover_build_cmdline_pkgs.txt
@@ -5,6 +5,7 @@
 # inside and outside the standard library.
 
 [short] skip
+[!GOEXPERIMENT:coverageredesign] skip
 
 # Compile an object.
 go tool compile -p tiny tiny/tiny.go tiny/tiny2.go
diff --git a/src/cmd/go/testdata/script/cover_list.txt b/src/cmd/go/testdata/script/cover_list.txt
index c66c087..6b8aaf4 100644
--- a/src/cmd/go/testdata/script/cover_list.txt
+++ b/src/cmd/go/testdata/script/cover_list.txt
@@ -16,6 +16,28 @@
 # with -cover.
 stale -cover m/example
 
+# Collect build ID from for m/example built with -cover.
+go list -cover -export -f '{{.BuildID}}' m/example
+cp stdout $WORK/listbuildid.txt
+
+# Now build the m/example binary with coverage.
+go build -cover -o $WORK/m.exe m/example
+
+# Ask for the binary build ID by running "go tool buildid".
+go tool buildid $WORK/m.exe
+cp stdout $WORK/rawtoolbuildid.txt
+
+# Make sure that the two build IDs agree with respect to the
+# m/example package. Build IDs from binaries are of the form X/Y/Z/W
+# where Y/Z is the package build ID; running the program below will
+# pick out the parts of the ID that we want.
+env GOCOVERDIR=$WORK
+exec $WORK/m.exe $WORK/rawtoolbuildid.txt
+cp stdout $WORK/toolbuildid.txt
+
+# Build IDs should match here.
+cmp $WORK/toolbuildid.txt $WORK/listbuildid.txt
+
 -- go.mod --
 module m
 
@@ -23,6 +45,21 @@
 -- example/main.go --
 package main
 
+import (
+	"fmt"
+	"os"
+	"strings"
+)
+
 func main() {
-     println("hi mom")
+	println(os.Args[1])
+	content, err := os.ReadFile(os.Args[1])
+	if err != nil {
+		os.Exit(1)
+	}
+	fields := strings.Split(strings.TrimSpace(string(content)), "/")
+	if len(fields) != 4 {
+		os.Exit(2)
+	}
+	fmt.Println(fields[1] + "/" + fields[2])
 }
diff --git a/src/cmd/go/testdata/script/cover_main_import_path.txt b/src/cmd/go/testdata/script/cover_main_import_path.txt
index 3a2f3c3..e8696e2 100644
--- a/src/cmd/go/testdata/script/cover_main_import_path.txt
+++ b/src/cmd/go/testdata/script/cover_main_import_path.txt
@@ -4,6 +4,7 @@
 # the "main" package is handled. See issue 57169 for details.
 
 [short] skip
+[!GOEXPERIMENT:coverageredesign] skip
 
 # Build this program with -cover and run to collect a profile.
 
diff --git a/src/cmd/go/testdata/script/cover_sync_atomic_import.txt b/src/cmd/go/testdata/script/cover_sync_atomic_import.txt
index b933cdb..283db3e 100644
--- a/src/cmd/go/testdata/script/cover_sync_atomic_import.txt
+++ b/src/cmd/go/testdata/script/cover_sync_atomic_import.txt
@@ -1,5 +1,6 @@
 [short] skip
 [compiler:gccgo] skip # gccgo has no cover tool
+[!GOEXPERIMENT:coverageredesign] skip
 
 go test -short -cover -covermode=atomic -coverpkg=coverdep/p1 coverdep
 
diff --git a/src/cmd/go/testdata/script/dist_list_missing.txt b/src/cmd/go/testdata/script/dist_list_missing.txt
new file mode 100644
index 0000000..affaa00
--- /dev/null
+++ b/src/cmd/go/testdata/script/dist_list_missing.txt
@@ -0,0 +1,57 @@
+# Regression test for #60939: when 'go tool dist' is missing,
+# 'go tool dist list' should inject its output.
+
+
+# Set GOROOT to a directory that definitely does not include
+# a compiled 'dist' tool. 'go tool dist list' should still
+# work, because 'cmd/go' itself can impersonate this command.
+
+mkdir $WORK/goroot/bin
+mkdir $WORK/goroot/pkg/tool/${GOOS}_${GOARCH}
+env GOROOT=$WORK/goroot
+
+! go tool -n dist
+stderr 'go: no such tool "dist"'
+
+go tool dist list
+stdout linux/amd64
+cp stdout tool.txt
+
+go tool dist list -v
+stdout linux/amd64
+cp stdout tool-v.txt
+
+go tool dist list -broken
+stdout $GOOS/$GOARCH
+cp stdout tool-broken.txt
+
+go tool dist list -json
+stdout '"GOOS": "linux",\n\s*"GOARCH": "amd64",\n'
+cp stdout tool-json.txt
+
+go tool dist list -json -broken
+stdout '"GOOS": "'$GOOS'",\n\s*"GOARCH": "'$GOARCH'",\n'
+cp stdout tool-json-broken.txt
+
+[short] stop
+
+
+# Check against the real cmd/dist as the source of truth.
+
+env GOROOT=$TESTGO_GOROOT
+go build -o dist.exe cmd/dist
+
+exec ./dist.exe list
+cmp stdout tool.txt
+
+exec ./dist.exe list -v
+cmp stdout tool-v.txt
+
+exec ./dist.exe list -broken
+cmp stdout tool-broken.txt
+
+exec ./dist.exe list -json
+cmp stdout tool-json.txt
+
+exec ./dist.exe list -json -broken
+cmp stdout tool-json-broken.txt
diff --git a/src/cmd/go/testdata/script/env_cross_build.txt b/src/cmd/go/testdata/script/env_cross_build.txt
index 3feeba6..91d1cb9 100644
--- a/src/cmd/go/testdata/script/env_cross_build.txt
+++ b/src/cmd/go/testdata/script/env_cross_build.txt
@@ -1,4 +1,4 @@
-# Test that the corect default GOEXPERIMENT is used when cross
+# Test that the correct default GOEXPERIMENT is used when cross
 # building with GOENV (#46815).
 
 # Unset variables set by the TestScript harness. Users typically won't
diff --git a/src/cmd/go/testdata/script/env_sanitize.txt b/src/cmd/go/testdata/script/env_sanitize.txt
new file mode 100644
index 0000000..cc4d23a
--- /dev/null
+++ b/src/cmd/go/testdata/script/env_sanitize.txt
@@ -0,0 +1,5 @@
+env GOFLAGS='$(echo ''cc"''; echo ''OOPS="oops'')'
+go env
+[GOOS:darwin] stdout 'GOFLAGS=''\$\(echo ''\\''''cc"''\\''''; echo ''\\''''OOPS="oops''\\''''\)'''
+[GOOS:linux] stdout 'GOFLAGS=''\$\(echo ''\\''''cc"''\\''''; echo ''\\''''OOPS="oops''\\''''\)'''
+[GOOS:windows] stdout 'set GOFLAGS=\$\(echo ''cc"''; echo ''OOPS="oops''\)'
diff --git a/src/cmd/go/testdata/script/env_write.txt b/src/cmd/go/testdata/script/env_write.txt
index ccd0eb3..5d40949 100644
--- a/src/cmd/go/testdata/script/env_write.txt
+++ b/src/cmd/go/testdata/script/env_write.txt
@@ -173,6 +173,7 @@
 env GOOS=windows
 ! go env -u GOOS
 stderr 'unsupported GOOS/GOARCH.*windows/mips$'
+env GOOS=
 
 # go env -w should reject relative paths in GOMODCACHE environment.
 ! go env -w GOMODCACHE=~/test
@@ -185,3 +186,21 @@
 ! go env -w GOEXPERIMENT=badexp
 stderr 'unknown GOEXPERIMENT badexp'
 go env -w GOEXPERIMENT=fieldtrack
+
+# go env -w and go env -u work on unknown fields already in the go/env file
+cp bad.env $GOENV
+go env GOENV
+cat $GOENV
+go env
+! stdout UNKNOWN
+go env UNKNOWN
+stdout yes
+go env -w UNKNOWN=maybe
+go env UNKNOWN
+stdout maybe
+go env -u UNKNOWN
+go env UNKNOWN
+! stdout . # gone
+
+-- bad.env --
+UNKNOWN=yes
diff --git a/src/cmd/go/testdata/script/gccgo_link_ldflags.txt b/src/cmd/go/testdata/script/gccgo_link_ldflags.txt
new file mode 100644
index 0000000..80526c6
--- /dev/null
+++ b/src/cmd/go/testdata/script/gccgo_link_ldflags.txt
@@ -0,0 +1,23 @@
+# Test that #cgo LDFLAGS are properly quoted.
+# The #cgo LDFLAGS below should pass a string with spaces to -L,
+# as though searching a directory with a space in its name.
+# It should not pass --nosuchoption to the external linker.
+
+[!cgo] skip
+
+go build
+
+[!exec:gccgo] skip
+
+# TODO: remove once gccgo on builder is updated
+[GOOS:aix] [GOARCH:ppc64] skip
+
+go build -compiler gccgo
+
+-- go.mod --
+module m
+-- cgo.go --
+package main
+// #cgo LDFLAGS: -L "./ -Wl,--nosuchoption"
+import "C"
+func main() {}
diff --git a/src/cmd/go/testdata/script/gcflags_patterns.txt b/src/cmd/go/testdata/script/gcflags_patterns.txt
index 918c32d..cc7b2fc 100644
--- a/src/cmd/go/testdata/script/gcflags_patterns.txt
+++ b/src/cmd/go/testdata/script/gcflags_patterns.txt
@@ -3,17 +3,15 @@
 [!compiler:gc] skip 'using -gcflags and -ldflags'
 [short] skip
 
-env GOCACHE=$WORK/gocache  # Looking for compile commands, so need a clean cache.
-
 # -gcflags=-e applies to named packages, not dependencies
-go build -n -v -gcflags=-e z1 z2
+go build -a -n -v -gcflags=-e z1 z2
 stderr 'compile.* -p z1.* -e '
 stderr 'compile.* -p z2.* -e '
 stderr 'compile.* -p y'
 ! stderr 'compile.* -p [^z].* -e '
 
 # -gcflags can specify package=flags, and can be repeated; last match wins
-go build -n -v -gcflags=-e -gcflags=z1=-N z1 z2
+go build -a -n -v -gcflags=-e -gcflags=z1=-N z1 z2
 stderr 'compile.* -p z1.* -N '
 ! stderr 'compile.* -p z1.* -e '
 ! stderr 'compile.* -p z2.* -N '
@@ -23,11 +21,11 @@
 ! stderr 'compile.* -p [^z].* -N '
 
 # -gcflags can have arbitrary spaces around the flags
-go build -n -v -gcflags='  z1 =  	-e 	' z1
+go build -a -n -v -gcflags='  z1 =  	-e 	' z1
 stderr 'compile.* -p z1.* -e '
 
 # -gcflags='all=-e' should apply to all packages, even with go test
-go test -c -n -gcflags='all=-e' z1
+go test -a -c -n -gcflags='all=-e' z1
 stderr 'compile.* -p z3.* -e '
 
 # this particular -gcflags argument made the compiler crash
@@ -39,31 +37,31 @@
 stderr 'invalid value'
 
 # -ldflags for implicit test package applies to test binary
-go test -c -n -gcflags=-N -ldflags=-X=x.y=z z1
+go test -a -c -n -gcflags=-N -ldflags=-X=x.y=z z1
 stderr 'compile.* -N .*z_test.go'
 stderr 'link.* -X=x.y=z'
 
 # -ldflags for explicit test package applies to test binary
-go test -c -n -gcflags=z1=-N -ldflags=z1=-X=x.y=z z1
+go test -a -c -n -gcflags=z1=-N -ldflags=z1=-X=x.y=z z1
 stderr 'compile.* -N .*z_test.go'
 stderr 'link.* -X=x.y=z'
 
 # -ldflags applies to link of command
-go build -n -ldflags=-X=math.pi=3 my/cmd/prog
+go build -a -n -ldflags=-X=math.pi=3 my/cmd/prog
 stderr 'link.* -X=math.pi=3'
 
 # -ldflags applies to link of command even with strange directory name
-go build -n -ldflags=-X=math.pi=3 my/cmd/prog/
+go build -a -n -ldflags=-X=math.pi=3 my/cmd/prog/
 stderr 'link.* -X=math.pi=3'
 
 # -ldflags applies to current directory
 cd my/cmd/prog
-go build -n -ldflags=-X=math.pi=3
+go build -a -n -ldflags=-X=math.pi=3
 stderr 'link.* -X=math.pi=3'
 
 # -ldflags applies to current directory even if GOPATH is funny
 [!case-sensitive] cd $WORK/GoPath/src/my/cmd/prog
-go build -n -ldflags=-X=math.pi=3
+go build -a -n -ldflags=-X=math.pi=3
 stderr 'link.* -X=math.pi=3'
 
 # cgo.a should not be a dependency of internally-linked go package
diff --git a/src/cmd/go/testdata/script/get_404_meta.txt b/src/cmd/go/testdata/script/get_404_meta.txt
index 553afb9..4ffbdeb 100644
--- a/src/cmd/go/testdata/script/get_404_meta.txt
+++ b/src/cmd/go/testdata/script/get_404_meta.txt
@@ -1,6 +1,6 @@
 # golang.org/issue/13037: 'go get' was not parsing <meta> tags in 404 served over HTTPS.
 
-[!net] skip
+[!net:bazil.org] skip
 [!git] skip
 
 env GONOSUMDB=bazil.org,github.com,golang.org
diff --git a/src/cmd/go/testdata/script/get_custom_domain_wildcard.txt b/src/cmd/go/testdata/script/get_custom_domain_wildcard.txt
index 32ddd92..45ab524 100644
--- a/src/cmd/go/testdata/script/get_custom_domain_wildcard.txt
+++ b/src/cmd/go/testdata/script/get_custom_domain_wildcard.txt
@@ -1,4 +1,4 @@
-[!net] skip
+[!net:rsc.io] skip
 [!git] skip
 env GO111MODULE=off
 
diff --git a/src/cmd/go/testdata/script/get_dash_t.txt b/src/cmd/go/testdata/script/get_dash_t.txt
index 0a0a608..8f3a036 100644
--- a/src/cmd/go/testdata/script/get_dash_t.txt
+++ b/src/cmd/go/testdata/script/get_dash_t.txt
@@ -1,9 +1,9 @@
 # Tests issue 8181
 
-[!net] skip
+[!net:github.com] skip
 [!git] skip
 env GO111MODULE=off
 
 go get -v -t github.com/rsc/go-get-issue-8181/a github.com/rsc/go-get-issue-8181/b
-go list ...
+go list -test -deps github.com/rsc/go-get-issue-8181/b
 stdout 'x/build/gerrit'
diff --git a/src/cmd/go/testdata/script/get_domain_root.txt b/src/cmd/go/testdata/script/get_domain_root.txt
index 250fa64..dfcea86 100644
--- a/src/cmd/go/testdata/script/get_domain_root.txt
+++ b/src/cmd/go/testdata/script/get_domain_root.txt
@@ -1,7 +1,7 @@
 # Tests issue #9357
 # go get foo.io (not foo.io/subdir) was not working consistently.
 
-[!net] skip
+[!net:go-get-issue-9357.appspot.com] skip
 [!git] skip
 env GO111MODULE=off
 
diff --git a/src/cmd/go/testdata/script/get_dot_slash_download.txt b/src/cmd/go/testdata/script/get_dot_slash_download.txt
index 2af9564..6dbd118 100644
--- a/src/cmd/go/testdata/script/get_dot_slash_download.txt
+++ b/src/cmd/go/testdata/script/get_dot_slash_download.txt
@@ -1,4 +1,4 @@
-[!net] skip
+[!net:rsc.io] skip
 [!git] skip
 env GO111MODULE=off
 
diff --git a/src/cmd/go/testdata/script/get_goroot.txt b/src/cmd/go/testdata/script/get_goroot.txt
index dc1e5ad..7510692 100644
--- a/src/cmd/go/testdata/script/get_goroot.txt
+++ b/src/cmd/go/testdata/script/get_goroot.txt
@@ -1,4 +1,4 @@
-[!net] skip
+[!net:github.com] skip
 env GO111MODULE=off
 
 # Issue 4186. go get cannot be used to download packages to $GOROOT.
diff --git a/src/cmd/go/testdata/script/get_insecure.txt b/src/cmd/go/testdata/script/get_insecure.txt
index 0079220..afe64b8 100644
--- a/src/cmd/go/testdata/script/get_insecure.txt
+++ b/src/cmd/go/testdata/script/get_insecure.txt
@@ -1,6 +1,6 @@
 # TODO(matloob): Split this test into two? It's one of the slowest tests we have.
 
-[!net] skip
+[!net:insecure.go-get-issue-15410.appspot.com] skip
 [!git] skip
 
 env PATH=$WORK/tmp/bin${:}$PATH
diff --git a/src/cmd/go/testdata/script/get_insecure_custom_domain.txt b/src/cmd/go/testdata/script/get_insecure_custom_domain.txt
index 3a0765f..4b3c9d6 100644
--- a/src/cmd/go/testdata/script/get_insecure_custom_domain.txt
+++ b/src/cmd/go/testdata/script/get_insecure_custom_domain.txt
@@ -1,4 +1,4 @@
-[!net] skip
+[!net:insecure.go-get-issue-15410.appspot.com] skip
 [!git] skip
 env GO111MODULE=off
 
diff --git a/src/cmd/go/testdata/script/get_insecure_env.txt b/src/cmd/go/testdata/script/get_insecure_env.txt
index 8748440..98e7053 100644
--- a/src/cmd/go/testdata/script/get_insecure_env.txt
+++ b/src/cmd/go/testdata/script/get_insecure_env.txt
@@ -1,4 +1,4 @@
-[!net] skip
+[!net:insecure.go-get-issue-15410.appspot.com] skip
 [!git] skip
 
 # GOPATH: Set up
diff --git a/src/cmd/go/testdata/script/get_insecure_redirect.txt b/src/cmd/go/testdata/script/get_insecure_redirect.txt
index 2e5ec4e..2e53c58 100644
--- a/src/cmd/go/testdata/script/get_insecure_redirect.txt
+++ b/src/cmd/go/testdata/script/get_insecure_redirect.txt
@@ -1,7 +1,6 @@
 # golang.org/issue/29591: 'go get' was following plain-HTTP redirects even without -insecure (now replaced by GOINSECURE).
 # golang.org/issue/34049: 'go get' would panic in case of an insecure redirect in GOPATH mode
 
-[!net] skip
 [!git] skip
 
 env GO111MODULE=off
@@ -9,5 +8,7 @@
 ! go get -d vcs-test.golang.org/insecure/go/insecure
 stderr 'redirected .* to insecure URL'
 
+[short] stop 'builds a git repo'
+
 env GOINSECURE=vcs-test.golang.org/insecure/go/insecure
 go get -d vcs-test.golang.org/insecure/go/insecure
diff --git a/src/cmd/go/testdata/script/get_insecure_update.txt b/src/cmd/go/testdata/script/get_insecure_update.txt
index 01660d5..7cddd6b 100644
--- a/src/cmd/go/testdata/script/get_insecure_update.txt
+++ b/src/cmd/go/testdata/script/get_insecure_update.txt
@@ -1,4 +1,4 @@
-[!net] skip
+[!net:github.com] skip
 [!git] skip
 env GO111MODULE=off
 
diff --git a/src/cmd/go/testdata/script/get_internal_wildcard.txt b/src/cmd/go/testdata/script/get_internal_wildcard.txt
index 71ecb8c..b25e746 100644
--- a/src/cmd/go/testdata/script/get_internal_wildcard.txt
+++ b/src/cmd/go/testdata/script/get_internal_wildcard.txt
@@ -1,4 +1,4 @@
-[!net] skip
+[!net:github.com] skip
 [!git] skip
 env GO111MODULE=off
 
diff --git a/src/cmd/go/testdata/script/get_issue11307.txt b/src/cmd/go/testdata/script/get_issue11307.txt
index dc46e74..d490959 100644
--- a/src/cmd/go/testdata/script/get_issue11307.txt
+++ b/src/cmd/go/testdata/script/get_issue11307.txt
@@ -1,6 +1,6 @@
 # go get -u was not working except in checkout directory
 
-[!net] skip
+[!net:github.com] skip
 [!git] skip
 env GO111MODULE=off
 
diff --git a/src/cmd/go/testdata/script/get_issue16471.txt b/src/cmd/go/testdata/script/get_issue16471.txt
index 6036913..1aeae58 100644
--- a/src/cmd/go/testdata/script/get_issue16471.txt
+++ b/src/cmd/go/testdata/script/get_issue16471.txt
@@ -1,4 +1,5 @@
-[!net] skip
+[!net:rsc.io] skip
+[!net:github.com] skip
 [!git] skip
 
 env GO111MODULE=off
diff --git a/src/cmd/go/testdata/script/get_issue22125.txt b/src/cmd/go/testdata/script/get_issue22125.txt
index 3418df8..086081f 100644
--- a/src/cmd/go/testdata/script/get_issue22125.txt
+++ b/src/cmd/go/testdata/script/get_issue22125.txt
@@ -1,6 +1,6 @@
 # This test verifies a fix for a security issue; see https://go.dev/issue/22125.
 
-[!net] skip
+[short] skip
 [!git] skip
 [!exec:svn] skip
 
diff --git a/src/cmd/go/testdata/script/get_non_pkg.txt b/src/cmd/go/testdata/script/get_non_pkg.txt
index 5eac1e3..5202e88 100644
--- a/src/cmd/go/testdata/script/get_non_pkg.txt
+++ b/src/cmd/go/testdata/script/get_non_pkg.txt
@@ -1,4 +1,4 @@
-[!net] skip
+[!net:golang.org] skip
 [!git] skip
 
 env GOBIN=$WORK/tmp/gobin
@@ -11,4 +11,4 @@
 stderr 'golang.org/x/tools: no Go files'
 
 ! go get -d golang.org/x/tools
-stderr 'golang.org/x/tools: no Go files'
\ No newline at end of file
+stderr 'golang.org/x/tools: no Go files'
diff --git a/src/cmd/go/testdata/script/get_race.txt b/src/cmd/go/testdata/script/get_race.txt
index 87fbf62..1e06c80 100644
--- a/src/cmd/go/testdata/script/get_race.txt
+++ b/src/cmd/go/testdata/script/get_race.txt
@@ -1,6 +1,6 @@
 # Tests issue #20502
 
-[!net] skip
+[!net:github.com] skip
 [!git] skip
 [!race] skip
 env GO111MODULE=off
diff --git a/src/cmd/go/testdata/script/get_test_only.txt b/src/cmd/go/testdata/script/get_test_only.txt
index ec8baf9..af90f74 100644
--- a/src/cmd/go/testdata/script/get_test_only.txt
+++ b/src/cmd/go/testdata/script/get_test_only.txt
@@ -1,4 +1,4 @@
-[!net] skip
+[!net:golang.org] skip
 [!git] skip
 env GO111MODULE=off
 
diff --git a/src/cmd/go/testdata/script/get_tilde.txt b/src/cmd/go/testdata/script/get_tilde.txt
index e520957..1c3a029 100644
--- a/src/cmd/go/testdata/script/get_tilde.txt
+++ b/src/cmd/go/testdata/script/get_tilde.txt
@@ -1,24 +1,25 @@
 env GO111MODULE=off
-[short] skip
 
 # Paths containing windows short names should be rejected before attempting to fetch.
-! go get example.com/longna~1.dir/thing
+! go get vcs-test.golang.org/longna~1.dir/thing
 stderr 'trailing tilde and digits'
-! go get example.com/longna~1/thing
+! go get vcs-test.golang.org/longna~1/thing
 stderr 'trailing tilde and digits'
-! go get example.com/~9999999/thing
+! go get vcs-test.golang.org/~9999999/thing
 stderr 'trailing tilde and digits'
 
+[short] stop
+
 # A path containing an element that is just a tilde, or a tilde followed by non-digits,
 # should attempt to resolve.
-! go get example.com/~glenda/notfound
+! go get vcs-test.golang.org/~glenda/notfound
 ! stderr 'trailing tilde and digits'
 stderr 'unrecognized import path'
 
-! go get example.com/~glenda2/notfound
+! go get vcs-test.golang.org/~glenda2/notfound
 ! stderr 'trailing tilde and digits'
 stderr 'unrecognized import path'
 
-! go get example.com/~/notfound
+! go get vcs-test.golang.org/~/notfound
 ! stderr 'trailing tilde and digits'
 stderr 'unrecognized import path'
diff --git a/src/cmd/go/testdata/script/get_update.txt b/src/cmd/go/testdata/script/get_update.txt
index 5aeb990..a70a80d 100644
--- a/src/cmd/go/testdata/script/get_update.txt
+++ b/src/cmd/go/testdata/script/get_update.txt
@@ -2,7 +2,7 @@
 # The recursive updating was trying to walk to
 # former dependencies, not current ones.
 
-[!net] skip
+[!net:github.com] skip
 [!git] skip
 env GO111MODULE=off
 
diff --git a/src/cmd/go/testdata/script/get_update_all.txt b/src/cmd/go/testdata/script/get_update_all.txt
index 2b75849..22fe3ed 100644
--- a/src/cmd/go/testdata/script/get_update_all.txt
+++ b/src/cmd/go/testdata/script/get_update_all.txt
@@ -1,8 +1,6 @@
 # Issue 14444: go get -u .../ duplicate loads errors
 # Check that go get update -u ... does not try to load duplicates
 
-[!net] skip
-
 env GO111MODULE=off
 
 go get -u -n .../
diff --git a/src/cmd/go/testdata/script/get_update_unknown_protocol.txt b/src/cmd/go/testdata/script/get_update_unknown_protocol.txt
index 12807ad..714ed6a 100644
--- a/src/cmd/go/testdata/script/get_update_unknown_protocol.txt
+++ b/src/cmd/go/testdata/script/get_update_unknown_protocol.txt
@@ -1,4 +1,4 @@
-[!net] skip
+[!net:github.com] skip
 [!git] skip
 env GO111MODULE=off
 
diff --git a/src/cmd/go/testdata/script/get_update_wildcard.txt b/src/cmd/go/testdata/script/get_update_wildcard.txt
index 01e2c37..c833783 100644
--- a/src/cmd/go/testdata/script/get_update_wildcard.txt
+++ b/src/cmd/go/testdata/script/get_update_wildcard.txt
@@ -1,6 +1,6 @@
 # Issue 14450: go get -u .../ tried to import not downloaded package
 
-[!net] skip
+[!net:github.com] skip
 [!git] skip
 env GO111MODULE=off
 
diff --git a/src/cmd/go/testdata/script/get_vendor.txt b/src/cmd/go/testdata/script/get_vendor.txt
index f9a4a6b..179456d 100644
--- a/src/cmd/go/testdata/script/get_vendor.txt
+++ b/src/cmd/go/testdata/script/get_vendor.txt
@@ -11,7 +11,7 @@
 go get -d
 go get -t -d
 
-[!net] stop
+[!net:github.com] stop
 [!git] stop
 
 cd $GOPATH/src
diff --git a/src/cmd/go/testdata/script/get_with_git_trace.txt b/src/cmd/go/testdata/script/get_with_git_trace.txt
index abc7014..6f1305a 100644
--- a/src/cmd/go/testdata/script/get_with_git_trace.txt
+++ b/src/cmd/go/testdata/script/get_with_git_trace.txt
@@ -2,7 +2,7 @@
 
 env GIT_TRACE=1
 
-[!net] skip
+[!net:golang.org] skip
 [!git] skip
 
 # go get should be success when GIT_TRACE set
diff --git a/src/cmd/go/testdata/script/go_badcmd.txt b/src/cmd/go/testdata/script/go_badcmd.txt
new file mode 100644
index 0000000..661375a
--- /dev/null
+++ b/src/cmd/go/testdata/script/go_badcmd.txt
@@ -0,0 +1,2 @@
+! go asdf
+stderr '^go asdf: unknown command'
diff --git a/src/cmd/go/testdata/script/godebug_default.txt b/src/cmd/go/testdata/script/godebug_default.txt
new file mode 100644
index 0000000..5bb8cac
--- /dev/null
+++ b/src/cmd/go/testdata/script/godebug_default.txt
@@ -0,0 +1,114 @@
+env GO111MODULE=on
+env GOTRACEBACK=single
+
+# Go 1.21 work module should leave panicnil with an implicit default.
+cp go.mod.21 go.mod
+go list -f '{{.Module.GoVersion}} {{.DefaultGODEBUG}}'
+! stdout panicnil
+stdout randautoseed=0
+
+# Go 1.21 work module should NOT set panicnil=1 in Go 1.20 dependency.
+cp go.mod.21 go.mod
+go list -f '{{.Module.GoVersion}} {{.DefaultGODEBUG}}' q
+! stdout panicnil=1
+! stdout randautoseed
+
+go mod download rsc.io/panicnil # for go.sum
+go list -f '{{.Module.GoVersion}} {{.DefaultGODEBUG}}' rsc.io/panicnil
+! stdout panicnil=1
+! stdout randautoseed
+
+# Go 1.20 work module should set panicnil=1.
+cp go.mod.20 go.mod
+go list -f '{{.Module.GoVersion}} {{.DefaultGODEBUG}}'
+stdout panicnil=1
+stdout randautoseed=0
+
+# Go 1.20 work module should set panicnil=1 in Go 1.20 dependency.
+cp go.mod.20 go.mod
+go list -f '{{.Module.GoVersion}} {{.DefaultGODEBUG}}' q
+stdout panicnil=1
+! stdout randautoseed
+
+# Go 1.21 workspace should leave panicnil with an implicit default.
+cat q/go.mod
+cp go.work.21 go.work
+go list -f '{{.Module.GoVersion}} {{.DefaultGODEBUG}}'
+! stdout panicnil
+stdout randautoseed=0
+rm go.work
+
+# Go 1.20 workspace with Go 1.21 module cannot happen.
+cp go.work.20 go.work
+cp go.mod.21 go.mod
+! go list -f '{{.Module.GoVersion}} {{.DefaultGODEBUG}}'
+stderr 'go: module . listed in go.work file requires go >= 1.21'
+rm go.work
+
+[short] skip
+
+# Programs in Go 1.21 work module should trigger run-time error.
+cp go.mod.21 go.mod
+! go run .
+stderr 'panic: panic called with nil argument'
+
+! go run rsc.io/panicnil
+stderr 'panic: panic called with nil argument'
+
+# Programs in Go 1.20 work module use old panic nil behavior.
+cp go.mod.20 go.mod
+! go run .
+stderr 'panic: nil'
+
+! go run rsc.io/panicnil
+stderr 'panic: nil'
+
+# Programs in no module at all should use their go.mod file.
+rm go.mod
+! go run rsc.io/panicnil@v1.0.0
+stderr 'panic: nil'
+
+rm go.mod
+! go run rsc.io/panicnil@v1.1.0
+stderr 'panic: panic called with nil argument'
+
+-- go.work.21 --
+go 1.21
+use .
+use ./q
+
+-- go.work.20 --
+go 1.20
+use .
+use ./q
+
+-- go.mod.21 --
+go 1.21
+module m
+require q v1.0.0
+replace q => ./q
+require rsc.io/panicnil v1.0.0
+
+-- go.mod.20 --
+go 1.20
+module m
+require q v1.0.0
+replace q => ./q
+require rsc.io/panicnil v1.0.0
+
+-- p.go --
+//go:debug randautoseed=0
+
+package main
+
+func main() {
+	panic(nil)
+}
+
+-- q/go.mod --
+go 1.20
+module q
+
+-- q/q.go --
+package main
+func main() {}
diff --git a/src/cmd/go/testdata/script/godebug_unknown.txt b/src/cmd/go/testdata/script/godebug_unknown.txt
new file mode 100644
index 0000000..57dacbc
--- /dev/null
+++ b/src/cmd/go/testdata/script/godebug_unknown.txt
@@ -0,0 +1,9 @@
+! go build
+stderr 'p.go:1:1: invalid //go:debug: unknown //go:debug setting "x"'
+
+-- go.mod --
+module m
+-- p.go --
+//go:debug x=y
+package main
+func main() {}
diff --git a/src/cmd/go/testdata/script/goline_order.txt b/src/cmd/go/testdata/script/goline_order.txt
new file mode 100644
index 0000000..6212cd6
--- /dev/null
+++ b/src/cmd/go/testdata/script/goline_order.txt
@@ -0,0 +1,74 @@
+# Check that go lines are always >= go lines of dependencies.
+
+# Using too old a release cannot even complete module load.
+env TESTGO_VERSION=go1.21.1
+env TESTGO_VERSION_SWITCH=switch
+cp go.mod go.mod.orig
+
+# If the offending module is not imported, it's not detected.
+go list
+cmp go.mod go.mod.orig
+
+# Adding the import produces the error.
+# Maybe this should auto-switch, but it requires more plumbing to get this error through,
+# and it's a misconfigured system that should not arise in practice, so not switching is fine.
+! go list -deps -tags usem1
+cmp go.mod go.mod.orig
+stderr '^go: module ./m1 requires go >= 1.21.2 \(running go 1.21.1\)$'
+
+# go get go@1.21.2 fixes the error.
+cp go.mod.orig go.mod
+go get go@1.21.2
+go list -deps -tags usem1
+
+# go get -tags usem1 fixes the error.
+cp go.mod.orig go.mod
+go get -tags usem1
+go list -deps -tags usem1
+
+# go get fixes the error.
+cp go.mod.orig go.mod
+go get
+go list -deps -tags usem1
+
+# Using a new enough release reports the error after module load and suggests 'go mod tidy'
+env TESTGO_VERSION=go1.21.2
+cp go.mod.orig go.mod
+! go list -deps -tags usem1
+stderr 'updates to go.mod needed'
+stderr 'go mod tidy'
+go mod tidy
+go list -deps -tags usem1
+
+# go get also works
+cp go.mod.orig go.mod
+! go list -deps -tags usem1
+stderr 'updates to go.mod needed'
+stderr 'go mod tidy'
+go get go@1.21.2
+go list -deps -tags usem1
+
+
+-- go.mod --
+module m
+go 1.21.1
+
+require m1 v0.0.1
+
+replace m1 => ./m1
+
+-- m1/go.mod --
+go 1.21.2
+
+-- p.go --
+//go:build usem1
+
+package p
+
+import _ "m1"
+
+-- p1.go --
+package p
+
+-- m1/p.go --
+package p
diff --git a/src/cmd/go/testdata/script/gopath_moved_repo.txt b/src/cmd/go/testdata/script/gopath_moved_repo.txt
index 5815d73..8108d9b 100644
--- a/src/cmd/go/testdata/script/gopath_moved_repo.txt
+++ b/src/cmd/go/testdata/script/gopath_moved_repo.txt
@@ -3,7 +3,7 @@
 # Test that 'go get -u' reports packages whose VCS configurations do not
 # match their import paths.
 
-[!net] skip
+[!net:rsc.io] skip
 [short] skip
 
 # We need to execute a custom Go program to break the config files.
diff --git a/src/cmd/go/testdata/script/gopath_vendor_dup_err.txt b/src/cmd/go/testdata/script/gopath_vendor_dup_err.txt
index 22e6048..5f1e09a 100644
--- a/src/cmd/go/testdata/script/gopath_vendor_dup_err.txt
+++ b/src/cmd/go/testdata/script/gopath_vendor_dup_err.txt
@@ -1,4 +1,3 @@
-[!net] skip
 env GO111MODULE=off
 
 # Issue 17119: Test more duplicate load errors.
diff --git a/src/cmd/go/testdata/script/goroot_executable.txt b/src/cmd/go/testdata/script/goroot_executable.txt
index 1a0e23e..e20dbd8 100644
--- a/src/cmd/go/testdata/script/goroot_executable.txt
+++ b/src/cmd/go/testdata/script/goroot_executable.txt
@@ -1,4 +1,5 @@
 [compiler:gccgo] skip
+[short] skip 'builds and links another cmd/go'
 
 mkdir $WORK/new/bin
 
@@ -9,15 +10,18 @@
 # new cmd/go is built.
 env GOROOT_FINAL=
 
+# $GOROOT/bin/go is whatever the user has already installed
+# (using make.bash or similar). We can't make assumptions about what
+# options it may have been built with, such as -trimpath or GOROOT_FINAL.
+# Instead, we build a fresh copy of the binary with known settings.
 go build -o $WORK/new/bin/go$GOEXE cmd/go &
-go build -o $WORK/bin/check$GOEXE check.go &
+go build -trimpath -o $WORK/bin/check$GOEXE check.go &
 wait
 
 env TESTGOROOT=$GOROOT
 env GOROOT=
 
 # Relocated Executable
-# cp $TESTGOROOT/bin/go$GOEXE $WORK/new/bin/go$GOEXE
 exec $WORK/bin/check$GOEXE $WORK/new/bin/go$GOEXE $TESTGOROOT
 
 # Relocated Tree:
diff --git a/src/cmd/go/testdata/script/goroot_executable_trimpath.txt b/src/cmd/go/testdata/script/goroot_executable_trimpath.txt
new file mode 100644
index 0000000..dc1e25e
--- /dev/null
+++ b/src/cmd/go/testdata/script/goroot_executable_trimpath.txt
@@ -0,0 +1,91 @@
+# Regression test for https://go.dev/issue/62119:
+# A 'go' command cross-compiled with a different GOHOSTOS
+# should be able to locate its GOROOT using os.Executable.
+#
+# (This also tests a 'go' command built with -trimpath
+# that is not cross-compiled, since we need to build that
+# configuration for the test anyway.)
+
+[short] skip 'builds and links another cmd/go'
+
+mkdir $WORK/new/bin
+mkdir $WORK/new/bin/${GOOS}_${GOARCH}
+
+# In this test, we are specifically checking the logic for deriving
+# the value of GOROOT from os.Executable when runtime.GOROOT is
+# trimmed away.
+# GOROOT_FINAL changes the default behavior of runtime.GOROOT,
+# so we explicitly clear it to remove it as a confounding variable.
+env GOROOT_FINAL=
+
+# $GOROOT/bin/go is whatever the user has already installed
+# (using make.bash or similar). We can't make assumptions about what
+# options it may have been built with, such as -trimpath or GOROOT_FINAL.
+# Instead, we build a fresh copy of the binary with known settings.
+go build -trimpath -o $WORK/new/bin/go$GOEXE cmd/go &
+go build -trimpath -o $WORK/bin/check$GOEXE check.go &
+wait
+
+env TESTGOROOT=$GOROOT
+env GOROOT=
+
+# Relocated Executable
+# Since we built with -trimpath and the binary isn't installed in a
+# normal-looking GOROOT, this command should fail.
+
+! exec $WORK/new/bin/go$GOEXE env GOROOT
+stderr '^go: cannot find GOROOT directory: ''go'' binary is trimmed and GOROOT is not set$'
+
+# Cross-compiled binaries in cmd are installed to a ${GOOS}_${GOARCH} subdirectory,
+# so we also want to try a copy there.
+# (Note that the script engine's 'exec' engine already works around
+# https://go.dev/issue/22315, so we don't have to do that explicitly in the
+# 'check' program we use later.)
+cp $WORK/new/bin/go$GOEXE $WORK/new/bin/${GOOS}_${GOARCH}/go$GOEXE
+! exec $WORK/new/bin/${GOOS}_${GOARCH}/go$GOEXE env GOROOT
+stderr '^go: cannot find GOROOT directory: ''go'' binary is trimmed and GOROOT is not set$'
+
+# Relocated Tree:
+# If the binary is sitting in a bin dir next to ../pkg/tool, that counts as a GOROOT,
+# so it should find the new tree.
+mkdir $WORK/new/pkg/tool
+exec $WORK/bin/check$GOEXE $WORK/new/bin/go$GOEXE $WORK/new
+exec $WORK/bin/check$GOEXE $WORK/new/bin/${GOOS}_${GOARCH}/go$GOEXE $WORK/new
+
+-- check.go --
+package main
+
+import (
+	"fmt"
+	"os"
+	"os/exec"
+	"path/filepath"
+	"strings"
+)
+
+func main() {
+	exe := os.Args[1]
+	want := os.Args[2]
+	cmd := exec.Command(exe, "env", "GOROOT")
+	out, err := cmd.CombinedOutput()
+	if err != nil {
+		fmt.Fprintf(os.Stderr, "%s env GOROOT: %v, %s\n", exe, err, out)
+		os.Exit(1)
+	}
+	goroot, err := filepath.EvalSymlinks(strings.TrimSpace(string(out)))
+	if err != nil {
+		fmt.Fprintln(os.Stderr, err)
+		os.Exit(1)
+	}
+	want, err = filepath.EvalSymlinks(want)
+	if err != nil {
+		fmt.Fprintln(os.Stderr, err)
+		os.Exit(1)
+	}
+	if !strings.EqualFold(goroot, want) {
+		fmt.Fprintf(os.Stderr, "go env GOROOT:\nhave %s\nwant %s\n", goroot, want)
+		os.Exit(1)
+	}
+	fmt.Fprintf(os.Stderr, "go env GOROOT: %s\n", goroot)
+
+}
diff --git a/src/cmd/go/testdata/script/gotoolchain_local.txt b/src/cmd/go/testdata/script/gotoolchain_local.txt
new file mode 100644
index 0000000..93f5570
--- /dev/null
+++ b/src/cmd/go/testdata/script/gotoolchain_local.txt
@@ -0,0 +1,243 @@
+# This test uses the fake toolchain switch support in cmd/go/internal/toolchain.Switch
+# to exercise all the version selection logic without needing actual toolchains.
+# See gotoolchain_net.txt and gotoolchain_path.txt for tests of network and PATH toolchains.
+
+env TESTGO_VERSION=go1.500
+env TESTGO_VERSION_SWITCH=switch
+
+# GOTOOLCHAIN=auto runs default toolchain without a go.mod or go.work
+env GOTOOLCHAIN=auto
+go version
+stdout go1.500
+
+# GOTOOLCHAIN=path runs default toolchain without a go.mod or go.work
+env GOTOOLCHAIN=path
+go version
+stdout go1.500
+
+# GOTOOLCHAIN=asdf is a syntax error
+env GOTOOLCHAIN=asdf
+! go version
+stderr '^go: invalid GOTOOLCHAIN "asdf"$'
+
+# GOTOOLCHAIN=version is used directly.
+env GOTOOLCHAIN=go1.600
+go version
+stdout go1.600
+
+env GOTOOLCHAIN=go1.400
+go version
+stdout go1.400
+
+# GOTOOLCHAIN=version+auto sets a minimum.
+env GOTOOLCHAIN=go1.600+auto
+go version
+stdout go1.600
+
+env GOTOOLCHAIN=go1.400.0+auto
+go version
+stdout go1.400.0
+
+# GOTOOLCHAIN=version+path sets a minimum too.
+env GOTOOLCHAIN=go1.600+path
+go version
+stdout go1.600
+
+env GOTOOLCHAIN=go1.400+path
+go version
+stdout go1.400
+
+# Create a go.mod file and test interactions with auto and path.
+
+# GOTOOLCHAIN=auto uses go line if newer than local toolchain.
+env GOTOOLCHAIN=auto
+go mod init m
+go mod edit -go=1.700 -toolchain=none
+go version
+stdout 1.700
+
+go mod edit -go=1.300 -toolchain=none
+go version
+stdout 1.500 # local toolchain is newer
+
+go mod edit -go=1.700 -toolchain=go1.300
+go version
+stdout go1.700 # toolchain too old, ignored
+
+go mod edit -go=1.300 -toolchain=default
+go version
+stdout go1.500
+
+go mod edit -go=1.700 -toolchain=default
+go version
+stdout go1.500 # toolchain local is like GOTOOLCHAIN=local and wins
+! go build
+stderr '^go: go.mod requires go >= 1.700 \(running go 1.500; go.mod sets toolchain default\)'
+
+# GOTOOLCHAIN=path does the same.
+env GOTOOLCHAIN=path
+go mod edit -go=1.700 -toolchain=none
+go version
+stdout 1.700
+
+go mod edit -go=1.300 -toolchain=none
+go version
+stdout 1.500 # local toolchain is newer
+
+go mod edit -go=1.700 -toolchain=go1.300
+go version
+stdout go1.700 # toolchain too old, ignored
+
+go mod edit -go=1.300 -toolchain=default
+go version
+stdout go1.500
+
+go mod edit -go=1.700 -toolchain=default
+go version
+stdout go1.500 # toolchain default applies even if older than go line
+! go build
+stderr '^go: go.mod requires go >= 1.700 \(running go 1.500; GOTOOLCHAIN=path; go.mod sets toolchain default\)'
+
+# GOTOOLCHAIN=min+auto with toolchain default uses min, not local
+
+env GOTOOLCHAIN=go1.400+auto
+go mod edit -go=1.300 -toolchain=default
+go version
+stdout 1.400 # not 1.500 local toolchain
+
+env GOTOOLCHAIN=go1.600+auto
+go mod edit -go=1.300 -toolchain=default
+go version
+stdout 1.600 # not 1.500 local toolchain
+
+# GOTOOLCHAIN names can have -suffix
+env GOTOOLCHAIN=go1.800-bigcorp
+go version
+stdout go1.800-bigcorp
+
+env GOTOOLCHAIN=auto
+go mod edit -go=1.999 -toolchain=go1.800-bigcorp
+go version
+stdout go1.999
+
+go mod edit -go=1.777 -toolchain=go1.800-bigcorp
+go version
+stdout go1.800-bigcorp
+
+# go.work takes priority over go.mod
+go mod edit -go=1.700 -toolchain=go1.999-wrong
+go work init
+go work edit -go=1.400 -toolchain=go1.600-right
+go version
+stdout go1.600-right
+
+go work edit -go=1.400 -toolchain=default
+go version
+stdout go1.500
+
+# go.work misconfiguration does not break go work edit
+# ('go 1.600 / toolchain local' forces use of 1.500 which can't normally load that go.work; allow work edit to fix it.)
+go work edit -go=1.600 -toolchain=default
+go version
+stdout go1.500
+
+go work edit -toolchain=none
+go version
+stdout go1.600
+
+rm go.work
+
+# go.mod misconfiguration does not break go mod edit
+go mod edit -go=1.600 -toolchain=default
+go version
+stdout go1.500
+
+go mod edit -toolchain=none
+go version
+stdout go1.600
+
+# toolchain built with a custom version should know how it compares to others
+
+env TESTGO_VERSION=go1.500-bigcorp
+go mod edit -go=1.499 -toolchain=none
+go version
+stdout go1.500-bigcorp
+
+go mod edit -go=1.500 -toolchain=none
+go version
+stdout go1.500-bigcorp
+
+go mod edit -go=1.501 -toolchain=none
+go version
+stdout go1.501
+
+env TESTGO_VERSION='go1.500 (bigcorp)'
+go mod edit -go=1.499 -toolchain=none
+go version
+stdout 'go1.500 \(bigcorp\)'
+
+go mod edit -go=1.500 -toolchain=none
+go version
+stdout 'go1.500 \(bigcorp\)'
+
+go mod edit -go=1.501 -toolchain=none
+go version
+stdout go1.501
+
+# go install m@v and go run m@v should ignore go.mod and use m@v
+env TESTGO_VERSION=go1.2.3
+go mod edit -go=1.999 -toolchain=go1.998
+
+! go install rsc.io/fortune/nonexist@v0.0.1
+stderr '^go: rsc.io/fortune@v0.0.1 requires go >= 1.21rc999; switching to go1.22.9$'
+stderr '^go: rsc.io/fortune/nonexist@v0.0.1: module rsc.io/fortune@v0.0.1 found, but does not contain package rsc.io/fortune/nonexist'
+
+! go run rsc.io/fortune/nonexist@v0.0.1
+stderr '^go: rsc.io/fortune@v0.0.1 requires go >= 1.21rc999; switching to go1.22.9$'
+stderr '^go: rsc.io/fortune/nonexist@v0.0.1: module rsc.io/fortune@v0.0.1 found, but does not contain package rsc.io/fortune/nonexist'
+
+# go install should handle unknown flags to find m@v
+! go install -unknownflag rsc.io/fortune/nonexist@v0.0.1
+stderr '^go: rsc.io/fortune@v0.0.1 requires go >= 1.21rc999; switching to go1.22.9$'
+stderr '^flag provided but not defined: -unknownflag'
+
+! go install -unknownflag arg rsc.io/fortune/nonexist@v0.0.1
+stderr '^go: rsc.io/fortune@v0.0.1 requires go >= 1.21rc999; switching to go1.22.9$'
+stderr '^flag provided but not defined: -unknownflag'
+
+# go run cannot handle unknown boolean flags
+! go run -unknownflag rsc.io/fortune/nonexist@v0.0.1
+! stderr switching
+stderr '^flag provided but not defined: -unknownflag'
+
+! go run -unknownflag oops rsc.io/fortune/nonexist@v0.0.1
+! stderr switching
+stderr '^flag provided but not defined: -unknownflag'
+
+# go run can handle unknown flag with argument.
+! go run -unknown=flag rsc.io/fortune/nonexist@v0.0.1
+stderr '^go: rsc.io/fortune@v0.0.1 requires go >= 1.21rc999; switching to go1.22.9$'
+stderr '^flag provided but not defined: -unknown'
+
+# go install m@v should handle queries
+! go install rsc.io/fortune/nonexist@v0.0
+stderr '^go: rsc.io/fortune@v0.0.1 requires go >= 1.21rc999; switching to go1.22.9$'
+stderr '^go: rsc.io/fortune/nonexist@v0.0: module rsc.io/fortune@v0.0 found \(v0.0.1\), but does not contain package rsc.io/fortune/nonexist'
+
+# go run m@v should handle queries
+! go install rsc.io/fortune/nonexist@v0
+stderr '^go: rsc.io/fortune@v0.0.1 requires go >= 1.21rc999; switching to go1.22.9$'
+stderr '^go: rsc.io/fortune/nonexist@v0: module rsc.io/fortune@v0 found \(v0.0.1\), but does not contain package rsc.io/fortune/nonexist'
+
+# go install m@v should use local toolchain if not upgrading
+! go install rsc.io/fortune/nonexist@v1
+! stderr go1.22.9
+! stderr switching
+stderr '^go: downloading rsc.io/fortune v1.0.0$'
+stderr '^go: rsc.io/fortune/nonexist@v1: module rsc.io/fortune@v1 found \(v1.0.0\), but does not contain package rsc.io/fortune/nonexist'
+
+# go run m@v should use local toolchain if not upgrading
+! go run rsc.io/fortune/nonexist@v1
+! stderr go1.22.9
+! stderr switching
+stderr '^go: rsc.io/fortune/nonexist@v1: module rsc.io/fortune@v1 found \(v1.0.0\), but does not contain package rsc.io/fortune/nonexist'
diff --git a/src/cmd/go/testdata/script/gotoolchain_loop.txt b/src/cmd/go/testdata/script/gotoolchain_loop.txt
new file mode 100644
index 0000000..a803d2e
--- /dev/null
+++ b/src/cmd/go/testdata/script/gotoolchain_loop.txt
@@ -0,0 +1,65 @@
+env GOTOOLCHAIN=auto
+env TESTGO_VERSION=go1.21.1
+
+# Basic switch should work.
+env TESTGO_VERSION_SWITCH=switch
+go version
+stdout go1.21.99
+
+# Toolchain target mismatch should be detected.
+env TESTGO_VERSION_SWITCH=mismatch
+! go version
+stderr '^go: toolchain go1.21.1 invoked to provide go1.21.99$'
+
+# Toolchain loop should be detected.
+env TESTGO_VERSION_SWITCH=loop
+! go version
+stderr -count=10 '^go: switching from go1.21.1 to go1.21.99 \[depth 9[0-9]\]$'
+stderr -count=1 '^go: switching from go1.21.1 to go1.21.99 \[depth 100\]$'
+stderr '^go: too many toolchain switches$'
+
+[short] skip
+
+# Internal env vars should not leak to go test or go run.
+env TESTGO_VERSION_SWITCH=switch
+go version
+stdout go1.21.99
+go test
+stdout clean
+go run .
+stdout clean
+
+-- go.mod --
+module m
+go 1.21.99
+
+-- m_test.go --
+package main
+
+import "testing"
+
+func TestEnv(t *testing.T) {
+	// the check is in func init in m.go
+}
+
+-- m.go --
+package main
+
+import "os"
+
+func init() {
+	envs := []string{
+		"GOTOOLCHAIN_INTERNAL_SWITCH_COUNT",
+		"GOTOOLCHAIN_INTERNAL_SWITCH_VERSION",
+	}
+	for _, e := range envs {
+		if v := os.Getenv(e); v != "" {
+			panic("$"+e+"="+v)
+		}
+	}
+	os.Stdout.WriteString("clean\n")
+}
+
+func main() {
+}
+
diff --git a/src/cmd/go/testdata/script/gotoolchain_modcmds.txt b/src/cmd/go/testdata/script/gotoolchain_modcmds.txt
new file mode 100644
index 0000000..83b75f0
--- /dev/null
+++ b/src/cmd/go/testdata/script/gotoolchain_modcmds.txt
@@ -0,0 +1,54 @@
+env TESTGO_VERSION=go1.21.0
+env TESTGO_VERSION_SWITCH=switch
+
+# If the main module's go.mod file lists a version lower than the version
+# required by its dependencies, the commands that fetch and diagnose the module
+# graph (such as 'go mod download' and 'go mod graph') should fail explicitly:
+# they can't interpret the graph themselves, and they aren't allowed to update
+# the go.mod file to record a specific, stable toolchain version that can.
+
+! go mod download rsc.io/future@v1.0.0
+stderr '^go: rsc.io/future@v1.0.0 requires go >= 1.999 \(running go 1.21.0\)'
+
+! go mod download rsc.io/future
+stderr '^go: rsc.io/future@v1.0.0 requires go >= 1.999 \(running go 1.21.0\)'
+
+! go mod download
+stderr '^go: rsc.io/future@v1.0.0: module rsc.io/future@v1.0.0 requires go >= 1.999 \(running go 1.21.0\)'
+
+! go mod verify
+stderr '^go: rsc.io/future@v1.0.0: module rsc.io/future@v1.0.0 requires go >= 1.999 \(running go 1.21.0\)'
+
+! go mod graph
+stderr '^go: rsc.io/future@v1.0.0: module rsc.io/future@v1.0.0 requires go >= 1.999 \(running go 1.21.0\)'
+
+
+# 'go get' should update the main module's go.mod file to a version compatible with the
+# go version required for rsc.io/future, not fail.
+go get .
+stderr '^go: module rsc.io/future@v1.0.0 requires go >= 1.999; switching to go1.999testmod$'
+stderr '^go: upgraded go 1.21 => 1.999$'
+stderr '^go: added toolchain go1.999testmod$'
+
+
+# Now, the various 'go mod' subcommands should succeed.
+
+go mod download rsc.io/future@v1.0.0
+go mod download rsc.io/future
+go mod download
+
+go mod verify
+
+go mod graph
+
+
+-- go.mod --
+module example
+
+go 1.21
+
+require rsc.io/future v1.0.0
+-- example.go --
+package example
+
+import _ "rsc.io/future"
diff --git a/src/cmd/go/testdata/script/gotoolchain_net.txt b/src/cmd/go/testdata/script/gotoolchain_net.txt
new file mode 100644
index 0000000..35f6696
--- /dev/null
+++ b/src/cmd/go/testdata/script/gotoolchain_net.txt
@@ -0,0 +1,65 @@
+# This test only checks that basic network lookups work.
+# The full test of toolchain version selection is in gotoolchain.txt.
+
+env TESTGO_VERSION=go1.21actual
+
+# GOTOOLCHAIN from network, does not exist
+env GOTOOLCHAIN=go1.9999x
+! go version
+stderr 'go: download go1.9999x for .*: toolchain not available'
+
+# GOTOOLCHAIN from network
+[!exec:/bin/sh] stop 'the fake proxy serves shell scripts instead of binaries'
+env GOTOOLCHAIN=go1.999testmod
+go version
+stderr 'go: downloading go1.999testmod \(.*/.*\)'
+
+# GOTOOLCHAIN cached from network
+go version
+! stderr downloading
+stdout go1.999testmod
+
+# GOTOOLCHAIN with GOSUMDB enabled but at a bad URL should operate in cache and not try badurl
+env oldsumdb=$GOSUMDB
+env GOSUMDB=$oldsumdb' http://badurl'
+go version
+! stderr downloading
+stdout go1.999testmod
+
+# GOTOOLCHAIN with GOSUMB=off should fail, because it cannot access even the cached sumdb info
+# without the sumdb name.
+env GOSUMDB=off
+! go version
+stderr '^go: golang.org/toolchain@v0.0.1-go1.999testmod.[a-z0-9\-]*: verifying module: checksum database disabled by GOSUMDB=off$'
+
+# GOTOOLCHAIN with GOSUMDB enabled but at a bad URL should fail if cache is incomplete
+env GOSUMDB=$oldsumdb' http://badurl'
+rm $GOPATH/pkg/mod/cache/download/sumdb
+! go version
+! stderr downloading
+stderr 'panic: use of network' # test catches network access
+env GOSUMDB=$oldsumdb
+
+# Test a real GOTOOLCHAIN
+[short] skip
+[!net:golang.org] skip
+[!net:sum.golang.org] skip
+[!GOOS:darwin] [!GOOS:windows] [!GOOS:linux] skip
+[!GOARCH:amd64] [!GOARCH:arm64] skip
+
+env GOPROXY=
+[go-builder] env GOSUMDB=
+[!go-builder] env GOSUMDB=sum.golang.org  # Set explicitly in case GOROOT/go.env is modified.
+env GOTOOLCHAIN=go1.20.1
+
+	# Avoid resolving a "go1.20.1" from the user's real $PATH.
+	# That would not only cause the "downloading go1.20.1" message
+	# to be suppressed, but may spuriously fail:
+	# golang.org/dl/go1.20.1 expects to find its GOROOT in $HOME/sdk,
+	# but the script environment sets HOME=/no-home.
+env PATH=
+env path=
+
+go version
+stderr '^go: downloading go1.20.1 '
+stdout go1.20.1
diff --git a/src/cmd/go/testdata/script/gotoolchain_path.txt b/src/cmd/go/testdata/script/gotoolchain_path.txt
new file mode 100644
index 0000000..9628348
--- /dev/null
+++ b/src/cmd/go/testdata/script/gotoolchain_path.txt
@@ -0,0 +1,86 @@
+# This test only checks that basic PATH lookups work.
+# The full test of toolchain version selection is in gotoolchain.txt.
+
+[short] skip
+
+env TESTGO_VERSION=go1.21pre3
+
+# Compile a fake toolchain to put in the path under various names.
+env GOTOOLCHAIN=
+mkdir $WORK/bin
+go build -o $WORK/bin/ ./fakego.go  # adds .exe extension implicitly on Windows
+cp $WORK/bin/fakego$GOEXE $WORK/bin/go1.50.0$GOEXE
+
+[!GOOS:plan9] env PATH=$WORK/bin
+[GOOS:plan9] env path=$WORK/bin
+
+go version
+stdout go1.21pre3
+
+# GOTOOLCHAIN=go1.50.0
+env GOTOOLCHAIN=go1.50.0
+! go version
+stderr 'running go1.50.0 from PATH'
+
+# GOTOOLCHAIN=path with toolchain line
+env GOTOOLCHAIN=local
+go mod init m
+go mod edit -toolchain=go1.50.0
+grep go1.50.0 go.mod
+env GOTOOLCHAIN=path
+! go version
+stderr 'running go1.50.0 from PATH'
+
+# GOTOOLCHAIN=path with go line
+env GOTOOLCHAIN=local
+go mod edit -toolchain=none -go=1.50.0
+grep 'go 1.50.0' go.mod
+! grep toolchain go.mod
+env GOTOOLCHAIN=path
+! go version
+stderr 'running go1.50.0 from PATH'
+
+# GOTOOLCHAIN=auto with toolchain line
+env GOTOOLCHAIN=local
+go mod edit -toolchain=go1.50.0 -go=1.21
+grep 'go 1.21$' go.mod
+grep 'toolchain go1.50.0' go.mod
+env GOTOOLCHAIN=auto
+! go version
+stderr 'running go1.50.0 from PATH'
+
+# GOTOOLCHAIN=auto with go line
+env GOTOOLCHAIN=local
+go mod edit -toolchain=none -go=1.50.0
+grep 'go 1.50.0$' go.mod
+! grep toolchain go.mod
+env GOTOOLCHAIN=auto
+! go version
+stderr 'running go1.50.0 from PATH'
+
+# NewerToolchain should find Go 1.50.0.
+env GOTOOLCHAIN=local
+go mod edit -toolchain=none -go=1.22
+grep 'go 1.22$' go.mod
+! grep toolchain go.mod
+env GOTOOLCHAIN=path
+! go run rsc.io/fortune@v0.0.1
+stderr 'running go1.50.0 from PATH'
+
+-- fakego.go --
+package main
+
+import (
+	"fmt"
+	"os"
+	"path/filepath"
+	"strings"
+)
+
+func main() {
+	exe, _ := os.Executable()
+	name := filepath.Base(exe)
+	name = strings.TrimSuffix(name, ".exe")
+	fmt.Fprintf(os.Stderr, "running %s from PATH\n", name)
+	os.Exit(1) // fail in case we are running this accidentally (like in "go mod edit")
+}
diff --git a/src/cmd/go/testdata/script/gotoolchain_version.txt b/src/cmd/go/testdata/script/gotoolchain_version.txt
new file mode 100644
index 0000000..e0736ff
--- /dev/null
+++ b/src/cmd/go/testdata/script/gotoolchain_version.txt
@@ -0,0 +1,22 @@
+[!net:proxy.golang.org] skip
+
+	# In the Go project's official release GOPROXY defaults to proxy.golang.org,
+	# but it may be changed in GOROOT/go.env (such as in third-party
+	# distributions).
+	#
+	# Make sure it is in use here, because the server for releases not served
+	# through the proxy (https://golang.org/toolchain?go-get=1) currently only
+	# serves the latest patch release for each of the supported stable releases.
+
+[go-builder] env GOPROXY=
+[!go-builder] env GOPROXY=https://proxy.golang.org
+
+go list -m -versions go
+stdout 1.20.1 # among others
+stdout 1.19rc2
+! stdout go1.20.1 # no go prefixes
+! stdout go1.19rc2
+
+go list -m -versions toolchain
+stdout go1.20.1 # among others
+stdout go1.19rc2
diff --git a/src/cmd/go/testdata/script/govcs.txt b/src/cmd/go/testdata/script/govcs.txt
index 419a6c5..dd128cc 100644
--- a/src/cmd/go/testdata/script/govcs.txt
+++ b/src/cmd/go/testdata/script/govcs.txt
@@ -67,12 +67,12 @@
 # git is OK by default
 env GOVCS=
 env GONOSUMDB='*'
-[net] [git] [!short] go get rsc.io/sampler
+[net:rsc.io] [git] [!short] go get rsc.io/sampler
 
 # hg is OK by default
 env GOVCS=
 env GONOSUMDB='*'
-[net] [exec:hg] [!short] go get vcs-test.golang.org/go/custom-hg-hello
+[exec:hg] [!short] go get vcs-test.golang.org/go/custom-hg-hello
 
 # git can be disallowed
 env GOVCS=public:hg
@@ -150,12 +150,12 @@
 # git is OK by default
 env GOVCS=
 env GONOSUMDB='*'
-[net] [git] [!short] go get rsc.io/sampler
+[net:rsc.io] [git] [!short] go get rsc.io/sampler
 
 # hg is OK by default
 env GOVCS=
 env GONOSUMDB='*'
-[net] [exec:hg] [!short] go get vcs-test.golang.org/go/custom-hg-hello
+[exec:hg] [!short] go get vcs-test.golang.org/go/custom-hg-hello
 
 # git can be disallowed
 env GOVCS=public:hg
diff --git a/src/cmd/go/testdata/script/install_dep_version.txt b/src/cmd/go/testdata/script/install_dep_version.txt
index 22b52e5..58330e6 100644
--- a/src/cmd/go/testdata/script/install_dep_version.txt
+++ b/src/cmd/go/testdata/script/install_dep_version.txt
@@ -3,4 +3,6 @@
 # because the checksumOk function was failing because modfetch.GoSumFile
 # was not set when running outside of a module.
 
+env GOTOOLCHAIN=local
+
 go install --mod=readonly example.com/depends/on/generics@v1.0.0
\ No newline at end of file
diff --git a/src/cmd/go/testdata/script/install_shadow_gopath.txt b/src/cmd/go/testdata/script/install_shadow_gopath.txt
index 2039d9e..148e6cc 100644
--- a/src/cmd/go/testdata/script/install_shadow_gopath.txt
+++ b/src/cmd/go/testdata/script/install_shadow_gopath.txt
@@ -1,8 +1,6 @@
 # Tests Issue #3562
 # go get foo.io (not foo.io/subdir) was not working consistently.
 
-[!net] skip
-
 env GO111MODULE=off
 env GOPATH=$WORK/gopath1${:}$WORK/gopath2
 
diff --git a/src/cmd/go/testdata/script/link_external_undef.txt b/src/cmd/go/testdata/script/link_external_undef.txt
index d86b3a3..f320505 100644
--- a/src/cmd/go/testdata/script/link_external_undef.txt
+++ b/src/cmd/go/testdata/script/link_external_undef.txt
@@ -7,7 +7,7 @@
 
 ! go build -ldflags='-linkmode=external' .
 ! stderr 'panic'
-stderr '^.*unreachable sym in relocation.*'
+stderr '^.*undefined symbol in relocation.*'
 
 -- go.mod --
 
diff --git a/src/cmd/go/testdata/script/list_all_gobuild.txt b/src/cmd/go/testdata/script/list_all_gobuild.txt
index e0a4739..92ad7d8 100644
--- a/src/cmd/go/testdata/script/list_all_gobuild.txt
+++ b/src/cmd/go/testdata/script/list_all_gobuild.txt
@@ -1,5 +1,6 @@
 # go list all should work with GOOS=linux because all packages build on Linux
 env GOOS=linux
+env GOARCH=amd64
 go list all
 
 # go list all should work with GOOS=darwin, but it used to fail because
diff --git a/src/cmd/go/testdata/script/list_cgo_compiled_importmap.txt b/src/cmd/go/testdata/script/list_cgo_compiled_importmap.txt
index 30effb1..8693339 100644
--- a/src/cmd/go/testdata/script/list_cgo_compiled_importmap.txt
+++ b/src/cmd/go/testdata/script/list_cgo_compiled_importmap.txt
@@ -7,9 +7,12 @@
 
 [short] skip  # -compiled can be slow (because it compiles things)
 [!cgo] skip
+[GOOS:darwin] skip # net package does not import "C" on Darwin
+[GOOS:windows] skip # net package does not import "C" on Windows
+[GOOS:plan9] skip # net package does not import "C" on Plan 9
 
 env CGO_ENABLED=1
-env GOFLAGS=-tags=netcgo  # Force net to use cgo even on Windows.
+env GOFLAGS=-tags=netcgo  # Force net to use cgo
 
 
 # "runtime/cgo [runtime.test]" appears in the test dependencies of "runtime",
diff --git a/src/cmd/go/testdata/script/list_empty_import.txt b/src/cmd/go/testdata/script/list_empty_import.txt
new file mode 100644
index 0000000..4d76f09
--- /dev/null
+++ b/src/cmd/go/testdata/script/list_empty_import.txt
@@ -0,0 +1,9 @@
+! go list a.go
+! stdout .
+stderr 'invalid import path'
+! stderr panic
+
+-- a.go --
+package a
+
+import ""
diff --git a/src/cmd/go/testdata/script/list_export_embed.txt b/src/cmd/go/testdata/script/list_export_embed.txt
new file mode 100644
index 0000000..da74998
--- /dev/null
+++ b/src/cmd/go/testdata/script/list_export_embed.txt
@@ -0,0 +1,17 @@
+# Regression test for https://go.dev/issue/58885:
+# 'go list -json=Export' should not fail due to missing go:embed metadata.
+
+[short] skip 'runs the compiler to produce export data'
+
+go list -json=Export -export .
+
+-- go.mod --
+module example
+go 1.20
+-- example.go --
+package example
+
+import _ "embed"
+
+//go:embed example.go
+var src string
diff --git a/src/cmd/go/testdata/script/list_goroot_symlink.txt b/src/cmd/go/testdata/script/list_goroot_symlink.txt
index 8e50e4b..041ae55 100644
--- a/src/cmd/go/testdata/script/list_goroot_symlink.txt
+++ b/src/cmd/go/testdata/script/list_goroot_symlink.txt
@@ -6,6 +6,8 @@
 
 [short] skip 'copies the cmd/go binary'
 [!symlink] skip 'tests symlink-specific behavior'
+[GOOS:darwin] skip 'Lstat on darwin does not conform to POSIX pathname resolution; see #59586'
+[GOOS:ios] skip 'Lstat on ios does not conform to POSIX pathname resolution; see #59586'
 
 # Ensure that the relative path to $WORK/lib/goroot/src from $PWD is a different
 # number of ".." hops than the relative path to it from $WORK/share/goroot/src.
@@ -45,10 +47,8 @@
 exec $WORK/lib/goroot/bin/go list -f '{{.ImportPath}}: {{.Dir}}' encoding/binary
 stdout '^encoding/binary: '$WORK${/}lib${/}goroot${/}src${/}encoding${/}binary'$'
 
-	# BUG(#50807): This doesn't work on Windows for some reason — perhaps
-	# a bug in the Windows Lstat implementation with trailing separators?
-[!GOOS:windows] exec $WORK/lib/goroot/bin/go list -f '{{.ImportPath}}: {{.Dir}}' std
-[!GOOS:windows] stdout '^encoding/binary: '$WORK${/}lib${/}goroot${/}src${/}encoding${/}binary'$'
+exec $WORK/lib/goroot/bin/go list -f '{{.ImportPath}}: {{.Dir}}' std
+stdout '^encoding/binary: '$WORK${/}lib${/}goroot${/}src${/}encoding${/}binary'$'
 
 # Most path lookups in GOROOT are not sensitive to symlinks. However, patterns
 # involving '...' wildcards must use Walk to check the GOROOT tree, which makes
@@ -57,7 +57,6 @@
 # So we check such a pattern to confirm that it works and reports a path relative
 # to $GOROOT/src (and not the symlink target).
 
-	# BUG(#50807): This should report encoding/binary, not "matched no packages".
 exec $WORK/lib/goroot/bin/go list -f '{{.ImportPath}}: {{.Dir}}' .../binary
-! stdout .
-stderr '^go: warning: "\.\.\./binary" matched no packages$'
+stdout '^encoding/binary: '$WORK${/}lib${/}goroot${/}src${/}encoding${/}binary'$'
+! stderr .
diff --git a/src/cmd/go/testdata/script/list_import_cycle_deps_errors.txt b/src/cmd/go/testdata/script/list_import_cycle_deps_errors.txt
new file mode 100644
index 0000000..e2c5cf9
--- /dev/null
+++ b/src/cmd/go/testdata/script/list_import_cycle_deps_errors.txt
@@ -0,0 +1,75 @@
+go list -e -deps -json=ImportPath,Error,DepsErrors m/a
+cmp stdout want
+
+-- want --
+{
+	"ImportPath": "m/c",
+	"DepsErrors": [
+		{
+			"ImportStack": [
+				"m/a",
+				"m/b",
+				"m/c",
+				"m/a"
+			],
+			"Pos": "",
+			"Err": "import cycle not allowed"
+		}
+	]
+}
+{
+	"ImportPath": "m/b",
+	"DepsErrors": [
+		{
+			"ImportStack": [
+				"m/a",
+				"m/b",
+				"m/c",
+				"m/a"
+			],
+			"Pos": "",
+			"Err": "import cycle not allowed"
+		}
+	]
+}
+{
+	"ImportPath": "m/a",
+	"Error": {
+		"ImportStack": [
+			"m/a",
+			"m/b",
+			"m/c",
+			"m/a"
+		],
+		"Pos": "",
+		"Err": "import cycle not allowed"
+	},
+	"DepsErrors": [
+		{
+			"ImportStack": [
+				"m/a",
+				"m/b",
+				"m/c",
+				"m/a"
+			],
+			"Pos": "",
+			"Err": "import cycle not allowed"
+		}
+	]
+}
+-- go.mod --
+module m
+
+go 1.21
+-- a/a.go --
+package a
+
+import _ "m/b"
+-- b/b.go --
+package b
+
+import _ "m/c"
+-- c/c.go --
+package c
+
+import _ "m/a"
\ No newline at end of file
diff --git a/src/cmd/go/testdata/script/list_import_err.txt b/src/cmd/go/testdata/script/list_import_err.txt
new file mode 100644
index 0000000..c2b7d7c
--- /dev/null
+++ b/src/cmd/go/testdata/script/list_import_err.txt
@@ -0,0 +1,22 @@
+# Test that errors importing packages are reported on the importing package,
+# not the imported package.
+
+env GO111MODULE=off # simplify vendor layout for test
+
+go list -e -deps -f '{{.ImportPath}}: {{.Error}}' ./importvendor
+stdout 'importvendor: importvendor[\\/]p.go:2:8: vendor/p must be imported as p'
+stdout 'vendor/p: <nil>'
+
+go list -e -deps -f '{{.ImportPath}}: {{.Error}}' ./importinternal
+stdout 'importinternal: package importinternal\n\timportinternal[\\/]p.go:2:8: use of internal package other/internal/p not allowed'
+stdout 'other/internal/p: <nil>'
+-- importvendor/p.go --
+package importvendor
+import "vendor/p"
+-- importinternal/p.go --
+package importinternal
+import "other/internal/p"
+-- other/internal/p/p.go --
+package p
+-- vendor/p/p.go --
+package p
\ No newline at end of file
diff --git a/src/cmd/go/testdata/script/list_issue_59905.txt b/src/cmd/go/testdata/script/list_issue_59905.txt
new file mode 100644
index 0000000..48c40d0
--- /dev/null
+++ b/src/cmd/go/testdata/script/list_issue_59905.txt
@@ -0,0 +1,88 @@
+# Expect no panic
+go list -f '{{if .DepsErrors}}{{.DepsErrors}}{{end}}' -export -e -deps
+cmpenv stdout wanterr_59905
+
+# Expect no panic (Issue 61816)
+cp level1b_61816.txt level1b/pkg.go
+go list -f '{{if .DepsErrors}}{{.DepsErrors}}{{end}}' -export -e -deps
+cmpenv stdout wanterr_61816
+
+-- wanterr_59905 --
+[# test/main/level1a
+level1a${/}pkg.go:5:2: level2x redeclared in this block
+	level1a${/}pkg.go:4:2: other declaration of level2x
+level1a${/}pkg.go:5:2: "test/main/level1a/level2y" imported as level2x and not used
+level1a${/}pkg.go:8:39: undefined: level2y
+ # test/main/level1b
+level1b${/}pkg.go:5:2: level2x redeclared in this block
+	level1b${/}pkg.go:4:2: other declaration of level2x
+level1b${/}pkg.go:5:2: "test/main/level1b/level2y" imported as level2x and not used
+level1b${/}pkg.go:8:39: undefined: level2y
+]
+-- wanterr_61816 --
+[level1b${/}pkg.go:4:2: package foo is not in std ($GOROOT${/}src${/}foo)]
+[# test/main/level1a
+level1a${/}pkg.go:5:2: level2x redeclared in this block
+	level1a${/}pkg.go:4:2: other declaration of level2x
+level1a${/}pkg.go:5:2: "test/main/level1a/level2y" imported as level2x and not used
+level1a${/}pkg.go:8:39: undefined: level2y
+ level1b${/}pkg.go:4:2: package foo is not in std ($GOROOT${/}src${/}foo)]
+-- level1b_61816.txt --
+package level1b
+
+import (
+	"foo"
+)
+
+func Print() { println(level2x.Value, level2y.Value) }
+
+-- go.mod --
+module test/main
+
+go 1.20
+-- main.go --
+package main
+
+import (
+	"test/main/level1a"
+	"test/main/level1b"
+)
+
+func main() {
+	level1a.Print()
+	level1b.Print()
+}
+-- level1a/pkg.go --
+package level1a
+
+import (
+	"test/main/level1a/level2x"
+	"test/main/level1a/level2y"
+)
+
+func Print() { println(level2x.Value, level2y.Value) }
+-- level1a/level2x/pkg.go --
+package level2x
+
+var Value = "1a/2x"
+-- level1a/level2y/pkg.go --
+package level2x
+
+var Value = "1a/2y"
+-- level1b/pkg.go --
+package level1b
+
+import (
+	"test/main/level1b/level2x"
+	"test/main/level1b/level2y"
+)
+
+func Print() { println(level2x.Value, level2y.Value) }
+-- level1b/level2x/pkg.go --
+package level2x
+
+var Value = "1b/2x"
+-- level1b/level2y/pkg.go --
+package level2x
+
+var Value = "1b/2y"
\ No newline at end of file
diff --git a/src/cmd/go/testdata/script/list_json_fields.txt b/src/cmd/go/testdata/script/list_json_fields.txt
index 54d2220..7e008ea 100644
--- a/src/cmd/go/testdata/script/list_json_fields.txt
+++ b/src/cmd/go/testdata/script/list_json_fields.txt
@@ -26,6 +26,21 @@
 stdout '"Deps": \['
 stdout '"errors",'
 
+# Test -json=<field> with *EmbedPatterns outputs embed patterns.
+cd embed
+go list -json=EmbedPatterns,TestEmbedPatterns,XTestEmbedPatterns
+stdout '"EmbedPatterns": \['
+stdout '"TestEmbedPatterns": \['
+stdout '"XTestEmbedPatterns": \['
+# Test -json=<field> with *EmbedFiles fails due to broken file reference.
+! go list -json=EmbedFiles
+stderr 'no matching files found'
+! go list -json=TestEmbedFiles
+stderr 'no matching files found'
+! go list -json=XTestEmbedFiles
+stderr 'no matching files found'
+cd ..
+
 [!git] skip
 
 # Test -json=<field> without Stale skips computing buildinfo
@@ -73,3 +88,26 @@
 package main
 
 func main() {}
+-- embed/go.mod --
+module example.com/embed
+-- embed/embed.go --
+package embed
+
+import _ "embed"
+
+//go:embed non-existing-file.txt
+var s string
+-- embed/embed_test.go --
+package embed
+
+import _ "embed"
+
+//go:embed non-existing-file.txt
+var s string
+-- embed/embed_xtest_test.go --
+package embed_test
+
+import _ "embed"
+
+//go:embed non-existing-file.txt
+var s string
diff --git a/src/cmd/go/testdata/script/list_parse_err.txt b/src/cmd/go/testdata/script/list_parse_err.txt
index 3c53458..0a3eb02 100644
--- a/src/cmd/go/testdata/script/list_parse_err.txt
+++ b/src/cmd/go/testdata/script/list_parse_err.txt
@@ -4,9 +4,9 @@
 ! go list -f '{{range .Imports}}{{.}} {{end}}' ./p
 stderr '^p[/\\]b.go:2:2: expected ''package'', found ''EOF''$'
 ! go list -test ./t
-stderr '^can''t load test package: t[/\\]t_test.go:8:1: expected declaration, found ʕ'
+stderr '^go: can''t load test package: t[/\\]t_test.go:8:1: expected declaration, found ʕ'
 ! go list -test -f '{{range .Imports}}{{.}} {{end}}' ./t
-stderr '^can''t load test package: t[/\\]t_test.go:8:1: expected declaration, found ʕ'
+stderr '^go: can''t load test package: t[/\\]t_test.go:8:1: expected declaration, found ʕ'
 
 # 'go list -e' should report imports, even if some files have parse errors
 # before the import block.
diff --git a/src/cmd/go/testdata/script/list_std_vendor.txt b/src/cmd/go/testdata/script/list_std_vendor.txt
index 8f27cc1..834babe 100644
--- a/src/cmd/go/testdata/script/list_std_vendor.txt
+++ b/src/cmd/go/testdata/script/list_std_vendor.txt
@@ -25,8 +25,9 @@
 # However, 'go mod' and 'go get' subcommands should report the original module
 # dependencies, not the vendored packages.
 
-[!net] stop
+[!net:golang.org] stop
 
 env GOPROXY=
+env GOWORK=off
 go mod why -m golang.org/x/net
 stdout '^# golang.org/x/net\nnet\ngolang.org/x/net'
diff --git a/src/cmd/go/testdata/script/list_symlink_dotdotdot.txt b/src/cmd/go/testdata/script/list_symlink_dotdotdot.txt
new file mode 100644
index 0000000..8df1982
--- /dev/null
+++ b/src/cmd/go/testdata/script/list_symlink_dotdotdot.txt
@@ -0,0 +1,20 @@
+[!symlink] skip
+
+symlink $WORK/gopath/src/sym -> $WORK/gopath/src/tree
+symlink $WORK/gopath/src/tree/squirrel -> $WORK/gopath/src/dir2 # this symlink should not be followed
+cd sym
+go list ./...
+cmp stdout $WORK/gopath/src/want_list.txt
+-- tree/go.mod --
+module example.com/tree
+
+go 1.20
+-- tree/tree.go --
+package tree
+-- tree/branch/branch.go --
+package branch
+-- dir2/squirrel.go --
+package squirrel
+-- want_list.txt --
+example.com/tree
+example.com/tree/branch
diff --git a/src/cmd/go/testdata/script/list_test_cycle.txt b/src/cmd/go/testdata/script/list_test_cycle.txt
new file mode 100644
index 0000000..67edf18
--- /dev/null
+++ b/src/cmd/go/testdata/script/list_test_cycle.txt
@@ -0,0 +1,34 @@
+go list ./p
+stdout 'example/p'
+
+! go list -json=ImportPath -test ./p
+cmp stderr wanterr.txt
+
+! go list -json=ImportPath,Deps -test ./p
+cmp stderr wanterr.txt
+
+! go list -json=ImportPath,Deps -deps -test ./p
+cmp stderr wanterr.txt
+
+! go list -json=ImportPath -deps -test ./p
+cmp stderr wanterr.txt
+
+-- wanterr.txt --
+go: can't load test package: package example/p
+	imports example/q
+	imports example/r
+	imports example/p: import cycle not allowed in test
+-- go.mod --
+module example
+go 1.20
+-- p/p.go --
+package p
+-- p/p_test.go --
+package p
+import "example/q"
+-- q/q.go --
+package q
+import "example/r"
+-- r/r.go --
+package r
+import "example/p"
diff --git a/src/cmd/go/testdata/script/list_test_err.txt b/src/cmd/go/testdata/script/list_test_err.txt
index 25dbb96..02bd6a1 100644
--- a/src/cmd/go/testdata/script/list_test_err.txt
+++ b/src/cmd/go/testdata/script/list_test_err.txt
@@ -3,19 +3,6 @@
 # issue 28491: errors in test source files should not prevent
 # "go list -test" from returning useful information.
 
-# go list prints information for package, internal test,
-# external test, but not testmain package when there is a
-# syntax error in test sources.
-! go list -test -deps syntaxerr
-stdout pkgdep
-stdout testdep_a
-stdout testdep_b
-stdout ^syntaxerr$
-stdout '^syntaxerr \[syntaxerr.test\]'
-stdout '^syntaxerr_test \[syntaxerr.test\]'
-! stdout '^syntaxerr\.test'
-stderr 'expected declaration'
-
 # go list -e prints information for all test packages.
 # The syntax error is shown in the package error field.
 go list -e -test -deps -f '{{.ImportPath}} {{.Error | printf "%q"}}' syntaxerr
@@ -30,13 +17,6 @@
 
 [short] stop
 
-# go list prints partial information with test naming error
-! go list -test -deps nameerr
-stdout pkgdep
-stdout testdep_a
-stdout testdep_b
-stderr 'wrong signature for TestBad'
-
 go list -e -test -deps -f '{{.ImportPath}} {{.Error | printf "%q"}}' nameerr
 stdout 'pkgdep <nil>'
 stdout 'testdep_a <nil>'
@@ -48,15 +28,10 @@
 ! go list -test -deps genericerr
 stderr 'wrong signature for TestGeneric, test functions cannot have type parameters'
 
-# go list prints partial information with error if test has cyclic import
-! go list -test -deps cycleerr
-stdout cycleerr
-stderr 'import cycle not allowed in test'
-
 go list -e -test -deps -f '{{.ImportPath}} {{.Error | printf "%q"}}' cycleerr
 stdout 'cycleerr <nil>'
 stdout 'testdep_a <nil>'
-stdout 'testdep_cycle <nil>'
+stdout 'testdep_cycle \[cycleerr.test\] <nil>'
 stdout 'cycleerr \[cycleerr.test\] "[^"]*import cycle not allowed in test'
 ! stderr 'import cycle not allowed in test'
 
diff --git a/src/cmd/go/testdata/script/mod_auth.txt b/src/cmd/go/testdata/script/mod_auth.txt
index d8ea586..5e2b7a9 100644
--- a/src/cmd/go/testdata/script/mod_auth.txt
+++ b/src/cmd/go/testdata/script/mod_auth.txt
@@ -1,4 +1,4 @@
-[!net] skip
+[short] skip
 
 env GO111MODULE=on
 env GOPROXY=direct
diff --git a/src/cmd/go/testdata/script/mod_bad_domain.txt b/src/cmd/go/testdata/script/mod_bad_domain.txt
index afd6e51..86aa96e 100644
--- a/src/cmd/go/testdata/script/mod_bad_domain.txt
+++ b/src/cmd/go/testdata/script/mod_bad_domain.txt
@@ -28,7 +28,7 @@
  # stderr '^useappengine[/\\]x.go:2:8: cannot find package$'
 
 ! go get  ./usenonexistent
-stderr '^x/usenonexistent imports\n\tnonexistent.rsc.io: cannot find module providing package nonexistent.rsc.io$'
+stderr '^go: x/usenonexistent imports\n\tnonexistent.rsc.io: cannot find module providing package nonexistent.rsc.io$'
 
 
 # go mod vendor and go mod tidy should ignore appengine imports.
diff --git a/src/cmd/go/testdata/script/mod_build_info_err.txt b/src/cmd/go/testdata/script/mod_build_info_err.txt
index 5c3c309..8d7bd0c 100644
--- a/src/cmd/go/testdata/script/mod_build_info_err.txt
+++ b/src/cmd/go/testdata/script/mod_build_info_err.txt
@@ -12,7 +12,7 @@
 # TODO(#41688): This should include a file and line, and report the reason for the error..
 # (Today it includes only an import stack.)
 ! go get ./main
-stderr '^m/main imports\n\tm/bad imports\n\t🐧.example.com/string: malformed import path "🐧.example.com/string": invalid char ''🐧''$'
+stderr '^go: m/main imports\n\tm/bad imports\n\t🐧.example.com/string: malformed import path "🐧.example.com/string": invalid char ''🐧''$'
 
 
 -- go.mod --
diff --git a/src/cmd/go/testdata/script/mod_convert.txt b/src/cmd/go/testdata/script/mod_convert.txt
index 1c9d626..922d924 100644
--- a/src/cmd/go/testdata/script/mod_convert.txt
+++ b/src/cmd/go/testdata/script/mod_convert.txt
@@ -1,5 +1,6 @@
-[short] skip
-[!net] skip
+[!net:github.com] skip
+[!net:golang.org] skip
+[!net:gopkg.in] skip
 [!git] skip
 
 env GO111MODULE=on
@@ -13,6 +14,9 @@
 go mod init github.com/docker/distribution
 cmpenv go.mod go.mod.want
 
+[!net:google.golang.org] skip
+[!net:cloud.google.com] skip
+
 go mod download github.com/fishy/gcsbucket@v0.0.0-20180217031846-618d60fe84e0
 cp $GOPATH/pkg/mod/github.com/fishy/gcsbucket@v0.0.0-20180217031846-618d60fe84e0/Gopkg.lock ../y
 cd ../y
diff --git a/src/cmd/go/testdata/script/mod_convert_tsv_insecure.txt b/src/cmd/go/testdata/script/mod_convert_tsv_insecure.txt
index 9910ce7..6ff6993 100644
--- a/src/cmd/go/testdata/script/mod_convert_tsv_insecure.txt
+++ b/src/cmd/go/testdata/script/mod_convert_tsv_insecure.txt
@@ -2,7 +2,7 @@
 env GOPROXY=direct
 env GOSUMDB=off
 
-[!net] skip
+[short] skip
 [!git] skip
 
 # secure fetch should report insecure warning
diff --git a/src/cmd/go/testdata/script/mod_deprecate_message.txt b/src/cmd/go/testdata/script/mod_deprecate_message.txt
index 8e2771d..1fb1246 100644
--- a/src/cmd/go/testdata/script/mod_deprecate_message.txt
+++ b/src/cmd/go/testdata/script/mod_deprecate_message.txt
@@ -17,7 +17,7 @@
 go list -m -u -f '{{.Deprecated}}' long
 stdout '^aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa$'
 
-# When a message contains unprintable chracters, 'go get' should say that
+# When a message contains unprintable characters, 'go get' should say that
 # without printing the message.
 go get unprintable
 stderr '^go: module unprintable is deprecated: \(message omitted: contains non-printable characters\)$'
diff --git a/src/cmd/go/testdata/script/mod_doc.txt b/src/cmd/go/testdata/script/mod_doc.txt
index 595ad67..bf0a19d 100644
--- a/src/cmd/go/testdata/script/mod_doc.txt
+++ b/src/cmd/go/testdata/script/mod_doc.txt
@@ -50,6 +50,7 @@
 
 cd $GOROOT/src
 env GOFLAGS=
+env GOWORK=off
 go doc cryptobyte
 stdout '// import "golang.org/x/crypto/cryptobyte"'
 
diff --git a/src/cmd/go/testdata/script/mod_download_git_bareRepository.txt b/src/cmd/go/testdata/script/mod_download_git_bareRepository.txt
new file mode 100644
index 0000000..8050461
--- /dev/null
+++ b/src/cmd/go/testdata/script/mod_download_git_bareRepository.txt
@@ -0,0 +1,19 @@
+[short] skip
+[!git] skip
+[!GOOS:linux] skip  # Uses XDG_CONFIG_HOME
+
+env GIT_CONFIG_GLOBAL=$WORK/.gitconfig
+env GOPRIVATE=vcs-test.golang.org
+
+go mod download -x
+
+-- go.mod --
+module test
+
+go 1.18
+
+require vcs-test.golang.org/git/gitrepo1.git v1.2.3
+
+-- $WORK/.gitconfig --
+[safe]
+bareRepository = explicit
diff --git a/src/cmd/go/testdata/script/mod_download_git_decorate_full.txt b/src/cmd/go/testdata/script/mod_download_git_decorate_full.txt
index 997b502..080ccf0 100644
--- a/src/cmd/go/testdata/script/mod_download_git_decorate_full.txt
+++ b/src/cmd/go/testdata/script/mod_download_git_decorate_full.txt
@@ -1,6 +1,6 @@
 env GO111MODULE=on
 
-[!net] skip
+[short] skip
 [!git] skip
 
 env GOPROXY=direct
@@ -25,4 +25,4 @@
 
 -- $WORK/home/gopher/.gitconfig --
 [log]
-	decorate = full
\ No newline at end of file
+	decorate = full
diff --git a/src/cmd/go/testdata/script/mod_download_hash.txt b/src/cmd/go/testdata/script/mod_download_hash.txt
index e62a165..5677e69 100644
--- a/src/cmd/go/testdata/script/mod_download_hash.txt
+++ b/src/cmd/go/testdata/script/mod_download_hash.txt
@@ -1,7 +1,7 @@
 env GO111MODULE=on
 
 # Testing mod download with non semantic versions; turn off proxy.
-[!net] skip
+[!net:rsc.io] skip
 [!git] skip
 env GOPROXY=direct
 env GOSUMDB=off
diff --git a/src/cmd/go/testdata/script/mod_download_insecure_redirect.txt b/src/cmd/go/testdata/script/mod_download_insecure_redirect.txt
index fed5b8d..20a6ac2 100644
--- a/src/cmd/go/testdata/script/mod_download_insecure_redirect.txt
+++ b/src/cmd/go/testdata/script/mod_download_insecure_redirect.txt
@@ -1,6 +1,6 @@
 # golang.org/issue/29591: 'go get' was following plain-HTTP redirects even without -insecure (now replaced by GOINSECURE).
 
-[!net] skip
+[short] skip
 [!git] skip
 
 env GO111MODULE=on
diff --git a/src/cmd/go/testdata/script/mod_download_issue51114.txt b/src/cmd/go/testdata/script/mod_download_issue51114.txt
index 68cce8c..4d274d6 100644
--- a/src/cmd/go/testdata/script/mod_download_issue51114.txt
+++ b/src/cmd/go/testdata/script/mod_download_issue51114.txt
@@ -1,6 +1,5 @@
-[short] skip
+[!net:github.com] skip
 [!git] skip
-[!net] skip
 [!GOOS:linux] skip  # Uses XDG_CONFIG_HOME
 
 env GIT_CONFIG_GLOBAL=$WORK/.gitconfig
diff --git a/src/cmd/go/testdata/script/mod_download_private_vcs.txt b/src/cmd/go/testdata/script/mod_download_private_vcs.txt
index 7459b80..2f72a42 100644
--- a/src/cmd/go/testdata/script/mod_download_private_vcs.txt
+++ b/src/cmd/go/testdata/script/mod_download_private_vcs.txt
@@ -1,7 +1,7 @@
 env GO111MODULE=on
 
 # Testing stderr for git ls-remote; turn off proxy.
-[!net] skip
+[!net:github.com] skip
 [!git] skip
 env GOPROXY=direct
 
diff --git a/src/cmd/go/testdata/script/mod_download_svn.txt b/src/cmd/go/testdata/script/mod_download_svn.txt
index 79e00dc..c11b4f9 100644
--- a/src/cmd/go/testdata/script/mod_download_svn.txt
+++ b/src/cmd/go/testdata/script/mod_download_svn.txt
@@ -1,4 +1,4 @@
-[!net] skip
+[short] skip
 [!exec:svn] skip
 
 # 'go mod download' will fall back to svn+ssh once svn fails over protocols like https.
diff --git a/src/cmd/go/testdata/script/mod_e.txt b/src/cmd/go/testdata/script/mod_e.txt
index 3cffaf6..6497e6c 100644
--- a/src/cmd/go/testdata/script/mod_e.txt
+++ b/src/cmd/go/testdata/script/mod_e.txt
@@ -7,13 +7,13 @@
 
 ! go mod tidy
 
-stderr '^example.com/untidy imports\n\texample.net/directnotfound: cannot find module providing package example.net/directnotfound: module example.net/directnotfound: reading http://.*: 404 Not Found$'
+stderr '^go: example.com/untidy imports\n\texample.net/directnotfound: cannot find module providing package example.net/directnotfound: module example.net/directnotfound: reading http://.*: 404 Not Found$'
 
-stderr '^example.com/untidy imports\n\texample.net/m imports\n\texample.net/indirectnotfound: cannot find module providing package example.net/indirectnotfound: module example.net/indirectnotfound: reading http://.*: 404 Not Found$'
+stderr '^go: example.com/untidy imports\n\texample.net/m imports\n\texample.net/indirectnotfound: cannot find module providing package example.net/indirectnotfound: module example.net/indirectnotfound: reading http://.*: 404 Not Found$'
 
-stderr '^example.com/untidy tested by\n\texample.com/untidy.test imports\n\texample.net/directtestnotfound: cannot find module providing package example.net/directtestnotfound: module example.net/directtestnotfound: reading http://.*: 404 Not Found$'
+stderr '^go: example.com/untidy tested by\n\texample.com/untidy.test imports\n\texample.net/directtestnotfound: cannot find module providing package example.net/directtestnotfound: module example.net/directtestnotfound: reading http://.*: 404 Not Found$'
 
-stderr '^example.com/untidy imports\n\texample.net/m tested by\n\texample.net/m.test imports\n\texample.net/indirecttestnotfound: cannot find module providing package example.net/indirecttestnotfound: module example.net/indirecttestnotfound: reading http://.*: 404 Not Found$'
+stderr '^go: example.com/untidy imports\n\texample.net/m tested by\n\texample.net/m.test imports\n\texample.net/indirecttestnotfound: cannot find module providing package example.net/indirecttestnotfound: module example.net/indirecttestnotfound: reading http://.*: 404 Not Found$'
 
 cmp go.mod.orig go.mod
 
@@ -24,11 +24,11 @@
 
 ! go mod vendor
 
-stderr '^example.com/untidy imports\n\texample.net/directnotfound: no required module provides package example.net/directnotfound; to add it:\n\tgo get example.net/directnotfound$'
+stderr '^go: example.com/untidy imports\n\texample.net/directnotfound: no required module provides package example.net/directnotfound; to add it:\n\tgo get example.net/directnotfound$'
 
-stderr '^example.com/untidy imports\n\texample.net/m: module example.net/m provides package example.net/m and is replaced but not required; to add it:\n\tgo get example.net/m@v0.1.0$'
+stderr '^go: example.com/untidy imports\n\texample.net/m: module example.net/m provides package example.net/m and is replaced but not required; to add it:\n\tgo get example.net/m@v0.1.0$'
 
-stderr '^example.com/untidy tested by\n\texample.com/untidy.test imports\n\texample.net/directtestnotfound: no required module provides package example.net/directtestnotfound; to add it:\n\tgo get example.net/directtestnotfound$'
+stderr '^go: example.com/untidy tested by\n\texample.com/untidy.test imports\n\texample.net/directtestnotfound: no required module provides package example.net/directtestnotfound; to add it:\n\tgo get example.net/directtestnotfound$'
 
 ! stderr 'indirecttestnotfound'  # Vendor prunes test dependencies.
 
@@ -50,7 +50,7 @@
 cp go.mod.orig go.mod
 go mod vendor -e
 stderr -count=2 'no required module provides package'
-stderr '^example.com/untidy imports\n\texample.net/m: module example.net/m provides package example.net/m and is replaced but not required; to add it:\n\tgo get example.net/m@v0.1.0$'
+stderr '^go: example.com/untidy imports\n\texample.net/m: module example.net/m provides package example.net/m and is replaced but not required; to add it:\n\tgo get example.net/m@v0.1.0$'
 exists vendor/modules.txt
 ! exists vendor/example.net
 
diff --git a/src/cmd/go/testdata/script/mod_edit_go.txt b/src/cmd/go/testdata/script/mod_edit_go.txt
index 7e9740f..ec04f40 100644
--- a/src/cmd/go/testdata/script/mod_edit_go.txt
+++ b/src/cmd/go/testdata/script/mod_edit_go.txt
@@ -1,4 +1,4 @@
-# Test support for go mod -edit to set language version.
+# Test support for go mod edit -go to set language version.
 
 env GO111MODULE=on
 ! go build
@@ -13,6 +13,9 @@
 ! go build
 stderr 'type aliases requires'
 
+# go=none should drop the line
+go mod edit -go=none
+! grep go go.mod
 
 -- go.mod --
 module m
diff --git a/src/cmd/go/testdata/script/mod_edit_toolchain.txt b/src/cmd/go/testdata/script/mod_edit_toolchain.txt
new file mode 100644
index 0000000..bb544be
--- /dev/null
+++ b/src/cmd/go/testdata/script/mod_edit_toolchain.txt
@@ -0,0 +1,18 @@
+# Test support for go mod edit -toolchain to set toolchain to use
+
+env GOTOOLCHAIN=local
+env GO111MODULE=on
+
+! grep toolchain go.mod
+go mod edit -toolchain=go1.9
+grep 'toolchain go1.9' go.mod
+
+go mod edit -toolchain=default
+grep 'toolchain default' go.mod
+
+go mod edit -toolchain=none
+! grep toolchain go.mod
+
+-- go.mod --
+module m
+go 1.8
diff --git a/src/cmd/go/testdata/script/mod_exclude_go121.txt b/src/cmd/go/testdata/script/mod_exclude_go121.txt
new file mode 100644
index 0000000..51c8a00
--- /dev/null
+++ b/src/cmd/go/testdata/script/mod_exclude_go121.txt
@@ -0,0 +1,34 @@
+# go.dev/issue/60028: use semver sort in exclude block in 1.21
+cp $WORK/go.mod.badfmtexclude go.mod
+go mod edit -go=1.20
+cmp go.mod $WORK/go.mod.goodfmtexclude120
+go mod edit -go=1.21
+cmp go.mod $WORK/go.mod.goodfmtexclude121
+
+-- $WORK/go.mod.badfmtexclude --
+module     x.x/y/z
+exclude  (
+	x.1   v1.11.0
+	x.1    v1.10.0
+	x.1     v1.9.0
+)
+-- $WORK/go.mod.goodfmtexclude120 --
+module x.x/y/z
+
+go 1.20
+
+exclude (
+	x.1 v1.10.0
+	x.1 v1.11.0
+	x.1 v1.9.0
+)
+-- $WORK/go.mod.goodfmtexclude121 --
+module x.x/y/z
+
+go 1.21
+
+exclude (
+	x.1 v1.9.0
+	x.1 v1.10.0
+	x.1 v1.11.0
+)
diff --git a/src/cmd/go/testdata/script/mod_get_ambiguous_import.txt b/src/cmd/go/testdata/script/mod_get_ambiguous_import.txt
index 0af78bd..f08e540 100644
--- a/src/cmd/go/testdata/script/mod_get_ambiguous_import.txt
+++ b/src/cmd/go/testdata/script/mod_get_ambiguous_import.txt
@@ -9,7 +9,7 @@
 # TODO(#27899): Should we automatically upgrade example.net/m to v0.2.0
 # to resolve the conflict?
 ! go get example.net/m/p@v1.0.0
-stderr '^example.net/m/p: ambiguous import: found package example.net/m/p in multiple modules:\n\texample.net/m v0.1.0 \(.*[/\\]m1[/\\]p\)\n\texample.net/m/p v1.0.0 \(.*[/\\]p0\)\n\z'
+stderr '^go: example.net/m/p: ambiguous import: found package example.net/m/p in multiple modules:\n\texample.net/m v0.1.0 \(.*[/\\]m1[/\\]p\)\n\texample.net/m/p v1.0.0 \(.*[/\\]p0\)\n\z'
 cmp go.mod go.mod.orig
 
 # Upgrading both modules simultaneously resolves the ambiguous upgrade.
diff --git a/src/cmd/go/testdata/script/mod_get_boost.txt b/src/cmd/go/testdata/script/mod_get_boost.txt
new file mode 100644
index 0000000..105dc2e
--- /dev/null
+++ b/src/cmd/go/testdata/script/mod_get_boost.txt
@@ -0,0 +1,96 @@
+# If 'go get -u' finds an upgrade candidate that isn't viable,
+# but some other upgraded module's requirement moves past it
+# (for example, to a higher prerelease), then we should accept
+# the transitive upgrade instead of trying lower roots.
+
+go get -v -u . example.net/b@v0.1.0
+cmp go.mod go.mod.want
+
+-- go.mod --
+module example
+
+go 1.17
+
+require (
+	example.net/a v0.1.0
+	example.net/b v0.1.0
+	example.net/c v0.1.0
+)
+
+replace (
+	example.net/a v0.1.0 => ./a1
+	example.net/a v0.2.0-pre => ./a2p
+	example.net/b v0.1.0 => ./b
+	example.net/b v0.2.0 => ./b
+	example.net/c v0.1.0 => ./c1
+	example.net/c v0.2.0 => ./c2
+)
+-- go.mod.want --
+module example
+
+go 1.17
+
+require (
+	example.net/a v0.2.0-pre
+	example.net/b v0.1.0
+	example.net/c v0.2.0
+)
+
+replace (
+	example.net/a v0.1.0 => ./a1
+	example.net/a v0.2.0-pre => ./a2p
+	example.net/b v0.1.0 => ./b
+	example.net/b v0.2.0 => ./b
+	example.net/c v0.1.0 => ./c1
+	example.net/c v0.2.0 => ./c2
+)
+-- example.go --
+package example
+
+import (
+	_ "example.net/a"
+	_ "example.net/b"
+	_ "example.net/c"
+)
+-- a1/go.mod --
+module example.net/a
+
+go 1.17
+
+require example.net/b v0.2.0
+-- a1/a.go --
+package a
+
+import _ "example.net/b"
+-- a2p/go.mod --
+module example.net/a
+
+go 1.17
+-- a2p/a.go --
+package a
+-- b/go.mod --
+module example.net/b
+
+go 1.17
+-- b/b.go --
+package b
+-- c1/go.mod --
+module example.net/c
+
+go 1.17
+
+require example.net/a v0.1.0
+-- c1/c.go --
+package c
+
+import _ "example.net/a"
+-- c2/go.mod --
+module example.net/c
+
+go 1.17
+
+require example.net/a v0.2.0-pre
+-- c2/c.go --
+package c
+
+import _ "example.net/c"
diff --git a/src/cmd/go/testdata/script/mod_get_direct.txt b/src/cmd/go/testdata/script/mod_get_direct.txt
index b7b0529..02b10ab 100644
--- a/src/cmd/go/testdata/script/mod_get_direct.txt
+++ b/src/cmd/go/testdata/script/mod_get_direct.txt
@@ -2,8 +2,7 @@
 # 'GOPROXY=direct go get golang.org/x/tools/gopls@master' did not correctly
 # resolve the pseudo-version for its dependency on golang.org/x/tools.
 
-[short] skip
-[!net] skip
+[!net:cloud.google.com] skip
 [!git] skip
 
 env GO111MODULE=on
diff --git a/src/cmd/go/testdata/script/mod_get_downgrade_missing.txt b/src/cmd/go/testdata/script/mod_get_downgrade_missing.txt
index 582593b..4486a67 100644
--- a/src/cmd/go/testdata/script/mod_get_downgrade_missing.txt
+++ b/src/cmd/go/testdata/script/mod_get_downgrade_missing.txt
@@ -23,7 +23,7 @@
 # package, then 'go get' should fail with a useful error message.
 
 ! go get example.net/pkgadded@v1.0.0 .
-stderr '^example.com/m imports\n\texample.net/pkgadded/subpkg: cannot find module providing package example.net/pkgadded/subpkg$'
+stderr '^go: example.com/m imports\n\texample.net/pkgadded/subpkg: cannot find module providing package example.net/pkgadded/subpkg$'
 ! stderr 'example.net/pkgadded v1\.2\.0'
 cmp go.mod.orig go.mod
 
diff --git a/src/cmd/go/testdata/script/mod_get_downup_indirect.txt b/src/cmd/go/testdata/script/mod_get_downup_indirect.txt
index 3a46a77..432e626 100644
--- a/src/cmd/go/testdata/script/mod_get_downup_indirect.txt
+++ b/src/cmd/go/testdata/script/mod_get_downup_indirect.txt
@@ -19,17 +19,31 @@
 #
 # If we downgrade module d to version 1, we must downgrade b as well.
 # If that downgrade selects b version 1, we will upgrade module c to version 2.
-# So 'go get d@1' should instead downgrade both b and c to "none".
 
 cp go.mod go.mod.orig
 go mod tidy
 cmp go.mod.orig go.mod
 
+# Downgrading d to version 1 downgrades b, which upgrades c.
 go get example.com/d@v0.1.0
 go list -m all
-! stdout '^example.com/b '
-! stdout '^example.com/c '
+stdout '^example.com/b v0.1.0 '
+stdout '^example.com/c v0.2.0 '
 stdout '^example.com/d v0.1.0 '
+cmp go.mod go.mod.down1
+
+# Restoring c to version 1 upgrades d to meet c's requirements.
+go get example.com/c@v0.1.0
+go list -m all
+! stdout '^example.com/b '
+stdout '^example.com/c v0.1.0 '
+stdout '^example.com/d v0.2.0 '
+cmp go.mod go.mod.down2
+
+# If a user explicitly requests the incompatible versions together,
+# 'go get' should explain why they are not compatible.
+! go get example.com/c@v0.1.0 example.com/d@v0.1.0
+stderr '^go: example\.com/c@v0\.1\.0 requires example\.com/d@v0\.2\.0, not example\.com/d@v0\.1\.0'
 
 -- go.mod --
 module example.com/a
@@ -49,6 +63,40 @@
 	example.com/d v0.1.0 => ./d
 	example.com/d v0.2.0 => ./d
 )
+-- go.mod.down1 --
+module example.com/a
+
+go 1.15
+
+require (
+	example.com/b v0.1.0
+	example.com/c v0.2.0
+	example.com/d v0.1.0 // indirect
+)
+
+replace (
+	example.com/b v0.1.0 => ./b1
+	example.com/b v0.2.0 => ./b2
+	example.com/c v0.1.0 => ./c1
+	example.com/c v0.2.0 => ./c2
+	example.com/d v0.1.0 => ./d
+	example.com/d v0.2.0 => ./d
+)
+-- go.mod.down2 --
+module example.com/a
+
+go 1.15
+
+require example.com/c v0.1.0
+
+replace (
+	example.com/b v0.1.0 => ./b1
+	example.com/b v0.2.0 => ./b2
+	example.com/c v0.1.0 => ./c1
+	example.com/c v0.2.0 => ./c2
+	example.com/d v0.1.0 => ./d
+	example.com/d v0.2.0 => ./d
+)
 -- a.go --
 package a
 
diff --git a/src/cmd/go/testdata/script/mod_get_downup_indirect_pruned.txt b/src/cmd/go/testdata/script/mod_get_downup_indirect_pruned.txt
new file mode 100644
index 0000000..cac6b96
--- /dev/null
+++ b/src/cmd/go/testdata/script/mod_get_downup_indirect_pruned.txt
@@ -0,0 +1,154 @@
+# This test illustrates a case where downgrading one module may upgrade another.
+# This is the same as mod_get_downup_indirect, but using modules
+# with graph pruning enabled (go ≥ 1.17).
+# Compare to the downcross1 test case in cmd/go/internal/mvs/mvs_test.go.
+
+# The package import graph used in this test looks like:
+#
+# a ---- b
+#   \     \
+#    \     \
+#     ----- c ---- d
+#
+# The module dependency graph originally looks like:
+#
+# a ---- b.2
+#   \      \
+#    \      \
+#     ----- c.1 ---- d.2
+#
+# b.1 ---- c.2
+#
+# If we downgrade module d to version 1, we must downgrade b as well.
+# If that downgrade selects b version 1, we will upgrade module c to version 2.
+
+cp go.mod go.mod.orig
+go mod tidy
+cmp go.mod.orig go.mod
+
+# Downgrading d to version 1 downgrades b, which upgrades c.
+go get -v example.com/d@v0.1.0
+go list -m all
+stdout '^example.com/b v0.1.0 '
+stdout '^example.com/c v0.2.0 '
+stdout '^example.com/d v0.1.0 '
+cmp go.mod go.mod.down1
+
+# Restoring c to version 1 upgrades d to meet c's requirements.
+go get example.com/c@v0.1.0
+go list -m all
+! stdout '^example.com/b '
+stdout '^example.com/c v0.1.0 '
+stdout '^example.com/d v0.2.0 '
+cmp go.mod go.mod.down2
+
+# If a user explicitly requests the incompatible versions together,
+# 'go get' should explain why they are not compatible.
+! go get example.com/c@v0.1.0 example.com/d@v0.1.0
+stderr '^go: example\.com/c@v0\.1\.0 requires example\.com/d@v0\.2\.0, not example\.com/d@v0\.1\.0'
+
+-- go.mod --
+module example.com/a
+
+go 1.17
+
+require (
+	example.com/b v0.2.0
+	example.com/c v0.1.0
+)
+
+replace (
+	example.com/b v0.1.0 => ./b1
+	example.com/b v0.2.0 => ./b2
+	example.com/c v0.1.0 => ./c1
+	example.com/c v0.2.0 => ./c2
+	example.com/d v0.1.0 => ./d
+	example.com/d v0.2.0 => ./d
+)
+-- go.mod.down1 --
+module example.com/a
+
+go 1.17
+
+require (
+	example.com/b v0.1.0
+	example.com/c v0.2.0
+)
+
+require example.com/d v0.1.0 // indirect
+
+replace (
+	example.com/b v0.1.0 => ./b1
+	example.com/b v0.2.0 => ./b2
+	example.com/c v0.1.0 => ./c1
+	example.com/c v0.2.0 => ./c2
+	example.com/d v0.1.0 => ./d
+	example.com/d v0.2.0 => ./d
+)
+-- go.mod.down2 --
+module example.com/a
+
+go 1.17
+
+require example.com/c v0.1.0
+
+require example.com/d v0.2.0 // indirect
+
+replace (
+	example.com/b v0.1.0 => ./b1
+	example.com/b v0.2.0 => ./b2
+	example.com/c v0.1.0 => ./c1
+	example.com/c v0.2.0 => ./c2
+	example.com/d v0.1.0 => ./d
+	example.com/d v0.2.0 => ./d
+)
+-- a.go --
+package a
+
+import (
+	_ "example.com/b"
+	_ "example.com/c"
+)
+
+-- b1/go.mod --
+module example.com/b
+
+go 1.17
+
+require example.com/c v0.2.0
+-- b1/b.go --
+package b
+
+import _ "example.com/c"
+
+-- b2/go.mod --
+module example.com/b
+
+go 1.17
+
+require example.com/c v0.1.0
+-- b2/b.go --
+package b
+
+import _ "example.com/c"
+
+-- c1/go.mod --
+module example.com/c
+
+go 1.17
+
+require example.com/d v0.2.0
+-- c1/c.go --
+package c
+
+-- c2/go.mod --
+module example.com/c
+
+go 1.17
+-- c2/c.go --
+package c
+
+-- d/go.mod --
+module example.com/d
+
+go 1.17
diff --git a/src/cmd/go/testdata/script/mod_get_errors.txt b/src/cmd/go/testdata/script/mod_get_errors.txt
index 7cb03ce..981d6f0 100644
--- a/src/cmd/go/testdata/script/mod_get_errors.txt
+++ b/src/cmd/go/testdata/script/mod_get_errors.txt
@@ -6,7 +6,7 @@
 # cannot be resolved.
 
 ! go get
-stderr '^example.com/m imports\n\texample.com/badimport imports\n\texample.net/oops: cannot find module providing package example.net/oops$'
+stderr '^go: example.com/m imports\n\texample.com/badimport imports\n\texample.net/oops: cannot find module providing package example.net/oops$'
 cmp go.mod.orig go.mod
 
 cd importsyntax
diff --git a/src/cmd/go/testdata/script/mod_get_exec_toolchain.txt b/src/cmd/go/testdata/script/mod_get_exec_toolchain.txt
new file mode 100644
index 0000000..497fe36
--- /dev/null
+++ b/src/cmd/go/testdata/script/mod_get_exec_toolchain.txt
@@ -0,0 +1,145 @@
+env TESTGO_VERSION=go1.21
+env TESTGO_VERSION_SWITCH=switch
+
+# GOTOOLCHAIN=auto should run the newer toolchain
+env GOTOOLCHAIN=auto
+cp go.mod.new go.mod
+go get rsc.io/needgo121 rsc.io/needgo122 rsc.io/needgo123 rsc.io/needall
+stderr '^go: rsc.io/needall@v0.0.1 requires go >= 1.23; switching to go1.23.9$'
+! stderr '\(running'
+stderr '^go: added rsc.io/needall v0.0.1'
+grep 'go 1.23' go.mod
+grep 'toolchain go1.23.9' go.mod
+
+# GOTOOLCHAIN=min+auto should run the newer toolchain
+env GOTOOLCHAIN=go1.21+auto
+cp go.mod.new go.mod
+go get rsc.io/needgo121 rsc.io/needgo122 rsc.io/needgo123 rsc.io/needall
+stderr '^go: rsc.io/needall@v0.0.1 requires go >= 1.23; switching to go1.23.9$'
+! stderr '\(running'
+stderr '^go: added rsc.io/needall v0.0.1'
+grep 'go 1.23' go.mod
+grep 'toolchain go1.23.9' go.mod
+
+# GOTOOLCHAIN=go1.21 should NOT run the newer toolchain
+env GOTOOLCHAIN=go1.21
+cp go.mod.new go.mod
+! go get rsc.io/needgo121 rsc.io/needgo122 rsc.io/needgo123 rsc.io/needall
+! stderr switching
+stderr 'rsc.io/needgo122@v0.0.1 requires go >= 1.22'
+stderr 'rsc.io/needgo123@v0.0.1 requires go >= 1.23'
+stderr 'rsc.io/needall@v0.0.1 requires go >= 1.23'
+stderr 'requires go >= 1.23'
+! stderr 'requires go >= 1.21' # that's us!
+cmp go.mod go.mod.new
+
+# GOTOOLCHAIN=local should NOT run the newer toolchain
+env GOTOOLCHAIN=local
+cp go.mod.new go.mod
+! go get rsc.io/needgo121 rsc.io/needgo122 rsc.io/needgo123 rsc.io/needall
+! stderr switching
+stderr 'rsc.io/needgo122@v0.0.1 requires go >= 1.22'
+stderr 'rsc.io/needgo123@v0.0.1 requires go >= 1.23'
+stderr 'rsc.io/needall@v0.0.1 requires go >= 1.23'
+stderr 'requires go >= 1.23'
+! stderr 'requires go >= 1.21' # that's us!
+cmp go.mod go.mod.new
+
+# go get go@1.22 should resolve to the latest 1.22
+env GOTOOLCHAIN=local
+cp go.mod.new go.mod
+! go get go@1.22
+stderr '^go: updating go.mod requires go >= 1.22.9 \(running go 1.21; GOTOOLCHAIN=local\)'
+
+env GOTOOLCHAIN=auto
+cp go.mod.new go.mod
+go get go@1.22
+stderr '^go: updating go.mod requires go >= 1.22.9; switching to go1.22.9$'
+
+# go get go@1.22rc1 should use 1.22rc1 exactly, not a later release.
+env GOTOOLCHAIN=local
+cp go.mod.new go.mod
+! go get go@1.22rc1
+stderr '^go: updating go.mod requires go >= 1.22rc1 \(running go 1.21; GOTOOLCHAIN=local\)'
+
+env GOTOOLCHAIN=auto
+cp go.mod.new go.mod
+go get go@1.22rc1
+stderr '^go: updating go.mod requires go >= 1.22rc1; switching to go1.22.9$'
+stderr '^go: upgraded go 1.1 => 1.22rc1$'
+stderr '^go: added toolchain go1.22.9$'
+
+# go get go@1.22.1 should use 1.22.1 exactly, not a later release.
+env GOTOOLCHAIN=local
+cp go.mod.new go.mod
+! go get go@1.22.1
+stderr '^go: updating go.mod requires go >= 1.22.1 \(running go 1.21; GOTOOLCHAIN=local\)'
+
+env GOTOOLCHAIN=auto
+cp go.mod.new go.mod
+go get go@1.22.1
+stderr '^go: updating go.mod requires go >= 1.22.1; switching to go1.22.9$'
+stderr '^go: upgraded go 1.1 => 1.22.1$'
+stderr '^go: added toolchain go1.22.9$'
+
+# go get needgo122 (says 'go 1.22') should use 1.22.0, the earliest release we have available
+# (ignoring prereleases).
+env GOTOOLCHAIN=local
+cp go.mod.new go.mod
+! go get rsc.io/needgo122
+stderr '^go: rsc.io/needgo122@v0.0.1 requires go >= 1.22 \(running go 1.21; GOTOOLCHAIN=local\)'
+
+env GOTOOLCHAIN=auto
+cp go.mod.new go.mod
+go get rsc.io/needgo122
+stderr '^go: upgraded go 1.1 => 1.22$'
+stderr '^go: rsc.io/needgo122@v0.0.1 requires go >= 1.22; switching to go1.22.9$'
+stderr '^go: added toolchain go1.22.9$'
+
+# go get needgo1223 (says 'go 1.22.3') should use go 1.22.3
+env GOTOOLCHAIN=local
+cp go.mod.new go.mod
+! go get rsc.io/needgo1223
+stderr '^go: rsc.io/needgo1223@v0.0.1 requires go >= 1.22.3 \(running go 1.21; GOTOOLCHAIN=local\)'
+
+env GOTOOLCHAIN=auto
+cp go.mod.new go.mod
+go get rsc.io/needgo1223
+stderr '^go: upgraded go 1.1 => 1.22.3$'
+stderr '^go: rsc.io/needgo1223@v0.0.1 requires go >= 1.22.3; switching to go1.22.9$'
+stderr '^go: added toolchain go1.22.9$'
+
+# go get needgo124 (says 'go 1.24') should use go 1.24rc1, the only version available
+env GOTOOLCHAIN=local
+cp go.mod.new go.mod
+! go get rsc.io/needgo124
+stderr '^go: rsc.io/needgo124@v0.0.1 requires go >= 1.24 \(running go 1.21; GOTOOLCHAIN=local\)'
+
+env GOTOOLCHAIN=auto
+cp go.mod.new go.mod
+go get rsc.io/needgo124
+stderr '^go: rsc.io/needgo124@v0.0.1 requires go >= 1.24; switching to go1.24rc1$'
+stderr '^go: upgraded go 1.1 => 1.24$'
+stderr '^go: added toolchain go1.24rc1$'
+
+# The -C flag should not happen more than once due to switching.
+mkdir dir dir/dir
+cp go.mod.new go.mod
+cp go.mod.new dir/go.mod
+cp go.mod.new dir/dir/go.mod
+cp p.go dir/p.go
+cp p.go dir/dir/p.go
+go get -C dir rsc.io/needgo124
+stderr '^go: rsc.io/needgo124@v0.0.1 requires go >= 1.24; switching to go1.24rc1$'
+stderr '^go: upgraded go 1.1 => 1.24$'
+stderr '^go: added toolchain go1.24rc1$'
+cmp go.mod.new go.mod
+cmp go.mod.new dir/dir/go.mod
+grep 'go 1.24$' dir/go.mod
+
+-- go.mod.new --
+module m
+go 1.1
+
+-- p.go --
+package p
diff --git a/src/cmd/go/testdata/script/mod_get_fallback.txt b/src/cmd/go/testdata/script/mod_get_fallback.txt
index 3572233..a5119b6 100644
--- a/src/cmd/go/testdata/script/mod_get_fallback.txt
+++ b/src/cmd/go/testdata/script/mod_get_fallback.txt
@@ -1,6 +1,7 @@
 env GO111MODULE=on
 
-[!net] skip
+[!net:golang.org] skip
+[!net:proxy.golang.org] skip
 
 env GOPROXY=https://proxy.golang.org,direct
 env GOSUMDB=off
diff --git a/src/cmd/go/testdata/script/mod_get_fossil.txt b/src/cmd/go/testdata/script/mod_get_fossil.txt
index c2d42f0..830e0de 100644
--- a/src/cmd/go/testdata/script/mod_get_fossil.txt
+++ b/src/cmd/go/testdata/script/mod_get_fossil.txt
@@ -1,4 +1,4 @@
-[!net] skip
+[short] skip
 [!exec:fossil] skip
 
 # Regression test for 'go get' to ensure repositories
diff --git a/src/cmd/go/testdata/script/mod_get_future.txt b/src/cmd/go/testdata/script/mod_get_future.txt
new file mode 100644
index 0000000..72c0b97
--- /dev/null
+++ b/src/cmd/go/testdata/script/mod_get_future.txt
@@ -0,0 +1,12 @@
+env TESTGO_VERSION=go1.21
+! go mod download rsc.io/future@v1.0.0
+stderr '^go: rsc.io/future@v1.0.0 requires go >= 1.999 \(running go 1.21\)$'
+
+-- go.mod --
+module m
+go 1.21
+
+-- x.go --
+package p
+
+import "rsc.io/future/foo"
diff --git a/src/cmd/go/testdata/script/mod_get_hash.txt b/src/cmd/go/testdata/script/mod_get_hash.txt
index 63e9e46..ec5549d 100644
--- a/src/cmd/go/testdata/script/mod_get_hash.txt
+++ b/src/cmd/go/testdata/script/mod_get_hash.txt
@@ -1,7 +1,7 @@
 env GO111MODULE=on
 env GOPROXY=direct
 env GOSUMDB=off
-[!net] skip
+[!net:golang.org] skip
 [!git] skip
 
 # fetch commit hash reachable from refs/heads/* and refs/tags/* is OK
diff --git a/src/cmd/go/testdata/script/mod_get_insecure_redirect.txt b/src/cmd/go/testdata/script/mod_get_insecure_redirect.txt
new file mode 100644
index 0000000..a503c91
--- /dev/null
+++ b/src/cmd/go/testdata/script/mod_get_insecure_redirect.txt
@@ -0,0 +1,19 @@
+# golang.org/issue/29591: 'go get' was following plain-HTTP redirects even without -insecure (now replaced by GOINSECURE).
+# golang.org/issue/61877: 'go get' would panic in case of an insecure redirect in module mode
+
+[!git] skip
+
+env GOPRIVATE=vcs-test.golang.org
+
+! go get -d vcs-test.golang.org/insecure/go/insecure
+stderr 'redirected .* to insecure URL'
+
+[short] stop 'builds a git repo'
+
+env GOINSECURE=vcs-test.golang.org/insecure/go/insecure
+go get -d vcs-test.golang.org/insecure/go/insecure
+
+-- go.mod --
+module example
+go 1.21
+
diff --git a/src/cmd/go/testdata/script/mod_get_issue56494.txt b/src/cmd/go/testdata/script/mod_get_issue56494.txt
new file mode 100644
index 0000000..3e4d4af
--- /dev/null
+++ b/src/cmd/go/testdata/script/mod_get_issue56494.txt
@@ -0,0 +1,134 @@
+# Regression test for https://go.dev/issue/56494:
+# 'go get' in module mode was failing to prune out dependencies
+# through modules whose versions are too low to be selected.
+
+# Initially, modules "a", "b", and "c" are unrelated.
+#
+# The package import graph at v1 of everything looks like:
+#
+# m --- a
+# |
+# + --- b
+# |
+# + --- c
+#
+# At v2, package "a" adds imports of "b" and "c"
+# (and a requirement on "c" v2):
+#
+# a --- b
+# |
+# + --- c
+#
+# And "b" adds an import of "a/sub" (in module "a"):
+#
+# b --- a/sub
+#
+# At v3, "a" no longer imports (nor requires) "c":
+#
+# a --- b
+
+# So upgrading to a3 adds a dependency on b2,
+# b2 adds a dependency on a2 (for "a/sub"),
+# and a2 (but not a3) would add a dependency on c2.
+# Since a2 is lower than a3 it cannot possibly be selected when
+# upgrading to a3: normally a2 is pruned out of a3's module graph,
+# so 'go get' should prune it out too, and c should remain at c1
+# without error.
+
+go get a@v0.3.0
+
+go list -m c
+stdout '^c v0.1.0 '
+
+-- go.mod --
+module m
+
+go 1.19
+
+require (
+	a v0.1.0
+	b v0.1.0
+	c v0.1.0
+)
+
+replace (
+	a v0.1.0 => ./a1
+	a v0.2.0 => ./a2
+	a v0.3.0 => ./a3
+	b v0.1.0 => ./b1
+	b v0.2.0 => ./b2
+	c v0.1.0 => ./c1
+	c v0.2.0 => ./c2
+)
+-- m.go --
+package m
+
+import (
+	_ "a"
+	_ "b"
+	_ "c"
+)
+-- a1/go.mod --
+module a
+
+go 1.19
+-- a1/a.go --
+package a
+-- a2/go.mod --
+module a
+
+go 1.19
+
+require (
+	b v0.1.0
+	c v0.2.0
+)
+-- a2/a.go --
+package a
+
+import (
+	_ "b"
+	_ "c"
+)
+-- a2/sub/sub.go --
+package sub
+-- a3/go.mod --
+module a
+
+go 1.19
+
+require b v0.2.0
+-- a3/a.go --
+package a
+
+import _ "b"
+-- a3/sub/sub.go --
+package sub
+-- b1/go.mod --
+module b
+
+go 1.19
+-- b1/b.go --
+package b
+-- b2/go.mod --
+module b
+
+go 1.19
+
+require a v0.2.0
+-- b2/b.go --
+package b
+
+import "a/sub"
+-- c1/go.mod --
+module c
+
+go 1.19
+-- c1/c.go --
+package c
+-- c2/go.mod --
+module c
+
+go 1.19
+-- c2/c.go --
+package c
diff --git a/src/cmd/go/testdata/script/mod_get_issue60490.txt b/src/cmd/go/testdata/script/mod_get_issue60490.txt
new file mode 100644
index 0000000..e0ac26a
--- /dev/null
+++ b/src/cmd/go/testdata/script/mod_get_issue60490.txt
@@ -0,0 +1,48 @@
+# Regression test for https://go.dev/issue/60490: 'go get' should not cause an
+# infinite loop for cycles introduced in the pruned module graph.
+
+go get example.net/c@v0.1.0
+
+-- go.mod --
+module example
+
+go 1.19
+
+require (
+	example.net/a v0.1.0
+	example.net/b v0.1.0
+)
+
+replace (
+	example.net/a v0.1.0 => ./a1
+	example.net/a v0.2.0 => ./a2
+	example.net/b v0.1.0 => ./b1
+	example.net/b v0.2.0 => ./b2
+	example.net/c v0.1.0 => ./c1
+)
+-- a1/go.mod --
+module example.net/a
+
+go 1.19
+-- a2/go.mod --
+module example.net/a
+
+go 1.19
+
+require example.net/b v0.2.0
+-- b1/go.mod --
+module example.net/b
+
+go 1.19
+-- b2/go.mod --
+module example.net/b
+
+go 1.19
+
+require example.net/a v0.2.0
+-- c1/go.mod --
+module example.net/c
+
+go 1.19
+
+require example.net/a v0.2.0
diff --git a/src/cmd/go/testdata/script/mod_get_major.txt b/src/cmd/go/testdata/script/mod_get_major.txt
index 76c9de5..4e0febb 100644
--- a/src/cmd/go/testdata/script/mod_get_major.txt
+++ b/src/cmd/go/testdata/script/mod_get_major.txt
@@ -1,4 +1,4 @@
-[!net] skip
+[short] skip
 [!git] skip
 
 env GO111MODULE=on
diff --git a/src/cmd/go/testdata/script/mod_get_moved.txt b/src/cmd/go/testdata/script/mod_get_moved.txt
index ba79c82..cc35b4c 100644
--- a/src/cmd/go/testdata/script/mod_get_moved.txt
+++ b/src/cmd/go/testdata/script/mod_get_moved.txt
@@ -8,7 +8,7 @@
 go list -m all
 stdout 'example.com/split v1.0.0'
 
-# A 'go get' that simultaneously upgrades away conflicting package defitions is not ambiguous.
+# A 'go get' that simultaneously upgrades away conflicting package definitions is not ambiguous.
 go get example.com/split/subpkg@v1.1.0
 
 # A 'go get' without an upgrade should find the package.
diff --git a/src/cmd/go/testdata/script/mod_get_newcycle.txt b/src/cmd/go/testdata/script/mod_get_newcycle.txt
index 18dc650..4f5229e 100644
--- a/src/cmd/go/testdata/script/mod_get_newcycle.txt
+++ b/src/cmd/go/testdata/script/mod_get_newcycle.txt
@@ -11,4 +11,4 @@
 cmp stderr stderr-expected
 
 -- stderr-expected --
-go: example.com/newcycle/a@v1.0.0 requires example.com/newcycle/a@v1.0.1, not example.com/newcycle/a@v1.0.0
+go: example.com/newcycle/a@v1.0.0 indirectly requires example.com/newcycle/a@v1.0.1, not example.com/newcycle/a@v1.0.0
diff --git a/src/cmd/go/testdata/script/mod_get_patchcycle.txt b/src/cmd/go/testdata/script/mod_get_patchcycle.txt
index 6600109..9f180d6 100644
--- a/src/cmd/go/testdata/script/mod_get_patchcycle.txt
+++ b/src/cmd/go/testdata/script/mod_get_patchcycle.txt
@@ -6,7 +6,7 @@
 # (It used to print v0.1.1 but then silently upgrade to v0.2.0.)
 
 ! go get example.net/a@patch
-stderr '^go: example.net/a@patch \(v0.1.1\) requires example.net/a@v0.2.0, not example.net/a@patch \(v0.1.1\)$'  # TODO: A mention of b v0.1.0 would be nice.
+stderr '^go: example.net/a@patch \(v0.1.1\) indirectly requires example.net/a@v0.2.0, not example.net/a@patch \(v0.1.1\)$'  # TODO: A mention of b v0.1.0 would be nice.
 
 -- go.mod --
 module example
diff --git a/src/cmd/go/testdata/script/mod_get_pkgtags.txt b/src/cmd/go/testdata/script/mod_get_pkgtags.txt
index 7ad3c3c..8cb41ad 100644
--- a/src/cmd/go/testdata/script/mod_get_pkgtags.txt
+++ b/src/cmd/go/testdata/script/mod_get_pkgtags.txt
@@ -52,7 +52,7 @@
 
 # With the -t flag, the test dependencies must resolve successfully.
 ! go get -t example.net/testonly@v0.1.0
-stderr '^example.net/testonly tested by\n\texample.net/testonly\.test imports\n\texample.net/missing: cannot find module providing package example.net/missing$'
+stderr '^go: example.net/testonly tested by\n\texample.net/testonly\.test imports\n\texample.net/missing: cannot find module providing package example.net/missing$'
 
 
 # 'go get' should succeed for a module path that does not contain a package,
diff --git a/src/cmd/go/testdata/script/mod_get_pseudo.txt b/src/cmd/go/testdata/script/mod_get_pseudo.txt
index 7b43c69..47ad54e 100644
--- a/src/cmd/go/testdata/script/mod_get_pseudo.txt
+++ b/src/cmd/go/testdata/script/mod_get_pseudo.txt
@@ -1,7 +1,7 @@
 env GO111MODULE=on
 
 # Testing git->module converter's generation of +incompatible tags; turn off proxy.
-[!net] skip
+[!net:github.com] skip
 [!git] skip
 env GOPROXY=direct
 env GOSUMDB=off
diff --git a/src/cmd/go/testdata/script/mod_get_pseudo_other_branch.txt b/src/cmd/go/testdata/script/mod_get_pseudo_other_branch.txt
index 21f900f..6019b45 100644
--- a/src/cmd/go/testdata/script/mod_get_pseudo_other_branch.txt
+++ b/src/cmd/go/testdata/script/mod_get_pseudo_other_branch.txt
@@ -6,7 +6,7 @@
 # tag that appears in any commit that is a (transitive) parent of the commit
 # supplied to 'go get', regardless of branches
 
-[!net] skip
+[short] skip
 [!git] skip
 
 # For this test repository:
diff --git a/src/cmd/go/testdata/script/mod_get_pseudo_prefix.txt b/src/cmd/go/testdata/script/mod_get_pseudo_prefix.txt
index 513450d..ac3233e 100644
--- a/src/cmd/go/testdata/script/mod_get_pseudo_prefix.txt
+++ b/src/cmd/go/testdata/script/mod_get_pseudo_prefix.txt
@@ -6,7 +6,7 @@
 # prefixed tag in any commit that is a parent of the commit supplied
 # to 'go get', when using a repo with go.mod in a sub directory.
 
-[!net] skip
+[short] skip
 [!git] skip
 
 # For this test repository go.mod resides in sub/ (only):
diff --git a/src/cmd/go/testdata/script/mod_get_replaced.txt b/src/cmd/go/testdata/script/mod_get_replaced.txt
index b1fc8b8..c31d5be 100644
--- a/src/cmd/go/testdata/script/mod_get_replaced.txt
+++ b/src/cmd/go/testdata/script/mod_get_replaced.txt
@@ -80,7 +80,7 @@
 cp go.mod.orig go.mod
 
 ! go list example
-stderr '^package example is not in GOROOT \(.*\)$'
+stderr '^package example is not in std \(.*\)$'
 ! go get example
 stderr '^go: malformed module path "example": missing dot in first path element$'
 
diff --git a/src/cmd/go/testdata/script/mod_get_split.txt b/src/cmd/go/testdata/script/mod_get_split.txt
index 0fb22c8..6c2f00d 100644
--- a/src/cmd/go/testdata/script/mod_get_split.txt
+++ b/src/cmd/go/testdata/script/mod_get_split.txt
@@ -33,7 +33,7 @@
 cp go.mod.orig go.mod
 
 ! go get example.net/split/nested@v0.1.0
-stderr '^example.net/split/nested: ambiguous import: found package example.net/split/nested in multiple modules:\n\texample.net/split v0.2.0 \(.*split.2[/\\]nested\)\n\texample.net/split/nested v0.1.0 \(.*nested.1\)$'
+stderr '^go: example.net/split/nested: ambiguous import: found package example.net/split/nested in multiple modules:\n\texample.net/split v0.2.0 \(.*split.2[/\\]nested\)\n\texample.net/split/nested v0.1.0 \(.*nested.1\)$'
 
 # A wildcard that matches packages in some module at its selected version
 # but not at the requested version should fail.
@@ -52,7 +52,7 @@
 # (perhaps 'latest' or 'none'), or we can report an error and the let the user
 # disambiguate. We would rather not choose arbitrarily, so we do the latter.
 #
-# TODO(#27899): Should we instead upgrade or downgrade to an arbirary version?
+# TODO(#27899): Should we instead upgrade or downgrade to an arbitrary version?
 
 ! go get example.net/split/nested/...@v0.1.0
 stderr '^go: example.net/split/nested/\.\.\.@v0.1.0 matches packages in example.net/split@v0.2.0 but not example.net/split@v0.1.0: specify a different version for module example.net/split$'
diff --git a/src/cmd/go/testdata/script/mod_get_toolchain.txt b/src/cmd/go/testdata/script/mod_get_toolchain.txt
new file mode 100644
index 0000000..758142d
--- /dev/null
+++ b/src/cmd/go/testdata/script/mod_get_toolchain.txt
@@ -0,0 +1,129 @@
+# setup
+env TESTGO_VERSION=go1.99rc1
+env TESTGO_VERSION_SWITCH=switch
+
+# go get go should use the latest Go 1.23
+cp go.mod.orig go.mod
+go get go
+stderr '^go: upgraded go 1.21 => 1.23.9$'
+grep 'go 1.23.9' go.mod
+grep 'toolchain go1.99rc1' go.mod
+
+# go get go@1.23 should use the latest Go 1.23
+cp go.mod.orig go.mod
+go get go@1.23
+stderr '^go: upgraded go 1.21 => 1.23.9$'
+grep 'go 1.23.9' go.mod
+grep 'toolchain go1.99rc1' go.mod
+
+# go get go@1.22 should use the latest Go 1.22
+cp go.mod.orig go.mod
+go get go@1.22
+stderr '^go: upgraded go 1.21 => 1.22.9$'
+grep 'go 1.22.9' go.mod
+grep 'toolchain go1.99rc1' go.mod
+
+# go get go@patch should use the latest patch release
+go get go@1.22.1
+go get go@patch
+stderr '^go: upgraded go 1.22.1 => 1.22.9$'
+grep 'go 1.22.9' go.mod
+grep 'toolchain go1.99rc1' go.mod
+
+# go get go@1.24 does NOT find the release candidate
+cp go.mod.orig go.mod
+! go get go@1.24
+stderr '^go: go@1.24: no matching versions for query "1.24"$'
+
+# go get go@1.24rc1 works
+cp go.mod.orig go.mod
+go get go@1.24rc1
+stderr '^go: upgraded go 1.21 => 1.24rc1$'
+grep 'go 1.24rc1' go.mod
+grep 'toolchain go1.99rc1' go.mod
+
+# go get go@latest finds the latest Go 1.23
+cp go.mod.orig go.mod
+go get go@latest
+stderr '^go: upgraded go 1.21 => 1.23.9$'
+grep 'go 1.23.9' go.mod
+grep 'toolchain go1.99rc1' go.mod
+
+# Again, with toolchains.
+
+# go get toolchain should find go1.999testmod.
+go get toolchain
+stderr '^go: upgraded toolchain go1.99rc1 => go1.999testmod$'
+grep 'go 1.23.9' go.mod
+grep 'toolchain go1.999testmod' go.mod
+
+# go get toolchain@go1.23 should use the latest Go 1.23
+go get toolchain@go1.23
+stderr '^go: removed toolchain go1.999testmod$'
+grep 'go 1.23.9' go.mod
+! grep 'toolchain go1.23.9' go.mod  # implied
+
+# go get toolchain@go1.22 should use the latest Go 1.22 and downgrade go.
+go get toolchain@go1.22
+stderr '^go: downgraded go 1.23.9 => 1.22.9$'
+grep 'go 1.22.9' go.mod
+! grep 'toolchain go1.22.9' go.mod # implied
+
+# go get toolchain@patch should use the latest patch release
+go get toolchain@go1.22.1
+go get toolchain@patch
+stderr '^go: added toolchain go1.22.9$'
+grep 'go 1.22.1' go.mod
+grep 'toolchain go1.22.9' go.mod
+go get go@1.22.9 toolchain@none
+grep 'go 1.22.9' go.mod
+! grep 'toolchain go1.22.9' go.mod
+
+# go get toolchain@go1.24 does NOT find the release candidate
+! go get toolchain@go1.24
+stderr '^go: toolchain@go1.24: no matching versions for query "go1.24"$'
+
+# go get toolchain@go1.24rc1 works
+go get toolchain@go1.24rc1
+stderr '^go: added toolchain go1.24rc1$'
+grep 'go 1.22.9' go.mod  # no longer implied
+grep 'toolchain go1.24rc1' go.mod
+
+# go get toolchain@latest finds go1.999testmod.
+cp go.mod.orig go.mod
+go get toolchain@latest
+stderr '^go: added toolchain go1.999testmod$'
+grep 'go 1.21' go.mod
+grep 'toolchain go1.999testmod' go.mod
+
+# Bug fixes.
+
+# go get go@garbage should fail but not crash
+! go get go@garbage
+! stderr panic
+stderr '^go: invalid go version garbage$'
+
+# go get go@go1.21.0 is OK - we silently correct to 1.21.0
+go get go@1.19
+go get go@go1.21.0
+stderr '^go: upgraded go 1.19 => 1.21.0'
+
+# go get toolchain@1.24rc1 is OK too.
+go get toolchain@1.24rc1
+stderr '^go: downgraded toolchain go1.999testmod => go1.24rc1$'
+
+# go get go@1.21 should work if we are the Go 1.21 language version,
+# even though there's no toolchain for it.
+# (Older versions resolve to the latest release in that version, so for example
+# go get go@1.20 might resolve to 1.20.9, but if we're the devel copy of
+# Go 1.21, there's no release yet to resolve to, so we resolve to ourselves.)
+env TESTGO_VERSION=go1.21
+go get go@1.19 toolchain@none
+go get go@1.21
+grep 'go 1.21$' go.mod
+! grep toolchain go.mod
+
+-- go.mod.orig --
+module m
+
+go 1.21
diff --git a/src/cmd/go/testdata/script/mod_getx.txt b/src/cmd/go/testdata/script/mod_getx.txt
index dee3f74..46bb95b 100644
--- a/src/cmd/go/testdata/script/mod_getx.txt
+++ b/src/cmd/go/testdata/script/mod_getx.txt
@@ -1,5 +1,4 @@
-[short] skip
-[!net] skip
+[!net:golang.org] skip
 [!git] skip
 
 env GO111MODULE=on
diff --git a/src/cmd/go/testdata/script/mod_git_export_subst.txt b/src/cmd/go/testdata/script/mod_git_export_subst.txt
index 44fb501..740ccbd 100644
--- a/src/cmd/go/testdata/script/mod_git_export_subst.txt
+++ b/src/cmd/go/testdata/script/mod_git_export_subst.txt
@@ -2,7 +2,7 @@
 env GOPROXY=direct
 
 # Testing that git export-subst is disabled
-[!net] skip
+[!net:github.com] skip
 [!git] skip
 go build
 
diff --git a/src/cmd/go/testdata/script/mod_go_version.txt b/src/cmd/go/testdata/script/mod_go_version.txt
index 97d9975..82b55d8 100644
--- a/src/cmd/go/testdata/script/mod_go_version.txt
+++ b/src/cmd/go/testdata/script/mod_go_version.txt
@@ -1,110 +1,29 @@
 # Test support for declaring needed Go version in module.
 
 env GO111MODULE=on
+env TESTGO_VERSION=go1.21
 
-go list
-go build
-go build sub.1
-go build subver.1
-! stderr 'module requires'
-! go build badsub.1
-stderr '^note: module requires Go 1.11111$'
-
-go build versioned.1
-go mod edit -require versioned.1@v1.1.0
-! go build versioned.1
-stderr '^note: module requires Go 1.99999$'
-
-[short] stop
-
-# The message should be printed even if the compiler emits no output.
-go build -o $WORK/nooutput.exe nooutput.go
-! go build -toolexec=$WORK/nooutput.exe versioned.1
-stderr '^# versioned.1\nnote: module requires Go 1.99999$'
+! go list
+stderr -count=1 '^go: sub@v1.0.0: module ./sub requires go >= 1.999 \(running go 1.21\)$'
+! go build sub
+stderr -count=1 '^go: sub@v1.0.0: module ./sub requires go >= 1.999 \(running go 1.21\)$'
 
 -- go.mod --
 module m
-go 1.999
+go 1.1
 require (
-	sub.1 v1.0.0
-	subver.1 v1.0.0
-	badsub.1 v1.0.0
-	versioned.1 v1.0.0
+	sub v1.0.0
 )
 replace (
-	sub.1 => ./sub
-	subver.1 => ./subver
-	badsub.1 => ./badsub
-	versioned.1 v1.0.0 => ./versioned1
-	versioned.1 v1.1.0 => ./versioned2
+	sub => ./sub
 )
 
 -- x.go --
 package x
 
 -- sub/go.mod --
-module m
-go 1.11
+module sub
+go 1.999
 
 -- sub/x.go --
 package x
-
--- subver/go.mod --
-module m
-go 1.11111
-
--- subver/x.go --
-package x
-
--- badsub/go.mod --
-module m
-go 1.11111
-
--- badsub/x.go --
-package x
-invalid syntax
-
--- versioned1/go.mod --
-module versioned
-go 1.0
-
--- versioned1/x.go --
-package x
-
--- versioned2/go.mod --
-module versioned
-go 1.99999
-
--- versioned2/x.go --
-package x
-invalid syntax
-
--- nooutput.go --
-// +build ignore
-
-package main
-
-import (
-	"bytes"
-	"os"
-	"os/exec"
-	"strings"
-)
-
-func main() {
-	stderr := new(bytes.Buffer)
-	stdout := new(bytes.Buffer)
-
-	cmd := exec.Command(os.Args[1], os.Args[2:]...)
-	cmd.Stderr = stderr
-	cmd.Stdout = stdout
-
-	err := cmd.Run()
-	if strings.HasPrefix(os.Args[2], "-V") {
-		os.Stderr.Write(stderr.Bytes())
-		os.Stdout.Write(stdout.Bytes())
-	}
-	if err != nil {
-		os.Exit(1)
-	}
-}
diff --git a/src/cmd/go/testdata/script/mod_go_version_missing.txt b/src/cmd/go/testdata/script/mod_go_version_missing.txt
index f40b48f..e9a8e72 100644
--- a/src/cmd/go/testdata/script/mod_go_version_missing.txt
+++ b/src/cmd/go/testdata/script/mod_go_version_missing.txt
@@ -27,8 +27,7 @@
 
 ! go list -mod=vendor all
 ! stderr '^go: inconsistent vendoring'
-stderr 'go: finding module for package example.com/badedit'
-stderr 'cannot query module due to -mod=vendor'
+stderr 'cannot find module providing package example.com/badedit: import lookup disabled by -mod=vendor'
 
 # When we set -mod=mod, the go version should be updated immediately,
 # to the current version, converting the requirements from eager to lazy.
diff --git a/src/cmd/go/testdata/script/mod_goline.txt b/src/cmd/go/testdata/script/mod_goline.txt
new file mode 100644
index 0000000..6b2eab0
--- /dev/null
+++ b/src/cmd/go/testdata/script/mod_goline.txt
@@ -0,0 +1,117 @@
+env TESTGO_VERSION=go1.99
+
+! go list -f '{{.Module.GoVersion}}'
+stderr 'go: updates to go.mod needed'
+stderr 'go mod tidy'
+
+go mod tidy
+cat go.mod
+go list -f '{{.Module.GoVersion}}'
+stdout 1.22
+
+# Adding a@v1.0.01 should upgrade to Go 1.23rc1.
+cp go.mod go.mod1
+go get example.com/a@v1.0.1
+stderr '^go: upgraded go 1.22 => 1.23rc1\ngo: upgraded example.com/a v1.0.0 => v1.0.1\ngo: upgraded example.com/b v1.0.0 => v1.0.1$'
+go list -f '{{.Module.GoVersion}}'
+stdout 1.23rc1
+
+# Repeating the update with go@1.24.0 should use that Go version.
+cp go.mod1 go.mod
+go get example.com/a@v1.0.1 go@1.24.0
+go list -f '{{.Module.GoVersion}}'
+stdout 1.24.0
+
+# Go version-constrained updates should report the problems.
+cp go.mod1 go.mod
+! go get example.com/a@v1.0.2 go@1.24.2
+stderr '^go: example.com/a@v1.0.2 requires go@1.25, not go@1.24.2$'
+! go get example.com/a@v1.0.2 go@1.26.3
+stderr '^go: example.com/a@v1.0.2 indirectly requires go@1.27, not go@1.26.3$'
+go get example.com/a@v1.0.2 go@1.28rc1
+go list -f '{{.Module.GoVersion}}'
+stdout 1.28rc1
+go get go@1.24.2
+stderr '^go: downgraded go 1.28rc1 => 1.24.2$'
+stderr '^go: downgraded example.com/a v1.0.2 => v1.0.1$'
+stderr '^go: downgraded example.com/b v1.0.2 => v1.0.1$'
+go list -f '{{.Module.GoVersion}}'
+stdout 1.24.2
+
+-- go.mod --
+module m
+go 1.21
+
+require (
+	example.com/a v1.0.0
+	example.com/b v0.9.0
+)
+
+replace example.com/a v1.0.0 => ./a100
+replace example.com/a v1.0.1 => ./a101
+replace example.com/a v1.0.2 => ./a102
+replace example.com/b v1.0.1 => ./b101
+replace example.com/b v1.0.2 => ./b102
+replace example.com/b v1.0.0 => ./b100
+replace example.com/b v0.9.0 => ./b100
+
+-- x.go --
+package m
+
+import (
+	_ "example.com/a"
+	_ "example.com/b"
+)
+
+-- a100/go.mod --
+module example.com/a
+go 1.22
+
+require example.com/b v1.0.0
+
+-- a100/a.go --
+package a
+
+-- a101/go.mod --
+// this module is technically invalid, since the dep example.com/b has a newer go line than this module,
+// but we should still be able to handle it.
+module example.com/a
+go 1.22
+
+require example.com/b v1.0.1
+
+-- a101/a.go --
+package a
+
+-- a102/go.mod --
+// this module is technically invalid, since the dep example.com/b has a newer go line than this module,
+// but we should still be able to handle it.
+module example.com/a
+go 1.25
+
+require example.com/b v1.0.2
+
+-- a102/a.go --
+package a
+
+-- b100/go.mod --
+module example.com/b
+go 1.22
+
+-- b100/b.go --
+package b
+
+-- b101/go.mod --
+module example.com/b
+go 1.23rc1
+
+-- b101/b.go --
+package b
+
+-- b102/go.mod --
+module example.com/b
+go 1.27
+
+-- b102/b.go --
+package b
+
diff --git a/src/cmd/go/testdata/script/mod_goline_old.txt b/src/cmd/go/testdata/script/mod_goline_old.txt
new file mode 100644
index 0000000..bbe611b
--- /dev/null
+++ b/src/cmd/go/testdata/script/mod_goline_old.txt
@@ -0,0 +1,72 @@
+env TESTGO_VERSION=go1.24
+
+go list -f '{{.Module.GoVersion}}'
+stdout 1.15
+
+go mod tidy
+go list -f '{{.Module.GoVersion}}'
+stdout 1.15
+
+go get example.com/a@v1.0.1
+go list -f '{{.Module.GoVersion}}'
+stdout 1.15
+
+go get example.com/a@v1.0.1 go@1.16
+go list -f '{{.Module.GoVersion}}'
+stdout 1.16
+
+-- go.mod --
+module m
+go 1.15
+
+require (
+	example.com/a v1.0.0
+	example.com/b v1.0.0
+)
+
+replace example.com/a v1.0.0 => ./a100
+replace example.com/a v1.0.1 => ./a101
+replace example.com/b v1.0.1 => ./b101
+replace example.com/b v1.0.0 => ./b100
+replace example.com/b v0.9.0 => ./b100
+
+-- x.go --
+package m
+
+import (
+	_ "example.com/a"
+	_ "example.com/b"
+)
+
+-- a100/go.mod --
+module example.com/a
+go 1.16
+
+require example.com/b v1.0.0
+
+-- a100/a.go --
+package a
+
+-- a101/go.mod --
+module example.com/a
+go 1.17
+
+require example.com/b v1.0.1
+
+-- a101/a.go --
+package a
+
+-- b100/go.mod --
+module example.com/b
+go 1.18
+
+-- b100/b.go --
+package b
+
+-- b101/go.mod --
+module example.com/b
+go 1.19
+
+-- b101/b.go --
+package b
+
diff --git a/src/cmd/go/testdata/script/mod_goline_too_new.txt b/src/cmd/go/testdata/script/mod_goline_too_new.txt
new file mode 100644
index 0000000..6d26679
--- /dev/null
+++ b/src/cmd/go/testdata/script/mod_goline_too_new.txt
@@ -0,0 +1,50 @@
+# Go should refuse to build code that is too new according to go.mod.
+
+# go.mod too new
+env GOTOOLCHAIN=local
+! go build .
+stderr '^go: go.mod requires go >= 1.99999 \(running go 1\..+\)$'
+
+# go.mod referenced from go.work too new
+cp go.work.old go.work
+! go build .
+stderr '^go: module . listed in go.work file requires go >= 1.99999, but go.work lists go 1.10; to update it:\n\tgo work use$'
+
+! go work sync
+stderr '^go: cannot load module . listed in go.work file: go.mod requires go >= 1.99999 \(running go 1\..+\)$'
+
+# go.work too new
+cp go.work.new go.work
+cp go.mod.old go.mod
+! go build .
+stderr '^go: go.work requires go >= 1.99999 \(running go 1\..+\)$'
+
+# vendor too new
+rm go.work
+mv notvendor vendor
+! go build -mod=vendor .
+stderr '^go: golang.org/x/text in vendor'${/}'modules.txt requires go >= 1.99999 \(running go 1\..+\)$'
+
+-- go.mod --
+module example
+go 1.99999
+
+-- p.go --
+package p
+
+-- go.mod.old --
+module example
+go 1.10
+
+-- go.work.new --
+go 1.99999
+use .
+
+-- go.work.old --
+go 1.10
+use .
+
+-- notvendor/modules.txt --
+# golang.org/x/text v0.9.0
+## explicit; go 1.99999
+golang.org/x/text/internal/language
diff --git a/src/cmd/go/testdata/script/mod_gonoproxy.txt b/src/cmd/go/testdata/script/mod_gonoproxy.txt
index 98a1d28..94d03f2 100644
--- a/src/cmd/go/testdata/script/mod_gonoproxy.txt
+++ b/src/cmd/go/testdata/script/mod_gonoproxy.txt
@@ -36,13 +36,14 @@
 stderr '^go: golang.org/x/text: module lookup disabled by GOPROXY=off$'
 
 # GONOPROXY bypasses proxy
-[!net] skip
+[!net:rsc.io] skip
 [!git] skip
 env GOPRIVATE=none
 env GONOPROXY='*/fortune'
 ! go get rsc.io/fortune # does not exist in real world, only on test proxy
 stderr 'git ls-remote'
 
+[!net:golang.org] skip
 env GOSUMDB=
 env GONOPROXY=
 env GOPRIVATE='*/x'
diff --git a/src/cmd/go/testdata/script/mod_gopkg_unstable.txt b/src/cmd/go/testdata/script/mod_gopkg_unstable.txt
index 3608bcd..856f493 100644
--- a/src/cmd/go/testdata/script/mod_gopkg_unstable.txt
+++ b/src/cmd/go/testdata/script/mod_gopkg_unstable.txt
@@ -7,7 +7,7 @@
 cp go.mod.empty go.mod
 go list
 
-[!net] skip
+[!net:gopkg.in] skip
 [!git] skip
 
 skip  # TODO(#54503): redirect gopkg.in requests to a local server and re-enable.
diff --git a/src/cmd/go/testdata/script/mod_goroot_errors.txt b/src/cmd/go/testdata/script/mod_goroot_errors.txt
index 9d7a94d..110a196 100644
--- a/src/cmd/go/testdata/script/mod_goroot_errors.txt
+++ b/src/cmd/go/testdata/script/mod_goroot_errors.txt
@@ -11,24 +11,24 @@
 ! go build -mod=readonly nonexist
 ! stderr 'import lookup disabled'
 ! stderr 'missing dot'
-stderr '^package nonexist is not in GOROOT \('$GOROOT'[/\\]src[/\\]nonexist\)$'
+stderr '^package nonexist is not in std \('$GOROOT'[/\\]src[/\\]nonexist\)$'
 
 ! go build nonexist
 ! stderr 'import lookup disabled'
 ! stderr 'missing dot'
-stderr '^package nonexist is not in GOROOT \('$GOROOT'[/\\]src[/\\]nonexist\)$'
+stderr '^package nonexist is not in std \('$GOROOT'[/\\]src[/\\]nonexist\)$'
 
 # Building a nonexistent std package indirectly should also fail usefully.
 
 ! go build -mod=readonly ./importnonexist
 ! stderr 'import lookup disabled'
 ! stderr 'missing dot'
-stderr '^importnonexist[/\\]x.go:2:8: package nonexist is not in GOROOT \('$GOROOT'[/\\]src[/\\]nonexist\)$'
+stderr '^importnonexist[/\\]x.go:2:8: package nonexist is not in std \('$GOROOT'[/\\]src[/\\]nonexist\)$'
 
 ! go build ./importnonexist
 ! stderr 'import lookup disabled'
 ! stderr 'missing dot'
-stderr '^importnonexist[/\\]x.go:2:8: package nonexist is not in GOROOT \('$GOROOT'[/\\]src[/\\]nonexist\)$'
+stderr '^importnonexist[/\\]x.go:2:8: package nonexist is not in std \('$GOROOT'[/\\]src[/\\]nonexist\)$'
 
 # Building an *actual* std package should fail if GOROOT is set to something bogus.
 
@@ -38,7 +38,7 @@
 ! go build ./importjson
 ! stderr 'import lookup disabled'
 ! stderr 'missing dot'
-stderr 'importjson[/\\]x.go:2:8: package encoding/json is not in GOROOT \('$WORK'[/\\]not-a-valid-goroot[/\\]src[/\\]encoding[/\\]json\)$'
+stderr 'importjson[/\\]x.go:2:8: package encoding/json is not in std \('$WORK'[/\\]not-a-valid-goroot[/\\]src[/\\]encoding[/\\]json\)$'
 
 -- go.mod --
 module example.com
diff --git a/src/cmd/go/testdata/script/mod_import_toolchain.txt b/src/cmd/go/testdata/script/mod_import_toolchain.txt
new file mode 100644
index 0000000..42c12c1
--- /dev/null
+++ b/src/cmd/go/testdata/script/mod_import_toolchain.txt
@@ -0,0 +1,192 @@
+# This test verifies that 'go get' and 'go mod tidy' switch to a newer toolchain
+# if needed to process newly-reolved imports.
+
+env TESTGO_VERSION=go1.21.0
+env TESTGO_VERSION_SWITCH=switch
+
+cp go.mod go.mod.orig
+
+# tidy reports needing 1.22.0 for b1
+env GOTOOLCHAIN=local
+! go mod tidy
+stderr '^go: example imports\n\texample.net/b: module ./b1 requires go >= 1.22.0 \(running go 1.21.0; GOTOOLCHAIN=local\)$'
+env GOTOOLCHAIN=auto
+go mod tidy
+
+cmp stderr tidy-stderr.want
+cmp go.mod go.mod.tidy
+
+cp go.mod.orig go.mod
+env GOTOOLCHAIN=local
+! go get -v .
+stderr '^go: example.net/b@v0.1.0: module ./b1 requires go >= 1.22.0 \(running go 1.21.0; GOTOOLCHAIN=local\)$'
+env GOTOOLCHAIN=auto
+go get -v .
+cmp stderr get-v-stderr.want
+cmp go.mod go.mod.tidy
+
+cp go.mod.orig go.mod
+env GOTOOLCHAIN=local
+! go get -u -v .
+stderr '^go: example.net/a@v0.2.0: module ./a2 requires go >= 1.22.0 \(running go 1.21.0; GOTOOLCHAIN=local\)$'
+env GOTOOLCHAIN=auto
+go get -u -v .
+cmp stderr get-u-v-stderr.want
+cmp go.mod go.mod.upgraded
+
+-- tidy-stderr.want --
+go: found example.net/b in example.net/b v0.1.0
+go: module ./b1 requires go >= 1.22.0; switching to go1.22.9
+go: found example.net/b in example.net/b v0.1.0
+go: found example.net/c in example.net/c v0.1.0
+-- get-v-stderr.want --
+go: trying upgrade to example.net/b@v0.1.0
+go: module ./b1 requires go >= 1.22.0; switching to go1.22.9
+go: trying upgrade to example.net/b@v0.1.0
+go: accepting indirect upgrade from go@1.20 to 1.22.0
+go: trying upgrade to example.net/c@v0.1.0
+go: upgraded go 1.20 => 1.22.0
+go: added toolchain go1.22.9
+go: added example.net/b v0.1.0
+go: added example.net/c v0.1.0
+go: added example.net/d v0.1.0
+-- get-u-v-stderr.want --
+go: trying upgrade to example.net/a@v0.2.0
+go: trying upgrade to example.net/b@v0.1.0
+go: module ./a2 requires go >= 1.22.0; switching to go1.22.9
+go: trying upgrade to example.net/a@v0.2.0
+go: trying upgrade to example.net/b@v0.1.0
+go: accepting indirect upgrade from go@1.20 to 1.22.0
+go: trying upgrade to example.net/c@v0.1.0
+go: trying upgrade to example.net/d@v0.2.0
+go: module ./d2 requires go >= 1.23.0; switching to go1.23.9
+go: trying upgrade to example.net/a@v0.2.0
+go: trying upgrade to example.net/b@v0.1.0
+go: accepting indirect upgrade from go@1.20 to 1.22.0
+go: trying upgrade to example.net/c@v0.1.0
+go: trying upgrade to example.net/d@v0.2.0
+go: accepting indirect upgrade from go@1.22.0 to 1.23.0
+go: upgraded go 1.20 => 1.23.0
+go: added toolchain go1.23.9
+go: upgraded example.net/a v0.1.0 => v0.2.0
+go: added example.net/b v0.1.0
+go: added example.net/c v0.1.0
+go: added example.net/d v0.2.0
+-- go.mod --
+module example
+
+go 1.20
+
+require example.net/a v0.1.0
+
+replace (
+	example.net/a v0.1.0 => ./a1
+	example.net/a v0.2.0 => ./a2
+	example.net/b v0.1.0 => ./b1
+	example.net/c v0.1.0 => ./c1
+	example.net/d v0.1.0 => ./d1
+	example.net/d v0.2.0 => ./d2
+)
+-- go.mod.tidy --
+module example
+
+go 1.22.0
+
+toolchain go1.22.9
+
+require (
+	example.net/a v0.1.0
+	example.net/b v0.1.0
+)
+
+require (
+	example.net/c v0.1.0 // indirect
+	example.net/d v0.1.0 // indirect
+)
+
+replace (
+	example.net/a v0.1.0 => ./a1
+	example.net/a v0.2.0 => ./a2
+	example.net/b v0.1.0 => ./b1
+	example.net/c v0.1.0 => ./c1
+	example.net/d v0.1.0 => ./d1
+	example.net/d v0.2.0 => ./d2
+)
+-- go.mod.upgraded --
+module example
+
+go 1.23.0
+
+toolchain go1.23.9
+
+require (
+	example.net/a v0.2.0
+	example.net/b v0.1.0
+)
+
+require (
+	example.net/c v0.1.0 // indirect
+	example.net/d v0.2.0 // indirect
+)
+
+replace (
+	example.net/a v0.1.0 => ./a1
+	example.net/a v0.2.0 => ./a2
+	example.net/b v0.1.0 => ./b1
+	example.net/c v0.1.0 => ./c1
+	example.net/d v0.1.0 => ./d1
+	example.net/d v0.2.0 => ./d2
+)
+-- example.go --
+package example
+
+import (
+	_ "example.net/a"
+	_ "example.net/b"
+)
+-- a1/go.mod --
+module example.net/a
+
+go 1.20
+-- a1/a.go --
+package a
+-- a2/go.mod --
+module example.net/a
+
+go 1.22.0
+
+toolchain go1.23.0
+-- a2/a.go --
+package a
+-- b1/go.mod --
+module example.net/b
+
+go 1.22.0
+
+toolchain go1.23.0
+-- b1/b.go --
+package b
+
+import _ "example.net/c"  // Note: module b is intentionally untidy, as if due to a bad git merge
+-- c1/go.mod --
+module example.net/c
+
+go 1.22.0
+
+require example.net/d v0.1.0
+-- c1/c.go --
+package c
+
+import _ "example.net/d"
+-- d1/go.mod --
+module example.net/d
+
+go 1.22.0
+-- d1/d.go --
+package d
+-- d2/go.mod --
+module example.net/d
+
+go 1.23.0
+-- d2/d.go --
+package d
diff --git a/src/cmd/go/testdata/script/mod_indirect_main.txt b/src/cmd/go/testdata/script/mod_indirect_main.txt
index eeb93f1..e84eb9c 100644
--- a/src/cmd/go/testdata/script/mod_indirect_main.txt
+++ b/src/cmd/go/testdata/script/mod_indirect_main.txt
@@ -60,6 +60,7 @@
 golang.org/issue/mirror v0.1.0 => ./mirror-v0.1.0
 golang.org/issue/pkg v0.1.0 => ./pkg-v0.1.0
 -- graph.txt --
+golang.org/issue/root go@1.12
 golang.org/issue/root golang.org/issue/mirror@v0.1.0
 golang.org/issue/mirror@v0.1.0 golang.org/issue/root@v0.1.0
 golang.org/issue/root@v0.1.0 golang.org/issue/pkg@v0.1.0
diff --git a/src/cmd/go/testdata/script/mod_init_glide.txt b/src/cmd/go/testdata/script/mod_init_glide.txt
index 2126ae5..0d087eb 100644
--- a/src/cmd/go/testdata/script/mod_init_glide.txt
+++ b/src/cmd/go/testdata/script/mod_init_glide.txt
@@ -1,4 +1,4 @@
-[!net] skip
+[!net:github.com] skip
 [!git] skip
 
 env GO111MODULE=on
diff --git a/src/cmd/go/testdata/script/mod_install_pkg_version.txt b/src/cmd/go/testdata/script/mod_install_pkg_version.txt
index e3f59fc..89dfc14 100644
--- a/src/cmd/go/testdata/script/mod_install_pkg_version.txt
+++ b/src/cmd/go/testdata/script/mod_install_pkg_version.txt
@@ -16,7 +16,8 @@
 cd m
 cp go.mod go.mod.orig
 ! go list -m all
-stderr '^go: example.com/cmd@v1.1.0-doesnotexist: missing go.sum entry; to add it:\n\tgo mod download example.com/cmd$'
+stderr '^go: example.com/cmd@v1.1.0-doesnotexist: reading http.*/mod/example.com/cmd/@v/v1.1.0-doesnotexist.info: 404 Not Found\n\tserver response: 404 page not found$'
+stderr '^go: example.com/cmd@v1.1.0-doesnotexist: missing go.sum entry for go.mod file; to add it:\n\tgo mod download example.com/cmd$'
 go install example.com/cmd/a@latest
 cmp go.mod go.mod.orig
 exists $GOPATH/bin/a$GOEXE
@@ -127,7 +128,7 @@
 go mod init m
 go get example.com/cmd@v1.0.0
 ! go build example.com/cmd/...
-stderr 'err[/\\]err.go:3:9: undefined: DoesNotCompile$'
+stderr 'err[/\\]err.go:3:9: undefined: DoesNotCompile( .*)?$'
 cd ..
 
 go install example.com/cmd/...@v1.0.0
@@ -141,7 +142,7 @@
 go install example.com/cmd/a@v1.0.0 example.com/cmd/nomatch...@v1.0.0
 stderr '^go: warning: "example.com/cmd/nomatch\.\.\." matched no packages$'
 
-# If a wildcard matches only non-main packges, we should see a different warning.
+# If a wildcard matches only non-main packages, we should see a different warning.
 go install example.com/cmd/err...@v1.0.0
 stderr '^go: warning: "example.com/cmd/err\.\.\." matched only non-main packages$'
 
@@ -159,7 +160,7 @@
 # 'go install pkg@version' should report an error if the module requires a
 # higher version of itself.
 ! go install example.com/cmd/a@v1.0.0-newerself
-stderr '^go: example.com/cmd/a@v1.0.0-newerself: version constraints conflict:\n\texample.com/cmd@v1.0.0-newerself requires example.com/cmd@v1.0.0, but example.com/cmd@v1.0.0-newerself is requested$'
+stderr '^go: example.com/cmd/a@v1.0.0-newerself: version constraints conflict:\n\texample.com/cmd@v1.0.0-newerself requires example.com/cmd@v1.0.0, but v1.0.0-newerself is requested$'
 
 
 # 'go install pkg@version' will only match a retracted version if it's
diff --git a/src/cmd/go/testdata/script/mod_invalid_path.txt b/src/cmd/go/testdata/script/mod_invalid_path.txt
index 667b76e..975de5e 100644
--- a/src/cmd/go/testdata/script/mod_invalid_path.txt
+++ b/src/cmd/go/testdata/script/mod_invalid_path.txt
@@ -3,7 +3,7 @@
 # Test that go list fails on a go.mod with no module declaration.
 cd $WORK/gopath/src/mod
 ! go list .
-stderr '^go: no module declaration in go.mod. To specify the module path:\n\tgo mod edit -module=example.com/mod$'
+stderr '^go: error reading go.mod: missing module declaration. To specify the module path:\n\tgo mod edit -module=example.com/mod$'
 
 # Test that go mod init in GOPATH doesn't add a module declaration
 # with a path that can't possibly be a module path, because
diff --git a/src/cmd/go/testdata/script/mod_invalid_version.txt b/src/cmd/go/testdata/script/mod_invalid_version.txt
index d1e1da4..a0427b3 100644
--- a/src/cmd/go/testdata/script/mod_invalid_version.txt
+++ b/src/cmd/go/testdata/script/mod_invalid_version.txt
@@ -1,4 +1,4 @@
-[!net] skip
+[!net:golang.org] skip
 [!git] skip
 
 env GO111MODULE=on
@@ -50,7 +50,7 @@
 stderr 'go: example.com@v0.0.0 \(replaced by \./\.\.\): parsing ..[/\\]go.mod: '$WORK'[/\\]gopath[/\\]src[/\\]go.mod:5: require golang.org/x/text: version "v2.1.1-0.20170915032832-14c0d48ead0c" invalid: should be v0 or v1, not v2'
 cd ..
 ! go list -m golang.org/x/text
-stderr $WORK'[/\\]gopath[/\\]src[/\\]go.mod:5: require golang.org/x/text: version "v2.1.1-0.20170915032832-14c0d48ead0c" invalid: should be v0 or v1, not v2'
+stderr '^go.mod:5: require golang.org/x/text: version "v2.1.1-0.20170915032832-14c0d48ead0c" invalid: should be v0 or v1, not v2'
 
 # A pseudo-version with fewer than 12 digits of SHA-1 prefix is invalid.
 cp go.mod.orig go.mod
@@ -178,6 +178,8 @@
 ! go list -m golang.org/x/text
 stderr 'golang.org/x/text@v0.1.1-0.20170915032832-14c0d48ead0c\+incompatible: invalid version: \+incompatible suffix not allowed: major version v0 is compatible'
 
+[!net:github.com] stop
+
 # The pseudo-version for a commit after a tag with a non-matching major version
 # should instead be based on the last matching tag.
 cp go.mod.orig go.mod
diff --git a/src/cmd/go/testdata/script/mod_issue35270.txt b/src/cmd/go/testdata/script/mod_issue35270.txt
index 6c2587a..27b9226 100644
--- a/src/cmd/go/testdata/script/mod_issue35270.txt
+++ b/src/cmd/go/testdata/script/mod_issue35270.txt
@@ -10,7 +10,7 @@
 
 cd ../c
 ! go build -mod=vendor
-stderr 'main.go:4:5: package p is not in GOROOT'
+stderr 'main.go:4:5: package p is not in std'
 
 -- a/go.mod --
 module image
diff --git a/src/cmd/go/testdata/script/mod_list_compiled_concurrent.txt b/src/cmd/go/testdata/script/mod_list_compiled_concurrent.txt
index 896bbab..195f7b1 100644
--- a/src/cmd/go/testdata/script/mod_list_compiled_concurrent.txt
+++ b/src/cmd/go/testdata/script/mod_list_compiled_concurrent.txt
@@ -5,33 +5,12 @@
 
 # Regression test for golang.org/issue/29667:
 # spurious 'failed to cache compiled Go files' errors.
-# This test failed reliably when run with -count=10
-# on a Linux workstation.
 
 env GOCACHE=$WORK/gocache
 mkdir $GOCACHE
 
 go list -json -compiled -test=false -export=false -deps=true -- . &
 go list -json -compiled -test=false -export=false -deps=true -- . &
-go list -json -compiled -test=false -export=false -deps=true -- . &
-go list -json -compiled -test=false -export=false -deps=true -- . &
-go list -json -compiled -test=false -export=false -deps=true -- . &
-go list -json -compiled -test=false -export=false -deps=true -- . &
-go list -json -compiled -test=false -export=false -deps=true -- . &
-go list -json -compiled -test=false -export=false -deps=true -- . &
-go list -json -compiled -test=false -export=false -deps=true -- . &
-go list -json -compiled -test=false -export=false -deps=true -- . &
-go list -json -compiled -test=false -export=false -deps=true -- . &
-go list -json -compiled -test=false -export=false -deps=true -- . &
-go list -json -compiled -test=false -export=false -deps=true -- . &
-go list -json -compiled -test=false -export=false -deps=true -- . &
-go list -json -compiled -test=false -export=false -deps=true -- . &
-go list -json -compiled -test=false -export=false -deps=true -- . &
-go list -json -compiled -test=false -export=false -deps=true -- . &
-go list -json -compiled -test=false -export=false -deps=true -- . &
-go list -json -compiled -test=false -export=false -deps=true -- . &
-go list -json -compiled -test=false -export=false -deps=true -- . &
-
 wait
 
 -- go.mod --
diff --git a/src/cmd/go/testdata/script/mod_list_direct.txt b/src/cmd/go/testdata/script/mod_list_direct.txt
index 3e7c479..8bab330 100644
--- a/src/cmd/go/testdata/script/mod_list_direct.txt
+++ b/src/cmd/go/testdata/script/mod_list_direct.txt
@@ -2,7 +2,7 @@
 env GOPROXY=direct
 env GOSUMDB=off
 
-[!net] skip
+[short] skip
 [!git] skip
 
 # golang.org/issue/33099: if an import path ends in a major-version suffix,
diff --git a/src/cmd/go/testdata/script/mod_list_odd_tags.txt b/src/cmd/go/testdata/script/mod_list_odd_tags.txt
index b413e87..232754e 100644
--- a/src/cmd/go/testdata/script/mod_list_odd_tags.txt
+++ b/src/cmd/go/testdata/script/mod_list_odd_tags.txt
@@ -1,6 +1,5 @@
 [short] skip
 [!git] skip
-[!net] skip
 
 env GOPROXY=direct
 
diff --git a/src/cmd/go/testdata/script/mod_list_std.txt b/src/cmd/go/testdata/script/mod_list_std.txt
index cd95b6a..7a4fe21 100644
--- a/src/cmd/go/testdata/script/mod_list_std.txt
+++ b/src/cmd/go/testdata/script/mod_list_std.txt
@@ -36,6 +36,7 @@
 # rules).
 
 cd $GOROOT/src
+env GOWORK=off
 
 go list std
 stdout ^vendor/golang.org/x/net/http2/hpack
diff --git a/src/cmd/go/testdata/script/mod_list_sums.txt b/src/cmd/go/testdata/script/mod_list_sums.txt
index 6c2f57c..cf1c18b 100644
--- a/src/cmd/go/testdata/script/mod_list_sums.txt
+++ b/src/cmd/go/testdata/script/mod_list_sums.txt
@@ -29,4 +29,4 @@
 #
 # TODO(#41297): This should not be an error either.
 ! go list -m -mod=readonly -versions rsc.io/sampler
-stderr '^go: rsc\.io/quote@v1\.5\.1: missing go\.sum entry; to add it:\n\tgo mod download rsc\.io/quote$'
+stderr '^go: rsc\.io/quote@v1\.5\.1: missing go\.sum entry for go.mod file; to add it:\n\tgo mod download rsc\.io/quote$'
diff --git a/src/cmd/go/testdata/script/mod_load_badchain.txt b/src/cmd/go/testdata/script/mod_load_badchain.txt
index be2a4bc..500a954 100644
--- a/src/cmd/go/testdata/script/mod_load_badchain.txt
+++ b/src/cmd/go/testdata/script/mod_load_badchain.txt
@@ -16,11 +16,12 @@
 
 # Try to update the main module. This updates everything, including
 # modules that aren't direct requirements, so the error stack is shorter.
-! go get -u ./...
+go get -u ./...
 cmp stderr update-main-expected
-cmp go.mod go.mod.orig
+cmp go.mod go.mod.withc
 
 # Update manually. Listing modules should produce an error.
+cp go.mod.orig go.mod
 go mod edit -require=example.com/badchain/a@v1.1.0
 ! go list -m all
 cmp stderr list-expected
@@ -40,6 +41,15 @@
 go 1.13
 
 require example.com/badchain/a v1.0.0
+-- go.mod.withc --
+module m
+
+go 1.13
+
+require (
+	example.com/badchain/a v1.0.0
+	example.com/badchain/c v1.0.0
+)
 -- go.sum --
 example.com/badchain/a v1.0.0 h1:iJDLiHLmpQgr9Zrv+44UqywAE2IG6WkHnH4uG08vf+s=
 example.com/badchain/a v1.0.0/go.mod h1:6/gnCYHdVrs6mUgatUYUSbuHxEY+/yWedmTggLz23EI=
@@ -72,10 +82,9 @@
 go: example.com/badchain/c@v1.1.0: parsing go.mod:
 	module declares its path as: badchain.example.com/c
 	        but was required as: example.com/badchain/c
+	restoring example.com/badchain/c@v1.0.0
 -- update-a-expected --
-go: example.com/badchain/a@v1.1.0 requires
-	example.com/badchain/b@v1.1.0 requires
-	example.com/badchain/c@v1.1.0: parsing go.mod:
+go: example.com/badchain/a@upgrade (v1.1.0) indirectly requires example.com/badchain/c@v1.1.0: parsing go.mod:
 	module declares its path as: badchain.example.com/c
 	        but was required as: example.com/badchain/c
 -- list-expected --
diff --git a/src/cmd/go/testdata/script/mod_load_missing_std.txt b/src/cmd/go/testdata/script/mod_load_missing_std.txt
deleted file mode 100644
index bd2508a..0000000
--- a/src/cmd/go/testdata/script/mod_load_missing_std.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-# Go should indicate the version the module requires when a standard library
-# import is missing. See golang.org/issue/48966.
-
-! go build .
-stderr '^main.go:3:8: package nonexistent is not in GOROOT \(.*\)$'
-stderr '^note: imported by a module that requires go 1.99999$'
-
--- go.mod --
-module example
-
-go 1.99999
--- main.go --
-package main
-
-import _ "nonexistent"
-
-func main() {}
diff --git a/src/cmd/go/testdata/script/mod_missing_repo.txt b/src/cmd/go/testdata/script/mod_missing_repo.txt
index 4b403fe..d0076f7 100644
--- a/src/cmd/go/testdata/script/mod_missing_repo.txt
+++ b/src/cmd/go/testdata/script/mod_missing_repo.txt
@@ -2,7 +2,7 @@
 # subgroups could not be fetched because the server returned bogus go-import
 # tags for prefixes of the module path.
 
-[!net] skip
+[short] skip
 [!git] skip
 
 env GO111MODULE=on
diff --git a/src/cmd/go/testdata/script/mod_outside.txt b/src/cmd/go/testdata/script/mod_outside.txt
index ed13e59..7a0dc9f 100644
--- a/src/cmd/go/testdata/script/mod_outside.txt
+++ b/src/cmd/go/testdata/script/mod_outside.txt
@@ -203,13 +203,6 @@
 ! go install ./needmod/needmod.go
 stderr 'needmod[/\\]needmod.go:10:2: no required module provides package example.com/version: go.mod file not found in current directory or any parent directory; see ''go help modules''$'
 
-# 'go install' for a package in GOROOT should succeed.
-# (It must be non-stale here so that the test does not write to GOROOT).
-go build -o $devnull cmd/addr2line  # make sure any necessary dependencies are present in GOCACHE
-! stale cmd/addr2line
-go install cmd/addr2line
-! stderr .
-
 # 'go run' should fail if a package argument must be resolved to a module.
 ! go run example.com/printversion
 stderr '^no required module provides package example.com/printversion: go.mod file not found in current directory or any parent directory; see ''go help modules''$'
diff --git a/src/cmd/go/testdata/script/mod_prefer_compatible.txt b/src/cmd/go/testdata/script/mod_prefer_compatible.txt
index 7ba5eb4..4d583ff 100644
--- a/src/cmd/go/testdata/script/mod_prefer_compatible.txt
+++ b/src/cmd/go/testdata/script/mod_prefer_compatible.txt
@@ -2,16 +2,17 @@
 # @latest, @upgrade, and @patch should prefer compatible versions over
 # +incompatible ones, even if offered by a proxy.
 
-[!net] skip
+[!net:github.com] skip
+[!net:proxy.golang.org] skip
 
 env GO111MODULE=on
 env GOPROXY=
 env GOSUMDB=
 
 # github.com/russross/blackfriday v2.0.0+incompatible exists,
-# and should be resolved if we ask for v2.0 explicitly.
+# and should be resolved if we ask for it explicitly.
 
-go list -m github.com/russross/blackfriday@v2.0
+go list -m github.com/russross/blackfriday@v2.0.0+incompatible
 stdout '^github.com/russross/blackfriday v2\.0\.0\+incompatible$'
 
 # blackfriday v1.5.2 has a go.mod file, so v1.5.2 should be preferred over
@@ -26,6 +27,7 @@
 ! go list -m github.com/russross/blackfriday@patch
 stderr '^go: github.com/russross/blackfriday@patch: can''t query version "patch" of module github.com/russross/blackfriday: no existing version is required$'
 
+
 # If we're fetching directly from version control, ignored +incompatible
 # versions should also be omitted by 'go list'.
 
@@ -37,10 +39,23 @@
 [!git] stop
 env GOPROXY=direct
 
-go list -versions -m github.com/russross/blackfriday github.com/russross/blackfriday
+go list -versions -m github.com/russross/blackfriday
 stdout '^github.com/russross/blackfriday v1\.5\.1 v1\.5\.2' # and possibly others
 ! stdout ' v2\.'
 
+# For this module, v2.1.0 exists and has a go.mod file.
+# 'go list -m github.com/russross/blackfriday@v2.0' will check
+# the latest v2.0 tag, discover that it isn't the right module, and stop there
+# (instead of spending the time to check O(N) previous tags).
+
+! go list -m github.com/russross/blackfriday@v2.0
+stderr '^go: module github.com/russross/blackfriday: no matching versions for query "v2\.0\"'
+
+# (But asking for exactly v2.0.0+incompatible should still succeed.)
+go list -m github.com/russross/blackfriday@v2.0.0+incompatible
+stdout '^github.com/russross/blackfriday v2\.0\.0\+incompatible$'
+
+
 # However, if the latest compatible version does not include a go.mod file,
 # +incompatible versions should still be listed, as they may still reflect the
 # intent of the module author.
diff --git a/src/cmd/go/testdata/script/mod_proxy_errors.txt b/src/cmd/go/testdata/script/mod_proxy_errors.txt
index 9cd1a82..99a4ef1 100644
--- a/src/cmd/go/testdata/script/mod_proxy_errors.txt
+++ b/src/cmd/go/testdata/script/mod_proxy_errors.txt
@@ -1,4 +1,4 @@
-[!net] skip
+[short] skip
 
 env GO111MODULE=on
 env GOSUMDB=off
diff --git a/src/cmd/go/testdata/script/mod_proxy_https.txt b/src/cmd/go/testdata/script/mod_proxy_https.txt
index a5e28dd..c87a0d9 100644
--- a/src/cmd/go/testdata/script/mod_proxy_https.txt
+++ b/src/cmd/go/testdata/script/mod_proxy_https.txt
@@ -5,7 +5,7 @@
 ! go list -versions -m golang.org/x/text
 stderr 'invalid proxy URL.*proxydir'
 
-[!net] stop
+[!net:proxy.golang.org] stop
 
 # GOPROXY HTTPS paths may elide the "https://" prefix.
 # (See golang.org/issue/32191.)
diff --git a/src/cmd/go/testdata/script/mod_pseudo_cache.txt b/src/cmd/go/testdata/script/mod_pseudo_cache.txt
index a7ceac4..bcaefa2 100644
--- a/src/cmd/go/testdata/script/mod_pseudo_cache.txt
+++ b/src/cmd/go/testdata/script/mod_pseudo_cache.txt
@@ -1,4 +1,4 @@
-[!net] skip
+[!net:golang.org] skip
 [!git] skip
 
 env GO111MODULE=on
diff --git a/src/cmd/go/testdata/script/mod_replace_gopkgin.txt b/src/cmd/go/testdata/script/mod_replace_gopkgin.txt
index 04b79dd..91008f9 100644
--- a/src/cmd/go/testdata/script/mod_replace_gopkgin.txt
+++ b/src/cmd/go/testdata/script/mod_replace_gopkgin.txt
@@ -7,8 +7,7 @@
 skip 'skipping test that depends on an unreliable third-party server; see https://go.dev/issue/54503'
 	# TODO(#54043): Make this test hermetic and re-enable it.
 
-[short] skip
-[!net] skip
+[!net:gopkg.in] skip
 [!git] skip
 
 env GO111MODULE=on
diff --git a/src/cmd/go/testdata/script/mod_replace_import.txt b/src/cmd/go/testdata/script/mod_replace_import.txt
index 7bf3a86..753071f 100644
--- a/src/cmd/go/testdata/script/mod_replace_import.txt
+++ b/src/cmd/go/testdata/script/mod_replace_import.txt
@@ -28,8 +28,8 @@
 # TODO(#26909): Ideally these errors should include line numbers for the imports within the main module.
 cd fail
 ! go mod tidy
-stderr '^localhost.fail imports\n\tw: module w@latest found \(v0.0.0-00010101000000-000000000000, replaced by ../w\), but does not contain package w$'
-stderr '^localhost.fail imports\n\tnonexist: nonexist@v0.1.0: replacement directory ../nonexist does not exist$'
+stderr '^go: localhost.fail imports\n\tw: module w@latest found \(v0.0.0-00010101000000-000000000000, replaced by ../w\), but does not contain package w$'
+stderr '^go: localhost.fail imports\n\tnonexist: nonexist@v0.1.0: replacement directory ../nonexist does not exist$'
 
 -- go.mod --
 module example.com/m
diff --git a/src/cmd/go/testdata/script/mod_retract_pseudo_base.txt b/src/cmd/go/testdata/script/mod_retract_pseudo_base.txt
index c52f0b8..87b440d 100644
--- a/src/cmd/go/testdata/script/mod_retract_pseudo_base.txt
+++ b/src/cmd/go/testdata/script/mod_retract_pseudo_base.txt
@@ -2,7 +2,7 @@
 # as the base.
 # Verifies golang.org/issue/41700.
 
-[!net] skip
+[short] skip
 [!git] skip
 env GOPROXY=direct
 env GOSUMDB=off
diff --git a/src/cmd/go/testdata/script/mod_run_pkg_version.txt b/src/cmd/go/testdata/script/mod_run_pkg_version.txt
index c3a218d..969852c 100644
--- a/src/cmd/go/testdata/script/mod_run_pkg_version.txt
+++ b/src/cmd/go/testdata/script/mod_run_pkg_version.txt
@@ -21,7 +21,8 @@
 cd m
 cp go.mod go.mod.orig
 ! go list -m all
-stderr '^go: example.com/cmd@v1.1.0-doesnotexist: missing go.sum entry; to add it:\n\tgo mod download example.com/cmd$'
+stderr '^go: example.com/cmd@v1.1.0-doesnotexist: reading http.*/mod/example\.com/cmd/@v/v1.1.0-doesnotexist.info: 404 Not Found\n\tserver response: 404 page not found$'
+stderr '^go: example.com/cmd@v1.1.0-doesnotexist: missing go.sum entry for go.mod file; to add it:\n\tgo mod download example.com/cmd$'
 go run example.com/cmd/a@v1.0.0
 stdout '^a@v1.0.0$'
 cmp go.mod go.mod.orig
diff --git a/src/cmd/go/testdata/script/mod_skip_write.txt b/src/cmd/go/testdata/script/mod_skip_write.txt
index 9fdb6fc..db47b9c 100644
--- a/src/cmd/go/testdata/script/mod_skip_write.txt
+++ b/src/cmd/go/testdata/script/mod_skip_write.txt
@@ -79,6 +79,7 @@
 
 import _ "rsc.io/quote"
 -- graph.want --
+m go@1.18
 m golang.org/x/text@v0.0.0-20170915032832-14c0d48ead0c
 m rsc.io/quote@v1.5.2
 m rsc.io/sampler@v1.3.0
diff --git a/src/cmd/go/testdata/script/mod_std_vendor.txt b/src/cmd/go/testdata/script/mod_std_vendor.txt
index 7e4c210..ed47542 100644
--- a/src/cmd/go/testdata/script/mod_std_vendor.txt
+++ b/src/cmd/go/testdata/script/mod_std_vendor.txt
@@ -22,9 +22,7 @@
 ! go build -mod=readonly
 stderr 'disabled by -mod=readonly'
 ! go build -mod=vendor
-stderr 'go: finding module for package golang.org/x/net/http2/hpack'
-stderr 'http.go:5:2: cannot query module due to -mod=vendor'
-
+stderr 'http.go:5:2: cannot find module providing package golang.org/x/net/http2/hpack: import lookup disabled by -mod=vendor'
 
 # ...even if they explicitly use the "cmd/vendor/" or "vendor/" prefix.
 cd ../importcmd
diff --git a/src/cmd/go/testdata/script/mod_sum_issue56222.txt b/src/cmd/go/testdata/script/mod_sum_issue56222.txt
new file mode 100644
index 0000000..12848c9
--- /dev/null
+++ b/src/cmd/go/testdata/script/mod_sum_issue56222.txt
@@ -0,0 +1,91 @@
+# Regression test for #56222: 'go get -t' and 'go mod tidy'
+# should save enough checksums to run 'go test' on the named
+# packages or any package in "all" respectively.
+
+# 'go mod tidy' in a module at go 1.21 or higher should preserve
+# checksums needed to run 'go test all'.
+cd m1
+go mod tidy
+
+go list -f '{{if eq .ImportPath "example.com/generics"}}{{.Module.GoVersion}}{{end}}' -deps -test example.com/m2/q
+stdout 1.18
+[!short] go test -o $devnull -c all
+
+cat go.sum
+replace 'example.com/generics v1.0.0/go.mod' 'example.com/notgenerics v1.0.0/go.mod' go.sum
+
+! go list -f '{{if eq .ImportPath "example.com/generics"}}{{.Module.GoVersion}}{{end}}' -deps -test example.com/m2/q
+stderr '^go: can''t load test package: \.\.'${/}m2${/}q${/}'q_test.go:3:8: example\.com/generics@v1\.0\.0: missing go.sum entry for go.mod file; to add it:\n\tgo mod download example\.com/generics$'
+
+go mod download -json example.com/generics
+stdout '"GoModSum":'
+go list -f '{{if eq .ImportPath "example.com/generics"}}{{.Module.GoVersion}}{{end}}' -deps -test example.com/m2/q
+stdout 1.18
+
+
+# At go 1.20 or earlier, 'go mod tidy' should preserve the historical go.sum
+# contents, but 'go test' should flag the missing checksums (instead of trying
+# to build the test dependency with the wrong language version).
+
+go mod tidy -go=1.20
+! go test -o $devnull -c all
+stderr '^# example.com/m2/q\n'..${/}m2${/}q${/}'q_test.go:3:8: example.com/generics@v1.0.0: missing go.sum entry for go.mod file; to add it:\n\tgo mod download example.com/generics$'
+
+go mod download -json example.com/generics
+go list -f '{{if eq .ImportPath "example.com/generics"}}{{.Module.GoVersion}}{{end}}' -deps -test example.com/m2/q
+stdout 1.18
+
+
+# Even at go 1.20 or earlier, 'go mod tidy' shouldn't need go.mod files or
+# checksums that it won't record.
+
+go mod tidy -go=1.20
+go clean -modcache  # Remove checksums from the module cache, so that only go.sum is used.
+
+# Issue 60667: 'go list' without -mod=mod shouldn't report the checksums as
+# dirty either.
+go list -m -u all
+
+env OLDSUMDB=$GOSUMDB
+env GOSUMDB=bad
+go mod tidy
+
+env GOSUMDB=$OLDSUMDB
+
+
+# Regardless of the go version in go.mod, 'go get -t' should fetch
+# enough checksums to run 'go test' on the named package.
+
+rm p
+go mod tidy -go=1.20
+go list -m all
+! stdout example.com/generics
+go get -t example.com/m2/q@v1.0.0
+go list -f '{{if eq .ImportPath "example.com/generics"}}{{.Module.GoVersion}}{{end}}' -deps -test example.com/m2/q
+stdout 1.18
+[!short] go test -o $devnull -c example.com/m2/q
+
+
+-- m1/go.mod --
+module example.com/m1
+
+go 1.21
+
+require example.com/m2 v1.0.0
+replace example.com/m2 => ../m2
+-- m1/p/p.go --
+package p
+
+import _ "example.com/m2/q"
+-- m2/go.mod --
+module example.com/m2
+
+go 1.19
+
+require example.com/generics v1.0.0
+-- m2/q/q.go --
+package q
+-- m2/q/q_test.go --
+package q
+
+import _ "example.com/generics"
diff --git a/src/cmd/go/testdata/script/mod_sum_readonly.txt b/src/cmd/go/testdata/script/mod_sum_readonly.txt
index 57c5bbe..c426073 100644
--- a/src/cmd/go/testdata/script/mod_sum_readonly.txt
+++ b/src/cmd/go/testdata/script/mod_sum_readonly.txt
@@ -4,7 +4,7 @@
 # When a sum is needed to load the build list, we get an error for the
 # specific module. The .mod file is not downloaded, and go.sum is not written.
 ! go list -m all
-stderr '^go: rsc.io/quote@v1.5.2: missing go.sum entry; to add it:\n\tgo mod download rsc.io/quote$'
+stderr '^go: rsc.io/quote@v1.5.2: missing go.sum entry for go.mod file; to add it:\n\tgo mod download rsc.io/quote$'
 ! exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.2.mod
 ! exists go.sum
 
@@ -12,7 +12,7 @@
 # we should see the same error.
 cp go.sum.h2only go.sum
 ! go list -m all
-stderr '^go: rsc.io/quote@v1.5.2: missing go.sum entry; to add it:\n\tgo mod download rsc.io/quote$'
+stderr '^go: rsc.io/quote@v1.5.2: missing go.sum entry for go.mod file; to add it:\n\tgo mod download rsc.io/quote$'
 ! exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.2.mod
 cmp go.sum go.sum.h2only
 rm go.sum
@@ -21,7 +21,7 @@
 cp go.mod go.mod.orig
 go mod edit -replace rsc.io/quote@v1.5.2=rsc.io/quote@v1.5.1
 ! go list -m all
-stderr '^go: rsc.io/quote@v1.5.2 \(replaced by rsc.io/quote@v1.5.1\): missing go.sum entry; to add it:\n\tgo mod download rsc.io/quote$'
+stderr '^go: rsc.io/quote@v1.5.2 \(replaced by rsc.io/quote@v1.5.1\): missing go.sum entry for go.mod file; to add it:\n\tgo mod download rsc.io/quote$'
 ! exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.1.mod
 ! exists go.sum
 cp go.mod.orig go.mod
diff --git a/src/cmd/go/testdata/script/mod_sumdb_file_path.txt b/src/cmd/go/testdata/script/mod_sumdb_file_path.txt
index d89ad1a..2f42cb5 100644
--- a/src/cmd/go/testdata/script/mod_sumdb_file_path.txt
+++ b/src/cmd/go/testdata/script/mod_sumdb_file_path.txt
@@ -1,7 +1,9 @@
-[!net] skip
+[!net:proxy.golang.org] skip
+[!net:sum.golang.org] skip
 
 env GO111MODULE=on
-env GOSUMDB=
+[go-builder] env GOSUMDB=
+[!go-builder] env GOSUMDB=sum.golang.org  # Set explicitly in case GOROOT/go.env is modified.
 env GOPATH=$WORK/gopath1
 
 # With a file-based proxy with an empty checksum directory,
diff --git a/src/cmd/go/testdata/script/mod_sumdb_golang.txt b/src/cmd/go/testdata/script/mod_sumdb_golang.txt
index 7dd6cdc..067e2e3 100644
--- a/src/cmd/go/testdata/script/mod_sumdb_golang.txt
+++ b/src/cmd/go/testdata/script/mod_sumdb_golang.txt
@@ -1,17 +1,18 @@
 # Test default GOPROXY and GOSUMDB
-env GOPROXY=
-env GOSUMDB=
-go env GOPROXY
-stdout '^https://proxy.golang.org,direct$'
-go env GOSUMDB
-stdout '^sum.golang.org$'
-env GOPROXY=https://proxy.golang.org
-go env GOSUMDB
-stdout '^sum.golang.org$'
+[go-builder] env GOPROXY=
+[go-builder] env GOSUMDB=
+[go-builder] go env GOPROXY
+[go-builder] stdout '^https://proxy.golang.org,direct$'
+[go-builder] go env GOSUMDB
+[go-builder] stdout '^sum.golang.org$'
+[go-builder] env GOPROXY=https://proxy.golang.org
+[go-builder] go env GOSUMDB
+[go-builder] stdout '^sum.golang.org$'
 
 # Download direct from github.
 
-[!net] skip
+[!net:proxy.golang.org] skip
+[!net:sum.golang.org] skip
 [!git] skip
 env GOSUMDB=sum.golang.org
 env GOPROXY=direct
@@ -25,8 +26,8 @@
 # files not listed in go.sum.
 
 go clean -modcache
-env GOSUMDB=
-env GOPROXY=
+env GOSUMDB=sum.golang.org
+env GOPROXY=https://proxy.golang.org,direct
 
 go list -x -m all  # Download go.mod files.
 ! stderr github
diff --git a/src/cmd/go/testdata/script/mod_tidy_compat.txt b/src/cmd/go/testdata/script/mod_tidy_compat.txt
index 18b297d..724c83e 100644
--- a/src/cmd/go/testdata/script/mod_tidy_compat.txt
+++ b/src/cmd/go/testdata/script/mod_tidy_compat.txt
@@ -50,7 +50,7 @@
 
 go mod edit -go=1.16
 ! go list -m all
-stderr '^go: example.net/lazy@v0.1.0 requires\n\texample.com/version@v1.0.1: missing go.sum entry; to add it:\n\tgo mod download example.com/version$'
+stderr '^go: example.net/lazy@v0.1.0 requires\n\texample.com/version@v1.0.1: missing go.sum entry for go.mod file; to add it:\n\tgo mod download example.com/version$'
 
 
 -- go.mod --
diff --git a/src/cmd/go/testdata/script/mod_tidy_compat_added.txt b/src/cmd/go/testdata/script/mod_tidy_compat_added.txt
index 94fa79b..b3f75ad 100644
--- a/src/cmd/go/testdata/script/mod_tidy_compat_added.txt
+++ b/src/cmd/go/testdata/script/mod_tidy_compat_added.txt
@@ -17,21 +17,21 @@
 
 ! go mod tidy
 
-stderr '^example\.com/m imports\n\texample\.net/added: module example\.net/added@latest found \(v0\.3\.0, replaced by \./a1\), but does not contain package example\.net/added$'
+stderr '^go: example\.com/m imports\n\texample\.net/added: module example\.net/added@latest found \(v0\.3\.0, replaced by \./a1\), but does not contain package example\.net/added$'
 
 cmp go.mod go.mod.orig
 
 
 # When we run 'go mod tidy -e', we should proceed past the first error and follow
-# it with a second error describing the version descrepancy.
+# it with a second error describing the version discrepancy.
 #
-# We should not provide advice on how to push past the version descrepancy,
+# We should not provide advice on how to push past the version discrepancy,
 # because the '-e' flag should already do that, writing out an otherwise-tidied
 # go.mod file.
 
 go mod tidy -e
 
-stderr '^example\.com/m imports\n\texample\.net/added: module example\.net/added@latest found \(v0\.3\.0, replaced by \./a1\), but does not contain package example\.net/added\nexample\.net/added failed to load from any module,\n\tbut go 1\.16 would load it from example\.net/added@v0\.2\.0$'
+stderr '^go: example\.com/m imports\n\texample\.net/added: module example\.net/added@latest found \(v0\.3\.0, replaced by \./a1\), but does not contain package example\.net/added\ngo: example\.net/added failed to load from any module,\n\tbut go 1\.16 would load it from example\.net/added@v0\.2\.0$'
 
 ! stderr '\n\tgo mod tidy'
 
diff --git a/src/cmd/go/testdata/script/mod_tidy_compat_ambiguous.txt b/src/cmd/go/testdata/script/mod_tidy_compat_ambiguous.txt
index a45de5a..5316220 100644
--- a/src/cmd/go/testdata/script/mod_tidy_compat_ambiguous.txt
+++ b/src/cmd/go/testdata/script/mod_tidy_compat_ambiguous.txt
@@ -21,7 +21,7 @@
 
 ! go mod tidy
 
-stderr '^example\.com/m imports\n\texample\.net/indirect imports\n\texample\.net/ambiguous/nested/pkg loaded from example\.net/ambiguous/nested@v0\.1\.0,\n\tbut go 1.16 would fail to locate it:\n\tambiguous import: found package example\.net/ambiguous/nested/pkg in multiple modules:\n\texample\.net/ambiguous v0.1.0 \(.*\)\n\texample\.net/ambiguous/nested v0.1.0 \(.*\)\n\n'
+stderr '^go: example\.com/m imports\n\texample\.net/indirect imports\n\texample\.net/ambiguous/nested/pkg loaded from example\.net/ambiguous/nested@v0\.1\.0,\n\tbut go 1.16 would fail to locate it:\n\tambiguous import: found package example\.net/ambiguous/nested/pkg in multiple modules:\n\texample\.net/ambiguous v0.1.0 \(.*\)\n\texample\.net/ambiguous/nested v0.1.0 \(.*\)\n\n'
 
 stderr '\n\nTo proceed despite packages unresolved in go 1\.16:\n\tgo mod tidy -e\nIf reproducibility with go 1.16 is not needed:\n\tgo mod tidy -compat=1\.17\nFor other options, see:\n\thttps://golang\.org/doc/modules/pruning\n'
 
@@ -62,7 +62,7 @@
 
 go mod edit -go=1.16
 ! go list -m all
-stderr '^go: example\.net/indirect@v0\.1\.0 requires\n\texample\.net/ambiguous@v0\.1\.0: missing go\.sum entry; to add it:\n\tgo mod download example\.net/ambiguous\n'
+stderr '^go: example\.net/indirect@v0\.1\.0 requires\n\texample\.net/ambiguous@v0\.1\.0: missing go\.sum entry for go\.mod file; to add it:\n\tgo mod download example\.net/ambiguous\n'
 
 
 -- go.mod --
diff --git a/src/cmd/go/testdata/script/mod_tidy_compat_deleted.txt b/src/cmd/go/testdata/script/mod_tidy_compat_deleted.txt
index dcf13e2..b148fc1 100644
--- a/src/cmd/go/testdata/script/mod_tidy_compat_deleted.txt
+++ b/src/cmd/go/testdata/script/mod_tidy_compat_deleted.txt
@@ -17,7 +17,7 @@
 
 ! go mod tidy
 
-stderr '^example\.com/m imports\n\texample\.net/deleted loaded from example\.net/deleted@v0\.1\.0,\n\tbut go 1\.16 would fail to locate it in example\.net/deleted@v0\.2\.0\n\n'
+stderr '^go: example\.com/m imports\n\texample\.net/deleted loaded from example\.net/deleted@v0\.1\.0,\n\tbut go 1\.16 would fail to locate it in example\.net/deleted@v0\.2\.0\n\n'
 
 stderr '\n\nTo upgrade to the versions selected by go 1.16, leaving some packages unresolved:\n\tgo mod tidy -e -go=1\.16 && go mod tidy -e -go=1\.17\nIf reproducibility with go 1.16 is not needed:\n\tgo mod tidy -compat=1\.17\nFor other options, see:\n\thttps://golang\.org/doc/modules/pruning\n'
 
@@ -40,7 +40,7 @@
 stderr '^go: updates to go\.mod needed; to update it:\n\tgo mod tidy$'
 
 ! go mod tidy
-stderr '^example\.com/m imports\n\texample\.net/deleted: module example\.net/deleted@latest found \(v0\.2\.0, replaced by \./d2\), but does not contain package example\.net/deleted$'
+stderr '^go: example\.com/m imports\n\texample\.net/deleted: module example\.net/deleted@latest found \(v0\.2\.0, replaced by \./d2\), but does not contain package example\.net/deleted$'
 
 
 -- go.mod --
diff --git a/src/cmd/go/testdata/script/mod_tidy_compat_implicit.txt b/src/cmd/go/testdata/script/mod_tidy_compat_implicit.txt
index 186a3f8..26e4749 100644
--- a/src/cmd/go/testdata/script/mod_tidy_compat_implicit.txt
+++ b/src/cmd/go/testdata/script/mod_tidy_compat_implicit.txt
@@ -32,7 +32,7 @@
 
 cp go.mod go.mod.orig
 ! go mod tidy
-stderr '^example\.com/m imports\n\texample\.net/lazy tested by\n\texample\.net/lazy.test imports\n\texample\.com/retract/incompatible loaded from example\.com/retract/incompatible@v1\.0\.0,\n\tbut go 1\.16 would select v2\.0\.0\+incompatible\n\n'
+stderr '^go: example\.com/m imports\n\texample\.net/lazy tested by\n\texample\.net/lazy.test imports\n\texample\.com/retract/incompatible loaded from example\.com/retract/incompatible@v1\.0\.0,\n\tbut go 1\.16 would select v2\.0\.0\+incompatible\n\n'
 stderr '\n\nTo upgrade to the versions selected by go 1\.16:\n\tgo mod tidy -go=1\.16 && go mod tidy -go=1\.17\nIf reproducibility with go 1.16 is not needed:\n\tgo mod tidy -compat=1.17\nFor other options, see:\n\thttps://golang\.org/doc/modules/pruning\n'
 
 cmp go.mod go.mod.orig
@@ -45,14 +45,13 @@
 ! stderr .
 cmp go.mod go.mod.orig
 
-go list -deps -test -f $MODFMT all
-stdout '^example\.com/retract/incompatible v1\.0\.0$'
+go list -deps -test -f $MODFMT ./...
+stdout '^example.net/lazy v0.1.0$'
 
 go mod edit -go=1.16
-! go list -deps -test -f $MODFMT all
+! go list -deps -test -f $MODFMT ./...
 
-	# TODO(#46160): -count=1 instead of -count=2.
-stderr -count=2 '^go: example\.net/lazy@v0\.1\.0 requires\n\texample\.com/retract/incompatible@v1\.0\.0: missing go\.sum entry; to add it:\n\tgo mod download example\.com/retract/incompatible$'
+stderr -count=1 '^go: example\.net/lazy@v0\.1\.0 requires\n\texample\.com/retract/incompatible@v1\.0\.0: missing go\.sum entry for go\.mod file; to add it:\n\tgo mod download example\.com/retract/incompatible$'
 
 
 # If we combine a Go 1.16 go.sum file...
@@ -63,7 +62,7 @@
 
 # ...then Go 1.17 no longer works. 😞
 ! go list -deps -test -f $MODFMT all
-stderr -count=1 '^can''t load test package: lazy[/\\]lazy_test.go:3:8: missing go\.sum entry for module providing package example\.com/retract/incompatible \(imported by example\.net/lazy\); to add:\n\tgo get -t example.net/lazy@v0\.1\.0$'
+stderr -count=1 '^go: can''t load test package: lazy[/\\]lazy_test.go:3:8: missing go\.sum entry for module providing package example\.com/retract/incompatible \(imported by example\.net/lazy\); to add:\n\tgo get -t example.net/lazy@v0\.1\.0$'
 
 
 # However, if we take the union of the go.sum files...
diff --git a/src/cmd/go/testdata/script/mod_tidy_compat_incompatible.txt b/src/cmd/go/testdata/script/mod_tidy_compat_incompatible.txt
index 11313f1..9e2a9ee 100644
--- a/src/cmd/go/testdata/script/mod_tidy_compat_incompatible.txt
+++ b/src/cmd/go/testdata/script/mod_tidy_compat_incompatible.txt
@@ -32,7 +32,7 @@
 
 cp go.mod go.mod.orig
 ! go mod tidy
-stderr '^example\.com/m imports\n\texample\.net/lazy imports\n\texample\.com/retract/incompatible loaded from example\.com/retract/incompatible@v1\.0\.0,\n\tbut go 1\.16 would select v2\.0\.0\+incompatible\n\n'
+stderr '^go: example\.com/m imports\n\texample\.net/lazy imports\n\texample\.com/retract/incompatible loaded from example\.com/retract/incompatible@v1\.0\.0,\n\tbut go 1\.16 would select v2\.0\.0\+incompatible\n\n'
 stderr '\n\nTo upgrade to the versions selected by go 1\.16:\n\tgo mod tidy -go=1\.16 && go mod tidy -go=1\.17\nIf reproducibility with go 1\.16 is not needed:\n\tgo mod tidy -compat=1.17\nFor other options, see:\n\thttps://golang\.org/doc/modules/pruning\n'
 
 cmp go.mod go.mod.orig
@@ -48,8 +48,7 @@
 
 go mod edit -go=1.16
 ! go list -f $MODFMT -deps ./...
-	# TODO(#46160): -count=1 instead of -count=2.
-stderr -count=2 '^go: example\.net/lazy@v0\.1\.0 requires\n\texample\.net/requireincompatible@v0\.1\.0 requires\n\texample\.com/retract/incompatible@v2\.0\.0\+incompatible: missing go.sum entry; to add it:\n\tgo mod download example.com/retract/incompatible$'
+stderr -count=1 '^go: example\.net/lazy@v0\.1\.0 requires\n\texample\.net/requireincompatible@v0\.1\.0 requires\n\texample\.com/retract/incompatible@v2\.0\.0\+incompatible: missing go.sum entry for go.mod file; to add it:\n\tgo mod download example.com/retract/incompatible$'
 
 
 # There are two ways for the module author to bring the two into alignment.
diff --git a/src/cmd/go/testdata/script/mod_tidy_compat_irrelevant.txt b/src/cmd/go/testdata/script/mod_tidy_compat_irrelevant.txt
index 7c22fca..e4eaea0 100644
--- a/src/cmd/go/testdata/script/mod_tidy_compat_irrelevant.txt
+++ b/src/cmd/go/testdata/script/mod_tidy_compat_irrelevant.txt
@@ -47,8 +47,7 @@
 
 go mod edit -go=1.16
 ! go list -deps -test -f $MODFMT all
-	# TODO(#46160): -count=1 instead of -count=2.
-stderr -count=2 '^go: example.net/lazy@v0.1.0 requires\n\texample.com/retract/incompatible@v1.0.0: missing go.sum entry; to add it:\n\tgo mod download example.com/retract/incompatible$'
+stderr -count=1 '^go: example.net/lazy@v0.1.0 requires\n\texample.com/retract/incompatible@v1.0.0: missing go.sum entry for go.mod file; to add it:\n\tgo mod download example.com/retract/incompatible$'
 
 
 -- go.mod --
diff --git a/src/cmd/go/testdata/script/mod_tidy_convergence.txt b/src/cmd/go/testdata/script/mod_tidy_convergence.txt
index be0a8e9..45f74b4 100644
--- a/src/cmd/go/testdata/script/mod_tidy_convergence.txt
+++ b/src/cmd/go/testdata/script/mod_tidy_convergence.txt
@@ -44,7 +44,7 @@
 stderr '^go: finding module for package example\.net/x$'
 
 	# TODO: This error message should be clearer — it doesn't indicate why v0.2.0-pre is required.
-stderr '^example\.net/m imports\n\texample\.net/x: package example\.net/x provided by example\.net/x at latest version v0\.1\.0 but not at required version v0\.2\.0-pre$'
+stderr '^go: example\.net/m imports\n\texample\.net/x: package example\.net/x provided by example\.net/x at latest version v0\.1\.0 but not at required version v0\.2\.0-pre$'
 
 
 # 'go mod tidy -e' should follow upgrades to try to resolve the modules that it
@@ -65,7 +65,7 @@
 stderr '^go: found example\.net/y in example\.net/y v0.2.0$'
 
 	# TODO: This error message should be clearer — it doesn't indicate why v0.2.0-pre is required.
-stderr '^example\.net/m imports\n\texample\.net/x: package example\.net/x provided by example\.net/x at latest version v0\.1\.0 but not at required version v0\.2\.0-pre$'
+stderr '^go: example\.net/m imports\n\texample\.net/x: package example\.net/x provided by example\.net/x at latest version v0\.1\.0 but not at required version v0\.2\.0-pre$'
 
 
 # Since we attempt to resolve the dependencies of package x whenever we add x itself,
@@ -94,7 +94,7 @@
 go mod tidy -e
 cmp go.mod go.mod.tidye
 stderr '^go: found example\.net/y in example\.net/y v0.2.0$'
-stderr '^example\.net/m imports\n\texample\.net/x: package example\.net/x provided by example\.net/x at latest version v0\.1\.0 but not at required version v0\.2\.0-pre$'
+stderr '^go: example\.net/m imports\n\texample\.net/x: package example\.net/x provided by example\.net/x at latest version v0\.1\.0 but not at required version v0\.2\.0-pre$'
 
 go get example.net/x@v0.1.0 example.net/y@v0.1.0
 go mod tidy
diff --git a/src/cmd/go/testdata/script/mod_tidy_convergence_loop.txt b/src/cmd/go/testdata/script/mod_tidy_convergence_loop.txt
index 99599e5..ec58159 100644
--- a/src/cmd/go/testdata/script/mod_tidy_convergence_loop.txt
+++ b/src/cmd/go/testdata/script/mod_tidy_convergence_loop.txt
@@ -51,9 +51,9 @@
 stderr '^go: found example\.net/x in example\.net/x v0.1.0$'
 
 	# TODO: These error messages should be clearer — it doesn't indicate why v0.2.0-pre is required.
-stderr '^example\.net/m imports\n\texample\.net/w: package example\.net/w provided by example\.net/w at latest version v0\.1\.0 but not at required version v0\.2\.0-pre$'
-stderr '^example\.net/m imports\n\texample\.net/y: package example\.net/y provided by example\.net/y at latest version v0\.1\.0 but not at required version v0\.2\.0-pre$'
-stderr '^example\.net/m imports\n\texample\.net/z: package example\.net/z provided by example\.net/z at latest version v0\.1\.0 but not at required version v0\.2\.0-pre$'
+stderr '^go: example\.net/m imports\n\texample\.net/w: package example\.net/w provided by example\.net/w at latest version v0\.1\.0 but not at required version v0\.2\.0-pre$'
+stderr '^go: example\.net/m imports\n\texample\.net/y: package example\.net/y provided by example\.net/y at latest version v0\.1\.0 but not at required version v0\.2\.0-pre$'
+stderr '^go: example\.net/m imports\n\texample\.net/z: package example\.net/z provided by example\.net/z at latest version v0\.1\.0 but not at required version v0\.2\.0-pre$'
 
 
 # 'go mod tidy -e' should preserve all of the upgrades to modules that could
@@ -74,9 +74,9 @@
 stderr -count=2 '^go: finding module for package example\.net/z$'
 stderr '^go: found example\.net/x in example\.net/x v0.1.0$'
 
-stderr '^example\.net/m imports\n\texample\.net/w: package example\.net/w provided by example\.net/w at latest version v0\.1\.0 but not at required version v0\.2\.0-pre$'
-stderr '^example\.net/m imports\n\texample\.net/y: package example\.net/y provided by example\.net/y at latest version v0\.1\.0 but not at required version v0\.2\.0-pre$'
-stderr '^example\.net/m imports\n\texample\.net/z: package example\.net/z provided by example\.net/z at latest version v0\.1\.0 but not at required version v0\.2\.0-pre$'
+stderr '^go: example\.net/m imports\n\texample\.net/w: package example\.net/w provided by example\.net/w at latest version v0\.1\.0 but not at required version v0\.2\.0-pre$'
+stderr '^go: example\.net/m imports\n\texample\.net/y: package example\.net/y provided by example\.net/y at latest version v0\.1\.0 but not at required version v0\.2\.0-pre$'
+stderr '^go: example\.net/m imports\n\texample\.net/z: package example\.net/z provided by example\.net/z at latest version v0\.1\.0 but not at required version v0\.2\.0-pre$'
 
 
 go mod tidy -e
diff --git a/src/cmd/go/testdata/script/mod_tidy_error.txt b/src/cmd/go/testdata/script/mod_tidy_error.txt
index 51fc65f..fc6cd78 100644
--- a/src/cmd/go/testdata/script/mod_tidy_error.txt
+++ b/src/cmd/go/testdata/script/mod_tidy_error.txt
@@ -4,14 +4,14 @@
 # 'go mod tidy' and 'go mod vendor' should not hide loading errors.
 
 ! go mod tidy
-! stderr 'package nonexist is not in GOROOT'
-stderr '^issue27063 imports\n\tnonexist.example.com: cannot find module providing package nonexist.example.com'
-stderr '^issue27063 imports\n\tissue27063/other imports\n\tother.example.com/nonexist: cannot find module providing package other.example.com/nonexist'
+! stderr 'package nonexist is not in std'
+stderr '^go: issue27063 imports\n\tnonexist.example.com: cannot find module providing package nonexist.example.com'
+stderr '^go: issue27063 imports\n\tissue27063/other imports\n\tother.example.com/nonexist: cannot find module providing package other.example.com/nonexist'
 
 ! go mod vendor
-! stderr 'package nonexist is not in GOROOT'
-stderr '^issue27063 imports\n\tnonexist.example.com: no required module provides package nonexist.example.com; to add it:\n\tgo get nonexist.example.com$'
-stderr '^issue27063 imports\n\tissue27063/other imports\n\tother.example.com/nonexist: no required module provides package other.example.com/nonexist; to add it:\n\tgo get other.example.com/nonexist$'
+! stderr 'package nonexist is not in std'
+stderr '^go: issue27063 imports\n\tnonexist.example.com: no required module provides package nonexist.example.com; to add it:\n\tgo get nonexist.example.com$'
+stderr '^go: issue27063 imports\n\tissue27063/other imports\n\tother.example.com/nonexist: no required module provides package other.example.com/nonexist; to add it:\n\tgo get other.example.com/nonexist$'
 
 -- go.mod --
 module issue27063
diff --git a/src/cmd/go/testdata/script/mod_tidy_issue60313.txt b/src/cmd/go/testdata/script/mod_tidy_issue60313.txt
new file mode 100644
index 0000000..6963994
--- /dev/null
+++ b/src/cmd/go/testdata/script/mod_tidy_issue60313.txt
@@ -0,0 +1,69 @@
+# Regression test for https://go.dev/issue/60313: 'go mod tidy' did not preserve
+# dependencies needed to prevent 'ambiguous import' errors in external test
+# dependencies.
+
+cp go.mod go.mod.orig
+go mod tidy
+cmp go.mod go.mod.orig
+
+-- go.mod --
+module example
+
+go 1.21
+
+require (
+	example.net/a v0.1.0
+	example.net/b v0.1.0
+)
+
+require example.net/outer/inner v0.1.0 // indirect
+
+replace (
+	example.net/a v0.1.0 => ./a
+	example.net/b v0.1.0 => ./b
+	example.net/outer v0.1.0 => ./outer
+	example.net/outer/inner v0.1.0 => ./inner
+)
+-- example.go --
+package example
+
+import (
+	_ "example.net/a"
+	_ "example.net/b"
+)
+-- a/go.mod --
+module example.net/a
+
+go 1.21
+
+require example.net/outer/inner v0.1.0
+-- a/a.go --
+package a
+-- a/a_test.go --
+package a_test
+
+import _ "example.net/outer/inner"
+-- b/go.mod --
+module example.net/b
+
+go 1.21
+
+require example.net/outer v0.1.0
+-- b/b.go --
+package b
+-- b/b_test.go --
+package b_test
+
+import _ "example.net/outer/inner"
+-- inner/go.mod --
+module example.net/outer/inner
+
+go 1.21
+-- inner/inner.go --
+package inner
+-- outer/go.mod --
+module example.net/outer
+
+go 1.21
+-- outer/inner/inner.go --
+package inner
diff --git a/src/cmd/go/testdata/script/mod_tidy_replace_old.txt b/src/cmd/go/testdata/script/mod_tidy_replace_old.txt
index cfd3792..18605b1 100644
--- a/src/cmd/go/testdata/script/mod_tidy_replace_old.txt
+++ b/src/cmd/go/testdata/script/mod_tidy_replace_old.txt
@@ -9,7 +9,7 @@
 
 ! go mod tidy
 ! stderr panic
-stderr '^golang\.org/issue46659 imports\n\texample\.com/missingpkg/deprecated: package example\.com/missingpkg/deprecated provided by example\.com/missingpkg at latest version v1\.0\.0 but not at required version v1\.0\.1-beta$'
+stderr '^go: golang\.org/issue46659 imports\n\texample\.com/missingpkg/deprecated: package example\.com/missingpkg/deprecated provided by example\.com/missingpkg at latest version v1\.0\.0 but not at required version v1\.0\.1-beta$'
 
 go mod tidy -e
 
diff --git a/src/cmd/go/testdata/script/mod_tidy_too_new.txt b/src/cmd/go/testdata/script/mod_tidy_too_new.txt
deleted file mode 100644
index 8c34a99..0000000
--- a/src/cmd/go/testdata/script/mod_tidy_too_new.txt
+++ /dev/null
@@ -1,57 +0,0 @@
-# https://golang.org/issue/46142: 'go mod tidy' should error out if the version
-# in the go.mod file is newer than the most recent supported version.
-
-cp go.mod go.mod.orig
-
-
-# If the go.mod file specifies an unsupported Go version, 'go mod tidy' should
-# refuse to edit it: we don't know what a tidy go.mod file for that version
-# would look like.
-
-! go mod tidy
-stderr 'go: go.mod file indicates go 2000.0, but maximum version supported by tidy is '$goversion'$'
-cmp go.mod go.mod.orig
-
-
-# The -e flag should push past the error and edit the file anyway,
-# but preserve the too-high version.
-
-cp go.mod.orig go.mod
-go mod tidy -e
-stderr 'go: go.mod file indicates go 2000.0, but maximum version supported by tidy is '$goversion'$'
-cmp go.mod go.mod.tidy
-
-
-# Explicitly switching to a supported version should suppress the error completely.
-
-cp go.mod.orig go.mod
-go mod tidy -go=1.17
-! stderr 'maximum supported version'
-go mod edit -go=1.17 go.mod.tidy
-cmp go.mod go.mod.tidy
-
-
--- go.mod --
-module example.net/from/the/future
-
-go 2000.0
-
-replace example.net/m v0.0.0 => ./m
--- go.mod.tidy --
-module example.net/from/the/future
-
-go 2000.0
-
-replace example.net/m v0.0.0 => ./m
-
-require example.net/m v0.0.0
--- x.go --
-package x
-
-import "example.net/m"
--- m/go.mod --
-module example.net/m
-
-go 1.17
--- m/m.go --
-package m
diff --git a/src/cmd/go/testdata/script/mod_tidy_version.txt b/src/cmd/go/testdata/script/mod_tidy_version.txt
index 3bc97bc..e3f2561 100644
--- a/src/cmd/go/testdata/script/mod_tidy_version.txt
+++ b/src/cmd/go/testdata/script/mod_tidy_version.txt
@@ -29,9 +29,12 @@
 # In go 1.17, the main module must explicitly require b
 # (because it is transitively imported by the main module).
 
-
 cp go.mod go.mod.orig
 
+	# Pretend we're a release version so that we can theoretically
+	# write our version in toolchain lines.
+env goversion=1.99.0
+env TESTGO_VERSION=go${goversion}
 
 # An invalid argument should be rejected.
 
@@ -87,6 +90,48 @@
 go mod tidy -go=''
 cmpenv go.mod go.mod.latest
 
+# Repeat with go get go@ instead of mod tidy.
+
+# Go 1.16 -> 1.17 should be a no-op.
+cp go.mod.116 go.mod
+go get go@1.16
+cmp go.mod go.mod.116
+
+# Go 1.17 -> 1.16 should leave b (go get is not tidy).
+cp go.mod.117 go.mod
+go get go@1.16
+cmp go.mod go.mod.116from117
+
+# Go 1.15 -> 1.16 should leave d (go get is not tidy).
+cp go.mod.115 go.mod
+go get go@1.16
+cmp go.mod go.mod.116from115
+
+# Go 1.16 -> 1.17 should add b.
+cp go.mod.116 go.mod
+go get go@1.17
+stderr '^\tnote: expanded dependencies to upgrade to go 1.17 or higher; run ''go mod tidy'' to clean up'
+cmp go.mod go.mod.117
+
+# Go 1.16 -> 1.15 should add d,
+# but 'go get' doesn't load enough packages to know that.
+# (This leaves the module untidy, but the user can fix it by running 'go mod tidy'.)
+cp go.mod.116 go.mod
+go get go@1.15 toolchain@none
+cmp go.mod go.mod.115from116
+go mod tidy
+cmp go.mod go.mod.115-2
+
+# Updating the go line to 1.21 or higher also updates the toolchain line,
+# only if the toolchain is higher than what would be implied by the go line.
+
+cp go.mod.117 go.mod
+go mod tidy -go=$goversion
+cmpenv go.mod go.mod.latest
+
+cp go.mod.117 go.mod
+go mod tidy -go=1.21.0  # lower than $goversion
+cmpenv go.mod go.mod.121toolchain
 
 
 -- go.mod --
@@ -136,6 +181,47 @@
 	example.net/d v0.1.0 => ./d
 	example.net/d v0.2.0 => ./d
 )
+-- go.mod.115from116 --
+module example.com/m
+
+go 1.15
+
+require example.net/a v0.1.0
+
+require example.net/c v0.1.0 // indirect
+
+replace (
+	example.net/a v0.1.0 => ./a
+	example.net/a v0.2.0 => ./a
+	example.net/b v0.1.0 => ./b
+	example.net/b v0.2.0 => ./b
+	example.net/c v0.1.0 => ./c
+	example.net/c v0.2.0 => ./c
+	example.net/d v0.1.0 => ./d
+	example.net/d v0.2.0 => ./d
+)
+-- go.mod.116from115 --
+module example.com/m
+
+go 1.16
+
+require example.net/a v0.1.0
+
+require (
+	example.net/c v0.1.0 // indirect
+	example.net/d v0.1.0 // indirect
+)
+
+replace (
+	example.net/a v0.1.0 => ./a
+	example.net/a v0.2.0 => ./a
+	example.net/b v0.1.0 => ./b
+	example.net/b v0.2.0 => ./b
+	example.net/c v0.1.0 => ./c
+	example.net/c v0.2.0 => ./c
+	example.net/d v0.1.0 => ./d
+	example.net/d v0.2.0 => ./d
+)
 -- go.mod.115-2 --
 module example.com/m
 
@@ -199,6 +285,28 @@
 	example.net/d v0.1.0 => ./d
 	example.net/d v0.2.0 => ./d
 )
+-- go.mod.116from117 --
+module example.com/m
+
+go 1.16
+
+require example.net/a v0.1.0
+
+require (
+	example.net/b v0.1.0 // indirect
+	example.net/c v0.1.0 // indirect
+)
+
+replace (
+	example.net/a v0.1.0 => ./a
+	example.net/a v0.2.0 => ./a
+	example.net/b v0.1.0 => ./b
+	example.net/b v0.2.0 => ./b
+	example.net/c v0.1.0 => ./c
+	example.net/c v0.2.0 => ./c
+	example.net/d v0.1.0 => ./d
+	example.net/d v0.2.0 => ./d
+)
 -- go.mod.latest --
 module example.com/m
 
@@ -221,6 +329,30 @@
 	example.net/d v0.1.0 => ./d
 	example.net/d v0.2.0 => ./d
 )
+-- go.mod.121toolchain --
+module example.com/m
+
+go 1.21.0
+
+toolchain $TESTGO_VERSION
+
+require example.net/a v0.1.0
+
+require (
+	example.net/b v0.1.0 // indirect
+	example.net/c v0.1.0 // indirect
+)
+
+replace (
+	example.net/a v0.1.0 => ./a
+	example.net/a v0.2.0 => ./a
+	example.net/b v0.1.0 => ./b
+	example.net/b v0.2.0 => ./b
+	example.net/c v0.1.0 => ./c
+	example.net/c v0.2.0 => ./c
+	example.net/d v0.1.0 => ./d
+	example.net/d v0.2.0 => ./d
+)
 -- a/go.mod --
 module example.net/a
 
diff --git a/src/cmd/go/testdata/script/mod_tidy_version_tooold.txt b/src/cmd/go/testdata/script/mod_tidy_version_tooold.txt
new file mode 100644
index 0000000..713ef1a
--- /dev/null
+++ b/src/cmd/go/testdata/script/mod_tidy_version_tooold.txt
@@ -0,0 +1,23 @@
+env TESTGO_VERSION=go1.22.0
+
+! go mod tidy -go=1.21
+stderr '^go: example.net/a@v0.1.0 requires go@1.22, but 1.21 is requested$'
+
+-- go.mod --
+module example
+
+go 1.22
+
+require example.net/a v0.1.0
+
+replace example.net/a v0.1.0 => ./a
+-- example.go --
+package example
+
+import "example.net/a"
+-- a/go.mod --
+module example.net/a
+
+go 1.22
+-- a/a.go --
+package a
diff --git a/src/cmd/go/testdata/script/mod_toolchain.txt b/src/cmd/go/testdata/script/mod_toolchain.txt
new file mode 100644
index 0000000..c771cae
--- /dev/null
+++ b/src/cmd/go/testdata/script/mod_toolchain.txt
@@ -0,0 +1,76 @@
+env TESTGO_VERSION=go1.100.0
+env TESTGO_VERSION_SWITCH=switch
+
+go get toolchain@go1.22.1
+stderr '^go: added toolchain go1.22.1$'
+! stderr '(added|removed|upgraded|downgraded) go'
+grep 'toolchain go1.22.1' go.mod
+
+go get toolchain@none
+stderr '^go: removed toolchain go1.22.1$'
+! stderr '(added|removed|upgraded|downgraded) go'
+! grep toolchain go.mod
+
+go get toolchain@go1.22.1
+stderr '^go: added toolchain go1.22.1$'
+! stderr '(added|removed|upgraded|downgraded) go'
+grep 'toolchain go1.22.1' go.mod
+
+go get go@1.22.3
+stderr '^go: upgraded go 1.10 => 1.22.3$'
+stderr '^go: upgraded toolchain go1.22.1 => go1.100.0$'
+grep 'go 1.22.3' go.mod
+
+go get go@1.22.3 toolchain@1.22.3
+stderr '^go: removed toolchain go1.100.0$'
+! grep toolchain go.mod
+
+go get go@1.22.1 toolchain@go1.22.3
+stderr '^go: downgraded go 1.22.3 => 1.22.1$'
+stderr '^go: added toolchain go1.22.3$'
+grep 'go 1.22.1' go.mod
+grep 'toolchain go1.22.3' go.mod
+
+go get go@1.22.3 toolchain@1.22.3
+stderr '^go: upgraded go 1.22.1 => 1.22.3$'
+stderr '^go: removed toolchain go1.22.3$'
+grep 'go 1.22.3' go.mod
+! grep toolchain go.mod
+
+go get toolchain@1.22.1
+stderr '^go: downgraded go 1.22.3 => 1.22.1$'
+! stderr toolchain # already gone, was not added
+grep 'go 1.22.1' go.mod
+! grep toolchain go.mod
+
+env TESTGO_VERSION=go1.22.1
+env GOTOOLCHAIN=local
+! go get go@1.22.3
+stderr 'go: updating go.mod requires go >= 1.22.3 \(running go 1.22.1; GOTOOLCHAIN=local\)$'
+
+env TESTGO_VERSION=go1.30
+go get toolchain@1.22.3
+grep 'toolchain go1.22.3' go.mod
+
+go get go@1.22.1
+grep 'go 1.22.1' go.mod
+go get m2@v1.0.0
+stderr '^go: upgraded go 1.22.1 => 1.23$'
+stderr '^go: added m2 v1.0.0$'
+grep 'go 1.23$' go.mod
+
+go get toolchain@go1.23.9 go@1.23.5
+go get toolchain@none
+stderr '^go: removed toolchain go1.23.9'
+! stderr ' go 1'
+grep 'go 1.23.5' go.mod
+
+-- go.mod --
+module m
+go 1.10
+
+replace m2 v1.0.0 => ./m2
+
+-- m2/go.mod --
+module m2
+go 1.23
diff --git a/src/cmd/go/testdata/script/mod_toolchain_slash.txt b/src/cmd/go/testdata/script/mod_toolchain_slash.txt
new file mode 100644
index 0000000..bb1f770
--- /dev/null
+++ b/src/cmd/go/testdata/script/mod_toolchain_slash.txt
@@ -0,0 +1,32 @@
+[!exec:/bin/sh] skip
+
+chmod 0777 go1.999999-/run.sh
+chmod 0777 run.sh
+
+! go list all
+! stdout 'RAN SCRIPT'
+
+cd subdir
+! go list all
+! stdout 'RAN SCRIPT'
+
+-- go.mod --
+module exploit
+
+go 1.21
+toolchain go1.999999-/run.sh
+-- go1.999999-/run.sh --
+#!/bin/sh
+printf 'RAN SCRIPT\n'
+exit 1
+-- run.sh --
+#!/bin/sh
+printf 'RAN SCRIPT\n'
+exit 1
+-- subdir/go.mod --
+module exploit
+
+go 1.21
+toolchain go1.999999-/../../run.sh
+-- subdir/go1.999999-/README.txt --
+heh heh heh
diff --git a/src/cmd/go/testdata/script/mod_vcs_missing.txt b/src/cmd/go/testdata/script/mod_vcs_missing.txt
index 9e6e371..7f63e9d 100644
--- a/src/cmd/go/testdata/script/mod_vcs_missing.txt
+++ b/src/cmd/go/testdata/script/mod_vcs_missing.txt
@@ -1,5 +1,5 @@
 [exec:bzr] skip 'tests NOT having bzr'
-[!net] skip
+[!net:launchpad.net] skip
 
 env GO111MODULE=on
 env GOPROXY=direct
diff --git a/src/cmd/go/testdata/script/mod_vendor.txt b/src/cmd/go/testdata/script/mod_vendor.txt
index a11d7a1..b02341d 100644
--- a/src/cmd/go/testdata/script/mod_vendor.txt
+++ b/src/cmd/go/testdata/script/mod_vendor.txt
@@ -55,7 +55,7 @@
 go list -mod=mod -f {{.Dir}} w
 stdout 'src[\\/]w'
 ! go list -mod=vendor -f {{.Dir}} w
-stderr 'package w is not in GOROOT'
+stderr 'package w is not in std'
 
 go list -mod=mod -f {{.Dir}} diamondright
 stdout 'src[\\/]diamondright'
diff --git a/src/cmd/go/testdata/script/mod_vendor_auto.txt b/src/cmd/go/testdata/script/mod_vendor_auto.txt
index 3cace73..2cafcda 100644
--- a/src/cmd/go/testdata/script/mod_vendor_auto.txt
+++ b/src/cmd/go/testdata/script/mod_vendor_auto.txt
@@ -11,7 +11,10 @@
 # An explicit -mod=vendor should force use of the vendor directory.
 env GOFLAGS=-mod=vendor
 
-go list -f {{.Dir}} -tags tools all
+# Pass -e to permit an error: tools.go imports a main package
+# "example.com/printversion".
+# TODO(#59186): investigate why it didn't fail without -e.
+go list -f {{.Dir}} -tags tools -e all
 stdout '^'$WORK'[/\\]auto$'
 stdout '^'$WORK'[/\\]auto[/\\]vendor[/\\]example.com[/\\]printversion$'
 stdout '^'$WORK'[/\\]auto[/\\]vendor[/\\]example.com[/\\]version$'
@@ -25,7 +28,7 @@
 # An explicit -mod=mod should force the vendor directory to be ignored.
 env GOFLAGS=-mod=mod
 
-go list -f {{.Dir}} -tags tools all
+go list -f {{.Dir}} -tags tools -e all
 stdout '^'$WORK'[/\\]auto$'
 stdout '^'$GOPATH'[/\\]pkg[/\\]mod[/\\]example.com[/\\]printversion@v1.0.0$'
 stdout '^'$WORK'[/\\]auto[/\\]replacement-version$'
@@ -44,7 +47,7 @@
 env GOFLAGS=
 go mod edit -go=1.13
 
-go list -f {{.Dir}} -tags tools all
+go list -f {{.Dir}} -tags tools -e all
 stdout '^'$WORK'[/\\]auto$'
 stdout '^'$GOPATH'[/\\]pkg[/\\]mod[/\\]example.com[/\\]printversion@v1.0.0$'
 stdout '^'$WORK'[/\\]auto[/\\]replacement-version$'
@@ -75,7 +78,7 @@
 # An explicit -mod=mod should still force the vendor directory to be ignored.
 env GOFLAGS=-mod=mod
 
-go list -f {{.Dir}} -tags tools all
+go list -f {{.Dir}} -tags tools -e all
 stdout '^'$WORK'[/\\]auto$'
 stdout '^'$GOPATH'[/\\]pkg[/\\]mod[/\\]example.com[/\\]printversion@v1.0.0$'
 stdout '^'$WORK'[/\\]auto[/\\]replacement-version$'
@@ -97,7 +100,7 @@
 go mod edit -go=1.14
 go mod vendor
 
-go list -f {{.Dir}} -tags tools all
+go list -f {{.Dir}} -tags tools -e all
 stdout '^'$WORK'[/\\]auto$'
 stdout '^'$WORK'[/\\]auto[/\\]vendor[/\\]example.com[/\\]printversion$'
 stdout '^'$WORK'[/\\]auto[/\\]vendor[/\\]example.com[/\\]version$'
@@ -120,7 +123,7 @@
 rm vendor/modules.txt
 
 go mod init example.com/auto
-go list -f {{.Dir}} -tags tools all
+go list -f {{.Dir}} -tags tools -e all
 stdout '^'$WORK'[/\\]auto$'
 stdout '^'$WORK'[/\\]auto[/\\]vendor[/\\]example.com[/\\]printversion$'
 stdout '^'$WORK'[/\\]auto[/\\]vendor[/\\]example.com[/\\]version$'
@@ -130,7 +133,7 @@
 
 cp go.mod.orig go.mod
 go mod edit -go=1.14
-! go list -f {{.Dir}} -tags tools all
+! go list -f {{.Dir}} -tags tools -e all
 stderr '^go: inconsistent vendoring in '$WORK[/\\]auto':$'
 stderr '^\texample.com/printversion@v1.0.0: is explicitly required in go.mod, but not marked as explicit in vendor/modules.txt'
 stderr '^\texample.com/unused: is replaced in go.mod, but not marked as replaced in vendor/modules.txt'
@@ -141,7 +144,7 @@
 # the go version is 1.13 or earlier.
 # An incomplete or missing vendor/modules.txt should resolve the vendored packages...
 go mod edit -go=1.13
-go list -mod=vendor -f {{.Dir}} -tags tools all
+go list -mod=vendor -f {{.Dir}} -tags tools -e all
 stdout '^'$WORK'[/\\]auto$'
 stdout '^'$WORK'[/\\]auto[/\\]vendor[/\\]example.com[/\\]printversion$'
 stdout '^'$WORK'[/\\]auto[/\\]vendor[/\\]example.com[/\\]version$'
@@ -158,7 +161,7 @@
 go mod vendor
 cmp $WORK/modules-1.13.txt vendor/modules.txt
 
-go list -mod=vendor -f {{.Dir}} -tags tools all
+go list -mod=vendor -f {{.Dir}} -tags tools -e all
 stdout '^'$WORK'[/\\]auto$'
 stdout '^'$WORK'[/\\]auto[/\\]vendor[/\\]example.com[/\\]printversion$'
 stdout '^'$WORK'[/\\]auto[/\\]vendor[/\\]example.com[/\\]version$'
@@ -170,7 +173,7 @@
 cmp $WORK/modules-1.14.txt vendor/modules.txt
 
 # Then, -mod=vendor should kick in automatically and succeed.
-go list -f {{.Dir}} -tags tools all
+go list -f {{.Dir}} -tags tools -e all
 stdout '^'$WORK'[/\\]auto$'
 stdout '^'$WORK'[/\\]auto[/\\]vendor[/\\]example.com[/\\]printversion$'
 stdout '^'$WORK'[/\\]auto[/\\]vendor[/\\]example.com[/\\]version$'
diff --git a/src/cmd/go/testdata/script/mod_vendor_goversion.txt b/src/cmd/go/testdata/script/mod_vendor_goversion.txt
index 9e3618a..838c557 100644
--- a/src/cmd/go/testdata/script/mod_vendor_goversion.txt
+++ b/src/cmd/go/testdata/script/mod_vendor_goversion.txt
@@ -7,7 +7,7 @@
 
 go build example.net/need117
 ! go build example.net/bad114
-stderr '^bad114[/\\]bad114.go:15:2: duplicate method Y$'
+stderr '^bad114[/\\]bad114.go:15:2: duplicate method Y( .*)?$'
 
 
 # With a vendor/modules.txt lacking language versions, the world is topsy-turvy,
@@ -43,7 +43,7 @@
 
 grep '^## explicit; go 1.13$' vendor/modules.txt
 ! go build example.net/bad114
-stderr '^vendor[/\\]example\.net[/\\]bad114[/\\]bad114.go:15:2: duplicate method Y$'
+stderr '^vendor[/\\]example\.net[/\\]bad114[/\\]bad114.go:15:2: duplicate method Y( .+)?$'
 
 -- go.mod --
 module example.net/m
diff --git a/src/cmd/go/testdata/script/old_tidy_toolchain.txt b/src/cmd/go/testdata/script/old_tidy_toolchain.txt
new file mode 100644
index 0000000..d4b5af2
--- /dev/null
+++ b/src/cmd/go/testdata/script/old_tidy_toolchain.txt
@@ -0,0 +1,28 @@
+# Commands in an old module with no go line and no toolchain line,
+# or with only a go line, should succeed.
+# (They should not fail due to the go.mod not being tidy.)
+
+# No go line, no toolchain line.
+go list
+
+# Old go line, no toolchain line.
+go mod edit -go=1.16
+go list
+
+go mod edit -go=1.20
+go list
+
+# New go line, no toolchain line, using same toolchain.
+env TESTGO_VERSION=1.21
+go mod edit -go=1.21
+go list
+
+# New go line, no toolchain line, using newer Go version.
+# (Until we need to update the go line, no toolchain addition.)
+env TESTGO_VERSION=1.21.0
+go list
+
+-- go.mod --
+module m
+-- p.go --
+package p
diff --git a/src/cmd/go/testdata/script/repro_build.txt b/src/cmd/go/testdata/script/repro_build.txt
new file mode 100644
index 0000000..7c6e317
--- /dev/null
+++ b/src/cmd/go/testdata/script/repro_build.txt
@@ -0,0 +1,22 @@
+# Check that goroutine scheduling does not affect compiler output.
+# If it does, reproducible builds will not work very well.
+[short] skip
+[GOOS:aix] env CGO_ENABLED=0  # go.dev/issue/56896
+env GOMAXPROCS=16
+go build -a -o http16.o net/http
+env GOMAXPROCS=17
+go build -a -o http17.o net/http
+cmp -q http16.o http17.o
+env GOMAXPROCS=18
+go build -a -o http18.o net/http
+cmp -q http16.o http18.o
+
+# Check that goroutine scheduling does not affect linker output.
+env GOMAXPROCS=16
+go build -a -o gofmt16.exe cmd/gofmt
+env GOMAXPROCS=17
+go build -a -o gofmt17.exe cmd/gofmt
+cmp -q gofmt16.exe gofmt17.exe
+env GOMAXPROCS=18
+go build -a -o gofmt18.exe cmd/gofmt
+cmp -q gofmt16.exe gofmt18.exe
diff --git a/src/cmd/go/testdata/script/reuse_git.txt b/src/cmd/go/testdata/script/reuse_git.txt
index 4f9e0dd..0357d67 100644
--- a/src/cmd/go/testdata/script/reuse_git.txt
+++ b/src/cmd/go/testdata/script/reuse_git.txt
@@ -1,6 +1,5 @@
 [short] skip
 [!git] skip
-[!net] skip
 
 env GO111MODULE=on
 env GOPROXY=direct
diff --git a/src/cmd/go/testdata/script/slashpath.txt b/src/cmd/go/testdata/script/slashpath.txt
new file mode 100644
index 0000000..22b3e9d
--- /dev/null
+++ b/src/cmd/go/testdata/script/slashpath.txt
@@ -0,0 +1,18 @@
+# .a files should use slash-separated paths even on windows
+# This is important for reproducing native builds with cross-compiled builds.
+go build -o x.a text/template
+! grep 'GOROOT\\' x.a
+! grep 'text\\template' x.a
+! grep 'c:\\' x.a
+
+# executables should use slash-separated paths even on windows
+# This is important for reproducing native builds with cross-compiled builds.
+go build -o hello.exe hello.go
+! grep 'GOROOT\\' hello.exe
+! grep '\\runtime' hello.exe
+! grep 'runtime\\' hello.exe
+! grep 'gofile..[A-Za-z]:\\' hello.exe
+
+-- hello.go --
+package main
+func main() { println("hello") }
diff --git a/src/cmd/go/testdata/script/src_file.txt b/src/cmd/go/testdata/script/src_file.txt
new file mode 100644
index 0000000..8d5c20b
--- /dev/null
+++ b/src/cmd/go/testdata/script/src_file.txt
@@ -0,0 +1,9 @@
+# Files in src should not be treated as packages
+
+exists $GOROOT/src/regexp/testdata/README
+go list -f '{{.Dir}}' regexp/testdata/README
+
+-- go.mod --
+module regexp/testdata/README
+-- p.go --
+package p
diff --git a/src/cmd/go/testdata/script/test_compile_multi_pkg.txt b/src/cmd/go/testdata/script/test_compile_multi_pkg.txt
new file mode 100644
index 0000000..921ef5c
--- /dev/null
+++ b/src/cmd/go/testdata/script/test_compile_multi_pkg.txt
@@ -0,0 +1,50 @@
+[short] skip 'links test binaries'
+
+# Verify test -c can output multiple executables to a directory.
+
+# This test also serves as a regression test for https://go.dev/issue/62221:
+# prior to the fix for that issue, it occasionally failed with ETXTBSY when
+# run on Unix platforms.
+
+go test -c -o $WORK/some/nonexisting/directory/ ./pkg/...
+exists -exec $WORK/some/nonexisting/directory/pkg1.test$GOEXE
+exists -exec $WORK/some/nonexisting/directory/pkg2.test$GOEXE
+
+go test -c ./pkg/...
+exists -exec pkg1.test$GOEXE
+exists -exec pkg2.test$GOEXE
+
+! go test -c -o $WORK/bin/test/bin.test.exe ./pkg/...
+stderr '^with multiple packages, -o must refer to a directory or '$devnull
+
+! go test -c ./...
+stderr '^cannot write test binary pkg1.test for multiple packages:\nexample/anotherpkg/pkg1\nexample/pkg/pkg1'
+
+! go test -c -o $WORK/bin/test/ ./...
+stderr '^cannot write test binary pkg1.test for multiple packages:\nexample/anotherpkg/pkg1\nexample/pkg/pkg1'
+
+! go test -o $WORK/bin/filename.exe ./pkg/...
+stderr '^with multiple packages, -o must refer to a directory or '$devnull
+
+! go test -o $WORK/bin/ ./...
+stderr '^cannot write test binary pkg1.test for multiple packages:\nexample/anotherpkg/pkg1\nexample/pkg/pkg1'
+
+go test -c -o $devnull ./...
+
+rm pkg1.test$GOEXE
+rm pkg2.test$GOEXE
+go test -o . ./pkg/...
+exists -exec pkg1.test$GOEXE
+exists -exec pkg2.test$GOEXE
+
+-- go.mod --
+module example
+
+-- pkg/pkg1/pkg1_test.go --
+package pkg1
+
+-- pkg/pkg2/pkg2_test.go --
+package pkg2
+
+-- anotherpkg/pkg1/pkg1_test.go --
+package pkg1
diff --git a/src/cmd/go/testdata/script/test_flags.txt b/src/cmd/go/testdata/script/test_flags.txt
index 63385e6..3f7964b 100644
--- a/src/cmd/go/testdata/script/test_flags.txt
+++ b/src/cmd/go/testdata/script/test_flags.txt
@@ -15,8 +15,7 @@
 # Even though ./x looks like a package path, the real package should be
 # the implicit '.'.
 ! go test --answer=42 ./x
-stderr '^no Go files in .+$'
-! stderr '/x'
+stderr '^no Go files in '$PWD'$'
 
 # However, *flags* that appear after unrecognized flags should still be
 # interpreted as flags, under the (possibly-erroneous) assumption that
diff --git a/src/cmd/go/testdata/script/test_fullpath.txt b/src/cmd/go/testdata/script/test_fullpath.txt
new file mode 100644
index 0000000..8e01552
--- /dev/null
+++ b/src/cmd/go/testdata/script/test_fullpath.txt
@@ -0,0 +1,21 @@
+[short] skip
+
+# test with -fullpath
+! go test ./x/... -fullpath
+stdout '^ +.+/gopath/src/x/fullpath/fullpath_test.go:8: test failed'
+# test without -fullpath
+! go test ./x/...
+stdout '^ +fullpath_test.go:8: test failed'
+
+-- go.mod --
+module example
+-- x/fullpath/fullpath_test.go --
+package fullpath_test
+
+import (
+	"testing"
+)
+
+func TestFullPath(t *testing.T) {
+	t.Error("test failed")
+}
diff --git a/src/cmd/go/testdata/script/test_fuzz.txt b/src/cmd/go/testdata/script/test_fuzz.txt
index 3e048e0..37170bf 100644
--- a/src/cmd/go/testdata/script/test_fuzz.txt
+++ b/src/cmd/go/testdata/script/test_fuzz.txt
@@ -1,4 +1,6 @@
 [!fuzz] skip
+[short] skip
+env GOCACHE=$WORK/cache
 
 # Test that running a fuzz target that returns without failing or calling
 # f.Fuzz fails and causes a non-zero exit status.
diff --git a/src/cmd/go/testdata/script/test_fuzz_chatty.txt b/src/cmd/go/testdata/script/test_fuzz_chatty.txt
index d07fe50..01a68cb 100644
--- a/src/cmd/go/testdata/script/test_fuzz_chatty.txt
+++ b/src/cmd/go/testdata/script/test_fuzz_chatty.txt
@@ -1,5 +1,6 @@
 [!fuzz] skip
 [short] skip
+env GOCACHE=$WORK/cache
 
 # Run chatty fuzz targets with an error.
 ! go test -v chatty_error_fuzz_test.go
diff --git a/src/cmd/go/testdata/script/test_fuzz_cleanup.txt b/src/cmd/go/testdata/script/test_fuzz_cleanup.txt
index b65022b..5f86498 100644
--- a/src/cmd/go/testdata/script/test_fuzz_cleanup.txt
+++ b/src/cmd/go/testdata/script/test_fuzz_cleanup.txt
@@ -1,5 +1,6 @@
 [!fuzz] skip
 [short] skip
+env GOCACHE=$WORK/cache
 
 # Cleanup should run after F.Skip.
 go test -run=FuzzTargetSkip
diff --git a/src/cmd/go/testdata/script/test_fuzz_cov.txt b/src/cmd/go/testdata/script/test_fuzz_cov.txt
index 05b6348..c0844a3 100644
--- a/src/cmd/go/testdata/script/test_fuzz_cov.txt
+++ b/src/cmd/go/testdata/script/test_fuzz_cov.txt
@@ -4,8 +4,11 @@
 
 [short] skip
 [!fuzz-instrumented] skip
+env GOCACHE=$WORK/cache
 
-! go test -fuzz=FuzzCov
+# TODO(#51484): enabled debugging info to help diagnose a deadlock in the fuzzer
+env GODEBUG=fuzzdebug=1
+! go test -fuzz=FuzzCov -v
 ! stderr 'cov instrumentation working'
 
 -- go.mod --
diff --git a/src/cmd/go/testdata/script/test_fuzz_deadline.txt b/src/cmd/go/testdata/script/test_fuzz_deadline.txt
index 5ba76a3..46d3521 100644
--- a/src/cmd/go/testdata/script/test_fuzz_deadline.txt
+++ b/src/cmd/go/testdata/script/test_fuzz_deadline.txt
@@ -1,5 +1,6 @@
 [!fuzz] skip
 [short] skip
+env GOCACHE=$WORK/cache
 
 # The fuzz function should be able to detect whether -timeout
 # was set with T.Deadline. Note there is no F.Deadline, and
diff --git a/src/cmd/go/testdata/script/test_fuzz_dup_cache.txt b/src/cmd/go/testdata/script/test_fuzz_dup_cache.txt
index 52d44a2..f54a77c 100644
--- a/src/cmd/go/testdata/script/test_fuzz_dup_cache.txt
+++ b/src/cmd/go/testdata/script/test_fuzz_dup_cache.txt
@@ -1,5 +1,6 @@
 [!fuzz] skip
 [short] skip
+env GOCACHE=$WORK/cache
 
 # This test checks that cached corpus loading properly handles duplicate entries (this can
 # happen when a f.Add value has a duplicate entry in the cached corpus.) Duplicate entries
diff --git a/src/cmd/go/testdata/script/test_fuzz_err_deadlock.txt b/src/cmd/go/testdata/script/test_fuzz_err_deadlock.txt
new file mode 100644
index 0000000..4feb41a
--- /dev/null
+++ b/src/cmd/go/testdata/script/test_fuzz_err_deadlock.txt
@@ -0,0 +1,50 @@
+[short] skip
+[!fuzz-instrumented] skip
+
+env GOCACHE=$WORK/cache
+! go test -fuzz=FuzzDead -v
+# This is a somewhat inexact check, but since we don't prefix the error with anything
+# and as the error suffix is platform dependent, this is the best we can do. In the
+# deadlock failure case, the test will just deadlock and timeout anyway, so it should
+# be clear that that failure mode is different.
+stdout 'open'
+
+-- go.mod --
+module test
+
+-- cov_test.go --
+package dead
+
+import (
+	"os"
+	"path/filepath"
+	"testing"
+	"time"
+)
+
+func FuzzDead(f *testing.F) {
+	go func() {
+		c := filepath.Join(os.Getenv("GOCACHE"), "fuzz", "test", "FuzzDead")
+		t := time.NewTicker(time.Second)
+		for range t.C {
+			files, _ := os.ReadDir(c)
+			if len(files) > 0 {
+				os.RemoveAll(c)
+			}
+		}
+	}()
+
+	f.Fuzz(func(t *testing.T, b []byte) {
+		if len(b) == 8 &&
+			b[0] == 'h' &&
+			b[1] == 'e' &&
+			b[2] == 'l' &&
+			b[3] == 'l' &&
+			b[4] == 'o' &&
+			b[5] == ' ' &&
+			b[6] == ':' &&
+			b[7] == ')' {
+			return
+		}
+	})
+}
diff --git a/src/cmd/go/testdata/script/test_fuzz_fuzztime.txt b/src/cmd/go/testdata/script/test_fuzz_fuzztime.txt
index 56d94a4..28ef3bf 100644
--- a/src/cmd/go/testdata/script/test_fuzz_fuzztime.txt
+++ b/src/cmd/go/testdata/script/test_fuzz_fuzztime.txt
@@ -1,5 +1,6 @@
 [!fuzz] skip
 [short] skip
+env GOCACHE=$WORK/cache
 
 # There are no seed values, so 'go test' should finish quickly.
 go test
@@ -14,8 +15,6 @@
 # Timeout should not cause inputs to be written as crashers.
 ! exists testdata/fuzz
 
-env GOCACHE=$WORK/tmp
-
 # When we use fuzztime with an "x" suffix, it runs a specific number of times.
 # This fuzz function creates a file with a unique name ($pid.$count) on each
 # run. We count the files to find the number of runs.
diff --git a/src/cmd/go/testdata/script/test_fuzz_io_error.txt b/src/cmd/go/testdata/script/test_fuzz_io_error.txt
index 1a0aa64..01b4da6 100644
--- a/src/cmd/go/testdata/script/test_fuzz_io_error.txt
+++ b/src/cmd/go/testdata/script/test_fuzz_io_error.txt
@@ -7,6 +7,7 @@
 # due to ^C and EOF errors which are more common. We don't report those.
 [short] skip
 [!fuzz] skip
+env GOCACHE=$WORK/cache
 
 # If the I/O error occurs before F.Fuzz is called, the coordinator should
 # stop the worker and say that.
diff --git a/src/cmd/go/testdata/script/test_fuzz_limit_dup_entry.txt b/src/cmd/go/testdata/script/test_fuzz_limit_dup_entry.txt
new file mode 100644
index 0000000..01217ae
--- /dev/null
+++ b/src/cmd/go/testdata/script/test_fuzz_limit_dup_entry.txt
@@ -0,0 +1,37 @@
+[!fuzz] skip
+[short] skip
+env GOCACHE=$WORK/cache
+
+# FuzzA attempts to cause the mutator to create duplicate inputs that generate
+# new coverage. Previously this would trigger a corner case when the fuzzer
+# had a execution limit, causing it to deadlock and sit in the coordinator
+# loop indefinitely, failing to exit once the limit had been exhausted.
+
+go test -fuzz=FuzzA -fuzztime=100x -parallel=1
+
+-- go.mod --
+module m
+
+go 1.16
+-- fuzz_test.go --
+package fuzz_test
+
+import (
+	"fmt"
+	"testing"
+)
+
+func FuzzA(f *testing.F) {
+	f.Add([]byte("seed"))
+	i := 0
+	f.Fuzz(func(t *testing.T, b []byte) {
+		i++
+		if string(b) == "seed" {
+			if i == 0 {
+				fmt.Println("a")
+			} else if i > 1 {
+				fmt.Println("b")
+			}
+		}
+	})
+}
diff --git a/src/cmd/go/testdata/script/test_fuzz_match.txt b/src/cmd/go/testdata/script/test_fuzz_match.txt
index dbf9876..d149586 100644
--- a/src/cmd/go/testdata/script/test_fuzz_match.txt
+++ b/src/cmd/go/testdata/script/test_fuzz_match.txt
@@ -1,4 +1,6 @@
 [!fuzz] skip
+[short] skip
+env GOCACHE=$WORK/cache
 
 # Matches only fuzz targets to test.
 go test standalone_fuzz_test.go
diff --git a/src/cmd/go/testdata/script/test_fuzz_multiple.txt b/src/cmd/go/testdata/script/test_fuzz_multiple.txt
index 1ec4985..c96112f 100644
--- a/src/cmd/go/testdata/script/test_fuzz_multiple.txt
+++ b/src/cmd/go/testdata/script/test_fuzz_multiple.txt
@@ -4,6 +4,7 @@
 
 [!fuzz] skip
 [short] skip
+env GOCACHE=$WORK/cache
 
 # With fuzzing disabled, multiple targets can be tested.
 go test ./...
diff --git a/src/cmd/go/testdata/script/test_fuzz_mutate_crash.txt b/src/cmd/go/testdata/script/test_fuzz_mutate_crash.txt
index aa4aa85..4b9b36d 100644
--- a/src/cmd/go/testdata/script/test_fuzz_mutate_crash.txt
+++ b/src/cmd/go/testdata/script/test_fuzz_mutate_crash.txt
@@ -6,6 +6,7 @@
 # to the seed corpus in testdata, and failing the next time the test is run.
 
 [short] skip
+env GOCACHE=$WORK/cache
 
 # Running the seed corpus for all of the targets should pass the first
 # time, since nothing in the seed corpus will cause a crash.
@@ -25,7 +26,7 @@
 
 ! go test -run=FuzzWithNilPanic -fuzz=FuzzWithNilPanic -fuzztime=100x -fuzzminimizetime=1000x
 stdout 'testdata[/\\]fuzz[/\\]FuzzWithNilPanic[/\\]'
-stdout 'runtime.Goexit'
+stdout 'panic called with nil argument|test executed panic.nil. or runtime.Goexit'
 go run check_testdata.go FuzzWithNilPanic
 
 ! go test -run=FuzzWithGoexit -fuzz=FuzzWithGoexit -fuzztime=100x -fuzzminimizetime=1000x
diff --git a/src/cmd/go/testdata/script/test_fuzz_mutate_fail.txt b/src/cmd/go/testdata/script/test_fuzz_mutate_fail.txt
index b5eab17..213b73a 100644
--- a/src/cmd/go/testdata/script/test_fuzz_mutate_fail.txt
+++ b/src/cmd/go/testdata/script/test_fuzz_mutate_fail.txt
@@ -4,6 +4,7 @@
 # 'go test' exits non-zero and no crasher is recorded.
 
 [short] skip
+env GOCACHE=$WORK/cache
 
 ! go test -fuzz=FuzzReturn
 ! exists testdata
diff --git a/src/cmd/go/testdata/script/test_fuzz_mutator.txt b/src/cmd/go/testdata/script/test_fuzz_mutator.txt
index 76b8648..cc1f989 100644
--- a/src/cmd/go/testdata/script/test_fuzz_mutator.txt
+++ b/src/cmd/go/testdata/script/test_fuzz_mutator.txt
@@ -8,6 +8,7 @@
 # tests seed values and the worker tests mutated values on the fuzz target.
 
 [short] skip
+env GOCACHE=$WORK/cache
 
 go test -fuzz=FuzzA -fuzztime=100x -parallel=1 -log=fuzz
 go run check_logs.go fuzz fuzz.worker
diff --git a/src/cmd/go/testdata/script/test_fuzz_mutator_repeat.txt b/src/cmd/go/testdata/script/test_fuzz_mutator_repeat.txt
index b413f93..3b005c9 100644
--- a/src/cmd/go/testdata/script/test_fuzz_mutator_repeat.txt
+++ b/src/cmd/go/testdata/script/test_fuzz_mutator_repeat.txt
@@ -6,6 +6,7 @@
 # to the coordinator.
 
 [short] skip
+env GOCACHE=$WORK/cache
 
 # Start fuzzing. The worker crashes after 100 iterations.
 # The fuzz function writes the crashing input to "want" before exiting.
diff --git a/src/cmd/go/testdata/script/test_fuzz_non_crash_signal.txt b/src/cmd/go/testdata/script/test_fuzz_non_crash_signal.txt
index 6f1eeab..94a0421 100644
--- a/src/cmd/go/testdata/script/test_fuzz_non_crash_signal.txt
+++ b/src/cmd/go/testdata/script/test_fuzz_non_crash_signal.txt
@@ -3,6 +3,7 @@
 [GOOS:windows] skip
 [!fuzz] skip
 [short] skip
+env GOCACHE=$WORK/cache
 
 # FuzzNonCrash sends itself a signal that does not appear to be a crash.
 # We should not save a crasher.
diff --git a/src/cmd/go/testdata/script/test_fuzz_parallel.txt b/src/cmd/go/testdata/script/test_fuzz_parallel.txt
index e632520..8ff965a 100644
--- a/src/cmd/go/testdata/script/test_fuzz_parallel.txt
+++ b/src/cmd/go/testdata/script/test_fuzz_parallel.txt
@@ -1,5 +1,6 @@
 [!fuzz] skip
 [short] skip
+env GOCACHE=$WORK/cache
 
 # When running seed inputs, T.Parallel should let multiple inputs run in
 # parallel.
diff --git a/src/cmd/go/testdata/script/test_fuzz_setenv.txt b/src/cmd/go/testdata/script/test_fuzz_setenv.txt
index 2924569..1370cd8 100644
--- a/src/cmd/go/testdata/script/test_fuzz_setenv.txt
+++ b/src/cmd/go/testdata/script/test_fuzz_setenv.txt
@@ -1,5 +1,6 @@
 [!fuzz] skip
 [short] skip
+env GOCACHE=$WORK/cache
 
 go test -fuzz=FuzzA -fuzztime=100x fuzz_setenv_test.go
 
diff --git a/src/cmd/go/testdata/script/test_fuzz_test_race.txt b/src/cmd/go/testdata/script/test_fuzz_test_race.txt
index 9d39cd6..1bed47d 100644
--- a/src/cmd/go/testdata/script/test_fuzz_test_race.txt
+++ b/src/cmd/go/testdata/script/test_fuzz_test_race.txt
@@ -5,6 +5,7 @@
 [short] skip
 [!fuzz] skip
 [!race] skip
+env GOCACHE=$WORK/cache
 
 # Test with coverage instrumentation enabled (-fuzz) and race instrumentation
 # but without actually fuzzing the target (by using a non-matching pattern)
diff --git a/src/cmd/go/testdata/script/test_shuffle.txt b/src/cmd/go/testdata/script/test_shuffle.txt
index 3a50605..98029f5 100644
--- a/src/cmd/go/testdata/script/test_shuffle.txt
+++ b/src/cmd/go/testdata/script/test_shuffle.txt
@@ -1,5 +1,7 @@
 # Shuffle order of tests and benchmarks
 
+[short] skip 'builds and repeatedly runs a test binary'
+
 # Run tests
 go test -v foo_test.go
 ! stdout '-test.shuffle '
@@ -13,14 +15,6 @@
 stdout '^-test.shuffle 42'
 stdout '(?s)TestThree(.*)TestOne(.*)TestTwo'
 
-go test -v -shuffle=43 foo_test.go
-stdout '^-test.shuffle 43'
-stdout '(?s)TestThree(.*)TestTwo(.*)TestOne'
-
-go test -v -shuffle=44 foo_test.go
-stdout '^-test.shuffle 44'
-stdout '(?s)TestOne(.*)TestThree(.*)TestTwo'
-
 go test -v -shuffle=0 foo_test.go
 stdout '^-test.shuffle 0'
 stdout '(?s)TestTwo(.*)TestOne(.*)TestThree'
@@ -49,14 +43,6 @@
 stdout '^-test.shuffle 42'
 stdout '(?s)TestThree(.*)TestOne(.*)TestTwo(.*)BenchmarkThree(.*)BenchmarkOne(.*)BenchmarkTwo'
 
-go test -v -bench=. -shuffle=43 foo_test.go
-stdout '^-test.shuffle 43'
-stdout '(?s)TestThree(.*)TestTwo(.*)TestOne(.*)BenchmarkThree(.*)BenchmarkOne(.*)BenchmarkTwo'
-
-go test -v -bench=. -shuffle=44 foo_test.go
-stdout '^-test.shuffle 44'
-stdout '(?s)TestOne(.*)TestThree(.*)TestTwo(.*)BenchmarkTwo(.*)BenchmarkOne(.*)BenchmarkThree'
-
 go test -v -bench=. -shuffle=0 foo_test.go
 stdout '^-test.shuffle 0'
 stdout '(?s)TestTwo(.*)TestOne(.*)TestThree(.*)BenchmarkThree(.*)BenchmarkOne(.*)BenchmarkTwo'
diff --git a/src/cmd/go/testdata/script/test_timeout_stdin.txt b/src/cmd/go/testdata/script/test_timeout_stdin.txt
new file mode 100644
index 0000000..f2de0a6
--- /dev/null
+++ b/src/cmd/go/testdata/script/test_timeout_stdin.txt
@@ -0,0 +1,88 @@
+# Regression test for https://go.dev/issue/24050:
+# a test that exits with an I/O stream held open
+# should fail after a reasonable delay, not wait forever.
+# (As of the time of writing, that delay is 10% of the timeout,
+# but this test does not depend on its specific value.)
+
+[short] skip 'runs a test that hangs until its WaitDelay expires'
+
+! go test -v -timeout=1m .
+
+	# After the test process itself prints PASS and exits,
+	# the kernel closes its stdin pipe to to the orphaned subprocess.
+	# At that point, we expect the subprocess to print 'stdin closed'
+	# and periodically log to stderr until the WaitDelay expires.
+	#
+	# Once the WaitDelay expires, the copying goroutine for 'go test' stops and
+	# closes the read side of the stderr pipe, and the subprocess will eventually
+	# exit due to a failed write to that pipe.
+
+stdout '^--- PASS: TestOrphanCmd .*\nPASS\nstdin closed'
+stdout '^\*\*\* Test I/O incomplete \d+.* after exiting\.\nexec: WaitDelay expired before I/O complete\nFAIL\s+example\s+\d+(\.\d+)?s'
+
+-- go.mod --
+module example
+
+go 1.20
+-- main_test.go --
+package main
+
+import (
+	"fmt"
+	"io"
+	"os"
+	"os/exec"
+	"testing"
+	"time"
+)
+
+func TestMain(m *testing.M) {
+	if os.Getenv("TEST_TIMEOUT_HANG") == "1" {
+		io.Copy(io.Discard, os.Stdin)
+		if _, err := os.Stderr.WriteString("stdin closed\n"); err != nil {
+			os.Exit(1)
+		}
+
+		ticker := time.NewTicker(100 * time.Millisecond)
+		for t := range ticker.C {
+			_, err := fmt.Fprintf(os.Stderr, "still alive at %v\n", t)
+			if err != nil {
+				os.Exit(1)
+			}
+		}
+	}
+
+	m.Run()
+}
+
+func TestOrphanCmd(t *testing.T) {
+	exe, err := os.Executable()
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	cmd := exec.Command(exe)
+	cmd.Env = append(cmd.Environ(), "TEST_TIMEOUT_HANG=1")
+
+	// Hold stdin open until this (parent) process exits.
+	if _, err := cmd.StdinPipe(); err != nil {
+		t.Fatal(err)
+	}
+
+	// Forward stderr to the subprocess so that it can hold the stream open.
+	cmd.Stderr = os.Stderr
+
+	if err := cmd.Start(); err != nil {
+		t.Fatal(err)
+	}
+	t.Logf("started %v", cmd)
+
+	// Intentionally leak cmd when the test completes.
+	// This will allow the test process itself to exit, but (at least on Unix
+	// platforms) will keep the parent process's stderr stream open.
+	go func() {
+		if err := cmd.Wait(); err != nil {
+			os.Exit(3)
+		}
+	}()
+}
diff --git a/src/cmd/go/testdata/script/testing_coverage.txt b/src/cmd/go/testdata/script/testing_coverage.txt
new file mode 100644
index 0000000..6cf6adb
--- /dev/null
+++ b/src/cmd/go/testdata/script/testing_coverage.txt
@@ -0,0 +1,57 @@
+
+# Rudimentary test of testing.Coverage().
+
+[short] skip
+[!GOEXPERIMENT:coverageredesign] skip
+
+# Simple test.
+go test -v -cover -count=1
+
+# Make sure test still passes when test executable is built and
+# run outside the go command.
+go test -c -o t.exe -cover
+exec ./t.exe
+
+-- go.mod --
+module hello
+
+go 1.20
+-- hello.go --
+package hello
+
+func Hello() {
+	println("hello")
+}
+
+// contents not especially interesting, just need some code
+func foo(n int) int {
+	t := 0
+	for i := 0; i < n; i++ {
+		for j := 0; j < i; j++ {
+			t += i ^ j
+			if t == 1010101 {
+				break
+			}
+		}
+	}
+	return t
+}
+
+-- hello_test.go --
+package hello
+
+import "testing"
+
+func TestTestCoverage(t *testing.T) {
+	Hello()
+	C1 := testing.Coverage()
+	foo(29)
+	C2 := testing.Coverage()
+	if C1 == 0.0 || C2 == 0.0 {
+		t.Errorf("unexpected zero values C1=%f C2=%f", C1, C2)
+	}
+	if C1 >= C2 {
+		t.Errorf("testing.Coverage() not monotonically increasing C1=%f C2=%f", C1, C2)
+	}
+}
+
diff --git a/src/cmd/go/testdata/script/tooltags.txt b/src/cmd/go/testdata/script/tooltags.txt
index 3076185..27068ee 100644
--- a/src/cmd/go/testdata/script/tooltags.txt
+++ b/src/cmd/go/testdata/script/tooltags.txt
@@ -1,3 +1,5 @@
+env GOOS=linux
+
 env GOARCH=amd64
 env GOAMD64=v3
 go list -f '{{context.ToolTags}}'
diff --git a/src/cmd/go/testdata/script/vendor_import.txt b/src/cmd/go/testdata/script/vendor_import.txt
index df4c27d..c64af2c 100644
--- a/src/cmd/go/testdata/script/vendor_import.txt
+++ b/src/cmd/go/testdata/script/vendor_import.txt
@@ -1,6 +1,8 @@
 # Imports
 env GO111MODULE=off
-go list -f  '{{.ImportPath}} {{.Imports}}' 'vend/...' 'vend/vendor/...' 'vend/x/vendor/...'
+
+# Pass -e to permit errors (e.g. bad.go, invalid.go)
+go list -f  '{{.ImportPath}} {{.Imports}}' -e 'vend/...' 'vend/vendor/...' 'vend/x/vendor/...'
 cmp stdout want_vendor_imports.txt
 
 -- want_vendor_imports.txt --
diff --git a/src/cmd/go/testdata/script/vendor_list_issue11977.txt b/src/cmd/go/testdata/script/vendor_list_issue11977.txt
index 35c82c7..f519175 100644
--- a/src/cmd/go/testdata/script/vendor_list_issue11977.txt
+++ b/src/cmd/go/testdata/script/vendor_list_issue11977.txt
@@ -1,4 +1,4 @@
-[!net] skip
+[!net:github.com] skip
 [!git] skip
 env GO111MODULE=off
 
diff --git a/src/cmd/go/testdata/script/vendor_test_issue11864.txt b/src/cmd/go/testdata/script/vendor_test_issue11864.txt
index ff179cb..9e34811 100644
--- a/src/cmd/go/testdata/script/vendor_test_issue11864.txt
+++ b/src/cmd/go/testdata/script/vendor_test_issue11864.txt
@@ -1,4 +1,4 @@
-[!net] skip
+[!net:github.com] skip
 [!git] skip
 env GO111MODULE=off
 
diff --git a/src/cmd/go/testdata/script/vendor_test_issue14613.txt b/src/cmd/go/testdata/script/vendor_test_issue14613.txt
index 7822dee..9535fc1 100644
--- a/src/cmd/go/testdata/script/vendor_test_issue14613.txt
+++ b/src/cmd/go/testdata/script/vendor_test_issue14613.txt
@@ -1,4 +1,4 @@
-[!net] skip
+[!net:github.com] skip
 [!git] skip
 env GO111MODULE=off
 
diff --git a/src/cmd/go/testdata/script/vet_flags.txt b/src/cmd/go/testdata/script/vet_flags.txt
index e2e3f5b..73f4e41 100644
--- a/src/cmd/go/testdata/script/vet_flags.txt
+++ b/src/cmd/go/testdata/script/vet_flags.txt
@@ -31,7 +31,7 @@
 go vet .
 env GOFLAGS='-tags=buggy'
 ! go vet .
-stderr 'possible formatting directive'
+stderr 'possible Printf formatting directive'
 
 # Enabling one analyzer in GOFLAGS should disable the rest implicitly...
 env GOFLAGS='-tags=buggy -unsafeptr'
@@ -41,7 +41,7 @@
 # enabled via GOFLAGS.
 env GOFLAGS='-tags=buggy -printf'
 ! go vet -unsafeptr
-stderr 'possible formatting directive'
+stderr 'possible Printf formatting directive'
 
 # Analyzer flags don't exist unless we're running 'go vet',
 # and we shouldn't run the vet tool to discover them otherwise.
@@ -52,27 +52,25 @@
 stderr 'go: parsing \$GOFLAGS: unknown flag -unsafeptr'
 env GOFLAGS=
 
-env GOCACHE=$WORK/gocache
-
 # "go test" on a user package should by default enable an explicit list of analyzers.
-go test -x -run=none .
+go test -n -run=none .
 stderr '[/\\]vet'$GOEXE'["]? .* -errorsas .* ["]?\$WORK[/\\][^ ]*[/\\]vet\.cfg'
 
 # An explicitly-empty -vet argument should imply the default analyzers.
-go test -x -vet= -run=none .
+go test -n -vet= -run=none .
 stderr '[/\\]vet'$GOEXE'["]? .* -errorsas .* ["]?\$WORK[/\\][^ ]*[/\\]vet\.cfg'
 
 # "go test" on a standard package should by default disable an explicit list.
-go test -x -run=none encoding/binary
+go test -n -run=none encoding/binary
 stderr '[/\\]vet'$GOEXE'["]? -unsafeptr=false -unreachable=false ["]?\$WORK[/\\][^ ]*[/\\]vet\.cfg'
 
-go test -x -vet= -run=none encoding/binary
+go test -n -vet= -run=none encoding/binary
 stderr '[/\\]vet'$GOEXE'["]? -unsafeptr=false -unreachable=false ["]?\$WORK[/\\][^ ]*[/\\]vet\.cfg'
 
 # Both should allow users to override via the -vet flag.
-go test -x -vet=unreachable -run=none .
+go test -n -vet=unreachable -run=none .
 stderr '[/\\]vet'$GOEXE'["]? -unreachable ["]?\$WORK[/\\][^ ]*[/\\]vet\.cfg'
-go test -x -vet=unreachable -run=none encoding/binary
+go test -n -vet=unreachable -run=none encoding/binary
 stderr '[/\\]vet'$GOEXE'["]? -unreachable ["]?\$WORK[/\\][^ ]*[/\\]vet\.cfg'
 
 -- go.mod --
diff --git a/src/cmd/go/testdata/script/work.txt b/src/cmd/go/testdata/script/work.txt
index fa1558f..e229ab6 100644
--- a/src/cmd/go/testdata/script/work.txt
+++ b/src/cmd/go/testdata/script/work.txt
@@ -1,5 +1,5 @@
 ! go work init doesnotexist
-stderr 'go: creating workspace file: no go.mod file exists in directory doesnotexist'
+stderr 'go: directory doesnotexist does not exist'
 go env GOWORK
 ! stdout .
 
@@ -12,6 +12,7 @@
 stderr 'a(\\|/)a.go:4:8: no required module provides package rsc.io/quote; to add it:\n\tcd '$WORK(\\|/)gopath(\\|/)src(\\|/)a'\n\tgo get rsc.io/quote'
 cd a
 go get rsc.io/quote
+cat go.mod
 go env GOMOD # go env GOMOD reports the module in a single module context
 stdout $GOPATH(\\|/)src(\\|/)a(\\|/)go.mod
 cd ..
@@ -44,11 +45,13 @@
 cp go.work.backup go.work
 
 cp go.work.d go.work
+go work use # update go version
 go run example.com/d
 
 # Test that we don't run into "newRequirements called with unsorted roots"
 # panic with unsorted main modules.
 cp go.work.backwards go.work
+go work use # update go version
 go run example.com/d
 
 # Test that command-line-arguments work inside and outside modules.
@@ -64,9 +67,9 @@
 go 1.18
 
 use (
-  a
-  b
-  ../src/a
+	a
+	b
+	../src/a
 )
 -- go.work.want --
 go $goversion
@@ -94,7 +97,7 @@
 import "rsc.io/quote"
 
 func HelloFromA() {
-  fmt.Println(quote.Hello())
+	fmt.Println(quote.Hello())
 }
 
 -- b/go.mod --
@@ -107,7 +110,7 @@
 import "example.com/a"
 
 func main() {
-  a.HelloFromA()
+	a.HelloFromA()
 }
 -- b/lib/hello.go --
 package lib
@@ -138,9 +141,9 @@
 go 1.18
 
 use (
-    d
-    b
-    a
+	d
+	b
+	a
 )
 
 -- foo.go --
diff --git a/src/cmd/go/testdata/script/work_edit.txt b/src/cmd/go/testdata/script/work_edit.txt
index ad5de62..c67696d 100644
--- a/src/cmd/go/testdata/script/work_edit.txt
+++ b/src/cmd/go/testdata/script/work_edit.txt
@@ -6,6 +6,10 @@
 go work edit -use n
 cmpenv go.work go.work.want_use_n
 
+grep go go.work
+go work edit -go none
+! grep go go.work
+
 go work edit -go 1.18
 cmp go.work go.work.want_go_118
 
diff --git a/src/cmd/go/testdata/script/work_edit_toolchain.txt b/src/cmd/go/testdata/script/work_edit_toolchain.txt
new file mode 100644
index 0000000..b4e260d
--- /dev/null
+++ b/src/cmd/go/testdata/script/work_edit_toolchain.txt
@@ -0,0 +1,20 @@
+# Test support for go work edit -toolchain to set toolchain to use
+
+env GOTOOLCHAIN=local
+env GO111MODULE=on
+
+! grep toolchain go.work
+go work edit -toolchain=go1.9
+grep 'toolchain go1.9' go.work
+
+go work edit -toolchain=default
+grep 'toolchain default' go.work
+
+go work edit -toolchain=none
+! grep toolchain go.work
+
+-- go.work --
+go 1.8
+use .
+-- go.mod --
+module m
diff --git a/src/cmd/go/testdata/script/work_empty_panic_GOPATH.txt b/src/cmd/go/testdata/script/work_empty_panic_GOPATH.txt
new file mode 100644
index 0000000..43ebf11
--- /dev/null
+++ b/src/cmd/go/testdata/script/work_empty_panic_GOPATH.txt
@@ -0,0 +1,13 @@
+# Regression test for https://go.dev/issue/58767:
+# with an empty go.work file in GOPATH mode, calls to load.defaultGODEBUG for a
+# package named "main" panicked in modload.MainModules.GoVersion.
+
+env GO111MODULE=off
+cd example
+go list example/m
+
+-- example/go.work --
+go 1.21
+-- example/m/main.go --
+package main
+func main() {}
diff --git a/src/cmd/go/testdata/script/work_env.txt b/src/cmd/go/testdata/script/work_env.txt
index 511bb4e..8b1779e 100644
--- a/src/cmd/go/testdata/script/work_env.txt
+++ b/src/cmd/go/testdata/script/work_env.txt
@@ -1,7 +1,7 @@
 go env GOWORK
 stdout '^'$GOPATH'[\\/]src[\\/]go.work$'
 go env
-stdout '^(set )?GOWORK="?'$GOPATH'[\\/]src[\\/]go.work"?$'
+stdout '^(set )?GOWORK=''?'$GOPATH'[\\/]src[\\/]go.work''?$'
 
 cd ..
 go env GOWORK
diff --git a/src/cmd/go/testdata/script/work_get_toolchain.txt b/src/cmd/go/testdata/script/work_get_toolchain.txt
new file mode 100644
index 0000000..5a851bb
--- /dev/null
+++ b/src/cmd/go/testdata/script/work_get_toolchain.txt
@@ -0,0 +1,24 @@
+# go get should update the go and toolchain lines in go.work
+env TESTGO_VERSION=go1.21
+env TESTGO_VERSION_SWITCH=switch
+env GOTOOLCHAIN=auto
+cp go.mod.new go.mod
+cp go.work.new go.work
+go get rsc.io/needgo121 rsc.io/needgo122 rsc.io/needgo123 rsc.io/needall
+stderr '^go: rsc.io/needall@v0.0.1 requires go >= 1.23; switching to go1.23.9$'
+stderr '^go: added rsc.io/needall v0.0.1'
+grep 'go 1.23$' go.mod
+grep 'go 1.23$' go.work
+grep 'toolchain go1.23.9' go.mod
+grep 'toolchain go1.23.9' go.work
+
+-- go.mod.new --
+module m
+go 1.1
+
+-- p.go --
+package p
+
+-- go.work.new --
+go 1.18
+use .
diff --git a/src/cmd/go/testdata/script/work_goline_order.txt b/src/cmd/go/testdata/script/work_goline_order.txt
new file mode 100644
index 0000000..fe1cddb
--- /dev/null
+++ b/src/cmd/go/testdata/script/work_goline_order.txt
@@ -0,0 +1,34 @@
+# Check that go line in go.work is always >= go line of used modules.
+
+# Using an old Go version, fails during module loading, but we rewrite the error to the
+# same one a switching version would use, without the auto-switch.
+# This is a misconfigured system that should not arise in practice.
+env TESTGO_VERSION=go1.21.1
+env TESTGO_VERSION_SWITCH=switch
+cp go.work go.work.orig
+! go list
+stderr '^go: module . listed in go.work file requires go >= 1.21.2, but go.work lists go 1.21.1; to update it:\n\tgo work use$'
+go work use
+go list
+
+# Using a new enough Go version, fails later and can suggest 'go work use'.
+env TESTGO_VERSION=go1.21.2
+env TESTGO_VERSION_SWITCH=switch
+cp go.work.orig go.work
+! go list
+stderr '^go: module . listed in go.work file requires go >= 1.21.2, but go.work lists go 1.21.1; to update it:\n\tgo work use$'
+
+# go work use fixes the problem.
+go work use
+go list
+
+-- go.work --
+go 1.21.1
+use .
+
+-- go.mod --
+module m
+go 1.21.2
+
+-- p.go --
+package p
diff --git a/src/cmd/go/testdata/script/work_init_toolchain.txt b/src/cmd/go/testdata/script/work_init_toolchain.txt
new file mode 100644
index 0000000..900ea2c
--- /dev/null
+++ b/src/cmd/go/testdata/script/work_init_toolchain.txt
@@ -0,0 +1,35 @@
+
+# Create basic modules and work space.
+# Note that toolchain lines in modules should be completely ignored.
+env TESTGO_VERSION=go1.50
+mkdir m1_22_0
+go mod init -C m1_22_0
+go mod edit -C m1_22_0 -go=1.22.0 -toolchain=go1.99.0
+
+# work init writes the current Go version to the go line
+go work init
+grep '^go 1.50$' go.work
+! grep toolchain go.work
+
+# work init with older modules should leave go 1.50 in the go.work.
+rm go.work
+go work init ./m1_22_0
+grep '^go 1.50$' go.work
+! grep toolchain go.work
+
+# work init with newer modules should bump go,
+# including updating to a newer toolchain as needed.
+# Because work init writes the current toolchain as the go version,
+# it writes the bumped go version, not the max of the used modules.
+env TESTGO_VERSION=go1.21
+env TESTGO_VERSION_SWITCH=switch
+rm go.work
+env GOTOOLCHAIN=local
+! go work init ./m1_22_0
+stderr '^go: m1_22_0'${/}'go.mod requires go >= 1.22.0 \(running go 1.21; GOTOOLCHAIN=local\)$'
+env GOTOOLCHAIN=auto
+go work init ./m1_22_0
+stderr '^go: m1_22_0'${/}'go.mod requires go >= 1.22.0; switching to go1.22.9$'
+cat go.work
+grep '^go 1.22.9$' go.work
+! grep toolchain go.work
diff --git a/src/cmd/go/testdata/script/work_issue54372.txt b/src/cmd/go/testdata/script/work_issue54372.txt
new file mode 100644
index 0000000..bd3108a
--- /dev/null
+++ b/src/cmd/go/testdata/script/work_issue54372.txt
@@ -0,0 +1,37 @@
+# go mod verify should not try to verify the workspace modules.
+# This is a test for #54372.
+
+go mod verify
+stdout 'all modules verified'
+! stderr .
+
+-- go.work --
+go 1.21
+
+use (
+    ./a
+    ./b
+    ./c
+    ./d
+)
+-- a/go.mod --
+module example.com/a
+
+go 1.21
+
+require rsc.io/quote v1.1.0
+-- a/a.go --
+package a
+import _ "rsc.io/quote"
+-- b/go.mod --
+module example.com/b
+
+go 1.21
+-- c/go.mod --
+module example.com/c
+
+go 1.21
+-- d/go.mod --
+module example.com/d
+
+go 1.21
\ No newline at end of file
diff --git a/src/cmd/go/testdata/script/work_reject_modfile.txt b/src/cmd/go/testdata/script/work_reject_modfile.txt
new file mode 100644
index 0000000..f0cfa3b
--- /dev/null
+++ b/src/cmd/go/testdata/script/work_reject_modfile.txt
@@ -0,0 +1,34 @@
+# Test that -modfile=path/to/go.mod is rejected in workspace mode.
+
+! go list -m -modfile=./a/go.alt.mod
+stderr 'go: -modfile cannot be used in workspace mode'
+
+env GOFLAGS=-modfile=./a/go.alt.mod
+! go list -m
+stderr 'go: -modfile cannot be used in workspace mode'
+
+-- go.work --
+go 1.20
+
+use (
+    ./a
+)
+
+-- a/go.mod --
+module example.com/foo
+
+go 1.20
+
+-- a/go.alt.mod --
+module example.com/foo
+
+go 1.20
+
+-- a/main.go --
+package main
+
+import "fmt"
+
+func main() {
+	fmt.Println("Hello world!")
+}
diff --git a/src/cmd/go/testdata/script/work_sync_toolchain.txt b/src/cmd/go/testdata/script/work_sync_toolchain.txt
new file mode 100644
index 0000000..b752462
--- /dev/null
+++ b/src/cmd/go/testdata/script/work_sync_toolchain.txt
@@ -0,0 +1,45 @@
+# Create basic modules and work space.
+env TESTGO_VERSION=go1.50
+mkdir m1_22_0
+go mod init -C m1_22_0
+go mod edit -C m1_22_0 -go=1.22.0 -toolchain=go1.99.0
+mkdir m1_22_1
+go mod init -C m1_22_1
+go mod edit -C m1_22_1 -go=1.22.1 -toolchain=go1.99.1
+mkdir m1_24_rc0
+go mod init -C m1_24_rc0
+go mod edit -C m1_24_rc0 -go=1.24rc0 -toolchain=go1.99.2
+
+go work init ./m1_22_0 ./m1_22_1
+grep '^go 1.50$' go.work
+! grep toolchain go.work
+
+# work sync with older modules should leave go 1.50 in the go.work.
+go work sync
+cat go.work
+grep '^go 1.50$' go.work
+! grep toolchain go.work
+
+# work sync with newer modules should update go 1.21 -> 1.22.1 and toolchain -> go1.22.9 in go.work
+env TESTGO_VERSION=go1.21
+env TESTGO_VERSION_SWITCH=switch
+go work edit -go=1.21
+grep '^go 1.21$' go.work
+! grep toolchain go.work
+env GOTOOLCHAIN=local
+! go work sync
+stderr '^go: cannot load module m1_22_0 listed in go.work file: m1_22_0'${/}'go.mod requires go >= 1.22.0 \(running go 1.21; GOTOOLCHAIN=local\)$'
+stderr '^go: cannot load module m1_22_1 listed in go.work file: m1_22_1'${/}'go.mod requires go >= 1.22.1 \(running go 1.21; GOTOOLCHAIN=local\)$'
+env GOTOOLCHAIN=auto
+go work sync
+stderr '^go: m1_22_1'${/}'go.mod requires go >= 1.22.1; switching to go1.22.9$'
+grep '^go 1.22.1$' go.work
+grep '^toolchain go1.22.9$' go.work
+
+# work sync with newer modules should update go 1.22.1 -> 1.24rc1 and drop toolchain
+go work edit -use=./m1_24_rc0
+go work sync
+stderr '^go: m1_24_rc0'${/}'go.mod requires go >= 1.24rc0; switching to go1.24rc1$'
+cat go.work
+grep '^go 1.24rc0$' go.work
+grep '^toolchain go1.24rc1$' go.work
diff --git a/src/cmd/go/testdata/script/work_use.txt b/src/cmd/go/testdata/script/work_use.txt
index 12c8cec..7470899 100644
--- a/src/cmd/go/testdata/script/work_use.txt
+++ b/src/cmd/go/testdata/script/work_use.txt
@@ -1,6 +1,10 @@
 go work use -r foo
 cmp go.work go.want_work_r
 
+! go work use other
+stderr '^go: error reading other'${/}'go.mod: missing module declaration'
+
+go mod edit -C other -module=other
 go work use other
 cmp go.work go.want_work_other
 -- go.work --
diff --git a/src/cmd/go/testdata/script/work_use_issue55952.txt b/src/cmd/go/testdata/script/work_use_issue55952.txt
index 2eef361..befec67 100644
--- a/src/cmd/go/testdata/script/work_use_issue55952.txt
+++ b/src/cmd/go/testdata/script/work_use_issue55952.txt
@@ -1,5 +1,5 @@
 ! go list .
-stderr '^go: cannot load module listed in go\.work file: open .+go\.mod:'
+stderr '^go: cannot load module y listed in go\.work file: open y'${/}'go\.mod:'
 
 -- go.work --
 use ./y
diff --git a/src/cmd/go/testdata/script/work_use_noargs.txt b/src/cmd/go/testdata/script/work_use_noargs.txt
deleted file mode 100644
index ca05434..0000000
--- a/src/cmd/go/testdata/script/work_use_noargs.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-# For now, 'go work use' requires arguments.
-# (Eventually, we may may it implicitly behave like 'go work use .'.
-
-! go work use
-stderr '^go: ''go work use'' requires one or more directory arguments'
-
-! go work use -r
-stderr '^go: ''go work use'' requires one or more directory arguments'
-
--- go.work --
-go 1.18
diff --git a/src/cmd/go/testdata/script/work_use_only_dirs.txt b/src/cmd/go/testdata/script/work_use_only_dirs.txt
index aa6dd78..5d0fcdd 100644
--- a/src/cmd/go/testdata/script/work_use_only_dirs.txt
+++ b/src/cmd/go/testdata/script/work_use_only_dirs.txt
@@ -1,11 +1,11 @@
 ! go work use foo bar baz
 
-stderr '^go: '$WORK'[/\\]gopath[/\\]src[/\\]foo is not a directory'
-stderr '^go: directory '$WORK'[/\\]gopath[/\\]src[/\\]baz does not exist'
+stderr '^go: foo is not a directory'
+stderr '^go: directory baz does not exist'
 cmp go.work go.work_want
 
 ! go work use -r qux
-stderr '^go: '$WORK'[/\\]gopath[/\\]src[/\\]qux is not a directory'
+stderr '^go: qux is not a directory'
 
 -- go.work --
 go 1.18
@@ -14,4 +14,4 @@
 -- foo --
 -- qux --
 -- bar/go.mod --
-module bar
\ No newline at end of file
+module bar
diff --git a/src/cmd/go/testdata/script/work_use_toolchain.txt b/src/cmd/go/testdata/script/work_use_toolchain.txt
new file mode 100644
index 0000000..bb3db9c
--- /dev/null
+++ b/src/cmd/go/testdata/script/work_use_toolchain.txt
@@ -0,0 +1,51 @@
+# Create basic modules and work space.
+env TESTGO_VERSION=go1.50
+mkdir m1_22_0
+go mod init -C m1_22_0
+go mod edit -C m1_22_0 -go=1.22.0 -toolchain=go1.99.0
+mkdir m1_22_1
+go mod init -C m1_22_1
+go mod edit -C m1_22_1 -go=1.22.1 -toolchain=go1.99.1
+mkdir m1_24_rc0
+go mod init -C m1_24_rc0
+go mod edit -C m1_24_rc0 -go=1.24rc0 -toolchain=go1.99.2
+
+go work init
+grep '^go 1.50$' go.work
+! grep toolchain go.work
+
+# work use with older modules should leave go 1.50 in the go.work.
+go work use ./m1_22_0
+grep '^go 1.50$' go.work
+! grep toolchain go.work
+
+# work use with newer modules should bump go and toolchain,
+# including updating to a newer toolchain as needed.
+env TESTGO_VERSION=go1.21
+env TESTGO_VERSION_SWITCH=switch
+rm go.work
+go work init
+env GOTOOLCHAIN=local
+! go work use ./m1_22_0
+stderr '^go: m1_22_0'${/}'go.mod requires go >= 1.22.0 \(running go 1.21; GOTOOLCHAIN=local\)$'
+env GOTOOLCHAIN=auto
+go work use ./m1_22_0
+stderr '^go: m1_22_0'${/}'go.mod requires go >= 1.22.0; switching to go1.22.9$'
+grep '^go 1.22.0$' go.work
+grep '^toolchain go1.22.9$' go.work
+
+# work use with an even newer module should bump go again.
+go work use ./m1_22_1
+! stderr switching
+grep '^go 1.22.1$' go.work
+grep '^toolchain go1.22.9$' go.work  # unchanged
+
+# work use with an even newer module should bump go and toolchain again.
+env GOTOOLCHAIN=go1.22.9
+! go work use ./m1_24_rc0
+stderr '^go: m1_24_rc0'${/}'go.mod requires go >= 1.24rc0 \(running go 1.22.9; GOTOOLCHAIN=go1.22.9\)$'
+env GOTOOLCHAIN=auto
+go work use ./m1_24_rc0
+stderr '^go: m1_24_rc0'${/}'go.mod requires go >= 1.24rc0; switching to go1.24rc1$'
+grep '^go 1.24rc0$' go.work
+grep '^toolchain go1.24rc1$' go.work
diff --git a/src/cmd/go/testdata/script/work_vet.txt b/src/cmd/go/testdata/script/work_vet.txt
index e258fc0..f95cadd 100644
--- a/src/cmd/go/testdata/script/work_vet.txt
+++ b/src/cmd/go/testdata/script/work_vet.txt
@@ -1,5 +1,5 @@
 ! go vet ./a
-stderr 'fmt.Println call has possible formatting directive'
+stderr 'fmt.Println call has possible Printf formatting directive'
 
 -- go.work --
 go 1.18
diff --git a/src/cmd/gofmt/gofmt.go b/src/cmd/gofmt/gofmt.go
index e464d64..f4fb6bf 100644
--- a/src/cmd/gofmt/gofmt.go
+++ b/src/cmd/gofmt/gofmt.go
@@ -17,10 +17,12 @@
 	"internal/diff"
 	"io"
 	"io/fs"
+	"math/rand"
 	"os"
 	"path/filepath"
 	"runtime"
 	"runtime/pprof"
+	"strconv"
 	"strings"
 
 	"golang.org/x/sync/semaphore"
@@ -233,12 +235,9 @@
 	}
 
 	fileSet := token.NewFileSet()
-	fragmentOk := false
-	if info == nil {
-		// If we are formatting stdin, we accept a program fragment in lieu of a
-		// complete source file.
-		fragmentOk = true
-	}
+	// If we are formatting stdin, we accept a program fragment in lieu of a
+	// complete source file.
+	fragmentOk := info == nil
 	file, sourceAdj, indentAdj, err := parse(fileSet, filename, src, fragmentOk)
 	if err != nil {
 		return err
@@ -272,21 +271,9 @@
 			if info == nil {
 				panic("-w should not have been allowed with stdin")
 			}
-			// make a temporary backup before overwriting original
+
 			perm := info.Mode().Perm()
-			bakname, err := backupFile(filename+".", src, perm)
-			if err != nil {
-				return err
-			}
-			fdSem <- true
-			err = os.WriteFile(filename, res, perm)
-			<-fdSem
-			if err != nil {
-				os.Rename(bakname, filename)
-				return err
-			}
-			err = os.Remove(bakname)
-			if err != nil {
+			if err := writeFile(filename, src, res, perm, info.Size()); err != nil {
 				return err
 			}
 		}
@@ -470,32 +457,111 @@
 	return info.Size()
 }
 
-const chmodSupported = runtime.GOOS != "windows"
+// writeFile updates a file with the new formatted data.
+func writeFile(filename string, orig, formatted []byte, perm fs.FileMode, size int64) error {
+	// Make a temporary backup file before rewriting the original file.
+	bakname, err := backupFile(filename, orig, perm)
+	if err != nil {
+		return err
+	}
+
+	fdSem <- true
+	defer func() { <-fdSem }()
+
+	fout, err := os.OpenFile(filename, os.O_WRONLY, perm)
+	if err != nil {
+		// We couldn't even open the file, so it should
+		// not have changed.
+		os.Remove(bakname)
+		return err
+	}
+	defer fout.Close() // for error paths
+
+	restoreFail := func(err error) {
+		fmt.Fprintf(os.Stderr, "gofmt: %s: error restoring file to original: %v; backup in %s\n", filename, err, bakname)
+	}
+
+	n, err := fout.Write(formatted)
+	if err == nil && int64(n) < size {
+		err = fout.Truncate(int64(n))
+	}
+
+	if err != nil {
+		// Rewriting the file failed.
+
+		if n == 0 {
+			// Original file unchanged.
+			os.Remove(bakname)
+			return err
+		}
+
+		// Try to restore the original contents.
+
+		no, erro := fout.WriteAt(orig, 0)
+		if erro != nil {
+			// That failed too.
+			restoreFail(erro)
+			return err
+		}
+
+		if no < n {
+			// Original file is shorter. Truncate.
+			if erro = fout.Truncate(int64(no)); erro != nil {
+				restoreFail(erro)
+				return err
+			}
+		}
+
+		if erro := fout.Close(); erro != nil {
+			restoreFail(erro)
+			return err
+		}
+
+		// Original contents restored.
+		os.Remove(bakname)
+		return err
+	}
+
+	if err := fout.Close(); err != nil {
+		restoreFail(err)
+		return err
+	}
+
+	// File updated.
+	os.Remove(bakname)
+	return nil
+}
 
 // backupFile writes data to a new file named filename<number> with permissions perm,
-// with <number randomly chosen such that the file name is unique. backupFile returns
+// with <number> randomly chosen such that the file name is unique. backupFile returns
 // the chosen file name.
 func backupFile(filename string, data []byte, perm fs.FileMode) (string, error) {
 	fdSem <- true
 	defer func() { <-fdSem }()
 
-	// create backup file
-	f, err := os.CreateTemp(filepath.Dir(filename), filepath.Base(filename))
-	if err != nil {
-		return "", err
+	nextRandom := func() string {
+		return strconv.Itoa(rand.Int())
 	}
-	bakname := f.Name()
-	if chmodSupported {
-		err = f.Chmod(perm)
-		if err != nil {
-			f.Close()
-			os.Remove(bakname)
-			return bakname, err
+
+	dir, base := filepath.Split(filename)
+	var (
+		bakname string
+		f       *os.File
+	)
+	for {
+		bakname = filepath.Join(dir, base+"."+nextRandom())
+		var err error
+		f, err = os.OpenFile(bakname, os.O_RDWR|os.O_CREATE|os.O_EXCL, perm)
+		if err == nil {
+			break
+		}
+		if err != nil && !os.IsExist(err) {
+			return "", err
 		}
 	}
 
 	// write data to backup file
-	_, err = f.Write(data)
+	_, err := f.Write(data)
 	if err1 := f.Close(); err == nil {
 		err = err1
 	}
diff --git a/src/cmd/gofmt/gofmt_unix_test.go b/src/cmd/gofmt/gofmt_unix_test.go
new file mode 100644
index 0000000..fec5143
--- /dev/null
+++ b/src/cmd/gofmt/gofmt_unix_test.go
@@ -0,0 +1,67 @@
+// Copyright 2023 The Go 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:build unix
+
+package main
+
+import (
+	"os"
+	"path/filepath"
+	"strings"
+	"testing"
+	"time"
+)
+
+func TestPermissions(t *testing.T) {
+	if os.Getuid() == 0 {
+		t.Skip("skipping permission test when running as root")
+	}
+
+	dir := t.TempDir()
+	fn := filepath.Join(dir, "perm.go")
+
+	// Create a file that needs formatting without write permission.
+	if err := os.WriteFile(filepath.Join(fn), []byte("  package main"), 0o400); err != nil {
+		t.Fatal(err)
+	}
+
+	// Set mtime of the file in the past.
+	past := time.Now().Add(-time.Hour)
+	if err := os.Chtimes(fn, past, past); err != nil {
+		t.Fatal(err)
+	}
+
+	info, err := os.Stat(fn)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	defer func() { *write = false }()
+	*write = true
+
+	initParserMode()
+	initRewrite()
+
+	const maxWeight = 2 << 20
+	var buf, errBuf strings.Builder
+	s := newSequencer(maxWeight, &buf, &errBuf)
+	s.Add(fileWeight(fn, info), func(r *reporter) error {
+		return processFile(fn, info, nil, r)
+	})
+	if s.GetExitCode() == 0 {
+		t.Fatal("rewrite of read-only file succeeded unexpectedly")
+	}
+	if errBuf.Len() > 0 {
+		t.Log(errBuf)
+	}
+
+	info, err = os.Stat(fn)
+	if err != nil {
+		t.Fatal(err)
+	}
+	if !info.ModTime().Equal(past) {
+		t.Errorf("after rewrite mod time is %v, want %v", info.ModTime(), past)
+	}
+}
diff --git a/src/cmd/gofmt/long_test.go b/src/cmd/gofmt/long_test.go
index 2ee5174..8db348a 100644
--- a/src/cmd/gofmt/long_test.go
+++ b/src/cmd/gofmt/long_test.go
@@ -179,3 +179,7 @@
 func (d *statDirEntry) IsDir() bool                { return d.info.IsDir() }
 func (d *statDirEntry) Type() fs.FileMode          { return d.info.Mode().Type() }
 func (d *statDirEntry) Info() (fs.FileInfo, error) { return d.info, nil }
+
+func (d *statDirEntry) String() string {
+	return fs.FormatDirEntry(d)
+}
diff --git a/src/cmd/internal/archive/archive.go b/src/cmd/internal/archive/archive.go
index d2c4f69..8ac50e2 100644
--- a/src/cmd/internal/archive/archive.go
+++ b/src/cmd/internal/archive/archive.go
@@ -189,7 +189,7 @@
 	return b
 }
 
-// read reads exactly len(b) bytes from the input file.
+// readFull reads exactly len(b) bytes from the input file.
 // If an error occurs, read returns the error but also
 // records it, so it is safe for callers to ignore the result
 // as long as delaying the report is not a problem.
@@ -368,7 +368,10 @@
 			if bytes.Equal(p, goobjHeader) {
 				typ = EntryGoObj
 				o = &GoObj{}
-				r.parseObject(o, size)
+				err := r.parseObject(o, size)
+				if err != nil {
+					return err
+				}
 			} else {
 				typ = EntryNativeObj
 				r.skip(size)
diff --git a/src/cmd/internal/archive/archive_test.go b/src/cmd/internal/archive/archive_test.go
index 0e2c7bc..10a3d6e 100644
--- a/src/cmd/internal/archive/archive_test.go
+++ b/src/cmd/internal/archive/archive_test.go
@@ -113,7 +113,7 @@
 			go2src := filepath.Join("testdata", "go2.go")
 
 			importcfgfile := filepath.Join(buildDir, "importcfg")
-			testenv.WriteImportcfg(t, importcfgfile, nil)
+			testenv.WriteImportcfg(t, importcfgfile, nil, go1src, go2src)
 
 			out, err := testenv.Command(t, gotool, "tool", "compile", "-importcfg="+importcfgfile, "-p=p", "-o", go1obj, go1src).CombinedOutput()
 			if err != nil {
diff --git a/src/cmd/internal/bootstrap_test/experiment_toolid_test.go b/src/cmd/internal/bootstrap_test/experiment_toolid_test.go
new file mode 100644
index 0000000..ff2379c
--- /dev/null
+++ b/src/cmd/internal/bootstrap_test/experiment_toolid_test.go
@@ -0,0 +1,106 @@
+// Copyright 2019 The Go 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:build explicit
+
+package bootstrap_test
+
+import (
+	"bytes"
+	"errors"
+	"internal/testenv"
+	"os"
+	"os/exec"
+	"path/filepath"
+	"runtime"
+	"testing"
+)
+
+// TestExperimentToolID verifies that GOEXPERIMENT settings built
+// into the toolchain influence tool ids in the Go command.
+// This test requires bootstrapping the toolchain twice, so it's very expensive.
+// It must be run explicitly with -tags=explicit.
+// Verifies go.dev/issue/33091.
+func TestExperimentToolID(t *testing.T) {
+	if testing.Short() {
+		t.Skip("skipping test that rebuilds the entire toolchain twice")
+	}
+	switch runtime.GOOS {
+	case "android", "ios", "js", "wasip1":
+		t.Skipf("skipping because the toolchain does not have to bootstrap on GOOS=%s", runtime.GOOS)
+	}
+
+	realGoroot := testenv.GOROOT(t)
+
+	// Set up GOROOT.
+	goroot := t.TempDir()
+	gorootSrc := filepath.Join(goroot, "src")
+	if err := overlayDir(gorootSrc, filepath.Join(realGoroot, "src")); err != nil {
+		t.Fatal(err)
+	}
+	gorootLib := filepath.Join(goroot, "lib")
+	if err := overlayDir(gorootLib, filepath.Join(realGoroot, "lib")); err != nil {
+		t.Fatal(err)
+	}
+	if err := os.WriteFile(filepath.Join(goroot, "VERSION"), []byte("go1.999"), 0666); err != nil {
+		t.Fatal(err)
+	}
+	env := append(os.Environ(), "GOROOT=", "GOROOT_BOOTSTRAP="+realGoroot)
+
+	// Use a clean cache.
+	gocache := t.TempDir()
+	env = append(env, "GOCACHE="+gocache)
+
+	// Build the toolchain without GOEXPERIMENT.
+	var makeScript string
+	switch runtime.GOOS {
+	case "windows":
+		makeScript = "make.bat"
+	case "plan9":
+		makeScript = "make.rc"
+	default:
+		makeScript = "make.bash"
+	}
+	makeScriptPath := filepath.Join(realGoroot, "src", makeScript)
+	runCmd(t, gorootSrc, env, makeScriptPath)
+
+	// Verify compiler version string.
+	goCmdPath := filepath.Join(goroot, "bin", "go")
+	gotVersion := bytes.TrimSpace(runCmd(t, gorootSrc, env, goCmdPath, "tool", "compile", "-V=full"))
+	wantVersion := []byte(`compile version go1.999`)
+	if !bytes.Equal(gotVersion, wantVersion) {
+		t.Errorf("compile version without experiment is unexpected:\ngot  %q\nwant %q", gotVersion, wantVersion)
+	}
+
+	// Build a package in a mode not handled by the make script.
+	runCmd(t, gorootSrc, env, goCmdPath, "build", "-race", "archive/tar")
+
+	// Rebuild the toolchain with GOEXPERIMENT.
+	env = append(env, "GOEXPERIMENT=fieldtrack")
+	runCmd(t, gorootSrc, env, makeScriptPath)
+
+	// Verify compiler version string.
+	gotVersion = bytes.TrimSpace(runCmd(t, gorootSrc, env, goCmdPath, "tool", "compile", "-V=full"))
+	wantVersion = []byte(`compile version go1.999 X:fieldtrack`)
+	if !bytes.Equal(gotVersion, wantVersion) {
+		t.Errorf("compile version with experiment is unexpected:\ngot  %q\nwant %q", gotVersion, wantVersion)
+	}
+
+	// Build the same package. We should not get a cache conflict.
+	runCmd(t, gorootSrc, env, goCmdPath, "build", "-race", "archive/tar")
+}
+
+func runCmd(t *testing.T, dir string, env []string, path string, args ...string) []byte {
+	cmd := exec.Command(path, args...)
+	cmd.Dir = dir
+	cmd.Env = env
+	out, err := cmd.Output()
+	if err != nil {
+		if ee := (*exec.ExitError)(nil); errors.As(err, &ee) {
+			out = append(out, ee.Stderr...)
+		}
+		t.Fatalf("%s failed:\n%s\n%s", cmd, out, err)
+	}
+	return out
+}
diff --git a/src/cmd/internal/bootstrap_test/overlaydir_test.go b/src/cmd/internal/bootstrap_test/overlaydir_test.go
new file mode 100644
index 0000000..5812c45
--- /dev/null
+++ b/src/cmd/internal/bootstrap_test/overlaydir_test.go
@@ -0,0 +1,85 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package bootstrap_test
+
+import (
+	"io"
+	"io/fs"
+	"os"
+	"path/filepath"
+	"strings"
+)
+
+// overlayDir makes a minimal-overhead copy of srcRoot in which new files may be added.
+//
+// TODO: Once we no longer need to support the misc module in GOPATH mode,
+// factor this function out into a package to reduce duplication.
+func overlayDir(dstRoot, srcRoot string) error {
+	dstRoot = filepath.Clean(dstRoot)
+	if err := os.MkdirAll(dstRoot, 0777); err != nil {
+		return err
+	}
+
+	srcRoot, err := filepath.Abs(srcRoot)
+	if err != nil {
+		return err
+	}
+
+	return filepath.WalkDir(srcRoot, func(srcPath string, entry fs.DirEntry, err error) error {
+		if err != nil || srcPath == srcRoot {
+			return err
+		}
+		if filepath.Base(srcPath) == "testdata" {
+			// We're just building, so no need to copy those.
+			return fs.SkipDir
+		}
+
+		suffix := strings.TrimPrefix(srcPath, srcRoot)
+		for len(suffix) > 0 && suffix[0] == filepath.Separator {
+			suffix = suffix[1:]
+		}
+		dstPath := filepath.Join(dstRoot, suffix)
+
+		info, err := entry.Info()
+		perm := info.Mode() & os.ModePerm
+		if info.Mode()&os.ModeSymlink != 0 {
+			info, err = os.Stat(srcPath)
+			if err != nil {
+				return err
+			}
+			perm = info.Mode() & os.ModePerm
+		}
+
+		// Always make copies of directories.
+		// If we add a file in the overlay, we don't want to add it in the original.
+		if info.IsDir() {
+			return os.MkdirAll(dstPath, perm|0200)
+		}
+
+		// If we can use a hard link, do that instead of copying bytes.
+		// Go builds don't like symlinks in some cases, such as go:embed.
+		if err := os.Link(srcPath, dstPath); err == nil {
+			return nil
+		}
+
+		// Otherwise, copy the bytes.
+		src, err := os.Open(srcPath)
+		if err != nil {
+			return err
+		}
+		defer src.Close()
+
+		dst, err := os.OpenFile(dstPath, os.O_WRONLY|os.O_CREATE|os.O_EXCL, perm)
+		if err != nil {
+			return err
+		}
+
+		_, err = io.Copy(dst, src)
+		if closeErr := dst.Close(); err == nil {
+			err = closeErr
+		}
+		return err
+	})
+}
diff --git a/src/cmd/internal/bootstrap_test/reboot_test.go b/src/cmd/internal/bootstrap_test/reboot_test.go
new file mode 100644
index 0000000..fedf58c
--- /dev/null
+++ b/src/cmd/internal/bootstrap_test/reboot_test.go
@@ -0,0 +1,98 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package bootstrap_test verifies that the current GOROOT can be used to bootstrap
+// itself.
+package bootstrap_test
+
+import (
+	"fmt"
+	"internal/testenv"
+	"io"
+	"os"
+	"os/exec"
+	"path/filepath"
+	"runtime"
+	"strings"
+	"testing"
+	"time"
+)
+
+func TestRepeatBootstrap(t *testing.T) {
+	if testing.Short() {
+		t.Skip("skipping test that rebuilds the entire toolchain")
+	}
+	switch runtime.GOOS {
+	case "android", "ios", "js", "wasip1":
+		t.Skipf("skipping because the toolchain does not have to bootstrap on GOOS=%s", runtime.GOOS)
+	}
+
+	realGoroot := testenv.GOROOT(t)
+
+	// To ensure that bootstrapping doesn't unexpectedly depend
+	// on the Go repo's git metadata, add a fake (unreadable) git
+	// directory above the simulated GOROOT.
+	// This mimics the configuration one much have when
+	// building from distro-packaged source code
+	// (see https://go.dev/issue/54852).
+	parent := t.TempDir()
+	dotGit := filepath.Join(parent, ".git")
+	if err := os.Mkdir(dotGit, 000); err != nil {
+		t.Fatal(err)
+	}
+
+	overlayStart := time.Now()
+
+	goroot := filepath.Join(parent, "goroot")
+
+	gorootSrc := filepath.Join(goroot, "src")
+	if err := overlayDir(gorootSrc, filepath.Join(realGoroot, "src")); err != nil {
+		t.Fatal(err)
+	}
+
+	gorootLib := filepath.Join(goroot, "lib")
+	if err := overlayDir(gorootLib, filepath.Join(realGoroot, "lib")); err != nil {
+		t.Fatal(err)
+	}
+
+	t.Logf("GOROOT overlay set up in %s", time.Since(overlayStart))
+
+	if err := os.WriteFile(filepath.Join(goroot, "VERSION"), []byte(runtime.Version()), 0666); err != nil {
+		t.Fatal(err)
+	}
+
+	var makeScript string
+	switch runtime.GOOS {
+	case "windows":
+		makeScript = "make.bat"
+	case "plan9":
+		makeScript = "make.rc"
+	default:
+		makeScript = "make.bash"
+	}
+
+	var stdout strings.Builder
+	cmd := exec.Command(filepath.Join(goroot, "src", makeScript))
+	cmd.Dir = gorootSrc
+	cmd.Env = append(cmd.Environ(), "GOROOT=", "GOROOT_FINAL=", "GOROOT_BOOTSTRAP="+realGoroot)
+	cmd.Stderr = os.Stderr
+	cmd.Stdout = io.MultiWriter(os.Stdout, &stdout)
+	if err := cmd.Run(); err != nil {
+		t.Fatal(err)
+	}
+
+	// Test that go.dev/issue/42563 hasn't regressed.
+	t.Run("PATH reminder", func(t *testing.T) {
+		var want string
+		switch gorootBin := filepath.Join(goroot, "bin"); runtime.GOOS {
+		default:
+			want = fmt.Sprintf("*** You need to add %s to your PATH.", gorootBin)
+		case "plan9":
+			want = fmt.Sprintf("*** You need to bind %s before /bin.", gorootBin)
+		}
+		if got := stdout.String(); !strings.Contains(got, want) {
+			t.Errorf("reminder %q is missing from %s stdout:\n%s", want, makeScript, got)
+		}
+	})
+}
diff --git a/src/cmd/internal/cov/read_test.go b/src/cmd/internal/cov/read_test.go
index cef03fa..fa2151a 100644
--- a/src/cmd/internal/cov/read_test.go
+++ b/src/cmd/internal/cov/read_test.go
@@ -11,6 +11,7 @@
 	"internal/coverage/decodecounter"
 	"internal/coverage/decodemeta"
 	"internal/coverage/pods"
+	"internal/goexperiment"
 	"internal/testenv"
 	"os"
 	"path/filepath"
@@ -44,6 +45,9 @@
 
 func TestIssue58411(t *testing.T) {
 	testenv.MustHaveGoBuild(t)
+	if !goexperiment.CoverageRedesign {
+		t.Skipf("skipping since this test requires 'go build -cover'")
+	}
 
 	// Build a tiny test program with -cover. Smallness is important;
 	// it is one of the factors that triggers issue 58411.
diff --git a/src/cmd/internal/cov/readcovdata.go b/src/cmd/internal/cov/readcovdata.go
index 7e90e9e..086be40 100644
--- a/src/cmd/internal/cov/readcovdata.go
+++ b/src/cmd/internal/cov/readcovdata.go
@@ -108,7 +108,7 @@
 	EndCounters()
 
 	// Invoked for each package in the meta-data file for the pod,
-	// first the 'begin' method when processinf of hte package starts,
+	// first the 'begin' method when processing of the package starts,
 	// then the 'end' method when we're done
 	BeginPackage(pd *decodemeta.CoverageMetaDataDecoder, pkgIdx uint32)
 	EndPackage(pd *decodemeta.CoverageMetaDataDecoder, pkgIdx uint32)
diff --git a/src/cmd/internal/dwarf/dwarf.go b/src/cmd/internal/dwarf/dwarf.go
index a6d19c6..d4a4e33 100644
--- a/src/cmd/internal/dwarf/dwarf.go
+++ b/src/cmd/internal/dwarf/dwarf.go
@@ -94,6 +94,7 @@
 	Absfn         Sym
 	StartPC       Sym
 	Size          int64
+	StartLine     int32
 	External      bool
 	Scopes        []Scope
 	InlCalls      InlCalls
@@ -458,6 +459,7 @@
 			{DW_AT_high_pc, DW_FORM_addr},
 			{DW_AT_frame_base, DW_FORM_block1},
 			{DW_AT_decl_file, DW_FORM_data4},
+			{DW_AT_decl_line, DW_FORM_udata},
 			{DW_AT_external, DW_FORM_flag},
 		},
 	},
@@ -482,6 +484,7 @@
 		[]dwAttrForm{
 			{DW_AT_name, DW_FORM_string},
 			{DW_AT_inline, DW_FORM_data1},
+			{DW_AT_decl_line, DW_FORM_udata},
 			{DW_AT_external, DW_FORM_flag},
 		},
 	},
@@ -1254,6 +1257,8 @@
 	// DW_AT_inlined value
 	putattr(ctxt, s.Absfn, abbrev, DW_FORM_data1, DW_CLS_CONSTANT, int64(DW_INL_inlined), nil)
 
+	putattr(ctxt, s.Absfn, abbrev, DW_FORM_udata, DW_CLS_CONSTANT, int64(s.StartLine), nil)
+
 	var ev int64
 	if s.External {
 		ev = 1
@@ -1446,6 +1451,8 @@
 		putattr(ctxt, s.Info, abbrev, DW_FORM_flag, DW_CLS_FLAG, int64(1), 0)
 	} else {
 		ctxt.AddFileRef(s.Info, s.Filesym)
+		putattr(ctxt, s.Info, abbrev, DW_FORM_udata, DW_CLS_CONSTANT, int64(s.StartLine), nil)
+
 		var ev int64
 		if s.External {
 			ev = 1
diff --git a/src/cmd/internal/goobj/builtinlist.go b/src/cmd/internal/goobj/builtinlist.go
index ae2e6cc..883e13d 100644
--- a/src/cmd/internal/goobj/builtinlist.go
+++ b/src/cmd/internal/goobj/builtinlist.go
@@ -66,15 +66,13 @@
 	{"runtime.decoderune", 1},
 	{"runtime.countrunes", 1},
 	{"runtime.convI2I", 1},
+	{"runtime.convT", 1},
+	{"runtime.convTnoptr", 1},
 	{"runtime.convT16", 1},
 	{"runtime.convT32", 1},
 	{"runtime.convT64", 1},
 	{"runtime.convTstring", 1},
 	{"runtime.convTslice", 1},
-	{"runtime.convT2E", 1},
-	{"runtime.convT2Enoptr", 1},
-	{"runtime.convT2I", 1},
-	{"runtime.convT2Inoptr", 1},
 	{"runtime.assertE2I", 1},
 	{"runtime.assertE2I2", 1},
 	{"runtime.assertI2I", 1},
@@ -130,8 +128,13 @@
 	{"runtime.makeslice64", 1},
 	{"runtime.makeslicecopy", 1},
 	{"runtime.growslice", 1},
-	{"runtime.unsafeslice", 1},
-	{"runtime.unsafeslice64", 1},
+	{"runtime.unsafeslicecheckptr", 1},
+	{"runtime.panicunsafeslicelen", 1},
+	{"runtime.panicunsafeslicenilptr", 1},
+	{"runtime.unsafestringcheckptr", 1},
+	{"runtime.panicunsafestringlen", 1},
+	{"runtime.panicunsafestringnilptr", 1},
+	{"runtime.mulUintptr", 1},
 	{"runtime.memmove", 1},
 	{"runtime.memclrNoHeapPointers", 1},
 	{"runtime.memclrHasPointers", 1},
@@ -171,7 +174,9 @@
 	{"runtime.float64touint64", 1},
 	{"runtime.float64touint32", 1},
 	{"runtime.int64tofloat64", 1},
+	{"runtime.int64tofloat32", 1},
 	{"runtime.uint64tofloat64", 1},
+	{"runtime.uint64tofloat32", 1},
 	{"runtime.uint32tofloat64", 1},
 	{"runtime.complex128div", 1},
 	{"runtime.getcallerpc", 1},
@@ -185,6 +190,8 @@
 	{"runtime.msanread", 1},
 	{"runtime.msanwrite", 1},
 	{"runtime.msanmove", 1},
+	{"runtime.asanread", 1},
+	{"runtime.asanwrite", 1},
 	{"runtime.checkptrAlignment", 1},
 	{"runtime.checkptrArithmetic", 1},
 	{"runtime.libfuzzerTraceCmp1", 1},
@@ -197,6 +204,7 @@
 	{"runtime.libfuzzerTraceConstCmp8", 1},
 	{"runtime.libfuzzerHookStrCmp", 1},
 	{"runtime.libfuzzerHookEqualFold", 1},
+	{"runtime.addCovMeta", 1},
 	{"runtime.x86HasPOPCNT", 0},
 	{"runtime.x86HasSSE41", 0},
 	{"runtime.x86HasFMA", 0},
diff --git a/src/cmd/internal/goobj/funcinfo.go b/src/cmd/internal/goobj/funcinfo.go
index fbcf9d9..9aa1188 100644
--- a/src/cmd/internal/goobj/funcinfo.go
+++ b/src/cmd/internal/goobj/funcinfo.go
@@ -6,8 +6,8 @@
 
 import (
 	"bytes"
-	"cmd/internal/objabi"
 	"encoding/binary"
+	"internal/abi"
 )
 
 // CUFileIndex is used to index the filenames that are stored in the
@@ -19,8 +19,8 @@
 type FuncInfo struct {
 	Args      uint32
 	Locals    uint32
-	FuncID    objabi.FuncID
-	FuncFlag  objabi.FuncFlag
+	FuncID    abi.FuncID
+	FuncFlag  abi.FuncFlag
 	StartLine int32
 	File      []CUFileIndex
 	InlTree   []InlTreeNode
@@ -89,9 +89,9 @@
 
 func (*FuncInfo) ReadLocals(b []byte) uint32 { return binary.LittleEndian.Uint32(b[4:]) }
 
-func (*FuncInfo) ReadFuncID(b []byte) objabi.FuncID { return objabi.FuncID(b[8]) }
+func (*FuncInfo) ReadFuncID(b []byte) abi.FuncID { return abi.FuncID(b[8]) }
 
-func (*FuncInfo) ReadFuncFlag(b []byte) objabi.FuncFlag { return objabi.FuncFlag(b[9]) }
+func (*FuncInfo) ReadFuncFlag(b []byte) abi.FuncFlag { return abi.FuncFlag(b[9]) }
 
 func (*FuncInfo) ReadStartLine(b []byte) int32 { return int32(binary.LittleEndian.Uint32(b[12:])) }
 
diff --git a/src/cmd/internal/goobj/mkbuiltin.go b/src/cmd/internal/goobj/mkbuiltin.go
index 57e39dc..aefb19b 100644
--- a/src/cmd/internal/goobj/mkbuiltin.go
+++ b/src/cmd/internal/goobj/mkbuiltin.go
@@ -53,7 +53,7 @@
 func mkbuiltin(w io.Writer) {
 	pkg := "runtime"
 	fset := token.NewFileSet()
-	path := filepath.Join("..", "..", "compile", "internal", "typecheck", "builtin", "runtime.go")
+	path := filepath.Join("..", "..", "compile", "internal", "typecheck", "_builtin", "runtime.go")
 	f, err := parser.ParseFile(fset, path, nil, 0)
 	if err != nil {
 		log.Fatal(err)
diff --git a/src/cmd/internal/goobj/objfile.go b/src/cmd/internal/goobj/objfile.go
index ae215df..c9d7ca4 100644
--- a/src/cmd/internal/goobj/objfile.go
+++ b/src/cmd/internal/goobj/objfile.go
@@ -134,7 +134,7 @@
 // - If PkgIdx is PkgIdxHashed, SymIdx is the index of the symbol in the
 //   HashedDefs array.
 // - If PkgIdx is PkgIdxNone, SymIdx is the index of the symbol in the
-//   NonPkgDefs array (could natually overflow to NonPkgRefs array).
+//   NonPkgDefs array (could naturally overflow to NonPkgRefs array).
 // - Otherwise, SymIdx is the index of the symbol in some other package's
 //   SymbolDefs array.
 //
@@ -303,6 +303,7 @@
 	SymFlagUsedInIface = 1 << iota
 	SymFlagItab
 	SymFlagDict
+	SymFlagPkgInit
 )
 
 // Returns the length of the name of the symbol.
@@ -333,6 +334,7 @@
 func (s *Sym) UsedInIface() bool   { return s.Flag2()&SymFlagUsedInIface != 0 }
 func (s *Sym) IsItab() bool        { return s.Flag2()&SymFlagItab != 0 }
 func (s *Sym) IsDict() bool        { return s.Flag2()&SymFlagDict != 0 }
+func (s *Sym) IsPkgInit() bool     { return s.Flag2()&SymFlagPkgInit != 0 }
 
 func (s *Sym) SetName(x string, w *Writer) {
 	binary.LittleEndian.PutUint32(s[:], uint32(len(x)))
@@ -440,6 +442,8 @@
 	AuxPcline
 	AuxPcinline
 	AuxPcdata
+	AuxWasmImport
+	AuxSehUnwindInfo
 )
 
 func (a *Aux) Type() uint8 { return a[0] }
@@ -849,6 +853,15 @@
 	return r.BytesAt(base+off, int(end-off))
 }
 
+// DataString returns the i-th symbol's data as a string.
+func (r *Reader) DataString(i uint32) string {
+	dataIdxOff := r.h.Offsets[BlkDataIdx] + i*4
+	base := r.h.Offsets[BlkData]
+	off := r.uint32At(dataIdxOff)
+	end := r.uint32At(dataIdxOff + 4)
+	return r.StringAt(base+off, end-off)
+}
+
 // NRefName returns the number of referenced symbol names.
 func (r *Reader) NRefName() int {
 	return int(r.h.Offsets[BlkRefName+1]-r.h.Offsets[BlkRefName]) / RefNameSize
diff --git a/src/cmd/internal/moddeps/moddeps_test.go b/src/cmd/internal/moddeps/moddeps_test.go
index 4122064..ae890b6 100644
--- a/src/cmd/internal/moddeps/moddeps_test.go
+++ b/src/cmd/internal/moddeps/moddeps_test.go
@@ -13,6 +13,8 @@
 	"io/fs"
 	"os"
 	"path/filepath"
+	"slices"
+	"sort"
 	"strings"
 	"sync"
 	"testing"
@@ -48,13 +50,15 @@
 		// This short test does NOT ensure that the vendored contents match
 		// the unmodified contents of the corresponding dependency versions.
 		t.Run(m.Path+"(quick)", func(t *testing.T) {
+			t.Logf("module %s in directory %s", m.Path, m.Dir)
+
 			if m.hasVendor {
 				// Load all of the packages in the module to ensure that their
 				// dependencies are vendored. If any imported package is missing,
 				// 'go list -deps' will fail when attempting to load it.
 				cmd := testenv.Command(t, goBin, "list", "-mod=vendor", "-deps", "./...")
-				cmd.Env = append(os.Environ(), "GO111MODULE=on", "GOWORK=off")
 				cmd.Dir = m.Dir
+				cmd.Env = append(cmd.Environ(), "GO111MODULE=on", "GOWORK=off")
 				cmd.Stderr = new(strings.Builder)
 				_, err := cmd.Output()
 				if err != nil {
@@ -67,8 +71,8 @@
 			// There is no vendor directory, so the module must have no dependencies.
 			// Check that the list of active modules contains only the main module.
 			cmd := testenv.Command(t, goBin, "list", "-mod=readonly", "-m", "all")
-			cmd.Env = append(os.Environ(), "GO111MODULE=on", "GOWORK=off")
 			cmd.Dir = m.Dir
+			cmd.Env = append(cmd.Environ(), "GO111MODULE=on", "GOWORK=off")
 			cmd.Stderr = new(strings.Builder)
 			out, err := cmd.Output()
 			if err != nil {
@@ -170,6 +174,8 @@
 		}
 
 		t.Run(m.Path+"(thorough)", func(t *testing.T) {
+			t.Logf("module %s in directory %s", m.Path, m.Dir)
+
 			defer func() {
 				if t.Failed() {
 					// The test failed, which means it's possible the GOROOT copy
@@ -189,8 +195,7 @@
 				Env: append(append(os.Environ(), modcacheEnv...),
 					// Set GOROOT.
 					"GOROOT="+gorootCopyDir,
-					// Explicitly override PWD and clear GOROOT_FINAL so that GOROOT=gorootCopyDir is definitely used.
-					"PWD="+filepath.Join(gorootCopyDir, rel),
+					// Explicitly clear GOROOT_FINAL so that GOROOT=gorootCopyDir is definitely used.
 					"GOROOT_FINAL=",
 					// Add GOROOTcopy/bin and bundleDir to front of PATH.
 					"PATH="+filepath.Join(gorootCopyDir, "bin")+string(filepath.ListSeparator)+
@@ -249,6 +254,7 @@
 // deemed safe to share for the purpose of the TestAllDependencies test.
 func makeGOROOTCopy(t *testing.T) string {
 	t.Helper()
+
 	gorootCopyDir := t.TempDir()
 	err := filepath.Walk(testenv.GOROOT(t), func(src string, info os.FileInfo, err error) error {
 		if err != nil {
@@ -309,6 +315,7 @@
 	if err != nil {
 		t.Fatal(err)
 	}
+	t.Logf("copied GOROOT from %s to %s", testenv.GOROOT(t), gorootCopyDir)
 	return gorootCopyDir
 }
 
@@ -322,7 +329,10 @@
 	t.Helper()
 	cmd := testenv.Command(t, args[0], args[1:]...)
 	cmd.Dir = r.Dir
-	cmd.Env = r.Env
+	cmd.Env = slices.Clip(r.Env)
+	if r.Dir != "" {
+		cmd.Env = append(cmd.Env, "PWD="+r.Dir)
+	}
 	out, err := cmd.CombinedOutput()
 	if err != nil {
 		t.Logf("> %s\n", strings.Join(args, " "))
@@ -462,8 +472,8 @@
 			// Use 'go list' to describe the module contained in this directory (but
 			// not its dependencies).
 			cmd := testenv.Command(t, goBin, "list", "-json", "-m")
-			cmd.Env = append(os.Environ(), "GO111MODULE=on", "GOWORK=off")
 			cmd.Dir = dir
+			cmd.Env = append(cmd.Environ(), "GO111MODULE=on", "GOWORK=off")
 			cmd.Stderr = new(strings.Builder)
 			out, err := cmd.Output()
 			if err != nil {
@@ -494,8 +504,7 @@
 		knownGOROOTModules := [...]string{
 			"std",
 			"cmd",
-			"misc",
-			"test/bench/go1",
+			// The "misc" module sometimes exists, but cmd/distpack intentionally removes it.
 		}
 		var seen = make(map[string]bool) // Key is module path.
 		for _, m := range goroot.modules {
@@ -507,6 +516,9 @@
 				break
 			}
 		}
+		sort.Slice(goroot.modules, func(i, j int) bool {
+			return goroot.modules[i].Dir < goroot.modules[j].Dir
+		})
 	})
 	if goroot.err != nil {
 		t.Fatal(goroot.err)
diff --git a/src/cmd/internal/notsha256/sha256block_decl.go b/src/cmd/internal/notsha256/sha256block_decl.go
index 631f1a4..da66bdd 100644
--- a/src/cmd/internal/notsha256/sha256block_decl.go
+++ b/src/cmd/internal/notsha256/sha256block_decl.go
@@ -9,5 +9,4 @@
 package notsha256
 
 //go:noescape
-
 func block(dig *digest, p []byte)
diff --git a/src/cmd/internal/obj/abi_string.go b/src/cmd/internal/obj/abi_string.go
index a439da3..77868ee 100644
--- a/src/cmd/internal/obj/abi_string.go
+++ b/src/cmd/internal/obj/abi_string.go
@@ -4,6 +4,15 @@
 
 import "strconv"
 
+func _() {
+	// An "invalid array index" compiler error signifies that the constant values have changed.
+	// Re-run the stringer command to generate them again.
+	var x [1]struct{}
+	_ = x[ABI0-0]
+	_ = x[ABIInternal-1]
+	_ = x[ABICount-2]
+}
+
 const _ABI_name = "ABI0ABIInternalABICount"
 
 var _ABI_index = [...]uint8{0, 4, 15, 23}
diff --git a/src/cmd/internal/obj/arm/asm5.go b/src/cmd/internal/obj/arm/asm5.go
index 7b16827..177ffd9 100644
--- a/src/cmd/internal/obj/arm/asm5.go
+++ b/src/cmd/internal/obj/arm/asm5.go
@@ -688,13 +688,16 @@
 			t.Rel = p
 		}
 
-	case C_SROREG,
-		C_LOREG,
-		C_ROREG,
+	case C_HOREG,
 		C_FOREG,
+		C_HFOREG,
 		C_SOREG,
-		C_HOREG,
+		C_ROREG,
+		C_SROREG,
+		C_LOREG,
+		C_HAUTO,
 		C_FAUTO,
+		C_HFAUTO,
 		C_SAUTO,
 		C_LAUTO,
 		C_LACON:
diff --git a/src/cmd/internal/obj/arm/obj5.go b/src/cmd/internal/obj/arm/obj5.go
index 38aa11c..fb7c260 100644
--- a/src/cmd/internal/obj/arm/obj5.go
+++ b/src/cmd/internal/obj/arm/obj5.go
@@ -34,6 +34,7 @@
 	"cmd/internal/obj"
 	"cmd/internal/objabi"
 	"cmd/internal/sys"
+	"internal/abi"
 	"internal/buildcfg"
 	"log"
 )
@@ -618,8 +619,8 @@
 
 		if p.To.Type == obj.TYPE_REG && p.To.Reg == REGSP && p.Spadj == 0 {
 			f := c.cursym.Func()
-			if f.FuncFlag&objabi.FuncFlag_SPWRITE == 0 {
-				c.cursym.Func().FuncFlag |= objabi.FuncFlag_SPWRITE
+			if f.FuncFlag&abi.FuncFlagSPWrite == 0 {
+				c.cursym.Func().FuncFlag |= abi.FuncFlagSPWrite
 				if ctxt.Debugvlog || !ctxt.IsAsm {
 					ctxt.Logf("auto-SPWRITE: %s %v\n", c.cursym.Name, p)
 					if !ctxt.IsAsm {
@@ -708,7 +709,7 @@
 	// unnecessarily. See issue #35470.
 	p = c.ctxt.StartUnsafePoint(p, c.newprog)
 
-	if framesize <= objabi.StackSmall {
+	if framesize <= abi.StackSmall {
 		// small stack: SP < stackguard
 		//	CMP	stackguard, SP
 		p = obj.Appendp(p, c.newprog)
@@ -717,7 +718,7 @@
 		p.From.Type = obj.TYPE_REG
 		p.From.Reg = REG_R1
 		p.Reg = REGSP
-	} else if framesize <= objabi.StackBig {
+	} else if framesize <= abi.StackBig {
 		// large stack: SP-framesize < stackguard-StackSmall
 		//	MOVW $-(framesize-StackSmall)(SP), R2
 		//	CMP stackguard, R2
@@ -726,7 +727,7 @@
 		p.As = AMOVW
 		p.From.Type = obj.TYPE_ADDR
 		p.From.Reg = REGSP
-		p.From.Offset = -(int64(framesize) - objabi.StackSmall)
+		p.From.Offset = -(int64(framesize) - abi.StackSmall)
 		p.To.Type = obj.TYPE_REG
 		p.To.Reg = REG_R2
 
@@ -753,7 +754,7 @@
 		p.As = ASUB
 		p.Scond = C_SBIT
 		p.From.Type = obj.TYPE_CONST
-		p.From.Offset = int64(framesize) - objabi.StackSmall
+		p.From.Offset = int64(framesize) - abi.StackSmall
 		p.Reg = REGSP
 		p.To.Type = obj.TYPE_REG
 		p.To.Reg = REG_R2
diff --git a/src/cmd/internal/obj/arm64/a.out.go b/src/cmd/internal/obj/arm64/a.out.go
index 3bfc675..fc170e7 100644
--- a/src/cmd/internal/obj/arm64/a.out.go
+++ b/src/cmd/internal/obj/arm64/a.out.go
@@ -193,8 +193,8 @@
 // compiler allocates external registers F26 down
 const (
 	REGMIN = REG_R7  // register variables allocated from here to REGMAX
-	REGRT1 = REG_R16 // ARM64 IP0, external linker may use as a scrach register in trampoline
-	REGRT2 = REG_R17 // ARM64 IP1, external linker may use as a scrach register in trampoline
+	REGRT1 = REG_R16 // ARM64 IP0, external linker may use as a scratch register in trampoline
+	REGRT2 = REG_R17 // ARM64 IP1, external linker may use as a scratch register in trampoline
 	REGPR  = REG_R18 // ARM64 platform register, unused in the Go toolchain
 	REGMAX = REG_R25
 
@@ -495,6 +495,10 @@
 	AADDW
 	AADR
 	AADRP
+	AAESD
+	AAESE
+	AAESIMC
+	AAESMC
 	AAND
 	AANDS
 	AANDSW
@@ -502,17 +506,47 @@
 	AASR
 	AASRW
 	AAT
+	ABCC
+	ABCS
+	ABEQ
 	ABFI
 	ABFIW
 	ABFM
 	ABFMW
 	ABFXIL
 	ABFXILW
+	ABGE
+	ABGT
+	ABHI
+	ABHS
 	ABIC
 	ABICS
 	ABICSW
 	ABICW
+	ABLE
+	ABLO
+	ABLS
+	ABLT
+	ABMI
+	ABNE
+	ABPL
 	ABRK
+	ABVC
+	ABVS
+	ACASAD
+	ACASALB
+	ACASALD
+	ACASALH
+	ACASALW
+	ACASAW
+	ACASB
+	ACASD
+	ACASH
+	ACASLD
+	ACASLW
+	ACASPD
+	ACASPW
+	ACASW
 	ACBNZ
 	ACBNZW
 	ACBZ
@@ -563,6 +597,7 @@
 	ADMB
 	ADRPS
 	ADSB
+	ADWORD
 	AEON
 	AEONW
 	AEOR
@@ -570,6 +605,85 @@
 	AERET
 	AEXTR
 	AEXTRW
+	AFABSD
+	AFABSS
+	AFADDD
+	AFADDS
+	AFCCMPD
+	AFCCMPED
+	AFCCMPES
+	AFCCMPS
+	AFCMPD
+	AFCMPED
+	AFCMPES
+	AFCMPS
+	AFCSELD
+	AFCSELS
+	AFCVTDH
+	AFCVTDS
+	AFCVTHD
+	AFCVTHS
+	AFCVTSD
+	AFCVTSH
+	AFCVTZSD
+	AFCVTZSDW
+	AFCVTZSS
+	AFCVTZSSW
+	AFCVTZUD
+	AFCVTZUDW
+	AFCVTZUS
+	AFCVTZUSW
+	AFDIVD
+	AFDIVS
+	AFLDPD
+	AFLDPQ
+	AFLDPS
+	AFMADDD
+	AFMADDS
+	AFMAXD
+	AFMAXNMD
+	AFMAXNMS
+	AFMAXS
+	AFMIND
+	AFMINNMD
+	AFMINNMS
+	AFMINS
+	AFMOVD
+	AFMOVQ
+	AFMOVS
+	AFMSUBD
+	AFMSUBS
+	AFMULD
+	AFMULS
+	AFNEGD
+	AFNEGS
+	AFNMADDD
+	AFNMADDS
+	AFNMSUBD
+	AFNMSUBS
+	AFNMULD
+	AFNMULS
+	AFRINTAD
+	AFRINTAS
+	AFRINTID
+	AFRINTIS
+	AFRINTMD
+	AFRINTMS
+	AFRINTND
+	AFRINTNS
+	AFRINTPD
+	AFRINTPS
+	AFRINTXD
+	AFRINTXS
+	AFRINTZD
+	AFRINTZS
+	AFSQRTD
+	AFSQRTS
+	AFSTPD
+	AFSTPQ
+	AFSTPS
+	AFSUBD
+	AFSUBS
 	AHINT
 	AHLT
 	AHVC
@@ -578,19 +692,19 @@
 	ALDADDAB
 	ALDADDAD
 	ALDADDAH
-	ALDADDAW
 	ALDADDALB
 	ALDADDALD
 	ALDADDALH
 	ALDADDALW
+	ALDADDAW
 	ALDADDB
 	ALDADDD
 	ALDADDH
-	ALDADDW
 	ALDADDLB
 	ALDADDLD
 	ALDADDLH
 	ALDADDLW
+	ALDADDW
 	ALDAR
 	ALDARB
 	ALDARH
@@ -604,60 +718,60 @@
 	ALDCLRAB
 	ALDCLRAD
 	ALDCLRAH
-	ALDCLRAW
 	ALDCLRALB
 	ALDCLRALD
 	ALDCLRALH
 	ALDCLRALW
+	ALDCLRAW
 	ALDCLRB
 	ALDCLRD
 	ALDCLRH
-	ALDCLRW
 	ALDCLRLB
 	ALDCLRLD
 	ALDCLRLH
 	ALDCLRLW
+	ALDCLRW
 	ALDEORAB
 	ALDEORAD
 	ALDEORAH
-	ALDEORAW
 	ALDEORALB
 	ALDEORALD
 	ALDEORALH
 	ALDEORALW
+	ALDEORAW
 	ALDEORB
 	ALDEORD
 	ALDEORH
-	ALDEORW
 	ALDEORLB
 	ALDEORLD
 	ALDEORLH
 	ALDEORLW
+	ALDEORW
 	ALDORAB
 	ALDORAD
 	ALDORAH
-	ALDORAW
 	ALDORALB
 	ALDORALD
 	ALDORALH
 	ALDORALW
+	ALDORAW
 	ALDORB
 	ALDORD
 	ALDORH
-	ALDORW
 	ALDORLB
 	ALDORLD
 	ALDORLH
 	ALDORLW
+	ALDORW
 	ALDP
-	ALDPW
 	ALDPSW
+	ALDPW
+	ALDXP
+	ALDXPW
 	ALDXR
 	ALDXRB
 	ALDXRH
 	ALDXRW
-	ALDXP
-	ALDXPW
 	ALSL
 	ALSLW
 	ALSR
@@ -666,10 +780,23 @@
 	AMADDW
 	AMNEG
 	AMNEGW
+	AMOVB
+	AMOVBU
+	AMOVD
+	AMOVH
+	AMOVHU
 	AMOVK
 	AMOVKW
 	AMOVN
 	AMOVNW
+	AMOVP
+	AMOVPD
+	AMOVPQ
+	AMOVPS
+	AMOVPSW
+	AMOVPW
+	AMOVW
+	AMOVWU
 	AMOVZ
 	AMOVZW
 	AMRS
@@ -716,24 +843,34 @@
 	ASBFMW
 	ASBFX
 	ASBFXW
+	ASCVTFD
+	ASCVTFS
+	ASCVTFWD
+	ASCVTFWS
 	ASDIV
 	ASDIVW
 	ASEV
 	ASEVL
+	ASHA1C
+	ASHA1H
+	ASHA1M
+	ASHA1P
+	ASHA1SU0
+	ASHA1SU1
+	ASHA256H
+	ASHA256H2
+	ASHA256SU0
+	ASHA256SU1
+	ASHA512H
+	ASHA512H2
+	ASHA512SU0
+	ASHA512SU1
 	ASMADDL
 	ASMC
 	ASMNEGL
 	ASMSUBL
 	ASMULH
 	ASMULL
-	ASTXR
-	ASTXRB
-	ASTXRH
-	ASTXP
-	ASTXPW
-	ASTXRW
-	ASTLP
-	ASTLPW
 	ASTLR
 	ASTLRB
 	ASTLRH
@@ -746,11 +883,33 @@
 	ASTLXRW
 	ASTP
 	ASTPW
+	ASTXP
+	ASTXPW
+	ASTXR
+	ASTXRB
+	ASTXRH
+	ASTXRW
 	ASUB
 	ASUBS
 	ASUBSW
 	ASUBW
 	ASVC
+	ASWPAB
+	ASWPAD
+	ASWPAH
+	ASWPALB
+	ASWPALD
+	ASWPALH
+	ASWPALW
+	ASWPAW
+	ASWPB
+	ASWPD
+	ASWPH
+	ASWPLB
+	ASWPLD
+	ASWPLH
+	ASWPLW
+	ASWPW
 	ASXTB
 	ASXTBW
 	ASXTH
@@ -769,6 +928,10 @@
 	AUBFMW
 	AUBFX
 	AUBFXW
+	AUCVTFD
+	AUCVTFS
+	AUCVTFWD
+	AUCVTFWS
 	AUDIV
 	AUDIVW
 	AUMADDL
@@ -779,247 +942,80 @@
 	AUREM
 	AUREMW
 	AUXTB
-	AUXTH
-	AUXTW
 	AUXTBW
+	AUXTH
 	AUXTHW
-	AWFE
-	AWFI
-	AYIELD
-	AMOVB
-	AMOVBU
-	AMOVH
-	AMOVHU
-	AMOVW
-	AMOVWU
-	AMOVD
-	AMOVNP
-	AMOVNPW
-	AMOVP
-	AMOVPD
-	AMOVPQ
-	AMOVPS
-	AMOVPSW
-	AMOVPW
-	ASWPAD
-	ASWPAW
-	ASWPAH
-	ASWPAB
-	ASWPALD
-	ASWPALW
-	ASWPALH
-	ASWPALB
-	ASWPD
-	ASWPW
-	ASWPH
-	ASWPB
-	ASWPLD
-	ASWPLW
-	ASWPLH
-	ASWPLB
-	ACASD
-	ACASW
-	ACASH
-	ACASB
-	ACASAD
-	ACASAW
-	ACASLD
-	ACASLW
-	ACASALD
-	ACASALW
-	ACASALH
-	ACASALB
-	ACASPD
-	ACASPW
-	ABEQ
-	ABNE
-	ABCS
-	ABHS
-	ABCC
-	ABLO
-	ABMI
-	ABPL
-	ABVS
-	ABVC
-	ABHI
-	ABLS
-	ABGE
-	ABLT
-	ABGT
-	ABLE
-	AFABSD
-	AFABSS
-	AFADDD
-	AFADDS
-	AFCCMPD
-	AFCCMPED
-	AFCCMPS
-	AFCCMPES
-	AFCMPD
-	AFCMPED
-	AFCMPES
-	AFCMPS
-	AFCVTSD
-	AFCVTDS
-	AFCVTZSD
-	AFCVTZSDW
-	AFCVTZSS
-	AFCVTZSSW
-	AFCVTZUD
-	AFCVTZUDW
-	AFCVTZUS
-	AFCVTZUSW
-	AFDIVD
-	AFDIVS
-	AFLDPD
-	AFLDPQ
-	AFLDPS
-	AFMOVQ
-	AFMOVD
-	AFMOVS
-	AVMOVQ
-	AVMOVD
-	AVMOVS
-	AFMULD
-	AFMULS
-	AFNEGD
-	AFNEGS
-	AFSQRTD
-	AFSQRTS
-	AFSTPD
-	AFSTPQ
-	AFSTPS
-	AFSUBD
-	AFSUBS
-	ASCVTFD
-	ASCVTFS
-	ASCVTFWD
-	ASCVTFWS
-	AUCVTFD
-	AUCVTFS
-	AUCVTFWD
-	AUCVTFWS
-	AWORD
-	ADWORD
-	AFCSELS
-	AFCSELD
-	AFMAXS
-	AFMINS
-	AFMAXD
-	AFMIND
-	AFMAXNMS
-	AFMAXNMD
-	AFNMULS
-	AFNMULD
-	AFRINTNS
-	AFRINTND
-	AFRINTPS
-	AFRINTPD
-	AFRINTMS
-	AFRINTMD
-	AFRINTZS
-	AFRINTZD
-	AFRINTAS
-	AFRINTAD
-	AFRINTXS
-	AFRINTXD
-	AFRINTIS
-	AFRINTID
-	AFMADDS
-	AFMADDD
-	AFMSUBS
-	AFMSUBD
-	AFNMADDS
-	AFNMADDD
-	AFNMSUBS
-	AFNMSUBD
-	AFMINNMS
-	AFMINNMD
-	AFCVTDH
-	AFCVTHS
-	AFCVTHD
-	AFCVTSH
-	AAESD
-	AAESE
-	AAESIMC
-	AAESMC
-	ASHA1C
-	ASHA1H
-	ASHA1M
-	ASHA1P
-	ASHA1SU0
-	ASHA1SU1
-	ASHA256H
-	ASHA256H2
-	ASHA256SU0
-	ASHA256SU1
-	ASHA512H
-	ASHA512H2
-	ASHA512SU0
-	ASHA512SU1
+	AUXTW
 	AVADD
 	AVADDP
+	AVADDV
 	AVAND
-	AVBIF
 	AVBCAX
+	AVBIF
+	AVBIT
+	AVBSL
 	AVCMEQ
+	AVCMTST
 	AVCNT
+	AVDUP
 	AVEOR
 	AVEOR3
-	AVMOV
+	AVEXT
+	AVFMLA
+	AVFMLS
 	AVLD1
-	AVLD2
-	AVLD3
-	AVLD4
 	AVLD1R
+	AVLD2
 	AVLD2R
+	AVLD3
 	AVLD3R
+	AVLD4
 	AVLD4R
+	AVMOV
+	AVMOVD
+	AVMOVI
+	AVMOVQ
+	AVMOVS
 	AVORR
+	AVPMULL
+	AVPMULL2
+	AVRAX1
+	AVRBIT
 	AVREV16
 	AVREV32
 	AVREV64
+	AVSHL
+	AVSLI
+	AVSRI
 	AVST1
 	AVST2
 	AVST3
 	AVST4
-	AVDUP
-	AVADDV
-	AVMOVI
-	AVUADDLV
 	AVSUB
-	AVFMLA
-	AVFMLS
-	AVPMULL
-	AVPMULL2
-	AVEXT
-	AVRBIT
-	AVRAX1
+	AVTBL
+	AVTBX
+	AVTRN1
+	AVTRN2
+	AVUADDLV
+	AVUADDW
+	AVUADDW2
 	AVUMAX
 	AVUMIN
-	AVUSHR
 	AVUSHLL
 	AVUSHLL2
+	AVUSHR
+	AVUSRA
 	AVUXTL
 	AVUXTL2
 	AVUZP1
 	AVUZP2
-	AVSHL
-	AVSRI
-	AVSLI
-	AVBSL
-	AVBIT
-	AVTBL
-	AVTBX
 	AVXAR
 	AVZIP1
 	AVZIP2
-	AVCMTST
-	AVUADDW2
-	AVUADDW
-	AVUSRA
-	AVTRN1
-	AVTRN2
+	AWFE
+	AWFI
+	AWORD
+	AYIELD
 	ALAST
 	AB  = obj.AJMP
 	ABL = obj.ACALL
diff --git a/src/cmd/internal/obj/arm64/anames.go b/src/cmd/internal/obj/arm64/anames.go
index 03222f9..bac8b40 100644
--- a/src/cmd/internal/obj/arm64/anames.go
+++ b/src/cmd/internal/obj/arm64/anames.go
@@ -15,6 +15,10 @@
 	"ADDW",
 	"ADR",
 	"ADRP",
+	"AESD",
+	"AESE",
+	"AESIMC",
+	"AESMC",
 	"AND",
 	"ANDS",
 	"ANDSW",
@@ -22,17 +26,47 @@
 	"ASR",
 	"ASRW",
 	"AT",
+	"BCC",
+	"BCS",
+	"BEQ",
 	"BFI",
 	"BFIW",
 	"BFM",
 	"BFMW",
 	"BFXIL",
 	"BFXILW",
+	"BGE",
+	"BGT",
+	"BHI",
+	"BHS",
 	"BIC",
 	"BICS",
 	"BICSW",
 	"BICW",
+	"BLE",
+	"BLO",
+	"BLS",
+	"BLT",
+	"BMI",
+	"BNE",
+	"BPL",
 	"BRK",
+	"BVC",
+	"BVS",
+	"CASAD",
+	"CASALB",
+	"CASALD",
+	"CASALH",
+	"CASALW",
+	"CASAW",
+	"CASB",
+	"CASD",
+	"CASH",
+	"CASLD",
+	"CASLW",
+	"CASPD",
+	"CASPW",
+	"CASW",
 	"CBNZ",
 	"CBNZW",
 	"CBZ",
@@ -83,6 +117,7 @@
 	"DMB",
 	"DRPS",
 	"DSB",
+	"DWORD",
 	"EON",
 	"EONW",
 	"EOR",
@@ -90,6 +125,85 @@
 	"ERET",
 	"EXTR",
 	"EXTRW",
+	"FABSD",
+	"FABSS",
+	"FADDD",
+	"FADDS",
+	"FCCMPD",
+	"FCCMPED",
+	"FCCMPES",
+	"FCCMPS",
+	"FCMPD",
+	"FCMPED",
+	"FCMPES",
+	"FCMPS",
+	"FCSELD",
+	"FCSELS",
+	"FCVTDH",
+	"FCVTDS",
+	"FCVTHD",
+	"FCVTHS",
+	"FCVTSD",
+	"FCVTSH",
+	"FCVTZSD",
+	"FCVTZSDW",
+	"FCVTZSS",
+	"FCVTZSSW",
+	"FCVTZUD",
+	"FCVTZUDW",
+	"FCVTZUS",
+	"FCVTZUSW",
+	"FDIVD",
+	"FDIVS",
+	"FLDPD",
+	"FLDPQ",
+	"FLDPS",
+	"FMADDD",
+	"FMADDS",
+	"FMAXD",
+	"FMAXNMD",
+	"FMAXNMS",
+	"FMAXS",
+	"FMIND",
+	"FMINNMD",
+	"FMINNMS",
+	"FMINS",
+	"FMOVD",
+	"FMOVQ",
+	"FMOVS",
+	"FMSUBD",
+	"FMSUBS",
+	"FMULD",
+	"FMULS",
+	"FNEGD",
+	"FNEGS",
+	"FNMADDD",
+	"FNMADDS",
+	"FNMSUBD",
+	"FNMSUBS",
+	"FNMULD",
+	"FNMULS",
+	"FRINTAD",
+	"FRINTAS",
+	"FRINTID",
+	"FRINTIS",
+	"FRINTMD",
+	"FRINTMS",
+	"FRINTND",
+	"FRINTNS",
+	"FRINTPD",
+	"FRINTPS",
+	"FRINTXD",
+	"FRINTXS",
+	"FRINTZD",
+	"FRINTZS",
+	"FSQRTD",
+	"FSQRTS",
+	"FSTPD",
+	"FSTPQ",
+	"FSTPS",
+	"FSUBD",
+	"FSUBS",
 	"HINT",
 	"HLT",
 	"HVC",
@@ -98,19 +212,19 @@
 	"LDADDAB",
 	"LDADDAD",
 	"LDADDAH",
-	"LDADDAW",
 	"LDADDALB",
 	"LDADDALD",
 	"LDADDALH",
 	"LDADDALW",
+	"LDADDAW",
 	"LDADDB",
 	"LDADDD",
 	"LDADDH",
-	"LDADDW",
 	"LDADDLB",
 	"LDADDLD",
 	"LDADDLH",
 	"LDADDLW",
+	"LDADDW",
 	"LDAR",
 	"LDARB",
 	"LDARH",
@@ -124,60 +238,60 @@
 	"LDCLRAB",
 	"LDCLRAD",
 	"LDCLRAH",
-	"LDCLRAW",
 	"LDCLRALB",
 	"LDCLRALD",
 	"LDCLRALH",
 	"LDCLRALW",
+	"LDCLRAW",
 	"LDCLRB",
 	"LDCLRD",
 	"LDCLRH",
-	"LDCLRW",
 	"LDCLRLB",
 	"LDCLRLD",
 	"LDCLRLH",
 	"LDCLRLW",
+	"LDCLRW",
 	"LDEORAB",
 	"LDEORAD",
 	"LDEORAH",
-	"LDEORAW",
 	"LDEORALB",
 	"LDEORALD",
 	"LDEORALH",
 	"LDEORALW",
+	"LDEORAW",
 	"LDEORB",
 	"LDEORD",
 	"LDEORH",
-	"LDEORW",
 	"LDEORLB",
 	"LDEORLD",
 	"LDEORLH",
 	"LDEORLW",
+	"LDEORW",
 	"LDORAB",
 	"LDORAD",
 	"LDORAH",
-	"LDORAW",
 	"LDORALB",
 	"LDORALD",
 	"LDORALH",
 	"LDORALW",
+	"LDORAW",
 	"LDORB",
 	"LDORD",
 	"LDORH",
-	"LDORW",
 	"LDORLB",
 	"LDORLD",
 	"LDORLH",
 	"LDORLW",
+	"LDORW",
 	"LDP",
-	"LDPW",
 	"LDPSW",
+	"LDPW",
+	"LDXP",
+	"LDXPW",
 	"LDXR",
 	"LDXRB",
 	"LDXRH",
 	"LDXRW",
-	"LDXP",
-	"LDXPW",
 	"LSL",
 	"LSLW",
 	"LSR",
@@ -186,10 +300,23 @@
 	"MADDW",
 	"MNEG",
 	"MNEGW",
+	"MOVB",
+	"MOVBU",
+	"MOVD",
+	"MOVH",
+	"MOVHU",
 	"MOVK",
 	"MOVKW",
 	"MOVN",
 	"MOVNW",
+	"MOVP",
+	"MOVPD",
+	"MOVPQ",
+	"MOVPS",
+	"MOVPSW",
+	"MOVPW",
+	"MOVW",
+	"MOVWU",
 	"MOVZ",
 	"MOVZW",
 	"MRS",
@@ -236,24 +363,34 @@
 	"SBFMW",
 	"SBFX",
 	"SBFXW",
+	"SCVTFD",
+	"SCVTFS",
+	"SCVTFWD",
+	"SCVTFWS",
 	"SDIV",
 	"SDIVW",
 	"SEV",
 	"SEVL",
+	"SHA1C",
+	"SHA1H",
+	"SHA1M",
+	"SHA1P",
+	"SHA1SU0",
+	"SHA1SU1",
+	"SHA256H",
+	"SHA256H2",
+	"SHA256SU0",
+	"SHA256SU1",
+	"SHA512H",
+	"SHA512H2",
+	"SHA512SU0",
+	"SHA512SU1",
 	"SMADDL",
 	"SMC",
 	"SMNEGL",
 	"SMSUBL",
 	"SMULH",
 	"SMULL",
-	"STXR",
-	"STXRB",
-	"STXRH",
-	"STXP",
-	"STXPW",
-	"STXRW",
-	"STLP",
-	"STLPW",
 	"STLR",
 	"STLRB",
 	"STLRH",
@@ -266,11 +403,33 @@
 	"STLXRW",
 	"STP",
 	"STPW",
+	"STXP",
+	"STXPW",
+	"STXR",
+	"STXRB",
+	"STXRH",
+	"STXRW",
 	"SUB",
 	"SUBS",
 	"SUBSW",
 	"SUBW",
 	"SVC",
+	"SWPAB",
+	"SWPAD",
+	"SWPAH",
+	"SWPALB",
+	"SWPALD",
+	"SWPALH",
+	"SWPALW",
+	"SWPAW",
+	"SWPB",
+	"SWPD",
+	"SWPH",
+	"SWPLB",
+	"SWPLD",
+	"SWPLH",
+	"SWPLW",
+	"SWPW",
 	"SXTB",
 	"SXTBW",
 	"SXTH",
@@ -289,6 +448,10 @@
 	"UBFMW",
 	"UBFX",
 	"UBFXW",
+	"UCVTFD",
+	"UCVTFS",
+	"UCVTFWD",
+	"UCVTFWS",
 	"UDIV",
 	"UDIVW",
 	"UMADDL",
@@ -299,246 +462,79 @@
 	"UREM",
 	"UREMW",
 	"UXTB",
-	"UXTH",
-	"UXTW",
 	"UXTBW",
+	"UXTH",
 	"UXTHW",
-	"WFE",
-	"WFI",
-	"YIELD",
-	"MOVB",
-	"MOVBU",
-	"MOVH",
-	"MOVHU",
-	"MOVW",
-	"MOVWU",
-	"MOVD",
-	"MOVNP",
-	"MOVNPW",
-	"MOVP",
-	"MOVPD",
-	"MOVPQ",
-	"MOVPS",
-	"MOVPSW",
-	"MOVPW",
-	"SWPAD",
-	"SWPAW",
-	"SWPAH",
-	"SWPAB",
-	"SWPALD",
-	"SWPALW",
-	"SWPALH",
-	"SWPALB",
-	"SWPD",
-	"SWPW",
-	"SWPH",
-	"SWPB",
-	"SWPLD",
-	"SWPLW",
-	"SWPLH",
-	"SWPLB",
-	"CASD",
-	"CASW",
-	"CASH",
-	"CASB",
-	"CASAD",
-	"CASAW",
-	"CASLD",
-	"CASLW",
-	"CASALD",
-	"CASALW",
-	"CASALH",
-	"CASALB",
-	"CASPD",
-	"CASPW",
-	"BEQ",
-	"BNE",
-	"BCS",
-	"BHS",
-	"BCC",
-	"BLO",
-	"BMI",
-	"BPL",
-	"BVS",
-	"BVC",
-	"BHI",
-	"BLS",
-	"BGE",
-	"BLT",
-	"BGT",
-	"BLE",
-	"FABSD",
-	"FABSS",
-	"FADDD",
-	"FADDS",
-	"FCCMPD",
-	"FCCMPED",
-	"FCCMPS",
-	"FCCMPES",
-	"FCMPD",
-	"FCMPED",
-	"FCMPES",
-	"FCMPS",
-	"FCVTSD",
-	"FCVTDS",
-	"FCVTZSD",
-	"FCVTZSDW",
-	"FCVTZSS",
-	"FCVTZSSW",
-	"FCVTZUD",
-	"FCVTZUDW",
-	"FCVTZUS",
-	"FCVTZUSW",
-	"FDIVD",
-	"FDIVS",
-	"FLDPD",
-	"FLDPQ",
-	"FLDPS",
-	"FMOVQ",
-	"FMOVD",
-	"FMOVS",
-	"VMOVQ",
-	"VMOVD",
-	"VMOVS",
-	"FMULD",
-	"FMULS",
-	"FNEGD",
-	"FNEGS",
-	"FSQRTD",
-	"FSQRTS",
-	"FSTPD",
-	"FSTPQ",
-	"FSTPS",
-	"FSUBD",
-	"FSUBS",
-	"SCVTFD",
-	"SCVTFS",
-	"SCVTFWD",
-	"SCVTFWS",
-	"UCVTFD",
-	"UCVTFS",
-	"UCVTFWD",
-	"UCVTFWS",
-	"WORD",
-	"DWORD",
-	"FCSELS",
-	"FCSELD",
-	"FMAXS",
-	"FMINS",
-	"FMAXD",
-	"FMIND",
-	"FMAXNMS",
-	"FMAXNMD",
-	"FNMULS",
-	"FNMULD",
-	"FRINTNS",
-	"FRINTND",
-	"FRINTPS",
-	"FRINTPD",
-	"FRINTMS",
-	"FRINTMD",
-	"FRINTZS",
-	"FRINTZD",
-	"FRINTAS",
-	"FRINTAD",
-	"FRINTXS",
-	"FRINTXD",
-	"FRINTIS",
-	"FRINTID",
-	"FMADDS",
-	"FMADDD",
-	"FMSUBS",
-	"FMSUBD",
-	"FNMADDS",
-	"FNMADDD",
-	"FNMSUBS",
-	"FNMSUBD",
-	"FMINNMS",
-	"FMINNMD",
-	"FCVTDH",
-	"FCVTHS",
-	"FCVTHD",
-	"FCVTSH",
-	"AESD",
-	"AESE",
-	"AESIMC",
-	"AESMC",
-	"SHA1C",
-	"SHA1H",
-	"SHA1M",
-	"SHA1P",
-	"SHA1SU0",
-	"SHA1SU1",
-	"SHA256H",
-	"SHA256H2",
-	"SHA256SU0",
-	"SHA256SU1",
-	"SHA512H",
-	"SHA512H2",
-	"SHA512SU0",
-	"SHA512SU1",
+	"UXTW",
 	"VADD",
 	"VADDP",
+	"VADDV",
 	"VAND",
-	"VBIF",
 	"VBCAX",
+	"VBIF",
+	"VBIT",
+	"VBSL",
 	"VCMEQ",
+	"VCMTST",
 	"VCNT",
+	"VDUP",
 	"VEOR",
 	"VEOR3",
-	"VMOV",
+	"VEXT",
+	"VFMLA",
+	"VFMLS",
 	"VLD1",
-	"VLD2",
-	"VLD3",
-	"VLD4",
 	"VLD1R",
+	"VLD2",
 	"VLD2R",
+	"VLD3",
 	"VLD3R",
+	"VLD4",
 	"VLD4R",
+	"VMOV",
+	"VMOVD",
+	"VMOVI",
+	"VMOVQ",
+	"VMOVS",
 	"VORR",
+	"VPMULL",
+	"VPMULL2",
+	"VRAX1",
+	"VRBIT",
 	"VREV16",
 	"VREV32",
 	"VREV64",
+	"VSHL",
+	"VSLI",
+	"VSRI",
 	"VST1",
 	"VST2",
 	"VST3",
 	"VST4",
-	"VDUP",
-	"VADDV",
-	"VMOVI",
-	"VUADDLV",
 	"VSUB",
-	"VFMLA",
-	"VFMLS",
-	"VPMULL",
-	"VPMULL2",
-	"VEXT",
-	"VRBIT",
-	"VRAX1",
+	"VTBL",
+	"VTBX",
+	"VTRN1",
+	"VTRN2",
+	"VUADDLV",
+	"VUADDW",
+	"VUADDW2",
 	"VUMAX",
 	"VUMIN",
-	"VUSHR",
 	"VUSHLL",
 	"VUSHLL2",
+	"VUSHR",
+	"VUSRA",
 	"VUXTL",
 	"VUXTL2",
 	"VUZP1",
 	"VUZP2",
-	"VSHL",
-	"VSRI",
-	"VSLI",
-	"VBSL",
-	"VBIT",
-	"VTBL",
-	"VTBX",
 	"VXAR",
 	"VZIP1",
 	"VZIP2",
-	"VCMTST",
-	"VUADDW2",
-	"VUADDW",
-	"VUSRA",
-	"VTRN1",
-	"VTRN2",
+	"WFE",
+	"WFI",
+	"WORD",
+	"YIELD",
 	"LAST",
 }
diff --git a/src/cmd/internal/obj/arm64/asm7.go b/src/cmd/internal/obj/arm64/asm7.go
index db18bc8..ff8daad 100644
--- a/src/cmd/internal/obj/arm64/asm7.go
+++ b/src/cmd/internal/obj/arm64/asm7.go
@@ -833,13 +833,11 @@
 	{ATLBI, C_SPOP, C_NONE, C_NONE, C_ZREG, 107, 4, 0, 0, 0},
 
 	/* encryption instructions */
-	{AAESD, C_VREG, C_NONE, C_NONE, C_VREG, 29, 4, 0, 0, 0}, // for compatibility with old code
-	{AAESD, C_ARNG, C_NONE, C_NONE, C_ARNG, 29, 4, 0, 0, 0}, // recommend using the new one for better readability
-	{ASHA1C, C_VREG, C_ZREG, C_NONE, C_VREG, 1, 4, 0, 0, 0},
-	{ASHA1C, C_ARNG, C_VREG, C_NONE, C_VREG, 1, 4, 0, 0, 0},
-	{ASHA1H, C_VREG, C_NONE, C_NONE, C_VREG, 29, 4, 0, 0, 0},
-	{ASHA1SU0, C_ARNG, C_ARNG, C_NONE, C_ARNG, 1, 4, 0, 0, 0},
-	{ASHA256H, C_ARNG, C_VREG, C_NONE, C_VREG, 1, 4, 0, 0, 0},
+	{AAESD, C_VREG, C_NONE, C_NONE, C_VREG, 26, 4, 0, 0, 0}, // for compatibility with old code
+	{AAESD, C_ARNG, C_NONE, C_NONE, C_ARNG, 26, 4, 0, 0, 0}, // recommend using the new one for better readability
+	{ASHA1C, C_VREG, C_VREG, C_NONE, C_VREG, 49, 4, 0, 0, 0},
+	{ASHA1C, C_ARNG, C_VREG, C_NONE, C_VREG, 49, 4, 0, 0, 0},
+	{ASHA1SU0, C_ARNG, C_ARNG, C_NONE, C_ARNG, 63, 4, 0, 0, 0},
 	{AVREV32, C_ARNG, C_NONE, C_NONE, C_ARNG, 83, 4, 0, 0, 0},
 	{AVPMULL, C_ARNG, C_ARNG, C_NONE, C_ARNG, 93, 4, 0, 0, 0},
 	{AVEOR3, C_ARNG, C_ARNG, C_ARNG, C_ARNG, 103, 4, 0, 0, 0},
@@ -1012,11 +1010,12 @@
 	SPOP_CVADP:   {3, 7, 13, 1, true},
 }
 
-// Used for padinng NOOP instruction
+// Used for padding NOOP instruction
 const OP_NOOP = 0xd503201f
 
-// align code to a certain length by padding bytes.
-func pcAlignPadLength(pc int64, alignedValue int64, ctxt *obj.Link) int {
+// pcAlignPadLength returns the number of bytes required to align pc to alignedValue,
+// reporting an error if alignedValue is not a power of two or is out of range.
+func pcAlignPadLength(ctxt *obj.Link, pc int64, alignedValue int64) int {
 	if !((alignedValue&(alignedValue-1) == 0) && 8 <= alignedValue && alignedValue <= 2048) {
 		ctxt.Diag("alignment value of an instruction must be a power of two and in the range [8, 2048], got %d\n", alignedValue)
 	}
@@ -1075,7 +1074,7 @@
 			switch p.As {
 			case obj.APCALIGN:
 				alignedValue := p.From.Offset
-				m = pcAlignPadLength(pc, alignedValue, ctxt)
+				m = pcAlignPadLength(ctxt, pc, alignedValue)
 				// Update the current text symbol alignment value.
 				if int32(alignedValue) > cursym.Func().Align {
 					cursym.Func().Align = int32(alignedValue)
@@ -1150,7 +1149,7 @@
 				switch p.As {
 				case obj.APCALIGN:
 					alignedValue := p.From.Offset
-					m = pcAlignPadLength(pc, alignedValue, ctxt)
+					m = pcAlignPadLength(ctxt, pc, alignedValue)
 					break
 				case obj.ANOP, obj.AFUNCDATA, obj.APCDATA:
 					continue
@@ -1183,7 +1182,7 @@
 		}
 		if p.As == obj.APCALIGN {
 			alignedValue := p.From.Offset
-			v := pcAlignPadLength(p.Pc, alignedValue, c.ctxt)
+			v := pcAlignPadLength(c.ctxt, p.Pc, alignedValue)
 			for i = 0; i < int(v/4); i++ {
 				// emit ANOOP instruction by the padding size
 				c.ctxt.Arch.ByteOrder.PutUint32(bp, OP_NOOP)
@@ -1267,7 +1266,7 @@
 		q := c.newprog()
 		if p.Link == nil {
 			// If p is the last instruction of the function, insert an UNDEF instruction in case the
-			// exection fall through to the pool.
+			// execution fall through to the pool.
 			q.As = obj.AUNDEF
 		} else {
 			// Else insert a branch to the next instruction of p.
@@ -1387,10 +1386,10 @@
 	return (x + to - 1) &^ (to - 1)
 }
 
-func (c *ctxt7) regoff(a *obj.Addr) uint32 {
+func (c *ctxt7) regoff(a *obj.Addr) int32 {
 	c.instoffset = 0
 	c.aclass(a)
-	return uint32(c.instoffset)
+	return int32(c.instoffset)
 }
 
 func isSTLXRop(op obj.As) bool {
@@ -3082,12 +3081,12 @@
 			oprangeset(ASHA1SU1, t)
 			oprangeset(ASHA256SU0, t)
 			oprangeset(ASHA512SU0, t)
+			oprangeset(ASHA1H, t)
 
 		case ASHA1C:
 			oprangeset(ASHA1P, t)
 			oprangeset(ASHA1M, t)
-
-		case ASHA256H:
+			oprangeset(ASHA256H, t)
 			oprangeset(ASHA256H2, t)
 			oprangeset(ASHA512H, t)
 			oprangeset(ASHA512H2, t)
@@ -3145,8 +3144,7 @@
 		case AVTBL:
 			oprangeset(AVTBX, t)
 
-		case ASHA1H,
-			AVCNT,
+		case AVCNT,
 			AVMOV,
 			AVLD1,
 			AVST1,
@@ -3347,7 +3345,7 @@
 		if p.To.Type == obj.TYPE_NONE {
 			rt = REGZERO
 		}
-		if r == 0 {
+		if r == obj.REG_NONE {
 			r = rt
 		}
 		o1 |= (uint32(rf&31) << 16) | (uint32(r&31) << 5) | uint32(rt&31)
@@ -3358,20 +3356,18 @@
 		}
 		o1 = c.opirr(p, p.As)
 
-		rt := int(p.To.Reg)
+		rt, r := p.To.Reg, p.Reg
 		if p.To.Type == obj.TYPE_NONE {
 			if (o1 & Sbit) == 0 {
 				c.ctxt.Diag("ineffective ZR destination\n%v", p)
 			}
 			rt = REGZERO
 		}
-
-		r := int(p.Reg)
-		if r == 0 {
+		if r == obj.REG_NONE {
 			r = rt
 		}
-		v := int32(c.regoff(&p.From))
-		o1 = c.oaddi(p, int32(o1), v, r, rt)
+		v := c.regoff(&p.From)
+		o1 = c.oaddi(p, p.As, v, rt, r)
 
 	case 3: /* op R<<n[,R],R (shifted register) */
 		o1 = c.oprrr(p, p.As)
@@ -3393,42 +3389,38 @@
 		r := int(p.Reg)
 		if p.As == AMVN || p.As == AMVNW || isNEGop(p.As) {
 			r = REGZERO
-		} else if r == 0 {
+		} else if r == obj.REG_NONE {
 			r = rt
 		}
 		o1 |= (uint32(r&31) << 5) | uint32(rt&31)
 
 	case 4: /* mov $addcon, R; mov $recon, R; mov $racon, R; mov $addcon2, R */
-		rt := int(p.To.Reg)
-		r := int(o.param)
-
-		if r == 0 {
+		rt, r := p.To.Reg, o.param
+		if r == obj.REG_NONE {
 			r = REGZERO
 		} else if r == REGFROM {
-			r = int(p.From.Reg)
+			r = p.From.Reg
 		}
-		if r == 0 {
+		if r == obj.REG_NONE {
 			r = REGSP
 		}
 
-		v := int32(c.regoff(&p.From))
-		var op int32
+		v := c.regoff(&p.From)
+		a := AADD
 		if v < 0 {
+			a = ASUB
 			v = -v
-			op = int32(c.opirr(p, ASUB))
-		} else {
-			op = int32(c.opirr(p, AADD))
 		}
 
-		if int(o.size(c.ctxt, p)) == 8 {
+		if o.size(c.ctxt, p) == 8 {
 			// NOTE: this case does not use REGTMP. If it ever does,
 			// remove the NOTUSETMP flag in optab.
-			o1 = c.oaddi(p, op, v&0xfff000, r, rt)
-			o2 = c.oaddi(p, op, v&0x000fff, rt, rt)
+			o1 = c.oaddi(p, a, v&0xfff000, rt, r)
+			o2 = c.oaddi(p, a, v&0x000fff, rt, rt)
 			break
 		}
 
-		o1 = c.oaddi(p, op, v, r, rt)
+		o1 = c.oaddi(p, a, v, rt, r)
 
 	case 5: /* b s; bl s */
 		o1 = c.opbra(p, p.As)
@@ -3461,31 +3453,29 @@
 		o1 |= uint32(c.brdist(p, 0, 19, 2) << 5)
 
 	case 8: /* lsl $c,[R],R -> ubfm $(W-1)-c,$(-c MOD (W-1)),Rn,Rd */
-		rt := int(p.To.Reg)
-
-		rf := int(p.Reg)
-		if rf == 0 {
+		rt, rf := p.To.Reg, p.Reg
+		if rf == obj.REG_NONE {
 			rf = rt
 		}
-		v := int32(p.From.Offset)
+		v := p.From.Offset
 		switch p.As {
 		case AASR:
-			o1 = c.opbfm(p, ASBFM, int(v), 63, rf, rt)
+			o1 = c.opbfm(p, ASBFM, v, 63, rf, rt)
 
 		case AASRW:
-			o1 = c.opbfm(p, ASBFMW, int(v), 31, rf, rt)
+			o1 = c.opbfm(p, ASBFMW, v, 31, rf, rt)
 
 		case ALSL:
-			o1 = c.opbfm(p, AUBFM, int((64-v)&63), int(63-v), rf, rt)
+			o1 = c.opbfm(p, AUBFM, (64-v)&63, 63-v, rf, rt)
 
 		case ALSLW:
-			o1 = c.opbfm(p, AUBFMW, int((32-v)&31), int(31-v), rf, rt)
+			o1 = c.opbfm(p, AUBFMW, (32-v)&31, 31-v, rf, rt)
 
 		case ALSR:
-			o1 = c.opbfm(p, AUBFM, int(v), 63, rf, rt)
+			o1 = c.opbfm(p, AUBFM, v, 63, rf, rt)
 
 		case ALSRW:
-			o1 = c.opbfm(p, AUBFMW, int(v), 31, rf, rt)
+			o1 = c.opbfm(p, AUBFMW, v, 31, rf, rt)
 
 		case AROR:
 			o1 = c.opextr(p, AEXTR, v, rf, rf, rt)
@@ -3502,7 +3492,7 @@
 		o1 = c.oprrr(p, p.As)
 
 		r := int(p.Reg)
-		if r == 0 {
+		if r == obj.REG_NONE {
 			r = int(p.To.Reg)
 		}
 		o1 |= (uint32(p.From.Reg&31) << 16) | (uint32(r&31) << 5) | uint32(p.To.Reg&31)
@@ -3568,7 +3558,7 @@
 			rt = REGZERO
 		}
 		r := int(p.Reg)
-		if r == 0 {
+		if r == obj.REG_NONE {
 			r = rt
 		}
 		if p.To.Type != obj.TYPE_NONE && (p.To.Reg == REGSP || r == REGSP) {
@@ -3618,12 +3608,12 @@
 		if p.From3Type() == obj.TYPE_REG {
 			r = int(p.GetFrom3().Reg)
 			ra = int(p.Reg)
-			if ra == 0 {
+			if ra == obj.REG_NONE {
 				ra = REGZERO
 			}
 		} else {
 			r = int(p.Reg)
-			if r == 0 {
+			if r == obj.REG_NONE {
 				r = rt
 			}
 			ra = REGZERO
@@ -3637,7 +3627,7 @@
 		rf := int(p.From.Reg)
 		rt := int(p.To.Reg)
 		r := int(p.Reg)
-		if r == 0 {
+		if r == obj.REG_NONE {
 			r = rt
 		}
 		o1 |= (uint32(rf&31) << 16) | (uint32(r&31) << 5) | REGTMP&31
@@ -3654,7 +3644,7 @@
 		if p.To.Type == obj.TYPE_NONE {
 			rt = REGZERO
 		}
-		if r == 0 {
+		if r == obj.REG_NONE {
 			r = REGZERO
 		}
 		o1 |= (uint32(rf&31) << 16) | (uint32(r&31) << 5) | uint32(rt&31)
@@ -3673,7 +3663,7 @@
 		var rf int = r
 		if p.From3Type() == obj.TYPE_NONE {
 			/* CINC/CINV/CNEG or CSET/CSETM*/
-			if r == 0 {
+			if r == obj.REG_NONE {
 				/* CSET/CSETM */
 				rf = REGZERO
 				r = rf
@@ -3707,34 +3697,33 @@
 		o1 |= (uint32(rf&31) << 16) | (uint32(cond&15) << 12) | (uint32(p.Reg&31) << 5) | uint32(nzcv)
 
 	case 20: /* movT R,O(R) -> strT */
-		v := int32(c.regoff(&p.To))
+		v := c.regoff(&p.To)
 		sz := int32(1 << uint(movesize(p.As)))
 
-		r := int(p.To.Reg)
-		if r == 0 {
-			r = int(o.param)
+		rt, rf := p.To.Reg, p.From.Reg
+		if rt == obj.REG_NONE {
+			rt = o.param
 		}
 		if v < 0 || v%sz != 0 { /* unscaled 9-bit signed */
-			o1 = c.olsr9s(p, int32(c.opstr(p, p.As)), v, r, int(p.From.Reg))
+			o1 = c.olsr9s(p, c.opstr(p, p.As), v, rt, rf)
 		} else {
 			v = int32(c.offsetshift(p, int64(v), int(o.a4)))
-			o1 = c.olsr12u(p, int32(c.opstr(p, p.As)), v, r, int(p.From.Reg))
+			o1 = c.olsr12u(p, c.opstr(p, p.As), v, rt, rf)
 		}
 
 	case 21: /* movT O(R),R -> ldrT */
-		v := int32(c.regoff(&p.From))
+		v := c.regoff(&p.From)
 		sz := int32(1 << uint(movesize(p.As)))
 
-		r := int(p.From.Reg)
-		if r == 0 {
-			r = int(o.param)
+		rt, rf := p.To.Reg, p.From.Reg
+		if rf == obj.REG_NONE {
+			rf = o.param
 		}
 		if v < 0 || v%sz != 0 { /* unscaled 9-bit signed */
-			o1 = c.olsr9s(p, int32(c.opldr(p, p.As)), v, r, int(p.To.Reg))
+			o1 = c.olsr9s(p, c.opldr(p, p.As), v, rf, rt)
 		} else {
 			v = int32(c.offsetshift(p, int64(v), int(o.a1)))
-			//print("offset=%lld v=%ld a1=%d\n", instoffset, v, o->a1);
-			o1 = c.olsr12u(p, int32(c.opldr(p, p.As)), v, r, int(p.To.Reg))
+			o1 = c.olsr12u(p, c.opldr(p, p.As), v, rf, rt)
 		}
 
 	case 22: /* movT (R)O!,R; movT O(R)!, R -> ldrT */
@@ -3776,14 +3765,10 @@
 	case 24: /* mov/mvn Rs,Rd -> add $0,Rs,Rd or orr Rs,ZR,Rd */
 		rf := int(p.From.Reg)
 		rt := int(p.To.Reg)
-		s := rf == REGSP || rt == REGSP
-		if p.As == AMVN || p.As == AMVNW {
-			if s {
+		if rf == REGSP || rt == REGSP {
+			if p.As == AMVN || p.As == AMVNW {
 				c.ctxt.Diag("illegal SP reference\n%v", p)
 			}
-			o1 = c.oprrr(p, p.As)
-			o1 |= (uint32(rf&31) << 16) | (REGZERO & 31 << 5) | uint32(rt&31)
-		} else if s {
 			o1 = c.opirr(p, p.As)
 			o1 |= (uint32(rf&31) << 5) | uint32(rt&31)
 		} else {
@@ -3801,6 +3786,32 @@
 		rt := int(p.To.Reg)
 		o1 |= (uint32(rf&31) << 16) | (REGZERO & 31 << 5) | uint32(rt&31)
 
+	case 26: /* op Vn, Vd; op Vn.<T>, Vd.<T> */
+		o1 = c.oprrr(p, p.As)
+		cf := c.aclass(&p.From)
+		af := (p.From.Reg >> 5) & 15
+		at := (p.To.Reg >> 5) & 15
+		var sz int16
+		switch p.As {
+		case AAESD, AAESE, AAESIMC, AAESMC:
+			sz = ARNG_16B
+		case ASHA1SU1, ASHA256SU0:
+			sz = ARNG_4S
+		case ASHA512SU0:
+			sz = ARNG_2D
+		}
+
+		if cf == C_ARNG {
+			if p.As == ASHA1H {
+				c.ctxt.Diag("invalid operands: %v", p)
+			} else {
+				if af != sz || af != at {
+					c.ctxt.Diag("invalid arrangement: %v", p)
+				}
+			}
+		}
+		o1 |= uint32(p.From.Reg&31)<<5 | uint32(p.To.Reg&31)
+
 	case 27: /* op Rm<<n[,Rn],Rd (extended register) */
 		if p.To.Reg == REG_RSP && isADDSop(p.As) {
 			c.ctxt.Diag("illegal destination register: %v\n", p)
@@ -3822,7 +3833,7 @@
 			rt = REGZERO
 		}
 		r := int(p.Reg)
-		if r == 0 {
+		if r == obj.REG_NONE {
 			r = rt
 		}
 		o1 |= (uint32(r&31) << 5) | uint32(rt&31)
@@ -3851,7 +3862,7 @@
 			rt = REGZERO
 		}
 		r := int(p.Reg)
-		if r == 0 {
+		if r == obj.REG_NONE {
 			r = rt
 		}
 		o = c.oprrr(p, p.As)
@@ -3869,7 +3880,7 @@
 	case 29: /* op Rn, Rd */
 		fc := c.aclass(&p.From)
 		tc := c.aclass(&p.To)
-		if (p.As == AFMOVD || p.As == AFMOVS) && (fc == C_REG || fc == C_ZREG || tc == C_REG) {
+		if (p.As == AFMOVD || p.As == AFMOVS) && (fc == C_REG || fc == C_ZREG || tc == C_REG || tc == C_ZREG) {
 			// FMOV Rx, Fy or FMOV Fy, Rx
 			o1 = FPCVTI(0, 0, 0, 0, 6)
 			if p.As == AFMOVD {
@@ -3895,12 +3906,12 @@
 			c.ctxt.Diag("unexpected long move, op %v tab %v\n%v", p.As, o.as, p)
 		}
 
-		r := int(p.To.Reg)
-		if r == 0 {
-			r = int(o.param)
+		r := p.To.Reg
+		if r == obj.REG_NONE {
+			r = o.param
 		}
 
-		v := int32(c.regoff(&p.To))
+		v := c.regoff(&p.To)
 		var hi int32
 		if v < 0 || (v&((1<<uint(s))-1)) != 0 {
 			// negative or unaligned offset, use constant pool
@@ -3916,8 +3927,8 @@
 			goto storeusepool
 		}
 
-		o1 = c.oaddi(p, int32(c.opirr(p, AADD)), hi, r, REGTMP)
-		o2 = c.olsr12u(p, int32(c.opstr(p, p.As)), ((v-hi)>>uint(s))&0xFFF, REGTMP, int(p.From.Reg))
+		o1 = c.oaddi(p, AADD, hi, REGTMP, r)
+		o2 = c.olsr12u(p, c.opstr(p, p.As), ((v-hi)>>uint(s))&0xFFF, REGTMP, p.From.Reg)
 		break
 
 	storeusepool:
@@ -3925,7 +3936,7 @@
 			c.ctxt.Diag("REGTMP used in large offset store: %v", p)
 		}
 		o1 = c.omovlit(AMOVD, p, &p.To, REGTMP)
-		o2 = c.olsxrr(p, int32(c.opstrr(p, p.As, false)), int(p.From.Reg), r, REGTMP)
+		o2 = c.olsxrr(p, int32(c.opstrr(p, p.As, false)), int(p.From.Reg), int(r), REGTMP)
 
 	case 31: /* movT L(R), R -> ldrT */
 		// if offset L can be split into hi+lo, and both fit into instructions, do
@@ -3939,12 +3950,12 @@
 			c.ctxt.Diag("unexpected long move, op %v tab %v\n%v", p.As, o.as, p)
 		}
 
-		r := int(p.From.Reg)
-		if r == 0 {
-			r = int(o.param)
+		r := p.From.Reg
+		if r == obj.REG_NONE {
+			r = o.param
 		}
 
-		v := int32(c.regoff(&p.From))
+		v := c.regoff(&p.From)
 		var hi int32
 		if v < 0 || (v&((1<<uint(s))-1)) != 0 {
 			// negative or unaligned offset, use constant pool
@@ -3960,8 +3971,8 @@
 			goto loadusepool
 		}
 
-		o1 = c.oaddi(p, int32(c.opirr(p, AADD)), hi, r, REGTMP)
-		o2 = c.olsr12u(p, int32(c.opldr(p, p.As)), ((v-hi)>>uint(s))&0xFFF, REGTMP, int(p.To.Reg))
+		o1 = c.oaddi(p, AADD, hi, REGTMP, r)
+		o2 = c.olsr12u(p, c.opldr(p, p.As), ((v-hi)>>uint(s))&0xFFF, REGTMP, p.To.Reg)
 		break
 
 	loadusepool:
@@ -3969,7 +3980,7 @@
 			c.ctxt.Diag("REGTMP used in large offset load: %v", p)
 		}
 		o1 = c.omovlit(AMOVD, p, &p.From, REGTMP)
-		o2 = c.olsxrr(p, int32(c.opldrr(p, p.As, false)), int(p.To.Reg), r, REGTMP)
+		o2 = c.olsxrr(p, int32(c.opldrr(p, p.As, false)), int(p.To.Reg), int(r), REGTMP)
 
 	case 32: /* mov $con, R -> movz/movn */
 		o1 = c.omovconst(p.As, p, &p.From, int(p.To.Reg))
@@ -3997,15 +4008,11 @@
 
 	case 34: /* mov $lacon,R */
 		o1 = c.omovlit(AMOVD, p, &p.From, REGTMP)
-
-		if o1 == 0 {
-			break
-		}
 		o2 = c.opxrrr(p, AADD, false)
 		o2 |= REGTMP & 31 << 16
 		o2 |= LSL0_64
 		r := int(p.From.Reg)
-		if r == 0 {
+		if r == obj.REG_NONE {
 			r = int(o.param)
 		}
 		o2 |= uint32(r&31) << 5
@@ -4102,16 +4109,14 @@
 		o1 = c.op0(p, p.As)
 
 	case 42: /* bfm R,r,s,R */
-		o1 = c.opbfm(p, p.As, int(p.From.Offset), int(p.GetFrom3().Offset), int(p.Reg), int(p.To.Reg))
+		o1 = c.opbfm(p, p.As, p.From.Offset, p.GetFrom3().Offset, p.Reg, p.To.Reg)
 
 	case 43: /* bfm aliases */
-		r := int(p.From.Offset)
-		s := int(p.GetFrom3().Offset)
-		rf := int(p.Reg)
-		rt := int(p.To.Reg)
-		if rf == 0 {
+		rt, rf := p.To.Reg, p.Reg
+		if rf == obj.REG_NONE {
 			rf = rt
 		}
+		r, s := p.From.Offset, p.GetFrom3().Offset
 		switch p.As {
 		case ABFI:
 			if r != 0 {
@@ -4173,13 +4178,11 @@
 		}
 
 	case 44: /* extr $b, Rn, Rm, Rd */
-		o1 = c.opextr(p, p.As, int32(p.From.Offset), int(p.GetFrom3().Reg), int(p.Reg), int(p.To.Reg))
+		o1 = c.opextr(p, p.As, p.From.Offset, p.GetFrom3().Reg, p.Reg, p.To.Reg)
 
 	case 45: /* sxt/uxt[bhw] R,R; movT R,R -> sxtT R,R */
-		rf := int(p.From.Reg)
-
-		rt := int(p.To.Reg)
 		as := p.As
+		rt, rf := p.To.Reg, p.From.Reg
 		if rf == REGZERO {
 			as = AMOVWU /* clearer in disassembly */
 		}
@@ -4237,17 +4240,8 @@
 		if rt == REG_RSP {
 			c.ctxt.Diag("illegal destination register: %v\n", p)
 		}
-		if enc, ok := atomicLDADD[p.As]; ok {
-			// for LDADDx-like instructions, rt can't be r31 when field.enc A is 0, A bit is the 23rd bit.
-			if (rt == REGZERO) && (enc&(1<<23) == 0) {
-				c.ctxt.Diag("illegal destination register: %v\n", p)
-			}
-			o1 |= enc
-		} else if enc, ok := atomicSWP[p.As]; ok {
-			o1 |= enc
-		} else {
-			c.ctxt.Diag("invalid atomic instructions: %v\n", p)
-		}
+
+		o1 = atomicLDADD[p.As] | atomicSWP[p.As]
 		o1 |= uint32(rs&31)<<16 | uint32(rb&31)<<5 | uint32(rt&31)
 
 	case 48: /* ADD $C_ADDCON2, Rm, Rd */
@@ -4257,13 +4251,25 @@
 		if op&Sbit != 0 {
 			c.ctxt.Diag("can not break addition/subtraction when S bit is set", p)
 		}
-		rt := int(p.To.Reg)
-		r := int(p.Reg)
-		if r == 0 {
+		rt, r := p.To.Reg, p.Reg
+		if r == obj.REG_NONE {
 			r = rt
 		}
-		o1 = c.oaddi(p, int32(op), int32(c.regoff(&p.From))&0x000fff, r, rt)
-		o2 = c.oaddi(p, int32(op), int32(c.regoff(&p.From))&0xfff000, rt, rt)
+		o1 = c.oaddi(p, p.As, c.regoff(&p.From)&0x000fff, rt, r)
+		o2 = c.oaddi(p, p.As, c.regoff(&p.From)&0xfff000, rt, rt)
+
+	case 49: /* op Vm.<T>, Vn, Vd */
+		o1 = c.oprrr(p, p.As)
+		cf := c.aclass(&p.From)
+		af := (p.From.Reg >> 5) & 15
+		sz := ARNG_4S
+		if p.As == ASHA512H || p.As == ASHA512H2 {
+			sz = ARNG_2D
+		}
+		if cf == C_ARNG && af != int16(sz) {
+			c.ctxt.Diag("invalid arrangement: %v", p)
+		}
+		o1 |= uint32(p.From.Reg&31)<<16 | uint32(p.Reg&31)<<5 | uint32(p.To.Reg&31)
 
 	case 50: /* sys/sysl */
 		o1 = c.opirr(p, p.As)
@@ -4297,7 +4303,7 @@
 			rt = REGZERO
 		}
 		r := int(p.Reg)
-		if r == 0 {
+		if r == obj.REG_NONE {
 			r = rt
 		}
 		if r == REG_RSP {
@@ -4326,7 +4332,7 @@
 		if (o1&(0x1F<<24)) == (0x1E<<24) && (o1&(1<<11)) == 0 { /* monadic */
 			r = rf
 			rf = 0
-		} else if r == 0 {
+		} else if r == obj.REG_NONE {
 			r = rt
 		}
 		o1 |= (uint32(rf&31) << 16) | (uint32(r&31) << 5) | uint32(rt&31)
@@ -4452,7 +4458,7 @@
 			rt = REGZERO
 		}
 		r := int(p.Reg)
-		if r == 0 {
+		if r == obj.REG_NONE {
 			r = rt
 		}
 		if p.To.Reg == REGSP || r == REGSP {
@@ -4466,6 +4472,20 @@
 		o2 |= uint32(r&31) << 5
 		o2 |= uint32(rt & 31)
 
+	case 63: /* op Vm.<t>, Vn.<T>, Vd.<T> */
+		o1 |= c.oprrr(p, p.As)
+		af := (p.From.Reg >> 5) & 15
+		at := (p.To.Reg >> 5) & 15
+		ar := (p.Reg >> 5) & 15
+		sz := ARNG_4S
+		if p.As == ASHA512SU1 {
+			sz = ARNG_2D
+		}
+		if af != at || af != ar || af != int16(sz) {
+			c.ctxt.Diag("invalid arrangement: %v", p)
+		}
+		o1 |= uint32(p.From.Reg&31)<<16 | uint32(p.Reg&31)<<5 | uint32(p.To.Reg&31)
+
 	/* reloc ops */
 	case 64: /* movT R,addr -> adrp + movT R, (REGTMP) */
 		if p.From.Reg == REGTMP {
@@ -4480,11 +4500,11 @@
 		// For unaligned access, fall back to adrp + add + movT R, (REGTMP).
 		if o.size(c.ctxt, p) != 8 {
 			o2 = c.opirr(p, AADD) | REGTMP&31<<5 | REGTMP&31
-			o3 = c.olsr12u(p, int32(c.opstr(p, p.As)), 0, REGTMP, int(p.From.Reg))
+			o3 = c.olsr12u(p, c.opstr(p, p.As), 0, REGTMP, p.From.Reg)
 			rel.Type = objabi.R_ADDRARM64
 			break
 		}
-		o2 = c.olsr12u(p, int32(c.opstr(p, p.As)), 0, REGTMP, int(p.From.Reg))
+		o2 = c.olsr12u(p, c.opstr(p, p.As), 0, REGTMP, p.From.Reg)
 		rel.Type = c.addrRelocType(p)
 
 	case 65: /* movT addr,R -> adrp + movT (REGTMP), R */
@@ -4497,34 +4517,34 @@
 		// For unaligned access, fall back to adrp + add + movT (REGTMP), R.
 		if o.size(c.ctxt, p) != 8 {
 			o2 = c.opirr(p, AADD) | REGTMP&31<<5 | REGTMP&31
-			o3 = c.olsr12u(p, int32(c.opldr(p, p.As)), 0, REGTMP, int(p.To.Reg))
+			o3 = c.olsr12u(p, c.opldr(p, p.As), 0, REGTMP, p.To.Reg)
 			rel.Type = objabi.R_ADDRARM64
 			break
 		}
-		o2 = c.olsr12u(p, int32(c.opldr(p, p.As)), 0, REGTMP, int(p.To.Reg))
+		o2 = c.olsr12u(p, c.opldr(p, p.As), 0, REGTMP, p.To.Reg)
 		rel.Type = c.addrRelocType(p)
 
 	case 66: /* ldp O(R)!, (r1, r2); ldp (R)O!, (r1, r2) */
-		v := int32(c.regoff(&p.From))
-		r := int(p.From.Reg)
-		if r == obj.REG_NONE {
-			r = int(o.param)
+		rf, rt1, rt2 := p.From.Reg, p.To.Reg, int16(p.To.Offset)
+		if rf == obj.REG_NONE {
+			rf = o.param
 		}
-		if r == obj.REG_NONE {
+		if rf == obj.REG_NONE {
 			c.ctxt.Diag("invalid ldp source: %v\n", p)
 		}
-		o1 |= c.opldpstp(p, o, v, uint32(r), uint32(p.To.Reg), uint32(p.To.Offset), 1)
+		v := c.regoff(&p.From)
+		o1 = c.opldpstp(p, o, v, rf, rt1, rt2, 1)
 
 	case 67: /* stp (r1, r2), O(R)!; stp (r1, r2), (R)O! */
-		r := int(p.To.Reg)
-		if r == obj.REG_NONE {
-			r = int(o.param)
+		rt, rf1, rf2 := p.To.Reg, p.From.Reg, int16(p.From.Offset)
+		if rt == obj.REG_NONE {
+			rt = o.param
 		}
-		if r == obj.REG_NONE {
+		if rt == obj.REG_NONE {
 			c.ctxt.Diag("invalid stp destination: %v\n", p)
 		}
-		v := int32(c.regoff(&p.To))
-		o1 = c.opldpstp(p, o, v, uint32(r), uint32(p.From.Reg), uint32(p.From.Offset), 0)
+		v := c.regoff(&p.To)
+		o1 = c.opldpstp(p, o, v, rt, rf1, rf2, 0)
 
 	case 68: /* movT $vconaddr(SB), reg -> adrp + add + reloc */
 		// NOTE: this case does not use REGTMP. If it ever does,
@@ -4555,7 +4575,7 @@
 
 	case 70: /* IE model movd $tlsvar, reg -> adrp REGTMP, 0; ldr reg, [REGTMP, #0] + relocs */
 		o1 = ADR(1, 0, REGTMP)
-		o2 = c.olsr12u(p, int32(c.opldr(p, AMOVD)), 0, REGTMP, int(p.To.Reg))
+		o2 = c.olsr12u(p, c.opldr(p, AMOVD), 0, REGTMP, p.To.Reg)
 		rel := obj.Addrel(c.cursym)
 		rel.Off = int32(c.pc)
 		rel.Siz = 8
@@ -4568,7 +4588,7 @@
 
 	case 71: /* movd sym@GOT, reg -> adrp REGTMP, #0; ldr reg, [REGTMP, #0] + relocs */
 		o1 = ADR(1, 0, REGTMP)
-		o2 = c.olsr12u(p, int32(c.opldr(p, AMOVD)), 0, REGTMP, int(p.To.Reg))
+		o2 = c.olsr12u(p, c.opldr(p, AMOVD), 0, REGTMP, p.To.Reg)
 		rel := obj.Addrel(c.cursym)
 		rel.Off = int32(c.pc)
 		rel.Siz = 8
@@ -4686,98 +4706,75 @@
 	case 74:
 		//	add $O, R, Rtmp or sub $O, R, Rtmp
 		//	ldp (Rtmp), (R1, R2)
-		r := int(p.From.Reg)
-		if r == obj.REG_NONE {
-			r = int(o.param)
+		rf, rt1, rt2 := p.From.Reg, p.To.Reg, int16(p.To.Offset)
+		if rf == obj.REG_NONE {
+			rf = o.param
 		}
-		if r == obj.REG_NONE {
+		if rf == obj.REG_NONE {
 			c.ctxt.Diag("invalid ldp source: %v", p)
 		}
-		v := int32(c.regoff(&p.From))
-
-		if v > 0 {
-			if v > 4095 {
-				c.ctxt.Diag("offset out of range: %v", p)
-			}
-			o1 = c.oaddi(p, int32(c.opirr(p, AADD)), v, r, REGTMP)
-		}
-		if v < 0 {
-			if v < -4095 {
-				c.ctxt.Diag("offset out of range: %v", p)
-			}
-			o1 = c.oaddi(p, int32(c.opirr(p, ASUB)), -v, r, REGTMP)
-		}
-		o2 |= c.opldpstp(p, o, 0, uint32(REGTMP), uint32(p.To.Reg), uint32(p.To.Offset), 1)
+		v := c.regoff(&p.From)
+		o1 = c.oaddi12(p, v, REGTMP, rf)
+		o2 = c.opldpstp(p, o, 0, REGTMP, rt1, rt2, 1)
 
 	case 75:
 		//	mov $L, Rtmp (from constant pool)
 		//	add Rtmp, R, Rtmp
 		//	ldp (Rtmp), (R1, R2)
-		r := int(p.From.Reg)
-		if r == REGTMP {
+		rf, rt1, rt2 := int(p.From.Reg), p.To.Reg, int16(p.To.Offset)
+		if rf == REGTMP {
 			c.ctxt.Diag("REGTMP used in large offset load: %v", p)
 		}
-		if r == obj.REG_NONE {
-			r = int(o.param)
+		if rf == obj.REG_NONE {
+			rf = int(o.param)
 		}
-		if r == obj.REG_NONE {
+		if rf == obj.REG_NONE {
 			c.ctxt.Diag("invalid ldp source: %v", p)
 		}
 		o1 = c.omovlit(AMOVD, p, &p.From, REGTMP)
 		o2 = c.opxrrr(p, AADD, false)
 		o2 |= (REGTMP & 31) << 16
-		o2 |= uint32(r&31) << 5
+		o2 |= uint32(rf&31) << 5
 		o2 |= uint32(REGTMP & 31)
-		o3 |= c.opldpstp(p, o, 0, uint32(REGTMP), uint32(p.To.Reg), uint32(p.To.Offset), 1)
+		o3 = c.opldpstp(p, o, 0, REGTMP, rt1, rt2, 1)
 
 	case 76:
 		//	add $O, R, Rtmp or sub $O, R, Rtmp
 		//	stp (R1, R2), (Rtmp)
-		if p.From.Reg == REGTMP || p.From.Offset == REGTMP {
+		rt, rf1, rf2 := p.To.Reg, p.From.Reg, int16(p.From.Offset)
+		if rf1 == REGTMP || rf2 == REGTMP {
 			c.ctxt.Diag("cannot use REGTMP as source: %v", p)
 		}
-		r := int(p.To.Reg)
-		if r == obj.REG_NONE {
-			r = int(o.param)
+		if rt == obj.REG_NONE {
+			rt = o.param
 		}
-		if r == obj.REG_NONE {
+		if rt == obj.REG_NONE {
 			c.ctxt.Diag("invalid stp destination: %v", p)
 		}
-		v := int32(c.regoff(&p.To))
-		if v > 0 {
-			if v > 4095 {
-				c.ctxt.Diag("offset out of range: %v", p)
-			}
-			o1 = c.oaddi(p, int32(c.opirr(p, AADD)), v, r, REGTMP)
-		}
-		if v < 0 {
-			if v < -4095 {
-				c.ctxt.Diag("offset out of range: %v", p)
-			}
-			o1 = c.oaddi(p, int32(c.opirr(p, ASUB)), -v, r, REGTMP)
-		}
-		o2 |= c.opldpstp(p, o, 0, uint32(REGTMP), uint32(p.From.Reg), uint32(p.From.Offset), 0)
+		v := c.regoff(&p.To)
+		o1 = c.oaddi12(p, v, REGTMP, rt)
+		o2 = c.opldpstp(p, o, 0, REGTMP, rf1, rf2, 0)
 
 	case 77:
 		//	mov $L, Rtmp (from constant pool)
 		//	add Rtmp, R, Rtmp
 		//	stp (R1, R2), (Rtmp)
-		r := int(p.To.Reg)
-		if r == REGTMP || p.From.Reg == REGTMP || p.From.Offset == REGTMP {
+		rt, rf1, rf2 := int(p.To.Reg), p.From.Reg, int16(p.From.Offset)
+		if rt == REGTMP || rf1 == REGTMP || rf2 == REGTMP {
 			c.ctxt.Diag("REGTMP used in large offset store: %v", p)
 		}
-		if r == obj.REG_NONE {
-			r = int(o.param)
+		if rt == obj.REG_NONE {
+			rt = int(o.param)
 		}
-		if r == obj.REG_NONE {
+		if rt == obj.REG_NONE {
 			c.ctxt.Diag("invalid stp destination: %v", p)
 		}
 		o1 = c.omovlit(AMOVD, p, &p.To, REGTMP)
 		o2 = c.opxrrr(p, AADD, false)
 		o2 |= REGTMP & 31 << 16
-		o2 |= uint32(r&31) << 5
+		o2 |= uint32(rt&31) << 5
 		o2 |= uint32(REGTMP & 31)
-		o3 |= c.opldpstp(p, o, 0, uint32(REGTMP), uint32(p.From.Reg), uint32(p.From.Offset), 0)
+		o3 = c.opldpstp(p, o, 0, REGTMP, rf1, rf2, 0)
 
 	case 78: /* vmov R, V.<T>[index] */
 		rf := int(p.From.Reg)
@@ -5071,7 +5068,8 @@
 		o1 |= (uint32(Q&1) << 30) | (uint32((r>>5)&7) << 16) | (uint32(r&0x1f) << 5) | uint32(rt&31)
 
 	case 87: /* stp (r,r), addr(SB) -> adrp + add + stp */
-		if p.From.Reg == REGTMP || p.From.Offset == REGTMP {
+		rf1, rf2 := p.From.Reg, int16(p.From.Offset)
+		if rf1 == REGTMP || rf2 == REGTMP {
 			c.ctxt.Diag("cannot use REGTMP as source: %v", p)
 		}
 		o1 = ADR(1, 0, REGTMP)
@@ -5082,9 +5080,10 @@
 		rel.Sym = p.To.Sym
 		rel.Add = p.To.Offset
 		rel.Type = objabi.R_ADDRARM64
-		o3 |= c.opldpstp(p, o, 0, uint32(REGTMP), uint32(p.From.Reg), uint32(p.From.Offset), 0)
+		o3 = c.opldpstp(p, o, 0, REGTMP, rf1, rf2, 0)
 
 	case 88: /* ldp addr(SB), (r,r) -> adrp + add + ldp */
+		rt1, rt2 := p.To.Reg, int16(p.To.Offset)
 		o1 = ADR(1, 0, REGTMP)
 		o2 = c.opirr(p, AADD) | REGTMP&31<<5 | REGTMP&31
 		rel := obj.Addrel(c.cursym)
@@ -5093,7 +5092,7 @@
 		rel.Sym = p.From.Sym
 		rel.Add = p.From.Offset
 		rel.Type = objabi.R_ADDRARM64
-		o3 |= c.opldpstp(p, o, 0, uint32(REGTMP), uint32(p.To.Reg), uint32(p.To.Offset), 1)
+		o3 = c.opldpstp(p, o, 0, REGTMP, rt1, rt2, 1)
 
 	case 89: /* vadd/vsub Vm, Vn, Vd */
 		switch p.As {
@@ -5111,7 +5110,7 @@
 		rf := int(p.From.Reg)
 		rt := int(p.To.Reg)
 		r := int(p.Reg)
-		if r == 0 {
+		if r == obj.REG_NONE {
 			r = rt
 		}
 		o1 |= (uint32(rf&31) << 16) | (uint32(r&31) << 5) | uint32(rt&31)
@@ -5309,7 +5308,7 @@
 		rf := int((p.To.Reg) & 31)
 		r := int(p.To.Index & 31)
 		index := int(p.From.Index)
-		offset := int32(c.regoff(&p.To))
+		offset := c.regoff(&p.To)
 
 		if o.scond == C_XPOST {
 			if (p.To.Index != 0) && (offset != 0) {
@@ -5381,7 +5380,7 @@
 		rf := int((p.From.Reg) & 31)
 		r := int(p.From.Index & 31)
 		index := int(p.To.Index)
-		offset := int32(c.regoff(&p.From))
+		offset := c.regoff(&p.From)
 
 		if o.scond == C_XPOST {
 			if (p.From.Index != 0) && (offset != 0) {
@@ -5675,12 +5674,12 @@
 		}
 		o1 = c.opirr(p, p.As)
 		if op.hasOperand2 {
-			if p.To.Reg == 0 {
+			if p.To.Reg == obj.REG_NONE {
 				c.ctxt.Diag("missing register at operand 2: %v\n", p)
 			}
 			o1 |= uint32(p.To.Reg & 0x1F)
 		} else {
-			if p.To.Reg != 0 || p.Reg != 0 {
+			if p.To.Reg != obj.REG_NONE || p.Reg != obj.REG_NONE {
 				c.ctxt.Diag("extraneous register at operand 2: %v\n", p)
 			}
 			o1 |= uint32(0x1F)
@@ -6909,12 +6908,6 @@
 
 	case ALDXPW:
 		return LDSTX(2, 0, 1, 1, 0)
-
-	case AMOVNP:
-		return S64 | 0<<30 | 5<<27 | 0<<26 | 0<<23 | 1<<22
-
-	case AMOVNPW:
-		return S32 | 0<<30 | 5<<27 | 0<<26 | 0<<23 | 1<<22
 	}
 
 	c.ctxt.Diag("bad opload %v\n%v", a, p)
@@ -6932,12 +6925,6 @@
 	case ASTLRH:
 		return LDSTX(1, 1, 0, 0, 1) | 0x1F<<10
 
-	case ASTLP:
-		return LDSTX(3, 0, 0, 1, 1)
-
-	case ASTLPW:
-		return LDSTX(2, 0, 0, 1, 1)
-
 	case ASTLRW:
 		return LDSTX(2, 1, 0, 0, 1) | 0x1F<<10
 
@@ -6976,12 +6963,6 @@
 
 	case ASTXRW:
 		return LDSTX(2, 0, 0, 0, 0) | 0x1F<<10
-
-	case AMOVNP:
-		return S64 | 0<<30 | 5<<27 | 0<<26 | 0<<23 | 1<<22
-
-	case AMOVNPW:
-		return S32 | 0<<30 | 5<<27 | 0<<26 | 0<<23 | 1<<22
 	}
 
 	c.ctxt.Diag("bad opstore %v\n%v", a, p)
@@ -6992,28 +6973,28 @@
  * load/store register (scaled 12-bit unsigned immediate) C3.3.13
  *	these produce 64-bit values (when there's an option)
  */
-func (c *ctxt7) olsr12u(p *obj.Prog, o int32, v int32, b int, r int) uint32 {
+func (c *ctxt7) olsr12u(p *obj.Prog, o uint32, v int32, rn, rt int16) uint32 {
 	if v < 0 || v >= (1<<12) {
 		c.ctxt.Diag("offset out of range: %d\n%v", v, p)
 	}
-	o |= (v & 0xFFF) << 10
-	o |= int32(b&31) << 5
-	o |= int32(r & 31)
+	o |= uint32(v&0xFFF) << 10
+	o |= uint32(rn&31) << 5
+	o |= uint32(rt & 31)
 	o |= 1 << 24
-	return uint32(o)
+	return o
 }
 
 /*
  * load/store register (unscaled 9-bit signed immediate) C3.3.12
  */
-func (c *ctxt7) olsr9s(p *obj.Prog, o int32, v int32, b int, r int) uint32 {
+func (c *ctxt7) olsr9s(p *obj.Prog, o uint32, v int32, rn, rt int16) uint32 {
 	if v < -256 || v > 255 {
 		c.ctxt.Diag("offset out of range: %d\n%v", v, p)
 	}
-	o |= (v & 0x1FF) << 12
-	o |= int32(b&31) << 5
-	o |= int32(r & 31)
-	return uint32(o)
+	o |= uint32((v & 0x1FF) << 12)
+	o |= uint32(rn&31) << 5
+	o |= uint32(rt & 31)
+	return o
 }
 
 // store(immediate)
@@ -7141,17 +7122,33 @@
 	return 0
 }
 
-func (c *ctxt7) oaddi(p *obj.Prog, o1 int32, v int32, r int, rt int) uint32 {
+func (c *ctxt7) oaddi(p *obj.Prog, a obj.As, v int32, rd, rn int16) uint32 {
+	op := c.opirr(p, a)
+
 	if (v & 0xFFF000) != 0 {
 		if v&0xFFF != 0 {
 			c.ctxt.Diag("%v misuses oaddi", p)
 		}
 		v >>= 12
-		o1 |= 1 << 22
+		op |= 1 << 22
 	}
 
-	o1 |= ((v & 0xFFF) << 10) | (int32(r&31) << 5) | int32(rt&31)
-	return uint32(o1)
+	op |= (uint32(v&0xFFF) << 10) | (uint32(rn&31) << 5) | uint32(rd&31)
+
+	return op
+}
+
+func (c *ctxt7) oaddi12(p *obj.Prog, v int32, rd, rn int16) uint32 {
+	if v < -4095 || v > 4095 {
+		c.ctxt.Diag("%v is not a 12 bit immediate: %v", v, p)
+		return 0
+	}
+	a := AADD
+	if v < 0 {
+		a = ASUB
+		v = -v
+	}
+	return c.oaddi(p, a, v, rd, rn)
 }
 
 /*
@@ -7415,7 +7412,7 @@
 	}
 }
 
-func (c *ctxt7) opbfm(p *obj.Prog, a obj.As, r int, s int, rf int, rt int) uint32 {
+func (c *ctxt7) opbfm(p *obj.Prog, a obj.As, r, s int64, rf, rt int16) uint32 {
 	var b uint32
 	o := c.opirr(p, a)
 	if (o & (1 << 31)) == 0 {
@@ -7435,7 +7432,7 @@
 	return o
 }
 
-func (c *ctxt7) opextr(p *obj.Prog, a obj.As, v int32, rn int, rm int, rt int) uint32 {
+func (c *ctxt7) opextr(p *obj.Prog, a obj.As, v int64, rn, rm, rt int16) uint32 {
 	var b uint32
 	o := c.opirr(p, a)
 	if (o & (1 << 31)) != 0 {
@@ -7454,7 +7451,7 @@
 }
 
 /* generate instruction encoding for ldp and stp series */
-func (c *ctxt7) opldpstp(p *obj.Prog, o *Optab, vo int32, rbase, rl, rh, ldp uint32) uint32 {
+func (c *ctxt7) opldpstp(p *obj.Prog, o *Optab, vo int32, rbase, rl, rh int16, ldp uint32) uint32 {
 	wback := false
 	if o.scond == C_XPOST || o.scond == C_XPRE {
 		wback = true
@@ -7535,7 +7532,7 @@
 	default:
 		ret |= 2 << 23
 	}
-	ret |= 5<<27 | (ldp&1)<<22 | uint32(vo&0x7f)<<15 | (rh&31)<<10 | (rbase&31)<<5 | (rl & 31)
+	ret |= 5<<27 | (ldp&1)<<22 | uint32(vo&0x7f)<<15 | uint32(rh&31)<<10 | uint32(rbase&31)<<5 | uint32(rl&31)
 	return ret
 }
 
diff --git a/src/cmd/internal/obj/arm64/obj7.go b/src/cmd/internal/obj/arm64/obj7.go
index 6c2cb63..f963f62 100644
--- a/src/cmd/internal/obj/arm64/obj7.go
+++ b/src/cmd/internal/obj/arm64/obj7.go
@@ -35,6 +35,7 @@
 	"cmd/internal/objabi"
 	"cmd/internal/src"
 	"cmd/internal/sys"
+	"internal/abi"
 	"internal/buildcfg"
 	"log"
 	"math"
@@ -169,7 +170,7 @@
 	p = c.ctxt.StartUnsafePoint(p, c.newprog)
 
 	q := (*obj.Prog)(nil)
-	if framesize <= objabi.StackSmall {
+	if framesize <= abi.StackSmall {
 		// small stack: SP < stackguard
 		//	CMP	stackguard, SP
 
@@ -178,7 +179,7 @@
 		p.From.Type = obj.TYPE_REG
 		p.From.Reg = REGRT1
 		p.Reg = REGSP
-	} else if framesize <= objabi.StackBig {
+	} else if framesize <= abi.StackBig {
 		// large stack: SP-framesize < stackguard-StackSmall
 		//	SUB	$(framesize-StackSmall), SP, RT2
 		//	CMP	stackguard, RT2
@@ -186,7 +187,7 @@
 
 		p.As = ASUB
 		p.From.Type = obj.TYPE_CONST
-		p.From.Offset = int64(framesize) - objabi.StackSmall
+		p.From.Offset = int64(framesize) - abi.StackSmall
 		p.Reg = REGSP
 		p.To.Type = obj.TYPE_REG
 		p.To.Reg = REGRT2
@@ -212,7 +213,7 @@
 		p = obj.Appendp(p, c.newprog)
 		p.As = ASUBS
 		p.From.Type = obj.TYPE_CONST
-		p.From.Offset = int64(framesize) - objabi.StackSmall
+		p.From.Offset = int64(framesize) - abi.StackSmall
 		p.Reg = REGSP
 		p.To.Type = obj.TYPE_REG
 		p.To.Reg = REGRT2
@@ -582,7 +583,7 @@
 				}
 			}
 
-			if p.Mark&LEAF != 0 && c.autosize < objabi.StackSmall {
+			if p.Mark&LEAF != 0 && c.autosize < abi.StackSmall {
 				// A leaf function with a small stack can be marked
 				// NOSPLIT, avoiding a stack check.
 				p.From.Sym.Set(obj.AttrNoSplit, true)
@@ -1037,8 +1038,8 @@
 
 		if p.To.Type == obj.TYPE_REG && p.To.Reg == REGSP && p.Spadj == 0 {
 			f := c.cursym.Func()
-			if f.FuncFlag&objabi.FuncFlag_SPWRITE == 0 {
-				c.cursym.Func().FuncFlag |= objabi.FuncFlag_SPWRITE
+			if f.FuncFlag&abi.FuncFlagSPWrite == 0 {
+				c.cursym.Func().FuncFlag |= abi.FuncFlagSPWrite
 				if ctxt.Debugvlog || !ctxt.IsAsm {
 					ctxt.Logf("auto-SPWRITE: %s %v\n", c.cursym.Name, p)
 					if !ctxt.IsAsm {
diff --git a/src/cmd/internal/obj/dwarf.go b/src/cmd/internal/obj/dwarf.go
index a9c13fd..f1330c9 100644
--- a/src/cmd/internal/obj/dwarf.go
+++ b/src/cmd/internal/obj/dwarf.go
@@ -353,7 +353,9 @@
 	var scopes []dwarf.Scope
 	var inlcalls dwarf.InlCalls
 	if ctxt.DebugInfo != nil {
-		scopes, inlcalls = ctxt.DebugInfo(s, info, curfn)
+		// Don't need startPos because s.Func().StartLine is populated,
+		// as s is in this package.
+		scopes, inlcalls, _ = ctxt.DebugInfo(s, info, curfn)
 	}
 	var err error
 	dwctxt := dwCtxt{ctxt}
@@ -368,6 +370,7 @@
 		Absfn:         absfunc,
 		StartPC:       s,
 		Size:          s.Size,
+		StartLine:     s.Func().StartLine,
 		External:      !s.Static(),
 		Scopes:        scopes,
 		InlCalls:      inlcalls,
@@ -409,12 +412,11 @@
 		return
 	}
 	varname := varSym.Name
-	dieSymName := dwarf.InfoPrefix + varname
-	dieSym := ctxt.LookupInit(dieSymName, func(s *LSym) {
-		s.Type = objabi.SDWARFVAR
-		s.Set(AttrDuplicateOK, true) // needed for shared linkage
-		ctxt.Data = append(ctxt.Data, s)
-	})
+	dieSym := &LSym{
+		Type: objabi.SDWARFVAR,
+	}
+	varSym.NewVarInfo().dwarfInfoSym = dieSym
+	ctxt.Data = append(ctxt.Data, dieSym)
 	typeSym := ctxt.Lookup(dwarf.InfoPrefix + typename)
 	dwarf.PutGlobal(dwCtxt{ctxt}, dieSym, typeSym, varSym, varname)
 }
@@ -427,15 +429,15 @@
 	if s.Func() == nil {
 		s.NewFuncInfo()
 	}
-	scopes, _ := ctxt.DebugInfo(s, absfn, curfn)
+	scopes, _, startPos := ctxt.DebugInfo(s, absfn, curfn)
+	_, startLine := ctxt.getFileSymbolAndLine(startPos)
 	dwctxt := dwCtxt{ctxt}
-	filesym := ctxt.fileSymbol(s)
 	fnstate := dwarf.FnState{
 		Name:          s.Name,
 		Importpath:    myimportpath,
 		Info:          absfn,
-		Filesym:       filesym,
 		Absfn:         absfn,
+		StartLine:     startLine,
 		External:      !s.Static(),
 		Scopes:        scopes,
 		UseBASEntries: ctxt.UseBASEntries,
diff --git a/src/cmd/internal/obj/inl.go b/src/cmd/internal/obj/inl.go
index 934f1c2..6874471 100644
--- a/src/cmd/internal/obj/inl.go
+++ b/src/cmd/internal/obj/inl.go
@@ -50,21 +50,37 @@
 	Parent   int      // index of the parent in the InlTree or < 0 if outermost call
 	Pos      src.XPos // position of the inlined call
 	Func     *LSym    // function that was inlined
+	Name     string   // bare name of the function (w/o package prefix)
 	ParentPC int32    // PC of instruction just before inlined body. Only valid in local trees.
 }
 
 // Add adds a new call to the tree, returning its index.
-func (tree *InlTree) Add(parent int, pos src.XPos, func_ *LSym) int {
+func (tree *InlTree) Add(parent int, pos src.XPos, func_ *LSym, name string) int {
 	r := len(tree.nodes)
 	call := InlinedCall{
 		Parent: parent,
 		Pos:    pos,
 		Func:   func_,
+		Name:   name,
 	}
 	tree.nodes = append(tree.nodes, call)
 	return r
 }
 
+// AllParents invokes do on each InlinedCall in the inlining call
+// stack, from outermost to innermost.
+//
+// That is, if inlIndex corresponds to f inlining g inlining h,
+// AllParents invokes do with the call for inlining g into f, and then
+// inlining h into g.
+func (tree *InlTree) AllParents(inlIndex int, do func(InlinedCall)) {
+	if inlIndex >= 0 {
+		call := tree.nodes[inlIndex]
+		tree.AllParents(call.Parent, do)
+		do(call)
+	}
+}
+
 func (tree *InlTree) Parent(inlIndex int) int {
 	return tree.nodes[inlIndex].Parent
 }
@@ -108,20 +124,15 @@
 	return ctxt.PosTable.Pos(xpos)
 }
 
-// AllPos returns a slice of the positions inlined at xpos, from
-// innermost (index zero) to outermost.  To avoid allocation
-// the input slice is truncated, and used for the result, extended
-// as necessary.
-func (ctxt *Link) AllPos(xpos src.XPos, result []src.Pos) []src.Pos {
+// AllPos invokes do with every position in the inlining call stack for xpos,
+// from outermost to innermost. That is, xpos corresponds to f inlining g inlining h,
+// AllPos invokes do with the position in f, then the position in g, then the position in h.
+func (ctxt *Link) AllPos(xpos src.XPos, do func(src.Pos)) {
 	pos := ctxt.InnermostPos(xpos)
-	result = result[:0]
-	result = append(result, ctxt.PosTable.Pos(xpos))
-	for ix := pos.Base().InliningIndex(); ix >= 0; {
-		call := ctxt.InlTree.nodes[ix]
-		ix = call.Parent
-		result = append(result, ctxt.PosTable.Pos(call.Pos))
-	}
-	return result
+	ctxt.InlTree.AllParents(pos.Base().InliningIndex(), func(call InlinedCall) {
+		do(ctxt.InnermostPos(call.Pos))
+	})
+	do(pos)
 }
 
 func dumpInlTree(ctxt *Link, tree InlTree) {
diff --git a/src/cmd/internal/obj/link.go b/src/cmd/internal/obj/link.go
index 8037017..f13f9b4 100644
--- a/src/cmd/internal/obj/link.go
+++ b/src/cmd/internal/obj/link.go
@@ -37,7 +37,9 @@
 	"cmd/internal/objabi"
 	"cmd/internal/src"
 	"cmd/internal/sys"
+	"encoding/binary"
 	"fmt"
+	"internal/abi"
 	"sync"
 	"sync/atomic"
 )
@@ -299,7 +301,7 @@
 	Ctxt     *Link     // linker context
 	Link     *Prog     // next Prog in linked list
 	From     Addr      // first source operand
-	RestArgs []AddrPos // can pack any operands that not fit into {Prog.From, Prog.To}
+	RestArgs []AddrPos // can pack any operands that not fit into {Prog.From, Prog.To}, same kinds of operands are saved in order
 	To       Addr      // destination operand (second is RegTo2 below)
 	Pool     *Prog     // constant pool entry, for arm,arm64 back ends
 	Forwd    *Prog     // for x86 back end
@@ -334,69 +336,63 @@
 
 // From3Type returns p.GetFrom3().Type, or TYPE_NONE when
 // p.GetFrom3() returns nil.
-//
-// Deprecated: for the same reasons as Prog.GetFrom3.
 func (p *Prog) From3Type() AddrType {
-	if p.RestArgs == nil {
+	from3 := p.GetFrom3()
+	if from3 == nil {
 		return TYPE_NONE
 	}
-	return p.RestArgs[0].Type
+	return from3.Type
 }
 
 // GetFrom3 returns second source operand (the first is Prog.From).
+// The same kinds of operands are saved in order so GetFrom3 actually
+// return the first source operand in p.RestArgs.
 // In combination with Prog.From and Prog.To it makes common 3 operand
 // case easier to use.
-//
-// Should be used only when RestArgs is set with SetFrom3.
-//
-// Deprecated: better use RestArgs directly or define backend-specific getters.
-// Introduced to simplify transition to []Addr.
-// Usage of this is discouraged due to fragility and lack of guarantees.
 func (p *Prog) GetFrom3() *Addr {
-	if p.RestArgs == nil {
-		return nil
+	for i := range p.RestArgs {
+		if p.RestArgs[i].Pos == Source {
+			return &p.RestArgs[i].Addr
+		}
 	}
-	return &p.RestArgs[0].Addr
+	return nil
 }
 
-// SetFrom3 assigns []Args{{a, 0}} to p.RestArgs.
-// In pair with Prog.GetFrom3 it can help in emulation of Prog.From3.
-//
-// Deprecated: for the same reasons as Prog.GetFrom3.
-func (p *Prog) SetFrom3(a Addr) {
-	p.RestArgs = []AddrPos{{a, Source}}
+// AddRestSource assigns []Args{{a, Source}} to p.RestArgs.
+func (p *Prog) AddRestSource(a Addr) {
+	p.RestArgs = append(p.RestArgs, AddrPos{a, Source})
 }
 
-// SetFrom3Reg calls p.SetFrom3 with a register Addr containing reg.
-//
-// Deprecated: for the same reasons as Prog.GetFrom3.
-func (p *Prog) SetFrom3Reg(reg int16) {
-	p.SetFrom3(Addr{Type: TYPE_REG, Reg: reg})
+// AddRestSourceReg calls p.AddRestSource with a register Addr containing reg.
+func (p *Prog) AddRestSourceReg(reg int16) {
+	p.AddRestSource(Addr{Type: TYPE_REG, Reg: reg})
 }
 
-// SetFrom3Const calls p.SetFrom3 with a const Addr containing x.
-//
-// Deprecated: for the same reasons as Prog.GetFrom3.
-func (p *Prog) SetFrom3Const(off int64) {
-	p.SetFrom3(Addr{Type: TYPE_CONST, Offset: off})
+// AddRestSourceConst calls p.AddRestSource with a const Addr containing off.
+func (p *Prog) AddRestSourceConst(off int64) {
+	p.AddRestSource(Addr{Type: TYPE_CONST, Offset: off})
 }
 
-// SetTo2 assigns []Args{{a, 1}} to p.RestArgs when the second destination
+// AddRestDest assigns []Args{{a, Destination}} to p.RestArgs when the second destination
 // operand does not fit into prog.RegTo2.
-func (p *Prog) SetTo2(a Addr) {
-	p.RestArgs = []AddrPos{{a, Destination}}
+func (p *Prog) AddRestDest(a Addr) {
+	p.RestArgs = append(p.RestArgs, AddrPos{a, Destination})
 }
 
 // GetTo2 returns the second destination operand.
+// The same kinds of operands are saved in order so GetTo2 actually
+// return the first destination operand in Prog.RestArgs[]
 func (p *Prog) GetTo2() *Addr {
-	if p.RestArgs == nil {
-		return nil
+	for i := range p.RestArgs {
+		if p.RestArgs[i].Pos == Destination {
+			return &p.RestArgs[i].Addr
+		}
 	}
-	return &p.RestArgs[0].Addr
+	return nil
 }
 
-// SetRestArgs assigns more than one source operands to p.RestArgs.
-func (p *Prog) SetRestArgs(args []Addr) {
+// AddRestSourceArgs assigns more than one source operands to p.RestArgs.
+func (p *Prog) AddRestSourceArgs(args []Addr) {
 	for i := range args {
 		p.RestArgs = append(p.RestArgs, AddrPos{args[i], Source})
 	}
@@ -463,7 +459,7 @@
 	P      []byte
 	R      []Reloc
 
-	Extra *interface{} // *FuncInfo or *FileInfo, if present
+	Extra *interface{} // *FuncInfo, *VarInfo, *FileInfo, or *TypeInfo, if present
 
 	Pkg    string
 	PkgIdx int32
@@ -475,8 +471,8 @@
 	Args      int32
 	Locals    int32
 	Align     int32
-	FuncID    objabi.FuncID
-	FuncFlag  objabi.FuncFlag
+	FuncID    abi.FuncID
+	FuncFlag  abi.FuncFlag
 	StartLine int32
 	Text      *Prog
 	Autot     map[*LSym]struct{}
@@ -499,7 +495,11 @@
 	WrapInfo           *LSym // for wrapper, info of wrapped function
 	JumpTables         []JumpTable
 
-	FuncInfoSym *LSym
+	FuncInfoSym   *LSym
+	WasmImportSym *LSym
+	WasmImport    *WasmImport
+
+	sehUnwindInfoSym *LSym
 }
 
 // JumpTable represents a table used for implementing multi-way
@@ -531,6 +531,30 @@
 	return f
 }
 
+type VarInfo struct {
+	dwarfInfoSym *LSym
+}
+
+// NewVarInfo allocates and returns a VarInfo for LSym.
+func (s *LSym) NewVarInfo() *VarInfo {
+	if s.Extra != nil {
+		panic(fmt.Sprintf("invalid use of LSym - NewVarInfo with Extra of type %T", *s.Extra))
+	}
+	f := new(VarInfo)
+	s.Extra = new(interface{})
+	*s.Extra = f
+	return f
+}
+
+// VarInfo returns the *VarInfo associated with s, or else nil.
+func (s *LSym) VarInfo() *VarInfo {
+	if s.Extra == nil {
+		return nil
+	}
+	f, _ := (*s.Extra).(*VarInfo)
+	return f
+}
+
 // A FileInfo contains extra fields for SDATA symbols backed by files.
 // (If LSym.Extra is a *FileInfo, LSym.P == nil.)
 type FileInfo struct {
@@ -558,6 +582,91 @@
 	return f
 }
 
+// A TypeInfo contains information for a symbol
+// that contains a runtime._type.
+type TypeInfo struct {
+	Type interface{} // a *cmd/compile/internal/types.Type
+}
+
+func (s *LSym) NewTypeInfo() *TypeInfo {
+	if s.Extra != nil {
+		panic(fmt.Sprintf("invalid use of LSym - NewTypeInfo with Extra of type %T", *s.Extra))
+	}
+	t := new(TypeInfo)
+	s.Extra = new(interface{})
+	*s.Extra = t
+	return t
+}
+
+// WasmImport represents a WebAssembly (WASM) imported function with
+// parameters and results translated into WASM types based on the Go function
+// declaration.
+type WasmImport struct {
+	// Module holds the WASM module name specified by the //go:wasmimport
+	// directive.
+	Module string
+	// Name holds the WASM imported function name specified by the
+	// //go:wasmimport directive.
+	Name string
+	// Params holds the imported function parameter fields.
+	Params []WasmField
+	// Results holds the imported function result fields.
+	Results []WasmField
+}
+
+func (wi *WasmImport) CreateSym(ctxt *Link) *LSym {
+	var sym LSym
+
+	var b [8]byte
+	writeByte := func(x byte) {
+		sym.WriteBytes(ctxt, sym.Size, []byte{x})
+	}
+	writeUint32 := func(x uint32) {
+		binary.LittleEndian.PutUint32(b[:], x)
+		sym.WriteBytes(ctxt, sym.Size, b[:4])
+	}
+	writeInt64 := func(x int64) {
+		binary.LittleEndian.PutUint64(b[:], uint64(x))
+		sym.WriteBytes(ctxt, sym.Size, b[:])
+	}
+	writeString := func(s string) {
+		writeUint32(uint32(len(s)))
+		sym.WriteString(ctxt, sym.Size, len(s), s)
+	}
+	writeString(wi.Module)
+	writeString(wi.Name)
+	writeUint32(uint32(len(wi.Params)))
+	for _, f := range wi.Params {
+		writeByte(byte(f.Type))
+		writeInt64(f.Offset)
+	}
+	writeUint32(uint32(len(wi.Results)))
+	for _, f := range wi.Results {
+		writeByte(byte(f.Type))
+		writeInt64(f.Offset)
+	}
+
+	return &sym
+}
+
+type WasmField struct {
+	Type WasmFieldType
+	// Offset holds the frame-pointer-relative locations for Go's stack-based
+	// ABI. This is used by the src/cmd/internal/wasm package to map WASM
+	// import parameters to the Go stack in a wrapper function.
+	Offset int64
+}
+
+type WasmFieldType byte
+
+const (
+	WasmI32 WasmFieldType = iota
+	WasmI64
+	WasmF32
+	WasmF64
+	WasmPtr
+)
+
 type InlMark struct {
 	// When unwinding from an instruction in an inlined body, mark
 	// where we should unwind to.
@@ -724,6 +833,9 @@
 	// IsPcdata indicates this is a pcdata symbol.
 	AttrPcdata
 
+	// PkgInit indicates this is a compiler-generated package init func.
+	AttrPkgInit
+
 	// attrABIBase is the value at which the ABI is encoded in
 	// Attribute. This must be last; all bits after this are
 	// assumed to be an ABI value.
@@ -752,6 +864,7 @@
 func (a *Attribute) ContentAddressable() bool { return a.load()&AttrContentAddressable != 0 }
 func (a *Attribute) ABIWrapper() bool         { return a.load()&AttrABIWrapper != 0 }
 func (a *Attribute) IsPcdata() bool           { return a.load()&AttrPcdata != 0 }
+func (a *Attribute) IsPkgInit() bool          { return a.load()&AttrPkgInit != 0 }
 
 func (a *Attribute) Set(flag Attribute, value bool) {
 	for {
@@ -800,6 +913,7 @@
 	{bit: AttrIndexed, s: ""},
 	{bit: AttrContentAddressable, s: ""},
 	{bit: AttrABIWrapper, s: "ABIWRAPPER"},
+	{bit: AttrPkgInit, s: "PKGINIT"},
 }
 
 // String formats a for printing in as part of a TEXT prog.
@@ -832,7 +946,7 @@
 // TextAttrString formats the symbol attributes for printing in as part of a TEXT prog.
 func (s *LSym) TextAttrString() string {
 	attr := s.Attribute.String()
-	if s.Func().FuncFlag&objabi.FuncFlag_TOPFRAME != 0 {
+	if s.Func().FuncFlag&abi.FuncFlagTopFrame != 0 {
 		if attr != "" {
 			attr += "|"
 		}
@@ -916,7 +1030,7 @@
 	Imports            []goobj.ImportedPkg
 	DiagFunc           func(string, ...interface{})
 	DiagFlush          func()
-	DebugInfo          func(fn *LSym, info *LSym, curfn interface{}) ([]dwarf.Scope, dwarf.InlCalls) // if non-nil, curfn is a *gc.Node
+	DebugInfo          func(fn *LSym, info *LSym, curfn interface{}) ([]dwarf.Scope, dwarf.InlCalls, src.XPos) // if non-nil, curfn is a *ir.Func
 	GenAbstractFunc    func(fn *LSym)
 	Errors             int
 
@@ -995,6 +1109,7 @@
 	Preprocess     func(*Link, *LSym, ProgAlloc)
 	Assemble       func(*Link, *LSym, ProgAlloc)
 	Progedit       func(*Link, *Prog, ProgAlloc)
+	SEH            func(*Link, *LSym) *LSym
 	UnaryDst       map[As]bool // Instruction takes one operand, a destination.
 	DWARFRegisters map[int16]int16
 }
diff --git a/src/cmd/internal/obj/loong64/a.out.go b/src/cmd/internal/obj/loong64/a.out.go
index 88bf714..99a7da3 100644
--- a/src/cmd/internal/obj/loong64/a.out.go
+++ b/src/cmd/internal/obj/loong64/a.out.go
@@ -225,7 +225,8 @@
 	C_LOREG
 	C_GOK
 	C_ADDR
-	C_TLS
+	C_TLS_LE
+	C_TLS_IE
 	C_TEXTSIZE
 
 	C_NCLASS // must be the last
@@ -265,6 +266,7 @@
 	ALU12IW
 	ALU32ID
 	ALU52ID
+	APCALAU12I
 	APCADDU12I
 	AJIRL
 	ABGE
@@ -391,6 +393,11 @@
 	AMOVVF
 	AMOVVD
 
+	// 2.2.10. Other Miscellaneous Instructions
+	ARDTIMELW
+	ARDTIMEHW
+	ARDTIMED
+
 	ALAST
 
 	// aliases
diff --git a/src/cmd/internal/obj/loong64/anames.go b/src/cmd/internal/obj/loong64/anames.go
index 20e7465..f61756e 100644
--- a/src/cmd/internal/obj/loong64/anames.go
+++ b/src/cmd/internal/obj/loong64/anames.go
@@ -33,6 +33,7 @@
 	"LU12IW",
 	"LU32ID",
 	"LU52ID",
+	"PCALAU12I",
 	"PCADDU12I",
 	"JIRL",
 	"BGE",
@@ -130,5 +131,8 @@
 	"MOVDV",
 	"MOVVF",
 	"MOVVD",
+	"RDTIMELW",
+	"RDTIMEHW",
+	"RDTIMED",
 	"LAST",
 }
diff --git a/src/cmd/internal/obj/loong64/asm.go b/src/cmd/internal/obj/loong64/asm.go
index df3e9bf..0ab0caa 100644
--- a/src/cmd/internal/obj/loong64/asm.go
+++ b/src/cmd/internal/obj/loong64/asm.go
@@ -7,7 +7,6 @@
 import (
 	"cmd/internal/obj"
 	"cmd/internal/objabi"
-	"cmd/internal/sys"
 	"fmt"
 	"log"
 	"sort"
@@ -29,327 +28,362 @@
 
 const (
 	FuncAlign = 4
+	loopAlign = 16
 )
 
 type Optab struct {
-	as     obj.As
-	a1     uint8
-	a2     uint8
-	a3     uint8
-	type_  int8
-	size   int8
-	param  int16
-	family sys.ArchFamily
-	flag   uint8
+	as    obj.As
+	from1 uint8
+	reg   uint8
+	from3 uint8
+	to1   uint8
+	to2   uint8
+	type_ int8
+	size  int8
+	param int16
+	flag  uint8
 }
 
 const (
 	NOTUSETMP = 1 << iota // p expands to multiple instructions, but does NOT use REGTMP
+
+	// branchLoopHead marks loop entry.
+	// Used to insert padding for under-aligned loops.
+	branchLoopHead
 )
 
 var optab = []Optab{
-	{obj.ATEXT, C_ADDR, C_NONE, C_TEXTSIZE, 0, 0, 0, 0, 0},
+	{obj.ATEXT, C_ADDR, C_NONE, C_NONE, C_TEXTSIZE, C_NONE, 0, 0, 0, 0},
 
-	{AMOVW, C_REG, C_NONE, C_REG, 1, 4, 0, 0, 0},
-	{AMOVV, C_REG, C_NONE, C_REG, 1, 4, 0, sys.Loong64, 0},
-	{AMOVB, C_REG, C_NONE, C_REG, 12, 8, 0, 0, NOTUSETMP},
-	{AMOVBU, C_REG, C_NONE, C_REG, 13, 4, 0, 0, 0},
-	{AMOVWU, C_REG, C_NONE, C_REG, 14, 8, 0, sys.Loong64, NOTUSETMP},
+	{AMOVW, C_REG, C_NONE, C_NONE, C_REG, C_NONE, 1, 4, 0, 0},
+	{AMOVV, C_REG, C_NONE, C_NONE, C_REG, C_NONE, 1, 4, 0, 0},
+	{AMOVB, C_REG, C_NONE, C_NONE, C_REG, C_NONE, 12, 8, 0, NOTUSETMP},
+	{AMOVBU, C_REG, C_NONE, C_NONE, C_REG, C_NONE, 13, 4, 0, 0},
+	{AMOVWU, C_REG, C_NONE, C_NONE, C_REG, C_NONE, 14, 8, 0, NOTUSETMP},
 
-	{ASUB, C_REG, C_REG, C_REG, 2, 4, 0, 0, 0},
-	{ASUBV, C_REG, C_REG, C_REG, 2, 4, 0, sys.Loong64, 0},
-	{AADD, C_REG, C_REG, C_REG, 2, 4, 0, 0, 0},
-	{AADDV, C_REG, C_REG, C_REG, 2, 4, 0, sys.Loong64, 0},
-	{AAND, C_REG, C_REG, C_REG, 2, 4, 0, 0, 0},
-	{ASUB, C_REG, C_NONE, C_REG, 2, 4, 0, 0, 0},
-	{ASUBV, C_REG, C_NONE, C_REG, 2, 4, 0, sys.Loong64, 0},
-	{AADD, C_REG, C_NONE, C_REG, 2, 4, 0, 0, 0},
-	{AADDV, C_REG, C_NONE, C_REG, 2, 4, 0, sys.Loong64, 0},
-	{AAND, C_REG, C_NONE, C_REG, 2, 4, 0, 0, 0},
-	{ANEGW, C_REG, C_NONE, C_REG, 2, 4, 0, 0, 0},
-	{ANEGV, C_REG, C_NONE, C_REG, 2, 4, 0, sys.Loong64, 0},
-	{AMASKEQZ, C_REG, C_REG, C_REG, 2, 4, 0, 0, 0},
+	{ASUB, C_REG, C_REG, C_NONE, C_REG, C_NONE, 2, 4, 0, 0},
+	{ASUBV, C_REG, C_REG, C_NONE, C_REG, C_NONE, 2, 4, 0, 0},
+	{AADD, C_REG, C_REG, C_NONE, C_REG, C_NONE, 2, 4, 0, 0},
+	{AADDV, C_REG, C_REG, C_NONE, C_REG, C_NONE, 2, 4, 0, 0},
+	{AAND, C_REG, C_REG, C_NONE, C_REG, C_NONE, 2, 4, 0, 0},
+	{ASUB, C_REG, C_NONE, C_NONE, C_REG, C_NONE, 2, 4, 0, 0},
+	{ASUBV, C_REG, C_NONE, C_NONE, C_REG, C_NONE, 2, 4, 0, 0},
+	{AADD, C_REG, C_NONE, C_NONE, C_REG, C_NONE, 2, 4, 0, 0},
+	{AADDV, C_REG, C_NONE, C_NONE, C_REG, C_NONE, 2, 4, 0, 0},
+	{AAND, C_REG, C_NONE, C_NONE, C_REG, C_NONE, 2, 4, 0, 0},
+	{ANEGW, C_REG, C_NONE, C_NONE, C_REG, C_NONE, 2, 4, 0, 0},
+	{ANEGV, C_REG, C_NONE, C_NONE, C_REG, C_NONE, 2, 4, 0, 0},
+	{AMASKEQZ, C_REG, C_REG, C_NONE, C_REG, C_NONE, 2, 4, 0, 0},
 
-	{ASLL, C_REG, C_NONE, C_REG, 9, 4, 0, 0, 0},
-	{ASLL, C_REG, C_REG, C_REG, 9, 4, 0, 0, 0},
-	{ASLLV, C_REG, C_NONE, C_REG, 9, 4, 0, sys.Loong64, 0},
-	{ASLLV, C_REG, C_REG, C_REG, 9, 4, 0, sys.Loong64, 0},
-	{ACLO, C_REG, C_NONE, C_REG, 9, 4, 0, 0, 0},
+	{ASLL, C_REG, C_NONE, C_NONE, C_REG, C_NONE, 9, 4, 0, 0},
+	{ASLL, C_REG, C_REG, C_NONE, C_REG, C_NONE, 9, 4, 0, 0},
+	{ASLLV, C_REG, C_NONE, C_NONE, C_REG, C_NONE, 9, 4, 0, 0},
+	{ASLLV, C_REG, C_REG, C_NONE, C_REG, C_NONE, 9, 4, 0, 0},
+	{ACLO, C_REG, C_NONE, C_NONE, C_REG, C_NONE, 9, 4, 0, 0},
 
-	{AADDF, C_FREG, C_NONE, C_FREG, 32, 4, 0, 0, 0},
-	{AADDF, C_FREG, C_REG, C_FREG, 32, 4, 0, 0, 0},
-	{ACMPEQF, C_FREG, C_REG, C_NONE, 32, 4, 0, 0, 0},
-	{AABSF, C_FREG, C_NONE, C_FREG, 33, 4, 0, 0, 0},
-	{AMOVVF, C_FREG, C_NONE, C_FREG, 33, 4, 0, sys.Loong64, 0},
-	{AMOVF, C_FREG, C_NONE, C_FREG, 33, 4, 0, 0, 0},
-	{AMOVD, C_FREG, C_NONE, C_FREG, 33, 4, 0, 0, 0},
+	{AADDF, C_FREG, C_NONE, C_NONE, C_FREG, C_NONE, 32, 4, 0, 0},
+	{AADDF, C_FREG, C_REG, C_NONE, C_FREG, C_NONE, 32, 4, 0, 0},
+	{ACMPEQF, C_FREG, C_REG, C_NONE, C_NONE, C_NONE, 32, 4, 0, 0},
+	{AABSF, C_FREG, C_NONE, C_NONE, C_FREG, C_NONE, 33, 4, 0, 0},
+	{AMOVVF, C_FREG, C_NONE, C_NONE, C_FREG, C_NONE, 33, 4, 0, 0},
+	{AMOVF, C_FREG, C_NONE, C_NONE, C_FREG, C_NONE, 33, 4, 0, 0},
+	{AMOVD, C_FREG, C_NONE, C_NONE, C_FREG, C_NONE, 33, 4, 0, 0},
 
-	{AMOVW, C_REG, C_NONE, C_SEXT, 7, 4, 0, sys.Loong64, 0},
-	{AMOVWU, C_REG, C_NONE, C_SEXT, 7, 4, 0, sys.Loong64, 0},
-	{AMOVV, C_REG, C_NONE, C_SEXT, 7, 4, 0, sys.Loong64, 0},
-	{AMOVB, C_REG, C_NONE, C_SEXT, 7, 4, 0, sys.Loong64, 0},
-	{AMOVBU, C_REG, C_NONE, C_SEXT, 7, 4, 0, sys.Loong64, 0},
-	{AMOVWL, C_REG, C_NONE, C_SEXT, 7, 4, 0, sys.Loong64, 0},
-	{AMOVVL, C_REG, C_NONE, C_SEXT, 7, 4, 0, sys.Loong64, 0},
-	{AMOVW, C_REG, C_NONE, C_SAUTO, 7, 4, REGSP, 0, 0},
-	{AMOVWU, C_REG, C_NONE, C_SAUTO, 7, 4, REGSP, sys.Loong64, 0},
-	{AMOVV, C_REG, C_NONE, C_SAUTO, 7, 4, REGSP, sys.Loong64, 0},
-	{AMOVB, C_REG, C_NONE, C_SAUTO, 7, 4, REGSP, 0, 0},
-	{AMOVBU, C_REG, C_NONE, C_SAUTO, 7, 4, REGSP, 0, 0},
-	{AMOVWL, C_REG, C_NONE, C_SAUTO, 7, 4, REGSP, 0, 0},
-	{AMOVVL, C_REG, C_NONE, C_SAUTO, 7, 4, REGSP, sys.Loong64, 0},
-	{AMOVW, C_REG, C_NONE, C_SOREG, 7, 4, REGZERO, 0, 0},
-	{AMOVWU, C_REG, C_NONE, C_SOREG, 7, 4, REGZERO, sys.Loong64, 0},
-	{AMOVV, C_REG, C_NONE, C_SOREG, 7, 4, REGZERO, sys.Loong64, 0},
-	{AMOVB, C_REG, C_NONE, C_SOREG, 7, 4, REGZERO, 0, 0},
-	{AMOVBU, C_REG, C_NONE, C_SOREG, 7, 4, REGZERO, 0, 0},
-	{AMOVWL, C_REG, C_NONE, C_SOREG, 7, 4, REGZERO, 0, 0},
-	{AMOVVL, C_REG, C_NONE, C_SOREG, 7, 4, REGZERO, sys.Loong64, 0},
-	{ASC, C_REG, C_NONE, C_SOREG, 7, 4, REGZERO, 0, 0},
-	{ASCV, C_REG, C_NONE, C_SOREG, 7, 4, REGZERO, sys.Loong64, 0},
+	{AMOVW, C_REG, C_NONE, C_NONE, C_SEXT, C_NONE, 7, 4, 0, 0},
+	{AMOVWU, C_REG, C_NONE, C_NONE, C_SEXT, C_NONE, 7, 4, 0, 0},
+	{AMOVV, C_REG, C_NONE, C_NONE, C_SEXT, C_NONE, 7, 4, 0, 0},
+	{AMOVB, C_REG, C_NONE, C_NONE, C_SEXT, C_NONE, 7, 4, 0, 0},
+	{AMOVBU, C_REG, C_NONE, C_NONE, C_SEXT, C_NONE, 7, 4, 0, 0},
+	{AMOVWL, C_REG, C_NONE, C_NONE, C_SEXT, C_NONE, 7, 4, 0, 0},
+	{AMOVVL, C_REG, C_NONE, C_NONE, C_SEXT, C_NONE, 7, 4, 0, 0},
+	{AMOVW, C_REG, C_NONE, C_NONE, C_SAUTO, C_NONE, 7, 4, REGSP, 0},
+	{AMOVWU, C_REG, C_NONE, C_NONE, C_SAUTO, C_NONE, 7, 4, REGSP, 0},
+	{AMOVV, C_REG, C_NONE, C_NONE, C_SAUTO, C_NONE, 7, 4, REGSP, 0},
+	{AMOVB, C_REG, C_NONE, C_NONE, C_SAUTO, C_NONE, 7, 4, REGSP, 0},
+	{AMOVBU, C_REG, C_NONE, C_NONE, C_SAUTO, C_NONE, 7, 4, REGSP, 0},
+	{AMOVWL, C_REG, C_NONE, C_NONE, C_SAUTO, C_NONE, 7, 4, REGSP, 0},
+	{AMOVVL, C_REG, C_NONE, C_NONE, C_SAUTO, C_NONE, 7, 4, REGSP, 0},
+	{AMOVW, C_REG, C_NONE, C_NONE, C_SOREG, C_NONE, 7, 4, REGZERO, 0},
+	{AMOVWU, C_REG, C_NONE, C_NONE, C_SOREG, C_NONE, 7, 4, REGZERO, 0},
+	{AMOVV, C_REG, C_NONE, C_NONE, C_SOREG, C_NONE, 7, 4, REGZERO, 0},
+	{AMOVB, C_REG, C_NONE, C_NONE, C_SOREG, C_NONE, 7, 4, REGZERO, 0},
+	{AMOVBU, C_REG, C_NONE, C_NONE, C_SOREG, C_NONE, 7, 4, REGZERO, 0},
+	{AMOVWL, C_REG, C_NONE, C_NONE, C_SOREG, C_NONE, 7, 4, REGZERO, 0},
+	{AMOVVL, C_REG, C_NONE, C_NONE, C_SOREG, C_NONE, 7, 4, REGZERO, 0},
+	{ASC, C_REG, C_NONE, C_NONE, C_SOREG, C_NONE, 7, 4, REGZERO, 0},
+	{ASCV, C_REG, C_NONE, C_NONE, C_SOREG, C_NONE, 7, 4, REGZERO, 0},
 
-	{AMOVW, C_SEXT, C_NONE, C_REG, 8, 4, 0, sys.Loong64, 0},
-	{AMOVWU, C_SEXT, C_NONE, C_REG, 8, 4, 0, sys.Loong64, 0},
-	{AMOVV, C_SEXT, C_NONE, C_REG, 8, 4, 0, sys.Loong64, 0},
-	{AMOVB, C_SEXT, C_NONE, C_REG, 8, 4, 0, sys.Loong64, 0},
-	{AMOVBU, C_SEXT, C_NONE, C_REG, 8, 4, 0, sys.Loong64, 0},
-	{AMOVWL, C_SEXT, C_NONE, C_REG, 8, 4, 0, sys.Loong64, 0},
-	{AMOVVL, C_SEXT, C_NONE, C_REG, 8, 4, 0, sys.Loong64, 0},
-	{AMOVW, C_SAUTO, C_NONE, C_REG, 8, 4, REGSP, 0, 0},
-	{AMOVWU, C_SAUTO, C_NONE, C_REG, 8, 4, REGSP, sys.Loong64, 0},
-	{AMOVV, C_SAUTO, C_NONE, C_REG, 8, 4, REGSP, sys.Loong64, 0},
-	{AMOVB, C_SAUTO, C_NONE, C_REG, 8, 4, REGSP, 0, 0},
-	{AMOVBU, C_SAUTO, C_NONE, C_REG, 8, 4, REGSP, 0, 0},
-	{AMOVWL, C_SAUTO, C_NONE, C_REG, 8, 4, REGSP, 0, 0},
-	{AMOVVL, C_SAUTO, C_NONE, C_REG, 8, 4, REGSP, sys.Loong64, 0},
-	{AMOVW, C_SOREG, C_NONE, C_REG, 8, 4, REGZERO, 0, 0},
-	{AMOVWU, C_SOREG, C_NONE, C_REG, 8, 4, REGZERO, sys.Loong64, 0},
-	{AMOVV, C_SOREG, C_NONE, C_REG, 8, 4, REGZERO, sys.Loong64, 0},
-	{AMOVB, C_SOREG, C_NONE, C_REG, 8, 4, REGZERO, 0, 0},
-	{AMOVBU, C_SOREG, C_NONE, C_REG, 8, 4, REGZERO, 0, 0},
-	{AMOVWL, C_SOREG, C_NONE, C_REG, 8, 4, REGZERO, 0, 0},
-	{AMOVVL, C_SOREG, C_NONE, C_REG, 8, 4, REGZERO, sys.Loong64, 0},
-	{ALL, C_SOREG, C_NONE, C_REG, 8, 4, REGZERO, 0, 0},
-	{ALLV, C_SOREG, C_NONE, C_REG, 8, 4, REGZERO, sys.Loong64, 0},
+	{AMOVW, C_SEXT, C_NONE, C_NONE, C_REG, C_NONE, 8, 4, 0, 0},
+	{AMOVWU, C_SEXT, C_NONE, C_NONE, C_REG, C_NONE, 8, 4, 0, 0},
+	{AMOVV, C_SEXT, C_NONE, C_NONE, C_REG, C_NONE, 8, 4, 0, 0},
+	{AMOVB, C_SEXT, C_NONE, C_NONE, C_REG, C_NONE, 8, 4, 0, 0},
+	{AMOVBU, C_SEXT, C_NONE, C_NONE, C_REG, C_NONE, 8, 4, 0, 0},
+	{AMOVWL, C_SEXT, C_NONE, C_NONE, C_REG, C_NONE, 8, 4, 0, 0},
+	{AMOVVL, C_SEXT, C_NONE, C_NONE, C_REG, C_NONE, 8, 4, 0, 0},
+	{AMOVW, C_SAUTO, C_NONE, C_NONE, C_REG, C_NONE, 8, 4, REGSP, 0},
+	{AMOVWU, C_SAUTO, C_NONE, C_NONE, C_REG, C_NONE, 8, 4, REGSP, 0},
+	{AMOVV, C_SAUTO, C_NONE, C_NONE, C_REG, C_NONE, 8, 4, REGSP, 0},
+	{AMOVB, C_SAUTO, C_NONE, C_NONE, C_REG, C_NONE, 8, 4, REGSP, 0},
+	{AMOVBU, C_SAUTO, C_NONE, C_NONE, C_REG, C_NONE, 8, 4, REGSP, 0},
+	{AMOVWL, C_SAUTO, C_NONE, C_NONE, C_REG, C_NONE, 8, 4, REGSP, 0},
+	{AMOVVL, C_SAUTO, C_NONE, C_NONE, C_REG, C_NONE, 8, 4, REGSP, 0},
+	{AMOVW, C_SOREG, C_NONE, C_NONE, C_REG, C_NONE, 8, 4, REGZERO, 0},
+	{AMOVWU, C_SOREG, C_NONE, C_NONE, C_REG, C_NONE, 8, 4, REGZERO, 0},
+	{AMOVV, C_SOREG, C_NONE, C_NONE, C_REG, C_NONE, 8, 4, REGZERO, 0},
+	{AMOVB, C_SOREG, C_NONE, C_NONE, C_REG, C_NONE, 8, 4, REGZERO, 0},
+	{AMOVBU, C_SOREG, C_NONE, C_NONE, C_REG, C_NONE, 8, 4, REGZERO, 0},
+	{AMOVWL, C_SOREG, C_NONE, C_NONE, C_REG, C_NONE, 8, 4, REGZERO, 0},
+	{AMOVVL, C_SOREG, C_NONE, C_NONE, C_REG, C_NONE, 8, 4, REGZERO, 0},
+	{ALL, C_SOREG, C_NONE, C_NONE, C_REG, C_NONE, 8, 4, REGZERO, 0},
+	{ALLV, C_SOREG, C_NONE, C_NONE, C_REG, C_NONE, 8, 4, REGZERO, 0},
 
-	{AMOVW, C_REG, C_NONE, C_LEXT, 35, 12, 0, sys.Loong64, 0},
-	{AMOVWU, C_REG, C_NONE, C_LEXT, 35, 12, 0, sys.Loong64, 0},
-	{AMOVV, C_REG, C_NONE, C_LEXT, 35, 12, 0, sys.Loong64, 0},
-	{AMOVB, C_REG, C_NONE, C_LEXT, 35, 12, 0, sys.Loong64, 0},
-	{AMOVBU, C_REG, C_NONE, C_LEXT, 35, 12, 0, sys.Loong64, 0},
-	{AMOVW, C_REG, C_NONE, C_LAUTO, 35, 12, REGSP, 0, 0},
-	{AMOVWU, C_REG, C_NONE, C_LAUTO, 35, 12, REGSP, sys.Loong64, 0},
-	{AMOVV, C_REG, C_NONE, C_LAUTO, 35, 12, REGSP, sys.Loong64, 0},
-	{AMOVB, C_REG, C_NONE, C_LAUTO, 35, 12, REGSP, 0, 0},
-	{AMOVBU, C_REG, C_NONE, C_LAUTO, 35, 12, REGSP, 0, 0},
-	{AMOVW, C_REG, C_NONE, C_LOREG, 35, 12, REGZERO, 0, 0},
-	{AMOVWU, C_REG, C_NONE, C_LOREG, 35, 12, REGZERO, sys.Loong64, 0},
-	{AMOVV, C_REG, C_NONE, C_LOREG, 35, 12, REGZERO, sys.Loong64, 0},
-	{AMOVB, C_REG, C_NONE, C_LOREG, 35, 12, REGZERO, 0, 0},
-	{AMOVBU, C_REG, C_NONE, C_LOREG, 35, 12, REGZERO, 0, 0},
-	{ASC, C_REG, C_NONE, C_LOREG, 35, 12, REGZERO, 0, 0},
-	{AMOVW, C_REG, C_NONE, C_ADDR, 50, 8, 0, 0, 0},
-	{AMOVW, C_REG, C_NONE, C_ADDR, 50, 8, 0, sys.Loong64, 0},
-	{AMOVWU, C_REG, C_NONE, C_ADDR, 50, 8, 0, sys.Loong64, 0},
-	{AMOVV, C_REG, C_NONE, C_ADDR, 50, 8, 0, sys.Loong64, 0},
-	{AMOVB, C_REG, C_NONE, C_ADDR, 50, 8, 0, 0, 0},
-	{AMOVB, C_REG, C_NONE, C_ADDR, 50, 8, 0, sys.Loong64, 0},
-	{AMOVBU, C_REG, C_NONE, C_ADDR, 50, 8, 0, 0, 0},
-	{AMOVBU, C_REG, C_NONE, C_ADDR, 50, 8, 0, sys.Loong64, 0},
-	{AMOVW, C_REG, C_NONE, C_TLS, 53, 16, 0, 0, 0},
-	{AMOVWU, C_REG, C_NONE, C_TLS, 53, 16, 0, sys.Loong64, 0},
-	{AMOVV, C_REG, C_NONE, C_TLS, 53, 16, 0, sys.Loong64, 0},
-	{AMOVB, C_REG, C_NONE, C_TLS, 53, 16, 0, 0, 0},
-	{AMOVBU, C_REG, C_NONE, C_TLS, 53, 16, 0, 0, 0},
+	{AMOVW, C_REG, C_NONE, C_NONE, C_LEXT, C_NONE, 35, 12, 0, 0},
+	{AMOVWU, C_REG, C_NONE, C_NONE, C_LEXT, C_NONE, 35, 12, 0, 0},
+	{AMOVV, C_REG, C_NONE, C_NONE, C_LEXT, C_NONE, 35, 12, 0, 0},
+	{AMOVB, C_REG, C_NONE, C_NONE, C_LEXT, C_NONE, 35, 12, 0, 0},
+	{AMOVBU, C_REG, C_NONE, C_NONE, C_LEXT, C_NONE, 35, 12, 0, 0},
+	{AMOVW, C_REG, C_NONE, C_NONE, C_LAUTO, C_NONE, 35, 12, REGSP, 0},
+	{AMOVWU, C_REG, C_NONE, C_NONE, C_LAUTO, C_NONE, 35, 12, REGSP, 0},
+	{AMOVV, C_REG, C_NONE, C_NONE, C_LAUTO, C_NONE, 35, 12, REGSP, 0},
+	{AMOVB, C_REG, C_NONE, C_NONE, C_LAUTO, C_NONE, 35, 12, REGSP, 0},
+	{AMOVBU, C_REG, C_NONE, C_NONE, C_LAUTO, C_NONE, 35, 12, REGSP, 0},
+	{AMOVW, C_REG, C_NONE, C_NONE, C_LOREG, C_NONE, 35, 12, REGZERO, 0},
+	{AMOVWU, C_REG, C_NONE, C_NONE, C_LOREG, C_NONE, 35, 12, REGZERO, 0},
+	{AMOVV, C_REG, C_NONE, C_NONE, C_LOREG, C_NONE, 35, 12, REGZERO, 0},
+	{AMOVB, C_REG, C_NONE, C_NONE, C_LOREG, C_NONE, 35, 12, REGZERO, 0},
+	{AMOVBU, C_REG, C_NONE, C_NONE, C_LOREG, C_NONE, 35, 12, REGZERO, 0},
+	{ASC, C_REG, C_NONE, C_NONE, C_LOREG, C_NONE, 35, 12, REGZERO, 0},
+	{AMOVW, C_REG, C_NONE, C_NONE, C_ADDR, C_NONE, 50, 8, 0, 0},
+	{AMOVW, C_REG, C_NONE, C_NONE, C_ADDR, C_NONE, 50, 8, 0, 0},
+	{AMOVWU, C_REG, C_NONE, C_NONE, C_ADDR, C_NONE, 50, 8, 0, 0},
+	{AMOVV, C_REG, C_NONE, C_NONE, C_ADDR, C_NONE, 50, 8, 0, 0},
+	{AMOVB, C_REG, C_NONE, C_NONE, C_ADDR, C_NONE, 50, 8, 0, 0},
+	{AMOVB, C_REG, C_NONE, C_NONE, C_ADDR, C_NONE, 50, 8, 0, 0},
+	{AMOVBU, C_REG, C_NONE, C_NONE, C_ADDR, C_NONE, 50, 8, 0, 0},
+	{AMOVBU, C_REG, C_NONE, C_NONE, C_ADDR, C_NONE, 50, 8, 0, 0},
+	{AMOVW, C_REG, C_NONE, C_NONE, C_TLS_LE, C_NONE, 53, 16, 0, 0},
+	{AMOVWU, C_REG, C_NONE, C_NONE, C_TLS_LE, C_NONE, 53, 16, 0, 0},
+	{AMOVV, C_REG, C_NONE, C_NONE, C_TLS_LE, C_NONE, 53, 16, 0, 0},
+	{AMOVB, C_REG, C_NONE, C_NONE, C_TLS_LE, C_NONE, 53, 16, 0, 0},
+	{AMOVBU, C_REG, C_NONE, C_NONE, C_TLS_LE, C_NONE, 53, 16, 0, 0},
 
-	{AMOVW, C_LEXT, C_NONE, C_REG, 36, 12, 0, sys.Loong64, 0},
-	{AMOVWU, C_LEXT, C_NONE, C_REG, 36, 12, 0, sys.Loong64, 0},
-	{AMOVV, C_LEXT, C_NONE, C_REG, 36, 12, 0, sys.Loong64, 0},
-	{AMOVB, C_LEXT, C_NONE, C_REG, 36, 12, 0, sys.Loong64, 0},
-	{AMOVBU, C_LEXT, C_NONE, C_REG, 36, 12, 0, sys.Loong64, 0},
-	{AMOVW, C_LAUTO, C_NONE, C_REG, 36, 12, REGSP, 0, 0},
-	{AMOVWU, C_LAUTO, C_NONE, C_REG, 36, 12, REGSP, sys.Loong64, 0},
-	{AMOVV, C_LAUTO, C_NONE, C_REG, 36, 12, REGSP, sys.Loong64, 0},
-	{AMOVB, C_LAUTO, C_NONE, C_REG, 36, 12, REGSP, 0, 0},
-	{AMOVBU, C_LAUTO, C_NONE, C_REG, 36, 12, REGSP, 0, 0},
-	{AMOVW, C_LOREG, C_NONE, C_REG, 36, 12, REGZERO, 0, 0},
-	{AMOVWU, C_LOREG, C_NONE, C_REG, 36, 12, REGZERO, sys.Loong64, 0},
-	{AMOVV, C_LOREG, C_NONE, C_REG, 36, 12, REGZERO, sys.Loong64, 0},
-	{AMOVB, C_LOREG, C_NONE, C_REG, 36, 12, REGZERO, 0, 0},
-	{AMOVBU, C_LOREG, C_NONE, C_REG, 36, 12, REGZERO, 0, 0},
-	{AMOVW, C_ADDR, C_NONE, C_REG, 51, 8, 0, 0, 0},
-	{AMOVW, C_ADDR, C_NONE, C_REG, 51, 8, 0, sys.Loong64, 0},
-	{AMOVWU, C_ADDR, C_NONE, C_REG, 51, 8, 0, sys.Loong64, 0},
-	{AMOVV, C_ADDR, C_NONE, C_REG, 51, 8, 0, sys.Loong64, 0},
-	{AMOVB, C_ADDR, C_NONE, C_REG, 51, 8, 0, 0, 0},
-	{AMOVB, C_ADDR, C_NONE, C_REG, 51, 8, 0, sys.Loong64, 0},
-	{AMOVBU, C_ADDR, C_NONE, C_REG, 51, 8, 0, 0, 0},
-	{AMOVBU, C_ADDR, C_NONE, C_REG, 51, 8, 0, sys.Loong64, 0},
-	{AMOVW, C_TLS, C_NONE, C_REG, 54, 16, 0, 0, 0},
-	{AMOVWU, C_TLS, C_NONE, C_REG, 54, 16, 0, sys.Loong64, 0},
-	{AMOVV, C_TLS, C_NONE, C_REG, 54, 16, 0, sys.Loong64, 0},
-	{AMOVB, C_TLS, C_NONE, C_REG, 54, 16, 0, 0, 0},
-	{AMOVBU, C_TLS, C_NONE, C_REG, 54, 16, 0, 0, 0},
+	{AMOVW, C_LEXT, C_NONE, C_NONE, C_REG, C_NONE, 36, 12, 0, 0},
+	{AMOVWU, C_LEXT, C_NONE, C_NONE, C_REG, C_NONE, 36, 12, 0, 0},
+	{AMOVV, C_LEXT, C_NONE, C_NONE, C_REG, C_NONE, 36, 12, 0, 0},
+	{AMOVB, C_LEXT, C_NONE, C_NONE, C_REG, C_NONE, 36, 12, 0, 0},
+	{AMOVBU, C_LEXT, C_NONE, C_NONE, C_REG, C_NONE, 36, 12, 0, 0},
+	{AMOVW, C_LAUTO, C_NONE, C_NONE, C_REG, C_NONE, 36, 12, REGSP, 0},
+	{AMOVWU, C_LAUTO, C_NONE, C_NONE, C_REG, C_NONE, 36, 12, REGSP, 0},
+	{AMOVV, C_LAUTO, C_NONE, C_NONE, C_REG, C_NONE, 36, 12, REGSP, 0},
+	{AMOVB, C_LAUTO, C_NONE, C_NONE, C_REG, C_NONE, 36, 12, REGSP, 0},
+	{AMOVBU, C_LAUTO, C_NONE, C_NONE, C_REG, C_NONE, 36, 12, REGSP, 0},
+	{AMOVW, C_LOREG, C_NONE, C_NONE, C_REG, C_NONE, 36, 12, REGZERO, 0},
+	{AMOVWU, C_LOREG, C_NONE, C_NONE, C_REG, C_NONE, 36, 12, REGZERO, 0},
+	{AMOVV, C_LOREG, C_NONE, C_NONE, C_REG, C_NONE, 36, 12, REGZERO, 0},
+	{AMOVB, C_LOREG, C_NONE, C_NONE, C_REG, C_NONE, 36, 12, REGZERO, 0},
+	{AMOVBU, C_LOREG, C_NONE, C_NONE, C_REG, C_NONE, 36, 12, REGZERO, 0},
+	{AMOVW, C_ADDR, C_NONE, C_NONE, C_REG, C_NONE, 51, 8, 0, 0},
+	{AMOVW, C_ADDR, C_NONE, C_NONE, C_REG, C_NONE, 51, 8, 0, 0},
+	{AMOVWU, C_ADDR, C_NONE, C_NONE, C_REG, C_NONE, 51, 8, 0, 0},
+	{AMOVV, C_ADDR, C_NONE, C_NONE, C_REG, C_NONE, 51, 8, 0, 0},
+	{AMOVB, C_ADDR, C_NONE, C_NONE, C_REG, C_NONE, 51, 8, 0, 0},
+	{AMOVB, C_ADDR, C_NONE, C_NONE, C_REG, C_NONE, 51, 8, 0, 0},
+	{AMOVBU, C_ADDR, C_NONE, C_NONE, C_REG, C_NONE, 51, 8, 0, 0},
+	{AMOVBU, C_ADDR, C_NONE, C_NONE, C_REG, C_NONE, 51, 8, 0, 0},
+	{AMOVW, C_TLS_LE, C_NONE, C_NONE, C_REG, C_NONE, 54, 16, 0, 0},
+	{AMOVWU, C_TLS_LE, C_NONE, C_NONE, C_REG, C_NONE, 54, 16, 0, 0},
+	{AMOVV, C_TLS_LE, C_NONE, C_NONE, C_REG, C_NONE, 54, 16, 0, 0},
+	{AMOVB, C_TLS_LE, C_NONE, C_NONE, C_REG, C_NONE, 54, 16, 0, 0},
+	{AMOVBU, C_TLS_LE, C_NONE, C_NONE, C_REG, C_NONE, 54, 16, 0, 0},
 
-	{AMOVW, C_SECON, C_NONE, C_REG, 3, 4, 0, sys.Loong64, 0},
-	{AMOVV, C_SECON, C_NONE, C_REG, 3, 4, 0, sys.Loong64, 0},
-	{AMOVW, C_SACON, C_NONE, C_REG, 3, 4, REGSP, 0, 0},
-	{AMOVV, C_SACON, C_NONE, C_REG, 3, 4, REGSP, sys.Loong64, 0},
-	{AMOVW, C_LECON, C_NONE, C_REG, 52, 8, 0, 0, NOTUSETMP},
-	{AMOVW, C_LECON, C_NONE, C_REG, 52, 8, 0, sys.Loong64, NOTUSETMP},
-	{AMOVV, C_LECON, C_NONE, C_REG, 52, 8, 0, sys.Loong64, NOTUSETMP},
+	{AMOVW, C_SECON, C_NONE, C_NONE, C_REG, C_NONE, 3, 4, 0, 0},
+	{AMOVV, C_SECON, C_NONE, C_NONE, C_REG, C_NONE, 3, 4, 0, 0},
+	{AMOVW, C_SACON, C_NONE, C_NONE, C_REG, C_NONE, 3, 4, REGSP, 0},
+	{AMOVV, C_SACON, C_NONE, C_NONE, C_REG, C_NONE, 3, 4, REGSP, 0},
+	{AMOVW, C_LECON, C_NONE, C_NONE, C_REG, C_NONE, 52, 8, 0, NOTUSETMP},
+	{AMOVW, C_LECON, C_NONE, C_NONE, C_REG, C_NONE, 52, 8, 0, NOTUSETMP},
+	{AMOVV, C_LECON, C_NONE, C_NONE, C_REG, C_NONE, 52, 8, 0, NOTUSETMP},
 
-	{AMOVW, C_LACON, C_NONE, C_REG, 26, 12, REGSP, 0, 0},
-	{AMOVV, C_LACON, C_NONE, C_REG, 26, 12, REGSP, sys.Loong64, 0},
-	{AMOVW, C_ADDCON, C_NONE, C_REG, 3, 4, REGZERO, 0, 0},
-	{AMOVV, C_ADDCON, C_NONE, C_REG, 3, 4, REGZERO, sys.Loong64, 0},
-	{AMOVW, C_ANDCON, C_NONE, C_REG, 3, 4, REGZERO, 0, 0},
-	{AMOVV, C_ANDCON, C_NONE, C_REG, 3, 4, REGZERO, sys.Loong64, 0},
-	{AMOVW, C_STCON, C_NONE, C_REG, 55, 12, 0, 0, 0},
-	{AMOVV, C_STCON, C_NONE, C_REG, 55, 12, 0, sys.Loong64, 0},
+	{AMOVW, C_LACON, C_NONE, C_NONE, C_REG, C_NONE, 26, 12, REGSP, 0},
+	{AMOVV, C_LACON, C_NONE, C_NONE, C_REG, C_NONE, 26, 12, REGSP, 0},
+	{AMOVW, C_ADDCON, C_NONE, C_NONE, C_REG, C_NONE, 3, 4, REGZERO, 0},
+	{AMOVV, C_ADDCON, C_NONE, C_NONE, C_REG, C_NONE, 3, 4, REGZERO, 0},
+	{AMOVW, C_ANDCON, C_NONE, C_NONE, C_REG, C_NONE, 3, 4, REGZERO, 0},
+	{AMOVV, C_ANDCON, C_NONE, C_NONE, C_REG, C_NONE, 3, 4, REGZERO, 0},
+	{AMOVW, C_STCON, C_NONE, C_NONE, C_REG, C_NONE, 55, 12, 0, 0},
+	{AMOVV, C_STCON, C_NONE, C_NONE, C_REG, C_NONE, 55, 12, 0, 0},
 
-	{AMOVW, C_UCON, C_NONE, C_REG, 24, 4, 0, 0, 0},
-	{AMOVV, C_UCON, C_NONE, C_REG, 24, 4, 0, sys.Loong64, 0},
-	{AMOVW, C_LCON, C_NONE, C_REG, 19, 8, 0, 0, NOTUSETMP},
-	{AMOVV, C_LCON, C_NONE, C_REG, 19, 8, 0, sys.Loong64, NOTUSETMP},
-	{AMOVV, C_DCON, C_NONE, C_REG, 59, 16, 0, sys.Loong64, NOTUSETMP},
+	{AMOVW, C_UCON, C_NONE, C_NONE, C_REG, C_NONE, 24, 4, 0, 0},
+	{AMOVV, C_UCON, C_NONE, C_NONE, C_REG, C_NONE, 24, 4, 0, 0},
+	{AMOVW, C_LCON, C_NONE, C_NONE, C_REG, C_NONE, 19, 8, 0, NOTUSETMP},
+	{AMOVV, C_LCON, C_NONE, C_NONE, C_REG, C_NONE, 19, 8, 0, NOTUSETMP},
+	{AMOVV, C_DCON, C_NONE, C_NONE, C_REG, C_NONE, 59, 16, 0, NOTUSETMP},
 
-	{AMUL, C_REG, C_NONE, C_REG, 2, 4, 0, 0, 0},
-	{AMUL, C_REG, C_REG, C_REG, 2, 4, 0, 0, 0},
-	{AMULV, C_REG, C_NONE, C_REG, 2, 4, 0, sys.Loong64, 0},
-	{AMULV, C_REG, C_REG, C_REG, 2, 4, 0, sys.Loong64, 0},
+	{AMUL, C_REG, C_NONE, C_NONE, C_REG, C_NONE, 2, 4, 0, 0},
+	{AMUL, C_REG, C_REG, C_NONE, C_REG, C_NONE, 2, 4, 0, 0},
+	{AMULV, C_REG, C_NONE, C_NONE, C_REG, C_NONE, 2, 4, 0, 0},
+	{AMULV, C_REG, C_REG, C_NONE, C_REG, C_NONE, 2, 4, 0, 0},
 
-	{AADD, C_ADD0CON, C_REG, C_REG, 4, 4, 0, 0, 0},
-	{AADD, C_ADD0CON, C_NONE, C_REG, 4, 4, 0, 0, 0},
-	{AADD, C_ANDCON, C_REG, C_REG, 10, 8, 0, 0, 0},
-	{AADD, C_ANDCON, C_NONE, C_REG, 10, 8, 0, 0, 0},
+	{AADD, C_ADD0CON, C_REG, C_NONE, C_REG, C_NONE, 4, 4, 0, 0},
+	{AADD, C_ADD0CON, C_NONE, C_NONE, C_REG, C_NONE, 4, 4, 0, 0},
+	{AADD, C_ANDCON, C_REG, C_NONE, C_REG, C_NONE, 10, 8, 0, 0},
+	{AADD, C_ANDCON, C_NONE, C_NONE, C_REG, C_NONE, 10, 8, 0, 0},
 
-	{AADDV, C_ADD0CON, C_REG, C_REG, 4, 4, 0, sys.Loong64, 0},
-	{AADDV, C_ADD0CON, C_NONE, C_REG, 4, 4, 0, sys.Loong64, 0},
-	{AADDV, C_ANDCON, C_REG, C_REG, 10, 8, 0, sys.Loong64, 0},
-	{AADDV, C_ANDCON, C_NONE, C_REG, 10, 8, 0, sys.Loong64, 0},
+	{AADDV, C_ADD0CON, C_REG, C_NONE, C_REG, C_NONE, 4, 4, 0, 0},
+	{AADDV, C_ADD0CON, C_NONE, C_NONE, C_REG, C_NONE, 4, 4, 0, 0},
+	{AADDV, C_ANDCON, C_REG, C_NONE, C_REG, C_NONE, 10, 8, 0, 0},
+	{AADDV, C_ANDCON, C_NONE, C_NONE, C_REG, C_NONE, 10, 8, 0, 0},
 
-	{AAND, C_AND0CON, C_REG, C_REG, 4, 4, 0, 0, 0},
-	{AAND, C_AND0CON, C_NONE, C_REG, 4, 4, 0, 0, 0},
-	{AAND, C_ADDCON, C_REG, C_REG, 10, 8, 0, 0, 0},
-	{AAND, C_ADDCON, C_NONE, C_REG, 10, 8, 0, 0, 0},
+	{AAND, C_AND0CON, C_REG, C_NONE, C_REG, C_NONE, 4, 4, 0, 0},
+	{AAND, C_AND0CON, C_NONE, C_NONE, C_REG, C_NONE, 4, 4, 0, 0},
+	{AAND, C_ADDCON, C_REG, C_NONE, C_REG, C_NONE, 10, 8, 0, 0},
+	{AAND, C_ADDCON, C_NONE, C_NONE, C_REG, C_NONE, 10, 8, 0, 0},
 
-	{AADD, C_UCON, C_REG, C_REG, 25, 8, 0, 0, 0},
-	{AADD, C_UCON, C_NONE, C_REG, 25, 8, 0, 0, 0},
-	{AADDV, C_UCON, C_REG, C_REG, 25, 8, 0, sys.Loong64, 0},
-	{AADDV, C_UCON, C_NONE, C_REG, 25, 8, 0, sys.Loong64, 0},
-	{AAND, C_UCON, C_REG, C_REG, 25, 8, 0, 0, 0},
-	{AAND, C_UCON, C_NONE, C_REG, 25, 8, 0, 0, 0},
+	{AADD, C_UCON, C_REG, C_NONE, C_REG, C_NONE, 25, 8, 0, 0},
+	{AADD, C_UCON, C_NONE, C_NONE, C_REG, C_NONE, 25, 8, 0, 0},
+	{AADDV, C_UCON, C_REG, C_NONE, C_REG, C_NONE, 25, 8, 0, 0},
+	{AADDV, C_UCON, C_NONE, C_NONE, C_REG, C_NONE, 25, 8, 0, 0},
+	{AAND, C_UCON, C_REG, C_NONE, C_REG, C_NONE, 25, 8, 0, 0},
+	{AAND, C_UCON, C_NONE, C_NONE, C_REG, C_NONE, 25, 8, 0, 0},
 
-	{AADD, C_LCON, C_NONE, C_REG, 23, 12, 0, 0, 0},
-	{AADDV, C_LCON, C_NONE, C_REG, 23, 12, 0, sys.Loong64, 0},
-	{AAND, C_LCON, C_NONE, C_REG, 23, 12, 0, 0, 0},
-	{AADD, C_LCON, C_REG, C_REG, 23, 12, 0, 0, 0},
-	{AADDV, C_LCON, C_REG, C_REG, 23, 12, 0, sys.Loong64, 0},
-	{AAND, C_LCON, C_REG, C_REG, 23, 12, 0, 0, 0},
+	{AADD, C_LCON, C_NONE, C_NONE, C_REG, C_NONE, 23, 12, 0, 0},
+	{AADDV, C_LCON, C_NONE, C_NONE, C_REG, C_NONE, 23, 12, 0, 0},
+	{AAND, C_LCON, C_NONE, C_NONE, C_REG, C_NONE, 23, 12, 0, 0},
+	{AADD, C_LCON, C_REG, C_NONE, C_REG, C_NONE, 23, 12, 0, 0},
+	{AADDV, C_LCON, C_REG, C_NONE, C_REG, C_NONE, 23, 12, 0, 0},
+	{AAND, C_LCON, C_REG, C_NONE, C_REG, C_NONE, 23, 12, 0, 0},
 
-	{AADDV, C_DCON, C_NONE, C_REG, 60, 20, 0, sys.Loong64, 0},
-	{AADDV, C_DCON, C_REG, C_REG, 60, 20, 0, sys.Loong64, 0},
+	{AADDV, C_DCON, C_NONE, C_NONE, C_REG, C_NONE, 60, 20, 0, 0},
+	{AADDV, C_DCON, C_REG, C_NONE, C_REG, C_NONE, 60, 20, 0, 0},
 
-	{ASLL, C_SCON, C_REG, C_REG, 16, 4, 0, 0, 0},
-	{ASLL, C_SCON, C_NONE, C_REG, 16, 4, 0, 0, 0},
+	{ASLL, C_SCON, C_REG, C_NONE, C_REG, C_NONE, 16, 4, 0, 0},
+	{ASLL, C_SCON, C_NONE, C_NONE, C_REG, C_NONE, 16, 4, 0, 0},
 
-	{ASLLV, C_SCON, C_REG, C_REG, 16, 4, 0, sys.Loong64, 0},
-	{ASLLV, C_SCON, C_NONE, C_REG, 16, 4, 0, sys.Loong64, 0},
+	{ASLLV, C_SCON, C_REG, C_NONE, C_REG, C_NONE, 16, 4, 0, 0},
+	{ASLLV, C_SCON, C_NONE, C_NONE, C_REG, C_NONE, 16, 4, 0, 0},
 
-	{ASYSCALL, C_NONE, C_NONE, C_NONE, 5, 4, 0, 0, 0},
+	{ASYSCALL, C_NONE, C_NONE, C_NONE, C_NONE, C_NONE, 5, 4, 0, 0},
 
-	{ABEQ, C_REG, C_REG, C_SBRA, 6, 4, 0, 0, 0},
-	{ABEQ, C_REG, C_NONE, C_SBRA, 6, 4, 0, 0, 0},
-	{ABLEZ, C_REG, C_NONE, C_SBRA, 6, 4, 0, 0, 0},
-	{ABFPT, C_NONE, C_NONE, C_SBRA, 6, 4, 0, 0, NOTUSETMP},
+	{ABEQ, C_REG, C_REG, C_NONE, C_SBRA, C_NONE, 6, 4, 0, 0},
+	{ABEQ, C_REG, C_NONE, C_NONE, C_SBRA, C_NONE, 6, 4, 0, 0},
+	{ABLEZ, C_REG, C_NONE, C_NONE, C_SBRA, C_NONE, 6, 4, 0, 0},
+	{ABFPT, C_NONE, C_NONE, C_NONE, C_SBRA, C_NONE, 6, 4, 0, NOTUSETMP},
 
-	{AJMP, C_NONE, C_NONE, C_LBRA, 11, 4, 0, 0, 0}, // b
-	{AJAL, C_NONE, C_NONE, C_LBRA, 11, 4, 0, 0, 0}, // bl
+	{AJMP, C_NONE, C_NONE, C_NONE, C_LBRA, C_NONE, 11, 4, 0, 0}, // b
+	{AJAL, C_NONE, C_NONE, C_NONE, C_LBRA, C_NONE, 11, 4, 0, 0}, // bl
 
-	{AJMP, C_NONE, C_NONE, C_ZOREG, 18, 4, REGZERO, 0, 0}, // jirl r0, rj, 0
-	{AJAL, C_NONE, C_NONE, C_ZOREG, 18, 4, REGLINK, 0, 0}, // jirl r1, rj, 0
+	{AJMP, C_NONE, C_NONE, C_NONE, C_ZOREG, C_NONE, 18, 4, REGZERO, 0}, // jirl r0, rj, 0
+	{AJAL, C_NONE, C_NONE, C_NONE, C_ZOREG, C_NONE, 18, 4, REGLINK, 0}, // jirl r1, rj, 0
 
-	{AMOVW, C_SEXT, C_NONE, C_FREG, 27, 4, 0, sys.Loong64, 0},
-	{AMOVF, C_SEXT, C_NONE, C_FREG, 27, 4, 0, sys.Loong64, 0},
-	{AMOVD, C_SEXT, C_NONE, C_FREG, 27, 4, 0, sys.Loong64, 0},
-	{AMOVW, C_SAUTO, C_NONE, C_FREG, 27, 4, REGSP, sys.Loong64, 0},
-	{AMOVF, C_SAUTO, C_NONE, C_FREG, 27, 4, REGSP, 0, 0},
-	{AMOVD, C_SAUTO, C_NONE, C_FREG, 27, 4, REGSP, 0, 0},
-	{AMOVW, C_SOREG, C_NONE, C_FREG, 27, 4, REGZERO, sys.Loong64, 0},
-	{AMOVF, C_SOREG, C_NONE, C_FREG, 27, 4, REGZERO, 0, 0},
-	{AMOVD, C_SOREG, C_NONE, C_FREG, 27, 4, REGZERO, 0, 0},
+	{AMOVW, C_SEXT, C_NONE, C_NONE, C_FREG, C_NONE, 27, 4, 0, 0},
+	{AMOVF, C_SEXT, C_NONE, C_NONE, C_FREG, C_NONE, 27, 4, 0, 0},
+	{AMOVD, C_SEXT, C_NONE, C_NONE, C_FREG, C_NONE, 27, 4, 0, 0},
+	{AMOVW, C_SAUTO, C_NONE, C_NONE, C_FREG, C_NONE, 27, 4, REGSP, 0},
+	{AMOVF, C_SAUTO, C_NONE, C_NONE, C_FREG, C_NONE, 27, 4, REGSP, 0},
+	{AMOVD, C_SAUTO, C_NONE, C_NONE, C_FREG, C_NONE, 27, 4, REGSP, 0},
+	{AMOVW, C_SOREG, C_NONE, C_NONE, C_FREG, C_NONE, 27, 4, REGZERO, 0},
+	{AMOVF, C_SOREG, C_NONE, C_NONE, C_FREG, C_NONE, 27, 4, REGZERO, 0},
+	{AMOVD, C_SOREG, C_NONE, C_NONE, C_FREG, C_NONE, 27, 4, REGZERO, 0},
 
-	{AMOVW, C_LEXT, C_NONE, C_FREG, 27, 12, 0, sys.Loong64, 0},
-	{AMOVF, C_LEXT, C_NONE, C_FREG, 27, 12, 0, sys.Loong64, 0},
-	{AMOVD, C_LEXT, C_NONE, C_FREG, 27, 12, 0, sys.Loong64, 0},
-	{AMOVW, C_LAUTO, C_NONE, C_FREG, 27, 12, REGSP, sys.Loong64, 0},
-	{AMOVF, C_LAUTO, C_NONE, C_FREG, 27, 12, REGSP, 0, 0},
-	{AMOVD, C_LAUTO, C_NONE, C_FREG, 27, 12, REGSP, 0, 0},
-	{AMOVW, C_LOREG, C_NONE, C_FREG, 27, 12, REGZERO, sys.Loong64, 0},
-	{AMOVF, C_LOREG, C_NONE, C_FREG, 27, 12, REGZERO, 0, 0},
-	{AMOVD, C_LOREG, C_NONE, C_FREG, 27, 12, REGZERO, 0, 0},
-	{AMOVF, C_ADDR, C_NONE, C_FREG, 51, 8, 0, 0, 0},
-	{AMOVF, C_ADDR, C_NONE, C_FREG, 51, 8, 0, sys.Loong64, 0},
-	{AMOVD, C_ADDR, C_NONE, C_FREG, 51, 8, 0, 0, 0},
-	{AMOVD, C_ADDR, C_NONE, C_FREG, 51, 8, 0, sys.Loong64, 0},
+	{AMOVW, C_LEXT, C_NONE, C_NONE, C_FREG, C_NONE, 27, 12, 0, 0},
+	{AMOVF, C_LEXT, C_NONE, C_NONE, C_FREG, C_NONE, 27, 12, 0, 0},
+	{AMOVD, C_LEXT, C_NONE, C_NONE, C_FREG, C_NONE, 27, 12, 0, 0},
+	{AMOVW, C_LAUTO, C_NONE, C_NONE, C_FREG, C_NONE, 27, 12, REGSP, 0},
+	{AMOVF, C_LAUTO, C_NONE, C_NONE, C_FREG, C_NONE, 27, 12, REGSP, 0},
+	{AMOVD, C_LAUTO, C_NONE, C_NONE, C_FREG, C_NONE, 27, 12, REGSP, 0},
+	{AMOVW, C_LOREG, C_NONE, C_NONE, C_FREG, C_NONE, 27, 12, REGZERO, 0},
+	{AMOVF, C_LOREG, C_NONE, C_NONE, C_FREG, C_NONE, 27, 12, REGZERO, 0},
+	{AMOVD, C_LOREG, C_NONE, C_NONE, C_FREG, C_NONE, 27, 12, REGZERO, 0},
+	{AMOVF, C_ADDR, C_NONE, C_NONE, C_FREG, C_NONE, 51, 8, 0, 0},
+	{AMOVF, C_ADDR, C_NONE, C_NONE, C_FREG, C_NONE, 51, 8, 0, 0},
+	{AMOVD, C_ADDR, C_NONE, C_NONE, C_FREG, C_NONE, 51, 8, 0, 0},
+	{AMOVD, C_ADDR, C_NONE, C_NONE, C_FREG, C_NONE, 51, 8, 0, 0},
 
-	{AMOVW, C_FREG, C_NONE, C_SEXT, 28, 4, 0, sys.Loong64, 0},
-	{AMOVF, C_FREG, C_NONE, C_SEXT, 28, 4, 0, sys.Loong64, 0},
-	{AMOVD, C_FREG, C_NONE, C_SEXT, 28, 4, 0, sys.Loong64, 0},
-	{AMOVW, C_FREG, C_NONE, C_SAUTO, 28, 4, REGSP, sys.Loong64, 0},
-	{AMOVF, C_FREG, C_NONE, C_SAUTO, 28, 4, REGSP, 0, 0},
-	{AMOVD, C_FREG, C_NONE, C_SAUTO, 28, 4, REGSP, 0, 0},
-	{AMOVW, C_FREG, C_NONE, C_SOREG, 28, 4, REGZERO, sys.Loong64, 0},
-	{AMOVF, C_FREG, C_NONE, C_SOREG, 28, 4, REGZERO, 0, 0},
-	{AMOVD, C_FREG, C_NONE, C_SOREG, 28, 4, REGZERO, 0, 0},
+	{AMOVW, C_FREG, C_NONE, C_NONE, C_SEXT, C_NONE, 28, 4, 0, 0},
+	{AMOVF, C_FREG, C_NONE, C_NONE, C_SEXT, C_NONE, 28, 4, 0, 0},
+	{AMOVD, C_FREG, C_NONE, C_NONE, C_SEXT, C_NONE, 28, 4, 0, 0},
+	{AMOVW, C_FREG, C_NONE, C_NONE, C_SAUTO, C_NONE, 28, 4, REGSP, 0},
+	{AMOVF, C_FREG, C_NONE, C_NONE, C_SAUTO, C_NONE, 28, 4, REGSP, 0},
+	{AMOVD, C_FREG, C_NONE, C_NONE, C_SAUTO, C_NONE, 28, 4, REGSP, 0},
+	{AMOVW, C_FREG, C_NONE, C_NONE, C_SOREG, C_NONE, 28, 4, REGZERO, 0},
+	{AMOVF, C_FREG, C_NONE, C_NONE, C_SOREG, C_NONE, 28, 4, REGZERO, 0},
+	{AMOVD, C_FREG, C_NONE, C_NONE, C_SOREG, C_NONE, 28, 4, REGZERO, 0},
 
-	{AMOVW, C_FREG, C_NONE, C_LEXT, 28, 12, 0, sys.Loong64, 0},
-	{AMOVF, C_FREG, C_NONE, C_LEXT, 28, 12, 0, sys.Loong64, 0},
-	{AMOVD, C_FREG, C_NONE, C_LEXT, 28, 12, 0, sys.Loong64, 0},
-	{AMOVW, C_FREG, C_NONE, C_LAUTO, 28, 12, REGSP, sys.Loong64, 0},
-	{AMOVF, C_FREG, C_NONE, C_LAUTO, 28, 12, REGSP, 0, 0},
-	{AMOVD, C_FREG, C_NONE, C_LAUTO, 28, 12, REGSP, 0, 0},
-	{AMOVW, C_FREG, C_NONE, C_LOREG, 28, 12, REGZERO, sys.Loong64, 0},
-	{AMOVF, C_FREG, C_NONE, C_LOREG, 28, 12, REGZERO, 0, 0},
-	{AMOVD, C_FREG, C_NONE, C_LOREG, 28, 12, REGZERO, 0, 0},
-	{AMOVF, C_FREG, C_NONE, C_ADDR, 50, 8, 0, 0, 0},
-	{AMOVF, C_FREG, C_NONE, C_ADDR, 50, 8, 0, sys.Loong64, 0},
-	{AMOVD, C_FREG, C_NONE, C_ADDR, 50, 8, 0, 0, 0},
-	{AMOVD, C_FREG, C_NONE, C_ADDR, 50, 8, 0, sys.Loong64, 0},
+	{AMOVW, C_FREG, C_NONE, C_NONE, C_LEXT, C_NONE, 28, 12, 0, 0},
+	{AMOVF, C_FREG, C_NONE, C_NONE, C_LEXT, C_NONE, 28, 12, 0, 0},
+	{AMOVD, C_FREG, C_NONE, C_NONE, C_LEXT, C_NONE, 28, 12, 0, 0},
+	{AMOVW, C_FREG, C_NONE, C_NONE, C_LAUTO, C_NONE, 28, 12, REGSP, 0},
+	{AMOVF, C_FREG, C_NONE, C_NONE, C_LAUTO, C_NONE, 28, 12, REGSP, 0},
+	{AMOVD, C_FREG, C_NONE, C_NONE, C_LAUTO, C_NONE, 28, 12, REGSP, 0},
+	{AMOVW, C_FREG, C_NONE, C_NONE, C_LOREG, C_NONE, 28, 12, REGZERO, 0},
+	{AMOVF, C_FREG, C_NONE, C_NONE, C_LOREG, C_NONE, 28, 12, REGZERO, 0},
+	{AMOVD, C_FREG, C_NONE, C_NONE, C_LOREG, C_NONE, 28, 12, REGZERO, 0},
+	{AMOVF, C_FREG, C_NONE, C_NONE, C_ADDR, C_NONE, 50, 8, 0, 0},
+	{AMOVF, C_FREG, C_NONE, C_NONE, C_ADDR, C_NONE, 50, 8, 0, 0},
+	{AMOVD, C_FREG, C_NONE, C_NONE, C_ADDR, C_NONE, 50, 8, 0, 0},
+	{AMOVD, C_FREG, C_NONE, C_NONE, C_ADDR, C_NONE, 50, 8, 0, 0},
 
-	{AMOVW, C_REG, C_NONE, C_FREG, 30, 4, 0, 0, 0},
-	{AMOVW, C_FREG, C_NONE, C_REG, 31, 4, 0, 0, 0},
-	{AMOVV, C_REG, C_NONE, C_FREG, 47, 4, 0, sys.Loong64, 0},
-	{AMOVV, C_FREG, C_NONE, C_REG, 48, 4, 0, sys.Loong64, 0},
+	{AMOVW, C_REG, C_NONE, C_NONE, C_FREG, C_NONE, 30, 4, 0, 0},
+	{AMOVW, C_FREG, C_NONE, C_NONE, C_REG, C_NONE, 31, 4, 0, 0},
+	{AMOVV, C_REG, C_NONE, C_NONE, C_FREG, C_NONE, 47, 4, 0, 0},
+	{AMOVV, C_FREG, C_NONE, C_NONE, C_REG, C_NONE, 48, 4, 0, 0},
 
-	{AMOVW, C_ADDCON, C_NONE, C_FREG, 34, 8, 0, sys.Loong64, 0},
-	{AMOVW, C_ANDCON, C_NONE, C_FREG, 34, 8, 0, sys.Loong64, 0},
+	{AMOVV, C_FCCREG, C_NONE, C_NONE, C_REG, C_NONE, 63, 4, 0, 0},
+	{AMOVV, C_REG, C_NONE, C_NONE, C_FCCREG, C_NONE, 64, 4, 0, 0},
 
-	{AWORD, C_LCON, C_NONE, C_NONE, 40, 4, 0, 0, 0},
-	{AWORD, C_DCON, C_NONE, C_NONE, 61, 4, 0, 0, 0},
+	{AMOVW, C_ADDCON, C_NONE, C_NONE, C_FREG, C_NONE, 34, 8, 0, 0},
+	{AMOVW, C_ANDCON, C_NONE, C_NONE, C_FREG, C_NONE, 34, 8, 0, 0},
 
-	{ATEQ, C_SCON, C_REG, C_REG, 15, 8, 0, 0, 0},
-	{ATEQ, C_SCON, C_NONE, C_REG, 15, 8, 0, 0, 0},
+	{AMOVB, C_REG, C_NONE, C_NONE, C_TLS_IE, C_NONE, 56, 16, 0, 0},
+	{AMOVW, C_REG, C_NONE, C_NONE, C_TLS_IE, C_NONE, 56, 16, 0, 0},
+	{AMOVV, C_REG, C_NONE, C_NONE, C_TLS_IE, C_NONE, 56, 16, 0, 0},
+	{AMOVBU, C_REG, C_NONE, C_NONE, C_TLS_IE, C_NONE, 56, 16, 0, 0},
+	{AMOVWU, C_REG, C_NONE, C_NONE, C_TLS_IE, C_NONE, 56, 16, 0, 0},
 
-	{ABREAK, C_REG, C_NONE, C_SEXT, 7, 4, 0, sys.Loong64, 0}, // really CACHE instruction
-	{ABREAK, C_REG, C_NONE, C_SAUTO, 7, 4, REGSP, sys.Loong64, 0},
-	{ABREAK, C_REG, C_NONE, C_SOREG, 7, 4, REGZERO, sys.Loong64, 0},
-	{ABREAK, C_NONE, C_NONE, C_NONE, 5, 4, 0, 0, 0},
+	{AMOVB, C_TLS_IE, C_NONE, C_NONE, C_REG, C_NONE, 57, 16, 0, 0},
+	{AMOVW, C_TLS_IE, C_NONE, C_NONE, C_REG, C_NONE, 57, 16, 0, 0},
+	{AMOVV, C_TLS_IE, C_NONE, C_NONE, C_REG, C_NONE, 57, 16, 0, 0},
+	{AMOVBU, C_TLS_IE, C_NONE, C_NONE, C_REG, C_NONE, 57, 16, 0, 0},
+	{AMOVWU, C_TLS_IE, C_NONE, C_NONE, C_REG, C_NONE, 57, 16, 0, 0},
 
-	{obj.AUNDEF, C_NONE, C_NONE, C_NONE, 49, 4, 0, 0, 0},
-	{obj.APCDATA, C_LCON, C_NONE, C_LCON, 0, 0, 0, 0, 0},
-	{obj.APCDATA, C_DCON, C_NONE, C_DCON, 0, 0, 0, 0, 0},
-	{obj.AFUNCDATA, C_SCON, C_NONE, C_ADDR, 0, 0, 0, 0, 0},
-	{obj.ANOP, C_NONE, C_NONE, C_NONE, 0, 0, 0, 0, 0},
-	{obj.ANOP, C_LCON, C_NONE, C_NONE, 0, 0, 0, 0, 0}, // nop variants, see #40689
-	{obj.ANOP, C_DCON, C_NONE, C_NONE, 0, 0, 0, 0, 0}, // nop variants, see #40689
-	{obj.ANOP, C_REG, C_NONE, C_NONE, 0, 0, 0, 0, 0},
-	{obj.ANOP, C_FREG, C_NONE, C_NONE, 0, 0, 0, 0, 0},
-	{obj.ADUFFZERO, C_NONE, C_NONE, C_LBRA, 11, 4, 0, 0, 0}, // same as AJMP
-	{obj.ADUFFCOPY, C_NONE, C_NONE, C_LBRA, 11, 4, 0, 0, 0}, // same as AJMP
+	{AWORD, C_LCON, C_NONE, C_NONE, C_NONE, C_NONE, 40, 4, 0, 0},
+	{AWORD, C_DCON, C_NONE, C_NONE, C_NONE, C_NONE, 61, 4, 0, 0},
 
-	{obj.AXXX, C_NONE, C_NONE, C_NONE, 0, 4, 0, 0, 0},
+	{ATEQ, C_SCON, C_REG, C_NONE, C_REG, C_NONE, 15, 8, 0, 0},
+	{ATEQ, C_SCON, C_NONE, C_NONE, C_REG, C_NONE, 15, 8, 0, 0},
+
+	{ABREAK, C_REG, C_NONE, C_NONE, C_SEXT, C_NONE, 7, 4, 0, 0}, // really CACHE instruction
+	{ABREAK, C_REG, C_NONE, C_NONE, C_SAUTO, C_NONE, 7, 4, REGSP, 0},
+	{ABREAK, C_REG, C_NONE, C_NONE, C_SOREG, C_NONE, 7, 4, REGZERO, 0},
+	{ABREAK, C_NONE, C_NONE, C_NONE, C_NONE, C_NONE, 5, 4, 0, 0},
+
+	{ARDTIMELW, C_NONE, C_NONE, C_NONE, C_REG, C_REG, 62, 4, 0, 0},
+	{ARDTIMEHW, C_NONE, C_NONE, C_NONE, C_REG, C_REG, 62, 4, 0, 0},
+	{ARDTIMED, C_NONE, C_NONE, C_NONE, C_REG, C_REG, 62, 4, 0, 0},
+
+	{obj.AUNDEF, C_NONE, C_NONE, C_NONE, C_NONE, C_NONE, 49, 4, 0, 0},
+	{obj.APCALIGN, C_SCON, C_NONE, C_NONE, C_NONE, C_NONE, 0, 0, 0, 0},
+	{obj.APCDATA, C_LCON, C_NONE, C_NONE, C_LCON, C_NONE, 0, 0, 0, 0},
+	{obj.APCDATA, C_DCON, C_NONE, C_NONE, C_DCON, C_NONE, 0, 0, 0, 0},
+	{obj.AFUNCDATA, C_SCON, C_NONE, C_NONE, C_ADDR, C_NONE, 0, 0, 0, 0},
+	{obj.ANOP, C_NONE, C_NONE, C_NONE, C_NONE, C_NONE, 0, 0, 0, 0},
+	{obj.ANOP, C_LCON, C_NONE, C_NONE, C_NONE, C_NONE, 0, 0, 0, 0}, // nop variants, see #40689
+	{obj.ANOP, C_DCON, C_NONE, C_NONE, C_NONE, C_NONE, 0, 0, 0, 0}, // nop variants, see #40689
+	{obj.ANOP, C_REG, C_NONE, C_NONE, C_NONE, C_NONE, 0, 0, 0, 0},
+	{obj.ANOP, C_FREG, C_NONE, C_NONE, C_NONE, C_NONE, 0, 0, 0, 0},
+	{obj.ADUFFZERO, C_NONE, C_NONE, C_NONE, C_LBRA, C_NONE, 11, 4, 0, 0}, // same as AJMP
+	{obj.ADUFFCOPY, C_NONE, C_NONE, C_NONE, C_LBRA, C_NONE, 11, 4, 0, 0}, // same as AJMP
+
+	{obj.AXXX, C_NONE, C_NONE, C_NONE, C_NONE, C_NONE, 0, 4, 0, 0},
+}
+
+// pcAlignPadLength returns the number of bytes required to align pc to alignedValue,
+// reporting an error if alignedValue is not a power of two or is out of range.
+func pcAlignPadLength(ctxt *obj.Link, pc int64, alignedValue int64) int {
+	if !((alignedValue&(alignedValue-1) == 0) && 8 <= alignedValue && alignedValue <= 2048) {
+		ctxt.Diag("alignment value of an instruction must be a power of two and in the range [8, 2048], got %d\n", alignedValue)
+	}
+	return int(-pc & (alignedValue - 1))
 }
 
 var oprange [ALAST & obj.AMask][]Optab
@@ -383,10 +417,20 @@
 		o = c.oplook(p)
 		m = int(o.size)
 		if m == 0 {
-			if p.As != obj.ANOP && p.As != obj.AFUNCDATA && p.As != obj.APCDATA {
+			switch p.As {
+			case obj.APCALIGN:
+				alignedValue := p.From.Offset
+				m = pcAlignPadLength(ctxt, pc, alignedValue)
+				// Update the current text symbol alignment value.
+				if int32(alignedValue) > cursym.Func().Align {
+					cursym.Func().Align = int32(alignedValue)
+				}
+				break
+			case obj.ANOP, obj.AFUNCDATA, obj.APCDATA:
+				continue
+			default:
 				c.ctxt.Diag("zero-width instruction\n%v", p)
 			}
-			continue
 		}
 
 		pc += int64(m)
@@ -394,24 +438,58 @@
 
 	c.cursym.Size = pc
 
-	/*
-	 * if any procedure is large enough to
-	 * generate a large SBRA branch, then
-	 * generate extra passes putting branches
-	 * around jmps to fix. this is rare.
-	 */
-	bflag := 1
+	// mark loop entry instructions for padding
+	// loop entrances are defined as targets of backward branches
+	for p = c.cursym.Func().Text.Link; p != nil; p = p.Link {
+		if q := p.To.Target(); q != nil && q.Pc < p.Pc {
+			q.Mark |= branchLoopHead
+		}
+	}
 
+	// Run these passes until convergence.
+	bflag := 1
 	var otxt int64
 	var q *obj.Prog
 	for bflag != 0 {
 		bflag = 0
 		pc = 0
-		for p = c.cursym.Func().Text.Link; p != nil; p = p.Link {
+		prev := c.cursym.Func().Text
+		for p = prev.Link; p != nil; prev, p = p, p.Link {
 			p.Pc = pc
 			o = c.oplook(p)
 
+			// Prepend a PCALIGN $loopAlign to each of the loop heads
+			// that need padding, if not already done so (because this
+			// pass may execute more than once).
+			//
+			// This needs to come before any pass that look at pc,
+			// because pc will be adjusted if padding happens.
+			if p.Mark&branchLoopHead != 0 && pc&(loopAlign-1) != 0 &&
+				!(prev.As == obj.APCALIGN && prev.From.Offset >= loopAlign) {
+				q = c.newprog()
+				prev.Link = q
+				q.Link = p
+				q.Pc = pc
+				q.As = obj.APCALIGN
+				q.From.Type = obj.TYPE_CONST
+				q.From.Offset = loopAlign
+				// Don't associate the synthesized PCALIGN with
+				// the original source position, for deterministic
+				// mapping between source and corresponding asm.
+				// q.Pos = p.Pos
+
+				// Manually make the PCALIGN come into effect,
+				// since this loop iteration is for p.
+				pc += int64(pcAlignPadLength(ctxt, pc, loopAlign))
+				p.Pc = pc
+			}
+
 			// very large conditional branches
+			//
+			// if any procedure is large enough to
+			// generate a large SBRA branch, then
+			// generate extra passes putting branches
+			// around jmps to fix. this is rare.
 			if o.type_ == 6 && p.To.Target() != nil {
 				otxt = p.To.Target().Pc - pc
 				if otxt < -(1<<17)+10 || otxt >= (1<<17)-10 {
@@ -430,19 +508,22 @@
 					q.Pos = p.Pos
 					q.To.Type = obj.TYPE_BRANCH
 					q.To.SetTarget(q.Link.Link)
-
-					c.addnop(p.Link)
-					c.addnop(p)
 					bflag = 1
 				}
 			}
 
 			m = int(o.size)
 			if m == 0 {
-				if p.As != obj.ANOP && p.As != obj.AFUNCDATA && p.As != obj.APCDATA {
+				switch p.As {
+				case obj.APCALIGN:
+					alignedValue := p.From.Offset
+					m = pcAlignPadLength(ctxt, pc, alignedValue)
+					break
+				case obj.ANOP, obj.AFUNCDATA, obj.APCDATA:
+					continue
+				default:
 					c.ctxt.Diag("zero-width instruction\n%v", p)
 				}
-				continue
 			}
 
 			pc += int64(m)
@@ -466,6 +547,16 @@
 		if int(o.size) > 4*len(out) {
 			log.Fatalf("out array in span0 is too small, need at least %d for %v", o.size/4, p)
 		}
+		if p.As == obj.APCALIGN {
+			alignedValue := p.From.Offset
+			v := pcAlignPadLength(c.ctxt, p.Pc, alignedValue)
+			for i = 0; i < int32(v/4); i++ {
+				// emit ANOOP instruction by the padding size
+				c.ctxt.Arch.ByteOrder.PutUint32(bp, c.oprrr(ANOOP))
+				bp = bp[4:]
+			}
+			continue
+		}
 		c.asmout(p, o, out[:])
 		for i = 0; i < int32(o.size/4); i++ {
 			c.ctxt.Arch.ByteOrder.PutUint32(bp, out[i])
@@ -542,7 +633,11 @@
 			c.instoffset = a.Offset
 			if a.Sym != nil { // use relocation
 				if a.Sym.Type == objabi.STLSBSS {
-					return C_TLS
+					if c.ctxt.Flag_shared {
+						return C_TLS_IE
+					} else {
+						return C_TLS_LE
+					}
 				}
 				return C_ADDR
 			}
@@ -698,40 +793,61 @@
 	if a1 != 0 {
 		return &optab[a1-1]
 	}
+
+	// first source operand
 	a1 = int(p.From.Class)
 	if a1 == 0 {
 		a1 = c.aclass(&p.From) + 1
 		p.From.Class = int8(a1)
 	}
-
 	a1--
-	a3 := int(p.To.Class)
-	if a3 == 0 {
-		a3 = c.aclass(&p.To) + 1
-		p.To.Class = int8(a3)
-	}
 
-	a3--
+	// first destination operand
+	a4 := int(p.To.Class)
+	if a4 == 0 {
+		a4 = c.aclass(&p.To) + 1
+		p.To.Class = int8(a4)
+	}
+	a4--
+
+	// 2nd source operand
 	a2 := C_NONE
 	if p.Reg != 0 {
 		a2 = C_REG
 	}
 
+	// 2nd destination operand
+	a5 := C_NONE
+	if p.RegTo2 != 0 {
+		a5 = C_REG
+	}
+
+	// 3rd source operand
+	a3 := C_NONE
+	if len(p.RestArgs) > 0 {
+		a3 = int(p.RestArgs[0].Class)
+		if a3 == 0 {
+			a3 = c.aclass(&p.RestArgs[0].Addr) + 1
+			p.RestArgs[0].Class = int8(a3)
+		}
+		a3--
+	}
+
 	ops := oprange[p.As&obj.AMask]
 	c1 := &xcmp[a1]
-	c3 := &xcmp[a3]
+	c4 := &xcmp[a4]
 	for i := range ops {
 		op := &ops[i]
-		if int(op.a2) == a2 && c1[op.a1] && c3[op.a3] && (op.family == 0 || c.ctxt.Arch.Family == op.family) {
+		if (int(op.reg) == a2) && int(op.from3) == a3 && c1[op.from1] && c4[op.to1] && (int(op.to2) == a5) {
 			p.Optab = uint16(cap(optab) - cap(ops) + i + 1)
 			return op
 		}
 	}
 
-	c.ctxt.Diag("illegal combination %v %v %v %v", p.As, DRconv(a1), DRconv(a2), DRconv(a3))
+	c.ctxt.Diag("illegal combination %v %v %v %v %v %v", p.As, DRconv(a1), DRconv(a2), DRconv(a3), DRconv(a4), DRconv(a5))
 	prasm(p)
 	// Turn illegal instruction into an UNDEF, avoid crashing in asmout.
-	return &Optab{obj.AUNDEF, C_NONE, C_NONE, C_NONE, 49, 4, 0, 0, 0}
+	return &Optab{obj.AUNDEF, C_NONE, C_NONE, C_NONE, C_NONE, C_NONE, 49, 4, 0, 0}
 }
 
 func cmp(a int, b int) bool {
@@ -837,15 +953,15 @@
 	if n != 0 {
 		return n < 0
 	}
-	n = int(p1.a1) - int(p2.a1)
+	n = int(p1.from1) - int(p2.from1)
 	if n != 0 {
 		return n < 0
 	}
-	n = int(p1.a2) - int(p2.a2)
+	n = int(p1.reg) - int(p2.reg)
 	if n != 0 {
 		return n < 0
 	}
-	n = int(p1.a3) - int(p2.a3)
+	n = int(p1.to1) - int(p2.to1)
 	if n != 0 {
 		return n < 0
 	}
@@ -1030,10 +1146,14 @@
 			ANEGW,
 			ANEGV,
 			AWORD,
+			ARDTIMELW,
+			ARDTIMEHW,
+			ARDTIMED,
 			obj.ANOP,
 			obj.ATEXT,
 			obj.AUNDEF,
 			obj.AFUNCDATA,
+			obj.APCALIGN,
 			obj.APCDATA,
 			obj.ADUFFZERO,
 			obj.ADUFFCOPY:
@@ -1077,7 +1197,7 @@
 }
 
 func OP_16IR_5I(op uint32, i uint32, r2 uint32) uint32 {
-	return op | (i&0xFFFF)<<10 | (r2&0x7)<<5 | ((i >> 16) & 0x1F)
+	return op | (i&0xFFFF)<<10 | (r2&0x1F)<<5 | ((i >> 16) & 0x1F)
 }
 
 func OP_16IRR(op uint32, i uint32, r2 uint32, r3 uint32) uint32 {
@@ -1140,7 +1260,7 @@
 			r = int(o.param)
 		}
 		a := add
-		if o.a1 == C_ANDCON {
+		if o.from1 == C_ANDCON {
 			a = AOR
 		}
 
@@ -1161,26 +1281,41 @@
 
 	case 6: // beq r1,[r2],sbra
 		v := int32(0)
-		vcmp := int32(0)
 		if p.To.Target() != nil {
 			v = int32(p.To.Target().Pc-p.Pc) >> 2
 		}
-		if v < 0 {
-			vcmp = -v
+		as, rd, rj, width := p.As, p.Reg, p.From.Reg, 16
+		switch as {
+		case ABGTZ, ABLEZ:
+			rd, rj = rj, rd
+		case ABFPT, ABFPF:
+			width = 21
+			// FCC0 is the implicit source operand, now that we
+			// don't register-allocate from the FCC bank.
+			rd = REG_FCC0
+		case ABEQ, ABNE:
+			if rd == 0 || rd == REGZERO || rj == REGZERO {
+				// BEQZ/BNEZ can be encoded with 21-bit offsets.
+				width = 21
+				as = -as
+				if rj == 0 || rj == REGZERO {
+					rj = rd
+				}
+			}
 		}
-		if (p.As == ABFPT || p.As == ABFPF) && ((uint32(vcmp))>>21)&0x7FF != 0 {
-			c.ctxt.Diag("21 bit-width, short branch too far\n%v", p)
-		} else if p.As != ABFPT && p.As != ABFPF && (v<<16)>>16 != v {
-			c.ctxt.Diag("16 bit-width, short branch too far\n%v", p)
-		}
-		if p.As == ABGTZ || p.As == ABLEZ {
-			o1 = OP_16IRR(c.opirr(p.As), uint32(v), uint32(p.Reg), uint32(p.From.Reg))
-		} else if p.As == ABFPT || p.As == ABFPF {
-			// BCNEZ cj offset21 ,cj = fcc0
-			// BCEQZ cj offset21 ,cj = fcc0
-			o1 = OP_16IR_5I(c.opirr(p.As), uint32(v), uint32(REG_FCC0))
-		} else {
-			o1 = OP_16IRR(c.opirr(p.As), uint32(v), uint32(p.From.Reg), uint32(p.Reg))
+		switch width {
+		case 21:
+			if (v<<11)>>11 != v {
+				c.ctxt.Diag("21 bit-width, short branch too far\n%v", p)
+			}
+			o1 = OP_16IR_5I(c.opirr(as), uint32(v), uint32(rj))
+		case 16:
+			if (v<<16)>>16 != v {
+				c.ctxt.Diag("16 bit-width, short branch too far\n%v", p)
+			}
+			o1 = OP_16IRR(c.opirr(as), uint32(v), uint32(rj), uint32(rd))
+		default:
+			c.ctxt.Diag("unexpected branch encoding\n%v", p)
 		}
 
 	case 7: // mov r, soreg
@@ -1225,24 +1360,14 @@
 
 	case 11: // jmp lbra
 		v := int32(0)
-		if c.aclass(&p.To) == C_SBRA && p.To.Sym == nil && p.As == AJMP {
-			// use PC-relative branch for short branches
-			// BEQ	R0, R0, sbra
-			if p.To.Target() != nil {
-				v = int32(p.To.Target().Pc-p.Pc) >> 2
-			}
-			if (v<<16)>>16 == v {
-				o1 = OP_16IRR(c.opirr(ABEQ), uint32(v), uint32(REGZERO), uint32(REGZERO))
-				break
-			}
-		}
-		if p.To.Target() == nil {
-			v = int32(p.Pc) >> 2
-		} else {
-			v = int32(p.To.Target().Pc) >> 2
+		if p.To.Target() != nil {
+			v = int32(p.To.Target().Pc-p.Pc) >> 2
 		}
 		o1 = OP_B_BL(c.opirr(p.As), uint32(v))
 		if p.To.Sym == nil {
+			if p.As == AJMP {
+				break
+			}
 			p.To.Sym = c.cursym.Func().Text.From.Sym
 			p.To.Offset = p.To.Target().Pc
 		}
@@ -1429,7 +1554,7 @@
 	case 34: // mov $con,fr
 		v := c.regoff(&p.From)
 		a := AADDU
-		if o.a1 == C_ANDCON {
+		if o.from1 == C_ANDCON {
 			a = AOR
 		}
 		o1 = OP_12IRR(c.opirr(a), uint32(v), uint32(0), uint32(REGTMP))
@@ -1470,8 +1595,8 @@
 		o1 = c.oprrr(ABREAK)
 
 	// relocation operations
-	case 50: // mov r,addr ==> pcaddu12i + sw
-		o1 = OP_IR(c.opir(APCADDU12I), uint32(0), uint32(REGTMP))
+	case 50: // mov r,addr ==> pcalau12i + sw
+		o1 = OP_IR(c.opir(APCALAU12I), uint32(0), uint32(REGTMP))
 		rel := obj.Addrel(c.cursym)
 		rel.Off = int32(c.pc)
 		rel.Siz = 4
@@ -1487,8 +1612,8 @@
 		rel2.Add = p.To.Offset
 		rel2.Type = objabi.R_ADDRLOONG64
 
-	case 51: // mov addr,r ==> pcaddu12i + lw
-		o1 = OP_IR(c.opir(APCADDU12I), uint32(0), uint32(REGTMP))
+	case 51: // mov addr,r ==> pcalau12i + lw
+		o1 = OP_IR(c.opir(APCALAU12I), uint32(0), uint32(REGTMP))
 		rel := obj.Addrel(c.cursym)
 		rel.Off = int32(c.pc)
 		rel.Siz = 4
@@ -1506,7 +1631,7 @@
 	case 52: // mov $lext, r
 		// NOTE: this case does not use REGTMP. If it ever does,
 		// remove the NOTUSETMP flag in optab.
-		o1 = OP_IR(c.opir(APCADDU12I), uint32(0), uint32(p.To.Reg))
+		o1 = OP_IR(c.opir(APCALAU12I), uint32(0), uint32(p.To.Reg))
 		rel := obj.Addrel(c.cursym)
 		rel.Off = int32(c.pc)
 		rel.Siz = 4
@@ -1580,6 +1705,42 @@
 		rel2.Type = objabi.R_ADDRLOONG64TLS
 		o3 = OP_RRR(c.oprrr(AADDV), uint32(REG_R2), uint32(REGTMP), uint32(p.To.Reg))
 
+	case 56: // mov r, tlsvar IE model ==> (pcalau12i + ld.d)tlsvar@got + add.d + st.d
+		o1 = OP_IR(c.opir(APCALAU12I), uint32(0), uint32(REGTMP))
+		rel := obj.Addrel(c.cursym)
+		rel.Off = int32(c.pc)
+		rel.Siz = 4
+		rel.Sym = p.To.Sym
+		rel.Add = 0x0
+		rel.Type = objabi.R_LOONG64_TLS_IE_PCREL_HI
+		o2 = OP_12IRR(c.opirr(-p.As), uint32(0), uint32(REGTMP), uint32(REGTMP))
+		rel2 := obj.Addrel(c.cursym)
+		rel2.Off = int32(c.pc + 4)
+		rel2.Siz = 4
+		rel2.Sym = p.To.Sym
+		rel2.Add = 0x0
+		rel2.Type = objabi.R_LOONG64_TLS_IE_LO
+		o3 = OP_RRR(c.oprrr(AADDVU), uint32(REGTMP), uint32(REG_R2), uint32(REGTMP))
+		o4 = OP_12IRR(c.opirr(p.As), uint32(0), uint32(REGTMP), uint32(p.From.Reg))
+
+	case 57: // mov tlsvar, r IE model ==> (pcalau12i + ld.d)tlsvar@got + add.d + ld.d
+		o1 = OP_IR(c.opir(APCALAU12I), uint32(0), uint32(REGTMP))
+		rel := obj.Addrel(c.cursym)
+		rel.Off = int32(c.pc)
+		rel.Siz = 4
+		rel.Sym = p.From.Sym
+		rel.Add = 0x0
+		rel.Type = objabi.R_LOONG64_TLS_IE_PCREL_HI
+		o2 = OP_12IRR(c.opirr(-p.As), uint32(0), uint32(REGTMP), uint32(REGTMP))
+		rel2 := obj.Addrel(c.cursym)
+		rel2.Off = int32(c.pc + 4)
+		rel2.Siz = 4
+		rel2.Sym = p.From.Sym
+		rel2.Add = 0x0
+		rel2.Type = objabi.R_LOONG64_TLS_IE_LO
+		o3 = OP_RRR(c.oprrr(AADDVU), uint32(REGTMP), uint32(REG_R2), uint32(REGTMP))
+		o4 = OP_12IRR(c.opirr(-p.As), uint32(0), uint32(REGTMP), uint32(p.To.Reg))
+
 	case 59: // mov $dcon,r
 		// NOTE: this case does not use REGTMP. If it ever does,
 		// remove the NOTUSETMP flag in optab.
@@ -1604,6 +1765,17 @@
 	case 61: // word C_DCON
 		o1 = uint32(c.vregoff(&p.From))
 		o2 = uint32(c.vregoff(&p.From) >> 32)
+
+	case 62: // rdtimex rd, rj
+		o1 = OP_RR(c.oprr(p.As), uint32(p.To.Reg), uint32(p.RegTo2))
+
+	case 63: // movv c_fcc0, c_reg ==> movcf2gr rd, cj
+		a := OP_TEN(8, 1335)
+		o1 = OP_RR(a, uint32(p.From.Reg), uint32(p.To.Reg))
+
+	case 64: // movv c_reg, c_fcc0 ==> movgr2cf cd, rj
+		a := OP_TEN(8, 1334)
+		o1 = OP_RR(a, uint32(p.From.Reg), uint32(p.To.Reg))
 	}
 
 	out[0] = o1
@@ -1811,6 +1983,12 @@
 		return 0x4 << 10
 	case ACLZ:
 		return 0x5 << 10
+	case ARDTIMELW:
+		return 0x18 << 10
+	case ARDTIMEHW:
+		return 0x19 << 10
+	case ARDTIMED:
+		return 0x1a << 10
 	}
 
 	c.ctxt.Diag("bad rr opcode %v", a)
@@ -1823,6 +2001,8 @@
 		return 0x0a << 25
 	case ALU32ID:
 		return 0x0b << 25
+	case APCALAU12I:
+		return 0x0d << 25
 	case APCADDU12I:
 		return 0x0e << 25
 	}
@@ -1875,6 +2055,10 @@
 		return 0x1b << 26
 	case ABGE, ABGEZ, ABLEZ:
 		return 0x19 << 26
+	case -ABEQ: // beqz
+		return 0x10 << 26
+	case -ABNE: // bnez
+		return 0x11 << 26
 	case ABEQ:
 		return 0x16 << 26
 	case ABNE:
diff --git a/src/cmd/internal/obj/loong64/cnames.go b/src/cmd/internal/obj/loong64/cnames.go
index f397077..8b8af6b 100644
--- a/src/cmd/internal/obj/loong64/cnames.go
+++ b/src/cmd/internal/obj/loong64/cnames.go
@@ -4,11 +4,11 @@
 
 package loong64
 
+// This order should be strictly consistent to that in a.out.go.
 var cnames0 = []string{
 	"NONE",
 	"REG",
 	"FREG",
-	"FCREG",
 	"FCSRREG",
 	"FCCREG",
 	"ZCON",
@@ -37,7 +37,8 @@
 	"LOREG",
 	"GOK",
 	"ADDR",
-	"TLS",
+	"TLS_LE",
+	"TLS_IE",
 	"TEXTSIZE",
 	"NCLASS",
 }
diff --git a/src/cmd/internal/obj/loong64/obj.go b/src/cmd/internal/obj/loong64/obj.go
index dc05e18..1eedd46 100644
--- a/src/cmd/internal/obj/loong64/obj.go
+++ b/src/cmd/internal/obj/loong64/obj.go
@@ -6,8 +6,8 @@
 
 import (
 	"cmd/internal/obj"
-	"cmd/internal/objabi"
 	"cmd/internal/sys"
+	"internal/abi"
 	"log"
 	"math"
 )
@@ -260,6 +260,20 @@
 				q.Spadj = +autosize
 
 				q = c.ctxt.EndUnsafePoint(q, c.newprog, -1)
+
+				// On Linux, in a cgo binary we may get a SIGSETXID signal early on
+				// before the signal stack is set, as glibc doesn't allow us to block
+				// SIGSETXID. So a signal may land on the current stack and clobber
+				// the content below the SP. We store the LR again after the SP is
+				// decremented.
+				q = obj.Appendp(q, newprog)
+				q.As = mov
+				q.Pos = p.Pos
+				q.From.Type = obj.TYPE_REG
+				q.From.Reg = REGLINK
+				q.To.Type = obj.TYPE_MEM
+				q.To.Offset = 0
+				q.To.Reg = REGSP
 			}
 
 			if c.cursym.Func().Text.From.Sym.Wrapper() && c.cursym.Func().Text.Mark&LEAF == 0 {
@@ -463,8 +477,8 @@
 
 		if p.To.Type == obj.TYPE_REG && p.To.Reg == REGSP && p.Spadj == 0 {
 			f := c.cursym.Func()
-			if f.FuncFlag&objabi.FuncFlag_SPWRITE == 0 {
-				c.cursym.Func().FuncFlag |= objabi.FuncFlag_SPWRITE
+			if f.FuncFlag&abi.FuncFlagSPWrite == 0 {
+				c.cursym.Func().FuncFlag |= abi.FuncFlagSPWrite
 				if ctxt.Debugvlog || !ctxt.IsAsm {
 					ctxt.Logf("auto-SPWRITE: %s %v\n", c.cursym.Name, p)
 					if !ctxt.IsAsm {
@@ -579,7 +593,7 @@
 	p = c.ctxt.StartUnsafePoint(p, c.newprog)
 
 	var q *obj.Prog
-	if framesize <= objabi.StackSmall {
+	if framesize <= abi.StackSmall {
 		// small stack: SP < stackguard
 		//	AGTU	SP, stackguard, R19
 		p = obj.Appendp(p, c.newprog)
@@ -592,8 +606,8 @@
 		p.To.Reg = REG_R19
 	} else {
 		// large stack: SP-framesize < stackguard-StackSmall
-		offset := int64(framesize) - objabi.StackSmall
-		if framesize > objabi.StackBig {
+		offset := int64(framesize) - abi.StackSmall
+		if framesize > abi.StackBig {
 			// Such a large stack we need to protect against underflow.
 			// The runtime guarantees SP > objabi.StackBig, but
 			// framesize is large enough that SP-framesize may
diff --git a/src/cmd/internal/obj/mips/obj0.go b/src/cmd/internal/obj/mips/obj0.go
index 9241dfd..d3a8566 100644
--- a/src/cmd/internal/obj/mips/obj0.go
+++ b/src/cmd/internal/obj/mips/obj0.go
@@ -31,10 +31,10 @@
 
 import (
 	"cmd/internal/obj"
-	"cmd/internal/objabi"
 	"cmd/internal/sys"
 	"encoding/binary"
 	"fmt"
+	"internal/abi"
 	"log"
 	"math"
 )
@@ -560,8 +560,8 @@
 
 		if p.To.Type == obj.TYPE_REG && p.To.Reg == REGSP && p.Spadj == 0 {
 			f := c.cursym.Func()
-			if f.FuncFlag&objabi.FuncFlag_SPWRITE == 0 {
-				c.cursym.Func().FuncFlag |= objabi.FuncFlag_SPWRITE
+			if f.FuncFlag&abi.FuncFlagSPWrite == 0 {
+				c.cursym.Func().FuncFlag |= abi.FuncFlagSPWrite
 				if ctxt.Debugvlog || !ctxt.IsAsm {
 					ctxt.Logf("auto-SPWRITE: %s %v\n", c.cursym.Name, p)
 					if !ctxt.IsAsm {
@@ -774,7 +774,7 @@
 	p = c.ctxt.StartUnsafePoint(p, c.newprog)
 
 	var q *obj.Prog
-	if framesize <= objabi.StackSmall {
+	if framesize <= abi.StackSmall {
 		// small stack: SP < stackguard
 		//	AGTU	SP, stackguard, R1
 		p = obj.Appendp(p, c.newprog)
@@ -787,8 +787,8 @@
 		p.To.Reg = REG_R1
 	} else {
 		// large stack: SP-framesize < stackguard-StackSmall
-		offset := int64(framesize) - objabi.StackSmall
-		if framesize > objabi.StackBig {
+		offset := int64(framesize) - abi.StackSmall
+		if framesize > abi.StackBig {
 			// Such a large stack we need to protect against underflow.
 			// The runtime guarantees SP > objabi.StackBig, but
 			// framesize is large enough that SP-framesize may
diff --git a/src/cmd/internal/obj/objfile.go b/src/cmd/internal/obj/objfile.go
index ff0968e..aa99855 100644
--- a/src/cmd/internal/obj/objfile.go
+++ b/src/cmd/internal/obj/objfile.go
@@ -15,6 +15,7 @@
 	"cmd/internal/sys"
 	"encoding/binary"
 	"fmt"
+	"internal/abi"
 	"io"
 	"log"
 	"os"
@@ -344,6 +345,9 @@
 	if strings.HasPrefix(s.Name, w.ctxt.Pkgpath) && strings.HasPrefix(s.Name[len(w.ctxt.Pkgpath):], ".") && strings.HasPrefix(s.Name[len(w.ctxt.Pkgpath)+1:], objabi.GlobalDictPrefix) {
 		flag2 |= goobj.SymFlagDict
 	}
+	if s.IsPkgInit() {
+		flag2 |= goobj.SymFlagPkgInit
+	}
 	name := s.Name
 	if strings.HasPrefix(name, "gofile..") {
 		name = filepath.ToSlash(name)
@@ -353,7 +357,7 @@
 		align = uint32(fn.Align)
 	}
 	if s.ContentAddressable() && s.Size != 0 {
-		// We generally assume data symbols are natually aligned
+		// We generally assume data symbols are naturally aligned
 		// (e.g. integer constants), except for strings and a few
 		// compiler-emitted funcdata. If we dedup a string symbol and
 		// a non-string symbol with the same content, we should keep
@@ -421,7 +425,7 @@
 // contentHashSection only distinguishes between sets of sections for which this matters.
 // Allowing flexibility increases the effectiveness of content-addressibility.
 // But in some cases, such as doing addressing based on a base symbol,
-// we need to ensure that a symbol is always in a prticular section.
+// we need to ensure that a symbol is always in a particular section.
 // Some of these conditions are duplicated in cmd/link/internal/ld.(*Link).symtab.
 // TODO: instead of duplicating them, have the compiler decide where symbols go.
 func contentHashSection(s *LSym) byte {
@@ -599,10 +603,22 @@
 		if fn.Pcln.Pcinline != nil && fn.Pcln.Pcinline.Size != 0 {
 			w.aux1(goobj.AuxPcinline, fn.Pcln.Pcinline)
 		}
+		if fn.sehUnwindInfoSym != nil && fn.sehUnwindInfoSym.Size != 0 {
+			w.aux1(goobj.AuxSehUnwindInfo, fn.sehUnwindInfoSym)
+		}
 		for _, pcSym := range fn.Pcln.Pcdata {
 			w.aux1(goobj.AuxPcdata, pcSym)
 		}
-
+		if fn.WasmImportSym != nil {
+			if fn.WasmImportSym.Size == 0 {
+				panic("wasmimport aux sym must have non-zero size")
+			}
+			w.aux1(goobj.AuxWasmImport, fn.WasmImportSym)
+		}
+	} else if v := s.VarInfo(); v != nil {
+		if v.dwarfInfoSym != nil && v.dwarfInfoSym.Size != 0 {
+			w.aux1(goobj.AuxDwarfInfo, v.dwarfInfoSym)
+		}
 	}
 }
 
@@ -699,7 +715,20 @@
 		if fn.Pcln.Pcinline != nil && fn.Pcln.Pcinline.Size != 0 {
 			n++
 		}
+		if fn.sehUnwindInfoSym != nil && fn.sehUnwindInfoSym.Size != 0 {
+			n++
+		}
 		n += len(fn.Pcln.Pcdata)
+		if fn.WasmImport != nil {
+			if fn.WasmImportSym == nil || fn.WasmImportSym.Size == 0 {
+				panic("wasmimport aux sym must exist and have non-zero size")
+			}
+			n++
+		}
+	} else if v := s.VarInfo(); v != nil {
+		if v.dwarfInfoSym != nil && v.dwarfInfoSym.Size != 0 {
+			n++
+		}
 	}
 	return n
 }
@@ -756,8 +785,8 @@
 		fn.FuncInfoSym = isym
 		b.Reset()
 
-		dwsyms := []*LSym{fn.dwarfRangesSym, fn.dwarfLocSym, fn.dwarfDebugLinesSym, fn.dwarfInfoSym}
-		for _, s := range dwsyms {
+		auxsyms := []*LSym{fn.dwarfRangesSym, fn.dwarfLocSym, fn.dwarfDebugLinesSym, fn.dwarfInfoSym, fn.WasmImportSym, fn.sehUnwindInfoSym}
+		for _, s := range auxsyms {
 			if s == nil || s.Size == 0 {
 				continue
 			}
@@ -774,11 +803,14 @@
 func writeAuxSymDebug(ctxt *Link, par *LSym, aux *LSym) {
 	// Most aux symbols (ex: funcdata) are not interesting--
 	// pick out just the DWARF ones for now.
-	if aux.Type != objabi.SDWARFLOC &&
-		aux.Type != objabi.SDWARFFCN &&
-		aux.Type != objabi.SDWARFABSFCN &&
-		aux.Type != objabi.SDWARFLINES &&
-		aux.Type != objabi.SDWARFRANGE {
+	switch aux.Type {
+	case objabi.SDWARFLOC,
+		objabi.SDWARFFCN,
+		objabi.SDWARFABSFCN,
+		objabi.SDWARFLINES,
+		objabi.SDWARFRANGE,
+		objabi.SDWARFVAR:
+	default:
 		return
 	}
 	ctxt.writeSymDebugNamed(aux, "aux for "+par.Name)
@@ -821,10 +853,10 @@
 	if s.NoSplit() {
 		fmt.Fprintf(ctxt.Bso, "nosplit ")
 	}
-	if s.Func() != nil && s.Func().FuncFlag&objabi.FuncFlag_TOPFRAME != 0 {
+	if s.Func() != nil && s.Func().FuncFlag&abi.FuncFlagTopFrame != 0 {
 		fmt.Fprintf(ctxt.Bso, "topframe ")
 	}
-	if s.Func() != nil && s.Func().FuncFlag&objabi.FuncFlag_ASM != 0 {
+	if s.Func() != nil && s.Func().FuncFlag&abi.FuncFlagAsm != 0 {
 		fmt.Fprintf(ctxt.Bso, "asm ")
 	}
 	fmt.Fprintf(ctxt.Bso, "size=%d", s.Size)
diff --git a/src/cmd/internal/obj/pass.go b/src/cmd/internal/obj/pass.go
index b91a15d..066b779 100644
--- a/src/cmd/internal/obj/pass.go
+++ b/src/cmd/internal/obj/pass.go
@@ -125,8 +125,8 @@
 func linkpatch(ctxt *Link, sym *LSym, newprog ProgAlloc) {
 	for p := sym.Func().Text; p != nil; p = p.Link {
 		checkaddr(ctxt, p, &p.From)
-		if p.GetFrom3() != nil {
-			checkaddr(ctxt, p, p.GetFrom3())
+		for _, v := range p.RestArgs {
+			checkaddr(ctxt, p, &v.Addr)
 		}
 		checkaddr(ctxt, p, &p.To)
 
diff --git a/src/cmd/internal/obj/plist.go b/src/cmd/internal/obj/plist.go
index fe9d2e1..921dfee 100644
--- a/src/cmd/internal/obj/plist.go
+++ b/src/cmd/internal/obj/plist.go
@@ -8,6 +8,7 @@
 	"cmd/internal/objabi"
 	"cmd/internal/src"
 	"fmt"
+	"internal/abi"
 	"strings"
 )
 
@@ -57,12 +58,12 @@
 			}
 			switch p.To.Sym.Name {
 			case "go_args_stackmap":
-				if p.From.Type != TYPE_CONST || p.From.Offset != objabi.FUNCDATA_ArgsPointerMaps {
+				if p.From.Type != TYPE_CONST || p.From.Offset != abi.FUNCDATA_ArgsPointerMaps {
 					ctxt.Diag("%s: FUNCDATA use of go_args_stackmap(SB) without FUNCDATA_ArgsPointerMaps", p.Pos)
 				}
 				p.To.Sym = ctxt.LookupDerived(curtext, curtext.Name+".args_stackmap")
 			case "no_pointers_stackmap":
-				if p.From.Type != TYPE_CONST || p.From.Offset != objabi.FUNCDATA_LocalsPointerMaps {
+				if p.From.Type != TYPE_CONST || p.From.Offset != abi.FUNCDATA_LocalsPointerMaps {
 					ctxt.Diag("%s: FUNCDATA use of no_pointers_stackmap(SB) without FUNCDATA_LocalsPointerMaps", p.Pos)
 				}
 				// funcdata for functions with no local variables in frame.
@@ -109,10 +110,10 @@
 			foundArgMap, foundArgInfo := false, false
 			for p := s.Func().Text; p != nil; p = p.Link {
 				if p.As == AFUNCDATA && p.From.Type == TYPE_CONST {
-					if p.From.Offset == objabi.FUNCDATA_ArgsPointerMaps {
+					if p.From.Offset == abi.FUNCDATA_ArgsPointerMaps {
 						foundArgMap = true
 					}
-					if p.From.Offset == objabi.FUNCDATA_ArgInfo {
+					if p.From.Offset == abi.FUNCDATA_ArgInfo {
 						foundArgInfo = true
 					}
 					if foundArgMap && foundArgInfo {
@@ -124,7 +125,7 @@
 				p := Appendp(s.Func().Text, newprog)
 				p.As = AFUNCDATA
 				p.From.Type = TYPE_CONST
-				p.From.Offset = objabi.FUNCDATA_ArgsPointerMaps
+				p.From.Offset = abi.FUNCDATA_ArgsPointerMaps
 				p.To.Type = TYPE_MEM
 				p.To.Name = NAME_EXTERN
 				p.To.Sym = ctxt.LookupDerived(s, s.Name+".args_stackmap")
@@ -133,7 +134,7 @@
 				p := Appendp(s.Func().Text, newprog)
 				p.As = AFUNCDATA
 				p.From.Type = TYPE_CONST
-				p.From.Offset = objabi.FUNCDATA_ArgInfo
+				p.From.Offset = abi.FUNCDATA_ArgInfo
 				p.To.Type = TYPE_MEM
 				p.To.Name = NAME_EXTERN
 				p.To.Sym = ctxt.LookupDerived(s, fmt.Sprintf("%s.arginfo%d", s.Name, s.ABI()))
@@ -157,6 +158,9 @@
 		if myimportpath != "" {
 			ctxt.populateDWARF(plist.Curfn, s, myimportpath)
 		}
+		if ctxt.Headtype == objabi.Hwindows && ctxt.Arch.SEH != nil {
+			s.Func().sehUnwindInfoSym = ctxt.Arch.SEH(ctxt, s)
+		}
 	}
 }
 
@@ -193,6 +197,7 @@
 	s.Set(AttrABIWrapper, flag&ABIWRAPPER != 0)
 	s.Set(AttrNeedCtxt, flag&NEEDCTXT != 0)
 	s.Set(AttrNoFrame, flag&NOFRAME != 0)
+	s.Set(AttrPkgInit, flag&PKGINIT != 0)
 	s.Type = objabi.STEXT
 	ctxt.Text = append(ctxt.Text, s)
 
@@ -200,13 +205,13 @@
 	ctxt.dwarfSym(s)
 }
 
-func (ctxt *Link) toFuncFlag(flag int) objabi.FuncFlag {
-	var out objabi.FuncFlag
+func (ctxt *Link) toFuncFlag(flag int) abi.FuncFlag {
+	var out abi.FuncFlag
 	if flag&TOPFRAME != 0 {
-		out |= objabi.FuncFlag_TOPFRAME
+		out |= abi.FuncFlagTopFrame
 	}
 	if ctxt.IsAsm {
-		out |= objabi.FuncFlag_ASM
+		out |= abi.FuncFlagAsm
 	}
 	return out
 }
@@ -256,7 +261,7 @@
 	pcdata.Pos = s.Func().Text.Pos
 	pcdata.As = APCDATA
 	pcdata.From.Type = TYPE_CONST
-	pcdata.From.Offset = objabi.PCDATA_StackMapIndex
+	pcdata.From.Offset = abi.PCDATA_StackMapIndex
 	pcdata.To.Type = TYPE_CONST
 	pcdata.To.Offset = -1 // pcdata starts at -1 at function entry
 
@@ -269,7 +274,7 @@
 	pcdata.Pos = s.Func().Text.Pos
 	pcdata.As = APCDATA
 	pcdata.From.Type = TYPE_CONST
-	pcdata.From.Offset = objabi.PCDATA_UnsafePoint
+	pcdata.From.Offset = abi.PCDATA_UnsafePoint
 	pcdata.To.Type = TYPE_CONST
 	pcdata.To.Offset = -1
 
@@ -284,9 +289,9 @@
 	pcdata := Appendp(p, newprog)
 	pcdata.As = APCDATA
 	pcdata.From.Type = TYPE_CONST
-	pcdata.From.Offset = objabi.PCDATA_UnsafePoint
+	pcdata.From.Offset = abi.PCDATA_UnsafePoint
 	pcdata.To.Type = TYPE_CONST
-	pcdata.To.Offset = objabi.PCDATA_UnsafePointUnsafe
+	pcdata.To.Offset = abi.UnsafePointUnsafe
 
 	return pcdata
 }
@@ -299,7 +304,7 @@
 	pcdata := Appendp(p, newprog)
 	pcdata.As = APCDATA
 	pcdata.From.Type = TYPE_CONST
-	pcdata.From.Offset = objabi.PCDATA_UnsafePoint
+	pcdata.From.Offset = abi.PCDATA_UnsafePoint
 	pcdata.To.Type = TYPE_CONST
 	pcdata.To.Offset = oldval
 
@@ -325,11 +330,11 @@
 	prevPcdata := int64(-1) // entry PC data value
 	prevRestart := int64(0)
 	for p := prev.Link; p != nil; p, prev = p.Link, p {
-		if p.As == APCDATA && p.From.Offset == objabi.PCDATA_UnsafePoint {
+		if p.As == APCDATA && p.From.Offset == abi.PCDATA_UnsafePoint {
 			prevPcdata = p.To.Offset
 			continue
 		}
-		if prevPcdata == objabi.PCDATA_UnsafePointUnsafe {
+		if prevPcdata == abi.UnsafePointUnsafe {
 			continue // already unsafe
 		}
 		if isUnsafePoint(p) {
@@ -348,15 +353,15 @@
 			continue
 		}
 		if isRestartable(p) {
-			val := int64(objabi.PCDATA_Restart1)
+			val := int64(abi.UnsafePointRestart1)
 			if val == prevRestart {
-				val = objabi.PCDATA_Restart2
+				val = abi.UnsafePointRestart2
 			}
 			prevRestart = val
 			q := Appendp(prev, newprog)
 			q.As = APCDATA
 			q.From.Type = TYPE_CONST
-			q.From.Offset = objabi.PCDATA_UnsafePoint
+			q.From.Offset = abi.PCDATA_UnsafePoint
 			q.To.Type = TYPE_CONST
 			q.To.Offset = val
 			q.Pc = p.Pc
@@ -373,7 +378,7 @@
 			p = Appendp(p, newprog)
 			p.As = APCDATA
 			p.From.Type = TYPE_CONST
-			p.From.Offset = objabi.PCDATA_UnsafePoint
+			p.From.Offset = abi.PCDATA_UnsafePoint
 			p.To.Type = TYPE_CONST
 			p.To.Offset = prevPcdata
 			p.Pc = p.Link.Pc
diff --git a/src/cmd/internal/obj/ppc64/a.out.go b/src/cmd/internal/obj/ppc64/a.out.go
index 995f9d9..efc10ea 100644
--- a/src/cmd/internal/obj/ppc64/a.out.go
+++ b/src/cmd/internal/obj/ppc64/a.out.go
@@ -801,6 +801,7 @@
 	AEXTSWSLICC
 	ASTDCCC
 	ATD
+	ASETB
 
 	/* 64-bit pseudo operation */
 	ADWORD
@@ -996,6 +997,8 @@
 	AVSHASIGMAD
 	AVMRGEW
 	AVMRGOW
+	AVCLZLSBB
+	AVCTZLSBB
 
 	/* VSX */
 	ALXV
diff --git a/src/cmd/internal/obj/ppc64/anames.go b/src/cmd/internal/obj/ppc64/anames.go
index 05014ec..f4680cc 100644
--- a/src/cmd/internal/obj/ppc64/anames.go
+++ b/src/cmd/internal/obj/ppc64/anames.go
@@ -333,6 +333,7 @@
 	"EXTSWSLICC",
 	"STDCCC",
 	"TD",
+	"SETB",
 	"DWORD",
 	"REMD",
 	"REMDU",
@@ -522,6 +523,8 @@
 	"VSHASIGMAD",
 	"VMRGEW",
 	"VMRGOW",
+	"VCLZLSBB",
+	"VCTZLSBB",
 	"LXV",
 	"LXVL",
 	"LXVLL",
diff --git a/src/cmd/internal/obj/ppc64/asm9.go b/src/cmd/internal/obj/ppc64/asm9.go
index 9469eda..4559eed 100644
--- a/src/cmd/internal/obj/ppc64/asm9.go
+++ b/src/cmd/internal/obj/ppc64/asm9.go
@@ -34,6 +34,7 @@
 	"cmd/internal/objabi"
 	"encoding/binary"
 	"fmt"
+	"internal/buildcfg"
 	"log"
 	"math"
 	"math/bits"
@@ -58,6 +59,12 @@
 	r0iszero = 1
 )
 
+const (
+	// R bit option in prefixed load/store/add D-form operations
+	PFX_R_ABS   = 0 // Offset is absolute
+	PFX_R_PCREL = 1 // Offset is relative to PC, RA should be 0
+)
+
 type Optab struct {
 	as    obj.As // Opcode
 	a1    uint8  // p.From argument (obj.Addr). p is of type obj.Prog.
@@ -108,8 +115,6 @@
 	{as: AADD, a1: C_UCON, a6: C_REG, type_: 20, size: 4},
 	{as: AADD, a1: C_ANDCON, a2: C_REG, a6: C_REG, type_: 22, size: 8},
 	{as: AADD, a1: C_ANDCON, a6: C_REG, type_: 22, size: 8},
-	{as: AADD, a1: C_LCON, a2: C_REG, a6: C_REG, type_: 22, size: 12},
-	{as: AADD, a1: C_LCON, a6: C_REG, type_: 22, size: 12},
 	{as: AADDIS, a1: C_ADDCON, a2: C_REG, a6: C_REG, type_: 20, size: 4},
 	{as: AADDIS, a1: C_ADDCON, a6: C_REG, type_: 20, size: 4},
 	{as: AADDC, a1: C_REG, a2: C_REG, a6: C_REG, type_: 2, size: 4},
@@ -211,64 +216,42 @@
 	{as: AMOVHBR, a1: C_REG, a6: C_XOREG, type_: 44, size: 4},
 	{as: AMOVHBR, a1: C_XOREG, a6: C_REG, type_: 45, size: 4},
 
-	{as: AMOVB, a1: C_ADDR, a6: C_REG, type_: 75, size: 12},
-	{as: AMOVB, a1: C_LOREG, a6: C_REG, type_: 36, size: 12},
 	{as: AMOVB, a1: C_SOREG, a6: C_REG, type_: 8, size: 8},
 	{as: AMOVB, a1: C_XOREG, a6: C_REG, type_: 109, size: 8},
-	{as: AMOVB, a1: C_REG, a6: C_ADDR, type_: 74, size: 8},
 	{as: AMOVB, a1: C_REG, a6: C_SOREG, type_: 7, size: 4},
-	{as: AMOVB, a1: C_REG, a6: C_LOREG, type_: 35, size: 8},
 	{as: AMOVB, a1: C_REG, a6: C_XOREG, type_: 108, size: 4},
 	{as: AMOVB, a1: C_REG, a6: C_REG, type_: 13, size: 4},
 
-	{as: AMOVBZ, a1: C_ADDR, a6: C_REG, type_: 75, size: 8},
-	{as: AMOVBZ, a1: C_LOREG, a6: C_REG, type_: 36, size: 8},
 	{as: AMOVBZ, a1: C_SOREG, a6: C_REG, type_: 8, size: 4},
 	{as: AMOVBZ, a1: C_XOREG, a6: C_REG, type_: 109, size: 4},
-	{as: AMOVBZ, a1: C_REG, a6: C_ADDR, type_: 74, size: 8},
 	{as: AMOVBZ, a1: C_REG, a6: C_SOREG, type_: 7, size: 4},
-	{as: AMOVBZ, a1: C_REG, a6: C_LOREG, type_: 35, size: 8},
 	{as: AMOVBZ, a1: C_REG, a6: C_XOREG, type_: 108, size: 4},
 	{as: AMOVBZ, a1: C_REG, a6: C_REG, type_: 13, size: 4},
 
 	{as: AMOVD, a1: C_ADDCON, a6: C_REG, type_: 3, size: 4},
 	{as: AMOVD, a1: C_ANDCON, a6: C_REG, type_: 3, size: 4},
 	{as: AMOVD, a1: C_UCON, a6: C_REG, type_: 3, size: 4},
-	{as: AMOVD, a1: C_LCON, a6: C_REG, type_: 19, size: 8},
 	{as: AMOVD, a1: C_SACON, a6: C_REG, type_: 3, size: 4},
-	{as: AMOVD, a1: C_LACON, a6: C_REG, type_: 26, size: 8},
-	{as: AMOVD, a1: C_ADDR, a6: C_REG, type_: 75, size: 8},
 	{as: AMOVD, a1: C_SOREG, a6: C_REG, type_: 8, size: 4},
 	{as: AMOVD, a1: C_XOREG, a6: C_REG, type_: 109, size: 4},
 	{as: AMOVD, a1: C_SOREG, a6: C_SPR, type_: 107, size: 8},
-	{as: AMOVD, a1: C_LOREG, a6: C_REG, type_: 36, size: 8},
-	{as: AMOVD, a1: C_TLS_LE, a6: C_REG, type_: 79, size: 8},
-	{as: AMOVD, a1: C_TLS_IE, a6: C_REG, type_: 80, size: 12},
 	{as: AMOVD, a1: C_SPR, a6: C_REG, type_: 66, size: 4},
-	{as: AMOVD, a1: C_REG, a6: C_ADDR, type_: 74, size: 8},
 	{as: AMOVD, a1: C_REG, a6: C_SOREG, type_: 7, size: 4},
 	{as: AMOVD, a1: C_REG, a6: C_XOREG, type_: 108, size: 4},
 	{as: AMOVD, a1: C_SPR, a6: C_SOREG, type_: 106, size: 8},
-	{as: AMOVD, a1: C_REG, a6: C_LOREG, type_: 35, size: 8},
 	{as: AMOVD, a1: C_REG, a6: C_SPR, type_: 66, size: 4},
 	{as: AMOVD, a1: C_REG, a6: C_REG, type_: 13, size: 4},
 
 	{as: AMOVW, a1: C_ADDCON, a6: C_REG, type_: 3, size: 4},
 	{as: AMOVW, a1: C_ANDCON, a6: C_REG, type_: 3, size: 4},
 	{as: AMOVW, a1: C_UCON, a6: C_REG, type_: 3, size: 4},
-	{as: AMOVW, a1: C_LCON, a6: C_REG, type_: 19, size: 8},
 	{as: AMOVW, a1: C_SACON, a6: C_REG, type_: 3, size: 4},
-	{as: AMOVW, a1: C_LACON, a6: C_REG, type_: 26, size: 8},
-	{as: AMOVW, a1: C_ADDR, a6: C_REG, type_: 75, size: 8},
 	{as: AMOVW, a1: C_CREG, a6: C_REG, type_: 68, size: 4},
 	{as: AMOVW, a1: C_SOREG, a6: C_REG, type_: 8, size: 4},
-	{as: AMOVW, a1: C_LOREG, a6: C_REG, type_: 36, size: 8},
 	{as: AMOVW, a1: C_XOREG, a6: C_REG, type_: 109, size: 4},
 	{as: AMOVW, a1: C_SPR, a6: C_REG, type_: 66, size: 4},
-	{as: AMOVW, a1: C_REG, a6: C_ADDR, type_: 74, size: 8},
 	{as: AMOVW, a1: C_REG, a6: C_CREG, type_: 69, size: 4},
 	{as: AMOVW, a1: C_REG, a6: C_SOREG, type_: 7, size: 4},
-	{as: AMOVW, a1: C_REG, a6: C_LOREG, type_: 35, size: 8},
 	{as: AMOVW, a1: C_REG, a6: C_XOREG, type_: 108, size: 4},
 	{as: AMOVW, a1: C_REG, a6: C_SPR, type_: 66, size: 4},
 	{as: AMOVW, a1: C_REG, a6: C_REG, type_: 13, size: 4},
@@ -276,14 +259,10 @@
 	{as: AFMOVD, a1: C_ADDCON, a6: C_FREG, type_: 24, size: 8},
 	{as: AFMOVD, a1: C_SOREG, a6: C_FREG, type_: 8, size: 4},
 	{as: AFMOVD, a1: C_XOREG, a6: C_FREG, type_: 109, size: 4},
-	{as: AFMOVD, a1: C_LOREG, a6: C_FREG, type_: 36, size: 8},
 	{as: AFMOVD, a1: C_ZCON, a6: C_FREG, type_: 24, size: 4},
-	{as: AFMOVD, a1: C_ADDR, a6: C_FREG, type_: 75, size: 8},
 	{as: AFMOVD, a1: C_FREG, a6: C_FREG, type_: 33, size: 4},
 	{as: AFMOVD, a1: C_FREG, a6: C_SOREG, type_: 7, size: 4},
 	{as: AFMOVD, a1: C_FREG, a6: C_XOREG, type_: 108, size: 4},
-	{as: AFMOVD, a1: C_FREG, a6: C_LOREG, type_: 35, size: 8},
-	{as: AFMOVD, a1: C_FREG, a6: C_ADDR, type_: 74, size: 8},
 
 	{as: AFMOVSX, a1: C_XOREG, a6: C_FREG, type_: 45, size: 4},
 	{as: AFMOVSX, a1: C_FREG, a6: C_XOREG, type_: 44, size: 4},
@@ -346,6 +325,10 @@
 	{as: AADDEX, a1: C_REG, a2: C_REG, a3: C_SCON, a6: C_REG, type_: 94, size: 4}, /* add extended using alternate carry, z23-form */
 	{as: ACRAND, a1: C_CRBIT, a2: C_CRBIT, a6: C_CRBIT, type_: 2, size: 4},        /* logical ops for condition register bits xl-form */
 
+	/* Misc ISA 3.0 instructions */
+	{as: ASETB, a1: C_CREG, a6: C_REG, type_: 110, size: 4},
+	{as: AVCLZLSBB, a1: C_VREG, a6: C_REG, type_: 85, size: 4},
+
 	/* Vector instructions */
 
 	/* Vector load */
@@ -535,46 +518,84 @@
 	{as: obj.APCALIGN, a1: C_LCON, type_: 0, size: 0},   // align code
 }
 
+// These are opcodes above which may generate different sequences depending on whether prefix opcode support
+// is available
+type PrefixableOptab struct {
+	Optab
+	minGOPPC64 int  // Minimum GOPPC64 required to support this.
+	pfxsize    int8 // Instruction sequence size when prefixed opcodes are used
+}
+
+// The prefixable optab entry contains the pseudo-opcodes which generate relocations, or may generate
+// a more efficient sequence of instructions if a prefixed version exists (ex. paddi instead of oris/ori/add).
+//
+// This table is meant to transform all sequences which might be TOC-relative into an equivalent PC-relative
+// sequence. It also encompasses several transformations which do not involve relocations, those could be
+// separated and applied to AIX and other non-ELF targets. Likewise, the prefixed forms do not have encoding
+// restrictions on the offset, so they are also used for static binary to allow better code generation. e.x
+//
+//	MOVD something-byte-aligned(Rx), Ry
+//	MOVD 3(Rx), Ry
+//
+// is allowed when the prefixed forms are used.
+//
+// This requires an ISA 3.1 compatible cpu (e.g Power10), and when linking externally an ELFv2 1.5 compliant.
+var prefixableOptab = []PrefixableOptab{
+	{Optab: Optab{as: AMOVD, a1: C_LCON, a6: C_REG, type_: 19, size: 8}, minGOPPC64: 10, pfxsize: 8},
+	{Optab: Optab{as: AMOVD, a1: C_ADDR, a6: C_REG, type_: 75, size: 8}, minGOPPC64: 10, pfxsize: 8},
+	{Optab: Optab{as: AMOVD, a1: C_TLS_LE, a6: C_REG, type_: 79, size: 8}, minGOPPC64: 10, pfxsize: 8},
+	{Optab: Optab{as: AMOVD, a1: C_TLS_IE, a6: C_REG, type_: 80, size: 12}, minGOPPC64: 10, pfxsize: 12},
+	{Optab: Optab{as: AMOVD, a1: C_LACON, a6: C_REG, type_: 26, size: 8}, minGOPPC64: 10, pfxsize: 8},
+	{Optab: Optab{as: AMOVD, a1: C_LOREG, a6: C_REG, type_: 36, size: 8}, minGOPPC64: 10, pfxsize: 8},
+	{Optab: Optab{as: AMOVD, a1: C_REG, a6: C_LOREG, type_: 35, size: 8}, minGOPPC64: 10, pfxsize: 8},
+	{Optab: Optab{as: AMOVD, a1: C_REG, a6: C_ADDR, type_: 74, size: 8}, minGOPPC64: 10, pfxsize: 8},
+
+	{Optab: Optab{as: AMOVW, a1: C_LCON, a6: C_REG, type_: 19, size: 8}, minGOPPC64: 10, pfxsize: 8},
+	{Optab: Optab{as: AMOVW, a1: C_LACON, a6: C_REG, type_: 26, size: 8}, minGOPPC64: 10, pfxsize: 8},
+	{Optab: Optab{as: AMOVW, a1: C_LOREG, a6: C_REG, type_: 36, size: 8}, minGOPPC64: 10, pfxsize: 8},
+	{Optab: Optab{as: AMOVW, a1: C_ADDR, a6: C_REG, type_: 75, size: 8}, minGOPPC64: 10, pfxsize: 8},
+	{Optab: Optab{as: AMOVW, a1: C_REG, a6: C_LOREG, type_: 35, size: 8}, minGOPPC64: 10, pfxsize: 8},
+	{Optab: Optab{as: AMOVW, a1: C_REG, a6: C_ADDR, type_: 74, size: 8}, minGOPPC64: 10, pfxsize: 8},
+
+	{Optab: Optab{as: AMOVB, a1: C_REG, a6: C_LOREG, type_: 35, size: 8}, minGOPPC64: 10, pfxsize: 8},
+	{Optab: Optab{as: AMOVB, a1: C_LOREG, a6: C_REG, type_: 36, size: 12}, minGOPPC64: 10, pfxsize: 12},
+	{Optab: Optab{as: AMOVB, a1: C_ADDR, a6: C_REG, type_: 75, size: 12}, minGOPPC64: 10, pfxsize: 12},
+	{Optab: Optab{as: AMOVB, a1: C_REG, a6: C_ADDR, type_: 74, size: 8}, minGOPPC64: 10, pfxsize: 8},
+
+	{Optab: Optab{as: AMOVBZ, a1: C_LOREG, a6: C_REG, type_: 36, size: 8}, minGOPPC64: 10, pfxsize: 8},
+	{Optab: Optab{as: AMOVBZ, a1: C_ADDR, a6: C_REG, type_: 75, size: 8}, minGOPPC64: 10, pfxsize: 8},
+	{Optab: Optab{as: AMOVBZ, a1: C_REG, a6: C_LOREG, type_: 35, size: 8}, minGOPPC64: 10, pfxsize: 8},
+	{Optab: Optab{as: AMOVBZ, a1: C_REG, a6: C_ADDR, type_: 74, size: 8}, minGOPPC64: 10, pfxsize: 8},
+
+	{Optab: Optab{as: AFMOVD, a1: C_LOREG, a6: C_FREG, type_: 36, size: 8}, minGOPPC64: 10, pfxsize: 8},
+	{Optab: Optab{as: AFMOVD, a1: C_ADDR, a6: C_FREG, type_: 75, size: 8}, minGOPPC64: 10, pfxsize: 8},
+	{Optab: Optab{as: AFMOVD, a1: C_FREG, a6: C_LOREG, type_: 35, size: 8}, minGOPPC64: 10, pfxsize: 8},
+	{Optab: Optab{as: AFMOVD, a1: C_FREG, a6: C_ADDR, type_: 74, size: 8}, minGOPPC64: 10, pfxsize: 8},
+
+	{Optab: Optab{as: AADD, a1: C_LCON, a2: C_REG, a6: C_REG, type_: 22, size: 12}, minGOPPC64: 10, pfxsize: 8},
+	{Optab: Optab{as: AADD, a1: C_LCON, a6: C_REG, type_: 22, size: 12}, minGOPPC64: 10, pfxsize: 8},
+}
+
 var oprange [ALAST & obj.AMask][]Optab
 
 var xcmp [C_NCLASS][C_NCLASS]bool
 
+var pfxEnabled = false // ISA 3.1 prefixed instructions are supported.
+var buildOpCfg = ""    // Save the os/cpu/arch tuple used to configure the assembler in buildop
+
 // padding bytes to add to align code as requested.
 func addpad(pc, a int64, ctxt *obj.Link, cursym *obj.LSym) int {
-	// For 16 and 32 byte alignment, there is a tradeoff
-	// between aligning the code and adding too many NOPs.
 	switch a {
-	case 8:
-		if pc&7 != 0 {
-			return 4
+	case 8, 16, 32, 64:
+		// By default function alignment is 16. If an alignment > 16 is
+		// requested then the function alignment must also be promoted.
+		// The function alignment is not promoted on AIX at this time.
+		// TODO: Investigate AIX function alignment.
+		if ctxt.Headtype != objabi.Haix && cursym.Func().Align < int32(a) {
+			cursym.Func().Align = int32(a)
 		}
-	case 16:
-		// Align to 16 bytes if possible but add at
-		// most 2 NOPs.
-		switch pc & 15 {
-		case 4, 12:
-			return 4
-		case 8:
-			return 8
-		}
-	case 32:
-		// Align to 32 bytes if possible but add at
-		// most 3 NOPs.
-		switch pc & 31 {
-		case 4, 20:
-			return 12
-		case 8, 24:
-			return 8
-		case 12, 28:
-			return 4
-		}
-		// When 32 byte alignment is requested on Linux,
-		// promote the function's alignment to 32. On AIX
-		// the function alignment is not changed which might
-		// result in 16 byte alignment but that is still fine.
-		// TODO: alignment on AIX
-		if ctxt.Headtype != objabi.Haix && cursym.Func().Align < 32 {
-			cursym.Func().Align = 32
+		if pc&(a-1) != 0 {
+			return int(a - (pc & (a - 1)))
 		}
 	default:
 		ctxt.Diag("Unexpected alignment: %d for PCALIGN directive\n", a)
@@ -582,7 +603,7 @@
 	return 0
 }
 
-// Get the implied register of a operand which doesn't specify one.  These show up
+// Get the implied register of an operand which doesn't specify one.  These show up
 // in handwritten asm like "MOVD R5, foosymbol" where a base register is not supplied,
 // or "MOVD R5, foo+10(SP) or pseudo-register is used.  The other common case is when
 // generating constants in register like "MOVD $constant, Rx".
@@ -1050,7 +1071,7 @@
 		}
 
 	case obj.TYPE_BRANCH:
-		if a.Sym != nil && c.ctxt.Flag_dynlink {
+		if a.Sym != nil && c.ctxt.Flag_dynlink && !pfxEnabled {
 			return C_LBRAPIC
 		}
 		return C_SBRA
@@ -1254,14 +1275,41 @@
 	oprange[a&obj.AMask] = oprange[b0]
 }
 
+// Determine if the build configuration requires a TOC pointer.
+// It is assumed this always called after buildop.
+func NeedTOCpointer(ctxt *obj.Link) bool {
+	return !pfxEnabled && ctxt.Flag_shared
+}
+
 // Build the opcode table
 func buildop(ctxt *obj.Link) {
-	if oprange[AANDN&obj.AMask] != nil {
-		// Already initialized; stop now.
+	// Limit PC-relative prefix instruction usage to supported and tested targets.
+	pfxEnabled = buildcfg.GOPPC64 >= 10 && buildcfg.GOOS == "linux"
+	cfg := fmt.Sprintf("power%d/%s/%s", buildcfg.GOPPC64, buildcfg.GOARCH, buildcfg.GOOS)
+	if cfg == buildOpCfg {
+		// Already initialized to correct OS/cpu; stop now.
 		// This happens in the cmd/asm tests,
 		// each of which re-initializes the arch.
 		return
 	}
+	buildOpCfg = cfg
+
+	// Configure the optab entries which may generate prefix opcodes.
+	prefixOptab := make([]Optab, 0, len(prefixableOptab))
+	for _, entry := range prefixableOptab {
+		entry := entry
+		if pfxEnabled && buildcfg.GOPPC64 >= entry.minGOPPC64 {
+			// Enable prefix opcode generation and resize.
+			entry.ispfx = true
+			entry.size = entry.pfxsize
+		}
+		// Use the legacy assembler function if none provided.
+		if entry.asmout == nil {
+			entry.asmout = asmout
+		}
+		prefixOptab = append(prefixOptab, entry.Optab)
+
+	}
 
 	for i := 0; i < C_NCLASS; i++ {
 		for n := 0; n < C_NCLASS; n++ {
@@ -1278,7 +1326,9 @@
 	}
 	// Append the generated entries, sort, and fill out oprange.
 	optab = append(optab, optabGen...)
+	optab = append(optab, prefixOptab...)
 	sort.Slice(optab, optabLess)
+
 	for i := 0; i < len(optab); {
 		r := optab[i].as
 		r0 := r & obj.AMask
@@ -2022,6 +2072,9 @@
 		case AMOVW: /* load/store/move word with sign extension; move 32-bit literals  */
 			opset(AMOVWZ, r0) /* Same as above, but zero extended */
 
+		case AVCLZLSBB:
+			opset(AVCTZLSBB, r0)
+
 		case AADD,
 			AADDIS,
 			AANDCC, /* and. Rb,Rs,Ra; andi. $uimm,Rs,Ra */
@@ -2047,6 +2100,7 @@
 			AMTVSRDD,
 			APNOP,
 			AISEL,
+			ASETB,
 			obj.ANOP,
 			obj.ATEXT,
 			obj.AUNDEF,
@@ -2227,6 +2281,13 @@
 	return op | (t&31)<<21 | (a&31)<<16 | (b&31)<<11 | (bc&0x1F)<<6
 }
 
+func AOP_PFX_00_8LS(r, ie uint32) uint32 {
+	return 1<<26 | 0<<24 | 0<<23 | (r&1)<<20 | (ie & 0x3FFFF)
+}
+func AOP_PFX_10_MLS(r, ie uint32) uint32 {
+	return 1<<26 | 2<<24 | 0<<23 | (r&1)<<20 | (ie & 0x3FFFF)
+}
+
 const (
 	/* each rhs is OPVCC(_, _, _, _) */
 	OP_ADD      = 31<<26 | 266<<1 | 0<<10 | 0
@@ -2264,8 +2325,55 @@
 	OP_RLDICL   = 30<<26 | 0<<1 | 0<<10 | 0
 	OP_RLDCL    = 30<<26 | 8<<1 | 0<<10 | 0
 	OP_EXTSWSLI = 31<<26 | 445<<2
+	OP_SETB     = 31<<26 | 128<<1
 )
 
+func pfxadd(rt, ra int16, r uint32, imm32 int64) (uint32, uint32) {
+	return AOP_PFX_10_MLS(r, uint32(imm32>>16)), AOP_IRR(14<<26, uint32(rt), uint32(ra), uint32(imm32))
+}
+
+func pfxload(a obj.As, reg int16, base int16, r uint32) (uint32, uint32) {
+	switch a {
+	case AMOVH:
+		return AOP_PFX_10_MLS(r, 0), AOP_IRR(42<<26, uint32(reg), uint32(base), 0)
+	case AMOVW:
+		return AOP_PFX_00_8LS(r, 0), AOP_IRR(41<<26, uint32(reg), uint32(base), 0)
+	case AMOVD:
+		return AOP_PFX_00_8LS(r, 0), AOP_IRR(57<<26, uint32(reg), uint32(base), 0)
+	case AMOVBZ, AMOVB:
+		return AOP_PFX_10_MLS(r, 0), AOP_IRR(34<<26, uint32(reg), uint32(base), 0)
+	case AMOVHZ:
+		return AOP_PFX_10_MLS(r, 0), AOP_IRR(40<<26, uint32(reg), uint32(base), 0)
+	case AMOVWZ:
+		return AOP_PFX_10_MLS(r, 0), AOP_IRR(32<<26, uint32(reg), uint32(base), 0)
+	case AFMOVS:
+		return AOP_PFX_10_MLS(r, 0), AOP_IRR(48<<26, uint32(reg), uint32(base), 0)
+	case AFMOVD:
+		return AOP_PFX_10_MLS(r, 0), AOP_IRR(50<<26, uint32(reg), uint32(base), 0)
+	}
+	log.Fatalf("Error no pfxload for %v\n", a)
+	return 0, 0
+}
+
+func pfxstore(a obj.As, reg int16, base int16, r uint32) (uint32, uint32) {
+	switch a {
+	case AMOVD:
+		return AOP_PFX_00_8LS(r, 0), AOP_IRR(61<<26, uint32(reg), uint32(base), 0)
+	case AMOVBZ, AMOVB:
+		return AOP_PFX_10_MLS(r, 0), AOP_IRR(38<<26, uint32(reg), uint32(base), 0)
+	case AMOVHZ, AMOVH:
+		return AOP_PFX_10_MLS(r, 0), AOP_IRR(44<<26, uint32(reg), uint32(base), 0)
+	case AMOVWZ, AMOVW:
+		return AOP_PFX_10_MLS(r, 0), AOP_IRR(36<<26, uint32(reg), uint32(base), 0)
+	case AFMOVS:
+		return AOP_PFX_10_MLS(r, 0), AOP_IRR(52<<26, uint32(reg), uint32(base), 0)
+	case AFMOVD:
+		return AOP_PFX_10_MLS(r, 0), AOP_IRR(54<<26, uint32(reg), uint32(base), 0)
+	}
+	log.Fatalf("Error no pfxstore for %v\n", a)
+	return 0, 0
+}
+
 func oclass(a *obj.Addr) int {
 	return int(a.Class) - 1
 }
@@ -2324,7 +2432,7 @@
 
 // Encode instructions and create relocation for accessing s+d according to the
 // instruction op with source or destination (as appropriate) register reg.
-func (c *ctxt9) symbolAccess(s *obj.LSym, d int64, reg int16, op uint32, reuse bool) (o1, o2 uint32) {
+func (c *ctxt9) symbolAccess(s *obj.LSym, d int64, reg int16, op uint32, reuse bool) (o1, o2 uint32, rel *obj.Reloc) {
 	if c.ctxt.Headtype == objabi.Haix {
 		// Every symbol access must be made via a TOC anchor.
 		c.ctxt.Diag("symbolAccess called for %s", s.Name)
@@ -2345,7 +2453,7 @@
 		o1 = AOP_IRR(OP_ADDIS, uint32(reg), base, 0)
 		o2 = AOP_IRR(op, uint32(reg), uint32(reg), 0)
 	}
-	rel := obj.Addrel(c.cursym)
+	rel = obj.Addrel(c.cursym)
 	rel.Off = int32(c.pc)
 	rel.Siz = 8
 	rel.Sym = s
@@ -2841,8 +2949,12 @@
 
 	case 19: /* mov $lcon,r ==> cau+or */
 		d := c.vregoff(&p.From)
-		o1 = loadu32(int(p.To.Reg), d)
-		o2 = LOP_IRR(OP_ORI, uint32(p.To.Reg), uint32(p.To.Reg), uint32(int32(d)))
+		if o.ispfx {
+			o1, o2 = pfxadd(p.To.Reg, REG_R0, PFX_R_ABS, d)
+		} else {
+			o1 = loadu32(int(p.To.Reg), d)
+			o2 = LOP_IRR(OP_ORI, uint32(p.To.Reg), uint32(p.To.Reg), uint32(int32(d)))
+		}
 
 	case 20: /* add $ucon,,r | addis $addcon,r,r */
 		v := c.regoff(&p.From)
@@ -2883,6 +2995,10 @@
 			o3 = AOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), REGTMP, uint32(r))
 		}
 
+		if o.ispfx {
+			o1, o2 = pfxadd(int16(p.To.Reg), int16(r), PFX_R_ABS, d)
+		}
+
 	case 23: /* and $lcon/$addcon,r1,r2 ==> oris+ori+and/addi+and */
 		if p.To.Reg == REGTMP || p.Reg == REGTMP {
 			c.ctxt.Diag("can't synthesize large constant\n%v", p)
@@ -2962,11 +3078,12 @@
 	case 26: /* mov $lsext/auto/oreg,,r2 ==> addis+addi */
 		v := c.vregoff(&p.From)
 		r := int(p.From.Reg)
+		var rel *obj.Reloc
 
 		switch p.From.Name {
 		case obj.NAME_EXTERN, obj.NAME_STATIC:
 			// Load a 32 bit constant, or relocation depending on if a symbol is attached
-			o1, o2 = c.symbolAccess(p.From.Sym, v, p.To.Reg, OP_ADDI, true)
+			o1, o2, rel = c.symbolAccess(p.From.Sym, v, p.To.Reg, OP_ADDI, true)
 		default:
 			if r == 0 {
 				r = c.getimpliedreg(&p.From, p)
@@ -2976,6 +3093,15 @@
 			o2 = AOP_IRR(OP_ADDI, uint32(p.To.Reg), uint32(p.To.Reg), uint32(v))
 		}
 
+		if o.ispfx {
+			if rel == nil {
+				o1, o2 = pfxadd(int16(p.To.Reg), int16(r), PFX_R_ABS, v)
+			} else {
+				o1, o2 = pfxadd(int16(p.To.Reg), REG_R0, PFX_R_PCREL, 0)
+				rel.Type = objabi.R_ADDRPOWER_PCREL34
+			}
+		}
+
 	case 27: /* subc ra,$simm,rd => subfic rd,ra,$simm */
 		v := c.regoff(p.GetFrom3())
 
@@ -3118,12 +3244,18 @@
 			r = c.getimpliedreg(&p.To, p)
 		}
 		// Offsets in DS form stores must be a multiple of 4
-		inst := c.opstore(p.As)
-		if c.opform(inst) == DS_FORM && v&0x3 != 0 {
-			log.Fatalf("invalid offset for DS form load/store %v", p)
+		if o.ispfx {
+			o1, o2 = pfxstore(p.As, p.From.Reg, int16(r), PFX_R_ABS)
+			o1 |= uint32((v >> 16) & 0x3FFFF)
+			o2 |= uint32(v & 0xFFFF)
+		} else {
+			inst := c.opstore(p.As)
+			if c.opform(inst) == DS_FORM && v&0x3 != 0 {
+				log.Fatalf("invalid offset for DS form load/store %v", p)
+			}
+			o1 = AOP_IRR(OP_ADDIS, REGTMP, uint32(r), uint32(high16adjusted(v)))
+			o2 = AOP_IRR(inst, uint32(p.From.Reg), REGTMP, uint32(v))
 		}
-		o1 = AOP_IRR(OP_ADDIS, REGTMP, uint32(r), uint32(high16adjusted(v)))
-		o2 = AOP_IRR(inst, uint32(p.From.Reg), REGTMP, uint32(v))
 
 	case 36: /* mov b/bz/h/hz lext/lauto/lreg,r ==> lbz+extsb/lbz/lha/lhz etc */
 		v := c.regoff(&p.From)
@@ -3132,8 +3264,22 @@
 		if r == 0 {
 			r = c.getimpliedreg(&p.From, p)
 		}
-		o1 = AOP_IRR(OP_ADDIS, uint32(p.To.Reg), uint32(r), uint32(high16adjusted(v)))
-		o2 = AOP_IRR(c.opload(p.As), uint32(p.To.Reg), uint32(p.To.Reg), uint32(v))
+
+		if o.ispfx {
+			o1, o2 = pfxload(p.As, p.To.Reg, int16(r), PFX_R_ABS)
+			o1 |= uint32((v >> 16) & 0x3FFFF)
+			o2 |= uint32(v & 0xFFFF)
+		} else {
+			if o.a6 == C_REG {
+				// Reuse the base register when loading a GPR (C_REG) to avoid
+				// using REGTMP (R31) when possible.
+				o1 = AOP_IRR(OP_ADDIS, uint32(p.To.Reg), uint32(r), uint32(high16adjusted(v)))
+				o2 = AOP_IRR(c.opload(p.As), uint32(p.To.Reg), uint32(p.To.Reg), uint32(v))
+			} else {
+				o1 = AOP_IRR(OP_ADDIS, uint32(REGTMP), uint32(r), uint32(high16adjusted(v)))
+				o2 = AOP_IRR(c.opload(p.As), uint32(p.To.Reg), uint32(REGTMP), uint32(v))
+			}
+		}
 
 		// Sign extend MOVB if needed
 		o3 = LOP_RRR(OP_EXTSB, uint32(p.To.Reg), uint32(p.To.Reg), 0)
@@ -3484,23 +3630,28 @@
 
 	/* relocation operations */
 	case 74:
+		var rel *obj.Reloc
 		v := c.vregoff(&p.To)
 		// Offsets in DS form stores must be a multiple of 4
 		inst := c.opstore(p.As)
-		if c.opform(inst) == DS_FORM && v&0x3 != 0 {
+
+		// Can't reuse base for store instructions.
+		o1, o2, rel = c.symbolAccess(p.To.Sym, v, p.From.Reg, inst, false)
+
+		// Rewrite as a prefixed store if supported.
+		if o.ispfx {
+			o1, o2 = pfxstore(p.As, p.From.Reg, REG_R0, PFX_R_PCREL)
+			rel.Type = objabi.R_ADDRPOWER_PCREL34
+		} else if c.opform(inst) == DS_FORM && v&0x3 != 0 {
 			log.Fatalf("invalid offset for DS form load/store %v", p)
 		}
-		// Can't reuse base for store instructions.
-		o1, o2 = c.symbolAccess(p.To.Sym, v, p.From.Reg, inst, false)
 
 	case 75: // 32 bit offset symbol loads (got/toc/addr)
+		var rel *obj.Reloc
 		v := p.From.Offset
 
 		// Offsets in DS form loads must be a multiple of 4
 		inst := c.opload(p.As)
-		if c.opform(inst) == DS_FORM && v&0x3 != 0 {
-			log.Fatalf("invalid offset for DS form load/store %v", p)
-		}
 		switch p.From.Name {
 		case obj.NAME_GOTREF, obj.NAME_TOCREF:
 			if v != 0 {
@@ -3508,7 +3659,7 @@
 			}
 			o1 = AOP_IRR(OP_ADDIS, uint32(p.To.Reg), REG_R2, 0)
 			o2 = AOP_IRR(inst, uint32(p.To.Reg), uint32(p.To.Reg), 0)
-			rel := obj.Addrel(c.cursym)
+			rel = obj.Addrel(c.cursym)
 			rel.Off = int32(c.pc)
 			rel.Siz = 8
 			rel.Sym = p.From.Sym
@@ -3519,9 +3670,30 @@
 				rel.Type = objabi.R_ADDRPOWER_TOCREL_DS
 			}
 		default:
-			reuseBaseReg := p.As != AFMOVD && p.As != AFMOVS
-			// Reuse To.Reg as base register if not FP move.
-			o1, o2 = c.symbolAccess(p.From.Sym, v, p.To.Reg, inst, reuseBaseReg)
+			reuseBaseReg := o.a6 == C_REG
+			// Reuse To.Reg as base register if it is a GPR.
+			o1, o2, rel = c.symbolAccess(p.From.Sym, v, p.To.Reg, inst, reuseBaseReg)
+		}
+
+		// Convert to prefixed forms if supported.
+		if o.ispfx {
+			switch rel.Type {
+			case objabi.R_ADDRPOWER, objabi.R_ADDRPOWER_DS,
+				objabi.R_ADDRPOWER_TOCREL, objabi.R_ADDRPOWER_TOCREL_DS:
+				o1, o2 = pfxload(p.As, p.To.Reg, REG_R0, PFX_R_PCREL)
+				rel.Type = objabi.R_ADDRPOWER_PCREL34
+			case objabi.R_POWER_TLS_IE:
+				o1, o2 = pfxload(p.As, p.To.Reg, REG_R0, PFX_R_PCREL)
+				rel.Type = objabi.R_POWER_TLS_IE_PCREL34
+			case objabi.R_ADDRPOWER_GOT:
+				o1, o2 = pfxload(p.As, p.To.Reg, REG_R0, PFX_R_PCREL)
+				rel.Type = objabi.R_ADDRPOWER_GOT_PCREL34
+			default:
+				// We've failed to convert a TOC-relative relocation to a PC-relative one.
+				log.Fatalf("Unable convert TOC-relative relocation %v to PC-relative", rel.Type)
+			}
+		} else if c.opform(inst) == DS_FORM && v&0x3 != 0 {
+			log.Fatalf("invalid offset for DS form load/store %v", p)
 		}
 
 		o3 = LOP_RRR(OP_EXTSB, uint32(p.To.Reg), uint32(p.To.Reg), 0)
@@ -3530,26 +3702,36 @@
 		if p.From.Offset != 0 {
 			c.ctxt.Diag("invalid offset against tls var %v", p)
 		}
-		o1 = AOP_IRR(OP_ADDIS, uint32(p.To.Reg), REG_R13, 0)
-		o2 = AOP_IRR(OP_ADDI, uint32(p.To.Reg), uint32(p.To.Reg), 0)
 		rel := obj.Addrel(c.cursym)
 		rel.Off = int32(c.pc)
 		rel.Siz = 8
 		rel.Sym = p.From.Sym
-		rel.Type = objabi.R_POWER_TLS_LE
+		if !o.ispfx {
+			o1 = AOP_IRR(OP_ADDIS, uint32(p.To.Reg), REG_R13, 0)
+			o2 = AOP_IRR(OP_ADDI, uint32(p.To.Reg), uint32(p.To.Reg), 0)
+			rel.Type = objabi.R_POWER_TLS_LE
+		} else {
+			o1, o2 = pfxadd(p.To.Reg, REG_R13, PFX_R_ABS, 0)
+			rel.Type = objabi.R_POWER_TLS_LE_TPREL34
+		}
 
 	case 80:
 		if p.From.Offset != 0 {
 			c.ctxt.Diag("invalid offset against tls var %v", p)
 		}
-		o1 = AOP_IRR(OP_ADDIS, uint32(p.To.Reg), REG_R2, 0)
-		o2 = AOP_IRR(c.opload(AMOVD), uint32(p.To.Reg), uint32(p.To.Reg), 0)
-		o3 = AOP_RRR(OP_ADD, uint32(p.To.Reg), uint32(p.To.Reg), REG_R13)
 		rel := obj.Addrel(c.cursym)
 		rel.Off = int32(c.pc)
 		rel.Siz = 8
 		rel.Sym = p.From.Sym
 		rel.Type = objabi.R_POWER_TLS_IE
+		if !o.ispfx {
+			o1 = AOP_IRR(OP_ADDIS, uint32(p.To.Reg), REG_R2, 0)
+			o2 = AOP_IRR(c.opload(AMOVD), uint32(p.To.Reg), uint32(p.To.Reg), 0)
+		} else {
+			o1, o2 = pfxload(p.As, p.To.Reg, REG_R0, PFX_R_PCREL)
+			rel.Type = objabi.R_POWER_TLS_IE_PCREL34
+		}
+		o3 = AOP_RRR(OP_ADD, uint32(p.To.Reg), uint32(p.To.Reg), REG_R13)
 		rel = obj.Addrel(c.cursym)
 		rel.Off = int32(c.pc) + 8
 		rel.Siz = 4
@@ -3787,6 +3969,11 @@
 		o1 = AOP_RRR(c.oploadx(p.As), uint32(p.To.Reg), uint32(p.From.Index), uint32(r))
 		// Sign extend MOVB operations. This is ignored for other cases (o.size == 4).
 		o2 = LOP_RRR(OP_EXTSB, uint32(p.To.Reg), uint32(p.To.Reg), 0)
+
+	case 110: /* SETB creg, rt */
+		bfa := uint32(p.From.Reg) << 2
+		rt := uint32(p.To.Reg)
+		o1 = LOP_RRR(OP_SETB, bfa, rt, 0)
 	}
 
 	out[0] = o1
@@ -4590,6 +4777,11 @@
 	case AVCLZD:
 		return OPVX(4, 1986, 0, 0) /* vclzd - v2.07 */
 
+	case AVCLZLSBB:
+		return OPVX(4, 1538, 0, 0) /* vclzlsbb - v3.0 */
+	case AVCTZLSBB:
+		return OPVX(4, 1538, 0, 0) | 1<<16 /* vctzlsbb - v3.0 */
+
 	case AVPOPCNTB:
 		return OPVX(4, 1795, 0, 0) /* vpopcntb - v2.07 */
 	case AVPOPCNTH:
diff --git a/src/cmd/internal/obj/ppc64/asm_test.go b/src/cmd/internal/obj/ppc64/asm_test.go
index 89fc9ba..b8995dc 100644
--- a/src/cmd/internal/obj/ppc64/asm_test.go
+++ b/src/cmd/internal/obj/ppc64/asm_test.go
@@ -28,7 +28,7 @@
 const invalidPCAlignSrc = `
 TEXT test(SB),0,$0-0
 ADD $2, R3
-PCALIGN $64
+PCALIGN $128
 RET
 `
 
diff --git a/src/cmd/internal/obj/ppc64/doc.go b/src/cmd/internal/obj/ppc64/doc.go
index 28340e4..da10ea3 100644
--- a/src/cmd/internal/obj/ppc64/doc.go
+++ b/src/cmd/internal/obj/ppc64/doc.go
@@ -187,8 +187,15 @@
 PCALIGN $16
 PCALIGN $8
 
-Functions in Go are aligned to 16 bytes, as is the case in all other compilers
-for PPC64.
+By default, functions in Go are aligned to 16 bytes, as is the case in all
+other compilers for PPC64. If there is a PCALIGN directive requesting alignment
+greater than 16, then the alignment of the containing function must be
+promoted to that same alignment or greater.
+
+The behavior of PCALIGN is changed in Go 1.21 to be more straightforward to
+ensure the alignment required for some instructions in power10. The acceptable
+values are 8, 16, 32 and 64, and the use of those values will always provide the
+specified alignment.
 
 6. Shift instructions
 
@@ -250,5 +257,34 @@
 	CRnGT represents CR bit 1 of CR field n. (0-7)
 	CRnEQ represents CR bit 2 of CR field n. (0-7)
 	CRnSO represents CR bit 3 of CR field n. (0-7)
+
+# GOPPC64 >= power10 and its effects on Go asm
+
+When GOPPC64=power10 is used to compile a Go program for ppc64le/linux, MOV*, FMOV*, and ADD
+opcodes which would require 2 or more machine instructions to emulate a 32 bit constant, or
+symbolic reference are implemented using prefixed instructions.
+
+A user who wishes granular control over the generated machine code is advised to use Go asm
+opcodes which explicitly translate to one PPC64 machine instruction. Most common opcodes
+are supported.
+
+Some examples of how pseudo-op assembly changes with GOPPC64:
+
+	Go asm                       GOPPC64 <= power9          GOPPC64 >= power10
+	MOVD mypackage·foo(SB), R3   addis r2, r3, ...          pld r3, ...
+	                             ld    r3, r3, ...
+
+	MOVD 131072(R3), R4          addis r31, r4, 2           pld r4, 131072(r3)
+	                             ld    r4, 0(R3)
+
+	ADD $131073, R3              lis  r31, 2                paddi r3, r3, 131073
+	                             addi r31, 1
+	                             add  r3,r31,r3
+
+	MOVD $131073, R3             lis  r3, 2                 pli r3, 131073
+	                             addi r3, 1
+
+	MOVD $mypackage·foo(SB), R3  addis r2, r3, ...          pla r3, ...
+	                             addi  r3, r3, ...
 */
 package ppc64
diff --git a/src/cmd/internal/obj/ppc64/obj9.go b/src/cmd/internal/obj/ppc64/obj9.go
index 47ad85e..02831b8 100644
--- a/src/cmd/internal/obj/ppc64/obj9.go
+++ b/src/cmd/internal/obj/ppc64/obj9.go
@@ -34,6 +34,7 @@
 	"cmd/internal/objabi"
 	"cmd/internal/src"
 	"cmd/internal/sys"
+	"internal/abi"
 	"log"
 )
 
@@ -632,7 +633,7 @@
 				autosize += int32(c.ctxt.Arch.FixedFrameSize)
 			}
 
-			if p.Mark&LEAF != 0 && autosize < objabi.StackSmall {
+			if p.Mark&LEAF != 0 && autosize < abi.StackSmall {
 				// A leaf function with a small stack can be marked
 				// NOSPLIT, avoiding a stack check.
 				p.From.Sym.Set(obj.AttrNoSplit, true)
@@ -642,8 +643,8 @@
 
 			q = p
 
-			if c.ctxt.Flag_shared && c.cursym.Name != "runtime.duffzero" && c.cursym.Name != "runtime.duffcopy" {
-				// When compiling Go into PIC, all functions must start
+			if NeedTOCpointer(c.ctxt) && c.cursym.Name != "runtime.duffzero" && c.cursym.Name != "runtime.duffcopy" {
+				// When compiling Go into PIC, without PCrel support, all functions must start
 				// with instructions to load the TOC pointer into r2:
 				//
 				//	addis r2, r12, .TOC.-func@ha
@@ -685,10 +686,7 @@
 				q = c.stacksplit(q, autosize) // emit split check
 			}
 
-			// Special handling of the racecall thunk. Assume that its asm code will
-			// save the link register and update the stack, since that code is
-			// called directly from C/C++ and can't clobber REGTMP (R31).
-			if autosize != 0 && c.cursym.Name != "runtime.racecallbackthunk" {
+			if autosize != 0 {
 				var prologueEnd *obj.Prog
 				// Save the link register and update the SP.  MOVDU is used unless
 				// the frame size is too large.  The link register must be saved
@@ -765,7 +763,7 @@
 				break
 			}
 
-			if c.ctxt.Flag_shared {
+			if NeedTOCpointer(c.ctxt) {
 				q = obj.Appendp(q, c.newprog)
 				q.As = AMOVD
 				q.Pos = p.Pos
@@ -875,7 +873,7 @@
 			retTarget := p.To.Sym
 
 			if c.cursym.Func().Text.Mark&LEAF != 0 {
-				if autosize == 0 || c.cursym.Name == "runtime.racecallbackthunk" {
+				if autosize == 0 {
 					p.As = ABR
 					p.From = obj.Addr{}
 					if retTarget == nil {
@@ -950,7 +948,7 @@
 				p = q
 			}
 			prev := p
-			if autosize != 0 && c.cursym.Name != "runtime.racecallbackthunk" {
+			if autosize != 0 {
 				q = c.newprog()
 				q.As = AADD
 				q.Pos = p.Pos
@@ -1007,8 +1005,8 @@
 
 		if p.To.Type == obj.TYPE_REG && p.To.Reg == REGSP && p.Spadj == 0 && p.As != ACMPU {
 			f := c.cursym.Func()
-			if f.FuncFlag&objabi.FuncFlag_SPWRITE == 0 {
-				c.cursym.Func().FuncFlag |= objabi.FuncFlag_SPWRITE
+			if f.FuncFlag&abi.FuncFlagSPWrite == 0 {
+				c.cursym.Func().FuncFlag |= abi.FuncFlagSPWrite
 				if ctxt.Debugvlog || !ctxt.IsAsm {
 					ctxt.Logf("auto-SPWRITE: %s %v\n", c.cursym.Name, p)
 					if !ctxt.IsAsm {
@@ -1180,7 +1178,7 @@
 	p = c.ctxt.StartUnsafePoint(p, c.newprog)
 
 	var q *obj.Prog
-	if framesize <= objabi.StackSmall {
+	if framesize <= abi.StackSmall {
 		// small stack: SP < stackguard
 		//	CMP	stackguard, SP
 		p = obj.Appendp(p, c.newprog)
@@ -1192,8 +1190,8 @@
 		p.To.Reg = REGSP
 	} else {
 		// large stack: SP-framesize < stackguard-StackSmall
-		offset := int64(framesize) - objabi.StackSmall
-		if framesize > objabi.StackBig {
+		offset := int64(framesize) - abi.StackSmall
+		if framesize > abi.StackBig {
 			// Such a large stack we need to protect against underflow.
 			// The runtime guarantees SP > objabi.StackBig, but
 			// framesize is large enough that SP-framesize may
@@ -1291,7 +1289,7 @@
 		morestacksym = c.ctxt.Lookup("runtime.morestack")
 	}
 
-	if c.ctxt.Flag_shared {
+	if NeedTOCpointer(c.ctxt) {
 		// In PPC64 PIC code, R2 is used as TOC pointer derived from R12
 		// which is the address of function entry point when entering
 		// the function. We need to preserve R2 across call to morestack.
@@ -1354,7 +1352,7 @@
 		p.To.Sym = morestacksym
 	}
 
-	if c.ctxt.Flag_shared {
+	if NeedTOCpointer(c.ctxt) {
 		// MOVD 8(SP), R2
 		p = obj.Appendp(p, c.newprog)
 		p.As = AMOVD
diff --git a/src/cmd/internal/obj/riscv/anames.go b/src/cmd/internal/obj/riscv/anames.go
index d2a3674..d2c4197 100644
--- a/src/cmd/internal/obj/riscv/anames.go
+++ b/src/cmd/internal/obj/riscv/anames.go
@@ -26,9 +26,6 @@
 	"SRL",
 	"SUB",
 	"SRA",
-	"SLLIRV32",
-	"SRLIRV32",
-	"SRAIRV32",
 	"JAL",
 	"JALR",
 	"BEQ",
@@ -47,8 +44,8 @@
 	"SH",
 	"SB",
 	"FENCE",
-	"FENCEI",
 	"FENCETSO",
+	"PAUSE",
 	"ADDIW",
 	"SLLIW",
 	"SRLIW",
@@ -201,8 +198,6 @@
 	"FSGNJQ",
 	"FSGNJNQ",
 	"FSGNJXQ",
-	"FMVXQ",
-	"FMVQX",
 	"FEQQ",
 	"FLEQ",
 	"FLTQ",
@@ -219,12 +214,9 @@
 	"SBREAK",
 	"MRET",
 	"SRET",
-	"URET",
 	"DRET",
 	"WFI",
 	"SFENCEVMA",
-	"HFENCEGVMA",
-	"HFENCEVVMA",
 	"WORD",
 	"BEQZ",
 	"BGEZ",
diff --git a/src/cmd/internal/obj/riscv/cpu.go b/src/cmd/internal/obj/riscv/cpu.go
index 594f8ea..dde1231 100644
--- a/src/cmd/internal/obj/riscv/cpu.go
+++ b/src/cmd/internal/obj/riscv/cpu.go
@@ -309,12 +309,6 @@
 	ASUB
 	ASRA
 
-	// The SLL/SRL/SRA instructions differ slightly between RV32 and RV64,
-	// hence there are pseudo-opcodes for the RV32 specific versions.
-	ASLLIRV32
-	ASRLIRV32
-	ASRAIRV32
-
 	// 2.5: Control Transfer Instructions
 	AJAL
 	AJALR
@@ -338,8 +332,8 @@
 
 	// 2.7: Memory Ordering Instructions
 	AFENCE
-	AFENCEI
 	AFENCETSO
+	APAUSE
 
 	// 5.2: Integer Computational Instructions (RV64I)
 	AADDIW
@@ -532,8 +526,6 @@
 	AFSGNJQ
 	AFSGNJNQ
 	AFSGNJXQ
-	AFMVXQ
-	AFMVQX
 
 	// 13.4 Quad-Precision Floating-Point Compare Instructions
 	AFEQQ
@@ -562,7 +554,6 @@
 	// 3.2.2: Trap-Return Instructions
 	AMRET
 	ASRET
-	AURET
 	ADRET
 
 	// 3.2.3: Wait for Interrupt
@@ -571,10 +562,6 @@
 	// 4.2.1: Supervisor Memory-Management Fence Instruction
 	ASFENCEVMA
 
-	// Hypervisor Memory-Management Instructions
-	AHFENCEGVMA
-	AHFENCEVVMA
-
 	// The escape hatch. Inserts a single 32-bit word.
 	AWORD
 
diff --git a/src/cmd/internal/obj/riscv/inst.go b/src/cmd/internal/obj/riscv/inst.go
index 891199e..6cb11cd 100644
--- a/src/cmd/internal/obj/riscv/inst.go
+++ b/src/cmd/internal/obj/riscv/inst.go
@@ -1,5 +1,4 @@
-// Code generated by parse_opcodes -go; DO NOT EDIT.
-
+// Code generated by parse.py -go rv64_a rv64_d rv64_f rv64_i rv64_m rv64_q rv_a rv_d rv_f rv_i rv_m rv_q rv_s rv_system rv_zicsr; DO NOT EDIT.
 package riscv
 
 import "cmd/internal/obj"
@@ -14,108 +13,332 @@
 
 func encode(a obj.As) *inst {
 	switch a {
-	case ABEQ:
-		return &inst{0x63, 0x0, 0x0, 0, 0x0}
-	case ABNE:
-		return &inst{0x63, 0x1, 0x0, 0, 0x0}
-	case ABLT:
-		return &inst{0x63, 0x4, 0x0, 0, 0x0}
-	case ABGE:
-		return &inst{0x63, 0x5, 0x0, 0, 0x0}
-	case ABLTU:
-		return &inst{0x63, 0x6, 0x0, 0, 0x0}
-	case ABGEU:
-		return &inst{0x63, 0x7, 0x0, 0, 0x0}
-	case AJALR:
-		return &inst{0x67, 0x0, 0x0, 0, 0x0}
-	case AJAL:
-		return &inst{0x6f, 0x0, 0x0, 0, 0x0}
-	case ALUI:
-		return &inst{0x37, 0x0, 0x0, 0, 0x0}
-	case AAUIPC:
-		return &inst{0x17, 0x0, 0x0, 0, 0x0}
-	case AADDI:
-		return &inst{0x13, 0x0, 0x0, 0, 0x0}
-	case ASLLI:
-		return &inst{0x13, 0x1, 0x0, 0, 0x0}
-	case ASLTI:
-		return &inst{0x13, 0x2, 0x0, 0, 0x0}
-	case ASLTIU:
-		return &inst{0x13, 0x3, 0x0, 0, 0x0}
-	case AXORI:
-		return &inst{0x13, 0x4, 0x0, 0, 0x0}
-	case ASRLI:
-		return &inst{0x13, 0x5, 0x0, 0, 0x0}
-	case ASRAI:
-		return &inst{0x13, 0x5, 0x0, 1024, 0x20}
-	case AORI:
-		return &inst{0x13, 0x6, 0x0, 0, 0x0}
-	case AANDI:
-		return &inst{0x13, 0x7, 0x0, 0, 0x0}
 	case AADD:
 		return &inst{0x33, 0x0, 0x0, 0, 0x0}
-	case ASUB:
-		return &inst{0x33, 0x0, 0x0, 1024, 0x20}
-	case ASLL:
-		return &inst{0x33, 0x1, 0x0, 0, 0x0}
-	case ASLT:
-		return &inst{0x33, 0x2, 0x0, 0, 0x0}
-	case ASLTU:
-		return &inst{0x33, 0x3, 0x0, 0, 0x0}
-	case AXOR:
-		return &inst{0x33, 0x4, 0x0, 0, 0x0}
-	case ASRL:
-		return &inst{0x33, 0x5, 0x0, 0, 0x0}
-	case ASRA:
-		return &inst{0x33, 0x5, 0x0, 1024, 0x20}
-	case AOR:
-		return &inst{0x33, 0x6, 0x0, 0, 0x0}
-	case AAND:
-		return &inst{0x33, 0x7, 0x0, 0, 0x0}
+	case AADDI:
+		return &inst{0x13, 0x0, 0x0, 0, 0x0}
 	case AADDIW:
 		return &inst{0x1b, 0x0, 0x0, 0, 0x0}
-	case ASLLIW:
-		return &inst{0x1b, 0x1, 0x0, 0, 0x0}
-	case ASRLIW:
-		return &inst{0x1b, 0x5, 0x0, 0, 0x0}
-	case ASRAIW:
-		return &inst{0x1b, 0x5, 0x0, 1024, 0x20}
 	case AADDW:
 		return &inst{0x3b, 0x0, 0x0, 0, 0x0}
-	case ASUBW:
-		return &inst{0x3b, 0x0, 0x0, 1024, 0x20}
-	case ASLLW:
-		return &inst{0x3b, 0x1, 0x0, 0, 0x0}
-	case ASRLW:
-		return &inst{0x3b, 0x5, 0x0, 0, 0x0}
-	case ASRAW:
-		return &inst{0x3b, 0x5, 0x0, 1024, 0x20}
-	case ALB:
-		return &inst{0x3, 0x0, 0x0, 0, 0x0}
-	case ALH:
-		return &inst{0x3, 0x1, 0x0, 0, 0x0}
-	case ALW:
-		return &inst{0x3, 0x2, 0x0, 0, 0x0}
-	case ALD:
-		return &inst{0x3, 0x3, 0x0, 0, 0x0}
-	case ALBU:
-		return &inst{0x3, 0x4, 0x0, 0, 0x0}
-	case ALHU:
-		return &inst{0x3, 0x5, 0x0, 0, 0x0}
-	case ALWU:
-		return &inst{0x3, 0x6, 0x0, 0, 0x0}
-	case ASB:
-		return &inst{0x23, 0x0, 0x0, 0, 0x0}
-	case ASH:
-		return &inst{0x23, 0x1, 0x0, 0, 0x0}
-	case ASW:
-		return &inst{0x23, 0x2, 0x0, 0, 0x0}
-	case ASD:
-		return &inst{0x23, 0x3, 0x0, 0, 0x0}
+	case AAMOADDD:
+		return &inst{0x2f, 0x3, 0x0, 0, 0x0}
+	case AAMOADDW:
+		return &inst{0x2f, 0x2, 0x0, 0, 0x0}
+	case AAMOANDD:
+		return &inst{0x2f, 0x3, 0x0, 1536, 0x30}
+	case AAMOANDW:
+		return &inst{0x2f, 0x2, 0x0, 1536, 0x30}
+	case AAMOMAXD:
+		return &inst{0x2f, 0x3, 0x0, -1536, 0x50}
+	case AAMOMAXW:
+		return &inst{0x2f, 0x2, 0x0, -1536, 0x50}
+	case AAMOMAXUD:
+		return &inst{0x2f, 0x3, 0x0, -512, 0x70}
+	case AAMOMAXUW:
+		return &inst{0x2f, 0x2, 0x0, -512, 0x70}
+	case AAMOMIND:
+		return &inst{0x2f, 0x3, 0x0, -2048, 0x40}
+	case AAMOMINW:
+		return &inst{0x2f, 0x2, 0x0, -2048, 0x40}
+	case AAMOMINUD:
+		return &inst{0x2f, 0x3, 0x0, -1024, 0x60}
+	case AAMOMINUW:
+		return &inst{0x2f, 0x2, 0x0, -1024, 0x60}
+	case AAMOORD:
+		return &inst{0x2f, 0x3, 0x0, 1024, 0x20}
+	case AAMOORW:
+		return &inst{0x2f, 0x2, 0x0, 1024, 0x20}
+	case AAMOSWAPD:
+		return &inst{0x2f, 0x3, 0x0, 128, 0x4}
+	case AAMOSWAPW:
+		return &inst{0x2f, 0x2, 0x0, 128, 0x4}
+	case AAMOXORD:
+		return &inst{0x2f, 0x3, 0x0, 512, 0x10}
+	case AAMOXORW:
+		return &inst{0x2f, 0x2, 0x0, 512, 0x10}
+	case AAND:
+		return &inst{0x33, 0x7, 0x0, 0, 0x0}
+	case AANDI:
+		return &inst{0x13, 0x7, 0x0, 0, 0x0}
+	case AAUIPC:
+		return &inst{0x17, 0x0, 0x0, 0, 0x0}
+	case ABEQ:
+		return &inst{0x63, 0x0, 0x0, 0, 0x0}
+	case ABGE:
+		return &inst{0x63, 0x5, 0x0, 0, 0x0}
+	case ABGEU:
+		return &inst{0x63, 0x7, 0x0, 0, 0x0}
+	case ABLT:
+		return &inst{0x63, 0x4, 0x0, 0, 0x0}
+	case ABLTU:
+		return &inst{0x63, 0x6, 0x0, 0, 0x0}
+	case ABNE:
+		return &inst{0x63, 0x1, 0x0, 0, 0x0}
+	case ACSRRC:
+		return &inst{0x73, 0x3, 0x0, 0, 0x0}
+	case ACSRRCI:
+		return &inst{0x73, 0x7, 0x0, 0, 0x0}
+	case ACSRRS:
+		return &inst{0x73, 0x2, 0x0, 0, 0x0}
+	case ACSRRSI:
+		return &inst{0x73, 0x6, 0x0, 0, 0x0}
+	case ACSRRW:
+		return &inst{0x73, 0x1, 0x0, 0, 0x0}
+	case ACSRRWI:
+		return &inst{0x73, 0x5, 0x0, 0, 0x0}
+	case ADIV:
+		return &inst{0x33, 0x4, 0x0, 32, 0x1}
+	case ADIVU:
+		return &inst{0x33, 0x5, 0x0, 32, 0x1}
+	case ADIVUW:
+		return &inst{0x3b, 0x5, 0x0, 32, 0x1}
+	case ADIVW:
+		return &inst{0x3b, 0x4, 0x0, 32, 0x1}
+	case ADRET:
+		return &inst{0x73, 0x0, 0x12, 1970, 0x3d}
+	case AEBREAK:
+		return &inst{0x73, 0x0, 0x1, 1, 0x0}
+	case AECALL:
+		return &inst{0x73, 0x0, 0x0, 0, 0x0}
+	case AFADDD:
+		return &inst{0x53, 0x0, 0x0, 32, 0x1}
+	case AFADDQ:
+		return &inst{0x53, 0x0, 0x0, 96, 0x3}
+	case AFADDS:
+		return &inst{0x53, 0x0, 0x0, 0, 0x0}
+	case AFCLASSD:
+		return &inst{0x53, 0x1, 0x0, -480, 0x71}
+	case AFCLASSQ:
+		return &inst{0x53, 0x1, 0x0, -416, 0x73}
+	case AFCLASSS:
+		return &inst{0x53, 0x1, 0x0, -512, 0x70}
+	case AFCVTDL:
+		return &inst{0x53, 0x0, 0x2, -734, 0x69}
+	case AFCVTDLU:
+		return &inst{0x53, 0x0, 0x3, -733, 0x69}
+	case AFCVTDQ:
+		return &inst{0x53, 0x0, 0x3, 1059, 0x21}
+	case AFCVTDS:
+		return &inst{0x53, 0x0, 0x0, 1056, 0x21}
+	case AFCVTDW:
+		return &inst{0x53, 0x0, 0x0, -736, 0x69}
+	case AFCVTDWU:
+		return &inst{0x53, 0x0, 0x1, -735, 0x69}
+	case AFCVTLD:
+		return &inst{0x53, 0x0, 0x2, -990, 0x61}
+	case AFCVTLQ:
+		return &inst{0x53, 0x0, 0x2, -926, 0x63}
+	case AFCVTLS:
+		return &inst{0x53, 0x0, 0x2, -1022, 0x60}
+	case AFCVTLUD:
+		return &inst{0x53, 0x0, 0x3, -989, 0x61}
+	case AFCVTLUQ:
+		return &inst{0x53, 0x0, 0x3, -925, 0x63}
+	case AFCVTLUS:
+		return &inst{0x53, 0x0, 0x3, -1021, 0x60}
+	case AFCVTQD:
+		return &inst{0x53, 0x0, 0x1, 1121, 0x23}
+	case AFCVTQL:
+		return &inst{0x53, 0x0, 0x2, -670, 0x6b}
+	case AFCVTQLU:
+		return &inst{0x53, 0x0, 0x3, -669, 0x6b}
+	case AFCVTQS:
+		return &inst{0x53, 0x0, 0x0, 1120, 0x23}
+	case AFCVTQW:
+		return &inst{0x53, 0x0, 0x0, -672, 0x6b}
+	case AFCVTQWU:
+		return &inst{0x53, 0x0, 0x1, -671, 0x6b}
+	case AFCVTSD:
+		return &inst{0x53, 0x0, 0x1, 1025, 0x20}
+	case AFCVTSL:
+		return &inst{0x53, 0x0, 0x2, -766, 0x68}
+	case AFCVTSLU:
+		return &inst{0x53, 0x0, 0x3, -765, 0x68}
+	case AFCVTSQ:
+		return &inst{0x53, 0x0, 0x3, 1027, 0x20}
+	case AFCVTSW:
+		return &inst{0x53, 0x0, 0x0, -768, 0x68}
+	case AFCVTSWU:
+		return &inst{0x53, 0x0, 0x1, -767, 0x68}
+	case AFCVTWD:
+		return &inst{0x53, 0x0, 0x0, -992, 0x61}
+	case AFCVTWQ:
+		return &inst{0x53, 0x0, 0x0, -928, 0x63}
+	case AFCVTWS:
+		return &inst{0x53, 0x0, 0x0, -1024, 0x60}
+	case AFCVTWUD:
+		return &inst{0x53, 0x0, 0x1, -991, 0x61}
+	case AFCVTWUQ:
+		return &inst{0x53, 0x0, 0x1, -927, 0x63}
+	case AFCVTWUS:
+		return &inst{0x53, 0x0, 0x1, -1023, 0x60}
+	case AFDIVD:
+		return &inst{0x53, 0x0, 0x0, 416, 0xd}
+	case AFDIVQ:
+		return &inst{0x53, 0x0, 0x0, 480, 0xf}
+	case AFDIVS:
+		return &inst{0x53, 0x0, 0x0, 384, 0xc}
 	case AFENCE:
 		return &inst{0xf, 0x0, 0x0, 0, 0x0}
-	case AFENCEI:
-		return &inst{0xf, 0x1, 0x0, 0, 0x0}
+	case AFENCETSO:
+		return &inst{0xf, 0x0, 0x13, -1997, 0x41}
+	case AFEQD:
+		return &inst{0x53, 0x2, 0x0, -1504, 0x51}
+	case AFEQQ:
+		return &inst{0x53, 0x2, 0x0, -1440, 0x53}
+	case AFEQS:
+		return &inst{0x53, 0x2, 0x0, -1536, 0x50}
+	case AFLD:
+		return &inst{0x7, 0x3, 0x0, 0, 0x0}
+	case AFLED:
+		return &inst{0x53, 0x0, 0x0, -1504, 0x51}
+	case AFLEQ:
+		return &inst{0x53, 0x0, 0x0, -1440, 0x53}
+	case AFLES:
+		return &inst{0x53, 0x0, 0x0, -1536, 0x50}
+	case AFLQ:
+		return &inst{0x7, 0x4, 0x0, 0, 0x0}
+	case AFLTD:
+		return &inst{0x53, 0x1, 0x0, -1504, 0x51}
+	case AFLTQ:
+		return &inst{0x53, 0x1, 0x0, -1440, 0x53}
+	case AFLTS:
+		return &inst{0x53, 0x1, 0x0, -1536, 0x50}
+	case AFLW:
+		return &inst{0x7, 0x2, 0x0, 0, 0x0}
+	case AFMADDD:
+		return &inst{0x43, 0x0, 0x0, 32, 0x1}
+	case AFMADDQ:
+		return &inst{0x43, 0x0, 0x0, 96, 0x3}
+	case AFMADDS:
+		return &inst{0x43, 0x0, 0x0, 0, 0x0}
+	case AFMAXD:
+		return &inst{0x53, 0x1, 0x0, 672, 0x15}
+	case AFMAXQ:
+		return &inst{0x53, 0x1, 0x0, 736, 0x17}
+	case AFMAXS:
+		return &inst{0x53, 0x1, 0x0, 640, 0x14}
+	case AFMIND:
+		return &inst{0x53, 0x0, 0x0, 672, 0x15}
+	case AFMINQ:
+		return &inst{0x53, 0x0, 0x0, 736, 0x17}
+	case AFMINS:
+		return &inst{0x53, 0x0, 0x0, 640, 0x14}
+	case AFMSUBD:
+		return &inst{0x47, 0x0, 0x0, 32, 0x1}
+	case AFMSUBQ:
+		return &inst{0x47, 0x0, 0x0, 96, 0x3}
+	case AFMSUBS:
+		return &inst{0x47, 0x0, 0x0, 0, 0x0}
+	case AFMULD:
+		return &inst{0x53, 0x0, 0x0, 288, 0x9}
+	case AFMULQ:
+		return &inst{0x53, 0x0, 0x0, 352, 0xb}
+	case AFMULS:
+		return &inst{0x53, 0x0, 0x0, 256, 0x8}
+	case AFMVDX:
+		return &inst{0x53, 0x0, 0x0, -224, 0x79}
+	case AFMVSX:
+		return &inst{0x53, 0x0, 0x0, -256, 0x78}
+	case AFMVWX:
+		return &inst{0x53, 0x0, 0x0, -256, 0x78}
+	case AFMVXD:
+		return &inst{0x53, 0x0, 0x0, -480, 0x71}
+	case AFMVXS:
+		return &inst{0x53, 0x0, 0x0, -512, 0x70}
+	case AFMVXW:
+		return &inst{0x53, 0x0, 0x0, -512, 0x70}
+	case AFNMADDD:
+		return &inst{0x4f, 0x0, 0x0, 32, 0x1}
+	case AFNMADDQ:
+		return &inst{0x4f, 0x0, 0x0, 96, 0x3}
+	case AFNMADDS:
+		return &inst{0x4f, 0x0, 0x0, 0, 0x0}
+	case AFNMSUBD:
+		return &inst{0x4b, 0x0, 0x0, 32, 0x1}
+	case AFNMSUBQ:
+		return &inst{0x4b, 0x0, 0x0, 96, 0x3}
+	case AFNMSUBS:
+		return &inst{0x4b, 0x0, 0x0, 0, 0x0}
+	case AFRCSR:
+		return &inst{0x73, 0x2, 0x3, 3, 0x0}
+	case AFRFLAGS:
+		return &inst{0x73, 0x2, 0x1, 1, 0x0}
+	case AFRRM:
+		return &inst{0x73, 0x2, 0x2, 2, 0x0}
+	case AFSCSR:
+		return &inst{0x73, 0x1, 0x3, 3, 0x0}
+	case AFSD:
+		return &inst{0x27, 0x3, 0x0, 0, 0x0}
+	case AFSFLAGS:
+		return &inst{0x73, 0x1, 0x1, 1, 0x0}
+	case AFSFLAGSI:
+		return &inst{0x73, 0x5, 0x1, 1, 0x0}
+	case AFSGNJD:
+		return &inst{0x53, 0x0, 0x0, 544, 0x11}
+	case AFSGNJQ:
+		return &inst{0x53, 0x0, 0x0, 608, 0x13}
+	case AFSGNJS:
+		return &inst{0x53, 0x0, 0x0, 512, 0x10}
+	case AFSGNJND:
+		return &inst{0x53, 0x1, 0x0, 544, 0x11}
+	case AFSGNJNQ:
+		return &inst{0x53, 0x1, 0x0, 608, 0x13}
+	case AFSGNJNS:
+		return &inst{0x53, 0x1, 0x0, 512, 0x10}
+	case AFSGNJXD:
+		return &inst{0x53, 0x2, 0x0, 544, 0x11}
+	case AFSGNJXQ:
+		return &inst{0x53, 0x2, 0x0, 608, 0x13}
+	case AFSGNJXS:
+		return &inst{0x53, 0x2, 0x0, 512, 0x10}
+	case AFSQ:
+		return &inst{0x27, 0x4, 0x0, 0, 0x0}
+	case AFSQRTD:
+		return &inst{0x53, 0x0, 0x0, 1440, 0x2d}
+	case AFSQRTQ:
+		return &inst{0x53, 0x0, 0x0, 1504, 0x2f}
+	case AFSQRTS:
+		return &inst{0x53, 0x0, 0x0, 1408, 0x2c}
+	case AFSRM:
+		return &inst{0x73, 0x1, 0x2, 2, 0x0}
+	case AFSRMI:
+		return &inst{0x73, 0x5, 0x2, 2, 0x0}
+	case AFSUBD:
+		return &inst{0x53, 0x0, 0x0, 160, 0x5}
+	case AFSUBQ:
+		return &inst{0x53, 0x0, 0x0, 224, 0x7}
+	case AFSUBS:
+		return &inst{0x53, 0x0, 0x0, 128, 0x4}
+	case AFSW:
+		return &inst{0x27, 0x2, 0x0, 0, 0x0}
+	case AJAL:
+		return &inst{0x6f, 0x0, 0x0, 0, 0x0}
+	case AJALR:
+		return &inst{0x67, 0x0, 0x0, 0, 0x0}
+	case ALB:
+		return &inst{0x3, 0x0, 0x0, 0, 0x0}
+	case ALBU:
+		return &inst{0x3, 0x4, 0x0, 0, 0x0}
+	case ALD:
+		return &inst{0x3, 0x3, 0x0, 0, 0x0}
+	case ALH:
+		return &inst{0x3, 0x1, 0x0, 0, 0x0}
+	case ALHU:
+		return &inst{0x3, 0x5, 0x0, 0, 0x0}
+	case ALRD:
+		return &inst{0x2f, 0x3, 0x0, 256, 0x8}
+	case ALRW:
+		return &inst{0x2f, 0x2, 0x0, 256, 0x8}
+	case ALUI:
+		return &inst{0x37, 0x0, 0x0, 0, 0x0}
+	case ALW:
+		return &inst{0x3, 0x2, 0x0, 0, 0x0}
+	case ALWU:
+		return &inst{0x3, 0x6, 0x0, 0, 0x0}
+	case AMRET:
+		return &inst{0x73, 0x0, 0x2, 770, 0x18}
 	case AMUL:
 		return &inst{0x33, 0x0, 0x0, 32, 0x1}
 	case AMULH:
@@ -124,336 +347,96 @@
 		return &inst{0x33, 0x2, 0x0, 32, 0x1}
 	case AMULHU:
 		return &inst{0x33, 0x3, 0x0, 32, 0x1}
-	case ADIV:
-		return &inst{0x33, 0x4, 0x0, 32, 0x1}
-	case ADIVU:
-		return &inst{0x33, 0x5, 0x0, 32, 0x1}
+	case AMULW:
+		return &inst{0x3b, 0x0, 0x0, 32, 0x1}
+	case AOR:
+		return &inst{0x33, 0x6, 0x0, 0, 0x0}
+	case AORI:
+		return &inst{0x13, 0x6, 0x0, 0, 0x0}
+	case APAUSE:
+		return &inst{0xf, 0x0, 0x10, 16, 0x0}
+	case ARDCYCLE:
+		return &inst{0x73, 0x2, 0x0, -1024, 0x60}
+	case ARDCYCLEH:
+		return &inst{0x73, 0x2, 0x0, -896, 0x64}
+	case ARDINSTRET:
+		return &inst{0x73, 0x2, 0x2, -1022, 0x60}
+	case ARDINSTRETH:
+		return &inst{0x73, 0x2, 0x2, -894, 0x64}
+	case ARDTIME:
+		return &inst{0x73, 0x2, 0x1, -1023, 0x60}
+	case ARDTIMEH:
+		return &inst{0x73, 0x2, 0x1, -895, 0x64}
 	case AREM:
 		return &inst{0x33, 0x6, 0x0, 32, 0x1}
 	case AREMU:
 		return &inst{0x33, 0x7, 0x0, 32, 0x1}
-	case AMULW:
-		return &inst{0x3b, 0x0, 0x0, 32, 0x1}
-	case ADIVW:
-		return &inst{0x3b, 0x4, 0x0, 32, 0x1}
-	case ADIVUW:
-		return &inst{0x3b, 0x5, 0x0, 32, 0x1}
-	case AREMW:
-		return &inst{0x3b, 0x6, 0x0, 32, 0x1}
 	case AREMUW:
 		return &inst{0x3b, 0x7, 0x0, 32, 0x1}
-	case AAMOADDW:
-		return &inst{0x2f, 0x2, 0x0, 0, 0x0}
-	case AAMOXORW:
-		return &inst{0x2f, 0x2, 0x0, 512, 0x10}
-	case AAMOORW:
-		return &inst{0x2f, 0x2, 0x0, 1024, 0x20}
-	case AAMOANDW:
-		return &inst{0x2f, 0x2, 0x0, 1536, 0x30}
-	case AAMOMINW:
-		return &inst{0x2f, 0x2, 0x0, -2048, 0x40}
-	case AAMOMAXW:
-		return &inst{0x2f, 0x2, 0x0, -1536, 0x50}
-	case AAMOMINUW:
-		return &inst{0x2f, 0x2, 0x0, -1024, 0x60}
-	case AAMOMAXUW:
-		return &inst{0x2f, 0x2, 0x0, -512, 0x70}
-	case AAMOSWAPW:
-		return &inst{0x2f, 0x2, 0x0, 128, 0x4}
-	case ALRW:
-		return &inst{0x2f, 0x2, 0x0, 256, 0x8}
-	case ASCW:
-		return &inst{0x2f, 0x2, 0x0, 384, 0xc}
-	case AAMOADDD:
-		return &inst{0x2f, 0x3, 0x0, 0, 0x0}
-	case AAMOXORD:
-		return &inst{0x2f, 0x3, 0x0, 512, 0x10}
-	case AAMOORD:
-		return &inst{0x2f, 0x3, 0x0, 1024, 0x20}
-	case AAMOANDD:
-		return &inst{0x2f, 0x3, 0x0, 1536, 0x30}
-	case AAMOMIND:
-		return &inst{0x2f, 0x3, 0x0, -2048, 0x40}
-	case AAMOMAXD:
-		return &inst{0x2f, 0x3, 0x0, -1536, 0x50}
-	case AAMOMINUD:
-		return &inst{0x2f, 0x3, 0x0, -1024, 0x60}
-	case AAMOMAXUD:
-		return &inst{0x2f, 0x3, 0x0, -512, 0x70}
-	case AAMOSWAPD:
-		return &inst{0x2f, 0x3, 0x0, 128, 0x4}
-	case ALRD:
-		return &inst{0x2f, 0x3, 0x0, 256, 0x8}
-	case ASCD:
-		return &inst{0x2f, 0x3, 0x0, 384, 0xc}
-	case AECALL:
-		return &inst{0x73, 0x0, 0x0, 0, 0x0}
-	case AEBREAK:
-		return &inst{0x73, 0x0, 0x1, 1, 0x0}
-	case AURET:
-		return &inst{0x73, 0x0, 0x2, 2, 0x0}
-	case ASRET:
-		return &inst{0x73, 0x0, 0x2, 258, 0x8}
-	case AMRET:
-		return &inst{0x73, 0x0, 0x2, 770, 0x18}
-	case ADRET:
-		return &inst{0x73, 0x0, 0x12, 1970, 0x3d}
-	case ASFENCEVMA:
-		return &inst{0x73, 0x0, 0x0, 288, 0x9}
-	case AWFI:
-		return &inst{0x73, 0x0, 0x5, 261, 0x8}
-	case ACSRRW:
-		return &inst{0x73, 0x1, 0x0, 0, 0x0}
-	case ACSRRS:
-		return &inst{0x73, 0x2, 0x0, 0, 0x0}
-	case ACSRRC:
-		return &inst{0x73, 0x3, 0x0, 0, 0x0}
-	case ACSRRWI:
-		return &inst{0x73, 0x5, 0x0, 0, 0x0}
-	case ACSRRSI:
-		return &inst{0x73, 0x6, 0x0, 0, 0x0}
-	case ACSRRCI:
-		return &inst{0x73, 0x7, 0x0, 0, 0x0}
-	case AHFENCEVVMA:
-		return &inst{0x73, 0x0, 0x0, 544, 0x11}
-	case AHFENCEGVMA:
-		return &inst{0x73, 0x0, 0x0, 1568, 0x31}
-	case AFADDS:
-		return &inst{0x53, 0x0, 0x0, 0, 0x0}
-	case AFSUBS:
-		return &inst{0x53, 0x0, 0x0, 128, 0x4}
-	case AFMULS:
-		return &inst{0x53, 0x0, 0x0, 256, 0x8}
-	case AFDIVS:
-		return &inst{0x53, 0x0, 0x0, 384, 0xc}
-	case AFSGNJS:
-		return &inst{0x53, 0x0, 0x0, 512, 0x10}
-	case AFSGNJNS:
-		return &inst{0x53, 0x1, 0x0, 512, 0x10}
-	case AFSGNJXS:
-		return &inst{0x53, 0x2, 0x0, 512, 0x10}
-	case AFMINS:
-		return &inst{0x53, 0x0, 0x0, 640, 0x14}
-	case AFMAXS:
-		return &inst{0x53, 0x1, 0x0, 640, 0x14}
-	case AFSQRTS:
-		return &inst{0x53, 0x0, 0x0, 1408, 0x2c}
-	case AFADDD:
-		return &inst{0x53, 0x0, 0x0, 32, 0x1}
-	case AFSUBD:
-		return &inst{0x53, 0x0, 0x0, 160, 0x5}
-	case AFMULD:
-		return &inst{0x53, 0x0, 0x0, 288, 0x9}
-	case AFDIVD:
-		return &inst{0x53, 0x0, 0x0, 416, 0xd}
-	case AFSGNJD:
-		return &inst{0x53, 0x0, 0x0, 544, 0x11}
-	case AFSGNJND:
-		return &inst{0x53, 0x1, 0x0, 544, 0x11}
-	case AFSGNJXD:
-		return &inst{0x53, 0x2, 0x0, 544, 0x11}
-	case AFMIND:
-		return &inst{0x53, 0x0, 0x0, 672, 0x15}
-	case AFMAXD:
-		return &inst{0x53, 0x1, 0x0, 672, 0x15}
-	case AFCVTSD:
-		return &inst{0x53, 0x0, 0x1, 1025, 0x20}
-	case AFCVTDS:
-		return &inst{0x53, 0x0, 0x0, 1056, 0x21}
-	case AFSQRTD:
-		return &inst{0x53, 0x0, 0x0, 1440, 0x2d}
-	case AFADDQ:
-		return &inst{0x53, 0x0, 0x0, 96, 0x3}
-	case AFSUBQ:
-		return &inst{0x53, 0x0, 0x0, 224, 0x7}
-	case AFMULQ:
-		return &inst{0x53, 0x0, 0x0, 352, 0xb}
-	case AFDIVQ:
-		return &inst{0x53, 0x0, 0x0, 480, 0xf}
-	case AFSGNJQ:
-		return &inst{0x53, 0x0, 0x0, 608, 0x13}
-	case AFSGNJNQ:
-		return &inst{0x53, 0x1, 0x0, 608, 0x13}
-	case AFSGNJXQ:
-		return &inst{0x53, 0x2, 0x0, 608, 0x13}
-	case AFMINQ:
-		return &inst{0x53, 0x0, 0x0, 736, 0x17}
-	case AFMAXQ:
-		return &inst{0x53, 0x1, 0x0, 736, 0x17}
-	case AFCVTSQ:
-		return &inst{0x53, 0x0, 0x3, 1027, 0x20}
-	case AFCVTQS:
-		return &inst{0x53, 0x0, 0x0, 1120, 0x23}
-	case AFCVTDQ:
-		return &inst{0x53, 0x0, 0x3, 1059, 0x21}
-	case AFCVTQD:
-		return &inst{0x53, 0x0, 0x1, 1121, 0x23}
-	case AFSQRTQ:
-		return &inst{0x53, 0x0, 0x0, 1504, 0x2f}
-	case AFLES:
-		return &inst{0x53, 0x0, 0x0, -1536, 0x50}
-	case AFLTS:
-		return &inst{0x53, 0x1, 0x0, -1536, 0x50}
-	case AFEQS:
-		return &inst{0x53, 0x2, 0x0, -1536, 0x50}
-	case AFLED:
-		return &inst{0x53, 0x0, 0x0, -1504, 0x51}
-	case AFLTD:
-		return &inst{0x53, 0x1, 0x0, -1504, 0x51}
-	case AFEQD:
-		return &inst{0x53, 0x2, 0x0, -1504, 0x51}
-	case AFLEQ:
-		return &inst{0x53, 0x0, 0x0, -1440, 0x53}
-	case AFLTQ:
-		return &inst{0x53, 0x1, 0x0, -1440, 0x53}
-	case AFEQQ:
-		return &inst{0x53, 0x2, 0x0, -1440, 0x53}
-	case AFCVTWS:
-		return &inst{0x53, 0x0, 0x0, -1024, 0x60}
-	case AFCVTWUS:
-		return &inst{0x53, 0x0, 0x1, -1023, 0x60}
-	case AFCVTLS:
-		return &inst{0x53, 0x0, 0x2, -1022, 0x60}
-	case AFCVTLUS:
-		return &inst{0x53, 0x0, 0x3, -1021, 0x60}
-	case AFMVXW:
-		return &inst{0x53, 0x0, 0x0, -512, 0x70}
-	case AFCLASSS:
-		return &inst{0x53, 0x1, 0x0, -512, 0x70}
-	case AFCVTWD:
-		return &inst{0x53, 0x0, 0x0, -992, 0x61}
-	case AFCVTWUD:
-		return &inst{0x53, 0x0, 0x1, -991, 0x61}
-	case AFCVTLD:
-		return &inst{0x53, 0x0, 0x2, -990, 0x61}
-	case AFCVTLUD:
-		return &inst{0x53, 0x0, 0x3, -989, 0x61}
-	case AFMVXD:
-		return &inst{0x53, 0x0, 0x0, -480, 0x71}
-	case AFCLASSD:
-		return &inst{0x53, 0x1, 0x0, -480, 0x71}
-	case AFCVTWQ:
-		return &inst{0x53, 0x0, 0x0, -928, 0x63}
-	case AFCVTWUQ:
-		return &inst{0x53, 0x0, 0x1, -927, 0x63}
-	case AFCVTLQ:
-		return &inst{0x53, 0x0, 0x2, -926, 0x63}
-	case AFCVTLUQ:
-		return &inst{0x53, 0x0, 0x3, -925, 0x63}
-	case AFMVXQ:
-		return &inst{0x53, 0x0, 0x0, -416, 0x73}
-	case AFCLASSQ:
-		return &inst{0x53, 0x1, 0x0, -416, 0x73}
-	case AFCVTSW:
-		return &inst{0x53, 0x0, 0x0, -768, 0x68}
-	case AFCVTSWU:
-		return &inst{0x53, 0x0, 0x1, -767, 0x68}
-	case AFCVTSL:
-		return &inst{0x53, 0x0, 0x2, -766, 0x68}
-	case AFCVTSLU:
-		return &inst{0x53, 0x0, 0x3, -765, 0x68}
-	case AFMVWX:
-		return &inst{0x53, 0x0, 0x0, -256, 0x78}
-	case AFCVTDW:
-		return &inst{0x53, 0x0, 0x0, -736, 0x69}
-	case AFCVTDWU:
-		return &inst{0x53, 0x0, 0x1, -735, 0x69}
-	case AFCVTDL:
-		return &inst{0x53, 0x0, 0x2, -734, 0x69}
-	case AFCVTDLU:
-		return &inst{0x53, 0x0, 0x3, -733, 0x69}
-	case AFMVDX:
-		return &inst{0x53, 0x0, 0x0, -224, 0x79}
-	case AFCVTQW:
-		return &inst{0x53, 0x0, 0x0, -672, 0x6b}
-	case AFCVTQWU:
-		return &inst{0x53, 0x0, 0x1, -671, 0x6b}
-	case AFCVTQL:
-		return &inst{0x53, 0x0, 0x2, -670, 0x6b}
-	case AFCVTQLU:
-		return &inst{0x53, 0x0, 0x3, -669, 0x6b}
-	case AFMVQX:
-		return &inst{0x53, 0x0, 0x0, -160, 0x7b}
-	case AFLW:
-		return &inst{0x7, 0x2, 0x0, 0, 0x0}
-	case AFLD:
-		return &inst{0x7, 0x3, 0x0, 0, 0x0}
-	case AFLQ:
-		return &inst{0x7, 0x4, 0x0, 0, 0x0}
-	case AFSW:
-		return &inst{0x27, 0x2, 0x0, 0, 0x0}
-	case AFSD:
-		return &inst{0x27, 0x3, 0x0, 0, 0x0}
-	case AFSQ:
-		return &inst{0x27, 0x4, 0x0, 0, 0x0}
-	case AFMADDS:
-		return &inst{0x43, 0x0, 0x0, 0, 0x0}
-	case AFMSUBS:
-		return &inst{0x47, 0x0, 0x0, 0, 0x0}
-	case AFNMSUBS:
-		return &inst{0x4b, 0x0, 0x0, 0, 0x0}
-	case AFNMADDS:
-		return &inst{0x4f, 0x0, 0x0, 0, 0x0}
-	case AFMADDD:
-		return &inst{0x43, 0x0, 0x0, 32, 0x1}
-	case AFMSUBD:
-		return &inst{0x47, 0x0, 0x0, 32, 0x1}
-	case AFNMSUBD:
-		return &inst{0x4b, 0x0, 0x0, 32, 0x1}
-	case AFNMADDD:
-		return &inst{0x4f, 0x0, 0x0, 32, 0x1}
-	case AFMADDQ:
-		return &inst{0x43, 0x0, 0x0, 96, 0x3}
-	case AFMSUBQ:
-		return &inst{0x47, 0x0, 0x0, 96, 0x3}
-	case AFNMSUBQ:
-		return &inst{0x4b, 0x0, 0x0, 96, 0x3}
-	case AFNMADDQ:
-		return &inst{0x4f, 0x0, 0x0, 96, 0x3}
-	case ASLLIRV32:
-		return &inst{0x13, 0x1, 0x0, 0, 0x0}
-	case ASRLIRV32:
-		return &inst{0x13, 0x5, 0x0, 0, 0x0}
-	case ASRAIRV32:
-		return &inst{0x13, 0x5, 0x0, 1024, 0x20}
-	case AFRFLAGS:
-		return &inst{0x73, 0x2, 0x1, 1, 0x0}
-	case AFSFLAGS:
-		return &inst{0x73, 0x1, 0x1, 1, 0x0}
-	case AFSFLAGSI:
-		return &inst{0x73, 0x5, 0x1, 1, 0x0}
-	case AFRRM:
-		return &inst{0x73, 0x2, 0x2, 2, 0x0}
-	case AFSRM:
-		return &inst{0x73, 0x1, 0x2, 2, 0x0}
-	case AFSRMI:
-		return &inst{0x73, 0x5, 0x2, 2, 0x0}
-	case AFSCSR:
-		return &inst{0x73, 0x1, 0x3, 3, 0x0}
-	case AFRCSR:
-		return &inst{0x73, 0x2, 0x3, 3, 0x0}
-	case ARDCYCLE:
-		return &inst{0x73, 0x2, 0x0, -1024, 0x60}
-	case ARDTIME:
-		return &inst{0x73, 0x2, 0x1, -1023, 0x60}
-	case ARDINSTRET:
-		return &inst{0x73, 0x2, 0x2, -1022, 0x60}
-	case ARDCYCLEH:
-		return &inst{0x73, 0x2, 0x0, -896, 0x64}
-	case ARDTIMEH:
-		return &inst{0x73, 0x2, 0x1, -895, 0x64}
-	case ARDINSTRETH:
-		return &inst{0x73, 0x2, 0x2, -894, 0x64}
-	case ASCALL:
-		return &inst{0x73, 0x0, 0x0, 0, 0x0}
+	case AREMW:
+		return &inst{0x3b, 0x6, 0x0, 32, 0x1}
+	case ASB:
+		return &inst{0x23, 0x0, 0x0, 0, 0x0}
 	case ASBREAK:
 		return &inst{0x73, 0x0, 0x1, 1, 0x0}
-	case AFMVXS:
-		return &inst{0x53, 0x0, 0x0, -512, 0x70}
-	case AFMVSX:
-		return &inst{0x53, 0x0, 0x0, -256, 0x78}
-	case AFENCETSO:
-		return &inst{0xf, 0x0, 0x13, -1997, 0x41}
+	case ASCD:
+		return &inst{0x2f, 0x3, 0x0, 384, 0xc}
+	case ASCW:
+		return &inst{0x2f, 0x2, 0x0, 384, 0xc}
+	case ASCALL:
+		return &inst{0x73, 0x0, 0x0, 0, 0x0}
+	case ASD:
+		return &inst{0x23, 0x3, 0x0, 0, 0x0}
+	case ASFENCEVMA:
+		return &inst{0x73, 0x0, 0x0, 288, 0x9}
+	case ASH:
+		return &inst{0x23, 0x1, 0x0, 0, 0x0}
+	case ASLL:
+		return &inst{0x33, 0x1, 0x0, 0, 0x0}
+	case ASLLI:
+		return &inst{0x13, 0x1, 0x0, 0, 0x0}
+	case ASLLIW:
+		return &inst{0x1b, 0x1, 0x0, 0, 0x0}
+	case ASLLW:
+		return &inst{0x3b, 0x1, 0x0, 0, 0x0}
+	case ASLT:
+		return &inst{0x33, 0x2, 0x0, 0, 0x0}
+	case ASLTI:
+		return &inst{0x13, 0x2, 0x0, 0, 0x0}
+	case ASLTIU:
+		return &inst{0x13, 0x3, 0x0, 0, 0x0}
+	case ASLTU:
+		return &inst{0x33, 0x3, 0x0, 0, 0x0}
+	case ASRA:
+		return &inst{0x33, 0x5, 0x0, 1024, 0x20}
+	case ASRAI:
+		return &inst{0x13, 0x5, 0x0, 1024, 0x20}
+	case ASRAIW:
+		return &inst{0x1b, 0x5, 0x0, 1024, 0x20}
+	case ASRAW:
+		return &inst{0x3b, 0x5, 0x0, 1024, 0x20}
+	case ASRET:
+		return &inst{0x73, 0x0, 0x2, 258, 0x8}
+	case ASRL:
+		return &inst{0x33, 0x5, 0x0, 0, 0x0}
+	case ASRLI:
+		return &inst{0x13, 0x5, 0x0, 0, 0x0}
+	case ASRLIW:
+		return &inst{0x1b, 0x5, 0x0, 0, 0x0}
+	case ASRLW:
+		return &inst{0x3b, 0x5, 0x0, 0, 0x0}
+	case ASUB:
+		return &inst{0x33, 0x0, 0x0, 1024, 0x20}
+	case ASUBW:
+		return &inst{0x3b, 0x0, 0x0, 1024, 0x20}
+	case ASW:
+		return &inst{0x23, 0x2, 0x0, 0, 0x0}
+	case AWFI:
+		return &inst{0x73, 0x0, 0x5, 261, 0x8}
+	case AXOR:
+		return &inst{0x33, 0x4, 0x0, 0, 0x0}
+	case AXORI:
+		return &inst{0x13, 0x4, 0x0, 0, 0x0}
 	}
 	return nil
 }
diff --git a/src/cmd/internal/obj/riscv/obj.go b/src/cmd/internal/obj/riscv/obj.go
index 95cd365..43fa735 100644
--- a/src/cmd/internal/obj/riscv/obj.go
+++ b/src/cmd/internal/obj/riscv/obj.go
@@ -25,7 +25,9 @@
 	"cmd/internal/objabi"
 	"cmd/internal/sys"
 	"fmt"
+	"internal/abi"
 	"log"
+	"math/bits"
 )
 
 func buildop(ctxt *obj.Link) {}
@@ -140,8 +142,14 @@
 		p.As = AEBREAK
 
 	case AMOV:
-		// Put >32-bit constants in memory and load them.
 		if p.From.Type == obj.TYPE_CONST && p.From.Name == obj.NAME_NONE && p.From.Reg == obj.REG_NONE && int64(int32(p.From.Offset)) != p.From.Offset {
+			ctz := bits.TrailingZeros64(uint64(p.From.Offset))
+			val := p.From.Offset >> ctz
+			if int64(int32(val)) == val {
+				// It's ok. We can handle constants with many trailing zeros.
+				break
+			}
+			// Put >32-bit constants in memory and load them.
 			p.From.Type = obj.TYPE_MEM
 			p.From.Sym = ctxt.Int64Sym(p.From.Offset)
 			p.From.Name = obj.NAME_EXTERN
@@ -585,8 +593,8 @@
 
 		if p.To.Type == obj.TYPE_REG && p.To.Reg == REGSP && p.Spadj == 0 {
 			f := cursym.Func()
-			if f.FuncFlag&objabi.FuncFlag_SPWRITE == 0 {
-				f.FuncFlag |= objabi.FuncFlag_SPWRITE
+			if f.FuncFlag&abi.FuncFlagSPWrite == 0 {
+				f.FuncFlag |= abi.FuncFlagSPWrite
 				if ctxt.Debugvlog || !ctxt.IsAsm {
 					ctxt.Logf("auto-SPWRITE: %s %v\n", cursym.Name, p)
 					if !ctxt.IsAsm {
@@ -657,7 +665,7 @@
 
 					p.As = AAUIPC
 					p.Mark = (p.Mark &^ NEED_CALL_RELOC) | NEED_PCREL_ITYPE_RELOC
-					p.SetFrom3(obj.Addr{Type: obj.TYPE_CONST, Offset: p.To.Offset, Sym: p.To.Sym})
+					p.AddRestSource(obj.Addr{Type: obj.TYPE_CONST, Offset: p.To.Offset, Sym: p.To.Sym})
 					p.From = obj.Addr{Type: obj.TYPE_CONST, Offset: 0}
 					p.Reg = obj.REG_NONE
 					p.To = obj.Addr{Type: obj.TYPE_REG, Reg: REG_TMP}
@@ -821,7 +829,7 @@
 
 	var to_done, to_more *obj.Prog
 
-	if framesize <= objabi.StackSmall {
+	if framesize <= abi.StackSmall {
 		// small stack
 		//	// if SP > stackguard { goto done }
 		//	BLTU	stackguard, SP, done
@@ -834,8 +842,8 @@
 		to_done = p
 	} else {
 		// large stack: SP-framesize < stackguard-StackSmall
-		offset := int64(framesize) - objabi.StackSmall
-		if framesize > objabi.StackBig {
+		offset := int64(framesize) - abi.StackSmall
+		if framesize > abi.StackBig {
 			// Such a large stack we need to protect against underflow.
 			// The runtime guarantees SP > objabi.StackBig, but
 			// framesize is large enough that SP-framesize may
@@ -1684,7 +1692,7 @@
 	return ins
 }
 
-// instructionsForOpImmediate returns the machine instructions for a immedate
+// instructionsForOpImmediate returns the machine instructions for an immediate
 // operand. The instruction is specified by as and the source register is
 // specified by rs, instead of the obj.Prog.
 func instructionsForOpImmediate(p *obj.Prog, as obj.As, rs int16) []*instruction {
@@ -1838,6 +1846,23 @@
 			return nil
 		}
 
+		// For constants larger than 32 bits in size that have trailing zeros,
+		// use the value with the trailing zeros removed and then use a SLLI
+		// instruction to restore the original constant.
+		// For example:
+		// 	MOV $0x8000000000000000, X10
+		// becomes
+		// 	MOV $1, X10
+		// 	SLLI $63, X10, X10
+		var insSLLI *instruction
+		if !immIFits(ins.imm, 32) {
+			ctz := bits.TrailingZeros64(uint64(ins.imm))
+			if immIFits(ins.imm>>ctz, 32) {
+				ins.imm = ins.imm >> ctz
+				insSLLI = &instruction{as: ASLLI, rd: ins.rd, rs1: ins.rd, imm: int64(ctz)}
+			}
+		}
+
 		low, high, err := Split32BitImmediate(ins.imm)
 		if err != nil {
 			p.Ctxt.Diag("%v: constant %d too large: %v", p, ins.imm, err)
@@ -1849,6 +1874,9 @@
 
 		// LUI is only necessary if the constant does not fit in 12 bits.
 		if high == 0 {
+			if insSLLI != nil {
+				inss = append(inss, insSLLI)
+			}
 			break
 		}
 
@@ -1860,6 +1888,9 @@
 			ins.as, ins.rs1 = AADDIW, ins.rd
 			inss = append(inss, ins)
 		}
+		if insSLLI != nil {
+			inss = append(inss, insSLLI)
+		}
 
 	case p.From.Type == obj.TYPE_CONST && p.To.Type != obj.TYPE_REG:
 		p.Ctxt.Diag("%v: constant load must target register", p)
@@ -2036,17 +2067,22 @@
 		return instructionsForStore(p, ins.as, p.To.Reg)
 
 	case ALRW, ALRD:
-		// Set aq to use acquire access ordering, which matches Go's memory requirements.
+		// Set aq to use acquire access ordering
 		ins.funct7 = 2
 		ins.rs1, ins.rs2 = uint32(p.From.Reg), REG_ZERO
 
 	case AADDI, AANDI, AORI, AXORI:
 		inss = instructionsForOpImmediate(p, ins.as, p.Reg)
 
-	case ASCW, ASCD, AAMOSWAPW, AAMOSWAPD, AAMOADDW, AAMOADDD, AAMOANDW, AAMOANDD, AAMOORW, AAMOORD,
+	case ASCW, ASCD:
+		// Set release access ordering
+		ins.funct7 = 1
+		ins.rd, ins.rs1, ins.rs2 = uint32(p.RegTo2), uint32(p.To.Reg), uint32(p.From.Reg)
+
+	case AAMOSWAPW, AAMOSWAPD, AAMOADDW, AAMOADDD, AAMOANDW, AAMOANDD, AAMOORW, AAMOORD,
 		AAMOXORW, AAMOXORD, AAMOMINW, AAMOMIND, AAMOMINUW, AAMOMINUD, AAMOMAXW, AAMOMAXD, AAMOMAXUW, AAMOMAXUD:
-		// Set aq to use acquire access ordering, which matches Go's memory requirements.
-		ins.funct7 = 2
+		// Set aqrl to use acquire & release access ordering
+		ins.funct7 = 3
 		ins.rd, ins.rs1, ins.rs2 = uint32(p.RegTo2), uint32(p.To.Reg), uint32(p.From.Reg)
 
 	case AECALL, AEBREAK, ARDCYCLE, ARDTIME, ARDINSTRET:
@@ -2146,6 +2182,16 @@
 		// FNEGD rs, rd -> FSGNJND rs, rs, rd
 		ins.as = AFSGNJND
 		ins.rs1 = uint32(p.From.Reg)
+
+	case ASLLI, ASRLI, ASRAI:
+		if ins.imm < 0 || ins.imm > 63 {
+			p.Ctxt.Diag("%v: shift amount out of range 0 to 63", p)
+		}
+
+	case ASLLIW, ASRLIW, ASRAIW:
+		if ins.imm < 0 || ins.imm > 31 {
+			p.Ctxt.Diag("%v: shift amount out of range 0 to 31", p)
+		}
 	}
 	return inss
 }
diff --git a/src/cmd/internal/obj/s390x/a.out.go b/src/cmd/internal/obj/s390x/a.out.go
index c1bda1f..cdfb6dd 100644
--- a/src/cmd/internal/obj/s390x/a.out.go
+++ b/src/cmd/internal/obj/s390x/a.out.go
@@ -994,6 +994,9 @@
 	AWORD
 	ADWORD
 
+	// Breakpoint
+	ABRRK
+
 	// end marker
 	ALAST
 
diff --git a/src/cmd/internal/obj/s390x/anames.go b/src/cmd/internal/obj/s390x/anames.go
index 8b2a76b..3af15a5 100644
--- a/src/cmd/internal/obj/s390x/anames.go
+++ b/src/cmd/internal/obj/s390x/anames.go
@@ -716,5 +716,6 @@
 	"BYTE",
 	"WORD",
 	"DWORD",
+	"BRRK",
 	"LAST",
 }
diff --git a/src/cmd/internal/obj/s390x/asmz.go b/src/cmd/internal/obj/s390x/asmz.go
index d8a36c4..d9f7606 100644
--- a/src/cmd/internal/obj/s390x/asmz.go
+++ b/src/cmd/internal/obj/s390x/asmz.go
@@ -333,6 +333,9 @@
 	// undefined (deliberate illegal instruction)
 	{i: 78, as: obj.AUNDEF},
 
+	// Break point instruction(0x0001 opcode)
+	{i: 73, as: ABRRK},
+
 	// 2 byte no-operation
 	{i: 66, as: ANOPH},
 
@@ -2470,6 +2473,7 @@
 	op_XSCH    uint32 = 0xB276 // FORMAT_S          CANCEL SUBCHANNEL
 	op_XY      uint32 = 0xE357 // FORMAT_RXY1       EXCLUSIVE OR (32)
 	op_ZAP     uint32 = 0xF800 // FORMAT_SS2        ZERO AND ADD
+	op_BRRK    uint32 = 0x0001 // FORMAT_E          BREAKPOINT
 
 	// added in z13
 	op_CXPT   uint32 = 0xEDAF // 	RSL-b	CONVERT FROM PACKED (to extended DFP)
@@ -3605,6 +3609,9 @@
 			zSIL(opcode, uint32(r), uint32(d), uint32(v), asm)
 		}
 
+	case 73: //Illegal opcode with SIGTRAP Exception
+		zE(op_BRRK, asm)
+
 	case 74: // mov reg addr (including relocation)
 		i2 := c.regoff(&p.To)
 		switch p.As {
diff --git a/src/cmd/internal/obj/s390x/objz.go b/src/cmd/internal/obj/s390x/objz.go
index 4e84756..80b233d 100644
--- a/src/cmd/internal/obj/s390x/objz.go
+++ b/src/cmd/internal/obj/s390x/objz.go
@@ -33,6 +33,7 @@
 	"cmd/internal/obj"
 	"cmd/internal/objabi"
 	"cmd/internal/sys"
+	"internal/abi"
 	"log"
 	"math"
 )
@@ -313,7 +314,7 @@
 				autosize += int32(c.ctxt.Arch.FixedFrameSize)
 			}
 
-			if p.Mark&LEAF != 0 && autosize < objabi.StackSmall {
+			if p.Mark&LEAF != 0 && autosize < abi.StackSmall {
 				// A leaf function with a small stack can be marked
 				// NOSPLIT, avoiding a stack check.
 				p.From.Sym.Set(obj.AttrNoSplit, true)
@@ -568,8 +569,8 @@
 
 		if p.To.Type == obj.TYPE_REG && p.To.Reg == REGSP && p.Spadj == 0 {
 			f := c.cursym.Func()
-			if f.FuncFlag&objabi.FuncFlag_SPWRITE == 0 {
-				c.cursym.Func().FuncFlag |= objabi.FuncFlag_SPWRITE
+			if f.FuncFlag&abi.FuncFlagSPWrite == 0 {
+				c.cursym.Func().FuncFlag |= abi.FuncFlagSPWrite
 				if ctxt.Debugvlog || !ctxt.IsAsm {
 					ctxt.Logf("auto-SPWRITE: %s\n", c.cursym.Name)
 					if !ctxt.IsAsm {
@@ -662,7 +663,7 @@
 	// unnecessarily. See issue #35470.
 	p = c.ctxt.StartUnsafePoint(p, c.newprog)
 
-	if framesize <= objabi.StackSmall {
+	if framesize <= abi.StackSmall {
 		// small stack: SP < stackguard
 		//	CMPUBGE	stackguard, SP, label-of-call-to-morestack
 
@@ -678,8 +679,8 @@
 
 	// large stack: SP-framesize < stackguard-StackSmall
 
-	offset := int64(framesize) - objabi.StackSmall
-	if framesize > objabi.StackBig {
+	offset := int64(framesize) - abi.StackSmall
+	if framesize > abi.StackBig {
 		// Such a large stack we need to protect against underflow.
 		// The runtime guarantees SP > objabi.StackBig, but
 		// framesize is large enough that SP-framesize may
diff --git a/src/cmd/internal/obj/sym.go b/src/cmd/internal/obj/sym.go
index e5b052c..2b885f6 100644
--- a/src/cmd/internal/obj/sym.go
+++ b/src/cmd/internal/obj/sym.go
@@ -85,7 +85,7 @@
 	return ctxt.LookupABIInit(name, abi, nil)
 }
 
-// LookupABI looks up a symbol with the given ABI.
+// LookupABIInit looks up a symbol with the given ABI.
 // If it does not exist, it creates it and
 // passes it to init for one-time initialization.
 func (ctxt *Link) LookupABIInit(name string, abi ABI, init func(s *LSym)) *LSym {
@@ -189,11 +189,15 @@
 // in which case all the symbols are non-package (for now).
 func (ctxt *Link) NumberSyms() {
 	if ctxt.Headtype == objabi.Haix {
-		// Data must be sorted to keep a constant order in TOC symbols.
-		// As they are created during Progedit, two symbols can be switched between
-		// two different compilations. Therefore, BuildID will be different.
-		// TODO: find a better place and optimize to only sort TOC symbols
-		sort.Slice(ctxt.Data, func(i, j int) bool {
+		// Data must be in a reliable order for reproducible builds.
+		// The original entries are in a reliable order, but the TOC symbols
+		// that are added in Progedit are added by different goroutines
+		// that can be scheduled independently. We need to reorder those
+		// symbols reliably. Sort by name but use a stable sort, so that
+		// any original entries with the same name (all DWARFVAR symbols
+		// have empty names but different relocation sets) are not shuffled.
+		// TODO: Find a better place and optimize to only sort TOC symbols.
+		sort.SliceStable(ctxt.Data, func(i, j int) bool {
 			return ctxt.Data[i].Name < ctxt.Data[j].Name
 		})
 	}
@@ -367,6 +371,8 @@
 						fn(aux)
 					}
 					ctxt.traverseFuncAux(flag, s, f, files)
+				} else if v := s.VarInfo(); v != nil {
+					fnNoNil(v.dwarfInfoSym)
 				}
 			}
 			if flag&traversePcdata != 0 && s.Type == objabi.STEXT {
@@ -416,16 +422,16 @@
 		}
 	}
 
-	dwsyms := []*LSym{fninfo.dwarfRangesSym, fninfo.dwarfLocSym, fninfo.dwarfDebugLinesSym, fninfo.dwarfInfoSym}
-	for _, dws := range dwsyms {
-		if dws == nil || dws.Size == 0 {
+	auxsyms := []*LSym{fninfo.dwarfRangesSym, fninfo.dwarfLocSym, fninfo.dwarfDebugLinesSym, fninfo.dwarfInfoSym, fninfo.WasmImportSym, fninfo.sehUnwindInfoSym}
+	for _, s := range auxsyms {
+		if s == nil || s.Size == 0 {
 			continue
 		}
-		fn(fsym, dws)
+		fn(fsym, s)
 		if flag&traverseRefs != 0 {
-			for _, r := range dws.R {
+			for _, r := range s.R {
 				if r.Sym != nil {
-					fn(dws, r.Sym)
+					fn(s, r.Sym)
 				}
 			}
 		}
@@ -443,10 +449,11 @@
 					fn(s, s.Gotype)
 				}
 			}
-			if s.Type != objabi.STEXT {
-				continue
+			if s.Type == objabi.STEXT {
+				ctxt.traverseFuncAux(flag, s, fn, files)
+			} else if v := s.VarInfo(); v != nil && v.dwarfInfoSym != nil {
+				fn(s, v.dwarfInfoSym)
 			}
-			ctxt.traverseFuncAux(flag, s, fn, files)
 		}
 	}
 }
diff --git a/src/cmd/internal/obj/textflag.go b/src/cmd/internal/obj/textflag.go
index 5ae7502..bf9c8c9 100644
--- a/src/cmd/internal/obj/textflag.go
+++ b/src/cmd/internal/obj/textflag.go
@@ -55,4 +55,7 @@
 
 	// Function is an ABI wrapper.
 	ABIWRAPPER = 4096
+
+	// Function is a compiler-generated package init function.
+	PKGINIT = 8192
 )
diff --git a/src/cmd/internal/obj/util.go b/src/cmd/internal/obj/util.go
index b219a07..3a071c2 100644
--- a/src/cmd/internal/obj/util.go
+++ b/src/cmd/internal/obj/util.go
@@ -6,9 +6,8 @@
 
 import (
 	"bytes"
-	"cmd/internal/objabi"
-	"cmd/internal/src"
 	"fmt"
+	"internal/abi"
 	"internal/buildcfg"
 	"io"
 	"strings"
@@ -48,10 +47,6 @@
 	return pos.Filename()
 }
 
-func (p *Prog) AllPos(result []src.Pos) []src.Pos {
-	return p.Ctxt.AllPos(p.Pos, result)
-}
-
 var armCondCode = []string{
 	".EQ",
 	".NE",
@@ -202,6 +197,7 @@
 	if p.To.Type != TYPE_NONE {
 		io.WriteString(w, sep)
 		WriteDconv(w, p, &p.To)
+		sep = ", "
 	}
 	if p.RegTo2 != REG_NONE {
 		fmt.Fprintf(w, "%s%v", sep, Rconv(int(p.RegTo2)))
@@ -312,7 +308,7 @@
 		}
 
 	case TYPE_TEXTSIZE:
-		if a.Val.(int32) == objabi.ArgsSizeUnknown {
+		if a.Val.(int32) == abi.ArgsSizeUnknown {
 			fmt.Fprintf(w, "$%d", a.Offset)
 		} else {
 			fmt.Fprintf(w, "$%d-%d", a.Offset, a.Val.(int32))
diff --git a/src/cmd/internal/obj/wasm/a.out.go b/src/cmd/internal/obj/wasm/a.out.go
index 83ce0a6..0262630 100644
--- a/src/cmd/internal/obj/wasm/a.out.go
+++ b/src/cmd/internal/obj/wasm/a.out.go
@@ -18,8 +18,7 @@
  *	wasm
  */
 const (
-	ACallImport = obj.ABaseWasm + obj.A_ARCHSPECIFIC + iota
-	AGet
+	AGet = obj.ABaseWasm + obj.A_ARCHSPECIFIC + iota
 	ASet
 	ATee
 	ANot // alias for I32Eqz
diff --git a/src/cmd/internal/obj/wasm/anames.go b/src/cmd/internal/obj/wasm/anames.go
index c9bc15d..6f1a662 100644
--- a/src/cmd/internal/obj/wasm/anames.go
+++ b/src/cmd/internal/obj/wasm/anames.go
@@ -5,8 +5,7 @@
 import "cmd/internal/obj"
 
 var Anames = []string{
-	obj.A_ARCHSPECIFIC: "CallImport",
-	"Get",
+	obj.A_ARCHSPECIFIC: "Get",
 	"Set",
 	"Tee",
 	"Not",
diff --git a/src/cmd/internal/obj/wasm/wasmobj.go b/src/cmd/internal/obj/wasm/wasmobj.go
index 9b0aabe..23f51f8 100644
--- a/src/cmd/internal/obj/wasm/wasmobj.go
+++ b/src/cmd/internal/obj/wasm/wasmobj.go
@@ -11,6 +11,7 @@
 	"cmd/internal/sys"
 	"encoding/binary"
 	"fmt"
+	"internal/abi"
 	"io"
 	"math"
 )
@@ -100,7 +101,6 @@
 	ATee:          true,
 	ACall:         true,
 	ACallIndirect: true,
-	ACallImport:   true,
 	ABr:           true,
 	ABrIf:         true,
 	ABrTable:      true,
@@ -127,7 +127,6 @@
 var (
 	morestack       *obj.LSym
 	morestackNoCtxt *obj.LSym
-	gcWriteBarrier  *obj.LSym
 	sigpanic        *obj.LSym
 )
 
@@ -136,10 +135,17 @@
 	WasmImport = 1 << 0
 )
 
+const (
+	// This is a special wasm module name that when used as the module name
+	// in //go:wasmimport will cause the generated code to pass the stack pointer
+	// directly to the imported function. In other words, any function that
+	// uses the gojs module understands the internal Go WASM ABI directly.
+	GojsModule = "gojs"
+)
+
 func instinit(ctxt *obj.Link) {
 	morestack = ctxt.Lookup("runtime.morestack")
 	morestackNoCtxt = ctxt.Lookup("runtime.morestack_noctxt")
-	gcWriteBarrier = ctxt.LookupABI("runtime.gcWriteBarrier", obj.ABIInternal)
 	sigpanic = ctxt.LookupABI("runtime.sigpanic", obj.ABIInternal)
 }
 
@@ -179,7 +185,121 @@
 	s.Func().Args = s.Func().Text.To.Val.(int32)
 	s.Func().Locals = int32(framesize)
 
-	if s.Func().Text.From.Sym.Wrapper() {
+	// If the function exits just to call out to a wasmimport, then
+	// generate the code to translate from our internal Go-stack
+	// based call convention to the native webassembly call convention.
+	if wi := s.Func().WasmImport; wi != nil {
+		s.Func().WasmImportSym = wi.CreateSym(ctxt)
+		p := s.Func().Text
+		if p.Link != nil {
+			panic("wrapper functions for WASM imports should not have a body")
+		}
+		to := obj.Addr{
+			Type: obj.TYPE_MEM,
+			Name: obj.NAME_EXTERN,
+			Sym:  s,
+		}
+
+		// If the module that the import is for is our magic "gojs" module, then this
+		// indicates that the called function understands the Go stack-based call convention
+		// so we just pass the stack pointer to it, knowing it will read the params directly
+		// off the stack and push the results into memory based on the stack pointer.
+		if wi.Module == GojsModule {
+			// The called function has a signature of 'func(sp int)'. It has access to the memory
+			// value somewhere to be able to address the memory based on the "sp" value.
+
+			p = appendp(p, AGet, regAddr(REG_SP))
+			p = appendp(p, ACall, to)
+
+			p.Mark = WasmImport
+		} else {
+			if len(wi.Results) > 1 {
+				// TODO(evanphx) implement support for the multi-value proposal:
+				// https://github.com/WebAssembly/multi-value/blob/master/proposals/multi-value/Overview.md
+				panic("invalid results type") // impossible until multi-value proposal has landed
+			}
+			if len(wi.Results) == 1 {
+				// If we have a result (rather than returning nothing at all), then
+				// we'll write the result to the Go stack relative to the current stack pointer.
+				// We cache the current stack pointer value on the wasm stack here and then use
+				// it after the Call instruction to store the result.
+				p = appendp(p, AGet, regAddr(REG_SP))
+			}
+			for _, f := range wi.Params {
+				// Each load instructions will consume the value of sp on the stack, so
+				// we need to read sp for each param. WASM appears to not have a stack dup instruction
+				// (a strange omission for a stack-based VM), if it did, we'd be using the dup here.
+				p = appendp(p, AGet, regAddr(REG_SP))
+
+				// Offset is the location of the param on the Go stack (ie relative to sp).
+				// Because of our call convention, the parameters are located an additional 8 bytes
+				// from sp because we store the return address as an int64 at the bottom of the stack.
+				// Ie the stack looks like [return_addr, param3, param2, param1, etc]
+
+				// Ergo, we add 8 to the true byte offset of the param to skip the return address.
+				loadOffset := f.Offset + 8
+
+				// We're reading the value from the Go stack onto the WASM stack and leaving it there
+				// for CALL to pick them up.
+				switch f.Type {
+				case obj.WasmI32:
+					p = appendp(p, AI32Load, constAddr(loadOffset))
+				case obj.WasmI64:
+					p = appendp(p, AI64Load, constAddr(loadOffset))
+				case obj.WasmF32:
+					p = appendp(p, AF32Load, constAddr(loadOffset))
+				case obj.WasmF64:
+					p = appendp(p, AF64Load, constAddr(loadOffset))
+				case obj.WasmPtr:
+					p = appendp(p, AI64Load, constAddr(loadOffset))
+					p = appendp(p, AI32WrapI64)
+				default:
+					panic("bad param type")
+				}
+			}
+
+			// The call instruction is marked as being for a wasm import so that a later phase
+			// will generate relocation information that allows us to patch this with then
+			// offset of the imported function in the wasm imports.
+			p = appendp(p, ACall, to)
+			p.Mark = WasmImport
+
+			if len(wi.Results) == 1 {
+				f := wi.Results[0]
+
+				// Much like with the params, we need to adjust the offset we store the result value
+				// to by 8 bytes to account for the return address on the Go stack.
+				storeOffset := f.Offset + 8
+
+				// This code is paired the code above that reads the stack pointer onto the wasm
+				// stack. We've done this so we have a consistent view of the sp value as it might
+				// be manipulated by the call and we want to ignore that manipulation here.
+				switch f.Type {
+				case obj.WasmI32:
+					p = appendp(p, AI32Store, constAddr(storeOffset))
+				case obj.WasmI64:
+					p = appendp(p, AI64Store, constAddr(storeOffset))
+				case obj.WasmF32:
+					p = appendp(p, AF32Store, constAddr(storeOffset))
+				case obj.WasmF64:
+					p = appendp(p, AF64Store, constAddr(storeOffset))
+				case obj.WasmPtr:
+					p = appendp(p, AI64ExtendI32U)
+					p = appendp(p, AI64Store, constAddr(storeOffset))
+				default:
+					panic("bad result type")
+				}
+			}
+		}
+
+		p = appendp(p, obj.ARET)
+
+		// It should be 0 already, but we'll set it to 0 anyway just to be sure
+		// that the code below which adds frame expansion code to the function body
+		// isn't run. We don't want the frame expansion code because our function
+		// body is just the code to translate and call the imported function.
+		framesize = 0
+	} else if s.Func().Text.From.Sym.Wrapper() {
 		// if g._panic != nil && g._panic.argp == FP {
 		//   g._panic.argp = bottom-of-frame
 		// }
@@ -243,7 +363,9 @@
 		p.Spadj = int32(framesize)
 	}
 
-	needMoreStack := !s.Func().Text.From.Sym.NoSplit()
+	// If the framesize is 0, then imply nosplit because it's a specially
+	// generated function.
+	needMoreStack := framesize > 0 && !s.Func().Text.From.Sym.NoSplit()
 
 	// If the maymorestack debug option is enabled, insert the
 	// call to maymorestack *before* processing resume points so
@@ -351,7 +473,7 @@
 	if needMoreStack {
 		p := pMorestack
 
-		if framesize <= objabi.StackSmall {
+		if framesize <= abi.StackSmall {
 			// small stack: SP <= stackguard
 			// Get SP
 			// Get g
@@ -379,7 +501,7 @@
 			p = appendp(p, AGet, regAddr(REGG))
 			p = appendp(p, AI32WrapI64)
 			p = appendp(p, AI32Load, constAddr(2*int64(ctxt.Arch.PtrSize))) // G.stackguard0
-			p = appendp(p, AI32Const, constAddr(framesize-objabi.StackSmall))
+			p = appendp(p, AI32Const, constAddr(framesize-abi.StackSmall))
 			p = appendp(p, AI32Add)
 			p = appendp(p, AI32LeU)
 		}
@@ -514,11 +636,6 @@
 				panic("bad target for CALL")
 			}
 
-			// gcWriteBarrier has no return value, it never unwinds the stack
-			if call.To.Sym == gcWriteBarrier {
-				break
-			}
-
 			// return value of call is on the top of the stack, indicating whether to unwind the WebAssembly stack
 			if call.As == ACALLNORESUME && call.To.Sym != sigpanic { // sigpanic unwinds the stack, but it never resumes
 				// trying to unwind WebAssembly stack but call has no resume point, terminate with error
@@ -714,12 +831,6 @@
 			default:
 				panic("bad MOV type")
 			}
-
-		case ACallImport:
-			p.As = obj.ANOP
-			p = appendp(p, AGet, regAddr(REG_SP))
-			p = appendp(p, ACall, obj.Addr{Type: obj.TYPE_MEM, Name: obj.NAME_EXTERN, Sym: s})
-			p.Mark = WasmImport
 		}
 	}
 
@@ -794,19 +905,28 @@
 // Most of the Go functions has a single parameter (PC_B) in
 // Wasm ABI. This is a list of exceptions.
 var notUsePC_B = map[string]bool{
-	"_rt0_wasm_js":           true,
-	"wasm_export_run":        true,
-	"wasm_export_resume":     true,
-	"wasm_export_getsp":      true,
-	"wasm_pc_f_loop":         true,
-	"runtime.wasmDiv":        true,
-	"runtime.wasmTruncS":     true,
-	"runtime.wasmTruncU":     true,
-	"runtime.gcWriteBarrier": true,
-	"cmpbody":                true,
-	"memeqbody":              true,
-	"memcmp":                 true,
-	"memchr":                 true,
+	"_rt0_wasm_js":            true,
+	"_rt0_wasm_wasip1":        true,
+	"wasm_export_run":         true,
+	"wasm_export_resume":      true,
+	"wasm_export_getsp":       true,
+	"wasm_pc_f_loop":          true,
+	"gcWriteBarrier":          true,
+	"runtime.gcWriteBarrier1": true,
+	"runtime.gcWriteBarrier2": true,
+	"runtime.gcWriteBarrier3": true,
+	"runtime.gcWriteBarrier4": true,
+	"runtime.gcWriteBarrier5": true,
+	"runtime.gcWriteBarrier6": true,
+	"runtime.gcWriteBarrier7": true,
+	"runtime.gcWriteBarrier8": true,
+	"runtime.wasmDiv":         true,
+	"runtime.wasmTruncS":      true,
+	"runtime.wasmTruncU":      true,
+	"cmpbody":                 true,
+	"memeqbody":               true,
+	"memcmp":                  true,
+	"memchr":                  true,
 }
 
 func assemble(ctxt *obj.Link, s *obj.LSym, newprog obj.ProgAlloc) {
@@ -841,8 +961,8 @@
 	// Function starts with declaration of locals: numbers and types.
 	// Some functions use a special calling convention.
 	switch s.Name {
-	case "_rt0_wasm_js", "wasm_export_run", "wasm_export_resume", "wasm_export_getsp", "wasm_pc_f_loop",
-		"runtime.wasmDiv", "runtime.wasmTruncS", "runtime.wasmTruncU", "memeqbody":
+	case "_rt0_wasm_js", "_rt0_wasm_wasip1", "wasm_export_run", "wasm_export_resume", "wasm_export_getsp",
+		"wasm_pc_f_loop", "runtime.wasmDiv", "runtime.wasmTruncS", "runtime.wasmTruncU", "memeqbody":
 		varDecls = []*varDecl{}
 		useAssemblyRegMap()
 	case "memchr", "memcmp":
@@ -851,8 +971,18 @@
 	case "cmpbody":
 		varDecls = []*varDecl{{count: 2, typ: i64}}
 		useAssemblyRegMap()
-	case "runtime.gcWriteBarrier":
-		varDecls = []*varDecl{{count: 4, typ: i64}}
+	case "gcWriteBarrier":
+		varDecls = []*varDecl{{count: 5, typ: i64}}
+		useAssemblyRegMap()
+	case "runtime.gcWriteBarrier1",
+		"runtime.gcWriteBarrier2",
+		"runtime.gcWriteBarrier3",
+		"runtime.gcWriteBarrier4",
+		"runtime.gcWriteBarrier5",
+		"runtime.gcWriteBarrier6",
+		"runtime.gcWriteBarrier7",
+		"runtime.gcWriteBarrier8":
+		// no locals
 		useAssemblyRegMap()
 	default:
 		// Normal calling convention: PC_B as WebAssembly parameter. First local variable is local SP cache.
diff --git a/src/cmd/internal/obj/x86/aenum.go b/src/cmd/internal/obj/x86/aenum.go
index f0913d7..79cdd24 100644
--- a/src/cmd/internal/obj/x86/aenum.go
+++ b/src/cmd/internal/obj/x86/aenum.go
@@ -747,6 +747,7 @@
 	ARDGSBASEL
 	ARDGSBASEQ
 	ARDMSR
+	ARDPID
 	ARDPKRU
 	ARDPMC
 	ARDRANDL
diff --git a/src/cmd/internal/obj/x86/anames.go b/src/cmd/internal/obj/x86/anames.go
index 7869e36..3966381 100644
--- a/src/cmd/internal/obj/x86/anames.go
+++ b/src/cmd/internal/obj/x86/anames.go
@@ -745,6 +745,7 @@
 	"RDGSBASEL",
 	"RDGSBASEQ",
 	"RDMSR",
+	"RDPID",
 	"RDPKRU",
 	"RDPMC",
 	"RDRANDL",
diff --git a/src/cmd/internal/obj/x86/asm6.go b/src/cmd/internal/obj/x86/asm6.go
index 953eedc..718da6a 100644
--- a/src/cmd/internal/obj/x86/asm6.go
+++ b/src/cmd/internal/obj/x86/asm6.go
@@ -775,7 +775,7 @@
 }
 
 // It should never have more than 1 entry,
-// because some optab entries you opcode secuences that
+// because some optab entries have opcode sequences that
 // are longer than 2 bytes (zoffset=2 here),
 // ROUNDPD and ROUNDPS and recently added BLENDPD,
 // to name a few.
@@ -1774,6 +1774,7 @@
 	{ALSSW, ym_rl, Pe, opBytes{0x0f, 0xb2}},
 	{ALSSL, ym_rl, Px, opBytes{0x0f, 0xb2}},
 	{ALSSQ, ym_rl, Pw, opBytes{0x0f, 0xb2}},
+	{ARDPID, yrdrand, Pf3, opBytes{0xc7, 07}},
 
 	{ABLENDPD, yxshuf, Pq, opBytes{0x3a, 0x0d, 0}},
 	{ABLENDPS, yxshuf, Pq, opBytes{0x3a, 0x0c, 0}},
@@ -2551,22 +2552,6 @@
 		}
 	}
 
-	if ctxt.Arch.Family == sys.I386 {
-		if a.Index == REG_TLS && ctxt.Flag_shared {
-			// When building for inclusion into a shared library, an instruction of the form
-			//     MOVL off(CX)(TLS*1), AX
-			// becomes
-			//     mov %gs:off(%ecx), %eax
-			// which assumes that the correct TLS offset has been loaded into %ecx (today
-			// there is only one TLS variable -- g -- so this is OK). When not building for
-			// a shared library the instruction it becomes
-			//     mov 0x0(%ecx), %eax
-			// and a R_TLS_LE relocation, and so does not require a prefix.
-			return 0x65 // GS
-		}
-		return 0
-	}
-
 	switch a.Index {
 	case REG_CS:
 		return 0x2e
@@ -2582,11 +2567,18 @@
 			// When building for inclusion into a shared library, an instruction of the form
 			//     MOV off(CX)(TLS*1), AX
 			// becomes
-			//     mov %fs:off(%rcx), %rax
-			// which assumes that the correct TLS offset has been loaded into %rcx (today
+			//     mov %gs:off(%ecx), %eax // on i386
+			//     mov %fs:off(%rcx), %rax // on amd64
+			// which assumes that the correct TLS offset has been loaded into CX (today
 			// there is only one TLS variable -- g -- so this is OK). When not building for
-			// a shared library the instruction does not require a prefix.
-			return 0x64
+			// a shared library the instruction it becomes
+			//     mov 0x0(%ecx), %eax // on i386
+			//     mov 0x0(%rcx), %rax // on amd64
+			// and a R_TLS_LE relocation, and so does not require a prefix.
+			if ctxt.Arch.Family == sys.I386 {
+				return 0x65 // GS
+			}
+			return 0x64 // FS
 		}
 
 	case REG_FS:
@@ -3725,7 +3717,7 @@
 
 	if REG_AX <= base && base <= REG_R15 {
 		if a.Index == REG_TLS && !ctxt.Flag_shared && !isAndroid &&
-			!(ctxt.Headtype == objabi.Hwindows && ctxt.Arch.Family == sys.AMD64) {
+			ctxt.Headtype != objabi.Hwindows {
 			rel = obj.Reloc{}
 			rel.Type = objabi.R_TLS_LE
 			rel.Siz = 4
@@ -4079,6 +4071,16 @@
 		if !evex.ZeroingEnabled() {
 			ctxt.Diag("unsupported zeroing: %v", p)
 		}
+		if k == nil {
+			// When you request zeroing you must specify a mask register.
+			// See issue 57952.
+			ctxt.Diag("mask register must be specified for .Z instructions: %v", p)
+		} else if k.Reg == REG_K0 {
+			// The mask register must not be K0. That restriction is already
+			// handled by the Yknot0 restriction in the opcode tables, so we
+			// won't ever reach here. But put something sensible here just in case.
+			ctxt.Diag("mask register must not be K0 for .Z instructions: %v", p)
+		}
 		evexZ = 1
 	}
 	switch {
@@ -4241,6 +4243,11 @@
 		AVPGATHERQD,
 		AVPGATHERDQ,
 		AVPGATHERQQ:
+		if p.GetFrom3() == nil {
+			// gathers need a 3rd arg. See issue 58822.
+			ctxt.Diag("need a third arg for gather instruction: %v", p)
+			return
+		}
 		// AVX512 gather requires explicit K mask.
 		if p.GetFrom3().Reg >= REG_K0 && p.GetFrom3().Reg <= REG_K7 {
 			if !avx512gatherValid(ctxt, p) {
@@ -5137,19 +5144,6 @@
 							pp.From.Index = REG_NONE
 							ab.Put1(0x8B)
 							ab.asmand(ctxt, cursym, p, &pp.From, &p.To)
-
-						case objabi.Hwindows:
-							// Windows TLS base is always 0x14(FS).
-							pp.From = p.From
-
-							pp.From.Type = obj.TYPE_MEM
-							pp.From.Reg = REG_FS
-							pp.From.Offset = 0x14
-							pp.From.Index = REG_NONE
-							pp.From.Scale = 0
-							ab.Put2(0x64, // FS
-								0x8B)
-							ab.asmand(ctxt, cursym, p, &pp.From, &p.To)
 						}
 						break
 					}
diff --git a/src/cmd/internal/obj/x86/obj6.go b/src/cmd/internal/obj/x86/obj6.go
index 85a4260..fc4007e 100644
--- a/src/cmd/internal/obj/x86/obj6.go
+++ b/src/cmd/internal/obj/x86/obj6.go
@@ -35,6 +35,7 @@
 	"cmd/internal/objabi"
 	"cmd/internal/src"
 	"cmd/internal/sys"
+	"internal/abi"
 	"log"
 	"math"
 	"path"
@@ -158,11 +159,11 @@
 		}
 	}
 
-	// Android and Win64 use a tls offset determined at runtime. Rewrite
+	// Android and Windows use a tls offset determined at runtime. Rewrite
 	//	MOVQ TLS, BX
 	// to
 	//	MOVQ runtime.tls_g(SB), BX
-	if (isAndroid || (ctxt.Headtype == objabi.Hwindows && ctxt.Arch.Family == sys.AMD64)) &&
+	if (isAndroid || ctxt.Headtype == objabi.Hwindows) &&
 		(p.As == AMOVQ || p.As == AMOVL) && p.From.Type == obj.TYPE_REG && p.From.Reg == REG_TLS && p.To.Type == obj.TYPE_REG && REG_AX <= p.To.Reg && p.To.Reg <= REG_R15 {
 		p.From.Type = obj.TYPE_MEM
 		p.From.Name = obj.NAME_EXTERN
@@ -170,17 +171,23 @@
 		p.From.Sym = ctxt.Lookup("runtime.tls_g")
 		p.From.Index = REG_NONE
 		if ctxt.Headtype == objabi.Hwindows {
-			// Win64 requires an additional indirection
+			// Windows requires an additional indirection
 			// to retrieve the TLS pointer,
-			// as runtime.tls_g contains the TLS offset from GS.
-			// add
+			// as runtime.tls_g contains the TLS offset from GS or FS.
+			// on AMD64 add
 			//	MOVQ 0(BX)(GS*1), BX
+			// on 386 add
+			//	MOVQ 0(BX)(FS*1), BX4
 			q := obj.Appendp(p, newprog)
 			q.As = p.As
 			q.From = obj.Addr{}
 			q.From.Type = obj.TYPE_MEM
 			q.From.Reg = p.To.Reg
-			q.From.Index = REG_GS
+			if ctxt.Arch.Family == sys.AMD64 {
+				q.From.Index = REG_GS
+			} else {
+				q.From.Index = REG_FS
+			}
 			q.From.Scale = 1
 			q.From.Offset = 0
 			q.To = p.To
@@ -491,6 +498,9 @@
 	p2.As = p.As
 	p2.From = p.From
 	p2.To = p.To
+	if from3 := p.GetFrom3(); from3 != nil {
+		p2.AddRestSource(*from3)
+	}
 	if p.From.Name == obj.NAME_EXTERN {
 		p2.From.Reg = reg
 		p2.From.Name = obj.NAME_NONE
@@ -608,21 +618,18 @@
 	var bpsize int
 	if ctxt.Arch.Family == sys.AMD64 &&
 		!p.From.Sym.NoFrame() && // (1) below
-		!(autoffset == 0 && p.From.Sym.NoSplit()) && // (2) below
-		!(autoffset == 0 && !hasCall) { // (3) below
+		!(autoffset == 0 && !hasCall) { // (2) below
 		// Make room to save a base pointer.
 		// There are 2 cases we must avoid:
 		// 1) If noframe is set (which we do for functions which tail call).
-		// 2) Scary runtime internals which would be all messed up by frame pointers.
-		//    We detect these using a heuristic: frameless nosplit functions.
-		//    TODO: Maybe someday we label them all with NOFRAME and get rid of this heuristic.
 		// For performance, we also want to avoid:
-		// 3) Frameless leaf functions
+		// 2) Frameless leaf functions
 		bpsize = ctxt.Arch.PtrSize
 		autoffset += int32(bpsize)
 		p.To.Offset += int64(bpsize)
 	} else {
 		bpsize = 0
+		p.From.Sym.Set(obj.AttrNoFrame, true)
 	}
 
 	textarg := int64(p.To.Val.(int32))
@@ -635,7 +642,7 @@
 	}
 
 	// TODO(rsc): Remove 'ctxt.Arch.Family == sys.AMD64 &&'.
-	if ctxt.Arch.Family == sys.AMD64 && autoffset < objabi.StackSmall && !p.From.Sym.NoSplit() {
+	if ctxt.Arch.Family == sys.AMD64 && autoffset < abi.StackSmall && !p.From.Sym.NoSplit() {
 		leaf := true
 	LeafSearch:
 		for q := p; q != nil; q = q.Link {
@@ -649,7 +656,7 @@
 				}
 				fallthrough
 			case obj.ADUFFCOPY, obj.ADUFFZERO:
-				if autoffset >= objabi.StackSmall-8 {
+				if autoffset >= abi.StackSmall-8 {
 					leaf = false
 					break LeafSearch
 				}
@@ -677,50 +684,45 @@
 		p, regg = loadG(ctxt, cursym, p, newprog)
 	}
 
-	// Delve debugger would like the next instruction to be noted as the end of the function prologue.
-	// TODO: are there other cases (e.g., wrapper functions) that need marking?
-	markedPrologue := false
-
-	if autoffset != 0 {
-		if autoffset%int32(ctxt.Arch.RegSize) != 0 {
-			ctxt.Diag("unaligned stack size %d", autoffset)
-		}
-		p = obj.Appendp(p, newprog)
-		p.As = AADJSP
-		p.From.Type = obj.TYPE_CONST
-		p.From.Offset = int64(autoffset)
-		p.Spadj = autoffset
-		p.Pos = p.Pos.WithXlogue(src.PosPrologueEnd)
-		markedPrologue = true
-	}
-
 	if bpsize > 0 {
 		// Save caller's BP
 		p = obj.Appendp(p, newprog)
 
-		p.As = AMOVQ
+		p.As = APUSHQ
 		p.From.Type = obj.TYPE_REG
 		p.From.Reg = REG_BP
-		p.To.Type = obj.TYPE_MEM
-		p.To.Reg = REG_SP
-		p.To.Scale = 1
-		p.To.Offset = int64(autoffset) - int64(bpsize)
-		if !markedPrologue {
-			p.Pos = p.Pos.WithXlogue(src.PosPrologueEnd)
-		}
 
 		// Move current frame to BP
 		p = obj.Appendp(p, newprog)
 
-		p.As = ALEAQ
-		p.From.Type = obj.TYPE_MEM
+		p.As = AMOVQ
+		p.From.Type = obj.TYPE_REG
 		p.From.Reg = REG_SP
-		p.From.Scale = 1
-		p.From.Offset = int64(autoffset) - int64(bpsize)
 		p.To.Type = obj.TYPE_REG
 		p.To.Reg = REG_BP
 	}
 
+	if autoffset%int32(ctxt.Arch.RegSize) != 0 {
+		ctxt.Diag("unaligned stack size %d", autoffset)
+	}
+
+	// localoffset is autoffset discounting the frame pointer,
+	// which has already been allocated in the stack.
+	localoffset := autoffset - int32(bpsize)
+	if localoffset != 0 {
+		p = obj.Appendp(p, newprog)
+		p.As = AADJSP
+		p.From.Type = obj.TYPE_CONST
+		p.From.Offset = int64(localoffset)
+		p.Spadj = localoffset
+	}
+
+	// Delve debugger would like the next instruction to be noted as the end of the function prologue.
+	// TODO: are there other cases (e.g., wrapper functions) that need marking?
+	if autoffset != 0 {
+		p.Pos = p.Pos.WithXlogue(src.PosPrologueEnd)
+	}
+
 	if cursym.Func().Text.From.Sym.Wrapper() {
 		// if g._panic != nil && g._panic.argp == FP {
 		//   g._panic.argp = bottom-of-frame
@@ -866,8 +868,8 @@
 		default:
 			if p.To.Type == obj.TYPE_REG && p.To.Reg == REG_SP && p.As != ACMPL && p.As != ACMPQ {
 				f := cursym.Func()
-				if f.FuncFlag&objabi.FuncFlag_SPWRITE == 0 {
-					f.FuncFlag |= objabi.FuncFlag_SPWRITE
+				if f.FuncFlag&abi.FuncFlagSPWrite == 0 {
+					f.FuncFlag |= abi.FuncFlagSPWrite
 					if ctxt.Debugvlog || !ctxt.IsAsm {
 						ctxt.Logf("auto-SPWRITE: %s %v\n", cursym.Name, p)
 						if !ctxt.IsAsm {
@@ -926,24 +928,23 @@
 		if autoffset != 0 {
 			to := p.To // Keep To attached to RET for retjmp below
 			p.To = obj.Addr{}
-			if bpsize > 0 {
-				// Restore caller's BP
-				p.As = AMOVQ
-
-				p.From.Type = obj.TYPE_MEM
-				p.From.Reg = REG_SP
-				p.From.Scale = 1
-				p.From.Offset = int64(autoffset) - int64(bpsize)
-				p.To.Type = obj.TYPE_REG
-				p.To.Reg = REG_BP
+			if localoffset != 0 {
+				p.As = AADJSP
+				p.From.Type = obj.TYPE_CONST
+				p.From.Offset = int64(-localoffset)
+				p.Spadj = -localoffset
 				p = obj.Appendp(p, newprog)
 			}
 
-			p.As = AADJSP
-			p.From.Type = obj.TYPE_CONST
-			p.From.Offset = int64(-autoffset)
-			p.Spadj = -autoffset
-			p = obj.Appendp(p, newprog)
+			if bpsize > 0 {
+				// Restore caller's BP
+				p.As = APOPQ
+				p.To.Type = obj.TYPE_REG
+				p.To.Reg = REG_BP
+				p.Spadj = -int32(bpsize)
+				p = obj.Appendp(p, newprog)
+			}
+
 			p.As = obj.ARET
 			p.To = to
 
@@ -1087,7 +1088,7 @@
 	p, rg = loadG(ctxt, cursym, p, newprog)
 
 	var q1 *obj.Prog
-	if framesize <= objabi.StackSmall {
+	if framesize <= abi.StackSmall {
 		// small stack: SP <= stackguard
 		//	CMPQ SP, stackguard
 		p = obj.Appendp(p, newprog)
@@ -1107,7 +1108,7 @@
 		// cleared, but we'll still call morestack, which will double the stack
 		// unnecessarily. See issue #35470.
 		p = ctxt.StartUnsafePoint(p, newprog)
-	} else if framesize <= objabi.StackBig {
+	} else if framesize <= abi.StackBig {
 		// large stack: SP-framesize <= stackguard-StackSmall
 		//	LEAQ -xxx(SP), tmp
 		//	CMPQ tmp, stackguard
@@ -1116,7 +1117,7 @@
 		p.As = lea
 		p.From.Type = obj.TYPE_MEM
 		p.From.Reg = REG_SP
-		p.From.Offset = -(int64(framesize) - objabi.StackSmall)
+		p.From.Offset = -(int64(framesize) - abi.StackSmall)
 		p.To.Type = obj.TYPE_REG
 		p.To.Reg = tmp
 
@@ -1159,7 +1160,7 @@
 		p = obj.Appendp(p, newprog)
 		p.As = sub
 		p.From.Type = obj.TYPE_CONST
-		p.From.Offset = int64(framesize) - objabi.StackSmall
+		p.From.Offset = int64(framesize) - abi.StackSmall
 		p.To.Type = obj.TYPE_REG
 		p.To.Reg = tmp
 
@@ -1255,29 +1256,6 @@
 	return addrMentionsR15(&p.From) || addrMentionsR15(&p.To) || isR15(p.Reg) || addrMentionsR15(p.GetFrom3())
 }
 
-// progOverwritesR15 reports whether p writes to R15 and does not depend on
-// the previous value of R15.
-func progOverwritesR15(p *obj.Prog) bool {
-	if !(p.To.Type == obj.TYPE_REG && isR15(p.To.Reg)) {
-		// Not writing to R15.
-		return false
-	}
-	if (p.As == AXORL || p.As == AXORQ) && p.From.Type == obj.TYPE_REG && isR15(p.From.Reg) {
-		// These look like uses of R15, but aren't, so we must detect these
-		// before the use check below.
-		return true
-	}
-	if addrMentionsR15(&p.From) || isR15(p.Reg) || addrMentionsR15(p.GetFrom3()) {
-		// use before overwrite
-		return false
-	}
-	if p.As == AMOVL || p.As == AMOVQ || p.As == APOPQ {
-		return true
-		// TODO: MOVB might be ok if we only ever use R15B.
-	}
-	return false
-}
-
 func addrUsesGlobal(a *obj.Addr) bool {
 	if a == nil {
 		return false
@@ -1297,6 +1275,114 @@
 	return addrUsesGlobal(&p.From) || addrUsesGlobal(&p.To) || addrUsesGlobal(p.GetFrom3())
 }
 
+type rwMask int
+
+const (
+	readFrom rwMask = 1 << iota
+	readTo
+	readReg
+	readFrom3
+	writeFrom
+	writeTo
+	writeReg
+	writeFrom3
+)
+
+// progRW returns a mask describing the effects of the instruction p.
+// Note: this isn't exhaustively accurate. It is only currently used for detecting
+// reads/writes to R15, so SSE register behavior isn't fully correct, and
+// other weird cases (e.g. writes to DX by CLD) also aren't captured.
+func progRW(p *obj.Prog) rwMask {
+	var m rwMask
+	// Default for most instructions
+	if p.From.Type != obj.TYPE_NONE {
+		m |= readFrom
+	}
+	if p.To.Type != obj.TYPE_NONE {
+		// Most x86 instructions update the To value
+		m |= readTo | writeTo
+	}
+	if p.Reg != 0 {
+		m |= readReg
+	}
+	if p.GetFrom3() != nil {
+		m |= readFrom3
+	}
+
+	// Lots of exceptions to the above defaults.
+	name := p.As.String()
+	if strings.HasPrefix(name, "MOV") || strings.HasPrefix(name, "PMOV") {
+		// MOV instructions don't read To.
+		m &^= readTo
+	}
+	switch p.As {
+	case APOPW, APOPL, APOPQ,
+		ALEAL, ALEAQ,
+		AIMUL3W, AIMUL3L, AIMUL3Q,
+		APEXTRB, APEXTRW, APEXTRD, APEXTRQ, AVPEXTRB, AVPEXTRW, AVPEXTRD, AVPEXTRQ, AEXTRACTPS,
+		ABSFW, ABSFL, ABSFQ, ABSRW, ABSRL, ABSRQ, APOPCNTW, APOPCNTL, APOPCNTQ, ALZCNTW, ALZCNTL, ALZCNTQ,
+		ASHLXL, ASHLXQ, ASHRXL, ASHRXQ, ASARXL, ASARXQ:
+		// These instructions are pure writes to To. They don't use its old value.
+		m &^= readTo
+	case AXORL, AXORQ:
+		// Register-clearing idiom doesn't read previous value.
+		if p.From.Type == obj.TYPE_REG && p.To.Type == obj.TYPE_REG && p.From.Reg == p.To.Reg {
+			m &^= readFrom | readTo
+		}
+	case AMULXL, AMULXQ:
+		// These are write-only to both To and From3.
+		m &^= readTo | readFrom3
+		m |= writeFrom3
+	}
+	return m
+}
+
+// progReadsR15 reports whether p reads the register R15.
+func progReadsR15(p *obj.Prog) bool {
+	m := progRW(p)
+	if m&readFrom != 0 && p.From.Type == obj.TYPE_REG && isR15(p.From.Reg) {
+		return true
+	}
+	if m&readTo != 0 && p.To.Type == obj.TYPE_REG && isR15(p.To.Reg) {
+		return true
+	}
+	if m&readReg != 0 && isR15(p.Reg) {
+		return true
+	}
+	if m&readFrom3 != 0 && p.GetFrom3().Type == obj.TYPE_REG && isR15(p.GetFrom3().Reg) {
+		return true
+	}
+	// reads of the index registers
+	if p.From.Type == obj.TYPE_MEM && (isR15(p.From.Reg) || isR15(p.From.Index)) {
+		return true
+	}
+	if p.To.Type == obj.TYPE_MEM && (isR15(p.To.Reg) || isR15(p.To.Index)) {
+		return true
+	}
+	if f3 := p.GetFrom3(); f3 != nil && f3.Type == obj.TYPE_MEM && (isR15(f3.Reg) || isR15(f3.Index)) {
+		return true
+	}
+	return false
+}
+
+// progWritesR15 reports whether p writes the register R15.
+func progWritesR15(p *obj.Prog) bool {
+	m := progRW(p)
+	if m&writeFrom != 0 && p.From.Type == obj.TYPE_REG && isR15(p.From.Reg) {
+		return true
+	}
+	if m&writeTo != 0 && p.To.Type == obj.TYPE_REG && isR15(p.To.Reg) {
+		return true
+	}
+	if m&writeReg != 0 && isR15(p.Reg) {
+		return true
+	}
+	if m&writeFrom3 != 0 && p.GetFrom3().Type == obj.TYPE_REG && isR15(p.GetFrom3().Reg) {
+		return true
+	}
+	return false
+}
+
 func errorCheck(ctxt *obj.Link, s *obj.LSym) {
 	// When dynamic linking, R15 is used to access globals. Reject code that
 	// uses R15 after a global variable access.
@@ -1321,6 +1407,15 @@
 		for len(work) > 0 {
 			p := work[len(work)-1]
 			work = work[:len(work)-1]
+			if progReadsR15(p) {
+				pos := ctxt.PosTable.Pos(p.Pos)
+				ctxt.Diag("%s:%s: when dynamic linking, R15 is clobbered by a global variable access and is used here: %v", path.Base(pos.Filename()), pos.LineNumber(), p)
+				break // only report one error
+			}
+			if progWritesR15(p) {
+				// R15 is overwritten by this instruction. Its value is not junk any more.
+				continue
+			}
 			if q := p.To.Target(); q != nil && q.Mark&markBit == 0 {
 				q.Mark |= markBit
 				work = append(work, q)
@@ -1328,15 +1423,6 @@
 			if p.As == obj.AJMP || p.As == obj.ARET {
 				continue // no fallthrough
 			}
-			if progMentionsR15(p) {
-				if progOverwritesR15(p) {
-					// R15 is overwritten by this instruction. Its value is not junk any more.
-					continue
-				}
-				pos := ctxt.PosTable.Pos(p.Pos)
-				ctxt.Diag("%s:%s: when dynamic linking, R15 is clobbered by a global variable access and is used here: %v", path.Base(pos.Filename()), pos.LineNumber(), p)
-				break // only report one error
-			}
 			if q := p.Link; q != nil && q.Mark&markBit == 0 {
 				q.Mark |= markBit
 				work = append(work, q)
@@ -1391,6 +1477,7 @@
 	ARDFSBASEQ:  true,
 	ARDGSBASEL:  true,
 	ARDGSBASEQ:  true,
+	ARDPID:      true,
 	ARDRANDL:    true,
 	ARDRANDQ:    true,
 	ARDRANDW:    true,
@@ -1442,6 +1529,7 @@
 	Preprocess:     preprocess,
 	Assemble:       span6,
 	Progedit:       progedit,
+	SEH:            populateSeh,
 	UnaryDst:       unaryDst,
 	DWARFRegisters: AMD64DWARFRegisters,
 }
diff --git a/src/cmd/internal/obj/x86/seh.go b/src/cmd/internal/obj/x86/seh.go
new file mode 100644
index 0000000..e7d3d57
--- /dev/null
+++ b/src/cmd/internal/obj/x86/seh.go
@@ -0,0 +1,141 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package x86
+
+import (
+	"cmd/internal/obj"
+	"cmd/internal/objabi"
+	"cmd/internal/src"
+	"encoding/base64"
+	"fmt"
+	"math"
+)
+
+type sehbuf struct {
+	ctxt *obj.Link
+	data []byte
+	off  int
+}
+
+func newsehbuf(ctxt *obj.Link, nodes uint8) sehbuf {
+	// - 8 bytes for the header
+	// - 2 bytes for each node
+	// - 2 bytes in case nodes is not even
+	size := 8 + nodes*2
+	if nodes%2 != 0 {
+		size += 2
+	}
+	return sehbuf{ctxt, make([]byte, size), 0}
+}
+
+func (b *sehbuf) write8(v uint8) {
+	b.data[b.off] = v
+	b.off++
+}
+
+func (b *sehbuf) write32(v uint32) {
+	b.ctxt.Arch.ByteOrder.PutUint32(b.data[b.off:], v)
+	b.off += 4
+}
+
+func (b *sehbuf) writecode(op, value uint8) {
+	b.write8(value<<4 | op)
+}
+
+// populateSeh generates the SEH unwind information for s.
+func populateSeh(ctxt *obj.Link, s *obj.LSym) (sehsym *obj.LSym) {
+	if s.NoFrame() {
+		return
+	}
+
+	// This implementation expects the following function prologue layout:
+	// - Stack split code (optional)
+	// - PUSHQ	BP
+	// - MOVQ	SP,	BP
+	//
+	// If the prologue layout change, the unwind information should be updated
+	// accordingly.
+
+	// Search for the PUSHQ BP instruction inside the prologue.
+	var pushbp *obj.Prog
+	for p := s.Func().Text; p != nil; p = p.Link {
+		if p.As == APUSHQ && p.From.Type == obj.TYPE_REG && p.From.Reg == REG_BP {
+			pushbp = p
+			break
+		}
+		if p.Pos.Xlogue() == src.PosPrologueEnd {
+			break
+		}
+	}
+	if pushbp == nil {
+		ctxt.Diag("missing frame pointer instruction: PUSHQ BP")
+		return
+	}
+
+	// It must be followed by a MOVQ SP, BP.
+	movbp := pushbp.Link
+	if movbp == nil {
+		ctxt.Diag("missing frame pointer instruction: MOVQ SP, BP")
+		return
+	}
+	if !(movbp.As == AMOVQ && movbp.From.Type == obj.TYPE_REG && movbp.From.Reg == REG_SP &&
+		movbp.To.Type == obj.TYPE_REG && movbp.To.Reg == REG_BP && movbp.From.Offset == 0) {
+		ctxt.Diag("unexpected frame pointer instruction\n%v", movbp)
+		return
+	}
+	if movbp.Link.Pc > math.MaxUint8 {
+		// SEH unwind information don't support prologues that are more than 255 bytes long.
+		// These are very rare, but still possible, e.g., when compiling functions with many
+		// parameters with -gcflags=-d=maymorestack=runtime.mayMoreStackPreempt.
+		// Return without reporting an error.
+		return
+	}
+
+	// Reference:
+	// https://learn.microsoft.com/en-us/cpp/build/exception-handling-x64#struct-unwind_info
+
+	const (
+		UWOP_PUSH_NONVOL = 0
+		UWOP_SET_FPREG   = 3
+		SEH_REG_BP       = 5
+	)
+
+	// Fow now we only support operations which are encoded
+	// using a single 2-byte node, so the number of nodes
+	// is the number of operations.
+	nodes := uint8(2)
+	buf := newsehbuf(ctxt, nodes)
+	buf.write8(1)                    // Flags + version
+	buf.write8(uint8(movbp.Link.Pc)) // Size of prolog
+	buf.write8(nodes)                // Count of nodes
+	buf.write8(SEH_REG_BP)           // FP register
+
+	// Notes are written in reverse order of appearance.
+	buf.write8(uint8(movbp.Link.Pc))
+	buf.writecode(UWOP_SET_FPREG, 0)
+
+	buf.write8(uint8(pushbp.Link.Pc))
+	buf.writecode(UWOP_PUSH_NONVOL, SEH_REG_BP)
+
+	// The following 4 bytes reference the RVA of the exception handler,
+	// in case the function has one. We don't use it for now.
+	buf.write32(0)
+
+	// The list of unwind infos in a PE binary have very low cardinality
+	// as each info only contains frame pointer operations,
+	// which are very similar across functions.
+	// Dedup them when possible.
+	hash := base64.StdEncoding.EncodeToString(buf.data)
+	symname := fmt.Sprintf("%d.%s", len(buf.data), hash)
+	return ctxt.LookupInit("go:sehuw."+symname, func(s *obj.LSym) {
+		s.WriteBytes(ctxt, 0, buf.data)
+		s.Type = objabi.SSEHUNWINDINFO
+		s.Set(obj.AttrDuplicateOK, true)
+		s.Set(obj.AttrLocal, true)
+		// Note: AttrContentAddressable cannot be set here,
+		// because the content-addressable-handling code
+		// does not know about aux symbols.
+	})
+}
diff --git a/src/cmd/internal/objabi/funcdata.go b/src/cmd/internal/objabi/funcdata.go
deleted file mode 100644
index 05a1d49..0000000
--- a/src/cmd/internal/objabi/funcdata.go
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package objabi
-
-// This file defines the IDs for PCDATA and FUNCDATA instructions
-// in Go binaries.
-//
-// These must agree with ../../../runtime/funcdata.h and
-// ../../../runtime/symtab.go.
-
-const (
-	PCDATA_UnsafePoint   = 0
-	PCDATA_StackMapIndex = 1
-	PCDATA_InlTreeIndex  = 2
-	PCDATA_ArgLiveIndex  = 3
-
-	FUNCDATA_ArgsPointerMaps    = 0
-	FUNCDATA_LocalsPointerMaps  = 1
-	FUNCDATA_StackObjects       = 2
-	FUNCDATA_InlTree            = 3
-	FUNCDATA_OpenCodedDeferInfo = 4
-	FUNCDATA_ArgInfo            = 5
-	FUNCDATA_ArgLiveInfo        = 6
-	FUNCDATA_WrapInfo           = 7
-
-	// ArgsSizeUnknown is set in Func.argsize to mark all functions
-	// whose argument size is unknown (C vararg functions, and
-	// assembly code without an explicit specification).
-	// This value is generated by the compiler, assembler, or linker.
-	ArgsSizeUnknown = -0x80000000
-)
-
-// Special PCDATA values.
-const (
-	// PCDATA_UnsafePoint values.
-	PCDATA_UnsafePointSafe   = -1 // Safe for async preemption
-	PCDATA_UnsafePointUnsafe = -2 // Unsafe for async preemption
-
-	// PCDATA_Restart1(2) apply on a sequence of instructions, within
-	// which if an async preemption happens, we should back off the PC
-	// to the start of the sequence when resuming.
-	// We need two so we can distinguish the start/end of the sequence
-	// in case that two sequences are next to each other.
-	PCDATA_Restart1 = -3
-	PCDATA_Restart2 = -4
-
-	// Like PCDATA_Restart1, but back to function entry if async preempted.
-	PCDATA_RestartAtEntry = -5
-)
diff --git a/src/cmd/internal/objabi/funcid.go b/src/cmd/internal/objabi/funcid.go
index c2eb4d5..afe9deb 100644
--- a/src/cmd/internal/objabi/funcid.go
+++ b/src/cmd/internal/objabi/funcid.go
@@ -4,88 +4,49 @@
 
 package objabi
 
-import "strings"
-
-// A FuncFlag records bits about a function, passed to the runtime.
-type FuncFlag uint8
-
-// Note: This list must match the list in runtime/symtab.go.
-const (
-	FuncFlag_TOPFRAME = 1 << iota
-	FuncFlag_SPWRITE
-	FuncFlag_ASM
+import (
+	"internal/abi"
+	"strings"
 )
 
-// A FuncID identifies particular functions that need to be treated
-// specially by the runtime.
-// Note that in some situations involving plugins, there may be multiple
-// copies of a particular special runtime function.
-type FuncID uint8
-
-// Note: this list must match the list in runtime/symtab.go.
-const (
-	FuncID_normal FuncID = iota // not a special function
-	FuncID_abort
-	FuncID_asmcgocall
-	FuncID_asyncPreempt
-	FuncID_cgocallback
-	FuncID_debugCallV2
-	FuncID_gcBgMarkWorker
-	FuncID_goexit
-	FuncID_gogo
-	FuncID_gopanic
-	FuncID_handleAsyncEvent
-	FuncID_mcall
-	FuncID_morestack
-	FuncID_mstart
-	FuncID_panicwrap
-	FuncID_rt0_go
-	FuncID_runfinq
-	FuncID_runtime_main
-	FuncID_sigpanic
-	FuncID_systemstack
-	FuncID_systemstack_switch
-	FuncID_wrapper // any autogenerated code (hash/eq algorithms, method wrappers, etc.)
-)
-
-var funcIDs = map[string]FuncID{
-	"abort":              FuncID_abort,
-	"asmcgocall":         FuncID_asmcgocall,
-	"asyncPreempt":       FuncID_asyncPreempt,
-	"cgocallback":        FuncID_cgocallback,
-	"debugCallV2":        FuncID_debugCallV2,
-	"gcBgMarkWorker":     FuncID_gcBgMarkWorker,
-	"rt0_go":             FuncID_rt0_go,
-	"goexit":             FuncID_goexit,
-	"gogo":               FuncID_gogo,
-	"gopanic":            FuncID_gopanic,
-	"handleAsyncEvent":   FuncID_handleAsyncEvent,
-	"main":               FuncID_runtime_main,
-	"mcall":              FuncID_mcall,
-	"morestack":          FuncID_morestack,
-	"mstart":             FuncID_mstart,
-	"panicwrap":          FuncID_panicwrap,
-	"runfinq":            FuncID_runfinq,
-	"sigpanic":           FuncID_sigpanic,
-	"systemstack_switch": FuncID_systemstack_switch,
-	"systemstack":        FuncID_systemstack,
+var funcIDs = map[string]abi.FuncID{
+	"abort":              abi.FuncID_abort,
+	"asmcgocall":         abi.FuncID_asmcgocall,
+	"asyncPreempt":       abi.FuncID_asyncPreempt,
+	"cgocallback":        abi.FuncID_cgocallback,
+	"debugCallV2":        abi.FuncID_debugCallV2,
+	"gcBgMarkWorker":     abi.FuncID_gcBgMarkWorker,
+	"rt0_go":             abi.FuncID_rt0_go,
+	"goexit":             abi.FuncID_goexit,
+	"gogo":               abi.FuncID_gogo,
+	"gopanic":            abi.FuncID_gopanic,
+	"handleAsyncEvent":   abi.FuncID_handleAsyncEvent,
+	"main":               abi.FuncID_runtime_main,
+	"mcall":              abi.FuncID_mcall,
+	"morestack":          abi.FuncID_morestack,
+	"mstart":             abi.FuncID_mstart,
+	"panicwrap":          abi.FuncID_panicwrap,
+	"runfinq":            abi.FuncID_runfinq,
+	"sigpanic":           abi.FuncID_sigpanic,
+	"systemstack_switch": abi.FuncID_systemstack_switch,
+	"systemstack":        abi.FuncID_systemstack,
 
 	// Don't show in call stack but otherwise not special.
-	"deferreturn":       FuncID_wrapper,
-	"runOpenDeferFrame": FuncID_wrapper,
-	"deferCallSave":     FuncID_wrapper,
+	"deferreturn":       abi.FuncIDWrapper,
+	"runOpenDeferFrame": abi.FuncIDWrapper,
+	"deferCallSave":     abi.FuncIDWrapper,
 }
 
 // Get the function ID for the named function in the named file.
 // The function should be package-qualified.
-func GetFuncID(name string, isWrapper bool) FuncID {
+func GetFuncID(name string, isWrapper bool) abi.FuncID {
 	if isWrapper {
-		return FuncID_wrapper
+		return abi.FuncIDWrapper
 	}
 	if strings.HasPrefix(name, "runtime.") {
 		if id, ok := funcIDs[name[len("runtime."):]]; ok {
 			return id
 		}
 	}
-	return FuncID_normal
+	return abi.FuncIDNormal
 }
diff --git a/src/cmd/internal/objabi/head.go b/src/cmd/internal/objabi/head.go
index 763910f..3109b5c 100644
--- a/src/cmd/internal/objabi/head.go
+++ b/src/cmd/internal/objabi/head.go
@@ -46,6 +46,7 @@
 	Hopenbsd
 	Hplan9
 	Hsolaris
+	Hwasip1
 	Hwindows
 	Haix
 )
@@ -72,6 +73,8 @@
 		*h = Hplan9
 	case "illumos", "solaris":
 		*h = Hsolaris
+	case "wasip1":
+		*h = Hwasip1
 	case "windows":
 		*h = Hwindows
 	default:
@@ -102,6 +105,8 @@
 		return "plan9"
 	case Hsolaris:
 		return "solaris"
+	case Hwasip1:
+		return "wasip1"
 	case Hwindows:
 		return "windows"
 	}
diff --git a/src/cmd/internal/objabi/line.go b/src/cmd/internal/objabi/line.go
index beee129..80a1137 100644
--- a/src/cmd/internal/objabi/line.go
+++ b/src/cmd/internal/objabi/line.go
@@ -8,6 +8,7 @@
 	"internal/buildcfg"
 	"os"
 	"path/filepath"
+	"runtime"
 	"strings"
 )
 
@@ -43,6 +44,13 @@
 		abs = "$GOROOT" + abs[len(buildcfg.GOROOT):]
 	}
 
+	// Rewrite paths to match the slash convention of the target.
+	// This helps ensure that cross-compiled distributions remain
+	// bit-for-bit identical to natively compiled distributions.
+	if runtime.GOOS == "windows" {
+		abs = strings.ReplaceAll(abs, `\`, "/")
+	}
+
 	if abs == "" {
 		abs = "??"
 	}
diff --git a/src/cmd/internal/objabi/reloctype.go b/src/cmd/internal/objabi/reloctype.go
index 2bc7b2d..996c300 100644
--- a/src/cmd/internal/objabi/reloctype.go
+++ b/src/cmd/internal/objabi/reloctype.go
@@ -83,7 +83,8 @@
 	// direct references. (This is used for types reachable by reflection.)
 	R_USETYPE
 	// R_USEIFACE marks a type is converted to an interface in the function this
-	// relocation is applied to. The target is a type descriptor.
+	// relocation is applied to. The target is a type descriptor or an itab
+	// (in the latter case it refers to the concrete type contained in the itab).
 	// This is a marker relocation (0-sized), for the linker's reachabililty
 	// analysis.
 	R_USEIFACE
@@ -229,7 +230,7 @@
 	R_ADDRPOWER_GOT
 
 	// R_ADDRPOWER_GOT_PCREL34 is identical to R_ADDRPOWER_GOT, but uses a PC relative
-	// sequence to generate a GOT symbol addresss.
+	// sequence to generate a GOT symbol addresses.
 	R_ADDRPOWER_GOT_PCREL34
 
 	// R_ADDRPOWER_PCREL relocates two D-form instructions like R_ADDRPOWER, but
@@ -310,6 +311,11 @@
 	// instruction, by encoding the address into the instruction.
 	R_CALLLOONG64
 
+	// R_LOONG64_TLS_IE_PCREL_HI and R_LOONG64_TLS_IE_LO relocates a pcalau12i, ld.d
+	// pair to compute the address of the GOT slot of the tls symbol.
+	R_LOONG64_TLS_IE_PCREL_HI
+	R_LOONG64_TLS_IE_LO
+
 	// R_JMPLOONG64 resolves to non-PC-relative target address of a JMP instruction,
 	// by encoding the address into the instruction.
 	R_JMPLOONG64
@@ -333,6 +339,16 @@
 	// in a symbol and target any symbols.
 	R_XCOFFREF
 
+	// R_PEIMAGEOFF resolves to a 32-bit offset from the start address of where
+	// the executable file is mapped in memory.
+	R_PEIMAGEOFF
+
+	// R_INITORDER specifies an ordering edge between two inittask records.
+	// (From one p..inittask record to another one.)
+	// This relocation does not apply any changes to the actual data, it is
+	// just used in the linker to order the inittask records appropriately.
+	R_INITORDER
+
 	// R_WEAK marks the relocation as a weak reference.
 	// A weak relocation does not make the symbol it refers to reachable,
 	// and is only honored by the linker if the symbol is in some other way
diff --git a/src/cmd/internal/objabi/reloctype_string.go b/src/cmd/internal/objabi/reloctype_string.go
index 9ce37d0..c7441ef 100644
--- a/src/cmd/internal/objabi/reloctype_string.go
+++ b/src/cmd/internal/objabi/reloctype_string.go
@@ -79,17 +79,21 @@
 	_ = x[R_ADDRLOONG64TLS-69]
 	_ = x[R_ADDRLOONG64TLSU-70]
 	_ = x[R_CALLLOONG64-71]
-	_ = x[R_JMPLOONG64-72]
-	_ = x[R_ADDRMIPSU-73]
-	_ = x[R_ADDRMIPSTLS-74]
-	_ = x[R_ADDRCUOFF-75]
-	_ = x[R_WASMIMPORT-76]
-	_ = x[R_XCOFFREF-77]
+	_ = x[R_LOONG64_TLS_IE_PCREL_HI-72]
+	_ = x[R_LOONG64_TLS_IE_LO-73]
+	_ = x[R_JMPLOONG64-74]
+	_ = x[R_ADDRMIPSU-75]
+	_ = x[R_ADDRMIPSTLS-76]
+	_ = x[R_ADDRCUOFF-77]
+	_ = x[R_WASMIMPORT-78]
+	_ = x[R_XCOFFREF-79]
+	_ = x[R_PEIMAGEOFF-80]
+	_ = x[R_INITORDER-81]
 }
 
-const _RelocType_name = "R_ADDRR_ADDRPOWERR_ADDRARM64R_ADDRMIPSR_ADDROFFR_SIZER_CALLR_CALLARMR_CALLARM64R_CALLINDR_CALLPOWERR_CALLMIPSR_CONSTR_PCRELR_TLS_LER_TLS_IER_GOTOFFR_PLT0R_PLT1R_PLT2R_USEFIELDR_USETYPER_USEIFACER_USEIFACEMETHODR_USEGENERICIFACEMETHODR_METHODOFFR_KEEPR_POWER_TOCR_GOTPCRELR_JMPMIPSR_DWARFSECREFR_DWARFFILEREFR_ARM64_TLS_LER_ARM64_TLS_IER_ARM64_GOTPCRELR_ARM64_GOTR_ARM64_PCRELR_ARM64_PCREL_LDST8R_ARM64_PCREL_LDST16R_ARM64_PCREL_LDST32R_ARM64_PCREL_LDST64R_ARM64_LDST8R_ARM64_LDST16R_ARM64_LDST32R_ARM64_LDST64R_ARM64_LDST128R_POWER_TLS_LER_POWER_TLS_IER_POWER_TLSR_POWER_TLS_IE_PCREL34R_POWER_TLS_LE_TPREL34R_ADDRPOWER_DSR_ADDRPOWER_GOTR_ADDRPOWER_GOT_PCREL34R_ADDRPOWER_PCRELR_ADDRPOWER_TOCRELR_ADDRPOWER_TOCREL_DSR_ADDRPOWER_D34R_ADDRPOWER_PCREL34R_RISCV_CALLR_RISCV_CALL_TRAMPR_RISCV_PCREL_ITYPER_RISCV_PCREL_STYPER_RISCV_TLS_IE_ITYPER_RISCV_TLS_IE_STYPER_PCRELDBLR_ADDRLOONG64R_ADDRLOONG64UR_ADDRLOONG64TLSR_ADDRLOONG64TLSUR_CALLLOONG64R_JMPLOONG64R_ADDRMIPSUR_ADDRMIPSTLSR_ADDRCUOFFR_WASMIMPORTR_XCOFFREF"
+const _RelocType_name = "R_ADDRR_ADDRPOWERR_ADDRARM64R_ADDRMIPSR_ADDROFFR_SIZER_CALLR_CALLARMR_CALLARM64R_CALLINDR_CALLPOWERR_CALLMIPSR_CONSTR_PCRELR_TLS_LER_TLS_IER_GOTOFFR_PLT0R_PLT1R_PLT2R_USEFIELDR_USETYPER_USEIFACER_USEIFACEMETHODR_USEGENERICIFACEMETHODR_METHODOFFR_KEEPR_POWER_TOCR_GOTPCRELR_JMPMIPSR_DWARFSECREFR_DWARFFILEREFR_ARM64_TLS_LER_ARM64_TLS_IER_ARM64_GOTPCRELR_ARM64_GOTR_ARM64_PCRELR_ARM64_PCREL_LDST8R_ARM64_PCREL_LDST16R_ARM64_PCREL_LDST32R_ARM64_PCREL_LDST64R_ARM64_LDST8R_ARM64_LDST16R_ARM64_LDST32R_ARM64_LDST64R_ARM64_LDST128R_POWER_TLS_LER_POWER_TLS_IER_POWER_TLSR_POWER_TLS_IE_PCREL34R_POWER_TLS_LE_TPREL34R_ADDRPOWER_DSR_ADDRPOWER_GOTR_ADDRPOWER_GOT_PCREL34R_ADDRPOWER_PCRELR_ADDRPOWER_TOCRELR_ADDRPOWER_TOCREL_DSR_ADDRPOWER_D34R_ADDRPOWER_PCREL34R_RISCV_CALLR_RISCV_CALL_TRAMPR_RISCV_PCREL_ITYPER_RISCV_PCREL_STYPER_RISCV_TLS_IE_ITYPER_RISCV_TLS_IE_STYPER_PCRELDBLR_ADDRLOONG64R_ADDRLOONG64UR_ADDRLOONG64TLSR_ADDRLOONG64TLSUR_CALLLOONG64R_LOONG64_TLS_IE_PCREL_HIR_LOONG64_TLS_IE_LOR_JMPLOONG64R_ADDRMIPSUR_ADDRMIPSTLSR_ADDRCUOFFR_WASMIMPORTR_XCOFFREFR_PEIMAGEOFFR_INITORDER"
 
-var _RelocType_index = [...]uint16{0, 6, 17, 28, 38, 47, 53, 59, 68, 79, 88, 99, 109, 116, 123, 131, 139, 147, 153, 159, 165, 175, 184, 194, 210, 233, 244, 250, 261, 271, 280, 293, 307, 321, 335, 351, 362, 375, 394, 414, 434, 454, 467, 481, 495, 509, 524, 538, 552, 563, 585, 607, 621, 636, 659, 676, 694, 715, 730, 749, 761, 779, 798, 817, 837, 857, 867, 880, 894, 910, 927, 940, 952, 963, 976, 987, 999, 1009}
+var _RelocType_index = [...]uint16{0, 6, 17, 28, 38, 47, 53, 59, 68, 79, 88, 99, 109, 116, 123, 131, 139, 147, 153, 159, 165, 175, 184, 194, 210, 233, 244, 250, 261, 271, 280, 293, 307, 321, 335, 351, 362, 375, 394, 414, 434, 454, 467, 481, 495, 509, 524, 538, 552, 563, 585, 607, 621, 636, 659, 676, 694, 715, 730, 749, 761, 779, 798, 817, 837, 857, 867, 880, 894, 910, 927, 940, 965, 984, 996, 1007, 1020, 1031, 1043, 1053, 1065, 1076}
 
 func (i RelocType) String() string {
 	i -= 1
diff --git a/src/cmd/internal/objabi/stack.go b/src/cmd/internal/objabi/stack.go
index 88b4990..7c7ff4e 100644
--- a/src/cmd/internal/objabi/stack.go
+++ b/src/cmd/internal/objabi/stack.go
@@ -4,22 +4,14 @@
 
 package objabi
 
-import "internal/buildcfg"
-
-// For the linkers. Must match Go definitions.
-
-const (
-	STACKSYSTEM = 0
-	StackSystem = STACKSYSTEM
-	StackBig    = 4096
-	StackSmall  = 128
+import (
+	"internal/abi"
+	"internal/buildcfg"
 )
 
-func StackLimit(race bool) int {
-	// This arithmetic must match that in runtime/stack.go:{_StackGuard,_StackLimit}.
-	stackGuard := 928*stackGuardMultiplier(race) + StackSystem
-	stackLimit := stackGuard - StackSystem - StackSmall
-	return stackLimit
+func StackNosplit(race bool) int {
+	// This arithmetic must match that in runtime/stack.go:stackNosplit.
+	return abi.StackNosplitBase * stackGuardMultiplier(race)
 }
 
 // stackGuardMultiplier returns a multiplier to apply to the default
diff --git a/src/cmd/internal/objabi/symkind.go b/src/cmd/internal/objabi/symkind.go
index a58816e..bafc51b 100644
--- a/src/cmd/internal/objabi/symkind.go
+++ b/src/cmd/internal/objabi/symkind.go
@@ -72,5 +72,6 @@
 	SCOVERAGE_COUNTER
 	SCOVERAGE_AUXVAR
 
+	SSEHUNWINDINFO
 	// Update cmd/link/internal/sym/AbiSymKindToSymKind for new SymKind values.
 )
diff --git a/src/cmd/internal/objabi/symkind_string.go b/src/cmd/internal/objabi/symkind_string.go
index be4e91f..3f2ad43 100644
--- a/src/cmd/internal/objabi/symkind_string.go
+++ b/src/cmd/internal/objabi/symkind_string.go
@@ -28,11 +28,12 @@
 	_ = x[SLIBFUZZER_8BIT_COUNTER-17]
 	_ = x[SCOVERAGE_COUNTER-18]
 	_ = x[SCOVERAGE_AUXVAR-19]
+	_ = x[SSEHUNWINDINFO-20]
 }
 
-const _SymKind_name = "SxxxSTEXTSRODATASNOPTRDATASDATASBSSSNOPTRBSSSTLSBSSSDWARFCUINFOSDWARFCONSTSDWARFFCNSDWARFABSFCNSDWARFTYPESDWARFVARSDWARFRANGESDWARFLOCSDWARFLINESSLIBFUZZER_8BIT_COUNTERSCOVERAGE_COUNTERSCOVERAGE_AUXVAR"
+const _SymKind_name = "SxxxSTEXTSRODATASNOPTRDATASDATASBSSSNOPTRBSSSTLSBSSSDWARFCUINFOSDWARFCONSTSDWARFFCNSDWARFABSFCNSDWARFTYPESDWARFVARSDWARFRANGESDWARFLOCSDWARFLINESSLIBFUZZER_8BIT_COUNTERSCOVERAGE_COUNTERSCOVERAGE_AUXVARSSEHUNWINDINFO"
 
-var _SymKind_index = [...]uint8{0, 4, 9, 16, 26, 31, 35, 44, 51, 63, 74, 83, 95, 105, 114, 125, 134, 145, 168, 185, 201}
+var _SymKind_index = [...]uint8{0, 4, 9, 16, 26, 31, 35, 44, 51, 63, 74, 83, 95, 105, 114, 125, 134, 145, 168, 185, 201, 215}
 
 func (i SymKind) String() string {
 	if i >= SymKind(len(_SymKind_index)-1) {
diff --git a/src/cmd/internal/objfile/elf.go b/src/cmd/internal/objfile/elf.go
index c64c254..f25e4a6 100644
--- a/src/cmd/internal/objfile/elf.go
+++ b/src/cmd/internal/objfile/elf.go
@@ -134,7 +134,12 @@
 func (f *elfFile) loadAddress() (uint64, error) {
 	for _, p := range f.elf.Progs {
 		if p.Type == elf.PT_LOAD && p.Flags&elf.PF_X != 0 {
-			return p.Vaddr, nil
+			// The memory mapping that contains the segment
+			// starts at an aligned address. Apparently this
+			// is what pprof expects, as it uses this and the
+			// start address of the mapping to compute PC
+			// delta.
+			return p.Vaddr - p.Vaddr%p.Align, nil
 		}
 	}
 	return 0, fmt.Errorf("unknown load address")
diff --git a/src/cmd/internal/osinfo/os_js.go b/src/cmd/internal/osinfo/os_js.go
index 882580d..f4f03aa 100644
--- a/src/cmd/internal/osinfo/os_js.go
+++ b/src/cmd/internal/osinfo/os_js.go
@@ -8,14 +8,31 @@
 
 import (
 	"fmt"
+	"syscall/js"
 )
 
 // Version returns the OS version name/number.
 func Version() (string, error) {
-	// Version detection on wasm varies depending on the underlying runtime
+	// Version detection on Wasm varies depending on the underlying runtime
 	// (browser, node, etc), nor is there a standard via something like
-	// WASI (see https://go.dev/issue/31105). We could attempt multiple
-	// combinations, but for now we leave this unimplemented for
-	// simplicity.
-	return "", fmt.Errorf("unimplemented")
+	// WASI (see https://go.dev/issue/31105). For now, attempt a few simple
+	// combinations for the convenience of reading logs at build.golang.org
+	// and local development. It's not a goal to recognize all environments.
+	if v, ok := node(); ok {
+		return "Node.js " + v, nil
+	}
+	return "", fmt.Errorf("unrecognized environment")
+}
+
+func node() (version string, ok bool) {
+	// Try the https://nodejs.org/api/process.html#processversion API.
+	p := js.Global().Get("process")
+	if p.IsUndefined() {
+		return "", false
+	}
+	v := p.Get("version")
+	if v.IsUndefined() {
+		return "", false
+	}
+	return v.String(), true
 }
diff --git a/src/cmd/internal/osinfo/os_wasip1.go b/src/cmd/internal/osinfo/os_wasip1.go
new file mode 100644
index 0000000..7295bb2
--- /dev/null
+++ b/src/cmd/internal/osinfo/os_wasip1.go
@@ -0,0 +1,17 @@
+// Copyright 2023 The Go 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:build wasip1
+
+package osinfo
+
+import (
+	"errors"
+	"fmt"
+)
+
+// Version returns the OS version name/number.
+func Version() (string, error) {
+	return "", fmt.Errorf("unable to determine OS version: %w", errors.ErrUnsupported)
+}
diff --git a/src/cmd/internal/src/pos.go b/src/cmd/internal/src/pos.go
index 15f64ac..6f1c7dd 100644
--- a/src/cmd/internal/src/pos.go
+++ b/src/cmd/internal/src/pos.go
@@ -434,7 +434,7 @@
 	return x.withStmt(PosIsStmt)
 }
 
-// withLogue attaches a prologue/epilogue attribute to a lico
+// withXlogue attaches a prologue/epilogue attribute to a lico
 func (x lico) withXlogue(xlogue PosXlogue) lico {
 	if x == 0 {
 		if xlogue == 0 {
diff --git a/src/cmd/internal/testdir/testdir_test.go b/src/cmd/internal/testdir/testdir_test.go
new file mode 100644
index 0000000..bd77859
--- /dev/null
+++ b/src/cmd/internal/testdir/testdir_test.go
@@ -0,0 +1,1932 @@
+// 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 testdir_test runs tests in the GOROOT/test directory.
+package testdir_test
+
+import (
+	"bytes"
+	"encoding/json"
+	"errors"
+	"flag"
+	"fmt"
+	"go/build"
+	"go/build/constraint"
+	"hash/fnv"
+	"internal/testenv"
+	"io"
+	"io/fs"
+	"log"
+	"os"
+	"os/exec"
+	"path"
+	"path/filepath"
+	"regexp"
+	"runtime"
+	"sort"
+	"strconv"
+	"strings"
+	"sync"
+	"testing"
+	"time"
+	"unicode"
+)
+
+var (
+	allCodegen     = flag.Bool("all_codegen", defaultAllCodeGen(), "run all goos/goarch for codegen")
+	runSkips       = flag.Bool("run_skips", false, "run skipped tests (ignore skip and build tags)")
+	linkshared     = flag.Bool("linkshared", false, "")
+	updateErrors   = flag.Bool("update_errors", false, "update error messages in test file based on compiler output")
+	runoutputLimit = flag.Int("l", defaultRunOutputLimit(), "number of parallel runoutput tests to run")
+	force          = flag.Bool("f", false, "ignore expected-failure test lists")
+	target         = flag.String("target", "", "cross-compile tests for `goos/goarch`")
+
+	shard  = flag.Int("shard", 0, "shard index to run. Only applicable if -shards is non-zero.")
+	shards = flag.Int("shards", 0, "number of shards. If 0, all tests are run. This is used by the continuous build.")
+)
+
+// defaultAllCodeGen returns the default value of the -all_codegen
+// flag. By default, we prefer to be fast (returning false), except on
+// the linux-amd64 builder that's already very fast, so we get more
+// test coverage on trybots. See https://go.dev/issue/34297.
+func defaultAllCodeGen() bool {
+	return os.Getenv("GO_BUILDER_NAME") == "linux-amd64"
+}
+
+var (
+	// Package-scoped variables that are initialized at the start of Test.
+	goTool       string
+	goos         string // Target GOOS
+	goarch       string // Target GOARCH
+	cgoEnabled   bool
+	goExperiment string
+
+	// dirs are the directories to look for *.go files in.
+	// TODO(bradfitz): just use all directories?
+	dirs = []string{".", "ken", "chan", "interface", "syntax", "dwarf", "fixedbugs", "codegen", "runtime", "abi", "typeparam", "typeparam/mdempsky", "arenas"}
+)
+
+// Test is the main entrypoint that runs tests in the GOROOT/test directory.
+//
+// Each .go file test case in GOROOT/test is registered as a subtest with a
+// a full name like "Test/fixedbugs/bug000.go" ('/'-separated relative path).
+func Test(t *testing.T) {
+	if *target != "" {
+		// When -target is set, propagate it to GOOS/GOARCH in our environment
+		// so that all commands run with the target GOOS/GOARCH.
+		//
+		// We do this before even calling "go env", because GOOS/GOARCH can
+		// affect other settings we get from go env (notably CGO_ENABLED).
+		goos, goarch, ok := strings.Cut(*target, "/")
+		if !ok {
+			t.Fatalf("bad -target flag %q, expected goos/goarch", *target)
+		}
+		t.Setenv("GOOS", goos)
+		t.Setenv("GOARCH", goarch)
+	}
+
+	goTool = testenv.GoToolPath(t)
+	cmd := exec.Command(goTool, "env", "-json")
+	stdout, err := cmd.StdoutPipe()
+	if err != nil {
+		t.Fatal("StdoutPipe:", err)
+	}
+	if err := cmd.Start(); err != nil {
+		t.Fatal("Start:", err)
+	}
+	var env struct {
+		GOOS         string
+		GOARCH       string
+		GOEXPERIMENT string
+		CGO_ENABLED  string
+	}
+	if err := json.NewDecoder(stdout).Decode(&env); err != nil {
+		t.Fatal("Decode:", err)
+	}
+	if err := cmd.Wait(); err != nil {
+		t.Fatal("Wait:", err)
+	}
+	goos = env.GOOS
+	goarch = env.GOARCH
+	cgoEnabled, _ = strconv.ParseBool(env.CGO_ENABLED)
+	goExperiment = env.GOEXPERIMENT
+
+	common := testCommon{
+		gorootTestDir: filepath.Join(testenv.GOROOT(t), "test"),
+		runoutputGate: make(chan bool, *runoutputLimit),
+	}
+
+	// cmd/distpack deletes GOROOT/test, so skip the test if it isn't present.
+	// cmd/distpack also requires GOROOT/VERSION to exist, so use that to
+	// suppress false-positive skips.
+	if _, err := os.Stat(common.gorootTestDir); os.IsNotExist(err) {
+		if _, err := os.Stat(filepath.Join(testenv.GOROOT(t), "VERSION")); err == nil {
+			t.Skipf("skipping: GOROOT/test not present")
+		}
+	}
+
+	for _, dir := range dirs {
+		for _, goFile := range goFiles(t, dir) {
+			test := test{testCommon: common, dir: dir, goFile: goFile}
+			t.Run(path.Join(dir, goFile), func(t *testing.T) {
+				t.Parallel()
+				test.T = t
+				testError := test.run()
+				wantError := test.expectFail() && !*force
+				if testError != nil {
+					if wantError {
+						t.Log(testError.Error() + " (expected)")
+					} else {
+						t.Fatal(testError)
+					}
+				} else if wantError {
+					t.Fatal("unexpected success")
+				}
+			})
+		}
+	}
+}
+
+func shardMatch(name string) bool {
+	if *shards <= 1 {
+		return true
+	}
+	h := fnv.New32()
+	io.WriteString(h, name)
+	return int(h.Sum32()%uint32(*shards)) == *shard
+}
+
+func goFiles(t *testing.T, dir string) []string {
+	f, err := os.Open(filepath.Join(testenv.GOROOT(t), "test", dir))
+	if err != nil {
+		t.Fatal(err)
+	}
+	dirnames, err := f.Readdirnames(-1)
+	f.Close()
+	if err != nil {
+		t.Fatal(err)
+	}
+	names := []string{}
+	for _, name := range dirnames {
+		if !strings.HasPrefix(name, ".") && strings.HasSuffix(name, ".go") && shardMatch(name) {
+			names = append(names, name)
+		}
+	}
+	sort.Strings(names)
+	return names
+}
+
+type runCmd func(...string) ([]byte, error)
+
+func compileFile(runcmd runCmd, longname string, flags []string) (out []byte, err error) {
+	cmd := []string{goTool, "tool", "compile", "-e", "-p=p", "-importcfg=" + stdlibImportcfgFile()}
+	cmd = append(cmd, flags...)
+	if *linkshared {
+		cmd = append(cmd, "-dynlink", "-installsuffix=dynlink")
+	}
+	cmd = append(cmd, longname)
+	return runcmd(cmd...)
+}
+
+func compileInDir(runcmd runCmd, dir string, flags []string, importcfg string, pkgname string, names ...string) (out []byte, err error) {
+	if importcfg == "" {
+		importcfg = stdlibImportcfgFile()
+	}
+	cmd := []string{goTool, "tool", "compile", "-e", "-D", "test", "-importcfg=" + importcfg}
+	if pkgname == "main" {
+		cmd = append(cmd, "-p=main")
+	} else {
+		pkgname = path.Join("test", strings.TrimSuffix(names[0], ".go"))
+		cmd = append(cmd, "-o", pkgname+".a", "-p", pkgname)
+	}
+	cmd = append(cmd, flags...)
+	if *linkshared {
+		cmd = append(cmd, "-dynlink", "-installsuffix=dynlink")
+	}
+	for _, name := range names {
+		cmd = append(cmd, filepath.Join(dir, name))
+	}
+	return runcmd(cmd...)
+}
+
+var stdlibImportcfgStringOnce sync.Once // TODO(#56102): Use sync.OnceValue once available. Also below.
+var stdlibImportcfgString string
+
+func stdlibImportcfg() string {
+	stdlibImportcfgStringOnce.Do(func() {
+		output, err := exec.Command(goTool, "list", "-export", "-f", "{{if .Export}}packagefile {{.ImportPath}}={{.Export}}{{end}}", "std").Output()
+		if err != nil {
+			log.Fatal(err)
+		}
+		stdlibImportcfgString = string(output)
+	})
+	return stdlibImportcfgString
+}
+
+var stdlibImportcfgFilenameOnce sync.Once
+var stdlibImportcfgFilename string
+
+func stdlibImportcfgFile() string {
+	stdlibImportcfgFilenameOnce.Do(func() {
+		tmpdir, err := os.MkdirTemp("", "importcfg")
+		if err != nil {
+			log.Fatal(err)
+		}
+		filename := filepath.Join(tmpdir, "importcfg")
+		err = os.WriteFile(filename, []byte(stdlibImportcfg()), 0644)
+		if err != nil {
+			log.Fatal(err)
+		}
+		stdlibImportcfgFilename = filename
+	})
+	return stdlibImportcfgFilename
+}
+
+func linkFile(runcmd runCmd, goname string, importcfg string, ldflags []string) (err error) {
+	if importcfg == "" {
+		importcfg = stdlibImportcfgFile()
+	}
+	pfile := strings.Replace(goname, ".go", ".o", -1)
+	cmd := []string{goTool, "tool", "link", "-w", "-o", "a.exe", "-importcfg=" + importcfg}
+	if *linkshared {
+		cmd = append(cmd, "-linkshared", "-installsuffix=dynlink")
+	}
+	if ldflags != nil {
+		cmd = append(cmd, ldflags...)
+	}
+	cmd = append(cmd, pfile)
+	_, err = runcmd(cmd...)
+	return
+}
+
+type testCommon struct {
+	// gorootTestDir is the GOROOT/test directory path.
+	gorootTestDir string
+
+	// runoutputGate controls the max number of runoutput tests
+	// executed in parallel as they can each consume a lot of memory.
+	runoutputGate chan bool
+}
+
+// test is a single test case in the GOROOT/test directory.
+type test struct {
+	testCommon
+	*testing.T
+	// dir and goFile identify the test case.
+	// For example, "fixedbugs", "bug000.go".
+	dir, goFile string
+}
+
+// expectFail reports whether the (overall) test recipe is
+// expected to fail under the current build+test configuration.
+func (t test) expectFail() bool {
+	failureSets := []map[string]bool{types2Failures}
+
+	// Note: gccgo supports more 32-bit architectures than this, but
+	// hopefully the 32-bit failures are fixed before this matters.
+	switch goarch {
+	case "386", "arm", "mips", "mipsle":
+		failureSets = append(failureSets, types2Failures32Bit)
+	}
+
+	testName := path.Join(t.dir, t.goFile) // Test name is '/'-separated.
+
+	for _, set := range failureSets {
+		if set[testName] {
+			return true
+		}
+	}
+	return false
+}
+
+func (t test) goFileName() string {
+	return filepath.Join(t.dir, t.goFile)
+}
+
+func (t test) goDirName() string {
+	return filepath.Join(t.dir, strings.Replace(t.goFile, ".go", ".dir", -1))
+}
+
+// goDirFiles returns .go files in dir.
+func goDirFiles(dir string) (filter []fs.DirEntry, _ error) {
+	files, err := os.ReadDir(dir)
+	if err != nil {
+		return nil, err
+	}
+	for _, goFile := range files {
+		if filepath.Ext(goFile.Name()) == ".go" {
+			filter = append(filter, goFile)
+		}
+	}
+	return filter, nil
+}
+
+var packageRE = regexp.MustCompile(`(?m)^package ([\p{Lu}\p{Ll}\w]+)`)
+
+func getPackageNameFromSource(fn string) (string, error) {
+	data, err := os.ReadFile(fn)
+	if err != nil {
+		return "", err
+	}
+	pkgname := packageRE.FindStringSubmatch(string(data))
+	if pkgname == nil {
+		return "", fmt.Errorf("cannot find package name in %s", fn)
+	}
+	return pkgname[1], nil
+}
+
+// goDirPkg represents a Go package in some directory.
+type goDirPkg struct {
+	name  string
+	files []string
+}
+
+// goDirPackages returns distinct Go packages in dir.
+// If singlefilepkgs is set, each file is considered a separate package
+// even if the package names are the same.
+func goDirPackages(t *testing.T, dir string, singlefilepkgs bool) []*goDirPkg {
+	files, err := goDirFiles(dir)
+	if err != nil {
+		t.Fatal(err)
+	}
+	var pkgs []*goDirPkg
+	m := make(map[string]*goDirPkg)
+	for _, file := range files {
+		name := file.Name()
+		pkgname, err := getPackageNameFromSource(filepath.Join(dir, name))
+		if err != nil {
+			t.Fatal(err)
+		}
+		p, ok := m[pkgname]
+		if singlefilepkgs || !ok {
+			p = &goDirPkg{name: pkgname}
+			pkgs = append(pkgs, p)
+			m[pkgname] = p
+		}
+		p.files = append(p.files, name)
+	}
+	return pkgs
+}
+
+type context struct {
+	GOOS       string
+	GOARCH     string
+	cgoEnabled bool
+	noOptEnv   bool
+}
+
+// shouldTest looks for build tags in a source file and returns
+// whether the file should be used according to the tags.
+func shouldTest(src string, goos, goarch string) (ok bool, whyNot string) {
+	if *runSkips {
+		return true, ""
+	}
+	for _, line := range strings.Split(src, "\n") {
+		if strings.HasPrefix(line, "package ") {
+			break
+		}
+
+		if expr, err := constraint.Parse(line); err == nil {
+			gcFlags := os.Getenv("GO_GCFLAGS")
+			ctxt := &context{
+				GOOS:       goos,
+				GOARCH:     goarch,
+				cgoEnabled: cgoEnabled,
+				noOptEnv:   strings.Contains(gcFlags, "-N") || strings.Contains(gcFlags, "-l"),
+			}
+
+			if !expr.Eval(ctxt.match) {
+				return false, line
+			}
+		}
+	}
+	return true, ""
+}
+
+func (ctxt *context) match(name string) bool {
+	if name == "" {
+		return false
+	}
+
+	// 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
+		}
+	}
+
+	if strings.HasPrefix(name, "goexperiment.") {
+		for _, tag := range build.Default.ToolTags {
+			if tag == name {
+				return true
+			}
+		}
+		return false
+	}
+
+	if name == "cgo" && ctxt.cgoEnabled {
+		return true
+	}
+
+	if name == ctxt.GOOS || name == ctxt.GOARCH || name == "gc" {
+		return true
+	}
+
+	if ctxt.noOptEnv && name == "gcflags_noopt" {
+		return true
+	}
+
+	if name == "test_run" {
+		return true
+	}
+
+	return false
+}
+
+// goGcflags returns the -gcflags argument to use with go build / go run.
+// This must match the flags used for building the standard library,
+// or else the commands will rebuild any needed packages (like runtime)
+// over and over.
+func (test) goGcflags() string {
+	return "-gcflags=all=" + os.Getenv("GO_GCFLAGS")
+}
+
+func (test) goGcflagsIsEmpty() bool {
+	return "" == os.Getenv("GO_GCFLAGS")
+}
+
+var errTimeout = errors.New("command exceeded time limit")
+
+// run runs the test case.
+//
+// When there is a problem, run uses t.Fatal to signify that it's an unskippable
+// infrastructure error (such as failing to read an input file or the test recipe
+// being malformed), or it returns a non-nil error to signify a test case error.
+//
+// t.Error isn't used here to give the caller the opportunity to decide whether
+// the test case failing is expected before promoting it to a real test failure.
+// See expectFail and -f flag.
+func (t test) run() error {
+	srcBytes, err := os.ReadFile(filepath.Join(t.gorootTestDir, t.goFileName()))
+	if err != nil {
+		t.Fatal("reading test case .go file:", err)
+	} else if bytes.HasPrefix(srcBytes, []byte{'\n'}) {
+		t.Fatal(".go file source starts with a newline")
+	}
+	src := string(srcBytes)
+
+	// Execution recipe stops at first blank line.
+	action, _, ok := strings.Cut(src, "\n\n")
+	if !ok {
+		t.Fatalf("double newline ending execution recipe not found in GOROOT/test/%s", t.goFileName())
+	}
+	if firstLine, rest, ok := strings.Cut(action, "\n"); ok && strings.Contains(firstLine, "+build") {
+		// skip first line
+		action = rest
+	}
+	action = strings.TrimPrefix(action, "//")
+
+	// Check for build constraints only up to the actual code.
+	header, _, ok := strings.Cut(src, "\npackage")
+	if !ok {
+		header = action // some files are intentionally malformed
+	}
+	if ok, why := shouldTest(header, goos, goarch); !ok {
+		t.Skip(why)
+	}
+
+	var args, flags, runenv []string
+	var tim int
+	wantError := false
+	wantAuto := false
+	singlefilepkgs := false
+	f, err := splitQuoted(action)
+	if err != nil {
+		t.Fatal("invalid test recipe:", err)
+	}
+	if len(f) > 0 {
+		action = f[0]
+		args = f[1:]
+	}
+
+	// TODO: Clean up/simplify this switch statement.
+	switch action {
+	case "compile", "compiledir", "build", "builddir", "buildrundir", "run", "buildrun", "runoutput", "rundir", "runindir", "asmcheck":
+		// nothing to do
+	case "errorcheckandrundir":
+		wantError = false // should be no error if also will run
+	case "errorcheckwithauto":
+		action = "errorcheck"
+		wantAuto = true
+		wantError = true
+	case "errorcheck", "errorcheckdir", "errorcheckoutput":
+		wantError = true
+	case "skip":
+		if *runSkips {
+			break
+		}
+		t.Skip("skip")
+	default:
+		t.Fatalf("unknown pattern: %q", action)
+	}
+
+	goexp := goExperiment
+
+	// collect flags
+	for len(args) > 0 && strings.HasPrefix(args[0], "-") {
+		switch args[0] {
+		case "-1":
+			wantError = true
+		case "-0":
+			wantError = false
+		case "-s":
+			singlefilepkgs = true
+		case "-t": // timeout in seconds
+			args = args[1:]
+			var err error
+			tim, err = strconv.Atoi(args[0])
+			if err != nil {
+				t.Fatalf("need number of seconds for -t timeout, got %s instead", args[0])
+			}
+			if s := os.Getenv("GO_TEST_TIMEOUT_SCALE"); s != "" {
+				timeoutScale, err := strconv.Atoi(s)
+				if err != nil {
+					t.Fatalf("failed to parse $GO_TEST_TIMEOUT_SCALE = %q as integer: %v", s, err)
+				}
+				tim *= timeoutScale
+			}
+		case "-goexperiment": // set GOEXPERIMENT environment
+			args = args[1:]
+			if goexp != "" {
+				goexp += ","
+			}
+			goexp += args[0]
+			runenv = append(runenv, "GOEXPERIMENT="+goexp)
+
+		default:
+			flags = append(flags, args[0])
+		}
+		args = args[1:]
+	}
+	if action == "errorcheck" {
+		found := false
+		for i, f := range flags {
+			if strings.HasPrefix(f, "-d=") {
+				flags[i] = f + ",ssa/check/on"
+				found = true
+				break
+			}
+		}
+		if !found {
+			flags = append(flags, "-d=ssa/check/on")
+		}
+	}
+
+	tempDir := t.TempDir()
+	err = os.Mkdir(filepath.Join(tempDir, "test"), 0755)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	err = os.WriteFile(filepath.Join(tempDir, t.goFile), srcBytes, 0644)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	var (
+		runInDir        = tempDir
+		tempDirIsGOPATH = false
+	)
+	runcmd := func(args ...string) ([]byte, error) {
+		cmd := exec.Command(args[0], args[1:]...)
+		var buf bytes.Buffer
+		cmd.Stdout = &buf
+		cmd.Stderr = &buf
+		cmd.Env = append(os.Environ(), "GOENV=off", "GOFLAGS=")
+		if runInDir != "" {
+			cmd.Dir = runInDir
+			// Set PWD to match Dir to speed up os.Getwd in the child process.
+			cmd.Env = append(cmd.Env, "PWD="+cmd.Dir)
+		} else {
+			// Default to running in the GOROOT/test directory.
+			cmd.Dir = t.gorootTestDir
+			// Set PWD to match Dir to speed up os.Getwd in the child process.
+			cmd.Env = append(cmd.Env, "PWD="+cmd.Dir)
+		}
+		if tempDirIsGOPATH {
+			cmd.Env = append(cmd.Env, "GOPATH="+tempDir)
+		}
+		cmd.Env = append(cmd.Env, "STDLIB_IMPORTCFG="+stdlibImportcfgFile())
+		cmd.Env = append(cmd.Env, runenv...)
+
+		var err error
+
+		if tim != 0 {
+			err = cmd.Start()
+			// This command-timeout code adapted from cmd/go/test.go
+			// Note: the Go command uses a more sophisticated timeout
+			// strategy, first sending SIGQUIT (if appropriate for the
+			// OS in question) to try to trigger a stack trace, then
+			// finally much later SIGKILL. If timeouts prove to be a
+			// common problem here, it would be worth porting over
+			// that code as well. See https://do.dev/issue/50973
+			// for more discussion.
+			if err == nil {
+				tick := time.NewTimer(time.Duration(tim) * time.Second)
+				done := make(chan error)
+				go func() {
+					done <- cmd.Wait()
+				}()
+				select {
+				case err = <-done:
+					// ok
+				case <-tick.C:
+					cmd.Process.Signal(os.Interrupt)
+					time.Sleep(1 * time.Second)
+					cmd.Process.Kill()
+					<-done
+					err = errTimeout
+				}
+				tick.Stop()
+			}
+		} else {
+			err = cmd.Run()
+		}
+		if err != nil && err != errTimeout {
+			err = fmt.Errorf("%s\n%s", err, buf.Bytes())
+		}
+		return buf.Bytes(), err
+	}
+
+	importcfg := func(pkgs []*goDirPkg) string {
+		cfg := stdlibImportcfg()
+		for _, pkg := range pkgs {
+			pkgpath := path.Join("test", strings.TrimSuffix(pkg.files[0], ".go"))
+			cfg += "\npackagefile " + pkgpath + "=" + filepath.Join(tempDir, pkgpath+".a")
+		}
+		filename := filepath.Join(tempDir, "importcfg")
+		err := os.WriteFile(filename, []byte(cfg), 0644)
+		if err != nil {
+			t.Fatal(err)
+		}
+		return filename
+	}
+
+	long := filepath.Join(t.gorootTestDir, t.goFileName())
+	switch action {
+	default:
+		t.Fatalf("unimplemented action %q", action)
+		panic("unreachable")
+
+	case "asmcheck":
+		// Compile Go file and match the generated assembly
+		// against a set of regexps in comments.
+		ops := t.wantedAsmOpcodes(long)
+		self := runtime.GOOS + "/" + runtime.GOARCH
+		for _, env := range ops.Envs() {
+			// Only run checks relevant to the current GOOS/GOARCH,
+			// to avoid triggering a cross-compile of the runtime.
+			if string(env) != self && !strings.HasPrefix(string(env), self+"/") && !*allCodegen {
+				continue
+			}
+			// -S=2 forces outermost line numbers when disassembling inlined code.
+			cmdline := []string{"build", "-gcflags", "-S=2"}
+
+			// Append flags, but don't override -gcflags=-S=2; add to it instead.
+			for i := 0; i < len(flags); i++ {
+				flag := flags[i]
+				switch {
+				case strings.HasPrefix(flag, "-gcflags="):
+					cmdline[2] += " " + strings.TrimPrefix(flag, "-gcflags=")
+				case strings.HasPrefix(flag, "--gcflags="):
+					cmdline[2] += " " + strings.TrimPrefix(flag, "--gcflags=")
+				case flag == "-gcflags", flag == "--gcflags":
+					i++
+					if i < len(flags) {
+						cmdline[2] += " " + flags[i]
+					}
+				default:
+					cmdline = append(cmdline, flag)
+				}
+			}
+
+			cmdline = append(cmdline, long)
+			cmd := exec.Command(goTool, cmdline...)
+			cmd.Env = append(os.Environ(), env.Environ()...)
+			if len(flags) > 0 && flags[0] == "-race" {
+				cmd.Env = append(cmd.Env, "CGO_ENABLED=1")
+			}
+
+			var buf bytes.Buffer
+			cmd.Stdout, cmd.Stderr = &buf, &buf
+			if err := cmd.Run(); err != nil {
+				t.Log(env, "\n", cmd.Stderr)
+				return err
+			}
+
+			err := t.asmCheck(buf.String(), long, env, ops[env])
+			if err != nil {
+				return err
+			}
+		}
+		return nil
+
+	case "errorcheck":
+		// Compile Go file.
+		// Fail if wantError is true and compilation was successful and vice versa.
+		// Match errors produced by gc against errors in comments.
+		// TODO(gri) remove need for -C (disable printing of columns in error messages)
+		cmdline := []string{goTool, "tool", "compile", "-p=p", "-d=panic", "-C", "-e", "-importcfg=" + stdlibImportcfgFile(), "-o", "a.o"}
+		// No need to add -dynlink even if linkshared if we're just checking for errors...
+		cmdline = append(cmdline, flags...)
+		cmdline = append(cmdline, long)
+		out, err := runcmd(cmdline...)
+		if wantError {
+			if err == nil {
+				return fmt.Errorf("compilation succeeded unexpectedly\n%s", out)
+			}
+			if err == errTimeout {
+				return fmt.Errorf("compilation timed out")
+			}
+		} else {
+			if err != nil {
+				return err
+			}
+		}
+		if *updateErrors {
+			t.updateErrors(string(out), long)
+		}
+		return t.errorCheck(string(out), wantAuto, long, t.goFile)
+
+	case "compile":
+		// Compile Go file.
+		_, err := compileFile(runcmd, long, flags)
+		return err
+
+	case "compiledir":
+		// Compile all files in the directory as packages in lexicographic order.
+		longdir := filepath.Join(t.gorootTestDir, t.goDirName())
+		pkgs := goDirPackages(t.T, longdir, singlefilepkgs)
+		importcfgfile := importcfg(pkgs)
+
+		for _, pkg := range pkgs {
+			_, err := compileInDir(runcmd, longdir, flags, importcfgfile, pkg.name, pkg.files...)
+			if err != nil {
+				return err
+			}
+		}
+		return nil
+
+	case "errorcheckdir", "errorcheckandrundir":
+		flags = append(flags, "-d=panic")
+		// Compile and errorCheck all files in the directory as packages in lexicographic order.
+		// If errorcheckdir and wantError, compilation of the last package must fail.
+		// If errorcheckandrundir and wantError, compilation of the package prior the last must fail.
+		longdir := filepath.Join(t.gorootTestDir, t.goDirName())
+		pkgs := goDirPackages(t.T, longdir, singlefilepkgs)
+		errPkg := len(pkgs) - 1
+		if wantError && action == "errorcheckandrundir" {
+			// The last pkg should compiled successfully and will be run in next case.
+			// Preceding pkg must return an error from compileInDir.
+			errPkg--
+		}
+		importcfgfile := importcfg(pkgs)
+		for i, pkg := range pkgs {
+			out, err := compileInDir(runcmd, longdir, flags, importcfgfile, pkg.name, pkg.files...)
+			if i == errPkg {
+				if wantError && err == nil {
+					return fmt.Errorf("compilation succeeded unexpectedly\n%s", out)
+				} else if !wantError && err != nil {
+					return err
+				}
+			} else if err != nil {
+				return err
+			}
+			var fullshort []string
+			for _, name := range pkg.files {
+				fullshort = append(fullshort, filepath.Join(longdir, name), name)
+			}
+			err = t.errorCheck(string(out), wantAuto, fullshort...)
+			if err != nil {
+				return err
+			}
+		}
+		if action == "errorcheckdir" {
+			return nil
+		}
+		fallthrough
+
+	case "rundir":
+		// Compile all files in the directory as packages in lexicographic order.
+		// In case of errorcheckandrundir, ignore failed compilation of the package before the last.
+		// Link as if the last file is the main package, run it.
+		// Verify the expected output.
+		longdir := filepath.Join(t.gorootTestDir, t.goDirName())
+		pkgs := goDirPackages(t.T, longdir, singlefilepkgs)
+		// Split flags into gcflags and ldflags
+		ldflags := []string{}
+		for i, fl := range flags {
+			if fl == "-ldflags" {
+				ldflags = flags[i+1:]
+				flags = flags[0:i]
+				break
+			}
+		}
+
+		importcfgfile := importcfg(pkgs)
+
+		for i, pkg := range pkgs {
+			_, err := compileInDir(runcmd, longdir, flags, importcfgfile, pkg.name, pkg.files...)
+			// Allow this package compilation fail based on conditions below;
+			// its errors were checked in previous case.
+			if err != nil && !(wantError && action == "errorcheckandrundir" && i == len(pkgs)-2) {
+				return err
+			}
+
+			if i == len(pkgs)-1 {
+				err = linkFile(runcmd, pkg.files[0], importcfgfile, ldflags)
+				if err != nil {
+					return err
+				}
+				var cmd []string
+				cmd = append(cmd, findExecCmd()...)
+				cmd = append(cmd, filepath.Join(tempDir, "a.exe"))
+				cmd = append(cmd, args...)
+				out, err := runcmd(cmd...)
+				if err != nil {
+					return err
+				}
+				t.checkExpectedOutput(out)
+			}
+		}
+		return nil
+
+	case "runindir":
+		// Make a shallow copy of t.goDirName() in its own module and GOPATH, and
+		// run "go run ." in it. The module path (and hence import path prefix) of
+		// the copy is equal to the basename of the source directory.
+		//
+		// It's used when test a requires a full 'go build' in order to compile
+		// the sources, such as when importing multiple packages (issue29612.dir)
+		// or compiling a package containing assembly files (see issue15609.dir),
+		// but still needs to be run to verify the expected output.
+		tempDirIsGOPATH = true
+		srcDir := filepath.Join(t.gorootTestDir, t.goDirName())
+		modName := filepath.Base(srcDir)
+		gopathSrcDir := filepath.Join(tempDir, "src", modName)
+		runInDir = gopathSrcDir
+
+		if err := overlayDir(gopathSrcDir, srcDir); err != nil {
+			t.Fatal(err)
+		}
+
+		modFile := fmt.Sprintf("module %s\ngo 1.14\n", modName)
+		if err := os.WriteFile(filepath.Join(gopathSrcDir, "go.mod"), []byte(modFile), 0666); err != nil {
+			t.Fatal(err)
+		}
+
+		cmd := []string{goTool, "run", t.goGcflags()}
+		if *linkshared {
+			cmd = append(cmd, "-linkshared")
+		}
+		cmd = append(cmd, flags...)
+		cmd = append(cmd, ".")
+		out, err := runcmd(cmd...)
+		if err != nil {
+			return err
+		}
+		return t.checkExpectedOutput(out)
+
+	case "build":
+		// Build Go file.
+		cmd := []string{goTool, "build", t.goGcflags()}
+		cmd = append(cmd, flags...)
+		cmd = append(cmd, "-o", "a.exe", long)
+		_, err := runcmd(cmd...)
+		return err
+
+	case "builddir", "buildrundir":
+		// Build an executable from all the .go and .s files in a subdirectory.
+		// Run it and verify its output in the buildrundir case.
+		longdir := filepath.Join(t.gorootTestDir, t.goDirName())
+		files, err := os.ReadDir(longdir)
+		if err != nil {
+			t.Fatal(err)
+		}
+		var gos []string
+		var asms []string
+		for _, file := range files {
+			switch filepath.Ext(file.Name()) {
+			case ".go":
+				gos = append(gos, filepath.Join(longdir, file.Name()))
+			case ".s":
+				asms = append(asms, filepath.Join(longdir, file.Name()))
+			}
+
+		}
+		if len(asms) > 0 {
+			emptyHdrFile := filepath.Join(tempDir, "go_asm.h")
+			if err := os.WriteFile(emptyHdrFile, nil, 0666); err != nil {
+				t.Fatalf("write empty go_asm.h: %v", err)
+			}
+			cmd := []string{goTool, "tool", "asm", "-p=main", "-gensymabis", "-o", "symabis"}
+			cmd = append(cmd, asms...)
+			_, err = runcmd(cmd...)
+			if err != nil {
+				return err
+			}
+		}
+		var objs []string
+		cmd := []string{goTool, "tool", "compile", "-p=main", "-e", "-D", ".", "-importcfg=" + stdlibImportcfgFile(), "-o", "go.o"}
+		if len(asms) > 0 {
+			cmd = append(cmd, "-asmhdr", "go_asm.h", "-symabis", "symabis")
+		}
+		cmd = append(cmd, gos...)
+		_, err = runcmd(cmd...)
+		if err != nil {
+			return err
+		}
+		objs = append(objs, "go.o")
+		if len(asms) > 0 {
+			cmd = []string{goTool, "tool", "asm", "-p=main", "-e", "-I", ".", "-o", "asm.o"}
+			cmd = append(cmd, asms...)
+			_, err = runcmd(cmd...)
+			if err != nil {
+				return err
+			}
+			objs = append(objs, "asm.o")
+		}
+		cmd = []string{goTool, "tool", "pack", "c", "all.a"}
+		cmd = append(cmd, objs...)
+		_, err = runcmd(cmd...)
+		if err != nil {
+			return err
+		}
+		cmd = []string{goTool, "tool", "link", "-importcfg=" + stdlibImportcfgFile(), "-o", "a.exe", "all.a"}
+		_, err = runcmd(cmd...)
+		if err != nil {
+			return err
+		}
+
+		if action == "builddir" {
+			return nil
+		}
+		cmd = append(findExecCmd(), filepath.Join(tempDir, "a.exe"))
+		out, err := runcmd(cmd...)
+		if err != nil {
+			return err
+		}
+		return t.checkExpectedOutput(out)
+
+	case "buildrun":
+		// Build an executable from Go file, then run it, verify its output.
+		// Useful for timeout tests where failure mode is infinite loop.
+		// TODO: not supported on NaCl
+		cmd := []string{goTool, "build", t.goGcflags(), "-o", "a.exe"}
+		if *linkshared {
+			cmd = append(cmd, "-linkshared")
+		}
+		longDirGoFile := filepath.Join(filepath.Join(t.gorootTestDir, t.dir), t.goFile)
+		cmd = append(cmd, flags...)
+		cmd = append(cmd, longDirGoFile)
+		_, err := runcmd(cmd...)
+		if err != nil {
+			return err
+		}
+		cmd = []string{"./a.exe"}
+		out, err := runcmd(append(cmd, args...)...)
+		if err != nil {
+			return err
+		}
+
+		return t.checkExpectedOutput(out)
+
+	case "run":
+		// Run Go file if no special go command flags are provided;
+		// otherwise build an executable and run it.
+		// Verify the output.
+		runInDir = ""
+		var out []byte
+		var err error
+		if len(flags)+len(args) == 0 && t.goGcflagsIsEmpty() && !*linkshared && goarch == runtime.GOARCH && goos == runtime.GOOS && goexp == goExperiment {
+			// If we're not using special go command flags,
+			// skip all the go command machinery.
+			// This avoids any time the go command would
+			// spend checking whether, for example, the installed
+			// package runtime is up to date.
+			// Because we run lots of trivial test programs,
+			// the time adds up.
+			pkg := filepath.Join(tempDir, "pkg.a")
+			if _, err := runcmd(goTool, "tool", "compile", "-p=main", "-importcfg="+stdlibImportcfgFile(), "-o", pkg, t.goFileName()); err != nil {
+				return err
+			}
+			exe := filepath.Join(tempDir, "test.exe")
+			cmd := []string{goTool, "tool", "link", "-s", "-w", "-importcfg=" + stdlibImportcfgFile()}
+			cmd = append(cmd, "-o", exe, pkg)
+			if _, err := runcmd(cmd...); err != nil {
+				return err
+			}
+			out, err = runcmd(append([]string{exe}, args...)...)
+		} else {
+			cmd := []string{goTool, "run", t.goGcflags()}
+			if *linkshared {
+				cmd = append(cmd, "-linkshared")
+			}
+			cmd = append(cmd, flags...)
+			cmd = append(cmd, t.goFileName())
+			out, err = runcmd(append(cmd, args...)...)
+		}
+		if err != nil {
+			return err
+		}
+		return t.checkExpectedOutput(out)
+
+	case "runoutput":
+		// Run Go file and write its output into temporary Go file.
+		// Run generated Go file and verify its output.
+		t.runoutputGate <- true
+		defer func() {
+			<-t.runoutputGate
+		}()
+		runInDir = ""
+		cmd := []string{goTool, "run", t.goGcflags()}
+		if *linkshared {
+			cmd = append(cmd, "-linkshared")
+		}
+		cmd = append(cmd, t.goFileName())
+		out, err := runcmd(append(cmd, args...)...)
+		if err != nil {
+			return err
+		}
+		tfile := filepath.Join(tempDir, "tmp__.go")
+		if err := os.WriteFile(tfile, out, 0666); err != nil {
+			t.Fatalf("write tempfile: %v", err)
+		}
+		cmd = []string{goTool, "run", t.goGcflags()}
+		if *linkshared {
+			cmd = append(cmd, "-linkshared")
+		}
+		cmd = append(cmd, tfile)
+		out, err = runcmd(cmd...)
+		if err != nil {
+			return err
+		}
+		return t.checkExpectedOutput(out)
+
+	case "errorcheckoutput":
+		// Run Go file and write its output into temporary Go file.
+		// Compile and errorCheck generated Go file.
+		runInDir = ""
+		cmd := []string{goTool, "run", t.goGcflags()}
+		if *linkshared {
+			cmd = append(cmd, "-linkshared")
+		}
+		cmd = append(cmd, t.goFileName())
+		out, err := runcmd(append(cmd, args...)...)
+		if err != nil {
+			return err
+		}
+		tfile := filepath.Join(tempDir, "tmp__.go")
+		err = os.WriteFile(tfile, out, 0666)
+		if err != nil {
+			t.Fatalf("write tempfile: %v", err)
+		}
+		cmdline := []string{goTool, "tool", "compile", "-importcfg=" + stdlibImportcfgFile(), "-p=p", "-d=panic", "-e", "-o", "a.o"}
+		cmdline = append(cmdline, flags...)
+		cmdline = append(cmdline, tfile)
+		out, err = runcmd(cmdline...)
+		if wantError {
+			if err == nil {
+				return fmt.Errorf("compilation succeeded unexpectedly\n%s", out)
+			}
+		} else {
+			if err != nil {
+				return err
+			}
+		}
+		return t.errorCheck(string(out), false, tfile, "tmp__.go")
+	}
+}
+
+var execCmdOnce sync.Once
+var execCmd []string
+
+func findExecCmd() []string {
+	execCmdOnce.Do(func() {
+		if goos == runtime.GOOS && goarch == runtime.GOARCH {
+			// Do nothing.
+		} else if path, err := exec.LookPath(fmt.Sprintf("go_%s_%s_exec", goos, goarch)); err == nil {
+			execCmd = []string{path}
+		}
+	})
+	return execCmd
+}
+
+// checkExpectedOutput compares the output from compiling and/or running with the contents
+// of the corresponding reference output file, if any (replace ".go" with ".out").
+// If they don't match, fail with an informative message.
+func (t test) checkExpectedOutput(gotBytes []byte) error {
+	got := string(gotBytes)
+	filename := filepath.Join(t.dir, t.goFile)
+	filename = filename[:len(filename)-len(".go")]
+	filename += ".out"
+	b, err := os.ReadFile(filepath.Join(t.gorootTestDir, filename))
+	if errors.Is(err, fs.ErrNotExist) {
+		// File is allowed to be missing, in which case output should be empty.
+		b = nil
+	} else if err != nil {
+		return err
+	}
+	got = strings.Replace(got, "\r\n", "\n", -1)
+	if got != string(b) {
+		if err == nil {
+			return fmt.Errorf("output does not match expected in %s. Instead saw\n%s", filename, got)
+		} else {
+			return fmt.Errorf("output should be empty when (optional) expected-output file %s is not present. Instead saw\n%s", filename, got)
+		}
+	}
+	return nil
+}
+
+func splitOutput(out string, wantAuto bool) []string {
+	// gc error messages continue onto additional lines with leading tabs.
+	// Split the output at the beginning of each line that doesn't begin with a tab.
+	// <autogenerated> lines are impossible to match so those are filtered out.
+	var res []string
+	for _, line := range strings.Split(out, "\n") {
+		if strings.HasSuffix(line, "\r") { // remove '\r', output by compiler on windows
+			line = line[:len(line)-1]
+		}
+		if strings.HasPrefix(line, "\t") {
+			res[len(res)-1] += "\n" + line
+		} else if strings.HasPrefix(line, "go tool") || strings.HasPrefix(line, "#") || !wantAuto && strings.HasPrefix(line, "<autogenerated>") {
+			continue
+		} else if strings.TrimSpace(line) != "" {
+			res = append(res, line)
+		}
+	}
+	return res
+}
+
+// errorCheck matches errors in outStr against comments in source files.
+// For each line of the source files which should generate an error,
+// there should be a comment of the form // ERROR "regexp".
+// If outStr has an error for a line which has no such comment,
+// this function will report an error.
+// Likewise if outStr does not have an error for a line which has a comment,
+// or if the error message does not match the <regexp>.
+// The <regexp> syntax is Perl but it's best to stick to egrep.
+//
+// Sources files are supplied as fullshort slice.
+// It consists of pairs: full path to source file and its base name.
+func (t test) errorCheck(outStr string, wantAuto bool, fullshort ...string) (err error) {
+	defer func() {
+		if testing.Verbose() && err != nil {
+			t.Logf("gc output:\n%s", outStr)
+		}
+	}()
+	var errs []error
+	out := splitOutput(outStr, wantAuto)
+
+	// Cut directory name.
+	for i := range out {
+		for j := 0; j < len(fullshort); j += 2 {
+			full, short := fullshort[j], fullshort[j+1]
+			out[i] = strings.Replace(out[i], full, short, -1)
+		}
+	}
+
+	var want []wantedError
+	for j := 0; j < len(fullshort); j += 2 {
+		full, short := fullshort[j], fullshort[j+1]
+		want = append(want, t.wantedErrors(full, short)...)
+	}
+
+	for _, we := range want {
+		var errmsgs []string
+		if we.auto {
+			errmsgs, out = partitionStrings("<autogenerated>", out)
+		} else {
+			errmsgs, out = partitionStrings(we.prefix, out)
+		}
+		if len(errmsgs) == 0 {
+			errs = append(errs, fmt.Errorf("%s:%d: missing error %q", we.file, we.lineNum, we.reStr))
+			continue
+		}
+		matched := false
+		n := len(out)
+		for _, errmsg := range errmsgs {
+			// Assume errmsg says "file:line: foo".
+			// Cut leading "file:line: " to avoid accidental matching of file name instead of message.
+			text := errmsg
+			if _, suffix, ok := strings.Cut(text, " "); ok {
+				text = suffix
+			}
+			if we.re.MatchString(text) {
+				matched = true
+			} else {
+				out = append(out, errmsg)
+			}
+		}
+		if !matched {
+			errs = append(errs, fmt.Errorf("%s:%d: no match for %#q in:\n\t%s", we.file, we.lineNum, we.reStr, strings.Join(out[n:], "\n\t")))
+			continue
+		}
+	}
+
+	if len(out) > 0 {
+		errs = append(errs, fmt.Errorf("Unmatched Errors:"))
+		for _, errLine := range out {
+			errs = append(errs, fmt.Errorf("%s", errLine))
+		}
+	}
+
+	if len(errs) == 0 {
+		return nil
+	}
+	if len(errs) == 1 {
+		return errs[0]
+	}
+	var buf bytes.Buffer
+	fmt.Fprintf(&buf, "\n")
+	for _, err := range errs {
+		fmt.Fprintf(&buf, "%s\n", err.Error())
+	}
+	return errors.New(buf.String())
+}
+
+func (test) updateErrors(out, file string) {
+	base := path.Base(file)
+	// Read in source file.
+	src, err := os.ReadFile(file)
+	if err != nil {
+		fmt.Fprintln(os.Stderr, err)
+		return
+	}
+	lines := strings.Split(string(src), "\n")
+	// Remove old errors.
+	for i := range lines {
+		lines[i], _, _ = strings.Cut(lines[i], " // ERROR ")
+	}
+	// Parse new errors.
+	errors := make(map[int]map[string]bool)
+	tmpRe := regexp.MustCompile(`autotmp_\d+`)
+	for _, errStr := range splitOutput(out, false) {
+		errFile, rest, ok := strings.Cut(errStr, ":")
+		if !ok || errFile != file {
+			continue
+		}
+		lineStr, msg, ok := strings.Cut(rest, ":")
+		if !ok {
+			continue
+		}
+		line, err := strconv.Atoi(lineStr)
+		line--
+		if err != nil || line < 0 || line >= len(lines) {
+			continue
+		}
+		msg = strings.Replace(msg, file, base, -1) // normalize file mentions in error itself
+		msg = strings.TrimLeft(msg, " \t")
+		for _, r := range []string{`\`, `*`, `+`, `?`, `[`, `]`, `(`, `)`} {
+			msg = strings.Replace(msg, r, `\`+r, -1)
+		}
+		msg = strings.Replace(msg, `"`, `.`, -1)
+		msg = tmpRe.ReplaceAllLiteralString(msg, `autotmp_[0-9]+`)
+		if errors[line] == nil {
+			errors[line] = make(map[string]bool)
+		}
+		errors[line][msg] = true
+	}
+	// Add new errors.
+	for line, errs := range errors {
+		var sorted []string
+		for e := range errs {
+			sorted = append(sorted, e)
+		}
+		sort.Strings(sorted)
+		lines[line] += " // ERROR"
+		for _, e := range sorted {
+			lines[line] += fmt.Sprintf(` "%s$"`, e)
+		}
+	}
+	// Write new file.
+	err = os.WriteFile(file, []byte(strings.Join(lines, "\n")), 0640)
+	if err != nil {
+		fmt.Fprintln(os.Stderr, err)
+		return
+	}
+	// Polish.
+	exec.Command(goTool, "fmt", file).CombinedOutput()
+}
+
+// matchPrefix reports whether s is of the form ^(.*/)?prefix(:|[),
+// That is, it needs the file name prefix followed by a : or a [,
+// and possibly preceded by a directory name.
+func matchPrefix(s, prefix string) bool {
+	i := strings.Index(s, ":")
+	if i < 0 {
+		return false
+	}
+	j := strings.LastIndex(s[:i], "/")
+	s = s[j+1:]
+	if len(s) <= len(prefix) || s[:len(prefix)] != prefix {
+		return false
+	}
+	switch s[len(prefix)] {
+	case '[', ':':
+		return true
+	}
+	return false
+}
+
+func partitionStrings(prefix string, strs []string) (matched, unmatched []string) {
+	for _, s := range strs {
+		if matchPrefix(s, prefix) {
+			matched = append(matched, s)
+		} else {
+			unmatched = append(unmatched, s)
+		}
+	}
+	return
+}
+
+type wantedError struct {
+	reStr   string
+	re      *regexp.Regexp
+	lineNum int
+	auto    bool // match <autogenerated> line
+	file    string
+	prefix  string
+}
+
+var (
+	errRx       = regexp.MustCompile(`// (?:GC_)?ERROR (.*)`)
+	errAutoRx   = regexp.MustCompile(`// (?:GC_)?ERRORAUTO (.*)`)
+	errQuotesRx = regexp.MustCompile(`"([^"]*)"`)
+	lineRx      = regexp.MustCompile(`LINE(([+-])(\d+))?`)
+)
+
+func (t test) wantedErrors(file, short string) (errs []wantedError) {
+	cache := make(map[string]*regexp.Regexp)
+
+	src, _ := os.ReadFile(file)
+	for i, line := range strings.Split(string(src), "\n") {
+		lineNum := i + 1
+		if strings.Contains(line, "////") {
+			// double comment disables ERROR
+			continue
+		}
+		var auto bool
+		m := errAutoRx.FindStringSubmatch(line)
+		if m != nil {
+			auto = true
+		} else {
+			m = errRx.FindStringSubmatch(line)
+		}
+		if m == nil {
+			continue
+		}
+		all := m[1]
+		mm := errQuotesRx.FindAllStringSubmatch(all, -1)
+		if mm == nil {
+			t.Fatalf("%s:%d: invalid errchk line: %s", t.goFileName(), lineNum, line)
+		}
+		for _, m := range mm {
+			rx := lineRx.ReplaceAllStringFunc(m[1], func(m string) string {
+				n := lineNum
+				if strings.HasPrefix(m, "LINE+") {
+					delta, _ := strconv.Atoi(m[5:])
+					n += delta
+				} else if strings.HasPrefix(m, "LINE-") {
+					delta, _ := strconv.Atoi(m[5:])
+					n -= delta
+				}
+				return fmt.Sprintf("%s:%d", short, n)
+			})
+			re := cache[rx]
+			if re == nil {
+				var err error
+				re, err = regexp.Compile(rx)
+				if err != nil {
+					t.Fatalf("%s:%d: invalid regexp \"%s\" in ERROR line: %v", t.goFileName(), lineNum, rx, err)
+				}
+				cache[rx] = re
+			}
+			prefix := fmt.Sprintf("%s:%d", short, lineNum)
+			errs = append(errs, wantedError{
+				reStr:   rx,
+				re:      re,
+				prefix:  prefix,
+				auto:    auto,
+				lineNum: lineNum,
+				file:    short,
+			})
+		}
+	}
+
+	return
+}
+
+const (
+	// Regexp to match a single opcode check: optionally begin with "-" (to indicate
+	// a negative check), followed by a string literal enclosed in "" or ``. For "",
+	// backslashes must be handled.
+	reMatchCheck = `-?(?:\x60[^\x60]*\x60|"(?:[^"\\]|\\.)*")`
+)
+
+var (
+	// Regexp to split a line in code and comment, trimming spaces
+	rxAsmComment = regexp.MustCompile(`^\s*(.*?)\s*(?://\s*(.+)\s*)?$`)
+
+	// Regexp to extract an architecture check: architecture name (or triplet),
+	// followed by semi-colon, followed by a comma-separated list of opcode checks.
+	// Extraneous spaces are ignored.
+	rxAsmPlatform = regexp.MustCompile(`(\w+)(/\w+)?(/\w*)?\s*:\s*(` + reMatchCheck + `(?:\s*,\s*` + reMatchCheck + `)*)`)
+
+	// Regexp to extract a single opcoded check
+	rxAsmCheck = regexp.MustCompile(reMatchCheck)
+
+	// List of all architecture variants. Key is the GOARCH architecture,
+	// value[0] is the variant-changing environment variable, and values[1:]
+	// are the supported variants.
+	archVariants = map[string][]string{
+		"386":     {"GO386", "sse2", "softfloat"},
+		"amd64":   {"GOAMD64", "v1", "v2", "v3", "v4"},
+		"arm":     {"GOARM", "5", "6", "7"},
+		"arm64":   {},
+		"loong64": {},
+		"mips":    {"GOMIPS", "hardfloat", "softfloat"},
+		"mips64":  {"GOMIPS64", "hardfloat", "softfloat"},
+		"ppc64":   {"GOPPC64", "power8", "power9", "power10"},
+		"ppc64le": {"GOPPC64", "power8", "power9", "power10"},
+		"ppc64x":  {}, // A pseudo-arch representing both ppc64 and ppc64le
+		"s390x":   {},
+		"wasm":    {},
+		"riscv64": {},
+	}
+)
+
+// wantedAsmOpcode is a single asmcheck check
+type wantedAsmOpcode struct {
+	fileline string         // original source file/line (eg: "/path/foo.go:45")
+	line     int            // original source line
+	opcode   *regexp.Regexp // opcode check to be performed on assembly output
+	negative bool           // true if the check is supposed to fail rather than pass
+	found    bool           // true if the opcode check matched at least one in the output
+}
+
+// A build environment triplet separated by slashes (eg: linux/386/sse2).
+// The third field can be empty if the arch does not support variants (eg: "plan9/amd64/")
+type buildEnv string
+
+// Environ returns the environment it represents in cmd.Environ() "key=val" format
+// For instance, "linux/386/sse2".Environ() returns {"GOOS=linux", "GOARCH=386", "GO386=sse2"}
+func (b buildEnv) Environ() []string {
+	fields := strings.Split(string(b), "/")
+	if len(fields) != 3 {
+		panic("invalid buildEnv string: " + string(b))
+	}
+	env := []string{"GOOS=" + fields[0], "GOARCH=" + fields[1]}
+	if fields[2] != "" {
+		env = append(env, archVariants[fields[1]][0]+"="+fields[2])
+	}
+	return env
+}
+
+// asmChecks represents all the asmcheck checks present in a test file
+// The outer map key is the build triplet in which the checks must be performed.
+// The inner map key represent the source file line ("filename.go:1234") at which the
+// checks must be performed.
+type asmChecks map[buildEnv]map[string][]wantedAsmOpcode
+
+// Envs returns all the buildEnv in which at least one check is present
+func (a asmChecks) Envs() []buildEnv {
+	var envs []buildEnv
+	for e := range a {
+		envs = append(envs, e)
+	}
+	sort.Slice(envs, func(i, j int) bool {
+		return string(envs[i]) < string(envs[j])
+	})
+	return envs
+}
+
+func (t test) wantedAsmOpcodes(fn string) asmChecks {
+	ops := make(asmChecks)
+
+	comment := ""
+	src, err := os.ReadFile(fn)
+	if err != nil {
+		t.Fatal(err)
+	}
+	for i, line := range strings.Split(string(src), "\n") {
+		matches := rxAsmComment.FindStringSubmatch(line)
+		code, cmt := matches[1], matches[2]
+
+		// Keep comments pending in the comment variable until
+		// we find a line that contains some code.
+		comment += " " + cmt
+		if code == "" {
+			continue
+		}
+
+		// Parse and extract any architecture check from comments,
+		// made by one architecture name and multiple checks.
+		lnum := fn + ":" + strconv.Itoa(i+1)
+		for _, ac := range rxAsmPlatform.FindAllStringSubmatch(comment, -1) {
+			archspec, allchecks := ac[1:4], ac[4]
+
+			var arch, subarch, os string
+			switch {
+			case archspec[2] != "": // 3 components: "linux/386/sse2"
+				os, arch, subarch = archspec[0], archspec[1][1:], archspec[2][1:]
+			case archspec[1] != "": // 2 components: "386/sse2"
+				os, arch, subarch = "linux", archspec[0], archspec[1][1:]
+			default: // 1 component: "386"
+				os, arch, subarch = "linux", archspec[0], ""
+				if arch == "wasm" {
+					os = "js"
+				}
+			}
+
+			if _, ok := archVariants[arch]; !ok {
+				t.Fatalf("%s:%d: unsupported architecture: %v", t.goFileName(), i+1, arch)
+			}
+
+			// Create the build environments corresponding the above specifiers
+			envs := make([]buildEnv, 0, 4)
+			arches := []string{arch}
+			// ppc64x is a pseudo-arch, generate tests for both endian variants.
+			if arch == "ppc64x" {
+				arches = []string{"ppc64", "ppc64le"}
+			}
+			for _, arch := range arches {
+				if subarch != "" {
+					envs = append(envs, buildEnv(os+"/"+arch+"/"+subarch))
+				} else {
+					subarchs := archVariants[arch]
+					if len(subarchs) == 0 {
+						envs = append(envs, buildEnv(os+"/"+arch+"/"))
+					} else {
+						for _, sa := range archVariants[arch][1:] {
+							envs = append(envs, buildEnv(os+"/"+arch+"/"+sa))
+						}
+					}
+				}
+			}
+
+			for _, m := range rxAsmCheck.FindAllString(allchecks, -1) {
+				negative := false
+				if m[0] == '-' {
+					negative = true
+					m = m[1:]
+				}
+
+				rxsrc, err := strconv.Unquote(m)
+				if err != nil {
+					t.Fatalf("%s:%d: error unquoting string: %v", t.goFileName(), i+1, err)
+				}
+
+				// Compile the checks as regular expressions. Notice that we
+				// consider checks as matching from the beginning of the actual
+				// assembler source (that is, what is left on each line of the
+				// compile -S output after we strip file/line info) to avoid
+				// trivial bugs such as "ADD" matching "FADD". This
+				// doesn't remove genericity: it's still possible to write
+				// something like "F?ADD", but we make common cases simpler
+				// to get right.
+				oprx, err := regexp.Compile("^" + rxsrc)
+				if err != nil {
+					t.Fatalf("%s:%d: %v", t.goFileName(), i+1, err)
+				}
+
+				for _, env := range envs {
+					if ops[env] == nil {
+						ops[env] = make(map[string][]wantedAsmOpcode)
+					}
+					ops[env][lnum] = append(ops[env][lnum], wantedAsmOpcode{
+						negative: negative,
+						fileline: lnum,
+						line:     i + 1,
+						opcode:   oprx,
+					})
+				}
+			}
+		}
+		comment = ""
+	}
+
+	return ops
+}
+
+func (t test) asmCheck(outStr string, fn string, env buildEnv, fullops map[string][]wantedAsmOpcode) error {
+	// The assembly output contains the concatenated dump of multiple functions.
+	// the first line of each function begins at column 0, while the rest is
+	// indented by a tabulation. These data structures help us index the
+	// output by function.
+	functionMarkers := make([]int, 1)
+	lineFuncMap := make(map[string]int)
+
+	lines := strings.Split(outStr, "\n")
+	rxLine := regexp.MustCompile(fmt.Sprintf(`\((%s:\d+)\)\s+(.*)`, regexp.QuoteMeta(fn)))
+
+	for nl, line := range lines {
+		// Check if this line begins a function
+		if len(line) > 0 && line[0] != '\t' {
+			functionMarkers = append(functionMarkers, nl)
+		}
+
+		// Search if this line contains a assembly opcode (which is prefixed by the
+		// original source file/line in parenthesis)
+		matches := rxLine.FindStringSubmatch(line)
+		if len(matches) == 0 {
+			continue
+		}
+		srcFileLine, asm := matches[1], matches[2]
+
+		// Associate the original file/line information to the current
+		// function in the output; it will be useful to dump it in case
+		// of error.
+		lineFuncMap[srcFileLine] = len(functionMarkers) - 1
+
+		// If there are opcode checks associated to this source file/line,
+		// run the checks.
+		if ops, found := fullops[srcFileLine]; found {
+			for i := range ops {
+				if !ops[i].found && ops[i].opcode.FindString(asm) != "" {
+					ops[i].found = true
+				}
+			}
+		}
+	}
+	functionMarkers = append(functionMarkers, len(lines))
+
+	var failed []wantedAsmOpcode
+	for _, ops := range fullops {
+		for _, o := range ops {
+			// There's a failure if a negative match was found,
+			// or a positive match was not found.
+			if o.negative == o.found {
+				failed = append(failed, o)
+			}
+		}
+	}
+	if len(failed) == 0 {
+		return nil
+	}
+
+	// At least one asmcheck failed; report them.
+	lastFunction := -1
+	var errbuf bytes.Buffer
+	fmt.Fprintln(&errbuf)
+	sort.Slice(failed, func(i, j int) bool { return failed[i].line < failed[j].line })
+	for _, o := range failed {
+		// Dump the function in which this opcode check was supposed to
+		// pass but failed.
+		funcIdx := lineFuncMap[o.fileline]
+		if funcIdx != 0 && funcIdx != lastFunction {
+			funcLines := lines[functionMarkers[funcIdx]:functionMarkers[funcIdx+1]]
+			t.Log(strings.Join(funcLines, "\n"))
+			lastFunction = funcIdx // avoid printing same function twice
+		}
+
+		if o.negative {
+			fmt.Fprintf(&errbuf, "%s:%d: %s: wrong opcode found: %q\n", t.goFileName(), o.line, env, o.opcode.String())
+		} else {
+			fmt.Fprintf(&errbuf, "%s:%d: %s: opcode not found: %q\n", t.goFileName(), o.line, env, o.opcode.String())
+		}
+	}
+	return errors.New(errbuf.String())
+}
+
+// defaultRunOutputLimit returns the number of runoutput tests that
+// can be executed in parallel.
+func defaultRunOutputLimit() int {
+	const maxArmCPU = 2
+
+	cpu := runtime.NumCPU()
+	if runtime.GOARCH == "arm" && cpu > maxArmCPU {
+		cpu = maxArmCPU
+	}
+	return cpu
+}
+
+func TestShouldTest(t *testing.T) {
+	if *shard != 0 {
+		t.Skipf("nothing to test on shard index %d", *shard)
+	}
+
+	assert := func(ok bool, _ string) {
+		t.Helper()
+		if !ok {
+			t.Error("test case failed")
+		}
+	}
+	assertNot := func(ok bool, _ string) { t.Helper(); assert(!ok, "") }
+
+	// Simple tests.
+	assert(shouldTest("// +build linux", "linux", "arm"))
+	assert(shouldTest("// +build !windows", "linux", "arm"))
+	assertNot(shouldTest("// +build !windows", "windows", "amd64"))
+
+	// A file with no build tags will always be tested.
+	assert(shouldTest("// This is a test.", "os", "arch"))
+
+	// Build tags separated by a space are OR-ed together.
+	assertNot(shouldTest("// +build arm 386", "linux", "amd64"))
+
+	// Build tags separated by a comma are AND-ed together.
+	assertNot(shouldTest("// +build !windows,!plan9", "windows", "amd64"))
+	assertNot(shouldTest("// +build !windows,!plan9", "plan9", "386"))
+
+	// Build tags on multiple lines are AND-ed together.
+	assert(shouldTest("// +build !windows\n// +build amd64", "linux", "amd64"))
+	assertNot(shouldTest("// +build !windows\n// +build amd64", "windows", "amd64"))
+
+	// Test that (!a OR !b) matches anything.
+	assert(shouldTest("// +build !windows !plan9", "windows", "amd64"))
+}
+
+// overlayDir makes a minimal-overhead copy of srcRoot in which new files may be added.
+func overlayDir(dstRoot, srcRoot string) error {
+	dstRoot = filepath.Clean(dstRoot)
+	if err := os.MkdirAll(dstRoot, 0777); err != nil {
+		return err
+	}
+
+	srcRoot, err := filepath.Abs(srcRoot)
+	if err != nil {
+		return err
+	}
+
+	return filepath.WalkDir(srcRoot, func(srcPath string, d fs.DirEntry, err error) error {
+		if err != nil || srcPath == srcRoot {
+			return err
+		}
+
+		suffix := strings.TrimPrefix(srcPath, srcRoot)
+		for len(suffix) > 0 && suffix[0] == filepath.Separator {
+			suffix = suffix[1:]
+		}
+		dstPath := filepath.Join(dstRoot, suffix)
+
+		var info fs.FileInfo
+		if d.Type()&os.ModeSymlink != 0 {
+			info, err = os.Stat(srcPath)
+		} else {
+			info, err = d.Info()
+		}
+		if err != nil {
+			return err
+		}
+		perm := info.Mode() & os.ModePerm
+
+		// Always copy directories (don't symlink them).
+		// If we add a file in the overlay, we don't want to add it in the original.
+		if info.IsDir() {
+			return os.MkdirAll(dstPath, perm|0200)
+		}
+
+		// If the OS supports symlinks, use them instead of copying bytes.
+		if err := os.Symlink(srcPath, dstPath); err == nil {
+			return nil
+		}
+
+		// Otherwise, copy the bytes.
+		src, err := os.Open(srcPath)
+		if err != nil {
+			return err
+		}
+		defer src.Close()
+
+		dst, err := os.OpenFile(dstPath, os.O_WRONLY|os.O_CREATE|os.O_EXCL, perm)
+		if err != nil {
+			return err
+		}
+
+		_, err = io.Copy(dst, src)
+		if closeErr := dst.Close(); err == nil {
+			err = closeErr
+		}
+		return err
+	})
+}
+
+// The following sets of files are excluded from testing depending on configuration.
+// The types2Failures(32Bit) files pass with the 1.17 compiler but don't pass with
+// the 1.18 compiler using the new types2 type checker, or pass with sub-optimal
+// error(s).
+
+// List of files that the compiler cannot errorcheck with the new typechecker (types2).
+var types2Failures = setOf(
+	"shift1.go",               // types2 reports two new errors which are probably not right
+	"fixedbugs/issue10700.go", // types2 should give hint about ptr to interface
+	"fixedbugs/issue18331.go", // missing error about misuse of //go:noescape (irgen needs code from noder)
+	"fixedbugs/issue18419.go", // types2 reports no field or method member, but should say unexported
+	"fixedbugs/issue20233.go", // types2 reports two instead of one error (preference: 1.17 compiler)
+	"fixedbugs/issue20245.go", // types2 reports two instead of one error (preference: 1.17 compiler)
+	"fixedbugs/issue31053.go", // types2 reports "unknown field" instead of "cannot refer to unexported field"
+	"fixedbugs/notinheap.go",  // types2 doesn't report errors about conversions that are invalid due to //go:notinheap
+)
+
+var types2Failures32Bit = setOf(
+	"printbig.go",             // large untyped int passed to print (32-bit)
+	"fixedbugs/bug114.go",     // large untyped int passed to println (32-bit)
+	"fixedbugs/issue23305.go", // large untyped int passed to println (32-bit)
+)
+
+// In all of these cases, the 1.17 compiler reports reasonable errors, but either the
+// 1.17 or 1.18 compiler report extra errors, so we can't match correctly on both. We
+// now set the patterns to match correctly on all the 1.18 errors.
+// This list remains here just as a reference and for comparison - these files all pass.
+var _ = setOf(
+	"import1.go",      // types2 reports extra errors
+	"initializerr.go", // types2 reports extra error
+	"typecheck.go",    // types2 reports extra error at function call
+
+	"fixedbugs/bug176.go", // types2 reports all errors (pref: types2)
+	"fixedbugs/bug195.go", // types2 reports slight different errors, and an extra error
+	"fixedbugs/bug412.go", // types2 produces a follow-on error
+
+	"fixedbugs/issue11614.go", // types2 reports an extra error
+	"fixedbugs/issue17038.go", // types2 doesn't report a follow-on error (pref: types2)
+	"fixedbugs/issue23732.go", // types2 reports different (but ok) line numbers
+	"fixedbugs/issue4510.go",  // types2 reports different (but ok) line numbers
+	"fixedbugs/issue7525b.go", // types2 reports init cycle error on different line - ok otherwise
+	"fixedbugs/issue7525c.go", // types2 reports init cycle error on different line - ok otherwise
+	"fixedbugs/issue7525d.go", // types2 reports init cycle error on different line - ok otherwise
+	"fixedbugs/issue7525e.go", // types2 reports init cycle error on different line - ok otherwise
+	"fixedbugs/issue7525.go",  // types2 reports init cycle error on different line - ok otherwise
+)
+
+func setOf(keys ...string) map[string]bool {
+	m := make(map[string]bool, len(keys))
+	for _, key := range keys {
+		m[key] = true
+	}
+	return m
+}
+
+// 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"`}
+//
+// [copied from src/go/build/build.go]
+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
+}
diff --git a/src/cmd/link/cgo_test.go b/src/cmd/link/cgo_test.go
index 4393c3f..52db70e 100644
--- a/src/cmd/link/cgo_test.go
+++ b/src/cmd/link/cgo_test.go
@@ -6,11 +6,10 @@
 
 import (
 	"bytes"
-	"fmt"
 	"internal/testenv"
 	"os"
-	"os/exec"
 	"path/filepath"
+	"strconv"
 	"testing"
 )
 
@@ -21,12 +20,26 @@
 
 	t.Parallel()
 
-	for _, cc := range []string{"gcc", "clang"} {
-		for test := 0; test < 2; test++ {
-			t.Run(fmt.Sprintf("%s-%d", cc, test), func(t *testing.T) {
-				testCGOLTO(t, cc, test)
-			})
+	goEnv := func(arg string) string {
+		cmd := testenv.Command(t, testenv.GoToolPath(t), "env", arg)
+		cmd.Stderr = new(bytes.Buffer)
+
+		line, err := cmd.Output()
+		if err != nil {
+			t.Fatalf("%v: %v\n%s", cmd, err, cmd.Stderr)
 		}
+		out := string(bytes.TrimSpace(line))
+		t.Logf("%v: %q", cmd, out)
+		return out
+	}
+
+	cc := goEnv("CC")
+	cgoCflags := goEnv("CGO_CFLAGS")
+
+	for test := 0; test < 2; test++ {
+		t.Run(strconv.Itoa(test), func(t *testing.T) {
+			testCGOLTO(t, cc, cgoCflags, test)
+		})
 	}
 }
 
@@ -79,13 +92,9 @@
 }
 `
 
-func testCGOLTO(t *testing.T, cc string, test int) {
+func testCGOLTO(t *testing.T, cc, cgoCflags string, test int) {
 	t.Parallel()
 
-	if _, err := exec.LookPath(cc); err != nil {
-		t.Skipf("no %s compiler", cc)
-	}
-
 	dir := t.TempDir()
 
 	writeTempFile := func(name, contents string) {
@@ -108,12 +117,10 @@
 
 	cmd := testenv.Command(t, testenv.GoToolPath(t), "build")
 	cmd.Dir = dir
-	cmd.Env = append(os.Environ(),
-		"CC="+cc,
-		"CGO_CFLAGS=-flto",
-	)
+	cgoCflags += " -flto"
+	cmd.Env = append(cmd.Environ(), "CGO_CFLAGS="+cgoCflags)
 
-	t.Log("go build")
+	t.Logf("CGO_CFLAGS=%q %v", cgoCflags, cmd)
 	out, err := cmd.CombinedOutput()
 	t.Logf("%s", out)
 
diff --git a/src/cmd/link/doc.go b/src/cmd/link/doc.go
index a570132..ce0166f 100644
--- a/src/cmd/link/doc.go
+++ b/src/cmd/link/doc.go
@@ -18,8 +18,6 @@
 	-B note
 		Add an ELF_NT_GNU_BUILD_ID note when using ELF.
 		The value should start with 0x and be an even number of hex digits.
-	-D address
-		Set data segment address.
 	-E entry
 		Set entry symbol name.
 	-H type
@@ -34,7 +32,7 @@
 	-R quantum
 		Set address rounding quantum.
 	-T address
-		Set text segment address.
+		Set the start address of text symbols.
 	-V
 		Print linker version and exit.
 	-X importpath.name=value
diff --git a/src/cmd/link/dwarf_test.go b/src/cmd/link/dwarf_test.go
index 53dc686..124c915 100644
--- a/src/cmd/link/dwarf_test.go
+++ b/src/cmd/link/dwarf_test.go
@@ -10,6 +10,7 @@
 	"cmd/internal/objfile"
 	"cmd/internal/quoted"
 	"debug/dwarf"
+	"internal/platform"
 	"internal/testenv"
 	"os"
 	"os/exec"
@@ -54,8 +55,8 @@
 	testenv.MustHaveCGO(t)
 	testenv.MustHaveGoBuild(t)
 
-	if runtime.GOOS == "plan9" {
-		t.Skip("skipping on plan9; no DWARF symbol table in executables")
+	if !platform.ExecutableHasDWARF(runtime.GOOS, runtime.GOARCH) {
+		t.Skipf("skipping on %s/%s: no DWARF symbol table in executables", runtime.GOOS, runtime.GOARCH)
 	}
 
 	t.Parallel()
@@ -192,6 +193,9 @@
 		if runtime.GOOS == "windows" {
 			t.Skip("skipping Windows/c-archive; see Issue 35512 for more.")
 		}
+		if !platform.BuildModeSupported(runtime.Compiler, "c-archive", runtime.GOOS, runtime.GOARCH) {
+			t.Skipf("skipping c-archive test on unsupported platform %s-%s", runtime.GOOS, runtime.GOARCH)
+		}
 		t.Run("c-archive", func(t *testing.T) {
 			testDWARF(t, "c-archive", true)
 		})
diff --git a/src/cmd/link/elf_test.go b/src/cmd/link/elf_test.go
index 27285ff..d662145 100644
--- a/src/cmd/link/elf_test.go
+++ b/src/cmd/link/elf_test.go
@@ -340,7 +340,7 @@
 					t.Logf("%s", out)
 				}
 				if err != nil {
-					t.Error(err)
+					t.Log(err)
 				}
 				return err
 			}
@@ -358,6 +358,9 @@
 			}()
 			wg.Wait()
 			if errexe != nil || errpie != nil {
+				if runtime.GOOS == "android" && runtime.GOARCH == "arm64" {
+					testenv.SkipFlaky(t, 58806)
+				}
 				t.Fatal("link failed")
 			}
 
diff --git a/src/cmd/link/internal/amd64/asm.go b/src/cmd/link/internal/amd64/asm.go
index f4832ef..4d95f61 100644
--- a/src/cmd/link/internal/amd64/asm.go
+++ b/src/cmd/link/internal/amd64/asm.go
@@ -446,7 +446,7 @@
 	rs := r.Xsym
 	rt := r.Type
 
-	if ldr.SymType(rs) == sym.SHOSTOBJ || rt == objabi.R_PCREL || rt == objabi.R_GOTPCREL || rt == objabi.R_CALL {
+	if rt == objabi.R_PCREL || rt == objabi.R_GOTPCREL || rt == objabi.R_CALL || ldr.SymType(rs) == sym.SHOSTOBJ || ldr.SymType(s) == sym.SINITARR {
 		if ldr.SymDynid(rs) < 0 {
 			ldr.Errorf(s, "reloc %d (%s) to non-macho symbol %s type=%d (%s)", rt, sym.RelocName(arch, rt), ldr.SymName(rs), ldr.SymType(rs), ldr.SymType(rs))
 			return false
@@ -532,6 +532,9 @@
 			v = ld.IMAGE_REL_AMD64_ADDR32
 		}
 
+	case objabi.R_PEIMAGEOFF:
+		v = ld.IMAGE_REL_AMD64_ADDR32NB
+
 	case objabi.R_CALL,
 		objabi.R_PCREL:
 		v = ld.IMAGE_REL_AMD64_REL32
diff --git a/src/cmd/link/internal/amd64/obj.go b/src/cmd/link/internal/amd64/obj.go
index c5e2117..b99cdbc 100644
--- a/src/cmd/link/internal/amd64/obj.go
+++ b/src/cmd/link/internal/amd64/obj.go
@@ -55,22 +55,25 @@
 		Archinit:         archinit,
 		Archreloc:        archreloc,
 		Archrelocvariant: archrelocvariant,
-		Elfreloc1:        elfreloc1,
-		ElfrelocSize:     24,
-		Elfsetupplt:      elfsetupplt,
 		Gentext:          gentext,
 		Machoreloc1:      machoreloc1,
 		MachorelocSize:   8,
 		PEreloc1:         pereloc1,
 		TLSIEtoLE:        tlsIEtoLE,
 
-		Linuxdynld:     "/lib64/ld-linux-x86-64.so.2",
-		LinuxdynldMusl: "/lib/ld-musl-x86_64.so.1",
-		Freebsddynld:   "/libexec/ld-elf.so.1",
-		Openbsddynld:   "/usr/libexec/ld.so",
-		Netbsddynld:    "/libexec/ld.elf_so",
-		Dragonflydynld: "/usr/libexec/ld-elf.so.2",
-		Solarisdynld:   "/lib/amd64/ld.so.1",
+		ELF: ld.ELFArch{
+			Linuxdynld:     "/lib64/ld-linux-x86-64.so.2",
+			LinuxdynldMusl: "/lib/ld-musl-x86_64.so.1",
+			Freebsddynld:   "/libexec/ld-elf.so.1",
+			Openbsddynld:   "/usr/libexec/ld.so",
+			Netbsddynld:    "/libexec/ld.elf_so",
+			Dragonflydynld: "/usr/libexec/ld-elf.so.2",
+			Solarisdynld:   "/lib/amd64/ld.so.1",
+
+			Reloc1:    elfreloc1,
+			RelocSize: 24,
+			SetupPLT:  elfsetupplt,
+		},
 	}
 
 	return arch, theArch
diff --git a/src/cmd/link/internal/arm/asm.go b/src/cmd/link/internal/arm/asm.go
index 1e4b36d..b432da8 100644
--- a/src/cmd/link/internal/arm/asm.go
+++ b/src/cmd/link/internal/arm/asm.go
@@ -356,6 +356,9 @@
 
 	case objabi.R_ADDR:
 		v = ld.IMAGE_REL_ARM_ADDR32
+
+	case objabi.R_PEIMAGEOFF:
+		v = ld.IMAGE_REL_ARM_ADDR32NB
 	}
 
 	out.Write16(uint16(v))
@@ -417,7 +420,7 @@
 				t = (ldr.SymValue(rs) + int64(signext24(r.Add()&0xffffff)*4) - (ldr.SymValue(s) + int64(r.Off()))) / 4
 			}
 		}
-		if t > 0x7fffff || t < -0x800000 || ldr.SymValue(rs) == 0 || (*ld.FlagDebugTramp > 1 && ldr.SymPkg(s) != ldr.SymPkg(rs)) {
+		if t > 0x7fffff || t <= -0x800000 || ldr.SymValue(rs) == 0 || (*ld.FlagDebugTramp > 1 && ldr.SymPkg(s) != ldr.SymPkg(rs)) {
 			// direct call too far, need to insert trampoline.
 			// look up existing trampolines first. if we found one within the range
 			// of direct call, we can reuse it. otherwise create a new one.
diff --git a/src/cmd/link/internal/arm/obj.go b/src/cmd/link/internal/arm/obj.go
index 6da0c77..52fd5b6 100644
--- a/src/cmd/link/internal/arm/obj.go
+++ b/src/cmd/link/internal/arm/obj.go
@@ -55,20 +55,23 @@
 		Archrelocvariant: archrelocvariant,
 		Extreloc:         extreloc,
 		Trampoline:       trampoline,
-		Elfreloc1:        elfreloc1,
-		ElfrelocSize:     8,
-		Elfsetupplt:      elfsetupplt,
 		Gentext:          gentext,
 		Machoreloc1:      machoreloc1,
 		PEreloc1:         pereloc1,
 
-		Linuxdynld:     "/lib/ld-linux.so.3", // 2 for OABI, 3 for EABI
-		LinuxdynldMusl: "/lib/ld-musl-arm.so.1",
-		Freebsddynld:   "/usr/libexec/ld-elf.so.1",
-		Openbsddynld:   "/usr/libexec/ld.so",
-		Netbsddynld:    "/libexec/ld.elf_so",
-		Dragonflydynld: "XXX",
-		Solarisdynld:   "XXX",
+		ELF: ld.ELFArch{
+			Linuxdynld:     "/lib/ld-linux.so.3", // 2 for OABI, 3 for EABI
+			LinuxdynldMusl: "/lib/ld-musl-arm.so.1",
+			Freebsddynld:   "/usr/libexec/ld-elf.so.1",
+			Openbsddynld:   "/usr/libexec/ld.so",
+			Netbsddynld:    "/libexec/ld.elf_so",
+			Dragonflydynld: "XXX",
+			Solarisdynld:   "XXX",
+
+			Reloc1:    elfreloc1,
+			RelocSize: 8,
+			SetupPLT:  elfsetupplt,
+		},
 	}
 
 	return arch, theArch
diff --git a/src/cmd/link/internal/arm64/asm.go b/src/cmd/link/internal/arm64/asm.go
index fc0ad3f..69d430b 100644
--- a/src/cmd/link/internal/arm64/asm.go
+++ b/src/cmd/link/internal/arm64/asm.go
@@ -537,11 +537,19 @@
 			ldr.Errorf(s, "internal error: relocation addend overflow: %s+0x%x", ldr.SymName(rs), xadd)
 		}
 	}
+	if rt == objabi.R_CALLARM64 && xadd != 0 {
+		label := ldr.Lookup(offsetLabelName(ldr, rs, xadd), ldr.SymVersion(rs))
+		if label != 0 {
+			xadd = ldr.SymValue(rs) + xadd - ldr.SymValue(label) // should always be 0 (checked below)
+			rs = label
+		}
+	}
 
-	if ldr.SymType(rs) == sym.SHOSTOBJ || rt == objabi.R_CALLARM64 ||
+	if rt == objabi.R_CALLARM64 ||
 		rt == objabi.R_ARM64_PCREL_LDST8 || rt == objabi.R_ARM64_PCREL_LDST16 ||
 		rt == objabi.R_ARM64_PCREL_LDST32 || rt == objabi.R_ARM64_PCREL_LDST64 ||
-		rt == objabi.R_ADDRARM64 || rt == objabi.R_ARM64_GOTPCREL {
+		rt == objabi.R_ADDRARM64 || rt == objabi.R_ARM64_GOTPCREL ||
+		ldr.SymType(rs) == sym.SHOSTOBJ || ldr.SymType(s) == sym.SINITARR {
 		if ldr.SymDynid(rs) < 0 {
 			ldr.Errorf(s, "reloc %d (%s) to non-macho symbol %s type=%d (%s)", rt, sym.RelocName(arch, rt), ldr.SymName(rs), ldr.SymType(rs), ldr.SymType(rs))
 			return false
@@ -564,10 +572,9 @@
 		v |= ld.MACHO_ARM64_RELOC_UNSIGNED << 28
 	case objabi.R_CALLARM64:
 		if xadd != 0 {
-			out.Write32(uint32(sectoff))
-			out.Write32((ld.MACHO_ARM64_RELOC_ADDEND << 28) | (2 << 25) | uint32(xadd&0xffffff))
+			// Addend should be handled above via label symbols.
+			ldr.Errorf(s, "unexpected non-zero addend: %s+%d", ldr.SymName(rs), xadd)
 		}
-
 		v |= 1 << 24 // pc-relative bit
 		v |= ld.MACHO_ARM64_RELOC_BRANCH26 << 28
 	case objabi.R_ADDRARM64,
@@ -673,6 +680,9 @@
 			out.Write16(ld.IMAGE_REL_ARM64_ADDR32)
 		}
 
+	case objabi.R_PEIMAGEOFF:
+		out.Write16(ld.IMAGE_REL_ARM64_ADDR32NB)
+
 	case objabi.R_ADDRARM64:
 		// Note: r.Xadd has been taken care of below, in archreloc.
 		out.Write32(uint32(sectoff))
@@ -788,9 +798,6 @@
 
 		case objabi.R_CALLARM64:
 			nExtReloc = 1
-			if target.IsDarwin() && r.Add() != 0 {
-				nExtReloc = 2 // need another relocation for addend
-			}
 			return val, nExtReloc, isOk
 
 		case objabi.R_ARM64_TLS_LE:
@@ -1184,6 +1191,9 @@
 	// addend. For large symbols, we generate "label" symbols in the middle, so
 	// that relocations can target them with smaller addends.
 	// On Windows, we only get 21 bits, again (presumably) signed.
+	// Also, on Windows (always) and Darwin (for very large binaries), the external
+	// linker does't support CALL relocations with addend, so we generate "label"
+	// symbols for functions of which we can target the middle (Duff's devices).
 	if !ctxt.IsDarwin() && !ctxt.IsWindows() || !ctxt.IsExternal() {
 		return
 	}
@@ -1193,19 +1203,6 @@
 		limit = peRelocLimit
 	}
 
-	if ctxt.IsDarwin() {
-		big := false
-		for _, seg := range ld.Segments {
-			if seg.Length >= machoRelocLimit {
-				big = true
-				break
-			}
-		}
-		if !big {
-			return // skip work if nothing big
-		}
-	}
-
 	// addLabelSyms adds "label" symbols at s+limit, s+2*limit, etc.
 	addLabelSyms := func(s loader.Sym, limit, sz int64) {
 		v := ldr.SymValue(s)
@@ -1225,23 +1222,36 @@
 		}
 	}
 
+	// Generate symbol names for every offset we need in duffcopy/duffzero (only 64 each).
+	if s := ldr.Lookup("runtime.duffcopy", sym.SymVerABIInternal); s != 0 && ldr.AttrReachable(s) {
+		addLabelSyms(s, 8, 8*64)
+	}
+	if s := ldr.Lookup("runtime.duffzero", sym.SymVerABIInternal); s != 0 && ldr.AttrReachable(s) {
+		addLabelSyms(s, 4, 4*64)
+	}
+
+	if ctxt.IsDarwin() {
+		big := false
+		for _, seg := range ld.Segments {
+			if seg.Length >= machoRelocLimit {
+				big = true
+				break
+			}
+		}
+		if !big {
+			return // skip work if nothing big
+		}
+	}
+
 	for s, n := loader.Sym(1), loader.Sym(ldr.NSym()); s < n; s++ {
 		if !ldr.AttrReachable(s) {
 			continue
 		}
 		t := ldr.SymType(s)
 		if t == sym.STEXT {
-			if ctxt.IsDarwin() || ctxt.IsWindows() {
-				// Cannot relocate into middle of function.
-				// Generate symbol names for every offset we need in duffcopy/duffzero (only 64 each).
-				switch ldr.SymName(s) {
-				case "runtime.duffcopy":
-					addLabelSyms(s, 8, 8*64)
-				case "runtime.duffzero":
-					addLabelSyms(s, 4, 4*64)
-				}
-			}
-			continue // we don't target the middle of other functions
+			// Except for Duff's devices (handled above), we don't
+			// target the middle of a function.
+			continue
 		}
 		if t >= sym.SDWARFSECT {
 			continue // no need to add label for DWARF symbols
diff --git a/src/cmd/link/internal/arm64/obj.go b/src/cmd/link/internal/arm64/obj.go
index a47be0b..34b693e 100644
--- a/src/cmd/link/internal/arm64/obj.go
+++ b/src/cmd/link/internal/arm64/obj.go
@@ -52,9 +52,6 @@
 		Archreloc:        archreloc,
 		Archrelocvariant: archrelocvariant,
 		Extreloc:         extreloc,
-		Elfreloc1:        elfreloc1,
-		ElfrelocSize:     24,
-		Elfsetupplt:      elfsetupplt,
 		Gentext:          gentext,
 		GenSymsLate:      gensymlate,
 		Machoreloc1:      machoreloc1,
@@ -62,15 +59,21 @@
 		PEreloc1:         pereloc1,
 		Trampoline:       trampoline,
 
-		Androiddynld:   "/system/bin/linker64",
-		Linuxdynld:     "/lib/ld-linux-aarch64.so.1",
-		LinuxdynldMusl: "/lib/ld-musl-aarch64.so.1",
+		ELF: ld.ELFArch{
+			Androiddynld:   "/system/bin/linker64",
+			Linuxdynld:     "/lib/ld-linux-aarch64.so.1",
+			LinuxdynldMusl: "/lib/ld-musl-aarch64.so.1",
 
-		Freebsddynld:   "/usr/libexec/ld-elf.so.1",
-		Openbsddynld:   "/usr/libexec/ld.so",
-		Netbsddynld:    "/libexec/ld.elf_so",
-		Dragonflydynld: "XXX",
-		Solarisdynld:   "XXX",
+			Freebsddynld:   "/usr/libexec/ld-elf.so.1",
+			Openbsddynld:   "/usr/libexec/ld.so",
+			Netbsddynld:    "/libexec/ld.elf_so",
+			Dragonflydynld: "XXX",
+			Solarisdynld:   "XXX",
+
+			Reloc1:    elfreloc1,
+			RelocSize: 24,
+			SetupPLT:  elfsetupplt,
+		},
 	}
 
 	return arch, theArch
diff --git a/src/cmd/link/internal/benchmark/bench.go b/src/cmd/link/internal/benchmark/bench.go
index 7c6f278..96fa04a 100644
--- a/src/cmd/link/internal/benchmark/bench.go
+++ b/src/cmd/link/internal/benchmark/bench.go
@@ -106,7 +106,7 @@
 	fmt.Fprintf(w, "%s 1 %d ns/op\n", makeBenchString("total time"+gcString), totTime.Nanoseconds())
 }
 
-// Starts marks the beginning of a new measurement phase.
+// Start marks the beginning of a new measurement phase.
 // Once a metric is started, it continues until either a Report is issued, or another Start is called.
 func (m *Metrics) Start(name string) {
 	if m == nil {
diff --git a/src/cmd/link/internal/ld/asmb.go b/src/cmd/link/internal/ld/asmb.go
index cd8927b..ca9a577 100644
--- a/src/cmd/link/internal/ld/asmb.go
+++ b/src/cmd/link/internal/ld/asmb.go
@@ -60,6 +60,13 @@
 
 	writeParallel(&wg, dwarfblk, ctxt, Segdwarf.Fileoff, Segdwarf.Vaddr, Segdwarf.Filelen)
 
+	if Segpdata.Filelen > 0 {
+		writeParallel(&wg, pdatablk, ctxt, Segpdata.Fileoff, Segpdata.Vaddr, Segpdata.Filelen)
+	}
+	if Segxdata.Filelen > 0 {
+		writeParallel(&wg, xdatablk, ctxt, Segxdata.Fileoff, Segxdata.Vaddr, Segxdata.Filelen)
+	}
+
 	wg.Wait()
 }
 
diff --git a/src/cmd/link/internal/ld/config.go b/src/cmd/link/internal/ld/config.go
index 336cb33..c0484d6 100644
--- a/src/cmd/link/internal/ld/config.go
+++ b/src/cmd/link/internal/ld/config.go
@@ -5,7 +5,6 @@
 package ld
 
 import (
-	"cmd/internal/sys"
 	"fmt"
 	"internal/buildcfg"
 	"internal/platform"
@@ -27,10 +26,9 @@
 	BuildModePlugin
 )
 
+// Set implements flag.Value to set the build mode based on the argument
+// to the -buildmode flag.
 func (mode *BuildMode) Set(s string) error {
-	badmode := func() error {
-		return fmt.Errorf("buildmode %s not supported on %s/%s", s, buildcfg.GOOS, buildcfg.GOARCH)
-	}
 	switch s {
 	default:
 		return fmt.Errorf("invalid buildmode: %q", s)
@@ -42,81 +40,21 @@
 			*mode = BuildModeExe
 		}
 	case "pie":
-		switch buildcfg.GOOS {
-		case "aix", "android", "linux", "windows", "darwin", "ios":
-		case "freebsd":
-			switch buildcfg.GOARCH {
-			case "amd64":
-			default:
-				return badmode()
-			}
-		default:
-			return badmode()
-		}
 		*mode = BuildModePIE
 	case "c-archive":
-		switch buildcfg.GOOS {
-		case "aix", "darwin", "ios", "linux":
-		case "freebsd":
-			switch buildcfg.GOARCH {
-			case "amd64":
-			default:
-				return badmode()
-			}
-		case "windows":
-			switch buildcfg.GOARCH {
-			case "amd64", "386", "arm", "arm64":
-			default:
-				return badmode()
-			}
-		default:
-			return badmode()
-		}
 		*mode = BuildModeCArchive
 	case "c-shared":
-		switch buildcfg.GOARCH {
-		case "386", "amd64", "arm", "arm64", "ppc64le", "riscv64", "s390x":
-		default:
-			return badmode()
-		}
 		*mode = BuildModeCShared
 	case "shared":
-		switch buildcfg.GOOS {
-		case "linux":
-			switch buildcfg.GOARCH {
-			case "386", "amd64", "arm", "arm64", "ppc64le", "s390x":
-			default:
-				return badmode()
-			}
-		default:
-			return badmode()
-		}
 		*mode = BuildModeShared
 	case "plugin":
-		switch buildcfg.GOOS {
-		case "linux":
-			switch buildcfg.GOARCH {
-			case "386", "amd64", "arm", "arm64", "s390x", "ppc64le":
-			default:
-				return badmode()
-			}
-		case "darwin":
-			switch buildcfg.GOARCH {
-			case "amd64", "arm64":
-			default:
-				return badmode()
-			}
-		case "freebsd":
-			switch buildcfg.GOARCH {
-			case "amd64":
-			default:
-				return badmode()
-			}
-		default:
-			return badmode()
-		}
 		*mode = BuildModePlugin
 	}
+
+	if !platform.BuildModeSupported("gc", s, buildcfg.GOOS, buildcfg.GOARCH) {
+		return fmt.Errorf("buildmode %s not supported on %s/%s", s, buildcfg.GOOS, buildcfg.GOARCH)
+	}
+
 	return nil
 }
 
@@ -186,7 +124,7 @@
 		}()
 	}
 
-	if platform.MustLinkExternal(buildcfg.GOOS, buildcfg.GOARCH) {
+	if platform.MustLinkExternal(buildcfg.GOOS, buildcfg.GOARCH, false) {
 		return true, fmt.Sprintf("%s/%s requires external linking", buildcfg.GOOS, buildcfg.GOARCH)
 	}
 
@@ -198,25 +136,9 @@
 		return true, "asan"
 	}
 
-	// Internally linking cgo is incomplete on some architectures.
-	// https://golang.org/issue/14449
-	if iscgo && ctxt.Arch.InFamily(sys.Loong64, sys.MIPS64, sys.MIPS, sys.RISCV64) {
+	if iscgo && platform.MustLinkExternal(buildcfg.GOOS, buildcfg.GOARCH, true) {
 		return true, buildcfg.GOARCH + " does not support internal cgo"
 	}
-	if iscgo && (buildcfg.GOOS == "android" || buildcfg.GOOS == "dragonfly") {
-		// It seems that on Dragonfly thread local storage is
-		// set up by the dynamic linker, so internal cgo linking
-		// doesn't work. Test case is "go test runtime/cgo".
-		return true, buildcfg.GOOS + " does not support internal cgo"
-	}
-	if iscgo && buildcfg.GOOS == "windows" && buildcfg.GOARCH == "arm64" {
-		// windows/arm64 internal linking is not implemented.
-		return true, buildcfg.GOOS + "/" + buildcfg.GOARCH + " does not support internal cgo"
-	}
-	if iscgo && ctxt.Arch == sys.ArchPPC64 {
-		// Big Endian PPC64 cgo internal linking is not implemented for aix or linux.
-		return true, buildcfg.GOOS + " does not support internal cgo"
-	}
 
 	// Some build modes require work the internal linker cannot do (yet).
 	switch ctxt.BuildMode {
@@ -225,12 +147,7 @@
 	case BuildModeCShared:
 		return true, "buildmode=c-shared"
 	case BuildModePIE:
-		switch buildcfg.GOOS + "/" + buildcfg.GOARCH {
-		case "android/arm64":
-		case "linux/amd64", "linux/arm64", "linux/ppc64le":
-		case "windows/386", "windows/amd64", "windows/arm", "windows/arm64":
-		case "darwin/amd64", "darwin/arm64":
-		default:
+		if !platform.InternalLinkPIESupported(buildcfg.GOOS, buildcfg.GOARCH) {
 			// Internal linking does not support TLS_IE.
 			return true, "buildmode=pie"
 		}
@@ -281,7 +198,11 @@
 			ctxt.LinkMode = LinkExternal
 			via = "via GO_EXTLINK_ENABLED "
 		default:
-			if extNeeded || (iscgo && externalobj) {
+			preferExternal := len(preferlinkext) != 0
+			if preferExternal && ctxt.Debugvlog > 0 {
+				ctxt.Logf("external linking prefer list is %v\n", preferlinkext)
+			}
+			if extNeeded || (iscgo && (externalobj || preferExternal)) {
 				ctxt.LinkMode = LinkExternal
 			} else {
 				ctxt.LinkMode = LinkInternal
diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go
index 925e554..0550f07 100644
--- a/src/cmd/link/internal/ld/data.go
+++ b/src/cmd/link/internal/ld/data.go
@@ -84,6 +84,9 @@
 		}
 	}
 
+	if ctxt.IsARM() {
+		return n * 20 // Trampolines in ARM range from 3 to 5 instructions.
+	}
 	if ctxt.IsPPC64() {
 		return n * 16 // Trampolines in PPC64 are 4 instructions.
 	}
@@ -342,7 +345,7 @@
 			} else {
 				log.Fatalf("cannot handle R_TLS_IE (sym %s) when linking internally", ldr.SymName(s))
 			}
-		case objabi.R_ADDR:
+		case objabi.R_ADDR, objabi.R_PEIMAGEOFF:
 			if weak && !ldr.AttrReachable(rs) {
 				// Redirect it to runtime.unreachableMethod, which will throw if called.
 				rs = syms.unreachableMethod
@@ -365,7 +368,9 @@
 						o = 0
 					}
 				} else if target.IsDarwin() {
-					if ldr.SymType(rs) != sym.SHOSTOBJ {
+					if ldr.SymType(rs) != sym.SHOSTOBJ && ldr.SymType(s) != sym.SINITARR {
+						// ld-prime drops the offset in data for SINITARR. We need to use
+						// symbol-targeted relocation. See also machoreloc1.
 						o += ldr.SymValue(rs)
 					}
 				} else if target.IsWindows() {
@@ -395,6 +400,11 @@
 			}
 
 			o = ldr.SymValue(rs) + r.Add()
+			if rt == objabi.R_PEIMAGEOFF {
+				// The R_PEIMAGEOFF offset is a RVA, so subtract
+				// the base address for the executable.
+				o -= PEBASE
+			}
 
 			// On amd64, 4-byte offsets will be sign-extended, so it is impossible to
 			// access more than 2GB of static data; fail at link time is better than
@@ -441,14 +451,21 @@
 			if weak && !ldr.AttrReachable(rs) {
 				continue
 			}
-			if ldr.SymSect(rs) == nil {
-				st.err.Errorf(s, "unreachable sym in relocation: %s", ldr.SymName(rs))
+			sect := ldr.SymSect(rs)
+			if sect == nil {
+				if rst == sym.SDYNIMPORT {
+					st.err.Errorf(s, "cannot target DYNIMPORT sym in section-relative reloc: %s", ldr.SymName(rs))
+				} else if rst == sym.SUNDEFEXT {
+					st.err.Errorf(s, "undefined symbol in relocation: %s", ldr.SymName(rs))
+				} else {
+					st.err.Errorf(s, "missing section for relocation target %s", ldr.SymName(rs))
+				}
 				continue
 			}
 
 			// The method offset tables using this relocation expect the offset to be relative
 			// to the start of the first text section, even if there are multiple.
-			if ldr.SymSect(rs).Name == ".text" {
+			if sect.Name == ".text" {
 				o = ldr.SymValue(rs) - int64(Segtext.Sections[0].Vaddr) + r.Add()
 			} else {
 				o = ldr.SymValue(rs) - int64(ldr.SymSect(rs).Vaddr) + r.Add()
@@ -629,7 +646,7 @@
 		}
 		return rr, false
 
-	case objabi.R_ADDR:
+	case objabi.R_ADDR, objabi.R_PEIMAGEOFF:
 		// set up addend for eventual relocation via outer symbol.
 		rs := r.Sym()
 		if r.Weak() && !ldr.AttrReachable(rs) {
@@ -1065,7 +1082,8 @@
 		}
 		P := out.WriteSym(ldr, s)
 		st.relocsym(s, P)
-		if f, ok := ctxt.generatorSyms[s]; ok {
+		if ldr.IsGeneratedSym(s) {
+			f := ctxt.generatorSyms[s]
 			f(ctxt, s)
 		}
 		addr += int64(len(P))
@@ -1138,6 +1156,14 @@
 	writeBlocks(ctxt, out, ctxt.outSem, ctxt.loader, syms, addr, size, zeros[:])
 }
 
+func pdatablk(ctxt *Link, out *OutBuf, addr int64, size int64) {
+	writeBlocks(ctxt, out, ctxt.outSem, ctxt.loader, []loader.Sym{sehp.pdata}, addr, size, zeros[:])
+}
+
+func xdatablk(ctxt *Link, out *OutBuf, addr int64, size int64) {
+	writeBlocks(ctxt, out, ctxt.outSem, ctxt.loader, []loader.Sym{sehp.xdata}, addr, size, zeros[:])
+}
+
 var covCounterDataStartOff, covCounterDataLen uint64
 
 var zeros [512]byte
@@ -1333,9 +1359,19 @@
 // (see issue #9862).
 const cutoff = 2e9 // 2 GB (or so; looks better in errors than 2^31)
 
+// check accumulated size of data sections
 func (state *dodataState) checkdatsize(symn sym.SymKind) {
 	if state.datsize > cutoff {
-		Errorf(nil, "too much data in section %v (over %v bytes)", symn, cutoff)
+		Errorf(nil, "too much data, last section %v (%d, over %v bytes)", symn, state.datsize, cutoff)
+	}
+}
+
+func checkSectSize(sect *sym.Section) {
+	// TODO: consider using 4 GB size limit for DWARF sections, and
+	// make sure we generate unsigned offset in relocations and check
+	// for overflow.
+	if sect.Length > cutoff {
+		Errorf(nil, "too much data in section %s (%d, over %v bytes)", sect.Name, sect.Length, cutoff)
 	}
 }
 
@@ -1633,6 +1669,8 @@
 	// data/rodata (and related) symbols.
 	state.allocateDataSections(ctxt)
 
+	state.allocateSEHSections(ctxt)
+
 	// Create *sym.Section objects and assign symbols to sections for
 	// DWARF symbols.
 	state.allocateDwarfSections(ctxt)
@@ -1660,9 +1698,17 @@
 		sect.Extnum = n
 		n++
 	}
+	for _, sect := range Segpdata.Sections {
+		sect.Extnum = n
+		n++
+	}
+	for _, sect := range Segxdata.Sections {
+		sect.Extnum = n
+		n++
+	}
 }
 
-// allocateDataSectionForSym creates a new sym.Section into which a a
+// allocateDataSectionForSym creates a new sym.Section into which a
 // single symbol will be placed. Here "seg" is the segment into which
 // the section will go, "s" is the symbol to be placed into the new
 // section, and "rwx" contains permissions for the section.
@@ -2128,7 +2174,22 @@
 			}
 		}
 		sect.Length = uint64(state.datsize) - sect.Vaddr
-		state.checkdatsize(curType)
+		checkSectSize(sect)
+	}
+}
+
+// allocateSEHSections allocate a sym.Section object for SEH
+// symbols, and assigns symbols to sections.
+func (state *dodataState) allocateSEHSections(ctxt *Link) {
+	if sehp.pdata > 0 {
+		sect := state.allocateDataSectionForSym(&Segpdata, sehp.pdata, 04)
+		state.assignDsymsToSection(sect, []loader.Sym{sehp.pdata}, sym.SRODATA, aligndatsize)
+		state.checkdatsize(sym.SSEHSECT)
+	}
+	if sehp.xdata > 0 {
+		sect := state.allocateNamedDataSection(&Segxdata, ".xdata", []sym.SymKind{}, 04)
+		state.assignDsymsToSection(sect, []loader.Sym{sehp.xdata}, sym.SRODATA, aligndatsize)
+		state.checkdatsize(sym.SSEHSECT)
 	}
 }
 
@@ -2140,12 +2201,22 @@
 }
 
 func (state *dodataState) dodataSect(ctxt *Link, symn sym.SymKind, syms []loader.Sym) (result []loader.Sym, maxAlign int32) {
-	var head, tail loader.Sym
+	var head, tail, zerobase loader.Sym
 	ldr := ctxt.loader
 	sl := make([]symNameSize, len(syms))
+
+	// For ppc64, we want to interleave the .got and .toc sections
+	// from input files. Both are type sym.SELFGOT, so in that case
+	// we skip size comparison and do the name comparison instead
+	// (conveniently, .got sorts before .toc).
+	checkSize := symn != sym.SELFGOT
+
 	for k, s := range syms {
 		ss := ldr.SymSize(s)
-		sl[k] = symNameSize{name: ldr.SymName(s), sz: ss, sym: s}
+		sl[k] = symNameSize{sz: ss, sym: s}
+		if !checkSize {
+			sl[k].name = ldr.SymName(s)
+		}
 		ds := int64(len(ldr.Data(s)))
 		switch {
 		case ss < ds:
@@ -2170,34 +2241,35 @@
 			}
 		}
 	}
-
-	// For ppc64, we want to interleave the .got and .toc sections
-	// from input files. Both are type sym.SELFGOT, so in that case
-	// we skip size comparison and fall through to the name
-	// comparison (conveniently, .got sorts before .toc).
-	checkSize := symn != sym.SELFGOT
+	zerobase = ldr.Lookup("runtime.zerobase", 0)
 
 	// Perform the sort.
 	if symn != sym.SPCLNTAB {
 		sort.Slice(sl, func(i, j int) bool {
 			si, sj := sl[i].sym, sl[j].sym
+			isz, jsz := sl[i].sz, sl[j].sz
 			switch {
 			case si == head, sj == tail:
 				return true
 			case sj == head, si == tail:
 				return false
+			// put zerobase right after all the zero-sized symbols,
+			// so zero-sized symbols have the same address as zerobase.
+			case si == zerobase:
+				return jsz != 0 // zerobase < nonzero-sized
+			case sj == zerobase:
+				return isz == 0 // 0-sized < zerobase
 			}
 			if checkSize {
-				isz := sl[i].sz
-				jsz := sl[j].sz
 				if isz != jsz {
 					return isz < jsz
 				}
-			}
-			iname := sl[i].name
-			jname := sl[j].name
-			if iname != jname {
-				return iname < jname
+			} else {
+				iname := sl[i].name
+				jname := sl[j].name
+				if iname != jname {
+					return iname < jname
+				}
 			}
 			return si < sj
 		})
@@ -2227,7 +2299,7 @@
 // at the very beginning of the text segment.
 // This “header” is read by cmd/go.
 func (ctxt *Link) textbuildid() {
-	if ctxt.IsELF || ctxt.BuildMode == BuildModePlugin || *flagBuildid == "" {
+	if ctxt.IsELF || *flagBuildid == "" {
 		return
 	}
 
@@ -2246,14 +2318,6 @@
 }
 
 func (ctxt *Link) buildinfo() {
-	if ctxt.linkShared || ctxt.BuildMode == BuildModePlugin {
-		// -linkshared and -buildmode=plugin get confused
-		// about the relocations in go.buildinfo
-		// pointing at the other data sections.
-		// The version information is only available in executables.
-		return
-	}
-
 	// Write the buildinfo symbol, which go version looks for.
 	// The code reading this data is in package debug/buildinfo.
 	ldr := ctxt.loader
@@ -2414,7 +2478,9 @@
 		}
 	}
 
-	sect.Length = va - sect.Vaddr
+	// Add MinLC size after etext, so it won't collide with the next symbol
+	// (which may confuse some symbolizer).
+	sect.Length = va - sect.Vaddr + uint64(ctxt.Arch.MinLC)
 	ldr.SetSymSect(etext, sect)
 	if ldr.SymValue(etext) == 0 {
 		// Set the address of the start/end symbols, if not already
@@ -2533,15 +2599,22 @@
 
 // Return whether we may need to split text sections.
 //
-// On PPC64x whem external linking a text section should not be larger than 2^25 bytes
-// due to the size of call target offset field in the bl instruction.  Splitting into
-// smaller text sections smaller than this limit allows the system linker to modify the long
-// calls appropriately. The limit allows for the space needed for tables inserted by the
-// linker.
+// On PPC64x, when external linking, a text section should not be
+// larger than 2^25 bytes due to the size of call target offset field
+// in the 'bl' instruction. Splitting into smaller text sections
+// smaller than this limit allows the system linker to modify the long
+// calls appropriately. The limit allows for the space needed for
+// tables inserted by the linker.
 //
 // The same applies to Darwin/ARM64, with 2^27 byte threshold.
+//
+// Similarly for ARM, we split sections (at 2^25 bytes) to avoid
+// inconsistencies between the Go linker's reachability calculations
+// (e.g. will direct call from X to Y need a trampoline) and similar
+// machinery in the external linker; see #58425 for more on the
+// history here.
 func splitTextSections(ctxt *Link) bool {
-	return (ctxt.IsPPC64() || (ctxt.IsARM64() && ctxt.IsDarwin())) && ctxt.IsExternal()
+	return (ctxt.IsARM() || ctxt.IsPPC64() || (ctxt.IsARM64() && ctxt.IsDarwin())) && ctxt.IsExternal()
 }
 
 // On Wasm, we reserve 4096 bytes for zero page, then 8192 bytes for wasm_exec.js
@@ -2663,6 +2736,36 @@
 	// simply because right now we know where the BSS starts.
 	Segdata.Filelen = bss.Vaddr - Segdata.Vaddr
 
+	if len(Segpdata.Sections) > 0 {
+		va = uint64(Rnd(int64(va), int64(*FlagRound)))
+		order = append(order, &Segpdata)
+		Segpdata.Rwx = 04
+		Segpdata.Vaddr = va
+		// Segpdata.Sections is intended to contain just one section.
+		// Loop through the slice anyway for consistency.
+		for _, s := range Segpdata.Sections {
+			va = uint64(Rnd(int64(va), int64(s.Align)))
+			s.Vaddr = va
+			va += s.Length
+		}
+		Segpdata.Length = va - Segpdata.Vaddr
+	}
+
+	if len(Segxdata.Sections) > 0 {
+		va = uint64(Rnd(int64(va), int64(*FlagRound)))
+		order = append(order, &Segxdata)
+		Segxdata.Rwx = 04
+		Segxdata.Vaddr = va
+		// Segxdata.Sections is intended to contain just one section.
+		// Loop through the slice anyway for consistency.
+		for _, s := range Segxdata.Sections {
+			va = uint64(Rnd(int64(va), int64(s.Align)))
+			s.Vaddr = va
+			va += s.Length
+		}
+		Segxdata.Length = va - Segxdata.Vaddr
+	}
+
 	va = uint64(Rnd(int64(va), int64(*FlagRound)))
 	order = append(order, &Segdwarf)
 	Segdwarf.Rwx = 06
@@ -2714,6 +2817,12 @@
 		}
 	}
 
+	for _, s := range []loader.Sym{sehp.pdata, sehp.xdata} {
+		if sect := ldr.SymSect(s); sect != nil {
+			ldr.AddToSymValue(s, int64(sect.Vaddr))
+		}
+	}
+
 	if ctxt.BuildMode == BuildModeShared {
 		s := ldr.LookupOrCreateSym("go:link.abihashbytes", 0)
 		sect := ldr.SymSect(ldr.LookupOrCreateSym(".note.go.abihash", 0))
diff --git a/src/cmd/link/internal/ld/data_test.go b/src/cmd/link/internal/ld/data_test.go
index f91493b..2c22cfe 100644
--- a/src/cmd/link/internal/ld/data_test.go
+++ b/src/cmd/link/internal/ld/data_test.go
@@ -14,10 +14,9 @@
 
 func setUpContext(arch *sys.Arch, iself bool, ht objabi.HeadType, bm, lm string) *Link {
 	ctxt := linknew(arch)
-	edummy := func(str string, off int) {}
 	ctxt.HeadType = ht
 	er := loader.ErrorReporter{}
-	ctxt.loader = loader.NewLoader(0, edummy, &er)
+	ctxt.loader = loader.NewLoader(0, &er)
 	ctxt.BuildMode.Set(bm)
 	ctxt.LinkMode.Set(lm)
 	ctxt.IsELF = iself
diff --git a/src/cmd/link/internal/ld/deadcode.go b/src/cmd/link/internal/ld/deadcode.go
index 0738a51..d9e0d62 100644
--- a/src/cmd/link/internal/ld/deadcode.go
+++ b/src/cmd/link/internal/ld/deadcode.go
@@ -12,6 +12,7 @@
 	"cmd/link/internal/sym"
 	"fmt"
 	"internal/buildcfg"
+	"strings"
 	"unicode"
 )
 
@@ -29,6 +30,8 @@
 	dynlink            bool
 
 	methodsigstmp []methodsig // scratch buffer for decoding method signatures
+	pkginits      []loader.Sym
+	mapinitnoop   loader.Sym
 }
 
 func (d *deadcodePass) init() {
@@ -105,6 +108,14 @@
 		}
 		d.mark(s, 0)
 	}
+
+	d.mapinitnoop = d.ldr.Lookup("runtime.mapinitnoop", abiInternalVer)
+	if d.mapinitnoop == 0 {
+		panic("could not look up runtime.mapinitnoop")
+	}
+	if d.ctxt.mainInittasks != 0 {
+		d.mark(d.ctxt.mainInittasks, 0)
+	}
 }
 
 func (d *deadcodePass) flood() {
@@ -130,10 +141,26 @@
 		methods = methods[:0]
 		for i := 0; i < relocs.Count(); i++ {
 			r := relocs.At(i)
-			// When build with "-linkshared", we can't tell if the interface
-			// method in itab will be used or not. Ignore the weak attribute.
-			if r.Weak() && !(d.ctxt.linkShared && d.ldr.IsItab(symIdx)) {
-				continue
+			if r.Weak() {
+				convertWeakToStrong := false
+				// When build with "-linkshared", we can't tell if the
+				// interface method in itab will be used or not.
+				// Ignore the weak attribute.
+				if d.ctxt.linkShared && d.ldr.IsItab(symIdx) {
+					convertWeakToStrong = true
+				}
+				// If the program uses plugins, we can no longer treat
+				// relocs from pkg init functions to outlined map init
+				// fragments as weak, since doing so can cause package
+				// init clashes between the main program and the
+				// plugin. See #62430 for more details.
+				if d.ctxt.canUsePlugins && r.Type().IsDirectCall() {
+					convertWeakToStrong = true
+				}
+				if !convertWeakToStrong {
+					// skip this reloc
+					continue
+				}
 			}
 			t := r.Type()
 			switch t {
@@ -169,6 +196,14 @@
 				// converted to an interface, i.e. should have UsedInIface set. See the
 				// comment below for why we need to unset the Reachable bit and re-mark it.
 				rs := r.Sym()
+				if d.ldr.IsItab(rs) {
+					// This relocation can also point at an itab, in which case it
+					// means "the _type field of that itab".
+					rs = decodeItabType(d.ldr, d.ctxt.Arch, rs)
+				}
+				if !d.ldr.IsGoType(rs) && !d.ctxt.linkShared {
+					panic(fmt.Sprintf("R_USEIFACE in %s references %s which is not a type or itab", d.ldr.SymName(symIdx), d.ldr.SymName(rs)))
+				}
 				if !d.ldr.AttrUsedInIface(rs) {
 					d.ldr.SetAttrUsedInIface(rs, true)
 					if d.ldr.AttrReachable(rs) {
@@ -200,6 +235,11 @@
 				}
 				d.genericIfaceMethod[name] = true
 				continue // don't mark referenced symbol - it is not needed in the final binary.
+			case objabi.R_INITORDER:
+				// inittasks has already run, so any R_INITORDER links are now
+				// superfluous - the only live inittask records are those which are
+				// in a scheduled list somewhere (e.g. runtime.moduledata.inittasks).
+				continue
 			}
 			rs := r.Sym()
 			if isgotype && usedInIface && d.ldr.IsGoType(rs) && !d.ldr.AttrUsedInIface(rs) {
@@ -229,6 +269,12 @@
 			}
 			d.mark(a.Sym(), symIdx)
 		}
+		// Record sym if package init func (here naux != 0 is a cheap way
+		// to check first if it is a function symbol).
+		if naux != 0 && d.ldr.IsPkgInit(symIdx) {
+
+			d.pkginits = append(d.pkginits, symIdx)
+		}
 		// Some host object symbols have an outer object, which acts like a
 		// "carrier" symbol, or it holds all the symbols for a particular
 		// section. We need to mark all "referenced" symbols from that carrier,
@@ -262,6 +308,37 @@
 	}
 }
 
+// mapinitcleanup walks all pkg init functions and looks for weak relocations
+// to mapinit symbols that are no longer reachable. It rewrites
+// the relocs to target a new no-op routine in the runtime.
+func (d *deadcodePass) mapinitcleanup() {
+	for _, idx := range d.pkginits {
+		relocs := d.ldr.Relocs(idx)
+		var su *loader.SymbolBuilder
+		for i := 0; i < relocs.Count(); i++ {
+			r := relocs.At(i)
+			rs := r.Sym()
+			if r.Weak() && r.Type().IsDirectCall() && !d.ldr.AttrReachable(rs) {
+				// double check to make sure target is indeed map.init
+				rsn := d.ldr.SymName(rs)
+				if !strings.Contains(rsn, "map.init") {
+					panic(fmt.Sprintf("internal error: expected map.init sym for weak call reloc, got %s -> %s", d.ldr.SymName(idx), rsn))
+				}
+				d.ldr.SetAttrReachable(d.mapinitnoop, true)
+				if d.ctxt.Debugvlog > 1 {
+					d.ctxt.Logf("deadcode: %s rewrite %s ref to %s\n",
+						d.ldr.SymName(idx), rsn,
+						d.ldr.SymName(d.mapinitnoop))
+				}
+				if su == nil {
+					su = d.ldr.MakeSymbolUpdater(idx)
+				}
+				su.SetRelocSym(i, d.mapinitnoop)
+			}
+		}
+	}
+}
+
 func (d *deadcodePass) mark(symIdx, parent loader.Sym) {
 	if symIdx != 0 && !d.ldr.AttrReachable(symIdx) {
 		d.wq.push(symIdx)
@@ -272,15 +349,11 @@
 		if *flagDumpDep {
 			to := d.ldr.SymName(symIdx)
 			if to != "" {
-				if d.ldr.AttrUsedInIface(symIdx) {
-					to += " <UsedInIface>"
-				}
+				to = d.dumpDepAddFlags(to, symIdx)
 				from := "_"
 				if parent != 0 {
 					from = d.ldr.SymName(parent)
-					if d.ldr.AttrUsedInIface(parent) {
-						from += " <UsedInIface>"
-					}
+					from = d.dumpDepAddFlags(from, parent)
 				}
 				fmt.Printf("%s -> %s\n", from, to)
 			}
@@ -288,6 +361,20 @@
 	}
 }
 
+func (d *deadcodePass) dumpDepAddFlags(name string, symIdx loader.Sym) string {
+	var flags strings.Builder
+	if d.ldr.AttrUsedInIface(symIdx) {
+		flags.WriteString("<UsedInIface>")
+	}
+	if d.ldr.IsReflectMethod(symIdx) {
+		flags.WriteString("<ReflectMethod>")
+	}
+	if flags.Len() > 0 {
+		return name + " " + flags.String()
+	}
+	return name
+}
+
 func (d *deadcodePass) markMethod(m methodref) {
 	relocs := d.ldr.Relocs(m.src)
 	d.mark(relocs.At(m.r).Sym(), m.src)
@@ -370,6 +457,9 @@
 		}
 		d.flood()
 	}
+	if *flagPruneWeakMap {
+		d.mapinitcleanup()
+	}
 }
 
 // methodsig is a typed method signature (name + type).
@@ -431,7 +521,7 @@
 
 // Decode the method name stored in symbol symIdx. The symbol should contain just the bytes of a method name.
 func (d *deadcodePass) decodeGenericIfaceMethod(ldr *loader.Loader, symIdx loader.Sym) string {
-	return string(ldr.Data(symIdx))
+	return ldr.DataString(symIdx)
 }
 
 func (d *deadcodePass) decodetypeMethods(ldr *loader.Loader, arch *sys.Arch, symIdx loader.Sym, relocs *loader.Relocs) []methodsig {
diff --git a/src/cmd/link/internal/ld/deadcode_test.go b/src/cmd/link/internal/ld/deadcode_test.go
index 573bff3..633a0d0 100644
--- a/src/cmd/link/internal/ld/deadcode_test.go
+++ b/src/cmd/link/internal/ld/deadcode_test.go
@@ -19,14 +19,16 @@
 
 	tests := []struct {
 		src      string
-		pos, neg string // positive and negative patterns
+		pos, neg []string // positive and negative patterns
 	}{
-		{"reflectcall", "", "main.T.M"},
-		{"typedesc", "", "type:main.T"},
-		{"ifacemethod", "", "main.T.M"},
-		{"ifacemethod2", "main.T.M", ""},
-		{"ifacemethod3", "main.S.M", ""},
-		{"ifacemethod4", "", "main.T.M"},
+		{"reflectcall", nil, []string{"main.T.M"}},
+		{"typedesc", nil, []string{"type:main.T"}},
+		{"ifacemethod", nil, []string{"main.T.M"}},
+		{"ifacemethod2", []string{"main.T.M"}, nil},
+		{"ifacemethod3", []string{"main.S.M"}, nil},
+		{"ifacemethod4", nil, []string{"main.T.M"}},
+		{"globalmap", []string{"main.small", "main.effect"},
+			[]string{"main.large"}},
 	}
 	for _, test := range tests {
 		test := test
@@ -39,11 +41,15 @@
 			if err != nil {
 				t.Fatalf("%v: %v:\n%s", cmd.Args, err, out)
 			}
-			if test.pos != "" && !bytes.Contains(out, []byte(test.pos+"\n")) {
-				t.Errorf("%s should be reachable. Output:\n%s", test.pos, out)
+			for _, pos := range test.pos {
+				if !bytes.Contains(out, []byte(pos+"\n")) {
+					t.Errorf("%s should be reachable. Output:\n%s", pos, out)
+				}
 			}
-			if test.neg != "" && bytes.Contains(out, []byte(test.neg+"\n")) {
-				t.Errorf("%s should not be reachable. Output:\n%s", test.neg, out)
+			for _, neg := range test.neg {
+				if bytes.Contains(out, []byte(neg+"\n")) {
+					t.Errorf("%s should not be reachable. Output:\n%s", neg, out)
+				}
 			}
 		})
 	}
diff --git a/src/cmd/link/internal/ld/decodesym.go b/src/cmd/link/internal/ld/decodesym.go
index b0f4b87..05da11e 100644
--- a/src/cmd/link/internal/ld/decodesym.go
+++ b/src/cmd/link/internal/ld/decodesym.go
@@ -11,6 +11,7 @@
 	"cmd/link/internal/sym"
 	"debug/elf"
 	"encoding/binary"
+	"internal/abi"
 	"log"
 )
 
@@ -18,19 +19,6 @@
 // ../../runtime/type.go, or more specifically, with what
 // cmd/compile/internal/reflectdata/reflect.go stuffs in these.
 
-// tflag is documented in reflect/type.go.
-//
-// tflag values must be kept in sync with copies in:
-//
-//	cmd/compile/internal/reflectdata/reflect.go
-//	cmd/link/internal/ld/decodesym.go
-//	reflect/type.go
-//	runtime/type.go
-const (
-	tflagUncommon  = 1 << 0
-	tflagExtraStar = 1 << 1
-)
-
 func decodeInuxi(arch *sys.Arch, p []byte, sz int) uint64 {
 	switch sz {
 	case 2:
@@ -45,9 +33,9 @@
 	}
 }
 
-func commonsize(arch *sys.Arch) int      { return 4*arch.PtrSize + 8 + 8 } // runtime._type
-func structfieldSize(arch *sys.Arch) int { return 3 * arch.PtrSize }       // runtime.structfield
-func uncommonSize() int                  { return 4 + 2 + 2 + 4 + 4 }      // runtime.uncommontype
+func commonsize(arch *sys.Arch) int      { return abi.CommonSize(arch.PtrSize) }      // runtime._type
+func structfieldSize(arch *sys.Arch) int { return abi.StructFieldSize(arch.PtrSize) } // runtime.structfield
+func uncommonSize(arch *sys.Arch) int    { return int(abi.UncommonSize()) }           // runtime.uncommontype
 
 // Type.commonType.kind
 func decodetypeKind(arch *sys.Arch, p []byte) uint8 {
@@ -71,7 +59,7 @@
 
 // Type.commonType.tflag
 func decodetypeHasUncommon(arch *sys.Arch, p []byte) bool {
-	return p[2*arch.PtrSize+4]&tflagUncommon != 0
+	return abi.TFlag(p[abi.TFlagOff(arch.PtrSize)])&abi.TFlagUncommon != 0
 }
 
 // Type.FuncType.dotdotdot
@@ -127,9 +115,13 @@
 		return ""
 	}
 
-	data := ldr.Data(r)
-	nameLen, nameLenLen := binary.Uvarint(data[1:])
-	return string(data[1+nameLenLen : 1+nameLenLen+int(nameLen)])
+	data := ldr.DataString(r)
+	n := 1 + binary.MaxVarintLen64
+	if len(data) < n {
+		n = len(data)
+	}
+	nameLen, nameLenLen := binary.Uvarint([]byte(data[1:n]))
+	return data[1+nameLenLen : 1+nameLenLen+int(nameLen)]
 }
 
 func decodetypeNameEmbedded(ldr *loader.Loader, symIdx loader.Sym, relocs *loader.Relocs, off int) bool {
@@ -147,7 +139,7 @@
 		uadd += 4
 	}
 	if decodetypeHasUncommon(arch, ldr.Data(symIdx)) {
-		uadd += uncommonSize()
+		uadd += uncommonSize(arch)
 	}
 	return decodeRelocSym(ldr, symIdx, relocs, int32(uadd+i*arch.PtrSize))
 }
@@ -195,7 +187,7 @@
 	data := ldr.Data(symIdx)
 	off := commonsize(arch) + 4*arch.PtrSize
 	if decodetypeHasUncommon(arch, data) {
-		off += uncommonSize()
+		off += uncommonSize(arch)
 	}
 	off += i * structfieldSize(arch)
 	return off
@@ -230,7 +222,7 @@
 	relocs := ldr.Relocs(symIdx)
 	str := decodetypeName(ldr, symIdx, &relocs, 4*arch.PtrSize+8)
 	data := ldr.Data(symIdx)
-	if data[2*arch.PtrSize+4]&tflagExtraStar != 0 {
+	if data[abi.TFlagOff(arch.PtrSize)]&byte(abi.TFlagExtraStar) != 0 {
 		return str[1:]
 	}
 	return str
@@ -308,3 +300,9 @@
 func decodetypeGcprogShlib(ctxt *Link, data []byte) uint64 {
 	return decodeInuxi(ctxt.Arch, data[2*int32(ctxt.Arch.PtrSize)+8+1*int32(ctxt.Arch.PtrSize):], ctxt.Arch.PtrSize)
 }
+
+// decodeItabType returns the itab._type field from an itab.
+func decodeItabType(ldr *loader.Loader, arch *sys.Arch, symIdx loader.Sym) loader.Sym {
+	relocs := ldr.Relocs(symIdx)
+	return decodeRelocSym(ldr, symIdx, &relocs, int32(arch.PtrSize))
+}
diff --git a/src/cmd/link/internal/ld/dwarf.go b/src/cmd/link/internal/ld/dwarf.go
index feea864..a601fe5 100644
--- a/src/cmd/link/internal/ld/dwarf.go
+++ b/src/cmd/link/internal/ld/dwarf.go
@@ -22,6 +22,7 @@
 	"cmd/link/internal/loader"
 	"cmd/link/internal/sym"
 	"fmt"
+	"internal/abi"
 	"internal/buildcfg"
 	"log"
 	"path"
@@ -855,9 +856,9 @@
 
 // synthesizemaptypes is way too closely married to runtime/hashmap.c
 const (
-	MaxKeySize = 128
-	MaxValSize = 128
-	BucketSize = 8
+	MaxKeySize = abi.MapMaxKeyBytes
+	MaxValSize = abi.MapMaxElemBytes
+	BucketSize = abi.MapBucketCount
 )
 
 func (d *dwctxt) mkinternaltype(ctxt *Link, abbrev int, typename, keyname, valname string, f func(*dwarf.DWDie)) loader.Sym {
@@ -1635,7 +1636,7 @@
 	if *FlagS && ctxt.HeadType != objabi.Hdarwin {
 		return false
 	}
-	if ctxt.HeadType == objabi.Hplan9 || ctxt.HeadType == objabi.Hjs {
+	if ctxt.HeadType == objabi.Hplan9 || ctxt.HeadType == objabi.Hjs || ctxt.HeadType == objabi.Hwasip1 {
 		return false
 	}
 
@@ -1801,17 +1802,17 @@
 
 	// Needed by the prettyprinter code for interface inspection.
 	for _, typ := range []string{
-		"type:runtime._type",
-		"type:runtime.arraytype",
-		"type:runtime.chantype",
-		"type:runtime.functype",
-		"type:runtime.maptype",
-		"type:runtime.ptrtype",
-		"type:runtime.slicetype",
-		"type:runtime.structtype",
-		"type:runtime.interfacetype",
+		"type:internal/abi.Type",
+		"type:internal/abi.ArrayType",
+		"type:internal/abi.ChanType",
+		"type:internal/abi.FuncType",
+		"type:internal/abi.MapType",
+		"type:internal/abi.PtrType",
+		"type:internal/abi.SliceType",
+		"type:internal/abi.StructType",
+		"type:internal/abi.InterfaceType",
 		"type:runtime.itab",
-		"type:runtime.imethod"} {
+		"type:internal/abi.Imethod"} {
 		d.defgotype(d.lookupOrDiag(typ))
 	}
 
@@ -1935,21 +1936,13 @@
 		if d.ldr.IsFileLocal(idx) {
 			continue
 		}
-		sn := d.ldr.SymName(idx)
-		if sn == "" {
-			// skip aux symbols
-			continue
-		}
 
 		// Find compiler-generated DWARF info sym for global in question,
 		// and tack it onto the appropriate unit.  Note that there are
 		// circumstances under which we can't find the compiler-generated
 		// symbol-- this typically happens as a result of compiler options
 		// (e.g. compile package X with "-dwarf=0").
-
-		// FIXME: use an aux sym or a relocation here instead of a
-		// name lookup.
-		varDIE := d.ldr.Lookup(dwarf.InfoPrefix+sn, 0)
+		varDIE := d.ldr.GetVarDwarfAuxSym(idx)
 		if varDIE != 0 {
 			unit := d.ldr.SymUnit(idx)
 			d.defgotype(gt)
@@ -1996,7 +1989,7 @@
 
 // dwUnitPortion assembles the DWARF content for a given compilation
 // unit: debug_info, debug_lines, debug_ranges, debug_loc (debug_frame
-// is handled elsewere). Order is important; the calls to writelines
+// is handled elsewhere). Order is important; the calls to writelines
 // and writepcranges below make updates to the compilation unit DIE,
 // hence they have to happen before the call to writeUnitInfo.
 func (d *dwctxt) dwUnitPortion(u *sym.CompilationUnit, abbrevsym loader.Sym, us *dwUnitSyms) {
@@ -2154,21 +2147,18 @@
 	return syms
 }
 
-/*
- *  Elf.
- */
-func dwarfaddshstrings(ctxt *Link, shstrtab *loader.SymbolBuilder) {
+// Add DWARF section names to the section header string table, by calling add
+// on each name. ELF only.
+func dwarfaddshstrings(ctxt *Link, add func(string)) {
 	if *FlagW { // disable dwarf
 		return
 	}
 
 	secs := []string{"abbrev", "frame", "info", "loc", "line", "gdb_scripts", "ranges"}
 	for _, sec := range secs {
-		shstrtab.Addstring(".debug_" + sec)
+		add(".debug_" + sec)
 		if ctxt.IsExternal() {
-			shstrtab.Addstring(elfRelType + ".debug_" + sec)
-		} else {
-			shstrtab.Addstring(".zdebug_" + sec)
+			add(elfRelType + ".debug_" + sec)
 		}
 	}
 }
diff --git a/src/cmd/link/internal/ld/dwarf_test.go b/src/cmd/link/internal/ld/dwarf_test.go
index a3db4a9..6ca2a84 100644
--- a/src/cmd/link/internal/ld/dwarf_test.go
+++ b/src/cmd/link/internal/ld/dwarf_test.go
@@ -8,6 +8,7 @@
 	"debug/dwarf"
 	"debug/pe"
 	"fmt"
+	"internal/platform"
 	"internal/testenv"
 	"io"
 	"os"
@@ -24,6 +25,13 @@
 	"cmd/link/internal/dwtest"
 )
 
+func mustHaveDWARF(t testing.TB) {
+	if !platform.ExecutableHasDWARF(runtime.GOOS, runtime.GOARCH) {
+		t.Helper()
+		t.Skipf("skipping on %s/%s: no DWARF symbol table in executables", runtime.GOOS, runtime.GOARCH)
+	}
+}
+
 const (
 	DefaultOpt = "-gcflags="
 	NoOpt      = "-gcflags=-l -N"
@@ -35,9 +43,7 @@
 	t.Parallel()
 	testenv.MustHaveGoBuild(t)
 
-	if runtime.GOOS == "plan9" {
-		t.Skip("skipping on plan9; no DWARF symbol table in executables")
-	}
+	mustHaveDWARF(t)
 
 	dir := t.TempDir()
 
@@ -50,17 +56,16 @@
 	}
 
 	want := map[string]bool{
-		"runtime._type":         true,
-		"runtime.arraytype":     true,
-		"runtime.chantype":      true,
-		"runtime.functype":      true,
-		"runtime.maptype":       true,
-		"runtime.ptrtype":       true,
-		"runtime.slicetype":     true,
-		"runtime.structtype":    true,
-		"runtime.interfacetype": true,
-		"runtime.itab":          true,
-		"runtime.imethod":       true,
+		"internal/abi.Type":          true,
+		"internal/abi.ArrayType":     true,
+		"internal/abi.ChanType":      true,
+		"internal/abi.FuncType":      true,
+		"internal/abi.MapType":       true,
+		"internal/abi.PtrType":       true,
+		"internal/abi.SliceType":     true,
+		"internal/abi.StructType":    true,
+		"internal/abi.InterfaceType": true,
+		"runtime.itab":               true,
 	}
 
 	found := findTypes(t, dwarf, want)
@@ -135,13 +140,50 @@
 	return &builtFile{f, dst}
 }
 
+// Helper to build a snippet of source for examination with dwtest.Examiner.
+func gobuildAndExamine(t *testing.T, source string, gcflags string) (*dwarf.Data, *dwtest.Examiner) {
+	dir := t.TempDir()
+
+	f := gobuild(t, dir, source, gcflags)
+	defer f.Close()
+
+	d, err := f.DWARF()
+	if err != nil {
+		t.Fatalf("error reading DWARF in program %q: %v", source, err)
+	}
+
+	rdr := d.Reader()
+	ex := &dwtest.Examiner{}
+	if err := ex.Populate(rdr); err != nil {
+		t.Fatalf("error populating DWARF examiner for program %q: %v", source, err)
+	}
+
+	return d, ex
+}
+
+func findSubprogramDIE(t *testing.T, ex *dwtest.Examiner, sym string) *dwarf.Entry {
+	dies := ex.Named(sym)
+	if len(dies) == 0 {
+		t.Fatalf("unable to locate DIE for %s", sym)
+	}
+	if len(dies) != 1 {
+		t.Fatalf("more than one %s DIE: %+v", sym, dies)
+	}
+	die := dies[0]
+
+	// Vet the DIE.
+	if die.Tag != dwarf.TagSubprogram {
+		t.Fatalf("unexpected tag %v on %s DIE", die.Tag, sym)
+	}
+
+	return die
+}
+
 func TestEmbeddedStructMarker(t *testing.T) {
 	t.Parallel()
 	testenv.MustHaveGoBuild(t)
 
-	if runtime.GOOS == "plan9" {
-		t.Skip("skipping on plan9; no DWARF symbol table in executables")
-	}
+	mustHaveDWARF(t)
 
 	const prog = `
 package main
@@ -188,7 +230,10 @@
 		}
 		switch entry.Tag {
 		case dwarf.TagStructType:
-			name := entry.Val(dwarf.AttrName).(string)
+			name, ok := entry.Val(dwarf.AttrName).(string)
+			if !ok {
+				continue
+			}
 			wantMembers := want[name]
 			if wantMembers == nil {
 				continue
@@ -230,12 +275,10 @@
 }
 
 func TestSizes(t *testing.T) {
-	if runtime.GOOS == "plan9" {
-		t.Skip("skipping on plan9; no DWARF symbol table in executables")
-	}
+	mustHaveDWARF(t)
 
 	// External linking may bring in C symbols with unknown size. Skip.
-	testenv.MustInternalLink(t)
+	testenv.MustInternalLink(t, false)
 
 	t.Parallel()
 
@@ -279,9 +322,7 @@
 }
 
 func TestFieldOverlap(t *testing.T) {
-	if runtime.GOOS == "plan9" {
-		t.Skip("skipping on plan9; no DWARF symbol table in executables")
-	}
+	mustHaveDWARF(t)
 	t.Parallel()
 
 	// This test grew out of issue 21094, where specific sudog<T> DWARF types
@@ -334,103 +375,272 @@
 	}
 }
 
-func varDeclCoordsAndSubrogramDeclFile(t *testing.T, testpoint string, expectFile string, expectLine int, directive string) {
+func TestSubprogramDeclFileLine(t *testing.T) {
+	testenv.MustHaveGoBuild(t)
 	t.Parallel()
 
-	prog := fmt.Sprintf("package main\n%s\nfunc main() {\n\nvar i int\ni = i\n}\n", directive)
+	mustHaveDWARF(t)
 
-	dir := t.TempDir()
+	const prog = `package main
+%s
+func main() {}
+`
+	tests := []struct {
+		name string
+		prog string
+		file string
+		line int64
+	}{
+		{
+			name: "normal",
+			prog: fmt.Sprintf(prog, ""),
+			file: "test.go",
+			line: 3,
+		},
+		{
+			name: "line-directive",
+			prog: fmt.Sprintf(prog, "//line /foobar.go:200"),
+			file: "foobar.go",
+			line: 200,
+		},
+	}
+	for _, tc := range tests {
+		tc := tc
+		t.Run(tc.name, func(t *testing.T) {
+			t.Parallel()
 
-	f := gobuild(t, dir, prog, NoOpt)
-	defer f.Close()
+			d, ex := gobuildAndExamine(t, tc.prog, NoOpt)
 
-	d, err := f.DWARF()
-	if err != nil {
-		t.Fatalf("error reading DWARF: %v", err)
-	}
+			maindie := findSubprogramDIE(t, ex, "main.main")
 
-	rdr := d.Reader()
-	ex := dwtest.Examiner{}
-	if err := ex.Populate(rdr); err != nil {
-		t.Fatalf("error reading DWARF: %v", err)
-	}
+			mainIdx := ex.IdxFromOffset(maindie.Offset)
 
-	// Locate the main.main DIE
-	mains := ex.Named("main.main")
-	if len(mains) == 0 {
-		t.Fatalf("unable to locate DIE for main.main")
-	}
-	if len(mains) != 1 {
-		t.Fatalf("more than one main.main DIE")
-	}
-	maindie := mains[0]
+			fileIdx, fileIdxOK := maindie.Val(dwarf.AttrDeclFile).(int64)
+			if !fileIdxOK {
+				t.Errorf("missing or invalid DW_AT_decl_file for main")
+			}
+			file, err := ex.FileRef(d, mainIdx, fileIdx)
+			if err != nil {
+				t.Fatalf("FileRef: %v", err)
+			}
+			base := filepath.Base(file)
+			if base != tc.file {
+				t.Errorf("DW_AT_decl_file for main is %v, want %v", base, tc.file)
+			}
 
-	// Vet the main.main DIE
-	if maindie.Tag != dwarf.TagSubprogram {
-		t.Fatalf("unexpected tag %v on main.main DIE", maindie.Tag)
-	}
-
-	// Walk main's children and select variable "i".
-	mainIdx := ex.IdxFromOffset(maindie.Offset)
-	childDies := ex.Children(mainIdx)
-	var iEntry *dwarf.Entry
-	for _, child := range childDies {
-		if child.Tag == dwarf.TagVariable && child.Val(dwarf.AttrName).(string) == "i" {
-			iEntry = child
-			break
-		}
-	}
-	if iEntry == nil {
-		t.Fatalf("didn't find DW_TAG_variable for i in main.main")
-	}
-
-	// Verify line/file attributes.
-	line := iEntry.Val(dwarf.AttrDeclLine)
-	if line == nil || line.(int64) != int64(expectLine) {
-		t.Errorf("DW_AT_decl_line for i is %v, want %d", line, expectLine)
-	}
-
-	fileIdx, fileIdxOK := maindie.Val(dwarf.AttrDeclFile).(int64)
-	if !fileIdxOK {
-		t.Errorf("missing or invalid DW_AT_decl_file for main")
-	}
-	file, err := ex.FileRef(d, mainIdx, fileIdx)
-	if err != nil {
-		t.Fatalf("FileRef: %v", err)
-	}
-	base := filepath.Base(file)
-	if base != expectFile {
-		t.Errorf("DW_AT_decl_file for main is %v, want %v", base, expectFile)
+			line, lineOK := maindie.Val(dwarf.AttrDeclLine).(int64)
+			if !lineOK {
+				t.Errorf("missing or invalid DW_AT_decl_line for main")
+			}
+			if line != tc.line {
+				t.Errorf("DW_AT_decl_line for main is %v, want %d", line, tc.line)
+			}
+		})
 	}
 }
 
-func TestVarDeclCoordsAndSubrogramDeclFile(t *testing.T) {
+func TestVarDeclLine(t *testing.T) {
 	testenv.MustHaveGoBuild(t)
+	t.Parallel()
 
-	if runtime.GOOS == "plan9" {
-		t.Skip("skipping on plan9; no DWARF symbol table in executables")
+	mustHaveDWARF(t)
+
+	const prog = `package main
+%s
+func main() {
+
+	var i int
+	i = i
+}
+`
+	tests := []struct {
+		name string
+		prog string
+		line int64
+	}{
+		{
+			name: "normal",
+			prog: fmt.Sprintf(prog, ""),
+			line: 5,
+		},
+		{
+			name: "line-directive",
+			prog: fmt.Sprintf(prog, "//line /foobar.go:200"),
+			line: 202,
+		},
 	}
+	for _, tc := range tests {
+		tc := tc
+		t.Run(tc.name, func(t *testing.T) {
+			t.Parallel()
 
-	varDeclCoordsAndSubrogramDeclFile(t, "TestVarDeclCoords", "test.go", 5, "")
+			_, ex := gobuildAndExamine(t, tc.prog, NoOpt)
+
+			maindie := findSubprogramDIE(t, ex, "main.main")
+
+			mainIdx := ex.IdxFromOffset(maindie.Offset)
+			childDies := ex.Children(mainIdx)
+			var iEntry *dwarf.Entry
+			for _, child := range childDies {
+				if child.Tag == dwarf.TagVariable && child.Val(dwarf.AttrName).(string) == "i" {
+					iEntry = child
+					break
+				}
+			}
+			if iEntry == nil {
+				t.Fatalf("didn't find DW_TAG_variable for i in main.main")
+			}
+
+			// Verify line/file attributes.
+			line, lineOK := iEntry.Val(dwarf.AttrDeclLine).(int64)
+			if !lineOK {
+				t.Errorf("missing or invalid DW_AT_decl_line for i")
+			}
+			if line != tc.line {
+				t.Errorf("DW_AT_decl_line for i is %v, want %d", line, tc.line)
+			}
+		})
+	}
 }
 
-func TestVarDeclCoordsWithLineDirective(t *testing.T) {
+// TestInlinedRoutineCallFileLine tests the call file and line records for an
+// inlined subroutine.
+func TestInlinedRoutineCallFileLine(t *testing.T) {
 	testenv.MustHaveGoBuild(t)
 
-	if runtime.GOOS == "plan9" {
-		t.Skip("skipping on plan9; no DWARF symbol table in executables")
-	}
+	mustHaveDWARF(t)
 
-	varDeclCoordsAndSubrogramDeclFile(t, "TestVarDeclCoordsWithLineDirective",
-		"foobar.go", 202, "//line /foobar.go:200")
+	t.Parallel()
+
+	const prog = `
+package main
+
+var G int
+
+//go:noinline
+func notinlined() int {
+	return 42
 }
 
-func TestInlinedRoutineRecords(t *testing.T) {
+func inlined() int {
+	return notinlined()
+}
+
+%s
+func main() {
+	x := inlined()
+	G = x
+}
+`
+	tests := []struct {
+		name string
+		prog string
+		file string // basename
+		line int64
+	}{
+		{
+			name: "normal",
+			prog: fmt.Sprintf(prog, ""),
+			file: "test.go",
+			line: 17,
+		},
+		{
+			name: "line-directive",
+			prog: fmt.Sprintf(prog, "//line /foobar.go:200"),
+			file: "foobar.go",
+			line: 201,
+		},
+	}
+	for _, tc := range tests {
+		tc := tc
+		t.Run(tc.name, func(t *testing.T) {
+			t.Parallel()
+
+			// Note: this is a build with "-l=4", as opposed to "-l -N". The
+			// test is intended to verify DWARF that is only generated when
+			// the inliner is active. We're only going to look at the DWARF for
+			// main.main, however, hence we build with "-gcflags=-l=4" as opposed
+			// to "-gcflags=all=-l=4".
+			d, ex := gobuildAndExamine(t, tc.prog, OptInl4)
+
+			maindie := findSubprogramDIE(t, ex, "main.main")
+
+			// Walk main's children and pick out the inlined subroutines
+			mainIdx := ex.IdxFromOffset(maindie.Offset)
+			childDies := ex.Children(mainIdx)
+			found := false
+			for _, child := range childDies {
+				if child.Tag != dwarf.TagInlinedSubroutine {
+					continue
+				}
+
+				// Found an inlined subroutine.
+				if found {
+					t.Fatalf("Found multiple inlined subroutines, expect only one")
+				}
+				found = true
+
+				// Locate abstract origin.
+				ooff, originOK := child.Val(dwarf.AttrAbstractOrigin).(dwarf.Offset)
+				if !originOK {
+					t.Fatalf("no abstract origin attr for inlined subroutine at offset %v", child.Offset)
+				}
+				originDIE := ex.EntryFromOffset(ooff)
+				if originDIE == nil {
+					t.Fatalf("can't locate origin DIE at off %v", ooff)
+				}
+
+				// Name should check out.
+				name, ok := originDIE.Val(dwarf.AttrName).(string)
+				if !ok {
+					t.Fatalf("no name attr for inlined subroutine at offset %v", child.Offset)
+				}
+				if name != "main.inlined" {
+					t.Fatalf("expected inlined routine %s got %s", "main.cand", name)
+				}
+
+				// Verify that the call_file attribute for the inlined
+				// instance is ok. In this case it should match the file
+				// for the main routine. To do this we need to locate the
+				// compilation unit DIE that encloses what we're looking
+				// at; this can be done with the examiner.
+				cf, cfOK := child.Val(dwarf.AttrCallFile).(int64)
+				if !cfOK {
+					t.Fatalf("no call_file attr for inlined subroutine at offset %v", child.Offset)
+				}
+				file, err := ex.FileRef(d, mainIdx, cf)
+				if err != nil {
+					t.Errorf("FileRef: %v", err)
+					continue
+				}
+				base := filepath.Base(file)
+				if base != tc.file {
+					t.Errorf("bad call_file attribute, found '%s', want '%s'",
+						file, tc.file)
+				}
+
+				// Verify that the call_line attribute for the inlined
+				// instance is ok.
+				cl, clOK := child.Val(dwarf.AttrCallLine).(int64)
+				if !clOK {
+					t.Fatalf("no call_line attr for inlined subroutine at offset %v", child.Offset)
+				}
+				if cl != tc.line {
+					t.Errorf("bad call_line attribute, found %d, want %d", cl, tc.line)
+				}
+			}
+			if !found {
+				t.Fatalf("not enough inlined subroutines found in main.main")
+			}
+		})
+	}
+}
+
+// TestInlinedRoutineArgsVars tests the argument and variable records for an inlined subroutine.
+func TestInlinedRoutineArgsVars(t *testing.T) {
 	testenv.MustHaveGoBuild(t)
 
-	if runtime.GOOS == "plan9" {
-		t.Skip("skipping on plan9; no DWARF symbol table in executables")
-	}
+	mustHaveDWARF(t)
 
 	t.Parallel()
 
@@ -449,139 +659,93 @@
 }
 
 func main() {
-    x := cand(G*G,G|7%G)
-    G = x
+	x := cand(G*G,G|7%G)
+	G = x
 }
 `
-	dir := t.TempDir()
-
 	// Note: this is a build with "-l=4", as opposed to "-l -N". The
 	// test is intended to verify DWARF that is only generated when
 	// the inliner is active. We're only going to look at the DWARF for
 	// main.main, however, hence we build with "-gcflags=-l=4" as opposed
 	// to "-gcflags=all=-l=4".
-	f := gobuild(t, dir, prog, OptInl4)
-	defer f.Close()
+	_, ex := gobuildAndExamine(t, prog, OptInl4)
 
-	d, err := f.DWARF()
-	if err != nil {
-		t.Fatalf("error reading DWARF: %v", err)
-	}
-
-	// The inlined subroutines we expect to visit
-	expectedInl := []string{"main.cand"}
-
-	rdr := d.Reader()
-	ex := dwtest.Examiner{}
-	if err := ex.Populate(rdr); err != nil {
-		t.Fatalf("error reading DWARF: %v", err)
-	}
-
-	// Locate the main.main DIE
-	mains := ex.Named("main.main")
-	if len(mains) == 0 {
-		t.Fatalf("unable to locate DIE for main.main")
-	}
-	if len(mains) != 1 {
-		t.Fatalf("more than one main.main DIE")
-	}
-	maindie := mains[0]
-
-	// Vet the main.main DIE
-	if maindie.Tag != dwarf.TagSubprogram {
-		t.Fatalf("unexpected tag %v on main.main DIE", maindie.Tag)
-	}
+	maindie := findSubprogramDIE(t, ex, "main.main")
 
 	// Walk main's children and pick out the inlined subroutines
 	mainIdx := ex.IdxFromOffset(maindie.Offset)
 	childDies := ex.Children(mainIdx)
-	exCount := 0
+	found := false
 	for _, child := range childDies {
-		if child.Tag == dwarf.TagInlinedSubroutine {
-			// Found an inlined subroutine, locate abstract origin.
-			ooff, originOK := child.Val(dwarf.AttrAbstractOrigin).(dwarf.Offset)
-			if !originOK {
-				t.Fatalf("no abstract origin attr for inlined subroutine at offset %v", child.Offset)
-			}
-			originDIE := ex.EntryFromOffset(ooff)
-			if originDIE == nil {
-				t.Fatalf("can't locate origin DIE at off %v", ooff)
-			}
+		if child.Tag != dwarf.TagInlinedSubroutine {
+			continue
+		}
 
-			// Walk the children of the abstract subroutine. We expect
-			// to see child variables there, even if (perhaps due to
-			// optimization) there are no references to them from the
-			// inlined subroutine DIE.
-			absFcnIdx := ex.IdxFromOffset(ooff)
-			absFcnChildDies := ex.Children(absFcnIdx)
-			if len(absFcnChildDies) != 2 {
-				t.Fatalf("expected abstract function: expected 2 children, got %d children", len(absFcnChildDies))
-			}
-			formalCount := 0
-			for _, absChild := range absFcnChildDies {
-				if absChild.Tag == dwarf.TagFormalParameter {
-					formalCount += 1
-					continue
-				}
-				t.Fatalf("abstract function child DIE: expected formal, got %v", absChild.Tag)
-			}
-			if formalCount != 2 {
-				t.Fatalf("abstract function DIE: expected 2 formals, got %d", formalCount)
-			}
+		// Found an inlined subroutine.
+		if found {
+			t.Fatalf("Found multiple inlined subroutines, expect only one")
+		}
+		found = true
 
-			if exCount >= len(expectedInl) {
-				t.Fatalf("too many inlined subroutines found in main.main")
-			}
+		// Locate abstract origin.
+		ooff, originOK := child.Val(dwarf.AttrAbstractOrigin).(dwarf.Offset)
+		if !originOK {
+			t.Fatalf("no abstract origin attr for inlined subroutine at offset %v", child.Offset)
+		}
+		originDIE := ex.EntryFromOffset(ooff)
+		if originDIE == nil {
+			t.Fatalf("can't locate origin DIE at off %v", ooff)
+		}
 
-			// Name should check out.
-			expected := expectedInl[exCount]
-			if name, ok := originDIE.Val(dwarf.AttrName).(string); ok {
-				if name != expected {
-					t.Fatalf("expected inlined routine %s got %s", name, expected)
-				}
-			}
-			exCount++
+		// Name should check out.
+		name, ok := originDIE.Val(dwarf.AttrName).(string)
+		if !ok {
+			t.Fatalf("no name attr for inlined subroutine at offset %v", child.Offset)
+		}
+		if name != "main.cand" {
+			t.Fatalf("expected inlined routine %s got %s", "main.cand", name)
+		}
 
-			// Verify that the call_file attribute for the inlined
-			// instance is ok. In this case it should match the file
-			// for the main routine. To do this we need to locate the
-			// compilation unit DIE that encloses what we're looking
-			// at; this can be done with the examiner.
-			cf, cfOK := child.Val(dwarf.AttrCallFile).(int64)
-			if !cfOK {
-				t.Fatalf("no call_file attr for inlined subroutine at offset %v", child.Offset)
-			}
-			file, err := ex.FileRef(d, mainIdx, cf)
-			if err != nil {
-				t.Errorf("FileRef: %v", err)
+		// Walk the children of the abstract subroutine. We expect
+		// to see child variables there, even if (perhaps due to
+		// optimization) there are no references to them from the
+		// inlined subroutine DIE.
+		absFcnIdx := ex.IdxFromOffset(ooff)
+		absFcnChildDies := ex.Children(absFcnIdx)
+		if len(absFcnChildDies) != 2 {
+			t.Fatalf("expected abstract function: expected 2 children, got %d children", len(absFcnChildDies))
+		}
+		formalCount := 0
+		for _, absChild := range absFcnChildDies {
+			if absChild.Tag == dwarf.TagFormalParameter {
+				formalCount += 1
 				continue
 			}
-			base := filepath.Base(file)
-			if base != "test.go" {
-				t.Errorf("bad call_file attribute, found '%s', want '%s'",
-					file, "test.go")
-			}
+			t.Fatalf("abstract function child DIE: expected formal, got %v", absChild.Tag)
+		}
+		if formalCount != 2 {
+			t.Fatalf("abstract function DIE: expected 2 formals, got %d", formalCount)
+		}
 
-			omap := make(map[dwarf.Offset]bool)
+		omap := make(map[dwarf.Offset]bool)
 
-			// Walk the child variables of the inlined routine. Each
-			// of them should have a distinct abstract origin-- if two
-			// vars point to the same origin things are definitely broken.
-			inlIdx := ex.IdxFromOffset(child.Offset)
-			inlChildDies := ex.Children(inlIdx)
-			for _, k := range inlChildDies {
-				ooff, originOK := k.Val(dwarf.AttrAbstractOrigin).(dwarf.Offset)
-				if !originOK {
-					t.Fatalf("no abstract origin attr for child of inlined subroutine at offset %v", k.Offset)
-				}
-				if _, found := omap[ooff]; found {
-					t.Fatalf("duplicate abstract origin at child of inlined subroutine at offset %v", k.Offset)
-				}
-				omap[ooff] = true
+		// Walk the child variables of the inlined routine. Each
+		// of them should have a distinct abstract origin-- if two
+		// vars point to the same origin things are definitely broken.
+		inlIdx := ex.IdxFromOffset(child.Offset)
+		inlChildDies := ex.Children(inlIdx)
+		for _, k := range inlChildDies {
+			ooff, originOK := k.Val(dwarf.AttrAbstractOrigin).(dwarf.Offset)
+			if !originOK {
+				t.Fatalf("no abstract origin attr for child of inlined subroutine at offset %v", k.Offset)
 			}
+			if _, found := omap[ooff]; found {
+				t.Fatalf("duplicate abstract origin at child of inlined subroutine at offset %v", k.Offset)
+			}
+			omap[ooff] = true
 		}
 	}
-	if exCount != len(expectedInl) {
+	if !found {
 		t.Fatalf("not enough inlined subroutines found in main.main")
 	}
 }
@@ -666,9 +830,7 @@
 		t.Skip("skipping test in short mode.")
 	}
 
-	if runtime.GOOS == "plan9" {
-		t.Skip("skipping on plan9; no DWARF symbol table in executables")
-	}
+	mustHaveDWARF(t)
 
 	if wd, err := os.Getwd(); err == nil {
 		gopathdir := filepath.Join(wd, "testdata", "httptest")
@@ -681,9 +843,7 @@
 func TestAbstractOriginSanityIssue25459(t *testing.T) {
 	testenv.MustHaveGoBuild(t)
 
-	if runtime.GOOS == "plan9" {
-		t.Skip("skipping on plan9; no DWARF symbol table in executables")
-	}
+	mustHaveDWARF(t)
 	if runtime.GOARCH != "amd64" && runtime.GOARCH != "386" {
 		t.Skip("skipping on not-amd64 not-386; location lists not supported")
 	}
@@ -699,9 +859,7 @@
 func TestAbstractOriginSanityIssue26237(t *testing.T) {
 	testenv.MustHaveGoBuild(t)
 
-	if runtime.GOOS == "plan9" {
-		t.Skip("skipping on plan9; no DWARF symbol table in executables")
-	}
+	mustHaveDWARF(t)
 	if wd, err := os.Getwd(); err == nil {
 		gopathdir := filepath.Join(wd, "testdata", "issue26237")
 		abstractOriginSanity(t, gopathdir, DefaultOpt)
@@ -712,15 +870,9 @@
 
 func TestRuntimeTypeAttrInternal(t *testing.T) {
 	testenv.MustHaveGoBuild(t)
-	testenv.MustInternalLink(t)
+	testenv.MustInternalLink(t, false)
 
-	if runtime.GOOS == "plan9" {
-		t.Skip("skipping on plan9; no DWARF symbol table in executables")
-	}
-
-	if runtime.GOOS == "windows" {
-		t.Skip("skipping on windows; test is incompatible with relocatable binaries")
-	}
+	mustHaveDWARF(t)
 
 	testRuntimeTypeAttr(t, "-ldflags=-linkmode=internal")
 }
@@ -730,19 +882,13 @@
 	testenv.MustHaveGoBuild(t)
 	testenv.MustHaveCGO(t)
 
-	if runtime.GOOS == "plan9" {
-		t.Skip("skipping on plan9; no DWARF symbol table in executables")
-	}
+	mustHaveDWARF(t)
 
 	// Explicitly test external linking, for dsymutil compatibility on Darwin.
 	if runtime.GOARCH == "ppc64" {
 		t.Skip("-linkmode=external not supported on ppc64")
 	}
 
-	if runtime.GOOS == "windows" {
-		t.Skip("skipping on windows; test is incompatible with relocatable binaries")
-	}
-
 	testRuntimeTypeAttr(t, "-ldflags=-linkmode=external")
 }
 
@@ -810,8 +956,8 @@
 		t.Fatalf("*main.X DIE had no runtime type attr. DIE: %v", dies[0])
 	}
 
-	if runtime.GOOS == "darwin" && runtime.GOARCH == "arm64" {
-		return // everything is PIE on ARM64, addresses are relocated
+	if platform.DefaultPIE(runtime.GOOS, runtime.GOARCH, false) {
+		return // everything is PIE, addresses are relocated
 	}
 	if rtAttr.(uint64)+types.Addr != addr {
 		t.Errorf("DWARF type offset was %#x+%#x, but test program said %#x", rtAttr.(uint64), types.Addr, addr)
@@ -824,9 +970,7 @@
 
 	testenv.MustHaveGoBuild(t)
 
-	if runtime.GOOS == "plan9" {
-		t.Skip("skipping on plan9; no DWARF symbol table in executables")
-	}
+	mustHaveDWARF(t)
 
 	t.Parallel()
 
@@ -938,9 +1082,7 @@
 
 	testenv.MustHaveGoBuild(t)
 
-	if runtime.GOOS == "plan9" {
-		t.Skip("skipping on plan9; no DWARF symbol table in executables")
-	}
+	mustHaveDWARF(t)
 
 	t.Parallel()
 
@@ -995,7 +1137,7 @@
 	// TODO: maybe there is some way to tell the external linker not to put
 	// those symbols in the executable's symbol table? Prefix the symbol name
 	// with "." or "L" to pretend it is a label?
-	if !testenv.CanInternalLink() {
+	if !testenv.CanInternalLink(false) {
 		return
 	}
 
@@ -1016,9 +1158,7 @@
 
 	testenv.MustHaveGoBuild(t)
 
-	if runtime.GOOS == "plan9" {
-		t.Skip("skipping on plan9; no DWARF symbol table in executables")
-	}
+	mustHaveDWARF(t)
 
 	t.Parallel()
 
@@ -1158,9 +1298,7 @@
 func TestIssue38192(t *testing.T) {
 	testenv.MustHaveGoBuild(t)
 
-	if runtime.GOOS == "plan9" {
-		t.Skip("skipping on plan9; no DWARF symbol table in executables")
-	}
+	mustHaveDWARF(t)
 
 	t.Parallel()
 
@@ -1268,9 +1406,7 @@
 func TestIssue39757(t *testing.T) {
 	testenv.MustHaveGoBuild(t)
 
-	if runtime.GOOS == "plan9" {
-		t.Skip("skipping on plan9; no DWARF symbol table in executables")
-	}
+	mustHaveDWARF(t)
 
 	t.Parallel()
 
@@ -1321,20 +1457,12 @@
 		t.Fatalf("error parsing DWARF: %v", err)
 	}
 	rdr := dw.Reader()
-	ex := dwtest.Examiner{}
+	ex := &dwtest.Examiner{}
 	if err := ex.Populate(rdr); err != nil {
 		t.Fatalf("error reading DWARF: %v", err)
 	}
 
-	// Locate the main.main DIE
-	mains := ex.Named("main.main")
-	if len(mains) == 0 {
-		t.Fatalf("unable to locate DIE for main.main")
-	}
-	if len(mains) != 1 {
-		t.Fatalf("more than one main.main DIE")
-	}
-	maindie := mains[0]
+	maindie := findSubprogramDIE(t, ex, "main.main")
 
 	// Collect the start/end PC for main.main
 	lowpc := maindie.Val(dwarf.AttrLowpc).(uint64)
@@ -1386,10 +1514,9 @@
 
 func TestIssue42484(t *testing.T) {
 	testenv.MustHaveGoBuild(t)
+	testenv.MustInternalLink(t, false) // Avoid spurious failures from external linkers.
 
-	if runtime.GOOS == "plan9" {
-		t.Skip("skipping on plan9; no DWARF symbol table in executables")
-	}
+	mustHaveDWARF(t)
 
 	t.Parallel()
 
@@ -1517,9 +1644,7 @@
 func TestOutputParamAbbrevAndAttr(t *testing.T) {
 	testenv.MustHaveGoBuild(t)
 
-	if runtime.GOOS == "plan9" {
-		t.Skip("skipping on plan9; no DWARF symbol table in executables")
-	}
+	mustHaveDWARF(t)
 	t.Parallel()
 
 	// This test verifies that the compiler is selecting the correct
@@ -1543,38 +1668,12 @@
 	println(v1, v2, v3[0], v4, v5, v6)
 }
 `
-	dir := t.TempDir()
-	f := gobuild(t, dir, prog, NoOpt)
-	defer f.Close()
+	_, ex := gobuildAndExamine(t, prog, NoOpt)
 
-	d, err := f.DWARF()
-	if err != nil {
-		t.Fatalf("error reading DWARF: %v", err)
-	}
-
-	rdr := d.Reader()
-	ex := dwtest.Examiner{}
-	if err := ex.Populate(rdr); err != nil {
-		t.Fatalf("error reading DWARF: %v", err)
-	}
-
-	// Locate the main.ABC DIE
-	abcs := ex.Named("main.ABC")
-	if len(abcs) == 0 {
-		t.Fatalf("unable to locate DIE for main.ABC")
-	}
-	if len(abcs) != 1 {
-		t.Fatalf("more than one main.ABC DIE")
-	}
-	abcdie := abcs[0]
-
-	// Vet the DIE
-	if abcdie.Tag != dwarf.TagSubprogram {
-		t.Fatalf("unexpected tag %v on main.ABC DIE", abcdie.Tag)
-	}
+	abcdie := findSubprogramDIE(t, ex, "main.ABC")
 
 	// Call a helper to collect param info.
-	found := processParams(abcdie, &ex)
+	found := processParams(abcdie, ex)
 
 	// Make sure we see all of the expected params in the proper
 	// order, that they have the varparam attr, and the varparam is
@@ -1592,9 +1691,7 @@
 	// have DIEs.
 	testenv.MustHaveGoBuild(t)
 
-	if runtime.GOOS == "plan9" {
-		t.Skip("skipping on plan9; no DWARF symbol table in executables")
-	}
+	mustHaveDWARF(t)
 	t.Parallel()
 
 	const prog = `
@@ -1688,9 +1785,7 @@
 func TestOptimizedOutParamHandling(t *testing.T) {
 	testenv.MustHaveGoBuild(t)
 
-	if runtime.GOOS == "plan9" {
-		t.Skip("skipping on plan9; no DWARF symbol table in executables")
-	}
+	mustHaveDWARF(t)
 	t.Parallel()
 
 	// This test is intended to verify that the compiler emits DWARF
@@ -1775,20 +1870,7 @@
 
 }
 `
-	dir := t.TempDir()
-	f := gobuild(t, dir, prog, DefaultOpt)
-	defer f.Close()
-
-	d, err := f.DWARF()
-	if err != nil {
-		t.Fatalf("error reading DWARF: %v", err)
-	}
-
-	rdr := d.Reader()
-	ex := dwtest.Examiner{}
-	if err := ex.Populate(rdr); err != nil {
-		t.Fatalf("error reading DWARF: %v", err)
-	}
+	_, ex := gobuildAndExamine(t, prog, DefaultOpt)
 
 	testcases := []struct {
 		tag      string
@@ -1815,22 +1897,10 @@
 	for _, tc := range testcases {
 		// Locate the proper DIE
 		which := fmt.Sprintf("main.%s", tc.tag)
-		tcs := ex.Named(which)
-		if len(tcs) == 0 {
-			t.Fatalf("unable to locate DIE for " + which)
-		}
-		if len(tcs) != 1 {
-			t.Fatalf("more than one " + which + " DIE")
-		}
-		die := tcs[0]
-
-		// Vet the DIE
-		if die.Tag != dwarf.TagSubprogram {
-			t.Fatalf("unexpected tag %v on "+which+" DIE", die.Tag)
-		}
+		die := findSubprogramDIE(t, ex, which)
 
 		// Examine params for this subprogram.
-		foundParams := processParams(die, &ex)
+		foundParams := processParams(die, ex)
 		if foundParams != tc.expected {
 			t.Errorf("check failed for testcase %s -- wanted:\n%s\ngot:%s\n",
 				tc.tag, tc.expected, foundParams)
@@ -1842,9 +1912,7 @@
 	// emitted in the final binary
 	testenv.MustHaveGoBuild(t)
 
-	if runtime.GOOS == "plan9" {
-		t.Skip("skipping on plan9; no DWARF symbol table in executables")
-	}
+	mustHaveDWARF(t)
 
 	t.Parallel()
 
@@ -1920,9 +1988,7 @@
 func TestZeroSizedVariable(t *testing.T) {
 	testenv.MustHaveGoBuild(t)
 
-	if runtime.GOOS == "plan9" {
-		t.Skip("skipping on plan9; no DWARF symbol table in executables")
-	}
+	mustHaveDWARF(t)
 	t.Parallel()
 
 	// This test verifies that the compiler emits DIEs for zero sized variables
@@ -1943,29 +2009,18 @@
 `
 
 	for _, opt := range []string{NoOpt, DefaultOpt} {
-		dir := t.TempDir()
-		f := gobuild(t, dir, prog, opt)
-		defer f.Close()
-		defer os.RemoveAll(dir)
+		opt := opt
+		t.Run(opt, func(t *testing.T) {
+			_, ex := gobuildAndExamine(t, prog, opt)
 
-		d, err := f.DWARF()
-		if err != nil {
-			t.Fatalf("error reading DWARF: %v", err)
-		}
-
-		rdr := d.Reader()
-		ex := dwtest.Examiner{}
-		if err := ex.Populate(rdr); err != nil {
-			t.Fatalf("error reading DWARF: %v", err)
-		}
-
-		// Locate the main.zeroSizedVariable DIE
-		abcs := ex.Named("zeroSizedVariable")
-		if len(abcs) == 0 {
-			t.Fatalf("unable to locate DIE for zeroSizedVariable")
-		}
-		if len(abcs) != 1 {
-			t.Fatalf("more than one zeroSizedVariable DIE")
-		}
+			// Locate the main.zeroSizedVariable DIE
+			abcs := ex.Named("zeroSizedVariable")
+			if len(abcs) == 0 {
+				t.Fatalf("unable to locate DIE for zeroSizedVariable")
+			}
+			if len(abcs) != 1 {
+				t.Fatalf("more than one zeroSizedVariable DIE")
+			}
+		})
 	}
 }
diff --git a/src/cmd/link/internal/ld/elf.go b/src/cmd/link/internal/ld/elf.go
index a1ae7ea..713f773 100644
--- a/src/cmd/link/internal/ld/elf.go
+++ b/src/cmd/link/internal/ld/elf.go
@@ -191,6 +191,31 @@
 	interp string
 )
 
+// ELFArch includes target-specific hooks for ELF targets.
+// This is initialized by the target-specific Init function
+// called by the linker's main function in cmd/link/main.go.
+type ELFArch struct {
+	// TODO: Document these fields.
+
+	Androiddynld   string
+	Linuxdynld     string
+	LinuxdynldMusl string
+	Freebsddynld   string
+	Netbsddynld    string
+	Openbsddynld   string
+	Dragonflydynld string
+	Solarisdynld   string
+
+	Reloc1    func(*Link, *OutBuf, *loader.Loader, loader.Sym, loader.ExtReloc, int, int64) bool
+	RelocSize uint32 // size of an ELF relocation record, must match Reloc1.
+	SetupPLT  func(ctxt *Link, plt, gotplt *loader.SymbolBuilder, dynamic loader.Sym)
+
+	// DynamicReadOnly can be set to true to make the .dynamic
+	// section read-only. By default it is writable.
+	// This is used by MIPS targets.
+	DynamicReadOnly bool
+}
+
 type Elfstring struct {
 	s   string
 	off int
@@ -229,7 +254,7 @@
 			ehdr.Flags = 0x20000004 /* MIPS 3 CPIC */
 		}
 		if ctxt.Arch.Family == sys.Loong64 {
-			ehdr.Flags = 0x3 /* LoongArch lp64d */
+			ehdr.Flags = 0x43 /* DOUBLE_FLOAT, OBJABI_V1 */
 		}
 		if ctxt.Arch.Family == sys.RISCV64 {
 			ehdr.Flags = 0x4 /* RISCV Float ABI Double */
@@ -1264,8 +1289,8 @@
 			break
 		}
 
-		// Compute external relocations on the go, and pass to Elfreloc1
-		// to stream out.
+		// Compute external relocations on the go, and pass to
+		// ELF.Reloc1 to stream out.
 		relocs := ldr.Relocs(s)
 		for ri := 0; ri < relocs.Count(); ri++ {
 			r := relocs.At(ri)
@@ -1284,7 +1309,7 @@
 			if !ldr.AttrReachable(rr.Xsym) {
 				ldr.Errorf(s, "unreachable reloc %d (%s) target %v", r.Type(), sym.RelocName(ctxt.Arch, r.Type()), ldr.SymName(rr.Xsym))
 			}
-			if !thearch.Elfreloc1(ctxt, out, ldr, s, rr, ri, int64(uint64(ldr.SymValue(s)+int64(r.Off()))-sect.Vaddr)) {
+			if !thearch.ELF.Reloc1(ctxt, out, ldr, s, rr, ri, int64(uint64(ldr.SymValue(s)+int64(r.Off()))-sect.Vaddr)) {
 				ldr.Errorf(s, "unsupported obj reloc %d (%s)/%d to %s", r.Type(), sym.RelocName(ctxt.Arch, r.Type()), r.Siz(), ldr.SymName(r.Sym()))
 			}
 		}
@@ -1301,7 +1326,7 @@
 		ctxt.Out.Write8(0)
 	}
 
-	sizeExtRelocs(ctxt, thearch.ElfrelocSize)
+	sizeExtRelocs(ctxt, thearch.ELF.RelocSize)
 	relocSect, wg := relocSectFn(ctxt, elfrelocsect)
 
 	for _, sect := range Segtext.Sections {
@@ -1365,83 +1390,88 @@
 
 	shstrtab.SetType(sym.SELFROSECT)
 
-	shstrtab.Addstring("")
-	shstrtab.Addstring(".text")
-	shstrtab.Addstring(".noptrdata")
-	shstrtab.Addstring(".data")
-	shstrtab.Addstring(".bss")
-	shstrtab.Addstring(".noptrbss")
-	shstrtab.Addstring(".go.fuzzcntrs")
-	shstrtab.Addstring(".go.buildinfo")
+	shstrtabAddstring := func(s string) {
+		off := shstrtab.Addstring(s)
+		elfsetstring(ctxt, 0, s, int(off))
+	}
+
+	shstrtabAddstring("")
+	shstrtabAddstring(".text")
+	shstrtabAddstring(".noptrdata")
+	shstrtabAddstring(".data")
+	shstrtabAddstring(".bss")
+	shstrtabAddstring(".noptrbss")
+	shstrtabAddstring(".go.fuzzcntrs")
+	shstrtabAddstring(".go.buildinfo")
 	if ctxt.IsMIPS() {
-		shstrtab.Addstring(".MIPS.abiflags")
-		shstrtab.Addstring(".gnu.attributes")
+		shstrtabAddstring(".MIPS.abiflags")
+		shstrtabAddstring(".gnu.attributes")
 	}
 
 	// generate .tbss section for dynamic internal linker or external
 	// linking, so that various binutils could correctly calculate
 	// PT_TLS size. See https://golang.org/issue/5200.
 	if !*FlagD || ctxt.IsExternal() {
-		shstrtab.Addstring(".tbss")
+		shstrtabAddstring(".tbss")
 	}
 	if ctxt.IsNetbsd() {
-		shstrtab.Addstring(".note.netbsd.ident")
+		shstrtabAddstring(".note.netbsd.ident")
 		if *flagRace {
-			shstrtab.Addstring(".note.netbsd.pax")
+			shstrtabAddstring(".note.netbsd.pax")
 		}
 	}
 	if ctxt.IsOpenbsd() {
-		shstrtab.Addstring(".note.openbsd.ident")
+		shstrtabAddstring(".note.openbsd.ident")
 	}
 	if ctxt.IsFreebsd() {
-		shstrtab.Addstring(".note.tag")
+		shstrtabAddstring(".note.tag")
 	}
 	if len(buildinfo) > 0 {
-		shstrtab.Addstring(".note.gnu.build-id")
+		shstrtabAddstring(".note.gnu.build-id")
 	}
 	if *flagBuildid != "" {
-		shstrtab.Addstring(".note.go.buildid")
+		shstrtabAddstring(".note.go.buildid")
 	}
-	shstrtab.Addstring(".elfdata")
-	shstrtab.Addstring(".rodata")
+	shstrtabAddstring(".elfdata")
+	shstrtabAddstring(".rodata")
 	// See the comment about data.rel.ro.FOO section names in data.go.
 	relro_prefix := ""
 	if ctxt.UseRelro() {
-		shstrtab.Addstring(".data.rel.ro")
+		shstrtabAddstring(".data.rel.ro")
 		relro_prefix = ".data.rel.ro"
 	}
-	shstrtab.Addstring(relro_prefix + ".typelink")
-	shstrtab.Addstring(relro_prefix + ".itablink")
-	shstrtab.Addstring(relro_prefix + ".gosymtab")
-	shstrtab.Addstring(relro_prefix + ".gopclntab")
+	shstrtabAddstring(relro_prefix + ".typelink")
+	shstrtabAddstring(relro_prefix + ".itablink")
+	shstrtabAddstring(relro_prefix + ".gosymtab")
+	shstrtabAddstring(relro_prefix + ".gopclntab")
 
 	if ctxt.IsExternal() {
 		*FlagD = true
 
-		shstrtab.Addstring(elfRelType + ".text")
-		shstrtab.Addstring(elfRelType + ".rodata")
-		shstrtab.Addstring(elfRelType + relro_prefix + ".typelink")
-		shstrtab.Addstring(elfRelType + relro_prefix + ".itablink")
-		shstrtab.Addstring(elfRelType + relro_prefix + ".gosymtab")
-		shstrtab.Addstring(elfRelType + relro_prefix + ".gopclntab")
-		shstrtab.Addstring(elfRelType + ".noptrdata")
-		shstrtab.Addstring(elfRelType + ".data")
+		shstrtabAddstring(elfRelType + ".text")
+		shstrtabAddstring(elfRelType + ".rodata")
+		shstrtabAddstring(elfRelType + relro_prefix + ".typelink")
+		shstrtabAddstring(elfRelType + relro_prefix + ".itablink")
+		shstrtabAddstring(elfRelType + relro_prefix + ".gosymtab")
+		shstrtabAddstring(elfRelType + relro_prefix + ".gopclntab")
+		shstrtabAddstring(elfRelType + ".noptrdata")
+		shstrtabAddstring(elfRelType + ".data")
 		if ctxt.UseRelro() {
-			shstrtab.Addstring(elfRelType + ".data.rel.ro")
+			shstrtabAddstring(elfRelType + ".data.rel.ro")
 		}
-		shstrtab.Addstring(elfRelType + ".go.buildinfo")
+		shstrtabAddstring(elfRelType + ".go.buildinfo")
 		if ctxt.IsMIPS() {
-			shstrtab.Addstring(elfRelType + ".MIPS.abiflags")
-			shstrtab.Addstring(elfRelType + ".gnu.attributes")
+			shstrtabAddstring(elfRelType + ".MIPS.abiflags")
+			shstrtabAddstring(elfRelType + ".gnu.attributes")
 		}
 
 		// add a .note.GNU-stack section to mark the stack as non-executable
-		shstrtab.Addstring(".note.GNU-stack")
+		shstrtabAddstring(".note.GNU-stack")
 
 		if ctxt.IsShared() {
-			shstrtab.Addstring(".note.go.abihash")
-			shstrtab.Addstring(".note.go.pkg-list")
-			shstrtab.Addstring(".note.go.deps")
+			shstrtabAddstring(".note.go.abihash")
+			shstrtabAddstring(".note.go.pkg-list")
+			shstrtabAddstring(".note.go.deps")
 		}
 	}
 
@@ -1454,35 +1484,35 @@
 	}
 
 	if hasinitarr {
-		shstrtab.Addstring(".init_array")
-		shstrtab.Addstring(elfRelType + ".init_array")
+		shstrtabAddstring(".init_array")
+		shstrtabAddstring(elfRelType + ".init_array")
 	}
 
 	if !*FlagS {
-		shstrtab.Addstring(".symtab")
-		shstrtab.Addstring(".strtab")
-		dwarfaddshstrings(ctxt, shstrtab)
+		shstrtabAddstring(".symtab")
+		shstrtabAddstring(".strtab")
+		dwarfaddshstrings(ctxt, shstrtabAddstring)
 	}
 
-	shstrtab.Addstring(".shstrtab")
+	shstrtabAddstring(".shstrtab")
 
 	if !*FlagD { /* -d suppresses dynamic loader format */
-		shstrtab.Addstring(".interp")
-		shstrtab.Addstring(".hash")
-		shstrtab.Addstring(".got")
+		shstrtabAddstring(".interp")
+		shstrtabAddstring(".hash")
+		shstrtabAddstring(".got")
 		if ctxt.IsPPC64() {
-			shstrtab.Addstring(".glink")
+			shstrtabAddstring(".glink")
 		}
-		shstrtab.Addstring(".got.plt")
-		shstrtab.Addstring(".dynamic")
-		shstrtab.Addstring(".dynsym")
-		shstrtab.Addstring(".dynstr")
-		shstrtab.Addstring(elfRelType)
-		shstrtab.Addstring(elfRelType + ".plt")
+		shstrtabAddstring(".got.plt")
+		shstrtabAddstring(".dynamic")
+		shstrtabAddstring(".dynsym")
+		shstrtabAddstring(".dynstr")
+		shstrtabAddstring(elfRelType)
+		shstrtabAddstring(elfRelType + ".plt")
 
-		shstrtab.Addstring(".plt")
-		shstrtab.Addstring(".gnu.version")
-		shstrtab.Addstring(".gnu.version_r")
+		shstrtabAddstring(".plt")
+		shstrtabAddstring(".gnu.version")
+		shstrtabAddstring(".gnu.version_r")
 
 		/* dynamic symbol table - first entry all zeros */
 		dynsym := ldr.CreateSymForUpdate(".dynsym", 0)
@@ -1543,13 +1573,17 @@
 
 		/* define dynamic elf table */
 		dynamic := ldr.CreateSymForUpdate(".dynamic", 0)
-		dynamic.SetType(sym.SELFSECT) // writable
+		if thearch.ELF.DynamicReadOnly {
+			dynamic.SetType(sym.SELFROSECT)
+		} else {
+			dynamic.SetType(sym.SELFSECT)
+		}
 
 		if ctxt.IsS390X() {
 			// S390X uses .got instead of .got.plt
 			gotplt = got
 		}
-		thearch.Elfsetupplt(ctxt, plt, gotplt, dynamic.Sym())
+		thearch.ELF.SetupPLT(ctxt, plt, gotplt, dynamic.Sym())
 
 		/*
 		 * .dynamic table
@@ -1594,6 +1628,7 @@
 		// DT_JMPREL is emitted so we have to defer generation of elf.DT_PLTREL,
 		// DT_PLTRELSZ, and elf.DT_JMPREL dynamic entries until after we know the
 		// size of .rel(a).plt section.
+
 		Elfwritedynent(ctxt.Arch, dynamic, elf.DT_DEBUG, 0)
 	}
 
@@ -1846,17 +1881,17 @@
 			switch ctxt.HeadType {
 			case objabi.Hlinux:
 				if buildcfg.GOOS == "android" {
-					interpreter = thearch.Androiddynld
+					interpreter = thearch.ELF.Androiddynld
 					if interpreter == "" {
 						Exitf("ELF interpreter not set")
 					}
 				} else {
-					interpreter = thearch.Linuxdynld
+					interpreter = thearch.ELF.Linuxdynld
 					// If interpreter does not exist, try musl instead.
 					// This lets the same cmd/link binary work on
 					// both glibc-based and musl-based systems.
 					if _, err := os.Stat(interpreter); err != nil {
-						if musl := thearch.LinuxdynldMusl; musl != "" {
+						if musl := thearch.ELF.LinuxdynldMusl; musl != "" {
 							if _, err := os.Stat(musl); err == nil {
 								interpreter = musl
 							}
@@ -1865,19 +1900,19 @@
 				}
 
 			case objabi.Hfreebsd:
-				interpreter = thearch.Freebsddynld
+				interpreter = thearch.ELF.Freebsddynld
 
 			case objabi.Hnetbsd:
-				interpreter = thearch.Netbsddynld
+				interpreter = thearch.ELF.Netbsddynld
 
 			case objabi.Hopenbsd:
-				interpreter = thearch.Openbsddynld
+				interpreter = thearch.ELF.Openbsddynld
 
 			case objabi.Hdragonfly:
-				interpreter = thearch.Dragonflydynld
+				interpreter = thearch.ELF.Dragonflydynld
 
 			case objabi.Hsolaris:
-				interpreter = thearch.Solarisdynld
+				interpreter = thearch.ELF.Solarisdynld
 			}
 		}
 
@@ -2105,25 +2140,15 @@
 		}
 	}
 
-	if ctxt.HeadType == objabi.Hlinux {
+	if ctxt.HeadType == objabi.Hlinux || ctxt.HeadType == objabi.Hfreebsd {
 		ph := newElfPhdr()
 		ph.Type = elf.PT_GNU_STACK
 		ph.Flags = elf.PF_W + elf.PF_R
 		ph.Align = uint64(ctxt.Arch.RegSize)
-
-		ph = newElfPhdr()
-		ph.Type = elf.PT_PAX_FLAGS
-		ph.Flags = 0x2a00 // mprotect, randexec, emutramp disabled
-		ph.Align = uint64(ctxt.Arch.RegSize)
 	} else if ctxt.HeadType == objabi.Hsolaris {
 		ph := newElfPhdr()
 		ph.Type = elf.PT_SUNWSTACK
 		ph.Flags = elf.PF_W + elf.PF_R
-	} else if ctxt.HeadType == objabi.Hfreebsd {
-		ph := newElfPhdr()
-		ph.Type = elf.PT_GNU_STACK
-		ph.Flags = elf.PF_W + elf.PF_R
-		ph.Align = uint64(ctxt.Arch.RegSize)
 	}
 
 elfobj:
diff --git a/src/cmd/link/internal/ld/fallocate_test.go b/src/cmd/link/internal/ld/fallocate_test.go
index 1ed0eb2..d95fec7 100644
--- a/src/cmd/link/internal/ld/fallocate_test.go
+++ b/src/cmd/link/internal/ld/fallocate_test.go
@@ -2,12 +2,12 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build darwin || linux
-// +build darwin linux
+//go:build darwin || (freebsd && go1.21) || linux
 
 package ld
 
 import (
+	"errors"
 	"os"
 	"path/filepath"
 	"syscall"
@@ -27,7 +27,7 @@
 	// Try fallocate first.
 	for {
 		err = out.fallocate(1 << 10)
-		if err == syscall.EOPNOTSUPP { // The underlying file system may not support fallocate
+		if errors.Is(err, errors.ErrUnsupported) || err == errNoFallocate { // The underlying file system may not support fallocate
 			t.Skip("fallocate is not supported")
 		}
 		if err == syscall.EINTR {
diff --git a/src/cmd/link/internal/ld/go.go b/src/cmd/link/internal/ld/go.go
index 9dfb0f7..ef73924 100644
--- a/src/cmd/link/internal/ld/go.go
+++ b/src/cmd/link/internal/ld/go.go
@@ -452,48 +452,3 @@
 		adddynlib(ctxt, lib)
 	}
 }
-
-type Pkg struct {
-	mark    bool
-	checked bool
-	path    string
-	impby   []*Pkg
-}
-
-var pkgall []*Pkg
-
-func (p *Pkg) cycle() *Pkg {
-	if p.checked {
-		return nil
-	}
-
-	if p.mark {
-		nerrors++
-		fmt.Printf("import cycle:\n")
-		fmt.Printf("\t%s\n", p.path)
-		return p
-	}
-
-	p.mark = true
-	for _, q := range p.impby {
-		if bad := q.cycle(); bad != nil {
-			p.mark = false
-			p.checked = true
-			fmt.Printf("\timports %s\n", p.path)
-			if bad == p {
-				return nil
-			}
-			return bad
-		}
-	}
-
-	p.checked = true
-	p.mark = false
-	return nil
-}
-
-func importcycles() {
-	for _, p := range pkgall {
-		p.cycle()
-	}
-}
diff --git a/src/cmd/link/internal/ld/heap.go b/src/cmd/link/internal/ld/heap.go
index ea2d772..286a61b 100644
--- a/src/cmd/link/internal/ld/heap.go
+++ b/src/cmd/link/internal/ld/heap.go
@@ -52,3 +52,50 @@
 }
 
 func (h *heap) empty() bool { return len(*h) == 0 }
+
+// Same as heap, but sorts alphabetically instead of by index.
+// (Note that performance is not so critical here, as it is
+// in the case above. Some simplification might be in order.)
+type lexHeap []loader.Sym
+
+func (h *lexHeap) push(ldr *loader.Loader, s loader.Sym) {
+	*h = append(*h, s)
+	// sift up
+	n := len(*h) - 1
+	for n > 0 {
+		p := (n - 1) / 2 // parent
+		if ldr.SymName((*h)[p]) <= ldr.SymName((*h)[n]) {
+			break
+		}
+		(*h)[n], (*h)[p] = (*h)[p], (*h)[n]
+		n = p
+	}
+}
+
+func (h *lexHeap) pop(ldr *loader.Loader) loader.Sym {
+	r := (*h)[0]
+	n := len(*h) - 1
+	(*h)[0] = (*h)[n]
+	*h = (*h)[:n]
+
+	// sift down
+	i := 0
+	for {
+		c := 2*i + 1 // left child
+		if c >= n {
+			break
+		}
+		if c1 := c + 1; c1 < n && ldr.SymName((*h)[c1]) < ldr.SymName((*h)[c]) {
+			c = c1 // right child
+		}
+		if ldr.SymName((*h)[i]) <= ldr.SymName((*h)[c]) {
+			break
+		}
+		(*h)[i], (*h)[c] = (*h)[c], (*h)[i]
+		i = c
+	}
+
+	return r
+}
+
+func (h *lexHeap) empty() bool { return len(*h) == 0 }
diff --git a/src/cmd/link/internal/ld/inittask.go b/src/cmd/link/internal/ld/inittask.go
new file mode 100644
index 0000000..0699107
--- /dev/null
+++ b/src/cmd/link/internal/ld/inittask.go
@@ -0,0 +1,175 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package ld
+
+import (
+	"cmd/internal/objabi"
+	"cmd/link/internal/loader"
+	"cmd/link/internal/sym"
+	"fmt"
+	"sort"
+)
+
+// Inittasks finds inittask records, figures out a good
+// order to execute them in, and emits that order for the
+// runtime to use.
+//
+// An inittask represents the initialization code that needs
+// to be run for a package. For package p, the p..inittask
+// symbol contains a list of init functions to run, both
+// explicit user init functions and implicit compiler-generated
+// init functions for initializing global variables like maps.
+//
+// In addition, inittask records have dependencies between each
+// other, mirroring the import dependencies. So if package p
+// imports package q, then there will be a dependency p -> q.
+// We can't initialize package p until after package q has
+// already been initialized.
+//
+// Package dependencies are encoded with relocations. If package
+// p imports package q, then package p's inittask record will
+// have a R_INITORDER relocation pointing to package q's inittask
+// record. See cmd/compile/internal/pkginit/init.go.
+//
+// This function computes an ordering of all of the inittask
+// records so that the order respects all the dependencies,
+// and given that restriction, orders the inittasks in
+// lexicographic order.
+func (ctxt *Link) inittasks() {
+	switch ctxt.BuildMode {
+	case BuildModeExe, BuildModePIE, BuildModeCArchive, BuildModeCShared:
+		// Normally the inittask list will be run on program startup.
+		ctxt.mainInittasks = ctxt.inittaskSym("main..inittask", "go:main.inittasks")
+	case BuildModePlugin:
+		// For plugins, the list will be run on plugin load.
+		ctxt.mainInittasks = ctxt.inittaskSym(fmt.Sprintf("%s..inittask", objabi.PathToPrefix(*flagPluginPath)), "go:plugin.inittasks")
+		// Make symbol local so multiple plugins don't clobber each other's inittask list.
+		ctxt.loader.SetAttrLocal(ctxt.mainInittasks, true)
+	case BuildModeShared:
+		// Nothing to do. The inittask list will be built by
+		// the final build (with the -linkshared option).
+	default:
+		Exitf("unhandled build mode %d", ctxt.BuildMode)
+	}
+
+	// If the runtime is one of the packages we are building,
+	// initialize the runtime_inittasks variable.
+	ldr := ctxt.loader
+	if ldr.Lookup("runtime.runtime_inittasks", 0) != 0 {
+		t := ctxt.inittaskSym("runtime..inittask", "go:runtime.inittasks")
+
+		// This slice header is already defined in runtime/proc.go, so we update it here with new contents.
+		sh := ldr.Lookup("runtime.runtime_inittasks", 0)
+		sb := ldr.MakeSymbolUpdater(sh)
+		sb.SetSize(0)
+		sb.SetType(sym.SNOPTRDATA) // Could be SRODATA, but see issue 58857.
+		sb.AddAddr(ctxt.Arch, t)
+		sb.AddUint(ctxt.Arch, uint64(ldr.SymSize(t)/int64(ctxt.Arch.PtrSize)))
+		sb.AddUint(ctxt.Arch, uint64(ldr.SymSize(t)/int64(ctxt.Arch.PtrSize)))
+	}
+}
+
+// inittaskSym builds a symbol containing pointers to all the inittasks
+// that need to be run, given the root inittask symbol.
+func (ctxt *Link) inittaskSym(rootName, symName string) loader.Sym {
+	ldr := ctxt.loader
+	root := ldr.Lookup(rootName, 0)
+	if root == 0 {
+		// Nothing to do
+		return 0
+	}
+
+	// Edges record dependencies between packages.
+	// {from,to} is in edges if from's package imports to's package.
+	// This list is used to implement reverse edge lookups.
+	type edge struct {
+		from, to loader.Sym
+	}
+	var edges []edge
+
+	// List of packages that are ready to schedule. We use a lexicographic
+	// ordered heap to pick the lexically earliest uninitialized but
+	// inititalizeable package at each step.
+	var h lexHeap
+
+	// m maps from an inittask symbol for package p to the number of
+	// p's direct imports that have not yet been scheduled.
+	m := map[loader.Sym]int{}
+
+	// Find all reachable inittask records from the root.
+	// Keep track of the dependency edges between them in edges.
+	// Keep track of how many imports each package has in m.
+	// q is the list of found but not yet explored packages.
+	var q []loader.Sym
+	m[root] = 0
+	q = append(q, root)
+	for len(q) > 0 {
+		x := q[len(q)-1]
+		q = q[:len(q)-1]
+		relocs := ldr.Relocs(x)
+		n := relocs.Count()
+		ndeps := 0
+		for i := 0; i < n; i++ {
+			r := relocs.At(i)
+			if r.Type() != objabi.R_INITORDER {
+				continue
+			}
+			ndeps++
+			s := r.Sym()
+			edges = append(edges, edge{from: x, to: s})
+			if _, ok := m[s]; ok {
+				continue // already found
+			}
+			q = append(q, s)
+			m[s] = 0 // mark as found
+		}
+		m[x] = ndeps
+		if ndeps == 0 {
+			h.push(ldr, x)
+		}
+	}
+
+	// Sort edges so we can look them up by edge destination.
+	sort.Slice(edges, func(i, j int) bool {
+		return edges[i].to < edges[j].to
+	})
+
+	// Figure out the schedule.
+	sched := ldr.MakeSymbolBuilder(symName)
+	sched.SetType(sym.SNOPTRDATA) // Could be SRODATA, but see isue 58857.
+	for !h.empty() {
+		// Pick the lexicographically first initializable package.
+		s := h.pop(ldr)
+
+		// Add s to the schedule.
+		if ldr.SymSize(s) > 8 {
+			// Note: don't add s if it has no functions to run. We need
+			// s during linking to compute an ordering, but the runtime
+			// doesn't need to know about it. About 1/2 of stdlib packages
+			// fit in this bucket.
+			sched.AddAddr(ctxt.Arch, s)
+		}
+
+		// Find all incoming edges into s.
+		a := sort.Search(len(edges), func(i int) bool { return edges[i].to >= s })
+		b := sort.Search(len(edges), func(i int) bool { return edges[i].to > s })
+
+		// Decrement the import count for all packages that import s.
+		// If the count reaches 0, that package is now ready to schedule.
+		for _, e := range edges[a:b] {
+			m[e.from]--
+			if m[e.from] == 0 {
+				h.push(ldr, e.from)
+			}
+		}
+	}
+
+	for s, n := range m {
+		if n != 0 {
+			Exitf("inittask for %s is not schedulable %d", ldr.SymName(s), n)
+		}
+	}
+	return sched.Sym()
+}
diff --git a/src/cmd/link/internal/ld/ld_test.go b/src/cmd/link/internal/ld/ld_test.go
index 314dab7..a7a6082 100644
--- a/src/cmd/link/internal/ld/ld_test.go
+++ b/src/cmd/link/internal/ld/ld_test.go
@@ -21,7 +21,7 @@
 
 	// When external linking, symbols may be defined externally, so we allow
 	// undefined symbols and let external linker resolve. Skip the test.
-	testenv.MustInternalLink(t)
+	testenv.MustInternalLink(t, false)
 
 	t.Parallel()
 
@@ -65,6 +65,9 @@
 		case n > 0:
 			t.Errorf("unmatched error: %s (x%d)", want, n)
 		case n < 0:
+			if runtime.GOOS == "android" && runtime.GOARCH == "arm64" {
+				testenv.SkipFlaky(t, 58807)
+			}
 			t.Errorf("extra errors: %s (x%d)", want, -n)
 		}
 	}
@@ -133,7 +136,7 @@
 
 func TestLargeTextSectionSplitting(t *testing.T) {
 	switch runtime.GOARCH {
-	case "ppc64", "ppc64le":
+	case "ppc64", "ppc64le", "arm":
 	case "arm64":
 		if runtime.GOOS == "darwin" {
 			break
diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go
index c073017..5e5d255 100644
--- a/src/cmd/link/internal/ld/lib.go
+++ b/src/cmd/link/internal/ld/lib.go
@@ -119,6 +119,10 @@
 	DynStr  loader.Sym
 
 	unreachableMethod loader.Sym
+
+	// Symbol containing a list of all the inittasks that need
+	// to be run at startup.
+	mainInittasks loader.Sym
 }
 
 // mkArchSym is a helper for setArchSyms, to set up a special symbol.
@@ -127,7 +131,7 @@
 	ctxt.loader.SetAttrReachable(*ls, true)
 }
 
-// mkArchVecSym is similar to  setArchSyms, but operates on elements within
+// mkArchSymVec is similar to  setArchSyms, but operates on elements within
 // a slice, where each element corresponds to some symbol version.
 func (ctxt *Link) mkArchSymVec(name string, ver int, ls []loader.Sym) {
 	ls[ver] = ctxt.loader.LookupOrCreateSym(name, ver)
@@ -181,15 +185,6 @@
 	// We leave some room for extra stuff like PLT stubs.
 	TrampLimit uint64
 
-	Androiddynld   string
-	Linuxdynld     string
-	LinuxdynldMusl string
-	Freebsddynld   string
-	Netbsddynld    string
-	Openbsddynld   string
-	Dragonflydynld string
-	Solarisdynld   string
-
 	// Empty spaces between codeblocks will be padded with this value.
 	// For example an architecture might want to pad with a trap instruction to
 	// catch wayward programs. Architectures that do not define a padding value
@@ -209,7 +204,7 @@
 	// is the contents of the to-be-relocated data item (from sym.P). Return
 	// value is the appropriately relocated value (to be written back to the
 	// same spot in sym.P), number of external _host_ relocations needed (i.e.
-	// ELF/Mach-O/etc. relocations, not Go relocations, this must match Elfreloc1,
+	// ELF/Mach-O/etc. relocations, not Go relocations, this must match ELF.Reloc1,
 	// etc.), and a boolean indicating success/failure (a failing value indicates
 	// a fatal error).
 	Archreloc func(*Target, *loader.Loader, *ArchSyms, loader.Reloc, loader.Sym,
@@ -244,9 +239,6 @@
 	// needed.
 	Extreloc func(*Target, *loader.Loader, loader.Reloc, loader.Sym) (loader.ExtReloc, bool)
 
-	Elfreloc1      func(*Link, *OutBuf, *loader.Loader, loader.Sym, loader.ExtReloc, int, int64) bool
-	ElfrelocSize   uint32 // size of an ELF relocation record, must match Elfreloc1.
-	Elfsetupplt    func(ctxt *Link, plt, gotplt *loader.SymbolBuilder, dynamic loader.Sym)
 	Gentext        func(*Link, *loader.Loader) // Generate text before addressing has been performed.
 	Machoreloc1    func(*sys.Arch, *OutBuf, *loader.Loader, loader.Sym, loader.ExtReloc, int64) bool
 	MachorelocSize uint32 // size of an Mach-O relocation record, must match Machoreloc1.
@@ -267,6 +259,9 @@
 
 	// optional override for assignAddress
 	AssignAddress func(ldr *loader.Loader, sect *sym.Section, n int, s loader.Sym, va uint64, isTramp bool) (*sym.Section, int, uint64)
+
+	// ELF specific information.
+	ELF ELFArch
 }
 
 var (
@@ -333,8 +328,10 @@
 	Segrelrodata sym.Segment
 	Segdata      sym.Segment
 	Segdwarf     sym.Segment
+	Segpdata     sym.Segment // windows-only
+	Segxdata     sym.Segment // windows-only
 
-	Segments = []*sym.Segment{&Segtext, &Segrodata, &Segrelrodata, &Segdata, &Segdwarf}
+	Segments = []*sym.Segment{&Segtext, &Segrodata, &Segrelrodata, &Segdata, &Segdwarf, &Segpdata, &Segxdata}
 )
 
 const pkgdef = "__.PKGDEF"
@@ -350,6 +347,12 @@
 	// any of these objects, we must link externally. Issue 52863.
 	dynimportfail []string
 
+	// preferlinkext is a list of packages for which the Go command
+	// noticed use of peculiar C flags. If we see any of these,
+	// default to linking externally unless overridden by the
+	// user. See issues #58619, #58620, and #58848.
+	preferlinkext []string
+
 	// unknownObjFormat is set to true if we see an object whose
 	// format we don't recognize.
 	unknownObjFormat = false
@@ -525,8 +528,7 @@
 	default:
 		log.Fatalf("invalid -strictdups flag value %d", *FlagStrictDups)
 	}
-	elfsetstring1 := func(str string, off int) { elfsetstring(ctxt, 0, str, off) }
-	ctxt.loader = loader.NewLoader(flags, elfsetstring1, &ctxt.ErrorReporter.ErrorReporter)
+	ctxt.loader = loader.NewLoader(flags, &ctxt.ErrorReporter.ErrorReporter)
 	ctxt.ErrorReporter.SymName = func(s loader.Sym) string {
 		return ctxt.loader.SymName(s)
 	}
@@ -640,14 +642,37 @@
 			if *flagLibGCC != "none" {
 				hostArchive(ctxt, *flagLibGCC)
 			}
+			// For glibc systems, the linker setup used by GCC
+			// looks like
+			//
+			//  GROUP ( /lib/x86_64-linux-gnu/libc.so.6
+			//      /usr/lib/x86_64-linux-gnu/libc_nonshared.a
+			//      AS_NEEDED ( /lib64/ld-linux-x86-64.so.2 ) )
+			//
+			// where libc_nonshared.a contains a small set of
+			// symbols including "__stack_chk_fail_local" and a
+			// few others. Thus if we are doing internal linking
+			// and "__stack_chk_fail_local" is unresolved (most
+			// likely due to the use of -fstack-protector), try
+			// loading libc_nonshared.a to resolve it.
+			//
+			// On Alpine Linux (musl-based), the library providing
+			// this symbol is called libssp_nonshared.a.
+			isunresolved := symbolsAreUnresolved(ctxt, []string{"__stack_chk_fail_local"})
+			if isunresolved[0] {
+				if p := ctxt.findLibPath("libc_nonshared.a"); p != "none" {
+					hostArchive(ctxt, p)
+				}
+				if p := ctxt.findLibPath("libssp_nonshared.a"); p != "none" {
+					hostArchive(ctxt, p)
+				}
+			}
 		}
 	}
 
 	// We've loaded all the code now.
 	ctxt.Loaded = true
 
-	importcycles()
-
 	strictDupMsgCount = ctxt.loader.NStrictDupMsgs()
 }
 
@@ -959,21 +984,38 @@
 // Leave type:runtime. symbols alone, because other parts of
 // the linker manipulates them.
 func typeSymbolMangle(name string) string {
-	if !strings.HasPrefix(name, "type:") {
+	isType := strings.HasPrefix(name, "type:")
+	if !isType && !strings.Contains(name, "@") {
+		// Issue 58800: instantiated symbols may include a type name, which may contain "@"
 		return name
 	}
 	if strings.HasPrefix(name, "type:runtime.") {
 		return name
 	}
+	if strings.HasPrefix(name, "go:string.") {
+		// String symbols will be grouped to a single go:string.* symbol.
+		// No need to mangle individual symbol names.
+		return name
+	}
 	if len(name) <= 14 && !strings.Contains(name, "@") { // Issue 19529
 		return name
 	}
-	hash := notsha256.Sum256([]byte(name))
-	prefix := "type:"
-	if name[5] == '.' {
-		prefix = "type:."
+	if isType {
+		hash := notsha256.Sum256([]byte(name[5:]))
+		prefix := "type:"
+		if name[5] == '.' {
+			prefix = "type:."
+		}
+		return prefix + base64.StdEncoding.EncodeToString(hash[:6])
 	}
-	return prefix + base64.StdEncoding.EncodeToString(hash[:6])
+	// instantiated symbol, replace type name in []
+	i := strings.IndexByte(name, '[')
+	j := strings.LastIndexByte(name, ']')
+	if j == -1 || j <= i {
+		j = len(name)
+	}
+	hash := notsha256.Sum256([]byte(name[i+1 : j]))
+	return name[:i+1] + base64.StdEncoding.EncodeToString(hash[:6]) + name[j:]
 }
 
 /*
@@ -1072,6 +1114,13 @@
 		if arhdr.name == "dynimportfail" {
 			dynimportfail = append(dynimportfail, lib.Pkg)
 		}
+		if arhdr.name == "preferlinkext" {
+			// Ignore this directive if -linkmode has been
+			// set explicitly.
+			if ctxt.LinkMode == LinkAuto {
+				preferlinkext = append(preferlinkext, lib.Pkg)
+			}
+		}
 
 		// Skip other special (non-object-file) sections that
 		// build tools may have added. Such sections must have
@@ -1214,13 +1263,16 @@
 
 // hostobjCopy creates a copy of the object files in hostobj in a
 // temporary directory.
-func hostobjCopy() (paths []string) {
+func (ctxt *Link) hostobjCopy() (paths []string) {
 	var wg sync.WaitGroup
 	sema := make(chan struct{}, runtime.NumCPU()) // limit open file descriptors
 	for i, h := range hostobj {
 		h := h
 		dst := filepath.Join(*flagTmpdir, fmt.Sprintf("%06d.o", i))
 		paths = append(paths, dst)
+		if ctxt.Debugvlog != 0 {
+			ctxt.Logf("host obj copy: %s from pkg %s -> %s\n", h.pn, h.pkg, dst)
+		}
 
 		wg.Add(1)
 		go func() {
@@ -1303,7 +1355,7 @@
 	}
 	argv = append(argv, *flagOutfile)
 	argv = append(argv, filepath.Join(*flagTmpdir, "go.o"))
-	argv = append(argv, hostobjCopy()...)
+	argv = append(argv, ctxt.hostobjCopy()...)
 
 	if ctxt.Debugvlog != 0 {
 		ctxt.Logf("archive: %s\n", strings.Join(argv, " "))
@@ -1366,6 +1418,10 @@
 			// resolving a lazy binding. See issue 38824.
 			// Force eager resolution to work around.
 			argv = append(argv, "-Wl,-flat_namespace", "-Wl,-bind_at_load")
+			if linkerFlagSupported(ctxt.Arch, argv[0], "", "-Wl,-ld_classic") {
+				// Force old linker to work around a bug in Apple's new linker.
+				argv = append(argv, "-Wl,-ld_classic")
+			}
 		}
 		if !combineDwarf {
 			argv = append(argv, "-Wl,-S") // suppress STAB (symbolic debugging) symbols
@@ -1373,6 +1429,12 @@
 	case objabi.Hopenbsd:
 		argv = append(argv, "-Wl,-nopie")
 		argv = append(argv, "-pthread")
+		if ctxt.Arch.InFamily(sys.ARM64) {
+			// Disable execute-only on openbsd/arm64 - the Go arm64 assembler
+			// currently stores constants in the text section rather than in rodata.
+			// See issue #59615.
+			argv = append(argv, "-Wl,--no-execute-only")
+		}
 	case objabi.Hwindows:
 		if windowsgui {
 			argv = append(argv, "-mwindows")
@@ -1401,6 +1463,16 @@
 		argv = append(argv, "-Wl,-bbigtoc")
 	}
 
+	// On PPC64, verify the external toolchain supports Power10. This is needed when
+	// PC relative relocations might be generated by Go. Only targets compiling ELF
+	// binaries might generate these relocations.
+	if ctxt.IsPPC64() && ctxt.IsElf() && buildcfg.GOPPC64 >= 10 {
+		if !linkerFlagSupported(ctxt.Arch, argv[0], "", "-mcpu=power10") {
+			Exitf("The external toolchain does not support -mcpu=power10. " +
+				" This is required to externally link GOPPC64 >= power10")
+		}
+	}
+
 	// Enable/disable ASLR on Windows.
 	addASLRargs := func(argv []string, val bool) []string {
 		// Old/ancient versions of GCC support "--dynamicbase" and
@@ -1534,15 +1606,12 @@
 			altLinker = "lld"
 		}
 
-		if ctxt.Arch.InFamily(sys.ARM, sys.ARM64) && buildcfg.GOOS == "linux" {
-			// On ARM, the GNU linker will generate COPY relocations
-			// even with -znocopyreloc set.
+		if ctxt.Arch.InFamily(sys.ARM64) && buildcfg.GOOS == "linux" {
+			// On ARM64, the GNU linker will fail with
+			// -znocopyreloc if it thinks a COPY relocation is
+			// required. Switch to gold.
 			// https://sourceware.org/bugzilla/show_bug.cgi?id=19962
-			//
-			// On ARM64, the GNU linker will fail instead of
-			// generating COPY relocations.
-			//
-			// In both cases, switch to gold.
+			// https://go.dev/issue/22040
 			altLinker = "gold"
 
 			// If gold is not installed, gcc will silently switch
@@ -1553,7 +1622,7 @@
 			cmd := exec.Command(name, args...)
 			if out, err := cmd.CombinedOutput(); err == nil {
 				if !bytes.Contains(out, []byte("GNU gold")) {
-					log.Fatalf("ARM external linker must be gold (issue #15696), but is not: %s", out)
+					log.Fatalf("ARM64 external linker must be gold (issue #15696, 22040), but is not: %s", out)
 				}
 			}
 		}
@@ -1607,7 +1676,13 @@
 
 	// Force global symbols to be exported for dlopen, etc.
 	if ctxt.IsELF {
-		argv = append(argv, "-rdynamic")
+		if ctxt.DynlinkingGo() || ctxt.BuildMode == BuildModeCShared || !linkerFlagSupported(ctxt.Arch, argv[0], altLinker, "-Wl,--export-dynamic-symbol=main") {
+			argv = append(argv, "-rdynamic")
+		} else {
+			ctxt.loader.ForAllCgoExportDynamic(func(s loader.Sym) {
+				argv = append(argv, "-Wl,--export-dynamic-symbol="+ctxt.loader.SymExtname(s))
+			})
+		}
 	}
 	if ctxt.HeadType == objabi.Haix {
 		fileName := xcoffCreateExportFile(ctxt)
@@ -1636,7 +1711,7 @@
 	}
 
 	argv = append(argv, filepath.Join(*flagTmpdir, "go.o"))
-	argv = append(argv, hostobjCopy()...)
+	argv = append(argv, ctxt.hostobjCopy()...)
 	if ctxt.HeadType == objabi.Haix {
 		// We want to have C files after Go files to remove
 		// trampolines csects made by ld.
@@ -1750,7 +1825,7 @@
 		// case used has specified "-fuse-ld=...".
 		extld := ctxt.extld()
 		name, args := extld[0], extld[1:]
-		args = append(args, flagExtldflags...)
+		args = append(args, trimLinkerArgv(flagExtldflags)...)
 		args = append(args, "-Wl,--version")
 		cmd := exec.Command(name, args...)
 		usingLLD := false
@@ -1777,6 +1852,8 @@
 		argv = append(argv, peimporteddlls()...)
 	}
 
+	argv = ctxt.passLongArgsInResponseFile(argv, altLinker)
+
 	if ctxt.Debugvlog != 0 {
 		ctxt.Logf("host link:")
 		for _, v := range argv {
@@ -1825,6 +1902,16 @@
 				out = append(out[:i], out[i+len(noPieWarning):]...)
 			}
 		}
+		if ctxt.IsDarwin() {
+			const bindAtLoadWarning = "ld: warning: -bind_at_load is deprecated on macOS\n"
+			if i := bytes.Index(out, []byte(bindAtLoadWarning)); i >= 0 {
+				// -bind_at_load is deprecated with ld-prime, but needed for
+				// correctness with older versions of ld64. Swallow the warning.
+				// TODO: maybe pass -bind_at_load conditionally based on C
+				// linker version.
+				out = append(out[:i], out[i+len(bindAtLoadWarning):]...)
+			}
+		}
 		ctxt.Logf("%s", out)
 	}
 
@@ -1848,7 +1935,11 @@
 		stripCmd := strings.TrimSuffix(string(out), "\n")
 
 		dsym := filepath.Join(*flagTmpdir, "go.dwarf")
-		if out, err := exec.Command(dsymutilCmd, "-f", *flagOutfile, "-o", dsym).CombinedOutput(); err != nil {
+		cmd := exec.Command(dsymutilCmd, "-f", *flagOutfile, "-o", dsym)
+		// dsymutil may not clean up its temp directory at exit.
+		// Set DSYMUTIL_REPRODUCER_PATH to work around. see issue 59026.
+		cmd.Env = append(os.Environ(), "DSYMUTIL_REPRODUCER_PATH="+*flagTmpdir)
+		if out, err := cmd.CombinedOutput(); err != nil {
 			Exitf("%s: running dsymutil failed: %v\n%s", os.Args[0], err, out)
 		}
 		// Remove STAB (symbolic debugging) symbols after we are done with them (by dsymutil).
@@ -1887,6 +1978,47 @@
 	}
 }
 
+// passLongArgsInResponseFile writes the arguments into a file if they
+// are very long.
+func (ctxt *Link) passLongArgsInResponseFile(argv []string, altLinker string) []string {
+	c := 0
+	for _, arg := range argv {
+		c += len(arg)
+	}
+
+	if c < sys.ExecArgLengthLimit {
+		return argv
+	}
+
+	// Only use response files if they are supported.
+	response := filepath.Join(*flagTmpdir, "response")
+	if err := os.WriteFile(response, nil, 0644); err != nil {
+		log.Fatalf("failed while testing response file: %v", err)
+	}
+	if !linkerFlagSupported(ctxt.Arch, argv[0], altLinker, "@"+response) {
+		if ctxt.Debugvlog != 0 {
+			ctxt.Logf("not using response file because linker does not support one")
+		}
+		return argv
+	}
+
+	var buf bytes.Buffer
+	for _, arg := range argv[1:] {
+		// The external linker response file supports quoted strings.
+		fmt.Fprintf(&buf, "%q\n", arg)
+	}
+	if err := os.WriteFile(response, buf.Bytes(), 0644); err != nil {
+		log.Fatalf("failed while writing response file: %v", err)
+	}
+	if ctxt.Debugvlog != 0 {
+		ctxt.Logf("response file %s contents:\n%s", response, buf.Bytes())
+	}
+	return []string{
+		argv[0],
+		"@" + response,
+	}
+}
+
 var createTrivialCOnce sync.Once
 
 func linkerFlagSupported(arch *sys.Arch, linker, altLinker, flag string) bool {
@@ -1897,6 +2029,29 @@
 		}
 	})
 
+	flags := hostlinkArchArgs(arch)
+
+	moreFlags := trimLinkerArgv(append(flagExtldflags, ldflag...))
+	flags = append(flags, moreFlags...)
+
+	if altLinker != "" {
+		flags = append(flags, "-fuse-ld="+altLinker)
+	}
+	trivialPath := filepath.Join(*flagTmpdir, "trivial.c")
+	outPath := filepath.Join(*flagTmpdir, "a.out")
+	flags = append(flags, "-o", outPath, flag, trivialPath)
+
+	cmd := exec.Command(linker, flags...)
+	cmd.Env = append([]string{"LC_ALL=C"}, os.Environ()...)
+	out, err := cmd.CombinedOutput()
+	// GCC says "unrecognized command line option ‘-no-pie’"
+	// clang says "unknown argument: '-no-pie'"
+	return err == nil && !bytes.Contains(out, []byte("unrecognized")) && !bytes.Contains(out, []byte("unknown"))
+}
+
+// trimLinkerArgv returns a new copy of argv that does not include flags
+// that are not relevant for testing whether some linker option works.
+func trimLinkerArgv(argv []string) []string {
 	flagsWithNextArgSkip := []string{
 		"-F",
 		"-l",
@@ -1923,10 +2078,10 @@
 		"-target",
 	}
 
-	flags := hostlinkArchArgs(arch)
+	var flags []string
 	keep := false
 	skip := false
-	for _, f := range append(flagExtldflags, ldflag...) {
+	for _, f := range argv {
 		if keep {
 			flags = append(flags, f)
 			keep = false
@@ -1947,19 +2102,7 @@
 			}
 		}
 	}
-
-	if altLinker != "" {
-		flags = append(flags, "-fuse-ld="+altLinker)
-	}
-	flags = append(flags, flag, "trivial.c")
-
-	cmd := exec.Command(linker, flags...)
-	cmd.Dir = *flagTmpdir
-	cmd.Env = append([]string{"LC_ALL=C"}, os.Environ()...)
-	out, err := cmd.CombinedOutput()
-	// GCC says "unrecognized command line option ‘-no-pie’"
-	// clang says "unknown argument: '-no-pie'"
-	return err == nil && !bytes.Contains(out, []byte("unrecognized")) && !bytes.Contains(out, []byte("unknown"))
+	return flags
 }
 
 // hostlinkArchArgs returns arguments to pass to the external linker
diff --git a/src/cmd/link/internal/ld/macho.go b/src/cmd/link/internal/ld/macho.go
index d6c28e4..88ff787 100644
--- a/src/cmd/link/internal/ld/macho.go
+++ b/src/cmd/link/internal/ld/macho.go
@@ -710,6 +710,7 @@
 	/* text */
 	v := Rnd(int64(uint64(HEADR)+Segtext.Length), int64(*FlagRound))
 
+	var mstext *MachoSeg
 	if ctxt.LinkMode != LinkExternal {
 		ms = newMachoSeg("__TEXT", 20)
 		ms.vaddr = uint64(va)
@@ -718,6 +719,7 @@
 		ms.filesize = uint64(v)
 		ms.prot1 = 7
 		ms.prot2 = 5
+		mstext = ms
 	}
 
 	for _, sect := range Segtext.Sections {
@@ -831,9 +833,9 @@
 		ml.data[2] = uint32(linkoff + s1 + s2 + s3 + s4 + s5) /* stroff */
 		ml.data[3] = uint32(s6)                               /* strsize */
 
-		machodysymtab(ctxt, linkoff+s1+s2)
-
 		if ctxt.LinkMode != LinkExternal {
+			machodysymtab(ctxt, linkoff+s1+s2)
+
 			ml := newMachoLoad(ctxt.Arch, LC_LOAD_DYLINKER, 6)
 			ml.data[0] = 12 /* offset to string */
 			stringtouint32(ml.data[1:], "/usr/lib/dyld")
@@ -868,7 +870,7 @@
 		if int64(len(data)) != codesigOff {
 			panic("wrong size")
 		}
-		codesign.Sign(ldr.Data(cs), bytes.NewReader(data), "a.out", codesigOff, int64(Segtext.Fileoff), int64(Segtext.Filelen), ctxt.IsExe() || ctxt.IsPIE())
+		codesign.Sign(ldr.Data(cs), bytes.NewReader(data), "a.out", codesigOff, int64(mstext.fileoffset), int64(mstext.filesize), ctxt.IsExe() || ctxt.IsPIE())
 		ctxt.Out.SeekSet(codesigOff)
 		ctxt.Out.Write(ldr.Data(cs))
 	}
diff --git a/src/cmd/link/internal/ld/main.go b/src/cmd/link/internal/ld/main.go
index 0058bd4..bedc15a 100644
--- a/src/cmd/link/internal/ld/main.go
+++ b/src/cmd/link/internal/ld/main.go
@@ -98,8 +98,9 @@
 	flagDebugNosplit  = flag.Bool("debugnosplit", false, "dump nosplit call graph")
 	FlagStrictDups    = flag.Int("strictdups", 0, "sanity check duplicate symbol contents during object file reading (1=warn 2=err).")
 	FlagRound         = flag.Int("R", -1, "set address rounding `quantum`")
-	FlagTextAddr      = flag.Int64("T", -1, "set text segment `address`")
+	FlagTextAddr      = flag.Int64("T", -1, "set the start address of text symbols")
 	flagEntrySymbol   = flag.String("E", "", "set `entry` symbol name")
+	flagPruneWeakMap  = flag.Bool("pruneweakmap", true, "prune weak mapinit refs")
 	cpuprofile        = flag.String("cpuprofile", "", "write cpu profile to `file`")
 	memprofile        = flag.String("memprofile", "", "write memory profile to `file`")
 	memprofilerate    = flag.Int64("memprofilerate", 0, "set runtime.MemProfileRate to `rate`")
@@ -109,6 +110,9 @@
 
 // Main is the main entry point for the linker code.
 func Main(arch *sys.Arch, theArch Arch) {
+	log.SetPrefix("link: ")
+	log.SetFlags(0)
+
 	thearch = theArch
 	ctxt := linknew(arch)
 	ctxt.Bso = bufio.NewWriter(os.Stdout)
@@ -158,6 +162,14 @@
 		// dump symbol info on crash
 		defer func() { ctxt.loader.Dump() }()
 	}
+	if ctxt.Debugvlog > 1 {
+		// dump symbol info on error
+		AtExit(func() {
+			if nerrors > 0 {
+				ctxt.loader.Dump()
+			}
+		})
+	}
 
 	switch *flagHeadType {
 	case "":
@@ -185,6 +197,10 @@
 
 	checkStrictDups = *FlagStrictDups
 
+	if ctxt.IsDarwin() && ctxt.BuildMode == BuildModeCShared {
+		*FlagW = true // default to -w in c-shared mode on darwin, see #61229
+	}
+
 	if !buildcfg.Experiment.RegabiWrappers {
 		abiInternalVer = 0
 	}
@@ -267,6 +283,9 @@
 	bench.Start("loadlib")
 	ctxt.loadlib()
 
+	bench.Start("inittasks")
+	ctxt.inittasks()
+
 	bench.Start("deadcode")
 	deadcode(ctxt)
 
diff --git a/src/cmd/link/internal/ld/outbuf_freebsd.go b/src/cmd/link/internal/ld/outbuf_freebsd.go
new file mode 100644
index 0000000..7e718c1
--- /dev/null
+++ b/src/cmd/link/internal/ld/outbuf_freebsd.go
@@ -0,0 +1,21 @@
+// Copyright 2023 The Go 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:build freebsd && go1.21
+
+package ld
+
+import (
+	"internal/syscall/unix"
+	"syscall"
+)
+
+func (out *OutBuf) fallocate(size uint64) error {
+	err := unix.PosixFallocate(int(out.f.Fd()), 0, int64(size))
+	// ZFS on FreeBSD does not support posix_fallocate and returns EINVAL in that case.
+	if err == syscall.EINVAL {
+		return errNoFallocate
+	}
+	return err
+}
diff --git a/src/cmd/link/internal/ld/outbuf_nofallocate.go b/src/cmd/link/internal/ld/outbuf_nofallocate.go
index dd5afc6..435be5e 100644
--- a/src/cmd/link/internal/ld/outbuf_nofallocate.go
+++ b/src/cmd/link/internal/ld/outbuf_nofallocate.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build !darwin && !linux
+//go:build !darwin && !(freebsd && go1.21) && !linux
 
 package ld
 
diff --git a/src/cmd/link/internal/ld/outbuf_notdarwin.go b/src/cmd/link/internal/ld/outbuf_notdarwin.go
index f9caa41..3e5c67a 100644
--- a/src/cmd/link/internal/ld/outbuf_notdarwin.go
+++ b/src/cmd/link/internal/ld/outbuf_notdarwin.go
@@ -3,7 +3,6 @@
 // license that can be found in the LICENSE file.
 
 //go:build !darwin
-// +build !darwin
 
 package ld
 
diff --git a/src/cmd/link/internal/ld/pcln.go b/src/cmd/link/internal/ld/pcln.go
index 34ab86c..aaf8dde 100644
--- a/src/cmd/link/internal/ld/pcln.go
+++ b/src/cmd/link/internal/ld/pcln.go
@@ -11,10 +11,10 @@
 	"cmd/link/internal/loader"
 	"cmd/link/internal/sym"
 	"fmt"
+	"internal/abi"
 	"internal/buildcfg"
 	"os"
 	"path/filepath"
-	"strings"
 )
 
 const funcSize = 11 * 4 // funcSize is the size of the _func object in runtime/runtime2.go
@@ -168,7 +168,7 @@
 		}
 
 		inlFunc := ldr.FuncInfo(call.Func)
-		var funcID objabi.FuncID
+		var funcID abi.FuncID
 		startLine := int32(0)
 		if inlFunc.Valid() {
 			funcID = inlFunc.FuncID()
@@ -288,35 +288,11 @@
 func (state *pclntab) generateFuncnametab(ctxt *Link, funcs []loader.Sym) map[loader.Sym]uint32 {
 	nameOffsets := make(map[loader.Sym]uint32, state.nfunc)
 
-	// The name used by the runtime is the concatenation of the 3 returned strings.
-	// For regular functions, only one returned string is nonempty.
-	// For generic functions, we use three parts so that we can print everything
-	// within the outermost "[]" as "...".
-	nameParts := func(name string) (string, string, string) {
-		i := strings.IndexByte(name, '[')
-		if i < 0 {
-			return name, "", ""
-		}
-		// TODO: use LastIndexByte once the bootstrap compiler is >= Go 1.5.
-		j := len(name) - 1
-		for j > i && name[j] != ']' {
-			j--
-		}
-		if j <= i {
-			return name, "", ""
-		}
-		return name[:i], "[...]", name[j+1:]
-	}
-
 	// Write the null terminated strings.
 	writeFuncNameTab := func(ctxt *Link, s loader.Sym) {
 		symtab := ctxt.loader.MakeSymbolUpdater(s)
 		for s, off := range nameOffsets {
-			a, b, c := nameParts(ctxt.loader.SymName(s))
-			o := int64(off)
-			o = symtab.AddStringAt(o, a)
-			o = symtab.AddStringAt(o, b)
-			_ = symtab.AddCStringAt(o, c)
+			symtab.AddCStringAt(int64(off), ctxt.loader.SymName(s))
 		}
 	}
 
@@ -324,8 +300,7 @@
 	var size int64
 	walkFuncs(ctxt, funcs, func(s loader.Sym) {
 		nameOffsets[s] = uint32(size)
-		a, b, c := nameParts(ctxt.loader.SymName(s))
-		size += int64(len(a) + len(b) + len(c) + 1) // NULL terminate
+		size += int64(len(ctxt.loader.SymName(s)) + 1) // NULL terminate
 	})
 
 	state.funcnametab = state.addGeneratedSym(ctxt, "runtime.funcnametab", size, writeFuncNameTab)
@@ -531,8 +506,8 @@
 	}
 	numPCData := uint32(ldr.NumPcdata(s))
 	if fi.NumInlTree() > 0 {
-		if numPCData < objabi.PCDATA_InlTreeIndex+1 {
-			numPCData = objabi.PCDATA_InlTreeIndex + 1
+		if numPCData < abi.PCDATA_InlTreeIndex+1 {
+			numPCData = abi.PCDATA_InlTreeIndex + 1
 		}
 	}
 	return numPCData
@@ -569,10 +544,10 @@
 	if fi.Valid() {
 		fdSyms = ldr.Funcdata(s, fdSyms)
 		if fi.NumInlTree() > 0 {
-			if len(fdSyms) < objabi.FUNCDATA_InlTree+1 {
-				fdSyms = append(fdSyms, make([]loader.Sym, objabi.FUNCDATA_InlTree+1-len(fdSyms))...)
+			if len(fdSyms) < abi.FUNCDATA_InlTree+1 {
+				fdSyms = append(fdSyms, make([]loader.Sym, abi.FUNCDATA_InlTree+1-len(fdSyms))...)
 			}
-			fdSyms[objabi.FUNCDATA_InlTree] = inlSym
+			fdSyms[abi.FUNCDATA_InlTree] = inlSym
 		}
 	}
 	return fdSyms
@@ -600,8 +575,8 @@
 			fi.Preload()
 			numFuncData := ldr.NumFuncdata(s)
 			if fi.NumInlTree() > 0 {
-				if numFuncData < objabi.FUNCDATA_InlTree+1 {
-					numFuncData = objabi.FUNCDATA_InlTree + 1
+				if numFuncData < abi.FUNCDATA_InlTree+1 {
+					numFuncData = abi.FUNCDATA_InlTree + 1
 				}
 			}
 			size += int64(numPCData(ldr, s, fi) * 4)
@@ -702,14 +677,14 @@
 		off = sb.SetUint32(ctxt.Arch, off, uint32(startLine))
 
 		// funcID uint8
-		var funcID objabi.FuncID
+		var funcID abi.FuncID
 		if fi.Valid() {
 			funcID = fi.FuncID()
 		}
 		off = sb.SetUint8(ctxt.Arch, off, uint8(funcID))
 
 		// flag uint8
-		var flag objabi.FuncFlag
+		var flag abi.FuncFlag
 		if fi.Valid() {
 			flag = fi.FuncFlag()
 		}
@@ -727,7 +702,7 @@
 				sb.SetUint32(ctxt.Arch, off+int64(j*4), uint32(ldr.SymValue(pcSym)))
 			}
 			if fi.NumInlTree() > 0 {
-				sb.SetUint32(ctxt.Arch, off+objabi.PCDATA_InlTreeIndex*4, uint32(ldr.SymValue(pcinline)))
+				sb.SetUint32(ctxt.Arch, off+abi.PCDATA_InlTreeIndex*4, uint32(ldr.SymValue(pcinline)))
 			}
 		}
 
diff --git a/src/cmd/link/internal/ld/pe.go b/src/cmd/link/internal/ld/pe.go
index 0e29131..1502b3e 100644
--- a/src/cmd/link/internal/ld/pe.go
+++ b/src/cmd/link/internal/ld/pe.go
@@ -98,22 +98,23 @@
 // See https://docs.microsoft.com/en-us/windows/win32/debug/pe-format.
 // TODO(crawshaw): add these constants to debug/pe.
 const (
-	// TODO: the Microsoft doco says IMAGE_SYM_DTYPE_ARRAY is 3 and IMAGE_SYM_DTYPE_FUNCTION is 2
 	IMAGE_SYM_TYPE_NULL      = 0
 	IMAGE_SYM_TYPE_STRUCT    = 8
-	IMAGE_SYM_DTYPE_FUNCTION = 0x20
-	IMAGE_SYM_DTYPE_ARRAY    = 0x30
+	IMAGE_SYM_DTYPE_FUNCTION = 2
+	IMAGE_SYM_DTYPE_ARRAY    = 3
 	IMAGE_SYM_CLASS_EXTERNAL = 2
 	IMAGE_SYM_CLASS_STATIC   = 3
 
-	IMAGE_REL_I386_DIR32  = 0x0006
-	IMAGE_REL_I386_SECREL = 0x000B
-	IMAGE_REL_I386_REL32  = 0x0014
+	IMAGE_REL_I386_DIR32   = 0x0006
+	IMAGE_REL_I386_DIR32NB = 0x0007
+	IMAGE_REL_I386_SECREL  = 0x000B
+	IMAGE_REL_I386_REL32   = 0x0014
 
-	IMAGE_REL_AMD64_ADDR64 = 0x0001
-	IMAGE_REL_AMD64_ADDR32 = 0x0002
-	IMAGE_REL_AMD64_REL32  = 0x0004
-	IMAGE_REL_AMD64_SECREL = 0x000B
+	IMAGE_REL_AMD64_ADDR64   = 0x0001
+	IMAGE_REL_AMD64_ADDR32   = 0x0002
+	IMAGE_REL_AMD64_ADDR32NB = 0x0003
+	IMAGE_REL_AMD64_REL32    = 0x0004
+	IMAGE_REL_AMD64_SECREL   = 0x000B
 
 	IMAGE_REL_ARM_ABSOLUTE = 0x0000
 	IMAGE_REL_ARM_ADDR32   = 0x0001
@@ -152,6 +153,7 @@
 
 // DOS stub that prints out
 // "This program cannot be run in DOS mode."
+// See IMAGE_DOS_HEADER in the Windows SDK for the format of the header used here.
 var dosstub = []uint8{
 	0x4d,
 	0x5a,
@@ -159,12 +161,12 @@
 	0x00,
 	0x03,
 	0x00,
+	0x00,
+	0x00,
 	0x04,
 	0x00,
 	0x00,
 	0x00,
-	0x00,
-	0x00,
 	0xff,
 	0xff,
 	0x00,
@@ -431,6 +433,8 @@
 	dataSect       *peSection
 	bssSect        *peSection
 	ctorsSect      *peSection
+	pdataSect      *peSection
+	xdataSect      *peSection
 	nextSectOffset uint32
 	nextFileOffset uint32
 	symtabOffset   int64 // offset to the start of symbol table
@@ -496,6 +500,36 @@
 	}
 }
 
+// addSEH adds SEH information to the COFF file f.
+func (f *peFile) addSEH(ctxt *Link) {
+	// .pdata section can exist without the .xdata section.
+	// .xdata section depends on the .pdata section.
+	if Segpdata.Length == 0 {
+		return
+	}
+	d := pefile.addSection(".pdata", int(Segpdata.Length), int(Segpdata.Length))
+	d.characteristics = IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ
+	if ctxt.LinkMode == LinkExternal {
+		// Some gcc versions don't honor the default alignment for the .pdata section.
+		d.characteristics |= IMAGE_SCN_ALIGN_4BYTES
+	}
+	pefile.pdataSect = d
+	d.checkSegment(&Segpdata)
+	pefile.dataDirectory[pe.IMAGE_DIRECTORY_ENTRY_EXCEPTION].VirtualAddress = d.virtualAddress
+	pefile.dataDirectory[pe.IMAGE_DIRECTORY_ENTRY_EXCEPTION].Size = d.virtualSize
+
+	if Segxdata.Length > 0 {
+		d = pefile.addSection(".xdata", int(Segxdata.Length), int(Segxdata.Length))
+		d.characteristics = IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ
+		if ctxt.LinkMode == LinkExternal {
+			// Some gcc versions don't honor the default alignment for the .xdata section.
+			d.characteristics |= IMAGE_SCN_ALIGN_4BYTES
+		}
+		pefile.xdataSect = d
+		d.checkSegment(&Segxdata)
+	}
+}
+
 // addInitArray adds .ctors COFF section to the file f.
 func (f *peFile) addInitArray(ctxt *Link) *peSection {
 	// The size below was determined by the specification for array relocations,
@@ -591,15 +625,22 @@
 		return int(sect.Rellen / relocLen)
 	}
 
-	sects := []struct {
+	type relsect struct {
 		peSect *peSection
 		seg    *sym.Segment
 		syms   []loader.Sym
-	}{
+	}
+	sects := []relsect{
 		{f.textSect, &Segtext, ctxt.Textp},
 		{f.rdataSect, &Segrodata, ctxt.datap},
 		{f.dataSect, &Segdata, ctxt.datap},
 	}
+	if sehp.pdata != 0 {
+		sects = append(sects, relsect{f.pdataSect, &Segpdata, []loader.Sym{sehp.pdata}})
+	}
+	if sehp.xdata != 0 {
+		sects = append(sects, relsect{f.xdataSect, &Segxdata, []loader.Sym{sehp.xdata}})
+	}
 	for _, s := range sects {
 		s.peSect.emitRelocations(ctxt.Out, func() int {
 			var n int
@@ -738,7 +779,7 @@
 				//  - https://docs.microsoft.com/en-us/windows/win32/debug/pe-format#export-address-table
 				//  - https://sourceware.org/git/?p=binutils-gdb.git;a=blob;f=ld/pe-dll.c;h=e7b82ba6ffadf74dc1b9ee71dc13d48336941e51;hb=HEAD#l972)
 				//
-				// CL 317917 changes "." to ":" in symbols name, so theses symbols can not be
+				// CL 317917 changes "." to ":" in symbols name, so these symbols can not be
 				// found by external linker anymore. So a hacky way is adding the
 				// underscore prefix for these 2 symbols. I don't have enough knowledge to
 				// verify whether adding the underscore for all STEXT/STYPE symbols are
@@ -749,19 +790,21 @@
 
 		name = mangleABIName(ctxt, ldr, s, name)
 
-		var peSymType uint16
-		if ctxt.IsExternal() {
-			peSymType = IMAGE_SYM_TYPE_NULL
-		} else {
-			// TODO: fix IMAGE_SYM_DTYPE_ARRAY value and use following expression, instead of 0x0308
-			// peSymType = IMAGE_SYM_DTYPE_ARRAY<<8 + IMAGE_SYM_TYPE_STRUCT
-			peSymType = 0x0308 // "array of structs"
+		var peSymType uint16 = IMAGE_SYM_TYPE_NULL
+		switch t {
+		case sym.STEXT, sym.SDYNIMPORT, sym.SHOSTOBJ, sym.SUNDEFEXT:
+			// Microsoft's PE documentation is contradictory. It says that the symbol's complex type
+			// is stored in the pesym.Type most significant byte, but MSVC, LLVM, and mingw store it
+			// in the 4 high bits of the less significant byte. Also, the PE documentation says that
+			// the basic type for a function should be IMAGE_SYM_TYPE_VOID,
+			// but the reality is that it uses IMAGE_SYM_TYPE_NULL instead.
+			peSymType = IMAGE_SYM_DTYPE_FUNCTION<<4 + IMAGE_SYM_TYPE_NULL
 		}
 		sect, value, err := f.mapToPESection(ldr, s, ctxt.LinkMode)
 		if err != nil {
-			if t == sym.SDYNIMPORT || t == sym.SHOSTOBJ || t == sym.SUNDEFEXT {
-				peSymType = IMAGE_SYM_DTYPE_FUNCTION
-			} else {
+			switch t {
+			case sym.SDYNIMPORT, sym.SHOSTOBJ, sym.SUNDEFEXT:
+			default:
 				ctxt.Errorf(s, "addpesym: %v", err)
 			}
 		}
@@ -884,10 +927,8 @@
 	// much more beneficial than having build timestamp in the header.
 	fh.TimeDateStamp = 0
 
-	if ctxt.LinkMode == LinkExternal {
-		fh.Characteristics = pe.IMAGE_FILE_LINE_NUMS_STRIPPED
-	} else {
-		fh.Characteristics = pe.IMAGE_FILE_EXECUTABLE_IMAGE | pe.IMAGE_FILE_DEBUG_STRIPPED
+	if ctxt.LinkMode != LinkExternal {
+		fh.Characteristics = pe.IMAGE_FILE_EXECUTABLE_IMAGE
 		switch ctxt.Arch.Family {
 		case sys.AMD64, sys.I386:
 			if ctxt.BuildMode != BuildModePIE {
@@ -1593,6 +1634,7 @@
 func (ctxt *Link) dope() {
 	initdynimport(ctxt)
 	initdynexport(ctxt)
+	writeSEH(ctxt)
 }
 
 func setpersrc(ctxt *Link, syms []loader.Sym) {
@@ -1687,6 +1729,7 @@
 		pefile.bssSect = b
 	}
 
+	pefile.addSEH(ctxt)
 	pefile.addDWARF()
 
 	if ctxt.LinkMode == LinkExternal {
diff --git a/src/cmd/link/internal/ld/seh.go b/src/cmd/link/internal/ld/seh.go
new file mode 100644
index 0000000..5379528
--- /dev/null
+++ b/src/cmd/link/internal/ld/seh.go
@@ -0,0 +1,66 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package ld
+
+import (
+	"cmd/internal/sys"
+	"cmd/link/internal/loader"
+	"cmd/link/internal/sym"
+)
+
+var sehp struct {
+	pdata loader.Sym
+	xdata loader.Sym
+}
+
+func writeSEH(ctxt *Link) {
+	switch ctxt.Arch.Family {
+	case sys.AMD64:
+		writeSEHAMD64(ctxt)
+	}
+}
+
+func writeSEHAMD64(ctxt *Link) {
+	ldr := ctxt.loader
+	mkSecSym := func(name string, kind sym.SymKind) *loader.SymbolBuilder {
+		s := ldr.CreateSymForUpdate(name, 0)
+		s.SetType(kind)
+		s.SetAlign(4)
+		return s
+	}
+	pdata := mkSecSym(".pdata", sym.SSEHSECT)
+	xdata := mkSecSym(".xdata", sym.SSEHSECT)
+	// The .xdata entries have very low cardinality
+	// as it only contains frame pointer operations,
+	// which are very similar across functions.
+	// These are referenced by .pdata entries using
+	// an RVA, so it is possible, and binary-size wise,
+	// to deduplicate .xdata entries.
+	uwcache := make(map[string]int64) // aux symbol name --> .xdata offset
+	for _, s := range ctxt.Textp {
+		if fi := ldr.FuncInfo(s); !fi.Valid() || fi.TopFrame() {
+			continue
+		}
+		uw := ldr.SEHUnwindSym(s)
+		if uw == 0 {
+			continue
+		}
+		name := ctxt.SymName(uw)
+		off, cached := uwcache[name]
+		if !cached {
+			off = xdata.Size()
+			uwcache[name] = off
+			xdata.AddBytes(ldr.Data(uw))
+		}
+
+		// Reference:
+		// https://learn.microsoft.com/en-us/cpp/build/exception-handling-x64#struct-runtime_function
+		pdata.AddPEImageRelativeAddrPlus(ctxt.Arch, s, 0)
+		pdata.AddPEImageRelativeAddrPlus(ctxt.Arch, s, ldr.SymSize(s))
+		pdata.AddPEImageRelativeAddrPlus(ctxt.Arch, xdata.Sym(), off)
+	}
+	sehp.pdata = pdata.Sym()
+	sehp.xdata = xdata.Sym()
+}
diff --git a/src/cmd/link/internal/ld/stackcheck.go b/src/cmd/link/internal/ld/stackcheck.go
index c82dafe..98e7eda 100644
--- a/src/cmd/link/internal/ld/stackcheck.go
+++ b/src/cmd/link/internal/ld/stackcheck.go
@@ -42,7 +42,7 @@
 
 // stackCheckIndirect is a sentinel Sym value used to represent the
 // target of an indirect/closure call.
-const stackCheckIndirect loader.Sym = -1
+const stackCheckIndirect loader.Sym = ^loader.Sym(0)
 
 // doStackCheck walks the call tree to check that there is always
 // enough stack space for call frames, especially for a chain of
@@ -61,7 +61,7 @@
 	// The call to morestack in every splittable function ensures
 	// that there are at least StackLimit bytes available below SP
 	// when morestack returns.
-	limit := objabi.StackLimit(*flagRace) - sc.callSize
+	limit := objabi.StackNosplit(*flagRace) - sc.callSize
 	if buildcfg.GOARCH == "arm64" {
 		// Need an extra 8 bytes below SP to save FP.
 		limit -= 8
diff --git a/src/cmd/link/internal/ld/sym.go b/src/cmd/link/internal/ld/sym.go
index d51a59e..6ae1106 100644
--- a/src/cmd/link/internal/ld/sym.go
+++ b/src/cmd/link/internal/ld/sym.go
@@ -75,7 +75,7 @@
 	default:
 		log.Fatalf("unknown thread-local storage offset for %v", ctxt.HeadType)
 
-	case objabi.Hplan9, objabi.Hwindows, objabi.Hjs, objabi.Haix:
+	case objabi.Hplan9, objabi.Hwindows, objabi.Hjs, objabi.Hwasip1, objabi.Haix:
 		break
 
 	case objabi.Hlinux,
diff --git a/src/cmd/link/internal/ld/symtab.go b/src/cmd/link/internal/ld/symtab.go
index 21a1466..b039e7d 100644
--- a/src/cmd/link/internal/ld/symtab.go
+++ b/src/cmd/link/internal/ld/symtab.go
@@ -137,14 +137,17 @@
 		// externally linking, I don't think this makes a lot of sense.
 		other = int(elf.STV_HIDDEN)
 	}
-	if ctxt.IsPPC64() && typ == elf.STT_FUNC && ldr.AttrShared(x) && ldr.SymName(x) != "runtime.duffzero" && ldr.SymName(x) != "runtime.duffcopy" {
-		// On ppc64 the top three bits of the st_other field indicate how
-		// many instructions separate the global and local entry points. In
-		// our case it is two instructions, indicated by the value 3.
-		// The conditions here match those in preprocess in
-		// cmd/internal/obj/ppc64/obj9.go, which is where the
-		// instructions are inserted.
-		other |= 3 << 5
+	if ctxt.IsPPC64() && typ == elf.STT_FUNC && ldr.AttrShared(x) {
+		// On ppc64 the top three bits of the st_other field indicate how many
+		// bytes separate the global and local entry points. For non-PCrel shared
+		// symbols this is always 8 bytes except for some special functions.
+		hasPCrel := buildcfg.GOPPC64 >= 10 && buildcfg.GOOS == "linux"
+
+		// This should match the preprocessing behavior in cmd/internal/obj/ppc64/obj9.go
+		// where the distinct global entry is inserted.
+		if !hasPCrel && ldr.SymName(x) != "runtime.duffzero" && ldr.SymName(x) != "runtime.duffcopy" {
+			other |= 3 << 5
+		}
 	}
 
 	// When dynamically linking, we create Symbols by reading the names from
@@ -632,32 +635,44 @@
 	// the definition of moduledata in runtime/symtab.go.
 	// This code uses several global variables that are set by pcln.go:pclntab.
 	moduledata := ldr.MakeSymbolUpdater(ctxt.Moduledata)
+
+	slice := func(sym loader.Sym, len uint64) {
+		moduledata.AddAddr(ctxt.Arch, sym)
+		moduledata.AddUint(ctxt.Arch, len)
+		moduledata.AddUint(ctxt.Arch, len)
+	}
+
+	sliceSym := func(sym loader.Sym) {
+		slice(sym, uint64(ldr.SymSize(sym)))
+	}
+
+	nilSlice := func() {
+		moduledata.AddUint(ctxt.Arch, 0)
+		moduledata.AddUint(ctxt.Arch, 0)
+		moduledata.AddUint(ctxt.Arch, 0)
+	}
+
 	// The pcHeader
 	moduledata.AddAddr(ctxt.Arch, pcln.pcheader)
+
 	// The function name slice
-	moduledata.AddAddr(ctxt.Arch, pcln.funcnametab)
-	moduledata.AddUint(ctxt.Arch, uint64(ldr.SymSize(pcln.funcnametab)))
-	moduledata.AddUint(ctxt.Arch, uint64(ldr.SymSize(pcln.funcnametab)))
+	sliceSym(pcln.funcnametab)
+
 	// The cutab slice
-	moduledata.AddAddr(ctxt.Arch, pcln.cutab)
-	moduledata.AddUint(ctxt.Arch, uint64(ldr.SymSize(pcln.cutab)))
-	moduledata.AddUint(ctxt.Arch, uint64(ldr.SymSize(pcln.cutab)))
+	sliceSym(pcln.cutab)
+
 	// The filetab slice
-	moduledata.AddAddr(ctxt.Arch, pcln.filetab)
-	moduledata.AddUint(ctxt.Arch, uint64(ldr.SymSize(pcln.filetab)))
-	moduledata.AddUint(ctxt.Arch, uint64(ldr.SymSize(pcln.filetab)))
+	sliceSym(pcln.filetab)
+
 	// The pctab slice
-	moduledata.AddAddr(ctxt.Arch, pcln.pctab)
-	moduledata.AddUint(ctxt.Arch, uint64(ldr.SymSize(pcln.pctab)))
-	moduledata.AddUint(ctxt.Arch, uint64(ldr.SymSize(pcln.pctab)))
+	sliceSym(pcln.pctab)
+
 	// The pclntab slice
-	moduledata.AddAddr(ctxt.Arch, pcln.pclntab)
-	moduledata.AddUint(ctxt.Arch, uint64(ldr.SymSize(pcln.pclntab)))
-	moduledata.AddUint(ctxt.Arch, uint64(ldr.SymSize(pcln.pclntab)))
+	slice(pcln.pclntab, uint64(ldr.SymSize(pcln.pclntab)))
+
 	// The ftab slice
-	moduledata.AddAddr(ctxt.Arch, pcln.pclntab)
-	moduledata.AddUint(ctxt.Arch, uint64(pcln.nfunc+1))
-	moduledata.AddUint(ctxt.Arch, uint64(pcln.nfunc+1))
+	slice(pcln.pclntab, uint64(pcln.nfunc+1))
+
 	// findfunctab
 	moduledata.AddAddr(ctxt.Arch, pcln.findfunctab)
 	// minpc, maxpc
@@ -708,22 +723,18 @@
 	}
 
 	// text section information
-	moduledata.AddAddr(ctxt.Arch, textsectionmapSym)
-	moduledata.AddUint(ctxt.Arch, uint64(nsections))
-	moduledata.AddUint(ctxt.Arch, uint64(nsections))
+	slice(textsectionmapSym, uint64(nsections))
 
 	// The typelinks slice
 	typelinkSym := ldr.Lookup("runtime.typelink", 0)
 	ntypelinks := uint64(ldr.SymSize(typelinkSym)) / 4
-	moduledata.AddAddr(ctxt.Arch, typelinkSym)
-	moduledata.AddUint(ctxt.Arch, ntypelinks)
-	moduledata.AddUint(ctxt.Arch, ntypelinks)
+	slice(typelinkSym, ntypelinks)
+
 	// The itablinks slice
 	itablinkSym := ldr.Lookup("runtime.itablink", 0)
 	nitablinks := uint64(ldr.SymSize(itablinkSym)) / uint64(ctxt.Arch.PtrSize)
-	moduledata.AddAddr(ctxt.Arch, itablinkSym)
-	moduledata.AddUint(ctxt.Arch, nitablinks)
-	moduledata.AddUint(ctxt.Arch, nitablinks)
+	slice(itablinkSym, nitablinks)
+
 	// The ptab slice
 	if ptab := ldr.Lookup("go:plugin.tabs", 0); ptab != 0 && ldr.AttrReachable(ptab) {
 		ldr.SetAttrLocal(ptab, true)
@@ -731,14 +742,11 @@
 			panic(fmt.Sprintf("go:plugin.tabs is %v, not SRODATA", ldr.SymType(ptab)))
 		}
 		nentries := uint64(len(ldr.Data(ptab)) / 8) // sizeof(nameOff) + sizeof(typeOff)
-		moduledata.AddAddr(ctxt.Arch, ptab)
-		moduledata.AddUint(ctxt.Arch, nentries)
-		moduledata.AddUint(ctxt.Arch, nentries)
+		slice(ptab, nentries)
 	} else {
-		moduledata.AddUint(ctxt.Arch, 0)
-		moduledata.AddUint(ctxt.Arch, 0)
-		moduledata.AddUint(ctxt.Arch, 0)
+		nilSlice()
 	}
+
 	if ctxt.BuildMode == BuildModePlugin {
 		addgostring(ctxt, ldr, moduledata, "go:link.thispluginpath", objabi.PathToPrefix(*flagPluginPath))
 
@@ -755,16 +763,28 @@
 			hash := ldr.Lookup("go:link.pkghash."+l.Pkg, 0)
 			pkghashes.AddAddr(ctxt.Arch, hash)
 		}
-		moduledata.AddAddr(ctxt.Arch, pkghashes.Sym())
-		moduledata.AddUint(ctxt.Arch, uint64(len(ctxt.Library)))
-		moduledata.AddUint(ctxt.Arch, uint64(len(ctxt.Library)))
+		slice(pkghashes.Sym(), uint64(len(ctxt.Library)))
 	} else {
 		moduledata.AddUint(ctxt.Arch, 0) // pluginpath
 		moduledata.AddUint(ctxt.Arch, 0)
-		moduledata.AddUint(ctxt.Arch, 0) // pkghashes slice
+		nilSlice() // pkghashes slice
+	}
+	// Add inittasks slice
+	t := ctxt.mainInittasks
+	if t != 0 {
+		moduledata.AddAddr(ctxt.Arch, t)
+		moduledata.AddUint(ctxt.Arch, uint64(ldr.SymSize(t)/int64(ctxt.Arch.PtrSize)))
+		moduledata.AddUint(ctxt.Arch, uint64(ldr.SymSize(t)/int64(ctxt.Arch.PtrSize)))
+	} else {
+		// Some build modes have no inittasks, like a shared library.
+		// Its inittask list will be constructed by a higher-level
+		// linking step.
+		// This branch can also happen if there are no init tasks at all.
+		moduledata.AddUint(ctxt.Arch, 0)
 		moduledata.AddUint(ctxt.Arch, 0)
 		moduledata.AddUint(ctxt.Arch, 0)
 	}
+
 	if len(ctxt.Shlibs) > 0 {
 		thismodulename := filepath.Base(*flagOutfile)
 		switch ctxt.BuildMode {
@@ -793,15 +813,11 @@
 			modulehashes.AddAddr(ctxt.Arch, abihash)
 		}
 
-		moduledata.AddAddr(ctxt.Arch, modulehashes.Sym())
-		moduledata.AddUint(ctxt.Arch, uint64(len(ctxt.Shlibs)))
-		moduledata.AddUint(ctxt.Arch, uint64(len(ctxt.Shlibs)))
+		slice(modulehashes.Sym(), uint64(len(ctxt.Shlibs)))
 	} else {
 		moduledata.AddUint(ctxt.Arch, 0) // modulename
 		moduledata.AddUint(ctxt.Arch, 0)
-		moduledata.AddUint(ctxt.Arch, 0) // moduleshashes slice
-		moduledata.AddUint(ctxt.Arch, 0)
-		moduledata.AddUint(ctxt.Arch, 0)
+		nilSlice() // moduleshashes slice
 	}
 
 	hasmain := ctxt.BuildMode == BuildModeExe || ctxt.BuildMode == BuildModePIE
diff --git a/src/cmd/link/internal/ld/testdata/deadcode/globalmap.go b/src/cmd/link/internal/ld/testdata/deadcode/globalmap.go
new file mode 100644
index 0000000..35672fe
--- /dev/null
+++ b/src/cmd/link/internal/ld/testdata/deadcode/globalmap.go
@@ -0,0 +1,26 @@
+package main
+
+import "os"
+
+// Too small to trigger deadcode (currently)
+var small = map[string]int{"foo": 1}
+
+// Has side effects, which prevent deadcode
+var effect = map[string]int{"foo": os.Getpid()}
+
+// Large and side-effect free
+var large = map[string]int{
+	"11": 1, "12": 2, "13": 3, "14": 4, "15": 5, "16": 6, "17": 7, "18": 8, "19": 9, "110": 10,
+	"21": 1, "22": 2, "23": 3, "24": 4, "25": 5, "26": 6, "27": 7, "28": 8, "29": 9, "210": 10,
+	"31": 1, "32": 2, "33": 3, "34": 4, "35": 5, "36": 6, "37": 7, "38": 8, "39": 9, "310": 10,
+	"41": 1, "42": 2, "43": 3, "44": 4, "45": 5, "46": 6, "47": 7, "48": 8, "49": 9, "410": 10,
+	"51": 1, "52": 2, "53": 3, "54": 4, "55": 5, "56": 6, "57": 7, "58": 8, "59": 9, "510": 10,
+	"61": 1, "62": 2, "63": 3, "64": 4, "65": 5, "66": 6, "67": 7, "68": 8, "69": 9, "610": 10,
+	"71": 1, "72": 2, "73": 3, "74": 4, "75": 5, "76": 6, "77": 7, "78": 8, "79": 9, "710": 10,
+	"81": 1, "82": 2, "83": 3, "84": 4, "85": 5, "86": 6, "87": 7, "88": 8, "89": 9, "810": 10,
+	"91": 1, "92": 2, "93": 3, "94": 4, "95": 5, "96": 6, "97": 7, "98": 8, "99": 9, "910": 10,
+	"101": 1, "102": 2, "103": 3, "104": 4, "105": 5, "106": 6, "107": 7, "108": 8, "109": 9, "1010": 10, "1021": 2,
+}
+
+func main() {
+}
diff --git a/src/cmd/link/internal/ld/testdata/issue38192/oneline.s b/src/cmd/link/internal/ld/testdata/issue38192/oneline.s
index f5290d7..d059e71 100644
--- a/src/cmd/link/internal/ld/testdata/issue38192/oneline.s
+++ b/src/cmd/link/internal/ld/testdata/issue38192/oneline.s
@@ -5,4 +5,4 @@
 #include "textflag.h"
 
 TEXT ·singleInstruction(SB),NOSPLIT,$0
-        RET
+	RET
diff --git a/src/cmd/link/internal/ld/testdata/stackcheck/main.s b/src/cmd/link/internal/ld/testdata/stackcheck/main.s
index 10f6a3f..623fdda 100644
--- a/src/cmd/link/internal/ld/testdata/stackcheck/main.s
+++ b/src/cmd/link/internal/ld/testdata/stackcheck/main.s
@@ -3,6 +3,7 @@
 // license that can be found in the LICENSE file.
 
 #define NOSPLIT 7
+#define NOFRAME 512
 
 TEXT ·asmMain(SB),0,$0-0
 	CALL ·startSelf(SB)
@@ -32,9 +33,9 @@
 	RET
 
 // Test reporting of rootless recursion
-TEXT ·startRec(SB),NOSPLIT,$0-0
+TEXT ·startRec(SB),NOSPLIT|NOFRAME,$0-0
 	CALL ·startRec0(SB)
 	RET
-TEXT ·startRec0(SB),NOSPLIT,$0-0
+TEXT ·startRec0(SB),NOSPLIT|NOFRAME,$0-0
 	CALL ·startRec(SB)
 	RET
diff --git a/src/cmd/link/internal/ld/util.go b/src/cmd/link/internal/ld/util.go
index 779f498..63b7e0d 100644
--- a/src/cmd/link/internal/ld/util.go
+++ b/src/cmd/link/internal/ld/util.go
@@ -35,6 +35,9 @@
 func Exitf(format string, a ...interface{}) {
 	fmt.Fprintf(os.Stderr, os.Args[0]+": "+format+"\n", a...)
 	nerrors++
+	if *flagH {
+		panic("error")
+	}
 	Exit(2)
 }
 
diff --git a/src/cmd/link/internal/ld/xcoff.go b/src/cmd/link/internal/ld/xcoff.go
index 1265c45..158a86f 100644
--- a/src/cmd/link/internal/ld/xcoff.go
+++ b/src/cmd/link/internal/ld/xcoff.go
@@ -38,7 +38,7 @@
 	// XCOFF binaries should normally have all its sections position-independent.
 	// However, this is not yet possible for .text because of some R_ADDR relocations
 	// inside RODATA symbols.
-	// .data and .bss are position-independent so their address start inside a unreachable
+	// .data and .bss are position-independent so their address start inside an unreachable
 	// segment during execution to force segfault if something is wrong.
 	XCOFFTEXTBASE = 0x100000000 // Start of text address
 	XCOFFDATABASE = 0x200000000 // Start of data address
@@ -875,7 +875,7 @@
 // put function used by genasmsym to write symbol table.
 func putaixsym(ctxt *Link, x loader.Sym, t SymbolType) {
 	// All XCOFF symbols generated by this GO symbols
-	// Can be a symbol entry or a auxiliary entry
+	// Can be a symbol entry or an auxiliary entry
 	syms := []xcoffSym{}
 
 	ldr := ctxt.loader
@@ -1093,11 +1093,6 @@
 	}
 
 	shouldBeInSymbolTable := func(s loader.Sym, name string) bool {
-		if name == ".go.buildinfo" {
-			// On AIX, .go.buildinfo must be in the symbol table as
-			// it has relocations.
-			return true
-		}
 		if ldr.AttrNotInSymbolTable(s) {
 			return false
 		}
@@ -1334,7 +1329,7 @@
 			}
 
 			if ldr.SymType(s) == sym.STEXT {
-				// On AIX, a exported function must have two symbols:
+				// On AIX, an exported function must have two symbols:
 				// - a .text symbol which must start with a ".".
 				// - a .data symbol which is a function descriptor.
 				name := ldr.SymExtname(s)
diff --git a/src/cmd/link/internal/loadelf/ldelf.go b/src/cmd/link/internal/loadelf/ldelf.go
index 7ac7699..942d54c 100644
--- a/src/cmd/link/internal/loadelf/ldelf.go
+++ b/src/cmd/link/internal/loadelf/ldelf.go
@@ -540,6 +540,7 @@
 		}
 		if sect.type_ == elf.SHT_PROGBITS {
 			sb.SetData(sect.base[:sect.size])
+			sb.SetExternal(true)
 		}
 
 		sb.SetSize(int64(sect.size))
@@ -638,11 +639,15 @@
 			case 0:
 				// No local entry. R2 is preserved.
 			case 1:
-				// These require R2 be saved and restored by the caller. This isn't supported today.
-				return errorf("%s: unable to handle local entry type 1", sb.Name())
+				// This is kind of a hack, but pass the hint about this symbol's
+				// usage of R2 (R2 is a caller-save register not a TOC pointer, and
+				// this function does not have a distinct local entry) by setting
+				// its SymLocalentry to 1.
+				l.SetSymLocalentry(s, 1)
 			case 7:
 				return errorf("%s: invalid sym.other 0x%x", sb.Name(), elfsym.other)
 			default:
+				// Convert the word sized offset into bytes.
 				l.SetSymLocalentry(s, 4<<uint(flag-2))
 			}
 		}
@@ -1060,6 +1065,8 @@
 		I386 | uint32(elf.R_386_GOTPC)<<16,
 		I386 | uint32(elf.R_386_GOT32X)<<16,
 		PPC64 | uint32(elf.R_PPC64_REL24)<<16,
+		PPC64 | uint32(elf.R_PPC64_REL24_NOTOC)<<16,
+		PPC64 | uint32(elf.R_PPC64_REL24_P9NOTOC)<<16,
 		PPC64 | uint32(elf.R_PPC_REL32)<<16,
 		S390X | uint32(elf.R_390_32)<<16,
 		S390X | uint32(elf.R_390_PC32)<<16,
@@ -1076,6 +1083,9 @@
 		ARM64 | uint32(elf.R_AARCH64_ABS64)<<16,
 		ARM64 | uint32(elf.R_AARCH64_PREL64)<<16,
 		PPC64 | uint32(elf.R_PPC64_ADDR64)<<16,
+		PPC64 | uint32(elf.R_PPC64_PCREL34)<<16,
+		PPC64 | uint32(elf.R_PPC64_GOT_PCREL34)<<16,
+		PPC64 | uint32(elf.R_PPC64_PLT_PCREL34_NOTOC)<<16,
 		S390X | uint32(elf.R_390_GLOB_DAT)<<16,
 		S390X | uint32(elf.R_390_RELATIVE)<<16,
 		S390X | uint32(elf.R_390_GOTOFF)<<16,
diff --git a/src/cmd/link/internal/loader/loader.go b/src/cmd/link/internal/loader/loader.go
index 8e1575a..4d0b497 100644
--- a/src/cmd/link/internal/loader/loader.go
+++ b/src/cmd/link/internal/loader/loader.go
@@ -14,6 +14,7 @@
 	"cmd/link/internal/sym"
 	"debug/elf"
 	"fmt"
+	"internal/abi"
 	"io"
 	"log"
 	"math/bits"
@@ -26,7 +27,7 @@
 
 // Sym encapsulates a global symbol index, used to identify a specific
 // Go symbol. The 0-valued Sym is corresponds to an invalid symbol.
-type Sym int
+type Sym uint32
 
 // Relocs encapsulates the set of relocations on a given symbol; an
 // instance of this type is returned by the Loader Relocs() method.
@@ -219,23 +220,19 @@
 	attrLocal            Bitmap // "local" symbols, indexed by global index
 	attrNotInSymbolTable Bitmap // "not in symtab" symbols, indexed by global idx
 	attrUsedInIface      Bitmap // "used in interface" symbols, indexed by global idx
+	attrSpecial          Bitmap // "special" frame symbols, indexed by global idx
 	attrVisibilityHidden Bitmap // hidden symbols, indexed by ext sym index
 	attrDuplicateOK      Bitmap // dupOK symbols, indexed by ext sym index
 	attrShared           Bitmap // shared symbols, indexed by ext sym index
 	attrExternal         Bitmap // external symbols, indexed by ext sym index
+	generatedSyms        Bitmap // symbols that generate their content, indexed by ext sym idx
 
 	attrReadOnly         map[Sym]bool     // readonly data for this sym
-	attrSpecial          map[Sym]struct{} // "special" frame symbols
 	attrCgoExportDynamic map[Sym]struct{} // "cgo_export_dynamic" symbols
 	attrCgoExportStatic  map[Sym]struct{} // "cgo_export_static" symbols
-	generatedSyms        map[Sym]struct{} // symbols that generate their content
 
 	// Outer and Sub relations for symbols.
-	// TODO: figure out whether it's more efficient to just have these
-	// as fields on extSymPayload (note that this won't be a viable
-	// strategy if somewhere in the linker we set sub/outer for a
-	// non-external sym).
-	outer map[Sym]Sym
+	outer []Sym // indexed by global index
 	sub   map[Sym]Sym
 
 	dynimplib   map[Sym]string      // stores Dynimplib symbol attribute
@@ -264,8 +261,6 @@
 
 	strictDupMsgs int // number of strict-dup warning/errors, when FlagStrictDups is enabled
 
-	elfsetstring elfsetstringFunc
-
 	errorReporter *ErrorReporter
 
 	npkgsyms    int // number of package symbols, for accounting
@@ -287,8 +282,6 @@
 	goObjStart
 )
 
-type elfsetstringFunc func(str string, off int)
-
 // extSymPayload holds the payload (data + relocations) for linker-synthesized
 // external symbols (note that symbol value is stored in a separate slice).
 type extSymPayload struct {
@@ -307,7 +300,7 @@
 	FlagStrictDups = 1 << iota
 )
 
-func NewLoader(flags uint32, elfsetstring elfsetstringFunc, reporter *ErrorReporter) *Loader {
+func NewLoader(flags uint32, reporter *ErrorReporter) *Loader {
 	nbuiltin := goobj.NBuiltin()
 	extReader := &oReader{objidx: extObj}
 	ldr := &Loader{
@@ -317,7 +310,6 @@
 		extReader:            extReader,
 		symsByName:           [2]map[string]Sym{make(map[string]Sym, 80000), make(map[string]Sym, 50000)}, // preallocate ~2MB for ABI0 and ~1MB for ABI1 symbols
 		objByPkg:             make(map[string]uint32),
-		outer:                make(map[Sym]Sym),
 		sub:                  make(map[Sym]Sym),
 		dynimplib:            make(map[Sym]string),
 		dynimpvers:           make(map[Sym]string),
@@ -331,15 +323,12 @@
 		plt:                  make(map[Sym]int32),
 		got:                  make(map[Sym]int32),
 		dynid:                make(map[Sym]int32),
-		attrSpecial:          make(map[Sym]struct{}),
 		attrCgoExportDynamic: make(map[Sym]struct{}),
 		attrCgoExportStatic:  make(map[Sym]struct{}),
-		generatedSyms:        make(map[Sym]struct{}),
 		deferReturnTramp:     make(map[Sym]bool),
 		extStaticSyms:        make(map[nameVer]Sym),
 		builtinSyms:          make([]Sym, nbuiltin),
 		flags:                flags,
-		elfsetstring:         elfsetstring,
 		errorReporter:        reporter,
 		sects:                []*sym.Section{nil}, // reserve index 0 for nil section
 	}
@@ -370,6 +359,9 @@
 		panic("addSym called after external symbol is created")
 	}
 	i := Sym(len(l.objSyms))
+	if int(i) != len(l.objSyms) { // overflow
+		panic("too many symbols")
+	}
 	addToGlobal := func() {
 		l.objSyms = append(l.objSyms, objSym{r.objidx, li})
 	}
@@ -491,10 +483,14 @@
 // name/version.
 func (l *Loader) newExtSym(name string, ver int) Sym {
 	i := Sym(len(l.objSyms))
+	if int(i) != len(l.objSyms) { // overflow
+		panic("too many symbols")
+	}
 	if l.extStart == 0 {
 		l.extStart = i
 	}
 	l.growValues(int(i) + 1)
+	l.growOuter(int(i) + 1)
 	l.growAttrBitmaps(int(i) + 1)
 	pi := l.newPayload(name, ver)
 	l.objSyms = append(l.objSyms, objSym{l.extReader.objidx, uint32(pi)})
@@ -1009,17 +1005,16 @@
 // address (i.e. Value) computed by the usual mechanism of
 // data.go:dodata() & data.go:address().
 func (l *Loader) AttrSpecial(i Sym) bool {
-	_, ok := l.attrSpecial[i]
-	return ok
+	return l.attrSpecial.Has(i)
 }
 
 // SetAttrSpecial sets the "special" property for a symbol (see
 // AttrSpecial).
 func (l *Loader) SetAttrSpecial(i Sym, v bool) {
 	if v {
-		l.attrSpecial[i] = struct{}{}
+		l.attrSpecial.Set(i)
 	} else {
-		delete(l.attrSpecial, i)
+		l.attrSpecial.Unset(i)
 	}
 }
 
@@ -1041,6 +1036,14 @@
 	}
 }
 
+// ForAllCgoExportDynamic calls f for every symbol that has been
+// marked with the "cgo_export_dynamic" compiler directive.
+func (l *Loader) ForAllCgoExportDynamic(f func(Sym)) {
+	for s := range l.attrCgoExportDynamic {
+		f(s)
+	}
+}
+
 // AttrCgoExportStatic returns true for a symbol that has been
 // specially marked via the "cgo_export_static" directive
 // written by cgo.
@@ -1063,8 +1066,10 @@
 // generator symbol through the SetIsGeneratedSym. The functions for generator
 // symbols are kept in the Link context.
 func (l *Loader) IsGeneratedSym(i Sym) bool {
-	_, ok := l.generatedSyms[i]
-	return ok
+	if !l.IsExternal(i) {
+		return false
+	}
+	return l.generatedSyms.Has(l.extIndex(i))
 }
 
 // SetIsGeneratedSym marks symbols as generated symbols. Data shouldn't be
@@ -1075,9 +1080,9 @@
 		panic("only external symbols can be generated")
 	}
 	if v {
-		l.generatedSyms[i] = struct{}{}
+		l.generatedSyms.Set(l.extIndex(i))
 	} else {
-		delete(l.generatedSyms, i)
+		l.generatedSyms.Unset(l.extIndex(i))
 	}
 }
 
@@ -1121,7 +1126,7 @@
 //
 // - Outer symbol covers the address ranges of its sub-symbols.
 //   Outer.Sub is set in this case.
-// - Outer symbol doesn't conver the address ranges. It is zero-sized
+// - Outer symbol doesn't cover the address ranges. It is zero-sized
 //   and doesn't have sub-symbols. In the case, the inner symbol is
 //   not actually a "SubSymbol". (Tricky!)
 //
@@ -1182,6 +1187,15 @@
 	return r.Sym(li).IsDict()
 }
 
+// Returns whether this symbol is a compiler-generated package init func.
+func (l *Loader) IsPkgInit(i Sym) bool {
+	if l.IsExternal(i) {
+		return false
+	}
+	r, li := l.toLocal(i)
+	return r.Sym(li).IsPkgInit()
+}
+
 // Return whether this is a trampoline of a deferreturn call.
 func (l *Loader) IsDeferReturnTramp(i Sym) bool {
 	return l.deferReturnTramp[i]
@@ -1228,6 +1242,16 @@
 	return r.Data(li)
 }
 
+// Returns the symbol content of the i-th symbol as a string. i is global index.
+func (l *Loader) DataString(i Sym) string {
+	if l.IsExternal(i) {
+		pp := l.getPayload(i)
+		return string(pp.data)
+	}
+	r, li := l.toLocal(i)
+	return r.DataString(li)
+}
+
 // FreeData clears the symbol data of an external symbol, allowing the memory
 // to be freed earlier. No-op for non-external symbols.
 // i is global index.
@@ -1273,7 +1297,7 @@
 	l.align[i] = uint8(bits.Len32(uint32(align)))
 }
 
-// SymValue returns the section of the i-th symbol. i is global index.
+// SymSect returns the section of the i-th symbol. i is global index.
 func (l *Loader) SymSect(i Sym) *sym.Section {
 	if int(i) >= len(l.symSects) {
 		// symSects is extended lazily -- it the sym in question is
@@ -1312,7 +1336,7 @@
 	return sect
 }
 
-// SymDynImplib returns the "dynimplib" attribute for the specified
+// SymDynimplib returns the "dynimplib" attribute for the specified
 // symbol, making up a portion of the info for a symbol specified
 // on a "cgo_import_dynamic" compiler directive.
 func (l *Loader) SymDynimplib(i Sym) string {
@@ -1495,7 +1519,7 @@
 	}
 }
 
-// DynIdSyms returns the set of symbols for which dynID is set to an
+// DynidSyms returns the set of symbols for which dynID is set to an
 // interesting (non-default) value. This is expected to be a fairly
 // small set.
 func (l *Loader) DynidSyms() []Sym {
@@ -1563,6 +1587,9 @@
 }
 
 // SymLocalentry returns an offset in bytes of the "local entry" of a symbol.
+//
+// On PPC64, a value of 1 indicates the symbol does not use or preserve a TOC
+// pointer in R2, nor does it have a distinct local entry.
 func (l *Loader) SymLocalentry(i Sym) uint8 {
 	return l.localentry[i]
 }
@@ -1601,6 +1628,39 @@
 	return Aux{r.Aux(li, j), r, l}
 }
 
+// WasmImportSym returns the auxiliary WebAssembly import symbol associated with
+// a given function symbol. The aux sym only exists for Go function stubs that
+// have been annotated with the //go:wasmimport directive.  The aux sym
+// contains the information necessary for the linker to add a WebAssembly
+// import statement.
+// (https://webassembly.github.io/spec/core/syntax/modules.html#imports)
+func (l *Loader) WasmImportSym(fnSymIdx Sym) (Sym, bool) {
+	if l.SymType(fnSymIdx) != sym.STEXT {
+		log.Fatalf("error: non-function sym %d/%s t=%s passed to WasmImportSym", fnSymIdx, l.SymName(fnSymIdx), l.SymType(fnSymIdx).String())
+	}
+	r, li := l.toLocal(fnSymIdx)
+	auxs := r.Auxs(li)
+	for i := range auxs {
+		a := &auxs[i]
+		switch a.Type() {
+		case goobj.AuxWasmImport:
+			return l.resolve(r, a.Sym()), true
+		}
+	}
+
+	return 0, false
+}
+
+// SEHUnwindSym returns the auxiliary SEH unwind symbol associated with
+// a given function symbol.
+func (l *Loader) SEHUnwindSym(fnSymIdx Sym) Sym {
+	if l.SymType(fnSymIdx) != sym.STEXT {
+		log.Fatalf("error: non-function sym %d/%s t=%s passed to SEHUnwindSym", fnSymIdx, l.SymName(fnSymIdx), l.SymType(fnSymIdx).String())
+	}
+
+	return l.aux1(fnSymIdx, goobj.AuxSehUnwindInfo)
+}
+
 // GetFuncDwarfAuxSyms collects and returns the auxiliary DWARF
 // symbols associated with a given function symbol.  Prior to the
 // introduction of the loader, this was done purely using name
@@ -1640,6 +1700,15 @@
 	return
 }
 
+func (l *Loader) GetVarDwarfAuxSym(i Sym) Sym {
+	aux := l.aux1(i, goobj.AuxDwarfInfo)
+	if aux != 0 && l.SymType(aux) != sym.SDWARFVAR {
+		fmt.Println(l.SymName(i), l.SymType(i), l.SymType(aux), sym.SDWARFVAR)
+		panic("aux dwarf info sym with wrong type")
+	}
+	return aux
+}
+
 // AddInteriorSym sets up 'interior' as an interior symbol of
 // container/payload symbol 'container'. An interior symbol does not
 // itself have data, but gives a name to a subrange of the data in its
@@ -1689,19 +1758,24 @@
 	l.outer[interior] = container
 }
 
-// OuterSym gets the outer symbol for host object loaded symbols.
+// OuterSym gets the outer/container symbol.
 func (l *Loader) OuterSym(i Sym) Sym {
-	// FIXME: add check for isExternal?
 	return l.outer[i]
 }
 
 // SubSym gets the subsymbol for host object loaded symbols.
 func (l *Loader) SubSym(i Sym) Sym {
-	// NB: note -- no check for l.isExternal(), since I am pretty sure
-	// that later phases in the linker set subsym for "type:" syms
 	return l.sub[i]
 }
 
+// growOuter grows the slice used to store outer symbol.
+func (l *Loader) growOuter(reqLen int) {
+	curLen := len(l.outer)
+	if reqLen > curLen {
+		l.outer = append(l.outer, make([]Sym, reqLen-curLen)...)
+	}
+}
+
 // SetCarrierSym declares that 'c' is the carrier or container symbol
 // for 's'. Carrier symbols are used in the linker to as a container
 // for a collection of sub-symbols where the content of the
@@ -1794,6 +1868,7 @@
 		l.attrLocal = growBitmap(reqLen, l.attrLocal)
 		l.attrNotInSymbolTable = growBitmap(reqLen, l.attrNotInSymbolTable)
 		l.attrUsedInIface = growBitmap(reqLen, l.attrUsedInIface)
+		l.attrSpecial = growBitmap(reqLen, l.attrSpecial)
 	}
 	l.growExtAttrBitmaps()
 }
@@ -1806,6 +1881,7 @@
 		l.attrDuplicateOK = growBitmap(extReqLen, l.attrDuplicateOK)
 		l.attrShared = growBitmap(extReqLen, l.attrShared)
 		l.attrExternal = growBitmap(extReqLen, l.attrExternal)
+		l.generatedSyms = growBitmap(extReqLen, l.generatedSyms)
 	}
 }
 
@@ -1828,7 +1904,7 @@
 	return l.relocs(r, li)
 }
 
-// Relocs returns a Relocs object given a local sym index and reader.
+// relocs returns a Relocs object given a local sym index and reader.
 func (l *Loader) relocs(r *oReader, li uint32) Relocs {
 	var rs []goobj.Reloc
 	if l.isExtReader(r) {
@@ -1950,11 +2026,11 @@
 	return int((*goobj.FuncInfo)(nil).ReadLocals(fi.data))
 }
 
-func (fi *FuncInfo) FuncID() objabi.FuncID {
+func (fi *FuncInfo) FuncID() abi.FuncID {
 	return (*goobj.FuncInfo)(nil).ReadFuncID(fi.data)
 }
 
-func (fi *FuncInfo) FuncFlag() objabi.FuncFlag {
+func (fi *FuncInfo) FuncFlag() abi.FuncFlag {
 	return (*goobj.FuncInfo)(nil).ReadFuncFlag(fi.data)
 }
 
@@ -1986,7 +2062,7 @@
 // is an entry point, meaning that unwinders should stop when they hit
 // this function.
 func (fi *FuncInfo) TopFrame() bool {
-	return (fi.FuncFlag() & objabi.FuncFlag_TOPFRAME) != 0
+	return (fi.FuncFlag() & abi.FuncFlagTopFrame) != 0
 }
 
 type InlTreeNode struct {
@@ -2178,6 +2254,7 @@
 		loadObjRefs(l, o.r, arch)
 	}
 	l.values = make([]int64, l.NSym(), l.NSym()+1000) // +1000 make some room for external symbols
+	l.outer = make([]Sym, l.NSym(), l.NSym()+1000)
 }
 
 func loadObjRefs(l *Loader, r *oReader, arch *sys.Arch) {
diff --git a/src/cmd/link/internal/loader/loader_test.go b/src/cmd/link/internal/loader/loader_test.go
index 7d1031e..32ff258 100644
--- a/src/cmd/link/internal/loader/loader_test.go
+++ b/src/cmd/link/internal/loader/loader_test.go
@@ -26,9 +26,8 @@
 }
 
 func mkLoader() *Loader {
-	edummy := func(str string, off int) {}
 	er := ErrorReporter{}
-	ldr := NewLoader(0, edummy, &er)
+	ldr := NewLoader(0, &er)
 	er.ldr = ldr
 	return ldr
 }
@@ -338,6 +337,17 @@
 			expKind: sym.SDATA,
 			expRel:  []Reloc{mkReloc(ldr, objabi.R_ADDRCUOFF, 0, 8, 7, 8)},
 		},
+		{
+			which: "AddPEImageRelativeAddrPlus",
+			addDataFunc: func(l *Loader, s Sym, s2 Sym) Sym {
+				sb := l.MakeSymbolUpdater(s)
+				sb.AddPEImageRelativeAddrPlus(arch, s2, 3)
+				return s
+			},
+			expData: []byte{0, 0, 0, 0},
+			expKind: sym.SDATA,
+			expRel:  []Reloc{mkReloc(ldr, objabi.R_PEIMAGEOFF, 0, 4, 3, 9)},
+		},
 	}
 
 	var pmi Sym
diff --git a/src/cmd/link/internal/loader/symbolbuilder.go b/src/cmd/link/internal/loader/symbolbuilder.go
index 558c0a7..5a3e88b 100644
--- a/src/cmd/link/internal/loader/symbolbuilder.go
+++ b/src/cmd/link/internal/loader/symbolbuilder.go
@@ -332,10 +332,6 @@
 		sb.kind = sym.SNOPTRDATA
 	}
 	r := sb.size
-	if sb.name == ".shstrtab" {
-		// FIXME: find a better mechanism for this
-		sb.l.elfsetstring(str, int(r))
-	}
 	sb.data = append(sb.data, str...)
 	sb.data = append(sb.data, 0)
 	sb.size = int64(len(sb.data))
@@ -387,6 +383,10 @@
 	return sb.AddAddrPlus(arch, tgt, 0)
 }
 
+func (sb *SymbolBuilder) AddPEImageRelativeAddrPlus(arch *sys.Arch, tgt Sym, add int64) int64 {
+	return sb.addSymRef(tgt, add, objabi.R_PEIMAGEOFF, 4)
+}
+
 func (sb *SymbolBuilder) AddPCRelPlus(arch *sys.Arch, tgt Sym, add int64) int64 {
 	return sb.addSymRef(tgt, add, objabi.R_PCREL, 4)
 }
diff --git a/src/cmd/link/internal/loadpe/ldpe.go b/src/cmd/link/internal/loadpe/ldpe.go
index 0d33823..81c2841 100644
--- a/src/cmd/link/internal/loadpe/ldpe.go
+++ b/src/cmd/link/internal/loadpe/ldpe.go
@@ -21,7 +21,6 @@
 )
 
 const (
-	// TODO: the Microsoft doco says IMAGE_SYM_DTYPE_ARRAY is 3 (same with IMAGE_SYM_DTYPE_POINTER and IMAGE_SYM_DTYPE_FUNCTION)
 	IMAGE_SYM_UNDEFINED              = 0
 	IMAGE_SYM_ABSOLUTE               = -1
 	IMAGE_SYM_DEBUG                  = -2
@@ -43,9 +42,9 @@
 	IMAGE_SYM_TYPE_DWORD             = 15
 	IMAGE_SYM_TYPE_PCODE             = 32768
 	IMAGE_SYM_DTYPE_NULL             = 0
-	IMAGE_SYM_DTYPE_POINTER          = 0x10
-	IMAGE_SYM_DTYPE_FUNCTION         = 0x20
-	IMAGE_SYM_DTYPE_ARRAY            = 0x30
+	IMAGE_SYM_DTYPE_POINTER          = 1
+	IMAGE_SYM_DTYPE_FUNCTION         = 2
+	IMAGE_SYM_DTYPE_ARRAY            = 3
 	IMAGE_SYM_CLASS_END_OF_FUNCTION  = -1
 	IMAGE_SYM_CLASS_NULL             = 0
 	IMAGE_SYM_CLASS_AUTOMATIC        = 1
@@ -142,7 +141,7 @@
 	// a jump to the loaded value.
 	CreateImportStubPltToken = -2
 
-	// When stored into the GOT value for a import symbol __imp_X this
+	// When stored into the GOT value for an import symbol __imp_X this
 	// token tells windynrelocsym to redirect references to the
 	// underlying DYNIMPORT symbol X.
 	RedirectToDynImportGotToken = -2
@@ -223,7 +222,7 @@
 var comdatDefinitions = make(map[string]int64)
 
 // Load loads the PE file pn from input.
-// Symbols from the object file are created via the loader 'l', and
+// Symbols from the object file are created via the loader 'l',
 // and a slice of the text symbols is returned.
 // If an .rsrc section or set of .rsrc$xx sections is found, its symbols are
 // returned as rsrc.
@@ -673,7 +672,10 @@
 
 	var s loader.Sym
 	var bld *loader.SymbolBuilder
-	switch pesym.Type {
+	// Microsoft's PE documentation is contradictory. It says that the symbol's complex type
+	// is stored in the pesym.Type most significant byte, but MSVC, LLVM, and mingw store it
+	// in the 4 high bits of the less significant byte.
+	switch uint8(pesym.Type&0xf0) >> 4 {
 	default:
 		return nil, 0, fmt.Errorf("%s: invalid symbol type %d", symname, pesym.Type)
 
diff --git a/src/cmd/link/internal/loong64/asm.go b/src/cmd/link/internal/loong64/asm.go
index 0eb3a81..8f06068 100644
--- a/src/cmd/link/internal/loong64/asm.go
+++ b/src/cmd/link/internal/loong64/asm.go
@@ -46,100 +46,38 @@
 		}
 	case objabi.R_ADDRLOONG64TLS:
 		out.Write64(uint64(sectoff))
-		out.Write64(uint64(elf.R_LARCH_SOP_PUSH_TLS_TPREL) | uint64(elfsym)<<32)
+		out.Write64(uint64(elf.R_LARCH_TLS_LE_LO12) | uint64(elfsym)<<32)
 		out.Write64(uint64(r.Xadd))
 
-		out.Write64(uint64(sectoff))
-		out.Write64(uint64(elf.R_LARCH_SOP_PUSH_ABSOLUTE))
-		out.Write64(uint64(0xfff))
-
-		out.Write64(uint64(sectoff))
-		out.Write64(uint64(elf.R_LARCH_SOP_AND))
-		out.Write64(uint64(0x0))
-
-		out.Write64(uint64(sectoff))
-		out.Write64(uint64(elf.R_LARCH_SOP_POP_32_U_10_12))
-		out.Write64(uint64(0x0))
-
 	case objabi.R_ADDRLOONG64TLSU:
 		out.Write64(uint64(sectoff))
-		out.Write64(uint64(elf.R_LARCH_SOP_PUSH_TLS_TPREL) | uint64(elfsym)<<32)
+		out.Write64(uint64(elf.R_LARCH_TLS_LE_HI20) | uint64(elfsym)<<32)
 		out.Write64(uint64(r.Xadd))
 
-		out.Write64(uint64(sectoff))
-		out.Write64(uint64(elf.R_LARCH_SOP_PUSH_ABSOLUTE))
-		out.Write64(uint64(0xc))
-
-		out.Write64(uint64(sectoff))
-		out.Write64(uint64(elf.R_LARCH_SOP_SR))
-		out.Write64(uint64(0x0))
-
-		out.Write64(uint64(sectoff))
-		out.Write64(uint64(elf.R_LARCH_SOP_POP_32_S_5_20) | uint64(0)<<32)
-		out.Write64(uint64(0x0))
-
 	case objabi.R_CALLLOONG64:
 		out.Write64(uint64(sectoff))
-		out.Write64(uint64(elf.R_LARCH_SOP_PUSH_PLT_PCREL) | uint64(elfsym)<<32)
+		out.Write64(uint64(elf.R_LARCH_B26) | uint64(elfsym)<<32)
 		out.Write64(uint64(r.Xadd))
 
+	case objabi.R_LOONG64_TLS_IE_PCREL_HI:
 		out.Write64(uint64(sectoff))
-		out.Write64(uint64(elf.R_LARCH_SOP_POP_32_S_0_10_10_16_S2))
+		out.Write64(uint64(elf.R_LARCH_TLS_IE_PC_HI20) | uint64(elfsym)<<32)
 		out.Write64(uint64(0x0))
-	// The pcaddu12i + addi.d instructions is used to obtain address of a symbol on Loong64.
-	// The low 12-bit of the symbol address need to be added. The addi.d instruction have
-	// signed 12-bit immediate operand. The 0x800 (addr+U12 <=> addr+0x800+S12) is introduced
-	// to do sign extending from 12 bits. The 0x804 is 0x800 + 4, 4 is instruction bit
-	// width on Loong64 and is used to correct the PC of the addi.d instruction.
+
+	case objabi.R_LOONG64_TLS_IE_LO:
+		out.Write64(uint64(sectoff))
+		out.Write64(uint64(elf.R_LARCH_TLS_IE_PC_LO12) | uint64(elfsym)<<32)
+		out.Write64(uint64(0x0))
+
 	case objabi.R_ADDRLOONG64:
 		out.Write64(uint64(sectoff))
-		out.Write64(uint64(elf.R_LARCH_SOP_PUSH_PCREL) | uint64(elfsym)<<32)
-		out.Write64(uint64(r.Xadd + 0x4))
-
-		out.Write64(uint64(sectoff))
-		out.Write64(uint64(elf.R_LARCH_SOP_PUSH_PCREL) | uint64(elfsym)<<32)
-		out.Write64(uint64(r.Xadd + 0x804))
-
-		out.Write64(uint64(sectoff))
-		out.Write64(uint64(elf.R_LARCH_SOP_PUSH_ABSOLUTE))
-		out.Write64(uint64(0xc))
-
-		out.Write64(uint64(sectoff))
-		out.Write64(uint64(elf.R_LARCH_SOP_SR))
-		out.Write64(uint64(0x0))
-
-		out.Write64(uint64(sectoff))
-		out.Write64(uint64(elf.R_LARCH_SOP_PUSH_ABSOLUTE))
-		out.Write64(uint64(0xc))
-
-		out.Write64(uint64(sectoff))
-		out.Write64(uint64(elf.R_LARCH_SOP_SL))
-		out.Write64(uint64(0x0))
-
-		out.Write64(uint64(sectoff))
-		out.Write64(uint64(elf.R_LARCH_SOP_SUB))
-		out.Write64(uint64(0x0))
-
-		out.Write64(uint64(sectoff))
-		out.Write64(uint64(elf.R_LARCH_SOP_POP_32_S_10_12))
-		out.Write64(uint64(0x0))
+		out.Write64(uint64(elf.R_LARCH_PCALA_LO12) | uint64(elfsym)<<32)
+		out.Write64(uint64(r.Xadd))
 
 	case objabi.R_ADDRLOONG64U:
 		out.Write64(uint64(sectoff))
-		out.Write64(uint64(elf.R_LARCH_SOP_PUSH_PCREL) | uint64(elfsym)<<32)
-		out.Write64(uint64(r.Xadd + 0x800))
-
-		out.Write64(uint64(sectoff))
-		out.Write64(uint64(elf.R_LARCH_SOP_PUSH_ABSOLUTE))
-		out.Write64(uint64(0xc))
-
-		out.Write64(uint64(sectoff))
-		out.Write64(uint64(elf.R_LARCH_SOP_SR))
-		out.Write64(uint64(0x0))
-
-		out.Write64(uint64(sectoff))
-		out.Write64(uint64(elf.R_LARCH_SOP_POP_32_S_5_20) | uint64(0)<<32)
-		out.Write64(uint64(0x0))
+		out.Write64(uint64(elf.R_LARCH_PCALA_HI20) | uint64(elfsym)<<32)
+		out.Write64(uint64(r.Xadd))
 	}
 
 	return true
@@ -156,7 +94,6 @@
 func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc, s loader.Sym, val int64) (o int64, nExtReloc int, ok bool) {
 	rs := r.Sym()
 	if target.IsExternal() {
-		nExtReloc := 0
 		switch r.Type() {
 		default:
 			return val, 0, false
@@ -168,20 +105,14 @@
 			if rst != sym.SHOSTOBJ && rst != sym.SDYNIMPORT && ldr.SymSect(rs) == nil {
 				ldr.Errorf(s, "missing section for %s", ldr.SymName(rs))
 			}
-			nExtReloc = 8 // need 8 ELF relocations. see elfreloc1
-			if r.Type() == objabi.R_ADDRLOONG64U {
-				nExtReloc = 4
-			}
-			return val, nExtReloc, true
+			return val, 1, true
 		case objabi.R_ADDRLOONG64TLS,
 			objabi.R_ADDRLOONG64TLSU,
 			objabi.R_CALLLOONG64,
-			objabi.R_JMPLOONG64:
-			nExtReloc = 4
-			if r.Type() == objabi.R_CALLLOONG64 || r.Type() == objabi.R_JMPLOONG64 {
-				nExtReloc = 2
-			}
-			return val, nExtReloc, true
+			objabi.R_JMPLOONG64,
+			objabi.R_LOONG64_TLS_IE_PCREL_HI,
+			objabi.R_LOONG64_TLS_IE_LO:
+			return val, 1, true
 		}
 	}
 
@@ -196,11 +127,11 @@
 	case objabi.R_ADDRLOONG64,
 		objabi.R_ADDRLOONG64U:
 		pc := ldr.SymValue(s) + int64(r.Off())
-		t := ldr.SymAddr(rs) + r.Add() - pc
+		t := calculatePCAlignedReloc(r.Type(), ldr.SymAddr(rs)+r.Add(), pc)
 		if r.Type() == objabi.R_ADDRLOONG64 {
-			return int64(val&0xffc003ff | (((t + 4 - ((t + 4 + 1<<11) >> 12 << 12)) << 10) & 0x3ffc00)), noExtReloc, isOk
+			return int64(val&0xffc003ff | (t << 10)), noExtReloc, isOk
 		}
-		return int64(val&0xfe00001f | (((t + 1<<11) >> 12 << 5) & 0x1ffffe0)), noExtReloc, isOk
+		return int64(val&0xfe00001f | (t << 5)), noExtReloc, isOk
 	case objabi.R_ADDRLOONG64TLS,
 		objabi.R_ADDRLOONG64TLSU:
 		t := ldr.SymAddr(rs) + r.Add()
@@ -233,8 +164,40 @@
 		objabi.R_CONST,
 		objabi.R_GOTOFF,
 		objabi.R_CALLLOONG64,
-		objabi.R_JMPLOONG64:
+		objabi.R_JMPLOONG64,
+		objabi.R_LOONG64_TLS_IE_PCREL_HI,
+		objabi.R_LOONG64_TLS_IE_LO:
 		return ld.ExtrelocSimple(ldr, r), true
 	}
 	return loader.ExtReloc{}, false
 }
+
+func isRequestingLowPageBits(t objabi.RelocType) bool {
+	switch t {
+	case objabi.R_ADDRLOONG64:
+		return true
+	}
+	return false
+}
+
+// Calculates the value to put into the immediate slot, according to the
+// desired relocation type, target and PC.
+// The value to use varies based on the reloc type. Namely, the absolute low
+// bits of the target are to be used for the low part, while the page-aligned
+// offset is to be used for the higher part. A "page" here is not related to
+// the system's actual page size, but rather a fixed 12-bit range (designed to
+// cooperate with ADDI/LD/ST's 12-bit immediates).
+func calculatePCAlignedReloc(t objabi.RelocType, tgt int64, pc int64) int64 {
+	if isRequestingLowPageBits(t) {
+		// corresponding immediate field is 12 bits wide
+		return tgt & 0xfff
+	}
+
+	pageDelta := (tgt >> 12) - (pc >> 12)
+	if tgt&0xfff >= 0x800 {
+		// adjust for sign-extended addition of the low bits
+		pageDelta += 1
+	}
+	// corresponding immediate field is 20 bits wide
+	return pageDelta & 0xfffff
+}
diff --git a/src/cmd/link/internal/loong64/l.go b/src/cmd/link/internal/loong64/l.go
index e97a868..a6309f1 100644
--- a/src/cmd/link/internal/loong64/l.go
+++ b/src/cmd/link/internal/loong64/l.go
@@ -7,7 +7,7 @@
 const (
 	maxAlign  = 32 // max data alignment
 	minAlign  = 1  // min data alignment
-	funcAlign = 8
+	funcAlign = 16
 )
 
 /* Used by ../../internal/ld/dwarf.go */
diff --git a/src/cmd/link/internal/loong64/obj.go b/src/cmd/link/internal/loong64/obj.go
index 0a5bb0a..c3f6ed9 100644
--- a/src/cmd/link/internal/loong64/obj.go
+++ b/src/cmd/link/internal/loong64/obj.go
@@ -19,24 +19,28 @@
 		Minalign:         minAlign,
 		Dwarfregsp:       dwarfRegSP,
 		Dwarfreglr:       dwarfRegLR,
+		CodePad:          []byte{0x00, 0x00, 0x2a, 0x00}, // BREAK 0
 		Adddynrel:        adddynrel,
 		Archinit:         archinit,
 		Archreloc:        archreloc,
 		Archrelocvariant: archrelocvariant,
 		Extreloc:         extreloc,
-		Elfreloc1:        elfreloc1,
-		ElfrelocSize:     24,
-		Elfsetupplt:      elfsetupplt,
 		Machoreloc1:      machoreloc1,
 		Gentext:          gentext,
 
-		Linuxdynld:     "/lib64/ld.so.1",
-		LinuxdynldMusl: "/lib64/ld-musl-loongarch.so.1",
-		Freebsddynld:   "XXX",
-		Openbsddynld:   "XXX",
-		Netbsddynld:    "XXX",
-		Dragonflydynld: "XXX",
-		Solarisdynld:   "XXX",
+		ELF: ld.ELFArch{
+			Linuxdynld:     "/lib64/ld.so.1",
+			LinuxdynldMusl: "/lib64/ld-musl-loongarch.so.1",
+			Freebsddynld:   "XXX",
+			Openbsddynld:   "XXX",
+			Netbsddynld:    "XXX",
+			Dragonflydynld: "XXX",
+			Solarisdynld:   "XXX",
+
+			Reloc1:    elfreloc1,
+			RelocSize: 24,
+			SetupPLT:  elfsetupplt,
+		},
 	}
 
 	return arch, theArch
diff --git a/src/cmd/link/internal/mips/obj.go b/src/cmd/link/internal/mips/obj.go
index f03c9ab..1caddac 100644
--- a/src/cmd/link/internal/mips/obj.go
+++ b/src/cmd/link/internal/mips/obj.go
@@ -34,6 +34,7 @@
 	"cmd/internal/objabi"
 	"cmd/internal/sys"
 	"cmd/link/internal/ld"
+	"cmd/link/internal/loader"
 	"internal/buildcfg"
 )
 
@@ -52,24 +53,32 @@
 		Dwarfregsp: DWARFREGSP,
 		Dwarfreglr: DWARFREGLR,
 
+		Adddynrel:        adddynrel,
 		Archinit:         archinit,
 		Archreloc:        archreloc,
 		Archrelocvariant: archrelocvariant,
 		Extreloc:         extreloc,
-		Elfreloc1:        elfreloc1,
-		ElfrelocSize:     8,
-		Elfsetupplt:      elfsetupplt,
 		Gentext:          gentext,
 		Machoreloc1:      machoreloc1,
 
-		Linuxdynld:     "/lib/ld.so.1",
-		LinuxdynldMusl: musl,
+		ELF: ld.ELFArch{
+			Linuxdynld:     "/lib/ld.so.1",
+			LinuxdynldMusl: musl,
 
-		Freebsddynld:   "XXX",
-		Openbsddynld:   "XXX",
-		Netbsddynld:    "XXX",
-		Dragonflydynld: "XXX",
-		Solarisdynld:   "XXX",
+			Freebsddynld:   "XXX",
+			Openbsddynld:   "XXX",
+			Netbsddynld:    "XXX",
+			Dragonflydynld: "XXX",
+			Solarisdynld:   "XXX",
+
+			Reloc1:    elfreloc1,
+			RelocSize: 8,
+			SetupPLT:  elfsetupplt,
+
+			// Historically GNU ld creates a read-only
+			// .dynamic section.
+			DynamicReadOnly: true,
+		},
 	}
 
 	return arch, theArch
@@ -90,3 +99,9 @@
 		}
 	}
 }
+
+func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym, r loader.Reloc, rIdx int) bool {
+	ld.Exitf("adddynrel currently unimplemented for MIPS")
+	return false
+
+}
diff --git a/src/cmd/link/internal/mips64/asm.go b/src/cmd/link/internal/mips64/asm.go
index 0e64af3..bd0e019 100644
--- a/src/cmd/link/internal/mips64/asm.go
+++ b/src/cmd/link/internal/mips64/asm.go
@@ -39,7 +39,97 @@
 	"debug/elf"
 )
 
-func gentext(ctxt *ld.Link, ldr *loader.Loader) {}
+var (
+	// dtOffsets contains offsets for entries within the .dynamic section.
+	// These are used to fix up symbol values once they are known.
+	dtOffsets map[elf.DynTag]int64
+
+	// dynSymCount contains the number of entries in the .dynsym section.
+	// This is used to populate the DT_MIPS_SYMTABNO entry in the .dynamic
+	// section.
+	dynSymCount uint64
+
+	// gotLocalCount contains the number of local global offset table
+	// entries. This is used to populate the DT_MIPS_LOCAL_GOTNO entry in
+	// the .dynamic section.
+	gotLocalCount uint64
+
+	// gotSymIndex contains the index of the first dynamic symbol table
+	// entry that corresponds to an entry in the global offset table.
+	// This is used to populate the DT_MIPS_GOTSYM entry in the .dynamic
+	// section.
+	gotSymIndex uint64
+)
+
+func gentext(ctxt *ld.Link, ldr *loader.Loader) {
+	if *ld.FlagD || ctxt.Target.IsExternal() {
+		return
+	}
+
+	dynamic := ldr.MakeSymbolUpdater(ctxt.ArchSyms.Dynamic)
+
+	ld.Elfwritedynent(ctxt.Arch, dynamic, elf.DT_MIPS_RLD_VERSION, 1)
+	ld.Elfwritedynent(ctxt.Arch, dynamic, elf.DT_MIPS_BASE_ADDRESS, 0)
+
+	// elfsetupplt should have been called and gotLocalCount should now
+	// have its correct value.
+	if gotLocalCount == 0 {
+		ctxt.Errorf(0, "internal error: elfsetupplt has not been called")
+	}
+	ld.Elfwritedynent(ctxt.Arch, dynamic, elf.DT_MIPS_LOCAL_GOTNO, gotLocalCount)
+
+	// DT_* entries have to exist prior to elfdynhash(), which finalises the
+	// table by adding DT_NULL. However, the values for the following entries
+	// are not know until after dynreloc() has completed. Add the symbols now,
+	// then update their values prior to code generation.
+	dts := []elf.DynTag{
+		elf.DT_MIPS_SYMTABNO,
+		elf.DT_MIPS_GOTSYM,
+	}
+	dtOffsets = make(map[elf.DynTag]int64)
+	for _, dt := range dts {
+		ld.Elfwritedynent(ctxt.Arch, dynamic, dt, 0)
+		dtOffsets[dt] = dynamic.Size() - 8
+	}
+}
+
+func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym, r loader.Reloc, rIdx int) bool {
+	targ := r.Sym()
+	var targType sym.SymKind
+	if targ != 0 {
+		targType = ldr.SymType(targ)
+	}
+
+	if r.Type() >= objabi.ElfRelocOffset {
+		ldr.Errorf(s, "unexpected relocation type %d (%s)", r.Type(), sym.RelocName(target.Arch, r.Type()))
+		return false
+	}
+
+	switch r.Type() {
+	case objabi.R_CALLMIPS, objabi.R_JMPMIPS:
+		if targType != sym.SDYNIMPORT {
+			// Nothing to do, the relocation will be laid out in reloc
+			return true
+		}
+		if target.IsExternal() {
+			// External linker will do this relocation.
+			return true
+		}
+
+		// Internal linking, build a PLT entry and change the relocation
+		// target to that entry.
+		if r.Add() != 0 {
+			ldr.Errorf(s, "PLT call with non-zero addend (%v)", r.Add())
+		}
+		addpltsym(target, ldr, syms, targ)
+		su := ldr.MakeSymbolUpdater(s)
+		su.SetRelocSym(rIdx, syms.PLT)
+		su.SetRelocAdd(rIdx, int64(ldr.SymPlt(targ)))
+		return true
+	}
+
+	return false
+}
 
 func elfreloc1(ctxt *ld.Link, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym, r loader.ExtReloc, ri int, sectoff int64) bool {
 
@@ -95,7 +185,90 @@
 }
 
 func elfsetupplt(ctxt *ld.Link, plt, gotplt *loader.SymbolBuilder, dynamic loader.Sym) {
-	return
+	if plt.Size() != 0 {
+		return
+	}
+
+	// Load resolver address from got[0] into r25.
+	plt.AddSymRef(ctxt.Arch, gotplt.Sym(), 0, objabi.R_ADDRMIPSU, 4)
+	plt.SetUint32(ctxt.Arch, plt.Size()-4, 0x3c0e0000) // lui   $14, %hi(&GOTPLT[0])
+	plt.AddSymRef(ctxt.Arch, gotplt.Sym(), 0, objabi.R_ADDRMIPS, 4)
+	plt.SetUint32(ctxt.Arch, plt.Size()-4, 0xddd90000) // ld    $25, %lo(&GOTPLT[0])($14)
+
+	// Load return address into r15, the index of the got.plt entry into r24, then
+	// JALR to the resolver. The address of the got.plt entry is currently in r24,
+	// which we have to turn into an index.
+	plt.AddSymRef(ctxt.Arch, gotplt.Sym(), 0, objabi.R_ADDRMIPS, 4)
+	plt.SetUint32(ctxt.Arch, plt.Size()-4, 0x25ce0000) // addiu $14, $14, %lo(&GOTPLT[0])
+	plt.AddUint32(ctxt.Arch, 0x030ec023)               // subu  $24, $24, $14
+	plt.AddUint32(ctxt.Arch, 0x03e07825)               // move  $15, $31
+	plt.AddUint32(ctxt.Arch, 0x0018c0c2)               // srl   $24, $24, 3
+	plt.AddUint32(ctxt.Arch, 0x0320f809)               // jalr  $25
+	plt.AddUint32(ctxt.Arch, 0x2718fffe)               // subu  $24, $24, 2
+
+	if gotplt.Size() != 0 {
+		ctxt.Errorf(gotplt.Sym(), "got.plt is not empty")
+	}
+
+	// Reserve got[0] for resolver address (populated by dynamic loader).
+	gotplt.AddUint32(ctxt.Arch, 0)
+	gotplt.AddUint32(ctxt.Arch, 0)
+	gotLocalCount++
+
+	// Reserve got[1] for ELF object pointer (populated by dynamic loader).
+	gotplt.AddUint32(ctxt.Arch, 0)
+	gotplt.AddUint32(ctxt.Arch, 0)
+	gotLocalCount++
+}
+
+func addpltsym(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym) {
+	if ldr.SymPlt(s) >= 0 {
+		return
+	}
+
+	dynamic := ldr.MakeSymbolUpdater(syms.Dynamic)
+
+	const dynSymEntrySize = 20
+	if gotSymIndex == 0 {
+		// Compute and update GOT symbol index.
+		gotSymIndex = uint64(ldr.SymSize(syms.DynSym) / dynSymEntrySize)
+		dynamic.SetUint(target.Arch, dtOffsets[elf.DT_MIPS_GOTSYM], gotSymIndex)
+	}
+	if dynSymCount == 0 {
+		dynSymCount = uint64(ldr.SymSize(syms.DynSym) / dynSymEntrySize)
+	}
+
+	ld.Adddynsym(ldr, target, syms, s)
+	dynSymCount++
+
+	if !target.IsElf() {
+		ldr.Errorf(s, "addpltsym: unsupported binary format")
+	}
+
+	plt := ldr.MakeSymbolUpdater(syms.PLT)
+	gotplt := ldr.MakeSymbolUpdater(syms.GOTPLT)
+	if plt.Size() == 0 {
+		panic("plt is not set up")
+	}
+
+	// Load got.plt entry into r25.
+	plt.AddSymRef(target.Arch, gotplt.Sym(), gotplt.Size(), objabi.R_ADDRMIPSU, 4)
+	plt.SetUint32(target.Arch, plt.Size()-4, 0x3c0f0000) // lui   $15, %hi(.got.plt entry)
+	plt.AddSymRef(target.Arch, gotplt.Sym(), gotplt.Size(), objabi.R_ADDRMIPS, 4)
+	plt.SetUint32(target.Arch, plt.Size()-4, 0xddf90000) // ld    $25, %lo(.got.plt entry)($15)
+
+	// Load address of got.plt entry into r24 and JALR to address in r25.
+	plt.AddUint32(target.Arch, 0x03200008) // jr  $25
+	plt.AddSymRef(target.Arch, gotplt.Sym(), gotplt.Size(), objabi.R_ADDRMIPS, 4)
+	plt.SetUint32(target.Arch, plt.Size()-4, 0x65f80000) // daddiu $24, $15, %lo(.got.plt entry)
+
+	// Add pointer to plt[0] to got.plt
+	gotplt.AddAddrPlus(target.Arch, plt.Sym(), 0)
+
+	ldr.SetPlt(s, int32(plt.Size()-16))
+
+	// Update dynamic symbol count.
+	dynamic.SetUint(target.Arch, dtOffsets[elf.DT_MIPS_SYMTABNO], dynSymCount)
 }
 
 func machoreloc1(*sys.Arch, *ld.OutBuf, *loader.Loader, loader.Sym, loader.ExtReloc, int64) bool {
diff --git a/src/cmd/link/internal/mips64/obj.go b/src/cmd/link/internal/mips64/obj.go
index 557d799..7fb19e9 100644
--- a/src/cmd/link/internal/mips64/obj.go
+++ b/src/cmd/link/internal/mips64/obj.go
@@ -51,23 +51,31 @@
 		Minalign:         minAlign,
 		Dwarfregsp:       dwarfRegSP,
 		Dwarfreglr:       dwarfRegLR,
+		Adddynrel:        adddynrel,
 		Archinit:         archinit,
 		Archreloc:        archreloc,
 		Archrelocvariant: archrelocvariant,
 		Extreloc:         extreloc,
-		Elfreloc1:        elfreloc1,
-		ElfrelocSize:     24,
-		Elfsetupplt:      elfsetupplt,
 		Gentext:          gentext,
 		Machoreloc1:      machoreloc1,
 
-		Linuxdynld:     "/lib64/ld64.so.1",
-		LinuxdynldMusl: musl,
-		Freebsddynld:   "XXX",
-		Openbsddynld:   "/usr/libexec/ld.so",
-		Netbsddynld:    "XXX",
-		Dragonflydynld: "XXX",
-		Solarisdynld:   "XXX",
+		ELF: ld.ELFArch{
+			Linuxdynld:     "/lib64/ld64.so.1",
+			LinuxdynldMusl: musl,
+			Freebsddynld:   "XXX",
+			Openbsddynld:   "/usr/libexec/ld.so",
+			Netbsddynld:    "XXX",
+			Dragonflydynld: "XXX",
+			Solarisdynld:   "XXX",
+
+			Reloc1:    elfreloc1,
+			RelocSize: 24,
+			SetupPLT:  elfsetupplt,
+
+			// Historically GNU ld creates a read-only
+			// .dynamic section.
+			DynamicReadOnly: true,
+		},
 	}
 
 	return arch, theArch
@@ -99,4 +107,8 @@
 			*ld.FlagRound = 0x10000
 		}
 	}
+
+	dynSymCount = 0
+	gotLocalCount = 0
+	gotSymIndex = 0
 }
diff --git a/src/cmd/link/internal/ppc64/asm.go b/src/cmd/link/internal/ppc64/asm.go
index 7413599..d537bc5 100644
--- a/src/cmd/link/internal/ppc64/asm.go
+++ b/src/cmd/link/internal/ppc64/asm.go
@@ -39,22 +39,139 @@
 	"debug/elf"
 	"encoding/binary"
 	"fmt"
+	"internal/buildcfg"
 	"log"
 	"strconv"
 	"strings"
 )
 
-func genpltstub(ctxt *ld.Link, ldr *loader.Loader, r loader.Reloc, s loader.Sym) (sym loader.Sym, firstUse bool) {
+// The build configuration supports PC-relative instructions and relocations (limited to tested targets).
+var hasPCrel = buildcfg.GOPPC64 >= 10 && buildcfg.GOOS == "linux"
+
+const (
+	// For genstub, the type of stub required by the caller.
+	STUB_TOC = iota
+	STUB_PCREL
+)
+
+var stubStrs = []string{
+	STUB_TOC:   "_callstub_toc",
+	STUB_PCREL: "_callstub_pcrel",
+}
+
+const (
+	OP_TOCRESTORE    = 0xe8410018 // ld r2,24(r1)
+	OP_TOCSAVE       = 0xf8410018 // std r2,24(r1)
+	OP_NOP           = 0x60000000 // nop
+	OP_BL            = 0x48000001 // bl 0
+	OP_BCTR          = 0x4e800420 // bctr
+	OP_BCTRL         = 0x4e800421 // bctrl
+	OP_BCL           = 0x40000001 // bcl
+	OP_ADDI          = 0x38000000 // addi
+	OP_ADDIS         = 0x3c000000 // addis
+	OP_LD            = 0xe8000000 // ld
+	OP_PLA_PFX       = 0x06100000 // pla (prefix instruction word)
+	OP_PLA_SFX       = 0x38000000 // pla (suffix instruction word)
+	OP_PLD_PFX_PCREL = 0x04100000 // pld (prefix instruction word, R=1)
+	OP_PLD_SFX       = 0xe4000000 // pld (suffix instruction word)
+	OP_MFLR          = 0x7c0802a6 // mflr
+	OP_MTLR          = 0x7c0803a6 // mtlr
+	OP_MFCTR         = 0x7c0902a6 // mfctr
+	OP_MTCTR         = 0x7c0903a6 // mtctr
+
+	OP_ADDIS_R12_R2  = OP_ADDIS | 12<<21 | 2<<16  // addis r12,r2,0
+	OP_ADDIS_R12_R12 = OP_ADDIS | 12<<21 | 12<<16 // addis  r12,r12,0
+	OP_ADDI_R12_R12  = OP_ADDI | 12<<21 | 12<<16  // addi  r12,r12,0
+	OP_PLD_SFX_R12   = OP_PLD_SFX | 12<<21        // pld   r12,0 (suffix instruction word)
+	OP_PLA_SFX_R12   = OP_PLA_SFX | 12<<21        // pla   r12,0 (suffix instruction word)
+	OP_LIS_R12       = OP_ADDIS | 12<<21          // lis r12,0
+	OP_LD_R12_R12    = OP_LD | 12<<21 | 12<<16    // ld r12,0(r12)
+	OP_MTCTR_R12     = OP_MTCTR | 12<<21          // mtctr r12
+	OP_MFLR_R12      = OP_MFLR | 12<<21           // mflr r12
+	OP_MFLR_R0       = OP_MFLR | 0<<21            // mflr r0
+	OP_MTLR_R0       = OP_MTLR | 0<<21            // mtlr r0
+
+	// This is a special, preferred form of bcl to obtain the next
+	// instruction address (NIA, aka PC+4) in LR.
+	OP_BCL_NIA = OP_BCL | 20<<21 | 31<<16 | 1<<2 // bcl 20,31,$+4
+
+	// Masks to match opcodes
+	MASK_PLD_PFX  = 0xfff70000
+	MASK_PLD_SFX  = 0xfc1f0000 // Also checks RA = 0 if check value is OP_PLD_SFX.
+	MASK_PLD_RT   = 0x03e00000 // Extract RT from the pld suffix.
+	MASK_OP_LD    = 0xfc000003
+	MASK_OP_ADDIS = 0xfc000000
+)
+
+// Generate a stub to call between TOC and NOTOC functions. See genpltstub for more details about calling stubs.
+// This is almost identical to genpltstub, except the location of the target symbol is known at link time.
+func genstub(ctxt *ld.Link, ldr *loader.Loader, r loader.Reloc, ri int, s loader.Sym, stubType int) (ssym loader.Sym, firstUse bool) {
+	addendStr := ""
+	if r.Add() != 0 {
+		addendStr = fmt.Sprintf("%+d", r.Add())
+	}
+
+	stubName := fmt.Sprintf("%s%s.%s", stubStrs[stubType], addendStr, ldr.SymName(r.Sym()))
+	stub := ldr.CreateSymForUpdate(stubName, 0)
+	firstUse = stub.Size() == 0
+	if firstUse {
+		switch stubType {
+		// A call from a function using a TOC pointer.
+		case STUB_TOC:
+			stub.AddUint32(ctxt.Arch, OP_TOCSAVE) // std r2,24(r1)
+			stub.AddSymRef(ctxt.Arch, r.Sym(), r.Add(), objabi.R_ADDRPOWER_TOCREL_DS, 8)
+			stub.SetUint32(ctxt.Arch, stub.Size()-8, OP_ADDIS_R12_R2) // addis r12,r2,targ@toc@ha
+			stub.SetUint32(ctxt.Arch, stub.Size()-4, OP_ADDI_R12_R12) // addi  r12,targ@toc@l(r12)
+
+		// A call from PC relative function.
+		case STUB_PCREL:
+			if buildcfg.GOPPC64 >= 10 {
+				// Set up address of targ in r12, PCrel
+				stub.AddSymRef(ctxt.Arch, r.Sym(), r.Add(), objabi.R_ADDRPOWER_PCREL34, 8)
+				stub.SetUint32(ctxt.Arch, stub.Size()-8, OP_PLA_PFX)
+				stub.SetUint32(ctxt.Arch, stub.Size()-4, OP_PLA_SFX_R12) // pla r12, r
+			} else {
+				// The target may not be a P10. Generate a P8 compatible stub.
+				stub.AddUint32(ctxt.Arch, OP_MFLR_R0)  // mflr r0
+				stub.AddUint32(ctxt.Arch, OP_BCL_NIA)  // bcl 20,31,1f
+				stub.AddUint32(ctxt.Arch, OP_MFLR_R12) // 1: mflr r12  (r12 is the address of this instruction)
+				stub.AddUint32(ctxt.Arch, OP_MTLR_R0)  // mtlr r0
+				stub.AddSymRef(ctxt.Arch, r.Sym(), r.Add()+8, objabi.R_ADDRPOWER_PCREL, 8)
+				stub.SetUint32(ctxt.Arch, stub.Size()-8, OP_ADDIS_R12_R12) // addis r12,(r - 1b) + 8
+				stub.SetUint32(ctxt.Arch, stub.Size()-4, OP_ADDI_R12_R12)  // addi  r12,(r - 1b) + 12
+			}
+		}
+		// Jump to the loaded pointer
+		stub.AddUint32(ctxt.Arch, OP_MTCTR_R12) // mtctr r12
+		stub.AddUint32(ctxt.Arch, OP_BCTR)      // bctr
+		stub.SetType(sym.STEXT)
+	}
+
+	// Update the relocation to use the call stub
+	su := ldr.MakeSymbolUpdater(s)
+	su.SetRelocSym(ri, stub.Sym())
+
+	// Rewrite the TOC restore slot (a nop) if the caller uses a TOC pointer.
+	switch stubType {
+	case STUB_TOC:
+		rewritetoinsn(&ctxt.Target, ldr, su, int64(r.Off()+4), 0xFFFFFFFF, OP_NOP, OP_TOCRESTORE)
+	}
+
+	return stub.Sym(), firstUse
+}
+
+func genpltstub(ctxt *ld.Link, ldr *loader.Loader, r loader.Reloc, ri int, s loader.Sym) (sym loader.Sym, firstUse bool) {
 	// The ppc64 ABI PLT has similar concepts to other
 	// architectures, but is laid out quite differently. When we
-	// see an R_PPC64_REL24 relocation to a dynamic symbol
-	// (indicating that the call needs to go through the PLT), we
-	// generate up to three stubs and reserve a PLT slot.
+	// see a relocation to a dynamic symbol (indicating that the
+	// call needs to go through the PLT), we generate up to three
+	// stubs and reserve a PLT slot.
 	//
-	// 1) The call site will be bl x; nop (where the relocation
-	//    applies to the bl).  We rewrite this to bl x_stub; ld
-	//    r2,24(r1).  The ld is necessary because x_stub will save
-	//    r2 (the TOC pointer) at 24(r1) (the "TOC save slot").
+	// 1) The call site is a "bl x" where genpltstub rewrites it to
+	//    "bl x_stub". Depending on the properties of the caller
+	//    (see ELFv2 1.5 4.2.5.3), a nop may be expected immediately
+	//    after the bl. This nop is rewritten to ld r2,24(r1) to
+	//    restore the toc pointer saved by x_stub.
 	//
 	// 2) We reserve space for a pointer in the .plt section (once
 	//    per referenced dynamic function).  .plt is a data
@@ -63,11 +180,8 @@
 	//    dynamic linker will fill each slot with a pointer to the
 	//    corresponding x@plt entry point.
 	//
-	// 3) We generate the "call stub" x_stub (once per dynamic
-	//    function/object file pair).  This saves the TOC in the
-	//    TOC save slot, reads the function pointer from x's .plt
-	//    slot and calls it like any other global entry point
-	//    (including setting r12 to the function address).
+	// 3) We generate a "call stub" x_stub based on the properties
+	//    of the caller.
 	//
 	// 4) We generate the "symbol resolver stub" x@plt (once per
 	//    dynamic function).  This is solely a branch to the glink
@@ -86,49 +200,65 @@
 	// platforms and ppc64's .glink is like .plt on other
 	// platforms.
 
-	// Find all R_PPC64_REL24 relocations that reference dynamic
-	// imports. Reserve PLT entries for these symbols and
-	// generate call stubs. The call stubs need to live in .text,
-	// which is why we need to do this pass this early.
-	//
-	// This assumes "case 1" from the ABI, where the caller needs
-	// us to save and restore the TOC pointer.
+	// Find all relocations that reference dynamic imports.
+	// Reserve PLT entries for these symbols and generate call
+	// stubs. The call stubs need to live in .text, which is why we
+	// need to do this pass this early.
 
-	// Reserve PLT entry and generate symbol
-	// resolver
+	// Reserve PLT entry and generate symbol resolver
 	addpltsym(ctxt, ldr, r.Sym())
 
-	// Generate call stub. Important to note that we're looking
-	// up the stub using the same version as the parent symbol (s),
-	// needed so that symtoc() will select the right .TOC. symbol
-	// when processing the stub.  In older versions of the linker
-	// this was done by setting stub.Outer to the parent, but
-	// if the stub has the right version initially this is not needed.
-	n := fmt.Sprintf("%s.%s", ldr.SymName(s), ldr.SymName(r.Sym()))
-	stub := ldr.CreateSymForUpdate(n, ldr.SymVersion(s))
+	// The stub types are described in gencallstub.
+	stubType := 0
+	stubTypeStr := ""
+
+	// For now, the choice of call stub type is determined by whether
+	// the caller maintains a TOC pointer in R2. A TOC pointer implies
+	// we can always generate a position independent stub.
+	//
+	// For dynamic calls made from an external object, a caller maintains
+	// a TOC pointer only when an R_PPC64_REL24 relocation is used.
+	// An R_PPC64_REL24_NOTOC relocation does not use or maintain
+	// a TOC pointer, and almost always implies a Power10 target.
+	//
+	// For dynamic calls made from a Go caller, a TOC relative stub is
+	// always needed when a TOC pointer is maintained (specifically, if
+	// the Go caller is PIC, and cannot use PCrel instructions).
+	if (r.Type() == objabi.ElfRelocOffset+objabi.RelocType(elf.R_PPC64_REL24)) || (!ldr.AttrExternal(s) && ldr.AttrShared(s) && !hasPCrel) {
+		stubTypeStr = "_tocrel"
+		stubType = 1
+	} else {
+		stubTypeStr = "_notoc"
+		stubType = 3
+	}
+	n := fmt.Sprintf("_pltstub%s.%s", stubTypeStr, ldr.SymName(r.Sym()))
+
+	// When internal linking, all text symbols share the same toc pointer.
+	stub := ldr.CreateSymForUpdate(n, 0)
 	firstUse = stub.Size() == 0
 	if firstUse {
-		gencallstub(ctxt, ldr, 1, stub, r.Sym())
+		gencallstub(ctxt, ldr, stubType, stub, r.Sym())
 	}
 
 	// Update the relocation to use the call stub
-	r.SetSym(stub.Sym())
-
-	// Make the symbol writeable so we can fixup toc.
 	su := ldr.MakeSymbolUpdater(s)
-	su.MakeWritable()
-	p := su.Data()
+	su.SetRelocSym(ri, stub.Sym())
 
-	// Check for toc restore slot (a nop), and replace with toc restore.
-	var nop uint32
-	if len(p) >= int(r.Off()+8) {
-		nop = ctxt.Arch.ByteOrder.Uint32(p[r.Off()+4:])
+	// A type 1 call must restore the toc pointer after the call.
+	if stubType == 1 {
+		su.MakeWritable()
+		p := su.Data()
+
+		// Check for a toc pointer restore slot (a nop), and rewrite to restore the toc pointer.
+		var nop uint32
+		if len(p) >= int(r.Off()+8) {
+			nop = ctxt.Arch.ByteOrder.Uint32(p[r.Off()+4:])
+		}
+		if nop != OP_NOP {
+			ldr.Errorf(s, "Symbol %s is missing toc restoration slot at offset %d", ldr.SymName(s), r.Off()+4)
+		}
+		ctxt.Arch.ByteOrder.PutUint32(p[r.Off()+4:], OP_TOCRESTORE)
 	}
-	if nop != 0x60000000 {
-		ldr.Errorf(s, "Symbol %s is missing toc restoration slot at offset %d", ldr.SymName(s), r.Off()+4)
-	}
-	const o1 = 0xe8410018 // ld r2,24(r1)
-	ctxt.Arch.ByteOrder.PutUint32(p[r.Off()+4:], o1)
 
 	return stub.Sym(), firstUse
 }
@@ -146,7 +276,7 @@
 				switch ldr.SymType(r.Sym()) {
 				case sym.SDYNIMPORT:
 					// This call goes through the PLT, generate and call through a PLT stub.
-					if sym, firstUse := genpltstub(ctxt, ldr, r, s); firstUse {
+					if sym, firstUse := genpltstub(ctxt, ldr, r, i, s); firstUse {
 						stubs = append(stubs, sym)
 					}
 
@@ -160,6 +290,46 @@
 							abifuncs = append(abifuncs, sym)
 						}
 					}
+				case sym.STEXT:
+					targ := r.Sym()
+					if (ldr.AttrExternal(targ) && ldr.SymLocalentry(targ) != 1) || !ldr.AttrExternal(targ) {
+						// All local symbols share the same TOC pointer. This caller has a valid TOC
+						// pointer in R2. Calls into a Go symbol preserve R2. No call stub is needed.
+					} else {
+						// This caller has a TOC pointer. The callee might clobber it. R2 needs to be saved
+						// and restored.
+						if sym, firstUse := genstub(ctxt, ldr, r, i, s, STUB_TOC); firstUse {
+							stubs = append(stubs, sym)
+						}
+					}
+				}
+
+			case objabi.ElfRelocOffset + objabi.RelocType(elf.R_PPC64_REL24_P9NOTOC):
+				// This can be treated identically to R_PPC64_REL24_NOTOC, as stubs are determined by
+				// GOPPC64 and -buildmode.
+				fallthrough
+			case objabi.ElfRelocOffset + objabi.RelocType(elf.R_PPC64_REL24_NOTOC):
+				switch ldr.SymType(r.Sym()) {
+				case sym.SDYNIMPORT:
+					// This call goes through the PLT, generate and call through a PLT stub.
+					if sym, firstUse := genpltstub(ctxt, ldr, r, i, s); firstUse {
+						stubs = append(stubs, sym)
+					}
+
+				case sym.SXREF:
+					// TODO: This is not supported yet.
+					ldr.Errorf(s, "Unsupported NOTOC external reference call into %s", ldr.SymName(r.Sym()))
+
+				case sym.STEXT:
+					targ := r.Sym()
+					if (ldr.AttrExternal(targ) && ldr.SymLocalentry(targ) <= 1) || (!ldr.AttrExternal(targ) && (!ldr.AttrShared(targ) || hasPCrel)) {
+						// This is NOTOC to NOTOC call (st_other is 0 or 1). No call stub is needed.
+					} else {
+						// This is a NOTOC to TOC function. Generate a calling stub.
+						if sym, firstUse := genstub(ctxt, ldr, r, i, s, STUB_PCREL); firstUse {
+							stubs = append(stubs, sym)
+						}
+					}
 				}
 
 			// Handle objects compiled with -fno-plt. Rewrite local calls to avoid indirect calling.
@@ -168,24 +338,23 @@
 				if ldr.SymType(r.Sym()) == sym.STEXT {
 					// This should be an mtctr instruction. Turn it into a nop.
 					su := ldr.MakeSymbolUpdater(s)
-					const OP_MTCTR = 31<<26 | 0x9<<16 | 467<<1
 					const MASK_OP_MTCTR = 63<<26 | 0x3FF<<11 | 0x1FF<<1
 					rewritetonop(&ctxt.Target, ldr, su, int64(r.Off()), MASK_OP_MTCTR, OP_MTCTR)
 				}
 			case objabi.ElfRelocOffset + objabi.RelocType(elf.R_PPC64_PLTCALL):
 				if ldr.SymType(r.Sym()) == sym.STEXT {
 					// This relocation should point to a bctrl followed by a ld r2, 24(41)
-					const OP_BL = 0x48000001         // bl 0
-					const OP_TOCRESTORE = 0xe8410018 // ld r2,24(r1)
-					const OP_BCTRL = 0x4e800421      // bctrl
-
 					// Convert the bctrl into a bl.
 					su := ldr.MakeSymbolUpdater(s)
 					rewritetoinsn(&ctxt.Target, ldr, su, int64(r.Off()), 0xFFFFFFFF, OP_BCTRL, OP_BL)
 
 					// Turn this reloc into an R_CALLPOWER, and convert the TOC restore into a nop.
 					su.SetRelocType(i, objabi.R_CALLPOWER)
-					su.SetRelocAdd(i, r.Add()+int64(ldr.SymLocalentry(r.Sym())))
+					localEoffset := int64(ldr.SymLocalentry(r.Sym()))
+					if localEoffset == 1 {
+						ldr.Errorf(s, "Unsupported NOTOC call to %s", ldr.SymName(r.Sym()))
+					}
+					su.SetRelocAdd(i, r.Add()+localEoffset)
 					r.SetSiz(4)
 					rewritetonop(&ctxt.Target, ldr, su, int64(r.Off()+4), 0xFFFFFFFF, OP_TOCRESTORE)
 				}
@@ -215,20 +384,25 @@
 		initfunc.AddUint32(ctxt.Arch, op)
 	}
 
-	// addis r2, r12, .TOC.-func@ha
-	toc := ctxt.DotTOC[0]
-	rel1, _ := initfunc.AddRel(objabi.R_ADDRPOWER_PCREL)
-	rel1.SetOff(0)
-	rel1.SetSiz(8)
-	rel1.SetSym(toc)
-	o(0x3c4c0000)
-	// addi r2, r2, .TOC.-func@l
-	o(0x38420000)
-	// mflr r31
-	o(0x7c0802a6)
-	// stdu r31, -32(r1)
-	o(0xf801ffe1)
-	// addis r3, r2, local.moduledata@got@ha
+	// Write a function to load this module's local.moduledata. This is shared code.
+	//
+	// package link
+	// void addmoduledata() {
+	//	runtime.addmoduledata(local.moduledata)
+	// }
+
+	if !hasPCrel {
+		// Regenerate TOC from R12 (the address of this function).
+		sz := initfunc.AddSymRef(ctxt.Arch, ctxt.DotTOC[0], 0, objabi.R_ADDRPOWER_PCREL, 8)
+		initfunc.SetUint32(ctxt.Arch, sz-8, 0x3c4c0000) // addis r2, r12, .TOC.-func@ha
+		initfunc.SetUint32(ctxt.Arch, sz-4, 0x38420000) // addi r2, r2, .TOC.-func@l
+	}
+
+	// This is Go ABI. Stack a frame and save LR.
+	o(OP_MFLR_R0) // mflr r0
+	o(0xf801ffe1) // stdu r0, -32(r1)
+
+	// Get the moduledata pointer from GOT and put into R3.
 	var tgt loader.Sym
 	if s := ldr.Lookup("local.moduledata", 0); s != 0 {
 		tgt = s
@@ -237,29 +411,29 @@
 	} else {
 		tgt = ldr.LookupOrCreateSym("runtime.firstmoduledata", 0)
 	}
-	rel2, _ := initfunc.AddRel(objabi.R_ADDRPOWER_GOT)
-	rel2.SetOff(int32(initfunc.Size()))
-	rel2.SetSiz(8)
-	rel2.SetSym(tgt)
-	o(0x3c620000)
-	// ld r3, local.moduledata@got@l(r3)
-	o(0xe8630000)
-	// bl runtime.addmoduledata
-	rel3, _ := initfunc.AddRel(objabi.R_CALLPOWER)
-	rel3.SetOff(int32(initfunc.Size()))
-	rel3.SetSiz(4)
-	rel3.SetSym(addmoduledata)
-	o(0x48000001)
-	// nop
-	o(0x60000000)
-	// ld r31, 0(r1)
-	o(0xe8010000)
-	// mtlr r31
-	o(0x7c0803a6)
-	// addi r1,r1,32
-	o(0x38210020)
-	// blr
-	o(0x4e800020)
+
+	if !hasPCrel {
+		sz := initfunc.AddSymRef(ctxt.Arch, tgt, 0, objabi.R_ADDRPOWER_GOT, 8)
+		initfunc.SetUint32(ctxt.Arch, sz-8, 0x3c620000) // addis r3, r2, local.moduledata@got@ha
+		initfunc.SetUint32(ctxt.Arch, sz-4, 0xe8630000) // ld r3, local.moduledata@got@l(r3)
+	} else {
+		sz := initfunc.AddSymRef(ctxt.Arch, tgt, 0, objabi.R_ADDRPOWER_GOT_PCREL34, 8)
+		// Note, this is prefixed instruction. It must not cross a 64B boundary.
+		// It is doubleworld aligned here, so it will never cross (this function is 16B aligned, minimum).
+		initfunc.SetUint32(ctxt.Arch, sz-8, OP_PLD_PFX_PCREL)
+		initfunc.SetUint32(ctxt.Arch, sz-4, OP_PLD_SFX|(3<<21)) // pld r3, local.moduledata@got@pcrel
+	}
+
+	// Call runtime.addmoduledata
+	sz := initfunc.AddSymRef(ctxt.Arch, addmoduledata, 0, objabi.R_CALLPOWER, 4)
+	initfunc.SetUint32(ctxt.Arch, sz-4, OP_BL) // bl runtime.addmoduledata
+	o(OP_NOP)                                  // nop (for TOC restore)
+
+	// Pop stack frame and return.
+	o(0xe8010000) // ld r0, 0(r1)
+	o(OP_MTLR_R0) // mtlr r0
+	o(0x38210020) // addi r1,r1,32
+	o(0x4e800020) // blr
 }
 
 // Rewrite ELF (v1 or v2) calls to _savegpr0_n, _savegpr1_n, _savefpr_n, _restfpr_n, _savevr_m, or
@@ -333,48 +507,62 @@
 	}
 }
 
-// Construct a call stub in stub that calls symbol targ via its PLT
-// entry.
-func gencallstub(ctxt *ld.Link, ldr *loader.Loader, abicase int, stub *loader.SymbolBuilder, targ loader.Sym) {
-	if abicase != 1 {
-		// If we see R_PPC64_TOCSAVE or R_PPC64_REL24_NOTOC
-		// relocations, we'll need to implement cases 2 and 3.
-		log.Fatalf("gencallstub only implements case 1 calls")
-	}
-
+// Create a calling stub. The stubType maps directly to the properties listed in the ELFv2 1.5
+// section 4.2.5.3.
+//
+// There are 3 cases today (as paraphrased from the ELFv2 document):
+//
+//  1. R2 holds the TOC pointer on entry. The call stub must save R2 into the ELFv2 TOC stack save slot.
+//
+//  2. R2 holds the TOC pointer on entry. The caller has already saved R2 to the TOC stack save slot.
+//
+//  3. R2 does not hold the TOC pointer on entry. The caller has no expectations of R2.
+//
+// Go only needs case 1 and 3 today. Go symbols which have AttrShare set could use case 2, but case 1 always
+// works in those cases too.
+func gencallstub(ctxt *ld.Link, ldr *loader.Loader, stubType int, stub *loader.SymbolBuilder, targ loader.Sym) {
 	plt := ctxt.PLT
-
 	stub.SetType(sym.STEXT)
 
-	// Save TOC pointer in TOC save slot
-	stub.AddUint32(ctxt.Arch, 0xf8410018) // std r2,24(r1)
-
-	// Load the function pointer from the PLT.
-	rel, ri1 := stub.AddRel(objabi.R_POWER_TOC)
-	rel.SetOff(int32(stub.Size()))
-	rel.SetSiz(2)
-	rel.SetAdd(int64(ldr.SymPlt(targ)))
-	rel.SetSym(plt)
-	if ctxt.Arch.ByteOrder == binary.BigEndian {
-		rel.SetOff(rel.Off() + int32(rel.Siz()))
+	switch stubType {
+	case 1:
+		// Save TOC, then load targ address from PLT using TOC.
+		stub.AddUint32(ctxt.Arch, OP_TOCSAVE) // std r2,24(r1)
+		stub.AddSymRef(ctxt.Arch, plt, int64(ldr.SymPlt(targ)), objabi.R_ADDRPOWER_TOCREL_DS, 8)
+		stub.SetUint32(ctxt.Arch, stub.Size()-8, OP_ADDIS_R12_R2) // addis r12,r2,targ@plt@toc@ha
+		stub.SetUint32(ctxt.Arch, stub.Size()-4, OP_LD_R12_R12)   // ld r12,targ@plt@toc@l(r12)
+	case 3:
+		// No TOC needs to be saved, but the stub may need to position-independent.
+		if buildcfg.GOPPC64 >= 10 {
+			// Power10 is supported, load targ address into r12 using PCrel load.
+			stub.AddSymRef(ctxt.Arch, plt, int64(ldr.SymPlt(targ)), objabi.R_ADDRPOWER_PCREL34, 8)
+			stub.SetUint32(ctxt.Arch, stub.Size()-8, OP_PLD_PFX_PCREL)
+			stub.SetUint32(ctxt.Arch, stub.Size()-4, OP_PLD_SFX_R12) // pld r12, targ@plt
+		} else if !isLinkingPIC(ctxt) {
+			// This stub doesn't need to be PIC. Load targ address from the PLT via its absolute address.
+			stub.AddSymRef(ctxt.Arch, plt, int64(ldr.SymPlt(targ)), objabi.R_ADDRPOWER_DS, 8)
+			stub.SetUint32(ctxt.Arch, stub.Size()-8, OP_LIS_R12)    // lis r12,targ@plt@ha
+			stub.SetUint32(ctxt.Arch, stub.Size()-4, OP_LD_R12_R12) // ld r12,targ@plt@l(r12)
+		} else {
+			// Generate a PIC stub. This is ugly as the stub must determine its location using
+			// POWER8 or older instruction. These stubs are likely the combination of using
+			// GOPPC64 < 8 and linking external objects built with CFLAGS="... -mcpu=power10 ..."
+			stub.AddUint32(ctxt.Arch, OP_MFLR_R0)  // mflr r0
+			stub.AddUint32(ctxt.Arch, OP_BCL_NIA)  // bcl 20,31,1f
+			stub.AddUint32(ctxt.Arch, OP_MFLR_R12) // 1: mflr r12  (r12 is the address of this instruction)
+			stub.AddUint32(ctxt.Arch, OP_MTLR_R0)  // mtlr r0
+			stub.AddSymRef(ctxt.Arch, plt, int64(ldr.SymPlt(targ))+8, objabi.R_ADDRPOWER_PCREL, 8)
+			stub.SetUint32(ctxt.Arch, stub.Size()-8, OP_ADDIS_R12_R12) // addis r12,(targ@plt - 1b) + 8
+			stub.SetUint32(ctxt.Arch, stub.Size()-4, OP_ADDI_R12_R12)  // addi  r12,(targ@plt - 1b) + 12
+			stub.AddUint32(ctxt.Arch, OP_LD_R12_R12)                   // ld r12, 0(r12)
+		}
+	default:
+		log.Fatalf("gencallstub does not support ELFv2 ABI property %d", stubType)
 	}
-	ldr.SetRelocVariant(stub.Sym(), int(ri1), sym.RV_POWER_HA)
-	stub.AddUint32(ctxt.Arch, 0x3d820000) // addis r12,r2,targ@plt@toc@ha
-
-	rel2, ri2 := stub.AddRel(objabi.R_POWER_TOC)
-	rel2.SetOff(int32(stub.Size()))
-	rel2.SetSiz(2)
-	rel2.SetAdd(int64(ldr.SymPlt(targ)))
-	rel2.SetSym(plt)
-	if ctxt.Arch.ByteOrder == binary.BigEndian {
-		rel2.SetOff(rel2.Off() + int32(rel2.Siz()))
-	}
-	ldr.SetRelocVariant(stub.Sym(), int(ri2), sym.RV_POWER_LO)
-	stub.AddUint32(ctxt.Arch, 0xe98c0000) // ld r12,targ@plt@toc@l(r12)
 
 	// Jump to the loaded pointer
-	stub.AddUint32(ctxt.Arch, 0x7d8903a6) // mtctr r12
-	stub.AddUint32(ctxt.Arch, 0x4e800420) // bctr
+	stub.AddUint32(ctxt.Arch, OP_MTCTR_R12) // mtctr r12
+	stub.AddUint32(ctxt.Arch, OP_BCTR)      // bctr
 }
 
 // Rewrite the instruction at offset into newinsn. Also, verify the
@@ -391,8 +579,7 @@
 // Rewrite the instruction at offset into a hardware nop instruction. Also, verify the
 // existing instruction under mask matches the check value.
 func rewritetonop(target *ld.Target, ldr *loader.Loader, su *loader.SymbolBuilder, offset int64, mask, check uint32) {
-	const NOP = 0x60000000
-	rewritetoinsn(target, ldr, su, offset, mask, check, NOP)
+	rewritetoinsn(target, ldr, su, offset, mask, check, OP_NOP)
 }
 
 func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym, r loader.Reloc, rIdx int) bool {
@@ -419,6 +606,17 @@
 		}
 
 		// Handle relocations found in ELF object files.
+	case objabi.ElfRelocOffset + objabi.RelocType(elf.R_PPC64_REL24_NOTOC),
+		objabi.ElfRelocOffset + objabi.RelocType(elf.R_PPC64_REL24_P9NOTOC):
+		su := ldr.MakeSymbolUpdater(s)
+		su.SetRelocType(rIdx, objabi.R_CALLPOWER)
+
+		if targType == sym.SDYNIMPORT {
+			// Should have been handled in elfsetupplt
+			ldr.Errorf(s, "unexpected R_PPC64_REL24_NOTOC/R_PPC64_REL24_P9NOTOC for dyn import")
+		}
+		return true
+
 	case objabi.ElfRelocOffset + objabi.RelocType(elf.R_PPC64_REL24):
 		su := ldr.MakeSymbolUpdater(s)
 		su.SetRelocType(rIdx, objabi.R_CALLPOWER)
@@ -428,7 +626,11 @@
 		// callee. Hence, we need to go to the local entry
 		// point.  (If we don't do this, the callee will try
 		// to use r12 to compute r2.)
-		su.SetRelocAdd(rIdx, r.Add()+int64(ldr.SymLocalentry(targ)))
+		localEoffset := int64(ldr.SymLocalentry(targ))
+		if localEoffset == 1 {
+			ldr.Errorf(s, "Unsupported NOTOC call to %s", targ)
+		}
+		su.SetRelocAdd(rIdx, r.Add()+localEoffset)
 
 		if targType == sym.SDYNIMPORT {
 			// Should have been handled in elfsetupplt
@@ -437,6 +639,26 @@
 
 		return true
 
+	case objabi.ElfRelocOffset + objabi.RelocType(elf.R_PPC64_PCREL34):
+		su := ldr.MakeSymbolUpdater(s)
+		su.SetRelocType(rIdx, objabi.R_ADDRPOWER_PCREL34)
+		return true
+
+	case objabi.ElfRelocOffset + objabi.RelocType(elf.R_PPC64_GOT_PCREL34):
+		su := ldr.MakeSymbolUpdater(s)
+		su.SetRelocType(rIdx, objabi.R_ADDRPOWER_PCREL34)
+		if targType != sym.STEXT {
+			ld.AddGotSym(target, ldr, syms, targ, uint32(elf.R_PPC64_GLOB_DAT))
+			su.SetRelocSym(rIdx, syms.GOT)
+			su.SetRelocAdd(rIdx, r.Add()+int64(ldr.SymGot(targ)))
+		} else {
+			// The address of targ is known at link time. Rewrite to "pla rt,targ" from "pld rt,targ@got"
+			rewritetoinsn(target, ldr, su, int64(r.Off()), MASK_PLD_PFX, OP_PLD_PFX_PCREL, OP_PLA_PFX)
+			pla_sfx := target.Arch.ByteOrder.Uint32(su.Data()[r.Off()+4:])&MASK_PLD_RT | OP_PLA_SFX
+			rewritetoinsn(target, ldr, su, int64(r.Off()+4), MASK_PLD_SFX, OP_PLD_SFX, pla_sfx)
+		}
+		return true
+
 	case objabi.ElfRelocOffset + objabi.RelocType(elf.R_PPC_REL32):
 		su := ldr.MakeSymbolUpdater(s)
 		su.SetRelocType(rIdx, objabi.R_PCREL)
@@ -554,13 +776,9 @@
 		} else if targType == sym.STEXT {
 			if isPLT16_LO_DS {
 				// Expect an ld opcode to nop
-				const MASK_OP_LD = 63<<26 | 0x3
-				const OP_LD = 58 << 26
 				rewritetonop(target, ldr, su, int64(r.Off()), MASK_OP_LD, OP_LD)
 			} else {
 				// Expect an addis opcode to nop
-				const MASK_OP_ADDIS = 63 << 26
-				const OP_ADDIS = 15 << 26
 				rewritetonop(target, ldr, su, int64(r.Off()), MASK_OP_ADDIS, OP_ADDIS)
 			}
 			// And we can ignore this reloc now.
@@ -704,9 +922,9 @@
 }
 
 func elfreloc1(ctxt *ld.Link, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym, r loader.ExtReloc, ri int, sectoff int64) bool {
-	// Beware that bit0~bit15 start from the third byte of a instruction in Big-Endian machines.
+	// Beware that bit0~bit15 start from the third byte of an instruction in Big-Endian machines.
 	rt := r.Type
-	if rt == objabi.R_ADDR || rt == objabi.R_POWER_TLS || rt == objabi.R_CALLPOWER {
+	if rt == objabi.R_ADDR || rt == objabi.R_POWER_TLS || rt == objabi.R_CALLPOWER || rt == objabi.R_DWARFSECREF {
 	} else {
 		if ctxt.Arch.ByteOrder == binary.BigEndian {
 			sectoff += 2
@@ -762,6 +980,8 @@
 		out.Write64(uint64(r.Xadd))
 		out.Write64(uint64(sectoff + 4))
 		out.Write64(uint64(elf.R_PPC64_GOT16_LO_DS) | uint64(elfsym)<<32)
+	case objabi.R_ADDRPOWER_GOT_PCREL34:
+		out.Write64(uint64(elf.R_PPC64_GOT_PCREL34) | uint64(elfsym)<<32)
 	case objabi.R_ADDRPOWER_PCREL:
 		out.Write64(uint64(elf.R_PPC64_REL16_HA) | uint64(elfsym)<<32)
 		out.Write64(uint64(r.Xadd))
@@ -782,7 +1002,12 @@
 		if r.Size != 4 {
 			return false
 		}
-		out.Write64(uint64(elf.R_PPC64_REL24) | uint64(elfsym)<<32)
+		if !hasPCrel {
+			out.Write64(uint64(elf.R_PPC64_REL24) | uint64(elfsym)<<32)
+		} else {
+			// TOC is not used in PCrel compiled Go code.
+			out.Write64(uint64(elf.R_PPC64_REL24_NOTOC) | uint64(elfsym)<<32)
+		}
 
 	}
 	out.Write64(uint64(r.Xadd))
@@ -908,19 +1133,29 @@
 		ldr.Errorf(s, "relocation for %s is too big (>=2G): 0x%x", ldr.SymName(s), ldr.SymValue(rs))
 	}
 
+	// Note, relocations imported from external objects may not have cleared bits
+	// within a relocatable field. They need cleared before applying the relocation.
 	switch r.Type() {
 	case objabi.R_ADDRPOWER_PCREL34:
 		// S + A - P
 		t -= (ldr.SymValue(s) + int64(r.Off()))
+		o1 &^= 0x3ffff
+		o2 &^= 0x0ffff
 		o1 |= computePrefix34HI(t)
 		o2 |= computeLO(int32(t))
 	case objabi.R_ADDRPOWER_D34:
+		o1 &^= 0x3ffff
+		o2 &^= 0x0ffff
 		o1 |= computePrefix34HI(t)
 		o2 |= computeLO(int32(t))
 	case objabi.R_ADDRPOWER:
+		o1 &^= 0xffff
+		o2 &^= 0xffff
 		o1 |= computeHA(int32(t))
 		o2 |= computeLO(int32(t))
 	case objabi.R_ADDRPOWER_DS:
+		o1 &^= 0xffff
+		o2 &^= 0xfffc
 		o1 |= computeHA(int32(t))
 		o2 |= computeLO(int32(t))
 		if t&3 != 0 {
@@ -935,6 +1170,11 @@
 
 // Determine if the code was compiled so that the TOC register R2 is initialized and maintained.
 func r2Valid(ctxt *ld.Link) bool {
+	return isLinkingPIC(ctxt)
+}
+
+// Determine if this is linking a position-independent binary.
+func isLinkingPIC(ctxt *ld.Link) bool {
 	switch ctxt.BuildMode {
 	case ld.BuildModeCArchive, ld.BuildModeCShared, ld.BuildModePIE, ld.BuildModeShared, ld.BuildModePlugin:
 		return true
@@ -1025,14 +1265,21 @@
 	P := make([]byte, tramp.Size())
 	var o1, o2 uint32
 
+	// ELFv2 save/restore functions use R0/R12 in special ways, therefore trampolines
+	// as generated here will not always work correctly.
+	if strings.HasPrefix(ldr.SymName(target), "runtime.elf_") {
+		log.Fatalf("Internal linker does not support trampolines to ELFv2 ABI"+
+			" register save/restore function %s", ldr.SymName(target))
+	}
+
 	if ctxt.IsAIX() {
 		// On AIX, the address is retrieved with a TOC symbol.
 		// For internal linking, the "Linux" way might still be used.
 		// However, all text symbols are accessed with a TOC symbol as
 		// text relocations aren't supposed to be possible.
 		// So, keep using the external linking way to be more AIX friendly.
-		o1 = uint32(0x3c000000) | 12<<21 | 2<<16  // addis r12,  r2, toctargetaddr hi
-		o2 = uint32(0xe8000000) | 12<<21 | 12<<16 // ld    r12, r12, toctargetaddr lo
+		o1 = uint32(OP_ADDIS_R12_R2) // addis r12,  r2, toctargetaddr hi
+		o2 = uint32(OP_LD_R12_R12)   // ld    r12, r12, toctargetaddr lo
 
 		toctramp := ldr.CreateSymForUpdate("TOC."+ldr.SymName(tramp.Sym()), 0)
 		toctramp.SetType(sym.SXCOFFTOC)
@@ -1042,19 +1289,23 @@
 		r.SetOff(0)
 		r.SetSiz(8) // generates 2 relocations: HA + LO
 		r.SetSym(toctramp.Sym())
+	} else if hasPCrel {
+		// pla r12, addr (PCrel). This works for static or PIC, with or without a valid TOC pointer.
+		o1 = uint32(OP_PLA_PFX)
+		o2 = uint32(OP_PLA_SFX_R12) // pla r12, addr
+
+		// The trampoline's position is not known yet, insert a relocation.
+		r, _ := tramp.AddRel(objabi.R_ADDRPOWER_PCREL34)
+		r.SetOff(0)
+		r.SetSiz(8) // This spans 2 words.
+		r.SetSym(target)
+		r.SetAdd(offset)
 	} else {
 		// Used for default build mode for an executable
 		// Address of the call target is generated using
 		// relocation and doesn't depend on r2 (TOC).
-		o1 = uint32(0x3c000000) | 12<<21          // lis  r12,targetaddr hi
-		o2 = uint32(0x38000000) | 12<<21 | 12<<16 // addi r12,r12,targetaddr lo
-
-		// ELFv2 save/restore functions use R0/R12 in special ways, therefore trampolines
-		// as generated here will not always work correctly.
-		if strings.HasPrefix(ldr.SymName(target), "runtime.elf_") {
-			log.Fatalf("Internal linker does not support trampolines to ELFv2 ABI"+
-				" register save/restore function %s", ldr.SymName(target))
-		}
+		o1 = uint32(OP_LIS_R12)      // lis  r12,targetaddr hi
+		o2 = uint32(OP_ADDI_R12_R12) // addi r12,r12,targetaddr lo
 
 		t := ldr.SymValue(target)
 		if t == 0 || r2Valid(ctxt) || ctxt.IsExternal() {
@@ -1077,8 +1328,8 @@
 		}
 	}
 
-	o3 := uint32(0x7c0903a6) | 12<<21 // mtctr r12
-	o4 := uint32(0x4e800420)          // bctr
+	o3 := uint32(OP_MTCTR_R12) // mtctr r12
+	o4 := uint32(OP_BCTR)      // bctr
 	ctxt.Arch.ByteOrder.PutUint32(P, o1)
 	ctxt.Arch.ByteOrder.PutUint32(P[4:], o2)
 	ctxt.Arch.ByteOrder.PutUint32(P[8:], o3)
@@ -1151,7 +1402,7 @@
 			if !target.IsAIX() {
 				return val, nExtReloc, false
 			}
-		case objabi.R_POWER_TLS, objabi.R_POWER_TLS_IE_PCREL34, objabi.R_POWER_TLS_LE_TPREL34:
+		case objabi.R_POWER_TLS, objabi.R_POWER_TLS_IE_PCREL34, objabi.R_POWER_TLS_LE_TPREL34, objabi.R_ADDRPOWER_GOT_PCREL34:
 			nExtReloc = 1
 			return val, nExtReloc, true
 		case objabi.R_POWER_TLS_LE, objabi.R_POWER_TLS_IE:
@@ -1165,7 +1416,7 @@
 					ldr.Errorf(s, "relocation for %s+%d is not an addis/addi pair: %16x", ldr.SymName(rs), r.Off(), uint64(val))
 				}
 				nval := (int64(uint32(0x380d0000)) | val&0x03e00000) << 32 // addi rX, r13, $0
-				nval |= int64(0x60000000)                                  // nop
+				nval |= int64(OP_NOP)                                      // nop
 				val = nval
 				nExtReloc = 1
 			} else {
@@ -1202,10 +1453,10 @@
 
 		tgtName := ldr.SymName(rs)
 
-		// If we are linking PIE or shared code, all golang generated object files have an extra 2 instruction prologue
+		// If we are linking PIE or shared code, non-PCrel golang generated object files have an extra 2 instruction prologue
 		// to regenerate the TOC pointer from R12.  The exception are two special case functions tested below.  Note,
 		// local call offsets for externally generated objects are accounted for when converting into golang relocs.
-		if !ldr.AttrExternal(rs) && ldr.AttrShared(rs) && tgtName != "runtime.duffzero" && tgtName != "runtime.duffcopy" {
+		if !hasPCrel && !ldr.AttrExternal(rs) && ldr.AttrShared(rs) && tgtName != "runtime.duffzero" && tgtName != "runtime.duffcopy" {
 			// Furthermore, only apply the offset if the target looks like the start of a function call.
 			if r.Add() == 0 && ldr.SymType(rs) == sym.STEXT {
 				t += 8
@@ -1258,7 +1509,6 @@
 		// addis to, r0, x@tprel@ha
 		// addi to, to, x@tprel@l(to)
 
-		const OP_ADDI = 14 << 26
 		const OP_MASK = 0x3F << 26
 		const OP_RA_MASK = 0x1F << 16
 		// convert r2 to r0, and ld to addi
@@ -1410,6 +1660,7 @@
 		objabi.R_ADDRPOWER_TOCREL,
 		objabi.R_ADDRPOWER_TOCREL_DS,
 		objabi.R_ADDRPOWER_GOT,
+		objabi.R_ADDRPOWER_GOT_PCREL34,
 		objabi.R_ADDRPOWER_PCREL,
 		objabi.R_ADDRPOWER_D34,
 		objabi.R_ADDRPOWER_PCREL34:
@@ -1478,10 +1729,10 @@
 	// resolver is known.
 	//
 	// This stub is PIC, so first get the PC of label 1 into r11.
-	glink.AddUint32(ctxt.Arch, 0x7c0802a6) // mflr r0
-	glink.AddUint32(ctxt.Arch, 0x429f0005) // bcl 20,31,1f
+	glink.AddUint32(ctxt.Arch, OP_MFLR_R0) // mflr r0
+	glink.AddUint32(ctxt.Arch, OP_BCL_NIA) // bcl 20,31,1f
 	glink.AddUint32(ctxt.Arch, 0x7d6802a6) // 1: mflr r11
-	glink.AddUint32(ctxt.Arch, 0x7c0803a6) // mtlr r0
+	glink.AddUint32(ctxt.Arch, OP_MTLR_R0) // mtlr r0
 
 	// Compute the .plt array index from the entry point address
 	// into r0. This is computed relative to label 1 above.
@@ -1501,8 +1752,8 @@
 	glink.AddUint32(ctxt.Arch, 0xe96b0008) // ld r11,8(r11)
 
 	// Jump to the dynamic resolver
-	glink.AddUint32(ctxt.Arch, 0x7d8903a6) // mtctr r12
-	glink.AddUint32(ctxt.Arch, 0x4e800420) // bctr
+	glink.AddUint32(ctxt.Arch, OP_MTCTR_R12) // mtctr r12
+	glink.AddUint32(ctxt.Arch, OP_BCTR)      // bctr
 
 	// Store the PC-rel offset to the PLT
 	r, _ := glink.AddRel(objabi.R_PCREL)
diff --git a/src/cmd/link/internal/ppc64/obj.go b/src/cmd/link/internal/ppc64/obj.go
index f580c55..3fc6622 100644
--- a/src/cmd/link/internal/ppc64/obj.go
+++ b/src/cmd/link/internal/ppc64/obj.go
@@ -61,22 +61,25 @@
 		Archreloc:        archreloc,
 		Archrelocvariant: archrelocvariant,
 		Extreloc:         extreloc,
-		Elfreloc1:        elfreloc1,
-		ElfrelocSize:     24,
-		Elfsetupplt:      elfsetupplt,
 		Gentext:          gentext,
 		Trampoline:       trampoline,
 		Machoreloc1:      machoreloc1,
 		Xcoffreloc1:      xcoffreloc1,
 
-		Linuxdynld:     dynld,
-		LinuxdynldMusl: musl,
+		ELF: ld.ELFArch{
+			Linuxdynld:     dynld,
+			LinuxdynldMusl: musl,
 
-		Freebsddynld:   "XXX",
-		Openbsddynld:   "XXX",
-		Netbsddynld:    "XXX",
-		Dragonflydynld: "XXX",
-		Solarisdynld:   "XXX",
+			Freebsddynld:   "XXX",
+			Openbsddynld:   "XXX",
+			Netbsddynld:    "XXX",
+			Dragonflydynld: "XXX",
+			Solarisdynld:   "XXX",
+
+			Reloc1:    elfreloc1,
+			RelocSize: 24,
+			SetupPLT:  elfsetupplt,
+		},
 	}
 
 	return arch, theArch
diff --git a/src/cmd/link/internal/riscv64/asm.go b/src/cmd/link/internal/riscv64/asm.go
index cb53a60..6b5c0cb 100644
--- a/src/cmd/link/internal/riscv64/asm.go
+++ b/src/cmd/link/internal/riscv64/asm.go
@@ -119,7 +119,7 @@
 		// HI20 PC-relative relocation text symbol, which in turn points to the
 		// given symbol. For further details see the ELF specification for RISC-V:
 		//
-		//   https://github.com/riscv/riscv-elf-psabi-doc/blob/master/riscv-elf.md#pc-relative-symbol-addresses
+		//   https://github.com/riscv-non-isa/riscv-elf-psabi-doc/blob/master/riscv-elf.adoc#pc-relative-symbol-addresses
 		//
 		var hiRel, loRel elf.R_RISCV
 		switch r.Type {
diff --git a/src/cmd/link/internal/riscv64/obj.go b/src/cmd/link/internal/riscv64/obj.go
index 8e4e41f..6230bd6 100644
--- a/src/cmd/link/internal/riscv64/obj.go
+++ b/src/cmd/link/internal/riscv64/obj.go
@@ -24,9 +24,6 @@
 		Archreloc:        archreloc,
 		Archrelocvariant: archrelocvariant,
 		Extreloc:         extreloc,
-		Elfreloc1:        elfreloc1,
-		ElfrelocSize:     24,
-		Elfsetupplt:      elfsetupplt,
 
 		// TrampLimit is set such that we always run the trampoline
 		// generation code. This is necessary since calls to external
@@ -39,13 +36,19 @@
 		GenSymsLate: genSymsLate,
 		Machoreloc1: machoreloc1,
 
-		Linuxdynld: "/lib/ld.so.1",
+		ELF: ld.ELFArch{
+			Linuxdynld: "/lib/ld.so.1",
 
-		Freebsddynld:   "/usr/libexec/ld-elf.so.1",
-		Netbsddynld:    "XXX",
-		Openbsddynld:   "XXX",
-		Dragonflydynld: "XXX",
-		Solarisdynld:   "XXX",
+			Freebsddynld:   "/usr/libexec/ld-elf.so.1",
+			Netbsddynld:    "XXX",
+			Openbsddynld:   "XXX",
+			Dragonflydynld: "XXX",
+			Solarisdynld:   "XXX",
+
+			Reloc1:    elfreloc1,
+			RelocSize: 24,
+			SetupPLT:  elfsetupplt,
+		},
 	}
 
 	return arch, theArch
diff --git a/src/cmd/link/internal/s390x/obj.go b/src/cmd/link/internal/s390x/obj.go
index 3aa8948..c2386fb 100644
--- a/src/cmd/link/internal/s390x/obj.go
+++ b/src/cmd/link/internal/s390x/obj.go
@@ -50,21 +50,24 @@
 		Archinit:         archinit,
 		Archreloc:        archreloc,
 		Archrelocvariant: archrelocvariant,
-		Elfreloc1:        elfreloc1,
-		ElfrelocSize:     24,
-		Elfsetupplt:      elfsetupplt,
 		Gentext:          gentext,
 		Machoreloc1:      machoreloc1,
 
-		Linuxdynld:     "/lib64/ld64.so.1",
-		LinuxdynldMusl: "/lib/ld-musl-s390x.so.1",
+		ELF: ld.ELFArch{
+			Linuxdynld:     "/lib64/ld64.so.1",
+			LinuxdynldMusl: "/lib/ld-musl-s390x.so.1",
 
-		// not relevant for s390x
-		Freebsddynld:   "XXX",
-		Openbsddynld:   "XXX",
-		Netbsddynld:    "XXX",
-		Dragonflydynld: "XXX",
-		Solarisdynld:   "XXX",
+			// not relevant for s390x
+			Freebsddynld:   "XXX",
+			Openbsddynld:   "XXX",
+			Netbsddynld:    "XXX",
+			Dragonflydynld: "XXX",
+			Solarisdynld:   "XXX",
+
+			Reloc1:    elfreloc1,
+			RelocSize: 24,
+			SetupPLT:  elfsetupplt,
+		},
 	}
 
 	return arch, theArch
diff --git a/src/cmd/link/internal/sym/symkind.go b/src/cmd/link/internal/sym/symkind.go
index 2f8e8fe..77dbf75 100644
--- a/src/cmd/link/internal/sym/symkind.go
+++ b/src/cmd/link/internal/sym/symkind.go
@@ -123,6 +123,10 @@
 	SDWARFRANGE
 	SDWARFLOC
 	SDWARFLINES
+
+	// SEH symbol types
+	SSEHUNWINDINFO
+	SSEHSECT
 )
 
 // AbiSymKindToSymKind maps values read from object files (which are
@@ -148,6 +152,7 @@
 	objabi.SLIBFUZZER_8BIT_COUNTER: SLIBFUZZER_8BIT_COUNTER,
 	objabi.SCOVERAGE_COUNTER:       SCOVERAGE_COUNTER,
 	objabi.SCOVERAGE_AUXVAR:        SCOVERAGE_AUXVAR,
+	objabi.SSEHUNWINDINFO:          SSEHUNWINDINFO,
 }
 
 // ReadOnly are the symbol kinds that form read-only sections. In some
diff --git a/src/cmd/link/internal/sym/symkind_string.go b/src/cmd/link/internal/sym/symkind_string.go
index 1cd7ab1..62b4fd9 100644
--- a/src/cmd/link/internal/sym/symkind_string.go
+++ b/src/cmd/link/internal/sym/symkind_string.go
@@ -1,4 +1,4 @@
-// Code generated by "stringer -type=SymKind symkind.go"; DO NOT EDIT.
+// Code generated by "stringer -type=SymKind"; DO NOT EDIT.
 
 package sym
 
@@ -67,11 +67,13 @@
 	_ = x[SDWARFRANGE-56]
 	_ = x[SDWARFLOC-57]
 	_ = x[SDWARFLINES-58]
+	_ = x[SSEHUNWINDINFO-59]
+	_ = x[SSEHSECT-60]
 }
 
-const _SymKind_name = "SxxxSTEXTSELFRXSECTSMACHOPLTSTYPESSTRINGSGOSTRINGSGOFUNCSGCBITSSRODATASFUNCTABSELFROSECTSTYPERELROSSTRINGRELROSGOSTRINGRELROSGOFUNCRELROSGCBITSRELROSRODATARELROSFUNCTABRELROSTYPELINKSITABLINKSSYMTABSPCLNTABSFirstWritableSBUILDINFOSELFSECTSMACHOSMACHOGOTSWINDOWSSELFGOTSNOPTRDATASINITARRSDATASXCOFFTOCSBSSSNOPTRBSSSLIBFUZZER_8BIT_COUNTERSCOVERAGE_COUNTERSCOVERAGE_AUXVARSTLSBSSSXREFSMACHOSYMSTRSMACHOSYMTABSMACHOINDIRECTPLTSMACHOINDIRECTGOTSFILEPATHSDYNIMPORTSHOSTOBJSUNDEFEXTSDWARFSECTSDWARFCUINFOSDWARFCONSTSDWARFFCNSDWARFABSFCNSDWARFTYPESDWARFVARSDWARFRANGESDWARFLOCSDWARFLINES"
+const _SymKind_name = "SxxxSTEXTSELFRXSECTSMACHOPLTSTYPESSTRINGSGOSTRINGSGOFUNCSGCBITSSRODATASFUNCTABSELFROSECTSTYPERELROSSTRINGRELROSGOSTRINGRELROSGOFUNCRELROSGCBITSRELROSRODATARELROSFUNCTABRELROSTYPELINKSITABLINKSSYMTABSPCLNTABSFirstWritableSBUILDINFOSELFSECTSMACHOSMACHOGOTSWINDOWSSELFGOTSNOPTRDATASINITARRSDATASXCOFFTOCSBSSSNOPTRBSSSLIBFUZZER_8BIT_COUNTERSCOVERAGE_COUNTERSCOVERAGE_AUXVARSTLSBSSSXREFSMACHOSYMSTRSMACHOSYMTABSMACHOINDIRECTPLTSMACHOINDIRECTGOTSFILEPATHSDYNIMPORTSHOSTOBJSUNDEFEXTSDWARFSECTSDWARFCUINFOSDWARFCONSTSDWARFFCNSDWARFABSFCNSDWARFTYPESDWARFVARSDWARFRANGESDWARFLOCSDWARFLINESSSEHUNWINDINFOSSEHSECT"
 
-var _SymKind_index = [...]uint16{0, 4, 9, 19, 28, 33, 40, 49, 56, 63, 70, 78, 88, 98, 110, 124, 136, 148, 160, 173, 182, 191, 198, 206, 220, 230, 238, 244, 253, 261, 268, 278, 286, 291, 300, 304, 313, 336, 353, 369, 376, 381, 393, 405, 422, 439, 448, 458, 466, 475, 485, 497, 508, 517, 529, 539, 548, 559, 568, 579}
+var _SymKind_index = [...]uint16{0, 4, 9, 19, 28, 33, 40, 49, 56, 63, 70, 78, 88, 98, 110, 124, 136, 148, 160, 173, 182, 191, 198, 206, 220, 230, 238, 244, 253, 261, 268, 278, 286, 291, 300, 304, 313, 336, 353, 369, 376, 381, 393, 405, 422, 439, 448, 458, 466, 475, 485, 497, 508, 517, 529, 539, 548, 559, 568, 579, 593, 601}
 
 func (i SymKind) String() string {
 	if i >= SymKind(len(_SymKind_index)-1) {
diff --git a/src/cmd/link/internal/wasm/asm.go b/src/cmd/link/internal/wasm/asm.go
index 99018c8..413a809 100644
--- a/src/cmd/link/internal/wasm/asm.go
+++ b/src/cmd/link/internal/wasm/asm.go
@@ -6,10 +6,14 @@
 
 import (
 	"bytes"
+	"cmd/internal/obj"
+	"cmd/internal/obj/wasm"
 	"cmd/internal/objabi"
 	"cmd/link/internal/ld"
 	"cmd/link/internal/loader"
 	"cmd/link/internal/sym"
+	"encoding/binary"
+	"fmt"
 	"internal/buildcfg"
 	"io"
 	"regexp"
@@ -44,9 +48,10 @@
 }
 
 type wasmFunc struct {
-	Name string
-	Type uint32
-	Code []byte
+	Module string
+	Name   string
+	Type   uint32
+	Code   []byte
 }
 
 type wasmFuncType struct {
@@ -54,20 +59,83 @@
 	Results []byte
 }
 
+func readWasmImport(ldr *loader.Loader, s loader.Sym) obj.WasmImport {
+	reportError := func(err error) { panic(fmt.Sprintf("failed to read WASM import in sym %v: %v", s, err)) }
+
+	data := ldr.Data(s)
+
+	readUint32 := func() (v uint32) {
+		v = binary.LittleEndian.Uint32(data)
+		data = data[4:]
+		return
+	}
+
+	readUint64 := func() (v uint64) {
+		v = binary.LittleEndian.Uint64(data)
+		data = data[8:]
+		return
+	}
+
+	readByte := func() byte {
+		if len(data) == 0 {
+			reportError(io.EOF)
+		}
+
+		b := data[0]
+		data = data[1:]
+		return b
+	}
+
+	readString := func() string {
+		n := readUint32()
+
+		s := string(data[:n])
+
+		data = data[n:]
+
+		return s
+	}
+
+	var wi obj.WasmImport
+	wi.Module = readString()
+	wi.Name = readString()
+	wi.Params = make([]obj.WasmField, readUint32())
+	for i := range wi.Params {
+		wi.Params[i].Type = obj.WasmFieldType(readByte())
+		wi.Params[i].Offset = int64(readUint64())
+	}
+	wi.Results = make([]obj.WasmField, readUint32())
+	for i := range wi.Results {
+		wi.Results[i].Type = obj.WasmFieldType(readByte())
+		wi.Results[i].Offset = int64(readUint64())
+	}
+	return wi
+}
+
 var wasmFuncTypes = map[string]*wasmFuncType{
-	"_rt0_wasm_js":           {Params: []byte{}},                                         //
-	"wasm_export_run":        {Params: []byte{I32, I32}},                                 // argc, argv
-	"wasm_export_resume":     {Params: []byte{}},                                         //
-	"wasm_export_getsp":      {Results: []byte{I32}},                                     // sp
-	"wasm_pc_f_loop":         {Params: []byte{}},                                         //
-	"runtime.wasmDiv":        {Params: []byte{I64, I64}, Results: []byte{I64}},           // x, y -> x/y
-	"runtime.wasmTruncS":     {Params: []byte{F64}, Results: []byte{I64}},                // x -> int(x)
-	"runtime.wasmTruncU":     {Params: []byte{F64}, Results: []byte{I64}},                // x -> uint(x)
-	"runtime.gcWriteBarrier": {Params: []byte{I64, I64}},                                 // ptr, val
-	"cmpbody":                {Params: []byte{I64, I64, I64, I64}, Results: []byte{I64}}, // a, alen, b, blen -> -1/0/1
-	"memeqbody":              {Params: []byte{I64, I64, I64}, Results: []byte{I64}},      // a, b, len -> 0/1
-	"memcmp":                 {Params: []byte{I32, I32, I32}, Results: []byte{I32}},      // a, b, len -> <0/0/>0
-	"memchr":                 {Params: []byte{I32, I32, I32}, Results: []byte{I32}},      // s, c, len -> index
+	"_rt0_wasm_js":            {Params: []byte{}},                                         //
+	"_rt0_wasm_wasip1":        {Params: []byte{}},                                         //
+	"wasm_export__start":      {},                                                         //
+	"wasm_export_run":         {Params: []byte{I32, I32}},                                 // argc, argv
+	"wasm_export_resume":      {Params: []byte{}},                                         //
+	"wasm_export_getsp":       {Results: []byte{I32}},                                     // sp
+	"wasm_pc_f_loop":          {Params: []byte{}},                                         //
+	"runtime.wasmDiv":         {Params: []byte{I64, I64}, Results: []byte{I64}},           // x, y -> x/y
+	"runtime.wasmTruncS":      {Params: []byte{F64}, Results: []byte{I64}},                // x -> int(x)
+	"runtime.wasmTruncU":      {Params: []byte{F64}, Results: []byte{I64}},                // x -> uint(x)
+	"gcWriteBarrier":          {Params: []byte{I64}, Results: []byte{I64}},                // #bytes -> bufptr
+	"runtime.gcWriteBarrier1": {Results: []byte{I64}},                                     // -> bufptr
+	"runtime.gcWriteBarrier2": {Results: []byte{I64}},                                     // -> bufptr
+	"runtime.gcWriteBarrier3": {Results: []byte{I64}},                                     // -> bufptr
+	"runtime.gcWriteBarrier4": {Results: []byte{I64}},                                     // -> bufptr
+	"runtime.gcWriteBarrier5": {Results: []byte{I64}},                                     // -> bufptr
+	"runtime.gcWriteBarrier6": {Results: []byte{I64}},                                     // -> bufptr
+	"runtime.gcWriteBarrier7": {Results: []byte{I64}},                                     // -> bufptr
+	"runtime.gcWriteBarrier8": {Results: []byte{I64}},                                     // -> bufptr
+	"cmpbody":                 {Params: []byte{I64, I64, I64, I64}, Results: []byte{I64}}, // a, alen, b, blen -> -1/0/1
+	"memeqbody":               {Params: []byte{I64, I64, I64}, Results: []byte{I64}},      // a, b, len -> 0/1
+	"memcmp":                  {Params: []byte{I32, I32, I32}, Results: []byte{I32}},      // a, b, len -> <0/0/>0
+	"memchr":                  {Params: []byte{I32, I32, I32}, Results: []byte{I32}},      // s, c, len -> index
 }
 
 func assignAddress(ldr *loader.Loader, sect *sym.Section, n int, s loader.Sym, va uint64, isTramp bool) (*sym.Section, int, uint64) {
@@ -128,23 +196,30 @@
 	}
 
 	// collect host imports (functions that get imported from the WebAssembly host, usually JavaScript)
-	hostImports := []*wasmFunc{
-		{
-			Name: "debug",
-			Type: lookupType(&wasmFuncType{Params: []byte{I32}}, &types),
-		},
-	}
+	// we store the import index of each imported function, so the R_WASMIMPORT relocation
+	// can write the correct index after a "call" instruction
+	// these are added as import statements to the top of the WebAssembly binary
+	var hostImports []*wasmFunc
 	hostImportMap := make(map[loader.Sym]int64)
 	for _, fn := range ctxt.Textp {
 		relocs := ldr.Relocs(fn)
 		for ri := 0; ri < relocs.Count(); ri++ {
 			r := relocs.At(ri)
 			if r.Type() == objabi.R_WASMIMPORT {
-				hostImportMap[r.Sym()] = int64(len(hostImports))
-				hostImports = append(hostImports, &wasmFunc{
-					Name: ldr.SymName(r.Sym()),
-					Type: lookupType(&wasmFuncType{Params: []byte{I32}}, &types),
-				})
+				if lsym, ok := ldr.WasmImportSym(fn); ok {
+					wi := readWasmImport(ldr, lsym)
+					hostImportMap[fn] = int64(len(hostImports))
+					hostImports = append(hostImports, &wasmFunc{
+						Module: wi.Module,
+						Name:   wi.Name,
+						Type: lookupType(&wasmFuncType{
+							Params:  fieldsToTypes(wi.Params),
+							Results: fieldsToTypes(wi.Results),
+						}, &types),
+					})
+				} else {
+					panic(fmt.Sprintf("missing wasm symbol for %s", ldr.SymName(r.Sym())))
+				}
 			}
 		}
 	}
@@ -280,7 +355,11 @@
 
 	writeUleb128(ctxt.Out, uint64(len(hostImports))) // number of imports
 	for _, fn := range hostImports {
-		writeName(ctxt.Out, "go") // provided by the import object in wasm_exec.js
+		if fn.Module != "" {
+			writeName(ctxt.Out, fn.Module)
+		} else {
+			writeName(ctxt.Out, wasm.GojsModule) // provided by the import object in wasm_exec.js
+		}
 		writeName(ctxt.Out, fn.Name)
 		ctxt.Out.WriteByte(0x00) // func import
 		writeUleb128(ctxt.Out, uint64(fn.Type))
@@ -373,20 +452,33 @@
 func writeExportSec(ctxt *ld.Link, ldr *loader.Loader, lenHostImports int) {
 	sizeOffset := writeSecHeader(ctxt, sectionExport)
 
-	writeUleb128(ctxt.Out, 4) // number of exports
-
-	for _, name := range []string{"run", "resume", "getsp"} {
-		s := ldr.Lookup("wasm_export_"+name, 0)
+	switch buildcfg.GOOS {
+	case "wasip1":
+		writeUleb128(ctxt.Out, 2) // number of exports
+		s := ldr.Lookup("_rt0_wasm_wasip1", 0)
 		idx := uint32(lenHostImports) + uint32(ldr.SymValue(s)>>16) - funcValueOffset
-		writeName(ctxt.Out, name)           // inst.exports.run/resume/getsp in wasm_exec.js
+		writeName(ctxt.Out, "_start")       // the wasi entrypoint
 		ctxt.Out.WriteByte(0x00)            // func export
 		writeUleb128(ctxt.Out, uint64(idx)) // funcidx
+		writeName(ctxt.Out, "memory")       // memory in wasi
+		ctxt.Out.WriteByte(0x02)            // mem export
+		writeUleb128(ctxt.Out, 0)           // memidx
+	case "js":
+		writeUleb128(ctxt.Out, 4) // number of exports
+		for _, name := range []string{"run", "resume", "getsp"} {
+			s := ldr.Lookup("wasm_export_"+name, 0)
+			idx := uint32(lenHostImports) + uint32(ldr.SymValue(s)>>16) - funcValueOffset
+			writeName(ctxt.Out, name)           // inst.exports.run/resume/getsp in wasm_exec.js
+			ctxt.Out.WriteByte(0x00)            // func export
+			writeUleb128(ctxt.Out, uint64(idx)) // funcidx
+		}
+		writeName(ctxt.Out, "mem") // inst.exports.mem in wasm_exec.js
+		ctxt.Out.WriteByte(0x02)   // mem export
+		writeUleb128(ctxt.Out, 0)  // memidx
+	default:
+		ld.Exitf("internal error: writeExportSec: unrecognized GOOS %s", buildcfg.GOOS)
 	}
 
-	writeName(ctxt.Out, "mem") // inst.exports.mem in wasm_exec.js
-	ctxt.Out.WriteByte(0x02)   // mem export
-	writeUleb128(ctxt.Out, 0)  // memidx
-
 	writeSecSize(ctxt, sizeOffset)
 }
 
@@ -602,3 +694,22 @@
 		w.WriteByte(c)
 	}
 }
+
+func fieldsToTypes(fields []obj.WasmField) []byte {
+	b := make([]byte, len(fields))
+	for i, f := range fields {
+		switch f.Type {
+		case obj.WasmI32, obj.WasmPtr:
+			b[i] = I32
+		case obj.WasmI64:
+			b[i] = I64
+		case obj.WasmF32:
+			b[i] = F32
+		case obj.WasmF64:
+			b[i] = F64
+		default:
+			panic(fmt.Sprintf("fieldsToTypes: unknown field type: %d", f.Type))
+		}
+	}
+	return b
+}
diff --git a/src/cmd/link/internal/x86/asm.go b/src/cmd/link/internal/x86/asm.go
index 3a33201..fa5ad67 100644
--- a/src/cmd/link/internal/x86/asm.go
+++ b/src/cmd/link/internal/x86/asm.go
@@ -399,6 +399,9 @@
 	case objabi.R_ADDR:
 		v = ld.IMAGE_REL_I386_DIR32
 
+	case objabi.R_PEIMAGEOFF:
+		v = ld.IMAGE_REL_I386_DIR32NB
+
 	case objabi.R_CALL,
 		objabi.R_PCREL:
 		v = ld.IMAGE_REL_I386_REL32
diff --git a/src/cmd/link/internal/x86/obj.go b/src/cmd/link/internal/x86/obj.go
index b0a129e..6ccb8e0 100644
--- a/src/cmd/link/internal/x86/obj.go
+++ b/src/cmd/link/internal/x86/obj.go
@@ -54,19 +54,22 @@
 		Archinit:         archinit,
 		Archreloc:        archreloc,
 		Archrelocvariant: archrelocvariant,
-		Elfreloc1:        elfreloc1,
-		ElfrelocSize:     8,
-		Elfsetupplt:      elfsetupplt,
 		Gentext:          gentext,
 		Machoreloc1:      machoreloc1,
 		PEreloc1:         pereloc1,
 
-		Linuxdynld:     "/lib/ld-linux.so.2",
-		LinuxdynldMusl: "/lib/ld-musl-i386.so.1",
-		Freebsddynld:   "/usr/libexec/ld-elf.so.1",
-		Openbsddynld:   "/usr/libexec/ld.so",
-		Netbsddynld:    "/usr/libexec/ld.elf_so",
-		Solarisdynld:   "/lib/ld.so.1",
+		ELF: ld.ELFArch{
+			Linuxdynld:     "/lib/ld-linux.so.2",
+			LinuxdynldMusl: "/lib/ld-musl-i386.so.1",
+			Freebsddynld:   "/usr/libexec/ld-elf.so.1",
+			Openbsddynld:   "/usr/libexec/ld.so",
+			Netbsddynld:    "/usr/libexec/ld.elf_so",
+			Solarisdynld:   "/lib/ld.so.1",
+
+			Reloc1:    elfreloc1,
+			RelocSize: 8,
+			SetupPLT:  elfsetupplt,
+		},
 	}
 
 	return arch, theArch
diff --git a/src/cmd/link/link_test.go b/src/cmd/link/link_test.go
index a770c91..c37d6e5 100644
--- a/src/cmd/link/link_test.go
+++ b/src/cmd/link/link_test.go
@@ -8,7 +8,6 @@
 	"bufio"
 	"bytes"
 	"debug/macho"
-	"internal/buildcfg"
 	"internal/platform"
 	"internal/testenv"
 	"os"
@@ -17,6 +16,8 @@
 	"runtime"
 	"strings"
 	"testing"
+
+	"cmd/internal/sys"
 )
 
 var AuthorPaidByTheColumnInch struct {
@@ -40,6 +41,7 @@
 	t.Parallel()
 
 	testenv.MustHaveGoBuild(t)
+	testenv.MustInternalLink(t, false)
 
 	const source = `
 package main
@@ -48,15 +50,16 @@
 `
 
 	tmpdir := t.TempDir()
+	main := filepath.Join(tmpdir, "main.go")
 
-	importcfgfile := filepath.Join(tmpdir, "importcfg")
-	testenv.WriteImportcfg(t, importcfgfile, nil)
-
-	err := os.WriteFile(filepath.Join(tmpdir, "main.go"), []byte(source), 0666)
+	err := os.WriteFile(main, []byte(source), 0666)
 	if err != nil {
 		t.Fatalf("failed to write main.go: %v\n", err)
 	}
 
+	importcfgfile := filepath.Join(tmpdir, "importcfg")
+	testenv.WriteImportcfg(t, importcfgfile, nil, main)
+
 	cmd := testenv.Command(t, testenv.GoToolPath(t), "tool", "compile", "-importcfg="+importcfgfile, "-p=main", "main.go")
 	cmd.Dir = tmpdir
 	out, err := cmd.CombinedOutput()
@@ -68,6 +71,9 @@
 	cmd.Dir = tmpdir
 	out, err = cmd.CombinedOutput()
 	if err != nil {
+		if runtime.GOOS == "android" && runtime.GOARCH == "arm64" {
+			testenv.SkipFlaky(t, 58806)
+		}
 		t.Fatalf("failed to link main.o: %v, output: %s\n", err, out)
 	}
 }
@@ -80,6 +86,7 @@
 	t.Parallel()
 
 	testenv.MustHaveGoBuild(t)
+	testenv.MustInternalLink(t, false)
 
 	tmpdir := t.TempDir()
 
@@ -95,16 +102,18 @@
 		cmd.Dir = tmpdir
 		out, err := cmd.CombinedOutput()
 		if err != nil {
+			if len(args) >= 2 && args[1] == "link" && runtime.GOOS == "android" && runtime.GOARCH == "arm64" {
+				testenv.SkipFlaky(t, 58806)
+			}
 			t.Fatalf("'go %s' failed: %v, output: %s",
 				strings.Join(args, " "), err, out)
 		}
 	}
 
-	importcfgfile := filepath.Join(tmpdir, "importcfg")
-	testenv.WriteImportcfg(t, importcfgfile, nil)
-
 	// Compile a main package.
 	write("main.go", "package main; func main() {}")
+	importcfgfile := filepath.Join(tmpdir, "importcfg")
+	testenv.WriteImportcfg(t, importcfgfile, nil, filepath.Join(tmpdir, "main.go"))
 	runGo("tool", "compile", "-importcfg="+importcfgfile, "-p=main", "main.go")
 	runGo("tool", "pack", "c", "main.a", "main.o")
 
@@ -175,19 +184,7 @@
 func TestIssue33979(t *testing.T) {
 	testenv.MustHaveGoBuild(t)
 	testenv.MustHaveCGO(t)
-	testenv.MustInternalLink(t)
-
-	// Skip test on platforms that do not support cgo internal linking.
-	switch runtime.GOARCH {
-	case "loong64":
-		t.Skipf("Skipping on %s/%s", runtime.GOOS, runtime.GOARCH)
-	case "mips", "mipsle", "mips64", "mips64le":
-		t.Skipf("Skipping on %s/%s", runtime.GOOS, runtime.GOARCH)
-	}
-	if runtime.GOOS == "aix" ||
-		runtime.GOOS == "windows" && runtime.GOARCH == "arm64" {
-		t.Skipf("Skipping on %s/%s", runtime.GOOS, runtime.GOARCH)
-	}
+	testenv.MustInternalLink(t, true)
 
 	t.Parallel()
 
@@ -242,7 +239,7 @@
 	cflags := strings.Fields(runGo("env", "GOGCCFLAGS"))
 
 	importcfgfile := filepath.Join(tmpdir, "importcfg")
-	testenv.WriteImportcfg(t, importcfgfile, nil)
+	testenv.WriteImportcfg(t, importcfgfile, nil, "runtime")
 
 	// Compile, assemble and pack the Go and C code.
 	runGo("tool", "asm", "-p=main", "-gensymabis", "-o", "symabis", "x.s")
@@ -570,7 +567,8 @@
 }
 `
 
-const testFuncAlignAsmSrc = `
+var testFuncAlignAsmSources = map[string]string{
+	"arm64": `
 #include "textflag.h"
 
 TEXT	·alignPc(SB),NOSPLIT, $0-0
@@ -581,13 +579,27 @@
 
 GLOBL	·alignPcFnAddr(SB),RODATA,$8
 DATA	·alignPcFnAddr(SB)/8,$·alignPc(SB)
-`
+`,
+	"loong64": `
+#include "textflag.h"
+
+TEXT	·alignPc(SB),NOSPLIT, $0-0
+	MOVV	$2, R4
+	PCALIGN	$512
+	MOVV	$3, R5
+	RET
+
+GLOBL	·alignPcFnAddr(SB),RODATA,$8
+DATA	·alignPcFnAddr(SB)/8,$·alignPc(SB)
+`,
+}
 
 // TestFuncAlign verifies that the address of a function can be aligned
-// with a specific value on arm64.
+// with a specific value on arm64 and loong64.
 func TestFuncAlign(t *testing.T) {
-	if runtime.GOARCH != "arm64" || runtime.GOOS != "linux" {
-		t.Skip("skipping on non-linux/arm64 platform")
+	testFuncAlignAsmSrc := testFuncAlignAsmSources[runtime.GOARCH]
+	if len(testFuncAlignAsmSrc) == 0 || runtime.GOOS != "linux" {
+		t.Skip("skipping on non-linux/{arm64,loong64} platform")
 	}
 	testenv.MustHaveGoBuild(t)
 
@@ -750,8 +762,8 @@
 
 		// Test internal linking mode.
 
-		if runtime.GOARCH == "ppc64" || (runtime.GOARCH == "arm64" && runtime.GOOS == "windows") || !testenv.CanInternalLink() {
-			return // internal linking cgo is not supported
+		if !testenv.CanInternalLink(true) {
+			continue
 		}
 		cmd = testenv.Command(t, testenv.GoToolPath(t), "build", "-buildmode="+mode, "-ldflags=-debugtramp=2 -linkmode=internal", "-o", exe, src)
 		out, err = cmd.CombinedOutput()
@@ -774,6 +786,7 @@
 	// This shouldn't happen with "go build". We invoke the compiler and the linker
 	// manually, and try to "trick" the linker with an inconsistent object file.
 	testenv.MustHaveGoBuild(t)
+	testenv.MustInternalLink(t, false)
 
 	t.Parallel()
 
@@ -786,10 +799,10 @@
 	mObj := filepath.Join(tmpdir, "main.o")
 	exe := filepath.Join(tmpdir, "main.exe")
 
-	importcfgFile := filepath.Join(tmpdir, "stdlib.importcfg")
-	testenv.WriteImportcfg(t, importcfgFile, nil)
+	importcfgFile := filepath.Join(tmpdir, "runtime.importcfg")
+	testenv.WriteImportcfg(t, importcfgFile, nil, "runtime")
 	importcfgWithAFile := filepath.Join(tmpdir, "witha.importcfg")
-	testenv.WriteImportcfg(t, importcfgWithAFile, map[string]string{"a": aObj})
+	testenv.WriteImportcfg(t, importcfgWithAFile, map[string]string{"a": aObj}, "runtime")
 
 	// Build a program with main package importing package a.
 	cmd := testenv.Command(t, testenv.GoToolPath(t), "tool", "compile", "-importcfg="+importcfgFile, "-p=a", "-o", aObj, aSrc)
@@ -808,6 +821,9 @@
 	t.Log(cmd)
 	out, err = cmd.CombinedOutput()
 	if err != nil {
+		if runtime.GOOS == "android" && runtime.GOARCH == "arm64" {
+			testenv.SkipFlaky(t, 58806)
+		}
 		t.Errorf("linking failed: %v\n%s", err, out)
 	}
 
@@ -1092,7 +1108,7 @@
 	testenv.MustHaveGoBuild(t)
 	t.Parallel()
 
-	if buildcfg.Experiment.Unified {
+	if true /* was buildcfg.Experiment.Unified */ {
 		t.Skip("TODO(mdempsky): Fix ICE when importing unlinkable objects for GOEXPERIMENT=unified")
 	}
 
@@ -1150,3 +1166,46 @@
 		t.Errorf("link failed: %v. output:\n%s", err, out)
 	}
 }
+
+// TestResponseFile tests that creating a response file to pass to the
+// external linker works correctly.
+func TestResponseFile(t *testing.T) {
+	t.Parallel()
+
+	testenv.MustHaveGoBuild(t)
+
+	// This test requires -linkmode=external. Currently all
+	// systems that support cgo support -linkmode=external.
+	testenv.MustHaveCGO(t)
+
+	tmpdir := t.TempDir()
+
+	src := filepath.Join(tmpdir, "x.go")
+	if err := os.WriteFile(src, []byte(`package main; import "C"; func main() {}`), 0666); err != nil {
+		t.Fatal(err)
+	}
+
+	cmd := testenv.Command(t, testenv.GoToolPath(t), "build", "-o", "output", "x.go")
+	cmd.Dir = tmpdir
+
+	// Add enough arguments to push cmd/link into creating a response file.
+	var sb strings.Builder
+	sb.WriteString(`'-ldflags=all="-extldflags=`)
+	for i := 0; i < sys.ExecArgLengthLimit/len("-g"); i++ {
+		if i > 0 {
+			sb.WriteString(" ")
+		}
+		sb.WriteString("-g")
+	}
+	sb.WriteString(`"'`)
+	cmd = testenv.CleanCmdEnv(cmd)
+	cmd.Env = append(cmd.Env, "GOFLAGS="+sb.String())
+
+	out, err := cmd.CombinedOutput()
+	if len(out) > 0 {
+		t.Logf("%s", out)
+	}
+	if err != nil {
+		t.Error(err)
+	}
+}
diff --git a/src/cmd/nm/nm_cgo_test.go b/src/cmd/nm/nm_cgo_test.go
index 210577e..face58c 100644
--- a/src/cmd/nm/nm_cgo_test.go
+++ b/src/cmd/nm/nm_cgo_test.go
@@ -2,56 +2,25 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build cgo
-
 package main
 
 import (
-	"runtime"
+	"internal/testenv"
 	"testing"
 )
 
-func canInternalLink() bool {
-	switch runtime.GOOS {
-	case "aix":
-		return false
-	case "dragonfly":
-		return false
-	case "freebsd":
-		switch runtime.GOARCH {
-		case "arm64", "riscv64":
-			return false
-		}
-	case "linux":
-		switch runtime.GOARCH {
-		case "arm64", "loong64", "mips64", "mips64le", "mips", "mipsle", "ppc64", "ppc64le", "riscv64":
-			return false
-		}
-	case "openbsd":
-		switch runtime.GOARCH {
-		case "arm64", "mips64":
-			return false
-		}
-	case "windows":
-		switch runtime.GOARCH {
-		case "arm64":
-			return false
-		}
-	}
-	return true
-}
-
 func TestInternalLinkerCgoExec(t *testing.T) {
-	if !canInternalLink() {
-		t.Skip("skipping; internal linking is not supported")
-	}
+	testenv.MustHaveCGO(t)
+	testenv.MustInternalLink(t, true)
 	testGoExec(t, true, false)
 }
 
 func TestExternalLinkerCgoExec(t *testing.T) {
+	testenv.MustHaveCGO(t)
 	testGoExec(t, true, true)
 }
 
 func TestCgoLib(t *testing.T) {
+	testenv.MustHaveCGO(t)
 	testGoLib(t, true)
 }
diff --git a/src/cmd/nm/nm_test.go b/src/cmd/nm/nm_test.go
index 7d8358e..530a720 100644
--- a/src/cmd/nm/nm_test.go
+++ b/src/cmd/nm/nm_test.go
@@ -6,6 +6,7 @@
 
 import (
 	"internal/obscuretestdata"
+	"internal/platform"
 	"internal/testenv"
 	"os"
 	"path/filepath"
@@ -165,12 +166,10 @@
 				return true
 			}
 		}
-		if runtime.GOOS == "windows" {
+		if platform.DefaultPIE(runtime.GOOS, runtime.GOARCH, false) {
+			// Code is always relocated if the default buildmode is PIE.
 			return true
 		}
-		if runtime.GOOS == "darwin" && runtime.GOARCH == "arm64" {
-			return true // On darwin/arm64 everything is PIE
-		}
 		return false
 	}
 
@@ -198,7 +197,12 @@
 				stype = "D"
 			}
 			if want, have := stype, strings.ToUpper(f[1]); have != want {
-				t.Errorf("want %s type for %s symbol, but have %s", want, name, have)
+				if runtime.GOOS == "android" && name == "runtime.epclntab" && have == "D" {
+					// TODO(#58807): Figure out why this fails and fix up the test.
+					t.Logf("(ignoring on %s) want %s type for %s symbol, but have %s", runtime.GOOS, want, name, have)
+				} else {
+					t.Errorf("want %s type for %s symbol, but have %s", want, name, have)
+				}
 			}
 			delete(runtimeSyms, name)
 		}
diff --git a/src/cmd/objdump/objdump_test.go b/src/cmd/objdump/objdump_test.go
index 69b4cf4..6e781c9 100644
--- a/src/cmd/objdump/objdump_test.go
+++ b/src/cmd/objdump/objdump_test.go
@@ -8,7 +8,6 @@
 	"cmd/internal/notsha256"
 	"flag"
 	"fmt"
-	"go/build"
 	"internal/platform"
 	"internal/testenv"
 	"os"
@@ -253,7 +252,7 @@
 func testGoAndCgoDisasm(t *testing.T, printCode bool, printGnuAsm bool) {
 	t.Parallel()
 	testDisasm(t, "fmthello.go", printCode, printGnuAsm)
-	if build.Default.CgoEnabled {
+	if testenv.HasCGO() {
 		testDisasm(t, "fmthellocgo.go", printCode, printGnuAsm)
 	}
 }
@@ -273,7 +272,7 @@
 func TestDisasmExtld(t *testing.T) {
 	testenv.MustHaveCGO(t)
 	switch runtime.GOOS {
-	case "plan9", "windows":
+	case "plan9":
 		t.Skipf("skipping on %s", runtime.GOOS)
 	}
 	t.Parallel()
@@ -299,7 +298,7 @@
 	tmp := t.TempDir()
 
 	importcfgfile := filepath.Join(tmp, "hello.importcfg")
-	testenv.WriteImportcfg(t, importcfgfile, nil)
+	testenv.WriteImportcfg(t, importcfgfile, nil, "testdata/fmthello.go")
 
 	hello := filepath.Join(tmp, "hello.o")
 	args := []string{"tool", "compile", "-p=main", "-importcfg=" + importcfgfile, "-o", hello}
diff --git a/src/cmd/objdump/testdata/testfilenum/go.mod b/src/cmd/objdump/testdata/testfilenum/go.mod
index db43288..f0bd6b7 100644
--- a/src/cmd/objdump/testdata/testfilenum/go.mod
+++ b/src/cmd/objdump/testdata/testfilenum/go.mod
@@ -1,3 +1,3 @@
-module objdumptest
+module cmd/objdump/testdata/testfilenum
 
 go 1.16
diff --git a/src/cmd/pack/pack_test.go b/src/cmd/pack/pack_test.go
index be75738..c3a6342 100644
--- a/src/cmd/pack/pack_test.go
+++ b/src/cmd/pack/pack_test.go
@@ -13,6 +13,7 @@
 	"io/fs"
 	"os"
 	"path/filepath"
+	"runtime"
 	"strings"
 	"sync"
 	"testing"
@@ -191,6 +192,7 @@
 // Test that pack-created archives can be understood by the tools.
 func TestHello(t *testing.T) {
 	testenv.MustHaveGoBuild(t)
+	testenv.MustInternalLink(t, false)
 
 	dir := t.TempDir()
 	hello := filepath.Join(dir, "hello.go")
@@ -210,7 +212,7 @@
 	}
 
 	importcfgfile := filepath.Join(dir, "hello.importcfg")
-	testenv.WriteImportcfg(t, importcfgfile, nil)
+	testenv.WriteImportcfg(t, importcfgfile, nil, hello)
 
 	goBin := testenv.GoToolPath(t)
 	run(goBin, "tool", "compile", "-importcfg="+importcfgfile, "-p=main", "hello.go")
@@ -284,7 +286,7 @@
 	goBin := testenv.GoToolPath(t)
 	run(goBin, "tool", "compile", "-importcfg="+importcfgfile, "-p=large", "large.go")
 	run(packPath(t), "grc", "large.a", "large.o")
-	testenv.WriteImportcfg(t, importcfgfile, map[string]string{"large": filepath.Join(dir, "large.o")})
+	testenv.WriteImportcfg(t, importcfgfile, map[string]string{"large": filepath.Join(dir, "large.o")}, "runtime")
 	run(goBin, "tool", "compile", "-importcfg="+importcfgfile, "-p=main", "main.go")
 	run(goBin, "tool", "link", "-importcfg="+importcfgfile, "-L", ".", "-o", "a.out", "main.o")
 	out := run("./a.out")
@@ -413,6 +415,9 @@
 	cmd.Dir = dir
 	out, err := cmd.CombinedOutput()
 	if err != nil {
+		if t.Name() == "TestHello" && runtime.GOOS == "android" && runtime.GOARCH == "arm64" {
+			testenv.SkipFlaky(t, 58806)
+		}
 		t.Fatalf("%v: %v\n%s", args, err, string(out))
 	}
 	return string(out)
@@ -492,6 +497,10 @@
 	return nil
 }
 
+func (f *FakeFile) String() string {
+	return fs.FormatFileInfo(f)
+}
+
 // Special helpers.
 
 func (f *FakeFile) Entry() *archive.Entry {
diff --git a/src/cmd/pprof/pprof_test.go b/src/cmd/pprof/pprof_test.go
index 353781a..2a651dd 100644
--- a/src/cmd/pprof/pprof_test.go
+++ b/src/cmd/pprof/pprof_test.go
@@ -74,8 +74,10 @@
 		t.Skipf("skipping on %s, issue 15255", runtime.GOARCH)
 	}
 
-	// Skip PIE platforms, pprof can't disassemble PIE.
-	if runtime.GOOS == "darwin" && runtime.GOARCH == "arm64" {
+	// pprof can only disassemble PIE on some platforms.
+	// Skip the ones it can't handle yet.
+	if (runtime.GOOS == "darwin" && runtime.GOARCH == "arm64") ||
+		(runtime.GOOS == "android" && runtime.GOARCH == "arm") {
 		t.Skipf("skipping on %s/%s, issue 46639", runtime.GOOS, runtime.GOARCH)
 	}
 }
diff --git a/src/cmd/pprof/readlineui.go b/src/cmd/pprof/readlineui.go
index b269177..b0f998f 100644
--- a/src/cmd/pprof/readlineui.go
+++ b/src/cmd/pprof/readlineui.go
@@ -51,7 +51,7 @@
 	return &readlineUI{term: term.NewTerminal(rw, "")}
 }
 
-// Read returns a line of text (a command) read from the user.
+// ReadLine returns a line of text (a command) read from the user.
 // prompt is printed before reading the command.
 func (r *readlineUI) ReadLine(prompt string) (string, error) {
 	r.term.SetPrompt(prompt)
diff --git a/src/cmd/test2json/signal_unix.go b/src/cmd/test2json/signal_unix.go
index ed5ca7e..2b4e44c 100644
--- a/src/cmd/test2json/signal_unix.go
+++ b/src/cmd/test2json/signal_unix.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build unix || js
+//go:build unix || js || wasip1
 
 package main
 
diff --git a/src/cmd/tools/tools.go b/src/cmd/tools/tools.go
new file mode 100644
index 0000000..5e0f277
--- /dev/null
+++ b/src/cmd/tools/tools.go
@@ -0,0 +1,11 @@
+// Copyright 2023 The Go 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:build tools
+
+package tools
+
+// Arrange to vendor the bisect command for use
+// by the internal/godebug package test.
+import _ "golang.org/x/tools/cmd/bisect"
diff --git a/src/cmd/trace/annotations.go b/src/cmd/trace/annotations.go
index 9ffce1b..0addc24 100644
--- a/src/cmd/trace/annotations.go
+++ b/src/cmd/trace/annotations.go
@@ -494,7 +494,7 @@
 func (task *taskDesc) overlappingGCDuration(evs []*trace.Event) (overlapping time.Duration) {
 	for _, ev := range evs {
 		// make sure we only consider the global GC events.
-		if typ := ev.Type; typ != trace.EvGCStart && typ != trace.EvGCSTWStart {
+		if typ := ev.Type; typ != trace.EvGCStart {
 			continue
 		}
 
diff --git a/src/cmd/trace/main.go b/src/cmd/trace/main.go
index 0e4d882..9e9e7f3 100644
--- a/src/cmd/trace/main.go
+++ b/src/cmd/trace/main.go
@@ -124,7 +124,7 @@
 
 	log.Print("Splitting trace...")
 	ranges = splitTrace(res)
-	reportMemoryUsage("after spliting trace")
+	reportMemoryUsage("after splitting trace")
 	debug.FreeOSMemory()
 
 	addr := "http://" + ln.Addr().String()
diff --git a/src/cmd/trace/trace.go b/src/cmd/trace/trace.go
index 84fca62..618df42 100644
--- a/src/cmd/trace/trace.go
+++ b/src/cmd/trace/trace.go
@@ -338,7 +338,7 @@
 	// The parent is omitted if 0. The trailing comma is omitted from the
 	// last entry, but we don't need that much precision.
 	const (
-		baseSize = len(`"`) + len (`":{"name":"`) + len(`"},`)
+		baseSize = len(`"`) + len(`":{"name":"`) + len(`"},`)
 
 		// Don't count the trailing quote on the name, as that is
 		// counted in baseSize.
@@ -647,7 +647,7 @@
 			oldState = info.state
 		}
 		if info.state != oldState && setGStateErr == nil {
-			setGStateErr = fmt.Errorf("expected G %d to be in state %d, but got state %d", g, oldState, newState)
+			setGStateErr = fmt.Errorf("expected G %d to be in state %d, but got state %d", g, oldState, info.state)
 		}
 		ctx.gstates[info.state]--
 		ctx.gstates[newState]++
@@ -764,12 +764,12 @@
 		case trace.EvGCStart:
 			ctx.emitSlice(ev, "GC")
 		case trace.EvGCDone:
-		case trace.EvGCSTWStart:
+		case trace.EvSTWStart:
 			if ctx.mode&modeGoroutineOriented != 0 {
 				continue
 			}
 			ctx.emitSlice(ev, fmt.Sprintf("STW (%s)", ev.SArgs[0]))
-		case trace.EvGCSTWDone:
+		case trace.EvSTWDone:
 		case trace.EvGCMarkAssistStart:
 			// Mark assists can continue past preemptions, so truncate to the
 			// whichever comes first. We'll synthesize another slice if
diff --git a/src/cmd/vendor/golang.org/x/arch/ppc64/ppc64asm/field.go b/src/cmd/vendor/golang.org/x/arch/ppc64/ppc64asm/field.go
index 3779446..b47f672 100644
--- a/src/cmd/vendor/golang.org/x/arch/ppc64/ppc64asm/field.go
+++ b/src/cmd/vendor/golang.org/x/arch/ppc64/ppc64asm/field.go
@@ -80,7 +80,7 @@
 	return u
 }
 
-// Parse extracts the bitfields from i, concatenate them and return the result
+// ParseSigned extracts the bitfields from i, concatenate them and return the result
 // as a signed integer. Parse will panic if any bitfield in b is invalid.
 func (bs BitFields) ParseSigned(i [2]uint32) int64 {
 	u, l := bs.parse(i)
diff --git a/src/cmd/vendor/golang.org/x/arch/x86/x86asm/decode.go b/src/cmd/vendor/golang.org/x/arch/x86/x86asm/decode.go
index 8c98497..059b73d 100644
--- a/src/cmd/vendor/golang.org/x/arch/x86/x86asm/decode.go
+++ b/src/cmd/vendor/golang.org/x/arch/x86/x86asm/decode.go
@@ -1550,7 +1550,7 @@
 	{Base: BX},
 }
 
-// baseReg returns the base register for a given register size in bits.
+// baseRegForBits returns the base register for a given register size in bits.
 func baseRegForBits(bits int) Reg {
 	switch bits {
 	case 8:
diff --git a/src/cmd/vendor/golang.org/x/arch/x86/x86asm/plan9x.go b/src/cmd/vendor/golang.org/x/arch/x86/x86asm/plan9x.go
index de41794..9e866d8 100644
--- a/src/cmd/vendor/golang.org/x/arch/x86/x86asm/plan9x.go
+++ b/src/cmd/vendor/golang.org/x/arch/x86/x86asm/plan9x.go
@@ -83,6 +83,12 @@
 		}
 	}
 
+	if inst.Op == CMP {
+		// Use reads-left-to-right ordering for comparisons.
+		// See issue 60920.
+		args[0], args[1] = args[1], args[0]
+	}
+
 	if args != nil {
 		op += " " + strings.Join(args, ", ")
 	}
diff --git a/src/cmd/vendor/golang.org/x/mod/internal/lazyregexp/lazyre.go b/src/cmd/vendor/golang.org/x/mod/internal/lazyregexp/lazyre.go
index 2681af3..150f887 100644
--- a/src/cmd/vendor/golang.org/x/mod/internal/lazyregexp/lazyre.go
+++ b/src/cmd/vendor/golang.org/x/mod/internal/lazyregexp/lazyre.go
@@ -13,7 +13,7 @@
 	"sync"
 )
 
-// Regexp is a wrapper around regexp.Regexp, where the underlying regexp will be
+// Regexp is a wrapper around [regexp.Regexp], where the underlying regexp will be
 // compiled the first time it is needed.
 type Regexp struct {
 	str  string
diff --git a/src/cmd/vendor/golang.org/x/mod/modfile/print.go b/src/cmd/vendor/golang.org/x/mod/modfile/print.go
index 524f930..2a0123d 100644
--- a/src/cmd/vendor/golang.org/x/mod/modfile/print.go
+++ b/src/cmd/vendor/golang.org/x/mod/modfile/print.go
@@ -16,7 +16,13 @@
 func Format(f *FileSyntax) []byte {
 	pr := &printer{}
 	pr.file(f)
-	return pr.Bytes()
+
+	// remove trailing blank lines
+	b := pr.Bytes()
+	for len(b) > 0 && b[len(b)-1] == '\n' && (len(b) == 1 || b[len(b)-2] == '\n') {
+		b = b[:len(b)-1]
+	}
+	return b
 }
 
 // A printer collects the state during printing of a file or expression.
@@ -59,7 +65,11 @@
 	}
 
 	p.trim()
-	p.printf("\n")
+	if b := p.Bytes(); len(b) == 0 || (len(b) >= 2 && b[len(b)-1] == '\n' && b[len(b)-2] == '\n') {
+		// skip the blank line at top of file or after a blank line
+	} else {
+		p.printf("\n")
+	}
 	for i := 0; i < p.margin; i++ {
 		p.printf("\t")
 	}
diff --git a/src/cmd/vendor/golang.org/x/mod/modfile/read.go b/src/cmd/vendor/golang.org/x/mod/modfile/read.go
index a503bc2..5b5bb5e 100644
--- a/src/cmd/vendor/golang.org/x/mod/modfile/read.go
+++ b/src/cmd/vendor/golang.org/x/mod/modfile/read.go
@@ -65,7 +65,7 @@
 }
 
 // Comment returns the receiver. This isn't useful by itself, but
-// a Comments struct is embedded into all the expression
+// a [Comments] struct is embedded into all the expression
 // implementation types, and this gives each of those a Comment
 // method to satisfy the Expr interface.
 func (c *Comments) Comment() *Comments {
diff --git a/src/cmd/vendor/golang.org/x/mod/modfile/rule.go b/src/cmd/vendor/golang.org/x/mod/modfile/rule.go
index 6bcde8f..930b6c5 100644
--- a/src/cmd/vendor/golang.org/x/mod/modfile/rule.go
+++ b/src/cmd/vendor/golang.org/x/mod/modfile/rule.go
@@ -5,17 +5,17 @@
 // Package modfile implements a parser and formatter for go.mod files.
 //
 // The go.mod syntax is described in
-// https://golang.org/cmd/go/#hdr-The_go_mod_file.
+// https://pkg.go.dev/cmd/go/#hdr-The_go_mod_file.
 //
-// The Parse and ParseLax functions both parse a go.mod file and return an
+// The [Parse] and [ParseLax] functions both parse a go.mod file and return an
 // abstract syntax tree. ParseLax ignores unknown statements and may be used to
 // parse go.mod files that may have been developed with newer versions of Go.
 //
-// The File struct returned by Parse and ParseLax represent an abstract
-// go.mod file. File has several methods like AddNewRequire and DropReplace
-// that can be used to programmatically edit a file.
+// The [File] struct returned by Parse and ParseLax represent an abstract
+// go.mod file. File has several methods like [File.AddNewRequire] and
+// [File.DropReplace] that can be used to programmatically edit a file.
 //
-// The Format function formats a File back to a byte slice which can be
+// The [Format] function formats a File back to a byte slice which can be
 // written to a file.
 package modfile
 
@@ -35,12 +35,13 @@
 
 // A File is the parsed, interpreted form of a go.mod file.
 type File struct {
-	Module  *Module
-	Go      *Go
-	Require []*Require
-	Exclude []*Exclude
-	Replace []*Replace
-	Retract []*Retract
+	Module    *Module
+	Go        *Go
+	Toolchain *Toolchain
+	Require   []*Require
+	Exclude   []*Exclude
+	Replace   []*Replace
+	Retract   []*Retract
 
 	Syntax *FileSyntax
 }
@@ -58,6 +59,12 @@
 	Syntax  *Line
 }
 
+// A Toolchain is the toolchain statement.
+type Toolchain struct {
+	Name   string // "go1.21rc1"
+	Syntax *Line
+}
+
 // An Exclude is a single exclude statement.
 type Exclude struct {
 	Mod    module.Version
@@ -219,7 +226,7 @@
 // data is the content of the file.
 //
 // fix is an optional function that canonicalizes module versions.
-// If fix is nil, all module versions must be canonical (module.CanonicalVersion
+// If fix is nil, all module versions must be canonical ([module.CanonicalVersion]
 // must return the same string).
 func Parse(file string, data []byte, fix VersionFixer) (*File, error) {
 	return parseToFile(file, data, fix, true)
@@ -296,9 +303,13 @@
 	return f, nil
 }
 
-var GoVersionRE = lazyregexp.New(`^([1-9][0-9]*)\.(0|[1-9][0-9]*)$`)
+var GoVersionRE = lazyregexp.New(`^([1-9][0-9]*)\.(0|[1-9][0-9]*)(\.(0|[1-9][0-9]*))?([a-z]+[0-9]+)?$`)
 var laxGoVersionRE = lazyregexp.New(`^v?(([1-9][0-9]*)\.(0|[1-9][0-9]*))([^0-9].*)$`)
 
+// Toolchains must be named beginning with `go1`,
+// like "go1.20.3" or "go1.20.3-gccgo". As a special case, "default" is also permitted.
+var ToolchainRE = lazyregexp.New(`^default$|^go1($|\.)`)
+
 func (f *File) add(errs *ErrorList, block *LineBlock, line *Line, verb string, args []string, fix VersionFixer, strict bool) {
 	// If strict is false, this module is a dependency.
 	// We ignore all unknown directives as well as main-module-only
@@ -364,6 +375,21 @@
 		f.Go = &Go{Syntax: line}
 		f.Go.Version = args[0]
 
+	case "toolchain":
+		if f.Toolchain != nil {
+			errorf("repeated toolchain statement")
+			return
+		}
+		if len(args) != 1 {
+			errorf("toolchain directive expects exactly one argument")
+			return
+		} else if strict && !ToolchainRE.MatchString(args[0]) {
+			errorf("invalid toolchain version '%s': must match format go1.23 or local", args[0])
+			return
+		}
+		f.Toolchain = &Toolchain{Syntax: line}
+		f.Toolchain.Name = args[0]
+
 	case "module":
 		if f.Module != nil {
 			errorf("repeated module statement")
@@ -612,6 +638,22 @@
 		f.Go = &Go{Syntax: line}
 		f.Go.Version = args[0]
 
+	case "toolchain":
+		if f.Toolchain != nil {
+			errorf("repeated toolchain statement")
+			return
+		}
+		if len(args) != 1 {
+			errorf("toolchain directive expects exactly one argument")
+			return
+		} else if !ToolchainRE.MatchString(args[0]) {
+			errorf("invalid toolchain version '%s': must match format go1.23 or local", args[0])
+			return
+		}
+
+		f.Toolchain = &Toolchain{Syntax: line}
+		f.Toolchain.Name = args[0]
+
 	case "use":
 		if len(args) != 1 {
 			errorf("usage: %s local/dir", verb)
@@ -881,7 +923,7 @@
 }
 
 // Cleanup cleans up the file f after any edit operations.
-// To avoid quadratic behavior, modifications like DropRequire
+// To avoid quadratic behavior, modifications like [File.DropRequire]
 // clear the entry but do not remove it from the slice.
 // Cleanup cleans out all the cleared entries.
 func (f *File) Cleanup() {
@@ -926,7 +968,7 @@
 
 func (f *File) AddGoStmt(version string) error {
 	if !GoVersionRE.MatchString(version) {
-		return fmt.Errorf("invalid language version string %q", version)
+		return fmt.Errorf("invalid language version %q", version)
 	}
 	if f.Go == nil {
 		var hint Expr
@@ -944,6 +986,44 @@
 	return nil
 }
 
+// DropGoStmt deletes the go statement from the file.
+func (f *File) DropGoStmt() {
+	if f.Go != nil {
+		f.Go.Syntax.markRemoved()
+		f.Go = nil
+	}
+}
+
+// DropToolchainStmt deletes the toolchain statement from the file.
+func (f *File) DropToolchainStmt() {
+	if f.Toolchain != nil {
+		f.Toolchain.Syntax.markRemoved()
+		f.Toolchain = nil
+	}
+}
+
+func (f *File) AddToolchainStmt(name string) error {
+	if !ToolchainRE.MatchString(name) {
+		return fmt.Errorf("invalid toolchain name %q", name)
+	}
+	if f.Toolchain == nil {
+		var hint Expr
+		if f.Go != nil && f.Go.Syntax != nil {
+			hint = f.Go.Syntax
+		} else if f.Module != nil && f.Module.Syntax != nil {
+			hint = f.Module.Syntax
+		}
+		f.Toolchain = &Toolchain{
+			Name:   name,
+			Syntax: f.Syntax.addLine(hint, "toolchain", name),
+		}
+	} else {
+		f.Toolchain.Name = name
+		f.Syntax.updateLine(f.Toolchain.Syntax, "toolchain", name)
+	}
+	return nil
+}
+
 // AddRequire sets the first require line for path to version vers,
 // preserving any existing comments for that line and removing all
 // other lines for path.
@@ -995,8 +1075,8 @@
 // The requirements in req must specify at most one distinct version for each
 // module path.
 //
-// If any existing requirements may be removed, the caller should call Cleanup
-// after all edits are complete.
+// If any existing requirements may be removed, the caller should call
+// [File.Cleanup] after all edits are complete.
 func (f *File) SetRequire(req []*Require) {
 	type elem struct {
 		version  string
@@ -1387,13 +1467,21 @@
 func (f *File) SortBlocks() {
 	f.removeDups() // otherwise sorting is unsafe
 
+	// semanticSortForExcludeVersionV is the Go version (plus leading "v") at which
+	// lines in exclude blocks start to use semantic sort instead of lexicographic sort.
+	// See go.dev/issue/60028.
+	const semanticSortForExcludeVersionV = "v1.21"
+	useSemanticSortForExclude := f.Go != nil && semver.Compare("v"+f.Go.Version, semanticSortForExcludeVersionV) >= 0
+
 	for _, stmt := range f.Syntax.Stmt {
 		block, ok := stmt.(*LineBlock)
 		if !ok {
 			continue
 		}
 		less := lineLess
-		if block.Token[0] == "retract" {
+		if block.Token[0] == "exclude" && useSemanticSortForExclude {
+			less = lineExcludeLess
+		} else if block.Token[0] == "retract" {
 			less = lineRetractLess
 		}
 		sort.SliceStable(block.Line, func(i, j int) bool {
@@ -1496,6 +1584,22 @@
 	return len(li.Token) < len(lj.Token)
 }
 
+// lineExcludeLess reports whether li should be sorted before lj for lines in
+// an "exclude" block.
+func lineExcludeLess(li, lj *Line) bool {
+	if len(li.Token) != 2 || len(lj.Token) != 2 {
+		// Not a known exclude specification.
+		// Fall back to sorting lexicographically.
+		return lineLess(li, lj)
+	}
+	// An exclude specification has two tokens: ModulePath and Version.
+	// Compare module path by string order and version by semver rules.
+	if pi, pj := li.Token[0], lj.Token[0]; pi != pj {
+		return pi < pj
+	}
+	return semver.Compare(li.Token[1], lj.Token[1]) < 0
+}
+
 // lineRetractLess returns whether li should be sorted before lj for lines in
 // a "retract" block. It treats each line as a version interval. Single versions
 // are compared as if they were intervals with the same low and high version.
diff --git a/src/cmd/vendor/golang.org/x/mod/modfile/work.go b/src/cmd/vendor/golang.org/x/mod/modfile/work.go
index 0c0e521..d7b9937 100644
--- a/src/cmd/vendor/golang.org/x/mod/modfile/work.go
+++ b/src/cmd/vendor/golang.org/x/mod/modfile/work.go
@@ -12,9 +12,10 @@
 
 // A WorkFile is the parsed, interpreted form of a go.work file.
 type WorkFile struct {
-	Go      *Go
-	Use     []*Use
-	Replace []*Replace
+	Go        *Go
+	Toolchain *Toolchain
+	Use       []*Use
+	Replace   []*Replace
 
 	Syntax *FileSyntax
 }
@@ -33,7 +34,7 @@
 // data is the content of the file.
 //
 // fix is an optional function that canonicalizes module versions.
-// If fix is nil, all module versions must be canonical (module.CanonicalVersion
+// If fix is nil, all module versions must be canonical ([module.CanonicalVersion]
 // must return the same string).
 func ParseWork(file string, data []byte, fix VersionFixer) (*WorkFile, error) {
 	fs, err := parse(file, data)
@@ -82,7 +83,7 @@
 }
 
 // Cleanup cleans up the file f after any edit operations.
-// To avoid quadratic behavior, modifications like DropRequire
+// To avoid quadratic behavior, modifications like [WorkFile.DropRequire]
 // clear the entry but do not remove it from the slice.
 // Cleanup cleans out all the cleared entries.
 func (f *WorkFile) Cleanup() {
@@ -109,7 +110,7 @@
 
 func (f *WorkFile) AddGoStmt(version string) error {
 	if !GoVersionRE.MatchString(version) {
-		return fmt.Errorf("invalid language version string %q", version)
+		return fmt.Errorf("invalid language version %q", version)
 	}
 	if f.Go == nil {
 		stmt := &Line{Token: []string{"go", version}}
@@ -117,7 +118,7 @@
 			Version: version,
 			Syntax:  stmt,
 		}
-		// Find the first non-comment-only block that's and add
+		// Find the first non-comment-only block and add
 		// the go statement before it. That will keep file comments at the top.
 		i := 0
 		for i = 0; i < len(f.Syntax.Stmt); i++ {
@@ -133,6 +134,56 @@
 	return nil
 }
 
+func (f *WorkFile) AddToolchainStmt(name string) error {
+	if !ToolchainRE.MatchString(name) {
+		return fmt.Errorf("invalid toolchain name %q", name)
+	}
+	if f.Toolchain == nil {
+		stmt := &Line{Token: []string{"toolchain", name}}
+		f.Toolchain = &Toolchain{
+			Name:   name,
+			Syntax: stmt,
+		}
+		// Find the go line and add the toolchain line after it.
+		// Or else find the first non-comment-only block and add
+		// the toolchain line before it. That will keep file comments at the top.
+		i := 0
+		for i = 0; i < len(f.Syntax.Stmt); i++ {
+			if line, ok := f.Syntax.Stmt[i].(*Line); ok && len(line.Token) > 0 && line.Token[0] == "go" {
+				i++
+				goto Found
+			}
+		}
+		for i = 0; i < len(f.Syntax.Stmt); i++ {
+			if _, ok := f.Syntax.Stmt[i].(*CommentBlock); !ok {
+				break
+			}
+		}
+	Found:
+		f.Syntax.Stmt = append(append(f.Syntax.Stmt[:i:i], stmt), f.Syntax.Stmt[i:]...)
+	} else {
+		f.Toolchain.Name = name
+		f.Syntax.updateLine(f.Toolchain.Syntax, "toolchain", name)
+	}
+	return nil
+}
+
+// DropGoStmt deletes the go statement from the file.
+func (f *WorkFile) DropGoStmt() {
+	if f.Go != nil {
+		f.Go.Syntax.markRemoved()
+		f.Go = nil
+	}
+}
+
+// DropToolchainStmt deletes the toolchain statement from the file.
+func (f *WorkFile) DropToolchainStmt() {
+	if f.Toolchain != nil {
+		f.Toolchain.Syntax.markRemoved()
+		f.Toolchain = nil
+	}
+}
+
 func (f *WorkFile) AddUse(diskPath, modulePath string) error {
 	need := true
 	for _, d := range f.Use {
diff --git a/src/cmd/vendor/golang.org/x/mod/module/module.go b/src/cmd/vendor/golang.org/x/mod/module/module.go
index e9dec6e..2a364b2 100644
--- a/src/cmd/vendor/golang.org/x/mod/module/module.go
+++ b/src/cmd/vendor/golang.org/x/mod/module/module.go
@@ -4,7 +4,7 @@
 
 // Package module defines the module.Version type along with support code.
 //
-// The module.Version type is a simple Path, Version pair:
+// The [module.Version] type is a simple Path, Version pair:
 //
 //	type Version struct {
 //		Path string
@@ -12,7 +12,7 @@
 //	}
 //
 // There are no restrictions imposed directly by use of this structure,
-// but additional checking functions, most notably Check, verify that
+// but additional checking functions, most notably [Check], verify that
 // a particular path, version pair is valid.
 //
 // # Escaped Paths
@@ -140,7 +140,7 @@
 	Err     error
 }
 
-// VersionError returns a ModuleError derived from a Version and error,
+// VersionError returns a [ModuleError] derived from a [Version] and error,
 // or err itself if it is already such an error.
 func VersionError(v Version, err error) error {
 	var mErr *ModuleError
@@ -169,7 +169,7 @@
 // An InvalidVersionError indicates an error specific to a version, with the
 // module path unknown or specified externally.
 //
-// A ModuleError may wrap an InvalidVersionError, but an InvalidVersionError
+// A [ModuleError] may wrap an InvalidVersionError, but an InvalidVersionError
 // must not wrap a ModuleError.
 type InvalidVersionError struct {
 	Version string
@@ -193,8 +193,8 @@
 func (e *InvalidVersionError) Unwrap() error { return e.Err }
 
 // An InvalidPathError indicates a module, import, or file path doesn't
-// satisfy all naming constraints. See CheckPath, CheckImportPath,
-// and CheckFilePath for specific restrictions.
+// satisfy all naming constraints. See [CheckPath], [CheckImportPath],
+// and [CheckFilePath] for specific restrictions.
 type InvalidPathError struct {
 	Kind string // "module", "import", or "file"
 	Path string
@@ -294,7 +294,7 @@
 }
 
 // CheckPath checks that a module path is valid.
-// A valid module path is a valid import path, as checked by CheckImportPath,
+// A valid module path is a valid import path, as checked by [CheckImportPath],
 // with three additional constraints.
 // First, the leading path element (up to the first slash, if any),
 // by convention a domain name, must contain only lower-case ASCII letters,
@@ -380,7 +380,7 @@
 // checkPath returns an error describing why the path is not valid.
 // Because these checks apply to module, import, and file paths,
 // and because other checks may be applied, the caller is expected to wrap
-// this error with InvalidPathError.
+// this error with [InvalidPathError].
 func checkPath(path string, kind pathKind) error {
 	if !utf8.ValidString(path) {
 		return fmt.Errorf("invalid UTF-8")
@@ -532,7 +532,7 @@
 // they require ".vN" instead of "/vN", and for all N, not just N >= 2.
 // SplitPathVersion returns with ok = false when presented with
 // a path whose last path element does not satisfy the constraints
-// applied by CheckPath, such as "example.com/pkg/v1" or "example.com/pkg/v1.2".
+// applied by [CheckPath], such as "example.com/pkg/v1" or "example.com/pkg/v1.2".
 func SplitPathVersion(path string) (prefix, pathMajor string, ok bool) {
 	if strings.HasPrefix(path, "gopkg.in/") {
 		return splitGopkgIn(path)
@@ -582,7 +582,7 @@
 // MatchPathMajor reports whether the semantic version v
 // matches the path major version pathMajor.
 //
-// MatchPathMajor returns true if and only if CheckPathMajor returns nil.
+// MatchPathMajor returns true if and only if [CheckPathMajor] returns nil.
 func MatchPathMajor(v, pathMajor string) bool {
 	return CheckPathMajor(v, pathMajor) == nil
 }
@@ -622,7 +622,7 @@
 // PathMajorPrefix returns the major-version tag prefix implied by pathMajor.
 // An empty PathMajorPrefix allows either v0 or v1.
 //
-// Note that MatchPathMajor may accept some versions that do not actually begin
+// Note that [MatchPathMajor] may accept some versions that do not actually begin
 // with this prefix: namely, it accepts a 'v0.0.0-' prefix for a '.v1'
 // pathMajor, even though that pathMajor implies 'v1' tagging.
 func PathMajorPrefix(pathMajor string) string {
@@ -643,7 +643,7 @@
 }
 
 // CanonicalVersion returns the canonical form of the version string v.
-// It is the same as semver.Canonical(v) except that it preserves the special build suffix "+incompatible".
+// It is the same as [semver.Canonical] except that it preserves the special build suffix "+incompatible".
 func CanonicalVersion(v string) string {
 	cv := semver.Canonical(v)
 	if semver.Build(v) == "+incompatible" {
@@ -652,8 +652,8 @@
 	return cv
 }
 
-// Sort sorts the list by Path, breaking ties by comparing Version fields.
-// The Version fields are interpreted as semantic versions (using semver.Compare)
+// Sort sorts the list by Path, breaking ties by comparing [Version] fields.
+// The Version fields are interpreted as semantic versions (using [semver.Compare])
 // optionally followed by a tie-breaking suffix introduced by a slash character,
 // like in "v0.0.1/go.mod".
 func Sort(list []Version) {
@@ -793,7 +793,7 @@
 }
 
 // MatchPrefixPatterns reports whether any path prefix of target matches one of
-// the glob patterns (as defined by path.Match) in the comma-separated globs
+// the glob patterns (as defined by [path.Match]) in the comma-separated globs
 // list. This implements the algorithm used when matching a module path to the
 // GOPRIVATE environment variable, as described by 'go help module-private'.
 //
diff --git a/src/cmd/vendor/golang.org/x/mod/module/pseudo.go b/src/cmd/vendor/golang.org/x/mod/module/pseudo.go
index f04ad37..9cf19d3 100644
--- a/src/cmd/vendor/golang.org/x/mod/module/pseudo.go
+++ b/src/cmd/vendor/golang.org/x/mod/module/pseudo.go
@@ -125,7 +125,7 @@
 }
 
 // IsZeroPseudoVersion returns whether v is a pseudo-version with a zero base,
-// timestamp, and revision, as returned by ZeroPseudoVersion.
+// timestamp, and revision, as returned by [ZeroPseudoVersion].
 func IsZeroPseudoVersion(v string) bool {
 	return v == ZeroPseudoVersion(semver.Major(v))
 }
diff --git a/src/cmd/vendor/golang.org/x/mod/semver/semver.go b/src/cmd/vendor/golang.org/x/mod/semver/semver.go
index a30a22b..9a2dfd3 100644
--- a/src/cmd/vendor/golang.org/x/mod/semver/semver.go
+++ b/src/cmd/vendor/golang.org/x/mod/semver/semver.go
@@ -140,7 +140,7 @@
 // Max canonicalizes its arguments and then returns the version string
 // that compares greater.
 //
-// Deprecated: use Compare instead. In most cases, returning a canonicalized
+// Deprecated: use [Compare] instead. In most cases, returning a canonicalized
 // version is not expected or desired.
 func Max(v, w string) string {
 	v = Canonical(v)
@@ -151,7 +151,7 @@
 	return w
 }
 
-// ByVersion implements sort.Interface for sorting semantic version strings.
+// ByVersion implements [sort.Interface] for sorting semantic version strings.
 type ByVersion []string
 
 func (vs ByVersion) Len() int      { return len(vs) }
@@ -164,7 +164,7 @@
 	return vs[i] < vs[j]
 }
 
-// Sort sorts a list of semantic version strings using ByVersion.
+// Sort sorts a list of semantic version strings using [ByVersion].
 func Sort(list []string) {
 	sort.Sort(ByVersion(list))
 }
diff --git a/src/cmd/vendor/golang.org/x/mod/sumdb/client.go b/src/cmd/vendor/golang.org/x/mod/sumdb/client.go
index 70dd56f..aecdc68 100644
--- a/src/cmd/vendor/golang.org/x/mod/sumdb/client.go
+++ b/src/cmd/vendor/golang.org/x/mod/sumdb/client.go
@@ -19,7 +19,7 @@
 )
 
 // A ClientOps provides the external operations
-// (file caching, HTTP fetches, and so on) needed by the Client.
+// (file caching, HTTP fetches, and so on) needed by the [Client].
 // The methods must be safe for concurrent use by multiple goroutines.
 type ClientOps interface {
 	// ReadRemote reads and returns the content served at the given path
@@ -72,7 +72,7 @@
 // ErrWriteConflict signals a write conflict during Client.WriteConfig.
 var ErrWriteConflict = errors.New("write conflict")
 
-// ErrSecurity is returned by Client operations that invoke Client.SecurityError.
+// ErrSecurity is returned by [Client] operations that invoke Client.SecurityError.
 var ErrSecurity = errors.New("security error: misbehaving server")
 
 // A Client is a client connection to a checksum database.
@@ -102,14 +102,14 @@
 	tileSaved   map[tlog.Tile]bool // which tiles have been saved using c.ops.WriteCache already
 }
 
-// NewClient returns a new Client using the given Client.
+// NewClient returns a new [Client] using the given [ClientOps].
 func NewClient(ops ClientOps) *Client {
 	return &Client{
 		ops: ops,
 	}
 }
 
-// init initiailzes the client (if not already initialized)
+// init initializes the client (if not already initialized)
 // and returns any initialization error.
 func (c *Client) init() error {
 	c.initOnce.Do(c.initWork)
@@ -155,7 +155,7 @@
 }
 
 // SetTileHeight sets the tile height for the Client.
-// Any call to SetTileHeight must happen before the first call to Lookup.
+// Any call to SetTileHeight must happen before the first call to [Client.Lookup].
 // If SetTileHeight is not called, the Client defaults to tile height 8.
 // SetTileHeight can be called at most once,
 // and if so it must be called before the first call to Lookup.
@@ -174,7 +174,7 @@
 
 // SetGONOSUMDB sets the list of comma-separated GONOSUMDB patterns for the Client.
 // For any module path matching one of the patterns,
-// Lookup will return ErrGONOSUMDB.
+// [Client.Lookup] will return ErrGONOSUMDB.
 // SetGONOSUMDB can be called at most once,
 // and if so it must be called before the first call to Lookup.
 func (c *Client) SetGONOSUMDB(list string) {
@@ -187,8 +187,8 @@
 	c.nosumdb = list
 }
 
-// ErrGONOSUMDB is returned by Lookup for paths that match
-// a pattern listed in the GONOSUMDB list (set by SetGONOSUMDB,
+// ErrGONOSUMDB is returned by [Client.Lookup] for paths that match
+// a pattern listed in the GONOSUMDB list (set by [Client.SetGONOSUMDB],
 // usually from the environment variable).
 var ErrGONOSUMDB = errors.New("skipped (listed in GONOSUMDB)")
 
@@ -553,6 +553,11 @@
 		wg.Add(1)
 		go func(i int, tile tlog.Tile) {
 			defer wg.Done()
+			defer func() {
+				if e := recover(); e != nil {
+					errs[i] = fmt.Errorf("panic: %v", e)
+				}
+			}()
 			data[i], errs[i] = r.c.readTile(tile)
 		}(i, tile)
 	}
diff --git a/src/cmd/vendor/golang.org/x/mod/sumdb/dirhash/hash.go b/src/cmd/vendor/golang.org/x/mod/sumdb/dirhash/hash.go
index ef5df6f..51ec4db 100644
--- a/src/cmd/vendor/golang.org/x/mod/sumdb/dirhash/hash.go
+++ b/src/cmd/vendor/golang.org/x/mod/sumdb/dirhash/hash.go
@@ -33,7 +33,7 @@
 // Hash1 is "h1:" followed by the base64-encoded SHA-256 hash of a summary
 // prepared as if by the Unix command:
 //
-//	find . -type f | sort | sha256sum
+//	sha256sum $(find . -type f | sort) | sha256sum
 //
 // More precisely, the hashed summary contains a single line for each file in the list,
 // ordered by sort.Strings applied to the file names, where each line consists of
@@ -90,7 +90,10 @@
 		}
 		if info.IsDir() {
 			return nil
+		} else if file == dir {
+			return fmt.Errorf("%s is not a directory", dir)
 		}
+
 		rel := file
 		if dir != "." {
 			rel = file[len(dir)+1:]
diff --git a/src/cmd/vendor/golang.org/x/mod/sumdb/note/note.go b/src/cmd/vendor/golang.org/x/mod/sumdb/note/note.go
index 140b937..db9865c 100644
--- a/src/cmd/vendor/golang.org/x/mod/sumdb/note/note.go
+++ b/src/cmd/vendor/golang.org/x/mod/sumdb/note/note.go
@@ -20,45 +20,45 @@
 //
 // # Verifying Notes
 //
-// A Verifier allows verification of signatures by one server public key.
+// A [Verifier] allows verification of signatures by one server public key.
 // It can report the name of the server and the uint32 hash of the key,
 // and it can verify a purported signature by that key.
 //
 // The standard implementation of a Verifier is constructed
-// by NewVerifier starting from a verifier key, which is a
+// by [NewVerifier] starting from a verifier key, which is a
 // plain text string of the form "<name>+<hash>+<keydata>".
 //
-// A Verifiers allows looking up a Verifier by the combination
+// A [Verifiers] allows looking up a Verifier by the combination
 // of server name and key hash.
 //
 // The standard implementation of a Verifiers is constructed
 // by VerifierList from a list of known verifiers.
 //
-// A Note represents a text with one or more signatures.
+// A [Note] represents a text with one or more signatures.
 // An implementation can reject a note with too many signatures
 // (for example, more than 100 signatures).
 //
-// A Signature represents a signature on a note, verified or not.
+// A [Signature] represents a signature on a note, verified or not.
 //
-// The Open function takes as input a signed message
+// The [Open] function takes as input a signed message
 // and a set of known verifiers. It decodes and verifies
-// the message signatures and returns a Note structure
+// the message signatures and returns a [Note] structure
 // containing the message text and (verified or unverified) signatures.
 //
 // # Signing Notes
 //
-// A Signer allows signing a text with a given key.
+// A [Signer] allows signing a text with a given key.
 // It can report the name of the server and the hash of the key
 // and can sign a raw text using that key.
 //
 // The standard implementation of a Signer is constructed
-// by NewSigner starting from an encoded signer key, which is a
+// by [NewSigner] starting from an encoded signer key, which is a
 // plain text string of the form "PRIVATE+KEY+<name>+<hash>+<keydata>".
 // Anyone with an encoded signer key can sign messages using that key,
 // so it must be kept secret. The encoding begins with the literal text
 // "PRIVATE+KEY" to avoid confusion with the public server key.
 //
-// The Sign function takes as input a Note and a list of Signers
+// The [Sign] function takes as input a Note and a list of Signers
 // and returns an encoded, signed message.
 //
 // # Signed Note Format
@@ -88,7 +88,7 @@
 // although doing so will require deploying the new algorithms to all clients
 // before starting to depend on them for signatures.
 //
-// The GenerateKey function generates and returns a new signer
+// The [GenerateKey] function generates and returns a new signer
 // and corresponding verifier.
 //
 // # Example
@@ -123,9 +123,9 @@
 // base URLs, the only syntactic requirement is that they
 // not contain spaces or newlines).
 //
-// If Open is given access to a Verifiers including the
-// Verifier for this key, then it will succeed at verifiying
-// the encoded message and returning the parsed Note:
+// If [Open] is given access to a [Verifiers] including the
+// [Verifier] for this key, then it will succeed at verifying
+// the encoded message and returning the parsed [Note]:
 //
 //	vkey := "PeterNeumann+c74f20a3+ARpc2QcUPDhMQegwxbzhKqiBfsVkmqq/LDE4izWy10TW"
 //	msg := []byte("If you think cryptography is the answer to your problem,\n" +
@@ -238,7 +238,7 @@
 	return name != "" && utf8.ValidString(name) && strings.IndexFunc(name, unicode.IsSpace) < 0 && !strings.Contains(name, "+")
 }
 
-// NewVerifier construct a new Verifier from an encoded verifier key.
+// NewVerifier construct a new [Verifier] from an encoded verifier key.
 func NewVerifier(vkey string) (Verifier, error) {
 	name, vkey := chop(vkey, "+")
 	hash16, key64 := chop(vkey, "+")
@@ -295,7 +295,7 @@
 func (v *verifier) KeyHash() uint32             { return v.hash }
 func (v *verifier) Verify(msg, sig []byte) bool { return v.verify(msg, sig) }
 
-// NewSigner constructs a new Signer from an encoded signer key.
+// NewSigner constructs a new [Signer] from an encoded signer key.
 func NewSigner(skey string) (Signer, error) {
 	priv1, skey := chop(skey, "+")
 	priv2, skey := chop(skey, "+")
@@ -409,7 +409,7 @@
 }
 
 // An ambiguousVerifierError indicates that the given name and hash
-// match multiple keys passed to VerifierList.
+// match multiple keys passed to [VerifierList].
 // (If this happens, some malicious actor has taken control of the
 // verifier list, at which point we may as well give up entirely,
 // but we diagnose the problem instead.)
@@ -422,7 +422,7 @@
 	return fmt.Sprintf("ambiguous key %s+%08x", e.name, e.hash)
 }
 
-// VerifierList returns a Verifiers implementation that uses the given list of verifiers.
+// VerifierList returns a [Verifiers] implementation that uses the given list of verifiers.
 func VerifierList(list ...Verifier) Verifiers {
 	m := make(verifierMap)
 	for _, v := range list {
@@ -510,7 +510,7 @@
 // If known.Verifier returns any other error, Open returns that error.
 //
 // If no known verifier has signed an otherwise valid note,
-// Open returns an UnverifiedNoteError.
+// Open returns an [UnverifiedNoteError].
 // In this case, the unverified note can be fetched from inside the error.
 func Open(msg []byte, known Verifiers) (*Note, error) {
 	if known == nil {
diff --git a/src/cmd/vendor/golang.org/x/mod/sumdb/server.go b/src/cmd/vendor/golang.org/x/mod/sumdb/server.go
index 2e523a5..1e1779d 100644
--- a/src/cmd/vendor/golang.org/x/mod/sumdb/server.go
+++ b/src/cmd/vendor/golang.org/x/mod/sumdb/server.go
@@ -17,7 +17,7 @@
 )
 
 // A ServerOps provides the external operations
-// (underlying database access and so on) needed by the Server.
+// (underlying database access and so on) needed by the [Server].
 type ServerOps interface {
 	// Signed returns the signed hash of the latest tree.
 	Signed(ctx context.Context) ([]byte, error)
@@ -36,7 +36,7 @@
 
 // A Server is the checksum database HTTP server,
 // which implements http.Handler and should be invoked
-// to serve the paths listed in ServerPaths.
+// to serve the paths listed in [ServerPaths].
 type Server struct {
 	ops ServerOps
 }
@@ -148,6 +148,7 @@
 				msg, err := tlog.FormatRecord(start+int64(i), text)
 				if err != nil {
 					http.Error(w, err.Error(), http.StatusInternalServerError)
+					return
 				}
 				data = append(data, msg...)
 			}
diff --git a/src/cmd/vendor/golang.org/x/mod/sumdb/test.go b/src/cmd/vendor/golang.org/x/mod/sumdb/test.go
index c2755b8..fb77245 100644
--- a/src/cmd/vendor/golang.org/x/mod/sumdb/test.go
+++ b/src/cmd/vendor/golang.org/x/mod/sumdb/test.go
@@ -14,15 +14,15 @@
 	"golang.org/x/mod/sumdb/tlog"
 )
 
-// NewTestServer constructs a new TestServer
+// NewTestServer constructs a new [TestServer]
 // that will sign its tree with the given signer key
-// (see golang.org/x/mod/sumdb/note)
+// (see [golang.org/x/mod/sumdb/note])
 // and fetch new records as needed by calling gosum.
 func NewTestServer(signer string, gosum func(path, vers string) ([]byte, error)) *TestServer {
 	return &TestServer{signer: signer, gosum: gosum}
 }
 
-// A TestServer is an in-memory implementation of Server for testing.
+// A TestServer is an in-memory implementation of [ServerOps] for testing.
 type TestServer struct {
 	signer string
 	gosum  func(path, vers string) ([]byte, error)
diff --git a/src/cmd/vendor/golang.org/x/mod/sumdb/tlog/tile.go b/src/cmd/vendor/golang.org/x/mod/sumdb/tlog/tile.go
index e4aeb14..857d487 100644
--- a/src/cmd/vendor/golang.org/x/mod/sumdb/tlog/tile.go
+++ b/src/cmd/vendor/golang.org/x/mod/sumdb/tlog/tile.go
@@ -28,7 +28,7 @@
 // is tile/3/4/x001/x234/067.p/1, and
 // Tile{H: 3, L: 4, N: 1234067, W: 8}'s path
 // is tile/3/4/x001/x234/067.
-// See Tile's Path method and the ParseTilePath function.
+// See the [Tile.Path] method and the [ParseTilePath] function.
 //
 // The special level L=-1 holds raw record data instead of hashes.
 // In this case, the level encodes into a tile path as the path element
@@ -46,7 +46,7 @@
 // TileForIndex returns the tile of fixed height h ≥ 1
 // and least width storing the given hash storage index.
 //
-// If h ≤ 0, TileForIndex panics.
+// If h ≤ 0, [TileForIndex] panics.
 func TileForIndex(h int, index int64) Tile {
 	if h <= 0 {
 		panic(fmt.Sprintf("TileForIndex: invalid height %d", h))
@@ -105,7 +105,7 @@
 // size newTreeSize to replace a tree of size oldTreeSize.
 // (No tiles need to be published for a tree of size zero.)
 //
-// If h ≤ 0, TileForIndex panics.
+// If h ≤ 0, NewTiles panics.
 func NewTiles(h int, oldTreeSize, newTreeSize int64) []Tile {
 	if h <= 0 {
 		panic(fmt.Sprintf("NewTiles: invalid height %d", h))
@@ -272,7 +272,7 @@
 // TileHashReader returns a HashReader that satisfies requests
 // by loading tiles of the given tree.
 //
-// The returned HashReader checks that loaded tiles are
+// The returned [HashReader] checks that loaded tiles are
 // valid for the given tree. Therefore, any hashes returned
 // by the HashReader are already proven to be in the tree.
 func TileHashReader(tree Tree, tr TileReader) HashReader {
diff --git a/src/cmd/vendor/golang.org/x/mod/sumdb/tlog/tlog.go b/src/cmd/vendor/golang.org/x/mod/sumdb/tlog/tlog.go
index ae065f8..6a11a75 100644
--- a/src/cmd/vendor/golang.org/x/mod/sumdb/tlog/tlog.go
+++ b/src/cmd/vendor/golang.org/x/mod/sumdb/tlog/tlog.go
@@ -131,7 +131,7 @@
 	return i + int64(level)
 }
 
-// SplitStoredHashIndex is the inverse of StoredHashIndex.
+// SplitStoredHashIndex is the inverse of [StoredHashIndex].
 // That is, SplitStoredHashIndex(StoredHashIndex(level, n)) == level, n.
 func SplitStoredHashIndex(index int64) (level int, n int64) {
 	// Determine level 0 record before index.
@@ -183,7 +183,7 @@
 	return StoredHashesForRecordHash(n, RecordHash(data), r)
 }
 
-// StoredHashesForRecordHash is like StoredHashes but takes
+// StoredHashesForRecordHash is like [StoredHashes] but takes
 // as its second argument RecordHash(data) instead of data itself.
 func StoredHashesForRecordHash(n int64, h Hash, r HashReader) ([]Hash, error) {
 	// Start with the record hash.
@@ -227,7 +227,7 @@
 	ReadHashes(indexes []int64) ([]Hash, error)
 }
 
-// A HashReaderFunc is a function implementing HashReader.
+// A HashReaderFunc is a function implementing [HashReader].
 type HashReaderFunc func([]int64) ([]Hash, error)
 
 func (f HashReaderFunc) ReadHashes(indexes []int64) ([]Hash, error) {
diff --git a/src/cmd/vendor/golang.org/x/mod/zip/zip.go b/src/cmd/vendor/golang.org/x/mod/zip/zip.go
index 0328705..574f83f 100644
--- a/src/cmd/vendor/golang.org/x/mod/zip/zip.go
+++ b/src/cmd/vendor/golang.org/x/mod/zip/zip.go
@@ -10,31 +10,31 @@
 //
 // • All file paths within a zip file must start with "<module>@<version>/",
 // where "<module>" is the module path and "<version>" is the version.
-// The module path must be valid (see golang.org/x/mod/module.CheckPath).
+// The module path must be valid (see [golang.org/x/mod/module.CheckPath]).
 // The version must be valid and canonical (see
-// golang.org/x/mod/module.CanonicalVersion). The path must have a major
+// [golang.org/x/mod/module.CanonicalVersion]). The path must have a major
 // version suffix consistent with the version (see
-// golang.org/x/mod/module.Check). The part of the file path after the
+// [golang.org/x/mod/module.Check]). The part of the file path after the
 // "<module>@<version>/" prefix must be valid (see
-// golang.org/x/mod/module.CheckFilePath).
+// [golang.org/x/mod/module.CheckFilePath]).
 //
 // • No two file paths may be equal under Unicode case-folding (see
-// strings.EqualFold).
+// [strings.EqualFold]).
 //
 // • A go.mod file may or may not appear in the top-level directory. If present,
 // it must be named "go.mod", not any other case. Files named "go.mod"
 // are not allowed in any other directory.
 //
-// • The total size in bytes of a module zip file may be at most MaxZipFile
+// • The total size in bytes of a module zip file may be at most [MaxZipFile]
 // bytes (500 MiB). The total uncompressed size of the files within the
-// zip may also be at most MaxZipFile bytes.
+// zip may also be at most [MaxZipFile] bytes.
 //
 // • Each file's uncompressed size must match its declared 64-bit uncompressed
 // size in the zip file header.
 //
 // • If the zip contains files named "<module>@<version>/go.mod" or
 // "<module>@<version>/LICENSE", their sizes in bytes may be at most
-// MaxGoMod or MaxLICENSE, respectively (both are 16 MiB).
+// [MaxGoMod] or [MaxLICENSE], respectively (both are 16 MiB).
 //
 // • Empty directories are ignored. File permissions and timestamps are also
 // ignored.
@@ -42,7 +42,7 @@
 // • Symbolic links and other irregular files are not allowed.
 //
 // Note that this package does not provide hashing functionality. See
-// golang.org/x/mod/sumdb/dirhash.
+// [golang.org/x/mod/sumdb/dirhash].
 package zip
 
 import (
@@ -51,12 +51,12 @@
 	"errors"
 	"fmt"
 	"io"
-	"io/ioutil"
 	"os"
 	"os/exec"
 	"path"
 	"path/filepath"
 	"strings"
+	"time"
 	"unicode"
 	"unicode/utf8"
 
@@ -118,8 +118,9 @@
 	SizeError error
 }
 
-// Err returns an error if CheckedFiles does not describe a valid module zip
-// file. SizeError is returned if that field is set. A FileErrorList is returned
+// Err returns an error if [CheckedFiles] does not describe a valid module zip
+// file. [CheckedFiles.SizeError] is returned if that field is set.
+// A [FileErrorList] is returned
 // if there are one or more invalid files. Other errors may be returned in the
 // future.
 func (cf CheckedFiles) Err() error {
@@ -322,17 +323,17 @@
 }
 
 // CheckDir reports whether the files in dir satisfy the name and size
-// constraints listed in the package documentation. The returned CheckedFiles
+// constraints listed in the package documentation. The returned [CheckedFiles]
 // record contains lists of valid, invalid, and omitted files. If a directory is
 // omitted (for example, a nested module or vendor directory), it will appear in
 // the omitted list, but its files won't be listed.
 //
 // CheckDir returns an error if it encounters an I/O error or if the returned
-// CheckedFiles does not describe a valid module zip file (according to
-// CheckedFiles.Err). The returned CheckedFiles is still populated when such
+// [CheckedFiles] does not describe a valid module zip file (according to
+// [CheckedFiles.Err]). The returned [CheckedFiles] is still populated when such
 // an error is returned.
 //
-// Note that CheckDir will not open any files, so CreateFromDir may still fail
+// Note that CheckDir will not open any files, so [CreateFromDir] may still fail
 // when CheckDir is successful due to I/O errors.
 func CheckDir(dir string) (CheckedFiles, error) {
 	// List files (as CreateFromDir would) and check which ones are omitted
@@ -363,13 +364,13 @@
 // CheckZip reports whether the files contained in a zip file satisfy the name
 // and size constraints listed in the package documentation.
 //
-// CheckZip returns an error if the returned CheckedFiles does not describe
-// a valid module zip file (according to CheckedFiles.Err). The returned
+// CheckZip returns an error if the returned [CheckedFiles] does not describe
+// a valid module zip file (according to [CheckedFiles.Err]). The returned
 // CheckedFiles is still populated when an error is returned. CheckZip will
 // also return an error if the module path or version is malformed or if it
 // encounters an error reading the zip file.
 //
-// Note that CheckZip does not read individual files, so Unzip may still fail
+// Note that CheckZip does not read individual files, so [Unzip] may still fail
 // when CheckZip is successful due to I/O errors.
 func CheckZip(m module.Version, zipFile string) (CheckedFiles, error) {
 	f, err := os.Open(zipFile)
@@ -477,7 +478,7 @@
 // and writes it to w.
 //
 // Create verifies the restrictions described in the package documentation
-// and should not produce an archive that Unzip cannot extract. Create does not
+// and should not produce an archive that [Unzip] cannot extract. Create does not
 // include files in the output archive if they don't belong in the module zip.
 // In particular, Create will not include files in modules found in
 // subdirectories, most files in vendor directories, or irregular files (such
@@ -544,12 +545,12 @@
 // a directory, dir. The zip content is written to w.
 //
 // CreateFromDir verifies the restrictions described in the package
-// documentation and should not produce an archive that Unzip cannot extract.
+// documentation and should not produce an archive that [Unzip] cannot extract.
 // CreateFromDir does not include files in the output archive if they don't
 // belong in the module zip. In particular, CreateFromDir will not include
 // files in modules found in subdirectories, most files in vendor directories,
 // or irregular files (such as symbolic links) in the output archive.
-// Additionally, unlike Create, CreateFromDir will not include directories
+// Additionally, unlike [Create], CreateFromDir will not include directories
 // named ".bzr", ".git", ".hg", or ".svn".
 func CreateFromDir(w io.Writer, m module.Version, dir string) (err error) {
 	defer func() {
@@ -581,8 +582,8 @@
 // "sub/dir". To create a zip from the base of the repository, pass an empty
 // string.
 //
-// If CreateFromVCS returns ErrUnrecognizedVCS, consider falling back to
-// CreateFromDir.
+// If CreateFromVCS returns [UnrecognizedVCSError], consider falling back to
+// [CreateFromDir].
 func CreateFromVCS(w io.Writer, m module.Version, repoRoot, revision, subdir string) (err error) {
 	defer func() {
 		if zerr, ok := err.(*zipError); ok {
@@ -654,6 +655,7 @@
 		return nil, err
 	}
 
+	haveLICENSE := false
 	var fs []File
 	for _, zf := range zipReader.File {
 		if !strings.HasPrefix(zf.Name, subdir) || strings.HasSuffix(zf.Name, "/") {
@@ -664,12 +666,29 @@
 		if n == "" {
 			continue
 		}
-		n = strings.TrimPrefix(n, string(filepath.Separator))
+		n = strings.TrimPrefix(n, "/")
 
 		fs = append(fs, zipFile{
 			name: n,
 			f:    zf,
 		})
+		if n == "LICENSE" {
+			haveLICENSE = true
+		}
+	}
+
+	if !haveLICENSE && subdir != "" {
+		// Note: this method of extracting the license from the root copied from
+		// https://go.googlesource.com/go/+/refs/tags/go1.20.4/src/cmd/go/internal/modfetch/coderepo.go#1118
+		// https://go.googlesource.com/go/+/refs/tags/go1.20.4/src/cmd/go/internal/modfetch/codehost/git.go#657
+		cmd := exec.Command("git", "cat-file", "blob", rev+":LICENSE")
+		cmd.Dir = dir
+		cmd.Env = append(os.Environ(), "PWD="+dir)
+		stdout := bytes.Buffer{}
+		cmd.Stdout = &stdout
+		if err := cmd.Run(); err == nil {
+			fs = append(fs, dataFile{name: "LICENSE", data: stdout.Bytes()})
+		}
 	}
 
 	return fs, nil
@@ -711,6 +730,26 @@
 func (f zipFile) Lstat() (os.FileInfo, error)  { return f.f.FileInfo(), nil }
 func (f zipFile) Open() (io.ReadCloser, error) { return f.f.Open() }
 
+type dataFile struct {
+	name string
+	data []byte
+}
+
+func (f dataFile) Path() string                 { return f.name }
+func (f dataFile) Lstat() (os.FileInfo, error)  { return dataFileInfo{f}, nil }
+func (f dataFile) Open() (io.ReadCloser, error) { return io.NopCloser(bytes.NewReader(f.data)), nil }
+
+type dataFileInfo struct {
+	f dataFile
+}
+
+func (fi dataFileInfo) Name() string       { return path.Base(fi.f.name) }
+func (fi dataFileInfo) Size() int64        { return int64(len(fi.f.data)) }
+func (fi dataFileInfo) Mode() os.FileMode  { return 0644 }
+func (fi dataFileInfo) ModTime() time.Time { return time.Time{} }
+func (fi dataFileInfo) IsDir() bool        { return false }
+func (fi dataFileInfo) Sys() interface{}   { return nil }
+
 // isVendoredPackage attempts to report whether the given filename is contained
 // in a package whose import path contains (but does not end with) the component
 // "vendor".
@@ -753,7 +792,7 @@
 
 	// Check that the directory is empty. Don't create it yet in case there's
 	// an error reading the zip.
-	if files, _ := ioutil.ReadDir(dir); len(files) > 0 {
+	if files, _ := os.ReadDir(dir); len(files) > 0 {
 		return fmt.Errorf("target directory %v exists and is not empty", dir)
 	}
 
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/gccgo.go b/src/cmd/vendor/golang.org/x/sys/unix/gccgo.go
index 0dee232..b06f52d 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/gccgo.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/gccgo.go
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build gccgo && !aix
-// +build gccgo,!aix
+//go:build gccgo && !aix && !hurd
+// +build gccgo,!aix,!hurd
 
 package unix
 
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/gccgo_c.c b/src/cmd/vendor/golang.org/x/sys/unix/gccgo_c.c
index 2cb1fef..f98a1c5 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/gccgo_c.c
+++ b/src/cmd/vendor/golang.org/x/sys/unix/gccgo_c.c
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// +build gccgo
-// +build !aix
+//go:build gccgo && !aix && !hurd
+// +build gccgo,!aix,!hurd
 
 #include <errno.h>
 #include <stdint.h>
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/ioctl.go b/src/cmd/vendor/golang.org/x/sys/unix/ioctl.go
deleted file mode 100644
index 6c7ad05..0000000
--- a/src/cmd/vendor/golang.org/x/sys/unix/ioctl.go
+++ /dev/null
@@ -1,75 +0,0 @@
-// Copyright 2018 The Go 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:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris
-// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris
-
-package unix
-
-import (
-	"runtime"
-	"unsafe"
-)
-
-// ioctl itself should not be exposed directly, but additional get/set
-// functions for specific types are permissible.
-
-// IoctlSetInt performs an ioctl operation which sets an integer value
-// on fd, using the specified request number.
-func IoctlSetInt(fd int, req uint, value int) error {
-	return ioctl(fd, req, uintptr(value))
-}
-
-// IoctlSetPointerInt performs an ioctl operation which sets an
-// integer value on fd, using the specified request number. The ioctl
-// argument is called with a pointer to the integer value, rather than
-// passing the integer value directly.
-func IoctlSetPointerInt(fd int, req uint, value int) error {
-	v := int32(value)
-	return ioctl(fd, req, uintptr(unsafe.Pointer(&v)))
-}
-
-// IoctlSetWinsize performs an ioctl on fd with a *Winsize argument.
-//
-// To change fd's window size, the req argument should be TIOCSWINSZ.
-func IoctlSetWinsize(fd int, req uint, value *Winsize) error {
-	// TODO: if we get the chance, remove the req parameter and
-	// hardcode TIOCSWINSZ.
-	err := ioctl(fd, req, uintptr(unsafe.Pointer(value)))
-	runtime.KeepAlive(value)
-	return err
-}
-
-// IoctlSetTermios performs an ioctl on fd with a *Termios.
-//
-// The req value will usually be TCSETA or TIOCSETA.
-func IoctlSetTermios(fd int, req uint, value *Termios) error {
-	// TODO: if we get the chance, remove the req parameter.
-	err := ioctl(fd, req, uintptr(unsafe.Pointer(value)))
-	runtime.KeepAlive(value)
-	return err
-}
-
-// IoctlGetInt performs an ioctl operation which gets an integer value
-// from fd, using the specified request number.
-//
-// A few ioctl requests use the return value as an output parameter;
-// for those, IoctlRetInt should be used instead of this function.
-func IoctlGetInt(fd int, req uint) (int, error) {
-	var value int
-	err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
-	return value, err
-}
-
-func IoctlGetWinsize(fd int, req uint) (*Winsize, error) {
-	var value Winsize
-	err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
-	return &value, err
-}
-
-func IoctlGetTermios(fd int, req uint) (*Termios, error) {
-	var value Termios
-	err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
-	return &value, err
-}
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/ioctl_signed.go b/src/cmd/vendor/golang.org/x/sys/unix/ioctl_signed.go
new file mode 100644
index 0000000..7def958
--- /dev/null
+++ b/src/cmd/vendor/golang.org/x/sys/unix/ioctl_signed.go
@@ -0,0 +1,70 @@
+// Copyright 2018 The Go 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:build aix || solaris
+// +build aix solaris
+
+package unix
+
+import (
+	"unsafe"
+)
+
+// ioctl itself should not be exposed directly, but additional get/set
+// functions for specific types are permissible.
+
+// IoctlSetInt performs an ioctl operation which sets an integer value
+// on fd, using the specified request number.
+func IoctlSetInt(fd int, req int, value int) error {
+	return ioctl(fd, req, uintptr(value))
+}
+
+// IoctlSetPointerInt performs an ioctl operation which sets an
+// integer value on fd, using the specified request number. The ioctl
+// argument is called with a pointer to the integer value, rather than
+// passing the integer value directly.
+func IoctlSetPointerInt(fd int, req int, value int) error {
+	v := int32(value)
+	return ioctlPtr(fd, req, unsafe.Pointer(&v))
+}
+
+// IoctlSetWinsize performs an ioctl on fd with a *Winsize argument.
+//
+// To change fd's window size, the req argument should be TIOCSWINSZ.
+func IoctlSetWinsize(fd int, req int, value *Winsize) error {
+	// TODO: if we get the chance, remove the req parameter and
+	// hardcode TIOCSWINSZ.
+	return ioctlPtr(fd, req, unsafe.Pointer(value))
+}
+
+// IoctlSetTermios performs an ioctl on fd with a *Termios.
+//
+// The req value will usually be TCSETA or TIOCSETA.
+func IoctlSetTermios(fd int, req int, value *Termios) error {
+	// TODO: if we get the chance, remove the req parameter.
+	return ioctlPtr(fd, req, unsafe.Pointer(value))
+}
+
+// IoctlGetInt performs an ioctl operation which gets an integer value
+// from fd, using the specified request number.
+//
+// A few ioctl requests use the return value as an output parameter;
+// for those, IoctlRetInt should be used instead of this function.
+func IoctlGetInt(fd int, req int) (int, error) {
+	var value int
+	err := ioctlPtr(fd, req, unsafe.Pointer(&value))
+	return value, err
+}
+
+func IoctlGetWinsize(fd int, req int) (*Winsize, error) {
+	var value Winsize
+	err := ioctlPtr(fd, req, unsafe.Pointer(&value))
+	return &value, err
+}
+
+func IoctlGetTermios(fd int, req int) (*Termios, error) {
+	var value Termios
+	err := ioctlPtr(fd, req, unsafe.Pointer(&value))
+	return &value, err
+}
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/ioctl_unsigned.go b/src/cmd/vendor/golang.org/x/sys/unix/ioctl_unsigned.go
new file mode 100644
index 0000000..649913d
--- /dev/null
+++ b/src/cmd/vendor/golang.org/x/sys/unix/ioctl_unsigned.go
@@ -0,0 +1,70 @@
+// Copyright 2018 The Go 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:build darwin || dragonfly || freebsd || hurd || linux || netbsd || openbsd
+// +build darwin dragonfly freebsd hurd linux netbsd openbsd
+
+package unix
+
+import (
+	"unsafe"
+)
+
+// ioctl itself should not be exposed directly, but additional get/set
+// functions for specific types are permissible.
+
+// IoctlSetInt performs an ioctl operation which sets an integer value
+// on fd, using the specified request number.
+func IoctlSetInt(fd int, req uint, value int) error {
+	return ioctl(fd, req, uintptr(value))
+}
+
+// IoctlSetPointerInt performs an ioctl operation which sets an
+// integer value on fd, using the specified request number. The ioctl
+// argument is called with a pointer to the integer value, rather than
+// passing the integer value directly.
+func IoctlSetPointerInt(fd int, req uint, value int) error {
+	v := int32(value)
+	return ioctlPtr(fd, req, unsafe.Pointer(&v))
+}
+
+// IoctlSetWinsize performs an ioctl on fd with a *Winsize argument.
+//
+// To change fd's window size, the req argument should be TIOCSWINSZ.
+func IoctlSetWinsize(fd int, req uint, value *Winsize) error {
+	// TODO: if we get the chance, remove the req parameter and
+	// hardcode TIOCSWINSZ.
+	return ioctlPtr(fd, req, unsafe.Pointer(value))
+}
+
+// IoctlSetTermios performs an ioctl on fd with a *Termios.
+//
+// The req value will usually be TCSETA or TIOCSETA.
+func IoctlSetTermios(fd int, req uint, value *Termios) error {
+	// TODO: if we get the chance, remove the req parameter.
+	return ioctlPtr(fd, req, unsafe.Pointer(value))
+}
+
+// IoctlGetInt performs an ioctl operation which gets an integer value
+// from fd, using the specified request number.
+//
+// A few ioctl requests use the return value as an output parameter;
+// for those, IoctlRetInt should be used instead of this function.
+func IoctlGetInt(fd int, req uint) (int, error) {
+	var value int
+	err := ioctlPtr(fd, req, unsafe.Pointer(&value))
+	return value, err
+}
+
+func IoctlGetWinsize(fd int, req uint) (*Winsize, error) {
+	var value Winsize
+	err := ioctlPtr(fd, req, unsafe.Pointer(&value))
+	return &value, err
+}
+
+func IoctlGetTermios(fd int, req uint) (*Termios, error) {
+	var value Termios
+	err := ioctlPtr(fd, req, unsafe.Pointer(&value))
+	return &value, err
+}
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/ioctl_zos.go b/src/cmd/vendor/golang.org/x/sys/unix/ioctl_zos.go
index 5384e7d..cdc21bf 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/ioctl_zos.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/ioctl_zos.go
@@ -17,25 +17,23 @@
 
 // IoctlSetInt performs an ioctl operation which sets an integer value
 // on fd, using the specified request number.
-func IoctlSetInt(fd int, req uint, value int) error {
+func IoctlSetInt(fd int, req int, value int) error {
 	return ioctl(fd, req, uintptr(value))
 }
 
 // IoctlSetWinsize performs an ioctl on fd with a *Winsize argument.
 //
 // To change fd's window size, the req argument should be TIOCSWINSZ.
-func IoctlSetWinsize(fd int, req uint, value *Winsize) error {
+func IoctlSetWinsize(fd int, req int, value *Winsize) error {
 	// TODO: if we get the chance, remove the req parameter and
 	// hardcode TIOCSWINSZ.
-	err := ioctl(fd, req, uintptr(unsafe.Pointer(value)))
-	runtime.KeepAlive(value)
-	return err
+	return ioctlPtr(fd, req, unsafe.Pointer(value))
 }
 
 // IoctlSetTermios performs an ioctl on fd with a *Termios.
 //
 // The req value is expected to be TCSETS, TCSETSW, or TCSETSF
-func IoctlSetTermios(fd int, req uint, value *Termios) error {
+func IoctlSetTermios(fd int, req int, value *Termios) error {
 	if (req != TCSETS) && (req != TCSETSW) && (req != TCSETSF) {
 		return ENOSYS
 	}
@@ -49,22 +47,22 @@
 //
 // A few ioctl requests use the return value as an output parameter;
 // for those, IoctlRetInt should be used instead of this function.
-func IoctlGetInt(fd int, req uint) (int, error) {
+func IoctlGetInt(fd int, req int) (int, error) {
 	var value int
-	err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
+	err := ioctlPtr(fd, req, unsafe.Pointer(&value))
 	return value, err
 }
 
-func IoctlGetWinsize(fd int, req uint) (*Winsize, error) {
+func IoctlGetWinsize(fd int, req int) (*Winsize, error) {
 	var value Winsize
-	err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
+	err := ioctlPtr(fd, req, unsafe.Pointer(&value))
 	return &value, err
 }
 
 // IoctlGetTermios performs an ioctl on fd with a *Termios.
 //
 // The req value is expected to be TCGETS
-func IoctlGetTermios(fd int, req uint) (*Termios, error) {
+func IoctlGetTermios(fd int, req int) (*Termios, error) {
 	var value Termios
 	if req != TCGETS {
 		return &value, ENOSYS
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/mkall.sh b/src/cmd/vendor/golang.org/x/sys/unix/mkall.sh
index 727cba2..e6f31d3 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/mkall.sh
+++ b/src/cmd/vendor/golang.org/x/sys/unix/mkall.sh
@@ -50,7 +50,7 @@
 	# Use the Docker-based build system
 	# Files generated through docker (use $cmd so you can Ctl-C the build or run)
 	$cmd docker build --tag generate:$GOOS $GOOS
-	$cmd docker run --interactive --tty --volume $(cd -- "$(dirname -- "$0")/.." && /bin/pwd):/build generate:$GOOS
+	$cmd docker run --interactive --tty --volume $(cd -- "$(dirname -- "$0")/.." && pwd):/build generate:$GOOS
 	exit
 fi
 
@@ -174,10 +174,10 @@
 	mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char"
 	;;
 openbsd_mips64)
+	mkasm="go run mkasm.go"
 	mkerrors="$mkerrors -m64"
-	mksyscall="go run mksyscall.go -openbsd"
+	mksyscall="go run mksyscall.go -openbsd -libc"
 	mksysctl="go run mksysctl_openbsd.go"
-	mksysnum="go run mksysnum.go 'https://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master'"
 	# Let the type of C char be signed for making the bare syscall
 	# API consistent across platforms.
 	mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char"
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/mkerrors.sh b/src/cmd/vendor/golang.org/x/sys/unix/mkerrors.sh
index 7456d9d..0c4d149 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/mkerrors.sh
+++ b/src/cmd/vendor/golang.org/x/sys/unix/mkerrors.sh
@@ -66,6 +66,7 @@
 #include <sys/ptrace.h>
 #include <sys/select.h>
 #include <sys/socket.h>
+#include <sys/stat.h>
 #include <sys/un.h>
 #include <sys/sockio.h>
 #include <sys/sys_domain.h>
@@ -203,6 +204,7 @@
 #include <sys/timerfd.h>
 #include <sys/uio.h>
 #include <sys/xattr.h>
+#include <netinet/udp.h>
 #include <linux/audit.h>
 #include <linux/bpf.h>
 #include <linux/can.h>
@@ -517,10 +519,11 @@
 		$2 ~ /^LOCK_(SH|EX|NB|UN)$/ ||
 		$2 ~ /^LO_(KEY|NAME)_SIZE$/ ||
 		$2 ~ /^LOOP_(CLR|CTL|GET|SET)_/ ||
-		$2 ~ /^(AF|SOCK|SO|SOL|IPPROTO|IP|IPV6|TCP|MCAST|EVFILT|NOTE|SHUT|PROT|MAP|MFD|T?PACKET|MSG|SCM|MCL|DT|MADV|PR|LOCAL|TCPOPT)_/ ||
+		$2 ~ /^(AF|SOCK|SO|SOL|IPPROTO|IP|IPV6|TCP|MCAST|EVFILT|NOTE|SHUT|PROT|MAP|MREMAP|MFD|T?PACKET|MSG|SCM|MCL|DT|MADV|PR|LOCAL|TCPOPT|UDP)_/ ||
 		$2 ~ /^NFC_(GENL|PROTO|COMM|RF|SE|DIRECTION|LLCP|SOCKPROTO)_/ ||
 		$2 ~ /^NFC_.*_(MAX)?SIZE$/ ||
 		$2 ~ /^RAW_PAYLOAD_/ ||
+		$2 ~ /^[US]F_/ ||
 		$2 ~ /^TP_STATUS_/ ||
 		$2 ~ /^FALLOC_/ ||
 		$2 ~ /^ICMPV?6?_(FILTER|SEC)/ ||
@@ -738,7 +741,8 @@
 		e = errors[i].num;
 		if(i > 0 && errors[i-1].num == e)
 			continue;
-		strcpy(buf, strerror(e));
+		strncpy(buf, strerror(e), sizeof(buf) - 1);
+		buf[sizeof(buf) - 1] = '\0';
 		// lowercase first letter: Bad -> bad, but STREAM -> STREAM.
 		if(A <= buf[0] && buf[0] <= Z && a <= buf[1] && buf[1] <= z)
 			buf[0] += a - A;
@@ -757,7 +761,8 @@
 		e = signals[i].num;
 		if(i > 0 && signals[i-1].num == e)
 			continue;
-		strcpy(buf, strsignal(e));
+		strncpy(buf, strsignal(e), sizeof(buf) - 1);
+		buf[sizeof(buf) - 1] = '\0';
 		// lowercase first letter: Bad -> bad, but STREAM -> STREAM.
 		if(A <= buf[0] && buf[0] <= Z && a <= buf[1] && buf[1] <= z)
 			buf[0] += a - A;
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/mremap.go b/src/cmd/vendor/golang.org/x/sys/unix/mremap.go
new file mode 100644
index 0000000..86213c0
--- /dev/null
+++ b/src/cmd/vendor/golang.org/x/sys/unix/mremap.go
@@ -0,0 +1,40 @@
+// Copyright 2023 The Go 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:build linux
+// +build linux
+
+package unix
+
+import "unsafe"
+
+type mremapMmapper struct {
+	mmapper
+	mremap func(oldaddr uintptr, oldlength uintptr, newlength uintptr, flags int, newaddr uintptr) (xaddr uintptr, err error)
+}
+
+func (m *mremapMmapper) Mremap(oldData []byte, newLength int, flags int) (data []byte, err error) {
+	if newLength <= 0 || len(oldData) == 0 || len(oldData) != cap(oldData) || flags&MREMAP_FIXED != 0 {
+		return nil, EINVAL
+	}
+
+	pOld := &oldData[cap(oldData)-1]
+	m.Lock()
+	defer m.Unlock()
+	bOld := m.active[pOld]
+	if bOld == nil || &bOld[0] != &oldData[0] {
+		return nil, EINVAL
+	}
+	newAddr, errno := m.mremap(uintptr(unsafe.Pointer(&bOld[0])), uintptr(len(bOld)), uintptr(newLength), flags, 0)
+	if errno != nil {
+		return nil, errno
+	}
+	bNew := unsafe.Slice((*byte)(unsafe.Pointer(newAddr)), newLength)
+	pNew := &bNew[cap(bNew)-1]
+	if flags&MREMAP_DONTUNMAP == 0 {
+		delete(m.active, pOld)
+	}
+	m.active[pNew] = bNew
+	return bNew, nil
+}
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/ptrace_darwin.go b/src/cmd/vendor/golang.org/x/sys/unix/ptrace_darwin.go
index 463c3ef..39dba6c 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/ptrace_darwin.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/ptrace_darwin.go
@@ -7,6 +7,12 @@
 
 package unix
 
+import "unsafe"
+
 func ptrace(request int, pid int, addr uintptr, data uintptr) error {
 	return ptrace1(request, pid, addr, data)
 }
+
+func ptracePtr(request int, pid int, addr uintptr, data unsafe.Pointer) error {
+	return ptrace1Ptr(request, pid, addr, data)
+}
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/ptrace_ios.go b/src/cmd/vendor/golang.org/x/sys/unix/ptrace_ios.go
index ed0509a..9ea6633 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/ptrace_ios.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/ptrace_ios.go
@@ -7,6 +7,12 @@
 
 package unix
 
+import "unsafe"
+
 func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) {
 	return ENOTSUP
 }
+
+func ptracePtr(request int, pid int, addr uintptr, data unsafe.Pointer) (err error) {
+	return ENOTSUP
+}
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/syscall_aix.go b/src/cmd/vendor/golang.org/x/sys/unix/syscall_aix.go
index 2db1b51..c406ae0 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/syscall_aix.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/syscall_aix.go
@@ -292,9 +292,7 @@
 				break
 			}
 		}
-
-		bytes := (*[len(pp.Path)]byte)(unsafe.Pointer(&pp.Path[0]))[0:n]
-		sa.Name = string(bytes)
+		sa.Name = string(unsafe.Slice((*byte)(unsafe.Pointer(&pp.Path[0])), n))
 		return sa, nil
 
 	case AF_INET:
@@ -410,7 +408,8 @@
 
 func (w WaitStatus) TrapCause() int { return -1 }
 
-//sys	ioctl(fd int, req uint, arg uintptr) (err error)
+//sys	ioctl(fd int, req int, arg uintptr) (err error)
+//sys	ioctlPtr(fd int, req int, arg unsafe.Pointer) (err error) = ioctl
 
 // fcntl must never be called with cmd=F_DUP2FD because it doesn't work on AIX
 // There is no way to create a custom fcntl and to keep //sys fcntl easily,
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/syscall_aix_ppc.go b/src/cmd/vendor/golang.org/x/sys/unix/syscall_aix_ppc.go
index e92a0be..f2871fa 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/syscall_aix_ppc.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/syscall_aix_ppc.go
@@ -8,7 +8,6 @@
 package unix
 
 //sysnb	Getrlimit(resource int, rlim *Rlimit) (err error) = getrlimit64
-//sysnb	Setrlimit(resource int, rlim *Rlimit) (err error) = setrlimit64
 //sys	Seek(fd int, offset int64, whence int) (off int64, err error) = lseek64
 
 //sys	mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error)
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/syscall_aix_ppc64.go b/src/cmd/vendor/golang.org/x/sys/unix/syscall_aix_ppc64.go
index 16eed17..75718ec 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/syscall_aix_ppc64.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/syscall_aix_ppc64.go
@@ -8,7 +8,6 @@
 package unix
 
 //sysnb	Getrlimit(resource int, rlim *Rlimit) (err error)
-//sysnb	Setrlimit(resource int, rlim *Rlimit) (err error)
 //sys	Seek(fd int, offset int64, whence int) (off int64, err error) = lseek
 
 //sys	mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) = mmap64
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/syscall_bsd.go b/src/cmd/vendor/golang.org/x/sys/unix/syscall_bsd.go
index eda4267..7705c32 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/syscall_bsd.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/syscall_bsd.go
@@ -245,8 +245,7 @@
 				break
 			}
 		}
-		bytes := (*[len(pp.Path)]byte)(unsafe.Pointer(&pp.Path[0]))[0:n]
-		sa.Name = string(bytes)
+		sa.Name = string(unsafe.Slice((*byte)(unsafe.Pointer(&pp.Path[0])), n))
 		return sa, nil
 
 	case AF_INET:
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/syscall_darwin.go b/src/cmd/vendor/golang.org/x/sys/unix/syscall_darwin.go
index 1f63382..2069215 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/syscall_darwin.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/syscall_darwin.go
@@ -14,7 +14,6 @@
 
 import (
 	"fmt"
-	"runtime"
 	"syscall"
 	"unsafe"
 )
@@ -230,6 +229,7 @@
 
 func PtraceAttach(pid int) (err error) { return ptrace(PT_ATTACH, pid, 0, 0) }
 func PtraceDetach(pid int) (err error) { return ptrace(PT_DETACH, pid, 0, 0) }
+func PtraceDenyAttach() (err error)    { return ptrace(PT_DENY_ATTACH, 0, 0, 0) }
 
 //sysnb	pipe(p *[2]int32) (err error)
 
@@ -375,11 +375,10 @@
 func Kill(pid int, signum syscall.Signal) (err error) { return kill(pid, int(signum), 1) }
 
 //sys	ioctl(fd int, req uint, arg uintptr) (err error)
+//sys	ioctlPtr(fd int, req uint, arg unsafe.Pointer) (err error) = SYS_IOCTL
 
 func IoctlCtlInfo(fd int, ctlInfo *CtlInfo) error {
-	err := ioctl(fd, CTLIOCGINFO, uintptr(unsafe.Pointer(ctlInfo)))
-	runtime.KeepAlive(ctlInfo)
-	return err
+	return ioctlPtr(fd, CTLIOCGINFO, unsafe.Pointer(ctlInfo))
 }
 
 // IfreqMTU is struct ifreq used to get or set a network device's MTU.
@@ -393,16 +392,14 @@
 func IoctlGetIfreqMTU(fd int, ifname string) (*IfreqMTU, error) {
 	var ifreq IfreqMTU
 	copy(ifreq.Name[:], ifname)
-	err := ioctl(fd, SIOCGIFMTU, uintptr(unsafe.Pointer(&ifreq)))
+	err := ioctlPtr(fd, SIOCGIFMTU, unsafe.Pointer(&ifreq))
 	return &ifreq, err
 }
 
 // IoctlSetIfreqMTU performs the SIOCSIFMTU ioctl operation on fd to set the MTU
 // of the network device specified by ifreq.Name.
 func IoctlSetIfreqMTU(fd int, ifreq *IfreqMTU) error {
-	err := ioctl(fd, SIOCSIFMTU, uintptr(unsafe.Pointer(ifreq)))
-	runtime.KeepAlive(ifreq)
-	return err
+	return ioctlPtr(fd, SIOCSIFMTU, unsafe.Pointer(ifreq))
 }
 
 //sys	sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) = SYS_SYSCTL
@@ -616,6 +613,7 @@
 //sys	Rmdir(path string) (err error)
 //sys	Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK
 //sys	Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error)
+//sys	Setattrlist(path string, attrlist *Attrlist, attrBuf []byte, options int) (err error)
 //sys	Setegid(egid int) (err error)
 //sysnb	Seteuid(euid int) (err error)
 //sysnb	Setgid(gid int) (err error)
@@ -625,7 +623,6 @@
 //sys	Setprivexec(flag int) (err error)
 //sysnb	Setregid(rgid int, egid int) (err error)
 //sysnb	Setreuid(ruid int, euid int) (err error)
-//sysnb	Setrlimit(which int, lim *Rlimit) (err error)
 //sysnb	Setsid() (pid int, err error)
 //sysnb	Settimeofday(tp *Timeval) (err error)
 //sysnb	Setuid(uid int) (err error)
@@ -679,7 +676,6 @@
 // Kqueue_from_portset_np
 // Kqueue_portset
 // Getattrlist
-// Setattrlist
 // Getdirentriesattr
 // Searchfs
 // Delete
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go b/src/cmd/vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go
index b37310c..9fa8798 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go
@@ -47,5 +47,6 @@
 //sys	getfsstat(buf unsafe.Pointer, size uintptr, flags int) (n int, err error) = SYS_GETFSSTAT64
 //sys	Lstat(path string, stat *Stat_t) (err error) = SYS_LSTAT64
 //sys	ptrace1(request int, pid int, addr uintptr, data uintptr) (err error) = SYS_ptrace
+//sys	ptrace1Ptr(request int, pid int, addr unsafe.Pointer, data uintptr) (err error) = SYS_ptrace
 //sys	Stat(path string, stat *Stat_t) (err error) = SYS_STAT64
 //sys	Statfs(path string, stat *Statfs_t) (err error) = SYS_STATFS64
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go b/src/cmd/vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go
index d51ec99..f17b8c5 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go
@@ -47,5 +47,6 @@
 //sys	getfsstat(buf unsafe.Pointer, size uintptr, flags int) (n int, err error) = SYS_GETFSSTAT
 //sys	Lstat(path string, stat *Stat_t) (err error)
 //sys	ptrace1(request int, pid int, addr uintptr, data uintptr) (err error) = SYS_ptrace
+//sys	ptrace1Ptr(request int, pid int, addr unsafe.Pointer, data uintptr) (err error) = SYS_ptrace
 //sys	Stat(path string, stat *Stat_t) (err error)
 //sys	Statfs(path string, stat *Statfs_t) (err error)
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/syscall_dragonfly.go b/src/cmd/vendor/golang.org/x/sys/unix/syscall_dragonfly.go
index 61c0d0d..d4ce988 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/syscall_dragonfly.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/syscall_dragonfly.go
@@ -172,6 +172,7 @@
 }
 
 //sys	ioctl(fd int, req uint, arg uintptr) (err error)
+//sys	ioctlPtr(fd int, req uint, arg unsafe.Pointer) (err error) = SYS_IOCTL
 
 //sys	sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) = SYS___SYSCTL
 
@@ -255,6 +256,7 @@
 //sys	Chmod(path string, mode uint32) (err error)
 //sys	Chown(path string, uid int, gid int) (err error)
 //sys	Chroot(path string) (err error)
+//sys	ClockGettime(clockid int32, time *Timespec) (err error)
 //sys	Close(fd int) (err error)
 //sys	Dup(fd int) (nfd int, err error)
 //sys	Dup2(from int, to int) (err error)
@@ -324,7 +326,6 @@
 //sysnb	Setreuid(ruid int, euid int) (err error)
 //sysnb	Setresgid(rgid int, egid int, sgid int) (err error)
 //sysnb	Setresuid(ruid int, euid int, suid int) (err error)
-//sysnb	Setrlimit(which int, lim *Rlimit) (err error)
 //sysnb	Setsid() (pid int, err error)
 //sysnb	Settimeofday(tp *Timeval) (err error)
 //sysnb	Setuid(uid int) (err error)
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/syscall_freebsd.go b/src/cmd/vendor/golang.org/x/sys/unix/syscall_freebsd.go
index de7c23e..afb1010 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/syscall_freebsd.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/syscall_freebsd.go
@@ -161,7 +161,8 @@
 	return
 }
 
-//sys	ioctl(fd int, req uint, arg uintptr) (err error)
+//sys	ioctl(fd int, req uint, arg uintptr) (err error) = SYS_IOCTL
+//sys	ioctlPtr(fd int, req uint, arg unsafe.Pointer) (err error) = SYS_IOCTL
 
 //sys	sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) = SYS___SYSCTL
 
@@ -253,6 +254,7 @@
 }
 
 //sys	ptrace(request int, pid int, addr uintptr, data int) (err error)
+//sys	ptracePtr(request int, pid int, addr unsafe.Pointer, data int) (err error) = SYS_PTRACE
 
 func PtraceAttach(pid int) (err error) {
 	return ptrace(PT_ATTACH, pid, 0, 0)
@@ -267,19 +269,36 @@
 }
 
 func PtraceGetFpRegs(pid int, fpregsout *FpReg) (err error) {
-	return ptrace(PT_GETFPREGS, pid, uintptr(unsafe.Pointer(fpregsout)), 0)
+	return ptracePtr(PT_GETFPREGS, pid, unsafe.Pointer(fpregsout), 0)
 }
 
 func PtraceGetRegs(pid int, regsout *Reg) (err error) {
-	return ptrace(PT_GETREGS, pid, uintptr(unsafe.Pointer(regsout)), 0)
+	return ptracePtr(PT_GETREGS, pid, unsafe.Pointer(regsout), 0)
+}
+
+func PtraceIO(req int, pid int, offs uintptr, out []byte, countin int) (count int, err error) {
+	ioDesc := PtraceIoDesc{
+		Op:   int32(req),
+		Offs: offs,
+	}
+	if countin > 0 {
+		_ = out[:countin] // check bounds
+		ioDesc.Addr = &out[0]
+	} else if out != nil {
+		ioDesc.Addr = (*byte)(unsafe.Pointer(&_zero))
+	}
+	ioDesc.SetLen(countin)
+
+	err = ptracePtr(PT_IO, pid, unsafe.Pointer(&ioDesc), 0)
+	return int(ioDesc.Len), err
 }
 
 func PtraceLwpEvents(pid int, enable int) (err error) {
 	return ptrace(PT_LWP_EVENTS, pid, 0, enable)
 }
 
-func PtraceLwpInfo(pid int, info uintptr) (err error) {
-	return ptrace(PT_LWPINFO, pid, info, int(unsafe.Sizeof(PtraceLwpInfoStruct{})))
+func PtraceLwpInfo(pid int, info *PtraceLwpInfoStruct) (err error) {
+	return ptracePtr(PT_LWPINFO, pid, unsafe.Pointer(info), int(unsafe.Sizeof(*info)))
 }
 
 func PtracePeekData(pid int, addr uintptr, out []byte) (count int, err error) {
@@ -299,13 +318,25 @@
 }
 
 func PtraceSetRegs(pid int, regs *Reg) (err error) {
-	return ptrace(PT_SETREGS, pid, uintptr(unsafe.Pointer(regs)), 0)
+	return ptracePtr(PT_SETREGS, pid, unsafe.Pointer(regs), 0)
 }
 
 func PtraceSingleStep(pid int) (err error) {
 	return ptrace(PT_STEP, pid, 1, 0)
 }
 
+func Dup3(oldfd, newfd, flags int) error {
+	if oldfd == newfd || flags&^O_CLOEXEC != 0 {
+		return EINVAL
+	}
+	how := F_DUP2FD
+	if flags&O_CLOEXEC != 0 {
+		how = F_DUP2FD_CLOEXEC
+	}
+	_, err := fcntl(oldfd, how, newfd)
+	return err
+}
+
 /*
  * Exposed directly
  */
@@ -319,6 +350,7 @@
 //sys	Chmod(path string, mode uint32) (err error)
 //sys	Chown(path string, uid int, gid int) (err error)
 //sys	Chroot(path string) (err error)
+//sys	ClockGettime(clockid int32, time *Timespec) (err error)
 //sys	Close(fd int) (err error)
 //sys	Dup(fd int) (nfd int, err error)
 //sys	Dup2(from int, to int) (err error)
@@ -401,7 +433,6 @@
 //sysnb	Setreuid(ruid int, euid int) (err error)
 //sysnb	Setresgid(rgid int, egid int, sgid int) (err error)
 //sysnb	Setresuid(ruid int, euid int, suid int) (err error)
-//sysnb	Setrlimit(which int, lim *Rlimit) (err error)
 //sysnb	Setsid() (pid int, err error)
 //sysnb	Settimeofday(tp *Timeval) (err error)
 //sysnb	Setuid(uid int) (err error)
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/syscall_freebsd_386.go b/src/cmd/vendor/golang.org/x/sys/unix/syscall_freebsd_386.go
index b11ede8..b8da510 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/syscall_freebsd_386.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/syscall_freebsd_386.go
@@ -42,6 +42,10 @@
 	cmsg.Len = uint32(length)
 }
 
+func (d *PtraceIoDesc) SetLen(length int) {
+	d.Len = uint32(length)
+}
+
 func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {
 	var writtenOut uint64 = 0
 	_, _, e1 := Syscall9(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr((*offset)>>32), uintptr(count), 0, uintptr(unsafe.Pointer(&writtenOut)), 0, 0)
@@ -57,11 +61,5 @@
 func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno)
 
 func PtraceGetFsBase(pid int, fsbase *int64) (err error) {
-	return ptrace(PT_GETFSBASE, pid, uintptr(unsafe.Pointer(fsbase)), 0)
-}
-
-func PtraceIO(req int, pid int, addr uintptr, out []byte, countin int) (count int, err error) {
-	ioDesc := PtraceIoDesc{Op: int32(req), Offs: uintptr(unsafe.Pointer(addr)), Addr: uintptr(unsafe.Pointer(&out[0])), Len: uint32(countin)}
-	err = ptrace(PT_IO, pid, uintptr(unsafe.Pointer(&ioDesc)), 0)
-	return int(ioDesc.Len), err
+	return ptracePtr(PT_GETFSBASE, pid, unsafe.Pointer(fsbase), 0)
 }
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go b/src/cmd/vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go
index 9ed8eec..47155c4 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go
@@ -42,6 +42,10 @@
 	cmsg.Len = uint32(length)
 }
 
+func (d *PtraceIoDesc) SetLen(length int) {
+	d.Len = uint64(length)
+}
+
 func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {
 	var writtenOut uint64 = 0
 	_, _, e1 := Syscall9(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr(count), 0, uintptr(unsafe.Pointer(&writtenOut)), 0, 0, 0)
@@ -57,11 +61,5 @@
 func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno)
 
 func PtraceGetFsBase(pid int, fsbase *int64) (err error) {
-	return ptrace(PT_GETFSBASE, pid, uintptr(unsafe.Pointer(fsbase)), 0)
-}
-
-func PtraceIO(req int, pid int, addr uintptr, out []byte, countin int) (count int, err error) {
-	ioDesc := PtraceIoDesc{Op: int32(req), Offs: uintptr(unsafe.Pointer(addr)), Addr: uintptr(unsafe.Pointer(&out[0])), Len: uint64(countin)}
-	err = ptrace(PT_IO, pid, uintptr(unsafe.Pointer(&ioDesc)), 0)
-	return int(ioDesc.Len), err
+	return ptracePtr(PT_GETFSBASE, pid, unsafe.Pointer(fsbase), 0)
 }
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go b/src/cmd/vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go
index f8ac982..0893209 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go
@@ -42,6 +42,10 @@
 	cmsg.Len = uint32(length)
 }
 
+func (d *PtraceIoDesc) SetLen(length int) {
+	d.Len = uint32(length)
+}
+
 func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {
 	var writtenOut uint64 = 0
 	_, _, e1 := Syscall9(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr((*offset)>>32), uintptr(count), 0, uintptr(unsafe.Pointer(&writtenOut)), 0, 0)
@@ -55,9 +59,3 @@
 }
 
 func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno)
-
-func PtraceIO(req int, pid int, addr uintptr, out []byte, countin int) (count int, err error) {
-	ioDesc := PtraceIoDesc{Op: int32(req), Offs: uintptr(unsafe.Pointer(addr)), Addr: uintptr(unsafe.Pointer(&out[0])), Len: uint32(countin)}
-	err = ptrace(PT_IO, pid, uintptr(unsafe.Pointer(&ioDesc)), 0)
-	return int(ioDesc.Len), err
-}
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/syscall_freebsd_arm64.go b/src/cmd/vendor/golang.org/x/sys/unix/syscall_freebsd_arm64.go
index 8e93203..d151a0d 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/syscall_freebsd_arm64.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/syscall_freebsd_arm64.go
@@ -42,6 +42,10 @@
 	cmsg.Len = uint32(length)
 }
 
+func (d *PtraceIoDesc) SetLen(length int) {
+	d.Len = uint64(length)
+}
+
 func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {
 	var writtenOut uint64 = 0
 	_, _, e1 := Syscall9(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr(count), 0, uintptr(unsafe.Pointer(&writtenOut)), 0, 0, 0)
@@ -55,9 +59,3 @@
 }
 
 func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno)
-
-func PtraceIO(req int, pid int, addr uintptr, out []byte, countin int) (count int, err error) {
-	ioDesc := PtraceIoDesc{Op: int32(req), Offs: uintptr(unsafe.Pointer(addr)), Addr: uintptr(unsafe.Pointer(&out[0])), Len: uint64(countin)}
-	err = ptrace(PT_IO, pid, uintptr(unsafe.Pointer(&ioDesc)), 0)
-	return int(ioDesc.Len), err
-}
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/syscall_freebsd_riscv64.go b/src/cmd/vendor/golang.org/x/sys/unix/syscall_freebsd_riscv64.go
index cbe1222..d5cd64b 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/syscall_freebsd_riscv64.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/syscall_freebsd_riscv64.go
@@ -42,6 +42,10 @@
 	cmsg.Len = uint32(length)
 }
 
+func (d *PtraceIoDesc) SetLen(length int) {
+	d.Len = uint64(length)
+}
+
 func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {
 	var writtenOut uint64 = 0
 	_, _, e1 := Syscall9(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr(count), 0, uintptr(unsafe.Pointer(&writtenOut)), 0, 0, 0)
@@ -55,9 +59,3 @@
 }
 
 func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno)
-
-func PtraceIO(req int, pid int, addr uintptr, out []byte, countin int) (count int, err error) {
-	ioDesc := PtraceIoDesc{Op: int32(req), Offs: uintptr(unsafe.Pointer(addr)), Addr: uintptr(unsafe.Pointer(&out[0])), Len: uint64(countin)}
-	err = ptrace(PT_IO, pid, uintptr(unsafe.Pointer(&ioDesc)), 0)
-	return int(ioDesc.Len), err
-}
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/syscall_hurd.go b/src/cmd/vendor/golang.org/x/sys/unix/syscall_hurd.go
new file mode 100644
index 0000000..381fd46
--- /dev/null
+++ b/src/cmd/vendor/golang.org/x/sys/unix/syscall_hurd.go
@@ -0,0 +1,30 @@
+// Copyright 2022 The Go 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:build hurd
+// +build hurd
+
+package unix
+
+/*
+#include <stdint.h>
+int ioctl(int, unsigned long int, uintptr_t);
+*/
+import "C"
+
+func ioctl(fd int, req uint, arg uintptr) (err error) {
+	r0, er := C.ioctl(C.int(fd), C.ulong(req), C.uintptr_t(arg))
+	if r0 == -1 && er != nil {
+		err = er
+	}
+	return
+}
+
+func ioctlPtr(fd int, req uint, arg unsafe.Pointer) (err error) {
+	r0, er := C.ioctl(C.int(fd), C.ulong(req), C.uintptr_t(uintptr(arg)))
+	if r0 == -1 && er != nil {
+		err = er
+	}
+	return
+}
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/syscall_hurd_386.go b/src/cmd/vendor/golang.org/x/sys/unix/syscall_hurd_386.go
new file mode 100644
index 0000000..7cf54a3
--- /dev/null
+++ b/src/cmd/vendor/golang.org/x/sys/unix/syscall_hurd_386.go
@@ -0,0 +1,29 @@
+// Copyright 2022 The Go 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:build 386 && hurd
+// +build 386,hurd
+
+package unix
+
+const (
+	TIOCGETA = 0x62251713
+)
+
+type Winsize struct {
+	Row    uint16
+	Col    uint16
+	Xpixel uint16
+	Ypixel uint16
+}
+
+type Termios struct {
+	Iflag  uint32
+	Oflag  uint32
+	Cflag  uint32
+	Lflag  uint32
+	Cc     [20]uint8
+	Ispeed int32
+	Ospeed int32
+}
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux.go b/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux.go
index c5a9844..39de5f1 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux.go
@@ -1015,8 +1015,7 @@
 		for n < len(pp.Path) && pp.Path[n] != 0 {
 			n++
 		}
-		bytes := (*[len(pp.Path)]byte)(unsafe.Pointer(&pp.Path[0]))[0:n]
-		sa.Name = string(bytes)
+		sa.Name = string(unsafe.Slice((*byte)(unsafe.Pointer(&pp.Path[0])), n))
 		return sa, nil
 
 	case AF_INET:
@@ -1365,6 +1364,10 @@
 	return setsockopt(fd, level, opt, unsafe.Pointer(&o[0]), uintptr(SizeofTCPRepairOpt*len(o)))
 }
 
+func SetsockoptTCPMD5Sig(fd, level, opt int, s *TCPMD5Sig) error {
+	return setsockopt(fd, level, opt, unsafe.Pointer(s), unsafe.Sizeof(*s))
+}
+
 // Keyctl Commands (http://man7.org/linux/man-pages/man2/keyctl.2.html)
 
 // KeyctlInt calls keyctl commands in which each argument is an int.
@@ -1579,6 +1582,7 @@
 }
 
 //sys	ptrace(request int, pid int, addr uintptr, data uintptr) (err error)
+//sys	ptracePtr(request int, pid int, addr uintptr, data unsafe.Pointer) (err error) = SYS_PTRACE
 
 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
@@ -1596,7 +1600,7 @@
 	// boundary.
 	n := 0
 	if addr%SizeofPtr != 0 {
-		err = ptrace(req, pid, addr-addr%SizeofPtr, uintptr(unsafe.Pointer(&buf[0])))
+		err = ptracePtr(req, pid, addr-addr%SizeofPtr, unsafe.Pointer(&buf[0]))
 		if err != nil {
 			return 0, err
 		}
@@ -1608,7 +1612,7 @@
 	for len(out) > 0 {
 		// We use an internal buffer to guarantee 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])))
+		err = ptracePtr(req, pid, addr+uintptr(n), unsafe.Pointer(&buf[0]))
 		if err != nil {
 			return n, err
 		}
@@ -1640,7 +1644,7 @@
 	n := 0
 	if addr%SizeofPtr != 0 {
 		var buf [SizeofPtr]byte
-		err = ptrace(peekReq, pid, addr-addr%SizeofPtr, uintptr(unsafe.Pointer(&buf[0])))
+		err = ptracePtr(peekReq, pid, addr-addr%SizeofPtr, unsafe.Pointer(&buf[0]))
 		if err != nil {
 			return 0, err
 		}
@@ -1667,7 +1671,7 @@
 	// Trailing edge.
 	if len(data) > 0 {
 		var buf [SizeofPtr]byte
-		err = ptrace(peekReq, pid, addr+uintptr(n), uintptr(unsafe.Pointer(&buf[0])))
+		err = ptracePtr(peekReq, pid, addr+uintptr(n), unsafe.Pointer(&buf[0]))
 		if err != nil {
 			return n, err
 		}
@@ -1695,12 +1699,23 @@
 	return ptracePoke(PTRACE_POKEUSR, PTRACE_PEEKUSR, pid, addr, data)
 }
 
+// elfNT_PRSTATUS is a copy of the debug/elf.NT_PRSTATUS constant so
+// x/sys/unix doesn't need to depend on debug/elf and thus
+// compress/zlib, debug/dwarf, and other packages.
+const elfNT_PRSTATUS = 1
+
 func PtraceGetRegs(pid int, regsout *PtraceRegs) (err error) {
-	return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout)))
+	var iov Iovec
+	iov.Base = (*byte)(unsafe.Pointer(regsout))
+	iov.SetLen(int(unsafe.Sizeof(*regsout)))
+	return ptracePtr(PTRACE_GETREGSET, pid, uintptr(elfNT_PRSTATUS), unsafe.Pointer(&iov))
 }
 
 func PtraceSetRegs(pid int, regs *PtraceRegs) (err error) {
-	return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs)))
+	var iov Iovec
+	iov.Base = (*byte)(unsafe.Pointer(regs))
+	iov.SetLen(int(unsafe.Sizeof(*regs)))
+	return ptracePtr(PTRACE_SETREGSET, pid, uintptr(elfNT_PRSTATUS), unsafe.Pointer(&iov))
 }
 
 func PtraceSetOptions(pid int, options int) (err error) {
@@ -1709,7 +1724,7 @@
 
 func PtraceGetEventMsg(pid int) (msg uint, err error) {
 	var data _C_long
-	err = ptrace(PTRACE_GETEVENTMSG, pid, 0, uintptr(unsafe.Pointer(&data)))
+	err = ptracePtr(PTRACE_GETEVENTMSG, pid, 0, unsafe.Pointer(&data))
 	msg = uint(data)
 	return
 }
@@ -1800,6 +1815,7 @@
 //sysnb	Capset(hdr *CapUserHeader, data *CapUserData) (err error)
 //sys	Chdir(path string) (err error)
 //sys	Chroot(path string) (err error)
+//sys	ClockAdjtime(clockid int32, buf *Timex) (state int, err error)
 //sys	ClockGetres(clockid int32, res *Timespec) (err error)
 //sys	ClockGettime(clockid int32, time *Timespec) (err error)
 //sys	ClockNanosleep(clockid int32, flags int, request *Timespec, remain *Timespec) (err error)
@@ -1868,7 +1884,6 @@
 //sys	OpenTree(dfd int, fileName string, flags uint) (r int, err error)
 //sys	PerfEventOpen(attr *PerfEventAttr, pid int, cpu int, groupFd int, flags int) (fd int, err error)
 //sys	PivotRoot(newroot string, putold string) (err error) = SYS_PIVOT_ROOT
-//sysnb	Prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) = SYS_PRLIMIT64
 //sys	Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error)
 //sys	Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) = SYS_PSELECT6
 //sys	read(fd int, p []byte) (n int, err error)
@@ -1882,6 +1897,15 @@
 //sysnb	Settimeofday(tv *Timeval) (err error)
 //sys	Setns(fd int, nstype int) (err error)
 
+//go:linkname syscall_prlimit syscall.prlimit
+func syscall_prlimit(pid, resource int, newlimit, old *syscall.Rlimit) error
+
+func Prlimit(pid, resource int, newlimit, old *Rlimit) error {
+	// Just call the syscall version, because as of Go 1.21
+	// it will affect starting a new process.
+	return syscall_prlimit(pid, resource, (*syscall.Rlimit)(newlimit), (*syscall.Rlimit)(old))
+}
+
 // PrctlRetInt performs a prctl operation specified by option and further
 // optional arguments arg2 through arg5 depending on option. It returns a
 // non-negative integer that is returned by the prctl syscall.
@@ -1973,36 +1997,46 @@
 //sys	preadv2(fd int, iovs []Iovec, offs_l uintptr, offs_h uintptr, flags int) (n int, err error) = SYS_PREADV2
 //sys	pwritev2(fd int, iovs []Iovec, offs_l uintptr, offs_h uintptr, flags int) (n int, err error) = SYS_PWRITEV2
 
-func bytes2iovec(bs [][]byte) []Iovec {
-	iovecs := make([]Iovec, len(bs))
-	for i, b := range bs {
-		iovecs[i].SetLen(len(b))
+// minIovec is the size of the small initial allocation used by
+// Readv, Writev, etc.
+//
+// This small allocation gets stack allocated, which lets the
+// common use case of len(iovs) <= minIovs avoid more expensive
+// heap allocations.
+const minIovec = 8
+
+// appendBytes converts bs to Iovecs and appends them to vecs.
+func appendBytes(vecs []Iovec, bs [][]byte) []Iovec {
+	for _, b := range bs {
+		var v Iovec
+		v.SetLen(len(b))
 		if len(b) > 0 {
-			iovecs[i].Base = &b[0]
+			v.Base = &b[0]
 		} else {
-			iovecs[i].Base = (*byte)(unsafe.Pointer(&_zero))
+			v.Base = (*byte)(unsafe.Pointer(&_zero))
 		}
+		vecs = append(vecs, v)
 	}
-	return iovecs
+	return vecs
 }
 
-// offs2lohi splits offs into its lower and upper unsigned long. On 64-bit
-// systems, hi will always be 0. On 32-bit systems, offs will be split in half.
-// preadv/pwritev chose this calling convention so they don't need to add a
-// padding-register for alignment on ARM.
+// offs2lohi splits offs into its low and high order bits.
 func offs2lohi(offs int64) (lo, hi uintptr) {
-	return uintptr(offs), uintptr(uint64(offs) >> SizeofLong)
+	const longBits = SizeofLong * 8
+	return uintptr(offs), uintptr(uint64(offs) >> (longBits - 1) >> 1) // two shifts to avoid false positive in vet
 }
 
 func Readv(fd int, iovs [][]byte) (n int, err error) {
-	iovecs := bytes2iovec(iovs)
+	iovecs := make([]Iovec, 0, minIovec)
+	iovecs = appendBytes(iovecs, iovs)
 	n, err = readv(fd, iovecs)
 	readvRacedetect(iovecs, n, err)
 	return n, err
 }
 
 func Preadv(fd int, iovs [][]byte, offset int64) (n int, err error) {
-	iovecs := bytes2iovec(iovs)
+	iovecs := make([]Iovec, 0, minIovec)
+	iovecs = appendBytes(iovecs, iovs)
 	lo, hi := offs2lohi(offset)
 	n, err = preadv(fd, iovecs, lo, hi)
 	readvRacedetect(iovecs, n, err)
@@ -2010,7 +2044,8 @@
 }
 
 func Preadv2(fd int, iovs [][]byte, offset int64, flags int) (n int, err error) {
-	iovecs := bytes2iovec(iovs)
+	iovecs := make([]Iovec, 0, minIovec)
+	iovecs = appendBytes(iovecs, iovs)
 	lo, hi := offs2lohi(offset)
 	n, err = preadv2(fd, iovecs, lo, hi, flags)
 	readvRacedetect(iovecs, n, err)
@@ -2037,7 +2072,8 @@
 }
 
 func Writev(fd int, iovs [][]byte) (n int, err error) {
-	iovecs := bytes2iovec(iovs)
+	iovecs := make([]Iovec, 0, minIovec)
+	iovecs = appendBytes(iovecs, iovs)
 	if raceenabled {
 		raceReleaseMerge(unsafe.Pointer(&ioSync))
 	}
@@ -2047,7 +2083,8 @@
 }
 
 func Pwritev(fd int, iovs [][]byte, offset int64) (n int, err error) {
-	iovecs := bytes2iovec(iovs)
+	iovecs := make([]Iovec, 0, minIovec)
+	iovecs = appendBytes(iovecs, iovs)
 	if raceenabled {
 		raceReleaseMerge(unsafe.Pointer(&ioSync))
 	}
@@ -2058,7 +2095,8 @@
 }
 
 func Pwritev2(fd int, iovs [][]byte, offset int64, flags int) (n int, err error) {
-	iovecs := bytes2iovec(iovs)
+	iovecs := make([]Iovec, 0, minIovec)
+	iovecs = appendBytes(iovecs, iovs)
 	if raceenabled {
 		raceReleaseMerge(unsafe.Pointer(&ioSync))
 	}
@@ -2086,11 +2124,15 @@
 
 // mmap varies by architecture; see syscall_linux_*.go.
 //sys	munmap(addr uintptr, length uintptr) (err error)
+//sys	mremap(oldaddr uintptr, oldlength uintptr, newlength uintptr, flags int, newaddr uintptr) (xaddr uintptr, err error)
 
-var mapper = &mmapper{
-	active: make(map[*byte][]byte),
-	mmap:   mmap,
-	munmap: munmap,
+var mapper = &mremapMmapper{
+	mmapper: mmapper{
+		active: make(map[*byte][]byte),
+		mmap:   mmap,
+		munmap: munmap,
+	},
+	mremap: mremap,
 }
 
 func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) {
@@ -2101,6 +2143,10 @@
 	return mapper.Munmap(b)
 }
 
+func Mremap(oldData []byte, newLength int, flags int) (data []byte, err error) {
+	return mapper.Mremap(oldData, newLength, flags)
+}
+
 //sys	Madvise(b []byte, advice int) (err error)
 //sys	Mprotect(b []byte, prot int) (err error)
 //sys	Mlock(b []byte) (err error)
@@ -2139,6 +2185,14 @@
 	return false
 }
 
+func isCapDacOverrideSet() bool {
+	hdr := CapUserHeader{Version: LINUX_CAPABILITY_VERSION_3}
+	data := [2]CapUserData{}
+	err := Capget(&hdr, &data[0])
+
+	return err == nil && data[0].Effective&(1<<CAP_DAC_OVERRIDE) != 0
+}
+
 //sys	faccessat(dirfd int, path string, mode uint32) (err error)
 //sys	Faccessat2(dirfd int, path string, mode uint32, flags int) (err error)
 
@@ -2174,6 +2228,12 @@
 	var uid int
 	if flags&AT_EACCESS != 0 {
 		uid = Geteuid()
+		if uid != 0 && isCapDacOverrideSet() {
+			// If CAP_DAC_OVERRIDE is set, file access check is
+			// done by the kernel in the same way as for root
+			// (see generic_permission() in the Linux sources).
+			uid = 0
+		}
 	} else {
 		uid = Getuid()
 	}
@@ -2379,6 +2439,21 @@
 	return rtSigprocmask(how, set, oldset, _C__NSIG/8)
 }
 
+//sysnb	getresuid(ruid *_C_int, euid *_C_int, suid *_C_int)
+//sysnb	getresgid(rgid *_C_int, egid *_C_int, sgid *_C_int)
+
+func Getresuid() (ruid, euid, suid int) {
+	var r, e, s _C_int
+	getresuid(&r, &e, &s)
+	return int(r), int(e), int(s)
+}
+
+func Getresgid() (rgid, egid, sgid int) {
+	var r, e, s _C_int
+	getresgid(&r, &e, &s)
+	return int(r), int(e), int(s)
+}
+
 /*
  * Unimplemented
  */
@@ -2420,7 +2495,6 @@
 // MqTimedreceive
 // MqTimedsend
 // MqUnlink
-// Mremap
 // Msgctl
 // Msgget
 // Msgrcv
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_386.go b/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_386.go
index ff5b589..c7d9945 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_386.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_386.go
@@ -97,33 +97,6 @@
 	return
 }
 
-//sysnb	setrlimit(resource int, rlim *rlimit32) (err error) = SYS_SETRLIMIT
-
-func Setrlimit(resource int, rlim *Rlimit) (err error) {
-	err = Prlimit(0, resource, rlim, nil)
-	if err != ENOSYS {
-		return err
-	}
-
-	rl := rlimit32{}
-	if rlim.Cur == rlimInf64 {
-		rl.Cur = rlimInf32
-	} else if rlim.Cur < uint64(rlimInf32) {
-		rl.Cur = uint32(rlim.Cur)
-	} else {
-		return EINVAL
-	}
-	if rlim.Max == rlimInf64 {
-		rl.Max = rlimInf32
-	} else if rlim.Max < uint64(rlimInf32) {
-		rl.Max = uint32(rlim.Max)
-	} else {
-		return EINVAL
-	}
-
-	return setrlimit(resource, &rl)
-}
-
 func Seek(fd int, offset int64, whence int) (newoffset int64, err error) {
 	newoffset, errno := seek(fd, offset, whence)
 	if errno != 0 {
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go b/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go
index 9b27035..5b21fcf 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go
@@ -46,7 +46,6 @@
 //sys	sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
 //sys	setfsgid(gid int) (prev int, err error)
 //sys	setfsuid(uid int) (prev int, err error)
-//sysnb	Setrlimit(resource int, rlim *Rlimit) (err error)
 //sys	Shutdown(fd int, how int) (err error)
 //sys	Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error)
 
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_arm.go b/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_arm.go
index 856ad1d..da29864 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_arm.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_arm.go
@@ -171,33 +171,6 @@
 	return
 }
 
-//sysnb	setrlimit(resource int, rlim *rlimit32) (err error) = SYS_SETRLIMIT
-
-func Setrlimit(resource int, rlim *Rlimit) (err error) {
-	err = Prlimit(0, resource, rlim, nil)
-	if err != ENOSYS {
-		return err
-	}
-
-	rl := rlimit32{}
-	if rlim.Cur == rlimInf64 {
-		rl.Cur = rlimInf32
-	} else if rlim.Cur < uint64(rlimInf32) {
-		rl.Cur = uint32(rlim.Cur)
-	} else {
-		return EINVAL
-	}
-	if rlim.Max == rlimInf64 {
-		rl.Max = rlimInf32
-	} else if rlim.Max < uint64(rlimInf32) {
-		rl.Max = uint32(rlim.Max)
-	} else {
-		return EINVAL
-	}
-
-	return setrlimit(resource, &rl)
-}
-
 func (r *PtraceRegs) PC() uint64 { return uint64(r.Uregs[15]) }
 
 func (r *PtraceRegs) SetPC(pc uint64) { r.Uregs[15] = uint32(pc) }
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go b/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go
index 6422704..a81f574 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go
@@ -39,7 +39,6 @@
 //sys	sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
 //sys	setfsgid(gid int) (prev int, err error)
 //sys	setfsuid(uid int) (prev int, err error)
-//sysnb	setrlimit(resource int, rlim *Rlimit) (err error)
 //sys	Shutdown(fd int, how int) (err error)
 //sys	Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error)
 
@@ -143,15 +142,6 @@
 	return getrlimit(resource, rlim)
 }
 
-// Setrlimit prefers the prlimit64 system call. See issue 38604.
-func Setrlimit(resource int, rlim *Rlimit) error {
-	err := Prlimit(0, resource, rlim, nil)
-	if err != ENOSYS {
-		return err
-	}
-	return setrlimit(resource, rlim)
-}
-
 func (r *PtraceRegs) PC() uint64 { return r.Pc }
 
 func (r *PtraceRegs) SetPC(pc uint64) { r.Pc = pc }
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_loong64.go b/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_loong64.go
index 59dab51..69d2d7c 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_loong64.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_loong64.go
@@ -126,11 +126,6 @@
 	return
 }
 
-func Setrlimit(resource int, rlim *Rlimit) (err error) {
-	err = Prlimit(0, resource, rlim, nil)
-	return
-}
-
 func futimesat(dirfd int, path string, tv *[2]Timeval) (err error) {
 	if tv == nil {
 		return utimensat(dirfd, path, nil, 0)
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go b/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go
index bfef09a..76d5640 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go
@@ -37,7 +37,6 @@
 //sys	sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
 //sys	setfsgid(gid int) (prev int, err error)
 //sys	setfsuid(uid int) (prev int, err error)
-//sysnb	Setrlimit(resource int, rlim *Rlimit) (err error)
 //sys	Shutdown(fd int, how int) (err error)
 //sys	Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error)
 //sys	Statfs(path string, buf *Statfs_t) (err error)
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go b/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go
index ab30250..aae7f0f 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go
@@ -151,33 +151,6 @@
 	return
 }
 
-//sysnb	setrlimit(resource int, rlim *rlimit32) (err error) = SYS_SETRLIMIT
-
-func Setrlimit(resource int, rlim *Rlimit) (err error) {
-	err = Prlimit(0, resource, rlim, nil)
-	if err != ENOSYS {
-		return err
-	}
-
-	rl := rlimit32{}
-	if rlim.Cur == rlimInf64 {
-		rl.Cur = rlimInf32
-	} else if rlim.Cur < uint64(rlimInf32) {
-		rl.Cur = uint32(rlim.Cur)
-	} else {
-		return EINVAL
-	}
-	if rlim.Max == rlimInf64 {
-		rl.Max = rlimInf32
-	} else if rlim.Max < uint64(rlimInf32) {
-		rl.Max = uint32(rlim.Max)
-	} else {
-		return EINVAL
-	}
-
-	return setrlimit(resource, &rl)
-}
-
 func (r *PtraceRegs) PC() uint64 { return r.Epc }
 
 func (r *PtraceRegs) SetPC(pc uint64) { r.Epc = pc }
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_ppc.go b/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_ppc.go
index eac1cf1..66eff19 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_ppc.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_ppc.go
@@ -159,33 +159,6 @@
 	return
 }
 
-//sysnb	setrlimit(resource int, rlim *rlimit32) (err error) = SYS_SETRLIMIT
-
-func Setrlimit(resource int, rlim *Rlimit) (err error) {
-	err = Prlimit(0, resource, rlim, nil)
-	if err != ENOSYS {
-		return err
-	}
-
-	rl := rlimit32{}
-	if rlim.Cur == rlimInf64 {
-		rl.Cur = rlimInf32
-	} else if rlim.Cur < uint64(rlimInf32) {
-		rl.Cur = uint32(rlim.Cur)
-	} else {
-		return EINVAL
-	}
-	if rlim.Max == rlimInf64 {
-		rl.Max = rlimInf32
-	} else if rlim.Max < uint64(rlimInf32) {
-		rl.Max = uint32(rlim.Max)
-	} else {
-		return EINVAL
-	}
-
-	return setrlimit(resource, &rl)
-}
-
 func (r *PtraceRegs) PC() uint32 { return r.Nip }
 
 func (r *PtraceRegs) SetPC(pc uint32) { r.Nip = pc }
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go b/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go
index 4df5661..806aa25 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go
@@ -34,7 +34,6 @@
 //sys	sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
 //sys	setfsgid(gid int) (prev int, err error)
 //sys	setfsuid(uid int) (prev int, err error)
-//sysnb	Setrlimit(resource int, rlim *Rlimit) (err error)
 //sys	Shutdown(fd int, how int) (err error)
 //sys	Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error)
 //sys	Stat(path string, stat *Stat_t) (err error)
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go b/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go
index 5f4243d..35851ef 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go
@@ -38,7 +38,6 @@
 //sys	sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
 //sys	setfsgid(gid int) (prev int, err error)
 //sys	setfsuid(uid int) (prev int, err error)
-//sysnb	Setrlimit(resource int, rlim *Rlimit) (err error)
 //sys	Shutdown(fd int, how int) (err error)
 //sys	Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error)
 
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go b/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go
index d0a7d40..2f89e8f 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go
@@ -34,7 +34,6 @@
 //sys	sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
 //sys	setfsgid(gid int) (prev int, err error)
 //sys	setfsuid(uid int) (prev int, err error)
-//sysnb	Setrlimit(resource int, rlim *Rlimit) (err error)
 //sys	Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error)
 //sys	Stat(path string, stat *Stat_t) (err error)
 //sys	Statfs(path string, buf *Statfs_t) (err error)
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go b/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go
index f5c793b..7ca064a 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go
@@ -31,7 +31,6 @@
 //sys	sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
 //sys	setfsgid(gid int) (prev int, err error)
 //sys	setfsuid(uid int) (prev int, err error)
-//sysnb	Setrlimit(resource int, rlim *Rlimit) (err error)
 //sys	Shutdown(fd int, how int) (err error)
 //sys	Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error)
 //sys	Stat(path string, stat *Stat_t) (err error)
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/syscall_netbsd.go b/src/cmd/vendor/golang.org/x/sys/unix/syscall_netbsd.go
index 666f0a1..018d7d4 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/syscall_netbsd.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/syscall_netbsd.go
@@ -13,7 +13,6 @@
 package unix
 
 import (
-	"runtime"
 	"syscall"
 	"unsafe"
 )
@@ -110,6 +109,20 @@
 	return readInt(buf, unsafe.Offsetof(Dirent{}.Namlen), unsafe.Sizeof(Dirent{}.Namlen))
 }
 
+func SysctlUvmexp(name string) (*Uvmexp, error) {
+	mib, err := sysctlmib(name)
+	if err != nil {
+		return nil, err
+	}
+
+	n := uintptr(SizeofUvmexp)
+	var u Uvmexp
+	if err := sysctl(mib, (*byte)(unsafe.Pointer(&u)), &n, nil, 0); err != nil {
+		return nil, err
+	}
+	return &u, nil
+}
+
 func Pipe(p []int) (err error) {
 	return Pipe2(p, 0)
 }
@@ -164,13 +177,13 @@
 }
 
 //sys	ioctl(fd int, req uint, arg uintptr) (err error)
+//sys	ioctlPtr(fd int, req uint, arg unsafe.Pointer) (err error) = SYS_IOCTL
 
 //sys	sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) = SYS___SYSCTL
 
 func IoctlGetPtmget(fd int, req uint) (*Ptmget, error) {
 	var value Ptmget
-	err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
-	runtime.KeepAlive(value)
+	err := ioctlPtr(fd, req, unsafe.Pointer(&value))
 	return &value, err
 }
 
@@ -245,6 +258,7 @@
 //sys	Chmod(path string, mode uint32) (err error)
 //sys	Chown(path string, uid int, gid int) (err error)
 //sys	Chroot(path string) (err error)
+//sys	ClockGettime(clockid int32, time *Timespec) (err error)
 //sys	Close(fd int) (err error)
 //sys	Dup(fd int) (nfd int, err error)
 //sys	Dup2(from int, to int) (err error)
@@ -326,7 +340,6 @@
 //sys	Setpriority(which int, who int, prio int) (err error)
 //sysnb	Setregid(rgid int, egid int) (err error)
 //sysnb	Setreuid(ruid int, euid int) (err error)
-//sysnb	Setrlimit(which int, lim *Rlimit) (err error)
 //sysnb	Setsid() (pid int, err error)
 //sysnb	Settimeofday(tp *Timeval) (err error)
 //sysnb	Setuid(uid int) (err error)
@@ -487,7 +500,6 @@
 // compat_43_osendmsg
 // compat_43_osethostid
 // compat_43_osethostname
-// compat_43_osetrlimit
 // compat_43_osigblock
 // compat_43_osigsetmask
 // compat_43_osigstack
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/syscall_openbsd.go b/src/cmd/vendor/golang.org/x/sys/unix/syscall_openbsd.go
index 78daceb..c5f166a 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/syscall_openbsd.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/syscall_openbsd.go
@@ -151,7 +151,23 @@
 	return
 }
 
+//sysnb	getresuid(ruid *_C_int, euid *_C_int, suid *_C_int)
+//sysnb	getresgid(rgid *_C_int, egid *_C_int, sgid *_C_int)
+
+func Getresuid() (ruid, euid, suid int) {
+	var r, e, s _C_int
+	getresuid(&r, &e, &s)
+	return int(r), int(e), int(s)
+}
+
+func Getresgid() (rgid, egid, sgid int) {
+	var r, e, s _C_int
+	getresgid(&r, &e, &s)
+	return int(r), int(e), int(s)
+}
+
 //sys	ioctl(fd int, req uint, arg uintptr) (err error)
+//sys	ioctlPtr(fd int, req uint, arg unsafe.Pointer) (err error) = SYS_IOCTL
 
 //sys	sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) = SYS___SYSCTL
 
@@ -220,6 +236,7 @@
 //sys	Chmod(path string, mode uint32) (err error)
 //sys	Chown(path string, uid int, gid int) (err error)
 //sys	Chroot(path string) (err error)
+//sys	ClockGettime(clockid int32, time *Timespec) (err error)
 //sys	Close(fd int) (err error)
 //sys	Dup(fd int) (nfd int, err error)
 //sys	Dup2(from int, to int) (err error)
@@ -292,7 +309,6 @@
 //sysnb	Setreuid(ruid int, euid int) (err error)
 //sysnb	Setresgid(rgid int, egid int, sgid int) (err error)
 //sysnb	Setresuid(ruid int, euid int, suid int) (err error)
-//sysnb	Setrlimit(which int, lim *Rlimit) (err error)
 //sysnb	Setrtable(rtable int) (err error)
 //sysnb	Setsid() (pid int, err error)
 //sysnb	Settimeofday(tp *Timeval) (err error)
@@ -337,8 +353,6 @@
 // getgid
 // getitimer
 // getlogin
-// getresgid
-// getresuid
 // getthrid
 // ktrace
 // lfs_bmapv
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/syscall_openbsd_libc.go b/src/cmd/vendor/golang.org/x/sys/unix/syscall_openbsd_libc.go
index e23c539..04aa43f 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/syscall_openbsd_libc.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/syscall_openbsd_libc.go
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build openbsd && !mips64
-// +build openbsd,!mips64
+//go:build openbsd
+// +build openbsd
 
 package unix
 
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/syscall_solaris.go b/src/cmd/vendor/golang.org/x/sys/unix/syscall_solaris.go
index 2109e56..b600a28 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/syscall_solaris.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/syscall_solaris.go
@@ -408,8 +408,7 @@
 		for n < len(pp.Path) && pp.Path[n] != 0 {
 			n++
 		}
-		bytes := (*[len(pp.Path)]byte)(unsafe.Pointer(&pp.Path[0]))[0:n]
-		sa.Name = string(bytes)
+		sa.Name = string(unsafe.Slice((*byte)(unsafe.Pointer(&pp.Path[0])), n))
 		return sa, nil
 
 	case AF_INET:
@@ -546,22 +545,26 @@
  * Expose the ioctl function
  */
 
-//sys	ioctlRet(fd int, req uint, arg uintptr) (ret int, err error) = libc.ioctl
+//sys	ioctlRet(fd int, req int, arg uintptr) (ret int, err error) = libc.ioctl
+//sys	ioctlPtrRet(fd int, req int, arg unsafe.Pointer) (ret int, err error) = libc.ioctl
 
-func ioctl(fd int, req uint, arg uintptr) (err error) {
+func ioctl(fd int, req int, arg uintptr) (err error) {
 	_, err = ioctlRet(fd, req, arg)
 	return err
 }
 
-func IoctlSetTermio(fd int, req uint, value *Termio) error {
-	err := ioctl(fd, req, uintptr(unsafe.Pointer(value)))
-	runtime.KeepAlive(value)
+func ioctlPtr(fd int, req int, arg unsafe.Pointer) (err error) {
+	_, err = ioctlPtrRet(fd, req, arg)
 	return err
 }
 
-func IoctlGetTermio(fd int, req uint) (*Termio, error) {
+func IoctlSetTermio(fd int, req int, value *Termio) error {
+	return ioctlPtr(fd, req, unsafe.Pointer(value))
+}
+
+func IoctlGetTermio(fd int, req int) (*Termio, error) {
 	var value Termio
-	err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
+	err := ioctlPtr(fd, req, unsafe.Pointer(&value))
 	return &value, err
 }
 
@@ -590,6 +593,7 @@
 //sys	Chmod(path string, mode uint32) (err error)
 //sys	Chown(path string, uid int, gid int) (err error)
 //sys	Chroot(path string) (err error)
+//sys	ClockGettime(clockid int32, time *Timespec) (err error)
 //sys	Close(fd int) (err error)
 //sys	Creat(path string, mode uint32) (fd int, err error)
 //sys	Dup(fd int) (nfd int, err error)
@@ -661,7 +665,6 @@
 //sys	Setpriority(which int, who int, prio int) (err error)
 //sysnb	Setregid(rgid int, egid int) (err error)
 //sysnb	Setreuid(ruid int, euid int) (err error)
-//sysnb	Setrlimit(which int, lim *Rlimit) (err error)
 //sysnb	Setsid() (pid int, err error)
 //sysnb	Setuid(uid int) (err error)
 //sys	Shutdown(s int, how int) (err error) = libsocket.shutdown
@@ -1076,14 +1079,14 @@
 	return retCl, retData, flags, nil
 }
 
-func IoctlSetIntRetInt(fd int, req uint, arg int) (int, error) {
+func IoctlSetIntRetInt(fd int, req int, arg int) (int, error) {
 	return ioctlRet(fd, req, uintptr(arg))
 }
 
-func IoctlSetString(fd int, req uint, val string) error {
+func IoctlSetString(fd int, req int, val string) error {
 	bs := make([]byte, len(val)+1)
 	copy(bs[:len(bs)-1], val)
-	err := ioctl(fd, req, uintptr(unsafe.Pointer(&bs[0])))
+	err := ioctlPtr(fd, req, unsafe.Pointer(&bs[0]))
 	runtime.KeepAlive(&bs[0])
 	return err
 }
@@ -1116,8 +1119,8 @@
 	return *(*uint)(unsafe.Pointer(&l.Lifru[0]))
 }
 
-func IoctlLifreq(fd int, req uint, l *Lifreq) error {
-	return ioctl(fd, req, uintptr(unsafe.Pointer(l)))
+func IoctlLifreq(fd int, req int, l *Lifreq) error {
+	return ioctlPtr(fd, req, unsafe.Pointer(l))
 }
 
 // Strioctl Helpers
@@ -1127,6 +1130,6 @@
 	s.Dp = (*int8)(unsafe.Pointer(&i))
 }
 
-func IoctlSetStrioctlRetInt(fd int, req uint, s *Strioctl) (int, error) {
-	return ioctlRet(fd, req, uintptr(unsafe.Pointer(s)))
+func IoctlSetStrioctlRetInt(fd int, req int, s *Strioctl) (int, error) {
+	return ioctlPtrRet(fd, req, unsafe.Pointer(s))
 }
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/syscall_unix.go b/src/cmd/vendor/golang.org/x/sys/unix/syscall_unix.go
index 00bafda..8e48c29 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/syscall_unix.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/syscall_unix.go
@@ -331,6 +331,19 @@
 	return
 }
 
+// Recvmsg receives a message from a socket using the recvmsg system call. The
+// received non-control data will be written to p, and any "out of band"
+// control data will be written to oob. The flags are passed to recvmsg.
+//
+// The results are:
+//   - n is the number of non-control data bytes read into p
+//   - oobn is the number of control data bytes read into oob; this may be interpreted using [ParseSocketControlMessage]
+//   - recvflags is flags returned by recvmsg
+//   - from is the address of the sender
+//
+// If the underlying socket type is not SOCK_DGRAM, a received message
+// containing oob data and a single '\0' of non-control data is treated as if
+// the message contained only control data, i.e. n will be zero on return.
 func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) {
 	var iov [1]Iovec
 	if len(p) > 0 {
@@ -346,13 +359,9 @@
 	return
 }
 
-// RecvmsgBuffers receives a message from a socket using the recvmsg
-// system call. The flags are passed to recvmsg. Any non-control data
-// read is scattered into the buffers slices. The results are:
-//   - n is the number of non-control data read into bufs
-//   - oobn is the number of control data read into oob; this may be interpreted using [ParseSocketControlMessage]
-//   - recvflags is flags returned by recvmsg
-//   - from is the address of the sender
+// RecvmsgBuffers receives a message from a socket using the recvmsg system
+// call. This function is equivalent to Recvmsg, but non-control data read is
+// scattered into the buffers slices.
 func RecvmsgBuffers(fd int, buffers [][]byte, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) {
 	iov := make([]Iovec, len(buffers))
 	for i := range buffers {
@@ -371,11 +380,38 @@
 	return
 }
 
+// Sendmsg sends a message on a socket to an address using the sendmsg system
+// call. This function is equivalent to SendmsgN, but does not return the
+// number of bytes actually sent.
 func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (err error) {
 	_, err = SendmsgN(fd, p, oob, to, flags)
 	return
 }
 
+// SendmsgN sends a message on a socket to an address using the sendmsg system
+// call. p contains the non-control data to send, and oob contains the "out of
+// band" control data. The flags are passed to sendmsg. The number of
+// non-control bytes actually written to the socket is returned.
+//
+// Some socket types do not support sending control data without accompanying
+// non-control data. If p is empty, and oob contains control data, and the
+// underlying socket type is not SOCK_DGRAM, p will be treated as containing a
+// single '\0' and the return value will indicate zero bytes sent.
+//
+// The Go function Recvmsg, if called with an empty p and a non-empty oob,
+// will read and ignore this additional '\0'.  If the message is received by
+// code that does not use Recvmsg, or that does not use Go at all, that code
+// will need to be written to expect and ignore the additional '\0'.
+//
+// If you need to send non-empty oob with p actually empty, and if the
+// underlying socket type supports it, you can do so via a raw system call as
+// follows:
+//
+//	msg := &unix.Msghdr{
+//	    Control: &oob[0],
+//	}
+//	msg.SetControllen(len(oob))
+//	n, _, errno := unix.Syscall(unix.SYS_SENDMSG, uintptr(fd), uintptr(unsafe.Pointer(msg)), flags)
 func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) {
 	var iov [1]Iovec
 	if len(p) > 0 {
@@ -394,9 +430,8 @@
 }
 
 // SendmsgBuffers sends a message on a socket to an address using the sendmsg
-// system call. The flags are passed to sendmsg. Any non-control data written
-// is gathered from buffers. The function returns the number of bytes written
-// to the socket.
+// system call. This function is equivalent to SendmsgN, but the non-control
+// data is gathered from buffers.
 func SendmsgBuffers(fd int, buffers [][]byte, oob []byte, to Sockaddr, flags int) (n int, err error) {
 	iov := make([]Iovec, len(buffers))
 	for i := range buffers {
@@ -543,7 +578,7 @@
 	return UtimesNanoAt(AT_FDCWD, path, ts, AT_SYMLINK_NOFOLLOW)
 }
 
-// emptyIovec reports whether there are no bytes in the slice of Iovec.
+// emptyIovecs reports whether there are no bytes in the slice of Iovec.
 func emptyIovecs(iov []Iovec) bool {
 	for i := range iov {
 		if iov[i].Len > 0 {
@@ -552,3 +587,10 @@
 	}
 	return true
 }
+
+// Setrlimit sets a resource limit.
+func Setrlimit(resource int, rlim *Rlimit) error {
+	// Just call the syscall version, because as of Go 1.21
+	// it will affect starting a new process.
+	return syscall.Setrlimit(resource, (*syscall.Rlimit)(rlim))
+}
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/syscall_zos_s390x.go b/src/cmd/vendor/golang.org/x/sys/unix/syscall_zos_s390x.go
index 68b2f3e..d3d49ec 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/syscall_zos_s390x.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/syscall_zos_s390x.go
@@ -139,8 +139,7 @@
 		for n < int(pp.Len) && pp.Path[n] != 0 {
 			n++
 		}
-		bytes := (*[len(pp.Path)]byte)(unsafe.Pointer(&pp.Path[0]))[0:n]
-		sa.Name = string(bytes)
+		sa.Name = string(unsafe.Slice((*byte)(unsafe.Pointer(&pp.Path[0])), n))
 		return sa, nil
 
 	case AF_INET:
@@ -213,7 +212,8 @@
 //sys	sendmsg(s int, msg *Msghdr, flags int) (n int, err error) = SYS___SENDMSG_A
 //sys   mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) = SYS_MMAP
 //sys   munmap(addr uintptr, length uintptr) (err error) = SYS_MUNMAP
-//sys   ioctl(fd int, req uint, arg uintptr) (err error) = SYS_IOCTL
+//sys   ioctl(fd int, req int, arg uintptr) (err error) = SYS_IOCTL
+//sys   ioctlPtr(fd int, req int, arg unsafe.Pointer) (err error) = SYS_IOCTL
 
 //sys   Access(path string, mode uint32) (err error) = SYS___ACCESS_A
 //sys   Chdir(path string) (err error) = SYS___CHDIR_A
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/timestruct.go b/src/cmd/vendor/golang.org/x/sys/unix/timestruct.go
index 3d89304..616b1b2 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/timestruct.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/timestruct.go
@@ -9,7 +9,7 @@
 
 import "time"
 
-// TimespecToNSec returns the time stored in ts as nanoseconds.
+// TimespecToNsec returns the time stored in ts as nanoseconds.
 func TimespecToNsec(ts Timespec) int64 { return ts.Nano() }
 
 // NsecToTimespec converts a number of nanoseconds into a Timespec.
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/xattr_bsd.go b/src/cmd/vendor/golang.org/x/sys/unix/xattr_bsd.go
index 663b377..f5f8e9f 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/xattr_bsd.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/xattr_bsd.go
@@ -36,9 +36,14 @@
 func initxattrdest(dest []byte, idx int) (d unsafe.Pointer) {
 	if len(dest) > idx {
 		return unsafe.Pointer(&dest[idx])
-	} else {
-		return unsafe.Pointer(_zero)
 	}
+	if dest != nil {
+		// extattr_get_file and extattr_list_file treat NULL differently from
+		// a non-NULL pointer of length zero. Preserve the property of nilness,
+		// even if we can't use dest directly.
+		return unsafe.Pointer(&_zero)
+	}
+	return nil
 }
 
 // FreeBSD and NetBSD implement their own syscalls to handle extended attributes
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go
index 476a1c7..1430076 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go
@@ -1270,6 +1270,16 @@
 	SEEK_END                                = 0x2
 	SEEK_HOLE                               = 0x3
 	SEEK_SET                                = 0x0
+	SF_APPEND                               = 0x40000
+	SF_ARCHIVED                             = 0x10000
+	SF_DATALESS                             = 0x40000000
+	SF_FIRMLINK                             = 0x800000
+	SF_IMMUTABLE                            = 0x20000
+	SF_NOUNLINK                             = 0x100000
+	SF_RESTRICTED                           = 0x80000
+	SF_SETTABLE                             = 0x3fff0000
+	SF_SUPPORTED                            = 0x9f0000
+	SF_SYNTHETIC                            = 0xc0000000
 	SHUT_RD                                 = 0x0
 	SHUT_RDWR                               = 0x2
 	SHUT_WR                                 = 0x1
@@ -1543,6 +1553,15 @@
 	TIOCTIMESTAMP                           = 0x40107459
 	TIOCUCNTL                               = 0x80047466
 	TOSTOP                                  = 0x400000
+	UF_APPEND                               = 0x4
+	UF_COMPRESSED                           = 0x20
+	UF_DATAVAULT                            = 0x80
+	UF_HIDDEN                               = 0x8000
+	UF_IMMUTABLE                            = 0x2
+	UF_NODUMP                               = 0x1
+	UF_OPAQUE                               = 0x8
+	UF_SETTABLE                             = 0xffff
+	UF_TRACKED                              = 0x40
 	VDISCARD                                = 0xf
 	VDSUSP                                  = 0xb
 	VEOF                                    = 0x0
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go
index e36f517..ab044a7 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go
@@ -1270,6 +1270,16 @@
 	SEEK_END                                = 0x2
 	SEEK_HOLE                               = 0x3
 	SEEK_SET                                = 0x0
+	SF_APPEND                               = 0x40000
+	SF_ARCHIVED                             = 0x10000
+	SF_DATALESS                             = 0x40000000
+	SF_FIRMLINK                             = 0x800000
+	SF_IMMUTABLE                            = 0x20000
+	SF_NOUNLINK                             = 0x100000
+	SF_RESTRICTED                           = 0x80000
+	SF_SETTABLE                             = 0x3fff0000
+	SF_SUPPORTED                            = 0x9f0000
+	SF_SYNTHETIC                            = 0xc0000000
 	SHUT_RD                                 = 0x0
 	SHUT_RDWR                               = 0x2
 	SHUT_WR                                 = 0x1
@@ -1543,6 +1553,15 @@
 	TIOCTIMESTAMP                           = 0x40107459
 	TIOCUCNTL                               = 0x80047466
 	TOSTOP                                  = 0x400000
+	UF_APPEND                               = 0x4
+	UF_COMPRESSED                           = 0x20
+	UF_DATAVAULT                            = 0x80
+	UF_HIDDEN                               = 0x8000
+	UF_IMMUTABLE                            = 0x2
+	UF_NODUMP                               = 0x1
+	UF_OPAQUE                               = 0x8
+	UF_SETTABLE                             = 0xffff
+	UF_TRACKED                              = 0x40
 	VDISCARD                                = 0xf
 	VDSUSP                                  = 0xb
 	VEOF                                    = 0x0
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux.go b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux.go
index 785d693..3784f40 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux.go
@@ -70,6 +70,7 @@
 	ALG_SET_DRBG_ENTROPY                        = 0x6
 	ALG_SET_IV                                  = 0x2
 	ALG_SET_KEY                                 = 0x1
+	ALG_SET_KEY_BY_KEY_SERIAL                   = 0x7
 	ALG_SET_OP                                  = 0x3
 	ANON_INODE_FS_MAGIC                         = 0x9041934
 	ARPHRD_6LOWPAN                              = 0x339
@@ -457,7 +458,6 @@
 	B600                                        = 0x8
 	B75                                         = 0x2
 	B9600                                       = 0xd
-	BALLOON_KVM_MAGIC                           = 0x13661366
 	BDEVFS_MAGIC                                = 0x62646576
 	BINDERFS_SUPER_MAGIC                        = 0x6c6f6f70
 	BINFMTFS_MAGIC                              = 0x42494e4d
@@ -493,6 +493,7 @@
 	BPF_F_TEST_RUN_ON_CPU                       = 0x1
 	BPF_F_TEST_STATE_FREQ                       = 0x8
 	BPF_F_TEST_XDP_LIVE_FRAMES                  = 0x2
+	BPF_F_XDP_DEV_BOUND_ONLY                    = 0x40
 	BPF_F_XDP_HAS_FRAGS                         = 0x20
 	BPF_H                                       = 0x8
 	BPF_IMM                                     = 0x0
@@ -563,6 +564,7 @@
 	BUS_USB                                     = 0x3
 	BUS_VIRTUAL                                 = 0x6
 	CAN_BCM                                     = 0x2
+	CAN_BUS_OFF_THRESHOLD                       = 0x100
 	CAN_CTRLMODE_3_SAMPLES                      = 0x4
 	CAN_CTRLMODE_BERR_REPORTING                 = 0x10
 	CAN_CTRLMODE_CC_LEN8_DLC                    = 0x100
@@ -577,9 +579,12 @@
 	CAN_EFF_FLAG                                = 0x80000000
 	CAN_EFF_ID_BITS                             = 0x1d
 	CAN_EFF_MASK                                = 0x1fffffff
+	CAN_ERROR_PASSIVE_THRESHOLD                 = 0x80
+	CAN_ERROR_WARNING_THRESHOLD                 = 0x60
 	CAN_ERR_ACK                                 = 0x20
 	CAN_ERR_BUSERROR                            = 0x80
 	CAN_ERR_BUSOFF                              = 0x40
+	CAN_ERR_CNT                                 = 0x200
 	CAN_ERR_CRTL                                = 0x4
 	CAN_ERR_CRTL_ACTIVE                         = 0x40
 	CAN_ERR_CRTL_RX_OVERFLOW                    = 0x1
@@ -771,6 +776,8 @@
 	DEVLINK_GENL_MCGRP_CONFIG_NAME              = "config"
 	DEVLINK_GENL_NAME                           = "devlink"
 	DEVLINK_GENL_VERSION                        = 0x1
+	DEVLINK_PORT_FN_CAP_MIGRATABLE              = 0x2
+	DEVLINK_PORT_FN_CAP_ROCE                    = 0x1
 	DEVLINK_SB_THRESHOLD_TO_ALPHA_MAX           = 0x14
 	DEVLINK_SUPPORTED_FLASH_OVERWRITE_SECTIONS  = 0x3
 	DEVMEM_MAGIC                                = 0x454d444d
@@ -820,9 +827,9 @@
 	DM_UUID_FLAG                                = 0x4000
 	DM_UUID_LEN                                 = 0x81
 	DM_VERSION                                  = 0xc138fd00
-	DM_VERSION_EXTRA                            = "-ioctl (2022-02-22)"
+	DM_VERSION_EXTRA                            = "-ioctl (2023-03-01)"
 	DM_VERSION_MAJOR                            = 0x4
-	DM_VERSION_MINOR                            = 0x2e
+	DM_VERSION_MINOR                            = 0x30
 	DM_VERSION_PATCHLEVEL                       = 0x0
 	DT_BLK                                      = 0x6
 	DT_CHR                                      = 0x2
@@ -1049,6 +1056,7 @@
 	ETH_P_CAIF                                  = 0xf7
 	ETH_P_CAN                                   = 0xc
 	ETH_P_CANFD                                 = 0xd
+	ETH_P_CANXL                                 = 0xe
 	ETH_P_CFM                                   = 0x8902
 	ETH_P_CONTROL                               = 0x16
 	ETH_P_CUST                                  = 0x6006
@@ -1060,6 +1068,7 @@
 	ETH_P_DNA_RT                                = 0x6003
 	ETH_P_DSA                                   = 0x1b
 	ETH_P_DSA_8021Q                             = 0xdadb
+	ETH_P_DSA_A5PSW                             = 0xe001
 	ETH_P_ECONET                                = 0x18
 	ETH_P_EDSA                                  = 0xdada
 	ETH_P_ERSPAN                                = 0x88be
@@ -1189,13 +1198,16 @@
 	FAN_EVENT_METADATA_LEN                      = 0x18
 	FAN_EVENT_ON_CHILD                          = 0x8000000
 	FAN_FS_ERROR                                = 0x8000
+	FAN_INFO                                    = 0x20
 	FAN_MARK_ADD                                = 0x1
 	FAN_MARK_DONT_FOLLOW                        = 0x4
 	FAN_MARK_EVICTABLE                          = 0x200
 	FAN_MARK_FILESYSTEM                         = 0x100
 	FAN_MARK_FLUSH                              = 0x80
+	FAN_MARK_IGNORE                             = 0x400
 	FAN_MARK_IGNORED_MASK                       = 0x20
 	FAN_MARK_IGNORED_SURV_MODIFY                = 0x40
+	FAN_MARK_IGNORE_SURV                        = 0x440
 	FAN_MARK_INODE                              = 0x0
 	FAN_MARK_MOUNT                              = 0x10
 	FAN_MARK_ONLYDIR                            = 0x8
@@ -1223,6 +1235,8 @@
 	FAN_REPORT_PIDFD                            = 0x80
 	FAN_REPORT_TARGET_FID                       = 0x1000
 	FAN_REPORT_TID                              = 0x100
+	FAN_RESPONSE_INFO_AUDIT_RULE                = 0x1
+	FAN_RESPONSE_INFO_NONE                      = 0x0
 	FAN_UNLIMITED_MARKS                         = 0x20
 	FAN_UNLIMITED_QUEUE                         = 0x10
 	FD_CLOEXEC                                  = 0x1
@@ -1253,7 +1267,10 @@
 	FSCRYPT_MODE_AES_128_CBC                    = 0x5
 	FSCRYPT_MODE_AES_128_CTS                    = 0x6
 	FSCRYPT_MODE_AES_256_CTS                    = 0x4
+	FSCRYPT_MODE_AES_256_HCTR2                  = 0xa
 	FSCRYPT_MODE_AES_256_XTS                    = 0x1
+	FSCRYPT_MODE_SM4_CTS                        = 0x8
+	FSCRYPT_MODE_SM4_XTS                        = 0x7
 	FSCRYPT_POLICY_FLAGS_PAD_16                 = 0x2
 	FSCRYPT_POLICY_FLAGS_PAD_32                 = 0x3
 	FSCRYPT_POLICY_FLAGS_PAD_4                  = 0x0
@@ -1272,8 +1289,6 @@
 	FS_ENCRYPTION_MODE_AES_256_GCM              = 0x2
 	FS_ENCRYPTION_MODE_AES_256_XTS              = 0x1
 	FS_ENCRYPTION_MODE_INVALID                  = 0x0
-	FS_ENCRYPTION_MODE_SPECK128_256_CTS         = 0x8
-	FS_ENCRYPTION_MODE_SPECK128_256_XTS         = 0x7
 	FS_IOC_ADD_ENCRYPTION_KEY                   = 0xc0506617
 	FS_IOC_GET_ENCRYPTION_KEY_STATUS            = 0xc080661a
 	FS_IOC_GET_ENCRYPTION_POLICY_EX             = 0xc0096616
@@ -1430,6 +1445,7 @@
 	IFF_NOARP                                   = 0x80
 	IFF_NOFILTER                                = 0x1000
 	IFF_NOTRAILERS                              = 0x20
+	IFF_NO_CARRIER                              = 0x40
 	IFF_NO_PI                                   = 0x1000
 	IFF_ONE_QUEUE                               = 0x2000
 	IFF_PERSIST                                 = 0x800
@@ -1761,6 +1777,7 @@
 	LANDLOCK_ACCESS_FS_REFER                    = 0x2000
 	LANDLOCK_ACCESS_FS_REMOVE_DIR               = 0x10
 	LANDLOCK_ACCESS_FS_REMOVE_FILE              = 0x20
+	LANDLOCK_ACCESS_FS_TRUNCATE                 = 0x4000
 	LANDLOCK_ACCESS_FS_WRITE_FILE               = 0x2
 	LANDLOCK_CREATE_RULESET_VERSION             = 0x1
 	LINUX_REBOOT_CMD_CAD_OFF                    = 0x0
@@ -1800,11 +1817,13 @@
 	LWTUNNEL_IP_OPT_GENEVE_MAX                  = 0x3
 	LWTUNNEL_IP_OPT_VXLAN_MAX                   = 0x1
 	MADV_COLD                                   = 0x14
+	MADV_COLLAPSE                               = 0x19
 	MADV_DODUMP                                 = 0x11
 	MADV_DOFORK                                 = 0xb
 	MADV_DONTDUMP                               = 0x10
 	MADV_DONTFORK                               = 0xa
 	MADV_DONTNEED                               = 0x4
+	MADV_DONTNEED_LOCKED                        = 0x18
 	MADV_FREE                                   = 0x8
 	MADV_HUGEPAGE                               = 0xe
 	MADV_HWPOISON                               = 0x64
@@ -1845,8 +1864,9 @@
 	MEMWRITEOOB64                               = 0xc0184d15
 	MFD_ALLOW_SEALING                           = 0x2
 	MFD_CLOEXEC                                 = 0x1
+	MFD_EXEC                                    = 0x10
 	MFD_HUGETLB                                 = 0x4
-	MFD_HUGE_16GB                               = -0x78000000
+	MFD_HUGE_16GB                               = 0x88000000
 	MFD_HUGE_16MB                               = 0x60000000
 	MFD_HUGE_1GB                                = 0x78000000
 	MFD_HUGE_1MB                                = 0x50000000
@@ -1860,6 +1880,7 @@
 	MFD_HUGE_8MB                                = 0x5c000000
 	MFD_HUGE_MASK                               = 0x3f
 	MFD_HUGE_SHIFT                              = 0x1a
+	MFD_NOEXEC_SEAL                             = 0x8
 	MINIX2_SUPER_MAGIC                          = 0x2468
 	MINIX2_SUPER_MAGIC2                         = 0x2478
 	MINIX3_SUPER_MAGIC                          = 0x4d5a
@@ -1883,6 +1904,9 @@
 	MOUNT_ATTR_SIZE_VER0                        = 0x20
 	MOUNT_ATTR_STRICTATIME                      = 0x20
 	MOUNT_ATTR__ATIME                           = 0x70
+	MREMAP_DONTUNMAP                            = 0x4
+	MREMAP_FIXED                                = 0x2
+	MREMAP_MAYMOVE                              = 0x1
 	MSDOS_SUPER_MAGIC                           = 0x4d44
 	MSG_BATCH                                   = 0x40000
 	MSG_CMSG_CLOEXEC                            = 0x40000000
@@ -2153,6 +2177,7 @@
 	PACKET_FANOUT_DATA                          = 0x16
 	PACKET_FANOUT_EBPF                          = 0x7
 	PACKET_FANOUT_FLAG_DEFRAG                   = 0x8000
+	PACKET_FANOUT_FLAG_IGNORE_OUTGOING          = 0x4000
 	PACKET_FANOUT_FLAG_ROLLOVER                 = 0x1000
 	PACKET_FANOUT_FLAG_UNIQUEID                 = 0x2000
 	PACKET_FANOUT_HASH                          = 0x0
@@ -2188,6 +2213,7 @@
 	PACKET_USER                                 = 0x6
 	PACKET_VERSION                              = 0xa
 	PACKET_VNET_HDR                             = 0xf
+	PACKET_VNET_HDR_SZ                          = 0x18
 	PARITY_CRC16_PR0                            = 0x2
 	PARITY_CRC16_PR0_CCITT                      = 0x4
 	PARITY_CRC16_PR1                            = 0x3
@@ -2205,6 +2231,7 @@
 	PERF_ATTR_SIZE_VER5                         = 0x70
 	PERF_ATTR_SIZE_VER6                         = 0x78
 	PERF_ATTR_SIZE_VER7                         = 0x80
+	PERF_ATTR_SIZE_VER8                         = 0x88
 	PERF_AUX_FLAG_COLLISION                     = 0x8
 	PERF_AUX_FLAG_CORESIGHT_FORMAT_CORESIGHT    = 0x0
 	PERF_AUX_FLAG_CORESIGHT_FORMAT_RAW          = 0x100
@@ -2212,6 +2239,11 @@
 	PERF_AUX_FLAG_PARTIAL                       = 0x4
 	PERF_AUX_FLAG_PMU_FORMAT_TYPE_MASK          = 0xff00
 	PERF_AUX_FLAG_TRUNCATED                     = 0x1
+	PERF_BR_ARM64_DEBUG_DATA                    = 0x7
+	PERF_BR_ARM64_DEBUG_EXIT                    = 0x5
+	PERF_BR_ARM64_DEBUG_HALT                    = 0x4
+	PERF_BR_ARM64_DEBUG_INST                    = 0x6
+	PERF_BR_ARM64_FIQ                           = 0x3
 	PERF_FLAG_FD_CLOEXEC                        = 0x8
 	PERF_FLAG_FD_NO_GROUP                       = 0x1
 	PERF_FLAG_FD_OUTPUT                         = 0x2
@@ -2232,6 +2264,8 @@
 	PERF_MEM_LOCK_NA                            = 0x1
 	PERF_MEM_LOCK_SHIFT                         = 0x18
 	PERF_MEM_LVLNUM_ANY_CACHE                   = 0xb
+	PERF_MEM_LVLNUM_CXL                         = 0x9
+	PERF_MEM_LVLNUM_IO                          = 0xa
 	PERF_MEM_LVLNUM_L1                          = 0x1
 	PERF_MEM_LVLNUM_L2                          = 0x2
 	PERF_MEM_LVLNUM_L3                          = 0x3
@@ -2265,6 +2299,7 @@
 	PERF_MEM_REMOTE_REMOTE                      = 0x1
 	PERF_MEM_REMOTE_SHIFT                       = 0x25
 	PERF_MEM_SNOOPX_FWD                         = 0x1
+	PERF_MEM_SNOOPX_PEER                        = 0x2
 	PERF_MEM_SNOOPX_SHIFT                       = 0x26
 	PERF_MEM_SNOOP_HIT                          = 0x4
 	PERF_MEM_SNOOP_HITM                         = 0x10
@@ -2301,7 +2336,6 @@
 	PERF_SAMPLE_BRANCH_PLM_ALL                  = 0x7
 	PERF_SAMPLE_WEIGHT_TYPE                     = 0x1004000
 	PIPEFS_MAGIC                                = 0x50495045
-	PPC_CMM_MAGIC                               = 0xc7571590
 	PPPIOCGNPMODE                               = 0xc008744c
 	PPPIOCNEWUNIT                               = 0xc004743e
 	PRIO_PGRP                                   = 0x1
@@ -2338,6 +2372,7 @@
 	PR_FP_EXC_UND                               = 0x40000
 	PR_FP_MODE_FR                               = 0x1
 	PR_FP_MODE_FRE                              = 0x2
+	PR_GET_AUXV                                 = 0x41555856
 	PR_GET_CHILD_SUBREAPER                      = 0x25
 	PR_GET_DUMPABLE                             = 0x3
 	PR_GET_ENDIAN                               = 0x13
@@ -2346,6 +2381,8 @@
 	PR_GET_FP_MODE                              = 0x2e
 	PR_GET_IO_FLUSHER                           = 0x3a
 	PR_GET_KEEPCAPS                             = 0x7
+	PR_GET_MDWE                                 = 0x42
+	PR_GET_MEMORY_MERGE                         = 0x44
 	PR_GET_NAME                                 = 0x10
 	PR_GET_NO_NEW_PRIVS                         = 0x27
 	PR_GET_PDEATHSIG                            = 0x2
@@ -2366,6 +2403,7 @@
 	PR_MCE_KILL_GET                             = 0x22
 	PR_MCE_KILL_LATE                            = 0x0
 	PR_MCE_KILL_SET                             = 0x1
+	PR_MDWE_REFUSE_EXEC_GAIN                    = 0x1
 	PR_MPX_DISABLE_MANAGEMENT                   = 0x2c
 	PR_MPX_ENABLE_MANAGEMENT                    = 0x2b
 	PR_MTE_TAG_MASK                             = 0x7fff8
@@ -2400,6 +2438,8 @@
 	PR_SET_FP_MODE                              = 0x2d
 	PR_SET_IO_FLUSHER                           = 0x39
 	PR_SET_KEEPCAPS                             = 0x8
+	PR_SET_MDWE                                 = 0x41
+	PR_SET_MEMORY_MERGE                         = 0x43
 	PR_SET_MM                                   = 0x23
 	PR_SET_MM_ARG_END                           = 0x9
 	PR_SET_MM_ARG_START                         = 0x8
@@ -2483,6 +2523,7 @@
 	PTRACE_GETSIGMASK                           = 0x420a
 	PTRACE_GET_RSEQ_CONFIGURATION               = 0x420f
 	PTRACE_GET_SYSCALL_INFO                     = 0x420e
+	PTRACE_GET_SYSCALL_USER_DISPATCH_CONFIG     = 0x4211
 	PTRACE_INTERRUPT                            = 0x4207
 	PTRACE_KILL                                 = 0x8
 	PTRACE_LISTEN                               = 0x4208
@@ -2513,6 +2554,7 @@
 	PTRACE_SETREGSET                            = 0x4205
 	PTRACE_SETSIGINFO                           = 0x4203
 	PTRACE_SETSIGMASK                           = 0x420b
+	PTRACE_SET_SYSCALL_USER_DISPATCH_CONFIG     = 0x4210
 	PTRACE_SINGLESTEP                           = 0x9
 	PTRACE_SYSCALL                              = 0x18
 	PTRACE_SYSCALL_INFO_ENTRY                   = 0x1
@@ -2944,6 +2986,7 @@
 	SOL_TCP                                     = 0x6
 	SOL_TIPC                                    = 0x10f
 	SOL_TLS                                     = 0x11a
+	SOL_UDP                                     = 0x11
 	SOL_X25                                     = 0x106
 	SOL_XDP                                     = 0x11b
 	SOMAXCONN                                   = 0x1000
@@ -2999,6 +3042,7 @@
 	STATX_BLOCKS                                = 0x400
 	STATX_BTIME                                 = 0x800
 	STATX_CTIME                                 = 0x80
+	STATX_DIOALIGN                              = 0x2000
 	STATX_GID                                   = 0x10
 	STATX_INO                                   = 0x100
 	STATX_MNT_ID                                = 0x1000
@@ -3047,7 +3091,7 @@
 	TASKSTATS_GENL_NAME                         = "TASKSTATS"
 	TASKSTATS_GENL_VERSION                      = 0x1
 	TASKSTATS_TYPE_MAX                          = 0x6
-	TASKSTATS_VERSION                           = 0xd
+	TASKSTATS_VERSION                           = 0xe
 	TCIFLUSH                                    = 0x0
 	TCIOFF                                      = 0x2
 	TCIOFLUSH                                   = 0x2
@@ -3213,6 +3257,7 @@
 	TP_STATUS_COPY                              = 0x2
 	TP_STATUS_CSUMNOTREADY                      = 0x8
 	TP_STATUS_CSUM_VALID                        = 0x80
+	TP_STATUS_GSO_TCP                           = 0x100
 	TP_STATUS_KERNEL                            = 0x0
 	TP_STATUS_LOSING                            = 0x4
 	TP_STATUS_SENDING                           = 0x2
@@ -3227,6 +3272,19 @@
 	TRACEFS_MAGIC                               = 0x74726163
 	TS_COMM_LEN                                 = 0x20
 	UDF_SUPER_MAGIC                             = 0x15013346
+	UDP_CORK                                    = 0x1
+	UDP_ENCAP                                   = 0x64
+	UDP_ENCAP_ESPINUDP                          = 0x2
+	UDP_ENCAP_ESPINUDP_NON_IKE                  = 0x1
+	UDP_ENCAP_GTP0                              = 0x4
+	UDP_ENCAP_GTP1U                             = 0x5
+	UDP_ENCAP_L2TPINUDP                         = 0x3
+	UDP_GRO                                     = 0x68
+	UDP_NO_CHECK6_RX                            = 0x66
+	UDP_NO_CHECK6_TX                            = 0x65
+	UDP_SEGMENT                                 = 0x67
+	UDP_V4_FLOW                                 = 0x2
+	UDP_V6_FLOW                                 = 0x6
 	UMOUNT_NOFOLLOW                             = 0x8
 	USBDEVICE_SUPER_MAGIC                       = 0x9fa2
 	UTIME_NOW                                   = 0x3fffffff
@@ -3392,9 +3450,7 @@
 	XDP_ZEROCOPY                                = 0x4
 	XENFS_SUPER_MAGIC                           = 0xabba1974
 	XFS_SUPER_MAGIC                             = 0x58465342
-	Z3FOLD_MAGIC                                = 0x33
 	ZONEFS_MAGIC                                = 0x5a4f4653
-	ZSMALLOC_MAGIC                              = 0x58295829
 	_HIDIOCGRAWNAME_LEN                         = 0x80
 	_HIDIOCGRAWPHYS_LEN                         = 0x40
 	_HIDIOCGRAWUNIQ_LEN                         = 0x40
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_386.go b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_386.go
index 36c0dfc..a46df0f 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_386.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_386.go
@@ -133,6 +133,7 @@
 	MEMGETREGIONCOUNT                = 0x80044d07
 	MEMISLOCKED                      = 0x80084d17
 	MEMLOCK                          = 0x40084d05
+	MEMREAD                          = 0xc03c4d1a
 	MEMREADOOB                       = 0xc00c4d04
 	MEMSETBADBLOCK                   = 0x40084d0c
 	MEMUNLOCK                        = 0x40084d06
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go
index 4ff9427..6cd4a3e 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go
@@ -133,6 +133,7 @@
 	MEMGETREGIONCOUNT                = 0x80044d07
 	MEMISLOCKED                      = 0x80084d17
 	MEMLOCK                          = 0x40084d05
+	MEMREAD                          = 0xc0404d1a
 	MEMREADOOB                       = 0xc0104d04
 	MEMSETBADBLOCK                   = 0x40084d0c
 	MEMUNLOCK                        = 0x40084d06
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go
index 3eaa0fb..c7ebee2 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go
@@ -131,6 +131,7 @@
 	MEMGETREGIONCOUNT                = 0x80044d07
 	MEMISLOCKED                      = 0x80084d17
 	MEMLOCK                          = 0x40084d05
+	MEMREAD                          = 0xc0404d1a
 	MEMREADOOB                       = 0xc00c4d04
 	MEMSETBADBLOCK                   = 0x40084d0c
 	MEMUNLOCK                        = 0x40084d06
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go
index d7995bd..12a9a13 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go
@@ -134,6 +134,7 @@
 	MEMGETREGIONCOUNT                = 0x80044d07
 	MEMISLOCKED                      = 0x80084d17
 	MEMLOCK                          = 0x40084d05
+	MEMREAD                          = 0xc0404d1a
 	MEMREADOOB                       = 0xc0104d04
 	MEMSETBADBLOCK                   = 0x40084d0c
 	MEMUNLOCK                        = 0x40084d06
@@ -442,6 +443,7 @@
 	TIOCSWINSZ                       = 0x5414
 	TIOCVHANGUP                      = 0x5437
 	TOSTOP                           = 0x100
+	TPIDR2_MAGIC                     = 0x54504902
 	TUNATTACHFILTER                  = 0x401054d5
 	TUNDETACHFILTER                  = 0x401054d6
 	TUNGETDEVNETNS                   = 0x54e3
@@ -514,6 +516,7 @@
 	XCASE                            = 0x4
 	XTABS                            = 0x1800
 	ZA_MAGIC                         = 0x54366345
+	ZT_MAGIC                         = 0x5a544e01
 	_HIDIOCGRAWNAME                  = 0x80804804
 	_HIDIOCGRAWPHYS                  = 0x80404805
 	_HIDIOCGRAWUNIQ                  = 0x80404808
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_loong64.go b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_loong64.go
index 928e24c..f26a164 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_loong64.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_loong64.go
@@ -132,6 +132,7 @@
 	MEMGETREGIONCOUNT                = 0x80044d07
 	MEMISLOCKED                      = 0x80084d17
 	MEMLOCK                          = 0x40084d05
+	MEMREAD                          = 0xc0404d1a
 	MEMREADOOB                       = 0xc0104d04
 	MEMSETBADBLOCK                   = 0x40084d0c
 	MEMUNLOCK                        = 0x40084d06
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go
index 179bffb..890bc3c 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go
@@ -131,6 +131,7 @@
 	MEMGETREGIONCOUNT                = 0x40044d07
 	MEMISLOCKED                      = 0x40084d17
 	MEMLOCK                          = 0x80084d05
+	MEMREAD                          = 0xc0404d1a
 	MEMREADOOB                       = 0xc00c4d04
 	MEMSETBADBLOCK                   = 0x80084d0c
 	MEMUNLOCK                        = 0x80084d06
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go
index 1fba17b..549f26a 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go
@@ -131,6 +131,7 @@
 	MEMGETREGIONCOUNT                = 0x40044d07
 	MEMISLOCKED                      = 0x40084d17
 	MEMLOCK                          = 0x80084d05
+	MEMREAD                          = 0xc0404d1a
 	MEMREADOOB                       = 0xc0104d04
 	MEMSETBADBLOCK                   = 0x80084d0c
 	MEMUNLOCK                        = 0x80084d06
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go
index b77dde3..e0365e3 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go
@@ -131,6 +131,7 @@
 	MEMGETREGIONCOUNT                = 0x40044d07
 	MEMISLOCKED                      = 0x40084d17
 	MEMLOCK                          = 0x80084d05
+	MEMREAD                          = 0xc0404d1a
 	MEMREADOOB                       = 0xc0104d04
 	MEMSETBADBLOCK                   = 0x80084d0c
 	MEMUNLOCK                        = 0x80084d06
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go
index 78c6c75..fdccce1 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go
@@ -131,6 +131,7 @@
 	MEMGETREGIONCOUNT                = 0x40044d07
 	MEMISLOCKED                      = 0x40084d17
 	MEMLOCK                          = 0x80084d05
+	MEMREAD                          = 0xc0404d1a
 	MEMREADOOB                       = 0xc00c4d04
 	MEMSETBADBLOCK                   = 0x80084d0c
 	MEMUNLOCK                        = 0x80084d06
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go
index 1c0d31f..b2205c8 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go
@@ -131,6 +131,7 @@
 	MEMGETREGIONCOUNT                = 0x40044d07
 	MEMISLOCKED                      = 0x40084d17
 	MEMLOCK                          = 0x80084d05
+	MEMREAD                          = 0xc0404d1a
 	MEMREADOOB                       = 0xc00c4d04
 	MEMSETBADBLOCK                   = 0x80084d0c
 	MEMUNLOCK                        = 0x80084d06
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go
index 959dd9b..81aa5ad 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go
@@ -131,6 +131,7 @@
 	MEMGETREGIONCOUNT                = 0x40044d07
 	MEMISLOCKED                      = 0x40084d17
 	MEMLOCK                          = 0x80084d05
+	MEMREAD                          = 0xc0404d1a
 	MEMREADOOB                       = 0xc0104d04
 	MEMSETBADBLOCK                   = 0x80084d0c
 	MEMUNLOCK                        = 0x80084d06
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go
index 5a873cd..76807a1 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go
@@ -131,6 +131,7 @@
 	MEMGETREGIONCOUNT                = 0x40044d07
 	MEMISLOCKED                      = 0x40084d17
 	MEMLOCK                          = 0x80084d05
+	MEMREAD                          = 0xc0404d1a
 	MEMREADOOB                       = 0xc0104d04
 	MEMSETBADBLOCK                   = 0x80084d0c
 	MEMUNLOCK                        = 0x80084d06
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go
index e336d14..d4a5ab9 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go
@@ -131,6 +131,7 @@
 	MEMGETREGIONCOUNT                = 0x80044d07
 	MEMISLOCKED                      = 0x80084d17
 	MEMLOCK                          = 0x40084d05
+	MEMREAD                          = 0xc0404d1a
 	MEMREADOOB                       = 0xc0104d04
 	MEMSETBADBLOCK                   = 0x40084d0c
 	MEMUNLOCK                        = 0x40084d06
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go
index 390c01d..66e65db 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go
@@ -131,6 +131,7 @@
 	MEMGETREGIONCOUNT                = 0x80044d07
 	MEMISLOCKED                      = 0x80084d17
 	MEMLOCK                          = 0x40084d05
+	MEMREAD                          = 0xc0404d1a
 	MEMREADOOB                       = 0xc0104d04
 	MEMSETBADBLOCK                   = 0x40084d0c
 	MEMUNLOCK                        = 0x40084d06
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go
index 98a6e5f..4898420 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go
@@ -136,6 +136,7 @@
 	MEMGETREGIONCOUNT                = 0x40044d07
 	MEMISLOCKED                      = 0x40084d17
 	MEMLOCK                          = 0x80084d05
+	MEMREAD                          = 0xc0404d1a
 	MEMREADOOB                       = 0xc0104d04
 	MEMSETBADBLOCK                   = 0x80084d0c
 	MEMUNLOCK                        = 0x80084d06
@@ -328,6 +329,54 @@
 	SCM_WIFI_STATUS                  = 0x25
 	SFD_CLOEXEC                      = 0x400000
 	SFD_NONBLOCK                     = 0x4000
+	SF_FP                            = 0x38
+	SF_I0                            = 0x20
+	SF_I1                            = 0x24
+	SF_I2                            = 0x28
+	SF_I3                            = 0x2c
+	SF_I4                            = 0x30
+	SF_I5                            = 0x34
+	SF_L0                            = 0x0
+	SF_L1                            = 0x4
+	SF_L2                            = 0x8
+	SF_L3                            = 0xc
+	SF_L4                            = 0x10
+	SF_L5                            = 0x14
+	SF_L6                            = 0x18
+	SF_L7                            = 0x1c
+	SF_PC                            = 0x3c
+	SF_RETP                          = 0x40
+	SF_V9_FP                         = 0x70
+	SF_V9_I0                         = 0x40
+	SF_V9_I1                         = 0x48
+	SF_V9_I2                         = 0x50
+	SF_V9_I3                         = 0x58
+	SF_V9_I4                         = 0x60
+	SF_V9_I5                         = 0x68
+	SF_V9_L0                         = 0x0
+	SF_V9_L1                         = 0x8
+	SF_V9_L2                         = 0x10
+	SF_V9_L3                         = 0x18
+	SF_V9_L4                         = 0x20
+	SF_V9_L5                         = 0x28
+	SF_V9_L6                         = 0x30
+	SF_V9_L7                         = 0x38
+	SF_V9_PC                         = 0x78
+	SF_V9_RETP                       = 0x80
+	SF_V9_XARG0                      = 0x88
+	SF_V9_XARG1                      = 0x90
+	SF_V9_XARG2                      = 0x98
+	SF_V9_XARG3                      = 0xa0
+	SF_V9_XARG4                      = 0xa8
+	SF_V9_XARG5                      = 0xb0
+	SF_V9_XXARG                      = 0xb8
+	SF_XARG0                         = 0x44
+	SF_XARG1                         = 0x48
+	SF_XARG2                         = 0x4c
+	SF_XARG3                         = 0x50
+	SF_XARG4                         = 0x54
+	SF_XARG5                         = 0x58
+	SF_XXARG                         = 0x5c
 	SIOCATMARK                       = 0x8905
 	SIOCGPGRP                        = 0x8904
 	SIOCGSTAMPNS_NEW                 = 0x40108907
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_openbsd_386.go b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_openbsd_386.go
index 6d56edc..af20e47 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_openbsd_386.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_openbsd_386.go
@@ -46,6 +46,7 @@
 	AF_SNA                            = 0xb
 	AF_UNIX                           = 0x1
 	AF_UNSPEC                         = 0x0
+	ALTWERASE                         = 0x200
 	ARPHRD_ETHER                      = 0x1
 	ARPHRD_FRELAY                     = 0xf
 	ARPHRD_IEEE1394                   = 0x18
@@ -108,6 +109,15 @@
 	BPF_DIRECTION_IN                  = 0x1
 	BPF_DIRECTION_OUT                 = 0x2
 	BPF_DIV                           = 0x30
+	BPF_FILDROP_CAPTURE               = 0x1
+	BPF_FILDROP_DROP                  = 0x2
+	BPF_FILDROP_PASS                  = 0x0
+	BPF_F_DIR_IN                      = 0x10
+	BPF_F_DIR_MASK                    = 0x30
+	BPF_F_DIR_OUT                     = 0x20
+	BPF_F_DIR_SHIFT                   = 0x4
+	BPF_F_FLOWID                      = 0x8
+	BPF_F_PRI_MASK                    = 0x7
 	BPF_H                             = 0x8
 	BPF_IMM                           = 0x0
 	BPF_IND                           = 0x40
@@ -136,6 +146,7 @@
 	BPF_OR                            = 0x40
 	BPF_RELEASE                       = 0x30bb6
 	BPF_RET                           = 0x6
+	BPF_RND                           = 0xc0
 	BPF_RSH                           = 0x70
 	BPF_ST                            = 0x2
 	BPF_STX                           = 0x3
@@ -147,6 +158,12 @@
 	BRKINT                            = 0x2
 	CFLUSH                            = 0xf
 	CLOCAL                            = 0x8000
+	CLOCK_BOOTTIME                    = 0x6
+	CLOCK_MONOTONIC                   = 0x3
+	CLOCK_PROCESS_CPUTIME_ID          = 0x2
+	CLOCK_REALTIME                    = 0x0
+	CLOCK_THREAD_CPUTIME_ID           = 0x4
+	CLOCK_UPTIME                      = 0x5
 	CPUSTATES                         = 0x6
 	CP_IDLE                           = 0x5
 	CP_INTR                           = 0x4
@@ -170,7 +187,65 @@
 	CTL_KERN                          = 0x1
 	CTL_MAXNAME                       = 0xc
 	CTL_NET                           = 0x4
+	DIOCADDQUEUE                      = 0xc100445d
+	DIOCADDRULE                       = 0xccc84404
+	DIOCADDSTATE                      = 0xc1084425
+	DIOCCHANGERULE                    = 0xccc8441a
+	DIOCCLRIFFLAG                     = 0xc024445a
+	DIOCCLRSRCNODES                   = 0x20004455
+	DIOCCLRSTATES                     = 0xc0d04412
+	DIOCCLRSTATUS                     = 0xc0244416
+	DIOCGETLIMIT                      = 0xc0084427
+	DIOCGETQSTATS                     = 0xc1084460
+	DIOCGETQUEUE                      = 0xc100445f
+	DIOCGETQUEUES                     = 0xc100445e
+	DIOCGETRULE                       = 0xccc84407
+	DIOCGETRULES                      = 0xccc84406
+	DIOCGETRULESET                    = 0xc444443b
+	DIOCGETRULESETS                   = 0xc444443a
+	DIOCGETSRCNODES                   = 0xc0084454
+	DIOCGETSTATE                      = 0xc1084413
+	DIOCGETSTATES                     = 0xc0084419
+	DIOCGETSTATUS                     = 0xc1e84415
+	DIOCGETSYNFLWATS                  = 0xc0084463
+	DIOCGETTIMEOUT                    = 0xc008441e
+	DIOCIGETIFACES                    = 0xc0244457
+	DIOCKILLSRCNODES                  = 0xc068445b
+	DIOCKILLSTATES                    = 0xc0d04429
+	DIOCNATLOOK                       = 0xc0504417
+	DIOCOSFPADD                       = 0xc084444f
 	DIOCOSFPFLUSH                     = 0x2000444e
+	DIOCOSFPGET                       = 0xc0844450
+	DIOCRADDADDRS                     = 0xc44c4443
+	DIOCRADDTABLES                    = 0xc44c443d
+	DIOCRCLRADDRS                     = 0xc44c4442
+	DIOCRCLRASTATS                    = 0xc44c4448
+	DIOCRCLRTABLES                    = 0xc44c443c
+	DIOCRCLRTSTATS                    = 0xc44c4441
+	DIOCRDELADDRS                     = 0xc44c4444
+	DIOCRDELTABLES                    = 0xc44c443e
+	DIOCRGETADDRS                     = 0xc44c4446
+	DIOCRGETASTATS                    = 0xc44c4447
+	DIOCRGETTABLES                    = 0xc44c443f
+	DIOCRGETTSTATS                    = 0xc44c4440
+	DIOCRINADEFINE                    = 0xc44c444d
+	DIOCRSETADDRS                     = 0xc44c4445
+	DIOCRSETTFLAGS                    = 0xc44c444a
+	DIOCRTSTADDRS                     = 0xc44c4449
+	DIOCSETDEBUG                      = 0xc0044418
+	DIOCSETHOSTID                     = 0xc0044456
+	DIOCSETIFFLAG                     = 0xc0244459
+	DIOCSETLIMIT                      = 0xc0084428
+	DIOCSETREASS                      = 0xc004445c
+	DIOCSETSTATUSIF                   = 0xc0244414
+	DIOCSETSYNCOOKIES                 = 0xc0014462
+	DIOCSETSYNFLWATS                  = 0xc0084461
+	DIOCSETTIMEOUT                    = 0xc008441d
+	DIOCSTART                         = 0x20004401
+	DIOCSTOP                          = 0x20004402
+	DIOCXBEGIN                        = 0xc00c4451
+	DIOCXCOMMIT                       = 0xc00c4452
+	DIOCXROLLBACK                     = 0xc00c4453
 	DLT_ARCNET                        = 0x7
 	DLT_ATM_RFC1483                   = 0xb
 	DLT_AX25                          = 0x3
@@ -186,6 +261,7 @@
 	DLT_LOOP                          = 0xc
 	DLT_MPLS                          = 0xdb
 	DLT_NULL                          = 0x0
+	DLT_OPENFLOW                      = 0x10b
 	DLT_PFLOG                         = 0x75
 	DLT_PFSYNC                        = 0x12
 	DLT_PPP                           = 0x9
@@ -196,6 +272,23 @@
 	DLT_RAW                           = 0xe
 	DLT_SLIP                          = 0x8
 	DLT_SLIP_BSDOS                    = 0xf
+	DLT_USBPCAP                       = 0xf9
+	DLT_USER0                         = 0x93
+	DLT_USER1                         = 0x94
+	DLT_USER10                        = 0x9d
+	DLT_USER11                        = 0x9e
+	DLT_USER12                        = 0x9f
+	DLT_USER13                        = 0xa0
+	DLT_USER14                        = 0xa1
+	DLT_USER15                        = 0xa2
+	DLT_USER2                         = 0x95
+	DLT_USER3                         = 0x96
+	DLT_USER4                         = 0x97
+	DLT_USER5                         = 0x98
+	DLT_USER6                         = 0x99
+	DLT_USER7                         = 0x9a
+	DLT_USER8                         = 0x9b
+	DLT_USER9                         = 0x9c
 	DT_BLK                            = 0x6
 	DT_CHR                            = 0x2
 	DT_DIR                            = 0x4
@@ -215,6 +308,8 @@
 	EMUL_ENABLED                      = 0x1
 	EMUL_NATIVE                       = 0x2
 	ENDRUNDISC                        = 0x9
+	ETH64_8021_RSVD_MASK              = 0xfffffffffff0
+	ETH64_8021_RSVD_PREFIX            = 0x180c2000000
 	ETHERMIN                          = 0x2e
 	ETHERMTU                          = 0x5dc
 	ETHERTYPE_8023                    = 0x4
@@ -267,6 +362,7 @@
 	ETHERTYPE_DN                      = 0x6003
 	ETHERTYPE_DOGFIGHT                = 0x1989
 	ETHERTYPE_DSMD                    = 0x8039
+	ETHERTYPE_EAPOL                   = 0x888e
 	ETHERTYPE_ECMA                    = 0x803
 	ETHERTYPE_ENCRYPT                 = 0x803d
 	ETHERTYPE_ES                      = 0x805d
@@ -298,6 +394,7 @@
 	ETHERTYPE_LLDP                    = 0x88cc
 	ETHERTYPE_LOGICRAFT               = 0x8148
 	ETHERTYPE_LOOPBACK                = 0x9000
+	ETHERTYPE_MACSEC                  = 0x88e5
 	ETHERTYPE_MATRA                   = 0x807a
 	ETHERTYPE_MAX                     = 0xffff
 	ETHERTYPE_MERIT                   = 0x807c
@@ -326,15 +423,17 @@
 	ETHERTYPE_NCD                     = 0x8149
 	ETHERTYPE_NESTAR                  = 0x8006
 	ETHERTYPE_NETBEUI                 = 0x8191
+	ETHERTYPE_NHRP                    = 0x2001
 	ETHERTYPE_NOVELL                  = 0x8138
 	ETHERTYPE_NS                      = 0x600
 	ETHERTYPE_NSAT                    = 0x601
 	ETHERTYPE_NSCOMPAT                = 0x807
+	ETHERTYPE_NSH                     = 0x984f
 	ETHERTYPE_NTRAILER                = 0x10
 	ETHERTYPE_OS9                     = 0x7007
 	ETHERTYPE_OS9NET                  = 0x7009
 	ETHERTYPE_PACER                   = 0x80c6
-	ETHERTYPE_PAE                     = 0x888e
+	ETHERTYPE_PBB                     = 0x88e7
 	ETHERTYPE_PCS                     = 0x4242
 	ETHERTYPE_PLANNING                = 0x8044
 	ETHERTYPE_PPP                     = 0x880b
@@ -409,28 +508,40 @@
 	ETHER_CRC_POLY_LE                 = 0xedb88320
 	ETHER_HDR_LEN                     = 0xe
 	ETHER_MAX_DIX_LEN                 = 0x600
+	ETHER_MAX_HARDMTU_LEN             = 0xff9b
 	ETHER_MAX_LEN                     = 0x5ee
 	ETHER_MIN_LEN                     = 0x40
 	ETHER_TYPE_LEN                    = 0x2
 	ETHER_VLAN_ENCAP_LEN              = 0x4
 	EVFILT_AIO                        = -0x3
+	EVFILT_DEVICE                     = -0x8
+	EVFILT_EXCEPT                     = -0x9
 	EVFILT_PROC                       = -0x5
 	EVFILT_READ                       = -0x1
 	EVFILT_SIGNAL                     = -0x6
-	EVFILT_SYSCOUNT                   = 0x7
+	EVFILT_SYSCOUNT                   = 0x9
 	EVFILT_TIMER                      = -0x7
 	EVFILT_VNODE                      = -0x4
 	EVFILT_WRITE                      = -0x2
+	EVL_ENCAPLEN                      = 0x4
+	EVL_PRIO_BITS                     = 0xd
+	EVL_PRIO_MAX                      = 0x7
+	EVL_VLID_MASK                     = 0xfff
+	EVL_VLID_MAX                      = 0xffe
+	EVL_VLID_MIN                      = 0x1
+	EVL_VLID_NULL                     = 0x0
 	EV_ADD                            = 0x1
 	EV_CLEAR                          = 0x20
 	EV_DELETE                         = 0x2
 	EV_DISABLE                        = 0x8
+	EV_DISPATCH                       = 0x80
 	EV_ENABLE                         = 0x4
 	EV_EOF                            = 0x8000
 	EV_ERROR                          = 0x4000
 	EV_FLAG1                          = 0x2000
 	EV_ONESHOT                        = 0x10
-	EV_SYSFLAGS                       = 0xf000
+	EV_RECEIPT                        = 0x40
+	EV_SYSFLAGS                       = 0xf800
 	EXTA                              = 0x4b00
 	EXTB                              = 0x9600
 	EXTPROC                           = 0x800
@@ -443,6 +554,7 @@
 	F_GETFL                           = 0x3
 	F_GETLK                           = 0x7
 	F_GETOWN                          = 0x5
+	F_ISATTY                          = 0xb
 	F_OK                              = 0x0
 	F_RDLCK                           = 0x1
 	F_SETFD                           = 0x2
@@ -460,7 +572,6 @@
 	IEXTEN                            = 0x400
 	IFAN_ARRIVAL                      = 0x0
 	IFAN_DEPARTURE                    = 0x1
-	IFA_ROUTE                         = 0x1
 	IFF_ALLMULTI                      = 0x200
 	IFF_BROADCAST                     = 0x2
 	IFF_CANTCHANGE                    = 0x8e52
@@ -471,12 +582,12 @@
 	IFF_LOOPBACK                      = 0x8
 	IFF_MULTICAST                     = 0x8000
 	IFF_NOARP                         = 0x80
-	IFF_NOTRAILERS                    = 0x20
 	IFF_OACTIVE                       = 0x400
 	IFF_POINTOPOINT                   = 0x10
 	IFF_PROMISC                       = 0x100
 	IFF_RUNNING                       = 0x40
 	IFF_SIMPLEX                       = 0x800
+	IFF_STATICARP                     = 0x20
 	IFF_UP                            = 0x1
 	IFNAMSIZ                          = 0x10
 	IFT_1822                          = 0x2
@@ -605,6 +716,7 @@
 	IFT_LINEGROUP                     = 0xd2
 	IFT_LOCALTALK                     = 0x2a
 	IFT_LOOP                          = 0x18
+	IFT_MBIM                          = 0xfa
 	IFT_MEDIAMAILOVERIP               = 0x8b
 	IFT_MFSIGLINK                     = 0xa7
 	IFT_MIOX25                        = 0x26
@@ -695,6 +807,7 @@
 	IFT_VOICEOVERCABLE                = 0xc6
 	IFT_VOICEOVERFRAMERELAY           = 0x99
 	IFT_VOICEOVERIP                   = 0x68
+	IFT_WIREGUARD                     = 0xfb
 	IFT_X213                          = 0x5d
 	IFT_X25                           = 0x5
 	IFT_X25DDN                        = 0x4
@@ -729,8 +842,6 @@
 	IPPROTO_AH                        = 0x33
 	IPPROTO_CARP                      = 0x70
 	IPPROTO_DIVERT                    = 0x102
-	IPPROTO_DIVERT_INIT               = 0x2
-	IPPROTO_DIVERT_RESP               = 0x1
 	IPPROTO_DONE                      = 0x101
 	IPPROTO_DSTOPTS                   = 0x3c
 	IPPROTO_EGP                       = 0x8
@@ -762,9 +873,11 @@
 	IPPROTO_RAW                       = 0xff
 	IPPROTO_ROUTING                   = 0x2b
 	IPPROTO_RSVP                      = 0x2e
+	IPPROTO_SCTP                      = 0x84
 	IPPROTO_TCP                       = 0x6
 	IPPROTO_TP                        = 0x1d
 	IPPROTO_UDP                       = 0x11
+	IPPROTO_UDPLITE                   = 0x88
 	IPV6_AUTH_LEVEL                   = 0x35
 	IPV6_AUTOFLOWLABEL                = 0x3b
 	IPV6_CHECKSUM                     = 0x1a
@@ -787,6 +900,7 @@
 	IPV6_LEAVE_GROUP                  = 0xd
 	IPV6_MAXHLIM                      = 0xff
 	IPV6_MAXPACKET                    = 0xffff
+	IPV6_MINHOPCOUNT                  = 0x41
 	IPV6_MMTU                         = 0x500
 	IPV6_MULTICAST_HOPS               = 0xa
 	IPV6_MULTICAST_IF                 = 0x9
@@ -826,12 +940,12 @@
 	IP_DEFAULT_MULTICAST_LOOP         = 0x1
 	IP_DEFAULT_MULTICAST_TTL          = 0x1
 	IP_DF                             = 0x4000
-	IP_DIVERTFL                       = 0x1022
 	IP_DROP_MEMBERSHIP                = 0xd
 	IP_ESP_NETWORK_LEVEL              = 0x16
 	IP_ESP_TRANS_LEVEL                = 0x15
 	IP_HDRINCL                        = 0x2
 	IP_IPCOMP_LEVEL                   = 0x1d
+	IP_IPDEFTTL                       = 0x25
 	IP_IPSECFLOWINFO                  = 0x24
 	IP_IPSEC_LOCAL_AUTH               = 0x1b
 	IP_IPSEC_LOCAL_CRED               = 0x19
@@ -865,10 +979,15 @@
 	IP_RETOPTS                        = 0x8
 	IP_RF                             = 0x8000
 	IP_RTABLE                         = 0x1021
+	IP_SENDSRCADDR                    = 0x7
 	IP_TOS                            = 0x3
 	IP_TTL                            = 0x4
 	ISIG                              = 0x80
 	ISTRIP                            = 0x20
+	ITIMER_PROF                       = 0x2
+	ITIMER_REAL                       = 0x0
+	ITIMER_VIRTUAL                    = 0x1
+	IUCLC                             = 0x1000
 	IXANY                             = 0x800
 	IXOFF                             = 0x400
 	IXON                              = 0x200
@@ -900,10 +1019,11 @@
 	MAP_INHERIT_COPY                  = 0x1
 	MAP_INHERIT_NONE                  = 0x2
 	MAP_INHERIT_SHARE                 = 0x0
-	MAP_NOEXTEND                      = 0x100
-	MAP_NORESERVE                     = 0x40
+	MAP_INHERIT_ZERO                  = 0x3
+	MAP_NOEXTEND                      = 0x0
+	MAP_NORESERVE                     = 0x0
 	MAP_PRIVATE                       = 0x2
-	MAP_RENAME                        = 0x20
+	MAP_RENAME                        = 0x0
 	MAP_SHARED                        = 0x1
 	MAP_STACK                         = 0x4000
 	MAP_TRYFIXED                      = 0x0
@@ -922,6 +1042,7 @@
 	MNT_NOATIME                       = 0x8000
 	MNT_NODEV                         = 0x10
 	MNT_NOEXEC                        = 0x4
+	MNT_NOPERM                        = 0x20
 	MNT_NOSUID                        = 0x8
 	MNT_NOWAIT                        = 0x2
 	MNT_QUOTA                         = 0x2000
@@ -929,13 +1050,29 @@
 	MNT_RELOAD                        = 0x40000
 	MNT_ROOTFS                        = 0x4000
 	MNT_SOFTDEP                       = 0x4000000
+	MNT_STALLED                       = 0x100000
+	MNT_SWAPPABLE                     = 0x200000
 	MNT_SYNCHRONOUS                   = 0x2
 	MNT_UPDATE                        = 0x10000
 	MNT_VISFLAGMASK                   = 0x400ffff
 	MNT_WAIT                          = 0x1
 	MNT_WANTRDWR                      = 0x2000000
 	MNT_WXALLOWED                     = 0x800
+	MOUNT_AFS                         = "afs"
+	MOUNT_CD9660                      = "cd9660"
+	MOUNT_EXT2FS                      = "ext2fs"
+	MOUNT_FFS                         = "ffs"
+	MOUNT_FUSEFS                      = "fuse"
+	MOUNT_MFS                         = "mfs"
+	MOUNT_MSDOS                       = "msdos"
+	MOUNT_NCPFS                       = "ncpfs"
+	MOUNT_NFS                         = "nfs"
+	MOUNT_NTFS                        = "ntfs"
+	MOUNT_TMPFS                       = "tmpfs"
+	MOUNT_UDF                         = "udf"
+	MOUNT_UFS                         = "ffs"
 	MSG_BCAST                         = 0x100
+	MSG_CMSG_CLOEXEC                  = 0x800
 	MSG_CTRUNC                        = 0x20
 	MSG_DONTROUTE                     = 0x4
 	MSG_DONTWAIT                      = 0x80
@@ -946,6 +1083,7 @@
 	MSG_PEEK                          = 0x2
 	MSG_TRUNC                         = 0x10
 	MSG_WAITALL                       = 0x40
+	MSG_WAITFORONE                    = 0x1000
 	MS_ASYNC                          = 0x1
 	MS_INVALIDATE                     = 0x4
 	MS_SYNC                           = 0x2
@@ -953,12 +1091,16 @@
 	NET_RT_DUMP                       = 0x1
 	NET_RT_FLAGS                      = 0x2
 	NET_RT_IFLIST                     = 0x3
-	NET_RT_MAXID                      = 0x6
+	NET_RT_IFNAMES                    = 0x6
+	NET_RT_MAXID                      = 0x8
+	NET_RT_SOURCE                     = 0x7
 	NET_RT_STATS                      = 0x4
 	NET_RT_TABLE                      = 0x5
 	NFDBITS                           = 0x20
 	NOFLSH                            = 0x80000000
+	NOKERNINFO                        = 0x2000000
 	NOTE_ATTRIB                       = 0x8
+	NOTE_CHANGE                       = 0x1
 	NOTE_CHILD                        = 0x4
 	NOTE_DELETE                       = 0x1
 	NOTE_EOF                          = 0x2
@@ -968,6 +1110,7 @@
 	NOTE_FORK                         = 0x40000000
 	NOTE_LINK                         = 0x10
 	NOTE_LOWAT                        = 0x1
+	NOTE_OOB                          = 0x4
 	NOTE_PCTRLMASK                    = 0xf0000000
 	NOTE_PDATAMASK                    = 0xfffff
 	NOTE_RENAME                       = 0x20
@@ -977,11 +1120,13 @@
 	NOTE_TRUNCATE                     = 0x80
 	NOTE_WRITE                        = 0x2
 	OCRNL                             = 0x10
+	OLCUC                             = 0x20
 	ONLCR                             = 0x2
 	ONLRET                            = 0x80
 	ONOCR                             = 0x40
 	ONOEOT                            = 0x8
 	OPOST                             = 0x1
+	OXTABS                            = 0x4
 	O_ACCMODE                         = 0x3
 	O_APPEND                          = 0x8
 	O_ASYNC                           = 0x40
@@ -1015,7 +1160,6 @@
 	PROT_NONE                         = 0x0
 	PROT_READ                         = 0x1
 	PROT_WRITE                        = 0x2
-	PT_MASK                           = 0x3ff000
 	RLIMIT_CORE                       = 0x4
 	RLIMIT_CPU                        = 0x0
 	RLIMIT_DATA                       = 0x2
@@ -1027,19 +1171,25 @@
 	RLIMIT_STACK                      = 0x3
 	RLIM_INFINITY                     = 0x7fffffffffffffff
 	RTAX_AUTHOR                       = 0x6
+	RTAX_BFD                          = 0xb
 	RTAX_BRD                          = 0x7
+	RTAX_DNS                          = 0xc
 	RTAX_DST                          = 0x0
 	RTAX_GATEWAY                      = 0x1
 	RTAX_GENMASK                      = 0x3
 	RTAX_IFA                          = 0x5
 	RTAX_IFP                          = 0x4
 	RTAX_LABEL                        = 0xa
-	RTAX_MAX                          = 0xb
+	RTAX_MAX                          = 0xf
 	RTAX_NETMASK                      = 0x2
+	RTAX_SEARCH                       = 0xe
 	RTAX_SRC                          = 0x8
 	RTAX_SRCMASK                      = 0x9
+	RTAX_STATIC                       = 0xd
 	RTA_AUTHOR                        = 0x40
+	RTA_BFD                           = 0x800
 	RTA_BRD                           = 0x80
+	RTA_DNS                           = 0x1000
 	RTA_DST                           = 0x1
 	RTA_GATEWAY                       = 0x2
 	RTA_GENMASK                       = 0x8
@@ -1047,49 +1197,57 @@
 	RTA_IFP                           = 0x10
 	RTA_LABEL                         = 0x400
 	RTA_NETMASK                       = 0x4
+	RTA_SEARCH                        = 0x4000
 	RTA_SRC                           = 0x100
 	RTA_SRCMASK                       = 0x200
+	RTA_STATIC                        = 0x2000
 	RTF_ANNOUNCE                      = 0x4000
+	RTF_BFD                           = 0x1000000
 	RTF_BLACKHOLE                     = 0x1000
+	RTF_BROADCAST                     = 0x400000
+	RTF_CACHED                        = 0x20000
 	RTF_CLONED                        = 0x10000
 	RTF_CLONING                       = 0x100
+	RTF_CONNECTED                     = 0x800000
 	RTF_DONE                          = 0x40
 	RTF_DYNAMIC                       = 0x10
-	RTF_FMASK                         = 0x10f808
+	RTF_FMASK                         = 0x110fc08
 	RTF_GATEWAY                       = 0x2
 	RTF_HOST                          = 0x4
 	RTF_LLINFO                        = 0x400
-	RTF_MASK                          = 0x80
+	RTF_LOCAL                         = 0x200000
 	RTF_MODIFIED                      = 0x20
 	RTF_MPATH                         = 0x40000
 	RTF_MPLS                          = 0x100000
+	RTF_MULTICAST                     = 0x200
 	RTF_PERMANENT_ARP                 = 0x2000
 	RTF_PROTO1                        = 0x8000
 	RTF_PROTO2                        = 0x4000
 	RTF_PROTO3                        = 0x2000
 	RTF_REJECT                        = 0x8
-	RTF_SOURCE                        = 0x20000
 	RTF_STATIC                        = 0x800
-	RTF_TUNNEL                        = 0x100000
 	RTF_UP                            = 0x1
 	RTF_USETRAILERS                   = 0x8000
-	RTF_XRESOLVE                      = 0x200
+	RTM_80211INFO                     = 0x15
 	RTM_ADD                           = 0x1
+	RTM_BFD                           = 0x12
 	RTM_CHANGE                        = 0x3
+	RTM_CHGADDRATTR                   = 0x14
 	RTM_DELADDR                       = 0xd
 	RTM_DELETE                        = 0x2
 	RTM_DESYNC                        = 0x10
 	RTM_GET                           = 0x4
 	RTM_IFANNOUNCE                    = 0xf
 	RTM_IFINFO                        = 0xe
-	RTM_LOCK                          = 0x8
+	RTM_INVALIDATE                    = 0x11
 	RTM_LOSING                        = 0x5
 	RTM_MAXSIZE                       = 0x800
 	RTM_MISS                          = 0x7
 	RTM_NEWADDR                       = 0xc
+	RTM_PROPOSAL                      = 0x13
 	RTM_REDIRECT                      = 0x6
 	RTM_RESOLVE                       = 0xb
-	RTM_RTTUNIT                       = 0xf4240
+	RTM_SOURCE                        = 0x16
 	RTM_VERSION                       = 0x5
 	RTV_EXPIRE                        = 0x4
 	RTV_HOPCOUNT                      = 0x2
@@ -1099,67 +1257,74 @@
 	RTV_RTTVAR                        = 0x80
 	RTV_SPIPE                         = 0x10
 	RTV_SSTHRESH                      = 0x20
+	RT_TABLEID_BITS                   = 0x8
+	RT_TABLEID_MASK                   = 0xff
 	RT_TABLEID_MAX                    = 0xff
 	RUSAGE_CHILDREN                   = -0x1
 	RUSAGE_SELF                       = 0x0
 	RUSAGE_THREAD                     = 0x1
 	SCM_RIGHTS                        = 0x1
 	SCM_TIMESTAMP                     = 0x4
+	SEEK_CUR                          = 0x1
+	SEEK_END                          = 0x2
+	SEEK_SET                          = 0x0
 	SHUT_RD                           = 0x0
 	SHUT_RDWR                         = 0x2
 	SHUT_WR                           = 0x1
 	SIOCADDMULTI                      = 0x80206931
 	SIOCAIFADDR                       = 0x8040691a
 	SIOCAIFGROUP                      = 0x80246987
-	SIOCALIFADDR                      = 0x8218691c
 	SIOCATMARK                        = 0x40047307
-	SIOCBRDGADD                       = 0x8054693c
-	SIOCBRDGADDS                      = 0x80546941
-	SIOCBRDGARL                       = 0x806e694d
+	SIOCBRDGADD                       = 0x805c693c
+	SIOCBRDGADDL                      = 0x805c6949
+	SIOCBRDGADDS                      = 0x805c6941
+	SIOCBRDGARL                       = 0x808c694d
 	SIOCBRDGDADDR                     = 0x81286947
-	SIOCBRDGDEL                       = 0x8054693d
-	SIOCBRDGDELS                      = 0x80546942
-	SIOCBRDGFLUSH                     = 0x80546948
-	SIOCBRDGFRL                       = 0x806e694e
+	SIOCBRDGDEL                       = 0x805c693d
+	SIOCBRDGDELS                      = 0x805c6942
+	SIOCBRDGFLUSH                     = 0x805c6948
+	SIOCBRDGFRL                       = 0x808c694e
 	SIOCBRDGGCACHE                    = 0xc0146941
 	SIOCBRDGGFD                       = 0xc0146952
 	SIOCBRDGGHT                       = 0xc0146951
-	SIOCBRDGGIFFLGS                   = 0xc054693e
+	SIOCBRDGGIFFLGS                   = 0xc05c693e
 	SIOCBRDGGMA                       = 0xc0146953
 	SIOCBRDGGPARAM                    = 0xc03c6958
 	SIOCBRDGGPRI                      = 0xc0146950
 	SIOCBRDGGRL                       = 0xc028694f
-	SIOCBRDGGSIFS                     = 0xc054693c
 	SIOCBRDGGTO                       = 0xc0146946
-	SIOCBRDGIFS                       = 0xc0546942
+	SIOCBRDGIFS                       = 0xc05c6942
 	SIOCBRDGRTS                       = 0xc0186943
 	SIOCBRDGSADDR                     = 0xc1286944
 	SIOCBRDGSCACHE                    = 0x80146940
 	SIOCBRDGSFD                       = 0x80146952
 	SIOCBRDGSHT                       = 0x80146951
-	SIOCBRDGSIFCOST                   = 0x80546955
-	SIOCBRDGSIFFLGS                   = 0x8054693f
-	SIOCBRDGSIFPRIO                   = 0x80546954
+	SIOCBRDGSIFCOST                   = 0x805c6955
+	SIOCBRDGSIFFLGS                   = 0x805c693f
+	SIOCBRDGSIFPRIO                   = 0x805c6954
+	SIOCBRDGSIFPROT                   = 0x805c694a
 	SIOCBRDGSMA                       = 0x80146953
 	SIOCBRDGSPRI                      = 0x80146950
 	SIOCBRDGSPROTO                    = 0x8014695a
 	SIOCBRDGSTO                       = 0x80146945
 	SIOCBRDGSTXHC                     = 0x80146959
+	SIOCDELLABEL                      = 0x80206997
 	SIOCDELMULTI                      = 0x80206932
 	SIOCDIFADDR                       = 0x80206919
 	SIOCDIFGROUP                      = 0x80246989
+	SIOCDIFPARENT                     = 0x802069b4
 	SIOCDIFPHYADDR                    = 0x80206949
-	SIOCDLIFADDR                      = 0x8218691e
+	SIOCDPWE3NEIGHBOR                 = 0x802069de
+	SIOCDVNETID                       = 0x802069af
 	SIOCGETKALIVE                     = 0xc01869a4
 	SIOCGETLABEL                      = 0x8020699a
+	SIOCGETMPWCFG                     = 0xc02069ae
 	SIOCGETPFLOW                      = 0xc02069fe
 	SIOCGETPFSYNC                     = 0xc02069f8
 	SIOCGETSGCNT                      = 0xc0147534
 	SIOCGETVIFCNT                     = 0xc0147533
 	SIOCGETVLAN                       = 0xc0206990
-	SIOCGHIWAT                        = 0x40047301
 	SIOCGIFADDR                       = 0xc0206921
-	SIOCGIFASYNCMAP                   = 0xc020697c
 	SIOCGIFBRDADDR                    = 0xc0206923
 	SIOCGIFCONF                       = 0xc0086924
 	SIOCGIFDATA                       = 0xc020691b
@@ -1168,40 +1333,53 @@
 	SIOCGIFFLAGS                      = 0xc0206911
 	SIOCGIFGATTR                      = 0xc024698b
 	SIOCGIFGENERIC                    = 0xc020693a
+	SIOCGIFGLIST                      = 0xc024698d
 	SIOCGIFGMEMB                      = 0xc024698a
 	SIOCGIFGROUP                      = 0xc0246988
 	SIOCGIFHARDMTU                    = 0xc02069a5
-	SIOCGIFMEDIA                      = 0xc0286936
+	SIOCGIFLLPRIO                     = 0xc02069b6
+	SIOCGIFMEDIA                      = 0xc0386938
 	SIOCGIFMETRIC                     = 0xc0206917
 	SIOCGIFMTU                        = 0xc020697e
 	SIOCGIFNETMASK                    = 0xc0206925
-	SIOCGIFPDSTADDR                   = 0xc0206948
+	SIOCGIFPAIR                       = 0xc02069b1
+	SIOCGIFPARENT                     = 0xc02069b3
 	SIOCGIFPRIORITY                   = 0xc020699c
-	SIOCGIFPSRCADDR                   = 0xc0206947
 	SIOCGIFRDOMAIN                    = 0xc02069a0
 	SIOCGIFRTLABEL                    = 0xc0206983
-	SIOCGIFTIMESLOT                   = 0xc0206986
+	SIOCGIFRXR                        = 0x802069aa
+	SIOCGIFSFFPAGE                    = 0xc1126939
 	SIOCGIFXFLAGS                     = 0xc020699e
-	SIOCGLIFADDR                      = 0xc218691d
 	SIOCGLIFPHYADDR                   = 0xc218694b
+	SIOCGLIFPHYDF                     = 0xc02069c2
+	SIOCGLIFPHYECN                    = 0xc02069c8
 	SIOCGLIFPHYRTABLE                 = 0xc02069a2
 	SIOCGLIFPHYTTL                    = 0xc02069a9
-	SIOCGLOWAT                        = 0x40047303
 	SIOCGPGRP                         = 0x40047309
+	SIOCGPWE3                         = 0xc0206998
+	SIOCGPWE3CTRLWORD                 = 0xc02069dc
+	SIOCGPWE3FAT                      = 0xc02069dd
+	SIOCGPWE3NEIGHBOR                 = 0xc21869de
+	SIOCGRXHPRIO                      = 0xc02069db
 	SIOCGSPPPPARAMS                   = 0xc0206994
+	SIOCGTXHPRIO                      = 0xc02069c6
+	SIOCGUMBINFO                      = 0xc02069be
+	SIOCGUMBPARAM                     = 0xc02069c0
 	SIOCGVH                           = 0xc02069f6
+	SIOCGVNETFLOWID                   = 0xc02069c4
 	SIOCGVNETID                       = 0xc02069a7
+	SIOCIFAFATTACH                    = 0x801169ab
+	SIOCIFAFDETACH                    = 0x801169ac
 	SIOCIFCREATE                      = 0x8020697a
 	SIOCIFDESTROY                     = 0x80206979
 	SIOCIFGCLONERS                    = 0xc00c6978
 	SIOCSETKALIVE                     = 0x801869a3
 	SIOCSETLABEL                      = 0x80206999
+	SIOCSETMPWCFG                     = 0x802069ad
 	SIOCSETPFLOW                      = 0x802069fd
 	SIOCSETPFSYNC                     = 0x802069f7
 	SIOCSETVLAN                       = 0x8020698f
-	SIOCSHIWAT                        = 0x80047300
 	SIOCSIFADDR                       = 0x8020690c
-	SIOCSIFASYNCMAP                   = 0x8020697d
 	SIOCSIFBRDADDR                    = 0x80206913
 	SIOCSIFDESCR                      = 0x80206980
 	SIOCSIFDSTADDR                    = 0x8020690e
@@ -1209,25 +1387,37 @@
 	SIOCSIFGATTR                      = 0x8024698c
 	SIOCSIFGENERIC                    = 0x80206939
 	SIOCSIFLLADDR                     = 0x8020691f
-	SIOCSIFMEDIA                      = 0xc0206935
+	SIOCSIFLLPRIO                     = 0x802069b5
+	SIOCSIFMEDIA                      = 0xc0206937
 	SIOCSIFMETRIC                     = 0x80206918
 	SIOCSIFMTU                        = 0x8020697f
 	SIOCSIFNETMASK                    = 0x80206916
-	SIOCSIFPHYADDR                    = 0x80406946
+	SIOCSIFPAIR                       = 0x802069b0
+	SIOCSIFPARENT                     = 0x802069b2
 	SIOCSIFPRIORITY                   = 0x8020699b
 	SIOCSIFRDOMAIN                    = 0x8020699f
 	SIOCSIFRTLABEL                    = 0x80206982
-	SIOCSIFTIMESLOT                   = 0x80206985
 	SIOCSIFXFLAGS                     = 0x8020699d
 	SIOCSLIFPHYADDR                   = 0x8218694a
+	SIOCSLIFPHYDF                     = 0x802069c1
+	SIOCSLIFPHYECN                    = 0x802069c7
 	SIOCSLIFPHYRTABLE                 = 0x802069a1
 	SIOCSLIFPHYTTL                    = 0x802069a8
-	SIOCSLOWAT                        = 0x80047302
 	SIOCSPGRP                         = 0x80047308
+	SIOCSPWE3CTRLWORD                 = 0x802069dc
+	SIOCSPWE3FAT                      = 0x802069dd
+	SIOCSPWE3NEIGHBOR                 = 0x821869de
+	SIOCSRXHPRIO                      = 0x802069db
 	SIOCSSPPPPARAMS                   = 0x80206993
+	SIOCSTXHPRIO                      = 0x802069c5
+	SIOCSUMBPARAM                     = 0x802069bf
 	SIOCSVH                           = 0xc02069f5
+	SIOCSVNETFLOWID                   = 0x802069c3
 	SIOCSVNETID                       = 0x802069a6
+	SOCK_CLOEXEC                      = 0x8000
 	SOCK_DGRAM                        = 0x2
+	SOCK_DNS                          = 0x1000
+	SOCK_NONBLOCK                     = 0x4000
 	SOCK_RAW                          = 0x3
 	SOCK_RDM                          = 0x4
 	SOCK_SEQPACKET                    = 0x5
@@ -1238,6 +1428,7 @@
 	SO_BINDANY                        = 0x1000
 	SO_BROADCAST                      = 0x20
 	SO_DEBUG                          = 0x1
+	SO_DOMAIN                         = 0x1024
 	SO_DONTROUTE                      = 0x10
 	SO_ERROR                          = 0x1007
 	SO_KEEPALIVE                      = 0x8
@@ -1245,6 +1436,7 @@
 	SO_NETPROC                        = 0x1020
 	SO_OOBINLINE                      = 0x100
 	SO_PEERCRED                       = 0x1022
+	SO_PROTOCOL                       = 0x1025
 	SO_RCVBUF                         = 0x1002
 	SO_RCVLOWAT                       = 0x1004
 	SO_RCVTIMEO                       = 0x1006
@@ -1258,6 +1450,7 @@
 	SO_TIMESTAMP                      = 0x800
 	SO_TYPE                           = 0x1008
 	SO_USELOOPBACK                    = 0x40
+	SO_ZEROIZE                        = 0x2000
 	S_BLKSIZE                         = 0x200
 	S_IEXEC                           = 0x40
 	S_IFBLK                           = 0x6000
@@ -1287,9 +1480,24 @@
 	S_IXOTH                           = 0x1
 	S_IXUSR                           = 0x40
 	TCIFLUSH                          = 0x1
+	TCIOFF                            = 0x3
 	TCIOFLUSH                         = 0x3
+	TCION                             = 0x4
 	TCOFLUSH                          = 0x2
-	TCP_MAXBURST                      = 0x4
+	TCOOFF                            = 0x1
+	TCOON                             = 0x2
+	TCPOPT_EOL                        = 0x0
+	TCPOPT_MAXSEG                     = 0x2
+	TCPOPT_NOP                        = 0x1
+	TCPOPT_SACK                       = 0x5
+	TCPOPT_SACK_HDR                   = 0x1010500
+	TCPOPT_SACK_PERMITTED             = 0x4
+	TCPOPT_SACK_PERMIT_HDR            = 0x1010402
+	TCPOPT_SIGNATURE                  = 0x13
+	TCPOPT_TIMESTAMP                  = 0x8
+	TCPOPT_TSTAMP_HDR                 = 0x101080a
+	TCPOPT_WINDOW                     = 0x3
+	TCP_INFO                          = 0x9
 	TCP_MAXSEG                        = 0x2
 	TCP_MAXWIN                        = 0xffff
 	TCP_MAX_SACK                      = 0x3
@@ -1298,11 +1506,15 @@
 	TCP_MSS                           = 0x200
 	TCP_NODELAY                       = 0x1
 	TCP_NOPUSH                        = 0x10
-	TCP_NSTATES                       = 0xb
+	TCP_SACKHOLE_LIMIT                = 0x80
 	TCP_SACK_ENABLE                   = 0x8
 	TCSAFLUSH                         = 0x2
+	TIMER_ABSTIME                     = 0x1
+	TIMER_RELTIME                     = 0x0
 	TIOCCBRK                          = 0x2000747a
 	TIOCCDTR                          = 0x20007478
+	TIOCCHKVERAUTH                    = 0x2000741e
+	TIOCCLRVERAUTH                    = 0x2000741d
 	TIOCCONS                          = 0x80047462
 	TIOCDRAIN                         = 0x2000745e
 	TIOCEXCL                          = 0x2000740d
@@ -1357,17 +1569,21 @@
 	TIOCSETAF                         = 0x802c7416
 	TIOCSETAW                         = 0x802c7415
 	TIOCSETD                          = 0x8004741b
+	TIOCSETVERAUTH                    = 0x8004741c
 	TIOCSFLAGS                        = 0x8004745c
 	TIOCSIG                           = 0x8004745f
 	TIOCSPGRP                         = 0x80047476
 	TIOCSTART                         = 0x2000746e
-	TIOCSTAT                          = 0x80047465
-	TIOCSTI                           = 0x80017472
+	TIOCSTAT                          = 0x20007465
 	TIOCSTOP                          = 0x2000746f
 	TIOCSTSTAMP                       = 0x8008745a
 	TIOCSWINSZ                        = 0x80087467
 	TIOCUCNTL                         = 0x80047466
+	TIOCUCNTL_CBRK                    = 0x7a
+	TIOCUCNTL_SBRK                    = 0x7b
 	TOSTOP                            = 0x400000
+	UTIME_NOW                         = -0x2
+	UTIME_OMIT                        = -0x1
 	VDISCARD                          = 0xf
 	VDSUSP                            = 0xb
 	VEOF                              = 0x0
@@ -1378,6 +1594,19 @@
 	VKILL                             = 0x5
 	VLNEXT                            = 0xe
 	VMIN                              = 0x10
+	VM_ANONMIN                        = 0x7
+	VM_LOADAVG                        = 0x2
+	VM_MALLOC_CONF                    = 0xc
+	VM_MAXID                          = 0xd
+	VM_MAXSLP                         = 0xa
+	VM_METER                          = 0x1
+	VM_NKMEMPAGES                     = 0x6
+	VM_PSSTRINGS                      = 0x3
+	VM_SWAPENCRYPT                    = 0x5
+	VM_USPACE                         = 0xb
+	VM_UVMEXP                         = 0x4
+	VM_VNODEMIN                       = 0x9
+	VM_VTEXTMIN                       = 0x8
 	VQUIT                             = 0x9
 	VREPRINT                          = 0x6
 	VSTART                            = 0xc
@@ -1390,8 +1619,8 @@
 	WCONTINUED                        = 0x8
 	WCOREFLAG                         = 0x80
 	WNOHANG                           = 0x1
-	WSTOPPED                          = 0x7f
 	WUNTRACED                         = 0x2
+	XCASE                             = 0x1000000
 )
 
 // Errors
@@ -1405,6 +1634,7 @@
 	EALREADY        = syscall.Errno(0x25)
 	EAUTH           = syscall.Errno(0x50)
 	EBADF           = syscall.Errno(0x9)
+	EBADMSG         = syscall.Errno(0x5c)
 	EBADRPC         = syscall.Errno(0x48)
 	EBUSY           = syscall.Errno(0x10)
 	ECANCELED       = syscall.Errno(0x58)
@@ -1431,7 +1661,7 @@
 	EIPSEC          = syscall.Errno(0x52)
 	EISCONN         = syscall.Errno(0x38)
 	EISDIR          = syscall.Errno(0x15)
-	ELAST           = syscall.Errno(0x5b)
+	ELAST           = syscall.Errno(0x5f)
 	ELOOP           = syscall.Errno(0x3e)
 	EMEDIUMTYPE     = syscall.Errno(0x56)
 	EMFILE          = syscall.Errno(0x18)
@@ -1459,12 +1689,14 @@
 	ENOTCONN        = syscall.Errno(0x39)
 	ENOTDIR         = syscall.Errno(0x14)
 	ENOTEMPTY       = syscall.Errno(0x42)
+	ENOTRECOVERABLE = syscall.Errno(0x5d)
 	ENOTSOCK        = syscall.Errno(0x26)
 	ENOTSUP         = syscall.Errno(0x5b)
 	ENOTTY          = syscall.Errno(0x19)
 	ENXIO           = syscall.Errno(0x6)
 	EOPNOTSUPP      = syscall.Errno(0x2d)
 	EOVERFLOW       = syscall.Errno(0x57)
+	EOWNERDEAD      = syscall.Errno(0x5e)
 	EPERM           = syscall.Errno(0x1)
 	EPFNOSUPPORT    = syscall.Errno(0x2e)
 	EPIPE           = syscall.Errno(0x20)
@@ -1472,6 +1704,7 @@
 	EPROCUNAVAIL    = syscall.Errno(0x4c)
 	EPROGMISMATCH   = syscall.Errno(0x4b)
 	EPROGUNAVAIL    = syscall.Errno(0x4a)
+	EPROTO          = syscall.Errno(0x5f)
 	EPROTONOSUPPORT = syscall.Errno(0x2b)
 	EPROTOTYPE      = syscall.Errno(0x29)
 	ERANGE          = syscall.Errno(0x22)
@@ -1568,7 +1801,7 @@
 	{32, "EPIPE", "broken pipe"},
 	{33, "EDOM", "numerical argument out of domain"},
 	{34, "ERANGE", "result too large"},
-	{35, "EWOULDBLOCK", "resource temporarily unavailable"},
+	{35, "EAGAIN", "resource temporarily unavailable"},
 	{36, "EINPROGRESS", "operation now in progress"},
 	{37, "EALREADY", "operation already in progress"},
 	{38, "ENOTSOCK", "socket operation on non-socket"},
@@ -1624,7 +1857,11 @@
 	{88, "ECANCELED", "operation canceled"},
 	{89, "EIDRM", "identifier removed"},
 	{90, "ENOMSG", "no message of desired type"},
-	{91, "ELAST", "not supported"},
+	{91, "ENOTSUP", "not supported"},
+	{92, "EBADMSG", "bad message"},
+	{93, "ENOTRECOVERABLE", "state not recoverable"},
+	{94, "EOWNERDEAD", "previous owner died"},
+	{95, "ELAST", "protocol error"},
 }
 
 // Signal table
@@ -1638,7 +1875,7 @@
 	{3, "SIGQUIT", "quit"},
 	{4, "SIGILL", "illegal instruction"},
 	{5, "SIGTRAP", "trace/BPT trap"},
-	{6, "SIGABRT", "abort trap"},
+	{6, "SIGIOT", "abort trap"},
 	{7, "SIGEMT", "EMT trap"},
 	{8, "SIGFPE", "floating point exception"},
 	{9, "SIGKILL", "killed"},
@@ -1665,4 +1902,5 @@
 	{30, "SIGUSR1", "user defined signal 1"},
 	{31, "SIGUSR2", "user defined signal 2"},
 	{32, "SIGTHR", "thread AST"},
+	{28672, "SIGSTKSZ", "unknown signal"},
 }
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_openbsd_amd64.go b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_openbsd_amd64.go
index 25cb609..6015fcb 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_openbsd_amd64.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_openbsd_amd64.go
@@ -109,6 +109,15 @@
 	BPF_DIRECTION_IN                  = 0x1
 	BPF_DIRECTION_OUT                 = 0x2
 	BPF_DIV                           = 0x30
+	BPF_FILDROP_CAPTURE               = 0x1
+	BPF_FILDROP_DROP                  = 0x2
+	BPF_FILDROP_PASS                  = 0x0
+	BPF_F_DIR_IN                      = 0x10
+	BPF_F_DIR_MASK                    = 0x30
+	BPF_F_DIR_OUT                     = 0x20
+	BPF_F_DIR_SHIFT                   = 0x4
+	BPF_F_FLOWID                      = 0x8
+	BPF_F_PRI_MASK                    = 0x7
 	BPF_H                             = 0x8
 	BPF_IMM                           = 0x0
 	BPF_IND                           = 0x40
@@ -137,6 +146,7 @@
 	BPF_OR                            = 0x40
 	BPF_RELEASE                       = 0x30bb6
 	BPF_RET                           = 0x6
+	BPF_RND                           = 0xc0
 	BPF_RSH                           = 0x70
 	BPF_ST                            = 0x2
 	BPF_STX                           = 0x3
@@ -177,7 +187,65 @@
 	CTL_KERN                          = 0x1
 	CTL_MAXNAME                       = 0xc
 	CTL_NET                           = 0x4
+	DIOCADDQUEUE                      = 0xc110445d
+	DIOCADDRULE                       = 0xcd604404
+	DIOCADDSTATE                      = 0xc1084425
+	DIOCCHANGERULE                    = 0xcd60441a
+	DIOCCLRIFFLAG                     = 0xc028445a
+	DIOCCLRSRCNODES                   = 0x20004455
+	DIOCCLRSTATES                     = 0xc0e04412
+	DIOCCLRSTATUS                     = 0xc0284416
+	DIOCGETLIMIT                      = 0xc0084427
+	DIOCGETQSTATS                     = 0xc1204460
+	DIOCGETQUEUE                      = 0xc110445f
+	DIOCGETQUEUES                     = 0xc110445e
+	DIOCGETRULE                       = 0xcd604407
+	DIOCGETRULES                      = 0xcd604406
+	DIOCGETRULESET                    = 0xc444443b
+	DIOCGETRULESETS                   = 0xc444443a
+	DIOCGETSRCNODES                   = 0xc0104454
+	DIOCGETSTATE                      = 0xc1084413
+	DIOCGETSTATES                     = 0xc0104419
+	DIOCGETSTATUS                     = 0xc1e84415
+	DIOCGETSYNFLWATS                  = 0xc0084463
+	DIOCGETTIMEOUT                    = 0xc008441e
+	DIOCIGETIFACES                    = 0xc0284457
+	DIOCKILLSRCNODES                  = 0xc080445b
+	DIOCKILLSTATES                    = 0xc0e04429
+	DIOCNATLOOK                       = 0xc0504417
+	DIOCOSFPADD                       = 0xc088444f
 	DIOCOSFPFLUSH                     = 0x2000444e
+	DIOCOSFPGET                       = 0xc0884450
+	DIOCRADDADDRS                     = 0xc4504443
+	DIOCRADDTABLES                    = 0xc450443d
+	DIOCRCLRADDRS                     = 0xc4504442
+	DIOCRCLRASTATS                    = 0xc4504448
+	DIOCRCLRTABLES                    = 0xc450443c
+	DIOCRCLRTSTATS                    = 0xc4504441
+	DIOCRDELADDRS                     = 0xc4504444
+	DIOCRDELTABLES                    = 0xc450443e
+	DIOCRGETADDRS                     = 0xc4504446
+	DIOCRGETASTATS                    = 0xc4504447
+	DIOCRGETTABLES                    = 0xc450443f
+	DIOCRGETTSTATS                    = 0xc4504440
+	DIOCRINADEFINE                    = 0xc450444d
+	DIOCRSETADDRS                     = 0xc4504445
+	DIOCRSETTFLAGS                    = 0xc450444a
+	DIOCRTSTADDRS                     = 0xc4504449
+	DIOCSETDEBUG                      = 0xc0044418
+	DIOCSETHOSTID                     = 0xc0044456
+	DIOCSETIFFLAG                     = 0xc0284459
+	DIOCSETLIMIT                      = 0xc0084428
+	DIOCSETREASS                      = 0xc004445c
+	DIOCSETSTATUSIF                   = 0xc0284414
+	DIOCSETSYNCOOKIES                 = 0xc0014462
+	DIOCSETSYNFLWATS                  = 0xc0084461
+	DIOCSETTIMEOUT                    = 0xc008441d
+	DIOCSTART                         = 0x20004401
+	DIOCSTOP                          = 0x20004402
+	DIOCXBEGIN                        = 0xc0104451
+	DIOCXCOMMIT                       = 0xc0104452
+	DIOCXROLLBACK                     = 0xc0104453
 	DLT_ARCNET                        = 0x7
 	DLT_ATM_RFC1483                   = 0xb
 	DLT_AX25                          = 0x3
@@ -240,6 +308,8 @@
 	EMUL_ENABLED                      = 0x1
 	EMUL_NATIVE                       = 0x2
 	ENDRUNDISC                        = 0x9
+	ETH64_8021_RSVD_MASK              = 0xfffffffffff0
+	ETH64_8021_RSVD_PREFIX            = 0x180c2000000
 	ETHERMIN                          = 0x2e
 	ETHERMTU                          = 0x5dc
 	ETHERTYPE_8023                    = 0x4
@@ -292,6 +362,7 @@
 	ETHERTYPE_DN                      = 0x6003
 	ETHERTYPE_DOGFIGHT                = 0x1989
 	ETHERTYPE_DSMD                    = 0x8039
+	ETHERTYPE_EAPOL                   = 0x888e
 	ETHERTYPE_ECMA                    = 0x803
 	ETHERTYPE_ENCRYPT                 = 0x803d
 	ETHERTYPE_ES                      = 0x805d
@@ -323,6 +394,7 @@
 	ETHERTYPE_LLDP                    = 0x88cc
 	ETHERTYPE_LOGICRAFT               = 0x8148
 	ETHERTYPE_LOOPBACK                = 0x9000
+	ETHERTYPE_MACSEC                  = 0x88e5
 	ETHERTYPE_MATRA                   = 0x807a
 	ETHERTYPE_MAX                     = 0xffff
 	ETHERTYPE_MERIT                   = 0x807c
@@ -351,15 +423,17 @@
 	ETHERTYPE_NCD                     = 0x8149
 	ETHERTYPE_NESTAR                  = 0x8006
 	ETHERTYPE_NETBEUI                 = 0x8191
+	ETHERTYPE_NHRP                    = 0x2001
 	ETHERTYPE_NOVELL                  = 0x8138
 	ETHERTYPE_NS                      = 0x600
 	ETHERTYPE_NSAT                    = 0x601
 	ETHERTYPE_NSCOMPAT                = 0x807
+	ETHERTYPE_NSH                     = 0x984f
 	ETHERTYPE_NTRAILER                = 0x10
 	ETHERTYPE_OS9                     = 0x7007
 	ETHERTYPE_OS9NET                  = 0x7009
 	ETHERTYPE_PACER                   = 0x80c6
-	ETHERTYPE_PAE                     = 0x888e
+	ETHERTYPE_PBB                     = 0x88e7
 	ETHERTYPE_PCS                     = 0x4242
 	ETHERTYPE_PLANNING                = 0x8044
 	ETHERTYPE_PPP                     = 0x880b
@@ -441,10 +515,11 @@
 	ETHER_VLAN_ENCAP_LEN              = 0x4
 	EVFILT_AIO                        = -0x3
 	EVFILT_DEVICE                     = -0x8
+	EVFILT_EXCEPT                     = -0x9
 	EVFILT_PROC                       = -0x5
 	EVFILT_READ                       = -0x1
 	EVFILT_SIGNAL                     = -0x6
-	EVFILT_SYSCOUNT                   = 0x8
+	EVFILT_SYSCOUNT                   = 0x9
 	EVFILT_TIMER                      = -0x7
 	EVFILT_VNODE                      = -0x4
 	EVFILT_WRITE                      = -0x2
@@ -466,7 +541,7 @@
 	EV_FLAG1                          = 0x2000
 	EV_ONESHOT                        = 0x10
 	EV_RECEIPT                        = 0x40
-	EV_SYSFLAGS                       = 0xf000
+	EV_SYSFLAGS                       = 0xf800
 	EXTA                              = 0x4b00
 	EXTB                              = 0x9600
 	EXTPROC                           = 0x800
@@ -732,6 +807,7 @@
 	IFT_VOICEOVERCABLE                = 0xc6
 	IFT_VOICEOVERFRAMERELAY           = 0x99
 	IFT_VOICEOVERIP                   = 0x68
+	IFT_WIREGUARD                     = 0xfb
 	IFT_X213                          = 0x5d
 	IFT_X25                           = 0x5
 	IFT_X25DDN                        = 0x4
@@ -797,9 +873,11 @@
 	IPPROTO_RAW                       = 0xff
 	IPPROTO_ROUTING                   = 0x2b
 	IPPROTO_RSVP                      = 0x2e
+	IPPROTO_SCTP                      = 0x84
 	IPPROTO_TCP                       = 0x6
 	IPPROTO_TP                        = 0x1d
 	IPPROTO_UDP                       = 0x11
+	IPPROTO_UDPLITE                   = 0x88
 	IPV6_AUTH_LEVEL                   = 0x35
 	IPV6_AUTOFLOWLABEL                = 0x3b
 	IPV6_CHECKSUM                     = 0x1a
@@ -906,6 +984,9 @@
 	IP_TTL                            = 0x4
 	ISIG                              = 0x80
 	ISTRIP                            = 0x20
+	ITIMER_PROF                       = 0x2
+	ITIMER_REAL                       = 0x0
+	ITIMER_VIRTUAL                    = 0x1
 	IUCLC                             = 0x1000
 	IXANY                             = 0x800
 	IXOFF                             = 0x400
@@ -970,12 +1051,26 @@
 	MNT_ROOTFS                        = 0x4000
 	MNT_SOFTDEP                       = 0x4000000
 	MNT_STALLED                       = 0x100000
+	MNT_SWAPPABLE                     = 0x200000
 	MNT_SYNCHRONOUS                   = 0x2
 	MNT_UPDATE                        = 0x10000
 	MNT_VISFLAGMASK                   = 0x400ffff
 	MNT_WAIT                          = 0x1
 	MNT_WANTRDWR                      = 0x2000000
 	MNT_WXALLOWED                     = 0x800
+	MOUNT_AFS                         = "afs"
+	MOUNT_CD9660                      = "cd9660"
+	MOUNT_EXT2FS                      = "ext2fs"
+	MOUNT_FFS                         = "ffs"
+	MOUNT_FUSEFS                      = "fuse"
+	MOUNT_MFS                         = "mfs"
+	MOUNT_MSDOS                       = "msdos"
+	MOUNT_NCPFS                       = "ncpfs"
+	MOUNT_NFS                         = "nfs"
+	MOUNT_NTFS                        = "ntfs"
+	MOUNT_TMPFS                       = "tmpfs"
+	MOUNT_UDF                         = "udf"
+	MOUNT_UFS                         = "ffs"
 	MSG_BCAST                         = 0x100
 	MSG_CMSG_CLOEXEC                  = 0x800
 	MSG_CTRUNC                        = 0x20
@@ -988,6 +1083,7 @@
 	MSG_PEEK                          = 0x2
 	MSG_TRUNC                         = 0x10
 	MSG_WAITALL                       = 0x40
+	MSG_WAITFORONE                    = 0x1000
 	MS_ASYNC                          = 0x1
 	MS_INVALIDATE                     = 0x4
 	MS_SYNC                           = 0x2
@@ -996,7 +1092,8 @@
 	NET_RT_FLAGS                      = 0x2
 	NET_RT_IFLIST                     = 0x3
 	NET_RT_IFNAMES                    = 0x6
-	NET_RT_MAXID                      = 0x7
+	NET_RT_MAXID                      = 0x8
+	NET_RT_SOURCE                     = 0x7
 	NET_RT_STATS                      = 0x4
 	NET_RT_TABLE                      = 0x5
 	NFDBITS                           = 0x20
@@ -1013,6 +1110,7 @@
 	NOTE_FORK                         = 0x40000000
 	NOTE_LINK                         = 0x10
 	NOTE_LOWAT                        = 0x1
+	NOTE_OOB                          = 0x4
 	NOTE_PCTRLMASK                    = 0xf0000000
 	NOTE_PDATAMASK                    = 0xfffff
 	NOTE_RENAME                       = 0x20
@@ -1130,9 +1228,11 @@
 	RTF_STATIC                        = 0x800
 	RTF_UP                            = 0x1
 	RTF_USETRAILERS                   = 0x8000
+	RTM_80211INFO                     = 0x15
 	RTM_ADD                           = 0x1
 	RTM_BFD                           = 0x12
 	RTM_CHANGE                        = 0x3
+	RTM_CHGADDRATTR                   = 0x14
 	RTM_DELADDR                       = 0xd
 	RTM_DELETE                        = 0x2
 	RTM_DESYNC                        = 0x10
@@ -1140,7 +1240,6 @@
 	RTM_IFANNOUNCE                    = 0xf
 	RTM_IFINFO                        = 0xe
 	RTM_INVALIDATE                    = 0x11
-	RTM_LOCK                          = 0x8
 	RTM_LOSING                        = 0x5
 	RTM_MAXSIZE                       = 0x800
 	RTM_MISS                          = 0x7
@@ -1148,7 +1247,7 @@
 	RTM_PROPOSAL                      = 0x13
 	RTM_REDIRECT                      = 0x6
 	RTM_RESOLVE                       = 0xb
-	RTM_RTTUNIT                       = 0xf4240
+	RTM_SOURCE                        = 0x16
 	RTM_VERSION                       = 0x5
 	RTV_EXPIRE                        = 0x4
 	RTV_HOPCOUNT                      = 0x2
@@ -1166,6 +1265,9 @@
 	RUSAGE_THREAD                     = 0x1
 	SCM_RIGHTS                        = 0x1
 	SCM_TIMESTAMP                     = 0x4
+	SEEK_CUR                          = 0x1
+	SEEK_END                          = 0x2
+	SEEK_SET                          = 0x0
 	SHUT_RD                           = 0x0
 	SHUT_RDWR                         = 0x2
 	SHUT_WR                           = 0x1
@@ -1182,35 +1284,37 @@
 	SIOCBRDGDELS                      = 0x80606942
 	SIOCBRDGFLUSH                     = 0x80606948
 	SIOCBRDGFRL                       = 0x808c694e
-	SIOCBRDGGCACHE                    = 0xc0186941
-	SIOCBRDGGFD                       = 0xc0186952
-	SIOCBRDGGHT                       = 0xc0186951
+	SIOCBRDGGCACHE                    = 0xc0146941
+	SIOCBRDGGFD                       = 0xc0146952
+	SIOCBRDGGHT                       = 0xc0146951
 	SIOCBRDGGIFFLGS                   = 0xc060693e
-	SIOCBRDGGMA                       = 0xc0186953
+	SIOCBRDGGMA                       = 0xc0146953
 	SIOCBRDGGPARAM                    = 0xc0406958
-	SIOCBRDGGPRI                      = 0xc0186950
+	SIOCBRDGGPRI                      = 0xc0146950
 	SIOCBRDGGRL                       = 0xc030694f
-	SIOCBRDGGTO                       = 0xc0186946
+	SIOCBRDGGTO                       = 0xc0146946
 	SIOCBRDGIFS                       = 0xc0606942
 	SIOCBRDGRTS                       = 0xc0206943
 	SIOCBRDGSADDR                     = 0xc1286944
-	SIOCBRDGSCACHE                    = 0x80186940
-	SIOCBRDGSFD                       = 0x80186952
-	SIOCBRDGSHT                       = 0x80186951
+	SIOCBRDGSCACHE                    = 0x80146940
+	SIOCBRDGSFD                       = 0x80146952
+	SIOCBRDGSHT                       = 0x80146951
 	SIOCBRDGSIFCOST                   = 0x80606955
 	SIOCBRDGSIFFLGS                   = 0x8060693f
 	SIOCBRDGSIFPRIO                   = 0x80606954
 	SIOCBRDGSIFPROT                   = 0x8060694a
-	SIOCBRDGSMA                       = 0x80186953
-	SIOCBRDGSPRI                      = 0x80186950
-	SIOCBRDGSPROTO                    = 0x8018695a
-	SIOCBRDGSTO                       = 0x80186945
-	SIOCBRDGSTXHC                     = 0x80186959
+	SIOCBRDGSMA                       = 0x80146953
+	SIOCBRDGSPRI                      = 0x80146950
+	SIOCBRDGSPROTO                    = 0x8014695a
+	SIOCBRDGSTO                       = 0x80146945
+	SIOCBRDGSTXHC                     = 0x80146959
+	SIOCDELLABEL                      = 0x80206997
 	SIOCDELMULTI                      = 0x80206932
 	SIOCDIFADDR                       = 0x80206919
 	SIOCDIFGROUP                      = 0x80286989
 	SIOCDIFPARENT                     = 0x802069b4
 	SIOCDIFPHYADDR                    = 0x80206949
+	SIOCDPWE3NEIGHBOR                 = 0x802069de
 	SIOCDVNETID                       = 0x802069af
 	SIOCGETKALIVE                     = 0xc01869a4
 	SIOCGETLABEL                      = 0x8020699a
@@ -1229,6 +1333,7 @@
 	SIOCGIFFLAGS                      = 0xc0206911
 	SIOCGIFGATTR                      = 0xc028698b
 	SIOCGIFGENERIC                    = 0xc020693a
+	SIOCGIFGLIST                      = 0xc028698d
 	SIOCGIFGMEMB                      = 0xc028698a
 	SIOCGIFGROUP                      = 0xc0286988
 	SIOCGIFHARDMTU                    = 0xc02069a5
@@ -1243,13 +1348,21 @@
 	SIOCGIFRDOMAIN                    = 0xc02069a0
 	SIOCGIFRTLABEL                    = 0xc0206983
 	SIOCGIFRXR                        = 0x802069aa
+	SIOCGIFSFFPAGE                    = 0xc1126939
 	SIOCGIFXFLAGS                     = 0xc020699e
 	SIOCGLIFPHYADDR                   = 0xc218694b
 	SIOCGLIFPHYDF                     = 0xc02069c2
+	SIOCGLIFPHYECN                    = 0xc02069c8
 	SIOCGLIFPHYRTABLE                 = 0xc02069a2
 	SIOCGLIFPHYTTL                    = 0xc02069a9
 	SIOCGPGRP                         = 0x40047309
+	SIOCGPWE3                         = 0xc0206998
+	SIOCGPWE3CTRLWORD                 = 0xc02069dc
+	SIOCGPWE3FAT                      = 0xc02069dd
+	SIOCGPWE3NEIGHBOR                 = 0xc21869de
+	SIOCGRXHPRIO                      = 0xc02069db
 	SIOCGSPPPPARAMS                   = 0xc0206994
+	SIOCGTXHPRIO                      = 0xc02069c6
 	SIOCGUMBINFO                      = 0xc02069be
 	SIOCGUMBPARAM                     = 0xc02069c0
 	SIOCGVH                           = 0xc02069f6
@@ -1287,19 +1400,20 @@
 	SIOCSIFXFLAGS                     = 0x8020699d
 	SIOCSLIFPHYADDR                   = 0x8218694a
 	SIOCSLIFPHYDF                     = 0x802069c1
+	SIOCSLIFPHYECN                    = 0x802069c7
 	SIOCSLIFPHYRTABLE                 = 0x802069a1
 	SIOCSLIFPHYTTL                    = 0x802069a8
 	SIOCSPGRP                         = 0x80047308
+	SIOCSPWE3CTRLWORD                 = 0x802069dc
+	SIOCSPWE3FAT                      = 0x802069dd
+	SIOCSPWE3NEIGHBOR                 = 0x821869de
+	SIOCSRXHPRIO                      = 0x802069db
 	SIOCSSPPPPARAMS                   = 0x80206993
+	SIOCSTXHPRIO                      = 0x802069c5
 	SIOCSUMBPARAM                     = 0x802069bf
 	SIOCSVH                           = 0xc02069f5
 	SIOCSVNETFLOWID                   = 0x802069c3
 	SIOCSVNETID                       = 0x802069a6
-	SIOCSWGDPID                       = 0xc018695b
-	SIOCSWGMAXFLOW                    = 0xc0186960
-	SIOCSWGMAXGROUP                   = 0xc018695d
-	SIOCSWSDPID                       = 0x8018695c
-	SIOCSWSPORTNO                     = 0xc060695f
 	SOCK_CLOEXEC                      = 0x8000
 	SOCK_DGRAM                        = 0x2
 	SOCK_DNS                          = 0x1000
@@ -1314,6 +1428,7 @@
 	SO_BINDANY                        = 0x1000
 	SO_BROADCAST                      = 0x20
 	SO_DEBUG                          = 0x1
+	SO_DOMAIN                         = 0x1024
 	SO_DONTROUTE                      = 0x10
 	SO_ERROR                          = 0x1007
 	SO_KEEPALIVE                      = 0x8
@@ -1321,6 +1436,7 @@
 	SO_NETPROC                        = 0x1020
 	SO_OOBINLINE                      = 0x100
 	SO_PEERCRED                       = 0x1022
+	SO_PROTOCOL                       = 0x1025
 	SO_RCVBUF                         = 0x1002
 	SO_RCVLOWAT                       = 0x1004
 	SO_RCVTIMEO                       = 0x1006
@@ -1370,7 +1486,18 @@
 	TCOFLUSH                          = 0x2
 	TCOOFF                            = 0x1
 	TCOON                             = 0x2
-	TCP_MAXBURST                      = 0x4
+	TCPOPT_EOL                        = 0x0
+	TCPOPT_MAXSEG                     = 0x2
+	TCPOPT_NOP                        = 0x1
+	TCPOPT_SACK                       = 0x5
+	TCPOPT_SACK_HDR                   = 0x1010500
+	TCPOPT_SACK_PERMITTED             = 0x4
+	TCPOPT_SACK_PERMIT_HDR            = 0x1010402
+	TCPOPT_SIGNATURE                  = 0x13
+	TCPOPT_TIMESTAMP                  = 0x8
+	TCPOPT_TSTAMP_HDR                 = 0x101080a
+	TCPOPT_WINDOW                     = 0x3
+	TCP_INFO                          = 0x9
 	TCP_MAXSEG                        = 0x2
 	TCP_MAXWIN                        = 0xffff
 	TCP_MAX_SACK                      = 0x3
@@ -1379,8 +1506,11 @@
 	TCP_MSS                           = 0x200
 	TCP_NODELAY                       = 0x1
 	TCP_NOPUSH                        = 0x10
+	TCP_SACKHOLE_LIMIT                = 0x80
 	TCP_SACK_ENABLE                   = 0x8
 	TCSAFLUSH                         = 0x2
+	TIMER_ABSTIME                     = 0x1
+	TIMER_RELTIME                     = 0x0
 	TIOCCBRK                          = 0x2000747a
 	TIOCCDTR                          = 0x20007478
 	TIOCCHKVERAUTH                    = 0x2000741e
@@ -1445,7 +1575,6 @@
 	TIOCSPGRP                         = 0x80047476
 	TIOCSTART                         = 0x2000746e
 	TIOCSTAT                          = 0x20007465
-	TIOCSTI                           = 0x80017472
 	TIOCSTOP                          = 0x2000746f
 	TIOCSTSTAMP                       = 0x8008745a
 	TIOCSWINSZ                        = 0x80087467
@@ -1467,7 +1596,8 @@
 	VMIN                              = 0x10
 	VM_ANONMIN                        = 0x7
 	VM_LOADAVG                        = 0x2
-	VM_MAXID                          = 0xc
+	VM_MALLOC_CONF                    = 0xc
+	VM_MAXID                          = 0xd
 	VM_MAXSLP                         = 0xa
 	VM_METER                          = 0x1
 	VM_NKMEMPAGES                     = 0x6
@@ -1745,7 +1875,7 @@
 	{3, "SIGQUIT", "quit"},
 	{4, "SIGILL", "illegal instruction"},
 	{5, "SIGTRAP", "trace/BPT trap"},
-	{6, "SIGABRT", "abort trap"},
+	{6, "SIGIOT", "abort trap"},
 	{7, "SIGEMT", "EMT trap"},
 	{8, "SIGFPE", "floating point exception"},
 	{9, "SIGKILL", "killed"},
@@ -1772,4 +1902,5 @@
 	{30, "SIGUSR1", "user defined signal 1"},
 	{31, "SIGUSR2", "user defined signal 2"},
 	{32, "SIGTHR", "thread AST"},
+	{28672, "SIGSTKSZ", "unknown signal"},
 }
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go
index aef6c08..8d44955 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go
@@ -46,6 +46,7 @@
 	AF_SNA                            = 0xb
 	AF_UNIX                           = 0x1
 	AF_UNSPEC                         = 0x0
+	ALTWERASE                         = 0x200
 	ARPHRD_ETHER                      = 0x1
 	ARPHRD_FRELAY                     = 0xf
 	ARPHRD_IEEE1394                   = 0x18
@@ -82,7 +83,7 @@
 	BIOCGFILDROP                      = 0x40044278
 	BIOCGHDRCMPLT                     = 0x40044274
 	BIOCGRSIG                         = 0x40044273
-	BIOCGRTIMEOUT                     = 0x400c426e
+	BIOCGRTIMEOUT                     = 0x4010426e
 	BIOCGSTATS                        = 0x4008426f
 	BIOCIMMEDIATE                     = 0x80044270
 	BIOCLOCK                          = 0x20004276
@@ -96,7 +97,7 @@
 	BIOCSFILDROP                      = 0x80044279
 	BIOCSHDRCMPLT                     = 0x80044275
 	BIOCSRSIG                         = 0x80044272
-	BIOCSRTIMEOUT                     = 0x800c426d
+	BIOCSRTIMEOUT                     = 0x8010426d
 	BIOCVERSION                       = 0x40044271
 	BPF_A                             = 0x10
 	BPF_ABS                           = 0x20
@@ -108,6 +109,15 @@
 	BPF_DIRECTION_IN                  = 0x1
 	BPF_DIRECTION_OUT                 = 0x2
 	BPF_DIV                           = 0x30
+	BPF_FILDROP_CAPTURE               = 0x1
+	BPF_FILDROP_DROP                  = 0x2
+	BPF_FILDROP_PASS                  = 0x0
+	BPF_F_DIR_IN                      = 0x10
+	BPF_F_DIR_MASK                    = 0x30
+	BPF_F_DIR_OUT                     = 0x20
+	BPF_F_DIR_SHIFT                   = 0x4
+	BPF_F_FLOWID                      = 0x8
+	BPF_F_PRI_MASK                    = 0x7
 	BPF_H                             = 0x8
 	BPF_IMM                           = 0x0
 	BPF_IND                           = 0x40
@@ -136,6 +146,7 @@
 	BPF_OR                            = 0x40
 	BPF_RELEASE                       = 0x30bb6
 	BPF_RET                           = 0x6
+	BPF_RND                           = 0xc0
 	BPF_RSH                           = 0x70
 	BPF_ST                            = 0x2
 	BPF_STX                           = 0x3
@@ -147,6 +158,12 @@
 	BRKINT                            = 0x2
 	CFLUSH                            = 0xf
 	CLOCAL                            = 0x8000
+	CLOCK_BOOTTIME                    = 0x6
+	CLOCK_MONOTONIC                   = 0x3
+	CLOCK_PROCESS_CPUTIME_ID          = 0x2
+	CLOCK_REALTIME                    = 0x0
+	CLOCK_THREAD_CPUTIME_ID           = 0x4
+	CLOCK_UPTIME                      = 0x5
 	CPUSTATES                         = 0x6
 	CP_IDLE                           = 0x5
 	CP_INTR                           = 0x4
@@ -170,7 +187,65 @@
 	CTL_KERN                          = 0x1
 	CTL_MAXNAME                       = 0xc
 	CTL_NET                           = 0x4
+	DIOCADDQUEUE                      = 0xc100445d
+	DIOCADDRULE                       = 0xcce04404
+	DIOCADDSTATE                      = 0xc1084425
+	DIOCCHANGERULE                    = 0xcce0441a
+	DIOCCLRIFFLAG                     = 0xc024445a
+	DIOCCLRSRCNODES                   = 0x20004455
+	DIOCCLRSTATES                     = 0xc0d04412
+	DIOCCLRSTATUS                     = 0xc0244416
+	DIOCGETLIMIT                      = 0xc0084427
+	DIOCGETQSTATS                     = 0xc1084460
+	DIOCGETQUEUE                      = 0xc100445f
+	DIOCGETQUEUES                     = 0xc100445e
+	DIOCGETRULE                       = 0xcce04407
+	DIOCGETRULES                      = 0xcce04406
+	DIOCGETRULESET                    = 0xc444443b
+	DIOCGETRULESETS                   = 0xc444443a
+	DIOCGETSRCNODES                   = 0xc0084454
+	DIOCGETSTATE                      = 0xc1084413
+	DIOCGETSTATES                     = 0xc0084419
+	DIOCGETSTATUS                     = 0xc1e84415
+	DIOCGETSYNFLWATS                  = 0xc0084463
+	DIOCGETTIMEOUT                    = 0xc008441e
+	DIOCIGETIFACES                    = 0xc0244457
+	DIOCKILLSRCNODES                  = 0xc068445b
+	DIOCKILLSTATES                    = 0xc0d04429
+	DIOCNATLOOK                       = 0xc0504417
+	DIOCOSFPADD                       = 0xc088444f
 	DIOCOSFPFLUSH                     = 0x2000444e
+	DIOCOSFPGET                       = 0xc0884450
+	DIOCRADDADDRS                     = 0xc44c4443
+	DIOCRADDTABLES                    = 0xc44c443d
+	DIOCRCLRADDRS                     = 0xc44c4442
+	DIOCRCLRASTATS                    = 0xc44c4448
+	DIOCRCLRTABLES                    = 0xc44c443c
+	DIOCRCLRTSTATS                    = 0xc44c4441
+	DIOCRDELADDRS                     = 0xc44c4444
+	DIOCRDELTABLES                    = 0xc44c443e
+	DIOCRGETADDRS                     = 0xc44c4446
+	DIOCRGETASTATS                    = 0xc44c4447
+	DIOCRGETTABLES                    = 0xc44c443f
+	DIOCRGETTSTATS                    = 0xc44c4440
+	DIOCRINADEFINE                    = 0xc44c444d
+	DIOCRSETADDRS                     = 0xc44c4445
+	DIOCRSETTFLAGS                    = 0xc44c444a
+	DIOCRTSTADDRS                     = 0xc44c4449
+	DIOCSETDEBUG                      = 0xc0044418
+	DIOCSETHOSTID                     = 0xc0044456
+	DIOCSETIFFLAG                     = 0xc0244459
+	DIOCSETLIMIT                      = 0xc0084428
+	DIOCSETREASS                      = 0xc004445c
+	DIOCSETSTATUSIF                   = 0xc0244414
+	DIOCSETSYNCOOKIES                 = 0xc0014462
+	DIOCSETSYNFLWATS                  = 0xc0084461
+	DIOCSETTIMEOUT                    = 0xc008441d
+	DIOCSTART                         = 0x20004401
+	DIOCSTOP                          = 0x20004402
+	DIOCXBEGIN                        = 0xc00c4451
+	DIOCXCOMMIT                       = 0xc00c4452
+	DIOCXROLLBACK                     = 0xc00c4453
 	DLT_ARCNET                        = 0x7
 	DLT_ATM_RFC1483                   = 0xb
 	DLT_AX25                          = 0x3
@@ -186,6 +261,7 @@
 	DLT_LOOP                          = 0xc
 	DLT_MPLS                          = 0xdb
 	DLT_NULL                          = 0x0
+	DLT_OPENFLOW                      = 0x10b
 	DLT_PFLOG                         = 0x75
 	DLT_PFSYNC                        = 0x12
 	DLT_PPP                           = 0x9
@@ -196,6 +272,23 @@
 	DLT_RAW                           = 0xe
 	DLT_SLIP                          = 0x8
 	DLT_SLIP_BSDOS                    = 0xf
+	DLT_USBPCAP                       = 0xf9
+	DLT_USER0                         = 0x93
+	DLT_USER1                         = 0x94
+	DLT_USER10                        = 0x9d
+	DLT_USER11                        = 0x9e
+	DLT_USER12                        = 0x9f
+	DLT_USER13                        = 0xa0
+	DLT_USER14                        = 0xa1
+	DLT_USER15                        = 0xa2
+	DLT_USER2                         = 0x95
+	DLT_USER3                         = 0x96
+	DLT_USER4                         = 0x97
+	DLT_USER5                         = 0x98
+	DLT_USER6                         = 0x99
+	DLT_USER7                         = 0x9a
+	DLT_USER8                         = 0x9b
+	DLT_USER9                         = 0x9c
 	DT_BLK                            = 0x6
 	DT_CHR                            = 0x2
 	DT_DIR                            = 0x4
@@ -215,6 +308,8 @@
 	EMUL_ENABLED                      = 0x1
 	EMUL_NATIVE                       = 0x2
 	ENDRUNDISC                        = 0x9
+	ETH64_8021_RSVD_MASK              = 0xfffffffffff0
+	ETH64_8021_RSVD_PREFIX            = 0x180c2000000
 	ETHERMIN                          = 0x2e
 	ETHERMTU                          = 0x5dc
 	ETHERTYPE_8023                    = 0x4
@@ -267,6 +362,7 @@
 	ETHERTYPE_DN                      = 0x6003
 	ETHERTYPE_DOGFIGHT                = 0x1989
 	ETHERTYPE_DSMD                    = 0x8039
+	ETHERTYPE_EAPOL                   = 0x888e
 	ETHERTYPE_ECMA                    = 0x803
 	ETHERTYPE_ENCRYPT                 = 0x803d
 	ETHERTYPE_ES                      = 0x805d
@@ -298,6 +394,7 @@
 	ETHERTYPE_LLDP                    = 0x88cc
 	ETHERTYPE_LOGICRAFT               = 0x8148
 	ETHERTYPE_LOOPBACK                = 0x9000
+	ETHERTYPE_MACSEC                  = 0x88e5
 	ETHERTYPE_MATRA                   = 0x807a
 	ETHERTYPE_MAX                     = 0xffff
 	ETHERTYPE_MERIT                   = 0x807c
@@ -326,15 +423,17 @@
 	ETHERTYPE_NCD                     = 0x8149
 	ETHERTYPE_NESTAR                  = 0x8006
 	ETHERTYPE_NETBEUI                 = 0x8191
+	ETHERTYPE_NHRP                    = 0x2001
 	ETHERTYPE_NOVELL                  = 0x8138
 	ETHERTYPE_NS                      = 0x600
 	ETHERTYPE_NSAT                    = 0x601
 	ETHERTYPE_NSCOMPAT                = 0x807
+	ETHERTYPE_NSH                     = 0x984f
 	ETHERTYPE_NTRAILER                = 0x10
 	ETHERTYPE_OS9                     = 0x7007
 	ETHERTYPE_OS9NET                  = 0x7009
 	ETHERTYPE_PACER                   = 0x80c6
-	ETHERTYPE_PAE                     = 0x888e
+	ETHERTYPE_PBB                     = 0x88e7
 	ETHERTYPE_PCS                     = 0x4242
 	ETHERTYPE_PLANNING                = 0x8044
 	ETHERTYPE_PPP                     = 0x880b
@@ -409,28 +508,40 @@
 	ETHER_CRC_POLY_LE                 = 0xedb88320
 	ETHER_HDR_LEN                     = 0xe
 	ETHER_MAX_DIX_LEN                 = 0x600
+	ETHER_MAX_HARDMTU_LEN             = 0xff9b
 	ETHER_MAX_LEN                     = 0x5ee
 	ETHER_MIN_LEN                     = 0x40
 	ETHER_TYPE_LEN                    = 0x2
 	ETHER_VLAN_ENCAP_LEN              = 0x4
 	EVFILT_AIO                        = -0x3
+	EVFILT_DEVICE                     = -0x8
+	EVFILT_EXCEPT                     = -0x9
 	EVFILT_PROC                       = -0x5
 	EVFILT_READ                       = -0x1
 	EVFILT_SIGNAL                     = -0x6
-	EVFILT_SYSCOUNT                   = 0x7
+	EVFILT_SYSCOUNT                   = 0x9
 	EVFILT_TIMER                      = -0x7
 	EVFILT_VNODE                      = -0x4
 	EVFILT_WRITE                      = -0x2
+	EVL_ENCAPLEN                      = 0x4
+	EVL_PRIO_BITS                     = 0xd
+	EVL_PRIO_MAX                      = 0x7
+	EVL_VLID_MASK                     = 0xfff
+	EVL_VLID_MAX                      = 0xffe
+	EVL_VLID_MIN                      = 0x1
+	EVL_VLID_NULL                     = 0x0
 	EV_ADD                            = 0x1
 	EV_CLEAR                          = 0x20
 	EV_DELETE                         = 0x2
 	EV_DISABLE                        = 0x8
+	EV_DISPATCH                       = 0x80
 	EV_ENABLE                         = 0x4
 	EV_EOF                            = 0x8000
 	EV_ERROR                          = 0x4000
 	EV_FLAG1                          = 0x2000
 	EV_ONESHOT                        = 0x10
-	EV_SYSFLAGS                       = 0xf000
+	EV_RECEIPT                        = 0x40
+	EV_SYSFLAGS                       = 0xf800
 	EXTA                              = 0x4b00
 	EXTB                              = 0x9600
 	EXTPROC                           = 0x800
@@ -443,6 +554,8 @@
 	F_GETFL                           = 0x3
 	F_GETLK                           = 0x7
 	F_GETOWN                          = 0x5
+	F_ISATTY                          = 0xb
+	F_OK                              = 0x0
 	F_RDLCK                           = 0x1
 	F_SETFD                           = 0x2
 	F_SETFL                           = 0x4
@@ -459,7 +572,6 @@
 	IEXTEN                            = 0x400
 	IFAN_ARRIVAL                      = 0x0
 	IFAN_DEPARTURE                    = 0x1
-	IFA_ROUTE                         = 0x1
 	IFF_ALLMULTI                      = 0x200
 	IFF_BROADCAST                     = 0x2
 	IFF_CANTCHANGE                    = 0x8e52
@@ -470,12 +582,12 @@
 	IFF_LOOPBACK                      = 0x8
 	IFF_MULTICAST                     = 0x8000
 	IFF_NOARP                         = 0x80
-	IFF_NOTRAILERS                    = 0x20
 	IFF_OACTIVE                       = 0x400
 	IFF_POINTOPOINT                   = 0x10
 	IFF_PROMISC                       = 0x100
 	IFF_RUNNING                       = 0x40
 	IFF_SIMPLEX                       = 0x800
+	IFF_STATICARP                     = 0x20
 	IFF_UP                            = 0x1
 	IFNAMSIZ                          = 0x10
 	IFT_1822                          = 0x2
@@ -604,6 +716,7 @@
 	IFT_LINEGROUP                     = 0xd2
 	IFT_LOCALTALK                     = 0x2a
 	IFT_LOOP                          = 0x18
+	IFT_MBIM                          = 0xfa
 	IFT_MEDIAMAILOVERIP               = 0x8b
 	IFT_MFSIGLINK                     = 0xa7
 	IFT_MIOX25                        = 0x26
@@ -694,6 +807,7 @@
 	IFT_VOICEOVERCABLE                = 0xc6
 	IFT_VOICEOVERFRAMERELAY           = 0x99
 	IFT_VOICEOVERIP                   = 0x68
+	IFT_WIREGUARD                     = 0xfb
 	IFT_X213                          = 0x5d
 	IFT_X25                           = 0x5
 	IFT_X25DDN                        = 0x4
@@ -728,8 +842,6 @@
 	IPPROTO_AH                        = 0x33
 	IPPROTO_CARP                      = 0x70
 	IPPROTO_DIVERT                    = 0x102
-	IPPROTO_DIVERT_INIT               = 0x2
-	IPPROTO_DIVERT_RESP               = 0x1
 	IPPROTO_DONE                      = 0x101
 	IPPROTO_DSTOPTS                   = 0x3c
 	IPPROTO_EGP                       = 0x8
@@ -761,9 +873,11 @@
 	IPPROTO_RAW                       = 0xff
 	IPPROTO_ROUTING                   = 0x2b
 	IPPROTO_RSVP                      = 0x2e
+	IPPROTO_SCTP                      = 0x84
 	IPPROTO_TCP                       = 0x6
 	IPPROTO_TP                        = 0x1d
 	IPPROTO_UDP                       = 0x11
+	IPPROTO_UDPLITE                   = 0x88
 	IPV6_AUTH_LEVEL                   = 0x35
 	IPV6_AUTOFLOWLABEL                = 0x3b
 	IPV6_CHECKSUM                     = 0x1a
@@ -786,6 +900,7 @@
 	IPV6_LEAVE_GROUP                  = 0xd
 	IPV6_MAXHLIM                      = 0xff
 	IPV6_MAXPACKET                    = 0xffff
+	IPV6_MINHOPCOUNT                  = 0x41
 	IPV6_MMTU                         = 0x500
 	IPV6_MULTICAST_HOPS               = 0xa
 	IPV6_MULTICAST_IF                 = 0x9
@@ -825,12 +940,12 @@
 	IP_DEFAULT_MULTICAST_LOOP         = 0x1
 	IP_DEFAULT_MULTICAST_TTL          = 0x1
 	IP_DF                             = 0x4000
-	IP_DIVERTFL                       = 0x1022
 	IP_DROP_MEMBERSHIP                = 0xd
 	IP_ESP_NETWORK_LEVEL              = 0x16
 	IP_ESP_TRANS_LEVEL                = 0x15
 	IP_HDRINCL                        = 0x2
 	IP_IPCOMP_LEVEL                   = 0x1d
+	IP_IPDEFTTL                       = 0x25
 	IP_IPSECFLOWINFO                  = 0x24
 	IP_IPSEC_LOCAL_AUTH               = 0x1b
 	IP_IPSEC_LOCAL_CRED               = 0x19
@@ -864,10 +979,15 @@
 	IP_RETOPTS                        = 0x8
 	IP_RF                             = 0x8000
 	IP_RTABLE                         = 0x1021
+	IP_SENDSRCADDR                    = 0x7
 	IP_TOS                            = 0x3
 	IP_TTL                            = 0x4
 	ISIG                              = 0x80
 	ISTRIP                            = 0x20
+	ITIMER_PROF                       = 0x2
+	ITIMER_REAL                       = 0x0
+	ITIMER_VIRTUAL                    = 0x1
+	IUCLC                             = 0x1000
 	IXANY                             = 0x800
 	IXOFF                             = 0x400
 	IXON                              = 0x200
@@ -922,6 +1042,7 @@
 	MNT_NOATIME                       = 0x8000
 	MNT_NODEV                         = 0x10
 	MNT_NOEXEC                        = 0x4
+	MNT_NOPERM                        = 0x20
 	MNT_NOSUID                        = 0x8
 	MNT_NOWAIT                        = 0x2
 	MNT_QUOTA                         = 0x2000
@@ -929,12 +1050,27 @@
 	MNT_RELOAD                        = 0x40000
 	MNT_ROOTFS                        = 0x4000
 	MNT_SOFTDEP                       = 0x4000000
+	MNT_STALLED                       = 0x100000
+	MNT_SWAPPABLE                     = 0x200000
 	MNT_SYNCHRONOUS                   = 0x2
 	MNT_UPDATE                        = 0x10000
 	MNT_VISFLAGMASK                   = 0x400ffff
 	MNT_WAIT                          = 0x1
 	MNT_WANTRDWR                      = 0x2000000
 	MNT_WXALLOWED                     = 0x800
+	MOUNT_AFS                         = "afs"
+	MOUNT_CD9660                      = "cd9660"
+	MOUNT_EXT2FS                      = "ext2fs"
+	MOUNT_FFS                         = "ffs"
+	MOUNT_FUSEFS                      = "fuse"
+	MOUNT_MFS                         = "mfs"
+	MOUNT_MSDOS                       = "msdos"
+	MOUNT_NCPFS                       = "ncpfs"
+	MOUNT_NFS                         = "nfs"
+	MOUNT_NTFS                        = "ntfs"
+	MOUNT_TMPFS                       = "tmpfs"
+	MOUNT_UDF                         = "udf"
+	MOUNT_UFS                         = "ffs"
 	MSG_BCAST                         = 0x100
 	MSG_CMSG_CLOEXEC                  = 0x800
 	MSG_CTRUNC                        = 0x20
@@ -947,6 +1083,7 @@
 	MSG_PEEK                          = 0x2
 	MSG_TRUNC                         = 0x10
 	MSG_WAITALL                       = 0x40
+	MSG_WAITFORONE                    = 0x1000
 	MS_ASYNC                          = 0x1
 	MS_INVALIDATE                     = 0x4
 	MS_SYNC                           = 0x2
@@ -954,12 +1091,16 @@
 	NET_RT_DUMP                       = 0x1
 	NET_RT_FLAGS                      = 0x2
 	NET_RT_IFLIST                     = 0x3
-	NET_RT_MAXID                      = 0x6
+	NET_RT_IFNAMES                    = 0x6
+	NET_RT_MAXID                      = 0x8
+	NET_RT_SOURCE                     = 0x7
 	NET_RT_STATS                      = 0x4
 	NET_RT_TABLE                      = 0x5
 	NFDBITS                           = 0x20
 	NOFLSH                            = 0x80000000
+	NOKERNINFO                        = 0x2000000
 	NOTE_ATTRIB                       = 0x8
+	NOTE_CHANGE                       = 0x1
 	NOTE_CHILD                        = 0x4
 	NOTE_DELETE                       = 0x1
 	NOTE_EOF                          = 0x2
@@ -969,6 +1110,7 @@
 	NOTE_FORK                         = 0x40000000
 	NOTE_LINK                         = 0x10
 	NOTE_LOWAT                        = 0x1
+	NOTE_OOB                          = 0x4
 	NOTE_PCTRLMASK                    = 0xf0000000
 	NOTE_PDATAMASK                    = 0xfffff
 	NOTE_RENAME                       = 0x20
@@ -978,11 +1120,13 @@
 	NOTE_TRUNCATE                     = 0x80
 	NOTE_WRITE                        = 0x2
 	OCRNL                             = 0x10
+	OLCUC                             = 0x20
 	ONLCR                             = 0x2
 	ONLRET                            = 0x80
 	ONOCR                             = 0x40
 	ONOEOT                            = 0x8
 	OPOST                             = 0x1
+	OXTABS                            = 0x4
 	O_ACCMODE                         = 0x3
 	O_APPEND                          = 0x8
 	O_ASYNC                           = 0x40
@@ -1027,19 +1171,25 @@
 	RLIMIT_STACK                      = 0x3
 	RLIM_INFINITY                     = 0x7fffffffffffffff
 	RTAX_AUTHOR                       = 0x6
+	RTAX_BFD                          = 0xb
 	RTAX_BRD                          = 0x7
+	RTAX_DNS                          = 0xc
 	RTAX_DST                          = 0x0
 	RTAX_GATEWAY                      = 0x1
 	RTAX_GENMASK                      = 0x3
 	RTAX_IFA                          = 0x5
 	RTAX_IFP                          = 0x4
 	RTAX_LABEL                        = 0xa
-	RTAX_MAX                          = 0xb
+	RTAX_MAX                          = 0xf
 	RTAX_NETMASK                      = 0x2
+	RTAX_SEARCH                       = 0xe
 	RTAX_SRC                          = 0x8
 	RTAX_SRCMASK                      = 0x9
+	RTAX_STATIC                       = 0xd
 	RTA_AUTHOR                        = 0x40
+	RTA_BFD                           = 0x800
 	RTA_BRD                           = 0x80
+	RTA_DNS                           = 0x1000
 	RTA_DST                           = 0x1
 	RTA_GATEWAY                       = 0x2
 	RTA_GENMASK                       = 0x8
@@ -1047,24 +1197,29 @@
 	RTA_IFP                           = 0x10
 	RTA_LABEL                         = 0x400
 	RTA_NETMASK                       = 0x4
+	RTA_SEARCH                        = 0x4000
 	RTA_SRC                           = 0x100
 	RTA_SRCMASK                       = 0x200
+	RTA_STATIC                        = 0x2000
 	RTF_ANNOUNCE                      = 0x4000
+	RTF_BFD                           = 0x1000000
 	RTF_BLACKHOLE                     = 0x1000
 	RTF_BROADCAST                     = 0x400000
+	RTF_CACHED                        = 0x20000
 	RTF_CLONED                        = 0x10000
 	RTF_CLONING                       = 0x100
+	RTF_CONNECTED                     = 0x800000
 	RTF_DONE                          = 0x40
 	RTF_DYNAMIC                       = 0x10
-	RTF_FMASK                         = 0x70f808
+	RTF_FMASK                         = 0x110fc08
 	RTF_GATEWAY                       = 0x2
 	RTF_HOST                          = 0x4
 	RTF_LLINFO                        = 0x400
 	RTF_LOCAL                         = 0x200000
-	RTF_MASK                          = 0x80
 	RTF_MODIFIED                      = 0x20
 	RTF_MPATH                         = 0x40000
 	RTF_MPLS                          = 0x100000
+	RTF_MULTICAST                     = 0x200
 	RTF_PERMANENT_ARP                 = 0x2000
 	RTF_PROTO1                        = 0x8000
 	RTF_PROTO2                        = 0x4000
@@ -1073,23 +1228,26 @@
 	RTF_STATIC                        = 0x800
 	RTF_UP                            = 0x1
 	RTF_USETRAILERS                   = 0x8000
-	RTF_XRESOLVE                      = 0x200
+	RTM_80211INFO                     = 0x15
 	RTM_ADD                           = 0x1
+	RTM_BFD                           = 0x12
 	RTM_CHANGE                        = 0x3
+	RTM_CHGADDRATTR                   = 0x14
 	RTM_DELADDR                       = 0xd
 	RTM_DELETE                        = 0x2
 	RTM_DESYNC                        = 0x10
 	RTM_GET                           = 0x4
 	RTM_IFANNOUNCE                    = 0xf
 	RTM_IFINFO                        = 0xe
-	RTM_LOCK                          = 0x8
+	RTM_INVALIDATE                    = 0x11
 	RTM_LOSING                        = 0x5
 	RTM_MAXSIZE                       = 0x800
 	RTM_MISS                          = 0x7
 	RTM_NEWADDR                       = 0xc
+	RTM_PROPOSAL                      = 0x13
 	RTM_REDIRECT                      = 0x6
 	RTM_RESOLVE                       = 0xb
-	RTM_RTTUNIT                       = 0xf4240
+	RTM_SOURCE                        = 0x16
 	RTM_VERSION                       = 0x5
 	RTV_EXPIRE                        = 0x4
 	RTV_HOPCOUNT                      = 0x2
@@ -1099,67 +1257,74 @@
 	RTV_RTTVAR                        = 0x80
 	RTV_SPIPE                         = 0x10
 	RTV_SSTHRESH                      = 0x20
+	RT_TABLEID_BITS                   = 0x8
+	RT_TABLEID_MASK                   = 0xff
 	RT_TABLEID_MAX                    = 0xff
 	RUSAGE_CHILDREN                   = -0x1
 	RUSAGE_SELF                       = 0x0
 	RUSAGE_THREAD                     = 0x1
 	SCM_RIGHTS                        = 0x1
 	SCM_TIMESTAMP                     = 0x4
+	SEEK_CUR                          = 0x1
+	SEEK_END                          = 0x2
+	SEEK_SET                          = 0x0
 	SHUT_RD                           = 0x0
 	SHUT_RDWR                         = 0x2
 	SHUT_WR                           = 0x1
 	SIOCADDMULTI                      = 0x80206931
 	SIOCAIFADDR                       = 0x8040691a
 	SIOCAIFGROUP                      = 0x80246987
-	SIOCALIFADDR                      = 0x8218691c
 	SIOCATMARK                        = 0x40047307
-	SIOCBRDGADD                       = 0x8054693c
-	SIOCBRDGADDS                      = 0x80546941
-	SIOCBRDGARL                       = 0x806e694d
+	SIOCBRDGADD                       = 0x8060693c
+	SIOCBRDGADDL                      = 0x80606949
+	SIOCBRDGADDS                      = 0x80606941
+	SIOCBRDGARL                       = 0x808c694d
 	SIOCBRDGDADDR                     = 0x81286947
-	SIOCBRDGDEL                       = 0x8054693d
-	SIOCBRDGDELS                      = 0x80546942
-	SIOCBRDGFLUSH                     = 0x80546948
-	SIOCBRDGFRL                       = 0x806e694e
+	SIOCBRDGDEL                       = 0x8060693d
+	SIOCBRDGDELS                      = 0x80606942
+	SIOCBRDGFLUSH                     = 0x80606948
+	SIOCBRDGFRL                       = 0x808c694e
 	SIOCBRDGGCACHE                    = 0xc0146941
 	SIOCBRDGGFD                       = 0xc0146952
 	SIOCBRDGGHT                       = 0xc0146951
-	SIOCBRDGGIFFLGS                   = 0xc054693e
+	SIOCBRDGGIFFLGS                   = 0xc060693e
 	SIOCBRDGGMA                       = 0xc0146953
-	SIOCBRDGGPARAM                    = 0xc03c6958
+	SIOCBRDGGPARAM                    = 0xc0406958
 	SIOCBRDGGPRI                      = 0xc0146950
 	SIOCBRDGGRL                       = 0xc028694f
-	SIOCBRDGGSIFS                     = 0xc054693c
 	SIOCBRDGGTO                       = 0xc0146946
-	SIOCBRDGIFS                       = 0xc0546942
+	SIOCBRDGIFS                       = 0xc0606942
 	SIOCBRDGRTS                       = 0xc0186943
 	SIOCBRDGSADDR                     = 0xc1286944
 	SIOCBRDGSCACHE                    = 0x80146940
 	SIOCBRDGSFD                       = 0x80146952
 	SIOCBRDGSHT                       = 0x80146951
-	SIOCBRDGSIFCOST                   = 0x80546955
-	SIOCBRDGSIFFLGS                   = 0x8054693f
-	SIOCBRDGSIFPRIO                   = 0x80546954
+	SIOCBRDGSIFCOST                   = 0x80606955
+	SIOCBRDGSIFFLGS                   = 0x8060693f
+	SIOCBRDGSIFPRIO                   = 0x80606954
+	SIOCBRDGSIFPROT                   = 0x8060694a
 	SIOCBRDGSMA                       = 0x80146953
 	SIOCBRDGSPRI                      = 0x80146950
 	SIOCBRDGSPROTO                    = 0x8014695a
 	SIOCBRDGSTO                       = 0x80146945
 	SIOCBRDGSTXHC                     = 0x80146959
+	SIOCDELLABEL                      = 0x80206997
 	SIOCDELMULTI                      = 0x80206932
 	SIOCDIFADDR                       = 0x80206919
 	SIOCDIFGROUP                      = 0x80246989
+	SIOCDIFPARENT                     = 0x802069b4
 	SIOCDIFPHYADDR                    = 0x80206949
-	SIOCDLIFADDR                      = 0x8218691e
+	SIOCDPWE3NEIGHBOR                 = 0x802069de
+	SIOCDVNETID                       = 0x802069af
 	SIOCGETKALIVE                     = 0xc01869a4
 	SIOCGETLABEL                      = 0x8020699a
+	SIOCGETMPWCFG                     = 0xc02069ae
 	SIOCGETPFLOW                      = 0xc02069fe
 	SIOCGETPFSYNC                     = 0xc02069f8
 	SIOCGETSGCNT                      = 0xc0147534
 	SIOCGETVIFCNT                     = 0xc0147533
 	SIOCGETVLAN                       = 0xc0206990
-	SIOCGHIWAT                        = 0x40047301
 	SIOCGIFADDR                       = 0xc0206921
-	SIOCGIFASYNCMAP                   = 0xc020697c
 	SIOCGIFBRDADDR                    = 0xc0206923
 	SIOCGIFCONF                       = 0xc0086924
 	SIOCGIFDATA                       = 0xc020691b
@@ -1168,41 +1333,53 @@
 	SIOCGIFFLAGS                      = 0xc0206911
 	SIOCGIFGATTR                      = 0xc024698b
 	SIOCGIFGENERIC                    = 0xc020693a
+	SIOCGIFGLIST                      = 0xc024698d
 	SIOCGIFGMEMB                      = 0xc024698a
 	SIOCGIFGROUP                      = 0xc0246988
 	SIOCGIFHARDMTU                    = 0xc02069a5
-	SIOCGIFMEDIA                      = 0xc0286936
+	SIOCGIFLLPRIO                     = 0xc02069b6
+	SIOCGIFMEDIA                      = 0xc0386938
 	SIOCGIFMETRIC                     = 0xc0206917
 	SIOCGIFMTU                        = 0xc020697e
 	SIOCGIFNETMASK                    = 0xc0206925
-	SIOCGIFPDSTADDR                   = 0xc0206948
+	SIOCGIFPAIR                       = 0xc02069b1
+	SIOCGIFPARENT                     = 0xc02069b3
 	SIOCGIFPRIORITY                   = 0xc020699c
-	SIOCGIFPSRCADDR                   = 0xc0206947
 	SIOCGIFRDOMAIN                    = 0xc02069a0
 	SIOCGIFRTLABEL                    = 0xc0206983
 	SIOCGIFRXR                        = 0x802069aa
-	SIOCGIFTIMESLOT                   = 0xc0206986
+	SIOCGIFSFFPAGE                    = 0xc1126939
 	SIOCGIFXFLAGS                     = 0xc020699e
-	SIOCGLIFADDR                      = 0xc218691d
 	SIOCGLIFPHYADDR                   = 0xc218694b
+	SIOCGLIFPHYDF                     = 0xc02069c2
+	SIOCGLIFPHYECN                    = 0xc02069c8
 	SIOCGLIFPHYRTABLE                 = 0xc02069a2
 	SIOCGLIFPHYTTL                    = 0xc02069a9
-	SIOCGLOWAT                        = 0x40047303
 	SIOCGPGRP                         = 0x40047309
+	SIOCGPWE3                         = 0xc0206998
+	SIOCGPWE3CTRLWORD                 = 0xc02069dc
+	SIOCGPWE3FAT                      = 0xc02069dd
+	SIOCGPWE3NEIGHBOR                 = 0xc21869de
+	SIOCGRXHPRIO                      = 0xc02069db
 	SIOCGSPPPPARAMS                   = 0xc0206994
+	SIOCGTXHPRIO                      = 0xc02069c6
+	SIOCGUMBINFO                      = 0xc02069be
+	SIOCGUMBPARAM                     = 0xc02069c0
 	SIOCGVH                           = 0xc02069f6
+	SIOCGVNETFLOWID                   = 0xc02069c4
 	SIOCGVNETID                       = 0xc02069a7
+	SIOCIFAFATTACH                    = 0x801169ab
+	SIOCIFAFDETACH                    = 0x801169ac
 	SIOCIFCREATE                      = 0x8020697a
 	SIOCIFDESTROY                     = 0x80206979
 	SIOCIFGCLONERS                    = 0xc00c6978
 	SIOCSETKALIVE                     = 0x801869a3
 	SIOCSETLABEL                      = 0x80206999
+	SIOCSETMPWCFG                     = 0x802069ad
 	SIOCSETPFLOW                      = 0x802069fd
 	SIOCSETPFSYNC                     = 0x802069f7
 	SIOCSETVLAN                       = 0x8020698f
-	SIOCSHIWAT                        = 0x80047300
 	SIOCSIFADDR                       = 0x8020690c
-	SIOCSIFASYNCMAP                   = 0x8020697d
 	SIOCSIFBRDADDR                    = 0x80206913
 	SIOCSIFDESCR                      = 0x80206980
 	SIOCSIFDSTADDR                    = 0x8020690e
@@ -1210,26 +1387,36 @@
 	SIOCSIFGATTR                      = 0x8024698c
 	SIOCSIFGENERIC                    = 0x80206939
 	SIOCSIFLLADDR                     = 0x8020691f
-	SIOCSIFMEDIA                      = 0xc0206935
+	SIOCSIFLLPRIO                     = 0x802069b5
+	SIOCSIFMEDIA                      = 0xc0206937
 	SIOCSIFMETRIC                     = 0x80206918
 	SIOCSIFMTU                        = 0x8020697f
 	SIOCSIFNETMASK                    = 0x80206916
-	SIOCSIFPHYADDR                    = 0x80406946
+	SIOCSIFPAIR                       = 0x802069b0
+	SIOCSIFPARENT                     = 0x802069b2
 	SIOCSIFPRIORITY                   = 0x8020699b
 	SIOCSIFRDOMAIN                    = 0x8020699f
 	SIOCSIFRTLABEL                    = 0x80206982
-	SIOCSIFTIMESLOT                   = 0x80206985
 	SIOCSIFXFLAGS                     = 0x8020699d
 	SIOCSLIFPHYADDR                   = 0x8218694a
+	SIOCSLIFPHYDF                     = 0x802069c1
+	SIOCSLIFPHYECN                    = 0x802069c7
 	SIOCSLIFPHYRTABLE                 = 0x802069a1
 	SIOCSLIFPHYTTL                    = 0x802069a8
-	SIOCSLOWAT                        = 0x80047302
 	SIOCSPGRP                         = 0x80047308
+	SIOCSPWE3CTRLWORD                 = 0x802069dc
+	SIOCSPWE3FAT                      = 0x802069dd
+	SIOCSPWE3NEIGHBOR                 = 0x821869de
+	SIOCSRXHPRIO                      = 0x802069db
 	SIOCSSPPPPARAMS                   = 0x80206993
+	SIOCSTXHPRIO                      = 0x802069c5
+	SIOCSUMBPARAM                     = 0x802069bf
 	SIOCSVH                           = 0xc02069f5
+	SIOCSVNETFLOWID                   = 0x802069c3
 	SIOCSVNETID                       = 0x802069a6
 	SOCK_CLOEXEC                      = 0x8000
 	SOCK_DGRAM                        = 0x2
+	SOCK_DNS                          = 0x1000
 	SOCK_NONBLOCK                     = 0x4000
 	SOCK_RAW                          = 0x3
 	SOCK_RDM                          = 0x4
@@ -1241,6 +1428,7 @@
 	SO_BINDANY                        = 0x1000
 	SO_BROADCAST                      = 0x20
 	SO_DEBUG                          = 0x1
+	SO_DOMAIN                         = 0x1024
 	SO_DONTROUTE                      = 0x10
 	SO_ERROR                          = 0x1007
 	SO_KEEPALIVE                      = 0x8
@@ -1248,6 +1436,7 @@
 	SO_NETPROC                        = 0x1020
 	SO_OOBINLINE                      = 0x100
 	SO_PEERCRED                       = 0x1022
+	SO_PROTOCOL                       = 0x1025
 	SO_RCVBUF                         = 0x1002
 	SO_RCVLOWAT                       = 0x1004
 	SO_RCVTIMEO                       = 0x1006
@@ -1261,6 +1450,7 @@
 	SO_TIMESTAMP                      = 0x800
 	SO_TYPE                           = 0x1008
 	SO_USELOOPBACK                    = 0x40
+	SO_ZEROIZE                        = 0x2000
 	S_BLKSIZE                         = 0x200
 	S_IEXEC                           = 0x40
 	S_IFBLK                           = 0x6000
@@ -1290,9 +1480,24 @@
 	S_IXOTH                           = 0x1
 	S_IXUSR                           = 0x40
 	TCIFLUSH                          = 0x1
+	TCIOFF                            = 0x3
 	TCIOFLUSH                         = 0x3
+	TCION                             = 0x4
 	TCOFLUSH                          = 0x2
-	TCP_MAXBURST                      = 0x4
+	TCOOFF                            = 0x1
+	TCOON                             = 0x2
+	TCPOPT_EOL                        = 0x0
+	TCPOPT_MAXSEG                     = 0x2
+	TCPOPT_NOP                        = 0x1
+	TCPOPT_SACK                       = 0x5
+	TCPOPT_SACK_HDR                   = 0x1010500
+	TCPOPT_SACK_PERMITTED             = 0x4
+	TCPOPT_SACK_PERMIT_HDR            = 0x1010402
+	TCPOPT_SIGNATURE                  = 0x13
+	TCPOPT_TIMESTAMP                  = 0x8
+	TCPOPT_TSTAMP_HDR                 = 0x101080a
+	TCPOPT_WINDOW                     = 0x3
+	TCP_INFO                          = 0x9
 	TCP_MAXSEG                        = 0x2
 	TCP_MAXWIN                        = 0xffff
 	TCP_MAX_SACK                      = 0x3
@@ -1301,11 +1506,15 @@
 	TCP_MSS                           = 0x200
 	TCP_NODELAY                       = 0x1
 	TCP_NOPUSH                        = 0x10
-	TCP_NSTATES                       = 0xb
+	TCP_SACKHOLE_LIMIT                = 0x80
 	TCP_SACK_ENABLE                   = 0x8
 	TCSAFLUSH                         = 0x2
+	TIMER_ABSTIME                     = 0x1
+	TIMER_RELTIME                     = 0x0
 	TIOCCBRK                          = 0x2000747a
 	TIOCCDTR                          = 0x20007478
+	TIOCCHKVERAUTH                    = 0x2000741e
+	TIOCCLRVERAUTH                    = 0x2000741d
 	TIOCCONS                          = 0x80047462
 	TIOCDRAIN                         = 0x2000745e
 	TIOCEXCL                          = 0x2000740d
@@ -1321,7 +1530,7 @@
 	TIOCGFLAGS                        = 0x4004745d
 	TIOCGPGRP                         = 0x40047477
 	TIOCGSID                          = 0x40047463
-	TIOCGTSTAMP                       = 0x400c745b
+	TIOCGTSTAMP                       = 0x4010745b
 	TIOCGWINSZ                        = 0x40087468
 	TIOCMBIC                          = 0x8004746b
 	TIOCMBIS                          = 0x8004746c
@@ -1360,17 +1569,21 @@
 	TIOCSETAF                         = 0x802c7416
 	TIOCSETAW                         = 0x802c7415
 	TIOCSETD                          = 0x8004741b
+	TIOCSETVERAUTH                    = 0x8004741c
 	TIOCSFLAGS                        = 0x8004745c
 	TIOCSIG                           = 0x8004745f
 	TIOCSPGRP                         = 0x80047476
 	TIOCSTART                         = 0x2000746e
-	TIOCSTAT                          = 0x80047465
-	TIOCSTI                           = 0x80017472
+	TIOCSTAT                          = 0x20007465
 	TIOCSTOP                          = 0x2000746f
 	TIOCSTSTAMP                       = 0x8008745a
 	TIOCSWINSZ                        = 0x80087467
 	TIOCUCNTL                         = 0x80047466
+	TIOCUCNTL_CBRK                    = 0x7a
+	TIOCUCNTL_SBRK                    = 0x7b
 	TOSTOP                            = 0x400000
+	UTIME_NOW                         = -0x2
+	UTIME_OMIT                        = -0x1
 	VDISCARD                          = 0xf
 	VDSUSP                            = 0xb
 	VEOF                              = 0x0
@@ -1381,6 +1594,19 @@
 	VKILL                             = 0x5
 	VLNEXT                            = 0xe
 	VMIN                              = 0x10
+	VM_ANONMIN                        = 0x7
+	VM_LOADAVG                        = 0x2
+	VM_MALLOC_CONF                    = 0xc
+	VM_MAXID                          = 0xd
+	VM_MAXSLP                         = 0xa
+	VM_METER                          = 0x1
+	VM_NKMEMPAGES                     = 0x6
+	VM_PSSTRINGS                      = 0x3
+	VM_SWAPENCRYPT                    = 0x5
+	VM_USPACE                         = 0xb
+	VM_UVMEXP                         = 0x4
+	VM_VNODEMIN                       = 0x9
+	VM_VTEXTMIN                       = 0x8
 	VQUIT                             = 0x9
 	VREPRINT                          = 0x6
 	VSTART                            = 0xc
@@ -1394,6 +1620,7 @@
 	WCOREFLAG                         = 0x80
 	WNOHANG                           = 0x1
 	WUNTRACED                         = 0x2
+	XCASE                             = 0x1000000
 )
 
 // Errors
@@ -1407,6 +1634,7 @@
 	EALREADY        = syscall.Errno(0x25)
 	EAUTH           = syscall.Errno(0x50)
 	EBADF           = syscall.Errno(0x9)
+	EBADMSG         = syscall.Errno(0x5c)
 	EBADRPC         = syscall.Errno(0x48)
 	EBUSY           = syscall.Errno(0x10)
 	ECANCELED       = syscall.Errno(0x58)
@@ -1433,7 +1661,7 @@
 	EIPSEC          = syscall.Errno(0x52)
 	EISCONN         = syscall.Errno(0x38)
 	EISDIR          = syscall.Errno(0x15)
-	ELAST           = syscall.Errno(0x5b)
+	ELAST           = syscall.Errno(0x5f)
 	ELOOP           = syscall.Errno(0x3e)
 	EMEDIUMTYPE     = syscall.Errno(0x56)
 	EMFILE          = syscall.Errno(0x18)
@@ -1461,12 +1689,14 @@
 	ENOTCONN        = syscall.Errno(0x39)
 	ENOTDIR         = syscall.Errno(0x14)
 	ENOTEMPTY       = syscall.Errno(0x42)
+	ENOTRECOVERABLE = syscall.Errno(0x5d)
 	ENOTSOCK        = syscall.Errno(0x26)
 	ENOTSUP         = syscall.Errno(0x5b)
 	ENOTTY          = syscall.Errno(0x19)
 	ENXIO           = syscall.Errno(0x6)
 	EOPNOTSUPP      = syscall.Errno(0x2d)
 	EOVERFLOW       = syscall.Errno(0x57)
+	EOWNERDEAD      = syscall.Errno(0x5e)
 	EPERM           = syscall.Errno(0x1)
 	EPFNOSUPPORT    = syscall.Errno(0x2e)
 	EPIPE           = syscall.Errno(0x20)
@@ -1474,6 +1704,7 @@
 	EPROCUNAVAIL    = syscall.Errno(0x4c)
 	EPROGMISMATCH   = syscall.Errno(0x4b)
 	EPROGUNAVAIL    = syscall.Errno(0x4a)
+	EPROTO          = syscall.Errno(0x5f)
 	EPROTONOSUPPORT = syscall.Errno(0x2b)
 	EPROTOTYPE      = syscall.Errno(0x29)
 	ERANGE          = syscall.Errno(0x22)
@@ -1570,7 +1801,7 @@
 	{32, "EPIPE", "broken pipe"},
 	{33, "EDOM", "numerical argument out of domain"},
 	{34, "ERANGE", "result too large"},
-	{35, "EWOULDBLOCK", "resource temporarily unavailable"},
+	{35, "EAGAIN", "resource temporarily unavailable"},
 	{36, "EINPROGRESS", "operation now in progress"},
 	{37, "EALREADY", "operation already in progress"},
 	{38, "ENOTSOCK", "socket operation on non-socket"},
@@ -1626,7 +1857,11 @@
 	{88, "ECANCELED", "operation canceled"},
 	{89, "EIDRM", "identifier removed"},
 	{90, "ENOMSG", "no message of desired type"},
-	{91, "ELAST", "not supported"},
+	{91, "ENOTSUP", "not supported"},
+	{92, "EBADMSG", "bad message"},
+	{93, "ENOTRECOVERABLE", "state not recoverable"},
+	{94, "EOWNERDEAD", "previous owner died"},
+	{95, "ELAST", "protocol error"},
 }
 
 // Signal table
@@ -1640,7 +1875,7 @@
 	{3, "SIGQUIT", "quit"},
 	{4, "SIGILL", "illegal instruction"},
 	{5, "SIGTRAP", "trace/BPT trap"},
-	{6, "SIGABRT", "abort trap"},
+	{6, "SIGIOT", "abort trap"},
 	{7, "SIGEMT", "EMT trap"},
 	{8, "SIGFPE", "floating point exception"},
 	{9, "SIGKILL", "killed"},
@@ -1667,4 +1902,5 @@
 	{30, "SIGUSR1", "user defined signal 1"},
 	{31, "SIGUSR2", "user defined signal 2"},
 	{32, "SIGTHR", "thread AST"},
+	{28672, "SIGSTKSZ", "unknown signal"},
 }
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm64.go b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm64.go
index 90de7df..ae16fe7 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm64.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm64.go
@@ -112,6 +112,12 @@
 	BPF_FILDROP_CAPTURE               = 0x1
 	BPF_FILDROP_DROP                  = 0x2
 	BPF_FILDROP_PASS                  = 0x0
+	BPF_F_DIR_IN                      = 0x10
+	BPF_F_DIR_MASK                    = 0x30
+	BPF_F_DIR_OUT                     = 0x20
+	BPF_F_DIR_SHIFT                   = 0x4
+	BPF_F_FLOWID                      = 0x8
+	BPF_F_PRI_MASK                    = 0x7
 	BPF_H                             = 0x8
 	BPF_IMM                           = 0x0
 	BPF_IND                           = 0x40
@@ -140,6 +146,7 @@
 	BPF_OR                            = 0x40
 	BPF_RELEASE                       = 0x30bb6
 	BPF_RET                           = 0x6
+	BPF_RND                           = 0xc0
 	BPF_RSH                           = 0x70
 	BPF_ST                            = 0x2
 	BPF_STX                           = 0x3
@@ -180,7 +187,65 @@
 	CTL_KERN                          = 0x1
 	CTL_MAXNAME                       = 0xc
 	CTL_NET                           = 0x4
+	DIOCADDQUEUE                      = 0xc110445d
+	DIOCADDRULE                       = 0xcd604404
+	DIOCADDSTATE                      = 0xc1084425
+	DIOCCHANGERULE                    = 0xcd60441a
+	DIOCCLRIFFLAG                     = 0xc028445a
+	DIOCCLRSRCNODES                   = 0x20004455
+	DIOCCLRSTATES                     = 0xc0e04412
+	DIOCCLRSTATUS                     = 0xc0284416
+	DIOCGETLIMIT                      = 0xc0084427
+	DIOCGETQSTATS                     = 0xc1204460
+	DIOCGETQUEUE                      = 0xc110445f
+	DIOCGETQUEUES                     = 0xc110445e
+	DIOCGETRULE                       = 0xcd604407
+	DIOCGETRULES                      = 0xcd604406
+	DIOCGETRULESET                    = 0xc444443b
+	DIOCGETRULESETS                   = 0xc444443a
+	DIOCGETSRCNODES                   = 0xc0104454
+	DIOCGETSTATE                      = 0xc1084413
+	DIOCGETSTATES                     = 0xc0104419
+	DIOCGETSTATUS                     = 0xc1e84415
+	DIOCGETSYNFLWATS                  = 0xc0084463
+	DIOCGETTIMEOUT                    = 0xc008441e
+	DIOCIGETIFACES                    = 0xc0284457
+	DIOCKILLSRCNODES                  = 0xc080445b
+	DIOCKILLSTATES                    = 0xc0e04429
+	DIOCNATLOOK                       = 0xc0504417
+	DIOCOSFPADD                       = 0xc088444f
 	DIOCOSFPFLUSH                     = 0x2000444e
+	DIOCOSFPGET                       = 0xc0884450
+	DIOCRADDADDRS                     = 0xc4504443
+	DIOCRADDTABLES                    = 0xc450443d
+	DIOCRCLRADDRS                     = 0xc4504442
+	DIOCRCLRASTATS                    = 0xc4504448
+	DIOCRCLRTABLES                    = 0xc450443c
+	DIOCRCLRTSTATS                    = 0xc4504441
+	DIOCRDELADDRS                     = 0xc4504444
+	DIOCRDELTABLES                    = 0xc450443e
+	DIOCRGETADDRS                     = 0xc4504446
+	DIOCRGETASTATS                    = 0xc4504447
+	DIOCRGETTABLES                    = 0xc450443f
+	DIOCRGETTSTATS                    = 0xc4504440
+	DIOCRINADEFINE                    = 0xc450444d
+	DIOCRSETADDRS                     = 0xc4504445
+	DIOCRSETTFLAGS                    = 0xc450444a
+	DIOCRTSTADDRS                     = 0xc4504449
+	DIOCSETDEBUG                      = 0xc0044418
+	DIOCSETHOSTID                     = 0xc0044456
+	DIOCSETIFFLAG                     = 0xc0284459
+	DIOCSETLIMIT                      = 0xc0084428
+	DIOCSETREASS                      = 0xc004445c
+	DIOCSETSTATUSIF                   = 0xc0284414
+	DIOCSETSYNCOOKIES                 = 0xc0014462
+	DIOCSETSYNFLWATS                  = 0xc0084461
+	DIOCSETTIMEOUT                    = 0xc008441d
+	DIOCSTART                         = 0x20004401
+	DIOCSTOP                          = 0x20004402
+	DIOCXBEGIN                        = 0xc0104451
+	DIOCXCOMMIT                       = 0xc0104452
+	DIOCXROLLBACK                     = 0xc0104453
 	DLT_ARCNET                        = 0x7
 	DLT_ATM_RFC1483                   = 0xb
 	DLT_AX25                          = 0x3
@@ -243,6 +308,8 @@
 	EMUL_ENABLED                      = 0x1
 	EMUL_NATIVE                       = 0x2
 	ENDRUNDISC                        = 0x9
+	ETH64_8021_RSVD_MASK              = 0xfffffffffff0
+	ETH64_8021_RSVD_PREFIX            = 0x180c2000000
 	ETHERMIN                          = 0x2e
 	ETHERMTU                          = 0x5dc
 	ETHERTYPE_8023                    = 0x4
@@ -295,6 +362,7 @@
 	ETHERTYPE_DN                      = 0x6003
 	ETHERTYPE_DOGFIGHT                = 0x1989
 	ETHERTYPE_DSMD                    = 0x8039
+	ETHERTYPE_EAPOL                   = 0x888e
 	ETHERTYPE_ECMA                    = 0x803
 	ETHERTYPE_ENCRYPT                 = 0x803d
 	ETHERTYPE_ES                      = 0x805d
@@ -326,6 +394,7 @@
 	ETHERTYPE_LLDP                    = 0x88cc
 	ETHERTYPE_LOGICRAFT               = 0x8148
 	ETHERTYPE_LOOPBACK                = 0x9000
+	ETHERTYPE_MACSEC                  = 0x88e5
 	ETHERTYPE_MATRA                   = 0x807a
 	ETHERTYPE_MAX                     = 0xffff
 	ETHERTYPE_MERIT                   = 0x807c
@@ -354,15 +423,16 @@
 	ETHERTYPE_NCD                     = 0x8149
 	ETHERTYPE_NESTAR                  = 0x8006
 	ETHERTYPE_NETBEUI                 = 0x8191
+	ETHERTYPE_NHRP                    = 0x2001
 	ETHERTYPE_NOVELL                  = 0x8138
 	ETHERTYPE_NS                      = 0x600
 	ETHERTYPE_NSAT                    = 0x601
 	ETHERTYPE_NSCOMPAT                = 0x807
+	ETHERTYPE_NSH                     = 0x984f
 	ETHERTYPE_NTRAILER                = 0x10
 	ETHERTYPE_OS9                     = 0x7007
 	ETHERTYPE_OS9NET                  = 0x7009
 	ETHERTYPE_PACER                   = 0x80c6
-	ETHERTYPE_PAE                     = 0x888e
 	ETHERTYPE_PBB                     = 0x88e7
 	ETHERTYPE_PCS                     = 0x4242
 	ETHERTYPE_PLANNING                = 0x8044
@@ -445,10 +515,11 @@
 	ETHER_VLAN_ENCAP_LEN              = 0x4
 	EVFILT_AIO                        = -0x3
 	EVFILT_DEVICE                     = -0x8
+	EVFILT_EXCEPT                     = -0x9
 	EVFILT_PROC                       = -0x5
 	EVFILT_READ                       = -0x1
 	EVFILT_SIGNAL                     = -0x6
-	EVFILT_SYSCOUNT                   = 0x8
+	EVFILT_SYSCOUNT                   = 0x9
 	EVFILT_TIMER                      = -0x7
 	EVFILT_VNODE                      = -0x4
 	EVFILT_WRITE                      = -0x2
@@ -470,7 +541,7 @@
 	EV_FLAG1                          = 0x2000
 	EV_ONESHOT                        = 0x10
 	EV_RECEIPT                        = 0x40
-	EV_SYSFLAGS                       = 0xf000
+	EV_SYSFLAGS                       = 0xf800
 	EXTA                              = 0x4b00
 	EXTB                              = 0x9600
 	EXTPROC                           = 0x800
@@ -736,6 +807,7 @@
 	IFT_VOICEOVERCABLE                = 0xc6
 	IFT_VOICEOVERFRAMERELAY           = 0x99
 	IFT_VOICEOVERIP                   = 0x68
+	IFT_WIREGUARD                     = 0xfb
 	IFT_X213                          = 0x5d
 	IFT_X25                           = 0x5
 	IFT_X25DDN                        = 0x4
@@ -801,9 +873,11 @@
 	IPPROTO_RAW                       = 0xff
 	IPPROTO_ROUTING                   = 0x2b
 	IPPROTO_RSVP                      = 0x2e
+	IPPROTO_SCTP                      = 0x84
 	IPPROTO_TCP                       = 0x6
 	IPPROTO_TP                        = 0x1d
 	IPPROTO_UDP                       = 0x11
+	IPPROTO_UDPLITE                   = 0x88
 	IPV6_AUTH_LEVEL                   = 0x35
 	IPV6_AUTOFLOWLABEL                = 0x3b
 	IPV6_CHECKSUM                     = 0x1a
@@ -910,6 +984,9 @@
 	IP_TTL                            = 0x4
 	ISIG                              = 0x80
 	ISTRIP                            = 0x20
+	ITIMER_PROF                       = 0x2
+	ITIMER_REAL                       = 0x0
+	ITIMER_VIRTUAL                    = 0x1
 	IUCLC                             = 0x1000
 	IXANY                             = 0x800
 	IXOFF                             = 0x400
@@ -981,6 +1058,19 @@
 	MNT_WAIT                          = 0x1
 	MNT_WANTRDWR                      = 0x2000000
 	MNT_WXALLOWED                     = 0x800
+	MOUNT_AFS                         = "afs"
+	MOUNT_CD9660                      = "cd9660"
+	MOUNT_EXT2FS                      = "ext2fs"
+	MOUNT_FFS                         = "ffs"
+	MOUNT_FUSEFS                      = "fuse"
+	MOUNT_MFS                         = "mfs"
+	MOUNT_MSDOS                       = "msdos"
+	MOUNT_NCPFS                       = "ncpfs"
+	MOUNT_NFS                         = "nfs"
+	MOUNT_NTFS                        = "ntfs"
+	MOUNT_TMPFS                       = "tmpfs"
+	MOUNT_UDF                         = "udf"
+	MOUNT_UFS                         = "ffs"
 	MSG_BCAST                         = 0x100
 	MSG_CMSG_CLOEXEC                  = 0x800
 	MSG_CTRUNC                        = 0x20
@@ -993,6 +1083,7 @@
 	MSG_PEEK                          = 0x2
 	MSG_TRUNC                         = 0x10
 	MSG_WAITALL                       = 0x40
+	MSG_WAITFORONE                    = 0x1000
 	MS_ASYNC                          = 0x1
 	MS_INVALIDATE                     = 0x4
 	MS_SYNC                           = 0x2
@@ -1001,7 +1092,8 @@
 	NET_RT_FLAGS                      = 0x2
 	NET_RT_IFLIST                     = 0x3
 	NET_RT_IFNAMES                    = 0x6
-	NET_RT_MAXID                      = 0x7
+	NET_RT_MAXID                      = 0x8
+	NET_RT_SOURCE                     = 0x7
 	NET_RT_STATS                      = 0x4
 	NET_RT_TABLE                      = 0x5
 	NFDBITS                           = 0x20
@@ -1018,6 +1110,7 @@
 	NOTE_FORK                         = 0x40000000
 	NOTE_LINK                         = 0x10
 	NOTE_LOWAT                        = 0x1
+	NOTE_OOB                          = 0x4
 	NOTE_PCTRLMASK                    = 0xf0000000
 	NOTE_PDATAMASK                    = 0xfffff
 	NOTE_RENAME                       = 0x20
@@ -1154,7 +1247,7 @@
 	RTM_PROPOSAL                      = 0x13
 	RTM_REDIRECT                      = 0x6
 	RTM_RESOLVE                       = 0xb
-	RTM_RTTUNIT                       = 0xf4240
+	RTM_SOURCE                        = 0x16
 	RTM_VERSION                       = 0x5
 	RTV_EXPIRE                        = 0x4
 	RTV_HOPCOUNT                      = 0x2
@@ -1172,6 +1265,9 @@
 	RUSAGE_THREAD                     = 0x1
 	SCM_RIGHTS                        = 0x1
 	SCM_TIMESTAMP                     = 0x4
+	SEEK_CUR                          = 0x1
+	SEEK_END                          = 0x2
+	SEEK_SET                          = 0x0
 	SHUT_RD                           = 0x0
 	SHUT_RDWR                         = 0x2
 	SHUT_WR                           = 0x1
@@ -1188,30 +1284,30 @@
 	SIOCBRDGDELS                      = 0x80606942
 	SIOCBRDGFLUSH                     = 0x80606948
 	SIOCBRDGFRL                       = 0x808c694e
-	SIOCBRDGGCACHE                    = 0xc0186941
-	SIOCBRDGGFD                       = 0xc0186952
-	SIOCBRDGGHT                       = 0xc0186951
+	SIOCBRDGGCACHE                    = 0xc0146941
+	SIOCBRDGGFD                       = 0xc0146952
+	SIOCBRDGGHT                       = 0xc0146951
 	SIOCBRDGGIFFLGS                   = 0xc060693e
-	SIOCBRDGGMA                       = 0xc0186953
+	SIOCBRDGGMA                       = 0xc0146953
 	SIOCBRDGGPARAM                    = 0xc0406958
-	SIOCBRDGGPRI                      = 0xc0186950
+	SIOCBRDGGPRI                      = 0xc0146950
 	SIOCBRDGGRL                       = 0xc030694f
-	SIOCBRDGGTO                       = 0xc0186946
+	SIOCBRDGGTO                       = 0xc0146946
 	SIOCBRDGIFS                       = 0xc0606942
 	SIOCBRDGRTS                       = 0xc0206943
 	SIOCBRDGSADDR                     = 0xc1286944
-	SIOCBRDGSCACHE                    = 0x80186940
-	SIOCBRDGSFD                       = 0x80186952
-	SIOCBRDGSHT                       = 0x80186951
+	SIOCBRDGSCACHE                    = 0x80146940
+	SIOCBRDGSFD                       = 0x80146952
+	SIOCBRDGSHT                       = 0x80146951
 	SIOCBRDGSIFCOST                   = 0x80606955
 	SIOCBRDGSIFFLGS                   = 0x8060693f
 	SIOCBRDGSIFPRIO                   = 0x80606954
 	SIOCBRDGSIFPROT                   = 0x8060694a
-	SIOCBRDGSMA                       = 0x80186953
-	SIOCBRDGSPRI                      = 0x80186950
-	SIOCBRDGSPROTO                    = 0x8018695a
-	SIOCBRDGSTO                       = 0x80186945
-	SIOCBRDGSTXHC                     = 0x80186959
+	SIOCBRDGSMA                       = 0x80146953
+	SIOCBRDGSPRI                      = 0x80146950
+	SIOCBRDGSPROTO                    = 0x8014695a
+	SIOCBRDGSTO                       = 0x80146945
+	SIOCBRDGSTXHC                     = 0x80146959
 	SIOCDELLABEL                      = 0x80206997
 	SIOCDELMULTI                      = 0x80206932
 	SIOCDIFADDR                       = 0x80206919
@@ -1264,6 +1360,7 @@
 	SIOCGPWE3CTRLWORD                 = 0xc02069dc
 	SIOCGPWE3FAT                      = 0xc02069dd
 	SIOCGPWE3NEIGHBOR                 = 0xc21869de
+	SIOCGRXHPRIO                      = 0xc02069db
 	SIOCGSPPPPARAMS                   = 0xc0206994
 	SIOCGTXHPRIO                      = 0xc02069c6
 	SIOCGUMBINFO                      = 0xc02069be
@@ -1310,17 +1407,13 @@
 	SIOCSPWE3CTRLWORD                 = 0x802069dc
 	SIOCSPWE3FAT                      = 0x802069dd
 	SIOCSPWE3NEIGHBOR                 = 0x821869de
+	SIOCSRXHPRIO                      = 0x802069db
 	SIOCSSPPPPARAMS                   = 0x80206993
 	SIOCSTXHPRIO                      = 0x802069c5
 	SIOCSUMBPARAM                     = 0x802069bf
 	SIOCSVH                           = 0xc02069f5
 	SIOCSVNETFLOWID                   = 0x802069c3
 	SIOCSVNETID                       = 0x802069a6
-	SIOCSWGDPID                       = 0xc018695b
-	SIOCSWGMAXFLOW                    = 0xc0186960
-	SIOCSWGMAXGROUP                   = 0xc018695d
-	SIOCSWSDPID                       = 0x8018695c
-	SIOCSWSPORTNO                     = 0xc060695f
 	SOCK_CLOEXEC                      = 0x8000
 	SOCK_DGRAM                        = 0x2
 	SOCK_DNS                          = 0x1000
@@ -1335,6 +1428,7 @@
 	SO_BINDANY                        = 0x1000
 	SO_BROADCAST                      = 0x20
 	SO_DEBUG                          = 0x1
+	SO_DOMAIN                         = 0x1024
 	SO_DONTROUTE                      = 0x10
 	SO_ERROR                          = 0x1007
 	SO_KEEPALIVE                      = 0x8
@@ -1342,6 +1436,7 @@
 	SO_NETPROC                        = 0x1020
 	SO_OOBINLINE                      = 0x100
 	SO_PEERCRED                       = 0x1022
+	SO_PROTOCOL                       = 0x1025
 	SO_RCVBUF                         = 0x1002
 	SO_RCVLOWAT                       = 0x1004
 	SO_RCVTIMEO                       = 0x1006
@@ -1391,7 +1486,18 @@
 	TCOFLUSH                          = 0x2
 	TCOOFF                            = 0x1
 	TCOON                             = 0x2
-	TCP_MAXBURST                      = 0x4
+	TCPOPT_EOL                        = 0x0
+	TCPOPT_MAXSEG                     = 0x2
+	TCPOPT_NOP                        = 0x1
+	TCPOPT_SACK                       = 0x5
+	TCPOPT_SACK_HDR                   = 0x1010500
+	TCPOPT_SACK_PERMITTED             = 0x4
+	TCPOPT_SACK_PERMIT_HDR            = 0x1010402
+	TCPOPT_SIGNATURE                  = 0x13
+	TCPOPT_TIMESTAMP                  = 0x8
+	TCPOPT_TSTAMP_HDR                 = 0x101080a
+	TCPOPT_WINDOW                     = 0x3
+	TCP_INFO                          = 0x9
 	TCP_MAXSEG                        = 0x2
 	TCP_MAXWIN                        = 0xffff
 	TCP_MAX_SACK                      = 0x3
@@ -1400,6 +1506,7 @@
 	TCP_MSS                           = 0x200
 	TCP_NODELAY                       = 0x1
 	TCP_NOPUSH                        = 0x10
+	TCP_SACKHOLE_LIMIT                = 0x80
 	TCP_SACK_ENABLE                   = 0x8
 	TCSAFLUSH                         = 0x2
 	TIMER_ABSTIME                     = 0x1
@@ -1768,7 +1875,7 @@
 	{3, "SIGQUIT", "quit"},
 	{4, "SIGILL", "illegal instruction"},
 	{5, "SIGTRAP", "trace/BPT trap"},
-	{6, "SIGABRT", "abort trap"},
+	{6, "SIGIOT", "abort trap"},
 	{7, "SIGEMT", "EMT trap"},
 	{8, "SIGFPE", "floating point exception"},
 	{9, "SIGKILL", "killed"},
@@ -1795,4 +1902,5 @@
 	{30, "SIGUSR1", "user defined signal 1"},
 	{31, "SIGUSR2", "user defined signal 2"},
 	{32, "SIGTHR", "thread AST"},
+	{28672, "SIGSTKSZ", "unknown signal"},
 }
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_openbsd_mips64.go b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_openbsd_mips64.go
index f1154ff..03d90fe 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_openbsd_mips64.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_openbsd_mips64.go
@@ -112,6 +112,12 @@
 	BPF_FILDROP_CAPTURE               = 0x1
 	BPF_FILDROP_DROP                  = 0x2
 	BPF_FILDROP_PASS                  = 0x0
+	BPF_F_DIR_IN                      = 0x10
+	BPF_F_DIR_MASK                    = 0x30
+	BPF_F_DIR_OUT                     = 0x20
+	BPF_F_DIR_SHIFT                   = 0x4
+	BPF_F_FLOWID                      = 0x8
+	BPF_F_PRI_MASK                    = 0x7
 	BPF_H                             = 0x8
 	BPF_IMM                           = 0x0
 	BPF_IND                           = 0x40
@@ -140,6 +146,7 @@
 	BPF_OR                            = 0x40
 	BPF_RELEASE                       = 0x30bb6
 	BPF_RET                           = 0x6
+	BPF_RND                           = 0xc0
 	BPF_RSH                           = 0x70
 	BPF_ST                            = 0x2
 	BPF_STX                           = 0x3
@@ -301,6 +308,8 @@
 	EMUL_ENABLED                      = 0x1
 	EMUL_NATIVE                       = 0x2
 	ENDRUNDISC                        = 0x9
+	ETH64_8021_RSVD_MASK              = 0xfffffffffff0
+	ETH64_8021_RSVD_PREFIX            = 0x180c2000000
 	ETHERMIN                          = 0x2e
 	ETHERMTU                          = 0x5dc
 	ETHERTYPE_8023                    = 0x4
@@ -353,6 +362,7 @@
 	ETHERTYPE_DN                      = 0x6003
 	ETHERTYPE_DOGFIGHT                = 0x1989
 	ETHERTYPE_DSMD                    = 0x8039
+	ETHERTYPE_EAPOL                   = 0x888e
 	ETHERTYPE_ECMA                    = 0x803
 	ETHERTYPE_ENCRYPT                 = 0x803d
 	ETHERTYPE_ES                      = 0x805d
@@ -413,15 +423,16 @@
 	ETHERTYPE_NCD                     = 0x8149
 	ETHERTYPE_NESTAR                  = 0x8006
 	ETHERTYPE_NETBEUI                 = 0x8191
+	ETHERTYPE_NHRP                    = 0x2001
 	ETHERTYPE_NOVELL                  = 0x8138
 	ETHERTYPE_NS                      = 0x600
 	ETHERTYPE_NSAT                    = 0x601
 	ETHERTYPE_NSCOMPAT                = 0x807
+	ETHERTYPE_NSH                     = 0x984f
 	ETHERTYPE_NTRAILER                = 0x10
 	ETHERTYPE_OS9                     = 0x7007
 	ETHERTYPE_OS9NET                  = 0x7009
 	ETHERTYPE_PACER                   = 0x80c6
-	ETHERTYPE_PAE                     = 0x888e
 	ETHERTYPE_PBB                     = 0x88e7
 	ETHERTYPE_PCS                     = 0x4242
 	ETHERTYPE_PLANNING                = 0x8044
@@ -504,10 +515,11 @@
 	ETHER_VLAN_ENCAP_LEN              = 0x4
 	EVFILT_AIO                        = -0x3
 	EVFILT_DEVICE                     = -0x8
+	EVFILT_EXCEPT                     = -0x9
 	EVFILT_PROC                       = -0x5
 	EVFILT_READ                       = -0x1
 	EVFILT_SIGNAL                     = -0x6
-	EVFILT_SYSCOUNT                   = 0x8
+	EVFILT_SYSCOUNT                   = 0x9
 	EVFILT_TIMER                      = -0x7
 	EVFILT_VNODE                      = -0x4
 	EVFILT_WRITE                      = -0x2
@@ -529,7 +541,7 @@
 	EV_FLAG1                          = 0x2000
 	EV_ONESHOT                        = 0x10
 	EV_RECEIPT                        = 0x40
-	EV_SYSFLAGS                       = 0xf000
+	EV_SYSFLAGS                       = 0xf800
 	EXTA                              = 0x4b00
 	EXTB                              = 0x9600
 	EXTPROC                           = 0x800
@@ -795,6 +807,7 @@
 	IFT_VOICEOVERCABLE                = 0xc6
 	IFT_VOICEOVERFRAMERELAY           = 0x99
 	IFT_VOICEOVERIP                   = 0x68
+	IFT_WIREGUARD                     = 0xfb
 	IFT_X213                          = 0x5d
 	IFT_X25                           = 0x5
 	IFT_X25DDN                        = 0x4
@@ -860,6 +873,7 @@
 	IPPROTO_RAW                       = 0xff
 	IPPROTO_ROUTING                   = 0x2b
 	IPPROTO_RSVP                      = 0x2e
+	IPPROTO_SCTP                      = 0x84
 	IPPROTO_TCP                       = 0x6
 	IPPROTO_TP                        = 0x1d
 	IPPROTO_UDP                       = 0x11
@@ -970,6 +984,9 @@
 	IP_TTL                            = 0x4
 	ISIG                              = 0x80
 	ISTRIP                            = 0x20
+	ITIMER_PROF                       = 0x2
+	ITIMER_REAL                       = 0x0
+	ITIMER_VIRTUAL                    = 0x1
 	IUCLC                             = 0x1000
 	IXANY                             = 0x800
 	IXOFF                             = 0x400
@@ -1041,6 +1058,19 @@
 	MNT_WAIT                          = 0x1
 	MNT_WANTRDWR                      = 0x2000000
 	MNT_WXALLOWED                     = 0x800
+	MOUNT_AFS                         = "afs"
+	MOUNT_CD9660                      = "cd9660"
+	MOUNT_EXT2FS                      = "ext2fs"
+	MOUNT_FFS                         = "ffs"
+	MOUNT_FUSEFS                      = "fuse"
+	MOUNT_MFS                         = "mfs"
+	MOUNT_MSDOS                       = "msdos"
+	MOUNT_NCPFS                       = "ncpfs"
+	MOUNT_NFS                         = "nfs"
+	MOUNT_NTFS                        = "ntfs"
+	MOUNT_TMPFS                       = "tmpfs"
+	MOUNT_UDF                         = "udf"
+	MOUNT_UFS                         = "ffs"
 	MSG_BCAST                         = 0x100
 	MSG_CMSG_CLOEXEC                  = 0x800
 	MSG_CTRUNC                        = 0x20
@@ -1053,6 +1083,7 @@
 	MSG_PEEK                          = 0x2
 	MSG_TRUNC                         = 0x10
 	MSG_WAITALL                       = 0x40
+	MSG_WAITFORONE                    = 0x1000
 	MS_ASYNC                          = 0x1
 	MS_INVALIDATE                     = 0x4
 	MS_SYNC                           = 0x2
@@ -1061,7 +1092,8 @@
 	NET_RT_FLAGS                      = 0x2
 	NET_RT_IFLIST                     = 0x3
 	NET_RT_IFNAMES                    = 0x6
-	NET_RT_MAXID                      = 0x7
+	NET_RT_MAXID                      = 0x8
+	NET_RT_SOURCE                     = 0x7
 	NET_RT_STATS                      = 0x4
 	NET_RT_TABLE                      = 0x5
 	NFDBITS                           = 0x20
@@ -1078,6 +1110,7 @@
 	NOTE_FORK                         = 0x40000000
 	NOTE_LINK                         = 0x10
 	NOTE_LOWAT                        = 0x1
+	NOTE_OOB                          = 0x4
 	NOTE_PCTRLMASK                    = 0xf0000000
 	NOTE_PDATAMASK                    = 0xfffff
 	NOTE_RENAME                       = 0x20
@@ -1214,7 +1247,7 @@
 	RTM_PROPOSAL                      = 0x13
 	RTM_REDIRECT                      = 0x6
 	RTM_RESOLVE                       = 0xb
-	RTM_RTTUNIT                       = 0xf4240
+	RTM_SOURCE                        = 0x16
 	RTM_VERSION                       = 0x5
 	RTV_EXPIRE                        = 0x4
 	RTV_HOPCOUNT                      = 0x2
@@ -1232,6 +1265,9 @@
 	RUSAGE_THREAD                     = 0x1
 	SCM_RIGHTS                        = 0x1
 	SCM_TIMESTAMP                     = 0x4
+	SEEK_CUR                          = 0x1
+	SEEK_END                          = 0x2
+	SEEK_SET                          = 0x0
 	SHUT_RD                           = 0x0
 	SHUT_RDWR                         = 0x2
 	SHUT_WR                           = 0x1
@@ -1248,30 +1284,30 @@
 	SIOCBRDGDELS                      = 0x80606942
 	SIOCBRDGFLUSH                     = 0x80606948
 	SIOCBRDGFRL                       = 0x808c694e
-	SIOCBRDGGCACHE                    = 0xc0186941
-	SIOCBRDGGFD                       = 0xc0186952
-	SIOCBRDGGHT                       = 0xc0186951
+	SIOCBRDGGCACHE                    = 0xc0146941
+	SIOCBRDGGFD                       = 0xc0146952
+	SIOCBRDGGHT                       = 0xc0146951
 	SIOCBRDGGIFFLGS                   = 0xc060693e
-	SIOCBRDGGMA                       = 0xc0186953
+	SIOCBRDGGMA                       = 0xc0146953
 	SIOCBRDGGPARAM                    = 0xc0406958
-	SIOCBRDGGPRI                      = 0xc0186950
+	SIOCBRDGGPRI                      = 0xc0146950
 	SIOCBRDGGRL                       = 0xc030694f
-	SIOCBRDGGTO                       = 0xc0186946
+	SIOCBRDGGTO                       = 0xc0146946
 	SIOCBRDGIFS                       = 0xc0606942
 	SIOCBRDGRTS                       = 0xc0206943
 	SIOCBRDGSADDR                     = 0xc1286944
-	SIOCBRDGSCACHE                    = 0x80186940
-	SIOCBRDGSFD                       = 0x80186952
-	SIOCBRDGSHT                       = 0x80186951
+	SIOCBRDGSCACHE                    = 0x80146940
+	SIOCBRDGSFD                       = 0x80146952
+	SIOCBRDGSHT                       = 0x80146951
 	SIOCBRDGSIFCOST                   = 0x80606955
 	SIOCBRDGSIFFLGS                   = 0x8060693f
 	SIOCBRDGSIFPRIO                   = 0x80606954
 	SIOCBRDGSIFPROT                   = 0x8060694a
-	SIOCBRDGSMA                       = 0x80186953
-	SIOCBRDGSPRI                      = 0x80186950
-	SIOCBRDGSPROTO                    = 0x8018695a
-	SIOCBRDGSTO                       = 0x80186945
-	SIOCBRDGSTXHC                     = 0x80186959
+	SIOCBRDGSMA                       = 0x80146953
+	SIOCBRDGSPRI                      = 0x80146950
+	SIOCBRDGSPROTO                    = 0x8014695a
+	SIOCBRDGSTO                       = 0x80146945
+	SIOCBRDGSTXHC                     = 0x80146959
 	SIOCDELLABEL                      = 0x80206997
 	SIOCDELMULTI                      = 0x80206932
 	SIOCDIFADDR                       = 0x80206919
@@ -1378,11 +1414,6 @@
 	SIOCSVH                           = 0xc02069f5
 	SIOCSVNETFLOWID                   = 0x802069c3
 	SIOCSVNETID                       = 0x802069a6
-	SIOCSWGDPID                       = 0xc018695b
-	SIOCSWGMAXFLOW                    = 0xc0186960
-	SIOCSWGMAXGROUP                   = 0xc018695d
-	SIOCSWSDPID                       = 0x8018695c
-	SIOCSWSPORTNO                     = 0xc060695f
 	SOCK_CLOEXEC                      = 0x8000
 	SOCK_DGRAM                        = 0x2
 	SOCK_DNS                          = 0x1000
@@ -1455,7 +1486,18 @@
 	TCOFLUSH                          = 0x2
 	TCOOFF                            = 0x1
 	TCOON                             = 0x2
-	TCP_MAXBURST                      = 0x4
+	TCPOPT_EOL                        = 0x0
+	TCPOPT_MAXSEG                     = 0x2
+	TCPOPT_NOP                        = 0x1
+	TCPOPT_SACK                       = 0x5
+	TCPOPT_SACK_HDR                   = 0x1010500
+	TCPOPT_SACK_PERMITTED             = 0x4
+	TCPOPT_SACK_PERMIT_HDR            = 0x1010402
+	TCPOPT_SIGNATURE                  = 0x13
+	TCPOPT_TIMESTAMP                  = 0x8
+	TCPOPT_TSTAMP_HDR                 = 0x101080a
+	TCPOPT_WINDOW                     = 0x3
+	TCP_INFO                          = 0x9
 	TCP_MAXSEG                        = 0x2
 	TCP_MAXWIN                        = 0xffff
 	TCP_MAX_SACK                      = 0x3
@@ -1833,7 +1875,7 @@
 	{3, "SIGQUIT", "quit"},
 	{4, "SIGILL", "illegal instruction"},
 	{5, "SIGTRAP", "trace/BPT trap"},
-	{6, "SIGABRT", "abort trap"},
+	{6, "SIGIOT", "abort trap"},
 	{7, "SIGEMT", "EMT trap"},
 	{8, "SIGFPE", "floating point exception"},
 	{9, "SIGKILL", "killed"},
@@ -1860,4 +1902,5 @@
 	{30, "SIGUSR1", "user defined signal 1"},
 	{31, "SIGUSR2", "user defined signal 2"},
 	{32, "SIGTHR", "thread AST"},
+	{81920, "SIGSTKSZ", "unknown signal"},
 }
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zptrace_armnn_linux.go b/src/cmd/vendor/golang.org/x/sys/unix/zptrace_armnn_linux.go
index bd001a6..97f20ca 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zptrace_armnn_linux.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zptrace_armnn_linux.go
@@ -15,12 +15,12 @@
 
 // PtraceGetRegsArm fetches the registers used by arm binaries.
 func PtraceGetRegsArm(pid int, regsout *PtraceRegsArm) error {
-	return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout)))
+	return ptracePtr(PTRACE_GETREGS, pid, 0, unsafe.Pointer(regsout))
 }
 
 // PtraceSetRegsArm sets the registers used by arm binaries.
 func PtraceSetRegsArm(pid int, regs *PtraceRegsArm) error {
-	return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs)))
+	return ptracePtr(PTRACE_SETREGS, pid, 0, unsafe.Pointer(regs))
 }
 
 // PtraceRegsArm64 is the registers used by arm64 binaries.
@@ -33,10 +33,10 @@
 
 // PtraceGetRegsArm64 fetches the registers used by arm64 binaries.
 func PtraceGetRegsArm64(pid int, regsout *PtraceRegsArm64) error {
-	return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout)))
+	return ptracePtr(PTRACE_GETREGS, pid, 0, unsafe.Pointer(regsout))
 }
 
 // PtraceSetRegsArm64 sets the registers used by arm64 binaries.
 func PtraceSetRegsArm64(pid int, regs *PtraceRegsArm64) error {
-	return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs)))
+	return ptracePtr(PTRACE_SETREGS, pid, 0, unsafe.Pointer(regs))
 }
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zptrace_linux_arm64.go b/src/cmd/vendor/golang.org/x/sys/unix/zptrace_linux_arm64.go
index 6cb6d68..834d285 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zptrace_linux_arm64.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zptrace_linux_arm64.go
@@ -7,11 +7,11 @@
 // PtraceGetRegSetArm64 fetches the registers used by arm64 binaries.
 func PtraceGetRegSetArm64(pid, addr int, regsout *PtraceRegsArm64) error {
 	iovec := Iovec{(*byte)(unsafe.Pointer(regsout)), uint64(unsafe.Sizeof(*regsout))}
-	return ptrace(PTRACE_GETREGSET, pid, uintptr(addr), uintptr(unsafe.Pointer(&iovec)))
+	return ptracePtr(PTRACE_GETREGSET, pid, uintptr(addr), unsafe.Pointer(&iovec))
 }
 
 // PtraceSetRegSetArm64 sets the registers used by arm64 binaries.
 func PtraceSetRegSetArm64(pid, addr int, regs *PtraceRegsArm64) error {
 	iovec := Iovec{(*byte)(unsafe.Pointer(regs)), uint64(unsafe.Sizeof(*regs))}
-	return ptrace(PTRACE_SETREGSET, pid, uintptr(addr), uintptr(unsafe.Pointer(&iovec)))
+	return ptracePtr(PTRACE_SETREGSET, pid, uintptr(addr), unsafe.Pointer(&iovec))
 }
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zptrace_mipsnn_linux.go b/src/cmd/vendor/golang.org/x/sys/unix/zptrace_mipsnn_linux.go
index c34d063..0b5f794 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zptrace_mipsnn_linux.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zptrace_mipsnn_linux.go
@@ -21,12 +21,12 @@
 
 // PtraceGetRegsMips fetches the registers used by mips binaries.
 func PtraceGetRegsMips(pid int, regsout *PtraceRegsMips) error {
-	return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout)))
+	return ptracePtr(PTRACE_GETREGS, pid, 0, unsafe.Pointer(regsout))
 }
 
 // PtraceSetRegsMips sets the registers used by mips binaries.
 func PtraceSetRegsMips(pid int, regs *PtraceRegsMips) error {
-	return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs)))
+	return ptracePtr(PTRACE_SETREGS, pid, 0, unsafe.Pointer(regs))
 }
 
 // PtraceRegsMips64 is the registers used by mips64 binaries.
@@ -42,10 +42,10 @@
 
 // PtraceGetRegsMips64 fetches the registers used by mips64 binaries.
 func PtraceGetRegsMips64(pid int, regsout *PtraceRegsMips64) error {
-	return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout)))
+	return ptracePtr(PTRACE_GETREGS, pid, 0, unsafe.Pointer(regsout))
 }
 
 // PtraceSetRegsMips64 sets the registers used by mips64 binaries.
 func PtraceSetRegsMips64(pid int, regs *PtraceRegsMips64) error {
-	return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs)))
+	return ptracePtr(PTRACE_SETREGS, pid, 0, unsafe.Pointer(regs))
 }
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zptrace_mipsnnle_linux.go b/src/cmd/vendor/golang.org/x/sys/unix/zptrace_mipsnnle_linux.go
index 3ccf0c0..2807f7e 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zptrace_mipsnnle_linux.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zptrace_mipsnnle_linux.go
@@ -21,12 +21,12 @@
 
 // PtraceGetRegsMipsle fetches the registers used by mipsle binaries.
 func PtraceGetRegsMipsle(pid int, regsout *PtraceRegsMipsle) error {
-	return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout)))
+	return ptracePtr(PTRACE_GETREGS, pid, 0, unsafe.Pointer(regsout))
 }
 
 // PtraceSetRegsMipsle sets the registers used by mipsle binaries.
 func PtraceSetRegsMipsle(pid int, regs *PtraceRegsMipsle) error {
-	return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs)))
+	return ptracePtr(PTRACE_SETREGS, pid, 0, unsafe.Pointer(regs))
 }
 
 // PtraceRegsMips64le is the registers used by mips64le binaries.
@@ -42,10 +42,10 @@
 
 // PtraceGetRegsMips64le fetches the registers used by mips64le binaries.
 func PtraceGetRegsMips64le(pid int, regsout *PtraceRegsMips64le) error {
-	return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout)))
+	return ptracePtr(PTRACE_GETREGS, pid, 0, unsafe.Pointer(regsout))
 }
 
 // PtraceSetRegsMips64le sets the registers used by mips64le binaries.
 func PtraceSetRegsMips64le(pid int, regs *PtraceRegsMips64le) error {
-	return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs)))
+	return ptracePtr(PTRACE_SETREGS, pid, 0, unsafe.Pointer(regs))
 }
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zptrace_x86_linux.go b/src/cmd/vendor/golang.org/x/sys/unix/zptrace_x86_linux.go
index 7d65857..281ea64 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zptrace_x86_linux.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zptrace_x86_linux.go
@@ -31,12 +31,12 @@
 
 // PtraceGetRegs386 fetches the registers used by 386 binaries.
 func PtraceGetRegs386(pid int, regsout *PtraceRegs386) error {
-	return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout)))
+	return ptracePtr(PTRACE_GETREGS, pid, 0, unsafe.Pointer(regsout))
 }
 
 // PtraceSetRegs386 sets the registers used by 386 binaries.
 func PtraceSetRegs386(pid int, regs *PtraceRegs386) error {
-	return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs)))
+	return ptracePtr(PTRACE_SETREGS, pid, 0, unsafe.Pointer(regs))
 }
 
 // PtraceRegsAmd64 is the registers used by amd64 binaries.
@@ -72,10 +72,10 @@
 
 // PtraceGetRegsAmd64 fetches the registers used by amd64 binaries.
 func PtraceGetRegsAmd64(pid int, regsout *PtraceRegsAmd64) error {
-	return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout)))
+	return ptracePtr(PTRACE_GETREGS, pid, 0, unsafe.Pointer(regsout))
 }
 
 // PtraceSetRegsAmd64 sets the registers used by amd64 binaries.
 func PtraceSetRegsAmd64(pid int, regs *PtraceRegsAmd64) error {
-	return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs)))
+	return ptracePtr(PTRACE_SETREGS, pid, 0, unsafe.Pointer(regs))
 }
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go
index 870215d..9a25721 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go
@@ -124,7 +124,6 @@
 unsigned long long getsystemcfg(int);
 int umount(uintptr_t);
 int getrlimit64(int, uintptr_t);
-int setrlimit64(int, uintptr_t);
 long long lseek64(int, long long, int);
 uintptr_t mmap(uintptr_t, uintptr_t, int, int, int, long long);
 
@@ -213,7 +212,7 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func ioctl(fd int, req uint, arg uintptr) (err error) {
+func ioctl(fd int, req int, arg uintptr) (err error) {
 	r0, er := C.ioctl(C.int(fd), C.int(req), C.uintptr_t(arg))
 	if r0 == -1 && er != nil {
 		err = er
@@ -223,6 +222,16 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func ioctlPtr(fd int, req int, arg unsafe.Pointer) (err error) {
+	r0, er := C.ioctl(C.int(fd), C.int(req), C.uintptr_t(uintptr(arg)))
+	if r0 == -1 && er != nil {
+		err = er
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func FcntlInt(fd uintptr, cmd int, arg int) (r int, err error) {
 	r0, er := C.fcntl(C.uintptr_t(fd), C.int(cmd), C.uintptr_t(arg))
 	r = int(r0)
@@ -1454,16 +1463,6 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Setrlimit(resource int, rlim *Rlimit) (err error) {
-	r0, er := C.setrlimit64(C.int(resource), C.uintptr_t(uintptr(unsafe.Pointer(rlim))))
-	if r0 == -1 && er != nil {
-		err = er
-	}
-	return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func Seek(fd int, offset int64, whence int) (off int64, err error) {
 	r0, er := C.lseek64(C.int(fd), C.longlong(offset), C.int(whence))
 	off = int64(r0)
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go
index a89b0bf..6de80c2 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go
@@ -93,8 +93,18 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func ioctl(fd int, req uint, arg uintptr) (err error) {
-	_, e1 := callioctl(fd, int(req), arg)
+func ioctl(fd int, req int, arg uintptr) (err error) {
+	_, e1 := callioctl(fd, req, arg)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func ioctlPtr(fd int, req int, arg unsafe.Pointer) (err error) {
+	_, e1 := callioctl_ptr(fd, req, arg)
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
@@ -1412,16 +1422,6 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Setrlimit(resource int, rlim *Rlimit) (err error) {
-	_, e1 := callsetrlimit(resource, uintptr(unsafe.Pointer(rlim)))
-	if e1 != 0 {
-		err = errnoErr(e1)
-	}
-	return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func Seek(fd int, offset int64, whence int) (off int64, err error) {
 	r0, e1 := calllseek(fd, offset, whence)
 	off = int64(r0)
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gc.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gc.go
index 2caa5ad..c4d50ae 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gc.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gc.go
@@ -124,7 +124,6 @@
 //go:cgo_import_dynamic libc_getsystemcfg getsystemcfg "libc.a/shr_64.o"
 //go:cgo_import_dynamic libc_umount umount "libc.a/shr_64.o"
 //go:cgo_import_dynamic libc_getrlimit getrlimit "libc.a/shr_64.o"
-//go:cgo_import_dynamic libc_setrlimit setrlimit "libc.a/shr_64.o"
 //go:cgo_import_dynamic libc_lseek lseek "libc.a/shr_64.o"
 //go:cgo_import_dynamic libc_mmap64 mmap64 "libc.a/shr_64.o"
 
@@ -242,7 +241,6 @@
 //go:linkname libc_getsystemcfg libc_getsystemcfg
 //go:linkname libc_umount libc_umount
 //go:linkname libc_getrlimit libc_getrlimit
-//go:linkname libc_setrlimit libc_setrlimit
 //go:linkname libc_lseek libc_lseek
 //go:linkname libc_mmap64 libc_mmap64
 
@@ -363,7 +361,6 @@
 	libc_getsystemcfg,
 	libc_umount,
 	libc_getrlimit,
-	libc_setrlimit,
 	libc_lseek,
 	libc_mmap64 syscallFunc
 )
@@ -423,6 +420,13 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func callioctl_ptr(fd int, req int, arg unsafe.Pointer) (r1 uintptr, e1 Errno) {
+	r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_ioctl)), 3, uintptr(fd), uintptr(req), uintptr(arg), 0, 0, 0)
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func callfcntl(fd uintptr, cmd int, arg uintptr) (r1 uintptr, e1 Errno) {
 	r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_fcntl)), 3, fd, uintptr(cmd), arg, 0, 0, 0)
 	return
@@ -1172,13 +1176,6 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func callsetrlimit(resource int, rlim uintptr) (r1 uintptr, e1 Errno) {
-	r1, _, e1 = rawSyscall6(uintptr(unsafe.Pointer(&libc_setrlimit)), 2, uintptr(resource), rlim, 0, 0, 0, 0)
-	return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func calllseek(fd int, offset int64, whence int) (r1 uintptr, e1 Errno) {
 	r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_lseek)), 3, uintptr(fd), uintptr(offset), uintptr(whence), 0, 0, 0)
 	return
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gccgo.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gccgo.go
index 944a714..6903d3b 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gccgo.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gccgo.go
@@ -123,7 +123,6 @@
 unsigned long long getsystemcfg(int);
 int umount(uintptr_t);
 int getrlimit(int, uintptr_t);
-int setrlimit(int, uintptr_t);
 long long lseek(int, long long, int);
 uintptr_t mmap64(uintptr_t, uintptr_t, int, int, int, long long);
 
@@ -131,6 +130,7 @@
 import "C"
 import (
 	"syscall"
+	"unsafe"
 )
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
@@ -191,6 +191,14 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func callioctl_ptr(fd int, req int, arg unsafe.Pointer) (r1 uintptr, e1 Errno) {
+	r1 = uintptr(C.ioctl(C.int(fd), C.int(req), C.uintptr_t(uintptr(arg))))
+	e1 = syscall.GetErrno()
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func callfcntl(fd uintptr, cmd int, arg uintptr) (r1 uintptr, e1 Errno) {
 	r1 = uintptr(C.fcntl(C.uintptr_t(fd), C.int(cmd), C.uintptr_t(arg)))
 	e1 = syscall.GetErrno()
@@ -1047,14 +1055,6 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func callsetrlimit(resource int, rlim uintptr) (r1 uintptr, e1 Errno) {
-	r1 = uintptr(C.setrlimit(C.int(resource), C.uintptr_t(rlim)))
-	e1 = syscall.GetErrno()
-	return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func calllseek(fd int, offset int64, whence int) (r1 uintptr, e1 Errno) {
 	r1 = uintptr(C.lseek(C.int(fd), C.longlong(offset), C.int(whence)))
 	e1 = syscall.GetErrno()
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go
index c2461c4..4037ccf 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go
@@ -725,6 +725,14 @@
 	return
 }
 
+func ioctlPtr(fd int, req uint, arg unsafe.Pointer) (err error) {
+	_, _, e1 := syscall_syscall(libc_ioctl_trampoline_addr, uintptr(fd), uintptr(req), uintptr(arg))
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
 var libc_ioctl_trampoline_addr uintptr
 
 //go:cgo_import_dynamic libc_ioctl ioctl "/usr/lib/libSystem.B.dylib"
@@ -1984,6 +1992,31 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func Setattrlist(path string, attrlist *Attrlist, attrBuf []byte, options int) (err error) {
+	var _p0 *byte
+	_p0, err = BytePtrFromString(path)
+	if err != nil {
+		return
+	}
+	var _p1 unsafe.Pointer
+	if len(attrBuf) > 0 {
+		_p1 = unsafe.Pointer(&attrBuf[0])
+	} else {
+		_p1 = unsafe.Pointer(&_zero)
+	}
+	_, _, e1 := syscall_syscall6(libc_setattrlist_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(attrlist)), uintptr(_p1), uintptr(len(attrBuf)), uintptr(options), 0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+var libc_setattrlist_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_setattrlist setattrlist "/usr/lib/libSystem.B.dylib"
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func Setegid(egid int) (err error) {
 	_, _, e1 := syscall_syscall(libc_setegid_trampoline_addr, uintptr(egid), 0, 0)
 	if e1 != 0 {
@@ -2115,20 +2148,6 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Setrlimit(which int, lim *Rlimit) (err error) {
-	_, _, e1 := syscall_rawSyscall(libc_setrlimit_trampoline_addr, uintptr(which), uintptr(unsafe.Pointer(lim)), 0)
-	if e1 != 0 {
-		err = errnoErr(e1)
-	}
-	return
-}
-
-var libc_setrlimit_trampoline_addr uintptr
-
-//go:cgo_import_dynamic libc_setrlimit setrlimit "/usr/lib/libSystem.B.dylib"
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func Setsid() (pid int, err error) {
 	r0, _, e1 := syscall_rawSyscall(libc_setsid_trampoline_addr, 0, 0, 0)
 	pid = int(r0)
@@ -2502,6 +2521,14 @@
 	return
 }
 
+func ptrace1Ptr(request int, pid int, addr uintptr, data unsafe.Pointer) (err error) {
+	_, _, e1 := syscall_syscall6(libc_ptrace_trampoline_addr, uintptr(request), uintptr(pid), addr, uintptr(data), 0, 0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
 var libc_ptrace_trampoline_addr uintptr
 
 //go:cgo_import_dynamic libc_ptrace ptrace "/usr/lib/libSystem.B.dylib"
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s
index 95fe4c0..4baaed0 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s
@@ -705,6 +705,11 @@
 GLOBL	·libc_select_trampoline_addr(SB), RODATA, $8
 DATA	·libc_select_trampoline_addr(SB)/8, $libc_select_trampoline<>(SB)
 
+TEXT libc_setattrlist_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_setattrlist(SB)
+GLOBL	·libc_setattrlist_trampoline_addr(SB), RODATA, $8
+DATA	·libc_setattrlist_trampoline_addr(SB)/8, $libc_setattrlist_trampoline<>(SB)
+
 TEXT libc_setegid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setegid(SB)
 
@@ -759,12 +764,6 @@
 GLOBL	·libc_setreuid_trampoline_addr(SB), RODATA, $8
 DATA	·libc_setreuid_trampoline_addr(SB)/8, $libc_setreuid_trampoline<>(SB)
 
-TEXT libc_setrlimit_trampoline<>(SB),NOSPLIT,$0-0
-	JMP	libc_setrlimit(SB)
-
-GLOBL	·libc_setrlimit_trampoline_addr(SB), RODATA, $8
-DATA	·libc_setrlimit_trampoline_addr(SB)/8, $libc_setrlimit_trampoline<>(SB)
-
 TEXT libc_setsid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setsid(SB)
 
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go
index 26a0fdc..51d6f3f 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go
@@ -725,6 +725,14 @@
 	return
 }
 
+func ioctlPtr(fd int, req uint, arg unsafe.Pointer) (err error) {
+	_, _, e1 := syscall_syscall(libc_ioctl_trampoline_addr, uintptr(fd), uintptr(req), uintptr(arg))
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
 var libc_ioctl_trampoline_addr uintptr
 
 //go:cgo_import_dynamic libc_ioctl ioctl "/usr/lib/libSystem.B.dylib"
@@ -1984,6 +1992,31 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func Setattrlist(path string, attrlist *Attrlist, attrBuf []byte, options int) (err error) {
+	var _p0 *byte
+	_p0, err = BytePtrFromString(path)
+	if err != nil {
+		return
+	}
+	var _p1 unsafe.Pointer
+	if len(attrBuf) > 0 {
+		_p1 = unsafe.Pointer(&attrBuf[0])
+	} else {
+		_p1 = unsafe.Pointer(&_zero)
+	}
+	_, _, e1 := syscall_syscall6(libc_setattrlist_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(attrlist)), uintptr(_p1), uintptr(len(attrBuf)), uintptr(options), 0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+var libc_setattrlist_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_setattrlist setattrlist "/usr/lib/libSystem.B.dylib"
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func Setegid(egid int) (err error) {
 	_, _, e1 := syscall_syscall(libc_setegid_trampoline_addr, uintptr(egid), 0, 0)
 	if e1 != 0 {
@@ -2115,20 +2148,6 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Setrlimit(which int, lim *Rlimit) (err error) {
-	_, _, e1 := syscall_rawSyscall(libc_setrlimit_trampoline_addr, uintptr(which), uintptr(unsafe.Pointer(lim)), 0)
-	if e1 != 0 {
-		err = errnoErr(e1)
-	}
-	return
-}
-
-var libc_setrlimit_trampoline_addr uintptr
-
-//go:cgo_import_dynamic libc_setrlimit setrlimit "/usr/lib/libSystem.B.dylib"
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func Setsid() (pid int, err error) {
 	r0, _, e1 := syscall_rawSyscall(libc_setsid_trampoline_addr, 0, 0, 0)
 	pid = int(r0)
@@ -2502,6 +2521,14 @@
 	return
 }
 
+func ptrace1Ptr(request int, pid int, addr uintptr, data unsafe.Pointer) (err error) {
+	_, _, e1 := syscall_syscall6(libc_ptrace_trampoline_addr, uintptr(request), uintptr(pid), addr, uintptr(data), 0, 0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
 var libc_ptrace_trampoline_addr uintptr
 
 //go:cgo_import_dynamic libc_ptrace ptrace "/usr/lib/libSystem.B.dylib"
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s
index efa5b4c..c3b82c0 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s
@@ -705,6 +705,11 @@
 GLOBL	·libc_select_trampoline_addr(SB), RODATA, $8
 DATA	·libc_select_trampoline_addr(SB)/8, $libc_select_trampoline<>(SB)
 
+TEXT libc_setattrlist_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_setattrlist(SB)
+GLOBL	·libc_setattrlist_trampoline_addr(SB), RODATA, $8
+DATA	·libc_setattrlist_trampoline_addr(SB)/8, $libc_setattrlist_trampoline<>(SB)
+
 TEXT libc_setegid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setegid(SB)
 
@@ -759,12 +764,6 @@
 GLOBL	·libc_setreuid_trampoline_addr(SB), RODATA, $8
 DATA	·libc_setreuid_trampoline_addr(SB)/8, $libc_setreuid_trampoline<>(SB)
 
-TEXT libc_setrlimit_trampoline<>(SB),NOSPLIT,$0-0
-	JMP	libc_setrlimit(SB)
-
-GLOBL	·libc_setrlimit_trampoline_addr(SB), RODATA, $8
-DATA	·libc_setrlimit_trampoline_addr(SB)/8, $libc_setrlimit_trampoline<>(SB)
-
 TEXT libc_setsid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setsid(SB)
 
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go
index 1b6eedf..0eabac7 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go
@@ -436,6 +436,16 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func ioctlPtr(fd int, req uint, arg unsafe.Pointer) (err error) {
+	_, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg))
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) {
 	var _p0 unsafe.Pointer
 	if len(mib) > 0 {
@@ -552,6 +562,16 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func ClockGettime(clockid int32, time *Timespec) (err error) {
+	_, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func Close(fd int) (err error) {
 	_, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0)
 	if e1 != 0 {
@@ -1390,16 +1410,6 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Setrlimit(which int, lim *Rlimit) (err error) {
-	_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0)
-	if e1 != 0 {
-		err = errnoErr(e1)
-	}
-	return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func Setsid() (pid int, err error) {
 	r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0)
 	pid = int(r0)
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go
index 039c4aa..ee313eb 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go
@@ -388,6 +388,16 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func ioctlPtr(fd int, req uint, arg unsafe.Pointer) (err error) {
+	_, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg))
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) {
 	var _p0 unsafe.Pointer
 	if len(mib) > 0 {
@@ -414,6 +424,16 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func ptracePtr(request int, pid int, addr unsafe.Pointer, data int) (err error) {
+	_, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func Access(path string, mode uint32) (err error) {
 	var _p0 *byte
 	_p0, err = BytePtrFromString(path)
@@ -544,6 +564,16 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func ClockGettime(clockid int32, time *Timespec) (err error) {
+	_, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func Close(fd int) (err error) {
 	_, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0)
 	if e1 != 0 {
@@ -1615,16 +1645,6 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Setrlimit(which int, lim *Rlimit) (err error) {
-	_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0)
-	if e1 != 0 {
-		err = errnoErr(e1)
-	}
-	return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func Setsid() (pid int, err error) {
 	r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0)
 	pid = int(r0)
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go
index 0535d3c..4c986e4 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go
@@ -388,6 +388,16 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func ioctlPtr(fd int, req uint, arg unsafe.Pointer) (err error) {
+	_, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg))
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) {
 	var _p0 unsafe.Pointer
 	if len(mib) > 0 {
@@ -414,6 +424,16 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func ptracePtr(request int, pid int, addr unsafe.Pointer, data int) (err error) {
+	_, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func Access(path string, mode uint32) (err error) {
 	var _p0 *byte
 	_p0, err = BytePtrFromString(path)
@@ -544,6 +564,16 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func ClockGettime(clockid int32, time *Timespec) (err error) {
+	_, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func Close(fd int) (err error) {
 	_, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0)
 	if e1 != 0 {
@@ -1615,16 +1645,6 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Setrlimit(which int, lim *Rlimit) (err error) {
-	_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0)
-	if e1 != 0 {
-		err = errnoErr(e1)
-	}
-	return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func Setsid() (pid int, err error) {
 	r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0)
 	pid = int(r0)
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go
index 1018b52..5552169 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go
@@ -388,6 +388,16 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func ioctlPtr(fd int, req uint, arg unsafe.Pointer) (err error) {
+	_, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg))
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) {
 	var _p0 unsafe.Pointer
 	if len(mib) > 0 {
@@ -414,6 +424,16 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func ptracePtr(request int, pid int, addr unsafe.Pointer, data int) (err error) {
+	_, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func Access(path string, mode uint32) (err error) {
 	var _p0 *byte
 	_p0, err = BytePtrFromString(path)
@@ -544,6 +564,16 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func ClockGettime(clockid int32, time *Timespec) (err error) {
+	_, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func Close(fd int) (err error) {
 	_, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0)
 	if e1 != 0 {
@@ -1615,16 +1645,6 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Setrlimit(which int, lim *Rlimit) (err error) {
-	_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0)
-	if e1 != 0 {
-		err = errnoErr(e1)
-	}
-	return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func Setsid() (pid int, err error) {
 	r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0)
 	pid = int(r0)
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go
index 3802f4b..67a226f 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go
@@ -388,6 +388,16 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func ioctlPtr(fd int, req uint, arg unsafe.Pointer) (err error) {
+	_, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg))
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) {
 	var _p0 unsafe.Pointer
 	if len(mib) > 0 {
@@ -414,6 +424,16 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func ptracePtr(request int, pid int, addr unsafe.Pointer, data int) (err error) {
+	_, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func Access(path string, mode uint32) (err error) {
 	var _p0 *byte
 	_p0, err = BytePtrFromString(path)
@@ -544,6 +564,16 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func ClockGettime(clockid int32, time *Timespec) (err error) {
+	_, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func Close(fd int) (err error) {
 	_, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0)
 	if e1 != 0 {
@@ -1615,16 +1645,6 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Setrlimit(which int, lim *Rlimit) (err error) {
-	_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0)
-	if e1 != 0 {
-		err = errnoErr(e1)
-	}
-	return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func Setsid() (pid int, err error) {
 	r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0)
 	pid = int(r0)
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_freebsd_riscv64.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_freebsd_riscv64.go
index 8a2db7d..f0b9dda 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_freebsd_riscv64.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_freebsd_riscv64.go
@@ -388,6 +388,16 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func ioctlPtr(fd int, req uint, arg unsafe.Pointer) (err error) {
+	_, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg))
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) {
 	var _p0 unsafe.Pointer
 	if len(mib) > 0 {
@@ -414,6 +424,16 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func ptracePtr(request int, pid int, addr unsafe.Pointer, data int) (err error) {
+	_, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func Access(path string, mode uint32) (err error) {
 	var _p0 *byte
 	_p0, err = BytePtrFromString(path)
@@ -544,6 +564,16 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func ClockGettime(clockid int32, time *Timespec) (err error) {
+	_, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func Close(fd int) (err error) {
 	_, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0)
 	if e1 != 0 {
@@ -1615,16 +1645,6 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Setrlimit(which int, lim *Rlimit) (err error) {
-	_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0)
-	if e1 != 0 {
-		err = errnoErr(e1)
-	}
-	return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func Setsid() (pid int, err error) {
 	r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0)
 	pid = int(r0)
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux.go
index 293cf36..7ceec23 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux.go
@@ -379,6 +379,16 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func ptracePtr(request int, pid int, addr uintptr, data unsafe.Pointer) (err error) {
+	_, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) {
 	var _p0 *byte
 	_p0, err = BytePtrFromString(arg)
@@ -537,6 +547,17 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func ClockAdjtime(clockid int32, buf *Timex) (state int, err error) {
+	r0, _, e1 := Syscall(SYS_CLOCK_ADJTIME, uintptr(clockid), uintptr(unsafe.Pointer(buf)), 0)
+	state = int(r0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func ClockGetres(clockid int32, res *Timespec) (err error) {
 	_, _, e1 := Syscall(SYS_CLOCK_GETRES, uintptr(clockid), uintptr(unsafe.Pointer(res)), 0)
 	if e1 != 0 {
@@ -1325,16 +1346,6 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) {
-	_, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0)
-	if e1 != 0 {
-		err = errnoErr(e1)
-	}
-	return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) {
 	_, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0)
 	if e1 != 0 {
@@ -1857,6 +1868,17 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func mremap(oldaddr uintptr, oldlength uintptr, newlength uintptr, flags int, newaddr uintptr) (xaddr uintptr, err error) {
+	r0, _, e1 := Syscall6(SYS_MREMAP, uintptr(oldaddr), uintptr(oldlength), uintptr(newlength), uintptr(flags), uintptr(newaddr), 0)
+	xaddr = uintptr(r0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func Madvise(b []byte, advice int) (err error) {
 	var _p0 unsafe.Pointer
 	if len(b) > 0 {
@@ -2161,3 +2183,17 @@
 	}
 	return
 }
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func getresuid(ruid *_C_int, euid *_C_int, suid *_C_int) {
+	RawSyscallNoError(SYS_GETRESUID, uintptr(unsafe.Pointer(ruid)), uintptr(unsafe.Pointer(euid)), uintptr(unsafe.Pointer(suid)))
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func getresgid(rgid *_C_int, egid *_C_int, sgid *_C_int) {
+	RawSyscallNoError(SYS_GETRESGID, uintptr(unsafe.Pointer(rgid)), uintptr(unsafe.Pointer(egid)), uintptr(unsafe.Pointer(sgid)))
+	return
+}
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go
index c81b0ad..07b549c 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go
@@ -411,16 +411,6 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func setrlimit(resource int, rlim *rlimit32) (err error) {
-	_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0)
-	if e1 != 0 {
-		err = errnoErr(e1)
-	}
-	return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func futimesat(dirfd int, path string, times *[2]Timeval) (err error) {
 	var _p0 *byte
 	_p0, err = BytePtrFromString(path)
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go
index 2206bce..5f481bf 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go
@@ -334,16 +334,6 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Setrlimit(resource int, rlim *Rlimit) (err error) {
-	_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0)
-	if e1 != 0 {
-		err = errnoErr(e1)
-	}
-	return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func Shutdown(fd int, how int) (err error) {
 	_, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0)
 	if e1 != 0 {
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go
index edf6b39..824cd52 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go
@@ -578,16 +578,6 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func setrlimit(resource int, rlim *rlimit32) (err error) {
-	_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0)
-	if e1 != 0 {
-		err = errnoErr(e1)
-	}
-	return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func armSyncFileRange(fd int, flags int, off int64, n int64) (err error) {
 	_, _, e1 := Syscall6(SYS_ARM_SYNC_FILE_RANGE, uintptr(fd), uintptr(flags), uintptr(off), uintptr(off>>32), uintptr(n), uintptr(n>>32))
 	if e1 != 0 {
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go
index 190609f..e77aecf 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go
@@ -289,16 +289,6 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func setrlimit(resource int, rlim *Rlimit) (err error) {
-	_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0)
-	if e1 != 0 {
-		err = errnoErr(e1)
-	}
-	return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func Shutdown(fd int, how int) (err error) {
 	_, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0)
 	if e1 != 0 {
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go
index 5f984cb..961a3af 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go
@@ -644,16 +644,6 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func setrlimit(resource int, rlim *rlimit32) (err error) {
-	_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0)
-	if e1 != 0 {
-		err = errnoErr(e1)
-	}
-	return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func Alarm(seconds uint) (remaining uint, err error) {
 	r0, _, e1 := Syscall(SYS_ALARM, uintptr(seconds), 0, 0)
 	remaining = uint(r0)
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go
index 46fc380..ed05005 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go
@@ -278,16 +278,6 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Setrlimit(resource int, rlim *Rlimit) (err error) {
-	_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0)
-	if e1 != 0 {
-		err = errnoErr(e1)
-	}
-	return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func Shutdown(fd int, how int) (err error) {
 	_, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0)
 	if e1 != 0 {
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go
index cbd0d4d..d365b71 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go
@@ -278,16 +278,6 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Setrlimit(resource int, rlim *Rlimit) (err error) {
-	_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0)
-	if e1 != 0 {
-		err = errnoErr(e1)
-	}
-	return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func Shutdown(fd int, how int) (err error) {
 	_, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0)
 	if e1 != 0 {
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go
index 0c13d15..c3f1b8b 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go
@@ -644,16 +644,6 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func setrlimit(resource int, rlim *rlimit32) (err error) {
-	_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0)
-	if e1 != 0 {
-		err = errnoErr(e1)
-	}
-	return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func Alarm(seconds uint) (remaining uint, err error) {
 	r0, _, e1 := Syscall(SYS_ALARM, uintptr(seconds), 0, 0)
 	remaining = uint(r0)
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc.go
index e01432a..a6574cf 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc.go
@@ -624,16 +624,6 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func setrlimit(resource int, rlim *rlimit32) (err error) {
-	_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0)
-	if e1 != 0 {
-		err = errnoErr(e1)
-	}
-	return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func syncFileRange2(fd int, flags int, off int64, n int64) (err error) {
 	_, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE2, uintptr(fd), uintptr(flags), uintptr(off>>32), uintptr(off), uintptr(n>>32), uintptr(n))
 	if e1 != 0 {
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go
index 13c7ee7..f409902 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go
@@ -349,16 +349,6 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Setrlimit(resource int, rlim *Rlimit) (err error) {
-	_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0)
-	if e1 != 0 {
-		err = errnoErr(e1)
-	}
-	return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func Shutdown(fd int, how int) (err error) {
 	_, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0)
 	if e1 != 0 {
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go
index 02d0c0f..9dfcc29 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go
@@ -349,16 +349,6 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Setrlimit(resource int, rlim *Rlimit) (err error) {
-	_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0)
-	if e1 != 0 {
-		err = errnoErr(e1)
-	}
-	return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func Shutdown(fd int, how int) (err error) {
 	_, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0)
 	if e1 != 0 {
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go
index 9fee3b1..0b29239 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go
@@ -269,16 +269,6 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Setrlimit(resource int, rlim *Rlimit) (err error) {
-	_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0)
-	if e1 != 0 {
-		err = errnoErr(e1)
-	}
-	return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func Shutdown(fd int, how int) (err error) {
 	_, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0)
 	if e1 != 0 {
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go
index 647bbfe..6cde322 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go
@@ -319,16 +319,6 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Setrlimit(resource int, rlim *Rlimit) (err error) {
-	_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0)
-	if e1 != 0 {
-		err = errnoErr(e1)
-	}
-	return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) {
 	r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags))
 	n = int64(r0)
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go
index ada057f..5253d65 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go
@@ -329,16 +329,6 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Setrlimit(resource int, rlim *Rlimit) (err error) {
-	_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0)
-	if e1 != 0 {
-		err = errnoErr(e1)
-	}
-	return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func Shutdown(fd int, how int) (err error) {
 	_, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0)
 	if e1 != 0 {
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go
index 4af561a..cdb2af5 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go
@@ -405,6 +405,16 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func ioctlPtr(fd int, req uint, arg unsafe.Pointer) (err error) {
+	_, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg))
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) {
 	var _p0 unsafe.Pointer
 	if len(mib) > 0 {
@@ -521,6 +531,16 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func ClockGettime(clockid int32, time *Timespec) (err error) {
+	_, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func Close(fd int) (err error) {
 	_, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0)
 	if e1 != 0 {
@@ -1587,16 +1607,6 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Setrlimit(which int, lim *Rlimit) (err error) {
-	_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0)
-	if e1 != 0 {
-		err = errnoErr(e1)
-	}
-	return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func Setsid() (pid int, err error) {
 	r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0)
 	pid = int(r0)
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go
index 3b90e94..9d25f76 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go
@@ -405,6 +405,16 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func ioctlPtr(fd int, req uint, arg unsafe.Pointer) (err error) {
+	_, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg))
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) {
 	var _p0 unsafe.Pointer
 	if len(mib) > 0 {
@@ -521,6 +531,16 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func ClockGettime(clockid int32, time *Timespec) (err error) {
+	_, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func Close(fd int) (err error) {
 	_, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0)
 	if e1 != 0 {
@@ -1587,16 +1607,6 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Setrlimit(which int, lim *Rlimit) (err error) {
-	_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0)
-	if e1 != 0 {
-		err = errnoErr(e1)
-	}
-	return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func Setsid() (pid int, err error) {
 	r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0)
 	pid = int(r0)
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go
index 890f4cc..d3f8035 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go
@@ -405,6 +405,16 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func ioctlPtr(fd int, req uint, arg unsafe.Pointer) (err error) {
+	_, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg))
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) {
 	var _p0 unsafe.Pointer
 	if len(mib) > 0 {
@@ -521,6 +531,16 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func ClockGettime(clockid int32, time *Timespec) (err error) {
+	_, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func Close(fd int) (err error) {
 	_, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0)
 	if e1 != 0 {
@@ -1587,16 +1607,6 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Setrlimit(which int, lim *Rlimit) (err error) {
-	_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0)
-	if e1 != 0 {
-		err = errnoErr(e1)
-	}
-	return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func Setsid() (pid int, err error) {
 	r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0)
 	pid = int(r0)
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go
index c79f071..887188a 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go
@@ -405,6 +405,16 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func ioctlPtr(fd int, req uint, arg unsafe.Pointer) (err error) {
+	_, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg))
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) {
 	var _p0 unsafe.Pointer
 	if len(mib) > 0 {
@@ -521,6 +531,16 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func ClockGettime(clockid int32, time *Timespec) (err error) {
+	_, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func Close(fd int) (err error) {
 	_, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0)
 	if e1 != 0 {
@@ -1587,16 +1607,6 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Setrlimit(which int, lim *Rlimit) (err error) {
-	_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0)
-	if e1 != 0 {
-		err = errnoErr(e1)
-	}
-	return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func Setsid() (pid int, err error) {
 	r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0)
 	pid = int(r0)
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go
index 2925fe0..9ab9abf 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go
@@ -519,6 +519,28 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func getresuid(ruid *_C_int, euid *_C_int, suid *_C_int) {
+	syscall_rawSyscall(libc_getresuid_trampoline_addr, uintptr(unsafe.Pointer(ruid)), uintptr(unsafe.Pointer(euid)), uintptr(unsafe.Pointer(suid)))
+	return
+}
+
+var libc_getresuid_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_getresuid getresuid "libc.so"
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func getresgid(rgid *_C_int, egid *_C_int, sgid *_C_int) {
+	syscall_rawSyscall(libc_getresgid_trampoline_addr, uintptr(unsafe.Pointer(rgid)), uintptr(unsafe.Pointer(egid)), uintptr(unsafe.Pointer(sgid)))
+	return
+}
+
+var libc_getresgid_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_getresgid getresgid "libc.so"
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func ioctl(fd int, req uint, arg uintptr) (err error) {
 	_, _, e1 := syscall_syscall(libc_ioctl_trampoline_addr, uintptr(fd), uintptr(req), uintptr(arg))
 	if e1 != 0 {
@@ -527,6 +549,14 @@
 	return
 }
 
+func ioctlPtr(fd int, req uint, arg unsafe.Pointer) (err error) {
+	_, _, e1 := syscall_syscall(libc_ioctl_trampoline_addr, uintptr(fd), uintptr(req), uintptr(arg))
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
 var libc_ioctl_trampoline_addr uintptr
 
 //go:cgo_import_dynamic libc_ioctl ioctl "libc.so"
@@ -696,6 +726,20 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func ClockGettime(clockid int32, time *Timespec) (err error) {
+	_, _, e1 := syscall_syscall(libc_clock_gettime_trampoline_addr, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+var libc_clock_gettime_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_clock_gettime clock_gettime "libc.so"
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func Close(fd int) (err error) {
 	_, _, e1 := syscall_syscall(libc_close_trampoline_addr, uintptr(fd), 0, 0)
 	if e1 != 0 {
@@ -1872,20 +1916,6 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Setrlimit(which int, lim *Rlimit) (err error) {
-	_, _, e1 := syscall_rawSyscall(libc_setrlimit_trampoline_addr, uintptr(which), uintptr(unsafe.Pointer(lim)), 0)
-	if e1 != 0 {
-		err = errnoErr(e1)
-	}
-	return
-}
-
-var libc_setrlimit_trampoline_addr uintptr
-
-//go:cgo_import_dynamic libc_setrlimit setrlimit "libc.so"
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func Setrtable(rtable int) (err error) {
 	_, _, e1 := syscall_rawSyscall(libc_setrtable_trampoline_addr, uintptr(rtable), 0, 0)
 	if e1 != 0 {
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.s b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.s
index 75eb2f5..3dcacd3 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.s
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.s
@@ -5,792 +5,670 @@
 
 TEXT libc_getgroups_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getgroups(SB)
-
 GLOBL	·libc_getgroups_trampoline_addr(SB), RODATA, $4
 DATA	·libc_getgroups_trampoline_addr(SB)/4, $libc_getgroups_trampoline<>(SB)
 
 TEXT libc_setgroups_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setgroups(SB)
-
 GLOBL	·libc_setgroups_trampoline_addr(SB), RODATA, $4
 DATA	·libc_setgroups_trampoline_addr(SB)/4, $libc_setgroups_trampoline<>(SB)
 
 TEXT libc_wait4_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_wait4(SB)
-
 GLOBL	·libc_wait4_trampoline_addr(SB), RODATA, $4
 DATA	·libc_wait4_trampoline_addr(SB)/4, $libc_wait4_trampoline<>(SB)
 
 TEXT libc_accept_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_accept(SB)
-
 GLOBL	·libc_accept_trampoline_addr(SB), RODATA, $4
 DATA	·libc_accept_trampoline_addr(SB)/4, $libc_accept_trampoline<>(SB)
 
 TEXT libc_bind_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_bind(SB)
-
 GLOBL	·libc_bind_trampoline_addr(SB), RODATA, $4
 DATA	·libc_bind_trampoline_addr(SB)/4, $libc_bind_trampoline<>(SB)
 
 TEXT libc_connect_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_connect(SB)
-
 GLOBL	·libc_connect_trampoline_addr(SB), RODATA, $4
 DATA	·libc_connect_trampoline_addr(SB)/4, $libc_connect_trampoline<>(SB)
 
 TEXT libc_socket_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_socket(SB)
-
 GLOBL	·libc_socket_trampoline_addr(SB), RODATA, $4
 DATA	·libc_socket_trampoline_addr(SB)/4, $libc_socket_trampoline<>(SB)
 
 TEXT libc_getsockopt_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getsockopt(SB)
-
 GLOBL	·libc_getsockopt_trampoline_addr(SB), RODATA, $4
 DATA	·libc_getsockopt_trampoline_addr(SB)/4, $libc_getsockopt_trampoline<>(SB)
 
 TEXT libc_setsockopt_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setsockopt(SB)
-
 GLOBL	·libc_setsockopt_trampoline_addr(SB), RODATA, $4
 DATA	·libc_setsockopt_trampoline_addr(SB)/4, $libc_setsockopt_trampoline<>(SB)
 
 TEXT libc_getpeername_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getpeername(SB)
-
 GLOBL	·libc_getpeername_trampoline_addr(SB), RODATA, $4
 DATA	·libc_getpeername_trampoline_addr(SB)/4, $libc_getpeername_trampoline<>(SB)
 
 TEXT libc_getsockname_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getsockname(SB)
-
 GLOBL	·libc_getsockname_trampoline_addr(SB), RODATA, $4
 DATA	·libc_getsockname_trampoline_addr(SB)/4, $libc_getsockname_trampoline<>(SB)
 
 TEXT libc_shutdown_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_shutdown(SB)
-
 GLOBL	·libc_shutdown_trampoline_addr(SB), RODATA, $4
 DATA	·libc_shutdown_trampoline_addr(SB)/4, $libc_shutdown_trampoline<>(SB)
 
 TEXT libc_socketpair_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_socketpair(SB)
-
 GLOBL	·libc_socketpair_trampoline_addr(SB), RODATA, $4
 DATA	·libc_socketpair_trampoline_addr(SB)/4, $libc_socketpair_trampoline<>(SB)
 
 TEXT libc_recvfrom_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_recvfrom(SB)
-
 GLOBL	·libc_recvfrom_trampoline_addr(SB), RODATA, $4
 DATA	·libc_recvfrom_trampoline_addr(SB)/4, $libc_recvfrom_trampoline<>(SB)
 
 TEXT libc_sendto_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_sendto(SB)
-
 GLOBL	·libc_sendto_trampoline_addr(SB), RODATA, $4
 DATA	·libc_sendto_trampoline_addr(SB)/4, $libc_sendto_trampoline<>(SB)
 
 TEXT libc_recvmsg_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_recvmsg(SB)
-
 GLOBL	·libc_recvmsg_trampoline_addr(SB), RODATA, $4
 DATA	·libc_recvmsg_trampoline_addr(SB)/4, $libc_recvmsg_trampoline<>(SB)
 
 TEXT libc_sendmsg_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_sendmsg(SB)
-
 GLOBL	·libc_sendmsg_trampoline_addr(SB), RODATA, $4
 DATA	·libc_sendmsg_trampoline_addr(SB)/4, $libc_sendmsg_trampoline<>(SB)
 
 TEXT libc_kevent_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_kevent(SB)
-
 GLOBL	·libc_kevent_trampoline_addr(SB), RODATA, $4
 DATA	·libc_kevent_trampoline_addr(SB)/4, $libc_kevent_trampoline<>(SB)
 
 TEXT libc_utimes_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_utimes(SB)
-
 GLOBL	·libc_utimes_trampoline_addr(SB), RODATA, $4
 DATA	·libc_utimes_trampoline_addr(SB)/4, $libc_utimes_trampoline<>(SB)
 
 TEXT libc_futimes_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_futimes(SB)
-
 GLOBL	·libc_futimes_trampoline_addr(SB), RODATA, $4
 DATA	·libc_futimes_trampoline_addr(SB)/4, $libc_futimes_trampoline<>(SB)
 
 TEXT libc_poll_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_poll(SB)
-
 GLOBL	·libc_poll_trampoline_addr(SB), RODATA, $4
 DATA	·libc_poll_trampoline_addr(SB)/4, $libc_poll_trampoline<>(SB)
 
 TEXT libc_madvise_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_madvise(SB)
-
 GLOBL	·libc_madvise_trampoline_addr(SB), RODATA, $4
 DATA	·libc_madvise_trampoline_addr(SB)/4, $libc_madvise_trampoline<>(SB)
 
 TEXT libc_mlock_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_mlock(SB)
-
 GLOBL	·libc_mlock_trampoline_addr(SB), RODATA, $4
 DATA	·libc_mlock_trampoline_addr(SB)/4, $libc_mlock_trampoline<>(SB)
 
 TEXT libc_mlockall_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_mlockall(SB)
-
 GLOBL	·libc_mlockall_trampoline_addr(SB), RODATA, $4
 DATA	·libc_mlockall_trampoline_addr(SB)/4, $libc_mlockall_trampoline<>(SB)
 
 TEXT libc_mprotect_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_mprotect(SB)
-
 GLOBL	·libc_mprotect_trampoline_addr(SB), RODATA, $4
 DATA	·libc_mprotect_trampoline_addr(SB)/4, $libc_mprotect_trampoline<>(SB)
 
 TEXT libc_msync_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_msync(SB)
-
 GLOBL	·libc_msync_trampoline_addr(SB), RODATA, $4
 DATA	·libc_msync_trampoline_addr(SB)/4, $libc_msync_trampoline<>(SB)
 
 TEXT libc_munlock_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_munlock(SB)
-
 GLOBL	·libc_munlock_trampoline_addr(SB), RODATA, $4
 DATA	·libc_munlock_trampoline_addr(SB)/4, $libc_munlock_trampoline<>(SB)
 
 TEXT libc_munlockall_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_munlockall(SB)
-
 GLOBL	·libc_munlockall_trampoline_addr(SB), RODATA, $4
 DATA	·libc_munlockall_trampoline_addr(SB)/4, $libc_munlockall_trampoline<>(SB)
 
 TEXT libc_pipe2_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_pipe2(SB)
-
 GLOBL	·libc_pipe2_trampoline_addr(SB), RODATA, $4
 DATA	·libc_pipe2_trampoline_addr(SB)/4, $libc_pipe2_trampoline<>(SB)
 
 TEXT libc_getdents_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getdents(SB)
-
 GLOBL	·libc_getdents_trampoline_addr(SB), RODATA, $4
 DATA	·libc_getdents_trampoline_addr(SB)/4, $libc_getdents_trampoline<>(SB)
 
 TEXT libc_getcwd_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getcwd(SB)
-
 GLOBL	·libc_getcwd_trampoline_addr(SB), RODATA, $4
 DATA	·libc_getcwd_trampoline_addr(SB)/4, $libc_getcwd_trampoline<>(SB)
 
+TEXT libc_getresuid_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_getresuid(SB)
+GLOBL	·libc_getresuid_trampoline_addr(SB), RODATA, $4
+DATA	·libc_getresuid_trampoline_addr(SB)/4, $libc_getresuid_trampoline<>(SB)
+
+TEXT libc_getresgid_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_getresgid(SB)
+GLOBL	·libc_getresgid_trampoline_addr(SB), RODATA, $4
+DATA	·libc_getresgid_trampoline_addr(SB)/4, $libc_getresgid_trampoline<>(SB)
+
 TEXT libc_ioctl_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_ioctl(SB)
-
 GLOBL	·libc_ioctl_trampoline_addr(SB), RODATA, $4
 DATA	·libc_ioctl_trampoline_addr(SB)/4, $libc_ioctl_trampoline<>(SB)
 
 TEXT libc_sysctl_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_sysctl(SB)
-
 GLOBL	·libc_sysctl_trampoline_addr(SB), RODATA, $4
 DATA	·libc_sysctl_trampoline_addr(SB)/4, $libc_sysctl_trampoline<>(SB)
 
 TEXT libc_ppoll_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_ppoll(SB)
-
 GLOBL	·libc_ppoll_trampoline_addr(SB), RODATA, $4
 DATA	·libc_ppoll_trampoline_addr(SB)/4, $libc_ppoll_trampoline<>(SB)
 
 TEXT libc_access_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_access(SB)
-
 GLOBL	·libc_access_trampoline_addr(SB), RODATA, $4
 DATA	·libc_access_trampoline_addr(SB)/4, $libc_access_trampoline<>(SB)
 
 TEXT libc_adjtime_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_adjtime(SB)
-
 GLOBL	·libc_adjtime_trampoline_addr(SB), RODATA, $4
 DATA	·libc_adjtime_trampoline_addr(SB)/4, $libc_adjtime_trampoline<>(SB)
 
 TEXT libc_chdir_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_chdir(SB)
-
 GLOBL	·libc_chdir_trampoline_addr(SB), RODATA, $4
 DATA	·libc_chdir_trampoline_addr(SB)/4, $libc_chdir_trampoline<>(SB)
 
 TEXT libc_chflags_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_chflags(SB)
-
 GLOBL	·libc_chflags_trampoline_addr(SB), RODATA, $4
 DATA	·libc_chflags_trampoline_addr(SB)/4, $libc_chflags_trampoline<>(SB)
 
 TEXT libc_chmod_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_chmod(SB)
-
 GLOBL	·libc_chmod_trampoline_addr(SB), RODATA, $4
 DATA	·libc_chmod_trampoline_addr(SB)/4, $libc_chmod_trampoline<>(SB)
 
 TEXT libc_chown_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_chown(SB)
-
 GLOBL	·libc_chown_trampoline_addr(SB), RODATA, $4
 DATA	·libc_chown_trampoline_addr(SB)/4, $libc_chown_trampoline<>(SB)
 
 TEXT libc_chroot_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_chroot(SB)
-
 GLOBL	·libc_chroot_trampoline_addr(SB), RODATA, $4
 DATA	·libc_chroot_trampoline_addr(SB)/4, $libc_chroot_trampoline<>(SB)
 
+TEXT libc_clock_gettime_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_clock_gettime(SB)
+GLOBL	·libc_clock_gettime_trampoline_addr(SB), RODATA, $4
+DATA	·libc_clock_gettime_trampoline_addr(SB)/4, $libc_clock_gettime_trampoline<>(SB)
+
 TEXT libc_close_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_close(SB)
-
 GLOBL	·libc_close_trampoline_addr(SB), RODATA, $4
 DATA	·libc_close_trampoline_addr(SB)/4, $libc_close_trampoline<>(SB)
 
 TEXT libc_dup_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_dup(SB)
-
 GLOBL	·libc_dup_trampoline_addr(SB), RODATA, $4
 DATA	·libc_dup_trampoline_addr(SB)/4, $libc_dup_trampoline<>(SB)
 
 TEXT libc_dup2_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_dup2(SB)
-
 GLOBL	·libc_dup2_trampoline_addr(SB), RODATA, $4
 DATA	·libc_dup2_trampoline_addr(SB)/4, $libc_dup2_trampoline<>(SB)
 
 TEXT libc_dup3_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_dup3(SB)
-
 GLOBL	·libc_dup3_trampoline_addr(SB), RODATA, $4
 DATA	·libc_dup3_trampoline_addr(SB)/4, $libc_dup3_trampoline<>(SB)
 
 TEXT libc_exit_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_exit(SB)
-
 GLOBL	·libc_exit_trampoline_addr(SB), RODATA, $4
 DATA	·libc_exit_trampoline_addr(SB)/4, $libc_exit_trampoline<>(SB)
 
 TEXT libc_faccessat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_faccessat(SB)
-
 GLOBL	·libc_faccessat_trampoline_addr(SB), RODATA, $4
 DATA	·libc_faccessat_trampoline_addr(SB)/4, $libc_faccessat_trampoline<>(SB)
 
 TEXT libc_fchdir_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_fchdir(SB)
-
 GLOBL	·libc_fchdir_trampoline_addr(SB), RODATA, $4
 DATA	·libc_fchdir_trampoline_addr(SB)/4, $libc_fchdir_trampoline<>(SB)
 
 TEXT libc_fchflags_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_fchflags(SB)
-
 GLOBL	·libc_fchflags_trampoline_addr(SB), RODATA, $4
 DATA	·libc_fchflags_trampoline_addr(SB)/4, $libc_fchflags_trampoline<>(SB)
 
 TEXT libc_fchmod_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_fchmod(SB)
-
 GLOBL	·libc_fchmod_trampoline_addr(SB), RODATA, $4
 DATA	·libc_fchmod_trampoline_addr(SB)/4, $libc_fchmod_trampoline<>(SB)
 
 TEXT libc_fchmodat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_fchmodat(SB)
-
 GLOBL	·libc_fchmodat_trampoline_addr(SB), RODATA, $4
 DATA	·libc_fchmodat_trampoline_addr(SB)/4, $libc_fchmodat_trampoline<>(SB)
 
 TEXT libc_fchown_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_fchown(SB)
-
 GLOBL	·libc_fchown_trampoline_addr(SB), RODATA, $4
 DATA	·libc_fchown_trampoline_addr(SB)/4, $libc_fchown_trampoline<>(SB)
 
 TEXT libc_fchownat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_fchownat(SB)
-
 GLOBL	·libc_fchownat_trampoline_addr(SB), RODATA, $4
 DATA	·libc_fchownat_trampoline_addr(SB)/4, $libc_fchownat_trampoline<>(SB)
 
 TEXT libc_flock_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_flock(SB)
-
 GLOBL	·libc_flock_trampoline_addr(SB), RODATA, $4
 DATA	·libc_flock_trampoline_addr(SB)/4, $libc_flock_trampoline<>(SB)
 
 TEXT libc_fpathconf_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_fpathconf(SB)
-
 GLOBL	·libc_fpathconf_trampoline_addr(SB), RODATA, $4
 DATA	·libc_fpathconf_trampoline_addr(SB)/4, $libc_fpathconf_trampoline<>(SB)
 
 TEXT libc_fstat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_fstat(SB)
-
 GLOBL	·libc_fstat_trampoline_addr(SB), RODATA, $4
 DATA	·libc_fstat_trampoline_addr(SB)/4, $libc_fstat_trampoline<>(SB)
 
 TEXT libc_fstatat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_fstatat(SB)
-
 GLOBL	·libc_fstatat_trampoline_addr(SB), RODATA, $4
 DATA	·libc_fstatat_trampoline_addr(SB)/4, $libc_fstatat_trampoline<>(SB)
 
 TEXT libc_fstatfs_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_fstatfs(SB)
-
 GLOBL	·libc_fstatfs_trampoline_addr(SB), RODATA, $4
 DATA	·libc_fstatfs_trampoline_addr(SB)/4, $libc_fstatfs_trampoline<>(SB)
 
 TEXT libc_fsync_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_fsync(SB)
-
 GLOBL	·libc_fsync_trampoline_addr(SB), RODATA, $4
 DATA	·libc_fsync_trampoline_addr(SB)/4, $libc_fsync_trampoline<>(SB)
 
 TEXT libc_ftruncate_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_ftruncate(SB)
-
 GLOBL	·libc_ftruncate_trampoline_addr(SB), RODATA, $4
 DATA	·libc_ftruncate_trampoline_addr(SB)/4, $libc_ftruncate_trampoline<>(SB)
 
 TEXT libc_getegid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getegid(SB)
-
 GLOBL	·libc_getegid_trampoline_addr(SB), RODATA, $4
 DATA	·libc_getegid_trampoline_addr(SB)/4, $libc_getegid_trampoline<>(SB)
 
 TEXT libc_geteuid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_geteuid(SB)
-
 GLOBL	·libc_geteuid_trampoline_addr(SB), RODATA, $4
 DATA	·libc_geteuid_trampoline_addr(SB)/4, $libc_geteuid_trampoline<>(SB)
 
 TEXT libc_getgid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getgid(SB)
-
 GLOBL	·libc_getgid_trampoline_addr(SB), RODATA, $4
 DATA	·libc_getgid_trampoline_addr(SB)/4, $libc_getgid_trampoline<>(SB)
 
 TEXT libc_getpgid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getpgid(SB)
-
 GLOBL	·libc_getpgid_trampoline_addr(SB), RODATA, $4
 DATA	·libc_getpgid_trampoline_addr(SB)/4, $libc_getpgid_trampoline<>(SB)
 
 TEXT libc_getpgrp_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getpgrp(SB)
-
 GLOBL	·libc_getpgrp_trampoline_addr(SB), RODATA, $4
 DATA	·libc_getpgrp_trampoline_addr(SB)/4, $libc_getpgrp_trampoline<>(SB)
 
 TEXT libc_getpid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getpid(SB)
-
 GLOBL	·libc_getpid_trampoline_addr(SB), RODATA, $4
 DATA	·libc_getpid_trampoline_addr(SB)/4, $libc_getpid_trampoline<>(SB)
 
 TEXT libc_getppid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getppid(SB)
-
 GLOBL	·libc_getppid_trampoline_addr(SB), RODATA, $4
 DATA	·libc_getppid_trampoline_addr(SB)/4, $libc_getppid_trampoline<>(SB)
 
 TEXT libc_getpriority_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getpriority(SB)
-
 GLOBL	·libc_getpriority_trampoline_addr(SB), RODATA, $4
 DATA	·libc_getpriority_trampoline_addr(SB)/4, $libc_getpriority_trampoline<>(SB)
 
 TEXT libc_getrlimit_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getrlimit(SB)
-
 GLOBL	·libc_getrlimit_trampoline_addr(SB), RODATA, $4
 DATA	·libc_getrlimit_trampoline_addr(SB)/4, $libc_getrlimit_trampoline<>(SB)
 
 TEXT libc_getrtable_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getrtable(SB)
-
 GLOBL	·libc_getrtable_trampoline_addr(SB), RODATA, $4
 DATA	·libc_getrtable_trampoline_addr(SB)/4, $libc_getrtable_trampoline<>(SB)
 
 TEXT libc_getrusage_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getrusage(SB)
-
 GLOBL	·libc_getrusage_trampoline_addr(SB), RODATA, $4
 DATA	·libc_getrusage_trampoline_addr(SB)/4, $libc_getrusage_trampoline<>(SB)
 
 TEXT libc_getsid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getsid(SB)
-
 GLOBL	·libc_getsid_trampoline_addr(SB), RODATA, $4
 DATA	·libc_getsid_trampoline_addr(SB)/4, $libc_getsid_trampoline<>(SB)
 
 TEXT libc_gettimeofday_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_gettimeofday(SB)
-
 GLOBL	·libc_gettimeofday_trampoline_addr(SB), RODATA, $4
 DATA	·libc_gettimeofday_trampoline_addr(SB)/4, $libc_gettimeofday_trampoline<>(SB)
 
 TEXT libc_getuid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getuid(SB)
-
 GLOBL	·libc_getuid_trampoline_addr(SB), RODATA, $4
 DATA	·libc_getuid_trampoline_addr(SB)/4, $libc_getuid_trampoline<>(SB)
 
 TEXT libc_issetugid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_issetugid(SB)
-
 GLOBL	·libc_issetugid_trampoline_addr(SB), RODATA, $4
 DATA	·libc_issetugid_trampoline_addr(SB)/4, $libc_issetugid_trampoline<>(SB)
 
 TEXT libc_kill_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_kill(SB)
-
 GLOBL	·libc_kill_trampoline_addr(SB), RODATA, $4
 DATA	·libc_kill_trampoline_addr(SB)/4, $libc_kill_trampoline<>(SB)
 
 TEXT libc_kqueue_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_kqueue(SB)
-
 GLOBL	·libc_kqueue_trampoline_addr(SB), RODATA, $4
 DATA	·libc_kqueue_trampoline_addr(SB)/4, $libc_kqueue_trampoline<>(SB)
 
 TEXT libc_lchown_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_lchown(SB)
-
 GLOBL	·libc_lchown_trampoline_addr(SB), RODATA, $4
 DATA	·libc_lchown_trampoline_addr(SB)/4, $libc_lchown_trampoline<>(SB)
 
 TEXT libc_link_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_link(SB)
-
 GLOBL	·libc_link_trampoline_addr(SB), RODATA, $4
 DATA	·libc_link_trampoline_addr(SB)/4, $libc_link_trampoline<>(SB)
 
 TEXT libc_linkat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_linkat(SB)
-
 GLOBL	·libc_linkat_trampoline_addr(SB), RODATA, $4
 DATA	·libc_linkat_trampoline_addr(SB)/4, $libc_linkat_trampoline<>(SB)
 
 TEXT libc_listen_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_listen(SB)
-
 GLOBL	·libc_listen_trampoline_addr(SB), RODATA, $4
 DATA	·libc_listen_trampoline_addr(SB)/4, $libc_listen_trampoline<>(SB)
 
 TEXT libc_lstat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_lstat(SB)
-
 GLOBL	·libc_lstat_trampoline_addr(SB), RODATA, $4
 DATA	·libc_lstat_trampoline_addr(SB)/4, $libc_lstat_trampoline<>(SB)
 
 TEXT libc_mkdir_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_mkdir(SB)
-
 GLOBL	·libc_mkdir_trampoline_addr(SB), RODATA, $4
 DATA	·libc_mkdir_trampoline_addr(SB)/4, $libc_mkdir_trampoline<>(SB)
 
 TEXT libc_mkdirat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_mkdirat(SB)
-
 GLOBL	·libc_mkdirat_trampoline_addr(SB), RODATA, $4
 DATA	·libc_mkdirat_trampoline_addr(SB)/4, $libc_mkdirat_trampoline<>(SB)
 
 TEXT libc_mkfifo_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_mkfifo(SB)
-
 GLOBL	·libc_mkfifo_trampoline_addr(SB), RODATA, $4
 DATA	·libc_mkfifo_trampoline_addr(SB)/4, $libc_mkfifo_trampoline<>(SB)
 
 TEXT libc_mkfifoat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_mkfifoat(SB)
-
 GLOBL	·libc_mkfifoat_trampoline_addr(SB), RODATA, $4
 DATA	·libc_mkfifoat_trampoline_addr(SB)/4, $libc_mkfifoat_trampoline<>(SB)
 
 TEXT libc_mknod_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_mknod(SB)
-
 GLOBL	·libc_mknod_trampoline_addr(SB), RODATA, $4
 DATA	·libc_mknod_trampoline_addr(SB)/4, $libc_mknod_trampoline<>(SB)
 
 TEXT libc_mknodat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_mknodat(SB)
-
 GLOBL	·libc_mknodat_trampoline_addr(SB), RODATA, $4
 DATA	·libc_mknodat_trampoline_addr(SB)/4, $libc_mknodat_trampoline<>(SB)
 
 TEXT libc_nanosleep_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_nanosleep(SB)
-
 GLOBL	·libc_nanosleep_trampoline_addr(SB), RODATA, $4
 DATA	·libc_nanosleep_trampoline_addr(SB)/4, $libc_nanosleep_trampoline<>(SB)
 
 TEXT libc_open_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_open(SB)
-
 GLOBL	·libc_open_trampoline_addr(SB), RODATA, $4
 DATA	·libc_open_trampoline_addr(SB)/4, $libc_open_trampoline<>(SB)
 
 TEXT libc_openat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_openat(SB)
-
 GLOBL	·libc_openat_trampoline_addr(SB), RODATA, $4
 DATA	·libc_openat_trampoline_addr(SB)/4, $libc_openat_trampoline<>(SB)
 
 TEXT libc_pathconf_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_pathconf(SB)
-
 GLOBL	·libc_pathconf_trampoline_addr(SB), RODATA, $4
 DATA	·libc_pathconf_trampoline_addr(SB)/4, $libc_pathconf_trampoline<>(SB)
 
 TEXT libc_pread_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_pread(SB)
-
 GLOBL	·libc_pread_trampoline_addr(SB), RODATA, $4
 DATA	·libc_pread_trampoline_addr(SB)/4, $libc_pread_trampoline<>(SB)
 
 TEXT libc_pwrite_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_pwrite(SB)
-
 GLOBL	·libc_pwrite_trampoline_addr(SB), RODATA, $4
 DATA	·libc_pwrite_trampoline_addr(SB)/4, $libc_pwrite_trampoline<>(SB)
 
 TEXT libc_read_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_read(SB)
-
 GLOBL	·libc_read_trampoline_addr(SB), RODATA, $4
 DATA	·libc_read_trampoline_addr(SB)/4, $libc_read_trampoline<>(SB)
 
 TEXT libc_readlink_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_readlink(SB)
-
 GLOBL	·libc_readlink_trampoline_addr(SB), RODATA, $4
 DATA	·libc_readlink_trampoline_addr(SB)/4, $libc_readlink_trampoline<>(SB)
 
 TEXT libc_readlinkat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_readlinkat(SB)
-
 GLOBL	·libc_readlinkat_trampoline_addr(SB), RODATA, $4
 DATA	·libc_readlinkat_trampoline_addr(SB)/4, $libc_readlinkat_trampoline<>(SB)
 
 TEXT libc_rename_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_rename(SB)
-
 GLOBL	·libc_rename_trampoline_addr(SB), RODATA, $4
 DATA	·libc_rename_trampoline_addr(SB)/4, $libc_rename_trampoline<>(SB)
 
 TEXT libc_renameat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_renameat(SB)
-
 GLOBL	·libc_renameat_trampoline_addr(SB), RODATA, $4
 DATA	·libc_renameat_trampoline_addr(SB)/4, $libc_renameat_trampoline<>(SB)
 
 TEXT libc_revoke_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_revoke(SB)
-
 GLOBL	·libc_revoke_trampoline_addr(SB), RODATA, $4
 DATA	·libc_revoke_trampoline_addr(SB)/4, $libc_revoke_trampoline<>(SB)
 
 TEXT libc_rmdir_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_rmdir(SB)
-
 GLOBL	·libc_rmdir_trampoline_addr(SB), RODATA, $4
 DATA	·libc_rmdir_trampoline_addr(SB)/4, $libc_rmdir_trampoline<>(SB)
 
 TEXT libc_lseek_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_lseek(SB)
-
 GLOBL	·libc_lseek_trampoline_addr(SB), RODATA, $4
 DATA	·libc_lseek_trampoline_addr(SB)/4, $libc_lseek_trampoline<>(SB)
 
 TEXT libc_select_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_select(SB)
-
 GLOBL	·libc_select_trampoline_addr(SB), RODATA, $4
 DATA	·libc_select_trampoline_addr(SB)/4, $libc_select_trampoline<>(SB)
 
 TEXT libc_setegid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setegid(SB)
-
 GLOBL	·libc_setegid_trampoline_addr(SB), RODATA, $4
 DATA	·libc_setegid_trampoline_addr(SB)/4, $libc_setegid_trampoline<>(SB)
 
 TEXT libc_seteuid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_seteuid(SB)
-
 GLOBL	·libc_seteuid_trampoline_addr(SB), RODATA, $4
 DATA	·libc_seteuid_trampoline_addr(SB)/4, $libc_seteuid_trampoline<>(SB)
 
 TEXT libc_setgid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setgid(SB)
-
 GLOBL	·libc_setgid_trampoline_addr(SB), RODATA, $4
 DATA	·libc_setgid_trampoline_addr(SB)/4, $libc_setgid_trampoline<>(SB)
 
 TEXT libc_setlogin_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setlogin(SB)
-
 GLOBL	·libc_setlogin_trampoline_addr(SB), RODATA, $4
 DATA	·libc_setlogin_trampoline_addr(SB)/4, $libc_setlogin_trampoline<>(SB)
 
 TEXT libc_setpgid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setpgid(SB)
-
 GLOBL	·libc_setpgid_trampoline_addr(SB), RODATA, $4
 DATA	·libc_setpgid_trampoline_addr(SB)/4, $libc_setpgid_trampoline<>(SB)
 
 TEXT libc_setpriority_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setpriority(SB)
-
 GLOBL	·libc_setpriority_trampoline_addr(SB), RODATA, $4
 DATA	·libc_setpriority_trampoline_addr(SB)/4, $libc_setpriority_trampoline<>(SB)
 
 TEXT libc_setregid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setregid(SB)
-
 GLOBL	·libc_setregid_trampoline_addr(SB), RODATA, $4
 DATA	·libc_setregid_trampoline_addr(SB)/4, $libc_setregid_trampoline<>(SB)
 
 TEXT libc_setreuid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setreuid(SB)
-
 GLOBL	·libc_setreuid_trampoline_addr(SB), RODATA, $4
 DATA	·libc_setreuid_trampoline_addr(SB)/4, $libc_setreuid_trampoline<>(SB)
 
 TEXT libc_setresgid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setresgid(SB)
-
 GLOBL	·libc_setresgid_trampoline_addr(SB), RODATA, $4
 DATA	·libc_setresgid_trampoline_addr(SB)/4, $libc_setresgid_trampoline<>(SB)
 
 TEXT libc_setresuid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setresuid(SB)
-
 GLOBL	·libc_setresuid_trampoline_addr(SB), RODATA, $4
 DATA	·libc_setresuid_trampoline_addr(SB)/4, $libc_setresuid_trampoline<>(SB)
 
-TEXT libc_setrlimit_trampoline<>(SB),NOSPLIT,$0-0
-	JMP	libc_setrlimit(SB)
-
-GLOBL	·libc_setrlimit_trampoline_addr(SB), RODATA, $4
-DATA	·libc_setrlimit_trampoline_addr(SB)/4, $libc_setrlimit_trampoline<>(SB)
-
 TEXT libc_setrtable_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setrtable(SB)
-
 GLOBL	·libc_setrtable_trampoline_addr(SB), RODATA, $4
 DATA	·libc_setrtable_trampoline_addr(SB)/4, $libc_setrtable_trampoline<>(SB)
 
 TEXT libc_setsid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setsid(SB)
-
 GLOBL	·libc_setsid_trampoline_addr(SB), RODATA, $4
 DATA	·libc_setsid_trampoline_addr(SB)/4, $libc_setsid_trampoline<>(SB)
 
 TEXT libc_settimeofday_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_settimeofday(SB)
-
 GLOBL	·libc_settimeofday_trampoline_addr(SB), RODATA, $4
 DATA	·libc_settimeofday_trampoline_addr(SB)/4, $libc_settimeofday_trampoline<>(SB)
 
 TEXT libc_setuid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setuid(SB)
-
 GLOBL	·libc_setuid_trampoline_addr(SB), RODATA, $4
 DATA	·libc_setuid_trampoline_addr(SB)/4, $libc_setuid_trampoline<>(SB)
 
 TEXT libc_stat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_stat(SB)
-
 GLOBL	·libc_stat_trampoline_addr(SB), RODATA, $4
 DATA	·libc_stat_trampoline_addr(SB)/4, $libc_stat_trampoline<>(SB)
 
 TEXT libc_statfs_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_statfs(SB)
-
 GLOBL	·libc_statfs_trampoline_addr(SB), RODATA, $4
 DATA	·libc_statfs_trampoline_addr(SB)/4, $libc_statfs_trampoline<>(SB)
 
 TEXT libc_symlink_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_symlink(SB)
-
 GLOBL	·libc_symlink_trampoline_addr(SB), RODATA, $4
 DATA	·libc_symlink_trampoline_addr(SB)/4, $libc_symlink_trampoline<>(SB)
 
 TEXT libc_symlinkat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_symlinkat(SB)
-
 GLOBL	·libc_symlinkat_trampoline_addr(SB), RODATA, $4
 DATA	·libc_symlinkat_trampoline_addr(SB)/4, $libc_symlinkat_trampoline<>(SB)
 
 TEXT libc_sync_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_sync(SB)
-
 GLOBL	·libc_sync_trampoline_addr(SB), RODATA, $4
 DATA	·libc_sync_trampoline_addr(SB)/4, $libc_sync_trampoline<>(SB)
 
 TEXT libc_truncate_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_truncate(SB)
-
 GLOBL	·libc_truncate_trampoline_addr(SB), RODATA, $4
 DATA	·libc_truncate_trampoline_addr(SB)/4, $libc_truncate_trampoline<>(SB)
 
 TEXT libc_umask_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_umask(SB)
-
 GLOBL	·libc_umask_trampoline_addr(SB), RODATA, $4
 DATA	·libc_umask_trampoline_addr(SB)/4, $libc_umask_trampoline<>(SB)
 
 TEXT libc_unlink_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_unlink(SB)
-
 GLOBL	·libc_unlink_trampoline_addr(SB), RODATA, $4
 DATA	·libc_unlink_trampoline_addr(SB)/4, $libc_unlink_trampoline<>(SB)
 
 TEXT libc_unlinkat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_unlinkat(SB)
-
 GLOBL	·libc_unlinkat_trampoline_addr(SB), RODATA, $4
 DATA	·libc_unlinkat_trampoline_addr(SB)/4, $libc_unlinkat_trampoline<>(SB)
 
 TEXT libc_unmount_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_unmount(SB)
-
 GLOBL	·libc_unmount_trampoline_addr(SB), RODATA, $4
 DATA	·libc_unmount_trampoline_addr(SB)/4, $libc_unmount_trampoline<>(SB)
 
 TEXT libc_write_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_write(SB)
-
 GLOBL	·libc_write_trampoline_addr(SB), RODATA, $4
 DATA	·libc_write_trampoline_addr(SB)/4, $libc_write_trampoline<>(SB)
 
 TEXT libc_mmap_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_mmap(SB)
-
 GLOBL	·libc_mmap_trampoline_addr(SB), RODATA, $4
 DATA	·libc_mmap_trampoline_addr(SB)/4, $libc_mmap_trampoline<>(SB)
 
 TEXT libc_munmap_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_munmap(SB)
-
 GLOBL	·libc_munmap_trampoline_addr(SB), RODATA, $4
 DATA	·libc_munmap_trampoline_addr(SB)/4, $libc_munmap_trampoline<>(SB)
 
 TEXT libc_utimensat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_utimensat(SB)
-
 GLOBL	·libc_utimensat_trampoline_addr(SB), RODATA, $4
 DATA	·libc_utimensat_trampoline_addr(SB)/4, $libc_utimensat_trampoline<>(SB)
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go
index 98446d2..915761e 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go
@@ -519,6 +519,28 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func getresuid(ruid *_C_int, euid *_C_int, suid *_C_int) {
+	syscall_rawSyscall(libc_getresuid_trampoline_addr, uintptr(unsafe.Pointer(ruid)), uintptr(unsafe.Pointer(euid)), uintptr(unsafe.Pointer(suid)))
+	return
+}
+
+var libc_getresuid_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_getresuid getresuid "libc.so"
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func getresgid(rgid *_C_int, egid *_C_int, sgid *_C_int) {
+	syscall_rawSyscall(libc_getresgid_trampoline_addr, uintptr(unsafe.Pointer(rgid)), uintptr(unsafe.Pointer(egid)), uintptr(unsafe.Pointer(sgid)))
+	return
+}
+
+var libc_getresgid_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_getresgid getresgid "libc.so"
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func ioctl(fd int, req uint, arg uintptr) (err error) {
 	_, _, e1 := syscall_syscall(libc_ioctl_trampoline_addr, uintptr(fd), uintptr(req), uintptr(arg))
 	if e1 != 0 {
@@ -533,6 +555,16 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func ioctlPtr(fd int, req uint, arg unsafe.Pointer) (err error) {
+	_, _, e1 := syscall_syscall(libc_ioctl_trampoline_addr, uintptr(fd), uintptr(req), uintptr(arg))
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) {
 	var _p0 unsafe.Pointer
 	if len(mib) > 0 {
@@ -696,6 +728,20 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func ClockGettime(clockid int32, time *Timespec) (err error) {
+	_, _, e1 := syscall_syscall(libc_clock_gettime_trampoline_addr, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+var libc_clock_gettime_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_clock_gettime clock_gettime "libc.so"
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func Close(fd int) (err error) {
 	_, _, e1 := syscall_syscall(libc_close_trampoline_addr, uintptr(fd), 0, 0)
 	if e1 != 0 {
@@ -1872,20 +1918,6 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Setrlimit(which int, lim *Rlimit) (err error) {
-	_, _, e1 := syscall_rawSyscall(libc_setrlimit_trampoline_addr, uintptr(which), uintptr(unsafe.Pointer(lim)), 0)
-	if e1 != 0 {
-		err = errnoErr(e1)
-	}
-	return
-}
-
-var libc_setrlimit_trampoline_addr uintptr
-
-//go:cgo_import_dynamic libc_setrlimit setrlimit "libc.so"
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func Setrtable(rtable int) (err error) {
 	_, _, e1 := syscall_rawSyscall(libc_setrtable_trampoline_addr, uintptr(rtable), 0, 0)
 	if e1 != 0 {
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.s b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.s
index 243a666..2763620 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.s
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.s
@@ -5,792 +5,670 @@
 
 TEXT libc_getgroups_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getgroups(SB)
-
 GLOBL	·libc_getgroups_trampoline_addr(SB), RODATA, $8
 DATA	·libc_getgroups_trampoline_addr(SB)/8, $libc_getgroups_trampoline<>(SB)
 
 TEXT libc_setgroups_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setgroups(SB)
-
 GLOBL	·libc_setgroups_trampoline_addr(SB), RODATA, $8
 DATA	·libc_setgroups_trampoline_addr(SB)/8, $libc_setgroups_trampoline<>(SB)
 
 TEXT libc_wait4_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_wait4(SB)
-
 GLOBL	·libc_wait4_trampoline_addr(SB), RODATA, $8
 DATA	·libc_wait4_trampoline_addr(SB)/8, $libc_wait4_trampoline<>(SB)
 
 TEXT libc_accept_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_accept(SB)
-
 GLOBL	·libc_accept_trampoline_addr(SB), RODATA, $8
 DATA	·libc_accept_trampoline_addr(SB)/8, $libc_accept_trampoline<>(SB)
 
 TEXT libc_bind_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_bind(SB)
-
 GLOBL	·libc_bind_trampoline_addr(SB), RODATA, $8
 DATA	·libc_bind_trampoline_addr(SB)/8, $libc_bind_trampoline<>(SB)
 
 TEXT libc_connect_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_connect(SB)
-
 GLOBL	·libc_connect_trampoline_addr(SB), RODATA, $8
 DATA	·libc_connect_trampoline_addr(SB)/8, $libc_connect_trampoline<>(SB)
 
 TEXT libc_socket_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_socket(SB)
-
 GLOBL	·libc_socket_trampoline_addr(SB), RODATA, $8
 DATA	·libc_socket_trampoline_addr(SB)/8, $libc_socket_trampoline<>(SB)
 
 TEXT libc_getsockopt_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getsockopt(SB)
-
 GLOBL	·libc_getsockopt_trampoline_addr(SB), RODATA, $8
 DATA	·libc_getsockopt_trampoline_addr(SB)/8, $libc_getsockopt_trampoline<>(SB)
 
 TEXT libc_setsockopt_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setsockopt(SB)
-
 GLOBL	·libc_setsockopt_trampoline_addr(SB), RODATA, $8
 DATA	·libc_setsockopt_trampoline_addr(SB)/8, $libc_setsockopt_trampoline<>(SB)
 
 TEXT libc_getpeername_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getpeername(SB)
-
 GLOBL	·libc_getpeername_trampoline_addr(SB), RODATA, $8
 DATA	·libc_getpeername_trampoline_addr(SB)/8, $libc_getpeername_trampoline<>(SB)
 
 TEXT libc_getsockname_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getsockname(SB)
-
 GLOBL	·libc_getsockname_trampoline_addr(SB), RODATA, $8
 DATA	·libc_getsockname_trampoline_addr(SB)/8, $libc_getsockname_trampoline<>(SB)
 
 TEXT libc_shutdown_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_shutdown(SB)
-
 GLOBL	·libc_shutdown_trampoline_addr(SB), RODATA, $8
 DATA	·libc_shutdown_trampoline_addr(SB)/8, $libc_shutdown_trampoline<>(SB)
 
 TEXT libc_socketpair_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_socketpair(SB)
-
 GLOBL	·libc_socketpair_trampoline_addr(SB), RODATA, $8
 DATA	·libc_socketpair_trampoline_addr(SB)/8, $libc_socketpair_trampoline<>(SB)
 
 TEXT libc_recvfrom_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_recvfrom(SB)
-
 GLOBL	·libc_recvfrom_trampoline_addr(SB), RODATA, $8
 DATA	·libc_recvfrom_trampoline_addr(SB)/8, $libc_recvfrom_trampoline<>(SB)
 
 TEXT libc_sendto_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_sendto(SB)
-
 GLOBL	·libc_sendto_trampoline_addr(SB), RODATA, $8
 DATA	·libc_sendto_trampoline_addr(SB)/8, $libc_sendto_trampoline<>(SB)
 
 TEXT libc_recvmsg_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_recvmsg(SB)
-
 GLOBL	·libc_recvmsg_trampoline_addr(SB), RODATA, $8
 DATA	·libc_recvmsg_trampoline_addr(SB)/8, $libc_recvmsg_trampoline<>(SB)
 
 TEXT libc_sendmsg_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_sendmsg(SB)
-
 GLOBL	·libc_sendmsg_trampoline_addr(SB), RODATA, $8
 DATA	·libc_sendmsg_trampoline_addr(SB)/8, $libc_sendmsg_trampoline<>(SB)
 
 TEXT libc_kevent_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_kevent(SB)
-
 GLOBL	·libc_kevent_trampoline_addr(SB), RODATA, $8
 DATA	·libc_kevent_trampoline_addr(SB)/8, $libc_kevent_trampoline<>(SB)
 
 TEXT libc_utimes_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_utimes(SB)
-
 GLOBL	·libc_utimes_trampoline_addr(SB), RODATA, $8
 DATA	·libc_utimes_trampoline_addr(SB)/8, $libc_utimes_trampoline<>(SB)
 
 TEXT libc_futimes_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_futimes(SB)
-
 GLOBL	·libc_futimes_trampoline_addr(SB), RODATA, $8
 DATA	·libc_futimes_trampoline_addr(SB)/8, $libc_futimes_trampoline<>(SB)
 
 TEXT libc_poll_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_poll(SB)
-
 GLOBL	·libc_poll_trampoline_addr(SB), RODATA, $8
 DATA	·libc_poll_trampoline_addr(SB)/8, $libc_poll_trampoline<>(SB)
 
 TEXT libc_madvise_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_madvise(SB)
-
 GLOBL	·libc_madvise_trampoline_addr(SB), RODATA, $8
 DATA	·libc_madvise_trampoline_addr(SB)/8, $libc_madvise_trampoline<>(SB)
 
 TEXT libc_mlock_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_mlock(SB)
-
 GLOBL	·libc_mlock_trampoline_addr(SB), RODATA, $8
 DATA	·libc_mlock_trampoline_addr(SB)/8, $libc_mlock_trampoline<>(SB)
 
 TEXT libc_mlockall_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_mlockall(SB)
-
 GLOBL	·libc_mlockall_trampoline_addr(SB), RODATA, $8
 DATA	·libc_mlockall_trampoline_addr(SB)/8, $libc_mlockall_trampoline<>(SB)
 
 TEXT libc_mprotect_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_mprotect(SB)
-
 GLOBL	·libc_mprotect_trampoline_addr(SB), RODATA, $8
 DATA	·libc_mprotect_trampoline_addr(SB)/8, $libc_mprotect_trampoline<>(SB)
 
 TEXT libc_msync_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_msync(SB)
-
 GLOBL	·libc_msync_trampoline_addr(SB), RODATA, $8
 DATA	·libc_msync_trampoline_addr(SB)/8, $libc_msync_trampoline<>(SB)
 
 TEXT libc_munlock_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_munlock(SB)
-
 GLOBL	·libc_munlock_trampoline_addr(SB), RODATA, $8
 DATA	·libc_munlock_trampoline_addr(SB)/8, $libc_munlock_trampoline<>(SB)
 
 TEXT libc_munlockall_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_munlockall(SB)
-
 GLOBL	·libc_munlockall_trampoline_addr(SB), RODATA, $8
 DATA	·libc_munlockall_trampoline_addr(SB)/8, $libc_munlockall_trampoline<>(SB)
 
 TEXT libc_pipe2_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_pipe2(SB)
-
 GLOBL	·libc_pipe2_trampoline_addr(SB), RODATA, $8
 DATA	·libc_pipe2_trampoline_addr(SB)/8, $libc_pipe2_trampoline<>(SB)
 
 TEXT libc_getdents_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getdents(SB)
-
 GLOBL	·libc_getdents_trampoline_addr(SB), RODATA, $8
 DATA	·libc_getdents_trampoline_addr(SB)/8, $libc_getdents_trampoline<>(SB)
 
 TEXT libc_getcwd_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getcwd(SB)
-
 GLOBL	·libc_getcwd_trampoline_addr(SB), RODATA, $8
 DATA	·libc_getcwd_trampoline_addr(SB)/8, $libc_getcwd_trampoline<>(SB)
 
+TEXT libc_getresuid_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_getresuid(SB)
+GLOBL	·libc_getresuid_trampoline_addr(SB), RODATA, $8
+DATA	·libc_getresuid_trampoline_addr(SB)/8, $libc_getresuid_trampoline<>(SB)
+
+TEXT libc_getresgid_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_getresgid(SB)
+GLOBL	·libc_getresgid_trampoline_addr(SB), RODATA, $8
+DATA	·libc_getresgid_trampoline_addr(SB)/8, $libc_getresgid_trampoline<>(SB)
+
 TEXT libc_ioctl_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_ioctl(SB)
-
 GLOBL	·libc_ioctl_trampoline_addr(SB), RODATA, $8
 DATA	·libc_ioctl_trampoline_addr(SB)/8, $libc_ioctl_trampoline<>(SB)
 
 TEXT libc_sysctl_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_sysctl(SB)
-
 GLOBL	·libc_sysctl_trampoline_addr(SB), RODATA, $8
 DATA	·libc_sysctl_trampoline_addr(SB)/8, $libc_sysctl_trampoline<>(SB)
 
 TEXT libc_ppoll_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_ppoll(SB)
-
 GLOBL	·libc_ppoll_trampoline_addr(SB), RODATA, $8
 DATA	·libc_ppoll_trampoline_addr(SB)/8, $libc_ppoll_trampoline<>(SB)
 
 TEXT libc_access_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_access(SB)
-
 GLOBL	·libc_access_trampoline_addr(SB), RODATA, $8
 DATA	·libc_access_trampoline_addr(SB)/8, $libc_access_trampoline<>(SB)
 
 TEXT libc_adjtime_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_adjtime(SB)
-
 GLOBL	·libc_adjtime_trampoline_addr(SB), RODATA, $8
 DATA	·libc_adjtime_trampoline_addr(SB)/8, $libc_adjtime_trampoline<>(SB)
 
 TEXT libc_chdir_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_chdir(SB)
-
 GLOBL	·libc_chdir_trampoline_addr(SB), RODATA, $8
 DATA	·libc_chdir_trampoline_addr(SB)/8, $libc_chdir_trampoline<>(SB)
 
 TEXT libc_chflags_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_chflags(SB)
-
 GLOBL	·libc_chflags_trampoline_addr(SB), RODATA, $8
 DATA	·libc_chflags_trampoline_addr(SB)/8, $libc_chflags_trampoline<>(SB)
 
 TEXT libc_chmod_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_chmod(SB)
-
 GLOBL	·libc_chmod_trampoline_addr(SB), RODATA, $8
 DATA	·libc_chmod_trampoline_addr(SB)/8, $libc_chmod_trampoline<>(SB)
 
 TEXT libc_chown_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_chown(SB)
-
 GLOBL	·libc_chown_trampoline_addr(SB), RODATA, $8
 DATA	·libc_chown_trampoline_addr(SB)/8, $libc_chown_trampoline<>(SB)
 
 TEXT libc_chroot_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_chroot(SB)
-
 GLOBL	·libc_chroot_trampoline_addr(SB), RODATA, $8
 DATA	·libc_chroot_trampoline_addr(SB)/8, $libc_chroot_trampoline<>(SB)
 
+TEXT libc_clock_gettime_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_clock_gettime(SB)
+GLOBL	·libc_clock_gettime_trampoline_addr(SB), RODATA, $8
+DATA	·libc_clock_gettime_trampoline_addr(SB)/8, $libc_clock_gettime_trampoline<>(SB)
+
 TEXT libc_close_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_close(SB)
-
 GLOBL	·libc_close_trampoline_addr(SB), RODATA, $8
 DATA	·libc_close_trampoline_addr(SB)/8, $libc_close_trampoline<>(SB)
 
 TEXT libc_dup_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_dup(SB)
-
 GLOBL	·libc_dup_trampoline_addr(SB), RODATA, $8
 DATA	·libc_dup_trampoline_addr(SB)/8, $libc_dup_trampoline<>(SB)
 
 TEXT libc_dup2_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_dup2(SB)
-
 GLOBL	·libc_dup2_trampoline_addr(SB), RODATA, $8
 DATA	·libc_dup2_trampoline_addr(SB)/8, $libc_dup2_trampoline<>(SB)
 
 TEXT libc_dup3_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_dup3(SB)
-
 GLOBL	·libc_dup3_trampoline_addr(SB), RODATA, $8
 DATA	·libc_dup3_trampoline_addr(SB)/8, $libc_dup3_trampoline<>(SB)
 
 TEXT libc_exit_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_exit(SB)
-
 GLOBL	·libc_exit_trampoline_addr(SB), RODATA, $8
 DATA	·libc_exit_trampoline_addr(SB)/8, $libc_exit_trampoline<>(SB)
 
 TEXT libc_faccessat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_faccessat(SB)
-
 GLOBL	·libc_faccessat_trampoline_addr(SB), RODATA, $8
 DATA	·libc_faccessat_trampoline_addr(SB)/8, $libc_faccessat_trampoline<>(SB)
 
 TEXT libc_fchdir_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_fchdir(SB)
-
 GLOBL	·libc_fchdir_trampoline_addr(SB), RODATA, $8
 DATA	·libc_fchdir_trampoline_addr(SB)/8, $libc_fchdir_trampoline<>(SB)
 
 TEXT libc_fchflags_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_fchflags(SB)
-
 GLOBL	·libc_fchflags_trampoline_addr(SB), RODATA, $8
 DATA	·libc_fchflags_trampoline_addr(SB)/8, $libc_fchflags_trampoline<>(SB)
 
 TEXT libc_fchmod_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_fchmod(SB)
-
 GLOBL	·libc_fchmod_trampoline_addr(SB), RODATA, $8
 DATA	·libc_fchmod_trampoline_addr(SB)/8, $libc_fchmod_trampoline<>(SB)
 
 TEXT libc_fchmodat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_fchmodat(SB)
-
 GLOBL	·libc_fchmodat_trampoline_addr(SB), RODATA, $8
 DATA	·libc_fchmodat_trampoline_addr(SB)/8, $libc_fchmodat_trampoline<>(SB)
 
 TEXT libc_fchown_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_fchown(SB)
-
 GLOBL	·libc_fchown_trampoline_addr(SB), RODATA, $8
 DATA	·libc_fchown_trampoline_addr(SB)/8, $libc_fchown_trampoline<>(SB)
 
 TEXT libc_fchownat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_fchownat(SB)
-
 GLOBL	·libc_fchownat_trampoline_addr(SB), RODATA, $8
 DATA	·libc_fchownat_trampoline_addr(SB)/8, $libc_fchownat_trampoline<>(SB)
 
 TEXT libc_flock_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_flock(SB)
-
 GLOBL	·libc_flock_trampoline_addr(SB), RODATA, $8
 DATA	·libc_flock_trampoline_addr(SB)/8, $libc_flock_trampoline<>(SB)
 
 TEXT libc_fpathconf_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_fpathconf(SB)
-
 GLOBL	·libc_fpathconf_trampoline_addr(SB), RODATA, $8
 DATA	·libc_fpathconf_trampoline_addr(SB)/8, $libc_fpathconf_trampoline<>(SB)
 
 TEXT libc_fstat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_fstat(SB)
-
 GLOBL	·libc_fstat_trampoline_addr(SB), RODATA, $8
 DATA	·libc_fstat_trampoline_addr(SB)/8, $libc_fstat_trampoline<>(SB)
 
 TEXT libc_fstatat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_fstatat(SB)
-
 GLOBL	·libc_fstatat_trampoline_addr(SB), RODATA, $8
 DATA	·libc_fstatat_trampoline_addr(SB)/8, $libc_fstatat_trampoline<>(SB)
 
 TEXT libc_fstatfs_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_fstatfs(SB)
-
 GLOBL	·libc_fstatfs_trampoline_addr(SB), RODATA, $8
 DATA	·libc_fstatfs_trampoline_addr(SB)/8, $libc_fstatfs_trampoline<>(SB)
 
 TEXT libc_fsync_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_fsync(SB)
-
 GLOBL	·libc_fsync_trampoline_addr(SB), RODATA, $8
 DATA	·libc_fsync_trampoline_addr(SB)/8, $libc_fsync_trampoline<>(SB)
 
 TEXT libc_ftruncate_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_ftruncate(SB)
-
 GLOBL	·libc_ftruncate_trampoline_addr(SB), RODATA, $8
 DATA	·libc_ftruncate_trampoline_addr(SB)/8, $libc_ftruncate_trampoline<>(SB)
 
 TEXT libc_getegid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getegid(SB)
-
 GLOBL	·libc_getegid_trampoline_addr(SB), RODATA, $8
 DATA	·libc_getegid_trampoline_addr(SB)/8, $libc_getegid_trampoline<>(SB)
 
 TEXT libc_geteuid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_geteuid(SB)
-
 GLOBL	·libc_geteuid_trampoline_addr(SB), RODATA, $8
 DATA	·libc_geteuid_trampoline_addr(SB)/8, $libc_geteuid_trampoline<>(SB)
 
 TEXT libc_getgid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getgid(SB)
-
 GLOBL	·libc_getgid_trampoline_addr(SB), RODATA, $8
 DATA	·libc_getgid_trampoline_addr(SB)/8, $libc_getgid_trampoline<>(SB)
 
 TEXT libc_getpgid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getpgid(SB)
-
 GLOBL	·libc_getpgid_trampoline_addr(SB), RODATA, $8
 DATA	·libc_getpgid_trampoline_addr(SB)/8, $libc_getpgid_trampoline<>(SB)
 
 TEXT libc_getpgrp_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getpgrp(SB)
-
 GLOBL	·libc_getpgrp_trampoline_addr(SB), RODATA, $8
 DATA	·libc_getpgrp_trampoline_addr(SB)/8, $libc_getpgrp_trampoline<>(SB)
 
 TEXT libc_getpid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getpid(SB)
-
 GLOBL	·libc_getpid_trampoline_addr(SB), RODATA, $8
 DATA	·libc_getpid_trampoline_addr(SB)/8, $libc_getpid_trampoline<>(SB)
 
 TEXT libc_getppid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getppid(SB)
-
 GLOBL	·libc_getppid_trampoline_addr(SB), RODATA, $8
 DATA	·libc_getppid_trampoline_addr(SB)/8, $libc_getppid_trampoline<>(SB)
 
 TEXT libc_getpriority_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getpriority(SB)
-
 GLOBL	·libc_getpriority_trampoline_addr(SB), RODATA, $8
 DATA	·libc_getpriority_trampoline_addr(SB)/8, $libc_getpriority_trampoline<>(SB)
 
 TEXT libc_getrlimit_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getrlimit(SB)
-
 GLOBL	·libc_getrlimit_trampoline_addr(SB), RODATA, $8
 DATA	·libc_getrlimit_trampoline_addr(SB)/8, $libc_getrlimit_trampoline<>(SB)
 
 TEXT libc_getrtable_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getrtable(SB)
-
 GLOBL	·libc_getrtable_trampoline_addr(SB), RODATA, $8
 DATA	·libc_getrtable_trampoline_addr(SB)/8, $libc_getrtable_trampoline<>(SB)
 
 TEXT libc_getrusage_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getrusage(SB)
-
 GLOBL	·libc_getrusage_trampoline_addr(SB), RODATA, $8
 DATA	·libc_getrusage_trampoline_addr(SB)/8, $libc_getrusage_trampoline<>(SB)
 
 TEXT libc_getsid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getsid(SB)
-
 GLOBL	·libc_getsid_trampoline_addr(SB), RODATA, $8
 DATA	·libc_getsid_trampoline_addr(SB)/8, $libc_getsid_trampoline<>(SB)
 
 TEXT libc_gettimeofday_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_gettimeofday(SB)
-
 GLOBL	·libc_gettimeofday_trampoline_addr(SB), RODATA, $8
 DATA	·libc_gettimeofday_trampoline_addr(SB)/8, $libc_gettimeofday_trampoline<>(SB)
 
 TEXT libc_getuid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getuid(SB)
-
 GLOBL	·libc_getuid_trampoline_addr(SB), RODATA, $8
 DATA	·libc_getuid_trampoline_addr(SB)/8, $libc_getuid_trampoline<>(SB)
 
 TEXT libc_issetugid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_issetugid(SB)
-
 GLOBL	·libc_issetugid_trampoline_addr(SB), RODATA, $8
 DATA	·libc_issetugid_trampoline_addr(SB)/8, $libc_issetugid_trampoline<>(SB)
 
 TEXT libc_kill_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_kill(SB)
-
 GLOBL	·libc_kill_trampoline_addr(SB), RODATA, $8
 DATA	·libc_kill_trampoline_addr(SB)/8, $libc_kill_trampoline<>(SB)
 
 TEXT libc_kqueue_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_kqueue(SB)
-
 GLOBL	·libc_kqueue_trampoline_addr(SB), RODATA, $8
 DATA	·libc_kqueue_trampoline_addr(SB)/8, $libc_kqueue_trampoline<>(SB)
 
 TEXT libc_lchown_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_lchown(SB)
-
 GLOBL	·libc_lchown_trampoline_addr(SB), RODATA, $8
 DATA	·libc_lchown_trampoline_addr(SB)/8, $libc_lchown_trampoline<>(SB)
 
 TEXT libc_link_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_link(SB)
-
 GLOBL	·libc_link_trampoline_addr(SB), RODATA, $8
 DATA	·libc_link_trampoline_addr(SB)/8, $libc_link_trampoline<>(SB)
 
 TEXT libc_linkat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_linkat(SB)
-
 GLOBL	·libc_linkat_trampoline_addr(SB), RODATA, $8
 DATA	·libc_linkat_trampoline_addr(SB)/8, $libc_linkat_trampoline<>(SB)
 
 TEXT libc_listen_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_listen(SB)
-
 GLOBL	·libc_listen_trampoline_addr(SB), RODATA, $8
 DATA	·libc_listen_trampoline_addr(SB)/8, $libc_listen_trampoline<>(SB)
 
 TEXT libc_lstat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_lstat(SB)
-
 GLOBL	·libc_lstat_trampoline_addr(SB), RODATA, $8
 DATA	·libc_lstat_trampoline_addr(SB)/8, $libc_lstat_trampoline<>(SB)
 
 TEXT libc_mkdir_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_mkdir(SB)
-
 GLOBL	·libc_mkdir_trampoline_addr(SB), RODATA, $8
 DATA	·libc_mkdir_trampoline_addr(SB)/8, $libc_mkdir_trampoline<>(SB)
 
 TEXT libc_mkdirat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_mkdirat(SB)
-
 GLOBL	·libc_mkdirat_trampoline_addr(SB), RODATA, $8
 DATA	·libc_mkdirat_trampoline_addr(SB)/8, $libc_mkdirat_trampoline<>(SB)
 
 TEXT libc_mkfifo_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_mkfifo(SB)
-
 GLOBL	·libc_mkfifo_trampoline_addr(SB), RODATA, $8
 DATA	·libc_mkfifo_trampoline_addr(SB)/8, $libc_mkfifo_trampoline<>(SB)
 
 TEXT libc_mkfifoat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_mkfifoat(SB)
-
 GLOBL	·libc_mkfifoat_trampoline_addr(SB), RODATA, $8
 DATA	·libc_mkfifoat_trampoline_addr(SB)/8, $libc_mkfifoat_trampoline<>(SB)
 
 TEXT libc_mknod_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_mknod(SB)
-
 GLOBL	·libc_mknod_trampoline_addr(SB), RODATA, $8
 DATA	·libc_mknod_trampoline_addr(SB)/8, $libc_mknod_trampoline<>(SB)
 
 TEXT libc_mknodat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_mknodat(SB)
-
 GLOBL	·libc_mknodat_trampoline_addr(SB), RODATA, $8
 DATA	·libc_mknodat_trampoline_addr(SB)/8, $libc_mknodat_trampoline<>(SB)
 
 TEXT libc_nanosleep_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_nanosleep(SB)
-
 GLOBL	·libc_nanosleep_trampoline_addr(SB), RODATA, $8
 DATA	·libc_nanosleep_trampoline_addr(SB)/8, $libc_nanosleep_trampoline<>(SB)
 
 TEXT libc_open_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_open(SB)
-
 GLOBL	·libc_open_trampoline_addr(SB), RODATA, $8
 DATA	·libc_open_trampoline_addr(SB)/8, $libc_open_trampoline<>(SB)
 
 TEXT libc_openat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_openat(SB)
-
 GLOBL	·libc_openat_trampoline_addr(SB), RODATA, $8
 DATA	·libc_openat_trampoline_addr(SB)/8, $libc_openat_trampoline<>(SB)
 
 TEXT libc_pathconf_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_pathconf(SB)
-
 GLOBL	·libc_pathconf_trampoline_addr(SB), RODATA, $8
 DATA	·libc_pathconf_trampoline_addr(SB)/8, $libc_pathconf_trampoline<>(SB)
 
 TEXT libc_pread_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_pread(SB)
-
 GLOBL	·libc_pread_trampoline_addr(SB), RODATA, $8
 DATA	·libc_pread_trampoline_addr(SB)/8, $libc_pread_trampoline<>(SB)
 
 TEXT libc_pwrite_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_pwrite(SB)
-
 GLOBL	·libc_pwrite_trampoline_addr(SB), RODATA, $8
 DATA	·libc_pwrite_trampoline_addr(SB)/8, $libc_pwrite_trampoline<>(SB)
 
 TEXT libc_read_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_read(SB)
-
 GLOBL	·libc_read_trampoline_addr(SB), RODATA, $8
 DATA	·libc_read_trampoline_addr(SB)/8, $libc_read_trampoline<>(SB)
 
 TEXT libc_readlink_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_readlink(SB)
-
 GLOBL	·libc_readlink_trampoline_addr(SB), RODATA, $8
 DATA	·libc_readlink_trampoline_addr(SB)/8, $libc_readlink_trampoline<>(SB)
 
 TEXT libc_readlinkat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_readlinkat(SB)
-
 GLOBL	·libc_readlinkat_trampoline_addr(SB), RODATA, $8
 DATA	·libc_readlinkat_trampoline_addr(SB)/8, $libc_readlinkat_trampoline<>(SB)
 
 TEXT libc_rename_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_rename(SB)
-
 GLOBL	·libc_rename_trampoline_addr(SB), RODATA, $8
 DATA	·libc_rename_trampoline_addr(SB)/8, $libc_rename_trampoline<>(SB)
 
 TEXT libc_renameat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_renameat(SB)
-
 GLOBL	·libc_renameat_trampoline_addr(SB), RODATA, $8
 DATA	·libc_renameat_trampoline_addr(SB)/8, $libc_renameat_trampoline<>(SB)
 
 TEXT libc_revoke_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_revoke(SB)
-
 GLOBL	·libc_revoke_trampoline_addr(SB), RODATA, $8
 DATA	·libc_revoke_trampoline_addr(SB)/8, $libc_revoke_trampoline<>(SB)
 
 TEXT libc_rmdir_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_rmdir(SB)
-
 GLOBL	·libc_rmdir_trampoline_addr(SB), RODATA, $8
 DATA	·libc_rmdir_trampoline_addr(SB)/8, $libc_rmdir_trampoline<>(SB)
 
 TEXT libc_lseek_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_lseek(SB)
-
 GLOBL	·libc_lseek_trampoline_addr(SB), RODATA, $8
 DATA	·libc_lseek_trampoline_addr(SB)/8, $libc_lseek_trampoline<>(SB)
 
 TEXT libc_select_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_select(SB)
-
 GLOBL	·libc_select_trampoline_addr(SB), RODATA, $8
 DATA	·libc_select_trampoline_addr(SB)/8, $libc_select_trampoline<>(SB)
 
 TEXT libc_setegid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setegid(SB)
-
 GLOBL	·libc_setegid_trampoline_addr(SB), RODATA, $8
 DATA	·libc_setegid_trampoline_addr(SB)/8, $libc_setegid_trampoline<>(SB)
 
 TEXT libc_seteuid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_seteuid(SB)
-
 GLOBL	·libc_seteuid_trampoline_addr(SB), RODATA, $8
 DATA	·libc_seteuid_trampoline_addr(SB)/8, $libc_seteuid_trampoline<>(SB)
 
 TEXT libc_setgid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setgid(SB)
-
 GLOBL	·libc_setgid_trampoline_addr(SB), RODATA, $8
 DATA	·libc_setgid_trampoline_addr(SB)/8, $libc_setgid_trampoline<>(SB)
 
 TEXT libc_setlogin_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setlogin(SB)
-
 GLOBL	·libc_setlogin_trampoline_addr(SB), RODATA, $8
 DATA	·libc_setlogin_trampoline_addr(SB)/8, $libc_setlogin_trampoline<>(SB)
 
 TEXT libc_setpgid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setpgid(SB)
-
 GLOBL	·libc_setpgid_trampoline_addr(SB), RODATA, $8
 DATA	·libc_setpgid_trampoline_addr(SB)/8, $libc_setpgid_trampoline<>(SB)
 
 TEXT libc_setpriority_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setpriority(SB)
-
 GLOBL	·libc_setpriority_trampoline_addr(SB), RODATA, $8
 DATA	·libc_setpriority_trampoline_addr(SB)/8, $libc_setpriority_trampoline<>(SB)
 
 TEXT libc_setregid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setregid(SB)
-
 GLOBL	·libc_setregid_trampoline_addr(SB), RODATA, $8
 DATA	·libc_setregid_trampoline_addr(SB)/8, $libc_setregid_trampoline<>(SB)
 
 TEXT libc_setreuid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setreuid(SB)
-
 GLOBL	·libc_setreuid_trampoline_addr(SB), RODATA, $8
 DATA	·libc_setreuid_trampoline_addr(SB)/8, $libc_setreuid_trampoline<>(SB)
 
 TEXT libc_setresgid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setresgid(SB)
-
 GLOBL	·libc_setresgid_trampoline_addr(SB), RODATA, $8
 DATA	·libc_setresgid_trampoline_addr(SB)/8, $libc_setresgid_trampoline<>(SB)
 
 TEXT libc_setresuid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setresuid(SB)
-
 GLOBL	·libc_setresuid_trampoline_addr(SB), RODATA, $8
 DATA	·libc_setresuid_trampoline_addr(SB)/8, $libc_setresuid_trampoline<>(SB)
 
-TEXT libc_setrlimit_trampoline<>(SB),NOSPLIT,$0-0
-	JMP	libc_setrlimit(SB)
-
-GLOBL	·libc_setrlimit_trampoline_addr(SB), RODATA, $8
-DATA	·libc_setrlimit_trampoline_addr(SB)/8, $libc_setrlimit_trampoline<>(SB)
-
 TEXT libc_setrtable_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setrtable(SB)
-
 GLOBL	·libc_setrtable_trampoline_addr(SB), RODATA, $8
 DATA	·libc_setrtable_trampoline_addr(SB)/8, $libc_setrtable_trampoline<>(SB)
 
 TEXT libc_setsid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setsid(SB)
-
 GLOBL	·libc_setsid_trampoline_addr(SB), RODATA, $8
 DATA	·libc_setsid_trampoline_addr(SB)/8, $libc_setsid_trampoline<>(SB)
 
 TEXT libc_settimeofday_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_settimeofday(SB)
-
 GLOBL	·libc_settimeofday_trampoline_addr(SB), RODATA, $8
 DATA	·libc_settimeofday_trampoline_addr(SB)/8, $libc_settimeofday_trampoline<>(SB)
 
 TEXT libc_setuid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setuid(SB)
-
 GLOBL	·libc_setuid_trampoline_addr(SB), RODATA, $8
 DATA	·libc_setuid_trampoline_addr(SB)/8, $libc_setuid_trampoline<>(SB)
 
 TEXT libc_stat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_stat(SB)
-
 GLOBL	·libc_stat_trampoline_addr(SB), RODATA, $8
 DATA	·libc_stat_trampoline_addr(SB)/8, $libc_stat_trampoline<>(SB)
 
 TEXT libc_statfs_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_statfs(SB)
-
 GLOBL	·libc_statfs_trampoline_addr(SB), RODATA, $8
 DATA	·libc_statfs_trampoline_addr(SB)/8, $libc_statfs_trampoline<>(SB)
 
 TEXT libc_symlink_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_symlink(SB)
-
 GLOBL	·libc_symlink_trampoline_addr(SB), RODATA, $8
 DATA	·libc_symlink_trampoline_addr(SB)/8, $libc_symlink_trampoline<>(SB)
 
 TEXT libc_symlinkat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_symlinkat(SB)
-
 GLOBL	·libc_symlinkat_trampoline_addr(SB), RODATA, $8
 DATA	·libc_symlinkat_trampoline_addr(SB)/8, $libc_symlinkat_trampoline<>(SB)
 
 TEXT libc_sync_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_sync(SB)
-
 GLOBL	·libc_sync_trampoline_addr(SB), RODATA, $8
 DATA	·libc_sync_trampoline_addr(SB)/8, $libc_sync_trampoline<>(SB)
 
 TEXT libc_truncate_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_truncate(SB)
-
 GLOBL	·libc_truncate_trampoline_addr(SB), RODATA, $8
 DATA	·libc_truncate_trampoline_addr(SB)/8, $libc_truncate_trampoline<>(SB)
 
 TEXT libc_umask_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_umask(SB)
-
 GLOBL	·libc_umask_trampoline_addr(SB), RODATA, $8
 DATA	·libc_umask_trampoline_addr(SB)/8, $libc_umask_trampoline<>(SB)
 
 TEXT libc_unlink_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_unlink(SB)
-
 GLOBL	·libc_unlink_trampoline_addr(SB), RODATA, $8
 DATA	·libc_unlink_trampoline_addr(SB)/8, $libc_unlink_trampoline<>(SB)
 
 TEXT libc_unlinkat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_unlinkat(SB)
-
 GLOBL	·libc_unlinkat_trampoline_addr(SB), RODATA, $8
 DATA	·libc_unlinkat_trampoline_addr(SB)/8, $libc_unlinkat_trampoline<>(SB)
 
 TEXT libc_unmount_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_unmount(SB)
-
 GLOBL	·libc_unmount_trampoline_addr(SB), RODATA, $8
 DATA	·libc_unmount_trampoline_addr(SB)/8, $libc_unmount_trampoline<>(SB)
 
 TEXT libc_write_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_write(SB)
-
 GLOBL	·libc_write_trampoline_addr(SB), RODATA, $8
 DATA	·libc_write_trampoline_addr(SB)/8, $libc_write_trampoline<>(SB)
 
 TEXT libc_mmap_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_mmap(SB)
-
 GLOBL	·libc_mmap_trampoline_addr(SB), RODATA, $8
 DATA	·libc_mmap_trampoline_addr(SB)/8, $libc_mmap_trampoline<>(SB)
 
 TEXT libc_munmap_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_munmap(SB)
-
 GLOBL	·libc_munmap_trampoline_addr(SB), RODATA, $8
 DATA	·libc_munmap_trampoline_addr(SB)/8, $libc_munmap_trampoline<>(SB)
 
 TEXT libc_utimensat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_utimensat(SB)
-
 GLOBL	·libc_utimensat_trampoline_addr(SB), RODATA, $8
 DATA	·libc_utimensat_trampoline_addr(SB)/8, $libc_utimensat_trampoline<>(SB)
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go
index 8da6791..8e87fdf 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go
@@ -519,6 +519,28 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func getresuid(ruid *_C_int, euid *_C_int, suid *_C_int) {
+	syscall_rawSyscall(libc_getresuid_trampoline_addr, uintptr(unsafe.Pointer(ruid)), uintptr(unsafe.Pointer(euid)), uintptr(unsafe.Pointer(suid)))
+	return
+}
+
+var libc_getresuid_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_getresuid getresuid "libc.so"
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func getresgid(rgid *_C_int, egid *_C_int, sgid *_C_int) {
+	syscall_rawSyscall(libc_getresgid_trampoline_addr, uintptr(unsafe.Pointer(rgid)), uintptr(unsafe.Pointer(egid)), uintptr(unsafe.Pointer(sgid)))
+	return
+}
+
+var libc_getresgid_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_getresgid getresgid "libc.so"
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func ioctl(fd int, req uint, arg uintptr) (err error) {
 	_, _, e1 := syscall_syscall(libc_ioctl_trampoline_addr, uintptr(fd), uintptr(req), uintptr(arg))
 	if e1 != 0 {
@@ -527,6 +549,14 @@
 	return
 }
 
+func ioctlPtr(fd int, req uint, arg unsafe.Pointer) (err error) {
+	_, _, e1 := syscall_syscall(libc_ioctl_trampoline_addr, uintptr(fd), uintptr(req), uintptr(arg))
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
 var libc_ioctl_trampoline_addr uintptr
 
 //go:cgo_import_dynamic libc_ioctl ioctl "libc.so"
@@ -696,6 +726,20 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func ClockGettime(clockid int32, time *Timespec) (err error) {
+	_, _, e1 := syscall_syscall(libc_clock_gettime_trampoline_addr, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+var libc_clock_gettime_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_clock_gettime clock_gettime "libc.so"
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func Close(fd int) (err error) {
 	_, _, e1 := syscall_syscall(libc_close_trampoline_addr, uintptr(fd), 0, 0)
 	if e1 != 0 {
@@ -1872,20 +1916,6 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Setrlimit(which int, lim *Rlimit) (err error) {
-	_, _, e1 := syscall_rawSyscall(libc_setrlimit_trampoline_addr, uintptr(which), uintptr(unsafe.Pointer(lim)), 0)
-	if e1 != 0 {
-		err = errnoErr(e1)
-	}
-	return
-}
-
-var libc_setrlimit_trampoline_addr uintptr
-
-//go:cgo_import_dynamic libc_setrlimit setrlimit "libc.so"
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func Setrtable(rtable int) (err error) {
 	_, _, e1 := syscall_rawSyscall(libc_setrtable_trampoline_addr, uintptr(rtable), 0, 0)
 	if e1 != 0 {
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.s b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.s
index 9ad116d..c922314 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.s
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.s
@@ -5,792 +5,670 @@
 
 TEXT libc_getgroups_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getgroups(SB)
-
 GLOBL	·libc_getgroups_trampoline_addr(SB), RODATA, $4
 DATA	·libc_getgroups_trampoline_addr(SB)/4, $libc_getgroups_trampoline<>(SB)
 
 TEXT libc_setgroups_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setgroups(SB)
-
 GLOBL	·libc_setgroups_trampoline_addr(SB), RODATA, $4
 DATA	·libc_setgroups_trampoline_addr(SB)/4, $libc_setgroups_trampoline<>(SB)
 
 TEXT libc_wait4_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_wait4(SB)
-
 GLOBL	·libc_wait4_trampoline_addr(SB), RODATA, $4
 DATA	·libc_wait4_trampoline_addr(SB)/4, $libc_wait4_trampoline<>(SB)
 
 TEXT libc_accept_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_accept(SB)
-
 GLOBL	·libc_accept_trampoline_addr(SB), RODATA, $4
 DATA	·libc_accept_trampoline_addr(SB)/4, $libc_accept_trampoline<>(SB)
 
 TEXT libc_bind_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_bind(SB)
-
 GLOBL	·libc_bind_trampoline_addr(SB), RODATA, $4
 DATA	·libc_bind_trampoline_addr(SB)/4, $libc_bind_trampoline<>(SB)
 
 TEXT libc_connect_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_connect(SB)
-
 GLOBL	·libc_connect_trampoline_addr(SB), RODATA, $4
 DATA	·libc_connect_trampoline_addr(SB)/4, $libc_connect_trampoline<>(SB)
 
 TEXT libc_socket_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_socket(SB)
-
 GLOBL	·libc_socket_trampoline_addr(SB), RODATA, $4
 DATA	·libc_socket_trampoline_addr(SB)/4, $libc_socket_trampoline<>(SB)
 
 TEXT libc_getsockopt_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getsockopt(SB)
-
 GLOBL	·libc_getsockopt_trampoline_addr(SB), RODATA, $4
 DATA	·libc_getsockopt_trampoline_addr(SB)/4, $libc_getsockopt_trampoline<>(SB)
 
 TEXT libc_setsockopt_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setsockopt(SB)
-
 GLOBL	·libc_setsockopt_trampoline_addr(SB), RODATA, $4
 DATA	·libc_setsockopt_trampoline_addr(SB)/4, $libc_setsockopt_trampoline<>(SB)
 
 TEXT libc_getpeername_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getpeername(SB)
-
 GLOBL	·libc_getpeername_trampoline_addr(SB), RODATA, $4
 DATA	·libc_getpeername_trampoline_addr(SB)/4, $libc_getpeername_trampoline<>(SB)
 
 TEXT libc_getsockname_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getsockname(SB)
-
 GLOBL	·libc_getsockname_trampoline_addr(SB), RODATA, $4
 DATA	·libc_getsockname_trampoline_addr(SB)/4, $libc_getsockname_trampoline<>(SB)
 
 TEXT libc_shutdown_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_shutdown(SB)
-
 GLOBL	·libc_shutdown_trampoline_addr(SB), RODATA, $4
 DATA	·libc_shutdown_trampoline_addr(SB)/4, $libc_shutdown_trampoline<>(SB)
 
 TEXT libc_socketpair_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_socketpair(SB)
-
 GLOBL	·libc_socketpair_trampoline_addr(SB), RODATA, $4
 DATA	·libc_socketpair_trampoline_addr(SB)/4, $libc_socketpair_trampoline<>(SB)
 
 TEXT libc_recvfrom_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_recvfrom(SB)
-
 GLOBL	·libc_recvfrom_trampoline_addr(SB), RODATA, $4
 DATA	·libc_recvfrom_trampoline_addr(SB)/4, $libc_recvfrom_trampoline<>(SB)
 
 TEXT libc_sendto_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_sendto(SB)
-
 GLOBL	·libc_sendto_trampoline_addr(SB), RODATA, $4
 DATA	·libc_sendto_trampoline_addr(SB)/4, $libc_sendto_trampoline<>(SB)
 
 TEXT libc_recvmsg_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_recvmsg(SB)
-
 GLOBL	·libc_recvmsg_trampoline_addr(SB), RODATA, $4
 DATA	·libc_recvmsg_trampoline_addr(SB)/4, $libc_recvmsg_trampoline<>(SB)
 
 TEXT libc_sendmsg_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_sendmsg(SB)
-
 GLOBL	·libc_sendmsg_trampoline_addr(SB), RODATA, $4
 DATA	·libc_sendmsg_trampoline_addr(SB)/4, $libc_sendmsg_trampoline<>(SB)
 
 TEXT libc_kevent_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_kevent(SB)
-
 GLOBL	·libc_kevent_trampoline_addr(SB), RODATA, $4
 DATA	·libc_kevent_trampoline_addr(SB)/4, $libc_kevent_trampoline<>(SB)
 
 TEXT libc_utimes_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_utimes(SB)
-
 GLOBL	·libc_utimes_trampoline_addr(SB), RODATA, $4
 DATA	·libc_utimes_trampoline_addr(SB)/4, $libc_utimes_trampoline<>(SB)
 
 TEXT libc_futimes_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_futimes(SB)
-
 GLOBL	·libc_futimes_trampoline_addr(SB), RODATA, $4
 DATA	·libc_futimes_trampoline_addr(SB)/4, $libc_futimes_trampoline<>(SB)
 
 TEXT libc_poll_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_poll(SB)
-
 GLOBL	·libc_poll_trampoline_addr(SB), RODATA, $4
 DATA	·libc_poll_trampoline_addr(SB)/4, $libc_poll_trampoline<>(SB)
 
 TEXT libc_madvise_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_madvise(SB)
-
 GLOBL	·libc_madvise_trampoline_addr(SB), RODATA, $4
 DATA	·libc_madvise_trampoline_addr(SB)/4, $libc_madvise_trampoline<>(SB)
 
 TEXT libc_mlock_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_mlock(SB)
-
 GLOBL	·libc_mlock_trampoline_addr(SB), RODATA, $4
 DATA	·libc_mlock_trampoline_addr(SB)/4, $libc_mlock_trampoline<>(SB)
 
 TEXT libc_mlockall_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_mlockall(SB)
-
 GLOBL	·libc_mlockall_trampoline_addr(SB), RODATA, $4
 DATA	·libc_mlockall_trampoline_addr(SB)/4, $libc_mlockall_trampoline<>(SB)
 
 TEXT libc_mprotect_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_mprotect(SB)
-
 GLOBL	·libc_mprotect_trampoline_addr(SB), RODATA, $4
 DATA	·libc_mprotect_trampoline_addr(SB)/4, $libc_mprotect_trampoline<>(SB)
 
 TEXT libc_msync_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_msync(SB)
-
 GLOBL	·libc_msync_trampoline_addr(SB), RODATA, $4
 DATA	·libc_msync_trampoline_addr(SB)/4, $libc_msync_trampoline<>(SB)
 
 TEXT libc_munlock_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_munlock(SB)
-
 GLOBL	·libc_munlock_trampoline_addr(SB), RODATA, $4
 DATA	·libc_munlock_trampoline_addr(SB)/4, $libc_munlock_trampoline<>(SB)
 
 TEXT libc_munlockall_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_munlockall(SB)
-
 GLOBL	·libc_munlockall_trampoline_addr(SB), RODATA, $4
 DATA	·libc_munlockall_trampoline_addr(SB)/4, $libc_munlockall_trampoline<>(SB)
 
 TEXT libc_pipe2_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_pipe2(SB)
-
 GLOBL	·libc_pipe2_trampoline_addr(SB), RODATA, $4
 DATA	·libc_pipe2_trampoline_addr(SB)/4, $libc_pipe2_trampoline<>(SB)
 
 TEXT libc_getdents_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getdents(SB)
-
 GLOBL	·libc_getdents_trampoline_addr(SB), RODATA, $4
 DATA	·libc_getdents_trampoline_addr(SB)/4, $libc_getdents_trampoline<>(SB)
 
 TEXT libc_getcwd_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getcwd(SB)
-
 GLOBL	·libc_getcwd_trampoline_addr(SB), RODATA, $4
 DATA	·libc_getcwd_trampoline_addr(SB)/4, $libc_getcwd_trampoline<>(SB)
 
+TEXT libc_getresuid_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_getresuid(SB)
+GLOBL	·libc_getresuid_trampoline_addr(SB), RODATA, $4
+DATA	·libc_getresuid_trampoline_addr(SB)/4, $libc_getresuid_trampoline<>(SB)
+
+TEXT libc_getresgid_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_getresgid(SB)
+GLOBL	·libc_getresgid_trampoline_addr(SB), RODATA, $4
+DATA	·libc_getresgid_trampoline_addr(SB)/4, $libc_getresgid_trampoline<>(SB)
+
 TEXT libc_ioctl_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_ioctl(SB)
-
 GLOBL	·libc_ioctl_trampoline_addr(SB), RODATA, $4
 DATA	·libc_ioctl_trampoline_addr(SB)/4, $libc_ioctl_trampoline<>(SB)
 
 TEXT libc_sysctl_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_sysctl(SB)
-
 GLOBL	·libc_sysctl_trampoline_addr(SB), RODATA, $4
 DATA	·libc_sysctl_trampoline_addr(SB)/4, $libc_sysctl_trampoline<>(SB)
 
 TEXT libc_ppoll_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_ppoll(SB)
-
 GLOBL	·libc_ppoll_trampoline_addr(SB), RODATA, $4
 DATA	·libc_ppoll_trampoline_addr(SB)/4, $libc_ppoll_trampoline<>(SB)
 
 TEXT libc_access_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_access(SB)
-
 GLOBL	·libc_access_trampoline_addr(SB), RODATA, $4
 DATA	·libc_access_trampoline_addr(SB)/4, $libc_access_trampoline<>(SB)
 
 TEXT libc_adjtime_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_adjtime(SB)
-
 GLOBL	·libc_adjtime_trampoline_addr(SB), RODATA, $4
 DATA	·libc_adjtime_trampoline_addr(SB)/4, $libc_adjtime_trampoline<>(SB)
 
 TEXT libc_chdir_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_chdir(SB)
-
 GLOBL	·libc_chdir_trampoline_addr(SB), RODATA, $4
 DATA	·libc_chdir_trampoline_addr(SB)/4, $libc_chdir_trampoline<>(SB)
 
 TEXT libc_chflags_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_chflags(SB)
-
 GLOBL	·libc_chflags_trampoline_addr(SB), RODATA, $4
 DATA	·libc_chflags_trampoline_addr(SB)/4, $libc_chflags_trampoline<>(SB)
 
 TEXT libc_chmod_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_chmod(SB)
-
 GLOBL	·libc_chmod_trampoline_addr(SB), RODATA, $4
 DATA	·libc_chmod_trampoline_addr(SB)/4, $libc_chmod_trampoline<>(SB)
 
 TEXT libc_chown_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_chown(SB)
-
 GLOBL	·libc_chown_trampoline_addr(SB), RODATA, $4
 DATA	·libc_chown_trampoline_addr(SB)/4, $libc_chown_trampoline<>(SB)
 
 TEXT libc_chroot_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_chroot(SB)
-
 GLOBL	·libc_chroot_trampoline_addr(SB), RODATA, $4
 DATA	·libc_chroot_trampoline_addr(SB)/4, $libc_chroot_trampoline<>(SB)
 
+TEXT libc_clock_gettime_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_clock_gettime(SB)
+GLOBL	·libc_clock_gettime_trampoline_addr(SB), RODATA, $4
+DATA	·libc_clock_gettime_trampoline_addr(SB)/4, $libc_clock_gettime_trampoline<>(SB)
+
 TEXT libc_close_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_close(SB)
-
 GLOBL	·libc_close_trampoline_addr(SB), RODATA, $4
 DATA	·libc_close_trampoline_addr(SB)/4, $libc_close_trampoline<>(SB)
 
 TEXT libc_dup_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_dup(SB)
-
 GLOBL	·libc_dup_trampoline_addr(SB), RODATA, $4
 DATA	·libc_dup_trampoline_addr(SB)/4, $libc_dup_trampoline<>(SB)
 
 TEXT libc_dup2_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_dup2(SB)
-
 GLOBL	·libc_dup2_trampoline_addr(SB), RODATA, $4
 DATA	·libc_dup2_trampoline_addr(SB)/4, $libc_dup2_trampoline<>(SB)
 
 TEXT libc_dup3_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_dup3(SB)
-
 GLOBL	·libc_dup3_trampoline_addr(SB), RODATA, $4
 DATA	·libc_dup3_trampoline_addr(SB)/4, $libc_dup3_trampoline<>(SB)
 
 TEXT libc_exit_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_exit(SB)
-
 GLOBL	·libc_exit_trampoline_addr(SB), RODATA, $4
 DATA	·libc_exit_trampoline_addr(SB)/4, $libc_exit_trampoline<>(SB)
 
 TEXT libc_faccessat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_faccessat(SB)
-
 GLOBL	·libc_faccessat_trampoline_addr(SB), RODATA, $4
 DATA	·libc_faccessat_trampoline_addr(SB)/4, $libc_faccessat_trampoline<>(SB)
 
 TEXT libc_fchdir_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_fchdir(SB)
-
 GLOBL	·libc_fchdir_trampoline_addr(SB), RODATA, $4
 DATA	·libc_fchdir_trampoline_addr(SB)/4, $libc_fchdir_trampoline<>(SB)
 
 TEXT libc_fchflags_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_fchflags(SB)
-
 GLOBL	·libc_fchflags_trampoline_addr(SB), RODATA, $4
 DATA	·libc_fchflags_trampoline_addr(SB)/4, $libc_fchflags_trampoline<>(SB)
 
 TEXT libc_fchmod_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_fchmod(SB)
-
 GLOBL	·libc_fchmod_trampoline_addr(SB), RODATA, $4
 DATA	·libc_fchmod_trampoline_addr(SB)/4, $libc_fchmod_trampoline<>(SB)
 
 TEXT libc_fchmodat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_fchmodat(SB)
-
 GLOBL	·libc_fchmodat_trampoline_addr(SB), RODATA, $4
 DATA	·libc_fchmodat_trampoline_addr(SB)/4, $libc_fchmodat_trampoline<>(SB)
 
 TEXT libc_fchown_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_fchown(SB)
-
 GLOBL	·libc_fchown_trampoline_addr(SB), RODATA, $4
 DATA	·libc_fchown_trampoline_addr(SB)/4, $libc_fchown_trampoline<>(SB)
 
 TEXT libc_fchownat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_fchownat(SB)
-
 GLOBL	·libc_fchownat_trampoline_addr(SB), RODATA, $4
 DATA	·libc_fchownat_trampoline_addr(SB)/4, $libc_fchownat_trampoline<>(SB)
 
 TEXT libc_flock_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_flock(SB)
-
 GLOBL	·libc_flock_trampoline_addr(SB), RODATA, $4
 DATA	·libc_flock_trampoline_addr(SB)/4, $libc_flock_trampoline<>(SB)
 
 TEXT libc_fpathconf_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_fpathconf(SB)
-
 GLOBL	·libc_fpathconf_trampoline_addr(SB), RODATA, $4
 DATA	·libc_fpathconf_trampoline_addr(SB)/4, $libc_fpathconf_trampoline<>(SB)
 
 TEXT libc_fstat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_fstat(SB)
-
 GLOBL	·libc_fstat_trampoline_addr(SB), RODATA, $4
 DATA	·libc_fstat_trampoline_addr(SB)/4, $libc_fstat_trampoline<>(SB)
 
 TEXT libc_fstatat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_fstatat(SB)
-
 GLOBL	·libc_fstatat_trampoline_addr(SB), RODATA, $4
 DATA	·libc_fstatat_trampoline_addr(SB)/4, $libc_fstatat_trampoline<>(SB)
 
 TEXT libc_fstatfs_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_fstatfs(SB)
-
 GLOBL	·libc_fstatfs_trampoline_addr(SB), RODATA, $4
 DATA	·libc_fstatfs_trampoline_addr(SB)/4, $libc_fstatfs_trampoline<>(SB)
 
 TEXT libc_fsync_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_fsync(SB)
-
 GLOBL	·libc_fsync_trampoline_addr(SB), RODATA, $4
 DATA	·libc_fsync_trampoline_addr(SB)/4, $libc_fsync_trampoline<>(SB)
 
 TEXT libc_ftruncate_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_ftruncate(SB)
-
 GLOBL	·libc_ftruncate_trampoline_addr(SB), RODATA, $4
 DATA	·libc_ftruncate_trampoline_addr(SB)/4, $libc_ftruncate_trampoline<>(SB)
 
 TEXT libc_getegid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getegid(SB)
-
 GLOBL	·libc_getegid_trampoline_addr(SB), RODATA, $4
 DATA	·libc_getegid_trampoline_addr(SB)/4, $libc_getegid_trampoline<>(SB)
 
 TEXT libc_geteuid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_geteuid(SB)
-
 GLOBL	·libc_geteuid_trampoline_addr(SB), RODATA, $4
 DATA	·libc_geteuid_trampoline_addr(SB)/4, $libc_geteuid_trampoline<>(SB)
 
 TEXT libc_getgid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getgid(SB)
-
 GLOBL	·libc_getgid_trampoline_addr(SB), RODATA, $4
 DATA	·libc_getgid_trampoline_addr(SB)/4, $libc_getgid_trampoline<>(SB)
 
 TEXT libc_getpgid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getpgid(SB)
-
 GLOBL	·libc_getpgid_trampoline_addr(SB), RODATA, $4
 DATA	·libc_getpgid_trampoline_addr(SB)/4, $libc_getpgid_trampoline<>(SB)
 
 TEXT libc_getpgrp_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getpgrp(SB)
-
 GLOBL	·libc_getpgrp_trampoline_addr(SB), RODATA, $4
 DATA	·libc_getpgrp_trampoline_addr(SB)/4, $libc_getpgrp_trampoline<>(SB)
 
 TEXT libc_getpid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getpid(SB)
-
 GLOBL	·libc_getpid_trampoline_addr(SB), RODATA, $4
 DATA	·libc_getpid_trampoline_addr(SB)/4, $libc_getpid_trampoline<>(SB)
 
 TEXT libc_getppid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getppid(SB)
-
 GLOBL	·libc_getppid_trampoline_addr(SB), RODATA, $4
 DATA	·libc_getppid_trampoline_addr(SB)/4, $libc_getppid_trampoline<>(SB)
 
 TEXT libc_getpriority_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getpriority(SB)
-
 GLOBL	·libc_getpriority_trampoline_addr(SB), RODATA, $4
 DATA	·libc_getpriority_trampoline_addr(SB)/4, $libc_getpriority_trampoline<>(SB)
 
 TEXT libc_getrlimit_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getrlimit(SB)
-
 GLOBL	·libc_getrlimit_trampoline_addr(SB), RODATA, $4
 DATA	·libc_getrlimit_trampoline_addr(SB)/4, $libc_getrlimit_trampoline<>(SB)
 
 TEXT libc_getrtable_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getrtable(SB)
-
 GLOBL	·libc_getrtable_trampoline_addr(SB), RODATA, $4
 DATA	·libc_getrtable_trampoline_addr(SB)/4, $libc_getrtable_trampoline<>(SB)
 
 TEXT libc_getrusage_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getrusage(SB)
-
 GLOBL	·libc_getrusage_trampoline_addr(SB), RODATA, $4
 DATA	·libc_getrusage_trampoline_addr(SB)/4, $libc_getrusage_trampoline<>(SB)
 
 TEXT libc_getsid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getsid(SB)
-
 GLOBL	·libc_getsid_trampoline_addr(SB), RODATA, $4
 DATA	·libc_getsid_trampoline_addr(SB)/4, $libc_getsid_trampoline<>(SB)
 
 TEXT libc_gettimeofday_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_gettimeofday(SB)
-
 GLOBL	·libc_gettimeofday_trampoline_addr(SB), RODATA, $4
 DATA	·libc_gettimeofday_trampoline_addr(SB)/4, $libc_gettimeofday_trampoline<>(SB)
 
 TEXT libc_getuid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getuid(SB)
-
 GLOBL	·libc_getuid_trampoline_addr(SB), RODATA, $4
 DATA	·libc_getuid_trampoline_addr(SB)/4, $libc_getuid_trampoline<>(SB)
 
 TEXT libc_issetugid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_issetugid(SB)
-
 GLOBL	·libc_issetugid_trampoline_addr(SB), RODATA, $4
 DATA	·libc_issetugid_trampoline_addr(SB)/4, $libc_issetugid_trampoline<>(SB)
 
 TEXT libc_kill_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_kill(SB)
-
 GLOBL	·libc_kill_trampoline_addr(SB), RODATA, $4
 DATA	·libc_kill_trampoline_addr(SB)/4, $libc_kill_trampoline<>(SB)
 
 TEXT libc_kqueue_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_kqueue(SB)
-
 GLOBL	·libc_kqueue_trampoline_addr(SB), RODATA, $4
 DATA	·libc_kqueue_trampoline_addr(SB)/4, $libc_kqueue_trampoline<>(SB)
 
 TEXT libc_lchown_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_lchown(SB)
-
 GLOBL	·libc_lchown_trampoline_addr(SB), RODATA, $4
 DATA	·libc_lchown_trampoline_addr(SB)/4, $libc_lchown_trampoline<>(SB)
 
 TEXT libc_link_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_link(SB)
-
 GLOBL	·libc_link_trampoline_addr(SB), RODATA, $4
 DATA	·libc_link_trampoline_addr(SB)/4, $libc_link_trampoline<>(SB)
 
 TEXT libc_linkat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_linkat(SB)
-
 GLOBL	·libc_linkat_trampoline_addr(SB), RODATA, $4
 DATA	·libc_linkat_trampoline_addr(SB)/4, $libc_linkat_trampoline<>(SB)
 
 TEXT libc_listen_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_listen(SB)
-
 GLOBL	·libc_listen_trampoline_addr(SB), RODATA, $4
 DATA	·libc_listen_trampoline_addr(SB)/4, $libc_listen_trampoline<>(SB)
 
 TEXT libc_lstat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_lstat(SB)
-
 GLOBL	·libc_lstat_trampoline_addr(SB), RODATA, $4
 DATA	·libc_lstat_trampoline_addr(SB)/4, $libc_lstat_trampoline<>(SB)
 
 TEXT libc_mkdir_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_mkdir(SB)
-
 GLOBL	·libc_mkdir_trampoline_addr(SB), RODATA, $4
 DATA	·libc_mkdir_trampoline_addr(SB)/4, $libc_mkdir_trampoline<>(SB)
 
 TEXT libc_mkdirat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_mkdirat(SB)
-
 GLOBL	·libc_mkdirat_trampoline_addr(SB), RODATA, $4
 DATA	·libc_mkdirat_trampoline_addr(SB)/4, $libc_mkdirat_trampoline<>(SB)
 
 TEXT libc_mkfifo_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_mkfifo(SB)
-
 GLOBL	·libc_mkfifo_trampoline_addr(SB), RODATA, $4
 DATA	·libc_mkfifo_trampoline_addr(SB)/4, $libc_mkfifo_trampoline<>(SB)
 
 TEXT libc_mkfifoat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_mkfifoat(SB)
-
 GLOBL	·libc_mkfifoat_trampoline_addr(SB), RODATA, $4
 DATA	·libc_mkfifoat_trampoline_addr(SB)/4, $libc_mkfifoat_trampoline<>(SB)
 
 TEXT libc_mknod_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_mknod(SB)
-
 GLOBL	·libc_mknod_trampoline_addr(SB), RODATA, $4
 DATA	·libc_mknod_trampoline_addr(SB)/4, $libc_mknod_trampoline<>(SB)
 
 TEXT libc_mknodat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_mknodat(SB)
-
 GLOBL	·libc_mknodat_trampoline_addr(SB), RODATA, $4
 DATA	·libc_mknodat_trampoline_addr(SB)/4, $libc_mknodat_trampoline<>(SB)
 
 TEXT libc_nanosleep_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_nanosleep(SB)
-
 GLOBL	·libc_nanosleep_trampoline_addr(SB), RODATA, $4
 DATA	·libc_nanosleep_trampoline_addr(SB)/4, $libc_nanosleep_trampoline<>(SB)
 
 TEXT libc_open_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_open(SB)
-
 GLOBL	·libc_open_trampoline_addr(SB), RODATA, $4
 DATA	·libc_open_trampoline_addr(SB)/4, $libc_open_trampoline<>(SB)
 
 TEXT libc_openat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_openat(SB)
-
 GLOBL	·libc_openat_trampoline_addr(SB), RODATA, $4
 DATA	·libc_openat_trampoline_addr(SB)/4, $libc_openat_trampoline<>(SB)
 
 TEXT libc_pathconf_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_pathconf(SB)
-
 GLOBL	·libc_pathconf_trampoline_addr(SB), RODATA, $4
 DATA	·libc_pathconf_trampoline_addr(SB)/4, $libc_pathconf_trampoline<>(SB)
 
 TEXT libc_pread_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_pread(SB)
-
 GLOBL	·libc_pread_trampoline_addr(SB), RODATA, $4
 DATA	·libc_pread_trampoline_addr(SB)/4, $libc_pread_trampoline<>(SB)
 
 TEXT libc_pwrite_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_pwrite(SB)
-
 GLOBL	·libc_pwrite_trampoline_addr(SB), RODATA, $4
 DATA	·libc_pwrite_trampoline_addr(SB)/4, $libc_pwrite_trampoline<>(SB)
 
 TEXT libc_read_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_read(SB)
-
 GLOBL	·libc_read_trampoline_addr(SB), RODATA, $4
 DATA	·libc_read_trampoline_addr(SB)/4, $libc_read_trampoline<>(SB)
 
 TEXT libc_readlink_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_readlink(SB)
-
 GLOBL	·libc_readlink_trampoline_addr(SB), RODATA, $4
 DATA	·libc_readlink_trampoline_addr(SB)/4, $libc_readlink_trampoline<>(SB)
 
 TEXT libc_readlinkat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_readlinkat(SB)
-
 GLOBL	·libc_readlinkat_trampoline_addr(SB), RODATA, $4
 DATA	·libc_readlinkat_trampoline_addr(SB)/4, $libc_readlinkat_trampoline<>(SB)
 
 TEXT libc_rename_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_rename(SB)
-
 GLOBL	·libc_rename_trampoline_addr(SB), RODATA, $4
 DATA	·libc_rename_trampoline_addr(SB)/4, $libc_rename_trampoline<>(SB)
 
 TEXT libc_renameat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_renameat(SB)
-
 GLOBL	·libc_renameat_trampoline_addr(SB), RODATA, $4
 DATA	·libc_renameat_trampoline_addr(SB)/4, $libc_renameat_trampoline<>(SB)
 
 TEXT libc_revoke_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_revoke(SB)
-
 GLOBL	·libc_revoke_trampoline_addr(SB), RODATA, $4
 DATA	·libc_revoke_trampoline_addr(SB)/4, $libc_revoke_trampoline<>(SB)
 
 TEXT libc_rmdir_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_rmdir(SB)
-
 GLOBL	·libc_rmdir_trampoline_addr(SB), RODATA, $4
 DATA	·libc_rmdir_trampoline_addr(SB)/4, $libc_rmdir_trampoline<>(SB)
 
 TEXT libc_lseek_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_lseek(SB)
-
 GLOBL	·libc_lseek_trampoline_addr(SB), RODATA, $4
 DATA	·libc_lseek_trampoline_addr(SB)/4, $libc_lseek_trampoline<>(SB)
 
 TEXT libc_select_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_select(SB)
-
 GLOBL	·libc_select_trampoline_addr(SB), RODATA, $4
 DATA	·libc_select_trampoline_addr(SB)/4, $libc_select_trampoline<>(SB)
 
 TEXT libc_setegid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setegid(SB)
-
 GLOBL	·libc_setegid_trampoline_addr(SB), RODATA, $4
 DATA	·libc_setegid_trampoline_addr(SB)/4, $libc_setegid_trampoline<>(SB)
 
 TEXT libc_seteuid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_seteuid(SB)
-
 GLOBL	·libc_seteuid_trampoline_addr(SB), RODATA, $4
 DATA	·libc_seteuid_trampoline_addr(SB)/4, $libc_seteuid_trampoline<>(SB)
 
 TEXT libc_setgid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setgid(SB)
-
 GLOBL	·libc_setgid_trampoline_addr(SB), RODATA, $4
 DATA	·libc_setgid_trampoline_addr(SB)/4, $libc_setgid_trampoline<>(SB)
 
 TEXT libc_setlogin_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setlogin(SB)
-
 GLOBL	·libc_setlogin_trampoline_addr(SB), RODATA, $4
 DATA	·libc_setlogin_trampoline_addr(SB)/4, $libc_setlogin_trampoline<>(SB)
 
 TEXT libc_setpgid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setpgid(SB)
-
 GLOBL	·libc_setpgid_trampoline_addr(SB), RODATA, $4
 DATA	·libc_setpgid_trampoline_addr(SB)/4, $libc_setpgid_trampoline<>(SB)
 
 TEXT libc_setpriority_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setpriority(SB)
-
 GLOBL	·libc_setpriority_trampoline_addr(SB), RODATA, $4
 DATA	·libc_setpriority_trampoline_addr(SB)/4, $libc_setpriority_trampoline<>(SB)
 
 TEXT libc_setregid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setregid(SB)
-
 GLOBL	·libc_setregid_trampoline_addr(SB), RODATA, $4
 DATA	·libc_setregid_trampoline_addr(SB)/4, $libc_setregid_trampoline<>(SB)
 
 TEXT libc_setreuid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setreuid(SB)
-
 GLOBL	·libc_setreuid_trampoline_addr(SB), RODATA, $4
 DATA	·libc_setreuid_trampoline_addr(SB)/4, $libc_setreuid_trampoline<>(SB)
 
 TEXT libc_setresgid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setresgid(SB)
-
 GLOBL	·libc_setresgid_trampoline_addr(SB), RODATA, $4
 DATA	·libc_setresgid_trampoline_addr(SB)/4, $libc_setresgid_trampoline<>(SB)
 
 TEXT libc_setresuid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setresuid(SB)
-
 GLOBL	·libc_setresuid_trampoline_addr(SB), RODATA, $4
 DATA	·libc_setresuid_trampoline_addr(SB)/4, $libc_setresuid_trampoline<>(SB)
 
-TEXT libc_setrlimit_trampoline<>(SB),NOSPLIT,$0-0
-	JMP	libc_setrlimit(SB)
-
-GLOBL	·libc_setrlimit_trampoline_addr(SB), RODATA, $4
-DATA	·libc_setrlimit_trampoline_addr(SB)/4, $libc_setrlimit_trampoline<>(SB)
-
 TEXT libc_setrtable_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setrtable(SB)
-
 GLOBL	·libc_setrtable_trampoline_addr(SB), RODATA, $4
 DATA	·libc_setrtable_trampoline_addr(SB)/4, $libc_setrtable_trampoline<>(SB)
 
 TEXT libc_setsid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setsid(SB)
-
 GLOBL	·libc_setsid_trampoline_addr(SB), RODATA, $4
 DATA	·libc_setsid_trampoline_addr(SB)/4, $libc_setsid_trampoline<>(SB)
 
 TEXT libc_settimeofday_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_settimeofday(SB)
-
 GLOBL	·libc_settimeofday_trampoline_addr(SB), RODATA, $4
 DATA	·libc_settimeofday_trampoline_addr(SB)/4, $libc_settimeofday_trampoline<>(SB)
 
 TEXT libc_setuid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setuid(SB)
-
 GLOBL	·libc_setuid_trampoline_addr(SB), RODATA, $4
 DATA	·libc_setuid_trampoline_addr(SB)/4, $libc_setuid_trampoline<>(SB)
 
 TEXT libc_stat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_stat(SB)
-
 GLOBL	·libc_stat_trampoline_addr(SB), RODATA, $4
 DATA	·libc_stat_trampoline_addr(SB)/4, $libc_stat_trampoline<>(SB)
 
 TEXT libc_statfs_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_statfs(SB)
-
 GLOBL	·libc_statfs_trampoline_addr(SB), RODATA, $4
 DATA	·libc_statfs_trampoline_addr(SB)/4, $libc_statfs_trampoline<>(SB)
 
 TEXT libc_symlink_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_symlink(SB)
-
 GLOBL	·libc_symlink_trampoline_addr(SB), RODATA, $4
 DATA	·libc_symlink_trampoline_addr(SB)/4, $libc_symlink_trampoline<>(SB)
 
 TEXT libc_symlinkat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_symlinkat(SB)
-
 GLOBL	·libc_symlinkat_trampoline_addr(SB), RODATA, $4
 DATA	·libc_symlinkat_trampoline_addr(SB)/4, $libc_symlinkat_trampoline<>(SB)
 
 TEXT libc_sync_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_sync(SB)
-
 GLOBL	·libc_sync_trampoline_addr(SB), RODATA, $4
 DATA	·libc_sync_trampoline_addr(SB)/4, $libc_sync_trampoline<>(SB)
 
 TEXT libc_truncate_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_truncate(SB)
-
 GLOBL	·libc_truncate_trampoline_addr(SB), RODATA, $4
 DATA	·libc_truncate_trampoline_addr(SB)/4, $libc_truncate_trampoline<>(SB)
 
 TEXT libc_umask_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_umask(SB)
-
 GLOBL	·libc_umask_trampoline_addr(SB), RODATA, $4
 DATA	·libc_umask_trampoline_addr(SB)/4, $libc_umask_trampoline<>(SB)
 
 TEXT libc_unlink_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_unlink(SB)
-
 GLOBL	·libc_unlink_trampoline_addr(SB), RODATA, $4
 DATA	·libc_unlink_trampoline_addr(SB)/4, $libc_unlink_trampoline<>(SB)
 
 TEXT libc_unlinkat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_unlinkat(SB)
-
 GLOBL	·libc_unlinkat_trampoline_addr(SB), RODATA, $4
 DATA	·libc_unlinkat_trampoline_addr(SB)/4, $libc_unlinkat_trampoline<>(SB)
 
 TEXT libc_unmount_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_unmount(SB)
-
 GLOBL	·libc_unmount_trampoline_addr(SB), RODATA, $4
 DATA	·libc_unmount_trampoline_addr(SB)/4, $libc_unmount_trampoline<>(SB)
 
 TEXT libc_write_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_write(SB)
-
 GLOBL	·libc_write_trampoline_addr(SB), RODATA, $4
 DATA	·libc_write_trampoline_addr(SB)/4, $libc_write_trampoline<>(SB)
 
 TEXT libc_mmap_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_mmap(SB)
-
 GLOBL	·libc_mmap_trampoline_addr(SB), RODATA, $4
 DATA	·libc_mmap_trampoline_addr(SB)/4, $libc_mmap_trampoline<>(SB)
 
 TEXT libc_munmap_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_munmap(SB)
-
 GLOBL	·libc_munmap_trampoline_addr(SB), RODATA, $4
 DATA	·libc_munmap_trampoline_addr(SB)/4, $libc_munmap_trampoline<>(SB)
 
 TEXT libc_utimensat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_utimensat(SB)
-
 GLOBL	·libc_utimensat_trampoline_addr(SB), RODATA, $4
 DATA	·libc_utimensat_trampoline_addr(SB)/4, $libc_utimensat_trampoline<>(SB)
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go
index 800aab6..12a7a21 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go
@@ -519,6 +519,28 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func getresuid(ruid *_C_int, euid *_C_int, suid *_C_int) {
+	syscall_rawSyscall(libc_getresuid_trampoline_addr, uintptr(unsafe.Pointer(ruid)), uintptr(unsafe.Pointer(euid)), uintptr(unsafe.Pointer(suid)))
+	return
+}
+
+var libc_getresuid_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_getresuid getresuid "libc.so"
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func getresgid(rgid *_C_int, egid *_C_int, sgid *_C_int) {
+	syscall_rawSyscall(libc_getresgid_trampoline_addr, uintptr(unsafe.Pointer(rgid)), uintptr(unsafe.Pointer(egid)), uintptr(unsafe.Pointer(sgid)))
+	return
+}
+
+var libc_getresgid_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_getresgid getresgid "libc.so"
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func ioctl(fd int, req uint, arg uintptr) (err error) {
 	_, _, e1 := syscall_syscall(libc_ioctl_trampoline_addr, uintptr(fd), uintptr(req), uintptr(arg))
 	if e1 != 0 {
@@ -527,6 +549,14 @@
 	return
 }
 
+func ioctlPtr(fd int, req uint, arg unsafe.Pointer) (err error) {
+	_, _, e1 := syscall_syscall(libc_ioctl_trampoline_addr, uintptr(fd), uintptr(req), uintptr(arg))
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
 var libc_ioctl_trampoline_addr uintptr
 
 //go:cgo_import_dynamic libc_ioctl ioctl "libc.so"
@@ -696,6 +726,20 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func ClockGettime(clockid int32, time *Timespec) (err error) {
+	_, _, e1 := syscall_syscall(libc_clock_gettime_trampoline_addr, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+var libc_clock_gettime_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_clock_gettime clock_gettime "libc.so"
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func Close(fd int) (err error) {
 	_, _, e1 := syscall_syscall(libc_close_trampoline_addr, uintptr(fd), 0, 0)
 	if e1 != 0 {
@@ -1872,20 +1916,6 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Setrlimit(which int, lim *Rlimit) (err error) {
-	_, _, e1 := syscall_rawSyscall(libc_setrlimit_trampoline_addr, uintptr(which), uintptr(unsafe.Pointer(lim)), 0)
-	if e1 != 0 {
-		err = errnoErr(e1)
-	}
-	return
-}
-
-var libc_setrlimit_trampoline_addr uintptr
-
-//go:cgo_import_dynamic libc_setrlimit setrlimit "libc.so"
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func Setrtable(rtable int) (err error) {
 	_, _, e1 := syscall_rawSyscall(libc_setrtable_trampoline_addr, uintptr(rtable), 0, 0)
 	if e1 != 0 {
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.s b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.s
index 4efeff9..a6bc32c 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.s
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.s
@@ -5,792 +5,670 @@
 
 TEXT libc_getgroups_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getgroups(SB)
-
 GLOBL	·libc_getgroups_trampoline_addr(SB), RODATA, $8
 DATA	·libc_getgroups_trampoline_addr(SB)/8, $libc_getgroups_trampoline<>(SB)
 
 TEXT libc_setgroups_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setgroups(SB)
-
 GLOBL	·libc_setgroups_trampoline_addr(SB), RODATA, $8
 DATA	·libc_setgroups_trampoline_addr(SB)/8, $libc_setgroups_trampoline<>(SB)
 
 TEXT libc_wait4_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_wait4(SB)
-
 GLOBL	·libc_wait4_trampoline_addr(SB), RODATA, $8
 DATA	·libc_wait4_trampoline_addr(SB)/8, $libc_wait4_trampoline<>(SB)
 
 TEXT libc_accept_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_accept(SB)
-
 GLOBL	·libc_accept_trampoline_addr(SB), RODATA, $8
 DATA	·libc_accept_trampoline_addr(SB)/8, $libc_accept_trampoline<>(SB)
 
 TEXT libc_bind_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_bind(SB)
-
 GLOBL	·libc_bind_trampoline_addr(SB), RODATA, $8
 DATA	·libc_bind_trampoline_addr(SB)/8, $libc_bind_trampoline<>(SB)
 
 TEXT libc_connect_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_connect(SB)
-
 GLOBL	·libc_connect_trampoline_addr(SB), RODATA, $8
 DATA	·libc_connect_trampoline_addr(SB)/8, $libc_connect_trampoline<>(SB)
 
 TEXT libc_socket_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_socket(SB)
-
 GLOBL	·libc_socket_trampoline_addr(SB), RODATA, $8
 DATA	·libc_socket_trampoline_addr(SB)/8, $libc_socket_trampoline<>(SB)
 
 TEXT libc_getsockopt_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getsockopt(SB)
-
 GLOBL	·libc_getsockopt_trampoline_addr(SB), RODATA, $8
 DATA	·libc_getsockopt_trampoline_addr(SB)/8, $libc_getsockopt_trampoline<>(SB)
 
 TEXT libc_setsockopt_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setsockopt(SB)
-
 GLOBL	·libc_setsockopt_trampoline_addr(SB), RODATA, $8
 DATA	·libc_setsockopt_trampoline_addr(SB)/8, $libc_setsockopt_trampoline<>(SB)
 
 TEXT libc_getpeername_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getpeername(SB)
-
 GLOBL	·libc_getpeername_trampoline_addr(SB), RODATA, $8
 DATA	·libc_getpeername_trampoline_addr(SB)/8, $libc_getpeername_trampoline<>(SB)
 
 TEXT libc_getsockname_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getsockname(SB)
-
 GLOBL	·libc_getsockname_trampoline_addr(SB), RODATA, $8
 DATA	·libc_getsockname_trampoline_addr(SB)/8, $libc_getsockname_trampoline<>(SB)
 
 TEXT libc_shutdown_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_shutdown(SB)
-
 GLOBL	·libc_shutdown_trampoline_addr(SB), RODATA, $8
 DATA	·libc_shutdown_trampoline_addr(SB)/8, $libc_shutdown_trampoline<>(SB)
 
 TEXT libc_socketpair_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_socketpair(SB)
-
 GLOBL	·libc_socketpair_trampoline_addr(SB), RODATA, $8
 DATA	·libc_socketpair_trampoline_addr(SB)/8, $libc_socketpair_trampoline<>(SB)
 
 TEXT libc_recvfrom_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_recvfrom(SB)
-
 GLOBL	·libc_recvfrom_trampoline_addr(SB), RODATA, $8
 DATA	·libc_recvfrom_trampoline_addr(SB)/8, $libc_recvfrom_trampoline<>(SB)
 
 TEXT libc_sendto_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_sendto(SB)
-
 GLOBL	·libc_sendto_trampoline_addr(SB), RODATA, $8
 DATA	·libc_sendto_trampoline_addr(SB)/8, $libc_sendto_trampoline<>(SB)
 
 TEXT libc_recvmsg_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_recvmsg(SB)
-
 GLOBL	·libc_recvmsg_trampoline_addr(SB), RODATA, $8
 DATA	·libc_recvmsg_trampoline_addr(SB)/8, $libc_recvmsg_trampoline<>(SB)
 
 TEXT libc_sendmsg_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_sendmsg(SB)
-
 GLOBL	·libc_sendmsg_trampoline_addr(SB), RODATA, $8
 DATA	·libc_sendmsg_trampoline_addr(SB)/8, $libc_sendmsg_trampoline<>(SB)
 
 TEXT libc_kevent_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_kevent(SB)
-
 GLOBL	·libc_kevent_trampoline_addr(SB), RODATA, $8
 DATA	·libc_kevent_trampoline_addr(SB)/8, $libc_kevent_trampoline<>(SB)
 
 TEXT libc_utimes_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_utimes(SB)
-
 GLOBL	·libc_utimes_trampoline_addr(SB), RODATA, $8
 DATA	·libc_utimes_trampoline_addr(SB)/8, $libc_utimes_trampoline<>(SB)
 
 TEXT libc_futimes_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_futimes(SB)
-
 GLOBL	·libc_futimes_trampoline_addr(SB), RODATA, $8
 DATA	·libc_futimes_trampoline_addr(SB)/8, $libc_futimes_trampoline<>(SB)
 
 TEXT libc_poll_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_poll(SB)
-
 GLOBL	·libc_poll_trampoline_addr(SB), RODATA, $8
 DATA	·libc_poll_trampoline_addr(SB)/8, $libc_poll_trampoline<>(SB)
 
 TEXT libc_madvise_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_madvise(SB)
-
 GLOBL	·libc_madvise_trampoline_addr(SB), RODATA, $8
 DATA	·libc_madvise_trampoline_addr(SB)/8, $libc_madvise_trampoline<>(SB)
 
 TEXT libc_mlock_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_mlock(SB)
-
 GLOBL	·libc_mlock_trampoline_addr(SB), RODATA, $8
 DATA	·libc_mlock_trampoline_addr(SB)/8, $libc_mlock_trampoline<>(SB)
 
 TEXT libc_mlockall_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_mlockall(SB)
-
 GLOBL	·libc_mlockall_trampoline_addr(SB), RODATA, $8
 DATA	·libc_mlockall_trampoline_addr(SB)/8, $libc_mlockall_trampoline<>(SB)
 
 TEXT libc_mprotect_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_mprotect(SB)
-
 GLOBL	·libc_mprotect_trampoline_addr(SB), RODATA, $8
 DATA	·libc_mprotect_trampoline_addr(SB)/8, $libc_mprotect_trampoline<>(SB)
 
 TEXT libc_msync_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_msync(SB)
-
 GLOBL	·libc_msync_trampoline_addr(SB), RODATA, $8
 DATA	·libc_msync_trampoline_addr(SB)/8, $libc_msync_trampoline<>(SB)
 
 TEXT libc_munlock_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_munlock(SB)
-
 GLOBL	·libc_munlock_trampoline_addr(SB), RODATA, $8
 DATA	·libc_munlock_trampoline_addr(SB)/8, $libc_munlock_trampoline<>(SB)
 
 TEXT libc_munlockall_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_munlockall(SB)
-
 GLOBL	·libc_munlockall_trampoline_addr(SB), RODATA, $8
 DATA	·libc_munlockall_trampoline_addr(SB)/8, $libc_munlockall_trampoline<>(SB)
 
 TEXT libc_pipe2_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_pipe2(SB)
-
 GLOBL	·libc_pipe2_trampoline_addr(SB), RODATA, $8
 DATA	·libc_pipe2_trampoline_addr(SB)/8, $libc_pipe2_trampoline<>(SB)
 
 TEXT libc_getdents_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getdents(SB)
-
 GLOBL	·libc_getdents_trampoline_addr(SB), RODATA, $8
 DATA	·libc_getdents_trampoline_addr(SB)/8, $libc_getdents_trampoline<>(SB)
 
 TEXT libc_getcwd_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getcwd(SB)
-
 GLOBL	·libc_getcwd_trampoline_addr(SB), RODATA, $8
 DATA	·libc_getcwd_trampoline_addr(SB)/8, $libc_getcwd_trampoline<>(SB)
 
+TEXT libc_getresuid_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_getresuid(SB)
+GLOBL	·libc_getresuid_trampoline_addr(SB), RODATA, $8
+DATA	·libc_getresuid_trampoline_addr(SB)/8, $libc_getresuid_trampoline<>(SB)
+
+TEXT libc_getresgid_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_getresgid(SB)
+GLOBL	·libc_getresgid_trampoline_addr(SB), RODATA, $8
+DATA	·libc_getresgid_trampoline_addr(SB)/8, $libc_getresgid_trampoline<>(SB)
+
 TEXT libc_ioctl_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_ioctl(SB)
-
 GLOBL	·libc_ioctl_trampoline_addr(SB), RODATA, $8
 DATA	·libc_ioctl_trampoline_addr(SB)/8, $libc_ioctl_trampoline<>(SB)
 
 TEXT libc_sysctl_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_sysctl(SB)
-
 GLOBL	·libc_sysctl_trampoline_addr(SB), RODATA, $8
 DATA	·libc_sysctl_trampoline_addr(SB)/8, $libc_sysctl_trampoline<>(SB)
 
 TEXT libc_ppoll_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_ppoll(SB)
-
 GLOBL	·libc_ppoll_trampoline_addr(SB), RODATA, $8
 DATA	·libc_ppoll_trampoline_addr(SB)/8, $libc_ppoll_trampoline<>(SB)
 
 TEXT libc_access_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_access(SB)
-
 GLOBL	·libc_access_trampoline_addr(SB), RODATA, $8
 DATA	·libc_access_trampoline_addr(SB)/8, $libc_access_trampoline<>(SB)
 
 TEXT libc_adjtime_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_adjtime(SB)
-
 GLOBL	·libc_adjtime_trampoline_addr(SB), RODATA, $8
 DATA	·libc_adjtime_trampoline_addr(SB)/8, $libc_adjtime_trampoline<>(SB)
 
 TEXT libc_chdir_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_chdir(SB)
-
 GLOBL	·libc_chdir_trampoline_addr(SB), RODATA, $8
 DATA	·libc_chdir_trampoline_addr(SB)/8, $libc_chdir_trampoline<>(SB)
 
 TEXT libc_chflags_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_chflags(SB)
-
 GLOBL	·libc_chflags_trampoline_addr(SB), RODATA, $8
 DATA	·libc_chflags_trampoline_addr(SB)/8, $libc_chflags_trampoline<>(SB)
 
 TEXT libc_chmod_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_chmod(SB)
-
 GLOBL	·libc_chmod_trampoline_addr(SB), RODATA, $8
 DATA	·libc_chmod_trampoline_addr(SB)/8, $libc_chmod_trampoline<>(SB)
 
 TEXT libc_chown_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_chown(SB)
-
 GLOBL	·libc_chown_trampoline_addr(SB), RODATA, $8
 DATA	·libc_chown_trampoline_addr(SB)/8, $libc_chown_trampoline<>(SB)
 
 TEXT libc_chroot_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_chroot(SB)
-
 GLOBL	·libc_chroot_trampoline_addr(SB), RODATA, $8
 DATA	·libc_chroot_trampoline_addr(SB)/8, $libc_chroot_trampoline<>(SB)
 
+TEXT libc_clock_gettime_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_clock_gettime(SB)
+GLOBL	·libc_clock_gettime_trampoline_addr(SB), RODATA, $8
+DATA	·libc_clock_gettime_trampoline_addr(SB)/8, $libc_clock_gettime_trampoline<>(SB)
+
 TEXT libc_close_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_close(SB)
-
 GLOBL	·libc_close_trampoline_addr(SB), RODATA, $8
 DATA	·libc_close_trampoline_addr(SB)/8, $libc_close_trampoline<>(SB)
 
 TEXT libc_dup_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_dup(SB)
-
 GLOBL	·libc_dup_trampoline_addr(SB), RODATA, $8
 DATA	·libc_dup_trampoline_addr(SB)/8, $libc_dup_trampoline<>(SB)
 
 TEXT libc_dup2_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_dup2(SB)
-
 GLOBL	·libc_dup2_trampoline_addr(SB), RODATA, $8
 DATA	·libc_dup2_trampoline_addr(SB)/8, $libc_dup2_trampoline<>(SB)
 
 TEXT libc_dup3_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_dup3(SB)
-
 GLOBL	·libc_dup3_trampoline_addr(SB), RODATA, $8
 DATA	·libc_dup3_trampoline_addr(SB)/8, $libc_dup3_trampoline<>(SB)
 
 TEXT libc_exit_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_exit(SB)
-
 GLOBL	·libc_exit_trampoline_addr(SB), RODATA, $8
 DATA	·libc_exit_trampoline_addr(SB)/8, $libc_exit_trampoline<>(SB)
 
 TEXT libc_faccessat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_faccessat(SB)
-
 GLOBL	·libc_faccessat_trampoline_addr(SB), RODATA, $8
 DATA	·libc_faccessat_trampoline_addr(SB)/8, $libc_faccessat_trampoline<>(SB)
 
 TEXT libc_fchdir_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_fchdir(SB)
-
 GLOBL	·libc_fchdir_trampoline_addr(SB), RODATA, $8
 DATA	·libc_fchdir_trampoline_addr(SB)/8, $libc_fchdir_trampoline<>(SB)
 
 TEXT libc_fchflags_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_fchflags(SB)
-
 GLOBL	·libc_fchflags_trampoline_addr(SB), RODATA, $8
 DATA	·libc_fchflags_trampoline_addr(SB)/8, $libc_fchflags_trampoline<>(SB)
 
 TEXT libc_fchmod_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_fchmod(SB)
-
 GLOBL	·libc_fchmod_trampoline_addr(SB), RODATA, $8
 DATA	·libc_fchmod_trampoline_addr(SB)/8, $libc_fchmod_trampoline<>(SB)
 
 TEXT libc_fchmodat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_fchmodat(SB)
-
 GLOBL	·libc_fchmodat_trampoline_addr(SB), RODATA, $8
 DATA	·libc_fchmodat_trampoline_addr(SB)/8, $libc_fchmodat_trampoline<>(SB)
 
 TEXT libc_fchown_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_fchown(SB)
-
 GLOBL	·libc_fchown_trampoline_addr(SB), RODATA, $8
 DATA	·libc_fchown_trampoline_addr(SB)/8, $libc_fchown_trampoline<>(SB)
 
 TEXT libc_fchownat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_fchownat(SB)
-
 GLOBL	·libc_fchownat_trampoline_addr(SB), RODATA, $8
 DATA	·libc_fchownat_trampoline_addr(SB)/8, $libc_fchownat_trampoline<>(SB)
 
 TEXT libc_flock_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_flock(SB)
-
 GLOBL	·libc_flock_trampoline_addr(SB), RODATA, $8
 DATA	·libc_flock_trampoline_addr(SB)/8, $libc_flock_trampoline<>(SB)
 
 TEXT libc_fpathconf_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_fpathconf(SB)
-
 GLOBL	·libc_fpathconf_trampoline_addr(SB), RODATA, $8
 DATA	·libc_fpathconf_trampoline_addr(SB)/8, $libc_fpathconf_trampoline<>(SB)
 
 TEXT libc_fstat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_fstat(SB)
-
 GLOBL	·libc_fstat_trampoline_addr(SB), RODATA, $8
 DATA	·libc_fstat_trampoline_addr(SB)/8, $libc_fstat_trampoline<>(SB)
 
 TEXT libc_fstatat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_fstatat(SB)
-
 GLOBL	·libc_fstatat_trampoline_addr(SB), RODATA, $8
 DATA	·libc_fstatat_trampoline_addr(SB)/8, $libc_fstatat_trampoline<>(SB)
 
 TEXT libc_fstatfs_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_fstatfs(SB)
-
 GLOBL	·libc_fstatfs_trampoline_addr(SB), RODATA, $8
 DATA	·libc_fstatfs_trampoline_addr(SB)/8, $libc_fstatfs_trampoline<>(SB)
 
 TEXT libc_fsync_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_fsync(SB)
-
 GLOBL	·libc_fsync_trampoline_addr(SB), RODATA, $8
 DATA	·libc_fsync_trampoline_addr(SB)/8, $libc_fsync_trampoline<>(SB)
 
 TEXT libc_ftruncate_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_ftruncate(SB)
-
 GLOBL	·libc_ftruncate_trampoline_addr(SB), RODATA, $8
 DATA	·libc_ftruncate_trampoline_addr(SB)/8, $libc_ftruncate_trampoline<>(SB)
 
 TEXT libc_getegid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getegid(SB)
-
 GLOBL	·libc_getegid_trampoline_addr(SB), RODATA, $8
 DATA	·libc_getegid_trampoline_addr(SB)/8, $libc_getegid_trampoline<>(SB)
 
 TEXT libc_geteuid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_geteuid(SB)
-
 GLOBL	·libc_geteuid_trampoline_addr(SB), RODATA, $8
 DATA	·libc_geteuid_trampoline_addr(SB)/8, $libc_geteuid_trampoline<>(SB)
 
 TEXT libc_getgid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getgid(SB)
-
 GLOBL	·libc_getgid_trampoline_addr(SB), RODATA, $8
 DATA	·libc_getgid_trampoline_addr(SB)/8, $libc_getgid_trampoline<>(SB)
 
 TEXT libc_getpgid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getpgid(SB)
-
 GLOBL	·libc_getpgid_trampoline_addr(SB), RODATA, $8
 DATA	·libc_getpgid_trampoline_addr(SB)/8, $libc_getpgid_trampoline<>(SB)
 
 TEXT libc_getpgrp_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getpgrp(SB)
-
 GLOBL	·libc_getpgrp_trampoline_addr(SB), RODATA, $8
 DATA	·libc_getpgrp_trampoline_addr(SB)/8, $libc_getpgrp_trampoline<>(SB)
 
 TEXT libc_getpid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getpid(SB)
-
 GLOBL	·libc_getpid_trampoline_addr(SB), RODATA, $8
 DATA	·libc_getpid_trampoline_addr(SB)/8, $libc_getpid_trampoline<>(SB)
 
 TEXT libc_getppid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getppid(SB)
-
 GLOBL	·libc_getppid_trampoline_addr(SB), RODATA, $8
 DATA	·libc_getppid_trampoline_addr(SB)/8, $libc_getppid_trampoline<>(SB)
 
 TEXT libc_getpriority_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getpriority(SB)
-
 GLOBL	·libc_getpriority_trampoline_addr(SB), RODATA, $8
 DATA	·libc_getpriority_trampoline_addr(SB)/8, $libc_getpriority_trampoline<>(SB)
 
 TEXT libc_getrlimit_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getrlimit(SB)
-
 GLOBL	·libc_getrlimit_trampoline_addr(SB), RODATA, $8
 DATA	·libc_getrlimit_trampoline_addr(SB)/8, $libc_getrlimit_trampoline<>(SB)
 
 TEXT libc_getrtable_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getrtable(SB)
-
 GLOBL	·libc_getrtable_trampoline_addr(SB), RODATA, $8
 DATA	·libc_getrtable_trampoline_addr(SB)/8, $libc_getrtable_trampoline<>(SB)
 
 TEXT libc_getrusage_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getrusage(SB)
-
 GLOBL	·libc_getrusage_trampoline_addr(SB), RODATA, $8
 DATA	·libc_getrusage_trampoline_addr(SB)/8, $libc_getrusage_trampoline<>(SB)
 
 TEXT libc_getsid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getsid(SB)
-
 GLOBL	·libc_getsid_trampoline_addr(SB), RODATA, $8
 DATA	·libc_getsid_trampoline_addr(SB)/8, $libc_getsid_trampoline<>(SB)
 
 TEXT libc_gettimeofday_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_gettimeofday(SB)
-
 GLOBL	·libc_gettimeofday_trampoline_addr(SB), RODATA, $8
 DATA	·libc_gettimeofday_trampoline_addr(SB)/8, $libc_gettimeofday_trampoline<>(SB)
 
 TEXT libc_getuid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getuid(SB)
-
 GLOBL	·libc_getuid_trampoline_addr(SB), RODATA, $8
 DATA	·libc_getuid_trampoline_addr(SB)/8, $libc_getuid_trampoline<>(SB)
 
 TEXT libc_issetugid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_issetugid(SB)
-
 GLOBL	·libc_issetugid_trampoline_addr(SB), RODATA, $8
 DATA	·libc_issetugid_trampoline_addr(SB)/8, $libc_issetugid_trampoline<>(SB)
 
 TEXT libc_kill_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_kill(SB)
-
 GLOBL	·libc_kill_trampoline_addr(SB), RODATA, $8
 DATA	·libc_kill_trampoline_addr(SB)/8, $libc_kill_trampoline<>(SB)
 
 TEXT libc_kqueue_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_kqueue(SB)
-
 GLOBL	·libc_kqueue_trampoline_addr(SB), RODATA, $8
 DATA	·libc_kqueue_trampoline_addr(SB)/8, $libc_kqueue_trampoline<>(SB)
 
 TEXT libc_lchown_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_lchown(SB)
-
 GLOBL	·libc_lchown_trampoline_addr(SB), RODATA, $8
 DATA	·libc_lchown_trampoline_addr(SB)/8, $libc_lchown_trampoline<>(SB)
 
 TEXT libc_link_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_link(SB)
-
 GLOBL	·libc_link_trampoline_addr(SB), RODATA, $8
 DATA	·libc_link_trampoline_addr(SB)/8, $libc_link_trampoline<>(SB)
 
 TEXT libc_linkat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_linkat(SB)
-
 GLOBL	·libc_linkat_trampoline_addr(SB), RODATA, $8
 DATA	·libc_linkat_trampoline_addr(SB)/8, $libc_linkat_trampoline<>(SB)
 
 TEXT libc_listen_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_listen(SB)
-
 GLOBL	·libc_listen_trampoline_addr(SB), RODATA, $8
 DATA	·libc_listen_trampoline_addr(SB)/8, $libc_listen_trampoline<>(SB)
 
 TEXT libc_lstat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_lstat(SB)
-
 GLOBL	·libc_lstat_trampoline_addr(SB), RODATA, $8
 DATA	·libc_lstat_trampoline_addr(SB)/8, $libc_lstat_trampoline<>(SB)
 
 TEXT libc_mkdir_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_mkdir(SB)
-
 GLOBL	·libc_mkdir_trampoline_addr(SB), RODATA, $8
 DATA	·libc_mkdir_trampoline_addr(SB)/8, $libc_mkdir_trampoline<>(SB)
 
 TEXT libc_mkdirat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_mkdirat(SB)
-
 GLOBL	·libc_mkdirat_trampoline_addr(SB), RODATA, $8
 DATA	·libc_mkdirat_trampoline_addr(SB)/8, $libc_mkdirat_trampoline<>(SB)
 
 TEXT libc_mkfifo_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_mkfifo(SB)
-
 GLOBL	·libc_mkfifo_trampoline_addr(SB), RODATA, $8
 DATA	·libc_mkfifo_trampoline_addr(SB)/8, $libc_mkfifo_trampoline<>(SB)
 
 TEXT libc_mkfifoat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_mkfifoat(SB)
-
 GLOBL	·libc_mkfifoat_trampoline_addr(SB), RODATA, $8
 DATA	·libc_mkfifoat_trampoline_addr(SB)/8, $libc_mkfifoat_trampoline<>(SB)
 
 TEXT libc_mknod_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_mknod(SB)
-
 GLOBL	·libc_mknod_trampoline_addr(SB), RODATA, $8
 DATA	·libc_mknod_trampoline_addr(SB)/8, $libc_mknod_trampoline<>(SB)
 
 TEXT libc_mknodat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_mknodat(SB)
-
 GLOBL	·libc_mknodat_trampoline_addr(SB), RODATA, $8
 DATA	·libc_mknodat_trampoline_addr(SB)/8, $libc_mknodat_trampoline<>(SB)
 
 TEXT libc_nanosleep_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_nanosleep(SB)
-
 GLOBL	·libc_nanosleep_trampoline_addr(SB), RODATA, $8
 DATA	·libc_nanosleep_trampoline_addr(SB)/8, $libc_nanosleep_trampoline<>(SB)
 
 TEXT libc_open_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_open(SB)
-
 GLOBL	·libc_open_trampoline_addr(SB), RODATA, $8
 DATA	·libc_open_trampoline_addr(SB)/8, $libc_open_trampoline<>(SB)
 
 TEXT libc_openat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_openat(SB)
-
 GLOBL	·libc_openat_trampoline_addr(SB), RODATA, $8
 DATA	·libc_openat_trampoline_addr(SB)/8, $libc_openat_trampoline<>(SB)
 
 TEXT libc_pathconf_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_pathconf(SB)
-
 GLOBL	·libc_pathconf_trampoline_addr(SB), RODATA, $8
 DATA	·libc_pathconf_trampoline_addr(SB)/8, $libc_pathconf_trampoline<>(SB)
 
 TEXT libc_pread_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_pread(SB)
-
 GLOBL	·libc_pread_trampoline_addr(SB), RODATA, $8
 DATA	·libc_pread_trampoline_addr(SB)/8, $libc_pread_trampoline<>(SB)
 
 TEXT libc_pwrite_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_pwrite(SB)
-
 GLOBL	·libc_pwrite_trampoline_addr(SB), RODATA, $8
 DATA	·libc_pwrite_trampoline_addr(SB)/8, $libc_pwrite_trampoline<>(SB)
 
 TEXT libc_read_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_read(SB)
-
 GLOBL	·libc_read_trampoline_addr(SB), RODATA, $8
 DATA	·libc_read_trampoline_addr(SB)/8, $libc_read_trampoline<>(SB)
 
 TEXT libc_readlink_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_readlink(SB)
-
 GLOBL	·libc_readlink_trampoline_addr(SB), RODATA, $8
 DATA	·libc_readlink_trampoline_addr(SB)/8, $libc_readlink_trampoline<>(SB)
 
 TEXT libc_readlinkat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_readlinkat(SB)
-
 GLOBL	·libc_readlinkat_trampoline_addr(SB), RODATA, $8
 DATA	·libc_readlinkat_trampoline_addr(SB)/8, $libc_readlinkat_trampoline<>(SB)
 
 TEXT libc_rename_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_rename(SB)
-
 GLOBL	·libc_rename_trampoline_addr(SB), RODATA, $8
 DATA	·libc_rename_trampoline_addr(SB)/8, $libc_rename_trampoline<>(SB)
 
 TEXT libc_renameat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_renameat(SB)
-
 GLOBL	·libc_renameat_trampoline_addr(SB), RODATA, $8
 DATA	·libc_renameat_trampoline_addr(SB)/8, $libc_renameat_trampoline<>(SB)
 
 TEXT libc_revoke_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_revoke(SB)
-
 GLOBL	·libc_revoke_trampoline_addr(SB), RODATA, $8
 DATA	·libc_revoke_trampoline_addr(SB)/8, $libc_revoke_trampoline<>(SB)
 
 TEXT libc_rmdir_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_rmdir(SB)
-
 GLOBL	·libc_rmdir_trampoline_addr(SB), RODATA, $8
 DATA	·libc_rmdir_trampoline_addr(SB)/8, $libc_rmdir_trampoline<>(SB)
 
 TEXT libc_lseek_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_lseek(SB)
-
 GLOBL	·libc_lseek_trampoline_addr(SB), RODATA, $8
 DATA	·libc_lseek_trampoline_addr(SB)/8, $libc_lseek_trampoline<>(SB)
 
 TEXT libc_select_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_select(SB)
-
 GLOBL	·libc_select_trampoline_addr(SB), RODATA, $8
 DATA	·libc_select_trampoline_addr(SB)/8, $libc_select_trampoline<>(SB)
 
 TEXT libc_setegid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setegid(SB)
-
 GLOBL	·libc_setegid_trampoline_addr(SB), RODATA, $8
 DATA	·libc_setegid_trampoline_addr(SB)/8, $libc_setegid_trampoline<>(SB)
 
 TEXT libc_seteuid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_seteuid(SB)
-
 GLOBL	·libc_seteuid_trampoline_addr(SB), RODATA, $8
 DATA	·libc_seteuid_trampoline_addr(SB)/8, $libc_seteuid_trampoline<>(SB)
 
 TEXT libc_setgid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setgid(SB)
-
 GLOBL	·libc_setgid_trampoline_addr(SB), RODATA, $8
 DATA	·libc_setgid_trampoline_addr(SB)/8, $libc_setgid_trampoline<>(SB)
 
 TEXT libc_setlogin_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setlogin(SB)
-
 GLOBL	·libc_setlogin_trampoline_addr(SB), RODATA, $8
 DATA	·libc_setlogin_trampoline_addr(SB)/8, $libc_setlogin_trampoline<>(SB)
 
 TEXT libc_setpgid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setpgid(SB)
-
 GLOBL	·libc_setpgid_trampoline_addr(SB), RODATA, $8
 DATA	·libc_setpgid_trampoline_addr(SB)/8, $libc_setpgid_trampoline<>(SB)
 
 TEXT libc_setpriority_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setpriority(SB)
-
 GLOBL	·libc_setpriority_trampoline_addr(SB), RODATA, $8
 DATA	·libc_setpriority_trampoline_addr(SB)/8, $libc_setpriority_trampoline<>(SB)
 
 TEXT libc_setregid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setregid(SB)
-
 GLOBL	·libc_setregid_trampoline_addr(SB), RODATA, $8
 DATA	·libc_setregid_trampoline_addr(SB)/8, $libc_setregid_trampoline<>(SB)
 
 TEXT libc_setreuid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setreuid(SB)
-
 GLOBL	·libc_setreuid_trampoline_addr(SB), RODATA, $8
 DATA	·libc_setreuid_trampoline_addr(SB)/8, $libc_setreuid_trampoline<>(SB)
 
 TEXT libc_setresgid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setresgid(SB)
-
 GLOBL	·libc_setresgid_trampoline_addr(SB), RODATA, $8
 DATA	·libc_setresgid_trampoline_addr(SB)/8, $libc_setresgid_trampoline<>(SB)
 
 TEXT libc_setresuid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setresuid(SB)
-
 GLOBL	·libc_setresuid_trampoline_addr(SB), RODATA, $8
 DATA	·libc_setresuid_trampoline_addr(SB)/8, $libc_setresuid_trampoline<>(SB)
 
-TEXT libc_setrlimit_trampoline<>(SB),NOSPLIT,$0-0
-	JMP	libc_setrlimit(SB)
-
-GLOBL	·libc_setrlimit_trampoline_addr(SB), RODATA, $8
-DATA	·libc_setrlimit_trampoline_addr(SB)/8, $libc_setrlimit_trampoline<>(SB)
-
 TEXT libc_setrtable_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setrtable(SB)
-
 GLOBL	·libc_setrtable_trampoline_addr(SB), RODATA, $8
 DATA	·libc_setrtable_trampoline_addr(SB)/8, $libc_setrtable_trampoline<>(SB)
 
 TEXT libc_setsid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setsid(SB)
-
 GLOBL	·libc_setsid_trampoline_addr(SB), RODATA, $8
 DATA	·libc_setsid_trampoline_addr(SB)/8, $libc_setsid_trampoline<>(SB)
 
 TEXT libc_settimeofday_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_settimeofday(SB)
-
 GLOBL	·libc_settimeofday_trampoline_addr(SB), RODATA, $8
 DATA	·libc_settimeofday_trampoline_addr(SB)/8, $libc_settimeofday_trampoline<>(SB)
 
 TEXT libc_setuid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setuid(SB)
-
 GLOBL	·libc_setuid_trampoline_addr(SB), RODATA, $8
 DATA	·libc_setuid_trampoline_addr(SB)/8, $libc_setuid_trampoline<>(SB)
 
 TEXT libc_stat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_stat(SB)
-
 GLOBL	·libc_stat_trampoline_addr(SB), RODATA, $8
 DATA	·libc_stat_trampoline_addr(SB)/8, $libc_stat_trampoline<>(SB)
 
 TEXT libc_statfs_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_statfs(SB)
-
 GLOBL	·libc_statfs_trampoline_addr(SB), RODATA, $8
 DATA	·libc_statfs_trampoline_addr(SB)/8, $libc_statfs_trampoline<>(SB)
 
 TEXT libc_symlink_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_symlink(SB)
-
 GLOBL	·libc_symlink_trampoline_addr(SB), RODATA, $8
 DATA	·libc_symlink_trampoline_addr(SB)/8, $libc_symlink_trampoline<>(SB)
 
 TEXT libc_symlinkat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_symlinkat(SB)
-
 GLOBL	·libc_symlinkat_trampoline_addr(SB), RODATA, $8
 DATA	·libc_symlinkat_trampoline_addr(SB)/8, $libc_symlinkat_trampoline<>(SB)
 
 TEXT libc_sync_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_sync(SB)
-
 GLOBL	·libc_sync_trampoline_addr(SB), RODATA, $8
 DATA	·libc_sync_trampoline_addr(SB)/8, $libc_sync_trampoline<>(SB)
 
 TEXT libc_truncate_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_truncate(SB)
-
 GLOBL	·libc_truncate_trampoline_addr(SB), RODATA, $8
 DATA	·libc_truncate_trampoline_addr(SB)/8, $libc_truncate_trampoline<>(SB)
 
 TEXT libc_umask_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_umask(SB)
-
 GLOBL	·libc_umask_trampoline_addr(SB), RODATA, $8
 DATA	·libc_umask_trampoline_addr(SB)/8, $libc_umask_trampoline<>(SB)
 
 TEXT libc_unlink_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_unlink(SB)
-
 GLOBL	·libc_unlink_trampoline_addr(SB), RODATA, $8
 DATA	·libc_unlink_trampoline_addr(SB)/8, $libc_unlink_trampoline<>(SB)
 
 TEXT libc_unlinkat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_unlinkat(SB)
-
 GLOBL	·libc_unlinkat_trampoline_addr(SB), RODATA, $8
 DATA	·libc_unlinkat_trampoline_addr(SB)/8, $libc_unlinkat_trampoline<>(SB)
 
 TEXT libc_unmount_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_unmount(SB)
-
 GLOBL	·libc_unmount_trampoline_addr(SB), RODATA, $8
 DATA	·libc_unmount_trampoline_addr(SB)/8, $libc_unmount_trampoline<>(SB)
 
 TEXT libc_write_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_write(SB)
-
 GLOBL	·libc_write_trampoline_addr(SB), RODATA, $8
 DATA	·libc_write_trampoline_addr(SB)/8, $libc_write_trampoline<>(SB)
 
 TEXT libc_mmap_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_mmap(SB)
-
 GLOBL	·libc_mmap_trampoline_addr(SB), RODATA, $8
 DATA	·libc_mmap_trampoline_addr(SB)/8, $libc_mmap_trampoline<>(SB)
 
 TEXT libc_munmap_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_munmap(SB)
-
 GLOBL	·libc_munmap_trampoline_addr(SB), RODATA, $8
 DATA	·libc_munmap_trampoline_addr(SB)/8, $libc_munmap_trampoline<>(SB)
 
 TEXT libc_utimensat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_utimensat(SB)
-
 GLOBL	·libc_utimensat_trampoline_addr(SB), RODATA, $8
 DATA	·libc_utimensat_trampoline_addr(SB)/8, $libc_utimensat_trampoline<>(SB)
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.go
index 016d959..b19e8aa 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.go
@@ -1,4 +1,4 @@
-// go run mksyscall.go -openbsd -tags openbsd,mips64 syscall_bsd.go syscall_openbsd.go syscall_openbsd_mips64.go
+// go run mksyscall.go -openbsd -libc -tags openbsd,mips64 syscall_bsd.go syscall_openbsd.go syscall_openbsd_mips64.go
 // Code generated by the command above; see README.md. DO NOT EDIT.
 
 //go:build openbsd && mips64
@@ -16,7 +16,7 @@
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func getgroups(ngid int, gid *_Gid_t) (n int, err error) {
-	r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0)
+	r0, _, e1 := syscall_rawSyscall(libc_getgroups_trampoline_addr, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0)
 	n = int(r0)
 	if e1 != 0 {
 		err = errnoErr(e1)
@@ -24,20 +24,28 @@
 	return
 }
 
+var libc_getgroups_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_getgroups getgroups "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func setgroups(ngid int, gid *_Gid_t) (err error) {
-	_, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0)
+	_, _, e1 := syscall_rawSyscall(libc_setgroups_trampoline_addr, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_setgroups_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_setgroups setgroups "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) {
-	r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0)
+	r0, _, e1 := syscall_syscall6(libc_wait4_trampoline_addr, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0)
 	wpid = int(r0)
 	if e1 != 0 {
 		err = errnoErr(e1)
@@ -45,10 +53,14 @@
 	return
 }
 
+var libc_wait4_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_wait4 wait4 "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) {
-	r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))
+	r0, _, e1 := syscall_syscall(libc_accept_trampoline_addr, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))
 	fd = int(r0)
 	if e1 != 0 {
 		err = errnoErr(e1)
@@ -56,30 +68,42 @@
 	return
 }
 
+var libc_accept_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_accept accept "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) {
-	_, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen))
+	_, _, e1 := syscall_syscall(libc_bind_trampoline_addr, uintptr(s), uintptr(addr), uintptr(addrlen))
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_bind_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_bind bind "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) {
-	_, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen))
+	_, _, e1 := syscall_syscall(libc_connect_trampoline_addr, uintptr(s), uintptr(addr), uintptr(addrlen))
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_connect_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_connect connect "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func socket(domain int, typ int, proto int) (fd int, err error) {
-	r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto))
+	r0, _, e1 := syscall_rawSyscall(libc_socket_trampoline_addr, uintptr(domain), uintptr(typ), uintptr(proto))
 	fd = int(r0)
 	if e1 != 0 {
 		err = errnoErr(e1)
@@ -87,66 +111,94 @@
 	return
 }
 
+var libc_socket_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_socket socket "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) {
-	_, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0)
+	_, _, e1 := syscall_syscall6(libc_getsockopt_trampoline_addr, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_getsockopt_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_getsockopt getsockopt "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) {
-	_, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0)
+	_, _, e1 := syscall_syscall6(libc_setsockopt_trampoline_addr, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_setsockopt_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_setsockopt setsockopt "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) {
-	_, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))
+	_, _, e1 := syscall_rawSyscall(libc_getpeername_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_getpeername_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_getpeername getpeername "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) {
-	_, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))
+	_, _, e1 := syscall_rawSyscall(libc_getsockname_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_getsockname_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_getsockname getsockname "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Shutdown(s int, how int) (err error) {
-	_, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0)
+	_, _, e1 := syscall_syscall(libc_shutdown_trampoline_addr, uintptr(s), uintptr(how), 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_shutdown_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_shutdown shutdown "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) {
-	_, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0)
+	_, _, e1 := syscall_rawSyscall6(libc_socketpair_trampoline_addr, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_socketpair_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_socketpair socketpair "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) {
@@ -156,7 +208,7 @@
 	} else {
 		_p0 = unsafe.Pointer(&_zero)
 	}
-	r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen)))
+	r0, _, e1 := syscall_syscall6(libc_recvfrom_trampoline_addr, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen)))
 	n = int(r0)
 	if e1 != 0 {
 		err = errnoErr(e1)
@@ -164,6 +216,10 @@
 	return
 }
 
+var libc_recvfrom_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_recvfrom recvfrom "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) {
@@ -173,17 +229,21 @@
 	} else {
 		_p0 = unsafe.Pointer(&_zero)
 	}
-	_, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen))
+	_, _, e1 := syscall_syscall6(libc_sendto_trampoline_addr, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen))
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_sendto_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_sendto sendto "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) {
-	r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))
+	r0, _, e1 := syscall_syscall(libc_recvmsg_trampoline_addr, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))
 	n = int(r0)
 	if e1 != 0 {
 		err = errnoErr(e1)
@@ -191,10 +251,14 @@
 	return
 }
 
+var libc_recvmsg_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_recvmsg recvmsg "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) {
-	r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))
+	r0, _, e1 := syscall_syscall(libc_sendmsg_trampoline_addr, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))
 	n = int(r0)
 	if e1 != 0 {
 		err = errnoErr(e1)
@@ -202,10 +266,14 @@
 	return
 }
 
+var libc_sendmsg_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_sendmsg sendmsg "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) {
-	r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout)))
+	r0, _, e1 := syscall_syscall6(libc_kevent_trampoline_addr, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout)))
 	n = int(r0)
 	if e1 != 0 {
 		err = errnoErr(e1)
@@ -213,6 +281,10 @@
 	return
 }
 
+var libc_kevent_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_kevent kevent "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func utimes(path string, timeval *[2]Timeval) (err error) {
@@ -221,27 +293,35 @@
 	if err != nil {
 		return
 	}
-	_, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0)
+	_, _, e1 := syscall_syscall(libc_utimes_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_utimes_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_utimes utimes "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func futimes(fd int, timeval *[2]Timeval) (err error) {
-	_, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0)
+	_, _, e1 := syscall_syscall(libc_futimes_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_futimes_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_futimes futimes "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func poll(fds *PollFd, nfds int, timeout int) (n int, err error) {
-	r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout))
+	r0, _, e1 := syscall_syscall(libc_poll_trampoline_addr, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout))
 	n = int(r0)
 	if e1 != 0 {
 		err = errnoErr(e1)
@@ -249,6 +329,10 @@
 	return
 }
 
+var libc_poll_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_poll poll "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Madvise(b []byte, behav int) (err error) {
@@ -258,13 +342,17 @@
 	} else {
 		_p0 = unsafe.Pointer(&_zero)
 	}
-	_, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav))
+	_, _, e1 := syscall_syscall(libc_madvise_trampoline_addr, uintptr(_p0), uintptr(len(b)), uintptr(behav))
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_madvise_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_madvise madvise "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Mlock(b []byte) (err error) {
@@ -274,23 +362,31 @@
 	} else {
 		_p0 = unsafe.Pointer(&_zero)
 	}
-	_, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0)
+	_, _, e1 := syscall_syscall(libc_mlock_trampoline_addr, uintptr(_p0), uintptr(len(b)), 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_mlock_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_mlock mlock "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Mlockall(flags int) (err error) {
-	_, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0)
+	_, _, e1 := syscall_syscall(libc_mlockall_trampoline_addr, uintptr(flags), 0, 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_mlockall_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_mlockall mlockall "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Mprotect(b []byte, prot int) (err error) {
@@ -300,13 +396,17 @@
 	} else {
 		_p0 = unsafe.Pointer(&_zero)
 	}
-	_, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot))
+	_, _, e1 := syscall_syscall(libc_mprotect_trampoline_addr, uintptr(_p0), uintptr(len(b)), uintptr(prot))
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_mprotect_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_mprotect mprotect "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Msync(b []byte, flags int) (err error) {
@@ -316,13 +416,17 @@
 	} else {
 		_p0 = unsafe.Pointer(&_zero)
 	}
-	_, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags))
+	_, _, e1 := syscall_syscall(libc_msync_trampoline_addr, uintptr(_p0), uintptr(len(b)), uintptr(flags))
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_msync_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_msync msync "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Munlock(b []byte) (err error) {
@@ -332,33 +436,45 @@
 	} else {
 		_p0 = unsafe.Pointer(&_zero)
 	}
-	_, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0)
+	_, _, e1 := syscall_syscall(libc_munlock_trampoline_addr, uintptr(_p0), uintptr(len(b)), 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_munlock_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_munlock munlock "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Munlockall() (err error) {
-	_, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0)
+	_, _, e1 := syscall_syscall(libc_munlockall_trampoline_addr, 0, 0, 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_munlockall_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_munlockall munlockall "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func pipe2(p *[2]_C_int, flags int) (err error) {
-	_, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0)
+	_, _, e1 := syscall_rawSyscall(libc_pipe2_trampoline_addr, uintptr(unsafe.Pointer(p)), uintptr(flags), 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_pipe2_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_pipe2 pipe2 "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Getdents(fd int, buf []byte) (n int, err error) {
@@ -368,7 +484,7 @@
 	} else {
 		_p0 = unsafe.Pointer(&_zero)
 	}
-	r0, _, e1 := Syscall(SYS_GETDENTS, uintptr(fd), uintptr(_p0), uintptr(len(buf)))
+	r0, _, e1 := syscall_syscall(libc_getdents_trampoline_addr, uintptr(fd), uintptr(_p0), uintptr(len(buf)))
 	n = int(r0)
 	if e1 != 0 {
 		err = errnoErr(e1)
@@ -376,6 +492,10 @@
 	return
 }
 
+var libc_getdents_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_getdents getdents "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Getcwd(buf []byte) (n int, err error) {
@@ -385,7 +505,7 @@
 	} else {
 		_p0 = unsafe.Pointer(&_zero)
 	}
-	r0, _, e1 := Syscall(SYS___GETCWD, uintptr(_p0), uintptr(len(buf)), 0)
+	r0, _, e1 := syscall_syscall(libc_getcwd_trampoline_addr, uintptr(_p0), uintptr(len(buf)), 0)
 	n = int(r0)
 	if e1 != 0 {
 		err = errnoErr(e1)
@@ -393,16 +513,54 @@
 	return
 }
 
+var libc_getcwd_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_getcwd getcwd "libc.so"
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func getresuid(ruid *_C_int, euid *_C_int, suid *_C_int) {
+	syscall_rawSyscall(libc_getresuid_trampoline_addr, uintptr(unsafe.Pointer(ruid)), uintptr(unsafe.Pointer(euid)), uintptr(unsafe.Pointer(suid)))
+	return
+}
+
+var libc_getresuid_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_getresuid getresuid "libc.so"
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func getresgid(rgid *_C_int, egid *_C_int, sgid *_C_int) {
+	syscall_rawSyscall(libc_getresgid_trampoline_addr, uintptr(unsafe.Pointer(rgid)), uintptr(unsafe.Pointer(egid)), uintptr(unsafe.Pointer(sgid)))
+	return
+}
+
+var libc_getresgid_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_getresgid getresgid "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func ioctl(fd int, req uint, arg uintptr) (err error) {
-	_, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg))
+	_, _, e1 := syscall_syscall(libc_ioctl_trampoline_addr, uintptr(fd), uintptr(req), uintptr(arg))
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+func ioctlPtr(fd int, req uint, arg unsafe.Pointer) (err error) {
+	_, _, e1 := syscall_syscall(libc_ioctl_trampoline_addr, uintptr(fd), uintptr(req), uintptr(arg))
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+var libc_ioctl_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_ioctl ioctl "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) {
@@ -412,17 +570,21 @@
 	} else {
 		_p0 = unsafe.Pointer(&_zero)
 	}
-	_, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen))
+	_, _, e1 := syscall_syscall6(libc_sysctl_trampoline_addr, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen))
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_sysctl_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_sysctl sysctl "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) {
-	r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0)
+	r0, _, e1 := syscall_syscall6(libc_ppoll_trampoline_addr, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0)
 	n = int(r0)
 	if e1 != 0 {
 		err = errnoErr(e1)
@@ -430,6 +592,10 @@
 	return
 }
 
+var libc_ppoll_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_ppoll ppoll "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Access(path string, mode uint32) (err error) {
@@ -438,23 +604,31 @@
 	if err != nil {
 		return
 	}
-	_, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0)
+	_, _, e1 := syscall_syscall(libc_access_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_access_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_access access "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Adjtime(delta *Timeval, olddelta *Timeval) (err error) {
-	_, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0)
+	_, _, e1 := syscall_syscall(libc_adjtime_trampoline_addr, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_adjtime_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_adjtime adjtime "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Chdir(path string) (err error) {
@@ -463,13 +637,17 @@
 	if err != nil {
 		return
 	}
-	_, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0)
+	_, _, e1 := syscall_syscall(libc_chdir_trampoline_addr, uintptr(unsafe.Pointer(_p0)), 0, 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_chdir_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_chdir chdir "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Chflags(path string, flags int) (err error) {
@@ -478,13 +656,17 @@
 	if err != nil {
 		return
 	}
-	_, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0)
+	_, _, e1 := syscall_syscall(libc_chflags_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_chflags_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_chflags chflags "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Chmod(path string, mode uint32) (err error) {
@@ -493,13 +675,17 @@
 	if err != nil {
 		return
 	}
-	_, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0)
+	_, _, e1 := syscall_syscall(libc_chmod_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_chmod_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_chmod chmod "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Chown(path string, uid int, gid int) (err error) {
@@ -508,13 +694,17 @@
 	if err != nil {
 		return
 	}
-	_, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid))
+	_, _, e1 := syscall_syscall(libc_chown_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid))
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_chown_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_chown chown "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Chroot(path string) (err error) {
@@ -523,27 +713,49 @@
 	if err != nil {
 		return
 	}
-	_, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0)
+	_, _, e1 := syscall_syscall(libc_chroot_trampoline_addr, uintptr(unsafe.Pointer(_p0)), 0, 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_chroot_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_chroot chroot "libc.so"
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func ClockGettime(clockid int32, time *Timespec) (err error) {
+	_, _, e1 := syscall_syscall(libc_clock_gettime_trampoline_addr, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+var libc_clock_gettime_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_clock_gettime clock_gettime "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Close(fd int) (err error) {
-	_, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0)
+	_, _, e1 := syscall_syscall(libc_close_trampoline_addr, uintptr(fd), 0, 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_close_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_close close "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Dup(fd int) (nfd int, err error) {
-	r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0)
+	r0, _, e1 := syscall_syscall(libc_dup_trampoline_addr, uintptr(fd), 0, 0)
 	nfd = int(r0)
 	if e1 != 0 {
 		err = errnoErr(e1)
@@ -551,33 +763,49 @@
 	return
 }
 
+var libc_dup_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_dup dup "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Dup2(from int, to int) (err error) {
-	_, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0)
+	_, _, e1 := syscall_syscall(libc_dup2_trampoline_addr, uintptr(from), uintptr(to), 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_dup2_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_dup2 dup2 "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Dup3(from int, to int, flags int) (err error) {
-	_, _, e1 := Syscall(SYS_DUP3, uintptr(from), uintptr(to), uintptr(flags))
+	_, _, e1 := syscall_syscall(libc_dup3_trampoline_addr, uintptr(from), uintptr(to), uintptr(flags))
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_dup3_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_dup3 dup3 "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Exit(code int) {
-	Syscall(SYS_EXIT, uintptr(code), 0, 0)
+	syscall_syscall(libc_exit_trampoline_addr, uintptr(code), 0, 0)
 	return
 }
 
+var libc_exit_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_exit exit "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) {
@@ -586,43 +814,59 @@
 	if err != nil {
 		return
 	}
-	_, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0)
+	_, _, e1 := syscall_syscall6(libc_faccessat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_faccessat_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_faccessat faccessat "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Fchdir(fd int) (err error) {
-	_, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0)
+	_, _, e1 := syscall_syscall(libc_fchdir_trampoline_addr, uintptr(fd), 0, 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_fchdir_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_fchdir fchdir "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Fchflags(fd int, flags int) (err error) {
-	_, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0)
+	_, _, e1 := syscall_syscall(libc_fchflags_trampoline_addr, uintptr(fd), uintptr(flags), 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_fchflags_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_fchflags fchflags "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Fchmod(fd int, mode uint32) (err error) {
-	_, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0)
+	_, _, e1 := syscall_syscall(libc_fchmod_trampoline_addr, uintptr(fd), uintptr(mode), 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_fchmod_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_fchmod fchmod "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) {
@@ -631,23 +875,31 @@
 	if err != nil {
 		return
 	}
-	_, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0)
+	_, _, e1 := syscall_syscall6(libc_fchmodat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_fchmodat_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_fchmodat fchmodat "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Fchown(fd int, uid int, gid int) (err error) {
-	_, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid))
+	_, _, e1 := syscall_syscall(libc_fchown_trampoline_addr, uintptr(fd), uintptr(uid), uintptr(gid))
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_fchown_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_fchown fchown "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) {
@@ -656,27 +908,35 @@
 	if err != nil {
 		return
 	}
-	_, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0)
+	_, _, e1 := syscall_syscall6(libc_fchownat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_fchownat_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_fchownat fchownat "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Flock(fd int, how int) (err error) {
-	_, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0)
+	_, _, e1 := syscall_syscall(libc_flock_trampoline_addr, uintptr(fd), uintptr(how), 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_flock_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_flock flock "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Fpathconf(fd int, name int) (val int, err error) {
-	r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0)
+	r0, _, e1 := syscall_syscall(libc_fpathconf_trampoline_addr, uintptr(fd), uintptr(name), 0)
 	val = int(r0)
 	if e1 != 0 {
 		err = errnoErr(e1)
@@ -684,16 +944,24 @@
 	return
 }
 
+var libc_fpathconf_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_fpathconf fpathconf "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Fstat(fd int, stat *Stat_t) (err error) {
-	_, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0)
+	_, _, e1 := syscall_syscall(libc_fstat_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_fstat_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_fstat fstat "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) {
@@ -702,71 +970,99 @@
 	if err != nil {
 		return
 	}
-	_, _, e1 := Syscall6(SYS_FSTATAT, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0)
+	_, _, e1 := syscall_syscall6(libc_fstatat_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_fstatat_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_fstatat fstatat "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Fstatfs(fd int, stat *Statfs_t) (err error) {
-	_, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0)
+	_, _, e1 := syscall_syscall(libc_fstatfs_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_fstatfs_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_fstatfs fstatfs "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Fsync(fd int) (err error) {
-	_, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0)
+	_, _, e1 := syscall_syscall(libc_fsync_trampoline_addr, uintptr(fd), 0, 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_fsync_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_fsync fsync "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Ftruncate(fd int, length int64) (err error) {
-	_, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), 0, uintptr(length))
+	_, _, e1 := syscall_syscall(libc_ftruncate_trampoline_addr, uintptr(fd), uintptr(length), 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_ftruncate_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_ftruncate ftruncate "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Getegid() (egid int) {
-	r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0)
+	r0, _, _ := syscall_rawSyscall(libc_getegid_trampoline_addr, 0, 0, 0)
 	egid = int(r0)
 	return
 }
 
+var libc_getegid_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_getegid getegid "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Geteuid() (uid int) {
-	r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0)
+	r0, _, _ := syscall_rawSyscall(libc_geteuid_trampoline_addr, 0, 0, 0)
 	uid = int(r0)
 	return
 }
 
+var libc_geteuid_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_geteuid geteuid "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Getgid() (gid int) {
-	r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0)
+	r0, _, _ := syscall_rawSyscall(libc_getgid_trampoline_addr, 0, 0, 0)
 	gid = int(r0)
 	return
 }
 
+var libc_getgid_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_getgid getgid "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Getpgid(pid int) (pgid int, err error) {
-	r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0)
+	r0, _, e1 := syscall_rawSyscall(libc_getpgid_trampoline_addr, uintptr(pid), 0, 0)
 	pgid = int(r0)
 	if e1 != 0 {
 		err = errnoErr(e1)
@@ -774,34 +1070,50 @@
 	return
 }
 
+var libc_getpgid_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_getpgid getpgid "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Getpgrp() (pgrp int) {
-	r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0)
+	r0, _, _ := syscall_rawSyscall(libc_getpgrp_trampoline_addr, 0, 0, 0)
 	pgrp = int(r0)
 	return
 }
 
+var libc_getpgrp_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_getpgrp getpgrp "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Getpid() (pid int) {
-	r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0)
+	r0, _, _ := syscall_rawSyscall(libc_getpid_trampoline_addr, 0, 0, 0)
 	pid = int(r0)
 	return
 }
 
+var libc_getpid_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_getpid getpid "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Getppid() (ppid int) {
-	r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0)
+	r0, _, _ := syscall_rawSyscall(libc_getppid_trampoline_addr, 0, 0, 0)
 	ppid = int(r0)
 	return
 }
 
+var libc_getppid_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_getppid getppid "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Getpriority(which int, who int) (prio int, err error) {
-	r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0)
+	r0, _, e1 := syscall_syscall(libc_getpriority_trampoline_addr, uintptr(which), uintptr(who), 0)
 	prio = int(r0)
 	if e1 != 0 {
 		err = errnoErr(e1)
@@ -809,20 +1121,28 @@
 	return
 }
 
+var libc_getpriority_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_getpriority getpriority "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Getrlimit(which int, lim *Rlimit) (err error) {
-	_, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0)
+	_, _, e1 := syscall_rawSyscall(libc_getrlimit_trampoline_addr, uintptr(which), uintptr(unsafe.Pointer(lim)), 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_getrlimit_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_getrlimit getrlimit "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Getrtable() (rtable int, err error) {
-	r0, _, e1 := RawSyscall(SYS_GETRTABLE, 0, 0, 0)
+	r0, _, e1 := syscall_rawSyscall(libc_getrtable_trampoline_addr, 0, 0, 0)
 	rtable = int(r0)
 	if e1 != 0 {
 		err = errnoErr(e1)
@@ -830,20 +1150,28 @@
 	return
 }
 
+var libc_getrtable_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_getrtable getrtable "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Getrusage(who int, rusage *Rusage) (err error) {
-	_, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0)
+	_, _, e1 := syscall_rawSyscall(libc_getrusage_trampoline_addr, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_getrusage_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_getrusage getrusage "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Getsid(pid int) (sid int, err error) {
-	r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0)
+	r0, _, e1 := syscall_rawSyscall(libc_getsid_trampoline_addr, uintptr(pid), 0, 0)
 	sid = int(r0)
 	if e1 != 0 {
 		err = errnoErr(e1)
@@ -851,46 +1179,66 @@
 	return
 }
 
+var libc_getsid_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_getsid getsid "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Gettimeofday(tv *Timeval) (err error) {
-	_, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0)
+	_, _, e1 := syscall_rawSyscall(libc_gettimeofday_trampoline_addr, uintptr(unsafe.Pointer(tv)), 0, 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_gettimeofday_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_gettimeofday gettimeofday "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Getuid() (uid int) {
-	r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0)
+	r0, _, _ := syscall_rawSyscall(libc_getuid_trampoline_addr, 0, 0, 0)
 	uid = int(r0)
 	return
 }
 
+var libc_getuid_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_getuid getuid "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Issetugid() (tainted bool) {
-	r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0)
+	r0, _, _ := syscall_syscall(libc_issetugid_trampoline_addr, 0, 0, 0)
 	tainted = bool(r0 != 0)
 	return
 }
 
+var libc_issetugid_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_issetugid issetugid "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Kill(pid int, signum syscall.Signal) (err error) {
-	_, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0)
+	_, _, e1 := syscall_syscall(libc_kill_trampoline_addr, uintptr(pid), uintptr(signum), 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_kill_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_kill kill "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Kqueue() (fd int, err error) {
-	r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0)
+	r0, _, e1 := syscall_syscall(libc_kqueue_trampoline_addr, 0, 0, 0)
 	fd = int(r0)
 	if e1 != 0 {
 		err = errnoErr(e1)
@@ -898,6 +1246,10 @@
 	return
 }
 
+var libc_kqueue_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_kqueue kqueue "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Lchown(path string, uid int, gid int) (err error) {
@@ -906,13 +1258,17 @@
 	if err != nil {
 		return
 	}
-	_, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid))
+	_, _, e1 := syscall_syscall(libc_lchown_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid))
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_lchown_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_lchown lchown "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Link(path string, link string) (err error) {
@@ -926,13 +1282,17 @@
 	if err != nil {
 		return
 	}
-	_, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)
+	_, _, e1 := syscall_syscall(libc_link_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_link_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_link link "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) {
@@ -946,23 +1306,31 @@
 	if err != nil {
 		return
 	}
-	_, _, e1 := Syscall6(SYS_LINKAT, uintptr(pathfd), uintptr(unsafe.Pointer(_p0)), uintptr(linkfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0)
+	_, _, e1 := syscall_syscall6(libc_linkat_trampoline_addr, uintptr(pathfd), uintptr(unsafe.Pointer(_p0)), uintptr(linkfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_linkat_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_linkat linkat "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Listen(s int, backlog int) (err error) {
-	_, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0)
+	_, _, e1 := syscall_syscall(libc_listen_trampoline_addr, uintptr(s), uintptr(backlog), 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_listen_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_listen listen "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Lstat(path string, stat *Stat_t) (err error) {
@@ -971,13 +1339,17 @@
 	if err != nil {
 		return
 	}
-	_, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0)
+	_, _, e1 := syscall_syscall(libc_lstat_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_lstat_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_lstat lstat "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Mkdir(path string, mode uint32) (err error) {
@@ -986,13 +1358,17 @@
 	if err != nil {
 		return
 	}
-	_, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0)
+	_, _, e1 := syscall_syscall(libc_mkdir_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_mkdir_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_mkdir mkdir "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Mkdirat(dirfd int, path string, mode uint32) (err error) {
@@ -1001,13 +1377,17 @@
 	if err != nil {
 		return
 	}
-	_, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode))
+	_, _, e1 := syscall_syscall(libc_mkdirat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode))
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_mkdirat_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_mkdirat mkdirat "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Mkfifo(path string, mode uint32) (err error) {
@@ -1016,13 +1396,17 @@
 	if err != nil {
 		return
 	}
-	_, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0)
+	_, _, e1 := syscall_syscall(libc_mkfifo_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_mkfifo_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_mkfifo mkfifo "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Mkfifoat(dirfd int, path string, mode uint32) (err error) {
@@ -1031,13 +1415,17 @@
 	if err != nil {
 		return
 	}
-	_, _, e1 := Syscall(SYS_MKFIFOAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode))
+	_, _, e1 := syscall_syscall(libc_mkfifoat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode))
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_mkfifoat_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_mkfifoat mkfifoat "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Mknod(path string, mode uint32, dev int) (err error) {
@@ -1046,13 +1434,17 @@
 	if err != nil {
 		return
 	}
-	_, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev))
+	_, _, e1 := syscall_syscall(libc_mknod_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev))
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_mknod_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_mknod mknod "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) {
@@ -1061,23 +1453,31 @@
 	if err != nil {
 		return
 	}
-	_, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0)
+	_, _, e1 := syscall_syscall6(libc_mknodat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_mknodat_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_mknodat mknodat "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Nanosleep(time *Timespec, leftover *Timespec) (err error) {
-	_, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0)
+	_, _, e1 := syscall_syscall(libc_nanosleep_trampoline_addr, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_nanosleep_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_nanosleep nanosleep "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Open(path string, mode int, perm uint32) (fd int, err error) {
@@ -1086,7 +1486,7 @@
 	if err != nil {
 		return
 	}
-	r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm))
+	r0, _, e1 := syscall_syscall(libc_open_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm))
 	fd = int(r0)
 	if e1 != 0 {
 		err = errnoErr(e1)
@@ -1094,6 +1494,10 @@
 	return
 }
 
+var libc_open_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_open open "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error) {
@@ -1102,7 +1506,7 @@
 	if err != nil {
 		return
 	}
-	r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0)
+	r0, _, e1 := syscall_syscall6(libc_openat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0)
 	fd = int(r0)
 	if e1 != 0 {
 		err = errnoErr(e1)
@@ -1110,6 +1514,10 @@
 	return
 }
 
+var libc_openat_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_openat openat "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Pathconf(path string, name int) (val int, err error) {
@@ -1118,7 +1526,7 @@
 	if err != nil {
 		return
 	}
-	r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0)
+	r0, _, e1 := syscall_syscall(libc_pathconf_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0)
 	val = int(r0)
 	if e1 != 0 {
 		err = errnoErr(e1)
@@ -1126,6 +1534,10 @@
 	return
 }
 
+var libc_pathconf_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_pathconf pathconf "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func pread(fd int, p []byte, offset int64) (n int, err error) {
@@ -1135,7 +1547,7 @@
 	} else {
 		_p0 = unsafe.Pointer(&_zero)
 	}
-	r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), 0)
+	r0, _, e1 := syscall_syscall6(libc_pread_trampoline_addr, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0)
 	n = int(r0)
 	if e1 != 0 {
 		err = errnoErr(e1)
@@ -1143,6 +1555,10 @@
 	return
 }
 
+var libc_pread_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_pread pread "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func pwrite(fd int, p []byte, offset int64) (n int, err error) {
@@ -1152,7 +1568,7 @@
 	} else {
 		_p0 = unsafe.Pointer(&_zero)
 	}
-	r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), 0)
+	r0, _, e1 := syscall_syscall6(libc_pwrite_trampoline_addr, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0)
 	n = int(r0)
 	if e1 != 0 {
 		err = errnoErr(e1)
@@ -1160,6 +1576,10 @@
 	return
 }
 
+var libc_pwrite_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_pwrite pwrite "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func read(fd int, p []byte) (n int, err error) {
@@ -1169,7 +1589,7 @@
 	} else {
 		_p0 = unsafe.Pointer(&_zero)
 	}
-	r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p)))
+	r0, _, e1 := syscall_syscall(libc_read_trampoline_addr, uintptr(fd), uintptr(_p0), uintptr(len(p)))
 	n = int(r0)
 	if e1 != 0 {
 		err = errnoErr(e1)
@@ -1177,6 +1597,10 @@
 	return
 }
 
+var libc_read_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_read read "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Readlink(path string, buf []byte) (n int, err error) {
@@ -1191,7 +1615,7 @@
 	} else {
 		_p1 = unsafe.Pointer(&_zero)
 	}
-	r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)))
+	r0, _, e1 := syscall_syscall(libc_readlink_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)))
 	n = int(r0)
 	if e1 != 0 {
 		err = errnoErr(e1)
@@ -1199,6 +1623,10 @@
 	return
 }
 
+var libc_readlink_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_readlink readlink "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) {
@@ -1213,7 +1641,7 @@
 	} else {
 		_p1 = unsafe.Pointer(&_zero)
 	}
-	r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0)
+	r0, _, e1 := syscall_syscall6(libc_readlinkat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0)
 	n = int(r0)
 	if e1 != 0 {
 		err = errnoErr(e1)
@@ -1221,6 +1649,10 @@
 	return
 }
 
+var libc_readlinkat_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_readlinkat readlinkat "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Rename(from string, to string) (err error) {
@@ -1234,13 +1666,17 @@
 	if err != nil {
 		return
 	}
-	_, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)
+	_, _, e1 := syscall_syscall(libc_rename_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_rename_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_rename rename "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Renameat(fromfd int, from string, tofd int, to string) (err error) {
@@ -1254,13 +1690,17 @@
 	if err != nil {
 		return
 	}
-	_, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(fromfd), uintptr(unsafe.Pointer(_p0)), uintptr(tofd), uintptr(unsafe.Pointer(_p1)), 0, 0)
+	_, _, e1 := syscall_syscall6(libc_renameat_trampoline_addr, uintptr(fromfd), uintptr(unsafe.Pointer(_p0)), uintptr(tofd), uintptr(unsafe.Pointer(_p1)), 0, 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_renameat_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_renameat renameat "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Revoke(path string) (err error) {
@@ -1269,13 +1709,17 @@
 	if err != nil {
 		return
 	}
-	_, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0)
+	_, _, e1 := syscall_syscall(libc_revoke_trampoline_addr, uintptr(unsafe.Pointer(_p0)), 0, 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_revoke_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_revoke revoke "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Rmdir(path string) (err error) {
@@ -1284,17 +1728,21 @@
 	if err != nil {
 		return
 	}
-	_, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0)
+	_, _, e1 := syscall_syscall(libc_rmdir_trampoline_addr, uintptr(unsafe.Pointer(_p0)), 0, 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_rmdir_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_rmdir rmdir "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Seek(fd int, offset int64, whence int) (newoffset int64, err error) {
-	r0, _, e1 := Syscall6(SYS_LSEEK, uintptr(fd), 0, uintptr(offset), uintptr(whence), 0, 0)
+	r0, _, e1 := syscall_syscall(libc_lseek_trampoline_addr, uintptr(fd), uintptr(offset), uintptr(whence))
 	newoffset = int64(r0)
 	if e1 != 0 {
 		err = errnoErr(e1)
@@ -1302,10 +1750,14 @@
 	return
 }
 
+var libc_lseek_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_lseek lseek "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) {
-	r0, _, e1 := Syscall6(SYS_SELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)
+	r0, _, e1 := syscall_syscall6(libc_select_trampoline_addr, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)
 	n = int(r0)
 	if e1 != 0 {
 		err = errnoErr(e1)
@@ -1313,36 +1765,52 @@
 	return
 }
 
+var libc_select_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_select select "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Setegid(egid int) (err error) {
-	_, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0)
+	_, _, e1 := syscall_rawSyscall(libc_setegid_trampoline_addr, uintptr(egid), 0, 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_setegid_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_setegid setegid "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Seteuid(euid int) (err error) {
-	_, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0)
+	_, _, e1 := syscall_rawSyscall(libc_seteuid_trampoline_addr, uintptr(euid), 0, 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_seteuid_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_seteuid seteuid "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Setgid(gid int) (err error) {
-	_, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0)
+	_, _, e1 := syscall_rawSyscall(libc_setgid_trampoline_addr, uintptr(gid), 0, 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_setgid_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_setgid setgid "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Setlogin(name string) (err error) {
@@ -1351,97 +1819,119 @@
 	if err != nil {
 		return
 	}
-	_, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0)
+	_, _, e1 := syscall_syscall(libc_setlogin_trampoline_addr, uintptr(unsafe.Pointer(_p0)), 0, 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_setlogin_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_setlogin setlogin "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Setpgid(pid int, pgid int) (err error) {
-	_, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0)
+	_, _, e1 := syscall_rawSyscall(libc_setpgid_trampoline_addr, uintptr(pid), uintptr(pgid), 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_setpgid_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_setpgid setpgid "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Setpriority(which int, who int, prio int) (err error) {
-	_, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio))
+	_, _, e1 := syscall_syscall(libc_setpriority_trampoline_addr, uintptr(which), uintptr(who), uintptr(prio))
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_setpriority_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_setpriority setpriority "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Setregid(rgid int, egid int) (err error) {
-	_, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0)
+	_, _, e1 := syscall_rawSyscall(libc_setregid_trampoline_addr, uintptr(rgid), uintptr(egid), 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_setregid_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_setregid setregid "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Setreuid(ruid int, euid int) (err error) {
-	_, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0)
+	_, _, e1 := syscall_rawSyscall(libc_setreuid_trampoline_addr, uintptr(ruid), uintptr(euid), 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_setreuid_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_setreuid setreuid "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Setresgid(rgid int, egid int, sgid int) (err error) {
-	_, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid))
+	_, _, e1 := syscall_rawSyscall(libc_setresgid_trampoline_addr, uintptr(rgid), uintptr(egid), uintptr(sgid))
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_setresgid_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_setresgid setresgid "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Setresuid(ruid int, euid int, suid int) (err error) {
-	_, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid))
+	_, _, e1 := syscall_rawSyscall(libc_setresuid_trampoline_addr, uintptr(ruid), uintptr(euid), uintptr(suid))
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+var libc_setresuid_trampoline_addr uintptr
 
-func Setrlimit(which int, lim *Rlimit) (err error) {
-	_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0)
-	if e1 != 0 {
-		err = errnoErr(e1)
-	}
-	return
-}
+//go:cgo_import_dynamic libc_setresuid setresuid "libc.so"
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Setrtable(rtable int) (err error) {
-	_, _, e1 := RawSyscall(SYS_SETRTABLE, uintptr(rtable), 0, 0)
+	_, _, e1 := syscall_rawSyscall(libc_setrtable_trampoline_addr, uintptr(rtable), 0, 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_setrtable_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_setrtable setrtable "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Setsid() (pid int, err error) {
-	r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0)
+	r0, _, e1 := syscall_rawSyscall(libc_setsid_trampoline_addr, 0, 0, 0)
 	pid = int(r0)
 	if e1 != 0 {
 		err = errnoErr(e1)
@@ -1449,26 +1939,38 @@
 	return
 }
 
+var libc_setsid_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_setsid setsid "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Settimeofday(tp *Timeval) (err error) {
-	_, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0)
+	_, _, e1 := syscall_rawSyscall(libc_settimeofday_trampoline_addr, uintptr(unsafe.Pointer(tp)), 0, 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_settimeofday_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_settimeofday settimeofday "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Setuid(uid int) (err error) {
-	_, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0)
+	_, _, e1 := syscall_rawSyscall(libc_setuid_trampoline_addr, uintptr(uid), 0, 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_setuid_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_setuid setuid "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Stat(path string, stat *Stat_t) (err error) {
@@ -1477,13 +1979,17 @@
 	if err != nil {
 		return
 	}
-	_, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0)
+	_, _, e1 := syscall_syscall(libc_stat_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_stat_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_stat stat "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Statfs(path string, stat *Statfs_t) (err error) {
@@ -1492,13 +1998,17 @@
 	if err != nil {
 		return
 	}
-	_, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0)
+	_, _, e1 := syscall_syscall(libc_statfs_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_statfs_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_statfs statfs "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Symlink(path string, link string) (err error) {
@@ -1512,13 +2022,17 @@
 	if err != nil {
 		return
 	}
-	_, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)
+	_, _, e1 := syscall_syscall(libc_symlink_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_symlink_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_symlink symlink "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) {
@@ -1532,23 +2046,31 @@
 	if err != nil {
 		return
 	}
-	_, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)))
+	_, _, e1 := syscall_syscall(libc_symlinkat_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)))
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_symlinkat_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_symlinkat symlinkat "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Sync() (err error) {
-	_, _, e1 := Syscall(SYS_SYNC, 0, 0, 0)
+	_, _, e1 := syscall_syscall(libc_sync_trampoline_addr, 0, 0, 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_sync_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_sync sync "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Truncate(path string, length int64) (err error) {
@@ -1557,21 +2079,29 @@
 	if err != nil {
 		return
 	}
-	_, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length))
+	_, _, e1 := syscall_syscall(libc_truncate_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_truncate_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_truncate truncate "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Umask(newmask int) (oldmask int) {
-	r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0)
+	r0, _, _ := syscall_syscall(libc_umask_trampoline_addr, uintptr(newmask), 0, 0)
 	oldmask = int(r0)
 	return
 }
 
+var libc_umask_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_umask umask "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Unlink(path string) (err error) {
@@ -1580,13 +2110,17 @@
 	if err != nil {
 		return
 	}
-	_, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0)
+	_, _, e1 := syscall_syscall(libc_unlink_trampoline_addr, uintptr(unsafe.Pointer(_p0)), 0, 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_unlink_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_unlink unlink "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Unlinkat(dirfd int, path string, flags int) (err error) {
@@ -1595,13 +2129,17 @@
 	if err != nil {
 		return
 	}
-	_, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags))
+	_, _, e1 := syscall_syscall(libc_unlinkat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags))
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_unlinkat_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_unlinkat unlinkat "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func Unmount(path string, flags int) (err error) {
@@ -1610,13 +2148,17 @@
 	if err != nil {
 		return
 	}
-	_, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0)
+	_, _, e1 := syscall_syscall(libc_unmount_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_unmount_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_unmount unmount "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func write(fd int, p []byte) (n int, err error) {
@@ -1626,7 +2168,7 @@
 	} else {
 		_p0 = unsafe.Pointer(&_zero)
 	}
-	r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)))
+	r0, _, e1 := syscall_syscall(libc_write_trampoline_addr, uintptr(fd), uintptr(_p0), uintptr(len(p)))
 	n = int(r0)
 	if e1 != 0 {
 		err = errnoErr(e1)
@@ -1634,10 +2176,14 @@
 	return
 }
 
+var libc_write_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_write write "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) {
-	r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), 0, uintptr(pos), 0, 0)
+	r0, _, e1 := syscall_syscall6(libc_mmap_trampoline_addr, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), uintptr(pos))
 	ret = uintptr(r0)
 	if e1 != 0 {
 		err = errnoErr(e1)
@@ -1645,20 +2191,28 @@
 	return
 }
 
+var libc_mmap_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_mmap mmap "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func munmap(addr uintptr, length uintptr) (err error) {
-	_, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0)
+	_, _, e1 := syscall_syscall(libc_munmap_trampoline_addr, uintptr(addr), uintptr(length), 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
 
+var libc_munmap_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_munmap munmap "libc.so"
+
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func readlen(fd int, buf *byte, nbuf int) (n int, err error) {
-	r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf))
+	r0, _, e1 := syscall_syscall(libc_read_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf))
 	n = int(r0)
 	if e1 != 0 {
 		err = errnoErr(e1)
@@ -1669,7 +2223,7 @@
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 func writelen(fd int, buf *byte, nbuf int) (n int, err error) {
-	r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf))
+	r0, _, e1 := syscall_syscall(libc_write_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf))
 	n = int(r0)
 	if e1 != 0 {
 		err = errnoErr(e1)
@@ -1685,9 +2239,13 @@
 	if err != nil {
 		return
 	}
-	_, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0)
+	_, _, e1 := syscall_syscall6(libc_utimensat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
 	return
 }
+
+var libc_utimensat_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_utimensat utimensat "libc.so"
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.s b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.s
new file mode 100644
index 0000000..b4e7bce
--- /dev/null
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.s
@@ -0,0 +1,674 @@
+// go run mkasm.go openbsd mips64
+// Code generated by the command above; DO NOT EDIT.
+
+#include "textflag.h"
+
+TEXT libc_getgroups_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_getgroups(SB)
+GLOBL	·libc_getgroups_trampoline_addr(SB), RODATA, $8
+DATA	·libc_getgroups_trampoline_addr(SB)/8, $libc_getgroups_trampoline<>(SB)
+
+TEXT libc_setgroups_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_setgroups(SB)
+GLOBL	·libc_setgroups_trampoline_addr(SB), RODATA, $8
+DATA	·libc_setgroups_trampoline_addr(SB)/8, $libc_setgroups_trampoline<>(SB)
+
+TEXT libc_wait4_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_wait4(SB)
+GLOBL	·libc_wait4_trampoline_addr(SB), RODATA, $8
+DATA	·libc_wait4_trampoline_addr(SB)/8, $libc_wait4_trampoline<>(SB)
+
+TEXT libc_accept_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_accept(SB)
+GLOBL	·libc_accept_trampoline_addr(SB), RODATA, $8
+DATA	·libc_accept_trampoline_addr(SB)/8, $libc_accept_trampoline<>(SB)
+
+TEXT libc_bind_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_bind(SB)
+GLOBL	·libc_bind_trampoline_addr(SB), RODATA, $8
+DATA	·libc_bind_trampoline_addr(SB)/8, $libc_bind_trampoline<>(SB)
+
+TEXT libc_connect_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_connect(SB)
+GLOBL	·libc_connect_trampoline_addr(SB), RODATA, $8
+DATA	·libc_connect_trampoline_addr(SB)/8, $libc_connect_trampoline<>(SB)
+
+TEXT libc_socket_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_socket(SB)
+GLOBL	·libc_socket_trampoline_addr(SB), RODATA, $8
+DATA	·libc_socket_trampoline_addr(SB)/8, $libc_socket_trampoline<>(SB)
+
+TEXT libc_getsockopt_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_getsockopt(SB)
+GLOBL	·libc_getsockopt_trampoline_addr(SB), RODATA, $8
+DATA	·libc_getsockopt_trampoline_addr(SB)/8, $libc_getsockopt_trampoline<>(SB)
+
+TEXT libc_setsockopt_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_setsockopt(SB)
+GLOBL	·libc_setsockopt_trampoline_addr(SB), RODATA, $8
+DATA	·libc_setsockopt_trampoline_addr(SB)/8, $libc_setsockopt_trampoline<>(SB)
+
+TEXT libc_getpeername_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_getpeername(SB)
+GLOBL	·libc_getpeername_trampoline_addr(SB), RODATA, $8
+DATA	·libc_getpeername_trampoline_addr(SB)/8, $libc_getpeername_trampoline<>(SB)
+
+TEXT libc_getsockname_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_getsockname(SB)
+GLOBL	·libc_getsockname_trampoline_addr(SB), RODATA, $8
+DATA	·libc_getsockname_trampoline_addr(SB)/8, $libc_getsockname_trampoline<>(SB)
+
+TEXT libc_shutdown_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_shutdown(SB)
+GLOBL	·libc_shutdown_trampoline_addr(SB), RODATA, $8
+DATA	·libc_shutdown_trampoline_addr(SB)/8, $libc_shutdown_trampoline<>(SB)
+
+TEXT libc_socketpair_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_socketpair(SB)
+GLOBL	·libc_socketpair_trampoline_addr(SB), RODATA, $8
+DATA	·libc_socketpair_trampoline_addr(SB)/8, $libc_socketpair_trampoline<>(SB)
+
+TEXT libc_recvfrom_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_recvfrom(SB)
+GLOBL	·libc_recvfrom_trampoline_addr(SB), RODATA, $8
+DATA	·libc_recvfrom_trampoline_addr(SB)/8, $libc_recvfrom_trampoline<>(SB)
+
+TEXT libc_sendto_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_sendto(SB)
+GLOBL	·libc_sendto_trampoline_addr(SB), RODATA, $8
+DATA	·libc_sendto_trampoline_addr(SB)/8, $libc_sendto_trampoline<>(SB)
+
+TEXT libc_recvmsg_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_recvmsg(SB)
+GLOBL	·libc_recvmsg_trampoline_addr(SB), RODATA, $8
+DATA	·libc_recvmsg_trampoline_addr(SB)/8, $libc_recvmsg_trampoline<>(SB)
+
+TEXT libc_sendmsg_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_sendmsg(SB)
+GLOBL	·libc_sendmsg_trampoline_addr(SB), RODATA, $8
+DATA	·libc_sendmsg_trampoline_addr(SB)/8, $libc_sendmsg_trampoline<>(SB)
+
+TEXT libc_kevent_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_kevent(SB)
+GLOBL	·libc_kevent_trampoline_addr(SB), RODATA, $8
+DATA	·libc_kevent_trampoline_addr(SB)/8, $libc_kevent_trampoline<>(SB)
+
+TEXT libc_utimes_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_utimes(SB)
+GLOBL	·libc_utimes_trampoline_addr(SB), RODATA, $8
+DATA	·libc_utimes_trampoline_addr(SB)/8, $libc_utimes_trampoline<>(SB)
+
+TEXT libc_futimes_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_futimes(SB)
+GLOBL	·libc_futimes_trampoline_addr(SB), RODATA, $8
+DATA	·libc_futimes_trampoline_addr(SB)/8, $libc_futimes_trampoline<>(SB)
+
+TEXT libc_poll_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_poll(SB)
+GLOBL	·libc_poll_trampoline_addr(SB), RODATA, $8
+DATA	·libc_poll_trampoline_addr(SB)/8, $libc_poll_trampoline<>(SB)
+
+TEXT libc_madvise_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_madvise(SB)
+GLOBL	·libc_madvise_trampoline_addr(SB), RODATA, $8
+DATA	·libc_madvise_trampoline_addr(SB)/8, $libc_madvise_trampoline<>(SB)
+
+TEXT libc_mlock_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_mlock(SB)
+GLOBL	·libc_mlock_trampoline_addr(SB), RODATA, $8
+DATA	·libc_mlock_trampoline_addr(SB)/8, $libc_mlock_trampoline<>(SB)
+
+TEXT libc_mlockall_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_mlockall(SB)
+GLOBL	·libc_mlockall_trampoline_addr(SB), RODATA, $8
+DATA	·libc_mlockall_trampoline_addr(SB)/8, $libc_mlockall_trampoline<>(SB)
+
+TEXT libc_mprotect_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_mprotect(SB)
+GLOBL	·libc_mprotect_trampoline_addr(SB), RODATA, $8
+DATA	·libc_mprotect_trampoline_addr(SB)/8, $libc_mprotect_trampoline<>(SB)
+
+TEXT libc_msync_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_msync(SB)
+GLOBL	·libc_msync_trampoline_addr(SB), RODATA, $8
+DATA	·libc_msync_trampoline_addr(SB)/8, $libc_msync_trampoline<>(SB)
+
+TEXT libc_munlock_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_munlock(SB)
+GLOBL	·libc_munlock_trampoline_addr(SB), RODATA, $8
+DATA	·libc_munlock_trampoline_addr(SB)/8, $libc_munlock_trampoline<>(SB)
+
+TEXT libc_munlockall_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_munlockall(SB)
+GLOBL	·libc_munlockall_trampoline_addr(SB), RODATA, $8
+DATA	·libc_munlockall_trampoline_addr(SB)/8, $libc_munlockall_trampoline<>(SB)
+
+TEXT libc_pipe2_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_pipe2(SB)
+GLOBL	·libc_pipe2_trampoline_addr(SB), RODATA, $8
+DATA	·libc_pipe2_trampoline_addr(SB)/8, $libc_pipe2_trampoline<>(SB)
+
+TEXT libc_getdents_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_getdents(SB)
+GLOBL	·libc_getdents_trampoline_addr(SB), RODATA, $8
+DATA	·libc_getdents_trampoline_addr(SB)/8, $libc_getdents_trampoline<>(SB)
+
+TEXT libc_getcwd_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_getcwd(SB)
+GLOBL	·libc_getcwd_trampoline_addr(SB), RODATA, $8
+DATA	·libc_getcwd_trampoline_addr(SB)/8, $libc_getcwd_trampoline<>(SB)
+
+TEXT libc_getresuid_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_getresuid(SB)
+GLOBL	·libc_getresuid_trampoline_addr(SB), RODATA, $8
+DATA	·libc_getresuid_trampoline_addr(SB)/8, $libc_getresuid_trampoline<>(SB)
+
+TEXT libc_getresgid_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_getresgid(SB)
+GLOBL	·libc_getresgid_trampoline_addr(SB), RODATA, $8
+DATA	·libc_getresgid_trampoline_addr(SB)/8, $libc_getresgid_trampoline<>(SB)
+
+TEXT libc_ioctl_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_ioctl(SB)
+GLOBL	·libc_ioctl_trampoline_addr(SB), RODATA, $8
+DATA	·libc_ioctl_trampoline_addr(SB)/8, $libc_ioctl_trampoline<>(SB)
+
+TEXT libc_sysctl_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_sysctl(SB)
+GLOBL	·libc_sysctl_trampoline_addr(SB), RODATA, $8
+DATA	·libc_sysctl_trampoline_addr(SB)/8, $libc_sysctl_trampoline<>(SB)
+
+TEXT libc_ppoll_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_ppoll(SB)
+GLOBL	·libc_ppoll_trampoline_addr(SB), RODATA, $8
+DATA	·libc_ppoll_trampoline_addr(SB)/8, $libc_ppoll_trampoline<>(SB)
+
+TEXT libc_access_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_access(SB)
+GLOBL	·libc_access_trampoline_addr(SB), RODATA, $8
+DATA	·libc_access_trampoline_addr(SB)/8, $libc_access_trampoline<>(SB)
+
+TEXT libc_adjtime_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_adjtime(SB)
+GLOBL	·libc_adjtime_trampoline_addr(SB), RODATA, $8
+DATA	·libc_adjtime_trampoline_addr(SB)/8, $libc_adjtime_trampoline<>(SB)
+
+TEXT libc_chdir_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_chdir(SB)
+GLOBL	·libc_chdir_trampoline_addr(SB), RODATA, $8
+DATA	·libc_chdir_trampoline_addr(SB)/8, $libc_chdir_trampoline<>(SB)
+
+TEXT libc_chflags_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_chflags(SB)
+GLOBL	·libc_chflags_trampoline_addr(SB), RODATA, $8
+DATA	·libc_chflags_trampoline_addr(SB)/8, $libc_chflags_trampoline<>(SB)
+
+TEXT libc_chmod_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_chmod(SB)
+GLOBL	·libc_chmod_trampoline_addr(SB), RODATA, $8
+DATA	·libc_chmod_trampoline_addr(SB)/8, $libc_chmod_trampoline<>(SB)
+
+TEXT libc_chown_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_chown(SB)
+GLOBL	·libc_chown_trampoline_addr(SB), RODATA, $8
+DATA	·libc_chown_trampoline_addr(SB)/8, $libc_chown_trampoline<>(SB)
+
+TEXT libc_chroot_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_chroot(SB)
+GLOBL	·libc_chroot_trampoline_addr(SB), RODATA, $8
+DATA	·libc_chroot_trampoline_addr(SB)/8, $libc_chroot_trampoline<>(SB)
+
+TEXT libc_clock_gettime_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_clock_gettime(SB)
+GLOBL	·libc_clock_gettime_trampoline_addr(SB), RODATA, $8
+DATA	·libc_clock_gettime_trampoline_addr(SB)/8, $libc_clock_gettime_trampoline<>(SB)
+
+TEXT libc_close_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_close(SB)
+GLOBL	·libc_close_trampoline_addr(SB), RODATA, $8
+DATA	·libc_close_trampoline_addr(SB)/8, $libc_close_trampoline<>(SB)
+
+TEXT libc_dup_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_dup(SB)
+GLOBL	·libc_dup_trampoline_addr(SB), RODATA, $8
+DATA	·libc_dup_trampoline_addr(SB)/8, $libc_dup_trampoline<>(SB)
+
+TEXT libc_dup2_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_dup2(SB)
+GLOBL	·libc_dup2_trampoline_addr(SB), RODATA, $8
+DATA	·libc_dup2_trampoline_addr(SB)/8, $libc_dup2_trampoline<>(SB)
+
+TEXT libc_dup3_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_dup3(SB)
+GLOBL	·libc_dup3_trampoline_addr(SB), RODATA, $8
+DATA	·libc_dup3_trampoline_addr(SB)/8, $libc_dup3_trampoline<>(SB)
+
+TEXT libc_exit_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_exit(SB)
+GLOBL	·libc_exit_trampoline_addr(SB), RODATA, $8
+DATA	·libc_exit_trampoline_addr(SB)/8, $libc_exit_trampoline<>(SB)
+
+TEXT libc_faccessat_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_faccessat(SB)
+GLOBL	·libc_faccessat_trampoline_addr(SB), RODATA, $8
+DATA	·libc_faccessat_trampoline_addr(SB)/8, $libc_faccessat_trampoline<>(SB)
+
+TEXT libc_fchdir_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_fchdir(SB)
+GLOBL	·libc_fchdir_trampoline_addr(SB), RODATA, $8
+DATA	·libc_fchdir_trampoline_addr(SB)/8, $libc_fchdir_trampoline<>(SB)
+
+TEXT libc_fchflags_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_fchflags(SB)
+GLOBL	·libc_fchflags_trampoline_addr(SB), RODATA, $8
+DATA	·libc_fchflags_trampoline_addr(SB)/8, $libc_fchflags_trampoline<>(SB)
+
+TEXT libc_fchmod_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_fchmod(SB)
+GLOBL	·libc_fchmod_trampoline_addr(SB), RODATA, $8
+DATA	·libc_fchmod_trampoline_addr(SB)/8, $libc_fchmod_trampoline<>(SB)
+
+TEXT libc_fchmodat_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_fchmodat(SB)
+GLOBL	·libc_fchmodat_trampoline_addr(SB), RODATA, $8
+DATA	·libc_fchmodat_trampoline_addr(SB)/8, $libc_fchmodat_trampoline<>(SB)
+
+TEXT libc_fchown_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_fchown(SB)
+GLOBL	·libc_fchown_trampoline_addr(SB), RODATA, $8
+DATA	·libc_fchown_trampoline_addr(SB)/8, $libc_fchown_trampoline<>(SB)
+
+TEXT libc_fchownat_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_fchownat(SB)
+GLOBL	·libc_fchownat_trampoline_addr(SB), RODATA, $8
+DATA	·libc_fchownat_trampoline_addr(SB)/8, $libc_fchownat_trampoline<>(SB)
+
+TEXT libc_flock_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_flock(SB)
+GLOBL	·libc_flock_trampoline_addr(SB), RODATA, $8
+DATA	·libc_flock_trampoline_addr(SB)/8, $libc_flock_trampoline<>(SB)
+
+TEXT libc_fpathconf_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_fpathconf(SB)
+GLOBL	·libc_fpathconf_trampoline_addr(SB), RODATA, $8
+DATA	·libc_fpathconf_trampoline_addr(SB)/8, $libc_fpathconf_trampoline<>(SB)
+
+TEXT libc_fstat_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_fstat(SB)
+GLOBL	·libc_fstat_trampoline_addr(SB), RODATA, $8
+DATA	·libc_fstat_trampoline_addr(SB)/8, $libc_fstat_trampoline<>(SB)
+
+TEXT libc_fstatat_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_fstatat(SB)
+GLOBL	·libc_fstatat_trampoline_addr(SB), RODATA, $8
+DATA	·libc_fstatat_trampoline_addr(SB)/8, $libc_fstatat_trampoline<>(SB)
+
+TEXT libc_fstatfs_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_fstatfs(SB)
+GLOBL	·libc_fstatfs_trampoline_addr(SB), RODATA, $8
+DATA	·libc_fstatfs_trampoline_addr(SB)/8, $libc_fstatfs_trampoline<>(SB)
+
+TEXT libc_fsync_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_fsync(SB)
+GLOBL	·libc_fsync_trampoline_addr(SB), RODATA, $8
+DATA	·libc_fsync_trampoline_addr(SB)/8, $libc_fsync_trampoline<>(SB)
+
+TEXT libc_ftruncate_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_ftruncate(SB)
+GLOBL	·libc_ftruncate_trampoline_addr(SB), RODATA, $8
+DATA	·libc_ftruncate_trampoline_addr(SB)/8, $libc_ftruncate_trampoline<>(SB)
+
+TEXT libc_getegid_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_getegid(SB)
+GLOBL	·libc_getegid_trampoline_addr(SB), RODATA, $8
+DATA	·libc_getegid_trampoline_addr(SB)/8, $libc_getegid_trampoline<>(SB)
+
+TEXT libc_geteuid_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_geteuid(SB)
+GLOBL	·libc_geteuid_trampoline_addr(SB), RODATA, $8
+DATA	·libc_geteuid_trampoline_addr(SB)/8, $libc_geteuid_trampoline<>(SB)
+
+TEXT libc_getgid_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_getgid(SB)
+GLOBL	·libc_getgid_trampoline_addr(SB), RODATA, $8
+DATA	·libc_getgid_trampoline_addr(SB)/8, $libc_getgid_trampoline<>(SB)
+
+TEXT libc_getpgid_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_getpgid(SB)
+GLOBL	·libc_getpgid_trampoline_addr(SB), RODATA, $8
+DATA	·libc_getpgid_trampoline_addr(SB)/8, $libc_getpgid_trampoline<>(SB)
+
+TEXT libc_getpgrp_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_getpgrp(SB)
+GLOBL	·libc_getpgrp_trampoline_addr(SB), RODATA, $8
+DATA	·libc_getpgrp_trampoline_addr(SB)/8, $libc_getpgrp_trampoline<>(SB)
+
+TEXT libc_getpid_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_getpid(SB)
+GLOBL	·libc_getpid_trampoline_addr(SB), RODATA, $8
+DATA	·libc_getpid_trampoline_addr(SB)/8, $libc_getpid_trampoline<>(SB)
+
+TEXT libc_getppid_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_getppid(SB)
+GLOBL	·libc_getppid_trampoline_addr(SB), RODATA, $8
+DATA	·libc_getppid_trampoline_addr(SB)/8, $libc_getppid_trampoline<>(SB)
+
+TEXT libc_getpriority_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_getpriority(SB)
+GLOBL	·libc_getpriority_trampoline_addr(SB), RODATA, $8
+DATA	·libc_getpriority_trampoline_addr(SB)/8, $libc_getpriority_trampoline<>(SB)
+
+TEXT libc_getrlimit_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_getrlimit(SB)
+GLOBL	·libc_getrlimit_trampoline_addr(SB), RODATA, $8
+DATA	·libc_getrlimit_trampoline_addr(SB)/8, $libc_getrlimit_trampoline<>(SB)
+
+TEXT libc_getrtable_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_getrtable(SB)
+GLOBL	·libc_getrtable_trampoline_addr(SB), RODATA, $8
+DATA	·libc_getrtable_trampoline_addr(SB)/8, $libc_getrtable_trampoline<>(SB)
+
+TEXT libc_getrusage_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_getrusage(SB)
+GLOBL	·libc_getrusage_trampoline_addr(SB), RODATA, $8
+DATA	·libc_getrusage_trampoline_addr(SB)/8, $libc_getrusage_trampoline<>(SB)
+
+TEXT libc_getsid_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_getsid(SB)
+GLOBL	·libc_getsid_trampoline_addr(SB), RODATA, $8
+DATA	·libc_getsid_trampoline_addr(SB)/8, $libc_getsid_trampoline<>(SB)
+
+TEXT libc_gettimeofday_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_gettimeofday(SB)
+GLOBL	·libc_gettimeofday_trampoline_addr(SB), RODATA, $8
+DATA	·libc_gettimeofday_trampoline_addr(SB)/8, $libc_gettimeofday_trampoline<>(SB)
+
+TEXT libc_getuid_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_getuid(SB)
+GLOBL	·libc_getuid_trampoline_addr(SB), RODATA, $8
+DATA	·libc_getuid_trampoline_addr(SB)/8, $libc_getuid_trampoline<>(SB)
+
+TEXT libc_issetugid_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_issetugid(SB)
+GLOBL	·libc_issetugid_trampoline_addr(SB), RODATA, $8
+DATA	·libc_issetugid_trampoline_addr(SB)/8, $libc_issetugid_trampoline<>(SB)
+
+TEXT libc_kill_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_kill(SB)
+GLOBL	·libc_kill_trampoline_addr(SB), RODATA, $8
+DATA	·libc_kill_trampoline_addr(SB)/8, $libc_kill_trampoline<>(SB)
+
+TEXT libc_kqueue_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_kqueue(SB)
+GLOBL	·libc_kqueue_trampoline_addr(SB), RODATA, $8
+DATA	·libc_kqueue_trampoline_addr(SB)/8, $libc_kqueue_trampoline<>(SB)
+
+TEXT libc_lchown_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_lchown(SB)
+GLOBL	·libc_lchown_trampoline_addr(SB), RODATA, $8
+DATA	·libc_lchown_trampoline_addr(SB)/8, $libc_lchown_trampoline<>(SB)
+
+TEXT libc_link_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_link(SB)
+GLOBL	·libc_link_trampoline_addr(SB), RODATA, $8
+DATA	·libc_link_trampoline_addr(SB)/8, $libc_link_trampoline<>(SB)
+
+TEXT libc_linkat_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_linkat(SB)
+GLOBL	·libc_linkat_trampoline_addr(SB), RODATA, $8
+DATA	·libc_linkat_trampoline_addr(SB)/8, $libc_linkat_trampoline<>(SB)
+
+TEXT libc_listen_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_listen(SB)
+GLOBL	·libc_listen_trampoline_addr(SB), RODATA, $8
+DATA	·libc_listen_trampoline_addr(SB)/8, $libc_listen_trampoline<>(SB)
+
+TEXT libc_lstat_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_lstat(SB)
+GLOBL	·libc_lstat_trampoline_addr(SB), RODATA, $8
+DATA	·libc_lstat_trampoline_addr(SB)/8, $libc_lstat_trampoline<>(SB)
+
+TEXT libc_mkdir_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_mkdir(SB)
+GLOBL	·libc_mkdir_trampoline_addr(SB), RODATA, $8
+DATA	·libc_mkdir_trampoline_addr(SB)/8, $libc_mkdir_trampoline<>(SB)
+
+TEXT libc_mkdirat_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_mkdirat(SB)
+GLOBL	·libc_mkdirat_trampoline_addr(SB), RODATA, $8
+DATA	·libc_mkdirat_trampoline_addr(SB)/8, $libc_mkdirat_trampoline<>(SB)
+
+TEXT libc_mkfifo_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_mkfifo(SB)
+GLOBL	·libc_mkfifo_trampoline_addr(SB), RODATA, $8
+DATA	·libc_mkfifo_trampoline_addr(SB)/8, $libc_mkfifo_trampoline<>(SB)
+
+TEXT libc_mkfifoat_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_mkfifoat(SB)
+GLOBL	·libc_mkfifoat_trampoline_addr(SB), RODATA, $8
+DATA	·libc_mkfifoat_trampoline_addr(SB)/8, $libc_mkfifoat_trampoline<>(SB)
+
+TEXT libc_mknod_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_mknod(SB)
+GLOBL	·libc_mknod_trampoline_addr(SB), RODATA, $8
+DATA	·libc_mknod_trampoline_addr(SB)/8, $libc_mknod_trampoline<>(SB)
+
+TEXT libc_mknodat_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_mknodat(SB)
+GLOBL	·libc_mknodat_trampoline_addr(SB), RODATA, $8
+DATA	·libc_mknodat_trampoline_addr(SB)/8, $libc_mknodat_trampoline<>(SB)
+
+TEXT libc_nanosleep_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_nanosleep(SB)
+GLOBL	·libc_nanosleep_trampoline_addr(SB), RODATA, $8
+DATA	·libc_nanosleep_trampoline_addr(SB)/8, $libc_nanosleep_trampoline<>(SB)
+
+TEXT libc_open_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_open(SB)
+GLOBL	·libc_open_trampoline_addr(SB), RODATA, $8
+DATA	·libc_open_trampoline_addr(SB)/8, $libc_open_trampoline<>(SB)
+
+TEXT libc_openat_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_openat(SB)
+GLOBL	·libc_openat_trampoline_addr(SB), RODATA, $8
+DATA	·libc_openat_trampoline_addr(SB)/8, $libc_openat_trampoline<>(SB)
+
+TEXT libc_pathconf_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_pathconf(SB)
+GLOBL	·libc_pathconf_trampoline_addr(SB), RODATA, $8
+DATA	·libc_pathconf_trampoline_addr(SB)/8, $libc_pathconf_trampoline<>(SB)
+
+TEXT libc_pread_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_pread(SB)
+GLOBL	·libc_pread_trampoline_addr(SB), RODATA, $8
+DATA	·libc_pread_trampoline_addr(SB)/8, $libc_pread_trampoline<>(SB)
+
+TEXT libc_pwrite_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_pwrite(SB)
+GLOBL	·libc_pwrite_trampoline_addr(SB), RODATA, $8
+DATA	·libc_pwrite_trampoline_addr(SB)/8, $libc_pwrite_trampoline<>(SB)
+
+TEXT libc_read_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_read(SB)
+GLOBL	·libc_read_trampoline_addr(SB), RODATA, $8
+DATA	·libc_read_trampoline_addr(SB)/8, $libc_read_trampoline<>(SB)
+
+TEXT libc_readlink_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_readlink(SB)
+GLOBL	·libc_readlink_trampoline_addr(SB), RODATA, $8
+DATA	·libc_readlink_trampoline_addr(SB)/8, $libc_readlink_trampoline<>(SB)
+
+TEXT libc_readlinkat_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_readlinkat(SB)
+GLOBL	·libc_readlinkat_trampoline_addr(SB), RODATA, $8
+DATA	·libc_readlinkat_trampoline_addr(SB)/8, $libc_readlinkat_trampoline<>(SB)
+
+TEXT libc_rename_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_rename(SB)
+GLOBL	·libc_rename_trampoline_addr(SB), RODATA, $8
+DATA	·libc_rename_trampoline_addr(SB)/8, $libc_rename_trampoline<>(SB)
+
+TEXT libc_renameat_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_renameat(SB)
+GLOBL	·libc_renameat_trampoline_addr(SB), RODATA, $8
+DATA	·libc_renameat_trampoline_addr(SB)/8, $libc_renameat_trampoline<>(SB)
+
+TEXT libc_revoke_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_revoke(SB)
+GLOBL	·libc_revoke_trampoline_addr(SB), RODATA, $8
+DATA	·libc_revoke_trampoline_addr(SB)/8, $libc_revoke_trampoline<>(SB)
+
+TEXT libc_rmdir_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_rmdir(SB)
+GLOBL	·libc_rmdir_trampoline_addr(SB), RODATA, $8
+DATA	·libc_rmdir_trampoline_addr(SB)/8, $libc_rmdir_trampoline<>(SB)
+
+TEXT libc_lseek_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_lseek(SB)
+GLOBL	·libc_lseek_trampoline_addr(SB), RODATA, $8
+DATA	·libc_lseek_trampoline_addr(SB)/8, $libc_lseek_trampoline<>(SB)
+
+TEXT libc_select_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_select(SB)
+GLOBL	·libc_select_trampoline_addr(SB), RODATA, $8
+DATA	·libc_select_trampoline_addr(SB)/8, $libc_select_trampoline<>(SB)
+
+TEXT libc_setegid_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_setegid(SB)
+GLOBL	·libc_setegid_trampoline_addr(SB), RODATA, $8
+DATA	·libc_setegid_trampoline_addr(SB)/8, $libc_setegid_trampoline<>(SB)
+
+TEXT libc_seteuid_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_seteuid(SB)
+GLOBL	·libc_seteuid_trampoline_addr(SB), RODATA, $8
+DATA	·libc_seteuid_trampoline_addr(SB)/8, $libc_seteuid_trampoline<>(SB)
+
+TEXT libc_setgid_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_setgid(SB)
+GLOBL	·libc_setgid_trampoline_addr(SB), RODATA, $8
+DATA	·libc_setgid_trampoline_addr(SB)/8, $libc_setgid_trampoline<>(SB)
+
+TEXT libc_setlogin_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_setlogin(SB)
+GLOBL	·libc_setlogin_trampoline_addr(SB), RODATA, $8
+DATA	·libc_setlogin_trampoline_addr(SB)/8, $libc_setlogin_trampoline<>(SB)
+
+TEXT libc_setpgid_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_setpgid(SB)
+GLOBL	·libc_setpgid_trampoline_addr(SB), RODATA, $8
+DATA	·libc_setpgid_trampoline_addr(SB)/8, $libc_setpgid_trampoline<>(SB)
+
+TEXT libc_setpriority_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_setpriority(SB)
+GLOBL	·libc_setpriority_trampoline_addr(SB), RODATA, $8
+DATA	·libc_setpriority_trampoline_addr(SB)/8, $libc_setpriority_trampoline<>(SB)
+
+TEXT libc_setregid_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_setregid(SB)
+GLOBL	·libc_setregid_trampoline_addr(SB), RODATA, $8
+DATA	·libc_setregid_trampoline_addr(SB)/8, $libc_setregid_trampoline<>(SB)
+
+TEXT libc_setreuid_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_setreuid(SB)
+GLOBL	·libc_setreuid_trampoline_addr(SB), RODATA, $8
+DATA	·libc_setreuid_trampoline_addr(SB)/8, $libc_setreuid_trampoline<>(SB)
+
+TEXT libc_setresgid_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_setresgid(SB)
+GLOBL	·libc_setresgid_trampoline_addr(SB), RODATA, $8
+DATA	·libc_setresgid_trampoline_addr(SB)/8, $libc_setresgid_trampoline<>(SB)
+
+TEXT libc_setresuid_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_setresuid(SB)
+GLOBL	·libc_setresuid_trampoline_addr(SB), RODATA, $8
+DATA	·libc_setresuid_trampoline_addr(SB)/8, $libc_setresuid_trampoline<>(SB)
+
+TEXT libc_setrtable_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_setrtable(SB)
+GLOBL	·libc_setrtable_trampoline_addr(SB), RODATA, $8
+DATA	·libc_setrtable_trampoline_addr(SB)/8, $libc_setrtable_trampoline<>(SB)
+
+TEXT libc_setsid_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_setsid(SB)
+GLOBL	·libc_setsid_trampoline_addr(SB), RODATA, $8
+DATA	·libc_setsid_trampoline_addr(SB)/8, $libc_setsid_trampoline<>(SB)
+
+TEXT libc_settimeofday_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_settimeofday(SB)
+GLOBL	·libc_settimeofday_trampoline_addr(SB), RODATA, $8
+DATA	·libc_settimeofday_trampoline_addr(SB)/8, $libc_settimeofday_trampoline<>(SB)
+
+TEXT libc_setuid_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_setuid(SB)
+GLOBL	·libc_setuid_trampoline_addr(SB), RODATA, $8
+DATA	·libc_setuid_trampoline_addr(SB)/8, $libc_setuid_trampoline<>(SB)
+
+TEXT libc_stat_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_stat(SB)
+GLOBL	·libc_stat_trampoline_addr(SB), RODATA, $8
+DATA	·libc_stat_trampoline_addr(SB)/8, $libc_stat_trampoline<>(SB)
+
+TEXT libc_statfs_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_statfs(SB)
+GLOBL	·libc_statfs_trampoline_addr(SB), RODATA, $8
+DATA	·libc_statfs_trampoline_addr(SB)/8, $libc_statfs_trampoline<>(SB)
+
+TEXT libc_symlink_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_symlink(SB)
+GLOBL	·libc_symlink_trampoline_addr(SB), RODATA, $8
+DATA	·libc_symlink_trampoline_addr(SB)/8, $libc_symlink_trampoline<>(SB)
+
+TEXT libc_symlinkat_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_symlinkat(SB)
+GLOBL	·libc_symlinkat_trampoline_addr(SB), RODATA, $8
+DATA	·libc_symlinkat_trampoline_addr(SB)/8, $libc_symlinkat_trampoline<>(SB)
+
+TEXT libc_sync_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_sync(SB)
+GLOBL	·libc_sync_trampoline_addr(SB), RODATA, $8
+DATA	·libc_sync_trampoline_addr(SB)/8, $libc_sync_trampoline<>(SB)
+
+TEXT libc_truncate_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_truncate(SB)
+GLOBL	·libc_truncate_trampoline_addr(SB), RODATA, $8
+DATA	·libc_truncate_trampoline_addr(SB)/8, $libc_truncate_trampoline<>(SB)
+
+TEXT libc_umask_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_umask(SB)
+GLOBL	·libc_umask_trampoline_addr(SB), RODATA, $8
+DATA	·libc_umask_trampoline_addr(SB)/8, $libc_umask_trampoline<>(SB)
+
+TEXT libc_unlink_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_unlink(SB)
+GLOBL	·libc_unlink_trampoline_addr(SB), RODATA, $8
+DATA	·libc_unlink_trampoline_addr(SB)/8, $libc_unlink_trampoline<>(SB)
+
+TEXT libc_unlinkat_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_unlinkat(SB)
+GLOBL	·libc_unlinkat_trampoline_addr(SB), RODATA, $8
+DATA	·libc_unlinkat_trampoline_addr(SB)/8, $libc_unlinkat_trampoline<>(SB)
+
+TEXT libc_unmount_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_unmount(SB)
+GLOBL	·libc_unmount_trampoline_addr(SB), RODATA, $8
+DATA	·libc_unmount_trampoline_addr(SB)/8, $libc_unmount_trampoline<>(SB)
+
+TEXT libc_write_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_write(SB)
+GLOBL	·libc_write_trampoline_addr(SB), RODATA, $8
+DATA	·libc_write_trampoline_addr(SB)/8, $libc_write_trampoline<>(SB)
+
+TEXT libc_mmap_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_mmap(SB)
+GLOBL	·libc_mmap_trampoline_addr(SB), RODATA, $8
+DATA	·libc_mmap_trampoline_addr(SB)/8, $libc_mmap_trampoline<>(SB)
+
+TEXT libc_munmap_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_munmap(SB)
+GLOBL	·libc_munmap_trampoline_addr(SB), RODATA, $8
+DATA	·libc_munmap_trampoline_addr(SB)/8, $libc_munmap_trampoline<>(SB)
+
+TEXT libc_utimensat_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_utimensat(SB)
+GLOBL	·libc_utimensat_trampoline_addr(SB), RODATA, $8
+DATA	·libc_utimensat_trampoline_addr(SB)/8, $libc_utimensat_trampoline<>(SB)
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.go
index c85de2d..fb99594 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.go
@@ -519,6 +519,28 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func getresuid(ruid *_C_int, euid *_C_int, suid *_C_int) {
+	syscall_rawSyscall(libc_getresuid_trampoline_addr, uintptr(unsafe.Pointer(ruid)), uintptr(unsafe.Pointer(euid)), uintptr(unsafe.Pointer(suid)))
+	return
+}
+
+var libc_getresuid_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_getresuid getresuid "libc.so"
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func getresgid(rgid *_C_int, egid *_C_int, sgid *_C_int) {
+	syscall_rawSyscall(libc_getresgid_trampoline_addr, uintptr(unsafe.Pointer(rgid)), uintptr(unsafe.Pointer(egid)), uintptr(unsafe.Pointer(sgid)))
+	return
+}
+
+var libc_getresgid_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_getresgid getresgid "libc.so"
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func ioctl(fd int, req uint, arg uintptr) (err error) {
 	_, _, e1 := syscall_syscall(libc_ioctl_trampoline_addr, uintptr(fd), uintptr(req), uintptr(arg))
 	if e1 != 0 {
@@ -527,6 +549,14 @@
 	return
 }
 
+func ioctlPtr(fd int, req uint, arg unsafe.Pointer) (err error) {
+	_, _, e1 := syscall_syscall(libc_ioctl_trampoline_addr, uintptr(fd), uintptr(req), uintptr(arg))
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
 var libc_ioctl_trampoline_addr uintptr
 
 //go:cgo_import_dynamic libc_ioctl ioctl "libc.so"
@@ -696,6 +726,20 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func ClockGettime(clockid int32, time *Timespec) (err error) {
+	_, _, e1 := syscall_syscall(libc_clock_gettime_trampoline_addr, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+var libc_clock_gettime_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_clock_gettime clock_gettime "libc.so"
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func Close(fd int) (err error) {
 	_, _, e1 := syscall_syscall(libc_close_trampoline_addr, uintptr(fd), 0, 0)
 	if e1 != 0 {
@@ -1872,20 +1916,6 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Setrlimit(which int, lim *Rlimit) (err error) {
-	_, _, e1 := syscall_rawSyscall(libc_setrlimit_trampoline_addr, uintptr(which), uintptr(unsafe.Pointer(lim)), 0)
-	if e1 != 0 {
-		err = errnoErr(e1)
-	}
-	return
-}
-
-var libc_setrlimit_trampoline_addr uintptr
-
-//go:cgo_import_dynamic libc_setrlimit setrlimit "libc.so"
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func Setrtable(rtable int) (err error) {
 	_, _, e1 := syscall_rawSyscall(libc_setrtable_trampoline_addr, uintptr(rtable), 0, 0)
 	if e1 != 0 {
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.s b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.s
index 7c9223b..ca3f766 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.s
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.s
@@ -189,6 +189,18 @@
 GLOBL	·libc_getcwd_trampoline_addr(SB), RODATA, $8
 DATA	·libc_getcwd_trampoline_addr(SB)/8, $libc_getcwd_trampoline<>(SB)
 
+TEXT libc_getresuid_trampoline<>(SB),NOSPLIT,$0-0
+	CALL	libc_getresuid(SB)
+	RET
+GLOBL	·libc_getresuid_trampoline_addr(SB), RODATA, $8
+DATA	·libc_getresuid_trampoline_addr(SB)/8, $libc_getresuid_trampoline<>(SB)
+
+TEXT libc_getresgid_trampoline<>(SB),NOSPLIT,$0-0
+	CALL	libc_getresgid(SB)
+	RET
+GLOBL	·libc_getresgid_trampoline_addr(SB), RODATA, $8
+DATA	·libc_getresgid_trampoline_addr(SB)/8, $libc_getresgid_trampoline<>(SB)
+
 TEXT libc_ioctl_trampoline<>(SB),NOSPLIT,$0-0
 	CALL	libc_ioctl(SB)
 	RET
@@ -249,6 +261,12 @@
 GLOBL	·libc_chroot_trampoline_addr(SB), RODATA, $8
 DATA	·libc_chroot_trampoline_addr(SB)/8, $libc_chroot_trampoline<>(SB)
 
+TEXT libc_clock_gettime_trampoline<>(SB),NOSPLIT,$0-0
+	CALL	libc_clock_gettime(SB)
+	RET
+GLOBL	·libc_clock_gettime_trampoline_addr(SB), RODATA, $8
+DATA	·libc_clock_gettime_trampoline_addr(SB)/8, $libc_clock_gettime_trampoline<>(SB)
+
 TEXT libc_close_trampoline<>(SB),NOSPLIT,$0-0
 	CALL	libc_close(SB)
 	RET
@@ -681,12 +699,6 @@
 GLOBL	·libc_setresuid_trampoline_addr(SB), RODATA, $8
 DATA	·libc_setresuid_trampoline_addr(SB)/8, $libc_setresuid_trampoline<>(SB)
 
-TEXT libc_setrlimit_trampoline<>(SB),NOSPLIT,$0-0
-	CALL	libc_setrlimit(SB)
-	RET
-GLOBL	·libc_setrlimit_trampoline_addr(SB), RODATA, $8
-DATA	·libc_setrlimit_trampoline_addr(SB)/8, $libc_setrlimit_trampoline<>(SB)
-
 TEXT libc_setrtable_trampoline<>(SB),NOSPLIT,$0-0
 	CALL	libc_setrtable(SB)
 	RET
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.go
index 8e3e787..32cbbbc 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.go
@@ -519,6 +519,28 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func getresuid(ruid *_C_int, euid *_C_int, suid *_C_int) {
+	syscall_rawSyscall(libc_getresuid_trampoline_addr, uintptr(unsafe.Pointer(ruid)), uintptr(unsafe.Pointer(euid)), uintptr(unsafe.Pointer(suid)))
+	return
+}
+
+var libc_getresuid_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_getresuid getresuid "libc.so"
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func getresgid(rgid *_C_int, egid *_C_int, sgid *_C_int) {
+	syscall_rawSyscall(libc_getresgid_trampoline_addr, uintptr(unsafe.Pointer(rgid)), uintptr(unsafe.Pointer(egid)), uintptr(unsafe.Pointer(sgid)))
+	return
+}
+
+var libc_getresgid_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_getresgid getresgid "libc.so"
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func ioctl(fd int, req uint, arg uintptr) (err error) {
 	_, _, e1 := syscall_syscall(libc_ioctl_trampoline_addr, uintptr(fd), uintptr(req), uintptr(arg))
 	if e1 != 0 {
@@ -527,6 +549,14 @@
 	return
 }
 
+func ioctlPtr(fd int, req uint, arg unsafe.Pointer) (err error) {
+	_, _, e1 := syscall_syscall(libc_ioctl_trampoline_addr, uintptr(fd), uintptr(req), uintptr(arg))
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
 var libc_ioctl_trampoline_addr uintptr
 
 //go:cgo_import_dynamic libc_ioctl ioctl "libc.so"
@@ -696,6 +726,20 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func ClockGettime(clockid int32, time *Timespec) (err error) {
+	_, _, e1 := syscall_syscall(libc_clock_gettime_trampoline_addr, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+var libc_clock_gettime_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_clock_gettime clock_gettime "libc.so"
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func Close(fd int) (err error) {
 	_, _, e1 := syscall_syscall(libc_close_trampoline_addr, uintptr(fd), 0, 0)
 	if e1 != 0 {
@@ -1872,20 +1916,6 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Setrlimit(which int, lim *Rlimit) (err error) {
-	_, _, e1 := syscall_rawSyscall(libc_setrlimit_trampoline_addr, uintptr(which), uintptr(unsafe.Pointer(lim)), 0)
-	if e1 != 0 {
-		err = errnoErr(e1)
-	}
-	return
-}
-
-var libc_setrlimit_trampoline_addr uintptr
-
-//go:cgo_import_dynamic libc_setrlimit setrlimit "libc.so"
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func Setrtable(rtable int) (err error) {
 	_, _, e1 := syscall_rawSyscall(libc_setrtable_trampoline_addr, uintptr(rtable), 0, 0)
 	if e1 != 0 {
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.s b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.s
index 7dba789..477a7d5 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.s
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.s
@@ -5,792 +5,670 @@
 
 TEXT libc_getgroups_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getgroups(SB)
-
 GLOBL	·libc_getgroups_trampoline_addr(SB), RODATA, $8
 DATA	·libc_getgroups_trampoline_addr(SB)/8, $libc_getgroups_trampoline<>(SB)
 
 TEXT libc_setgroups_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setgroups(SB)
-
 GLOBL	·libc_setgroups_trampoline_addr(SB), RODATA, $8
 DATA	·libc_setgroups_trampoline_addr(SB)/8, $libc_setgroups_trampoline<>(SB)
 
 TEXT libc_wait4_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_wait4(SB)
-
 GLOBL	·libc_wait4_trampoline_addr(SB), RODATA, $8
 DATA	·libc_wait4_trampoline_addr(SB)/8, $libc_wait4_trampoline<>(SB)
 
 TEXT libc_accept_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_accept(SB)
-
 GLOBL	·libc_accept_trampoline_addr(SB), RODATA, $8
 DATA	·libc_accept_trampoline_addr(SB)/8, $libc_accept_trampoline<>(SB)
 
 TEXT libc_bind_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_bind(SB)
-
 GLOBL	·libc_bind_trampoline_addr(SB), RODATA, $8
 DATA	·libc_bind_trampoline_addr(SB)/8, $libc_bind_trampoline<>(SB)
 
 TEXT libc_connect_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_connect(SB)
-
 GLOBL	·libc_connect_trampoline_addr(SB), RODATA, $8
 DATA	·libc_connect_trampoline_addr(SB)/8, $libc_connect_trampoline<>(SB)
 
 TEXT libc_socket_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_socket(SB)
-
 GLOBL	·libc_socket_trampoline_addr(SB), RODATA, $8
 DATA	·libc_socket_trampoline_addr(SB)/8, $libc_socket_trampoline<>(SB)
 
 TEXT libc_getsockopt_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getsockopt(SB)
-
 GLOBL	·libc_getsockopt_trampoline_addr(SB), RODATA, $8
 DATA	·libc_getsockopt_trampoline_addr(SB)/8, $libc_getsockopt_trampoline<>(SB)
 
 TEXT libc_setsockopt_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setsockopt(SB)
-
 GLOBL	·libc_setsockopt_trampoline_addr(SB), RODATA, $8
 DATA	·libc_setsockopt_trampoline_addr(SB)/8, $libc_setsockopt_trampoline<>(SB)
 
 TEXT libc_getpeername_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getpeername(SB)
-
 GLOBL	·libc_getpeername_trampoline_addr(SB), RODATA, $8
 DATA	·libc_getpeername_trampoline_addr(SB)/8, $libc_getpeername_trampoline<>(SB)
 
 TEXT libc_getsockname_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getsockname(SB)
-
 GLOBL	·libc_getsockname_trampoline_addr(SB), RODATA, $8
 DATA	·libc_getsockname_trampoline_addr(SB)/8, $libc_getsockname_trampoline<>(SB)
 
 TEXT libc_shutdown_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_shutdown(SB)
-
 GLOBL	·libc_shutdown_trampoline_addr(SB), RODATA, $8
 DATA	·libc_shutdown_trampoline_addr(SB)/8, $libc_shutdown_trampoline<>(SB)
 
 TEXT libc_socketpair_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_socketpair(SB)
-
 GLOBL	·libc_socketpair_trampoline_addr(SB), RODATA, $8
 DATA	·libc_socketpair_trampoline_addr(SB)/8, $libc_socketpair_trampoline<>(SB)
 
 TEXT libc_recvfrom_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_recvfrom(SB)
-
 GLOBL	·libc_recvfrom_trampoline_addr(SB), RODATA, $8
 DATA	·libc_recvfrom_trampoline_addr(SB)/8, $libc_recvfrom_trampoline<>(SB)
 
 TEXT libc_sendto_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_sendto(SB)
-
 GLOBL	·libc_sendto_trampoline_addr(SB), RODATA, $8
 DATA	·libc_sendto_trampoline_addr(SB)/8, $libc_sendto_trampoline<>(SB)
 
 TEXT libc_recvmsg_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_recvmsg(SB)
-
 GLOBL	·libc_recvmsg_trampoline_addr(SB), RODATA, $8
 DATA	·libc_recvmsg_trampoline_addr(SB)/8, $libc_recvmsg_trampoline<>(SB)
 
 TEXT libc_sendmsg_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_sendmsg(SB)
-
 GLOBL	·libc_sendmsg_trampoline_addr(SB), RODATA, $8
 DATA	·libc_sendmsg_trampoline_addr(SB)/8, $libc_sendmsg_trampoline<>(SB)
 
 TEXT libc_kevent_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_kevent(SB)
-
 GLOBL	·libc_kevent_trampoline_addr(SB), RODATA, $8
 DATA	·libc_kevent_trampoline_addr(SB)/8, $libc_kevent_trampoline<>(SB)
 
 TEXT libc_utimes_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_utimes(SB)
-
 GLOBL	·libc_utimes_trampoline_addr(SB), RODATA, $8
 DATA	·libc_utimes_trampoline_addr(SB)/8, $libc_utimes_trampoline<>(SB)
 
 TEXT libc_futimes_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_futimes(SB)
-
 GLOBL	·libc_futimes_trampoline_addr(SB), RODATA, $8
 DATA	·libc_futimes_trampoline_addr(SB)/8, $libc_futimes_trampoline<>(SB)
 
 TEXT libc_poll_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_poll(SB)
-
 GLOBL	·libc_poll_trampoline_addr(SB), RODATA, $8
 DATA	·libc_poll_trampoline_addr(SB)/8, $libc_poll_trampoline<>(SB)
 
 TEXT libc_madvise_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_madvise(SB)
-
 GLOBL	·libc_madvise_trampoline_addr(SB), RODATA, $8
 DATA	·libc_madvise_trampoline_addr(SB)/8, $libc_madvise_trampoline<>(SB)
 
 TEXT libc_mlock_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_mlock(SB)
-
 GLOBL	·libc_mlock_trampoline_addr(SB), RODATA, $8
 DATA	·libc_mlock_trampoline_addr(SB)/8, $libc_mlock_trampoline<>(SB)
 
 TEXT libc_mlockall_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_mlockall(SB)
-
 GLOBL	·libc_mlockall_trampoline_addr(SB), RODATA, $8
 DATA	·libc_mlockall_trampoline_addr(SB)/8, $libc_mlockall_trampoline<>(SB)
 
 TEXT libc_mprotect_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_mprotect(SB)
-
 GLOBL	·libc_mprotect_trampoline_addr(SB), RODATA, $8
 DATA	·libc_mprotect_trampoline_addr(SB)/8, $libc_mprotect_trampoline<>(SB)
 
 TEXT libc_msync_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_msync(SB)
-
 GLOBL	·libc_msync_trampoline_addr(SB), RODATA, $8
 DATA	·libc_msync_trampoline_addr(SB)/8, $libc_msync_trampoline<>(SB)
 
 TEXT libc_munlock_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_munlock(SB)
-
 GLOBL	·libc_munlock_trampoline_addr(SB), RODATA, $8
 DATA	·libc_munlock_trampoline_addr(SB)/8, $libc_munlock_trampoline<>(SB)
 
 TEXT libc_munlockall_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_munlockall(SB)
-
 GLOBL	·libc_munlockall_trampoline_addr(SB), RODATA, $8
 DATA	·libc_munlockall_trampoline_addr(SB)/8, $libc_munlockall_trampoline<>(SB)
 
 TEXT libc_pipe2_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_pipe2(SB)
-
 GLOBL	·libc_pipe2_trampoline_addr(SB), RODATA, $8
 DATA	·libc_pipe2_trampoline_addr(SB)/8, $libc_pipe2_trampoline<>(SB)
 
 TEXT libc_getdents_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getdents(SB)
-
 GLOBL	·libc_getdents_trampoline_addr(SB), RODATA, $8
 DATA	·libc_getdents_trampoline_addr(SB)/8, $libc_getdents_trampoline<>(SB)
 
 TEXT libc_getcwd_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getcwd(SB)
-
 GLOBL	·libc_getcwd_trampoline_addr(SB), RODATA, $8
 DATA	·libc_getcwd_trampoline_addr(SB)/8, $libc_getcwd_trampoline<>(SB)
 
+TEXT libc_getresuid_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_getresuid(SB)
+GLOBL	·libc_getresuid_trampoline_addr(SB), RODATA, $8
+DATA	·libc_getresuid_trampoline_addr(SB)/8, $libc_getresuid_trampoline<>(SB)
+
+TEXT libc_getresgid_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_getresgid(SB)
+GLOBL	·libc_getresgid_trampoline_addr(SB), RODATA, $8
+DATA	·libc_getresgid_trampoline_addr(SB)/8, $libc_getresgid_trampoline<>(SB)
+
 TEXT libc_ioctl_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_ioctl(SB)
-
 GLOBL	·libc_ioctl_trampoline_addr(SB), RODATA, $8
 DATA	·libc_ioctl_trampoline_addr(SB)/8, $libc_ioctl_trampoline<>(SB)
 
 TEXT libc_sysctl_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_sysctl(SB)
-
 GLOBL	·libc_sysctl_trampoline_addr(SB), RODATA, $8
 DATA	·libc_sysctl_trampoline_addr(SB)/8, $libc_sysctl_trampoline<>(SB)
 
 TEXT libc_ppoll_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_ppoll(SB)
-
 GLOBL	·libc_ppoll_trampoline_addr(SB), RODATA, $8
 DATA	·libc_ppoll_trampoline_addr(SB)/8, $libc_ppoll_trampoline<>(SB)
 
 TEXT libc_access_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_access(SB)
-
 GLOBL	·libc_access_trampoline_addr(SB), RODATA, $8
 DATA	·libc_access_trampoline_addr(SB)/8, $libc_access_trampoline<>(SB)
 
 TEXT libc_adjtime_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_adjtime(SB)
-
 GLOBL	·libc_adjtime_trampoline_addr(SB), RODATA, $8
 DATA	·libc_adjtime_trampoline_addr(SB)/8, $libc_adjtime_trampoline<>(SB)
 
 TEXT libc_chdir_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_chdir(SB)
-
 GLOBL	·libc_chdir_trampoline_addr(SB), RODATA, $8
 DATA	·libc_chdir_trampoline_addr(SB)/8, $libc_chdir_trampoline<>(SB)
 
 TEXT libc_chflags_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_chflags(SB)
-
 GLOBL	·libc_chflags_trampoline_addr(SB), RODATA, $8
 DATA	·libc_chflags_trampoline_addr(SB)/8, $libc_chflags_trampoline<>(SB)
 
 TEXT libc_chmod_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_chmod(SB)
-
 GLOBL	·libc_chmod_trampoline_addr(SB), RODATA, $8
 DATA	·libc_chmod_trampoline_addr(SB)/8, $libc_chmod_trampoline<>(SB)
 
 TEXT libc_chown_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_chown(SB)
-
 GLOBL	·libc_chown_trampoline_addr(SB), RODATA, $8
 DATA	·libc_chown_trampoline_addr(SB)/8, $libc_chown_trampoline<>(SB)
 
 TEXT libc_chroot_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_chroot(SB)
-
 GLOBL	·libc_chroot_trampoline_addr(SB), RODATA, $8
 DATA	·libc_chroot_trampoline_addr(SB)/8, $libc_chroot_trampoline<>(SB)
 
+TEXT libc_clock_gettime_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_clock_gettime(SB)
+GLOBL	·libc_clock_gettime_trampoline_addr(SB), RODATA, $8
+DATA	·libc_clock_gettime_trampoline_addr(SB)/8, $libc_clock_gettime_trampoline<>(SB)
+
 TEXT libc_close_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_close(SB)
-
 GLOBL	·libc_close_trampoline_addr(SB), RODATA, $8
 DATA	·libc_close_trampoline_addr(SB)/8, $libc_close_trampoline<>(SB)
 
 TEXT libc_dup_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_dup(SB)
-
 GLOBL	·libc_dup_trampoline_addr(SB), RODATA, $8
 DATA	·libc_dup_trampoline_addr(SB)/8, $libc_dup_trampoline<>(SB)
 
 TEXT libc_dup2_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_dup2(SB)
-
 GLOBL	·libc_dup2_trampoline_addr(SB), RODATA, $8
 DATA	·libc_dup2_trampoline_addr(SB)/8, $libc_dup2_trampoline<>(SB)
 
 TEXT libc_dup3_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_dup3(SB)
-
 GLOBL	·libc_dup3_trampoline_addr(SB), RODATA, $8
 DATA	·libc_dup3_trampoline_addr(SB)/8, $libc_dup3_trampoline<>(SB)
 
 TEXT libc_exit_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_exit(SB)
-
 GLOBL	·libc_exit_trampoline_addr(SB), RODATA, $8
 DATA	·libc_exit_trampoline_addr(SB)/8, $libc_exit_trampoline<>(SB)
 
 TEXT libc_faccessat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_faccessat(SB)
-
 GLOBL	·libc_faccessat_trampoline_addr(SB), RODATA, $8
 DATA	·libc_faccessat_trampoline_addr(SB)/8, $libc_faccessat_trampoline<>(SB)
 
 TEXT libc_fchdir_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_fchdir(SB)
-
 GLOBL	·libc_fchdir_trampoline_addr(SB), RODATA, $8
 DATA	·libc_fchdir_trampoline_addr(SB)/8, $libc_fchdir_trampoline<>(SB)
 
 TEXT libc_fchflags_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_fchflags(SB)
-
 GLOBL	·libc_fchflags_trampoline_addr(SB), RODATA, $8
 DATA	·libc_fchflags_trampoline_addr(SB)/8, $libc_fchflags_trampoline<>(SB)
 
 TEXT libc_fchmod_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_fchmod(SB)
-
 GLOBL	·libc_fchmod_trampoline_addr(SB), RODATA, $8
 DATA	·libc_fchmod_trampoline_addr(SB)/8, $libc_fchmod_trampoline<>(SB)
 
 TEXT libc_fchmodat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_fchmodat(SB)
-
 GLOBL	·libc_fchmodat_trampoline_addr(SB), RODATA, $8
 DATA	·libc_fchmodat_trampoline_addr(SB)/8, $libc_fchmodat_trampoline<>(SB)
 
 TEXT libc_fchown_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_fchown(SB)
-
 GLOBL	·libc_fchown_trampoline_addr(SB), RODATA, $8
 DATA	·libc_fchown_trampoline_addr(SB)/8, $libc_fchown_trampoline<>(SB)
 
 TEXT libc_fchownat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_fchownat(SB)
-
 GLOBL	·libc_fchownat_trampoline_addr(SB), RODATA, $8
 DATA	·libc_fchownat_trampoline_addr(SB)/8, $libc_fchownat_trampoline<>(SB)
 
 TEXT libc_flock_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_flock(SB)
-
 GLOBL	·libc_flock_trampoline_addr(SB), RODATA, $8
 DATA	·libc_flock_trampoline_addr(SB)/8, $libc_flock_trampoline<>(SB)
 
 TEXT libc_fpathconf_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_fpathconf(SB)
-
 GLOBL	·libc_fpathconf_trampoline_addr(SB), RODATA, $8
 DATA	·libc_fpathconf_trampoline_addr(SB)/8, $libc_fpathconf_trampoline<>(SB)
 
 TEXT libc_fstat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_fstat(SB)
-
 GLOBL	·libc_fstat_trampoline_addr(SB), RODATA, $8
 DATA	·libc_fstat_trampoline_addr(SB)/8, $libc_fstat_trampoline<>(SB)
 
 TEXT libc_fstatat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_fstatat(SB)
-
 GLOBL	·libc_fstatat_trampoline_addr(SB), RODATA, $8
 DATA	·libc_fstatat_trampoline_addr(SB)/8, $libc_fstatat_trampoline<>(SB)
 
 TEXT libc_fstatfs_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_fstatfs(SB)
-
 GLOBL	·libc_fstatfs_trampoline_addr(SB), RODATA, $8
 DATA	·libc_fstatfs_trampoline_addr(SB)/8, $libc_fstatfs_trampoline<>(SB)
 
 TEXT libc_fsync_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_fsync(SB)
-
 GLOBL	·libc_fsync_trampoline_addr(SB), RODATA, $8
 DATA	·libc_fsync_trampoline_addr(SB)/8, $libc_fsync_trampoline<>(SB)
 
 TEXT libc_ftruncate_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_ftruncate(SB)
-
 GLOBL	·libc_ftruncate_trampoline_addr(SB), RODATA, $8
 DATA	·libc_ftruncate_trampoline_addr(SB)/8, $libc_ftruncate_trampoline<>(SB)
 
 TEXT libc_getegid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getegid(SB)
-
 GLOBL	·libc_getegid_trampoline_addr(SB), RODATA, $8
 DATA	·libc_getegid_trampoline_addr(SB)/8, $libc_getegid_trampoline<>(SB)
 
 TEXT libc_geteuid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_geteuid(SB)
-
 GLOBL	·libc_geteuid_trampoline_addr(SB), RODATA, $8
 DATA	·libc_geteuid_trampoline_addr(SB)/8, $libc_geteuid_trampoline<>(SB)
 
 TEXT libc_getgid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getgid(SB)
-
 GLOBL	·libc_getgid_trampoline_addr(SB), RODATA, $8
 DATA	·libc_getgid_trampoline_addr(SB)/8, $libc_getgid_trampoline<>(SB)
 
 TEXT libc_getpgid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getpgid(SB)
-
 GLOBL	·libc_getpgid_trampoline_addr(SB), RODATA, $8
 DATA	·libc_getpgid_trampoline_addr(SB)/8, $libc_getpgid_trampoline<>(SB)
 
 TEXT libc_getpgrp_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getpgrp(SB)
-
 GLOBL	·libc_getpgrp_trampoline_addr(SB), RODATA, $8
 DATA	·libc_getpgrp_trampoline_addr(SB)/8, $libc_getpgrp_trampoline<>(SB)
 
 TEXT libc_getpid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getpid(SB)
-
 GLOBL	·libc_getpid_trampoline_addr(SB), RODATA, $8
 DATA	·libc_getpid_trampoline_addr(SB)/8, $libc_getpid_trampoline<>(SB)
 
 TEXT libc_getppid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getppid(SB)
-
 GLOBL	·libc_getppid_trampoline_addr(SB), RODATA, $8
 DATA	·libc_getppid_trampoline_addr(SB)/8, $libc_getppid_trampoline<>(SB)
 
 TEXT libc_getpriority_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getpriority(SB)
-
 GLOBL	·libc_getpriority_trampoline_addr(SB), RODATA, $8
 DATA	·libc_getpriority_trampoline_addr(SB)/8, $libc_getpriority_trampoline<>(SB)
 
 TEXT libc_getrlimit_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getrlimit(SB)
-
 GLOBL	·libc_getrlimit_trampoline_addr(SB), RODATA, $8
 DATA	·libc_getrlimit_trampoline_addr(SB)/8, $libc_getrlimit_trampoline<>(SB)
 
 TEXT libc_getrtable_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getrtable(SB)
-
 GLOBL	·libc_getrtable_trampoline_addr(SB), RODATA, $8
 DATA	·libc_getrtable_trampoline_addr(SB)/8, $libc_getrtable_trampoline<>(SB)
 
 TEXT libc_getrusage_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getrusage(SB)
-
 GLOBL	·libc_getrusage_trampoline_addr(SB), RODATA, $8
 DATA	·libc_getrusage_trampoline_addr(SB)/8, $libc_getrusage_trampoline<>(SB)
 
 TEXT libc_getsid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getsid(SB)
-
 GLOBL	·libc_getsid_trampoline_addr(SB), RODATA, $8
 DATA	·libc_getsid_trampoline_addr(SB)/8, $libc_getsid_trampoline<>(SB)
 
 TEXT libc_gettimeofday_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_gettimeofday(SB)
-
 GLOBL	·libc_gettimeofday_trampoline_addr(SB), RODATA, $8
 DATA	·libc_gettimeofday_trampoline_addr(SB)/8, $libc_gettimeofday_trampoline<>(SB)
 
 TEXT libc_getuid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_getuid(SB)
-
 GLOBL	·libc_getuid_trampoline_addr(SB), RODATA, $8
 DATA	·libc_getuid_trampoline_addr(SB)/8, $libc_getuid_trampoline<>(SB)
 
 TEXT libc_issetugid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_issetugid(SB)
-
 GLOBL	·libc_issetugid_trampoline_addr(SB), RODATA, $8
 DATA	·libc_issetugid_trampoline_addr(SB)/8, $libc_issetugid_trampoline<>(SB)
 
 TEXT libc_kill_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_kill(SB)
-
 GLOBL	·libc_kill_trampoline_addr(SB), RODATA, $8
 DATA	·libc_kill_trampoline_addr(SB)/8, $libc_kill_trampoline<>(SB)
 
 TEXT libc_kqueue_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_kqueue(SB)
-
 GLOBL	·libc_kqueue_trampoline_addr(SB), RODATA, $8
 DATA	·libc_kqueue_trampoline_addr(SB)/8, $libc_kqueue_trampoline<>(SB)
 
 TEXT libc_lchown_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_lchown(SB)
-
 GLOBL	·libc_lchown_trampoline_addr(SB), RODATA, $8
 DATA	·libc_lchown_trampoline_addr(SB)/8, $libc_lchown_trampoline<>(SB)
 
 TEXT libc_link_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_link(SB)
-
 GLOBL	·libc_link_trampoline_addr(SB), RODATA, $8
 DATA	·libc_link_trampoline_addr(SB)/8, $libc_link_trampoline<>(SB)
 
 TEXT libc_linkat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_linkat(SB)
-
 GLOBL	·libc_linkat_trampoline_addr(SB), RODATA, $8
 DATA	·libc_linkat_trampoline_addr(SB)/8, $libc_linkat_trampoline<>(SB)
 
 TEXT libc_listen_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_listen(SB)
-
 GLOBL	·libc_listen_trampoline_addr(SB), RODATA, $8
 DATA	·libc_listen_trampoline_addr(SB)/8, $libc_listen_trampoline<>(SB)
 
 TEXT libc_lstat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_lstat(SB)
-
 GLOBL	·libc_lstat_trampoline_addr(SB), RODATA, $8
 DATA	·libc_lstat_trampoline_addr(SB)/8, $libc_lstat_trampoline<>(SB)
 
 TEXT libc_mkdir_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_mkdir(SB)
-
 GLOBL	·libc_mkdir_trampoline_addr(SB), RODATA, $8
 DATA	·libc_mkdir_trampoline_addr(SB)/8, $libc_mkdir_trampoline<>(SB)
 
 TEXT libc_mkdirat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_mkdirat(SB)
-
 GLOBL	·libc_mkdirat_trampoline_addr(SB), RODATA, $8
 DATA	·libc_mkdirat_trampoline_addr(SB)/8, $libc_mkdirat_trampoline<>(SB)
 
 TEXT libc_mkfifo_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_mkfifo(SB)
-
 GLOBL	·libc_mkfifo_trampoline_addr(SB), RODATA, $8
 DATA	·libc_mkfifo_trampoline_addr(SB)/8, $libc_mkfifo_trampoline<>(SB)
 
 TEXT libc_mkfifoat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_mkfifoat(SB)
-
 GLOBL	·libc_mkfifoat_trampoline_addr(SB), RODATA, $8
 DATA	·libc_mkfifoat_trampoline_addr(SB)/8, $libc_mkfifoat_trampoline<>(SB)
 
 TEXT libc_mknod_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_mknod(SB)
-
 GLOBL	·libc_mknod_trampoline_addr(SB), RODATA, $8
 DATA	·libc_mknod_trampoline_addr(SB)/8, $libc_mknod_trampoline<>(SB)
 
 TEXT libc_mknodat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_mknodat(SB)
-
 GLOBL	·libc_mknodat_trampoline_addr(SB), RODATA, $8
 DATA	·libc_mknodat_trampoline_addr(SB)/8, $libc_mknodat_trampoline<>(SB)
 
 TEXT libc_nanosleep_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_nanosleep(SB)
-
 GLOBL	·libc_nanosleep_trampoline_addr(SB), RODATA, $8
 DATA	·libc_nanosleep_trampoline_addr(SB)/8, $libc_nanosleep_trampoline<>(SB)
 
 TEXT libc_open_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_open(SB)
-
 GLOBL	·libc_open_trampoline_addr(SB), RODATA, $8
 DATA	·libc_open_trampoline_addr(SB)/8, $libc_open_trampoline<>(SB)
 
 TEXT libc_openat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_openat(SB)
-
 GLOBL	·libc_openat_trampoline_addr(SB), RODATA, $8
 DATA	·libc_openat_trampoline_addr(SB)/8, $libc_openat_trampoline<>(SB)
 
 TEXT libc_pathconf_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_pathconf(SB)
-
 GLOBL	·libc_pathconf_trampoline_addr(SB), RODATA, $8
 DATA	·libc_pathconf_trampoline_addr(SB)/8, $libc_pathconf_trampoline<>(SB)
 
 TEXT libc_pread_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_pread(SB)
-
 GLOBL	·libc_pread_trampoline_addr(SB), RODATA, $8
 DATA	·libc_pread_trampoline_addr(SB)/8, $libc_pread_trampoline<>(SB)
 
 TEXT libc_pwrite_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_pwrite(SB)
-
 GLOBL	·libc_pwrite_trampoline_addr(SB), RODATA, $8
 DATA	·libc_pwrite_trampoline_addr(SB)/8, $libc_pwrite_trampoline<>(SB)
 
 TEXT libc_read_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_read(SB)
-
 GLOBL	·libc_read_trampoline_addr(SB), RODATA, $8
 DATA	·libc_read_trampoline_addr(SB)/8, $libc_read_trampoline<>(SB)
 
 TEXT libc_readlink_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_readlink(SB)
-
 GLOBL	·libc_readlink_trampoline_addr(SB), RODATA, $8
 DATA	·libc_readlink_trampoline_addr(SB)/8, $libc_readlink_trampoline<>(SB)
 
 TEXT libc_readlinkat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_readlinkat(SB)
-
 GLOBL	·libc_readlinkat_trampoline_addr(SB), RODATA, $8
 DATA	·libc_readlinkat_trampoline_addr(SB)/8, $libc_readlinkat_trampoline<>(SB)
 
 TEXT libc_rename_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_rename(SB)
-
 GLOBL	·libc_rename_trampoline_addr(SB), RODATA, $8
 DATA	·libc_rename_trampoline_addr(SB)/8, $libc_rename_trampoline<>(SB)
 
 TEXT libc_renameat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_renameat(SB)
-
 GLOBL	·libc_renameat_trampoline_addr(SB), RODATA, $8
 DATA	·libc_renameat_trampoline_addr(SB)/8, $libc_renameat_trampoline<>(SB)
 
 TEXT libc_revoke_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_revoke(SB)
-
 GLOBL	·libc_revoke_trampoline_addr(SB), RODATA, $8
 DATA	·libc_revoke_trampoline_addr(SB)/8, $libc_revoke_trampoline<>(SB)
 
 TEXT libc_rmdir_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_rmdir(SB)
-
 GLOBL	·libc_rmdir_trampoline_addr(SB), RODATA, $8
 DATA	·libc_rmdir_trampoline_addr(SB)/8, $libc_rmdir_trampoline<>(SB)
 
 TEXT libc_lseek_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_lseek(SB)
-
 GLOBL	·libc_lseek_trampoline_addr(SB), RODATA, $8
 DATA	·libc_lseek_trampoline_addr(SB)/8, $libc_lseek_trampoline<>(SB)
 
 TEXT libc_select_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_select(SB)
-
 GLOBL	·libc_select_trampoline_addr(SB), RODATA, $8
 DATA	·libc_select_trampoline_addr(SB)/8, $libc_select_trampoline<>(SB)
 
 TEXT libc_setegid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setegid(SB)
-
 GLOBL	·libc_setegid_trampoline_addr(SB), RODATA, $8
 DATA	·libc_setegid_trampoline_addr(SB)/8, $libc_setegid_trampoline<>(SB)
 
 TEXT libc_seteuid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_seteuid(SB)
-
 GLOBL	·libc_seteuid_trampoline_addr(SB), RODATA, $8
 DATA	·libc_seteuid_trampoline_addr(SB)/8, $libc_seteuid_trampoline<>(SB)
 
 TEXT libc_setgid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setgid(SB)
-
 GLOBL	·libc_setgid_trampoline_addr(SB), RODATA, $8
 DATA	·libc_setgid_trampoline_addr(SB)/8, $libc_setgid_trampoline<>(SB)
 
 TEXT libc_setlogin_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setlogin(SB)
-
 GLOBL	·libc_setlogin_trampoline_addr(SB), RODATA, $8
 DATA	·libc_setlogin_trampoline_addr(SB)/8, $libc_setlogin_trampoline<>(SB)
 
 TEXT libc_setpgid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setpgid(SB)
-
 GLOBL	·libc_setpgid_trampoline_addr(SB), RODATA, $8
 DATA	·libc_setpgid_trampoline_addr(SB)/8, $libc_setpgid_trampoline<>(SB)
 
 TEXT libc_setpriority_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setpriority(SB)
-
 GLOBL	·libc_setpriority_trampoline_addr(SB), RODATA, $8
 DATA	·libc_setpriority_trampoline_addr(SB)/8, $libc_setpriority_trampoline<>(SB)
 
 TEXT libc_setregid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setregid(SB)
-
 GLOBL	·libc_setregid_trampoline_addr(SB), RODATA, $8
 DATA	·libc_setregid_trampoline_addr(SB)/8, $libc_setregid_trampoline<>(SB)
 
 TEXT libc_setreuid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setreuid(SB)
-
 GLOBL	·libc_setreuid_trampoline_addr(SB), RODATA, $8
 DATA	·libc_setreuid_trampoline_addr(SB)/8, $libc_setreuid_trampoline<>(SB)
 
 TEXT libc_setresgid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setresgid(SB)
-
 GLOBL	·libc_setresgid_trampoline_addr(SB), RODATA, $8
 DATA	·libc_setresgid_trampoline_addr(SB)/8, $libc_setresgid_trampoline<>(SB)
 
 TEXT libc_setresuid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setresuid(SB)
-
 GLOBL	·libc_setresuid_trampoline_addr(SB), RODATA, $8
 DATA	·libc_setresuid_trampoline_addr(SB)/8, $libc_setresuid_trampoline<>(SB)
 
-TEXT libc_setrlimit_trampoline<>(SB),NOSPLIT,$0-0
-	JMP	libc_setrlimit(SB)
-
-GLOBL	·libc_setrlimit_trampoline_addr(SB), RODATA, $8
-DATA	·libc_setrlimit_trampoline_addr(SB)/8, $libc_setrlimit_trampoline<>(SB)
-
 TEXT libc_setrtable_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setrtable(SB)
-
 GLOBL	·libc_setrtable_trampoline_addr(SB), RODATA, $8
 DATA	·libc_setrtable_trampoline_addr(SB)/8, $libc_setrtable_trampoline<>(SB)
 
 TEXT libc_setsid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setsid(SB)
-
 GLOBL	·libc_setsid_trampoline_addr(SB), RODATA, $8
 DATA	·libc_setsid_trampoline_addr(SB)/8, $libc_setsid_trampoline<>(SB)
 
 TEXT libc_settimeofday_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_settimeofday(SB)
-
 GLOBL	·libc_settimeofday_trampoline_addr(SB), RODATA, $8
 DATA	·libc_settimeofday_trampoline_addr(SB)/8, $libc_settimeofday_trampoline<>(SB)
 
 TEXT libc_setuid_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_setuid(SB)
-
 GLOBL	·libc_setuid_trampoline_addr(SB), RODATA, $8
 DATA	·libc_setuid_trampoline_addr(SB)/8, $libc_setuid_trampoline<>(SB)
 
 TEXT libc_stat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_stat(SB)
-
 GLOBL	·libc_stat_trampoline_addr(SB), RODATA, $8
 DATA	·libc_stat_trampoline_addr(SB)/8, $libc_stat_trampoline<>(SB)
 
 TEXT libc_statfs_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_statfs(SB)
-
 GLOBL	·libc_statfs_trampoline_addr(SB), RODATA, $8
 DATA	·libc_statfs_trampoline_addr(SB)/8, $libc_statfs_trampoline<>(SB)
 
 TEXT libc_symlink_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_symlink(SB)
-
 GLOBL	·libc_symlink_trampoline_addr(SB), RODATA, $8
 DATA	·libc_symlink_trampoline_addr(SB)/8, $libc_symlink_trampoline<>(SB)
 
 TEXT libc_symlinkat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_symlinkat(SB)
-
 GLOBL	·libc_symlinkat_trampoline_addr(SB), RODATA, $8
 DATA	·libc_symlinkat_trampoline_addr(SB)/8, $libc_symlinkat_trampoline<>(SB)
 
 TEXT libc_sync_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_sync(SB)
-
 GLOBL	·libc_sync_trampoline_addr(SB), RODATA, $8
 DATA	·libc_sync_trampoline_addr(SB)/8, $libc_sync_trampoline<>(SB)
 
 TEXT libc_truncate_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_truncate(SB)
-
 GLOBL	·libc_truncate_trampoline_addr(SB), RODATA, $8
 DATA	·libc_truncate_trampoline_addr(SB)/8, $libc_truncate_trampoline<>(SB)
 
 TEXT libc_umask_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_umask(SB)
-
 GLOBL	·libc_umask_trampoline_addr(SB), RODATA, $8
 DATA	·libc_umask_trampoline_addr(SB)/8, $libc_umask_trampoline<>(SB)
 
 TEXT libc_unlink_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_unlink(SB)
-
 GLOBL	·libc_unlink_trampoline_addr(SB), RODATA, $8
 DATA	·libc_unlink_trampoline_addr(SB)/8, $libc_unlink_trampoline<>(SB)
 
 TEXT libc_unlinkat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_unlinkat(SB)
-
 GLOBL	·libc_unlinkat_trampoline_addr(SB), RODATA, $8
 DATA	·libc_unlinkat_trampoline_addr(SB)/8, $libc_unlinkat_trampoline<>(SB)
 
 TEXT libc_unmount_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_unmount(SB)
-
 GLOBL	·libc_unmount_trampoline_addr(SB), RODATA, $8
 DATA	·libc_unmount_trampoline_addr(SB)/8, $libc_unmount_trampoline<>(SB)
 
 TEXT libc_write_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_write(SB)
-
 GLOBL	·libc_write_trampoline_addr(SB), RODATA, $8
 DATA	·libc_write_trampoline_addr(SB)/8, $libc_write_trampoline<>(SB)
 
 TEXT libc_mmap_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_mmap(SB)
-
 GLOBL	·libc_mmap_trampoline_addr(SB), RODATA, $8
 DATA	·libc_mmap_trampoline_addr(SB)/8, $libc_mmap_trampoline<>(SB)
 
 TEXT libc_munmap_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_munmap(SB)
-
 GLOBL	·libc_munmap_trampoline_addr(SB), RODATA, $8
 DATA	·libc_munmap_trampoline_addr(SB)/8, $libc_munmap_trampoline<>(SB)
 
 TEXT libc_utimensat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_utimensat(SB)
-
 GLOBL	·libc_utimensat_trampoline_addr(SB), RODATA, $8
 DATA	·libc_utimensat_trampoline_addr(SB)/8, $libc_utimensat_trampoline<>(SB)
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go
index 91f5a2b..609d1c5 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go
@@ -38,6 +38,7 @@
 //go:cgo_import_dynamic libc_chmod chmod "libc.so"
 //go:cgo_import_dynamic libc_chown chown "libc.so"
 //go:cgo_import_dynamic libc_chroot chroot "libc.so"
+//go:cgo_import_dynamic libc_clockgettime clockgettime "libc.so"
 //go:cgo_import_dynamic libc_close close "libc.so"
 //go:cgo_import_dynamic libc_creat creat "libc.so"
 //go:cgo_import_dynamic libc_dup dup "libc.so"
@@ -109,7 +110,6 @@
 //go:cgo_import_dynamic libc_setpriority setpriority "libc.so"
 //go:cgo_import_dynamic libc_setregid setregid "libc.so"
 //go:cgo_import_dynamic libc_setreuid setreuid "libc.so"
-//go:cgo_import_dynamic libc_setrlimit setrlimit "libc.so"
 //go:cgo_import_dynamic libc_setsid setsid "libc.so"
 //go:cgo_import_dynamic libc_setuid setuid "libc.so"
 //go:cgo_import_dynamic libc_shutdown shutdown "libsocket.so"
@@ -177,6 +177,7 @@
 //go:linkname procChmod libc_chmod
 //go:linkname procChown libc_chown
 //go:linkname procChroot libc_chroot
+//go:linkname procClockGettime libc_clockgettime
 //go:linkname procClose libc_close
 //go:linkname procCreat libc_creat
 //go:linkname procDup libc_dup
@@ -248,7 +249,6 @@
 //go:linkname procSetpriority libc_setpriority
 //go:linkname procSetregid libc_setregid
 //go:linkname procSetreuid libc_setreuid
-//go:linkname procSetrlimit libc_setrlimit
 //go:linkname procSetsid libc_setsid
 //go:linkname procSetuid libc_setuid
 //go:linkname procshutdown libc_shutdown
@@ -317,6 +317,7 @@
 	procChmod,
 	procChown,
 	procChroot,
+	procClockGettime,
 	procClose,
 	procCreat,
 	procDup,
@@ -388,7 +389,6 @@
 	procSetpriority,
 	procSetregid,
 	procSetreuid,
-	procSetrlimit,
 	procSetsid,
 	procSetuid,
 	procshutdown,
@@ -643,7 +643,18 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func ioctlRet(fd int, req uint, arg uintptr) (ret int, err error) {
+func ioctlRet(fd int, req int, arg uintptr) (ret int, err error) {
+	r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procioctl)), 3, uintptr(fd), uintptr(req), uintptr(arg), 0, 0, 0)
+	ret = int(r0)
+	if e1 != 0 {
+		err = e1
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func ioctlPtrRet(fd int, req int, arg unsafe.Pointer) (ret int, err error) {
 	r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procioctl)), 3, uintptr(fd), uintptr(req), uintptr(arg), 0, 0, 0)
 	ret = int(r0)
 	if e1 != 0 {
@@ -750,6 +761,16 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func ClockGettime(clockid int32, time *Timespec) (err error) {
+	_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procClockGettime)), 2, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0, 0, 0, 0)
+	if e1 != 0 {
+		err = e1
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func Close(fd int) (err error) {
 	_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procClose)), 1, uintptr(fd), 0, 0, 0, 0, 0)
 	if e1 != 0 {
@@ -1626,16 +1647,6 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Setrlimit(which int, lim *Rlimit) (err error) {
-	_, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetrlimit)), 2, uintptr(which), uintptr(unsafe.Pointer(lim)), 0, 0, 0, 0)
-	if e1 != 0 {
-		err = e1
-	}
-	return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func Setsid() (pid int, err error) {
 	r0, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetsid)), 0, 0, 0, 0, 0, 0, 0)
 	pid = int(r0)
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_zos_s390x.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_zos_s390x.go
index f207945..c316817 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_zos_s390x.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_zos_s390x.go
@@ -257,7 +257,17 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func ioctl(fd int, req uint, arg uintptr) (err error) {
+func ioctl(fd int, req int, arg uintptr) (err error) {
+	_, _, e1 := syscall_syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg))
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func ioctlPtr(fd int, req int, arg unsafe.Pointer) (err error) {
 	_, _, e1 := syscall_syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg))
 	if e1 != 0 {
 		err = errnoErr(e1)
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsysctl_openbsd_386.go b/src/cmd/vendor/golang.org/x/sys/unix/zsysctl_openbsd_386.go
index 9e9d0b2..55e0484 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zsysctl_openbsd_386.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zsysctl_openbsd_386.go
@@ -17,6 +17,7 @@
 	{"ddb.max_line", []_C_int{9, 3}},
 	{"ddb.max_width", []_C_int{9, 2}},
 	{"ddb.panic", []_C_int{9, 5}},
+	{"ddb.profile", []_C_int{9, 9}},
 	{"ddb.radix", []_C_int{9, 1}},
 	{"ddb.tab_stop_width", []_C_int{9, 4}},
 	{"ddb.trigger", []_C_int{9, 8}},
@@ -33,29 +34,37 @@
 	{"hw.ncpufound", []_C_int{6, 21}},
 	{"hw.ncpuonline", []_C_int{6, 25}},
 	{"hw.pagesize", []_C_int{6, 7}},
+	{"hw.perfpolicy", []_C_int{6, 23}},
 	{"hw.physmem", []_C_int{6, 19}},
+	{"hw.power", []_C_int{6, 26}},
 	{"hw.product", []_C_int{6, 15}},
 	{"hw.serialno", []_C_int{6, 17}},
 	{"hw.setperf", []_C_int{6, 13}},
+	{"hw.smt", []_C_int{6, 24}},
 	{"hw.usermem", []_C_int{6, 20}},
 	{"hw.uuid", []_C_int{6, 18}},
 	{"hw.vendor", []_C_int{6, 14}},
 	{"hw.version", []_C_int{6, 16}},
-	{"kern.arandom", []_C_int{1, 37}},
+	{"kern.allowdt", []_C_int{1, 65}},
+	{"kern.allowkmem", []_C_int{1, 52}},
 	{"kern.argmax", []_C_int{1, 8}},
+	{"kern.audio", []_C_int{1, 84}},
 	{"kern.boottime", []_C_int{1, 21}},
 	{"kern.bufcachepercent", []_C_int{1, 72}},
 	{"kern.ccpu", []_C_int{1, 45}},
 	{"kern.clockrate", []_C_int{1, 12}},
+	{"kern.consbuf", []_C_int{1, 83}},
+	{"kern.consbufsize", []_C_int{1, 82}},
 	{"kern.consdev", []_C_int{1, 75}},
 	{"kern.cp_time", []_C_int{1, 40}},
 	{"kern.cp_time2", []_C_int{1, 71}},
-	{"kern.cryptodevallowsoft", []_C_int{1, 53}},
+	{"kern.cpustats", []_C_int{1, 85}},
 	{"kern.domainname", []_C_int{1, 22}},
 	{"kern.file", []_C_int{1, 73}},
 	{"kern.forkstat", []_C_int{1, 42}},
 	{"kern.fscale", []_C_int{1, 46}},
 	{"kern.fsync", []_C_int{1, 33}},
+	{"kern.global_ptrace", []_C_int{1, 81}},
 	{"kern.hostid", []_C_int{1, 11}},
 	{"kern.hostname", []_C_int{1, 10}},
 	{"kern.intrcnt.nintrcnt", []_C_int{1, 63, 1}},
@@ -78,17 +87,16 @@
 	{"kern.ngroups", []_C_int{1, 18}},
 	{"kern.nosuidcoredump", []_C_int{1, 32}},
 	{"kern.nprocs", []_C_int{1, 47}},
-	{"kern.nselcoll", []_C_int{1, 43}},
 	{"kern.nthreads", []_C_int{1, 26}},
 	{"kern.numvnodes", []_C_int{1, 58}},
 	{"kern.osrelease", []_C_int{1, 2}},
 	{"kern.osrevision", []_C_int{1, 3}},
 	{"kern.ostype", []_C_int{1, 1}},
 	{"kern.osversion", []_C_int{1, 27}},
+	{"kern.pfstatus", []_C_int{1, 86}},
 	{"kern.pool_debug", []_C_int{1, 77}},
 	{"kern.posix1version", []_C_int{1, 17}},
 	{"kern.proc", []_C_int{1, 66}},
-	{"kern.random", []_C_int{1, 31}},
 	{"kern.rawpartition", []_C_int{1, 24}},
 	{"kern.saved_ids", []_C_int{1, 20}},
 	{"kern.securelevel", []_C_int{1, 9}},
@@ -106,21 +114,20 @@
 	{"kern.timecounter.hardware", []_C_int{1, 69, 3}},
 	{"kern.timecounter.tick", []_C_int{1, 69, 1}},
 	{"kern.timecounter.timestepwarnings", []_C_int{1, 69, 2}},
-	{"kern.tty.maxptys", []_C_int{1, 44, 6}},
-	{"kern.tty.nptys", []_C_int{1, 44, 7}},
+	{"kern.timeout_stats", []_C_int{1, 87}},
 	{"kern.tty.tk_cancc", []_C_int{1, 44, 4}},
 	{"kern.tty.tk_nin", []_C_int{1, 44, 1}},
 	{"kern.tty.tk_nout", []_C_int{1, 44, 2}},
 	{"kern.tty.tk_rawcc", []_C_int{1, 44, 3}},
 	{"kern.tty.ttyinfo", []_C_int{1, 44, 5}},
 	{"kern.ttycount", []_C_int{1, 57}},
-	{"kern.userasymcrypto", []_C_int{1, 60}},
-	{"kern.usercrypto", []_C_int{1, 52}},
-	{"kern.usermount", []_C_int{1, 30}},
+	{"kern.utc_offset", []_C_int{1, 88}},
 	{"kern.version", []_C_int{1, 4}},
-	{"kern.vnode", []_C_int{1, 13}},
+	{"kern.video", []_C_int{1, 89}},
 	{"kern.watchdog.auto", []_C_int{1, 64, 2}},
 	{"kern.watchdog.period", []_C_int{1, 64, 1}},
+	{"kern.witnesswatch", []_C_int{1, 53}},
+	{"kern.wxabort", []_C_int{1, 74}},
 	{"net.bpf.bufsize", []_C_int{4, 31, 1}},
 	{"net.bpf.maxbufsize", []_C_int{4, 31, 2}},
 	{"net.inet.ah.enable", []_C_int{4, 2, 51, 1}},
@@ -148,7 +155,9 @@
 	{"net.inet.icmp.stats", []_C_int{4, 2, 1, 7}},
 	{"net.inet.icmp.tstamprepl", []_C_int{4, 2, 1, 6}},
 	{"net.inet.igmp.stats", []_C_int{4, 2, 2, 1}},
+	{"net.inet.ip.arpdown", []_C_int{4, 2, 0, 40}},
 	{"net.inet.ip.arpqueued", []_C_int{4, 2, 0, 36}},
+	{"net.inet.ip.arptimeout", []_C_int{4, 2, 0, 39}},
 	{"net.inet.ip.encdebug", []_C_int{4, 2, 0, 12}},
 	{"net.inet.ip.forwarding", []_C_int{4, 2, 0, 1}},
 	{"net.inet.ip.ifq.congestion", []_C_int{4, 2, 0, 30, 4}},
@@ -157,8 +166,10 @@
 	{"net.inet.ip.ifq.maxlen", []_C_int{4, 2, 0, 30, 2}},
 	{"net.inet.ip.maxqueue", []_C_int{4, 2, 0, 11}},
 	{"net.inet.ip.mforwarding", []_C_int{4, 2, 0, 31}},
+	{"net.inet.ip.mrtmfc", []_C_int{4, 2, 0, 37}},
 	{"net.inet.ip.mrtproto", []_C_int{4, 2, 0, 34}},
 	{"net.inet.ip.mrtstats", []_C_int{4, 2, 0, 35}},
+	{"net.inet.ip.mrtvif", []_C_int{4, 2, 0, 38}},
 	{"net.inet.ip.mtu", []_C_int{4, 2, 0, 4}},
 	{"net.inet.ip.mtudisc", []_C_int{4, 2, 0, 27}},
 	{"net.inet.ip.mtudisctimeout", []_C_int{4, 2, 0, 28}},
@@ -175,9 +186,7 @@
 	{"net.inet.ipcomp.stats", []_C_int{4, 2, 108, 2}},
 	{"net.inet.ipip.allow", []_C_int{4, 2, 4, 1}},
 	{"net.inet.ipip.stats", []_C_int{4, 2, 4, 2}},
-	{"net.inet.mobileip.allow", []_C_int{4, 2, 55, 1}},
 	{"net.inet.pfsync.stats", []_C_int{4, 2, 240, 1}},
-	{"net.inet.pim.stats", []_C_int{4, 2, 103, 1}},
 	{"net.inet.tcp.ackonpush", []_C_int{4, 2, 6, 13}},
 	{"net.inet.tcp.always_keepalive", []_C_int{4, 2, 6, 22}},
 	{"net.inet.tcp.baddynamic", []_C_int{4, 2, 6, 6}},
@@ -191,6 +200,7 @@
 	{"net.inet.tcp.reasslimit", []_C_int{4, 2, 6, 18}},
 	{"net.inet.tcp.rfc1323", []_C_int{4, 2, 6, 1}},
 	{"net.inet.tcp.rfc3390", []_C_int{4, 2, 6, 17}},
+	{"net.inet.tcp.rootonly", []_C_int{4, 2, 6, 24}},
 	{"net.inet.tcp.rstppslimit", []_C_int{4, 2, 6, 12}},
 	{"net.inet.tcp.sack", []_C_int{4, 2, 6, 10}},
 	{"net.inet.tcp.sackholelimit", []_C_int{4, 2, 6, 20}},
@@ -198,9 +208,12 @@
 	{"net.inet.tcp.stats", []_C_int{4, 2, 6, 21}},
 	{"net.inet.tcp.synbucketlimit", []_C_int{4, 2, 6, 16}},
 	{"net.inet.tcp.syncachelimit", []_C_int{4, 2, 6, 15}},
+	{"net.inet.tcp.synhashsize", []_C_int{4, 2, 6, 25}},
+	{"net.inet.tcp.synuselimit", []_C_int{4, 2, 6, 23}},
 	{"net.inet.udp.baddynamic", []_C_int{4, 2, 17, 2}},
 	{"net.inet.udp.checksum", []_C_int{4, 2, 17, 1}},
 	{"net.inet.udp.recvspace", []_C_int{4, 2, 17, 3}},
+	{"net.inet.udp.rootonly", []_C_int{4, 2, 17, 6}},
 	{"net.inet.udp.sendspace", []_C_int{4, 2, 17, 4}},
 	{"net.inet.udp.stats", []_C_int{4, 2, 17, 5}},
 	{"net.inet6.divert.recvspace", []_C_int{4, 24, 86, 1}},
@@ -213,13 +226,8 @@
 	{"net.inet6.icmp6.nd6_delay", []_C_int{4, 24, 30, 8}},
 	{"net.inet6.icmp6.nd6_maxnudhint", []_C_int{4, 24, 30, 15}},
 	{"net.inet6.icmp6.nd6_mmaxtries", []_C_int{4, 24, 30, 10}},
-	{"net.inet6.icmp6.nd6_prune", []_C_int{4, 24, 30, 6}},
 	{"net.inet6.icmp6.nd6_umaxtries", []_C_int{4, 24, 30, 9}},
-	{"net.inet6.icmp6.nd6_useloopback", []_C_int{4, 24, 30, 11}},
-	{"net.inet6.icmp6.nodeinfo", []_C_int{4, 24, 30, 13}},
-	{"net.inet6.icmp6.rediraccept", []_C_int{4, 24, 30, 2}},
 	{"net.inet6.icmp6.redirtimeout", []_C_int{4, 24, 30, 3}},
-	{"net.inet6.ip6.accept_rtadv", []_C_int{4, 24, 17, 12}},
 	{"net.inet6.ip6.auto_flowlabel", []_C_int{4, 24, 17, 17}},
 	{"net.inet6.ip6.dad_count", []_C_int{4, 24, 17, 16}},
 	{"net.inet6.ip6.dad_pending", []_C_int{4, 24, 17, 49}},
@@ -232,20 +240,19 @@
 	{"net.inet6.ip6.maxdynroutes", []_C_int{4, 24, 17, 48}},
 	{"net.inet6.ip6.maxfragpackets", []_C_int{4, 24, 17, 9}},
 	{"net.inet6.ip6.maxfrags", []_C_int{4, 24, 17, 41}},
-	{"net.inet6.ip6.maxifdefrouters", []_C_int{4, 24, 17, 47}},
-	{"net.inet6.ip6.maxifprefixes", []_C_int{4, 24, 17, 46}},
 	{"net.inet6.ip6.mforwarding", []_C_int{4, 24, 17, 42}},
+	{"net.inet6.ip6.mrtmfc", []_C_int{4, 24, 17, 53}},
+	{"net.inet6.ip6.mrtmif", []_C_int{4, 24, 17, 52}},
 	{"net.inet6.ip6.mrtproto", []_C_int{4, 24, 17, 8}},
 	{"net.inet6.ip6.mtudisctimeout", []_C_int{4, 24, 17, 50}},
 	{"net.inet6.ip6.multicast_mtudisc", []_C_int{4, 24, 17, 44}},
 	{"net.inet6.ip6.multipath", []_C_int{4, 24, 17, 43}},
 	{"net.inet6.ip6.neighborgcthresh", []_C_int{4, 24, 17, 45}},
 	{"net.inet6.ip6.redirect", []_C_int{4, 24, 17, 2}},
-	{"net.inet6.ip6.rr_prune", []_C_int{4, 24, 17, 22}},
+	{"net.inet6.ip6.soiikey", []_C_int{4, 24, 17, 54}},
 	{"net.inet6.ip6.sourcecheck", []_C_int{4, 24, 17, 10}},
 	{"net.inet6.ip6.sourcecheck_logint", []_C_int{4, 24, 17, 11}},
 	{"net.inet6.ip6.use_deprecated", []_C_int{4, 24, 17, 21}},
-	{"net.inet6.ip6.v6only", []_C_int{4, 24, 17, 24}},
 	{"net.key.sadb_dump", []_C_int{4, 30, 1}},
 	{"net.key.spd_dump", []_C_int{4, 30, 2}},
 	{"net.mpls.ifq.congestion", []_C_int{4, 33, 3, 4}},
@@ -254,12 +261,12 @@
 	{"net.mpls.ifq.maxlen", []_C_int{4, 33, 3, 2}},
 	{"net.mpls.mapttl_ip", []_C_int{4, 33, 5}},
 	{"net.mpls.mapttl_ip6", []_C_int{4, 33, 6}},
-	{"net.mpls.maxloop_inkernel", []_C_int{4, 33, 4}},
 	{"net.mpls.ttl", []_C_int{4, 33, 2}},
 	{"net.pflow.stats", []_C_int{4, 34, 1}},
 	{"net.pipex.enable", []_C_int{4, 35, 1}},
 	{"vm.anonmin", []_C_int{2, 7}},
 	{"vm.loadavg", []_C_int{2, 2}},
+	{"vm.malloc_conf", []_C_int{2, 12}},
 	{"vm.maxslp", []_C_int{2, 10}},
 	{"vm.nkmempages", []_C_int{2, 6}},
 	{"vm.psstrings", []_C_int{2, 3}},
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsysctl_openbsd_amd64.go b/src/cmd/vendor/golang.org/x/sys/unix/zsysctl_openbsd_amd64.go
index adecd09..d2243cf 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zsysctl_openbsd_amd64.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zsysctl_openbsd_amd64.go
@@ -36,23 +36,29 @@
 	{"hw.pagesize", []_C_int{6, 7}},
 	{"hw.perfpolicy", []_C_int{6, 23}},
 	{"hw.physmem", []_C_int{6, 19}},
+	{"hw.power", []_C_int{6, 26}},
 	{"hw.product", []_C_int{6, 15}},
 	{"hw.serialno", []_C_int{6, 17}},
 	{"hw.setperf", []_C_int{6, 13}},
+	{"hw.smt", []_C_int{6, 24}},
 	{"hw.usermem", []_C_int{6, 20}},
 	{"hw.uuid", []_C_int{6, 18}},
 	{"hw.vendor", []_C_int{6, 14}},
 	{"hw.version", []_C_int{6, 16}},
+	{"kern.allowdt", []_C_int{1, 65}},
 	{"kern.allowkmem", []_C_int{1, 52}},
 	{"kern.argmax", []_C_int{1, 8}},
+	{"kern.audio", []_C_int{1, 84}},
 	{"kern.boottime", []_C_int{1, 21}},
 	{"kern.bufcachepercent", []_C_int{1, 72}},
 	{"kern.ccpu", []_C_int{1, 45}},
 	{"kern.clockrate", []_C_int{1, 12}},
+	{"kern.consbuf", []_C_int{1, 83}},
+	{"kern.consbufsize", []_C_int{1, 82}},
 	{"kern.consdev", []_C_int{1, 75}},
 	{"kern.cp_time", []_C_int{1, 40}},
 	{"kern.cp_time2", []_C_int{1, 71}},
-	{"kern.dnsjackport", []_C_int{1, 13}},
+	{"kern.cpustats", []_C_int{1, 85}},
 	{"kern.domainname", []_C_int{1, 22}},
 	{"kern.file", []_C_int{1, 73}},
 	{"kern.forkstat", []_C_int{1, 42}},
@@ -81,13 +87,13 @@
 	{"kern.ngroups", []_C_int{1, 18}},
 	{"kern.nosuidcoredump", []_C_int{1, 32}},
 	{"kern.nprocs", []_C_int{1, 47}},
-	{"kern.nselcoll", []_C_int{1, 43}},
 	{"kern.nthreads", []_C_int{1, 26}},
 	{"kern.numvnodes", []_C_int{1, 58}},
 	{"kern.osrelease", []_C_int{1, 2}},
 	{"kern.osrevision", []_C_int{1, 3}},
 	{"kern.ostype", []_C_int{1, 1}},
 	{"kern.osversion", []_C_int{1, 27}},
+	{"kern.pfstatus", []_C_int{1, 86}},
 	{"kern.pool_debug", []_C_int{1, 77}},
 	{"kern.posix1version", []_C_int{1, 17}},
 	{"kern.proc", []_C_int{1, 66}},
@@ -108,15 +114,19 @@
 	{"kern.timecounter.hardware", []_C_int{1, 69, 3}},
 	{"kern.timecounter.tick", []_C_int{1, 69, 1}},
 	{"kern.timecounter.timestepwarnings", []_C_int{1, 69, 2}},
+	{"kern.timeout_stats", []_C_int{1, 87}},
 	{"kern.tty.tk_cancc", []_C_int{1, 44, 4}},
 	{"kern.tty.tk_nin", []_C_int{1, 44, 1}},
 	{"kern.tty.tk_nout", []_C_int{1, 44, 2}},
 	{"kern.tty.tk_rawcc", []_C_int{1, 44, 3}},
 	{"kern.tty.ttyinfo", []_C_int{1, 44, 5}},
 	{"kern.ttycount", []_C_int{1, 57}},
+	{"kern.utc_offset", []_C_int{1, 88}},
 	{"kern.version", []_C_int{1, 4}},
+	{"kern.video", []_C_int{1, 89}},
 	{"kern.watchdog.auto", []_C_int{1, 64, 2}},
 	{"kern.watchdog.period", []_C_int{1, 64, 1}},
+	{"kern.witnesswatch", []_C_int{1, 53}},
 	{"kern.wxabort", []_C_int{1, 74}},
 	{"net.bpf.bufsize", []_C_int{4, 31, 1}},
 	{"net.bpf.maxbufsize", []_C_int{4, 31, 2}},
@@ -176,7 +186,6 @@
 	{"net.inet.ipcomp.stats", []_C_int{4, 2, 108, 2}},
 	{"net.inet.ipip.allow", []_C_int{4, 2, 4, 1}},
 	{"net.inet.ipip.stats", []_C_int{4, 2, 4, 2}},
-	{"net.inet.mobileip.allow", []_C_int{4, 2, 55, 1}},
 	{"net.inet.pfsync.stats", []_C_int{4, 2, 240, 1}},
 	{"net.inet.tcp.ackonpush", []_C_int{4, 2, 6, 13}},
 	{"net.inet.tcp.always_keepalive", []_C_int{4, 2, 6, 22}},
@@ -252,12 +261,12 @@
 	{"net.mpls.ifq.maxlen", []_C_int{4, 33, 3, 2}},
 	{"net.mpls.mapttl_ip", []_C_int{4, 33, 5}},
 	{"net.mpls.mapttl_ip6", []_C_int{4, 33, 6}},
-	{"net.mpls.maxloop_inkernel", []_C_int{4, 33, 4}},
 	{"net.mpls.ttl", []_C_int{4, 33, 2}},
 	{"net.pflow.stats", []_C_int{4, 34, 1}},
 	{"net.pipex.enable", []_C_int{4, 35, 1}},
 	{"vm.anonmin", []_C_int{2, 7}},
 	{"vm.loadavg", []_C_int{2, 2}},
+	{"vm.malloc_conf", []_C_int{2, 12}},
 	{"vm.maxslp", []_C_int{2, 10}},
 	{"vm.nkmempages", []_C_int{2, 6}},
 	{"vm.psstrings", []_C_int{2, 3}},
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm.go b/src/cmd/vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm.go
index 8ea52a4..82dc51b 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm.go
@@ -17,6 +17,7 @@
 	{"ddb.max_line", []_C_int{9, 3}},
 	{"ddb.max_width", []_C_int{9, 2}},
 	{"ddb.panic", []_C_int{9, 5}},
+	{"ddb.profile", []_C_int{9, 9}},
 	{"ddb.radix", []_C_int{9, 1}},
 	{"ddb.tab_stop_width", []_C_int{9, 4}},
 	{"ddb.trigger", []_C_int{9, 8}},
@@ -33,29 +34,37 @@
 	{"hw.ncpufound", []_C_int{6, 21}},
 	{"hw.ncpuonline", []_C_int{6, 25}},
 	{"hw.pagesize", []_C_int{6, 7}},
+	{"hw.perfpolicy", []_C_int{6, 23}},
 	{"hw.physmem", []_C_int{6, 19}},
+	{"hw.power", []_C_int{6, 26}},
 	{"hw.product", []_C_int{6, 15}},
 	{"hw.serialno", []_C_int{6, 17}},
 	{"hw.setperf", []_C_int{6, 13}},
+	{"hw.smt", []_C_int{6, 24}},
 	{"hw.usermem", []_C_int{6, 20}},
 	{"hw.uuid", []_C_int{6, 18}},
 	{"hw.vendor", []_C_int{6, 14}},
 	{"hw.version", []_C_int{6, 16}},
-	{"kern.arandom", []_C_int{1, 37}},
+	{"kern.allowdt", []_C_int{1, 65}},
+	{"kern.allowkmem", []_C_int{1, 52}},
 	{"kern.argmax", []_C_int{1, 8}},
+	{"kern.audio", []_C_int{1, 84}},
 	{"kern.boottime", []_C_int{1, 21}},
 	{"kern.bufcachepercent", []_C_int{1, 72}},
 	{"kern.ccpu", []_C_int{1, 45}},
 	{"kern.clockrate", []_C_int{1, 12}},
+	{"kern.consbuf", []_C_int{1, 83}},
+	{"kern.consbufsize", []_C_int{1, 82}},
 	{"kern.consdev", []_C_int{1, 75}},
 	{"kern.cp_time", []_C_int{1, 40}},
 	{"kern.cp_time2", []_C_int{1, 71}},
-	{"kern.cryptodevallowsoft", []_C_int{1, 53}},
+	{"kern.cpustats", []_C_int{1, 85}},
 	{"kern.domainname", []_C_int{1, 22}},
 	{"kern.file", []_C_int{1, 73}},
 	{"kern.forkstat", []_C_int{1, 42}},
 	{"kern.fscale", []_C_int{1, 46}},
 	{"kern.fsync", []_C_int{1, 33}},
+	{"kern.global_ptrace", []_C_int{1, 81}},
 	{"kern.hostid", []_C_int{1, 11}},
 	{"kern.hostname", []_C_int{1, 10}},
 	{"kern.intrcnt.nintrcnt", []_C_int{1, 63, 1}},
@@ -78,17 +87,16 @@
 	{"kern.ngroups", []_C_int{1, 18}},
 	{"kern.nosuidcoredump", []_C_int{1, 32}},
 	{"kern.nprocs", []_C_int{1, 47}},
-	{"kern.nselcoll", []_C_int{1, 43}},
 	{"kern.nthreads", []_C_int{1, 26}},
 	{"kern.numvnodes", []_C_int{1, 58}},
 	{"kern.osrelease", []_C_int{1, 2}},
 	{"kern.osrevision", []_C_int{1, 3}},
 	{"kern.ostype", []_C_int{1, 1}},
 	{"kern.osversion", []_C_int{1, 27}},
+	{"kern.pfstatus", []_C_int{1, 86}},
 	{"kern.pool_debug", []_C_int{1, 77}},
 	{"kern.posix1version", []_C_int{1, 17}},
 	{"kern.proc", []_C_int{1, 66}},
-	{"kern.random", []_C_int{1, 31}},
 	{"kern.rawpartition", []_C_int{1, 24}},
 	{"kern.saved_ids", []_C_int{1, 20}},
 	{"kern.securelevel", []_C_int{1, 9}},
@@ -106,21 +114,20 @@
 	{"kern.timecounter.hardware", []_C_int{1, 69, 3}},
 	{"kern.timecounter.tick", []_C_int{1, 69, 1}},
 	{"kern.timecounter.timestepwarnings", []_C_int{1, 69, 2}},
-	{"kern.tty.maxptys", []_C_int{1, 44, 6}},
-	{"kern.tty.nptys", []_C_int{1, 44, 7}},
+	{"kern.timeout_stats", []_C_int{1, 87}},
 	{"kern.tty.tk_cancc", []_C_int{1, 44, 4}},
 	{"kern.tty.tk_nin", []_C_int{1, 44, 1}},
 	{"kern.tty.tk_nout", []_C_int{1, 44, 2}},
 	{"kern.tty.tk_rawcc", []_C_int{1, 44, 3}},
 	{"kern.tty.ttyinfo", []_C_int{1, 44, 5}},
 	{"kern.ttycount", []_C_int{1, 57}},
-	{"kern.userasymcrypto", []_C_int{1, 60}},
-	{"kern.usercrypto", []_C_int{1, 52}},
-	{"kern.usermount", []_C_int{1, 30}},
+	{"kern.utc_offset", []_C_int{1, 88}},
 	{"kern.version", []_C_int{1, 4}},
-	{"kern.vnode", []_C_int{1, 13}},
+	{"kern.video", []_C_int{1, 89}},
 	{"kern.watchdog.auto", []_C_int{1, 64, 2}},
 	{"kern.watchdog.period", []_C_int{1, 64, 1}},
+	{"kern.witnesswatch", []_C_int{1, 53}},
+	{"kern.wxabort", []_C_int{1, 74}},
 	{"net.bpf.bufsize", []_C_int{4, 31, 1}},
 	{"net.bpf.maxbufsize", []_C_int{4, 31, 2}},
 	{"net.inet.ah.enable", []_C_int{4, 2, 51, 1}},
@@ -148,7 +155,9 @@
 	{"net.inet.icmp.stats", []_C_int{4, 2, 1, 7}},
 	{"net.inet.icmp.tstamprepl", []_C_int{4, 2, 1, 6}},
 	{"net.inet.igmp.stats", []_C_int{4, 2, 2, 1}},
+	{"net.inet.ip.arpdown", []_C_int{4, 2, 0, 40}},
 	{"net.inet.ip.arpqueued", []_C_int{4, 2, 0, 36}},
+	{"net.inet.ip.arptimeout", []_C_int{4, 2, 0, 39}},
 	{"net.inet.ip.encdebug", []_C_int{4, 2, 0, 12}},
 	{"net.inet.ip.forwarding", []_C_int{4, 2, 0, 1}},
 	{"net.inet.ip.ifq.congestion", []_C_int{4, 2, 0, 30, 4}},
@@ -157,8 +166,10 @@
 	{"net.inet.ip.ifq.maxlen", []_C_int{4, 2, 0, 30, 2}},
 	{"net.inet.ip.maxqueue", []_C_int{4, 2, 0, 11}},
 	{"net.inet.ip.mforwarding", []_C_int{4, 2, 0, 31}},
+	{"net.inet.ip.mrtmfc", []_C_int{4, 2, 0, 37}},
 	{"net.inet.ip.mrtproto", []_C_int{4, 2, 0, 34}},
 	{"net.inet.ip.mrtstats", []_C_int{4, 2, 0, 35}},
+	{"net.inet.ip.mrtvif", []_C_int{4, 2, 0, 38}},
 	{"net.inet.ip.mtu", []_C_int{4, 2, 0, 4}},
 	{"net.inet.ip.mtudisc", []_C_int{4, 2, 0, 27}},
 	{"net.inet.ip.mtudisctimeout", []_C_int{4, 2, 0, 28}},
@@ -175,9 +186,7 @@
 	{"net.inet.ipcomp.stats", []_C_int{4, 2, 108, 2}},
 	{"net.inet.ipip.allow", []_C_int{4, 2, 4, 1}},
 	{"net.inet.ipip.stats", []_C_int{4, 2, 4, 2}},
-	{"net.inet.mobileip.allow", []_C_int{4, 2, 55, 1}},
 	{"net.inet.pfsync.stats", []_C_int{4, 2, 240, 1}},
-	{"net.inet.pim.stats", []_C_int{4, 2, 103, 1}},
 	{"net.inet.tcp.ackonpush", []_C_int{4, 2, 6, 13}},
 	{"net.inet.tcp.always_keepalive", []_C_int{4, 2, 6, 22}},
 	{"net.inet.tcp.baddynamic", []_C_int{4, 2, 6, 6}},
@@ -191,6 +200,7 @@
 	{"net.inet.tcp.reasslimit", []_C_int{4, 2, 6, 18}},
 	{"net.inet.tcp.rfc1323", []_C_int{4, 2, 6, 1}},
 	{"net.inet.tcp.rfc3390", []_C_int{4, 2, 6, 17}},
+	{"net.inet.tcp.rootonly", []_C_int{4, 2, 6, 24}},
 	{"net.inet.tcp.rstppslimit", []_C_int{4, 2, 6, 12}},
 	{"net.inet.tcp.sack", []_C_int{4, 2, 6, 10}},
 	{"net.inet.tcp.sackholelimit", []_C_int{4, 2, 6, 20}},
@@ -198,9 +208,12 @@
 	{"net.inet.tcp.stats", []_C_int{4, 2, 6, 21}},
 	{"net.inet.tcp.synbucketlimit", []_C_int{4, 2, 6, 16}},
 	{"net.inet.tcp.syncachelimit", []_C_int{4, 2, 6, 15}},
+	{"net.inet.tcp.synhashsize", []_C_int{4, 2, 6, 25}},
+	{"net.inet.tcp.synuselimit", []_C_int{4, 2, 6, 23}},
 	{"net.inet.udp.baddynamic", []_C_int{4, 2, 17, 2}},
 	{"net.inet.udp.checksum", []_C_int{4, 2, 17, 1}},
 	{"net.inet.udp.recvspace", []_C_int{4, 2, 17, 3}},
+	{"net.inet.udp.rootonly", []_C_int{4, 2, 17, 6}},
 	{"net.inet.udp.sendspace", []_C_int{4, 2, 17, 4}},
 	{"net.inet.udp.stats", []_C_int{4, 2, 17, 5}},
 	{"net.inet6.divert.recvspace", []_C_int{4, 24, 86, 1}},
@@ -213,13 +226,8 @@
 	{"net.inet6.icmp6.nd6_delay", []_C_int{4, 24, 30, 8}},
 	{"net.inet6.icmp6.nd6_maxnudhint", []_C_int{4, 24, 30, 15}},
 	{"net.inet6.icmp6.nd6_mmaxtries", []_C_int{4, 24, 30, 10}},
-	{"net.inet6.icmp6.nd6_prune", []_C_int{4, 24, 30, 6}},
 	{"net.inet6.icmp6.nd6_umaxtries", []_C_int{4, 24, 30, 9}},
-	{"net.inet6.icmp6.nd6_useloopback", []_C_int{4, 24, 30, 11}},
-	{"net.inet6.icmp6.nodeinfo", []_C_int{4, 24, 30, 13}},
-	{"net.inet6.icmp6.rediraccept", []_C_int{4, 24, 30, 2}},
 	{"net.inet6.icmp6.redirtimeout", []_C_int{4, 24, 30, 3}},
-	{"net.inet6.ip6.accept_rtadv", []_C_int{4, 24, 17, 12}},
 	{"net.inet6.ip6.auto_flowlabel", []_C_int{4, 24, 17, 17}},
 	{"net.inet6.ip6.dad_count", []_C_int{4, 24, 17, 16}},
 	{"net.inet6.ip6.dad_pending", []_C_int{4, 24, 17, 49}},
@@ -232,20 +240,19 @@
 	{"net.inet6.ip6.maxdynroutes", []_C_int{4, 24, 17, 48}},
 	{"net.inet6.ip6.maxfragpackets", []_C_int{4, 24, 17, 9}},
 	{"net.inet6.ip6.maxfrags", []_C_int{4, 24, 17, 41}},
-	{"net.inet6.ip6.maxifdefrouters", []_C_int{4, 24, 17, 47}},
-	{"net.inet6.ip6.maxifprefixes", []_C_int{4, 24, 17, 46}},
 	{"net.inet6.ip6.mforwarding", []_C_int{4, 24, 17, 42}},
+	{"net.inet6.ip6.mrtmfc", []_C_int{4, 24, 17, 53}},
+	{"net.inet6.ip6.mrtmif", []_C_int{4, 24, 17, 52}},
 	{"net.inet6.ip6.mrtproto", []_C_int{4, 24, 17, 8}},
 	{"net.inet6.ip6.mtudisctimeout", []_C_int{4, 24, 17, 50}},
 	{"net.inet6.ip6.multicast_mtudisc", []_C_int{4, 24, 17, 44}},
 	{"net.inet6.ip6.multipath", []_C_int{4, 24, 17, 43}},
 	{"net.inet6.ip6.neighborgcthresh", []_C_int{4, 24, 17, 45}},
 	{"net.inet6.ip6.redirect", []_C_int{4, 24, 17, 2}},
-	{"net.inet6.ip6.rr_prune", []_C_int{4, 24, 17, 22}},
+	{"net.inet6.ip6.soiikey", []_C_int{4, 24, 17, 54}},
 	{"net.inet6.ip6.sourcecheck", []_C_int{4, 24, 17, 10}},
 	{"net.inet6.ip6.sourcecheck_logint", []_C_int{4, 24, 17, 11}},
 	{"net.inet6.ip6.use_deprecated", []_C_int{4, 24, 17, 21}},
-	{"net.inet6.ip6.v6only", []_C_int{4, 24, 17, 24}},
 	{"net.key.sadb_dump", []_C_int{4, 30, 1}},
 	{"net.key.spd_dump", []_C_int{4, 30, 2}},
 	{"net.mpls.ifq.congestion", []_C_int{4, 33, 3, 4}},
@@ -254,12 +261,12 @@
 	{"net.mpls.ifq.maxlen", []_C_int{4, 33, 3, 2}},
 	{"net.mpls.mapttl_ip", []_C_int{4, 33, 5}},
 	{"net.mpls.mapttl_ip6", []_C_int{4, 33, 6}},
-	{"net.mpls.maxloop_inkernel", []_C_int{4, 33, 4}},
 	{"net.mpls.ttl", []_C_int{4, 33, 2}},
 	{"net.pflow.stats", []_C_int{4, 34, 1}},
 	{"net.pipex.enable", []_C_int{4, 35, 1}},
 	{"vm.anonmin", []_C_int{2, 7}},
 	{"vm.loadavg", []_C_int{2, 2}},
+	{"vm.malloc_conf", []_C_int{2, 12}},
 	{"vm.maxslp", []_C_int{2, 10}},
 	{"vm.nkmempages", []_C_int{2, 6}},
 	{"vm.psstrings", []_C_int{2, 3}},
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm64.go b/src/cmd/vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm64.go
index 154b57a..cbdda1a 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm64.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm64.go
@@ -36,6 +36,7 @@
 	{"hw.pagesize", []_C_int{6, 7}},
 	{"hw.perfpolicy", []_C_int{6, 23}},
 	{"hw.physmem", []_C_int{6, 19}},
+	{"hw.power", []_C_int{6, 26}},
 	{"hw.product", []_C_int{6, 15}},
 	{"hw.serialno", []_C_int{6, 17}},
 	{"hw.setperf", []_C_int{6, 13}},
@@ -44,6 +45,7 @@
 	{"hw.uuid", []_C_int{6, 18}},
 	{"hw.vendor", []_C_int{6, 14}},
 	{"hw.version", []_C_int{6, 16}},
+	{"kern.allowdt", []_C_int{1, 65}},
 	{"kern.allowkmem", []_C_int{1, 52}},
 	{"kern.argmax", []_C_int{1, 8}},
 	{"kern.audio", []_C_int{1, 84}},
@@ -51,6 +53,8 @@
 	{"kern.bufcachepercent", []_C_int{1, 72}},
 	{"kern.ccpu", []_C_int{1, 45}},
 	{"kern.clockrate", []_C_int{1, 12}},
+	{"kern.consbuf", []_C_int{1, 83}},
+	{"kern.consbufsize", []_C_int{1, 82}},
 	{"kern.consdev", []_C_int{1, 75}},
 	{"kern.cp_time", []_C_int{1, 40}},
 	{"kern.cp_time2", []_C_int{1, 71}},
@@ -83,13 +87,13 @@
 	{"kern.ngroups", []_C_int{1, 18}},
 	{"kern.nosuidcoredump", []_C_int{1, 32}},
 	{"kern.nprocs", []_C_int{1, 47}},
-	{"kern.nselcoll", []_C_int{1, 43}},
 	{"kern.nthreads", []_C_int{1, 26}},
 	{"kern.numvnodes", []_C_int{1, 58}},
 	{"kern.osrelease", []_C_int{1, 2}},
 	{"kern.osrevision", []_C_int{1, 3}},
 	{"kern.ostype", []_C_int{1, 1}},
 	{"kern.osversion", []_C_int{1, 27}},
+	{"kern.pfstatus", []_C_int{1, 86}},
 	{"kern.pool_debug", []_C_int{1, 77}},
 	{"kern.posix1version", []_C_int{1, 17}},
 	{"kern.proc", []_C_int{1, 66}},
@@ -110,13 +114,16 @@
 	{"kern.timecounter.hardware", []_C_int{1, 69, 3}},
 	{"kern.timecounter.tick", []_C_int{1, 69, 1}},
 	{"kern.timecounter.timestepwarnings", []_C_int{1, 69, 2}},
+	{"kern.timeout_stats", []_C_int{1, 87}},
 	{"kern.tty.tk_cancc", []_C_int{1, 44, 4}},
 	{"kern.tty.tk_nin", []_C_int{1, 44, 1}},
 	{"kern.tty.tk_nout", []_C_int{1, 44, 2}},
 	{"kern.tty.tk_rawcc", []_C_int{1, 44, 3}},
 	{"kern.tty.ttyinfo", []_C_int{1, 44, 5}},
 	{"kern.ttycount", []_C_int{1, 57}},
+	{"kern.utc_offset", []_C_int{1, 88}},
 	{"kern.version", []_C_int{1, 4}},
+	{"kern.video", []_C_int{1, 89}},
 	{"kern.watchdog.auto", []_C_int{1, 64, 2}},
 	{"kern.watchdog.period", []_C_int{1, 64, 1}},
 	{"kern.witnesswatch", []_C_int{1, 53}},
@@ -179,7 +186,6 @@
 	{"net.inet.ipcomp.stats", []_C_int{4, 2, 108, 2}},
 	{"net.inet.ipip.allow", []_C_int{4, 2, 4, 1}},
 	{"net.inet.ipip.stats", []_C_int{4, 2, 4, 2}},
-	{"net.inet.mobileip.allow", []_C_int{4, 2, 55, 1}},
 	{"net.inet.pfsync.stats", []_C_int{4, 2, 240, 1}},
 	{"net.inet.tcp.ackonpush", []_C_int{4, 2, 6, 13}},
 	{"net.inet.tcp.always_keepalive", []_C_int{4, 2, 6, 22}},
@@ -255,7 +261,6 @@
 	{"net.mpls.ifq.maxlen", []_C_int{4, 33, 3, 2}},
 	{"net.mpls.mapttl_ip", []_C_int{4, 33, 5}},
 	{"net.mpls.mapttl_ip6", []_C_int{4, 33, 6}},
-	{"net.mpls.maxloop_inkernel", []_C_int{4, 33, 4}},
 	{"net.mpls.ttl", []_C_int{4, 33, 2}},
 	{"net.pflow.stats", []_C_int{4, 34, 1}},
 	{"net.pipex.enable", []_C_int{4, 35, 1}},
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsysctl_openbsd_mips64.go b/src/cmd/vendor/golang.org/x/sys/unix/zsysctl_openbsd_mips64.go
index d96bb2b..f55eae1 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zsysctl_openbsd_mips64.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zsysctl_openbsd_mips64.go
@@ -36,6 +36,7 @@
 	{"hw.pagesize", []_C_int{6, 7}},
 	{"hw.perfpolicy", []_C_int{6, 23}},
 	{"hw.physmem", []_C_int{6, 19}},
+	{"hw.power", []_C_int{6, 26}},
 	{"hw.product", []_C_int{6, 15}},
 	{"hw.serialno", []_C_int{6, 17}},
 	{"hw.setperf", []_C_int{6, 13}},
@@ -86,7 +87,6 @@
 	{"kern.ngroups", []_C_int{1, 18}},
 	{"kern.nosuidcoredump", []_C_int{1, 32}},
 	{"kern.nprocs", []_C_int{1, 47}},
-	{"kern.nselcoll", []_C_int{1, 43}},
 	{"kern.nthreads", []_C_int{1, 26}},
 	{"kern.numvnodes", []_C_int{1, 58}},
 	{"kern.osrelease", []_C_int{1, 2}},
@@ -123,6 +123,7 @@
 	{"kern.ttycount", []_C_int{1, 57}},
 	{"kern.utc_offset", []_C_int{1, 88}},
 	{"kern.version", []_C_int{1, 4}},
+	{"kern.video", []_C_int{1, 89}},
 	{"kern.watchdog.auto", []_C_int{1, 64, 2}},
 	{"kern.watchdog.period", []_C_int{1, 64, 1}},
 	{"kern.witnesswatch", []_C_int{1, 53}},
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go b/src/cmd/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go
index 7ea4652..e6ed7d6 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go
@@ -372,6 +372,7 @@
 	SYS_LANDLOCK_CREATE_RULESET = 444
 	SYS_LANDLOCK_ADD_RULE       = 445
 	SYS_LANDLOCK_RESTRICT_SELF  = 446
+	SYS_MEMFD_SECRET            = 447
 	SYS_PROCESS_MRELEASE        = 448
 	SYS_FUTEX_WAITV             = 449
 	SYS_SET_MEMPOLICY_HOME_NODE = 450
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsysnum_openbsd_mips64.go b/src/cmd/vendor/golang.org/x/sys/unix/zsysnum_openbsd_mips64.go
index a37f773..01c43a0 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/zsysnum_openbsd_mips64.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/zsysnum_openbsd_mips64.go
@@ -6,6 +6,7 @@
 
 package unix
 
+// Deprecated: Use libc wrappers instead of direct syscalls.
 const (
 	SYS_EXIT           = 1   // { void sys_exit(int rval); }
 	SYS_FORK           = 2   // { int sys_fork(void); }
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go
index e2a64f0..690cefc 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go
@@ -151,6 +151,16 @@
 	_       [3]byte
 }
 
+type Attrlist struct {
+	Bitmapcount uint16
+	Reserved    uint16
+	Commonattr  uint32
+	Volattr     uint32
+	Dirattr     uint32
+	Fileattr    uint32
+	Forkattr    uint32
+}
+
 const (
 	PathMax = 0x400
 )
@@ -610,6 +620,7 @@
 	AT_REMOVEDIR        = 0x80
 	AT_SYMLINK_FOLLOW   = 0x40
 	AT_SYMLINK_NOFOLLOW = 0x20
+	AT_EACCESS          = 0x10
 )
 
 type PollFd struct {
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go
index 34aa775..5bffc10 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go
@@ -151,6 +151,16 @@
 	_       [3]byte
 }
 
+type Attrlist struct {
+	Bitmapcount uint16
+	Reserved    uint16
+	Commonattr  uint32
+	Volattr     uint32
+	Dirattr     uint32
+	Fileattr    uint32
+	Forkattr    uint32
+}
+
 const (
 	PathMax = 0x400
 )
@@ -610,6 +620,7 @@
 	AT_REMOVEDIR        = 0x80
 	AT_SYMLINK_FOLLOW   = 0x40
 	AT_SYMLINK_NOFOLLOW = 0x20
+	AT_EACCESS          = 0x10
 )
 
 type PollFd struct {
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go
index d9c78cd..29dc483 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go
@@ -362,7 +362,7 @@
 type PtraceIoDesc struct {
 	Op   int32
 	Offs uintptr
-	Addr uintptr
+	Addr *byte
 	Len  uint32
 }
 
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go
index 26991b1..0a89b28 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go
@@ -367,7 +367,7 @@
 type PtraceIoDesc struct {
 	Op   int32
 	Offs uintptr
-	Addr uintptr
+	Addr *byte
 	Len  uint64
 }
 
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go
index f8324e7..c8666bb 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go
@@ -350,7 +350,7 @@
 type PtraceIoDesc struct {
 	Op   int32
 	Offs uintptr
-	Addr uintptr
+	Addr *byte
 	Len  uint32
 }
 
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm64.go b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm64.go
index 4220411..88fb48a 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm64.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm64.go
@@ -347,7 +347,7 @@
 type PtraceIoDesc struct {
 	Op   int32
 	Offs uintptr
-	Addr uintptr
+	Addr *byte
 	Len  uint64
 }
 
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_freebsd_riscv64.go b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_freebsd_riscv64.go
index 0660fd4..698dc97 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_freebsd_riscv64.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_freebsd_riscv64.go
@@ -348,7 +348,7 @@
 type PtraceIoDesc struct {
 	Op   int32
 	Offs uintptr
-	Addr uintptr
+	Addr *byte
 	Len  uint64
 }
 
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux.go b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux.go
index ff68811..02e2462 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux.go
@@ -30,6 +30,41 @@
 }
 
 const (
+	ADJ_OFFSET            = 0x1
+	ADJ_FREQUENCY         = 0x2
+	ADJ_MAXERROR          = 0x4
+	ADJ_ESTERROR          = 0x8
+	ADJ_STATUS            = 0x10
+	ADJ_TIMECONST         = 0x20
+	ADJ_TAI               = 0x80
+	ADJ_SETOFFSET         = 0x100
+	ADJ_MICRO             = 0x1000
+	ADJ_NANO              = 0x2000
+	ADJ_TICK              = 0x4000
+	ADJ_OFFSET_SINGLESHOT = 0x8001
+	ADJ_OFFSET_SS_READ    = 0xa001
+)
+
+const (
+	STA_PLL       = 0x1
+	STA_PPSFREQ   = 0x2
+	STA_PPSTIME   = 0x4
+	STA_FLL       = 0x8
+	STA_INS       = 0x10
+	STA_DEL       = 0x20
+	STA_UNSYNC    = 0x40
+	STA_FREQHOLD  = 0x80
+	STA_PPSSIGNAL = 0x100
+	STA_PPSJITTER = 0x200
+	STA_PPSWANDER = 0x400
+	STA_PPSERROR  = 0x800
+	STA_CLOCKERR  = 0x1000
+	STA_NANO      = 0x2000
+	STA_MODE      = 0x4000
+	STA_CLK       = 0x8000
+)
+
+const (
 	TIME_OK    = 0x0
 	TIME_INS   = 0x1
 	TIME_DEL   = 0x2
@@ -53,29 +88,30 @@
 }
 
 type Statx_t struct {
-	Mask            uint32
-	Blksize         uint32
-	Attributes      uint64
-	Nlink           uint32
-	Uid             uint32
-	Gid             uint32
-	Mode            uint16
-	_               [1]uint16
-	Ino             uint64
-	Size            uint64
-	Blocks          uint64
-	Attributes_mask uint64
-	Atime           StatxTimestamp
-	Btime           StatxTimestamp
-	Ctime           StatxTimestamp
-	Mtime           StatxTimestamp
-	Rdev_major      uint32
-	Rdev_minor      uint32
-	Dev_major       uint32
-	Dev_minor       uint32
-	Mnt_id          uint64
-	_               uint64
-	_               [12]uint64
+	Mask             uint32
+	Blksize          uint32
+	Attributes       uint64
+	Nlink            uint32
+	Uid              uint32
+	Gid              uint32
+	Mode             uint16
+	_                [1]uint16
+	Ino              uint64
+	Size             uint64
+	Blocks           uint64
+	Attributes_mask  uint64
+	Atime            StatxTimestamp
+	Btime            StatxTimestamp
+	Ctime            StatxTimestamp
+	Mtime            StatxTimestamp
+	Rdev_major       uint32
+	Rdev_minor       uint32
+	Dev_major        uint32
+	Dev_minor        uint32
+	Mnt_id           uint64
+	Dio_mem_align    uint32
+	Dio_offset_align uint32
+	_                [12]uint64
 }
 
 type Fsid struct {
@@ -420,36 +456,60 @@
 }
 
 type TCPInfo struct {
-	State          uint8
-	Ca_state       uint8
-	Retransmits    uint8
-	Probes         uint8
-	Backoff        uint8
-	Options        uint8
-	Rto            uint32
-	Ato            uint32
-	Snd_mss        uint32
-	Rcv_mss        uint32
-	Unacked        uint32
-	Sacked         uint32
-	Lost           uint32
-	Retrans        uint32
-	Fackets        uint32
-	Last_data_sent uint32
-	Last_ack_sent  uint32
-	Last_data_recv uint32
-	Last_ack_recv  uint32
-	Pmtu           uint32
-	Rcv_ssthresh   uint32
-	Rtt            uint32
-	Rttvar         uint32
-	Snd_ssthresh   uint32
-	Snd_cwnd       uint32
-	Advmss         uint32
-	Reordering     uint32
-	Rcv_rtt        uint32
-	Rcv_space      uint32
-	Total_retrans  uint32
+	State           uint8
+	Ca_state        uint8
+	Retransmits     uint8
+	Probes          uint8
+	Backoff         uint8
+	Options         uint8
+	Rto             uint32
+	Ato             uint32
+	Snd_mss         uint32
+	Rcv_mss         uint32
+	Unacked         uint32
+	Sacked          uint32
+	Lost            uint32
+	Retrans         uint32
+	Fackets         uint32
+	Last_data_sent  uint32
+	Last_ack_sent   uint32
+	Last_data_recv  uint32
+	Last_ack_recv   uint32
+	Pmtu            uint32
+	Rcv_ssthresh    uint32
+	Rtt             uint32
+	Rttvar          uint32
+	Snd_ssthresh    uint32
+	Snd_cwnd        uint32
+	Advmss          uint32
+	Reordering      uint32
+	Rcv_rtt         uint32
+	Rcv_space       uint32
+	Total_retrans   uint32
+	Pacing_rate     uint64
+	Max_pacing_rate uint64
+	Bytes_acked     uint64
+	Bytes_received  uint64
+	Segs_out        uint32
+	Segs_in         uint32
+	Notsent_bytes   uint32
+	Min_rtt         uint32
+	Data_segs_in    uint32
+	Data_segs_out   uint32
+	Delivery_rate   uint64
+	Busy_time       uint64
+	Rwnd_limited    uint64
+	Sndbuf_limited  uint64
+	Delivered       uint32
+	Delivered_ce    uint32
+	Bytes_sent      uint64
+	Bytes_retrans   uint64
+	Dsack_dups      uint32
+	Reord_seen      uint32
+	Rcv_ooopack     uint32
+	Snd_wnd         uint32
+	Rcv_wnd         uint32
+	Rehash          uint32
 }
 
 type CanFilter struct {
@@ -492,7 +552,7 @@
 	SizeofIPv6MTUInfo       = 0x20
 	SizeofICMPv6Filter      = 0x20
 	SizeofUcred             = 0xc
-	SizeofTCPInfo           = 0x68
+	SizeofTCPInfo           = 0xf0
 	SizeofCanFilter         = 0x8
 	SizeofTCPRepairOpt      = 0x8
 )
@@ -1007,6 +1067,7 @@
 	PerfBitCommExec                      = CBitFieldMaskBit24
 	PerfBitUseClockID                    = CBitFieldMaskBit25
 	PerfBitContextSwitch                 = CBitFieldMaskBit26
+	PerfBitWriteBackward                 = CBitFieldMaskBit27
 )
 
 const (
@@ -1099,7 +1160,8 @@
 	PERF_SAMPLE_BRANCH_NO_CYCLES_SHIFT    = 0xf
 	PERF_SAMPLE_BRANCH_TYPE_SAVE_SHIFT    = 0x10
 	PERF_SAMPLE_BRANCH_HW_INDEX_SHIFT     = 0x11
-	PERF_SAMPLE_BRANCH_MAX_SHIFT          = 0x12
+	PERF_SAMPLE_BRANCH_PRIV_SAVE_SHIFT    = 0x12
+	PERF_SAMPLE_BRANCH_MAX_SHIFT          = 0x13
 	PERF_SAMPLE_BRANCH_USER               = 0x1
 	PERF_SAMPLE_BRANCH_KERNEL             = 0x2
 	PERF_SAMPLE_BRANCH_HV                 = 0x4
@@ -1118,7 +1180,8 @@
 	PERF_SAMPLE_BRANCH_NO_CYCLES          = 0x8000
 	PERF_SAMPLE_BRANCH_TYPE_SAVE          = 0x10000
 	PERF_SAMPLE_BRANCH_HW_INDEX           = 0x20000
-	PERF_SAMPLE_BRANCH_MAX                = 0x40000
+	PERF_SAMPLE_BRANCH_PRIV_SAVE          = 0x40000
+	PERF_SAMPLE_BRANCH_MAX                = 0x80000
 	PERF_BR_UNKNOWN                       = 0x0
 	PERF_BR_COND                          = 0x1
 	PERF_BR_UNCOND                        = 0x2
@@ -1132,7 +1195,10 @@
 	PERF_BR_COND_RET                      = 0xa
 	PERF_BR_ERET                          = 0xb
 	PERF_BR_IRQ                           = 0xc
-	PERF_BR_MAX                           = 0xd
+	PERF_BR_SERROR                        = 0xd
+	PERF_BR_NO_TX                         = 0xe
+	PERF_BR_EXTEND_ABI                    = 0xf
+	PERF_BR_MAX                           = 0x10
 	PERF_SAMPLE_REGS_ABI_NONE             = 0x0
 	PERF_SAMPLE_REGS_ABI_32               = 0x1
 	PERF_SAMPLE_REGS_ABI_64               = 0x2
@@ -1151,7 +1217,8 @@
 	PERF_FORMAT_TOTAL_TIME_RUNNING        = 0x2
 	PERF_FORMAT_ID                        = 0x4
 	PERF_FORMAT_GROUP                     = 0x8
-	PERF_FORMAT_MAX                       = 0x10
+	PERF_FORMAT_LOST                      = 0x10
+	PERF_FORMAT_MAX                       = 0x20
 	PERF_IOC_FLAG_GROUP                   = 0x1
 	PERF_RECORD_MMAP                      = 0x1
 	PERF_RECORD_LOST                      = 0x2
@@ -1197,7 +1264,7 @@
 	Flags     uint8
 	Prefixlen uint8
 	Keylen    uint16
-	_         uint32
+	Ifindex   int32
 	Key       [80]uint8
 }
 
@@ -1471,6 +1538,10 @@
 	IFLA_GRO_MAX_SIZE                          = 0x3a
 	IFLA_TSO_MAX_SIZE                          = 0x3b
 	IFLA_TSO_MAX_SEGS                          = 0x3c
+	IFLA_ALLMULTI                              = 0x3d
+	IFLA_DEVLINK_PORT                          = 0x3e
+	IFLA_GSO_IPV4_MAX_SIZE                     = 0x3f
+	IFLA_GRO_IPV4_MAX_SIZE                     = 0x40
 	IFLA_PROTO_DOWN_REASON_UNSPEC              = 0x0
 	IFLA_PROTO_DOWN_REASON_MASK                = 0x1
 	IFLA_PROTO_DOWN_REASON_VALUE               = 0x2
@@ -1897,7 +1968,11 @@
 	NFT_MSG_GETOBJ                    = 0x13
 	NFT_MSG_DELOBJ                    = 0x14
 	NFT_MSG_GETOBJ_RESET              = 0x15
-	NFT_MSG_MAX                       = 0x19
+	NFT_MSG_NEWFLOWTABLE              = 0x16
+	NFT_MSG_GETFLOWTABLE              = 0x17
+	NFT_MSG_DELFLOWTABLE              = 0x18
+	NFT_MSG_GETRULE_RESET             = 0x19
+	NFT_MSG_MAX                       = 0x21
 	NFTA_LIST_UNSPEC                  = 0x0
 	NFTA_LIST_ELEM                    = 0x1
 	NFTA_HOOK_UNSPEC                  = 0x0
@@ -2401,9 +2476,11 @@
 	SOF_TIMESTAMPING_OPT_STATS    = 0x1000
 	SOF_TIMESTAMPING_OPT_PKTINFO  = 0x2000
 	SOF_TIMESTAMPING_OPT_TX_SWHW  = 0x4000
+	SOF_TIMESTAMPING_BIND_PHC     = 0x8000
+	SOF_TIMESTAMPING_OPT_ID_TCP   = 0x10000
 
-	SOF_TIMESTAMPING_LAST = 0x8000
-	SOF_TIMESTAMPING_MASK = 0xffff
+	SOF_TIMESTAMPING_LAST = 0x10000
+	SOF_TIMESTAMPING_MASK = 0x1ffff
 
 	SCM_TSTAMP_SND   = 0x0
 	SCM_TSTAMP_SCHED = 0x1
@@ -2482,6 +2559,11 @@
 	BPF_REG_8                                  = 0x8
 	BPF_REG_9                                  = 0x9
 	BPF_REG_10                                 = 0xa
+	BPF_CGROUP_ITER_ORDER_UNSPEC               = 0x0
+	BPF_CGROUP_ITER_SELF_ONLY                  = 0x1
+	BPF_CGROUP_ITER_DESCENDANTS_PRE            = 0x2
+	BPF_CGROUP_ITER_DESCENDANTS_POST           = 0x3
+	BPF_CGROUP_ITER_ANCESTORS_UP               = 0x4
 	BPF_MAP_CREATE                             = 0x0
 	BPF_MAP_LOOKUP_ELEM                        = 0x1
 	BPF_MAP_UPDATE_ELEM                        = 0x2
@@ -2493,6 +2575,7 @@
 	BPF_PROG_ATTACH                            = 0x8
 	BPF_PROG_DETACH                            = 0x9
 	BPF_PROG_TEST_RUN                          = 0xa
+	BPF_PROG_RUN                               = 0xa
 	BPF_PROG_GET_NEXT_ID                       = 0xb
 	BPF_MAP_GET_NEXT_ID                        = 0xc
 	BPF_PROG_GET_FD_BY_ID                      = 0xd
@@ -2537,6 +2620,7 @@
 	BPF_MAP_TYPE_CPUMAP                        = 0x10
 	BPF_MAP_TYPE_XSKMAP                        = 0x11
 	BPF_MAP_TYPE_SOCKHASH                      = 0x12
+	BPF_MAP_TYPE_CGROUP_STORAGE_DEPRECATED     = 0x13
 	BPF_MAP_TYPE_CGROUP_STORAGE                = 0x13
 	BPF_MAP_TYPE_REUSEPORT_SOCKARRAY           = 0x14
 	BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE         = 0x15
@@ -2547,6 +2631,10 @@
 	BPF_MAP_TYPE_STRUCT_OPS                    = 0x1a
 	BPF_MAP_TYPE_RINGBUF                       = 0x1b
 	BPF_MAP_TYPE_INODE_STORAGE                 = 0x1c
+	BPF_MAP_TYPE_TASK_STORAGE                  = 0x1d
+	BPF_MAP_TYPE_BLOOM_FILTER                  = 0x1e
+	BPF_MAP_TYPE_USER_RINGBUF                  = 0x1f
+	BPF_MAP_TYPE_CGRP_STORAGE                  = 0x20
 	BPF_PROG_TYPE_UNSPEC                       = 0x0
 	BPF_PROG_TYPE_SOCKET_FILTER                = 0x1
 	BPF_PROG_TYPE_KPROBE                       = 0x2
@@ -2578,6 +2666,7 @@
 	BPF_PROG_TYPE_EXT                          = 0x1c
 	BPF_PROG_TYPE_LSM                          = 0x1d
 	BPF_PROG_TYPE_SK_LOOKUP                    = 0x1e
+	BPF_PROG_TYPE_SYSCALL                      = 0x1f
 	BPF_CGROUP_INET_INGRESS                    = 0x0
 	BPF_CGROUP_INET_EGRESS                     = 0x1
 	BPF_CGROUP_INET_SOCK_CREATE                = 0x2
@@ -2616,6 +2705,12 @@
 	BPF_XDP_CPUMAP                             = 0x23
 	BPF_SK_LOOKUP                              = 0x24
 	BPF_XDP                                    = 0x25
+	BPF_SK_SKB_VERDICT                         = 0x26
+	BPF_SK_REUSEPORT_SELECT                    = 0x27
+	BPF_SK_REUSEPORT_SELECT_OR_MIGRATE         = 0x28
+	BPF_PERF_EVENT                             = 0x29
+	BPF_TRACE_KPROBE_MULTI                     = 0x2a
+	BPF_LSM_CGROUP                             = 0x2b
 	BPF_LINK_TYPE_UNSPEC                       = 0x0
 	BPF_LINK_TYPE_RAW_TRACEPOINT               = 0x1
 	BPF_LINK_TYPE_TRACING                      = 0x2
@@ -2623,6 +2718,9 @@
 	BPF_LINK_TYPE_ITER                         = 0x4
 	BPF_LINK_TYPE_NETNS                        = 0x5
 	BPF_LINK_TYPE_XDP                          = 0x6
+	BPF_LINK_TYPE_PERF_EVENT                   = 0x7
+	BPF_LINK_TYPE_KPROBE_MULTI                 = 0x8
+	BPF_LINK_TYPE_STRUCT_OPS                   = 0x9
 	BPF_ANY                                    = 0x0
 	BPF_NOEXIST                                = 0x1
 	BPF_EXIST                                  = 0x2
@@ -2660,6 +2758,7 @@
 	BPF_F_ZERO_CSUM_TX                         = 0x2
 	BPF_F_DONT_FRAGMENT                        = 0x4
 	BPF_F_SEQ_NUMBER                           = 0x8
+	BPF_F_TUNINFO_FLAGS                        = 0x10
 	BPF_F_INDEX_MASK                           = 0xffffffff
 	BPF_F_CURRENT_CPU                          = 0xffffffff
 	BPF_F_CTXLEN_MASK                          = 0xfffff00000000
@@ -2674,6 +2773,7 @@
 	BPF_F_ADJ_ROOM_ENCAP_L4_GRE                = 0x8
 	BPF_F_ADJ_ROOM_ENCAP_L4_UDP                = 0x10
 	BPF_F_ADJ_ROOM_NO_CSUM_RESET               = 0x20
+	BPF_F_ADJ_ROOM_ENCAP_L2_ETH                = 0x40
 	BPF_ADJ_ROOM_ENCAP_L2_MASK                 = 0xff
 	BPF_ADJ_ROOM_ENCAP_L2_SHIFT                = 0x38
 	BPF_F_SYSCTL_BASE_NAME                     = 0x1
@@ -2698,10 +2798,16 @@
 	BPF_LWT_ENCAP_SEG6                         = 0x0
 	BPF_LWT_ENCAP_SEG6_INLINE                  = 0x1
 	BPF_LWT_ENCAP_IP                           = 0x2
+	BPF_F_BPRM_SECUREEXEC                      = 0x1
+	BPF_F_BROADCAST                            = 0x8
+	BPF_F_EXCLUDE_INGRESS                      = 0x10
+	BPF_SKB_TSTAMP_UNSPEC                      = 0x0
+	BPF_SKB_TSTAMP_DELIVERY_MONO               = 0x1
 	BPF_OK                                     = 0x0
 	BPF_DROP                                   = 0x2
 	BPF_REDIRECT                               = 0x7
 	BPF_LWT_REROUTE                            = 0x80
+	BPF_FLOW_DISSECTOR_CONTINUE                = 0x81
 	BPF_SOCK_OPS_RTO_CB_FLAG                   = 0x1
 	BPF_SOCK_OPS_RETRANS_CB_FLAG               = 0x2
 	BPF_SOCK_OPS_STATE_CB_FLAG                 = 0x4
@@ -2765,6 +2871,10 @@
 	BPF_FIB_LKUP_RET_UNSUPP_LWT                = 0x6
 	BPF_FIB_LKUP_RET_NO_NEIGH                  = 0x7
 	BPF_FIB_LKUP_RET_FRAG_NEEDED               = 0x8
+	BPF_MTU_CHK_SEGS                           = 0x1
+	BPF_MTU_CHK_RET_SUCCESS                    = 0x0
+	BPF_MTU_CHK_RET_FRAG_NEEDED                = 0x1
+	BPF_MTU_CHK_RET_SEGS_TOOBIG                = 0x2
 	BPF_FD_TYPE_RAW_TRACEPOINT                 = 0x0
 	BPF_FD_TYPE_TRACEPOINT                     = 0x1
 	BPF_FD_TYPE_KPROBE                         = 0x2
@@ -2774,6 +2884,19 @@
 	BPF_FLOW_DISSECTOR_F_PARSE_1ST_FRAG        = 0x1
 	BPF_FLOW_DISSECTOR_F_STOP_AT_FLOW_LABEL    = 0x2
 	BPF_FLOW_DISSECTOR_F_STOP_AT_ENCAP         = 0x4
+	BPF_CORE_FIELD_BYTE_OFFSET                 = 0x0
+	BPF_CORE_FIELD_BYTE_SIZE                   = 0x1
+	BPF_CORE_FIELD_EXISTS                      = 0x2
+	BPF_CORE_FIELD_SIGNED                      = 0x3
+	BPF_CORE_FIELD_LSHIFT_U64                  = 0x4
+	BPF_CORE_FIELD_RSHIFT_U64                  = 0x5
+	BPF_CORE_TYPE_ID_LOCAL                     = 0x6
+	BPF_CORE_TYPE_ID_TARGET                    = 0x7
+	BPF_CORE_TYPE_EXISTS                       = 0x8
+	BPF_CORE_TYPE_SIZE                         = 0x9
+	BPF_CORE_ENUMVAL_EXISTS                    = 0xa
+	BPF_CORE_ENUMVAL_VALUE                     = 0xb
+	BPF_CORE_TYPE_MATCHES                      = 0xc
 )
 
 const (
@@ -2979,7 +3102,16 @@
 	DEVLINK_CMD_TRAP_POLICER_NEW                       = 0x47
 	DEVLINK_CMD_TRAP_POLICER_DEL                       = 0x48
 	DEVLINK_CMD_HEALTH_REPORTER_TEST                   = 0x49
-	DEVLINK_CMD_MAX                                    = 0x51
+	DEVLINK_CMD_RATE_GET                               = 0x4a
+	DEVLINK_CMD_RATE_SET                               = 0x4b
+	DEVLINK_CMD_RATE_NEW                               = 0x4c
+	DEVLINK_CMD_RATE_DEL                               = 0x4d
+	DEVLINK_CMD_LINECARD_GET                           = 0x4e
+	DEVLINK_CMD_LINECARD_SET                           = 0x4f
+	DEVLINK_CMD_LINECARD_NEW                           = 0x50
+	DEVLINK_CMD_LINECARD_DEL                           = 0x51
+	DEVLINK_CMD_SELFTESTS_GET                          = 0x52
+	DEVLINK_CMD_MAX                                    = 0x53
 	DEVLINK_PORT_TYPE_NOTSET                           = 0x0
 	DEVLINK_PORT_TYPE_AUTO                             = 0x1
 	DEVLINK_PORT_TYPE_ETH                              = 0x2
@@ -3208,7 +3340,13 @@
 	DEVLINK_ATTR_RATE_NODE_NAME                        = 0xa8
 	DEVLINK_ATTR_RATE_PARENT_NODE_NAME                 = 0xa9
 	DEVLINK_ATTR_REGION_MAX_SNAPSHOTS                  = 0xaa
-	DEVLINK_ATTR_MAX                                   = 0xae
+	DEVLINK_ATTR_LINECARD_INDEX                        = 0xab
+	DEVLINK_ATTR_LINECARD_STATE                        = 0xac
+	DEVLINK_ATTR_LINECARD_TYPE                         = 0xad
+	DEVLINK_ATTR_LINECARD_SUPPORTED_TYPES              = 0xae
+	DEVLINK_ATTR_NESTED_DEVLINK                        = 0xaf
+	DEVLINK_ATTR_SELFTESTS                             = 0xb0
+	DEVLINK_ATTR_MAX                                   = 0xb3
 	DEVLINK_DPIPE_FIELD_MAPPING_TYPE_NONE              = 0x0
 	DEVLINK_DPIPE_FIELD_MAPPING_TYPE_IFINDEX           = 0x1
 	DEVLINK_DPIPE_MATCH_TYPE_FIELD_EXACT               = 0x0
@@ -3224,7 +3362,8 @@
 	DEVLINK_PORT_FUNCTION_ATTR_HW_ADDR                 = 0x1
 	DEVLINK_PORT_FN_ATTR_STATE                         = 0x2
 	DEVLINK_PORT_FN_ATTR_OPSTATE                       = 0x3
-	DEVLINK_PORT_FUNCTION_ATTR_MAX                     = 0x3
+	DEVLINK_PORT_FN_ATTR_CAPS                          = 0x4
+	DEVLINK_PORT_FUNCTION_ATTR_MAX                     = 0x4
 )
 
 type FsverityDigest struct {
@@ -3317,7 +3456,8 @@
 	LWTUNNEL_ENCAP_SEG6_LOCAL = 0x7
 	LWTUNNEL_ENCAP_RPL        = 0x8
 	LWTUNNEL_ENCAP_IOAM6      = 0x9
-	LWTUNNEL_ENCAP_MAX        = 0x9
+	LWTUNNEL_ENCAP_XFRM       = 0xa
+	LWTUNNEL_ENCAP_MAX        = 0xa
 
 	MPLS_IPTUNNEL_UNSPEC = 0x0
 	MPLS_IPTUNNEL_DST    = 0x1
@@ -3512,7 +3652,10 @@
 	ETHTOOL_MSG_PHC_VCLOCKS_GET               = 0x21
 	ETHTOOL_MSG_MODULE_GET                    = 0x22
 	ETHTOOL_MSG_MODULE_SET                    = 0x23
-	ETHTOOL_MSG_USER_MAX                      = 0x23
+	ETHTOOL_MSG_PSE_GET                       = 0x24
+	ETHTOOL_MSG_PSE_SET                       = 0x25
+	ETHTOOL_MSG_RSS_GET                       = 0x26
+	ETHTOOL_MSG_USER_MAX                      = 0x2b
 	ETHTOOL_MSG_KERNEL_NONE                   = 0x0
 	ETHTOOL_MSG_STRSET_GET_REPLY              = 0x1
 	ETHTOOL_MSG_LINKINFO_GET_REPLY            = 0x2
@@ -3550,7 +3693,9 @@
 	ETHTOOL_MSG_PHC_VCLOCKS_GET_REPLY         = 0x22
 	ETHTOOL_MSG_MODULE_GET_REPLY              = 0x23
 	ETHTOOL_MSG_MODULE_NTF                    = 0x24
-	ETHTOOL_MSG_KERNEL_MAX                    = 0x24
+	ETHTOOL_MSG_PSE_GET_REPLY                 = 0x25
+	ETHTOOL_MSG_RSS_GET_REPLY                 = 0x26
+	ETHTOOL_MSG_KERNEL_MAX                    = 0x2b
 	ETHTOOL_A_HEADER_UNSPEC                   = 0x0
 	ETHTOOL_A_HEADER_DEV_INDEX                = 0x1
 	ETHTOOL_A_HEADER_DEV_NAME                 = 0x2
@@ -3609,7 +3754,8 @@
 	ETHTOOL_A_LINKMODES_MASTER_SLAVE_CFG      = 0x7
 	ETHTOOL_A_LINKMODES_MASTER_SLAVE_STATE    = 0x8
 	ETHTOOL_A_LINKMODES_LANES                 = 0x9
-	ETHTOOL_A_LINKMODES_MAX                   = 0x9
+	ETHTOOL_A_LINKMODES_RATE_MATCHING         = 0xa
+	ETHTOOL_A_LINKMODES_MAX                   = 0xa
 	ETHTOOL_A_LINKSTATE_UNSPEC                = 0x0
 	ETHTOOL_A_LINKSTATE_HEADER                = 0x1
 	ETHTOOL_A_LINKSTATE_LINK                  = 0x2
@@ -3617,7 +3763,8 @@
 	ETHTOOL_A_LINKSTATE_SQI_MAX               = 0x4
 	ETHTOOL_A_LINKSTATE_EXT_STATE             = 0x5
 	ETHTOOL_A_LINKSTATE_EXT_SUBSTATE          = 0x6
-	ETHTOOL_A_LINKSTATE_MAX                   = 0x6
+	ETHTOOL_A_LINKSTATE_EXT_DOWN_CNT          = 0x7
+	ETHTOOL_A_LINKSTATE_MAX                   = 0x7
 	ETHTOOL_A_DEBUG_UNSPEC                    = 0x0
 	ETHTOOL_A_DEBUG_HEADER                    = 0x1
 	ETHTOOL_A_DEBUG_MSGMASK                   = 0x2
@@ -3652,7 +3799,7 @@
 	ETHTOOL_A_RINGS_TCP_DATA_SPLIT            = 0xb
 	ETHTOOL_A_RINGS_CQE_SIZE                  = 0xc
 	ETHTOOL_A_RINGS_TX_PUSH                   = 0xd
-	ETHTOOL_A_RINGS_MAX                       = 0xd
+	ETHTOOL_A_RINGS_MAX                       = 0x10
 	ETHTOOL_A_CHANNELS_UNSPEC                 = 0x0
 	ETHTOOL_A_CHANNELS_HEADER                 = 0x1
 	ETHTOOL_A_CHANNELS_RX_MAX                 = 0x2
@@ -3690,14 +3837,14 @@
 	ETHTOOL_A_COALESCE_RATE_SAMPLE_INTERVAL   = 0x17
 	ETHTOOL_A_COALESCE_USE_CQE_MODE_TX        = 0x18
 	ETHTOOL_A_COALESCE_USE_CQE_MODE_RX        = 0x19
-	ETHTOOL_A_COALESCE_MAX                    = 0x19
+	ETHTOOL_A_COALESCE_MAX                    = 0x1c
 	ETHTOOL_A_PAUSE_UNSPEC                    = 0x0
 	ETHTOOL_A_PAUSE_HEADER                    = 0x1
 	ETHTOOL_A_PAUSE_AUTONEG                   = 0x2
 	ETHTOOL_A_PAUSE_RX                        = 0x3
 	ETHTOOL_A_PAUSE_TX                        = 0x4
 	ETHTOOL_A_PAUSE_STATS                     = 0x5
-	ETHTOOL_A_PAUSE_MAX                       = 0x5
+	ETHTOOL_A_PAUSE_MAX                       = 0x6
 	ETHTOOL_A_PAUSE_STAT_UNSPEC               = 0x0
 	ETHTOOL_A_PAUSE_STAT_PAD                  = 0x1
 	ETHTOOL_A_PAUSE_STAT_TX_FRAMES            = 0x2
@@ -4201,6 +4348,9 @@
 	NL80211_ACL_POLICY_DENY_UNLESS_LISTED                   = 0x1
 	NL80211_AC_VI                                           = 0x1
 	NL80211_AC_VO                                           = 0x0
+	NL80211_AP_SETTINGS_EXTERNAL_AUTH_SUPPORT               = 0x1
+	NL80211_AP_SETTINGS_SA_QUERY_OFFLOAD_SUPPORT            = 0x2
+	NL80211_AP_SME_SA_QUERY_OFFLOAD                         = 0x1
 	NL80211_ATTR_4ADDR                                      = 0x53
 	NL80211_ATTR_ACK                                        = 0x5c
 	NL80211_ATTR_ACK_SIGNAL                                 = 0x107
@@ -4209,6 +4359,7 @@
 	NL80211_ATTR_AIRTIME_WEIGHT                             = 0x112
 	NL80211_ATTR_AKM_SUITES                                 = 0x4c
 	NL80211_ATTR_AP_ISOLATE                                 = 0x60
+	NL80211_ATTR_AP_SETTINGS_FLAGS                          = 0x135
 	NL80211_ATTR_AUTH_DATA                                  = 0x9c
 	NL80211_ATTR_AUTH_TYPE                                  = 0x35
 	NL80211_ATTR_BANDS                                      = 0xef
@@ -4240,6 +4391,9 @@
 	NL80211_ATTR_COALESCE_RULE_DELAY                        = 0x1
 	NL80211_ATTR_COALESCE_RULE_MAX                          = 0x3
 	NL80211_ATTR_COALESCE_RULE_PKT_PATTERN                  = 0x3
+	NL80211_ATTR_COLOR_CHANGE_COLOR                         = 0x130
+	NL80211_ATTR_COLOR_CHANGE_COUNT                         = 0x12f
+	NL80211_ATTR_COLOR_CHANGE_ELEMS                         = 0x131
 	NL80211_ATTR_CONN_FAILED_REASON                         = 0x9b
 	NL80211_ATTR_CONTROL_PORT                               = 0x44
 	NL80211_ATTR_CONTROL_PORT_ETHERTYPE                     = 0x66
@@ -4266,6 +4420,7 @@
 	NL80211_ATTR_DEVICE_AP_SME                              = 0x8d
 	NL80211_ATTR_DFS_CAC_TIME                               = 0x7
 	NL80211_ATTR_DFS_REGION                                 = 0x92
+	NL80211_ATTR_DISABLE_EHT                                = 0x137
 	NL80211_ATTR_DISABLE_HE                                 = 0x12d
 	NL80211_ATTR_DISABLE_HT                                 = 0x93
 	NL80211_ATTR_DISABLE_VHT                                = 0xaf
@@ -4273,6 +4428,8 @@
 	NL80211_ATTR_DONT_WAIT_FOR_ACK                          = 0x8e
 	NL80211_ATTR_DTIM_PERIOD                                = 0xd
 	NL80211_ATTR_DURATION                                   = 0x57
+	NL80211_ATTR_EHT_CAPABILITY                             = 0x136
+	NL80211_ATTR_EML_CAPABILITY                             = 0x13d
 	NL80211_ATTR_EXT_CAPA                                   = 0xa9
 	NL80211_ATTR_EXT_CAPA_MASK                              = 0xaa
 	NL80211_ATTR_EXTERNAL_AUTH_ACTION                       = 0x104
@@ -4337,10 +4494,11 @@
 	NL80211_ATTR_MAC_HINT                                   = 0xc8
 	NL80211_ATTR_MAC_MASK                                   = 0xd7
 	NL80211_ATTR_MAX_AP_ASSOC_STA                           = 0xca
-	NL80211_ATTR_MAX                                        = 0x137
+	NL80211_ATTR_MAX                                        = 0x145
 	NL80211_ATTR_MAX_CRIT_PROT_DURATION                     = 0xb4
 	NL80211_ATTR_MAX_CSA_COUNTERS                           = 0xce
 	NL80211_ATTR_MAX_MATCH_SETS                             = 0x85
+	NL80211_ATTR_MAX_NUM_AKM_SUITES                         = 0x13c
 	NL80211_ATTR_MAX_NUM_PMKIDS                             = 0x56
 	NL80211_ATTR_MAX_NUM_SCAN_SSIDS                         = 0x2b
 	NL80211_ATTR_MAX_NUM_SCHED_SCAN_PLANS                   = 0xde
@@ -4350,6 +4508,8 @@
 	NL80211_ATTR_MAX_SCAN_PLAN_INTERVAL                     = 0xdf
 	NL80211_ATTR_MAX_SCAN_PLAN_ITERATIONS                   = 0xe0
 	NL80211_ATTR_MAX_SCHED_SCAN_IE_LEN                      = 0x7c
+	NL80211_ATTR_MBSSID_CONFIG                              = 0x132
+	NL80211_ATTR_MBSSID_ELEMS                               = 0x133
 	NL80211_ATTR_MCAST_RATE                                 = 0x6b
 	NL80211_ATTR_MDID                                       = 0xb1
 	NL80211_ATTR_MEASUREMENT_DURATION                       = 0xeb
@@ -4359,6 +4519,11 @@
 	NL80211_ATTR_MESH_PEER_AID                              = 0xed
 	NL80211_ATTR_MESH_SETUP                                 = 0x70
 	NL80211_ATTR_MGMT_SUBTYPE                               = 0x29
+	NL80211_ATTR_MLD_ADDR                                   = 0x13a
+	NL80211_ATTR_MLD_CAPA_AND_OPS                           = 0x13e
+	NL80211_ATTR_MLO_LINK_ID                                = 0x139
+	NL80211_ATTR_MLO_LINKS                                  = 0x138
+	NL80211_ATTR_MLO_SUPPORT                                = 0x13b
 	NL80211_ATTR_MNTR_FLAGS                                 = 0x17
 	NL80211_ATTR_MPATH_INFO                                 = 0x1b
 	NL80211_ATTR_MPATH_NEXT_HOP                             = 0x1a
@@ -4371,6 +4536,7 @@
 	NL80211_ATTR_NETNS_FD                                   = 0xdb
 	NL80211_ATTR_NOACK_MAP                                  = 0x95
 	NL80211_ATTR_NSS                                        = 0x106
+	NL80211_ATTR_OBSS_COLOR_BITMAP                          = 0x12e
 	NL80211_ATTR_OFFCHANNEL_TX_OK                           = 0x6c
 	NL80211_ATTR_OPER_CLASS                                 = 0xd6
 	NL80211_ATTR_OPMODE_NOTIF                               = 0xc2
@@ -4397,6 +4563,7 @@
 	NL80211_ATTR_PROTOCOL_FEATURES                          = 0xad
 	NL80211_ATTR_PS_STATE                                   = 0x5d
 	NL80211_ATTR_QOS_MAP                                    = 0xc7
+	NL80211_ATTR_RADAR_BACKGROUND                           = 0x134
 	NL80211_ATTR_RADAR_EVENT                                = 0xa8
 	NL80211_ATTR_REASON_CODE                                = 0x36
 	NL80211_ATTR_RECEIVE_MULTICAST                          = 0x121
@@ -4412,6 +4579,7 @@
 	NL80211_ATTR_RESP_IE                                    = 0x4e
 	NL80211_ATTR_ROAM_SUPPORT                               = 0x83
 	NL80211_ATTR_RX_FRAME_TYPES                             = 0x64
+	NL80211_ATTR_RX_HW_TIMESTAMP                            = 0x140
 	NL80211_ATTR_RXMGMT_FLAGS                               = 0xbc
 	NL80211_ATTR_RX_SIGNAL_DBM                              = 0x97
 	NL80211_ATTR_S1G_CAPABILITY                             = 0x128
@@ -4469,6 +4637,7 @@
 	NL80211_ATTR_SUPPORT_MESH_AUTH                          = 0x73
 	NL80211_ATTR_SURVEY_INFO                                = 0x54
 	NL80211_ATTR_SURVEY_RADIO_STATS                         = 0xda
+	NL80211_ATTR_TD_BITMAP                                  = 0x141
 	NL80211_ATTR_TDLS_ACTION                                = 0x88
 	NL80211_ATTR_TDLS_DIALOG_TOKEN                          = 0x89
 	NL80211_ATTR_TDLS_EXTERNAL_SETUP                        = 0x8c
@@ -4484,6 +4653,7 @@
 	NL80211_ATTR_TSID                                       = 0xd2
 	NL80211_ATTR_TWT_RESPONDER                              = 0x116
 	NL80211_ATTR_TX_FRAME_TYPES                             = 0x63
+	NL80211_ATTR_TX_HW_TIMESTAMP                            = 0x13f
 	NL80211_ATTR_TX_NO_CCK_RATE                             = 0x87
 	NL80211_ATTR_TXQ_LIMIT                                  = 0x10a
 	NL80211_ATTR_TXQ_MEMORY_LIMIT                           = 0x10b
@@ -4553,10 +4723,14 @@
 	NL80211_BAND_ATTR_HT_CAPA                               = 0x4
 	NL80211_BAND_ATTR_HT_MCS_SET                            = 0x3
 	NL80211_BAND_ATTR_IFTYPE_DATA                           = 0x9
-	NL80211_BAND_ATTR_MAX                                   = 0xb
+	NL80211_BAND_ATTR_MAX                                   = 0xd
 	NL80211_BAND_ATTR_RATES                                 = 0x2
 	NL80211_BAND_ATTR_VHT_CAPA                              = 0x8
 	NL80211_BAND_ATTR_VHT_MCS_SET                           = 0x7
+	NL80211_BAND_IFTYPE_ATTR_EHT_CAP_MAC                    = 0x8
+	NL80211_BAND_IFTYPE_ATTR_EHT_CAP_MCS_SET                = 0xa
+	NL80211_BAND_IFTYPE_ATTR_EHT_CAP_PHY                    = 0x9
+	NL80211_BAND_IFTYPE_ATTR_EHT_CAP_PPE                    = 0xb
 	NL80211_BAND_IFTYPE_ATTR_HE_6GHZ_CAPA                   = 0x6
 	NL80211_BAND_IFTYPE_ATTR_HE_CAP_MAC                     = 0x2
 	NL80211_BAND_IFTYPE_ATTR_HE_CAP_MCS_SET                 = 0x4
@@ -4564,6 +4738,8 @@
 	NL80211_BAND_IFTYPE_ATTR_HE_CAP_PPE                     = 0x5
 	NL80211_BAND_IFTYPE_ATTR_IFTYPES                        = 0x1
 	NL80211_BAND_IFTYPE_ATTR_MAX                            = 0xb
+	NL80211_BAND_IFTYPE_ATTR_VENDOR_ELEMS                   = 0x7
+	NL80211_BAND_LC                                         = 0x5
 	NL80211_BAND_S1GHZ                                      = 0x4
 	NL80211_BITRATE_ATTR_2GHZ_SHORTPREAMBLE                 = 0x2
 	NL80211_BITRATE_ATTR_MAX                                = 0x2
@@ -4584,7 +4760,9 @@
 	NL80211_BSS_FREQUENCY_OFFSET                            = 0x14
 	NL80211_BSS_INFORMATION_ELEMENTS                        = 0x6
 	NL80211_BSS_LAST_SEEN_BOOTTIME                          = 0xf
-	NL80211_BSS_MAX                                         = 0x14
+	NL80211_BSS_MAX                                         = 0x16
+	NL80211_BSS_MLD_ADDR                                    = 0x16
+	NL80211_BSS_MLO_LINK_ID                                 = 0x15
 	NL80211_BSS_PAD                                         = 0x10
 	NL80211_BSS_PARENT_BSSID                                = 0x12
 	NL80211_BSS_PARENT_TSF                                  = 0x11
@@ -4612,6 +4790,7 @@
 	NL80211_CHAN_WIDTH_20                                   = 0x1
 	NL80211_CHAN_WIDTH_20_NOHT                              = 0x0
 	NL80211_CHAN_WIDTH_2                                    = 0x9
+	NL80211_CHAN_WIDTH_320                                  = 0xd
 	NL80211_CHAN_WIDTH_40                                   = 0x2
 	NL80211_CHAN_WIDTH_4                                    = 0xa
 	NL80211_CHAN_WIDTH_5                                    = 0x6
@@ -4621,8 +4800,11 @@
 	NL80211_CMD_ABORT_SCAN                                  = 0x72
 	NL80211_CMD_ACTION                                      = 0x3b
 	NL80211_CMD_ACTION_TX_STATUS                            = 0x3c
+	NL80211_CMD_ADD_LINK                                    = 0x94
+	NL80211_CMD_ADD_LINK_STA                                = 0x96
 	NL80211_CMD_ADD_NAN_FUNCTION                            = 0x75
 	NL80211_CMD_ADD_TX_TS                                   = 0x69
+	NL80211_CMD_ASSOC_COMEBACK                              = 0x93
 	NL80211_CMD_ASSOCIATE                                   = 0x26
 	NL80211_CMD_AUTHENTICATE                                = 0x25
 	NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL                    = 0x38
@@ -4630,6 +4812,10 @@
 	NL80211_CMD_CHANNEL_SWITCH                              = 0x66
 	NL80211_CMD_CH_SWITCH_NOTIFY                            = 0x58
 	NL80211_CMD_CH_SWITCH_STARTED_NOTIFY                    = 0x6e
+	NL80211_CMD_COLOR_CHANGE_ABORTED                        = 0x90
+	NL80211_CMD_COLOR_CHANGE_COMPLETED                      = 0x91
+	NL80211_CMD_COLOR_CHANGE_REQUEST                        = 0x8e
+	NL80211_CMD_COLOR_CHANGE_STARTED                        = 0x8f
 	NL80211_CMD_CONNECT                                     = 0x2e
 	NL80211_CMD_CONN_FAILED                                 = 0x5b
 	NL80211_CMD_CONTROL_PORT_FRAME                          = 0x81
@@ -4678,8 +4864,9 @@
 	NL80211_CMD_LEAVE_IBSS                                  = 0x2c
 	NL80211_CMD_LEAVE_MESH                                  = 0x45
 	NL80211_CMD_LEAVE_OCB                                   = 0x6d
-	NL80211_CMD_MAX                                         = 0x93
+	NL80211_CMD_MAX                                         = 0x99
 	NL80211_CMD_MICHAEL_MIC_FAILURE                         = 0x29
+	NL80211_CMD_MODIFY_LINK_STA                             = 0x97
 	NL80211_CMD_NAN_MATCH                                   = 0x78
 	NL80211_CMD_NEW_BEACON                                  = 0xf
 	NL80211_CMD_NEW_INTERFACE                               = 0x7
@@ -4692,6 +4879,7 @@
 	NL80211_CMD_NEW_WIPHY                                   = 0x3
 	NL80211_CMD_NOTIFY_CQM                                  = 0x40
 	NL80211_CMD_NOTIFY_RADAR                                = 0x86
+	NL80211_CMD_OBSS_COLOR_COLLISION                        = 0x8d
 	NL80211_CMD_PEER_MEASUREMENT_COMPLETE                   = 0x85
 	NL80211_CMD_PEER_MEASUREMENT_RESULT                     = 0x84
 	NL80211_CMD_PEER_MEASUREMENT_START                      = 0x83
@@ -4707,6 +4895,8 @@
 	NL80211_CMD_REGISTER_FRAME                              = 0x3a
 	NL80211_CMD_RELOAD_REGDB                                = 0x7e
 	NL80211_CMD_REMAIN_ON_CHANNEL                           = 0x37
+	NL80211_CMD_REMOVE_LINK                                 = 0x95
+	NL80211_CMD_REMOVE_LINK_STA                             = 0x98
 	NL80211_CMD_REQ_SET_REG                                 = 0x1b
 	NL80211_CMD_ROAM                                        = 0x2f
 	NL80211_CMD_SCAN_ABORTED                                = 0x23
@@ -4717,6 +4907,7 @@
 	NL80211_CMD_SET_CHANNEL                                 = 0x41
 	NL80211_CMD_SET_COALESCE                                = 0x65
 	NL80211_CMD_SET_CQM                                     = 0x3f
+	NL80211_CMD_SET_FILS_AAD                                = 0x92
 	NL80211_CMD_SET_INTERFACE                               = 0x6
 	NL80211_CMD_SET_KEY                                     = 0xa
 	NL80211_CMD_SET_MAC_ACL                                 = 0x5d
@@ -4791,6 +4982,8 @@
 	NL80211_EDMG_BW_CONFIG_MIN                              = 0x4
 	NL80211_EDMG_CHANNELS_MAX                               = 0x3c
 	NL80211_EDMG_CHANNELS_MIN                               = 0x1
+	NL80211_EHT_MAX_CAPABILITY_LEN                          = 0x33
+	NL80211_EHT_MIN_CAPABILITY_LEN                          = 0xd
 	NL80211_EXTERNAL_AUTH_ABORT                             = 0x1
 	NL80211_EXTERNAL_AUTH_START                             = 0x0
 	NL80211_EXT_FEATURE_4WAY_HANDSHAKE_AP_PSK               = 0x32
@@ -4807,6 +5000,7 @@
 	NL80211_EXT_FEATURE_BEACON_RATE_HT                      = 0x7
 	NL80211_EXT_FEATURE_BEACON_RATE_LEGACY                  = 0x6
 	NL80211_EXT_FEATURE_BEACON_RATE_VHT                     = 0x8
+	NL80211_EXT_FEATURE_BSS_COLOR                           = 0x3a
 	NL80211_EXT_FEATURE_BSS_PARENT_TSF                      = 0x4
 	NL80211_EXT_FEATURE_CAN_REPLACE_PTK0                    = 0x1f
 	NL80211_EXT_FEATURE_CONTROL_PORT_NO_PREAUTH             = 0x2a
@@ -4818,6 +5012,7 @@
 	NL80211_EXT_FEATURE_DFS_OFFLOAD                         = 0x19
 	NL80211_EXT_FEATURE_ENABLE_FTM_RESPONDER                = 0x20
 	NL80211_EXT_FEATURE_EXT_KEY_ID                          = 0x24
+	NL80211_EXT_FEATURE_FILS_CRYPTO_OFFLOAD                 = 0x3b
 	NL80211_EXT_FEATURE_FILS_DISCOVERY                      = 0x34
 	NL80211_EXT_FEATURE_FILS_MAX_CHANNEL_TIME               = 0x11
 	NL80211_EXT_FEATURE_FILS_SK_OFFLOAD                     = 0xe
@@ -4833,8 +5028,10 @@
 	NL80211_EXT_FEATURE_OCE_PROBE_REQ_DEFERRAL_SUPPRESSION  = 0x14
 	NL80211_EXT_FEATURE_OCE_PROBE_REQ_HIGH_TX_RATE          = 0x13
 	NL80211_EXT_FEATURE_OPERATING_CHANNEL_VALIDATION        = 0x31
+	NL80211_EXT_FEATURE_POWERED_ADDR_CHANGE                 = 0x3d
 	NL80211_EXT_FEATURE_PROTECTED_TWT                       = 0x2b
 	NL80211_EXT_FEATURE_PROT_RANGE_NEGO_AND_MEASURE         = 0x39
+	NL80211_EXT_FEATURE_RADAR_BACKGROUND                    = 0x3c
 	NL80211_EXT_FEATURE_RRM                                 = 0x1
 	NL80211_EXT_FEATURE_SAE_OFFLOAD_AP                      = 0x33
 	NL80211_EXT_FEATURE_SAE_OFFLOAD                         = 0x26
@@ -4906,7 +5103,9 @@
 	NL80211_FREQUENCY_ATTR_NO_10MHZ                         = 0x11
 	NL80211_FREQUENCY_ATTR_NO_160MHZ                        = 0xc
 	NL80211_FREQUENCY_ATTR_NO_20MHZ                         = 0x10
+	NL80211_FREQUENCY_ATTR_NO_320MHZ                        = 0x1a
 	NL80211_FREQUENCY_ATTR_NO_80MHZ                         = 0xb
+	NL80211_FREQUENCY_ATTR_NO_EHT                           = 0x1b
 	NL80211_FREQUENCY_ATTR_NO_HE                            = 0x13
 	NL80211_FREQUENCY_ATTR_NO_HT40_MINUS                    = 0x9
 	NL80211_FREQUENCY_ATTR_NO_HT40_PLUS                     = 0xa
@@ -5006,6 +5205,12 @@
 	NL80211_MAX_SUPP_HT_RATES                               = 0x4d
 	NL80211_MAX_SUPP_RATES                                  = 0x20
 	NL80211_MAX_SUPP_REG_RULES                              = 0x80
+	NL80211_MBSSID_CONFIG_ATTR_EMA                          = 0x5
+	NL80211_MBSSID_CONFIG_ATTR_INDEX                        = 0x3
+	NL80211_MBSSID_CONFIG_ATTR_MAX                          = 0x5
+	NL80211_MBSSID_CONFIG_ATTR_MAX_EMA_PROFILE_PERIODICITY  = 0x2
+	NL80211_MBSSID_CONFIG_ATTR_MAX_INTERFACES               = 0x1
+	NL80211_MBSSID_CONFIG_ATTR_TX_IFINDEX                   = 0x4
 	NL80211_MESHCONF_ATTR_MAX                               = 0x1f
 	NL80211_MESHCONF_AUTO_OPEN_PLINKS                       = 0x7
 	NL80211_MESHCONF_AWAKE_WINDOW                           = 0x1b
@@ -5168,6 +5373,7 @@
 	NL80211_PMSR_FTM_FAILURE_UNSPECIFIED                    = 0x0
 	NL80211_PMSR_FTM_FAILURE_WRONG_CHANNEL                  = 0x3
 	NL80211_PMSR_FTM_REQ_ATTR_ASAP                          = 0x1
+	NL80211_PMSR_FTM_REQ_ATTR_BSS_COLOR                     = 0xd
 	NL80211_PMSR_FTM_REQ_ATTR_BURST_DURATION                = 0x5
 	NL80211_PMSR_FTM_REQ_ATTR_BURST_PERIOD                  = 0x4
 	NL80211_PMSR_FTM_REQ_ATTR_FTMS_PER_BURST                = 0x6
@@ -5244,12 +5450,36 @@
 	NL80211_RADAR_PRE_CAC_EXPIRED                           = 0x4
 	NL80211_RATE_INFO_10_MHZ_WIDTH                          = 0xb
 	NL80211_RATE_INFO_160_MHZ_WIDTH                         = 0xa
+	NL80211_RATE_INFO_320_MHZ_WIDTH                         = 0x12
 	NL80211_RATE_INFO_40_MHZ_WIDTH                          = 0x3
 	NL80211_RATE_INFO_5_MHZ_WIDTH                           = 0xc
 	NL80211_RATE_INFO_80_MHZ_WIDTH                          = 0x8
 	NL80211_RATE_INFO_80P80_MHZ_WIDTH                       = 0x9
 	NL80211_RATE_INFO_BITRATE32                             = 0x5
 	NL80211_RATE_INFO_BITRATE                               = 0x1
+	NL80211_RATE_INFO_EHT_GI_0_8                            = 0x0
+	NL80211_RATE_INFO_EHT_GI_1_6                            = 0x1
+	NL80211_RATE_INFO_EHT_GI_3_2                            = 0x2
+	NL80211_RATE_INFO_EHT_GI                                = 0x15
+	NL80211_RATE_INFO_EHT_MCS                               = 0x13
+	NL80211_RATE_INFO_EHT_NSS                               = 0x14
+	NL80211_RATE_INFO_EHT_RU_ALLOC_106                      = 0x3
+	NL80211_RATE_INFO_EHT_RU_ALLOC_106P26                   = 0x4
+	NL80211_RATE_INFO_EHT_RU_ALLOC_242                      = 0x5
+	NL80211_RATE_INFO_EHT_RU_ALLOC_26                       = 0x0
+	NL80211_RATE_INFO_EHT_RU_ALLOC_2x996                    = 0xb
+	NL80211_RATE_INFO_EHT_RU_ALLOC_2x996P484                = 0xc
+	NL80211_RATE_INFO_EHT_RU_ALLOC_3x996                    = 0xd
+	NL80211_RATE_INFO_EHT_RU_ALLOC_3x996P484                = 0xe
+	NL80211_RATE_INFO_EHT_RU_ALLOC_484                      = 0x6
+	NL80211_RATE_INFO_EHT_RU_ALLOC_484P242                  = 0x7
+	NL80211_RATE_INFO_EHT_RU_ALLOC_4x996                    = 0xf
+	NL80211_RATE_INFO_EHT_RU_ALLOC_52                       = 0x1
+	NL80211_RATE_INFO_EHT_RU_ALLOC_52P26                    = 0x2
+	NL80211_RATE_INFO_EHT_RU_ALLOC_996                      = 0x8
+	NL80211_RATE_INFO_EHT_RU_ALLOC_996P484                  = 0x9
+	NL80211_RATE_INFO_EHT_RU_ALLOC_996P484P242              = 0xa
+	NL80211_RATE_INFO_EHT_RU_ALLOC                          = 0x16
 	NL80211_RATE_INFO_HE_1XLTF                              = 0x0
 	NL80211_RATE_INFO_HE_2XLTF                              = 0x1
 	NL80211_RATE_INFO_HE_4XLTF                              = 0x2
@@ -5292,6 +5522,7 @@
 	NL80211_RRF_GO_CONCURRENT                               = 0x1000
 	NL80211_RRF_IR_CONCURRENT                               = 0x1000
 	NL80211_RRF_NO_160MHZ                                   = 0x10000
+	NL80211_RRF_NO_320MHZ                                   = 0x40000
 	NL80211_RRF_NO_80MHZ                                    = 0x8000
 	NL80211_RRF_NO_CCK                                      = 0x2
 	NL80211_RRF_NO_HE                                       = 0x20000
@@ -5607,3 +5838,28 @@
 	AUDIT_NLGRP_NONE    = 0x0
 	AUDIT_NLGRP_READLOG = 0x1
 )
+
+const (
+	TUN_F_CSUM    = 0x1
+	TUN_F_TSO4    = 0x2
+	TUN_F_TSO6    = 0x4
+	TUN_F_TSO_ECN = 0x8
+	TUN_F_UFO     = 0x10
+	TUN_F_USO4    = 0x20
+	TUN_F_USO6    = 0x40
+)
+
+const (
+	VIRTIO_NET_HDR_F_NEEDS_CSUM = 0x1
+	VIRTIO_NET_HDR_F_DATA_VALID = 0x2
+	VIRTIO_NET_HDR_F_RSC_INFO   = 0x4
+)
+
+const (
+	VIRTIO_NET_HDR_GSO_NONE   = 0x0
+	VIRTIO_NET_HDR_GSO_TCPV4  = 0x1
+	VIRTIO_NET_HDR_GSO_UDP    = 0x3
+	VIRTIO_NET_HDR_GSO_TCPV6  = 0x4
+	VIRTIO_NET_HDR_GSO_UDP_L4 = 0x5
+	VIRTIO_NET_HDR_GSO_ECN    = 0x80
+)
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_386.go b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_386.go
index 89c516a..6d8acbc 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_386.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_386.go
@@ -337,6 +337,8 @@
 	Ac_exe_inode              uint64
 	Wpcopy_count              uint64
 	Wpcopy_delay_total        uint64
+	Irq_count                 uint64
+	Irq_delay_total           uint64
 }
 
 type cpuMask uint32
@@ -414,7 +416,7 @@
 
 type SockaddrStorage struct {
 	Family uint16
-	_      [122]int8
+	Data   [122]byte
 	_      uint32
 }
 
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go
index 62b4fb2..59293c6 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go
@@ -350,6 +350,8 @@
 	Ac_exe_inode              uint64
 	Wpcopy_count              uint64
 	Wpcopy_delay_total        uint64
+	Irq_count                 uint64
+	Irq_delay_total           uint64
 }
 
 type cpuMask uint64
@@ -427,7 +429,7 @@
 
 type SockaddrStorage struct {
 	Family uint16
-	_      [118]int8
+	Data   [118]byte
 	_      uint64
 }
 
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go
index e86b358..40cfa38 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go
@@ -328,6 +328,8 @@
 	Ac_exe_inode              uint64
 	Wpcopy_count              uint64
 	Wpcopy_delay_total        uint64
+	Irq_count                 uint64
+	Irq_delay_total           uint64
 }
 
 type cpuMask uint32
@@ -405,7 +407,7 @@
 
 type SockaddrStorage struct {
 	Family uint16
-	_      [122]uint8
+	Data   [122]byte
 	_      uint32
 }
 
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go
index 6c6be4c..055bc42 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go
@@ -329,6 +329,8 @@
 	Ac_exe_inode              uint64
 	Wpcopy_count              uint64
 	Wpcopy_delay_total        uint64
+	Irq_count                 uint64
+	Irq_delay_total           uint64
 }
 
 type cpuMask uint64
@@ -406,7 +408,7 @@
 
 type SockaddrStorage struct {
 	Family uint16
-	_      [118]int8
+	Data   [118]byte
 	_      uint64
 }
 
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_loong64.go b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_loong64.go
index 4982ea3..f28affb 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_loong64.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_loong64.go
@@ -330,6 +330,8 @@
 	Ac_exe_inode              uint64
 	Wpcopy_count              uint64
 	Wpcopy_delay_total        uint64
+	Irq_count                 uint64
+	Irq_delay_total           uint64
 }
 
 type cpuMask uint64
@@ -407,7 +409,7 @@
 
 type SockaddrStorage struct {
 	Family uint16
-	_      [118]int8
+	Data   [118]byte
 	_      uint64
 }
 
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go
index 173141a..9d71e7c 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go
@@ -333,6 +333,8 @@
 	Ac_exe_inode              uint64
 	Wpcopy_count              uint64
 	Wpcopy_delay_total        uint64
+	Irq_count                 uint64
+	Irq_delay_total           uint64
 }
 
 type cpuMask uint32
@@ -410,7 +412,7 @@
 
 type SockaddrStorage struct {
 	Family uint16
-	_      [122]int8
+	Data   [122]byte
 	_      uint32
 }
 
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go
index 93ae4c5..fd5ccd3 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go
@@ -332,6 +332,8 @@
 	Ac_exe_inode              uint64
 	Wpcopy_count              uint64
 	Wpcopy_delay_total        uint64
+	Irq_count                 uint64
+	Irq_delay_total           uint64
 }
 
 type cpuMask uint64
@@ -409,7 +411,7 @@
 
 type SockaddrStorage struct {
 	Family uint16
-	_      [118]int8
+	Data   [118]byte
 	_      uint64
 }
 
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go
index 4e4e510..7704de7 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go
@@ -332,6 +332,8 @@
 	Ac_exe_inode              uint64
 	Wpcopy_count              uint64
 	Wpcopy_delay_total        uint64
+	Irq_count                 uint64
+	Irq_delay_total           uint64
 }
 
 type cpuMask uint64
@@ -409,7 +411,7 @@
 
 type SockaddrStorage struct {
 	Family uint16
-	_      [118]int8
+	Data   [118]byte
 	_      uint64
 }
 
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go
index 3f5ba01..df00b87 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go
@@ -333,6 +333,8 @@
 	Ac_exe_inode              uint64
 	Wpcopy_count              uint64
 	Wpcopy_delay_total        uint64
+	Irq_count                 uint64
+	Irq_delay_total           uint64
 }
 
 type cpuMask uint32
@@ -410,7 +412,7 @@
 
 type SockaddrStorage struct {
 	Family uint16
-	_      [122]int8
+	Data   [122]byte
 	_      uint32
 }
 
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go
index 71dfe7c..0942840 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go
@@ -340,6 +340,8 @@
 	Ac_exe_inode              uint64
 	Wpcopy_count              uint64
 	Wpcopy_delay_total        uint64
+	Irq_count                 uint64
+	Irq_delay_total           uint64
 }
 
 type cpuMask uint32
@@ -417,7 +419,7 @@
 
 type SockaddrStorage struct {
 	Family uint16
-	_      [122]uint8
+	Data   [122]byte
 	_      uint32
 }
 
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go
index 3a2b7f0..0348743 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go
@@ -339,6 +339,8 @@
 	Ac_exe_inode              uint64
 	Wpcopy_count              uint64
 	Wpcopy_delay_total        uint64
+	Irq_count                 uint64
+	Irq_delay_total           uint64
 }
 
 type cpuMask uint64
@@ -416,7 +418,7 @@
 
 type SockaddrStorage struct {
 	Family uint16
-	_      [118]uint8
+	Data   [118]byte
 	_      uint64
 }
 
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go
index a52d627..bad0670 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go
@@ -339,6 +339,8 @@
 	Ac_exe_inode              uint64
 	Wpcopy_count              uint64
 	Wpcopy_delay_total        uint64
+	Irq_count                 uint64
+	Irq_delay_total           uint64
 }
 
 type cpuMask uint64
@@ -416,7 +418,7 @@
 
 type SockaddrStorage struct {
 	Family uint16
-	_      [118]uint8
+	Data   [118]byte
 	_      uint64
 }
 
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go
index dfc007d..9ea54b7 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go
@@ -357,6 +357,8 @@
 	Ac_exe_inode              uint64
 	Wpcopy_count              uint64
 	Wpcopy_delay_total        uint64
+	Irq_count                 uint64
+	Irq_delay_total           uint64
 }
 
 type cpuMask uint64
@@ -434,7 +436,7 @@
 
 type SockaddrStorage struct {
 	Family uint16
-	_      [118]uint8
+	Data   [118]byte
 	_      uint64
 }
 
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go
index b53cb91..aa268d0 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go
@@ -352,6 +352,8 @@
 	Ac_exe_inode              uint64
 	Wpcopy_count              uint64
 	Wpcopy_delay_total        uint64
+	Irq_count                 uint64
+	Irq_delay_total           uint64
 }
 
 type cpuMask uint64
@@ -429,7 +431,7 @@
 
 type SockaddrStorage struct {
 	Family uint16
-	_      [118]int8
+	Data   [118]byte
 	_      uint64
 }
 
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go
index fe0aa35..444045b 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go
@@ -334,6 +334,8 @@
 	Ac_exe_inode              uint64
 	Wpcopy_count              uint64
 	Wpcopy_delay_total        uint64
+	Irq_count                 uint64
+	Irq_delay_total           uint64
 }
 
 type cpuMask uint64
@@ -411,7 +413,7 @@
 
 type SockaddrStorage struct {
 	Family uint16
-	_      [118]int8
+	Data   [118]byte
 	_      uint64
 }
 
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go
index 2fd2060..9bc4c8f 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go
@@ -491,6 +491,90 @@
 	Machine  [256]byte
 }
 
+const SizeofUvmexp = 0x278
+
+type Uvmexp struct {
+	Pagesize           int64
+	Pagemask           int64
+	Pageshift          int64
+	Npages             int64
+	Free               int64
+	Active             int64
+	Inactive           int64
+	Paging             int64
+	Wired              int64
+	Zeropages          int64
+	Reserve_pagedaemon int64
+	Reserve_kernel     int64
+	Freemin            int64
+	Freetarg           int64
+	Inactarg           int64
+	Wiredmax           int64
+	Nswapdev           int64
+	Swpages            int64
+	Swpginuse          int64
+	Swpgonly           int64
+	Nswget             int64
+	Unused1            int64
+	Cpuhit             int64
+	Cpumiss            int64
+	Faults             int64
+	Traps              int64
+	Intrs              int64
+	Swtch              int64
+	Softs              int64
+	Syscalls           int64
+	Pageins            int64
+	Swapins            int64
+	Swapouts           int64
+	Pgswapin           int64
+	Pgswapout          int64
+	Forks              int64
+	Forks_ppwait       int64
+	Forks_sharevm      int64
+	Pga_zerohit        int64
+	Pga_zeromiss       int64
+	Zeroaborts         int64
+	Fltnoram           int64
+	Fltnoanon          int64
+	Fltpgwait          int64
+	Fltpgrele          int64
+	Fltrelck           int64
+	Fltrelckok         int64
+	Fltanget           int64
+	Fltanretry         int64
+	Fltamcopy          int64
+	Fltnamap           int64
+	Fltnomap           int64
+	Fltlget            int64
+	Fltget             int64
+	Flt_anon           int64
+	Flt_acow           int64
+	Flt_obj            int64
+	Flt_prcopy         int64
+	Flt_przero         int64
+	Pdwoke             int64
+	Pdrevs             int64
+	Unused4            int64
+	Pdfreed            int64
+	Pdscans            int64
+	Pdanscan           int64
+	Pdobscan           int64
+	Pdreact            int64
+	Pdbusy             int64
+	Pdpageouts         int64
+	Pdpending          int64
+	Pddeact            int64
+	Anonpages          int64
+	Filepages          int64
+	Execpages          int64
+	Colorhit           int64
+	Colormiss          int64
+	Ncolors            int64
+	Bootpages          int64
+	Poolpages          int64
+}
+
 const SizeofClockinfo = 0x14
 
 type Clockinfo struct {
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go
index 6a5a1a8..bb05f65 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go
@@ -499,6 +499,90 @@
 	Machine  [256]byte
 }
 
+const SizeofUvmexp = 0x278
+
+type Uvmexp struct {
+	Pagesize           int64
+	Pagemask           int64
+	Pageshift          int64
+	Npages             int64
+	Free               int64
+	Active             int64
+	Inactive           int64
+	Paging             int64
+	Wired              int64
+	Zeropages          int64
+	Reserve_pagedaemon int64
+	Reserve_kernel     int64
+	Freemin            int64
+	Freetarg           int64
+	Inactarg           int64
+	Wiredmax           int64
+	Nswapdev           int64
+	Swpages            int64
+	Swpginuse          int64
+	Swpgonly           int64
+	Nswget             int64
+	Unused1            int64
+	Cpuhit             int64
+	Cpumiss            int64
+	Faults             int64
+	Traps              int64
+	Intrs              int64
+	Swtch              int64
+	Softs              int64
+	Syscalls           int64
+	Pageins            int64
+	Swapins            int64
+	Swapouts           int64
+	Pgswapin           int64
+	Pgswapout          int64
+	Forks              int64
+	Forks_ppwait       int64
+	Forks_sharevm      int64
+	Pga_zerohit        int64
+	Pga_zeromiss       int64
+	Zeroaborts         int64
+	Fltnoram           int64
+	Fltnoanon          int64
+	Fltpgwait          int64
+	Fltpgrele          int64
+	Fltrelck           int64
+	Fltrelckok         int64
+	Fltanget           int64
+	Fltanretry         int64
+	Fltamcopy          int64
+	Fltnamap           int64
+	Fltnomap           int64
+	Fltlget            int64
+	Fltget             int64
+	Flt_anon           int64
+	Flt_acow           int64
+	Flt_obj            int64
+	Flt_prcopy         int64
+	Flt_przero         int64
+	Pdwoke             int64
+	Pdrevs             int64
+	Unused4            int64
+	Pdfreed            int64
+	Pdscans            int64
+	Pdanscan           int64
+	Pdobscan           int64
+	Pdreact            int64
+	Pdbusy             int64
+	Pdpageouts         int64
+	Pdpending          int64
+	Pddeact            int64
+	Anonpages          int64
+	Filepages          int64
+	Execpages          int64
+	Colorhit           int64
+	Colormiss          int64
+	Ncolors            int64
+	Bootpages          int64
+	Poolpages          int64
+}
+
 const SizeofClockinfo = 0x14
 
 type Clockinfo struct {
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go
index 84cc8d0..db40e3a 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go
@@ -496,6 +496,90 @@
 	Machine  [256]byte
 }
 
+const SizeofUvmexp = 0x278
+
+type Uvmexp struct {
+	Pagesize           int64
+	Pagemask           int64
+	Pageshift          int64
+	Npages             int64
+	Free               int64
+	Active             int64
+	Inactive           int64
+	Paging             int64
+	Wired              int64
+	Zeropages          int64
+	Reserve_pagedaemon int64
+	Reserve_kernel     int64
+	Freemin            int64
+	Freetarg           int64
+	Inactarg           int64
+	Wiredmax           int64
+	Nswapdev           int64
+	Swpages            int64
+	Swpginuse          int64
+	Swpgonly           int64
+	Nswget             int64
+	Unused1            int64
+	Cpuhit             int64
+	Cpumiss            int64
+	Faults             int64
+	Traps              int64
+	Intrs              int64
+	Swtch              int64
+	Softs              int64
+	Syscalls           int64
+	Pageins            int64
+	Swapins            int64
+	Swapouts           int64
+	Pgswapin           int64
+	Pgswapout          int64
+	Forks              int64
+	Forks_ppwait       int64
+	Forks_sharevm      int64
+	Pga_zerohit        int64
+	Pga_zeromiss       int64
+	Zeroaborts         int64
+	Fltnoram           int64
+	Fltnoanon          int64
+	Fltpgwait          int64
+	Fltpgrele          int64
+	Fltrelck           int64
+	Fltrelckok         int64
+	Fltanget           int64
+	Fltanretry         int64
+	Fltamcopy          int64
+	Fltnamap           int64
+	Fltnomap           int64
+	Fltlget            int64
+	Fltget             int64
+	Flt_anon           int64
+	Flt_acow           int64
+	Flt_obj            int64
+	Flt_prcopy         int64
+	Flt_przero         int64
+	Pdwoke             int64
+	Pdrevs             int64
+	Unused4            int64
+	Pdfreed            int64
+	Pdscans            int64
+	Pdanscan           int64
+	Pdobscan           int64
+	Pdreact            int64
+	Pdbusy             int64
+	Pdpageouts         int64
+	Pdpending          int64
+	Pddeact            int64
+	Anonpages          int64
+	Filepages          int64
+	Execpages          int64
+	Colorhit           int64
+	Colormiss          int64
+	Ncolors            int64
+	Bootpages          int64
+	Poolpages          int64
+}
+
 const SizeofClockinfo = 0x14
 
 type Clockinfo struct {
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm64.go b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm64.go
index c844e70..1112115 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm64.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm64.go
@@ -499,6 +499,90 @@
 	Machine  [256]byte
 }
 
+const SizeofUvmexp = 0x278
+
+type Uvmexp struct {
+	Pagesize           int64
+	Pagemask           int64
+	Pageshift          int64
+	Npages             int64
+	Free               int64
+	Active             int64
+	Inactive           int64
+	Paging             int64
+	Wired              int64
+	Zeropages          int64
+	Reserve_pagedaemon int64
+	Reserve_kernel     int64
+	Freemin            int64
+	Freetarg           int64
+	Inactarg           int64
+	Wiredmax           int64
+	Nswapdev           int64
+	Swpages            int64
+	Swpginuse          int64
+	Swpgonly           int64
+	Nswget             int64
+	Unused1            int64
+	Cpuhit             int64
+	Cpumiss            int64
+	Faults             int64
+	Traps              int64
+	Intrs              int64
+	Swtch              int64
+	Softs              int64
+	Syscalls           int64
+	Pageins            int64
+	Swapins            int64
+	Swapouts           int64
+	Pgswapin           int64
+	Pgswapout          int64
+	Forks              int64
+	Forks_ppwait       int64
+	Forks_sharevm      int64
+	Pga_zerohit        int64
+	Pga_zeromiss       int64
+	Zeroaborts         int64
+	Fltnoram           int64
+	Fltnoanon          int64
+	Fltpgwait          int64
+	Fltpgrele          int64
+	Fltrelck           int64
+	Fltrelckok         int64
+	Fltanget           int64
+	Fltanretry         int64
+	Fltamcopy          int64
+	Fltnamap           int64
+	Fltnomap           int64
+	Fltlget            int64
+	Fltget             int64
+	Flt_anon           int64
+	Flt_acow           int64
+	Flt_obj            int64
+	Flt_prcopy         int64
+	Flt_przero         int64
+	Pdwoke             int64
+	Pdrevs             int64
+	Unused4            int64
+	Pdfreed            int64
+	Pdscans            int64
+	Pdanscan           int64
+	Pdobscan           int64
+	Pdreact            int64
+	Pdbusy             int64
+	Pdpageouts         int64
+	Pdpending          int64
+	Pddeact            int64
+	Anonpages          int64
+	Filepages          int64
+	Execpages          int64
+	Colorhit           int64
+	Colormiss          int64
+	Ncolors            int64
+	Bootpages          int64
+	Poolpages          int64
+}
+
 const SizeofClockinfo = 0x14
 
 type Clockinfo struct {
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go
index 2ed718c..26eba23 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go
@@ -58,22 +58,22 @@
 type _Gid_t uint32
 
 type Stat_t struct {
-	Mode           uint32
-	Dev            int32
-	Ino            uint64
-	Nlink          uint32
-	Uid            uint32
-	Gid            uint32
-	Rdev           int32
-	Atim           Timespec
-	Mtim           Timespec
-	Ctim           Timespec
-	Size           int64
-	Blocks         int64
-	Blksize        uint32
-	Flags          uint32
-	Gen            uint32
-	X__st_birthtim Timespec
+	Mode    uint32
+	Dev     int32
+	Ino     uint64
+	Nlink   uint32
+	Uid     uint32
+	Gid     uint32
+	Rdev    int32
+	Atim    Timespec
+	Mtim    Timespec
+	Ctim    Timespec
+	Size    int64
+	Blocks  int64
+	Blksize int32
+	Flags   uint32
+	Gen     uint32
+	_       Timespec
 }
 
 type Statfs_t struct {
@@ -98,7 +98,7 @@
 	F_mntonname   [90]byte
 	F_mntfromname [90]byte
 	F_mntfromspec [90]byte
-	Pad_cgo_0     [2]byte
+	_             [2]byte
 	Mount_info    [160]byte
 }
 
@@ -111,13 +111,13 @@
 }
 
 type Dirent struct {
-	Fileno       uint64
-	Off          int64
-	Reclen       uint16
-	Type         uint8
-	Namlen       uint8
-	X__d_padding [4]uint8
-	Name         [256]int8
+	Fileno uint64
+	Off    int64
+	Reclen uint16
+	Type   uint8
+	Namlen uint8
+	_      [4]uint8
+	Name   [256]int8
 }
 
 type Fsid struct {
@@ -262,8 +262,8 @@
 }
 
 const (
-	SizeofIfMsghdr         = 0xec
-	SizeofIfData           = 0xd4
+	SizeofIfMsghdr         = 0xa0
+	SizeofIfData           = 0x88
 	SizeofIfaMsghdr        = 0x18
 	SizeofIfAnnounceMsghdr = 0x1a
 	SizeofRtMsghdr         = 0x60
@@ -292,7 +292,7 @@
 	Link_state   uint8
 	Mtu          uint32
 	Metric       uint32
-	Pad          uint32
+	Rdomain      uint32
 	Baudrate     uint64
 	Ipackets     uint64
 	Ierrors      uint64
@@ -304,10 +304,10 @@
 	Imcasts      uint64
 	Omcasts      uint64
 	Iqdrops      uint64
+	Oqdrops      uint64
 	Noproto      uint64
 	Capabilities uint32
 	Lastchange   Timeval
-	Mclpool      [7]Mclpool
 }
 
 type IfaMsghdr struct {
@@ -368,20 +368,12 @@
 	Pad      uint32
 }
 
-type Mclpool struct {
-	Grown int32
-	Alive uint16
-	Hwm   uint16
-	Cwm   uint16
-	Lwm   uint16
-}
-
 const (
 	SizeofBpfVersion = 0x4
 	SizeofBpfStat    = 0x8
 	SizeofBpfProgram = 0x8
 	SizeofBpfInsn    = 0x8
-	SizeofBpfHdr     = 0x14
+	SizeofBpfHdr     = 0x18
 )
 
 type BpfVersion struct {
@@ -407,11 +399,14 @@
 }
 
 type BpfHdr struct {
-	Tstamp    BpfTimeval
-	Caplen    uint32
-	Datalen   uint32
-	Hdrlen    uint16
-	Pad_cgo_0 [2]byte
+	Tstamp  BpfTimeval
+	Caplen  uint32
+	Datalen uint32
+	Hdrlen  uint16
+	Ifidx   uint16
+	Flowid  uint16
+	Flags   uint8
+	Drops   uint8
 }
 
 type BpfTimeval struct {
@@ -488,7 +483,7 @@
 	Zeropages          int32
 	Reserve_pagedaemon int32
 	Reserve_kernel     int32
-	Anonpages          int32
+	Unused01           int32
 	Vnodepages         int32
 	Vtextpages         int32
 	Freemin            int32
@@ -507,8 +502,8 @@
 	Swpgonly           int32
 	Nswget             int32
 	Nanon              int32
-	Nanonneeded        int32
-	Nfreeanon          int32
+	Unused05           int32
+	Unused06           int32
 	Faults             int32
 	Traps              int32
 	Intrs              int32
@@ -516,8 +511,8 @@
 	Softs              int32
 	Syscalls           int32
 	Pageins            int32
-	Obsolete_swapins   int32
-	Obsolete_swapouts  int32
+	Unused07           int32
+	Unused08           int32
 	Pgswapin           int32
 	Pgswapout          int32
 	Forks              int32
@@ -525,7 +520,7 @@
 	Forks_sharevm      int32
 	Pga_zerohit        int32
 	Pga_zeromiss       int32
-	Zeroaborts         int32
+	Unused09           int32
 	Fltnoram           int32
 	Fltnoanon          int32
 	Fltnoamap          int32
@@ -557,9 +552,9 @@
 	Pdpageouts         int32
 	Pdpending          int32
 	Pddeact            int32
-	Pdreanon           int32
-	Pdrevnode          int32
-	Pdrevtext          int32
+	Unused11           int32
+	Unused12           int32
+	Unused13           int32
 	Fpswtch            int32
 	Kmapent            int32
 }
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go
index b4fb97e..5a54798 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go
@@ -73,7 +73,6 @@
 	Blksize int32
 	Flags   uint32
 	Gen     uint32
-	_       [4]byte
 	_       Timespec
 }
 
@@ -81,7 +80,6 @@
 	F_flags       uint32
 	F_bsize       uint32
 	F_iosize      uint32
-	_             [4]byte
 	F_blocks      uint64
 	F_bfree       uint64
 	F_bavail      int64
@@ -200,10 +198,8 @@
 type Msghdr struct {
 	Name       *byte
 	Namelen    uint32
-	_          [4]byte
 	Iov        *Iovec
 	Iovlen     uint32
-	_          [4]byte
 	Control    *byte
 	Controllen uint32
 	Flags      int32
@@ -311,7 +307,6 @@
 	Oqdrops      uint64
 	Noproto      uint64
 	Capabilities uint32
-	_            [4]byte
 	Lastchange   Timeval
 }
 
@@ -373,14 +368,12 @@
 	Pad      uint32
 }
 
-type Mclpool struct{}
-
 const (
 	SizeofBpfVersion = 0x4
 	SizeofBpfStat    = 0x8
 	SizeofBpfProgram = 0x10
 	SizeofBpfInsn    = 0x8
-	SizeofBpfHdr     = 0x14
+	SizeofBpfHdr     = 0x18
 )
 
 type BpfVersion struct {
@@ -395,7 +388,6 @@
 
 type BpfProgram struct {
 	Len   uint32
-	_     [4]byte
 	Insns *BpfInsn
 }
 
@@ -411,7 +403,10 @@
 	Caplen  uint32
 	Datalen uint32
 	Hdrlen  uint16
-	_       [2]byte
+	Ifidx   uint16
+	Flowid  uint16
+	Flags   uint8
+	Drops   uint8
 }
 
 type BpfTimeval struct {
@@ -488,7 +483,7 @@
 	Zeropages          int32
 	Reserve_pagedaemon int32
 	Reserve_kernel     int32
-	Anonpages          int32
+	Unused01           int32
 	Vnodepages         int32
 	Vtextpages         int32
 	Freemin            int32
@@ -507,8 +502,8 @@
 	Swpgonly           int32
 	Nswget             int32
 	Nanon              int32
-	Nanonneeded        int32
-	Nfreeanon          int32
+	Unused05           int32
+	Unused06           int32
 	Faults             int32
 	Traps              int32
 	Intrs              int32
@@ -516,8 +511,8 @@
 	Softs              int32
 	Syscalls           int32
 	Pageins            int32
-	Obsolete_swapins   int32
-	Obsolete_swapouts  int32
+	Unused07           int32
+	Unused08           int32
 	Pgswapin           int32
 	Pgswapout          int32
 	Forks              int32
@@ -525,7 +520,7 @@
 	Forks_sharevm      int32
 	Pga_zerohit        int32
 	Pga_zeromiss       int32
-	Zeroaborts         int32
+	Unused09           int32
 	Fltnoram           int32
 	Fltnoanon          int32
 	Fltnoamap          int32
@@ -557,9 +552,9 @@
 	Pdpageouts         int32
 	Pdpending          int32
 	Pddeact            int32
-	Pdreanon           int32
-	Pdrevnode          int32
-	Pdrevtext          int32
+	Unused11           int32
+	Unused12           int32
+	Unused13           int32
 	Fpswtch            int32
 	Kmapent            int32
 }
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go
index 2c46750..be58c4e 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go
@@ -375,14 +375,12 @@
 	Pad      uint32
 }
 
-type Mclpool struct{}
-
 const (
 	SizeofBpfVersion = 0x4
 	SizeofBpfStat    = 0x8
 	SizeofBpfProgram = 0x8
 	SizeofBpfInsn    = 0x8
-	SizeofBpfHdr     = 0x14
+	SizeofBpfHdr     = 0x18
 )
 
 type BpfVersion struct {
@@ -412,7 +410,10 @@
 	Caplen  uint32
 	Datalen uint32
 	Hdrlen  uint16
-	_       [2]byte
+	Ifidx   uint16
+	Flowid  uint16
+	Flags   uint8
+	Drops   uint8
 }
 
 type BpfTimeval struct {
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm64.go b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm64.go
index ddee045..5233826 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm64.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm64.go
@@ -368,14 +368,12 @@
 	Pad      uint32
 }
 
-type Mclpool struct{}
-
 const (
 	SizeofBpfVersion = 0x4
 	SizeofBpfStat    = 0x8
 	SizeofBpfProgram = 0x10
 	SizeofBpfInsn    = 0x8
-	SizeofBpfHdr     = 0x14
+	SizeofBpfHdr     = 0x18
 )
 
 type BpfVersion struct {
@@ -405,7 +403,10 @@
 	Caplen  uint32
 	Datalen uint32
 	Hdrlen  uint16
-	_       [2]byte
+	Ifidx   uint16
+	Flowid  uint16
+	Flags   uint8
+	Drops   uint8
 }
 
 type BpfTimeval struct {
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_openbsd_mips64.go b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_openbsd_mips64.go
index eb13d4e..605cfdb 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_openbsd_mips64.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_openbsd_mips64.go
@@ -368,14 +368,12 @@
 	Pad      uint32
 }
 
-type Mclpool struct{}
-
 const (
 	SizeofBpfVersion = 0x4
 	SizeofBpfStat    = 0x8
 	SizeofBpfProgram = 0x10
 	SizeofBpfInsn    = 0x8
-	SizeofBpfHdr     = 0x14
+	SizeofBpfHdr     = 0x18
 )
 
 type BpfVersion struct {
@@ -405,7 +403,10 @@
 	Caplen  uint32
 	Datalen uint32
 	Hdrlen  uint16
-	_       [2]byte
+	Ifidx   uint16
+	Flowid  uint16
+	Flags   uint8
+	Drops   uint8
 }
 
 type BpfTimeval struct {
diff --git a/src/cmd/vendor/golang.org/x/sys/windows/env_windows.go b/src/cmd/vendor/golang.org/x/sys/windows/env_windows.go
index 92ac05f..b8ad192 100644
--- a/src/cmd/vendor/golang.org/x/sys/windows/env_windows.go
+++ b/src/cmd/vendor/golang.org/x/sys/windows/env_windows.go
@@ -37,14 +37,14 @@
 		return nil, err
 	}
 	defer DestroyEnvironmentBlock(block)
-	blockp := uintptr(unsafe.Pointer(block))
+	blockp := unsafe.Pointer(block)
 	for {
-		entry := UTF16PtrToString((*uint16)(unsafe.Pointer(blockp)))
+		entry := UTF16PtrToString((*uint16)(blockp))
 		if len(entry) == 0 {
 			break
 		}
 		env = append(env, entry)
-		blockp += 2 * (uintptr(len(entry)) + 1)
+		blockp = unsafe.Add(blockp, 2*(len(entry)+1))
 	}
 	return env, nil
 }
diff --git a/src/cmd/vendor/golang.org/x/sys/windows/exec_windows.go b/src/cmd/vendor/golang.org/x/sys/windows/exec_windows.go
index 75980fd..a52e033 100644
--- a/src/cmd/vendor/golang.org/x/sys/windows/exec_windows.go
+++ b/src/cmd/vendor/golang.org/x/sys/windows/exec_windows.go
@@ -95,12 +95,17 @@
 // DecomposeCommandLine breaks apart its argument command line into unescaped parts using CommandLineToArgv,
 // as gathered from GetCommandLine, QUERY_SERVICE_CONFIG's BinaryPathName argument, or elsewhere that
 // command lines are passed around.
+// DecomposeCommandLine returns error if commandLine contains NUL.
 func DecomposeCommandLine(commandLine string) ([]string, error) {
 	if len(commandLine) == 0 {
 		return []string{}, nil
 	}
+	utf16CommandLine, err := UTF16FromString(commandLine)
+	if err != nil {
+		return nil, errorspkg.New("string with NUL passed to DecomposeCommandLine")
+	}
 	var argc int32
-	argv, err := CommandLineToArgv(StringToUTF16Ptr(commandLine), &argc)
+	argv, err := CommandLineToArgv(&utf16CommandLine[0], &argc)
 	if err != nil {
 		return nil, err
 	}
diff --git a/src/cmd/vendor/golang.org/x/sys/windows/service.go b/src/cmd/vendor/golang.org/x/sys/windows/service.go
index f8deca8..c44a1b9 100644
--- a/src/cmd/vendor/golang.org/x/sys/windows/service.go
+++ b/src/cmd/vendor/golang.org/x/sys/windows/service.go
@@ -141,6 +141,12 @@
 	SERVICE_DYNAMIC_INFORMATION_LEVEL_START_REASON = 1
 )
 
+type ENUM_SERVICE_STATUS struct {
+	ServiceName   *uint16
+	DisplayName   *uint16
+	ServiceStatus SERVICE_STATUS
+}
+
 type SERVICE_STATUS struct {
 	ServiceType             uint32
 	CurrentState            uint32
@@ -212,6 +218,10 @@
 	Actions      *SC_ACTION
 }
 
+type SERVICE_FAILURE_ACTIONS_FLAG struct {
+	FailureActionsOnNonCrashFailures int32
+}
+
 type SC_ACTION struct {
 	Type  uint32
 	Delay uint32
@@ -245,3 +255,4 @@
 //sys	UnsubscribeServiceChangeNotifications(subscription uintptr) = sechost.UnsubscribeServiceChangeNotifications?
 //sys	RegisterServiceCtrlHandlerEx(serviceName *uint16, handlerProc uintptr, context uintptr) (handle Handle, err error) = advapi32.RegisterServiceCtrlHandlerExW
 //sys	QueryServiceDynamicInformation(service Handle, infoLevel uint32, dynamicInfo unsafe.Pointer) (err error) = advapi32.QueryServiceDynamicInformation?
+//sys	EnumDependentServices(service Handle, activityState uint32, services *ENUM_SERVICE_STATUS, buffSize uint32, bytesNeeded *uint32, servicesReturned *uint32) (err error) = advapi32.EnumDependentServicesW
diff --git a/src/cmd/vendor/golang.org/x/sys/windows/syscall_windows.go b/src/cmd/vendor/golang.org/x/sys/windows/syscall_windows.go
index a49853e..9645900 100644
--- a/src/cmd/vendor/golang.org/x/sys/windows/syscall_windows.go
+++ b/src/cmd/vendor/golang.org/x/sys/windows/syscall_windows.go
@@ -10,7 +10,6 @@
 	errorspkg "errors"
 	"fmt"
 	"runtime"
-	"strings"
 	"sync"
 	"syscall"
 	"time"
@@ -87,22 +86,13 @@
 // s, with a terminating NUL added. If s contains a NUL byte at any
 // location, it returns (nil, syscall.EINVAL).
 func UTF16FromString(s string) ([]uint16, error) {
-	if strings.IndexByte(s, 0) != -1 {
-		return nil, syscall.EINVAL
-	}
-	return utf16.Encode([]rune(s + "\x00")), nil
+	return syscall.UTF16FromString(s)
 }
 
 // UTF16ToString returns the UTF-8 encoding of the UTF-16 sequence s,
 // with a terminating NUL and any bytes after the NUL removed.
 func UTF16ToString(s []uint16) string {
-	for i, v := range s {
-		if v == 0 {
-			s = s[:i]
-			break
-		}
-	}
-	return string(utf16.Decode(s))
+	return syscall.UTF16ToString(s)
 }
 
 // StringToUTF16Ptr is deprecated. Use UTF16PtrFromString instead.
@@ -415,7 +405,7 @@
 //sys	VerQueryValue(block unsafe.Pointer, subBlock string, pointerToBufferPointer unsafe.Pointer, bufSize *uint32) (err error) = version.VerQueryValueW
 
 // Process Status API (PSAPI)
-//sys	EnumProcesses(processIds []uint32, bytesReturned *uint32) (err error) = psapi.EnumProcesses
+//sys	enumProcesses(processIds *uint32, nSize uint32, bytesReturned *uint32) (err error) = psapi.EnumProcesses
 //sys	EnumProcessModules(process Handle, module *Handle, cb uint32, cbNeeded *uint32) (err error) = psapi.EnumProcessModules
 //sys	EnumProcessModulesEx(process Handle, module *Handle, cb uint32, cbNeeded *uint32, filterFlag uint32) (err error) = psapi.EnumProcessModulesEx
 //sys	GetModuleInformation(process Handle, module Handle, modinfo *ModuleInfo, cb uint32) (err error) = psapi.GetModuleInformation
@@ -834,6 +824,9 @@
 //sys	WSAStartup(verreq uint32, data *WSAData) (sockerr error) = ws2_32.WSAStartup
 //sys	WSACleanup() (err error) [failretval==socket_error] = ws2_32.WSACleanup
 //sys	WSAIoctl(s Handle, iocc uint32, inbuf *byte, cbif uint32, outbuf *byte, cbob uint32, cbbr *uint32, overlapped *Overlapped, completionRoutine uintptr) (err error) [failretval==socket_error] = ws2_32.WSAIoctl
+//sys	WSALookupServiceBegin(querySet *WSAQUERYSET, flags uint32, handle *Handle) (err error) [failretval==socket_error] = ws2_32.WSALookupServiceBeginW
+//sys	WSALookupServiceNext(handle Handle, flags uint32, size *int32, querySet *WSAQUERYSET) (err error) [failretval==socket_error] = ws2_32.WSALookupServiceNextW
+//sys	WSALookupServiceEnd(handle Handle) (err error) [failretval==socket_error] = ws2_32.WSALookupServiceEnd
 //sys	socket(af int32, typ int32, protocol int32) (handle Handle, err error) [failretval==InvalidHandle] = ws2_32.socket
 //sys	sendto(s Handle, buf []byte, flags int32, to unsafe.Pointer, tolen int32) (err error) [failretval==socket_error] = ws2_32.sendto
 //sys	recvfrom(s Handle, buf []byte, flags int32, from *RawSockaddrAny, fromlen *int32) (n int32, err error) [failretval==-1] = ws2_32.recvfrom
@@ -1029,8 +1022,7 @@
 		for n < len(pp.Path) && pp.Path[n] != 0 {
 			n++
 		}
-		bytes := (*[len(pp.Path)]byte)(unsafe.Pointer(&pp.Path[0]))[0:n]
-		sa.Name = string(bytes)
+		sa.Name = string(unsafe.Slice((*byte)(unsafe.Pointer(&pp.Path[0])), n))
 		return sa, nil
 
 	case AF_INET:
@@ -1362,6 +1354,17 @@
 	return syscall.EWINDOWS
 }
 
+func EnumProcesses(processIds []uint32, bytesReturned *uint32) error {
+	// EnumProcesses syscall expects the size parameter to be in bytes, but the code generated with mksyscall uses
+	// the length of the processIds slice instead. Hence, this wrapper function is added to fix the discrepancy.
+	var p *uint32
+	if len(processIds) > 0 {
+		p = &processIds[0]
+	}
+	size := uint32(len(processIds) * 4)
+	return enumProcesses(p, size, bytesReturned)
+}
+
 func Getpid() (pid int) { return int(GetCurrentProcessId()) }
 
 func FindFirstFile(name *uint16, data *Win32finddata) (handle Handle, err error) {
diff --git a/src/cmd/vendor/golang.org/x/sys/windows/types_windows.go b/src/cmd/vendor/golang.org/x/sys/windows/types_windows.go
index 0c4add9..88e62a6 100644
--- a/src/cmd/vendor/golang.org/x/sys/windows/types_windows.go
+++ b/src/cmd/vendor/golang.org/x/sys/windows/types_windows.go
@@ -1243,6 +1243,51 @@
 	DnsSectionAdditional = 0x0003
 )
 
+const (
+	// flags of WSALookupService
+	LUP_DEEP                = 0x0001
+	LUP_CONTAINERS          = 0x0002
+	LUP_NOCONTAINERS        = 0x0004
+	LUP_NEAREST             = 0x0008
+	LUP_RETURN_NAME         = 0x0010
+	LUP_RETURN_TYPE         = 0x0020
+	LUP_RETURN_VERSION      = 0x0040
+	LUP_RETURN_COMMENT      = 0x0080
+	LUP_RETURN_ADDR         = 0x0100
+	LUP_RETURN_BLOB         = 0x0200
+	LUP_RETURN_ALIASES      = 0x0400
+	LUP_RETURN_QUERY_STRING = 0x0800
+	LUP_RETURN_ALL          = 0x0FF0
+	LUP_RES_SERVICE         = 0x8000
+
+	LUP_FLUSHCACHE    = 0x1000
+	LUP_FLUSHPREVIOUS = 0x2000
+
+	LUP_NON_AUTHORITATIVE      = 0x4000
+	LUP_SECURE                 = 0x8000
+	LUP_RETURN_PREFERRED_NAMES = 0x10000
+	LUP_DNS_ONLY               = 0x20000
+
+	LUP_ADDRCONFIG           = 0x100000
+	LUP_DUAL_ADDR            = 0x200000
+	LUP_FILESERVER           = 0x400000
+	LUP_DISABLE_IDN_ENCODING = 0x00800000
+	LUP_API_ANSI             = 0x01000000
+
+	LUP_RESOLUTION_HANDLE = 0x80000000
+)
+
+const (
+	// values of WSAQUERYSET's namespace
+	NS_ALL       = 0
+	NS_DNS       = 12
+	NS_NLA       = 15
+	NS_BTH       = 16
+	NS_EMAIL     = 37
+	NS_PNRPNAME  = 38
+	NS_PNRPCLOUD = 39
+)
+
 type DNSSRVData struct {
 	Target   *uint16
 	Priority uint16
@@ -2175,19 +2220,23 @@
 }
 
 const (
-	// JobObjectInformationClass
+	// JobObjectInformationClass for QueryInformationJobObject and SetInformationJobObject
 	JobObjectAssociateCompletionPortInformation = 7
+	JobObjectBasicAccountingInformation         = 1
+	JobObjectBasicAndIoAccountingInformation    = 8
 	JobObjectBasicLimitInformation              = 2
+	JobObjectBasicProcessIdList                 = 3
 	JobObjectBasicUIRestrictions                = 4
 	JobObjectCpuRateControlInformation          = 15
 	JobObjectEndOfJobTimeInformation            = 6
 	JobObjectExtendedLimitInformation           = 9
 	JobObjectGroupInformation                   = 11
 	JobObjectGroupInformationEx                 = 14
-	JobObjectLimitViolationInformation2         = 35
+	JobObjectLimitViolationInformation          = 13
+	JobObjectLimitViolationInformation2         = 34
 	JobObjectNetRateControlInformation          = 32
 	JobObjectNotificationLimitInformation       = 12
-	JobObjectNotificationLimitInformation2      = 34
+	JobObjectNotificationLimitInformation2      = 33
 	JobObjectSecurityLimitInformation           = 5
 )
 
@@ -3258,3 +3307,43 @@
 	DWMWA_TEXT_COLOR                     = 36
 	DWMWA_VISIBLE_FRAME_BORDER_THICKNESS = 37
 )
+
+type WSAQUERYSET struct {
+	Size                uint32
+	ServiceInstanceName *uint16
+	ServiceClassId      *GUID
+	Version             *WSAVersion
+	Comment             *uint16
+	NameSpace           uint32
+	NSProviderId        *GUID
+	Context             *uint16
+	NumberOfProtocols   uint32
+	AfpProtocols        *AFProtocols
+	QueryString         *uint16
+	NumberOfCsAddrs     uint32
+	SaBuffer            *CSAddrInfo
+	OutputFlags         uint32
+	Blob                *BLOB
+}
+
+type WSAVersion struct {
+	Version                 uint32
+	EnumerationOfComparison int32
+}
+
+type AFProtocols struct {
+	AddressFamily int32
+	Protocol      int32
+}
+
+type CSAddrInfo struct {
+	LocalAddr  SocketAddress
+	RemoteAddr SocketAddress
+	SocketType int32
+	Protocol   int32
+}
+
+type BLOB struct {
+	Size     uint32
+	BlobData *byte
+}
diff --git a/src/cmd/vendor/golang.org/x/sys/windows/zsyscall_windows.go b/src/cmd/vendor/golang.org/x/sys/windows/zsyscall_windows.go
index ac60052..566dd3e 100644
--- a/src/cmd/vendor/golang.org/x/sys/windows/zsyscall_windows.go
+++ b/src/cmd/vendor/golang.org/x/sys/windows/zsyscall_windows.go
@@ -86,6 +86,7 @@
 	procDeleteService                                        = modadvapi32.NewProc("DeleteService")
 	procDeregisterEventSource                                = modadvapi32.NewProc("DeregisterEventSource")
 	procDuplicateTokenEx                                     = modadvapi32.NewProc("DuplicateTokenEx")
+	procEnumDependentServicesW                               = modadvapi32.NewProc("EnumDependentServicesW")
 	procEnumServicesStatusExW                                = modadvapi32.NewProc("EnumServicesStatusExW")
 	procEqualSid                                             = modadvapi32.NewProc("EqualSid")
 	procFreeSid                                              = modadvapi32.NewProc("FreeSid")
@@ -474,6 +475,9 @@
 	procWSAEnumProtocolsW                                    = modws2_32.NewProc("WSAEnumProtocolsW")
 	procWSAGetOverlappedResult                               = modws2_32.NewProc("WSAGetOverlappedResult")
 	procWSAIoctl                                             = modws2_32.NewProc("WSAIoctl")
+	procWSALookupServiceBeginW                               = modws2_32.NewProc("WSALookupServiceBeginW")
+	procWSALookupServiceEnd                                  = modws2_32.NewProc("WSALookupServiceEnd")
+	procWSALookupServiceNextW                                = modws2_32.NewProc("WSALookupServiceNextW")
 	procWSARecv                                              = modws2_32.NewProc("WSARecv")
 	procWSARecvFrom                                          = modws2_32.NewProc("WSARecvFrom")
 	procWSASend                                              = modws2_32.NewProc("WSASend")
@@ -731,6 +735,14 @@
 	return
 }
 
+func EnumDependentServices(service Handle, activityState uint32, services *ENUM_SERVICE_STATUS, buffSize uint32, bytesNeeded *uint32, servicesReturned *uint32) (err error) {
+	r1, _, e1 := syscall.Syscall6(procEnumDependentServicesW.Addr(), 6, uintptr(service), uintptr(activityState), uintptr(unsafe.Pointer(services)), uintptr(buffSize), uintptr(unsafe.Pointer(bytesNeeded)), uintptr(unsafe.Pointer(servicesReturned)))
+	if r1 == 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
 func EnumServicesStatusEx(mgr Handle, infoLevel uint32, serviceType uint32, serviceState uint32, services *byte, bufSize uint32, bytesNeeded *uint32, servicesReturned *uint32, resumeHandle *uint32, groupName *uint16) (err error) {
 	r1, _, e1 := syscall.Syscall12(procEnumServicesStatusExW.Addr(), 10, uintptr(mgr), uintptr(infoLevel), uintptr(serviceType), uintptr(serviceState), uintptr(unsafe.Pointer(services)), uintptr(bufSize), uintptr(unsafe.Pointer(bytesNeeded)), uintptr(unsafe.Pointer(servicesReturned)), uintptr(unsafe.Pointer(resumeHandle)), uintptr(unsafe.Pointer(groupName)), 0, 0)
 	if r1 == 0 {
@@ -3504,12 +3516,8 @@
 	return
 }
 
-func EnumProcesses(processIds []uint32, bytesReturned *uint32) (err error) {
-	var _p0 *uint32
-	if len(processIds) > 0 {
-		_p0 = &processIds[0]
-	}
-	r1, _, e1 := syscall.Syscall(procEnumProcesses.Addr(), 3, uintptr(unsafe.Pointer(_p0)), uintptr(len(processIds)), uintptr(unsafe.Pointer(bytesReturned)))
+func enumProcesses(processIds *uint32, nSize uint32, bytesReturned *uint32) (err error) {
+	r1, _, e1 := syscall.Syscall(procEnumProcesses.Addr(), 3, uintptr(unsafe.Pointer(processIds)), uintptr(nSize), uintptr(unsafe.Pointer(bytesReturned)))
 	if r1 == 0 {
 		err = errnoErr(e1)
 	}
@@ -4067,6 +4075,30 @@
 	return
 }
 
+func WSALookupServiceBegin(querySet *WSAQUERYSET, flags uint32, handle *Handle) (err error) {
+	r1, _, e1 := syscall.Syscall(procWSALookupServiceBeginW.Addr(), 3, uintptr(unsafe.Pointer(querySet)), uintptr(flags), uintptr(unsafe.Pointer(handle)))
+	if r1 == socket_error {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+func WSALookupServiceEnd(handle Handle) (err error) {
+	r1, _, e1 := syscall.Syscall(procWSALookupServiceEnd.Addr(), 1, uintptr(handle), 0, 0)
+	if r1 == socket_error {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+func WSALookupServiceNext(handle Handle, flags uint32, size *int32, querySet *WSAQUERYSET) (err error) {
+	r1, _, e1 := syscall.Syscall6(procWSALookupServiceNextW.Addr(), 4, uintptr(handle), uintptr(flags), uintptr(unsafe.Pointer(size)), uintptr(unsafe.Pointer(querySet)), 0, 0)
+	if r1 == socket_error {
+		err = errnoErr(e1)
+	}
+	return
+}
+
 func WSARecv(s Handle, bufs *WSABuf, bufcnt uint32, recvd *uint32, flags *uint32, overlapped *Overlapped, croutine *byte) (err error) {
 	r1, _, e1 := syscall.Syscall9(procWSARecv.Addr(), 7, uintptr(s), uintptr(unsafe.Pointer(bufs)), uintptr(bufcnt), uintptr(unsafe.Pointer(recvd)), uintptr(unsafe.Pointer(flags)), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(croutine)), 0, 0)
 	if r1 == socket_error {
diff --git a/src/cmd/vendor/golang.org/x/term/term_unix.go b/src/cmd/vendor/golang.org/x/term/term_unix.go
index a4e31ab..62c2b3f 100644
--- a/src/cmd/vendor/golang.org/x/term/term_unix.go
+++ b/src/cmd/vendor/golang.org/x/term/term_unix.go
@@ -60,7 +60,7 @@
 func getSize(fd int) (width, height int, err error) {
 	ws, err := unix.IoctlGetWinsize(fd, unix.TIOCGWINSZ)
 	if err != nil {
-		return -1, -1, err
+		return 0, 0, err
 	}
 	return int(ws.Col), int(ws.Row), nil
 }
diff --git a/src/cmd/vendor/golang.org/x/tools/cmd/bisect/go119.go b/src/cmd/vendor/golang.org/x/tools/cmd/bisect/go119.go
new file mode 100644
index 0000000..debe4e0
--- /dev/null
+++ b/src/cmd/vendor/golang.org/x/tools/cmd/bisect/go119.go
@@ -0,0 +1,13 @@
+// Copyright 2023 The Go 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:build !go1.20
+
+package main
+
+import "os/exec"
+
+func cmdInterrupt(cmd *exec.Cmd) {
+	// cmd.Cancel and cmd.WaitDelay not available before Go 1.20.
+}
diff --git a/src/cmd/vendor/golang.org/x/tools/cmd/bisect/go120.go b/src/cmd/vendor/golang.org/x/tools/cmd/bisect/go120.go
new file mode 100644
index 0000000..c85edf7
--- /dev/null
+++ b/src/cmd/vendor/golang.org/x/tools/cmd/bisect/go120.go
@@ -0,0 +1,26 @@
+// Copyright 2023 The Go 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:build go1.20
+
+package main
+
+import (
+	"os"
+	"os/exec"
+	"time"
+)
+
+func cmdInterrupt(cmd *exec.Cmd) {
+	cmd.Cancel = func() error {
+		// On timeout, send interrupt,
+		// in hopes of shutting down process tree.
+		// Ignore errors sending signal; it's all best effort
+		// and not even implemented on Windows.
+		// TODO(rsc): Maybe use a new process group and kill the whole group?
+		cmd.Process.Signal(os.Interrupt)
+		return nil
+	}
+	cmd.WaitDelay = 2 * time.Second
+}
diff --git a/src/cmd/vendor/golang.org/x/tools/cmd/bisect/main.go b/src/cmd/vendor/golang.org/x/tools/cmd/bisect/main.go
new file mode 100644
index 0000000..6a3745c
--- /dev/null
+++ b/src/cmd/vendor/golang.org/x/tools/cmd/bisect/main.go
@@ -0,0 +1,733 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Bisect finds changes responsible for causing a failure.
+// A typical use is to identify the source locations in a program
+// that are miscompiled by a given compiler optimization.
+//
+// Usage:
+//
+//	bisect [flags] [var=value...] command [arguments...]
+//
+// Bisect operates on a target command line – the target – that can be
+// run with various changes individually enabled or disabled. With none
+// of the changes enabled, the target is known to succeed (exit with exit
+// code zero). With all the changes enabled, the target is known to fail
+// (exit any other way). Bisect repeats the target with different sets of
+// changes enabled, using binary search to find (non-overlapping) minimal
+// change sets that provoke the failure.
+//
+// The target must cooperate with bisect by accepting a change pattern
+// and then enabling and reporting the changes that match that pattern.
+// The change pattern is passed to the target by substituting it anywhere
+// the string PATTERN appears in the environment values or the command
+// arguments. For each change that matches the pattern, the target must
+// enable that change and also print one or more “match lines”
+// (to standard output or standard error) describing the change.
+// The [golang.org/x/tools/internal/bisect] package provides functions to help
+// targets implement this protocol. We plan to publish that package
+// in a non-internal location after finalizing its API.
+//
+// Bisect starts by running the target with no changes enabled and then
+// with all changes enabled. It expects the former to succeed and the latter to fail,
+// and then it will search for the minimal set of changes that must be enabled
+// to provoke the failure. If the situation is reversed – the target fails with no
+// changes enabled and succeeds with all changes enabled – then bisect
+// automatically runs in reverse as well, searching for the minimal set of changes
+// that must be disabled to provoke the failure.
+//
+// Bisect prints tracing logs to standard error and the minimal change sets
+// to standard output.
+//
+// # Command Line Flags
+//
+// Bisect supports the following command-line flags:
+//
+//	-max=M
+//
+// Stop after finding M minimal change sets. The default is no maximum, meaning to run until
+// all changes that provoke a failure have been identified.
+//
+//	-maxset=S
+//
+// Disallow change sets larger than S elements. The default is no maximum.
+//
+//	-timeout=D
+//
+// If the target runs for longer than duration D, stop the target and interpret that as a failure.
+// The default is no timeout.
+//
+//	-count=N
+//
+// Run each trial N times (default 2), checking for consistency.
+//
+//	-v
+//
+// Print verbose output, showing each run and its match lines.
+//
+// In addition to these general flags,
+// bisect supports a few “shortcut” flags that make it more convenient
+// to use with specific targets.
+//
+//	-compile=<rewrite>
+//
+// This flag is equivalent to adding an environment variable
+// “GOCOMPILEDEBUG=<rewrite>hash=PATTERN”,
+// which, as discussed in more detail in the example below,
+// allows bisect to identify the specific source locations where the
+// compiler rewrite causes the target to fail.
+//
+//	-godebug=<name>=<value>
+//
+// This flag is equivalent to adding an environment variable
+// “GODEBUG=<name>=<value>#PATTERN”,
+// which allows bisect to identify the specific call stacks where
+// the changed [GODEBUG setting] value causes the target to fail.
+//
+// # Example
+//
+// The Go compiler provides support for enabling or disabling certain rewrites
+// and optimizations to allow bisect to identify specific source locations where
+// the rewrite causes the program to fail. For example, to bisect a failure caused
+// by the new loop variable semantics:
+//
+//	bisect go test -gcflags=all=-d=loopvarhash=PATTERN
+//
+// The -gcflags=all= instructs the go command to pass the -d=... to the Go compiler
+// when compiling all packages. Bisect varies PATTERN to determine the minimal set of changes
+// needed to reproduce the failure.
+//
+// The go command also checks the GOCOMPILEDEBUG environment variable for flags
+// to pass to the compiler, so the above command is equivalent to:
+//
+//	bisect GOCOMPILEDEBUG=loopvarhash=PATTERN go test
+//
+// Finally, as mentioned earlier, the -compile flag allows shortening this command further:
+//
+//	bisect -compile=loopvar go test
+//
+// # Defeating Build Caches
+//
+// Build systems cache build results, to avoid repeating the same compilations
+// over and over. When using a cached build result, the go command (correctly)
+// reprints the cached standard output and standard error associated with that
+// command invocation. (This makes commands like 'go build -gcflags=-S' for
+// printing an assembly listing work reliably.)
+//
+// Unfortunately, most build systems, including Bazel, are not as careful
+// as the go command about reprinting compiler output. If the compiler is
+// what prints match lines, a build system that suppresses compiler
+// output when using cached compiler results will confuse bisect.
+// To defeat such build caches, bisect replaces the literal text “RANDOM”
+// in environment values and command arguments with a random 64-bit value
+// during each invocation. The Go compiler conveniently accepts a
+// -d=ignore=... debug flag that ignores its argument, so to run the
+// previous example using Bazel, the invocation is:
+//
+//	bazel test --define=gc_goopts=-d=loopvarhash=PATTERN,unused=RANDOM //path/to:test
+//
+// [GODEBUG setting]: https://tip.golang.org/doc/godebug
+package main
+
+import (
+	"context"
+	"flag"
+	"fmt"
+	"io"
+	"log"
+	"math/bits"
+	"math/rand"
+	"os"
+	"os/exec"
+	"sort"
+	"strconv"
+	"strings"
+	"time"
+
+	"golang.org/x/tools/internal/bisect"
+)
+
+// Preserve import of bisect, to allow [bisect.Match] in the doc comment.
+var _ bisect.Matcher
+
+func usage() {
+	fmt.Fprintf(os.Stderr, "usage: bisect [flags] [var=value...] command [arguments...]\n")
+	flag.PrintDefaults()
+	os.Exit(2)
+}
+
+func main() {
+	log.SetFlags(0)
+	log.SetPrefix("bisect: ")
+
+	var b Bisect
+	b.Stdout = os.Stdout
+	b.Stderr = os.Stderr
+	flag.IntVar(&b.Max, "max", 0, "stop after finding `m` failing change sets")
+	flag.IntVar(&b.MaxSet, "maxset", 0, "do not search for change sets larger than `s` elements")
+	flag.DurationVar(&b.Timeout, "timeout", 0, "stop target and consider failed after duration `d`")
+	flag.IntVar(&b.Count, "count", 2, "run target `n` times for each trial")
+	flag.BoolVar(&b.Verbose, "v", false, "enable verbose output")
+
+	env := ""
+	envFlag := ""
+	flag.Func("compile", "bisect source locations affected by Go compiler `rewrite` (fma, loopvar, ...)", func(value string) error {
+		if envFlag != "" {
+			return fmt.Errorf("cannot use -%s and -compile", envFlag)
+		}
+		envFlag = "compile"
+		env = "GOCOMPILEDEBUG=" + value + "hash=PATTERN"
+		return nil
+	})
+	flag.Func("godebug", "bisect call stacks affected by GODEBUG setting `name=value`", func(value string) error {
+		if envFlag != "" {
+			return fmt.Errorf("cannot use -%s and -godebug", envFlag)
+		}
+		envFlag = "godebug"
+		env = "GODEBUG=" + value + "#PATTERN"
+		return nil
+	})
+
+	flag.Usage = usage
+	flag.Parse()
+	args := flag.Args()
+
+	// Split command line into env settings, command name, args.
+	i := 0
+	for i < len(args) && strings.Contains(args[i], "=") {
+		i++
+	}
+	if i == len(args) {
+		usage()
+	}
+	b.Env, b.Cmd, b.Args = args[:i], args[i], args[i+1:]
+	if env != "" {
+		b.Env = append([]string{env}, b.Env...)
+	}
+
+	// Check that PATTERN is available for us to vary.
+	found := false
+	for _, e := range b.Env {
+		if _, v, _ := strings.Cut(e, "="); strings.Contains(v, "PATTERN") {
+			found = true
+		}
+	}
+	for _, a := range b.Args {
+		if strings.Contains(a, "PATTERN") {
+			found = true
+		}
+	}
+	if !found {
+		log.Fatalf("no PATTERN in target environment or args")
+	}
+
+	if !b.Search() {
+		os.Exit(1)
+	}
+}
+
+// A Bisect holds the state for a bisect invocation.
+type Bisect struct {
+	// Env is the additional environment variables for the command.
+	// PATTERN and RANDOM are substituted in the values, but not the names.
+	Env []string
+
+	// Cmd is the command (program name) to run.
+	// PATTERN and RANDOM are not substituted.
+	Cmd string
+
+	// Args is the command arguments.
+	// PATTERN and RANDOM are substituted anywhere they appear.
+	Args []string
+
+	// Command-line flags controlling bisect behavior.
+	Max     int           // maximum number of sets to report (0 = unlimited)
+	MaxSet  int           // maximum number of elements in a set (0 = unlimited)
+	Timeout time.Duration // kill target and assume failed after this duration (0 = unlimited)
+	Count   int           // run target this many times for each trial and give up if flaky (min 1 assumed; default 2 on command line set in main)
+	Verbose bool          // print long output about each trial (only useful for debugging bisect itself)
+
+	// State for running bisect, replaced during testing.
+	// Failing change sets are printed to Stdout; all other output goes to Stderr.
+	Stdout  io.Writer                                                             // where to write standard output (usually os.Stdout)
+	Stderr  io.Writer                                                             // where to write standard error (usually os.Stderr)
+	TestRun func(env []string, cmd string, args []string) (out []byte, err error) // if non-nil, used instead of exec.Command
+
+	// State maintained by Search.
+
+	// By default, Search looks for a minimal set of changes that cause a failure when enabled.
+	// If Disable is true, the search is inverted and seeks a minimal set of changes that
+	// cause a failure when disabled. In this case, the search proceeds as normal except that
+	// each pattern starts with a !.
+	Disable bool
+
+	// SkipDigits is the number of hex digits to use in skip messages.
+	// If the set of available changes is the same in each run, as it should be,
+	// then this doesn't matter: we'll only exclude suffixes that uniquely identify
+	// a given change. But for some programs, especially bisecting runtime
+	// behaviors, sometimes enabling one change unlocks questions about other
+	// changes. Strictly speaking this is a misuse of bisect, but just to make
+	// bisect more robust, we use the y and n runs to create an estimate of the
+	// number of bits needed for a unique suffix, and then we round it up to
+	// a number of hex digits, with one extra digit for good measure, and then
+	// we always use that many hex digits for skips.
+	SkipHexDigits int
+
+	// Add is a list of suffixes to add to every trial, because they
+	// contain changes that are necessary for a group we are assembling.
+	Add []string
+
+	// Skip is a list of suffixes that uniquely identify changes to exclude from every trial,
+	// because they have already been used in failing change sets.
+	// Suffixes later in the list may only be unique after removing
+	// the ones earlier in the list.
+	// Skip applies after Add.
+	Skip []string
+}
+
+// A Result holds the result of a single target trial.
+type Result struct {
+	Success bool   // whether the target succeeded (exited with zero status)
+	Cmd     string // full target command line
+	Out     string // full target output (stdout and stderr combined)
+
+	Suffix    string   // the suffix used for collecting MatchIDs, MatchText, and MatchFull
+	MatchIDs  []uint64 // match IDs enabled during this trial
+	MatchText []string // match reports for the IDs, with match markers removed
+	MatchFull []string // full match lines for the IDs, with match markers kept
+}
+
+// &searchFatal is a special panic value to signal that Search failed.
+// This lets us unwind the search recursion on a fatal error
+// but have Search return normally.
+var searchFatal int
+
+// Search runs a bisect search according to the configuration in b.
+// It reports whether any failing change sets were found.
+func (b *Bisect) Search() bool {
+	defer func() {
+		// Recover from panic(&searchFatal), implicitly returning false from Search.
+		// Re-panic on any other panic.
+		if e := recover(); e != nil && e != &searchFatal {
+			panic(e)
+		}
+	}()
+
+	// Run with no changes and all changes, to figure out which direction we're searching.
+	// The goal is to find the minimal set of changes to toggle
+	// starting with the state where everything works.
+	// If "no changes" succeeds and "all changes" fails,
+	// we're looking for a minimal set of changes to enable to provoke the failure
+	// (broken = runY, b.Negate = false)
+	// If "no changes" fails and "all changes" succeeds,
+	// we're looking for a minimal set of changes to disable to provoke the failure
+	// (broken = runN, b.Negate = true).
+
+	b.Logf("checking target with all changes disabled")
+	runN := b.Run("n")
+
+	b.Logf("checking target with all changes enabled")
+	runY := b.Run("y")
+
+	var broken *Result
+	switch {
+	case runN.Success && !runY.Success:
+		b.Logf("target succeeds with no changes, fails with all changes")
+		b.Logf("searching for minimal set of enabled changes causing failure")
+		broken = runY
+		b.Disable = false
+
+	case !runN.Success && runY.Success:
+		b.Logf("target fails with no changes, succeeds with all changes")
+		b.Logf("searching for minimal set of disabled changes causing failure")
+		broken = runN
+		b.Disable = true
+
+	case runN.Success && runY.Success:
+		b.Fatalf("target succeeds with no changes and all changes")
+
+	case !runN.Success && !runY.Success:
+		b.Fatalf("target fails with no changes and all changes")
+	}
+
+	// Compute minimum number of bits needed to distinguish
+	// all the changes we saw during N and all the changes we saw during Y.
+	b.SkipHexDigits = skipHexDigits(runN.MatchIDs, runY.MatchIDs)
+
+	// Loop finding and printing change sets, until none remain.
+	found := 0
+	for {
+		// Find set.
+		bad := b.search(broken)
+		if bad == nil {
+			if found == 0 {
+				b.Fatalf("cannot find any failing change sets of size ≤ %d", b.MaxSet)
+			}
+			break
+		}
+
+		// Confirm that set really does fail, to avoid false accusations.
+		// Also asking for user-visible output; earlier runs did not.
+		b.Logf("confirming failing change set")
+		b.Add = append(b.Add[:0], bad...)
+		broken = b.Run("v")
+		if broken.Success {
+			b.Logf("confirmation run succeeded unexpectedly")
+		}
+		b.Add = b.Add[:0]
+
+		// Print confirmed change set.
+		found++
+		b.Logf("FOUND failing change set")
+		desc := "(enabling changes causes failure)"
+		if b.Disable {
+			desc = "(disabling changes causes failure)"
+		}
+		fmt.Fprintf(b.Stdout, "--- change set #%d %s\n%s\n---\n", found, desc, strings.Join(broken.MatchText, "\n"))
+
+		// Stop if we've found enough change sets.
+		if b.Max > 0 && found >= b.Max {
+			break
+		}
+
+		// If running bisect target | tee bad.txt, prints to stdout and stderr
+		// both appear on the terminal, but the ones to stdout go through tee
+		// and can take a little bit of extra time. Sleep 1 millisecond to give
+		// tee time to catch up, so that its stdout print does not get interlaced
+		// with the stderr print from the next b.Log message.
+		time.Sleep(1 * time.Millisecond)
+
+		// Disable the now-known-bad changes and see if any failures remain.
+		b.Logf("checking for more failures")
+		b.Skip = append(bad, b.Skip...)
+		broken = b.Run("")
+		if broken.Success {
+			what := "enabled"
+			if b.Disable {
+				what = "disabled"
+			}
+			b.Logf("target succeeds with all remaining changes %s", what)
+			break
+		}
+		b.Logf("target still fails; searching for more bad changes")
+	}
+	return true
+}
+
+// Fatalf prints a message to standard error and then panics,
+// causing Search to return false.
+func (b *Bisect) Fatalf(format string, args ...any) {
+	s := fmt.Sprintf("bisect: fatal error: "+format, args...)
+	if !strings.HasSuffix(s, "\n") {
+		s += "\n"
+	}
+	b.Stderr.Write([]byte(s))
+	panic(&searchFatal)
+}
+
+// Logf prints a message to standard error.
+func (b *Bisect) Logf(format string, args ...any) {
+	s := fmt.Sprintf("bisect: "+format, args...)
+	if !strings.HasSuffix(s, "\n") {
+		s += "\n"
+	}
+	b.Stderr.Write([]byte(s))
+}
+
+func skipHexDigits(idY, idN []uint64) int {
+	var all []uint64
+	seen := make(map[uint64]bool)
+	for _, x := range idY {
+		seen[x] = true
+		all = append(all, x)
+	}
+	for _, x := range idN {
+		if !seen[x] {
+			seen[x] = true
+			all = append(all, x)
+		}
+	}
+	sort.Slice(all, func(i, j int) bool { return bits.Reverse64(all[i]) < bits.Reverse64(all[j]) })
+	digits := sort.Search(64/4, func(digits int) bool {
+		mask := uint64(1)<<(4*digits) - 1
+		for i := 0; i+1 < len(all); i++ {
+			if all[i]&mask == all[i+1]&mask {
+				return false
+			}
+		}
+		return true
+	})
+	if digits < 64/4 {
+		digits++
+	}
+	return digits
+}
+
+// search searches for a single locally minimal change set.
+//
+// Invariant: r describes the result of r.Suffix + b.Add, which failed.
+// (There's an implicit -b.Skip everywhere here. b.Skip does not change.)
+// We want to extend r.Suffix to preserve the failure, working toward
+// a suffix that identifies a single change.
+func (b *Bisect) search(r *Result) []string {
+	// The caller should be passing in a failure result that we diagnose.
+	if r.Success {
+		b.Fatalf("internal error: unexpected success") // mistake by caller
+	}
+
+	// If the failure reported no changes, the target is misbehaving.
+	if len(r.MatchIDs) == 0 {
+		b.Fatalf("failure with no reported changes:\n\n$ %s\n%s\n", r.Cmd, r.Out)
+	}
+
+	// If there's one matching change, that's the one we're looking for.
+	if len(r.MatchIDs) == 1 {
+		return []string{fmt.Sprintf("x%0*x", b.SkipHexDigits, r.MatchIDs[0]&(1<<(4*b.SkipHexDigits)-1))}
+	}
+
+	// If the suffix we were tracking in the trial is already 64 bits,
+	// either the target is bad or bisect itself is buggy.
+	if len(r.Suffix) >= 64 {
+		b.Fatalf("failed to isolate a single change with very long suffix")
+	}
+
+	// We want to split the current matchIDs by left-extending the suffix with 0 and 1.
+	// If all the matches have the same next bit, that won't cause a split, which doesn't
+	// break the algorithm but does waste time. Avoid wasting time by left-extending
+	// the suffix to the longest suffix shared by all the current match IDs
+	// before adding 0 or 1.
+	suffix := commonSuffix(r.MatchIDs)
+	if !strings.HasSuffix(suffix, r.Suffix) {
+		b.Fatalf("internal error: invalid common suffix") // bug in commonSuffix
+	}
+
+	// Run 0suffix and 1suffix. If one fails, chase down the failure in that half.
+	r0 := b.Run("0" + suffix)
+	if !r0.Success {
+		return b.search(r0)
+	}
+	r1 := b.Run("1" + suffix)
+	if !r1.Success {
+		return b.search(r1)
+	}
+
+	// suffix failed, but 0suffix and 1suffix succeeded.
+	// Assuming the target isn't flaky, this means we need
+	// at least one change from 0suffix AND at least one from 1suffix.
+	// We are already tracking N = len(b.Add) other changes and are
+	// allowed to build sets of size at least 1+N (or we shouldn't be here at all).
+	// If we aren't allowed to build sets of size 2+N, give up this branch.
+	if b.MaxSet > 0 && 2+len(b.Add) > b.MaxSet {
+		return nil
+	}
+
+	// Adding all matches for 1suffix, recurse to narrow down 0suffix.
+	old := len(b.Add)
+	b.Add = append(b.Add, "1"+suffix)
+	r0 = b.Run("0" + suffix)
+	if r0.Success {
+		// 0suffix + b.Add + 1suffix = suffix + b.Add is what r describes, and it failed.
+		b.Fatalf("target fails inconsistently")
+	}
+	bad0 := b.search(r0)
+	if bad0 == nil {
+		// Search failed due to MaxSet limit.
+		return nil
+	}
+	b.Add = b.Add[:old]
+
+	// Adding the specific match we found in 0suffix, recurse to narrow down 1suffix.
+	b.Add = append(b.Add[:old], bad0...)
+	r1 = b.Run("1" + suffix)
+	if r1.Success {
+		// 1suffix + b.Add + bad0 = bad0 + b.Add + 1suffix is what b.search(r0) reported as a failure.
+		b.Fatalf("target fails inconsistently")
+	}
+	bad1 := b.search(r1)
+	if bad1 == nil {
+		// Search failed due to MaxSet limit.
+		return nil
+	}
+	b.Add = b.Add[:old]
+
+	// bad0 and bad1 together provoke the failure.
+	return append(bad0, bad1...)
+}
+
+// Run runs a set of trials selecting changes with the given suffix,
+// plus the ones in b.Add and not the ones in b.Skip.
+// The returned result's MatchIDs, MatchText, and MatchFull
+// only list the changes that match suffix.
+// When b.Count > 1, Run runs b.Count trials and requires
+// that they all succeed or they all fail. If not, it calls b.Fatalf.
+func (b *Bisect) Run(suffix string) *Result {
+	out := b.run(suffix)
+	for i := 1; i < b.Count; i++ {
+		r := b.run(suffix)
+		if r.Success != out.Success {
+			b.Fatalf("target fails inconsistently")
+		}
+	}
+	return out
+}
+
+// run runs a single trial for Run.
+func (b *Bisect) run(suffix string) *Result {
+	random := fmt.Sprint(rand.Uint64())
+
+	// Accept suffix == "v" to mean we need user-visible output.
+	visible := ""
+	if suffix == "v" {
+		visible = "v"
+		suffix = ""
+	}
+
+	// Construct change ID pattern.
+	var pattern string
+	if suffix == "y" || suffix == "n" {
+		pattern = suffix
+		suffix = ""
+	} else {
+		var elem []string
+		if suffix != "" {
+			elem = append(elem, "+", suffix)
+		}
+		for _, x := range b.Add {
+			elem = append(elem, "+", x)
+		}
+		for _, x := range b.Skip {
+			elem = append(elem, "-", x)
+		}
+		pattern = strings.Join(elem, "")
+		if pattern == "" {
+			pattern = "y"
+		}
+	}
+	if b.Disable {
+		pattern = "!" + pattern
+	}
+	pattern = visible + pattern
+
+	// Construct substituted env and args.
+	env := make([]string, len(b.Env))
+	for i, x := range b.Env {
+		k, v, _ := strings.Cut(x, "=")
+		env[i] = k + "=" + replace(v, pattern, random)
+	}
+	args := make([]string, len(b.Args))
+	for i, x := range b.Args {
+		args[i] = replace(x, pattern, random)
+	}
+
+	// Construct and log command line.
+	// There is no newline in the log print.
+	// The line will be completed when the command finishes.
+	cmdText := strings.Join(append(append(env, b.Cmd), args...), " ")
+	fmt.Fprintf(b.Stderr, "bisect: run: %s...", cmdText)
+
+	// Run command with args and env.
+	var out []byte
+	var err error
+	if b.TestRun != nil {
+		out, err = b.TestRun(env, b.Cmd, args)
+	} else {
+		ctx := context.Background()
+		if b.Timeout != 0 {
+			var cancel context.CancelFunc
+			ctx, cancel = context.WithTimeout(ctx, b.Timeout)
+			defer cancel()
+		}
+		cmd := exec.CommandContext(ctx, b.Cmd, args...)
+		cmd.Env = append(os.Environ(), env...)
+		// Set up cmd.Cancel, cmd.WaitDelay on Go 1.20 and later
+		// TODO(rsc): Inline go120.go's cmdInterrupt once we stop supporting Go 1.19.
+		cmdInterrupt(cmd)
+		out, err = cmd.CombinedOutput()
+	}
+
+	// Parse output to construct result.
+	r := &Result{
+		Suffix:  suffix,
+		Success: err == nil,
+		Cmd:     cmdText,
+		Out:     string(out),
+	}
+
+	// Calculate bits, mask to identify suffix matches.
+	var bits, mask uint64
+	if suffix != "" && suffix != "y" && suffix != "n" && suffix != "v" {
+		var err error
+		bits, err = strconv.ParseUint(suffix, 2, 64)
+		if err != nil {
+			b.Fatalf("internal error: bad suffix")
+		}
+		mask = uint64(1<<len(suffix)) - 1
+	}
+
+	// Process output, collecting match reports for suffix.
+	have := make(map[uint64]bool)
+	all := r.Out
+	for all != "" {
+		var line string
+		line, all, _ = strings.Cut(all, "\n")
+		short, id, ok := bisect.CutMarker(line)
+		if !ok || (id&mask) != bits {
+			continue
+		}
+
+		if !have[id] {
+			have[id] = true
+			r.MatchIDs = append(r.MatchIDs, id)
+		}
+		r.MatchText = append(r.MatchText, short)
+		r.MatchFull = append(r.MatchFull, line)
+	}
+
+	// Finish log print from above, describing the command's completion.
+	if err == nil {
+		fmt.Fprintf(b.Stderr, " ok (%d matches)\n", len(r.MatchIDs))
+	} else {
+		fmt.Fprintf(b.Stderr, " FAIL (%d matches)\n", len(r.MatchIDs))
+	}
+
+	if err != nil && len(r.MatchIDs) == 0 {
+		b.Fatalf("target failed without printing any matches\n%s", r.Out)
+	}
+
+	// In verbose mode, print extra debugging: all the lines with match markers.
+	if b.Verbose {
+		b.Logf("matches:\n%s", strings.Join(r.MatchFull, "\n\t"))
+	}
+
+	return r
+}
+
+// replace returns x with literal text PATTERN and RANDOM replaced by pattern and random.
+func replace(x, pattern, random string) string {
+	x = strings.ReplaceAll(x, "PATTERN", pattern)
+	x = strings.ReplaceAll(x, "RANDOM", random)
+	return x
+}
+
+// commonSuffix returns the longest common binary suffix shared by all uint64s in list.
+// If list is empty, commonSuffix returns an empty string.
+func commonSuffix(list []uint64) string {
+	if len(list) == 0 {
+		return ""
+	}
+	b := list[0]
+	n := 64
+	for _, x := range list {
+		for x&((1<<n)-1) != b {
+			n--
+			b &= (1 << n) - 1
+		}
+	}
+	s := make([]byte, n)
+	for i := n - 1; i >= 0; i-- {
+		s[i] = '0' + byte(b&1)
+		b >>= 1
+	}
+	return string(s[:])
+}
diff --git a/src/cmd/vendor/golang.org/x/tools/cmd/bisect/rand.go b/src/cmd/vendor/golang.org/x/tools/cmd/bisect/rand.go
new file mode 100644
index 0000000..daa01d3
--- /dev/null
+++ b/src/cmd/vendor/golang.org/x/tools/cmd/bisect/rand.go
@@ -0,0 +1,20 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Starting in Go 1.20, the global rand is auto-seeded,
+// with a better value than the current Unix nanoseconds.
+// Only seed if we're using older versions of Go.
+
+//go:build !go1.20
+
+package main
+
+import (
+	"math/rand"
+	"time"
+)
+
+func init() {
+	rand.Seed(time.Now().UnixNano())
+}
diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/analysis.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/analysis.go
index 44ada22..e51e58b 100644
--- a/src/cmd/vendor/golang.org/x/tools/go/analysis/analysis.go
+++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/analysis.go
@@ -24,6 +24,10 @@
 	// (no capital or period, max ~60 letters).
 	Doc string
 
+	// URL holds an optional link to a web page with additional
+	// documentation for this analyzer.
+	URL string
+
 	// Flags defines any flags accepted by the analyzer.
 	// The manner in which these flags are exposed to the user
 	// depends on the driver which runs the analyzer.
@@ -145,11 +149,7 @@
 	// WARNING: This is an experimental API and may change in the future.
 	AllObjectFacts func() []ObjectFact
 
-	// typeErrors contains types.Errors that are associated with the pkg.
-	typeErrors []types.Error
-
 	/* Further fields may be added in future. */
-	// For example, suggested or applied refactorings.
 }
 
 // PackageFact is a package together with an associated fact.
diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/diagnostic.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/diagnostic.go
index 5cdcf46..7646ad0 100644
--- a/src/cmd/vendor/golang.org/x/tools/go/analysis/diagnostic.go
+++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/diagnostic.go
@@ -20,6 +20,17 @@
 	Category string    // optional
 	Message  string
 
+	// URL is the optional location of a web page that provides
+	// additional documentation for this diagnostic.
+	//
+	// If URL is empty but a Category is specified, then the
+	// Analysis driver should treat the URL as "#"+Category.
+	//
+	// The URL may be relative. If so, the base URL is that of the
+	// Analyzer that produced the diagnostic;
+	// see https://pkg.go.dev/net/url#URL.ResolveReference.
+	URL string
+
 	// SuggestedFixes contains suggested fixes for a diagnostic which can be used to perform
 	// edits to a file that address the diagnostic.
 	// TODO(matloob): Should multiple SuggestedFixes be allowed for a diagnostic?
diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/doc.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/doc.go
index b5a301c..c5429c9 100644
--- a/src/cmd/vendor/golang.org/x/tools/go/analysis/doc.go
+++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/doc.go
@@ -244,6 +244,9 @@
 Because serialized facts may appear within build outputs, the gob encoding
 of a fact must be deterministic, to avoid spurious cache misses in
 build systems that use content-addressable caches.
+The driver makes a single call to the gob encoder for all facts
+exported by a given analysis pass, so that the topology of
+shared data structures referenced by multiple facts is preserved.
 
 The Pass type has functions to import and export facts,
 associated either with an object or with a package:
diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/internal/analysisflags/flags.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/internal/analysisflags/flags.go
index 2ea6306..e127a42 100644
--- a/src/cmd/vendor/golang.org/x/tools/go/analysis/internal/analysisflags/flags.go
+++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/internal/analysisflags/flags.go
@@ -206,7 +206,7 @@
 func (versionFlag) String() string   { return "" }
 func (versionFlag) Set(s string) error {
 	if s != "full" {
-		log.Fatalf("unsupported flag value: -V=%s", s)
+		log.Fatalf("unsupported flag value: -V=%s (use -V=full)", s)
 	}
 
 	// This replicates the minimal subset of
@@ -218,7 +218,10 @@
 	// Formats:
 	//   $progname version devel ... buildID=...
 	//   $progname version go1.9.1
-	progname := os.Args[0]
+	progname, err := os.Executable()
+	if err != nil {
+		return err
+	}
 	f, err := os.Open(progname)
 	if err != nil {
 		log.Fatal(err)
diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/internal/analysisflags/url.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/internal/analysisflags/url.go
new file mode 100644
index 0000000..26a917a
--- /dev/null
+++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/internal/analysisflags/url.go
@@ -0,0 +1,33 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package analysisflags
+
+import (
+	"fmt"
+	"net/url"
+
+	"golang.org/x/tools/go/analysis"
+)
+
+// ResolveURL resolves the URL field for a Diagnostic from an Analyzer
+// and returns the URL. See Diagnostic.URL for details.
+func ResolveURL(a *analysis.Analyzer, d analysis.Diagnostic) (string, error) {
+	if d.URL == "" && d.Category == "" && a.URL == "" {
+		return "", nil // do nothing
+	}
+	raw := d.URL
+	if d.URL == "" && d.Category != "" {
+		raw = "#" + d.Category
+	}
+	u, err := url.Parse(raw)
+	if err != nil {
+		return "", fmt.Errorf("invalid Diagnostic.URL %q: %s", raw, err)
+	}
+	base, err := url.Parse(a.URL)
+	if err != nil {
+		return "", fmt.Errorf("invalid Analyzer.URL %q: %s", a.URL, err)
+	}
+	return base.ResolveReference(u).String(), nil
+}
diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/asmdecl/asmdecl.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/asmdecl/asmdecl.go
index 7288559..e24dac9 100644
--- a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/asmdecl/asmdecl.go
+++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/asmdecl/asmdecl.go
@@ -27,6 +27,7 @@
 var Analyzer = &analysis.Analyzer{
 	Name: "asmdecl",
 	Doc:  Doc,
+	URL:  "https://pkg.go.dev/golang.org/x/tools/go/analysis/passes/asmdecl",
 	Run:  run,
 }
 
diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/assign/assign.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/assign/assign.go
index 89146b7..10489be 100644
--- a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/assign/assign.go
+++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/assign/assign.go
@@ -2,13 +2,13 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// Package assign defines an Analyzer that detects useless assignments.
 package assign
 
 // TODO(adonovan): check also for assignments to struct fields inside
 // methods that are on T instead of *T.
 
 import (
+	_ "embed"
 	"fmt"
 	"go/ast"
 	"go/token"
@@ -21,15 +21,13 @@
 	"golang.org/x/tools/go/ast/inspector"
 )
 
-const Doc = `check for useless assignments
-
-This checker reports assignments of the form x = x or a[i] = a[i].
-These are almost always useless, and even when they aren't they are
-usually a mistake.`
+//go:embed doc.go
+var doc string
 
 var Analyzer = &analysis.Analyzer{
 	Name:     "assign",
-	Doc:      Doc,
+	Doc:      analysisutil.MustExtractDoc(doc, "assign"),
+	URL:      "https://pkg.go.dev/golang.org/x/tools/go/analysis/passes/assign",
 	Requires: []*analysis.Analyzer{inspect.Analyzer},
 	Run:      run,
 }
diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/assign/doc.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/assign/doc.go
new file mode 100644
index 0000000..a4b1b64
--- /dev/null
+++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/assign/doc.go
@@ -0,0 +1,14 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package assign defines an Analyzer that detects useless assignments.
+//
+// # Analyzer assign
+//
+// assign: check for useless assignments
+//
+// This checker reports assignments of the form x = x or a[i] = a[i].
+// These are almost always useless, and even when they aren't they are
+// usually a mistake.
+package assign
diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/atomic/atomic.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/atomic/atomic.go
index 9261db7..b40e081 100644
--- a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/atomic/atomic.go
+++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/atomic/atomic.go
@@ -2,11 +2,10 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// Package atomic defines an Analyzer that checks for common mistakes
-// using the sync/atomic package.
 package atomic
 
 import (
+	_ "embed"
 	"go/ast"
 	"go/token"
 	"go/types"
@@ -17,23 +16,23 @@
 	"golang.org/x/tools/go/ast/inspector"
 )
 
-const Doc = `check for common mistakes using the sync/atomic package
-
-The atomic checker looks for assignment statements of the form:
-
-	x = atomic.AddUint64(&x, 1)
-
-which are not atomic.`
+//go:embed doc.go
+var doc string
 
 var Analyzer = &analysis.Analyzer{
 	Name:             "atomic",
-	Doc:              Doc,
+	Doc:              analysisutil.MustExtractDoc(doc, "atomic"),
+	URL:              "https://pkg.go.dev/golang.org/x/tools/go/analysis/passes/atomic",
 	Requires:         []*analysis.Analyzer{inspect.Analyzer},
 	RunDespiteErrors: true,
 	Run:              run,
 }
 
 func run(pass *analysis.Pass) (interface{}, error) {
+	if !analysisutil.Imports(pass.Pkg, "sync/atomic") {
+		return nil, nil // doesn't directly import sync/atomic
+	}
+
 	inspect := pass.ResultOf[inspect.Analyzer].(*inspector.Inspector)
 
 	nodeFilter := []ast.Node{
diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/atomic/doc.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/atomic/doc.go
new file mode 100644
index 0000000..5aafe25
--- /dev/null
+++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/atomic/doc.go
@@ -0,0 +1,17 @@
+// Copyright 2023 The Go Authors. 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 defines an Analyzer that checks for common mistakes
+// using the sync/atomic package.
+//
+// # Analyzer atomic
+//
+// atomic: check for common mistakes using the sync/atomic package
+//
+// The atomic checker looks for assignment statements of the form:
+//
+//	x = atomic.AddUint64(&x, 1)
+//
+// which are not atomic.
+package atomic
diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/bools/bools.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/bools/bools.go
index 0d8b0bf..4219f08 100644
--- a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/bools/bools.go
+++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/bools/bools.go
@@ -22,6 +22,7 @@
 var Analyzer = &analysis.Analyzer{
 	Name:     "bools",
 	Doc:      Doc,
+	URL:      "https://pkg.go.dev/golang.org/x/tools/go/analysis/passes/bools",
 	Requires: []*analysis.Analyzer{inspect.Analyzer},
 	Run:      run,
 }
diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/buildtag/buildtag.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/buildtag/buildtag.go
index c4407ad..a2a4a89 100644
--- a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/buildtag/buildtag.go
+++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/buildtag/buildtag.go
@@ -20,11 +20,12 @@
 	"golang.org/x/tools/go/analysis/passes/internal/analysisutil"
 )
 
-const Doc = "check that +build tags are well-formed and correctly located"
+const Doc = "check //go:build and // +build directives"
 
 var Analyzer = &analysis.Analyzer{
 	Name: "buildtag",
 	Doc:  Doc,
+	URL:  "https://pkg.go.dev/golang.org/x/tools/go/analysis/passes/buildtag",
 	Run:  runBuildTag,
 }
 
diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/buildtag/buildtag_old.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/buildtag/buildtag_old.go
index e923492..0001ba5 100644
--- a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/buildtag/buildtag_old.go
+++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/buildtag/buildtag_old.go
@@ -22,7 +22,7 @@
 	"golang.org/x/tools/go/analysis/passes/internal/analysisutil"
 )
 
-const Doc = "check that +build tags are well-formed and correctly located"
+const Doc = "check // +build directives"
 
 var Analyzer = &analysis.Analyzer{
 	Name: "buildtag",
diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/cgocall/cgocall.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/cgocall/cgocall.go
index b61ee5c..c18b84b 100644
--- a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/cgocall/cgocall.go
+++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/cgocall/cgocall.go
@@ -35,6 +35,7 @@
 var Analyzer = &analysis.Analyzer{
 	Name:             "cgocall",
 	Doc:              Doc,
+	URL:              "https://pkg.go.dev/golang.org/x/tools/go/analysis/passes/cgocall",
 	RunDespiteErrors: true,
 	Run:              run,
 }
@@ -270,6 +271,7 @@
 		Sizes: sizes,
 		Error: func(error) {}, // ignore errors (e.g. unused import)
 	}
+	setGoVersion(tc, pkg)
 
 	// It's tempting to record the new types in the
 	// existing pass.TypesInfo, but we don't own it.
diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/cgocall/cgocall_go120.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/cgocall/cgocall_go120.go
new file mode 100644
index 0000000..06b5494
--- /dev/null
+++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/cgocall/cgocall_go120.go
@@ -0,0 +1,13 @@
+// Copyright 2023 The Go 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:build !go1.21
+
+package cgocall
+
+import "go/types"
+
+func setGoVersion(tc *types.Config, pkg *types.Package) {
+	// no types.Package.GoVersion until Go 1.21
+}
diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/cgocall/cgocall_go121.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/cgocall/cgocall_go121.go
new file mode 100644
index 0000000..2a3e1fa
--- /dev/null
+++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/cgocall/cgocall_go121.go
@@ -0,0 +1,13 @@
+// Copyright 2023 The Go 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:build go1.21
+
+package cgocall
+
+import "go/types"
+
+func setGoVersion(tc *types.Config, pkg *types.Package) {
+	tc.GoVersion = pkg.GoVersion()
+}
diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/composite/composite.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/composite/composite.go
index 64e184d..20fb708 100644
--- a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/composite/composite.go
+++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/composite/composite.go
@@ -37,6 +37,7 @@
 var Analyzer = &analysis.Analyzer{
 	Name:             "composites",
 	Doc:              Doc,
+	URL:              "https://pkg.go.dev/golang.org/x/tools/go/analysis/passes/composites",
 	Requires:         []*analysis.Analyzer{inspect.Analyzer},
 	RunDespiteErrors: true,
 	Run:              run,
diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/copylock/copylock.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/copylock/copylock.go
index 8cc93e9..b3ca8ad 100644
--- a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/copylock/copylock.go
+++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/copylock/copylock.go
@@ -29,6 +29,7 @@
 var Analyzer = &analysis.Analyzer{
 	Name:             "copylocks",
 	Doc:              Doc,
+	URL:              "https://pkg.go.dev/golang.org/x/tools/go/analysis/passes/copylocks",
 	Requires:         []*analysis.Analyzer{inspect.Analyzer},
 	RunDespiteErrors: true,
 	Run:              run,
diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/ctrlflow/ctrlflow.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/ctrlflow/ctrlflow.go
index 73746d6..d21adee 100644
--- a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/ctrlflow/ctrlflow.go
+++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/ctrlflow/ctrlflow.go
@@ -24,6 +24,7 @@
 var Analyzer = &analysis.Analyzer{
 	Name:       "ctrlflow",
 	Doc:        "build a control-flow graph",
+	URL:        "https://pkg.go.dev/golang.org/x/tools/go/analysis/passes/ctrlflow",
 	Run:        run,
 	ResultType: reflect.TypeOf(new(CFGs)),
 	FactTypes:  []analysis.Fact{new(noReturn)},
diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/directive/directive.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/directive/directive.go
new file mode 100644
index 0000000..1146d7b
--- /dev/null
+++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/directive/directive.go
@@ -0,0 +1,217 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package directive defines an Analyzer that checks known Go toolchain directives.
+package directive
+
+import (
+	"go/ast"
+	"go/parser"
+	"go/token"
+	"strings"
+	"unicode"
+	"unicode/utf8"
+
+	"golang.org/x/tools/go/analysis"
+	"golang.org/x/tools/go/analysis/passes/internal/analysisutil"
+)
+
+const Doc = `check Go toolchain directives such as //go:debug
+
+This analyzer checks for problems with known Go toolchain directives
+in all Go source files in a package directory, even those excluded by
+//go:build constraints, and all non-Go source files too.
+
+For //go:debug (see https://go.dev/doc/godebug), the analyzer checks
+that the directives are placed only in Go source files, only above the
+package comment, and only in package main or *_test.go files.
+
+Support for other known directives may be added in the future.
+
+This analyzer does not check //go:build, which is handled by the
+buildtag analyzer.
+`
+
+var Analyzer = &analysis.Analyzer{
+	Name: "directive",
+	Doc:  Doc,
+	URL:  "https://pkg.go.dev/golang.org/x/tools/go/analysis/passes/directive",
+	Run:  runDirective,
+}
+
+func runDirective(pass *analysis.Pass) (interface{}, error) {
+	for _, f := range pass.Files {
+		checkGoFile(pass, f)
+	}
+	for _, name := range pass.OtherFiles {
+		if err := checkOtherFile(pass, name); err != nil {
+			return nil, err
+		}
+	}
+	for _, name := range pass.IgnoredFiles {
+		if strings.HasSuffix(name, ".go") {
+			f, err := parser.ParseFile(pass.Fset, name, nil, parser.ParseComments)
+			if err != nil {
+				// Not valid Go source code - not our job to diagnose, so ignore.
+				continue
+			}
+			checkGoFile(pass, f)
+		} else {
+			if err := checkOtherFile(pass, name); err != nil {
+				return nil, err
+			}
+		}
+	}
+	return nil, nil
+}
+
+func checkGoFile(pass *analysis.Pass, f *ast.File) {
+	check := newChecker(pass, pass.Fset.File(f.Package).Name(), f)
+
+	for _, group := range f.Comments {
+		// A +build comment is ignored after or adjoining the package declaration.
+		if group.End()+1 >= f.Package {
+			check.inHeader = false
+		}
+		// A //go:build comment is ignored after the package declaration
+		// (but adjoining it is OK, in contrast to +build comments).
+		if group.Pos() >= f.Package {
+			check.inHeader = false
+		}
+
+		// Check each line of a //-comment.
+		for _, c := range group.List {
+			check.comment(c.Slash, c.Text)
+		}
+	}
+}
+
+func checkOtherFile(pass *analysis.Pass, filename string) error {
+	// We cannot use the Go parser, since is not a Go source file.
+	// Read the raw bytes instead.
+	content, tf, err := analysisutil.ReadFile(pass.Fset, filename)
+	if err != nil {
+		return err
+	}
+
+	check := newChecker(pass, filename, nil)
+	check.nonGoFile(token.Pos(tf.Base()), string(content))
+	return nil
+}
+
+type checker struct {
+	pass     *analysis.Pass
+	filename string
+	file     *ast.File // nil for non-Go file
+	inHeader bool      // in file header (before package declaration)
+	inStar   bool      // currently in a /* */ comment
+}
+
+func newChecker(pass *analysis.Pass, filename string, file *ast.File) *checker {
+	return &checker{
+		pass:     pass,
+		filename: filename,
+		file:     file,
+		inHeader: true,
+	}
+}
+
+func (check *checker) nonGoFile(pos token.Pos, fullText string) {
+	// Process each line.
+	text := fullText
+	inStar := false
+	for text != "" {
+		offset := len(fullText) - len(text)
+		var line string
+		line, text, _ = stringsCut(text, "\n")
+
+		if !inStar && strings.HasPrefix(line, "//") {
+			check.comment(pos+token.Pos(offset), line)
+			continue
+		}
+
+		// Skip over, cut out any /* */ comments,
+		// to avoid being confused by a commented-out // comment.
+		for {
+			line = strings.TrimSpace(line)
+			if inStar {
+				var ok bool
+				_, line, ok = stringsCut(line, "*/")
+				if !ok {
+					break
+				}
+				inStar = false
+				continue
+			}
+			line, inStar = stringsCutPrefix(line, "/*")
+			if !inStar {
+				break
+			}
+		}
+		if line != "" {
+			// Found non-comment non-blank line.
+			// Ends space for valid //go:build comments,
+			// but also ends the fraction of the file we can
+			// reliably parse. From this point on we might
+			// incorrectly flag "comments" inside multiline
+			// string constants or anything else (this might
+			// not even be a Go program). So stop.
+			break
+		}
+	}
+}
+
+func (check *checker) comment(pos token.Pos, line string) {
+	if !strings.HasPrefix(line, "//go:") {
+		return
+	}
+	// testing hack: stop at // ERROR
+	if i := strings.Index(line, " // ERROR "); i >= 0 {
+		line = line[:i]
+	}
+
+	verb := line
+	if i := strings.IndexFunc(verb, unicode.IsSpace); i >= 0 {
+		verb = verb[:i]
+		if line[i] != ' ' && line[i] != '\t' && line[i] != '\n' {
+			r, _ := utf8.DecodeRuneInString(line[i:])
+			check.pass.Reportf(pos, "invalid space %#q in %s directive", r, verb)
+		}
+	}
+
+	switch verb {
+	default:
+		// TODO: Use the go language version for the file.
+		// If that version is not newer than us, then we can
+		// report unknown directives.
+
+	case "//go:build":
+		// Ignore. The buildtag analyzer reports misplaced comments.
+
+	case "//go:debug":
+		if check.file == nil {
+			check.pass.Reportf(pos, "//go:debug directive only valid in Go source files")
+		} else if check.file.Name.Name != "main" && !strings.HasSuffix(check.filename, "_test.go") {
+			check.pass.Reportf(pos, "//go:debug directive only valid in package main or test")
+		} else if !check.inHeader {
+			check.pass.Reportf(pos, "//go:debug directive only valid before package declaration")
+		}
+	}
+}
+
+// Go 1.18 strings.Cut.
+func stringsCut(s, sep string) (before, after string, found bool) {
+	if i := strings.Index(s, sep); i >= 0 {
+		return s[:i], s[i+len(sep):], true
+	}
+	return s, "", false
+}
+
+// Go 1.20 strings.CutPrefix.
+func stringsCutPrefix(s, prefix string) (after string, found bool) {
+	if !strings.HasPrefix(s, prefix) {
+		return s, false
+	}
+	return s[len(prefix):], true
+}
diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/errorsas/errorsas.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/errorsas/errorsas.go
index 96adad3..2fcbdfa 100644
--- a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/errorsas/errorsas.go
+++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/errorsas/errorsas.go
@@ -13,6 +13,7 @@
 
 	"golang.org/x/tools/go/analysis"
 	"golang.org/x/tools/go/analysis/passes/inspect"
+	"golang.org/x/tools/go/analysis/passes/internal/analysisutil"
 	"golang.org/x/tools/go/ast/inspector"
 	"golang.org/x/tools/go/types/typeutil"
 )
@@ -25,6 +26,7 @@
 var Analyzer = &analysis.Analyzer{
 	Name:     "errorsas",
 	Doc:      Doc,
+	URL:      "https://pkg.go.dev/golang.org/x/tools/go/analysis/passes/errorsas",
 	Requires: []*analysis.Analyzer{inspect.Analyzer},
 	Run:      run,
 }
@@ -37,6 +39,10 @@
 		return nil, nil
 	}
 
+	if !analysisutil.Imports(pass.Pkg, "errors") {
+		return nil, nil // doesn't directly import errors
+	}
+
 	inspect := pass.ResultOf[inspect.Analyzer].(*inspector.Inspector)
 
 	nodeFilter := []ast.Node{
diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/framepointer/framepointer.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/framepointer/framepointer.go
index 741492e..0b3ded4 100644
--- a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/framepointer/framepointer.go
+++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/framepointer/framepointer.go
@@ -20,6 +20,7 @@
 var Analyzer = &analysis.Analyzer{
 	Name: "framepointer",
 	Doc:  Doc,
+	URL:  "https://pkg.go.dev/golang.org/x/tools/go/analysis/passes/framepointer",
 	Run:  run,
 }
 
diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/httpresponse/httpresponse.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/httpresponse/httpresponse.go
index 3b9168c..61c3b76 100644
--- a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/httpresponse/httpresponse.go
+++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/httpresponse/httpresponse.go
@@ -35,6 +35,7 @@
 var Analyzer = &analysis.Analyzer{
 	Name:     "httpresponse",
 	Doc:      Doc,
+	URL:      "https://pkg.go.dev/golang.org/x/tools/go/analysis/passes/httpresponse",
 	Requires: []*analysis.Analyzer{inspect.Analyzer},
 	Run:      run,
 }
diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/ifaceassert/doc.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/ifaceassert/doc.go
new file mode 100644
index 0000000..3d2b1a3
--- /dev/null
+++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/ifaceassert/doc.go
@@ -0,0 +1,24 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package ifaceassert defines an Analyzer that flags
+// impossible interface-interface type assertions.
+//
+// # Analyzer ifaceassert
+//
+// ifaceassert: detect impossible interface-to-interface type assertions
+//
+// This checker flags type assertions v.(T) and corresponding type-switch cases
+// in which the static type V of v is an interface that cannot possibly implement
+// the target interface T. This occurs when V and T contain methods with the same
+// name but different signatures. Example:
+//
+//	var v interface {
+//		Read()
+//	}
+//	_ = v.(io.Reader)
+//
+// The Read method in v has a different signature than the Read method in
+// io.Reader, so this assertion cannot succeed.
+package ifaceassert
diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/ifaceassert/ifaceassert.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/ifaceassert/ifaceassert.go
index 30130f6..cd4a477 100644
--- a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/ifaceassert/ifaceassert.go
+++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/ifaceassert/ifaceassert.go
@@ -2,38 +2,26 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// Package ifaceassert defines an Analyzer that flags
-// impossible interface-interface type assertions.
 package ifaceassert
 
 import (
+	_ "embed"
 	"go/ast"
 	"go/types"
 
 	"golang.org/x/tools/go/analysis"
 	"golang.org/x/tools/go/analysis/passes/inspect"
+	"golang.org/x/tools/go/analysis/passes/internal/analysisutil"
 	"golang.org/x/tools/go/ast/inspector"
 )
 
-const Doc = `detect impossible interface-to-interface type assertions
-
-This checker flags type assertions v.(T) and corresponding type-switch cases
-in which the static type V of v is an interface that cannot possibly implement
-the target interface T. This occurs when V and T contain methods with the same
-name but different signatures. Example:
-
-	var v interface {
-		Read()
-	}
-	_ = v.(io.Reader)
-
-The Read method in v has a different signature than the Read method in
-io.Reader, so this assertion cannot succeed.
-`
+//go:embed doc.go
+var doc string
 
 var Analyzer = &analysis.Analyzer{
 	Name:     "ifaceassert",
-	Doc:      Doc,
+	Doc:      analysisutil.MustExtractDoc(doc, "ifaceassert"),
+	URL:      "https://pkg.go.dev/golang.org/x/tools/go/analysis/passes/ifaceassert",
 	Requires: []*analysis.Analyzer{inspect.Analyzer},
 	Run:      run,
 }
diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/ifaceassert/parameterized.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/ifaceassert/parameterized.go
index 1285ecf..b84577f 100644
--- a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/ifaceassert/parameterized.go
+++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/ifaceassert/parameterized.go
@@ -1,6 +1,7 @@
 // Copyright 2022 The Go Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
+
 package ifaceassert
 
 import (
@@ -66,7 +67,7 @@
 		// of a generic function type (or an interface method) that is
 		// part of the type we're testing. We don't care about these type
 		// parameters.
-		// Similarly, the receiver of a method may declare (rather then
+		// Similarly, the receiver of a method may declare (rather than
 		// use) type parameters, we don't care about those either.
 		// Thus, we only need to look at the input and result parameters.
 		return w.isParameterized(t.Params()) || w.isParameterized(t.Results())
diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/inspect/inspect.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/inspect/inspect.go
index 165c70c..3b121cb 100644
--- a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/inspect/inspect.go
+++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/inspect/inspect.go
@@ -38,6 +38,7 @@
 var Analyzer = &analysis.Analyzer{
 	Name:             "inspect",
 	Doc:              "optimize AST traversal for later passes",
+	URL:              "https://pkg.go.dev/golang.org/x/tools/go/analysis/passes/inspect",
 	Run:              run,
 	RunDespiteErrors: true,
 	ResultType:       reflect.TypeOf(new(inspector.Inspector)),
diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/internal/analysisutil/extractdoc.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/internal/analysisutil/extractdoc.go
new file mode 100644
index 0000000..0e175ca
--- /dev/null
+++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/internal/analysisutil/extractdoc.go
@@ -0,0 +1,113 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package analysisutil
+
+import (
+	"fmt"
+	"go/parser"
+	"go/token"
+	"strings"
+)
+
+// MustExtractDoc is like [ExtractDoc] but it panics on error.
+//
+// To use, define a doc.go file such as:
+//
+//	// Package halting defines an analyzer of program termination.
+//	//
+//	// # Analyzer halting
+//	//
+//	// halting: reports whether execution will halt.
+//	//
+//	// The halting analyzer reports a diagnostic for functions
+//	// that run forever. To suppress the diagnostics, try inserting
+//	// a 'break' statement into each loop.
+//	package halting
+//
+//	import _ "embed"
+//
+//	//go:embed doc.go
+//	var doc string
+//
+// And declare your analyzer as:
+//
+//	var Analyzer = &analysis.Analyzer{
+//		Name:             "halting",
+//		Doc:              analysisutil.MustExtractDoc(doc, "halting"),
+//		...
+//	}
+func MustExtractDoc(content, name string) string {
+	doc, err := ExtractDoc(content, name)
+	if err != nil {
+		panic(err)
+	}
+	return doc
+}
+
+// ExtractDoc extracts a section of a package doc comment from the
+// provided contents of an analyzer package's doc.go file.
+//
+// A section is a portion of the comment between one heading and
+// the next, using this form:
+//
+//	# Analyzer NAME
+//
+//	NAME: SUMMARY
+//
+//	Full description...
+//
+// where NAME matches the name argument, and SUMMARY is a brief
+// verb-phrase that describes the analyzer. The following lines, up
+// until the next heading or the end of the comment, contain the full
+// description. ExtractDoc returns the portion following the colon,
+// which is the form expected by Analyzer.Doc.
+//
+// Example:
+//
+//	# Analyzer printf
+//
+//	printf: checks consistency of calls to printf
+//
+//	The printf analyzer checks consistency of calls to printf.
+//	Here is the complete description...
+//
+// This notation allows a single doc comment to provide documentation
+// for multiple analyzers, each in its own section.
+// The HTML anchors generated for each heading are predictable.
+//
+// It returns an error if the content was not a valid Go source file
+// containing a package doc comment with a heading of the required
+// form.
+//
+// This machinery enables the package documentation (typically
+// accessible via the web at https://pkg.go.dev/) and the command
+// documentation (typically printed to a terminal) to be derived from
+// the same source and formatted appropriately.
+func ExtractDoc(content, name string) (string, error) {
+	if content == "" {
+		return "", fmt.Errorf("empty Go source file")
+	}
+	fset := token.NewFileSet()
+	f, err := parser.ParseFile(fset, "", content, parser.ParseComments|parser.PackageClauseOnly)
+	if err != nil {
+		return "", fmt.Errorf("not a Go source file")
+	}
+	if f.Doc == nil {
+		return "", fmt.Errorf("Go source file has no package doc comment")
+	}
+	for _, section := range strings.Split(f.Doc.Text(), "\n# ") {
+		if body := strings.TrimPrefix(section, "Analyzer "+name); body != section &&
+			body != "" &&
+			body[0] == '\r' || body[0] == '\n' {
+			body = strings.TrimSpace(body)
+			rest := strings.TrimPrefix(body, name+":")
+			if rest == body {
+				return "", fmt.Errorf("'Analyzer %s' heading not followed by '%s: summary...' line", name, name)
+			}
+			return strings.TrimSpace(rest), nil
+		}
+	}
+	return "", fmt.Errorf("package doc comment contains no 'Analyzer %s' heading", name)
+}
diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/loopclosure/doc.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/loopclosure/doc.go
new file mode 100644
index 0000000..dc544df
--- /dev/null
+++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/loopclosure/doc.go
@@ -0,0 +1,68 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package loopclosure defines an Analyzer that checks for references to
+// enclosing loop variables from within nested functions.
+//
+// # Analyzer loopclosure
+//
+// loopclosure: check references to loop variables from within nested functions
+//
+// This analyzer reports places where a function literal references the
+// iteration variable of an enclosing loop, and the loop calls the function
+// in such a way (e.g. with go or defer) that it may outlive the loop
+// iteration and possibly observe the wrong value of the variable.
+//
+// In this example, all the deferred functions run after the loop has
+// completed, so all observe the final value of v.
+//
+//	for _, v := range list {
+//	    defer func() {
+//	        use(v) // incorrect
+//	    }()
+//	}
+//
+// One fix is to create a new variable for each iteration of the loop:
+//
+//	for _, v := range list {
+//	    v := v // new var per iteration
+//	    defer func() {
+//	        use(v) // ok
+//	    }()
+//	}
+//
+// The next example uses a go statement and has a similar problem.
+// In addition, it has a data race because the loop updates v
+// concurrent with the goroutines accessing it.
+//
+//	for _, v := range elem {
+//	    go func() {
+//	        use(v)  // incorrect, and a data race
+//	    }()
+//	}
+//
+// A fix is the same as before. The checker also reports problems
+// in goroutines started by golang.org/x/sync/errgroup.Group.
+// A hard-to-spot variant of this form is common in parallel tests:
+//
+//	func Test(t *testing.T) {
+//	    for _, test := range tests {
+//	        t.Run(test.name, func(t *testing.T) {
+//	            t.Parallel()
+//	            use(test) // incorrect, and a data race
+//	        })
+//	    }
+//	}
+//
+// The t.Parallel() call causes the rest of the function to execute
+// concurrent with the loop.
+//
+// The analyzer reports references only in the last statement,
+// as it is not deep enough to understand the effects of subsequent
+// statements that might render the reference benign.
+// ("Last statement" is defined recursively in compound
+// statements such as if, switch, and select.)
+//
+// See: https://golang.org/doc/go_faq.html#closures_and_goroutines
+package loopclosure
diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/loopclosure/loopclosure.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/loopclosure/loopclosure.go
index ae5b415..5620c35 100644
--- a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/loopclosure/loopclosure.go
+++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/loopclosure/loopclosure.go
@@ -2,82 +2,27 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// Package loopclosure defines an Analyzer that checks for references to
-// enclosing loop variables from within nested functions.
 package loopclosure
 
 import (
+	_ "embed"
 	"go/ast"
 	"go/types"
 
 	"golang.org/x/tools/go/analysis"
 	"golang.org/x/tools/go/analysis/passes/inspect"
+	"golang.org/x/tools/go/analysis/passes/internal/analysisutil"
 	"golang.org/x/tools/go/ast/inspector"
 	"golang.org/x/tools/go/types/typeutil"
 )
 
-const Doc = `check references to loop variables from within nested functions
-
-This analyzer reports places where a function literal references the
-iteration variable of an enclosing loop, and the loop calls the function
-in such a way (e.g. with go or defer) that it may outlive the loop
-iteration and possibly observe the wrong value of the variable.
-
-In this example, all the deferred functions run after the loop has
-completed, so all observe the final value of v.
-
-    for _, v := range list {
-        defer func() {
-            use(v) // incorrect
-        }()
-    }
-
-One fix is to create a new variable for each iteration of the loop:
-
-    for _, v := range list {
-        v := v // new var per iteration
-        defer func() {
-            use(v) // ok
-        }()
-    }
-
-The next example uses a go statement and has a similar problem.
-In addition, it has a data race because the loop updates v
-concurrent with the goroutines accessing it.
-
-    for _, v := range elem {
-        go func() {
-            use(v)  // incorrect, and a data race
-        }()
-    }
-
-A fix is the same as before. The checker also reports problems
-in goroutines started by golang.org/x/sync/errgroup.Group.
-A hard-to-spot variant of this form is common in parallel tests:
-
-    func Test(t *testing.T) {
-        for _, test := range tests {
-            t.Run(test.name, func(t *testing.T) {
-                t.Parallel()
-                use(test) // incorrect, and a data race
-            })
-        }
-    }
-
-The t.Parallel() call causes the rest of the function to execute
-concurrent with the loop.
-
-The analyzer reports references only in the last statement,
-as it is not deep enough to understand the effects of subsequent
-statements that might render the reference benign.
-("Last statement" is defined recursively in compound
-statements such as if, switch, and select.)
-
-See: https://golang.org/doc/go_faq.html#closures_and_goroutines`
+//go:embed doc.go
+var doc string
 
 var Analyzer = &analysis.Analyzer{
 	Name:     "loopclosure",
-	Doc:      Doc,
+	Doc:      analysisutil.MustExtractDoc(doc, "loopclosure"),
+	URL:      "https://pkg.go.dev/golang.org/x/tools/go/analysis/passes/loopclosure",
 	Requires: []*analysis.Analyzer{inspect.Analyzer},
 	Run:      run,
 }
diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/lostcancel/doc.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/lostcancel/doc.go
new file mode 100644
index 0000000..28bf6c7
--- /dev/null
+++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/lostcancel/doc.go
@@ -0,0 +1,16 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package lostcancel defines an Analyzer that checks for failure to
+// call a context cancellation function.
+//
+// # Analyzer lostcancel
+//
+// lostcancel: check cancel func returned by context.WithCancel is called
+//
+// The cancellation function returned by context.WithCancel, WithTimeout,
+// and WithDeadline must be called or the new context will remain live
+// until its parent context is cancelled.
+// (The background context is never cancelled.)
+package lostcancel
diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/lostcancel/lostcancel.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/lostcancel/lostcancel.go
index de6f840..2bccb67 100644
--- a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/lostcancel/lostcancel.go
+++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/lostcancel/lostcancel.go
@@ -2,11 +2,10 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// Package lostcancel defines an Analyzer that checks for failure to
-// call a context cancellation function.
 package lostcancel
 
 import (
+	_ "embed"
 	"fmt"
 	"go/ast"
 	"go/types"
@@ -14,20 +13,18 @@
 	"golang.org/x/tools/go/analysis"
 	"golang.org/x/tools/go/analysis/passes/ctrlflow"
 	"golang.org/x/tools/go/analysis/passes/inspect"
+	"golang.org/x/tools/go/analysis/passes/internal/analysisutil"
 	"golang.org/x/tools/go/ast/inspector"
 	"golang.org/x/tools/go/cfg"
 )
 
-const Doc = `check cancel func returned by context.WithCancel is called
-
-The cancellation function returned by context.WithCancel, WithTimeout,
-and WithDeadline must be called or the new context will remain live
-until its parent context is cancelled.
-(The background context is never cancelled.)`
+//go:embed doc.go
+var doc string
 
 var Analyzer = &analysis.Analyzer{
 	Name: "lostcancel",
-	Doc:  Doc,
+	Doc:  analysisutil.MustExtractDoc(doc, "lostcancel"),
+	URL:  "https://pkg.go.dev/golang.org/x/tools/go/analysis/passes/lostcancel",
 	Run:  run,
 	Requires: []*analysis.Analyzer{
 		inspect.Analyzer,
@@ -51,7 +48,7 @@
 // checkLostCancel analyzes a single named or literal function.
 func run(pass *analysis.Pass) (interface{}, error) {
 	// Fast path: bypass check if file doesn't use context.WithCancel.
-	if !hasImport(pass.Pkg, contextPackage) {
+	if !analysisutil.Imports(pass.Pkg, contextPackage) {
 		return nil, nil
 	}
 
@@ -182,15 +179,6 @@
 
 func isCall(n ast.Node) bool { _, ok := n.(*ast.CallExpr); return ok }
 
-func hasImport(pkg *types.Package, path string) bool {
-	for _, imp := range pkg.Imports() {
-		if imp.Path() == path {
-			return true
-		}
-	}
-	return false
-}
-
 // isContextWithCancel reports whether n is one of the qualified identifiers
 // context.With{Cancel,Timeout,Deadline}.
 func isContextWithCancel(info *types.Info, n ast.Node) bool {
diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/nilfunc/doc.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/nilfunc/doc.go
new file mode 100644
index 0000000..07f7933
--- /dev/null
+++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/nilfunc/doc.go
@@ -0,0 +1,13 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package nilfunc defines an Analyzer that checks for useless
+// comparisons against nil.
+//
+// # Analyzer nilfunc
+//
+// nilfunc: check for useless comparisons between functions and nil
+//
+// A useless comparison is one like f == nil as opposed to f() == nil.
+package nilfunc
diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/nilfunc/nilfunc.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/nilfunc/nilfunc.go
index e4c66df..6df1343 100644
--- a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/nilfunc/nilfunc.go
+++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/nilfunc/nilfunc.go
@@ -7,23 +7,25 @@
 package nilfunc
 
 import (
+	_ "embed"
 	"go/ast"
 	"go/token"
 	"go/types"
 
 	"golang.org/x/tools/go/analysis"
 	"golang.org/x/tools/go/analysis/passes/inspect"
+	"golang.org/x/tools/go/analysis/passes/internal/analysisutil"
 	"golang.org/x/tools/go/ast/inspector"
 	"golang.org/x/tools/internal/typeparams"
 )
 
-const Doc = `check for useless comparisons between functions and nil
-
-A useless comparison is one like f == nil as opposed to f() == nil.`
+//go:embed doc.go
+var doc string
 
 var Analyzer = &analysis.Analyzer{
 	Name:     "nilfunc",
-	Doc:      Doc,
+	Doc:      analysisutil.MustExtractDoc(doc, "nilfunc"),
+	URL:      "https://pkg.go.dev/golang.org/x/tools/go/analysis/passes/nilfunc",
 	Requires: []*analysis.Analyzer{inspect.Analyzer},
 	Run:      run,
 }
diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/printf/doc.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/printf/doc.go
new file mode 100644
index 0000000..1ee1612
--- /dev/null
+++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/printf/doc.go
@@ -0,0 +1,47 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package printf defines an Analyzer that checks consistency
+// of Printf format strings and arguments.
+//
+// # Analyzer printf
+//
+// printf: check consistency of Printf format strings and arguments
+//
+// The check applies to calls of the formatting functions such as
+// [fmt.Printf] and [fmt.Sprintf], as well as any detected wrappers of
+// those functions.
+//
+// In this example, the %d format operator requires an integer operand:
+//
+//	fmt.Printf("%d", "hello") // fmt.Printf format %d has arg "hello" of wrong type string
+//
+// See the documentation of the fmt package for the complete set of
+// format operators and their operand types.
+//
+// To enable printf checking on a function that is not found by this
+// analyzer's heuristics (for example, because control is obscured by
+// dynamic method calls), insert a bogus call:
+//
+//	func MyPrintf(format string, args ...any) {
+//		if false {
+//			_ = fmt.Sprintf(format, args...) // enable printf checker
+//		}
+//		...
+//	}
+//
+// The -funcs flag specifies a comma-separated list of names of additional
+// known formatting functions or methods. If the name contains a period,
+// it must denote a specific function using one of the following forms:
+//
+//	dir/pkg.Function
+//	dir/pkg.Type.Method
+//	(*dir/pkg.Type).Method
+//
+// Otherwise the name is interpreted as a case-insensitive unqualified
+// identifier such as "errorf". Either way, if a listed name ends in f, the
+// function is assumed to be Printf-like, taking a format string before the
+// argument list. Otherwise it is assumed to be Print-like, taking a list
+// of arguments with no format string.
+package printf
diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/printf/printf.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/printf/printf.go
index daaf709..b2b8c67 100644
--- a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/printf/printf.go
+++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/printf/printf.go
@@ -2,12 +2,11 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// Package printf defines an Analyzer that checks consistency
-// of Printf format strings and arguments.
 package printf
 
 import (
 	"bytes"
+	_ "embed"
 	"fmt"
 	"go/ast"
 	"go/constant"
@@ -32,43 +31,19 @@
 	Analyzer.Flags.Var(isPrint, "funcs", "comma-separated list of print function names to check")
 }
 
+//go:embed doc.go
+var doc string
+
 var Analyzer = &analysis.Analyzer{
 	Name:       "printf",
-	Doc:        Doc,
+	Doc:        analysisutil.MustExtractDoc(doc, "printf"),
+	URL:        "https://pkg.go.dev/golang.org/x/tools/go/analysis/passes/printf",
 	Requires:   []*analysis.Analyzer{inspect.Analyzer},
 	Run:        run,
 	ResultType: reflect.TypeOf((*Result)(nil)),
 	FactTypes:  []analysis.Fact{new(isWrapper)},
 }
 
-const Doc = `check consistency of Printf format strings and arguments
-
-The check applies to known functions (for example, those in package fmt)
-as well as any detected wrappers of known functions.
-
-A function that wants to avail itself of printf checking but is not
-found by this analyzer's heuristics (for example, due to use of
-dynamic calls) can insert a bogus call:
-
-	if false {
-		_ = fmt.Sprintf(format, args...) // enable printf checking
-	}
-
-The -funcs flag specifies a comma-separated list of names of additional
-known formatting functions or methods. If the name contains a period,
-it must denote a specific function using one of the following forms:
-
-	dir/pkg.Function
-	dir/pkg.Type.Method
-	(*dir/pkg.Type).Method
-
-Otherwise the name is interpreted as a case-insensitive unqualified
-identifier such as "errorf". Either way, if a listed name ends in f, the
-function is assumed to be Printf-like, taking a format string before the
-argument list. Otherwise it is assumed to be Print-like, taking a list
-of arguments with no format string.
-`
-
 // Kind is a kind of fmt function behavior.
 type Kind int
 
@@ -303,7 +278,7 @@
 			// print/printf function can take, adding an ellipsis
 			// would break the program. For example:
 			//
-			//   func foo(arg1 string, arg2 ...interface{} {
+			//   func foo(arg1 string, arg2 ...interface{}) {
 			//       fmt.Printf("%s %v", arg1, arg2)
 			//   }
 			return
@@ -340,9 +315,10 @@
 // example, fmt.Printf forwards to fmt.Fprintf. We avoid relying on the
 // driver applying analyzers to standard packages because "go vet" does
 // not do so with gccgo, and nor do some other build systems.
-// TODO(adonovan): eliminate the redundant facts once this restriction
-// is lifted.
 var isPrint = stringSet{
+	"fmt.Appendf":  true,
+	"fmt.Append":   true,
+	"fmt.Appendln": true,
 	"fmt.Errorf":   true,
 	"fmt.Fprint":   true,
 	"fmt.Fprintf":  true,
@@ -1080,7 +1056,7 @@
 		if strings.Contains(s, "%") {
 			m := printFormatRE.FindStringSubmatch(s)
 			if m != nil {
-				pass.ReportRangef(call, "%s call has possible formatting directive %s", fn.FullName(), m[0])
+				pass.ReportRangef(call, "%s call has possible Printf formatting directive %s", fn.FullName(), m[0])
 			}
 		}
 	}
diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/shift/shift.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/shift/shift.go
index e968f27..bafb911 100644
--- a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/shift/shift.go
+++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/shift/shift.go
@@ -29,6 +29,7 @@
 var Analyzer = &analysis.Analyzer{
 	Name:     "shift",
 	Doc:      Doc,
+	URL:      "https://pkg.go.dev/golang.org/x/tools/go/analysis/passes/shift",
 	Requires: []*analysis.Analyzer{inspect.Analyzer},
 	Run:      run,
 }
diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/sigchanyzer/doc.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/sigchanyzer/doc.go
new file mode 100644
index 0000000..583fed0
--- /dev/null
+++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/sigchanyzer/doc.go
@@ -0,0 +1,17 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package sigchanyzer defines an Analyzer that detects
+// misuse of unbuffered signal as argument to signal.Notify.
+//
+// # Analyzer sigchanyzer
+//
+// sigchanyzer: check for unbuffered channel of os.Signal
+//
+// This checker reports call expression of the form
+//
+//	signal.Notify(c <-chan os.Signal, sig ...os.Signal),
+//
+// where c is an unbuffered channel, which can be at risk of missing the signal.
+package sigchanyzer
diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/sigchanyzer/sigchanyzer.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/sigchanyzer/sigchanyzer.go
index c490a84..5f121f7 100644
--- a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/sigchanyzer/sigchanyzer.go
+++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/sigchanyzer/sigchanyzer.go
@@ -8,6 +8,7 @@
 
 import (
 	"bytes"
+	_ "embed"
 	"go/ast"
 	"go/format"
 	"go/token"
@@ -15,23 +16,27 @@
 
 	"golang.org/x/tools/go/analysis"
 	"golang.org/x/tools/go/analysis/passes/inspect"
+	"golang.org/x/tools/go/analysis/passes/internal/analysisutil"
 	"golang.org/x/tools/go/ast/inspector"
 )
 
-const Doc = `check for unbuffered channel of os.Signal
-
-This checker reports call expression of the form signal.Notify(c <-chan os.Signal, sig ...os.Signal),
-where c is an unbuffered channel, which can be at risk of missing the signal.`
+//go:embed doc.go
+var doc string
 
 // Analyzer describes sigchanyzer analysis function detector.
 var Analyzer = &analysis.Analyzer{
 	Name:     "sigchanyzer",
-	Doc:      Doc,
+	Doc:      analysisutil.MustExtractDoc(doc, "sigchanyzer"),
+	URL:      "https://pkg.go.dev/golang.org/x/tools/go/analysis/passes/sigchanyzer",
 	Requires: []*analysis.Analyzer{inspect.Analyzer},
 	Run:      run,
 }
 
 func run(pass *analysis.Pass) (interface{}, error) {
+	if !analysisutil.Imports(pass.Pkg, "os/signal") {
+		return nil, nil // doesn't directly import signal
+	}
+
 	inspect := pass.ResultOf[inspect.Analyzer].(*inspector.Inspector)
 
 	nodeFilter := []ast.Node{
diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/slog/doc.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/slog/doc.go
new file mode 100644
index 0000000..ecb10e0
--- /dev/null
+++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/slog/doc.go
@@ -0,0 +1,23 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package slog defines an Analyzer that checks for
+// mismatched key-value pairs in log/slog calls.
+//
+// # Analyzer slog
+//
+// slog: check for invalid structured logging calls
+//
+// The slog checker looks for calls to functions from the log/slog
+// package that take alternating key-value pairs. It reports calls
+// where an argument in a key position is neither a string nor a
+// slog.Attr, and where a final key is missing its value.
+// For example,it would report
+//
+//	slog.Warn("message", 11, "k") // slog.Warn arg "11" should be a string or a slog.Attr
+//
+// and
+//
+//	slog.Info("message", "k1", v1, "k2") // call to slog.Info missing a final value
+package slog
diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/slog/slog.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/slog/slog.go
new file mode 100644
index 0000000..92c1da8
--- /dev/null
+++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/slog/slog.go
@@ -0,0 +1,243 @@
+// Copyright 2023 The Go 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(jba) deduce which functions wrap the log/slog functions, and use the
+// fact mechanism to propagate this information, so we can provide diagnostics
+// for user-supplied wrappers.
+
+package slog
+
+import (
+	_ "embed"
+	"fmt"
+	"go/ast"
+	"go/token"
+	"go/types"
+
+	"golang.org/x/tools/go/analysis"
+	"golang.org/x/tools/go/analysis/passes/inspect"
+	"golang.org/x/tools/go/analysis/passes/internal/analysisutil"
+	"golang.org/x/tools/go/ast/inspector"
+	"golang.org/x/tools/go/types/typeutil"
+)
+
+//go:embed doc.go
+var doc string
+
+var Analyzer = &analysis.Analyzer{
+	Name:     "slog",
+	Doc:      analysisutil.MustExtractDoc(doc, "slog"),
+	URL:      "https://pkg.go.dev/golang.org/x/tools/go/analysis/passes/slog",
+	Requires: []*analysis.Analyzer{inspect.Analyzer},
+	Run:      run,
+}
+
+var stringType = types.Universe.Lookup("string").Type()
+
+// A position describes what is expected to appear in an argument position.
+type position int
+
+const (
+	// key is an argument position that should hold a string key or an Attr.
+	key position = iota
+	// value is an argument position that should hold a value.
+	value
+	// unknown represents that we do not know if position should hold a key or a value.
+	unknown
+)
+
+func run(pass *analysis.Pass) (any, error) {
+	inspect := pass.ResultOf[inspect.Analyzer].(*inspector.Inspector)
+	nodeFilter := []ast.Node{
+		(*ast.CallExpr)(nil),
+	}
+	inspect.Preorder(nodeFilter, func(node ast.Node) {
+		call := node.(*ast.CallExpr)
+		fn := typeutil.StaticCallee(pass.TypesInfo, call)
+		if fn == nil {
+			return // not a static call
+		}
+		if call.Ellipsis != token.NoPos {
+			return // skip calls with "..." args
+		}
+		skipArgs, ok := kvFuncSkipArgs(fn)
+		if !ok {
+			// Not a slog function that takes key-value pairs.
+			return
+		}
+		if isMethodExpr(pass.TypesInfo, call) {
+			// Call is to a method value. Skip the first argument.
+			skipArgs++
+		}
+		if len(call.Args) <= skipArgs {
+			// Too few args; perhaps there are no k-v pairs.
+			return
+		}
+
+		// Check this call.
+		// The first position should hold a key or Attr.
+		pos := key
+		var unknownArg ast.Expr // nil or the last unknown argument
+		for _, arg := range call.Args[skipArgs:] {
+			t := pass.TypesInfo.Types[arg].Type
+			switch pos {
+			case key:
+				// Expect a string or Attr.
+				switch {
+				case t == stringType:
+					pos = value
+				case isAttr(t):
+					pos = key
+				case types.IsInterface(t):
+					// As we do not do dataflow, we do not know what the dynamic type is.
+					// It could be a string or an Attr so we don't know what to expect next.
+					pos = unknown
+				default:
+					if unknownArg == nil {
+						pass.ReportRangef(arg, "%s arg %q should be a string or a slog.Attr (possible missing key or value)",
+							shortName(fn), analysisutil.Format(pass.Fset, arg))
+					} else {
+						pass.ReportRangef(arg, "%s arg %q should probably be a string or a slog.Attr (previous arg %q cannot be a key)",
+							shortName(fn), analysisutil.Format(pass.Fset, arg), analysisutil.Format(pass.Fset, unknownArg))
+					}
+					// Stop here so we report at most one missing key per call.
+					return
+				}
+
+			case value:
+				// Anything can appear in this position.
+				// The next position should be a key.
+				pos = key
+
+			case unknown:
+				// Once we encounter an unknown position, we can never be
+				// sure if a problem later or at the end of the call is due to a
+				// missing final value, or a non-key in key position.
+				// In both cases, unknownArg != nil.
+				unknownArg = arg
+
+				// We don't know what is expected about this position, but all hope is not lost.
+				if t != stringType && !isAttr(t) && !types.IsInterface(t) {
+					// This argument is definitely not a key.
+					//
+					// unknownArg cannot have been a key, in which case this is the
+					// corresponding value, and the next position should hold another key.
+					pos = key
+				}
+			}
+		}
+		if pos == value {
+			if unknownArg == nil {
+				pass.ReportRangef(call, "call to %s missing a final value", shortName(fn))
+			} else {
+				pass.ReportRangef(call, "call to %s has a missing or misplaced value", shortName(fn))
+			}
+		}
+	})
+	return nil, nil
+}
+
+func isAttr(t types.Type) bool {
+	return isNamed(t, "log/slog", "Attr")
+}
+
+// shortName returns a name for the function that is shorter than FullName.
+// Examples:
+//
+//	"slog.Info" (instead of "log/slog.Info")
+//	"slog.Logger.With" (instead of "(*log/slog.Logger).With")
+func shortName(fn *types.Func) string {
+	var r string
+	if recv := fn.Type().(*types.Signature).Recv(); recv != nil {
+		t := recv.Type()
+		if pt, ok := t.(*types.Pointer); ok {
+			t = pt.Elem()
+		}
+		if nt, ok := t.(*types.Named); ok {
+			r = nt.Obj().Name()
+		} else {
+			r = recv.Type().String()
+		}
+		r += "."
+	}
+	return fmt.Sprintf("%s.%s%s", fn.Pkg().Name(), r, fn.Name())
+}
+
+// If fn is a slog function that has a ...any parameter for key-value pairs,
+// kvFuncSkipArgs returns the number of arguments to skip over to reach the
+// corresponding arguments, and true.
+// Otherwise it returns (0, false).
+func kvFuncSkipArgs(fn *types.Func) (int, bool) {
+	if pkg := fn.Pkg(); pkg == nil || pkg.Path() != "log/slog" {
+		return 0, false
+	}
+	var recvName string // by default a slog package function
+	recv := fn.Type().(*types.Signature).Recv()
+	if recv != nil {
+		t := recv.Type()
+		if pt, ok := t.(*types.Pointer); ok {
+			t = pt.Elem()
+		}
+		if nt, ok := t.(*types.Named); !ok {
+			return 0, false
+		} else {
+			recvName = nt.Obj().Name()
+		}
+	}
+	skip, ok := kvFuncs[recvName][fn.Name()]
+	return skip, ok
+}
+
+// The names of functions and methods in log/slog that take
+// ...any for key-value pairs, mapped to the number of initial args to skip in
+// order to get to the ones that match the ...any parameter.
+// The first key is the dereferenced receiver type name, or "" for a function.
+var kvFuncs = map[string]map[string]int{
+	"": map[string]int{
+		"Debug":        1,
+		"Info":         1,
+		"Warn":         1,
+		"Error":        1,
+		"DebugContext": 2,
+		"InfoContext":  2,
+		"WarnContext":  2,
+		"ErrorContext": 2,
+		"Log":          3,
+		"Group":        1,
+	},
+	"Logger": map[string]int{
+		"Debug":        1,
+		"Info":         1,
+		"Warn":         1,
+		"Error":        1,
+		"DebugContext": 2,
+		"InfoContext":  2,
+		"WarnContext":  2,
+		"ErrorContext": 2,
+		"Log":          3,
+		"With":         0,
+	},
+	"Record": map[string]int{
+		"Add": 0,
+	},
+}
+
+// isMethodExpr reports whether a call is to a MethodExpr.
+func isMethodExpr(info *types.Info, c *ast.CallExpr) bool {
+	s, ok := c.Fun.(*ast.SelectorExpr)
+	if !ok {
+		return false
+	}
+	sel := info.Selections[s]
+	return sel != nil && sel.Kind() == types.MethodExpr
+}
+
+// isNamed reports whether t is exactly a named type in a package with a given path.
+func isNamed(t types.Type, path, name string) bool {
+	if n, ok := t.(*types.Named); ok {
+		obj := n.Obj()
+		return obj.Pkg() != nil && obj.Pkg().Path() == path && obj.Name() == name
+	}
+	return false
+}
diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/stdmethods/doc.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/stdmethods/doc.go
new file mode 100644
index 0000000..9ed8869
--- /dev/null
+++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/stdmethods/doc.go
@@ -0,0 +1,30 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package stdmethods defines an Analyzer that checks for misspellings
+// in the signatures of methods similar to well-known interfaces.
+//
+// # Analyzer stdmethods
+//
+// stdmethods: check signature of methods of well-known interfaces
+//
+// Sometimes a type may be intended to satisfy an interface but may fail to
+// do so because of a mistake in its method signature.
+// For example, the result of this WriteTo method should be (int64, error),
+// not error, to satisfy io.WriterTo:
+//
+//	type myWriterTo struct{...}
+//	func (myWriterTo) WriteTo(w io.Writer) error { ... }
+//
+// This check ensures that each method whose name matches one of several
+// well-known interface methods from the standard library has the correct
+// signature for that interface.
+//
+// Checked method names include:
+//
+//	Format GobEncode GobDecode MarshalJSON MarshalXML
+//	Peek ReadByte ReadFrom ReadRune Scan Seek
+//	UnmarshalJSON UnreadByte UnreadRune WriteByte
+//	WriteTo
+package stdmethods
diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/stdmethods/stdmethods.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/stdmethods/stdmethods.go
index 41f455d..28f51b1 100644
--- a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/stdmethods/stdmethods.go
+++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/stdmethods/stdmethods.go
@@ -2,44 +2,27 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// Package stdmethods defines an Analyzer that checks for misspellings
-// in the signatures of methods similar to well-known interfaces.
 package stdmethods
 
 import (
+	_ "embed"
 	"go/ast"
 	"go/types"
 	"strings"
 
 	"golang.org/x/tools/go/analysis"
 	"golang.org/x/tools/go/analysis/passes/inspect"
+	"golang.org/x/tools/go/analysis/passes/internal/analysisutil"
 	"golang.org/x/tools/go/ast/inspector"
 )
 
-const Doc = `check signature of methods of well-known interfaces
-
-Sometimes a type may be intended to satisfy an interface but may fail to
-do so because of a mistake in its method signature.
-For example, the result of this WriteTo method should be (int64, error),
-not error, to satisfy io.WriterTo:
-
-	type myWriterTo struct{...}
-        func (myWriterTo) WriteTo(w io.Writer) error { ... }
-
-This check ensures that each method whose name matches one of several
-well-known interface methods from the standard library has the correct
-signature for that interface.
-
-Checked method names include:
-	Format GobEncode GobDecode MarshalJSON MarshalXML
-	Peek ReadByte ReadFrom ReadRune Scan Seek
-	UnmarshalJSON UnreadByte UnreadRune WriteByte
-	WriteTo
-`
+//go:embed doc.go
+var doc string
 
 var Analyzer = &analysis.Analyzer{
 	Name:     "stdmethods",
-	Doc:      Doc,
+	Doc:      analysisutil.MustExtractDoc(doc, "stdmethods"),
+	URL:      "https://pkg.go.dev/golang.org/x/tools/go/analysis/passes/stdmethods",
 	Requires: []*analysis.Analyzer{inspect.Analyzer},
 	Run:      run,
 }
diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/stringintconv/doc.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/stringintconv/doc.go
new file mode 100644
index 0000000..205cd64
--- /dev/null
+++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/stringintconv/doc.go
@@ -0,0 +1,21 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package stringintconv defines an Analyzer that flags type conversions
+// from integers to strings.
+//
+// # Analyzer stringintconv
+//
+// stringintconv: check for string(int) conversions
+//
+// This checker flags conversions of the form string(x) where x is an integer
+// (but not byte or rune) type. Such conversions are discouraged because they
+// return the UTF-8 representation of the Unicode code point x, and not a decimal
+// string representation of x as one might expect. Furthermore, if x denotes an
+// invalid code point, the conversion cannot be statically rejected.
+//
+// For conversions that intend on using the code point, consider replacing them
+// with string(rune(x)). Otherwise, strconv.Itoa and its equivalents return the
+// string representation of the value in the desired base.
+package stringintconv
diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/stringintconv/string.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/stringintconv/string.go
index e41de80..bb04dae 100644
--- a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/stringintconv/string.go
+++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/stringintconv/string.go
@@ -2,11 +2,10 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// Package stringintconv defines an Analyzer that flags type conversions
-// from integers to strings.
 package stringintconv
 
 import (
+	_ "embed"
 	"fmt"
 	"go/ast"
 	"go/types"
@@ -14,26 +13,18 @@
 
 	"golang.org/x/tools/go/analysis"
 	"golang.org/x/tools/go/analysis/passes/inspect"
+	"golang.org/x/tools/go/analysis/passes/internal/analysisutil"
 	"golang.org/x/tools/go/ast/inspector"
 	"golang.org/x/tools/internal/typeparams"
 )
 
-const Doc = `check for string(int) conversions
-
-This checker flags conversions of the form string(x) where x is an integer
-(but not byte or rune) type. Such conversions are discouraged because they
-return the UTF-8 representation of the Unicode code point x, and not a decimal
-string representation of x as one might expect. Furthermore, if x denotes an
-invalid code point, the conversion cannot be statically rejected.
-
-For conversions that intend on using the code point, consider replacing them
-with string(rune(x)). Otherwise, strconv.Itoa and its equivalents return the
-string representation of the value in the desired base.
-`
+//go:embed doc.go
+var doc string
 
 var Analyzer = &analysis.Analyzer{
 	Name:     "stringintconv",
-	Doc:      Doc,
+	Doc:      analysisutil.MustExtractDoc(doc, "stringintconv"),
+	URL:      "https://pkg.go.dev/golang.org/x/tools/go/analysis/passes/stringintconv",
 	Requires: []*analysis.Analyzer{inspect.Analyzer},
 	Run:      run,
 }
diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/structtag/structtag.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/structtag/structtag.go
index f0b1505..a0beb46 100644
--- a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/structtag/structtag.go
+++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/structtag/structtag.go
@@ -28,6 +28,7 @@
 var Analyzer = &analysis.Analyzer{
 	Name:             "structtag",
 	Doc:              Doc,
+	URL:              "https://pkg.go.dev/golang.org/x/tools/go/analysis/passes/structtag",
 	Requires:         []*analysis.Analyzer{inspect.Analyzer},
 	RunDespiteErrors: true,
 	Run:              run,
diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/testinggoroutine/doc.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/testinggoroutine/doc.go
new file mode 100644
index 0000000..a68adb1
--- /dev/null
+++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/testinggoroutine/doc.go
@@ -0,0 +1,22 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package testinggoroutine defines an Analyzerfor detecting calls to
+// Fatal from a test goroutine.
+//
+// # Analyzer testinggoroutine
+//
+// testinggoroutine: report calls to (*testing.T).Fatal from goroutines started by a test.
+//
+// Functions that abruptly terminate a test, such as the Fatal, Fatalf, FailNow, and
+// Skip{,f,Now} methods of *testing.T, must be called from the test goroutine itself.
+// This checker detects calls to these functions that occur within a goroutine
+// started by the test. For example:
+//
+//	func TestFoo(t *testing.T) {
+//	    go func() {
+//	        t.Fatal("oops") // error: (*T).Fatal called from non-test goroutine
+//	    }()
+//	}
+package testinggoroutine
diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/testinggoroutine/testinggoroutine.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/testinggoroutine/testinggoroutine.go
index 7ea8f77..907b715 100644
--- a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/testinggoroutine/testinggoroutine.go
+++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/testinggoroutine/testinggoroutine.go
@@ -5,6 +5,7 @@
 package testinggoroutine
 
 import (
+	_ "embed"
 	"go/ast"
 
 	"golang.org/x/tools/go/analysis"
@@ -14,23 +15,13 @@
 	"golang.org/x/tools/internal/typeparams"
 )
 
-const Doc = `report calls to (*testing.T).Fatal from goroutines started by a test.
-
-Functions that abruptly terminate a test, such as the Fatal, Fatalf, FailNow, and
-Skip{,f,Now} methods of *testing.T, must be called from the test goroutine itself.
-This checker detects calls to these functions that occur within a goroutine
-started by the test. For example:
-
-func TestFoo(t *testing.T) {
-    go func() {
-        t.Fatal("oops") // error: (*T).Fatal called from non-test goroutine
-    }()
-}
-`
+//go:embed doc.go
+var doc string
 
 var Analyzer = &analysis.Analyzer{
 	Name:     "testinggoroutine",
-	Doc:      Doc,
+	Doc:      analysisutil.MustExtractDoc(doc, "testinggoroutine"),
+	URL:      "https://pkg.go.dev/golang.org/x/tools/go/analysis/passes/testinggoroutine",
 	Requires: []*analysis.Analyzer{inspect.Analyzer},
 	Run:      run,
 }
diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/tests/doc.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/tests/doc.go
new file mode 100644
index 0000000..3ae27db
--- /dev/null
+++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/tests/doc.go
@@ -0,0 +1,18 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package tests defines an Analyzer that checks for common mistaken
+// usages of tests and examples.
+//
+// # Analyzer tests
+//
+// tests: check for common mistaken usages of tests and examples
+//
+// The tests checker walks Test, Benchmark, Fuzzing and Example functions checking
+// malformed names, wrong signatures and examples documenting non-existent
+// identifiers.
+//
+// Please see the documentation for package testing in golang.org/pkg/testing
+// for the conventions that are enforced for Tests, Benchmarks, and Examples.
+package tests
diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/tests/tests.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/tests/tests.go
index 935aad0..9589a46 100644
--- a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/tests/tests.go
+++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/tests/tests.go
@@ -2,11 +2,10 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// Package tests defines an Analyzer that checks for common mistaken
-// usages of tests and examples.
 package tests
 
 import (
+	_ "embed"
 	"fmt"
 	"go/ast"
 	"go/token"
@@ -17,22 +16,17 @@
 	"unicode/utf8"
 
 	"golang.org/x/tools/go/analysis"
-	"golang.org/x/tools/internal/analysisinternal"
+	"golang.org/x/tools/go/analysis/passes/internal/analysisutil"
 	"golang.org/x/tools/internal/typeparams"
 )
 
-const Doc = `check for common mistaken usages of tests and examples
-
-The tests checker walks Test, Benchmark and Example functions checking
-malformed names, wrong signatures and examples documenting non-existent
-identifiers.
-
-Please see the documentation for package testing in golang.org/pkg/testing
-for the conventions that are enforced for Tests, Benchmarks, and Examples.`
+//go:embed doc.go
+var doc string
 
 var Analyzer = &analysis.Analyzer{
 	Name: "tests",
-	Doc:  Doc,
+	Doc:  analysisutil.MustExtractDoc(doc, "tests"),
+	URL:  "https://pkg.go.dev/golang.org/x/tools/go/analysis/passes/tests",
 	Run:  run,
 }
 
@@ -73,9 +67,7 @@
 				checkTest(pass, fn, "Test")
 			case strings.HasPrefix(fn.Name.Name, "Benchmark"):
 				checkTest(pass, fn, "Benchmark")
-			}
-			// run fuzz tests diagnostics only for 1.18 i.e. when analysisinternal.DiagnoseFuzzTests is turned on.
-			if strings.HasPrefix(fn.Name.Name, "Fuzz") && analysisinternal.DiagnoseFuzzTests {
+			case strings.HasPrefix(fn.Name.Name, "Fuzz"):
 				checkTest(pass, fn, "Fuzz")
 				checkFuzz(pass, fn)
 			}
diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/timeformat/doc.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/timeformat/doc.go
new file mode 100644
index 0000000..5c665b2
--- /dev/null
+++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/timeformat/doc.go
@@ -0,0 +1,15 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package timeformat defines an Analyzer that checks for the use
+// of time.Format or time.Parse calls with a bad format.
+//
+// # Analyzer timeformat
+//
+// timeformat: check for calls of (time.Time).Format or time.Parse with 2006-02-01
+//
+// The timeformat checker looks for time formats with the 2006-02-01 (yyyy-dd-mm)
+// format. Internationally, "yyyy-dd-mm" does not occur in common calendar date
+// standards, and so it is more likely that 2006-01-02 (yyyy-mm-dd) was intended.
+package timeformat
diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/timeformat/timeformat.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/timeformat/timeformat.go
index acb198f..c45b9fa 100644
--- a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/timeformat/timeformat.go
+++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/timeformat/timeformat.go
@@ -7,6 +7,7 @@
 package timeformat
 
 import (
+	_ "embed"
 	"go/ast"
 	"go/constant"
 	"go/token"
@@ -15,6 +16,7 @@
 
 	"golang.org/x/tools/go/analysis"
 	"golang.org/x/tools/go/analysis/passes/inspect"
+	"golang.org/x/tools/go/analysis/passes/internal/analysisutil"
 	"golang.org/x/tools/go/ast/inspector"
 	"golang.org/x/tools/go/types/typeutil"
 )
@@ -22,21 +24,23 @@
 const badFormat = "2006-02-01"
 const goodFormat = "2006-01-02"
 
-const Doc = `check for calls of (time.Time).Format or time.Parse with 2006-02-01
-
-The timeformat checker looks for time formats with the 2006-02-01 (yyyy-dd-mm)
-format. Internationally, "yyyy-dd-mm" does not occur in common calendar date
-standards, and so it is more likely that 2006-01-02 (yyyy-mm-dd) was intended.
-`
+//go:embed doc.go
+var doc string
 
 var Analyzer = &analysis.Analyzer{
 	Name:     "timeformat",
-	Doc:      Doc,
+	Doc:      analysisutil.MustExtractDoc(doc, "timeformat"),
+	URL:      "https://pkg.go.dev/golang.org/x/tools/go/analysis/passes/timeformat",
 	Requires: []*analysis.Analyzer{inspect.Analyzer},
 	Run:      run,
 }
 
 func run(pass *analysis.Pass) (interface{}, error) {
+	// Note: (time.Time).Format is a method and can be a typeutil.Callee
+	// without directly importing "time". So we cannot just skip this package
+	// when !analysisutil.Imports(pass.Pkg, "time").
+	// TODO(taking): Consider using a prepass to collect typeutil.Callees.
+
 	inspect := pass.ResultOf[inspect.Analyzer].(*inspector.Inspector)
 
 	nodeFilter := []ast.Node{
diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/unmarshal/doc.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/unmarshal/doc.go
new file mode 100644
index 0000000..5781bbd
--- /dev/null
+++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/unmarshal/doc.go
@@ -0,0 +1,14 @@
+// Copyright 2023 The Go 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 unmarshal package defines an Analyzer that checks for passing
+// non-pointer or non-interface types to unmarshal and decode functions.
+//
+// # Analyzer unmarshal
+//
+// unmarshal: report passing non-pointer or non-interface values to unmarshal
+//
+// The unmarshal analysis reports calls to functions such as json.Unmarshal
+// in which the argument type is not a pointer or an interface.
+package unmarshal
diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/unmarshal/unmarshal.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/unmarshal/unmarshal.go
index 5129048..7043baa 100644
--- a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/unmarshal/unmarshal.go
+++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/unmarshal/unmarshal.go
@@ -2,29 +2,28 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// The unmarshal package defines an Analyzer that checks for passing
-// non-pointer or non-interface types to unmarshal and decode functions.
 package unmarshal
 
 import (
+	_ "embed"
 	"go/ast"
 	"go/types"
 
 	"golang.org/x/tools/go/analysis"
 	"golang.org/x/tools/go/analysis/passes/inspect"
+	"golang.org/x/tools/go/analysis/passes/internal/analysisutil"
 	"golang.org/x/tools/go/ast/inspector"
 	"golang.org/x/tools/go/types/typeutil"
 	"golang.org/x/tools/internal/typeparams"
 )
 
-const Doc = `report passing non-pointer or non-interface values to unmarshal
-
-The unmarshal analysis reports calls to functions such as json.Unmarshal
-in which the argument type is not a pointer or an interface.`
+//go:embed doc.go
+var doc string
 
 var Analyzer = &analysis.Analyzer{
 	Name:     "unmarshal",
-	Doc:      Doc,
+	Doc:      analysisutil.MustExtractDoc(doc, "unmarshal"),
+	URL:      "https://pkg.go.dev/golang.org/x/tools/go/analysis/passes/unmarshal",
 	Requires: []*analysis.Analyzer{inspect.Analyzer},
 	Run:      run,
 }
@@ -37,6 +36,12 @@
 		return nil, nil
 	}
 
+	// Note: (*"encoding/json".Decoder).Decode, (* "encoding/gob".Decoder).Decode
+	// and (* "encoding/xml".Decoder).Decode are methods and can be a typeutil.Callee
+	// without directly importing their packages. So we cannot just skip this package
+	// when !analysisutil.Imports(pass.Pkg, "encoding/...").
+	// TODO(taking): Consider using a prepass to collect typeutil.Callees.
+
 	inspect := pass.ResultOf[inspect.Analyzer].(*inspector.Inspector)
 
 	nodeFilter := []ast.Node{
@@ -51,6 +56,7 @@
 
 		// Classify the callee (without allocating memory).
 		argidx := -1
+
 		recv := fn.Type().(*types.Signature).Recv()
 		if fn.Name() == "Unmarshal" && recv == nil {
 			// "encoding/json".Unmarshal
diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/unreachable/doc.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/unreachable/doc.go
new file mode 100644
index 0000000..d17d0d9
--- /dev/null
+++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/unreachable/doc.go
@@ -0,0 +1,14 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package unreachable defines an Analyzer that checks for unreachable code.
+//
+// # Analyzer unreachable
+//
+// unreachable: check for unreachable code
+//
+// The unreachable analyzer finds statements that execution can never reach
+// because they are preceded by an return statement, a call to panic, an
+// infinite loop, or similar constructs.
+package unreachable
diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/unreachable/unreachable.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/unreachable/unreachable.go
index 90896dd..b810db7 100644
--- a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/unreachable/unreachable.go
+++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/unreachable/unreachable.go
@@ -2,30 +2,29 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// Package unreachable defines an Analyzer that checks for unreachable code.
 package unreachable
 
 // TODO(adonovan): use the new cfg package, which is more precise.
 
 import (
+	_ "embed"
 	"go/ast"
 	"go/token"
 	"log"
 
 	"golang.org/x/tools/go/analysis"
 	"golang.org/x/tools/go/analysis/passes/inspect"
+	"golang.org/x/tools/go/analysis/passes/internal/analysisutil"
 	"golang.org/x/tools/go/ast/inspector"
 )
 
-const Doc = `check for unreachable code
-
-The unreachable analyzer finds statements that execution can never reach
-because they are preceded by an return statement, a call to panic, an
-infinite loop, or similar constructs.`
+//go:embed doc.go
+var doc string
 
 var Analyzer = &analysis.Analyzer{
 	Name:             "unreachable",
-	Doc:              Doc,
+	Doc:              analysisutil.MustExtractDoc(doc, "unreachable"),
+	URL:              "https://pkg.go.dev/golang.org/x/tools/go/analysis/passes/unreachable",
 	Requires:         []*analysis.Analyzer{inspect.Analyzer},
 	RunDespiteErrors: true,
 	Run:              run,
diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/unsafeptr/doc.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/unsafeptr/doc.go
new file mode 100644
index 0000000..de10804
--- /dev/null
+++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/unsafeptr/doc.go
@@ -0,0 +1,17 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package unsafeptr defines an Analyzer that checks for invalid
+// conversions of uintptr to unsafe.Pointer.
+//
+// # Analyzer unsafeptr
+//
+// unsafeptr: check for invalid conversions of uintptr to unsafe.Pointer
+//
+// The unsafeptr analyzer reports likely incorrect uses of unsafe.Pointer
+// to convert integers to pointers. A conversion from uintptr to
+// unsafe.Pointer is invalid if it implies that there is a uintptr-typed
+// word in memory that holds a pointer value, because that word will be
+// invisible to stack copying and to the garbage collector.
+package unsafeptr
diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/unsafeptr/unsafeptr.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/unsafeptr/unsafeptr.go
index ed86e5e..e43ac20 100644
--- a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/unsafeptr/unsafeptr.go
+++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/unsafeptr/unsafeptr.go
@@ -7,6 +7,7 @@
 package unsafeptr
 
 import (
+	_ "embed"
 	"go/ast"
 	"go/token"
 	"go/types"
@@ -17,17 +18,13 @@
 	"golang.org/x/tools/go/ast/inspector"
 )
 
-const Doc = `check for invalid conversions of uintptr to unsafe.Pointer
-
-The unsafeptr analyzer reports likely incorrect uses of unsafe.Pointer
-to convert integers to pointers. A conversion from uintptr to
-unsafe.Pointer is invalid if it implies that there is a uintptr-typed
-word in memory that holds a pointer value, because that word will be
-invisible to stack copying and to the garbage collector.`
+//go:embed doc.go
+var doc string
 
 var Analyzer = &analysis.Analyzer{
 	Name:     "unsafeptr",
-	Doc:      Doc,
+	Doc:      analysisutil.MustExtractDoc(doc, "unsafeptr"),
+	URL:      "https://pkg.go.dev/golang.org/x/tools/go/analysis/passes/unsafeptr",
 	Requires: []*analysis.Analyzer{inspect.Analyzer},
 	Run:      run,
 }
diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/unusedresult/doc.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/unusedresult/doc.go
new file mode 100644
index 0000000..a1bf4cf
--- /dev/null
+++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/unusedresult/doc.go
@@ -0,0 +1,19 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package unusedresult defines an analyzer that checks for unused
+// results of calls to certain pure functions.
+//
+// # Analyzer unusedresult
+//
+// unusedresult: check for unused results of calls to some functions
+//
+// Some functions like fmt.Errorf return a result and have no side
+// effects, so it is always a mistake to discard the result. Other
+// functions may return an error that must not be ignored, or a cleanup
+// operation that must be called. This analyzer reports calls to
+// functions like these when the result of the call is ignored.
+//
+// The set of functions may be controlled using flags.
+package unusedresult
diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/unusedresult/unusedresult.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/unusedresult/unusedresult.go
index 06747ba..cb487a2 100644
--- a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/unusedresult/unusedresult.go
+++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/unusedresult/unusedresult.go
@@ -3,10 +3,18 @@
 // license that can be found in the LICENSE file.
 
 // Package unusedresult defines an analyzer that checks for unused
-// results of calls to certain pure functions.
+// results of calls to certain functions.
 package unusedresult
 
+// It is tempting to make this analysis inductive: for each function
+// that tail-calls one of the functions that we check, check those
+// functions too. However, just because you must use the result of
+// fmt.Sprintf doesn't mean you need to use the result of every
+// function that returns a formatted string: it may have other results
+// and effects.
+
 import (
+	_ "embed"
 	"go/ast"
 	"go/token"
 	"go/types"
@@ -17,24 +25,16 @@
 	"golang.org/x/tools/go/analysis/passes/inspect"
 	"golang.org/x/tools/go/analysis/passes/internal/analysisutil"
 	"golang.org/x/tools/go/ast/inspector"
-	"golang.org/x/tools/internal/typeparams"
+	"golang.org/x/tools/go/types/typeutil"
 )
 
-// TODO(adonovan): make this analysis modular: export a mustUseResult
-// fact for each function that tail-calls one of the functions that we
-// check, and check those functions too.
-
-const Doc = `check for unused results of calls to some functions
-
-Some functions like fmt.Errorf return a result and have no side effects,
-so it is always a mistake to discard the result. This analyzer reports
-calls to certain functions in which the result of the call is ignored.
-
-The set of functions may be controlled using flags.`
+//go:embed doc.go
+var doc string
 
 var Analyzer = &analysis.Analyzer{
 	Name:     "unusedresult",
-	Doc:      Doc,
+	Doc:      analysisutil.MustExtractDoc(doc, "unusedresult"),
+	URL:      "https://pkg.go.dev/golang.org/x/tools/go/analysis/passes/unusedresult",
 	Requires: []*analysis.Analyzer{inspect.Analyzer},
 	Run:      run,
 }
@@ -43,8 +43,21 @@
 var funcs, stringMethods stringSetFlag
 
 func init() {
-	// TODO(adonovan): provide a comment syntax to allow users to
-	// add their functions to this set using facts.
+	// TODO(adonovan): provide a comment or declaration syntax to
+	// allow users to add their functions to this set using facts.
+	// For example:
+	//
+	//    func ignoringTheErrorWouldBeVeryBad() error {
+	//      type mustUseResult struct{} // enables vet unusedresult check
+	//      ...
+	//    }
+	//
+	//    ignoringTheErrorWouldBeVeryBad() // oops
+	//
+
+	// List standard library functions here.
+	// The context.With{Cancel,Deadline,Timeout} entries are
+	// effectively redundant wrt the lostcancel analyzer.
 	funcs.Set("errors.New,fmt.Errorf,fmt.Sprintf,fmt.Sprint,sort.Reverse,context.WithValue,context.WithCancel,context.WithDeadline,context.WithTimeout")
 	Analyzer.Flags.Var(&funcs, "funcs",
 		"comma-separated list of functions whose results must be used")
@@ -57,6 +70,14 @@
 func run(pass *analysis.Pass) (interface{}, error) {
 	inspect := pass.ResultOf[inspect.Analyzer].(*inspector.Inspector)
 
+	// Split functions into (pkg, name) pairs to save allocation later.
+	pkgFuncs := make(map[[2]string]bool, len(funcs))
+	for s := range funcs {
+		if i := strings.LastIndexByte(s, '.'); i > 0 {
+			pkgFuncs[[2]string{s[:i], s[i+1:]}] = true
+		}
+	}
+
 	nodeFilter := []ast.Node{
 		(*ast.ExprStmt)(nil),
 	}
@@ -65,41 +86,26 @@
 		if !ok {
 			return // not a call statement
 		}
-		fun := analysisutil.Unparen(call.Fun)
 
-		if pass.TypesInfo.Types[fun].IsType() {
-			return // a conversion, not a call
-		}
-
-		x, _, _, _ := typeparams.UnpackIndexExpr(fun)
-		if x != nil {
-			fun = x // If this is generic function or method call, skip the instantiation arguments
-		}
-
-		selector, ok := fun.(*ast.SelectorExpr)
+		// Call to function or method?
+		fn, ok := typeutil.Callee(pass.TypesInfo, call).(*types.Func)
 		if !ok {
-			return // neither a method call nor a qualified ident
+			return // e.g. var or builtin
 		}
 
-		sel, ok := pass.TypesInfo.Selections[selector]
-		if ok && sel.Kind() == types.MethodVal {
+		if sig := fn.Type().(*types.Signature); sig.Recv() != nil {
 			// method (e.g. foo.String())
-			obj := sel.Obj().(*types.Func)
-			sig := sel.Type().(*types.Signature)
 			if types.Identical(sig, sigNoArgsStringResult) {
-				if stringMethods[obj.Name()] {
+				if stringMethods[fn.Name()] {
 					pass.Reportf(call.Lparen, "result of (%s).%s call not used",
-						sig.Recv().Type(), obj.Name())
+						sig.Recv().Type(), fn.Name())
 				}
 			}
-		} else if !ok {
-			// package-qualified function (e.g. fmt.Errorf)
-			obj := pass.TypesInfo.Uses[selector.Sel]
-			if obj, ok := obj.(*types.Func); ok {
-				qname := obj.Pkg().Path() + "." + obj.Name()
-				if funcs[qname] {
-					pass.Reportf(call.Lparen, "result of %v call not used", qname)
-				}
+		} else {
+			// package-level function (e.g. fmt.Errorf)
+			if pkgFuncs[[2]string{fn.Pkg().Path(), fn.Name()}] {
+				pass.Reportf(call.Lparen, "result of %s.%s call not used",
+					fn.Pkg().Path(), fn.Name())
 			}
 		}
 	})
diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/unitchecker/unitchecker.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/unitchecker/unitchecker.go
index 6e6907d..10c76bc 100644
--- a/src/cmd/vendor/golang.org/x/tools/go/analysis/unitchecker/unitchecker.go
+++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/unitchecker/unitchecker.go
@@ -62,6 +62,7 @@
 	Compiler                  string
 	Dir                       string
 	ImportPath                string
+	GoVersion                 string // minimum required Go version, such as "go1.21.0"
 	GoFiles                   []string
 	NonGoFiles                []string
 	IgnoredFiles              []string
@@ -183,11 +184,6 @@
 	return cfg, nil
 }
 
-var importerForCompiler = func(_ *token.FileSet, compiler string, lookup importer.Lookup) types.Importer {
-	// broken legacy implementation (https://golang.org/issue/28995)
-	return importer.For(compiler, lookup)
-}
-
 func run(fset *token.FileSet, cfg *Config, analyzers []*analysis.Analyzer) ([]result, error) {
 	// Load, parse, typecheck.
 	var files []*ast.File
@@ -203,7 +199,7 @@
 		}
 		files = append(files, f)
 	}
-	compilerImporter := importerForCompiler(fset, cfg.Compiler, func(path string) (io.ReadCloser, error) {
+	compilerImporter := importer.ForCompiler(fset, cfg.Compiler, func(path string) (io.ReadCloser, error) {
 		// path is a resolved package path, not an import path.
 		file, ok := cfg.PackageFile[path]
 		if !ok {
@@ -222,8 +218,9 @@
 		return compilerImporter.Import(path)
 	})
 	tc := &types.Config{
-		Importer: importer,
-		Sizes:    types.SizesFor("gc", build.Default.GOARCH), // assume gccgo ≡ gc?
+		Importer:  importer,
+		Sizes:     types.SizesFor("gc", build.Default.GOARCH), // assume gccgo ≡ gc?
+		GoVersion: cfg.GoVersion,
 	}
 	info := &types.Info{
 		Types:      make(map[ast.Expr]types.TypeAndValue),
@@ -249,6 +246,10 @@
 	// In VetxOnly mode, analyzers are only for their facts,
 	// so we can skip any analysis that neither produces facts
 	// nor depends on any analysis that produces facts.
+	//
+	// TODO(adonovan): fix: the command (and logic!) here are backwards.
+	// It should say "...nor is required by any...". (Issue 443099)
+	//
 	// Also build a map to hold working state and result.
 	type action struct {
 		once        sync.Once
@@ -353,6 +354,16 @@
 
 			t0 := time.Now()
 			act.result, act.err = a.Run(pass)
+
+			if act.err == nil { // resolve URLs on diagnostics.
+				for i := range act.diagnostics {
+					if url, uerr := analysisflags.ResolveURL(a, act.diagnostics[i]); uerr == nil {
+						act.diagnostics[i].URL = url
+					} else {
+						act.err = uerr // keep the last error
+					}
+				}
+			}
 			if false {
 				log.Printf("analysis %s = %s", pass, time.Since(t0))
 			}
diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/unitchecker/unitchecker112.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/unitchecker/unitchecker112.go
deleted file mode 100644
index 3180f4a..0000000
--- a/src/cmd/vendor/golang.org/x/tools/go/analysis/unitchecker/unitchecker112.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2018 The Go 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:build go1.12
-// +build go1.12
-
-package unitchecker
-
-import "go/importer"
-
-func init() {
-	importerForCompiler = importer.ForCompiler
-}
diff --git a/src/cmd/vendor/golang.org/x/tools/go/ast/inspector/inspector.go b/src/cmd/vendor/golang.org/x/tools/go/ast/inspector/inspector.go
index af5e17f..1fc1de0 100644
--- a/src/cmd/vendor/golang.org/x/tools/go/ast/inspector/inspector.go
+++ b/src/cmd/vendor/golang.org/x/tools/go/ast/inspector/inspector.go
@@ -53,16 +53,20 @@
 // of an ast.Node during a traversal.
 type event struct {
 	node  ast.Node
-	typ   uint64 // typeOf(node)
-	index int    // 1 + index of corresponding pop event, or 0 if this is a pop
+	typ   uint64 // typeOf(node) on push event, or union of typ strictly between push and pop events on pop events
+	index int    // index of corresponding push or pop event
 }
 
+// TODO: Experiment with storing only the second word of event.node (unsafe.Pointer).
+// Type can be recovered from the sole bit in typ.
+
 // Preorder visits all the nodes of the files supplied to New in
 // depth-first order. It calls f(n) for each node n before it visits
 // n's children.
 //
+// The complete traversal sequence is determined by ast.Inspect.
 // The types argument, if non-empty, enables type-based filtering of
-// events. The function f if is called only for nodes whose type
+// events. The function f is called only for nodes whose type
 // matches an element of the types slice.
 func (in *Inspector) Preorder(types []ast.Node, f func(ast.Node)) {
 	// Because it avoids postorder calls to f, and the pruning
@@ -72,10 +76,17 @@
 	mask := maskOf(types)
 	for i := 0; i < len(in.events); {
 		ev := in.events[i]
-		if ev.typ&mask != 0 {
-			if ev.index > 0 {
+		if ev.index > i {
+			// push
+			if ev.typ&mask != 0 {
 				f(ev.node)
 			}
+			pop := ev.index
+			if in.events[pop].typ&mask == 0 {
+				// Subtrees do not contain types: skip them and pop.
+				i = pop + 1
+				continue
+			}
 		}
 		i++
 	}
@@ -87,6 +98,7 @@
 // of the non-nil children of the node, followed by a call of
 // f(n, false).
 //
+// The complete traversal sequence is determined by ast.Inspect.
 // The types argument, if non-empty, enables type-based filtering of
 // events. The function f if is called only for nodes whose type
 // matches an element of the types slice.
@@ -94,15 +106,24 @@
 	mask := maskOf(types)
 	for i := 0; i < len(in.events); {
 		ev := in.events[i]
-		if ev.typ&mask != 0 {
-			if ev.index > 0 {
-				// push
+		if ev.index > i {
+			// push
+			pop := ev.index
+			if ev.typ&mask != 0 {
 				if !f(ev.node, true) {
-					i = ev.index // jump to corresponding pop + 1
+					i = pop + 1 // jump to corresponding pop + 1
 					continue
 				}
-			} else {
-				// pop
+			}
+			if in.events[pop].typ&mask == 0 {
+				// Subtrees do not contain types: skip them.
+				i = pop
+				continue
+			}
+		} else {
+			// pop
+			push := ev.index
+			if in.events[push].typ&mask != 0 {
 				f(ev.node, false)
 			}
 		}
@@ -119,19 +140,26 @@
 	var stack []ast.Node
 	for i := 0; i < len(in.events); {
 		ev := in.events[i]
-		if ev.index > 0 {
+		if ev.index > i {
 			// push
+			pop := ev.index
 			stack = append(stack, ev.node)
 			if ev.typ&mask != 0 {
 				if !f(ev.node, true, stack) {
-					i = ev.index
+					i = pop + 1
 					stack = stack[:len(stack)-1]
 					continue
 				}
 			}
+			if in.events[pop].typ&mask == 0 {
+				// Subtrees does not contain types: skip them.
+				i = pop
+				continue
+			}
 		} else {
 			// pop
-			if ev.typ&mask != 0 {
+			push := ev.index
+			if in.events[push].typ&mask != 0 {
 				f(ev.node, false, stack)
 			}
 			stack = stack[:len(stack)-1]
@@ -157,25 +185,31 @@
 	events := make([]event, 0, capacity)
 
 	var stack []event
+	stack = append(stack, event{}) // include an extra event so file nodes have a parent
 	for _, f := range files {
 		ast.Inspect(f, func(n ast.Node) bool {
 			if n != nil {
 				// push
 				ev := event{
 					node:  n,
-					typ:   typeOf(n),
+					typ:   0,           // temporarily used to accumulate type bits of subtree
 					index: len(events), // push event temporarily holds own index
 				}
 				stack = append(stack, ev)
 				events = append(events, ev)
 			} else {
 				// pop
-				ev := stack[len(stack)-1]
-				stack = stack[:len(stack)-1]
+				top := len(stack) - 1
+				ev := stack[top]
+				typ := typeOf(ev.node)
+				push := ev.index
+				parent := top - 1
 
-				events[ev.index].index = len(events) + 1 // make push refer to pop
+				events[push].typ = typ            // set type of push
+				stack[parent].typ |= typ | ev.typ // parent's typ contains push and pop's typs.
+				events[push].index = len(events)  // make push refer to pop
 
-				ev.index = 0 // turn ev into a pop event
+				stack = stack[:top]
 				events = append(events, ev)
 			}
 			return true
diff --git a/src/cmd/vendor/golang.org/x/tools/go/types/objectpath/objectpath.go b/src/cmd/vendor/golang.org/x/tools/go/types/objectpath/objectpath.go
index c160acb..f2ce77f 100644
--- a/src/cmd/vendor/golang.org/x/tools/go/types/objectpath/objectpath.go
+++ b/src/cmd/vendor/golang.org/x/tools/go/types/objectpath/objectpath.go
@@ -111,7 +111,21 @@
 	opObj    = 'O' // .Obj()		 (Named, TypeParam)
 )
 
-// The For function returns the path to an object relative to its package,
+// For is equivalent to new(Encoder).For(obj).
+//
+// It may be more efficient to reuse a single Encoder across several calls.
+func For(obj types.Object) (Path, error) {
+	return new(Encoder).For(obj)
+}
+
+// An Encoder amortizes the cost of encoding the paths of multiple objects.
+// The zero value of an Encoder is ready to use.
+type Encoder struct {
+	scopeMemo        map[*types.Scope][]types.Object // memoization of scopeObjects
+	namedMethodsMemo map[*types.Named][]*types.Func  // memoization of namedMethods()
+}
+
+// For returns the path to an object relative to its package,
 // or an error if the object is not accessible from the package's Scope.
 //
 // The For function guarantees to return a path only for the following objects:
@@ -123,6 +137,17 @@
 // These objects are sufficient to define the API of their package.
 // The objects described by a package's export data are drawn from this set.
 //
+// The set of objects accessible from a package's Scope depends on
+// whether the package was produced by type-checking syntax, or
+// reading export data; the latter may have a smaller Scope since
+// export data trims objects that are not reachable from an exported
+// declaration. For example, the For function will return a path for
+// an exported method of an unexported type that is not reachable
+// from any public declaration; this path will cause the Object
+// function to fail if called on a package loaded from export data.
+// TODO(adonovan): is this a bug or feature? Should this package
+// compute accessibility in the same way?
+//
 // For does not return a path for predeclared names, imported package
 // names, local names, and unexported package-level names (except
 // types).
@@ -143,7 +168,7 @@
 //	.Type().Field(0)					(field Var X)
 //
 // where p is the package (*types.Package) to which X belongs.
-func For(obj types.Object) (Path, error) {
+func (enc *Encoder) For(obj types.Object) (Path, error) {
 	pkg := obj.Pkg()
 
 	// This table lists the cases of interest.
@@ -225,7 +250,7 @@
 			return "", fmt.Errorf("func is not a method: %v", obj)
 		}
 
-		if path, ok := concreteMethod(obj); ok {
+		if path, ok := enc.concreteMethod(obj); ok {
 			// Fast path for concrete methods that avoids looping over scope.
 			return path, nil
 		}
@@ -241,15 +266,14 @@
 	// the best paths because non-types may
 	// refer to types, but not the reverse.
 	empty := make([]byte, 0, 48) // initial space
-	names := scope.Names()
-	for _, name := range names {
-		o := scope.Lookup(name)
+	objs := enc.scopeObjects(scope)
+	for _, o := range objs {
 		tname, ok := o.(*types.TypeName)
 		if !ok {
 			continue // handle non-types in second pass
 		}
 
-		path := append(empty, name...)
+		path := append(empty, o.Name()...)
 		path = append(path, opType)
 
 		T := o.Type()
@@ -275,9 +299,8 @@
 
 	// Then inspect everything else:
 	// non-types, and declared methods of defined types.
-	for _, name := range names {
-		o := scope.Lookup(name)
-		path := append(empty, name...)
+	for _, o := range objs {
+		path := append(empty, o.Name()...)
 		if _, ok := o.(*types.TypeName); !ok {
 			if o.Exported() {
 				// exported non-type (const, var, func)
@@ -294,9 +317,7 @@
 			// Note that method index here is always with respect
 			// to canonical ordering of methods, regardless of how
 			// they appear in the underlying type.
-			canonical := canonicalize(T)
-			for i := 0; i < len(canonical); i++ {
-				m := canonical[i]
+			for i, m := range enc.namedMethods(T) {
 				path2 := appendOpArg(path, opMethod, i)
 				if m == obj {
 					return Path(path2), nil // found declared method
@@ -324,7 +345,7 @@
 // This function is just an optimization that avoids the general scope walking
 // approach. You are expected to fall back to the general approach if this
 // function fails.
-func concreteMethod(meth *types.Func) (Path, bool) {
+func (enc *Encoder) concreteMethod(meth *types.Func) (Path, bool) {
 	// Concrete methods can only be declared on package-scoped named types. For
 	// that reason we can skip the expensive walk over the package scope: the
 	// path will always be package -> named type -> method. We can trivially get
@@ -397,15 +418,20 @@
 	path := make([]byte, 0, len(name)+8)
 	path = append(path, name...)
 	path = append(path, opType)
-	canonical := canonicalize(named)
-	for i, m := range canonical {
+	for i, m := range enc.namedMethods(named) {
 		if m == meth {
 			path = appendOpArg(path, opMethod, i)
 			return Path(path), true
 		}
 	}
 
-	panic(fmt.Sprintf("couldn't find method %s on type %s", meth, named))
+	// Due to golang/go#59944, go/types fails to associate the receiver with
+	// certain methods on cgo types.
+	//
+	// TODO(rfindley): replace this panic once golang/go#59944 is fixed in all Go
+	// versions gopls supports.
+	return "", false
+	// panic(fmt.Sprintf("couldn't find method %s on type %s; methods: %#v", meth, named, enc.namedMethods(named)))
 }
 
 // find finds obj within type T, returning the path to it, or nil if not found.
@@ -663,15 +689,23 @@
 			t = nil
 
 		case opMethod:
-			hasMethods, ok := t.(hasMethods) // Interface or Named
-			if !ok {
+			switch t := t.(type) {
+			case *types.Interface:
+				if index >= t.NumMethods() {
+					return nil, fmt.Errorf("method index %d out of range [0-%d)", index, t.NumMethods())
+				}
+				obj = t.Method(index) // Id-ordered
+
+			case *types.Named:
+				methods := namedMethods(t) // (unmemoized)
+				if index >= len(methods) {
+					return nil, fmt.Errorf("method index %d out of range [0-%d)", index, len(methods))
+				}
+				obj = methods[index] // Id-ordered
+
+			default:
 				return nil, fmt.Errorf("cannot apply %q to %s (got %T, want interface or named)", code, t, t)
 			}
-			canonical := canonicalize(hasMethods)
-			if n := len(canonical); index >= n {
-				return nil, fmt.Errorf("method index %d out of range [0-%d)", index, n)
-			}
-			obj = canonical[index]
 			t = nil
 
 		case opObj:
@@ -694,27 +728,49 @@
 	return obj, nil // success
 }
 
-// hasMethods is an abstraction of *types.{Interface,Named}. This is pulled up
-// because it is used by methodOrdering, which is in turn used by both encoding
-// and decoding.
-type hasMethods interface {
-	Method(int) *types.Func
-	NumMethods() int
+// namedMethods returns the methods of a Named type in ascending Id order.
+func namedMethods(named *types.Named) []*types.Func {
+	methods := make([]*types.Func, named.NumMethods())
+	for i := range methods {
+		methods[i] = named.Method(i)
+	}
+	sort.Slice(methods, func(i, j int) bool {
+		return methods[i].Id() < methods[j].Id()
+	})
+	return methods
 }
 
-// canonicalize returns a canonical order for the methods in a hasMethod.
-func canonicalize(hm hasMethods) []*types.Func {
-	count := hm.NumMethods()
-	if count <= 0 {
-		return nil
+// namedMethods is a memoization of the namedMethods function. Callers must not modify the result.
+func (enc *Encoder) namedMethods(named *types.Named) []*types.Func {
+	m := enc.namedMethodsMemo
+	if m == nil {
+		m = make(map[*types.Named][]*types.Func)
+		enc.namedMethodsMemo = m
 	}
-	canon := make([]*types.Func, count)
-	for i := 0; i < count; i++ {
-		canon[i] = hm.Method(i)
+	methods, ok := m[named]
+	if !ok {
+		methods = namedMethods(named) // allocates and sorts
+		m[named] = methods
 	}
-	less := func(i, j int) bool {
-		return canon[i].Id() < canon[j].Id()
+	return methods
+}
+
+// scopeObjects is a memoization of scope objects.
+// Callers must not modify the result.
+func (enc *Encoder) scopeObjects(scope *types.Scope) []types.Object {
+	m := enc.scopeMemo
+	if m == nil {
+		m = make(map[*types.Scope][]types.Object)
+		enc.scopeMemo = m
 	}
-	sort.Slice(canon, less)
-	return canon
+	objs, ok := m[scope]
+	if !ok {
+		names := scope.Names() // allocates and sorts
+		objs = make([]types.Object, len(names))
+		for i, name := range names {
+			objs[i] = scope.Lookup(name)
+		}
+		m[scope] = objs
+	}
+	return objs
 }
diff --git a/src/cmd/vendor/golang.org/x/tools/internal/analysisinternal/analysis.go b/src/cmd/vendor/golang.org/x/tools/internal/analysisinternal/analysis.go
deleted file mode 100644
index d15f0eb..0000000
--- a/src/cmd/vendor/golang.org/x/tools/internal/analysisinternal/analysis.go
+++ /dev/null
@@ -1,390 +0,0 @@
-// Copyright 2020 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package analysisinternal provides gopls' internal analyses with a
-// number of helper functions that operate on typed syntax trees.
-package analysisinternal
-
-import (
-	"bytes"
-	"fmt"
-	"go/ast"
-	"go/token"
-	"go/types"
-	"strconv"
-)
-
-// DiagnoseFuzzTests controls whether the 'tests' analyzer diagnoses fuzz tests
-// in Go 1.18+.
-var DiagnoseFuzzTests bool = false
-
-func TypeErrorEndPos(fset *token.FileSet, src []byte, start token.Pos) token.Pos {
-	// Get the end position for the type error.
-	offset, end := fset.PositionFor(start, false).Offset, start
-	if offset >= len(src) {
-		return end
-	}
-	if width := bytes.IndexAny(src[offset:], " \n,():;[]+-*"); width > 0 {
-		end = start + token.Pos(width)
-	}
-	return end
-}
-
-func ZeroValue(f *ast.File, pkg *types.Package, typ types.Type) ast.Expr {
-	under := typ
-	if n, ok := typ.(*types.Named); ok {
-		under = n.Underlying()
-	}
-	switch u := under.(type) {
-	case *types.Basic:
-		switch {
-		case u.Info()&types.IsNumeric != 0:
-			return &ast.BasicLit{Kind: token.INT, Value: "0"}
-		case u.Info()&types.IsBoolean != 0:
-			return &ast.Ident{Name: "false"}
-		case u.Info()&types.IsString != 0:
-			return &ast.BasicLit{Kind: token.STRING, Value: `""`}
-		default:
-			panic("unknown basic type")
-		}
-	case *types.Chan, *types.Interface, *types.Map, *types.Pointer, *types.Signature, *types.Slice, *types.Array:
-		return ast.NewIdent("nil")
-	case *types.Struct:
-		texpr := TypeExpr(f, pkg, typ) // typ because we want the name here.
-		if texpr == nil {
-			return nil
-		}
-		return &ast.CompositeLit{
-			Type: texpr,
-		}
-	}
-	return nil
-}
-
-// IsZeroValue checks whether the given expression is a 'zero value' (as determined by output of
-// analysisinternal.ZeroValue)
-func IsZeroValue(expr ast.Expr) bool {
-	switch e := expr.(type) {
-	case *ast.BasicLit:
-		return e.Value == "0" || e.Value == `""`
-	case *ast.Ident:
-		return e.Name == "nil" || e.Name == "false"
-	default:
-		return false
-	}
-}
-
-// TypeExpr returns syntax for the specified type. References to
-// named types from packages other than pkg are qualified by an appropriate
-// package name, as defined by the import environment of file.
-func TypeExpr(f *ast.File, pkg *types.Package, typ types.Type) ast.Expr {
-	switch t := typ.(type) {
-	case *types.Basic:
-		switch t.Kind() {
-		case types.UnsafePointer:
-			return &ast.SelectorExpr{X: ast.NewIdent("unsafe"), Sel: ast.NewIdent("Pointer")}
-		default:
-			return ast.NewIdent(t.Name())
-		}
-	case *types.Pointer:
-		x := TypeExpr(f, pkg, t.Elem())
-		if x == nil {
-			return nil
-		}
-		return &ast.UnaryExpr{
-			Op: token.MUL,
-			X:  x,
-		}
-	case *types.Array:
-		elt := TypeExpr(f, pkg, t.Elem())
-		if elt == nil {
-			return nil
-		}
-		return &ast.ArrayType{
-			Len: &ast.BasicLit{
-				Kind:  token.INT,
-				Value: fmt.Sprintf("%d", t.Len()),
-			},
-			Elt: elt,
-		}
-	case *types.Slice:
-		elt := TypeExpr(f, pkg, t.Elem())
-		if elt == nil {
-			return nil
-		}
-		return &ast.ArrayType{
-			Elt: elt,
-		}
-	case *types.Map:
-		key := TypeExpr(f, pkg, t.Key())
-		value := TypeExpr(f, pkg, t.Elem())
-		if key == nil || value == nil {
-			return nil
-		}
-		return &ast.MapType{
-			Key:   key,
-			Value: value,
-		}
-	case *types.Chan:
-		dir := ast.ChanDir(t.Dir())
-		if t.Dir() == types.SendRecv {
-			dir = ast.SEND | ast.RECV
-		}
-		value := TypeExpr(f, pkg, t.Elem())
-		if value == nil {
-			return nil
-		}
-		return &ast.ChanType{
-			Dir:   dir,
-			Value: value,
-		}
-	case *types.Signature:
-		var params []*ast.Field
-		for i := 0; i < t.Params().Len(); i++ {
-			p := TypeExpr(f, pkg, t.Params().At(i).Type())
-			if p == nil {
-				return nil
-			}
-			params = append(params, &ast.Field{
-				Type: p,
-				Names: []*ast.Ident{
-					{
-						Name: t.Params().At(i).Name(),
-					},
-				},
-			})
-		}
-		var returns []*ast.Field
-		for i := 0; i < t.Results().Len(); i++ {
-			r := TypeExpr(f, pkg, t.Results().At(i).Type())
-			if r == nil {
-				return nil
-			}
-			returns = append(returns, &ast.Field{
-				Type: r,
-			})
-		}
-		return &ast.FuncType{
-			Params: &ast.FieldList{
-				List: params,
-			},
-			Results: &ast.FieldList{
-				List: returns,
-			},
-		}
-	case *types.Named:
-		if t.Obj().Pkg() == nil {
-			return ast.NewIdent(t.Obj().Name())
-		}
-		if t.Obj().Pkg() == pkg {
-			return ast.NewIdent(t.Obj().Name())
-		}
-		pkgName := t.Obj().Pkg().Name()
-
-		// If the file already imports the package under another name, use that.
-		for _, cand := range f.Imports {
-			if path, _ := strconv.Unquote(cand.Path.Value); path == t.Obj().Pkg().Path() {
-				if cand.Name != nil && cand.Name.Name != "" {
-					pkgName = cand.Name.Name
-				}
-			}
-		}
-		if pkgName == "." {
-			return ast.NewIdent(t.Obj().Name())
-		}
-		return &ast.SelectorExpr{
-			X:   ast.NewIdent(pkgName),
-			Sel: ast.NewIdent(t.Obj().Name()),
-		}
-	case *types.Struct:
-		return ast.NewIdent(t.String())
-	case *types.Interface:
-		return ast.NewIdent(t.String())
-	default:
-		return nil
-	}
-}
-
-// StmtToInsertVarBefore returns the ast.Stmt before which we can safely insert a new variable.
-// Some examples:
-//
-// Basic Example:
-// z := 1
-// y := z + x
-// If x is undeclared, then this function would return `y := z + x`, so that we
-// can insert `x := ` on the line before `y := z + x`.
-//
-// If stmt example:
-// if z == 1 {
-// } else if z == y {}
-// If y is undeclared, then this function would return `if z == 1 {`, because we cannot
-// insert a statement between an if and an else if statement. As a result, we need to find
-// the top of the if chain to insert `y := ` before.
-func StmtToInsertVarBefore(path []ast.Node) ast.Stmt {
-	enclosingIndex := -1
-	for i, p := range path {
-		if _, ok := p.(ast.Stmt); ok {
-			enclosingIndex = i
-			break
-		}
-	}
-	if enclosingIndex == -1 {
-		return nil
-	}
-	enclosingStmt := path[enclosingIndex]
-	switch enclosingStmt.(type) {
-	case *ast.IfStmt:
-		// The enclosingStmt is inside of the if declaration,
-		// We need to check if we are in an else-if stmt and
-		// get the base if statement.
-		return baseIfStmt(path, enclosingIndex)
-	case *ast.CaseClause:
-		// Get the enclosing switch stmt if the enclosingStmt is
-		// inside of the case statement.
-		for i := enclosingIndex + 1; i < len(path); i++ {
-			if node, ok := path[i].(*ast.SwitchStmt); ok {
-				return node
-			} else if node, ok := path[i].(*ast.TypeSwitchStmt); ok {
-				return node
-			}
-		}
-	}
-	if len(path) <= enclosingIndex+1 {
-		return enclosingStmt.(ast.Stmt)
-	}
-	// Check if the enclosing statement is inside another node.
-	switch expr := path[enclosingIndex+1].(type) {
-	case *ast.IfStmt:
-		// Get the base if statement.
-		return baseIfStmt(path, enclosingIndex+1)
-	case *ast.ForStmt:
-		if expr.Init == enclosingStmt || expr.Post == enclosingStmt {
-			return expr
-		}
-	}
-	return enclosingStmt.(ast.Stmt)
-}
-
-// baseIfStmt walks up the if/else-if chain until we get to
-// the top of the current if chain.
-func baseIfStmt(path []ast.Node, index int) ast.Stmt {
-	stmt := path[index]
-	for i := index + 1; i < len(path); i++ {
-		if node, ok := path[i].(*ast.IfStmt); ok && node.Else == stmt {
-			stmt = node
-			continue
-		}
-		break
-	}
-	return stmt.(ast.Stmt)
-}
-
-// WalkASTWithParent walks the AST rooted at n. The semantics are
-// similar to ast.Inspect except it does not call f(nil).
-func WalkASTWithParent(n ast.Node, f func(n ast.Node, parent ast.Node) bool) {
-	var ancestors []ast.Node
-	ast.Inspect(n, func(n ast.Node) (recurse bool) {
-		if n == nil {
-			ancestors = ancestors[:len(ancestors)-1]
-			return false
-		}
-
-		var parent ast.Node
-		if len(ancestors) > 0 {
-			parent = ancestors[len(ancestors)-1]
-		}
-		ancestors = append(ancestors, n)
-		return f(n, parent)
-	})
-}
-
-// MatchingIdents finds the names of all identifiers in 'node' that match any of the given types.
-// 'pos' represents the position at which the identifiers may be inserted. 'pos' must be within
-// the scope of each of identifier we select. Otherwise, we will insert a variable at 'pos' that
-// is unrecognized.
-func MatchingIdents(typs []types.Type, node ast.Node, pos token.Pos, info *types.Info, pkg *types.Package) map[types.Type][]string {
-
-	// Initialize matches to contain the variable types we are searching for.
-	matches := make(map[types.Type][]string)
-	for _, typ := range typs {
-		if typ == nil {
-			continue // TODO(adonovan): is this reachable?
-		}
-		matches[typ] = nil // create entry
-	}
-
-	seen := map[types.Object]struct{}{}
-	ast.Inspect(node, func(n ast.Node) bool {
-		if n == nil {
-			return false
-		}
-		// Prevent circular definitions. If 'pos' is within an assignment statement, do not
-		// allow any identifiers in that assignment statement to be selected. Otherwise,
-		// we could do the following, where 'x' satisfies the type of 'f0':
-		//
-		// x := fakeStruct{f0: x}
-		//
-		if assign, ok := n.(*ast.AssignStmt); ok && pos > assign.Pos() && pos <= assign.End() {
-			return false
-		}
-		if n.End() > pos {
-			return n.Pos() <= pos
-		}
-		ident, ok := n.(*ast.Ident)
-		if !ok || ident.Name == "_" {
-			return true
-		}
-		obj := info.Defs[ident]
-		if obj == nil || obj.Type() == nil {
-			return true
-		}
-		if _, ok := obj.(*types.TypeName); ok {
-			return true
-		}
-		// Prevent duplicates in matches' values.
-		if _, ok = seen[obj]; ok {
-			return true
-		}
-		seen[obj] = struct{}{}
-		// Find the scope for the given position. Then, check whether the object
-		// exists within the scope.
-		innerScope := pkg.Scope().Innermost(pos)
-		if innerScope == nil {
-			return true
-		}
-		_, foundObj := innerScope.LookupParent(ident.Name, pos)
-		if foundObj != obj {
-			return true
-		}
-		// The object must match one of the types that we are searching for.
-		// TODO(adonovan): opt: use typeutil.Map?
-		if names, ok := matches[obj.Type()]; ok {
-			matches[obj.Type()] = append(names, ident.Name)
-		} else {
-			// If the object type does not exactly match
-			// any of the target types, greedily find the first
-			// target type that the object type can satisfy.
-			for typ := range matches {
-				if equivalentTypes(obj.Type(), typ) {
-					matches[typ] = append(matches[typ], ident.Name)
-				}
-			}
-		}
-		return true
-	})
-	return matches
-}
-
-func equivalentTypes(want, got types.Type) bool {
-	if types.Identical(want, got) {
-		return true
-	}
-	// Code segment to help check for untyped equality from (golang/go#32146).
-	if rhs, ok := want.(*types.Basic); ok && rhs.Info()&types.IsUntyped > 0 {
-		if lhs, ok := got.Underlying().(*types.Basic); ok {
-			return rhs.Info()&types.IsConstType == lhs.Info()&types.IsConstType
-		}
-	}
-	return types.AssignableTo(want, got)
-}
diff --git a/src/cmd/vendor/golang.org/x/tools/internal/bisect/bisect.go b/src/cmd/vendor/golang.org/x/tools/internal/bisect/bisect.go
new file mode 100644
index 0000000..50cf53b
--- /dev/null
+++ b/src/cmd/vendor/golang.org/x/tools/internal/bisect/bisect.go
@@ -0,0 +1,522 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package bisect can be used by compilers and other programs
+// to serve as a target for the bisect debugging tool.
+// See [golang.org/x/tools/cmd/bisect] for details about using the tool.
+//
+// To be a bisect target, allowing bisect to help determine which of a set of independent
+// changes provokes a failure, a program needs to:
+//
+//  1. Define a way to accept a change pattern on its command line or in its environment.
+//     The most common mechanism is a command-line flag.
+//     The pattern can be passed to [New] to create a [Matcher], the compiled form of a pattern.
+//
+//  2. Assign each change a unique ID. One possibility is to use a sequence number,
+//     but the most common mechanism is to hash some kind of identifying information
+//     like the file and line number where the change might be applied.
+//     [Hash] hashes its arguments to compute an ID.
+//
+//  3. Enable each change that the pattern says should be enabled.
+//     The [Matcher.Enable] method answers this question for a given change ID.
+//
+//  4. Report each change that the pattern says should be reported.
+//     The [Matcher.Report] method answers this question for a given change ID.
+//     The report consists of one more lines on standard error or standard output
+//     that contain a “match marker”. [Marker] returns the match marker for a given ID.
+//     When bisect reports a change as causing the failure, it identifies the change
+//     by printing those report lines, with the match marker removed.
+//
+// # Example Usage
+//
+// A program starts by defining how it receives the pattern. In this example, we will assume a flag.
+// The next step is to compile the pattern:
+//
+//	m, err := bisect.New(patternFlag)
+//	if err != nil {
+//		log.Fatal(err)
+//	}
+//
+// Then, each time a potential change is considered, the program computes
+// a change ID by hashing identifying information (source file and line, in this case)
+// and then calls m.ShouldEnable and m.ShouldReport to decide whether to
+// enable and report the change, respectively:
+//
+//	for each change {
+//		h := bisect.Hash(file, line)
+//		if m.ShouldEnable(h) {
+//			enableChange()
+//		}
+//		if m.ShouldReport(h) {
+//			log.Printf("%v %s:%d", bisect.Marker(h), file, line)
+//		}
+//	}
+//
+// Note that the two return different values when bisect is searching for a
+// minimal set of changes to disable to provoke a failure.
+//
+// Finally, note that New returns a nil Matcher when there is no pattern,
+// meaning that the target is not running under bisect at all.
+// In that common case, the computation of the hash can be avoided entirely
+// by checking for m == nil first:
+//
+//	for each change {
+//		if m == nil {
+//			enableChange()
+//		} else {
+//			h := bisect.Hash(file, line)
+//			if m.ShouldEnable(h) {
+//				enableChange()
+//			}
+//			if m.ShouldReport(h) {
+//				log.Printf("%v %s:%d", bisect.Marker(h), file, line)
+//			}
+//		}
+//	}
+//
+// # Pattern Syntax
+//
+// Patterns are generated by the bisect tool and interpreted by [New].
+// Users should not have to understand the patterns except when
+// debugging a target's bisect support or debugging the bisect tool itself.
+//
+// The pattern syntax selecting a change is a sequence of bit strings
+// separated by + and - operators. Each bit string denotes the set of
+// changes with IDs ending in those bits, + is set addition, - is set subtraction,
+// and the expression is evaluated in the usual left-to-right order.
+// The special binary number “y” denotes the set of all changes,
+// standing in for the empty bit string.
+// In the expression, all the + operators must appear before all the - operators.
+// A leading + adds to an empty set. A leading - subtracts from the set of all
+// possible suffixes.
+//
+// For example:
+//
+//   - “01+10” and “+01+10” both denote the set of changes
+//     with IDs ending with the bits 01 or 10.
+//
+//   - “01+10-1001” denotes the set of changes with IDs
+//     ending with the bits 01 or 10, but excluding those ending in 1001.
+//
+//   - “-01-1000” and “y-01-1000 both denote the set of all changes
+//     with IDs not ending in 01 nor 1000.
+//
+//   - “0+1-01+001” is not a valid pattern, because all the + operators do not
+//     appear before all the - operators.
+//
+// In the syntaxes described so far, the pattern specifies the changes to
+// enable and report. If a pattern is prefixed by a “!”, the meaning
+// changes: the pattern specifies the changes to DISABLE and report. This
+// mode of operation is needed when a program passes with all changes
+// enabled but fails with no changes enabled. In this case, bisect
+// searches for minimal sets of changes to disable.
+// Put another way, the leading “!” inverts the result from [Matcher.ShouldEnable]
+// but does not invert the result from [Matcher.ShouldReport].
+//
+// As a convenience for manual debugging, “n” is an alias for “!y”,
+// meaning to disable and report all changes.
+//
+// Finally, a leading “v” in the pattern indicates that the reports will be shown
+// to the user of bisect to describe the changes involved in a failure.
+// At the API level, the leading “v” causes [Matcher.Visible] to return true.
+// See the next section for details.
+//
+// # Match Reports
+//
+// The target program must enable only those changed matched
+// by the pattern, and it must print a match report for each such change.
+// A match report consists of one or more lines of text that will be
+// printed by the bisect tool to describe a change implicated in causing
+// a failure. Each line in the report for a given change must contain a
+// match marker with that change ID, as returned by [Marker].
+// The markers are elided when displaying the lines to the user.
+//
+// A match marker has the form “[bisect-match 0x1234]” where
+// 0x1234 is the change ID in hexadecimal.
+// An alternate form is “[bisect-match 010101]”, giving the change ID in binary.
+//
+// When [Matcher.Visible] returns false, the match reports are only
+// being processed by bisect to learn the set of enabled changes,
+// not shown to the user, meaning that each report can be a match
+// marker on a line by itself, eliding the usual textual description.
+// When the textual description is expensive to compute,
+// checking [Matcher.Visible] can help the avoid that expense
+// in most runs.
+package bisect
+
+// New creates and returns a new Matcher implementing the given pattern.
+// The pattern syntax is defined in the package doc comment.
+//
+// In addition to the pattern syntax syntax, New("") returns nil, nil.
+// The nil *Matcher is valid for use: it returns true from ShouldEnable
+// and false from ShouldReport for all changes. Callers can avoid calling
+// [Hash], [Matcher.ShouldEnable], and [Matcher.ShouldPrint] entirely
+// when they recognize the nil Matcher.
+func New(pattern string) (*Matcher, error) {
+	if pattern == "" {
+		return nil, nil
+	}
+
+	m := new(Matcher)
+
+	// Allow multiple v, so that “bisect cmd vPATTERN” can force verbose all the time.
+	p := pattern
+	for len(p) > 0 && p[0] == 'v' {
+		m.verbose = true
+		p = p[1:]
+		if p == "" {
+			return nil, &parseError{"invalid pattern syntax: " + pattern}
+		}
+	}
+
+	// Allow multiple !, each negating the last, so that “bisect cmd !PATTERN” works
+	// even when bisect chooses to add its own !.
+	m.enable = true
+	for len(p) > 0 && p[0] == '!' {
+		m.enable = !m.enable
+		p = p[1:]
+		if p == "" {
+			return nil, &parseError{"invalid pattern syntax: " + pattern}
+		}
+	}
+
+	if p == "n" {
+		// n is an alias for !y.
+		m.enable = !m.enable
+		p = "y"
+	}
+
+	// Parse actual pattern syntax.
+	result := true
+	bits := uint64(0)
+	start := 0
+	wid := 1 // 1-bit (binary); sometimes 4-bit (hex)
+	for i := 0; i <= len(p); i++ {
+		// Imagine a trailing - at the end of the pattern to flush final suffix
+		c := byte('-')
+		if i < len(p) {
+			c = p[i]
+		}
+		if i == start && wid == 1 && c == 'x' { // leading x for hex
+			start = i + 1
+			wid = 4
+			continue
+		}
+		switch c {
+		default:
+			return nil, &parseError{"invalid pattern syntax: " + pattern}
+		case '2', '3', '4', '5', '6', '7', '8', '9':
+			if wid != 4 {
+				return nil, &parseError{"invalid pattern syntax: " + pattern}
+			}
+			fallthrough
+		case '0', '1':
+			bits <<= wid
+			bits |= uint64(c - '0')
+		case 'a', 'b', 'c', 'd', 'e', 'f', 'A', 'B', 'C', 'D', 'E', 'F':
+			if wid != 4 {
+				return nil, &parseError{"invalid pattern syntax: " + pattern}
+			}
+			bits <<= 4
+			bits |= uint64(c&^0x20 - 'A' + 10)
+		case 'y':
+			if i+1 < len(p) && (p[i+1] == '0' || p[i+1] == '1') {
+				return nil, &parseError{"invalid pattern syntax: " + pattern}
+			}
+			bits = 0
+		case '+', '-':
+			if c == '+' && result == false {
+				// Have already seen a -. Should be - from here on.
+				return nil, &parseError{"invalid pattern syntax (+ after -): " + pattern}
+			}
+			if i > 0 {
+				n := (i - start) * wid
+				if n > 64 {
+					return nil, &parseError{"pattern bits too long: " + pattern}
+				}
+				if n <= 0 {
+					return nil, &parseError{"invalid pattern syntax: " + pattern}
+				}
+				if p[start] == 'y' {
+					n = 0
+				}
+				mask := uint64(1)<<n - 1
+				m.list = append(m.list, cond{mask, bits, result})
+			} else if c == '-' {
+				// leading - subtracts from complete set
+				m.list = append(m.list, cond{0, 0, true})
+			}
+			bits = 0
+			result = c == '+'
+			start = i + 1
+			wid = 1
+		}
+	}
+	return m, nil
+}
+
+// A Matcher is the parsed, compiled form of a PATTERN string.
+// The nil *Matcher is valid: it has all changes enabled but none reported.
+type Matcher struct {
+	verbose bool
+	enable  bool   // when true, list is for “enable and report” (when false, “disable and report”)
+	list    []cond // conditions; later ones win over earlier ones
+}
+
+// A cond is a single condition in the matcher.
+// Given an input id, if id&mask == bits, return the result.
+type cond struct {
+	mask   uint64
+	bits   uint64
+	result bool
+}
+
+// Verbose reports whether the reports will be shown to users
+// and need to include a human-readable change description.
+// If not, the target can print just the Marker on a line by itself
+// and perhaps save some computation.
+func (m *Matcher) Verbose() bool {
+	return m.verbose
+}
+
+// ShouldEnable reports whether the change with the given id should be enabled.
+func (m *Matcher) ShouldEnable(id uint64) bool {
+	if m == nil {
+		return true
+	}
+	for i := len(m.list) - 1; i >= 0; i-- {
+		c := &m.list[i]
+		if id&c.mask == c.bits {
+			return c.result == m.enable
+		}
+	}
+	return false == m.enable
+}
+
+// ShouldReport reports whether the change with the given id should be reported.
+func (m *Matcher) ShouldReport(id uint64) bool {
+	if m == nil {
+		return false
+	}
+	for i := len(m.list) - 1; i >= 0; i-- {
+		c := &m.list[i]
+		if id&c.mask == c.bits {
+			return c.result
+		}
+	}
+	return false
+}
+
+// Marker returns the match marker text to use on any line reporting details
+// about a match of the given ID.
+// It always returns the hexadecimal format.
+func Marker(id uint64) string {
+	return string(AppendMarker(nil, id))
+}
+
+// AppendMarker is like [Marker] but appends the marker to dst.
+func AppendMarker(dst []byte, id uint64) []byte {
+	const prefix = "[bisect-match 0x"
+	var buf [len(prefix) + 16 + 1]byte
+	copy(buf[:], prefix)
+	for i := 0; i < 16; i++ {
+		buf[len(prefix)+i] = "0123456789abcdef"[id>>60]
+		id <<= 4
+	}
+	buf[len(prefix)+16] = ']'
+	return append(dst, buf[:]...)
+}
+
+// CutMarker finds the first match marker in line and removes it,
+// returning the shortened line (with the marker removed),
+// the ID from the match marker,
+// and whether a marker was found at all.
+// If there is no marker, CutMarker returns line, 0, false.
+func CutMarker(line string) (short string, id uint64, ok bool) {
+	// Find first instance of prefix.
+	prefix := "[bisect-match "
+	i := 0
+	for ; ; i++ {
+		if i >= len(line)-len(prefix) {
+			return line, 0, false
+		}
+		if line[i] == '[' && line[i:i+len(prefix)] == prefix {
+			break
+		}
+	}
+
+	// Scan to ].
+	j := i + len(prefix)
+	for j < len(line) && line[j] != ']' {
+		j++
+	}
+	if j >= len(line) {
+		return line, 0, false
+	}
+
+	// Parse id.
+	idstr := line[i+len(prefix) : j]
+	if len(idstr) >= 3 && idstr[:2] == "0x" {
+		// parse hex
+		if len(idstr) > 2+16 { // max 0x + 16 digits
+			return line, 0, false
+		}
+		for i := 2; i < len(idstr); i++ {
+			id <<= 4
+			switch c := idstr[i]; {
+			case '0' <= c && c <= '9':
+				id |= uint64(c - '0')
+			case 'a' <= c && c <= 'f':
+				id |= uint64(c - 'a' + 10)
+			case 'A' <= c && c <= 'F':
+				id |= uint64(c - 'A' + 10)
+			}
+		}
+	} else {
+		if idstr == "" || len(idstr) > 64 { // min 1 digit, max 64 digits
+			return line, 0, false
+		}
+		// parse binary
+		for i := 0; i < len(idstr); i++ {
+			id <<= 1
+			switch c := idstr[i]; c {
+			default:
+				return line, 0, false
+			case '0', '1':
+				id |= uint64(c - '0')
+			}
+		}
+	}
+
+	// Construct shortened line.
+	// Remove at most one space from around the marker,
+	// so that "foo [marker] bar" shortens to "foo bar".
+	j++ // skip ]
+	if i > 0 && line[i-1] == ' ' {
+		i--
+	} else if j < len(line) && line[j] == ' ' {
+		j++
+	}
+	short = line[:i] + line[j:]
+	return short, id, true
+}
+
+// Hash computes a hash of the data arguments,
+// each of which must be of type string, byte, int, uint, int32, uint32, int64, uint64, uintptr, or a slice of one of those types.
+func Hash(data ...any) uint64 {
+	h := offset64
+	for _, v := range data {
+		switch v := v.(type) {
+		default:
+			// Note: Not printing the type, because reflect.ValueOf(v)
+			// would make the interfaces prepared by the caller escape
+			// and therefore allocate. This way, Hash(file, line) runs
+			// without any allocation. It should be clear from the
+			// source code calling Hash what the bad argument was.
+			panic("bisect.Hash: unexpected argument type")
+		case string:
+			h = fnvString(h, v)
+		case byte:
+			h = fnv(h, v)
+		case int:
+			h = fnvUint64(h, uint64(v))
+		case uint:
+			h = fnvUint64(h, uint64(v))
+		case int32:
+			h = fnvUint32(h, uint32(v))
+		case uint32:
+			h = fnvUint32(h, v)
+		case int64:
+			h = fnvUint64(h, uint64(v))
+		case uint64:
+			h = fnvUint64(h, v)
+		case uintptr:
+			h = fnvUint64(h, uint64(v))
+		case []string:
+			for _, x := range v {
+				h = fnvString(h, x)
+			}
+		case []byte:
+			for _, x := range v {
+				h = fnv(h, x)
+			}
+		case []int:
+			for _, x := range v {
+				h = fnvUint64(h, uint64(x))
+			}
+		case []uint:
+			for _, x := range v {
+				h = fnvUint64(h, uint64(x))
+			}
+		case []int32:
+			for _, x := range v {
+				h = fnvUint32(h, uint32(x))
+			}
+		case []uint32:
+			for _, x := range v {
+				h = fnvUint32(h, x)
+			}
+		case []int64:
+			for _, x := range v {
+				h = fnvUint64(h, uint64(x))
+			}
+		case []uint64:
+			for _, x := range v {
+				h = fnvUint64(h, x)
+			}
+		case []uintptr:
+			for _, x := range v {
+				h = fnvUint64(h, uint64(x))
+			}
+		}
+	}
+	return h
+}
+
+// Trivial error implementation, here to avoid importing errors.
+
+type parseError struct{ text string }
+
+func (e *parseError) Error() string { return e.text }
+
+// FNV-1a implementation. See Go's hash/fnv/fnv.go.
+// Copied here for simplicity (can handle uints directly)
+// and to avoid the dependency.
+
+const (
+	offset64 uint64 = 14695981039346656037
+	prime64  uint64 = 1099511628211
+)
+
+func fnv(h uint64, x byte) uint64 {
+	h ^= uint64(x)
+	h *= prime64
+	return h
+}
+
+func fnvString(h uint64, x string) uint64 {
+	for i := 0; i < len(x); i++ {
+		h ^= uint64(x[i])
+		h *= prime64
+	}
+	return h
+}
+
+func fnvUint64(h uint64, x uint64) uint64 {
+	for i := 0; i < 8; i++ {
+		h ^= uint64(x & 0xFF)
+		x >>= 8
+		h *= prime64
+	}
+	return h
+}
+
+func fnvUint32(h uint64, x uint32) uint64 {
+	for i := 0; i < 4; i++ {
+		h ^= uint64(x & 0xFF)
+		x >>= 8
+		h *= prime64
+	}
+	return h
+}
diff --git a/src/cmd/vendor/golang.org/x/tools/internal/facts/facts.go b/src/cmd/vendor/golang.org/x/tools/internal/facts/facts.go
index 81df451..954b42d 100644
--- a/src/cmd/vendor/golang.org/x/tools/internal/facts/facts.go
+++ b/src/cmd/vendor/golang.org/x/tools/internal/facts/facts.go
@@ -158,24 +158,52 @@
 // for the same package. Each call to Decode returns an independent
 // fact set.
 type Decoder struct {
-	pkg      *types.Package
-	packages map[string]*types.Package
+	pkg        *types.Package
+	getPackage GetPackageFunc
 }
 
 // NewDecoder returns a fact decoder for the specified package.
+//
+// It uses a brute-force recursive approach to enumerate all objects
+// defined by dependencies of pkg, so that it can learn the set of
+// package paths that may be mentioned in the fact encoding. This does
+// not scale well; use [NewDecoderFunc] where possible.
 func NewDecoder(pkg *types.Package) *Decoder {
 	// Compute the import map for this package.
 	// See the package doc comment.
-	return &Decoder{pkg, importMap(pkg.Imports())}
+	m := importMap(pkg.Imports())
+	getPackageFunc := func(path string) *types.Package { return m[path] }
+	return NewDecoderFunc(pkg, getPackageFunc)
 }
 
-// Decode decodes all the facts relevant to the analysis of package pkg.
-// The read function reads serialized fact data from an external source
-// for one of of pkg's direct imports. The empty file is a valid
-// encoding of an empty fact set.
+// NewDecoderFunc returns a fact decoder for the specified package.
+//
+// It calls the getPackage function for the package path string of
+// each dependency (perhaps indirect) that it encounters in the
+// encoding. If the function returns nil, the fact is discarded.
+//
+// This function is preferred over [NewDecoder] when the client is
+// capable of efficient look-up of packages by package path.
+func NewDecoderFunc(pkg *types.Package, getPackage GetPackageFunc) *Decoder {
+	return &Decoder{
+		pkg:        pkg,
+		getPackage: getPackage,
+	}
+}
+
+// A GetPackageFunc function returns the package denoted by a package path.
+type GetPackageFunc = func(pkgPath string) *types.Package
+
+// Decode decodes all the facts relevant to the analysis of package
+// pkg. The read function reads serialized fact data from an external
+// source for one of pkg's direct imports, identified by package path.
+// The empty file is a valid encoding of an empty fact set.
 //
 // It is the caller's responsibility to call gob.Register on all
 // necessary fact types.
+//
+// Concurrent calls to Decode are safe, so long as the
+// [GetPackageFunc] (if any) is also concurrency-safe.
 func (d *Decoder) Decode(read func(*types.Package) ([]byte, error)) (*Set, error) {
 	// Read facts from imported packages.
 	// Facts may describe indirectly imported packages, or their objects.
@@ -202,13 +230,11 @@
 		if err := gob.NewDecoder(bytes.NewReader(data)).Decode(&gobFacts); err != nil {
 			return nil, fmt.Errorf("decoding facts for %q: %v", imp.Path(), err)
 		}
-		if debug {
-			logf("decoded %d facts: %v", len(gobFacts), gobFacts)
-		}
+		logf("decoded %d facts: %v", len(gobFacts), gobFacts)
 
 		// Parse each one into a key and a Fact.
 		for _, f := range gobFacts {
-			factPkg := d.packages[f.PkgPath]
+			factPkg := d.getPackage(f.PkgPath) // possibly an indirect dependency
 			if factPkg == nil {
 				// Fact relates to a dependency that was
 				// unused in this translation unit. Skip.
diff --git a/src/cmd/vendor/golang.org/x/tools/internal/facts/imports.go b/src/cmd/vendor/golang.org/x/tools/internal/facts/imports.go
index a3aa90d..b18e62d 100644
--- a/src/cmd/vendor/golang.org/x/tools/internal/facts/imports.go
+++ b/src/cmd/vendor/golang.org/x/tools/internal/facts/imports.go
@@ -21,25 +21,28 @@
 // Packages in the map that are only indirectly imported may be
 // incomplete (!pkg.Complete()).
 //
+// This function scales very poorly with packages' transitive object
+// references, which can be more than a million for each package near
+// the top of a large project. (This was a significant contributor to
+// #60621.)
 // TODO(adonovan): opt: compute this information more efficiently
 // by obtaining it from the internals of the gcexportdata decoder.
 func importMap(imports []*types.Package) map[string]*types.Package {
 	objects := make(map[types.Object]bool)
+	typs := make(map[types.Type]bool) // Named and TypeParam
 	packages := make(map[string]*types.Package)
 
-	var addObj func(obj types.Object) bool
+	var addObj func(obj types.Object)
 	var addType func(T types.Type)
 
-	addObj = func(obj types.Object) bool {
+	addObj = func(obj types.Object) {
 		if !objects[obj] {
 			objects[obj] = true
 			addType(obj.Type())
 			if pkg := obj.Pkg(); pkg != nil {
 				packages[pkg.Path()] = pkg
 			}
-			return true
 		}
-		return false
 	}
 
 	addType = func(T types.Type) {
@@ -47,8 +50,16 @@
 		case *types.Basic:
 			// nop
 		case *types.Named:
-			if addObj(T.Obj()) {
-				// TODO(taking): Investigate why the Underlying type is not added here.
+			// Remove infinite expansions of *types.Named by always looking at the origin.
+			// Some named types with type parameters [that will not type check] have
+			// infinite expansions:
+			//     type N[T any] struct { F *N[N[T]] }
+			// importMap() is called on such types when Analyzer.RunDespiteErrors is true.
+			T = typeparams.NamedTypeOrigin(T).(*types.Named)
+			if !typs[T] {
+				typs[T] = true
+				addObj(T.Obj())
+				addType(T.Underlying())
 				for i := 0; i < T.NumMethods(); i++ {
 					addObj(T.Method(i))
 				}
@@ -102,7 +113,9 @@
 				addType(T.Term(i).Type())
 			}
 		case *typeparams.TypeParam:
-			if addObj(T.Obj()) {
+			if !typs[T] {
+				typs[T] = true
+				addObj(T.Obj())
 				addType(T.Constraint())
 			}
 		}
diff --git a/src/cmd/vendor/golang.org/x/tools/internal/typeparams/common.go b/src/cmd/vendor/golang.org/x/tools/internal/typeparams/common.go
index 25a1426..b9e87c6 100644
--- a/src/cmd/vendor/golang.org/x/tools/internal/typeparams/common.go
+++ b/src/cmd/vendor/golang.org/x/tools/internal/typeparams/common.go
@@ -87,7 +87,6 @@
 func OriginMethod(fn *types.Func) *types.Func {
 	recv := fn.Type().(*types.Signature).Recv()
 	if recv == nil {
-
 		return fn
 	}
 	base := recv.Type()
@@ -106,6 +105,26 @@
 	}
 	orig := NamedTypeOrigin(named)
 	gfn, _, _ := types.LookupFieldOrMethod(orig, true, fn.Pkg(), fn.Name())
+
+	// This is a fix for a gopls crash (#60628) due to a go/types bug (#60634). In:
+	// 	package p
+	//      type T *int
+	//      func (*T) f() {}
+	// LookupFieldOrMethod(T, true, p, f)=nil, but NewMethodSet(*T)={(*T).f}.
+	// Here we make them consistent by force.
+	// (The go/types bug is general, but this workaround is reached only
+	// for generic T thanks to the early return above.)
+	if gfn == nil {
+		mset := types.NewMethodSet(types.NewPointer(orig))
+		for i := 0; i < mset.Len(); i++ {
+			m := mset.At(i)
+			if m.Obj().Id() == fn.Id() {
+				gfn = m.Obj()
+				break
+			}
+		}
+	}
+
 	return gfn.(*types.Func)
 }
 
diff --git a/src/cmd/vendor/modules.txt b/src/cmd/vendor/modules.txt
index 6961b9b..fe71cb4 100644
--- a/src/cmd/vendor/modules.txt
+++ b/src/cmd/vendor/modules.txt
@@ -17,13 +17,13 @@
 # github.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2
 ## explicit; go 1.12
 github.com/ianlancetaylor/demangle
-# golang.org/x/arch v0.1.1-0.20221116201807-1bb480fc256a
+# golang.org/x/arch v0.4.0
 ## explicit; go 1.17
 golang.org/x/arch/arm/armasm
 golang.org/x/arch/arm64/arm64asm
 golang.org/x/arch/ppc64/ppc64asm
 golang.org/x/arch/x86/x86asm
-# golang.org/x/mod v0.7.0
+# golang.org/x/mod v0.12.0
 ## explicit; go 1.17
 golang.org/x/mod/internal/lazyregexp
 golang.org/x/mod/modfile
@@ -34,20 +34,21 @@
 golang.org/x/mod/sumdb/note
 golang.org/x/mod/sumdb/tlog
 golang.org/x/mod/zip
-# golang.org/x/sync v0.1.0
-## explicit
+# golang.org/x/sync v0.3.0
+## explicit; go 1.17
 golang.org/x/sync/semaphore
-# golang.org/x/sys v0.3.0
+# golang.org/x/sys v0.10.0
 ## explicit; go 1.17
 golang.org/x/sys/internal/unsafeheader
 golang.org/x/sys/plan9
 golang.org/x/sys/unix
 golang.org/x/sys/windows
-# golang.org/x/term v0.2.0
+# golang.org/x/term v0.10.0
 ## explicit; go 1.17
 golang.org/x/term
-# golang.org/x/tools v0.3.1-0.20230118190848-070db2996ebe
+# golang.org/x/tools v0.11.1-0.20230712164437-1ca21856af7b
 ## explicit; go 1.18
+golang.org/x/tools/cmd/bisect
 golang.org/x/tools/cover
 golang.org/x/tools/go/analysis
 golang.org/x/tools/go/analysis/internal/analysisflags
@@ -60,6 +61,7 @@
 golang.org/x/tools/go/analysis/passes/composite
 golang.org/x/tools/go/analysis/passes/copylock
 golang.org/x/tools/go/analysis/passes/ctrlflow
+golang.org/x/tools/go/analysis/passes/directive
 golang.org/x/tools/go/analysis/passes/errorsas
 golang.org/x/tools/go/analysis/passes/framepointer
 golang.org/x/tools/go/analysis/passes/httpresponse
@@ -72,6 +74,7 @@
 golang.org/x/tools/go/analysis/passes/printf
 golang.org/x/tools/go/analysis/passes/shift
 golang.org/x/tools/go/analysis/passes/sigchanyzer
+golang.org/x/tools/go/analysis/passes/slog
 golang.org/x/tools/go/analysis/passes/stdmethods
 golang.org/x/tools/go/analysis/passes/stringintconv
 golang.org/x/tools/go/analysis/passes/structtag
@@ -88,6 +91,6 @@
 golang.org/x/tools/go/cfg
 golang.org/x/tools/go/types/objectpath
 golang.org/x/tools/go/types/typeutil
-golang.org/x/tools/internal/analysisinternal
+golang.org/x/tools/internal/bisect
 golang.org/x/tools/internal/facts
 golang.org/x/tools/internal/typeparams
diff --git a/src/cmd/vet/doc.go b/src/cmd/vet/doc.go
index e230d3b..ba5b5ed 100644
--- a/src/cmd/vet/doc.go
+++ b/src/cmd/vet/doc.go
@@ -41,6 +41,7 @@
 	nilfunc      check for useless comparisons between functions and nil
 	printf       check consistency of Printf format strings and arguments
 	shift        check for shifts that equal or exceed the width of the integer
+	slog         check for incorrect arguments to log/slog functions
 	stdmethods   check signature of methods of well-known interfaces
 	structtag    check that struct field tags conform to reflect.StructTag.Get
 	tests        check for common mistaken usages of tests and examples
diff --git a/src/cmd/vet/main.go b/src/cmd/vet/main.go
index 334179c..a90758f 100644
--- a/src/cmd/vet/main.go
+++ b/src/cmd/vet/main.go
@@ -17,6 +17,7 @@
 	"golang.org/x/tools/go/analysis/passes/cgocall"
 	"golang.org/x/tools/go/analysis/passes/composite"
 	"golang.org/x/tools/go/analysis/passes/copylock"
+	"golang.org/x/tools/go/analysis/passes/directive"
 	"golang.org/x/tools/go/analysis/passes/errorsas"
 	"golang.org/x/tools/go/analysis/passes/framepointer"
 	"golang.org/x/tools/go/analysis/passes/httpresponse"
@@ -27,6 +28,7 @@
 	"golang.org/x/tools/go/analysis/passes/printf"
 	"golang.org/x/tools/go/analysis/passes/shift"
 	"golang.org/x/tools/go/analysis/passes/sigchanyzer"
+	"golang.org/x/tools/go/analysis/passes/slog"
 	"golang.org/x/tools/go/analysis/passes/stdmethods"
 	"golang.org/x/tools/go/analysis/passes/stringintconv"
 	"golang.org/x/tools/go/analysis/passes/structtag"
@@ -51,6 +53,7 @@
 		cgocall.Analyzer,
 		composite.Analyzer,
 		copylock.Analyzer,
+		directive.Analyzer,
 		errorsas.Analyzer,
 		framepointer.Analyzer,
 		httpresponse.Analyzer,
@@ -61,6 +64,7 @@
 		printf.Analyzer,
 		shift.Analyzer,
 		sigchanyzer.Analyzer,
+		slog.Analyzer,
 		stdmethods.Analyzer,
 		stringintconv.Analyzer,
 		structtag.Analyzer,
diff --git a/src/cmd/vet/testdata/directive/directive.go b/src/cmd/vet/testdata/directive/directive.go
new file mode 100644
index 0000000..91ccb1b
--- /dev/null
+++ b/src/cmd/vet/testdata/directive/directive.go
@@ -0,0 +1,4 @@
+package p
+
+// ERRORNEXT "//go:debug directive only valid in package main or test"
+//go:debug panicnil=1
diff --git a/src/cmd/vet/testdata/print/print.go b/src/cmd/vet/testdata/print/print.go
index 46240e8..a2ad0f1 100644
--- a/src/cmd/vet/testdata/print/print.go
+++ b/src/cmd/vet/testdata/print/print.go
@@ -140,9 +140,9 @@
 	fmt.Printf("%s", nonemptyinterface)         // correct (the type is responsible for formatting)
 	fmt.Printf("%.*s %d %6g", 3, "hi", 23, 'x') // ERROR "Printf format %6g has arg 'x' of wrong type rune"
 	fmt.Println()                               // not an error
-	fmt.Println("%s", "hi")                     // ERROR "Println call has possible formatting directive %s"
-	fmt.Println("%v", "hi")                     // ERROR "Println call has possible formatting directive %v"
-	fmt.Println("%T", "hi")                     // ERROR "Println call has possible formatting directive %T"
+	fmt.Println("%s", "hi")                     // ERROR "Println call has possible Printf formatting directive %s"
+	fmt.Println("%v", "hi")                     // ERROR "Println call has possible Printf formatting directive %v"
+	fmt.Println("%T", "hi")                     // ERROR "Println call has possible Printf formatting directive %T"
 	fmt.Println("0.0%")                         // correct (trailing % couldn't be a formatting directive)
 	fmt.Printf("%s", "hi", 3)                   // ERROR "Printf call needs 1 arg but has 2 args"
 	_ = fmt.Sprintf("%"+("s"), "hi", 3)         // ERROR "Sprintf call needs 1 arg but has 2 args"
@@ -165,19 +165,19 @@
 	Printf(format, "hi")              // ERROR "Printf format %s reads arg #2, but call has 1 arg$"
 	Printf("%s %d %.3v %q", "str", 4) // ERROR "Printf format %.3v reads arg #3, but call has 2 args"
 	f := new(ptrStringer)
-	f.Warn(0, "%s", "hello", 3)           // ERROR "Warn call has possible formatting directive %s"
+	f.Warn(0, "%s", "hello", 3)           // ERROR "Warn call has possible Printf formatting directive %s"
 	f.Warnf(0, "%s", "hello", 3)          // ERROR "Warnf call needs 1 arg but has 2 args"
 	f.Warnf(0, "%r", "hello")             // ERROR "Warnf format %r has unknown verb r"
 	f.Warnf(0, "%#s", "hello")            // ERROR "Warnf format %#s has unrecognized flag #"
-	f.Warn2(0, "%s", "hello", 3)          // ERROR "Warn2 call has possible formatting directive %s"
+	f.Warn2(0, "%s", "hello", 3)          // ERROR "Warn2 call has possible Printf formatting directive %s"
 	f.Warnf2(0, "%s", "hello", 3)         // ERROR "Warnf2 call needs 1 arg but has 2 args"
 	f.Warnf2(0, "%r", "hello")            // ERROR "Warnf2 format %r has unknown verb r"
 	f.Warnf2(0, "%#s", "hello")           // ERROR "Warnf2 format %#s has unrecognized flag #"
-	f.Wrap(0, "%s", "hello", 3)           // ERROR "Wrap call has possible formatting directive %s"
+	f.Wrap(0, "%s", "hello", 3)           // ERROR "Wrap call has possible Printf formatting directive %s"
 	f.Wrapf(0, "%s", "hello", 3)          // ERROR "Wrapf call needs 1 arg but has 2 args"
 	f.Wrapf(0, "%r", "hello")             // ERROR "Wrapf format %r has unknown verb r"
 	f.Wrapf(0, "%#s", "hello")            // ERROR "Wrapf format %#s has unrecognized flag #"
-	f.Wrap2(0, "%s", "hello", 3)          // ERROR "Wrap2 call has possible formatting directive %s"
+	f.Wrap2(0, "%s", "hello", 3)          // ERROR "Wrap2 call has possible Printf formatting directive %s"
 	f.Wrapf2(0, "%s", "hello", 3)         // ERROR "Wrapf2 call needs 1 arg but has 2 args"
 	f.Wrapf2(0, "%r", "hello")            // ERROR "Wrapf2 format %r has unknown verb r"
 	f.Wrapf2(0, "%#s", "hello")           // ERROR "Wrapf2 format %#s has unrecognized flag #"
@@ -213,7 +213,7 @@
 	var et1 *testing.T
 	et1.Error()        // ok
 	et1.Error("hi")    // ok
-	et1.Error("%d", 3) // ERROR "Error call has possible formatting directive %d"
+	et1.Error("%d", 3) // ERROR "Error call has possible Printf formatting directive %d"
 	var et3 errorTest3
 	et3.Error() // ok, not an error method.
 	var et4 errorTest4
@@ -239,7 +239,7 @@
 	// Special handling for Log.
 	math.Log(3) // OK
 	var t *testing.T
-	t.Log("%d", 3) // ERROR "Log call has possible formatting directive %d"
+	t.Log("%d", 3) // ERROR "Log call has possible Printf formatting directive %d"
 	t.Logf("%d", 3)
 	t.Logf("%d", "hi") // ERROR "Logf format %d has arg \x22hi\x22 of wrong type string"
 
@@ -290,27 +290,27 @@
 	Printf(someString(), "hello") // OK
 
 	// Printf wrappers in package log should be detected automatically
-	logpkg.Fatal("%d", 1)    // ERROR "Fatal call has possible formatting directive %d"
+	logpkg.Fatal("%d", 1)    // ERROR "Fatal call has possible Printf formatting directive %d"
 	logpkg.Fatalf("%d", "x") // ERROR "Fatalf format %d has arg \x22x\x22 of wrong type string"
-	logpkg.Fatalln("%d", 1)  // ERROR "Fatalln call has possible formatting directive %d"
-	logpkg.Panic("%d", 1)    // ERROR "Panic call has possible formatting directive %d"
+	logpkg.Fatalln("%d", 1)  // ERROR "Fatalln call has possible Printf formatting directive %d"
+	logpkg.Panic("%d", 1)    // ERROR "Panic call has possible Printf formatting directive %d"
 	logpkg.Panicf("%d", "x") // ERROR "Panicf format %d has arg \x22x\x22 of wrong type string"
-	logpkg.Panicln("%d", 1)  // ERROR "Panicln call has possible formatting directive %d"
-	logpkg.Print("%d", 1)    // ERROR "Print call has possible formatting directive %d"
+	logpkg.Panicln("%d", 1)  // ERROR "Panicln call has possible Printf formatting directive %d"
+	logpkg.Print("%d", 1)    // ERROR "Print call has possible Printf formatting directive %d"
 	logpkg.Printf("%d", "x") // ERROR "Printf format %d has arg \x22x\x22 of wrong type string"
-	logpkg.Println("%d", 1)  // ERROR "Println call has possible formatting directive %d"
+	logpkg.Println("%d", 1)  // ERROR "Println call has possible Printf formatting directive %d"
 
 	// Methods too.
 	var l *logpkg.Logger
-	l.Fatal("%d", 1)    // ERROR "Fatal call has possible formatting directive %d"
+	l.Fatal("%d", 1)    // ERROR "Fatal call has possible Printf formatting directive %d"
 	l.Fatalf("%d", "x") // ERROR "Fatalf format %d has arg \x22x\x22 of wrong type string"
-	l.Fatalln("%d", 1)  // ERROR "Fatalln call has possible formatting directive %d"
-	l.Panic("%d", 1)    // ERROR "Panic call has possible formatting directive %d"
+	l.Fatalln("%d", 1)  // ERROR "Fatalln call has possible Printf formatting directive %d"
+	l.Panic("%d", 1)    // ERROR "Panic call has possible Printf formatting directive %d"
 	l.Panicf("%d", "x") // ERROR "Panicf format %d has arg \x22x\x22 of wrong type string"
-	l.Panicln("%d", 1)  // ERROR "Panicln call has possible formatting directive %d"
-	l.Print("%d", 1)    // ERROR "Print call has possible formatting directive %d"
+	l.Panicln("%d", 1)  // ERROR "Panicln call has possible Printf formatting directive %d"
+	l.Print("%d", 1)    // ERROR "Print call has possible Printf formatting directive %d"
 	l.Printf("%d", "x") // ERROR "Printf format %d has arg \x22x\x22 of wrong type string"
-	l.Println("%d", 1)  // ERROR "Println call has possible formatting directive %d"
+	l.Println("%d", 1)  // ERROR "Println call has possible Printf formatting directive %d"
 
 	// Issue 26486
 	dbg("", 1) // no error "call has arguments but no formatting directive"
diff --git a/src/cmd/vet/testdata/slog/slog.go b/src/cmd/vet/testdata/slog/slog.go
new file mode 100644
index 0000000..accb043
--- /dev/null
+++ b/src/cmd/vet/testdata/slog/slog.go
@@ -0,0 +1,13 @@
+// Copyright 2023 The Go 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 the slog checker.
+
+package slog
+
+import "log/slog"
+
+func SlogTest() {
+	slog.Info("msg", "a") // ERROR "call to slog.Info missing a final value"
+}
diff --git a/src/cmd/vet/vet_test.go b/src/cmd/vet/vet_test.go
index 280ed8d..8b29907 100644
--- a/src/cmd/vet/vet_test.go
+++ b/src/cmd/vet/vet_test.go
@@ -71,6 +71,7 @@
 		"composite",
 		"copylock",
 		"deadcode",
+		"directive",
 		"httpresponse",
 		"lostcancel",
 		"method",
@@ -78,6 +79,7 @@
 		"print",
 		"rangeloop",
 		"shift",
+		"slog",
 		"structtag",
 		"testingpkg",
 		// "testtag" has its own test
diff --git a/src/cmp/cmp.go b/src/cmp/cmp.go
new file mode 100644
index 0000000..0fba5c1
--- /dev/null
+++ b/src/cmp/cmp.go
@@ -0,0 +1,59 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package cmp provides types and functions related to comparing
+// ordered values.
+package cmp
+
+// Ordered is a constraint that permits any ordered type: any type
+// that supports the operators < <= >= >.
+// If future releases of Go add new ordered types,
+// this constraint will be modified to include them.
+//
+// Note that floating-point types may contain NaN ("not-a-number") values.
+// An operator such as == or < will always report false when
+// comparing a NaN value with any other value, NaN or not.
+// See the [Compare] function for a consistent way to compare NaN values.
+type Ordered interface {
+	~int | ~int8 | ~int16 | ~int32 | ~int64 |
+		~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64 | ~uintptr |
+		~float32 | ~float64 |
+		~string
+}
+
+// Less reports whether x is less than y.
+// For floating-point types, a NaN is considered less than any non-NaN,
+// and -0.0 is not less than (is equal to) 0.0.
+func Less[T Ordered](x, y T) bool {
+	return (isNaN(x) && !isNaN(y)) || x < y
+}
+
+// Compare returns
+//
+//	-1 if x is less than y,
+//	 0 if x equals y,
+//	+1 if x is greater than y.
+//
+// For floating-point types, a NaN is considered less than any non-NaN,
+// a NaN is considered equal to a NaN, and -0.0 is equal to 0.0.
+func Compare[T Ordered](x, y T) int {
+	xNaN := isNaN(x)
+	yNaN := isNaN(y)
+	if xNaN && yNaN {
+		return 0
+	}
+	if xNaN || x < y {
+		return -1
+	}
+	if yNaN || x > y {
+		return +1
+	}
+	return 0
+}
+
+// isNaN reports whether x is a NaN without requiring the math package.
+// This will always return false if T is not floating-point.
+func isNaN[T Ordered](x T) bool {
+	return x != x
+}
diff --git a/src/cmp/cmp_test.go b/src/cmp/cmp_test.go
new file mode 100644
index 0000000..b0c0dc3
--- /dev/null
+++ b/src/cmp/cmp_test.go
@@ -0,0 +1,95 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package cmp_test
+
+import (
+	"cmp"
+	"math"
+	"sort"
+	"testing"
+)
+
+var negzero = math.Copysign(0, -1)
+
+var tests = []struct {
+	x, y    any
+	compare int
+}{
+	{1, 2, -1},
+	{1, 1, 0},
+	{2, 1, +1},
+	{"a", "aa", -1},
+	{"a", "a", 0},
+	{"aa", "a", +1},
+	{1.0, 1.1, -1},
+	{1.1, 1.1, 0},
+	{1.1, 1.0, +1},
+	{math.Inf(1), math.Inf(1), 0},
+	{math.Inf(-1), math.Inf(-1), 0},
+	{math.Inf(-1), 1.0, -1},
+	{1.0, math.Inf(-1), +1},
+	{math.Inf(1), 1.0, +1},
+	{1.0, math.Inf(1), -1},
+	{math.NaN(), math.NaN(), 0},
+	{0.0, math.NaN(), +1},
+	{math.NaN(), 0.0, -1},
+	{math.NaN(), math.Inf(-1), -1},
+	{math.Inf(-1), math.NaN(), +1},
+	{0.0, 0.0, 0},
+	{negzero, negzero, 0},
+	{negzero, 0.0, 0},
+	{0.0, negzero, 0},
+	{negzero, 1.0, -1},
+	{negzero, -1.0, +1},
+}
+
+func TestLess(t *testing.T) {
+	for _, test := range tests {
+		var b bool
+		switch test.x.(type) {
+		case int:
+			b = cmp.Less(test.x.(int), test.y.(int))
+		case string:
+			b = cmp.Less(test.x.(string), test.y.(string))
+		case float64:
+			b = cmp.Less(test.x.(float64), test.y.(float64))
+		}
+		if b != (test.compare < 0) {
+			t.Errorf("Less(%v, %v) == %t, want %t", test.x, test.y, b, test.compare < 0)
+		}
+	}
+}
+
+func TestCompare(t *testing.T) {
+	for _, test := range tests {
+		var c int
+		switch test.x.(type) {
+		case int:
+			c = cmp.Compare(test.x.(int), test.y.(int))
+		case string:
+			c = cmp.Compare(test.x.(string), test.y.(string))
+		case float64:
+			c = cmp.Compare(test.x.(float64), test.y.(float64))
+		}
+		if c != test.compare {
+			t.Errorf("Compare(%v, %v) == %d, want %d", test.x, test.y, c, test.compare)
+		}
+	}
+}
+
+func TestSort(t *testing.T) {
+	// Test that our comparison function is consistent with
+	// sort.Float64s.
+	input := []float64{1.0, 0.0, negzero, math.Inf(1), math.Inf(-1), math.NaN()}
+	sort.Float64s(input)
+	for i := 0; i < len(input)-1; i++ {
+		if cmp.Less(input[i+1], input[i]) {
+			t.Errorf("Less sort mismatch at %d in %v", i, input)
+		}
+		if cmp.Compare(input[i], input[i+1]) > 0 {
+			t.Errorf("Compare sort mismatch at %d in %v", i, input)
+		}
+	}
+}
diff --git a/src/compress/bzip2/bit_reader.go b/src/compress/bzip2/bit_reader.go
index ab1d606..b451265 100644
--- a/src/compress/bzip2/bit_reader.go
+++ b/src/compress/bzip2/bit_reader.go
@@ -60,7 +60,7 @@
 	//        |------------|
 	//           br.bits (num valid bits)
 	//
-	// This the next line right shifts the desired bits into the
+	// 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
diff --git a/src/compress/flate/deflate_test.go b/src/compress/flate/deflate_test.go
index 6d20430..3610c7b 100644
--- a/src/compress/flate/deflate_test.go
+++ b/src/compress/flate/deflate_test.go
@@ -801,7 +801,7 @@
 	t.Helper()
 	for _, err := range got {
 		if err != want {
-			t.Errorf("Errors dosn't match\nWant: %s\nGot: %s", want, got)
+			t.Errorf("Error doesn't match\nWant: %s\nGot: %s", want, got)
 		}
 	}
 }
diff --git a/src/compress/flate/inflate.go b/src/compress/flate/inflate.go
index 7efd447..d7375f2 100644
--- a/src/compress/flate/inflate.go
+++ b/src/compress/flate/inflate.go
@@ -267,6 +267,7 @@
 type decompressor struct {
 	// Input source.
 	r       Reader
+	rBuf    *bufio.Reader // created if provided io.Reader does not implement io.ByteReader
 	roffset int64
 
 	// Input bits, in top of b.
@@ -746,11 +747,20 @@
 	}
 }
 
-func makeReader(r io.Reader) Reader {
+func (f *decompressor) makeReader(r io.Reader) {
 	if rr, ok := r.(Reader); ok {
-		return rr
+		f.rBuf = nil
+		f.r = rr
+		return
 	}
-	return bufio.NewReader(r)
+	// Reuse rBuf if possible. Invariant: rBuf is always created (and owned) by decompressor.
+	if f.rBuf != nil {
+		f.rBuf.Reset(r)
+	} else {
+		// bufio.NewReader will not return r, as r does not implement flate.Reader, so it is not bufio.Reader.
+		f.rBuf = bufio.NewReader(r)
+	}
+	f.r = f.rBuf
 }
 
 func fixedHuffmanDecoderInit() {
@@ -775,12 +785,13 @@
 
 func (f *decompressor) Reset(r io.Reader, dict []byte) error {
 	*f = decompressor{
-		r:        makeReader(r),
+		rBuf:     f.rBuf,
 		bits:     f.bits,
 		codebits: f.codebits,
 		dict:     f.dict,
 		step:     (*decompressor).nextBlock,
 	}
+	f.makeReader(r)
 	f.dict.init(maxMatchOffset, dict)
 	return nil
 }
@@ -797,7 +808,7 @@
 	fixedHuffmanDecoderInit()
 
 	var f decompressor
-	f.r = makeReader(r)
+	f.makeReader(r)
 	f.bits = new([maxNumLit + maxNumDist]int)
 	f.codebits = new([numCodes]int)
 	f.step = (*decompressor).nextBlock
@@ -816,7 +827,7 @@
 	fixedHuffmanDecoderInit()
 
 	var f decompressor
-	f.r = makeReader(r)
+	f.makeReader(r)
 	f.bits = new([maxNumLit + maxNumDist]int)
 	f.codebits = new([numCodes]int)
 	f.step = (*decompressor).nextBlock
diff --git a/src/compress/flate/inflate_test.go b/src/compress/flate/inflate_test.go
index 9575be1..28a0122 100644
--- a/src/compress/flate/inflate_test.go
+++ b/src/compress/flate/inflate_test.go
@@ -5,6 +5,7 @@
 package flate
 
 import (
+	"bufio"
 	"bytes"
 	"io"
 	"strings"
@@ -95,3 +96,42 @@
 		}
 	}
 }
+
+func TestReaderReusesReaderBuffer(t *testing.T) {
+	encodedReader := bytes.NewReader([]byte{})
+	encodedNotByteReader := struct{ io.Reader }{encodedReader}
+
+	t.Run("BufferIsReused", func(t *testing.T) {
+		f := NewReader(encodedNotByteReader).(*decompressor)
+		bufioR, ok := f.r.(*bufio.Reader)
+		if !ok {
+			t.Fatalf("bufio.Reader should be created")
+		}
+		f.Reset(encodedNotByteReader, nil)
+		if bufioR != f.r {
+			t.Fatalf("bufio.Reader was not reused")
+		}
+	})
+	t.Run("BufferIsNotReusedWhenGotByteReader", func(t *testing.T) {
+		f := NewReader(encodedNotByteReader).(*decompressor)
+		if _, ok := f.r.(*bufio.Reader); !ok {
+			t.Fatalf("bufio.Reader should be created")
+		}
+		f.Reset(encodedReader, nil)
+		if f.r != encodedReader {
+			t.Fatalf("provided io.ByteReader should be used directly")
+		}
+	})
+	t.Run("BufferIsCreatedAfterByteReader", func(t *testing.T) {
+		for i, r := range []io.Reader{encodedReader, bufio.NewReader(encodedReader)} {
+			f := NewReader(r).(*decompressor)
+			if f.r != r {
+				t.Fatalf("provided io.ByteReader should be used directly, i=%d", i)
+			}
+			f.Reset(encodedNotByteReader, nil)
+			if _, ok := f.r.(*bufio.Reader); !ok {
+				t.Fatalf("bufio.Reader should be created, i=%d", i)
+			}
+		}
+	})
+}
diff --git a/src/compress/zlib/reader.go b/src/compress/zlib/reader.go
index 343a18b..10954ea 100644
--- a/src/compress/zlib/reader.go
+++ b/src/compress/zlib/reader.go
@@ -26,6 +26,7 @@
 import (
 	"bufio"
 	"compress/flate"
+	"encoding/binary"
 	"errors"
 	"hash"
 	"hash/adler32"
@@ -110,7 +111,7 @@
 		return n, z.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])
+	checksum := binary.BigEndian.Uint32(z.scratch[:4])
 	if checksum != z.digest.Sum32() {
 		z.err = ErrChecksum
 		return n, z.err
@@ -145,7 +146,7 @@
 		}
 		return z.err
 	}
-	h := uint(z.scratch[0])<<8 | uint(z.scratch[1])
+	h := binary.BigEndian.Uint16(z.scratch[:2])
 	if (z.scratch[0]&0x0f != zlibDeflate) || (z.scratch[0]>>4 > zlibMaxWindow) || (h%31 != 0) {
 		z.err = ErrHeader
 		return z.err
@@ -159,7 +160,7 @@
 			}
 			return z.err
 		}
-		checksum := uint32(z.scratch[0])<<24 | uint32(z.scratch[1])<<16 | uint32(z.scratch[2])<<8 | uint32(z.scratch[3])
+		checksum := binary.BigEndian.Uint32(z.scratch[:4])
 		if checksum != adler32.Checksum(dict) {
 			z.err = ErrDictionary
 			return z.err
diff --git a/src/compress/zlib/writer.go b/src/compress/zlib/writer.go
index 9986e38..c65e80f 100644
--- a/src/compress/zlib/writer.go
+++ b/src/compress/zlib/writer.go
@@ -115,7 +115,7 @@
 	if z.dict != nil {
 		z.scratch[1] |= 1 << 5
 	}
-	z.scratch[1] += uint8(31 - (uint16(z.scratch[0])<<8+uint16(z.scratch[1]))%31)
+	z.scratch[1] += uint8(31 - binary.BigEndian.Uint16(z.scratch[:2])%31)
 	if _, err = z.w.Write(z.scratch[0:2]); err != nil {
 		return err
 	}
diff --git a/src/context/afterfunc_test.go b/src/context/afterfunc_test.go
new file mode 100644
index 0000000..71f639a
--- /dev/null
+++ b/src/context/afterfunc_test.go
@@ -0,0 +1,141 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package context_test
+
+import (
+	"context"
+	"sync"
+	"testing"
+	"time"
+)
+
+// afterFuncContext is a context that's not one of the types
+// defined in context.go, that supports registering AfterFuncs.
+type afterFuncContext struct {
+	mu         sync.Mutex
+	afterFuncs map[*struct{}]func()
+	done       chan struct{}
+	err        error
+}
+
+func newAfterFuncContext() context.Context {
+	return &afterFuncContext{}
+}
+
+func (c *afterFuncContext) Deadline() (time.Time, bool) {
+	return time.Time{}, false
+}
+
+func (c *afterFuncContext) Done() <-chan struct{} {
+	c.mu.Lock()
+	defer c.mu.Unlock()
+	if c.done == nil {
+		c.done = make(chan struct{})
+	}
+	return c.done
+}
+
+func (c *afterFuncContext) Err() error {
+	c.mu.Lock()
+	defer c.mu.Unlock()
+	return c.err
+}
+
+func (c *afterFuncContext) Value(key any) any {
+	return nil
+}
+
+func (c *afterFuncContext) AfterFunc(f func()) func() bool {
+	c.mu.Lock()
+	defer c.mu.Unlock()
+	k := &struct{}{}
+	if c.afterFuncs == nil {
+		c.afterFuncs = make(map[*struct{}]func())
+	}
+	c.afterFuncs[k] = f
+	return func() bool {
+		c.mu.Lock()
+		defer c.mu.Unlock()
+		_, ok := c.afterFuncs[k]
+		delete(c.afterFuncs, k)
+		return ok
+	}
+}
+
+func (c *afterFuncContext) cancel(err error) {
+	c.mu.Lock()
+	defer c.mu.Unlock()
+	if c.err != nil {
+		return
+	}
+	c.err = err
+	for _, f := range c.afterFuncs {
+		go f()
+	}
+	c.afterFuncs = nil
+}
+
+func TestCustomContextAfterFuncCancel(t *testing.T) {
+	ctx0 := &afterFuncContext{}
+	ctx1, cancel := context.WithCancel(ctx0)
+	defer cancel()
+	ctx0.cancel(context.Canceled)
+	<-ctx1.Done()
+}
+
+func TestCustomContextAfterFuncTimeout(t *testing.T) {
+	ctx0 := &afterFuncContext{}
+	ctx1, cancel := context.WithTimeout(ctx0, veryLongDuration)
+	defer cancel()
+	ctx0.cancel(context.Canceled)
+	<-ctx1.Done()
+}
+
+func TestCustomContextAfterFuncAfterFunc(t *testing.T) {
+	ctx0 := &afterFuncContext{}
+	donec := make(chan struct{})
+	stop := context.AfterFunc(ctx0, func() {
+		close(donec)
+	})
+	defer stop()
+	ctx0.cancel(context.Canceled)
+	<-donec
+}
+
+func TestCustomContextAfterFuncUnregisterCancel(t *testing.T) {
+	ctx0 := &afterFuncContext{}
+	_, cancel := context.WithCancel(ctx0)
+	if got, want := len(ctx0.afterFuncs), 1; got != want {
+		t.Errorf("after WithCancel(ctx0): ctx0 has %v afterFuncs, want %v", got, want)
+	}
+	cancel()
+	if got, want := len(ctx0.afterFuncs), 0; got != want {
+		t.Errorf("after canceling WithCancel(ctx0): ctx0 has %v afterFuncs, want %v", got, want)
+	}
+}
+
+func TestCustomContextAfterFuncUnregisterTimeout(t *testing.T) {
+	ctx0 := &afterFuncContext{}
+	_, cancel := context.WithTimeout(ctx0, veryLongDuration)
+	if got, want := len(ctx0.afterFuncs), 1; got != want {
+		t.Errorf("after WithTimeout(ctx0, d): ctx0 has %v afterFuncs, want %v", got, want)
+	}
+	cancel()
+	if got, want := len(ctx0.afterFuncs), 0; got != want {
+		t.Errorf("after canceling WithTimeout(ctx0, d): ctx0 has %v afterFuncs, want %v", got, want)
+	}
+}
+
+func TestCustomContextAfterFuncUnregisterAfterFunc(t *testing.T) {
+	ctx0 := &afterFuncContext{}
+	stop := context.AfterFunc(ctx0, func() {})
+	if got, want := len(ctx0.afterFuncs), 1; got != want {
+		t.Errorf("after AfterFunc(ctx0, f): ctx0 has %v afterFuncs, want %v", got, want)
+	}
+	stop()
+	if got, want := len(ctx0.afterFuncs), 0; got != want {
+		t.Errorf("after stopping AfterFunc(ctx0, f): ctx0 has %v afterFuncs, want %v", got, want)
+	}
+}
diff --git a/src/context/context.go b/src/context/context.go
index f3fe1a4..ee66b43 100644
--- a/src/context/context.go
+++ b/src/context/context.go
@@ -6,25 +6,25 @@
 // cancellation signals, and other request-scoped values across API boundaries
 // and between processes.
 //
-// Incoming requests to a server should create a Context, and outgoing
+// Incoming requests to a server should create a [Context], and outgoing
 // calls to servers should accept a Context. The chain of function
 // calls between them must propagate the Context, optionally replacing
-// it with a derived Context created using WithCancel, WithDeadline,
-// WithTimeout, or WithValue. When a Context is canceled, all
+// it with a derived Context created using [WithCancel], [WithDeadline],
+// [WithTimeout], or [WithValue]. When a Context is canceled, all
 // Contexts derived from it are also canceled.
 //
-// The WithCancel, WithDeadline, and WithTimeout functions take a
+// The [WithCancel], [WithDeadline], and [WithTimeout] functions take a
 // Context (the parent) and return a derived Context (the child) and a
-// CancelFunc. Calling the CancelFunc cancels the child and its
+// [CancelFunc]. Calling the CancelFunc cancels the child and its
 // children, removes the parent's reference to the child, and stops
 // any associated timers. Failing to call the CancelFunc leaks the
 // child and its children until the parent is canceled or the timer
 // fires. The go vet tool checks that CancelFuncs are used on all
 // control-flow paths.
 //
-// The WithCancelCause function returns a CancelCauseFunc, which
+// The [WithCancelCause] function returns a [CancelCauseFunc], which
 // takes an error and records it as the cancellation cause. Calling
-// Cause on the canceled context or any of its children retrieves
+// [Cause] on the canceled context or any of its children retrieves
 // the cause. If no cause is specified, Cause(ctx) returns the same
 // value as ctx.Err().
 //
@@ -40,7 +40,7 @@
 //		// ... use ctx ...
 //	}
 //
-// Do not pass a nil Context, even if a function permits it. Pass context.TODO
+// Do not pass a nil [Context], even if a function permits it. Pass [context.TODO]
 // if you are unsure about which Context to use.
 //
 // Use context Values only for request-scoped data that transits processes and
@@ -159,10 +159,10 @@
 	Value(key any) any
 }
 
-// Canceled is the error returned by Context.Err when the context is canceled.
+// Canceled is the error returned by [Context.Err] when the context is canceled.
 var Canceled = errors.New("context canceled")
 
-// DeadlineExceeded is the error returned by Context.Err when the context's
+// DeadlineExceeded is the error returned by [Context.Err] when the context's
 // deadline passes.
 var DeadlineExceeded error = deadlineExceededError{}
 
@@ -172,55 +172,52 @@
 func (deadlineExceededError) Timeout() bool   { return true }
 func (deadlineExceededError) Temporary() bool { return true }
 
-// An emptyCtx is never canceled, has no values, and has no deadline. It is not
-// struct{}, since vars of this type must have distinct addresses.
-type emptyCtx int
+// An emptyCtx is never canceled, has no values, and has no deadline.
+// It is the common base of backgroundCtx and todoCtx.
+type emptyCtx struct{}
 
-func (*emptyCtx) Deadline() (deadline time.Time, ok bool) {
+func (emptyCtx) Deadline() (deadline time.Time, ok bool) {
 	return
 }
 
-func (*emptyCtx) Done() <-chan struct{} {
+func (emptyCtx) Done() <-chan struct{} {
 	return nil
 }
 
-func (*emptyCtx) Err() error {
+func (emptyCtx) Err() error {
 	return nil
 }
 
-func (*emptyCtx) Value(key any) any {
+func (emptyCtx) Value(key any) any {
 	return nil
 }
 
-func (e *emptyCtx) String() string {
-	switch e {
-	case background:
-		return "context.Background"
-	case todo:
-		return "context.TODO"
-	}
-	return "unknown empty Context"
+type backgroundCtx struct{ emptyCtx }
+
+func (backgroundCtx) String() string {
+	return "context.Background"
 }
 
-var (
-	background = new(emptyCtx)
-	todo       = new(emptyCtx)
-)
+type todoCtx struct{ emptyCtx }
 
-// Background returns a non-nil, empty Context. It is never canceled, has no
+func (todoCtx) String() string {
+	return "context.TODO"
+}
+
+// Background returns a non-nil, empty [Context]. It is never canceled, has no
 // values, and has no deadline. It is typically used by the main function,
 // initialization, and tests, and as the top-level Context for incoming
 // requests.
 func Background() Context {
-	return background
+	return backgroundCtx{}
 }
 
-// TODO returns a non-nil, empty Context. Code should use context.TODO when
+// TODO returns a non-nil, empty [Context]. Code should use context.TODO when
 // it's unclear which Context to use or it is not yet available (because the
 // surrounding function has not yet been extended to accept a Context
 // parameter).
 func TODO() Context {
-	return todo
+	return todoCtx{}
 }
 
 // A CancelFunc tells an operation to abandon its work.
@@ -240,8 +237,8 @@
 	return c, func() { c.cancel(true, Canceled, nil) }
 }
 
-// A CancelCauseFunc behaves like a CancelFunc but additionally sets the cancellation cause.
-// This cause can be retrieved by calling Cause on the canceled Context or on
+// A CancelCauseFunc behaves like a [CancelFunc] but additionally sets the cancellation cause.
+// This cause can be retrieved by calling [Cause] on the canceled Context or on
 // any of its derived Contexts.
 //
 // If the context has already been canceled, CancelCauseFunc does not set the cause.
@@ -252,7 +249,7 @@
 //     then Cause(parentContext) == cause1 and Cause(childContext) == cause2
 type CancelCauseFunc func(cause error)
 
-// WithCancelCause behaves like WithCancel but returns a CancelCauseFunc instead of a CancelFunc.
+// WithCancelCause behaves like [WithCancel] but returns a [CancelCauseFunc] instead of a [CancelFunc].
 // Calling cancel with a non-nil error (the "cause") records that error in ctx;
 // it can then be retrieved using Cause(ctx).
 // Calling cancel with nil sets the cause to Canceled.
@@ -272,15 +269,15 @@
 	if parent == nil {
 		panic("cannot create context from nil parent")
 	}
-	c := newCancelCtx(parent)
-	propagateCancel(parent, c)
+	c := &cancelCtx{}
+	c.propagateCancel(parent, c)
 	return c
 }
 
 // Cause returns a non-nil error explaining why c was canceled.
 // The first cancellation of c or one of its parents sets the cause.
 // If that cancellation happened via a call to CancelCauseFunc(err),
-// then Cause returns err.
+// then [Cause] returns err.
 // Otherwise Cause(c) returns the same value as c.Err().
 // Cause returns nil if c has not been canceled yet.
 func Cause(c Context) error {
@@ -292,53 +289,72 @@
 	return nil
 }
 
-// newCancelCtx returns an initialized cancelCtx.
-func newCancelCtx(parent Context) *cancelCtx {
-	return &cancelCtx{Context: parent}
+// AfterFunc arranges to call f in its own goroutine after ctx is done
+// (cancelled or timed out).
+// If ctx is already done, AfterFunc calls f immediately in its own goroutine.
+//
+// Multiple calls to AfterFunc on a context operate independently;
+// one does not replace another.
+//
+// Calling the returned stop function stops the association of ctx with f.
+// It returns true if the call stopped f from being run.
+// If stop returns false,
+// either the context is done and f has been started in its own goroutine;
+// or f was already stopped.
+// The stop function does not wait for f to complete before returning.
+// If the caller needs to know whether f is completed,
+// it must coordinate with f explicitly.
+//
+// If ctx has a "AfterFunc(func()) func() bool" method,
+// AfterFunc will use it to schedule the call.
+func AfterFunc(ctx Context, f func()) (stop func() bool) {
+	a := &afterFuncCtx{
+		f: f,
+	}
+	a.cancelCtx.propagateCancel(ctx, a)
+	return func() bool {
+		stopped := false
+		a.once.Do(func() {
+			stopped = true
+		})
+		if stopped {
+			a.cancel(true, Canceled, nil)
+		}
+		return stopped
+	}
+}
+
+type afterFuncer interface {
+	AfterFunc(func()) func() bool
+}
+
+type afterFuncCtx struct {
+	cancelCtx
+	once sync.Once // either starts running f or stops f from running
+	f    func()
+}
+
+func (a *afterFuncCtx) cancel(removeFromParent bool, err, cause error) {
+	a.cancelCtx.cancel(false, err, cause)
+	if removeFromParent {
+		removeChild(a.Context, a)
+	}
+	a.once.Do(func() {
+		go a.f()
+	})
+}
+
+// A stopCtx is used as the parent context of a cancelCtx when
+// an AfterFunc has been registered with the parent.
+// It holds the stop function used to unregister the AfterFunc.
+type stopCtx struct {
+	Context
+	stop func() bool
 }
 
 // goroutines counts the number of goroutines ever created; for testing.
 var goroutines atomic.Int32
 
-// propagateCancel arranges for child to be canceled when parent is.
-func propagateCancel(parent Context, child canceler) {
-	done := parent.Done()
-	if done == nil {
-		return // parent is never canceled
-	}
-
-	select {
-	case <-done:
-		// parent is already canceled
-		child.cancel(false, parent.Err(), Cause(parent))
-		return
-	default:
-	}
-
-	if p, ok := parentCancelCtx(parent); ok {
-		p.mu.Lock()
-		if p.err != nil {
-			// parent has already been canceled
-			child.cancel(false, p.err, p.cause)
-		} else {
-			if p.children == nil {
-				p.children = make(map[canceler]struct{})
-			}
-			p.children[child] = struct{}{}
-		}
-		p.mu.Unlock()
-	} else {
-		goroutines.Add(1)
-		go func() {
-			select {
-			case <-parent.Done():
-				child.cancel(false, parent.Err(), Cause(parent))
-			case <-child.Done():
-			}
-		}()
-	}
-}
-
 // &cancelCtxKey is the key that a cancelCtx returns itself for.
 var cancelCtxKey int
 
@@ -366,6 +382,10 @@
 
 // removeChild removes a context from its parent.
 func removeChild(parent Context, child canceler) {
+	if s, ok := parent.(stopCtx); ok {
+		s.stop()
+		return
+	}
 	p, ok := parentCancelCtx(parent)
 	if !ok {
 		return
@@ -432,6 +452,64 @@
 	return err
 }
 
+// propagateCancel arranges for child to be canceled when parent is.
+// It sets the parent context of cancelCtx.
+func (c *cancelCtx) propagateCancel(parent Context, child canceler) {
+	c.Context = parent
+
+	done := parent.Done()
+	if done == nil {
+		return // parent is never canceled
+	}
+
+	select {
+	case <-done:
+		// parent is already canceled
+		child.cancel(false, parent.Err(), Cause(parent))
+		return
+	default:
+	}
+
+	if p, ok := parentCancelCtx(parent); ok {
+		// parent is a *cancelCtx, or derives from one.
+		p.mu.Lock()
+		if p.err != nil {
+			// parent has already been canceled
+			child.cancel(false, p.err, p.cause)
+		} else {
+			if p.children == nil {
+				p.children = make(map[canceler]struct{})
+			}
+			p.children[child] = struct{}{}
+		}
+		p.mu.Unlock()
+		return
+	}
+
+	if a, ok := parent.(afterFuncer); ok {
+		// parent implements an AfterFunc method.
+		c.mu.Lock()
+		stop := a.AfterFunc(func() {
+			child.cancel(false, parent.Err(), Cause(parent))
+		})
+		c.Context = stopCtx{
+			Context: parent,
+			stop:    stop,
+		}
+		c.mu.Unlock()
+		return
+	}
+
+	goroutines.Add(1)
+	go func() {
+		select {
+		case <-parent.Done():
+			child.cancel(false, parent.Err(), Cause(parent))
+		case <-child.Done():
+		}
+	}()
+}
+
 type stringer interface {
 	String() string
 }
@@ -482,16 +560,57 @@
 	}
 }
 
+// WithoutCancel returns a copy of parent that is not canceled when parent is canceled.
+// The returned context returns no Deadline or Err, and its Done channel is nil.
+// Calling [Cause] on the returned context returns nil.
+func WithoutCancel(parent Context) Context {
+	if parent == nil {
+		panic("cannot create context from nil parent")
+	}
+	return withoutCancelCtx{parent}
+}
+
+type withoutCancelCtx struct {
+	c Context
+}
+
+func (withoutCancelCtx) Deadline() (deadline time.Time, ok bool) {
+	return
+}
+
+func (withoutCancelCtx) Done() <-chan struct{} {
+	return nil
+}
+
+func (withoutCancelCtx) Err() error {
+	return nil
+}
+
+func (c withoutCancelCtx) Value(key any) any {
+	return value(c, key)
+}
+
+func (c withoutCancelCtx) String() string {
+	return contextName(c.c) + ".WithoutCancel"
+}
+
 // WithDeadline returns a copy of the parent context with the deadline adjusted
 // to be no later than d. If the parent's deadline is already earlier than d,
 // WithDeadline(parent, d) is semantically equivalent to parent. The returned
-// context's Done channel is closed when the deadline expires, when the returned
+// [Context.Done] channel is closed when the deadline expires, when the returned
 // cancel function is called, or when the parent context's Done channel is
 // closed, whichever happens first.
 //
 // Canceling this context releases resources associated with it, so code should
-// call cancel as soon as the operations running in this Context complete.
+// call cancel as soon as the operations running in this [Context] complete.
 func WithDeadline(parent Context, d time.Time) (Context, CancelFunc) {
+	return WithDeadlineCause(parent, d, nil)
+}
+
+// WithDeadlineCause behaves like [WithDeadline] but also sets the cause of the
+// returned Context when the deadline is exceeded. The returned [CancelFunc] does
+// not set the cause.
+func WithDeadlineCause(parent Context, d time.Time, cause error) (Context, CancelFunc) {
 	if parent == nil {
 		panic("cannot create context from nil parent")
 	}
@@ -500,20 +619,19 @@
 		return WithCancel(parent)
 	}
 	c := &timerCtx{
-		cancelCtx: newCancelCtx(parent),
-		deadline:  d,
+		deadline: d,
 	}
-	propagateCancel(parent, c)
+	c.cancelCtx.propagateCancel(parent, c)
 	dur := time.Until(d)
 	if dur <= 0 {
-		c.cancel(true, DeadlineExceeded, nil) // deadline has already passed
+		c.cancel(true, DeadlineExceeded, cause) // deadline has already passed
 		return c, func() { c.cancel(false, Canceled, nil) }
 	}
 	c.mu.Lock()
 	defer c.mu.Unlock()
 	if c.err == nil {
 		c.timer = time.AfterFunc(dur, func() {
-			c.cancel(true, DeadlineExceeded, nil)
+			c.cancel(true, DeadlineExceeded, cause)
 		})
 	}
 	return c, func() { c.cancel(true, Canceled, nil) }
@@ -523,7 +641,7 @@
 // implement Done and Err. It implements cancel by stopping its timer then
 // delegating to cancelCtx.cancel.
 type timerCtx struct {
-	*cancelCtx
+	cancelCtx
 	timer *time.Timer // Under cancelCtx.mu.
 
 	deadline time.Time
@@ -556,7 +674,7 @@
 // WithTimeout returns WithDeadline(parent, time.Now().Add(timeout)).
 //
 // Canceling this context releases resources associated with it, so code should
-// call cancel as soon as the operations running in this Context complete:
+// call cancel as soon as the operations running in this [Context] complete:
 //
 //	func slowOperationWithTimeout(ctx context.Context) (Result, error) {
 //		ctx, cancel := context.WithTimeout(ctx, 100*time.Millisecond)
@@ -567,6 +685,13 @@
 	return WithDeadline(parent, time.Now().Add(timeout))
 }
 
+// WithTimeoutCause behaves like [WithTimeout] but also sets the cause of the
+// returned Context when the timeout expires. The returned [CancelFunc] does
+// not set the cause.
+func WithTimeoutCause(parent Context, timeout time.Duration, cause error) (Context, CancelFunc) {
+	return WithDeadlineCause(parent, time.Now().Add(timeout), cause)
+}
+
 // WithValue returns a copy of parent in which the value associated with key is
 // val.
 //
@@ -639,12 +764,19 @@
 				return c
 			}
 			c = ctx.Context
+		case withoutCancelCtx:
+			if key == &cancelCtxKey {
+				// This implements Cause(ctx) == nil
+				// when ctx is created using WithoutCancel.
+				return nil
+			}
+			c = ctx.c
 		case *timerCtx:
 			if key == &cancelCtxKey {
-				return ctx.cancelCtx
+				return &ctx.cancelCtx
 			}
 			c = ctx.Context
-		case *emptyCtx:
+		case backgroundCtx, todoCtx:
 			return nil
 		default:
 			return c.Value(key)
diff --git a/src/context/context_test.go b/src/context/context_test.go
index eb5a86b..57066c9 100644
--- a/src/context/context_test.go
+++ b/src/context/context_test.go
@@ -4,13 +4,12 @@
 
 package context
 
+// Tests in package context cannot depend directly on package testing due to an import cycle.
+// If your test does requires access to unexported members of the context package,
+// add your test below as `func XTestFoo(t testingT)` and add a `TestFoo` to x_test.go
+// that calls it. Otherwise, write a regular test in a test.go file in package context_test.
+
 import (
-	"errors"
-	"fmt"
-	"math/rand"
-	"runtime"
-	"strings"
-	"sync"
 	"time"
 )
 
@@ -34,98 +33,7 @@
 	Skipped() bool
 }
 
-// otherContext is a Context that's not one of the types defined in context.go.
-// This lets us test code paths that differ based on the underlying type of the
-// Context.
-type otherContext struct {
-	Context
-}
-
-const (
-	shortDuration    = 1 * time.Millisecond // a reasonable duration to block in a test
-	veryLongDuration = 1000 * time.Hour     // an arbitrary upper bound on the test's running time
-)
-
-// quiescent returns an arbitrary duration by which the program should have
-// completed any remaining work and reached a steady (idle) state.
-func quiescent(t testingT) time.Duration {
-	deadline, ok := t.Deadline()
-	if !ok {
-		return 5 * time.Second
-	}
-
-	const arbitraryCleanupMargin = 1 * time.Second
-	return time.Until(deadline) - arbitraryCleanupMargin
-}
-
-func XTestBackground(t testingT) {
-	c := Background()
-	if c == nil {
-		t.Fatalf("Background returned nil")
-	}
-	select {
-	case x := <-c.Done():
-		t.Errorf("<-c.Done() == %v want nothing (it should block)", x)
-	default:
-	}
-	if got, want := fmt.Sprint(c), "context.Background"; got != want {
-		t.Errorf("Background().String() = %q want %q", got, want)
-	}
-}
-
-func XTestTODO(t testingT) {
-	c := TODO()
-	if c == nil {
-		t.Fatalf("TODO returned nil")
-	}
-	select {
-	case x := <-c.Done():
-		t.Errorf("<-c.Done() == %v want nothing (it should block)", x)
-	default:
-	}
-	if got, want := fmt.Sprint(c), "context.TODO"; got != want {
-		t.Errorf("TODO().String() = %q want %q", got, want)
-	}
-}
-
-func XTestWithCancel(t testingT) {
-	c1, cancel := WithCancel(Background())
-
-	if got, want := fmt.Sprint(c1), "context.Background.WithCancel"; got != want {
-		t.Errorf("c1.String() = %q want %q", got, want)
-	}
-
-	o := otherContext{c1}
-	c2, _ := WithCancel(o)
-	contexts := []Context{c1, o, c2}
-
-	for i, c := range contexts {
-		if d := c.Done(); d == nil {
-			t.Errorf("c[%d].Done() == %v want non-nil", i, d)
-		}
-		if e := c.Err(); e != nil {
-			t.Errorf("c[%d].Err() == %v want nil", i, e)
-		}
-
-		select {
-		case x := <-c.Done():
-			t.Errorf("<-c.Done() == %v want nothing (it should block)", x)
-		default:
-		}
-	}
-
-	cancel() // Should propagate synchronously.
-	for i, c := range contexts {
-		select {
-		case <-c.Done():
-		default:
-			t.Errorf("<-c[%d].Done() blocked, but shouldn't have", i)
-		}
-		if e := c.Err(); e != Canceled {
-			t.Errorf("c[%d].Err() == %v want %v", i, e, Canceled)
-		}
-	}
-}
+const veryLongDuration = 1000 * time.Hour // an arbitrary upper bound on the test's running time
 
 func contains(m map[canceler]struct{}, key canceler) bool {
 	_, ret := m[key]
@@ -136,12 +44,15 @@
 	// Context tree:
 	// parent -> cancelChild
 	// parent -> valueChild -> timerChild
+	// parent -> afterChild
 	parent, cancel := WithCancel(Background())
 	cancelChild, stop := WithCancel(parent)
 	defer stop()
 	valueChild := WithValue(parent, "key", "value")
 	timerChild, stop := WithTimeout(valueChild, veryLongDuration)
 	defer stop()
+	afterStop := AfterFunc(parent, func() {})
+	defer afterStop()
 
 	select {
 	case x := <-parent.Done():
@@ -155,13 +66,20 @@
 	default:
 	}
 
-	// The parent's children should contain the two cancelable children.
+	// The parent's children should contain the three cancelable children.
 	pc := parent.(*cancelCtx)
 	cc := cancelChild.(*cancelCtx)
 	tc := timerChild.(*timerCtx)
 	pc.mu.Lock()
-	if len(pc.children) != 2 || !contains(pc.children, cc) || !contains(pc.children, tc) {
-		t.Errorf("bad linkage: pc.children = %v, want %v and %v",
+	var ac *afterFuncCtx
+	for c := range pc.children {
+		if a, ok := c.(*afterFuncCtx); ok {
+			ac = a
+			break
+		}
+	}
+	if len(pc.children) != 3 || !contains(pc.children, cc) || !contains(pc.children, tc) || ac == nil {
+		t.Errorf("bad linkage: pc.children = %v, want %v, %v, and an afterFunc",
 			pc.children, cc, tc)
 	}
 	pc.mu.Unlock()
@@ -172,6 +90,9 @@
 	if p, ok := parentCancelCtx(tc.Context); !ok || p != pc {
 		t.Errorf("bad linkage: parentCancelCtx(timerChild.Context) = %v, %v want %v, true", p, ok, pc)
 	}
+	if p, ok := parentCancelCtx(ac.Context); !ok || p != pc {
+		t.Errorf("bad linkage: parentCancelCtx(afterChild.Context) = %v, %v want %v, true", p, ok, pc)
+	}
 
 	cancel()
 
@@ -269,365 +190,6 @@
 	}
 }
 
-func testDeadline(c Context, name string, t testingT) {
-	t.Helper()
-	d := quiescent(t)
-	timer := time.NewTimer(d)
-	defer timer.Stop()
-	select {
-	case <-timer.C:
-		t.Fatalf("%s: context not timed out after %v", name, d)
-	case <-c.Done():
-	}
-	if e := c.Err(); e != DeadlineExceeded {
-		t.Errorf("%s: c.Err() == %v; want %v", name, e, DeadlineExceeded)
-	}
-}
-
-func XTestDeadline(t testingT) {
-	t.Parallel()
-
-	c, _ := WithDeadline(Background(), time.Now().Add(shortDuration))
-	if got, prefix := fmt.Sprint(c), "context.Background.WithDeadline("; !strings.HasPrefix(got, prefix) {
-		t.Errorf("c.String() = %q want prefix %q", got, prefix)
-	}
-	testDeadline(c, "WithDeadline", t)
-
-	c, _ = WithDeadline(Background(), time.Now().Add(shortDuration))
-	o := otherContext{c}
-	testDeadline(o, "WithDeadline+otherContext", t)
-
-	c, _ = WithDeadline(Background(), time.Now().Add(shortDuration))
-	o = otherContext{c}
-	c, _ = WithDeadline(o, time.Now().Add(veryLongDuration))
-	testDeadline(c, "WithDeadline+otherContext+WithDeadline", t)
-
-	c, _ = WithDeadline(Background(), time.Now().Add(-shortDuration))
-	testDeadline(c, "WithDeadline+inthepast", t)
-
-	c, _ = WithDeadline(Background(), time.Now())
-	testDeadline(c, "WithDeadline+now", t)
-}
-
-func XTestTimeout(t testingT) {
-	t.Parallel()
-
-	c, _ := WithTimeout(Background(), shortDuration)
-	if got, prefix := fmt.Sprint(c), "context.Background.WithDeadline("; !strings.HasPrefix(got, prefix) {
-		t.Errorf("c.String() = %q want prefix %q", got, prefix)
-	}
-	testDeadline(c, "WithTimeout", t)
-
-	c, _ = WithTimeout(Background(), shortDuration)
-	o := otherContext{c}
-	testDeadline(o, "WithTimeout+otherContext", t)
-
-	c, _ = WithTimeout(Background(), shortDuration)
-	o = otherContext{c}
-	c, _ = WithTimeout(o, veryLongDuration)
-	testDeadline(c, "WithTimeout+otherContext+WithTimeout", t)
-}
-
-func XTestCanceledTimeout(t testingT) {
-	c, _ := WithTimeout(Background(), time.Second)
-	o := otherContext{c}
-	c, cancel := WithTimeout(o, veryLongDuration)
-	cancel() // Should propagate synchronously.
-	select {
-	case <-c.Done():
-	default:
-		t.Errorf("<-c.Done() blocked, but shouldn't have")
-	}
-	if e := c.Err(); e != Canceled {
-		t.Errorf("c.Err() == %v want %v", e, Canceled)
-	}
-}
-
-type key1 int
-type key2 int
-
-var k1 = key1(1)
-var k2 = key2(1) // same int as k1, different type
-var k3 = key2(3) // same type as k2, different int
-
-func XTestValues(t testingT) {
-	check := func(c Context, nm, v1, v2, v3 string) {
-		if v, ok := c.Value(k1).(string); ok == (len(v1) == 0) || v != v1 {
-			t.Errorf(`%s.Value(k1).(string) = %q, %t want %q, %t`, nm, v, ok, v1, len(v1) != 0)
-		}
-		if v, ok := c.Value(k2).(string); ok == (len(v2) == 0) || v != v2 {
-			t.Errorf(`%s.Value(k2).(string) = %q, %t want %q, %t`, nm, v, ok, v2, len(v2) != 0)
-		}
-		if v, ok := c.Value(k3).(string); ok == (len(v3) == 0) || v != v3 {
-			t.Errorf(`%s.Value(k3).(string) = %q, %t want %q, %t`, nm, v, ok, v3, len(v3) != 0)
-		}
-	}
-
-	c0 := Background()
-	check(c0, "c0", "", "", "")
-
-	c1 := WithValue(Background(), k1, "c1k1")
-	check(c1, "c1", "c1k1", "", "")
-
-	if got, want := fmt.Sprint(c1), `context.Background.WithValue(type context.key1, val c1k1)`; got != want {
-		t.Errorf("c.String() = %q want %q", got, want)
-	}
-
-	c2 := WithValue(c1, k2, "c2k2")
-	check(c2, "c2", "c1k1", "c2k2", "")
-
-	c3 := WithValue(c2, k3, "c3k3")
-	check(c3, "c2", "c1k1", "c2k2", "c3k3")
-
-	c4 := WithValue(c3, k1, nil)
-	check(c4, "c4", "", "c2k2", "c3k3")
-
-	o0 := otherContext{Background()}
-	check(o0, "o0", "", "", "")
-
-	o1 := otherContext{WithValue(Background(), k1, "c1k1")}
-	check(o1, "o1", "c1k1", "", "")
-
-	o2 := WithValue(o1, k2, "o2k2")
-	check(o2, "o2", "c1k1", "o2k2", "")
-
-	o3 := otherContext{c4}
-	check(o3, "o3", "", "c2k2", "c3k3")
-
-	o4 := WithValue(o3, k3, nil)
-	check(o4, "o4", "", "c2k2", "")
-}
-
-func XTestAllocs(t testingT, testingShort func() bool, testingAllocsPerRun func(int, func()) float64) {
-	bg := Background()
-	for _, test := range []struct {
-		desc       string
-		f          func()
-		limit      float64
-		gccgoLimit float64
-	}{
-		{
-			desc:       "Background()",
-			f:          func() { Background() },
-			limit:      0,
-			gccgoLimit: 0,
-		},
-		{
-			desc: fmt.Sprintf("WithValue(bg, %v, nil)", k1),
-			f: func() {
-				c := WithValue(bg, k1, nil)
-				c.Value(k1)
-			},
-			limit:      3,
-			gccgoLimit: 3,
-		},
-		{
-			desc: "WithTimeout(bg, 1*time.Nanosecond)",
-			f: func() {
-				c, _ := WithTimeout(bg, 1*time.Nanosecond)
-				<-c.Done()
-			},
-			limit:      12,
-			gccgoLimit: 15,
-		},
-		{
-			desc: "WithCancel(bg)",
-			f: func() {
-				c, cancel := WithCancel(bg)
-				cancel()
-				<-c.Done()
-			},
-			limit:      5,
-			gccgoLimit: 8,
-		},
-		{
-			desc: "WithTimeout(bg, 5*time.Millisecond)",
-			f: func() {
-				c, cancel := WithTimeout(bg, 5*time.Millisecond)
-				cancel()
-				<-c.Done()
-			},
-			limit:      8,
-			gccgoLimit: 25,
-		},
-	} {
-		limit := test.limit
-		if runtime.Compiler == "gccgo" {
-			// gccgo does not yet do escape analysis.
-			// TODO(iant): Remove this when gccgo does do escape analysis.
-			limit = test.gccgoLimit
-		}
-		numRuns := 100
-		if testingShort() {
-			numRuns = 10
-		}
-		if n := testingAllocsPerRun(numRuns, test.f); n > limit {
-			t.Errorf("%s allocs = %f want %d", test.desc, n, int(limit))
-		}
-	}
-}
-
-func XTestSimultaneousCancels(t testingT) {
-	root, cancel := WithCancel(Background())
-	m := map[Context]CancelFunc{root: cancel}
-	q := []Context{root}
-	// Create a tree of contexts.
-	for len(q) != 0 && len(m) < 100 {
-		parent := q[0]
-		q = q[1:]
-		for i := 0; i < 4; i++ {
-			ctx, cancel := WithCancel(parent)
-			m[ctx] = cancel
-			q = append(q, ctx)
-		}
-	}
-	// Start all the cancels in a random order.
-	var wg sync.WaitGroup
-	wg.Add(len(m))
-	for _, cancel := range m {
-		go func(cancel CancelFunc) {
-			cancel()
-			wg.Done()
-		}(cancel)
-	}
-
-	d := quiescent(t)
-	stuck := make(chan struct{})
-	timer := time.AfterFunc(d, func() { close(stuck) })
-	defer timer.Stop()
-
-	// Wait on all the contexts in a random order.
-	for ctx := range m {
-		select {
-		case <-ctx.Done():
-		case <-stuck:
-			buf := make([]byte, 10<<10)
-			n := runtime.Stack(buf, true)
-			t.Fatalf("timed out after %v waiting for <-ctx.Done(); stacks:\n%s", d, buf[:n])
-		}
-	}
-	// Wait for all the cancel functions to return.
-	done := make(chan struct{})
-	go func() {
-		wg.Wait()
-		close(done)
-	}()
-	select {
-	case <-done:
-	case <-stuck:
-		buf := make([]byte, 10<<10)
-		n := runtime.Stack(buf, true)
-		t.Fatalf("timed out after %v waiting for cancel functions; stacks:\n%s", d, buf[:n])
-	}
-}
-
-func XTestInterlockedCancels(t testingT) {
-	parent, cancelParent := WithCancel(Background())
-	child, cancelChild := WithCancel(parent)
-	go func() {
-		<-parent.Done()
-		cancelChild()
-	}()
-	cancelParent()
-	d := quiescent(t)
-	timer := time.NewTimer(d)
-	defer timer.Stop()
-	select {
-	case <-child.Done():
-	case <-timer.C:
-		buf := make([]byte, 10<<10)
-		n := runtime.Stack(buf, true)
-		t.Fatalf("timed out after %v waiting for child.Done(); stacks:\n%s", d, buf[:n])
-	}
-}
-
-func XTestLayersCancel(t testingT) {
-	testLayers(t, time.Now().UnixNano(), false)
-}
-
-func XTestLayersTimeout(t testingT) {
-	testLayers(t, time.Now().UnixNano(), true)
-}
-
-func testLayers(t testingT, seed int64, testTimeout bool) {
-	t.Parallel()
-
-	r := rand.New(rand.NewSource(seed))
-	errorf := func(format string, a ...any) {
-		t.Errorf(fmt.Sprintf("seed=%d: %s", seed, format), a...)
-	}
-	const (
-		minLayers = 30
-	)
-	type value int
-	var (
-		vals      []*value
-		cancels   []CancelFunc
-		numTimers int
-		ctx       = Background()
-	)
-	for i := 0; i < minLayers || numTimers == 0 || len(cancels) == 0 || len(vals) == 0; i++ {
-		switch r.Intn(3) {
-		case 0:
-			v := new(value)
-			ctx = WithValue(ctx, v, v)
-			vals = append(vals, v)
-		case 1:
-			var cancel CancelFunc
-			ctx, cancel = WithCancel(ctx)
-			cancels = append(cancels, cancel)
-		case 2:
-			var cancel CancelFunc
-			d := veryLongDuration
-			if testTimeout {
-				d = shortDuration
-			}
-			ctx, cancel = WithTimeout(ctx, d)
-			cancels = append(cancels, cancel)
-			numTimers++
-		}
-	}
-	checkValues := func(when string) {
-		for _, key := range vals {
-			if val := ctx.Value(key).(*value); key != val {
-				errorf("%s: ctx.Value(%p) = %p want %p", when, key, val, key)
-			}
-		}
-	}
-	if !testTimeout {
-		select {
-		case <-ctx.Done():
-			errorf("ctx should not be canceled yet")
-		default:
-		}
-	}
-	if s, prefix := fmt.Sprint(ctx), "context.Background."; !strings.HasPrefix(s, prefix) {
-		t.Errorf("ctx.String() = %q want prefix %q", s, prefix)
-	}
-	t.Log(ctx)
-	checkValues("before cancel")
-	if testTimeout {
-		d := quiescent(t)
-		timer := time.NewTimer(d)
-		defer timer.Stop()
-		select {
-		case <-ctx.Done():
-		case <-timer.C:
-			errorf("ctx should have timed out after %v", d)
-		}
-		checkValues("after timeout")
-	} else {
-		cancel := cancels[r.Intn(len(cancels))]
-		cancel()
-		select {
-		case <-ctx.Done():
-		default:
-			errorf("ctx should be canceled")
-		}
-		checkValues("after cancel")
-	}
-}
-
 func XTestCancelRemoves(t testingT) {
 	checkChildren := func(when string, ctx Context, want int) {
 		if got := len(ctx.(*cancelCtx).children); got != want {
@@ -648,69 +210,13 @@
 	checkChildren("with WithTimeout child ", ctx, 1)
 	cancel()
 	checkChildren("after canceling WithTimeout child", ctx, 0)
-}
 
-func XTestWithCancelCanceledParent(t testingT) {
-	parent, pcancel := WithCancelCause(Background())
-	cause := fmt.Errorf("Because!")
-	pcancel(cause)
-
-	c, _ := WithCancel(parent)
-	select {
-	case <-c.Done():
-	default:
-		t.Errorf("child not done immediately upon construction")
-	}
-	if got, want := c.Err(), Canceled; got != want {
-		t.Errorf("child not canceled; got = %v, want = %v", got, want)
-	}
-	if got, want := Cause(c), cause; got != want {
-		t.Errorf("child has wrong cause; got = %v, want = %v", got, want)
-	}
-}
-
-func XTestWithValueChecksKey(t testingT) {
-	panicVal := recoveredValue(func() { WithValue(Background(), []byte("foo"), "bar") })
-	if panicVal == nil {
-		t.Error("expected panic")
-	}
-	panicVal = recoveredValue(func() { WithValue(Background(), nil, "bar") })
-	if got, want := fmt.Sprint(panicVal), "nil key"; got != want {
-		t.Errorf("panic = %q; want %q", got, want)
-	}
-}
-
-func XTestInvalidDerivedFail(t testingT) {
-	panicVal := recoveredValue(func() { WithCancel(nil) })
-	if panicVal == nil {
-		t.Error("expected panic")
-	}
-	panicVal = recoveredValue(func() { WithDeadline(nil, time.Now().Add(shortDuration)) })
-	if panicVal == nil {
-		t.Error("expected panic")
-	}
-	panicVal = recoveredValue(func() { WithValue(nil, "foo", "bar") })
-	if panicVal == nil {
-		t.Error("expected panic")
-	}
-}
-
-func recoveredValue(fn func()) (v any) {
-	defer func() { v = recover() }()
-	fn()
-	return
-}
-
-func XTestDeadlineExceededSupportsTimeout(t testingT) {
-	i, ok := DeadlineExceeded.(interface {
-		Timeout() bool
-	})
-	if !ok {
-		t.Fatal("DeadlineExceeded does not support Timeout interface")
-	}
-	if !i.Timeout() {
-		t.Fatal("wrong value for timeout")
-	}
+	ctx, _ = WithCancel(Background())
+	checkChildren("after creation", ctx, 0)
+	stop := AfterFunc(ctx, func() {})
+	checkChildren("with AfterFunc child ", ctx, 1)
+	stop()
+	checkChildren("after stopping AfterFunc child ", ctx, 0)
 }
 
 type myCtx struct {
@@ -725,7 +231,6 @@
 	c := make(chan struct{})
 	return c
 }
-
 func XTestCustomContextGoroutines(t testingT) {
 	g := goroutines.Load()
 	checkNoGoroutine := func() {
@@ -790,167 +295,3 @@
 	defer cancel7()
 	checkNoGoroutine()
 }
-
-func XTestCause(t testingT) {
-	var (
-		parentCause = fmt.Errorf("parentCause")
-		childCause  = fmt.Errorf("childCause")
-	)
-	for _, test := range []struct {
-		name  string
-		ctx   Context
-		err   error
-		cause error
-	}{
-		{
-			name:  "Background",
-			ctx:   Background(),
-			err:   nil,
-			cause: nil,
-		},
-		{
-			name:  "TODO",
-			ctx:   TODO(),
-			err:   nil,
-			cause: nil,
-		},
-		{
-			name: "WithCancel",
-			ctx: func() Context {
-				ctx, cancel := WithCancel(Background())
-				cancel()
-				return ctx
-			}(),
-			err:   Canceled,
-			cause: Canceled,
-		},
-		{
-			name: "WithCancelCause",
-			ctx: func() Context {
-				ctx, cancel := WithCancelCause(Background())
-				cancel(parentCause)
-				return ctx
-			}(),
-			err:   Canceled,
-			cause: parentCause,
-		},
-		{
-			name: "WithCancelCause nil",
-			ctx: func() Context {
-				ctx, cancel := WithCancelCause(Background())
-				cancel(nil)
-				return ctx
-			}(),
-			err:   Canceled,
-			cause: Canceled,
-		},
-		{
-			name: "WithCancelCause: parent cause before child",
-			ctx: func() Context {
-				ctx, cancelParent := WithCancelCause(Background())
-				ctx, cancelChild := WithCancelCause(ctx)
-				cancelParent(parentCause)
-				cancelChild(childCause)
-				return ctx
-			}(),
-			err:   Canceled,
-			cause: parentCause,
-		},
-		{
-			name: "WithCancelCause: parent cause after child",
-			ctx: func() Context {
-				ctx, cancelParent := WithCancelCause(Background())
-				ctx, cancelChild := WithCancelCause(ctx)
-				cancelChild(childCause)
-				cancelParent(parentCause)
-				return ctx
-			}(),
-			err:   Canceled,
-			cause: childCause,
-		},
-		{
-			name: "WithCancelCause: parent cause before nil",
-			ctx: func() Context {
-				ctx, cancelParent := WithCancelCause(Background())
-				ctx, cancelChild := WithCancel(ctx)
-				cancelParent(parentCause)
-				cancelChild()
-				return ctx
-			}(),
-			err:   Canceled,
-			cause: parentCause,
-		},
-		{
-			name: "WithCancelCause: parent cause after nil",
-			ctx: func() Context {
-				ctx, cancelParent := WithCancelCause(Background())
-				ctx, cancelChild := WithCancel(ctx)
-				cancelChild()
-				cancelParent(parentCause)
-				return ctx
-			}(),
-			err:   Canceled,
-			cause: Canceled,
-		},
-		{
-			name: "WithCancelCause: child cause after nil",
-			ctx: func() Context {
-				ctx, cancelParent := WithCancel(Background())
-				ctx, cancelChild := WithCancelCause(ctx)
-				cancelParent()
-				cancelChild(childCause)
-				return ctx
-			}(),
-			err:   Canceled,
-			cause: Canceled,
-		},
-		{
-			name: "WithCancelCause: child cause before nil",
-			ctx: func() Context {
-				ctx, cancelParent := WithCancel(Background())
-				ctx, cancelChild := WithCancelCause(ctx)
-				cancelChild(childCause)
-				cancelParent()
-				return ctx
-			}(),
-			err:   Canceled,
-			cause: childCause,
-		},
-		{
-			name: "WithTimeout",
-			ctx: func() Context {
-				ctx, cancel := WithTimeout(Background(), 0)
-				cancel()
-				return ctx
-			}(),
-			err:   DeadlineExceeded,
-			cause: DeadlineExceeded,
-		},
-	} {
-		if got, want := test.ctx.Err(), test.err; want != got {
-			t.Errorf("%s: ctx.Err() = %v want %v", test.name, got, want)
-		}
-		if got, want := Cause(test.ctx), test.cause; want != got {
-			t.Errorf("%s: Cause(ctx) = %v want %v", test.name, got, want)
-		}
-	}
-}
-
-func XTestCauseRace(t testingT) {
-	cause := errors.New("TestCauseRace")
-	ctx, cancel := WithCancelCause(Background())
-	go func() {
-		cancel(cause)
-	}()
-	for {
-		// Poll Cause, rather than waiting for Done, to test that
-		// access to the underlying cause is synchronized properly.
-		if err := Cause(ctx); err != nil {
-			if err != cause {
-				t.Errorf("Cause returned %v, want %v", err, cause)
-			}
-			break
-		}
-		runtime.Gosched()
-	}
-}
diff --git a/src/context/example_test.go b/src/context/example_test.go
index 72ac5d2..03333b5 100644
--- a/src/context/example_test.go
+++ b/src/context/example_test.go
@@ -6,11 +6,14 @@
 
 import (
 	"context"
+	"errors"
 	"fmt"
+	"net"
+	"sync"
 	"time"
 )
 
-const shortDuration = 1 * time.Millisecond // a reasonable duration to block in an example
+var neverReady = make(chan struct{}) // never closed
 
 // This example demonstrates the use of a cancelable context to prevent a
 // goroutine leak. By the end of the example function, the goroutine started
@@ -66,8 +69,8 @@
 	defer cancel()
 
 	select {
-	case <-time.After(1 * time.Second):
-		fmt.Println("overslept")
+	case <-neverReady:
+		fmt.Println("ready")
 	case <-ctx.Done():
 		fmt.Println(ctx.Err())
 	}
@@ -85,8 +88,8 @@
 	defer cancel()
 
 	select {
-	case <-time.After(1 * time.Second):
-		fmt.Println("overslept")
+	case <-neverReady:
+		fmt.Println("ready")
 	case <-ctx.Done():
 		fmt.Println(ctx.Err()) // prints "context deadline exceeded"
 	}
@@ -118,3 +121,143 @@
 	// found value: Go
 	// key not found: color
 }
+
+// This example uses AfterFunc to define a function which waits on a sync.Cond,
+// stopping the wait when a context is canceled.
+func ExampleAfterFunc_cond() {
+	waitOnCond := func(ctx context.Context, cond *sync.Cond, conditionMet func() bool) error {
+		stopf := context.AfterFunc(ctx, func() {
+			// We need to acquire cond.L here to be sure that the Broadcast
+			// below won't occur before the call to Wait, which would result
+			// in a missed signal (and deadlock).
+			cond.L.Lock()
+			defer cond.L.Unlock()
+
+			// If multiple goroutines are waiting on cond simultaneously,
+			// we need to make sure we wake up exactly this one.
+			// That means that we need to Broadcast to all of the goroutines,
+			// which will wake them all up.
+			//
+			// If there are N concurrent calls to waitOnCond, each of the goroutines
+			// will spuriously wake up O(N) other goroutines that aren't ready yet,
+			// so this will cause the overall CPU cost to be O(N²).
+			cond.Broadcast()
+		})
+		defer stopf()
+
+		// Since the wakeups are using Broadcast instead of Signal, this call to
+		// Wait may unblock due to some other goroutine's context becoming done,
+		// so to be sure that ctx is actually done we need to check it in a loop.
+		for !conditionMet() {
+			cond.Wait()
+			if ctx.Err() != nil {
+				return ctx.Err()
+			}
+		}
+
+		return nil
+	}
+
+	cond := sync.NewCond(new(sync.Mutex))
+
+	var wg sync.WaitGroup
+	for i := 0; i < 4; i++ {
+		wg.Add(1)
+		go func() {
+			defer wg.Done()
+
+			ctx, cancel := context.WithTimeout(context.Background(), 1*time.Millisecond)
+			defer cancel()
+
+			cond.L.Lock()
+			defer cond.L.Unlock()
+
+			err := waitOnCond(ctx, cond, func() bool { return false })
+			fmt.Println(err)
+		}()
+	}
+	wg.Wait()
+
+	// Output:
+	// context deadline exceeded
+	// context deadline exceeded
+	// context deadline exceeded
+	// context deadline exceeded
+}
+
+// This example uses AfterFunc to define a function which reads from a net.Conn,
+// stopping the read when a context is canceled.
+func ExampleAfterFunc_connection() {
+	readFromConn := func(ctx context.Context, conn net.Conn, b []byte) (n int, err error) {
+		stopc := make(chan struct{})
+		stop := context.AfterFunc(ctx, func() {
+			conn.SetReadDeadline(time.Now())
+			close(stopc)
+		})
+		n, err = conn.Read(b)
+		if !stop() {
+			// The AfterFunc was started.
+			// Wait for it to complete, and reset the Conn's deadline.
+			<-stopc
+			conn.SetReadDeadline(time.Time{})
+			return n, ctx.Err()
+		}
+		return n, err
+	}
+
+	listener, err := net.Listen("tcp", ":0")
+	if err != nil {
+		fmt.Println(err)
+		return
+	}
+	defer listener.Close()
+
+	conn, err := net.Dial(listener.Addr().Network(), listener.Addr().String())
+	if err != nil {
+		fmt.Println(err)
+		return
+	}
+	defer conn.Close()
+
+	ctx, cancel := context.WithTimeout(context.Background(), 1*time.Millisecond)
+	defer cancel()
+
+	b := make([]byte, 1024)
+	_, err = readFromConn(ctx, conn, b)
+	fmt.Println(err)
+
+	// Output:
+	// context deadline exceeded
+}
+
+// This example uses AfterFunc to define a function which combines
+// the cancellation signals of two Contexts.
+func ExampleAfterFunc_merge() {
+	// mergeCancel returns a context that contains the values of ctx,
+	// and which is canceled when either ctx or cancelCtx is canceled.
+	mergeCancel := func(ctx, cancelCtx context.Context) (context.Context, context.CancelFunc) {
+		ctx, cancel := context.WithCancelCause(ctx)
+		stop := context.AfterFunc(cancelCtx, func() {
+			cancel(context.Cause(cancelCtx))
+		})
+		return ctx, func() {
+			stop()
+			cancel(context.Canceled)
+		}
+	}
+
+	ctx1, cancel1 := context.WithCancelCause(context.Background())
+	defer cancel1(errors.New("ctx1 canceled"))
+
+	ctx2, cancel2 := context.WithCancelCause(context.Background())
+
+	mergedCtx, mergedCancel := mergeCancel(ctx1, ctx2)
+	defer mergedCancel()
+
+	cancel2(errors.New("ctx2 canceled"))
+	<-mergedCtx.Done()
+	fmt.Println(context.Cause(mergedCtx))
+
+	// Output:
+	// ctx2 canceled
+}
diff --git a/src/context/x_test.go b/src/context/x_test.go
index a2d814f..57fe60b 100644
--- a/src/context/x_test.go
+++ b/src/context/x_test.go
@@ -6,28 +6,951 @@
 
 import (
 	. "context"
+	"errors"
+	"fmt"
+	"math/rand"
+	"runtime"
+	"strings"
+	"sync"
 	"testing"
+	"time"
 )
 
-func TestBackground(t *testing.T)                      { XTestBackground(t) }
-func TestTODO(t *testing.T)                            { XTestTODO(t) }
-func TestWithCancel(t *testing.T)                      { XTestWithCancel(t) }
-func TestParentFinishesChild(t *testing.T)             { XTestParentFinishesChild(t) }
-func TestChildFinishesFirst(t *testing.T)              { XTestChildFinishesFirst(t) }
-func TestDeadline(t *testing.T)                        { XTestDeadline(t) }
-func TestTimeout(t *testing.T)                         { XTestTimeout(t) }
-func TestCanceledTimeout(t *testing.T)                 { XTestCanceledTimeout(t) }
-func TestValues(t *testing.T)                          { XTestValues(t) }
-func TestAllocs(t *testing.T)                          { XTestAllocs(t, testing.Short, testing.AllocsPerRun) }
-func TestSimultaneousCancels(t *testing.T)             { XTestSimultaneousCancels(t) }
-func TestInterlockedCancels(t *testing.T)              { XTestInterlockedCancels(t) }
-func TestLayersCancel(t *testing.T)                    { XTestLayersCancel(t) }
-func TestLayersTimeout(t *testing.T)                   { XTestLayersTimeout(t) }
-func TestCancelRemoves(t *testing.T)                   { XTestCancelRemoves(t) }
-func TestWithCancelCanceledParent(t *testing.T)        { XTestWithCancelCanceledParent(t) }
-func TestWithValueChecksKey(t *testing.T)              { XTestWithValueChecksKey(t) }
-func TestInvalidDerivedFail(t *testing.T)              { XTestInvalidDerivedFail(t) }
-func TestDeadlineExceededSupportsTimeout(t *testing.T) { XTestDeadlineExceededSupportsTimeout(t) }
-func TestCustomContextGoroutines(t *testing.T)         { XTestCustomContextGoroutines(t) }
-func TestCause(t *testing.T)                           { XTestCause(t) }
-func TestCauseRace(t *testing.T)                       { XTestCauseRace(t) }
+// Each XTestFoo in context_test.go must be called from a TestFoo here to run.
+func TestParentFinishesChild(t *testing.T) {
+	XTestParentFinishesChild(t) // uses unexported context types
+}
+func TestChildFinishesFirst(t *testing.T) {
+	XTestChildFinishesFirst(t) // uses unexported context types
+}
+func TestCancelRemoves(t *testing.T) {
+	XTestCancelRemoves(t) // uses unexported context types
+}
+func TestCustomContextGoroutines(t *testing.T) {
+	XTestCustomContextGoroutines(t) // reads the context.goroutines counter
+}
+
+// The following are regular tests in package context_test.
+
+// otherContext is a Context that's not one of the types defined in context.go.
+// This lets us test code paths that differ based on the underlying type of the
+// Context.
+type otherContext struct {
+	Context
+}
+
+const (
+	shortDuration    = 1 * time.Millisecond // a reasonable duration to block in a test
+	veryLongDuration = 1000 * time.Hour     // an arbitrary upper bound on the test's running time
+)
+
+// quiescent returns an arbitrary duration by which the program should have
+// completed any remaining work and reached a steady (idle) state.
+func quiescent(t *testing.T) time.Duration {
+	deadline, ok := t.Deadline()
+	if !ok {
+		return 5 * time.Second
+	}
+
+	const arbitraryCleanupMargin = 1 * time.Second
+	return time.Until(deadline) - arbitraryCleanupMargin
+}
+func TestBackground(t *testing.T) {
+	c := Background()
+	if c == nil {
+		t.Fatalf("Background returned nil")
+	}
+	select {
+	case x := <-c.Done():
+		t.Errorf("<-c.Done() == %v want nothing (it should block)", x)
+	default:
+	}
+	if got, want := fmt.Sprint(c), "context.Background"; got != want {
+		t.Errorf("Background().String() = %q want %q", got, want)
+	}
+}
+
+func TestTODO(t *testing.T) {
+	c := TODO()
+	if c == nil {
+		t.Fatalf("TODO returned nil")
+	}
+	select {
+	case x := <-c.Done():
+		t.Errorf("<-c.Done() == %v want nothing (it should block)", x)
+	default:
+	}
+	if got, want := fmt.Sprint(c), "context.TODO"; got != want {
+		t.Errorf("TODO().String() = %q want %q", got, want)
+	}
+}
+
+func TestWithCancel(t *testing.T) {
+	c1, cancel := WithCancel(Background())
+
+	if got, want := fmt.Sprint(c1), "context.Background.WithCancel"; got != want {
+		t.Errorf("c1.String() = %q want %q", got, want)
+	}
+
+	o := otherContext{c1}
+	c2, _ := WithCancel(o)
+	contexts := []Context{c1, o, c2}
+
+	for i, c := range contexts {
+		if d := c.Done(); d == nil {
+			t.Errorf("c[%d].Done() == %v want non-nil", i, d)
+		}
+		if e := c.Err(); e != nil {
+			t.Errorf("c[%d].Err() == %v want nil", i, e)
+		}
+
+		select {
+		case x := <-c.Done():
+			t.Errorf("<-c.Done() == %v want nothing (it should block)", x)
+		default:
+		}
+	}
+
+	cancel() // Should propagate synchronously.
+	for i, c := range contexts {
+		select {
+		case <-c.Done():
+		default:
+			t.Errorf("<-c[%d].Done() blocked, but shouldn't have", i)
+		}
+		if e := c.Err(); e != Canceled {
+			t.Errorf("c[%d].Err() == %v want %v", i, e, Canceled)
+		}
+	}
+}
+
+func testDeadline(c Context, name string, t *testing.T) {
+	t.Helper()
+	d := quiescent(t)
+	timer := time.NewTimer(d)
+	defer timer.Stop()
+	select {
+	case <-timer.C:
+		t.Fatalf("%s: context not timed out after %v", name, d)
+	case <-c.Done():
+	}
+	if e := c.Err(); e != DeadlineExceeded {
+		t.Errorf("%s: c.Err() == %v; want %v", name, e, DeadlineExceeded)
+	}
+}
+
+func TestDeadline(t *testing.T) {
+	t.Parallel()
+
+	c, _ := WithDeadline(Background(), time.Now().Add(shortDuration))
+	if got, prefix := fmt.Sprint(c), "context.Background.WithDeadline("; !strings.HasPrefix(got, prefix) {
+		t.Errorf("c.String() = %q want prefix %q", got, prefix)
+	}
+	testDeadline(c, "WithDeadline", t)
+
+	c, _ = WithDeadline(Background(), time.Now().Add(shortDuration))
+	o := otherContext{c}
+	testDeadline(o, "WithDeadline+otherContext", t)
+
+	c, _ = WithDeadline(Background(), time.Now().Add(shortDuration))
+	o = otherContext{c}
+	c, _ = WithDeadline(o, time.Now().Add(veryLongDuration))
+	testDeadline(c, "WithDeadline+otherContext+WithDeadline", t)
+
+	c, _ = WithDeadline(Background(), time.Now().Add(-shortDuration))
+	testDeadline(c, "WithDeadline+inthepast", t)
+
+	c, _ = WithDeadline(Background(), time.Now())
+	testDeadline(c, "WithDeadline+now", t)
+}
+
+func TestTimeout(t *testing.T) {
+	t.Parallel()
+
+	c, _ := WithTimeout(Background(), shortDuration)
+	if got, prefix := fmt.Sprint(c), "context.Background.WithDeadline("; !strings.HasPrefix(got, prefix) {
+		t.Errorf("c.String() = %q want prefix %q", got, prefix)
+	}
+	testDeadline(c, "WithTimeout", t)
+
+	c, _ = WithTimeout(Background(), shortDuration)
+	o := otherContext{c}
+	testDeadline(o, "WithTimeout+otherContext", t)
+
+	c, _ = WithTimeout(Background(), shortDuration)
+	o = otherContext{c}
+	c, _ = WithTimeout(o, veryLongDuration)
+	testDeadline(c, "WithTimeout+otherContext+WithTimeout", t)
+}
+
+func TestCanceledTimeout(t *testing.T) {
+	c, _ := WithTimeout(Background(), time.Second)
+	o := otherContext{c}
+	c, cancel := WithTimeout(o, veryLongDuration)
+	cancel() // Should propagate synchronously.
+	select {
+	case <-c.Done():
+	default:
+		t.Errorf("<-c.Done() blocked, but shouldn't have")
+	}
+	if e := c.Err(); e != Canceled {
+		t.Errorf("c.Err() == %v want %v", e, Canceled)
+	}
+}
+
+type key1 int
+type key2 int
+
+var k1 = key1(1)
+var k2 = key2(1) // same int as k1, different type
+var k3 = key2(3) // same type as k2, different int
+
+func TestValues(t *testing.T) {
+	check := func(c Context, nm, v1, v2, v3 string) {
+		if v, ok := c.Value(k1).(string); ok == (len(v1) == 0) || v != v1 {
+			t.Errorf(`%s.Value(k1).(string) = %q, %t want %q, %t`, nm, v, ok, v1, len(v1) != 0)
+		}
+		if v, ok := c.Value(k2).(string); ok == (len(v2) == 0) || v != v2 {
+			t.Errorf(`%s.Value(k2).(string) = %q, %t want %q, %t`, nm, v, ok, v2, len(v2) != 0)
+		}
+		if v, ok := c.Value(k3).(string); ok == (len(v3) == 0) || v != v3 {
+			t.Errorf(`%s.Value(k3).(string) = %q, %t want %q, %t`, nm, v, ok, v3, len(v3) != 0)
+		}
+	}
+
+	c0 := Background()
+	check(c0, "c0", "", "", "")
+
+	c1 := WithValue(Background(), k1, "c1k1")
+	check(c1, "c1", "c1k1", "", "")
+
+	if got, want := fmt.Sprint(c1), `context.Background.WithValue(type context_test.key1, val c1k1)`; got != want {
+		t.Errorf("c.String() = %q want %q", got, want)
+	}
+
+	c2 := WithValue(c1, k2, "c2k2")
+	check(c2, "c2", "c1k1", "c2k2", "")
+
+	c3 := WithValue(c2, k3, "c3k3")
+	check(c3, "c2", "c1k1", "c2k2", "c3k3")
+
+	c4 := WithValue(c3, k1, nil)
+	check(c4, "c4", "", "c2k2", "c3k3")
+
+	o0 := otherContext{Background()}
+	check(o0, "o0", "", "", "")
+
+	o1 := otherContext{WithValue(Background(), k1, "c1k1")}
+	check(o1, "o1", "c1k1", "", "")
+
+	o2 := WithValue(o1, k2, "o2k2")
+	check(o2, "o2", "c1k1", "o2k2", "")
+
+	o3 := otherContext{c4}
+	check(o3, "o3", "", "c2k2", "c3k3")
+
+	o4 := WithValue(o3, k3, nil)
+	check(o4, "o4", "", "c2k2", "")
+}
+
+func TestAllocs(t *testing.T) {
+	bg := Background()
+	for _, test := range []struct {
+		desc       string
+		f          func()
+		limit      float64
+		gccgoLimit float64
+	}{
+		{
+			desc:       "Background()",
+			f:          func() { Background() },
+			limit:      0,
+			gccgoLimit: 0,
+		},
+		{
+			desc: fmt.Sprintf("WithValue(bg, %v, nil)", k1),
+			f: func() {
+				c := WithValue(bg, k1, nil)
+				c.Value(k1)
+			},
+			limit:      3,
+			gccgoLimit: 3,
+		},
+		{
+			desc: "WithTimeout(bg, 1*time.Nanosecond)",
+			f: func() {
+				c, _ := WithTimeout(bg, 1*time.Nanosecond)
+				<-c.Done()
+			},
+			limit:      12,
+			gccgoLimit: 15,
+		},
+		{
+			desc: "WithCancel(bg)",
+			f: func() {
+				c, cancel := WithCancel(bg)
+				cancel()
+				<-c.Done()
+			},
+			limit:      5,
+			gccgoLimit: 8,
+		},
+		{
+			desc: "WithTimeout(bg, 5*time.Millisecond)",
+			f: func() {
+				c, cancel := WithTimeout(bg, 5*time.Millisecond)
+				cancel()
+				<-c.Done()
+			},
+			limit:      8,
+			gccgoLimit: 25,
+		},
+	} {
+		limit := test.limit
+		if runtime.Compiler == "gccgo" {
+			// gccgo does not yet do escape analysis.
+			// TODO(iant): Remove this when gccgo does do escape analysis.
+			limit = test.gccgoLimit
+		}
+		numRuns := 100
+		if testing.Short() {
+			numRuns = 10
+		}
+		if n := testing.AllocsPerRun(numRuns, test.f); n > limit {
+			t.Errorf("%s allocs = %f want %d", test.desc, n, int(limit))
+		}
+	}
+}
+
+func TestSimultaneousCancels(t *testing.T) {
+	root, cancel := WithCancel(Background())
+	m := map[Context]CancelFunc{root: cancel}
+	q := []Context{root}
+	// Create a tree of contexts.
+	for len(q) != 0 && len(m) < 100 {
+		parent := q[0]
+		q = q[1:]
+		for i := 0; i < 4; i++ {
+			ctx, cancel := WithCancel(parent)
+			m[ctx] = cancel
+			q = append(q, ctx)
+		}
+	}
+	// Start all the cancels in a random order.
+	var wg sync.WaitGroup
+	wg.Add(len(m))
+	for _, cancel := range m {
+		go func(cancel CancelFunc) {
+			cancel()
+			wg.Done()
+		}(cancel)
+	}
+
+	d := quiescent(t)
+	stuck := make(chan struct{})
+	timer := time.AfterFunc(d, func() { close(stuck) })
+	defer timer.Stop()
+
+	// Wait on all the contexts in a random order.
+	for ctx := range m {
+		select {
+		case <-ctx.Done():
+		case <-stuck:
+			buf := make([]byte, 10<<10)
+			n := runtime.Stack(buf, true)
+			t.Fatalf("timed out after %v waiting for <-ctx.Done(); stacks:\n%s", d, buf[:n])
+		}
+	}
+	// Wait for all the cancel functions to return.
+	done := make(chan struct{})
+	go func() {
+		wg.Wait()
+		close(done)
+	}()
+	select {
+	case <-done:
+	case <-stuck:
+		buf := make([]byte, 10<<10)
+		n := runtime.Stack(buf, true)
+		t.Fatalf("timed out after %v waiting for cancel functions; stacks:\n%s", d, buf[:n])
+	}
+}
+
+func TestInterlockedCancels(t *testing.T) {
+	parent, cancelParent := WithCancel(Background())
+	child, cancelChild := WithCancel(parent)
+	go func() {
+		<-parent.Done()
+		cancelChild()
+	}()
+	cancelParent()
+	d := quiescent(t)
+	timer := time.NewTimer(d)
+	defer timer.Stop()
+	select {
+	case <-child.Done():
+	case <-timer.C:
+		buf := make([]byte, 10<<10)
+		n := runtime.Stack(buf, true)
+		t.Fatalf("timed out after %v waiting for child.Done(); stacks:\n%s", d, buf[:n])
+	}
+}
+
+func TestLayersCancel(t *testing.T) {
+	testLayers(t, time.Now().UnixNano(), false)
+}
+
+func TestLayersTimeout(t *testing.T) {
+	testLayers(t, time.Now().UnixNano(), true)
+}
+
+func testLayers(t *testing.T, seed int64, testTimeout bool) {
+	t.Parallel()
+
+	r := rand.New(rand.NewSource(seed))
+	errorf := func(format string, a ...any) {
+		t.Errorf(fmt.Sprintf("seed=%d: %s", seed, format), a...)
+	}
+	const (
+		minLayers = 30
+	)
+	type value int
+	var (
+		vals      []*value
+		cancels   []CancelFunc
+		numTimers int
+		ctx       = Background()
+	)
+	for i := 0; i < minLayers || numTimers == 0 || len(cancels) == 0 || len(vals) == 0; i++ {
+		switch r.Intn(3) {
+		case 0:
+			v := new(value)
+			ctx = WithValue(ctx, v, v)
+			vals = append(vals, v)
+		case 1:
+			var cancel CancelFunc
+			ctx, cancel = WithCancel(ctx)
+			cancels = append(cancels, cancel)
+		case 2:
+			var cancel CancelFunc
+			d := veryLongDuration
+			if testTimeout {
+				d = shortDuration
+			}
+			ctx, cancel = WithTimeout(ctx, d)
+			cancels = append(cancels, cancel)
+			numTimers++
+		}
+	}
+	checkValues := func(when string) {
+		for _, key := range vals {
+			if val := ctx.Value(key).(*value); key != val {
+				errorf("%s: ctx.Value(%p) = %p want %p", when, key, val, key)
+			}
+		}
+	}
+	if !testTimeout {
+		select {
+		case <-ctx.Done():
+			errorf("ctx should not be canceled yet")
+		default:
+		}
+	}
+	if s, prefix := fmt.Sprint(ctx), "context.Background."; !strings.HasPrefix(s, prefix) {
+		t.Errorf("ctx.String() = %q want prefix %q", s, prefix)
+	}
+	t.Log(ctx)
+	checkValues("before cancel")
+	if testTimeout {
+		d := quiescent(t)
+		timer := time.NewTimer(d)
+		defer timer.Stop()
+		select {
+		case <-ctx.Done():
+		case <-timer.C:
+			errorf("ctx should have timed out after %v", d)
+		}
+		checkValues("after timeout")
+	} else {
+		cancel := cancels[r.Intn(len(cancels))]
+		cancel()
+		select {
+		case <-ctx.Done():
+		default:
+			errorf("ctx should be canceled")
+		}
+		checkValues("after cancel")
+	}
+}
+
+func TestWithCancelCanceledParent(t *testing.T) {
+	parent, pcancel := WithCancelCause(Background())
+	cause := fmt.Errorf("Because!")
+	pcancel(cause)
+
+	c, _ := WithCancel(parent)
+	select {
+	case <-c.Done():
+	default:
+		t.Errorf("child not done immediately upon construction")
+	}
+	if got, want := c.Err(), Canceled; got != want {
+		t.Errorf("child not canceled; got = %v, want = %v", got, want)
+	}
+	if got, want := Cause(c), cause; got != want {
+		t.Errorf("child has wrong cause; got = %v, want = %v", got, want)
+	}
+}
+
+func TestWithCancelSimultaneouslyCanceledParent(t *testing.T) {
+	// Cancel the parent goroutine concurrently with creating a child.
+	for i := 0; i < 100; i++ {
+		parent, pcancel := WithCancelCause(Background())
+		cause := fmt.Errorf("Because!")
+		go pcancel(cause)
+
+		c, _ := WithCancel(parent)
+		<-c.Done()
+		if got, want := c.Err(), Canceled; got != want {
+			t.Errorf("child not canceled; got = %v, want = %v", got, want)
+		}
+		if got, want := Cause(c), cause; got != want {
+			t.Errorf("child has wrong cause; got = %v, want = %v", got, want)
+		}
+	}
+}
+
+func TestWithValueChecksKey(t *testing.T) {
+	panicVal := recoveredValue(func() { _ = WithValue(Background(), []byte("foo"), "bar") })
+	if panicVal == nil {
+		t.Error("expected panic")
+	}
+	panicVal = recoveredValue(func() { _ = WithValue(Background(), nil, "bar") })
+	if got, want := fmt.Sprint(panicVal), "nil key"; got != want {
+		t.Errorf("panic = %q; want %q", got, want)
+	}
+}
+
+func TestInvalidDerivedFail(t *testing.T) {
+	panicVal := recoveredValue(func() { _, _ = WithCancel(nil) })
+	if panicVal == nil {
+		t.Error("expected panic")
+	}
+	panicVal = recoveredValue(func() { _, _ = WithDeadline(nil, time.Now().Add(shortDuration)) })
+	if panicVal == nil {
+		t.Error("expected panic")
+	}
+	panicVal = recoveredValue(func() { _ = WithValue(nil, "foo", "bar") })
+	if panicVal == nil {
+		t.Error("expected panic")
+	}
+}
+
+func recoveredValue(fn func()) (v any) {
+	defer func() { v = recover() }()
+	fn()
+	return
+}
+
+func TestDeadlineExceededSupportsTimeout(t *testing.T) {
+	i, ok := DeadlineExceeded.(interface {
+		Timeout() bool
+	})
+	if !ok {
+		t.Fatal("DeadlineExceeded does not support Timeout interface")
+	}
+	if !i.Timeout() {
+		t.Fatal("wrong value for timeout")
+	}
+}
+func TestCause(t *testing.T) {
+	var (
+		forever       = 1e6 * time.Second
+		parentCause   = fmt.Errorf("parentCause")
+		childCause    = fmt.Errorf("childCause")
+		tooSlow       = fmt.Errorf("tooSlow")
+		finishedEarly = fmt.Errorf("finishedEarly")
+	)
+	for _, test := range []struct {
+		name  string
+		ctx   func() Context
+		err   error
+		cause error
+	}{
+		{
+			name:  "Background",
+			ctx:   Background,
+			err:   nil,
+			cause: nil,
+		},
+		{
+			name:  "TODO",
+			ctx:   TODO,
+			err:   nil,
+			cause: nil,
+		},
+		{
+			name: "WithCancel",
+			ctx: func() Context {
+				ctx, cancel := WithCancel(Background())
+				cancel()
+				return ctx
+			},
+			err:   Canceled,
+			cause: Canceled,
+		},
+		{
+			name: "WithCancelCause",
+			ctx: func() Context {
+				ctx, cancel := WithCancelCause(Background())
+				cancel(parentCause)
+				return ctx
+			},
+			err:   Canceled,
+			cause: parentCause,
+		},
+		{
+			name: "WithCancelCause nil",
+			ctx: func() Context {
+				ctx, cancel := WithCancelCause(Background())
+				cancel(nil)
+				return ctx
+			},
+			err:   Canceled,
+			cause: Canceled,
+		},
+		{
+			name: "WithCancelCause: parent cause before child",
+			ctx: func() Context {
+				ctx, cancelParent := WithCancelCause(Background())
+				ctx, cancelChild := WithCancelCause(ctx)
+				cancelParent(parentCause)
+				cancelChild(childCause)
+				return ctx
+			},
+			err:   Canceled,
+			cause: parentCause,
+		},
+		{
+			name: "WithCancelCause: parent cause after child",
+			ctx: func() Context {
+				ctx, cancelParent := WithCancelCause(Background())
+				ctx, cancelChild := WithCancelCause(ctx)
+				cancelChild(childCause)
+				cancelParent(parentCause)
+				return ctx
+			},
+			err:   Canceled,
+			cause: childCause,
+		},
+		{
+			name: "WithCancelCause: parent cause before nil",
+			ctx: func() Context {
+				ctx, cancelParent := WithCancelCause(Background())
+				ctx, cancelChild := WithCancel(ctx)
+				cancelParent(parentCause)
+				cancelChild()
+				return ctx
+			},
+			err:   Canceled,
+			cause: parentCause,
+		},
+		{
+			name: "WithCancelCause: parent cause after nil",
+			ctx: func() Context {
+				ctx, cancelParent := WithCancelCause(Background())
+				ctx, cancelChild := WithCancel(ctx)
+				cancelChild()
+				cancelParent(parentCause)
+				return ctx
+			},
+			err:   Canceled,
+			cause: Canceled,
+		},
+		{
+			name: "WithCancelCause: child cause after nil",
+			ctx: func() Context {
+				ctx, cancelParent := WithCancel(Background())
+				ctx, cancelChild := WithCancelCause(ctx)
+				cancelParent()
+				cancelChild(childCause)
+				return ctx
+			},
+			err:   Canceled,
+			cause: Canceled,
+		},
+		{
+			name: "WithCancelCause: child cause before nil",
+			ctx: func() Context {
+				ctx, cancelParent := WithCancel(Background())
+				ctx, cancelChild := WithCancelCause(ctx)
+				cancelChild(childCause)
+				cancelParent()
+				return ctx
+			},
+			err:   Canceled,
+			cause: childCause,
+		},
+		{
+			name: "WithTimeout",
+			ctx: func() Context {
+				ctx, cancel := WithTimeout(Background(), 0)
+				cancel()
+				return ctx
+			},
+			err:   DeadlineExceeded,
+			cause: DeadlineExceeded,
+		},
+		{
+			name: "WithTimeout canceled",
+			ctx: func() Context {
+				ctx, cancel := WithTimeout(Background(), forever)
+				cancel()
+				return ctx
+			},
+			err:   Canceled,
+			cause: Canceled,
+		},
+		{
+			name: "WithTimeoutCause",
+			ctx: func() Context {
+				ctx, cancel := WithTimeoutCause(Background(), 0, tooSlow)
+				cancel()
+				return ctx
+			},
+			err:   DeadlineExceeded,
+			cause: tooSlow,
+		},
+		{
+			name: "WithTimeoutCause canceled",
+			ctx: func() Context {
+				ctx, cancel := WithTimeoutCause(Background(), forever, tooSlow)
+				cancel()
+				return ctx
+			},
+			err:   Canceled,
+			cause: Canceled,
+		},
+		{
+			name: "WithTimeoutCause stacked",
+			ctx: func() Context {
+				ctx, cancel := WithCancelCause(Background())
+				ctx, _ = WithTimeoutCause(ctx, 0, tooSlow)
+				cancel(finishedEarly)
+				return ctx
+			},
+			err:   DeadlineExceeded,
+			cause: tooSlow,
+		},
+		{
+			name: "WithTimeoutCause stacked canceled",
+			ctx: func() Context {
+				ctx, cancel := WithCancelCause(Background())
+				ctx, _ = WithTimeoutCause(ctx, forever, tooSlow)
+				cancel(finishedEarly)
+				return ctx
+			},
+			err:   Canceled,
+			cause: finishedEarly,
+		},
+		{
+			name: "WithoutCancel",
+			ctx: func() Context {
+				return WithoutCancel(Background())
+			},
+			err:   nil,
+			cause: nil,
+		},
+		{
+			name: "WithoutCancel canceled",
+			ctx: func() Context {
+				ctx, cancel := WithCancelCause(Background())
+				ctx = WithoutCancel(ctx)
+				cancel(finishedEarly)
+				return ctx
+			},
+			err:   nil,
+			cause: nil,
+		},
+		{
+			name: "WithoutCancel timeout",
+			ctx: func() Context {
+				ctx, cancel := WithTimeoutCause(Background(), 0, tooSlow)
+				ctx = WithoutCancel(ctx)
+				cancel()
+				return ctx
+			},
+			err:   nil,
+			cause: nil,
+		},
+	} {
+		test := test
+		t.Run(test.name, func(t *testing.T) {
+			t.Parallel()
+			ctx := test.ctx()
+			if got, want := ctx.Err(), test.err; want != got {
+				t.Errorf("ctx.Err() = %v want %v", got, want)
+			}
+			if got, want := Cause(ctx), test.cause; want != got {
+				t.Errorf("Cause(ctx) = %v want %v", got, want)
+			}
+		})
+	}
+}
+
+func TestCauseRace(t *testing.T) {
+	cause := errors.New("TestCauseRace")
+	ctx, cancel := WithCancelCause(Background())
+	go func() {
+		cancel(cause)
+	}()
+	for {
+		// Poll Cause, rather than waiting for Done, to test that
+		// access to the underlying cause is synchronized properly.
+		if err := Cause(ctx); err != nil {
+			if err != cause {
+				t.Errorf("Cause returned %v, want %v", err, cause)
+			}
+			break
+		}
+		runtime.Gosched()
+	}
+}
+
+func TestWithoutCancel(t *testing.T) {
+	key, value := "key", "value"
+	ctx := WithValue(Background(), key, value)
+	ctx = WithoutCancel(ctx)
+	if d, ok := ctx.Deadline(); !d.IsZero() || ok != false {
+		t.Errorf("ctx.Deadline() = %v, %v want zero, false", d, ok)
+	}
+	if done := ctx.Done(); done != nil {
+		t.Errorf("ctx.Deadline() = %v want nil", done)
+	}
+	if err := ctx.Err(); err != nil {
+		t.Errorf("ctx.Err() = %v want nil", err)
+	}
+	if v := ctx.Value(key); v != value {
+		t.Errorf("ctx.Value(%q) = %q want %q", key, v, value)
+	}
+}
+
+type customDoneContext struct {
+	Context
+	donec chan struct{}
+}
+
+func (c *customDoneContext) Done() <-chan struct{} {
+	return c.donec
+}
+
+func TestCustomContextPropagation(t *testing.T) {
+	cause := errors.New("TestCustomContextPropagation")
+	donec := make(chan struct{})
+	ctx1, cancel1 := WithCancelCause(Background())
+	ctx2 := &customDoneContext{
+		Context: ctx1,
+		donec:   donec,
+	}
+	ctx3, cancel3 := WithCancel(ctx2)
+	defer cancel3()
+
+	cancel1(cause)
+	close(donec)
+
+	<-ctx3.Done()
+	if got, want := ctx3.Err(), Canceled; got != want {
+		t.Errorf("child not canceled; got = %v, want = %v", got, want)
+	}
+	if got, want := Cause(ctx3), cause; got != want {
+		t.Errorf("child has wrong cause; got = %v, want = %v", got, want)
+	}
+}
+
+func TestAfterFuncCalledAfterCancel(t *testing.T) {
+	ctx, cancel := WithCancel(Background())
+	donec := make(chan struct{})
+	stop := AfterFunc(ctx, func() {
+		close(donec)
+	})
+	select {
+	case <-donec:
+		t.Fatalf("AfterFunc called before context is done")
+	case <-time.After(shortDuration):
+	}
+	cancel()
+	select {
+	case <-donec:
+	case <-time.After(veryLongDuration):
+		t.Fatalf("AfterFunc not called after context is canceled")
+	}
+	if stop() {
+		t.Fatalf("stop() = true, want false")
+	}
+}
+
+func TestAfterFuncCalledAfterTimeout(t *testing.T) {
+	ctx, cancel := WithTimeout(Background(), shortDuration)
+	defer cancel()
+	donec := make(chan struct{})
+	AfterFunc(ctx, func() {
+		close(donec)
+	})
+	select {
+	case <-donec:
+	case <-time.After(veryLongDuration):
+		t.Fatalf("AfterFunc not called after context is canceled")
+	}
+}
+
+func TestAfterFuncCalledImmediately(t *testing.T) {
+	ctx, cancel := WithCancel(Background())
+	cancel()
+	donec := make(chan struct{})
+	AfterFunc(ctx, func() {
+		close(donec)
+	})
+	select {
+	case <-donec:
+	case <-time.After(veryLongDuration):
+		t.Fatalf("AfterFunc not called for already-canceled context")
+	}
+}
+
+func TestAfterFuncNotCalledAfterStop(t *testing.T) {
+	ctx, cancel := WithCancel(Background())
+	donec := make(chan struct{})
+	stop := AfterFunc(ctx, func() {
+		close(donec)
+	})
+	if !stop() {
+		t.Fatalf("stop() = false, want true")
+	}
+	cancel()
+	select {
+	case <-donec:
+		t.Fatalf("AfterFunc called for already-canceled context")
+	case <-time.After(shortDuration):
+	}
+	if stop() {
+		t.Fatalf("stop() = true, want false")
+	}
+}
+
+// This test verifies that cancelling a context does not block waiting for AfterFuncs to finish.
+func TestAfterFuncCalledAsynchronously(t *testing.T) {
+	ctx, cancel := WithCancel(Background())
+	donec := make(chan struct{})
+	stop := AfterFunc(ctx, func() {
+		// The channel send blocks until donec is read from.
+		donec <- struct{}{}
+	})
+	defer stop()
+	cancel()
+	// After cancel returns, read from donec and unblock the AfterFunc.
+	select {
+	case <-donec:
+	case <-time.After(veryLongDuration):
+		t.Fatalf("AfterFunc not called after context is canceled")
+	}
+}
diff --git a/src/crypto/aes/asm_arm64.s b/src/crypto/aes/asm_arm64.s
index 13aee5c..4a02e94 100644
--- a/src/crypto/aes/asm_arm64.s
+++ b/src/crypto/aes/asm_arm64.s
@@ -149,7 +149,7 @@
 	BNE	ks128Loop
 	CBZ	R11, ksDone       // If dec is nil we are done
 	SUB	$176, R10
-        // Decryption keys are encryption keys with InverseMixColumns applied
+	// Decryption keys are encryption keys with InverseMixColumns applied
 	VLD1.P	64(R10), [V0.B16, V1.B16, V2.B16, V3.B16]
 	VMOV	V0.B16, V7.B16
 	AESIMC	V1.B16, V6.B16
diff --git a/src/crypto/aes/asm_ppc64x.s b/src/crypto/aes/asm_ppc64x.s
index 8ac97ec..288f725 100644
--- a/src/crypto/aes/asm_ppc64x.s
+++ b/src/crypto/aes/asm_ppc64x.s
@@ -644,7 +644,7 @@
 
 	BEQ	Lcbc_dec
 
-	PCALIGN $32
+	PCALIGN $16
 Lcbc_enc:
 	P8_LXVB16X(INP, R0, INOUT)
 	ADD	$16, INP
@@ -659,7 +659,7 @@
 	CLEAR_KEYS()
 	RET
 
-	PCALIGN $32
+	PCALIGN $16
 Lcbc_dec:
 	P8_LXVB16X(INP, R0, TMP)
 	ADD	$16, INP
diff --git a/src/crypto/aes/gcm_arm64.s b/src/crypto/aes/gcm_arm64.s
index 61c868c..c350102 100644
--- a/src/crypto/aes/gcm_arm64.s
+++ b/src/crypto/aes/gcm_arm64.s
@@ -164,7 +164,7 @@
 	AESE	T0.B16, B0.B16
 	AESMC	B0.B16, B0.B16
 	AESE	T1.B16, B0.B16
- 	VEOR	T2.B16, B0.B16, B0.B16
+	VEOR	T2.B16, B0.B16, B0.B16
 
 	VREV64	B0.B16, B0.B16
 
diff --git a/src/crypto/ecdh/ecdh.go b/src/crypto/ecdh/ecdh.go
index 7442055..b86f521 100644
--- a/src/crypto/ecdh/ecdh.go
+++ b/src/crypto/ecdh/ecdh.go
@@ -16,7 +16,11 @@
 )
 
 type Curve interface {
-	// GenerateKey generates a new PrivateKey from rand.
+	// GenerateKey generates a random PrivateKey.
+	//
+	// Most applications should use [crypto/rand.Reader] as rand. Note that the
+	// returned key does not depend deterministically on the bytes read from rand,
+	// and may change between calls and/or between versions.
 	GenerateKey(rand io.Reader) (*PrivateKey, error)
 
 	// NewPrivateKey checks that key is valid and returns a PrivateKey.
diff --git a/src/crypto/ecdsa/ecdsa.go b/src/crypto/ecdsa/ecdsa.go
index 68272af..e150377 100644
--- a/src/crypto/ecdsa/ecdsa.go
+++ b/src/crypto/ecdsa/ecdsa.go
@@ -150,7 +150,11 @@
 	return SignASN1(rand, priv, digest)
 }
 
-// GenerateKey generates a public and private key pair.
+// GenerateKey generates a new ECDSA private key for the specified curve.
+//
+// Most applications should use [crypto/rand.Reader] as rand. Note that the
+// returned key does not depend deterministically on the bytes read from rand,
+// and may change between calls and/or between versions.
 func GenerateKey(c elliptic.Curve, rand io.Reader) (*PrivateKey, error) {
 	randutil.MaybeReadByte(rand)
 
@@ -245,6 +249,10 @@
 // using the private key, priv. If the hash is longer than the bit-length of the
 // private key's curve order, the hash will be truncated to that length. It
 // returns the ASN.1 encoded signature.
+//
+// The signature is randomized. Most applications should use [crypto/rand.Reader]
+// as rand. Note that the returned signature does not depend deterministically on
+// the bytes read from rand, and may change between calls and/or between versions.
 func SignASN1(rand io.Reader, priv *PrivateKey, hash []byte) ([]byte, error) {
 	randutil.MaybeReadByte(rand)
 
@@ -380,7 +388,7 @@
 	// an integer modulo N. This is the absolute worst of all worlds: we still
 	// have to reduce, because the result might still overflow N, but to take
 	// the left-most bits for P-521 we have to do a right shift.
-	if size := c.N.Size(); len(hash) > size {
+	if size := c.N.Size(); len(hash) >= size {
 		hash = hash[:size]
 		if excess := len(hash)*8 - c.N.BitLen(); excess > 0 {
 			hash = bytes.Clone(hash)
@@ -655,6 +663,10 @@
 func precomputeParams[Point nistPoint[Point]](c *nistCurve[Point], curve elliptic.Curve) {
 	params := curve.Params()
 	c.curve = curve
-	c.N = bigmod.NewModulusFromBig(params.N)
+	var err error
+	c.N, err = bigmod.NewModulusFromBig(params.N)
+	if err != nil {
+		panic(err)
+	}
 	c.nMinus2 = new(big.Int).Sub(params.N, big.NewInt(2)).Bytes()
 }
diff --git a/src/crypto/ecdsa/ecdsa_test.go b/src/crypto/ecdsa/ecdsa_test.go
index 95c78c8..08a0903 100644
--- a/src/crypto/ecdsa/ecdsa_test.go
+++ b/src/crypto/ecdsa/ecdsa_test.go
@@ -9,6 +9,7 @@
 	"bytes"
 	"compress/bzip2"
 	"crypto/elliptic"
+	"crypto/internal/bigmod"
 	"crypto/rand"
 	"crypto/sha1"
 	"crypto/sha256"
@@ -398,6 +399,20 @@
 	}
 }
 
+func TestHashToNat(t *testing.T) {
+	t.Run("P-224", func(t *testing.T) { testHashToNat(t, p224()) })
+	t.Run("P-256", func(t *testing.T) { testHashToNat(t, p256()) })
+	t.Run("P-384", func(t *testing.T) { testHashToNat(t, p384()) })
+	t.Run("P-521", func(t *testing.T) { testHashToNat(t, p521()) })
+}
+
+func testHashToNat[Point nistPoint[Point]](t *testing.T, c *nistCurve[Point]) {
+	for l := 0; l < 600; l++ {
+		h := bytes.Repeat([]byte{0xff}, l)
+		hashToNat(c, bigmod.NewNat(), h)
+	}
+}
+
 func TestZeroSignature(t *testing.T) {
 	testAllCurves(t, testZeroSignature)
 }
diff --git a/src/crypto/ed25519/ed25519.go b/src/crypto/ed25519/ed25519.go
index a45d056..1dda9e5 100644
--- a/src/crypto/ed25519/ed25519.go
+++ b/src/crypto/ed25519/ed25519.go
@@ -18,6 +18,7 @@
 	"crypto/internal/edwards25519"
 	cryptorand "crypto/rand"
 	"crypto/sha512"
+	"crypto/subtle"
 	"errors"
 	"io"
 	"strconv"
@@ -46,7 +47,7 @@
 	if !ok {
 		return false
 	}
-	return bytes.Equal(pub, xx)
+	return subtle.ConstantTimeCompare(pub, xx) == 1
 }
 
 // PrivateKey is the type of Ed25519 private keys. It implements [crypto.Signer].
@@ -65,7 +66,7 @@
 	if !ok {
 		return false
 	}
-	return bytes.Equal(priv, xx)
+	return subtle.ConstantTimeCompare(priv, xx) == 1
 }
 
 // Seed returns the private key seed corresponding to priv. It is provided for
@@ -75,7 +76,7 @@
 	return bytes.Clone(priv[:SeedSize])
 }
 
-// Sign signs the given message with priv. rand is ignored.
+// Sign signs the given message with priv. rand is ignored and can be nil.
 //
 // If opts.HashFunc() is [crypto.SHA512], the pre-hashed variant Ed25519ph is used
 // and message is expected to be a SHA-512 hash, otherwise opts.HashFunc() must
@@ -90,18 +91,21 @@
 	if opts, ok := opts.(*Options); ok {
 		context = opts.Context
 	}
-	if l := len(context); l > 255 {
-		return nil, errors.New("ed25519: bad Ed25519ph context length: " + strconv.Itoa(l))
-	}
 	switch {
 	case hash == crypto.SHA512: // Ed25519ph
 		if l := len(message); l != sha512.Size {
 			return nil, errors.New("ed25519: bad Ed25519ph message hash length: " + strconv.Itoa(l))
 		}
+		if l := len(context); l > 255 {
+			return nil, errors.New("ed25519: bad Ed25519ph context length: " + strconv.Itoa(l))
+		}
 		signature := make([]byte, SignatureSize)
 		sign(signature, priv, message, domPrefixPh, context)
 		return signature, nil
 	case hash == crypto.Hash(0) && context != "": // Ed25519ctx
+		if l := len(context); l > 255 {
+			return nil, errors.New("ed25519: bad Ed25519ctx context length: " + strconv.Itoa(l))
+		}
 		signature := make([]byte, SignatureSize)
 		sign(signature, priv, message, domPrefixCtx, context)
 		return signature, nil
@@ -128,6 +132,9 @@
 
 // GenerateKey generates a public/private key pair using entropy from rand.
 // If rand is nil, [crypto/rand.Reader] will be used.
+//
+// The output of this function is deterministic, and equivalent to reading
+// [SeedSize] bytes from rand, and passing them to [NewKeyFromSeed].
 func GenerateKey(rand io.Reader) (PublicKey, PrivateKey, error) {
 	if rand == nil {
 		rand = cryptorand.Reader
diff --git a/src/crypto/elliptic/elliptic.go b/src/crypto/elliptic/elliptic.go
index 6b07f5b..96555ad 100644
--- a/src/crypto/elliptic/elliptic.go
+++ b/src/crypto/elliptic/elliptic.go
@@ -5,8 +5,10 @@
 // Package elliptic implements the standard NIST P-224, P-256, P-384, and P-521
 // elliptic curves over prime fields.
 //
-// The P224(), P256(), P384() and P521() values are necessary to use the crypto/ecdsa package.
-// Most other uses should migrate to the more efficient and safer crypto/ecdh package.
+// Direct use of this package is deprecated, beyond the [P224], [P256], [P384],
+// and [P521] values necessary to use [crypto/ecdsa]. Most other uses
+// should migrate to the more efficient and safer [crypto/ecdh], or to
+// third-party modules for lower-level functionality.
 package elliptic
 
 import (
@@ -23,30 +25,33 @@
 // Note that the conventional point at infinity (0, 0) is not considered on the
 // curve, although it can be returned by Add, Double, ScalarMult, or
 // ScalarBaseMult (but not the Unmarshal or UnmarshalCompressed functions).
+//
+// Using Curve implementations besides those returned by P224(), P256(), P384(),
+// and P521() is deprecated.
 type Curve interface {
 	// Params returns the parameters for the curve.
 	Params() *CurveParams
 
 	// IsOnCurve reports whether the given (x,y) lies on the curve.
 	//
-	// Note: this is a low-level unsafe API. For ECDH, use the crypto/ecdh
+	// Deprecated: this is a low-level unsafe API. For ECDH, use the crypto/ecdh
 	// package. The NewPublicKey methods of NIST curves in crypto/ecdh accept
 	// the same encoding as the Unmarshal function, and perform on-curve checks.
 	IsOnCurve(x, y *big.Int) bool
 
 	// Add returns the sum of (x1,y1) and (x2,y2).
 	//
-	// Note: this is a low-level unsafe API.
+	// Deprecated: this is a low-level unsafe API.
 	Add(x1, y1, x2, y2 *big.Int) (x, y *big.Int)
 
 	// Double returns 2*(x,y).
 	//
-	// Note: this is a low-level unsafe API.
+	// Deprecated: this is a low-level unsafe API.
 	Double(x1, y1 *big.Int) (x, y *big.Int)
 
 	// ScalarMult returns k*(x,y) where k is an integer in big-endian form.
 	//
-	// Note: this is a low-level unsafe API. For ECDH, use the crypto/ecdh
+	// Deprecated: this is a low-level unsafe API. For ECDH, use the crypto/ecdh
 	// package. Most uses of ScalarMult can be replaced by a call to the ECDH
 	// methods of NIST curves in crypto/ecdh.
 	ScalarMult(x1, y1 *big.Int, k []byte) (x, y *big.Int)
@@ -54,7 +59,7 @@
 	// ScalarBaseMult returns k*G, where G is the base point of the group
 	// and k is an integer in big-endian form.
 	//
-	// Note: this is a low-level unsafe API. For ECDH, use the crypto/ecdh
+	// Deprecated: this is a low-level unsafe API. For ECDH, use the crypto/ecdh
 	// package. Most uses of ScalarBaseMult can be replaced by a call to the
 	// PrivateKey.PublicKey method in crypto/ecdh.
 	ScalarBaseMult(k []byte) (x, y *big.Int)
@@ -65,7 +70,7 @@
 // GenerateKey returns a public/private key pair. The private key is
 // generated using the given reader, which must return random data.
 //
-// Note: for ECDH, use the GenerateKey methods of the crypto/ecdh package;
+// Deprecated: for ECDH, use the GenerateKey methods of the crypto/ecdh package;
 // for ECDSA, use the GenerateKey function of the crypto/ecdsa package.
 func GenerateKey(curve Curve, rand io.Reader) (priv []byte, x, y *big.Int, err error) {
 	N := curve.Params().N
@@ -99,7 +104,7 @@
 // SEC 1, Version 2.0, Section 2.3.3. If the point is not on the curve (or is
 // the conventional point at infinity), the behavior is undefined.
 //
-// Note: for ECDH, use the crypto/ecdh package. This function returns an
+// Deprecated: for ECDH, use the crypto/ecdh package. This function returns an
 // encoding equivalent to that of PublicKey.Bytes in crypto/ecdh.
 func Marshal(curve Curve, x, y *big.Int) []byte {
 	panicIfNotOnCurve(curve, x, y)
@@ -143,7 +148,7 @@
 // an error if the point is not in uncompressed form, is not on the curve, or is
 // the point at infinity. On error, x = nil.
 //
-// Note: for ECDH, use the crypto/ecdh package. This function accepts an
+// Deprecated: for ECDH, use the crypto/ecdh package. This function accepts an
 // encoding equivalent to that of the NewPublicKey methods in crypto/ecdh.
 func Unmarshal(curve Curve, data []byte) (x, y *big.Int) {
 	if c, ok := curve.(unmarshaler); ok {
diff --git a/src/crypto/elliptic/elliptic_test.go b/src/crypto/elliptic/elliptic_test.go
index 34d70f6..aedbefc 100644
--- a/src/crypto/elliptic/elliptic_test.go
+++ b/src/crypto/elliptic/elliptic_test.go
@@ -48,6 +48,7 @@
 }
 
 func TestOnCurve(t *testing.T) {
+	t.Parallel()
 	testAllCurves(t, func(t *testing.T, curve Curve) {
 		if !curve.IsOnCurve(curve.Params().Gx, curve.Params().Gy) {
 			t.Error("basepoint is not on the curve")
@@ -56,6 +57,7 @@
 }
 
 func TestOffCurve(t *testing.T) {
+	t.Parallel()
 	testAllCurves(t, func(t *testing.T, curve Curve) {
 		x, y := new(big.Int).SetInt64(1), new(big.Int).SetInt64(1)
 		if curve.IsOnCurve(x, y) {
@@ -76,6 +78,7 @@
 }
 
 func TestInfinity(t *testing.T) {
+	t.Parallel()
 	testAllCurves(t, testInfinity)
 }
 
@@ -150,6 +153,7 @@
 }
 
 func TestMarshal(t *testing.T) {
+	t.Parallel()
 	testAllCurves(t, func(t *testing.T, curve Curve) {
 		_, x, y, err := GenerateKey(curve, rand.Reader)
 		if err != nil {
@@ -167,6 +171,7 @@
 }
 
 func TestUnmarshalToLargeCoordinates(t *testing.T) {
+	t.Parallel()
 	// See https://golang.org/issues/20482.
 	testAllCurves(t, testUnmarshalToLargeCoordinates)
 }
@@ -216,6 +221,7 @@
 // (negative or bigger than P). They are expected to return false from
 // IsOnCurve, all other behavior is undefined.
 func TestInvalidCoordinates(t *testing.T) {
+	t.Parallel()
 	testAllCurves(t, testInvalidCoordinates)
 }
 
@@ -268,6 +274,7 @@
 }
 
 func TestMarshalCompressed(t *testing.T) {
+	t.Parallel()
 	t.Run("P-256/03", func(t *testing.T) {
 		data, _ := hex.DecodeString("031e3987d9f9ea9d7dd7155a56a86b2009e1e0ab332f962d10d8beb6406ab1ad79")
 		x, _ := new(big.Int).SetString("13671033352574878777044637384712060483119675368076128232297328793087057702265", 10)
@@ -326,6 +333,7 @@
 }
 
 func TestLargeIsOnCurve(t *testing.T) {
+	t.Parallel()
 	testAllCurves(t, func(t *testing.T, curve Curve) {
 		large := big.NewInt(1)
 		large.Lsh(large, 1000)
diff --git a/src/crypto/elliptic/params.go b/src/crypto/elliptic/params.go
index c4e9784..1ae57fa 100644
--- a/src/crypto/elliptic/params.go
+++ b/src/crypto/elliptic/params.go
@@ -9,8 +9,9 @@
 // CurveParams contains the parameters of an elliptic curve and also provides
 // a generic, non-constant time implementation of Curve.
 //
-// Note: Custom curves (those not returned by P224(), P256(), P384(), and P521())
-// are not guaranteed to provide any security property.
+// The generic Curve implementation is deprecated, and using custom curves
+// (those not returned by P224(), P256(), P384(), and P521()) is not guaranteed
+// to provide any security property.
 type CurveParams struct {
 	P       *big.Int // the order of the underlying field
 	N       *big.Int // the order of the base point
@@ -48,7 +49,7 @@
 
 // IsOnCurve implements Curve.IsOnCurve.
 //
-// Note: the CurveParams methods are not guaranteed to
+// Deprecated: the CurveParams methods are deprecated and are not guaranteed to
 // provide any security property. For ECDH, use the crypto/ecdh package.
 // For ECDSA, use the crypto/ecdsa package with a Curve value returned directly
 // from P224(), P256(), P384(), or P521().
@@ -102,7 +103,7 @@
 
 // Add implements Curve.Add.
 //
-// Note: the CurveParams methods are not guaranteed to
+// Deprecated: the CurveParams methods are deprecated and are not guaranteed to
 // provide any security property. For ECDH, use the crypto/ecdh package.
 // For ECDSA, use the crypto/ecdsa package with a Curve value returned directly
 // from P224(), P256(), P384(), or P521().
@@ -200,7 +201,7 @@
 
 // Double implements Curve.Double.
 //
-// Note: the CurveParams methods are not guaranteed to
+// Deprecated: the CurveParams methods are deprecated and are not guaranteed to
 // provide any security property. For ECDH, use the crypto/ecdh package.
 // For ECDSA, use the crypto/ecdsa package with a Curve value returned directly
 // from P224(), P256(), P384(), or P521().
@@ -279,7 +280,7 @@
 
 // ScalarMult implements Curve.ScalarMult.
 //
-// Note: the CurveParams methods are not guaranteed to
+// Deprecated: the CurveParams methods are deprecated and are not guaranteed to
 // provide any security property. For ECDH, use the crypto/ecdh package.
 // For ECDSA, use the crypto/ecdsa package with a Curve value returned directly
 // from P224(), P256(), P384(), or P521().
@@ -309,7 +310,7 @@
 
 // ScalarBaseMult implements Curve.ScalarBaseMult.
 //
-// Note: the CurveParams methods are not guaranteed to
+// Deprecated: the CurveParams methods are deprecated and are not guaranteed to
 // provide any security property. For ECDH, use the crypto/ecdh package.
 // For ECDSA, use the crypto/ecdsa package with a Curve value returned directly
 // from P224(), P256(), P384(), or P521().
diff --git a/src/crypto/hmac/hmac.go b/src/crypto/hmac/hmac.go
index ed3ebc0..35b9d5a 100644
--- a/src/crypto/hmac/hmac.go
+++ b/src/crypto/hmac/hmac.go
@@ -35,7 +35,7 @@
 // opad = 0x5c byte repeated for key length
 // hmac = H([key ^ opad] H([key ^ ipad] text))
 
-// Marshalable is the combination of encoding.BinaryMarshaler and
+// marshalable is the combination of encoding.BinaryMarshaler and
 // encoding.BinaryUnmarshaler. Their method definitions are repeated here to
 // avoid a dependency on the encoding package.
 type marshalable interface {
diff --git a/src/crypto/internal/alias/alias.go b/src/crypto/internal/alias/alias.go
index 936cc25..daf3ebc 100644
--- a/src/crypto/internal/alias/alias.go
+++ b/src/crypto/internal/alias/alias.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// Package alias implements memory alaising tests.
+// Package alias implements memory aliasing tests.
 // This code also exists as golang.org/x/crypto/internal/alias.
 package alias
 
diff --git a/src/crypto/internal/bigmod/_asm/go.mod b/src/crypto/internal/bigmod/_asm/go.mod
index 1ce2b5e..7600a4a 100644
--- a/src/crypto/internal/bigmod/_asm/go.mod
+++ b/src/crypto/internal/bigmod/_asm/go.mod
@@ -1,4 +1,4 @@
-module asm
+module std/crypto/internal/bigmod/_asm
 
 go 1.19
 
diff --git a/src/crypto/internal/bigmod/_asm/nat_amd64_asm.go b/src/crypto/internal/bigmod/_asm/nat_amd64_asm.go
index 5690f04..bf64565 100644
--- a/src/crypto/internal/bigmod/_asm/nat_amd64_asm.go
+++ b/src/crypto/internal/bigmod/_asm/nat_amd64_asm.go
@@ -1,131 +1,113 @@
-// Copyright 2022 The Go Authors. All rights reserved.
+// Copyright 2023 The Go Authors. 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 (
+	"strconv"
+
 	. "github.com/mmcloughlin/avo/build"
 	. "github.com/mmcloughlin/avo/operand"
 	. "github.com/mmcloughlin/avo/reg"
 )
 
-//go:generate go run . -out ../nat_amd64.s -stubs ../nat_amd64.go -pkg bigmod
+//go:generate go run . -out ../nat_amd64.s -pkg bigmod
 
 func main() {
 	Package("crypto/internal/bigmod")
-	ConstraintExpr("amd64,gc,!purego")
+	ConstraintExpr("!purego")
 
-	Implement("montgomeryLoop")
-	Pragma("noescape")
+	addMulVVW(1024)
+	addMulVVW(1536)
+	addMulVVW(2048)
 
-	size := Load(Param("d").Len(), GP64())
-	d := Mem{Base: Load(Param("d").Base(), GP64())}
-	b := Mem{Base: Load(Param("b").Base(), GP64())}
-	m := Mem{Base: Load(Param("m").Base(), GP64())}
-	m0inv := Load(Param("m0inv"), GP64())
-
-	overflow := zero()
-	i := zero()
-	Label("outerLoop")
-
-	ai := Load(Param("a").Base(), GP64())
-	MOVQ(Mem{Base: ai}.Idx(i, 8), ai)
-
-	z := uint128{GP64(), GP64()}
-	mul64(z, b, ai)
-	add64(z, d)
-	f := GP64()
-	MOVQ(m0inv, f)
-	IMULQ(z.lo, f)
-	_MASK(f)
-	addMul64(z, m, f)
-	carry := shiftBy63(z)
-
-	j := zero()
-	INCQ(j)
-	JMP(LabelRef("innerLoopCondition"))
-	Label("innerLoop")
-
-	// z = d[j] + a[i] * b[j] + f * m[j] + carry
-	z = uint128{GP64(), GP64()}
-	mul64(z, b.Idx(j, 8), ai)
-	addMul64(z, m.Idx(j, 8), f)
-	add64(z, d.Idx(j, 8))
-	add64(z, carry)
-	// d[j-1] = z_lo & _MASK
-	storeMasked(z.lo, d.Idx(j, 8).Offset(-8))
-	// carry = z_hi<<1 | z_lo>>_W
-	MOVQ(shiftBy63(z), carry)
-
-	INCQ(j)
-	Label("innerLoopCondition")
-	CMPQ(size, j)
-	JGT(LabelRef("innerLoop"))
-
-	ADDQ(carry, overflow)
-	storeMasked(overflow, d.Idx(size, 8).Offset(-8))
-	SHRQ(Imm(63), overflow)
-
-	INCQ(i)
-	CMPQ(size, i)
-	JGT(LabelRef("outerLoop"))
-
-	Store(overflow, ReturnIndex(0))
-	RET()
 	Generate()
 }
 
-// zero zeroes a new register and returns it.
-func zero() Register {
-	r := GP64()
-	XORQ(r, r)
-	return r
-}
+func addMulVVW(bits int) {
+	if bits%64 != 0 {
+		panic("bit size unsupported")
+	}
 
-// _MASK masks out the top bit of r.
-func _MASK(r Register) {
-	BTRQ(Imm(63), r)
-}
+	Implement("addMulVVW" + strconv.Itoa(bits))
 
-type uint128 struct {
-	hi, lo GPVirtual
-}
+	CMPB(Mem{Symbol: Symbol{Name: "·supportADX"}, Base: StaticBase}, Imm(1))
+	JEQ(LabelRef("adx"))
 
-// storeMasked stores _MASK(src) in dst. It doesn't modify src.
-func storeMasked(src, dst Op) {
-	out := GP64()
-	MOVQ(src, out)
-	_MASK(out)
-	MOVQ(out, dst)
-}
+	z := Mem{Base: Load(Param("z"), GP64())}
+	x := Mem{Base: Load(Param("x"), GP64())}
+	y := Load(Param("y"), GP64())
 
-// shiftBy63 returns z >> 63. It reuses z.lo.
-func shiftBy63(z uint128) Register {
-	SHRQ(Imm(63), z.hi, z.lo)
-	result := z.lo
-	z.hi, z.lo = nil, nil
-	return result
-}
+	carry := GP64()
+	XORQ(carry, carry) // zero out carry
 
-// add64 sets r to r + a.
-func add64(r uint128, a Op) {
-	ADDQ(a, r.lo)
-	ADCQ(Imm(0), r.hi)
-}
+	for i := 0; i < bits/64; i++ {
+		Comment("Iteration " + strconv.Itoa(i))
+		hi, lo := RDX, RAX // implicit MULQ inputs and outputs
+		MOVQ(x.Offset(i*8), lo)
+		MULQ(y)
+		ADDQ(z.Offset(i*8), lo)
+		ADCQ(Imm(0), hi)
+		ADDQ(carry, lo)
+		ADCQ(Imm(0), hi)
+		MOVQ(hi, carry)
+		MOVQ(lo, z.Offset(i*8))
+	}
 
-// mul64 sets r to a * b.
-func mul64(r uint128, a, b Op) {
-	MOVQ(a, RAX)
-	MULQ(b) // RDX, RAX = RAX * b
-	MOVQ(RAX, r.lo)
-	MOVQ(RDX, r.hi)
-}
+	Store(carry, ReturnIndex(0))
+	RET()
 
-// addMul64 sets r to r + a * b.
-func addMul64(r uint128, a, b Op) {
-	MOVQ(a, RAX)
-	MULQ(b) // RDX, RAX = RAX * b
-	ADDQ(RAX, r.lo)
-	ADCQ(RDX, r.hi)
+	Label("adx")
+
+	// The ADX strategy implements the following function, where c1 and c2 are
+	// the overflow and the carry flag respectively.
+	//
+	//    func addMulVVW(z, x []uint, y uint) (carry uint) {
+	//        var c1, c2 uint
+	//        for i := range z {
+	//            hi, lo := bits.Mul(x[i], y)
+	//            lo, c1 = bits.Add(lo, z[i], c1)
+	//            z[i], c2 = bits.Add(lo, carry, c2)
+	//            carry = hi
+	//        }
+	//        return carry + c1 + c2
+	//    }
+	//
+	// The loop is fully unrolled and the hi / carry registers are alternated
+	// instead of introducing a MOV.
+
+	z = Mem{Base: Load(Param("z"), GP64())}
+	x = Mem{Base: Load(Param("x"), GP64())}
+	Load(Param("y"), RDX) // implicit source of MULXQ
+
+	carry = GP64()
+	XORQ(carry, carry) // zero out carry
+	z0 := GP64()
+	XORQ(z0, z0) // unset flags and zero out z0
+
+	for i := 0; i < bits/64; i++ {
+		hi, lo := GP64(), GP64()
+
+		Comment("Iteration " + strconv.Itoa(i))
+		MULXQ(x.Offset(i*8), lo, hi)
+		ADCXQ(carry, lo)
+		ADOXQ(z.Offset(i*8), lo)
+		MOVQ(lo, z.Offset(i*8))
+
+		i++
+
+		Comment("Iteration " + strconv.Itoa(i))
+		MULXQ(x.Offset(i*8), lo, carry)
+		ADCXQ(hi, lo)
+		ADOXQ(z.Offset(i*8), lo)
+		MOVQ(lo, z.Offset(i*8))
+	}
+
+	Comment("Add back carry flags and return")
+	ADCXQ(z0, carry)
+	ADOXQ(z0, carry)
+
+	Store(carry, ReturnIndex(0))
+	RET()
 }
diff --git a/src/crypto/internal/bigmod/nat.go b/src/crypto/internal/bigmod/nat.go
index 804316f..5605e9f 100644
--- a/src/crypto/internal/bigmod/nat.go
+++ b/src/crypto/internal/bigmod/nat.go
@@ -5,16 +5,17 @@
 package bigmod
 
 import (
+	"encoding/binary"
 	"errors"
 	"math/big"
 	"math/bits"
 )
 
 const (
-	// _W is the number of bits we use for our limbs.
-	_W = bits.UintSize - 1
-	// _MASK selects _W bits from a full machine word.
-	_MASK = (1 << _W) - 1
+	// _W is the size in bits of our limbs.
+	_W = bits.UintSize
+	// _S is the size in bytes of our limbs.
+	_S = _W / 8
 )
 
 // choice represents a constant-time boolean. The value of choice is always
@@ -27,15 +28,8 @@
 const yes = choice(1)
 const no = choice(0)
 
-// ctSelect returns x if on == 1, and y if on == 0. The execution time of this
-// function does not depend on its inputs. If on is any value besides 1 or 0,
-// the result is undefined.
-func ctSelect(on choice, x, y uint) uint {
-	// When on == 1, mask is 0b111..., otherwise mask is 0b000...
-	mask := -uint(on)
-	// When mask is all zeros, we just have y, otherwise, y cancels with itself.
-	return y ^ (mask & (y ^ x))
-}
+// ctMask is all 1s if on is yes, and all 0s otherwise.
+func ctMask(on choice) uint { return -uint(on) }
 
 // ctEq returns 1 if x == y, and 0 otherwise. The execution time of this
 // function does not depend on its inputs.
@@ -60,13 +54,7 @@
 // Operations on this number are allowed to leak this length, but will not leak
 // any information about the values contained in those limbs.
 type Nat struct {
-	// limbs is a little-endian representation in base 2^W with
-	// W = bits.UintSize - 1. The top bit is always unset between operations.
-	//
-	// The top bit is left unset to optimize Montgomery multiplication, in the
-	// inner loop of exponentiation. Using fully saturated limbs would leave us
-	// working with 129-bit numbers on 64-bit platforms, wasting a lot of space,
-	// and thus time.
+	// limbs is little-endian in base 2^W with W = bits.UintSize.
 	limbs []uint
 }
 
@@ -128,25 +116,10 @@
 // The announced length of x is set based on the actual bit size of the input,
 // ignoring leading zeroes.
 func (x *Nat) setBig(n *big.Int) *Nat {
-	requiredLimbs := (n.BitLen() + _W - 1) / _W
-	x.reset(requiredLimbs)
-
-	outI := 0
-	shift := 0
 	limbs := n.Bits()
+	x.reset(len(limbs))
 	for i := range limbs {
-		xi := uint(limbs[i])
-		x.limbs[outI] |= (xi << shift) & _MASK
-		outI++
-		if outI == requiredLimbs {
-			return x
-		}
-		x.limbs[outI] = xi >> (_W - shift)
-		shift++ // this assumes bits.UintSize - _W = 1
-		if shift == _W {
-			shift = 0
-			outI++
-		}
+		x.limbs[i] = uint(limbs[i])
 	}
 	return x
 }
@@ -156,24 +129,20 @@
 //
 // x must have the same size as m and it must be reduced modulo m.
 func (x *Nat) Bytes(m *Modulus) []byte {
-	bytes := make([]byte, m.Size())
-	shift := 0
-	outI := len(bytes) - 1
+	i := m.Size()
+	bytes := make([]byte, i)
 	for _, limb := range x.limbs {
-		remainingBits := _W
-		for remainingBits >= 8 {
-			bytes[outI] |= byte(limb) << shift
-			consumed := 8 - shift
-			limb >>= consumed
-			remainingBits -= consumed
-			shift = 0
-			outI--
-			if outI < 0 {
-				return bytes
+		for j := 0; j < _S; j++ {
+			i--
+			if i < 0 {
+				if limb == 0 {
+					break
+				}
+				panic("bigmod: modulus is smaller than nat")
 			}
+			bytes[i] = byte(limb)
+			limb >>= 8
 		}
-		bytes[outI] = byte(limb)
-		shift = remainingBits
 	}
 	return bytes
 }
@@ -192,9 +161,9 @@
 	return x, nil
 }
 
-// SetOverflowingBytes assigns x = b, where b is a slice of big-endian bytes. SetOverflowingBytes
-// returns an error if b has a longer bit length than m, but reduces overflowing
-// values up to 2^⌈log2(m)⌉ - 1.
+// SetOverflowingBytes assigns x = b, where b is a slice of big-endian bytes.
+// SetOverflowingBytes returns an error if b has a longer bit length than m, but
+// reduces overflowing values up to 2^⌈log2(m)⌉ - 1.
 //
 // The output will be resized to the size of m and overwritten.
 func (x *Nat) SetOverflowingBytes(b []byte, m *Modulus) (*Nat, error) {
@@ -203,33 +172,35 @@
 	}
 	leading := _W - bitLen(x.limbs[len(x.limbs)-1])
 	if leading < m.leading {
-		return nil, errors.New("input overflows the modulus")
+		return nil, errors.New("input overflows the modulus size")
 	}
-	x.sub(x.cmpGeq(m.nat), m.nat)
+	x.maybeSubtractModulus(no, m)
 	return x, nil
 }
 
+// bigEndianUint returns the contents of buf interpreted as a
+// big-endian encoded uint value.
+func bigEndianUint(buf []byte) uint {
+	if _W == 64 {
+		return uint(binary.BigEndian.Uint64(buf))
+	}
+	return uint(binary.BigEndian.Uint32(buf))
+}
+
 func (x *Nat) setBytes(b []byte, m *Modulus) error {
-	outI := 0
-	shift := 0
 	x.resetFor(m)
-	for i := len(b) - 1; i >= 0; i-- {
-		bi := b[i]
-		x.limbs[outI] |= uint(bi) << shift
-		shift += 8
-		if shift >= _W {
-			shift -= _W
-			x.limbs[outI] &= _MASK
-			overflow := bi >> (8 - shift)
-			outI++
-			if outI >= len(x.limbs) {
-				if overflow > 0 || i > 0 {
-					return errors.New("input overflows the modulus")
-				}
-				break
-			}
-			x.limbs[outI] = uint(overflow)
-		}
+	i, k := len(b), 0
+	for k < len(x.limbs) && i >= _S {
+		x.limbs[k] = bigEndianUint(b[i-_S : i])
+		i -= _S
+		k++
+	}
+	for s := 0; s < _W && k < len(x.limbs) && i > 0; s += 8 {
+		x.limbs[k] |= uint(b[i-1]) << s
+		i--
+	}
+	if i > 0 {
+		return errors.New("input overflows the modulus size")
 	}
 	return nil
 }
@@ -274,7 +245,7 @@
 
 	var c uint
 	for i := 0; i < size; i++ {
-		c = (xLimbs[i] - yLimbs[i] - c) >> _W
+		_, c = bits.Sub(xLimbs[i], yLimbs[i], c)
 	}
 	// If there was a carry, then subtracting y underflowed, so
 	// x is not greater than or equal to y.
@@ -290,44 +261,39 @@
 	xLimbs := x.limbs[:size]
 	yLimbs := y.limbs[:size]
 
+	mask := ctMask(on)
 	for i := 0; i < size; i++ {
-		xLimbs[i] = ctSelect(on, yLimbs[i], xLimbs[i])
+		xLimbs[i] ^= mask & (xLimbs[i] ^ yLimbs[i])
 	}
 	return x
 }
 
-// add computes x += y if on == 1, and does nothing otherwise. It returns the
-// carry of the addition regardless of on.
+// add computes x += y and returns the carry.
 //
 // Both operands must have the same announced length.
-func (x *Nat) add(on choice, y *Nat) (c uint) {
+func (x *Nat) add(y *Nat) (c uint) {
 	// Eliminate bounds checks in the loop.
 	size := len(x.limbs)
 	xLimbs := x.limbs[:size]
 	yLimbs := y.limbs[:size]
 
 	for i := 0; i < size; i++ {
-		res := xLimbs[i] + yLimbs[i] + c
-		xLimbs[i] = ctSelect(on, res&_MASK, xLimbs[i])
-		c = res >> _W
+		xLimbs[i], c = bits.Add(xLimbs[i], yLimbs[i], c)
 	}
 	return
 }
 
-// sub computes x -= y if on == 1, and does nothing otherwise. It returns the
-// borrow of the subtraction regardless of on.
+// sub computes x -= y. It returns the borrow of the subtraction.
 //
 // Both operands must have the same announced length.
-func (x *Nat) sub(on choice, y *Nat) (c uint) {
+func (x *Nat) sub(y *Nat) (c uint) {
 	// Eliminate bounds checks in the loop.
 	size := len(x.limbs)
 	xLimbs := x.limbs[:size]
 	yLimbs := y.limbs[:size]
 
 	for i := 0; i < size; i++ {
-		res := xLimbs[i] - yLimbs[i] - c
-		xLimbs[i] = ctSelect(on, res&_MASK, xLimbs[i])
-		c = res >> _W
+		xLimbs[i], c = bits.Sub(xLimbs[i], yLimbs[i], c)
 	}
 	return
 }
@@ -371,26 +337,32 @@
 	// Every iteration of this loop doubles the least-significant bits of
 	// correct inverse in y. The first three bits are already correct (1⁻¹ = 1,
 	// 3⁻¹ = 3, 5⁻¹ = 5, and 7⁻¹ = 7 mod 8), so doubling five times is enough
-	// for 61 bits (and wastes only one iteration for 31 bits).
+	// for 64 bits (and wastes only one iteration for 32 bits).
 	//
 	// See https://crypto.stackexchange.com/a/47496.
 	y := x
 	for i := 0; i < 5; i++ {
 		y = y * (2 - x*y)
 	}
-	return (1 << _W) - (y & _MASK)
+	return -y
 }
 
 // NewModulusFromBig creates a new Modulus from a [big.Int].
 //
-// The Int must be odd. The number of significant bits must be leakable.
-func NewModulusFromBig(n *big.Int) *Modulus {
+// The Int must be odd. The number of significant bits (and nothing else) is
+// leaked through timing side-channels.
+func NewModulusFromBig(n *big.Int) (*Modulus, error) {
+	if b := n.Bits(); len(b) == 0 {
+		return nil, errors.New("modulus must be >= 0")
+	} else if b[0]&1 != 1 {
+		return nil, errors.New("modulus must be odd")
+	}
 	m := &Modulus{}
 	m.nat = NewNat().setBig(n)
 	m.leading = _W - bitLen(m.nat.limbs[len(m.nat.limbs)-1])
 	m.m0inv = minusInverseModW(m.nat.limbs[0])
 	m.rr = rr(m)
-	return m
+	return m, nil
 }
 
 // bitLen is a version of bits.Len that only leaks the bit length of n, but not
@@ -424,7 +396,7 @@
 
 // shiftIn calculates x = x << _W + y mod m.
 //
-// This assumes that x is already reduced mod m, and that y < 2^_W.
+// This assumes that x is already reduced mod m.
 func (x *Nat) shiftIn(y uint, m *Modulus) *Nat {
 	d := NewNat().resetFor(m)
 
@@ -440,25 +412,21 @@
 	//
 	// To do the reduction, each iteration computes both 2x + b and 2x + b - m.
 	// The next iteration (and finally the return line) will use either result
-	// based on whether the subtraction underflowed.
+	// based on whether 2x + b overflows m.
 	needSubtraction := no
 	for i := _W - 1; i >= 0; i-- {
 		carry := (y >> i) & 1
 		var borrow uint
+		mask := ctMask(needSubtraction)
 		for i := 0; i < size; i++ {
-			l := ctSelect(needSubtraction, dLimbs[i], xLimbs[i])
-
-			res := l<<1 + carry
-			xLimbs[i] = res & _MASK
-			carry = res >> _W
-
-			res = xLimbs[i] - mLimbs[i] - borrow
-			dLimbs[i] = res & _MASK
-			borrow = res >> _W
+			l := xLimbs[i] ^ (mask & (xLimbs[i] ^ dLimbs[i]))
+			xLimbs[i], carry = bits.Add(l, l, carry)
+			dLimbs[i], borrow = bits.Sub(xLimbs[i], mLimbs[i], borrow)
 		}
-		// See Add for how carry (aka overflow), borrow (aka underflow), and
-		// needSubtraction relate.
-		needSubtraction = ctEq(carry, borrow)
+		// Like in maybeSubtractModulus, we need the subtraction if either it
+		// didn't underflow (meaning 2x + b > m) or if computing 2x + b
+		// overflowed (meaning 2x + b > 2^_W*n > m).
+		needSubtraction = not(choice(borrow)) | choice(carry)
 	}
 	return x.assign(needSubtraction, d)
 }
@@ -494,11 +462,11 @@
 	return out
 }
 
-// ExpandFor ensures out has the right size to work with operations modulo m.
+// ExpandFor ensures x has the right size to work with operations modulo m.
 //
-// The announced size of out must be smaller than or equal to that of m.
-func (out *Nat) ExpandFor(m *Modulus) *Nat {
-	return out.expand(len(m.nat.limbs))
+// The announced size of x must be smaller than or equal to that of m.
+func (x *Nat) ExpandFor(m *Modulus) *Nat {
+	return x.expand(len(m.nat.limbs))
 }
 
 // resetFor ensures out has the right size to work with operations modulo m.
@@ -508,14 +476,34 @@
 	return out.reset(len(m.nat.limbs))
 }
 
+// maybeSubtractModulus computes x -= m if and only if x >= m or if "always" is yes.
+//
+// It can be used to reduce modulo m a value up to 2m - 1, which is a common
+// range for results computed by higher level operations.
+//
+// always is usually a carry that indicates that the operation that produced x
+// overflowed its size, meaning abstractly x > 2^_W*n > m even if x < m.
+//
+// x and m operands must have the same announced length.
+func (x *Nat) maybeSubtractModulus(always choice, m *Modulus) {
+	t := NewNat().set(x)
+	underflow := t.sub(m.nat)
+	// We keep the result if x - m didn't underflow (meaning x >= m)
+	// or if always was set.
+	keep := not(choice(underflow)) | choice(always)
+	x.assign(keep, t)
+}
+
 // Sub computes x = x - y mod m.
 //
 // The length of both operands must be the same as the modulus. Both operands
 // must already be reduced modulo m.
 func (x *Nat) Sub(y *Nat, m *Modulus) *Nat {
-	underflow := x.sub(yes, y)
+	underflow := x.sub(y)
 	// If the subtraction underflowed, add m.
-	x.add(choice(underflow), m.nat)
+	t := NewNat().set(x)
+	t.add(m.nat)
+	x.assign(choice(underflow), t)
 	return x
 }
 
@@ -524,34 +512,8 @@
 // The length of both operands must be the same as the modulus. Both operands
 // must already be reduced modulo m.
 func (x *Nat) Add(y *Nat, m *Modulus) *Nat {
-	overflow := x.add(yes, y)
-	underflow := not(x.cmpGeq(m.nat)) // x < m
-
-	// Three cases are possible:
-	//
-	//   - overflow = 0, underflow = 0
-	//
-	// In this case, addition fits in our limbs, but we can still subtract away
-	// m without an underflow, so we need to perform the subtraction to reduce
-	// our result.
-	//
-	//   - overflow = 0, underflow = 1
-	//
-	// The addition fits in our limbs, but we can't subtract m without
-	// underflowing. The result is already reduced.
-	//
-	//   - overflow = 1, underflow = 1
-	//
-	// The addition does not fit in our limbs, and the subtraction's borrow
-	// would cancel out with the addition's carry. We need to subtract m to
-	// reduce our result.
-	//
-	// The overflow = 1, underflow = 0 case is not possible, because y is at
-	// most m - 1, and if adding m - 1 overflows, then subtracting m must
-	// necessarily underflow.
-	needSubtraction := ctEq(overflow, uint(underflow))
-
-	x.sub(needSubtraction, m.nat)
+	overflow := x.add(y)
+	x.maybeSubtractModulus(choice(overflow), m)
 	return x
 }
 
@@ -565,7 +527,7 @@
 func (x *Nat) montgomeryRepresentation(m *Modulus) *Nat {
 	// A Montgomery multiplication (which computes a * b / R) by R * R works out
 	// to a multiplication by R, which takes the value out of the Montgomery domain.
-	return x.montgomeryMul(NewNat().set(x), m.rr, m)
+	return x.montgomeryMul(x, m.rr, m)
 }
 
 // montgomeryReduction calculates x = x / R mod m, with R = 2^(_W * n) and
@@ -576,77 +538,157 @@
 	// By Montgomery multiplying with 1 not in Montgomery representation, we
 	// convert out back from Montgomery representation, because it works out to
 	// dividing by R.
-	t0 := NewNat().set(x)
-	t1 := NewNat().ExpandFor(m)
-	t1.limbs[0] = 1
-	return x.montgomeryMul(t0, t1, m)
+	one := NewNat().ExpandFor(m)
+	one.limbs[0] = 1
+	return x.montgomeryMul(x, one, m)
 }
 
-// montgomeryMul calculates d = a * b / R mod m, with R = 2^(_W * n) and
-// n = len(m.nat.limbs), using the Montgomery Multiplication technique.
+// montgomeryMul calculates x = a * b / R mod m, with R = 2^(_W * n) and
+// n = len(m.nat.limbs), also known as a Montgomery multiplication.
 //
-// All inputs should be the same length, not aliasing d, and already
-// reduced modulo m. d will be resized to the size of m and overwritten.
-func (d *Nat) montgomeryMul(a *Nat, b *Nat, m *Modulus) *Nat {
-	d.resetFor(m)
-	if len(a.limbs) != len(m.nat.limbs) || len(b.limbs) != len(m.nat.limbs) {
-		panic("bigmod: invalid montgomeryMul input")
-	}
+// All inputs should be the same length and already reduced modulo m.
+// x will be resized to the size of m and overwritten.
+func (x *Nat) montgomeryMul(a *Nat, b *Nat, m *Modulus) *Nat {
+	n := len(m.nat.limbs)
+	mLimbs := m.nat.limbs[:n]
+	aLimbs := a.limbs[:n]
+	bLimbs := b.limbs[:n]
 
-	// See https://bearssl.org/bigint.html#montgomery-reduction-and-multiplication
-	// for a description of the algorithm implemented mostly in montgomeryLoop.
-	// See Add for how overflow, underflow, and needSubtraction relate.
-	overflow := montgomeryLoop(d.limbs, a.limbs, b.limbs, m.nat.limbs, m.m0inv)
-	underflow := not(d.cmpGeq(m.nat)) // d < m
-	needSubtraction := ctEq(overflow, uint(underflow))
-	d.sub(needSubtraction, m.nat)
+	switch n {
+	default:
+		// Attempt to use a stack-allocated backing array.
+		T := make([]uint, 0, preallocLimbs*2)
+		if cap(T) < n*2 {
+			T = make([]uint, 0, n*2)
+		}
+		T = T[:n*2]
 
-	return d
-}
+		// This loop implements Word-by-Word Montgomery Multiplication, as
+		// described in Algorithm 4 (Fig. 3) of "Efficient Software
+		// Implementations of Modular Exponentiation" by Shay Gueron
+		// [https://eprint.iacr.org/2011/239.pdf].
+		var c uint
+		for i := 0; i < n; i++ {
+			_ = T[n+i] // bounds check elimination hint
 
-func montgomeryLoopGeneric(d, a, b, m []uint, m0inv uint) (overflow uint) {
-	// Eliminate bounds checks in the loop.
-	size := len(d)
-	a = a[:size]
-	b = b[:size]
-	m = m[:size]
+			// Step 1 (T = a × b) is computed as a large pen-and-paper column
+			// multiplication of two numbers with n base-2^_W digits. If we just
+			// wanted to produce 2n-wide T, we would do
+			//
+			//   for i := 0; i < n; i++ {
+			//       d := bLimbs[i]
+			//       T[n+i] = addMulVVW(T[i:n+i], aLimbs, d)
+			//   }
+			//
+			// where d is a digit of the multiplier, T[i:n+i] is the shifted
+			// position of the product of that digit, and T[n+i] is the final carry.
+			// Note that T[i] isn't modified after processing the i-th digit.
+			//
+			// Instead of running two loops, one for Step 1 and one for Steps 2–6,
+			// the result of Step 1 is computed during the next loop. This is
+			// possible because each iteration only uses T[i] in Step 2 and then
+			// discards it in Step 6.
+			d := bLimbs[i]
+			c1 := addMulVVW(T[i:n+i], aLimbs, d)
 
-	for _, ai := range a {
-		// This is an unrolled iteration of the loop below with j = 0.
-		hi, lo := bits.Mul(ai, b[0])
-		z_lo, c := bits.Add(d[0], lo, 0)
-		f := (z_lo * m0inv) & _MASK // (d[0] + a[i] * b[0]) * m0inv
-		z_hi, _ := bits.Add(0, hi, c)
-		hi, lo = bits.Mul(f, m[0])
-		z_lo, c = bits.Add(z_lo, lo, 0)
-		z_hi, _ = bits.Add(z_hi, hi, c)
-		carry := z_hi<<1 | z_lo>>_W
+			// Step 6 is replaced by shifting the virtual window we operate
+			// over: T of the algorithm is T[i:] for us. That means that T1 in
+			// Step 2 (T mod 2^_W) is simply T[i]. k0 in Step 3 is our m0inv.
+			Y := T[i] * m.m0inv
 
-		for j := 1; j < size; j++ {
-			// z = d[j] + a[i] * b[j] + f * m[j] + carry <= 2^(2W+1) - 2^(W+1) + 2^W
-			hi, lo := bits.Mul(ai, b[j])
-			z_lo, c := bits.Add(d[j], lo, 0)
-			z_hi, _ := bits.Add(0, hi, c)
-			hi, lo = bits.Mul(f, m[j])
-			z_lo, c = bits.Add(z_lo, lo, 0)
-			z_hi, _ = bits.Add(z_hi, hi, c)
-			z_lo, c = bits.Add(z_lo, carry, 0)
-			z_hi, _ = bits.Add(z_hi, 0, c)
-			d[j-1] = z_lo & _MASK
-			carry = z_hi<<1 | z_lo>>_W // carry <= 2^(W+1) - 2
+			// Step 4 and 5 add Y × m to T, which as mentioned above is stored
+			// at T[i:]. The two carries (from a × d and Y × m) are added up in
+			// the next word T[n+i], and the carry bit from that addition is
+			// brought forward to the next iteration.
+			c2 := addMulVVW(T[i:n+i], mLimbs, Y)
+			T[n+i], c = bits.Add(c1, c2, c)
 		}
 
-		z := overflow + carry // z <= 2^(W+1) - 1
-		d[size-1] = z & _MASK
-		overflow = z >> _W // overflow <= 1
+		// Finally for Step 7 we copy the final T window into x, and subtract m
+		// if necessary (which as explained in maybeSubtractModulus can be the
+		// case both if x >= m, or if x overflowed).
+		//
+		// The paper suggests in Section 4 that we can do an "Almost Montgomery
+		// Multiplication" by subtracting only in the overflow case, but the
+		// cost is very similar since the constant time subtraction tells us if
+		// x >= m as a side effect, and taking care of the broken invariant is
+		// highly undesirable (see https://go.dev/issue/13907).
+		copy(x.reset(n).limbs, T[n:])
+		x.maybeSubtractModulus(choice(c), m)
+
+	// The following specialized cases follow the exact same algorithm, but
+	// optimized for the sizes most used in RSA. addMulVVW is implemented in
+	// assembly with loop unrolling depending on the architecture and bounds
+	// checks are removed by the compiler thanks to the constant size.
+	case 1024 / _W:
+		const n = 1024 / _W // compiler hint
+		T := make([]uint, n*2)
+		var c uint
+		for i := 0; i < n; i++ {
+			d := bLimbs[i]
+			c1 := addMulVVW1024(&T[i], &aLimbs[0], d)
+			Y := T[i] * m.m0inv
+			c2 := addMulVVW1024(&T[i], &mLimbs[0], Y)
+			T[n+i], c = bits.Add(c1, c2, c)
+		}
+		copy(x.reset(n).limbs, T[n:])
+		x.maybeSubtractModulus(choice(c), m)
+
+	case 1536 / _W:
+		const n = 1536 / _W // compiler hint
+		T := make([]uint, n*2)
+		var c uint
+		for i := 0; i < n; i++ {
+			d := bLimbs[i]
+			c1 := addMulVVW1536(&T[i], &aLimbs[0], d)
+			Y := T[i] * m.m0inv
+			c2 := addMulVVW1536(&T[i], &mLimbs[0], Y)
+			T[n+i], c = bits.Add(c1, c2, c)
+		}
+		copy(x.reset(n).limbs, T[n:])
+		x.maybeSubtractModulus(choice(c), m)
+
+	case 2048 / _W:
+		const n = 2048 / _W // compiler hint
+		T := make([]uint, n*2)
+		var c uint
+		for i := 0; i < n; i++ {
+			d := bLimbs[i]
+			c1 := addMulVVW2048(&T[i], &aLimbs[0], d)
+			Y := T[i] * m.m0inv
+			c2 := addMulVVW2048(&T[i], &mLimbs[0], Y)
+			T[n+i], c = bits.Add(c1, c2, c)
+		}
+		copy(x.reset(n).limbs, T[n:])
+		x.maybeSubtractModulus(choice(c), m)
 	}
-	return
+
+	return x
 }
 
-// Mul calculates x *= y mod m.
+// addMulVVW multiplies the multi-word value x by the single-word value y,
+// adding the result to the multi-word value z and returning the final carry.
+// It can be thought of as one row of a pen-and-paper column multiplication.
+func addMulVVW(z, x []uint, y uint) (carry uint) {
+	_ = x[len(z)-1] // bounds check elimination hint
+	for i := range z {
+		hi, lo := bits.Mul(x[i], y)
+		lo, c := bits.Add(lo, z[i], 0)
+		// We use bits.Add with zero to get an add-with-carry instruction that
+		// absorbs the carry from the previous bits.Add.
+		hi, _ = bits.Add(hi, 0, c)
+		lo, c = bits.Add(lo, carry, 0)
+		hi, _ = bits.Add(hi, 0, c)
+		carry = hi
+		z[i] = lo
+	}
+	return carry
+}
+
+// Mul calculates x = x * y mod m.
 //
-// x and y must already be reduced modulo m, they must share its announced
-// length, and they may not alias.
+// The length of both operands must be the same as the modulus. Both operands
+// must already be reduced modulo m.
 func (x *Nat) Mul(y *Nat, m *Modulus) *Nat {
 	// A Montgomery multiplication by a value out of the Montgomery domain
 	// takes the result out of Montgomery representation.
@@ -661,7 +703,8 @@
 func (out *Nat) Exp(x *Nat, e []byte, m *Modulus) *Nat {
 	// We use a 4 bit window. For our RSA workload, 4 bit windows are faster
 	// than 2 bit windows, but use an extra 12 nats worth of scratch space.
-	// Using bit sizes that don't divide 8 are more complex to implement.
+	// Using bit sizes that don't divide 8 are more complex to implement, but
+	// are likely to be more efficient if necessary.
 
 	table := [(1 << 4) - 1]*Nat{ // table[i] = x ^ (i+1)
 		// newNat calls are unrolled so they are allocated on the stack.
@@ -677,27 +720,51 @@
 	out.resetFor(m)
 	out.limbs[0] = 1
 	out.montgomeryRepresentation(m)
-	t0 := NewNat().ExpandFor(m)
-	t1 := NewNat().ExpandFor(m)
+	tmp := NewNat().ExpandFor(m)
 	for _, b := range e {
 		for _, j := range []int{4, 0} {
-			// Square four times.
-			t1.montgomeryMul(out, out, m)
-			out.montgomeryMul(t1, t1, m)
-			t1.montgomeryMul(out, out, m)
-			out.montgomeryMul(t1, t1, m)
+			// Square four times. Optimization note: this can be implemented
+			// more efficiently than with generic Montgomery multiplication.
+			out.montgomeryMul(out, out, m)
+			out.montgomeryMul(out, out, m)
+			out.montgomeryMul(out, out, m)
+			out.montgomeryMul(out, out, m)
 
 			// Select x^k in constant time from the table.
 			k := uint((b >> j) & 0b1111)
 			for i := range table {
-				t0.assign(ctEq(k, uint(i+1)), table[i])
+				tmp.assign(ctEq(k, uint(i+1)), table[i])
 			}
 
 			// Multiply by x^k, discarding the result if k = 0.
-			t1.montgomeryMul(out, t0, m)
-			out.assign(not(ctEq(k, 0)), t1)
+			tmp.montgomeryMul(out, tmp, m)
+			out.assign(not(ctEq(k, 0)), tmp)
 		}
 	}
 
 	return out.montgomeryReduction(m)
 }
+
+// ExpShort calculates out = x^e mod m.
+//
+// The output will be resized to the size of m and overwritten. x must already
+// be reduced modulo m. This leaks the exact bit size of the exponent.
+func (out *Nat) ExpShort(x *Nat, e uint, m *Modulus) *Nat {
+	xR := NewNat().set(x).montgomeryRepresentation(m)
+
+	out.resetFor(m)
+	out.limbs[0] = 1
+	out.montgomeryRepresentation(m)
+
+	// For short exponents, precomputing a table and using a window like in Exp
+	// doesn't pay off. Instead, we do a simple constant-time conditional
+	// square-and-multiply chain, skipping the initial run of zeroes.
+	tmp := NewNat().ExpandFor(m)
+	for i := bits.UintSize - bitLen(e); i < bits.UintSize; i++ {
+		out.montgomeryMul(out, out, m)
+		k := (e >> (bits.UintSize - i - 1)) & 1
+		tmp.montgomeryMul(out, xR, m)
+		out.assign(ctEq(k, 1), tmp)
+	}
+	return out.montgomeryReduction(m)
+}
diff --git a/src/crypto/internal/bigmod/nat_386.s b/src/crypto/internal/bigmod/nat_386.s
new file mode 100644
index 0000000..0637d27
--- /dev/null
+++ b/src/crypto/internal/bigmod/nat_386.s
@@ -0,0 +1,47 @@
+// Copyright 2009 The Go 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:build !purego
+
+#include "textflag.h"
+
+// func addMulVVW1024(z, x *uint, y uint) (c uint)
+TEXT ·addMulVVW1024(SB), $0-16
+	MOVL	$32, BX
+	JMP		addMulVVWx(SB)
+
+// func addMulVVW1536(z, x *uint, y uint) (c uint)
+TEXT ·addMulVVW1536(SB), $0-16
+	MOVL	$48, BX
+	JMP		addMulVVWx(SB)
+
+// func addMulVVW2048(z, x *uint, y uint) (c uint)
+TEXT ·addMulVVW2048(SB), $0-16
+	MOVL	$64, BX
+	JMP		addMulVVWx(SB)
+
+TEXT addMulVVWx(SB), NOFRAME|NOSPLIT, $0
+	MOVL z+0(FP), DI
+	MOVL x+4(FP), SI
+	MOVL y+8(FP), BP
+	LEAL (DI)(BX*4), DI
+	LEAL (SI)(BX*4), SI
+	NEGL BX			// i = -n
+	MOVL $0, CX		// c = 0
+	JMP E6
+
+L6:	MOVL (SI)(BX*4), AX
+	MULL BP
+	ADDL CX, AX
+	ADCL $0, DX
+	ADDL AX, (DI)(BX*4)
+	ADCL $0, DX
+	MOVL DX, CX
+	ADDL $1, BX		// i++
+
+E6:	CMPL BX, $0		// i < 0
+	JL L6
+
+	MOVL CX, c+12(FP)
+	RET
diff --git a/src/crypto/internal/bigmod/nat_amd64.go b/src/crypto/internal/bigmod/nat_amd64.go
deleted file mode 100644
index e947782..0000000
--- a/src/crypto/internal/bigmod/nat_amd64.go
+++ /dev/null
@@ -1,8 +0,0 @@
-// Code generated by command: go run nat_amd64_asm.go -out ../nat_amd64.s -stubs ../nat_amd64.go -pkg bigmod. DO NOT EDIT.
-
-//go:build amd64 && gc && !purego
-
-package bigmod
-
-//go:noescape
-func montgomeryLoop(d []uint, a []uint, b []uint, m []uint, m0inv uint) uint
diff --git a/src/crypto/internal/bigmod/nat_amd64.s b/src/crypto/internal/bigmod/nat_amd64.s
index 12b7629..ab94344 100644
--- a/src/crypto/internal/bigmod/nat_amd64.s
+++ b/src/crypto/internal/bigmod/nat_amd64.s
@@ -1,68 +1,1230 @@
-// Code generated by command: go run nat_amd64_asm.go -out ../nat_amd64.s -stubs ../nat_amd64.go -pkg bigmod. DO NOT EDIT.
+// Code generated by command: go run nat_amd64_asm.go -out ../nat_amd64.s -pkg bigmod. DO NOT EDIT.
 
-//go:build amd64 && gc && !purego
+//go:build !purego
 
-// func montgomeryLoop(d []uint, a []uint, b []uint, m []uint, m0inv uint) uint
-TEXT ·montgomeryLoop(SB), $8-112
-	MOVQ d_len+8(FP), CX
-	MOVQ d_base+0(FP), BX
-	MOVQ b_base+48(FP), SI
-	MOVQ m_base+72(FP), DI
-	MOVQ m0inv+96(FP), R8
-	XORQ R9, R9
-	XORQ R10, R10
+// func addMulVVW1024(z *uint, x *uint, y uint) (c uint)
+// Requires: ADX, BMI2
+TEXT ·addMulVVW1024(SB), $0-32
+	CMPB ·supportADX+0(SB), $0x01
+	JEQ  adx
+	MOVQ z+0(FP), CX
+	MOVQ x+8(FP), BX
+	MOVQ y+16(FP), SI
+	XORQ DI, DI
 
-outerLoop:
-	MOVQ  a_base+24(FP), R11
-	MOVQ  (R11)(R10*8), R11
-	MOVQ  (SI), AX
-	MULQ  R11
-	MOVQ  AX, R13
-	MOVQ  DX, R12
-	ADDQ  (BX), R13
-	ADCQ  $0x00, R12
-	MOVQ  R8, R14
-	IMULQ R13, R14
-	BTRQ  $0x3f, R14
-	MOVQ  (DI), AX
-	MULQ  R14
-	ADDQ  AX, R13
-	ADCQ  DX, R12
-	SHRQ  $0x3f, R12, R13
-	XORQ  R12, R12
-	INCQ  R12
-	JMP   innerLoopCondition
+	// Iteration 0
+	MOVQ (BX), AX
+	MULQ SI
+	ADDQ (CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, (CX)
 
-innerLoop:
-	MOVQ (SI)(R12*8), AX
-	MULQ R11
-	MOVQ AX, BP
-	MOVQ DX, R15
-	MOVQ (DI)(R12*8), AX
-	MULQ R14
-	ADDQ AX, BP
-	ADCQ DX, R15
-	ADDQ (BX)(R12*8), BP
-	ADCQ $0x00, R15
-	ADDQ R13, BP
-	ADCQ $0x00, R15
-	MOVQ BP, AX
-	BTRQ $0x3f, AX
-	MOVQ AX, -8(BX)(R12*8)
-	SHRQ $0x3f, R15, BP
-	MOVQ BP, R13
-	INCQ R12
+	// Iteration 1
+	MOVQ 8(BX), AX
+	MULQ SI
+	ADDQ 8(CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, 8(CX)
 
-innerLoopCondition:
-	CMPQ CX, R12
-	JGT  innerLoop
-	ADDQ R13, R9
-	MOVQ R9, AX
-	BTRQ $0x3f, AX
-	MOVQ AX, -8(BX)(CX*8)
-	SHRQ $0x3f, R9
-	INCQ R10
-	CMPQ CX, R10
-	JGT  outerLoop
-	MOVQ R9, ret+104(FP)
+	// Iteration 2
+	MOVQ 16(BX), AX
+	MULQ SI
+	ADDQ 16(CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, 16(CX)
+
+	// Iteration 3
+	MOVQ 24(BX), AX
+	MULQ SI
+	ADDQ 24(CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, 24(CX)
+
+	// Iteration 4
+	MOVQ 32(BX), AX
+	MULQ SI
+	ADDQ 32(CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, 32(CX)
+
+	// Iteration 5
+	MOVQ 40(BX), AX
+	MULQ SI
+	ADDQ 40(CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, 40(CX)
+
+	// Iteration 6
+	MOVQ 48(BX), AX
+	MULQ SI
+	ADDQ 48(CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, 48(CX)
+
+	// Iteration 7
+	MOVQ 56(BX), AX
+	MULQ SI
+	ADDQ 56(CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, 56(CX)
+
+	// Iteration 8
+	MOVQ 64(BX), AX
+	MULQ SI
+	ADDQ 64(CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, 64(CX)
+
+	// Iteration 9
+	MOVQ 72(BX), AX
+	MULQ SI
+	ADDQ 72(CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, 72(CX)
+
+	// Iteration 10
+	MOVQ 80(BX), AX
+	MULQ SI
+	ADDQ 80(CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, 80(CX)
+
+	// Iteration 11
+	MOVQ 88(BX), AX
+	MULQ SI
+	ADDQ 88(CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, 88(CX)
+
+	// Iteration 12
+	MOVQ 96(BX), AX
+	MULQ SI
+	ADDQ 96(CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, 96(CX)
+
+	// Iteration 13
+	MOVQ 104(BX), AX
+	MULQ SI
+	ADDQ 104(CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, 104(CX)
+
+	// Iteration 14
+	MOVQ 112(BX), AX
+	MULQ SI
+	ADDQ 112(CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, 112(CX)
+
+	// Iteration 15
+	MOVQ 120(BX), AX
+	MULQ SI
+	ADDQ 120(CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, 120(CX)
+	MOVQ DI, c+24(FP)
+	RET
+
+adx:
+	MOVQ z+0(FP), AX
+	MOVQ x+8(FP), CX
+	MOVQ y+16(FP), DX
+	XORQ BX, BX
+	XORQ SI, SI
+
+	// Iteration 0
+	MULXQ (CX), R8, DI
+	ADCXQ BX, R8
+	ADOXQ (AX), R8
+	MOVQ  R8, (AX)
+
+	// Iteration 1
+	MULXQ 8(CX), R8, BX
+	ADCXQ DI, R8
+	ADOXQ 8(AX), R8
+	MOVQ  R8, 8(AX)
+
+	// Iteration 2
+	MULXQ 16(CX), R8, DI
+	ADCXQ BX, R8
+	ADOXQ 16(AX), R8
+	MOVQ  R8, 16(AX)
+
+	// Iteration 3
+	MULXQ 24(CX), R8, BX
+	ADCXQ DI, R8
+	ADOXQ 24(AX), R8
+	MOVQ  R8, 24(AX)
+
+	// Iteration 4
+	MULXQ 32(CX), R8, DI
+	ADCXQ BX, R8
+	ADOXQ 32(AX), R8
+	MOVQ  R8, 32(AX)
+
+	// Iteration 5
+	MULXQ 40(CX), R8, BX
+	ADCXQ DI, R8
+	ADOXQ 40(AX), R8
+	MOVQ  R8, 40(AX)
+
+	// Iteration 6
+	MULXQ 48(CX), R8, DI
+	ADCXQ BX, R8
+	ADOXQ 48(AX), R8
+	MOVQ  R8, 48(AX)
+
+	// Iteration 7
+	MULXQ 56(CX), R8, BX
+	ADCXQ DI, R8
+	ADOXQ 56(AX), R8
+	MOVQ  R8, 56(AX)
+
+	// Iteration 8
+	MULXQ 64(CX), R8, DI
+	ADCXQ BX, R8
+	ADOXQ 64(AX), R8
+	MOVQ  R8, 64(AX)
+
+	// Iteration 9
+	MULXQ 72(CX), R8, BX
+	ADCXQ DI, R8
+	ADOXQ 72(AX), R8
+	MOVQ  R8, 72(AX)
+
+	// Iteration 10
+	MULXQ 80(CX), R8, DI
+	ADCXQ BX, R8
+	ADOXQ 80(AX), R8
+	MOVQ  R8, 80(AX)
+
+	// Iteration 11
+	MULXQ 88(CX), R8, BX
+	ADCXQ DI, R8
+	ADOXQ 88(AX), R8
+	MOVQ  R8, 88(AX)
+
+	// Iteration 12
+	MULXQ 96(CX), R8, DI
+	ADCXQ BX, R8
+	ADOXQ 96(AX), R8
+	MOVQ  R8, 96(AX)
+
+	// Iteration 13
+	MULXQ 104(CX), R8, BX
+	ADCXQ DI, R8
+	ADOXQ 104(AX), R8
+	MOVQ  R8, 104(AX)
+
+	// Iteration 14
+	MULXQ 112(CX), R8, DI
+	ADCXQ BX, R8
+	ADOXQ 112(AX), R8
+	MOVQ  R8, 112(AX)
+
+	// Iteration 15
+	MULXQ 120(CX), R8, BX
+	ADCXQ DI, R8
+	ADOXQ 120(AX), R8
+	MOVQ  R8, 120(AX)
+
+	// Add back carry flags and return
+	ADCXQ SI, BX
+	ADOXQ SI, BX
+	MOVQ  BX, c+24(FP)
+	RET
+
+// func addMulVVW1536(z *uint, x *uint, y uint) (c uint)
+// Requires: ADX, BMI2
+TEXT ·addMulVVW1536(SB), $0-32
+	CMPB ·supportADX+0(SB), $0x01
+	JEQ  adx
+	MOVQ z+0(FP), CX
+	MOVQ x+8(FP), BX
+	MOVQ y+16(FP), SI
+	XORQ DI, DI
+
+	// Iteration 0
+	MOVQ (BX), AX
+	MULQ SI
+	ADDQ (CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, (CX)
+
+	// Iteration 1
+	MOVQ 8(BX), AX
+	MULQ SI
+	ADDQ 8(CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, 8(CX)
+
+	// Iteration 2
+	MOVQ 16(BX), AX
+	MULQ SI
+	ADDQ 16(CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, 16(CX)
+
+	// Iteration 3
+	MOVQ 24(BX), AX
+	MULQ SI
+	ADDQ 24(CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, 24(CX)
+
+	// Iteration 4
+	MOVQ 32(BX), AX
+	MULQ SI
+	ADDQ 32(CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, 32(CX)
+
+	// Iteration 5
+	MOVQ 40(BX), AX
+	MULQ SI
+	ADDQ 40(CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, 40(CX)
+
+	// Iteration 6
+	MOVQ 48(BX), AX
+	MULQ SI
+	ADDQ 48(CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, 48(CX)
+
+	// Iteration 7
+	MOVQ 56(BX), AX
+	MULQ SI
+	ADDQ 56(CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, 56(CX)
+
+	// Iteration 8
+	MOVQ 64(BX), AX
+	MULQ SI
+	ADDQ 64(CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, 64(CX)
+
+	// Iteration 9
+	MOVQ 72(BX), AX
+	MULQ SI
+	ADDQ 72(CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, 72(CX)
+
+	// Iteration 10
+	MOVQ 80(BX), AX
+	MULQ SI
+	ADDQ 80(CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, 80(CX)
+
+	// Iteration 11
+	MOVQ 88(BX), AX
+	MULQ SI
+	ADDQ 88(CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, 88(CX)
+
+	// Iteration 12
+	MOVQ 96(BX), AX
+	MULQ SI
+	ADDQ 96(CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, 96(CX)
+
+	// Iteration 13
+	MOVQ 104(BX), AX
+	MULQ SI
+	ADDQ 104(CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, 104(CX)
+
+	// Iteration 14
+	MOVQ 112(BX), AX
+	MULQ SI
+	ADDQ 112(CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, 112(CX)
+
+	// Iteration 15
+	MOVQ 120(BX), AX
+	MULQ SI
+	ADDQ 120(CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, 120(CX)
+
+	// Iteration 16
+	MOVQ 128(BX), AX
+	MULQ SI
+	ADDQ 128(CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, 128(CX)
+
+	// Iteration 17
+	MOVQ 136(BX), AX
+	MULQ SI
+	ADDQ 136(CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, 136(CX)
+
+	// Iteration 18
+	MOVQ 144(BX), AX
+	MULQ SI
+	ADDQ 144(CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, 144(CX)
+
+	// Iteration 19
+	MOVQ 152(BX), AX
+	MULQ SI
+	ADDQ 152(CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, 152(CX)
+
+	// Iteration 20
+	MOVQ 160(BX), AX
+	MULQ SI
+	ADDQ 160(CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, 160(CX)
+
+	// Iteration 21
+	MOVQ 168(BX), AX
+	MULQ SI
+	ADDQ 168(CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, 168(CX)
+
+	// Iteration 22
+	MOVQ 176(BX), AX
+	MULQ SI
+	ADDQ 176(CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, 176(CX)
+
+	// Iteration 23
+	MOVQ 184(BX), AX
+	MULQ SI
+	ADDQ 184(CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, 184(CX)
+	MOVQ DI, c+24(FP)
+	RET
+
+adx:
+	MOVQ z+0(FP), AX
+	MOVQ x+8(FP), CX
+	MOVQ y+16(FP), DX
+	XORQ BX, BX
+	XORQ SI, SI
+
+	// Iteration 0
+	MULXQ (CX), R8, DI
+	ADCXQ BX, R8
+	ADOXQ (AX), R8
+	MOVQ  R8, (AX)
+
+	// Iteration 1
+	MULXQ 8(CX), R8, BX
+	ADCXQ DI, R8
+	ADOXQ 8(AX), R8
+	MOVQ  R8, 8(AX)
+
+	// Iteration 2
+	MULXQ 16(CX), R8, DI
+	ADCXQ BX, R8
+	ADOXQ 16(AX), R8
+	MOVQ  R8, 16(AX)
+
+	// Iteration 3
+	MULXQ 24(CX), R8, BX
+	ADCXQ DI, R8
+	ADOXQ 24(AX), R8
+	MOVQ  R8, 24(AX)
+
+	// Iteration 4
+	MULXQ 32(CX), R8, DI
+	ADCXQ BX, R8
+	ADOXQ 32(AX), R8
+	MOVQ  R8, 32(AX)
+
+	// Iteration 5
+	MULXQ 40(CX), R8, BX
+	ADCXQ DI, R8
+	ADOXQ 40(AX), R8
+	MOVQ  R8, 40(AX)
+
+	// Iteration 6
+	MULXQ 48(CX), R8, DI
+	ADCXQ BX, R8
+	ADOXQ 48(AX), R8
+	MOVQ  R8, 48(AX)
+
+	// Iteration 7
+	MULXQ 56(CX), R8, BX
+	ADCXQ DI, R8
+	ADOXQ 56(AX), R8
+	MOVQ  R8, 56(AX)
+
+	// Iteration 8
+	MULXQ 64(CX), R8, DI
+	ADCXQ BX, R8
+	ADOXQ 64(AX), R8
+	MOVQ  R8, 64(AX)
+
+	// Iteration 9
+	MULXQ 72(CX), R8, BX
+	ADCXQ DI, R8
+	ADOXQ 72(AX), R8
+	MOVQ  R8, 72(AX)
+
+	// Iteration 10
+	MULXQ 80(CX), R8, DI
+	ADCXQ BX, R8
+	ADOXQ 80(AX), R8
+	MOVQ  R8, 80(AX)
+
+	// Iteration 11
+	MULXQ 88(CX), R8, BX
+	ADCXQ DI, R8
+	ADOXQ 88(AX), R8
+	MOVQ  R8, 88(AX)
+
+	// Iteration 12
+	MULXQ 96(CX), R8, DI
+	ADCXQ BX, R8
+	ADOXQ 96(AX), R8
+	MOVQ  R8, 96(AX)
+
+	// Iteration 13
+	MULXQ 104(CX), R8, BX
+	ADCXQ DI, R8
+	ADOXQ 104(AX), R8
+	MOVQ  R8, 104(AX)
+
+	// Iteration 14
+	MULXQ 112(CX), R8, DI
+	ADCXQ BX, R8
+	ADOXQ 112(AX), R8
+	MOVQ  R8, 112(AX)
+
+	// Iteration 15
+	MULXQ 120(CX), R8, BX
+	ADCXQ DI, R8
+	ADOXQ 120(AX), R8
+	MOVQ  R8, 120(AX)
+
+	// Iteration 16
+	MULXQ 128(CX), R8, DI
+	ADCXQ BX, R8
+	ADOXQ 128(AX), R8
+	MOVQ  R8, 128(AX)
+
+	// Iteration 17
+	MULXQ 136(CX), R8, BX
+	ADCXQ DI, R8
+	ADOXQ 136(AX), R8
+	MOVQ  R8, 136(AX)
+
+	// Iteration 18
+	MULXQ 144(CX), R8, DI
+	ADCXQ BX, R8
+	ADOXQ 144(AX), R8
+	MOVQ  R8, 144(AX)
+
+	// Iteration 19
+	MULXQ 152(CX), R8, BX
+	ADCXQ DI, R8
+	ADOXQ 152(AX), R8
+	MOVQ  R8, 152(AX)
+
+	// Iteration 20
+	MULXQ 160(CX), R8, DI
+	ADCXQ BX, R8
+	ADOXQ 160(AX), R8
+	MOVQ  R8, 160(AX)
+
+	// Iteration 21
+	MULXQ 168(CX), R8, BX
+	ADCXQ DI, R8
+	ADOXQ 168(AX), R8
+	MOVQ  R8, 168(AX)
+
+	// Iteration 22
+	MULXQ 176(CX), R8, DI
+	ADCXQ BX, R8
+	ADOXQ 176(AX), R8
+	MOVQ  R8, 176(AX)
+
+	// Iteration 23
+	MULXQ 184(CX), R8, BX
+	ADCXQ DI, R8
+	ADOXQ 184(AX), R8
+	MOVQ  R8, 184(AX)
+
+	// Add back carry flags and return
+	ADCXQ SI, BX
+	ADOXQ SI, BX
+	MOVQ  BX, c+24(FP)
+	RET
+
+// func addMulVVW2048(z *uint, x *uint, y uint) (c uint)
+// Requires: ADX, BMI2
+TEXT ·addMulVVW2048(SB), $0-32
+	CMPB ·supportADX+0(SB), $0x01
+	JEQ  adx
+	MOVQ z+0(FP), CX
+	MOVQ x+8(FP), BX
+	MOVQ y+16(FP), SI
+	XORQ DI, DI
+
+	// Iteration 0
+	MOVQ (BX), AX
+	MULQ SI
+	ADDQ (CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, (CX)
+
+	// Iteration 1
+	MOVQ 8(BX), AX
+	MULQ SI
+	ADDQ 8(CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, 8(CX)
+
+	// Iteration 2
+	MOVQ 16(BX), AX
+	MULQ SI
+	ADDQ 16(CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, 16(CX)
+
+	// Iteration 3
+	MOVQ 24(BX), AX
+	MULQ SI
+	ADDQ 24(CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, 24(CX)
+
+	// Iteration 4
+	MOVQ 32(BX), AX
+	MULQ SI
+	ADDQ 32(CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, 32(CX)
+
+	// Iteration 5
+	MOVQ 40(BX), AX
+	MULQ SI
+	ADDQ 40(CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, 40(CX)
+
+	// Iteration 6
+	MOVQ 48(BX), AX
+	MULQ SI
+	ADDQ 48(CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, 48(CX)
+
+	// Iteration 7
+	MOVQ 56(BX), AX
+	MULQ SI
+	ADDQ 56(CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, 56(CX)
+
+	// Iteration 8
+	MOVQ 64(BX), AX
+	MULQ SI
+	ADDQ 64(CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, 64(CX)
+
+	// Iteration 9
+	MOVQ 72(BX), AX
+	MULQ SI
+	ADDQ 72(CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, 72(CX)
+
+	// Iteration 10
+	MOVQ 80(BX), AX
+	MULQ SI
+	ADDQ 80(CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, 80(CX)
+
+	// Iteration 11
+	MOVQ 88(BX), AX
+	MULQ SI
+	ADDQ 88(CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, 88(CX)
+
+	// Iteration 12
+	MOVQ 96(BX), AX
+	MULQ SI
+	ADDQ 96(CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, 96(CX)
+
+	// Iteration 13
+	MOVQ 104(BX), AX
+	MULQ SI
+	ADDQ 104(CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, 104(CX)
+
+	// Iteration 14
+	MOVQ 112(BX), AX
+	MULQ SI
+	ADDQ 112(CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, 112(CX)
+
+	// Iteration 15
+	MOVQ 120(BX), AX
+	MULQ SI
+	ADDQ 120(CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, 120(CX)
+
+	// Iteration 16
+	MOVQ 128(BX), AX
+	MULQ SI
+	ADDQ 128(CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, 128(CX)
+
+	// Iteration 17
+	MOVQ 136(BX), AX
+	MULQ SI
+	ADDQ 136(CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, 136(CX)
+
+	// Iteration 18
+	MOVQ 144(BX), AX
+	MULQ SI
+	ADDQ 144(CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, 144(CX)
+
+	// Iteration 19
+	MOVQ 152(BX), AX
+	MULQ SI
+	ADDQ 152(CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, 152(CX)
+
+	// Iteration 20
+	MOVQ 160(BX), AX
+	MULQ SI
+	ADDQ 160(CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, 160(CX)
+
+	// Iteration 21
+	MOVQ 168(BX), AX
+	MULQ SI
+	ADDQ 168(CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, 168(CX)
+
+	// Iteration 22
+	MOVQ 176(BX), AX
+	MULQ SI
+	ADDQ 176(CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, 176(CX)
+
+	// Iteration 23
+	MOVQ 184(BX), AX
+	MULQ SI
+	ADDQ 184(CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, 184(CX)
+
+	// Iteration 24
+	MOVQ 192(BX), AX
+	MULQ SI
+	ADDQ 192(CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, 192(CX)
+
+	// Iteration 25
+	MOVQ 200(BX), AX
+	MULQ SI
+	ADDQ 200(CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, 200(CX)
+
+	// Iteration 26
+	MOVQ 208(BX), AX
+	MULQ SI
+	ADDQ 208(CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, 208(CX)
+
+	// Iteration 27
+	MOVQ 216(BX), AX
+	MULQ SI
+	ADDQ 216(CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, 216(CX)
+
+	// Iteration 28
+	MOVQ 224(BX), AX
+	MULQ SI
+	ADDQ 224(CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, 224(CX)
+
+	// Iteration 29
+	MOVQ 232(BX), AX
+	MULQ SI
+	ADDQ 232(CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, 232(CX)
+
+	// Iteration 30
+	MOVQ 240(BX), AX
+	MULQ SI
+	ADDQ 240(CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, 240(CX)
+
+	// Iteration 31
+	MOVQ 248(BX), AX
+	MULQ SI
+	ADDQ 248(CX), AX
+	ADCQ $0x00, DX
+	ADDQ DI, AX
+	ADCQ $0x00, DX
+	MOVQ DX, DI
+	MOVQ AX, 248(CX)
+	MOVQ DI, c+24(FP)
+	RET
+
+adx:
+	MOVQ z+0(FP), AX
+	MOVQ x+8(FP), CX
+	MOVQ y+16(FP), DX
+	XORQ BX, BX
+	XORQ SI, SI
+
+	// Iteration 0
+	MULXQ (CX), R8, DI
+	ADCXQ BX, R8
+	ADOXQ (AX), R8
+	MOVQ  R8, (AX)
+
+	// Iteration 1
+	MULXQ 8(CX), R8, BX
+	ADCXQ DI, R8
+	ADOXQ 8(AX), R8
+	MOVQ  R8, 8(AX)
+
+	// Iteration 2
+	MULXQ 16(CX), R8, DI
+	ADCXQ BX, R8
+	ADOXQ 16(AX), R8
+	MOVQ  R8, 16(AX)
+
+	// Iteration 3
+	MULXQ 24(CX), R8, BX
+	ADCXQ DI, R8
+	ADOXQ 24(AX), R8
+	MOVQ  R8, 24(AX)
+
+	// Iteration 4
+	MULXQ 32(CX), R8, DI
+	ADCXQ BX, R8
+	ADOXQ 32(AX), R8
+	MOVQ  R8, 32(AX)
+
+	// Iteration 5
+	MULXQ 40(CX), R8, BX
+	ADCXQ DI, R8
+	ADOXQ 40(AX), R8
+	MOVQ  R8, 40(AX)
+
+	// Iteration 6
+	MULXQ 48(CX), R8, DI
+	ADCXQ BX, R8
+	ADOXQ 48(AX), R8
+	MOVQ  R8, 48(AX)
+
+	// Iteration 7
+	MULXQ 56(CX), R8, BX
+	ADCXQ DI, R8
+	ADOXQ 56(AX), R8
+	MOVQ  R8, 56(AX)
+
+	// Iteration 8
+	MULXQ 64(CX), R8, DI
+	ADCXQ BX, R8
+	ADOXQ 64(AX), R8
+	MOVQ  R8, 64(AX)
+
+	// Iteration 9
+	MULXQ 72(CX), R8, BX
+	ADCXQ DI, R8
+	ADOXQ 72(AX), R8
+	MOVQ  R8, 72(AX)
+
+	// Iteration 10
+	MULXQ 80(CX), R8, DI
+	ADCXQ BX, R8
+	ADOXQ 80(AX), R8
+	MOVQ  R8, 80(AX)
+
+	// Iteration 11
+	MULXQ 88(CX), R8, BX
+	ADCXQ DI, R8
+	ADOXQ 88(AX), R8
+	MOVQ  R8, 88(AX)
+
+	// Iteration 12
+	MULXQ 96(CX), R8, DI
+	ADCXQ BX, R8
+	ADOXQ 96(AX), R8
+	MOVQ  R8, 96(AX)
+
+	// Iteration 13
+	MULXQ 104(CX), R8, BX
+	ADCXQ DI, R8
+	ADOXQ 104(AX), R8
+	MOVQ  R8, 104(AX)
+
+	// Iteration 14
+	MULXQ 112(CX), R8, DI
+	ADCXQ BX, R8
+	ADOXQ 112(AX), R8
+	MOVQ  R8, 112(AX)
+
+	// Iteration 15
+	MULXQ 120(CX), R8, BX
+	ADCXQ DI, R8
+	ADOXQ 120(AX), R8
+	MOVQ  R8, 120(AX)
+
+	// Iteration 16
+	MULXQ 128(CX), R8, DI
+	ADCXQ BX, R8
+	ADOXQ 128(AX), R8
+	MOVQ  R8, 128(AX)
+
+	// Iteration 17
+	MULXQ 136(CX), R8, BX
+	ADCXQ DI, R8
+	ADOXQ 136(AX), R8
+	MOVQ  R8, 136(AX)
+
+	// Iteration 18
+	MULXQ 144(CX), R8, DI
+	ADCXQ BX, R8
+	ADOXQ 144(AX), R8
+	MOVQ  R8, 144(AX)
+
+	// Iteration 19
+	MULXQ 152(CX), R8, BX
+	ADCXQ DI, R8
+	ADOXQ 152(AX), R8
+	MOVQ  R8, 152(AX)
+
+	// Iteration 20
+	MULXQ 160(CX), R8, DI
+	ADCXQ BX, R8
+	ADOXQ 160(AX), R8
+	MOVQ  R8, 160(AX)
+
+	// Iteration 21
+	MULXQ 168(CX), R8, BX
+	ADCXQ DI, R8
+	ADOXQ 168(AX), R8
+	MOVQ  R8, 168(AX)
+
+	// Iteration 22
+	MULXQ 176(CX), R8, DI
+	ADCXQ BX, R8
+	ADOXQ 176(AX), R8
+	MOVQ  R8, 176(AX)
+
+	// Iteration 23
+	MULXQ 184(CX), R8, BX
+	ADCXQ DI, R8
+	ADOXQ 184(AX), R8
+	MOVQ  R8, 184(AX)
+
+	// Iteration 24
+	MULXQ 192(CX), R8, DI
+	ADCXQ BX, R8
+	ADOXQ 192(AX), R8
+	MOVQ  R8, 192(AX)
+
+	// Iteration 25
+	MULXQ 200(CX), R8, BX
+	ADCXQ DI, R8
+	ADOXQ 200(AX), R8
+	MOVQ  R8, 200(AX)
+
+	// Iteration 26
+	MULXQ 208(CX), R8, DI
+	ADCXQ BX, R8
+	ADOXQ 208(AX), R8
+	MOVQ  R8, 208(AX)
+
+	// Iteration 27
+	MULXQ 216(CX), R8, BX
+	ADCXQ DI, R8
+	ADOXQ 216(AX), R8
+	MOVQ  R8, 216(AX)
+
+	// Iteration 28
+	MULXQ 224(CX), R8, DI
+	ADCXQ BX, R8
+	ADOXQ 224(AX), R8
+	MOVQ  R8, 224(AX)
+
+	// Iteration 29
+	MULXQ 232(CX), R8, BX
+	ADCXQ DI, R8
+	ADOXQ 232(AX), R8
+	MOVQ  R8, 232(AX)
+
+	// Iteration 30
+	MULXQ 240(CX), R8, DI
+	ADCXQ BX, R8
+	ADOXQ 240(AX), R8
+	MOVQ  R8, 240(AX)
+
+	// Iteration 31
+	MULXQ 248(CX), R8, BX
+	ADCXQ DI, R8
+	ADOXQ 248(AX), R8
+	MOVQ  R8, 248(AX)
+
+	// Add back carry flags and return
+	ADCXQ SI, BX
+	ADOXQ SI, BX
+	MOVQ  BX, c+24(FP)
 	RET
diff --git a/src/crypto/internal/bigmod/nat_arm.s b/src/crypto/internal/bigmod/nat_arm.s
new file mode 100644
index 0000000..c7397b8
--- /dev/null
+++ b/src/crypto/internal/bigmod/nat_arm.s
@@ -0,0 +1,47 @@
+// Copyright 2009 The Go 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:build !purego
+
+#include "textflag.h"
+
+// func addMulVVW1024(z, x *uint, y uint) (c uint)
+TEXT ·addMulVVW1024(SB), $0-16
+	MOVW	$32, R5
+	JMP		addMulVVWx(SB)
+
+// func addMulVVW1536(z, x *uint, y uint) (c uint)
+TEXT ·addMulVVW1536(SB), $0-16
+	MOVW	$48, R5
+	JMP		addMulVVWx(SB)
+
+// func addMulVVW2048(z, x *uint, y uint) (c uint)
+TEXT ·addMulVVW2048(SB), $0-16
+	MOVW	$64, R5
+	JMP		addMulVVWx(SB)
+
+TEXT addMulVVWx(SB), NOFRAME|NOSPLIT, $0
+	MOVW	$0, R0
+	MOVW	z+0(FP), R1
+	MOVW	x+4(FP), R2
+	MOVW	y+8(FP), R3
+	ADD	R5<<2, R1, R5
+	MOVW	$0, R4
+	B E9
+
+L9:	MOVW.P	4(R2), R6
+	MULLU	R6, R3, (R7, R6)
+	ADD.S	R4, R6
+	ADC	R0, R7
+	MOVW	0(R1), R4
+	ADD.S	R4, R6
+	ADC	R0, R7
+	MOVW.P	R6, 4(R1)
+	MOVW	R7, R4
+
+E9:	TEQ	R1, R5
+	BNE	L9
+
+	MOVW	R4, c+12(FP)
+	RET
diff --git a/src/crypto/internal/bigmod/nat_arm64.s b/src/crypto/internal/bigmod/nat_arm64.s
new file mode 100644
index 0000000..ba1e611
--- /dev/null
+++ b/src/crypto/internal/bigmod/nat_arm64.s
@@ -0,0 +1,69 @@
+// Copyright 2013 The Go 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:build !purego
+
+#include "textflag.h"
+
+// func addMulVVW1024(z, x *uint, y uint) (c uint)
+TEXT ·addMulVVW1024(SB), $0-32
+	MOVD	$16, R0
+	JMP		addMulVVWx(SB)
+
+// func addMulVVW1536(z, x *uint, y uint) (c uint)
+TEXT ·addMulVVW1536(SB), $0-32
+	MOVD	$24, R0
+	JMP		addMulVVWx(SB)
+
+// func addMulVVW2048(z, x *uint, y uint) (c uint)
+TEXT ·addMulVVW2048(SB), $0-32
+	MOVD	$32, R0
+	JMP		addMulVVWx(SB)
+
+TEXT addMulVVWx(SB), NOFRAME|NOSPLIT, $0
+	MOVD	z+0(FP), R1
+	MOVD	x+8(FP), R2
+	MOVD	y+16(FP), R3
+	MOVD	$0, R4
+
+// The main loop of this code operates on a block of 4 words every iteration
+// performing [R4:R12:R11:R10:R9] = R4 + R3 * [R8:R7:R6:R5] + [R12:R11:R10:R9]
+// where R4 is carried from the previous iteration, R8:R7:R6:R5 hold the next
+// 4 words of x, R3 is y and R12:R11:R10:R9 are part of the result z.
+loop:
+	CBZ	R0, done
+
+	LDP.P	16(R2), (R5, R6)
+	LDP.P	16(R2), (R7, R8)
+
+	LDP	(R1), (R9, R10)
+	ADDS	R4, R9
+	MUL	R6, R3, R14
+	ADCS	R14, R10
+	MUL	R7, R3, R15
+	LDP	16(R1), (R11, R12)
+	ADCS	R15, R11
+	MUL	R8, R3, R16
+	ADCS	R16, R12
+	UMULH	R8, R3, R20
+	ADC	$0, R20
+
+	MUL	R5, R3, R13
+	ADDS	R13, R9
+	UMULH	R5, R3, R17
+	ADCS	R17, R10
+	UMULH	R6, R3, R21
+	STP.P	(R9, R10), 16(R1)
+	ADCS	R21, R11
+	UMULH	R7, R3, R19
+	ADCS	R19, R12
+	STP.P	(R11, R12), 16(R1)
+	ADC	$0, R20, R4
+
+	SUB	$4, R0
+	B	loop
+
+done:
+	MOVD	R4, c+24(FP)
+	RET
diff --git a/src/crypto/internal/bigmod/nat_asm.go b/src/crypto/internal/bigmod/nat_asm.go
new file mode 100644
index 0000000..5eb91e1
--- /dev/null
+++ b/src/crypto/internal/bigmod/nat_asm.go
@@ -0,0 +1,28 @@
+// Copyright 2023 The Go 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:build !purego && (386 || amd64 || arm || arm64 || ppc64 || ppc64le || s390x)
+
+package bigmod
+
+import "internal/cpu"
+
+// amd64 assembly uses ADCX/ADOX/MULX if ADX is available to run two carry
+// chains in the flags in parallel across the whole operation, and aggressively
+// unrolls loops. arm64 processes four words at a time.
+//
+// It's unclear why the assembly for all other architectures, as well as for
+// amd64 without ADX, perform better than the compiler output.
+// TODO(filippo): file cmd/compile performance issue.
+
+var supportADX = cpu.X86.HasADX && cpu.X86.HasBMI2
+
+//go:noescape
+func addMulVVW1024(z, x *uint, y uint) (c uint)
+
+//go:noescape
+func addMulVVW1536(z, x *uint, y uint) (c uint)
+
+//go:noescape
+func addMulVVW2048(z, x *uint, y uint) (c uint)
diff --git a/src/crypto/internal/bigmod/nat_noasm.go b/src/crypto/internal/bigmod/nat_noasm.go
index 870b445..eff1253 100644
--- a/src/crypto/internal/bigmod/nat_noasm.go
+++ b/src/crypto/internal/bigmod/nat_noasm.go
@@ -1,11 +1,21 @@
-// Copyright 2022 The Go Authors. All rights reserved.
+// Copyright 2023 The Go 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:build !amd64 || !gc || purego
+//go:build purego || !(386 || amd64 || arm || arm64 || ppc64 || ppc64le || s390x)
 
 package bigmod
 
-func montgomeryLoop(d, a, b, m []uint, m0inv uint) uint {
-	return montgomeryLoopGeneric(d, a, b, m, m0inv)
+import "unsafe"
+
+func addMulVVW1024(z, x *uint, y uint) (c uint) {
+	return addMulVVW(unsafe.Slice(z, 1024/_W), unsafe.Slice(x, 1024/_W), y)
+}
+
+func addMulVVW1536(z, x *uint, y uint) (c uint) {
+	return addMulVVW(unsafe.Slice(z, 1536/_W), unsafe.Slice(x, 1536/_W), y)
+}
+
+func addMulVVW2048(z, x *uint, y uint) (c uint) {
+	return addMulVVW(unsafe.Slice(z, 2048/_W), unsafe.Slice(x, 2048/_W), y)
 }
diff --git a/src/crypto/internal/bigmod/nat_ppc64x.s b/src/crypto/internal/bigmod/nat_ppc64x.s
new file mode 100644
index 0000000..974f4f9
--- /dev/null
+++ b/src/crypto/internal/bigmod/nat_ppc64x.s
@@ -0,0 +1,51 @@
+// Copyright 2013 The Go 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:build !purego && (ppc64 || ppc64le)
+
+#include "textflag.h"
+
+// func addMulVVW1024(z, x *uint, y uint) (c uint)
+TEXT ·addMulVVW1024(SB), $0-32
+	MOVD	$16, R22 // R22 = z_len
+	JMP		addMulVVWx(SB)
+
+// func addMulVVW1536(z, x *uint, y uint) (c uint)
+TEXT ·addMulVVW1536(SB), $0-32
+	MOVD	$24, R22 // R22 = z_len
+	JMP		addMulVVWx(SB)
+
+// func addMulVVW2048(z, x *uint, y uint) (c uint)
+TEXT ·addMulVVW2048(SB), $0-32
+	MOVD	$32, R22 // R22 = z_len
+	JMP		addMulVVWx(SB)
+
+TEXT addMulVVWx(SB), NOFRAME|NOSPLIT, $0
+	MOVD z+0(FP), R10	// R10 = z[]
+	MOVD x+8(FP), R8	// R8 = x[]
+	MOVD y+16(FP), R9	// R9 = y
+
+	MOVD R0, R3		// R3 will be the index register
+	CMP  R0, R22
+	MOVD R0, R4		// R4 = c = 0
+	MOVD R22, CTR		// Initialize loop counter
+	BEQ  done
+	PCALIGN $16
+
+loop:
+	MOVD  (R8)(R3), R20	// Load x[i]
+	MOVD  (R10)(R3), R21	// Load z[i]
+	MULLD  R9, R20, R6	// R6 = Low-order(x[i]*y)
+	MULHDU R9, R20, R7	// R7 = High-order(x[i]*y)
+	ADDC   R21, R6		// R6 = z0
+	ADDZE  R7		// R7 = z1
+	ADDC   R4, R6		// R6 = z0 + c + 0
+	ADDZE  R7, R4           // c += z1
+	MOVD   R6, (R10)(R3)	// Store z[i]
+	ADD    $8, R3
+	BC  16, 0, loop		// bdnz
+
+done:
+	MOVD R4, c+24(FP)
+	RET
diff --git a/src/crypto/internal/bigmod/nat_s390x.s b/src/crypto/internal/bigmod/nat_s390x.s
new file mode 100644
index 0000000..0c07a0c
--- /dev/null
+++ b/src/crypto/internal/bigmod/nat_s390x.s
@@ -0,0 +1,85 @@
+// Copyright 2016 The Go 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:build !purego
+
+#include "textflag.h"
+
+// func addMulVVW1024(z, x *uint, y uint) (c uint)
+TEXT ·addMulVVW1024(SB), $0-32
+	MOVD	$16, R5
+	JMP		addMulVVWx(SB)
+
+// func addMulVVW1536(z, x *uint, y uint) (c uint)
+TEXT ·addMulVVW1536(SB), $0-32
+	MOVD	$24, R5
+	JMP		addMulVVWx(SB)
+
+// func addMulVVW2048(z, x *uint, y uint) (c uint)
+TEXT ·addMulVVW2048(SB), $0-32
+	MOVD	$32, R5
+	JMP		addMulVVWx(SB)
+
+TEXT addMulVVWx(SB), NOFRAME|NOSPLIT, $0
+	MOVD z+0(FP), R2
+	MOVD x+8(FP), R8
+	MOVD y+16(FP), R9
+
+	MOVD $0, R1 // i*8 = 0
+	MOVD $0, R7 // i = 0
+	MOVD $0, R0 // make sure it's zero
+	MOVD $0, R4 // c = 0
+
+	MOVD   R5, R12
+	AND    $-2, R12
+	CMPBGE R5, $2, A6
+	BR     E6
+
+A6:
+	MOVD   (R8)(R1*1), R6
+	MULHDU R9, R6
+	MOVD   (R2)(R1*1), R10
+	ADDC   R10, R11        // add to low order bits
+	ADDE   R0, R6
+	ADDC   R4, R11
+	ADDE   R0, R6
+	MOVD   R6, R4
+	MOVD   R11, (R2)(R1*1)
+
+	MOVD   (8)(R8)(R1*1), R6
+	MULHDU R9, R6
+	MOVD   (8)(R2)(R1*1), R10
+	ADDC   R10, R11           // add to low order bits
+	ADDE   R0, R6
+	ADDC   R4, R11
+	ADDE   R0, R6
+	MOVD   R6, R4
+	MOVD   R11, (8)(R2)(R1*1)
+
+	ADD $16, R1 // i*8 + 8
+	ADD $2, R7  // i++
+
+	CMPBLT R7, R12, A6
+	BR     E6
+
+L6:
+	// TODO: drop unused single-step loop.
+	MOVD   (R8)(R1*1), R6
+	MULHDU R9, R6
+	MOVD   (R2)(R1*1), R10
+	ADDC   R10, R11        // add to low order bits
+	ADDE   R0, R6
+	ADDC   R4, R11
+	ADDE   R0, R6
+	MOVD   R6, R4
+	MOVD   R11, (R2)(R1*1)
+
+	ADD $8, R1 // i*8 + 8
+	ADD $1, R7 // i++
+
+E6:
+	CMPBLT R7, R5, L6 // i < n
+
+	MOVD R4, c+24(FP)
+	RET
diff --git a/src/crypto/internal/bigmod/nat_test.go b/src/crypto/internal/bigmod/nat_test.go
index 6431d25..76e5570 100644
--- a/src/crypto/internal/bigmod/nat_test.go
+++ b/src/crypto/internal/bigmod/nat_test.go
@@ -5,14 +5,24 @@
 package bigmod
 
 import (
+	"fmt"
 	"math/big"
 	"math/bits"
 	"math/rand"
 	"reflect"
+	"strings"
 	"testing"
 	"testing/quick"
 )
 
+func (n *Nat) String() string {
+	var limbs []string
+	for i := range n.limbs {
+		limbs = append(limbs, fmt.Sprintf("%016X", n.limbs[len(n.limbs)-1-i]))
+	}
+	return "{" + strings.Join(limbs, " ") + "}"
+}
+
 // Generate generates an even nat. It's used by testing/quick to produce random
 // *nat values for quick.Check invocations.
 func (*Nat) Generate(r *rand.Rand, size int) reflect.Value {
@@ -54,21 +64,23 @@
 	}
 }
 
-func testMontgomeryRoundtrip(a *Nat) bool {
-	one := &Nat{make([]uint, len(a.limbs))}
-	one.limbs[0] = 1
-	aPlusOne := new(big.Int).SetBytes(natBytes(a))
-	aPlusOne.Add(aPlusOne, big.NewInt(1))
-	m := NewModulusFromBig(aPlusOne)
-	monty := new(Nat).set(a)
-	monty.montgomeryRepresentation(m)
-	aAgain := new(Nat).set(monty)
-	aAgain.montgomeryMul(monty, one, m)
-	return a.Equal(aAgain) == 1
-}
-
 func TestMontgomeryRoundtrip(t *testing.T) {
-	err := quick.Check(testMontgomeryRoundtrip, &quick.Config{})
+	err := quick.Check(func(a *Nat) bool {
+		one := &Nat{make([]uint, len(a.limbs))}
+		one.limbs[0] = 1
+		aPlusOne := new(big.Int).SetBytes(natBytes(a))
+		aPlusOne.Add(aPlusOne, big.NewInt(1))
+		m, _ := NewModulusFromBig(aPlusOne)
+		monty := new(Nat).set(a)
+		monty.montgomeryRepresentation(m)
+		aAgain := new(Nat).set(monty)
+		aAgain.montgomeryMul(monty, one, m)
+		if a.Equal(aAgain) != 1 {
+			t.Errorf("%v != %v", a, aAgain)
+			return false
+		}
+		return true
+	}, &quick.Config{})
 	if err != nil {
 		t.Error(err)
 	}
@@ -84,30 +96,30 @@
 	}{{
 		m:        []byte{13},
 		x:        []byte{0},
-		y:        0x7FFF_FFFF_FFFF_FFFF,
-		expected: []byte{7},
+		y:        0xFFFF_FFFF_FFFF_FFFF,
+		expected: []byte{2},
 	}, {
 		m:        []byte{13},
 		x:        []byte{7},
-		y:        0x7FFF_FFFF_FFFF_FFFF,
-		expected: []byte{11},
+		y:        0xFFFF_FFFF_FFFF_FFFF,
+		expected: []byte{10},
 	}, {
 		m:        []byte{0x06, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d},
 		x:        make([]byte, 9),
-		y:        0x7FFF_FFFF_FFFF_FFFF,
-		expected: []byte{0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
+		y:        0xFFFF_FFFF_FFFF_FFFF,
+		expected: []byte{0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
 	}, {
 		m:        []byte{0x06, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d},
-		x:        []byte{0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
+		x:        []byte{0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
 		y:        0,
-		expected: []byte{0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08},
+		expected: []byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06},
 	}}
 
 	for i, tt := range examples {
 		m := modulusFromBytes(tt.m)
 		got := natFromBytes(tt.x).ExpandFor(m).shiftIn(uint(tt.y), m)
-		if got.Equal(natFromBytes(tt.expected).ExpandFor(m)) != 1 {
-			t.Errorf("%d: got %x, expected %x", i, got, tt.expected)
+		if exp := natFromBytes(tt.expected).ExpandFor(m); got.Equal(exp) != 1 {
+			t.Errorf("%d: got %v, expected %v", i, got, exp)
 		}
 	}
 }
@@ -181,12 +193,12 @@
 			}
 			continue
 		}
-		if err == nil && tt.fail {
+		if tt.fail {
 			t.Errorf("%d: unexpected success", i)
 			continue
 		}
 		if expected := natFromBytes(tt.b).ExpandFor(m); got.Equal(expected) != yes {
-			t.Errorf("%d: got %x, expected %x", i, got, expected)
+			t.Errorf("%d: got %v, expected %v", i, got, expected)
 		}
 	}
 
@@ -228,7 +240,7 @@
 	for i, tt := range examples {
 		got := (&Nat{tt.in}).expand(tt.n)
 		if len(got.limbs) != len(tt.out) || got.Equal(&Nat{tt.out}) != 1 {
-			t.Errorf("%d: got %x, expected %x", i, got, tt.out)
+			t.Errorf("%d: got %v, expected %v", i, got, tt.out)
 		}
 	}
 }
@@ -287,26 +299,68 @@
 	}
 }
 
+func TestExpShort(t *testing.T) {
+	m := modulusFromBytes([]byte{13})
+	x := &Nat{[]uint{3}}
+	out := &Nat{[]uint{0}}
+	out.ExpShort(x, 12, m)
+	expected := &Nat{[]uint{1}}
+	if out.Equal(expected) != 1 {
+		t.Errorf("%+v != %+v", out, expected)
+	}
+}
+
+// TestMulReductions tests that Mul reduces results equal or slightly greater
+// than the modulus. Some Montgomery algorithms don't and need extra care to
+// return correct results. See https://go.dev/issue/13907.
+func TestMulReductions(t *testing.T) {
+	// Two short but multi-limb primes.
+	a, _ := new(big.Int).SetString("773608962677651230850240281261679752031633236267106044359907", 10)
+	b, _ := new(big.Int).SetString("180692823610368451951102211649591374573781973061758082626801", 10)
+	n := new(big.Int).Mul(a, b)
+
+	N, _ := NewModulusFromBig(n)
+	A := NewNat().setBig(a).ExpandFor(N)
+	B := NewNat().setBig(b).ExpandFor(N)
+
+	if A.Mul(B, N).IsZero() != 1 {
+		t.Error("a * b mod (a * b) != 0")
+	}
+
+	i := new(big.Int).ModInverse(a, b)
+	N, _ = NewModulusFromBig(b)
+	A = NewNat().setBig(a).ExpandFor(N)
+	I := NewNat().setBig(i).ExpandFor(N)
+	one := NewNat().setBig(big.NewInt(1)).ExpandFor(N)
+
+	if A.Mul(I, N).Equal(one) != 1 {
+		t.Error("a * inv(a) mod b != 1")
+	}
+}
+
 func natBytes(n *Nat) []byte {
 	return n.Bytes(maxModulus(uint(len(n.limbs))))
 }
 
 func natFromBytes(b []byte) *Nat {
+	// Must not use Nat.SetBytes as it's used in TestSetBytes.
 	bb := new(big.Int).SetBytes(b)
 	return NewNat().setBig(bb)
 }
 
 func modulusFromBytes(b []byte) *Modulus {
 	bb := new(big.Int).SetBytes(b)
-	return NewModulusFromBig(bb)
+	m, _ := NewModulusFromBig(bb)
+	return m
 }
 
 // maxModulus returns the biggest modulus that can fit in n limbs.
 func maxModulus(n uint) *Modulus {
-	m := big.NewInt(1)
-	m.Lsh(m, n*_W)
-	m.Sub(m, big.NewInt(1))
-	return NewModulusFromBig(m)
+	b := big.NewInt(1)
+	b.Lsh(b, n*_W)
+	b.Sub(b, big.NewInt(1))
+	m, _ := NewModulusFromBig(b)
+	return m
 }
 
 func makeBenchmarkModulus() *Modulus {
@@ -316,7 +370,7 @@
 func makeBenchmarkValue() *Nat {
 	x := make([]uint, 32)
 	for i := 0; i < 32; i++ {
-		x[i] = _MASK - 1
+		x[i]--
 	}
 	return &Nat{limbs: x}
 }
@@ -410,3 +464,17 @@
 		out.Exp(x, e, m)
 	}
 }
+
+func TestNewModFromBigZero(t *testing.T) {
+	expected := "modulus must be >= 0"
+	_, err := NewModulusFromBig(big.NewInt(0))
+	if err == nil || err.Error() != expected {
+		t.Errorf("NewModulusFromBig(0) got %q, want %q", err, expected)
+	}
+
+	expected = "modulus must be odd"
+	_, err = NewModulusFromBig(big.NewInt(2))
+	if err == nil || err.Error() != expected {
+		t.Errorf("NewModulusFromBig(2) got %q, want %q", err, expected)
+	}
+}
diff --git a/src/crypto/internal/edwards25519/edwards25519.go b/src/crypto/internal/edwards25519/edwards25519.go
index 71e9c09..e162dc8 100644
--- a/src/crypto/internal/edwards25519/edwards25519.go
+++ b/src/crypto/internal/edwards25519/edwards25519.go
@@ -26,13 +26,13 @@
 //
 // The zero value is NOT valid, and it may be used only as a receiver.
 type Point struct {
-	// The point is internally represented in extended coordinates (X, Y, Z, T)
-	// where x = X/Z, y = Y/Z, and xy = T/Z per https://eprint.iacr.org/2008/522.
-	x, y, z, t field.Element
-
 	// Make the type not comparable (i.e. used with == or as a map key), as
 	// equivalent points can be represented by different Go values.
 	_ incomparable
+
+	// The point is internally represented in extended coordinates (X, Y, Z, T)
+	// where x = X/Z, y = Y/Z, and xy = T/Z per https://eprint.iacr.org/2008/522.
+	x, y, z, t field.Element
 }
 
 type incomparable [0]func()
diff --git a/src/crypto/internal/edwards25519/field/_asm/go.mod b/src/crypto/internal/edwards25519/field/_asm/go.mod
index 1ce2b5e..24ad644 100644
--- a/src/crypto/internal/edwards25519/field/_asm/go.mod
+++ b/src/crypto/internal/edwards25519/field/_asm/go.mod
@@ -1,4 +1,4 @@
-module asm
+module std/crypto/internal/edwards25519/field/_asm
 
 go 1.19
 
diff --git a/src/crypto/internal/edwards25519/field/fe_generic.go b/src/crypto/internal/edwards25519/field/fe_generic.go
index d6667b2..3582df8 100644
--- a/src/crypto/internal/edwards25519/field/fe_generic.go
+++ b/src/crypto/internal/edwards25519/field/fe_generic.go
@@ -245,7 +245,7 @@
 	v.carryPropagate()
 }
 
-// carryPropagate brings the limbs below 52 bits by applying the reduction
+// carryPropagateGeneric brings the limbs below 52 bits by applying the reduction
 // identity (a * 2²⁵⁵ + b = a * 19 + b) to the l4 carry.
 func (v *Element) carryPropagateGeneric() *Element {
 	c0 := v.l0 >> 51
diff --git a/src/crypto/internal/edwards25519/scalar.go b/src/crypto/internal/edwards25519/scalar.go
index d34ecea..3fd1653 100644
--- a/src/crypto/internal/edwards25519/scalar.go
+++ b/src/crypto/internal/edwards25519/scalar.go
@@ -104,7 +104,7 @@
 // If x is not of the right length, SetUniformBytes returns nil and an error,
 // and the receiver is unchanged.
 //
-// SetUniformBytes can be used to set s to an uniformly distributed value given
+// SetUniformBytes can be used to set s to a uniformly distributed value given
 // 64 uniformly distributed random bytes.
 func (s *Scalar) SetUniformBytes(x []byte) (*Scalar, error) {
 	if len(x) != 64 {
diff --git a/src/crypto/internal/nistec/generate.go b/src/crypto/internal/nistec/generate.go
index 0204bc1..0e84cef 100644
--- a/src/crypto/internal/nistec/generate.go
+++ b/src/crypto/internal/nistec/generate.go
@@ -40,7 +40,7 @@
 		P:         "P256",
 		Element:   "fiat.P256Element",
 		Params:    elliptic.P256().Params(),
-		BuildTags: "!amd64 && !arm64 && !ppc64le",
+		BuildTags: "!amd64 && !arm64 && !ppc64le && !s390x",
 	},
 	{
 		P:       "P384",
diff --git a/src/crypto/internal/nistec/nistec_test.go b/src/crypto/internal/nistec/nistec_test.go
index 9103608c..0d4e7dc 100644
--- a/src/crypto/internal/nistec/nistec_test.go
+++ b/src/crypto/internal/nistec/nistec_test.go
@@ -19,7 +19,7 @@
 	testenv.SkipIfOptimizationOff(t)
 
 	t.Run("P224", func(t *testing.T) {
-		if allocs := testing.AllocsPerRun(100, func() {
+		if allocs := testing.AllocsPerRun(10, func() {
 			p := nistec.NewP224Point().SetGenerator()
 			scalar := make([]byte, 28)
 			rand.Read(scalar)
@@ -38,7 +38,7 @@
 		}
 	})
 	t.Run("P256", func(t *testing.T) {
-		if allocs := testing.AllocsPerRun(100, func() {
+		if allocs := testing.AllocsPerRun(10, func() {
 			p := nistec.NewP256Point().SetGenerator()
 			scalar := make([]byte, 32)
 			rand.Read(scalar)
@@ -57,7 +57,7 @@
 		}
 	})
 	t.Run("P384", func(t *testing.T) {
-		if allocs := testing.AllocsPerRun(100, func() {
+		if allocs := testing.AllocsPerRun(10, func() {
 			p := nistec.NewP384Point().SetGenerator()
 			scalar := make([]byte, 48)
 			rand.Read(scalar)
@@ -76,7 +76,7 @@
 		}
 	})
 	t.Run("P521", func(t *testing.T) {
-		if allocs := testing.AllocsPerRun(100, func() {
+		if allocs := testing.AllocsPerRun(10, func() {
 			p := nistec.NewP521Point().SetGenerator()
 			scalar := make([]byte, 66)
 			rand.Read(scalar)
@@ -133,21 +133,13 @@
 	p1 := newPoint().Double(p)
 	p2 := newPoint().Add(p, p)
 	p3, err := newPoint().ScalarMult(p, two)
-	if err != nil {
-		t.Fatal(err)
-	}
+	fatalIfErr(t, err)
 	p4, err := newPoint().ScalarBaseMult(two)
-	if err != nil {
-		t.Fatal(err)
-	}
+	fatalIfErr(t, err)
 	p5, err := newPoint().ScalarMult(p, nPlusTwo)
-	if err != nil {
-		t.Fatal(err)
-	}
+	fatalIfErr(t, err)
 	p6, err := newPoint().ScalarBaseMult(nPlusTwo)
-	if err != nil {
-		t.Fatal(err)
-	}
+	fatalIfErr(t, err)
 
 	if !bytes.Equal(p1.Bytes(), p2.Bytes()) {
 		t.Error("P+P != 2*P")
@@ -192,6 +184,23 @@
 			t.Error("[k]G != ScalarBaseMult(k)")
 		}
 
+		expectInfinity := new(big.Int).Mod(new(big.Int).SetBytes(scalar), c.Params().N).Sign() == 0
+		if expectInfinity {
+			if !bytes.Equal(p1.Bytes(), newPoint().Bytes()) {
+				t.Error("ScalarBaseMult(k) != ∞")
+			}
+			if !bytes.Equal(p2.Bytes(), newPoint().Bytes()) {
+				t.Error("[k]G != ∞")
+			}
+		} else {
+			if bytes.Equal(p1.Bytes(), newPoint().Bytes()) {
+				t.Error("ScalarBaseMult(k) == ∞")
+			}
+			if bytes.Equal(p2.Bytes(), newPoint().Bytes()) {
+				t.Error("[k]G == ∞")
+			}
+		}
+
 		d := new(big.Int).SetBytes(scalar)
 		d.Sub(c.Params().N, d)
 		d.Mod(d, c.Params().N)
@@ -230,10 +239,15 @@
 			checkScalar(t, s.FillBytes(make([]byte, byteLen)))
 		})
 	}
-	// Test N+1...N+32 since they risk overlapping with precomputed table values
+	for i := 0; i <= 64; i++ {
+		t.Run(fmt.Sprintf("%d", i), func(t *testing.T) {
+			checkScalar(t, big.NewInt(int64(i)).FillBytes(make([]byte, byteLen)))
+		})
+	}
+	// Test N-64...N+64 since they risk overlapping with precomputed table values
 	// in the final additions.
-	for i := int64(2); i <= 32; i++ {
-		t.Run(fmt.Sprintf("N+%d", i), func(t *testing.T) {
+	for i := int64(-64); i <= 64; i++ {
+		t.Run(fmt.Sprintf("N%+d", i), func(t *testing.T) {
 			checkScalar(t, new(big.Int).Add(c.Params().N, big.NewInt(i)).Bytes())
 		})
 	}
diff --git a/src/crypto/internal/nistec/p256_asm_ppc64le.s b/src/crypto/internal/nistec/p256_asm_ppc64le.s
index 0593ef3..6b78760 100644
--- a/src/crypto/internal/nistec/p256_asm_ppc64le.s
+++ b/src/crypto/internal/nistec/p256_asm_ppc64le.s
@@ -1208,7 +1208,7 @@
 	BR	sqrLoop
 
 done:
-        MOVD $p256mul<>+0x00(SB), CPOOL
+	MOVD $p256mul<>+0x00(SB), CPOOL
 
 	XXPERMDI T0, T0, $2, T0
 	XXPERMDI T1, T1, $2, T1
diff --git a/src/crypto/md5/md5block_decl.go b/src/crypto/md5/md5block_decl.go
index 6716a0c..f1fb34c 100644
--- a/src/crypto/md5/md5block_decl.go
+++ b/src/crypto/md5/md5block_decl.go
@@ -9,5 +9,4 @@
 const haveAsm = true
 
 //go:noescape
-
 func block(dig *digest, p []byte)
diff --git a/src/crypto/rand/rand.go b/src/crypto/rand/rand.go
index af85b96..62738e2 100644
--- a/src/crypto/rand/rand.go
+++ b/src/crypto/rand/rand.go
@@ -11,12 +11,13 @@
 // Reader is a global, shared instance of a cryptographically
 // secure random number generator.
 //
-// On Linux, FreeBSD, Dragonfly and Solaris, Reader uses getrandom(2) if
+// On Linux, FreeBSD, Dragonfly, NetBSD and Solaris, Reader uses getrandom(2) if
 // available, /dev/urandom otherwise.
 // On OpenBSD and macOS, Reader uses getentropy(2).
 // On other Unix-like systems, Reader reads from /dev/urandom.
 // On Windows systems, Reader uses the RtlGenRandom API.
-// On Wasm, Reader uses the Web Crypto API.
+// On JS/Wasm, Reader uses the Web Crypto API.
+// On WASIP1/Wasm, Reader uses random_get from wasi_snapshot_preview1.
 var Reader io.Reader
 
 // Read is a helper function that calls Reader.Read using io.ReadFull.
diff --git a/src/crypto/rand/rand_getrandom.go b/src/crypto/rand/rand_getrandom.go
index 478aa5c..46c4133 100644
--- a/src/crypto/rand/rand_getrandom.go
+++ b/src/crypto/rand/rand_getrandom.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build linux || freebsd || dragonfly || solaris
+//go:build dragonfly || freebsd || linux || netbsd || solaris
 
 package rand
 
@@ -21,7 +21,7 @@
 		//     is returned by a single call to getrandom() on systems where int
 		//     has a size of 32 bits.
 		maxGetRandomRead = (1 << 25) - 1
-	case "freebsd", "dragonfly", "solaris", "illumos":
+	case "dragonfly", "freebsd", "illumos", "netbsd", "solaris":
 		maxGetRandomRead = 1 << 8
 	default:
 		panic("no maximum specified for GetRandom")
diff --git a/src/crypto/rand/rand_js.go b/src/crypto/rand/rand_js.go
index 91e69fa..d8fe815 100644
--- a/src/crypto/rand/rand_js.go
+++ b/src/crypto/rand/rand_js.go
@@ -8,8 +8,15 @@
 
 import "syscall/js"
 
+// The maximum buffer size for crypto.getRandomValues is 65536 bytes.
+// https://developer.mozilla.org/en-US/docs/Web/API/Crypto/getRandomValues#exceptions
+const maxGetRandomRead = 64 << 10
+
+var batchedGetRandom func([]byte) error
+
 func init() {
 	Reader = &reader{}
+	batchedGetRandom = batched(getRandom, maxGetRandomRead)
 }
 
 var jsCrypto = js.Global().Get("crypto")
@@ -21,8 +28,15 @@
 type reader struct{}
 
 func (r *reader) Read(b []byte) (int, error) {
+	if err := batchedGetRandom(b); err != nil {
+		return 0, err
+	}
+	return len(b), nil
+}
+
+func getRandom(b []byte) error {
 	a := uint8Array.New(len(b))
 	jsCrypto.Call("getRandomValues", a)
 	js.CopyBytesToGo(b, a)
-	return len(b), nil
+	return nil
 }
diff --git a/src/crypto/rand/rand_wasip1.go b/src/crypto/rand/rand_wasip1.go
new file mode 100644
index 0000000..984f99d
--- /dev/null
+++ b/src/crypto/rand/rand_wasip1.go
@@ -0,0 +1,27 @@
+// Copyright 2023 The Go 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:build wasip1
+
+package rand
+
+import "syscall"
+
+func init() {
+	Reader = &reader{}
+}
+
+type reader struct{}
+
+func (r *reader) Read(b []byte) (int, error) {
+	// This uses the wasi_snapshot_preview1 random_get syscall defined in
+	// https://github.com/WebAssembly/WASI/blob/23a52736049f4327dd335434851d5dc40ab7cad1/legacy/preview1/docs.md#-random_getbuf-pointeru8-buf_len-size---result-errno.
+	// The definition does not explicitly guarantee that the entire buffer will
+	// be filled, but this appears to be the case in all runtimes tested.
+	err := syscall.RandomGet(b)
+	if err != nil {
+		return 0, err
+	}
+	return len(b), nil
+}
diff --git a/src/crypto/rsa/pkcs1v15.go b/src/crypto/rsa/pkcs1v15.go
index e51b9d2..55fea1a 100644
--- a/src/crypto/rsa/pkcs1v15.go
+++ b/src/crypto/rsa/pkcs1v15.go
@@ -31,7 +31,10 @@
 //
 // The random parameter is used as a source of entropy to ensure that
 // encrypting the same message twice doesn't result in the same
-// ciphertext.
+// ciphertext. Most applications should use [crypto/rand.Reader]
+// as random. Note that the returned ciphertext does not depend
+// deterministically on the bytes read from random, and may change
+// between calls and/or between versions.
 //
 // WARNING: use of this function to encrypt plaintexts other than
 // session keys is dangerous. Use RSA OAEP in new protocols.
@@ -79,7 +82,7 @@
 }
 
 // DecryptPKCS1v15 decrypts a plaintext using RSA and the padding scheme from PKCS #1 v1.5.
-// The random parameter is legacy and ignored, and it can be as nil.
+// The random parameter is legacy and ignored, and it can be nil.
 //
 // Note that whether this function returns an error or not discloses secret
 // information. If an attacker can cause this function to run repeatedly and
@@ -113,25 +116,40 @@
 	return out[index:], nil
 }
 
-// DecryptPKCS1v15SessionKey decrypts a session key using RSA and the padding scheme from PKCS #1 v1.5.
-// The random parameter is legacy and ignored, and it can be as nil.
-// 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).
+// DecryptPKCS1v15SessionKey decrypts a session key using RSA and the padding
+// scheme from PKCS #1 v1.5. The random parameter is legacy and ignored, and it
+// can be nil.
+//
+// DecryptPKCS1v15SessionKey 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.
 //
 // Note that if the session key is too small then it may be possible for an
-// attacker to brute-force it. If they can do that then they can learn whether
-// a random value was used (because it'll be different for the same ciphertext)
-// and thus whether the padding was correct. This defeats the point of this
+// attacker to brute-force it. If they can do that then they can learn whether a
+// random value was used (because it'll be different for the same ciphertext)
+// and thus whether the padding was correct. This also defeats the point of this
 // function. Using at least a 16-byte key will protect against this attack.
+//
+// This method implements protections against Bleichenbacher chosen ciphertext
+// attacks [0] described in RFC 3218 Section 2.3.2 [1]. While these protections
+// make a Bleichenbacher attack significantly more difficult, the protections
+// are only effective if the rest of the protocol which uses
+// DecryptPKCS1v15SessionKey is designed with these considerations in mind. In
+// particular, if any subsequent operations which use the decrypted session key
+// leak any information about the key (e.g. whether it is a static or random
+// key) then the mitigations are defeated. This method must be used extremely
+// carefully, and typically should only be used when absolutely necessary for
+// compatibility with an existing protocol (such as TLS) that is designed with
+// these properties in mind.
+//
+//   - [0] “Chosen Ciphertext Attacks Against Protocols Based on the RSA Encryption
+//     Standard PKCS #1”, Daniel Bleichenbacher, Advances in Cryptology (Crypto '98)
+//   - [1] RFC 3218, Preventing the Million Message Attack on CMS,
+//     https://www.rfc-editor.org/rfc/rfc3218.html
 func DecryptPKCS1v15SessionKey(random io.Reader, priv *PrivateKey, ciphertext []byte, key []byte) error {
 	if err := checkPub(&priv.PublicKey); err != nil {
 		return err
@@ -260,7 +278,7 @@
 // function. If hash is zero, hashed is signed directly. This isn't
 // advisable except for interoperability.
 //
-// The random parameter is legacy and ignored, and it can be as nil.
+// The random parameter is legacy and ignored, and it can be nil.
 //
 // This function is deterministic. Thus, if the set of possible
 // messages is small, an attacker may be able to build a map from
diff --git a/src/crypto/rsa/pss.go b/src/crypto/rsa/pss.go
index f7d23b5..3a377cc 100644
--- a/src/crypto/rsa/pss.go
+++ b/src/crypto/rsa/pss.go
@@ -285,7 +285,17 @@
 // digest 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. If opts.Hash is set, it overrides hash.
+//
+// The signature is randomized depending on the message, key, and salt size,
+// using bytes from rand. Most applications should use [crypto/rand.Reader] as
+// rand.
 func SignPSS(rand io.Reader, priv *PrivateKey, hash crypto.Hash, digest []byte, opts *PSSOptions) ([]byte, error) {
+	// Note that while we don't commit to deterministic execution with respect
+	// to the rand stream, we also don't apply MaybeReadByte, so per Hyrum's Law
+	// it's probably relied upon by some. It's a tolerable promise because a
+	// well-specified number of random bytes is included in the signature, in a
+	// well-specified way.
+
 	if boring.Enabled && rand == boring.RandReader {
 		bkey, err := boringPrivateKey(priv)
 		if err != nil {
diff --git a/src/crypto/rsa/rsa.go b/src/crypto/rsa/rsa.go
index 11f87e8..f0aef1f 100644
--- a/src/crypto/rsa/rsa.go
+++ b/src/crypto/rsa/rsa.go
@@ -33,7 +33,6 @@
 	"crypto/internal/randutil"
 	"crypto/rand"
 	"crypto/subtle"
-	"encoding/binary"
 	"errors"
 	"hash"
 	"io"
@@ -64,7 +63,7 @@
 	if !ok {
 		return false
 	}
-	return pub.N.Cmp(xx.N) == 0 && pub.E == xx.E
+	return bigIntEqual(pub.N, xx.N) && pub.E == xx.E
 }
 
 // OAEPOptions is an interface for passing options to OAEP decryption using the
@@ -130,20 +129,26 @@
 	if !ok {
 		return false
 	}
-	if !priv.PublicKey.Equal(&xx.PublicKey) || priv.D.Cmp(xx.D) != 0 {
+	if !priv.PublicKey.Equal(&xx.PublicKey) || !bigIntEqual(priv.D, xx.D) {
 		return false
 	}
 	if len(priv.Primes) != len(xx.Primes) {
 		return false
 	}
 	for i := range priv.Primes {
-		if priv.Primes[i].Cmp(xx.Primes[i]) != 0 {
+		if !bigIntEqual(priv.Primes[i], xx.Primes[i]) {
 			return false
 		}
 	}
 	return true
 }
 
+// bigIntEqual reports whether a and b are equal leaking only their bit length
+// through timing side-channels.
+func bigIntEqual(a, b *big.Int) bool {
+	return subtle.ConstantTimeCompare(a.Bytes(), b.Bytes()) == 1
+}
+
 // Sign signs digest 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. digest must be the result of hashing the input message using
@@ -204,7 +209,7 @@
 	// differently in PKCS #1 and interoperability is sufficiently
 	// important that we mirror this.
 	//
-	// Note: these values are still filled in by Precompute for
+	// Deprecated: These values are still filled in by Precompute for
 	// backwards compatibility but are not used. Multi-prime RSA is very rare,
 	// and is implemented by this package without CRT optimizations to limit
 	// complexity.
@@ -258,8 +263,11 @@
 	return nil
 }
 
-// GenerateKey generates an RSA keypair of the given bit size using the
-// random source random (for example, crypto/rand.Reader).
+// GenerateKey generates a random RSA private key of the given bit size.
+//
+// Most applications should use [crypto/rand.Reader] as rand. Note that the
+// returned key does not depend deterministically on the bytes read from rand,
+// and may change between calls and/or between versions.
 func GenerateKey(random io.Reader, bits int) (*PrivateKey, error) {
 	return GenerateMultiPrimeKey(random, 2, bits)
 }
@@ -278,7 +286,7 @@
 // This package does not implement CRT optimizations for multi-prime RSA, so the
 // keys with more than two primes will have worse performance.
 //
-// Note: The use of this function with a number of primes different from
+// Deprecated: The use of this function with a number of primes different from
 // two is not recommended for the above security, compatibility, and performance
 // reasons. Use GenerateKey instead.
 //
@@ -286,7 +294,8 @@
 func GenerateMultiPrimeKey(random io.Reader, nprimes int, bits int) (*PrivateKey, error) {
 	randutil.MaybeReadByte(random)
 
-	if boring.Enabled && random == boring.RandReader && nprimes == 2 && (bits == 2048 || bits == 3072) {
+	if boring.Enabled && random == boring.RandReader && nprimes == 2 &&
+		(bits == 2048 || bits == 3072 || bits == 4096) {
 		bN, bE, bD, bP, bQ, bDp, bDq, bQinv, err := boring.GenerateKeyRSA(bits)
 		if err != nil {
 			return nil, err
@@ -303,6 +312,20 @@
 		if !E.IsInt64() || int64(int(e64)) != e64 {
 			return nil, errors.New("crypto/rsa: generated key exponent too large")
 		}
+
+		mn, err := bigmod.NewModulusFromBig(N)
+		if err != nil {
+			return nil, err
+		}
+		mp, err := bigmod.NewModulusFromBig(P)
+		if err != nil {
+			return nil, err
+		}
+		mq, err := bigmod.NewModulusFromBig(Q)
+		if err != nil {
+			return nil, err
+		}
+
 		key := &PrivateKey{
 			PublicKey: PublicKey{
 				N: N,
@@ -315,9 +338,9 @@
 				Dq:        Dq,
 				Qinv:      Qinv,
 				CRTValues: make([]CRTValue, 0), // non-nil, to match Precompute
-				n:         bigmod.NewModulusFromBig(N),
-				p:         bigmod.NewModulusFromBig(P),
-				q:         bigmod.NewModulusFromBig(Q),
+				n:         mn,
+				p:         mp,
+				q:         mq,
 			},
 		}
 		return key, nil
@@ -455,25 +478,21 @@
 func encrypt(pub *PublicKey, plaintext []byte) ([]byte, error) {
 	boring.Unreachable()
 
-	N := bigmod.NewModulusFromBig(pub.N)
+	// Most of the CPU time for encryption and verification is spent in this
+	// NewModulusFromBig call, because PublicKey doesn't have a Precomputed
+	// field. If performance becomes an issue, consider placing a private
+	// sync.Once on PublicKey to compute this.
+	N, err := bigmod.NewModulusFromBig(pub.N)
+	if err != nil {
+		return nil, err
+	}
 	m, err := bigmod.NewNat().SetBytes(plaintext, N)
 	if err != nil {
 		return nil, err
 	}
-	e := intToBytes(pub.E)
+	e := uint(pub.E)
 
-	return bigmod.NewNat().Exp(m, e, N).Bytes(N), nil
-}
-
-// intToBytes returns i as a big-endian slice of bytes with no leading zeroes,
-// leaking only the bit size of i through timing side-channels.
-func intToBytes(i int) []byte {
-	b := make([]byte, 8)
-	binary.BigEndian.PutUint64(b, uint64(i))
-	for len(b) > 1 && b[0] == 0 {
-		b = b[1:]
-	}
-	return b
+	return bigmod.NewNat().ExpShort(m, e, N).Bytes(N), nil
 }
 
 // EncryptOAEP encrypts the given message with RSA-OAEP.
@@ -484,6 +503,7 @@
 //
 // The random parameter is used as a source of entropy to ensure that
 // encrypting the same message twice doesn't result in the same ciphertext.
+// Most applications should use [crypto/rand.Reader] as random.
 //
 // The label parameter may contain arbitrary data that will not be encrypted,
 // but which gives important context to the message. For example, if a given
@@ -494,6 +514,12 @@
 // The message must be no longer than the length of the public modulus minus
 // twice the hash length, minus a further 2.
 func EncryptOAEP(hash hash.Hash, random io.Reader, pub *PublicKey, msg []byte, label []byte) ([]byte, error) {
+	// Note that while we don't commit to deterministic execution with respect
+	// to the random stream, we also don't apply MaybeReadByte, so per Hyrum's
+	// Law it's probably relied upon by some. It's a tolerable promise because a
+	// well-specified number of random bytes is included in the ciphertext, in a
+	// well-specified way.
+
 	if err := checkPub(pub); err != nil {
 		return nil, err
 	}
@@ -556,9 +582,25 @@
 // in the future.
 func (priv *PrivateKey) Precompute() {
 	if priv.Precomputed.n == nil && len(priv.Primes) == 2 {
-		priv.Precomputed.n = bigmod.NewModulusFromBig(priv.N)
-		priv.Precomputed.p = bigmod.NewModulusFromBig(priv.Primes[0])
-		priv.Precomputed.q = bigmod.NewModulusFromBig(priv.Primes[1])
+		// Precomputed values _should_ always be valid, but if they aren't
+		// just return. We could also panic.
+		var err error
+		priv.Precomputed.n, err = bigmod.NewModulusFromBig(priv.N)
+		if err != nil {
+			return
+		}
+		priv.Precomputed.p, err = bigmod.NewModulusFromBig(priv.Primes[0])
+		if err != nil {
+			// Unset previous values, so we either have everything or nothing
+			priv.Precomputed.n = nil
+			return
+		}
+		priv.Precomputed.q, err = bigmod.NewModulusFromBig(priv.Primes[1])
+		if err != nil {
+			// Unset previous values, so we either have everything or nothing
+			priv.Precomputed.n, priv.Precomputed.p = nil, nil
+			return
+		}
 	}
 
 	// Fill in the backwards-compatibility *big.Int values.
@@ -608,7 +650,10 @@
 		t0   = bigmod.NewNat()
 	)
 	if priv.Precomputed.n == nil {
-		N = bigmod.NewModulusFromBig(priv.N)
+		N, err = bigmod.NewModulusFromBig(priv.N)
+		if err != nil {
+			return nil, ErrDecryption
+		}
 		c, err = bigmod.NewNat().SetBytes(ciphertext, N)
 		if err != nil {
 			return nil, ErrDecryption
@@ -641,7 +686,7 @@
 	}
 
 	if check {
-		c1 := bigmod.NewNat().Exp(m, intToBytes(priv.E), N)
+		c1 := bigmod.NewNat().ExpShort(m, uint(priv.E), N)
 		if c1.Equal(c) != 1 {
 			return nil, ErrDecryption
 		}
@@ -656,7 +701,7 @@
 // Encryption and decryption of a given message must use the same hash function
 // and sha256.New() is a reasonable choice.
 //
-// The random parameter is legacy and ignored, and it can be as nil.
+// The random parameter is legacy and ignored, and it can be nil.
 //
 // The label parameter must match the value given when encrypting. See
 // EncryptOAEP for details.
diff --git a/src/crypto/sha1/sha1block.go b/src/crypto/sha1/sha1block.go
index 321d343..1c1a7c5 100644
--- a/src/crypto/sha1/sha1block.go
+++ b/src/crypto/sha1/sha1block.go
@@ -42,7 +42,7 @@
 		}
 		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)
+			w[i&0xf] = bits.RotateLeft32(tmp, 1)
 
 			f := b&c | (^b)&d
 			t := bits.RotateLeft32(a, 5) + f + e + w[i&0xf] + _K0
@@ -50,21 +50,21 @@
 		}
 		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)
+			w[i&0xf] = bits.RotateLeft32(tmp, 1)
 			f := b ^ c ^ d
 			t := bits.RotateLeft32(a, 5) + f + e + w[i&0xf] + _K1
 			a, b, c, d, e = t, a, bits.RotateLeft32(b, 30), 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)
+			w[i&0xf] = bits.RotateLeft32(tmp, 1)
 			f := ((b | c) & d) | (b & c)
 			t := bits.RotateLeft32(a, 5) + f + e + w[i&0xf] + _K2
 			a, b, c, d, e = t, a, bits.RotateLeft32(b, 30), 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)
+			w[i&0xf] = bits.RotateLeft32(tmp, 1)
 			f := b ^ c ^ d
 			t := bits.RotateLeft32(a, 5) + f + e + w[i&0xf] + _K3
 			a, b, c, d, e = t, a, bits.RotateLeft32(b, 30), c, d
diff --git a/src/crypto/sha1/sha1block_amd64.s b/src/crypto/sha1/sha1block_amd64.s
index 42f03fb..9bdf24c 100644
--- a/src/crypto/sha1/sha1block_amd64.s
+++ b/src/crypto/sha1/sha1block_amd64.s
@@ -518,7 +518,7 @@
 #define CALC_F2_POST(REG_A,REG_B,REG_C,REG_E) \
 	XORL REG_B, REG_A \
 	ADDL R12, REG_E \
-        XORL REG_C, REG_A
+	XORL REG_C, REG_A
 
 #define CALC_19 \
 	CALC_F2_PRE(0x8c,DX,CX,AX) \
diff --git a/src/crypto/sha1/sha1block_decl.go b/src/crypto/sha1/sha1block_decl.go
index 518a4b6..8e20401 100644
--- a/src/crypto/sha1/sha1block_decl.go
+++ b/src/crypto/sha1/sha1block_decl.go
@@ -7,5 +7,4 @@
 package sha1
 
 //go:noescape
-
 func block(dig *digest, p []byte)
diff --git a/src/crypto/sha256/sha256block_amd64.go b/src/crypto/sha256/sha256block_amd64.go
index 27464e2..b5d2c9b 100644
--- a/src/crypto/sha256/sha256block_amd64.go
+++ b/src/crypto/sha256/sha256block_amd64.go
@@ -7,3 +7,4 @@
 import "internal/cpu"
 
 var useAVX2 = cpu.X86.HasAVX2 && cpu.X86.HasBMI2
+var useSHA = useAVX2 && cpu.X86.HasSHA
diff --git a/src/crypto/sha256/sha256block_amd64.s b/src/crypto/sha256/sha256block_amd64.s
index f6af47c..bbde628 100644
--- a/src/crypto/sha256/sha256block_amd64.s
+++ b/src/crypto/sha256/sha256block_amd64.s
@@ -179,7 +179,7 @@
 
 #define XFER  Y9
 
-#define BYTE_FLIP_MASK 	Y13 // mask to convert LE -> BE
+#define BYTE_FLIP_MASK	Y13 // mask to convert LE -> BE
 #define X_BYTE_FLIP_MASK X13
 
 #define NUM_BYTES DX
@@ -232,14 +232,14 @@
 	RORXL    $13, a, T1;                  \ // T1 = a >> 13			// S0B
 	;                                     \
 	XORL     y1, y0;                      \ // y0 = (e>>25) ^ (e>>11)					// S1
-	XORL     g, y2;                       \ // y2 = f^g                              	// CH
+	XORL     g, y2;                       \ // y2 = f^g	// CH
 	VPADDD   XDWORD0, XTMP0, XTMP0;       \ // XTMP0 = W[-7] + W[-16]	// y1 = (e >> 6)	// S1
 	RORXL    $6, e, y1;                   \ // y1 = (e >> 6)						// S1
 	;                                     \
 	ANDL     e, y2;                       \ // y2 = (f^g)&e                         // CH
 	XORL     y1, y0;                      \ // y0 = (e>>25) ^ (e>>11) ^ (e>>6)		// S1
 	RORXL    $22, a, y1;                  \ // y1 = a >> 22							// S0A
-	ADDL     h, d;                        \ // d = k + w + h + d                     	// --
+	ADDL     h, d;                        \ // d = k + w + h + d	// --
 	;                                     \
 	ANDL     b, y3;                       \ // y3 = (a|c)&b							// MAJA
 	VPALIGNR $4, XDWORD0, XDWORD1, XTMP1; \ // XTMP1 = W[-15]
@@ -270,7 +270,7 @@
 	MOVL    a, y3;                       \ // y3 = a                       // MAJA
 	RORXL   $25, e, y0;                  \ // y0 = e >> 25					// S1A
 	RORXL   $11, e, y1;                  \ // y1 = e >> 11					// S1B
-	ADDL    (disp + 1*4)(SP)(SRND*1), h; \ // h = k + w + h         		// --
+	ADDL    (disp + 1*4)(SP)(SRND*1), h; \ // h = k + w + h		// --
 	ORL     c, y3;                       \ // y3 = a|c						// MAJA
 	;                                    \
 	VPSRLD  $3, XTMP1, XTMP4;            \ // XTMP4 = W[-15] >> 3
@@ -316,7 +316,7 @@
 	;                                    \
 	MOVL    a, y3;                       \ // y3 = a							// MAJA
 	RORXL   $25, e, y0;                  \ // y0 = e >> 25						// S1A
-	ADDL    (disp + 2*4)(SP)(SRND*1), h; \ // h = k + w + h        			// --
+	ADDL    (disp + 2*4)(SP)(SRND*1), h; \ // h = k + w + h			// --
 	;                                    \
 	VPSRLQ  $19, XTMP2, XTMP3;           \ // XTMP3 = W[-2] ror 19 {xBxA}
 	RORXL   $11, e, y1;                  \ // y1 = e >> 11						// S1B
@@ -495,7 +495,7 @@
 	;                                  \
 	XORL  T1, y1;                      \ // y1 = (a>>22) ^ (a>>13)				// S0
 	RORXL $2, a, T1;                   \ // T1 = (a >> 2)						// S0
-	ADDL  (disp + 2*4)(SP)(SRND*1), h; \ // h = k + w + h 	// --
+	ADDL  (disp + 2*4)(SP)(SRND*1), h; \ // h = k + w + h	// --
 	ORL   c, y3;                       \ // y3 = a|c								// MAJA
 	;                                  \
 	XORL  T1, y1;                      \ // y1 = (a>>22) ^ (a>>13) ^ (a>>2)		// S0
@@ -531,7 +531,7 @@
 	;                                  \
 	XORL  T1, y1;                      \ // y1 = (a>>22) ^ (a>>13)				// S0
 	RORXL $2, a, T1;                   \ // T1 = (a >> 2)						// S0
-	ADDL  (disp + 3*4)(SP)(SRND*1), h; \ // h = k + w + h 	// --
+	ADDL  (disp + 3*4)(SP)(SRND*1), h; \ // h = k + w + h	// --
 	ORL   c, y3;                       \ // y3 = a|c								// MAJA
 	;                                  \
 	XORL  T1, y1;                      \ // y1 = (a>>22) ^ (a>>13) ^ (a>>2)		// S0
@@ -550,9 +550,80 @@
 	;                                  \
 	ADDL  y3, h                        // h = t1 + S0 + MAJ					// --
 
+// Definitions for sha-ni version
+//
+// The sha-ni implementation uses Intel(R) SHA extensions SHA256RNDS2, SHA256MSG1, SHA256MSG2
+// It also reuses portions of the flip_mask (half) and K256 table (stride 32) from the avx2 version
+//
+// Reference
+// S. Gulley, et al, "New Instructions Supporting the Secure Hash
+// Algorithm on Intel® Architecture Processors", July 2013
+// https://www.intel.com/content/www/us/en/developer/articles/technical/intel-sha-extensions.html
+//
+
+#define digestPtr	DI	// input/output, base pointer to digest hash vector H0, H1, ..., H7
+#define dataPtr		SI	// input, base pointer to first input data block
+#define numBytes	DX	// input, number of input bytes to be processed
+#define sha256Constants	AX	// round contents from K256 table, indexed by round number x 32
+#define msg		X0	// input data
+#define state0		X1	// round intermediates and outputs
+#define state1		X2
+#define m0		X3	// m0, m1,... m4 -- round message temps
+#define m1		X4
+#define m2		X5
+#define m3		X6
+#define m4		X7
+#define shufMask	X8	// input data endian conversion control mask
+#define abefSave	X9	// digest hash vector inter-block buffer abef
+#define cdghSave	X10	// digest hash vector inter-block buffer cdgh
+
+#define nop(m,a)		// nop instead of final SHA256MSG1 for first and last few rounds
+
+#define sha256msg1(m,a) \	// final SHA256MSG1 for middle rounds that require it
+	SHA256MSG1		m, a
+
+#define vmov(a,b) \		// msg copy for all but rounds 12-15
+	VMOVDQA		a, b
+
+#define vmovrev(a,b) \		// reverse copy for rounds 12-15
+	VMOVDQA		b, a
+
+// sha rounds 0 to 11
+// identical with the exception of the final msg op
+// which is replaced with a nop for rounds where it is not needed
+// refer to Gulley, et al for more information
+#define rounds0to11(m,a,c,sha256Msg1)				\
+	VMOVDQU			c*16(dataPtr), msg		\
+	PSHUFB			shufMask, msg			\
+	VMOVDQA			msg, m				\
+	PADDD			(c*32)(sha256Constants), msg	\
+	SHA256RNDS2		msg, state0, state1		\
+	PSHUFD			$0x0e, msg, msg			\
+	SHA256RNDS2		msg, state1, state0		\
+	sha256Msg1		(m,a)
+
+// sha rounds 12 to 59
+// identical with the exception of the final msg op
+// and the reverse copy(m,msg) in round 12 which is required
+// after the last data load
+// refer to Gulley, et al for more information
+#define rounds12to59(m,c,a,t,sha256Msg1,movop)			\
+	movop			(m,msg)				\
+	PADDD			(c*32)(sha256Constants), msg	\
+	SHA256RNDS2		msg, state0, state1		\
+	VMOVDQA			m, m4				\
+	PALIGNR			$4, a, m4			\
+	PADDD			m4, t				\
+	SHA256MSG2		m, t				\
+	PSHUFD			$0x0e, msg, msg			\
+	SHA256RNDS2		msg, state1, state0		\
+	sha256Msg1		(m,a)
+
 TEXT ·block(SB), 0, $536-32
-	CMPB ·useAVX2(SB), $1
-	JE   avx2
+	CMPB	·useSHA(SB), $1
+	JE	sha_ni
+	CMPB	·useAVX2(SB), $1
+	JE	avx2
 
 	MOVQ p_base+8(FP), SI
 	MOVQ p_len+16(FP), DX
@@ -862,6 +933,77 @@
 	VZEROUPPER
 	RET
 
+sha_ni:
+	MOVQ		dig+0(FP), digestPtr		// init digest hash vector H0, H1,..., H7 pointer
+	MOVQ		p_base+8(FP), dataPtr		// init input data base pointer
+	MOVQ		p_len+16(FP), numBytes		// get number of input bytes to hash
+	SHRQ		$6, numBytes			// force modulo 64 input buffer length
+	SHLQ		$6, numBytes
+	CMPQ		numBytes, $0			// exit early for zero-length input buffer
+	JEQ		done
+	ADDQ		dataPtr, numBytes		// point numBytes to end of input buffer
+	VMOVDQU		(0*16)(digestPtr), state0	// load initial hash values and reorder
+	VMOVDQU		(1*16)(digestPtr), state1	// DCBA, HGFE -> ABEF, CDGH
+	PSHUFD		$0xb1, state0, state0		// CDAB
+	PSHUFD		$0x1b, state1, state1		// EFGH
+	VMOVDQA		state0, m4
+	PALIGNR		$8, state1, state0		// ABEF
+	PBLENDW		$0xf0, m4, state1		// CDGH
+	VMOVDQA		flip_mask<>(SB), shufMask
+	LEAQ		K256<>(SB), sha256Constants
+
+roundLoop:
+	// save hash values for addition after rounds
+	VMOVDQA		state0, abefSave
+	VMOVDQA		state1, cdghSave
+
+	// do rounds 0-59
+	rounds0to11	(m0,-,0,nop)			// 0-3
+	rounds0to11	(m1,m0,1,sha256msg1)		// 4-7
+	rounds0to11	(m2,m1,2,sha256msg1)		// 8-11
+	VMOVDQU		(3*16)(dataPtr), msg
+	PSHUFB		shufMask, msg
+	rounds12to59	(m3,3,m2,m0,sha256msg1,vmovrev)	// 12-15
+	rounds12to59	(m0,4,m3,m1,sha256msg1,vmov)    // 16-19
+	rounds12to59	(m1,5,m0,m2,sha256msg1,vmov)    // 20-23
+	rounds12to59	(m2,6,m1,m3,sha256msg1,vmov)    // 24-27
+	rounds12to59	(m3,7,m2,m0,sha256msg1,vmov)    // 28-31
+	rounds12to59	(m0,8,m3,m1,sha256msg1,vmov)    // 32-35
+	rounds12to59	(m1,9,m0,m2,sha256msg1,vmov)    // 36-39
+	rounds12to59	(m2,10,m1,m3,sha256msg1,vmov)   // 40-43
+	rounds12to59	(m3,11,m2,m0,sha256msg1,vmov)   // 44-47
+	rounds12to59	(m0,12,m3,m1,sha256msg1,vmov)   // 48-51
+	rounds12to59	(m1,13,m0,m2,nop,vmov)          // 52-55
+	rounds12to59	(m2,14,m1,m3,nop,vmov)		// 56-59
+
+	// do rounds 60-63
+	VMOVDQA		m3, msg
+	PADDD		(15*32)(sha256Constants), msg
+	SHA256RNDS2	msg, state0, state1
+	PSHUFD		$0x0e, msg, msg
+	SHA256RNDS2	msg, state1, state0
+
+	// add current hash values with previously saved
+	PADDD		abefSave, state0
+	PADDD		cdghSave, state1
+
+	// advance data pointer; loop until buffer empty
+	ADDQ		$64, dataPtr
+	CMPQ		numBytes, dataPtr
+	JNE		roundLoop
+
+	// write hash values back in the correct order
+	PSHUFD		$0x1b, state0, state0		// FEBA
+	PSHUFD		$0xb1, state1, state1		// DCHG
+	VMOVDQA		state0, m4
+	PBLENDW		$0xf0, state1, state0		// DCBA
+	PALIGNR		$8, m4, state1			// HGFE
+	VMOVDQU		state0, (0*16)(digestPtr)
+	VMOVDQU		state1, (1*16)(digestPtr)
+
+done:
+	RET
+
 // shuffle byte order from LE to BE
 DATA flip_mask<>+0x00(SB)/8, $0x0405060700010203
 DATA flip_mask<>+0x08(SB)/8, $0x0c0d0e0f08090a0b
diff --git a/src/crypto/sha256/sha256block_decl.go b/src/crypto/sha256/sha256block_decl.go
index 18ba1c0..7d68cd9 100644
--- a/src/crypto/sha256/sha256block_decl.go
+++ b/src/crypto/sha256/sha256block_decl.go
@@ -7,5 +7,4 @@
 package sha256
 
 //go:noescape
-
 func block(dig *digest, p []byte)
diff --git a/src/crypto/sha512/sha512block_decl.go b/src/crypto/sha512/sha512block_decl.go
index 52278ae..4ad4418 100644
--- a/src/crypto/sha512/sha512block_decl.go
+++ b/src/crypto/sha512/sha512block_decl.go
@@ -7,5 +7,4 @@
 package sha512
 
 //go:noescape
-
 func block(dig *digest, p []byte)
diff --git a/src/crypto/sha512/sha512block_ppc64x.s b/src/crypto/sha512/sha512block_ppc64x.s
index 968183d..90dbf0f 100644
--- a/src/crypto/sha512/sha512block_ppc64x.s
+++ b/src/crypto/sha512/sha512block_ppc64x.s
@@ -58,16 +58,31 @@
 #define INP	R4
 #define END	R5
 #define TBL	R6
-#define IDX	R7
 #define CNT	R8
 #define LEN	R9
-#define OFFLOAD	R11
 #define TEMP	R12
 
-#define HEX00	R0
-#define HEX10	R10
-#define HEX20	R25
-#define HEX30	R26
+#define TBL_STRT R7 // Pointer to start of kcon table.
+
+#define R_x000	R0
+#define R_x010	R10
+#define R_x020	R25
+#define R_x030	R26
+#define R_x040	R14
+#define R_x050	R15
+#define R_x060	R16
+#define R_x070	R17
+#define R_x080	R18
+#define R_x090	R19
+#define R_x0a0	R20
+#define R_x0b0	R21
+#define R_x0c0	R22
+#define R_x0d0	R23
+#define R_x0e0	R24
+#define R_x0f0	R28
+#define R_x100	R29
+#define R_x110	R27
+
 
 // V0-V7 are A-H
 // V8-V23 are used for the message schedule
@@ -254,7 +269,7 @@
 DATA  ·kcon+0x518(SB)/8, $0x0001020304050607
 GLOBL ·kcon(SB), RODATA, $1312
 
-#define SHA512ROUND0(a, b, c, d, e, f, g, h, xi) \
+#define SHA512ROUND0(a, b, c, d, e, f, g, h, xi, idx) \
 	VSEL		g, f, e, FUNC; \
 	VSHASIGMAD	$15, e, $1, S1; \
 	VADDUDM		xi, h, h; \
@@ -266,11 +281,10 @@
 	VADDUDM		KI, g, g; \
 	VADDUDM		h, d, d; \
 	VADDUDM		FUNC, S0, S0; \
-	LVX		(TBL)(IDX), KI; \
-	ADD		$16, IDX; \
+	LVX		(TBL)(idx), KI; \
 	VADDUDM		S0, h, h
 
-#define SHA512ROUND1(a, b, c, d, e, f, g, h, xi, xj, xj_1, xj_9, xj_14) \
+#define SHA512ROUND1(a, b, c, d, e, f, g, h, xi, xj, xj_1, xj_9, xj_14, idx) \
 	VSHASIGMAD	$0, xj_1, $0, s0; \
 	VSEL		g, f, e, FUNC; \
 	VSHASIGMAD	$15, e, $1, S1; \
@@ -286,8 +300,7 @@
 	VADDUDM		h, d, d; \
 	VADDUDM		FUNC, S0, S0; \
 	VADDUDM		s0, xj, xj; \
-	LVX		(TBL)(IDX), KI; \
-	ADD		$16, IDX; \
+	LVX		(TBL)(idx), KI; \
 	VADDUDM		S0, h, h; \
 	VADDUDM		s1, xj, xj
 
@@ -305,36 +318,50 @@
 	CMP	INP, END
 	BEQ	end
 
-	MOVD	$·kcon(SB), TBL
-	MOVD	R1, OFFLOAD
+	MOVD	$·kcon(SB), TBL_STRT
 
 	MOVD	R0, CNT
-	MOVWZ	$0x10, HEX10
-	MOVWZ	$0x20, HEX20
-	MOVWZ	$0x30, HEX30
+	MOVWZ	$0x010, R_x010
+	MOVWZ	$0x020, R_x020
+	MOVWZ	$0x030, R_x030
+	MOVD	$0x040, R_x040
+	MOVD	$0x050, R_x050
+	MOVD	$0x060, R_x060
+	MOVD	$0x070, R_x070
+	MOVD	$0x080, R_x080
+	MOVD	$0x090, R_x090
+	MOVD	$0x0a0, R_x0a0
+	MOVD	$0x0b0, R_x0b0
+	MOVD	$0x0c0, R_x0c0
+	MOVD	$0x0d0, R_x0d0
+	MOVD	$0x0e0, R_x0e0
+	MOVD	$0x0f0, R_x0f0
+	MOVD	$0x100, R_x100
+	MOVD	$0x110, R_x110
 
-// Generate the mask used with VPERM for LE
 
 #ifdef GOARCH_ppc64le
-	MOVWZ	$8, IDX
-	LVSL	(IDX)(R0), LEMASK
+	// Generate the mask used with VPERM for LE
+	MOVWZ	$8, TEMP
+	LVSL	(TEMP)(R0), LEMASK
 	VSPLTISB	$0x0F, KI
 	VXOR	KI, LEMASK, LEMASK
 #endif
 
-	LXVD2X	(CTX)(HEX00), VS32	// v0 = vs32
-	LXVD2X	(CTX)(HEX10), VS34	// v2 = vs34
-	LXVD2X	(CTX)(HEX20), VS36	// v4 = vs36
+	LXVD2X	(CTX)(R_x000), VS32	// v0 = vs32
+	LXVD2X	(CTX)(R_x010), VS34	// v2 = vs34
+	LXVD2X	(CTX)(R_x020), VS36	// v4 = vs36
+
 	// unpack the input values into vector registers
 	VSLDOI	$8, V0, V0, V1
-	LXVD2X	(CTX)(HEX30), VS38	// v6 = vs38
+	LXVD2X	(CTX)(R_x030), VS38	// v6 = vs38
 	VSLDOI	$8, V2, V2, V3
 	VSLDOI	$8, V4, V4, V5
 	VSLDOI	$8, V6, V6, V7
 
 loop:
-	LVX	(TBL)(HEX00), KI
-	MOVWZ	$16, IDX
+	MOVD	TBL_STRT, TBL
+	LVX	(TBL)(R_x000), KI
 
 	LXVD2X	(INP)(R0), VS40	// load v8 (=vs40) in advance
 	ADD	$16, INP
@@ -351,78 +378,73 @@
 	XXLOR	V7, V7, VS31
 
 	VADDUDM	KI, V7, V7	// h+K[i]
-	LVX	(TBL)(IDX), KI
-	ADD	$16, IDX
+	LVX	(TBL)(R_x010), KI
 
 	VPERMLE(V8,V8,LEMASK,V8)
-	SHA512ROUND0(V0, V1, V2, V3, V4, V5, V6, V7, V8)
-	LXVD2X	(INP)(R0), VS42	// load v10 (=vs42) in advance
-	ADD	$16, INP, INP
+	SHA512ROUND0(V0, V1, V2, V3, V4, V5, V6, V7, V8, R_x020)
+	LXVD2X	(INP)(R_x000), VS42	// load v10 (=vs42) in advance
 	VSLDOI	$8, V8, V8, V9
-	SHA512ROUND0(V7, V0, V1, V2, V3, V4, V5, V6, V9)
+	SHA512ROUND0(V7, V0, V1, V2, V3, V4, V5, V6, V9, R_x030)
 	VPERMLE(V10,V10,LEMASK,V10)
-	SHA512ROUND0(V6, V7, V0, V1, V2, V3, V4, V5, V10)
-	LXVD2X	(INP)(R0), VS44	// load v12 (=vs44) in advance
-	ADD	$16, INP, INP
+	SHA512ROUND0(V6, V7, V0, V1, V2, V3, V4, V5, V10, R_x040)
+	LXVD2X	(INP)(R_x010), VS44	// load v12 (=vs44) in advance
 	VSLDOI	$8, V10, V10, V11
-	SHA512ROUND0(V5, V6, V7, V0, V1, V2, V3, V4, V11)
+	SHA512ROUND0(V5, V6, V7, V0, V1, V2, V3, V4, V11, R_x050)
 	VPERMLE(V12,V12,LEMASK,V12)
-	SHA512ROUND0(V4, V5, V6, V7, V0, V1, V2, V3, V12)
-	LXVD2X	(INP)(R0), VS46	// load v14 (=vs46) in advance
-	ADD	$16, INP, INP
+	SHA512ROUND0(V4, V5, V6, V7, V0, V1, V2, V3, V12, R_x060)
+	LXVD2X	(INP)(R_x020), VS46	// load v14 (=vs46) in advance
 	VSLDOI	$8, V12, V12, V13
-	SHA512ROUND0(V3, V4, V5, V6, V7, V0, V1, V2, V13)
+	SHA512ROUND0(V3, V4, V5, V6, V7, V0, V1, V2, V13, R_x070)
 	VPERMLE(V14,V14,LEMASK,V14)
-	SHA512ROUND0(V2, V3, V4, V5, V6, V7, V0, V1, V14)
-	LXVD2X	(INP)(R0), VS48	// load v16 (=vs48) in advance
-	ADD	$16, INP, INP
+	SHA512ROUND0(V2, V3, V4, V5, V6, V7, V0, V1, V14, R_x080)
+	LXVD2X	(INP)(R_x030), VS48	// load v16 (=vs48) in advance
 	VSLDOI	$8, V14, V14, V15
-	SHA512ROUND0(V1, V2, V3, V4, V5, V6, V7, V0, V15)
+	SHA512ROUND0(V1, V2, V3, V4, V5, V6, V7, V0, V15, R_x090)
 	VPERMLE(V16,V16,LEMASK,V16)
-	SHA512ROUND0(V0, V1, V2, V3, V4, V5, V6, V7, V16)
-	LXVD2X	(INP)(R0), VS50	// load v18 (=vs50) in advance
-	ADD	$16, INP, INP
+	SHA512ROUND0(V0, V1, V2, V3, V4, V5, V6, V7, V16, R_x0a0)
+	LXVD2X	(INP)(R_x040), VS50	// load v18 (=vs50) in advance
 	VSLDOI	$8, V16, V16, V17
-	SHA512ROUND0(V7, V0, V1, V2, V3, V4, V5, V6, V17)
+	SHA512ROUND0(V7, V0, V1, V2, V3, V4, V5, V6, V17, R_x0b0)
 	VPERMLE(V18,V18,LEMASK,V18)
-	SHA512ROUND0(V6, V7, V0, V1, V2, V3, V4, V5, V18)
-	LXVD2X	(INP)(R0), VS52	// load v20 (=vs52) in advance
-	ADD	$16, INP, INP
+	SHA512ROUND0(V6, V7, V0, V1, V2, V3, V4, V5, V18, R_x0c0)
+	LXVD2X	(INP)(R_x050), VS52	// load v20 (=vs52) in advance
 	VSLDOI	$8, V18, V18, V19
-	SHA512ROUND0(V5, V6, V7, V0, V1, V2, V3, V4, V19)
+	SHA512ROUND0(V5, V6, V7, V0, V1, V2, V3, V4, V19, R_x0d0)
 	VPERMLE(V20,V20,LEMASK,V20)
-	SHA512ROUND0(V4, V5, V6, V7, V0, V1, V2, V3, V20)
-	LXVD2X	(INP)(R0), VS54	// load v22 (=vs54) in advance
-	ADD	$16, INP, INP
+	SHA512ROUND0(V4, V5, V6, V7, V0, V1, V2, V3, V20, R_x0e0)
+	LXVD2X	(INP)(R_x060), VS54	// load v22 (=vs54) in advance
 	VSLDOI	$8, V20, V20, V21
-	SHA512ROUND0(V3, V4, V5, V6, V7, V0, V1, V2, V21)
+	SHA512ROUND0(V3, V4, V5, V6, V7, V0, V1, V2, V21, R_x0f0)
 	VPERMLE(V22,V22,LEMASK,V22)
-	SHA512ROUND0(V2, V3, V4, V5, V6, V7, V0, V1, V22)
+	SHA512ROUND0(V2, V3, V4, V5, V6, V7, V0, V1, V22, R_x100)
 	VSLDOI	$8, V22, V22, V23
-	SHA512ROUND1(V1, V2, V3, V4, V5, V6, V7, V0, V23, V8, V9, V17, V22)
+	SHA512ROUND1(V1, V2, V3, V4, V5, V6, V7, V0, V23, V8, V9, V17, V22, R_x110)
 
 	MOVWZ	$4, TEMP
 	MOVWZ	TEMP, CTR
+	ADD	$0x120, TBL
+	ADD	$0x70, INP
 
 L16_xx:
-	SHA512ROUND1(V0, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V18, V23)
-	SHA512ROUND1(V7, V0, V1, V2, V3, V4, V5, V6, V9, V10, V11, V19, V8)
-	SHA512ROUND1(V6, V7, V0, V1, V2, V3, V4, V5, V10, V11, V12, V20, V9)
-	SHA512ROUND1(V5, V6, V7, V0, V1, V2, V3, V4, V11, V12, V13, V21, V10)
-	SHA512ROUND1(V4, V5, V6, V7, V0, V1, V2, V3, V12, V13, V14, V22, V11)
-	SHA512ROUND1(V3, V4, V5, V6, V7, V0, V1, V2, V13, V14, V15, V23, V12)
-	SHA512ROUND1(V2, V3, V4, V5, V6, V7, V0, V1, V14, V15, V16, V8, V13)
-	SHA512ROUND1(V1, V2, V3, V4, V5, V6, V7, V0, V15, V16, V17, V9, V14)
-	SHA512ROUND1(V0, V1, V2, V3, V4, V5, V6, V7, V16, V17, V18, V10, V15)
-	SHA512ROUND1(V7, V0, V1, V2, V3, V4, V5, V6, V17, V18, V19, V11, V16)
-	SHA512ROUND1(V6, V7, V0, V1, V2, V3, V4, V5, V18, V19, V20, V12, V17)
-	SHA512ROUND1(V5, V6, V7, V0, V1, V2, V3, V4, V19, V20, V21, V13, V18)
-	SHA512ROUND1(V4, V5, V6, V7, V0, V1, V2, V3, V20, V21, V22, V14, V19)
-	SHA512ROUND1(V3, V4, V5, V6, V7, V0, V1, V2, V21, V22, V23, V15, V20)
-	SHA512ROUND1(V2, V3, V4, V5, V6, V7, V0, V1, V22, V23, V8, V16, V21)
-	SHA512ROUND1(V1, V2, V3, V4, V5, V6, V7, V0, V23, V8, V9, V17, V22)
+	SHA512ROUND1(V0, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V18, V23, R_x000)
+	SHA512ROUND1(V7, V0, V1, V2, V3, V4, V5, V6, V9, V10, V11, V19, V8, R_x010)
+	SHA512ROUND1(V6, V7, V0, V1, V2, V3, V4, V5, V10, V11, V12, V20, V9, R_x020)
+	SHA512ROUND1(V5, V6, V7, V0, V1, V2, V3, V4, V11, V12, V13, V21, V10, R_x030)
+	SHA512ROUND1(V4, V5, V6, V7, V0, V1, V2, V3, V12, V13, V14, V22, V11, R_x040)
+	SHA512ROUND1(V3, V4, V5, V6, V7, V0, V1, V2, V13, V14, V15, V23, V12, R_x050)
+	SHA512ROUND1(V2, V3, V4, V5, V6, V7, V0, V1, V14, V15, V16, V8, V13, R_x060)
+	SHA512ROUND1(V1, V2, V3, V4, V5, V6, V7, V0, V15, V16, V17, V9, V14, R_x070)
+	SHA512ROUND1(V0, V1, V2, V3, V4, V5, V6, V7, V16, V17, V18, V10, V15, R_x080)
+	SHA512ROUND1(V7, V0, V1, V2, V3, V4, V5, V6, V17, V18, V19, V11, V16, R_x090)
+	SHA512ROUND1(V6, V7, V0, V1, V2, V3, V4, V5, V18, V19, V20, V12, V17, R_x0a0)
+	SHA512ROUND1(V5, V6, V7, V0, V1, V2, V3, V4, V19, V20, V21, V13, V18, R_x0b0)
+	SHA512ROUND1(V4, V5, V6, V7, V0, V1, V2, V3, V20, V21, V22, V14, V19, R_x0c0)
+	SHA512ROUND1(V3, V4, V5, V6, V7, V0, V1, V2, V21, V22, V23, V15, V20, R_x0d0)
+	SHA512ROUND1(V2, V3, V4, V5, V6, V7, V0, V1, V22, V23, V8, V16, V21, R_x0e0)
+	SHA512ROUND1(V1, V2, V3, V4, V5, V6, V7, V0, V23, V8, V9, V17, V22, R_x0f0)
+	ADD	$0x100, TBL
 
-	BC	0x10, 0, L16_xx		// bdnz
+	BDNZ	L16_xx
 
 	XXLOR	VS24, VS24, V10
 	XXLOR	VS25, VS25, V11
@@ -455,10 +477,10 @@
 	VPERM	V5, V4, KI, V4
 	VPERM	V7, V6, KI, V6
 #endif
-	STXVD2X	VS32, (CTX+HEX00)	// v0 = vs32
-	STXVD2X	VS34, (CTX+HEX10)	// v2 = vs34
-	STXVD2X	VS36, (CTX+HEX20)	// v4 = vs36
-	STXVD2X	VS38, (CTX+HEX30)	// v6 = vs38
+	STXVD2X	VS32, (CTX+R_x000)	// v0 = vs32
+	STXVD2X	VS34, (CTX+R_x010)	// v2 = vs34
+	STXVD2X	VS36, (CTX+R_x020)	// v4 = vs36
+	STXVD2X	VS38, (CTX+R_x030)	// v6 = vs38
 
 end:
 	RET
diff --git a/src/crypto/subtle/xor_generic.go b/src/crypto/subtle/xor_generic.go
index 482fcf9..7dc89e3 100644
--- a/src/crypto/subtle/xor_generic.go
+++ b/src/crypto/subtle/xor_generic.go
@@ -46,7 +46,13 @@
 // words returns a []uintptr pointing at the same data as x,
 // with any trailing partial word removed.
 func words(x []byte) []uintptr {
-	return unsafe.Slice((*uintptr)(unsafe.Pointer(&x[0])), uintptr(len(x))/wordSize)
+	n := uintptr(len(x)) / wordSize
+	if n == 0 {
+		// Avoid creating a *uintptr that refers to data smaller than a uintptr;
+		// see issue 59334.
+		return nil
+	}
+	return unsafe.Slice((*uintptr)(unsafe.Pointer(&x[0])), n)
 }
 
 func xorLoop[T byte | uintptr](dst, x, y []T) {
diff --git a/src/crypto/tls/alert.go b/src/crypto/tls/alert.go
index 4790b73..33022cd 100644
--- a/src/crypto/tls/alert.go
+++ b/src/crypto/tls/alert.go
@@ -6,6 +6,16 @@
 
 import "strconv"
 
+// An AlertError is a TLS alert.
+//
+// When using a QUIC transport, QUICConn methods will return an error
+// which wraps AlertError rather than sending a TLS alert.
+type AlertError uint8
+
+func (e AlertError) Error() string {
+	return alert(e).String()
+}
+
 type alert uint8
 
 const (
diff --git a/src/crypto/tls/cache.go b/src/crypto/tls/cache.go
index fc8f2c0..a767761 100644
--- a/src/crypto/tls/cache.go
+++ b/src/crypto/tls/cache.go
@@ -22,7 +22,7 @@
 // multiple Conns. Returned references should not be mutated by callers. Certificates
 // are still safe to use after they are removed from the cache.
 //
-// Certificates are returned wrapped in a activeCert struct that should be held by
+// Certificates are returned wrapped in an activeCert struct that should be held by
 // the caller. When references to the activeCert are freed, the number of references
 // to the certificate in the cache is decremented. Once the number of references
 // reaches zero, the entry is evicted from the cache.
@@ -39,7 +39,7 @@
 	sync.Map
 }
 
-var clientCertCache = new(certCache)
+var globalCertCache = new(certCache)
 
 // activeCert is a handle to a certificate held in the cache. Once there are
 // no alive activeCerts for a given certificate, the certificate is removed
@@ -49,7 +49,7 @@
 }
 
 // active increments the number of references to the entry, wraps the
-// certificate in the entry in a activeCert, and sets the finalizer.
+// certificate in the entry in an activeCert, and sets the finalizer.
 //
 // Note that there is a race between active and the finalizer set on the
 // returned activeCert, triggered if active is called after the ref count is
diff --git a/src/crypto/tls/cipher_suites.go b/src/crypto/tls/cipher_suites.go
index 04e6dfe..589e8b6 100644
--- a/src/crypto/tls/cipher_suites.go
+++ b/src/crypto/tls/cipher_suites.go
@@ -377,14 +377,6 @@
 	TLS_AES_256_GCM_SHA384: true,
 }
 
-var nonAESGCMAEADCiphers = map[uint16]bool{
-	// TLS 1.2
-	TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305:   true,
-	TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305: true,
-	// TLS 1.3
-	TLS_CHACHA20_POLY1305_SHA256: true,
-}
-
 // aesgcmPreferred returns whether the first known cipher in the preference list
 // is an AES-GCM cipher, implying the peer has hardware support for it.
 func aesgcmPreferred(ciphers []uint16) bool {
diff --git a/src/crypto/tls/common.go b/src/crypto/tls/common.go
index 5394d64..e0885a0 100644
--- a/src/crypto/tls/common.go
+++ b/src/crypto/tls/common.go
@@ -36,6 +36,26 @@
 	VersionSSL30 = 0x0300
 )
 
+// VersionName returns the name for the provided TLS version number
+// (e.g. "TLS 1.3"), or a fallback representation of the value if the
+// version is not implemented by this package.
+func VersionName(version uint16) string {
+	switch version {
+	case VersionSSL30:
+		return "SSLv3"
+	case VersionTLS10:
+		return "TLS 1.0"
+	case VersionTLS11:
+		return "TLS 1.1"
+	case VersionTLS12:
+		return "TLS 1.2"
+	case VersionTLS13:
+		return "TLS 1.3"
+	default:
+		return fmt.Sprintf("0x%04X", version)
+	}
+}
+
 const (
 	maxPlaintext       = 16384        // maximum plaintext payload length
 	maxCiphertext      = 16384 + 2048 // maximum ciphertext payload length
@@ -90,6 +110,7 @@
 	extensionSignatureAlgorithms     uint16 = 13
 	extensionALPN                    uint16 = 16
 	extensionSCT                     uint16 = 18
+	extensionExtendedMasterSecret    uint16 = 23
 	extensionSessionTicket           uint16 = 35
 	extensionPreSharedKey            uint16 = 41
 	extensionEarlyData               uint16 = 42
@@ -99,6 +120,7 @@
 	extensionCertificateAuthorities  uint16 = 47
 	extensionSignatureAlgorithmsCert uint16 = 50
 	extensionKeyShare                uint16 = 51
+	extensionQUICTransportParameters uint16 = 57
 	extensionRenegotiationInfo       uint16 = 0xff01
 )
 
@@ -270,12 +292,8 @@
 	OCSPResponse []byte
 
 	// TLSUnique contains the "tls-unique" channel binding value (see RFC 5929,
-	// Section 3). This value will be nil for TLS 1.3 connections and for all
-	// resumed connections.
-	//
-	// Deprecated: there are conditions in which this value might not be unique
-	// to a connection. See the Security Considerations sections of RFC 5705 and
-	// RFC 7627, and https://mitls.org/pages/attacks/3SHAKE#channelbindings.
+	// Section 3). This value will be nil for TLS 1.3 connections and for
+	// resumed connections that don't support Extended Master Secret (RFC 7627).
 	TLSUnique []byte
 
 	// ekm is a closure exposed via ExportKeyingMaterial.
@@ -286,6 +304,10 @@
 // slice as defined in RFC 5705. If context is nil, it is not used as part of
 // the seed. If the connection was set to allow renegotiation via
 // Config.Renegotiation, this function will return an error.
+//
+// There are conditions in which the returned values might not be unique to a
+// connection. See the Security Considerations sections of RFC 5705 and RFC 7627,
+// and https://mitls.org/pages/attacks/3SHAKE#channelbindings.
 func (cs *ConnectionState) ExportKeyingMaterial(label string, context []byte, length int) ([]byte, error) {
 	return cs.ekm(label, context, length)
 }
@@ -329,25 +351,6 @@
 	}
 }
 
-// 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                // TLS version negotiated for the session
-	cipherSuite        uint16                // Ciphersuite negotiated for the session
-	masterSecret       []byte                // Full handshake MasterSecret, or TLS 1.3 resumption_master_secret
-	serverCertificates []*x509.Certificate   // Certificate chain presented by the server
-	verifiedChains     [][]*x509.Certificate // Certificate chains we built for verification
-	receivedAt         time.Time             // When the session ticket was received from the server
-	ocspResponse       []byte                // Stapled OCSP response presented by the server
-	scts               [][]byte              // SCTs presented by the server
-
-	// TLS 1.3 fields.
-	nonce  []byte    // Ticket nonce sent by the server, to derive PSK
-	useBy  time.Time // Expiration of the ticket lifetime as set by the server
-	ageAdd uint32    // Random obfuscation factor for sending the ticket age
-}
-
 // 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
@@ -601,10 +604,16 @@
 	// non-nil error, the handshake is aborted and that error results.
 	//
 	// If normal verification fails then the handshake will abort before
-	// considering this callback. If normal verification is disabled by
-	// setting InsecureSkipVerify, or (for a server) when ClientAuth is
-	// RequestClientCert or RequireAnyClientCert, then this callback will
-	// be considered but the verifiedChains argument will always be nil.
+	// considering this callback. If normal verification is disabled (on the
+	// client when InsecureSkipVerify is set, or on a server when ClientAuth is
+	// RequestClientCert or RequireAnyClientCert), then this callback will be
+	// considered but the verifiedChains argument will always be nil. When
+	// ClientAuth is NoClientCert, this callback is not called on the server.
+	// rawCerts may be empty on the server if ClientAuth is RequestClientCert or
+	// VerifyClientCertIfGiven.
+	//
+	// This callback is not invoked on resumed connections, as certificates are
+	// not re-verified on resumption.
 	//
 	// verifiedChains and its contents should not be modified.
 	VerifyPeerCertificate func(rawCerts [][]byte, verifiedChains [][]*x509.Certificate) error
@@ -615,8 +624,9 @@
 	// and that error results.
 	//
 	// If normal verification fails then the handshake will abort before
-	// considering this callback. This callback will run for all connections
-	// regardless of InsecureSkipVerify or ClientAuth settings.
+	// considering this callback. This callback will run for all connections,
+	// including resumptions, regardless of InsecureSkipVerify or ClientAuth
+	// settings.
 	VerifyConnection func(ConnectionState) error
 
 	// RootCAs defines the set of root certificate authorities
@@ -691,6 +701,35 @@
 	// session resumption. It is only used by clients.
 	ClientSessionCache ClientSessionCache
 
+	// UnwrapSession is called on the server to turn a ticket/identity
+	// previously produced by [WrapSession] into a usable session.
+	//
+	// UnwrapSession will usually either decrypt a session state in the ticket
+	// (for example with [Config.EncryptTicket]), or use the ticket as a handle
+	// to recover a previously stored state. It must use [ParseSessionState] to
+	// deserialize the session state.
+	//
+	// If UnwrapSession returns an error, the connection is terminated. If it
+	// returns (nil, nil), the session is ignored. crypto/tls may still choose
+	// not to resume the returned session.
+	UnwrapSession func(identity []byte, cs ConnectionState) (*SessionState, error)
+
+	// WrapSession is called on the server to produce a session ticket/identity.
+	//
+	// WrapSession must serialize the session state with [SessionState.Bytes].
+	// It may then encrypt the serialized state (for example with
+	// [Config.DecryptTicket]) and use it as the ticket, or store the state and
+	// return a handle for it.
+	//
+	// If WrapSession returns an error, the connection is terminated.
+	//
+	// Warning: the return value will be exposed on the wire and to clients in
+	// plaintext. The application is in charge of encrypting and authenticating
+	// it (and rotating keys) or returning high-entropy identifiers. Failing to
+	// do so correctly can compromise current, previous, and future connections
+	// depending on the protocol version.
+	WrapSession func(ConnectionState, *SessionState) ([]byte, error)
+
 	// MinVersion contains the minimum TLS version that is acceptable.
 	//
 	// By default, TLS 1.2 is currently used as the minimum when acting as a
@@ -747,10 +786,6 @@
 }
 
 const (
-	// 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.
-	ticketKeyNameLen = 16
-
 	// ticketKeyLifetime is how long a ticket key remains valid and can be used to
 	// resume a client connection.
 	ticketKeyLifetime = 7 * 24 * time.Hour // 7 days
@@ -762,9 +797,6 @@
 
 // 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
 	// created is the time at which this ticket key was created. See Config.ticketKeys.
@@ -776,15 +808,18 @@
 // bytes and this function expands that into sufficient name and key material.
 func (c *Config) 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])
+	// The first 16 bytes of the hash used to be exposed on the wire as a ticket
+	// prefix. They MUST NOT be used as a secret. In the future, it would make
+	// sense to use a proper KDF here, like HKDF with a fixed salt.
+	const legacyTicketKeyNameLen = 16
+	copy(key.aesKey[:], hashed[legacyTicketKeyNameLen:])
+	copy(key.hmacKey[:], hashed[legacyTicketKeyNameLen+len(key.aesKey):])
 	key.created = c.time()
 	return key
 }
 
 // maxSessionTicketLifetime is the maximum allowed lifetime of a TLS 1.3 session
-// ticket, and the lifetime we set for tickets we send.
+// ticket, and the lifetime we set for all tickets we send.
 const maxSessionTicketLifetime = 7 * 24 * time.Hour
 
 // Clone returns a shallow clone of c or nil if c is nil. It is safe to clone a Config that is
@@ -816,6 +851,8 @@
 		SessionTicketsDisabled:      c.SessionTicketsDisabled,
 		SessionTicketKey:            c.SessionTicketKey,
 		ClientSessionCache:          c.ClientSessionCache,
+		UnwrapSession:               c.UnwrapSession,
+		WrapSession:                 c.WrapSession,
 		MinVersion:                  c.MinVersion,
 		MaxVersion:                  c.MaxVersion,
 		CurvePreferences:            c.CurvePreferences,
diff --git a/src/crypto/tls/conn.go b/src/crypto/tls/conn.go
index 1eefb17..c04bd48 100644
--- a/src/crypto/tls/conn.go
+++ b/src/crypto/tls/conn.go
@@ -29,6 +29,7 @@
 	conn        net.Conn
 	isClient    bool
 	handshakeFn func(context.Context) error // (*Conn).clientHandshake or serverHandshake
+	quic        *quicState                  // nil for non-QUIC connections
 
 	// isHandshakeComplete is true if the connection is currently transferring
 	// application data (i.e. is not currently processing a handshake).
@@ -44,6 +45,7 @@
 	// connection so far. If renegotiation is disabled then this is either
 	// zero or one.
 	handshakes       int
+	extMasterSecret  bool
 	didResume        bool // whether this connection was a session resumption
 	cipherSuite      uint16
 	ocspResponse     []byte   // stapled OCSP response
@@ -64,7 +66,7 @@
 	// ekm is a closure for exporting keying material.
 	ekm func(label string, context []byte, length int) ([]byte, error)
 	// resumptionSecret is the resumption_master_secret for handling
-	// NewSessionTicket messages. nil if config.SessionTicketsDisabled.
+	// or sending NewSessionTicket messages.
 	resumptionSecret []byte
 
 	// ticketKeys is the set of active session ticket keys for this
@@ -176,7 +178,8 @@
 	nextCipher any       // next encryption state
 	nextMac    hash.Hash // next MAC algorithm
 
-	trafficSecret []byte // current TLS 1.3 traffic secret
+	level         QUICEncryptionLevel // current QUIC encryption level
+	trafficSecret []byte              // current TLS 1.3 traffic secret
 }
 
 type permanentError struct {
@@ -221,8 +224,9 @@
 	return nil
 }
 
-func (hc *halfConn) setTrafficSecret(suite *cipherSuiteTLS13, secret []byte) {
+func (hc *halfConn) setTrafficSecret(suite *cipherSuiteTLS13, level QUICEncryptionLevel, secret []byte) {
 	hc.trafficSecret = secret
+	hc.level = level
 	key, iv := suite.trafficKey(secret)
 	hc.cipher = suite.aead(key, iv)
 	for i := range hc.seq {
@@ -613,6 +617,10 @@
 	}
 	c.input.Reset(nil)
 
+	if c.quic != nil {
+		return c.in.setErrorLocked(errors.New("tls: internal error: attempted to read record with QUIC transport"))
+	}
+
 	// Read header, payload.
 	if err := c.readFromUntil(c.conn, recordHeaderLen); err != nil {
 		// RFC 8446, Section 6.1 suggests that EOF without an alertCloseNotify
@@ -639,10 +647,16 @@
 	}
 
 	vers := uint16(hdr[1])<<8 | uint16(hdr[2])
+	expectedVers := c.vers
+	if expectedVers == VersionTLS13 {
+		// All TLS 1.3 records are expected to have 0x0303 (1.2) after
+		// the initial hello (RFC 8446 Section 5.1).
+		expectedVers = VersionTLS12
+	}
 	n := int(hdr[3])<<8 | int(hdr[4])
-	if c.haveVers && c.vers != VersionTLS13 && vers != c.vers {
+	if c.haveVers && vers != expectedVers {
 		c.sendAlert(alertProtocolVersion)
-		msg := fmt.Sprintf("received record with version %x when expecting version %x", vers, c.vers)
+		msg := fmt.Sprintf("received record with version %x when expecting version %x", vers, expectedVers)
 		return c.in.setErrorLocked(c.newRecordHeaderError(nil, msg))
 	}
 	if !c.haveVers {
@@ -696,6 +710,9 @@
 		return c.in.setErrorLocked(c.sendAlert(alertUnexpectedMessage))
 
 	case recordTypeAlert:
+		if c.quic != nil {
+			return c.in.setErrorLocked(c.sendAlert(alertUnexpectedMessage))
+		}
 		if len(data) != 2 {
 			return c.in.setErrorLocked(c.sendAlert(alertUnexpectedMessage))
 		}
@@ -811,8 +828,12 @@
 	return err
 }
 
-// sendAlert sends a TLS alert message.
+// sendAlertLocked sends a TLS alert message.
 func (c *Conn) sendAlertLocked(err alert) error {
+	if c.quic != nil {
+		return c.out.setErrorLocked(&net.OpError{Op: "local error", Err: err})
+	}
+
 	switch err {
 	case alertNoRenegotiation, alertCloseNotify:
 		c.tmp[0] = alertLevelWarning
@@ -947,6 +968,19 @@
 // writeRecordLocked writes a TLS record with the given type and payload to the
 // connection and updates the record layer state.
 func (c *Conn) writeRecordLocked(typ recordType, data []byte) (int, error) {
+	if c.quic != nil {
+		if typ != recordTypeHandshake {
+			return 0, errors.New("tls: internal error: sending non-handshake message to QUIC transport")
+		}
+		c.quicWriteCryptoData(c.out.level, data)
+		if !c.buffering {
+			if _, err := c.flush(); err != nil {
+				return 0, err
+			}
+		}
+		return len(data), nil
+	}
+
 	outBufPtr := outBufPool.Get().(*[]byte)
 	outBuf := *outBufPtr
 	defer func() {
@@ -1031,28 +1065,40 @@
 	return err
 }
 
+// readHandshakeBytes reads handshake data until c.hand contains at least n bytes.
+func (c *Conn) readHandshakeBytes(n int) error {
+	if c.quic != nil {
+		return c.quicReadHandshakeBytes(n)
+	}
+	for c.hand.Len() < n {
+		if err := c.readRecord(); err != nil {
+			return err
+		}
+	}
+	return nil
+}
+
 // readHandshake reads the next handshake message from
 // the record layer. If transcript is non-nil, the message
 // is written to the passed transcriptHash.
 func (c *Conn) readHandshake(transcript transcriptHash) (any, error) {
-	for c.hand.Len() < 4 {
-		if err := c.readRecord(); err != nil {
-			return nil, err
-		}
+	if err := c.readHandshakeBytes(4); err != nil {
+		return nil, err
 	}
-
 	data := c.hand.Bytes()
 	n := int(data[1])<<16 | int(data[2])<<8 | int(data[3])
 	if n > maxHandshake {
 		c.sendAlertLocked(alertInternalError)
 		return nil, c.in.setErrorLocked(fmt.Errorf("tls: handshake message of length %d bytes exceeds maximum of %d bytes", n, maxHandshake))
 	}
-	for c.hand.Len() < 4+n {
-		if err := c.readRecord(); err != nil {
-			return nil, err
-		}
+	if err := c.readHandshakeBytes(4 + n); err != nil {
+		return nil, err
 	}
 	data = c.hand.Next(4 + n)
+	return c.unmarshalHandshakeMessage(data, transcript)
+}
+
+func (c *Conn) unmarshalHandshakeMessage(data []byte, transcript transcriptHash) (handshakeMessage, error) {
 	var m handshakeMessage
 	switch data[0] {
 	case typeHelloRequest:
@@ -1243,7 +1289,6 @@
 	if err != nil {
 		return err
 	}
-
 	c.retryCount++
 	if c.retryCount > maxUselessRecords {
 		c.sendAlert(alertUnexpectedMessage)
@@ -1255,20 +1300,28 @@
 		return c.handleNewSessionTicket(msg)
 	case *keyUpdateMsg:
 		return c.handleKeyUpdate(msg)
-	default:
-		c.sendAlert(alertUnexpectedMessage)
-		return fmt.Errorf("tls: received unexpected handshake message of type %T", msg)
 	}
+	// The QUIC layer is supposed to treat an unexpected post-handshake CertificateRequest
+	// as a QUIC-level PROTOCOL_VIOLATION error (RFC 9001, Section 4.4). Returning an
+	// unexpected_message alert here doesn't provide it with enough information to distinguish
+	// this condition from other unexpected messages. This is probably fine.
+	c.sendAlert(alertUnexpectedMessage)
+	return fmt.Errorf("tls: received unexpected handshake message of type %T", msg)
 }
 
 func (c *Conn) handleKeyUpdate(keyUpdate *keyUpdateMsg) error {
+	if c.quic != nil {
+		c.sendAlert(alertUnexpectedMessage)
+		return c.in.setErrorLocked(errors.New("tls: received unexpected key update message"))
+	}
+
 	cipherSuite := cipherSuiteTLS13ByID(c.cipherSuite)
 	if cipherSuite == nil {
 		return c.in.setErrorLocked(c.sendAlert(alertInternalError))
 	}
 
 	newSecret := cipherSuite.nextTrafficSecret(c.in.trafficSecret)
-	c.in.setTrafficSecret(cipherSuite, newSecret)
+	c.in.setTrafficSecret(cipherSuite, QUICEncryptionLevelInitial, newSecret)
 
 	if keyUpdate.updateRequested {
 		c.out.Lock()
@@ -1287,7 +1340,7 @@
 		}
 
 		newSecret := cipherSuite.nextTrafficSecret(c.out.trafficSecret)
-		c.out.setTrafficSecret(cipherSuite, newSecret)
+		c.out.setTrafficSecret(cipherSuite, QUICEncryptionLevelInitial, newSecret)
 	}
 
 	return nil
@@ -1414,6 +1467,11 @@
 //
 // For control over canceling or setting a timeout on a handshake, use
 // HandshakeContext or the Dialer's DialContext method instead.
+//
+// In order to avoid denial of service attacks, the maximum RSA key size allowed
+// in certificates sent by either the TLS server or client is limited to 8192
+// bits. This limit can be overridden by setting tlsmaxrsasize in the GODEBUG
+// environment variable (e.g. GODEBUG=tlsmaxrsasize=4096).
 func (c *Conn) Handshake() error {
 	return c.HandshakeContext(context.Background())
 }
@@ -1448,12 +1506,15 @@
 	// this cancellation. In the former case, we need to close the connection.
 	defer cancel()
 
-	// Start the "interrupter" goroutine, if this context might be canceled.
-	// (The background context cannot).
-	//
-	// The interrupter goroutine waits for the input context to be done and
-	// closes the connection if this happens before the function returns.
-	if ctx.Done() != nil {
+	if c.quic != nil {
+		c.quic.cancelc = handshakeCtx.Done()
+		c.quic.cancel = cancel
+	} else if ctx.Done() != nil {
+		// Start the "interrupter" goroutine, if this context might be canceled.
+		// (The background context cannot).
+		//
+		// The interrupter goroutine waits for the input context to be done and
+		// closes the connection if this happens before the function returns.
 		done := make(chan struct{})
 		interruptRes := make(chan error, 1)
 		defer func() {
@@ -1504,6 +1565,30 @@
 		panic("tls: internal error: handshake returned an error but is marked successful")
 	}
 
+	if c.quic != nil {
+		if c.handshakeErr == nil {
+			c.quicHandshakeComplete()
+			// Provide the 1-RTT read secret now that the handshake is complete.
+			// The QUIC layer MUST NOT decrypt 1-RTT packets prior to completing
+			// the handshake (RFC 9001, Section 5.7).
+			c.quicSetReadSecret(QUICEncryptionLevelApplication, c.cipherSuite, c.in.trafficSecret)
+		} else {
+			var a alert
+			c.out.Lock()
+			if !errors.As(c.out.err, &a) {
+				a = alertInternalError
+			}
+			c.out.Unlock()
+			// Return an error which wraps both the handshake error and
+			// any alert error we may have sent, or alertInternalError
+			// if we didn't send an alert.
+			// Truncate the text of the alert to 0 characters.
+			c.handshakeErr = fmt.Errorf("%w%.0w", c.handshakeErr, AlertError(a))
+		}
+		close(c.quic.blockedc)
+		close(c.quic.signalc)
+	}
+
 	return c.handshakeErr
 }
 
@@ -1527,7 +1612,7 @@
 	state.VerifiedChains = c.verifiedChains
 	state.SignedCertificateTimestamps = c.scts
 	state.OCSPResponse = c.ocspResponse
-	if !c.didResume && c.vers != VersionTLS13 {
+	if (!c.didResume || c.extMasterSecret) && c.vers != VersionTLS13 {
 		if c.clientFinishedIsFirst {
 			state.TLSUnique = c.clientFinished[:]
 		} else {
diff --git a/src/crypto/tls/conn_test.go b/src/crypto/tls/conn_test.go
index 78935b1..5e090a0 100644
--- a/src/crypto/tls/conn_test.go
+++ b/src/crypto/tls/conn_test.go
@@ -285,3 +285,35 @@
 	// This call should not deadlock.
 	tlsConn.Close()
 }
+
+func TestRecordBadVersionTLS13(t *testing.T) {
+	client, server := localPipe(t)
+	defer server.Close()
+	defer client.Close()
+
+	config := testConfig.Clone()
+	config.MinVersion, config.MaxVersion = VersionTLS13, VersionTLS13
+
+	go func() {
+		tlsConn := Client(client, config)
+		if err := tlsConn.Handshake(); err != nil {
+			t.Errorf("Error from client handshake: %v", err)
+			return
+		}
+		tlsConn.vers = 0x1111
+		tlsConn.Write([]byte{1})
+	}()
+
+	tlsConn := Server(server, config)
+	if err := tlsConn.Handshake(); err != nil {
+		t.Errorf("Error from client handshake: %v", err)
+		return
+	}
+
+	expectedErr := "tls: received record with version 1111 when expecting version 303"
+
+	_, err := tlsConn.Read(make([]byte, 10))
+	if err.Error() != expectedErr {
+		t.Fatalf("unexpected error: got %q, want %q", err, expectedErr)
+	}
+}
diff --git a/src/crypto/tls/handshake_client.go b/src/crypto/tls/handshake_client.go
index 63d86b9..4649f36 100644
--- a/src/crypto/tls/handshake_client.go
+++ b/src/crypto/tls/handshake_client.go
@@ -17,8 +17,10 @@
 	"errors"
 	"fmt"
 	"hash"
+	"internal/godebug"
 	"io"
 	"net"
+	"strconv"
 	"strings"
 	"time"
 )
@@ -31,7 +33,8 @@
 	suite        *cipherSuite
 	finishedHash finishedHash
 	masterSecret []byte
-	session      *ClientSessionState
+	session      *SessionState // the session being resumed
+	ticket       []byte        // a fresh ticket received during this handshake
 }
 
 var testingOnlyForceClientHelloSignatureAlgorithms []SignatureScheme
@@ -71,7 +74,7 @@
 		vers:                         clientHelloVersion,
 		compressionMethods:           []uint8{compressionNone},
 		random:                       make([]byte, 32),
-		sessionId:                    make([]byte, 32),
+		extendedMasterSecret:         true,
 		ocspStapling:                 true,
 		scts:                         true,
 		serverName:                   hostnameInSNI(config.ServerName),
@@ -114,8 +117,13 @@
 	// A random session ID is used to detect when the server accepted a ticket
 	// and is resuming a session (see RFC 5077). In TLS 1.3, it's always set as
 	// a compatibility measure (see RFC 8446, Section 4.1.2).
-	if _, err := io.ReadFull(config.rand(), hello.sessionId); err != nil {
-		return nil, nil, errors.New("tls: short read from Rand: " + err.Error())
+	//
+	// The session ID is not set for QUIC connections (see RFC 9001, Section 8.4).
+	if c.quic == nil {
+		hello.sessionId = make([]byte, 32)
+		if _, err := io.ReadFull(config.rand(), hello.sessionId); err != nil {
+			return nil, nil, errors.New("tls: short read from Rand: " + err.Error())
+		}
 	}
 
 	if hello.vers >= VersionTLS12 {
@@ -127,6 +135,10 @@
 
 	var key *ecdh.PrivateKey
 	if hello.supportedVersions[0] == VersionTLS13 {
+		// Reset the list of ciphers when the client only supports TLS 1.3.
+		if len(hello.supportedVersions) == 1 {
+			hello.cipherSuites = nil
+		}
 		if hasAESGCMHardwareSupport {
 			hello.cipherSuites = append(hello.cipherSuites, defaultCipherSuitesTLS13...)
 		} else {
@@ -144,6 +156,17 @@
 		hello.keyShares = []keyShare{{group: curveID, data: key.PublicKey().Bytes()}}
 	}
 
+	if c.quic != nil {
+		p, err := c.quicGetTransportParameters()
+		if err != nil {
+			return nil, nil, err
+		}
+		if p == nil {
+			p = []byte{}
+		}
+		hello.quicTransportParameters = p
+	}
+
 	return hello, key, nil
 }
 
@@ -162,11 +185,11 @@
 	}
 	c.serverName = hello.serverName
 
-	cacheKey, session, earlySecret, binderKey, err := c.loadSession(hello)
+	session, earlySecret, binderKey, err := c.loadSession(hello)
 	if err != nil {
 		return err
 	}
-	if cacheKey != "" && session != nil {
+	if session != nil {
 		defer func() {
 			// If we got a handshake failure when resuming a session, throw away
 			// the session ticket. See RFC 5077, Section 3.2.
@@ -175,7 +198,9 @@
 			// does require servers to abort on invalid binders, so we need to
 			// delete tickets to recover from a corrupted PSK.
 			if err != nil {
-				c.config.ClientSessionCache.Put(cacheKey, nil)
+				if cacheKey := c.clientSessionCacheKey(); cacheKey != "" {
+					c.config.ClientSessionCache.Put(cacheKey, nil)
+				}
 			}
 		}()
 	}
@@ -184,6 +209,16 @@
 		return err
 	}
 
+	if hello.earlyData {
+		suite := cipherSuiteTLS13ByID(session.cipherSuite)
+		transcript := suite.hash.New()
+		if err := transcriptMsg(hello, transcript); err != nil {
+			return err
+		}
+		earlyTrafficSecret := suite.deriveSecret(earlySecret, clientEarlyTrafficLabel, transcript)
+		c.quicSetWriteSecret(QUICEncryptionLevelEarly, suite.id, earlyTrafficSecret)
+	}
+
 	// serverHelloMsg is not included in the transcript
 	msg, err := c.readHandshake(nil)
 	if err != nil {
@@ -240,19 +275,13 @@
 		return err
 	}
 
-	// If we had a successful handshake and hs.session is different from
-	// the one already cached - cache a new one.
-	if cacheKey != "" && hs.session != nil && session != hs.session {
-		c.config.ClientSessionCache.Put(cacheKey, hs.session)
-	}
-
 	return nil
 }
 
-func (c *Conn) loadSession(hello *clientHelloMsg) (cacheKey string,
-	session *ClientSessionState, earlySecret, binderKey []byte, err error) {
+func (c *Conn) loadSession(hello *clientHelloMsg) (
+	session *SessionState, earlySecret, binderKey []byte, err error) {
 	if c.config.SessionTicketsDisabled || c.config.ClientSessionCache == nil {
-		return "", nil, nil, nil, nil
+		return nil, nil, nil, nil
 	}
 
 	hello.ticketSupported = true
@@ -267,69 +296,72 @@
 	// renegotiation is primarily used to allow a client to send a client
 	// certificate, which would be skipped if session resumption occurred.
 	if c.handshakes != 0 {
-		return "", nil, nil, nil, nil
+		return nil, nil, nil, nil
 	}
 
 	// Try to resume a previously negotiated TLS session, if available.
-	cacheKey = clientSessionCacheKey(c.conn.RemoteAddr(), c.config)
-	session, ok := c.config.ClientSessionCache.Get(cacheKey)
-	if !ok || session == nil {
-		return cacheKey, nil, nil, nil, nil
+	cacheKey := c.clientSessionCacheKey()
+	if cacheKey == "" {
+		return nil, nil, nil, nil
 	}
+	cs, ok := c.config.ClientSessionCache.Get(cacheKey)
+	if !ok || cs == nil {
+		return nil, nil, nil, nil
+	}
+	session = cs.session
 
 	// Check that version used for the previous session is still valid.
 	versOk := false
 	for _, v := range hello.supportedVersions {
-		if v == session.vers {
+		if v == session.version {
 			versOk = true
 			break
 		}
 	}
 	if !versOk {
-		return cacheKey, nil, nil, nil, nil
+		return nil, nil, nil, nil
 	}
 
 	// Check that the cached server certificate is not expired, and that it's
 	// valid for the ServerName. This should be ensured by the cache key, but
 	// protect the application from a faulty ClientSessionCache implementation.
+	if c.config.time().After(session.peerCertificates[0].NotAfter) {
+		// Expired certificate, delete the entry.
+		c.config.ClientSessionCache.Put(cacheKey, nil)
+		return nil, nil, nil, nil
+	}
 	if !c.config.InsecureSkipVerify {
 		if len(session.verifiedChains) == 0 {
 			// The original connection had InsecureSkipVerify, while this doesn't.
-			return cacheKey, nil, nil, nil, nil
+			return nil, nil, nil, nil
 		}
-		serverCert := session.serverCertificates[0]
-		if c.config.time().After(serverCert.NotAfter) {
-			// Expired certificate, delete the entry.
-			c.config.ClientSessionCache.Put(cacheKey, nil)
-			return cacheKey, nil, nil, nil, nil
-		}
-		if err := serverCert.VerifyHostname(c.config.ServerName); err != nil {
-			return cacheKey, nil, nil, nil, nil
+		if err := session.peerCertificates[0].VerifyHostname(c.config.ServerName); err != nil {
+			return nil, nil, nil, nil
 		}
 	}
 
-	if session.vers != VersionTLS13 {
+	if session.version != VersionTLS13 {
 		// In TLS 1.2 the cipher suite must match the resumed session. Ensure we
 		// are still offering it.
 		if mutualCipherSuite(hello.cipherSuites, session.cipherSuite) == nil {
-			return cacheKey, nil, nil, nil, nil
+			return nil, nil, nil, nil
 		}
 
-		hello.sessionTicket = session.sessionTicket
+		hello.sessionTicket = cs.ticket
 		return
 	}
 
 	// Check that the session ticket is not expired.
-	if c.config.time().After(session.useBy) {
+	if c.config.time().After(time.Unix(int64(session.useBy), 0)) {
 		c.config.ClientSessionCache.Put(cacheKey, nil)
-		return cacheKey, nil, nil, nil, nil
+		return nil, nil, nil, nil
 	}
 
 	// In TLS 1.3 the KDF hash must match the resumed session. Ensure we
 	// offer at least one cipher suite with that hash.
 	cipherSuite := cipherSuiteTLS13ByID(session.cipherSuite)
 	if cipherSuite == nil {
-		return cacheKey, nil, nil, nil, nil
+		return nil, nil, nil, nil
 	}
 	cipherSuiteOk := false
 	for _, offeredID := range hello.cipherSuites {
@@ -340,32 +372,43 @@
 		}
 	}
 	if !cipherSuiteOk {
-		return cacheKey, nil, nil, nil, nil
+		return nil, nil, nil, nil
+	}
+
+	if c.quic != nil && session.EarlyData {
+		// For 0-RTT, the cipher suite has to match exactly, and we need to be
+		// offering the same ALPN.
+		if mutualCipherSuiteTLS13(hello.cipherSuites, session.cipherSuite) != nil {
+			for _, alpn := range hello.alpnProtocols {
+				if alpn == session.alpnProtocol {
+					hello.earlyData = true
+					break
+				}
+			}
+		}
 	}
 
 	// Set the pre_shared_key extension. See RFC 8446, Section 4.2.11.1.
-	ticketAge := uint32(c.config.time().Sub(session.receivedAt) / time.Millisecond)
+	ticketAge := c.config.time().Sub(time.Unix(int64(session.createdAt), 0))
 	identity := pskIdentity{
-		label:               session.sessionTicket,
-		obfuscatedTicketAge: ticketAge + session.ageAdd,
+		label:               cs.ticket,
+		obfuscatedTicketAge: uint32(ticketAge/time.Millisecond) + session.ageAdd,
 	}
 	hello.pskIdentities = []pskIdentity{identity}
 	hello.pskBinders = [][]byte{make([]byte, cipherSuite.hash.Size())}
 
 	// Compute the PSK binders. See RFC 8446, Section 4.2.11.2.
-	psk := cipherSuite.expandLabel(session.masterSecret, "resumption",
-		session.nonce, cipherSuite.hash.Size())
-	earlySecret = cipherSuite.extract(psk, nil)
+	earlySecret = cipherSuite.extract(session.secret, nil)
 	binderKey = cipherSuite.deriveSecret(earlySecret, resumptionBinderLabel, nil)
 	transcript := cipherSuite.hash.New()
 	helloBytes, err := hello.marshalWithoutBinders()
 	if err != nil {
-		return "", nil, nil, nil, err
+		return nil, nil, nil, err
 	}
 	transcript.Write(helloBytes)
 	pskBinders := [][]byte{cipherSuite.finishedHash(binderKey, transcript)}
 	if err := hello.updateBinders(pskBinders); err != nil {
-		return "", nil, nil, nil, err
+		return nil, nil, nil, err
 	}
 
 	return
@@ -467,6 +510,9 @@
 			return err
 		}
 	}
+	if err := hs.saveSessionTicket(); err != nil {
+		return err
+	}
 
 	c.ekm = ekmFromMasterSecret(c.vers, hs.suite, hs.masterSecret, hs.hello.random, hs.serverHello.random)
 	c.isHandshakeComplete.Store(true)
@@ -605,6 +651,19 @@
 		}
 	}
 
+	if hs.serverHello.extendedMasterSecret {
+		c.extMasterSecret = true
+		hs.masterSecret = extMasterFromPreMasterSecret(c.vers, hs.suite, preMasterSecret,
+			hs.finishedHash.Sum())
+	} else {
+		hs.masterSecret = masterFromPreMasterSecret(c.vers, hs.suite, preMasterSecret,
+			hs.hello.random, hs.serverHello.random)
+	}
+	if err := c.config.writeKeyLog(keyLogLabelTLS12, hs.hello.random, hs.masterSecret); err != nil {
+		c.sendAlert(alertInternalError)
+		return errors.New("tls: failed to write to key log: " + err.Error())
+	}
+
 	if chainToSend != nil && len(chainToSend.Certificate) > 0 {
 		certVerify := &certificateVerifyMsg{}
 
@@ -652,12 +711,6 @@
 		}
 	}
 
-	hs.masterSecret = masterFromPreMasterSecret(c.vers, hs.suite, preMasterSecret, hs.hello.random, hs.serverHello.random)
-	if err := c.config.writeKeyLog(keyLogLabelTLS12, hs.hello.random, hs.masterSecret); err != nil {
-		c.sendAlert(alertInternalError)
-		return errors.New("tls: failed to write to key log: " + err.Error())
-	}
-
 	hs.finishedHash.discardHandshakeBuffer()
 
 	return nil
@@ -722,7 +775,7 @@
 		}
 	}
 
-	if err := checkALPN(hs.hello.alpnProtocols, hs.serverHello.alpnProtocol); err != nil {
+	if err := checkALPN(hs.hello.alpnProtocols, hs.serverHello.alpnProtocol, false); err != nil {
 		c.sendAlert(alertUnsupportedExtension)
 		return false, err
 	}
@@ -734,7 +787,7 @@
 		return false, nil
 	}
 
-	if hs.session.vers != c.vers {
+	if hs.session.version != c.vers {
 		c.sendAlert(alertHandshakeFailure)
 		return false, errors.New("tls: server resumed a session with a different version")
 	}
@@ -744,9 +797,17 @@
 		return false, errors.New("tls: server resumed a session with a different cipher suite")
 	}
 
-	// Restore masterSecret, peerCerts, and ocspResponse from previous state
-	hs.masterSecret = hs.session.masterSecret
-	c.peerCertificates = hs.session.serverCertificates
+	// RFC 7627, Section 5.3
+	if hs.session.extMasterSecret != hs.serverHello.extendedMasterSecret {
+		c.sendAlert(alertHandshakeFailure)
+		return false, errors.New("tls: server resumed a session with a different EMS extension")
+	}
+
+	// Restore master secret and certificates from previous state
+	hs.masterSecret = hs.session.secret
+	c.extMasterSecret = hs.session.extMasterSecret
+	c.peerCertificates = hs.session.peerCertificates
+	c.activeCertHandles = hs.c.activeCertHandles
 	c.verifiedChains = hs.session.verifiedChains
 	c.ocspResponse = hs.session.ocspResponse
 	// Let the ServerHello SCTs override the session SCTs from the original
@@ -760,8 +821,12 @@
 
 // checkALPN ensure that the server's choice of ALPN protocol is compatible with
 // the protocols that we advertised in the Client Hello.
-func checkALPN(clientProtos []string, serverProto string) error {
+func checkALPN(clientProtos []string, serverProto string, quic bool) error {
 	if serverProto == "" {
+		if quic && len(clientProtos) > 0 {
+			// RFC 9001, Section 8.1
+			return errors.New("tls: server did not select an ALPN protocol")
+		}
 		return nil
 	}
 	if len(clientProtos) == 0 {
@@ -814,8 +879,13 @@
 	if !hs.serverHello.ticketSupported {
 		return nil
 	}
-
 	c := hs.c
+
+	if !hs.hello.ticketSupported {
+		c.sendAlert(alertIllegalParameter)
+		return errors.New("tls: server sent unrequested session ticket")
+	}
+
 	msg, err := c.readHandshake(&hs.finishedHash)
 	if err != nil {
 		return err
@@ -826,18 +896,29 @@
 		return unexpectedMessageError(sessionTicketMsg, msg)
 	}
 
-	hs.session = &ClientSessionState{
-		sessionTicket:      sessionTicketMsg.ticket,
-		vers:               c.vers,
-		cipherSuite:        hs.suite.id,
-		masterSecret:       hs.masterSecret,
-		serverCertificates: c.peerCertificates,
-		verifiedChains:     c.verifiedChains,
-		receivedAt:         c.config.time(),
-		ocspResponse:       c.ocspResponse,
-		scts:               c.scts,
+	hs.ticket = sessionTicketMsg.ticket
+	return nil
+}
+
+func (hs *clientHandshakeState) saveSessionTicket() error {
+	if hs.ticket == nil {
+		return nil
+	}
+	c := hs.c
+
+	cacheKey := c.clientSessionCacheKey()
+	if cacheKey == "" {
+		return nil
 	}
 
+	session, err := c.sessionState()
+	if err != nil {
+		return err
+	}
+	session.secret = hs.masterSecret
+
+	cs := &ClientSessionState{ticket: hs.ticket, session: session}
+	c.config.ClientSessionCache.Put(cacheKey, cs)
 	return nil
 }
 
@@ -857,17 +938,42 @@
 	return nil
 }
 
+// defaultMaxRSAKeySize is the maximum RSA key size in bits that we are willing
+// to verify the signatures of during a TLS handshake.
+const defaultMaxRSAKeySize = 8192
+
+var tlsmaxrsasize = godebug.New("tlsmaxrsasize")
+
+func checkKeySize(n int) (max int, ok bool) {
+	if v := tlsmaxrsasize.Value(); v != "" {
+		if max, err := strconv.Atoi(v); err == nil {
+			if (n <= max) != (n <= defaultMaxRSAKeySize) {
+				tlsmaxrsasize.IncNonDefault()
+			}
+			return max, n <= max
+		}
+	}
+	return defaultMaxRSAKeySize, n <= defaultMaxRSAKeySize
+}
+
 // verifyServerCertificate parses and verifies the provided chain, setting
 // c.verifiedChains and c.peerCertificates or sending the appropriate alert.
 func (c *Conn) verifyServerCertificate(certificates [][]byte) error {
 	activeHandles := make([]*activeCert, len(certificates))
 	certs := make([]*x509.Certificate, len(certificates))
 	for i, asn1Data := range certificates {
-		cert, err := clientCertCache.newCert(asn1Data)
+		cert, err := globalCertCache.newCert(asn1Data)
 		if err != nil {
 			c.sendAlert(alertBadCertificate)
 			return errors.New("tls: failed to parse certificate from server: " + err.Error())
 		}
+		if cert.cert.PublicKeyAlgorithm == x509.RSA {
+			n := cert.cert.PublicKey.(*rsa.PublicKey).N.BitLen()
+			if max, ok := checkKeySize(n); !ok {
+				c.sendAlert(alertBadCertificate)
+				return fmt.Errorf("tls: server sent certificate containing RSA key larger than %d bits", max)
+			}
+		}
 		activeHandles[i] = cert
 		certs[i] = cert.cert
 	}
@@ -1003,11 +1109,14 @@
 
 // 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
+func (c *Conn) clientSessionCacheKey() string {
+	if len(c.config.ServerName) > 0 {
+		return c.config.ServerName
 	}
-	return serverAddr.String()
+	if c.conn != nil {
+		return c.conn.RemoteAddr().String()
+	}
+	return ""
 }
 
 // hostnameInSNI converts name into an appropriate hostname for SNI.
diff --git a/src/crypto/tls/handshake_client_test.go b/src/crypto/tls/handshake_client_test.go
index 749c9fc..a2052ceb 100644
--- a/src/crypto/tls/handshake_client_test.go
+++ b/src/crypto/tls/handshake_client_test.go
@@ -900,6 +900,7 @@
 	}
 
 	testResumeState := func(test string, didResume bool) {
+		t.Helper()
 		_, hs, err := testHandshake(t, clientConfig, serverConfig)
 		if err != nil {
 			t.Fatalf("%s: handshake failed: %s", test, err)
@@ -916,14 +917,14 @@
 	}
 
 	getTicket := func() []byte {
-		return clientConfig.ClientSessionCache.(*lruSessionCache).q.Front().Value.(*lruSessionCacheEntry).state.sessionTicket
+		return clientConfig.ClientSessionCache.(*lruSessionCache).q.Front().Value.(*lruSessionCacheEntry).state.ticket
 	}
 	deleteTicket := func() {
 		ticketKey := clientConfig.ClientSessionCache.(*lruSessionCache).q.Front().Value.(*lruSessionCacheEntry).sessionKey
 		clientConfig.ClientSessionCache.Put(ticketKey, nil)
 	}
 	corruptTicket := func() {
-		clientConfig.ClientSessionCache.(*lruSessionCache).q.Front().Value.(*lruSessionCacheEntry).state.masterSecret[0] ^= 0xff
+		clientConfig.ClientSessionCache.(*lruSessionCache).q.Front().Value.(*lruSessionCacheEntry).state.session.secret[0] ^= 0xff
 	}
 	randomKey := func() [32]byte {
 		var k [32]byte
@@ -936,21 +937,20 @@
 	testResumeState("Handshake", false)
 	ticket := getTicket()
 	testResumeState("Resume", true)
-	if !bytes.Equal(ticket, getTicket()) && version != VersionTLS13 {
-		t.Fatal("first ticket doesn't match ticket after resumption")
-	}
-	if bytes.Equal(ticket, getTicket()) && version == VersionTLS13 {
+	if bytes.Equal(ticket, getTicket()) {
 		t.Fatal("ticket didn't change after resumption")
 	}
 
-	// An old session ticket can resume, but the server will provide a ticket encrypted with a fresh key.
+	// An old session ticket is replaced with a ticket encrypted with a fresh key.
+	ticket = getTicket()
 	serverConfig.Time = func() time.Time { return time.Now().Add(24*time.Hour + time.Minute) }
 	testResumeState("ResumeWithOldTicket", true)
-	if bytes.Equal(ticket[:ticketKeyNameLen], getTicket()[:ticketKeyNameLen]) {
+	if bytes.Equal(ticket, getTicket()) {
 		t.Fatal("old first ticket matches the fresh one")
 	}
 
-	// Now the session tickey key is expired, so a full handshake should occur.
+	// Once the session master secret is expired, a full handshake should occur.
+	ticket = getTicket()
 	serverConfig.Time = func() time.Time { return time.Now().Add(24*8*time.Hour + time.Minute) }
 	testResumeState("ResumeWithExpiredTicket", false)
 	if bytes.Equal(ticket, getTicket()) {
@@ -986,9 +986,11 @@
 
 	// Age the session ticket a bit at a time, but don't expire it.
 	d := 0 * time.Hour
+	serverConfig.Time = func() time.Time { return time.Now().Add(d) }
+	deleteTicket()
+	testResumeState("GetFreshSessionTicket", false)
 	for i := 0; i < 13; i++ {
 		d += 12 * time.Hour
-		serverConfig.Time = func() time.Time { return time.Now().Add(d) }
 		testResumeState("OldSessionTicket", true)
 	}
 	// Expire it (now a little more than 7 days) and make sure a full
@@ -996,7 +998,6 @@
 	// TLS 1.3 since the client should be using a fresh ticket sent over
 	// by the server.
 	d += 12 * time.Hour
-	serverConfig.Time = func() time.Time { return time.Now().Add(d) }
 	if version == VersionTLS13 {
 		testResumeState("ExpiredSessionTicket", true)
 	} else {
@@ -1028,6 +1029,27 @@
 	deleteTicket()
 	testResumeState("WithoutSessionTicket", false)
 
+	// In TLS 1.3, HelloRetryRequest is sent after incorrect key share.
+	// See https://www.rfc-editor.org/rfc/rfc8446#page-14.
+	if version == VersionTLS13 {
+		deleteTicket()
+		serverConfig = &Config{
+			// Use a different curve than the client to force a HelloRetryRequest.
+			CurvePreferences: []CurveID{CurveP521, CurveP384, CurveP256},
+			MaxVersion:       version,
+			Certificates:     testConfig.Certificates,
+		}
+		testResumeState("InitialHandshake", false)
+		testResumeState("WithHelloRetryRequest", true)
+
+		// Reset serverConfig back.
+		serverConfig = &Config{
+			MaxVersion:   version,
+			CipherSuites: []uint16{TLS_RSA_WITH_RC4_128_SHA, TLS_ECDHE_RSA_WITH_RC4_128_SHA},
+			Certificates: testConfig.Certificates,
+		}
+	}
+
 	// Session resumption should work when using client certificates
 	deleteTicket()
 	serverConfig.ClientCAs = rootCAs
@@ -1049,6 +1071,47 @@
 
 	clientConfig.ClientSessionCache = nil
 	testResumeState("WithoutSessionCache", false)
+
+	clientConfig.ClientSessionCache = &serializingClientCache{t: t}
+	testResumeState("BeforeSerializingCache", false)
+	testResumeState("WithSerializingCache", true)
+}
+
+type serializingClientCache struct {
+	t *testing.T
+
+	ticket, state []byte
+}
+
+func (c *serializingClientCache) Get(sessionKey string) (session *ClientSessionState, ok bool) {
+	if c.ticket == nil {
+		return nil, false
+	}
+	state, err := ParseSessionState(c.state)
+	if err != nil {
+		c.t.Error(err)
+		return nil, false
+	}
+	cs, err := NewResumptionState(c.ticket, state)
+	if err != nil {
+		c.t.Error(err)
+		return nil, false
+	}
+	return cs, true
+}
+
+func (c *serializingClientCache) Put(sessionKey string, cs *ClientSessionState) {
+	ticket, state, err := cs.ResumptionState()
+	if err != nil {
+		c.t.Error(err)
+		return
+	}
+	stateBytes, err := state.Bytes()
+	if err != nil {
+		c.t.Error(err)
+		return
+	}
+	c.ticket, c.state = ticket, stateBytes
 }
 
 func TestLRUClientSessionCache(t *testing.T) {
@@ -2595,3 +2658,169 @@
 		t.Error("Client connection was not closed when the context was canceled")
 	}
 }
+
+// TestTLS13OnlyClientHelloCipherSuite tests that when a client states that
+// it only supports TLS 1.3, it correctly advertises only TLS 1.3 ciphers.
+func TestTLS13OnlyClientHelloCipherSuite(t *testing.T) {
+	tls13Tests := []struct {
+		name    string
+		ciphers []uint16
+	}{
+		{
+			name:    "nil",
+			ciphers: nil,
+		},
+		{
+			name:    "empty",
+			ciphers: []uint16{},
+		},
+		{
+			name:    "some TLS 1.2 cipher",
+			ciphers: []uint16{TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256},
+		},
+		{
+			name:    "some TLS 1.3 cipher",
+			ciphers: []uint16{TLS_AES_128_GCM_SHA256},
+		},
+		{
+			name:    "some TLS 1.2 and 1.3 ciphers",
+			ciphers: []uint16{TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, TLS_AES_256_GCM_SHA384},
+		},
+	}
+	for _, tt := range tls13Tests {
+		tt := tt
+		t.Run(tt.name, func(t *testing.T) {
+			t.Parallel()
+			testTLS13OnlyClientHelloCipherSuite(t, tt.ciphers)
+		})
+	}
+}
+
+func testTLS13OnlyClientHelloCipherSuite(t *testing.T, ciphers []uint16) {
+	serverConfig := &Config{
+		Certificates: testConfig.Certificates,
+		GetConfigForClient: func(chi *ClientHelloInfo) (*Config, error) {
+			if len(chi.CipherSuites) != len(defaultCipherSuitesTLS13NoAES) {
+				t.Errorf("only TLS 1.3 suites should be advertised, got=%x", chi.CipherSuites)
+			} else {
+				for i := range defaultCipherSuitesTLS13NoAES {
+					if want, got := defaultCipherSuitesTLS13NoAES[i], chi.CipherSuites[i]; want != got {
+						t.Errorf("cipher at index %d does not match, want=%x, got=%x", i, want, got)
+					}
+				}
+			}
+			return nil, nil
+		},
+	}
+	clientConfig := &Config{
+		MinVersion:         VersionTLS13, // client only supports TLS 1.3
+		CipherSuites:       ciphers,
+		InsecureSkipVerify: true,
+	}
+	if _, _, err := testHandshake(t, clientConfig, serverConfig); err != nil {
+		t.Fatalf("handshake failed: %s", err)
+	}
+}
+
+// discardConn wraps a net.Conn but discards all writes, but reports that they happened.
+type discardConn struct {
+	net.Conn
+}
+
+func (dc *discardConn) Write(data []byte) (int, error) {
+	return len(data), nil
+}
+
+// largeRSAKeyCertPEM contains a 8193 bit RSA key
+const largeRSAKeyCertPEM = `-----BEGIN CERTIFICATE-----
+MIIInjCCBIWgAwIBAgIBAjANBgkqhkiG9w0BAQsFADASMRAwDgYDVQQDEwd0ZXN0
+aW5nMB4XDTIzMDYwNzIxMjMzNloXDTIzMDYwNzIzMjMzNlowEjEQMA4GA1UEAxMH
+dGVzdGluZzCCBCIwDQYJKoZIhvcNAQEBBQADggQPADCCBAoCggQBAWdHsf6Rh2Ca
+n2SQwn4t4OQrOjbLLdGE1pM6TBKKrHUFy62uEL8atNjlcfXIsa4aEu3xNGiqxqur
+ZectlkZbm0FkaaQ1Wr9oikDY3KfjuaXdPdO/XC/h8AKNxlDOylyXwUSK/CuYb+1j
+gy8yF5QFvVfwW/xwTlHmhUeSkVSQPosfQ6yXNNsmMzkd+ZPWLrfq4R+wiNtwYGu0
+WSBcI/M9o8/vrNLnIppoiBJJ13j9CR1ToEAzOFh9wwRWLY10oZhoh1ONN1KQURx4
+qedzvvP2DSjZbUccdvl2rBGvZpzfOiFdm1FCnxB0c72Cqx+GTHXBFf8bsa7KHky9
+sNO1GUanbq17WoDNgwbY6H51bfShqv0CErxatwWox3we4EcAmFHPVTCYL1oWVMGo
+a3Eth91NZj+b/nGhF9lhHKGzXSv9brmLLkfvM1jA6XhNhA7BQ5Vz67lj2j3XfXdh
+t/BU5pBXbL4Ut4mIhT1YnKXAjX2/LF5RHQTE8Vwkx5JAEKZyUEGOReD/B+7GOrLp
+HduMT9vZAc5aR2k9I8qq1zBAzsL69lyQNAPaDYd1BIAjUety9gAYaSQffCgAgpRO
+Gt+DYvxS+7AT/yEd5h74MU2AH7KrAkbXOtlwupiGwhMVTstncDJWXMJqbBhyHPF8
+3UmZH0hbL4PYmzSj9LDWQQXI2tv6vrCpfts3Cqhqxz9vRpgY7t1Wu6l/r+KxYYz3
+1pcGpPvRmPh0DJm7cPTiXqPnZcPt+ulSaSdlxmd19OnvG5awp0fXhxryZVwuiT8G
+VDkhyARrxYrdjlINsZJZbQjO0t8ketXAELJOnbFXXzeCOosyOHkLwsqOO96AVJA8
+45ZVL5m95ClGy0RSrjVIkXsxTAMVG6SPAqKwk6vmTdRGuSPS4rhgckPVDHmccmuq
+dfnT2YkX+wB2/M3oCgU+s30fAHGkbGZ0pCdNbFYFZLiH0iiMbTDl/0L/z7IdK0nH
+GLHVE7apPraKC6xl6rPWsD2iSfrmtIPQa0+rqbIVvKP5JdfJ8J4alI+OxFw/znQe
+V0/Rez0j22Fe119LZFFSXhRv+ZSvcq20xDwh00mzcumPWpYuCVPozA18yIhC9tNn
+ALHndz0tDseIdy9vC71jQWy9iwri3ueN0DekMMF8JGzI1Z6BAFzgyAx3DkHtwHg7
+B7qD0jPG5hJ5+yt323fYgJsuEAYoZ8/jzZ01pkX8bt+UsVN0DGnSGsI2ktnIIk3J
+l+8krjmUy6EaW79nITwoOqaeHOIp8m3UkjEcoKOYrzHRKqRy+A09rY+m/cAQaafW
+4xp0Zv7qZPLwnu0jsqB4jD8Ll9yPB02ndsoV6U5PeHzTkVhPml19jKUAwFfs7TJg
+kXy+/xFhYVUCAwEAATANBgkqhkiG9w0BAQsFAAOCBAIAAQnZY77pMNeypfpba2WK
+aDasT7dk2JqP0eukJCVPTN24Zca+xJNPdzuBATm/8SdZK9lddIbjSnWRsKvTnO2r
+/rYdlPf3jM5uuJtb8+Uwwe1s+gszelGS9G/lzzq+ehWicRIq2PFcs8o3iQMfENiv
+qILJ+xjcrvms5ZPDNahWkfRx3KCg8Q+/at2n5p7XYjMPYiLKHnDC+RE2b1qT20IZ
+FhuK/fTWLmKbfYFNNga6GC4qcaZJ7x0pbm4SDTYp0tkhzcHzwKhidfNB5J2vNz6l
+Ur6wiYwamFTLqcOwWo7rdvI+sSn05WQBv0QZlzFX+OAu0l7WQ7yU+noOxBhjvHds
+14+r9qcQZg2q9kG+evopYZqYXRUNNlZKo9MRBXhfrISulFAc5lRFQIXMXnglvAu+
+Ipz2gomEAOcOPNNVldhKAU94GAMJd/KfN0ZP7gX3YvPzuYU6XDhag5RTohXLm18w
+5AF+ES3DOQ6ixu3DTf0D+6qrDuK+prdX8ivcdTQVNOQ+MIZeGSc6NWWOTaMGJ3lg
+aZIxJUGdo6E7GBGiC1YTjgFKFbHzek1LRTh/LX3vbSudxwaG0HQxwsU9T4DWiMqa
+Fkf2KteLEUA6HrR+0XlAZrhwoqAmrJ+8lCFX3V0gE9lpENfVHlFXDGyx10DpTB28
+DdjnY3F7EPWNzwf9P3oNT69CKW3Bk6VVr3ROOJtDxVu1ioWo3TaXltQ0VOnap2Pu
+sa5wfrpfwBDuAS9JCDg4ttNp2nW3F7tgXC6xPqw5pvGwUppEw9XNrqV8TZrxduuv
+rQ3NyZ7KSzIpmFlD3UwV/fGfz3UQmHS6Ng1evrUID9DjfYNfRqSGIGjDfxGtYD+j
+Z1gLJZuhjJpNtwBkKRtlNtrCWCJK2hidK/foxwD7kwAPo2I9FjpltxCRywZUs07X
+KwXTfBR9v6ij1LV6K58hFS+8ezZyZ05CeVBFkMQdclTOSfuPxlMkQOtjp8QWDj+F
+j/MYziT5KBkHvcbrjdRtUJIAi4N7zCsPZtjik918AK1WBNRVqPbrgq/XSEXMfuvs
+6JbfK0B76vdBDRtJFC1JsvnIrGbUztxXzyQwFLaR/AjVJqpVlysLWzPKWVX6/+SJ
+u1NQOl2E8P6ycyBsuGnO89p0S4F8cMRcI2X1XQsZ7/q0NBrOMaEp5T3SrWo9GiQ3
+o2SBdbs3Y6MBPBtTu977Z/0RO63J3M5i2tjUiDfrFy7+VRLKr7qQ7JibohyB8QaR
+9tedgjn2f+of7PnP/PEl1cCphUZeHM7QKUMPT8dbqwmKtlYY43EHXcvNOT5IBk3X
+9lwJoZk/B2i+ZMRNSP34ztAwtxmasPt6RAWGQpWCn9qmttAHAnMfDqe7F7jVR6rS
+u58=
+-----END CERTIFICATE-----`
+
+func TestHandshakeRSATooBig(t *testing.T) {
+	for _, tc := range []struct {
+		name              string
+		godebug           string
+		expectedServerErr string
+		expectedClientErr string
+	}{
+		{
+			name:              "key too large",
+			expectedServerErr: "tls: server sent certificate containing RSA key larger than 8192 bits",
+			expectedClientErr: "tls: client sent certificate containing RSA key larger than 8192 bits",
+		},
+		{
+			name:    "acceptable key (GODEBUG=tlsmaxrsasize=8193)",
+			godebug: "tlsmaxrsasize=8193",
+		},
+	} {
+		t.Run(tc.name, func(t *testing.T) {
+			if tc.godebug != "" {
+				t.Setenv("GODEBUG", tc.godebug)
+			}
+
+			testCert, _ := pem.Decode([]byte(largeRSAKeyCertPEM))
+
+			c := &Conn{conn: &discardConn{}, config: testConfig.Clone()}
+
+			err := c.verifyServerCertificate([][]byte{testCert.Bytes})
+			if tc.expectedServerErr == "" && err != nil {
+				t.Errorf("Conn.verifyServerCertificate unexpected error: %s", err)
+			} else if tc.expectedServerErr != "" && (err == nil || err.Error() != tc.expectedServerErr) {
+				t.Errorf("Conn.verifyServerCertificate unexpected error: want %q, got %q", tc.expectedServerErr, err)
+			}
+
+			err = c.processCertsFromClient(Certificate{Certificate: [][]byte{testCert.Bytes}})
+			if tc.expectedClientErr == "" && err != nil {
+				t.Errorf("Conn.processCertsFromClient unexpected error: %s", err)
+			} else if tc.expectedClientErr != "" && (err == nil || err.Error() != tc.expectedClientErr) {
+				t.Errorf("Conn.processCertsFromClient unexpected error: want %q, got %q", tc.expectedClientErr, err)
+			}
+		})
+	}
+}
diff --git a/src/crypto/tls/handshake_client_tls13.go b/src/crypto/tls/handshake_client_tls13.go
index fefba01..2f59f68 100644
--- a/src/crypto/tls/handshake_client_tls13.go
+++ b/src/crypto/tls/handshake_client_tls13.go
@@ -23,7 +23,7 @@
 	hello       *clientHelloMsg
 	ecdheKey    *ecdh.PrivateKey
 
-	session     *ClientSessionState
+	session     *SessionState
 	earlySecret []byte
 	binderKey   []byte
 
@@ -136,6 +136,7 @@
 
 	if hs.serverHello.ocspStapling ||
 		hs.serverHello.ticketSupported ||
+		hs.serverHello.extendedMasterSecret ||
 		hs.serverHello.secureRenegotiationSupported ||
 		len(hs.serverHello.secureRenegotiation) != 0 ||
 		len(hs.serverHello.alpnProtocol) != 0 ||
@@ -172,6 +173,9 @@
 // sendDummyChangeCipherSpec sends a ChangeCipherSpec record for compatibility
 // with middleboxes that didn't implement TLS correctly. See RFC 8446, Appendix D.4.
 func (hs *clientHandshakeStateTLS13) sendDummyChangeCipherSpec() error {
+	if hs.c.quic != nil {
+		return nil
+	}
 	if hs.sentDummyCCS {
 		return nil
 	}
@@ -253,13 +257,13 @@
 		}
 		if pskSuite.hash == hs.suite.hash {
 			// Update binders and obfuscated_ticket_age.
-			ticketAge := uint32(c.config.time().Sub(hs.session.receivedAt) / time.Millisecond)
-			hs.hello.pskIdentities[0].obfuscatedTicketAge = ticketAge + hs.session.ageAdd
+			ticketAge := c.config.time().Sub(time.Unix(int64(hs.session.createdAt), 0))
+			hs.hello.pskIdentities[0].obfuscatedTicketAge = uint32(ticketAge/time.Millisecond) + hs.session.ageAdd
 
 			transcript := hs.suite.hash.New()
 			transcript.Write([]byte{typeMessageHash, 0, 0, uint8(len(chHash))})
 			transcript.Write(chHash)
-			if err := transcriptMsg(hs.serverHello, hs.transcript); err != nil {
+			if err := transcriptMsg(hs.serverHello, transcript); err != nil {
 				return err
 			}
 			helloBytes, err := hs.hello.marshalWithoutBinders()
@@ -278,6 +282,11 @@
 		}
 	}
 
+	if hs.hello.earlyData {
+		hs.hello.earlyData = false
+		c.quicRejectedEarlyData()
+	}
+
 	if _, err := hs.c.writeHandshakeRecord(hs.hello, hs.transcript); err != nil {
 		return err
 	}
@@ -352,7 +361,8 @@
 
 	hs.usingPSK = true
 	c.didResume = true
-	c.peerCertificates = hs.session.serverCertificates
+	c.peerCertificates = hs.session.peerCertificates
+	c.activeCertHandles = hs.session.activeCertHandles
 	c.verifiedChains = hs.session.verifiedChains
 	c.ocspResponse = hs.session.ocspResponse
 	c.scts = hs.session.scts
@@ -383,10 +393,18 @@
 
 	clientSecret := hs.suite.deriveSecret(handshakeSecret,
 		clientHandshakeTrafficLabel, hs.transcript)
-	c.out.setTrafficSecret(hs.suite, clientSecret)
+	c.out.setTrafficSecret(hs.suite, QUICEncryptionLevelHandshake, clientSecret)
 	serverSecret := hs.suite.deriveSecret(handshakeSecret,
 		serverHandshakeTrafficLabel, hs.transcript)
-	c.in.setTrafficSecret(hs.suite, serverSecret)
+	c.in.setTrafficSecret(hs.suite, QUICEncryptionLevelHandshake, serverSecret)
+
+	if c.quic != nil {
+		if c.hand.Len() != 0 {
+			c.sendAlert(alertUnexpectedMessage)
+		}
+		c.quicSetWriteSecret(QUICEncryptionLevelHandshake, hs.suite.id, clientSecret)
+		c.quicSetReadSecret(QUICEncryptionLevelHandshake, hs.suite.id, serverSecret)
+	}
 
 	err = c.config.writeKeyLog(keyLogLabelClientHandshake, hs.hello.random, clientSecret)
 	if err != nil {
@@ -419,12 +437,48 @@
 		return unexpectedMessageError(encryptedExtensions, msg)
 	}
 
-	if err := checkALPN(hs.hello.alpnProtocols, encryptedExtensions.alpnProtocol); err != nil {
-		c.sendAlert(alertUnsupportedExtension)
+	if err := checkALPN(hs.hello.alpnProtocols, encryptedExtensions.alpnProtocol, c.quic != nil); err != nil {
+		// RFC 8446 specifies that no_application_protocol is sent by servers, but
+		// does not specify how clients handle the selection of an incompatible protocol.
+		// RFC 9001 Section 8.1 specifies that QUIC clients send no_application_protocol
+		// in this case. Always sending no_application_protocol seems reasonable.
+		c.sendAlert(alertNoApplicationProtocol)
 		return err
 	}
 	c.clientProtocol = encryptedExtensions.alpnProtocol
 
+	if c.quic != nil {
+		if encryptedExtensions.quicTransportParameters == nil {
+			// RFC 9001 Section 8.2.
+			c.sendAlert(alertMissingExtension)
+			return errors.New("tls: server did not send a quic_transport_parameters extension")
+		}
+		c.quicSetTransportParameters(encryptedExtensions.quicTransportParameters)
+	} else {
+		if encryptedExtensions.quicTransportParameters != nil {
+			c.sendAlert(alertUnsupportedExtension)
+			return errors.New("tls: server sent an unexpected quic_transport_parameters extension")
+		}
+	}
+
+	if !hs.hello.earlyData && encryptedExtensions.earlyData {
+		c.sendAlert(alertUnsupportedExtension)
+		return errors.New("tls: server sent an unexpected early_data extension")
+	}
+	if hs.hello.earlyData && !encryptedExtensions.earlyData {
+		c.quicRejectedEarlyData()
+	}
+	if encryptedExtensions.earlyData {
+		if hs.session.cipherSuite != c.cipherSuite {
+			c.sendAlert(alertHandshakeFailure)
+			return errors.New("tls: server accepted 0-RTT with the wrong cipher suite")
+		}
+		if hs.session.alpnProtocol != c.clientProtocol {
+			c.sendAlert(alertHandshakeFailure)
+			return errors.New("tls: server accepted 0-RTT with the wrong ALPN")
+		}
+	}
+
 	return nil
 }
 
@@ -552,7 +606,7 @@
 		clientApplicationTrafficLabel, hs.transcript)
 	serverSecret := hs.suite.deriveSecret(hs.masterSecret,
 		serverApplicationTrafficLabel, hs.transcript)
-	c.in.setTrafficSecret(hs.suite, serverSecret)
+	c.in.setTrafficSecret(hs.suite, QUICEncryptionLevelApplication, serverSecret)
 
 	err = c.config.writeKeyLog(keyLogLabelClientTraffic, hs.hello.random, hs.trafficSecret)
 	if err != nil {
@@ -648,13 +702,20 @@
 		return err
 	}
 
-	c.out.setTrafficSecret(hs.suite, hs.trafficSecret)
+	c.out.setTrafficSecret(hs.suite, QUICEncryptionLevelApplication, hs.trafficSecret)
 
 	if !c.config.SessionTicketsDisabled && c.config.ClientSessionCache != nil {
 		c.resumptionSecret = hs.suite.deriveSecret(hs.masterSecret,
 			resumptionLabel, hs.transcript)
 	}
 
+	if c.quic != nil {
+		if c.hand.Len() != 0 {
+			c.sendAlert(alertUnexpectedMessage)
+		}
+		c.quicSetWriteSecret(QUICEncryptionLevelApplication, hs.suite.id, hs.trafficSecret)
+	}
+
 	return nil
 }
 
@@ -678,32 +739,34 @@
 		return errors.New("tls: received a session ticket with invalid lifetime")
 	}
 
+	// RFC 9001, Section 4.6.1
+	if c.quic != nil && msg.maxEarlyData != 0 && msg.maxEarlyData != 0xffffffff {
+		c.sendAlert(alertIllegalParameter)
+		return errors.New("tls: invalid early data for QUIC connection")
+	}
+
 	cipherSuite := cipherSuiteTLS13ByID(c.cipherSuite)
 	if cipherSuite == nil || c.resumptionSecret == nil {
 		return c.sendAlert(alertInternalError)
 	}
 
-	// Save the resumption_master_secret and nonce instead of deriving the PSK
-	// to do the least amount of work on NewSessionTicket messages before we
-	// know if the ticket will be used. Forward secrecy of resumed connections
-	// is guaranteed by the requirement for pskModeDHE.
-	session := &ClientSessionState{
-		sessionTicket:      msg.label,
-		vers:               c.vers,
-		cipherSuite:        c.cipherSuite,
-		masterSecret:       c.resumptionSecret,
-		serverCertificates: c.peerCertificates,
-		verifiedChains:     c.verifiedChains,
-		receivedAt:         c.config.time(),
-		nonce:              msg.nonce,
-		useBy:              c.config.time().Add(lifetime),
-		ageAdd:             msg.ageAdd,
-		ocspResponse:       c.ocspResponse,
-		scts:               c.scts,
-	}
+	psk := cipherSuite.expandLabel(c.resumptionSecret, "resumption",
+		msg.nonce, cipherSuite.hash.Size())
 
-	cacheKey := clientSessionCacheKey(c.conn.RemoteAddr(), c.config)
-	c.config.ClientSessionCache.Put(cacheKey, session)
+	session, err := c.sessionState()
+	if err != nil {
+		c.sendAlert(alertInternalError)
+		return err
+	}
+	session.secret = psk
+	session.useBy = uint64(c.config.time().Add(lifetime).Unix())
+	session.ageAdd = msg.ageAdd
+	session.EarlyData = c.quic != nil && msg.maxEarlyData == 0xffffffff // RFC 9001, Section 4.6.1
+	cs := &ClientSessionState{ticket: msg.label, session: session}
+
+	if cacheKey := c.clientSessionCacheKey(); cacheKey != "" {
+		c.config.ClientSessionCache.Put(cacheKey, cs)
+	}
 
 	return nil
 }
diff --git a/src/crypto/tls/handshake_messages.go b/src/crypto/tls/handshake_messages.go
index 695aacf..a86055a 100644
--- a/src/crypto/tls/handshake_messages.go
+++ b/src/crypto/tls/handshake_messages.go
@@ -84,6 +84,7 @@
 	supportedSignatureAlgorithmsCert []SignatureScheme
 	secureRenegotiationSupported     bool
 	secureRenegotiation              []byte
+	extendedMasterSecret             bool
 	alpnProtocols                    []string
 	scts                             bool
 	supportedVersions                []uint16
@@ -93,6 +94,7 @@
 	pskModes                         []uint8
 	pskIdentities                    []pskIdentity
 	pskBinders                       [][]byte
+	quicTransportParameters          []byte
 }
 
 func (m *clientHelloMsg) marshal() ([]byte, error) {
@@ -180,6 +182,11 @@
 			})
 		})
 	}
+	if m.extendedMasterSecret {
+		// RFC 7627
+		exts.AddUint16(extensionExtendedMasterSecret)
+		exts.AddUint16(0) // empty extension_data
+	}
 	if len(m.alpnProtocols) > 0 {
 		// RFC 7301, Section 3.1
 		exts.AddUint16(extensionALPN)
@@ -246,6 +253,13 @@
 			})
 		})
 	}
+	if m.quicTransportParameters != nil { // marshal zero-length parameters when present
+		// RFC 9001, Section 8.2
+		exts.AddUint16(extensionQUICTransportParameters)
+		exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
+			exts.AddBytes(m.quicTransportParameters)
+		})
+	}
 	if len(m.pskIdentities) > 0 { // pre_shared_key must be the last extension
 		// RFC 8446, Section 4.2.11
 		exts.AddUint16(extensionPreSharedKey)
@@ -502,6 +516,9 @@
 				return false
 			}
 			m.secureRenegotiationSupported = true
+		case extensionExtendedMasterSecret:
+			// RFC 7627
+			m.extendedMasterSecret = true
 		case extensionALPN:
 			// RFC 7301, Section 3.1
 			var protoList cryptobyte.String
@@ -560,6 +577,11 @@
 			if !readUint8LengthPrefixed(&extData, &m.pskModes) {
 				return false
 			}
+		case extensionQUICTransportParameters:
+			m.quicTransportParameters = make([]byte, len(extData))
+			if !extData.CopyBytes(m.quicTransportParameters) {
+				return false
+			}
 		case extensionPreSharedKey:
 			// RFC 8446, Section 4.2.11
 			if !extensions.Empty() {
@@ -614,6 +636,7 @@
 	ticketSupported              bool
 	secureRenegotiationSupported bool
 	secureRenegotiation          []byte
+	extendedMasterSecret         bool
 	alpnProtocol                 string
 	scts                         [][]byte
 	supportedVersion             uint16
@@ -649,6 +672,10 @@
 			})
 		})
 	}
+	if m.extendedMasterSecret {
+		exts.AddUint16(extensionExtendedMasterSecret)
+		exts.AddUint16(0) // empty extension_data
+	}
 	if len(m.alpnProtocol) > 0 {
 		exts.AddUint16(extensionALPN)
 		exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
@@ -789,6 +816,8 @@
 				return false
 			}
 			m.secureRenegotiationSupported = true
+		case extensionExtendedMasterSecret:
+			m.extendedMasterSecret = true
 		case extensionALPN:
 			var protoList cryptobyte.String
 			if !extData.ReadUint16LengthPrefixed(&protoList) || protoList.Empty() {
@@ -860,8 +889,10 @@
 }
 
 type encryptedExtensionsMsg struct {
-	raw          []byte
-	alpnProtocol string
+	raw                     []byte
+	alpnProtocol            string
+	quicTransportParameters []byte
+	earlyData               bool
 }
 
 func (m *encryptedExtensionsMsg) marshal() ([]byte, error) {
@@ -883,6 +914,18 @@
 					})
 				})
 			}
+			if m.quicTransportParameters != nil { // marshal zero-length parameters when present
+				// draft-ietf-quic-tls-32, Section 8.2
+				b.AddUint16(extensionQUICTransportParameters)
+				b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
+					b.AddBytes(m.quicTransportParameters)
+				})
+			}
+			if m.earlyData {
+				// RFC 8446, Section 4.2.10
+				b.AddUint16(extensionEarlyData)
+				b.AddUint16(0) // empty extension_data
+			}
 		})
 	})
 
@@ -921,6 +964,14 @@
 				return false
 			}
 			m.alpnProtocol = string(proto)
+		case extensionQUICTransportParameters:
+			m.quicTransportParameters = make([]byte, len(extData))
+			if !extData.CopyBytes(m.quicTransportParameters) {
+				return false
+			}
+		case extensionEarlyData:
+			// RFC 8446, Section 4.2.10
+			m.earlyData = true
 		default:
 			// Ignore unknown extensions.
 			continue
diff --git a/src/crypto/tls/handshake_messages_test.go b/src/crypto/tls/handshake_messages_test.go
index 206e2fb..72e8bd8 100644
--- a/src/crypto/tls/handshake_messages_test.go
+++ b/src/crypto/tls/handshake_messages_test.go
@@ -6,7 +6,9 @@
 
 import (
 	"bytes"
+	"crypto/x509"
 	"encoding/hex"
+	"math"
 	"math/rand"
 	"reflect"
 	"strings"
@@ -15,7 +17,7 @@
 	"time"
 )
 
-var tests = []any{
+var tests = []handshakeMessage{
 	&clientHelloMsg{},
 	&serverHelloMsg{},
 	&finishedMsg{},
@@ -28,14 +30,13 @@
 	&certificateStatusMsg{},
 	&clientKeyExchangeMsg{},
 	&newSessionTicketMsg{},
-	&sessionState{},
-	&sessionStateTLS13{},
 	&encryptedExtensionsMsg{},
 	&endOfEarlyDataMsg{},
 	&keyUpdateMsg{},
 	&newSessionTicketMsgTLS13{},
 	&certificateRequestMsgTLS13{},
 	&certificateMsgTLS13{},
+	&SessionState{},
 }
 
 func mustMarshal(t *testing.T, msg handshakeMessage) []byte {
@@ -50,8 +51,8 @@
 func TestMarshalUnmarshal(t *testing.T) {
 	rand := rand.New(rand.NewSource(time.Now().UnixNano()))
 
-	for i, iface := range tests {
-		ty := reflect.ValueOf(iface).Type()
+	for i, m := range tests {
+		ty := reflect.ValueOf(m).Type()
 
 		n := 100
 		if testing.Short() {
@@ -66,15 +67,18 @@
 
 			m1 := v.Interface().(handshakeMessage)
 			marshaled := mustMarshal(t, m1)
-			m2 := iface.(handshakeMessage)
-			if !m2.unmarshal(marshaled) {
+			if !m.unmarshal(marshaled) {
 				t.Errorf("#%d failed to unmarshal %#v %x", i, m1, marshaled)
 				break
 			}
-			m2.marshal() // to fill any marshal cache in the message
+			m.marshal() // to fill any marshal cache in the message
 
-			if !reflect.DeepEqual(m1, m2) {
-				t.Errorf("#%d got:%#v want:%#v %x", i, m2, m1, marshaled)
+			if m, ok := m.(*SessionState); ok {
+				m.activeCertHandles = nil
+			}
+
+			if !reflect.DeepEqual(m1, m) {
+				t.Errorf("#%d got:%#v want:%#v %x", i, m, m1, marshaled)
 				break
 			}
 
@@ -85,7 +89,7 @@
 				// 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]) {
+					if m.unmarshal(marshaled[0:j]) {
 						t.Errorf("#%d unmarshaled a prefix of length %d of %#v", i, j, m1)
 						break
 					}
@@ -97,11 +101,9 @@
 
 func TestFuzz(t *testing.T) {
 	rand := rand.New(rand.NewSource(0))
-	for _, iface := range tests {
-		m := iface.(handshakeMessage)
-
+	for _, m := range tests {
 		for j := 0; j < 1000; j++ {
-			len := rand.Intn(100)
+			len := rand.Intn(1000)
 			bytes := randomBytes(len, rand)
 			// This just looks for crashes due to bounds errors etc.
 			m.unmarshal(bytes)
@@ -172,6 +174,9 @@
 		m.secureRenegotiationSupported = true
 		m.secureRenegotiation = randomBytes(rand.Intn(50)+1, rand)
 	}
+	if rand.Intn(10) > 5 {
+		m.extendedMasterSecret = true
+	}
 	for i := 0; i < rand.Intn(5); i++ {
 		m.supportedVersions = append(m.supportedVersions, uint16(rand.Intn(0xffff)+1))
 	}
@@ -198,6 +203,9 @@
 		m.pskBinders = append(m.pskBinders, randomBytes(rand.Intn(50)+32, rand))
 	}
 	if rand.Intn(10) > 5 {
+		m.quicTransportParameters = randomBytes(rand.Intn(500), rand)
+	}
+	if rand.Intn(10) > 5 {
 		m.earlyData = true
 	}
 
@@ -232,6 +240,9 @@
 		m.secureRenegotiation = randomBytes(rand.Intn(50)+1, rand)
 	}
 	if rand.Intn(10) > 5 {
+		m.extendedMasterSecret = true
+	}
+	if rand.Intn(10) > 5 {
 		m.supportedVersion = uint16(rand.Intn(0xffff) + 1)
 	}
 	if rand.Intn(10) > 5 {
@@ -259,6 +270,9 @@
 	if rand.Intn(10) > 5 {
 		m.alpnProtocol = randomString(rand.Intn(32)+1, rand)
 	}
+	if rand.Intn(10) > 5 {
+		m.earlyData = true
+	}
 
 	return reflect.ValueOf(m)
 }
@@ -314,37 +328,86 @@
 	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)+1, rand)
+var sessionTestCerts []*x509.Certificate
+
+func init() {
+	cert, err := x509.ParseCertificate(testRSACertificate)
+	if err != nil {
+		panic(err)
+	}
+	sessionTestCerts = append(sessionTestCerts, cert)
+	cert, err = x509.ParseCertificate(testRSACertificateIssuer)
+	if err != nil {
+		panic(err)
+	}
+	sessionTestCerts = append(sessionTestCerts, cert)
+}
+
+func (*SessionState) Generate(rand *rand.Rand, size int) reflect.Value {
+	s := &SessionState{}
+	isTLS13 := rand.Intn(10) > 5
+	if isTLS13 {
+		s.version = VersionTLS13
+	} else {
+		s.version = uint16(rand.Intn(VersionTLS13))
+	}
+	s.isClient = rand.Intn(10) > 5
+	s.cipherSuite = uint16(rand.Intn(math.MaxUint16))
 	s.createdAt = uint64(rand.Int63())
-	for i := 0; i < rand.Intn(20); i++ {
-		s.certificates = append(s.certificates, randomBytes(rand.Intn(500)+1, rand))
+	s.secret = randomBytes(rand.Intn(100)+1, rand)
+	for n, i := rand.Intn(3), 0; i < n; i++ {
+		s.Extra = append(s.Extra, randomBytes(rand.Intn(100), rand))
+	}
+	if rand.Intn(10) > 5 {
+		s.EarlyData = true
+	}
+	if rand.Intn(10) > 5 {
+		s.extMasterSecret = true
+	}
+	if s.isClient || rand.Intn(10) > 5 {
+		if rand.Intn(10) > 5 {
+			s.peerCertificates = sessionTestCerts
+		} else {
+			s.peerCertificates = sessionTestCerts[:1]
+		}
+	}
+	if rand.Intn(10) > 5 && s.peerCertificates != nil {
+		s.ocspResponse = randomBytes(rand.Intn(100)+1, rand)
+	}
+	if rand.Intn(10) > 5 && s.peerCertificates != nil {
+		for i := 0; i < rand.Intn(2)+1; i++ {
+			s.scts = append(s.scts, randomBytes(rand.Intn(500)+1, rand))
+		}
+	}
+	if len(s.peerCertificates) > 0 {
+		for i := 0; i < rand.Intn(3); i++ {
+			if rand.Intn(10) > 5 {
+				s.verifiedChains = append(s.verifiedChains, s.peerCertificates)
+			} else {
+				s.verifiedChains = append(s.verifiedChains, s.peerCertificates[:1])
+			}
+		}
+	}
+	if rand.Intn(10) > 5 && s.EarlyData {
+		s.alpnProtocol = string(randomBytes(rand.Intn(10), rand))
+	}
+	if s.isClient {
+		if isTLS13 {
+			s.useBy = uint64(rand.Int63())
+			s.ageAdd = uint32(rand.Int63() & math.MaxUint32)
+		}
 	}
 	return reflect.ValueOf(s)
 }
 
-func (*sessionStateTLS13) Generate(rand *rand.Rand, size int) reflect.Value {
-	s := &sessionStateTLS13{}
-	s.cipherSuite = uint16(rand.Intn(10000))
-	s.resumptionSecret = randomBytes(rand.Intn(100)+1, rand)
-	s.createdAt = uint64(rand.Int63())
-	for i := 0; i < rand.Intn(2)+1; i++ {
-		s.certificate.Certificate = append(
-			s.certificate.Certificate, randomBytes(rand.Intn(500)+1, rand))
+func (s *SessionState) marshal() ([]byte, error) { return s.Bytes() }
+func (s *SessionState) unmarshal(b []byte) bool {
+	ss, err := ParseSessionState(b)
+	if err != nil {
+		return false
 	}
-	if rand.Intn(10) > 5 {
-		s.certificate.OCSPStaple = randomBytes(rand.Intn(100)+1, rand)
-	}
-	if rand.Intn(10) > 5 {
-		for i := 0; i < rand.Intn(2)+1; i++ {
-			s.certificate.SignedCertificateTimestamps = append(
-				s.certificate.SignedCertificateTimestamps, randomBytes(rand.Intn(500)+1, rand))
-		}
-	}
-	return reflect.ValueOf(s)
+	*s = *ss
+	return true
 }
 
 func (*endOfEarlyDataMsg) Generate(rand *rand.Rand, size int) reflect.Value {
diff --git a/src/crypto/tls/handshake_server.go b/src/crypto/tls/handshake_server.go
index e22f284..996b23b 100644
--- a/src/crypto/tls/handshake_server.go
+++ b/src/crypto/tls/handshake_server.go
@@ -31,7 +31,7 @@
 	ecSignOk     bool
 	rsaDecryptOk bool
 	rsaSignOk    bool
-	sessionState *sessionState
+	sessionState *SessionState
 	finishedHash finishedHash
 	masterSecret []byte
 	cert         *Certificate
@@ -70,9 +70,11 @@
 
 	// For an overview of TLS handshaking, see RFC 5246, Section 7.3.
 	c.buffering = true
-	if hs.checkForResumption() {
+	if err := hs.checkForResumption(); err != nil {
+		return err
+	}
+	if hs.sessionState != nil {
 		// The client has included a session ticket and so we do an abbreviated handshake.
-		c.didResume = true
 		if err := hs.doResumeHandshake(); err != nil {
 			return err
 		}
@@ -212,13 +214,14 @@
 		return errors.New("tls: initial handshake had non-empty renegotiation extension")
 	}
 
+	hs.hello.extendedMasterSecret = hs.clientHello.extendedMasterSecret
 	hs.hello.secureRenegotiationSupported = hs.clientHello.secureRenegotiationSupported
 	hs.hello.compressionMethod = compressionNone
 	if len(hs.clientHello.serverName) > 0 {
 		c.serverName = hs.clientHello.serverName
 	}
 
-	selectedProto, err := negotiateALPN(c.config.NextProtos, hs.clientHello.alpnProtocols)
+	selectedProto, err := negotiateALPN(c.config.NextProtos, hs.clientHello.alpnProtocols, false)
 	if err != nil {
 		c.sendAlert(alertNoApplicationProtocol)
 		return err
@@ -279,8 +282,12 @@
 // negotiateALPN picks a shared ALPN protocol that both sides support in server
 // preference order. If ALPN is not configured or the peer doesn't support it,
 // it returns "" and no error.
-func negotiateALPN(serverProtos, clientProtos []string) (string, error) {
+func negotiateALPN(serverProtos, clientProtos []string, quic bool) (string, error) {
 	if len(serverProtos) == 0 || len(clientProtos) == 0 {
+		if quic && len(serverProtos) != 0 {
+			// RFC 9001, Section 8.1
+			return "", fmt.Errorf("tls: client did not request an application protocol")
+		}
 		return "", nil
 	}
 	var http11fallback bool
@@ -395,62 +402,102 @@
 }
 
 // checkForResumption reports whether we should perform resumption on this connection.
-func (hs *serverHandshakeState) checkForResumption() bool {
+func (hs *serverHandshakeState) checkForResumption() error {
 	c := hs.c
 
 	if c.config.SessionTicketsDisabled {
-		return false
+		return nil
 	}
 
-	plaintext, usedOldKey := c.decryptTicket(hs.clientHello.sessionTicket)
-	if plaintext == nil {
-		return false
-	}
-	hs.sessionState = &sessionState{usedOldKey: usedOldKey}
-	ok := hs.sessionState.unmarshal(plaintext)
-	if !ok {
-		return false
+	var sessionState *SessionState
+	if c.config.UnwrapSession != nil {
+		ss, err := c.config.UnwrapSession(hs.clientHello.sessionTicket, c.connectionStateLocked())
+		if err != nil {
+			return err
+		}
+		if ss == nil {
+			return nil
+		}
+		sessionState = ss
+	} else {
+		plaintext := c.config.decryptTicket(hs.clientHello.sessionTicket, c.ticketKeys)
+		if plaintext == nil {
+			return nil
+		}
+		ss, err := ParseSessionState(plaintext)
+		if err != nil {
+			return nil
+		}
+		sessionState = ss
 	}
 
-	createdAt := time.Unix(int64(hs.sessionState.createdAt), 0)
+	// TLS 1.2 tickets don't natively have a lifetime, but we want to avoid
+	// re-wrapping the same master secret in different tickets over and over for
+	// too long, weakening forward secrecy.
+	createdAt := time.Unix(int64(sessionState.createdAt), 0)
 	if c.config.time().Sub(createdAt) > maxSessionTicketLifetime {
-		return false
+		return nil
 	}
 
 	// Never resume a session for a different TLS version.
-	if c.vers != hs.sessionState.vers {
-		return false
+	if c.vers != sessionState.version {
+		return nil
 	}
 
 	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 {
+		if id == sessionState.cipherSuite {
 			cipherSuiteOk = true
 			break
 		}
 	}
 	if !cipherSuiteOk {
-		return false
+		return nil
 	}
 
 	// Check that we also support the ciphersuite from the session.
-	hs.suite = selectCipherSuite([]uint16{hs.sessionState.cipherSuite},
+	suite := selectCipherSuite([]uint16{sessionState.cipherSuite},
 		c.config.cipherSuites(), hs.cipherSuiteOk)
-	if hs.suite == nil {
-		return false
+	if suite == nil {
+		return nil
 	}
 
-	sessionHasClientCerts := len(hs.sessionState.certificates) != 0
+	sessionHasClientCerts := len(sessionState.peerCertificates) != 0
 	needClientCerts := requiresClientCert(c.config.ClientAuth)
 	if needClientCerts && !sessionHasClientCerts {
-		return false
+		return nil
 	}
 	if sessionHasClientCerts && c.config.ClientAuth == NoClientCert {
-		return false
+		return nil
+	}
+	if sessionHasClientCerts && c.config.time().After(sessionState.peerCertificates[0].NotAfter) {
+		return nil
+	}
+	if sessionHasClientCerts && c.config.ClientAuth >= VerifyClientCertIfGiven &&
+		len(sessionState.verifiedChains) == 0 {
+		return nil
 	}
 
-	return true
+	// RFC 7627, Section 5.3
+	if !sessionState.extMasterSecret && hs.clientHello.extendedMasterSecret {
+		return nil
+	}
+	if sessionState.extMasterSecret && !hs.clientHello.extendedMasterSecret {
+		// Aborting is somewhat harsh, but it's a MUST and it would indicate a
+		// weird downgrade in client capabilities.
+		return errors.New("tls: session supported extended_master_secret but client does not")
+	}
+
+	c.peerCertificates = sessionState.peerCertificates
+	c.ocspResponse = sessionState.ocspResponse
+	c.scts = sessionState.scts
+	c.verifiedChains = sessionState.verifiedChains
+	c.extMasterSecret = sessionState.extMasterSecret
+	hs.sessionState = sessionState
+	hs.suite = suite
+	c.didResume = true
+	return nil
 }
 
 func (hs *serverHandshakeState) doResumeHandshake() error {
@@ -461,7 +508,10 @@
 	// 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
+	// We always send a new session ticket, even if it wraps the same master
+	// secret and it's potentially encrypted with the same key, to help the
+	// client avoid cross-connection tracking from a network observer.
+	hs.hello.ticketSupported = true
 	hs.finishedHash = newFinishedHash(c.vers, hs.suite)
 	hs.finishedHash.discardHandshakeBuffer()
 	if err := transcriptMsg(hs.clientHello, &hs.finishedHash); err != nil {
@@ -471,12 +521,6 @@
 		return err
 	}
 
-	if err := c.processCertsFromClient(Certificate{
-		Certificate: hs.sessionState.certificates,
-	}); err != nil {
-		return err
-	}
-
 	if c.config.VerifyConnection != nil {
 		if err := c.config.VerifyConnection(c.connectionStateLocked()); err != nil {
 			c.sendAlert(alertBadCertificate)
@@ -484,7 +528,7 @@
 		}
 	}
 
-	hs.masterSecret = hs.sessionState.masterSecret
+	hs.masterSecret = hs.sessionState.secret
 
 	return nil
 }
@@ -622,7 +666,14 @@
 		c.sendAlert(alertHandshakeFailure)
 		return err
 	}
-	hs.masterSecret = masterFromPreMasterSecret(c.vers, hs.suite, preMasterSecret, hs.clientHello.random, hs.hello.random)
+	if hs.hello.extendedMasterSecret {
+		c.extMasterSecret = true
+		hs.masterSecret = extMasterFromPreMasterSecret(c.vers, hs.suite, preMasterSecret,
+			hs.finishedHash.Sum())
+	} else {
+		hs.masterSecret = masterFromPreMasterSecret(c.vers, hs.suite, preMasterSecret,
+			hs.clientHello.random, hs.hello.random)
+	}
 	if err := c.config.writeKeyLog(keyLogLabelTLS12, hs.clientHello.random, hs.masterSecret); err != nil {
 		c.sendAlert(alertInternalError)
 		return err
@@ -744,9 +795,6 @@
 }
 
 func (hs *serverHandshakeState) sendSessionTicket() error {
-	// 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 {
 		return nil
 	}
@@ -754,31 +802,30 @@
 	c := hs.c
 	m := new(newSessionTicketMsg)
 
-	createdAt := uint64(c.config.time().Unix())
+	state, err := c.sessionState()
+	if err != nil {
+		return err
+	}
+	state.secret = hs.masterSecret
 	if hs.sessionState != nil {
 		// If this is re-wrapping an old key, then keep
 		// the original time it was created.
-		createdAt = hs.sessionState.createdAt
+		state.createdAt = hs.sessionState.createdAt
 	}
-
-	var certsFromClient [][]byte
-	for _, cert := range c.peerCertificates {
-		certsFromClient = append(certsFromClient, cert.Raw)
-	}
-	state := sessionState{
-		vers:         c.vers,
-		cipherSuite:  hs.suite.id,
-		createdAt:    createdAt,
-		masterSecret: hs.masterSecret,
-		certificates: certsFromClient,
-	}
-	stateBytes, err := state.marshal()
-	if err != nil {
-		return err
-	}
-	m.ticket, err = c.encryptTicket(stateBytes)
-	if err != nil {
-		return err
+	if c.config.WrapSession != nil {
+		m.ticket, err = c.config.WrapSession(c.connectionStateLocked(), state)
+		if err != nil {
+			return err
+		}
+	} else {
+		stateBytes, err := state.Bytes()
+		if err != nil {
+			return err
+		}
+		m.ticket, err = c.config.encryptTicket(stateBytes, c.ticketKeys)
+		if err != nil {
+			return err
+		}
 	}
 
 	if _, err := hs.c.writeHandshakeRecord(m, &hs.finishedHash); err != nil {
@@ -807,8 +854,7 @@
 }
 
 // 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.
+// Certificates message and verifies them.
 func (c *Conn) processCertsFromClient(certificate Certificate) error {
 	certificates := certificate.Certificate
 	certs := make([]*x509.Certificate, len(certificates))
@@ -818,10 +864,21 @@
 			c.sendAlert(alertBadCertificate)
 			return errors.New("tls: failed to parse client certificate: " + err.Error())
 		}
+		if certs[i].PublicKeyAlgorithm == x509.RSA {
+			n := certs[i].PublicKey.(*rsa.PublicKey).N.BitLen()
+			if max, ok := checkKeySize(n); !ok {
+				c.sendAlert(alertBadCertificate)
+				return fmt.Errorf("tls: client sent certificate containing RSA key larger than %d bits", max)
+			}
+		}
 	}
 
 	if len(certs) == 0 && requiresClientCert(c.config.ClientAuth) {
-		c.sendAlert(alertBadCertificate)
+		if c.vers == VersionTLS13 {
+			c.sendAlert(alertCertificateRequired)
+		} else {
+			c.sendAlert(alertBadCertificate)
+		}
 		return errors.New("tls: client didn't provide a certificate")
 	}
 
@@ -839,7 +896,14 @@
 
 		chains, err := certs[0].Verify(opts)
 		if err != nil {
-			c.sendAlert(alertBadCertificate)
+			var errCertificateInvalid x509.CertificateInvalidError
+			if errors.As(err, &x509.UnknownAuthorityError{}) {
+				c.sendAlert(alertUnknownCA)
+			} else if errors.As(err, &errCertificateInvalid) && errCertificateInvalid.Reason == x509.Expired {
+				c.sendAlert(alertCertificateExpired)
+			} else {
+				c.sendAlert(alertBadCertificate)
+			}
 			return &CertificateVerificationError{UnverifiedCertificates: certs, Err: err}
 		}
 
diff --git a/src/crypto/tls/handshake_server_tls13.go b/src/crypto/tls/handshake_server_tls13.go
index b7b568c..07b1a38 100644
--- a/src/crypto/tls/handshake_server_tls13.go
+++ b/src/crypto/tls/handshake_server_tls13.go
@@ -29,6 +29,7 @@
 	hello           *serverHelloMsg
 	sentDummyCCS    bool
 	usingPSK        bool
+	earlyData       bool
 	suite           *cipherSuiteTLS13
 	cert            *Certificate
 	sigAlg          SignatureScheme
@@ -139,7 +140,12 @@
 		return errors.New("tls: initial handshake had non-empty renegotiation extension")
 	}
 
-	if hs.clientHello.earlyData {
+	if hs.clientHello.earlyData && c.quic != nil {
+		if len(hs.clientHello.pskIdentities) == 0 {
+			c.sendAlert(alertIllegalParameter)
+			return errors.New("tls: early_data without pre_shared_key")
+		}
+	} else if hs.clientHello.earlyData {
 		// See RFC 8446, Section 4.2.10 for the complicated behavior required
 		// here. The scenario is that a different server at our address offered
 		// to accept early data in the past, which we can't handle. For now, all
@@ -226,6 +232,27 @@
 		return errors.New("tls: invalid client key share")
 	}
 
+	selectedProto, err := negotiateALPN(c.config.NextProtos, hs.clientHello.alpnProtocols, c.quic != nil)
+	if err != nil {
+		c.sendAlert(alertNoApplicationProtocol)
+		return err
+	}
+	c.clientProtocol = selectedProto
+
+	if c.quic != nil {
+		if hs.clientHello.quicTransportParameters == nil {
+			// RFC 9001 Section 8.2.
+			c.sendAlert(alertMissingExtension)
+			return errors.New("tls: client did not send a quic_transport_parameters extension")
+		}
+		c.quicSetTransportParameters(hs.clientHello.quicTransportParameters)
+	} else {
+		if hs.clientHello.quicTransportParameters != nil {
+			c.sendAlert(alertUnsupportedExtension)
+			return errors.New("tls: client sent an unexpected quic_transport_parameters extension")
+		}
+	}
+
 	c.serverName = hs.clientHello.serverName
 	return nil
 }
@@ -261,12 +288,29 @@
 			break
 		}
 
-		plaintext, _ := c.decryptTicket(identity.label)
-		if plaintext == nil {
-			continue
+		var sessionState *SessionState
+		if c.config.UnwrapSession != nil {
+			var err error
+			sessionState, err = c.config.UnwrapSession(identity.label, c.connectionStateLocked())
+			if err != nil {
+				return err
+			}
+			if sessionState == nil {
+				continue
+			}
+		} else {
+			plaintext := c.config.decryptTicket(identity.label, c.ticketKeys)
+			if plaintext == nil {
+				continue
+			}
+			var err error
+			sessionState, err = ParseSessionState(plaintext)
+			if err != nil {
+				continue
+			}
 		}
-		sessionState := new(sessionStateTLS13)
-		if ok := sessionState.unmarshal(plaintext); !ok {
+
+		if sessionState.version != VersionTLS13 {
 			continue
 		}
 
@@ -275,10 +319,6 @@
 			continue
 		}
 
-		// We don't check the obfuscated ticket age because it's affected by
-		// clock skew and it's only a freshness signal useful for shrinking the
-		// window for replay attacks, which don't affect us as we don't do 0-RTT.
-
 		pskSuite := cipherSuiteTLS13ByID(sessionState.cipherSuite)
 		if pskSuite == nil || pskSuite.hash != hs.suite.hash {
 			continue
@@ -287,7 +327,7 @@
 		// PSK connections don't re-establish client certificates, but carry
 		// them over in the session ticket. Ensure the presence of client certs
 		// in the ticket is consistent with the configured requirements.
-		sessionHasClientCerts := len(sessionState.certificate.Certificate) != 0
+		sessionHasClientCerts := len(sessionState.peerCertificates) != 0
 		needClientCerts := requiresClientCert(c.config.ClientAuth)
 		if needClientCerts && !sessionHasClientCerts {
 			continue
@@ -295,10 +335,15 @@
 		if sessionHasClientCerts && c.config.ClientAuth == NoClientCert {
 			continue
 		}
+		if sessionHasClientCerts && c.config.time().After(sessionState.peerCertificates[0].NotAfter) {
+			continue
+		}
+		if sessionHasClientCerts && c.config.ClientAuth >= VerifyClientCertIfGiven &&
+			len(sessionState.verifiedChains) == 0 {
+			continue
+		}
 
-		psk := hs.suite.expandLabel(sessionState.resumptionSecret, "resumption",
-			nil, hs.suite.hash.Size())
-		hs.earlySecret = hs.suite.extract(psk, nil)
+		hs.earlySecret = hs.suite.extract(sessionState.secret, nil)
 		binderKey := hs.suite.deriveSecret(hs.earlySecret, resumptionBinderLabel, nil)
 		// Clone the transcript in case a HelloRetryRequest was recorded.
 		transcript := cloneHash(hs.transcript, hs.suite.hash)
@@ -318,11 +363,25 @@
 			return errors.New("tls: invalid PSK binder")
 		}
 
-		c.didResume = true
-		if err := c.processCertsFromClient(sessionState.certificate); err != nil {
-			return err
+		if c.quic != nil && hs.clientHello.earlyData && i == 0 &&
+			sessionState.EarlyData && sessionState.cipherSuite == hs.suite.id &&
+			sessionState.alpnProtocol == c.clientProtocol {
+			hs.earlyData = true
+
+			transcript := hs.suite.hash.New()
+			if err := transcriptMsg(hs.clientHello, transcript); err != nil {
+				return err
+			}
+			earlyTrafficSecret := hs.suite.deriveSecret(hs.earlySecret, clientEarlyTrafficLabel, transcript)
+			c.quicSetReadSecret(QUICEncryptionLevelEarly, hs.suite.id, earlyTrafficSecret)
 		}
 
+		c.didResume = true
+		c.peerCertificates = sessionState.peerCertificates
+		c.ocspResponse = sessionState.ocspResponse
+		c.scts = sessionState.scts
+		c.verifiedChains = sessionState.verifiedChains
+
 		hs.hello.selectedIdentityPresent = true
 		hs.hello.selectedIdentity = uint16(i)
 		hs.usingPSK = true
@@ -397,6 +456,9 @@
 // sendDummyChangeCipherSpec sends a ChangeCipherSpec record for compatibility
 // with middleboxes that didn't implement TLS correctly. See RFC 8446, Appendix D.4.
 func (hs *serverHandshakeStateTLS13) sendDummyChangeCipherSpec() error {
+	if hs.c.quic != nil {
+		return nil
+	}
 	if hs.sentDummyCCS {
 		return nil
 	}
@@ -548,10 +610,18 @@
 
 	clientSecret := hs.suite.deriveSecret(hs.handshakeSecret,
 		clientHandshakeTrafficLabel, hs.transcript)
-	c.in.setTrafficSecret(hs.suite, clientSecret)
+	c.in.setTrafficSecret(hs.suite, QUICEncryptionLevelHandshake, clientSecret)
 	serverSecret := hs.suite.deriveSecret(hs.handshakeSecret,
 		serverHandshakeTrafficLabel, hs.transcript)
-	c.out.setTrafficSecret(hs.suite, serverSecret)
+	c.out.setTrafficSecret(hs.suite, QUICEncryptionLevelHandshake, serverSecret)
+
+	if c.quic != nil {
+		if c.hand.Len() != 0 {
+			c.sendAlert(alertUnexpectedMessage)
+		}
+		c.quicSetWriteSecret(QUICEncryptionLevelHandshake, hs.suite.id, serverSecret)
+		c.quicSetReadSecret(QUICEncryptionLevelHandshake, hs.suite.id, clientSecret)
+	}
 
 	err := c.config.writeKeyLog(keyLogLabelClientHandshake, hs.clientHello.random, clientSecret)
 	if err != nil {
@@ -565,14 +635,16 @@
 	}
 
 	encryptedExtensions := new(encryptedExtensionsMsg)
+	encryptedExtensions.alpnProtocol = c.clientProtocol
 
-	selectedProto, err := negotiateALPN(c.config.NextProtos, hs.clientHello.alpnProtocols)
-	if err != nil {
-		c.sendAlert(alertNoApplicationProtocol)
-		return err
+	if c.quic != nil {
+		p, err := c.quicGetTransportParameters()
+		if err != nil {
+			return err
+		}
+		encryptedExtensions.quicTransportParameters = p
+		encryptedExtensions.earlyData = hs.earlyData
 	}
-	encryptedExtensions.alpnProtocol = selectedProto
-	c.clientProtocol = selectedProto
 
 	if _, err := hs.c.writeHandshakeRecord(encryptedExtensions, hs.transcript); err != nil {
 		return err
@@ -672,7 +744,15 @@
 		clientApplicationTrafficLabel, hs.transcript)
 	serverSecret := hs.suite.deriveSecret(hs.masterSecret,
 		serverApplicationTrafficLabel, hs.transcript)
-	c.out.setTrafficSecret(hs.suite, serverSecret)
+	c.out.setTrafficSecret(hs.suite, QUICEncryptionLevelApplication, serverSecret)
+
+	if c.quic != nil {
+		if c.hand.Len() != 0 {
+			// TODO: Handle this in setTrafficSecret?
+			c.sendAlert(alertUnexpectedMessage)
+		}
+		c.quicSetWriteSecret(QUICEncryptionLevelApplication, hs.suite.id, serverSecret)
+	}
 
 	err := c.config.writeKeyLog(keyLogLabelClientTraffic, hs.clientHello.random, hs.trafficSecret)
 	if err != nil {
@@ -704,6 +784,11 @@
 		return false
 	}
 
+	// QUIC tickets are sent by QUICConn.SendSessionTicket, not automatically.
+	if hs.c.quic != nil {
+		return false
+	}
+
 	// Don't send tickets the client wouldn't use. See RFC 8446, Section 4.2.9.
 	for _, pskMode := range hs.clientHello.pskModes {
 		if pskMode == pskModeDHE {
@@ -724,52 +809,65 @@
 		return err
 	}
 
+	c.resumptionSecret = hs.suite.deriveSecret(hs.masterSecret,
+		resumptionLabel, hs.transcript)
+
 	if !hs.shouldSendSessionTickets() {
 		return nil
 	}
+	return c.sendSessionTicket(false)
+}
 
-	resumptionSecret := hs.suite.deriveSecret(hs.masterSecret,
-		resumptionLabel, hs.transcript)
+func (c *Conn) sendSessionTicket(earlyData bool) error {
+	suite := cipherSuiteTLS13ByID(c.cipherSuite)
+	if suite == nil {
+		return errors.New("tls: internal error: unknown cipher suite")
+	}
+	// ticket_nonce, which must be unique per connection, is always left at
+	// zero because we only ever send one ticket per connection.
+	psk := suite.expandLabel(c.resumptionSecret, "resumption",
+		nil, suite.hash.Size())
 
 	m := new(newSessionTicketMsgTLS13)
 
-	var certsFromClient [][]byte
-	for _, cert := range c.peerCertificates {
-		certsFromClient = append(certsFromClient, cert.Raw)
-	}
-	state := sessionStateTLS13{
-		cipherSuite:      hs.suite.id,
-		createdAt:        uint64(c.config.time().Unix()),
-		resumptionSecret: resumptionSecret,
-		certificate: Certificate{
-			Certificate:                 certsFromClient,
-			OCSPStaple:                  c.ocspResponse,
-			SignedCertificateTimestamps: c.scts,
-		},
-	}
-	stateBytes, err := state.marshal()
-	if err != nil {
-		c.sendAlert(alertInternalError)
-		return err
-	}
-	m.label, err = c.encryptTicket(stateBytes)
+	state, err := c.sessionState()
 	if err != nil {
 		return err
 	}
+	state.secret = psk
+	state.EarlyData = earlyData
+	if c.config.WrapSession != nil {
+		m.label, err = c.config.WrapSession(c.connectionStateLocked(), state)
+		if err != nil {
+			return err
+		}
+	} else {
+		stateBytes, err := state.Bytes()
+		if err != nil {
+			c.sendAlert(alertInternalError)
+			return err
+		}
+		m.label, err = c.config.encryptTicket(stateBytes, c.ticketKeys)
+		if err != nil {
+			return err
+		}
+	}
 	m.lifetime = uint32(maxSessionTicketLifetime / time.Second)
 
 	// ticket_age_add is a random 32-bit value. See RFC 8446, section 4.6.1
 	// The value is not stored anywhere; we never need to check the ticket age
 	// because 0-RTT is not supported.
 	ageAdd := make([]byte, 4)
-	_, err = hs.c.config.rand().Read(ageAdd)
+	_, err = c.config.rand().Read(ageAdd)
 	if err != nil {
 		return err
 	}
 	m.ageAdd = binary.LittleEndian.Uint32(ageAdd)
 
-	// ticket_nonce, which must be unique per connection, is always left at
-	// zero because we only ever send one ticket per connection.
+	if earlyData {
+		// RFC 9001, Section 4.6.1
+		m.maxEarlyData = 0xffffffff
+	}
 
 	if _, err := c.writeHandshakeRecord(m, nil); err != nil {
 		return err
@@ -887,7 +985,7 @@
 		return errors.New("tls: invalid client finished hash")
 	}
 
-	c.in.setTrafficSecret(hs.suite, hs.trafficSecret)
+	c.in.setTrafficSecret(hs.suite, QUICEncryptionLevelApplication, hs.trafficSecret)
 
 	return nil
 }
diff --git a/src/crypto/tls/key_schedule.go b/src/crypto/tls/key_schedule.go
index ae8f80a..d7f082c 100644
--- a/src/crypto/tls/key_schedule.go
+++ b/src/crypto/tls/key_schedule.go
@@ -21,6 +21,7 @@
 
 const (
 	resumptionBinderLabel         = "res binder"
+	clientEarlyTrafficLabel       = "c e traffic"
 	clientHandshakeTrafficLabel   = "c hs traffic"
 	serverHandshakeTrafficLabel   = "s hs traffic"
 	clientApplicationTrafficLabel = "c ap traffic"
diff --git a/src/crypto/tls/prf.go b/src/crypto/tls/prf.go
index b60166d..20bac96 100644
--- a/src/crypto/tls/prf.go
+++ b/src/crypto/tls/prf.go
@@ -80,6 +80,7 @@
 )
 
 var masterSecretLabel = []byte("master secret")
+var extendedMasterSecretLabel = []byte("extended master secret")
 var keyExpansionLabel = []byte("key expansion")
 var clientFinishedLabel = []byte("client finished")
 var serverFinishedLabel = []byte("server finished")
@@ -115,6 +116,14 @@
 	return masterSecret
 }
 
+// extMasterFromPreMasterSecret generates the extended master secret from the
+// pre-master secret. See RFC 7627.
+func extMasterFromPreMasterSecret(version uint16, suite *cipherSuite, preMasterSecret, transcript []byte) []byte {
+	masterSecret := make([]byte, masterSecretLength)
+	prfForVersion(version, suite)(masterSecret, preMasterSecret, extendedMasterSecretLabel, transcript)
+	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.
diff --git a/src/crypto/tls/quic.go b/src/crypto/tls/quic.go
new file mode 100644
index 0000000..ba5c2af
--- /dev/null
+++ b/src/crypto/tls/quic.go
@@ -0,0 +1,421 @@
+// Copyright 2023 The Go Authors. 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 (
+	"context"
+	"errors"
+	"fmt"
+)
+
+// QUICEncryptionLevel represents a QUIC encryption level used to transmit
+// handshake messages.
+type QUICEncryptionLevel int
+
+const (
+	QUICEncryptionLevelInitial = QUICEncryptionLevel(iota)
+	QUICEncryptionLevelEarly
+	QUICEncryptionLevelHandshake
+	QUICEncryptionLevelApplication
+)
+
+func (l QUICEncryptionLevel) String() string {
+	switch l {
+	case QUICEncryptionLevelInitial:
+		return "Initial"
+	case QUICEncryptionLevelEarly:
+		return "Early"
+	case QUICEncryptionLevelHandshake:
+		return "Handshake"
+	case QUICEncryptionLevelApplication:
+		return "Application"
+	default:
+		return fmt.Sprintf("QUICEncryptionLevel(%v)", int(l))
+	}
+}
+
+// A QUICConn represents a connection which uses a QUIC implementation as the underlying
+// transport as described in RFC 9001.
+//
+// Methods of QUICConn are not safe for concurrent use.
+type QUICConn struct {
+	conn *Conn
+
+	sessionTicketSent bool
+}
+
+// A QUICConfig configures a QUICConn.
+type QUICConfig struct {
+	TLSConfig *Config
+}
+
+// A QUICEventKind is a type of operation on a QUIC connection.
+type QUICEventKind int
+
+const (
+	// QUICNoEvent indicates that there are no events available.
+	QUICNoEvent QUICEventKind = iota
+
+	// QUICSetReadSecret and QUICSetWriteSecret provide the read and write
+	// secrets for a given encryption level.
+	// QUICEvent.Level, QUICEvent.Data, and QUICEvent.Suite are set.
+	//
+	// Secrets for the Initial encryption level are derived from the initial
+	// destination connection ID, and are not provided by the QUICConn.
+	QUICSetReadSecret
+	QUICSetWriteSecret
+
+	// QUICWriteData provides data to send to the peer in CRYPTO frames.
+	// QUICEvent.Data is set.
+	QUICWriteData
+
+	// QUICTransportParameters provides the peer's QUIC transport parameters.
+	// QUICEvent.Data is set.
+	QUICTransportParameters
+
+	// QUICTransportParametersRequired indicates that the caller must provide
+	// QUIC transport parameters to send to the peer. The caller should set
+	// the transport parameters with QUICConn.SetTransportParameters and call
+	// QUICConn.NextEvent again.
+	//
+	// If transport parameters are set before calling QUICConn.Start, the
+	// connection will never generate a QUICTransportParametersRequired event.
+	QUICTransportParametersRequired
+
+	// QUICRejectedEarlyData indicates that the server rejected 0-RTT data even
+	// if we offered it. It's returned before QUICEncryptionLevelApplication
+	// keys are returned.
+	QUICRejectedEarlyData
+
+	// QUICHandshakeDone indicates that the TLS handshake has completed.
+	QUICHandshakeDone
+)
+
+// A QUICEvent is an event occurring on a QUIC connection.
+//
+// The type of event is specified by the Kind field.
+// The contents of the other fields are kind-specific.
+type QUICEvent struct {
+	Kind QUICEventKind
+
+	// Set for QUICSetReadSecret, QUICSetWriteSecret, and QUICWriteData.
+	Level QUICEncryptionLevel
+
+	// Set for QUICTransportParameters, QUICSetReadSecret, QUICSetWriteSecret, and QUICWriteData.
+	// The contents are owned by crypto/tls, and are valid until the next NextEvent call.
+	Data []byte
+
+	// Set for QUICSetReadSecret and QUICSetWriteSecret.
+	Suite uint16
+}
+
+type quicState struct {
+	events    []QUICEvent
+	nextEvent int
+
+	// eventArr is a statically allocated event array, large enough to handle
+	// the usual maximum number of events resulting from a single call: transport
+	// parameters, Initial data, Early read secret, Handshake write and read
+	// secrets, Handshake data, Application write secret, Application data.
+	eventArr [8]QUICEvent
+
+	started  bool
+	signalc  chan struct{}   // handshake data is available to be read
+	blockedc chan struct{}   // handshake is waiting for data, closed when done
+	cancelc  <-chan struct{} // handshake has been canceled
+	cancel   context.CancelFunc
+
+	// readbuf is shared between HandleData and the handshake goroutine.
+	// HandshakeCryptoData passes ownership to the handshake goroutine by
+	// reading from signalc, and reclaims ownership by reading from blockedc.
+	readbuf []byte
+
+	transportParams []byte // to send to the peer
+}
+
+// QUICClient returns a new TLS client side connection using QUICTransport as the
+// underlying transport. The config cannot be nil.
+//
+// The config's MinVersion must be at least TLS 1.3.
+func QUICClient(config *QUICConfig) *QUICConn {
+	return newQUICConn(Client(nil, config.TLSConfig))
+}
+
+// QUICServer returns a new TLS server side connection using QUICTransport as the
+// underlying transport. The config cannot be nil.
+//
+// The config's MinVersion must be at least TLS 1.3.
+func QUICServer(config *QUICConfig) *QUICConn {
+	return newQUICConn(Server(nil, config.TLSConfig))
+}
+
+func newQUICConn(conn *Conn) *QUICConn {
+	conn.quic = &quicState{
+		signalc:  make(chan struct{}),
+		blockedc: make(chan struct{}),
+	}
+	conn.quic.events = conn.quic.eventArr[:0]
+	return &QUICConn{
+		conn: conn,
+	}
+}
+
+// Start starts the client or server handshake protocol.
+// It may produce connection events, which may be read with NextEvent.
+//
+// Start must be called at most once.
+func (q *QUICConn) Start(ctx context.Context) error {
+	if q.conn.quic.started {
+		return quicError(errors.New("tls: Start called more than once"))
+	}
+	q.conn.quic.started = true
+	if q.conn.config.MinVersion < VersionTLS13 {
+		return quicError(errors.New("tls: Config MinVersion must be at least TLS 1.13"))
+	}
+	go q.conn.HandshakeContext(ctx)
+	if _, ok := <-q.conn.quic.blockedc; !ok {
+		return q.conn.handshakeErr
+	}
+	return nil
+}
+
+// NextEvent returns the next event occurring on the connection.
+// It returns an event with a Kind of QUICNoEvent when no events are available.
+func (q *QUICConn) NextEvent() QUICEvent {
+	qs := q.conn.quic
+	if last := qs.nextEvent - 1; last >= 0 && len(qs.events[last].Data) > 0 {
+		// Write over some of the previous event's data,
+		// to catch callers erroniously retaining it.
+		qs.events[last].Data[0] = 0
+	}
+	if qs.nextEvent >= len(qs.events) {
+		qs.events = qs.events[:0]
+		qs.nextEvent = 0
+		return QUICEvent{Kind: QUICNoEvent}
+	}
+	e := qs.events[qs.nextEvent]
+	qs.events[qs.nextEvent] = QUICEvent{} // zero out references to data
+	qs.nextEvent++
+	return e
+}
+
+// Close closes the connection and stops any in-progress handshake.
+func (q *QUICConn) Close() error {
+	if q.conn.quic.cancel == nil {
+		return nil // never started
+	}
+	q.conn.quic.cancel()
+	for range q.conn.quic.blockedc {
+		// Wait for the handshake goroutine to return.
+	}
+	return q.conn.handshakeErr
+}
+
+// HandleData handles handshake bytes received from the peer.
+// It may produce connection events, which may be read with NextEvent.
+func (q *QUICConn) HandleData(level QUICEncryptionLevel, data []byte) error {
+	c := q.conn
+	if c.in.level != level {
+		return quicError(c.in.setErrorLocked(errors.New("tls: handshake data received at wrong level")))
+	}
+	c.quic.readbuf = data
+	<-c.quic.signalc
+	_, ok := <-c.quic.blockedc
+	if ok {
+		// The handshake goroutine is waiting for more data.
+		return nil
+	}
+	// The handshake goroutine has exited.
+	c.handshakeMutex.Lock()
+	defer c.handshakeMutex.Unlock()
+	c.hand.Write(c.quic.readbuf)
+	c.quic.readbuf = nil
+	for q.conn.hand.Len() >= 4 && q.conn.handshakeErr == nil {
+		b := q.conn.hand.Bytes()
+		n := int(b[1])<<16 | int(b[2])<<8 | int(b[3])
+		if n > maxHandshake {
+			q.conn.handshakeErr = fmt.Errorf("tls: handshake message of length %d bytes exceeds maximum of %d bytes", n, maxHandshake)
+			break
+		}
+		if len(b) < 4+n {
+			return nil
+		}
+		if err := q.conn.handlePostHandshakeMessage(); err != nil {
+			q.conn.handshakeErr = err
+		}
+	}
+	if q.conn.handshakeErr != nil {
+		return quicError(q.conn.handshakeErr)
+	}
+	return nil
+}
+
+type QUICSessionTicketOptions struct {
+	// EarlyData specifies whether the ticket may be used for 0-RTT.
+	EarlyData bool
+}
+
+// SendSessionTicket sends a session ticket to the client.
+// It produces connection events, which may be read with NextEvent.
+// Currently, it can only be called once.
+func (q *QUICConn) SendSessionTicket(opts QUICSessionTicketOptions) error {
+	c := q.conn
+	if !c.isHandshakeComplete.Load() {
+		return quicError(errors.New("tls: SendSessionTicket called before handshake completed"))
+	}
+	if c.isClient {
+		return quicError(errors.New("tls: SendSessionTicket called on the client"))
+	}
+	if q.sessionTicketSent {
+		return quicError(errors.New("tls: SendSessionTicket called multiple times"))
+	}
+	q.sessionTicketSent = true
+	return quicError(c.sendSessionTicket(opts.EarlyData))
+}
+
+// ConnectionState returns basic TLS details about the connection.
+func (q *QUICConn) ConnectionState() ConnectionState {
+	return q.conn.ConnectionState()
+}
+
+// SetTransportParameters sets the transport parameters to send to the peer.
+//
+// Server connections may delay setting the transport parameters until after
+// receiving the client's transport parameters. See QUICTransportParametersRequired.
+func (q *QUICConn) SetTransportParameters(params []byte) {
+	if params == nil {
+		params = []byte{}
+	}
+	q.conn.quic.transportParams = params
+	if q.conn.quic.started {
+		<-q.conn.quic.signalc
+		<-q.conn.quic.blockedc
+	}
+}
+
+// quicError ensures err is an AlertError.
+// If err is not already, quicError wraps it with alertInternalError.
+func quicError(err error) error {
+	if err == nil {
+		return nil
+	}
+	var ae AlertError
+	if errors.As(err, &ae) {
+		return err
+	}
+	var a alert
+	if !errors.As(err, &a) {
+		a = alertInternalError
+	}
+	// Return an error wrapping the original error and an AlertError.
+	// Truncate the text of the alert to 0 characters.
+	return fmt.Errorf("%w%.0w", err, AlertError(a))
+}
+
+func (c *Conn) quicReadHandshakeBytes(n int) error {
+	for c.hand.Len() < n {
+		if err := c.quicWaitForSignal(); err != nil {
+			return err
+		}
+	}
+	return nil
+}
+
+func (c *Conn) quicSetReadSecret(level QUICEncryptionLevel, suite uint16, secret []byte) {
+	c.quic.events = append(c.quic.events, QUICEvent{
+		Kind:  QUICSetReadSecret,
+		Level: level,
+		Suite: suite,
+		Data:  secret,
+	})
+}
+
+func (c *Conn) quicSetWriteSecret(level QUICEncryptionLevel, suite uint16, secret []byte) {
+	c.quic.events = append(c.quic.events, QUICEvent{
+		Kind:  QUICSetWriteSecret,
+		Level: level,
+		Suite: suite,
+		Data:  secret,
+	})
+}
+
+func (c *Conn) quicWriteCryptoData(level QUICEncryptionLevel, data []byte) {
+	var last *QUICEvent
+	if len(c.quic.events) > 0 {
+		last = &c.quic.events[len(c.quic.events)-1]
+	}
+	if last == nil || last.Kind != QUICWriteData || last.Level != level {
+		c.quic.events = append(c.quic.events, QUICEvent{
+			Kind:  QUICWriteData,
+			Level: level,
+		})
+		last = &c.quic.events[len(c.quic.events)-1]
+	}
+	last.Data = append(last.Data, data...)
+}
+
+func (c *Conn) quicSetTransportParameters(params []byte) {
+	c.quic.events = append(c.quic.events, QUICEvent{
+		Kind: QUICTransportParameters,
+		Data: params,
+	})
+}
+
+func (c *Conn) quicGetTransportParameters() ([]byte, error) {
+	if c.quic.transportParams == nil {
+		c.quic.events = append(c.quic.events, QUICEvent{
+			Kind: QUICTransportParametersRequired,
+		})
+	}
+	for c.quic.transportParams == nil {
+		if err := c.quicWaitForSignal(); err != nil {
+			return nil, err
+		}
+	}
+	return c.quic.transportParams, nil
+}
+
+func (c *Conn) quicHandshakeComplete() {
+	c.quic.events = append(c.quic.events, QUICEvent{
+		Kind: QUICHandshakeDone,
+	})
+}
+
+func (c *Conn) quicRejectedEarlyData() {
+	c.quic.events = append(c.quic.events, QUICEvent{
+		Kind: QUICRejectedEarlyData,
+	})
+}
+
+// quicWaitForSignal notifies the QUICConn that handshake progress is blocked,
+// and waits for a signal that the handshake should proceed.
+//
+// The handshake may become blocked waiting for handshake bytes
+// or for the user to provide transport parameters.
+func (c *Conn) quicWaitForSignal() error {
+	// Drop the handshake mutex while blocked to allow the user
+	// to call ConnectionState before the handshake completes.
+	c.handshakeMutex.Unlock()
+	defer c.handshakeMutex.Lock()
+	// Send on blockedc to notify the QUICConn that the handshake is blocked.
+	// Exported methods of QUICConn wait for the handshake to become blocked
+	// before returning to the user.
+	select {
+	case c.quic.blockedc <- struct{}{}:
+	case <-c.quic.cancelc:
+		return c.sendAlertLocked(alertCloseNotify)
+	}
+	// The QUICConn reads from signalc to notify us that the handshake may
+	// be able to proceed. (The QUICConn reads, because we close signalc to
+	// indicate that the handshake has completed.)
+	select {
+	case c.quic.signalc <- struct{}{}:
+		c.hand.Write(c.quic.readbuf)
+		c.quic.readbuf = nil
+	case <-c.quic.cancelc:
+		return c.sendAlertLocked(alertCloseNotify)
+	}
+	return nil
+}
diff --git a/src/crypto/tls/quic_test.go b/src/crypto/tls/quic_test.go
new file mode 100644
index 0000000..323906a
--- /dev/null
+++ b/src/crypto/tls/quic_test.go
@@ -0,0 +1,489 @@
+// Copyright 2023 The Go Authors. 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 (
+	"context"
+	"errors"
+	"reflect"
+	"testing"
+)
+
+type testQUICConn struct {
+	t           *testing.T
+	conn        *QUICConn
+	readSecret  map[QUICEncryptionLevel]suiteSecret
+	writeSecret map[QUICEncryptionLevel]suiteSecret
+	gotParams   []byte
+	complete    bool
+}
+
+func newTestQUICClient(t *testing.T, config *Config) *testQUICConn {
+	q := &testQUICConn{t: t}
+	q.conn = QUICClient(&QUICConfig{
+		TLSConfig: config,
+	})
+	t.Cleanup(func() {
+		q.conn.Close()
+	})
+	return q
+}
+
+func newTestQUICServer(t *testing.T, config *Config) *testQUICConn {
+	q := &testQUICConn{t: t}
+	q.conn = QUICServer(&QUICConfig{
+		TLSConfig: config,
+	})
+	t.Cleanup(func() {
+		q.conn.Close()
+	})
+	return q
+}
+
+type suiteSecret struct {
+	suite  uint16
+	secret []byte
+}
+
+func (q *testQUICConn) setReadSecret(level QUICEncryptionLevel, suite uint16, secret []byte) {
+	if _, ok := q.writeSecret[level]; !ok {
+		q.t.Errorf("SetReadSecret for level %v called before SetWriteSecret", level)
+	}
+	if level == QUICEncryptionLevelApplication && !q.complete {
+		q.t.Errorf("SetReadSecret for level %v called before HandshakeComplete", level)
+	}
+	if _, ok := q.readSecret[level]; ok {
+		q.t.Errorf("SetReadSecret for level %v called twice", level)
+	}
+	if q.readSecret == nil {
+		q.readSecret = map[QUICEncryptionLevel]suiteSecret{}
+	}
+	switch level {
+	case QUICEncryptionLevelHandshake, QUICEncryptionLevelApplication:
+		q.readSecret[level] = suiteSecret{suite, secret}
+	default:
+		q.t.Errorf("SetReadSecret for unexpected level %v", level)
+	}
+}
+
+func (q *testQUICConn) setWriteSecret(level QUICEncryptionLevel, suite uint16, secret []byte) {
+	if _, ok := q.writeSecret[level]; ok {
+		q.t.Errorf("SetWriteSecret for level %v called twice", level)
+	}
+	if q.writeSecret == nil {
+		q.writeSecret = map[QUICEncryptionLevel]suiteSecret{}
+	}
+	switch level {
+	case QUICEncryptionLevelHandshake, QUICEncryptionLevelApplication:
+		q.writeSecret[level] = suiteSecret{suite, secret}
+	default:
+		q.t.Errorf("SetWriteSecret for unexpected level %v", level)
+	}
+}
+
+var errTransportParametersRequired = errors.New("transport parameters required")
+
+func runTestQUICConnection(ctx context.Context, cli, srv *testQUICConn, onEvent func(e QUICEvent, src, dst *testQUICConn) bool) error {
+	a, b := cli, srv
+	for _, c := range []*testQUICConn{a, b} {
+		if !c.conn.conn.quic.started {
+			if err := c.conn.Start(ctx); err != nil {
+				return err
+			}
+		}
+	}
+	idleCount := 0
+	for {
+		e := a.conn.NextEvent()
+		if onEvent != nil && onEvent(e, a, b) {
+			continue
+		}
+		switch e.Kind {
+		case QUICNoEvent:
+			idleCount++
+			if idleCount == 2 {
+				if !a.complete || !b.complete {
+					return errors.New("handshake incomplete")
+				}
+				return nil
+			}
+			a, b = b, a
+		case QUICSetReadSecret:
+			a.setReadSecret(e.Level, e.Suite, e.Data)
+		case QUICSetWriteSecret:
+			a.setWriteSecret(e.Level, e.Suite, e.Data)
+		case QUICWriteData:
+			if err := b.conn.HandleData(e.Level, e.Data); err != nil {
+				return err
+			}
+		case QUICTransportParameters:
+			a.gotParams = e.Data
+			if a.gotParams == nil {
+				a.gotParams = []byte{}
+			}
+		case QUICTransportParametersRequired:
+			return errTransportParametersRequired
+		case QUICHandshakeDone:
+			a.complete = true
+			if a == srv {
+				opts := QUICSessionTicketOptions{}
+				if err := srv.conn.SendSessionTicket(opts); err != nil {
+					return err
+				}
+			}
+		}
+		if e.Kind != QUICNoEvent {
+			idleCount = 0
+		}
+	}
+}
+
+func TestQUICConnection(t *testing.T) {
+	config := testConfig.Clone()
+	config.MinVersion = VersionTLS13
+
+	cli := newTestQUICClient(t, config)
+	cli.conn.SetTransportParameters(nil)
+
+	srv := newTestQUICServer(t, config)
+	srv.conn.SetTransportParameters(nil)
+
+	if err := runTestQUICConnection(context.Background(), cli, srv, nil); err != nil {
+		t.Fatalf("error during connection handshake: %v", err)
+	}
+
+	if _, ok := cli.readSecret[QUICEncryptionLevelHandshake]; !ok {
+		t.Errorf("client has no Handshake secret")
+	}
+	if _, ok := cli.readSecret[QUICEncryptionLevelApplication]; !ok {
+		t.Errorf("client has no Application secret")
+	}
+	if _, ok := srv.readSecret[QUICEncryptionLevelHandshake]; !ok {
+		t.Errorf("server has no Handshake secret")
+	}
+	if _, ok := srv.readSecret[QUICEncryptionLevelApplication]; !ok {
+		t.Errorf("server has no Application secret")
+	}
+	for _, level := range []QUICEncryptionLevel{QUICEncryptionLevelHandshake, QUICEncryptionLevelApplication} {
+		if _, ok := cli.readSecret[level]; !ok {
+			t.Errorf("client has no %v read secret", level)
+		}
+		if _, ok := srv.readSecret[level]; !ok {
+			t.Errorf("server has no %v read secret", level)
+		}
+		if !reflect.DeepEqual(cli.readSecret[level], srv.writeSecret[level]) {
+			t.Errorf("client read secret does not match server write secret for level %v", level)
+		}
+		if !reflect.DeepEqual(cli.writeSecret[level], srv.readSecret[level]) {
+			t.Errorf("client write secret does not match server read secret for level %v", level)
+		}
+	}
+}
+
+func TestQUICSessionResumption(t *testing.T) {
+	clientConfig := testConfig.Clone()
+	clientConfig.MinVersion = VersionTLS13
+	clientConfig.ClientSessionCache = NewLRUClientSessionCache(1)
+	clientConfig.ServerName = "example.go.dev"
+
+	serverConfig := testConfig.Clone()
+	serverConfig.MinVersion = VersionTLS13
+
+	cli := newTestQUICClient(t, clientConfig)
+	cli.conn.SetTransportParameters(nil)
+	srv := newTestQUICServer(t, serverConfig)
+	srv.conn.SetTransportParameters(nil)
+	if err := runTestQUICConnection(context.Background(), cli, srv, nil); err != nil {
+		t.Fatalf("error during first connection handshake: %v", err)
+	}
+	if cli.conn.ConnectionState().DidResume {
+		t.Errorf("first connection unexpectedly used session resumption")
+	}
+
+	cli2 := newTestQUICClient(t, clientConfig)
+	cli2.conn.SetTransportParameters(nil)
+	srv2 := newTestQUICServer(t, serverConfig)
+	srv2.conn.SetTransportParameters(nil)
+	if err := runTestQUICConnection(context.Background(), cli2, srv2, nil); err != nil {
+		t.Fatalf("error during second connection handshake: %v", err)
+	}
+	if !cli2.conn.ConnectionState().DidResume {
+		t.Errorf("second connection did not use session resumption")
+	}
+}
+
+func TestQUICFragmentaryData(t *testing.T) {
+	clientConfig := testConfig.Clone()
+	clientConfig.MinVersion = VersionTLS13
+	clientConfig.ClientSessionCache = NewLRUClientSessionCache(1)
+	clientConfig.ServerName = "example.go.dev"
+
+	serverConfig := testConfig.Clone()
+	serverConfig.MinVersion = VersionTLS13
+
+	cli := newTestQUICClient(t, clientConfig)
+	cli.conn.SetTransportParameters(nil)
+	srv := newTestQUICServer(t, serverConfig)
+	srv.conn.SetTransportParameters(nil)
+	onEvent := func(e QUICEvent, src, dst *testQUICConn) bool {
+		if e.Kind == QUICWriteData {
+			// Provide the data one byte at a time.
+			for i := range e.Data {
+				if err := dst.conn.HandleData(e.Level, e.Data[i:i+1]); err != nil {
+					t.Errorf("HandleData: %v", err)
+					break
+				}
+			}
+			return true
+		}
+		return false
+	}
+	if err := runTestQUICConnection(context.Background(), cli, srv, onEvent); err != nil {
+		t.Fatalf("error during first connection handshake: %v", err)
+	}
+}
+
+func TestQUICPostHandshakeClientAuthentication(t *testing.T) {
+	// RFC 9001, Section 4.4.
+	config := testConfig.Clone()
+	config.MinVersion = VersionTLS13
+	cli := newTestQUICClient(t, config)
+	cli.conn.SetTransportParameters(nil)
+	srv := newTestQUICServer(t, config)
+	srv.conn.SetTransportParameters(nil)
+	if err := runTestQUICConnection(context.Background(), cli, srv, nil); err != nil {
+		t.Fatalf("error during connection handshake: %v", err)
+	}
+
+	certReq := new(certificateRequestMsgTLS13)
+	certReq.ocspStapling = true
+	certReq.scts = true
+	certReq.supportedSignatureAlgorithms = supportedSignatureAlgorithms()
+	certReqBytes, err := certReq.marshal()
+	if err != nil {
+		t.Fatal(err)
+	}
+	if err := cli.conn.HandleData(QUICEncryptionLevelApplication, append([]byte{
+		byte(typeCertificateRequest),
+		byte(0), byte(0), byte(len(certReqBytes)),
+	}, certReqBytes...)); err == nil {
+		t.Fatalf("post-handshake authentication request: got no error, want one")
+	}
+}
+
+func TestQUICPostHandshakeKeyUpdate(t *testing.T) {
+	// RFC 9001, Section 6.
+	config := testConfig.Clone()
+	config.MinVersion = VersionTLS13
+	cli := newTestQUICClient(t, config)
+	cli.conn.SetTransportParameters(nil)
+	srv := newTestQUICServer(t, config)
+	srv.conn.SetTransportParameters(nil)
+	if err := runTestQUICConnection(context.Background(), cli, srv, nil); err != nil {
+		t.Fatalf("error during connection handshake: %v", err)
+	}
+
+	keyUpdate := new(keyUpdateMsg)
+	keyUpdateBytes, err := keyUpdate.marshal()
+	if err != nil {
+		t.Fatal(err)
+	}
+	if err := cli.conn.HandleData(QUICEncryptionLevelApplication, append([]byte{
+		byte(typeKeyUpdate),
+		byte(0), byte(0), byte(len(keyUpdateBytes)),
+	}, keyUpdateBytes...)); !errors.Is(err, alertUnexpectedMessage) {
+		t.Fatalf("key update request: got error %v, want alertUnexpectedMessage", err)
+	}
+}
+
+func TestQUICPostHandshakeMessageTooLarge(t *testing.T) {
+	config := testConfig.Clone()
+	config.MinVersion = VersionTLS13
+	cli := newTestQUICClient(t, config)
+	cli.conn.SetTransportParameters(nil)
+	srv := newTestQUICServer(t, config)
+	srv.conn.SetTransportParameters(nil)
+	if err := runTestQUICConnection(context.Background(), cli, srv, nil); err != nil {
+		t.Fatalf("error during connection handshake: %v", err)
+	}
+
+	size := maxHandshake + 1
+	if err := cli.conn.HandleData(QUICEncryptionLevelApplication, []byte{
+		byte(typeNewSessionTicket),
+		byte(size >> 16),
+		byte(size >> 8),
+		byte(size),
+	}); err == nil {
+		t.Fatalf("%v-byte post-handshake message: got no error, want one", size)
+	}
+}
+
+func TestQUICHandshakeError(t *testing.T) {
+	clientConfig := testConfig.Clone()
+	clientConfig.MinVersion = VersionTLS13
+	clientConfig.InsecureSkipVerify = false
+	clientConfig.ServerName = "name"
+
+	serverConfig := testConfig.Clone()
+	serverConfig.MinVersion = VersionTLS13
+
+	cli := newTestQUICClient(t, clientConfig)
+	cli.conn.SetTransportParameters(nil)
+	srv := newTestQUICServer(t, serverConfig)
+	srv.conn.SetTransportParameters(nil)
+	err := runTestQUICConnection(context.Background(), cli, srv, nil)
+	if !errors.Is(err, AlertError(alertBadCertificate)) {
+		t.Errorf("connection handshake terminated with error %q, want alertBadCertificate", err)
+	}
+	var e *CertificateVerificationError
+	if !errors.As(err, &e) {
+		t.Errorf("connection handshake terminated with error %q, want CertificateVerificationError", err)
+	}
+}
+
+// Test that QUICConn.ConnectionState can be used during the handshake,
+// and that it reports the application protocol as soon as it has been
+// negotiated.
+func TestQUICConnectionState(t *testing.T) {
+	config := testConfig.Clone()
+	config.MinVersion = VersionTLS13
+	config.NextProtos = []string{"h3"}
+	cli := newTestQUICClient(t, config)
+	cli.conn.SetTransportParameters(nil)
+	srv := newTestQUICServer(t, config)
+	srv.conn.SetTransportParameters(nil)
+	onEvent := func(e QUICEvent, src, dst *testQUICConn) bool {
+		cliCS := cli.conn.ConnectionState()
+		if _, ok := cli.readSecret[QUICEncryptionLevelApplication]; ok {
+			if want, got := cliCS.NegotiatedProtocol, "h3"; want != got {
+				t.Errorf("cli.ConnectionState().NegotiatedProtocol = %q, want %q", want, got)
+			}
+		}
+		srvCS := srv.conn.ConnectionState()
+		if _, ok := srv.readSecret[QUICEncryptionLevelHandshake]; ok {
+			if want, got := srvCS.NegotiatedProtocol, "h3"; want != got {
+				t.Errorf("srv.ConnectionState().NegotiatedProtocol = %q, want %q", want, got)
+			}
+		}
+		return false
+	}
+	if err := runTestQUICConnection(context.Background(), cli, srv, onEvent); err != nil {
+		t.Fatalf("error during connection handshake: %v", err)
+	}
+}
+
+func TestQUICStartContextPropagation(t *testing.T) {
+	const key = "key"
+	const value = "value"
+	ctx := context.WithValue(context.Background(), key, value)
+	config := testConfig.Clone()
+	config.MinVersion = VersionTLS13
+	calls := 0
+	config.GetConfigForClient = func(info *ClientHelloInfo) (*Config, error) {
+		calls++
+		got, _ := info.Context().Value(key).(string)
+		if got != value {
+			t.Errorf("GetConfigForClient context key %q has value %q, want %q", key, got, value)
+		}
+		return nil, nil
+	}
+	cli := newTestQUICClient(t, config)
+	cli.conn.SetTransportParameters(nil)
+	srv := newTestQUICServer(t, config)
+	srv.conn.SetTransportParameters(nil)
+	if err := runTestQUICConnection(ctx, cli, srv, nil); err != nil {
+		t.Fatalf("error during connection handshake: %v", err)
+	}
+	if calls != 1 {
+		t.Errorf("GetConfigForClient called %v times, want 1", calls)
+	}
+}
+
+func TestQUICDelayedTransportParameters(t *testing.T) {
+	clientConfig := testConfig.Clone()
+	clientConfig.MinVersion = VersionTLS13
+	clientConfig.ClientSessionCache = NewLRUClientSessionCache(1)
+	clientConfig.ServerName = "example.go.dev"
+
+	serverConfig := testConfig.Clone()
+	serverConfig.MinVersion = VersionTLS13
+
+	cliParams := "client params"
+	srvParams := "server params"
+
+	cli := newTestQUICClient(t, clientConfig)
+	srv := newTestQUICServer(t, serverConfig)
+	if err := runTestQUICConnection(context.Background(), cli, srv, nil); err != errTransportParametersRequired {
+		t.Fatalf("handshake with no client parameters: %v; want errTransportParametersRequired", err)
+	}
+	cli.conn.SetTransportParameters([]byte(cliParams))
+	if err := runTestQUICConnection(context.Background(), cli, srv, nil); err != errTransportParametersRequired {
+		t.Fatalf("handshake with no server parameters: %v; want errTransportParametersRequired", err)
+	}
+	srv.conn.SetTransportParameters([]byte(srvParams))
+	if err := runTestQUICConnection(context.Background(), cli, srv, nil); err != nil {
+		t.Fatalf("error during connection handshake: %v", err)
+	}
+
+	if got, want := string(cli.gotParams), srvParams; got != want {
+		t.Errorf("client got transport params: %q, want %q", got, want)
+	}
+	if got, want := string(srv.gotParams), cliParams; got != want {
+		t.Errorf("server got transport params: %q, want %q", got, want)
+	}
+}
+
+func TestQUICEmptyTransportParameters(t *testing.T) {
+	config := testConfig.Clone()
+	config.MinVersion = VersionTLS13
+
+	cli := newTestQUICClient(t, config)
+	cli.conn.SetTransportParameters(nil)
+	srv := newTestQUICServer(t, config)
+	srv.conn.SetTransportParameters(nil)
+	if err := runTestQUICConnection(context.Background(), cli, srv, nil); err != nil {
+		t.Fatalf("error during connection handshake: %v", err)
+	}
+
+	if cli.gotParams == nil {
+		t.Errorf("client did not get transport params")
+	}
+	if srv.gotParams == nil {
+		t.Errorf("server did not get transport params")
+	}
+	if len(cli.gotParams) != 0 {
+		t.Errorf("client got transport params: %v, want empty", cli.gotParams)
+	}
+	if len(srv.gotParams) != 0 {
+		t.Errorf("server got transport params: %v, want empty", srv.gotParams)
+	}
+}
+
+func TestQUICCanceledWaitingForData(t *testing.T) {
+	config := testConfig.Clone()
+	config.MinVersion = VersionTLS13
+	cli := newTestQUICClient(t, config)
+	cli.conn.SetTransportParameters(nil)
+	cli.conn.Start(context.Background())
+	for cli.conn.NextEvent().Kind != QUICNoEvent {
+	}
+	err := cli.conn.Close()
+	if !errors.Is(err, alertCloseNotify) {
+		t.Errorf("conn.Close() = %v, want alertCloseNotify", err)
+	}
+}
+
+func TestQUICCanceledWaitingForTransportParams(t *testing.T) {
+	config := testConfig.Clone()
+	config.MinVersion = VersionTLS13
+	cli := newTestQUICClient(t, config)
+	cli.conn.Start(context.Background())
+	for cli.conn.NextEvent().Kind != QUICTransportParametersRequired {
+	}
+	err := cli.conn.Close()
+	if !errors.Is(err, alertCloseNotify) {
+		t.Errorf("conn.Close() = %v, want alertCloseNotify", err)
+	}
+}
diff --git a/src/crypto/tls/testdata/Client-TLSv10-ClientCert-ECDSA-ECDSA b/src/crypto/tls/testdata/Client-TLSv10-ClientCert-ECDSA-ECDSA
index d93f679..e018e87 100644
--- a/src/crypto/tls/testdata/Client-TLSv10-ClientCert-ECDSA-ECDSA
+++ b/src/crypto/tls/testdata/Client-TLSv10-ClientCert-ECDSA-ECDSA
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fe 01 00 00  fa 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 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,68 +7,69 @@
 00000050  cc a8 c0 2b c0 2f c0 2c  c0 30 c0 09 c0 13 c0 0a  |...+./.,.0......|
 00000060  c0 14 00 9c 00 9d 00 2f  00 35 c0 12 00 0a c0 23  |......./.5.....#|
 00000070  c0 27 00 3c c0 07 c0 11  00 05 13 03 13 01 13 02  |.'.<............|
-00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
+00000080  01 00 00 7f 00 05 00 05  01 00 00 00 00 00 0a 00  |................|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
 000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
 000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
-000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
-000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
-000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
-000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
+000000c0  01 00 01 00 00 17 00 00  00 12 00 00 00 2b 00 09  |.............+..|
+000000d0  08 03 04 03 03 03 02 03  01 00 33 00 26 00 24 00  |..........3.&.$.|
+000000e0  1d 00 20 2f e5 7d a3 47  cd 62 43 15 28 da ac 5f  |.. /.}.G.bC.(.._|
+000000f0  bb 29 07 30 ff f6 84 af  c4 cf c2 ed 90 99 5f 58  |.).0.........._X|
+00000100  cb 3b 74                                          |.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 01 00 59 02 00 00  55 03 01 f1 70 ef e1 e5  |....Y...U...p...|
-00000010  96 73 83 d3 e2 b9 53 7e  81 ae 1d 40 24 5a ca f2  |.s....S~...@$Z..|
-00000020  06 b3 b6 01 e4 02 fb 81  bc d9 3d 20 1f 1a f0 b5  |..........= ....|
-00000030  b2 93 42 da 00 4d bf f6  dc 99 54 8d 3b 17 a4 74  |..B..M....T.;..t|
-00000040  ca 93 e1 5c a9 c4 d1 35  af f2 d8 f9 c0 09 00 00  |...\...5........|
-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 b5 0c 00  00 b1 03 00 1d 20 f0 8c  |*............ ..|
-00000280  cd 6a c2 7a ea f0 2b 4a  34 6d a9 3b 7a 29 5d 04  |.j.z..+J4m.;z)].|
-00000290  65 70 97 30 e7 10 6e c2  7e 50 c5 89 4a 3f 00 8b  |ep.0..n.~P..J?..|
-000002a0  30 81 88 02 42 00 be e2  67 30 f0 8a cb 63 6c 13  |0...B...g0...cl.|
-000002b0  e0 4e 88 52 6e bc e4 83  53 f4 18 75 b7 46 a5 46  |.N.Rn...S..u.F.F|
-000002c0  11 f1 4b f9 bd 58 4e 62  5c fb a8 f2 93 99 3c 94  |..K..XNb\.....<.|
-000002d0  18 1d 7a f1 74 bf 9d c6  fe 65 b1 bc 54 2b c7 ba  |..z.t....e..T+..|
-000002e0  f7 45 a8 0a 21 ad 23 02  42 01 c8 fd 48 62 e2 5e  |.E..!.#.B...Hb.^|
-000002f0  f1 9c 95 c0 28 c4 c5 04  31 e5 ba a5 3c 09 d9 d7  |....(...1...<...|
-00000300  43 aa 8c 35 26 ed 47 57  6d c6 15 86 50 3c 72 e1  |C..5&.GWm...P<r.|
-00000310  6f 2b 85 63 97 5e 20 58  fc cf 0c f9 37 27 42 fb  |o+.c.^ X....7'B.|
-00000320  cd ed c3 40 ac 5f d9 06  5c a3 27 16 03 01 00 0a  |...@._..\.'.....|
-00000330  0d 00 00 06 03 01 02 40  00 00 16 03 01 00 04 0e  |.......@........|
-00000340  00 00 00                                          |...|
+00000000  16 03 01 00 5d 02 00 00  59 03 01 8d 16 c0 c7 69  |....]...Y......i|
+00000010  4a 19 df eb e0 a2 f1 43  43 d6 4a ac 8c cd ee 58  |J......CC.J....X|
+00000020  2e f9 f2 7d d2 61 df 54  0c e8 4e 20 2e 1c 65 31  |...}.a.T..N ..e1|
+00000030  60 6d 7f f9 10 9b fd d1  31 fa 0c 45 01 ca 06 e3  |`m......1..E....|
+00000040  30 9a ab b4 b7 96 b3 99  de 8c 10 84 c0 09 00 00  |0...............|
+00000050  11 ff 01 00 01 00 00 0b  00 04 03 00 01 02 00 17  |................|
+00000060  00 00 16 03 01 02 0e 0b  00 02 0a 00 02 07 00 02  |................|
+00000070  04 30 82 02 00 30 82 01  62 02 09 00 b8 bf 2d 47  |.0...0..b.....-G|
+00000080  a0 d2 eb f4 30 09 06 07  2a 86 48 ce 3d 04 01 30  |....0...*.H.=..0|
+00000090  45 31 0b 30 09 06 03 55  04 06 13 02 41 55 31 13  |E1.0...U....AU1.|
+000000a0  30 11 06 03 55 04 08 13  0a 53 6f 6d 65 2d 53 74  |0...U....Some-St|
+000000b0  61 74 65 31 21 30 1f 06  03 55 04 0a 13 18 49 6e  |ate1!0...U....In|
+000000c0  74 65 72 6e 65 74 20 57  69 64 67 69 74 73 20 50  |ternet Widgits P|
+000000d0  74 79 20 4c 74 64 30 1e  17 0d 31 32 31 31 32 32  |ty Ltd0...121122|
+000000e0  31 35 30 36 33 32 5a 17  0d 32 32 31 31 32 30 31  |150632Z..2211201|
+000000f0  35 30 36 33 32 5a 30 45  31 0b 30 09 06 03 55 04  |50632Z0E1.0...U.|
+00000100  06 13 02 41 55 31 13 30  11 06 03 55 04 08 13 0a  |...AU1.0...U....|
+00000110  53 6f 6d 65 2d 53 74 61  74 65 31 21 30 1f 06 03  |Some-State1!0...|
+00000120  55 04 0a 13 18 49 6e 74  65 72 6e 65 74 20 57 69  |U....Internet Wi|
+00000130  64 67 69 74 73 20 50 74  79 20 4c 74 64 30 81 9b  |dgits Pty Ltd0..|
+00000140  30 10 06 07 2a 86 48 ce  3d 02 01 06 05 2b 81 04  |0...*.H.=....+..|
+00000150  00 23 03 81 86 00 04 00  c4 a1 ed be 98 f9 0b 48  |.#.............H|
+00000160  73 36 7e c3 16 56 11 22  f2 3d 53 c3 3b 4d 21 3d  |s6~..V.".=S.;M!=|
+00000170  cd 6b 75 e6 f6 b0 dc 9a  df 26 c1 bc b2 87 f0 72  |.ku......&.....r|
+00000180  32 7c b3 64 2f 1c 90 bc  ea 68 23 10 7e fe e3 25  |2|.d/....h#.~..%|
+00000190  c0 48 3a 69 e0 28 6d d3  37 00 ef 04 62 dd 0d a0  |.H:i.(m.7...b...|
+000001a0  9c 70 62 83 d8 81 d3 64  31 aa 9e 97 31 bd 96 b0  |.pb....d1...1...|
+000001b0  68 c0 9b 23 de 76 64 3f  1a 5c 7f e9 12 0e 58 58  |h..#.vd?.\....XX|
+000001c0  b6 5f 70 dd 9b d8 ea d5  d7 f5 d5 cc b9 b6 9f 30  |._p............0|
+000001d0  66 5b 66 9a 20 e2 27 e5  bf fe 3b 30 09 06 07 2a  |f[f. .'...;0...*|
+000001e0  86 48 ce 3d 04 01 03 81  8c 00 30 81 88 02 42 01  |.H.=......0...B.|
+000001f0  88 a2 4f eb e2 45 c5 48  7d 1b ac f5 ed 98 9d ae  |..O..E.H}.......|
+00000200  47 70 c0 5e 1b b6 2f bd  f1 b6 4d b7 61 40 d3 11  |Gp.^../...M.a@..|
+00000210  a2 ce ee 0b 7e 92 7e ff  76 9d c3 3b 7e a5 3f ce  |....~.~.v..;~.?.|
+00000220  fa 10 e2 59 ec 47 2d 7c  ac da 4e 97 0e 15 a0 6f  |...Y.G-|..N....o|
+00000230  d0 02 42 01 4d fc be 67  13 9c 2d 05 0e bd 3f a3  |..B.M..g..-...?.|
+00000240  8c 25 c1 33 13 83 0d 94  06 bb d4 37 7a f6 ec 7a  |.%.3.......7z..z|
+00000250  c9 86 2e dd d7 11 69 7f  85 7c 56 de fb 31 78 2b  |......i..|V..1x+|
+00000260  e4 c7 78 0d ae cb be 9e  4e 36 24 31 7b 6a 0f 39  |..x.....N6$1{j.9|
+00000270  95 12 07 8f 2a 16 03 01  00 b5 0c 00 00 b1 03 00  |....*...........|
+00000280  1d 20 2a 39 4c 47 2f 16  34 c1 2b 55 8b 1f 26 bb  |. *9LG/.4.+U..&.|
+00000290  f7 27 e1 e1 6c 62 e3 76  16 ed ff 23 bf 07 09 3c  |.'..lb.v...#...<|
+000002a0  24 1c 00 8b 30 81 88 02  42 01 34 ea 39 ef 28 c1  |$...0...B.4.9.(.|
+000002b0  f9 00 fc a9 37 0e a8 ce  4e 17 0e 8d c3 3d 27 9b  |....7...N....='.|
+000002c0  87 ce b2 d1 31 e3 82 9b  7b e6 40 19 c9 da ba 7f  |....1...{.@.....|
+000002d0  03 f9 57 01 c9 f0 28 66  64 1a f6 f7 6a 67 09 b4  |..W...(fd...jg..|
+000002e0  b9 c7 ef 1f 37 fd 7c 04  ba 4e ef 02 42 00 e1 15  |....7.|..N..B...|
+000002f0  c9 22 ae 13 8d bc 24 26  ce 62 09 9e c4 95 80 65  |."....$&.b.....e|
+00000300  b3 dc a4 df 98 c8 cd 95  8c 55 c7 af 27 b1 31 2c  |.........U..'.1,|
+00000310  df 62 72 47 b4 e8 df 76  43 16 60 7f 42 60 b0 eb  |.brG...vC.`.B`..|
+00000320  b8 f7 75 75 ef d6 7e aa  d9 c5 9c 9d f0 0d d8 16  |..uu..~.........|
+00000330  03 01 00 0a 0d 00 00 06  03 01 02 40 00 00 16 03  |...........@....|
+00000340  01 00 04 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|
@@ -106,29 +107,29 @@
 00000210  03 01 00 25 10 00 00 21  20 2f e5 7d a3 47 cd 62  |...%...! /.}.G.b|
 00000220  43 15 28 da ac 5f bb 29  07 30 ff f6 84 af c4 cf  |C.(.._.).0......|
 00000230  c2 ed 90 99 5f 58 cb 3b  74 16 03 01 00 91 0f 00  |...._X.;t.......|
-00000240  00 8d 00 8b 30 81 88 02  42 01 4c 44 9a a6 7e 6e  |....0...B.LD..~n|
-00000250  8a f0 40 c0 63 cf 50 4d  1c 36 55 c2 ae 89 19 5a  |..@.c.PM.6U....Z|
-00000260  3f ef 2b 2e 0d 66 4f fe  c2 cb 17 86 7c a1 2c e9  |?.+..fO.....|.,.|
-00000270  d8 44 b6 45 36 cc 3a 29  74 19 3c 98 c1 f6 8f 9c  |.D.E6.:)t.<.....|
-00000280  bb 29 fa ae d5 73 de c8  b3 27 7f 02 42 01 86 c9  |.)...s...'..B...|
-00000290  9d e6 1d 45 8b 35 7d ee  7d de ce 4b 15 40 1e 26  |...E.5}.}..K.@.&|
-000002a0  95 eb 8e b2 6d ac a3 52  b3 fe bc 9d 2b 61 1a 41  |....m..R....+a.A|
-000002b0  5c b5 e5 c0 df 3f 5b 84  4b d6 b2 c5 3a 15 05 0d  |\....?[.K...:...|
-000002c0  3f 0a 6e d7 8d 49 35 50  67 3e 6e c5 a7 ba 84 14  |?.n..I5Pg>n.....|
-000002d0  03 01 00 01 01 16 03 01  00 30 91 e2 f5 b4 fc 0d  |.........0......|
-000002e0  43 92 f1 18 99 68 d8 4d  94 ab e0 87 60 e5 46 e3  |C....h.M....`.F.|
-000002f0  dd b8 0c b5 c6 5b 73 ba  ae e7 7f 0c 6d 6d 94 e7  |.....[s.....mm..|
-00000300  e2 21 c5 5c 0e b9 e6 c7  88 92                    |.!.\......|
+00000240  00 8d 00 8b 30 81 88 02  42 01 9a ce de b0 79 2f  |....0...B.....y/|
+00000250  8b f3 6a ab 71 75 38 58  6a 85 d5 eb 60 ee de d0  |..j.qu8Xj...`...|
+00000260  c8 61 46 fc 41 2a d7 dd  b5 db cd d8 74 4e a2 62  |.aF.A*......tN.b|
+00000270  c8 a5 1c f6 62 7a 04 ea  0b 70 39 cd 68 75 d2 b6  |....bz...p9.hu..|
+00000280  cc f9 71 ee f2 cc 9a a2  12 78 bc 02 42 01 4d 03  |..q......x..B.M.|
+00000290  1a 75 bb 13 64 ab 08 c5  fb f3 ff 18 74 c5 25 dd  |.u..d.......t.%.|
+000002a0  27 99 5b ad 76 7a a7 e2  4d a7 1d d7 ba 6e e4 e7  |'.[.vz..M....n..|
+000002b0  32 00 70 4a 35 6c c4 bb  03 5b 83 d5 e5 fc 53 e4  |2.pJ5l...[....S.|
+000002c0  7e 1b f3 e7 18 79 b3 d4  76 ac 0f 74 6e 8f f7 14  |~....y..v..tn...|
+000002d0  03 01 00 01 01 16 03 01  00 30 1a 3f 4b ba 4c e4  |.........0.?K.L.|
+000002e0  6d 21 25 4d 90 2b 94 01  2b 82 f6 0a 0f a9 f9 95  |m!%M.+..+.......|
+000002f0  03 1f 13 ee cf 27 d2 84  8a 59 cd ca 8d a8 c1 07  |.....'...Y......|
+00000300  3f f6 c3 2b d5 91 21 2a  84 23                    |?..+..!*.#|
 >>> Flow 4 (server to client)
-00000000  14 03 01 00 01 01 16 03  01 00 30 24 93 c5 b1 d0  |..........0$....|
-00000010  bf 5e 5c 79 18 91 d4 c2  5d 82 bd b9 77 44 a8 75  |.^\y....]...wD.u|
-00000020  2a aa 22 c1 71 79 4c ad  7f 95 1f 94 b7 2b 5d cb  |*.".qyL......+].|
-00000030  85 57 0a 7e 55 f1 56 4b  98 da b8                 |.W.~U.VK...|
+00000000  14 03 01 00 01 01 16 03  01 00 30 ac 6a 3b cf 6b  |..........0.j;.k|
+00000010  fc d7 25 1d ee d1 c0 61  65 73 be df 21 65 07 b8  |..%....aes..!e..|
+00000020  9d 88 13 b9 b2 23 9c 90  a5 b4 71 31 75 b9 2e 97  |.....#....q1u...|
+00000030  73 a1 c0 85 cc 6c f5 ac  49 2e 5f                 |s....l..I._|
 >>> Flow 5 (client to server)
-00000000  17 03 01 00 20 21 19 00  1b 74 03 79 83 6a cf 87  |.... !...t.y.j..|
-00000010  c5 1f c6 e6 ff 1c 8d 9e  a9 2b 3c 7e e5 e0 d5 b5  |.........+<~....|
-00000020  c0 d5 1a 84 45 17 03 01  00 20 77 40 7e ac d0 9e  |....E.... w@~...|
-00000030  d1 86 73 26 d2 c6 a0 a4  94 9e d7 7e 28 59 5c b2  |..s&.......~(Y\.|
-00000040  9f 4d fa c5 c9 b7 a2 b2  b1 7b 15 03 01 00 20 59  |.M.......{.... Y|
-00000050  aa 2f 3f 2c 20 f1 15 ef  24 95 29 66 c0 48 78 00  |./?, ...$.)f.Hx.|
-00000060  19 d6 1e 95 af 83 03 6e  d8 c7 8e bb c3 54 02     |.......n.....T.|
+00000000  17 03 01 00 20 46 71 8d  32 ba c1 05 5c 59 bc 82  |.... Fq.2...\Y..|
+00000010  e1 bc 6f eb de 23 26 8d  9c b2 b4 e8 c8 69 f3 46  |..o..#&......i.F|
+00000020  0b 07 61 69 ae 17 03 01  00 20 e5 a5 ea 4c 59 7d  |..ai..... ...LY}|
+00000030  74 cd b8 0a 66 b6 ec 95  b0 8a 86 3a 9c e3 f5 11  |t...f......:....|
+00000040  5b 05 62 9a ce 2e 87 8e  41 f4 15 03 01 00 20 be  |[.b.....A..... .|
+00000050  0a 29 47 93 e8 ef ad d4  5d f9 e1 a4 46 1a 51 98  |.)G.....]...F.Q.|
+00000060  f0 8c be 3b fc cc a0 ed  7c 18 ac bf 94 35 93     |...;....|....5.|
diff --git a/src/crypto/tls/testdata/Client-TLSv10-ClientCert-ECDSA-RSA b/src/crypto/tls/testdata/Client-TLSv10-ClientCert-ECDSA-RSA
index afe6e10..364d33d 100644
--- a/src/crypto/tls/testdata/Client-TLSv10-ClientCert-ECDSA-RSA
+++ b/src/crypto/tls/testdata/Client-TLSv10-ClientCert-ECDSA-RSA
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fe 01 00 00  fa 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 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,72 +7,73 @@
 00000050  cc a8 c0 2b c0 2f c0 2c  c0 30 c0 09 c0 13 c0 0a  |...+./.,.0......|
 00000060  c0 14 00 9c 00 9d 00 2f  00 35 c0 12 00 0a c0 23  |......./.5.....#|
 00000070  c0 27 00 3c c0 07 c0 11  00 05 13 03 13 01 13 02  |.'.<............|
-00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
+00000080  01 00 00 7f 00 05 00 05  01 00 00 00 00 00 0a 00  |................|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
 000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
 000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
-000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
-000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
-000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
-000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
+000000c0  01 00 01 00 00 17 00 00  00 12 00 00 00 2b 00 09  |.............+..|
+000000d0  08 03 04 03 03 03 02 03  01 00 33 00 26 00 24 00  |..........3.&.$.|
+000000e0  1d 00 20 2f e5 7d a3 47  cd 62 43 15 28 da ac 5f  |.. /.}.G.bC.(.._|
+000000f0  bb 29 07 30 ff f6 84 af  c4 cf c2 ed 90 99 5f 58  |.).0.........._X|
+00000100  cb 3b 74                                          |.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 01 00 59 02 00 00  55 03 01 b5 1a 96 ea d5  |....Y...U.......|
-00000010  01 ef fb 42 1d 49 e1 1b  7c e4 15 ec cc 7f b9 fc  |...B.I..|.......|
-00000020  22 e0 0b 1d 66 0e c8 d6  9b cd ec 20 d5 2b fe 9a  |"...f...... .+..|
-00000030  f7 e7 10 1c c4 15 10 f1  24 8d 8f f6 25 90 aa 1c  |........$...%...|
-00000040  10 c4 87 c6 36 23 5b 6a  c1 ae 20 5e c0 13 00 00  |....6#[j.. ^....|
-00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
-00000060  01 02 59 0b 00 02 55 00  02 52 00 02 4f 30 82 02  |..Y...U..R..O0..|
-00000070  4b 30 82 01 b4 a0 03 02  01 02 02 09 00 e8 f0 9d  |K0..............|
-00000080  3f e2 5b ea a6 30 0d 06  09 2a 86 48 86 f7 0d 01  |?.[..0...*.H....|
-00000090  01 0b 05 00 30 1f 31 0b  30 09 06 03 55 04 0a 13  |....0.1.0...U...|
-000000a0  02 47 6f 31 10 30 0e 06  03 55 04 03 13 07 47 6f  |.Go1.0...U....Go|
-000000b0  20 52 6f 6f 74 30 1e 17  0d 31 36 30 31 30 31 30  | Root0...1601010|
-000000c0  30 30 30 30 30 5a 17 0d  32 35 30 31 30 31 30 30  |00000Z..25010100|
-000000d0  30 30 30 30 5a 30 1a 31  0b 30 09 06 03 55 04 0a  |0000Z0.1.0...U..|
-000000e0  13 02 47 6f 31 0b 30 09  06 03 55 04 03 13 02 47  |..Go1.0...U....G|
-000000f0  6f 30 81 9f 30 0d 06 09  2a 86 48 86 f7 0d 01 01  |o0..0...*.H.....|
-00000100  01 05 00 03 81 8d 00 30  81 89 02 81 81 00 db 46  |.......0.......F|
-00000110  7d 93 2e 12 27 06 48 bc  06 28 21 ab 7e c4 b6 a2  |}...'.H..(!.~...|
-00000120  5d fe 1e 52 45 88 7a 36  47 a5 08 0d 92 42 5b c2  |]..RE.z6G....B[.|
-00000130  81 c0 be 97 79 98 40 fb  4f 6d 14 fd 2b 13 8b c2  |....y.@.Om..+...|
-00000140  a5 2e 67 d8 d4 09 9e d6  22 38 b7 4a 0b 74 73 2b  |..g....."8.J.ts+|
-00000150  c2 34 f1 d1 93 e5 96 d9  74 7b f3 58 9f 6c 61 3c  |.4......t{.X.la<|
-00000160  c0 b0 41 d4 d9 2b 2b 24  23 77 5b 1c 3b bd 75 5d  |..A..++$#w[.;.u]|
-00000170  ce 20 54 cf a1 63 87 1d  1e 24 c4 f3 1d 1a 50 8b  |. T..c...$....P.|
-00000180  aa b6 14 43 ed 97 a7 75  62 f4 14 c8 52 d7 02 03  |...C...ub...R...|
-00000190  01 00 01 a3 81 93 30 81  90 30 0e 06 03 55 1d 0f  |......0..0...U..|
-000001a0  01 01 ff 04 04 03 02 05  a0 30 1d 06 03 55 1d 25  |.........0...U.%|
-000001b0  04 16 30 14 06 08 2b 06  01 05 05 07 03 01 06 08  |..0...+.........|
-000001c0  2b 06 01 05 05 07 03 02  30 0c 06 03 55 1d 13 01  |+.......0...U...|
-000001d0  01 ff 04 02 30 00 30 19  06 03 55 1d 0e 04 12 04  |....0.0...U.....|
-000001e0  10 9f 91 16 1f 43 43 3e  49 a6 de 6d b6 80 d7 9f  |.....CC>I..m....|
-000001f0  60 30 1b 06 03 55 1d 23  04 14 30 12 80 10 48 13  |`0...U.#..0...H.|
-00000200  49 4d 13 7e 16 31 bb a3  01 d5 ac ab 6e 7b 30 19  |IM.~.1......n{0.|
-00000210  06 03 55 1d 11 04 12 30  10 82 0e 65 78 61 6d 70  |..U....0...examp|
-00000220  6c 65 2e 67 6f 6c 61 6e  67 30 0d 06 09 2a 86 48  |le.golang0...*.H|
-00000230  86 f7 0d 01 01 0b 05 00  03 81 81 00 9d 30 cc 40  |.............0.@|
-00000240  2b 5b 50 a0 61 cb ba e5  53 58 e1 ed 83 28 a9 58  |+[P.a...SX...(.X|
-00000250  1a a9 38 a4 95 a1 ac 31  5a 1a 84 66 3d 43 d3 2d  |..8....1Z..f=C.-|
-00000260  d9 0b f2 97 df d3 20 64  38 92 24 3a 00 bc cf 9c  |...... d8.$:....|
-00000270  7d b7 40 20 01 5f aa d3  16 61 09 a2 76 fd 13 c3  |}.@ ._...a..v...|
-00000280  cc e1 0c 5c ee b1 87 82  f1 6c 04 ed 73 bb b3 43  |...\.....l..s..C|
-00000290  77 8d 0c 1c f1 0f a1 d8  40 83 61 c9 4c 72 2b 9d  |w.......@.a.Lr+.|
-000002a0  ae db 46 06 06 4d f4 c1  b3 3e c0 d1 bd 42 d4 db  |..F..M...>...B..|
-000002b0  fe 3d 13 60 84 5c 21 d3  3b e9 fa e7 16 03 01 00  |.=.`.\!.;.......|
-000002c0  aa 0c 00 00 a6 03 00 1d  20 87 d5 d1 27 70 92 d9  |........ ...'p..|
-000002d0  15 56 e4 fd a8 52 a9 a5  f6 db ab f5 e2 61 fa 5d  |.V...R.......a.]|
-000002e0  64 ba c2 ee 37 0b 53 cf  3c 00 80 71 cd eb 4b 1c  |d...7.S.<..q..K.|
-000002f0  f7 84 85 6a 20 5c c8 40  59 1c b0 8e 1b b6 b6 19  |...j \.@Y.......|
-00000300  f1 66 ad 7d 1d d5 58 da  c3 c4 dd 12 57 04 05 0d  |.f.}..X.....W...|
-00000310  79 46 20 0b 8c a3 49 95  e0 96 22 75 56 44 21 6b  |yF ...I..."uVD!k|
-00000320  42 17 ed 32 eb 9c f3 fd  b0 b3 08 da 61 7e f3 9b  |B..2........a~..|
-00000330  43 51 c0 09 e3 53 17 5d  84 3f c4 52 db 73 f9 d1  |CQ...S.].?.R.s..|
-00000340  21 0e 55 a4 bc a1 1b b6  3a 5a d1 cb 15 7e 8b a4  |!.U.....:Z...~..|
-00000350  fb 0f e7 7e 36 a7 1b a4  c0 1f 79 37 49 17 84 d3  |...~6.....y7I...|
-00000360  97 39 78 1f 55 77 e8 aa  37 2a 36 16 03 01 00 0a  |.9x.Uw..7*6.....|
-00000370  0d 00 00 06 03 01 02 40  00 00 16 03 01 00 04 0e  |.......@........|
-00000380  00 00 00                                          |...|
+00000000  16 03 01 00 5d 02 00 00  59 03 01 a1 07 34 d5 08  |....]...Y....4..|
+00000010  09 17 79 08 6e 26 2b b3  2f e5 35 08 54 b4 5b 0e  |..y.n&+./.5.T.[.|
+00000020  c8 58 57 2b 5a 75 8d e8  d2 9e 35 20 ae bf 94 16  |.XW+Zu....5 ....|
+00000030  e5 a9 f6 05 18 1f 7f a4  1e e9 cd 4a c0 7d a6 4d  |...........J.}.M|
+00000040  75 4f 06 de e0 6c 79 b3  39 5c a7 ed c0 13 00 00  |uO...ly.9\......|
+00000050  11 ff 01 00 01 00 00 0b  00 04 03 00 01 02 00 17  |................|
+00000060  00 00 16 03 01 02 59 0b  00 02 55 00 02 52 00 02  |......Y...U..R..|
+00000070  4f 30 82 02 4b 30 82 01  b4 a0 03 02 01 02 02 09  |O0..K0..........|
+00000080  00 e8 f0 9d 3f e2 5b ea  a6 30 0d 06 09 2a 86 48  |....?.[..0...*.H|
+00000090  86 f7 0d 01 01 0b 05 00  30 1f 31 0b 30 09 06 03  |........0.1.0...|
+000000a0  55 04 0a 13 02 47 6f 31  10 30 0e 06 03 55 04 03  |U....Go1.0...U..|
+000000b0  13 07 47 6f 20 52 6f 6f  74 30 1e 17 0d 31 36 30  |..Go Root0...160|
+000000c0  31 30 31 30 30 30 30 30  30 5a 17 0d 32 35 30 31  |101000000Z..2501|
+000000d0  30 31 30 30 30 30 30 30  5a 30 1a 31 0b 30 09 06  |01000000Z0.1.0..|
+000000e0  03 55 04 0a 13 02 47 6f  31 0b 30 09 06 03 55 04  |.U....Go1.0...U.|
+000000f0  03 13 02 47 6f 30 81 9f  30 0d 06 09 2a 86 48 86  |...Go0..0...*.H.|
+00000100  f7 0d 01 01 01 05 00 03  81 8d 00 30 81 89 02 81  |...........0....|
+00000110  81 00 db 46 7d 93 2e 12  27 06 48 bc 06 28 21 ab  |...F}...'.H..(!.|
+00000120  7e c4 b6 a2 5d fe 1e 52  45 88 7a 36 47 a5 08 0d  |~...]..RE.z6G...|
+00000130  92 42 5b c2 81 c0 be 97  79 98 40 fb 4f 6d 14 fd  |.B[.....y.@.Om..|
+00000140  2b 13 8b c2 a5 2e 67 d8  d4 09 9e d6 22 38 b7 4a  |+.....g....."8.J|
+00000150  0b 74 73 2b c2 34 f1 d1  93 e5 96 d9 74 7b f3 58  |.ts+.4......t{.X|
+00000160  9f 6c 61 3c c0 b0 41 d4  d9 2b 2b 24 23 77 5b 1c  |.la<..A..++$#w[.|
+00000170  3b bd 75 5d ce 20 54 cf  a1 63 87 1d 1e 24 c4 f3  |;.u]. T..c...$..|
+00000180  1d 1a 50 8b aa b6 14 43  ed 97 a7 75 62 f4 14 c8  |..P....C...ub...|
+00000190  52 d7 02 03 01 00 01 a3  81 93 30 81 90 30 0e 06  |R.........0..0..|
+000001a0  03 55 1d 0f 01 01 ff 04  04 03 02 05 a0 30 1d 06  |.U...........0..|
+000001b0  03 55 1d 25 04 16 30 14  06 08 2b 06 01 05 05 07  |.U.%..0...+.....|
+000001c0  03 01 06 08 2b 06 01 05  05 07 03 02 30 0c 06 03  |....+.......0...|
+000001d0  55 1d 13 01 01 ff 04 02  30 00 30 19 06 03 55 1d  |U.......0.0...U.|
+000001e0  0e 04 12 04 10 9f 91 16  1f 43 43 3e 49 a6 de 6d  |.........CC>I..m|
+000001f0  b6 80 d7 9f 60 30 1b 06  03 55 1d 23 04 14 30 12  |....`0...U.#..0.|
+00000200  80 10 48 13 49 4d 13 7e  16 31 bb a3 01 d5 ac ab  |..H.IM.~.1......|
+00000210  6e 7b 30 19 06 03 55 1d  11 04 12 30 10 82 0e 65  |n{0...U....0...e|
+00000220  78 61 6d 70 6c 65 2e 67  6f 6c 61 6e 67 30 0d 06  |xample.golang0..|
+00000230  09 2a 86 48 86 f7 0d 01  01 0b 05 00 03 81 81 00  |.*.H............|
+00000240  9d 30 cc 40 2b 5b 50 a0  61 cb ba e5 53 58 e1 ed  |.0.@+[P.a...SX..|
+00000250  83 28 a9 58 1a a9 38 a4  95 a1 ac 31 5a 1a 84 66  |.(.X..8....1Z..f|
+00000260  3d 43 d3 2d d9 0b f2 97  df d3 20 64 38 92 24 3a  |=C.-...... d8.$:|
+00000270  00 bc cf 9c 7d b7 40 20  01 5f aa d3 16 61 09 a2  |....}.@ ._...a..|
+00000280  76 fd 13 c3 cc e1 0c 5c  ee b1 87 82 f1 6c 04 ed  |v......\.....l..|
+00000290  73 bb b3 43 77 8d 0c 1c  f1 0f a1 d8 40 83 61 c9  |s..Cw.......@.a.|
+000002a0  4c 72 2b 9d ae db 46 06  06 4d f4 c1 b3 3e c0 d1  |Lr+...F..M...>..|
+000002b0  bd 42 d4 db fe 3d 13 60  84 5c 21 d3 3b e9 fa e7  |.B...=.`.\!.;...|
+000002c0  16 03 01 00 aa 0c 00 00  a6 03 00 1d 20 6d 79 f8  |............ my.|
+000002d0  b3 f9 f8 39 10 ea 9a f0  d7 40 a7 94 b4 5b 87 fc  |...9.....@...[..|
+000002e0  63 e1 7f 82 f8 cd e9 02  f7 0c 83 e0 48 00 80 cc  |c...........H...|
+000002f0  23 b7 af c6 3b 6a ed cd  07 be 81 cd 81 f9 85 f1  |#...;j..........|
+00000300  a2 32 82 3b 1c 02 3e 02  20 da 71 e0 3a cc 4b 49  |.2.;..>. .q.:.KI|
+00000310  09 36 af 1e 9e b5 14 6e  4c d1 4d df 87 38 92 52  |.6.....nL.M..8.R|
+00000320  47 0c e7 e8 2b 2e 65 38  e3 c4 d7 24 db bb fb 2c  |G...+.e8...$...,|
+00000330  04 2c 9e e5 a7 9d 4b 03  b8 cb 71 c6 62 e0 42 f7  |.,....K...q.b.B.|
+00000340  d7 1e 62 7e 21 e0 4d 37  e2 67 46 fa 82 df 49 62  |..b~!.M7.gF...Ib|
+00000350  33 fe e1 44 fd 62 31 46  b7 66 27 ce 85 99 00 b2  |3..D.b1F.f'.....|
+00000360  2c 94 1b c1 66 7b 95 a9  2c d2 33 5c 57 50 f1 16  |,...f{..,.3\WP..|
+00000370  03 01 00 0a 0d 00 00 06  03 01 02 40 00 00 16 03  |...........@....|
+00000380  01 00 04 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|
@@ -110,29 +111,29 @@
 00000210  03 01 00 25 10 00 00 21  20 2f e5 7d a3 47 cd 62  |...%...! /.}.G.b|
 00000220  43 15 28 da ac 5f bb 29  07 30 ff f6 84 af c4 cf  |C.(.._.).0......|
 00000230  c2 ed 90 99 5f 58 cb 3b  74 16 03 01 00 91 0f 00  |...._X.;t.......|
-00000240  00 8d 00 8b 30 81 88 02  42 01 e7 32 ab 5d d7 f8  |....0...B..2.]..|
-00000250  b6 25 f9 b6 e6 19 eb 20  75 99 90 bc 41 06 74 ce  |.%..... u...A.t.|
-00000260  92 31 fc 9e cd f3 b4 b1  b1 f7 1e d3 3c 5e 01 92  |.1..........<^..|
-00000270  a0 c6 24 05 6e 3b ba 6c  51 61 6c 11 fd fe d7 9f  |..$.n;.lQal.....|
-00000280  0b 16 b3 1a f7 20 fa b2  3d 92 c9 02 42 01 d7 dc  |..... ..=...B...|
-00000290  20 50 f6 91 a3 63 2a 79  37 d4 8b 71 0a 1e 73 f8  | P...c*y7..q..s.|
-000002a0  1e 1c 04 c5 c8 66 bc 5e  67 5e bb 94 76 87 23 12  |.....f.^g^..v.#.|
-000002b0  64 18 cb 09 66 58 f1 06  17 93 1e b9 83 67 9d 3d  |d...fX.......g.=|
-000002c0  39 0a fb 37 7b a9 bf d2  59 1a 49 0f 4c 10 df 14  |9..7{...Y.I.L...|
-000002d0  03 01 00 01 01 16 03 01  00 30 4f 0e ba fc 20 81  |.........0O... .|
-000002e0  73 58 e0 47 33 b9 5e c4  6a 10 c2 1a 42 c3 85 2b  |sX.G3.^.j...B..+|
-000002f0  20 38 80 5d 40 81 4a 78  40 d9 13 ac af b3 45 e7  | 8.]@.Jx@.....E.|
-00000300  1e 19 c6 b5 63 6e 9c 5c  8a 8d                    |....cn.\..|
+00000240  00 8d 00 8b 30 81 88 02  42 00 f7 1a 73 32 b1 a7  |....0...B...s2..|
+00000250  04 a2 26 85 14 53 5a 70  76 c4 44 4c 0d f8 5a a6  |..&..SZpv.DL..Z.|
+00000260  bc 64 44 88 3f 01 80 a4  0d 17 ce 30 ca 92 4c 29  |.dD.?......0..L)|
+00000270  b2 f3 a4 65 1e 28 55 bc  b8 47 64 39 b7 49 20 05  |...e.(U..Gd9.I .|
+00000280  9d a4 84 6b 1b 8b df eb  b6 f6 b9 02 42 01 68 c8  |...k........B.h.|
+00000290  fd 3c ad 36 ad 15 28 4f  f2 ac b3 7f 63 28 30 5c  |.<.6..(O....c(0\|
+000002a0  68 59 f5 84 b2 cf 23 d6  dd 3b f5 7b 2b 1a ac 32  |hY....#..;.{+..2|
+000002b0  20 da 76 af 63 2a 68 6e  18 cd 07 82 41 6f 50 91  | .v.c*hn....AoP.|
+000002c0  d0 51 3b 9b ab 71 84 d4  be 15 dd 4b 8c 57 b7 14  |.Q;..q.....K.W..|
+000002d0  03 01 00 01 01 16 03 01  00 30 e3 e6 b9 cb 0b 0f  |.........0......|
+000002e0  71 55 4e 15 53 85 5c 2a  55 ac 83 cc e9 71 69 eb  |qUN.S.\*U....qi.|
+000002f0  dd 64 cb 2f 9f 74 b4 e6  80 52 9e a0 08 e3 7e 14  |.d./.t...R....~.|
+00000300  2c 5e 15 e4 81 38 11 aa  fb ab                    |,^...8....|
 >>> Flow 4 (server to client)
-00000000  14 03 01 00 01 01 16 03  01 00 30 c6 bb 74 56 db  |..........0..tV.|
-00000010  fd f7 a7 dd 3b a3 50 10  11 44 83 a1 c6 b1 6e 70  |....;.P..D....np|
-00000020  37 6e 68 b2 5a 45 6b fb  e9 9d 4e 68 cf ba ea af  |7nh.ZEk...Nh....|
-00000030  7d f6 65 ee 22 14 9e 5a  a7 85 65                 |}.e."..Z..e|
+00000000  14 03 01 00 01 01 16 03  01 00 30 bb 2d 20 48 7a  |..........0.- Hz|
+00000010  53 bf 3a ee c3 91 ec 1b  be cf 4a 18 57 5a c4 a7  |S.:.......J.WZ..|
+00000020  57 d7 51 fa 4a 69 8a bf  cd ff 2e 64 e7 76 a7 49  |W.Q.Ji.....d.v.I|
+00000030  1e 19 34 8d 4f c3 40 14  5d 68 8c                 |..4.O.@.]h.|
 >>> Flow 5 (client to server)
-00000000  17 03 01 00 20 c7 78 67  68 03 48 2e a5 c3 7a 0a  |.... .xgh.H...z.|
-00000010  56 73 14 02 12 f7 26 ac  48 19 3e e6 4b 0f ac d0  |Vs....&.H.>.K...|
-00000020  4e 74 dc 66 68 17 03 01  00 20 bf db fb e7 85 35  |Nt.fh.... .....5|
-00000030  50 4d 39 3f ab 25 95 30  4c 7a 20 d8 89 db 74 ff  |PM9?.%.0Lz ...t.|
-00000040  e6 e1 05 30 98 17 f3 93  8a 0d 15 03 01 00 20 f9  |...0.......... .|
-00000050  33 18 32 46 d3 28 46 a4  06 8c e1 9b 9b 1d d1 d8  |3.2F.(F.........|
-00000060  7b 9f 6c ad 5d 2a 36 10  2c dd f8 30 23 54 ac     |{.l.]*6.,..0#T.|
+00000000  17 03 01 00 20 c6 82 9a  ee a3 de fe 3f cd 56 92  |.... .......?.V.|
+00000010  20 b3 27 ae 5d db 4c 6c  a3 a9 01 ba ce 98 c5 d7  | .'.].Ll........|
+00000020  af be 49 92 50 17 03 01  00 20 35 a5 2d 8e 5a 4f  |..I.P.... 5.-.ZO|
+00000030  0d a8 ea 08 f8 dd 6c 01  04 d9 a7 2b 71 b1 c9 84  |......l....+q...|
+00000040  9d de d3 ce 69 4c 7a 3e  3c 7b 15 03 01 00 20 5c  |....iLz><{.... \|
+00000050  00 f6 57 56 dc f9 fc 36  15 85 71 01 7b 18 ae 11  |..WV...6..q.{...|
+00000060  51 0b f7 a3 e4 f8 d9 d8  ae 1d 0b 68 0f 4c 87     |Q..........h.L.|
diff --git a/src/crypto/tls/testdata/Client-TLSv10-ClientCert-RSA-ECDSA b/src/crypto/tls/testdata/Client-TLSv10-ClientCert-RSA-ECDSA
index 3ee661e..d150bab 100644
--- a/src/crypto/tls/testdata/Client-TLSv10-ClientCert-RSA-ECDSA
+++ b/src/crypto/tls/testdata/Client-TLSv10-ClientCert-RSA-ECDSA
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fe 01 00 00  fa 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 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,68 +7,69 @@
 00000050  cc a8 c0 2b c0 2f c0 2c  c0 30 c0 09 c0 13 c0 0a  |...+./.,.0......|
 00000060  c0 14 00 9c 00 9d 00 2f  00 35 c0 12 00 0a c0 23  |......./.5.....#|
 00000070  c0 27 00 3c c0 07 c0 11  00 05 13 03 13 01 13 02  |.'.<............|
-00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
+00000080  01 00 00 7f 00 05 00 05  01 00 00 00 00 00 0a 00  |................|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
 000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
 000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
-000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
-000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
-000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
-000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
+000000c0  01 00 01 00 00 17 00 00  00 12 00 00 00 2b 00 09  |.............+..|
+000000d0  08 03 04 03 03 03 02 03  01 00 33 00 26 00 24 00  |..........3.&.$.|
+000000e0  1d 00 20 2f e5 7d a3 47  cd 62 43 15 28 da ac 5f  |.. /.}.G.bC.(.._|
+000000f0  bb 29 07 30 ff f6 84 af  c4 cf c2 ed 90 99 5f 58  |.).0.........._X|
+00000100  cb 3b 74                                          |.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 01 00 59 02 00 00  55 03 01 b4 ff c0 49 36  |....Y...U.....I6|
-00000010  1d 31 9a a7 f6 33 f5 16  78 d7 10 9e 19 eb 1d 67  |.1...3..x......g|
-00000020  20 39 f8 73 7e 27 e2 dc  d1 ab 03 20 79 64 67 f7  | 9.s~'..... ydg.|
-00000030  8b c8 97 f0 b4 87 0e 2d  4b 22 6c ed 92 48 85 52  |.......-K"l..H.R|
-00000040  eb 57 56 a8 cf 19 9f 4d  e3 38 5e a0 c0 09 00 00  |.WV....M.8^.....|
-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 b4 0c 00  00 b0 03 00 1d 20 ec 38  |*............ .8|
-00000280  f7 41 d0 f3 f4 6a ca 47  18 74 f1 22 2c 47 ee 39  |.A...j.G.t.",G.9|
-00000290  c9 a2 db 64 05 01 ae 5d  08 65 53 7f 24 78 00 8a  |...d...].eS.$x..|
-000002a0  30 81 87 02 41 64 39 65  56 fa d4 69 e7 c5 a5 32  |0...Ad9eV..i...2|
-000002b0  4c 52 55 96 fe 01 cd 41  3c 18 ed df fd 09 c3 89  |LRU....A<.......|
-000002c0  80 bd 88 9e d7 a1 85 16  d1 a4 5a f0 9a 76 e9 2f  |..........Z..v./|
-000002d0  d2 a4 42 a4 89 98 6c 87  64 b1 49 4e 6a 68 d2 43  |..B...l.d.INjh.C|
-000002e0  41 a2 c7 a6 2f f7 02 42  01 6c bb 32 c0 47 7e 08  |A.../..B.l.2.G~.|
-000002f0  6b 7a 44 18 b7 5d 4c 4d  6d 80 92 bb e5 65 98 1b  |kzD..]LMm....e..|
-00000300  d7 a6 a3 1b b5 f3 46 1a  e7 e0 89 04 40 b0 29 aa  |......F.....@.).|
-00000310  fe 85 6a 9a 4b 18 75 ab  00 52 71 54 41 8d eb 31  |..j.K.u..RqTA..1|
-00000320  47 69 9b 9d dc 3b 1b 3e  76 27 16 03 01 00 0a 0d  |Gi...;.>v'......|
-00000330  00 00 06 03 01 02 40 00  00 16 03 01 00 04 0e 00  |......@.........|
-00000340  00 00                                             |..|
+00000000  16 03 01 00 5d 02 00 00  59 03 01 53 6b 9f 42 b4  |....]...Y..Sk.B.|
+00000010  38 d0 d3 ef 17 52 44 10  a5 70 61 35 8c ae a9 52  |8....RD..pa5...R|
+00000020  6c d6 e2 c3 bd c4 3c b9  3c 09 83 20 aa 22 81 b5  |l.....<.<.. ."..|
+00000030  02 b5 aa e6 24 88 e6 75  70 1c 32 9a 3b 2c 2f 05  |....$..up.2.;,/.|
+00000040  e0 eb 59 65 4c 9e 45 82  fd d7 37 5e c0 09 00 00  |..YeL.E...7^....|
+00000050  11 ff 01 00 01 00 00 0b  00 04 03 00 01 02 00 17  |................|
+00000060  00 00 16 03 01 02 0e 0b  00 02 0a 00 02 07 00 02  |................|
+00000070  04 30 82 02 00 30 82 01  62 02 09 00 b8 bf 2d 47  |.0...0..b.....-G|
+00000080  a0 d2 eb f4 30 09 06 07  2a 86 48 ce 3d 04 01 30  |....0...*.H.=..0|
+00000090  45 31 0b 30 09 06 03 55  04 06 13 02 41 55 31 13  |E1.0...U....AU1.|
+000000a0  30 11 06 03 55 04 08 13  0a 53 6f 6d 65 2d 53 74  |0...U....Some-St|
+000000b0  61 74 65 31 21 30 1f 06  03 55 04 0a 13 18 49 6e  |ate1!0...U....In|
+000000c0  74 65 72 6e 65 74 20 57  69 64 67 69 74 73 20 50  |ternet Widgits P|
+000000d0  74 79 20 4c 74 64 30 1e  17 0d 31 32 31 31 32 32  |ty Ltd0...121122|
+000000e0  31 35 30 36 33 32 5a 17  0d 32 32 31 31 32 30 31  |150632Z..2211201|
+000000f0  35 30 36 33 32 5a 30 45  31 0b 30 09 06 03 55 04  |50632Z0E1.0...U.|
+00000100  06 13 02 41 55 31 13 30  11 06 03 55 04 08 13 0a  |...AU1.0...U....|
+00000110  53 6f 6d 65 2d 53 74 61  74 65 31 21 30 1f 06 03  |Some-State1!0...|
+00000120  55 04 0a 13 18 49 6e 74  65 72 6e 65 74 20 57 69  |U....Internet Wi|
+00000130  64 67 69 74 73 20 50 74  79 20 4c 74 64 30 81 9b  |dgits Pty Ltd0..|
+00000140  30 10 06 07 2a 86 48 ce  3d 02 01 06 05 2b 81 04  |0...*.H.=....+..|
+00000150  00 23 03 81 86 00 04 00  c4 a1 ed be 98 f9 0b 48  |.#.............H|
+00000160  73 36 7e c3 16 56 11 22  f2 3d 53 c3 3b 4d 21 3d  |s6~..V.".=S.;M!=|
+00000170  cd 6b 75 e6 f6 b0 dc 9a  df 26 c1 bc b2 87 f0 72  |.ku......&.....r|
+00000180  32 7c b3 64 2f 1c 90 bc  ea 68 23 10 7e fe e3 25  |2|.d/....h#.~..%|
+00000190  c0 48 3a 69 e0 28 6d d3  37 00 ef 04 62 dd 0d a0  |.H:i.(m.7...b...|
+000001a0  9c 70 62 83 d8 81 d3 64  31 aa 9e 97 31 bd 96 b0  |.pb....d1...1...|
+000001b0  68 c0 9b 23 de 76 64 3f  1a 5c 7f e9 12 0e 58 58  |h..#.vd?.\....XX|
+000001c0  b6 5f 70 dd 9b d8 ea d5  d7 f5 d5 cc b9 b6 9f 30  |._p............0|
+000001d0  66 5b 66 9a 20 e2 27 e5  bf fe 3b 30 09 06 07 2a  |f[f. .'...;0...*|
+000001e0  86 48 ce 3d 04 01 03 81  8c 00 30 81 88 02 42 01  |.H.=......0...B.|
+000001f0  88 a2 4f eb e2 45 c5 48  7d 1b ac f5 ed 98 9d ae  |..O..E.H}.......|
+00000200  47 70 c0 5e 1b b6 2f bd  f1 b6 4d b7 61 40 d3 11  |Gp.^../...M.a@..|
+00000210  a2 ce ee 0b 7e 92 7e ff  76 9d c3 3b 7e a5 3f ce  |....~.~.v..;~.?.|
+00000220  fa 10 e2 59 ec 47 2d 7c  ac da 4e 97 0e 15 a0 6f  |...Y.G-|..N....o|
+00000230  d0 02 42 01 4d fc be 67  13 9c 2d 05 0e bd 3f a3  |..B.M..g..-...?.|
+00000240  8c 25 c1 33 13 83 0d 94  06 bb d4 37 7a f6 ec 7a  |.%.3.......7z..z|
+00000250  c9 86 2e dd d7 11 69 7f  85 7c 56 de fb 31 78 2b  |......i..|V..1x+|
+00000260  e4 c7 78 0d ae cb be 9e  4e 36 24 31 7b 6a 0f 39  |..x.....N6$1{j.9|
+00000270  95 12 07 8f 2a 16 03 01  00 b5 0c 00 00 b1 03 00  |....*...........|
+00000280  1d 20 fc 74 81 8e 09 19  14 86 d3 4d 8d cf 7d 00  |. .t.......M..}.|
+00000290  c1 83 83 b5 9a 32 f1 38  01 ae a9 9b a1 d9 26 54  |.....2.8......&T|
+000002a0  a4 08 00 8b 30 81 88 02  42 00 a1 56 29 a7 ba 25  |....0...B..V)..%|
+000002b0  bb 6a 12 51 77 c1 28 35  1e 4b 3e a8 01 63 e6 f6  |.j.Qw.(5.K>..c..|
+000002c0  f3 99 05 7b 0f 1f 21 dd  9e de c9 c1 08 c6 bc 23  |...{..!........#|
+000002d0  71 87 1e a1 30 07 0c 5d  f6 9f bf 45 7d 60 3c c2  |q...0..]...E}`<.|
+000002e0  48 65 3d 3f a3 b4 67 89  90 1d 12 02 42 00 93 43  |He=?..g.....B..C|
+000002f0  12 c1 46 b5 6d 2e cc 60  50 11 95 86 bd 36 53 fc  |..F.m..`P....6S.|
+00000300  92 01 6a 11 92 97 69 c2  cf c9 b0 a0 4a 42 0b d2  |..j...i.....JB..|
+00000310  c4 0c 84 e5 9e f6 2c a3  91 70 45 25 1f 78 17 b0  |......,..pE%.x..|
+00000320  1f 0e f7 a2 d5 4d 1c 77  ec f9 04 ca ab 68 26 16  |.....M.w.....h&.|
+00000330  03 01 00 0a 0d 00 00 06  03 01 02 40 00 00 16 03  |...........@....|
+00000340  01 00 04 0e 00 00 00                              |.......|
 >>> Flow 3 (client to server)
 00000000  16 03 01 01 fd 0b 00 01  f9 00 01 f6 00 01 f3 30  |...............0|
 00000010  82 01 ef 30 82 01 58 a0  03 02 01 02 02 10 5c 19  |...0..X.......\.|
@@ -105,29 +106,29 @@
 00000200  e5 35 16 03 01 00 25 10  00 00 21 20 2f e5 7d a3  |.5....%...! /.}.|
 00000210  47 cd 62 43 15 28 da ac  5f bb 29 07 30 ff f6 84  |G.bC.(.._.).0...|
 00000220  af c4 cf c2 ed 90 99 5f  58 cb 3b 74 16 03 01 00  |......._X.;t....|
-00000230  86 0f 00 00 82 00 80 05  7e 70 eb cb ef e3 d9 6f  |........~p.....o|
-00000240  59 29 b5 da f2 07 f5 42  62 4e 74 9b cf 00 e1 5c  |Y).....BbNt....\|
-00000250  69 a5 67 3a b0 b2 ca f2  10 ed 1c b4 81 5d 7d 9e  |i.g:.........]}.|
-00000260  1a 45 69 42 13 c5 b0 86  dc 3d 60 e5 cf fd ae 0f  |.EiB.....=`.....|
-00000270  17 bb 4a ed d7 06 eb f1  6d 47 98 b7 e8 87 eb 3c  |..J.....mG.....<|
-00000280  12 55 2c 06 de 55 48 c7  59 85 cb 62 d6 e7 1d 05  |.U,..UH.Y..b....|
-00000290  1e 6d 69 84 cd 16 8e dd  ed 5b 5a 2f f2 97 b7 78  |.mi......[Z/...x|
-000002a0  93 c1 fb 75 26 c8 b5 58  43 17 c7 52 54 20 4f 7d  |...u&..XC..RT O}|
-000002b0  7c 46 89 65 fe 51 29 14  03 01 00 01 01 16 03 01  ||F.e.Q).........|
-000002c0  00 30 d9 59 e6 7e c0 a6  2a af 36 0c 2e cf 0f 42  |.0.Y.~..*.6....B|
-000002d0  54 d4 41 c6 3c f8 84 d9  2a a6 82 94 22 2d ac ae  |T.A.<...*..."-..|
-000002e0  d9 f7 68 22 f6 f0 2e 56  c1 97 80 73 0d b3 f0 70  |..h"...V...s...p|
-000002f0  49 78                                             |Ix|
+00000230  86 0f 00 00 82 00 80 3b  af ba ad 44 f1 06 e4 79  |.......;...D...y|
+00000240  d7 fa 41 42 2a 7e 45 3d  fc 9d f7 5d a9 13 b9 35  |..AB*~E=...]...5|
+00000250  49 ea 28 6a 03 48 0b 14  c9 43 69 16 32 b7 6b b5  |I.(j.H...Ci.2.k.|
+00000260  a7 11 44 15 26 61 04 ea  f8 1e a0 32 3d 6b 26 be  |..D.&a.....2=k&.|
+00000270  37 44 34 0e 06 62 ee cf  b9 41 4c 84 ba 3f aa 5f  |7D4..b...AL..?._|
+00000280  d7 ea 31 c8 77 07 13 38  66 ba ec b4 b0 6c 44 ee  |..1.w..8f....lD.|
+00000290  8e d4 49 1d 9e 7b 2d b2  48 23 a0 06 04 22 9b 3a  |..I..{-.H#...".:|
+000002a0  3f 71 13 13 ce 67 3f e8  84 0f a4 8d ff 2c de f5  |?q...g?......,..|
+000002b0  ce 8d 15 8d 64 bc 5e 14  03 01 00 01 01 16 03 01  |....d.^.........|
+000002c0  00 30 f6 42 8a 63 15 7b  24 63 62 dc f7 6a ab 38  |.0.B.c.{$cb..j.8|
+000002d0  33 32 6d c6 44 5e 10 8a  7a f8 f0 77 e7 5c 2a 6e  |32m.D^..z..w.\*n|
+000002e0  8f 18 72 c6 e2 42 66 c0  f7 7a 45 fb 68 01 30 8a  |..r..Bf..zE.h.0.|
+000002f0  59 1a                                             |Y.|
 >>> Flow 4 (server to client)
-00000000  14 03 01 00 01 01 16 03  01 00 30 06 19 79 49 41  |..........0..yIA|
-00000010  f9 9c 75 84 73 95 96 bd  1e 25 56 a9 49 ed 8e 38  |..u.s....%V.I..8|
-00000020  34 40 60 dc f0 2d f3 6c  cf 5b 80 84 2b 81 db 5f  |4@`..-.l.[..+.._|
-00000030  f4 27 03 ad b8 8d 80 0c  99 69 6f                 |.'.......io|
+00000000  14 03 01 00 01 01 16 03  01 00 30 1f a1 61 8d 3e  |..........0..a.>|
+00000010  6e 5d 29 bd d0 14 80 ec  55 fc 7d b2 02 bd 6d c5  |n]).....U.}...m.|
+00000020  93 50 67 30 4f ce d5 8a  8b 80 3c 9a a6 0f ac be  |.Pg0O.....<.....|
+00000030  dd b0 1b 22 0d 89 dc cd  73 ba 99                 |..."....s..|
 >>> Flow 5 (client to server)
-00000000  17 03 01 00 20 20 67 bd  ff 84 9b 0e 58 f3 45 1e  |....  g.....X.E.|
-00000010  7a 25 d5 ae f0 26 4b 42  c7 f3 a5 77 7b 2f 42 21  |z%...&KB...w{/B!|
-00000020  2e c6 c9 81 23 17 03 01  00 20 69 1c 2a b9 05 16  |....#.... i.*...|
-00000030  8b 71 3a c2 18 76 bd 25  1f de 83 e9 14 e2 a3 5c  |.q:..v.%.......\|
-00000040  9b 33 ee 14 39 da e2 e7  a3 a7 15 03 01 00 20 e9  |.3..9......... .|
-00000050  dc 16 0c 13 56 7a e5 fd  ce b9 4f d1 c7 20 3f ca  |....Vz....O.. ?.|
-00000060  72 20 15 f7 11 81 fe 88  ab 90 4c dc 0b a5 11     |r ........L....|
+00000000  17 03 01 00 20 23 4b ba  47 65 fb 41 fb ad c6 06  |.... #K.Ge.A....|
+00000010  c2 c7 ed 6e b4 d0 42 48  6b 68 60 69 7c f0 91 85  |...n..BHkh`i|...|
+00000020  f3 a2 ea b1 5b 17 03 01  00 20 d2 fa 3c a5 d2 ea  |....[.... ..<...|
+00000030  b8 81 7a fb 31 95 bc e5  e3 4d 1a 15 e7 e3 96 8e  |..z.1....M......|
+00000040  bc 77 26 b1 5c b5 61 14  99 7c 15 03 01 00 20 b2  |.w&.\.a..|.... .|
+00000050  0c 6a 3d 02 6b 32 2f 43  9e 5e ac f1 c3 97 e2 27  |.j=.k2/C.^.....'|
+00000060  c1 a1 b9 b6 b7 11 36 17  27 0a 7a 8d 53 18 d6     |......6.'.z.S..|
diff --git a/src/crypto/tls/testdata/Client-TLSv10-ClientCert-RSA-RSA b/src/crypto/tls/testdata/Client-TLSv10-ClientCert-RSA-RSA
index 980f933..b3157bb 100644
--- a/src/crypto/tls/testdata/Client-TLSv10-ClientCert-RSA-RSA
+++ b/src/crypto/tls/testdata/Client-TLSv10-ClientCert-RSA-RSA
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fe 01 00 00  fa 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 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,72 +7,73 @@
 00000050  cc a8 c0 2b c0 2f c0 2c  c0 30 c0 09 c0 13 c0 0a  |...+./.,.0......|
 00000060  c0 14 00 9c 00 9d 00 2f  00 35 c0 12 00 0a c0 23  |......./.5.....#|
 00000070  c0 27 00 3c c0 07 c0 11  00 05 13 03 13 01 13 02  |.'.<............|
-00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
+00000080  01 00 00 7f 00 05 00 05  01 00 00 00 00 00 0a 00  |................|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
 000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
 000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
-000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
-000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
-000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
-000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
+000000c0  01 00 01 00 00 17 00 00  00 12 00 00 00 2b 00 09  |.............+..|
+000000d0  08 03 04 03 03 03 02 03  01 00 33 00 26 00 24 00  |..........3.&.$.|
+000000e0  1d 00 20 2f e5 7d a3 47  cd 62 43 15 28 da ac 5f  |.. /.}.G.bC.(.._|
+000000f0  bb 29 07 30 ff f6 84 af  c4 cf c2 ed 90 99 5f 58  |.).0.........._X|
+00000100  cb 3b 74                                          |.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 01 00 59 02 00 00  55 03 01 4d 6d 71 59 6b  |....Y...U..MmqYk|
-00000010  cd 8c 6e b0 11 bf 4a 9e  25 90 12 cc ac b4 3f be  |..n...J.%.....?.|
-00000020  86 1b 13 47 a6 be 3d a0  8f 0b 77 20 6b b5 57 6d  |...G..=...w k.Wm|
-00000030  39 74 b0 9d b4 ae 2e 72  7e 90 d2 ab ed 32 fa 65  |9t.....r~....2.e|
-00000040  ed 85 63 d2 16 ef 47 af  a6 37 17 88 c0 13 00 00  |..c...G..7......|
-00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
-00000060  01 02 59 0b 00 02 55 00  02 52 00 02 4f 30 82 02  |..Y...U..R..O0..|
-00000070  4b 30 82 01 b4 a0 03 02  01 02 02 09 00 e8 f0 9d  |K0..............|
-00000080  3f e2 5b ea a6 30 0d 06  09 2a 86 48 86 f7 0d 01  |?.[..0...*.H....|
-00000090  01 0b 05 00 30 1f 31 0b  30 09 06 03 55 04 0a 13  |....0.1.0...U...|
-000000a0  02 47 6f 31 10 30 0e 06  03 55 04 03 13 07 47 6f  |.Go1.0...U....Go|
-000000b0  20 52 6f 6f 74 30 1e 17  0d 31 36 30 31 30 31 30  | Root0...1601010|
-000000c0  30 30 30 30 30 5a 17 0d  32 35 30 31 30 31 30 30  |00000Z..25010100|
-000000d0  30 30 30 30 5a 30 1a 31  0b 30 09 06 03 55 04 0a  |0000Z0.1.0...U..|
-000000e0  13 02 47 6f 31 0b 30 09  06 03 55 04 03 13 02 47  |..Go1.0...U....G|
-000000f0  6f 30 81 9f 30 0d 06 09  2a 86 48 86 f7 0d 01 01  |o0..0...*.H.....|
-00000100  01 05 00 03 81 8d 00 30  81 89 02 81 81 00 db 46  |.......0.......F|
-00000110  7d 93 2e 12 27 06 48 bc  06 28 21 ab 7e c4 b6 a2  |}...'.H..(!.~...|
-00000120  5d fe 1e 52 45 88 7a 36  47 a5 08 0d 92 42 5b c2  |]..RE.z6G....B[.|
-00000130  81 c0 be 97 79 98 40 fb  4f 6d 14 fd 2b 13 8b c2  |....y.@.Om..+...|
-00000140  a5 2e 67 d8 d4 09 9e d6  22 38 b7 4a 0b 74 73 2b  |..g....."8.J.ts+|
-00000150  c2 34 f1 d1 93 e5 96 d9  74 7b f3 58 9f 6c 61 3c  |.4......t{.X.la<|
-00000160  c0 b0 41 d4 d9 2b 2b 24  23 77 5b 1c 3b bd 75 5d  |..A..++$#w[.;.u]|
-00000170  ce 20 54 cf a1 63 87 1d  1e 24 c4 f3 1d 1a 50 8b  |. T..c...$....P.|
-00000180  aa b6 14 43 ed 97 a7 75  62 f4 14 c8 52 d7 02 03  |...C...ub...R...|
-00000190  01 00 01 a3 81 93 30 81  90 30 0e 06 03 55 1d 0f  |......0..0...U..|
-000001a0  01 01 ff 04 04 03 02 05  a0 30 1d 06 03 55 1d 25  |.........0...U.%|
-000001b0  04 16 30 14 06 08 2b 06  01 05 05 07 03 01 06 08  |..0...+.........|
-000001c0  2b 06 01 05 05 07 03 02  30 0c 06 03 55 1d 13 01  |+.......0...U...|
-000001d0  01 ff 04 02 30 00 30 19  06 03 55 1d 0e 04 12 04  |....0.0...U.....|
-000001e0  10 9f 91 16 1f 43 43 3e  49 a6 de 6d b6 80 d7 9f  |.....CC>I..m....|
-000001f0  60 30 1b 06 03 55 1d 23  04 14 30 12 80 10 48 13  |`0...U.#..0...H.|
-00000200  49 4d 13 7e 16 31 bb a3  01 d5 ac ab 6e 7b 30 19  |IM.~.1......n{0.|
-00000210  06 03 55 1d 11 04 12 30  10 82 0e 65 78 61 6d 70  |..U....0...examp|
-00000220  6c 65 2e 67 6f 6c 61 6e  67 30 0d 06 09 2a 86 48  |le.golang0...*.H|
-00000230  86 f7 0d 01 01 0b 05 00  03 81 81 00 9d 30 cc 40  |.............0.@|
-00000240  2b 5b 50 a0 61 cb ba e5  53 58 e1 ed 83 28 a9 58  |+[P.a...SX...(.X|
-00000250  1a a9 38 a4 95 a1 ac 31  5a 1a 84 66 3d 43 d3 2d  |..8....1Z..f=C.-|
-00000260  d9 0b f2 97 df d3 20 64  38 92 24 3a 00 bc cf 9c  |...... d8.$:....|
-00000270  7d b7 40 20 01 5f aa d3  16 61 09 a2 76 fd 13 c3  |}.@ ._...a..v...|
-00000280  cc e1 0c 5c ee b1 87 82  f1 6c 04 ed 73 bb b3 43  |...\.....l..s..C|
-00000290  77 8d 0c 1c f1 0f a1 d8  40 83 61 c9 4c 72 2b 9d  |w.......@.a.Lr+.|
-000002a0  ae db 46 06 06 4d f4 c1  b3 3e c0 d1 bd 42 d4 db  |..F..M...>...B..|
-000002b0  fe 3d 13 60 84 5c 21 d3  3b e9 fa e7 16 03 01 00  |.=.`.\!.;.......|
-000002c0  aa 0c 00 00 a6 03 00 1d  20 96 0b 2f 57 e1 1e 07  |........ ../W...|
-000002d0  e0 7f a4 91 67 97 d0 a0  19 d3 9a b2 49 79 f9 5f  |....g.......Iy._|
-000002e0  7f b5 65 d4 3a 89 92 8f  11 00 80 08 29 72 0b f7  |..e.:.......)r..|
-000002f0  7b 68 38 5e 47 15 89 f1  ee be f3 a9 26 a4 9c 6d  |{h8^G.......&..m|
-00000300  2c 2a ff f0 d6 2d 25 a5  b0 93 66 7d 8c fb fe a5  |,*...-%...f}....|
-00000310  3b cc b6 71 f4 1b 55 c4  ef 08 73 b1 49 47 2c e6  |;..q..U...s.IG,.|
-00000320  a1 ef 53 ca bb 15 e3 25  ea e7 48 44 18 88 e1 d2  |..S....%..HD....|
-00000330  3b e9 f6 92 61 5e 5c 06  44 83 37 6c e6 b6 26 32  |;...a^\.D.7l..&2|
-00000340  fd d6 00 fc 87 a2 37 e3  84 d2 ad 2d 99 0d e1 ba  |......7....-....|
-00000350  bb 2f 3b 0b dd 56 5c c2  14 af 86 58 2c 8b f8 64  |./;..V\....X,..d|
-00000360  75 ab d3 35 41 59 fa fe  a5 48 26 16 03 01 00 0a  |u..5AY...H&.....|
-00000370  0d 00 00 06 03 01 02 40  00 00 16 03 01 00 04 0e  |.......@........|
-00000380  00 00 00                                          |...|
+00000000  16 03 01 00 5d 02 00 00  59 03 01 a1 43 a5 02 b9  |....]...Y...C...|
+00000010  48 81 74 51 b7 89 df 36  43 1c a3 5e f3 11 7e 81  |H.tQ...6C..^..~.|
+00000020  2d 43 b5 86 e8 4a f4 fe  5e 5e 92 20 10 31 08 7a  |-C...J..^^. .1.z|
+00000030  cc 0e 5a 90 0e 07 aa 2f  c7 17 b8 c9 d5 93 36 e3  |..Z..../......6.|
+00000040  ca 34 ed a2 e2 3d 6c 0c  fd 56 d9 64 c0 13 00 00  |.4...=l..V.d....|
+00000050  11 ff 01 00 01 00 00 0b  00 04 03 00 01 02 00 17  |................|
+00000060  00 00 16 03 01 02 59 0b  00 02 55 00 02 52 00 02  |......Y...U..R..|
+00000070  4f 30 82 02 4b 30 82 01  b4 a0 03 02 01 02 02 09  |O0..K0..........|
+00000080  00 e8 f0 9d 3f e2 5b ea  a6 30 0d 06 09 2a 86 48  |....?.[..0...*.H|
+00000090  86 f7 0d 01 01 0b 05 00  30 1f 31 0b 30 09 06 03  |........0.1.0...|
+000000a0  55 04 0a 13 02 47 6f 31  10 30 0e 06 03 55 04 03  |U....Go1.0...U..|
+000000b0  13 07 47 6f 20 52 6f 6f  74 30 1e 17 0d 31 36 30  |..Go Root0...160|
+000000c0  31 30 31 30 30 30 30 30  30 5a 17 0d 32 35 30 31  |101000000Z..2501|
+000000d0  30 31 30 30 30 30 30 30  5a 30 1a 31 0b 30 09 06  |01000000Z0.1.0..|
+000000e0  03 55 04 0a 13 02 47 6f  31 0b 30 09 06 03 55 04  |.U....Go1.0...U.|
+000000f0  03 13 02 47 6f 30 81 9f  30 0d 06 09 2a 86 48 86  |...Go0..0...*.H.|
+00000100  f7 0d 01 01 01 05 00 03  81 8d 00 30 81 89 02 81  |...........0....|
+00000110  81 00 db 46 7d 93 2e 12  27 06 48 bc 06 28 21 ab  |...F}...'.H..(!.|
+00000120  7e c4 b6 a2 5d fe 1e 52  45 88 7a 36 47 a5 08 0d  |~...]..RE.z6G...|
+00000130  92 42 5b c2 81 c0 be 97  79 98 40 fb 4f 6d 14 fd  |.B[.....y.@.Om..|
+00000140  2b 13 8b c2 a5 2e 67 d8  d4 09 9e d6 22 38 b7 4a  |+.....g....."8.J|
+00000150  0b 74 73 2b c2 34 f1 d1  93 e5 96 d9 74 7b f3 58  |.ts+.4......t{.X|
+00000160  9f 6c 61 3c c0 b0 41 d4  d9 2b 2b 24 23 77 5b 1c  |.la<..A..++$#w[.|
+00000170  3b bd 75 5d ce 20 54 cf  a1 63 87 1d 1e 24 c4 f3  |;.u]. T..c...$..|
+00000180  1d 1a 50 8b aa b6 14 43  ed 97 a7 75 62 f4 14 c8  |..P....C...ub...|
+00000190  52 d7 02 03 01 00 01 a3  81 93 30 81 90 30 0e 06  |R.........0..0..|
+000001a0  03 55 1d 0f 01 01 ff 04  04 03 02 05 a0 30 1d 06  |.U...........0..|
+000001b0  03 55 1d 25 04 16 30 14  06 08 2b 06 01 05 05 07  |.U.%..0...+.....|
+000001c0  03 01 06 08 2b 06 01 05  05 07 03 02 30 0c 06 03  |....+.......0...|
+000001d0  55 1d 13 01 01 ff 04 02  30 00 30 19 06 03 55 1d  |U.......0.0...U.|
+000001e0  0e 04 12 04 10 9f 91 16  1f 43 43 3e 49 a6 de 6d  |.........CC>I..m|
+000001f0  b6 80 d7 9f 60 30 1b 06  03 55 1d 23 04 14 30 12  |....`0...U.#..0.|
+00000200  80 10 48 13 49 4d 13 7e  16 31 bb a3 01 d5 ac ab  |..H.IM.~.1......|
+00000210  6e 7b 30 19 06 03 55 1d  11 04 12 30 10 82 0e 65  |n{0...U....0...e|
+00000220  78 61 6d 70 6c 65 2e 67  6f 6c 61 6e 67 30 0d 06  |xample.golang0..|
+00000230  09 2a 86 48 86 f7 0d 01  01 0b 05 00 03 81 81 00  |.*.H............|
+00000240  9d 30 cc 40 2b 5b 50 a0  61 cb ba e5 53 58 e1 ed  |.0.@+[P.a...SX..|
+00000250  83 28 a9 58 1a a9 38 a4  95 a1 ac 31 5a 1a 84 66  |.(.X..8....1Z..f|
+00000260  3d 43 d3 2d d9 0b f2 97  df d3 20 64 38 92 24 3a  |=C.-...... d8.$:|
+00000270  00 bc cf 9c 7d b7 40 20  01 5f aa d3 16 61 09 a2  |....}.@ ._...a..|
+00000280  76 fd 13 c3 cc e1 0c 5c  ee b1 87 82 f1 6c 04 ed  |v......\.....l..|
+00000290  73 bb b3 43 77 8d 0c 1c  f1 0f a1 d8 40 83 61 c9  |s..Cw.......@.a.|
+000002a0  4c 72 2b 9d ae db 46 06  06 4d f4 c1 b3 3e c0 d1  |Lr+...F..M...>..|
+000002b0  bd 42 d4 db fe 3d 13 60  84 5c 21 d3 3b e9 fa e7  |.B...=.`.\!.;...|
+000002c0  16 03 01 00 aa 0c 00 00  a6 03 00 1d 20 62 23 e4  |............ b#.|
+000002d0  5c 02 03 2d 62 41 93 e8  99 9d 01 cb 55 2c 7d 8d  |\..-bA......U,}.|
+000002e0  fd db d6 ac c6 99 d0 78  0f 27 27 37 70 00 80 6a  |.......x.''7p..j|
+000002f0  58 5e 29 6b 93 82 42 fa  a2 b7 5c 06 d8 ac ae 85  |X^)k..B...\.....|
+00000300  48 37 98 35 cf 31 09 8e  d6 a3 37 26 d1 e5 b3 3b  |H7.5.1....7&...;|
+00000310  98 53 dc b5 d2 9d 73 80  89 04 35 20 e6 e7 ac 48  |.S....s...5 ...H|
+00000320  88 6f 42 ac 1b 46 d3 78  6a f0 5d a0 68 e1 83 db  |.oB..F.xj.].h...|
+00000330  8a f3 bc f0 d2 35 b7 ae  8d 38 75 9f d6 76 01 ce  |.....5...8u..v..|
+00000340  d7 a9 0f 69 11 09 75 4a  20 b4 3b ec 14 fd 2b 7b  |...i..uJ .;...+{|
+00000350  e1 cf 12 89 d2 a2 94 3d  76 d5 b8 65 b4 17 24 43  |.......=v..e..$C|
+00000360  96 68 c4 c9 cc a2 08 e7  ca bc 2d 14 90 fa 53 16  |.h........-...S.|
+00000370  03 01 00 0a 0d 00 00 06  03 01 02 40 00 00 16 03  |...........@....|
+00000380  01 00 04 0e 00 00 00                              |.......|
 >>> Flow 3 (client to server)
 00000000  16 03 01 01 fd 0b 00 01  f9 00 01 f6 00 01 f3 30  |...............0|
 00000010  82 01 ef 30 82 01 58 a0  03 02 01 02 02 10 5c 19  |...0..X.......\.|
@@ -109,29 +110,29 @@
 00000200  e5 35 16 03 01 00 25 10  00 00 21 20 2f e5 7d a3  |.5....%...! /.}.|
 00000210  47 cd 62 43 15 28 da ac  5f bb 29 07 30 ff f6 84  |G.bC.(.._.).0...|
 00000220  af c4 cf c2 ed 90 99 5f  58 cb 3b 74 16 03 01 00  |......._X.;t....|
-00000230  86 0f 00 00 82 00 80 8f  5d a5 27 13 09 5e 49 5f  |........].'..^I_|
-00000240  ff fd d6 88 75 83 cc 74  f3 e1 af 44 76 6a 35 16  |....u..t...Dvj5.|
-00000250  e8 36 5f b7 dc 21 69 77  61 12 c5 69 f7 0d 98 1f  |.6_..!iwa..i....|
-00000260  d5 15 f1 e8 88 c5 30 e8  b5 c3 2a e5 26 93 cc a4  |......0...*.&...|
-00000270  eb 31 c6 d7 f5 f4 7c d5  f7 a2 3f 1f 75 cd b2 b2  |.1....|...?.u...|
-00000280  82 3a 03 8c 5e 15 0a d2  98 b8 65 cb 5f d5 db d0  |.:..^.....e._...|
-00000290  b6 36 8c 89 7e 48 fa 3a  9f 9a bd c1 48 e7 d6 20  |.6..~H.:....H.. |
-000002a0  ef 45 5b 24 32 04 58 82  b3 7b 42 fd fe ba 78 32  |.E[$2.X..{B...x2|
-000002b0  2a f5 b7 81 33 da db 14  03 01 00 01 01 16 03 01  |*...3...........|
-000002c0  00 30 5f 96 98 94 17 6d  ff 84 72 d3 63 fd 14 59  |.0_....m..r.c..Y|
-000002d0  eb bf 5f 3e 8f dc f1 c1  dc 77 8a 33 f6 2e a2 4a  |.._>.....w.3...J|
-000002e0  15 d1 2e a4 ec 0d 3c 0b  18 07 09 6c 0d 09 34 2e  |......<....l..4.|
-000002f0  a4 6f                                             |.o|
+00000230  86 0f 00 00 82 00 80 3d  7f 32 50 ff aa 3d ff 0f  |.......=.2P..=..|
+00000240  f8 68 64 fb 2d 34 b8 5b  5e 4b 49 04 b8 eb f7 07  |.hd.-4.[^KI.....|
+00000250  b7 bf 55 17 e5 11 66 87  23 16 3e ba 87 2f 58 23  |..U...f.#.>../X#|
+00000260  28 d4 df 15 75 eb 7b f6  38 94 a8 73 8a d2 1f 51  |(...u.{.8..s...Q|
+00000270  0f b5 90 16 0f db f9 23  a0 bc a5 96 48 ac a6 fa  |.......#....H...|
+00000280  fd e7 b4 94 5e c6 d4 a6  69 61 97 1a c3 ed 1e 5a  |....^...ia.....Z|
+00000290  db d9 c5 8f 58 97 6c 2a  88 f8 fb 52 14 10 a6 5a  |....X.l*...R...Z|
+000002a0  62 7a f8 37 40 e7 fd 27  c6 27 32 12 10 75 83 e3  |bz.7@..'.'2..u..|
+000002b0  66 c1 77 78 90 38 5d 14  03 01 00 01 01 16 03 01  |f.wx.8].........|
+000002c0  00 30 47 b5 75 6f 94 df  88 65 2d fc 45 33 29 d0  |.0G.uo...e-.E3).|
+000002d0  be 8d c0 72 59 be 7e 57  aa d8 42 d5 61 95 24 53  |...rY.~W..B.a.$S|
+000002e0  19 94 06 5b 48 34 22 44  6e 6e bf 2a 3d 0d 83 f6  |...[H4"Dnn.*=...|
+000002f0  a7 3b                                             |.;|
 >>> Flow 4 (server to client)
-00000000  14 03 01 00 01 01 16 03  01 00 30 b7 4a 5c 0c e6  |..........0.J\..|
-00000010  7c d9 43 7c e7 b4 2f d7  b5 c6 5e 36 c7 87 dd 82  ||.C|../...^6....|
-00000020  da d3 b2 4e 05 ae f5 8c  b0 4d db c2 53 62 55 73  |...N.....M..SbUs|
-00000030  8c 2a 1b d5 df e4 7c a4  cf db 8b                 |.*....|....|
+00000000  14 03 01 00 01 01 16 03  01 00 30 c1 88 7e 9e de  |..........0..~..|
+00000010  d3 2d 1d 27 bf d5 49 c5  a7 67 cc 0b fc ca a6 9b  |.-.'..I..g......|
+00000020  1b c7 96 59 ff 4f b9 7d  a0 7a 5e ed eb 77 04 5f  |...Y.O.}.z^..w._|
+00000030  ba b6 ea 33 80 b0 28 ef  96 ba 6a                 |...3..(...j|
 >>> Flow 5 (client to server)
-00000000  17 03 01 00 20 b9 26 60  87 38 9c d9 c4 65 17 8e  |.... .&`.8...e..|
-00000010  3c 7f 1a b4 23 cd 27 fd  4e 92 ee 0e f2 11 dc e2  |<...#.'.N.......|
-00000020  23 e4 26 f3 55 17 03 01  00 20 5e 89 33 21 f0 dc  |#.&.U.... ^.3!..|
-00000030  e8 4f 33 1c 66 56 99 38  a5 4c 0e 0e 93 41 b7 48  |.O3.fV.8.L...A.H|
-00000040  5d ce 49 d0 d2 8a 56 a6  2d 68 15 03 01 00 20 05  |].I...V.-h.... .|
-00000050  e0 ed f9 c2 56 ec 64 e5  e7 0b f4 8a e2 41 96 9e  |....V.d......A..|
-00000060  ed 94 c8 95 69 d7 ce 2d  0e bb 5b 18 5f 30 52     |....i..-..[._0R|
+00000000  17 03 01 00 20 55 4a e0  a0 68 5f 32 17 9a a3 fd  |.... UJ..h_2....|
+00000010  01 e9 2c fa 19 12 56 6f  c6 d7 a7 8d b7 8b 74 8a  |..,...Vo......t.|
+00000020  3a ae 72 9f 1e 17 03 01  00 20 b2 07 ca 31 62 b7  |:.r...... ...1b.|
+00000030  cb 46 d4 33 61 6c 81 11  d8 8b f3 cf 6a ac a8 c7  |.F.3al......j...|
+00000040  06 9c dc d9 49 ad 39 2a  6a ea 15 03 01 00 20 ee  |....I.9*j..... .|
+00000050  53 44 2e a0 bc 8d 74 8c  12 6b 3d a8 3e a5 98 00  |SD....t..k=.>...|
+00000060  03 e8 bb 34 f5 a9 29 81  0a 6f e6 d3 0e ad 9d     |...4..)..o.....|
diff --git a/src/crypto/tls/testdata/Client-TLSv10-ECDHE-ECDSA-AES b/src/crypto/tls/testdata/Client-TLSv10-ECDHE-ECDSA-AES
index 6fc506f..d146d79 100644
--- a/src/crypto/tls/testdata/Client-TLSv10-ECDHE-ECDSA-AES
+++ b/src/crypto/tls/testdata/Client-TLSv10-ECDHE-ECDSA-AES
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fe 01 00 00  fa 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 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,85 +7,86 @@
 00000050  cc a8 c0 2b c0 2f c0 2c  c0 30 c0 09 c0 13 c0 0a  |...+./.,.0......|
 00000060  c0 14 00 9c 00 9d 00 2f  00 35 c0 12 00 0a c0 23  |......./.5.....#|
 00000070  c0 27 00 3c c0 07 c0 11  00 05 13 03 13 01 13 02  |.'.<............|
-00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
+00000080  01 00 00 7f 00 05 00 05  01 00 00 00 00 00 0a 00  |................|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
 000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
 000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
-000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
-000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
-000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
-000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
+000000c0  01 00 01 00 00 17 00 00  00 12 00 00 00 2b 00 09  |.............+..|
+000000d0  08 03 04 03 03 03 02 03  01 00 33 00 26 00 24 00  |..........3.&.$.|
+000000e0  1d 00 20 2f e5 7d a3 47  cd 62 43 15 28 da ac 5f  |.. /.}.G.bC.(.._|
+000000f0  bb 29 07 30 ff f6 84 af  c4 cf c2 ed 90 99 5f 58  |.).0.........._X|
+00000100  cb 3b 74                                          |.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 01 00 59 02 00 00  55 03 01 a3 4e 79 27 af  |....Y...U...Ny'.|
-00000010  c8 a3 15 a4 c2 7a 54 58  54 0e 0d 93 c2 ff e1 f9  |.....zTXT.......|
-00000020  55 ab 2c ea 32 cf d2 47  2e d7 8e 20 49 08 d1 66  |U.,.2..G... I..f|
-00000030  9b 9e aa af c9 90 95 ec  cb 64 2e 3d f6 27 d5 f6  |.........d.=.'..|
-00000040  23 10 d5 6e 50 5f bc 89  fe c7 d7 de c0 09 00 00  |#..nP_..........|
-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 b5 0c 00  00 b1 03 00 1d 20 4a 7c  |*............ J||
-00000280  0a 86 8a 81 f2 60 4a 3c  ac d7 7d 3b fc 00 a5 b4  |.....`J<..};....|
-00000290  85 45 45 45 fb 09 53 d7  4a cf 24 9d c8 1a 00 8b  |.EEE..S.J.$.....|
-000002a0  30 81 88 02 42 01 7a c9  c0 76 8c 26 98 63 4e a3  |0...B.z..v.&.cN.|
-000002b0  ad 4f 4e a3 d7 c7 d6 4a  69 28 cf d2 7b 0b 36 fb  |.ON....Ji(..{.6.|
-000002c0  a3 ae 2f e1 83 ea ea 4a  b7 2d ef a8 2d 13 96 e4  |../....J.-..-...|
-000002d0  73 83 66 70 5e 5c d9 5a  d1 1c d1 33 18 0b b3 30  |s.fp^\.Z...3...0|
-000002e0  2a 21 d7 78 d8 70 18 02  42 00 c4 ab 80 33 8f f1  |*!.x.p..B....3..|
-000002f0  c2 74 1b 58 2f 59 d4 27  a1 19 42 bf 14 ea a8 a2  |.t.X/Y.'..B.....|
-00000300  cb bf 96 2d 60 7b 84 40  cc 31 f5 c4 e8 51 87 b8  |...-`{.@.1...Q..|
-00000310  7b 47 ec c4 c0 4a 9b 09  59 1e f8 b5 9a e1 45 a4  |{G...J..Y.....E.|
-00000320  a1 9b ee 78 55 f8 f5 fa  1a fb c5 16 03 01 00 04  |...xU...........|
-00000330  0e 00 00 00                                       |....|
+00000000  16 03 01 00 5d 02 00 00  59 03 01 1c a5 a3 a1 49  |....]...Y......I|
+00000010  4e 93 54 cf 5a a2 8b 57  e7 f9 7b ce 53 48 fb 5b  |N.T.Z..W..{.SH.[|
+00000020  82 51 d6 0d aa c7 8b 40  44 5f 18 20 e3 b4 ca 5c  |.Q.....@D_. ...\|
+00000030  fd 20 e3 ae d2 a4 df e6  af db 4f 8b e9 95 41 1e  |. ........O...A.|
+00000040  8f 6f 1e 0a 33 e4 0b 0b  1b aa 54 a7 c0 09 00 00  |.o..3.....T.....|
+00000050  11 ff 01 00 01 00 00 0b  00 04 03 00 01 02 00 17  |................|
+00000060  00 00 16 03 01 02 0e 0b  00 02 0a 00 02 07 00 02  |................|
+00000070  04 30 82 02 00 30 82 01  62 02 09 00 b8 bf 2d 47  |.0...0..b.....-G|
+00000080  a0 d2 eb f4 30 09 06 07  2a 86 48 ce 3d 04 01 30  |....0...*.H.=..0|
+00000090  45 31 0b 30 09 06 03 55  04 06 13 02 41 55 31 13  |E1.0...U....AU1.|
+000000a0  30 11 06 03 55 04 08 13  0a 53 6f 6d 65 2d 53 74  |0...U....Some-St|
+000000b0  61 74 65 31 21 30 1f 06  03 55 04 0a 13 18 49 6e  |ate1!0...U....In|
+000000c0  74 65 72 6e 65 74 20 57  69 64 67 69 74 73 20 50  |ternet Widgits P|
+000000d0  74 79 20 4c 74 64 30 1e  17 0d 31 32 31 31 32 32  |ty Ltd0...121122|
+000000e0  31 35 30 36 33 32 5a 17  0d 32 32 31 31 32 30 31  |150632Z..2211201|
+000000f0  35 30 36 33 32 5a 30 45  31 0b 30 09 06 03 55 04  |50632Z0E1.0...U.|
+00000100  06 13 02 41 55 31 13 30  11 06 03 55 04 08 13 0a  |...AU1.0...U....|
+00000110  53 6f 6d 65 2d 53 74 61  74 65 31 21 30 1f 06 03  |Some-State1!0...|
+00000120  55 04 0a 13 18 49 6e 74  65 72 6e 65 74 20 57 69  |U....Internet Wi|
+00000130  64 67 69 74 73 20 50 74  79 20 4c 74 64 30 81 9b  |dgits Pty Ltd0..|
+00000140  30 10 06 07 2a 86 48 ce  3d 02 01 06 05 2b 81 04  |0...*.H.=....+..|
+00000150  00 23 03 81 86 00 04 00  c4 a1 ed be 98 f9 0b 48  |.#.............H|
+00000160  73 36 7e c3 16 56 11 22  f2 3d 53 c3 3b 4d 21 3d  |s6~..V.".=S.;M!=|
+00000170  cd 6b 75 e6 f6 b0 dc 9a  df 26 c1 bc b2 87 f0 72  |.ku......&.....r|
+00000180  32 7c b3 64 2f 1c 90 bc  ea 68 23 10 7e fe e3 25  |2|.d/....h#.~..%|
+00000190  c0 48 3a 69 e0 28 6d d3  37 00 ef 04 62 dd 0d a0  |.H:i.(m.7...b...|
+000001a0  9c 70 62 83 d8 81 d3 64  31 aa 9e 97 31 bd 96 b0  |.pb....d1...1...|
+000001b0  68 c0 9b 23 de 76 64 3f  1a 5c 7f e9 12 0e 58 58  |h..#.vd?.\....XX|
+000001c0  b6 5f 70 dd 9b d8 ea d5  d7 f5 d5 cc b9 b6 9f 30  |._p............0|
+000001d0  66 5b 66 9a 20 e2 27 e5  bf fe 3b 30 09 06 07 2a  |f[f. .'...;0...*|
+000001e0  86 48 ce 3d 04 01 03 81  8c 00 30 81 88 02 42 01  |.H.=......0...B.|
+000001f0  88 a2 4f eb e2 45 c5 48  7d 1b ac f5 ed 98 9d ae  |..O..E.H}.......|
+00000200  47 70 c0 5e 1b b6 2f bd  f1 b6 4d b7 61 40 d3 11  |Gp.^../...M.a@..|
+00000210  a2 ce ee 0b 7e 92 7e ff  76 9d c3 3b 7e a5 3f ce  |....~.~.v..;~.?.|
+00000220  fa 10 e2 59 ec 47 2d 7c  ac da 4e 97 0e 15 a0 6f  |...Y.G-|..N....o|
+00000230  d0 02 42 01 4d fc be 67  13 9c 2d 05 0e bd 3f a3  |..B.M..g..-...?.|
+00000240  8c 25 c1 33 13 83 0d 94  06 bb d4 37 7a f6 ec 7a  |.%.3.......7z..z|
+00000250  c9 86 2e dd d7 11 69 7f  85 7c 56 de fb 31 78 2b  |......i..|V..1x+|
+00000260  e4 c7 78 0d ae cb be 9e  4e 36 24 31 7b 6a 0f 39  |..x.....N6$1{j.9|
+00000270  95 12 07 8f 2a 16 03 01  00 b5 0c 00 00 b1 03 00  |....*...........|
+00000280  1d 20 d8 71 32 54 18 4e  03 b2 c7 dd 0d 04 2f c5  |. .q2T.N....../.|
+00000290  c4 da f0 c8 72 b5 c0 b8  c1 a9 f7 e3 8d 1f 0d 3b  |....r..........;|
+000002a0  2a 08 00 8b 30 81 88 02  42 01 b6 59 64 4b 72 d6  |*...0...B..YdKr.|
+000002b0  ef 9e 3e 18 1d d4 da 89  e1 59 91 96 47 55 09 cd  |..>......Y..GU..|
+000002c0  ee a1 e9 0c db c9 6c bc  09 82 e1 4e 03 e7 c9 c5  |......l....N....|
+000002d0  78 bd 2f 28 dc fc 6a 8c  ed e7 43 74 4e e0 06 f6  |x./(..j...CtN...|
+000002e0  ee 85 f5 0f f9 c4 92 96  7d 69 4e 02 42 01 3f cc  |........}iN.B.?.|
+000002f0  89 ce 81 42 00 4f 89 28  3d 6d 6a 70 5a 6c d9 87  |...B.O.(=mjpZl..|
+00000300  a3 80 36 7f fa c1 a1 50  57 4b 93 bf a3 16 01 f5  |..6....PWK......|
+00000310  d4 07 4d fd 33 4a 2f 50  36 83 82 40 ef 8d aa 10  |..M.3J/P6..@....|
+00000320  6d d0 e0 24 bd d6 33 d0  96 87 ce 43 28 44 86 16  |m..$..3....C(D..|
+00000330  03 01 00 04 0e 00 00 00                           |........|
 >>> Flow 3 (client to server)
 00000000  16 03 01 00 25 10 00 00  21 20 2f e5 7d a3 47 cd  |....%...! /.}.G.|
 00000010  62 43 15 28 da ac 5f bb  29 07 30 ff f6 84 af c4  |bC.(.._.).0.....|
 00000020  cf c2 ed 90 99 5f 58 cb  3b 74 14 03 01 00 01 01  |....._X.;t......|
-00000030  16 03 01 00 30 b0 5e 4a  8a 07 e3 86 43 05 16 68  |....0.^J....C..h|
-00000040  0e d1 58 a6 05 49 e9 a6  42 89 2c 3f 33 68 8b 26  |..X..I..B.,?3h.&|
-00000050  23 21 3b 62 ab 7a 21 74  d8 49 15 03 b3 1e c6 53  |#!;b.z!t.I.....S|
-00000060  74 1e 1c 4e 0f                                    |t..N.|
+00000030  16 03 01 00 30 56 e4 5e  74 7d 22 11 ce 6a 97 42  |....0V.^t}"..j.B|
+00000040  9f 6f 71 26 d4 a3 0f e4  03 1d 96 e1 ed a5 bd e4  |.oq&............|
+00000050  a5 96 7c b0 49 d4 bf fe  b2 3e d4 ed b0 52 f0 1b  |..|.I....>...R..|
+00000060  72 f4 45 ab a3                                    |r.E..|
 >>> Flow 4 (server to client)
-00000000  14 03 01 00 01 01 16 03  01 00 30 64 4b 3c 1a e3  |..........0dK<..|
-00000010  7d bb bb bb 64 d8 51 c3  eb 92 65 65 58 35 dd 7b  |}...d.Q...eeX5.{|
-00000020  d2 fd f0 0c c1 10 71 a5  a8 f7 14 84 69 b4 81 18  |......q.....i...|
-00000030  1e 0d d3 19 b6 23 72 1a  a7 43 0e                 |.....#r..C.|
+00000000  14 03 01 00 01 01 16 03  01 00 30 85 b6 39 e7 4e  |..........0..9.N|
+00000010  2d d9 aa 9c a7 a7 e9 13  a7 05 cb a4 c0 11 62 67  |-.............bg|
+00000020  34 6f b1 33 05 1e d0 a6  d1 20 f3 cc 47 7d ea 63  |4o.3..... ..G}.c|
+00000030  99 dc 34 46 8e 47 eb 5f  2c 1b b5                 |..4F.G._,..|
 >>> Flow 5 (client to server)
-00000000  17 03 01 00 20 c3 e6 70  2c 44 4f 04 0c fb 0b 7f  |.... ..p,DO.....|
-00000010  1d 2c ef 4d cc c3 21 ba  a2 db 74 76 46 ea 00 40  |.,.M..!...tvF..@|
-00000020  54 2d 4a fe 59 17 03 01  00 20 0c 6b 39 0d b5 f3  |T-J.Y.... .k9...|
-00000030  ed 7e d0 de 01 18 0c 32  4e 59 93 46 d3 c5 4f c0  |.~.....2NY.F..O.|
-00000040  f5 fd f1 d2 79 07 7d 07  b0 24 15 03 01 00 20 1d  |....y.}..$.... .|
-00000050  f7 53 a2 e7 3f 88 87 35  01 6e a5 b1 d6 81 37 5b  |.S..?..5.n....7[|
-00000060  a7 64 4c 29 f4 71 59 a1  36 c1 1a 24 93 31 7d     |.dL).qY.6..$.1}|
+00000000  17 03 01 00 20 35 6d 66  48 4a a0 ee 5a b7 2a 15  |.... 5mfHJ..Z.*.|
+00000010  c8 0c f7 86 16 f1 6a 96  51 28 9b 81 14 fd ac 92  |......j.Q(......|
+00000020  7b d0 9d be 24 17 03 01  00 20 08 f2 38 45 8e a3  |{...$.... ..8E..|
+00000030  89 50 5d 7f c8 5e 4f 71  7e 23 17 da 9b 99 a9 9d  |.P]..^Oq~#......|
+00000040  ed 51 8b 1a c8 67 fe 6c  c8 2a 15 03 01 00 20 e1  |.Q...g.l.*.... .|
+00000050  ef 54 d4 d3 e3 1e 5a db  c0 e9 92 8c 27 e5 86 dd  |.T....Z.....'...|
+00000060  29 78 cc 90 6b a7 9c 7b  b4 9b 1b 5d 1a 65 18     |)x..k..{...].e.|
diff --git a/src/crypto/tls/testdata/Client-TLSv10-ECDHE-RSA-AES b/src/crypto/tls/testdata/Client-TLSv10-ECDHE-RSA-AES
index 24da556..e66b88a 100644
--- a/src/crypto/tls/testdata/Client-TLSv10-ECDHE-RSA-AES
+++ b/src/crypto/tls/testdata/Client-TLSv10-ECDHE-RSA-AES
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fe 01 00 00  fa 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 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,89 +7,90 @@
 00000050  cc a8 c0 2b c0 2f c0 2c  c0 30 c0 09 c0 13 c0 0a  |...+./.,.0......|
 00000060  c0 14 00 9c 00 9d 00 2f  00 35 c0 12 00 0a c0 23  |......./.5.....#|
 00000070  c0 27 00 3c c0 07 c0 11  00 05 13 03 13 01 13 02  |.'.<............|
-00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
+00000080  01 00 00 7f 00 05 00 05  01 00 00 00 00 00 0a 00  |................|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
 000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
 000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
-000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
-000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
-000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
-000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
+000000c0  01 00 01 00 00 17 00 00  00 12 00 00 00 2b 00 09  |.............+..|
+000000d0  08 03 04 03 03 03 02 03  01 00 33 00 26 00 24 00  |..........3.&.$.|
+000000e0  1d 00 20 2f e5 7d a3 47  cd 62 43 15 28 da ac 5f  |.. /.}.G.bC.(.._|
+000000f0  bb 29 07 30 ff f6 84 af  c4 cf c2 ed 90 99 5f 58  |.).0.........._X|
+00000100  cb 3b 74                                          |.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 01 00 59 02 00 00  55 03 01 63 68 ea 52 0b  |....Y...U..ch.R.|
-00000010  dc 68 c7 d0 75 3e 7d 6f  0b 8c cb 25 48 b0 bb df  |.h..u>}o...%H...|
-00000020  7a 56 93 a9 d5 4f 0c 3a  e2 37 ab 20 1f 0f a4 d3  |zV...O.:.7. ....|
-00000030  b4 f6 66 6f 39 6f 62 fb  6a 1f 41 09 4b 02 5c 15  |..fo9ob.j.A.K.\.|
-00000040  a0 ba cb a6 f9 bd 3b ec  cb 76 6e ea c0 13 00 00  |......;..vn.....|
-00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
-00000060  01 02 59 0b 00 02 55 00  02 52 00 02 4f 30 82 02  |..Y...U..R..O0..|
-00000070  4b 30 82 01 b4 a0 03 02  01 02 02 09 00 e8 f0 9d  |K0..............|
-00000080  3f e2 5b ea a6 30 0d 06  09 2a 86 48 86 f7 0d 01  |?.[..0...*.H....|
-00000090  01 0b 05 00 30 1f 31 0b  30 09 06 03 55 04 0a 13  |....0.1.0...U...|
-000000a0  02 47 6f 31 10 30 0e 06  03 55 04 03 13 07 47 6f  |.Go1.0...U....Go|
-000000b0  20 52 6f 6f 74 30 1e 17  0d 31 36 30 31 30 31 30  | Root0...1601010|
-000000c0  30 30 30 30 30 5a 17 0d  32 35 30 31 30 31 30 30  |00000Z..25010100|
-000000d0  30 30 30 30 5a 30 1a 31  0b 30 09 06 03 55 04 0a  |0000Z0.1.0...U..|
-000000e0  13 02 47 6f 31 0b 30 09  06 03 55 04 03 13 02 47  |..Go1.0...U....G|
-000000f0  6f 30 81 9f 30 0d 06 09  2a 86 48 86 f7 0d 01 01  |o0..0...*.H.....|
-00000100  01 05 00 03 81 8d 00 30  81 89 02 81 81 00 db 46  |.......0.......F|
-00000110  7d 93 2e 12 27 06 48 bc  06 28 21 ab 7e c4 b6 a2  |}...'.H..(!.~...|
-00000120  5d fe 1e 52 45 88 7a 36  47 a5 08 0d 92 42 5b c2  |]..RE.z6G....B[.|
-00000130  81 c0 be 97 79 98 40 fb  4f 6d 14 fd 2b 13 8b c2  |....y.@.Om..+...|
-00000140  a5 2e 67 d8 d4 09 9e d6  22 38 b7 4a 0b 74 73 2b  |..g....."8.J.ts+|
-00000150  c2 34 f1 d1 93 e5 96 d9  74 7b f3 58 9f 6c 61 3c  |.4......t{.X.la<|
-00000160  c0 b0 41 d4 d9 2b 2b 24  23 77 5b 1c 3b bd 75 5d  |..A..++$#w[.;.u]|
-00000170  ce 20 54 cf a1 63 87 1d  1e 24 c4 f3 1d 1a 50 8b  |. T..c...$....P.|
-00000180  aa b6 14 43 ed 97 a7 75  62 f4 14 c8 52 d7 02 03  |...C...ub...R...|
-00000190  01 00 01 a3 81 93 30 81  90 30 0e 06 03 55 1d 0f  |......0..0...U..|
-000001a0  01 01 ff 04 04 03 02 05  a0 30 1d 06 03 55 1d 25  |.........0...U.%|
-000001b0  04 16 30 14 06 08 2b 06  01 05 05 07 03 01 06 08  |..0...+.........|
-000001c0  2b 06 01 05 05 07 03 02  30 0c 06 03 55 1d 13 01  |+.......0...U...|
-000001d0  01 ff 04 02 30 00 30 19  06 03 55 1d 0e 04 12 04  |....0.0...U.....|
-000001e0  10 9f 91 16 1f 43 43 3e  49 a6 de 6d b6 80 d7 9f  |.....CC>I..m....|
-000001f0  60 30 1b 06 03 55 1d 23  04 14 30 12 80 10 48 13  |`0...U.#..0...H.|
-00000200  49 4d 13 7e 16 31 bb a3  01 d5 ac ab 6e 7b 30 19  |IM.~.1......n{0.|
-00000210  06 03 55 1d 11 04 12 30  10 82 0e 65 78 61 6d 70  |..U....0...examp|
-00000220  6c 65 2e 67 6f 6c 61 6e  67 30 0d 06 09 2a 86 48  |le.golang0...*.H|
-00000230  86 f7 0d 01 01 0b 05 00  03 81 81 00 9d 30 cc 40  |.............0.@|
-00000240  2b 5b 50 a0 61 cb ba e5  53 58 e1 ed 83 28 a9 58  |+[P.a...SX...(.X|
-00000250  1a a9 38 a4 95 a1 ac 31  5a 1a 84 66 3d 43 d3 2d  |..8....1Z..f=C.-|
-00000260  d9 0b f2 97 df d3 20 64  38 92 24 3a 00 bc cf 9c  |...... d8.$:....|
-00000270  7d b7 40 20 01 5f aa d3  16 61 09 a2 76 fd 13 c3  |}.@ ._...a..v...|
-00000280  cc e1 0c 5c ee b1 87 82  f1 6c 04 ed 73 bb b3 43  |...\.....l..s..C|
-00000290  77 8d 0c 1c f1 0f a1 d8  40 83 61 c9 4c 72 2b 9d  |w.......@.a.Lr+.|
-000002a0  ae db 46 06 06 4d f4 c1  b3 3e c0 d1 bd 42 d4 db  |..F..M...>...B..|
-000002b0  fe 3d 13 60 84 5c 21 d3  3b e9 fa e7 16 03 01 00  |.=.`.\!.;.......|
-000002c0  aa 0c 00 00 a6 03 00 1d  20 04 9f 8b 4f 13 83 26  |........ ...O..&|
-000002d0  a3 cf 08 6e 59 bf b5 49  b8 ff 95 94 21 8d 2a 56  |...nY..I....!.*V|
-000002e0  2e 4b be ad ac 89 6e 52  4d 00 80 5f 63 93 43 a2  |.K....nRM.._c.C.|
-000002f0  a6 fb 53 b0 ac 93 3f 55  1d c1 0f 71 1e 96 ba 9f  |..S...?U...q....|
-00000300  86 19 f3 83 7d 90 ce 06  24 9a 60 69 f0 35 24 5d  |....}...$.`i.5$]|
-00000310  9d ce 49 0d 6f ba 31 59  3c f2 64 27 66 76 0e f1  |..I.o.1Y<.d'fv..|
-00000320  33 eb b8 70 61 d3 0c 93  a3 62 c7 5e c2 06 9d 48  |3..pa....b.^...H|
-00000330  16 2e a6 62 50 18 f6 c0  79 c2 09 f3 d5 74 bf db  |...bP...y....t..|
-00000340  b8 d4 25 06 a7 be 4a b0  62 82 86 d0 00 86 5e a2  |..%...J.b.....^.|
-00000350  34 49 9b 37 37 9a b6 eb  cc b9 8b 17 1f 29 4b a3  |4I.77........)K.|
-00000360  51 e3 c3 e8 3e 6e df c4  1d e5 48 16 03 01 00 04  |Q...>n....H.....|
-00000370  0e 00 00 00                                       |....|
+00000000  16 03 01 00 5d 02 00 00  59 03 01 4c dc 79 d9 cc  |....]...Y..L.y..|
+00000010  4d 3e e9 7d b2 7c 46 0d  2d 2f ff 27 47 b1 e3 52  |M>.}.|F.-/.'G..R|
+00000020  b1 b4 34 80 6e 60 d5 b6  2d ab bd 20 d4 59 df e1  |..4.n`..-.. .Y..|
+00000030  99 75 36 f3 ac 26 40 99  74 f3 78 43 20 e0 da 18  |.u6..&@.t.xC ...|
+00000040  ae 5c bb bc b5 cc 3f c5  32 7e 3c ba c0 13 00 00  |.\....?.2~<.....|
+00000050  11 ff 01 00 01 00 00 0b  00 04 03 00 01 02 00 17  |................|
+00000060  00 00 16 03 01 02 59 0b  00 02 55 00 02 52 00 02  |......Y...U..R..|
+00000070  4f 30 82 02 4b 30 82 01  b4 a0 03 02 01 02 02 09  |O0..K0..........|
+00000080  00 e8 f0 9d 3f e2 5b ea  a6 30 0d 06 09 2a 86 48  |....?.[..0...*.H|
+00000090  86 f7 0d 01 01 0b 05 00  30 1f 31 0b 30 09 06 03  |........0.1.0...|
+000000a0  55 04 0a 13 02 47 6f 31  10 30 0e 06 03 55 04 03  |U....Go1.0...U..|
+000000b0  13 07 47 6f 20 52 6f 6f  74 30 1e 17 0d 31 36 30  |..Go Root0...160|
+000000c0  31 30 31 30 30 30 30 30  30 5a 17 0d 32 35 30 31  |101000000Z..2501|
+000000d0  30 31 30 30 30 30 30 30  5a 30 1a 31 0b 30 09 06  |01000000Z0.1.0..|
+000000e0  03 55 04 0a 13 02 47 6f  31 0b 30 09 06 03 55 04  |.U....Go1.0...U.|
+000000f0  03 13 02 47 6f 30 81 9f  30 0d 06 09 2a 86 48 86  |...Go0..0...*.H.|
+00000100  f7 0d 01 01 01 05 00 03  81 8d 00 30 81 89 02 81  |...........0....|
+00000110  81 00 db 46 7d 93 2e 12  27 06 48 bc 06 28 21 ab  |...F}...'.H..(!.|
+00000120  7e c4 b6 a2 5d fe 1e 52  45 88 7a 36 47 a5 08 0d  |~...]..RE.z6G...|
+00000130  92 42 5b c2 81 c0 be 97  79 98 40 fb 4f 6d 14 fd  |.B[.....y.@.Om..|
+00000140  2b 13 8b c2 a5 2e 67 d8  d4 09 9e d6 22 38 b7 4a  |+.....g....."8.J|
+00000150  0b 74 73 2b c2 34 f1 d1  93 e5 96 d9 74 7b f3 58  |.ts+.4......t{.X|
+00000160  9f 6c 61 3c c0 b0 41 d4  d9 2b 2b 24 23 77 5b 1c  |.la<..A..++$#w[.|
+00000170  3b bd 75 5d ce 20 54 cf  a1 63 87 1d 1e 24 c4 f3  |;.u]. T..c...$..|
+00000180  1d 1a 50 8b aa b6 14 43  ed 97 a7 75 62 f4 14 c8  |..P....C...ub...|
+00000190  52 d7 02 03 01 00 01 a3  81 93 30 81 90 30 0e 06  |R.........0..0..|
+000001a0  03 55 1d 0f 01 01 ff 04  04 03 02 05 a0 30 1d 06  |.U...........0..|
+000001b0  03 55 1d 25 04 16 30 14  06 08 2b 06 01 05 05 07  |.U.%..0...+.....|
+000001c0  03 01 06 08 2b 06 01 05  05 07 03 02 30 0c 06 03  |....+.......0...|
+000001d0  55 1d 13 01 01 ff 04 02  30 00 30 19 06 03 55 1d  |U.......0.0...U.|
+000001e0  0e 04 12 04 10 9f 91 16  1f 43 43 3e 49 a6 de 6d  |.........CC>I..m|
+000001f0  b6 80 d7 9f 60 30 1b 06  03 55 1d 23 04 14 30 12  |....`0...U.#..0.|
+00000200  80 10 48 13 49 4d 13 7e  16 31 bb a3 01 d5 ac ab  |..H.IM.~.1......|
+00000210  6e 7b 30 19 06 03 55 1d  11 04 12 30 10 82 0e 65  |n{0...U....0...e|
+00000220  78 61 6d 70 6c 65 2e 67  6f 6c 61 6e 67 30 0d 06  |xample.golang0..|
+00000230  09 2a 86 48 86 f7 0d 01  01 0b 05 00 03 81 81 00  |.*.H............|
+00000240  9d 30 cc 40 2b 5b 50 a0  61 cb ba e5 53 58 e1 ed  |.0.@+[P.a...SX..|
+00000250  83 28 a9 58 1a a9 38 a4  95 a1 ac 31 5a 1a 84 66  |.(.X..8....1Z..f|
+00000260  3d 43 d3 2d d9 0b f2 97  df d3 20 64 38 92 24 3a  |=C.-...... d8.$:|
+00000270  00 bc cf 9c 7d b7 40 20  01 5f aa d3 16 61 09 a2  |....}.@ ._...a..|
+00000280  76 fd 13 c3 cc e1 0c 5c  ee b1 87 82 f1 6c 04 ed  |v......\.....l..|
+00000290  73 bb b3 43 77 8d 0c 1c  f1 0f a1 d8 40 83 61 c9  |s..Cw.......@.a.|
+000002a0  4c 72 2b 9d ae db 46 06  06 4d f4 c1 b3 3e c0 d1  |Lr+...F..M...>..|
+000002b0  bd 42 d4 db fe 3d 13 60  84 5c 21 d3 3b e9 fa e7  |.B...=.`.\!.;...|
+000002c0  16 03 01 00 aa 0c 00 00  a6 03 00 1d 20 ee 7b 17  |............ .{.|
+000002d0  15 a8 03 82 b4 bc ec 9a  6f 77 a8 29 29 2f ed 2e  |........ow.))/..|
+000002e0  65 91 4f 38 b4 e3 a8 f6  48 be c9 c4 26 00 80 ae  |e.O8....H...&...|
+000002f0  ef 11 b3 78 c2 8b 4d 86  38 c6 4e 86 1c 26 57 24  |...x..M.8.N..&W$|
+00000300  cf 21 12 b1 74 13 eb 12  c4 90 5a a2 eb 2c 9b 97  |.!..t.....Z..,..|
+00000310  23 f6 8f 4f 25 b8 70 fe  b1 dc 95 b5 0c 8f 0b 0d  |#..O%.p.........|
+00000320  d9 23 40 a9 48 c3 52 08  0f 4b d4 7d 9f f3 e3 4e  |.#@.H.R..K.}...N|
+00000330  8e 14 98 7c ac e9 ee a3  53 0c 25 bf 8e 06 a5 cb  |...|....S.%.....|
+00000340  6e 96 76 37 be 8a c8 2e  c3 72 cc 8d 12 78 bc 20  |n.v7.....r...x. |
+00000350  8c 53 0e e7 72 59 4d 46  34 72 27 37 6d 2c 88 d6  |.S..rYMF4r'7m,..|
+00000360  cd 0f ab 6d e1 2d a0 3c  df 04 35 d9 d2 2d f5 16  |...m.-.<..5..-..|
+00000370  03 01 00 04 0e 00 00 00                           |........|
 >>> Flow 3 (client to server)
 00000000  16 03 01 00 25 10 00 00  21 20 2f e5 7d a3 47 cd  |....%...! /.}.G.|
 00000010  62 43 15 28 da ac 5f bb  29 07 30 ff f6 84 af c4  |bC.(.._.).0.....|
 00000020  cf c2 ed 90 99 5f 58 cb  3b 74 14 03 01 00 01 01  |....._X.;t......|
-00000030  16 03 01 00 30 a6 3a 66  02 e6 09 6a dd 68 56 bc  |....0.:f...j.hV.|
-00000040  aa ec 82 c4 69 9b b9 45  44 ec e2 c2 5b 49 5d 9b  |....i..ED...[I].|
-00000050  f8 0e 81 1e 23 9e 13 72  d1 d2 0c 24 01 4f 35 aa  |....#..r...$.O5.|
-00000060  27 fc b3 cc 08                                    |'....|
+00000030  16 03 01 00 30 af af 7d  17 17 49 08 86 ba 49 c7  |....0..}..I...I.|
+00000040  01 e9 f2 85 f4 70 2d 37  38 b3 38 4d c3 23 0f f5  |.....p-78.8M.#..|
+00000050  fe f3 22 58 6a ec cd ee  17 92 d0 fe aa d8 68 ff  |.."Xj.........h.|
+00000060  1d b1 7a 5b 6a                                    |..z[j|
 >>> Flow 4 (server to client)
-00000000  14 03 01 00 01 01 16 03  01 00 30 0e 25 d7 a9 c0  |..........0.%...|
-00000010  18 3b bf 55 c0 47 3a 95  2d cb 6f c2 2c de e3 94  |.;.U.G:.-.o.,...|
-00000020  32 d3 eb e2 b6 6b 5f 42  9c 1e 47 d6 76 0c eb 95  |2....k_B..G.v...|
-00000030  fd 2d c3 9a ee ee 83 87  e8 8d 83                 |.-.........|
+00000000  14 03 01 00 01 01 16 03  01 00 30 30 b9 1b da 00  |..........00....|
+00000010  85 eb 23 f3 69 6a 96 34  f1 03 b8 51 c4 0c 09 a7  |..#.ij.4...Q....|
+00000020  62 4c 14 c6 fb ee b0 2b  f0 fc e6 9b b6 97 47 83  |bL.....+......G.|
+00000030  20 3d fe c4 42 43 6f c1  2f 09 6a                 | =..BCo./.j|
 >>> Flow 5 (client to server)
-00000000  17 03 01 00 20 ba b0 c4  22 ee 52 81 ca 55 97 4d  |.... ...".R..U.M|
-00000010  39 16 b9 37 bf df 7b d1  ae 4b 47 ac 10 12 a9 77  |9..7..{..KG....w|
-00000020  69 50 f3 60 13 17 03 01  00 20 90 d5 17 e4 96 38  |iP.`..... .....8|
-00000030  cd f7 30 6e 19 45 4e 32  ad 5f 1b 00 bf 22 9d c2  |..0n.EN2._..."..|
-00000040  16 30 fe 92 c7 fc 91 38  29 30 15 03 01 00 20 c0  |.0.....8)0.... .|
-00000050  02 ff 81 82 c9 25 c6 b0  06 ee 18 61 19 c8 d2 20  |.....%.....a... |
-00000060  d8 4e 7b a4 a5 57 17 64  4d ad 1e 1e 16 1e 52     |.N{..W.dM.....R|
+00000000  17 03 01 00 20 42 e3 37  32 c0 b5 bb fb 9b 26 9e  |.... B.72.....&.|
+00000010  1b b1 28 ee c7 44 c3 7c  c8 51 88 3a e9 5a c7 2f  |..(..D.|.Q.:.Z./|
+00000020  b6 0d 73 ee 3e 17 03 01  00 20 20 33 1e 5f 0f 81  |..s.>....  3._..|
+00000030  aa 06 15 f1 e6 24 f3 12  07 ad 78 a6 0f 18 ad 33  |.....$....x....3|
+00000040  67 d4 1c ec 28 15 65 de  e2 6e 15 03 01 00 20 b0  |g...(.e..n.... .|
+00000050  93 62 04 fe 6e 3f 41 a5  c8 e8 6c 9d a7 96 59 ba  |.b..n?A...l...Y.|
+00000060  aa 81 c8 ff ef 66 91 89  5f 9c ba d1 aa e7 ef     |.....f.._......|
diff --git a/src/crypto/tls/testdata/Client-TLSv10-ExportKeyingMaterial b/src/crypto/tls/testdata/Client-TLSv10-ExportKeyingMaterial
index 6a40d83..8225f78 100644
--- a/src/crypto/tls/testdata/Client-TLSv10-ExportKeyingMaterial
+++ b/src/crypto/tls/testdata/Client-TLSv10-ExportKeyingMaterial
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fe 01 00 00  fa 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 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,89 +7,90 @@
 00000050  cc a8 c0 2b c0 2f c0 2c  c0 30 c0 09 c0 13 c0 0a  |...+./.,.0......|
 00000060  c0 14 00 9c 00 9d 00 2f  00 35 c0 12 00 0a c0 23  |......./.5.....#|
 00000070  c0 27 00 3c c0 07 c0 11  00 05 13 03 13 01 13 02  |.'.<............|
-00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
+00000080  01 00 00 7f 00 05 00 05  01 00 00 00 00 00 0a 00  |................|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
 000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
 000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
-000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
-000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
-000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
-000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
+000000c0  01 00 01 00 00 17 00 00  00 12 00 00 00 2b 00 09  |.............+..|
+000000d0  08 03 04 03 03 03 02 03  01 00 33 00 26 00 24 00  |..........3.&.$.|
+000000e0  1d 00 20 2f e5 7d a3 47  cd 62 43 15 28 da ac 5f  |.. /.}.G.bC.(.._|
+000000f0  bb 29 07 30 ff f6 84 af  c4 cf c2 ed 90 99 5f 58  |.).0.........._X|
+00000100  cb 3b 74                                          |.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 01 00 59 02 00 00  55 03 01 05 31 9d 41 04  |....Y...U...1.A.|
-00000010  c0 d4 34 1a fc 0f 63 26  47 d6 13 7f a0 d8 aa bf  |..4...c&G.......|
-00000020  28 92 04 80 02 75 58 e6  01 e1 30 20 3c fc b0 02  |(....uX...0 <...|
-00000030  8b a4 9e 9e b2 5c 17 3c  48 0b 96 6f 15 80 d5 38  |.....\.<H..o...8|
-00000040  25 a2 f8 fb 6b fd 47 27  c2 53 6c 60 c0 13 00 00  |%...k.G'.Sl`....|
-00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
-00000060  01 02 59 0b 00 02 55 00  02 52 00 02 4f 30 82 02  |..Y...U..R..O0..|
-00000070  4b 30 82 01 b4 a0 03 02  01 02 02 09 00 e8 f0 9d  |K0..............|
-00000080  3f e2 5b ea a6 30 0d 06  09 2a 86 48 86 f7 0d 01  |?.[..0...*.H....|
-00000090  01 0b 05 00 30 1f 31 0b  30 09 06 03 55 04 0a 13  |....0.1.0...U...|
-000000a0  02 47 6f 31 10 30 0e 06  03 55 04 03 13 07 47 6f  |.Go1.0...U....Go|
-000000b0  20 52 6f 6f 74 30 1e 17  0d 31 36 30 31 30 31 30  | Root0...1601010|
-000000c0  30 30 30 30 30 5a 17 0d  32 35 30 31 30 31 30 30  |00000Z..25010100|
-000000d0  30 30 30 30 5a 30 1a 31  0b 30 09 06 03 55 04 0a  |0000Z0.1.0...U..|
-000000e0  13 02 47 6f 31 0b 30 09  06 03 55 04 03 13 02 47  |..Go1.0...U....G|
-000000f0  6f 30 81 9f 30 0d 06 09  2a 86 48 86 f7 0d 01 01  |o0..0...*.H.....|
-00000100  01 05 00 03 81 8d 00 30  81 89 02 81 81 00 db 46  |.......0.......F|
-00000110  7d 93 2e 12 27 06 48 bc  06 28 21 ab 7e c4 b6 a2  |}...'.H..(!.~...|
-00000120  5d fe 1e 52 45 88 7a 36  47 a5 08 0d 92 42 5b c2  |]..RE.z6G....B[.|
-00000130  81 c0 be 97 79 98 40 fb  4f 6d 14 fd 2b 13 8b c2  |....y.@.Om..+...|
-00000140  a5 2e 67 d8 d4 09 9e d6  22 38 b7 4a 0b 74 73 2b  |..g....."8.J.ts+|
-00000150  c2 34 f1 d1 93 e5 96 d9  74 7b f3 58 9f 6c 61 3c  |.4......t{.X.la<|
-00000160  c0 b0 41 d4 d9 2b 2b 24  23 77 5b 1c 3b bd 75 5d  |..A..++$#w[.;.u]|
-00000170  ce 20 54 cf a1 63 87 1d  1e 24 c4 f3 1d 1a 50 8b  |. T..c...$....P.|
-00000180  aa b6 14 43 ed 97 a7 75  62 f4 14 c8 52 d7 02 03  |...C...ub...R...|
-00000190  01 00 01 a3 81 93 30 81  90 30 0e 06 03 55 1d 0f  |......0..0...U..|
-000001a0  01 01 ff 04 04 03 02 05  a0 30 1d 06 03 55 1d 25  |.........0...U.%|
-000001b0  04 16 30 14 06 08 2b 06  01 05 05 07 03 01 06 08  |..0...+.........|
-000001c0  2b 06 01 05 05 07 03 02  30 0c 06 03 55 1d 13 01  |+.......0...U...|
-000001d0  01 ff 04 02 30 00 30 19  06 03 55 1d 0e 04 12 04  |....0.0...U.....|
-000001e0  10 9f 91 16 1f 43 43 3e  49 a6 de 6d b6 80 d7 9f  |.....CC>I..m....|
-000001f0  60 30 1b 06 03 55 1d 23  04 14 30 12 80 10 48 13  |`0...U.#..0...H.|
-00000200  49 4d 13 7e 16 31 bb a3  01 d5 ac ab 6e 7b 30 19  |IM.~.1......n{0.|
-00000210  06 03 55 1d 11 04 12 30  10 82 0e 65 78 61 6d 70  |..U....0...examp|
-00000220  6c 65 2e 67 6f 6c 61 6e  67 30 0d 06 09 2a 86 48  |le.golang0...*.H|
-00000230  86 f7 0d 01 01 0b 05 00  03 81 81 00 9d 30 cc 40  |.............0.@|
-00000240  2b 5b 50 a0 61 cb ba e5  53 58 e1 ed 83 28 a9 58  |+[P.a...SX...(.X|
-00000250  1a a9 38 a4 95 a1 ac 31  5a 1a 84 66 3d 43 d3 2d  |..8....1Z..f=C.-|
-00000260  d9 0b f2 97 df d3 20 64  38 92 24 3a 00 bc cf 9c  |...... d8.$:....|
-00000270  7d b7 40 20 01 5f aa d3  16 61 09 a2 76 fd 13 c3  |}.@ ._...a..v...|
-00000280  cc e1 0c 5c ee b1 87 82  f1 6c 04 ed 73 bb b3 43  |...\.....l..s..C|
-00000290  77 8d 0c 1c f1 0f a1 d8  40 83 61 c9 4c 72 2b 9d  |w.......@.a.Lr+.|
-000002a0  ae db 46 06 06 4d f4 c1  b3 3e c0 d1 bd 42 d4 db  |..F..M...>...B..|
-000002b0  fe 3d 13 60 84 5c 21 d3  3b e9 fa e7 16 03 01 00  |.=.`.\!.;.......|
-000002c0  aa 0c 00 00 a6 03 00 1d  20 a4 50 9a 0d c7 2a 1b  |........ .P...*.|
-000002d0  f6 d4 78 49 68 ac 5f 8b  e7 78 68 05 4b f8 c6 b3  |..xIh._..xh.K...|
-000002e0  eb 28 79 96 d5 e6 aa c1  54 00 80 22 66 ec fd 14  |.(y.....T.."f...|
-000002f0  83 7b 03 86 14 75 84 a4  a6 d0 ee d3 d0 f7 95 d8  |.{...u..........|
-00000300  43 48 a4 eb 83 af 96 ac  cf e8 65 20 05 c3 18 9a  |CH........e ....|
-00000310  54 63 f5 2f b7 17 06 e0  2a b3 65 6a 2f cc cd 93  |Tc./....*.ej/...|
-00000320  1e b3 5a 4d 09 da 70 b0  12 46 60 11 e4 9f ee 9f  |..ZM..p..F`.....|
-00000330  3b 6f ef df bc db 69 22  5e e8 4c 41 d6 b7 7b 06  |;o....i"^.LA..{.|
-00000340  b6 99 1c 6d 01 5a 61 7c  4e 3a af 3e 01 7e 46 bd  |...m.Za|N:.>.~F.|
-00000350  c8 15 28 ba 7f b3 d6 9d  95 74 04 36 6c 38 16 86  |..(......t.6l8..|
-00000360  d2 1d 8a 85 d1 21 5c 33  17 50 a1 16 03 01 00 04  |.....!\3.P......|
-00000370  0e 00 00 00                                       |....|
+00000000  16 03 01 00 5d 02 00 00  59 03 01 b7 20 c3 67 7b  |....]...Y... .g{|
+00000010  94 6e d7 da ea e0 77 4e  05 ad e0 9b a2 97 59 e3  |.n....wN......Y.|
+00000020  de 61 a2 49 d0 2f 27 7d  fc 7c 4e 20 9a 18 52 f9  |.a.I./'}.|N ..R.|
+00000030  bf ec 13 7d 28 1a 44 14  ea 77 25 7a 30 81 36 1e  |...}(.D..w%z0.6.|
+00000040  18 b3 23 37 79 dc 10 e8  f2 18 90 c7 c0 13 00 00  |..#7y...........|
+00000050  11 ff 01 00 01 00 00 0b  00 04 03 00 01 02 00 17  |................|
+00000060  00 00 16 03 01 02 59 0b  00 02 55 00 02 52 00 02  |......Y...U..R..|
+00000070  4f 30 82 02 4b 30 82 01  b4 a0 03 02 01 02 02 09  |O0..K0..........|
+00000080  00 e8 f0 9d 3f e2 5b ea  a6 30 0d 06 09 2a 86 48  |....?.[..0...*.H|
+00000090  86 f7 0d 01 01 0b 05 00  30 1f 31 0b 30 09 06 03  |........0.1.0...|
+000000a0  55 04 0a 13 02 47 6f 31  10 30 0e 06 03 55 04 03  |U....Go1.0...U..|
+000000b0  13 07 47 6f 20 52 6f 6f  74 30 1e 17 0d 31 36 30  |..Go Root0...160|
+000000c0  31 30 31 30 30 30 30 30  30 5a 17 0d 32 35 30 31  |101000000Z..2501|
+000000d0  30 31 30 30 30 30 30 30  5a 30 1a 31 0b 30 09 06  |01000000Z0.1.0..|
+000000e0  03 55 04 0a 13 02 47 6f  31 0b 30 09 06 03 55 04  |.U....Go1.0...U.|
+000000f0  03 13 02 47 6f 30 81 9f  30 0d 06 09 2a 86 48 86  |...Go0..0...*.H.|
+00000100  f7 0d 01 01 01 05 00 03  81 8d 00 30 81 89 02 81  |...........0....|
+00000110  81 00 db 46 7d 93 2e 12  27 06 48 bc 06 28 21 ab  |...F}...'.H..(!.|
+00000120  7e c4 b6 a2 5d fe 1e 52  45 88 7a 36 47 a5 08 0d  |~...]..RE.z6G...|
+00000130  92 42 5b c2 81 c0 be 97  79 98 40 fb 4f 6d 14 fd  |.B[.....y.@.Om..|
+00000140  2b 13 8b c2 a5 2e 67 d8  d4 09 9e d6 22 38 b7 4a  |+.....g....."8.J|
+00000150  0b 74 73 2b c2 34 f1 d1  93 e5 96 d9 74 7b f3 58  |.ts+.4......t{.X|
+00000160  9f 6c 61 3c c0 b0 41 d4  d9 2b 2b 24 23 77 5b 1c  |.la<..A..++$#w[.|
+00000170  3b bd 75 5d ce 20 54 cf  a1 63 87 1d 1e 24 c4 f3  |;.u]. T..c...$..|
+00000180  1d 1a 50 8b aa b6 14 43  ed 97 a7 75 62 f4 14 c8  |..P....C...ub...|
+00000190  52 d7 02 03 01 00 01 a3  81 93 30 81 90 30 0e 06  |R.........0..0..|
+000001a0  03 55 1d 0f 01 01 ff 04  04 03 02 05 a0 30 1d 06  |.U...........0..|
+000001b0  03 55 1d 25 04 16 30 14  06 08 2b 06 01 05 05 07  |.U.%..0...+.....|
+000001c0  03 01 06 08 2b 06 01 05  05 07 03 02 30 0c 06 03  |....+.......0...|
+000001d0  55 1d 13 01 01 ff 04 02  30 00 30 19 06 03 55 1d  |U.......0.0...U.|
+000001e0  0e 04 12 04 10 9f 91 16  1f 43 43 3e 49 a6 de 6d  |.........CC>I..m|
+000001f0  b6 80 d7 9f 60 30 1b 06  03 55 1d 23 04 14 30 12  |....`0...U.#..0.|
+00000200  80 10 48 13 49 4d 13 7e  16 31 bb a3 01 d5 ac ab  |..H.IM.~.1......|
+00000210  6e 7b 30 19 06 03 55 1d  11 04 12 30 10 82 0e 65  |n{0...U....0...e|
+00000220  78 61 6d 70 6c 65 2e 67  6f 6c 61 6e 67 30 0d 06  |xample.golang0..|
+00000230  09 2a 86 48 86 f7 0d 01  01 0b 05 00 03 81 81 00  |.*.H............|
+00000240  9d 30 cc 40 2b 5b 50 a0  61 cb ba e5 53 58 e1 ed  |.0.@+[P.a...SX..|
+00000250  83 28 a9 58 1a a9 38 a4  95 a1 ac 31 5a 1a 84 66  |.(.X..8....1Z..f|
+00000260  3d 43 d3 2d d9 0b f2 97  df d3 20 64 38 92 24 3a  |=C.-...... d8.$:|
+00000270  00 bc cf 9c 7d b7 40 20  01 5f aa d3 16 61 09 a2  |....}.@ ._...a..|
+00000280  76 fd 13 c3 cc e1 0c 5c  ee b1 87 82 f1 6c 04 ed  |v......\.....l..|
+00000290  73 bb b3 43 77 8d 0c 1c  f1 0f a1 d8 40 83 61 c9  |s..Cw.......@.a.|
+000002a0  4c 72 2b 9d ae db 46 06  06 4d f4 c1 b3 3e c0 d1  |Lr+...F..M...>..|
+000002b0  bd 42 d4 db fe 3d 13 60  84 5c 21 d3 3b e9 fa e7  |.B...=.`.\!.;...|
+000002c0  16 03 01 00 aa 0c 00 00  a6 03 00 1d 20 99 c4 bc  |............ ...|
+000002d0  cb 82 39 73 e7 54 86 b6  36 ae 7a 82 4e 4a fc 6a  |..9s.T..6.z.NJ.j|
+000002e0  19 ed 81 7b 53 03 2f 90  92 de 2a 84 65 00 80 01  |...{S./...*.e...|
+000002f0  4d 05 a7 5b ac 30 c4 47  68 1b 27 ce f9 9b bd 31  |M..[.0.Gh.'....1|
+00000300  08 90 21 16 c9 20 3c 72  da e4 8b ce 6b d5 d6 47  |..!.. <r....k..G|
+00000310  6d 8f 11 f1 36 7e 25 b0  5f 21 59 0c 1d 3b ec ae  |m...6~%._!Y..;..|
+00000320  30 46 c4 4d 27 c5 31 cf  b3 b2 44 88 2f 6f 89 1d  |0F.M'.1...D./o..|
+00000330  09 44 1b 5e da 54 6c 3f  ab cf 3b 72 e8 46 63 2e  |.D.^.Tl?..;r.Fc.|
+00000340  2a 8f d6 a2 d8 83 75 17  08 0e 50 95 18 77 cb c1  |*.....u...P..w..|
+00000350  62 d3 2c b8 6c 26 ec 36  bb 48 54 72 b9 2f de 65  |b.,.l&.6.HTr./.e|
+00000360  e7 c9 c1 49 d7 5c 1f 41  bc f0 1e 14 a1 40 1b 16  |...I.\.A.....@..|
+00000370  03 01 00 04 0e 00 00 00                           |........|
 >>> Flow 3 (client to server)
 00000000  16 03 01 00 25 10 00 00  21 20 2f e5 7d a3 47 cd  |....%...! /.}.G.|
 00000010  62 43 15 28 da ac 5f bb  29 07 30 ff f6 84 af c4  |bC.(.._.).0.....|
 00000020  cf c2 ed 90 99 5f 58 cb  3b 74 14 03 01 00 01 01  |....._X.;t......|
-00000030  16 03 01 00 30 f0 15 ea  81 0f a6 22 0a cd a5 a1  |....0......"....|
-00000040  38 4a da 1b 6c 81 19 d5  35 b7 af e9 ec 16 4d 98  |8J..l...5.....M.|
-00000050  21 c2 0e f7 0b fb ff d8  1e 2d 8b 04 56 82 48 c4  |!........-..V.H.|
-00000060  e5 f9 38 8c d2                                    |..8..|
+00000030  16 03 01 00 30 43 fc 64  73 ed 5b eb ac 0e 09 cf  |....0C.ds.[.....|
+00000040  ae 3e 3c 8c 0a ab b5 a9  c0 32 ed 8d ea 71 ed 87  |.><......2...q..|
+00000050  e5 ee d7 0c 9d a4 09 c6  9b 1d b2 86 2f a3 2e 77  |............/..w|
+00000060  aa b2 5c 6f b0                                    |..\o.|
 >>> Flow 4 (server to client)
-00000000  14 03 01 00 01 01 16 03  01 00 30 f0 b5 a3 bb bb  |..........0.....|
-00000010  9d 85 7d 6f e7 a9 17 31  65 74 82 69 56 a9 33 21  |..}o...1et.iV.3!|
-00000020  16 9d 75 3a 28 88 a5 c2  a9 e1 a7 43 6e 03 26 96  |..u:(......Cn.&.|
-00000030  37 4b de 63 be 49 cb c8  d4 a2 b6                 |7K.c.I.....|
+00000000  14 03 01 00 01 01 16 03  01 00 30 c5 aa 36 4d 9a  |..........0..6M.|
+00000010  7a e6 ea 66 2e 63 2d 69  9b b4 91 fa fc f1 f7 a5  |z..f.c-i........|
+00000020  19 17 eb da d6 95 d9 95  42 09 4c 54 30 60 c9 00  |........B.LT0`..|
+00000030  d4 a1 9e 25 dd 62 f0 33  29 43 9c                 |...%.b.3)C.|
 >>> Flow 5 (client to server)
-00000000  17 03 01 00 20 a9 9c 8f  74 ce f9 77 bc b3 86 2e  |.... ...t..w....|
-00000010  a5 8e 94 3d 08 a6 96 bf  25 0b 10 c4 66 c2 59 9a  |...=....%...f.Y.|
-00000020  4a 1a b4 77 12 17 03 01  00 20 03 72 60 38 58 88  |J..w..... .r`8X.|
-00000030  86 20 20 3f 18 52 c5 ca  55 3c 04 04 c7 e1 74 6f  |.  ?.R..U<....to|
-00000040  ca 1f cd 27 64 f2 51 12  9c ee 15 03 01 00 20 30  |...'d.Q....... 0|
-00000050  71 2a 78 bf 8b d5 11 7c  63 11 c7 25 0e 56 25 ce  |q*x....|c..%.V%.|
-00000060  24 d5 d7 de a0 ba c7 ba  e6 dc db 8e e3 93 a6     |$..............|
+00000000  17 03 01 00 20 44 84 33  58 99 c7 71 39 e6 fa 89  |.... D.3X..q9...|
+00000010  f9 a2 bd 15 9a 41 2f e7  27 1a 33 e9 89 ce 24 4c  |.....A/.'.3...$L|
+00000020  db cf c6 11 15 17 03 01  00 20 e5 5a 7b 6b ea 19  |......... .Z{k..|
+00000030  f1 55 77 54 b6 a0 c0 c6  02 d6 ce 49 b6 93 91 d3  |.UwT.......I....|
+00000040  7f 8a 93 d1 73 8d d6 f6  56 b6 15 03 01 00 20 71  |....s...V..... q|
+00000050  26 23 0c 06 c6 08 13 2d  f3 b2 c0 91 f3 11 c4 23  |&#.....-.......#|
+00000060  c3 57 79 eb ff 8b e1 81  12 fb 13 02 26 b1 5b     |.Wy.........&.[|
diff --git a/src/crypto/tls/testdata/Client-TLSv10-RSA-RC4 b/src/crypto/tls/testdata/Client-TLSv10-RSA-RC4
index dcc18ad..219462a3 100644
--- a/src/crypto/tls/testdata/Client-TLSv10-RSA-RC4
+++ b/src/crypto/tls/testdata/Client-TLSv10-RSA-RC4
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fe 01 00 00  fa 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 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,59 +7,61 @@
 00000050  cc a8 c0 2b c0 2f c0 2c  c0 30 c0 09 c0 13 c0 0a  |...+./.,.0......|
 00000060  c0 14 00 9c 00 9d 00 2f  00 35 c0 12 00 0a c0 23  |......./.5.....#|
 00000070  c0 27 00 3c c0 07 c0 11  00 05 13 03 13 01 13 02  |.'.<............|
-00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
+00000080  01 00 00 7f 00 05 00 05  01 00 00 00 00 00 0a 00  |................|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
 000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
 000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
-000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
-000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
-000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
-000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
+000000c0  01 00 01 00 00 17 00 00  00 12 00 00 00 2b 00 09  |.............+..|
+000000d0  08 03 04 03 03 03 02 03  01 00 33 00 26 00 24 00  |..........3.&.$.|
+000000e0  1d 00 20 2f e5 7d a3 47  cd 62 43 15 28 da ac 5f  |.. /.}.G.bC.(.._|
+000000f0  bb 29 07 30 ff f6 84 af  c4 cf c2 ed 90 99 5f 58  |.).0.........._X|
+00000100  cb 3b 74                                          |.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 01 00 51 02 00 00  4d 03 01 2a 09 26 d2 61  |....Q...M..*.&.a|
-00000010  ac 38 91 3d 18 3f f7 a9  3c 34 91 b0 b1 e1 29 68  |.8.=.?..<4....)h|
-00000020  dd cb b9 a9 d8 39 0b 64  c6 93 7d 20 ea 51 ff 63  |.....9.d..} .Q.c|
-00000030  97 03 b2 6f a3 d6 55 0d  64 65 2a 5d 3a fe e9 3e  |...o..U.de*]:..>|
-00000040  47 c1 7d c5 d8 03 c6 22  19 2f 6c 5a 00 05 00 00  |G.}...."./lZ....|
-00000050  05 ff 01 00 01 00 16 03  01 02 59 0b 00 02 55 00  |..........Y...U.|
-00000060  02 52 00 02 4f 30 82 02  4b 30 82 01 b4 a0 03 02  |.R..O0..K0......|
-00000070  01 02 02 09 00 e8 f0 9d  3f e2 5b ea a6 30 0d 06  |........?.[..0..|
-00000080  09 2a 86 48 86 f7 0d 01  01 0b 05 00 30 1f 31 0b  |.*.H........0.1.|
-00000090  30 09 06 03 55 04 0a 13  02 47 6f 31 10 30 0e 06  |0...U....Go1.0..|
-000000a0  03 55 04 03 13 07 47 6f  20 52 6f 6f 74 30 1e 17  |.U....Go Root0..|
-000000b0  0d 31 36 30 31 30 31 30  30 30 30 30 30 5a 17 0d  |.160101000000Z..|
-000000c0  32 35 30 31 30 31 30 30  30 30 30 30 5a 30 1a 31  |250101000000Z0.1|
-000000d0  0b 30 09 06 03 55 04 0a  13 02 47 6f 31 0b 30 09  |.0...U....Go1.0.|
-000000e0  06 03 55 04 03 13 02 47  6f 30 81 9f 30 0d 06 09  |..U....Go0..0...|
-000000f0  2a 86 48 86 f7 0d 01 01  01 05 00 03 81 8d 00 30  |*.H............0|
-00000100  81 89 02 81 81 00 db 46  7d 93 2e 12 27 06 48 bc  |.......F}...'.H.|
-00000110  06 28 21 ab 7e c4 b6 a2  5d fe 1e 52 45 88 7a 36  |.(!.~...]..RE.z6|
-00000120  47 a5 08 0d 92 42 5b c2  81 c0 be 97 79 98 40 fb  |G....B[.....y.@.|
-00000130  4f 6d 14 fd 2b 13 8b c2  a5 2e 67 d8 d4 09 9e d6  |Om..+.....g.....|
-00000140  22 38 b7 4a 0b 74 73 2b  c2 34 f1 d1 93 e5 96 d9  |"8.J.ts+.4......|
-00000150  74 7b f3 58 9f 6c 61 3c  c0 b0 41 d4 d9 2b 2b 24  |t{.X.la<..A..++$|
-00000160  23 77 5b 1c 3b bd 75 5d  ce 20 54 cf a1 63 87 1d  |#w[.;.u]. T..c..|
-00000170  1e 24 c4 f3 1d 1a 50 8b  aa b6 14 43 ed 97 a7 75  |.$....P....C...u|
-00000180  62 f4 14 c8 52 d7 02 03  01 00 01 a3 81 93 30 81  |b...R.........0.|
-00000190  90 30 0e 06 03 55 1d 0f  01 01 ff 04 04 03 02 05  |.0...U..........|
-000001a0  a0 30 1d 06 03 55 1d 25  04 16 30 14 06 08 2b 06  |.0...U.%..0...+.|
-000001b0  01 05 05 07 03 01 06 08  2b 06 01 05 05 07 03 02  |........+.......|
-000001c0  30 0c 06 03 55 1d 13 01  01 ff 04 02 30 00 30 19  |0...U.......0.0.|
-000001d0  06 03 55 1d 0e 04 12 04  10 9f 91 16 1f 43 43 3e  |..U..........CC>|
-000001e0  49 a6 de 6d b6 80 d7 9f  60 30 1b 06 03 55 1d 23  |I..m....`0...U.#|
-000001f0  04 14 30 12 80 10 48 13  49 4d 13 7e 16 31 bb a3  |..0...H.IM.~.1..|
-00000200  01 d5 ac ab 6e 7b 30 19  06 03 55 1d 11 04 12 30  |....n{0...U....0|
-00000210  10 82 0e 65 78 61 6d 70  6c 65 2e 67 6f 6c 61 6e  |...example.golan|
-00000220  67 30 0d 06 09 2a 86 48  86 f7 0d 01 01 0b 05 00  |g0...*.H........|
-00000230  03 81 81 00 9d 30 cc 40  2b 5b 50 a0 61 cb ba e5  |.....0.@+[P.a...|
-00000240  53 58 e1 ed 83 28 a9 58  1a a9 38 a4 95 a1 ac 31  |SX...(.X..8....1|
-00000250  5a 1a 84 66 3d 43 d3 2d  d9 0b f2 97 df d3 20 64  |Z..f=C.-...... d|
-00000260  38 92 24 3a 00 bc cf 9c  7d b7 40 20 01 5f aa d3  |8.$:....}.@ ._..|
-00000270  16 61 09 a2 76 fd 13 c3  cc e1 0c 5c ee b1 87 82  |.a..v......\....|
-00000280  f1 6c 04 ed 73 bb b3 43  77 8d 0c 1c f1 0f a1 d8  |.l..s..Cw.......|
-00000290  40 83 61 c9 4c 72 2b 9d  ae db 46 06 06 4d f4 c1  |@.a.Lr+...F..M..|
-000002a0  b3 3e c0 d1 bd 42 d4 db  fe 3d 13 60 84 5c 21 d3  |.>...B...=.`.\!.|
-000002b0  3b e9 fa e7 16 03 01 00  04 0e 00 00 00           |;............|
+00000000  16 03 01 00 55 02 00 00  51 03 01 73 52 96 88 0a  |....U...Q..sR...|
+00000010  35 f9 ca 22 44 32 ec 69  08 b1 4d b3 6b 70 18 92  |5.."D2.i..M.kp..|
+00000020  af 91 bf 82 00 be 1d bf  b4 2f 00 20 f3 e2 c8 e0  |........./. ....|
+00000030  5f 1a 7f 0c 69 f4 6b 74  44 39 b1 2a b9 33 8f 32  |_...i.ktD9.*.3.2|
+00000040  50 37 63 15 69 bc 45 d3  db a7 28 09 00 05 00 00  |P7c.i.E...(.....|
+00000050  09 ff 01 00 01 00 00 17  00 00 16 03 01 02 59 0b  |..............Y.|
+00000060  00 02 55 00 02 52 00 02  4f 30 82 02 4b 30 82 01  |..U..R..O0..K0..|
+00000070  b4 a0 03 02 01 02 02 09  00 e8 f0 9d 3f e2 5b ea  |............?.[.|
+00000080  a6 30 0d 06 09 2a 86 48  86 f7 0d 01 01 0b 05 00  |.0...*.H........|
+00000090  30 1f 31 0b 30 09 06 03  55 04 0a 13 02 47 6f 31  |0.1.0...U....Go1|
+000000a0  10 30 0e 06 03 55 04 03  13 07 47 6f 20 52 6f 6f  |.0...U....Go Roo|
+000000b0  74 30 1e 17 0d 31 36 30  31 30 31 30 30 30 30 30  |t0...16010100000|
+000000c0  30 5a 17 0d 32 35 30 31  30 31 30 30 30 30 30 30  |0Z..250101000000|
+000000d0  5a 30 1a 31 0b 30 09 06  03 55 04 0a 13 02 47 6f  |Z0.1.0...U....Go|
+000000e0  31 0b 30 09 06 03 55 04  03 13 02 47 6f 30 81 9f  |1.0...U....Go0..|
+000000f0  30 0d 06 09 2a 86 48 86  f7 0d 01 01 01 05 00 03  |0...*.H.........|
+00000100  81 8d 00 30 81 89 02 81  81 00 db 46 7d 93 2e 12  |...0.......F}...|
+00000110  27 06 48 bc 06 28 21 ab  7e c4 b6 a2 5d fe 1e 52  |'.H..(!.~...]..R|
+00000120  45 88 7a 36 47 a5 08 0d  92 42 5b c2 81 c0 be 97  |E.z6G....B[.....|
+00000130  79 98 40 fb 4f 6d 14 fd  2b 13 8b c2 a5 2e 67 d8  |y.@.Om..+.....g.|
+00000140  d4 09 9e d6 22 38 b7 4a  0b 74 73 2b c2 34 f1 d1  |...."8.J.ts+.4..|
+00000150  93 e5 96 d9 74 7b f3 58  9f 6c 61 3c c0 b0 41 d4  |....t{.X.la<..A.|
+00000160  d9 2b 2b 24 23 77 5b 1c  3b bd 75 5d ce 20 54 cf  |.++$#w[.;.u]. T.|
+00000170  a1 63 87 1d 1e 24 c4 f3  1d 1a 50 8b aa b6 14 43  |.c...$....P....C|
+00000180  ed 97 a7 75 62 f4 14 c8  52 d7 02 03 01 00 01 a3  |...ub...R.......|
+00000190  81 93 30 81 90 30 0e 06  03 55 1d 0f 01 01 ff 04  |..0..0...U......|
+000001a0  04 03 02 05 a0 30 1d 06  03 55 1d 25 04 16 30 14  |.....0...U.%..0.|
+000001b0  06 08 2b 06 01 05 05 07  03 01 06 08 2b 06 01 05  |..+.........+...|
+000001c0  05 07 03 02 30 0c 06 03  55 1d 13 01 01 ff 04 02  |....0...U.......|
+000001d0  30 00 30 19 06 03 55 1d  0e 04 12 04 10 9f 91 16  |0.0...U.........|
+000001e0  1f 43 43 3e 49 a6 de 6d  b6 80 d7 9f 60 30 1b 06  |.CC>I..m....`0..|
+000001f0  03 55 1d 23 04 14 30 12  80 10 48 13 49 4d 13 7e  |.U.#..0...H.IM.~|
+00000200  16 31 bb a3 01 d5 ac ab  6e 7b 30 19 06 03 55 1d  |.1......n{0...U.|
+00000210  11 04 12 30 10 82 0e 65  78 61 6d 70 6c 65 2e 67  |...0...example.g|
+00000220  6f 6c 61 6e 67 30 0d 06  09 2a 86 48 86 f7 0d 01  |olang0...*.H....|
+00000230  01 0b 05 00 03 81 81 00  9d 30 cc 40 2b 5b 50 a0  |.........0.@+[P.|
+00000240  61 cb ba e5 53 58 e1 ed  83 28 a9 58 1a a9 38 a4  |a...SX...(.X..8.|
+00000250  95 a1 ac 31 5a 1a 84 66  3d 43 d3 2d d9 0b f2 97  |...1Z..f=C.-....|
+00000260  df d3 20 64 38 92 24 3a  00 bc cf 9c 7d b7 40 20  |.. d8.$:....}.@ |
+00000270  01 5f aa d3 16 61 09 a2  76 fd 13 c3 cc e1 0c 5c  |._...a..v......\|
+00000280  ee b1 87 82 f1 6c 04 ed  73 bb b3 43 77 8d 0c 1c  |.....l..s..Cw...|
+00000290  f1 0f a1 d8 40 83 61 c9  4c 72 2b 9d ae db 46 06  |....@.a.Lr+...F.|
+000002a0  06 4d f4 c1 b3 3e c0 d1  bd 42 d4 db fe 3d 13 60  |.M...>...B...=.`|
+000002b0  84 5c 21 d3 3b e9 fa e7  16 03 01 00 04 0e 00 00  |.\!.;...........|
+000002c0  00                                                |.|
 >>> Flow 3 (client to server)
 00000000  16 03 01 00 86 10 00 00  82 00 80 b9 65 8d bf a7  |............e...|
 00000010  c8 4b 79 ce 6f cb 8b 13  1c ac b9 7d 66 5e e9 ba  |.Ky.o......}f^..|
@@ -70,15 +72,15 @@
 00000060  c5 70 0f 08 83 48 e9 48  ef 6e 50 8b 05 7e e5 84  |.p...H.H.nP..~..|
 00000070  25 fa 55 c7 ae 31 02 27  00 ef 3f 98 86 20 12 89  |%.U..1.'..?.. ..|
 00000080  91 59 28 b4 f7 d7 af d2  69 61 35 14 03 01 00 01  |.Y(.....ia5.....|
-00000090  01 16 03 01 00 24 29 ee  6c 54 d6 21 5e 31 30 9e  |.....$).lT.!^10.|
-000000a0  fd 02 69 bb 32 c2 9e ad  28 b1 2d 94 49 0a 12 0c  |..i.2...(.-.I...|
-000000b0  a1 12 b0 98 a6 33 eb 63  2b e4                    |.....3.c+.|
+00000090  01 16 03 01 00 24 bd d6  29 83 bf 42 06 cf 06 86  |.....$..)..B....|
+000000a0  09 8a 2f 4c 72 d3 98 45  6b 24 2f 58 da 45 a3 9d  |../Lr..Ek$/X.E..|
+000000b0  86 7b e0 5e 8f 52 6c ee  97 1a                    |.{.^.Rl...|
 >>> Flow 4 (server to client)
-00000000  14 03 01 00 01 01 16 03  01 00 24 32 3e 45 f2 3a  |..........$2>E.:|
-00000010  01 05 50 db 37 25 f6 b5  67 8e 38 3d f5 ba b7 90  |..P.7%..g.8=....|
-00000020  e0 05 a8 cb e0 33 1a 79  ab 44 86 d5 0c fd 86     |.....3.y.D.....|
+00000000  14 03 01 00 01 01 16 03  01 00 24 b2 c6 b8 54 c9  |..........$...T.|
+00000010  8b 16 cb d4 40 54 08 a4  39 f9 88 37 2e d7 e2 f4  |....@T..9..7....|
+00000020  17 26 ec 00 0b d3 36 42  2f 7b 6d 3f 10 e0 6d     |.&....6B/{m?..m|
 >>> Flow 5 (client to server)
-00000000  17 03 01 00 1a ac 0c 1f  12 4e d4 31 10 dd c1 04  |.........N.1....|
-00000010  8b 55 a2 2e a5 f4 e4 80  aa 23 7e bd 79 b0 ee 15  |.U.......#~.y...|
-00000020  03 01 00 16 fa d9 ff 50  7d 41 01 2a d2 13 ee 33  |.......P}A.*...3|
-00000030  52 ab 20 c5 e7 73 81 5d  81 60                    |R. ..s.].`|
+00000000  17 03 01 00 1a 75 40 46  0c 9d 5a 40 b9 b8 7c fa  |.....u@F..Z@..|.|
+00000010  a3 bf ff 37 2b 30 72 cc  a6 5c 8d c9 8a d6 64 15  |...7+0r..\....d.|
+00000020  03 01 00 16 f4 f1 6d 64  0a 21 35 dc c9 de b5 c4  |......md.!5.....|
+00000030  d7 2c 0a 6e 2a e5 90 21  20 cf                    |.,.n*..! .|
diff --git a/src/crypto/tls/testdata/Client-TLSv11-ECDHE-ECDSA-AES b/src/crypto/tls/testdata/Client-TLSv11-ECDHE-ECDSA-AES
index 92cdc4c..cc9dd82 100644
--- a/src/crypto/tls/testdata/Client-TLSv11-ECDHE-ECDSA-AES
+++ b/src/crypto/tls/testdata/Client-TLSv11-ECDHE-ECDSA-AES
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fe 01 00 00  fa 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 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,87 +7,88 @@
 00000050  cc a8 c0 2b c0 2f c0 2c  c0 30 c0 09 c0 13 c0 0a  |...+./.,.0......|
 00000060  c0 14 00 9c 00 9d 00 2f  00 35 c0 12 00 0a c0 23  |......./.5.....#|
 00000070  c0 27 00 3c c0 07 c0 11  00 05 13 03 13 01 13 02  |.'.<............|
-00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
+00000080  01 00 00 7f 00 05 00 05  01 00 00 00 00 00 0a 00  |................|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
 000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
 000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
-000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
-000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
-000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
-000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
+000000c0  01 00 01 00 00 17 00 00  00 12 00 00 00 2b 00 09  |.............+..|
+000000d0  08 03 04 03 03 03 02 03  01 00 33 00 26 00 24 00  |..........3.&.$.|
+000000e0  1d 00 20 2f e5 7d a3 47  cd 62 43 15 28 da ac 5f  |.. /.}.G.bC.(.._|
+000000f0  bb 29 07 30 ff f6 84 af  c4 cf c2 ed 90 99 5f 58  |.).0.........._X|
+00000100  cb 3b 74                                          |.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 02 00 59 02 00 00  55 03 02 bf ac 6b 91 53  |....Y...U....k.S|
-00000010  dc 1f d6 ee 0e 71 d6 a4  f5 a2 7c f0 10 69 41 dd  |.....q....|..iA.|
-00000020  4a b7 30 53 e6 28 07 31  34 8f e5 20 59 d1 bd e1  |J.0S.(.14.. Y...|
-00000030  20 44 c4 05 07 e9 07 90  5d de 08 73 72 55 04 a6  | D......]..srU..|
-00000040  11 20 bf 32 e0 dd 46 d4  1d ed 45 62 c0 09 00 00  |. .2..F...Eb....|
-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 b5 0c 00  00 b1 03 00 1d 20 ab ea  |*............ ..|
-00000280  ff 17 1e b1 ef f6 22 03  40 8b e1 1a fa ab 01 cf  |......".@.......|
-00000290  0f f0 b0 6d 43 3c 1f 03  a1 d6 4a 9d 79 43 00 8b  |...mC<....J.yC..|
-000002a0  30 81 88 02 42 00 a1 b4  50 4b 9b a3 a5 ec ef dc  |0...B...PK......|
-000002b0  bf c1 a2 65 24 2a 6c aa  ab 26 01 ed d1 ad 2e 37  |...e$*l..&.....7|
-000002c0  4f f5 8b ff 98 ac ef 15  3e d9 46 07 a3 d2 35 de  |O.......>.F...5.|
-000002d0  91 bc 3d a0 1f f1 68 55  28 ef 60 ad 13 05 ac 65  |..=...hU(.`....e|
-000002e0  e5 67 02 3f 85 8b 1b 02  42 01 26 3f fc 62 e3 93  |.g.?....B.&?.b..|
-000002f0  8e fa fb 93 0f 0b ff 68  25 46 ea 71 16 ae 6e d4  |.......h%F.q..n.|
-00000300  36 9e 48 2c 77 2b d8 f5  f6 1d 69 68 ed 28 8f e7  |6.H,w+....ih.(..|
-00000310  79 7e 78 56 52 ff e8 62  fc e2 bd 2e c7 e8 9f 3f  |y~xVR..b.......?|
-00000320  93 47 d2 62 6c f6 5c 0e  a2 b8 fe 16 03 02 00 04  |.G.bl.\.........|
-00000330  0e 00 00 00                                       |....|
+00000000  16 03 02 00 5d 02 00 00  59 03 02 7f 08 c0 d7 77  |....]...Y......w|
+00000010  20 72 4a f2 a2 2c 41 99  b0 3e 9f c8 9d ff 9b b5  | rJ..,A..>......|
+00000020  ea 99 73 91 7b 81 51 e2  1a 7e 9b 20 5d 47 a5 63  |..s.{.Q..~. ]G.c|
+00000030  86 cb fe bf 40 8e f9 f8  1c cf 4b cf 8b f2 af 56  |....@.....K....V|
+00000040  94 a3 71 ad 53 ab 30 71  2a 07 f3 a0 c0 09 00 00  |..q.S.0q*.......|
+00000050  11 ff 01 00 01 00 00 0b  00 04 03 00 01 02 00 17  |................|
+00000060  00 00 16 03 02 02 0e 0b  00 02 0a 00 02 07 00 02  |................|
+00000070  04 30 82 02 00 30 82 01  62 02 09 00 b8 bf 2d 47  |.0...0..b.....-G|
+00000080  a0 d2 eb f4 30 09 06 07  2a 86 48 ce 3d 04 01 30  |....0...*.H.=..0|
+00000090  45 31 0b 30 09 06 03 55  04 06 13 02 41 55 31 13  |E1.0...U....AU1.|
+000000a0  30 11 06 03 55 04 08 13  0a 53 6f 6d 65 2d 53 74  |0...U....Some-St|
+000000b0  61 74 65 31 21 30 1f 06  03 55 04 0a 13 18 49 6e  |ate1!0...U....In|
+000000c0  74 65 72 6e 65 74 20 57  69 64 67 69 74 73 20 50  |ternet Widgits P|
+000000d0  74 79 20 4c 74 64 30 1e  17 0d 31 32 31 31 32 32  |ty Ltd0...121122|
+000000e0  31 35 30 36 33 32 5a 17  0d 32 32 31 31 32 30 31  |150632Z..2211201|
+000000f0  35 30 36 33 32 5a 30 45  31 0b 30 09 06 03 55 04  |50632Z0E1.0...U.|
+00000100  06 13 02 41 55 31 13 30  11 06 03 55 04 08 13 0a  |...AU1.0...U....|
+00000110  53 6f 6d 65 2d 53 74 61  74 65 31 21 30 1f 06 03  |Some-State1!0...|
+00000120  55 04 0a 13 18 49 6e 74  65 72 6e 65 74 20 57 69  |U....Internet Wi|
+00000130  64 67 69 74 73 20 50 74  79 20 4c 74 64 30 81 9b  |dgits Pty Ltd0..|
+00000140  30 10 06 07 2a 86 48 ce  3d 02 01 06 05 2b 81 04  |0...*.H.=....+..|
+00000150  00 23 03 81 86 00 04 00  c4 a1 ed be 98 f9 0b 48  |.#.............H|
+00000160  73 36 7e c3 16 56 11 22  f2 3d 53 c3 3b 4d 21 3d  |s6~..V.".=S.;M!=|
+00000170  cd 6b 75 e6 f6 b0 dc 9a  df 26 c1 bc b2 87 f0 72  |.ku......&.....r|
+00000180  32 7c b3 64 2f 1c 90 bc  ea 68 23 10 7e fe e3 25  |2|.d/....h#.~..%|
+00000190  c0 48 3a 69 e0 28 6d d3  37 00 ef 04 62 dd 0d a0  |.H:i.(m.7...b...|
+000001a0  9c 70 62 83 d8 81 d3 64  31 aa 9e 97 31 bd 96 b0  |.pb....d1...1...|
+000001b0  68 c0 9b 23 de 76 64 3f  1a 5c 7f e9 12 0e 58 58  |h..#.vd?.\....XX|
+000001c0  b6 5f 70 dd 9b d8 ea d5  d7 f5 d5 cc b9 b6 9f 30  |._p............0|
+000001d0  66 5b 66 9a 20 e2 27 e5  bf fe 3b 30 09 06 07 2a  |f[f. .'...;0...*|
+000001e0  86 48 ce 3d 04 01 03 81  8c 00 30 81 88 02 42 01  |.H.=......0...B.|
+000001f0  88 a2 4f eb e2 45 c5 48  7d 1b ac f5 ed 98 9d ae  |..O..E.H}.......|
+00000200  47 70 c0 5e 1b b6 2f bd  f1 b6 4d b7 61 40 d3 11  |Gp.^../...M.a@..|
+00000210  a2 ce ee 0b 7e 92 7e ff  76 9d c3 3b 7e a5 3f ce  |....~.~.v..;~.?.|
+00000220  fa 10 e2 59 ec 47 2d 7c  ac da 4e 97 0e 15 a0 6f  |...Y.G-|..N....o|
+00000230  d0 02 42 01 4d fc be 67  13 9c 2d 05 0e bd 3f a3  |..B.M..g..-...?.|
+00000240  8c 25 c1 33 13 83 0d 94  06 bb d4 37 7a f6 ec 7a  |.%.3.......7z..z|
+00000250  c9 86 2e dd d7 11 69 7f  85 7c 56 de fb 31 78 2b  |......i..|V..1x+|
+00000260  e4 c7 78 0d ae cb be 9e  4e 36 24 31 7b 6a 0f 39  |..x.....N6$1{j.9|
+00000270  95 12 07 8f 2a 16 03 02  00 b5 0c 00 00 b1 03 00  |....*...........|
+00000280  1d 20 23 be e0 2b 65 34  a4 91 3c 4e 3c 84 51 98  |. #..+e4..<N<.Q.|
+00000290  07 07 26 42 48 eb ff fd  dc d3 e7 dd 1c 2d d0 aa  |..&BH........-..|
+000002a0  98 18 00 8b 30 81 88 02  42 01 34 ed 12 83 dd a8  |....0...B.4.....|
+000002b0  dc 4c 6a bd 2c e0 fe ce  af 92 b7 86 96 b3 19 92  |.Lj.,...........|
+000002c0  cc 28 56 12 bb 74 b5 9a  3a 07 0a b0 ef f1 3b 42  |.(V..t..:.....;B|
+000002d0  b2 c4 4a 44 d5 4b f2 5b  5a eb 43 21 23 4c 39 da  |..JD.K.[Z.C!#L9.|
+000002e0  99 3f c0 0f 23 b3 4f 58  43 0a c7 02 42 01 2b a8  |.?..#.OXC...B.+.|
+000002f0  96 0f 04 3e c0 55 db eb  73 4d 7e 75 4b 73 fa 4d  |...>.U..sM~uKs.M|
+00000300  62 de 29 b8 0e 59 68 0a  14 a5 75 31 4f 9d db 64  |b.)..Yh...u1O..d|
+00000310  d0 b4 f4 78 ae 30 99 2f  fb 33 ea 1a 21 46 33 57  |...x.0./.3..!F3W|
+00000320  59 00 5d 84 4b b3 fe a1  60 3d ae 71 af b9 ea 16  |Y.].K...`=.q....|
+00000330  03 02 00 04 0e 00 00 00                           |........|
 >>> Flow 3 (client to server)
 00000000  16 03 02 00 25 10 00 00  21 20 2f e5 7d a3 47 cd  |....%...! /.}.G.|
 00000010  62 43 15 28 da ac 5f bb  29 07 30 ff f6 84 af c4  |bC.(.._.).0.....|
 00000020  cf c2 ed 90 99 5f 58 cb  3b 74 14 03 02 00 01 01  |....._X.;t......|
 00000030  16 03 02 00 40 00 00 00  00 00 00 00 00 00 00 00  |....@...........|
-00000040  00 00 00 00 00 0f 55 37  4b 93 d5 ce b1 1c 6f a3  |......U7K.....o.|
-00000050  6d 56 32 f5 de 19 f6 a3  15 b0 6a 90 06 92 60 ca  |mV2.......j...`.|
-00000060  ec 0e 2b d4 24 16 0a 26  f3 bd 3d ca c5 9f d2 9b  |..+.$..&..=.....|
-00000070  79 2f af b6 b0                                    |y/...|
+00000040  00 00 00 00 00 ef 00 72  e6 a4 f6 8b 7f 98 ef e0  |.......r........|
+00000050  15 01 2c fc 31 7a e7 ba  fa 07 ec 0e c1 4b 69 39  |..,.1z.......Ki9|
+00000060  89 97 fa a8 8b bf 3b 7f  1a 00 32 26 72 64 19 1c  |......;...2&rd..|
+00000070  0c 2f 4b ba 78                                    |./K.x|
 >>> Flow 4 (server to client)
-00000000  14 03 02 00 01 01 16 03  02 00 40 4d e3 a9 af 51  |..........@M...Q|
-00000010  f5 d1 cd 04 f1 cf c5 48  0f 2e 0b 6e 57 4c 11 28  |.......H...nWL.(|
-00000020  dd 89 19 14 98 8e 2e 92  db 3c a4 0f 85 32 90 7e  |.........<...2.~|
-00000030  49 13 17 a0 85 fa c6 25  79 24 13 90 86 dc ec 45  |I......%y$.....E|
-00000040  7c 74 35 92 e4 89 04 c2  51 27 66                 ||t5.....Q'f|
+00000000  14 03 02 00 01 01 16 03  02 00 40 d7 89 58 0a f0  |..........@..X..|
+00000010  bd c1 a0 bb b5 f0 b4 1a  0b 08 25 e8 5a 73 04 04  |..........%.Zs..|
+00000020  01 99 65 e1 9c 80 24 e5  80 a8 a8 a1 29 bd af 99  |..e...$.....)...|
+00000030  06 4d 9a 48 59 95 0a 0e  bc 72 7d 90 cb 62 5a 2d  |.M.HY....r}..bZ-|
+00000040  7b 19 53 83 10 47 55 8b  c3 e0 84                 |{.S..GU....|
 >>> 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 f9 ac 17  1f 08 b7 80 fb 70 87 e2  |.............p..|
-00000020  53 00 27 60 78 6c 80 5b  57 e7 70 72 8a e3 1b 32  |S.'`xl.[W.pr...2|
-00000030  8c f0 67 82 82 15 03 02  00 30 00 00 00 00 00 00  |..g......0......|
-00000040  00 00 00 00 00 00 00 00  00 00 01 e1 86 47 7f 65  |.............G.e|
-00000050  a9 d2 1c 22 7d 99 7c 41  dc 17 f5 16 40 5b b3 7f  |..."}.|A....@[..|
-00000060  cc 0b 97 41 0c ae 1f 0c  39 e0                    |...A....9.|
+00000010  00 00 00 00 00 5d d8 f2  5e 83 a1 39 cb 57 a9 7f  |.....]..^..9.W..|
+00000020  93 35 72 a3 ce 15 f6 4c  5c 06 8f d1 f5 77 7c ca  |.5r....L\....w|.|
+00000030  a9 59 5f e9 ce 15 03 02  00 30 00 00 00 00 00 00  |.Y_......0......|
+00000040  00 00 00 00 00 00 00 00  00 00 2b 0a 90 aa 87 8f  |..........+.....|
+00000050  ff 26 85 22 26 26 bd 0e  a3 40 88 e1 72 21 76 69  |.&."&&...@..r!vi|
+00000060  4c 69 22 2c 6c 72 a3 64  6e 61                    |Li",lr.dna|
diff --git a/src/crypto/tls/testdata/Client-TLSv11-ECDHE-RSA-AES b/src/crypto/tls/testdata/Client-TLSv11-ECDHE-RSA-AES
index b2b7ecb..5bde683 100644
--- a/src/crypto/tls/testdata/Client-TLSv11-ECDHE-RSA-AES
+++ b/src/crypto/tls/testdata/Client-TLSv11-ECDHE-RSA-AES
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fe 01 00 00  fa 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 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,91 +7,92 @@
 00000050  cc a8 c0 2b c0 2f c0 2c  c0 30 c0 09 c0 13 c0 0a  |...+./.,.0......|
 00000060  c0 14 00 9c 00 9d 00 2f  00 35 c0 12 00 0a c0 23  |......./.5.....#|
 00000070  c0 27 00 3c c0 07 c0 11  00 05 13 03 13 01 13 02  |.'.<............|
-00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
+00000080  01 00 00 7f 00 05 00 05  01 00 00 00 00 00 0a 00  |................|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
 000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
 000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
-000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
-000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
-000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
-000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
+000000c0  01 00 01 00 00 17 00 00  00 12 00 00 00 2b 00 09  |.............+..|
+000000d0  08 03 04 03 03 03 02 03  01 00 33 00 26 00 24 00  |..........3.&.$.|
+000000e0  1d 00 20 2f e5 7d a3 47  cd 62 43 15 28 da ac 5f  |.. /.}.G.bC.(.._|
+000000f0  bb 29 07 30 ff f6 84 af  c4 cf c2 ed 90 99 5f 58  |.).0.........._X|
+00000100  cb 3b 74                                          |.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 02 00 59 02 00 00  55 03 02 95 6e 24 5a ab  |....Y...U...n$Z.|
-00000010  ae 3c 73 52 9d 31 63 50  cf f9 50 99 3c e4 94 22  |.<sR.1cP..P.<.."|
-00000020  5b 6f 0e f8 e3 a8 64 4c  d2 8c 00 20 8b 2d 25 47  |[o....dL... .-%G|
-00000030  f9 74 41 93 b1 82 b5 c5  fc 3e 42 c9 35 fc 68 27  |.tA......>B.5.h'|
-00000040  c4 2b 35 0f f8 1c e3 28  e6 8a 59 dc c0 13 00 00  |.+5....(..Y.....|
-00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
-00000060  02 02 59 0b 00 02 55 00  02 52 00 02 4f 30 82 02  |..Y...U..R..O0..|
-00000070  4b 30 82 01 b4 a0 03 02  01 02 02 09 00 e8 f0 9d  |K0..............|
-00000080  3f e2 5b ea a6 30 0d 06  09 2a 86 48 86 f7 0d 01  |?.[..0...*.H....|
-00000090  01 0b 05 00 30 1f 31 0b  30 09 06 03 55 04 0a 13  |....0.1.0...U...|
-000000a0  02 47 6f 31 10 30 0e 06  03 55 04 03 13 07 47 6f  |.Go1.0...U....Go|
-000000b0  20 52 6f 6f 74 30 1e 17  0d 31 36 30 31 30 31 30  | Root0...1601010|
-000000c0  30 30 30 30 30 5a 17 0d  32 35 30 31 30 31 30 30  |00000Z..25010100|
-000000d0  30 30 30 30 5a 30 1a 31  0b 30 09 06 03 55 04 0a  |0000Z0.1.0...U..|
-000000e0  13 02 47 6f 31 0b 30 09  06 03 55 04 03 13 02 47  |..Go1.0...U....G|
-000000f0  6f 30 81 9f 30 0d 06 09  2a 86 48 86 f7 0d 01 01  |o0..0...*.H.....|
-00000100  01 05 00 03 81 8d 00 30  81 89 02 81 81 00 db 46  |.......0.......F|
-00000110  7d 93 2e 12 27 06 48 bc  06 28 21 ab 7e c4 b6 a2  |}...'.H..(!.~...|
-00000120  5d fe 1e 52 45 88 7a 36  47 a5 08 0d 92 42 5b c2  |]..RE.z6G....B[.|
-00000130  81 c0 be 97 79 98 40 fb  4f 6d 14 fd 2b 13 8b c2  |....y.@.Om..+...|
-00000140  a5 2e 67 d8 d4 09 9e d6  22 38 b7 4a 0b 74 73 2b  |..g....."8.J.ts+|
-00000150  c2 34 f1 d1 93 e5 96 d9  74 7b f3 58 9f 6c 61 3c  |.4......t{.X.la<|
-00000160  c0 b0 41 d4 d9 2b 2b 24  23 77 5b 1c 3b bd 75 5d  |..A..++$#w[.;.u]|
-00000170  ce 20 54 cf a1 63 87 1d  1e 24 c4 f3 1d 1a 50 8b  |. T..c...$....P.|
-00000180  aa b6 14 43 ed 97 a7 75  62 f4 14 c8 52 d7 02 03  |...C...ub...R...|
-00000190  01 00 01 a3 81 93 30 81  90 30 0e 06 03 55 1d 0f  |......0..0...U..|
-000001a0  01 01 ff 04 04 03 02 05  a0 30 1d 06 03 55 1d 25  |.........0...U.%|
-000001b0  04 16 30 14 06 08 2b 06  01 05 05 07 03 01 06 08  |..0...+.........|
-000001c0  2b 06 01 05 05 07 03 02  30 0c 06 03 55 1d 13 01  |+.......0...U...|
-000001d0  01 ff 04 02 30 00 30 19  06 03 55 1d 0e 04 12 04  |....0.0...U.....|
-000001e0  10 9f 91 16 1f 43 43 3e  49 a6 de 6d b6 80 d7 9f  |.....CC>I..m....|
-000001f0  60 30 1b 06 03 55 1d 23  04 14 30 12 80 10 48 13  |`0...U.#..0...H.|
-00000200  49 4d 13 7e 16 31 bb a3  01 d5 ac ab 6e 7b 30 19  |IM.~.1......n{0.|
-00000210  06 03 55 1d 11 04 12 30  10 82 0e 65 78 61 6d 70  |..U....0...examp|
-00000220  6c 65 2e 67 6f 6c 61 6e  67 30 0d 06 09 2a 86 48  |le.golang0...*.H|
-00000230  86 f7 0d 01 01 0b 05 00  03 81 81 00 9d 30 cc 40  |.............0.@|
-00000240  2b 5b 50 a0 61 cb ba e5  53 58 e1 ed 83 28 a9 58  |+[P.a...SX...(.X|
-00000250  1a a9 38 a4 95 a1 ac 31  5a 1a 84 66 3d 43 d3 2d  |..8....1Z..f=C.-|
-00000260  d9 0b f2 97 df d3 20 64  38 92 24 3a 00 bc cf 9c  |...... d8.$:....|
-00000270  7d b7 40 20 01 5f aa d3  16 61 09 a2 76 fd 13 c3  |}.@ ._...a..v...|
-00000280  cc e1 0c 5c ee b1 87 82  f1 6c 04 ed 73 bb b3 43  |...\.....l..s..C|
-00000290  77 8d 0c 1c f1 0f a1 d8  40 83 61 c9 4c 72 2b 9d  |w.......@.a.Lr+.|
-000002a0  ae db 46 06 06 4d f4 c1  b3 3e c0 d1 bd 42 d4 db  |..F..M...>...B..|
-000002b0  fe 3d 13 60 84 5c 21 d3  3b e9 fa e7 16 03 02 00  |.=.`.\!.;.......|
-000002c0  aa 0c 00 00 a6 03 00 1d  20 b5 75 ee e5 26 6b c0  |........ .u..&k.|
-000002d0  af 34 8a 24 f7 c5 25 58  29 38 4c 08 d3 a2 0c 48  |.4.$..%X)8L....H|
-000002e0  18 eb a0 5b e8 64 62 62  78 00 80 d0 1c 9c 11 1a  |...[.dbbx.......|
-000002f0  58 4c 46 5f 18 03 d7 d7  76 47 d5 56 7a bb bd 95  |XLF_....vG.Vz...|
-00000300  16 46 e8 0b 28 6e df 15  65 1a f6 95 fb 4a 6c 42  |.F..(n..e....JlB|
-00000310  1b 4c 5c 30 c5 de d0 83  08 d3 2e 4d 59 7e 7b 1b  |.L\0.......MY~{.|
-00000320  20 9e b5 19 76 fe a3 dd  87 04 f4 9a 3e 3c c0 4a  | ...v.......><.J|
-00000330  16 7f e3 4e 9a 1f 0a 36  1d f5 09 b4 88 09 b1 1b  |...N...6........|
-00000340  9b 60 97 dc d7 ea 97 f4  d6 06 16 45 98 ee 5c 39  |.`.........E..\9|
-00000350  62 3f 7c 82 7b c3 52 59  01 d4 89 8c a6 e2 d5 eb  |b?|.{.RY........|
-00000360  e8 30 a6 78 49 1e ec a5  92 ad 24 16 03 02 00 04  |.0.xI.....$.....|
-00000370  0e 00 00 00                                       |....|
+00000000  16 03 02 00 5d 02 00 00  59 03 02 a4 97 26 eb 45  |....]...Y....&.E|
+00000010  35 28 1a 9a 6b 3e b3 e6  c0 9f 4a c7 6f 57 70 9a  |5(..k>....J.oWp.|
+00000020  fe 3a 1a a5 c3 05 d3 50  45 43 ee 20 3e 34 5b ef  |.:.....PEC. >4[.|
+00000030  64 f3 f8 40 e4 69 7d 3a  46 db 4e 83 6c ff 68 2a  |d..@.i}:F.N.l.h*|
+00000040  f9 f4 45 5e 7c 25 5f a0  d5 89 7e 83 c0 13 00 00  |..E^|%_...~.....|
+00000050  11 ff 01 00 01 00 00 0b  00 04 03 00 01 02 00 17  |................|
+00000060  00 00 16 03 02 02 59 0b  00 02 55 00 02 52 00 02  |......Y...U..R..|
+00000070  4f 30 82 02 4b 30 82 01  b4 a0 03 02 01 02 02 09  |O0..K0..........|
+00000080  00 e8 f0 9d 3f e2 5b ea  a6 30 0d 06 09 2a 86 48  |....?.[..0...*.H|
+00000090  86 f7 0d 01 01 0b 05 00  30 1f 31 0b 30 09 06 03  |........0.1.0...|
+000000a0  55 04 0a 13 02 47 6f 31  10 30 0e 06 03 55 04 03  |U....Go1.0...U..|
+000000b0  13 07 47 6f 20 52 6f 6f  74 30 1e 17 0d 31 36 30  |..Go Root0...160|
+000000c0  31 30 31 30 30 30 30 30  30 5a 17 0d 32 35 30 31  |101000000Z..2501|
+000000d0  30 31 30 30 30 30 30 30  5a 30 1a 31 0b 30 09 06  |01000000Z0.1.0..|
+000000e0  03 55 04 0a 13 02 47 6f  31 0b 30 09 06 03 55 04  |.U....Go1.0...U.|
+000000f0  03 13 02 47 6f 30 81 9f  30 0d 06 09 2a 86 48 86  |...Go0..0...*.H.|
+00000100  f7 0d 01 01 01 05 00 03  81 8d 00 30 81 89 02 81  |...........0....|
+00000110  81 00 db 46 7d 93 2e 12  27 06 48 bc 06 28 21 ab  |...F}...'.H..(!.|
+00000120  7e c4 b6 a2 5d fe 1e 52  45 88 7a 36 47 a5 08 0d  |~...]..RE.z6G...|
+00000130  92 42 5b c2 81 c0 be 97  79 98 40 fb 4f 6d 14 fd  |.B[.....y.@.Om..|
+00000140  2b 13 8b c2 a5 2e 67 d8  d4 09 9e d6 22 38 b7 4a  |+.....g....."8.J|
+00000150  0b 74 73 2b c2 34 f1 d1  93 e5 96 d9 74 7b f3 58  |.ts+.4......t{.X|
+00000160  9f 6c 61 3c c0 b0 41 d4  d9 2b 2b 24 23 77 5b 1c  |.la<..A..++$#w[.|
+00000170  3b bd 75 5d ce 20 54 cf  a1 63 87 1d 1e 24 c4 f3  |;.u]. T..c...$..|
+00000180  1d 1a 50 8b aa b6 14 43  ed 97 a7 75 62 f4 14 c8  |..P....C...ub...|
+00000190  52 d7 02 03 01 00 01 a3  81 93 30 81 90 30 0e 06  |R.........0..0..|
+000001a0  03 55 1d 0f 01 01 ff 04  04 03 02 05 a0 30 1d 06  |.U...........0..|
+000001b0  03 55 1d 25 04 16 30 14  06 08 2b 06 01 05 05 07  |.U.%..0...+.....|
+000001c0  03 01 06 08 2b 06 01 05  05 07 03 02 30 0c 06 03  |....+.......0...|
+000001d0  55 1d 13 01 01 ff 04 02  30 00 30 19 06 03 55 1d  |U.......0.0...U.|
+000001e0  0e 04 12 04 10 9f 91 16  1f 43 43 3e 49 a6 de 6d  |.........CC>I..m|
+000001f0  b6 80 d7 9f 60 30 1b 06  03 55 1d 23 04 14 30 12  |....`0...U.#..0.|
+00000200  80 10 48 13 49 4d 13 7e  16 31 bb a3 01 d5 ac ab  |..H.IM.~.1......|
+00000210  6e 7b 30 19 06 03 55 1d  11 04 12 30 10 82 0e 65  |n{0...U....0...e|
+00000220  78 61 6d 70 6c 65 2e 67  6f 6c 61 6e 67 30 0d 06  |xample.golang0..|
+00000230  09 2a 86 48 86 f7 0d 01  01 0b 05 00 03 81 81 00  |.*.H............|
+00000240  9d 30 cc 40 2b 5b 50 a0  61 cb ba e5 53 58 e1 ed  |.0.@+[P.a...SX..|
+00000250  83 28 a9 58 1a a9 38 a4  95 a1 ac 31 5a 1a 84 66  |.(.X..8....1Z..f|
+00000260  3d 43 d3 2d d9 0b f2 97  df d3 20 64 38 92 24 3a  |=C.-...... d8.$:|
+00000270  00 bc cf 9c 7d b7 40 20  01 5f aa d3 16 61 09 a2  |....}.@ ._...a..|
+00000280  76 fd 13 c3 cc e1 0c 5c  ee b1 87 82 f1 6c 04 ed  |v......\.....l..|
+00000290  73 bb b3 43 77 8d 0c 1c  f1 0f a1 d8 40 83 61 c9  |s..Cw.......@.a.|
+000002a0  4c 72 2b 9d ae db 46 06  06 4d f4 c1 b3 3e c0 d1  |Lr+...F..M...>..|
+000002b0  bd 42 d4 db fe 3d 13 60  84 5c 21 d3 3b e9 fa e7  |.B...=.`.\!.;...|
+000002c0  16 03 02 00 aa 0c 00 00  a6 03 00 1d 20 46 15 e3  |............ F..|
+000002d0  8f f8 ab 26 88 9c 0f 28  30 d6 58 96 77 55 77 62  |...&...(0.X.wUwb|
+000002e0  26 a1 64 98 df b3 cc 15  48 fc 90 2b 30 00 80 7d  |&.d.....H..+0..}|
+000002f0  e3 98 42 4a 27 c1 08 29  93 22 0e 7e 53 4e b7 03  |..BJ'..).".~SN..|
+00000300  ca c1 67 34 0e 8d c0 94  cb dd 38 34 f4 d8 0e 10  |..g4......84....|
+00000310  68 bb e7 01 3e 4b 22 27  bb 43 e2 cf da e2 6c 49  |h...>K"'.C....lI|
+00000320  d7 31 2f 31 04 b2 7a 8f  86 35 5e f8 16 3f 80 b7  |.1/1..z..5^..?..|
+00000330  1e 06 e1 3e 57 89 24 d7  25 65 8b 13 84 27 b6 eb  |...>W.$.%e...'..|
+00000340  e9 64 bd 69 22 17 bc 53  57 2c 78 b3 1d 01 97 65  |.d.i"..SW,x....e|
+00000350  d9 0e b7 a7 bf d3 86 d3  a4 24 07 0f 16 0f fb 3a  |.........$.....:|
+00000360  e8 35 ce 80 79 93 2f 26  75 36 fa ad 99 d3 88 16  |.5..y./&u6......|
+00000370  03 02 00 04 0e 00 00 00                           |........|
 >>> Flow 3 (client to server)
 00000000  16 03 02 00 25 10 00 00  21 20 2f e5 7d a3 47 cd  |....%...! /.}.G.|
 00000010  62 43 15 28 da ac 5f bb  29 07 30 ff f6 84 af c4  |bC.(.._.).0.....|
 00000020  cf c2 ed 90 99 5f 58 cb  3b 74 14 03 02 00 01 01  |....._X.;t......|
 00000030  16 03 02 00 40 00 00 00  00 00 00 00 00 00 00 00  |....@...........|
-00000040  00 00 00 00 00 28 ab ed  77 d3 56 29 a8 4a 38 c8  |.....(..w.V).J8.|
-00000050  64 1c a5 d9 4e f9 6b 0e  fa 82 42 ad 0d be 15 69  |d...N.k...B....i|
-00000060  9a ff 79 64 db 8f 3e 16  b3 86 93 82 6f 78 c4 2e  |..yd..>.....ox..|
-00000070  7c 54 6c 4f 90                                    ||TlO.|
+00000040  00 00 00 00 00 89 35 3f  26 26 9c d0 87 70 65 56  |......5?&&...peV|
+00000050  b4 32 f9 9e 3f 1f 20 6f  8d 71 eb 6c 45 15 a0 f4  |.2..?. o.q.lE...|
+00000060  ff 02 60 8c 01 1a b7 2b  0d 1e 56 e7 be 06 ac 16  |..`....+..V.....|
+00000070  74 73 be 0a 95                                    |ts...|
 >>> Flow 4 (server to client)
-00000000  14 03 02 00 01 01 16 03  02 00 40 15 e9 c5 15 59  |..........@....Y|
-00000010  b3 0d 46 22 0c ae a6 41  02 b4 f3 da 11 dc 85 79  |..F"...A.......y|
-00000020  bb d9 3f 23 38 51 24 1a  08 b5 a0 63 dc 4b 86 50  |..?#8Q$....c.K.P|
-00000030  ef b2 32 07 fd b5 e1 01  06 19 42 ce ba 69 ab 1a  |..2.......B..i..|
-00000040  c9 bb db 7d d0 9f f9 7c  f2 6c 18                 |...}...|.l.|
+00000000  14 03 02 00 01 01 16 03  02 00 40 04 35 19 05 8e  |..........@.5...|
+00000010  c6 68 3e 37 75 5f 5d bb  41 58 8b a7 b3 cf 97 28  |.h>7u_].AX.....(|
+00000020  60 ad b7 be db b1 31 b9  9c f5 d2 57 49 17 7c f6  |`.....1....WI.|.|
+00000030  de 60 24 87 cb c5 51 2d  7a 8d f1 4b e5 7f 2d c7  |.`$...Q-z..K..-.|
+00000040  7f f4 e1 94 d9 6f 5c 2a  68 f0 24                 |.....o\*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 67 ef de  df a4 91 69 58 b8 3f 06  |.....g.....iX.?.|
-00000020  c4 05 4e ad 88 9b c5 12  35 cf 63 39 3a 61 e9 4c  |..N.....5.c9:a.L|
-00000030  49 22 93 f4 10 15 03 02  00 30 00 00 00 00 00 00  |I".......0......|
-00000040  00 00 00 00 00 00 00 00  00 00 00 2a 5a ba 39 7e  |...........*Z.9~|
-00000050  a8 be 2e 72 f3 ba 7e 0a  32 b5 8c d8 f5 1b 93 6c  |...r..~.2......l|
-00000060  3e 35 d8 ba cc f3 9f f4  19 74                    |>5.......t|
+00000010  00 00 00 00 00 a2 ba 70  25 b0 a9 b0 ea 87 7e 6b  |.......p%.....~k|
+00000020  ef 89 e3 10 f4 98 da 12  cf bc 20 f6 18 76 c7 ad  |.......... ..v..|
+00000030  b7 12 1e 7b 12 15 03 02  00 30 00 00 00 00 00 00  |...{.....0......|
+00000040  00 00 00 00 00 00 00 00  00 00 91 33 9b b8 76 89  |...........3..v.|
+00000050  39 ef 4b 3f d1 09 40 e4  68 6f 30 35 d9 a9 82 c1  |9.K?..@.ho05....|
+00000060  9d c6 c2 a5 dc cb 1d 43  83 0a                    |.......C..|
diff --git a/src/crypto/tls/testdata/Client-TLSv11-RSA-RC4 b/src/crypto/tls/testdata/Client-TLSv11-RSA-RC4
index aeba311..addd480 100644
--- a/src/crypto/tls/testdata/Client-TLSv11-RSA-RC4
+++ b/src/crypto/tls/testdata/Client-TLSv11-RSA-RC4
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fe 01 00 00  fa 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 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,59 +7,61 @@
 00000050  cc a8 c0 2b c0 2f c0 2c  c0 30 c0 09 c0 13 c0 0a  |...+./.,.0......|
 00000060  c0 14 00 9c 00 9d 00 2f  00 35 c0 12 00 0a c0 23  |......./.5.....#|
 00000070  c0 27 00 3c c0 07 c0 11  00 05 13 03 13 01 13 02  |.'.<............|
-00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
+00000080  01 00 00 7f 00 05 00 05  01 00 00 00 00 00 0a 00  |................|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
 000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
 000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
-000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
-000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
-000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
-000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
+000000c0  01 00 01 00 00 17 00 00  00 12 00 00 00 2b 00 09  |.............+..|
+000000d0  08 03 04 03 03 03 02 03  01 00 33 00 26 00 24 00  |..........3.&.$.|
+000000e0  1d 00 20 2f e5 7d a3 47  cd 62 43 15 28 da ac 5f  |.. /.}.G.bC.(.._|
+000000f0  bb 29 07 30 ff f6 84 af  c4 cf c2 ed 90 99 5f 58  |.).0.........._X|
+00000100  cb 3b 74                                          |.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 02 00 51 02 00 00  4d 03 02 82 5b 12 ac 33  |....Q...M...[..3|
-00000010  08 d4 28 8c 91 6e 52 c4  c6 09 13 24 bf 42 d2 37  |..(..nR....$.B.7|
-00000020  6d 78 60 b0 ea bd 9e b3  08 99 43 20 05 5a 93 f9  |mx`.......C .Z..|
-00000030  a4 39 43 4f c4 e3 27 20  7d 4c fa 7a 28 c1 c7 33  |.9CO..' }L.z(..3|
-00000040  72 fa 14 b8 ba c3 89 b0  a5 54 a3 7c 00 05 00 00  |r........T.|....|
-00000050  05 ff 01 00 01 00 16 03  02 02 59 0b 00 02 55 00  |..........Y...U.|
-00000060  02 52 00 02 4f 30 82 02  4b 30 82 01 b4 a0 03 02  |.R..O0..K0......|
-00000070  01 02 02 09 00 e8 f0 9d  3f e2 5b ea a6 30 0d 06  |........?.[..0..|
-00000080  09 2a 86 48 86 f7 0d 01  01 0b 05 00 30 1f 31 0b  |.*.H........0.1.|
-00000090  30 09 06 03 55 04 0a 13  02 47 6f 31 10 30 0e 06  |0...U....Go1.0..|
-000000a0  03 55 04 03 13 07 47 6f  20 52 6f 6f 74 30 1e 17  |.U....Go Root0..|
-000000b0  0d 31 36 30 31 30 31 30  30 30 30 30 30 5a 17 0d  |.160101000000Z..|
-000000c0  32 35 30 31 30 31 30 30  30 30 30 30 5a 30 1a 31  |250101000000Z0.1|
-000000d0  0b 30 09 06 03 55 04 0a  13 02 47 6f 31 0b 30 09  |.0...U....Go1.0.|
-000000e0  06 03 55 04 03 13 02 47  6f 30 81 9f 30 0d 06 09  |..U....Go0..0...|
-000000f0  2a 86 48 86 f7 0d 01 01  01 05 00 03 81 8d 00 30  |*.H............0|
-00000100  81 89 02 81 81 00 db 46  7d 93 2e 12 27 06 48 bc  |.......F}...'.H.|
-00000110  06 28 21 ab 7e c4 b6 a2  5d fe 1e 52 45 88 7a 36  |.(!.~...]..RE.z6|
-00000120  47 a5 08 0d 92 42 5b c2  81 c0 be 97 79 98 40 fb  |G....B[.....y.@.|
-00000130  4f 6d 14 fd 2b 13 8b c2  a5 2e 67 d8 d4 09 9e d6  |Om..+.....g.....|
-00000140  22 38 b7 4a 0b 74 73 2b  c2 34 f1 d1 93 e5 96 d9  |"8.J.ts+.4......|
-00000150  74 7b f3 58 9f 6c 61 3c  c0 b0 41 d4 d9 2b 2b 24  |t{.X.la<..A..++$|
-00000160  23 77 5b 1c 3b bd 75 5d  ce 20 54 cf a1 63 87 1d  |#w[.;.u]. T..c..|
-00000170  1e 24 c4 f3 1d 1a 50 8b  aa b6 14 43 ed 97 a7 75  |.$....P....C...u|
-00000180  62 f4 14 c8 52 d7 02 03  01 00 01 a3 81 93 30 81  |b...R.........0.|
-00000190  90 30 0e 06 03 55 1d 0f  01 01 ff 04 04 03 02 05  |.0...U..........|
-000001a0  a0 30 1d 06 03 55 1d 25  04 16 30 14 06 08 2b 06  |.0...U.%..0...+.|
-000001b0  01 05 05 07 03 01 06 08  2b 06 01 05 05 07 03 02  |........+.......|
-000001c0  30 0c 06 03 55 1d 13 01  01 ff 04 02 30 00 30 19  |0...U.......0.0.|
-000001d0  06 03 55 1d 0e 04 12 04  10 9f 91 16 1f 43 43 3e  |..U..........CC>|
-000001e0  49 a6 de 6d b6 80 d7 9f  60 30 1b 06 03 55 1d 23  |I..m....`0...U.#|
-000001f0  04 14 30 12 80 10 48 13  49 4d 13 7e 16 31 bb a3  |..0...H.IM.~.1..|
-00000200  01 d5 ac ab 6e 7b 30 19  06 03 55 1d 11 04 12 30  |....n{0...U....0|
-00000210  10 82 0e 65 78 61 6d 70  6c 65 2e 67 6f 6c 61 6e  |...example.golan|
-00000220  67 30 0d 06 09 2a 86 48  86 f7 0d 01 01 0b 05 00  |g0...*.H........|
-00000230  03 81 81 00 9d 30 cc 40  2b 5b 50 a0 61 cb ba e5  |.....0.@+[P.a...|
-00000240  53 58 e1 ed 83 28 a9 58  1a a9 38 a4 95 a1 ac 31  |SX...(.X..8....1|
-00000250  5a 1a 84 66 3d 43 d3 2d  d9 0b f2 97 df d3 20 64  |Z..f=C.-...... d|
-00000260  38 92 24 3a 00 bc cf 9c  7d b7 40 20 01 5f aa d3  |8.$:....}.@ ._..|
-00000270  16 61 09 a2 76 fd 13 c3  cc e1 0c 5c ee b1 87 82  |.a..v......\....|
-00000280  f1 6c 04 ed 73 bb b3 43  77 8d 0c 1c f1 0f a1 d8  |.l..s..Cw.......|
-00000290  40 83 61 c9 4c 72 2b 9d  ae db 46 06 06 4d f4 c1  |@.a.Lr+...F..M..|
-000002a0  b3 3e c0 d1 bd 42 d4 db  fe 3d 13 60 84 5c 21 d3  |.>...B...=.`.\!.|
-000002b0  3b e9 fa e7 16 03 02 00  04 0e 00 00 00           |;............|
+00000000  16 03 02 00 55 02 00 00  51 03 02 66 66 1b 2f 55  |....U...Q..ff./U|
+00000010  a4 db ad db 42 88 e0 12  12 36 60 41 32 ca 27 0f  |....B....6`A2.'.|
+00000020  36 22 d1 0b 4e 0e ba df  44 71 9f 20 7a fa f5 a7  |6"..N...Dq. z...|
+00000030  ba ca 0a 9a be c5 b7 a8  98 a7 d9 0f d8 24 d4 cf  |.............$..|
+00000040  ab f5 13 84 03 45 57 ab  89 6d 43 42 00 05 00 00  |.....EW..mCB....|
+00000050  09 ff 01 00 01 00 00 17  00 00 16 03 02 02 59 0b  |..............Y.|
+00000060  00 02 55 00 02 52 00 02  4f 30 82 02 4b 30 82 01  |..U..R..O0..K0..|
+00000070  b4 a0 03 02 01 02 02 09  00 e8 f0 9d 3f e2 5b ea  |............?.[.|
+00000080  a6 30 0d 06 09 2a 86 48  86 f7 0d 01 01 0b 05 00  |.0...*.H........|
+00000090  30 1f 31 0b 30 09 06 03  55 04 0a 13 02 47 6f 31  |0.1.0...U....Go1|
+000000a0  10 30 0e 06 03 55 04 03  13 07 47 6f 20 52 6f 6f  |.0...U....Go Roo|
+000000b0  74 30 1e 17 0d 31 36 30  31 30 31 30 30 30 30 30  |t0...16010100000|
+000000c0  30 5a 17 0d 32 35 30 31  30 31 30 30 30 30 30 30  |0Z..250101000000|
+000000d0  5a 30 1a 31 0b 30 09 06  03 55 04 0a 13 02 47 6f  |Z0.1.0...U....Go|
+000000e0  31 0b 30 09 06 03 55 04  03 13 02 47 6f 30 81 9f  |1.0...U....Go0..|
+000000f0  30 0d 06 09 2a 86 48 86  f7 0d 01 01 01 05 00 03  |0...*.H.........|
+00000100  81 8d 00 30 81 89 02 81  81 00 db 46 7d 93 2e 12  |...0.......F}...|
+00000110  27 06 48 bc 06 28 21 ab  7e c4 b6 a2 5d fe 1e 52  |'.H..(!.~...]..R|
+00000120  45 88 7a 36 47 a5 08 0d  92 42 5b c2 81 c0 be 97  |E.z6G....B[.....|
+00000130  79 98 40 fb 4f 6d 14 fd  2b 13 8b c2 a5 2e 67 d8  |y.@.Om..+.....g.|
+00000140  d4 09 9e d6 22 38 b7 4a  0b 74 73 2b c2 34 f1 d1  |...."8.J.ts+.4..|
+00000150  93 e5 96 d9 74 7b f3 58  9f 6c 61 3c c0 b0 41 d4  |....t{.X.la<..A.|
+00000160  d9 2b 2b 24 23 77 5b 1c  3b bd 75 5d ce 20 54 cf  |.++$#w[.;.u]. T.|
+00000170  a1 63 87 1d 1e 24 c4 f3  1d 1a 50 8b aa b6 14 43  |.c...$....P....C|
+00000180  ed 97 a7 75 62 f4 14 c8  52 d7 02 03 01 00 01 a3  |...ub...R.......|
+00000190  81 93 30 81 90 30 0e 06  03 55 1d 0f 01 01 ff 04  |..0..0...U......|
+000001a0  04 03 02 05 a0 30 1d 06  03 55 1d 25 04 16 30 14  |.....0...U.%..0.|
+000001b0  06 08 2b 06 01 05 05 07  03 01 06 08 2b 06 01 05  |..+.........+...|
+000001c0  05 07 03 02 30 0c 06 03  55 1d 13 01 01 ff 04 02  |....0...U.......|
+000001d0  30 00 30 19 06 03 55 1d  0e 04 12 04 10 9f 91 16  |0.0...U.........|
+000001e0  1f 43 43 3e 49 a6 de 6d  b6 80 d7 9f 60 30 1b 06  |.CC>I..m....`0..|
+000001f0  03 55 1d 23 04 14 30 12  80 10 48 13 49 4d 13 7e  |.U.#..0...H.IM.~|
+00000200  16 31 bb a3 01 d5 ac ab  6e 7b 30 19 06 03 55 1d  |.1......n{0...U.|
+00000210  11 04 12 30 10 82 0e 65  78 61 6d 70 6c 65 2e 67  |...0...example.g|
+00000220  6f 6c 61 6e 67 30 0d 06  09 2a 86 48 86 f7 0d 01  |olang0...*.H....|
+00000230  01 0b 05 00 03 81 81 00  9d 30 cc 40 2b 5b 50 a0  |.........0.@+[P.|
+00000240  61 cb ba e5 53 58 e1 ed  83 28 a9 58 1a a9 38 a4  |a...SX...(.X..8.|
+00000250  95 a1 ac 31 5a 1a 84 66  3d 43 d3 2d d9 0b f2 97  |...1Z..f=C.-....|
+00000260  df d3 20 64 38 92 24 3a  00 bc cf 9c 7d b7 40 20  |.. d8.$:....}.@ |
+00000270  01 5f aa d3 16 61 09 a2  76 fd 13 c3 cc e1 0c 5c  |._...a..v......\|
+00000280  ee b1 87 82 f1 6c 04 ed  73 bb b3 43 77 8d 0c 1c  |.....l..s..Cw...|
+00000290  f1 0f a1 d8 40 83 61 c9  4c 72 2b 9d ae db 46 06  |....@.a.Lr+...F.|
+000002a0  06 4d f4 c1 b3 3e c0 d1  bd 42 d4 db fe 3d 13 60  |.M...>...B...=.`|
+000002b0  84 5c 21 d3 3b e9 fa e7  16 03 02 00 04 0e 00 00  |.\!.;...........|
+000002c0  00                                                |.|
 >>> Flow 3 (client to server)
 00000000  16 03 02 00 86 10 00 00  82 00 80 b9 65 8d bf a7  |............e...|
 00000010  c8 4b 79 ce 6f cb 8b 13  1c ac b9 7d 66 5e e9 ba  |.Ky.o......}f^..|
@@ -70,15 +72,15 @@
 00000060  c5 70 0f 08 83 48 e9 48  ef 6e 50 8b 05 7e e5 84  |.p...H.H.nP..~..|
 00000070  25 fa 55 c7 ae 31 02 27  00 ef 3f 98 86 20 12 89  |%.U..1.'..?.. ..|
 00000080  91 59 28 b4 f7 d7 af d2  69 61 35 14 03 02 00 01  |.Y(.....ia5.....|
-00000090  01 16 03 02 00 24 e1 1a  bf e9 fd 4c fb 56 41 82  |.....$.....L.VA.|
-000000a0  c2 48 fc ca d9 d5 ec 2a  0a ee 63 25 e0 5f 53 cf  |.H.....*..c%._S.|
-000000b0  24 ff fe da 6f f5 8b 61  b7 b9                    |$...o..a..|
+00000090  01 16 03 02 00 24 a9 03  2f 22 ef b7 e8 78 38 a9  |.....$../"...x8.|
+000000a0  12 07 27 e3 bf 3b a9 50  5a 83 9c 6b 83 06 07 4d  |..'..;.PZ..k...M|
+000000b0  38 33 12 dc 21 aa 95 3c  f0 cc                    |83..!..<..|
 >>> Flow 4 (server to client)
-00000000  14 03 02 00 01 01 16 03  02 00 24 99 2c e7 fa d0  |..........$.,...|
-00000010  29 d9 92 07 39 56 b0 0c  ad 23 30 c8 d7 0b 38 da  |)...9V...#0...8.|
-00000020  6f d3 c7 f9 66 d2 ec 8c  52 85 cb db a6 22 50     |o...f...R...."P|
+00000000  14 03 02 00 01 01 16 03  02 00 24 df db 82 41 b6  |..........$...A.|
+00000010  3f 2d d5 0f d1 7e ca 3c  73 e0 31 58 ae f5 08 fd  |?-...~.<s.1X....|
+00000020  08 ef 3b cc 45 7b 21 74  ac c9 fc 07 22 6a 5e     |..;.E{!t...."j^|
 >>> Flow 5 (client to server)
-00000000  17 03 02 00 1a 9f 70 c4  77 f3 0a a8 e0 1a 75 87  |......p.w.....u.|
-00000010  ab 2a f1 23 52 79 9f 5c  8e af 5d ba 27 45 f9 15  |.*.#Ry.\..].'E..|
-00000020  03 02 00 16 f0 28 f3 71  a0 97 6b ba 7e 97 81 85  |.....(.q..k.~...|
-00000030  11 59 1b c9 fa a0 48 32  e9 65                    |.Y....H2.e|
+00000000  17 03 02 00 1a b6 12 91  b4 74 7f 92 b5 fd 7e 8c  |.........t....~.|
+00000010  15 1d 51 f9 e1 a3 d6 74  6e b2 07 c2 f0 a8 11 15  |..Q....tn.......|
+00000020  03 02 00 16 ca 4b cb cf  88 2d 48 a7 27 29 19 ef  |.....K...-H.')..|
+00000030  eb 4e 58 ac 57 e2 ed af  e2 a0                    |.NX.W.....|
diff --git a/src/crypto/tls/testdata/Client-TLSv12-AES128-GCM-SHA256 b/src/crypto/tls/testdata/Client-TLSv12-AES128-GCM-SHA256
index ce92872..22cff45 100644
--- a/src/crypto/tls/testdata/Client-TLSv12-AES128-GCM-SHA256
+++ b/src/crypto/tls/testdata/Client-TLSv12-AES128-GCM-SHA256
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fe 01 00 00  fa 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 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,59 +7,61 @@
 00000050  cc a8 c0 2b c0 2f c0 2c  c0 30 c0 09 c0 13 c0 0a  |...+./.,.0......|
 00000060  c0 14 00 9c 00 9d 00 2f  00 35 c0 12 00 0a c0 23  |......./.5.....#|
 00000070  c0 27 00 3c c0 07 c0 11  00 05 13 03 13 01 13 02  |.'.<............|
-00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
+00000080  01 00 00 7f 00 05 00 05  01 00 00 00 00 00 0a 00  |................|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
 000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
 000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
-000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
-000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
-000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
-000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
+000000c0  01 00 01 00 00 17 00 00  00 12 00 00 00 2b 00 09  |.............+..|
+000000d0  08 03 04 03 03 03 02 03  01 00 33 00 26 00 24 00  |..........3.&.$.|
+000000e0  1d 00 20 2f e5 7d a3 47  cd 62 43 15 28 da ac 5f  |.. /.}.G.bC.(.._|
+000000f0  bb 29 07 30 ff f6 84 af  c4 cf c2 ed 90 99 5f 58  |.).0.........._X|
+00000100  cb 3b 74                                          |.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 51 02 00 00  4d 03 03 a4 26 bb e9 70  |....Q...M...&..p|
-00000010  57 4e ec f8 ea 23 01 75  c3 f3 a9 d4 d6 e8 71 2b  |WN...#.u......q+|
-00000020  01 5e c0 73 19 2b b9 d8  8e 3e d1 20 c8 c3 0a 22  |.^.s.+...>. ..."|
-00000030  7b ee cd 2e c9 e8 95 db  90 db 70 f5 59 e6 90 65  |{.........p.Y..e|
-00000040  35 87 a6 d4 bb dd 85 34  43 e8 66 49 00 9c 00 00  |5......4C.fI....|
-00000050  05 ff 01 00 01 00 16 03  03 02 59 0b 00 02 55 00  |..........Y...U.|
-00000060  02 52 00 02 4f 30 82 02  4b 30 82 01 b4 a0 03 02  |.R..O0..K0......|
-00000070  01 02 02 09 00 e8 f0 9d  3f e2 5b ea a6 30 0d 06  |........?.[..0..|
-00000080  09 2a 86 48 86 f7 0d 01  01 0b 05 00 30 1f 31 0b  |.*.H........0.1.|
-00000090  30 09 06 03 55 04 0a 13  02 47 6f 31 10 30 0e 06  |0...U....Go1.0..|
-000000a0  03 55 04 03 13 07 47 6f  20 52 6f 6f 74 30 1e 17  |.U....Go Root0..|
-000000b0  0d 31 36 30 31 30 31 30  30 30 30 30 30 5a 17 0d  |.160101000000Z..|
-000000c0  32 35 30 31 30 31 30 30  30 30 30 30 5a 30 1a 31  |250101000000Z0.1|
-000000d0  0b 30 09 06 03 55 04 0a  13 02 47 6f 31 0b 30 09  |.0...U....Go1.0.|
-000000e0  06 03 55 04 03 13 02 47  6f 30 81 9f 30 0d 06 09  |..U....Go0..0...|
-000000f0  2a 86 48 86 f7 0d 01 01  01 05 00 03 81 8d 00 30  |*.H............0|
-00000100  81 89 02 81 81 00 db 46  7d 93 2e 12 27 06 48 bc  |.......F}...'.H.|
-00000110  06 28 21 ab 7e c4 b6 a2  5d fe 1e 52 45 88 7a 36  |.(!.~...]..RE.z6|
-00000120  47 a5 08 0d 92 42 5b c2  81 c0 be 97 79 98 40 fb  |G....B[.....y.@.|
-00000130  4f 6d 14 fd 2b 13 8b c2  a5 2e 67 d8 d4 09 9e d6  |Om..+.....g.....|
-00000140  22 38 b7 4a 0b 74 73 2b  c2 34 f1 d1 93 e5 96 d9  |"8.J.ts+.4......|
-00000150  74 7b f3 58 9f 6c 61 3c  c0 b0 41 d4 d9 2b 2b 24  |t{.X.la<..A..++$|
-00000160  23 77 5b 1c 3b bd 75 5d  ce 20 54 cf a1 63 87 1d  |#w[.;.u]. T..c..|
-00000170  1e 24 c4 f3 1d 1a 50 8b  aa b6 14 43 ed 97 a7 75  |.$....P....C...u|
-00000180  62 f4 14 c8 52 d7 02 03  01 00 01 a3 81 93 30 81  |b...R.........0.|
-00000190  90 30 0e 06 03 55 1d 0f  01 01 ff 04 04 03 02 05  |.0...U..........|
-000001a0  a0 30 1d 06 03 55 1d 25  04 16 30 14 06 08 2b 06  |.0...U.%..0...+.|
-000001b0  01 05 05 07 03 01 06 08  2b 06 01 05 05 07 03 02  |........+.......|
-000001c0  30 0c 06 03 55 1d 13 01  01 ff 04 02 30 00 30 19  |0...U.......0.0.|
-000001d0  06 03 55 1d 0e 04 12 04  10 9f 91 16 1f 43 43 3e  |..U..........CC>|
-000001e0  49 a6 de 6d b6 80 d7 9f  60 30 1b 06 03 55 1d 23  |I..m....`0...U.#|
-000001f0  04 14 30 12 80 10 48 13  49 4d 13 7e 16 31 bb a3  |..0...H.IM.~.1..|
-00000200  01 d5 ac ab 6e 7b 30 19  06 03 55 1d 11 04 12 30  |....n{0...U....0|
-00000210  10 82 0e 65 78 61 6d 70  6c 65 2e 67 6f 6c 61 6e  |...example.golan|
-00000220  67 30 0d 06 09 2a 86 48  86 f7 0d 01 01 0b 05 00  |g0...*.H........|
-00000230  03 81 81 00 9d 30 cc 40  2b 5b 50 a0 61 cb ba e5  |.....0.@+[P.a...|
-00000240  53 58 e1 ed 83 28 a9 58  1a a9 38 a4 95 a1 ac 31  |SX...(.X..8....1|
-00000250  5a 1a 84 66 3d 43 d3 2d  d9 0b f2 97 df d3 20 64  |Z..f=C.-...... d|
-00000260  38 92 24 3a 00 bc cf 9c  7d b7 40 20 01 5f aa d3  |8.$:....}.@ ._..|
-00000270  16 61 09 a2 76 fd 13 c3  cc e1 0c 5c ee b1 87 82  |.a..v......\....|
-00000280  f1 6c 04 ed 73 bb b3 43  77 8d 0c 1c f1 0f a1 d8  |.l..s..Cw.......|
-00000290  40 83 61 c9 4c 72 2b 9d  ae db 46 06 06 4d f4 c1  |@.a.Lr+...F..M..|
-000002a0  b3 3e c0 d1 bd 42 d4 db  fe 3d 13 60 84 5c 21 d3  |.>...B...=.`.\!.|
-000002b0  3b e9 fa e7 16 03 03 00  04 0e 00 00 00           |;............|
+00000000  16 03 03 00 55 02 00 00  51 03 03 9f d7 f5 00 f6  |....U...Q.......|
+00000010  a1 c5 37 e8 2b 2e 66 42  54 c6 67 29 b6 ad bb 5f  |..7.+.fBT.g)..._|
+00000020  23 b7 bb 56 2e 8a 15 a9  7a ce a2 20 47 be 36 13  |#..V....z.. G.6.|
+00000030  31 d7 51 a6 ec d1 67 e7  e3 8c fb e2 f5 d2 61 e6  |1.Q...g.......a.|
+00000040  4e 11 0c 03 b0 5e b1 ae  e7 8c 61 c8 00 9c 00 00  |N....^....a.....|
+00000050  09 ff 01 00 01 00 00 17  00 00 16 03 03 02 59 0b  |..............Y.|
+00000060  00 02 55 00 02 52 00 02  4f 30 82 02 4b 30 82 01  |..U..R..O0..K0..|
+00000070  b4 a0 03 02 01 02 02 09  00 e8 f0 9d 3f e2 5b ea  |............?.[.|
+00000080  a6 30 0d 06 09 2a 86 48  86 f7 0d 01 01 0b 05 00  |.0...*.H........|
+00000090  30 1f 31 0b 30 09 06 03  55 04 0a 13 02 47 6f 31  |0.1.0...U....Go1|
+000000a0  10 30 0e 06 03 55 04 03  13 07 47 6f 20 52 6f 6f  |.0...U....Go Roo|
+000000b0  74 30 1e 17 0d 31 36 30  31 30 31 30 30 30 30 30  |t0...16010100000|
+000000c0  30 5a 17 0d 32 35 30 31  30 31 30 30 30 30 30 30  |0Z..250101000000|
+000000d0  5a 30 1a 31 0b 30 09 06  03 55 04 0a 13 02 47 6f  |Z0.1.0...U....Go|
+000000e0  31 0b 30 09 06 03 55 04  03 13 02 47 6f 30 81 9f  |1.0...U....Go0..|
+000000f0  30 0d 06 09 2a 86 48 86  f7 0d 01 01 01 05 00 03  |0...*.H.........|
+00000100  81 8d 00 30 81 89 02 81  81 00 db 46 7d 93 2e 12  |...0.......F}...|
+00000110  27 06 48 bc 06 28 21 ab  7e c4 b6 a2 5d fe 1e 52  |'.H..(!.~...]..R|
+00000120  45 88 7a 36 47 a5 08 0d  92 42 5b c2 81 c0 be 97  |E.z6G....B[.....|
+00000130  79 98 40 fb 4f 6d 14 fd  2b 13 8b c2 a5 2e 67 d8  |y.@.Om..+.....g.|
+00000140  d4 09 9e d6 22 38 b7 4a  0b 74 73 2b c2 34 f1 d1  |...."8.J.ts+.4..|
+00000150  93 e5 96 d9 74 7b f3 58  9f 6c 61 3c c0 b0 41 d4  |....t{.X.la<..A.|
+00000160  d9 2b 2b 24 23 77 5b 1c  3b bd 75 5d ce 20 54 cf  |.++$#w[.;.u]. T.|
+00000170  a1 63 87 1d 1e 24 c4 f3  1d 1a 50 8b aa b6 14 43  |.c...$....P....C|
+00000180  ed 97 a7 75 62 f4 14 c8  52 d7 02 03 01 00 01 a3  |...ub...R.......|
+00000190  81 93 30 81 90 30 0e 06  03 55 1d 0f 01 01 ff 04  |..0..0...U......|
+000001a0  04 03 02 05 a0 30 1d 06  03 55 1d 25 04 16 30 14  |.....0...U.%..0.|
+000001b0  06 08 2b 06 01 05 05 07  03 01 06 08 2b 06 01 05  |..+.........+...|
+000001c0  05 07 03 02 30 0c 06 03  55 1d 13 01 01 ff 04 02  |....0...U.......|
+000001d0  30 00 30 19 06 03 55 1d  0e 04 12 04 10 9f 91 16  |0.0...U.........|
+000001e0  1f 43 43 3e 49 a6 de 6d  b6 80 d7 9f 60 30 1b 06  |.CC>I..m....`0..|
+000001f0  03 55 1d 23 04 14 30 12  80 10 48 13 49 4d 13 7e  |.U.#..0...H.IM.~|
+00000200  16 31 bb a3 01 d5 ac ab  6e 7b 30 19 06 03 55 1d  |.1......n{0...U.|
+00000210  11 04 12 30 10 82 0e 65  78 61 6d 70 6c 65 2e 67  |...0...example.g|
+00000220  6f 6c 61 6e 67 30 0d 06  09 2a 86 48 86 f7 0d 01  |olang0...*.H....|
+00000230  01 0b 05 00 03 81 81 00  9d 30 cc 40 2b 5b 50 a0  |.........0.@+[P.|
+00000240  61 cb ba e5 53 58 e1 ed  83 28 a9 58 1a a9 38 a4  |a...SX...(.X..8.|
+00000250  95 a1 ac 31 5a 1a 84 66  3d 43 d3 2d d9 0b f2 97  |...1Z..f=C.-....|
+00000260  df d3 20 64 38 92 24 3a  00 bc cf 9c 7d b7 40 20  |.. d8.$:....}.@ |
+00000270  01 5f aa d3 16 61 09 a2  76 fd 13 c3 cc e1 0c 5c  |._...a..v......\|
+00000280  ee b1 87 82 f1 6c 04 ed  73 bb b3 43 77 8d 0c 1c  |.....l..s..Cw...|
+00000290  f1 0f a1 d8 40 83 61 c9  4c 72 2b 9d ae db 46 06  |....@.a.Lr+...F.|
+000002a0  06 4d f4 c1 b3 3e c0 d1  bd 42 d4 db fe 3d 13 60  |.M...>...B...=.`|
+000002b0  84 5c 21 d3 3b e9 fa e7  16 03 03 00 04 0e 00 00  |.\!.;...........|
+000002c0  00                                                |.|
 >>> Flow 3 (client to server)
 00000000  16 03 03 00 86 10 00 00  82 00 80 b9 65 8d bf a7  |............e...|
 00000010  c8 4b 79 ce 6f cb 8b 13  1c ac b9 7d 66 5e e9 ba  |.Ky.o......}f^..|
@@ -70,17 +72,17 @@
 00000060  c5 70 0f 08 83 48 e9 48  ef 6e 50 8b 05 7e e5 84  |.p...H.H.nP..~..|
 00000070  25 fa 55 c7 ae 31 02 27  00 ef 3f 98 86 20 12 89  |%.U..1.'..?.. ..|
 00000080  91 59 28 b4 f7 d7 af d2  69 61 35 14 03 03 00 01  |.Y(.....ia5.....|
-00000090  01 16 03 03 00 28 00 00  00 00 00 00 00 00 64 6c  |.....(........dl|
-000000a0  08 78 1d 03 0c ed dd 01  30 d4 fb 7c 3f 24 45 cc  |.x......0..|?$E.|
-000000b0  f6 b2 e3 42 07 93 8f 34  a8 21 d1 b0 08 e3        |...B...4.!....|
+00000090  01 16 03 03 00 28 00 00  00 00 00 00 00 00 10 d7  |.....(..........|
+000000a0  17 1b 75 0d 79 ed 8d bc  fb 1c c4 d6 35 44 f0 ed  |..u.y.......5D..|
+000000b0  ed 03 24 02 df 44 9b 70  df 4b 51 19 e6 72        |..$..D.p.KQ..r|
 >>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 28 75 9b 91 cd 7d  |..........(u...}|
-00000010  8d f7 3c a0 d6 5e d4 f2  24 1a 0a f3 04 b1 d9 0b  |..<..^..$.......|
-00000020  1d 31 ca 1c 8b e7 38 c0  8e 7d 12 19 89 33 28 4d  |.1....8..}...3(M|
-00000030  83 28 b6                                          |.(.|
+00000000  14 03 03 00 01 01 16 03  03 00 28 68 9f 7c f3 ac  |..........(h.|..|
+00000010  31 93 86 d0 b7 0a 68 55  7a 93 00 4e c3 d6 dc 60  |1.....hUz..N...`|
+00000020  d1 c5 4a 04 53 da 27 ed  c1 0e 14 41 a5 27 f1 d5  |..J.S.'....A.'..|
+00000030  2e 4a 43                                          |.JC|
 >>> Flow 5 (client to server)
-00000000  17 03 03 00 1e 00 00 00  00 00 00 00 01 7d fe 53  |.............}.S|
-00000010  73 aa ca 3d f3 27 b7 01  56 9e e7 c9 6d 79 2a 97  |s..=.'..V...my*.|
-00000020  b2 21 42 15 03 03 00 1a  00 00 00 00 00 00 00 02  |.!B.............|
-00000030  de bd 3e 9e 8f c0 98 ec  bd b4 9b 89 90 a2 26 a8  |..>...........&.|
-00000040  28 97                                             |(.|
+00000000  17 03 03 00 1e 00 00 00  00 00 00 00 01 e7 e6 3e  |...............>|
+00000010  e9 04 96 38 0c d4 e1 46  c6 d2 2a 1b b0 b3 11 9b  |...8...F..*.....|
+00000020  6d f4 81 15 03 03 00 1a  00 00 00 00 00 00 00 02  |m...............|
+00000030  a3 60 58 f2 f6 60 95 f3  c4 e1 95 23 22 52 55 63  |.`X..`.....#"RUc|
+00000040  b9 75                                             |.u|
diff --git a/src/crypto/tls/testdata/Client-TLSv12-AES128-SHA256 b/src/crypto/tls/testdata/Client-TLSv12-AES128-SHA256
index 15394c7..ee6ab62 100644
--- a/src/crypto/tls/testdata/Client-TLSv12-AES128-SHA256
+++ b/src/crypto/tls/testdata/Client-TLSv12-AES128-SHA256
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fe 01 00 00  fa 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 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,59 +7,61 @@
 00000050  cc a8 c0 2b c0 2f c0 2c  c0 30 c0 09 c0 13 c0 0a  |...+./.,.0......|
 00000060  c0 14 00 9c 00 9d 00 2f  00 35 c0 12 00 0a c0 23  |......./.5.....#|
 00000070  c0 27 00 3c c0 07 c0 11  00 05 13 03 13 01 13 02  |.'.<............|
-00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
+00000080  01 00 00 7f 00 05 00 05  01 00 00 00 00 00 0a 00  |................|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
 000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
 000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
-000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
-000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
-000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
-000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
+000000c0  01 00 01 00 00 17 00 00  00 12 00 00 00 2b 00 09  |.............+..|
+000000d0  08 03 04 03 03 03 02 03  01 00 33 00 26 00 24 00  |..........3.&.$.|
+000000e0  1d 00 20 2f e5 7d a3 47  cd 62 43 15 28 da ac 5f  |.. /.}.G.bC.(.._|
+000000f0  bb 29 07 30 ff f6 84 af  c4 cf c2 ed 90 99 5f 58  |.).0.........._X|
+00000100  cb 3b 74                                          |.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 51 02 00 00  4d 03 03 8a a8 2c 00 d8  |....Q...M....,..|
-00000010  d8 87 53 14 1e 7b ff ca  19 a2 6d bc 47 6f 73 12  |..S..{....m.Gos.|
-00000020  0d 54 6e 33 21 80 01 86  f8 81 9f 20 46 f6 8c e8  |.Tn3!...... F...|
-00000030  8b 90 02 b2 da e2 83 3a  2a 0f b3 f7 96 2b f8 96  |.......:*....+..|
-00000040  56 77 39 52 9e a1 bd 74  1e 2e b1 b0 00 3c 00 00  |Vw9R...t.....<..|
-00000050  05 ff 01 00 01 00 16 03  03 02 59 0b 00 02 55 00  |..........Y...U.|
-00000060  02 52 00 02 4f 30 82 02  4b 30 82 01 b4 a0 03 02  |.R..O0..K0......|
-00000070  01 02 02 09 00 e8 f0 9d  3f e2 5b ea a6 30 0d 06  |........?.[..0..|
-00000080  09 2a 86 48 86 f7 0d 01  01 0b 05 00 30 1f 31 0b  |.*.H........0.1.|
-00000090  30 09 06 03 55 04 0a 13  02 47 6f 31 10 30 0e 06  |0...U....Go1.0..|
-000000a0  03 55 04 03 13 07 47 6f  20 52 6f 6f 74 30 1e 17  |.U....Go Root0..|
-000000b0  0d 31 36 30 31 30 31 30  30 30 30 30 30 5a 17 0d  |.160101000000Z..|
-000000c0  32 35 30 31 30 31 30 30  30 30 30 30 5a 30 1a 31  |250101000000Z0.1|
-000000d0  0b 30 09 06 03 55 04 0a  13 02 47 6f 31 0b 30 09  |.0...U....Go1.0.|
-000000e0  06 03 55 04 03 13 02 47  6f 30 81 9f 30 0d 06 09  |..U....Go0..0...|
-000000f0  2a 86 48 86 f7 0d 01 01  01 05 00 03 81 8d 00 30  |*.H............0|
-00000100  81 89 02 81 81 00 db 46  7d 93 2e 12 27 06 48 bc  |.......F}...'.H.|
-00000110  06 28 21 ab 7e c4 b6 a2  5d fe 1e 52 45 88 7a 36  |.(!.~...]..RE.z6|
-00000120  47 a5 08 0d 92 42 5b c2  81 c0 be 97 79 98 40 fb  |G....B[.....y.@.|
-00000130  4f 6d 14 fd 2b 13 8b c2  a5 2e 67 d8 d4 09 9e d6  |Om..+.....g.....|
-00000140  22 38 b7 4a 0b 74 73 2b  c2 34 f1 d1 93 e5 96 d9  |"8.J.ts+.4......|
-00000150  74 7b f3 58 9f 6c 61 3c  c0 b0 41 d4 d9 2b 2b 24  |t{.X.la<..A..++$|
-00000160  23 77 5b 1c 3b bd 75 5d  ce 20 54 cf a1 63 87 1d  |#w[.;.u]. T..c..|
-00000170  1e 24 c4 f3 1d 1a 50 8b  aa b6 14 43 ed 97 a7 75  |.$....P....C...u|
-00000180  62 f4 14 c8 52 d7 02 03  01 00 01 a3 81 93 30 81  |b...R.........0.|
-00000190  90 30 0e 06 03 55 1d 0f  01 01 ff 04 04 03 02 05  |.0...U..........|
-000001a0  a0 30 1d 06 03 55 1d 25  04 16 30 14 06 08 2b 06  |.0...U.%..0...+.|
-000001b0  01 05 05 07 03 01 06 08  2b 06 01 05 05 07 03 02  |........+.......|
-000001c0  30 0c 06 03 55 1d 13 01  01 ff 04 02 30 00 30 19  |0...U.......0.0.|
-000001d0  06 03 55 1d 0e 04 12 04  10 9f 91 16 1f 43 43 3e  |..U..........CC>|
-000001e0  49 a6 de 6d b6 80 d7 9f  60 30 1b 06 03 55 1d 23  |I..m....`0...U.#|
-000001f0  04 14 30 12 80 10 48 13  49 4d 13 7e 16 31 bb a3  |..0...H.IM.~.1..|
-00000200  01 d5 ac ab 6e 7b 30 19  06 03 55 1d 11 04 12 30  |....n{0...U....0|
-00000210  10 82 0e 65 78 61 6d 70  6c 65 2e 67 6f 6c 61 6e  |...example.golan|
-00000220  67 30 0d 06 09 2a 86 48  86 f7 0d 01 01 0b 05 00  |g0...*.H........|
-00000230  03 81 81 00 9d 30 cc 40  2b 5b 50 a0 61 cb ba e5  |.....0.@+[P.a...|
-00000240  53 58 e1 ed 83 28 a9 58  1a a9 38 a4 95 a1 ac 31  |SX...(.X..8....1|
-00000250  5a 1a 84 66 3d 43 d3 2d  d9 0b f2 97 df d3 20 64  |Z..f=C.-...... d|
-00000260  38 92 24 3a 00 bc cf 9c  7d b7 40 20 01 5f aa d3  |8.$:....}.@ ._..|
-00000270  16 61 09 a2 76 fd 13 c3  cc e1 0c 5c ee b1 87 82  |.a..v......\....|
-00000280  f1 6c 04 ed 73 bb b3 43  77 8d 0c 1c f1 0f a1 d8  |.l..s..Cw.......|
-00000290  40 83 61 c9 4c 72 2b 9d  ae db 46 06 06 4d f4 c1  |@.a.Lr+...F..M..|
-000002a0  b3 3e c0 d1 bd 42 d4 db  fe 3d 13 60 84 5c 21 d3  |.>...B...=.`.\!.|
-000002b0  3b e9 fa e7 16 03 03 00  04 0e 00 00 00           |;............|
+00000000  16 03 03 00 55 02 00 00  51 03 03 b3 4d 83 66 45  |....U...Q...M.fE|
+00000010  e7 32 1f e5 99 ea a0 90  c7 12 91 2b 25 82 ba ca  |.2.........+%...|
+00000020  01 c1 a9 22 1f 1d 06 62  e1 37 6a 20 a4 87 9b c0  |..."...b.7j ....|
+00000030  7f 86 ff c1 0f 49 56 fe  c4 49 f7 fb e5 97 23 dc  |.....IV..I....#.|
+00000040  fc 51 80 75 f7 03 52 5e  86 80 97 0f 00 3c 00 00  |.Q.u..R^.....<..|
+00000050  09 ff 01 00 01 00 00 17  00 00 16 03 03 02 59 0b  |..............Y.|
+00000060  00 02 55 00 02 52 00 02  4f 30 82 02 4b 30 82 01  |..U..R..O0..K0..|
+00000070  b4 a0 03 02 01 02 02 09  00 e8 f0 9d 3f e2 5b ea  |............?.[.|
+00000080  a6 30 0d 06 09 2a 86 48  86 f7 0d 01 01 0b 05 00  |.0...*.H........|
+00000090  30 1f 31 0b 30 09 06 03  55 04 0a 13 02 47 6f 31  |0.1.0...U....Go1|
+000000a0  10 30 0e 06 03 55 04 03  13 07 47 6f 20 52 6f 6f  |.0...U....Go Roo|
+000000b0  74 30 1e 17 0d 31 36 30  31 30 31 30 30 30 30 30  |t0...16010100000|
+000000c0  30 5a 17 0d 32 35 30 31  30 31 30 30 30 30 30 30  |0Z..250101000000|
+000000d0  5a 30 1a 31 0b 30 09 06  03 55 04 0a 13 02 47 6f  |Z0.1.0...U....Go|
+000000e0  31 0b 30 09 06 03 55 04  03 13 02 47 6f 30 81 9f  |1.0...U....Go0..|
+000000f0  30 0d 06 09 2a 86 48 86  f7 0d 01 01 01 05 00 03  |0...*.H.........|
+00000100  81 8d 00 30 81 89 02 81  81 00 db 46 7d 93 2e 12  |...0.......F}...|
+00000110  27 06 48 bc 06 28 21 ab  7e c4 b6 a2 5d fe 1e 52  |'.H..(!.~...]..R|
+00000120  45 88 7a 36 47 a5 08 0d  92 42 5b c2 81 c0 be 97  |E.z6G....B[.....|
+00000130  79 98 40 fb 4f 6d 14 fd  2b 13 8b c2 a5 2e 67 d8  |y.@.Om..+.....g.|
+00000140  d4 09 9e d6 22 38 b7 4a  0b 74 73 2b c2 34 f1 d1  |...."8.J.ts+.4..|
+00000150  93 e5 96 d9 74 7b f3 58  9f 6c 61 3c c0 b0 41 d4  |....t{.X.la<..A.|
+00000160  d9 2b 2b 24 23 77 5b 1c  3b bd 75 5d ce 20 54 cf  |.++$#w[.;.u]. T.|
+00000170  a1 63 87 1d 1e 24 c4 f3  1d 1a 50 8b aa b6 14 43  |.c...$....P....C|
+00000180  ed 97 a7 75 62 f4 14 c8  52 d7 02 03 01 00 01 a3  |...ub...R.......|
+00000190  81 93 30 81 90 30 0e 06  03 55 1d 0f 01 01 ff 04  |..0..0...U......|
+000001a0  04 03 02 05 a0 30 1d 06  03 55 1d 25 04 16 30 14  |.....0...U.%..0.|
+000001b0  06 08 2b 06 01 05 05 07  03 01 06 08 2b 06 01 05  |..+.........+...|
+000001c0  05 07 03 02 30 0c 06 03  55 1d 13 01 01 ff 04 02  |....0...U.......|
+000001d0  30 00 30 19 06 03 55 1d  0e 04 12 04 10 9f 91 16  |0.0...U.........|
+000001e0  1f 43 43 3e 49 a6 de 6d  b6 80 d7 9f 60 30 1b 06  |.CC>I..m....`0..|
+000001f0  03 55 1d 23 04 14 30 12  80 10 48 13 49 4d 13 7e  |.U.#..0...H.IM.~|
+00000200  16 31 bb a3 01 d5 ac ab  6e 7b 30 19 06 03 55 1d  |.1......n{0...U.|
+00000210  11 04 12 30 10 82 0e 65  78 61 6d 70 6c 65 2e 67  |...0...example.g|
+00000220  6f 6c 61 6e 67 30 0d 06  09 2a 86 48 86 f7 0d 01  |olang0...*.H....|
+00000230  01 0b 05 00 03 81 81 00  9d 30 cc 40 2b 5b 50 a0  |.........0.@+[P.|
+00000240  61 cb ba e5 53 58 e1 ed  83 28 a9 58 1a a9 38 a4  |a...SX...(.X..8.|
+00000250  95 a1 ac 31 5a 1a 84 66  3d 43 d3 2d d9 0b f2 97  |...1Z..f=C.-....|
+00000260  df d3 20 64 38 92 24 3a  00 bc cf 9c 7d b7 40 20  |.. d8.$:....}.@ |
+00000270  01 5f aa d3 16 61 09 a2  76 fd 13 c3 cc e1 0c 5c  |._...a..v......\|
+00000280  ee b1 87 82 f1 6c 04 ed  73 bb b3 43 77 8d 0c 1c  |.....l..s..Cw...|
+00000290  f1 0f a1 d8 40 83 61 c9  4c 72 2b 9d ae db 46 06  |....@.a.Lr+...F.|
+000002a0  06 4d f4 c1 b3 3e c0 d1  bd 42 d4 db fe 3d 13 60  |.M...>...B...=.`|
+000002b0  84 5c 21 d3 3b e9 fa e7  16 03 03 00 04 0e 00 00  |.\!.;...........|
+000002c0  00                                                |.|
 >>> Flow 3 (client to server)
 00000000  16 03 03 00 86 10 00 00  82 00 80 b9 65 8d bf a7  |............e...|
 00000010  c8 4b 79 ce 6f cb 8b 13  1c ac b9 7d 66 5e e9 ba  |.Ky.o......}f^..|
@@ -71,25 +73,25 @@
 00000070  25 fa 55 c7 ae 31 02 27  00 ef 3f 98 86 20 12 89  |%.U..1.'..?.. ..|
 00000080  91 59 28 b4 f7 d7 af d2  69 61 35 14 03 03 00 01  |.Y(.....ia5.....|
 00000090  01 16 03 03 00 50 00 00  00 00 00 00 00 00 00 00  |.....P..........|
-000000a0  00 00 00 00 00 00 8f d8  ac 7f ec 16 9e d8 e9 f2  |................|
-000000b0  ce 30 51 dc 87 e0 f9 80  57 66 d9 87 20 77 3a b1  |.0Q.....Wf.. w:.|
-000000c0  43 db fc 36 f5 64 6e 96  e9 b8 e2 ab bb 00 48 36  |C..6.dn.......H6|
-000000d0  60 9c 5a 7c 38 3f 13 e1  9c ef d9 15 96 91 56 e2  |`.Z|8?........V.|
-000000e0  87 2e 23 1a 98 40                                 |..#..@|
+000000a0  00 00 00 00 00 00 ad 28  77 9e 77 a8 54 2d df fe  |.......(w.w.T-..|
+000000b0  b3 d1 3a 88 49 e8 ee 86  a1 46 d8 46 26 98 88 f3  |..:.I....F.F&...|
+000000c0  eb e1 bd 26 38 26 78 53  90 47 bf 76 4b 29 a6 db  |...&8&xS.G.vK)..|
+000000d0  e5 c5 5d aa e7 cc d1 ad  ee 3f 27 72 a3 a7 06 8b  |..]......?'r....|
+000000e0  1a da 35 1a 57 4a                                 |..5.WJ|
 >>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 50 80 01 08 cc d8  |..........P.....|
-00000010  08 a8 81 20 b2 bb 5b 50  79 74 4a b5 10 c4 7a 30  |... ..[PytJ...z0|
-00000020  6c 46 d6 e5 36 6e 4d cc  e5 0c 2c ab 3b de 92 45  |lF..6nM...,.;..E|
-00000030  ee 20 58 a9 0f 03 26 3e  6c 05 a7 ef f2 7c a7 9b  |. X...&>l....|..|
-00000040  57 c0 20 8d d0 69 0e b0  5a cc e6 26 5f e2 c3 24  |W. ..i..Z..&_..$|
-00000050  c4 db df 20 03 08 e1 aa  59 2b d2                 |... ....Y+.|
+00000000  14 03 03 00 01 01 16 03  03 00 50 b6 40 f7 ea 59  |..........P.@..Y|
+00000010  29 60 1f b0 00 78 db 1b  29 4e 4f 7d 02 12 a9 f9  |)`...x..)NO}....|
+00000020  98 fb 89 9e 08 8d 55 91  f3 d1 b3 58 73 ba 58 12  |......U....Xs.X.|
+00000030  2e b3 3a da 3a 96 76 63  5c 89 7b d5 64 9a 41 3f  |..:.:.vc\.{.d.A?|
+00000040  f9 55 4c 19 d7 08 a1 b2  c4 cc f0 6a e3 7d ab 6b  |.UL........j.}.k|
+00000050  26 cf 80 10 a9 c6 1a d6  2d 0e 77                 |&.......-.w|
 >>> Flow 5 (client to server)
 00000000  17 03 03 00 40 00 00 00  00 00 00 00 00 00 00 00  |....@...........|
-00000010  00 00 00 00 00 a2 dd a6  ff 57 60 80 dd 97 cf 20  |.........W`.... |
-00000020  10 04 60 80 53 17 37 ce  ce 39 b6 21 f4 06 61 aa  |..`.S.7..9.!..a.|
-00000030  49 7b f0 d5 e0 72 4c 6f  38 d2 ab af 1c 94 bd 5b  |I{...rLo8......[|
-00000040  1b ee 8a 9b e3 15 03 03  00 40 00 00 00 00 00 00  |.........@......|
-00000050  00 00 00 00 00 00 00 00  00 00 ba 18 32 e7 6d f5  |............2.m.|
-00000060  fa 2e 61 55 cc fe 3c 4d  19 fd 84 6d c4 2a 46 92  |..aU..<M...m.*F.|
-00000070  ae b7 f3 67 c8 3c ce cd  b0 66 de ee 5d 3f 07 3b  |...g.<...f..]?.;|
-00000080  a9 85 a1 93 1f 98 f7 95  c9 ac                    |..........|
+00000010  00 00 00 00 00 04 1d bb  53 4a 08 73 26 c2 33 d5  |........SJ.s&.3.|
+00000020  95 2c cf aa 74 1b 58 27  11 99 f9 67 e7 93 56 72  |.,..t.X'...g..Vr|
+00000030  a5 0b 96 9e ea 32 b2 c8  c3 2e 47 b4 91 81 47 86  |.....2....G...G.|
+00000040  f2 31 fd 7a f8 15 03 03  00 40 00 00 00 00 00 00  |.1.z.....@......|
+00000050  00 00 00 00 00 00 00 00  00 00 55 3a e3 6d aa 75  |..........U:.m.u|
+00000060  31 f5 92 6c ae f8 8d fc  f4 6e 20 de a6 66 7c 97  |1..l.....n ..f|.|
+00000070  51 e5 c7 8b 4a 1d 0e e8  38 f5 9f 0a 6b b6 63 c1  |Q...J...8...k.c.|
+00000080  85 97 c6 3c d2 79 b5 a3  42 1d                    |...<.y..B.|
diff --git a/src/crypto/tls/testdata/Client-TLSv12-AES256-GCM-SHA384 b/src/crypto/tls/testdata/Client-TLSv12-AES256-GCM-SHA384
index 766bf95..0166f1a 100644
--- a/src/crypto/tls/testdata/Client-TLSv12-AES256-GCM-SHA384
+++ b/src/crypto/tls/testdata/Client-TLSv12-AES256-GCM-SHA384
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fe 01 00 00  fa 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 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,59 +7,61 @@
 00000050  cc a8 c0 2b c0 2f c0 2c  c0 30 c0 09 c0 13 c0 0a  |...+./.,.0......|
 00000060  c0 14 00 9c 00 9d 00 2f  00 35 c0 12 00 0a c0 23  |......./.5.....#|
 00000070  c0 27 00 3c c0 07 c0 11  00 05 13 03 13 01 13 02  |.'.<............|
-00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
+00000080  01 00 00 7f 00 05 00 05  01 00 00 00 00 00 0a 00  |................|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
 000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
 000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
-000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
-000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
-000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
-000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
+000000c0  01 00 01 00 00 17 00 00  00 12 00 00 00 2b 00 09  |.............+..|
+000000d0  08 03 04 03 03 03 02 03  01 00 33 00 26 00 24 00  |..........3.&.$.|
+000000e0  1d 00 20 2f e5 7d a3 47  cd 62 43 15 28 da ac 5f  |.. /.}.G.bC.(.._|
+000000f0  bb 29 07 30 ff f6 84 af  c4 cf c2 ed 90 99 5f 58  |.).0.........._X|
+00000100  cb 3b 74                                          |.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 51 02 00 00  4d 03 03 de 7a 77 5b eb  |....Q...M...zw[.|
-00000010  fa 84 a0 ac ba 3b ca 25  dc b3 c0 06 44 da 31 5c  |.....;.%....D.1\|
-00000020  27 e0 4e af be 47 07 5a  a5 ab 20 20 72 b2 67 0c  |'.N..G.Z..  r.g.|
-00000030  7e 71 5d e3 55 89 91 27  7f 65 ac 71 c6 e8 a5 4a  |~q].U..'.e.q...J|
-00000040  ae e1 a2 0d 3f a6 62 08  17 7e 26 fd 00 9d 00 00  |....?.b..~&.....|
-00000050  05 ff 01 00 01 00 16 03  03 02 59 0b 00 02 55 00  |..........Y...U.|
-00000060  02 52 00 02 4f 30 82 02  4b 30 82 01 b4 a0 03 02  |.R..O0..K0......|
-00000070  01 02 02 09 00 e8 f0 9d  3f e2 5b ea a6 30 0d 06  |........?.[..0..|
-00000080  09 2a 86 48 86 f7 0d 01  01 0b 05 00 30 1f 31 0b  |.*.H........0.1.|
-00000090  30 09 06 03 55 04 0a 13  02 47 6f 31 10 30 0e 06  |0...U....Go1.0..|
-000000a0  03 55 04 03 13 07 47 6f  20 52 6f 6f 74 30 1e 17  |.U....Go Root0..|
-000000b0  0d 31 36 30 31 30 31 30  30 30 30 30 30 5a 17 0d  |.160101000000Z..|
-000000c0  32 35 30 31 30 31 30 30  30 30 30 30 5a 30 1a 31  |250101000000Z0.1|
-000000d0  0b 30 09 06 03 55 04 0a  13 02 47 6f 31 0b 30 09  |.0...U....Go1.0.|
-000000e0  06 03 55 04 03 13 02 47  6f 30 81 9f 30 0d 06 09  |..U....Go0..0...|
-000000f0  2a 86 48 86 f7 0d 01 01  01 05 00 03 81 8d 00 30  |*.H............0|
-00000100  81 89 02 81 81 00 db 46  7d 93 2e 12 27 06 48 bc  |.......F}...'.H.|
-00000110  06 28 21 ab 7e c4 b6 a2  5d fe 1e 52 45 88 7a 36  |.(!.~...]..RE.z6|
-00000120  47 a5 08 0d 92 42 5b c2  81 c0 be 97 79 98 40 fb  |G....B[.....y.@.|
-00000130  4f 6d 14 fd 2b 13 8b c2  a5 2e 67 d8 d4 09 9e d6  |Om..+.....g.....|
-00000140  22 38 b7 4a 0b 74 73 2b  c2 34 f1 d1 93 e5 96 d9  |"8.J.ts+.4......|
-00000150  74 7b f3 58 9f 6c 61 3c  c0 b0 41 d4 d9 2b 2b 24  |t{.X.la<..A..++$|
-00000160  23 77 5b 1c 3b bd 75 5d  ce 20 54 cf a1 63 87 1d  |#w[.;.u]. T..c..|
-00000170  1e 24 c4 f3 1d 1a 50 8b  aa b6 14 43 ed 97 a7 75  |.$....P....C...u|
-00000180  62 f4 14 c8 52 d7 02 03  01 00 01 a3 81 93 30 81  |b...R.........0.|
-00000190  90 30 0e 06 03 55 1d 0f  01 01 ff 04 04 03 02 05  |.0...U..........|
-000001a0  a0 30 1d 06 03 55 1d 25  04 16 30 14 06 08 2b 06  |.0...U.%..0...+.|
-000001b0  01 05 05 07 03 01 06 08  2b 06 01 05 05 07 03 02  |........+.......|
-000001c0  30 0c 06 03 55 1d 13 01  01 ff 04 02 30 00 30 19  |0...U.......0.0.|
-000001d0  06 03 55 1d 0e 04 12 04  10 9f 91 16 1f 43 43 3e  |..U..........CC>|
-000001e0  49 a6 de 6d b6 80 d7 9f  60 30 1b 06 03 55 1d 23  |I..m....`0...U.#|
-000001f0  04 14 30 12 80 10 48 13  49 4d 13 7e 16 31 bb a3  |..0...H.IM.~.1..|
-00000200  01 d5 ac ab 6e 7b 30 19  06 03 55 1d 11 04 12 30  |....n{0...U....0|
-00000210  10 82 0e 65 78 61 6d 70  6c 65 2e 67 6f 6c 61 6e  |...example.golan|
-00000220  67 30 0d 06 09 2a 86 48  86 f7 0d 01 01 0b 05 00  |g0...*.H........|
-00000230  03 81 81 00 9d 30 cc 40  2b 5b 50 a0 61 cb ba e5  |.....0.@+[P.a...|
-00000240  53 58 e1 ed 83 28 a9 58  1a a9 38 a4 95 a1 ac 31  |SX...(.X..8....1|
-00000250  5a 1a 84 66 3d 43 d3 2d  d9 0b f2 97 df d3 20 64  |Z..f=C.-...... d|
-00000260  38 92 24 3a 00 bc cf 9c  7d b7 40 20 01 5f aa d3  |8.$:....}.@ ._..|
-00000270  16 61 09 a2 76 fd 13 c3  cc e1 0c 5c ee b1 87 82  |.a..v......\....|
-00000280  f1 6c 04 ed 73 bb b3 43  77 8d 0c 1c f1 0f a1 d8  |.l..s..Cw.......|
-00000290  40 83 61 c9 4c 72 2b 9d  ae db 46 06 06 4d f4 c1  |@.a.Lr+...F..M..|
-000002a0  b3 3e c0 d1 bd 42 d4 db  fe 3d 13 60 84 5c 21 d3  |.>...B...=.`.\!.|
-000002b0  3b e9 fa e7 16 03 03 00  04 0e 00 00 00           |;............|
+00000000  16 03 03 00 55 02 00 00  51 03 03 38 33 33 fb 62  |....U...Q..833.b|
+00000010  ff ce 69 f1 cd 8c fe 50  05 bd 1e ce f9 ad a5 e6  |..i....P........|
+00000020  ee d7 71 82 97 25 04 2a  cd aa c5 20 13 68 7a d0  |..q..%.*... .hz.|
+00000030  0f cc 61 05 63 31 cc 47  24 1c 52 81 8d cc d3 d1  |..a.c1.G$.R.....|
+00000040  d1 53 97 70 e9 f1 98 3b  00 2d df ab 00 9d 00 00  |.S.p...;.-......|
+00000050  09 ff 01 00 01 00 00 17  00 00 16 03 03 02 59 0b  |..............Y.|
+00000060  00 02 55 00 02 52 00 02  4f 30 82 02 4b 30 82 01  |..U..R..O0..K0..|
+00000070  b4 a0 03 02 01 02 02 09  00 e8 f0 9d 3f e2 5b ea  |............?.[.|
+00000080  a6 30 0d 06 09 2a 86 48  86 f7 0d 01 01 0b 05 00  |.0...*.H........|
+00000090  30 1f 31 0b 30 09 06 03  55 04 0a 13 02 47 6f 31  |0.1.0...U....Go1|
+000000a0  10 30 0e 06 03 55 04 03  13 07 47 6f 20 52 6f 6f  |.0...U....Go Roo|
+000000b0  74 30 1e 17 0d 31 36 30  31 30 31 30 30 30 30 30  |t0...16010100000|
+000000c0  30 5a 17 0d 32 35 30 31  30 31 30 30 30 30 30 30  |0Z..250101000000|
+000000d0  5a 30 1a 31 0b 30 09 06  03 55 04 0a 13 02 47 6f  |Z0.1.0...U....Go|
+000000e0  31 0b 30 09 06 03 55 04  03 13 02 47 6f 30 81 9f  |1.0...U....Go0..|
+000000f0  30 0d 06 09 2a 86 48 86  f7 0d 01 01 01 05 00 03  |0...*.H.........|
+00000100  81 8d 00 30 81 89 02 81  81 00 db 46 7d 93 2e 12  |...0.......F}...|
+00000110  27 06 48 bc 06 28 21 ab  7e c4 b6 a2 5d fe 1e 52  |'.H..(!.~...]..R|
+00000120  45 88 7a 36 47 a5 08 0d  92 42 5b c2 81 c0 be 97  |E.z6G....B[.....|
+00000130  79 98 40 fb 4f 6d 14 fd  2b 13 8b c2 a5 2e 67 d8  |y.@.Om..+.....g.|
+00000140  d4 09 9e d6 22 38 b7 4a  0b 74 73 2b c2 34 f1 d1  |...."8.J.ts+.4..|
+00000150  93 e5 96 d9 74 7b f3 58  9f 6c 61 3c c0 b0 41 d4  |....t{.X.la<..A.|
+00000160  d9 2b 2b 24 23 77 5b 1c  3b bd 75 5d ce 20 54 cf  |.++$#w[.;.u]. T.|
+00000170  a1 63 87 1d 1e 24 c4 f3  1d 1a 50 8b aa b6 14 43  |.c...$....P....C|
+00000180  ed 97 a7 75 62 f4 14 c8  52 d7 02 03 01 00 01 a3  |...ub...R.......|
+00000190  81 93 30 81 90 30 0e 06  03 55 1d 0f 01 01 ff 04  |..0..0...U......|
+000001a0  04 03 02 05 a0 30 1d 06  03 55 1d 25 04 16 30 14  |.....0...U.%..0.|
+000001b0  06 08 2b 06 01 05 05 07  03 01 06 08 2b 06 01 05  |..+.........+...|
+000001c0  05 07 03 02 30 0c 06 03  55 1d 13 01 01 ff 04 02  |....0...U.......|
+000001d0  30 00 30 19 06 03 55 1d  0e 04 12 04 10 9f 91 16  |0.0...U.........|
+000001e0  1f 43 43 3e 49 a6 de 6d  b6 80 d7 9f 60 30 1b 06  |.CC>I..m....`0..|
+000001f0  03 55 1d 23 04 14 30 12  80 10 48 13 49 4d 13 7e  |.U.#..0...H.IM.~|
+00000200  16 31 bb a3 01 d5 ac ab  6e 7b 30 19 06 03 55 1d  |.1......n{0...U.|
+00000210  11 04 12 30 10 82 0e 65  78 61 6d 70 6c 65 2e 67  |...0...example.g|
+00000220  6f 6c 61 6e 67 30 0d 06  09 2a 86 48 86 f7 0d 01  |olang0...*.H....|
+00000230  01 0b 05 00 03 81 81 00  9d 30 cc 40 2b 5b 50 a0  |.........0.@+[P.|
+00000240  61 cb ba e5 53 58 e1 ed  83 28 a9 58 1a a9 38 a4  |a...SX...(.X..8.|
+00000250  95 a1 ac 31 5a 1a 84 66  3d 43 d3 2d d9 0b f2 97  |...1Z..f=C.-....|
+00000260  df d3 20 64 38 92 24 3a  00 bc cf 9c 7d b7 40 20  |.. d8.$:....}.@ |
+00000270  01 5f aa d3 16 61 09 a2  76 fd 13 c3 cc e1 0c 5c  |._...a..v......\|
+00000280  ee b1 87 82 f1 6c 04 ed  73 bb b3 43 77 8d 0c 1c  |.....l..s..Cw...|
+00000290  f1 0f a1 d8 40 83 61 c9  4c 72 2b 9d ae db 46 06  |....@.a.Lr+...F.|
+000002a0  06 4d f4 c1 b3 3e c0 d1  bd 42 d4 db fe 3d 13 60  |.M...>...B...=.`|
+000002b0  84 5c 21 d3 3b e9 fa e7  16 03 03 00 04 0e 00 00  |.\!.;...........|
+000002c0  00                                                |.|
 >>> Flow 3 (client to server)
 00000000  16 03 03 00 86 10 00 00  82 00 80 b9 65 8d bf a7  |............e...|
 00000010  c8 4b 79 ce 6f cb 8b 13  1c ac b9 7d 66 5e e9 ba  |.Ky.o......}f^..|
@@ -70,17 +72,17 @@
 00000060  c5 70 0f 08 83 48 e9 48  ef 6e 50 8b 05 7e e5 84  |.p...H.H.nP..~..|
 00000070  25 fa 55 c7 ae 31 02 27  00 ef 3f 98 86 20 12 89  |%.U..1.'..?.. ..|
 00000080  91 59 28 b4 f7 d7 af d2  69 61 35 14 03 03 00 01  |.Y(.....ia5.....|
-00000090  01 16 03 03 00 28 00 00  00 00 00 00 00 00 0b 7d  |.....(.........}|
-000000a0  83 0f 79 e2 4b ef d3 0e  ff 57 d2 55 cd ea e9 be  |..y.K....W.U....|
-000000b0  8b 38 1e 33 b0 6a eb e3  aa 51 52 82 e6 15        |.8.3.j...QR...|
+00000090  01 16 03 03 00 28 00 00  00 00 00 00 00 00 2b 4c  |.....(........+L|
+000000a0  62 77 65 ac 19 53 aa 52  8e 3d 92 5b e1 45 c6 90  |bwe..S.R.=.[.E..|
+000000b0  bf 01 bb e3 9c d2 6a ed  bf e6 8c 53 3d 58        |......j....S=X|
 >>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 28 1a a3 bb d4 c4  |..........(.....|
-00000010  53 c7 5c 09 8c fb e7 51  41 73 d5 76 ef e6 40 9a  |S.\....QAs.v..@.|
-00000020  06 27 c6 e8 9f 1b 25 f5  d1 7b 39 b7 74 ab e8 83  |.'....%..{9.t...|
-00000030  26 f6 40                                          |&.@|
+00000000  14 03 03 00 01 01 16 03  03 00 28 77 7f 9b a4 ea  |..........(w....|
+00000010  30 03 8f fd 22 37 60 78  db b1 1a 37 bc 2d 50 ad  |0..."7`x...7.-P.|
+00000020  40 b4 a6 8f f8 0c e8 ab  24 54 82 12 75 be 0b 8c  |@.......$T..u...|
+00000030  9f 35 e2                                          |.5.|
 >>> Flow 5 (client to server)
-00000000  17 03 03 00 1e 00 00 00  00 00 00 00 01 1c 0d 06  |................|
-00000010  d2 25 8a 06 d9 b4 d6 76  89 1c c6 b7 22 9f 44 63  |.%.....v....".Dc|
-00000020  a3 f9 89 15 03 03 00 1a  00 00 00 00 00 00 00 02  |................|
-00000030  cb 34 e8 4b f7 b1 ab 1a  74 60 2c 2d cf a4 7d 9f  |.4.K....t`,-..}.|
-00000040  f4 b4                                             |..|
+00000000  17 03 03 00 1e 00 00 00  00 00 00 00 01 01 66 69  |..............fi|
+00000010  ac a4 9d 4f d2 59 01 4e  d6 04 98 e5 c8 83 b3 cb  |...O.Y.N........|
+00000020  36 4d cf 15 03 03 00 1a  00 00 00 00 00 00 00 02  |6M..............|
+00000030  17 80 89 ac 0b d6 00 8c  1d ae b2 c2 46 42 69 82  |............FBi.|
+00000040  da ac                                             |..|
diff --git a/src/crypto/tls/testdata/Client-TLSv12-ALPN b/src/crypto/tls/testdata/Client-TLSv12-ALPN
index 8b9a510..4ae1fe9 100644
--- a/src/crypto/tls/testdata/Client-TLSv12-ALPN
+++ b/src/crypto/tls/testdata/Client-TLSv12-ALPN
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 01 0e 01 00 01  0a 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 01 12 01 00 01  0e 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 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,87 +7,87 @@
 00000050  cc a8 c0 2b c0 2f c0 2c  c0 30 c0 09 c0 13 c0 0a  |...+./.,.0......|
 00000060  c0 14 00 9c 00 9d 00 2f  00 35 c0 12 00 0a c0 23  |......./.5.....#|
 00000070  c0 27 00 3c c0 07 c0 11  00 05 13 03 13 01 13 02  |.'.<............|
-00000080  01 00 00 8f 00 05 00 05  01 00 00 00 00 00 0a 00  |................|
+00000080  01 00 00 93 00 05 00 05  01 00 00 00 00 00 0a 00  |................|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
 000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
 000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
-000000c0  01 00 01 00 00 10 00 10  00 0e 06 70 72 6f 74 6f  |...........proto|
-000000d0  32 06 70 72 6f 74 6f 31  00 12 00 00 00 2b 00 09  |2.proto1.....+..|
-000000e0  08 03 04 03 03 03 02 03  01 00 33 00 26 00 24 00  |..........3.&.$.|
-000000f0  1d 00 20 2f e5 7d a3 47  cd 62 43 15 28 da ac 5f  |.. /.}.G.bC.(.._|
-00000100  bb 29 07 30 ff f6 84 af  c4 cf c2 ed 90 99 5f 58  |.).0.........._X|
-00000110  cb 3b 74                                          |.;t|
+000000c0  01 00 01 00 00 17 00 00  00 10 00 10 00 0e 06 70  |...............p|
+000000d0  72 6f 74 6f 32 06 70 72  6f 74 6f 31 00 12 00 00  |roto2.proto1....|
+000000e0  00 2b 00 09 08 03 04 03  03 03 02 03 01 00 33 00  |.+............3.|
+000000f0  26 00 24 00 1d 00 20 2f  e5 7d a3 47 cd 62 43 15  |&.$... /.}.G.bC.|
+00000100  28 da ac 5f bb 29 07 30  ff f6 84 af c4 cf c2 ed  |(.._.).0........|
+00000110  90 99 5f 58 cb 3b 74                              |.._X.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 66 02 00 00  62 03 03 2d b3 e1 a8 44  |....f...b..-...D|
-00000010  c6 3e 20 b9 50 49 ab b8  48 c3 bf d6 f3 7b 2e 0a  |.> .PI..H....{..|
-00000020  8c 49 ba e5 8e 54 5e 02  59 01 75 20 f0 a0 60 c2  |.I...T^.Y.u ..`.|
-00000030  81 df 62 f9 f8 7d 3c 3c  ee 1e 0c 1d c2 11 58 7f  |..b..}<<......X.|
-00000040  e0 dc b1 6c 17 9e 19 60  ca c2 40 84 cc a8 00 00  |...l...`..@.....|
-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 59  |.....proto1....Y|
-00000070  0b 00 02 55 00 02 52 00  02 4f 30 82 02 4b 30 82  |...U..R..O0..K0.|
-00000080  01 b4 a0 03 02 01 02 02  09 00 e8 f0 9d 3f e2 5b  |.............?.[|
-00000090  ea a6 30 0d 06 09 2a 86  48 86 f7 0d 01 01 0b 05  |..0...*.H.......|
-000000a0  00 30 1f 31 0b 30 09 06  03 55 04 0a 13 02 47 6f  |.0.1.0...U....Go|
-000000b0  31 10 30 0e 06 03 55 04  03 13 07 47 6f 20 52 6f  |1.0...U....Go Ro|
-000000c0  6f 74 30 1e 17 0d 31 36  30 31 30 31 30 30 30 30  |ot0...1601010000|
-000000d0  30 30 5a 17 0d 32 35 30  31 30 31 30 30 30 30 30  |00Z..25010100000|
-000000e0  30 5a 30 1a 31 0b 30 09  06 03 55 04 0a 13 02 47  |0Z0.1.0...U....G|
-000000f0  6f 31 0b 30 09 06 03 55  04 03 13 02 47 6f 30 81  |o1.0...U....Go0.|
-00000100  9f 30 0d 06 09 2a 86 48  86 f7 0d 01 01 01 05 00  |.0...*.H........|
-00000110  03 81 8d 00 30 81 89 02  81 81 00 db 46 7d 93 2e  |....0.......F}..|
-00000120  12 27 06 48 bc 06 28 21  ab 7e c4 b6 a2 5d fe 1e  |.'.H..(!.~...]..|
-00000130  52 45 88 7a 36 47 a5 08  0d 92 42 5b c2 81 c0 be  |RE.z6G....B[....|
-00000140  97 79 98 40 fb 4f 6d 14  fd 2b 13 8b c2 a5 2e 67  |.y.@.Om..+.....g|
-00000150  d8 d4 09 9e d6 22 38 b7  4a 0b 74 73 2b c2 34 f1  |....."8.J.ts+.4.|
-00000160  d1 93 e5 96 d9 74 7b f3  58 9f 6c 61 3c c0 b0 41  |.....t{.X.la<..A|
-00000170  d4 d9 2b 2b 24 23 77 5b  1c 3b bd 75 5d ce 20 54  |..++$#w[.;.u]. T|
-00000180  cf a1 63 87 1d 1e 24 c4  f3 1d 1a 50 8b aa b6 14  |..c...$....P....|
-00000190  43 ed 97 a7 75 62 f4 14  c8 52 d7 02 03 01 00 01  |C...ub...R......|
-000001a0  a3 81 93 30 81 90 30 0e  06 03 55 1d 0f 01 01 ff  |...0..0...U.....|
-000001b0  04 04 03 02 05 a0 30 1d  06 03 55 1d 25 04 16 30  |......0...U.%..0|
-000001c0  14 06 08 2b 06 01 05 05  07 03 01 06 08 2b 06 01  |...+.........+..|
-000001d0  05 05 07 03 02 30 0c 06  03 55 1d 13 01 01 ff 04  |.....0...U......|
-000001e0  02 30 00 30 19 06 03 55  1d 0e 04 12 04 10 9f 91  |.0.0...U........|
-000001f0  16 1f 43 43 3e 49 a6 de  6d b6 80 d7 9f 60 30 1b  |..CC>I..m....`0.|
-00000200  06 03 55 1d 23 04 14 30  12 80 10 48 13 49 4d 13  |..U.#..0...H.IM.|
-00000210  7e 16 31 bb a3 01 d5 ac  ab 6e 7b 30 19 06 03 55  |~.1......n{0...U|
-00000220  1d 11 04 12 30 10 82 0e  65 78 61 6d 70 6c 65 2e  |....0...example.|
-00000230  67 6f 6c 61 6e 67 30 0d  06 09 2a 86 48 86 f7 0d  |golang0...*.H...|
-00000240  01 01 0b 05 00 03 81 81  00 9d 30 cc 40 2b 5b 50  |..........0.@+[P|
-00000250  a0 61 cb ba e5 53 58 e1  ed 83 28 a9 58 1a a9 38  |.a...SX...(.X..8|
-00000260  a4 95 a1 ac 31 5a 1a 84  66 3d 43 d3 2d d9 0b f2  |....1Z..f=C.-...|
-00000270  97 df d3 20 64 38 92 24  3a 00 bc cf 9c 7d b7 40  |... d8.$:....}.@|
-00000280  20 01 5f aa d3 16 61 09  a2 76 fd 13 c3 cc e1 0c  | ._...a..v......|
-00000290  5c ee b1 87 82 f1 6c 04  ed 73 bb b3 43 77 8d 0c  |\.....l..s..Cw..|
-000002a0  1c f1 0f a1 d8 40 83 61  c9 4c 72 2b 9d ae db 46  |.....@.a.Lr+...F|
-000002b0  06 06 4d f4 c1 b3 3e c0  d1 bd 42 d4 db fe 3d 13  |..M...>...B...=.|
-000002c0  60 84 5c 21 d3 3b e9 fa  e7 16 03 03 00 ac 0c 00  |`.\!.;..........|
-000002d0  00 a8 03 00 1d 20 7b 47  ec ef 4d 39 ec 65 b9 7c  |..... {G..M9.e.||
-000002e0  08 da b5 41 0d 62 0b 52  29 24 25 3d 39 21 ed d3  |...A.b.R)$%=9!..|
-000002f0  30 37 0c 15 66 49 08 04  00 80 4b 01 8e 80 78 ed  |07..fI....K...x.|
-00000300  d1 44 e5 98 a4 43 9a 73  b7 dc 67 72 83 29 f3 e3  |.D...C.s..gr.)..|
-00000310  5b 72 ee d6 36 12 db bf  ab d6 86 fd a8 54 a5 a0  |[r..6........T..|
-00000320  0e 76 ca ea a7 f5 f2 e1  87 94 a7 c5 d8 69 b7 58  |.v...........i.X|
-00000330  d2 f0 10 08 8c 08 ac bd  aa 60 f5 45 20 15 77 71  |.........`.E .wq|
-00000340  5a bb 2a 8b 0a 4b a3 08  71 88 82 01 3c bc 54 ba  |Z.*..K..q...<.T.|
-00000350  f4 42 7a 08 64 d7 57 5b  dc ea 6a 72 e1 7d ca 96  |.Bz.d.W[..jr.}..|
-00000360  d9 89 eb 60 9e d2 a4 f5  cb d5 45 d1 4d 09 4e 18  |...`......E.M.N.|
-00000370  a2 4f 0f 59 97 a1 5f 7f  65 4f 16 03 03 00 04 0e  |.O.Y.._.eO......|
-00000380  00 00 00                                          |...|
+00000000  16 03 03 00 6a 02 00 00  66 03 03 a8 8a 7d 2c f6  |....j...f....},.|
+00000010  d0 44 0a 7b 16 26 e5 aa  6e 4b 78 7c ff 7f 07 86  |.D.{.&..nKx|....|
+00000020  48 cc 3a dd 73 95 94 d2  75 d8 87 20 6d 0b 3a a3  |H.:.s...u.. m.:.|
+00000030  71 b9 50 4e c7 ad 33 04  8a 9c d8 71 48 93 ec ae  |q.PN..3....qH...|
+00000040  db ad 5f 79 d5 7c 65 33  37 06 73 0e cc a8 00 00  |.._y.|e37.s.....|
+00000050  1e 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 00 17 00 00 16  |.....proto1.....|
+00000070  03 03 02 59 0b 00 02 55  00 02 52 00 02 4f 30 82  |...Y...U..R..O0.|
+00000080  02 4b 30 82 01 b4 a0 03  02 01 02 02 09 00 e8 f0  |.K0.............|
+00000090  9d 3f e2 5b ea a6 30 0d  06 09 2a 86 48 86 f7 0d  |.?.[..0...*.H...|
+000000a0  01 01 0b 05 00 30 1f 31  0b 30 09 06 03 55 04 0a  |.....0.1.0...U..|
+000000b0  13 02 47 6f 31 10 30 0e  06 03 55 04 03 13 07 47  |..Go1.0...U....G|
+000000c0  6f 20 52 6f 6f 74 30 1e  17 0d 31 36 30 31 30 31  |o Root0...160101|
+000000d0  30 30 30 30 30 30 5a 17  0d 32 35 30 31 30 31 30  |000000Z..2501010|
+000000e0  30 30 30 30 30 5a 30 1a  31 0b 30 09 06 03 55 04  |00000Z0.1.0...U.|
+000000f0  0a 13 02 47 6f 31 0b 30  09 06 03 55 04 03 13 02  |...Go1.0...U....|
+00000100  47 6f 30 81 9f 30 0d 06  09 2a 86 48 86 f7 0d 01  |Go0..0...*.H....|
+00000110  01 01 05 00 03 81 8d 00  30 81 89 02 81 81 00 db  |........0.......|
+00000120  46 7d 93 2e 12 27 06 48  bc 06 28 21 ab 7e c4 b6  |F}...'.H..(!.~..|
+00000130  a2 5d fe 1e 52 45 88 7a  36 47 a5 08 0d 92 42 5b  |.]..RE.z6G....B[|
+00000140  c2 81 c0 be 97 79 98 40  fb 4f 6d 14 fd 2b 13 8b  |.....y.@.Om..+..|
+00000150  c2 a5 2e 67 d8 d4 09 9e  d6 22 38 b7 4a 0b 74 73  |...g....."8.J.ts|
+00000160  2b c2 34 f1 d1 93 e5 96  d9 74 7b f3 58 9f 6c 61  |+.4......t{.X.la|
+00000170  3c c0 b0 41 d4 d9 2b 2b  24 23 77 5b 1c 3b bd 75  |<..A..++$#w[.;.u|
+00000180  5d ce 20 54 cf a1 63 87  1d 1e 24 c4 f3 1d 1a 50  |]. T..c...$....P|
+00000190  8b aa b6 14 43 ed 97 a7  75 62 f4 14 c8 52 d7 02  |....C...ub...R..|
+000001a0  03 01 00 01 a3 81 93 30  81 90 30 0e 06 03 55 1d  |.......0..0...U.|
+000001b0  0f 01 01 ff 04 04 03 02  05 a0 30 1d 06 03 55 1d  |..........0...U.|
+000001c0  25 04 16 30 14 06 08 2b  06 01 05 05 07 03 01 06  |%..0...+........|
+000001d0  08 2b 06 01 05 05 07 03  02 30 0c 06 03 55 1d 13  |.+.......0...U..|
+000001e0  01 01 ff 04 02 30 00 30  19 06 03 55 1d 0e 04 12  |.....0.0...U....|
+000001f0  04 10 9f 91 16 1f 43 43  3e 49 a6 de 6d b6 80 d7  |......CC>I..m...|
+00000200  9f 60 30 1b 06 03 55 1d  23 04 14 30 12 80 10 48  |.`0...U.#..0...H|
+00000210  13 49 4d 13 7e 16 31 bb  a3 01 d5 ac ab 6e 7b 30  |.IM.~.1......n{0|
+00000220  19 06 03 55 1d 11 04 12  30 10 82 0e 65 78 61 6d  |...U....0...exam|
+00000230  70 6c 65 2e 67 6f 6c 61  6e 67 30 0d 06 09 2a 86  |ple.golang0...*.|
+00000240  48 86 f7 0d 01 01 0b 05  00 03 81 81 00 9d 30 cc  |H.............0.|
+00000250  40 2b 5b 50 a0 61 cb ba  e5 53 58 e1 ed 83 28 a9  |@+[P.a...SX...(.|
+00000260  58 1a a9 38 a4 95 a1 ac  31 5a 1a 84 66 3d 43 d3  |X..8....1Z..f=C.|
+00000270  2d d9 0b f2 97 df d3 20  64 38 92 24 3a 00 bc cf  |-...... d8.$:...|
+00000280  9c 7d b7 40 20 01 5f aa  d3 16 61 09 a2 76 fd 13  |.}.@ ._...a..v..|
+00000290  c3 cc e1 0c 5c ee b1 87  82 f1 6c 04 ed 73 bb b3  |....\.....l..s..|
+000002a0  43 77 8d 0c 1c f1 0f a1  d8 40 83 61 c9 4c 72 2b  |Cw.......@.a.Lr+|
+000002b0  9d ae db 46 06 06 4d f4  c1 b3 3e c0 d1 bd 42 d4  |...F..M...>...B.|
+000002c0  db fe 3d 13 60 84 5c 21  d3 3b e9 fa e7 16 03 03  |..=.`.\!.;......|
+000002d0  00 ac 0c 00 00 a8 03 00  1d 20 fe 7c 30 da b3 7e  |......... .|0..~|
+000002e0  b9 f5 74 9f c2 5a 3b 2e  a4 c4 fe 98 50 1d 14 ea  |..t..Z;.....P...|
+000002f0  31 f0 ff d9 90 88 42 77  f6 18 08 04 00 80 70 97  |1.....Bw......p.|
+00000300  1d e4 fb 40 de b5 9a cc  6a 63 63 86 b4 91 55 c4  |...@....jcc...U.|
+00000310  ad b7 2f a2 8f 4f 28 22  86 df ec 2f 7c d2 83 b7  |../..O(".../|...|
+00000320  28 9c 22 e7 73 74 51 f0  1e 20 50 d5 f1 3c 15 65  |(.".stQ.. P..<.e|
+00000330  d9 cb 7f 4e 82 11 41 f8  c6 2a 23 ed b5 b4 cf 2d  |...N..A..*#....-|
+00000340  02 e2 8e 8b e8 88 bb 8c  63 1e 9c 37 44 c3 89 cf  |........c..7D...|
+00000350  ea 68 4b 81 73 0e 57 82  c9 dc ab f3 0c 63 ce f6  |.hK.s.W......c..|
+00000360  c3 3a a3 da df be a7 10  4a 27 e1 bd b3 88 47 a2  |.:......J'....G.|
+00000370  0d 02 03 17 3c 6c 7f 6e  04 26 75 1c a0 3e 16 03  |....<l.n.&u..>..|
+00000380  03 00 04 0e 00 00 00                              |.......|
 >>> Flow 3 (client to server)
 00000000  16 03 03 00 25 10 00 00  21 20 2f e5 7d a3 47 cd  |....%...! /.}.G.|
 00000010  62 43 15 28 da ac 5f bb  29 07 30 ff f6 84 af c4  |bC.(.._.).0.....|
 00000020  cf c2 ed 90 99 5f 58 cb  3b 74 14 03 03 00 01 01  |....._X.;t......|
-00000030  16 03 03 00 20 b9 f7 58  6f d3 29 b8 41 35 06 b7  |.... ..Xo.).A5..|
-00000040  55 85 c1 f0 63 fe 4f 5f  87 01 cc 67 0b f1 4c b4  |U...c.O_...g..L.|
-00000050  ca 92 bd c0 6d                                    |....m|
+00000030  16 03 03 00 20 a0 68 d5  5a 22 13 42 16 b2 13 f4  |.... .h.Z".B....|
+00000040  99 a1 5c f7 38 22 a1 8b  e0 6b c2 7e f9 e5 a0 ef  |..\.8"...k.~....|
+00000050  79 ce 5a 74 d1                                    |y.Zt.|
 >>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 20 68 92 93 84 bd  |.......... h....|
-00000010  0e de 33 1b db ca 54 b8  a0 2f 53 c5 76 de d2 c5  |..3...T../S.v...|
-00000020  7a 54 bb db 0c 08 86 79  d2 6c 58                 |zT.....y.lX|
+00000000  14 03 03 00 01 01 16 03  03 00 20 dd a3 ff 04 65  |.......... ....e|
+00000010  4b 49 77 b6 88 ab f3 31  07 3d 2e 30 ec b3 e1 1f  |KIw....1.=.0....|
+00000020  18 0f ef a9 2d 32 1f e6  b9 71 3f                 |....-2...q?|
 >>> Flow 5 (client to server)
-00000000  17 03 03 00 16 79 38 07  9b be 83 44 9a 3e 11 1a  |.....y8....D.>..|
-00000010  99 2f f2 4e 33 84 0b c7  8e ed c3 15 03 03 00 12  |./.N3...........|
-00000020  ca bd 7e 59 04 8c e0 52  80 1e 56 1e af c1 5f 61  |..~Y...R..V..._a|
-00000030  6c 6a                                             |lj|
+00000000  17 03 03 00 16 54 7a 06  57 6b 66 e0 93 f8 f5 7a  |.....Tz.Wkf....z|
+00000010  ab 1a d1 f4 53 91 47 e8  5c 11 15 15 03 03 00 12  |....S.G.\.......|
+00000020  42 b6 c5 6f 63 b6 72 8b  85 c3 ba c5 e3 38 8f e2  |B..oc.r......8..|
+00000030  42 dd                                             |B.|
diff --git a/src/crypto/tls/testdata/Client-TLSv12-ClientCert-ECDSA-ECDSA b/src/crypto/tls/testdata/Client-TLSv12-ClientCert-ECDSA-ECDSA
index 4b5a4ca..4b40e44 100644
--- a/src/crypto/tls/testdata/Client-TLSv12-ClientCert-ECDSA-ECDSA
+++ b/src/crypto/tls/testdata/Client-TLSv12-ClientCert-ECDSA-ECDSA
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fe 01 00 00  fa 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 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,71 +7,72 @@
 00000050  cc a8 c0 2b c0 2f c0 2c  c0 30 c0 09 c0 13 c0 0a  |...+./.,.0......|
 00000060  c0 14 00 9c 00 9d 00 2f  00 35 c0 12 00 0a c0 23  |......./.5.....#|
 00000070  c0 27 00 3c c0 07 c0 11  00 05 13 03 13 01 13 02  |.'.<............|
-00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
+00000080  01 00 00 7f 00 05 00 05  01 00 00 00 00 00 0a 00  |................|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
 000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
 000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
-000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
-000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
-000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
-000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
+000000c0  01 00 01 00 00 17 00 00  00 12 00 00 00 2b 00 09  |.............+..|
+000000d0  08 03 04 03 03 03 02 03  01 00 33 00 26 00 24 00  |..........3.&.$.|
+000000e0  1d 00 20 2f e5 7d a3 47  cd 62 43 15 28 da ac 5f  |.. /.}.G.bC.(.._|
+000000f0  bb 29 07 30 ff f6 84 af  c4 cf c2 ed 90 99 5f 58  |.).0.........._X|
+00000100  cb 3b 74                                          |.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 59 02 00 00  55 03 03 8f fe 05 df f3  |....Y...U.......|
-00000010  02 70 ec 72 c4 3d 1e 52  c3 63 b8 1d dc e0 36 72  |.p.r.=.R.c....6r|
-00000020  8b 04 94 a5 45 fb 97 a5  0b e1 a7 20 9d fb e5 2b  |....E...... ...+|
-00000030  77 d7 1b da e8 d7 3e fe  c5 8f 4e b6 5a 40 29 02  |w.....>...N.Z@).|
-00000040  fd 08 46 4e 27 24 53 e1  de 88 8a 77 c0 09 00 00  |..FN'$S....w....|
-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 b7 0c 00  00 b3 03 00 1d 20 82 a8  |*............ ..|
-00000280  4b 0e 10 e1 2b a2 f6 9d  11 0a 4d 0b c0 2f 12 85  |K...+.....M../..|
-00000290  bc f3 e9 9f b4 50 50 fa  b1 a9 fd 35 d1 39 04 03  |.....PP....5.9..|
-000002a0  00 8b 30 81 88 02 42 01  b1 cb c7 7a 83 6a 95 5b  |..0...B....z.j.[|
-000002b0  09 4c 59 d6 9a 6b 9d 0c  e9 f5 22 1c 46 76 5b 4e  |.LY..k....".Fv[N|
-000002c0  3c 4a ac 81 b7 96 29 7c  e2 e8 08 e7 5f be 9d dc  |<J....)|...._...|
-000002d0  8d 9e 1d a1 84 4c 18 1a  8a 2d bd 97 de 26 70 14  |.....L...-...&p.|
-000002e0  11 74 49 4b e9 2e 59 30  9c 02 42 00 b5 9e 89 32  |.tIK..Y0..B....2|
-000002f0  45 02 71 19 6e 83 fc 26  26 b4 28 08 6a 7d d3 72  |E.q.n..&&.(.j}.r|
-00000300  4e ed 82 68 2f ad ff 39  5a ce 34 b8 e4 39 f2 f1  |N..h/..9Z.4..9..|
-00000310  60 5d 84 c4 da 4d 5a 33  f8 20 5a f2 7f aa 7e 18  |`]...MZ3. Z...~.|
-00000320  14 14 2a 68 a8 9d dd d0  ec e3 00 87 49 16 03 03  |..*h........I...|
-00000330  00 3a 0d 00 00 36 03 01  02 40 00 2e 04 03 05 03  |.:...6...@......|
-00000340  06 03 08 07 08 08 08 09  08 0a 08 0b 08 04 08 05  |................|
-00000350  08 06 04 01 05 01 06 01  03 03 02 03 03 01 02 01  |................|
-00000360  03 02 02 02 04 02 05 02  06 02 00 00 16 03 03 00  |................|
-00000370  04 0e 00 00 00                                    |.....|
+00000000  16 03 03 00 5d 02 00 00  59 03 03 7c 3c 83 43 cf  |....]...Y..|<.C.|
+00000010  60 91 0b 04 73 55 30 be  25 6b 41 c9 4c 67 5b 91  |`...sU0.%kA.Lg[.|
+00000020  af 04 b5 34 c7 61 c7 d3  62 2e ca 20 88 47 3a 15  |...4.a..b.. .G:.|
+00000030  b4 8d 3f eb a6 b3 fd ae  a4 e9 d9 db 5b 59 3b 1c  |..?.........[Y;.|
+00000040  e6 47 e3 98 74 da 32 04  32 b0 57 81 c0 09 00 00  |.G..t.2.2.W.....|
+00000050  11 ff 01 00 01 00 00 0b  00 04 03 00 01 02 00 17  |................|
+00000060  00 00 16 03 03 02 0e 0b  00 02 0a 00 02 07 00 02  |................|
+00000070  04 30 82 02 00 30 82 01  62 02 09 00 b8 bf 2d 47  |.0...0..b.....-G|
+00000080  a0 d2 eb f4 30 09 06 07  2a 86 48 ce 3d 04 01 30  |....0...*.H.=..0|
+00000090  45 31 0b 30 09 06 03 55  04 06 13 02 41 55 31 13  |E1.0...U....AU1.|
+000000a0  30 11 06 03 55 04 08 13  0a 53 6f 6d 65 2d 53 74  |0...U....Some-St|
+000000b0  61 74 65 31 21 30 1f 06  03 55 04 0a 13 18 49 6e  |ate1!0...U....In|
+000000c0  74 65 72 6e 65 74 20 57  69 64 67 69 74 73 20 50  |ternet Widgits P|
+000000d0  74 79 20 4c 74 64 30 1e  17 0d 31 32 31 31 32 32  |ty Ltd0...121122|
+000000e0  31 35 30 36 33 32 5a 17  0d 32 32 31 31 32 30 31  |150632Z..2211201|
+000000f0  35 30 36 33 32 5a 30 45  31 0b 30 09 06 03 55 04  |50632Z0E1.0...U.|
+00000100  06 13 02 41 55 31 13 30  11 06 03 55 04 08 13 0a  |...AU1.0...U....|
+00000110  53 6f 6d 65 2d 53 74 61  74 65 31 21 30 1f 06 03  |Some-State1!0...|
+00000120  55 04 0a 13 18 49 6e 74  65 72 6e 65 74 20 57 69  |U....Internet Wi|
+00000130  64 67 69 74 73 20 50 74  79 20 4c 74 64 30 81 9b  |dgits Pty Ltd0..|
+00000140  30 10 06 07 2a 86 48 ce  3d 02 01 06 05 2b 81 04  |0...*.H.=....+..|
+00000150  00 23 03 81 86 00 04 00  c4 a1 ed be 98 f9 0b 48  |.#.............H|
+00000160  73 36 7e c3 16 56 11 22  f2 3d 53 c3 3b 4d 21 3d  |s6~..V.".=S.;M!=|
+00000170  cd 6b 75 e6 f6 b0 dc 9a  df 26 c1 bc b2 87 f0 72  |.ku......&.....r|
+00000180  32 7c b3 64 2f 1c 90 bc  ea 68 23 10 7e fe e3 25  |2|.d/....h#.~..%|
+00000190  c0 48 3a 69 e0 28 6d d3  37 00 ef 04 62 dd 0d a0  |.H:i.(m.7...b...|
+000001a0  9c 70 62 83 d8 81 d3 64  31 aa 9e 97 31 bd 96 b0  |.pb....d1...1...|
+000001b0  68 c0 9b 23 de 76 64 3f  1a 5c 7f e9 12 0e 58 58  |h..#.vd?.\....XX|
+000001c0  b6 5f 70 dd 9b d8 ea d5  d7 f5 d5 cc b9 b6 9f 30  |._p............0|
+000001d0  66 5b 66 9a 20 e2 27 e5  bf fe 3b 30 09 06 07 2a  |f[f. .'...;0...*|
+000001e0  86 48 ce 3d 04 01 03 81  8c 00 30 81 88 02 42 01  |.H.=......0...B.|
+000001f0  88 a2 4f eb e2 45 c5 48  7d 1b ac f5 ed 98 9d ae  |..O..E.H}.......|
+00000200  47 70 c0 5e 1b b6 2f bd  f1 b6 4d b7 61 40 d3 11  |Gp.^../...M.a@..|
+00000210  a2 ce ee 0b 7e 92 7e ff  76 9d c3 3b 7e a5 3f ce  |....~.~.v..;~.?.|
+00000220  fa 10 e2 59 ec 47 2d 7c  ac da 4e 97 0e 15 a0 6f  |...Y.G-|..N....o|
+00000230  d0 02 42 01 4d fc be 67  13 9c 2d 05 0e bd 3f a3  |..B.M..g..-...?.|
+00000240  8c 25 c1 33 13 83 0d 94  06 bb d4 37 7a f6 ec 7a  |.%.3.......7z..z|
+00000250  c9 86 2e dd d7 11 69 7f  85 7c 56 de fb 31 78 2b  |......i..|V..1x+|
+00000260  e4 c7 78 0d ae cb be 9e  4e 36 24 31 7b 6a 0f 39  |..x.....N6$1{j.9|
+00000270  95 12 07 8f 2a 16 03 03  00 b6 0c 00 00 b2 03 00  |....*...........|
+00000280  1d 20 b5 f3 76 c4 a9 33  34 2a 38 16 b1 38 f5 a1  |. ..v..34*8..8..|
+00000290  dc f7 60 67 32 cf 6b aa  82 0c b5 db 31 c4 b4 36  |..`g2.k.....1..6|
+000002a0  3e 16 04 03 00 8a 30 81  87 02 41 34 fc 19 0c 94  |>.....0...A4....|
+000002b0  d7 c3 9d ed ae 75 7a 20  b5 b0 93 69 85 8e 4b 20  |.....uz ...i..K |
+000002c0  27 03 83 12 12 8d d5 e4  cc 06 95 a7 dc 7c b2 dc  |'............|..|
+000002d0  71 6e 8c 18 89 4b fe 14  41 59 f7 af c8 1f d4 b8  |qn...K..AY......|
+000002e0  7b c4 1f cb 75 53 04 29  87 df 92 37 02 42 01 e7  |{...uS.)...7.B..|
+000002f0  c3 86 70 fa 8e 5e 21 16  52 0e 87 65 4a 69 aa ae  |..p..^!.R..eJi..|
+00000300  4c 4f 1e b5 91 17 24 b9  7d 18 7e 0f d0 db a5 33  |LO....$.}.~....3|
+00000310  19 7d 98 7b 5e 15 23 d2  8c 52 8d 17 56 08 60 d6  |.}.{^.#..R..V.`.|
+00000320  7c 2c 19 11 e1 d7 37 a7  b0 68 7b df 8c ae 3d 3e  ||,....7..h{...=>|
+00000330  16 03 03 00 3a 0d 00 00  36 03 01 02 40 00 2e 04  |....:...6...@...|
+00000340  03 05 03 06 03 08 07 08  08 08 09 08 0a 08 0b 08  |................|
+00000350  04 08 05 08 06 04 01 05  01 06 01 03 03 02 03 03  |................|
+00000360  01 02 01 03 02 02 02 04  02 05 02 06 02 00 00 16  |................|
+00000370  03 03 00 04 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|
@@ -108,32 +109,32 @@
 00000200  e4 fa cc b1 8a ce e2 23  a0 87 f0 e1 67 51 eb 16  |.......#....gQ..|
 00000210  03 03 00 25 10 00 00 21  20 2f e5 7d a3 47 cd 62  |...%...! /.}.G.b|
 00000220  43 15 28 da ac 5f bb 29  07 30 ff f6 84 af c4 cf  |C.(.._.).0......|
-00000230  c2 ed 90 99 5f 58 cb 3b  74 16 03 03 00 93 0f 00  |...._X.;t.......|
-00000240  00 8f 04 03 00 8b 30 81  88 02 42 01 cd 6b 44 a0  |......0...B..kD.|
-00000250  80 3b f5 5d f0 99 24 dd  89 94 b9 96 34 e7 04 e7  |.;.]..$.....4...|
-00000260  38 72 64 36 5a e9 ac bc  e3 54 1b 75 69 e2 de 03  |8rd6Z....T.ui...|
-00000270  ce a9 2c 76 92 dd 6b 31  0a 93 10 57 69 8b e0 cf  |..,v..k1...Wi...|
-00000280  7d 75 e4 e1 a9 d2 d3 29  b6 a7 ff 86 d4 02 42 01  |}u.....)......B.|
-00000290  e4 d9 31 56 23 62 e6 c2  2d 57 8a 6f d3 3f 1f 4d  |..1V#b..-W.o.?.M|
-000002a0  ca 0e c0 60 53 55 1f fb  56 24 22 82 c0 fe d9 0b  |...`SU..V$".....|
-000002b0  9b de fb f2 d4 a6 e4 98  9f 2c 07 07 01 83 ab 93  |.........,......|
-000002c0  3e c6 02 41 e9 8b 8d 95  eb cf b9 0f b5 fb 2c 9f  |>..A..........,.|
-000002d0  90 14 03 03 00 01 01 16  03 03 00 40 00 00 00 00  |...........@....|
-000002e0  00 00 00 00 00 00 00 00  00 00 00 00 aa 12 12 09  |................|
-000002f0  c5 08 94 28 8d 59 f3 68  cc 02 69 47 fa cf 9c 81  |...(.Y.h..iG....|
-00000300  a6 a5 b5 c7 e7 26 45 4a  59 67 ca 0a ed 6c 58 38  |.....&EJYg...lX8|
-00000310  23 12 48 a9 3c 0c 26 00  78 58 db 21              |#.H.<.&.xX.!|
+00000230  c2 ed 90 99 5f 58 cb 3b  74 16 03 03 00 92 0f 00  |...._X.;t.......|
+00000240  00 8e 04 03 00 8a 30 81  87 02 42 00 92 a9 5e 4b  |......0...B...^K|
+00000250  9d ee cc 03 2e 34 e8 5b  bd 7b 11 5a 25 00 80 a6  |.....4.[.{.Z%...|
+00000260  83 44 79 07 06 0d ba 0f  76 4d e9 40 50 52 9a c3  |.Dy.....vM.@PR..|
+00000270  24 43 e4 2a 2c 29 d8 da  78 af a4 ad b1 db 0f e6  |$C.*,)..x.......|
+00000280  29 a8 be ec d5 c9 79 4e  dc e6 6b 39 77 02 41 45  |).....yN..k9w.AE|
+00000290  be 07 99 32 88 da 0b 8c  33 48 91 78 2e 23 03 9a  |...2....3H.x.#..|
+000002a0  6a 92 b3 4c 82 c0 fd cf  0f 08 b5 19 f6 6d 21 95  |j..L.........m!.|
+000002b0  32 7a bc 6f 4b a8 01 b2  e2 a3 48 6c d0 ec 77 1c  |2z.oK.....Hl..w.|
+000002c0  30 83 f4 6c 12 a7 50 ea  de a3 6e 47 59 cc 0d 35  |0..l..P...nGY..5|
+000002d0  14 03 03 00 01 01 16 03  03 00 40 00 00 00 00 00  |..........@.....|
+000002e0  00 00 00 00 00 00 00 00  00 00 00 65 d3 93 a7 5f  |...........e..._|
+000002f0  ff 8c 1e 8f e5 9b 61 fe  df ac b6 9d e3 68 31 f8  |......a......h1.|
+00000300  2b d0 70 32 2a 07 13 fe  34 5d a2 ab 35 f1 4c 81  |+.p2*...4]..5.L.|
+00000310  28 34 50 0d 21 bc 4a a9  2d 90 c4                 |(4P.!.J.-..|
 >>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 40 5a 63 b1 0f 47  |..........@Zc..G|
-00000010  76 ac c4 69 62 82 63 77  8b 26 7b a9 8a 7d 3d fe  |v..ib.cw.&{..}=.|
-00000020  4a 04 b4 80 17 cc be 5e  9e b2 5d a3 2d 48 85 44  |J......^..].-H.D|
-00000030  7d db 62 77 31 27 18 b1  55 61 b3 64 6c d6 39 f7  |}.bw1'..Ua.dl.9.|
-00000040  f2 fe 7c 73 c8 3f 31 c9  78 83 8c                 |..|s.?1.x..|
+00000000  14 03 03 00 01 01 16 03  03 00 40 49 93 f4 1d 25  |..........@I...%|
+00000010  62 e3 5d 46 a2 ae 3d d2  4c 35 a9 06 f0 e1 ca d7  |b.]F..=.L5......|
+00000020  43 c1 96 27 96 ce d1 f6  d5 07 cc ec 6a 4a 96 c6  |C..'........jJ..|
+00000030  1f 89 14 ff 15 6f 79 bc  90 3e fd 63 ed 21 69 95  |.....oy..>.c.!i.|
+00000040  91 a1 08 4a 7e e6 f0 5d  e6 ae b6                 |...J~..]...|
 >>> 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 b9 a3 b6  37 76 c9 69 20 8d 97 e3  |........7v.i ...|
-00000020  0d f1 6e d4 6d 79 0b 64  4f a5 0d 30 ff 1c cd 56  |..n.my.dO..0...V|
-00000030  e7 ce 69 a6 48 15 03 03  00 30 00 00 00 00 00 00  |..i.H....0......|
-00000040  00 00 00 00 00 00 00 00  00 00 c6 3c 3b f2 09 05  |...........<;...|
-00000050  2c 4d 07 4f 95 34 29 ec  ef 3b b5 31 c6 a4 91 5e  |,M.O.4)..;.1...^|
-00000060  14 20 5b c5 34 19 f9 1d  22 63                    |. [.4..."c|
+00000010  00 00 00 00 00 88 36 f6  a8 b4 e5 b6 58 ec 9b 08  |......6.....X...|
+00000020  6f bf 5a 7c f1 b5 81 b2  6b 93 f2 35 40 34 89 61  |o.Z|....k..5@4.a|
+00000030  a9 ef 6d fe 2c 15 03 03  00 30 00 00 00 00 00 00  |..m.,....0......|
+00000040  00 00 00 00 00 00 00 00  00 00 97 6d 99 d3 e5 8b  |...........m....|
+00000050  54 93 b6 fd 3f ec 6e 03  03 4e 04 39 35 2c bb 10  |T...?.n..N.95,..|
+00000060  02 d0 8d 48 4e 56 1a e5  98 97                    |...HNV....|
diff --git a/src/crypto/tls/testdata/Client-TLSv12-ClientCert-ECDSA-RSA b/src/crypto/tls/testdata/Client-TLSv12-ClientCert-ECDSA-RSA
index 36bddc2..b7323e5 100644
--- a/src/crypto/tls/testdata/Client-TLSv12-ClientCert-ECDSA-RSA
+++ b/src/crypto/tls/testdata/Client-TLSv12-ClientCert-ECDSA-RSA
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fe 01 00 00  fa 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 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,75 +7,76 @@
 00000050  cc a8 c0 2b c0 2f c0 2c  c0 30 c0 09 c0 13 c0 0a  |...+./.,.0......|
 00000060  c0 14 00 9c 00 9d 00 2f  00 35 c0 12 00 0a c0 23  |......./.5.....#|
 00000070  c0 27 00 3c c0 07 c0 11  00 05 13 03 13 01 13 02  |.'.<............|
-00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
+00000080  01 00 00 7f 00 05 00 05  01 00 00 00 00 00 0a 00  |................|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
 000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
 000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
-000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
-000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
-000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
-000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
+000000c0  01 00 01 00 00 17 00 00  00 12 00 00 00 2b 00 09  |.............+..|
+000000d0  08 03 04 03 03 03 02 03  01 00 33 00 26 00 24 00  |..........3.&.$.|
+000000e0  1d 00 20 2f e5 7d a3 47  cd 62 43 15 28 da ac 5f  |.. /.}.G.bC.(.._|
+000000f0  bb 29 07 30 ff f6 84 af  c4 cf c2 ed 90 99 5f 58  |.).0.........._X|
+00000100  cb 3b 74                                          |.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 59 02 00 00  55 03 03 b8 f6 b1 71 c5  |....Y...U.....q.|
-00000010  d0 3f 36 fb 8a b9 15 35  ae c5 08 8e eb c6 d5 ad  |.?6....5........|
-00000020  a1 8a ff 65 2e 78 f5 2a  2b cb f7 20 26 1e c1 94  |...e.x.*+.. &...|
-00000030  85 a9 b1 ca 8d 5f 3f 00  6a 44 c9 ed 28 36 97 f2  |....._?.jD..(6..|
-00000040  7d 38 0a 56 75 a2 12 ac  34 ed 7e 14 c0 2f 00 00  |}8.Vu...4.~../..|
-00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
-00000060  03 02 59 0b 00 02 55 00  02 52 00 02 4f 30 82 02  |..Y...U..R..O0..|
-00000070  4b 30 82 01 b4 a0 03 02  01 02 02 09 00 e8 f0 9d  |K0..............|
-00000080  3f e2 5b ea a6 30 0d 06  09 2a 86 48 86 f7 0d 01  |?.[..0...*.H....|
-00000090  01 0b 05 00 30 1f 31 0b  30 09 06 03 55 04 0a 13  |....0.1.0...U...|
-000000a0  02 47 6f 31 10 30 0e 06  03 55 04 03 13 07 47 6f  |.Go1.0...U....Go|
-000000b0  20 52 6f 6f 74 30 1e 17  0d 31 36 30 31 30 31 30  | Root0...1601010|
-000000c0  30 30 30 30 30 5a 17 0d  32 35 30 31 30 31 30 30  |00000Z..25010100|
-000000d0  30 30 30 30 5a 30 1a 31  0b 30 09 06 03 55 04 0a  |0000Z0.1.0...U..|
-000000e0  13 02 47 6f 31 0b 30 09  06 03 55 04 03 13 02 47  |..Go1.0...U....G|
-000000f0  6f 30 81 9f 30 0d 06 09  2a 86 48 86 f7 0d 01 01  |o0..0...*.H.....|
-00000100  01 05 00 03 81 8d 00 30  81 89 02 81 81 00 db 46  |.......0.......F|
-00000110  7d 93 2e 12 27 06 48 bc  06 28 21 ab 7e c4 b6 a2  |}...'.H..(!.~...|
-00000120  5d fe 1e 52 45 88 7a 36  47 a5 08 0d 92 42 5b c2  |]..RE.z6G....B[.|
-00000130  81 c0 be 97 79 98 40 fb  4f 6d 14 fd 2b 13 8b c2  |....y.@.Om..+...|
-00000140  a5 2e 67 d8 d4 09 9e d6  22 38 b7 4a 0b 74 73 2b  |..g....."8.J.ts+|
-00000150  c2 34 f1 d1 93 e5 96 d9  74 7b f3 58 9f 6c 61 3c  |.4......t{.X.la<|
-00000160  c0 b0 41 d4 d9 2b 2b 24  23 77 5b 1c 3b bd 75 5d  |..A..++$#w[.;.u]|
-00000170  ce 20 54 cf a1 63 87 1d  1e 24 c4 f3 1d 1a 50 8b  |. T..c...$....P.|
-00000180  aa b6 14 43 ed 97 a7 75  62 f4 14 c8 52 d7 02 03  |...C...ub...R...|
-00000190  01 00 01 a3 81 93 30 81  90 30 0e 06 03 55 1d 0f  |......0..0...U..|
-000001a0  01 01 ff 04 04 03 02 05  a0 30 1d 06 03 55 1d 25  |.........0...U.%|
-000001b0  04 16 30 14 06 08 2b 06  01 05 05 07 03 01 06 08  |..0...+.........|
-000001c0  2b 06 01 05 05 07 03 02  30 0c 06 03 55 1d 13 01  |+.......0...U...|
-000001d0  01 ff 04 02 30 00 30 19  06 03 55 1d 0e 04 12 04  |....0.0...U.....|
-000001e0  10 9f 91 16 1f 43 43 3e  49 a6 de 6d b6 80 d7 9f  |.....CC>I..m....|
-000001f0  60 30 1b 06 03 55 1d 23  04 14 30 12 80 10 48 13  |`0...U.#..0...H.|
-00000200  49 4d 13 7e 16 31 bb a3  01 d5 ac ab 6e 7b 30 19  |IM.~.1......n{0.|
-00000210  06 03 55 1d 11 04 12 30  10 82 0e 65 78 61 6d 70  |..U....0...examp|
-00000220  6c 65 2e 67 6f 6c 61 6e  67 30 0d 06 09 2a 86 48  |le.golang0...*.H|
-00000230  86 f7 0d 01 01 0b 05 00  03 81 81 00 9d 30 cc 40  |.............0.@|
-00000240  2b 5b 50 a0 61 cb ba e5  53 58 e1 ed 83 28 a9 58  |+[P.a...SX...(.X|
-00000250  1a a9 38 a4 95 a1 ac 31  5a 1a 84 66 3d 43 d3 2d  |..8....1Z..f=C.-|
-00000260  d9 0b f2 97 df d3 20 64  38 92 24 3a 00 bc cf 9c  |...... d8.$:....|
-00000270  7d b7 40 20 01 5f aa d3  16 61 09 a2 76 fd 13 c3  |}.@ ._...a..v...|
-00000280  cc e1 0c 5c ee b1 87 82  f1 6c 04 ed 73 bb b3 43  |...\.....l..s..C|
-00000290  77 8d 0c 1c f1 0f a1 d8  40 83 61 c9 4c 72 2b 9d  |w.......@.a.Lr+.|
-000002a0  ae db 46 06 06 4d f4 c1  b3 3e c0 d1 bd 42 d4 db  |..F..M...>...B..|
-000002b0  fe 3d 13 60 84 5c 21 d3  3b e9 fa e7 16 03 03 00  |.=.`.\!.;.......|
-000002c0  ac 0c 00 00 a8 03 00 1d  20 9d 82 84 ba 8e 4b 7e  |........ .....K~|
-000002d0  bc f4 8e ab c1 31 68 42  cb 36 1d 64 60 55 74 11  |.....1hB.6.d`Ut.|
-000002e0  cf 63 d2 f4 c9 e7 a9 bf  7b 08 04 00 80 ce b2 06  |.c......{.......|
-000002f0  a3 54 1e fd f7 c4 a6 54  40 ea 74 8c e0 de ec aa  |.T.....T@.t.....|
-00000300  30 66 c3 e4 a9 7f 86 cc  f7 34 6b 55 a4 97 fd 6e  |0f.......4kU...n|
-00000310  3b 1f c4 e9 17 3c 6d 94  66 78 e0 1a ab 41 64 9b  |;....<m.fx...Ad.|
-00000320  2b 2e 14 99 96 68 aa ef  97 65 ea e7 72 28 9c 0f  |+....h...e..r(..|
-00000330  f9 11 57 b7 1f 31 54 87  1a 36 45 ec c1 0f 72 53  |..W..1T..6E...rS|
-00000340  56 a1 8d e4 d0 93 3e bb  77 8a 32 bd fb 07 0b ce  |V.....>.w.2.....|
-00000350  82 d3 a1 ab 6f 80 ac ac  4e da b7 7f 84 fe 3f 26  |....o...N.....?&|
-00000360  f4 d9 b9 b6 2b 68 1a cc  ef 31 97 22 bf 16 03 03  |....+h...1."....|
-00000370  00 3a 0d 00 00 36 03 01  02 40 00 2e 04 03 05 03  |.:...6...@......|
-00000380  06 03 08 07 08 08 08 09  08 0a 08 0b 08 04 08 05  |................|
-00000390  08 06 04 01 05 01 06 01  03 03 02 03 03 01 02 01  |................|
-000003a0  03 02 02 02 04 02 05 02  06 02 00 00 16 03 03 00  |................|
-000003b0  04 0e 00 00 00                                    |.....|
+00000000  16 03 03 00 5d 02 00 00  59 03 03 75 bb 71 f8 35  |....]...Y..u.q.5|
+00000010  6c a2 b1 c8 b1 a1 dc 40  01 bc e7 0c 8c 22 90 2c  |l......@.....".,|
+00000020  aa 34 d3 d2 c8 b1 96 3b  bf 4a bf 20 b3 2a f7 96  |.4.....;.J. .*..|
+00000030  9d 79 53 4b 64 b2 80 4d  0e ab f8 3d cd 82 2d 78  |.ySKd..M...=..-x|
+00000040  47 8e cd 9b 14 8c 1e 6d  0e 52 7b db c0 2f 00 00  |G......m.R{../..|
+00000050  11 ff 01 00 01 00 00 0b  00 04 03 00 01 02 00 17  |................|
+00000060  00 00 16 03 03 02 59 0b  00 02 55 00 02 52 00 02  |......Y...U..R..|
+00000070  4f 30 82 02 4b 30 82 01  b4 a0 03 02 01 02 02 09  |O0..K0..........|
+00000080  00 e8 f0 9d 3f e2 5b ea  a6 30 0d 06 09 2a 86 48  |....?.[..0...*.H|
+00000090  86 f7 0d 01 01 0b 05 00  30 1f 31 0b 30 09 06 03  |........0.1.0...|
+000000a0  55 04 0a 13 02 47 6f 31  10 30 0e 06 03 55 04 03  |U....Go1.0...U..|
+000000b0  13 07 47 6f 20 52 6f 6f  74 30 1e 17 0d 31 36 30  |..Go Root0...160|
+000000c0  31 30 31 30 30 30 30 30  30 5a 17 0d 32 35 30 31  |101000000Z..2501|
+000000d0  30 31 30 30 30 30 30 30  5a 30 1a 31 0b 30 09 06  |01000000Z0.1.0..|
+000000e0  03 55 04 0a 13 02 47 6f  31 0b 30 09 06 03 55 04  |.U....Go1.0...U.|
+000000f0  03 13 02 47 6f 30 81 9f  30 0d 06 09 2a 86 48 86  |...Go0..0...*.H.|
+00000100  f7 0d 01 01 01 05 00 03  81 8d 00 30 81 89 02 81  |...........0....|
+00000110  81 00 db 46 7d 93 2e 12  27 06 48 bc 06 28 21 ab  |...F}...'.H..(!.|
+00000120  7e c4 b6 a2 5d fe 1e 52  45 88 7a 36 47 a5 08 0d  |~...]..RE.z6G...|
+00000130  92 42 5b c2 81 c0 be 97  79 98 40 fb 4f 6d 14 fd  |.B[.....y.@.Om..|
+00000140  2b 13 8b c2 a5 2e 67 d8  d4 09 9e d6 22 38 b7 4a  |+.....g....."8.J|
+00000150  0b 74 73 2b c2 34 f1 d1  93 e5 96 d9 74 7b f3 58  |.ts+.4......t{.X|
+00000160  9f 6c 61 3c c0 b0 41 d4  d9 2b 2b 24 23 77 5b 1c  |.la<..A..++$#w[.|
+00000170  3b bd 75 5d ce 20 54 cf  a1 63 87 1d 1e 24 c4 f3  |;.u]. T..c...$..|
+00000180  1d 1a 50 8b aa b6 14 43  ed 97 a7 75 62 f4 14 c8  |..P....C...ub...|
+00000190  52 d7 02 03 01 00 01 a3  81 93 30 81 90 30 0e 06  |R.........0..0..|
+000001a0  03 55 1d 0f 01 01 ff 04  04 03 02 05 a0 30 1d 06  |.U...........0..|
+000001b0  03 55 1d 25 04 16 30 14  06 08 2b 06 01 05 05 07  |.U.%..0...+.....|
+000001c0  03 01 06 08 2b 06 01 05  05 07 03 02 30 0c 06 03  |....+.......0...|
+000001d0  55 1d 13 01 01 ff 04 02  30 00 30 19 06 03 55 1d  |U.......0.0...U.|
+000001e0  0e 04 12 04 10 9f 91 16  1f 43 43 3e 49 a6 de 6d  |.........CC>I..m|
+000001f0  b6 80 d7 9f 60 30 1b 06  03 55 1d 23 04 14 30 12  |....`0...U.#..0.|
+00000200  80 10 48 13 49 4d 13 7e  16 31 bb a3 01 d5 ac ab  |..H.IM.~.1......|
+00000210  6e 7b 30 19 06 03 55 1d  11 04 12 30 10 82 0e 65  |n{0...U....0...e|
+00000220  78 61 6d 70 6c 65 2e 67  6f 6c 61 6e 67 30 0d 06  |xample.golang0..|
+00000230  09 2a 86 48 86 f7 0d 01  01 0b 05 00 03 81 81 00  |.*.H............|
+00000240  9d 30 cc 40 2b 5b 50 a0  61 cb ba e5 53 58 e1 ed  |.0.@+[P.a...SX..|
+00000250  83 28 a9 58 1a a9 38 a4  95 a1 ac 31 5a 1a 84 66  |.(.X..8....1Z..f|
+00000260  3d 43 d3 2d d9 0b f2 97  df d3 20 64 38 92 24 3a  |=C.-...... d8.$:|
+00000270  00 bc cf 9c 7d b7 40 20  01 5f aa d3 16 61 09 a2  |....}.@ ._...a..|
+00000280  76 fd 13 c3 cc e1 0c 5c  ee b1 87 82 f1 6c 04 ed  |v......\.....l..|
+00000290  73 bb b3 43 77 8d 0c 1c  f1 0f a1 d8 40 83 61 c9  |s..Cw.......@.a.|
+000002a0  4c 72 2b 9d ae db 46 06  06 4d f4 c1 b3 3e c0 d1  |Lr+...F..M...>..|
+000002b0  bd 42 d4 db fe 3d 13 60  84 5c 21 d3 3b e9 fa e7  |.B...=.`.\!.;...|
+000002c0  16 03 03 00 ac 0c 00 00  a8 03 00 1d 20 f1 7e d0  |............ .~.|
+000002d0  74 5c 5a ab 67 9d 3e ad  b5 4a 07 22 4a b7 3c e5  |t\Z.g.>..J."J.<.|
+000002e0  dd 4a 1f ba 33 b5 73 91  87 2a ef 5d 2b 08 04 00  |.J..3.s..*.]+...|
+000002f0  80 d7 78 82 c0 ee 54 02  e8 69 66 94 4b 92 74 0b  |..x...T..if.K.t.|
+00000300  be 72 05 ef 78 e2 60 c0  72 3a 09 42 4b d3 0d a0  |.r..x.`.r:.BK...|
+00000310  8b 50 b2 48 33 e4 d2 9f  64 4b 81 8c 5a c4 ad 8d  |.P.H3...dK..Z...|
+00000320  52 7c c4 79 10 1c df a8  80 bc 91 bc a7 5e b9 87  |R|.y.........^..|
+00000330  8c 68 63 41 dc 95 b0 b7  65 c4 e8 54 39 ce 2b f8  |.hcA....e..T9.+.|
+00000340  36 76 7f d1 1f ec 84 2b  08 63 10 d0 3c c0 4a 61  |6v.....+.c..<.Ja|
+00000350  5f 74 6a e2 94 93 82 e9  4f 81 bf 93 65 e8 09 06  |_tj.....O...e...|
+00000360  b6 61 14 ed 1a e0 52 f7  4f 08 2d 93 1e 1a 83 e2  |.a....R.O.-.....|
+00000370  17 16 03 03 00 3a 0d 00  00 36 03 01 02 40 00 2e  |.....:...6...@..|
+00000380  04 03 05 03 06 03 08 07  08 08 08 09 08 0a 08 0b  |................|
+00000390  08 04 08 05 08 06 04 01  05 01 06 01 03 03 02 03  |................|
+000003a0  03 01 02 01 03 02 02 02  04 02 05 02 06 02 00 00  |................|
+000003b0  16 03 03 00 04 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|
@@ -113,27 +114,27 @@
 00000210  03 03 00 25 10 00 00 21  20 2f e5 7d a3 47 cd 62  |...%...! /.}.G.b|
 00000220  43 15 28 da ac 5f bb 29  07 30 ff f6 84 af c4 cf  |C.(.._.).0......|
 00000230  c2 ed 90 99 5f 58 cb 3b  74 16 03 03 00 93 0f 00  |...._X.;t.......|
-00000240  00 8f 04 03 00 8b 30 81  88 02 42 01 d0 ef 2f 75  |......0...B.../u|
-00000250  25 6e 4b 2a 16 21 c4 73  59 80 a8 c9 27 45 1b 06  |%nK*.!.sY...'E..|
-00000260  75 20 61 01 db aa c4 90  25 16 1b fb ec 92 54 f7  |u a.....%.....T.|
-00000270  16 9b 8c e0 34 48 3e 62  57 92 99 42 7f d1 35 09  |....4H>bW..B..5.|
-00000280  e1 55 4c 32 cc ed 9d 3e  18 25 1d 31 b8 02 42 01  |.UL2...>.%.1..B.|
-00000290  dd d8 20 b1 12 a2 7d 3b  6b 40 f3 db 59 2b 33 db  |.. ...};k@..Y+3.|
-000002a0  5f 85 4d b4 5f 6f 23 ae  d2 a2 74 2b 22 94 60 51  |_.M._o#...t+".`Q|
-000002b0  75 aa 66 88 2f 5a db f5  91 b2 7c f4 c4 e9 25 fa  |u.f./Z....|...%.|
-000002c0  f7 74 20 00 c3 08 22 8e  88 28 1c 72 4b 36 cd 03  |.t ..."..(.rK6..|
-000002d0  46 14 03 03 00 01 01 16  03 03 00 28 00 00 00 00  |F..........(....|
-000002e0  00 00 00 00 2c 30 d5 ee  d2 79 8c 68 62 7a c7 36  |....,0...y.hbz.6|
-000002f0  ce c9 39 25 4b 6d 3e 59  7d 42 21 72 65 00 41 45  |..9%Km>Y}B!re.AE|
-00000300  ba 47 88 64                                       |.G.d|
+00000240  00 8f 04 03 00 8b 30 81  88 02 42 01 8a 49 56 8a  |......0...B..IV.|
+00000250  3d 09 db 5b ae 29 2f 93  04 b1 7a 80 95 5c 30 4b  |=..[.)/...z..\0K|
+00000260  9a 90 5a 64 3d 12 72 03  7a 8f 4d 40 a8 b0 fd d3  |..Zd=.r.z.M@....|
+00000270  2d e5 3f a4 ce 97 34 e6  e4 23 4f 0b 00 7c 89 8e  |-.?...4..#O..|..|
+00000280  f2 37 14 a8 50 d3 d6 ec  99 f2 ff c6 8e 02 42 01  |.7..P.........B.|
+00000290  75 ba 90 7c 16 88 9f 93  73 2a ec e8 e0 53 82 6c  |u..|....s*...S.l|
+000002a0  85 a9 1f 42 7e a2 db 55  e9 cd a7 b0 b2 c6 a2 38  |...B~..U.......8|
+000002b0  14 75 ea 91 2f 10 c7 0a  f4 98 14 c7 a4 71 72 af  |.u../........qr.|
+000002c0  d1 b3 2b 86 a7 25 97 5f  de 5a c3 79 fe 44 42 b1  |..+..%._.Z.y.DB.|
+000002d0  dd 14 03 03 00 01 01 16  03 03 00 28 00 00 00 00  |...........(....|
+000002e0  00 00 00 00 a8 a3 81 5b  57 fb 9e 15 5a aa 77 1c  |.......[W...Z.w.|
+000002f0  39 cb 84 05 dc 58 2e 65  3c 25 b2 46 9a b3 17 a4  |9....X.e<%.F....|
+00000300  2f 6c ae fb                                       |/l..|
 >>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 28 9c e9 30 06 da  |..........(..0..|
-00000010  ef 89 4a 77 db 17 d4 51  79 36 c1 97 45 8a b0 c9  |..Jw...Qy6..E...|
-00000020  b7 d4 69 8d fc f2 5e 1a  c8 e3 43 6c 7a b4 0a 40  |..i...^...Clz..@|
-00000030  ec 35 c9                                          |.5.|
+00000000  14 03 03 00 01 01 16 03  03 00 28 fd 91 33 fe 0c  |..........(..3..|
+00000010  f3 cf d7 9d b0 d1 e7 63  ea 06 f7 93 d3 f5 cd 33  |.......c.......3|
+00000020  32 ac 94 78 8e 15 ac 57  c9 b4 44 36 97 96 8d f1  |2..x...W..D6....|
+00000030  c3 20 0d                                          |. .|
 >>> Flow 5 (client to server)
-00000000  17 03 03 00 1e 00 00 00  00 00 00 00 01 f2 3b 7e  |..............;~|
-00000010  59 d0 c1 2f 93 f8 8a 48  8d e6 f4 54 70 63 4a 2d  |Y../...H...TpcJ-|
-00000020  90 5d 9b 15 03 03 00 1a  00 00 00 00 00 00 00 02  |.]..............|
-00000030  42 1f 5c b2 d3 14 4d 6e  30 85 59 89 5a 34 80 00  |B.\...Mn0.Y.Z4..|
-00000040  fe ab                                             |..|
+00000000  17 03 03 00 1e 00 00 00  00 00 00 00 01 99 85 0f  |................|
+00000010  d6 6c 5e b9 55 12 d5 b5  93 a8 b8 85 cb 0b 8f cd  |.l^.U...........|
+00000020  f5 fc a1 15 03 03 00 1a  00 00 00 00 00 00 00 02  |................|
+00000030  e3 c0 5e 6a 72 6c 2d 5a  4c 94 0d 1e 77 85 ef 4a  |..^jrl-ZL...w..J|
+00000040  90 a5                                             |..|
diff --git a/src/crypto/tls/testdata/Client-TLSv12-ClientCert-Ed25519 b/src/crypto/tls/testdata/Client-TLSv12-ClientCert-Ed25519
index 9ecd8e3..c683f6d 100644
--- a/src/crypto/tls/testdata/Client-TLSv12-ClientCert-Ed25519
+++ b/src/crypto/tls/testdata/Client-TLSv12-ClientCert-Ed25519
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fe 01 00 00  fa 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 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,75 +7,76 @@
 00000050  cc a8 c0 2b c0 2f c0 2c  c0 30 c0 09 c0 13 c0 0a  |...+./.,.0......|
 00000060  c0 14 00 9c 00 9d 00 2f  00 35 c0 12 00 0a c0 23  |......./.5.....#|
 00000070  c0 27 00 3c c0 07 c0 11  00 05 13 03 13 01 13 02  |.'.<............|
-00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
+00000080  01 00 00 7f 00 05 00 05  01 00 00 00 00 00 0a 00  |................|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
 000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
 000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
-000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
-000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
-000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
-000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
+000000c0  01 00 01 00 00 17 00 00  00 12 00 00 00 2b 00 09  |.............+..|
+000000d0  08 03 04 03 03 03 02 03  01 00 33 00 26 00 24 00  |..........3.&.$.|
+000000e0  1d 00 20 2f e5 7d a3 47  cd 62 43 15 28 da ac 5f  |.. /.}.G.bC.(.._|
+000000f0  bb 29 07 30 ff f6 84 af  c4 cf c2 ed 90 99 5f 58  |.).0.........._X|
+00000100  cb 3b 74                                          |.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 59 02 00 00  55 03 03 5c 37 b1 d2 6c  |....Y...U..\7..l|
-00000010  bc dd 26 8c 4e f7 04 80  09 3c fd 76 23 d4 52 16  |..&.N....<.v#.R.|
-00000020  df 0e 79 ab f4 cf 8c f3  61 31 c6 20 7d 7a 1d 8f  |..y.....a1. }z..|
-00000030  09 3e 2b 25 04 7f 0f 0a  a7 0c 03 fd 9c 09 f3 5d  |.>+%...........]|
-00000040  96 75 f8 da 5b 6b 1b fb  ca d7 ec 7a cc a8 00 00  |.u..[k.....z....|
-00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
-00000060  03 02 59 0b 00 02 55 00  02 52 00 02 4f 30 82 02  |..Y...U..R..O0..|
-00000070  4b 30 82 01 b4 a0 03 02  01 02 02 09 00 e8 f0 9d  |K0..............|
-00000080  3f e2 5b ea a6 30 0d 06  09 2a 86 48 86 f7 0d 01  |?.[..0...*.H....|
-00000090  01 0b 05 00 30 1f 31 0b  30 09 06 03 55 04 0a 13  |....0.1.0...U...|
-000000a0  02 47 6f 31 10 30 0e 06  03 55 04 03 13 07 47 6f  |.Go1.0...U....Go|
-000000b0  20 52 6f 6f 74 30 1e 17  0d 31 36 30 31 30 31 30  | Root0...1601010|
-000000c0  30 30 30 30 30 5a 17 0d  32 35 30 31 30 31 30 30  |00000Z..25010100|
-000000d0  30 30 30 30 5a 30 1a 31  0b 30 09 06 03 55 04 0a  |0000Z0.1.0...U..|
-000000e0  13 02 47 6f 31 0b 30 09  06 03 55 04 03 13 02 47  |..Go1.0...U....G|
-000000f0  6f 30 81 9f 30 0d 06 09  2a 86 48 86 f7 0d 01 01  |o0..0...*.H.....|
-00000100  01 05 00 03 81 8d 00 30  81 89 02 81 81 00 db 46  |.......0.......F|
-00000110  7d 93 2e 12 27 06 48 bc  06 28 21 ab 7e c4 b6 a2  |}...'.H..(!.~...|
-00000120  5d fe 1e 52 45 88 7a 36  47 a5 08 0d 92 42 5b c2  |]..RE.z6G....B[.|
-00000130  81 c0 be 97 79 98 40 fb  4f 6d 14 fd 2b 13 8b c2  |....y.@.Om..+...|
-00000140  a5 2e 67 d8 d4 09 9e d6  22 38 b7 4a 0b 74 73 2b  |..g....."8.J.ts+|
-00000150  c2 34 f1 d1 93 e5 96 d9  74 7b f3 58 9f 6c 61 3c  |.4......t{.X.la<|
-00000160  c0 b0 41 d4 d9 2b 2b 24  23 77 5b 1c 3b bd 75 5d  |..A..++$#w[.;.u]|
-00000170  ce 20 54 cf a1 63 87 1d  1e 24 c4 f3 1d 1a 50 8b  |. T..c...$....P.|
-00000180  aa b6 14 43 ed 97 a7 75  62 f4 14 c8 52 d7 02 03  |...C...ub...R...|
-00000190  01 00 01 a3 81 93 30 81  90 30 0e 06 03 55 1d 0f  |......0..0...U..|
-000001a0  01 01 ff 04 04 03 02 05  a0 30 1d 06 03 55 1d 25  |.........0...U.%|
-000001b0  04 16 30 14 06 08 2b 06  01 05 05 07 03 01 06 08  |..0...+.........|
-000001c0  2b 06 01 05 05 07 03 02  30 0c 06 03 55 1d 13 01  |+.......0...U...|
-000001d0  01 ff 04 02 30 00 30 19  06 03 55 1d 0e 04 12 04  |....0.0...U.....|
-000001e0  10 9f 91 16 1f 43 43 3e  49 a6 de 6d b6 80 d7 9f  |.....CC>I..m....|
-000001f0  60 30 1b 06 03 55 1d 23  04 14 30 12 80 10 48 13  |`0...U.#..0...H.|
-00000200  49 4d 13 7e 16 31 bb a3  01 d5 ac ab 6e 7b 30 19  |IM.~.1......n{0.|
-00000210  06 03 55 1d 11 04 12 30  10 82 0e 65 78 61 6d 70  |..U....0...examp|
-00000220  6c 65 2e 67 6f 6c 61 6e  67 30 0d 06 09 2a 86 48  |le.golang0...*.H|
-00000230  86 f7 0d 01 01 0b 05 00  03 81 81 00 9d 30 cc 40  |.............0.@|
-00000240  2b 5b 50 a0 61 cb ba e5  53 58 e1 ed 83 28 a9 58  |+[P.a...SX...(.X|
-00000250  1a a9 38 a4 95 a1 ac 31  5a 1a 84 66 3d 43 d3 2d  |..8....1Z..f=C.-|
-00000260  d9 0b f2 97 df d3 20 64  38 92 24 3a 00 bc cf 9c  |...... d8.$:....|
-00000270  7d b7 40 20 01 5f aa d3  16 61 09 a2 76 fd 13 c3  |}.@ ._...a..v...|
-00000280  cc e1 0c 5c ee b1 87 82  f1 6c 04 ed 73 bb b3 43  |...\.....l..s..C|
-00000290  77 8d 0c 1c f1 0f a1 d8  40 83 61 c9 4c 72 2b 9d  |w.......@.a.Lr+.|
-000002a0  ae db 46 06 06 4d f4 c1  b3 3e c0 d1 bd 42 d4 db  |..F..M...>...B..|
-000002b0  fe 3d 13 60 84 5c 21 d3  3b e9 fa e7 16 03 03 00  |.=.`.\!.;.......|
-000002c0  ac 0c 00 00 a8 03 00 1d  20 aa c7 43 e7 1e 3b 2b  |........ ..C..;+|
-000002d0  28 c2 68 aa 83 cc 85 63  68 c4 b8 4d fb 18 fa b9  |(.h....ch..M....|
-000002e0  3e 9a f2 7c 04 33 7f 48  6b 08 04 00 80 28 28 c7  |>..|.3.Hk....((.|
-000002f0  84 79 65 11 07 43 7a ce  f1 d6 cb 0e fe 6a 24 2c  |.ye..Cz......j$,|
-00000300  f3 f0 e5 9c 80 a6 c7 41  c7 51 f2 84 be 6e 58 df  |.......A.Q...nX.|
-00000310  f2 d2 d4 d9 62 08 c8 35  75 b9 8e 49 c2 98 b0 9d  |....b..5u..I....|
-00000320  32 aa db bf 03 c1 61 83  f7 20 d7 ec 07 27 5e 45  |2.....a.. ...'^E|
-00000330  dc d6 92 4c a1 4f 4e 7c  53 c5 ca 42 48 40 0f 83  |...L.ON|S..BH@..|
-00000340  fc 9d 60 a1 7c 43 d1 f5  f8 3f fe 50 3f d0 03 bc  |..`.|C...?.P?...|
-00000350  3e 8b ac 69 8f ae b6 9a  c8 d4 98 84 30 f1 79 9b  |>..i........0.y.|
-00000360  af 5d 4e 41 2a 7c 46 22  df 46 42 74 f6 16 03 03  |.]NA*|F".FBt....|
-00000370  00 3a 0d 00 00 36 03 01  02 40 00 2e 04 03 05 03  |.:...6...@......|
-00000380  06 03 08 07 08 08 08 09  08 0a 08 0b 08 04 08 05  |................|
-00000390  08 06 04 01 05 01 06 01  03 03 02 03 03 01 02 01  |................|
-000003a0  03 02 02 02 04 02 05 02  06 02 00 00 16 03 03 00  |................|
-000003b0  04 0e 00 00 00                                    |.....|
+00000000  16 03 03 00 5d 02 00 00  59 03 03 6c b5 d2 af 6d  |....]...Y..l...m|
+00000010  6d 09 3b 84 5c 76 fc 25  81 84 b9 07 01 e9 54 cc  |m.;.\v.%......T.|
+00000020  4f 3f ab da ef 02 e7 59  8a e6 10 20 f9 72 db 0c  |O?.....Y... .r..|
+00000030  a4 c6 29 f6 ce 25 04 5d  af 3c 0f fa 97 28 ee 43  |..)..%.].<...(.C|
+00000040  b1 e5 5f 0a 42 36 2b 63  06 7d d0 de cc a8 00 00  |.._.B6+c.}......|
+00000050  11 ff 01 00 01 00 00 0b  00 04 03 00 01 02 00 17  |................|
+00000060  00 00 16 03 03 02 59 0b  00 02 55 00 02 52 00 02  |......Y...U..R..|
+00000070  4f 30 82 02 4b 30 82 01  b4 a0 03 02 01 02 02 09  |O0..K0..........|
+00000080  00 e8 f0 9d 3f e2 5b ea  a6 30 0d 06 09 2a 86 48  |....?.[..0...*.H|
+00000090  86 f7 0d 01 01 0b 05 00  30 1f 31 0b 30 09 06 03  |........0.1.0...|
+000000a0  55 04 0a 13 02 47 6f 31  10 30 0e 06 03 55 04 03  |U....Go1.0...U..|
+000000b0  13 07 47 6f 20 52 6f 6f  74 30 1e 17 0d 31 36 30  |..Go Root0...160|
+000000c0  31 30 31 30 30 30 30 30  30 5a 17 0d 32 35 30 31  |101000000Z..2501|
+000000d0  30 31 30 30 30 30 30 30  5a 30 1a 31 0b 30 09 06  |01000000Z0.1.0..|
+000000e0  03 55 04 0a 13 02 47 6f  31 0b 30 09 06 03 55 04  |.U....Go1.0...U.|
+000000f0  03 13 02 47 6f 30 81 9f  30 0d 06 09 2a 86 48 86  |...Go0..0...*.H.|
+00000100  f7 0d 01 01 01 05 00 03  81 8d 00 30 81 89 02 81  |...........0....|
+00000110  81 00 db 46 7d 93 2e 12  27 06 48 bc 06 28 21 ab  |...F}...'.H..(!.|
+00000120  7e c4 b6 a2 5d fe 1e 52  45 88 7a 36 47 a5 08 0d  |~...]..RE.z6G...|
+00000130  92 42 5b c2 81 c0 be 97  79 98 40 fb 4f 6d 14 fd  |.B[.....y.@.Om..|
+00000140  2b 13 8b c2 a5 2e 67 d8  d4 09 9e d6 22 38 b7 4a  |+.....g....."8.J|
+00000150  0b 74 73 2b c2 34 f1 d1  93 e5 96 d9 74 7b f3 58  |.ts+.4......t{.X|
+00000160  9f 6c 61 3c c0 b0 41 d4  d9 2b 2b 24 23 77 5b 1c  |.la<..A..++$#w[.|
+00000170  3b bd 75 5d ce 20 54 cf  a1 63 87 1d 1e 24 c4 f3  |;.u]. T..c...$..|
+00000180  1d 1a 50 8b aa b6 14 43  ed 97 a7 75 62 f4 14 c8  |..P....C...ub...|
+00000190  52 d7 02 03 01 00 01 a3  81 93 30 81 90 30 0e 06  |R.........0..0..|
+000001a0  03 55 1d 0f 01 01 ff 04  04 03 02 05 a0 30 1d 06  |.U...........0..|
+000001b0  03 55 1d 25 04 16 30 14  06 08 2b 06 01 05 05 07  |.U.%..0...+.....|
+000001c0  03 01 06 08 2b 06 01 05  05 07 03 02 30 0c 06 03  |....+.......0...|
+000001d0  55 1d 13 01 01 ff 04 02  30 00 30 19 06 03 55 1d  |U.......0.0...U.|
+000001e0  0e 04 12 04 10 9f 91 16  1f 43 43 3e 49 a6 de 6d  |.........CC>I..m|
+000001f0  b6 80 d7 9f 60 30 1b 06  03 55 1d 23 04 14 30 12  |....`0...U.#..0.|
+00000200  80 10 48 13 49 4d 13 7e  16 31 bb a3 01 d5 ac ab  |..H.IM.~.1......|
+00000210  6e 7b 30 19 06 03 55 1d  11 04 12 30 10 82 0e 65  |n{0...U....0...e|
+00000220  78 61 6d 70 6c 65 2e 67  6f 6c 61 6e 67 30 0d 06  |xample.golang0..|
+00000230  09 2a 86 48 86 f7 0d 01  01 0b 05 00 03 81 81 00  |.*.H............|
+00000240  9d 30 cc 40 2b 5b 50 a0  61 cb ba e5 53 58 e1 ed  |.0.@+[P.a...SX..|
+00000250  83 28 a9 58 1a a9 38 a4  95 a1 ac 31 5a 1a 84 66  |.(.X..8....1Z..f|
+00000260  3d 43 d3 2d d9 0b f2 97  df d3 20 64 38 92 24 3a  |=C.-...... d8.$:|
+00000270  00 bc cf 9c 7d b7 40 20  01 5f aa d3 16 61 09 a2  |....}.@ ._...a..|
+00000280  76 fd 13 c3 cc e1 0c 5c  ee b1 87 82 f1 6c 04 ed  |v......\.....l..|
+00000290  73 bb b3 43 77 8d 0c 1c  f1 0f a1 d8 40 83 61 c9  |s..Cw.......@.a.|
+000002a0  4c 72 2b 9d ae db 46 06  06 4d f4 c1 b3 3e c0 d1  |Lr+...F..M...>..|
+000002b0  bd 42 d4 db fe 3d 13 60  84 5c 21 d3 3b e9 fa e7  |.B...=.`.\!.;...|
+000002c0  16 03 03 00 ac 0c 00 00  a8 03 00 1d 20 05 e2 67  |............ ..g|
+000002d0  4b 7b e7 b3 0f 62 ff 90  4d 73 b1 c6 b7 ef 9c 33  |K{...b..Ms.....3|
+000002e0  30 83 7d 09 66 b6 d8 10  51 c6 95 b3 64 08 04 00  |0.}.f...Q...d...|
+000002f0  80 71 0d e7 a9 1b d7 2e  08 90 5b aa 30 cf c1 e0  |.q........[.0...|
+00000300  26 df 57 2d b2 95 4a 69  51 e4 b1 26 ad 91 1a 3e  |&.W-..JiQ..&...>|
+00000310  38 9f 4e 9e e3 72 7a a7  a8 57 79 3d e5 94 ab c2  |8.N..rz..Wy=....|
+00000320  e3 0f e9 07 aa 31 c9 d6  d8 3d 9c 00 2e c3 8b 3f  |.....1...=.....?|
+00000330  23 5a a9 af f0 6b f0 8f  55 b5 5d b3 67 7a cf b5  |#Z...k..U.].gz..|
+00000340  b4 c7 52 29 e9 3a 05 d2  cd d9 a9 99 13 49 15 8a  |..R).:.......I..|
+00000350  85 92 60 9a ed 72 c7 75  34 0f b5 26 70 ba 67 0b  |..`..r.u4..&p.g.|
+00000360  6e fb 52 97 01 bd 32 59  5b 56 bc e5 d9 68 cd 88  |n.R...2Y[V...h..|
+00000370  7c 16 03 03 00 3a 0d 00  00 36 03 01 02 40 00 2e  ||....:...6...@..|
+00000380  04 03 05 03 06 03 08 07  08 08 08 09 08 0a 08 0b  |................|
+00000390  08 04 08 05 08 06 04 01  05 01 06 01 03 03 02 03  |................|
+000003a0  03 01 02 01 03 02 02 02  04 02 05 02 06 02 00 00  |................|
+000003b0  16 03 03 00 04 0e 00 00  00                       |.........|
 >>> Flow 3 (client to server)
 00000000  16 03 03 01 3c 0b 00 01  38 00 01 35 00 01 32 30  |....<...8..5..20|
 00000010  82 01 2e 30 81 e1 a0 03  02 01 02 02 10 17 d1 81  |...0............|
@@ -100,20 +101,20 @@
 00000140  08 16 03 03 00 25 10 00  00 21 20 2f e5 7d a3 47  |.....%...! /.}.G|
 00000150  cd 62 43 15 28 da ac 5f  bb 29 07 30 ff f6 84 af  |.bC.(.._.).0....|
 00000160  c4 cf c2 ed 90 99 5f 58  cb 3b 74 16 03 03 00 48  |......_X.;t....H|
-00000170  0f 00 00 44 08 07 00 40  07 e0 a5 14 ca cf 31 d7  |...D...@......1.|
-00000180  99 96 c7 c7 d8 d8 a7 f7  82 e7 c6 c0 12 5d 91 5a  |.............].Z|
-00000190  bc eb 4a c0 59 c6 5b 7b  03 df 2a ff 48 ca 55 d8  |..J.Y.[{..*.H.U.|
-000001a0  3e 10 c1 94 2c 03 b2 e7  16 83 4d e5 5a 3d 8a 48  |>...,.....M.Z=.H|
-000001b0  2f e5 c4 59 de 6f 47 05  14 03 03 00 01 01 16 03  |/..Y.oG.........|
-000001c0  03 00 20 ae 35 81 df 88  0e a3 2e 67 3f 33 02 3d  |.. .5......g?3.=|
-000001d0  b8 7e 47 db cb be 05 c7  ba 43 dc 5b 52 3b 4b ca  |.~G......C.[R;K.|
-000001e0  c0 dc 78                                          |..x|
+00000170  0f 00 00 44 08 07 00 40  2f cb 89 2f a3 4e ee bb  |...D...@/../.N..|
+00000180  1a b0 77 a1 9f e3 0e 21  60 58 8d 62 86 2c 23 74  |..w....!`X.b.,#t|
+00000190  bd b9 2c 48 7f d3 fa 98  85 01 3a 49 7c a3 f6 c9  |..,H......:I|...|
+000001a0  b7 89 83 39 03 21 ed 6b  4a 31 76 b1 20 49 10 1c  |...9.!.kJ1v. I..|
+000001b0  55 ee bc 1c fb c3 ad 0c  14 03 03 00 01 01 16 03  |U...............|
+000001c0  03 00 20 7d f4 a6 96 ba  b1 c3 87 f7 1b 61 ca 88  |.. }.........a..|
+000001d0  b2 7b 18 f6 92 27 e3 47  fb 46 7b aa 5f ed a1 4c  |.{...'.G.F{._..L|
+000001e0  00 64 d7                                          |.d.|
 >>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 20 63 23 49 7c 83  |.......... c#I|.|
-00000010  1a 8b cd 48 02 e7 86 4d  ab 8b 3c 4f 40 27 a6 48  |...H...M..<O@'.H|
-00000020  95 d5 80 8a 7a e0 56 0b  e6 34 70                 |....z.V..4p|
+00000000  14 03 03 00 01 01 16 03  03 00 20 97 ae 75 77 58  |.......... ..uwX|
+00000010  02 f2 b3 fe ef cf 61 fe  e8 d9 b3 49 02 49 64 c2  |......a....I.Id.|
+00000020  4b 94 fe 05 8d c1 46 ef  5b 53 8c                 |K.....F.[S.|
 >>> Flow 5 (client to server)
-00000000  17 03 03 00 16 aa b4 5b  75 04 96 c5 4a e3 2a fb  |.......[u...J.*.|
-00000010  be 29 32 9e c5 e4 15 bd  38 df 69 15 03 03 00 12  |.)2.....8.i.....|
-00000020  50 4d b6 c0 95 e6 5a db  f2 b7 ea 02 cb 3e 01 ea  |PM....Z......>..|
-00000030  35 0d                                             |5.|
+00000000  17 03 03 00 16 16 ea 3f  e3 7d 1f 53 af a2 74 82  |.......?.}.S..t.|
+00000010  6e 8a 01 6a ea 75 8b a8  4e 76 74 15 03 03 00 12  |n..j.u..Nvt.....|
+00000020  e3 d8 78 82 9f db 28 60  01 c6 03 f0 e7 86 52 ba  |..x...(`......R.|
+00000030  2c 45                                             |,E|
diff --git a/src/crypto/tls/testdata/Client-TLSv12-ClientCert-RSA-AES256-GCM-SHA384 b/src/crypto/tls/testdata/Client-TLSv12-ClientCert-RSA-AES256-GCM-SHA384
index 35ec347..9631c0c 100644
--- a/src/crypto/tls/testdata/Client-TLSv12-ClientCert-RSA-AES256-GCM-SHA384
+++ b/src/crypto/tls/testdata/Client-TLSv12-ClientCert-RSA-AES256-GCM-SHA384
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fe 01 00 00  fa 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 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,75 +7,76 @@
 00000050  cc a8 c0 2b c0 2f c0 2c  c0 30 c0 09 c0 13 c0 0a  |...+./.,.0......|
 00000060  c0 14 00 9c 00 9d 00 2f  00 35 c0 12 00 0a c0 23  |......./.5.....#|
 00000070  c0 27 00 3c c0 07 c0 11  00 05 13 03 13 01 13 02  |.'.<............|
-00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
+00000080  01 00 00 7f 00 05 00 05  01 00 00 00 00 00 0a 00  |................|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
 000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
 000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
-000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
-000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
-000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
-000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
+000000c0  01 00 01 00 00 17 00 00  00 12 00 00 00 2b 00 09  |.............+..|
+000000d0  08 03 04 03 03 03 02 03  01 00 33 00 26 00 24 00  |..........3.&.$.|
+000000e0  1d 00 20 2f e5 7d a3 47  cd 62 43 15 28 da ac 5f  |.. /.}.G.bC.(.._|
+000000f0  bb 29 07 30 ff f6 84 af  c4 cf c2 ed 90 99 5f 58  |.).0.........._X|
+00000100  cb 3b 74                                          |.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 59 02 00 00  55 03 03 16 f7 21 0a 97  |....Y...U....!..|
-00000010  89 11 ec c3 c4 05 41 79  72 60 40 6d ec 78 90 26  |......Ayr`@m.x.&|
-00000020  0c a4 f8 5d d5 27 e9 70  bb 40 21 20 b0 bb 98 5d  |...].'.p.@! ...]|
-00000030  a2 27 08 1e 4a fe f9 e1  cf a5 79 d3 eb c6 40 f7  |.'..J.....y...@.|
-00000040  ee 4f 0b fa a1 bb 09 62  07 24 30 b7 c0 30 00 00  |.O.....b.$0..0..|
-00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
-00000060  03 02 59 0b 00 02 55 00  02 52 00 02 4f 30 82 02  |..Y...U..R..O0..|
-00000070  4b 30 82 01 b4 a0 03 02  01 02 02 09 00 e8 f0 9d  |K0..............|
-00000080  3f e2 5b ea a6 30 0d 06  09 2a 86 48 86 f7 0d 01  |?.[..0...*.H....|
-00000090  01 0b 05 00 30 1f 31 0b  30 09 06 03 55 04 0a 13  |....0.1.0...U...|
-000000a0  02 47 6f 31 10 30 0e 06  03 55 04 03 13 07 47 6f  |.Go1.0...U....Go|
-000000b0  20 52 6f 6f 74 30 1e 17  0d 31 36 30 31 30 31 30  | Root0...1601010|
-000000c0  30 30 30 30 30 5a 17 0d  32 35 30 31 30 31 30 30  |00000Z..25010100|
-000000d0  30 30 30 30 5a 30 1a 31  0b 30 09 06 03 55 04 0a  |0000Z0.1.0...U..|
-000000e0  13 02 47 6f 31 0b 30 09  06 03 55 04 03 13 02 47  |..Go1.0...U....G|
-000000f0  6f 30 81 9f 30 0d 06 09  2a 86 48 86 f7 0d 01 01  |o0..0...*.H.....|
-00000100  01 05 00 03 81 8d 00 30  81 89 02 81 81 00 db 46  |.......0.......F|
-00000110  7d 93 2e 12 27 06 48 bc  06 28 21 ab 7e c4 b6 a2  |}...'.H..(!.~...|
-00000120  5d fe 1e 52 45 88 7a 36  47 a5 08 0d 92 42 5b c2  |]..RE.z6G....B[.|
-00000130  81 c0 be 97 79 98 40 fb  4f 6d 14 fd 2b 13 8b c2  |....y.@.Om..+...|
-00000140  a5 2e 67 d8 d4 09 9e d6  22 38 b7 4a 0b 74 73 2b  |..g....."8.J.ts+|
-00000150  c2 34 f1 d1 93 e5 96 d9  74 7b f3 58 9f 6c 61 3c  |.4......t{.X.la<|
-00000160  c0 b0 41 d4 d9 2b 2b 24  23 77 5b 1c 3b bd 75 5d  |..A..++$#w[.;.u]|
-00000170  ce 20 54 cf a1 63 87 1d  1e 24 c4 f3 1d 1a 50 8b  |. T..c...$....P.|
-00000180  aa b6 14 43 ed 97 a7 75  62 f4 14 c8 52 d7 02 03  |...C...ub...R...|
-00000190  01 00 01 a3 81 93 30 81  90 30 0e 06 03 55 1d 0f  |......0..0...U..|
-000001a0  01 01 ff 04 04 03 02 05  a0 30 1d 06 03 55 1d 25  |.........0...U.%|
-000001b0  04 16 30 14 06 08 2b 06  01 05 05 07 03 01 06 08  |..0...+.........|
-000001c0  2b 06 01 05 05 07 03 02  30 0c 06 03 55 1d 13 01  |+.......0...U...|
-000001d0  01 ff 04 02 30 00 30 19  06 03 55 1d 0e 04 12 04  |....0.0...U.....|
-000001e0  10 9f 91 16 1f 43 43 3e  49 a6 de 6d b6 80 d7 9f  |.....CC>I..m....|
-000001f0  60 30 1b 06 03 55 1d 23  04 14 30 12 80 10 48 13  |`0...U.#..0...H.|
-00000200  49 4d 13 7e 16 31 bb a3  01 d5 ac ab 6e 7b 30 19  |IM.~.1......n{0.|
-00000210  06 03 55 1d 11 04 12 30  10 82 0e 65 78 61 6d 70  |..U....0...examp|
-00000220  6c 65 2e 67 6f 6c 61 6e  67 30 0d 06 09 2a 86 48  |le.golang0...*.H|
-00000230  86 f7 0d 01 01 0b 05 00  03 81 81 00 9d 30 cc 40  |.............0.@|
-00000240  2b 5b 50 a0 61 cb ba e5  53 58 e1 ed 83 28 a9 58  |+[P.a...SX...(.X|
-00000250  1a a9 38 a4 95 a1 ac 31  5a 1a 84 66 3d 43 d3 2d  |..8....1Z..f=C.-|
-00000260  d9 0b f2 97 df d3 20 64  38 92 24 3a 00 bc cf 9c  |...... d8.$:....|
-00000270  7d b7 40 20 01 5f aa d3  16 61 09 a2 76 fd 13 c3  |}.@ ._...a..v...|
-00000280  cc e1 0c 5c ee b1 87 82  f1 6c 04 ed 73 bb b3 43  |...\.....l..s..C|
-00000290  77 8d 0c 1c f1 0f a1 d8  40 83 61 c9 4c 72 2b 9d  |w.......@.a.Lr+.|
-000002a0  ae db 46 06 06 4d f4 c1  b3 3e c0 d1 bd 42 d4 db  |..F..M...>...B..|
-000002b0  fe 3d 13 60 84 5c 21 d3  3b e9 fa e7 16 03 03 00  |.=.`.\!.;.......|
-000002c0  ac 0c 00 00 a8 03 00 1d  20 39 1f 7e 66 c8 20 24  |........ 9.~f. $|
-000002d0  cf 8e 51 f6 bf 2a 01 a9  3b 51 19 f1 9d 32 b6 fa  |..Q..*..;Q...2..|
-000002e0  05 3b 90 c9 a3 8b 49 92  2a 08 04 00 80 da 65 ad  |.;....I.*.....e.|
-000002f0  fa f9 d5 f6 d7 13 34 d2  ab ac ea 57 37 69 c6 b1  |......4....W7i..|
-00000300  91 ee 89 b7 04 6b 17 fb  80 23 df df ef a1 62 9b  |.....k...#....b.|
-00000310  e4 0a 4e ca b0 35 b2 d3  2a cf 4f c1 e3 d9 37 78  |..N..5..*.O...7x|
-00000320  aa c8 59 f8 25 c7 43 51  19 6c c7 50 90 a4 2c 92  |..Y.%.CQ.l.P..,.|
-00000330  01 0e 8d ff f0 88 4b af  1d 03 ee 51 8b 18 e4 ee  |......K....Q....|
-00000340  35 48 16 e7 4c 26 1d d8  af 91 b1 75 38 b5 65 42  |5H..L&.....u8.eB|
-00000350  8e 60 c7 f9 25 a7 85 35  72 41 6f f6 c4 61 1d c0  |.`..%..5rAo..a..|
-00000360  c8 cf da ae 31 5e 2e d6  9c ca f1 d6 31 16 03 03  |....1^......1...|
-00000370  00 3a 0d 00 00 36 03 01  02 40 00 2e 04 03 05 03  |.:...6...@......|
-00000380  06 03 08 07 08 08 08 09  08 0a 08 0b 08 04 08 05  |................|
-00000390  08 06 04 01 05 01 06 01  03 03 02 03 03 01 02 01  |................|
-000003a0  03 02 02 02 04 02 05 02  06 02 00 00 16 03 03 00  |................|
-000003b0  04 0e 00 00 00                                    |.....|
+00000000  16 03 03 00 5d 02 00 00  59 03 03 b7 f3 10 78 e0  |....]...Y.....x.|
+00000010  58 51 c7 7c 5c 88 27 e1  ce e4 df 24 45 36 7c fe  |XQ.|\.'....$E6|.|
+00000020  9b 5c a1 89 0a 6e af 2a  73 b9 93 20 40 64 4c 4d  |.\...n.*s.. @dLM|
+00000030  9d 10 58 ef 28 30 5d 81  2b 91 3b 5d 2b 67 b4 61  |..X.(0].+.;]+g.a|
+00000040  ef 24 f1 23 e2 32 46 4c  3e 96 7a a2 c0 30 00 00  |.$.#.2FL>.z..0..|
+00000050  11 ff 01 00 01 00 00 0b  00 04 03 00 01 02 00 17  |................|
+00000060  00 00 16 03 03 02 59 0b  00 02 55 00 02 52 00 02  |......Y...U..R..|
+00000070  4f 30 82 02 4b 30 82 01  b4 a0 03 02 01 02 02 09  |O0..K0..........|
+00000080  00 e8 f0 9d 3f e2 5b ea  a6 30 0d 06 09 2a 86 48  |....?.[..0...*.H|
+00000090  86 f7 0d 01 01 0b 05 00  30 1f 31 0b 30 09 06 03  |........0.1.0...|
+000000a0  55 04 0a 13 02 47 6f 31  10 30 0e 06 03 55 04 03  |U....Go1.0...U..|
+000000b0  13 07 47 6f 20 52 6f 6f  74 30 1e 17 0d 31 36 30  |..Go Root0...160|
+000000c0  31 30 31 30 30 30 30 30  30 5a 17 0d 32 35 30 31  |101000000Z..2501|
+000000d0  30 31 30 30 30 30 30 30  5a 30 1a 31 0b 30 09 06  |01000000Z0.1.0..|
+000000e0  03 55 04 0a 13 02 47 6f  31 0b 30 09 06 03 55 04  |.U....Go1.0...U.|
+000000f0  03 13 02 47 6f 30 81 9f  30 0d 06 09 2a 86 48 86  |...Go0..0...*.H.|
+00000100  f7 0d 01 01 01 05 00 03  81 8d 00 30 81 89 02 81  |...........0....|
+00000110  81 00 db 46 7d 93 2e 12  27 06 48 bc 06 28 21 ab  |...F}...'.H..(!.|
+00000120  7e c4 b6 a2 5d fe 1e 52  45 88 7a 36 47 a5 08 0d  |~...]..RE.z6G...|
+00000130  92 42 5b c2 81 c0 be 97  79 98 40 fb 4f 6d 14 fd  |.B[.....y.@.Om..|
+00000140  2b 13 8b c2 a5 2e 67 d8  d4 09 9e d6 22 38 b7 4a  |+.....g....."8.J|
+00000150  0b 74 73 2b c2 34 f1 d1  93 e5 96 d9 74 7b f3 58  |.ts+.4......t{.X|
+00000160  9f 6c 61 3c c0 b0 41 d4  d9 2b 2b 24 23 77 5b 1c  |.la<..A..++$#w[.|
+00000170  3b bd 75 5d ce 20 54 cf  a1 63 87 1d 1e 24 c4 f3  |;.u]. T..c...$..|
+00000180  1d 1a 50 8b aa b6 14 43  ed 97 a7 75 62 f4 14 c8  |..P....C...ub...|
+00000190  52 d7 02 03 01 00 01 a3  81 93 30 81 90 30 0e 06  |R.........0..0..|
+000001a0  03 55 1d 0f 01 01 ff 04  04 03 02 05 a0 30 1d 06  |.U...........0..|
+000001b0  03 55 1d 25 04 16 30 14  06 08 2b 06 01 05 05 07  |.U.%..0...+.....|
+000001c0  03 01 06 08 2b 06 01 05  05 07 03 02 30 0c 06 03  |....+.......0...|
+000001d0  55 1d 13 01 01 ff 04 02  30 00 30 19 06 03 55 1d  |U.......0.0...U.|
+000001e0  0e 04 12 04 10 9f 91 16  1f 43 43 3e 49 a6 de 6d  |.........CC>I..m|
+000001f0  b6 80 d7 9f 60 30 1b 06  03 55 1d 23 04 14 30 12  |....`0...U.#..0.|
+00000200  80 10 48 13 49 4d 13 7e  16 31 bb a3 01 d5 ac ab  |..H.IM.~.1......|
+00000210  6e 7b 30 19 06 03 55 1d  11 04 12 30 10 82 0e 65  |n{0...U....0...e|
+00000220  78 61 6d 70 6c 65 2e 67  6f 6c 61 6e 67 30 0d 06  |xample.golang0..|
+00000230  09 2a 86 48 86 f7 0d 01  01 0b 05 00 03 81 81 00  |.*.H............|
+00000240  9d 30 cc 40 2b 5b 50 a0  61 cb ba e5 53 58 e1 ed  |.0.@+[P.a...SX..|
+00000250  83 28 a9 58 1a a9 38 a4  95 a1 ac 31 5a 1a 84 66  |.(.X..8....1Z..f|
+00000260  3d 43 d3 2d d9 0b f2 97  df d3 20 64 38 92 24 3a  |=C.-...... d8.$:|
+00000270  00 bc cf 9c 7d b7 40 20  01 5f aa d3 16 61 09 a2  |....}.@ ._...a..|
+00000280  76 fd 13 c3 cc e1 0c 5c  ee b1 87 82 f1 6c 04 ed  |v......\.....l..|
+00000290  73 bb b3 43 77 8d 0c 1c  f1 0f a1 d8 40 83 61 c9  |s..Cw.......@.a.|
+000002a0  4c 72 2b 9d ae db 46 06  06 4d f4 c1 b3 3e c0 d1  |Lr+...F..M...>..|
+000002b0  bd 42 d4 db fe 3d 13 60  84 5c 21 d3 3b e9 fa e7  |.B...=.`.\!.;...|
+000002c0  16 03 03 00 ac 0c 00 00  a8 03 00 1d 20 e4 a0 4d  |............ ..M|
+000002d0  a8 b2 65 c0 a7 f8 46 a3  79 1c c6 32 7d 1e c4 7b  |..e...F.y..2}..{|
+000002e0  09 4a cd 92 5d a6 64 20  b7 c2 0e 5e 50 08 04 00  |.J..].d ...^P...|
+000002f0  80 32 80 e3 3b 30 c3 d9  67 9a ef ea 95 f1 c3 50  |.2..;0..g......P|
+00000300  cb 98 82 3e 92 fd 4c 1b  76 53 4e 31 41 f4 30 9a  |...>..L.vSN1A.0.|
+00000310  0a c0 8b 50 5c d6 5c ce  9f ee d9 c6 02 79 48 58  |...P\.\......yHX|
+00000320  97 04 9f 7f 86 f2 7b 61  87 f8 5a d1 92 c3 57 d4  |......{a..Z...W.|
+00000330  c8 86 a2 be 75 3c 13 75  71 13 e2 20 e7 03 b6 6e  |....u<.uq.. ...n|
+00000340  97 d5 32 f5 af ce d5 4f  e6 7d a6 b3 36 11 f5 ae  |..2....O.}..6...|
+00000350  4a 0a fb 43 fa 2c c5 29  e6 fa 59 5f 20 e4 41 f1  |J..C.,.)..Y_ .A.|
+00000360  3b be e1 1e 80 92 74 1c  8e fe 3a f8 c3 ef ed 93  |;.....t...:.....|
+00000370  02 16 03 03 00 3a 0d 00  00 36 03 01 02 40 00 2e  |.....:...6...@..|
+00000380  04 03 05 03 06 03 08 07  08 08 08 09 08 0a 08 0b  |................|
+00000390  08 04 08 05 08 06 04 01  05 01 06 01 03 03 02 03  |................|
+000003a0  03 01 02 01 03 02 02 02  04 02 05 02 06 02 00 00  |................|
+000003b0  16 03 03 00 04 0e 00 00  00                       |.........|
 >>> Flow 3 (client to server)
 00000000  16 03 03 01 fd 0b 00 01  f9 00 01 f6 00 01 f3 30  |...............0|
 00000010  82 01 ef 30 82 01 58 a0  03 02 01 02 02 10 5c 19  |...0..X.......\.|
@@ -112,26 +113,26 @@
 00000200  e5 35 16 03 03 00 25 10  00 00 21 20 2f e5 7d a3  |.5....%...! /.}.|
 00000210  47 cd 62 43 15 28 da ac  5f bb 29 07 30 ff f6 84  |G.bC.(.._.).0...|
 00000220  af c4 cf c2 ed 90 99 5f  58 cb 3b 74 16 03 03 00  |......._X.;t....|
-00000230  88 0f 00 00 84 08 04 00  80 56 1c 58 51 d8 51 bc  |.........V.XQ.Q.|
-00000240  8e 4b b8 24 64 85 81 d2  26 9b 38 bf 13 19 e7 0a  |.K.$d...&.8.....|
-00000250  f7 94 e8 b5 94 bf 6f ae  f2 07 1a 46 24 38 7b 8b  |......o....F$8{.|
-00000260  2f a6 da 91 1a 5f 7d 3f  cf c4 1b 14 9c 44 8e 6a  |/...._}?.....D.j|
-00000270  6b c8 c4 60 c6 15 e6 f2  c0 45 e7 46 c4 32 06 b1  |k..`.....E.F.2..|
-00000280  46 5e 25 1d ba f7 d8 81  b0 6b 50 40 81 b1 93 89  |F^%......kP@....|
-00000290  cb 90 ae 10 b1 db 08 99  e6 0e 8f 17 0f 4d a7 a7  |.............M..|
-000002a0  f5 42 8a be ca d6 75 c4  32 44 22 ab df cf 22 f7  |.B....u.2D"...".|
-000002b0  58 d9 9f 52 c2 04 c0 81  59 14 03 03 00 01 01 16  |X..R....Y.......|
-000002c0  03 03 00 28 00 00 00 00  00 00 00 00 eb 5a 97 41  |...(.........Z.A|
-000002d0  1d da 2b 81 da 7a b7 9a  f8 5e fe 50 75 e5 a4 6a  |..+..z...^.Pu..j|
-000002e0  21 90 b7 3d 4e bc 44 cf  86 8f cd c3              |!..=N.D.....|
+00000230  88 0f 00 00 84 08 04 00  80 57 04 14 cf f4 73 9e  |.........W....s.|
+00000240  5d 94 16 54 3a 06 6b 37  03 b2 15 52 f1 27 86 2e  |]..T:.k7...R.'..|
+00000250  66 e3 0b 4c da f9 71 1b  6a 5b 65 d8 7c 43 80 6a  |f..L..q.j[e.|C.j|
+00000260  d1 5c 5c 3b ff 44 dc c7  a9 74 01 51 76 69 79 24  |.\\;.D...t.Qviy$|
+00000270  c5 91 79 65 73 7e b7 1b  15 80 34 b4 31 89 c4 e9  |..yes~....4.1...|
+00000280  f8 e3 18 fd 68 65 b9 65  d7 31 cc d0 8d 00 4e 55  |....he.e.1....NU|
+00000290  3f dc 17 58 b3 b8 aa 98  4e 73 c5 05 bb 54 81 e3  |?..X....Ns...T..|
+000002a0  42 5d b3 1b 6e b0 f8 a0  2c 00 52 e0 e1 16 18 d3  |B]..n...,.R.....|
+000002b0  d1 df 2b b9 15 20 69 d6  1a 14 03 03 00 01 01 16  |..+.. i.........|
+000002c0  03 03 00 28 00 00 00 00  00 00 00 00 b7 cd 13 34  |...(...........4|
+000002d0  56 65 49 f9 1c 23 7f 7d  45 18 91 0f 23 27 c8 78  |VeI..#.}E...#'.x|
+000002e0  cb 34 f8 7c 90 58 5f 29  ff ac f8 1c              |.4.|.X_)....|
 >>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 28 93 a5 d4 a8 16  |..........(.....|
-00000010  4e a2 b2 c3 b9 ce dd 0e  57 49 7c eb 92 e4 e7 e3  |N.......WI|.....|
-00000020  a8 55 3a 56 54 53 92 b8  ce 15 e3 c3 c2 da 52 01  |.U:VTS........R.|
-00000030  6f 35 fd                                          |o5.|
+00000000  14 03 03 00 01 01 16 03  03 00 28 c0 cc d9 54 39  |..........(...T9|
+00000010  73 0a 5f d9 33 a2 00 cc  18 f6 73 c9 b1 c6 35 b7  |s._.3.....s...5.|
+00000020  49 85 5c 0d 46 21 84 4e  3d b8 ca b8 66 04 e7 96  |I.\.F!.N=...f...|
+00000030  e6 55 26                                          |.U&|
 >>> Flow 5 (client to server)
-00000000  17 03 03 00 1e 00 00 00  00 00 00 00 01 5b 20 4f  |.............[ O|
-00000010  e9 3f 09 28 6e 88 5d 1d  57 90 2c 35 74 37 d1 df  |.?.(n.].W.,5t7..|
-00000020  aa 39 9b 15 03 03 00 1a  00 00 00 00 00 00 00 02  |.9..............|
-00000030  bb e3 77 62 e5 c9 78 f4  a5 09 93 b0 20 9a 1b a4  |..wb..x..... ...|
-00000040  48 44                                             |HD|
+00000000  17 03 03 00 1e 00 00 00  00 00 00 00 01 61 6d a3  |.............am.|
+00000010  bd c6 12 0d b3 42 56 a3  e3 c9 e6 4d 38 bf 1d 4c  |.....BV....M8..L|
+00000020  59 82 c8 15 03 03 00 1a  00 00 00 00 00 00 00 02  |Y...............|
+00000030  ea 55 21 35 64 fd c6 7c  0e f3 2d 67 d6 53 03 20  |.U!5d..|..-g.S. |
+00000040  64 06                                             |d.|
diff --git a/src/crypto/tls/testdata/Client-TLSv12-ClientCert-RSA-ECDSA b/src/crypto/tls/testdata/Client-TLSv12-ClientCert-RSA-ECDSA
index 110f689..ccb5998 100644
--- a/src/crypto/tls/testdata/Client-TLSv12-ClientCert-RSA-ECDSA
+++ b/src/crypto/tls/testdata/Client-TLSv12-ClientCert-RSA-ECDSA
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fe 01 00 00  fa 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 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,71 +7,72 @@
 00000050  cc a8 c0 2b c0 2f c0 2c  c0 30 c0 09 c0 13 c0 0a  |...+./.,.0......|
 00000060  c0 14 00 9c 00 9d 00 2f  00 35 c0 12 00 0a c0 23  |......./.5.....#|
 00000070  c0 27 00 3c c0 07 c0 11  00 05 13 03 13 01 13 02  |.'.<............|
-00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
+00000080  01 00 00 7f 00 05 00 05  01 00 00 00 00 00 0a 00  |................|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
 000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
 000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
-000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
-000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
-000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
-000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
+000000c0  01 00 01 00 00 17 00 00  00 12 00 00 00 2b 00 09  |.............+..|
+000000d0  08 03 04 03 03 03 02 03  01 00 33 00 26 00 24 00  |..........3.&.$.|
+000000e0  1d 00 20 2f e5 7d a3 47  cd 62 43 15 28 da ac 5f  |.. /.}.G.bC.(.._|
+000000f0  bb 29 07 30 ff f6 84 af  c4 cf c2 ed 90 99 5f 58  |.).0.........._X|
+00000100  cb 3b 74                                          |.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 59 02 00 00  55 03 03 68 dc 2e 5e 8e  |....Y...U..h..^.|
-00000010  80 38 0e 65 a3 b0 f6 a0  c0 8f 1e 62 ef 1d 5a 54  |.8.e.......b..ZT|
-00000020  82 dc 9c 68 77 88 57 dd  f3 9d c2 20 4e 56 dd 44  |...hw.W.... NV.D|
-00000030  a0 46 67 4c 09 2b d5 e6  fe 15 fb b3 8e 19 ef a3  |.FgL.+..........|
-00000040  8e 5c a9 70 00 cf 96 d7  3b 8b c9 64 c0 09 00 00  |.\.p....;..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 b6 0c 00  00 b2 03 00 1d 20 24 d0  |*............ $.|
-00000280  e5 11 4c 95 2c 96 58 62  01 df 20 c8 24 ce 29 a2  |..L.,.Xb.. .$.).|
-00000290  1a 3e 97 e2 df 29 49 e6  3a e8 c2 d3 72 49 04 03  |.>...)I.:...rI..|
-000002a0  00 8a 30 81 87 02 41 71  15 8d 50 f6 69 40 d7 cd  |..0...Aq..P.i@..|
-000002b0  da c9 c3 ee 37 c2 5f c3  89 62 23 e0 ef 37 f9 9e  |....7._..b#..7..|
-000002c0  2a 26 85 10 56 28 08 de  49 3b fa 03 f3 14 4b 3a  |*&..V(..I;....K:|
-000002d0  b2 3d de 84 d2 08 8d 4e  59 3e 80 8f 6a 44 af 6f  |.=.....NY>..jD.o|
-000002e0  be ee 08 ae 35 40 42 bc  02 42 00 f3 e9 89 a5 7f  |....5@B..B......|
-000002f0  9c 50 7c 07 34 e4 cf f0  2b 0f cf f7 68 57 fa fd  |.P|.4...+...hW..|
-00000300  2f 52 04 f8 90 7b 97 eb  c3 e0 cc 68 f7 bf 22 21  |/R...{.....h.."!|
-00000310  62 b3 51 c8 a4 30 38 c5  88 46 df 55 21 21 d0 4f  |b.Q..08..F.U!!.O|
-00000320  6f 95 7b 5f 5a c6 98 dd  2d d1 0a 95 16 03 03 00  |o.{_Z...-.......|
-00000330  3a 0d 00 00 36 03 01 02  40 00 2e 04 03 05 03 06  |:...6...@.......|
-00000340  03 08 07 08 08 08 09 08  0a 08 0b 08 04 08 05 08  |................|
-00000350  06 04 01 05 01 06 01 03  03 02 03 03 01 02 01 03  |................|
-00000360  02 02 02 04 02 05 02 06  02 00 00 16 03 03 00 04  |................|
-00000370  0e 00 00 00                                       |....|
+00000000  16 03 03 00 5d 02 00 00  59 03 03 62 ba 01 96 bd  |....]...Y..b....|
+00000010  12 c5 9d 43 86 5e fe 8d  9e 77 a2 17 dc f3 a2 d6  |...C.^...w......|
+00000020  ca 8f d4 49 ff 9b cb a5  bc 86 29 20 58 57 f3 d7  |...I......) XW..|
+00000030  5e d8 b9 d7 95 54 f9 50  5c b6 78 44 29 bb 83 21  |^....T.P\.xD)..!|
+00000040  77 b2 95 23 5d 4f bb 6a  15 60 e6 86 c0 09 00 00  |w..#]O.j.`......|
+00000050  11 ff 01 00 01 00 00 0b  00 04 03 00 01 02 00 17  |................|
+00000060  00 00 16 03 03 02 0e 0b  00 02 0a 00 02 07 00 02  |................|
+00000070  04 30 82 02 00 30 82 01  62 02 09 00 b8 bf 2d 47  |.0...0..b.....-G|
+00000080  a0 d2 eb f4 30 09 06 07  2a 86 48 ce 3d 04 01 30  |....0...*.H.=..0|
+00000090  45 31 0b 30 09 06 03 55  04 06 13 02 41 55 31 13  |E1.0...U....AU1.|
+000000a0  30 11 06 03 55 04 08 13  0a 53 6f 6d 65 2d 53 74  |0...U....Some-St|
+000000b0  61 74 65 31 21 30 1f 06  03 55 04 0a 13 18 49 6e  |ate1!0...U....In|
+000000c0  74 65 72 6e 65 74 20 57  69 64 67 69 74 73 20 50  |ternet Widgits P|
+000000d0  74 79 20 4c 74 64 30 1e  17 0d 31 32 31 31 32 32  |ty Ltd0...121122|
+000000e0  31 35 30 36 33 32 5a 17  0d 32 32 31 31 32 30 31  |150632Z..2211201|
+000000f0  35 30 36 33 32 5a 30 45  31 0b 30 09 06 03 55 04  |50632Z0E1.0...U.|
+00000100  06 13 02 41 55 31 13 30  11 06 03 55 04 08 13 0a  |...AU1.0...U....|
+00000110  53 6f 6d 65 2d 53 74 61  74 65 31 21 30 1f 06 03  |Some-State1!0...|
+00000120  55 04 0a 13 18 49 6e 74  65 72 6e 65 74 20 57 69  |U....Internet Wi|
+00000130  64 67 69 74 73 20 50 74  79 20 4c 74 64 30 81 9b  |dgits Pty Ltd0..|
+00000140  30 10 06 07 2a 86 48 ce  3d 02 01 06 05 2b 81 04  |0...*.H.=....+..|
+00000150  00 23 03 81 86 00 04 00  c4 a1 ed be 98 f9 0b 48  |.#.............H|
+00000160  73 36 7e c3 16 56 11 22  f2 3d 53 c3 3b 4d 21 3d  |s6~..V.".=S.;M!=|
+00000170  cd 6b 75 e6 f6 b0 dc 9a  df 26 c1 bc b2 87 f0 72  |.ku......&.....r|
+00000180  32 7c b3 64 2f 1c 90 bc  ea 68 23 10 7e fe e3 25  |2|.d/....h#.~..%|
+00000190  c0 48 3a 69 e0 28 6d d3  37 00 ef 04 62 dd 0d a0  |.H:i.(m.7...b...|
+000001a0  9c 70 62 83 d8 81 d3 64  31 aa 9e 97 31 bd 96 b0  |.pb....d1...1...|
+000001b0  68 c0 9b 23 de 76 64 3f  1a 5c 7f e9 12 0e 58 58  |h..#.vd?.\....XX|
+000001c0  b6 5f 70 dd 9b d8 ea d5  d7 f5 d5 cc b9 b6 9f 30  |._p............0|
+000001d0  66 5b 66 9a 20 e2 27 e5  bf fe 3b 30 09 06 07 2a  |f[f. .'...;0...*|
+000001e0  86 48 ce 3d 04 01 03 81  8c 00 30 81 88 02 42 01  |.H.=......0...B.|
+000001f0  88 a2 4f eb e2 45 c5 48  7d 1b ac f5 ed 98 9d ae  |..O..E.H}.......|
+00000200  47 70 c0 5e 1b b6 2f bd  f1 b6 4d b7 61 40 d3 11  |Gp.^../...M.a@..|
+00000210  a2 ce ee 0b 7e 92 7e ff  76 9d c3 3b 7e a5 3f ce  |....~.~.v..;~.?.|
+00000220  fa 10 e2 59 ec 47 2d 7c  ac da 4e 97 0e 15 a0 6f  |...Y.G-|..N....o|
+00000230  d0 02 42 01 4d fc be 67  13 9c 2d 05 0e bd 3f a3  |..B.M..g..-...?.|
+00000240  8c 25 c1 33 13 83 0d 94  06 bb d4 37 7a f6 ec 7a  |.%.3.......7z..z|
+00000250  c9 86 2e dd d7 11 69 7f  85 7c 56 de fb 31 78 2b  |......i..|V..1x+|
+00000260  e4 c7 78 0d ae cb be 9e  4e 36 24 31 7b 6a 0f 39  |..x.....N6$1{j.9|
+00000270  95 12 07 8f 2a 16 03 03  00 b7 0c 00 00 b3 03 00  |....*...........|
+00000280  1d 20 e7 43 a8 15 b3 d3  ea fd b4 dd 02 83 09 c8  |. .C............|
+00000290  76 8f 9b 0e d8 f1 9c e7  99 d5 80 0e fb b8 a1 5c  |v..............\|
+000002a0  f2 1e 04 03 00 8b 30 81  88 02 42 01 22 7d 76 28  |......0...B."}v(|
+000002b0  67 0b 8c 78 65 0b d8 11  3e 29 70 02 49 d1 d7 c4  |g..xe...>)p.I...|
+000002c0  50 7b fb 07 2e 8d 91 f6  c4 f8 56 be 75 c6 61 05  |P{........V.u.a.|
+000002d0  43 42 2f f9 46 25 09 a6  a8 29 1d 95 6a 5c 65 fd  |CB/.F%...)..j\e.|
+000002e0  07 c1 88 1b f3 fd 52 7a  e4 17 01 fe ad 02 42 01  |......Rz......B.|
+000002f0  4f 77 cd d5 34 45 7d 3f  8f 70 ad 80 70 b9 77 9a  |Ow..4E}?.p..p.w.|
+00000300  08 c6 96 1c 95 14 76 17  90 05 fd 9a 38 be aa ff  |......v.....8...|
+00000310  64 76 35 ae 91 85 14 e5  e8 37 f7 0a b1 50 16 69  |dv5......7...P.i|
+00000320  ab 80 14 77 ee c0 56 77  e5 17 ea d4 57 3c 04 23  |...w..Vw....W<.#|
+00000330  d7 16 03 03 00 3a 0d 00  00 36 03 01 02 40 00 2e  |.....:...6...@..|
+00000340  04 03 05 03 06 03 08 07  08 08 08 09 08 0a 08 0b  |................|
+00000350  08 04 08 05 08 06 04 01  05 01 06 01 03 03 02 03  |................|
+00000360  03 01 02 01 03 02 02 02  04 02 05 02 06 02 00 00  |................|
+00000370  16 03 03 00 04 0e 00 00  00                       |.........|
 >>> Flow 3 (client to server)
 00000000  16 03 03 01 fd 0b 00 01  f9 00 01 f6 00 01 f3 30  |...............0|
 00000010  82 01 ef 30 82 01 58 a0  03 02 01 02 02 10 5c 19  |...0..X.......\.|
@@ -108,31 +109,31 @@
 00000200  e5 35 16 03 03 00 25 10  00 00 21 20 2f e5 7d a3  |.5....%...! /.}.|
 00000210  47 cd 62 43 15 28 da ac  5f bb 29 07 30 ff f6 84  |G.bC.(.._.).0...|
 00000220  af c4 cf c2 ed 90 99 5f  58 cb 3b 74 16 03 03 00  |......._X.;t....|
-00000230  88 0f 00 00 84 08 04 00  80 84 38 78 4d dd 9f 84  |..........8xM...|
-00000240  ae cb b8 2f e9 f3 76 66  41 56 f6 ed a5 fb 8b f2  |.../..vfAV......|
-00000250  43 0f 27 56 9e 7d a8 06  3e 8f ad b0 17 d5 d6 52  |C.'V.}..>......R|
-00000260  f4 88 e5 af 55 5b 55 fc  26 c1 a9 d5 a9 34 2b 50  |....U[U.&....4+P|
-00000270  96 09 db 59 cc f4 e8 cf  84 6f 9d b1 fd 3b a4 66  |...Y.....o...;.f|
-00000280  66 43 74 6d 4f e5 52 2c  22 2d c9 4c 67 3d ff 3d  |fCtmO.R,"-.Lg=.=|
-00000290  c2 79 b3 b1 85 56 08 cc  02 7c 53 a7 be 39 04 21  |.y...V...|S..9.!|
-000002a0  fb db fe ff 1b a6 c7 7a  e9 4c 11 c3 34 a6 7c 4f  |.......z.L..4.|O|
-000002b0  23 61 d9 47 b0 6c ae cb  72 14 03 03 00 01 01 16  |#a.G.l..r.......|
+00000230  88 0f 00 00 84 08 04 00  80 47 44 b3 b1 39 6e 07  |.........GD..9n.|
+00000240  14 9c 0d 2f bd 5e 39 06  7a af b2 d0 52 9c 6b b8  |.../.^9.z...R.k.|
+00000250  6e 07 59 e7 a2 c2 33 83  31 d6 42 79 25 ed 37 b0  |n.Y...3.1.By%.7.|
+00000260  97 25 d5 cc a7 7b 54 36  a3 a2 7c 67 38 c2 92 e9  |.%...{T6..|g8...|
+00000270  ab 58 59 4f 22 89 57 2b  27 2c d4 e8 7b 1d 5f 0b  |.XYO".W+',..{._.|
+00000280  1f 94 15 b0 38 67 0d a7  ff 66 2d fd 02 65 d6 8b  |....8g...f-..e..|
+00000290  ce e2 2a 3c 83 70 56 26  00 e6 1b 47 69 9e 9d 3b  |..*<.pV&...Gi..;|
+000002a0  81 88 49 58 a6 3a a1 5f  27 dc 7e 79 86 40 af 8c  |..IX.:._'.~y.@..|
+000002b0  35 17 83 92 da 81 7c 41  0d 14 03 03 00 01 01 16  |5.....|A........|
 000002c0  03 03 00 40 00 00 00 00  00 00 00 00 00 00 00 00  |...@............|
-000002d0  00 00 00 00 d3 95 4a 65  d9 8e 3d 9c 2b 18 67 aa  |......Je..=.+.g.|
-000002e0  e0 d7 a6 dd fb af 42 06  0d 56 cc 3d 12 3e 7e 95  |......B..V.=.>~.|
-000002f0  18 6e 97 d6 cc 84 eb 90  a1 c3 b6 6e 3c 42 d1 2e  |.n.........n<B..|
-00000300  7a dc 41 81                                       |z.A.|
+000002d0  00 00 00 00 09 20 b3 66  7d 40 5d 62 f0 21 0c 02  |..... .f}@]b.!..|
+000002e0  66 75 9e 32 f7 28 e4 8e  ad 90 18 7d 6a 2b f0 1c  |fu.2.(.....}j+..|
+000002f0  3e d4 6d 55 c7 a6 74 88  58 25 c3 69 df 0f 86 10  |>.mU..t.X%.i....|
+00000300  3c 51 88 26                                       |<Q.&|
 >>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 40 71 ee 1d 4f 55  |..........@q..OU|
-00000010  b4 47 3d 26 52 5a 00 a5  ce 0e 31 6c 2d 09 95 df  |.G=&RZ....1l-...|
-00000020  fb 74 30 89 32 3d 47 29  58 ee 61 70 74 18 8c 01  |.t0.2=G)X.apt...|
-00000030  e3 16 d7 6e 3d a1 30 75  61 b8 99 e4 c5 82 82 d5  |...n=.0ua.......|
-00000040  75 f6 e1 b4 f8 97 77 92  00 64 06                 |u.....w..d.|
+00000000  14 03 03 00 01 01 16 03  03 00 40 80 4c 52 cc b6  |..........@.LR..|
+00000010  b3 e1 4d 8c a7 26 70 f3  47 21 ed ff 01 45 41 91  |..M..&p.G!...EA.|
+00000020  b7 ce 09 87 4d 5b d8 48  c5 9e b1 5d 42 e4 43 1c  |....M[.H...]B.C.|
+00000030  e0 90 c6 e2 20 64 80 30  6a e7 25 0f 7b 40 fe 8c  |.... d.0j.%.{@..|
+00000040  5f 80 b3 92 25 96 2b e9  38 f2 e3                 |_...%.+.8..|
 >>> 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 e2 68 77  75 6a f8 3c 3d 2c 96 52  |......hwuj.<=,.R|
-00000020  2d fc d5 3b d3 17 c0 29  df 99 f1 09 23 13 9f 89  |-..;...)....#...|
-00000030  dd 21 15 23 36 15 03 03  00 30 00 00 00 00 00 00  |.!.#6....0......|
-00000040  00 00 00 00 00 00 00 00  00 00 37 4e ac 91 80 02  |..........7N....|
-00000050  4f 4a 9f b4 3c 0e 24 87  c8 d0 41 24 ce 01 e2 bb  |OJ..<.$...A$....|
-00000060  18 af bc ce 09 4b 41 f6  db 08                    |.....KA...|
+00000010  00 00 00 00 00 6c d5 26  50 49 6f 1a 46 3a d2 3a  |.....l.&PIo.F:.:|
+00000020  ff b2 0b 17 65 ed 7f a4  b8 e8 82 f6 89 af 07 04  |....e...........|
+00000030  bc 77 d6 74 34 15 03 03  00 30 00 00 00 00 00 00  |.w.t4....0......|
+00000040  00 00 00 00 00 00 00 00  00 00 ca b6 5b 91 20 9d  |............[. .|
+00000050  91 42 33 eb f4 49 b6 38  24 fc 3c 8b f7 6c 6b fd  |.B3..I.8$.<..lk.|
+00000060  df e8 aa 07 18 29 cd 04  85 70                    |.....)...p|
diff --git a/src/crypto/tls/testdata/Client-TLSv12-ClientCert-RSA-RSA b/src/crypto/tls/testdata/Client-TLSv12-ClientCert-RSA-RSA
index cbc4bcc..c36f282 100644
--- a/src/crypto/tls/testdata/Client-TLSv12-ClientCert-RSA-RSA
+++ b/src/crypto/tls/testdata/Client-TLSv12-ClientCert-RSA-RSA
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fe 01 00 00  fa 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 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,75 +7,76 @@
 00000050  cc a8 c0 2b c0 2f c0 2c  c0 30 c0 09 c0 13 c0 0a  |...+./.,.0......|
 00000060  c0 14 00 9c 00 9d 00 2f  00 35 c0 12 00 0a c0 23  |......./.5.....#|
 00000070  c0 27 00 3c c0 07 c0 11  00 05 13 03 13 01 13 02  |.'.<............|
-00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
+00000080  01 00 00 7f 00 05 00 05  01 00 00 00 00 00 0a 00  |................|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
 000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
 000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
-000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
-000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
-000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
-000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
+000000c0  01 00 01 00 00 17 00 00  00 12 00 00 00 2b 00 09  |.............+..|
+000000d0  08 03 04 03 03 03 02 03  01 00 33 00 26 00 24 00  |..........3.&.$.|
+000000e0  1d 00 20 2f e5 7d a3 47  cd 62 43 15 28 da ac 5f  |.. /.}.G.bC.(.._|
+000000f0  bb 29 07 30 ff f6 84 af  c4 cf c2 ed 90 99 5f 58  |.).0.........._X|
+00000100  cb 3b 74                                          |.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 59 02 00 00  55 03 03 b6 96 f2 bc ed  |....Y...U.......|
-00000010  1b 14 73 de 12 10 cc e9  4d f2 c7 8b 46 d8 63 55  |..s.....M...F.cU|
-00000020  8f 04 33 ec 89 b5 70 93  01 1c f2 20 72 82 e1 16  |..3...p.... r...|
-00000030  9c 0e 70 25 84 2c 09 a6  4f 19 c0 ed 44 d6 98 13  |..p%.,..O...D...|
-00000040  97 f6 19 08 d4 b6 d3 ad  82 96 ef db c0 2f 00 00  |............./..|
-00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
-00000060  03 02 59 0b 00 02 55 00  02 52 00 02 4f 30 82 02  |..Y...U..R..O0..|
-00000070  4b 30 82 01 b4 a0 03 02  01 02 02 09 00 e8 f0 9d  |K0..............|
-00000080  3f e2 5b ea a6 30 0d 06  09 2a 86 48 86 f7 0d 01  |?.[..0...*.H....|
-00000090  01 0b 05 00 30 1f 31 0b  30 09 06 03 55 04 0a 13  |....0.1.0...U...|
-000000a0  02 47 6f 31 10 30 0e 06  03 55 04 03 13 07 47 6f  |.Go1.0...U....Go|
-000000b0  20 52 6f 6f 74 30 1e 17  0d 31 36 30 31 30 31 30  | Root0...1601010|
-000000c0  30 30 30 30 30 5a 17 0d  32 35 30 31 30 31 30 30  |00000Z..25010100|
-000000d0  30 30 30 30 5a 30 1a 31  0b 30 09 06 03 55 04 0a  |0000Z0.1.0...U..|
-000000e0  13 02 47 6f 31 0b 30 09  06 03 55 04 03 13 02 47  |..Go1.0...U....G|
-000000f0  6f 30 81 9f 30 0d 06 09  2a 86 48 86 f7 0d 01 01  |o0..0...*.H.....|
-00000100  01 05 00 03 81 8d 00 30  81 89 02 81 81 00 db 46  |.......0.......F|
-00000110  7d 93 2e 12 27 06 48 bc  06 28 21 ab 7e c4 b6 a2  |}...'.H..(!.~...|
-00000120  5d fe 1e 52 45 88 7a 36  47 a5 08 0d 92 42 5b c2  |]..RE.z6G....B[.|
-00000130  81 c0 be 97 79 98 40 fb  4f 6d 14 fd 2b 13 8b c2  |....y.@.Om..+...|
-00000140  a5 2e 67 d8 d4 09 9e d6  22 38 b7 4a 0b 74 73 2b  |..g....."8.J.ts+|
-00000150  c2 34 f1 d1 93 e5 96 d9  74 7b f3 58 9f 6c 61 3c  |.4......t{.X.la<|
-00000160  c0 b0 41 d4 d9 2b 2b 24  23 77 5b 1c 3b bd 75 5d  |..A..++$#w[.;.u]|
-00000170  ce 20 54 cf a1 63 87 1d  1e 24 c4 f3 1d 1a 50 8b  |. T..c...$....P.|
-00000180  aa b6 14 43 ed 97 a7 75  62 f4 14 c8 52 d7 02 03  |...C...ub...R...|
-00000190  01 00 01 a3 81 93 30 81  90 30 0e 06 03 55 1d 0f  |......0..0...U..|
-000001a0  01 01 ff 04 04 03 02 05  a0 30 1d 06 03 55 1d 25  |.........0...U.%|
-000001b0  04 16 30 14 06 08 2b 06  01 05 05 07 03 01 06 08  |..0...+.........|
-000001c0  2b 06 01 05 05 07 03 02  30 0c 06 03 55 1d 13 01  |+.......0...U...|
-000001d0  01 ff 04 02 30 00 30 19  06 03 55 1d 0e 04 12 04  |....0.0...U.....|
-000001e0  10 9f 91 16 1f 43 43 3e  49 a6 de 6d b6 80 d7 9f  |.....CC>I..m....|
-000001f0  60 30 1b 06 03 55 1d 23  04 14 30 12 80 10 48 13  |`0...U.#..0...H.|
-00000200  49 4d 13 7e 16 31 bb a3  01 d5 ac ab 6e 7b 30 19  |IM.~.1......n{0.|
-00000210  06 03 55 1d 11 04 12 30  10 82 0e 65 78 61 6d 70  |..U....0...examp|
-00000220  6c 65 2e 67 6f 6c 61 6e  67 30 0d 06 09 2a 86 48  |le.golang0...*.H|
-00000230  86 f7 0d 01 01 0b 05 00  03 81 81 00 9d 30 cc 40  |.............0.@|
-00000240  2b 5b 50 a0 61 cb ba e5  53 58 e1 ed 83 28 a9 58  |+[P.a...SX...(.X|
-00000250  1a a9 38 a4 95 a1 ac 31  5a 1a 84 66 3d 43 d3 2d  |..8....1Z..f=C.-|
-00000260  d9 0b f2 97 df d3 20 64  38 92 24 3a 00 bc cf 9c  |...... d8.$:....|
-00000270  7d b7 40 20 01 5f aa d3  16 61 09 a2 76 fd 13 c3  |}.@ ._...a..v...|
-00000280  cc e1 0c 5c ee b1 87 82  f1 6c 04 ed 73 bb b3 43  |...\.....l..s..C|
-00000290  77 8d 0c 1c f1 0f a1 d8  40 83 61 c9 4c 72 2b 9d  |w.......@.a.Lr+.|
-000002a0  ae db 46 06 06 4d f4 c1  b3 3e c0 d1 bd 42 d4 db  |..F..M...>...B..|
-000002b0  fe 3d 13 60 84 5c 21 d3  3b e9 fa e7 16 03 03 00  |.=.`.\!.;.......|
-000002c0  ac 0c 00 00 a8 03 00 1d  20 21 1b d1 91 16 9c c1  |........ !......|
-000002d0  51 52 39 07 6b 6d ab 07  28 f7 d0 ae 02 13 5e 73  |QR9.km..(.....^s|
-000002e0  5b 51 30 96 27 57 56 e5  37 08 04 00 80 6a 13 82  |[Q0.'WV.7....j..|
-000002f0  97 81 ea 32 51 cb cb 8e  3b ee e5 dd 4f 80 20 50  |...2Q...;...O. P|
-00000300  c9 f0 19 9b d5 1b ae 21  f7 e6 24 4e a3 22 ec b9  |.......!..$N."..|
-00000310  25 6e 77 19 12 08 16 8a  c7 c1 db 29 e9 be 05 55  |%nw........)...U|
-00000320  09 c1 6e 44 c3 d7 bd 18  80 c8 1f 42 53 3b e6 09  |..nD.......BS;..|
-00000330  00 29 20 c4 94 04 97 6f  f7 e6 f4 3b 66 77 2f e5  |.) ....o...;fw/.|
-00000340  de 96 6f c3 67 c5 ce 4b  5e 4b 0e 90 02 fc 32 7f  |..o.g..K^K....2.|
-00000350  71 f4 63 76 37 57 75 30  fb 1b f5 99 98 5f c3 b1  |q.cv7Wu0....._..|
-00000360  fb e3 76 ad 8e 2f 7a 72  86 ed 34 18 98 16 03 03  |..v../zr..4.....|
-00000370  00 3a 0d 00 00 36 03 01  02 40 00 2e 04 03 05 03  |.:...6...@......|
-00000380  06 03 08 07 08 08 08 09  08 0a 08 0b 08 04 08 05  |................|
-00000390  08 06 04 01 05 01 06 01  03 03 02 03 03 01 02 01  |................|
-000003a0  03 02 02 02 04 02 05 02  06 02 00 00 16 03 03 00  |................|
-000003b0  04 0e 00 00 00                                    |.....|
+00000000  16 03 03 00 5d 02 00 00  59 03 03 04 e5 45 68 3b  |....]...Y....Eh;|
+00000010  73 6e 96 92 17 2a e1 5e  f8 6a 16 a1 5e a9 55 d0  |sn...*.^.j..^.U.|
+00000020  f5 2a 30 1d 94 96 5b 76  d4 c3 d5 20 2b 8a eb 6d  |.*0...[v... +..m|
+00000030  9c 5a 72 4e a9 df e0 5b  91 7e eb c7 e4 12 6d 1d  |.ZrN...[.~....m.|
+00000040  a5 3f 54 e2 27 dd 07 4f  df be b2 e7 c0 2f 00 00  |.?T.'..O...../..|
+00000050  11 ff 01 00 01 00 00 0b  00 04 03 00 01 02 00 17  |................|
+00000060  00 00 16 03 03 02 59 0b  00 02 55 00 02 52 00 02  |......Y...U..R..|
+00000070  4f 30 82 02 4b 30 82 01  b4 a0 03 02 01 02 02 09  |O0..K0..........|
+00000080  00 e8 f0 9d 3f e2 5b ea  a6 30 0d 06 09 2a 86 48  |....?.[..0...*.H|
+00000090  86 f7 0d 01 01 0b 05 00  30 1f 31 0b 30 09 06 03  |........0.1.0...|
+000000a0  55 04 0a 13 02 47 6f 31  10 30 0e 06 03 55 04 03  |U....Go1.0...U..|
+000000b0  13 07 47 6f 20 52 6f 6f  74 30 1e 17 0d 31 36 30  |..Go Root0...160|
+000000c0  31 30 31 30 30 30 30 30  30 5a 17 0d 32 35 30 31  |101000000Z..2501|
+000000d0  30 31 30 30 30 30 30 30  5a 30 1a 31 0b 30 09 06  |01000000Z0.1.0..|
+000000e0  03 55 04 0a 13 02 47 6f  31 0b 30 09 06 03 55 04  |.U....Go1.0...U.|
+000000f0  03 13 02 47 6f 30 81 9f  30 0d 06 09 2a 86 48 86  |...Go0..0...*.H.|
+00000100  f7 0d 01 01 01 05 00 03  81 8d 00 30 81 89 02 81  |...........0....|
+00000110  81 00 db 46 7d 93 2e 12  27 06 48 bc 06 28 21 ab  |...F}...'.H..(!.|
+00000120  7e c4 b6 a2 5d fe 1e 52  45 88 7a 36 47 a5 08 0d  |~...]..RE.z6G...|
+00000130  92 42 5b c2 81 c0 be 97  79 98 40 fb 4f 6d 14 fd  |.B[.....y.@.Om..|
+00000140  2b 13 8b c2 a5 2e 67 d8  d4 09 9e d6 22 38 b7 4a  |+.....g....."8.J|
+00000150  0b 74 73 2b c2 34 f1 d1  93 e5 96 d9 74 7b f3 58  |.ts+.4......t{.X|
+00000160  9f 6c 61 3c c0 b0 41 d4  d9 2b 2b 24 23 77 5b 1c  |.la<..A..++$#w[.|
+00000170  3b bd 75 5d ce 20 54 cf  a1 63 87 1d 1e 24 c4 f3  |;.u]. T..c...$..|
+00000180  1d 1a 50 8b aa b6 14 43  ed 97 a7 75 62 f4 14 c8  |..P....C...ub...|
+00000190  52 d7 02 03 01 00 01 a3  81 93 30 81 90 30 0e 06  |R.........0..0..|
+000001a0  03 55 1d 0f 01 01 ff 04  04 03 02 05 a0 30 1d 06  |.U...........0..|
+000001b0  03 55 1d 25 04 16 30 14  06 08 2b 06 01 05 05 07  |.U.%..0...+.....|
+000001c0  03 01 06 08 2b 06 01 05  05 07 03 02 30 0c 06 03  |....+.......0...|
+000001d0  55 1d 13 01 01 ff 04 02  30 00 30 19 06 03 55 1d  |U.......0.0...U.|
+000001e0  0e 04 12 04 10 9f 91 16  1f 43 43 3e 49 a6 de 6d  |.........CC>I..m|
+000001f0  b6 80 d7 9f 60 30 1b 06  03 55 1d 23 04 14 30 12  |....`0...U.#..0.|
+00000200  80 10 48 13 49 4d 13 7e  16 31 bb a3 01 d5 ac ab  |..H.IM.~.1......|
+00000210  6e 7b 30 19 06 03 55 1d  11 04 12 30 10 82 0e 65  |n{0...U....0...e|
+00000220  78 61 6d 70 6c 65 2e 67  6f 6c 61 6e 67 30 0d 06  |xample.golang0..|
+00000230  09 2a 86 48 86 f7 0d 01  01 0b 05 00 03 81 81 00  |.*.H............|
+00000240  9d 30 cc 40 2b 5b 50 a0  61 cb ba e5 53 58 e1 ed  |.0.@+[P.a...SX..|
+00000250  83 28 a9 58 1a a9 38 a4  95 a1 ac 31 5a 1a 84 66  |.(.X..8....1Z..f|
+00000260  3d 43 d3 2d d9 0b f2 97  df d3 20 64 38 92 24 3a  |=C.-...... d8.$:|
+00000270  00 bc cf 9c 7d b7 40 20  01 5f aa d3 16 61 09 a2  |....}.@ ._...a..|
+00000280  76 fd 13 c3 cc e1 0c 5c  ee b1 87 82 f1 6c 04 ed  |v......\.....l..|
+00000290  73 bb b3 43 77 8d 0c 1c  f1 0f a1 d8 40 83 61 c9  |s..Cw.......@.a.|
+000002a0  4c 72 2b 9d ae db 46 06  06 4d f4 c1 b3 3e c0 d1  |Lr+...F..M...>..|
+000002b0  bd 42 d4 db fe 3d 13 60  84 5c 21 d3 3b e9 fa e7  |.B...=.`.\!.;...|
+000002c0  16 03 03 00 ac 0c 00 00  a8 03 00 1d 20 77 dc b7  |............ w..|
+000002d0  44 64 c9 3b e9 e2 bf b5  01 47 c9 64 f8 ef ee 33  |Dd.;.....G.d...3|
+000002e0  e2 81 a1 af 05 c0 31 37  1f 8d 3c 55 45 08 04 00  |......17..<UE...|
+000002f0  80 5f fe b0 72 52 a4 24  39 0b ef c5 c0 30 c8 21  |._..rR.$9....0.!|
+00000300  89 14 a0 08 0a 78 13 5f  68 ab 4b 73 6b cd 82 9b  |.....x._h.Ksk...|
+00000310  d0 4e 4f 3e fb bf 0f a4  6b 32 d0 a6 44 dc be 0d  |.NO>....k2..D...|
+00000320  54 7e 57 74 92 a3 4e f9  cf 70 52 b1 50 9a 60 4f  |T~Wt..N..pR.P.`O|
+00000330  79 72 5d c4 53 ba 19 ff  05 56 1d 41 be 18 77 71  |yr].S....V.A..wq|
+00000340  5c 00 84 5e 70 fa cf 9e  8e d2 62 7d 48 6a fe 75  |\..^p.....b}Hj.u|
+00000350  6a 67 5b 82 52 76 d4 fc  96 a4 ad fa a9 ea fc e5  |jg[.Rv..........|
+00000360  97 dd 53 a0 ef 53 00 27  72 ae 5b c9 06 f6 43 c8  |..S..S.'r.[...C.|
+00000370  d5 16 03 03 00 3a 0d 00  00 36 03 01 02 40 00 2e  |.....:...6...@..|
+00000380  04 03 05 03 06 03 08 07  08 08 08 09 08 0a 08 0b  |................|
+00000390  08 04 08 05 08 06 04 01  05 01 06 01 03 03 02 03  |................|
+000003a0  03 01 02 01 03 02 02 02  04 02 05 02 06 02 00 00  |................|
+000003b0  16 03 03 00 04 0e 00 00  00                       |.........|
 >>> Flow 3 (client to server)
 00000000  16 03 03 01 fd 0b 00 01  f9 00 01 f6 00 01 f3 30  |...............0|
 00000010  82 01 ef 30 82 01 58 a0  03 02 01 02 02 10 5c 19  |...0..X.......\.|
@@ -112,26 +113,26 @@
 00000200  e5 35 16 03 03 00 25 10  00 00 21 20 2f e5 7d a3  |.5....%...! /.}.|
 00000210  47 cd 62 43 15 28 da ac  5f bb 29 07 30 ff f6 84  |G.bC.(.._.).0...|
 00000220  af c4 cf c2 ed 90 99 5f  58 cb 3b 74 16 03 03 00  |......._X.;t....|
-00000230  88 0f 00 00 84 08 04 00  80 90 53 1e fc 7c 63 b0  |..........S..|c.|
-00000240  98 c5 19 40 fb 4f cf c3  53 51 81 68 54 c7 49 38  |...@.O..SQ.hT.I8|
-00000250  0c 41 f0 12 7d a6 e4 8a  4e 77 97 49 5a 07 7d 30  |.A..}...Nw.IZ.}0|
-00000260  fa df 77 2f 51 cf 37 65  07 0b 2c 91 15 43 1d c9  |..w/Q.7e..,..C..|
-00000270  69 46 e2 26 66 72 98 ec  62 1a 22 ae e8 3e 3a 28  |iF.&fr..b."..>:(|
-00000280  17 83 b9 74 57 59 a2 ec  31 95 17 1f c3 ec 9a 01  |...tWY..1.......|
-00000290  f2 d4 07 d5 ee d5 0e f2  f4 75 3b d6 b8 df aa ad  |.........u;.....|
-000002a0  0b 87 37 30 43 7e c1 b1  e1 0d 7e 90 3d 87 9d 93  |..70C~....~.=...|
-000002b0  d7 06 57 18 5c 12 c2 32  0d 14 03 03 00 01 01 16  |..W.\..2........|
-000002c0  03 03 00 28 00 00 00 00  00 00 00 00 ff 2a ae f8  |...(.........*..|
-000002d0  c9 1c bd 3f 62 0e 68 42  e7 96 ec ee c0 fa 71 34  |...?b.hB......q4|
-000002e0  f1 e2 67 76 82 cf c3 2a  fb b2 5a c1              |..gv...*..Z.|
+00000230  88 0f 00 00 84 08 04 00  80 56 b9 1d 6a ed f4 b2  |.........V..j...|
+00000240  e9 2b 9c 6b a3 18 78 1c  76 18 57 7d a3 05 6f 7e  |.+.k..x.v.W}..o~|
+00000250  36 52 e2 d7 35 f9 c2 2d  81 db ca ee 85 f9 45 d8  |6R..5..-......E.|
+00000260  d7 ec 76 9c 1d 85 b7 38  9d 12 f6 64 dc fe ca 16  |..v....8...d....|
+00000270  2f ad 91 ae b5 a1 18 bf  85 df 07 bc 7b 42 5b 6d  |/...........{B[m|
+00000280  ad 54 c7 ae 42 b0 3b e7  b7 70 b9 80 ef a1 65 e7  |.T..B.;..p....e.|
+00000290  46 aa e4 9a 22 d9 ce 1f  7d 33 b9 62 4d 3d 77 8a  |F..."...}3.bM=w.|
+000002a0  b8 ac 38 64 f0 aa 95 be  be 78 bc ad 94 b8 90 29  |..8d.....x.....)|
+000002b0  72 7f d1 ed f0 bf 79 13  00 14 03 03 00 01 01 16  |r.....y.........|
+000002c0  03 03 00 28 00 00 00 00  00 00 00 00 b6 3d 7b 87  |...(.........={.|
+000002d0  c8 a0 18 96 ec f8 36 f4  4c 18 7e 13 6b 56 1e de  |......6.L.~.kV..|
+000002e0  80 8a 37 1b 4e 84 85 3f  60 e8 50 55              |..7.N..?`.PU|
 >>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 28 da 70 e7 aa 1b  |..........(.p...|
-00000010  6c 66 cb 9b 07 d9 4e 87  6f 87 60 fb 46 f5 e9 33  |lf....N.o.`.F..3|
-00000020  48 59 ff 3e b5 bf 0b 0c  b2 39 79 64 f6 3c 2e 95  |HY.>.....9yd.<..|
-00000030  04 51 87                                          |.Q.|
+00000000  14 03 03 00 01 01 16 03  03 00 28 38 5d b5 b3 a8  |..........(8]...|
+00000010  94 65 de ee 2e e9 4f f3  13 9e ff 0a f4 d2 b0 9e  |.e....O.........|
+00000020  e7 ec 8c 7c 03 8f c3 fc  c6 97 75 5b 96 1d 64 ad  |...|......u[..d.|
+00000030  4f ee dd                                          |O..|
 >>> Flow 5 (client to server)
-00000000  17 03 03 00 1e 00 00 00  00 00 00 00 01 21 29 d2  |.............!).|
-00000010  27 05 2d b4 a2 bf ea f2  96 8a 61 c9 91 75 9f 0f  |'.-.......a..u..|
-00000020  50 4a 76 15 03 03 00 1a  00 00 00 00 00 00 00 02  |PJv.............|
-00000030  a9 40 eb 86 b2 f0 85 a2  75 bc 4e 09 8c c9 ca 31  |.@......u.N....1|
-00000040  e5 49                                             |.I|
+00000000  17 03 03 00 1e 00 00 00  00 00 00 00 01 a5 03 23  |...............#|
+00000010  3a 39 6b b5 e5 71 c8 87  07 b4 c9 79 2b 84 d9 9d  |:9k..q.....y+...|
+00000020  1b 21 26 15 03 03 00 1a  00 00 00 00 00 00 00 02  |.!&.............|
+00000030  f5 e9 fb d2 c8 57 34 45  e1 27 8e 35 6d 36 95 10  |.....W4E.'.5m6..|
+00000040  76 0d                                             |v.|
diff --git a/src/crypto/tls/testdata/Client-TLSv12-ClientCert-RSA-RSAPKCS1v15 b/src/crypto/tls/testdata/Client-TLSv12-ClientCert-RSA-RSAPKCS1v15
index b8ecfff..bf2f5c4 100644
--- a/src/crypto/tls/testdata/Client-TLSv12-ClientCert-RSA-RSAPKCS1v15
+++ b/src/crypto/tls/testdata/Client-TLSv12-ClientCert-RSA-RSAPKCS1v15
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fe 01 00 00  fa 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 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,72 +7,73 @@
 00000050  cc a8 c0 2b c0 2f c0 2c  c0 30 c0 09 c0 13 c0 0a  |...+./.,.0......|
 00000060  c0 14 00 9c 00 9d 00 2f  00 35 c0 12 00 0a c0 23  |......./.5.....#|
 00000070  c0 27 00 3c c0 07 c0 11  00 05 13 03 13 01 13 02  |.'.<............|
-00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
+00000080  01 00 00 7f 00 05 00 05  01 00 00 00 00 00 0a 00  |................|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
 000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
 000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
-000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
-000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
-000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
-000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
+000000c0  01 00 01 00 00 17 00 00  00 12 00 00 00 2b 00 09  |.............+..|
+000000d0  08 03 04 03 03 03 02 03  01 00 33 00 26 00 24 00  |..........3.&.$.|
+000000e0  1d 00 20 2f e5 7d a3 47  cd 62 43 15 28 da ac 5f  |.. /.}.G.bC.(.._|
+000000f0  bb 29 07 30 ff f6 84 af  c4 cf c2 ed 90 99 5f 58  |.).0.........._X|
+00000100  cb 3b 74                                          |.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 59 02 00 00  55 03 03 ad e1 a7 5e 0b  |....Y...U.....^.|
-00000010  b8 bd 9d 05 c2 8e 6c f2  ea 7d a1 c8 32 cc d1 74  |......l..}..2..t|
-00000020  ba 86 75 98 33 27 39 c3  0a 6f 49 20 2b 37 9a 0f  |..u.3'9..oI +7..|
-00000030  9b de 1f 1d 5f 2b 45 29  6c 9b 33 c6 bc c1 15 a4  |...._+E)l.3.....|
-00000040  19 9b 70 6c 15 eb 4a 92  92 5f b7 6b c0 2f 00 00  |..pl..J.._.k./..|
-00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
-00000060  03 02 59 0b 00 02 55 00  02 52 00 02 4f 30 82 02  |..Y...U..R..O0..|
-00000070  4b 30 82 01 b4 a0 03 02  01 02 02 09 00 e8 f0 9d  |K0..............|
-00000080  3f e2 5b ea a6 30 0d 06  09 2a 86 48 86 f7 0d 01  |?.[..0...*.H....|
-00000090  01 0b 05 00 30 1f 31 0b  30 09 06 03 55 04 0a 13  |....0.1.0...U...|
-000000a0  02 47 6f 31 10 30 0e 06  03 55 04 03 13 07 47 6f  |.Go1.0...U....Go|
-000000b0  20 52 6f 6f 74 30 1e 17  0d 31 36 30 31 30 31 30  | Root0...1601010|
-000000c0  30 30 30 30 30 5a 17 0d  32 35 30 31 30 31 30 30  |00000Z..25010100|
-000000d0  30 30 30 30 5a 30 1a 31  0b 30 09 06 03 55 04 0a  |0000Z0.1.0...U..|
-000000e0  13 02 47 6f 31 0b 30 09  06 03 55 04 03 13 02 47  |..Go1.0...U....G|
-000000f0  6f 30 81 9f 30 0d 06 09  2a 86 48 86 f7 0d 01 01  |o0..0...*.H.....|
-00000100  01 05 00 03 81 8d 00 30  81 89 02 81 81 00 db 46  |.......0.......F|
-00000110  7d 93 2e 12 27 06 48 bc  06 28 21 ab 7e c4 b6 a2  |}...'.H..(!.~...|
-00000120  5d fe 1e 52 45 88 7a 36  47 a5 08 0d 92 42 5b c2  |]..RE.z6G....B[.|
-00000130  81 c0 be 97 79 98 40 fb  4f 6d 14 fd 2b 13 8b c2  |....y.@.Om..+...|
-00000140  a5 2e 67 d8 d4 09 9e d6  22 38 b7 4a 0b 74 73 2b  |..g....."8.J.ts+|
-00000150  c2 34 f1 d1 93 e5 96 d9  74 7b f3 58 9f 6c 61 3c  |.4......t{.X.la<|
-00000160  c0 b0 41 d4 d9 2b 2b 24  23 77 5b 1c 3b bd 75 5d  |..A..++$#w[.;.u]|
-00000170  ce 20 54 cf a1 63 87 1d  1e 24 c4 f3 1d 1a 50 8b  |. T..c...$....P.|
-00000180  aa b6 14 43 ed 97 a7 75  62 f4 14 c8 52 d7 02 03  |...C...ub...R...|
-00000190  01 00 01 a3 81 93 30 81  90 30 0e 06 03 55 1d 0f  |......0..0...U..|
-000001a0  01 01 ff 04 04 03 02 05  a0 30 1d 06 03 55 1d 25  |.........0...U.%|
-000001b0  04 16 30 14 06 08 2b 06  01 05 05 07 03 01 06 08  |..0...+.........|
-000001c0  2b 06 01 05 05 07 03 02  30 0c 06 03 55 1d 13 01  |+.......0...U...|
-000001d0  01 ff 04 02 30 00 30 19  06 03 55 1d 0e 04 12 04  |....0.0...U.....|
-000001e0  10 9f 91 16 1f 43 43 3e  49 a6 de 6d b6 80 d7 9f  |.....CC>I..m....|
-000001f0  60 30 1b 06 03 55 1d 23  04 14 30 12 80 10 48 13  |`0...U.#..0...H.|
-00000200  49 4d 13 7e 16 31 bb a3  01 d5 ac ab 6e 7b 30 19  |IM.~.1......n{0.|
-00000210  06 03 55 1d 11 04 12 30  10 82 0e 65 78 61 6d 70  |..U....0...examp|
-00000220  6c 65 2e 67 6f 6c 61 6e  67 30 0d 06 09 2a 86 48  |le.golang0...*.H|
-00000230  86 f7 0d 01 01 0b 05 00  03 81 81 00 9d 30 cc 40  |.............0.@|
-00000240  2b 5b 50 a0 61 cb ba e5  53 58 e1 ed 83 28 a9 58  |+[P.a...SX...(.X|
-00000250  1a a9 38 a4 95 a1 ac 31  5a 1a 84 66 3d 43 d3 2d  |..8....1Z..f=C.-|
-00000260  d9 0b f2 97 df d3 20 64  38 92 24 3a 00 bc cf 9c  |...... d8.$:....|
-00000270  7d b7 40 20 01 5f aa d3  16 61 09 a2 76 fd 13 c3  |}.@ ._...a..v...|
-00000280  cc e1 0c 5c ee b1 87 82  f1 6c 04 ed 73 bb b3 43  |...\.....l..s..C|
-00000290  77 8d 0c 1c f1 0f a1 d8  40 83 61 c9 4c 72 2b 9d  |w.......@.a.Lr+.|
-000002a0  ae db 46 06 06 4d f4 c1  b3 3e c0 d1 bd 42 d4 db  |..F..M...>...B..|
-000002b0  fe 3d 13 60 84 5c 21 d3  3b e9 fa e7 16 03 03 00  |.=.`.\!.;.......|
-000002c0  ac 0c 00 00 a8 03 00 1d  20 ba ad fb 1e 28 95 96  |........ ....(..|
-000002d0  f3 62 9d 97 87 0f fd fc  a9 91 a2 4b 8d 69 ec 8f  |.b.........K.i..|
-000002e0  7d 49 08 6e fe 7d b3 5b  03 04 01 00 80 86 57 23  |}I.n.}.[......W#|
-000002f0  58 bb 9a 50 d8 bb 99 d9  f5 cc 66 43 38 f0 14 8a  |X..P......fC8...|
-00000300  cb 6d 8b c0 83 52 f8 53  75 94 07 e3 12 2c 10 bb  |.m...R.Su....,..|
-00000310  f3 9b 74 84 1f 11 f3 06  c3 f4 df db f0 1e 0a cd  |..t.............|
-00000320  1b 45 18 44 88 67 79 ca  3e 6e 2b 73 c2 10 84 d8  |.E.D.gy.>n+s....|
-00000330  7b c5 2e 81 7d 53 19 46  09 35 35 8b 66 8a a8 cc  |{...}S.F.55.f...|
-00000340  20 ba 20 15 9f d1 27 9c  6b 3c bb 48 79 4a 7e 11  | . ...'.k<.HyJ~.|
-00000350  da e3 26 5b 3a 95 da 4d  bd 86 3e 8c 97 55 7c 22  |..&[:..M..>..U|"|
-00000360  a1 d3 88 61 ae e1 3b 51  25 c6 01 7e 10 16 03 03  |...a..;Q%..~....|
-00000370  00 0c 0d 00 00 08 01 01  00 02 04 01 00 00 16 03  |................|
-00000380  03 00 04 0e 00 00 00                              |.......|
+00000000  16 03 03 00 5d 02 00 00  59 03 03 0d ab 4e 27 0a  |....]...Y....N'.|
+00000010  9c 1b 91 00 41 33 eb a7  d6 84 45 e0 dd f7 8a a1  |....A3....E.....|
+00000020  62 c4 e0 2d 2f 51 4f 33  21 2a 6d 20 24 2d d0 3f  |b..-/QO3!*m $-.?|
+00000030  cc 5a 9c 5f b7 53 54 fc  c7 bf a9 2c 8e 39 16 e4  |.Z._.ST....,.9..|
+00000040  7d 80 72 6b 95 93 51 41  8a da 67 29 c0 2f 00 00  |}.rk..QA..g)./..|
+00000050  11 ff 01 00 01 00 00 0b  00 04 03 00 01 02 00 17  |................|
+00000060  00 00 16 03 03 02 59 0b  00 02 55 00 02 52 00 02  |......Y...U..R..|
+00000070  4f 30 82 02 4b 30 82 01  b4 a0 03 02 01 02 02 09  |O0..K0..........|
+00000080  00 e8 f0 9d 3f e2 5b ea  a6 30 0d 06 09 2a 86 48  |....?.[..0...*.H|
+00000090  86 f7 0d 01 01 0b 05 00  30 1f 31 0b 30 09 06 03  |........0.1.0...|
+000000a0  55 04 0a 13 02 47 6f 31  10 30 0e 06 03 55 04 03  |U....Go1.0...U..|
+000000b0  13 07 47 6f 20 52 6f 6f  74 30 1e 17 0d 31 36 30  |..Go Root0...160|
+000000c0  31 30 31 30 30 30 30 30  30 5a 17 0d 32 35 30 31  |101000000Z..2501|
+000000d0  30 31 30 30 30 30 30 30  5a 30 1a 31 0b 30 09 06  |01000000Z0.1.0..|
+000000e0  03 55 04 0a 13 02 47 6f  31 0b 30 09 06 03 55 04  |.U....Go1.0...U.|
+000000f0  03 13 02 47 6f 30 81 9f  30 0d 06 09 2a 86 48 86  |...Go0..0...*.H.|
+00000100  f7 0d 01 01 01 05 00 03  81 8d 00 30 81 89 02 81  |...........0....|
+00000110  81 00 db 46 7d 93 2e 12  27 06 48 bc 06 28 21 ab  |...F}...'.H..(!.|
+00000120  7e c4 b6 a2 5d fe 1e 52  45 88 7a 36 47 a5 08 0d  |~...]..RE.z6G...|
+00000130  92 42 5b c2 81 c0 be 97  79 98 40 fb 4f 6d 14 fd  |.B[.....y.@.Om..|
+00000140  2b 13 8b c2 a5 2e 67 d8  d4 09 9e d6 22 38 b7 4a  |+.....g....."8.J|
+00000150  0b 74 73 2b c2 34 f1 d1  93 e5 96 d9 74 7b f3 58  |.ts+.4......t{.X|
+00000160  9f 6c 61 3c c0 b0 41 d4  d9 2b 2b 24 23 77 5b 1c  |.la<..A..++$#w[.|
+00000170  3b bd 75 5d ce 20 54 cf  a1 63 87 1d 1e 24 c4 f3  |;.u]. T..c...$..|
+00000180  1d 1a 50 8b aa b6 14 43  ed 97 a7 75 62 f4 14 c8  |..P....C...ub...|
+00000190  52 d7 02 03 01 00 01 a3  81 93 30 81 90 30 0e 06  |R.........0..0..|
+000001a0  03 55 1d 0f 01 01 ff 04  04 03 02 05 a0 30 1d 06  |.U...........0..|
+000001b0  03 55 1d 25 04 16 30 14  06 08 2b 06 01 05 05 07  |.U.%..0...+.....|
+000001c0  03 01 06 08 2b 06 01 05  05 07 03 02 30 0c 06 03  |....+.......0...|
+000001d0  55 1d 13 01 01 ff 04 02  30 00 30 19 06 03 55 1d  |U.......0.0...U.|
+000001e0  0e 04 12 04 10 9f 91 16  1f 43 43 3e 49 a6 de 6d  |.........CC>I..m|
+000001f0  b6 80 d7 9f 60 30 1b 06  03 55 1d 23 04 14 30 12  |....`0...U.#..0.|
+00000200  80 10 48 13 49 4d 13 7e  16 31 bb a3 01 d5 ac ab  |..H.IM.~.1......|
+00000210  6e 7b 30 19 06 03 55 1d  11 04 12 30 10 82 0e 65  |n{0...U....0...e|
+00000220  78 61 6d 70 6c 65 2e 67  6f 6c 61 6e 67 30 0d 06  |xample.golang0..|
+00000230  09 2a 86 48 86 f7 0d 01  01 0b 05 00 03 81 81 00  |.*.H............|
+00000240  9d 30 cc 40 2b 5b 50 a0  61 cb ba e5 53 58 e1 ed  |.0.@+[P.a...SX..|
+00000250  83 28 a9 58 1a a9 38 a4  95 a1 ac 31 5a 1a 84 66  |.(.X..8....1Z..f|
+00000260  3d 43 d3 2d d9 0b f2 97  df d3 20 64 38 92 24 3a  |=C.-...... d8.$:|
+00000270  00 bc cf 9c 7d b7 40 20  01 5f aa d3 16 61 09 a2  |....}.@ ._...a..|
+00000280  76 fd 13 c3 cc e1 0c 5c  ee b1 87 82 f1 6c 04 ed  |v......\.....l..|
+00000290  73 bb b3 43 77 8d 0c 1c  f1 0f a1 d8 40 83 61 c9  |s..Cw.......@.a.|
+000002a0  4c 72 2b 9d ae db 46 06  06 4d f4 c1 b3 3e c0 d1  |Lr+...F..M...>..|
+000002b0  bd 42 d4 db fe 3d 13 60  84 5c 21 d3 3b e9 fa e7  |.B...=.`.\!.;...|
+000002c0  16 03 03 00 ac 0c 00 00  a8 03 00 1d 20 94 9e e3  |............ ...|
+000002d0  41 3b c6 0c cc 05 92 ac  ea 8c 9e 2d e5 bc 42 30  |A;.........-..B0|
+000002e0  47 87 d6 b3 6e d5 73 9f  ca 2a 48 9a 04 04 01 00  |G...n.s..*H.....|
+000002f0  80 d6 f2 ef 4a 3f ca 47  9a 13 e4 38 3b d8 23 77  |....J?.G...8;.#w|
+00000300  b4 84 fa 89 c4 e6 e2 84  e2 a7 50 81 e4 b2 b8 1f  |..........P.....|
+00000310  04 15 0d 50 5f 4a 95 e3  0d 27 c3 2f 96 9b 92 c0  |...P_J...'./....|
+00000320  fb 6a 52 c1 a4 39 39 7e  8f da 53 5e 34 db 62 01  |.jR..99~..S^4.b.|
+00000330  6d 0a 14 bd b5 0a 24 b5  df b2 99 56 cd 68 a6 75  |m.....$....V.h.u|
+00000340  9f 70 1a f6 d3 6b f6 68  ef bc 75 09 69 c4 18 4a  |.p...k.h..u.i..J|
+00000350  dc 51 c2 65 01 36 f1 c0  d9 34 66 d1 c2 dc d9 0d  |.Q.e.6...4f.....|
+00000360  f5 74 4f 84 df b0 c2 d2  0a d6 51 fc 6e 3c d8 74  |.tO.......Q.n<.t|
+00000370  35 16 03 03 00 0c 0d 00  00 08 01 01 00 02 04 01  |5...............|
+00000380  00 00 16 03 03 00 04 0e  00 00 00                 |...........|
 >>> Flow 3 (client to server)
 00000000  16 03 03 01 fd 0b 00 01  f9 00 01 f6 00 01 f3 30  |...............0|
 00000010  82 01 ef 30 82 01 58 a0  03 02 01 02 02 10 5c 19  |...0..X.......\.|
@@ -109,26 +110,26 @@
 00000200  e5 35 16 03 03 00 25 10  00 00 21 20 2f e5 7d a3  |.5....%...! /.}.|
 00000210  47 cd 62 43 15 28 da ac  5f bb 29 07 30 ff f6 84  |G.bC.(.._.).0...|
 00000220  af c4 cf c2 ed 90 99 5f  58 cb 3b 74 16 03 03 00  |......._X.;t....|
-00000230  88 0f 00 00 84 04 01 00  80 12 a4 42 13 85 6f 92  |...........B..o.|
-00000240  6d 26 5d 05 3c b7 80 ab  a9 e0 74 3d 89 67 79 a0  |m&].<.....t=.gy.|
-00000250  9f e1 a9 20 d8 82 e2 22  99 38 03 fe 32 d9 1f c7  |... ...".8..2...|
-00000260  39 1e 27 31 59 05 eb aa  bc 2c 10 eb f0 82 65 65  |9.'1Y....,....ee|
-00000270  ce b2 e9 83 67 21 43 03  19 2d 14 9f c3 db bc dc  |....g!C..-......|
-00000280  59 66 95 d7 4e 09 3c f0  f2 4a 39 f7 db c4 0c 4e  |Yf..N.<..J9....N|
-00000290  73 e2 d6 59 f1 bc 06 d8  75 df 32 b7 f1 b4 01 98  |s..Y....u.2.....|
-000002a0  4f 93 43 a3 a6 09 da cd  1c ee 26 65 ab d1 2a 56  |O.C.......&e..*V|
-000002b0  74 32 24 46 27 f3 d9 6a  df 14 03 03 00 01 01 16  |t2$F'..j........|
-000002c0  03 03 00 28 00 00 00 00  00 00 00 00 68 27 5e 44  |...(........h'^D|
-000002d0  d7 73 26 f6 51 86 01 f5  f3 5d 61 a0 05 cd c3 00  |.s&.Q....]a.....|
-000002e0  85 6f ea 56 85 1e 7a c3  4c d3 6d 64              |.o.V..z.L.md|
+00000230  88 0f 00 00 84 04 01 00  80 81 fe 69 7d 68 10 74  |...........i}h.t|
+00000240  e4 9a d0 11 7a c4 e4 11  4c 7c 8a 13 f1 cf 0e 33  |....z...L|.....3|
+00000250  a5 3d d2 1f a2 73 c4 8e  2d 9e 87 45 b6 d2 dc 98  |.=...s..-..E....|
+00000260  fe 4d 86 8d ad 87 a8 2c  e3 9f 08 a0 4f 78 4d 9c  |.M.....,....OxM.|
+00000270  de c2 92 7e dc 48 6b a9  e7 cc 58 a9 45 41 04 fb  |...~.Hk...X.EA..|
+00000280  48 fa d1 e4 5c 71 92 d5  bf e4 92 a1 66 07 b8 73  |H...\q......f..s|
+00000290  b0 45 98 12 8e d8 2d e8  3e 85 05 e5 d3 38 ea 3a  |.E....-.>....8.:|
+000002a0  5d 33 4a 32 f9 ff 8b 18  ae 55 b7 f3 d2 0e e7 b8  |]3J2.....U......|
+000002b0  4e e8 bc 4f c6 a3 65 c1  a1 14 03 03 00 01 01 16  |N..O..e.........|
+000002c0  03 03 00 28 00 00 00 00  00 00 00 00 da 49 06 a7  |...(.........I..|
+000002d0  0e a4 7a df 94 f1 57 43  21 ef 85 ee 9f 52 f2 03  |..z...WC!....R..|
+000002e0  5a 79 58 7a a0 b2 1f 9e  1d f9 5a d3              |ZyXz......Z.|
 >>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 28 81 f3 33 d8 2a  |..........(..3.*|
-00000010  57 45 53 2c ee 68 8b 79  ed 07 dc 90 c3 a7 84 38  |WES,.h.y.......8|
-00000020  8c 33 03 e9 c6 51 04 b2  73 8a 8b 81 12 eb 6c 5f  |.3...Q..s.....l_|
-00000030  a3 8f 5e                                          |..^|
+00000000  14 03 03 00 01 01 16 03  03 00 28 22 7a 58 97 ef  |..........("zX..|
+00000010  f2 e6 4a c1 10 ca 63 52  e0 82 87 b4 9d d5 2f c4  |..J...cR....../.|
+00000020  68 f1 4a d5 e8 ae 3a 22  9e f7 b3 07 8f a4 8c 18  |h.J...:"........|
+00000030  2c 44 65                                          |,De|
 >>> Flow 5 (client to server)
-00000000  17 03 03 00 1e 00 00 00  00 00 00 00 01 e5 c6 d7  |................|
-00000010  4d e0 d1 0c ff a0 66 c4  71 53 af 7e 16 01 3d 2e  |M.....f.qS.~..=.|
-00000020  6c ab 90 15 03 03 00 1a  00 00 00 00 00 00 00 02  |l...............|
-00000030  92 12 87 24 c8 7e 74 23  df f7 23 49 01 9a dd 3b  |...$.~t#..#I...;|
-00000040  2c 68                                             |,h|
+00000000  17 03 03 00 1e 00 00 00  00 00 00 00 01 2c ee 44  |.............,.D|
+00000010  2d 89 8f 1f bd c2 de ac  8b 3c f2 35 d1 bd 17 4e  |-........<.5...N|
+00000020  65 3c 47 15 03 03 00 1a  00 00 00 00 00 00 00 02  |e<G.............|
+00000030  d3 45 69 d3 9e 36 be 2c  0e ac c8 d6 00 30 4f 96  |.Ei..6.,.....0O.|
+00000040  40 50                                             |@P|
diff --git a/src/crypto/tls/testdata/Client-TLSv12-ClientCert-RSA-RSAPSS b/src/crypto/tls/testdata/Client-TLSv12-ClientCert-RSA-RSAPSS
index de05fec..8f71f95 100644
--- a/src/crypto/tls/testdata/Client-TLSv12-ClientCert-RSA-RSAPSS
+++ b/src/crypto/tls/testdata/Client-TLSv12-ClientCert-RSA-RSAPSS
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fe 01 00 00  fa 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 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,73 +7,74 @@
 00000050  cc a8 c0 2b c0 2f c0 2c  c0 30 c0 09 c0 13 c0 0a  |...+./.,.0......|
 00000060  c0 14 00 9c 00 9d 00 2f  00 35 c0 12 00 0a c0 23  |......./.5.....#|
 00000070  c0 27 00 3c c0 07 c0 11  00 05 13 03 13 01 13 02  |.'.<............|
-00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
+00000080  01 00 00 7f 00 05 00 05  01 00 00 00 00 00 0a 00  |................|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
 000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
 000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
-000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
-000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
-000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
-000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
+000000c0  01 00 01 00 00 17 00 00  00 12 00 00 00 2b 00 09  |.............+..|
+000000d0  08 03 04 03 03 03 02 03  01 00 33 00 26 00 24 00  |..........3.&.$.|
+000000e0  1d 00 20 2f e5 7d a3 47  cd 62 43 15 28 da ac 5f  |.. /.}.G.bC.(.._|
+000000f0  bb 29 07 30 ff f6 84 af  c4 cf c2 ed 90 99 5f 58  |.).0.........._X|
+00000100  cb 3b 74                                          |.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 59 02 00 00  55 03 03 61 fe 1e 35 33  |....Y...U..a..53|
-00000010  4b b4 dd 9b 0f 55 58 f4  0c c5 b2 73 51 7b 84 e7  |K....UX....sQ{..|
-00000020  25 f7 8f 12 5a 12 11 e1  7b e6 52 20 ad 86 a9 f9  |%...Z...{.R ....|
-00000030  7f 6a 30 da 79 23 c3 c4  dc 88 f6 19 1d cc 16 8b  |.j0.y#..........|
-00000040  96 74 84 ce 53 56 65 e2  cb 94 61 0c c0 2f 00 00  |.t..SVe...a../..|
-00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
-00000060  03 02 66 0b 00 02 62 00  02 5f 00 02 5c 30 82 02  |..f...b.._..\0..|
-00000070  58 30 82 01 8d a0 03 02  01 02 02 11 00 f2 99 26  |X0.............&|
-00000080  eb 87 ea 8a 0d b9 fc c2  47 34 7c 11 b0 30 41 06  |........G4|..0A.|
-00000090  09 2a 86 48 86 f7 0d 01  01 0a 30 34 a0 0f 30 0d  |.*.H......04..0.|
-000000a0  06 09 60 86 48 01 65 03  04 02 01 05 00 a1 1c 30  |..`.H.e........0|
-000000b0  1a 06 09 2a 86 48 86 f7  0d 01 01 08 30 0d 06 09  |...*.H......0...|
-000000c0  60 86 48 01 65 03 04 02  01 05 00 a2 03 02 01 20  |`.H.e.......... |
-000000d0  30 12 31 10 30 0e 06 03  55 04 0a 13 07 41 63 6d  |0.1.0...U....Acm|
-000000e0  65 20 43 6f 30 1e 17 0d  31 37 31 31 32 33 31 36  |e Co0...17112316|
-000000f0  31 36 31 30 5a 17 0d 31  38 31 31 32 33 31 36 31  |1610Z..181123161|
-00000100  36 31 30 5a 30 12 31 10  30 0e 06 03 55 04 0a 13  |610Z0.1.0...U...|
-00000110  07 41 63 6d 65 20 43 6f  30 81 9f 30 0d 06 09 2a  |.Acme Co0..0...*|
-00000120  86 48 86 f7 0d 01 01 01  05 00 03 81 8d 00 30 81  |.H............0.|
-00000130  89 02 81 81 00 db 46 7d  93 2e 12 27 06 48 bc 06  |......F}...'.H..|
-00000140  28 21 ab 7e c4 b6 a2 5d  fe 1e 52 45 88 7a 36 47  |(!.~...]..RE.z6G|
-00000150  a5 08 0d 92 42 5b c2 81  c0 be 97 79 98 40 fb 4f  |....B[.....y.@.O|
-00000160  6d 14 fd 2b 13 8b c2 a5  2e 67 d8 d4 09 9e d6 22  |m..+.....g....."|
-00000170  38 b7 4a 0b 74 73 2b c2  34 f1 d1 93 e5 96 d9 74  |8.J.ts+.4......t|
-00000180  7b f3 58 9f 6c 61 3c c0  b0 41 d4 d9 2b 2b 24 23  |{.X.la<..A..++$#|
-00000190  77 5b 1c 3b bd 75 5d ce  20 54 cf a1 63 87 1d 1e  |w[.;.u]. T..c...|
-000001a0  24 c4 f3 1d 1a 50 8b aa  b6 14 43 ed 97 a7 75 62  |$....P....C...ub|
-000001b0  f4 14 c8 52 d7 02 03 01  00 01 a3 46 30 44 30 0e  |...R.......F0D0.|
-000001c0  06 03 55 1d 0f 01 01 ff  04 04 03 02 05 a0 30 13  |..U...........0.|
-000001d0  06 03 55 1d 25 04 0c 30  0a 06 08 2b 06 01 05 05  |..U.%..0...+....|
-000001e0  07 03 01 30 0c 06 03 55  1d 13 01 01 ff 04 02 30  |...0...U.......0|
-000001f0  00 30 0f 06 03 55 1d 11  04 08 30 06 87 04 7f 00  |.0...U....0.....|
-00000200  00 01 30 41 06 09 2a 86  48 86 f7 0d 01 01 0a 30  |..0A..*.H......0|
-00000210  34 a0 0f 30 0d 06 09 60  86 48 01 65 03 04 02 01  |4..0...`.H.e....|
-00000220  05 00 a1 1c 30 1a 06 09  2a 86 48 86 f7 0d 01 01  |....0...*.H.....|
-00000230  08 30 0d 06 09 60 86 48  01 65 03 04 02 01 05 00  |.0...`.H.e......|
-00000240  a2 03 02 01 20 03 81 81  00 cd ac 4e f2 ce 5f 8d  |.... ......N.._.|
-00000250  79 88 10 42 70 7f 7c bf  1b 5a 8a 00 ef 19 15 4b  |y..Bp.|..Z.....K|
-00000260  40 15 17 71 00 6c d4 16  26 e5 49 6d 56 da 0c 1a  |@..q.l..&.ImV...|
-00000270  13 9f d8 46 95 59 3c b6  7f 87 76 5e 18 aa 03 ea  |...F.Y<...v^....|
-00000280  06 75 22 dd 78 d2 a5 89  b8 c9 23 64 e1 28 38 ce  |.u".x.....#d.(8.|
-00000290  34 6c 6e 06 7b 51 f1 a7  e6 f4 b3 7f fa b1 3f 14  |4ln.{Q........?.|
-000002a0  11 89 66 79 d1 8e 88 0e  0b a0 9e 30 2a c0 67 ef  |..fy.......0*.g.|
-000002b0  ca 46 02 88 e9 53 81 22  69 22 97 ad 80 93 d4 f7  |.F...S."i"......|
-000002c0  dd 70 14 24 d7 70 0a 46  a1 16 03 03 00 ac 0c 00  |.p.$.p.F........|
-000002d0  00 a8 03 00 1d 20 e0 90  02 58 37 69 79 d6 78 e5  |..... ...X7iy.x.|
-000002e0  1d c6 7e a0 c6 38 1b ff  47 72 d6 c2 52 cb 6c 52  |..~..8..Gr..R.lR|
-000002f0  36 7e 03 c3 35 1d 08 04  00 80 79 5f 23 fd b1 ee  |6~..5.....y_#...|
-00000300  ac 62 c8 72 09 52 1f 9a  0f ac 95 3e 4e e4 97 d2  |.b.r.R.....>N...|
-00000310  a3 04 ae 19 3f 25 ad 3e  b7 78 1f d9 79 5f c8 26  |....?%.>.x..y_.&|
-00000320  f0 26 e5 ee 54 46 4a 05  84 15 01 4f 7a 7e 60 bd  |.&..TFJ....Oz~`.|
-00000330  86 74 78 d7 7c 86 91 2b  4f 76 b6 aa 78 27 c8 21  |.tx.|..+Ov..x'.!|
-00000340  7e df 88 2f 26 f0 9d 3c  a2 e8 95 f6 9f 5a a4 5e  |~../&..<.....Z.^|
-00000350  18 dc cd 0d 70 e8 85 b7  e5 57 f6 c2 f4 33 28 1c  |....p....W...3(.|
-00000360  58 7b 94 b0 9e ee d8 b3  42 b5 f3 63 78 a1 30 f3  |X{......B..cx.0.|
-00000370  f7 e4 5e 72 64 6f 80 32  70 4e 16 03 03 00 0c 0d  |..^rdo.2pN......|
-00000380  00 00 08 01 01 00 02 08  04 00 00 16 03 03 00 04  |................|
-00000390  0e 00 00 00                                       |....|
+00000000  16 03 03 00 5d 02 00 00  59 03 03 87 97 ae 0d d7  |....]...Y.......|
+00000010  e4 be cd c5 ca 90 a8 85  23 c8 e3 32 15 f4 29 d8  |........#..2..).|
+00000020  47 d7 ae e7 d8 7b 71 f5  c4 ea 07 20 e4 fd d6 48  |G....{q.... ...H|
+00000030  10 13 e0 9b 06 e1 d7 b1  93 94 38 16 b7 a0 ef 80  |..........8.....|
+00000040  2e b7 67 d6 ff 73 99 bf  67 cc 62 a1 c0 2f 00 00  |..g..s..g.b../..|
+00000050  11 ff 01 00 01 00 00 0b  00 04 03 00 01 02 00 17  |................|
+00000060  00 00 16 03 03 02 66 0b  00 02 62 00 02 5f 00 02  |......f...b.._..|
+00000070  5c 30 82 02 58 30 82 01  8d a0 03 02 01 02 02 11  |\0..X0..........|
+00000080  00 f2 99 26 eb 87 ea 8a  0d b9 fc c2 47 34 7c 11  |...&........G4|.|
+00000090  b0 30 41 06 09 2a 86 48  86 f7 0d 01 01 0a 30 34  |.0A..*.H......04|
+000000a0  a0 0f 30 0d 06 09 60 86  48 01 65 03 04 02 01 05  |..0...`.H.e.....|
+000000b0  00 a1 1c 30 1a 06 09 2a  86 48 86 f7 0d 01 01 08  |...0...*.H......|
+000000c0  30 0d 06 09 60 86 48 01  65 03 04 02 01 05 00 a2  |0...`.H.e.......|
+000000d0  03 02 01 20 30 12 31 10  30 0e 06 03 55 04 0a 13  |... 0.1.0...U...|
+000000e0  07 41 63 6d 65 20 43 6f  30 1e 17 0d 31 37 31 31  |.Acme Co0...1711|
+000000f0  32 33 31 36 31 36 31 30  5a 17 0d 31 38 31 31 32  |23161610Z..18112|
+00000100  33 31 36 31 36 31 30 5a  30 12 31 10 30 0e 06 03  |3161610Z0.1.0...|
+00000110  55 04 0a 13 07 41 63 6d  65 20 43 6f 30 81 9f 30  |U....Acme Co0..0|
+00000120  0d 06 09 2a 86 48 86 f7  0d 01 01 01 05 00 03 81  |...*.H..........|
+00000130  8d 00 30 81 89 02 81 81  00 db 46 7d 93 2e 12 27  |..0.......F}...'|
+00000140  06 48 bc 06 28 21 ab 7e  c4 b6 a2 5d fe 1e 52 45  |.H..(!.~...]..RE|
+00000150  88 7a 36 47 a5 08 0d 92  42 5b c2 81 c0 be 97 79  |.z6G....B[.....y|
+00000160  98 40 fb 4f 6d 14 fd 2b  13 8b c2 a5 2e 67 d8 d4  |.@.Om..+.....g..|
+00000170  09 9e d6 22 38 b7 4a 0b  74 73 2b c2 34 f1 d1 93  |..."8.J.ts+.4...|
+00000180  e5 96 d9 74 7b f3 58 9f  6c 61 3c c0 b0 41 d4 d9  |...t{.X.la<..A..|
+00000190  2b 2b 24 23 77 5b 1c 3b  bd 75 5d ce 20 54 cf a1  |++$#w[.;.u]. T..|
+000001a0  63 87 1d 1e 24 c4 f3 1d  1a 50 8b aa b6 14 43 ed  |c...$....P....C.|
+000001b0  97 a7 75 62 f4 14 c8 52  d7 02 03 01 00 01 a3 46  |..ub...R.......F|
+000001c0  30 44 30 0e 06 03 55 1d  0f 01 01 ff 04 04 03 02  |0D0...U.........|
+000001d0  05 a0 30 13 06 03 55 1d  25 04 0c 30 0a 06 08 2b  |..0...U.%..0...+|
+000001e0  06 01 05 05 07 03 01 30  0c 06 03 55 1d 13 01 01  |.......0...U....|
+000001f0  ff 04 02 30 00 30 0f 06  03 55 1d 11 04 08 30 06  |...0.0...U....0.|
+00000200  87 04 7f 00 00 01 30 41  06 09 2a 86 48 86 f7 0d  |......0A..*.H...|
+00000210  01 01 0a 30 34 a0 0f 30  0d 06 09 60 86 48 01 65  |...04..0...`.H.e|
+00000220  03 04 02 01 05 00 a1 1c  30 1a 06 09 2a 86 48 86  |........0...*.H.|
+00000230  f7 0d 01 01 08 30 0d 06  09 60 86 48 01 65 03 04  |.....0...`.H.e..|
+00000240  02 01 05 00 a2 03 02 01  20 03 81 81 00 cd ac 4e  |........ ......N|
+00000250  f2 ce 5f 8d 79 88 10 42  70 7f 7c bf 1b 5a 8a 00  |.._.y..Bp.|..Z..|
+00000260  ef 19 15 4b 40 15 17 71  00 6c d4 16 26 e5 49 6d  |...K@..q.l..&.Im|
+00000270  56 da 0c 1a 13 9f d8 46  95 59 3c b6 7f 87 76 5e  |V......F.Y<...v^|
+00000280  18 aa 03 ea 06 75 22 dd  78 d2 a5 89 b8 c9 23 64  |.....u".x.....#d|
+00000290  e1 28 38 ce 34 6c 6e 06  7b 51 f1 a7 e6 f4 b3 7f  |.(8.4ln.{Q......|
+000002a0  fa b1 3f 14 11 89 66 79  d1 8e 88 0e 0b a0 9e 30  |..?...fy.......0|
+000002b0  2a c0 67 ef ca 46 02 88  e9 53 81 22 69 22 97 ad  |*.g..F...S."i"..|
+000002c0  80 93 d4 f7 dd 70 14 24  d7 70 0a 46 a1 16 03 03  |.....p.$.p.F....|
+000002d0  00 ac 0c 00 00 a8 03 00  1d 20 19 11 2f cc 8b d4  |......... ../...|
+000002e0  74 7c 77 34 b0 c7 4f 49  85 d1 f3 b0 2c 0e 83 26  |t|w4..OI....,..&|
+000002f0  ee c1 2c 32 c1 82 43 3c  cd 1b 08 04 00 80 68 33  |..,2..C<......h3|
+00000300  a3 71 38 a8 70 34 04 91  e0 7b b3 44 46 45 54 a9  |.q8.p4...{.DFET.|
+00000310  af ad 50 0d b6 91 7c 87  c7 4c 99 2d 02 9d 57 57  |..P...|..L.-..WW|
+00000320  ae 2a 25 63 82 32 f0 4a  14 cd d3 b4 ca b8 bc d9  |.*%c.2.J........|
+00000330  ff 1e 01 93 20 6e 27 97  04 31 c4 d8 e9 a6 84 1e  |.... n'..1......|
+00000340  96 6c a6 25 cc 93 e7 2d  15 32 e1 ad 01 7d fb 2c  |.l.%...-.2...}.,|
+00000350  12 04 5d 59 f6 bc 90 e8  cc d7 48 6d 46 c4 ed 64  |..]Y......HmF..d|
+00000360  6b 41 5b 9d 9a 3b c8 11  57 bb b8 b1 cb c6 54 d6  |kA[..;..W.....T.|
+00000370  08 34 7e ad e3 59 7b f7  90 77 e6 50 95 aa 16 03  |.4~..Y{..w.P....|
+00000380  03 00 0c 0d 00 00 08 01  01 00 02 08 04 00 00 16  |................|
+00000390  03 03 00 04 0e 00 00 00                           |........|
 >>> Flow 3 (client to server)
 00000000  16 03 03 02 66 0b 00 02  62 00 02 5f 00 02 5c 30  |....f...b.._..\0|
 00000010  82 02 58 30 82 01 8d a0  03 02 01 02 02 11 00 f2  |..X0............|
@@ -117,26 +118,26 @@
 00000270  10 00 00 21 20 2f e5 7d  a3 47 cd 62 43 15 28 da  |...! /.}.G.bC.(.|
 00000280  ac 5f bb 29 07 30 ff f6  84 af c4 cf c2 ed 90 99  |._.).0..........|
 00000290  5f 58 cb 3b 74 16 03 03  00 88 0f 00 00 84 08 04  |_X.;t...........|
-000002a0  00 80 b2 c4 60 82 75 ca  be 40 dc 28 ec 6d 14 6f  |....`.u..@.(.m.o|
-000002b0  6c 88 ca 9a d7 ae ce 94  26 a7 10 ad d8 c3 b9 a6  |l.......&.......|
-000002c0  48 4e 01 7d ee 6e f8 e0  15 d9 72 c4 79 8d ac 25  |HN.}.n....r.y..%|
-000002d0  37 29 83 fc e6 f1 2e 4f  76 49 6a 36 b9 1e b4 58  |7).....OvIj6...X|
-000002e0  a2 3e f7 ff 96 5e d9 17  f2 40 05 1f ec bb 5b f5  |.>...^...@....[.|
-000002f0  28 86 d2 fc 0e 7e 70 3a  3d 90 4c 46 a5 3e bc 57  |(....~p:=.LF.>.W|
-00000300  24 4c ee 35 23 99 6f 21  12 db ba d8 3a 5f 37 1f  |$L.5#.o!....:_7.|
-00000310  da 3d c2 c9 bf b6 11 8b  b9 b9 43 0b 52 ff 6d 2a  |.=........C.R.m*|
-00000320  74 a7 14 03 03 00 01 01  16 03 03 00 28 00 00 00  |t...........(...|
-00000330  00 00 00 00 00 34 bd 90  a0 3f 1c 0c 11 5c 8a e4  |.....4...?...\..|
-00000340  28 82 c4 57 59 73 fd a4  dc a9 91 4b df 2a c6 b5  |(..WYs.....K.*..|
-00000350  f0 6e cf 41 70                                    |.n.Ap|
+000002a0  00 80 a2 37 90 1d d9 05  16 91 e6 5d 93 ec d0 4c  |...7.......]...L|
+000002b0  c9 eb ed d3 66 fc 36 55  ee cb e0 bc aa 41 11 fb  |....f.6U.....A..|
+000002c0  91 d5 2c 81 d4 08 ee ce  f8 96 cd 73 20 73 5b 8c  |..,........s s[.|
+000002d0  85 45 17 fa 6d 06 db a6  68 49 5e a8 2b 86 83 0f  |.E..m...hI^.+...|
+000002e0  e2 52 04 96 8c c9 a0 f8  ed 64 51 e3 6e b4 b1 48  |.R.......dQ.n..H|
+000002f0  c7 f6 21 c9 aa c0 8d 01  00 43 14 d3 16 ed 9a 3c  |..!......C.....<|
+00000300  d2 14 57 90 22 f6 52 bc  44 64 88 40 03 93 56 8a  |..W.".R.Dd.@..V.|
+00000310  4f 50 ad 73 ff bc b4 72  cd e2 01 01 50 88 f9 1c  |OP.s...r....P...|
+00000320  4f 4d 14 03 03 00 01 01  16 03 03 00 28 00 00 00  |OM..........(...|
+00000330  00 00 00 00 00 07 15 02  d9 a8 bd 4b c4 61 57 e0  |...........K.aW.|
+00000340  a6 c0 11 05 bc 25 0b 4d  fb 36 c4 19 80 e2 59 3e  |.....%.M.6....Y>|
+00000350  00 a0 7b 87 42                                    |..{.B|
 >>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 28 e2 44 81 59 e4  |..........(.D.Y.|
-00000010  6c cf e2 e7 04 78 61 02  36 29 2c 5c c4 6f 13 0b  |l....xa.6),\.o..|
-00000020  29 ba 74 b0 13 e8 8f 67  39 b5 ea d1 9d 99 d2 f6  |).t....g9.......|
-00000030  f7 32 be                                          |.2.|
+00000000  14 03 03 00 01 01 16 03  03 00 28 8b ae 36 31 a0  |..........(..61.|
+00000010  0a ba f4 e8 45 6d e2 55  8d 9d 61 e4 80 b6 4e bb  |....Em.U..a...N.|
+00000020  8c 7f e0 2b ea fc 4d e7  4c 60 c1 c6 91 92 ef 46  |...+..M.L`.....F|
+00000030  00 19 b9                                          |...|
 >>> Flow 5 (client to server)
-00000000  17 03 03 00 1e 00 00 00  00 00 00 00 01 5c 7b 38  |.............\{8|
-00000010  46 af 57 57 05 5a c5 cb  83 f3 fd 17 d4 c3 2e 93  |F.WW.Z..........|
-00000020  d7 70 52 15 03 03 00 1a  00 00 00 00 00 00 00 02  |.pR.............|
-00000030  df 2b d8 62 ec 97 c6 ab  be d4 7f c9 91 f4 fe 55  |.+.b...........U|
-00000040  ac bd                                             |..|
+00000000  17 03 03 00 1e 00 00 00  00 00 00 00 01 61 0d 4c  |.............a.L|
+00000010  bf 57 34 f8 b3 f7 33 d6  49 46 66 14 e8 b2 e4 e0  |.W4...3.IFf.....|
+00000020  de 82 d1 15 03 03 00 1a  00 00 00 00 00 00 00 02  |................|
+00000030  76 2e 52 63 53 26 93 e3  32 59 de d9 62 e8 f4 93  |v.RcS&..2Y..b...|
+00000040  65 bc                                             |e.|
diff --git a/src/crypto/tls/testdata/Client-TLSv12-ECDHE-ECDSA-AES b/src/crypto/tls/testdata/Client-TLSv12-ECDHE-ECDSA-AES
index d21e9b3..dd7dfab 100644
--- a/src/crypto/tls/testdata/Client-TLSv12-ECDHE-ECDSA-AES
+++ b/src/crypto/tls/testdata/Client-TLSv12-ECDHE-ECDSA-AES
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fe 01 00 00  fa 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 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,87 +7,88 @@
 00000050  cc a8 c0 2b c0 2f c0 2c  c0 30 c0 09 c0 13 c0 0a  |...+./.,.0......|
 00000060  c0 14 00 9c 00 9d 00 2f  00 35 c0 12 00 0a c0 23  |......./.5.....#|
 00000070  c0 27 00 3c c0 07 c0 11  00 05 13 03 13 01 13 02  |.'.<............|
-00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
+00000080  01 00 00 7f 00 05 00 05  01 00 00 00 00 00 0a 00  |................|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
 000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
 000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
-000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
-000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
-000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
-000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
+000000c0  01 00 01 00 00 17 00 00  00 12 00 00 00 2b 00 09  |.............+..|
+000000d0  08 03 04 03 03 03 02 03  01 00 33 00 26 00 24 00  |..........3.&.$.|
+000000e0  1d 00 20 2f e5 7d a3 47  cd 62 43 15 28 da ac 5f  |.. /.}.G.bC.(.._|
+000000f0  bb 29 07 30 ff f6 84 af  c4 cf c2 ed 90 99 5f 58  |.).0.........._X|
+00000100  cb 3b 74                                          |.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 59 02 00 00  55 03 03 ec 4a 6a f8 c5  |....Y...U...Jj..|
-00000010  42 65 f9 d3 4f 65 6f 14  6b bd ae a9 82 5d 06 9b  |Be..Oeo.k....]..|
-00000020  9d 03 bb 67 eb ba 52 70  74 c3 01 20 f2 ef 69 54  |...g..Rpt.. ..iT|
-00000030  1f 4b 79 f7 5b d5 08 b4  18 4c af 8e 55 58 45 22  |.Ky.[....L..UXE"|
-00000040  c1 c9 6f cf 36 67 45 20  c7 c5 3a af c0 09 00 00  |..o.6gE ..:.....|
-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 b7 0c 00  00 b3 03 00 1d 20 7f e5  |*............ ..|
-00000280  3b 03 9e 6a 77 11 1b 0f  bc 4a db 44 7c 3b 81 1c  |;..jw....J.D|;..|
-00000290  03 8b 15 a6 f3 16 a0 58  5b 13 c5 1e d2 2c 04 03  |.......X[....,..|
-000002a0  00 8b 30 81 88 02 42 00  cc 7c 76 94 81 89 8f 25  |..0...B..|v....%|
-000002b0  16 e2 a0 0d 80 4f 7a 8f  8c 83 23 53 23 45 9c c1  |.....Oz...#S#E..|
-000002c0  39 e3 0c c2 1b 4d f3 78  cd ea b9 c8 d4 b6 30 bb  |9....M.x......0.|
-000002d0  ff d7 ad 6c b2 fd 62 4d  8a 05 19 cf 58 ec 81 17  |...l..bM....X...|
-000002e0  21 7c 71 a1 d7 ad 87 11  8d 02 42 01 a2 9e c8 e4  |!|q.......B.....|
-000002f0  04 7c 75 22 df 14 97 94  8a 1b a1 34 95 95 dd 4c  |.|u".......4...L|
-00000300  9f 1a c7 c7 96 db ef 87  82 27 9a 27 3a 3d 75 26  |.........'.':=u&|
-00000310  04 47 66 eb 55 60 9f 93  4e b2 09 14 fa 71 5b 3f  |.Gf.U`..N....q[?|
-00000320  33 37 3f 0c f2 5c 4f 1e  cc fa b1 6f 70 16 03 03  |37?..\O....op...|
-00000330  00 04 0e 00 00 00                                 |......|
+00000000  16 03 03 00 5d 02 00 00  59 03 03 53 0a a8 7d 57  |....]...Y..S..}W|
+00000010  28 ed 64 43 b5 dd b2 15  a8 6f 88 09 6a 90 4c 23  |(.dC.....o..j.L#|
+00000020  06 49 b6 1a 56 b5 a0 a2  68 af 7d 20 5a 4a d6 c3  |.I..V...h.} ZJ..|
+00000030  ed 18 12 98 b4 4e f8 f2  df d7 ee 6f e9 c6 c7 82  |.....N.....o....|
+00000040  5c bb 79 70 a5 59 51 c7  7f 41 7e 8e c0 09 00 00  |\.yp.YQ..A~.....|
+00000050  11 ff 01 00 01 00 00 0b  00 04 03 00 01 02 00 17  |................|
+00000060  00 00 16 03 03 02 0e 0b  00 02 0a 00 02 07 00 02  |................|
+00000070  04 30 82 02 00 30 82 01  62 02 09 00 b8 bf 2d 47  |.0...0..b.....-G|
+00000080  a0 d2 eb f4 30 09 06 07  2a 86 48 ce 3d 04 01 30  |....0...*.H.=..0|
+00000090  45 31 0b 30 09 06 03 55  04 06 13 02 41 55 31 13  |E1.0...U....AU1.|
+000000a0  30 11 06 03 55 04 08 13  0a 53 6f 6d 65 2d 53 74  |0...U....Some-St|
+000000b0  61 74 65 31 21 30 1f 06  03 55 04 0a 13 18 49 6e  |ate1!0...U....In|
+000000c0  74 65 72 6e 65 74 20 57  69 64 67 69 74 73 20 50  |ternet Widgits P|
+000000d0  74 79 20 4c 74 64 30 1e  17 0d 31 32 31 31 32 32  |ty Ltd0...121122|
+000000e0  31 35 30 36 33 32 5a 17  0d 32 32 31 31 32 30 31  |150632Z..2211201|
+000000f0  35 30 36 33 32 5a 30 45  31 0b 30 09 06 03 55 04  |50632Z0E1.0...U.|
+00000100  06 13 02 41 55 31 13 30  11 06 03 55 04 08 13 0a  |...AU1.0...U....|
+00000110  53 6f 6d 65 2d 53 74 61  74 65 31 21 30 1f 06 03  |Some-State1!0...|
+00000120  55 04 0a 13 18 49 6e 74  65 72 6e 65 74 20 57 69  |U....Internet Wi|
+00000130  64 67 69 74 73 20 50 74  79 20 4c 74 64 30 81 9b  |dgits Pty Ltd0..|
+00000140  30 10 06 07 2a 86 48 ce  3d 02 01 06 05 2b 81 04  |0...*.H.=....+..|
+00000150  00 23 03 81 86 00 04 00  c4 a1 ed be 98 f9 0b 48  |.#.............H|
+00000160  73 36 7e c3 16 56 11 22  f2 3d 53 c3 3b 4d 21 3d  |s6~..V.".=S.;M!=|
+00000170  cd 6b 75 e6 f6 b0 dc 9a  df 26 c1 bc b2 87 f0 72  |.ku......&.....r|
+00000180  32 7c b3 64 2f 1c 90 bc  ea 68 23 10 7e fe e3 25  |2|.d/....h#.~..%|
+00000190  c0 48 3a 69 e0 28 6d d3  37 00 ef 04 62 dd 0d a0  |.H:i.(m.7...b...|
+000001a0  9c 70 62 83 d8 81 d3 64  31 aa 9e 97 31 bd 96 b0  |.pb....d1...1...|
+000001b0  68 c0 9b 23 de 76 64 3f  1a 5c 7f e9 12 0e 58 58  |h..#.vd?.\....XX|
+000001c0  b6 5f 70 dd 9b d8 ea d5  d7 f5 d5 cc b9 b6 9f 30  |._p............0|
+000001d0  66 5b 66 9a 20 e2 27 e5  bf fe 3b 30 09 06 07 2a  |f[f. .'...;0...*|
+000001e0  86 48 ce 3d 04 01 03 81  8c 00 30 81 88 02 42 01  |.H.=......0...B.|
+000001f0  88 a2 4f eb e2 45 c5 48  7d 1b ac f5 ed 98 9d ae  |..O..E.H}.......|
+00000200  47 70 c0 5e 1b b6 2f bd  f1 b6 4d b7 61 40 d3 11  |Gp.^../...M.a@..|
+00000210  a2 ce ee 0b 7e 92 7e ff  76 9d c3 3b 7e a5 3f ce  |....~.~.v..;~.?.|
+00000220  fa 10 e2 59 ec 47 2d 7c  ac da 4e 97 0e 15 a0 6f  |...Y.G-|..N....o|
+00000230  d0 02 42 01 4d fc be 67  13 9c 2d 05 0e bd 3f a3  |..B.M..g..-...?.|
+00000240  8c 25 c1 33 13 83 0d 94  06 bb d4 37 7a f6 ec 7a  |.%.3.......7z..z|
+00000250  c9 86 2e dd d7 11 69 7f  85 7c 56 de fb 31 78 2b  |......i..|V..1x+|
+00000260  e4 c7 78 0d ae cb be 9e  4e 36 24 31 7b 6a 0f 39  |..x.....N6$1{j.9|
+00000270  95 12 07 8f 2a 16 03 03  00 b7 0c 00 00 b3 03 00  |....*...........|
+00000280  1d 20 f5 a1 40 c1 31 8d  23 ee 2a 95 de 6f 22 a4  |. ..@.1.#.*..o".|
+00000290  98 03 77 82 92 67 0e cd  75 5a ac 95 90 07 70 77  |..w..g..uZ....pw|
+000002a0  c0 5b 04 03 00 8b 30 81  88 02 42 00 92 88 e3 97  |.[....0...B.....|
+000002b0  42 e5 0a ca b7 48 db 4a  f0 a2 1d c7 b8 1b bb 4b  |B....H.J.......K|
+000002c0  ea 5e 6c 40 b7 f7 de e1  b7 e5 b0 5e 8f fd 99 5b  |.^l@.......^...[|
+000002d0  14 e4 4d 55 4b cb cd f7  9a 3a 77 a7 41 cf 15 26  |..MUK....:w.A..&|
+000002e0  79 a5 75 d8 c5 29 64 17  b7 16 7e e4 38 02 42 01  |y.u..)d...~.8.B.|
+000002f0  b2 74 0c 2f 4d 18 e3 88  6e fe 90 59 12 5d 2e ef  |.t./M...n..Y.]..|
+00000300  36 c6 12 04 d5 aa 60 06  83 00 72 93 8c 5c f5 08  |6.....`...r..\..|
+00000310  26 38 f7 f6 64 b1 66 2f  e4 35 cb 56 0c 67 61 1a  |&8..d.f/.5.V.ga.|
+00000320  4d 16 8a ba 28 ba b5 ec  0b 61 38 79 db a3 65 c7  |M...(....a8y..e.|
+00000330  3e 16 03 03 00 04 0e 00  00 00                    |>.........|
 >>> Flow 3 (client to server)
 00000000  16 03 03 00 25 10 00 00  21 20 2f e5 7d a3 47 cd  |....%...! /.}.G.|
 00000010  62 43 15 28 da ac 5f bb  29 07 30 ff f6 84 af c4  |bC.(.._.).0.....|
 00000020  cf c2 ed 90 99 5f 58 cb  3b 74 14 03 03 00 01 01  |....._X.;t......|
 00000030  16 03 03 00 40 00 00 00  00 00 00 00 00 00 00 00  |....@...........|
-00000040  00 00 00 00 00 d6 67 cb  d5 7c 95 9b 16 e2 3b 86  |......g..|....;.|
-00000050  22 bd 8c c7 40 36 9b b6  7e 0a 77 78 38 14 37 3c  |"...@6..~.wx8.7<|
-00000060  48 42 37 a7 07 31 bb 57  c4 e9 f5 e5 a7 58 71 f8  |HB7..1.W.....Xq.|
-00000070  82 f7 12 97 72                                    |....r|
+00000040  00 00 00 00 00 7a 74 f0  c3 20 b7 87 3b 1b a6 86  |.....zt.. ..;...|
+00000050  0a cf c3 b9 0f 3e 40 39  ed 4e e0 db c0 77 69 b6  |.....>@9.N...wi.|
+00000060  79 cb 28 84 1f 88 72 5d  85 df 92 d2 05 ad bd 1b  |y.(...r]........|
+00000070  34 ba 21 ee 46                                    |4.!.F|
 >>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 40 56 45 5c a3 b3  |..........@VE\..|
-00000010  64 43 54 7f b5 90 1a 34  ab 2b 68 25 49 41 bf 78  |dCT....4.+h%IA.x|
-00000020  50 b0 66 35 20 76 e1 d0  5c 8a 82 2e 03 83 cf c6  |P.f5 v..\.......|
-00000030  b7 48 3d 2c c4 cf f5 31  c1 ab 9a 3b 09 3a 75 e3  |.H=,...1...;.:u.|
-00000040  b2 05 fa d9 79 cc 1b 0e  30 44 e1                 |....y...0D.|
+00000000  14 03 03 00 01 01 16 03  03 00 40 f3 23 7b 1c 0b  |..........@.#{..|
+00000010  b3 07 a9 28 3f 33 84 7b  91 9c 7a b2 c2 df 89 6e  |...(?3.{..z....n|
+00000020  aa 54 35 d7 09 ae 61 cf  90 3a 86 cd 7a 00 6b b1  |.T5...a..:..z.k.|
+00000030  1e 7f 55 4c f2 9e e5 4e  69 87 4f a1 eb bb d5 16  |..UL...Ni.O.....|
+00000040  03 11 08 24 1d bc 83 29  4d 48 41                 |...$...)MHA|
 >>> 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 76 5f 1f  ec 55 ec f4 87 06 91 b4  |.....v_..U......|
-00000020  ba 71 4f 7f 9c ce e1 c7  e6 3d 75 05 fd ba 98 c4  |.qO......=u.....|
-00000030  d0 39 24 b8 d4 15 03 03  00 30 00 00 00 00 00 00  |.9$......0......|
-00000040  00 00 00 00 00 00 00 00  00 00 e8 4e 09 a1 5f db  |...........N.._.|
-00000050  91 d5 5b e8 6a 86 7a 6c  7d 4a e1 94 8a 7d 99 52  |..[.j.zl}J...}.R|
-00000060  e6 5d d8 35 7c a0 68 8f  09 f9                    |.].5|.h...|
+00000010  00 00 00 00 00 f7 2c 65  61 5d 89 5d de 8d 42 92  |......,ea].]..B.|
+00000020  91 1e f4 71 39 42 a3 92  91 98 96 9f 95 04 86 99  |...q9B..........|
+00000030  c6 f3 e8 e1 e7 15 03 03  00 30 00 00 00 00 00 00  |.........0......|
+00000040  00 00 00 00 00 00 00 00  00 00 81 23 13 80 00 d8  |...........#....|
+00000050  1a 93 58 38 4d f0 6f 87  43 05 6d 63 6c e8 b9 80  |..X8M.o.C.mcl...|
+00000060  1c 52 12 59 ae ca a6 c8  3c e3                    |.R.Y....<.|
diff --git a/src/crypto/tls/testdata/Client-TLSv12-ECDHE-ECDSA-AES-GCM b/src/crypto/tls/testdata/Client-TLSv12-ECDHE-ECDSA-AES-GCM
index 02bad39..1b3e1e5 100644
--- a/src/crypto/tls/testdata/Client-TLSv12-ECDHE-ECDSA-AES-GCM
+++ b/src/crypto/tls/testdata/Client-TLSv12-ECDHE-ECDSA-AES-GCM
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fe 01 00 00  fa 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 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,82 +7,83 @@
 00000050  cc a8 c0 2b c0 2f c0 2c  c0 30 c0 09 c0 13 c0 0a  |...+./.,.0......|
 00000060  c0 14 00 9c 00 9d 00 2f  00 35 c0 12 00 0a c0 23  |......./.5.....#|
 00000070  c0 27 00 3c c0 07 c0 11  00 05 13 03 13 01 13 02  |.'.<............|
-00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
+00000080  01 00 00 7f 00 05 00 05  01 00 00 00 00 00 0a 00  |................|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
 000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
 000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
-000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
-000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
-000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
-000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
+000000c0  01 00 01 00 00 17 00 00  00 12 00 00 00 2b 00 09  |.............+..|
+000000d0  08 03 04 03 03 03 02 03  01 00 33 00 26 00 24 00  |..........3.&.$.|
+000000e0  1d 00 20 2f e5 7d a3 47  cd 62 43 15 28 da ac 5f  |.. /.}.G.bC.(.._|
+000000f0  bb 29 07 30 ff f6 84 af  c4 cf c2 ed 90 99 5f 58  |.).0.........._X|
+00000100  cb 3b 74                                          |.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 59 02 00 00  55 03 03 d4 97 12 a8 e7  |....Y...U.......|
-00000010  be a9 2d 80 f0 db 01 49  07 04 f4 d1 02 db 3d 4a  |..-....I......=J|
-00000020  f0 af 31 38 39 d7 4c 1a  d3 74 71 20 0f a3 76 14  |..189.L..tq ..v.|
-00000030  73 ff 25 1b ef 29 b3 5e  0b 8f fe ee a6 19 d3 31  |s.%..).^.......1|
-00000040  5d 2e 71 ab 74 58 e9 d6  c5 9b f4 93 c0 2b 00 00  |].q.tX.......+..|
-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 b7 0c 00  00 b3 03 00 1d 20 a8 15  |*............ ..|
-00000280  13 40 df f8 dc 39 f0 af  90 53 a8 34 a9 61 68 c8  |.@...9...S.4.ah.|
-00000290  ad be 4f 02 0e d2 83 fd  2e 35 bf 8c 8e 13 04 03  |..O......5......|
-000002a0  00 8b 30 81 88 02 42 00  bc 69 df 5b ec 9f 17 ff  |..0...B..i.[....|
-000002b0  e6 e5 24 71 f6 2b a5 88  40 78 12 ef f3 dc 25 a9  |..$q.+..@x....%.|
-000002c0  7c 89 24 0d c7 46 b2 db  ae 72 b4 2a 87 87 fe 7e  ||.$..F...r.*...~|
-000002d0  22 8f e6 d4 c4 7b 61 14  c3 04 39 98 87 6f 1f 54  |"....{a...9..o.T|
-000002e0  e0 50 16 0b 52 8e d6 1e  0a 02 42 00 b7 40 26 a8  |.P..R.....B..@&.|
-000002f0  11 09 77 ec 36 e5 88 26  6d 83 6f e7 c3 b1 98 c3  |..w.6..&m.o.....|
-00000300  4b 83 92 48 65 31 87 68  ee 49 25 ec 95 59 82 b5  |K..He1.h.I%..Y..|
-00000310  93 92 c8 17 d6 d9 1c 99  60 48 1b 18 50 b4 e7 df  |........`H..P...|
-00000320  ed 75 1a f2 08 e8 3d 93  99 27 ef 4d e3 16 03 03  |.u....=..'.M....|
-00000330  00 04 0e 00 00 00                                 |......|
+00000000  16 03 03 00 5d 02 00 00  59 03 03 d8 ac 8a ae 13  |....]...Y.......|
+00000010  8a e4 2d ac c0 a1 a3 d5  32 5b ca 18 5a 73 22 83  |..-.....2[..Zs".|
+00000020  d0 76 39 5c 48 40 b0 3a  75 87 5d 20 fd a3 fd b4  |.v9\H@.:u.] ....|
+00000030  32 cc 05 54 aa 59 cc 76  81 7b 29 c3 bc c6 32 c0  |2..T.Y.v.{)...2.|
+00000040  a9 52 fc ea 08 51 20 13  e3 e4 8e 68 c0 2b 00 00  |.R...Q ....h.+..|
+00000050  11 ff 01 00 01 00 00 0b  00 04 03 00 01 02 00 17  |................|
+00000060  00 00 16 03 03 02 0e 0b  00 02 0a 00 02 07 00 02  |................|
+00000070  04 30 82 02 00 30 82 01  62 02 09 00 b8 bf 2d 47  |.0...0..b.....-G|
+00000080  a0 d2 eb f4 30 09 06 07  2a 86 48 ce 3d 04 01 30  |....0...*.H.=..0|
+00000090  45 31 0b 30 09 06 03 55  04 06 13 02 41 55 31 13  |E1.0...U....AU1.|
+000000a0  30 11 06 03 55 04 08 13  0a 53 6f 6d 65 2d 53 74  |0...U....Some-St|
+000000b0  61 74 65 31 21 30 1f 06  03 55 04 0a 13 18 49 6e  |ate1!0...U....In|
+000000c0  74 65 72 6e 65 74 20 57  69 64 67 69 74 73 20 50  |ternet Widgits P|
+000000d0  74 79 20 4c 74 64 30 1e  17 0d 31 32 31 31 32 32  |ty Ltd0...121122|
+000000e0  31 35 30 36 33 32 5a 17  0d 32 32 31 31 32 30 31  |150632Z..2211201|
+000000f0  35 30 36 33 32 5a 30 45  31 0b 30 09 06 03 55 04  |50632Z0E1.0...U.|
+00000100  06 13 02 41 55 31 13 30  11 06 03 55 04 08 13 0a  |...AU1.0...U....|
+00000110  53 6f 6d 65 2d 53 74 61  74 65 31 21 30 1f 06 03  |Some-State1!0...|
+00000120  55 04 0a 13 18 49 6e 74  65 72 6e 65 74 20 57 69  |U....Internet Wi|
+00000130  64 67 69 74 73 20 50 74  79 20 4c 74 64 30 81 9b  |dgits Pty Ltd0..|
+00000140  30 10 06 07 2a 86 48 ce  3d 02 01 06 05 2b 81 04  |0...*.H.=....+..|
+00000150  00 23 03 81 86 00 04 00  c4 a1 ed be 98 f9 0b 48  |.#.............H|
+00000160  73 36 7e c3 16 56 11 22  f2 3d 53 c3 3b 4d 21 3d  |s6~..V.".=S.;M!=|
+00000170  cd 6b 75 e6 f6 b0 dc 9a  df 26 c1 bc b2 87 f0 72  |.ku......&.....r|
+00000180  32 7c b3 64 2f 1c 90 bc  ea 68 23 10 7e fe e3 25  |2|.d/....h#.~..%|
+00000190  c0 48 3a 69 e0 28 6d d3  37 00 ef 04 62 dd 0d a0  |.H:i.(m.7...b...|
+000001a0  9c 70 62 83 d8 81 d3 64  31 aa 9e 97 31 bd 96 b0  |.pb....d1...1...|
+000001b0  68 c0 9b 23 de 76 64 3f  1a 5c 7f e9 12 0e 58 58  |h..#.vd?.\....XX|
+000001c0  b6 5f 70 dd 9b d8 ea d5  d7 f5 d5 cc b9 b6 9f 30  |._p............0|
+000001d0  66 5b 66 9a 20 e2 27 e5  bf fe 3b 30 09 06 07 2a  |f[f. .'...;0...*|
+000001e0  86 48 ce 3d 04 01 03 81  8c 00 30 81 88 02 42 01  |.H.=......0...B.|
+000001f0  88 a2 4f eb e2 45 c5 48  7d 1b ac f5 ed 98 9d ae  |..O..E.H}.......|
+00000200  47 70 c0 5e 1b b6 2f bd  f1 b6 4d b7 61 40 d3 11  |Gp.^../...M.a@..|
+00000210  a2 ce ee 0b 7e 92 7e ff  76 9d c3 3b 7e a5 3f ce  |....~.~.v..;~.?.|
+00000220  fa 10 e2 59 ec 47 2d 7c  ac da 4e 97 0e 15 a0 6f  |...Y.G-|..N....o|
+00000230  d0 02 42 01 4d fc be 67  13 9c 2d 05 0e bd 3f a3  |..B.M..g..-...?.|
+00000240  8c 25 c1 33 13 83 0d 94  06 bb d4 37 7a f6 ec 7a  |.%.3.......7z..z|
+00000250  c9 86 2e dd d7 11 69 7f  85 7c 56 de fb 31 78 2b  |......i..|V..1x+|
+00000260  e4 c7 78 0d ae cb be 9e  4e 36 24 31 7b 6a 0f 39  |..x.....N6$1{j.9|
+00000270  95 12 07 8f 2a 16 03 03  00 b7 0c 00 00 b3 03 00  |....*...........|
+00000280  1d 20 1b e5 74 f7 2a 8e  86 7d 32 5b 99 f7 e0 2d  |. ..t.*..}2[...-|
+00000290  0d 96 a7 38 59 6c d9 50  7c 8a a2 2a 06 76 85 1f  |...8Yl.P|..*.v..|
+000002a0  77 7b 04 03 00 8b 30 81  88 02 42 01 9e 35 d1 fc  |w{....0...B..5..|
+000002b0  b8 16 97 b6 7b c4 6e 16  a9 de 5c 90 78 a6 d8 78  |....{.n...\.x..x|
+000002c0  be 38 98 ba 50 bc 88 bb  f0 15 30 62 29 96 43 15  |.8..P.....0b).C.|
+000002d0  a7 7e 93 d4 3a 8c 2c 24  a5 7b e3 51 eb ef d4 16  |.~..:.,$.{.Q....|
+000002e0  9b d7 c2 c3 b1 10 54 fe  26 55 05 a7 79 02 42 01  |......T.&U..y.B.|
+000002f0  ca 62 10 6d b0 be 85 cf  3d ef a1 2f 9a 04 b9 6b  |.b.m....=../...k|
+00000300  1d ec bf fc 4e 77 81 b2  70 50 98 26 b4 89 5f a9  |....Nw..pP.&.._.|
+00000310  d8 63 1a 54 79 f2 39 83  88 57 a0 25 cc a6 36 fa  |.c.Ty.9..W.%..6.|
+00000320  31 c1 45 c5 8d 04 83 42  89 a4 15 c3 3e 61 71 1c  |1.E....B....>aq.|
+00000330  53 16 03 03 00 04 0e 00  00 00                    |S.........|
 >>> Flow 3 (client to server)
 00000000  16 03 03 00 25 10 00 00  21 20 2f e5 7d a3 47 cd  |....%...! /.}.G.|
 00000010  62 43 15 28 da ac 5f bb  29 07 30 ff f6 84 af c4  |bC.(.._.).0.....|
 00000020  cf c2 ed 90 99 5f 58 cb  3b 74 14 03 03 00 01 01  |....._X.;t......|
-00000030  16 03 03 00 28 00 00 00  00 00 00 00 00 30 f1 a9  |....(........0..|
-00000040  4a 7e 86 a1 5d b7 db 2f  c6 e2 ec 36 41 83 66 75  |J~..]../...6A.fu|
-00000050  a3 6c 7d e7 61 36 ac f7  76 f8 8e d8 81           |.l}.a6..v....|
+00000030  16 03 03 00 28 00 00 00  00 00 00 00 00 4f 28 16  |....(........O(.|
+00000040  51 9e e7 01 d2 5c 25 d7  bb 42 4c fc d9 dc d7 7f  |Q....\%..BL.....|
+00000050  2b 6c 5e 03 63 ce 19 ae  92 b8 c1 46 20           |+l^.c......F |
 >>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 28 2c 78 86 13 dc  |..........(,x...|
-00000010  a4 b9 bf ad 50 45 a3 d9  b3 df 33 a2 79 b1 1b 25  |....PE....3.y..%|
-00000020  12 94 97 99 07 6b 52 c4  52 64 ab 89 40 8c 93 4a  |.....kR.Rd..@..J|
-00000030  e3 cc d9                                          |...|
+00000000  14 03 03 00 01 01 16 03  03 00 28 31 c5 7a e8 49  |..........(1.z.I|
+00000010  52 3d 85 b0 c4 7d 82 fa  08 a3 84 a9 58 8a 05 8c  |R=...}......X...|
+00000020  9a 7c 6c 4e 29 fd 46 53  06 27 09 d2 38 f5 7c 5c  |.|lN).FS.'..8.|\|
+00000030  fb ba 6b                                          |..k|
 >>> Flow 5 (client to server)
-00000000  17 03 03 00 1e 00 00 00  00 00 00 00 01 fa 9e 8b  |................|
-00000010  92 8c f5 32 e6 d4 11 46  b4 73 62 56 f6 83 15 6f  |...2...F.sbV...o|
-00000020  ce de 2d 15 03 03 00 1a  00 00 00 00 00 00 00 02  |..-.............|
-00000030  93 24 68 83 67 b6 f9 27  b5 26 52 78 5d f3 c9 d2  |.$h.g..'.&Rx]...|
-00000040  26 a0                                             |&.|
+00000000  17 03 03 00 1e 00 00 00  00 00 00 00 01 df 67 c1  |..............g.|
+00000010  b4 dd 34 b2 32 ea b4 00  1b b9 67 60 03 91 bf 17  |..4.2.....g`....|
+00000020  0d dd dc 15 03 03 00 1a  00 00 00 00 00 00 00 02  |................|
+00000030  7c a9 51 36 43 33 ab e4  35 15 cf 6f ef c5 ed c7  ||.Q6C3..5..o....|
+00000040  2f 4d                                             |/M|
diff --git a/src/crypto/tls/testdata/Client-TLSv12-ECDHE-ECDSA-AES128-SHA256 b/src/crypto/tls/testdata/Client-TLSv12-ECDHE-ECDSA-AES128-SHA256
index 4946fe4..1e871a4 100644
--- a/src/crypto/tls/testdata/Client-TLSv12-ECDHE-ECDSA-AES128-SHA256
+++ b/src/crypto/tls/testdata/Client-TLSv12-ECDHE-ECDSA-AES128-SHA256
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fe 01 00 00  fa 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 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,91 +7,92 @@
 00000050  cc a8 c0 2b c0 2f c0 2c  c0 30 c0 09 c0 13 c0 0a  |...+./.,.0......|
 00000060  c0 14 00 9c 00 9d 00 2f  00 35 c0 12 00 0a c0 23  |......./.5.....#|
 00000070  c0 27 00 3c c0 07 c0 11  00 05 13 03 13 01 13 02  |.'.<............|
-00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
+00000080  01 00 00 7f 00 05 00 05  01 00 00 00 00 00 0a 00  |................|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
 000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
 000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
-000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
-000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
-000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
-000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
+000000c0  01 00 01 00 00 17 00 00  00 12 00 00 00 2b 00 09  |.............+..|
+000000d0  08 03 04 03 03 03 02 03  01 00 33 00 26 00 24 00  |..........3.&.$.|
+000000e0  1d 00 20 2f e5 7d a3 47  cd 62 43 15 28 da ac 5f  |.. /.}.G.bC.(.._|
+000000f0  bb 29 07 30 ff f6 84 af  c4 cf c2 ed 90 99 5f 58  |.).0.........._X|
+00000100  cb 3b 74                                          |.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 59 02 00 00  55 03 03 d1 af 88 61 b7  |....Y...U.....a.|
-00000010  b3 01 16 1a 44 26 1c a1  4f 2d 8a f6 9c f2 7e 1a  |....D&..O-....~.|
-00000020  1f ce cb dd 5b f0 c6 2f  16 5e 4a 20 b3 c7 ae 3f  |....[../.^J ...?|
-00000030  de d0 d8 9e 48 3e 87 23  f0 9d 43 10 50 3c 66 8b  |....H>.#..C.P<f.|
-00000040  7f d2 9b 4f f5 e4 b3 53  db d6 65 d0 c0 23 00 00  |...O...S..e..#..|
-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 b6 0c 00  00 b2 03 00 1d 20 dc 43  |*............ .C|
-00000280  15 b7 95 81 41 bf e2 bd  56 82 23 46 05 29 05 95  |....A...V.#F.)..|
-00000290  ae 67 08 38 9f 10 70 25  21 92 b4 a0 82 4e 04 03  |.g.8..p%!....N..|
-000002a0  00 8a 30 81 87 02 41 5d  ca d6 a2 fd e3 e2 be 2f  |..0...A]......./|
-000002b0  69 b5 7d 5c a3 2b 36 4c  8b 81 05 89 12 e1 30 26  |i.}\.+6L......0&|
-000002c0  fa ae 82 b9 4f 8e ba ac  ee 7b 62 d5 60 f8 df a4  |....O....{b.`...|
-000002d0  c1 a1 15 73 f8 fb 0b 47  64 b3 34 4a 44 02 a6 32  |...s...Gd.4JD..2|
-000002e0  bc 0d 7b a5 c1 84 cf 77  02 42 01 f3 e5 7f d1 47  |..{....w.B.....G|
-000002f0  bc be 0a ec cd d6 4f 2c  26 5a 95 d3 0f 9b c3 c6  |......O,&Z......|
-00000300  05 b5 5e d7 f6 ca 64 17  94 aa a5 e6 b1 88 57 21  |..^...d.......W!|
-00000310  f8 da 02 de 32 8c ea 5b  7c 36 c9 93 e1 96 38 93  |....2..[|6....8.|
-00000320  9b f9 e5 44 47 a6 74 fa  0e 5f 8f 22 16 03 03 00  |...DG.t.._."....|
-00000330  04 0e 00 00 00                                    |.....|
+00000000  16 03 03 00 5d 02 00 00  59 03 03 32 b8 00 e5 21  |....]...Y..2...!|
+00000010  98 b0 8b 40 56 f2 af 06  fa 7d 1c 23 6a 01 c6 95  |...@V....}.#j...|
+00000020  41 9d 08 ac 5d de 0e 7e  39 57 07 20 b5 df a0 9a  |A...]..~9W. ....|
+00000030  13 3f b4 ae 1f 54 eb 47  6a 5a d5 f1 07 22 8f 29  |.?...T.GjZ...".)|
+00000040  00 e8 9e e9 f6 76 80 ab  7d a8 23 4a c0 23 00 00  |.....v..}.#J.#..|
+00000050  11 ff 01 00 01 00 00 0b  00 04 03 00 01 02 00 17  |................|
+00000060  00 00 16 03 03 02 0e 0b  00 02 0a 00 02 07 00 02  |................|
+00000070  04 30 82 02 00 30 82 01  62 02 09 00 b8 bf 2d 47  |.0...0..b.....-G|
+00000080  a0 d2 eb f4 30 09 06 07  2a 86 48 ce 3d 04 01 30  |....0...*.H.=..0|
+00000090  45 31 0b 30 09 06 03 55  04 06 13 02 41 55 31 13  |E1.0...U....AU1.|
+000000a0  30 11 06 03 55 04 08 13  0a 53 6f 6d 65 2d 53 74  |0...U....Some-St|
+000000b0  61 74 65 31 21 30 1f 06  03 55 04 0a 13 18 49 6e  |ate1!0...U....In|
+000000c0  74 65 72 6e 65 74 20 57  69 64 67 69 74 73 20 50  |ternet Widgits P|
+000000d0  74 79 20 4c 74 64 30 1e  17 0d 31 32 31 31 32 32  |ty Ltd0...121122|
+000000e0  31 35 30 36 33 32 5a 17  0d 32 32 31 31 32 30 31  |150632Z..2211201|
+000000f0  35 30 36 33 32 5a 30 45  31 0b 30 09 06 03 55 04  |50632Z0E1.0...U.|
+00000100  06 13 02 41 55 31 13 30  11 06 03 55 04 08 13 0a  |...AU1.0...U....|
+00000110  53 6f 6d 65 2d 53 74 61  74 65 31 21 30 1f 06 03  |Some-State1!0...|
+00000120  55 04 0a 13 18 49 6e 74  65 72 6e 65 74 20 57 69  |U....Internet Wi|
+00000130  64 67 69 74 73 20 50 74  79 20 4c 74 64 30 81 9b  |dgits Pty Ltd0..|
+00000140  30 10 06 07 2a 86 48 ce  3d 02 01 06 05 2b 81 04  |0...*.H.=....+..|
+00000150  00 23 03 81 86 00 04 00  c4 a1 ed be 98 f9 0b 48  |.#.............H|
+00000160  73 36 7e c3 16 56 11 22  f2 3d 53 c3 3b 4d 21 3d  |s6~..V.".=S.;M!=|
+00000170  cd 6b 75 e6 f6 b0 dc 9a  df 26 c1 bc b2 87 f0 72  |.ku......&.....r|
+00000180  32 7c b3 64 2f 1c 90 bc  ea 68 23 10 7e fe e3 25  |2|.d/....h#.~..%|
+00000190  c0 48 3a 69 e0 28 6d d3  37 00 ef 04 62 dd 0d a0  |.H:i.(m.7...b...|
+000001a0  9c 70 62 83 d8 81 d3 64  31 aa 9e 97 31 bd 96 b0  |.pb....d1...1...|
+000001b0  68 c0 9b 23 de 76 64 3f  1a 5c 7f e9 12 0e 58 58  |h..#.vd?.\....XX|
+000001c0  b6 5f 70 dd 9b d8 ea d5  d7 f5 d5 cc b9 b6 9f 30  |._p............0|
+000001d0  66 5b 66 9a 20 e2 27 e5  bf fe 3b 30 09 06 07 2a  |f[f. .'...;0...*|
+000001e0  86 48 ce 3d 04 01 03 81  8c 00 30 81 88 02 42 01  |.H.=......0...B.|
+000001f0  88 a2 4f eb e2 45 c5 48  7d 1b ac f5 ed 98 9d ae  |..O..E.H}.......|
+00000200  47 70 c0 5e 1b b6 2f bd  f1 b6 4d b7 61 40 d3 11  |Gp.^../...M.a@..|
+00000210  a2 ce ee 0b 7e 92 7e ff  76 9d c3 3b 7e a5 3f ce  |....~.~.v..;~.?.|
+00000220  fa 10 e2 59 ec 47 2d 7c  ac da 4e 97 0e 15 a0 6f  |...Y.G-|..N....o|
+00000230  d0 02 42 01 4d fc be 67  13 9c 2d 05 0e bd 3f a3  |..B.M..g..-...?.|
+00000240  8c 25 c1 33 13 83 0d 94  06 bb d4 37 7a f6 ec 7a  |.%.3.......7z..z|
+00000250  c9 86 2e dd d7 11 69 7f  85 7c 56 de fb 31 78 2b  |......i..|V..1x+|
+00000260  e4 c7 78 0d ae cb be 9e  4e 36 24 31 7b 6a 0f 39  |..x.....N6$1{j.9|
+00000270  95 12 07 8f 2a 16 03 03  00 b6 0c 00 00 b2 03 00  |....*...........|
+00000280  1d 20 f1 d6 ed a5 69 28  d2 bd 97 e3 00 e0 81 74  |. ....i(.......t|
+00000290  8d 36 6e 77 73 40 10 a1  73 b3 4d 8e 04 41 b1 0e  |.6nws@..s.M..A..|
+000002a0  08 28 04 03 00 8a 30 81  87 02 42 01 4b b4 14 32  |.(....0...B.K..2|
+000002b0  13 88 f1 8d 3a 66 e2 a2  d6 d4 de 26 50 7d 74 22  |....:f.....&P}t"|
+000002c0  f9 56 83 00 0a b7 34 b3  96 99 0e c4 1d 8d 86 df  |.V....4.........|
+000002d0  22 2b 1c d7 75 f5 c9 45  2a c7 8a 74 40 ae 04 ac  |"+..u..E*..t@...|
+000002e0  b3 b4 5e c1 c5 e6 9c c3  01 ad 10 37 2b 02 41 4f  |..^........7+.AO|
+000002f0  74 33 31 aa c0 f8 8e ac  cf 5a 90 a5 b8 d1 52 76  |t31......Z....Rv|
+00000300  c3 a3 4f 0d 7d d7 8a 50  d3 bb 49 ce 22 ec d0 d3  |..O.}..P..I."...|
+00000310  b5 e3 5c c2 a9 54 2e 6f  9c d1 24 3d 70 7f 2b a3  |..\..T.o..$=p.+.|
+00000320  fe 24 fc 48 14 d3 8a f0  70 f3 1f af fe ae e3 fe  |.$.H....p.......|
+00000330  16 03 03 00 04 0e 00 00  00                       |.........|
 >>> Flow 3 (client to server)
 00000000  16 03 03 00 25 10 00 00  21 20 2f e5 7d a3 47 cd  |....%...! /.}.G.|
 00000010  62 43 15 28 da ac 5f bb  29 07 30 ff f6 84 af c4  |bC.(.._.).0.....|
 00000020  cf c2 ed 90 99 5f 58 cb  3b 74 14 03 03 00 01 01  |....._X.;t......|
 00000030  16 03 03 00 50 00 00 00  00 00 00 00 00 00 00 00  |....P...........|
-00000040  00 00 00 00 00 85 db ae  c1 37 85 25 3d ee 5f f5  |.........7.%=._.|
-00000050  12 95 df ee 29 4a f7 3a  80 ca bd c2 b3 d8 f3 8c  |....)J.:........|
-00000060  56 62 d2 68 13 1d 73 51  09 93 a3 b9 43 4a 2c 0f  |Vb.h..sQ....CJ,.|
-00000070  bf 3c 96 76 08 a9 17 68  e2 9a 3f 39 e7 04 76 f8  |.<.v...h..?9..v.|
-00000080  8f fe e8 f5 ce                                    |.....|
+00000040  00 00 00 00 00 ea c6 10  80 cf 85 ad 7c 5f 6b 98  |............|_k.|
+00000050  7b 5a d6 47 84 dc 95 c9  ed 6e e6 c3 56 d5 91 93  |{Z.G.....n..V...|
+00000060  0e 3f b5 6c 2f 73 d9 72  9b f7 64 47 29 9e 75 4f  |.?.l/s.r..dG).uO|
+00000070  97 2e 6d 94 52 f7 8f c9  24 5b d0 fe 05 aa e6 93  |..m.R...$[......|
+00000080  79 ea 37 0f 9e                                    |y.7..|
 >>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 50 fa 85 cc bc dd  |..........P.....|
-00000010  0e 16 86 b1 5c 51 8a b9  cc 78 cd cd 64 5d 23 ca  |....\Q...x..d]#.|
-00000020  59 84 b3 42 dd ae a7 98  43 05 21 4f 35 43 75 5c  |Y..B....C.!O5Cu\|
-00000030  13 c8 e0 b6 66 0f 55 32  69 7a 8b 8f cd c2 37 38  |....f.U2iz....78|
-00000040  f6 fa 0b 66 cf 46 91 3e  9f f5 43 44 f5 c7 2b e1  |...f.F.>..CD..+.|
-00000050  39 3a f7 3c f2 03 c4 85  dc 58 66                 |9:.<.....Xf|
+00000000  14 03 03 00 01 01 16 03  03 00 50 ed 02 93 7e 89  |..........P...~.|
+00000010  d5 d7 e9 0b 21 71 a9 cd  b6 ac 65 6f 83 b2 0f 35  |....!q....eo...5|
+00000020  d6 1c bb df c5 c2 d6 6c  b6 32 37 14 a0 0c fd ae  |.......l.27.....|
+00000030  18 75 9e 82 df 00 ec 6c  99 e2 31 a3 35 e0 82 6d  |.u.....l..1.5..m|
+00000040  57 5b 60 82 ec 69 8a 79  30 96 4f 96 bb 99 66 75  |W[`..i.y0.O...fu|
+00000050  5d 41 f9 04 fc f2 c6 bb  92 1c cb                 |]A.........|
 >>> Flow 5 (client to server)
 00000000  17 03 03 00 40 00 00 00  00 00 00 00 00 00 00 00  |....@...........|
-00000010  00 00 00 00 00 44 e6 99  40 ae 12 bc d9 92 c5 ae  |.....D..@.......|
-00000020  fb 4d 5f 64 7a 77 0f 80  8e a4 be d0 ba ba 41 b1  |.M_dzw........A.|
-00000030  0d 40 e9 0e 50 32 dc 35  2d 5e 5c 8a ef 20 75 80  |.@..P2.5-^\.. u.|
-00000040  a0 e5 9c 61 49 15 03 03  00 40 00 00 00 00 00 00  |...aI....@......|
-00000050  00 00 00 00 00 00 00 00  00 00 57 91 40 2a a5 f7  |..........W.@*..|
-00000060  9f 29 0f 02 8e 50 ac 4b  2e 55 9a 78 72 f0 d7 c5  |.)...P.K.U.xr...|
-00000070  3b f2 cd 28 4d 8b 49 d8  50 a6 22 96 de df 16 d6  |;..(M.I.P.".....|
-00000080  61 4b 23 5c 5d de a1 0a  5b 16                    |aK#\]...[.|
+00000010  00 00 00 00 00 23 62 3f  ed a2 99 3b ac 03 f5 8c  |.....#b?...;....|
+00000020  3c 9f 71 25 b5 5c ec 2c  79 d5 70 ae 23 cf 2f 65  |<.q%.\.,y.p.#./e|
+00000030  3d 28 5f dd fb d6 6a 12  b5 5f eb 9f 2a 8e 79 80  |=(_...j.._..*.y.|
+00000040  eb 77 6e 7e b0 15 03 03  00 40 00 00 00 00 00 00  |.wn~.....@......|
+00000050  00 00 00 00 00 00 00 00  00 00 13 e1 0c 7b 01 90  |.............{..|
+00000060  e8 0d 2d 41 b5 c3 67 0a  37 c4 28 fa b6 88 cc 99  |..-A..g.7.(.....|
+00000070  f7 0a d9 25 09 24 88 f7  38 78 c4 1c 37 b4 3c a8  |...%.$..8x..7.<.|
+00000080  3d 2d ac a7 0d 45 62 9c  61 53                    |=-...Eb.aS|
diff --git a/src/crypto/tls/testdata/Client-TLSv12-ECDHE-ECDSA-AES256-GCM-SHA384 b/src/crypto/tls/testdata/Client-TLSv12-ECDHE-ECDSA-AES256-GCM-SHA384
index 14af5ae..6477993 100644
--- a/src/crypto/tls/testdata/Client-TLSv12-ECDHE-ECDSA-AES256-GCM-SHA384
+++ b/src/crypto/tls/testdata/Client-TLSv12-ECDHE-ECDSA-AES256-GCM-SHA384
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fe 01 00 00  fa 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 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,82 +7,83 @@
 00000050  cc a8 c0 2b c0 2f c0 2c  c0 30 c0 09 c0 13 c0 0a  |...+./.,.0......|
 00000060  c0 14 00 9c 00 9d 00 2f  00 35 c0 12 00 0a c0 23  |......./.5.....#|
 00000070  c0 27 00 3c c0 07 c0 11  00 05 13 03 13 01 13 02  |.'.<............|
-00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
+00000080  01 00 00 7f 00 05 00 05  01 00 00 00 00 00 0a 00  |................|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
 000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
 000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
-000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
-000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
-000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
-000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
+000000c0  01 00 01 00 00 17 00 00  00 12 00 00 00 2b 00 09  |.............+..|
+000000d0  08 03 04 03 03 03 02 03  01 00 33 00 26 00 24 00  |..........3.&.$.|
+000000e0  1d 00 20 2f e5 7d a3 47  cd 62 43 15 28 da ac 5f  |.. /.}.G.bC.(.._|
+000000f0  bb 29 07 30 ff f6 84 af  c4 cf c2 ed 90 99 5f 58  |.).0.........._X|
+00000100  cb 3b 74                                          |.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 59 02 00 00  55 03 03 bb 8a 66 ee 44  |....Y...U....f.D|
-00000010  42 dc 59 c7 a7 7b a8 57  8e 63 21 f0 4e 31 f4 5c  |B.Y..{.W.c!.N1.\|
-00000020  1d d3 42 e5 de eb 8c 78  3a 01 01 20 9b 89 05 d6  |..B....x:.. ....|
-00000030  d2 07 38 8b 4c 5f 6d 62  9f 43 a0 cd d3 40 0f 77  |..8.L_mb.C...@.w|
-00000040  17 ff 43 4a 5c b3 8c 83  b7 4b c7 e7 c0 2c 00 00  |..CJ\....K...,..|
-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 b7 0c 00  00 b3 03 00 1d 20 fd 71  |*............ .q|
-00000280  c1 3a 6a a3 69 6a 34 f3  02 c5 1d e5 db 63 f4 eb  |.:j.ij4......c..|
-00000290  97 4c 70 bc b3 4e 9d 2c  2f b2 b9 9d ac 3f 04 03  |.Lp..N.,/....?..|
-000002a0  00 8b 30 81 88 02 42 01  bd 9d ad 24 37 b9 60 55  |..0...B....$7.`U|
-000002b0  e4 cc bc 49 c3 88 3b ed  ac e4 42 8e fa 81 01 d9  |...I..;...B.....|
-000002c0  39 4c f0 1c 7d 39 a2 81  8a e1 17 0e 8d 37 76 96  |9L..}9.......7v.|
-000002d0  37 13 3a 1e 2e fd 0d 0a  3c 90 9d 43 3d 06 c0 b1  |7.:.....<..C=...|
-000002e0  4e 07 3e c3 9f f2 43 40  0b 02 42 01 d6 d0 20 ad  |N.>...C@..B... .|
-000002f0  48 09 c0 9b 5d c8 84 46  3b 98 37 9b 5a 91 4a 07  |H...]..F;.7.Z.J.|
-00000300  79 68 71 92 76 dc 70 0f  5c 44 7e 81 c3 c6 3f 19  |yhq.v.p.\D~...?.|
-00000310  f4 0f 6a 0b aa cc bb 65  e7 34 b5 e9 67 2d 32 98  |..j....e.4..g-2.|
-00000320  1c f6 76 4c 96 73 df 21  d6 e1 ea 34 86 16 03 03  |..vL.s.!...4....|
-00000330  00 04 0e 00 00 00                                 |......|
+00000000  16 03 03 00 5d 02 00 00  59 03 03 99 43 3d 42 93  |....]...Y...C=B.|
+00000010  5a 7a 04 30 74 51 61 36  15 df ef a7 26 ef b8 76  |Zz.0tQa6....&..v|
+00000020  87 35 7a 88 75 83 9e 0d  2c d4 3d 20 1f 29 99 ea  |.5z.u...,.= .)..|
+00000030  71 f7 c3 c4 68 3e 7f 58  7a 07 c7 2d a3 38 47 8d  |q...h>.Xz..-.8G.|
+00000040  c9 ed 05 b4 8e e7 b6 85  5d a1 62 6b c0 2c 00 00  |........].bk.,..|
+00000050  11 ff 01 00 01 00 00 0b  00 04 03 00 01 02 00 17  |................|
+00000060  00 00 16 03 03 02 0e 0b  00 02 0a 00 02 07 00 02  |................|
+00000070  04 30 82 02 00 30 82 01  62 02 09 00 b8 bf 2d 47  |.0...0..b.....-G|
+00000080  a0 d2 eb f4 30 09 06 07  2a 86 48 ce 3d 04 01 30  |....0...*.H.=..0|
+00000090  45 31 0b 30 09 06 03 55  04 06 13 02 41 55 31 13  |E1.0...U....AU1.|
+000000a0  30 11 06 03 55 04 08 13  0a 53 6f 6d 65 2d 53 74  |0...U....Some-St|
+000000b0  61 74 65 31 21 30 1f 06  03 55 04 0a 13 18 49 6e  |ate1!0...U....In|
+000000c0  74 65 72 6e 65 74 20 57  69 64 67 69 74 73 20 50  |ternet Widgits P|
+000000d0  74 79 20 4c 74 64 30 1e  17 0d 31 32 31 31 32 32  |ty Ltd0...121122|
+000000e0  31 35 30 36 33 32 5a 17  0d 32 32 31 31 32 30 31  |150632Z..2211201|
+000000f0  35 30 36 33 32 5a 30 45  31 0b 30 09 06 03 55 04  |50632Z0E1.0...U.|
+00000100  06 13 02 41 55 31 13 30  11 06 03 55 04 08 13 0a  |...AU1.0...U....|
+00000110  53 6f 6d 65 2d 53 74 61  74 65 31 21 30 1f 06 03  |Some-State1!0...|
+00000120  55 04 0a 13 18 49 6e 74  65 72 6e 65 74 20 57 69  |U....Internet Wi|
+00000130  64 67 69 74 73 20 50 74  79 20 4c 74 64 30 81 9b  |dgits Pty Ltd0..|
+00000140  30 10 06 07 2a 86 48 ce  3d 02 01 06 05 2b 81 04  |0...*.H.=....+..|
+00000150  00 23 03 81 86 00 04 00  c4 a1 ed be 98 f9 0b 48  |.#.............H|
+00000160  73 36 7e c3 16 56 11 22  f2 3d 53 c3 3b 4d 21 3d  |s6~..V.".=S.;M!=|
+00000170  cd 6b 75 e6 f6 b0 dc 9a  df 26 c1 bc b2 87 f0 72  |.ku......&.....r|
+00000180  32 7c b3 64 2f 1c 90 bc  ea 68 23 10 7e fe e3 25  |2|.d/....h#.~..%|
+00000190  c0 48 3a 69 e0 28 6d d3  37 00 ef 04 62 dd 0d a0  |.H:i.(m.7...b...|
+000001a0  9c 70 62 83 d8 81 d3 64  31 aa 9e 97 31 bd 96 b0  |.pb....d1...1...|
+000001b0  68 c0 9b 23 de 76 64 3f  1a 5c 7f e9 12 0e 58 58  |h..#.vd?.\....XX|
+000001c0  b6 5f 70 dd 9b d8 ea d5  d7 f5 d5 cc b9 b6 9f 30  |._p............0|
+000001d0  66 5b 66 9a 20 e2 27 e5  bf fe 3b 30 09 06 07 2a  |f[f. .'...;0...*|
+000001e0  86 48 ce 3d 04 01 03 81  8c 00 30 81 88 02 42 01  |.H.=......0...B.|
+000001f0  88 a2 4f eb e2 45 c5 48  7d 1b ac f5 ed 98 9d ae  |..O..E.H}.......|
+00000200  47 70 c0 5e 1b b6 2f bd  f1 b6 4d b7 61 40 d3 11  |Gp.^../...M.a@..|
+00000210  a2 ce ee 0b 7e 92 7e ff  76 9d c3 3b 7e a5 3f ce  |....~.~.v..;~.?.|
+00000220  fa 10 e2 59 ec 47 2d 7c  ac da 4e 97 0e 15 a0 6f  |...Y.G-|..N....o|
+00000230  d0 02 42 01 4d fc be 67  13 9c 2d 05 0e bd 3f a3  |..B.M..g..-...?.|
+00000240  8c 25 c1 33 13 83 0d 94  06 bb d4 37 7a f6 ec 7a  |.%.3.......7z..z|
+00000250  c9 86 2e dd d7 11 69 7f  85 7c 56 de fb 31 78 2b  |......i..|V..1x+|
+00000260  e4 c7 78 0d ae cb be 9e  4e 36 24 31 7b 6a 0f 39  |..x.....N6$1{j.9|
+00000270  95 12 07 8f 2a 16 03 03  00 b5 0c 00 00 b1 03 00  |....*...........|
+00000280  1d 20 fb 11 a5 85 16 55  f9 09 56 4a 4c f7 c8 a1  |. .....U..VJL...|
+00000290  fd 57 e3 4d 1e b5 78 df  7a b1 02 0c 42 60 80 f9  |.W.M..x.z...B`..|
+000002a0  4b 6e 04 03 00 89 30 81  86 02 41 4d 4a 3c 11 e1  |Kn....0...AMJ<..|
+000002b0  72 33 71 38 77 52 4d d8  78 ee 23 f9 f3 00 20 76  |r3q8wRM.x.#... v|
+000002c0  04 19 b2 4c 28 34 9d 22  b7 3e 1d 35 8f 93 ab 66  |...L(4.".>.5...f|
+000002d0  09 c4 7a 8e 8c 5a fc ae  1d c7 ba 2e 36 ea e7 0b  |..z..Z......6...|
+000002e0  43 ae 03 e3 ec 6b f7 81  2e 22 e5 f0 02 41 39 95  |C....k..."...A9.|
+000002f0  22 5f b0 1a 5c 13 a0 c5  08 47 a7 51 9c fa 15 32  |"_..\....G.Q...2|
+00000300  95 84 95 8f 2f ed 38 19  bb b5 2b ac 39 90 a1 4c  |..../.8...+.9..L|
+00000310  b5 20 49 cd 87 17 9d ef  b4 c3 22 05 56 23 7d bc  |. I.......".V#}.|
+00000320  6a d6 ae d9 e5 50 65 6c  8b df 4b 2e 6d e9 e3 16  |j....Pel..K.m...|
+00000330  03 03 00 04 0e 00 00 00                           |........|
 >>> Flow 3 (client to server)
 00000000  16 03 03 00 25 10 00 00  21 20 2f e5 7d a3 47 cd  |....%...! /.}.G.|
 00000010  62 43 15 28 da ac 5f bb  29 07 30 ff f6 84 af c4  |bC.(.._.).0.....|
 00000020  cf c2 ed 90 99 5f 58 cb  3b 74 14 03 03 00 01 01  |....._X.;t......|
-00000030  16 03 03 00 28 00 00 00  00 00 00 00 00 27 fd 98  |....(........'..|
-00000040  47 79 56 f9 e8 0e fd 18  c2 8f 2d 32 51 f7 19 b5  |GyV.......-2Q...|
-00000050  ab 2f 81 ed b6 cf 6f b5  65 81 81 f1 44           |./....o.e...D|
+00000030  16 03 03 00 28 00 00 00  00 00 00 00 00 ef cc 31  |....(..........1|
+00000040  f9 de 58 68 c9 6a c7 c4  3e 60 1f 4e f9 bf 27 87  |..Xh.j..>`.N..'.|
+00000050  b0 17 ed 83 17 a0 45 b7  a9 d8 95 b6 51           |......E.....Q|
 >>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 28 a9 b7 63 61 57  |..........(..caW|
-00000010  54 57 f0 b2 60 58 e3 dc  6e e1 40 3e 67 b4 99 8f  |TW..`X..n.@>g...|
-00000020  e9 6b 11 f1 1a 54 bd c1  d3 b9 5b 01 12 27 a4 0b  |.k...T....[..'..|
-00000030  e9 ec 01                                          |...|
+00000000  14 03 03 00 01 01 16 03  03 00 28 61 eb 42 a7 10  |..........(a.B..|
+00000010  6f 1a ef 4d e5 4d df 75  cb 8e 59 f8 06 e0 f9 ee  |o..M.M.u..Y.....|
+00000020  d1 a9 11 7b 89 97 62 b9  76 d1 8e eb ee 30 dd 0f  |...{..b.v....0..|
+00000030  60 b1 e1                                          |`..|
 >>> Flow 5 (client to server)
-00000000  17 03 03 00 1e 00 00 00  00 00 00 00 01 e0 8a 6e  |...............n|
-00000010  62 5d e3 db 99 10 d2 53  b6 21 2e 79 31 cf 71 1d  |b].....S.!.y1.q.|
-00000020  34 71 2a 15 03 03 00 1a  00 00 00 00 00 00 00 02  |4q*.............|
-00000030  e7 4a 8d b9 2f 1b b1 70  72 da 7f d8 fa 4f 9f d6  |.J../..pr....O..|
-00000040  ca f3                                             |..|
+00000000  17 03 03 00 1e 00 00 00  00 00 00 00 01 fb 32 66  |..............2f|
+00000010  d6 d5 e1 52 31 8d 63 4f  5c a0 ac b5 f3 64 dc 40  |...R1.cO\....d.@|
+00000020  f5 93 5a 15 03 03 00 1a  00 00 00 00 00 00 00 02  |..Z.............|
+00000030  6b 66 c3 db e8 33 66 14  9b 4b 1c 59 bf 9e 6c 7e  |kf...3f..K.Y..l~|
+00000040  2d 1e                                             |-.|
diff --git a/src/crypto/tls/testdata/Client-TLSv12-ECDHE-ECDSA-CHACHA20-POLY1305 b/src/crypto/tls/testdata/Client-TLSv12-ECDHE-ECDSA-CHACHA20-POLY1305
index 3113b3c..e1b45cb 100644
--- a/src/crypto/tls/testdata/Client-TLSv12-ECDHE-ECDSA-CHACHA20-POLY1305
+++ b/src/crypto/tls/testdata/Client-TLSv12-ECDHE-ECDSA-CHACHA20-POLY1305
@@ -1,84 +1,84 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 d0 01 00 00  cc 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 d4 01 00 00  d0 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 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000040  00 00 00 00 00 00 00 00  00 00 00 00 00 08 cc a9  |................|
-00000050  13 03 13 01 13 02 01 00  00 7b 00 05 00 05 01 00  |.........{......|
+00000050  13 03 13 01 13 02 01 00  00 7f 00 05 00 05 01 00  |................|
 00000060  00 00 00 00 0a 00 0a 00  08 00 1d 00 17 00 18 00  |................|
 00000070  19 00 0b 00 02 01 00 00  0d 00 1a 00 18 08 04 04  |................|
 00000080  03 08 07 08 05 08 06 04  01 05 01 06 01 05 03 06  |................|
-00000090  03 02 01 02 03 ff 01 00  01 00 00 12 00 00 00 2b  |...............+|
-000000a0  00 09 08 03 04 03 03 03  02 03 01 00 33 00 26 00  |............3.&.|
-000000b0  24 00 1d 00 20 2f e5 7d  a3 47 cd 62 43 15 28 da  |$... /.}.G.bC.(.|
-000000c0  ac 5f bb 29 07 30 ff f6  84 af c4 cf c2 ed 90 99  |._.).0..........|
-000000d0  5f 58 cb 3b 74                                    |_X.;t|
+00000090  03 02 01 02 03 ff 01 00  01 00 00 17 00 00 00 12  |................|
+000000a0  00 00 00 2b 00 09 08 03  04 03 03 03 02 03 01 00  |...+............|
+000000b0  33 00 26 00 24 00 1d 00  20 2f e5 7d a3 47 cd 62  |3.&.$... /.}.G.b|
+000000c0  43 15 28 da ac 5f bb 29  07 30 ff f6 84 af c4 cf  |C.(.._.).0......|
+000000d0  c2 ed 90 99 5f 58 cb 3b  74                       |...._X.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 59 02 00 00  55 03 03 e1 cc 3c 49 04  |....Y...U....<I.|
-00000010  bb 5b 18 c7 44 8f 52 62  d9 74 84 94 fa 61 3f 12  |.[..D.Rb.t...a?.|
-00000020  c8 23 50 0b 8a 5c 81 23  c2 9d 3d 20 1f b2 67 b0  |.#P..\.#..= ..g.|
-00000030  e9 2d a9 ed 35 4e ab b9  73 59 32 2f 49 ed 1e 60  |.-..5N..sY2/I..`|
-00000040  4c 31 11 6e 27 79 e0 62  e0 e4 ca 16 cc a9 00 00  |L1.n'y.b........|
-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 b6 0c 00  00 b2 03 00 1d 20 cc a1  |*............ ..|
-00000280  4d a4 b1 22 86 e5 91 9b  e2 1a 28 c6 66 06 1a 89  |M.."......(.f...|
-00000290  a9 62 23 93 09 54 ae 67  a8 ab 18 ac 67 37 04 03  |.b#..T.g....g7..|
-000002a0  00 8a 30 81 87 02 42 01  f0 46 f3 3f 13 a7 1d 84  |..0...B..F.?....|
-000002b0  73 65 9e 91 16 6c 3d 8f  21 ab 17 db 24 34 21 8c  |se...l=.!...$4!.|
-000002c0  a9 e1 9b a6 17 c8 0d 7a  b4 8e f0 46 cd c5 b9 b2  |.......z...F....|
-000002d0  5e 64 7f 9f 9d 03 14 7a  23 5d 55 70 ae d1 ff 08  |^d.....z#]Up....|
-000002e0  e8 70 f5 5d 55 90 74 04  0d 02 41 09 ca 7d 60 ea  |.p.]U.t...A..}`.|
-000002f0  13 17 42 e8 53 e7 c5 31  15 4a 58 14 d6 54 f5 40  |..B.S..1.JX..T.@|
-00000300  a1 aa fe 4b 13 f5 29 04  05 cc 12 26 e2 b7 e5 a6  |...K..)....&....|
-00000310  90 7c 5e 66 2f ed 41 7c  97 a1 72 87 5e 46 5a 5b  |.|^f/.A|..r.^FZ[|
-00000320  1b d1 7b 3c 34 ba 3f 47  7d a9 84 33 16 03 03 00  |..{<4.?G}..3....|
-00000330  04 0e 00 00 00                                    |.....|
+00000000  16 03 03 00 5d 02 00 00  59 03 03 f0 39 6d 08 4c  |....]...Y...9m.L|
+00000010  1e c8 06 4d 9e 1e 2a 27  d9 17 6f 39 19 38 ba 49  |...M..*'..o9.8.I|
+00000020  a5 fa b2 6d a2 70 e8 9d  b2 03 92 20 09 ef 68 cb  |...m.p..... ..h.|
+00000030  58 2a fd 4b 60 9a 1e af  f4 02 c0 cb 10 b2 dd 73  |X*.K`..........s|
+00000040  0c e0 6a da 3f cd 3a a3  a3 55 58 00 cc a9 00 00  |..j.?.:..UX.....|
+00000050  11 ff 01 00 01 00 00 0b  00 04 03 00 01 02 00 17  |................|
+00000060  00 00 16 03 03 02 0e 0b  00 02 0a 00 02 07 00 02  |................|
+00000070  04 30 82 02 00 30 82 01  62 02 09 00 b8 bf 2d 47  |.0...0..b.....-G|
+00000080  a0 d2 eb f4 30 09 06 07  2a 86 48 ce 3d 04 01 30  |....0...*.H.=..0|
+00000090  45 31 0b 30 09 06 03 55  04 06 13 02 41 55 31 13  |E1.0...U....AU1.|
+000000a0  30 11 06 03 55 04 08 13  0a 53 6f 6d 65 2d 53 74  |0...U....Some-St|
+000000b0  61 74 65 31 21 30 1f 06  03 55 04 0a 13 18 49 6e  |ate1!0...U....In|
+000000c0  74 65 72 6e 65 74 20 57  69 64 67 69 74 73 20 50  |ternet Widgits P|
+000000d0  74 79 20 4c 74 64 30 1e  17 0d 31 32 31 31 32 32  |ty Ltd0...121122|
+000000e0  31 35 30 36 33 32 5a 17  0d 32 32 31 31 32 30 31  |150632Z..2211201|
+000000f0  35 30 36 33 32 5a 30 45  31 0b 30 09 06 03 55 04  |50632Z0E1.0...U.|
+00000100  06 13 02 41 55 31 13 30  11 06 03 55 04 08 13 0a  |...AU1.0...U....|
+00000110  53 6f 6d 65 2d 53 74 61  74 65 31 21 30 1f 06 03  |Some-State1!0...|
+00000120  55 04 0a 13 18 49 6e 74  65 72 6e 65 74 20 57 69  |U....Internet Wi|
+00000130  64 67 69 74 73 20 50 74  79 20 4c 74 64 30 81 9b  |dgits Pty Ltd0..|
+00000140  30 10 06 07 2a 86 48 ce  3d 02 01 06 05 2b 81 04  |0...*.H.=....+..|
+00000150  00 23 03 81 86 00 04 00  c4 a1 ed be 98 f9 0b 48  |.#.............H|
+00000160  73 36 7e c3 16 56 11 22  f2 3d 53 c3 3b 4d 21 3d  |s6~..V.".=S.;M!=|
+00000170  cd 6b 75 e6 f6 b0 dc 9a  df 26 c1 bc b2 87 f0 72  |.ku......&.....r|
+00000180  32 7c b3 64 2f 1c 90 bc  ea 68 23 10 7e fe e3 25  |2|.d/....h#.~..%|
+00000190  c0 48 3a 69 e0 28 6d d3  37 00 ef 04 62 dd 0d a0  |.H:i.(m.7...b...|
+000001a0  9c 70 62 83 d8 81 d3 64  31 aa 9e 97 31 bd 96 b0  |.pb....d1...1...|
+000001b0  68 c0 9b 23 de 76 64 3f  1a 5c 7f e9 12 0e 58 58  |h..#.vd?.\....XX|
+000001c0  b6 5f 70 dd 9b d8 ea d5  d7 f5 d5 cc b9 b6 9f 30  |._p............0|
+000001d0  66 5b 66 9a 20 e2 27 e5  bf fe 3b 30 09 06 07 2a  |f[f. .'...;0...*|
+000001e0  86 48 ce 3d 04 01 03 81  8c 00 30 81 88 02 42 01  |.H.=......0...B.|
+000001f0  88 a2 4f eb e2 45 c5 48  7d 1b ac f5 ed 98 9d ae  |..O..E.H}.......|
+00000200  47 70 c0 5e 1b b6 2f bd  f1 b6 4d b7 61 40 d3 11  |Gp.^../...M.a@..|
+00000210  a2 ce ee 0b 7e 92 7e ff  76 9d c3 3b 7e a5 3f ce  |....~.~.v..;~.?.|
+00000220  fa 10 e2 59 ec 47 2d 7c  ac da 4e 97 0e 15 a0 6f  |...Y.G-|..N....o|
+00000230  d0 02 42 01 4d fc be 67  13 9c 2d 05 0e bd 3f a3  |..B.M..g..-...?.|
+00000240  8c 25 c1 33 13 83 0d 94  06 bb d4 37 7a f6 ec 7a  |.%.3.......7z..z|
+00000250  c9 86 2e dd d7 11 69 7f  85 7c 56 de fb 31 78 2b  |......i..|V..1x+|
+00000260  e4 c7 78 0d ae cb be 9e  4e 36 24 31 7b 6a 0f 39  |..x.....N6$1{j.9|
+00000270  95 12 07 8f 2a 16 03 03  00 b7 0c 00 00 b3 03 00  |....*...........|
+00000280  1d 20 f0 e0 d6 3e 40 a0  97 de 26 8a 52 25 2c a7  |. ...>@...&.R%,.|
+00000290  78 c5 ed 73 5c 59 ca 02  a8 9e 0d 69 bd cc bb 4b  |x..s\Y.....i...K|
+000002a0  11 3d 04 03 00 8b 30 81  88 02 42 00 ed 4d bc dc  |.=....0...B..M..|
+000002b0  d7 5e 95 b4 13 b3 fb 40  38 1a 53 09 71 a4 14 2a  |.^.....@8.S.q..*|
+000002c0  45 6f e3 fe db 0a c8 32  05 e6 98 17 bb f8 e9 72  |Eo.....2.......r|
+000002d0  db 5d e8 f5 b2 ad df 1b  62 dd b2 98 f8 6b 38 13  |.]......b....k8.|
+000002e0  a9 2f 13 1b ea db 58 24  4b e2 3a b9 5a 02 42 00  |./....X$K.:.Z.B.|
+000002f0  ea cd 03 cb b9 67 5c f3  99 35 cc 57 2a 58 12 45  |.....g\..5.W*X.E|
+00000300  c9 f1 e4 27 1a 42 2c ce  9c ba 10 f8 6f 15 41 67  |...'.B,.....o.Ag|
+00000310  07 33 38 94 dd 34 57 90  41 cf 16 04 b7 fc af ae  |.38..4W.A.......|
+00000320  6b ac 16 87 75 6d 60 52  e7 b9 1e 85 a3 45 92 a4  |k...um`R.....E..|
+00000330  cf 16 03 03 00 04 0e 00  00 00                    |..........|
 >>> Flow 3 (client to server)
 00000000  16 03 03 00 25 10 00 00  21 20 2f e5 7d a3 47 cd  |....%...! /.}.G.|
 00000010  62 43 15 28 da ac 5f bb  29 07 30 ff f6 84 af c4  |bC.(.._.).0.....|
 00000020  cf c2 ed 90 99 5f 58 cb  3b 74 14 03 03 00 01 01  |....._X.;t......|
-00000030  16 03 03 00 20 7f ab 78  f0 a6 b6 57 bd c3 b9 32  |.... ..x...W...2|
-00000040  96 3f 7c 9d a0 4d dc 74  c9 e8 1a 88 c4 b2 10 27  |.?|..M.t.......'|
-00000050  e3 9c 1e 9b e1                                    |.....|
+00000030  16 03 03 00 20 24 01 e0  f7 26 b8 69 62 f7 98 45  |.... $...&.ib..E|
+00000040  6f 6d fc eb 37 c9 69 f1  21 eb 13 70 57 a9 5b de  |om..7.i.!..pW.[.|
+00000050  37 30 64 cc c1                                    |70d..|
 >>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 20 0c b7 0c 47 8e  |.......... ...G.|
-00000010  40 6b 9f 9c d2 cd 24 25  db 12 e8 0c 50 be f3 98  |@k....$%....P...|
-00000020  4a 6f f9 42 58 07 b9 64  d0 00 91                 |Jo.BX..d...|
+00000000  14 03 03 00 01 01 16 03  03 00 20 8d fd f9 fd 18  |.......... .....|
+00000010  08 fa c1 5b 1c d1 03 bc  ba 36 6b 69 30 72 9c 92  |...[.....6ki0r..|
+00000020  f9 56 0c 5e ed 7b 91 e8  42 6c 26                 |.V.^.{..Bl&|
 >>> Flow 5 (client to server)
-00000000  17 03 03 00 16 1d 32 1c  ef 0b 1f a4 ba 39 a3 63  |......2......9.c|
-00000010  04 29 e5 67 1e bb 5a 6e  c7 3c c1 15 03 03 00 12  |.).g..Zn.<......|
-00000020  0e 0b 0f 49 30 fe d4 c3  35 85 e3 db 6e 65 e3 2d  |...I0...5...ne.-|
-00000030  d1 1d                                             |..|
+00000000  17 03 03 00 16 94 1f 97  8b 5b 66 15 63 a5 1e 78  |.........[f.c..x|
+00000010  c2 e3 4e 96 ae 08 16 d6  33 b8 60 15 03 03 00 12  |..N.....3.`.....|
+00000020  f9 71 c8 e5 93 b4 0d 17  97 0f 6d cb 58 0f 59 64  |.q........m.X.Yd|
+00000030  12 0f                                             |..|
diff --git a/src/crypto/tls/testdata/Client-TLSv12-ECDHE-RSA-AES b/src/crypto/tls/testdata/Client-TLSv12-ECDHE-RSA-AES
index ea6c787..d5665da 100644
--- a/src/crypto/tls/testdata/Client-TLSv12-ECDHE-RSA-AES
+++ b/src/crypto/tls/testdata/Client-TLSv12-ECDHE-RSA-AES
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fe 01 00 00  fa 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 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,91 +7,92 @@
 00000050  cc a8 c0 2b c0 2f c0 2c  c0 30 c0 09 c0 13 c0 0a  |...+./.,.0......|
 00000060  c0 14 00 9c 00 9d 00 2f  00 35 c0 12 00 0a c0 23  |......./.5.....#|
 00000070  c0 27 00 3c c0 07 c0 11  00 05 13 03 13 01 13 02  |.'.<............|
-00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
+00000080  01 00 00 7f 00 05 00 05  01 00 00 00 00 00 0a 00  |................|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
 000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
 000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
-000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
-000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
-000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
-000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
+000000c0  01 00 01 00 00 17 00 00  00 12 00 00 00 2b 00 09  |.............+..|
+000000d0  08 03 04 03 03 03 02 03  01 00 33 00 26 00 24 00  |..........3.&.$.|
+000000e0  1d 00 20 2f e5 7d a3 47  cd 62 43 15 28 da ac 5f  |.. /.}.G.bC.(.._|
+000000f0  bb 29 07 30 ff f6 84 af  c4 cf c2 ed 90 99 5f 58  |.).0.........._X|
+00000100  cb 3b 74                                          |.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 59 02 00 00  55 03 03 1e 2f 6f fa 02  |....Y...U.../o..|
-00000010  44 3e 0d d0 3e b5 e6 0c  a2 d6 aa 04 5b ba 93 39  |D>..>.......[..9|
-00000020  29 dd e7 7e b8 11 f9 85  97 a5 e4 20 9c 64 e9 47  |)..~....... .d.G|
-00000030  cb 7c 0c 77 9d 83 5a c4  e8 05 62 40 95 8e 8e aa  |.|.w..Z...b@....|
-00000040  39 bb 24 8f b7 29 75 77  18 66 60 29 c0 13 00 00  |9.$..)uw.f`)....|
-00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
-00000060  03 02 59 0b 00 02 55 00  02 52 00 02 4f 30 82 02  |..Y...U..R..O0..|
-00000070  4b 30 82 01 b4 a0 03 02  01 02 02 09 00 e8 f0 9d  |K0..............|
-00000080  3f e2 5b ea a6 30 0d 06  09 2a 86 48 86 f7 0d 01  |?.[..0...*.H....|
-00000090  01 0b 05 00 30 1f 31 0b  30 09 06 03 55 04 0a 13  |....0.1.0...U...|
-000000a0  02 47 6f 31 10 30 0e 06  03 55 04 03 13 07 47 6f  |.Go1.0...U....Go|
-000000b0  20 52 6f 6f 74 30 1e 17  0d 31 36 30 31 30 31 30  | Root0...1601010|
-000000c0  30 30 30 30 30 5a 17 0d  32 35 30 31 30 31 30 30  |00000Z..25010100|
-000000d0  30 30 30 30 5a 30 1a 31  0b 30 09 06 03 55 04 0a  |0000Z0.1.0...U..|
-000000e0  13 02 47 6f 31 0b 30 09  06 03 55 04 03 13 02 47  |..Go1.0...U....G|
-000000f0  6f 30 81 9f 30 0d 06 09  2a 86 48 86 f7 0d 01 01  |o0..0...*.H.....|
-00000100  01 05 00 03 81 8d 00 30  81 89 02 81 81 00 db 46  |.......0.......F|
-00000110  7d 93 2e 12 27 06 48 bc  06 28 21 ab 7e c4 b6 a2  |}...'.H..(!.~...|
-00000120  5d fe 1e 52 45 88 7a 36  47 a5 08 0d 92 42 5b c2  |]..RE.z6G....B[.|
-00000130  81 c0 be 97 79 98 40 fb  4f 6d 14 fd 2b 13 8b c2  |....y.@.Om..+...|
-00000140  a5 2e 67 d8 d4 09 9e d6  22 38 b7 4a 0b 74 73 2b  |..g....."8.J.ts+|
-00000150  c2 34 f1 d1 93 e5 96 d9  74 7b f3 58 9f 6c 61 3c  |.4......t{.X.la<|
-00000160  c0 b0 41 d4 d9 2b 2b 24  23 77 5b 1c 3b bd 75 5d  |..A..++$#w[.;.u]|
-00000170  ce 20 54 cf a1 63 87 1d  1e 24 c4 f3 1d 1a 50 8b  |. T..c...$....P.|
-00000180  aa b6 14 43 ed 97 a7 75  62 f4 14 c8 52 d7 02 03  |...C...ub...R...|
-00000190  01 00 01 a3 81 93 30 81  90 30 0e 06 03 55 1d 0f  |......0..0...U..|
-000001a0  01 01 ff 04 04 03 02 05  a0 30 1d 06 03 55 1d 25  |.........0...U.%|
-000001b0  04 16 30 14 06 08 2b 06  01 05 05 07 03 01 06 08  |..0...+.........|
-000001c0  2b 06 01 05 05 07 03 02  30 0c 06 03 55 1d 13 01  |+.......0...U...|
-000001d0  01 ff 04 02 30 00 30 19  06 03 55 1d 0e 04 12 04  |....0.0...U.....|
-000001e0  10 9f 91 16 1f 43 43 3e  49 a6 de 6d b6 80 d7 9f  |.....CC>I..m....|
-000001f0  60 30 1b 06 03 55 1d 23  04 14 30 12 80 10 48 13  |`0...U.#..0...H.|
-00000200  49 4d 13 7e 16 31 bb a3  01 d5 ac ab 6e 7b 30 19  |IM.~.1......n{0.|
-00000210  06 03 55 1d 11 04 12 30  10 82 0e 65 78 61 6d 70  |..U....0...examp|
-00000220  6c 65 2e 67 6f 6c 61 6e  67 30 0d 06 09 2a 86 48  |le.golang0...*.H|
-00000230  86 f7 0d 01 01 0b 05 00  03 81 81 00 9d 30 cc 40  |.............0.@|
-00000240  2b 5b 50 a0 61 cb ba e5  53 58 e1 ed 83 28 a9 58  |+[P.a...SX...(.X|
-00000250  1a a9 38 a4 95 a1 ac 31  5a 1a 84 66 3d 43 d3 2d  |..8....1Z..f=C.-|
-00000260  d9 0b f2 97 df d3 20 64  38 92 24 3a 00 bc cf 9c  |...... d8.$:....|
-00000270  7d b7 40 20 01 5f aa d3  16 61 09 a2 76 fd 13 c3  |}.@ ._...a..v...|
-00000280  cc e1 0c 5c ee b1 87 82  f1 6c 04 ed 73 bb b3 43  |...\.....l..s..C|
-00000290  77 8d 0c 1c f1 0f a1 d8  40 83 61 c9 4c 72 2b 9d  |w.......@.a.Lr+.|
-000002a0  ae db 46 06 06 4d f4 c1  b3 3e c0 d1 bd 42 d4 db  |..F..M...>...B..|
-000002b0  fe 3d 13 60 84 5c 21 d3  3b e9 fa e7 16 03 03 00  |.=.`.\!.;.......|
-000002c0  ac 0c 00 00 a8 03 00 1d  20 92 ed 81 60 d9 51 c2  |........ ...`.Q.|
-000002d0  00 3d 99 84 82 c5 83 67  60 b3 11 59 0c c5 5d ff  |.=.....g`..Y..].|
-000002e0  d6 28 79 68 2d 73 7f 84  40 08 04 00 80 b6 a0 4b  |.(yh-s..@......K|
-000002f0  3d fb e1 e6 76 cc ae e3  59 d0 1c 50 5c 09 5d 80  |=...v...Y..P\.].|
-00000300  c2 58 0d 36 d7 1a 78 e3  c2 66 73 3a 14 06 37 6f  |.X.6..x..fs:..7o|
-00000310  3a 95 2e 2a eb cc e5 e3  f7 30 eb 0d 33 04 51 6e  |:..*.....0..3.Qn|
-00000320  06 86 8f 53 6d fd 97 75  b3 13 2e 4e ee 8f 03 68  |...Sm..u...N...h|
-00000330  23 32 83 96 af 01 ed b0  21 a7 13 06 47 f4 08 b9  |#2......!...G...|
-00000340  8a 47 cc 12 99 20 c6 31  77 28 2c 2e d6 a0 20 8c  |.G... .1w(,... .|
-00000350  e6 67 c7 70 23 ed 98 9c  c9 47 1c e0 37 95 42 aa  |.g.p#....G..7.B.|
-00000360  c2 19 1b 55 09 5c 58 fb  ef 67 a9 b5 65 16 03 03  |...U.\X..g..e...|
-00000370  00 04 0e 00 00 00                                 |......|
+00000000  16 03 03 00 5d 02 00 00  59 03 03 1e 8b e8 b6 ab  |....]...Y.......|
+00000010  28 56 58 92 6d 03 e6 46  aa 94 dc 6d a0 7b 6f db  |(VX.m..F...m.{o.|
+00000020  09 22 9f 48 14 de 37 bf  54 68 42 20 f8 0f 31 09  |.".H..7.ThB ..1.|
+00000030  56 de 8f ad db d7 ab 38  66 8b cf 86 1c 84 0d 9c  |V......8f.......|
+00000040  ad 24 c8 35 a8 28 8d 06  10 23 5e 34 c0 13 00 00  |.$.5.(...#^4....|
+00000050  11 ff 01 00 01 00 00 0b  00 04 03 00 01 02 00 17  |................|
+00000060  00 00 16 03 03 02 59 0b  00 02 55 00 02 52 00 02  |......Y...U..R..|
+00000070  4f 30 82 02 4b 30 82 01  b4 a0 03 02 01 02 02 09  |O0..K0..........|
+00000080  00 e8 f0 9d 3f e2 5b ea  a6 30 0d 06 09 2a 86 48  |....?.[..0...*.H|
+00000090  86 f7 0d 01 01 0b 05 00  30 1f 31 0b 30 09 06 03  |........0.1.0...|
+000000a0  55 04 0a 13 02 47 6f 31  10 30 0e 06 03 55 04 03  |U....Go1.0...U..|
+000000b0  13 07 47 6f 20 52 6f 6f  74 30 1e 17 0d 31 36 30  |..Go Root0...160|
+000000c0  31 30 31 30 30 30 30 30  30 5a 17 0d 32 35 30 31  |101000000Z..2501|
+000000d0  30 31 30 30 30 30 30 30  5a 30 1a 31 0b 30 09 06  |01000000Z0.1.0..|
+000000e0  03 55 04 0a 13 02 47 6f  31 0b 30 09 06 03 55 04  |.U....Go1.0...U.|
+000000f0  03 13 02 47 6f 30 81 9f  30 0d 06 09 2a 86 48 86  |...Go0..0...*.H.|
+00000100  f7 0d 01 01 01 05 00 03  81 8d 00 30 81 89 02 81  |...........0....|
+00000110  81 00 db 46 7d 93 2e 12  27 06 48 bc 06 28 21 ab  |...F}...'.H..(!.|
+00000120  7e c4 b6 a2 5d fe 1e 52  45 88 7a 36 47 a5 08 0d  |~...]..RE.z6G...|
+00000130  92 42 5b c2 81 c0 be 97  79 98 40 fb 4f 6d 14 fd  |.B[.....y.@.Om..|
+00000140  2b 13 8b c2 a5 2e 67 d8  d4 09 9e d6 22 38 b7 4a  |+.....g....."8.J|
+00000150  0b 74 73 2b c2 34 f1 d1  93 e5 96 d9 74 7b f3 58  |.ts+.4......t{.X|
+00000160  9f 6c 61 3c c0 b0 41 d4  d9 2b 2b 24 23 77 5b 1c  |.la<..A..++$#w[.|
+00000170  3b bd 75 5d ce 20 54 cf  a1 63 87 1d 1e 24 c4 f3  |;.u]. T..c...$..|
+00000180  1d 1a 50 8b aa b6 14 43  ed 97 a7 75 62 f4 14 c8  |..P....C...ub...|
+00000190  52 d7 02 03 01 00 01 a3  81 93 30 81 90 30 0e 06  |R.........0..0..|
+000001a0  03 55 1d 0f 01 01 ff 04  04 03 02 05 a0 30 1d 06  |.U...........0..|
+000001b0  03 55 1d 25 04 16 30 14  06 08 2b 06 01 05 05 07  |.U.%..0...+.....|
+000001c0  03 01 06 08 2b 06 01 05  05 07 03 02 30 0c 06 03  |....+.......0...|
+000001d0  55 1d 13 01 01 ff 04 02  30 00 30 19 06 03 55 1d  |U.......0.0...U.|
+000001e0  0e 04 12 04 10 9f 91 16  1f 43 43 3e 49 a6 de 6d  |.........CC>I..m|
+000001f0  b6 80 d7 9f 60 30 1b 06  03 55 1d 23 04 14 30 12  |....`0...U.#..0.|
+00000200  80 10 48 13 49 4d 13 7e  16 31 bb a3 01 d5 ac ab  |..H.IM.~.1......|
+00000210  6e 7b 30 19 06 03 55 1d  11 04 12 30 10 82 0e 65  |n{0...U....0...e|
+00000220  78 61 6d 70 6c 65 2e 67  6f 6c 61 6e 67 30 0d 06  |xample.golang0..|
+00000230  09 2a 86 48 86 f7 0d 01  01 0b 05 00 03 81 81 00  |.*.H............|
+00000240  9d 30 cc 40 2b 5b 50 a0  61 cb ba e5 53 58 e1 ed  |.0.@+[P.a...SX..|
+00000250  83 28 a9 58 1a a9 38 a4  95 a1 ac 31 5a 1a 84 66  |.(.X..8....1Z..f|
+00000260  3d 43 d3 2d d9 0b f2 97  df d3 20 64 38 92 24 3a  |=C.-...... d8.$:|
+00000270  00 bc cf 9c 7d b7 40 20  01 5f aa d3 16 61 09 a2  |....}.@ ._...a..|
+00000280  76 fd 13 c3 cc e1 0c 5c  ee b1 87 82 f1 6c 04 ed  |v......\.....l..|
+00000290  73 bb b3 43 77 8d 0c 1c  f1 0f a1 d8 40 83 61 c9  |s..Cw.......@.a.|
+000002a0  4c 72 2b 9d ae db 46 06  06 4d f4 c1 b3 3e c0 d1  |Lr+...F..M...>..|
+000002b0  bd 42 d4 db fe 3d 13 60  84 5c 21 d3 3b e9 fa e7  |.B...=.`.\!.;...|
+000002c0  16 03 03 00 ac 0c 00 00  a8 03 00 1d 20 e6 56 06  |............ .V.|
+000002d0  58 6f 5d 7a 59 32 f5 3e  7b 07 17 de 27 62 9e e8  |Xo]zY2.>{...'b..|
+000002e0  d0 42 f1 97 56 66 d0 d5  c1 06 b9 48 2f 08 04 00  |.B..Vf.....H/...|
+000002f0  80 1d 63 88 8e ed 58 f2  0e d3 b3 17 46 f3 9c 49  |..c...X.....F..I|
+00000300  bb 22 22 eb e2 77 13 6c  a5 aa 77 fe ad 16 06 23  |.""..w.l..w....#|
+00000310  c3 2a ec b9 76 43 4a 7f  41 72 5f 53 ae de 70 3a  |.*..vCJ.Ar_S..p:|
+00000320  f2 e9 60 92 30 2e f3 df  a1 3d 4a c1 1f 26 fa 42  |..`.0....=J..&.B|
+00000330  c8 31 cb 97 c0 5c 6b 8e  d9 18 28 be 99 7c d1 75  |.1...\k...(..|.u|
+00000340  05 ad 22 91 4f 55 ae 50  2c fa 37 ee 28 e9 64 1c  |..".OU.P,.7.(.d.|
+00000350  2b 2a c5 95 f5 90 ae ae  d4 a3 50 f3 fe 26 71 4f  |+*........P..&qO|
+00000360  55 db 32 03 1f 5c 3f 91  20 85 d5 e1 73 45 43 59  |U.2..\?. ...sECY|
+00000370  e5 16 03 03 00 04 0e 00  00 00                    |..........|
 >>> Flow 3 (client to server)
 00000000  16 03 03 00 25 10 00 00  21 20 2f e5 7d a3 47 cd  |....%...! /.}.G.|
 00000010  62 43 15 28 da ac 5f bb  29 07 30 ff f6 84 af c4  |bC.(.._.).0.....|
 00000020  cf c2 ed 90 99 5f 58 cb  3b 74 14 03 03 00 01 01  |....._X.;t......|
 00000030  16 03 03 00 40 00 00 00  00 00 00 00 00 00 00 00  |....@...........|
-00000040  00 00 00 00 00 dd 81 23  e0 a3 01 33 bb 87 0d 93  |.......#...3....|
-00000050  b2 61 16 01 e3 87 e0 05  cc b0 ec 15 56 df ff 9c  |.a..........V...|
-00000060  e6 9c 6a 57 79 8a 0b 86  f9 fb 60 3f ca 0d ef f2  |..jWy.....`?....|
-00000070  81 c0 5e 22 bf                                    |..^".|
+00000040  00 00 00 00 00 f9 b1 38  55 39 80 ba c1 07 e1 40  |.......8U9.....@|
+00000050  b9 ac 39 da bc 66 ad c3  6d dc 1b f0 bd 2a 92 ce  |..9..f..m....*..|
+00000060  4b b5 97 33 5b 3b 21 6d  91 f4 dd 09 07 73 5d a2  |K..3[;!m.....s].|
+00000070  b4 a3 a0 6d 43                                    |...mC|
 >>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 40 d4 d3 ba 7f 4c  |..........@....L|
-00000010  1a ee d9 ca 66 a0 5b d7  08 78 5d 5c fd 17 32 71  |....f.[..x]\..2q|
-00000020  7f 8c 2e eb 80 bc 82 0f  0c ed 71 ac 34 59 71 d1  |..........q.4Yq.|
-00000030  aa d3 fd 0c 50 7d 4b 1b  01 5d 4c 03 9f 6c 16 8f  |....P}K..]L..l..|
-00000040  5d f7 8d c0 4b 3f 01 96  23 40 22                 |]...K?..#@"|
+00000000  14 03 03 00 01 01 16 03  03 00 40 82 12 f1 e0 35  |..........@....5|
+00000010  74 0c e5 68 7c 6b b6 fb  e9 36 b3 5e 95 13 6b 04  |t..h|k...6.^..k.|
+00000020  00 59 18 f0 51 50 93 2e  e9 1b c6 e9 11 62 7c 01  |.Y..QP.......b|.|
+00000030  43 e8 68 7b 87 a9 d5 17  3f 73 de f2 06 12 9f c7  |C.h{....?s......|
+00000040  a4 81 45 52 dd 9f 6f fa  ab 82 86                 |..ER..o....|
 >>> 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 36 49 0e  f6 26 13 f7 69 15 54 27  |.....6I..&..i.T'|
-00000020  5a e6 f2 fb 7d ad e0 30  d3 cd ed 08 24 74 5f 77  |Z...}..0....$t_w|
-00000030  f7 8b 3f bf 94 15 03 03  00 30 00 00 00 00 00 00  |..?......0......|
-00000040  00 00 00 00 00 00 00 00  00 00 28 09 ed 2f d8 6f  |..........(../.o|
-00000050  95 fc db 9e ec d8 81 7e  a4 d4 8e c5 ec d3 24 bc  |.......~......$.|
-00000060  ab 52 e6 01 75 98 b9 e5  9f d9                    |.R..u.....|
+00000010  00 00 00 00 00 21 96 5b  74 b3 c1 96 e9 4f 6d 97  |.....!.[t....Om.|
+00000020  70 1c 5d c2 60 32 a1 98  12 2b 0d 4c 11 03 fe 17  |p.].`2...+.L....|
+00000030  28 92 06 2f 84 15 03 03  00 30 00 00 00 00 00 00  |(../.....0......|
+00000040  00 00 00 00 00 00 00 00  00 00 78 bf 75 9e 08 8d  |..........x.u...|
+00000050  57 5a 22 17 e9 d3 bd 3c  e4 ac e6 58 7a e8 5e 45  |WZ"....<...Xz.^E|
+00000060  63 10 b6 b8 df 78 c5 10  48 c0                    |c....x..H.|
diff --git a/src/crypto/tls/testdata/Client-TLSv12-ECDHE-RSA-AES128-SHA256 b/src/crypto/tls/testdata/Client-TLSv12-ECDHE-RSA-AES128-SHA256
index 88d0d01..03679a4 100644
--- a/src/crypto/tls/testdata/Client-TLSv12-ECDHE-RSA-AES128-SHA256
+++ b/src/crypto/tls/testdata/Client-TLSv12-ECDHE-RSA-AES128-SHA256
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fe 01 00 00  fa 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 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,95 +7,96 @@
 00000050  cc a8 c0 2b c0 2f c0 2c  c0 30 c0 09 c0 13 c0 0a  |...+./.,.0......|
 00000060  c0 14 00 9c 00 9d 00 2f  00 35 c0 12 00 0a c0 23  |......./.5.....#|
 00000070  c0 27 00 3c c0 07 c0 11  00 05 13 03 13 01 13 02  |.'.<............|
-00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
+00000080  01 00 00 7f 00 05 00 05  01 00 00 00 00 00 0a 00  |................|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
 000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
 000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
-000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
-000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
-000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
-000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
+000000c0  01 00 01 00 00 17 00 00  00 12 00 00 00 2b 00 09  |.............+..|
+000000d0  08 03 04 03 03 03 02 03  01 00 33 00 26 00 24 00  |..........3.&.$.|
+000000e0  1d 00 20 2f e5 7d a3 47  cd 62 43 15 28 da ac 5f  |.. /.}.G.bC.(.._|
+000000f0  bb 29 07 30 ff f6 84 af  c4 cf c2 ed 90 99 5f 58  |.).0.........._X|
+00000100  cb 3b 74                                          |.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 59 02 00 00  55 03 03 e6 04 5e a9 bb  |....Y...U....^..|
-00000010  23 56 bd cc e7 72 9f 10  b1 fc 23 48 22 19 cb 27  |#V...r....#H"..'|
-00000020  3e c4 22 ec b9 7a 9c 81  60 c5 55 20 b9 7f 8a 0e  |>."..z..`.U ....|
-00000030  6b d6 cf cb 35 85 52 f3  9f 28 00 87 22 88 6d 7c  |k...5.R..(..".m||
-00000040  35 0e f6 af 7c 28 b4 71  cc 46 c1 b5 c0 27 00 00  |5...|(.q.F...'..|
-00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
-00000060  03 02 59 0b 00 02 55 00  02 52 00 02 4f 30 82 02  |..Y...U..R..O0..|
-00000070  4b 30 82 01 b4 a0 03 02  01 02 02 09 00 e8 f0 9d  |K0..............|
-00000080  3f e2 5b ea a6 30 0d 06  09 2a 86 48 86 f7 0d 01  |?.[..0...*.H....|
-00000090  01 0b 05 00 30 1f 31 0b  30 09 06 03 55 04 0a 13  |....0.1.0...U...|
-000000a0  02 47 6f 31 10 30 0e 06  03 55 04 03 13 07 47 6f  |.Go1.0...U....Go|
-000000b0  20 52 6f 6f 74 30 1e 17  0d 31 36 30 31 30 31 30  | Root0...1601010|
-000000c0  30 30 30 30 30 5a 17 0d  32 35 30 31 30 31 30 30  |00000Z..25010100|
-000000d0  30 30 30 30 5a 30 1a 31  0b 30 09 06 03 55 04 0a  |0000Z0.1.0...U..|
-000000e0  13 02 47 6f 31 0b 30 09  06 03 55 04 03 13 02 47  |..Go1.0...U....G|
-000000f0  6f 30 81 9f 30 0d 06 09  2a 86 48 86 f7 0d 01 01  |o0..0...*.H.....|
-00000100  01 05 00 03 81 8d 00 30  81 89 02 81 81 00 db 46  |.......0.......F|
-00000110  7d 93 2e 12 27 06 48 bc  06 28 21 ab 7e c4 b6 a2  |}...'.H..(!.~...|
-00000120  5d fe 1e 52 45 88 7a 36  47 a5 08 0d 92 42 5b c2  |]..RE.z6G....B[.|
-00000130  81 c0 be 97 79 98 40 fb  4f 6d 14 fd 2b 13 8b c2  |....y.@.Om..+...|
-00000140  a5 2e 67 d8 d4 09 9e d6  22 38 b7 4a 0b 74 73 2b  |..g....."8.J.ts+|
-00000150  c2 34 f1 d1 93 e5 96 d9  74 7b f3 58 9f 6c 61 3c  |.4......t{.X.la<|
-00000160  c0 b0 41 d4 d9 2b 2b 24  23 77 5b 1c 3b bd 75 5d  |..A..++$#w[.;.u]|
-00000170  ce 20 54 cf a1 63 87 1d  1e 24 c4 f3 1d 1a 50 8b  |. T..c...$....P.|
-00000180  aa b6 14 43 ed 97 a7 75  62 f4 14 c8 52 d7 02 03  |...C...ub...R...|
-00000190  01 00 01 a3 81 93 30 81  90 30 0e 06 03 55 1d 0f  |......0..0...U..|
-000001a0  01 01 ff 04 04 03 02 05  a0 30 1d 06 03 55 1d 25  |.........0...U.%|
-000001b0  04 16 30 14 06 08 2b 06  01 05 05 07 03 01 06 08  |..0...+.........|
-000001c0  2b 06 01 05 05 07 03 02  30 0c 06 03 55 1d 13 01  |+.......0...U...|
-000001d0  01 ff 04 02 30 00 30 19  06 03 55 1d 0e 04 12 04  |....0.0...U.....|
-000001e0  10 9f 91 16 1f 43 43 3e  49 a6 de 6d b6 80 d7 9f  |.....CC>I..m....|
-000001f0  60 30 1b 06 03 55 1d 23  04 14 30 12 80 10 48 13  |`0...U.#..0...H.|
-00000200  49 4d 13 7e 16 31 bb a3  01 d5 ac ab 6e 7b 30 19  |IM.~.1......n{0.|
-00000210  06 03 55 1d 11 04 12 30  10 82 0e 65 78 61 6d 70  |..U....0...examp|
-00000220  6c 65 2e 67 6f 6c 61 6e  67 30 0d 06 09 2a 86 48  |le.golang0...*.H|
-00000230  86 f7 0d 01 01 0b 05 00  03 81 81 00 9d 30 cc 40  |.............0.@|
-00000240  2b 5b 50 a0 61 cb ba e5  53 58 e1 ed 83 28 a9 58  |+[P.a...SX...(.X|
-00000250  1a a9 38 a4 95 a1 ac 31  5a 1a 84 66 3d 43 d3 2d  |..8....1Z..f=C.-|
-00000260  d9 0b f2 97 df d3 20 64  38 92 24 3a 00 bc cf 9c  |...... d8.$:....|
-00000270  7d b7 40 20 01 5f aa d3  16 61 09 a2 76 fd 13 c3  |}.@ ._...a..v...|
-00000280  cc e1 0c 5c ee b1 87 82  f1 6c 04 ed 73 bb b3 43  |...\.....l..s..C|
-00000290  77 8d 0c 1c f1 0f a1 d8  40 83 61 c9 4c 72 2b 9d  |w.......@.a.Lr+.|
-000002a0  ae db 46 06 06 4d f4 c1  b3 3e c0 d1 bd 42 d4 db  |..F..M...>...B..|
-000002b0  fe 3d 13 60 84 5c 21 d3  3b e9 fa e7 16 03 03 00  |.=.`.\!.;.......|
-000002c0  ac 0c 00 00 a8 03 00 1d  20 55 af 53 a0 54 77 df  |........ U.S.Tw.|
-000002d0  ca 8f 49 1a 4d d0 9b 24  a6 a9 2b b2 2a 33 46 b8  |..I.M..$..+.*3F.|
-000002e0  01 d6 4e fd fb c1 e4 e6  64 08 04 00 80 5c da 2f  |..N.....d....\./|
-000002f0  01 2b 10 b9 e9 35 f2 b1  2a 28 4f 78 58 7b 3d 9a  |.+...5..*(OxX{=.|
-00000300  13 e4 7c 77 41 95 fa 7a  90 1f eb f5 20 55 7c 76  |..|wA..z.... U|v|
-00000310  dd c5 66 08 88 eb ba 17  f0 de f3 0c a5 a6 3c 21  |..f...........<!|
-00000320  52 89 25 b1 4d 86 e3 0b  8a 14 dc 8b a6 76 41 25  |R.%.M........vA%|
-00000330  9e d3 20 b6 61 8a 26 8b  0d b7 cb 98 ac 45 e0 3b  |.. .a.&......E.;|
-00000340  6f d6 b2 52 8b a2 31 63  c8 44 1d 2a 3a c1 35 87  |o..R..1c.D.*:.5.|
-00000350  7a 7b 2a fa dd ab d3 48  9b e2 fa e1 93 7c 09 f7  |z{*....H.....|..|
-00000360  e1 72 83 f8 23 07 30 3a  4a 4f 56 97 1b 16 03 03  |.r..#.0:JOV.....|
-00000370  00 04 0e 00 00 00                                 |......|
+00000000  16 03 03 00 5d 02 00 00  59 03 03 3d 4c 61 a3 1e  |....]...Y..=La..|
+00000010  dd 9a c3 52 42 9d ee 2b  7b f6 24 a4 38 d7 93 e9  |...RB..+{.$.8...|
+00000020  f5 f4 09 a2 0f 2b 45 ae  7d fd 97 20 3b b6 27 a6  |.....+E.}.. ;.'.|
+00000030  88 dd af 75 8d 27 1c c6  ef 8f 4b 33 c6 30 be 08  |...u.'....K3.0..|
+00000040  7d bd 8d cd 2e d8 37 0b  67 e3 39 30 c0 27 00 00  |}.....7.g.90.'..|
+00000050  11 ff 01 00 01 00 00 0b  00 04 03 00 01 02 00 17  |................|
+00000060  00 00 16 03 03 02 59 0b  00 02 55 00 02 52 00 02  |......Y...U..R..|
+00000070  4f 30 82 02 4b 30 82 01  b4 a0 03 02 01 02 02 09  |O0..K0..........|
+00000080  00 e8 f0 9d 3f e2 5b ea  a6 30 0d 06 09 2a 86 48  |....?.[..0...*.H|
+00000090  86 f7 0d 01 01 0b 05 00  30 1f 31 0b 30 09 06 03  |........0.1.0...|
+000000a0  55 04 0a 13 02 47 6f 31  10 30 0e 06 03 55 04 03  |U....Go1.0...U..|
+000000b0  13 07 47 6f 20 52 6f 6f  74 30 1e 17 0d 31 36 30  |..Go Root0...160|
+000000c0  31 30 31 30 30 30 30 30  30 5a 17 0d 32 35 30 31  |101000000Z..2501|
+000000d0  30 31 30 30 30 30 30 30  5a 30 1a 31 0b 30 09 06  |01000000Z0.1.0..|
+000000e0  03 55 04 0a 13 02 47 6f  31 0b 30 09 06 03 55 04  |.U....Go1.0...U.|
+000000f0  03 13 02 47 6f 30 81 9f  30 0d 06 09 2a 86 48 86  |...Go0..0...*.H.|
+00000100  f7 0d 01 01 01 05 00 03  81 8d 00 30 81 89 02 81  |...........0....|
+00000110  81 00 db 46 7d 93 2e 12  27 06 48 bc 06 28 21 ab  |...F}...'.H..(!.|
+00000120  7e c4 b6 a2 5d fe 1e 52  45 88 7a 36 47 a5 08 0d  |~...]..RE.z6G...|
+00000130  92 42 5b c2 81 c0 be 97  79 98 40 fb 4f 6d 14 fd  |.B[.....y.@.Om..|
+00000140  2b 13 8b c2 a5 2e 67 d8  d4 09 9e d6 22 38 b7 4a  |+.....g....."8.J|
+00000150  0b 74 73 2b c2 34 f1 d1  93 e5 96 d9 74 7b f3 58  |.ts+.4......t{.X|
+00000160  9f 6c 61 3c c0 b0 41 d4  d9 2b 2b 24 23 77 5b 1c  |.la<..A..++$#w[.|
+00000170  3b bd 75 5d ce 20 54 cf  a1 63 87 1d 1e 24 c4 f3  |;.u]. T..c...$..|
+00000180  1d 1a 50 8b aa b6 14 43  ed 97 a7 75 62 f4 14 c8  |..P....C...ub...|
+00000190  52 d7 02 03 01 00 01 a3  81 93 30 81 90 30 0e 06  |R.........0..0..|
+000001a0  03 55 1d 0f 01 01 ff 04  04 03 02 05 a0 30 1d 06  |.U...........0..|
+000001b0  03 55 1d 25 04 16 30 14  06 08 2b 06 01 05 05 07  |.U.%..0...+.....|
+000001c0  03 01 06 08 2b 06 01 05  05 07 03 02 30 0c 06 03  |....+.......0...|
+000001d0  55 1d 13 01 01 ff 04 02  30 00 30 19 06 03 55 1d  |U.......0.0...U.|
+000001e0  0e 04 12 04 10 9f 91 16  1f 43 43 3e 49 a6 de 6d  |.........CC>I..m|
+000001f0  b6 80 d7 9f 60 30 1b 06  03 55 1d 23 04 14 30 12  |....`0...U.#..0.|
+00000200  80 10 48 13 49 4d 13 7e  16 31 bb a3 01 d5 ac ab  |..H.IM.~.1......|
+00000210  6e 7b 30 19 06 03 55 1d  11 04 12 30 10 82 0e 65  |n{0...U....0...e|
+00000220  78 61 6d 70 6c 65 2e 67  6f 6c 61 6e 67 30 0d 06  |xample.golang0..|
+00000230  09 2a 86 48 86 f7 0d 01  01 0b 05 00 03 81 81 00  |.*.H............|
+00000240  9d 30 cc 40 2b 5b 50 a0  61 cb ba e5 53 58 e1 ed  |.0.@+[P.a...SX..|
+00000250  83 28 a9 58 1a a9 38 a4  95 a1 ac 31 5a 1a 84 66  |.(.X..8....1Z..f|
+00000260  3d 43 d3 2d d9 0b f2 97  df d3 20 64 38 92 24 3a  |=C.-...... d8.$:|
+00000270  00 bc cf 9c 7d b7 40 20  01 5f aa d3 16 61 09 a2  |....}.@ ._...a..|
+00000280  76 fd 13 c3 cc e1 0c 5c  ee b1 87 82 f1 6c 04 ed  |v......\.....l..|
+00000290  73 bb b3 43 77 8d 0c 1c  f1 0f a1 d8 40 83 61 c9  |s..Cw.......@.a.|
+000002a0  4c 72 2b 9d ae db 46 06  06 4d f4 c1 b3 3e c0 d1  |Lr+...F..M...>..|
+000002b0  bd 42 d4 db fe 3d 13 60  84 5c 21 d3 3b e9 fa e7  |.B...=.`.\!.;...|
+000002c0  16 03 03 00 ac 0c 00 00  a8 03 00 1d 20 a4 26 51  |............ .&Q|
+000002d0  47 58 cf 92 87 27 f0 c1  c0 39 55 dd 20 16 39 de  |GX...'...9U. .9.|
+000002e0  ed 79 66 3a 97 54 75 35  27 20 7b 99 76 08 04 00  |.yf:.Tu5' {.v...|
+000002f0  80 34 32 55 55 c1 56 69  b8 4a f7 a6 d1 9d ae f6  |.42UU.Vi.J......|
+00000300  0d de 13 e2 bd b8 9a 5c  42 f2 b5 42 d9 25 69 fe  |.......\B..B.%i.|
+00000310  ef b3 c3 0f 1b b7 a0 61  1d 1d 59 31 1c 4c 61 17  |.......a..Y1.La.|
+00000320  6e 2d bc b4 08 76 ee d2  46 d4 81 c1 cc e9 96 22  |n-...v..F......"|
+00000330  10 07 a5 c0 c6 26 42 c6  37 42 56 e5 47 f2 44 d1  |.....&B.7BV.G.D.|
+00000340  57 1d c8 8d c1 2c 28 be  e9 7a 82 2e f1 8e 1a bf  |W....,(..z......|
+00000350  4a f0 f2 22 de 78 00 c2  d3 f4 99 ba e9 d3 7e fc  |J..".x........~.|
+00000360  83 bf ef 7c 64 c6 c4 dd  fb 30 e2 f9 43 43 91 60  |...|d....0..CC.`|
+00000370  83 16 03 03 00 04 0e 00  00 00                    |..........|
 >>> Flow 3 (client to server)
 00000000  16 03 03 00 25 10 00 00  21 20 2f e5 7d a3 47 cd  |....%...! /.}.G.|
 00000010  62 43 15 28 da ac 5f bb  29 07 30 ff f6 84 af c4  |bC.(.._.).0.....|
 00000020  cf c2 ed 90 99 5f 58 cb  3b 74 14 03 03 00 01 01  |....._X.;t......|
 00000030  16 03 03 00 50 00 00 00  00 00 00 00 00 00 00 00  |....P...........|
-00000040  00 00 00 00 00 91 c1 82  23 f0 03 79 83 38 ef d0  |........#..y.8..|
-00000050  73 71 9b 7d 55 5e 53 3b  d3 cf 86 48 60 2f 42 97  |sq.}U^S;...H`/B.|
-00000060  63 e8 4b 20 4c 92 3e 2f  aa b3 32 46 8a 96 69 42  |c.K L.>/..2F..iB|
-00000070  96 9a 4b bd 04 f2 3d b6  5f f9 37 4f a4 3d f1 cb  |..K...=._.7O.=..|
-00000080  d5 57 fc 5e 8e                                    |.W.^.|
+00000040  00 00 00 00 00 06 06 f1  9b b7 1f f1 0d 24 fe 76  |.............$.v|
+00000050  8a 72 84 58 8c 56 bd c3  73 4e c8 99 3c 5b 21 79  |.r.X.V..sN..<[!y|
+00000060  17 23 21 bd 72 0d fb f7  22 36 99 78 1f 88 d1 87  |.#!.r..."6.x....|
+00000070  73 c3 62 aa a5 22 a6 63  68 41 bb 61 34 50 b9 e7  |s.b..".chA.a4P..|
+00000080  ce 6d 0b 18 f0                                    |.m...|
 >>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 50 e1 91 69 dc 7b  |..........P..i.{|
-00000010  5f a4 c7 7a 8f ba bb 8d  98 c3 0e 3f 10 f1 3e 3f  |_..z.......?..>?|
-00000020  37 6f 11 81 3f c5 7c 22  6f 22 a3 94 ae 3a 77 17  |7o..?.|"o"...:w.|
-00000030  a2 7b cc 8e 5e 6e 9b 4b  98 fd 16 f8 46 9e 78 19  |.{..^n.K....F.x.|
-00000040  43 e6 da e3 05 9a 0a 49  b0 09 c7 e5 4b 41 dc b4  |C......I....KA..|
-00000050  c0 81 9b 46 7e dd c3 64  2e f8 6e                 |...F~..d..n|
+00000000  14 03 03 00 01 01 16 03  03 00 50 f4 00 f2 81 78  |..........P....x|
+00000010  0f 4b d9 3a 2d 62 34 77  74 6e b6 d5 e8 62 55 88  |.K.:-b4wtn...bU.|
+00000020  7e 60 e4 e7 b7 35 9d dc  50 02 d2 10 ae 36 7a 5d  |~`...5..P....6z]|
+00000030  36 c5 89 2c 4e db 9c 83  9e d0 ec de 6e 63 1c 94  |6..,N.......nc..|
+00000040  4c ed 12 ca ef 62 a1 26  a7 f9 fd 52 ad b9 1a 2b  |L....b.&...R...+|
+00000050  cc bc 01 bb cc 86 b5 1b  74 60 80                 |........t`.|
 >>> Flow 5 (client to server)
 00000000  17 03 03 00 40 00 00 00  00 00 00 00 00 00 00 00  |....@...........|
-00000010  00 00 00 00 00 65 4c 71  31 d4 47 4d 0b 81 1f 75  |.....eLq1.GM...u|
-00000020  b6 71 64 4a e6 a8 80 a1  f1 e2 0a 14 77 af a4 c6  |.qdJ........w...|
-00000030  1d 6a 7d 79 6a 15 a1 0e  86 6c 8e e1 32 64 0b 5d  |.j}yj....l..2d.]|
-00000040  af e0 f5 05 91 15 03 03  00 40 00 00 00 00 00 00  |.........@......|
-00000050  00 00 00 00 00 00 00 00  00 00 ca 46 1b 95 2a 41  |...........F..*A|
-00000060  ce dc 30 d6 e0 cf 2f 2b  1f 61 81 33 a4 58 e7 af  |..0.../+.a.3.X..|
-00000070  90 9c 15 42 9b ab 26 64  d1 39 46 45 6b 74 b9 c4  |...B..&d.9FEkt..|
-00000080  21 d9 ef 2d 69 51 dc e7  8a 6b                    |!..-iQ...k|
+00000010  00 00 00 00 00 67 6b 64  7b 02 ce ad 5c df 4d 26  |.....gkd{...\.M&|
+00000020  f9 ef d5 94 ec 34 28 de  52 1a d9 1b e3 af 89 11  |.....4(.R.......|
+00000030  7b aa f6 46 8a 27 e7 15  c0 81 89 78 20 09 ca 37  |{..F.'.....x ..7|
+00000040  dc a3 c2 5c 4f 15 03 03  00 40 00 00 00 00 00 00  |...\O....@......|
+00000050  00 00 00 00 00 00 00 00  00 00 61 45 e8 a0 f8 70  |..........aE...p|
+00000060  7b a3 75 09 42 b2 41 54  79 b3 75 48 47 f1 36 1b  |{.u.B.ATy.uHG.6.|
+00000070  4c cd 29 57 fe 9f 41 a7  7f 5c a9 12 7a ec c6 1d  |L.)W..A..\..z...|
+00000080  9c fb ff 1e e5 58 04 ae  16 50                    |.....X...P|
diff --git a/src/crypto/tls/testdata/Client-TLSv12-ECDHE-RSA-CHACHA20-POLY1305 b/src/crypto/tls/testdata/Client-TLSv12-ECDHE-RSA-CHACHA20-POLY1305
index 2c2cb45..3c5779c 100644
--- a/src/crypto/tls/testdata/Client-TLSv12-ECDHE-RSA-CHACHA20-POLY1305
+++ b/src/crypto/tls/testdata/Client-TLSv12-ECDHE-RSA-CHACHA20-POLY1305
@@ -1,88 +1,88 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 d0 01 00 00  cc 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 d4 01 00 00  d0 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 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000040  00 00 00 00 00 00 00 00  00 00 00 00 00 08 cc a8  |................|
-00000050  13 03 13 01 13 02 01 00  00 7b 00 05 00 05 01 00  |.........{......|
+00000050  13 03 13 01 13 02 01 00  00 7f 00 05 00 05 01 00  |................|
 00000060  00 00 00 00 0a 00 0a 00  08 00 1d 00 17 00 18 00  |................|
 00000070  19 00 0b 00 02 01 00 00  0d 00 1a 00 18 08 04 04  |................|
 00000080  03 08 07 08 05 08 06 04  01 05 01 06 01 05 03 06  |................|
-00000090  03 02 01 02 03 ff 01 00  01 00 00 12 00 00 00 2b  |...............+|
-000000a0  00 09 08 03 04 03 03 03  02 03 01 00 33 00 26 00  |............3.&.|
-000000b0  24 00 1d 00 20 2f e5 7d  a3 47 cd 62 43 15 28 da  |$... /.}.G.bC.(.|
-000000c0  ac 5f bb 29 07 30 ff f6  84 af c4 cf c2 ed 90 99  |._.).0..........|
-000000d0  5f 58 cb 3b 74                                    |_X.;t|
+00000090  03 02 01 02 03 ff 01 00  01 00 00 17 00 00 00 12  |................|
+000000a0  00 00 00 2b 00 09 08 03  04 03 03 03 02 03 01 00  |...+............|
+000000b0  33 00 26 00 24 00 1d 00  20 2f e5 7d a3 47 cd 62  |3.&.$... /.}.G.b|
+000000c0  43 15 28 da ac 5f bb 29  07 30 ff f6 84 af c4 cf  |C.(.._.).0......|
+000000d0  c2 ed 90 99 5f 58 cb 3b  74                       |...._X.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 59 02 00 00  55 03 03 2a 76 db 4b d5  |....Y...U..*v.K.|
-00000010  10 f3 21 f2 4b 29 a2 2e  7a 7d 0b 86 c4 af 60 95  |..!.K)..z}....`.|
-00000020  5b 11 84 27 8a 59 7f af  a0 27 de 20 02 f7 dc 9b  |[..'.Y...'. ....|
-00000030  63 8e 2e da 48 b5 73 81  8e 76 13 da dd 2e 17 2b  |c...H.s..v.....+|
-00000040  ff 18 ad d7 9d f3 44 ed  b6 60 0e 42 cc a8 00 00  |......D..`.B....|
-00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
-00000060  03 02 59 0b 00 02 55 00  02 52 00 02 4f 30 82 02  |..Y...U..R..O0..|
-00000070  4b 30 82 01 b4 a0 03 02  01 02 02 09 00 e8 f0 9d  |K0..............|
-00000080  3f e2 5b ea a6 30 0d 06  09 2a 86 48 86 f7 0d 01  |?.[..0...*.H....|
-00000090  01 0b 05 00 30 1f 31 0b  30 09 06 03 55 04 0a 13  |....0.1.0...U...|
-000000a0  02 47 6f 31 10 30 0e 06  03 55 04 03 13 07 47 6f  |.Go1.0...U....Go|
-000000b0  20 52 6f 6f 74 30 1e 17  0d 31 36 30 31 30 31 30  | Root0...1601010|
-000000c0  30 30 30 30 30 5a 17 0d  32 35 30 31 30 31 30 30  |00000Z..25010100|
-000000d0  30 30 30 30 5a 30 1a 31  0b 30 09 06 03 55 04 0a  |0000Z0.1.0...U..|
-000000e0  13 02 47 6f 31 0b 30 09  06 03 55 04 03 13 02 47  |..Go1.0...U....G|
-000000f0  6f 30 81 9f 30 0d 06 09  2a 86 48 86 f7 0d 01 01  |o0..0...*.H.....|
-00000100  01 05 00 03 81 8d 00 30  81 89 02 81 81 00 db 46  |.......0.......F|
-00000110  7d 93 2e 12 27 06 48 bc  06 28 21 ab 7e c4 b6 a2  |}...'.H..(!.~...|
-00000120  5d fe 1e 52 45 88 7a 36  47 a5 08 0d 92 42 5b c2  |]..RE.z6G....B[.|
-00000130  81 c0 be 97 79 98 40 fb  4f 6d 14 fd 2b 13 8b c2  |....y.@.Om..+...|
-00000140  a5 2e 67 d8 d4 09 9e d6  22 38 b7 4a 0b 74 73 2b  |..g....."8.J.ts+|
-00000150  c2 34 f1 d1 93 e5 96 d9  74 7b f3 58 9f 6c 61 3c  |.4......t{.X.la<|
-00000160  c0 b0 41 d4 d9 2b 2b 24  23 77 5b 1c 3b bd 75 5d  |..A..++$#w[.;.u]|
-00000170  ce 20 54 cf a1 63 87 1d  1e 24 c4 f3 1d 1a 50 8b  |. T..c...$....P.|
-00000180  aa b6 14 43 ed 97 a7 75  62 f4 14 c8 52 d7 02 03  |...C...ub...R...|
-00000190  01 00 01 a3 81 93 30 81  90 30 0e 06 03 55 1d 0f  |......0..0...U..|
-000001a0  01 01 ff 04 04 03 02 05  a0 30 1d 06 03 55 1d 25  |.........0...U.%|
-000001b0  04 16 30 14 06 08 2b 06  01 05 05 07 03 01 06 08  |..0...+.........|
-000001c0  2b 06 01 05 05 07 03 02  30 0c 06 03 55 1d 13 01  |+.......0...U...|
-000001d0  01 ff 04 02 30 00 30 19  06 03 55 1d 0e 04 12 04  |....0.0...U.....|
-000001e0  10 9f 91 16 1f 43 43 3e  49 a6 de 6d b6 80 d7 9f  |.....CC>I..m....|
-000001f0  60 30 1b 06 03 55 1d 23  04 14 30 12 80 10 48 13  |`0...U.#..0...H.|
-00000200  49 4d 13 7e 16 31 bb a3  01 d5 ac ab 6e 7b 30 19  |IM.~.1......n{0.|
-00000210  06 03 55 1d 11 04 12 30  10 82 0e 65 78 61 6d 70  |..U....0...examp|
-00000220  6c 65 2e 67 6f 6c 61 6e  67 30 0d 06 09 2a 86 48  |le.golang0...*.H|
-00000230  86 f7 0d 01 01 0b 05 00  03 81 81 00 9d 30 cc 40  |.............0.@|
-00000240  2b 5b 50 a0 61 cb ba e5  53 58 e1 ed 83 28 a9 58  |+[P.a...SX...(.X|
-00000250  1a a9 38 a4 95 a1 ac 31  5a 1a 84 66 3d 43 d3 2d  |..8....1Z..f=C.-|
-00000260  d9 0b f2 97 df d3 20 64  38 92 24 3a 00 bc cf 9c  |...... d8.$:....|
-00000270  7d b7 40 20 01 5f aa d3  16 61 09 a2 76 fd 13 c3  |}.@ ._...a..v...|
-00000280  cc e1 0c 5c ee b1 87 82  f1 6c 04 ed 73 bb b3 43  |...\.....l..s..C|
-00000290  77 8d 0c 1c f1 0f a1 d8  40 83 61 c9 4c 72 2b 9d  |w.......@.a.Lr+.|
-000002a0  ae db 46 06 06 4d f4 c1  b3 3e c0 d1 bd 42 d4 db  |..F..M...>...B..|
-000002b0  fe 3d 13 60 84 5c 21 d3  3b e9 fa e7 16 03 03 00  |.=.`.\!.;.......|
-000002c0  ac 0c 00 00 a8 03 00 1d  20 0d c3 c2 b5 73 da 39  |........ ....s.9|
-000002d0  82 e5 8c 18 0d 8d 16 c2  a5 e7 3e 39 fd 25 00 18  |..........>9.%..|
-000002e0  25 16 c0 a7 6e c6 dd bb  01 08 04 00 80 b3 bd 01  |%...n...........|
-000002f0  ae dd b1 c8 2a 5d 0e 66  6d 1e b3 92 f4 01 63 59  |....*].fm.....cY|
-00000300  0c c1 62 df 75 8f 4f 19  5a cf 2f 63 79 d0 06 31  |..b.u.O.Z./cy..1|
-00000310  c0 60 6a 4f db 70 18 bd  80 8b 30 94 40 dd 13 39  |.`jO.p....0.@..9|
-00000320  4f db 2b 54 a4 97 f7 ef  a5 a3 ff f5 14 3d e2 2d  |O.+T.........=.-|
-00000330  0c 0e 71 4a bd a8 59 48  ab 06 55 53 45 2a ee 3e  |..qJ..YH..USE*.>|
-00000340  65 1f 47 ee 8d e3 f6 4e  2e b1 4c d0 af 50 15 02  |e.G....N..L..P..|
-00000350  5e 84 fe 76 d5 f3 c5 fb  2a 91 44 f0 92 32 ee ea  |^..v....*.D..2..|
-00000360  a0 26 77 5c 94 88 24 e3  2f 75 e3 fd b7 16 03 03  |.&w\..$./u......|
-00000370  00 04 0e 00 00 00                                 |......|
+00000000  16 03 03 00 5d 02 00 00  59 03 03 fa 07 a1 2e 81  |....]...Y.......|
+00000010  44 c8 72 44 5b 86 21 61  2f 3e 37 92 0f d5 7f d3  |D.rD[.!a/>7.....|
+00000020  0b 11 9a 5f d9 40 db 25  e4 2d da 20 11 0f ba 98  |..._.@.%.-. ....|
+00000030  8b fd 6f 93 c7 05 08 69  d6 c5 bc ef 3e 2b b8 98  |..o....i....>+..|
+00000040  10 f6 bc 57 72 81 a9 c0  96 1e a4 d2 cc a8 00 00  |...Wr...........|
+00000050  11 ff 01 00 01 00 00 0b  00 04 03 00 01 02 00 17  |................|
+00000060  00 00 16 03 03 02 59 0b  00 02 55 00 02 52 00 02  |......Y...U..R..|
+00000070  4f 30 82 02 4b 30 82 01  b4 a0 03 02 01 02 02 09  |O0..K0..........|
+00000080  00 e8 f0 9d 3f e2 5b ea  a6 30 0d 06 09 2a 86 48  |....?.[..0...*.H|
+00000090  86 f7 0d 01 01 0b 05 00  30 1f 31 0b 30 09 06 03  |........0.1.0...|
+000000a0  55 04 0a 13 02 47 6f 31  10 30 0e 06 03 55 04 03  |U....Go1.0...U..|
+000000b0  13 07 47 6f 20 52 6f 6f  74 30 1e 17 0d 31 36 30  |..Go Root0...160|
+000000c0  31 30 31 30 30 30 30 30  30 5a 17 0d 32 35 30 31  |101000000Z..2501|
+000000d0  30 31 30 30 30 30 30 30  5a 30 1a 31 0b 30 09 06  |01000000Z0.1.0..|
+000000e0  03 55 04 0a 13 02 47 6f  31 0b 30 09 06 03 55 04  |.U....Go1.0...U.|
+000000f0  03 13 02 47 6f 30 81 9f  30 0d 06 09 2a 86 48 86  |...Go0..0...*.H.|
+00000100  f7 0d 01 01 01 05 00 03  81 8d 00 30 81 89 02 81  |...........0....|
+00000110  81 00 db 46 7d 93 2e 12  27 06 48 bc 06 28 21 ab  |...F}...'.H..(!.|
+00000120  7e c4 b6 a2 5d fe 1e 52  45 88 7a 36 47 a5 08 0d  |~...]..RE.z6G...|
+00000130  92 42 5b c2 81 c0 be 97  79 98 40 fb 4f 6d 14 fd  |.B[.....y.@.Om..|
+00000140  2b 13 8b c2 a5 2e 67 d8  d4 09 9e d6 22 38 b7 4a  |+.....g....."8.J|
+00000150  0b 74 73 2b c2 34 f1 d1  93 e5 96 d9 74 7b f3 58  |.ts+.4......t{.X|
+00000160  9f 6c 61 3c c0 b0 41 d4  d9 2b 2b 24 23 77 5b 1c  |.la<..A..++$#w[.|
+00000170  3b bd 75 5d ce 20 54 cf  a1 63 87 1d 1e 24 c4 f3  |;.u]. T..c...$..|
+00000180  1d 1a 50 8b aa b6 14 43  ed 97 a7 75 62 f4 14 c8  |..P....C...ub...|
+00000190  52 d7 02 03 01 00 01 a3  81 93 30 81 90 30 0e 06  |R.........0..0..|
+000001a0  03 55 1d 0f 01 01 ff 04  04 03 02 05 a0 30 1d 06  |.U...........0..|
+000001b0  03 55 1d 25 04 16 30 14  06 08 2b 06 01 05 05 07  |.U.%..0...+.....|
+000001c0  03 01 06 08 2b 06 01 05  05 07 03 02 30 0c 06 03  |....+.......0...|
+000001d0  55 1d 13 01 01 ff 04 02  30 00 30 19 06 03 55 1d  |U.......0.0...U.|
+000001e0  0e 04 12 04 10 9f 91 16  1f 43 43 3e 49 a6 de 6d  |.........CC>I..m|
+000001f0  b6 80 d7 9f 60 30 1b 06  03 55 1d 23 04 14 30 12  |....`0...U.#..0.|
+00000200  80 10 48 13 49 4d 13 7e  16 31 bb a3 01 d5 ac ab  |..H.IM.~.1......|
+00000210  6e 7b 30 19 06 03 55 1d  11 04 12 30 10 82 0e 65  |n{0...U....0...e|
+00000220  78 61 6d 70 6c 65 2e 67  6f 6c 61 6e 67 30 0d 06  |xample.golang0..|
+00000230  09 2a 86 48 86 f7 0d 01  01 0b 05 00 03 81 81 00  |.*.H............|
+00000240  9d 30 cc 40 2b 5b 50 a0  61 cb ba e5 53 58 e1 ed  |.0.@+[P.a...SX..|
+00000250  83 28 a9 58 1a a9 38 a4  95 a1 ac 31 5a 1a 84 66  |.(.X..8....1Z..f|
+00000260  3d 43 d3 2d d9 0b f2 97  df d3 20 64 38 92 24 3a  |=C.-...... d8.$:|
+00000270  00 bc cf 9c 7d b7 40 20  01 5f aa d3 16 61 09 a2  |....}.@ ._...a..|
+00000280  76 fd 13 c3 cc e1 0c 5c  ee b1 87 82 f1 6c 04 ed  |v......\.....l..|
+00000290  73 bb b3 43 77 8d 0c 1c  f1 0f a1 d8 40 83 61 c9  |s..Cw.......@.a.|
+000002a0  4c 72 2b 9d ae db 46 06  06 4d f4 c1 b3 3e c0 d1  |Lr+...F..M...>..|
+000002b0  bd 42 d4 db fe 3d 13 60  84 5c 21 d3 3b e9 fa e7  |.B...=.`.\!.;...|
+000002c0  16 03 03 00 ac 0c 00 00  a8 03 00 1d 20 c7 4c 84  |............ .L.|
+000002d0  aa 9d be 0a bb 72 d2 bc  76 73 59 9b 07 e1 6f 94  |.....r..vsY...o.|
+000002e0  25 e7 13 7a 4c a5 8d f9  ab 9d 30 d0 4c 08 04 00  |%..zL.....0.L...|
+000002f0  80 88 4d ea e2 83 d7 b6  50 fb 22 e0 a9 32 87 8e  |..M.....P."..2..|
+00000300  cf e3 3d 94 bc 07 99 c3  b7 53 9d f6 0c 80 77 f7  |..=......S....w.|
+00000310  96 50 39 eb 85 33 9e 17  72 14 f7 3f e6 c2 9b 94  |.P9..3..r..?....|
+00000320  bb bc 26 b9 c6 68 1f 2a  19 d6 40 f5 8b 85 a4 8d  |..&..h.*..@.....|
+00000330  c8 29 96 bf d1 e1 15 f7  f8 75 66 42 00 45 d3 ff  |.).......ufB.E..|
+00000340  4d ef f7 ad 7b b5 00 3e  9f 08 b8 ce 87 df d9 fa  |M...{..>........|
+00000350  79 b9 d1 a4 a3 a7 ad 0b  2b fc 65 c2 51 dc 8c 29  |y.......+.e.Q..)|
+00000360  85 31 92 f9 b3 dd 1a a1  f1 f0 9c 21 9d a0 6e 49  |.1.........!..nI|
+00000370  ff 16 03 03 00 04 0e 00  00 00                    |..........|
 >>> Flow 3 (client to server)
 00000000  16 03 03 00 25 10 00 00  21 20 2f e5 7d a3 47 cd  |....%...! /.}.G.|
 00000010  62 43 15 28 da ac 5f bb  29 07 30 ff f6 84 af c4  |bC.(.._.).0.....|
 00000020  cf c2 ed 90 99 5f 58 cb  3b 74 14 03 03 00 01 01  |....._X.;t......|
-00000030  16 03 03 00 20 0b 58 fe  b5 63 ac 28 f8 34 d6 72  |.... .X..c.(.4.r|
-00000040  1a a3 ec 26 91 70 07 8d  6a 3a 3b 3a 94 5e a3 fa  |...&.p..j:;:.^..|
-00000050  6e 92 3a 15 65                                    |n.:.e|
+00000030  16 03 03 00 20 61 fc dc  e1 f7 bf 7b 90 e4 af 71  |.... a.....{...q|
+00000040  03 22 10 79 6d d9 e9 aa  1d 60 8e 40 d1 1e 3a 94  |.".ym....`.@..:.|
+00000050  ca 78 86 ad e6                                    |.x...|
 >>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 20 01 fa e1 2f 29  |.......... .../)|
-00000010  ee f6 d4 e8 22 b6 e0 8f  82 37 81 83 1b 03 4d 5f  |...."....7....M_|
-00000020  00 80 cb eb 9a 3a 01 c7  aa e9 9a                 |.....:.....|
+00000000  14 03 03 00 01 01 16 03  03 00 20 39 ee c6 1c d9  |.......... 9....|
+00000010  83 3e d3 bf 8a c3 3d bb  0a 27 7a 95 84 ef 82 e1  |.>....=..'z.....|
+00000020  80 6b 25 bf 68 dc 58 63  21 80 7d                 |.k%.h.Xc!.}|
 >>> Flow 5 (client to server)
-00000000  17 03 03 00 16 43 6a e8  f2 ca f9 4f 3c 6d ff 5e  |.....Cj....O<m.^|
-00000010  f3 19 eb ee 96 1c d8 68  c5 53 86 15 03 03 00 12  |.......h.S......|
-00000020  c2 72 4e 3c 33 93 fa f3  21 32 bb fd e3 c4 ef 1a  |.rN<3...!2......|
-00000030  46 df                                             |F.|
+00000000  17 03 03 00 16 e6 75 bb  fe 46 1a 4c 75 41 36 eb  |......u..F.LuA6.|
+00000010  a9 31 d9 59 74 9d 75 76  db 00 94 15 03 03 00 12  |.1.Yt.uv........|
+00000020  f0 a9 56 8e bd a5 bb c8  2d ea be d7 7f 9e 39 7a  |..V.....-.....9z|
+00000030  4f de                                             |O.|
diff --git a/src/crypto/tls/testdata/Client-TLSv12-Ed25519 b/src/crypto/tls/testdata/Client-TLSv12-Ed25519
index 72d564f..b2380ed 100644
--- a/src/crypto/tls/testdata/Client-TLSv12-Ed25519
+++ b/src/crypto/tls/testdata/Client-TLSv12-Ed25519
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fe 01 00 00  fa 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 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,62 +7,63 @@
 00000050  cc a8 c0 2b c0 2f c0 2c  c0 30 c0 09 c0 13 c0 0a  |...+./.,.0......|
 00000060  c0 14 00 9c 00 9d 00 2f  00 35 c0 12 00 0a c0 23  |......./.5.....#|
 00000070  c0 27 00 3c c0 07 c0 11  00 05 13 03 13 01 13 02  |.'.<............|
-00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
+00000080  01 00 00 7f 00 05 00 05  01 00 00 00 00 00 0a 00  |................|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
 000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
 000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
-000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
-000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
-000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
-000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
+000000c0  01 00 01 00 00 17 00 00  00 12 00 00 00 2b 00 09  |.............+..|
+000000d0  08 03 04 03 03 03 02 03  01 00 33 00 26 00 24 00  |..........3.&.$.|
+000000e0  1d 00 20 2f e5 7d a3 47  cd 62 43 15 28 da ac 5f  |.. /.}.G.bC.(.._|
+000000f0  bb 29 07 30 ff f6 84 af  c4 cf c2 ed 90 99 5f 58  |.).0.........._X|
+00000100  cb 3b 74                                          |.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 59 02 00 00  55 03 03 6c 5f 04 9e a6  |....Y...U..l_...|
-00000010  c6 41 0c ee a2 2c af 45  f0 bc de 67 2d 20 1c 9c  |.A...,.E...g- ..|
-00000020  82 33 fd 86 86 b3 50 04  77 ec da 20 f3 09 fb 8c  |.3....P.w.. ....|
-00000030  79 83 f9 82 58 b9 76 bb  d3 58 44 3d 52 0c 37 ae  |y...X.v..XD=R.7.|
-00000040  18 98 84 9a 56 af 5d 2b  68 68 c7 30 cc a9 00 00  |....V.]+hh.0....|
-00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
-00000060  03 01 3c 0b 00 01 38 00  01 35 00 01 32 30 82 01  |..<...8..5..20..|
-00000070  2e 30 81 e1 a0 03 02 01  02 02 10 0f 43 1c 42 57  |.0..........C.BW|
-00000080  93 94 1d e9 87 e4 f1 ad  15 00 5d 30 05 06 03 2b  |..........]0...+|
-00000090  65 70 30 12 31 10 30 0e  06 03 55 04 0a 13 07 41  |ep0.1.0...U....A|
-000000a0  63 6d 65 20 43 6f 30 1e  17 0d 31 39 30 35 31 36  |cme Co0...190516|
-000000b0  32 31 33 38 30 31 5a 17  0d 32 30 30 35 31 35 32  |213801Z..2005152|
-000000c0  31 33 38 30 31 5a 30 12  31 10 30 0e 06 03 55 04  |13801Z0.1.0...U.|
-000000d0  0a 13 07 41 63 6d 65 20  43 6f 30 2a 30 05 06 03  |...Acme Co0*0...|
-000000e0  2b 65 70 03 21 00 3f e2  15 2e e6 e3 ef 3f 4e 85  |+ep.!.?......?N.|
-000000f0  4a 75 77 a3 64 9e ed e0  bf 84 2c cc 92 26 8f fa  |Juw.d.....,..&..|
-00000100  6f 34 83 aa ec 8f a3 4d  30 4b 30 0e 06 03 55 1d  |o4.....M0K0...U.|
-00000110  0f 01 01 ff 04 04 03 02  05 a0 30 13 06 03 55 1d  |..........0...U.|
-00000120  25 04 0c 30 0a 06 08 2b  06 01 05 05 07 03 01 30  |%..0...+.......0|
-00000130  0c 06 03 55 1d 13 01 01  ff 04 02 30 00 30 16 06  |...U.......0.0..|
-00000140  03 55 1d 11 04 0f 30 0d  82 0b 65 78 61 6d 70 6c  |.U....0...exampl|
-00000150  65 2e 63 6f 6d 30 05 06  03 2b 65 70 03 41 00 63  |e.com0...+ep.A.c|
-00000160  44 ed 9c c4 be 53 24 53  9f d2 10 8d 9f e8 21 08  |D....S$S......!.|
-00000170  90 95 39 e5 0d c1 55 ff  2c 16 b7 1d fc ab 7d 4d  |..9...U.,.....}M|
-00000180  d4 e0 93 13 d0 a9 42 e0  b6 6b fe 5d 67 48 d7 9f  |......B..k.]gH..|
-00000190  50 bc 6c cd 4b 03 83 7c  f2 08 58 cd ac cf 0c 16  |P.l.K..|..X.....|
-000001a0  03 03 00 6c 0c 00 00 68  03 00 1d 20 a7 28 ef 3e  |...l...h... .(.>|
-000001b0  1c 65 9f 8e 9a 80 0b 7d  ac 9c ce d6 1e 97 54 30  |.e.....}......T0|
-000001c0  53 9b e6 0c 61 e0 ea 9c  ae 70 f2 78 08 07 00 40  |S...a....p.x...@|
-000001d0  0c 49 38 23 a0 75 28 fb  ec 71 a4 89 79 45 d1 ca  |.I8#.u(..q..yE..|
-000001e0  83 6f 5d dd 01 d4 c6 63  53 5d 6e 8f 06 09 80 a1  |.o]....cS]n.....|
-000001f0  f7 ef af 2d 29 af aa 10  86 1c 18 19 3f be bb 90  |...-).......?...|
-00000200  0e c3 9d 1e 6e 60 49 7f  fc c8 42 61 89 c2 e3 04  |....n`I...Ba....|
-00000210  16 03 03 00 04 0e 00 00  00                       |.........|
+00000000  16 03 03 00 5d 02 00 00  59 03 03 17 80 d3 0b 73  |....]...Y......s|
+00000010  6d e4 3e 2d 7a 35 ab ab  65 ad a0 03 14 cb e8 98  |m.>-z5..e.......|
+00000020  3a d3 c6 41 39 b2 78 c2  1b 06 da 20 ec 80 a9 c4  |:..A9.x.... ....|
+00000030  7c b8 9b cc b3 98 7a cd  97 40 41 39 b7 75 13 7a  ||.....z..@A9.u.z|
+00000040  40 33 ec 9d 69 97 32 5b  f5 6e 4f bc cc a9 00 00  |@3..i.2[.nO.....|
+00000050  11 ff 01 00 01 00 00 0b  00 04 03 00 01 02 00 17  |................|
+00000060  00 00 16 03 03 01 3c 0b  00 01 38 00 01 35 00 01  |......<...8..5..|
+00000070  32 30 82 01 2e 30 81 e1  a0 03 02 01 02 02 10 0f  |20...0..........|
+00000080  43 1c 42 57 93 94 1d e9  87 e4 f1 ad 15 00 5d 30  |C.BW..........]0|
+00000090  05 06 03 2b 65 70 30 12  31 10 30 0e 06 03 55 04  |...+ep0.1.0...U.|
+000000a0  0a 13 07 41 63 6d 65 20  43 6f 30 1e 17 0d 31 39  |...Acme Co0...19|
+000000b0  30 35 31 36 32 31 33 38  30 31 5a 17 0d 32 30 30  |0516213801Z..200|
+000000c0  35 31 35 32 31 33 38 30  31 5a 30 12 31 10 30 0e  |515213801Z0.1.0.|
+000000d0  06 03 55 04 0a 13 07 41  63 6d 65 20 43 6f 30 2a  |..U....Acme Co0*|
+000000e0  30 05 06 03 2b 65 70 03  21 00 3f e2 15 2e e6 e3  |0...+ep.!.?.....|
+000000f0  ef 3f 4e 85 4a 75 77 a3  64 9e ed e0 bf 84 2c cc  |.?N.Juw.d.....,.|
+00000100  92 26 8f fa 6f 34 83 aa  ec 8f a3 4d 30 4b 30 0e  |.&..o4.....M0K0.|
+00000110  06 03 55 1d 0f 01 01 ff  04 04 03 02 05 a0 30 13  |..U...........0.|
+00000120  06 03 55 1d 25 04 0c 30  0a 06 08 2b 06 01 05 05  |..U.%..0...+....|
+00000130  07 03 01 30 0c 06 03 55  1d 13 01 01 ff 04 02 30  |...0...U.......0|
+00000140  00 30 16 06 03 55 1d 11  04 0f 30 0d 82 0b 65 78  |.0...U....0...ex|
+00000150  61 6d 70 6c 65 2e 63 6f  6d 30 05 06 03 2b 65 70  |ample.com0...+ep|
+00000160  03 41 00 63 44 ed 9c c4  be 53 24 53 9f d2 10 8d  |.A.cD....S$S....|
+00000170  9f e8 21 08 90 95 39 e5  0d c1 55 ff 2c 16 b7 1d  |..!...9...U.,...|
+00000180  fc ab 7d 4d d4 e0 93 13  d0 a9 42 e0 b6 6b fe 5d  |..}M......B..k.]|
+00000190  67 48 d7 9f 50 bc 6c cd  4b 03 83 7c f2 08 58 cd  |gH..P.l.K..|..X.|
+000001a0  ac cf 0c 16 03 03 00 6c  0c 00 00 68 03 00 1d 20  |.......l...h... |
+000001b0  6b 23 39 84 eb 4d db d0  0c f4 5a 9f ce bf 3a a8  |k#9..M....Z...:.|
+000001c0  52 df 00 9b 14 10 31 95  21 35 07 f1 7f 22 bf 14  |R.....1.!5..."..|
+000001d0  08 07 00 40 f6 b8 53 ed  97 7f 5a 28 88 84 f4 aa  |...@..S...Z(....|
+000001e0  64 30 dc 4c 80 1f 8f 62  9d 52 aa bb e7 98 e1 7f  |d0.L...b.R......|
+000001f0  12 19 b5 84 d2 4b 92 b1  38 a9 4e c2 09 1a 91 bf  |.....K..8.N.....|
+00000200  4a 83 5e a4 82 a0 36 84  85 0d bd b5 a9 4f 2f 60  |J.^...6......O/`|
+00000210  a4 2f 33 0d 16 03 03 00  04 0e 00 00 00           |./3..........|
 >>> Flow 3 (client to server)
 00000000  16 03 03 00 25 10 00 00  21 20 2f e5 7d a3 47 cd  |....%...! /.}.G.|
 00000010  62 43 15 28 da ac 5f bb  29 07 30 ff f6 84 af c4  |bC.(.._.).0.....|
 00000020  cf c2 ed 90 99 5f 58 cb  3b 74 14 03 03 00 01 01  |....._X.;t......|
-00000030  16 03 03 00 20 b2 7f b6  1b 9c ec bf 2e ae a5 70  |.... ..........p|
-00000040  d5 33 9b 63 02 66 77 7d  00 ec 86 e4 bb d4 57 68  |.3.c.fw}......Wh|
-00000050  49 2a d3 be e7                                    |I*...|
+00000030  16 03 03 00 20 a2 a9 10  50 bb d9 12 ee 74 a1 79  |.... ...P....t.y|
+00000040  cb fa 36 73 26 89 4e a4  2d 14 c0 ac f3 7b 82 c6  |..6s&.N.-....{..|
+00000050  cf fb 00 88 9e                                    |.....|
 >>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 20 4c 7d ef ed ea  |.......... L}...|
-00000010  ab 8d 4f 38 46 6e 8f 56  b4 1d f2 1f 2c df 57 c0  |..O8Fn.V....,.W.|
-00000020  f9 8a c2 71 f8 6d df b7  c7 1e 23                 |...q.m....#|
+00000000  14 03 03 00 01 01 16 03  03 00 20 22 85 b9 b0 e7  |.......... "....|
+00000010  14 c0 a6 a9 91 4e 08 80  83 75 92 b5 45 9d 13 e9  |.....N...u..E...|
+00000020  0f 45 e7 55 ac b7 68 93  b4 bb 00                 |.E.U..h....|
 >>> Flow 5 (client to server)
-00000000  17 03 03 00 16 26 f1 7c  ee c8 3a 61 b0 f7 5a bd  |.....&.|..:a..Z.|
-00000010  b7 61 61 60 69 db cd ea  10 ee 63 15 03 03 00 12  |.aa`i.....c.....|
-00000020  22 c0 65 a4 5d 0e 48 9c  56 f8 54 17 82 5f 29 97  |".e.].H.V.T.._).|
-00000030  be 6b                                             |.k|
+00000000  17 03 03 00 16 0a c8 36  60 97 80 1c d5 d5 3c 3d  |.......6`.....<=|
+00000010  07 4f 9b 2c 75 6c a0 b1  9a 2c b8 15 03 03 00 12  |.O.,ul...,......|
+00000020  fc a4 95 ae ee fe e2 4f  ad b2 13 e0 c9 a7 2a 5a  |.......O......*Z|
+00000030  54 2c                                             |T,|
diff --git a/src/crypto/tls/testdata/Client-TLSv12-ExportKeyingMaterial b/src/crypto/tls/testdata/Client-TLSv12-ExportKeyingMaterial
index adf1f72..cbd1fbd 100644
--- a/src/crypto/tls/testdata/Client-TLSv12-ExportKeyingMaterial
+++ b/src/crypto/tls/testdata/Client-TLSv12-ExportKeyingMaterial
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fe 01 00 00  fa 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 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,84 +7,85 @@
 00000050  cc a8 c0 2b c0 2f c0 2c  c0 30 c0 09 c0 13 c0 0a  |...+./.,.0......|
 00000060  c0 14 00 9c 00 9d 00 2f  00 35 c0 12 00 0a c0 23  |......./.5.....#|
 00000070  c0 27 00 3c c0 07 c0 11  00 05 13 03 13 01 13 02  |.'.<............|
-00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
+00000080  01 00 00 7f 00 05 00 05  01 00 00 00 00 00 0a 00  |................|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
 000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
 000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
-000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
-000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
-000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
-000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
+000000c0  01 00 01 00 00 17 00 00  00 12 00 00 00 2b 00 09  |.............+..|
+000000d0  08 03 04 03 03 03 02 03  01 00 33 00 26 00 24 00  |..........3.&.$.|
+000000e0  1d 00 20 2f e5 7d a3 47  cd 62 43 15 28 da ac 5f  |.. /.}.G.bC.(.._|
+000000f0  bb 29 07 30 ff f6 84 af  c4 cf c2 ed 90 99 5f 58  |.).0.........._X|
+00000100  cb 3b 74                                          |.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 59 02 00 00  55 03 03 79 92 2e 86 bc  |....Y...U..y....|
-00000010  c0 b7 56 2a 25 58 75 b3  25 ac 58 1d 8d 8e d5 87  |..V*%Xu.%.X.....|
-00000020  2d 67 8e 6e d4 d4 b6 67  b1 42 96 20 91 75 0b fa  |-g.n...g.B. .u..|
-00000030  d0 6f ab 91 4a c3 15 07  1d 6c 8e e5 55 f2 26 aa  |.o..J....l..U.&.|
-00000040  4d 5c 57 3b 93 a6 fc 46  c9 f6 80 1e cc a8 00 00  |M\W;...F........|
-00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
-00000060  03 02 59 0b 00 02 55 00  02 52 00 02 4f 30 82 02  |..Y...U..R..O0..|
-00000070  4b 30 82 01 b4 a0 03 02  01 02 02 09 00 e8 f0 9d  |K0..............|
-00000080  3f e2 5b ea a6 30 0d 06  09 2a 86 48 86 f7 0d 01  |?.[..0...*.H....|
-00000090  01 0b 05 00 30 1f 31 0b  30 09 06 03 55 04 0a 13  |....0.1.0...U...|
-000000a0  02 47 6f 31 10 30 0e 06  03 55 04 03 13 07 47 6f  |.Go1.0...U....Go|
-000000b0  20 52 6f 6f 74 30 1e 17  0d 31 36 30 31 30 31 30  | Root0...1601010|
-000000c0  30 30 30 30 30 5a 17 0d  32 35 30 31 30 31 30 30  |00000Z..25010100|
-000000d0  30 30 30 30 5a 30 1a 31  0b 30 09 06 03 55 04 0a  |0000Z0.1.0...U..|
-000000e0  13 02 47 6f 31 0b 30 09  06 03 55 04 03 13 02 47  |..Go1.0...U....G|
-000000f0  6f 30 81 9f 30 0d 06 09  2a 86 48 86 f7 0d 01 01  |o0..0...*.H.....|
-00000100  01 05 00 03 81 8d 00 30  81 89 02 81 81 00 db 46  |.......0.......F|
-00000110  7d 93 2e 12 27 06 48 bc  06 28 21 ab 7e c4 b6 a2  |}...'.H..(!.~...|
-00000120  5d fe 1e 52 45 88 7a 36  47 a5 08 0d 92 42 5b c2  |]..RE.z6G....B[.|
-00000130  81 c0 be 97 79 98 40 fb  4f 6d 14 fd 2b 13 8b c2  |....y.@.Om..+...|
-00000140  a5 2e 67 d8 d4 09 9e d6  22 38 b7 4a 0b 74 73 2b  |..g....."8.J.ts+|
-00000150  c2 34 f1 d1 93 e5 96 d9  74 7b f3 58 9f 6c 61 3c  |.4......t{.X.la<|
-00000160  c0 b0 41 d4 d9 2b 2b 24  23 77 5b 1c 3b bd 75 5d  |..A..++$#w[.;.u]|
-00000170  ce 20 54 cf a1 63 87 1d  1e 24 c4 f3 1d 1a 50 8b  |. T..c...$....P.|
-00000180  aa b6 14 43 ed 97 a7 75  62 f4 14 c8 52 d7 02 03  |...C...ub...R...|
-00000190  01 00 01 a3 81 93 30 81  90 30 0e 06 03 55 1d 0f  |......0..0...U..|
-000001a0  01 01 ff 04 04 03 02 05  a0 30 1d 06 03 55 1d 25  |.........0...U.%|
-000001b0  04 16 30 14 06 08 2b 06  01 05 05 07 03 01 06 08  |..0...+.........|
-000001c0  2b 06 01 05 05 07 03 02  30 0c 06 03 55 1d 13 01  |+.......0...U...|
-000001d0  01 ff 04 02 30 00 30 19  06 03 55 1d 0e 04 12 04  |....0.0...U.....|
-000001e0  10 9f 91 16 1f 43 43 3e  49 a6 de 6d b6 80 d7 9f  |.....CC>I..m....|
-000001f0  60 30 1b 06 03 55 1d 23  04 14 30 12 80 10 48 13  |`0...U.#..0...H.|
-00000200  49 4d 13 7e 16 31 bb a3  01 d5 ac ab 6e 7b 30 19  |IM.~.1......n{0.|
-00000210  06 03 55 1d 11 04 12 30  10 82 0e 65 78 61 6d 70  |..U....0...examp|
-00000220  6c 65 2e 67 6f 6c 61 6e  67 30 0d 06 09 2a 86 48  |le.golang0...*.H|
-00000230  86 f7 0d 01 01 0b 05 00  03 81 81 00 9d 30 cc 40  |.............0.@|
-00000240  2b 5b 50 a0 61 cb ba e5  53 58 e1 ed 83 28 a9 58  |+[P.a...SX...(.X|
-00000250  1a a9 38 a4 95 a1 ac 31  5a 1a 84 66 3d 43 d3 2d  |..8....1Z..f=C.-|
-00000260  d9 0b f2 97 df d3 20 64  38 92 24 3a 00 bc cf 9c  |...... d8.$:....|
-00000270  7d b7 40 20 01 5f aa d3  16 61 09 a2 76 fd 13 c3  |}.@ ._...a..v...|
-00000280  cc e1 0c 5c ee b1 87 82  f1 6c 04 ed 73 bb b3 43  |...\.....l..s..C|
-00000290  77 8d 0c 1c f1 0f a1 d8  40 83 61 c9 4c 72 2b 9d  |w.......@.a.Lr+.|
-000002a0  ae db 46 06 06 4d f4 c1  b3 3e c0 d1 bd 42 d4 db  |..F..M...>...B..|
-000002b0  fe 3d 13 60 84 5c 21 d3  3b e9 fa e7 16 03 03 00  |.=.`.\!.;.......|
-000002c0  ac 0c 00 00 a8 03 00 1d  20 5f 3c a6 bb 4e 32 85  |........ _<..N2.|
-000002d0  69 4b 23 df 18 9c 07 ac  0b a8 dd 9b 59 33 00 02  |iK#.........Y3..|
-000002e0  99 de 4e 66 1e 04 3b ce  4b 08 04 00 80 82 41 7c  |..Nf..;.K.....A||
-000002f0  7b b8 ee d4 23 08 c3 23  8d b1 ea 27 43 e7 8e f1  |{...#..#...'C...|
-00000300  7b 87 b0 88 ab f7 b1 15  2e 45 c5 50 e7 cd 05 31  |{........E.P...1|
-00000310  bf 99 30 c8 ff 6a 23 ec  9d e5 c8 09 fa ec 50 a8  |..0..j#.......P.|
-00000320  fa b3 54 b7 c5 61 99 f6  94 12 e6 34 4a 59 e3 dd  |..T..a.....4JY..|
-00000330  e5 7f f4 88 c9 2a 4c 09  65 d9 75 a6 ce 12 96 82  |.....*L.e.u.....|
-00000340  a2 36 f2 5e 93 f2 4e 1c  05 91 a7 5a 67 36 e9 3d  |.6.^..N....Zg6.=|
-00000350  33 cd 6a 77 9c 8d 14 95  80 41 61 bd 80 ed 7b 51  |3.jw.....Aa...{Q|
-00000360  cf 76 87 4d ac dc 5f c1  5d 52 a7 f9 51 16 03 03  |.v.M.._.]R..Q...|
-00000370  00 04 0e 00 00 00                                 |......|
+00000000  16 03 03 00 5d 02 00 00  59 03 03 86 45 94 b6 f3  |....]...Y...E...|
+00000010  30 74 36 25 50 09 38 f6  3e 4a 5a b6 bf 06 fd 01  |0t6%P.8.>JZ.....|
+00000020  4b 35 b0 bc ef 77 bf f6  e9 a2 84 20 97 96 9b ba  |K5...w..... ....|
+00000030  24 5f 28 cd 16 3f d3 f4  2b 92 da 09 a5 18 2f 21  |$_(..?..+...../!|
+00000040  d8 23 85 9a c9 4a 69 36  93 ab c2 5a cc a8 00 00  |.#...Ji6...Z....|
+00000050  11 ff 01 00 01 00 00 0b  00 04 03 00 01 02 00 17  |................|
+00000060  00 00 16 03 03 02 59 0b  00 02 55 00 02 52 00 02  |......Y...U..R..|
+00000070  4f 30 82 02 4b 30 82 01  b4 a0 03 02 01 02 02 09  |O0..K0..........|
+00000080  00 e8 f0 9d 3f e2 5b ea  a6 30 0d 06 09 2a 86 48  |....?.[..0...*.H|
+00000090  86 f7 0d 01 01 0b 05 00  30 1f 31 0b 30 09 06 03  |........0.1.0...|
+000000a0  55 04 0a 13 02 47 6f 31  10 30 0e 06 03 55 04 03  |U....Go1.0...U..|
+000000b0  13 07 47 6f 20 52 6f 6f  74 30 1e 17 0d 31 36 30  |..Go Root0...160|
+000000c0  31 30 31 30 30 30 30 30  30 5a 17 0d 32 35 30 31  |101000000Z..2501|
+000000d0  30 31 30 30 30 30 30 30  5a 30 1a 31 0b 30 09 06  |01000000Z0.1.0..|
+000000e0  03 55 04 0a 13 02 47 6f  31 0b 30 09 06 03 55 04  |.U....Go1.0...U.|
+000000f0  03 13 02 47 6f 30 81 9f  30 0d 06 09 2a 86 48 86  |...Go0..0...*.H.|
+00000100  f7 0d 01 01 01 05 00 03  81 8d 00 30 81 89 02 81  |...........0....|
+00000110  81 00 db 46 7d 93 2e 12  27 06 48 bc 06 28 21 ab  |...F}...'.H..(!.|
+00000120  7e c4 b6 a2 5d fe 1e 52  45 88 7a 36 47 a5 08 0d  |~...]..RE.z6G...|
+00000130  92 42 5b c2 81 c0 be 97  79 98 40 fb 4f 6d 14 fd  |.B[.....y.@.Om..|
+00000140  2b 13 8b c2 a5 2e 67 d8  d4 09 9e d6 22 38 b7 4a  |+.....g....."8.J|
+00000150  0b 74 73 2b c2 34 f1 d1  93 e5 96 d9 74 7b f3 58  |.ts+.4......t{.X|
+00000160  9f 6c 61 3c c0 b0 41 d4  d9 2b 2b 24 23 77 5b 1c  |.la<..A..++$#w[.|
+00000170  3b bd 75 5d ce 20 54 cf  a1 63 87 1d 1e 24 c4 f3  |;.u]. T..c...$..|
+00000180  1d 1a 50 8b aa b6 14 43  ed 97 a7 75 62 f4 14 c8  |..P....C...ub...|
+00000190  52 d7 02 03 01 00 01 a3  81 93 30 81 90 30 0e 06  |R.........0..0..|
+000001a0  03 55 1d 0f 01 01 ff 04  04 03 02 05 a0 30 1d 06  |.U...........0..|
+000001b0  03 55 1d 25 04 16 30 14  06 08 2b 06 01 05 05 07  |.U.%..0...+.....|
+000001c0  03 01 06 08 2b 06 01 05  05 07 03 02 30 0c 06 03  |....+.......0...|
+000001d0  55 1d 13 01 01 ff 04 02  30 00 30 19 06 03 55 1d  |U.......0.0...U.|
+000001e0  0e 04 12 04 10 9f 91 16  1f 43 43 3e 49 a6 de 6d  |.........CC>I..m|
+000001f0  b6 80 d7 9f 60 30 1b 06  03 55 1d 23 04 14 30 12  |....`0...U.#..0.|
+00000200  80 10 48 13 49 4d 13 7e  16 31 bb a3 01 d5 ac ab  |..H.IM.~.1......|
+00000210  6e 7b 30 19 06 03 55 1d  11 04 12 30 10 82 0e 65  |n{0...U....0...e|
+00000220  78 61 6d 70 6c 65 2e 67  6f 6c 61 6e 67 30 0d 06  |xample.golang0..|
+00000230  09 2a 86 48 86 f7 0d 01  01 0b 05 00 03 81 81 00  |.*.H............|
+00000240  9d 30 cc 40 2b 5b 50 a0  61 cb ba e5 53 58 e1 ed  |.0.@+[P.a...SX..|
+00000250  83 28 a9 58 1a a9 38 a4  95 a1 ac 31 5a 1a 84 66  |.(.X..8....1Z..f|
+00000260  3d 43 d3 2d d9 0b f2 97  df d3 20 64 38 92 24 3a  |=C.-...... d8.$:|
+00000270  00 bc cf 9c 7d b7 40 20  01 5f aa d3 16 61 09 a2  |....}.@ ._...a..|
+00000280  76 fd 13 c3 cc e1 0c 5c  ee b1 87 82 f1 6c 04 ed  |v......\.....l..|
+00000290  73 bb b3 43 77 8d 0c 1c  f1 0f a1 d8 40 83 61 c9  |s..Cw.......@.a.|
+000002a0  4c 72 2b 9d ae db 46 06  06 4d f4 c1 b3 3e c0 d1  |Lr+...F..M...>..|
+000002b0  bd 42 d4 db fe 3d 13 60  84 5c 21 d3 3b e9 fa e7  |.B...=.`.\!.;...|
+000002c0  16 03 03 00 ac 0c 00 00  a8 03 00 1d 20 34 09 94  |............ 4..|
+000002d0  56 6a c3 3b 88 60 42 3d  1d f2 99 a1 8e 56 72 e3  |Vj.;.`B=.....Vr.|
+000002e0  09 83 17 04 60 08 ad db  70 c6 f6 77 2a 08 04 00  |....`...p..w*...|
+000002f0  80 80 1c d5 53 c0 5b 1f  86 e9 d7 16 18 0d 50 3c  |....S.[.......P<|
+00000300  b6 40 1f 58 ea 79 e6 af  cf a1 cf 55 3f e1 fe 04  |.@.X.y.....U?...|
+00000310  bc e5 1c 4a ae 36 e9 7b  64 a1 76 ea 43 bc 8f a7  |...J.6.{d.v.C...|
+00000320  0a 8a 8b d1 af 54 57 21  9b 55 10 90 91 07 f7 96  |.....TW!.U......|
+00000330  68 68 33 ec 4b c4 70 08  88 92 59 2d 4d 86 47 d9  |hh3.K.p...Y-M.G.|
+00000340  8a a7 d2 22 b4 ab 83 0e  3b 29 79 fd 1b f7 5b c8  |..."....;)y...[.|
+00000350  b2 d5 3a be 74 e7 b5 c8  6e 4e c4 8d c5 70 6c 98  |..:.t...nN...pl.|
+00000360  fe 57 f9 2e c0 8c d3 38  39 e9 0e c1 17 c9 8d 36  |.W.....89......6|
+00000370  47 16 03 03 00 04 0e 00  00 00                    |G.........|
 >>> Flow 3 (client to server)
 00000000  16 03 03 00 25 10 00 00  21 20 2f e5 7d a3 47 cd  |....%...! /.}.G.|
 00000010  62 43 15 28 da ac 5f bb  29 07 30 ff f6 84 af c4  |bC.(.._.).0.....|
 00000020  cf c2 ed 90 99 5f 58 cb  3b 74 14 03 03 00 01 01  |....._X.;t......|
-00000030  16 03 03 00 20 bc c3 7c  c2 cc a4 4e 8f d0 79 7a  |.... ..|...N..yz|
-00000040  a4 7d 4c 3d 17 8c 19 93  4f 49 03 50 f6 71 4d 16  |.}L=....OI.P.qM.|
-00000050  97 bb 18 88 67                                    |....g|
+00000030  16 03 03 00 20 35 b3 34  ef 69 93 b1 31 f1 da 9c  |.... 5.4.i..1...|
+00000040  3f 49 e5 99 8f af 4f 3b  48 52 b9 a3 fa 42 e7 3e  |?I....O;HR...B.>|
+00000050  29 4c 22 b7 0a                                    |)L"..|
 >>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 20 00 c4 8a f9 1e  |.......... .....|
-00000010  c0 66 ab ef 39 ae 41 7a  05 9c e3 06 e4 4d 00 bb  |.f..9.Az.....M..|
-00000020  d4 ef 21 71 a3 54 23 fe  db 4a 86                 |..!q.T#..J.|
+00000000  14 03 03 00 01 01 16 03  03 00 20 cd 8f ee d3 57  |.......... ....W|
+00000010  a5 e4 c0 4c 83 91 37 e2  5b 30 aa a1 52 ed 6c 42  |...L..7.[0..R.lB|
+00000020  5b d6 59 1c 9f f7 c6 69  c9 2a 5d                 |[.Y....i.*]|
 >>> Flow 5 (client to server)
-00000000  17 03 03 00 16 0c d3 9a  f5 1d f4 5f b2 45 c7 7c  |..........._.E.||
-00000010  38 59 6e df 6e 59 d5 94  8b a9 bb 15 03 03 00 12  |8Yn.nY..........|
-00000020  9e 74 a5 0e c1 7f 33 52  be 17 f6 f5 4d 9f 3d d1  |.t....3R....M.=.|
-00000030  b5 65                                             |.e|
+00000000  17 03 03 00 16 c9 3b 66  6a 59 3a b6 be 39 a0 db  |......;fjY:..9..|
+00000010  e9 b4 d8 e1 f5 a6 15 70  4a fc e7 15 03 03 00 12  |.......pJ.......|
+00000020  1b c5 fe f3 89 a3 0d d6  1e 23 2d 54 d6 01 62 3c  |.........#-T..b<|
+00000030  af 0c                                             |..|
diff --git a/src/crypto/tls/testdata/Client-TLSv12-P256-ECDHE b/src/crypto/tls/testdata/Client-TLSv12-P256-ECDHE
index 3331435..9b6c750 100644
--- a/src/crypto/tls/testdata/Client-TLSv12-P256-ECDHE
+++ b/src/crypto/tls/testdata/Client-TLSv12-P256-ECDHE
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 01 15 01 00 01  11 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 01 19 01 00 01  15 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 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,92 +7,92 @@
 00000050  cc a8 c0 2b c0 2f c0 2c  c0 30 c0 09 c0 13 c0 0a  |...+./.,.0......|
 00000060  c0 14 00 9c 00 9d 00 2f  00 35 c0 12 00 0a c0 23  |......./.5.....#|
 00000070  c0 27 00 3c c0 07 c0 11  00 05 13 03 13 01 13 02  |.'.<............|
-00000080  01 00 00 96 00 05 00 05  01 00 00 00 00 00 0a 00  |................|
+00000080  01 00 00 9a 00 05 00 05  01 00 00 00 00 00 0a 00  |................|
 00000090  04 00 02 00 17 00 0b 00  02 01 00 00 0d 00 1a 00  |................|
 000000a0  18 08 04 04 03 08 07 08  05 08 06 04 01 05 01 06  |................|
-000000b0  01 05 03 06 03 02 01 02  03 ff 01 00 01 00 00 12  |................|
-000000c0  00 00 00 2b 00 09 08 03  04 03 03 03 02 03 01 00  |...+............|
-000000d0  33 00 47 00 45 00 17 00  41 04 1e 18 37 ef 0d 19  |3.G.E...A...7...|
-000000e0  51 88 35 75 71 b5 e5 54  5b 12 2e 8f 09 67 fd a7  |Q.5uq..T[....g..|
-000000f0  24 20 3e b2 56 1c ce 97  28 5e f8 2b 2d 4f 9e f1  |$ >.V...(^.+-O..|
-00000100  07 9f 6c 4b 5b 83 56 e2  32 42 e9 58 b6 d7 49 a6  |..lK[.V.2B.X..I.|
-00000110  b5 68 1a 41 03 56 6b dc  5a 89                    |.h.A.Vk.Z.|
+000000b0  01 05 03 06 03 02 01 02  03 ff 01 00 01 00 00 17  |................|
+000000c0  00 00 00 12 00 00 00 2b  00 09 08 03 04 03 03 03  |.......+........|
+000000d0  02 03 01 00 33 00 47 00  45 00 17 00 41 04 1e 18  |....3.G.E...A...|
+000000e0  37 ef 0d 19 51 88 35 75  71 b5 e5 54 5b 12 2e 8f  |7...Q.5uq..T[...|
+000000f0  09 67 fd a7 24 20 3e b2  56 1c ce 97 28 5e f8 2b  |.g..$ >.V...(^.+|
+00000100  2d 4f 9e f1 07 9f 6c 4b  5b 83 56 e2 32 42 e9 58  |-O....lK[.V.2B.X|
+00000110  b6 d7 49 a6 b5 68 1a 41  03 56 6b dc 5a 89        |..I..h.A.Vk.Z.|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 59 02 00 00  55 03 03 0b f0 3e a1 66  |....Y...U....>.f|
-00000010  13 35 53 83 59 3c 9e 2a  0f 0b b0 9a 42 de e4 f1  |.5S.Y<.*....B...|
-00000020  8a 2d 34 ef 15 fe 28 55  42 d8 bf 20 aa 27 5c 5f  |.-4...(UB.. .'\_|
-00000030  24 59 17 ef 43 f3 18 f8  40 97 8f 1a 6a f4 e4 4a  |$Y..C...@...j..J|
-00000040  a3 b7 11 39 01 bd 98 8c  61 08 d9 50 c0 2f 00 00  |...9....a..P./..|
-00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
-00000060  03 02 59 0b 00 02 55 00  02 52 00 02 4f 30 82 02  |..Y...U..R..O0..|
-00000070  4b 30 82 01 b4 a0 03 02  01 02 02 09 00 e8 f0 9d  |K0..............|
-00000080  3f e2 5b ea a6 30 0d 06  09 2a 86 48 86 f7 0d 01  |?.[..0...*.H....|
-00000090  01 0b 05 00 30 1f 31 0b  30 09 06 03 55 04 0a 13  |....0.1.0...U...|
-000000a0  02 47 6f 31 10 30 0e 06  03 55 04 03 13 07 47 6f  |.Go1.0...U....Go|
-000000b0  20 52 6f 6f 74 30 1e 17  0d 31 36 30 31 30 31 30  | Root0...1601010|
-000000c0  30 30 30 30 30 5a 17 0d  32 35 30 31 30 31 30 30  |00000Z..25010100|
-000000d0  30 30 30 30 5a 30 1a 31  0b 30 09 06 03 55 04 0a  |0000Z0.1.0...U..|
-000000e0  13 02 47 6f 31 0b 30 09  06 03 55 04 03 13 02 47  |..Go1.0...U....G|
-000000f0  6f 30 81 9f 30 0d 06 09  2a 86 48 86 f7 0d 01 01  |o0..0...*.H.....|
-00000100  01 05 00 03 81 8d 00 30  81 89 02 81 81 00 db 46  |.......0.......F|
-00000110  7d 93 2e 12 27 06 48 bc  06 28 21 ab 7e c4 b6 a2  |}...'.H..(!.~...|
-00000120  5d fe 1e 52 45 88 7a 36  47 a5 08 0d 92 42 5b c2  |]..RE.z6G....B[.|
-00000130  81 c0 be 97 79 98 40 fb  4f 6d 14 fd 2b 13 8b c2  |....y.@.Om..+...|
-00000140  a5 2e 67 d8 d4 09 9e d6  22 38 b7 4a 0b 74 73 2b  |..g....."8.J.ts+|
-00000150  c2 34 f1 d1 93 e5 96 d9  74 7b f3 58 9f 6c 61 3c  |.4......t{.X.la<|
-00000160  c0 b0 41 d4 d9 2b 2b 24  23 77 5b 1c 3b bd 75 5d  |..A..++$#w[.;.u]|
-00000170  ce 20 54 cf a1 63 87 1d  1e 24 c4 f3 1d 1a 50 8b  |. T..c...$....P.|
-00000180  aa b6 14 43 ed 97 a7 75  62 f4 14 c8 52 d7 02 03  |...C...ub...R...|
-00000190  01 00 01 a3 81 93 30 81  90 30 0e 06 03 55 1d 0f  |......0..0...U..|
-000001a0  01 01 ff 04 04 03 02 05  a0 30 1d 06 03 55 1d 25  |.........0...U.%|
-000001b0  04 16 30 14 06 08 2b 06  01 05 05 07 03 01 06 08  |..0...+.........|
-000001c0  2b 06 01 05 05 07 03 02  30 0c 06 03 55 1d 13 01  |+.......0...U...|
-000001d0  01 ff 04 02 30 00 30 19  06 03 55 1d 0e 04 12 04  |....0.0...U.....|
-000001e0  10 9f 91 16 1f 43 43 3e  49 a6 de 6d b6 80 d7 9f  |.....CC>I..m....|
-000001f0  60 30 1b 06 03 55 1d 23  04 14 30 12 80 10 48 13  |`0...U.#..0...H.|
-00000200  49 4d 13 7e 16 31 bb a3  01 d5 ac ab 6e 7b 30 19  |IM.~.1......n{0.|
-00000210  06 03 55 1d 11 04 12 30  10 82 0e 65 78 61 6d 70  |..U....0...examp|
-00000220  6c 65 2e 67 6f 6c 61 6e  67 30 0d 06 09 2a 86 48  |le.golang0...*.H|
-00000230  86 f7 0d 01 01 0b 05 00  03 81 81 00 9d 30 cc 40  |.............0.@|
-00000240  2b 5b 50 a0 61 cb ba e5  53 58 e1 ed 83 28 a9 58  |+[P.a...SX...(.X|
-00000250  1a a9 38 a4 95 a1 ac 31  5a 1a 84 66 3d 43 d3 2d  |..8....1Z..f=C.-|
-00000260  d9 0b f2 97 df d3 20 64  38 92 24 3a 00 bc cf 9c  |...... d8.$:....|
-00000270  7d b7 40 20 01 5f aa d3  16 61 09 a2 76 fd 13 c3  |}.@ ._...a..v...|
-00000280  cc e1 0c 5c ee b1 87 82  f1 6c 04 ed 73 bb b3 43  |...\.....l..s..C|
-00000290  77 8d 0c 1c f1 0f a1 d8  40 83 61 c9 4c 72 2b 9d  |w.......@.a.Lr+.|
-000002a0  ae db 46 06 06 4d f4 c1  b3 3e c0 d1 bd 42 d4 db  |..F..M...>...B..|
-000002b0  fe 3d 13 60 84 5c 21 d3  3b e9 fa e7 16 03 03 00  |.=.`.\!.;.......|
-000002c0  cd 0c 00 00 c9 03 00 17  41 04 79 6a df 70 26 49  |........A.yj.p&I|
-000002d0  c0 5a 39 fc 7c 80 d1 2c  cd 76 d0 4c 6f a7 7d bc  |.Z9.|..,.v.Lo.}.|
-000002e0  32 c6 54 c6 76 58 e2 0f  3f 33 ad 92 61 33 11 16  |2.T.vX..?3..a3..|
-000002f0  d7 42 a8 ba 2a 8f 22 2a  eb 88 3e 74 78 2a 67 de  |.B..*."*..>tx*g.|
-00000300  39 75 63 2c 1d 2e da 33  77 a5 08 04 00 80 61 f5  |9uc,...3w.....a.|
-00000310  ed 56 5b f1 dd 78 a0 c4  8a 9b ac 28 c5 91 0c bd  |.V[..x.....(....|
-00000320  f1 d5 c1 f6 31 2e 8c c3  d5 84 3a 15 e8 6d f1 bc  |....1.....:..m..|
-00000330  9e a6 04 fd 95 2f 51 60  2f c6 ff 99 cf 38 24 bf  |...../Q`/....8$.|
-00000340  a4 32 a2 1f a1 6b bd 27  98 00 14 23 0d 12 66 67  |.2...k.'...#..fg|
-00000350  48 33 92 51 e7 e7 3c f5  ef 13 ca 46 3c 39 53 70  |H3.Q..<....F<9Sp|
-00000360  41 78 4a 02 70 87 48 ce  b0 31 02 33 0b 06 78 b9  |AxJ.p.H..1.3..x.|
-00000370  87 0b 07 e0 f7 15 c8 3e  27 a1 a3 20 24 9e 20 93  |.......>'.. $. .|
-00000380  7f b5 53 7b 18 88 96 87  2b df 02 ba 0c d8 16 03  |..S{....+.......|
-00000390  03 00 04 0e 00 00 00                              |.......|
+00000000  16 03 03 00 5d 02 00 00  59 03 03 a4 cd 94 7e 17  |....]...Y.....~.|
+00000010  86 6e 81 dc 58 f5 86 34  fc 66 25 77 df 05 e5 85  |.n..X..4.f%w....|
+00000020  98 2e b4 38 e3 54 98 93  f5 ef 9e 20 db e9 53 1a  |...8.T..... ..S.|
+00000030  67 e3 18 c1 64 66 4f 92  7f d6 44 42 a0 b3 04 d9  |g...dfO...DB....|
+00000040  c3 5f f2 6a 89 e6 fd e9  6d bf 2c a6 c0 2f 00 00  |._.j....m.,../..|
+00000050  11 ff 01 00 01 00 00 0b  00 04 03 00 01 02 00 17  |................|
+00000060  00 00 16 03 03 02 59 0b  00 02 55 00 02 52 00 02  |......Y...U..R..|
+00000070  4f 30 82 02 4b 30 82 01  b4 a0 03 02 01 02 02 09  |O0..K0..........|
+00000080  00 e8 f0 9d 3f e2 5b ea  a6 30 0d 06 09 2a 86 48  |....?.[..0...*.H|
+00000090  86 f7 0d 01 01 0b 05 00  30 1f 31 0b 30 09 06 03  |........0.1.0...|
+000000a0  55 04 0a 13 02 47 6f 31  10 30 0e 06 03 55 04 03  |U....Go1.0...U..|
+000000b0  13 07 47 6f 20 52 6f 6f  74 30 1e 17 0d 31 36 30  |..Go Root0...160|
+000000c0  31 30 31 30 30 30 30 30  30 5a 17 0d 32 35 30 31  |101000000Z..2501|
+000000d0  30 31 30 30 30 30 30 30  5a 30 1a 31 0b 30 09 06  |01000000Z0.1.0..|
+000000e0  03 55 04 0a 13 02 47 6f  31 0b 30 09 06 03 55 04  |.U....Go1.0...U.|
+000000f0  03 13 02 47 6f 30 81 9f  30 0d 06 09 2a 86 48 86  |...Go0..0...*.H.|
+00000100  f7 0d 01 01 01 05 00 03  81 8d 00 30 81 89 02 81  |...........0....|
+00000110  81 00 db 46 7d 93 2e 12  27 06 48 bc 06 28 21 ab  |...F}...'.H..(!.|
+00000120  7e c4 b6 a2 5d fe 1e 52  45 88 7a 36 47 a5 08 0d  |~...]..RE.z6G...|
+00000130  92 42 5b c2 81 c0 be 97  79 98 40 fb 4f 6d 14 fd  |.B[.....y.@.Om..|
+00000140  2b 13 8b c2 a5 2e 67 d8  d4 09 9e d6 22 38 b7 4a  |+.....g....."8.J|
+00000150  0b 74 73 2b c2 34 f1 d1  93 e5 96 d9 74 7b f3 58  |.ts+.4......t{.X|
+00000160  9f 6c 61 3c c0 b0 41 d4  d9 2b 2b 24 23 77 5b 1c  |.la<..A..++$#w[.|
+00000170  3b bd 75 5d ce 20 54 cf  a1 63 87 1d 1e 24 c4 f3  |;.u]. T..c...$..|
+00000180  1d 1a 50 8b aa b6 14 43  ed 97 a7 75 62 f4 14 c8  |..P....C...ub...|
+00000190  52 d7 02 03 01 00 01 a3  81 93 30 81 90 30 0e 06  |R.........0..0..|
+000001a0  03 55 1d 0f 01 01 ff 04  04 03 02 05 a0 30 1d 06  |.U...........0..|
+000001b0  03 55 1d 25 04 16 30 14  06 08 2b 06 01 05 05 07  |.U.%..0...+.....|
+000001c0  03 01 06 08 2b 06 01 05  05 07 03 02 30 0c 06 03  |....+.......0...|
+000001d0  55 1d 13 01 01 ff 04 02  30 00 30 19 06 03 55 1d  |U.......0.0...U.|
+000001e0  0e 04 12 04 10 9f 91 16  1f 43 43 3e 49 a6 de 6d  |.........CC>I..m|
+000001f0  b6 80 d7 9f 60 30 1b 06  03 55 1d 23 04 14 30 12  |....`0...U.#..0.|
+00000200  80 10 48 13 49 4d 13 7e  16 31 bb a3 01 d5 ac ab  |..H.IM.~.1......|
+00000210  6e 7b 30 19 06 03 55 1d  11 04 12 30 10 82 0e 65  |n{0...U....0...e|
+00000220  78 61 6d 70 6c 65 2e 67  6f 6c 61 6e 67 30 0d 06  |xample.golang0..|
+00000230  09 2a 86 48 86 f7 0d 01  01 0b 05 00 03 81 81 00  |.*.H............|
+00000240  9d 30 cc 40 2b 5b 50 a0  61 cb ba e5 53 58 e1 ed  |.0.@+[P.a...SX..|
+00000250  83 28 a9 58 1a a9 38 a4  95 a1 ac 31 5a 1a 84 66  |.(.X..8....1Z..f|
+00000260  3d 43 d3 2d d9 0b f2 97  df d3 20 64 38 92 24 3a  |=C.-...... d8.$:|
+00000270  00 bc cf 9c 7d b7 40 20  01 5f aa d3 16 61 09 a2  |....}.@ ._...a..|
+00000280  76 fd 13 c3 cc e1 0c 5c  ee b1 87 82 f1 6c 04 ed  |v......\.....l..|
+00000290  73 bb b3 43 77 8d 0c 1c  f1 0f a1 d8 40 83 61 c9  |s..Cw.......@.a.|
+000002a0  4c 72 2b 9d ae db 46 06  06 4d f4 c1 b3 3e c0 d1  |Lr+...F..M...>..|
+000002b0  bd 42 d4 db fe 3d 13 60  84 5c 21 d3 3b e9 fa e7  |.B...=.`.\!.;...|
+000002c0  16 03 03 00 cd 0c 00 00  c9 03 00 17 41 04 28 4d  |............A.(M|
+000002d0  03 04 41 d2 e5 04 f6 34  90 21 2e bc da 53 95 9d  |..A....4.!...S..|
+000002e0  2b 10 d8 b5 e2 e1 47 06  08 b7 7a 4a d4 13 3a f9  |+.....G...zJ..:.|
+000002f0  50 22 c0 fb 4e 13 b9 1f  b9 43 20 71 be b8 e1 9b  |P"..N....C q....|
+00000300  c8 6b 48 fb 80 22 87 8a  61 54 fb c1 7a 7e 08 04  |.kH.."..aT..z~..|
+00000310  00 80 86 09 16 06 8e 1c  c9 02 ec 9d d9 4d c0 d1  |.............M..|
+00000320  d1 d0 48 96 f6 31 4a 69  02 9e 27 26 ca ff bb 1e  |..H..1Ji..'&....|
+00000330  94 3b fb 41 fa 11 a5 cd  ec a7 a0 6f 4c 35 dc 7a  |.;.A.......oL5.z|
+00000340  fb fd c4 41 ab 5b ee 21  96 16 9d 42 8f ce b6 50  |...A.[.!...B...P|
+00000350  6a 48 9f 92 d2 00 70 53  30 c3 3d 5e a9 cb e3 f1  |jH....pS0.=^....|
+00000360  52 19 c8 1a 58 f5 19 9a  11 a2 ea 9d a2 29 5e b2  |R...X........)^.|
+00000370  ef bb c1 a6 c5 2c e4 33  2f 6d 60 ac 34 42 dc 42  |.....,.3/m`.4B.B|
+00000380  85 69 e3 c6 b8 2d af c4  37 8e b8 b6 39 4e 07 ff  |.i...-..7...9N..|
+00000390  88 d0 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 c1 90  |.....(..........|
-00000060  a0 8b 53 87 a8 e3 56 4c  5c ad 5f dc 00 af 29 5f  |..S...VL\._...)_|
-00000070  11 53 7d 49 25 f8 74 16  dc 84 5f 3b c6 24        |.S}I%.t..._;.$|
+00000050  01 16 03 03 00 28 00 00  00 00 00 00 00 00 e3 ce  |.....(..........|
+00000060  26 ff 24 7b cf 1a 6e 65  68 3d 56 ca 11 6c 7c a6  |&.${..neh=V..l|.|
+00000070  de 97 f1 f3 cd 04 4e 38  bd 0c 5b 08 1b dd        |......N8..[...|
 >>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 28 00 f9 b2 51 85  |..........(...Q.|
-00000010  72 7e ec 79 72 59 90 ae  69 51 79 61 10 3b 4e 4b  |r~.yrY..iQya.;NK|
-00000020  45 d6 a5 9a c0 1a 69 c9  9f 1c ee cd ad 6a e8 ea  |E.....i......j..|
-00000030  c4 9e f1                                          |...|
+00000000  14 03 03 00 01 01 16 03  03 00 28 38 ac 96 e8 6f  |..........(8...o|
+00000010  bc 22 ba 46 a9 64 f6 dc  19 79 5e 01 cd 50 db 9e  |.".F.d...y^..P..|
+00000020  98 23 19 2a f2 25 49 b9  f1 cb 63 c5 5e 32 85 c4  |.#.*.%I...c.^2..|
+00000030  e0 e5 16                                          |...|
 >>> Flow 5 (client to server)
-00000000  17 03 03 00 1e 00 00 00  00 00 00 00 01 86 5a 45  |..............ZE|
-00000010  24 60 90 dc bc b3 f6 61  6f db 60 02 99 f9 e2 93  |$`.....ao.`.....|
-00000020  07 85 0d 15 03 03 00 1a  00 00 00 00 00 00 00 02  |................|
-00000030  36 86 b0 60 b5 5d dd 28  64 c6 5b c7 ed 01 07 b1  |6..`.].(d.[.....|
-00000040  12 39                                             |.9|
+00000000  17 03 03 00 1e 00 00 00  00 00 00 00 01 b7 b1 9c  |................|
+00000010  5d 9f f1 b7 21 b3 30 00  9d 39 26 5f 6e 99 67 e8  |]...!.0..9&_n.g.|
+00000020  47 01 62 15 03 03 00 1a  00 00 00 00 00 00 00 02  |G.b.............|
+00000030  2a 2f 3f 76 2a 10 9b ee  c0 86 41 8a fe cf c5 70  |*/?v*.....A....p|
+00000040  c7 ac                                             |..|
diff --git a/src/crypto/tls/testdata/Client-TLSv12-RSA-RC4 b/src/crypto/tls/testdata/Client-TLSv12-RSA-RC4
index 12fb594..f995680 100644
--- a/src/crypto/tls/testdata/Client-TLSv12-RSA-RC4
+++ b/src/crypto/tls/testdata/Client-TLSv12-RSA-RC4
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fe 01 00 00  fa 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 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,59 +7,61 @@
 00000050  cc a8 c0 2b c0 2f c0 2c  c0 30 c0 09 c0 13 c0 0a  |...+./.,.0......|
 00000060  c0 14 00 9c 00 9d 00 2f  00 35 c0 12 00 0a c0 23  |......./.5.....#|
 00000070  c0 27 00 3c c0 07 c0 11  00 05 13 03 13 01 13 02  |.'.<............|
-00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
+00000080  01 00 00 7f 00 05 00 05  01 00 00 00 00 00 0a 00  |................|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
 000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
 000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
-000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
-000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
-000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
-000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
+000000c0  01 00 01 00 00 17 00 00  00 12 00 00 00 2b 00 09  |.............+..|
+000000d0  08 03 04 03 03 03 02 03  01 00 33 00 26 00 24 00  |..........3.&.$.|
+000000e0  1d 00 20 2f e5 7d a3 47  cd 62 43 15 28 da ac 5f  |.. /.}.G.bC.(.._|
+000000f0  bb 29 07 30 ff f6 84 af  c4 cf c2 ed 90 99 5f 58  |.).0.........._X|
+00000100  cb 3b 74                                          |.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 51 02 00 00  4d 03 03 b0 e7 ee 09 45  |....Q...M......E|
-00000010  36 f1 7a 92 be 9e d8 9d  ae cd c1 4e b2 12 94 3e  |6.z........N...>|
-00000020  6c 34 71 ed 5f e0 97 7f  25 e4 dd 20 f4 43 01 03  |l4q._...%.. .C..|
-00000030  88 33 26 7f 48 c1 f2 d1  4d d3 f8 1a bd 86 4c 50  |.3&.H...M.....LP|
-00000040  18 89 dc 08 99 f1 51 c5  84 be b9 fd 00 05 00 00  |......Q.........|
-00000050  05 ff 01 00 01 00 16 03  03 02 59 0b 00 02 55 00  |..........Y...U.|
-00000060  02 52 00 02 4f 30 82 02  4b 30 82 01 b4 a0 03 02  |.R..O0..K0......|
-00000070  01 02 02 09 00 e8 f0 9d  3f e2 5b ea a6 30 0d 06  |........?.[..0..|
-00000080  09 2a 86 48 86 f7 0d 01  01 0b 05 00 30 1f 31 0b  |.*.H........0.1.|
-00000090  30 09 06 03 55 04 0a 13  02 47 6f 31 10 30 0e 06  |0...U....Go1.0..|
-000000a0  03 55 04 03 13 07 47 6f  20 52 6f 6f 74 30 1e 17  |.U....Go Root0..|
-000000b0  0d 31 36 30 31 30 31 30  30 30 30 30 30 5a 17 0d  |.160101000000Z..|
-000000c0  32 35 30 31 30 31 30 30  30 30 30 30 5a 30 1a 31  |250101000000Z0.1|
-000000d0  0b 30 09 06 03 55 04 0a  13 02 47 6f 31 0b 30 09  |.0...U....Go1.0.|
-000000e0  06 03 55 04 03 13 02 47  6f 30 81 9f 30 0d 06 09  |..U....Go0..0...|
-000000f0  2a 86 48 86 f7 0d 01 01  01 05 00 03 81 8d 00 30  |*.H............0|
-00000100  81 89 02 81 81 00 db 46  7d 93 2e 12 27 06 48 bc  |.......F}...'.H.|
-00000110  06 28 21 ab 7e c4 b6 a2  5d fe 1e 52 45 88 7a 36  |.(!.~...]..RE.z6|
-00000120  47 a5 08 0d 92 42 5b c2  81 c0 be 97 79 98 40 fb  |G....B[.....y.@.|
-00000130  4f 6d 14 fd 2b 13 8b c2  a5 2e 67 d8 d4 09 9e d6  |Om..+.....g.....|
-00000140  22 38 b7 4a 0b 74 73 2b  c2 34 f1 d1 93 e5 96 d9  |"8.J.ts+.4......|
-00000150  74 7b f3 58 9f 6c 61 3c  c0 b0 41 d4 d9 2b 2b 24  |t{.X.la<..A..++$|
-00000160  23 77 5b 1c 3b bd 75 5d  ce 20 54 cf a1 63 87 1d  |#w[.;.u]. T..c..|
-00000170  1e 24 c4 f3 1d 1a 50 8b  aa b6 14 43 ed 97 a7 75  |.$....P....C...u|
-00000180  62 f4 14 c8 52 d7 02 03  01 00 01 a3 81 93 30 81  |b...R.........0.|
-00000190  90 30 0e 06 03 55 1d 0f  01 01 ff 04 04 03 02 05  |.0...U..........|
-000001a0  a0 30 1d 06 03 55 1d 25  04 16 30 14 06 08 2b 06  |.0...U.%..0...+.|
-000001b0  01 05 05 07 03 01 06 08  2b 06 01 05 05 07 03 02  |........+.......|
-000001c0  30 0c 06 03 55 1d 13 01  01 ff 04 02 30 00 30 19  |0...U.......0.0.|
-000001d0  06 03 55 1d 0e 04 12 04  10 9f 91 16 1f 43 43 3e  |..U..........CC>|
-000001e0  49 a6 de 6d b6 80 d7 9f  60 30 1b 06 03 55 1d 23  |I..m....`0...U.#|
-000001f0  04 14 30 12 80 10 48 13  49 4d 13 7e 16 31 bb a3  |..0...H.IM.~.1..|
-00000200  01 d5 ac ab 6e 7b 30 19  06 03 55 1d 11 04 12 30  |....n{0...U....0|
-00000210  10 82 0e 65 78 61 6d 70  6c 65 2e 67 6f 6c 61 6e  |...example.golan|
-00000220  67 30 0d 06 09 2a 86 48  86 f7 0d 01 01 0b 05 00  |g0...*.H........|
-00000230  03 81 81 00 9d 30 cc 40  2b 5b 50 a0 61 cb ba e5  |.....0.@+[P.a...|
-00000240  53 58 e1 ed 83 28 a9 58  1a a9 38 a4 95 a1 ac 31  |SX...(.X..8....1|
-00000250  5a 1a 84 66 3d 43 d3 2d  d9 0b f2 97 df d3 20 64  |Z..f=C.-...... d|
-00000260  38 92 24 3a 00 bc cf 9c  7d b7 40 20 01 5f aa d3  |8.$:....}.@ ._..|
-00000270  16 61 09 a2 76 fd 13 c3  cc e1 0c 5c ee b1 87 82  |.a..v......\....|
-00000280  f1 6c 04 ed 73 bb b3 43  77 8d 0c 1c f1 0f a1 d8  |.l..s..Cw.......|
-00000290  40 83 61 c9 4c 72 2b 9d  ae db 46 06 06 4d f4 c1  |@.a.Lr+...F..M..|
-000002a0  b3 3e c0 d1 bd 42 d4 db  fe 3d 13 60 84 5c 21 d3  |.>...B...=.`.\!.|
-000002b0  3b e9 fa e7 16 03 03 00  04 0e 00 00 00           |;............|
+00000000  16 03 03 00 55 02 00 00  51 03 03 d4 a4 5a fb c9  |....U...Q....Z..|
+00000010  93 ee 7e 5a c4 04 8e bb  72 da ad a4 0f 9c 0f 6e  |..~Z....r......n|
+00000020  2b 28 9a ef 28 be d4 49  9b 50 56 20 f8 5a e3 7b  |+(..(..I.PV .Z.{|
+00000030  c7 96 74 ff 52 4f 68 32  08 15 2b 46 ad 47 3e 49  |..t.ROh2..+F.G>I|
+00000040  f9 a7 f8 65 78 fe 01 c0  8f ab 8e 14 00 05 00 00  |...ex...........|
+00000050  09 ff 01 00 01 00 00 17  00 00 16 03 03 02 59 0b  |..............Y.|
+00000060  00 02 55 00 02 52 00 02  4f 30 82 02 4b 30 82 01  |..U..R..O0..K0..|
+00000070  b4 a0 03 02 01 02 02 09  00 e8 f0 9d 3f e2 5b ea  |............?.[.|
+00000080  a6 30 0d 06 09 2a 86 48  86 f7 0d 01 01 0b 05 00  |.0...*.H........|
+00000090  30 1f 31 0b 30 09 06 03  55 04 0a 13 02 47 6f 31  |0.1.0...U....Go1|
+000000a0  10 30 0e 06 03 55 04 03  13 07 47 6f 20 52 6f 6f  |.0...U....Go Roo|
+000000b0  74 30 1e 17 0d 31 36 30  31 30 31 30 30 30 30 30  |t0...16010100000|
+000000c0  30 5a 17 0d 32 35 30 31  30 31 30 30 30 30 30 30  |0Z..250101000000|
+000000d0  5a 30 1a 31 0b 30 09 06  03 55 04 0a 13 02 47 6f  |Z0.1.0...U....Go|
+000000e0  31 0b 30 09 06 03 55 04  03 13 02 47 6f 30 81 9f  |1.0...U....Go0..|
+000000f0  30 0d 06 09 2a 86 48 86  f7 0d 01 01 01 05 00 03  |0...*.H.........|
+00000100  81 8d 00 30 81 89 02 81  81 00 db 46 7d 93 2e 12  |...0.......F}...|
+00000110  27 06 48 bc 06 28 21 ab  7e c4 b6 a2 5d fe 1e 52  |'.H..(!.~...]..R|
+00000120  45 88 7a 36 47 a5 08 0d  92 42 5b c2 81 c0 be 97  |E.z6G....B[.....|
+00000130  79 98 40 fb 4f 6d 14 fd  2b 13 8b c2 a5 2e 67 d8  |y.@.Om..+.....g.|
+00000140  d4 09 9e d6 22 38 b7 4a  0b 74 73 2b c2 34 f1 d1  |...."8.J.ts+.4..|
+00000150  93 e5 96 d9 74 7b f3 58  9f 6c 61 3c c0 b0 41 d4  |....t{.X.la<..A.|
+00000160  d9 2b 2b 24 23 77 5b 1c  3b bd 75 5d ce 20 54 cf  |.++$#w[.;.u]. T.|
+00000170  a1 63 87 1d 1e 24 c4 f3  1d 1a 50 8b aa b6 14 43  |.c...$....P....C|
+00000180  ed 97 a7 75 62 f4 14 c8  52 d7 02 03 01 00 01 a3  |...ub...R.......|
+00000190  81 93 30 81 90 30 0e 06  03 55 1d 0f 01 01 ff 04  |..0..0...U......|
+000001a0  04 03 02 05 a0 30 1d 06  03 55 1d 25 04 16 30 14  |.....0...U.%..0.|
+000001b0  06 08 2b 06 01 05 05 07  03 01 06 08 2b 06 01 05  |..+.........+...|
+000001c0  05 07 03 02 30 0c 06 03  55 1d 13 01 01 ff 04 02  |....0...U.......|
+000001d0  30 00 30 19 06 03 55 1d  0e 04 12 04 10 9f 91 16  |0.0...U.........|
+000001e0  1f 43 43 3e 49 a6 de 6d  b6 80 d7 9f 60 30 1b 06  |.CC>I..m....`0..|
+000001f0  03 55 1d 23 04 14 30 12  80 10 48 13 49 4d 13 7e  |.U.#..0...H.IM.~|
+00000200  16 31 bb a3 01 d5 ac ab  6e 7b 30 19 06 03 55 1d  |.1......n{0...U.|
+00000210  11 04 12 30 10 82 0e 65  78 61 6d 70 6c 65 2e 67  |...0...example.g|
+00000220  6f 6c 61 6e 67 30 0d 06  09 2a 86 48 86 f7 0d 01  |olang0...*.H....|
+00000230  01 0b 05 00 03 81 81 00  9d 30 cc 40 2b 5b 50 a0  |.........0.@+[P.|
+00000240  61 cb ba e5 53 58 e1 ed  83 28 a9 58 1a a9 38 a4  |a...SX...(.X..8.|
+00000250  95 a1 ac 31 5a 1a 84 66  3d 43 d3 2d d9 0b f2 97  |...1Z..f=C.-....|
+00000260  df d3 20 64 38 92 24 3a  00 bc cf 9c 7d b7 40 20  |.. d8.$:....}.@ |
+00000270  01 5f aa d3 16 61 09 a2  76 fd 13 c3 cc e1 0c 5c  |._...a..v......\|
+00000280  ee b1 87 82 f1 6c 04 ed  73 bb b3 43 77 8d 0c 1c  |.....l..s..Cw...|
+00000290  f1 0f a1 d8 40 83 61 c9  4c 72 2b 9d ae db 46 06  |....@.a.Lr+...F.|
+000002a0  06 4d f4 c1 b3 3e c0 d1  bd 42 d4 db fe 3d 13 60  |.M...>...B...=.`|
+000002b0  84 5c 21 d3 3b e9 fa e7  16 03 03 00 04 0e 00 00  |.\!.;...........|
+000002c0  00                                                |.|
 >>> Flow 3 (client to server)
 00000000  16 03 03 00 86 10 00 00  82 00 80 b9 65 8d bf a7  |............e...|
 00000010  c8 4b 79 ce 6f cb 8b 13  1c ac b9 7d 66 5e e9 ba  |.Ky.o......}f^..|
@@ -70,15 +72,15 @@
 00000060  c5 70 0f 08 83 48 e9 48  ef 6e 50 8b 05 7e e5 84  |.p...H.H.nP..~..|
 00000070  25 fa 55 c7 ae 31 02 27  00 ef 3f 98 86 20 12 89  |%.U..1.'..?.. ..|
 00000080  91 59 28 b4 f7 d7 af d2  69 61 35 14 03 03 00 01  |.Y(.....ia5.....|
-00000090  01 16 03 03 00 24 08 65  01 80 0d 59 b8 ac 0f 09  |.....$.e...Y....|
-000000a0  bf 61 31 32 e0 74 e9 f4  72 e3 2c 79 11 4d b2 a2  |.a12.t..r.,y.M..|
-000000b0  55 65 94 c8 cd 0a 61 99  07 b8                    |Ue....a...|
+00000090  01 16 03 03 00 24 f7 3b  92 e7 9f 80 de 5b d4 9e  |.....$.;.....[..|
+000000a0  d3 02 d3 d9 2c e1 74 2e  98 90 fe d9 ee 08 57 28  |....,.t.......W(|
+000000b0  47 99 86 84 f5 95 c5 a6  7f 82                    |G.........|
 >>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 24 04 20 46 cd fb  |..........$. F..|
-00000010  6c 46 9c 47 21 03 fe 9b  a4 c6 da 2c 71 2f db 92  |lF.G!......,q/..|
-00000020  40 da 7d 46 2e e4 9c 81  86 89 7f 53 46 91 28     |@.}F.......SF.(|
+00000000  14 03 03 00 01 01 16 03  03 00 24 c9 09 6c e8 0b  |..........$..l..|
+00000010  44 56 62 ed 1f f1 ef 9d  a9 cd a4 49 01 0d 2b e3  |DVb........I..+.|
+00000020  8f 3d 31 6d bf c5 63 af  d4 59 30 47 c6 cd 20     |.=1m..c..Y0G.. |
 >>> Flow 5 (client to server)
-00000000  17 03 03 00 1a 89 2b 2e  49 21 19 b7 d0 df 85 da  |......+.I!......|
-00000010  b8 a7 f3 73 5f fe 44 e5  0c a1 af 16 74 93 bc 15  |...s_.D.....t...|
-00000020  03 03 00 16 5f 9e 64 d0  91 50 34 44 cf f6 1f e0  |...._.d..P4D....|
-00000030  e0 13 b9 67 da 5c 99 16  f1 b3                    |...g.\....|
+00000000  17 03 03 00 1a 65 05 a9  14 f7 fd 4e e1 68 20 7e  |.....e.....N.h ~|
+00000010  32 79 ca e6 e7 79 a3 d6  ce fd 28 37 c7 e2 c5 15  |2y...y....(7....|
+00000020  03 03 00 16 87 82 bc 62  e3 c0 4d 2e 75 86 21 05  |.......b..M.u.!.|
+00000030  c0 3d 40 d4 1d fc 1b 42  ef 55                    |.=@....B.U|
diff --git a/src/crypto/tls/testdata/Client-TLSv12-RenegotiateOnce b/src/crypto/tls/testdata/Client-TLSv12-RenegotiateOnce
index 06752de..30db289 100644
--- a/src/crypto/tls/testdata/Client-TLSv12-RenegotiateOnce
+++ b/src/crypto/tls/testdata/Client-TLSv12-RenegotiateOnce
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fe 01 00 00  fa 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 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,238 +7,240 @@
 00000050  cc a8 c0 2b c0 2f c0 2c  c0 30 c0 09 c0 13 c0 0a  |...+./.,.0......|
 00000060  c0 14 00 9c 00 9d 00 2f  00 35 c0 12 00 0a c0 23  |......./.5.....#|
 00000070  c0 27 00 3c c0 07 c0 11  00 05 13 03 13 01 13 02  |.'.<............|
-00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
+00000080  01 00 00 7f 00 05 00 05  01 00 00 00 00 00 0a 00  |................|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
 000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
 000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
-000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
-000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
-000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
-000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
+000000c0  01 00 01 00 00 17 00 00  00 12 00 00 00 2b 00 09  |.............+..|
+000000d0  08 03 04 03 03 03 02 03  01 00 33 00 26 00 24 00  |..........3.&.$.|
+000000e0  1d 00 20 2f e5 7d a3 47  cd 62 43 15 28 da ac 5f  |.. /.}.G.bC.(.._|
+000000f0  bb 29 07 30 ff f6 84 af  c4 cf c2 ed 90 99 5f 58  |.).0.........._X|
+00000100  cb 3b 74                                          |.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 59 02 00 00  55 03 03 5b 4b bb c4 39  |....Y...U..[K..9|
-00000010  fb 45 5c 54 03 30 0f 71  c3 2e 48 25 33 fd 6d 40  |.E\T.0.q..H%3.m@|
-00000020  18 6e 75 43 66 9e 08 fb  6a a1 f8 20 34 3c c4 2a  |.nuCf...j.. 4<.*|
-00000030  b5 9b 65 b0 cd b9 fc ce  cf 51 f8 cc a1 5d 00 ed  |..e......Q...]..|
-00000040  49 5b 43 9a ff c4 cf 6b  d8 2a ea e5 cc a8 00 00  |I[C....k.*......|
-00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
-00000060  03 02 59 0b 00 02 55 00  02 52 00 02 4f 30 82 02  |..Y...U..R..O0..|
-00000070  4b 30 82 01 b4 a0 03 02  01 02 02 09 00 e8 f0 9d  |K0..............|
-00000080  3f e2 5b ea a6 30 0d 06  09 2a 86 48 86 f7 0d 01  |?.[..0...*.H....|
-00000090  01 0b 05 00 30 1f 31 0b  30 09 06 03 55 04 0a 13  |....0.1.0...U...|
-000000a0  02 47 6f 31 10 30 0e 06  03 55 04 03 13 07 47 6f  |.Go1.0...U....Go|
-000000b0  20 52 6f 6f 74 30 1e 17  0d 31 36 30 31 30 31 30  | Root0...1601010|
-000000c0  30 30 30 30 30 5a 17 0d  32 35 30 31 30 31 30 30  |00000Z..25010100|
-000000d0  30 30 30 30 5a 30 1a 31  0b 30 09 06 03 55 04 0a  |0000Z0.1.0...U..|
-000000e0  13 02 47 6f 31 0b 30 09  06 03 55 04 03 13 02 47  |..Go1.0...U....G|
-000000f0  6f 30 81 9f 30 0d 06 09  2a 86 48 86 f7 0d 01 01  |o0..0...*.H.....|
-00000100  01 05 00 03 81 8d 00 30  81 89 02 81 81 00 db 46  |.......0.......F|
-00000110  7d 93 2e 12 27 06 48 bc  06 28 21 ab 7e c4 b6 a2  |}...'.H..(!.~...|
-00000120  5d fe 1e 52 45 88 7a 36  47 a5 08 0d 92 42 5b c2  |]..RE.z6G....B[.|
-00000130  81 c0 be 97 79 98 40 fb  4f 6d 14 fd 2b 13 8b c2  |....y.@.Om..+...|
-00000140  a5 2e 67 d8 d4 09 9e d6  22 38 b7 4a 0b 74 73 2b  |..g....."8.J.ts+|
-00000150  c2 34 f1 d1 93 e5 96 d9  74 7b f3 58 9f 6c 61 3c  |.4......t{.X.la<|
-00000160  c0 b0 41 d4 d9 2b 2b 24  23 77 5b 1c 3b bd 75 5d  |..A..++$#w[.;.u]|
-00000170  ce 20 54 cf a1 63 87 1d  1e 24 c4 f3 1d 1a 50 8b  |. T..c...$....P.|
-00000180  aa b6 14 43 ed 97 a7 75  62 f4 14 c8 52 d7 02 03  |...C...ub...R...|
-00000190  01 00 01 a3 81 93 30 81  90 30 0e 06 03 55 1d 0f  |......0..0...U..|
-000001a0  01 01 ff 04 04 03 02 05  a0 30 1d 06 03 55 1d 25  |.........0...U.%|
-000001b0  04 16 30 14 06 08 2b 06  01 05 05 07 03 01 06 08  |..0...+.........|
-000001c0  2b 06 01 05 05 07 03 02  30 0c 06 03 55 1d 13 01  |+.......0...U...|
-000001d0  01 ff 04 02 30 00 30 19  06 03 55 1d 0e 04 12 04  |....0.0...U.....|
-000001e0  10 9f 91 16 1f 43 43 3e  49 a6 de 6d b6 80 d7 9f  |.....CC>I..m....|
-000001f0  60 30 1b 06 03 55 1d 23  04 14 30 12 80 10 48 13  |`0...U.#..0...H.|
-00000200  49 4d 13 7e 16 31 bb a3  01 d5 ac ab 6e 7b 30 19  |IM.~.1......n{0.|
-00000210  06 03 55 1d 11 04 12 30  10 82 0e 65 78 61 6d 70  |..U....0...examp|
-00000220  6c 65 2e 67 6f 6c 61 6e  67 30 0d 06 09 2a 86 48  |le.golang0...*.H|
-00000230  86 f7 0d 01 01 0b 05 00  03 81 81 00 9d 30 cc 40  |.............0.@|
-00000240  2b 5b 50 a0 61 cb ba e5  53 58 e1 ed 83 28 a9 58  |+[P.a...SX...(.X|
-00000250  1a a9 38 a4 95 a1 ac 31  5a 1a 84 66 3d 43 d3 2d  |..8....1Z..f=C.-|
-00000260  d9 0b f2 97 df d3 20 64  38 92 24 3a 00 bc cf 9c  |...... d8.$:....|
-00000270  7d b7 40 20 01 5f aa d3  16 61 09 a2 76 fd 13 c3  |}.@ ._...a..v...|
-00000280  cc e1 0c 5c ee b1 87 82  f1 6c 04 ed 73 bb b3 43  |...\.....l..s..C|
-00000290  77 8d 0c 1c f1 0f a1 d8  40 83 61 c9 4c 72 2b 9d  |w.......@.a.Lr+.|
-000002a0  ae db 46 06 06 4d f4 c1  b3 3e c0 d1 bd 42 d4 db  |..F..M...>...B..|
-000002b0  fe 3d 13 60 84 5c 21 d3  3b e9 fa e7 16 03 03 00  |.=.`.\!.;.......|
-000002c0  ac 0c 00 00 a8 03 00 1d  20 76 c4 f4 ec a2 d6 c1  |........ v......|
-000002d0  b1 d8 b0 41 71 8a ee e9  8a 17 06 90 6b 0c 05 66  |...Aq.......k..f|
-000002e0  54 d8 a6 ad 50 95 11 f0  03 08 04 00 80 46 0b da  |T...P........F..|
-000002f0  0b 0c 6c 1a 2e a2 7e 28  40 1b 40 9a b4 5c 36 88  |..l...~(@.@..\6.|
-00000300  c1 ad cd 45 be 23 17 a6  98 e5 11 fe a8 78 c6 21  |...E.#.......x.!|
-00000310  17 a6 a8 7d ce 28 c4 ef  51 76 f8 b1 b1 75 31 04  |...}.(..Qv...u1.|
-00000320  b9 14 bc 3b bf 59 50 b8  e1 ad c6 86 45 3c e1 70  |...;.YP.....E<.p|
-00000330  fb cd 69 8c 0a 5f f6 2d  bd 10 95 30 ed 4c 9a 47  |..i.._.-...0.L.G|
-00000340  73 8b 39 72 00 0a 7e 8f  a9 42 27 01 6f 3d 37 f9  |s.9r..~..B'.o=7.|
-00000350  7d d4 1b a2 6a 07 37 dc  5e 6c 8b b1 d5 75 3a 9b  |}...j.7.^l...u:.|
-00000360  d1 45 c5 d8 e0 90 f0 62  3d d5 01 00 9e 16 03 03  |.E.....b=.......|
-00000370  00 04 0e 00 00 00                                 |......|
+00000000  16 03 03 00 5d 02 00 00  59 03 03 6d a7 e6 c4 60  |....]...Y..m...`|
+00000010  8e dd 95 85 14 dc 69 2b  d5 16 35 dd 4f a1 43 d4  |......i+..5.O.C.|
+00000020  3c 8f 0f 55 4b f1 86 68  51 5b 17 20 d8 44 06 84  |<..UK..hQ[. .D..|
+00000030  d5 1d 9b ed 45 25 d0 e8  a2 73 fd 44 01 fa 38 63  |....E%...s.D..8c|
+00000040  c3 18 35 1c b8 54 ec 78  ab 5f 3d f3 cc a8 00 00  |..5..T.x._=.....|
+00000050  11 ff 01 00 01 00 00 0b  00 04 03 00 01 02 00 17  |................|
+00000060  00 00 16 03 03 02 59 0b  00 02 55 00 02 52 00 02  |......Y...U..R..|
+00000070  4f 30 82 02 4b 30 82 01  b4 a0 03 02 01 02 02 09  |O0..K0..........|
+00000080  00 e8 f0 9d 3f e2 5b ea  a6 30 0d 06 09 2a 86 48  |....?.[..0...*.H|
+00000090  86 f7 0d 01 01 0b 05 00  30 1f 31 0b 30 09 06 03  |........0.1.0...|
+000000a0  55 04 0a 13 02 47 6f 31  10 30 0e 06 03 55 04 03  |U....Go1.0...U..|
+000000b0  13 07 47 6f 20 52 6f 6f  74 30 1e 17 0d 31 36 30  |..Go Root0...160|
+000000c0  31 30 31 30 30 30 30 30  30 5a 17 0d 32 35 30 31  |101000000Z..2501|
+000000d0  30 31 30 30 30 30 30 30  5a 30 1a 31 0b 30 09 06  |01000000Z0.1.0..|
+000000e0  03 55 04 0a 13 02 47 6f  31 0b 30 09 06 03 55 04  |.U....Go1.0...U.|
+000000f0  03 13 02 47 6f 30 81 9f  30 0d 06 09 2a 86 48 86  |...Go0..0...*.H.|
+00000100  f7 0d 01 01 01 05 00 03  81 8d 00 30 81 89 02 81  |...........0....|
+00000110  81 00 db 46 7d 93 2e 12  27 06 48 bc 06 28 21 ab  |...F}...'.H..(!.|
+00000120  7e c4 b6 a2 5d fe 1e 52  45 88 7a 36 47 a5 08 0d  |~...]..RE.z6G...|
+00000130  92 42 5b c2 81 c0 be 97  79 98 40 fb 4f 6d 14 fd  |.B[.....y.@.Om..|
+00000140  2b 13 8b c2 a5 2e 67 d8  d4 09 9e d6 22 38 b7 4a  |+.....g....."8.J|
+00000150  0b 74 73 2b c2 34 f1 d1  93 e5 96 d9 74 7b f3 58  |.ts+.4......t{.X|
+00000160  9f 6c 61 3c c0 b0 41 d4  d9 2b 2b 24 23 77 5b 1c  |.la<..A..++$#w[.|
+00000170  3b bd 75 5d ce 20 54 cf  a1 63 87 1d 1e 24 c4 f3  |;.u]. T..c...$..|
+00000180  1d 1a 50 8b aa b6 14 43  ed 97 a7 75 62 f4 14 c8  |..P....C...ub...|
+00000190  52 d7 02 03 01 00 01 a3  81 93 30 81 90 30 0e 06  |R.........0..0..|
+000001a0  03 55 1d 0f 01 01 ff 04  04 03 02 05 a0 30 1d 06  |.U...........0..|
+000001b0  03 55 1d 25 04 16 30 14  06 08 2b 06 01 05 05 07  |.U.%..0...+.....|
+000001c0  03 01 06 08 2b 06 01 05  05 07 03 02 30 0c 06 03  |....+.......0...|
+000001d0  55 1d 13 01 01 ff 04 02  30 00 30 19 06 03 55 1d  |U.......0.0...U.|
+000001e0  0e 04 12 04 10 9f 91 16  1f 43 43 3e 49 a6 de 6d  |.........CC>I..m|
+000001f0  b6 80 d7 9f 60 30 1b 06  03 55 1d 23 04 14 30 12  |....`0...U.#..0.|
+00000200  80 10 48 13 49 4d 13 7e  16 31 bb a3 01 d5 ac ab  |..H.IM.~.1......|
+00000210  6e 7b 30 19 06 03 55 1d  11 04 12 30 10 82 0e 65  |n{0...U....0...e|
+00000220  78 61 6d 70 6c 65 2e 67  6f 6c 61 6e 67 30 0d 06  |xample.golang0..|
+00000230  09 2a 86 48 86 f7 0d 01  01 0b 05 00 03 81 81 00  |.*.H............|
+00000240  9d 30 cc 40 2b 5b 50 a0  61 cb ba e5 53 58 e1 ed  |.0.@+[P.a...SX..|
+00000250  83 28 a9 58 1a a9 38 a4  95 a1 ac 31 5a 1a 84 66  |.(.X..8....1Z..f|
+00000260  3d 43 d3 2d d9 0b f2 97  df d3 20 64 38 92 24 3a  |=C.-...... d8.$:|
+00000270  00 bc cf 9c 7d b7 40 20  01 5f aa d3 16 61 09 a2  |....}.@ ._...a..|
+00000280  76 fd 13 c3 cc e1 0c 5c  ee b1 87 82 f1 6c 04 ed  |v......\.....l..|
+00000290  73 bb b3 43 77 8d 0c 1c  f1 0f a1 d8 40 83 61 c9  |s..Cw.......@.a.|
+000002a0  4c 72 2b 9d ae db 46 06  06 4d f4 c1 b3 3e c0 d1  |Lr+...F..M...>..|
+000002b0  bd 42 d4 db fe 3d 13 60  84 5c 21 d3 3b e9 fa e7  |.B...=.`.\!.;...|
+000002c0  16 03 03 00 ac 0c 00 00  a8 03 00 1d 20 f1 ac a3  |............ ...|
+000002d0  08 ba 9d 89 8e 71 c3 db  b1 46 f0 ac 2f 32 13 ad  |.....q...F../2..|
+000002e0  f7 42 ee b5 9f e5 5c 52  46 0a 9a 53 75 08 04 00  |.B....\RF..Su...|
+000002f0  80 89 8c 5b cd e9 fe 7f  6b 15 36 bc d7 43 ed f3  |...[....k.6..C..|
+00000300  96 df 69 7c 65 26 f8 68  4f 5b fb 53 75 2c 5a 65  |..i|e&.hO[.Su,Ze|
+00000310  4d b4 7b c5 bd 36 71 ea  43 bb 84 ec f3 8f 6b 49  |M.{..6q.C.....kI|
+00000320  26 cb fa c1 4c 8b 92 e1  91 ed 09 61 7d 85 44 ea  |&...L......a}.D.|
+00000330  a7 1c a4 47 02 d2 b4 c0  bf 44 14 e8 03 64 8d 86  |...G.....D...d..|
+00000340  80 5c 63 eb ab a0 66 ca  30 2e d7 04 54 d8 91 94  |.\c...f.0...T...|
+00000350  37 e8 6c b8 00 a0 06 98  5c 67 c2 46 a2 e9 5c b8  |7.l.....\g.F..\.|
+00000360  66 46 b8 82 65 22 29 80  b8 af 50 37 5c 00 96 a5  |fF..e")...P7\...|
+00000370  85 16 03 03 00 04 0e 00  00 00                    |..........|
 >>> Flow 3 (client to server)
 00000000  16 03 03 00 25 10 00 00  21 20 2f e5 7d a3 47 cd  |....%...! /.}.G.|
 00000010  62 43 15 28 da ac 5f bb  29 07 30 ff f6 84 af c4  |bC.(.._.).0.....|
 00000020  cf c2 ed 90 99 5f 58 cb  3b 74 14 03 03 00 01 01  |....._X.;t......|
-00000030  16 03 03 00 20 bb f4 78  64 23 f7 31 50 42 3d 97  |.... ..xd#.1PB=.|
-00000040  8f 73 89 b9 90 8f 74 b6  e4 7d 58 27 65 25 59 8a  |.s....t..}X'e%Y.|
-00000050  5a 8d 8f fa bd                                    |Z....|
+00000030  16 03 03 00 20 ca 08 57  0f 80 64 62 ad 11 01 27  |.... ..W..db...'|
+00000040  39 d8 80 6c a6 05 f6 75  a1 b6 0d 72 c0 25 f7 bc  |9..l...u...r.%..|
+00000050  f0 de 76 ee 29                                    |..v.)|
 >>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 20 0a 43 74 53 47  |.......... .CtSG|
-00000010  41 4b 0a f1 f7 75 51 a9  22 c9 e0 5c 53 90 6b d7  |AK...uQ."..\S.k.|
-00000020  97 18 c6 ef c3 85 32 f5  7c 26 97                 |......2.|&.|
+00000000  14 03 03 00 01 01 16 03  03 00 20 27 45 9d b0 c3  |.......... 'E...|
+00000010  18 c6 34 cb 1a 38 33 ac  91 4f f1 e5 d5 02 ed 62  |..4..83..O.....b|
+00000020  c0 46 1e a0 4a b3 46 35  2e e1 a2                 |.F..J.F5...|
 >>> Flow 5 (client to server)
-00000000  17 03 03 00 16 8e 83 1a  32 53 02 1c fa 84 89 4f  |........2S.....O|
-00000010  25 fb 5f 85 4f bd ee ae  9f 0f ea                 |%._.O......|
+00000000  17 03 03 00 16 50 48 06  41 d8 9d 1b e9 8b 55 9b  |.....PH.A.....U.|
+00000010  3c ba ea 58 93 5b 56 17  6e 94 18                 |<..X.[V.n..|
 >>> Flow 6 (server to client)
-00000000  16 03 03 00 14 96 76 32  c4 6d e6 23 bf 21 a8 09  |......v2.m.#.!..|
-00000010  a3 8b 69 98 cd c3 c9 ce  73                       |..i.....s|
+00000000  16 03 03 00 14 4c 65 ba  49 aa 53 4c 73 0a 51 ac  |.....Le.I.SLs.Q.|
+00000010  43 0d 4c 1f 83 6b d9 b1  06                       |C.L..k...|
 >>> Flow 7 (client to server)
-00000000  16 03 03 01 16 72 5b d9  30 b2 b0 91 e2 3d 2b 12  |.....r[.0....=+.|
-00000010  2c c9 43 f1 67 ae 54 ee  ce a1 15 12 12 9a 27 46  |,.C.g.T.......'F|
-00000020  7e 47 90 d4 f2 7d b9 98  ec f8 61 b8 84 52 9f 21  |~G...}....a..R.!|
-00000030  c1 83 6a ce 1a 68 fc 5b  25 42 f3 8f 55 ee 92 45  |..j..h.[%B..U..E|
-00000040  af a4 d1 c4 a6 b5 0e 58  3d 70 76 98 ec 47 af 6f  |.......X=pv..G.o|
-00000050  e3 4f 9f ef 52 a3 aa 33  75 83 f6 57 33 a8 dc f5  |.O..R..3u..W3...|
-00000060  36 49 09 1c 72 31 c1 43  52 64 4a b5 ca ce 06 f5  |6I..r1.CRdJ.....|
-00000070  91 18 90 85 f0 c9 96 4f  bf 4c de 9e 50 a2 1c de  |.......O.L..P...|
-00000080  86 51 1f 0b 73 e1 df 1d  2d 90 6d 7f a2 f1 28 e8  |.Q..s...-.m...(.|
-00000090  5f 2a 78 2d 8e ab f2 05  19 85 4e 92 a8 cf cd 16  |_*x-......N.....|
-000000a0  1e df 1d 51 ee 8b ba 72  cd ac d2 01 4b 84 46 62  |...Q...r....K.Fb|
-000000b0  1c 28 4d 3f 44 c1 62 12  13 4f f8 73 f4 da c0 98  |.(M?D.b..O.s....|
-000000c0  14 da 31 6a 48 0d 1d bb  24 6c ef 0f 98 c0 3c 86  |..1jH...$l....<.|
-000000d0  c6 d6 8e ab bd 20 bd 06  e9 ba aa ce 3a 88 25 95  |..... ......:.%.|
-000000e0  54 15 fb c6 49 c7 98 ff  27 92 c0 60 6a 3c f8 26  |T...I...'..`j<.&|
-000000f0  fd 28 ac c4 8f 5c 4f 15  24 10 45 3c 07 3d 3f 50  |.(...\O.$.E<.=?P|
-00000100  e5 db cf 78 bd b0 d2 24  a2 4b 3e a6 9c 2d 3b 0d  |...x...$.K>..-;.|
-00000110  d8 1b 86 88 dc 0c 3c 9c  16 cf ea                 |......<....|
+00000000  16 03 03 01 1a fd 7a 4e  2b 7b 8a 07 cc cb 5b 82  |......zN+{....[.|
+00000010  df d1 00 69 f8 6f 89 28  4b 91 87 c8 18 20 ec 41  |...i.o.(K.... .A|
+00000020  ec c7 bd 04 3d 02 a5 42  fe e1 23 cc 20 aa 22 e8  |....=..B..#. .".|
+00000030  31 2e 09 a3 ac c1 3d 04  29 2e 82 1c 31 27 8e e2  |1.....=.)...1'..|
+00000040  50 de ca 3d 4d ad 7e 01  74 94 40 3d 7c 2d 08 56  |P..=M.~.t.@=|-.V|
+00000050  d2 89 7b 3a b8 2a b1 34  22 65 25 48 bb 24 1b 4b  |..{:.*.4"e%H.$.K|
+00000060  a2 96 a8 7f ac f2 46 84  4f e2 c8 1c 25 41 eb df  |......F.O...%A..|
+00000070  52 ec 9b bd 89 b8 a8 c3  62 f2 75 16 de 61 63 b0  |R.......b.u..ac.|
+00000080  70 9c d2 c5 b0 86 6b 2a  17 64 9a d1 6d 5c e9 48  |p.....k*.d..m\.H|
+00000090  f5 02 e3 0f 16 df f9 6e  99 56 93 85 2b 10 bc da  |.......n.V..+...|
+000000a0  6e 02 8b 94 ac d2 dc 56  93 ad 8b 1d d6 ff e3 d9  |n......V........|
+000000b0  f8 ee 11 15 c7 e4 ae 4d  fe 88 0c c9 7f 30 1a 2a  |.......M.....0.*|
+000000c0  99 ab f8 0d a2 a9 57 87  35 a4 a9 87 b0 4f 46 8a  |......W.5....OF.|
+000000d0  ec 47 39 32 a7 94 3a 15  08 80 e5 1e 81 4b cd 2e  |.G92..:......K..|
+000000e0  76 9d 99 5b 86 89 37 09  a0 08 86 6e bb 67 ad 3f  |v..[..7....n.g.?|
+000000f0  a2 e9 1f 37 75 4b 0f 07  8c f3 e7 34 05 74 33 a9  |...7uK.....4.t3.|
+00000100  5a e3 5b 0e 68 d0 54 e4  24 c9 6c 42 2d 81 8f 29  |Z.[.h.T.$.lB-..)|
+00000110  17 97 3d a8 00 00 27 50  ae 5d 97 6d fa 7e c0     |..=...'P.].m.~.|
 >>> Flow 8 (server to client)
-00000000  16 03 03 00 81 2e c9 cd  ad df 75 cf b6 8d 7f 8c  |..........u.....|
-00000010  c6 bb 5b e6 2b 40 a0 36  45 13 ae 93 f1 04 bf f3  |..[.+@.6E.......|
-00000020  62 bd c8 62 d9 cf 05 a3  4c e9 37 af 35 a6 83 8e  |b..b....L.7.5...|
-00000030  71 46 b8 2a 5b 02 3b 81  d5 15 b8 17 72 c4 1e 00  |qF.*[.;.....r...|
-00000040  78 d9 4a 04 a7 b3 5b 80  bd 1f 88 ba fa 22 b5 0e  |x.J...[......"..|
-00000050  ca 44 55 27 c0 67 ce 37  4c 9a 9a d7 77 da 58 35  |.DU'.g.7L...w.X5|
-00000060  83 b3 39 90 8d e2 7f 08  2e cc 5a 8e 5e a8 c3 bb  |..9.......Z.^...|
-00000070  db e5 a2 56 56 04 37 13  f3 b1 71 2d ea 0a 56 00  |...VV.7...q-..V.|
-00000080  6e 8d 8b 20 79 30 16 03  03 02 69 76 4b a4 c6 5e  |n.. y0....ivK..^|
-00000090  0a a2 3c 89 24 f6 93 94  25 4e 0b 8a d2 33 2f 03  |..<.$...%N...3/.|
-000000a0  ab 20 22 33 ad 84 6d aa  31 6b 5a 10 0e 42 1b dd  |. "3..m.1kZ..B..|
-000000b0  35 9b a0 dc 31 f8 65 91  c4 14 78 2e 74 2e 1d 46  |5...1.e...x.t..F|
-000000c0  3a 66 41 f0 a3 9a 4e ae  bc 9b 55 f9 d1 9c c5 6e  |:fA...N...U....n|
-000000d0  38 24 19 15 fb e6 c3 85  de ef f0 97 a2 a1 db ed  |8$..............|
-000000e0  b8 d0 05 ae 93 77 d7 45  50 a5 4e 8a 83 84 07 fb  |.....w.EP.N.....|
-000000f0  3a 80 c6 69 3c 6e b2 e3  e0 97 f7 03 93 76 dd 32  |:..i<n.......v.2|
-00000100  0c 5d a2 e6 1f 82 90 8b  dd 93 06 ef eb b7 e0 74  |.].............t|
-00000110  1a 7d 8f 37 c2 c1 41 9c  30 74 ca 37 17 5e 71 a0  |.}.7..A.0t.7.^q.|
-00000120  cb d6 00 47 9d 14 93 aa  fe 57 56 10 ae 88 13 65  |...G.....WV....e|
-00000130  f4 6c 20 4e f9 14 87 73  36 5e d5 20 93 34 db 87  |.l N...s6^. .4..|
-00000140  e7 f8 84 6e 36 9d 60 20  b5 8f 47 33 84 94 22 e1  |...n6.` ..G3..".|
-00000150  5d c6 1c 35 39 61 71 47  90 a9 b4 c6 5e 31 58 d1  |]..59aqG....^1X.|
-00000160  40 d8 22 22 23 c2 53 e3  75 1f 98 1c cc 7f 2d 11  |@.""#.S.u.....-.|
-00000170  31 5e 49 a1 2c d9 c8 db  6e 4e 9d da 57 e1 c9 32  |1^I.,...nN..W..2|
-00000180  03 6c f0 9b df c2 03 d5  b7 e2 04 77 e8 87 bc 14  |.l.........w....|
-00000190  73 66 b0 fb d1 d6 26 0c  36 90 2c 20 43 16 c6 68  |sf....&.6., C..h|
-000001a0  6c c0 ee be 2c da 6f 4f  95 1e cf a0 31 e8 40 48  |l...,.oO....1.@H|
-000001b0  88 61 26 7b 53 5b 42 14  2a 89 a3 1e 03 01 16 9d  |.a&{S[B.*.......|
-000001c0  41 6d de 60 75 1d 36 12  cd 16 8b 1c 93 da 17 79  |Am.`u.6........y|
-000001d0  4b d2 1d 78 64 da 6c cc  5c 7c e3 f9 4d 70 a2 07  |K..xd.l.\|..Mp..|
-000001e0  b4 24 33 de 19 bc d2 1a  43 42 f4 26 8b c0 81 e4  |.$3.....CB.&....|
-000001f0  a3 32 97 09 ec 6f 39 d7  ca c9 c5 ee 38 fd 91 dd  |.2...o9.....8...|
-00000200  c4 dc 3c 53 38 60 c7 b6  60 c6 a9 ff ae 81 e9 8c  |..<S8`..`.......|
-00000210  ea 49 19 3f fe 0e 8e b8  e6 7c ec 4b 63 66 d8 7a  |.I.?.....|.Kcf.z|
-00000220  82 51 7f 24 51 ae ad 91  5d 0e 2c aa ee fa 9f d3  |.Q.$Q...].,.....|
-00000230  22 1a 8b 8d 12 48 bb 3a  7c ea f0 09 af 1a 7e 7e  |"....H.:|.....~~|
-00000240  47 74 b9 b9 1f 97 8e 64  62 52 ae 08 d5 f1 13 cb  |Gt.....dbR......|
-00000250  51 64 b0 6a 33 1f 48 78  c1 91 91 91 a7 75 29 cb  |Qd.j3.Hx.....u).|
-00000260  32 60 96 d4 27 3f a4 8f  12 e9 5d 79 4d fd f9 19  |2`..'?....]yM...|
-00000270  b8 f7 39 d8 53 e5 45 96  0f c6 4f f2 27 c6 e6 07  |..9.S.E...O.'...|
-00000280  40 47 29 94 b9 6a 38 9e  24 bf 9e 92 f6 67 3f e3  |@G)..j8.$....g?.|
-00000290  48 0f 3b 3a d7 7b 14 4e  34 a3 8a 25 b4 a2 d6 15  |H.;:.{.N4..%....|
-000002a0  3f 38 9e ba fa 7e 33 fd  a4 4c ed e7 58 93 65 7d  |?8...~3..L..X.e}|
-000002b0  90 48 fc 70 7e 10 a5 d0  0a ec 96 c4 cf 26 ae 94  |.H.p~........&..|
-000002c0  d7 3f 92 40 2f ad ed c8  bb 69 b1 3e 0b ab 4f 4e  |.?.@/....i.>..ON|
-000002d0  73 91 a6 05 2b a7 89 e8  63 28 39 51 53 8d 2c 5e  |s...+...c(9QS.,^|
-000002e0  c8 64 90 c3 b7 2d ee 00  aa 7f 38 ca 57 ab b8 aa  |.d...-....8.W...|
-000002f0  93 12 af c5 16 03 03 00  bc 0e 58 31 64 e6 68 e6  |..........X1d.h.|
-00000300  10 81 2f 79 e3 49 3a d9  cc 70 09 7e b6 b5 61 c4  |../y.I:..p.~..a.|
-00000310  92 16 22 d0 e5 af b8 b8  91 2e 72 7c cf 95 cb ef  |..".......r|....|
-00000320  14 81 73 33 34 98 65 1b  69 db 2c 9d eb 1c ce be  |..s34.e.i.,.....|
-00000330  1f ce 48 b4 22 8d f0 6e  48 21 8e aa af 83 43 d2  |..H."..nH!....C.|
-00000340  65 54 0f 57 6b ce b1 24  ef 09 bf 7f 23 92 35 07  |eT.Wk..$....#.5.|
-00000350  55 2f 2f e7 b7 d7 72 d2  7c 5f 71 d6 20 9a 68 e8  |U//...r.|_q. .h.|
-00000360  1b 90 0b 13 f7 37 e2 35  0d fc 04 ea 32 50 2d 04  |.....7.5....2P-.|
-00000370  72 1a db d9 71 e1 4e d1  76 7c c3 f5 22 97 92 c5  |r...q.N.v|.."...|
-00000380  61 19 e0 40 b1 14 de 37  9d 8e e7 fd fe 2b 28 97  |a..@...7.....+(.|
-00000390  91 77 8f a7 d4 b1 db bc  a2 78 65 5c a8 8d 41 21  |.w.......xe\..A!|
-000003a0  0e 56 6b ac 0b da a9 dd  b1 51 84 19 20 ab e5 eb  |.Vk......Q.. ...|
-000003b0  f2 52 8d 48 a2 16 03 03  00 4a 69 44 32 65 c2 09  |.R.H.....JiD2e..|
-000003c0  9c c1 d6 66 06 29 c3 a6  c3 10 2e d9 9e d6 0a d3  |...f.)..........|
-000003d0  06 a3 d2 d2 67 52 bd 19  26 a8 ef 08 ed 9f 2b e8  |....gR..&.....+.|
-000003e0  96 ea 08 b7 46 a2 36 e3  c1 84 4b c2 a2 b5 34 9c  |....F.6...K...4.|
-000003f0  83 ea 94 51 e6 ca 9c 0b  e1 e3 86 13 b7 1b 1f 4e  |...Q...........N|
-00000400  ee a1 10 70 16 03 03 00  14 5a 1c c1 14 fd d9 ff  |...p.....Z......|
-00000410  e3 46 ac 89 3b b3 e1 8e  6b 90 41 44 1f           |.F..;...k.AD.|
+00000000  16 03 03 00 85 74 29 5c  40 48 b9 9c 76 e4 eb a1  |.....t)\@H..v...|
+00000010  44 7e f1 72 cd 7b fe 11  47 4d 48 fe bc 75 4e e1  |D~.r.{..GMH..uN.|
+00000020  b4 8d cb d1 0e d7 16 cc  4b d4 61 f9 47 69 cd aa  |........K.a.Gi..|
+00000030  c4 ad bf fd 01 6b 5c a6  63 d4 73 a4 21 f8 fe 72  |.....k\.c.s.!..r|
+00000040  00 48 55 4e 40 6b 85 e5  1c f2 36 c1 91 2e e2 70  |.HUN@k....6....p|
+00000050  38 95 5a aa 0c c7 32 c9  a5 ac 94 dc 6c 50 f5 e9  |8.Z...2.....lP..|
+00000060  9f 14 48 f0 b3 d1 45 99  d3 aa 68 28 22 4a ae 66  |..H...E...h("J.f|
+00000070  3a 2f 06 c1 86 fb 0c f2  b0 ca 6f e2 93 fe 47 e6  |:/........o...G.|
+00000080  2f 33 2d 60 38 42 2f 56  f7 52 16 03 03 02 69 46  |/3-`8B/V.R....iF|
+00000090  86 2d bb 38 d9 57 1c 29  bd 28 17 a8 ef 4e 26 68  |.-.8.W.).(...N&h|
+000000a0  16 73 f7 2c 52 fb 54 f8  4d 6d 1e c2 57 0d 44 16  |.s.,R.T.Mm..W.D.|
+000000b0  24 3d 5d b5 22 8c 13 b0  09 10 45 65 48 ec 5c 3f  |$=].".....EeH.\?|
+000000c0  c4 9f c1 ee ff 2b 6e 36  76 bc 01 5d f4 96 44 43  |.....+n6v..]..DC|
+000000d0  bb 90 04 ec 18 d6 0b 29  2d 1f 08 0b 02 0d cf 43  |.......)-......C|
+000000e0  7c a0 76 40 6d f0 eb 14  42 5a 9d df 29 35 1c 4f  ||.v@m...BZ..)5.O|
+000000f0  35 ef ad 60 18 16 51 97  2c 73 40 e5 74 1c 48 a7  |5..`..Q.,s@.t.H.|
+00000100  e5 4d 35 2c 1a 4c 35 f6  9a eb 0d d7 49 5f 04 06  |.M5,.L5.....I_..|
+00000110  da 56 8d f4 3b 3f 20 09  91 fd d3 51 31 65 05 f5  |.V..;? ....Q1e..|
+00000120  fa 85 4b 1b 3a 00 33 b0  96 28 d7 3b d7 92 d0 5c  |..K.:.3..(.;...\|
+00000130  04 13 4d d9 a5 02 19 19  13 1d 8a 9d f4 68 c0 98  |..M..........h..|
+00000140  2f f0 86 b2 6b 05 af af  65 a5 0d ab 8e af 74 dc  |/...k...e.....t.|
+00000150  a6 fa 41 0a 23 4b e6 1a  13 8d 96 01 9a 40 5b 09  |..A.#K.......@[.|
+00000160  3b 8f 70 ab 1f d6 8c 27  f6 3d bf 85 b0 f5 66 f7  |;.p....'.=....f.|
+00000170  ae 94 df ee 5f 75 47 19  e4 a1 a6 58 bf f2 8b 0e  |...._uG....X....|
+00000180  05 8a 3a 40 13 35 05 f1  7d 89 f6 6d 14 1c 5f 1c  |..:@.5..}..m.._.|
+00000190  e7 86 cc b5 83 52 55 9f  28 bf 56 54 96 91 92 7e  |.....RU.(.VT...~|
+000001a0  18 a6 21 8f e0 98 ee 6d  6b 19 53 0e f1 25 86 ec  |..!....mk.S..%..|
+000001b0  0e 5d 97 34 36 55 e3 a7  a8 5a 9f 43 8a ed ad c6  |.].46U...Z.C....|
+000001c0  cb 81 96 6f 9f 3b 2c db  24 4c 32 05 c0 8e d8 5a  |...o.;,.$L2....Z|
+000001d0  b3 87 33 b8 5c d8 57 6b  d0 94 7f 22 62 7c 15 d8  |..3.\.Wk..."b|..|
+000001e0  0f 05 b0 e7 04 85 94 5f  7b b2 25 e2 a2 46 c1 43  |......._{.%..F.C|
+000001f0  ac ef f7 c3 89 06 11 d6  c5 a9 0f 3d e0 7a fa 66  |...........=.z.f|
+00000200  31 44 1b a8 ff 2c 11 a7  1e 43 73 1d dd c4 a8 36  |1D...,...Cs....6|
+00000210  85 45 9e 34 46 78 ba 9a  9c 6a da 58 82 9a b0 2b  |.E.4Fx...j.X...+|
+00000220  6b 74 98 bb 6a 9d 2d 54  1b 80 09 01 13 85 60 8a  |kt..j.-T......`.|
+00000230  75 96 df 35 33 72 a4 d6  d3 6e 1a 0a 11 0a 0b b3  |u..53r...n......|
+00000240  5c 87 82 69 09 9d 22 a9  8b e4 b2 fb af 5c fd 82  |\..i.."......\..|
+00000250  32 30 f4 a8 ca a1 83 3e  8b 4d 3b 00 a6 63 7f c2  |20.....>.M;..c..|
+00000260  36 60 80 f2 b5 40 76 98  a6 f9 e8 49 04 62 c0 31  |6`...@v....I.b.1|
+00000270  06 da 4c a7 ff 6b 52 e2  7e af 22 b2 2c 84 df 8c  |..L..kR.~.".,...|
+00000280  d1 5e 7d 19 7b c7 9e da  14 e0 7e 9f 78 4a 0c bb  |.^}.{.....~.xJ..|
+00000290  77 28 3e 12 03 c3 59 91  2a b1 6c 7e 78 ce d6 ac  |w(>...Y.*.l~x...|
+000002a0  a0 57 06 20 d1 2b 74 59  20 e0 7f 4d 35 31 1a 3d  |.W. .+tY ..M51.=|
+000002b0  67 e9 1b 84 92 17 81 04  10 a4 5e 4d c2 00 ea 64  |g.........^M...d|
+000002c0  b9 fb 82 41 2e c0 66 68  2a 9e 1d 86 ee df f4 f9  |...A..fh*.......|
+000002d0  c5 6b d0 f6 07 61 93 22  31 a7 31 ee bc f3 c8 a7  |.k...a."1.1.....|
+000002e0  dc 21 ea eb 61 94 aa 6f  9a a2 0a 74 d9 db 39 48  |.!..a..o...t..9H|
+000002f0  21 8a f4 0a 6d f0 e7 07  16 03 03 00 bc 03 03 f8  |!...m...........|
+00000300  01 78 b0 ea 48 3d 57 b3  c7 69 62 74 ee 0e 92 a4  |.x..H=W..ibt....|
+00000310  d0 96 ed fe 94 2b 11 cd  d1 13 f7 e8 cc 61 0c 6e  |.....+.......a.n|
+00000320  8a 28 70 e1 c2 01 fe 19  66 eb 47 b3 e8 7b ff fc  |.(p.....f.G..{..|
+00000330  e6 c0 4e 5e 15 ae b6 14  04 64 33 d3 77 bc ce ea  |..N^.....d3.w...|
+00000340  47 4a 85 ef ff 16 79 33  1b 2e db 42 ab ee 7c 7f  |GJ....y3...B..|.|
+00000350  37 65 b5 ee 70 71 f1 7b  99 9b 63 c5 23 dd 7b 0c  |7e..pq.{..c.#.{.|
+00000360  ed 48 07 a4 d5 a2 63 5b  fd 99 01 f4 df b6 a7 95  |.H....c[........|
+00000370  23 a5 c0 00 e9 b4 2b f4  f8 3e 9b ca b3 34 ff e6  |#.....+..>...4..|
+00000380  5a 2f 0a 7a 55 81 77 3b  7a c5 66 e8 2c 4a 01 50  |Z/.zU.w;z.f.,J.P|
+00000390  13 13 79 8a b3 9f 9b 49  e9 e7 0a a7 d4 c9 7f 10  |..y....I........|
+000003a0  29 89 70 d9 83 5d 21 a9  40 7a 17 1f 6e 3d 4e 2a  |).p..]!.@z..n=N*|
+000003b0  48 e7 1c fa 07 2f 3f 5d  32 16 03 03 00 4a f9 74  |H..../?]2....J.t|
+000003c0  d5 eb 38 ef d8 bf 7a 69  2f b0 d3 e0 e1 57 d7 fc  |..8...zi/....W..|
+000003d0  01 57 2e e6 99 ba 0c 23  07 59 f3 75 28 1d 77 26  |.W.....#.Y.u(.w&|
+000003e0  2f 4d f4 f3 16 0a d6 2e  38 50 48 e3 a2 90 e1 0b  |/M......8PH.....|
+000003f0  78 99 35 81 d1 d9 4a 7b  47 a2 e1 95 39 f6 02 87  |x.5...J{G...9...|
+00000400  1f fe 4f 7e 2e ee 9a 17  16 03 03 00 14 98 8e a2  |..O~............|
+00000410  b6 b6 79 35 d1 fe b2 cb  90 ea 7c 91 5a 37 53 e4  |..y5......|.Z7S.|
+00000420  73                                                |s|
 >>> Flow 9 (client to server)
-00000000  16 03 03 02 69 c8 db 54  92 d3 ea 2f 24 47 f9 24  |....i..T.../$G.$|
-00000010  53 c1 d4 6a e8 dd 1d 71  d6 fb 2c 7e 3a 41 75 f6  |S..j...q..,~:Au.|
-00000020  0c 08 70 b6 f9 0a 12 4b  0d 3d 34 03 a9 36 9e f1  |..p....K.=4..6..|
-00000030  c7 93 dc 51 e4 15 3d fd  a7 67 28 24 32 fe ff d3  |...Q..=..g($2...|
-00000040  cd 69 d6 4a 5d 11 78 3b  aa 07 8d 1e c4 97 22 34  |.i.J].x;......"4|
-00000050  df 03 f2 37 fd 4f 76 c3  04 a6 a6 0f 35 1c 0f 13  |...7.Ov.....5...|
-00000060  7e 0a b9 5e 47 d2 9a 8c  d8 a3 f4 7a e4 92 5f 12  |~..^G......z.._.|
-00000070  a6 20 fb 51 16 af eb 55  d0 23 4e b5 f9 e8 cc 33  |. .Q...U.#N....3|
-00000080  bd d1 52 27 21 96 06 05  67 fa 68 0e ab 2c 84 05  |..R'!...g.h..,..|
-00000090  c9 97 6a db 69 57 a8 5c  55 a9 e1 cf 33 01 28 9a  |..j.iW.\U...3.(.|
-000000a0  76 09 64 a4 a3 31 36 13  72 27 0c 85 e9 59 47 27  |v.d..16.r'...YG'|
-000000b0  89 07 ee e2 e0 68 a6 f0  fa d5 c3 8b 2f 75 68 d0  |.....h....../uh.|
-000000c0  8e d8 fe ae 1d 0d af 0b  40 3d 9f ec 85 03 24 20  |........@=....$ |
-000000d0  c5 11 30 aa 25 ee 2c 86  42 ae 4f 0d 6b 18 70 1d  |..0.%.,.B.O.k.p.|
-000000e0  5f ae 1e cf 99 a7 0e c8  9b b3 63 58 cd b6 7d be  |_.........cX..}.|
-000000f0  01 43 96 37 87 45 5f 2f  aa 9c 12 48 ef 3b c8 d9  |.C.7.E_/...H.;..|
-00000100  60 20 26 69 68 56 48 aa  64 59 9e 41 ed 7e 8d c3  |` &ihVH.dY.A.~..|
-00000110  0f cd 0e 19 7a 76 89 95  f8 20 68 cd f9 81 e9 a0  |....zv... h.....|
-00000120  21 ff 60 e5 0f 6d dd 73  d2 19 1e 2a 76 f7 9a 46  |!.`..m.s...*v..F|
-00000130  5d d5 6b b2 19 28 c2 ac  9c e0 35 c8 d2 2a 53 fa  |].k..(....5..*S.|
-00000140  3e 58 9e f2 05 7e 6b ce  51 6d 3d 2a ce 2e 9b 59  |>X...~k.Qm=*...Y|
-00000150  aa d4 8d cc ad 1f 82 e7  ca 5a ef a6 87 d5 41 0b  |.........Z....A.|
-00000160  8d 27 6d 09 4d 40 c3 26  a3 a9 91 dd 1b 37 5d ff  |.'m.M@.&.....7].|
-00000170  8f c3 c7 b1 bf be f5 d1  19 4d 93 86 a7 5f 5e 8f  |.........M..._^.|
-00000180  14 34 82 50 76 25 42 04  b8 4b d3 da 15 ee 60 d1  |.4.Pv%B..K....`.|
-00000190  35 56 4c 63 0d ba 64 13  4f 3d 12 87 84 5a 45 41  |5VLc..d.O=...ZEA|
-000001a0  14 b6 6f 91 c4 b9 4f 97  c1 10 d6 3e b3 99 21 18  |..o...O....>..!.|
-000001b0  c3 91 82 e4 b6 91 3e bb  01 89 9a f0 60 ac 8e 7d  |......>.....`..}|
-000001c0  cf c2 f9 b4 4f da 40 e3  5e 83 a1 8f b4 fa 28 aa  |....O.@.^.....(.|
-000001d0  c9 ae 7b 8f 7d c9 d1 f8  7b b2 b5 3f 0a 9b 00 9e  |..{.}...{..?....|
-000001e0  1d fa 59 ff 39 b7 85 4d  2a b9 b8 67 03 df a0 f9  |..Y.9..M*..g....|
-000001f0  f1 7e 9d 27 1c 55 a9 76  44 9e f1 13 78 7d 34 4d  |.~.'.U.vD...x}4M|
-00000200  c9 23 07 e6 db 93 d7 70  3c 1b 5d 89 ed 8d 3d 43  |.#.....p<.]...=C|
-00000210  2e 89 f6 14 83 ff 87 db  26 a5 9a cd 98 5d 32 24  |........&....]2$|
-00000220  70 d2 e0 72 a7 6f a4 b4  2b 37 db 7e 39 4f d7 37  |p..r.o..+7.~9O.7|
-00000230  ea 68 b5 98 33 0e 23 21  3f 43 b3 ff 18 8e df 85  |.h..3.#!?C......|
-00000240  ba 15 48 3a fe 09 9b b6  27 40 d4 60 a8 3e 55 a3  |..H:....'@.`.>U.|
-00000250  75 c9 32 38 b5 21 46 ab  41 99 24 e6 09 3f 64 e6  |u.28.!F.A.$..?d.|
-00000260  09 40 cb 93 25 ab 1a 90  c7 d5 a6 40 36 a0 16 03  |.@..%......@6...|
-00000270  03 00 35 0f c7 e4 c3 16  c0 4f 7f 25 04 06 63 e7  |..5......O.%..c.|
-00000280  79 79 f9 4f c9 66 ca cd  ba e3 af 4a 50 a3 3d c3  |yy.O.f.....JP.=.|
-00000290  79 0c 71 d9 2f df 93 79  30 8f 6b 0f 54 f9 be 07  |y.q./..y0.k.T...|
-000002a0  f3 d6 9b c0 2a 3a 0a a1  16 03 03 00 98 b8 f1 fc  |....*:..........|
-000002b0  87 62 e9 6b 40 fd 50 ac  b7 fa 52 69 51 66 ae 9b  |.b.k@.P...RiQf..|
-000002c0  05 7e f2 38 73 27 d8 0c  2a 53 37 30 62 76 5d e9  |.~.8s'..*S70bv].|
-000002d0  fd 95 c6 14 d2 9d 34 13  e9 4c a5 7c c0 b6 e0 c4  |......4..L.|....|
-000002e0  97 ef 01 c0 f9 38 39 ee  17 c0 20 01 76 4f a7 10  |.....89... .vO..|
-000002f0  b0 45 9d c7 c3 cd a9 47  14 4a ed 00 1f 06 70 5b  |.E.....G.J....p[|
-00000300  f5 04 8b 77 ad af 1e 77  7a 9d cc fc a4 1f d2 8d  |...w...wz.......|
-00000310  8f e3 31 d3 3c de e6 85  f3 3d c0 ae 78 f7 22 c6  |..1.<....=..x.".|
-00000320  ec 2e a2 f0 5f ed 95 33  54 8c 89 35 c9 e4 25 4b  |...._..3T..5..%K|
-00000330  84 5e 31 83 04 d0 f1 67  69 73 8b 7f 24 ae e0 87  |.^1....gis..$...|
-00000340  6b f7 ba f0 23 14 03 03  00 11 7a c7 6a 32 2b 9b  |k...#.....z.j2+.|
-00000350  25 c2 d2 ee 37 b2 8d 7b  f2 90 6d 16 03 03 00 20  |%...7..{..m.... |
-00000360  c1 1c 9d 18 a9 41 92 fc  05 19 93 7c 7e 2f b2 39  |.....A.....|~/.9|
-00000370  8c 76 4b 29 5a 67 cc f5  55 9f c0 e3 8f ad ee 3c  |.vK)Zg..U......<|
+00000000  16 03 03 02 69 ad fd 5e  51 7c 1a 62 01 a3 c7 84  |....i..^Q|.b....|
+00000010  d6 d8 2d 47 2b 00 d5 d4  7c e6 16 94 7e 32 74 85  |..-G+...|...~2t.|
+00000020  ce 13 d9 af d7 27 77 86  43 77 1b ca 68 f5 1f da  |.....'w.Cw..h...|
+00000030  20 d8 61 29 b0 11 3d 40  66 62 a0 82 ff 38 85 07  | .a)..=@fb...8..|
+00000040  52 fc 59 92 44 c4 ea 12  70 62 cd 05 66 0a b4 cb  |R.Y.D...pb..f...|
+00000050  38 23 f4 35 58 a0 4c 1e  bc 1a 5a 6a be ad 81 c9  |8#.5X.L...Zj....|
+00000060  22 97 dc 7d 77 76 da e8  b5 30 be d3 28 be b2 30  |"..}wv...0..(..0|
+00000070  05 52 8f 41 d3 a1 78 68  9b 76 ad 29 42 ec 90 c5  |.R.A..xh.v.)B...|
+00000080  61 f2 aa f2 f0 fb dd 08  42 f3 5a a8 3c 8d f9 98  |a.......B.Z.<...|
+00000090  90 00 2e e1 aa 7c ac 3f  cf 34 9d ed 56 09 30 d3  |.....|.?.4..V.0.|
+000000a0  1b 03 9e fb 0c 16 4c 99  0f 86 a9 03 44 ce 8b 66  |......L.....D..f|
+000000b0  a6 42 bb 0b dc a4 82 47  7d fc 09 48 1d 47 85 da  |.B.....G}..H.G..|
+000000c0  3f 30 d1 94 36 a0 ac 44  72 2f a4 cc 5a fd 6c 96  |?0..6..Dr/..Z.l.|
+000000d0  05 14 0c 25 5c 19 44 1e  c2 40 12 57 be 30 1d bb  |...%\.D..@.W.0..|
+000000e0  62 f4 2c c2 f1 46 83 1b  ad bd f4 e0 ff b2 de 62  |b.,..F.........b|
+000000f0  85 04 61 3d 61 67 aa d1  f7 ba db 6f 80 75 1e 9c  |..a=ag.....o.u..|
+00000100  70 42 ff 6f 35 83 32 34  fc 12 08 e5 44 92 cb 99  |pB.o5.24....D...|
+00000110  a5 d0 ef c3 f2 9e b2 86  ff c1 e5 87 01 bf d1 7a  |...............z|
+00000120  d9 57 ef 21 cf c9 fd 5f  30 6c 54 7c ac 95 54 72  |.W.!..._0lT|..Tr|
+00000130  3d 46 88 4d 9f 8e a8 75  81 a0 81 50 11 1e f7 92  |=F.M...u...P....|
+00000140  f5 a2 5d 49 5a f8 c1 b8  06 f3 6f 99 64 77 ee fe  |..]IZ.....o.dw..|
+00000150  40 fe 94 51 67 db e1 a0  d7 a4 09 cc 52 9c 1b 27  |@..Qg.......R..'|
+00000160  5b 45 4a 71 ff 60 aa 52  56 07 f6 4e ad 23 b8 2c  |[EJq.`.RV..N.#.,|
+00000170  87 d3 2b 04 56 21 ed 51  ce 81 59 ae 3d a7 1b f5  |..+.V!.Q..Y.=...|
+00000180  75 3f 8a 83 c3 ee e9 76  94 dd 48 c4 d1 69 2f af  |u?.....v..H..i/.|
+00000190  b1 f9 2f db 72 ef da 33  6b 87 78 64 24 3a 42 46  |../.r..3k.xd$:BF|
+000001a0  e0 ed 91 60 89 dd 5a 9e  9b 93 4a 0e a3 30 32 4d  |...`..Z...J..02M|
+000001b0  0e 5f c6 49 26 49 18 73  8d 2d 73 d5 4c 49 3f df  |._.I&I.s.-s.LI?.|
+000001c0  d9 55 b7 11 7e 24 1b d6  cb 71 68 ba 6c c7 72 b2  |.U..~$...qh.l.r.|
+000001d0  2e aa 39 89 ac 1b 96 a3  78 11 4d 37 ba 25 88 43  |..9.....x.M7.%.C|
+000001e0  d2 8a 55 28 99 b3 f0 59  d5 92 cc 94 51 e2 f2 18  |..U(...Y....Q...|
+000001f0  3b d1 1a 9b a6 ee f1 b1  91 62 6b a0 da 75 f6 69  |;........bk..u.i|
+00000200  23 56 22 29 dd d0 63 05  be a9 f7 38 fc 0d a2 64  |#V")..c....8...d|
+00000210  e4 09 2c d5 5f ca ee 91  81 91 d1 ee 62 04 e9 ce  |..,._.......b...|
+00000220  5f 49 8e 70 cf fd 5a b5  cf c1 e5 ae 53 3e 16 d0  |_I.p..Z.....S>..|
+00000230  f0 49 9b 61 32 14 38 27  b5 c9 93 13 be e4 5a f0  |.I.a2.8'......Z.|
+00000240  10 5f 7c 14 11 68 70 4d  6d 02 9f 51 51 94 e0 0e  |._|..hpMm..QQ...|
+00000250  04 a2 ae 6c 3c f0 94 11  9c 66 58 b3 a2 e8 04 f1  |...l<....fX.....|
+00000260  01 b7 88 0d 74 cf 8a 63  f8 e6 c4 bb 10 bb 16 03  |....t..c........|
+00000270  03 00 35 7b 36 f4 cf b3  8a 4a 7c 7e fc 7a 6d ae  |..5{6....J|~.zm.|
+00000280  5e fe 3b c5 e1 16 44 ab  72 0a 07 10 69 e1 11 db  |^.;...D.r...i...|
+00000290  6d 86 f9 43 d0 87 82 3a  28 83 b4 15 76 76 2a f9  |m..C...:(...vv*.|
+000002a0  52 80 7f 2f c2 52 e1 2c  16 03 03 00 98 e8 a2 d5  |R../.R.,........|
+000002b0  d6 57 15 7c 33 27 e2 29  d4 82 7b fd 2d c3 00 db  |.W.|3'.)..{.-...|
+000002c0  83 90 44 4b 3a be 01 4d  d7 76 a5 03 cf ec 60 b5  |..DK:..M.v....`.|
+000002d0  93 ba 4d 4d 74 30 a3 bb  47 3b a2 94 98 1e e9 b8  |..MMt0..G;......|
+000002e0  d2 99 55 05 c7 59 cb e4  55 3e c0 c9 8c 90 40 91  |..U..Y..U>....@.|
+000002f0  2e c0 64 f2 6e 09 96 7c  b6 0a e0 ad fd a2 7a c4  |..d.n..|......z.|
+00000300  b0 e6 0f 40 2a e5 37 fa  72 f3 89 1c 78 47 ca c7  |...@*.7.r...xG..|
+00000310  e5 83 7b 1f a6 e5 39 32  c6 94 1e e4 7a 51 d9 36  |..{...92....zQ.6|
+00000320  67 d9 b3 78 58 f9 ae 65  60 ee 41 c8 81 8a 04 49  |g..xX..e`.A....I|
+00000330  35 2a d8 22 b3 8b 64 49  13 a0 36 e0 37 68 ea b7  |5*."..dI..6.7h..|
+00000340  99 9e 1f e1 ea 14 03 03  00 11 b9 18 a2 5e 19 5f  |.............^._|
+00000350  77 58 6c a3 e9 97 4b 34  5e ff ff 16 03 03 00 20  |wXl...K4^...... |
+00000360  71 d4 9f 5a 6f fa e4 28  bb f1 9d e5 0b c3 da 4b  |q..Zo..(.......K|
+00000370  ef a3 78 28 c5 e3 43 ff  f7 5c a1 94 57 0d ee 41  |..x(..C..\..W..A|
 >>> Flow 10 (server to client)
-00000000  14 03 03 00 11 49 66 13  ec 09 83 0d 47 82 45 61  |.....If.....G.Ea|
-00000010  06 14 cc f5 da 41 16 03  03 00 20 34 d4 0c bd 86  |.....A.... 4....|
-00000020  6d ef a9 b6 97 68 e6 88  84 ed 1c 9d a1 8d 2b c9  |m....h........+.|
-00000030  2f 45 75 5b e5 6a 08 72  71 a9 c6 17 03 03 00 19  |/Eu[.j.rq.......|
-00000040  e8 83 4c f5 19 ea d1 ef  e3 27 25 f9 af d2 f0 a6  |..L......'%.....|
-00000050  b3 62 15 66 ec 72 ce 4e  e2                       |.b.f.r.N.|
+00000000  14 03 03 00 11 ed 11 8d  d8 09 71 3a d8 53 25 f9  |..........q:.S%.|
+00000010  a9 2f 70 b9 21 fb 16 03  03 00 20 14 a7 ba 54 0e  |./p.!..... ...T.|
+00000020  5c a9 53 ab d4 d6 c0 3f  10 6b 2d 84 8d 66 e5 04  |\.S....?.k-..f..|
+00000030  96 f9 a9 18 1d f8 c1 76  49 18 35 17 03 03 00 19  |.......vI.5.....|
+00000040  5e b0 d2 83 83 7d 35 ac  e5 74 9a 68 b5 d8 4d 32  |^....}5..t.h..M2|
+00000050  a1 d0 bf 8d 8f 1a 2f f7  33                       |....../.3|
 >>> Flow 11 (client to server)
-00000000  15 03 03 00 12 2e 39 ba  ca ad 7c a9 ae 3f 6a 78  |......9...|..?jx|
-00000010  b6 31 d2 d0 4e 1f dc                              |.1..N..|
+00000000  15 03 03 00 12 3d 6c 11  84 f3 af 5e 9b ee c3 56  |.....=l....^...V|
+00000010  96 c1 78 a9 12 31 ba                              |..x..1.|
diff --git a/src/crypto/tls/testdata/Client-TLSv12-RenegotiateTwice b/src/crypto/tls/testdata/Client-TLSv12-RenegotiateTwice
index 20aa6c9..ff6da0a 100644
--- a/src/crypto/tls/testdata/Client-TLSv12-RenegotiateTwice
+++ b/src/crypto/tls/testdata/Client-TLSv12-RenegotiateTwice
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fe 01 00 00  fa 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 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,337 +7,340 @@
 00000050  cc a8 c0 2b c0 2f c0 2c  c0 30 c0 09 c0 13 c0 0a  |...+./.,.0......|
 00000060  c0 14 00 9c 00 9d 00 2f  00 35 c0 12 00 0a c0 23  |......./.5.....#|
 00000070  c0 27 00 3c c0 07 c0 11  00 05 13 03 13 01 13 02  |.'.<............|
-00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
+00000080  01 00 00 7f 00 05 00 05  01 00 00 00 00 00 0a 00  |................|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
 000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
 000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
-000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
-000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
-000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
-000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
+000000c0  01 00 01 00 00 17 00 00  00 12 00 00 00 2b 00 09  |.............+..|
+000000d0  08 03 04 03 03 03 02 03  01 00 33 00 26 00 24 00  |..........3.&.$.|
+000000e0  1d 00 20 2f e5 7d a3 47  cd 62 43 15 28 da ac 5f  |.. /.}.G.bC.(.._|
+000000f0  bb 29 07 30 ff f6 84 af  c4 cf c2 ed 90 99 5f 58  |.).0.........._X|
+00000100  cb 3b 74                                          |.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 59 02 00 00  55 03 03 68 39 1d 0e 5a  |....Y...U..h9..Z|
-00000010  22 ba 13 5f b6 c1 52 5d  13 e5 07 18 aa ec 24 0f  |".._..R]......$.|
-00000020  c9 56 3a 83 a1 32 a1 7f  02 e8 7b 20 31 e2 f8 c4  |.V:..2....{ 1...|
-00000030  5b c2 57 9a 1d a4 6f a7  9c 1c 93 b1 9f 19 c3 cb  |[.W...o.........|
-00000040  e1 73 87 1b a8 88 d9 4c  67 2f 44 aa cc a8 00 00  |.s.....Lg/D.....|
-00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
-00000060  03 02 59 0b 00 02 55 00  02 52 00 02 4f 30 82 02  |..Y...U..R..O0..|
-00000070  4b 30 82 01 b4 a0 03 02  01 02 02 09 00 e8 f0 9d  |K0..............|
-00000080  3f e2 5b ea a6 30 0d 06  09 2a 86 48 86 f7 0d 01  |?.[..0...*.H....|
-00000090  01 0b 05 00 30 1f 31 0b  30 09 06 03 55 04 0a 13  |....0.1.0...U...|
-000000a0  02 47 6f 31 10 30 0e 06  03 55 04 03 13 07 47 6f  |.Go1.0...U....Go|
-000000b0  20 52 6f 6f 74 30 1e 17  0d 31 36 30 31 30 31 30  | Root0...1601010|
-000000c0  30 30 30 30 30 5a 17 0d  32 35 30 31 30 31 30 30  |00000Z..25010100|
-000000d0  30 30 30 30 5a 30 1a 31  0b 30 09 06 03 55 04 0a  |0000Z0.1.0...U..|
-000000e0  13 02 47 6f 31 0b 30 09  06 03 55 04 03 13 02 47  |..Go1.0...U....G|
-000000f0  6f 30 81 9f 30 0d 06 09  2a 86 48 86 f7 0d 01 01  |o0..0...*.H.....|
-00000100  01 05 00 03 81 8d 00 30  81 89 02 81 81 00 db 46  |.......0.......F|
-00000110  7d 93 2e 12 27 06 48 bc  06 28 21 ab 7e c4 b6 a2  |}...'.H..(!.~...|
-00000120  5d fe 1e 52 45 88 7a 36  47 a5 08 0d 92 42 5b c2  |]..RE.z6G....B[.|
-00000130  81 c0 be 97 79 98 40 fb  4f 6d 14 fd 2b 13 8b c2  |....y.@.Om..+...|
-00000140  a5 2e 67 d8 d4 09 9e d6  22 38 b7 4a 0b 74 73 2b  |..g....."8.J.ts+|
-00000150  c2 34 f1 d1 93 e5 96 d9  74 7b f3 58 9f 6c 61 3c  |.4......t{.X.la<|
-00000160  c0 b0 41 d4 d9 2b 2b 24  23 77 5b 1c 3b bd 75 5d  |..A..++$#w[.;.u]|
-00000170  ce 20 54 cf a1 63 87 1d  1e 24 c4 f3 1d 1a 50 8b  |. T..c...$....P.|
-00000180  aa b6 14 43 ed 97 a7 75  62 f4 14 c8 52 d7 02 03  |...C...ub...R...|
-00000190  01 00 01 a3 81 93 30 81  90 30 0e 06 03 55 1d 0f  |......0..0...U..|
-000001a0  01 01 ff 04 04 03 02 05  a0 30 1d 06 03 55 1d 25  |.........0...U.%|
-000001b0  04 16 30 14 06 08 2b 06  01 05 05 07 03 01 06 08  |..0...+.........|
-000001c0  2b 06 01 05 05 07 03 02  30 0c 06 03 55 1d 13 01  |+.......0...U...|
-000001d0  01 ff 04 02 30 00 30 19  06 03 55 1d 0e 04 12 04  |....0.0...U.....|
-000001e0  10 9f 91 16 1f 43 43 3e  49 a6 de 6d b6 80 d7 9f  |.....CC>I..m....|
-000001f0  60 30 1b 06 03 55 1d 23  04 14 30 12 80 10 48 13  |`0...U.#..0...H.|
-00000200  49 4d 13 7e 16 31 bb a3  01 d5 ac ab 6e 7b 30 19  |IM.~.1......n{0.|
-00000210  06 03 55 1d 11 04 12 30  10 82 0e 65 78 61 6d 70  |..U....0...examp|
-00000220  6c 65 2e 67 6f 6c 61 6e  67 30 0d 06 09 2a 86 48  |le.golang0...*.H|
-00000230  86 f7 0d 01 01 0b 05 00  03 81 81 00 9d 30 cc 40  |.............0.@|
-00000240  2b 5b 50 a0 61 cb ba e5  53 58 e1 ed 83 28 a9 58  |+[P.a...SX...(.X|
-00000250  1a a9 38 a4 95 a1 ac 31  5a 1a 84 66 3d 43 d3 2d  |..8....1Z..f=C.-|
-00000260  d9 0b f2 97 df d3 20 64  38 92 24 3a 00 bc cf 9c  |...... d8.$:....|
-00000270  7d b7 40 20 01 5f aa d3  16 61 09 a2 76 fd 13 c3  |}.@ ._...a..v...|
-00000280  cc e1 0c 5c ee b1 87 82  f1 6c 04 ed 73 bb b3 43  |...\.....l..s..C|
-00000290  77 8d 0c 1c f1 0f a1 d8  40 83 61 c9 4c 72 2b 9d  |w.......@.a.Lr+.|
-000002a0  ae db 46 06 06 4d f4 c1  b3 3e c0 d1 bd 42 d4 db  |..F..M...>...B..|
-000002b0  fe 3d 13 60 84 5c 21 d3  3b e9 fa e7 16 03 03 00  |.=.`.\!.;.......|
-000002c0  ac 0c 00 00 a8 03 00 1d  20 57 22 18 98 ed 7f 12  |........ W".....|
-000002d0  e7 e3 83 6b 42 82 ff 49  54 f8 0b 7d 93 3d 11 42  |...kB..IT..}.=.B|
-000002e0  67 cf 89 47 77 31 c5 59  4a 08 04 00 80 69 d4 13  |g..Gw1.YJ....i..|
-000002f0  f8 1c 68 9d 40 10 c8 aa  e6 44 0e 14 b9 38 6e ca  |..h.@....D...8n.|
-00000300  a9 50 05 4a ce a0 03 ea  02 92 e4 5a ed 42 6f 70  |.P.J.......Z.Bop|
-00000310  e1 c1 99 49 a4 34 20 6b  5e 14 e8 a1 d3 27 ff 0d  |...I.4 k^....'..|
-00000320  0c d7 47 49 1e 8f 8a 3a  62 1d c9 81 3c 5f a3 16  |..GI...:b...<_..|
-00000330  16 34 a0 53 a7 01 1d 09  f7 d9 d4 62 b2 0a 1c 1f  |.4.S.......b....|
-00000340  b2 e5 24 1b 7e 78 35 43  ed 47 f8 62 53 2d 04 ec  |..$.~x5C.G.bS-..|
-00000350  81 b5 68 11 3a 2d ee 88  ef 86 eb 71 d0 5e 31 42  |..h.:-.....q.^1B|
-00000360  57 6d b6 f2 be 32 4c 38  f8 2a 93 2f db 16 03 03  |Wm...2L8.*./....|
-00000370  00 04 0e 00 00 00                                 |......|
+00000000  16 03 03 00 5d 02 00 00  59 03 03 bc 20 d6 8b 64  |....]...Y... ..d|
+00000010  c1 9f de ba 8e c1 6f 37  b8 5c 82 c3 1b 5e 11 3d  |......o7.\...^.=|
+00000020  ac 5d 16 4b 40 96 d6 ae  29 74 91 20 65 7d d0 51  |.].K@...)t. e}.Q|
+00000030  d8 a2 2d c6 db 53 f6 04  16 dd 70 4a bd 44 a4 b6  |..-..S....pJ.D..|
+00000040  ef e0 f0 d3 ec 6a 31 18  91 df 09 90 cc a8 00 00  |.....j1.........|
+00000050  11 ff 01 00 01 00 00 0b  00 04 03 00 01 02 00 17  |................|
+00000060  00 00 16 03 03 02 59 0b  00 02 55 00 02 52 00 02  |......Y...U..R..|
+00000070  4f 30 82 02 4b 30 82 01  b4 a0 03 02 01 02 02 09  |O0..K0..........|
+00000080  00 e8 f0 9d 3f e2 5b ea  a6 30 0d 06 09 2a 86 48  |....?.[..0...*.H|
+00000090  86 f7 0d 01 01 0b 05 00  30 1f 31 0b 30 09 06 03  |........0.1.0...|
+000000a0  55 04 0a 13 02 47 6f 31  10 30 0e 06 03 55 04 03  |U....Go1.0...U..|
+000000b0  13 07 47 6f 20 52 6f 6f  74 30 1e 17 0d 31 36 30  |..Go Root0...160|
+000000c0  31 30 31 30 30 30 30 30  30 5a 17 0d 32 35 30 31  |101000000Z..2501|
+000000d0  30 31 30 30 30 30 30 30  5a 30 1a 31 0b 30 09 06  |01000000Z0.1.0..|
+000000e0  03 55 04 0a 13 02 47 6f  31 0b 30 09 06 03 55 04  |.U....Go1.0...U.|
+000000f0  03 13 02 47 6f 30 81 9f  30 0d 06 09 2a 86 48 86  |...Go0..0...*.H.|
+00000100  f7 0d 01 01 01 05 00 03  81 8d 00 30 81 89 02 81  |...........0....|
+00000110  81 00 db 46 7d 93 2e 12  27 06 48 bc 06 28 21 ab  |...F}...'.H..(!.|
+00000120  7e c4 b6 a2 5d fe 1e 52  45 88 7a 36 47 a5 08 0d  |~...]..RE.z6G...|
+00000130  92 42 5b c2 81 c0 be 97  79 98 40 fb 4f 6d 14 fd  |.B[.....y.@.Om..|
+00000140  2b 13 8b c2 a5 2e 67 d8  d4 09 9e d6 22 38 b7 4a  |+.....g....."8.J|
+00000150  0b 74 73 2b c2 34 f1 d1  93 e5 96 d9 74 7b f3 58  |.ts+.4......t{.X|
+00000160  9f 6c 61 3c c0 b0 41 d4  d9 2b 2b 24 23 77 5b 1c  |.la<..A..++$#w[.|
+00000170  3b bd 75 5d ce 20 54 cf  a1 63 87 1d 1e 24 c4 f3  |;.u]. T..c...$..|
+00000180  1d 1a 50 8b aa b6 14 43  ed 97 a7 75 62 f4 14 c8  |..P....C...ub...|
+00000190  52 d7 02 03 01 00 01 a3  81 93 30 81 90 30 0e 06  |R.........0..0..|
+000001a0  03 55 1d 0f 01 01 ff 04  04 03 02 05 a0 30 1d 06  |.U...........0..|
+000001b0  03 55 1d 25 04 16 30 14  06 08 2b 06 01 05 05 07  |.U.%..0...+.....|
+000001c0  03 01 06 08 2b 06 01 05  05 07 03 02 30 0c 06 03  |....+.......0...|
+000001d0  55 1d 13 01 01 ff 04 02  30 00 30 19 06 03 55 1d  |U.......0.0...U.|
+000001e0  0e 04 12 04 10 9f 91 16  1f 43 43 3e 49 a6 de 6d  |.........CC>I..m|
+000001f0  b6 80 d7 9f 60 30 1b 06  03 55 1d 23 04 14 30 12  |....`0...U.#..0.|
+00000200  80 10 48 13 49 4d 13 7e  16 31 bb a3 01 d5 ac ab  |..H.IM.~.1......|
+00000210  6e 7b 30 19 06 03 55 1d  11 04 12 30 10 82 0e 65  |n{0...U....0...e|
+00000220  78 61 6d 70 6c 65 2e 67  6f 6c 61 6e 67 30 0d 06  |xample.golang0..|
+00000230  09 2a 86 48 86 f7 0d 01  01 0b 05 00 03 81 81 00  |.*.H............|
+00000240  9d 30 cc 40 2b 5b 50 a0  61 cb ba e5 53 58 e1 ed  |.0.@+[P.a...SX..|
+00000250  83 28 a9 58 1a a9 38 a4  95 a1 ac 31 5a 1a 84 66  |.(.X..8....1Z..f|
+00000260  3d 43 d3 2d d9 0b f2 97  df d3 20 64 38 92 24 3a  |=C.-...... d8.$:|
+00000270  00 bc cf 9c 7d b7 40 20  01 5f aa d3 16 61 09 a2  |....}.@ ._...a..|
+00000280  76 fd 13 c3 cc e1 0c 5c  ee b1 87 82 f1 6c 04 ed  |v......\.....l..|
+00000290  73 bb b3 43 77 8d 0c 1c  f1 0f a1 d8 40 83 61 c9  |s..Cw.......@.a.|
+000002a0  4c 72 2b 9d ae db 46 06  06 4d f4 c1 b3 3e c0 d1  |Lr+...F..M...>..|
+000002b0  bd 42 d4 db fe 3d 13 60  84 5c 21 d3 3b e9 fa e7  |.B...=.`.\!.;...|
+000002c0  16 03 03 00 ac 0c 00 00  a8 03 00 1d 20 71 9d 55  |............ q.U|
+000002d0  00 99 f1 f9 90 c2 8f 82  27 d7 5c 0e 96 97 a9 f7  |........'.\.....|
+000002e0  be ab c4 76 41 9b 86 86  43 d7 43 78 0c 08 04 00  |...vA...C.Cx....|
+000002f0  80 96 cb 93 b2 0c 1e e3  92 b1 4e 28 30 48 85 09  |..........N(0H..|
+00000300  c1 cf 73 66 7b 3b 3d 7d  83 c2 a3 2a 93 14 58 c0  |..sf{;=}...*..X.|
+00000310  1c 6c 7c 92 9c 3f 8b 80  d1 c4 54 d8 2b 65 38 35  |.l|..?....T.+e85|
+00000320  08 a6 d2 ec 4e 84 e7 49  78 13 3f 2a 41 60 1d ea  |....N..Ix.?*A`..|
+00000330  09 c8 30 37 35 88 b3 eb  5c ad 16 46 19 5f f1 62  |..075...\..F._.b|
+00000340  8b 49 8a 9a 47 87 a4 14  d3 17 e1 d5 79 0e 9f c4  |.I..G.......y...|
+00000350  4e db 6f 38 8e 77 ec 37  74 e8 20 01 54 75 e1 8e  |N.o8.w.7t. .Tu..|
+00000360  5c d1 19 51 d8 c8 89 6c  27 01 54 ca 18 dd d9 2e  |\..Q...l'.T.....|
+00000370  8f 16 03 03 00 04 0e 00  00 00                    |..........|
 >>> Flow 3 (client to server)
 00000000  16 03 03 00 25 10 00 00  21 20 2f e5 7d a3 47 cd  |....%...! /.}.G.|
 00000010  62 43 15 28 da ac 5f bb  29 07 30 ff f6 84 af c4  |bC.(.._.).0.....|
 00000020  cf c2 ed 90 99 5f 58 cb  3b 74 14 03 03 00 01 01  |....._X.;t......|
-00000030  16 03 03 00 20 2a 03 0a  58 36 31 ec 26 df e5 7c  |.... *..X61.&..||
-00000040  88 b5 d1 f7 6d fc 4b 0a  91 54 4a e7 8c 83 a3 54  |....m.K..TJ....T|
-00000050  0a 10 5b ff 69                                    |..[.i|
+00000030  16 03 03 00 20 46 e6 c1  9e c0 cc 46 24 6e 0c 6c  |.... F.....F$n.l|
+00000040  1b c5 7d b4 dc a1 b5 d4  bf db 32 69 12 8a 89 ea  |..}.......2i....|
+00000050  c1 bf 26 b8 ee                                    |..&..|
 >>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 20 27 b0 69 0c 67  |.......... '.i.g|
-00000010  c7 3a ec c1 aa 02 20 cf  f9 e8 22 86 3b d3 e1 4f  |.:.... ...".;..O|
-00000020  bc fd 04 40 19 77 bf bd  38 28 56                 |...@.w..8(V|
+00000000  14 03 03 00 01 01 16 03  03 00 20 08 9b ed a2 75  |.......... ....u|
+00000010  a9 2d 92 f7 dc e1 93 7a  3d c3 75 33 a8 43 17 2b  |.-.....z=.u3.C.+|
+00000020  50 71 58 d7 40 2a ea 1b  0a 3b 0b                 |PqX.@*...;.|
 >>> Flow 5 (client to server)
-00000000  17 03 03 00 16 8a 2c 24  1b b8 53 01 54 c8 bd f3  |......,$..S.T...|
-00000010  e1 ec a9 ab 83 a0 66 a9  29 1c 4e                 |......f.).N|
+00000000  17 03 03 00 16 7e a3 48  7f 20 07 19 31 8b d2 18  |.....~.H. ..1...|
+00000010  81 1d 4a a1 db 72 4a 88  2d ee 18                 |..J..rJ.-..|
 >>> Flow 6 (server to client)
-00000000  16 03 03 00 14 c5 e3 03  06 89 d8 47 1a 66 18 0e  |...........G.f..|
-00000010  8d 36 c5 f4 30 80 7e 72  a2                       |.6..0.~r.|
+00000000  16 03 03 00 14 b4 c3 67  a8 fc 66 ad 48 f9 3f 6b  |.......g..f.H.?k|
+00000010  97 4b 55 f8 4d 92 a1 2e  d8                       |.KU.M....|
 >>> Flow 7 (client to server)
-00000000  16 03 03 01 16 7e eb a3  b5 ea 58 e3 4a 26 35 7d  |.....~....X.J&5}|
-00000010  54 15 93 74 e8 e4 63 34  38 d9 e0 02 3d 28 f8 98  |T..t..c48...=(..|
-00000020  0f 24 6b ca 08 7f b6 77  68 ec 85 c3 4a 6b 69 c3  |.$k....wh...Jki.|
-00000030  8d 8e 1b 8b 41 11 9b 0d  d1 c8 99 2b c9 d2 4c f1  |....A......+..L.|
-00000040  fd 82 e5 35 ba a3 3b f3  6d 47 82 45 08 e7 02 bb  |...5..;.mG.E....|
-00000050  10 a6 7b 76 83 78 e0 aa  5a 78 24 59 1c db ae a3  |..{v.x..Zx$Y....|
-00000060  37 20 b3 12 98 48 68 d3  b3 72 9f 4f d4 de 50 b4  |7 ...Hh..r.O..P.|
-00000070  4a c1 37 93 e0 55 ae e8  37 2a 40 de ac 30 e1 1d  |J.7..U..7*@..0..|
-00000080  f0 03 19 8c af 77 f5 26  98 af a8 a8 d2 72 6c 68  |.....w.&.....rlh|
-00000090  75 00 32 10 e6 3f 91 a8  24 a7 d8 05 23 04 52 23  |u.2..?..$...#.R#|
-000000a0  e7 e6 83 ac 37 1b 36 a7  ca d4 7e d5 21 4c ab 38  |....7.6...~.!L.8|
-000000b0  23 cb 7c a9 f4 66 26 5e  7f 3e d6 ab 7a ac 34 38  |#.|..f&^.>..z.48|
-000000c0  95 16 df e2 e4 cf 3a 62  82 78 cb 71 32 06 6d 07  |......:b.x.q2.m.|
-000000d0  84 91 0c e9 d0 63 88 9e  d1 b5 f0 fb 43 2b 07 0b  |.....c......C+..|
-000000e0  32 d7 20 af b8 76 17 da  ee cc e6 03 bb 7a 0b f2  |2. ..v.......z..|
-000000f0  61 4f db 7f a3 66 b0 05  a8 88 b8 0b b3 6e 9c df  |aO...f.......n..|
-00000100  48 8b 7e eb 42 cd ea eb  1d bb 63 a0 e4 ee df 21  |H.~.B.....c....!|
-00000110  20 67 11 26 dd f1 47 1b  15 2b a0                 | g.&..G..+.|
+00000000  16 03 03 01 1a 57 92 7f  92 07 a2 88 ca ea e3 5d  |.....W.........]|
+00000010  38 79 fd 42 41 5b 73 e5  52 34 c3 f5 10 67 3d 0b  |8y.BA[s.R4...g=.|
+00000020  42 58 50 d7 f1 da 6b a6  4f 6a 89 2b f7 3c 4d a0  |BXP...k.Oj.+.<M.|
+00000030  db 8c c0 1e 30 08 15 fe  9e 9f 97 80 df 7c a4 ce  |....0........|..|
+00000040  3f ab 9d 9c 05 12 e6 75  2a 3e c4 d8 f4 01 06 c9  |?......u*>......|
+00000050  48 06 3b 1e df 97 26 e9  59 34 59 c8 e3 05 0b 22  |H.;...&.Y4Y...."|
+00000060  d1 66 0e 42 ac e0 4a e1  89 c3 80 ae ee 32 65 93  |.f.B..J......2e.|
+00000070  09 6b 1f bc 03 4d 0d 85  bc e8 46 12 09 0b 0c 44  |.k...M....F....D|
+00000080  20 a0 26 12 70 80 45 9c  ba c2 9d 6a 7a ec bb 92  | .&.p.E....jz...|
+00000090  c5 b3 49 2e 18 99 e8 19  a8 37 9d e2 28 c8 69 19  |..I......7..(.i.|
+000000a0  ed 12 a6 f2 e7 84 a3 7f  7e 49 74 34 67 66 1f fc  |........~It4gf..|
+000000b0  02 58 0d 8e 6c ec 1c 14  8c 2a 74 b8 f2 b1 8e 6a  |.X..l....*t....j|
+000000c0  5f 4d 76 13 d6 7f cf c3  2d 85 18 9b 04 87 d9 9a  |_Mv.....-.......|
+000000d0  db 8f 09 ce 3f 47 55 fc  e9 bf 6c cb 42 bf d4 c4  |....?GU...l.B...|
+000000e0  76 91 3e d6 d8 32 4e fe  24 39 1b 66 38 83 32 7f  |v.>..2N.$9.f8.2.|
+000000f0  ee 84 d3 13 39 73 bb 41  a2 d4 ef a7 1c aa cb e3  |....9s.A........|
+00000100  c2 25 6a a3 f2 fb 6f 94  eb 9d 08 1b 4e 6b 09 8a  |.%j...o.....Nk..|
+00000110  00 0a e3 1b e1 57 7b 58  14 d1 0a 1d 11 7a e0     |.....W{X.....z.|
 >>> Flow 8 (server to client)
-00000000  16 03 03 00 81 60 70 d6  32 5a 0a 8f df ed cd f2  |.....`p.2Z......|
-00000010  d7 bf d0 da fd 53 63 65  bf f5 26 83 0c f5 6e e9  |.....Sce..&...n.|
-00000020  78 9b 03 7b 17 5f f4 d2  af 2a a3 85 13 92 be 00  |x..{._...*......|
-00000030  93 3f b3 f1 cb 04 aa 55  f8 ed c8 e6 9c 32 08 79  |.?.....U.....2.y|
-00000040  86 84 ef ac 72 bd 93 07  9c ca d2 e7 74 dd 51 a0  |....r.......t.Q.|
-00000050  6d 0e d3 32 3c 33 9d 58  aa 46 a9 ff 22 08 bc 2c  |m..2<3.X.F.."..,|
-00000060  de 81 aa a8 5a 3c f8 36  93 d3 12 06 79 61 1f 71  |....Z<.6....ya.q|
-00000070  5f 45 d7 99 b2 55 10 22  db 56 d9 39 64 57 ad c3  |_E...U.".V.9dW..|
-00000080  59 a9 bd cb f2 22 16 03  03 02 69 34 e7 f2 7a bc  |Y...."....i4..z.|
-00000090  0b 90 72 a3 3b 6b 38 a3  f8 7a 19 39 ff b4 d6 8c  |..r.;k8..z.9....|
-000000a0  c9 92 4f a3 23 1a f0 89  bb 01 e4 b2 24 f7 db 3d  |..O.#.......$..=|
-000000b0  f4 4b 02 75 d0 ca 3c ed  e8 d9 13 61 c5 61 4e 7c  |.K.u..<....a.aN||
-000000c0  fe b9 49 69 63 cc 23 5f  9b 23 85 ec 86 e5 17 28  |..Iic.#_.#.....(|
-000000d0  8a 1e 0c 45 e5 4d c2 be  66 92 47 88 28 ec 52 eb  |...E.M..f.G.(.R.|
-000000e0  72 e5 30 89 58 8d 15 2b  98 eb cd e2 18 7c 53 f2  |r.0.X..+.....|S.|
-000000f0  89 ba 71 a5 91 20 64 17  7c 56 f1 01 8a 52 17 66  |..q.. d.|V...R.f|
-00000100  ef d7 bc 5b ff 54 53 13  2e 80 53 4c 84 6d a2 20  |...[.TS...SL.m. |
-00000110  0f e6 3d 33 90 7a 5b 1a  50 29 ce 1e af 74 a5 b3  |..=3.z[.P)...t..|
-00000120  0e 29 c8 e5 c1 50 b6 5d  c8 bb e4 b5 f5 6b 04 a8  |.)...P.].....k..|
-00000130  24 a6 a8 cc 77 7c 72 d5  b1 f3 6a 1c 2e d7 7e e0  |$...w|r...j...~.|
-00000140  4c 46 3f 26 61 2e 54 7d  ab d8 d6 ec 1e b0 0d d1  |LF?&a.T}........|
-00000150  02 57 00 7f 29 aa d3 1d  a4 40 73 d7 21 12 76 58  |.W..)....@s.!.vX|
-00000160  7d 79 a5 c1 d2 57 63 48  0e 63 5f 24 49 8a 57 ba  |}y...WcH.c_$I.W.|
-00000170  26 1c 39 4a f8 b3 89 79  e2 be 4e 8e 37 ae 16 75  |&.9J...y..N.7..u|
-00000180  42 5e 2e 9b 14 d5 b3 06  5f b9 c8 f7 16 8f eb 1c  |B^......_.......|
-00000190  48 0a da 1e b3 4a 78 f7  f8 b4 35 bf 7d 3f c5 8d  |H....Jx...5.}?..|
-000001a0  fa 7d c0 b7 52 af d3 13  de 96 39 76 fd 49 80 55  |.}..R.....9v.I.U|
-000001b0  bb b3 0f 5b 0c 84 4d 8b  da 62 8a 20 4b a1 28 28  |...[..M..b. K.((|
-000001c0  3d 74 cc 34 9d 95 8e af  c0 05 a2 5c 73 9d 73 d8  |=t.4.......\s.s.|
-000001d0  6c 4e 77 25 c5 8c 22 07  c6 b9 55 47 0c b2 12 73  |lNw%.."...UG...s|
-000001e0  2e f5 95 f7 28 c3 e4 24  2c fd 05 ac e2 3e df 93  |....(..$,....>..|
-000001f0  5a 28 66 aa d4 86 8a 48  e2 c8 69 01 18 90 54 10  |Z(f....H..i...T.|
-00000200  67 80 a1 be a8 9a 7f f3  17 ee dc 83 06 7a 70 6c  |g............zpl|
-00000210  59 c2 2d 8f ff 79 a7 e5  e2 f2 f3 f3 5b 44 42 25  |Y.-..y......[DB%|
-00000220  a3 8c a0 83 07 5c f6 73  e9 bd f5 6b 86 89 b4 11  |.....\.s...k....|
-00000230  7b 9a 28 52 4f 55 70 4a  75 00 73 cc 84 fa 4a ef  |{.(ROUpJu.s...J.|
-00000240  f8 8a 8d f9 18 e2 bc 13  48 cb 80 4d 6f fc d7 23  |........H..Mo..#|
-00000250  3a 9c 6c fd 46 27 94 8a  3d 9d fb 17 f5 06 4d a1  |:.l.F'..=.....M.|
-00000260  18 75 a7 9b 08 f8 47 b5  52 b4 19 4b b7 0f a4 e0  |.u....G.R..K....|
-00000270  78 f8 8b a4 cc eb d3 85  e1 ad 21 29 0f c7 09 28  |x.........!)...(|
-00000280  3f 21 12 6c fd 76 05 13  10 a0 c1 ce ba 7c e8 6f  |?!.l.v.......|.o|
-00000290  e9 99 67 0a 9d 3a 7f f1  a6 8a 53 56 f1 09 22 21  |..g..:....SV.."!|
-000002a0  24 23 6e bc 77 fc 56 3b  31 15 58 1b e9 03 a1 bf  |$#n.w.V;1.X.....|
-000002b0  0a 06 a0 fb 47 77 b7 ad  01 db ee 6a bc a4 a1 77  |....Gw.....j...w|
-000002c0  6f 3e 70 84 4c a6 21 ec  ff fa f0 f0 68 ee 7d b1  |o>p.L.!.....h.}.|
-000002d0  e6 37 f1 1c aa 43 c7 b9  0e c4 52 7d 54 d8 f7 c5  |.7...C....R}T...|
-000002e0  16 21 99 89 cb 02 d0 54  b8 0e 91 2e 58 25 32 6e  |.!.....T....X%2n|
-000002f0  fa ae 62 c9 16 03 03 00  bc 0c 2f 7e 22 d8 7f 21  |..b......./~"..!|
-00000300  0c 1a ec e1 37 72 3f 03  1d cc 73 f9 63 95 cd 47  |....7r?...s.c..G|
-00000310  66 17 60 8c da b4 35 a2  44 b1 d8 d1 1c 98 5b 8b  |f.`...5.D.....[.|
-00000320  c8 9b c8 cb c4 15 0d 8d  08 1e 7c 3a 6b 20 3a f1  |..........|:k :.|
-00000330  d1 86 ae 08 bb fd 74 c5  62 9a 50 74 07 96 10 0e  |......t.b.Pt....|
-00000340  e0 e4 a4 da c4 9d d1 f4  15 97 7d 21 0f 6f cb 39  |..........}!.o.9|
-00000350  8e 4e 40 1a 2a 7f 15 88  94 52 bc fd 61 b8 37 d1  |.N@.*....R..a.7.|
-00000360  48 62 bc 53 a3 a6 62 ec  0e c3 1f 82 67 19 71 fa  |Hb.S..b.....g.q.|
-00000370  99 16 c3 cf d6 82 44 36  9e 0b f0 41 12 ca 7b 67  |......D6...A..{g|
-00000380  c3 a6 2d f7 13 14 0f d1  16 f9 2a 5a dd 43 45 c6  |..-.......*Z.CE.|
-00000390  c0 f4 17 36 64 11 fc ed  e6 66 b6 0c e2 3d fb 72  |...6d....f...=.r|
-000003a0  93 27 46 20 db 1b 24 f9  69 a0 c7 71 e2 27 6a 93  |.'F ..$.i..q.'j.|
-000003b0  36 73 71 10 bd 16 03 03  00 4a cb 15 91 9c 22 96  |6sq......J....".|
-000003c0  f0 c8 b9 4d 9a 6c b0 eb  1a c5 d4 06 12 89 44 1b  |...M.l........D.|
-000003d0  52 cd fb 32 3f 2c 25 f4  d3 88 0f e4 9c 18 91 59  |R..2?,%........Y|
-000003e0  42 98 a8 65 35 62 f7 ce  fa a3 56 46 c5 b1 da ac  |B..e5b....VF....|
-000003f0  9e 4e de 8d 14 fc 3c f3  94 74 50 99 1d 65 6b a6  |.N....<..tP..ek.|
-00000400  a9 38 93 9f 16 03 03 00  14 d7 5b 68 ca 4c 80 92  |.8........[h.L..|
-00000410  f8 13 5d fe 14 22 6f 9a  42 3a 27 de c8           |..].."o.B:'..|
+00000000  16 03 03 00 85 f1 26 e0  cc 3f 3d a3 e6 57 21 a0  |......&..?=..W!.|
+00000010  25 c6 fd 11 f5 92 2e 73  21 32 2b 07 76 73 2b e3  |%......s!2+.vs+.|
+00000020  0a 45 1e 01 c8 28 01 1b  ba 23 d8 4e 7c 9f 2b 2e  |.E...(...#.N|.+.|
+00000030  5a ef df 4f 0d 77 76 27  8b 1e df 94 a4 90 1e cb  |Z..O.wv'........|
+00000040  5a 19 6b f0 c6 85 71 7b  6b cd 59 e1 32 a5 a5 18  |Z.k...q{k.Y.2...|
+00000050  01 25 13 84 09 e5 30 6a  d3 f2 80 07 1d 48 9b 72  |.%....0j.....H.r|
+00000060  d2 6e 76 e3 de 85 0b 9d  ec 5f e3 48 02 61 6c b1  |.nv......_.H.al.|
+00000070  1a 1b 89 7e 44 f8 af fd  a9 42 63 3e f6 3c f6 22  |...~D....Bc>.<."|
+00000080  ff 45 b4 f2 ec 31 65 58  8c 06 16 03 03 02 69 50  |.E...1eX......iP|
+00000090  e3 4b 21 fd f3 73 28 b1  b2 dc f4 46 d3 37 c1 c9  |.K!..s(....F.7..|
+000000a0  15 9c 83 a0 4d b5 6e c1  8c 97 26 05 20 4d cf 92  |....M.n...&. M..|
+000000b0  9a e4 e6 ff c2 d1 d4 c9  28 ca 08 00 ed ba 2a e1  |........(.....*.|
+000000c0  d2 71 62 4a 1a ca 7d db  19 86 81 a1 4b c4 f7 19  |.qbJ..}.....K...|
+000000d0  d2 b1 99 4a 82 39 e5 d2  90 59 ca 19 a5 1c 07 1c  |...J.9...Y......|
+000000e0  c1 44 d5 f3 a4 e5 33 ce  98 fc 24 e9 65 04 b9 08  |.D....3...$.e...|
+000000f0  2f f7 d6 87 91 33 64 8c  9e e9 50 35 28 76 3d 77  |/....3d...P5(v=w|
+00000100  b2 84 16 23 a1 6f d1 92  da 37 28 88 63 51 db 55  |...#.o...7(.cQ.U|
+00000110  5d d4 29 ab 64 e8 dd 1f  ef 06 31 78 ab f1 11 82  |].).d.....1x....|
+00000120  76 35 17 66 87 62 bc 9e  18 be 35 96 4d 5c 2d c6  |v5.f.b....5.M\-.|
+00000130  84 13 08 00 ec f9 bd b8  24 88 f5 2a 2b 11 0b ec  |........$..*+...|
+00000140  55 a2 f3 c7 b4 7d cf 56  90 1f d9 c0 4a 0e 8c 8c  |U....}.V....J...|
+00000150  d4 72 60 18 f6 eb 6a ae  83 35 bf d2 4f 0e f3 06  |.r`...j..5..O...|
+00000160  73 3f e1 3a 03 1f 51 02  2f dc e1 f8 87 95 8a 13  |s?.:..Q./.......|
+00000170  d3 89 ac af 36 c8 1d 19  08 61 97 c9 e3 0a b9 1a  |....6....a......|
+00000180  12 6e f1 fd d5 e3 78 bc  34 b7 6b 1d b4 48 3e d5  |.n....x.4.k..H>.|
+00000190  61 99 04 e5 74 ca 53 66  65 21 c2 2c fb e6 12 3d  |a...t.Sfe!.,...=|
+000001a0  5e 48 ac b9 ef d8 a3 75  32 85 eb 6f 88 84 b6 2f  |^H.....u2..o.../|
+000001b0  d4 67 e7 25 26 80 c0 39  73 97 fb e5 8d ed 65 7e  |.g.%&..9s.....e~|
+000001c0  a4 35 4e b7 e3 92 72 23  80 c2 f5 db b4 02 26 33  |.5N...r#......&3|
+000001d0  ff 46 3e 0d e6 e0 02 b1  65 e0 3f 8e 7d fd 12 73  |.F>.....e.?.}..s|
+000001e0  62 20 6a fc 00 2b 19 cb  17 c7 de 14 05 4b b5 f6  |b j..+.......K..|
+000001f0  49 78 92 f4 84 1d 94 1b  b1 23 67 5e b2 ae 75 4e  |Ix.......#g^..uN|
+00000200  f3 52 72 af fb 2e 12 7c  cc 6b b6 f3 3a 8a e4 ae  |.Rr....|.k..:...|
+00000210  03 db ed 20 b1 e5 a9 7b  0d df ae 75 c9 71 42 c4  |... ...{...u.qB.|
+00000220  e5 c9 a7 ac c8 f4 a5 e6  84 05 a0 be ca d8 d0 d1  |................|
+00000230  30 a0 84 42 82 df ba ba  d7 11 a5 f9 93 fd 8e 91  |0..B............|
+00000240  89 2e 2f b2 98 05 06 dc  2c a4 2a 6f f4 0f 9d 1d  |../.....,.*o....|
+00000250  16 2f d8 b9 06 02 43 92  cc 96 bc 6a a4 93 86 ef  |./....C....j....|
+00000260  43 11 ec b7 4e 39 9f 1f  75 71 76 1a 7b 1d 2e 68  |C...N9..uqv.{..h|
+00000270  ad 36 c7 ae 3a 7a 70 10  46 4e 76 9b f5 8c 1d b7  |.6..:zp.FNv.....|
+00000280  5d 62 86 70 1c 27 84 ae  8a 05 65 a2 01 bf 3b 0f  |]b.p.'....e...;.|
+00000290  d3 43 74 9d a0 ed 7f e4  63 dc b9 e6 7b d6 c1 2d  |.Ct.....c...{..-|
+000002a0  96 ae 51 6e 07 47 8b f8  f7 e2 71 19 3a df 7d cb  |..Qn.G....q.:.}.|
+000002b0  ef 82 2a 11 fd 9c e9 24  9d b0 9e e4 1f f2 4e 8b  |..*....$......N.|
+000002c0  17 02 4a 27 33 85 61 d3  55 6d 82 77 ce 55 d3 be  |..J'3.a.Um.w.U..|
+000002d0  94 9f 6d 1d f0 16 1d 19  bd 1f ac 77 e7 13 32 94  |..m........w..2.|
+000002e0  86 8c c8 c9 33 f0 b0 47  cf 9c 7c ef 97 c3 37 25  |....3..G..|...7%|
+000002f0  bf a7 09 82 35 ff 9f 79  16 03 03 00 bc 8c 34 16  |....5..y......4.|
+00000300  37 9c cb db aa dc 23 ba  07 28 88 be 6f f0 cc 42  |7.....#..(..o..B|
+00000310  22 31 2c fc a4 ce d8 bf  58 54 a7 62 6b 54 8b b1  |"1,.....XT.bkT..|
+00000320  0b 44 29 a9 64 2f af ee  f1 7b 79 1c 26 02 a3 bd  |.D).d/...{y.&...|
+00000330  e5 dd 60 89 ef e9 31 bc  5d 17 fc a9 05 77 38 00  |..`...1.]....w8.|
+00000340  e8 d9 8c b3 c6 7d fb a0  f8 d1 87 2a c6 74 d6 2c  |.....}.....*.t.,|
+00000350  39 c8 3c d8 0d 0d a6 e2  ea 6b 88 9d 7d ee cc 4e  |9.<......k..}..N|
+00000360  69 2a ac 41 7e ac b8 fe  b4 8f 43 ef 2d a7 45 78  |i*.A~.....C.-.Ex|
+00000370  bf 29 72 b5 4b cf bb aa  1a 64 3c dd 38 07 ab 60  |.)r.K....d<.8..`|
+00000380  b3 ee e3 0b 40 a1 72 4d  61 1a ba d8 24 a7 46 3f  |....@.rMa...$.F?|
+00000390  77 c9 bd 11 37 d7 ae c9  92 d8 78 a5 13 f8 2c 2f  |w...7.....x...,/|
+000003a0  10 50 7c e5 16 2c 56 e7  a6 10 cb fc 62 a2 6f 83  |.P|..,V.....b.o.|
+000003b0  30 74 d3 94 23 78 c8 6d  28 16 03 03 00 4a 76 dc  |0t..#x.m(....Jv.|
+000003c0  db 13 a2 52 07 65 62 35  36 56 42 95 1d 34 8f 2a  |...R.eb56VB..4.*|
+000003d0  cd 5e 63 aa 56 70 ac 16  76 7b 7d b6 3f a4 57 6b  |.^c.Vp..v{}.?.Wk|
+000003e0  f1 9e 6a a7 ca e5 cb b0  44 5e 8b 6a ea 78 45 ad  |..j.....D^.j.xE.|
+000003f0  0c 9d 44 8c 1f 03 27 9b  90 2e 9e fc 50 44 1f 4d  |..D...'.....PD.M|
+00000400  f3 ac 1f 2f 6d ed 49 29  16 03 03 00 14 ba 05 de  |.../m.I)........|
+00000410  4f 96 62 af d1 e0 a6 64  0d f3 ee 50 ca 1f d1 50  |O.b....d...P...P|
+00000420  bb                                                |.|
 >>> Flow 9 (client to server)
-00000000  16 03 03 02 69 aa 39 9e  c8 e7 89 97 7f 22 3c 28  |....i.9......"<(|
-00000010  76 ac d9 48 51 e0 cd 22  53 a1 6d e7 b4 00 27 7d  |v..HQ.."S.m...'}|
-00000020  89 4b f0 54 d8 39 d0 a3  fc 35 a6 36 4b 3c eb 3a  |.K.T.9...5.6K<.:|
-00000030  00 b0 c1 17 9d c8 13 a5  58 ba 16 9e cb 21 50 dd  |........X....!P.|
-00000040  8a e0 2d 57 dd a6 bf 4d  6e b3 21 3b 46 f4 c3 77  |..-W...Mn.!;F..w|
-00000050  a1 86 07 c7 db e9 0a cb  2d 0f ff b5 1b ad 6b c4  |........-.....k.|
-00000060  c4 a4 4e 14 cf cb b2 6c  07 65 17 d2 db 30 e9 ec  |..N....l.e...0..|
-00000070  41 4e 78 26 12 27 08 a6  a7 84 39 c0 4b e7 4b 23  |ANx&.'....9.K.K#|
-00000080  2f ca ff 1e 41 9a e8 44  fc 5d a0 34 4e ca a8 6d  |/...A..D.].4N..m|
-00000090  31 51 57 c9 7e d1 0a 42  22 f2 b4 f9 a7 f9 28 d8  |1QW.~..B".....(.|
-000000a0  2a dd 19 0d 90 8b e1 78  b1 1c da 3a bb 5e 05 54  |*......x...:.^.T|
-000000b0  0d 0e f8 73 ed 01 e2 e4  d4 c1 f8 fa c3 d6 6f 42  |...s..........oB|
-000000c0  cc cb 99 99 97 18 b0 fb  ab 51 42 66 45 67 b6 29  |.........QBfEg.)|
-000000d0  02 60 ab 74 30 db f6 16  8a 8f 8e 9c cc d5 47 fa  |.`.t0.........G.|
-000000e0  f5 af 94 4f b1 94 40 57  ab 85 59 e4 3e cc c5 a0  |...O..@W..Y.>...|
-000000f0  61 b7 64 f9 dc 96 40 ae  fb 4c 57 39 9e 9a 23 8e  |a.d...@..LW9..#.|
-00000100  c9 36 6c 75 11 c7 6e 54  c3 1c e9 25 6a a0 f8 bb  |.6lu..nT...%j...|
-00000110  6b 5c ca 5c 06 6c 03 88  01 27 4c 89 02 e6 b6 1a  |k\.\.l...'L.....|
-00000120  92 99 4d 15 c1 1a aa 58  20 49 d7 4a f9 09 34 1e  |..M....X I.J..4.|
-00000130  d7 d8 31 79 9f d8 b3 a0  76 ba 96 77 77 77 5b 80  |..1y....v..www[.|
-00000140  88 ab a0 90 c7 5f 3d 82  e1 23 29 6e 3a 4d 9b f0  |....._=..#)n:M..|
-00000150  7b 6a b1 9d 78 ba 4c 7e  02 1f a0 73 3e 91 cf 75  |{j..x.L~...s>..u|
-00000160  c6 52 2d c6 79 be 85 65  0e e4 73 39 fe 53 6d e0  |.R-.y..e..s9.Sm.|
-00000170  a3 18 d5 69 80 ca f1 c8  ad f5 f4 fb b5 40 2e f8  |...i.........@..|
-00000180  30 82 ca 2c 46 6a ab a6  b2 83 9f a8 95 95 30 e3  |0..,Fj........0.|
-00000190  e3 30 6d f5 7c 83 96 af  12 d8 d6 d6 f9 6a ad bd  |.0m.|........j..|
-000001a0  bb 96 83 99 99 d8 6d 20  0e e1 be da 58 05 44 88  |......m ....X.D.|
-000001b0  a6 07 47 84 d4 77 fc 9b  fb d7 ac 60 70 0b e7 76  |..G..w.....`p..v|
-000001c0  13 c7 38 d9 3d 60 eb a6  9f a5 6d fc 5c d5 f6 2f  |..8.=`....m.\../|
-000001d0  31 02 38 65 8d be 04 06  84 95 86 b1 84 d9 ce c7  |1.8e............|
-000001e0  30 b9 d3 85 9f 1b 12 0f  5c 0e d6 8d e3 a0 15 04  |0.......\.......|
-000001f0  03 62 9d 52 7b e7 f4 13  aa 02 64 d9 d4 4b fd 6f  |.b.R{.....d..K.o|
-00000200  de ea 4a aa 91 60 e7 78  af 84 b5 9d c3 d2 c6 3a  |..J..`.x.......:|
-00000210  2a 9f 9b c6 8d 9e 5e 2c  90 6c d3 9d c1 be 96 5a  |*.....^,.l.....Z|
-00000220  60 d8 73 6c 49 50 c8 03  ec 58 73 bc b3 8c 30 c1  |`.slIP...Xs...0.|
-00000230  f4 a2 7d 74 3d 8d 7e 64  c1 a7 b6 24 13 06 72 1b  |..}t=.~d...$..r.|
-00000240  d0 87 22 af df 2a e7 fe  57 fa db e7 00 ba 74 35  |.."..*..W.....t5|
-00000250  16 34 20 3f 75 69 35 5f  64 7e 26 56 7c 93 05 4e  |.4 ?ui5_d~&V|..N|
-00000260  42 65 b8 bf 59 8e 82 13  f1 d0 05 95 c2 3d 16 03  |Be..Y........=..|
-00000270  03 00 35 99 1d 52 84 73  d6 e7 90 f6 41 9e 69 07  |..5..R.s....A.i.|
-00000280  39 0b bc b6 c7 f4 f2 a0  93 80 b9 c7 bb b4 a6 06  |9...............|
-00000290  50 5b 5d 75 97 cf c5 dc  2d 07 3d 8f 9e ae fa bf  |P[]u....-.=.....|
-000002a0  5b 6b 3e 98 02 fd e4 7d  16 03 03 00 98 80 ac e9  |[k>....}........|
-000002b0  4e e0 f8 b5 8c c2 2e 84  ec e0 3b eb b7 a0 14 2d  |N.........;....-|
-000002c0  ff d2 bf 35 14 20 06 00  2e 48 c7 f8 a3 fd 4f 50  |...5. ...H....OP|
-000002d0  4a 04 3e c7 07 50 90 72  29 f0 5c ac e1 fd 9d 3f  |J.>..P.r).\....?|
-000002e0  42 99 77 32 a9 79 24 7f  9e cc 84 1c d0 db 87 1c  |B.w2.y$.........|
-000002f0  3c 9a ae e3 45 e5 67 83  5f 75 e9 27 f3 ef 8a 15  |<...E.g._u.'....|
-00000300  88 2b 3f cc 6f 6f a4 78  d5 b2 96 3e 72 d4 c8 43  |.+?.oo.x...>r..C|
-00000310  98 a7 60 ae 38 8e fe 21  49 5b c2 80 d6 ef 6f 9b  |..`.8..!I[....o.|
-00000320  08 18 07 c2 64 00 a1 a0  09 8b b4 b7 eb 0c 68 30  |....d.........h0|
-00000330  26 87 f9 99 85 63 35 81  5a e4 31 19 9e f8 b8 7b  |&....c5.Z.1....{|
-00000340  81 aa 24 ff cd 14 03 03  00 11 84 c7 e1 8f 74 66  |..$...........tf|
-00000350  e6 bd 14 55 a8 d3 67 30  2d c4 fb 16 03 03 00 20  |...U..g0-...... |
-00000360  3a 63 a5 86 f3 78 f1 62  18 77 f7 25 71 52 56 17  |:c...x.b.w.%qRV.|
-00000370  d2 a5 e4 fa bc bb 44 07  85 37 cb 36 84 c7 6a 97  |......D..7.6..j.|
+00000000  16 03 03 02 69 54 06 eb  58 fb 0c cd 83 50 78 6d  |....iT..X....Pxm|
+00000010  e1 63 b0 24 eb 11 2b b3  76 77 c9 7b e4 ad c8 a9  |.c.$..+.vw.{....|
+00000020  71 73 68 a2 89 ba bc fd  0d d4 cc 7b 33 0a 11 c6  |qsh........{3...|
+00000030  a0 56 0f b4 86 e6 e5 31  85 2d 98 1b f0 28 67 2b  |.V.....1.-...(g+|
+00000040  d2 c8 9a 32 83 c1 50 10  16 08 70 72 fb 80 c7 a4  |...2..P...pr....|
+00000050  fa 95 88 bc 7c 45 67 1d  43 24 7b 56 9a 09 b6 38  |....|Eg.C${V...8|
+00000060  e2 4c 25 93 7a 02 f8 c4  f2 52 7e e4 8e 99 ad 9c  |.L%.z....R~.....|
+00000070  1d 8f 54 a5 67 d1 27 5d  c7 d0 76 47 a8 7f 54 79  |..T.g.']..vG..Ty|
+00000080  4c f2 98 bc 8c 3c 78 9b  6e c1 8b 2c 09 40 77 a9  |L....<x.n..,.@w.|
+00000090  69 3b 80 2f b7 a3 d0 54  66 4d 39 ec 30 ad 31 a4  |i;./...TfM9.0.1.|
+000000a0  a7 e2 3a 37 96 0e f8 e3  e5 b2 03 fc ce 72 d0 f0  |..:7.........r..|
+000000b0  84 08 c4 ff 95 9c 6c dc  e7 03 1f 45 d8 8a ec 92  |......l....E....|
+000000c0  98 87 eb 61 16 a9 b5 10  81 d1 ea 03 a5 62 d5 25  |...a.........b.%|
+000000d0  62 71 e8 56 4c a4 47 5f  6b cb 8c 50 c3 4c 17 8f  |bq.VL.G_k..P.L..|
+000000e0  64 f9 ab 22 9a 94 c7 68  7d c0 79 f2 5c 36 54 8c  |d.."...h}.y.\6T.|
+000000f0  53 31 d4 0a 52 5c 7f 11  87 e4 a8 83 b0 77 3e 73  |S1..R\.......w>s|
+00000100  d5 cd e8 4e 1b a2 4a 52  38 43 6a b1 fc 85 98 7e  |...N..JR8Cj....~|
+00000110  db 7d 0a 9c d9 bc 6e 7b  19 ce 3c 49 2f 8a d1 6d  |.}....n{..<I/..m|
+00000120  93 39 7f b2 3b ab 6b 19  4c cd 53 d7 6b ff ff 89  |.9..;.k.L.S.k...|
+00000130  fc bc cf cc 22 c9 aa 46  08 c4 7a e0 d1 44 c4 c5  |...."..F..z..D..|
+00000140  8b 2d 93 b5 70 d7 19 4f  2c 4b c6 52 16 7b a8 bd  |.-..p..O,K.R.{..|
+00000150  0c 46 a9 c2 b0 8f 3f 99  ef b4 13 c9 ad 26 a1 9e  |.F....?......&..|
+00000160  4a 64 ce 22 a7 de 98 f9  d4 1c 73 c7 e8 59 cf 8c  |Jd."......s..Y..|
+00000170  28 b4 39 f7 a6 08 76 d7  6d 7d b3 63 9b d1 64 e1  |(.9...v.m}.c..d.|
+00000180  10 ad b8 ff b5 93 5f 91  87 e2 72 93 47 b9 fc 8c  |......_...r.G...|
+00000190  5e e4 c6 28 72 90 5c 66  25 23 74 f9 e6 fc 0e da  |^..(r.\f%#t.....|
+000001a0  65 83 18 85 49 c6 d3 25  fe e2 90 02 0b 06 78 b0  |e...I..%......x.|
+000001b0  0d 2e fc 44 f6 5a 65 9f  55 e8 78 c2 a7 05 97 b6  |...D.Ze.U.x.....|
+000001c0  52 a5 18 51 61 eb 58 46  65 c1 51 8e 1f a0 3e 96  |R..Qa.XFe.Q...>.|
+000001d0  3a 52 24 2f 0a 33 c1 3b  34 74 ef 06 c5 5e 14 fb  |:R$/.3.;4t...^..|
+000001e0  b8 30 a3 80 2e c4 11 f3  a2 4c 03 65 60 c0 b0 0c  |.0.......L.e`...|
+000001f0  aa cd e8 2e f1 d8 f2 5a  4b 48 c0 5b 47 57 1d 9a  |.......ZKH.[GW..|
+00000200  a0 cc 9e dd 6f 22 7c 8b  f8 e3 21 2c fc 87 6e b0  |....o"|...!,..n.|
+00000210  cd bf 90 e4 05 f7 93 af  4a f0 73 73 4e af 70 ce  |........J.ssN.p.|
+00000220  8d 96 e3 b0 bc e8 3e e2  92 09 a4 74 52 1c 7c 55  |......>....tR.|U|
+00000230  5c 5c 64 07 05 9d f5 54  0f ff 1b 02 0c c4 22 94  |\\d....T......".|
+00000240  aa 7b 43 e0 9d 67 25 23  da 8b 03 26 02 1b 22 92  |.{C..g%#...&..".|
+00000250  ff f8 f6 be 40 54 c2 9b  18 af 53 63 70 76 7c ce  |....@T....Scpv|.|
+00000260  d4 e7 b6 f6 89 43 ec 11  af b3 05 ee de ad 16 03  |.....C..........|
+00000270  03 00 35 72 0c 52 b0 32  0a 1f fc 27 13 34 67 25  |..5r.R.2...'.4g%|
+00000280  a8 39 89 9e 6c ea 6f 25  72 f7 40 63 b2 c9 e2 e0  |.9..l.o%r.@c....|
+00000290  d4 eb 44 ad ae d0 58 1e  54 9c db 31 ba 03 44 9d  |..D...X.T..1..D.|
+000002a0  95 f5 f3 bb ef d6 4d f5  16 03 03 00 98 d6 86 68  |......M........h|
+000002b0  3d 68 f6 6d 2d cf 30 e8  32 2d 8e 1e b9 67 a1 8d  |=h.m-.0.2-...g..|
+000002c0  91 ae 10 8a d6 ce 3c f0  98 01 6a 96 c1 41 cc d4  |......<...j..A..|
+000002d0  b1 dc 49 25 be 0f 5b 59  6d f2 12 4d 49 92 e7 2d  |..I%..[Ym..MI..-|
+000002e0  3d 59 53 38 ff ca 2c 52  ea 30 1c 55 9d 7c 7c 3b  |=YS8..,R.0.U.||;|
+000002f0  2b 4f 53 0d d7 0f 50 1e  ac f9 97 de cb 46 f9 74  |+OS...P......F.t|
+00000300  78 ac 4b 82 e4 25 10 63  04 5c 64 c1 d6 e3 4b c1  |x.K..%.c.\d...K.|
+00000310  5a 41 02 79 06 bd 75 6f  54 8e a4 a8 6d 7d 30 98  |ZA.y..uoT...m}0.|
+00000320  3f 65 fb 6c dd 59 39 e5  8e a4 08 96 62 70 12 2f  |?e.l.Y9.....bp./|
+00000330  c5 94 3a 1b 2a 99 cc da  fb d3 85 19 5b 10 3c d9  |..:.*.......[.<.|
+00000340  b4 f9 e8 df c8 14 03 03  00 11 c3 3f 56 55 75 1b  |...........?VUu.|
+00000350  90 77 ff 04 f4 24 0d 0b  04 ac 2b 16 03 03 00 20  |.w...$....+.... |
+00000360  63 1a 0b 3e 2b 0b f0 d7  11 11 03 b0 0d f8 0c ce  |c..>+...........|
+00000370  25 c6 b4 0d ee 5c 95 40  9a 86 29 1d ee 06 29 88  |%....\.@..)...).|
 >>> Flow 10 (server to client)
-00000000  14 03 03 00 11 9e 99 89  2d 10 21 a1 38 04 77 1a  |........-.!.8.w.|
-00000010  f8 1d b4 01 d1 9f 16 03  03 00 20 2a cb 67 8b 1b  |.......... *.g..|
-00000020  44 26 41 7b c4 6d a1 f4  cb ee 15 87 01 65 18 5a  |D&A{.m.......e.Z|
-00000030  c7 2d 10 e4 91 01 cb 22  e8 92 1a 17 03 03 00 19  |.-....."........|
-00000040  1a 46 a0 9a c5 1a 27 0c  e2 f9 03 55 3a e8 43 a7  |.F....'....U:.C.|
-00000050  d7 47 a5 95 6a e7 a1 12  69 16 03 03 00 14 d6 e0  |.G..j...i.......|
-00000060  1d 89 e0 c2 9a 52 d5 bc  d4 08 3e f6 81 dd 57 a2  |.....R....>...W.|
-00000070  25 f6                                             |%.|
+00000000  14 03 03 00 11 5e 2d 5e  29 92 98 7e cd a8 00 b6  |.....^-^)..~....|
+00000010  08 53 39 b6 a2 d1 16 03  03 00 20 6e 0e 3e 92 3a  |.S9....... n.>.:|
+00000020  b5 a6 ec 3e f2 38 3e 78  86 77 3e 50 9d 29 de bc  |...>.8>x.w>P.)..|
+00000030  07 e7 d3 eb 20 ee a7 e9  5e 4c f6 17 03 03 00 19  |.... ...^L......|
+00000040  06 47 a1 60 72 a7 0d 81  84 86 5e 80 a7 73 7e d9  |.G.`r.....^..s~.|
+00000050  db f7 d6 97 f7 9c 12 66  b3 16 03 03 00 14 2b 6d  |.......f......+m|
+00000060  1a cb 48 9f a3 84 45 a6  d7 c9 ed 4f 15 44 ec c8  |..H...E....O.D..|
+00000070  9b a5                                             |..|
 >>> Flow 11 (client to server)
-00000000  16 03 03 01 16 27 50 ce  c0 8e 5a e2 54 55 cb c0  |.....'P...Z.TU..|
-00000010  08 c7 20 87 7e 78 c6 da  a6 7a 62 fd 7f f5 87 b3  |.. .~x...zb.....|
-00000020  83 a0 c8 70 ab 57 9b ca  bf 4c 07 06 f1 89 b9 b6  |...p.W...L......|
-00000030  24 f0 ae 72 e1 36 31 9f  74 ed 06 ad 44 3b 51 2c  |$..r.61.t...D;Q,|
-00000040  ed f0 c2 d8 9b 27 d2 9a  ec 44 88 80 7c 5a d0 66  |.....'...D..|Z.f|
-00000050  3d 84 e3 7c 24 89 b9 dd  8c eb 86 cd ce 69 0d e3  |=..|$........i..|
-00000060  97 ee ad 74 53 7f 9c f0  05 31 43 2a 8c 09 c4 11  |...tS....1C*....|
-00000070  46 3e 82 2c 3c 69 91 d1  eb 4b 8a ab a9 cb 24 00  |F>.,<i...K....$.|
-00000080  00 25 bd 26 d3 85 19 ff  3b 2b 92 3f 43 b0 9f 24  |.%.&....;+.?C..$|
-00000090  59 4f 3d a6 ce 65 27 5c  75 47 92 7b 4a d3 ca 55  |YO=..e'\uG.{J..U|
-000000a0  38 00 ac 37 0c 6e 2d 04  bc 6e fe 3a 9a 43 b6 7f  |8..7.n-..n.:.C..|
-000000b0  18 c1 a6 ce 49 b4 61 d3  97 8d a2 c9 fb fb cd 23  |....I.a........#|
-000000c0  f6 2f 0c 0b 2a b8 31 9e  fd ff 9f 44 1e 33 c3 23  |./..*.1....D.3.#|
-000000d0  bf 09 d2 de 90 b6 61 9c  33 33 33 46 bc 00 7e 16  |......a.333F..~.|
-000000e0  3c bd 82 2d 31 51 5b 11  87 ec 7f 25 d8 95 f9 9c  |<..-1Q[....%....|
-000000f0  df 00 54 40 f3 c1 08 fa  ef ba bc 5d b1 96 ae 8f  |..T@.......]....|
-00000100  35 0e 43 b2 50 c7 7e c4  b2 71 2e 40 3a b7 90 2b  |5.C.P.~..q.@:..+|
-00000110  81 ac 00 14 9d da d8 ca  5e 25 62                 |........^%b|
+00000000  16 03 03 01 1a 57 f6 a3  85 62 29 d9 5d b5 40 f7  |.....W...b).].@.|
+00000010  71 ce d5 59 fa a4 5f a7  b7 a0 37 4a 5c 6c 9c 85  |q..Y.._...7J\l..|
+00000020  e5 df be 22 14 a5 75 e5  79 0f 0f f9 91 00 74 f3  |..."..u.y.....t.|
+00000030  5f b9 2f a8 1b e4 4a d4  7b 7d 79 e1 81 e4 7e 6c  |_./...J.{}y...~l|
+00000040  7b b8 d4 c9 69 85 2a e7  4e 33 75 47 84 e6 7a 1c  |{...i.*.N3uG..z.|
+00000050  9f 14 76 07 2c 53 e0 ab  ba 5a c6 e3 a4 08 12 9e  |..v.,S...Z......|
+00000060  99 15 ed ce 17 e1 6e 20  a8 f2 24 84 53 da c6 0f  |......n ..$.S...|
+00000070  2f d5 c7 bf 23 00 90 1f  9f af 0f f7 d6 ad f6 4a  |/...#..........J|
+00000080  3f 88 ec c2 a7 04 08 0f  97 e4 b5 6b a5 19 a4 98  |?..........k....|
+00000090  f7 ab a3 e1 44 56 39 b0  1d 2d c4 59 a7 3c d6 b4  |....DV9..-.Y.<..|
+000000a0  44 8d ae 56 0e d5 6b ab  a4 33 da d1 c3 38 4b fe  |D..V..k..3...8K.|
+000000b0  cc 40 3b 78 67 26 50 dd  75 3e a5 23 37 05 32 cf  |.@;xg&P.u>.#7.2.|
+000000c0  b4 6d a3 c1 a3 83 f8 1d  a4 80 7c e9 69 84 5c 55  |.m........|.i.\U|
+000000d0  92 7a 99 d7 86 27 dc be  54 27 d3 1d 1e ad 01 6d  |.z...'..T'.....m|
+000000e0  58 27 e2 82 a1 e4 55 03  67 b9 ee 51 b1 2d f9 25  |X'....U.g..Q.-.%|
+000000f0  28 a3 c7 44 08 b0 3b 60  46 23 2c 17 76 f2 78 1e  |(..D..;`F#,.v.x.|
+00000100  3c f2 b5 5c b0 1e 5d a7  9c e6 4f c3 ba 34 40 30  |<..\..]...O..4@0|
+00000110  d6 e3 68 2a d6 d2 75 04  d5 44 2d 41 87 c8 96     |..h*..u..D-A...|
 >>> Flow 12 (server to client)
-00000000  16 03 03 00 81 37 3a f4  1b 6a 43 d2 6a 02 02 33  |.....7:..jC.j..3|
-00000010  b9 d5 9a 5c d1 3b 52 73  f2 27 a6 c0 f0 9b dd f3  |...\.;Rs.'......|
-00000020  d7 cd 89 ec 21 e0 d3 2f  4d 6c b0 cf 50 a7 39 43  |....!../Ml..P.9C|
-00000030  c2 56 d2 f8 45 d7 3c a6  b6 b9 06 3f ca a7 f8 37  |.V..E.<....?...7|
-00000040  4c 89 01 49 82 5f 27 15  3c bf f0 86 7c 1a 84 03  |L..I._'.<...|...|
-00000050  5a 90 77 03 01 fd b8 60  2a be cc 60 c6 54 b5 ec  |Z.w....`*..`.T..|
-00000060  c1 5d 6b e6 f0 2c 8c e6  7e e3 b6 c3 8b 63 3c 69  |.]k..,..~....c<i|
-00000070  ac 2c 9a 24 a7 77 5f 0c  36 08 68 6c 8b 76 f1 80  |.,.$.w_.6.hl.v..|
-00000080  4a bf f7 e6 15 5b 16 03  03 02 69 a1 ce a6 de 44  |J....[....i....D|
-00000090  cf d6 f7 88 f4 da 01 06  2b e5 cf 54 8d f6 78 ab  |........+..T..x.|
-000000a0  53 c5 ea d9 97 4b 94 22  24 9b 98 ba ba ee 42 9d  |S....K."$.....B.|
-000000b0  c3 e4 12 e3 be 35 24 86  3d 38 a0 6e b7 e6 cf dc  |.....5$.=8.n....|
-000000c0  e7 5c e1 0d 7c 05 bb 63  7c 8b c4 a4 db 9a 85 a4  |.\..|..c|.......|
-000000d0  ba d6 d4 79 38 79 01 52  2d cf c1 c7 6e 09 64 ff  |...y8y.R-...n.d.|
-000000e0  e9 b6 3e f2 a0 2b 4c 91  3f e2 fe 1a 40 4b 14 ea  |..>..+L.?...@K..|
-000000f0  77 8f 40 1c a2 96 7c d3  ce 34 5e d8 13 5a 82 33  |w.@...|..4^..Z.3|
-00000100  41 59 fa d9 81 1c 85 41  9c 61 b9 ca d5 46 e2 77  |AY.....A.a...F.w|
-00000110  3d a9 50 4f 11 b1 34 aa  ae fd e5 ec fe 12 e6 10  |=.PO..4.........|
-00000120  36 84 fb 25 f8 a4 6f 44  e3 ac 89 67 e4 9a 02 c4  |6..%..oD...g....|
-00000130  8f a9 4a d0 f4 64 e2 de  da 80 02 60 cb a9 2d e0  |..J..d.....`..-.|
-00000140  fa d9 b9 ee 43 e1 3e ed  79 79 6b 21 62 3d 6f b0  |....C.>.yyk!b=o.|
-00000150  77 53 db 26 60 e1 d6 ff  a7 01 2b b7 f0 49 df b8  |wS.&`.....+..I..|
-00000160  bc d9 ac 77 80 f8 53 66  16 8d 3a 8d 63 fa 12 e1  |...w..Sf..:.c...|
-00000170  ed f7 8b c0 40 46 16 70  e3 db f3 38 87 9f 11 eb  |....@F.p...8....|
-00000180  0b f5 b3 44 e4 16 e1 ed  85 e6 67 d5 35 60 20 99  |...D......g.5` .|
-00000190  7d bd 9f 65 b9 52 68 6c  6b 83 f9 06 e3 a7 3e 0f  |}..e.Rhlk.....>.|
-000001a0  9e 7c a5 ac 87 7a 45 53  a5 3f 27 5b 99 a9 34 c2  |.|...zES.?'[..4.|
-000001b0  5a 44 9a 30 08 30 c6 ff  60 8a a5 72 f7 49 d3 7c  |ZD.0.0..`..r.I.||
-000001c0  1f f9 8b 74 a0 b1 c8 65  84 6d 91 86 ab 1e 82 3b  |...t...e.m.....;|
-000001d0  d5 c4 bb 06 b3 31 61 bb  0e 65 3e 18 4d 0c c1 c1  |.....1a..e>.M...|
-000001e0  9d 7f ea ad cf 53 2e 9c  1c 7e aa c8 84 9e 0d ce  |.....S...~......|
-000001f0  91 53 3c d4 05 7e 57 d1  8b 55 ea e4 6e 57 90 4c  |.S<..~W..U..nW.L|
-00000200  bb 74 9c 87 1c 6a 89 cf  2c 50 8d 04 04 e6 18 c8  |.t...j..,P......|
-00000210  0c 9f 38 84 f4 f4 94 8d  33 2b a1 27 0b 5c 6a 2a  |..8.....3+.'.\j*|
-00000220  0c 13 b7 07 b7 a0 c9 e5  3c 9d 5a 7e 96 c9 53 fc  |........<.Z~..S.|
-00000230  ff c4 3a 8f 16 1f 2d 64  50 1d 13 c3 55 fb af d2  |..:...-dP...U...|
-00000240  0e f9 e6 18 e3 62 ce 6a  8f 96 ff 00 0e fe 27 53  |.....b.j......'S|
-00000250  70 57 53 2d fd f3 02 c7  fe b3 19 49 88 27 7e a2  |pWS-.......I.'~.|
-00000260  42 7b 22 d0 77 4e e5 04  aa 0d b6 9d b9 48 97 ab  |B{".wN.......H..|
-00000270  33 e7 14 97 65 82 f9 2c  dc 71 9e 4b eb ed 42 73  |3...e..,.q.K..Bs|
-00000280  c6 c8 93 8a 3a 24 bd f9  b4 6a 95 c1 1b 22 1d f5  |....:$...j..."..|
-00000290  c8 33 c5 38 1e a7 2e 91  68 35 4c 0a 37 57 ac e2  |.3.8....h5L.7W..|
-000002a0  c9 37 9e d9 1c b8 76 73  c2 d2 0c d0 c4 a1 c0 d5  |.7....vs........|
-000002b0  72 39 bf 03 f7 8d db e0  8f fe e2 d6 d0 d4 cc bb  |r9..............|
-000002c0  7d 78 c6 c5 13 a8 4e 45  1e 66 60 77 fe 26 4d 18  |}x....NE.f`w.&M.|
-000002d0  90 e8 e1 0c 5b 2b 25 9b  ee 6d 76 3f f6 23 a2 26  |....[+%..mv?.#.&|
-000002e0  52 8d a9 4e 7f ed 8e e2  6d 7c b4 eb 25 46 54 27  |R..N....m|..%FT'|
-000002f0  e2 2d 2c 59 16 03 03 00  bc 6e c1 fb 66 55 ca ea  |.-,Y.....n..fU..|
-00000300  56 62 78 2f fd c4 ff da  78 dd e7 4d 34 59 a5 8f  |Vbx/....x..M4Y..|
-00000310  05 ab ac 7f 80 35 f6 de  9d 3f fe 4b d4 79 07 3b  |.....5...?.K.y.;|
-00000320  c0 8d 02 b8 1a 28 b5 eb  9b 55 6c 26 12 8d 38 01  |.....(...Ul&..8.|
-00000330  55 ed 28 68 aa 48 13 61  d3 fe 29 f0 fe 18 4e ae  |U.(h.H.a..)...N.|
-00000340  6e f9 47 7c 65 91 f9 5e  17 80 68 fd 19 4d ed 17  |n.G|e..^..h..M..|
-00000350  7f 11 c4 15 5d 4b fc ea  a7 5c df 76 a0 08 2e 15  |....]K...\.v....|
-00000360  d1 c6 ae 7b 0d 1f 79 d7  0c 59 6b 53 46 b6 c0 2b  |...{..y..YkSF..+|
-00000370  ce 09 39 12 7a df f6 7d  a2 4b 86 2a df ab b8 7c  |..9.z..}.K.*...||
-00000380  07 10 3c 34 cd 15 4c ac  68 a4 28 8a f8 fc 30 a4  |..<4..L.h.(...0.|
-00000390  4f 15 77 b4 91 ca 02 ee  bb 64 36 90 1b 4b 9d 2b  |O.w......d6..K.+|
-000003a0  72 e7 dc 10 bd 83 97 18  3c 56 68 58 c9 e3 22 df  |r.......<VhX..".|
-000003b0  33 43 81 7d 5f 16 03 03  00 14 a8 eb 40 73 19 19  |3C.}_.......@s..|
-000003c0  22 10 63 ed f0 6d 73 8c  f4 bd f9 ba ad 2e        |".c..ms.......|
+00000000  16 03 03 00 85 77 11 78  f7 3a 59 c7 f1 a4 e6 6c  |.....w.x.:Y....l|
+00000010  3d e2 e0 1e 96 f7 2c d6  ce ef 27 3b 7f 37 cb bc  |=.....,...';.7..|
+00000020  8e ca c0 57 ab 03 1e cc  d1 fb 6c 49 e2 89 48 a1  |...W......lI..H.|
+00000030  84 00 a2 9b cb ae 2a ec  7c 60 9c 0c bf ff 07 ae  |......*.|`......|
+00000040  13 16 7b 7b a2 80 35 d3  5d 17 18 5a fb d8 87 46  |..{{..5.]..Z...F|
+00000050  43 6e e7 e9 35 5f bb 5c  87 03 0d 3c 93 6d f9 9b  |Cn..5_.\...<.m..|
+00000060  28 b9 42 c3 ea f0 11 60  a1 f4 72 c0 f9 4c e9 36  |(.B....`..r..L.6|
+00000070  77 c7 d0 e4 4b 7e d8 b4  68 d9 7f 97 bc 07 c5 4b  |w...K~..h......K|
+00000080  5e 11 1d ab 6e a4 24 41  2c d3 16 03 03 02 69 e7  |^...n.$A,.....i.|
+00000090  68 ab 42 56 cb b5 70 a0  3b 63 c4 a6 10 49 1d d5  |h.BV..p.;c...I..|
+000000a0  15 33 29 54 8f 36 a8 3c  b7 8e 79 5a e7 45 6d cc  |.3)T.6.<..yZ.Em.|
+000000b0  c0 5f da 0a c1 13 56 b5  2d 8e 56 16 b4 ca 48 1d  |._....V.-.V...H.|
+000000c0  30 3f 58 c6 79 06 a2 c0  3f 6f 59 4a dc f0 09 5d  |0?X.y...?oYJ...]|
+000000d0  45 2a 23 4f ab 72 f4 4c  4d e0 05 44 7f 4c ab 25  |E*#O.r.LM..D.L.%|
+000000e0  6f 9c 6a c4 cf c0 bd 86  03 c1 b2 b2 12 4e c2 0b  |o.j..........N..|
+000000f0  3e 8d 06 89 bb 46 70 79  51 33 eb 0d be ed 6e 0e  |>....FpyQ3....n.|
+00000100  33 08 48 53 2a 2a fb da  13 61 da 21 df 8b 74 85  |3.HS**...a.!..t.|
+00000110  42 25 1f cf 7f 00 4c ca  80 9a 3d 25 07 da 22 bd  |B%....L...=%..".|
+00000120  17 47 75 e5 da 60 88 67  65 19 55 b6 05 fc 6d fa  |.Gu..`.ge.U...m.|
+00000130  9c 3d 19 fd 61 87 92 87  c5 95 80 06 d0 1a 71 7f  |.=..a.........q.|
+00000140  05 67 f3 f6 af da 35 1f  d1 49 63 49 89 28 d1 21  |.g....5..IcI.(.!|
+00000150  14 e0 06 14 14 83 a9 d9  86 21 68 0f 66 86 62 4d  |.........!h.f.bM|
+00000160  cc 7f 9e dc 79 fd eb 14  59 e7 cc bd 5c 29 86 4a  |....y...Y...\).J|
+00000170  5f 64 d2 7b 37 d1 72 4b  ae 5b 12 c3 0c b0 a6 8a  |_d.{7.rK.[......|
+00000180  99 e5 89 e7 9e 76 1e 85  fc b6 ae 4b fd 20 8b 6a  |.....v.....K. .j|
+00000190  7d 7d 2b ff 11 d4 82 f0  2a d7 d6 9e e7 48 6e 1c  |}}+.....*....Hn.|
+000001a0  1d 33 2b 31 af aa 67 a7  66 b0 47 10 b8 f7 b8 0e  |.3+1..g.f.G.....|
+000001b0  0c ef 09 93 0a 42 2b 68  c8 30 cf d6 d4 8c 23 71  |.....B+h.0....#q|
+000001c0  ef c3 bd f6 eb 74 b5 4e  1a 94 44 43 98 c8 ec b3  |.....t.N..DC....|
+000001d0  51 10 44 2c f3 ae 27 c7  f3 5c 63 74 a8 1c f8 ff  |Q.D,..'..\ct....|
+000001e0  a9 38 c2 7f b4 66 fd 3b  9d a7 9c 7a 93 fd a3 09  |.8...f.;...z....|
+000001f0  a6 51 c5 fd 6f 82 cc fb  d2 58 bf 6e be 0d f2 4e  |.Q..o....X.n...N|
+00000200  2c 8c 08 6f 25 ae 82 bf  b6 bf b7 71 44 b6 4f 90  |,..o%......qD.O.|
+00000210  2e 1d 4e 1d 62 19 ee c7  4b 47 08 af 14 e3 cd 43  |..N.b...KG.....C|
+00000220  fb 37 e0 d2 58 d7 03 7e  f6 81 74 e9 a8 33 a2 7f  |.7..X..~..t..3..|
+00000230  06 94 5a 74 63 15 e1 f9  95 d3 b5 d6 52 e4 a4 5f  |..Ztc.......R.._|
+00000240  7d 16 3d 6e c6 53 3c 45  f5 f3 bc 91 7d 48 55 58  |}.=n.S<E....}HUX|
+00000250  51 a2 8e fc e4 aa e0 24  0f 9c 0c fb d9 2f d9 5a  |Q......$...../.Z|
+00000260  b8 02 df e6 71 30 64 e7  27 f9 b4 bc 3b 3a 5d a0  |....q0d.'...;:].|
+00000270  dd 7a fe 15 81 1d c2 41  02 65 a8 68 1e 29 ea 3a  |.z.....A.e.h.).:|
+00000280  0e 6a 0e 3f bf 61 4f 5f  b9 ce 5d 60 8e 55 0e ef  |.j.?.aO_..]`.U..|
+00000290  26 b5 5a d2 c8 f2 94 fd  b4 5e da e8 14 47 64 d8  |&.Z......^...Gd.|
+000002a0  3e 5c 2d 70 5b 9e 3a 74  eb 80 63 fe 7a 2f ac bd  |>\-p[.:t..c.z/..|
+000002b0  4b 53 31 72 3d 20 89 60  8c 6e ce c7 07 d4 a9 6d  |KS1r= .`.n.....m|
+000002c0  28 76 a3 78 e0 ae 11 3f  31 e5 64 fe 35 39 d8 88  |(v.x...?1.d.59..|
+000002d0  40 eb d0 f2 df db 1b 16  3a 11 33 ce 7c 63 cd 34  |@.......:.3.|c.4|
+000002e0  17 8c a3 d5 d1 8f 34 21  a7 fa b3 8f f1 84 b0 06  |......4!........|
+000002f0  d1 83 15 ac 26 1b 68 74  16 03 03 00 bc d2 f0 3d  |....&.ht.......=|
+00000300  2b a9 8c 75 e9 24 7a e8  0a ec 11 d7 cf 08 8e 5d  |+..u.$z........]|
+00000310  00 13 51 7f 2e 7a 6c 4b  e2 35 c2 e0 9d c3 cb 79  |..Q..zlK.5.....y|
+00000320  8f ec 2b 21 8f 96 4d b8  b8 0c b7 d8 d1 7f dc 5b  |..+!..M........[|
+00000330  85 8b b9 54 ba f6 65 76  5f b4 99 20 47 52 d8 96  |...T..ev_.. GR..|
+00000340  ac 12 b0 84 77 9b 42 09  fe c4 cf b4 22 e3 e8 3c  |....w.B....."..<|
+00000350  a0 a0 e8 8e ab 61 0b 16  98 f3 bd ae 60 36 55 5a  |.....a......`6UZ|
+00000360  6b 85 8b 79 03 4f 65 15  83 06 45 eb c7 d9 de 41  |k..y.Oe...E....A|
+00000370  53 0f 1f 12 ef 13 33 cc  a6 fc 91 e4 7e a7 a3 31  |S.....3.....~..1|
+00000380  6f 40 f4 d3 0e 2c 22 de  72 64 0d cd e0 e8 ee 21  |o@...,".rd.....!|
+00000390  4b bd ef 53 78 9e 41 ce  04 96 3a 2f bc e7 41 6b  |K..Sx.A...:/..Ak|
+000003a0  e0 a8 9e 40 02 1b 09 ab  8b 37 4c 2b b4 bc e1 72  |...@.....7L+...r|
+000003b0  06 af 88 24 75 6d 10 3a  d5 16 03 03 00 14 8d 09  |...$um.:........|
+000003c0  7b 2e 7a 58 f8 1c 63 44  0a a9 c4 5d 9f 5c cc 73  |{.zX..cD...].\.s|
+000003d0  47 1a                                             |G.|
 >>> Flow 13 (client to server)
-00000000  16 03 03 00 35 67 14 4b  ca 21 7f d2 82 1d 2e b3  |....5g.K.!......|
-00000010  1a 82 ae 2d d9 d6 7c 76  94 78 d4 ec 0e 4d fe 5c  |...-..|v.x...M.\|
-00000020  d5 56 5e 6d 32 f4 a0 64  50 1e f6 e4 32 28 92 80  |.V^m2..dP...2(..|
-00000030  d4 15 1c d5 f6 52 fc ca  c0 e7 14 03 03 00 11 df  |.....R..........|
-00000040  9d f3 d1 64 92 92 7e 11  77 64 e5 67 01 33 49 17  |...d..~.wd.g.3I.|
-00000050  16 03 03 00 20 c8 0f d9  d2 c8 b7 d6 a5 ac 2c 33  |.... .........,3|
-00000060  f8 77 8f b1 df db 16 de  43 6c e6 5a eb a0 6e ff  |.w......Cl.Z..n.|
-00000070  be 1d 69 ab 30                                    |..i.0|
+00000000  16 03 03 00 35 e1 bc fd  92 30 16 7d 71 c5 fc 15  |....5....0.}q...|
+00000010  6f eb 98 2b 8c bb b6 d3  0b 6d 71 12 54 7d 08 a6  |o..+.....mq.T}..|
+00000020  f1 a0 5b 37 6b 8b b7 f9  d6 11 53 c9 2c a4 b2 d3  |..[7k.....S.,...|
+00000030  52 db 73 f4 75 3d 45 78  68 e5 14 03 03 00 11 51  |R.s.u=Exh......Q|
+00000040  52 83 7e bd 5f 63 51 a4  1e 78 06 3b f1 f9 f8 a3  |R.~._cQ..x.;....|
+00000050  16 03 03 00 20 44 02 6e  8f fe 3a 25 40 e5 63 29  |.... D.n..:%@.c)|
+00000060  51 ce 94 55 cb 16 5a 9e  0d ec a8 73 f9 e8 46 06  |Q..U..Z....s..F.|
+00000070  b5 98 7f c2 98                                    |.....|
 >>> Flow 14 (server to client)
-00000000  14 03 03 00 11 6e 2c 51  c5 dd fa 70 2a 34 e0 cc  |.....n,Q...p*4..|
-00000010  3c 9f b8 66 15 e6 16 03  03 00 20 78 02 96 c6 24  |<..f...... x...$|
-00000020  57 ca 4a 60 47 68 f6 5a  13 8b 3b ce 90 60 d2 e3  |W.J`Gh.Z..;..`..|
-00000030  1b d8 ab 1c df d4 5e c2  8d 5c 5b 17 03 03 00 19  |......^..\[.....|
-00000040  b7 15 fb 91 10 48 ae 25  0c cd 4f 06 fa 2a 59 49  |.....H.%..O..*YI|
-00000050  2f 18 5e 7e 36 1b 2e cb  3a                       |/.^~6...:|
+00000000  14 03 03 00 11 da c7 c6  7f 04 1e 65 7a cb 53 02  |...........ez.S.|
+00000010  57 f7 6c f5 3b ca 16 03  03 00 20 9e 0e 55 81 35  |W.l.;..... ..U.5|
+00000020  15 c9 22 94 be 1e f4 5e  1e 95 99 e5 ba 4a b6 1a  |.."....^.....J..|
+00000030  38 b5 31 25 85 4c a9 a8  39 fc 10 17 03 03 00 19  |8.1%.L..9.......|
+00000040  61 c9 ca 41 f7 9d 66 08  bd 30 42 b2 7f 56 a7 46  |a..A..f..0B..V.F|
+00000050  f4 23 18 30 c3 ec 96 cf  7f                       |.#.0.....|
 >>> Flow 15 (client to server)
-00000000  15 03 03 00 12 c3 ff f7  b3 dc d4 b3 f5 d4 7c a3  |..............|.|
-00000010  18 db 08 a2 50 ad 75                              |....P.u|
+00000000  15 03 03 00 12 3a 24 58  49 ca a4 b1 6e 58 f2 e1  |.....:$XI...nX..|
+00000010  df 3c c2 63 3d 59 e4                              |.<.c=Y.|
diff --git a/src/crypto/tls/testdata/Client-TLSv12-RenegotiateTwiceRejected b/src/crypto/tls/testdata/Client-TLSv12-RenegotiateTwiceRejected
index 784bcef..898f5f2 100644
--- a/src/crypto/tls/testdata/Client-TLSv12-RenegotiateTwiceRejected
+++ b/src/crypto/tls/testdata/Client-TLSv12-RenegotiateTwiceRejected
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fe 01 00 00  fa 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 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,241 +7,243 @@
 00000050  cc a8 c0 2b c0 2f c0 2c  c0 30 c0 09 c0 13 c0 0a  |...+./.,.0......|
 00000060  c0 14 00 9c 00 9d 00 2f  00 35 c0 12 00 0a c0 23  |......./.5.....#|
 00000070  c0 27 00 3c c0 07 c0 11  00 05 13 03 13 01 13 02  |.'.<............|
-00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
+00000080  01 00 00 7f 00 05 00 05  01 00 00 00 00 00 0a 00  |................|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
 000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
 000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
-000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
-000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
-000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
-000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
+000000c0  01 00 01 00 00 17 00 00  00 12 00 00 00 2b 00 09  |.............+..|
+000000d0  08 03 04 03 03 03 02 03  01 00 33 00 26 00 24 00  |..........3.&.$.|
+000000e0  1d 00 20 2f e5 7d a3 47  cd 62 43 15 28 da ac 5f  |.. /.}.G.bC.(.._|
+000000f0  bb 29 07 30 ff f6 84 af  c4 cf c2 ed 90 99 5f 58  |.).0.........._X|
+00000100  cb 3b 74                                          |.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 59 02 00 00  55 03 03 96 8a 79 30 8b  |....Y...U....y0.|
-00000010  13 f5 d3 1c 09 45 76 83  d7 2e e5 ad e3 ee e1 c4  |.....Ev.........|
-00000020  d4 b4 4c 37 93 cb 90 e1  9a 5e 52 20 fb 25 91 ea  |..L7.....^R .%..|
-00000030  1a 96 b6 fb 1f 0c a8 62  06 a0 fe 51 68 c0 fb a5  |.......b...Qh...|
-00000040  f1 05 28 02 be dc 87 31  e6 ff 90 1a cc a8 00 00  |..(....1........|
-00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
-00000060  03 02 59 0b 00 02 55 00  02 52 00 02 4f 30 82 02  |..Y...U..R..O0..|
-00000070  4b 30 82 01 b4 a0 03 02  01 02 02 09 00 e8 f0 9d  |K0..............|
-00000080  3f e2 5b ea a6 30 0d 06  09 2a 86 48 86 f7 0d 01  |?.[..0...*.H....|
-00000090  01 0b 05 00 30 1f 31 0b  30 09 06 03 55 04 0a 13  |....0.1.0...U...|
-000000a0  02 47 6f 31 10 30 0e 06  03 55 04 03 13 07 47 6f  |.Go1.0...U....Go|
-000000b0  20 52 6f 6f 74 30 1e 17  0d 31 36 30 31 30 31 30  | Root0...1601010|
-000000c0  30 30 30 30 30 5a 17 0d  32 35 30 31 30 31 30 30  |00000Z..25010100|
-000000d0  30 30 30 30 5a 30 1a 31  0b 30 09 06 03 55 04 0a  |0000Z0.1.0...U..|
-000000e0  13 02 47 6f 31 0b 30 09  06 03 55 04 03 13 02 47  |..Go1.0...U....G|
-000000f0  6f 30 81 9f 30 0d 06 09  2a 86 48 86 f7 0d 01 01  |o0..0...*.H.....|
-00000100  01 05 00 03 81 8d 00 30  81 89 02 81 81 00 db 46  |.......0.......F|
-00000110  7d 93 2e 12 27 06 48 bc  06 28 21 ab 7e c4 b6 a2  |}...'.H..(!.~...|
-00000120  5d fe 1e 52 45 88 7a 36  47 a5 08 0d 92 42 5b c2  |]..RE.z6G....B[.|
-00000130  81 c0 be 97 79 98 40 fb  4f 6d 14 fd 2b 13 8b c2  |....y.@.Om..+...|
-00000140  a5 2e 67 d8 d4 09 9e d6  22 38 b7 4a 0b 74 73 2b  |..g....."8.J.ts+|
-00000150  c2 34 f1 d1 93 e5 96 d9  74 7b f3 58 9f 6c 61 3c  |.4......t{.X.la<|
-00000160  c0 b0 41 d4 d9 2b 2b 24  23 77 5b 1c 3b bd 75 5d  |..A..++$#w[.;.u]|
-00000170  ce 20 54 cf a1 63 87 1d  1e 24 c4 f3 1d 1a 50 8b  |. T..c...$....P.|
-00000180  aa b6 14 43 ed 97 a7 75  62 f4 14 c8 52 d7 02 03  |...C...ub...R...|
-00000190  01 00 01 a3 81 93 30 81  90 30 0e 06 03 55 1d 0f  |......0..0...U..|
-000001a0  01 01 ff 04 04 03 02 05  a0 30 1d 06 03 55 1d 25  |.........0...U.%|
-000001b0  04 16 30 14 06 08 2b 06  01 05 05 07 03 01 06 08  |..0...+.........|
-000001c0  2b 06 01 05 05 07 03 02  30 0c 06 03 55 1d 13 01  |+.......0...U...|
-000001d0  01 ff 04 02 30 00 30 19  06 03 55 1d 0e 04 12 04  |....0.0...U.....|
-000001e0  10 9f 91 16 1f 43 43 3e  49 a6 de 6d b6 80 d7 9f  |.....CC>I..m....|
-000001f0  60 30 1b 06 03 55 1d 23  04 14 30 12 80 10 48 13  |`0...U.#..0...H.|
-00000200  49 4d 13 7e 16 31 bb a3  01 d5 ac ab 6e 7b 30 19  |IM.~.1......n{0.|
-00000210  06 03 55 1d 11 04 12 30  10 82 0e 65 78 61 6d 70  |..U....0...examp|
-00000220  6c 65 2e 67 6f 6c 61 6e  67 30 0d 06 09 2a 86 48  |le.golang0...*.H|
-00000230  86 f7 0d 01 01 0b 05 00  03 81 81 00 9d 30 cc 40  |.............0.@|
-00000240  2b 5b 50 a0 61 cb ba e5  53 58 e1 ed 83 28 a9 58  |+[P.a...SX...(.X|
-00000250  1a a9 38 a4 95 a1 ac 31  5a 1a 84 66 3d 43 d3 2d  |..8....1Z..f=C.-|
-00000260  d9 0b f2 97 df d3 20 64  38 92 24 3a 00 bc cf 9c  |...... d8.$:....|
-00000270  7d b7 40 20 01 5f aa d3  16 61 09 a2 76 fd 13 c3  |}.@ ._...a..v...|
-00000280  cc e1 0c 5c ee b1 87 82  f1 6c 04 ed 73 bb b3 43  |...\.....l..s..C|
-00000290  77 8d 0c 1c f1 0f a1 d8  40 83 61 c9 4c 72 2b 9d  |w.......@.a.Lr+.|
-000002a0  ae db 46 06 06 4d f4 c1  b3 3e c0 d1 bd 42 d4 db  |..F..M...>...B..|
-000002b0  fe 3d 13 60 84 5c 21 d3  3b e9 fa e7 16 03 03 00  |.=.`.\!.;.......|
-000002c0  ac 0c 00 00 a8 03 00 1d  20 ad 8e 56 2a c0 d0 7c  |........ ..V*..||
-000002d0  e1 cb 6b 20 0b 3e 53 33  28 25 37 42 5b 13 3c d5  |..k .>S3(%7B[.<.|
-000002e0  26 98 9e 0f df 45 6d 27  67 08 04 00 80 72 49 21  |&....Em'g....rI!|
-000002f0  f0 02 02 a3 7c e1 2a 18  d0 d0 21 8e 50 17 ad 0c  |....|.*...!.P...|
-00000300  3c a2 6d 65 b5 cb bc 7f  9e 7d 7f e2 36 3d b6 c8  |<.me.....}..6=..|
-00000310  df 7e b9 28 ab 01 99 2a  68 a4 be 46 11 94 9f 8c  |.~.(...*h..F....|
-00000320  67 02 92 1e 3c 51 78 f3  7a 35 ed f4 bb 8b fe b3  |g...<Qx.z5......|
-00000330  8c 32 aa c1 05 4f 99 68  b0 8a 75 65 1d e6 d6 6a  |.2...O.h..ue...j|
-00000340  61 65 aa 00 01 6b 29 06  99 d4 5b c7 c3 d2 0c 17  |ae...k)...[.....|
-00000350  74 59 d4 ee 99 b8 ef 5b  53 ff 33 df 9e 05 49 4f  |tY.....[S.3...IO|
-00000360  31 c6 95 81 67 c2 52 8a  0c e9 6a 46 22 16 03 03  |1...g.R...jF"...|
-00000370  00 04 0e 00 00 00                                 |......|
+00000000  16 03 03 00 5d 02 00 00  59 03 03 cc a3 9c c7 68  |....]...Y......h|
+00000010  f8 de 98 95 45 68 9f 10  2e ba 1f cf 81 a9 51 52  |....Eh........QR|
+00000020  14 b7 ed a8 36 5a 40 43  e8 e8 bb 20 9a 57 99 f3  |....6Z@C... .W..|
+00000030  a8 be d3 2a 86 8d b5 9b  af 91 83 13 00 33 5e 4e  |...*.........3^N|
+00000040  f3 1c 42 67 08 65 54 40  dc 88 fb 90 cc a8 00 00  |..Bg.eT@........|
+00000050  11 ff 01 00 01 00 00 0b  00 04 03 00 01 02 00 17  |................|
+00000060  00 00 16 03 03 02 59 0b  00 02 55 00 02 52 00 02  |......Y...U..R..|
+00000070  4f 30 82 02 4b 30 82 01  b4 a0 03 02 01 02 02 09  |O0..K0..........|
+00000080  00 e8 f0 9d 3f e2 5b ea  a6 30 0d 06 09 2a 86 48  |....?.[..0...*.H|
+00000090  86 f7 0d 01 01 0b 05 00  30 1f 31 0b 30 09 06 03  |........0.1.0...|
+000000a0  55 04 0a 13 02 47 6f 31  10 30 0e 06 03 55 04 03  |U....Go1.0...U..|
+000000b0  13 07 47 6f 20 52 6f 6f  74 30 1e 17 0d 31 36 30  |..Go Root0...160|
+000000c0  31 30 31 30 30 30 30 30  30 5a 17 0d 32 35 30 31  |101000000Z..2501|
+000000d0  30 31 30 30 30 30 30 30  5a 30 1a 31 0b 30 09 06  |01000000Z0.1.0..|
+000000e0  03 55 04 0a 13 02 47 6f  31 0b 30 09 06 03 55 04  |.U....Go1.0...U.|
+000000f0  03 13 02 47 6f 30 81 9f  30 0d 06 09 2a 86 48 86  |...Go0..0...*.H.|
+00000100  f7 0d 01 01 01 05 00 03  81 8d 00 30 81 89 02 81  |...........0....|
+00000110  81 00 db 46 7d 93 2e 12  27 06 48 bc 06 28 21 ab  |...F}...'.H..(!.|
+00000120  7e c4 b6 a2 5d fe 1e 52  45 88 7a 36 47 a5 08 0d  |~...]..RE.z6G...|
+00000130  92 42 5b c2 81 c0 be 97  79 98 40 fb 4f 6d 14 fd  |.B[.....y.@.Om..|
+00000140  2b 13 8b c2 a5 2e 67 d8  d4 09 9e d6 22 38 b7 4a  |+.....g....."8.J|
+00000150  0b 74 73 2b c2 34 f1 d1  93 e5 96 d9 74 7b f3 58  |.ts+.4......t{.X|
+00000160  9f 6c 61 3c c0 b0 41 d4  d9 2b 2b 24 23 77 5b 1c  |.la<..A..++$#w[.|
+00000170  3b bd 75 5d ce 20 54 cf  a1 63 87 1d 1e 24 c4 f3  |;.u]. T..c...$..|
+00000180  1d 1a 50 8b aa b6 14 43  ed 97 a7 75 62 f4 14 c8  |..P....C...ub...|
+00000190  52 d7 02 03 01 00 01 a3  81 93 30 81 90 30 0e 06  |R.........0..0..|
+000001a0  03 55 1d 0f 01 01 ff 04  04 03 02 05 a0 30 1d 06  |.U...........0..|
+000001b0  03 55 1d 25 04 16 30 14  06 08 2b 06 01 05 05 07  |.U.%..0...+.....|
+000001c0  03 01 06 08 2b 06 01 05  05 07 03 02 30 0c 06 03  |....+.......0...|
+000001d0  55 1d 13 01 01 ff 04 02  30 00 30 19 06 03 55 1d  |U.......0.0...U.|
+000001e0  0e 04 12 04 10 9f 91 16  1f 43 43 3e 49 a6 de 6d  |.........CC>I..m|
+000001f0  b6 80 d7 9f 60 30 1b 06  03 55 1d 23 04 14 30 12  |....`0...U.#..0.|
+00000200  80 10 48 13 49 4d 13 7e  16 31 bb a3 01 d5 ac ab  |..H.IM.~.1......|
+00000210  6e 7b 30 19 06 03 55 1d  11 04 12 30 10 82 0e 65  |n{0...U....0...e|
+00000220  78 61 6d 70 6c 65 2e 67  6f 6c 61 6e 67 30 0d 06  |xample.golang0..|
+00000230  09 2a 86 48 86 f7 0d 01  01 0b 05 00 03 81 81 00  |.*.H............|
+00000240  9d 30 cc 40 2b 5b 50 a0  61 cb ba e5 53 58 e1 ed  |.0.@+[P.a...SX..|
+00000250  83 28 a9 58 1a a9 38 a4  95 a1 ac 31 5a 1a 84 66  |.(.X..8....1Z..f|
+00000260  3d 43 d3 2d d9 0b f2 97  df d3 20 64 38 92 24 3a  |=C.-...... d8.$:|
+00000270  00 bc cf 9c 7d b7 40 20  01 5f aa d3 16 61 09 a2  |....}.@ ._...a..|
+00000280  76 fd 13 c3 cc e1 0c 5c  ee b1 87 82 f1 6c 04 ed  |v......\.....l..|
+00000290  73 bb b3 43 77 8d 0c 1c  f1 0f a1 d8 40 83 61 c9  |s..Cw.......@.a.|
+000002a0  4c 72 2b 9d ae db 46 06  06 4d f4 c1 b3 3e c0 d1  |Lr+...F..M...>..|
+000002b0  bd 42 d4 db fe 3d 13 60  84 5c 21 d3 3b e9 fa e7  |.B...=.`.\!.;...|
+000002c0  16 03 03 00 ac 0c 00 00  a8 03 00 1d 20 1e f7 67  |............ ..g|
+000002d0  0a a6 d0 af 27 2d 0d 36  24 23 a5 97 90 ef 75 4a  |....'-.6$#....uJ|
+000002e0  fc 0b 12 91 5d 92 bd bf  2d 7c 0c a2 06 08 04 00  |....]...-|......|
+000002f0  80 71 f3 c0 ff 7a 01 b2  15 21 06 ae a1 f8 fa b5  |.q...z...!......|
+00000300  19 f2 d0 f6 25 b2 7e 9f  f1 8a 1c a1 a8 5d 2a 0a  |....%.~......]*.|
+00000310  ec 42 5c f8 6e 8e 8d c9  38 53 d0 c2 f3 7d f3 c8  |.B\.n...8S...}..|
+00000320  12 f1 30 4b 7f 9a 9e 7c  f8 78 56 9c ff 11 fd 36  |..0K...|.xV....6|
+00000330  60 c9 3d b5 f7 6e 0f 7a  22 aa 3d a1 30 98 93 1d  |`.=..n.z".=.0...|
+00000340  7c 48 1f 79 24 cd a6 c2  d2 e8 f6 90 fe 19 6f 0d  ||H.y$.........o.|
+00000350  3a a6 65 35 8d 19 e4 3c  cb 3a 07 5e 62 57 3d 67  |:.e5...<.:.^bW=g|
+00000360  37 fa 23 26 0a 92 db 30  16 a8 37 3d d2 16 9d e4  |7.#&...0..7=....|
+00000370  a7 16 03 03 00 04 0e 00  00 00                    |..........|
 >>> Flow 3 (client to server)
 00000000  16 03 03 00 25 10 00 00  21 20 2f e5 7d a3 47 cd  |....%...! /.}.G.|
 00000010  62 43 15 28 da ac 5f bb  29 07 30 ff f6 84 af c4  |bC.(.._.).0.....|
 00000020  cf c2 ed 90 99 5f 58 cb  3b 74 14 03 03 00 01 01  |....._X.;t......|
-00000030  16 03 03 00 20 b8 c8 5d  3d b8 b8 2b c7 06 94 ec  |.... ..]=..+....|
-00000040  cc 92 01 22 3d cd 38 d8  aa 9f 1f 18 ef a0 ee 59  |..."=.8........Y|
-00000050  c0 3b 04 56 49                                    |.;.VI|
+00000030  16 03 03 00 20 22 30 b4  cc f8 e7 83 e4 72 5a 41  |.... "0......rZA|
+00000040  39 fa 92 4e ef c5 bb 6b  6e ec d5 55 9d 2f 53 99  |9..N...kn..U./S.|
+00000050  72 b6 99 55 a6                                    |r..U.|
 >>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 20 be 6c dd f4 ef  |.......... .l...|
-00000010  71 1d 9c a7 24 ef 74 81  c4 01 1e e0 ef ac 78 90  |q...$.t.......x.|
-00000020  4e 51 fd 8a ca 83 e7 57  95 07 fa                 |NQ.....W...|
+00000000  14 03 03 00 01 01 16 03  03 00 20 b7 be 6c 7a 7f  |.......... ..lz.|
+00000010  00 e7 aa 12 ca 2d 29 6f  eb f0 f1 5c 97 e5 d4 a2  |.....-)o...\....|
+00000020  08 ab e3 04 ba e4 4d 15  08 ef 86                 |......M....|
 >>> Flow 5 (client to server)
-00000000  17 03 03 00 16 35 96 43  38 06 49 b1 3f 01 ae 85  |.....5.C8.I.?...|
-00000010  1a ee 4b 2b fe c0 75 76  b6 4a b0                 |..K+..uv.J.|
+00000000  17 03 03 00 16 5f 25 54  0e dd 48 23 b4 d9 00 3f  |....._%T..H#...?|
+00000010  1f 43 46 8e 32 64 3b 6a  42 70 ec                 |.CF.2d;jBp.|
 >>> Flow 6 (server to client)
-00000000  16 03 03 00 14 df 6c d7  78 02 f5 a7 cb d8 2f fb  |......l.x...../.|
-00000010  04 dc 30 bc 28 51 f9 ec  b8                       |..0.(Q...|
+00000000  16 03 03 00 14 f7 db b2  a3 97 fd 00 16 52 c6 bf  |.............R..|
+00000010  57 78 21 37 02 02 ed 25  32                       |Wx!7...%2|
 >>> Flow 7 (client to server)
-00000000  16 03 03 01 16 8c 2a 91  5b 60 aa 44 e7 b7 7e b8  |......*.[`.D..~.|
-00000010  ee c2 3e f3 c4 2f 6a 75  8e 25 07 5a 5c 42 81 fd  |..>../ju.%.Z\B..|
-00000020  65 4c 2a fb a9 80 f0 ba  33 1b 06 a8 79 a8 15 8e  |eL*.....3...y...|
-00000030  3a c4 08 95 a5 23 f0 ba  fb 43 58 26 84 b5 9d 17  |:....#...CX&....|
-00000040  03 e5 e7 08 ce 8b 79 9c  5e fb c6 6e a6 b8 12 cf  |......y.^..n....|
-00000050  b9 6e 4a 2a 90 d0 6b 65  93 bf 41 31 25 7f 3a 7c  |.nJ*..ke..A1%.:||
-00000060  75 1f d6 4e 22 d3 90 7b  71 14 57 c6 b6 89 ef 79  |u..N"..{q.W....y|
-00000070  74 7e 63 79 b9 63 d6 ef  02 b7 54 4b 53 0e 7f 70  |t~cy.c....TKS..p|
-00000080  8a 34 b1 85 98 ae a7 05  b8 41 9d 49 a3 ca eb 7d  |.4.......A.I...}|
-00000090  8b 64 e7 5d ca 11 71 93  e0 ff 6e 43 37 b4 e9 ec  |.d.]..q...nC7...|
-000000a0  23 6f d6 c6 bc cb ef a2  0b d0 4b ba 4f 40 b0 4b  |#o........K.O@.K|
-000000b0  ec 57 cb 8a 10 ae fe cd  14 70 42 a0 b9 1c 81 f6  |.W.......pB.....|
-000000c0  d2 79 47 31 4a b8 aa ac  89 98 cf ae 4e 8f 3d 36  |.yG1J.......N.=6|
-000000d0  c5 41 0e d8 e6 f3 88 2a  19 e5 e7 71 e2 2f 32 93  |.A.....*...q./2.|
-000000e0  ae 05 95 25 8f ec 4e 10  25 7e 53 60 6e c2 f2 72  |...%..N.%~S`n..r|
-000000f0  fc 7a 69 c1 93 e9 b8 2e  94 f3 19 31 5b 23 7c fd  |.zi........1[#|.|
-00000100  04 5d 59 ca 00 cc 37 0b  05 0d 50 10 50 3f b0 86  |.]Y...7...P.P?..|
-00000110  84 d4 fc 6a 0a 94 dc ba  88 fe ad                 |...j.......|
+00000000  16 03 03 01 1a 9e a2 a0  cc d3 e9 25 e7 3c 11 9b  |...........%.<..|
+00000010  ab c4 a1 eb 5a 4a 5d c1  38 74 7e dc 8b 4c 1d 41  |....ZJ].8t~..L.A|
+00000020  69 18 a6 b8 4c 67 3f 5b  90 50 ed f4 ab 34 ad 77  |i...Lg?[.P...4.w|
+00000030  f6 28 f3 5b c9 db 16 ca  89 19 7c 90 f3 27 9e 0b  |.(.[......|..'..|
+00000040  8c ca 7e 9e a4 9e 2c ba  22 9e 85 be 8e ba 58 c7  |..~...,.".....X.|
+00000050  c2 a3 da a2 55 ca 64 04  53 a5 92 43 8f 52 c0 63  |....U.d.S..C.R.c|
+00000060  b5 9b 6d eb 0e 09 2e 0f  42 a7 c5 72 87 34 c2 d2  |..m.....B..r.4..|
+00000070  9f 32 ce 25 58 be 94 21  4b d3 3b d8 9b 42 68 e3  |.2.%X..!K.;..Bh.|
+00000080  27 75 a3 15 57 8b cf e0  a8 ac 23 94 8e 4a b0 92  |'u..W.....#..J..|
+00000090  96 6f e4 a1 62 7d 24 67  92 b9 8a ec 76 1e bd ed  |.o..b}$g....v...|
+000000a0  1e 05 d9 c1 03 6c 6a 43  f6 22 8d bb c6 c0 58 7e  |.....ljC."....X~|
+000000b0  8e 49 f8 ef 9a 72 7c 3f  1b ff 98 fa 88 f4 ec b5  |.I...r|?........|
+000000c0  47 b1 29 19 c8 85 98 86  bd 75 9a bc ad 02 30 41  |G.)......u....0A|
+000000d0  21 e8 8f c1 69 d9 e0 b9  c2 b8 d7 91 8a 13 5b b5  |!...i.........[.|
+000000e0  7f 9a df 12 2e 61 4c 54  b1 ca 12 dd bf 83 0b e7  |.....aLT........|
+000000f0  68 fe 90 d9 2c 9c 86 9f  0e 57 19 e1 ba e5 2e c4  |h...,....W......|
+00000100  f0 c4 b4 dd e5 0f 36 98  0f 94 26 cb 92 32 03 57  |......6...&..2.W|
+00000110  78 15 19 3d bc 1e dd d1  46 28 24 06 c5 3d ed     |x..=....F($..=.|
 >>> Flow 8 (server to client)
-00000000  16 03 03 00 81 41 25 27  5b 76 24 a0 4f f0 bf ca  |.....A%'[v$.O...|
-00000010  c4 4f f8 7c c6 e8 2a d4  d1 ed f1 b8 34 84 d6 d5  |.O.|..*.....4...|
-00000020  93 20 70 7d 8e 75 c5 16  a8 ff 5c e6 de 16 ea 96  |. p}.u....\.....|
-00000030  3f 86 3b bd 6d fa 96 3d  27 18 34 b8 18 86 ee 65  |?.;.m..='.4....e|
-00000040  7f f2 cc 7a b9 f8 2e 5a  32 f3 16 e2 a2 27 fd 4b  |...z...Z2....'.K|
-00000050  31 19 e6 81 d9 ef 02 10  ac b6 55 d3 0b e2 b0 09  |1.........U.....|
-00000060  56 ea 50 5a 96 b3 ff 07  78 48 df 77 3f 15 c9 ff  |V.PZ....xH.w?...|
-00000070  a7 24 af 28 ec 99 1a c9  36 09 16 9c 7c 5a c0 85  |.$.(....6...|Z..|
-00000080  7c 93 e4 61 2e 5b 16 03  03 02 69 ef 17 31 d5 9c  ||..a.[....i..1..|
-00000090  bc 09 f9 b7 75 e2 c8 ea  93 6f b7 49 e3 0e af bb  |....u....o.I....|
-000000a0  84 d6 3b 20 e2 89 13 6f  7a d1 73 a7 cb d5 03 b2  |..; ...oz.s.....|
-000000b0  20 40 40 76 d9 5d 3b 23  cb 48 ba 3c 1b e7 5d de  | @@v.];#.H.<..].|
-000000c0  16 be 82 91 39 d0 b4 83  3e 4c b8 a0 66 56 47 6c  |....9...>L..fVGl|
-000000d0  08 03 b1 0f be 3f d3 5e  7e b4 40 db db 5b ce 61  |.....?.^~.@..[.a|
-000000e0  d9 dc 02 7d ea df ea 43  08 2c b0 1c af 76 8f d3  |...}...C.,...v..|
-000000f0  cd af 51 cd 17 df 70 58  90 bd 83 aa 4b e5 fe cd  |..Q...pX....K...|
-00000100  90 30 e0 b5 d0 95 49 c2  10 06 8c 5a dd a2 37 ad  |.0....I....Z..7.|
-00000110  d5 d1 0e 73 c7 92 a9 ab  67 51 da 9d a4 62 6d a6  |...s....gQ...bm.|
-00000120  d7 89 22 2b 97 59 ad 02  65 e9 1d 48 44 07 c9 c0  |.."+.Y..e..HD...|
-00000130  c4 1f 7f da 64 0c 35 19  16 b3 70 41 d8 61 c3 47  |....d.5...pA.a.G|
-00000140  59 4d c2 e6 07 86 55 92  b9 98 8e 5c 86 d2 d5 51  |YM....U....\...Q|
-00000150  6a 50 19 99 75 0a cf 6e  49 cc 8a 76 b5 2b 20 48  |jP..u..nI..v.+ H|
-00000160  2b 11 d4 54 a2 ea 98 ce  d8 56 22 c8 f8 eb e5 25  |+..T.....V"....%|
-00000170  c8 cf ec 86 95 09 51 7e  18 89 bb 8f d4 66 b8 44  |......Q~.....f.D|
-00000180  c2 78 f4 4d ad eb 2d 79  f8 f6 02 4f d2 35 d4 71  |.x.M..-y...O.5.q|
-00000190  b3 ae e6 7d f6 45 6c 99  07 57 3c 01 bb c1 fb f1  |...}.El..W<.....|
-000001a0  1a ac ba 92 b6 60 52 63  8b 21 eb bf 77 02 c6 29  |.....`Rc.!..w..)|
-000001b0  7f 10 f7 11 ac a2 90 a9  8b 47 da c1 2c 41 c9 da  |.........G..,A..|
-000001c0  3f 18 ab be f0 eb 20 98  80 c6 d2 14 9e 8e d3 41  |?..... ........A|
-000001d0  c3 37 ab 12 5b cc d0 25  bd af 16 49 4e 89 a1 92  |.7..[..%...IN...|
-000001e0  d1 09 49 59 dc cf f8 6c  73 02 cb 72 6d 28 6e 28  |..IY...ls..rm(n(|
-000001f0  c5 a8 84 20 e6 f8 1b ad  c1 6c 8f b0 30 b2 49 84  |... .....l..0.I.|
-00000200  22 42 7d ec e1 c7 ab 29  de 1c 84 1f cf 59 c6 80  |"B}....).....Y..|
-00000210  7e 13 13 d7 c5 e5 f2 e0  3b 9d 81 c9 3f 86 21 27  |~.......;...?.!'|
-00000220  d7 c8 45 c1 25 f6 19 8d  0a f6 e9 5a 9b d5 64 a1  |..E.%......Z..d.|
-00000230  e4 6d fe 6a cf d1 c3 1b  d4 ea d9 1f 6b dc f9 a7  |.m.j........k...|
-00000240  e9 d2 6c 31 19 db e1 f4  f8 82 6e 8b da fd b1 fd  |..l1......n.....|
-00000250  0a 56 84 73 db 25 5f bb  12 61 70 de 67 34 28 1c  |.V.s.%_..ap.g4(.|
-00000260  c3 e6 eb 81 c8 94 55 ca  52 25 e8 72 bf a1 c5 88  |......U.R%.r....|
-00000270  b8 ce 72 8d 64 6c 38 d9  19 07 f3 51 51 91 84 f2  |..r.dl8....QQ...|
-00000280  c4 76 7f 8b 57 09 71 94  38 aa f1 64 51 6f 62 50  |.v..W.q.8..dQobP|
-00000290  c8 50 68 82 b9 54 b1 28  54 99 21 26 7d 75 c7 c7  |.Ph..T.(T.!&}u..|
-000002a0  79 e7 65 93 72 a4 39 2d  4c ec ba b2 4c 92 ae ee  |y.e.r.9-L...L...|
-000002b0  34 a2 22 2f f9 b9 75 a9  27 77 63 2d ac 27 87 ce  |4."/..u.'wc-.'..|
-000002c0  ee 37 c0 c7 c1 b6 4c 13  d7 78 97 64 dc af ea 0d  |.7....L..x.d....|
-000002d0  7c 12 0e 7b 0b 26 77 01  e4 1c 24 e8 9f fc 19 2f  ||..{.&w...$..../|
-000002e0  46 a2 81 3d 0d c7 16 7e  49 25 b4 c1 0f 0a 71 05  |F..=...~I%....q.|
-000002f0  25 eb 53 e4 16 03 03 00  bc 0b 79 2d c6 0a 63 68  |%.S.......y-..ch|
-00000300  f0 21 37 d0 42 4a 0f 2f  7d 2f a0 7d 3d c3 94 c4  |.!7.BJ./}/.}=...|
-00000310  36 f5 a6 db e1 ad 0f 94  07 67 57 54 d4 57 86 50  |6........gWT.W.P|
-00000320  a2 e1 78 09 f2 e3 7b bc  6d 1b c0 fe 16 eb d3 ef  |..x...{.m.......|
-00000330  fb ec 22 44 ee 2f 78 99  84 e2 c1 4c f7 0d 4f bc  |.."D./x....L..O.|
-00000340  ca 57 be de 5f 52 08 33  b0 e1 1d 7b 45 9e 5d 17  |.W.._R.3...{E.].|
-00000350  41 2c 10 43 44 18 84 38  f3 0b 6a a1 76 bf 75 c9  |A,.CD..8..j.v.u.|
-00000360  56 b2 53 4c 98 39 c0 6f  30 13 96 8a 27 59 12 03  |V.SL.9.o0...'Y..|
-00000370  60 64 ce 28 54 c0 03 f4  c4 d1 df 94 e3 6e 43 61  |`d.(T........nCa|
-00000380  fa 43 40 e5 05 3b 26 dc  c4 41 bd 73 c3 9e a0 db  |.C@..;&..A.s....|
-00000390  fb c9 50 b4 4a d9 2d 71  cf e8 ff 3d 17 9e 29 35  |..P.J.-q...=..)5|
-000003a0  61 6c ab 11 ac 21 fa 90  6b 75 1f 0a 9d 30 3f 13  |al...!..ku...0?.|
-000003b0  fa c3 97 7a 74 16 03 03  00 4a 3d ca 3b 3d c8 6f  |...zt....J=.;=.o|
-000003c0  44 4e 53 3d 05 27 97 aa  bd 58 33 d6 ad 4a 34 71  |DNS=.'...X3..J4q|
-000003d0  22 d9 36 96 17 a5 ba 6b  b3 20 2e da 64 65 14 c7  |".6....k. ..de..|
-000003e0  6a c7 07 39 55 db bb ad  e2 49 84 09 5e 78 88 b5  |j..9U....I..^x..|
-000003f0  4b d5 23 fa 17 c5 f2 b8  2a c6 e5 1e 15 47 01 36  |K.#.....*....G.6|
-00000400  ef 7f 0a 14 16 03 03 00  14 28 e3 58 7e b9 36 d6  |.........(.X~.6.|
-00000410  ef 65 c8 bc fb 10 57 3d  48 70 7f 68 7d           |.e....W=Hp.h}|
+00000000  16 03 03 00 85 90 29 5c  91 ed 28 4f 54 29 f4 e7  |......)\..(OT)..|
+00000010  b2 41 c9 38 5d ec 4a 38  22 0d a9 13 e9 65 fe 8c  |.A.8].J8"....e..|
+00000020  a4 e8 1a a0 6e 07 d2 4d  35 55 a7 65 92 cd da 75  |....n..M5U.e...u|
+00000030  ca 0e 61 e3 6a 83 a0 30  bb 03 2a 6a e8 f0 69 3f  |..a.j..0..*j..i?|
+00000040  95 8d 97 c3 1b ef 74 58  68 f0 88 82 16 96 62 0a  |......tXh.....b.|
+00000050  49 7f 5b ec ee a1 6b 14  f6 5b 17 88 80 f6 70 e2  |I.[...k..[....p.|
+00000060  d9 a3 3a dc 46 65 63 ec  37 aa b6 53 a8 13 f3 44  |..:.Fec.7..S...D|
+00000070  5b 16 bd 4b ce 03 da 6f  ba 2c 6a 5d 71 45 db 49  |[..K...o.,j]qE.I|
+00000080  1c 00 17 d5 d8 40 0a 14  bb e8 16 03 03 02 69 d3  |.....@........i.|
+00000090  cf e0 f6 ea fa 19 64 e9  af c4 47 2e 0d a5 14 20  |......d...G.... |
+000000a0  cd 7e 97 0d 45 16 85 34  e7 f0 ed c1 fe 3c 12 f2  |.~..E..4.....<..|
+000000b0  3f 2e f5 93 b0 95 f5 2c  cd b1 ab 4b 8b e7 0d af  |?......,...K....|
+000000c0  7d 99 41 1e 9e 9e 18 90  6c e3 35 15 0b 89 fe 0f  |}.A.....l.5.....|
+000000d0  2f a2 e5 5c 67 bd 07 54  af 23 f2 ab 59 de 71 a2  |/..\g..T.#..Y.q.|
+000000e0  5e 04 21 2c d9 da bf 3a  41 53 18 c8 c9 d5 82 ac  |^.!,...:AS......|
+000000f0  ba 31 25 fe e8 0f 94 c8  41 42 a0 43 d3 3f fb ea  |.1%.....AB.C.?..|
+00000100  0a b5 3f 66 ff da 49 a9  1b 20 f6 26 b3 48 4a 75  |..?f..I.. .&.HJu|
+00000110  3f 88 74 d9 54 71 af d1  05 e3 9d 32 41 08 b8 8f  |?.t.Tq.....2A...|
+00000120  a9 fb f9 dd 5a c0 10 23  0d 8c 60 33 c1 2e b5 57  |....Z..#..`3...W|
+00000130  dc 4c e2 95 82 be d0 39  10 f9 8c 48 62 df 11 f5  |.L.....9...Hb...|
+00000140  d8 be 5e 46 26 3b 44 3a  36 31 8c 53 4e c6 6e 65  |..^F&;D:61.SN.ne|
+00000150  28 e1 db 36 07 73 38 00  64 d6 ae fb 4e 35 a1 89  |(..6.s8.d...N5..|
+00000160  03 f7 f3 22 5e 7a 69 0b  6c fa c2 5a d3 b1 ba ad  |..."^zi.l..Z....|
+00000170  e8 af 1f 21 31 c6 9d be  24 5d 4a f4 c3 69 61 36  |...!1...$]J..ia6|
+00000180  8f ce 81 10 d4 99 82 94  66 53 f7 50 dd e3 d0 5a  |........fS.P...Z|
+00000190  ce 79 d8 0f 43 09 2a 2b  67 da 31 b5 0c ff c6 32  |.y..C.*+g.1....2|
+000001a0  13 a4 cd 26 1d 16 49 24  45 f8 24 40 12 ea 7a f1  |...&..I$E.$@..z.|
+000001b0  33 47 2d b7 1f 09 b4 fc  7e 00 dc 0d 3f a8 52 11  |3G-.....~...?.R.|
+000001c0  f6 03 b0 c0 87 e4 be f7  0c 2b 6a c9 e5 ef 00 62  |.........+j....b|
+000001d0  6d b6 b3 93 5f 60 08 f0  4f 3f be b7 8e 02 a8 c8  |m..._`..O?......|
+000001e0  5f 38 0a 6d c1 f3 4d df  49 b5 6d 31 80 d9 5b 81  |_8.m..M.I.m1..[.|
+000001f0  99 45 5d 43 cb 58 4e 28  5f 4f 6f e8 49 de cf ab  |.E]C.XN(_Oo.I...|
+00000200  2a ab 85 7a ef 9f 10 77  00 9e 38 99 57 25 14 40  |*..z...w..8.W%.@|
+00000210  47 46 4a 30 4e 6a 75 f0  51 de 37 a0 6f 9a e6 17  |GFJ0Nju.Q.7.o...|
+00000220  f5 6b 48 16 62 0d 38 2d  3f 99 ff 94 b3 e7 6e 5b  |.kH.b.8-?.....n[|
+00000230  3d 6f 15 5a e2 df c3 45  66 d6 52 1d a3 79 eb 01  |=o.Z...Ef.R..y..|
+00000240  94 3a 4f 30 2e 6b 30 82  8e 58 3b 9a fe c8 a1 a2  |.:O0.k0..X;.....|
+00000250  84 8b cd 0b 71 16 9e ea  81 23 b7 78 29 ba 5a 59  |....q....#.x).ZY|
+00000260  8c 89 60 8c f8 d4 a9 80  02 b9 fb 41 fc 21 3f 4a  |..`........A.!?J|
+00000270  0f b3 c1 13 eb 07 f9 a0  13 d1 aa 3d c3 83 1e 53  |...........=...S|
+00000280  b3 b6 f9 61 51 28 60 ab  1f 5e f0 f5 e4 94 43 c2  |...aQ(`..^....C.|
+00000290  fc 53 aa d7 a3 47 f0 2e  a0 e2 12 ee 21 c0 f6 81  |.S...G......!...|
+000002a0  cc 60 51 66 1b fc e9 f2  64 78 d3 b3 0c 96 6b b5  |.`Qf....dx....k.|
+000002b0  dc 22 7f d1 90 e9 ec ae  2f 50 81 b8 16 e7 07 83  |."....../P......|
+000002c0  db 75 8c b0 fd 63 a5 c9  b1 bc 01 08 e6 53 86 3c  |.u...c.......S.<|
+000002d0  fe 98 67 ef 7a 7a 0a 33  2c 0b d7 57 25 8f 9d d2  |..g.zz.3,..W%...|
+000002e0  ce ba 62 2c 81 f9 f9 87  6c a3 64 ba 32 34 23 02  |..b,....l.d.24#.|
+000002f0  97 d7 42 cf f2 04 a9 08  16 03 03 00 bc c2 93 00  |..B.............|
+00000300  26 dc ce 86 67 d7 7d 15  52 0e de 5c 2c 87 da 62  |&...g.}.R..\,..b|
+00000310  4a 4f f5 cf 95 b0 c0 df  09 4a 4f 59 01 04 4b 3b  |JO.......JOY..K;|
+00000320  db 90 f7 ec 64 5a 71 1a  34 6c 67 ff e6 88 b1 39  |....dZq.4lg....9|
+00000330  67 11 84 fc 30 26 16 00  2c 8e 0e e5 bd 3f d9 24  |g...0&..,....?.$|
+00000340  46 ad c9 71 bc 2a c0 09  11 32 36 38 38 91 8d 96  |F..q.*...2688...|
+00000350  73 e5 8b a4 b7 6e fb 80  fc 68 d5 a8 c7 ff 04 00  |s....n...h......|
+00000360  b8 31 e8 30 17 97 db 43  ba b3 d8 4e 9f 48 c6 4b  |.1.0...C...N.H.K|
+00000370  23 7a a0 cb 2f 68 db 02  f2 f0 df 38 8f 4c d8 a8  |#z../h.....8.L..|
+00000380  f5 27 e5 fe ca 10 2c 26  51 3c 37 07 14 66 93 9b  |.'....,&Q<7..f..|
+00000390  15 b0 c9 e2 f2 78 74 4d  c6 e4 42 79 ff f1 cf 9d  |.....xtM..By....|
+000003a0  a1 c6 a5 5b 7f 4d 85 b3  fb 2b 46 96 c9 49 99 b6  |...[.M...+F..I..|
+000003b0  08 58 8e 6f 95 1e 2e 6d  93 16 03 03 00 4a 55 ef  |.X.o...m.....JU.|
+000003c0  94 9b f2 d3 38 44 2c 39  17 07 2f 2c 76 0b c0 81  |....8D,9../,v...|
+000003d0  d4 0b 5c df cf c3 07 62  c8 dc 82 bb 92 04 84 76  |..\....b.......v|
+000003e0  e2 74 57 21 f6 7f ee 8f  5f c8 57 bd 97 c8 35 e7  |.tW!...._.W...5.|
+000003f0  25 12 00 4b 72 c0 de c4  9e 82 5a 4d bf 05 f9 ab  |%..Kr.....ZM....|
+00000400  b1 5c 2e 64 66 38 95 0a  16 03 03 00 14 35 f4 4d  |.\.df8.......5.M|
+00000410  20 b9 38 cb 40 3e 46 83  28 b0 c7 19 ba 83 6a cd  | .8.@>F.(.....j.|
+00000420  e4                                                |.|
 >>> Flow 9 (client to server)
-00000000  16 03 03 02 69 d8 c1 81  7e a9 d7 70 97 62 c7 68  |....i...~..p.b.h|
-00000010  df 02 01 9d cc dc 38 d0  d6 bb 48 03 1d 0b be 73  |......8...H....s|
-00000020  b3 1a 88 91 a0 1b 55 91  51 a5 d7 54 58 c4 ea 50  |......U.Q..TX..P|
-00000030  e5 67 b1 60 78 b6 e2 7f  d7 6c b4 76 d7 24 fd af  |.g.`x....l.v.$..|
-00000040  f6 68 90 8c de 71 cd 15  4f d0 c8 f6 ba 89 ce 05  |.h...q..O.......|
-00000050  be 35 e8 9e 7a 8b 8d 0d  23 d4 5a bd 3a 9e d0 bf  |.5..z...#.Z.:...|
-00000060  80 08 f5 ad 7d 84 f1 8a  16 de 97 6b b2 75 8e 49  |....}......k.u.I|
-00000070  0f d7 8b 10 57 f7 21 1f  c0 87 de 06 c5 ae ae dd  |....W.!.........|
-00000080  9c 22 92 a1 6c c7 46 8d  e2 be 43 32 9c be 47 6b  |."..l.F...C2..Gk|
-00000090  4d 2a 60 f0 b6 3a 09 16  d6 16 a1 92 4a 2d 2d 72  |M*`..:......J--r|
-000000a0  00 8f 40 7c 3e a9 61 be  35 c8 f8 48 b4 1c 90 61  |..@|>.a.5..H...a|
-000000b0  90 c5 aa f8 ae aa d4 8a  15 74 b2 5d aa 24 cf 45  |.........t.].$.E|
-000000c0  ef 02 bd 29 b9 50 b4 fe  83 05 fa 4a a5 82 10 28  |...).P.....J...(|
-000000d0  b7 ab c3 ca c3 65 bb 51  a4 7c ac 57 03 78 28 e3  |.....e.Q.|.W.x(.|
-000000e0  91 9f c1 ce 02 08 70 84  8c 11 1f ae 35 a5 06 12  |......p.....5...|
-000000f0  f8 78 5b 38 0a 11 c8 1c  2d 1b 0c 21 66 d9 41 b2  |.x[8....-..!f.A.|
-00000100  ed 66 3c 47 f2 dc ab c1  59 7d 65 df bb 80 37 1c  |.f<G....Y}e...7.|
-00000110  5e 9b 41 e1 1d 5f b5 24  e4 77 61 3b e8 36 93 03  |^.A.._.$.wa;.6..|
-00000120  6d 87 17 e9 d7 77 35 b1  83 a3 b9 80 4d 40 20 82  |m....w5.....M@ .|
-00000130  94 36 53 94 ad 6b b3 ad  0a 70 fd 11 ce 81 56 ca  |.6S..k...p....V.|
-00000140  c2 5d 16 69 e3 59 7e 37  3b cd f3 54 1e b8 5e 1a  |.].i.Y~7;..T..^.|
-00000150  64 3f bf c6 ba ff fa b5  bf 4b c2 8e 5a 4d 43 1f  |d?.......K..ZMC.|
-00000160  8e 50 bc 7a 82 13 c7 25  aa b4 a8 97 45 49 12 25  |.P.z...%....EI.%|
-00000170  f5 4d 52 df 90 e5 74 0f  a0 d2 fd c3 6f bd 41 ed  |.MR...t.....o.A.|
-00000180  ff 78 e8 97 f2 e2 d1 5b  7c e6 27 01 16 27 1d b6  |.x.....[|.'..'..|
-00000190  8a cf c6 5b 8d b3 d8 8e  0c ee 2a d5 21 f6 4b d3  |...[......*.!.K.|
-000001a0  5a 74 7e 3d c6 fb 0e 35  97 de e7 52 c0 b2 c3 37  |Zt~=...5...R...7|
-000001b0  94 28 41 e0 3b 65 56 f1  4f 60 03 48 88 1d db fc  |.(A.;eV.O`.H....|
-000001c0  60 9f 33 e1 4d 37 eb 22  36 b2 76 ae 1c 3d 1c 5e  |`.3.M7."6.v..=.^|
-000001d0  3a c5 5b 00 eb 72 8b 54  ba 76 d1 71 77 5f 76 54  |:.[..r.T.v.qw_vT|
-000001e0  5f fd 0e d1 3a 50 ad b1  55 4a db 6d bf 2f 33 90  |_...:P..UJ.m./3.|
-000001f0  fc 42 de cd e4 a9 dd 11  25 d1 9f 56 1e 8a 2b 5c  |.B......%..V..+\|
-00000200  6c ed e7 51 84 42 6b ab  7d 77 b4 95 c3 75 b3 24  |l..Q.Bk.}w...u.$|
-00000210  ce 70 b0 e1 63 7f ec b0  ea 6a a4 a1 d5 e8 3e 96  |.p..c....j....>.|
-00000220  65 99 40 46 73 c8 e1 6e  86 65 92 bf 3d 92 a3 4f  |e.@Fs..n.e..=..O|
-00000230  37 6d bb 80 33 a5 7d aa  d3 a9 37 77 a6 4e 5b d6  |7m..3.}...7w.N[.|
-00000240  f3 f9 b2 42 75 18 1f 5a  58 f3 08 35 bc f4 2b 93  |...Bu..ZX..5..+.|
-00000250  62 0b 8a 83 f9 44 d0 e1  1a 44 b2 66 45 6f de b3  |b....D...D.fEo..|
-00000260  d2 ec 34 ac 15 89 76 b4  da dd 95 ca 44 5b 16 03  |..4...v.....D[..|
-00000270  03 00 35 39 e8 06 21 47  85 b5 53 96 03 0b 08 3b  |..59..!G..S....;|
-00000280  d2 9d 55 1f 23 4f 3a c0  be 4f e0 e0 0a f1 65 6f  |..U.#O:..O....eo|
-00000290  78 22 c4 10 6b d0 96 dc  04 78 e8 d3 95 f6 9a 78  |x"..k....x.....x|
-000002a0  09 f2 42 d3 79 57 99 c4  16 03 03 00 98 37 6b 75  |..B.yW.......7ku|
-000002b0  79 17 fa 67 7f 94 2e aa  88 61 91 97 dc 10 1e e6  |y..g.....a......|
-000002c0  6d 6d fa d5 64 17 f4 ec  ba 01 43 99 88 e2 a7 13  |mm..d.....C.....|
-000002d0  e0 9e 6a e9 97 c7 b3 ec  b9 c9 72 51 3d 01 eb c0  |..j.......rQ=...|
-000002e0  03 0f 08 48 90 27 36 6b  bd e7 0d 4e 41 6a ef 11  |...H.'6k...NAj..|
-000002f0  42 5b ae d1 16 ec 8f b7  47 a2 f5 b4 6a d4 32 bb  |B[......G...j.2.|
-00000300  0c cc 4f 2a e0 be 44 47  c8 77 09 f5 78 4b d6 ec  |..O*..DG.w..xK..|
-00000310  87 95 dc e1 74 75 54 af  45 bb 7a f5 2e f7 ac 3d  |....tuT.E.z....=|
-00000320  d1 b2 31 5a c0 24 c7 7c  25 36 62 a7 48 73 66 44  |..1Z.$.|%6b.HsfD|
-00000330  c1 78 47 f3 48 c5 a0 f7  66 3e 78 27 2c 3c dc 83  |.xG.H...f>x',<..|
-00000340  f5 6c e1 09 31 14 03 03  00 11 79 32 99 fd 2d 8d  |.l..1.....y2..-.|
-00000350  14 33 fd 1b 1b a8 3d 99  4b 0a b7 16 03 03 00 20  |.3....=.K...... |
-00000360  76 25 53 83 f2 c5 bf a6  fa 2e d3 5a 62 67 5b 1d  |v%S........Zbg[.|
-00000370  23 9a 9c b3 16 01 3f 6a  e9 4c ea e1 d4 d1 09 42  |#.....?j.L.....B|
+00000000  16 03 03 02 69 6d 51 fa  86 0f dd 19 19 7a e9 f5  |....imQ......z..|
+00000010  40 f7 4f 7a 10 c0 33 01  b8 14 32 92 7b 92 e0 c0  |@.Oz..3...2.{...|
+00000020  04 84 cf 1c d8 15 2a be  12 0b 65 15 f2 bc 96 cf  |......*...e.....|
+00000030  9e d7 eb 5a f6 06 ee b0  8e e4 fc b9 c6 d6 81 52  |...Z...........R|
+00000040  c1 4c a9 d7 33 a1 f8 b6  cd 79 eb 7d 44 5a 99 c0  |.L..3....y.}DZ..|
+00000050  5b 8b 9d 8c 93 53 b6 27  f2 a0 e2 7a a2 66 de 3f  |[....S.'...z.f.?|
+00000060  65 0d 13 14 09 8b 1c 2a  85 7d 24 26 9a 64 b2 d1  |e......*.}$&.d..|
+00000070  7c 10 ce b2 1e 86 df f1  a8 2c 2a 47 ae fe fe 1c  ||........,*G....|
+00000080  23 14 eb 78 40 bf 88 25  db 1a 7e 60 4d 3e b8 cb  |#..x@..%..~`M>..|
+00000090  7d 3c 2f d1 a7 6b 22 ee  99 21 88 50 d7 2d 06 2d  |}</..k"..!.P.-.-|
+000000a0  08 2e c3 c1 56 44 9f 3f  aa 29 f8 1c aa c6 2c e2  |....VD.?.)....,.|
+000000b0  ad 61 b2 7f 4f 3a 14 e7  cc 0f 0e e9 b1 5a 0b af  |.a..O:.......Z..|
+000000c0  28 60 18 50 4d 98 07 5e  69 04 af c1 5b fa b5 ab  |(`.PM..^i...[...|
+000000d0  16 24 68 b0 48 8b 34 b0  25 bd 8f 92 76 b2 44 06  |.$h.H.4.%...v.D.|
+000000e0  02 53 de 34 82 ff c6 bc  ea f5 c6 41 e4 24 08 82  |.S.4.......A.$..|
+000000f0  b7 3a 02 97 11 c4 07 6b  51 9b 70 d1 7c 77 d4 23  |.:.....kQ.p.|w.#|
+00000100  80 6b 6e c7 68 60 f8 4c  6d bc 11 1e d2 40 38 c3  |.kn.h`.Lm....@8.|
+00000110  ff db d1 2e bf 9b 30 86  45 5a 23 8c 01 9f 05 68  |......0.EZ#....h|
+00000120  2e 54 4e 2d c3 f0 5c 8c  94 27 6a 9e 3a df 35 0a  |.TN-..\..'j.:.5.|
+00000130  f9 20 8a cc ef 0f cc b8  ca d0 8e 1e 8d 24 a4 12  |. ...........$..|
+00000140  d1 e6 12 80 b9 3d c5 fc  3a 08 41 ef ff 0b 0a c7  |.....=..:.A.....|
+00000150  3c 7d a7 4a 8c c2 39 33  f1 3f b9 b9 55 ae f2 c0  |<}.J..93.?..U...|
+00000160  7a 26 80 c5 a8 00 6a 53  de 0f 7b e1 62 05 26 7b  |z&....jS..{.b.&{|
+00000170  f5 bd dc 4c ec 6e b3 01  66 6b bd c6 f3 12 72 39  |...L.n..fk....r9|
+00000180  03 6c ac ac b4 26 82 b3  4b 7b e2 9d c3 ea 27 c1  |.l...&..K{....'.|
+00000190  e9 98 9d 21 c6 50 1a f0  a2 2d 8b cb 24 3d 68 ce  |...!.P...-..$=h.|
+000001a0  3e 9c 74 03 9c 4e 17 25  c2 af d8 e3 04 37 56 d5  |>.t..N.%.....7V.|
+000001b0  fc 69 fe ad 75 67 34 7b  ac e4 4f d5 82 b9 36 3e  |.i..ug4{..O...6>|
+000001c0  74 51 a5 32 3b 77 27 15  22 d8 8b c9 ad a6 98 5b  |tQ.2;w'."......[|
+000001d0  c5 4e 8d 62 bf ef 2d 41  b8 6d 5b 09 13 b3 40 ea  |.N.b..-A.m[...@.|
+000001e0  19 c4 08 78 e3 c1 a1 5e  05 a3 79 6a 27 d5 41 3e  |...x...^..yj'.A>|
+000001f0  c5 a6 f4 20 4c 93 92 77  c5 4a e8 1f f5 4b 83 87  |... L..w.J...K..|
+00000200  66 40 c2 c1 aa 89 69 00  5b fb 54 94 1f b7 39 cd  |f@....i.[.T...9.|
+00000210  cd 9b 53 ad 08 63 30 05  e4 72 33 f0 ba b9 9d d9  |..S..c0..r3.....|
+00000220  d1 fe c3 fc de 07 a2 a3  b2 85 0b 33 4a bd 54 77  |...........3J.Tw|
+00000230  53 7c 8e 70 ed 9f ae 9d  2f 56 19 ce d6 1b 7a 64  |S|.p..../V....zd|
+00000240  80 72 bc 86 b7 1a d6 5b  ac a2 0c b2 c4 fa 79 f2  |.r.....[......y.|
+00000250  16 7f 06 01 47 d3 f3 9b  4b 24 e2 f7 6b 33 45 4e  |....G...K$..k3EN|
+00000260  b0 84 f8 f6 4d b4 4a 3f  37 20 49 77 ff 6f 16 03  |....M.J?7 Iw.o..|
+00000270  03 00 35 3b d6 d8 46 3a  93 f9 f4 29 b3 b7 9c cf  |..5;..F:...)....|
+00000280  b9 2d 90 58 78 91 ee d5  30 bd 59 e2 5a 1f 30 8c  |.-.Xx...0.Y.Z.0.|
+00000290  6e f9 1e d8 64 85 aa 1c  8b 41 10 07 d5 b2 7d 55  |n...d....A....}U|
+000002a0  13 73 ad 0e 2d e0 d4 ff  16 03 03 00 98 75 4a 72  |.s..-........uJr|
+000002b0  0f 07 ff 07 e3 80 96 7d  c6 1b ab b8 c4 fc 38 0f  |.......}......8.|
+000002c0  f6 f8 f9 06 95 d4 7b 93  85 0f b3 34 11 cd 70 6f  |......{....4..po|
+000002d0  9b 3b a3 33 e5 fe e7 6a  df 4b 02 e1 91 18 f3 e2  |.;.3...j.K......|
+000002e0  3e d0 7c e4 95 c2 e7 ef  dc 20 c3 6b b7 9e 1d 9a  |>.|...... .k....|
+000002f0  8c 23 c7 22 91 e7 7d 17  e4 5e 02 39 c3 6a b3 46  |.#."..}..^.9.j.F|
+00000300  31 32 4a 8b 7b 0a 4a f4  51 ba a7 01 58 a9 bc 52  |12J.{.J.Q...X..R|
+00000310  64 a9 e2 93 ad 34 c8 16  ad 66 67 e3 e7 3c 2c 66  |d....4...fg..<,f|
+00000320  59 e8 df f7 cf 96 00 57  85 63 f1 4b 45 c6 8a e7  |Y......W.c.KE...|
+00000330  54 9f 22 0c 74 2e 0c 1a  cb df d0 98 55 bc d1 fd  |T.".t.......U...|
+00000340  2a e2 73 eb 1b 14 03 03  00 11 02 c8 fe cd 2a 0d  |*.s...........*.|
+00000350  c2 35 3c ff dd 23 e7 15  bf fe a0 16 03 03 00 20  |.5<..#......... |
+00000360  7b ea 15 d3 2d 51 57 39  76 4b ef 16 0d 19 5d e0  |{...-QW9vK....].|
+00000370  22 5e 68 19 c9 94 7e e9  67 41 12 85 2c e2 7c b8  |"^h...~.gA..,.|.|
 >>> Flow 10 (server to client)
-00000000  14 03 03 00 11 a7 38 2a  4e 04 a5 b7 df d6 05 bb  |......8*N.......|
-00000010  b5 93 38 bc 9e 62 16 03  03 00 20 f3 d3 e1 7d 80  |..8..b.... ...}.|
-00000020  41 ce 05 99 92 c7 47 fe  b5 08 3b 78 9d ae b0 5f  |A.....G...;x..._|
-00000030  2c ed bd 0b 90 e0 94 9e  0b b0 a5 17 03 03 00 19  |,...............|
-00000040  27 f0 6a 55 af 3f c1 82  85 1a 6b 28 e1 cd dc 59  |'.jU.?....k(...Y|
-00000050  43 be c7 18 16 30 08 b2  9e 16 03 03 00 14 c1 c5  |C....0..........|
-00000060  64 ef 72 4f 6c 96 f1 f6  5b 70 29 e4 59 36 0a cd  |d.rOl...[p).Y6..|
-00000070  d2 a3                                             |..|
+00000000  14 03 03 00 11 6b a1 f5  7f f5 64 ff 54 2a 67 95  |.....k....d.T*g.|
+00000010  f5 25 5b fe 38 39 16 03  03 00 20 be 49 c4 6c 7a  |.%[.89.... .I.lz|
+00000020  12 cf 16 5b 1c b3 14 53  79 3e 8d 01 85 75 91 1a  |...[...Sy>...u..|
+00000030  3a fe bc a9 c5 11 3f d5  88 4b 3e 17 03 03 00 19  |:.....?..K>.....|
+00000040  89 9c 38 5f 11 ba 1e 81  8a 09 ae 95 03 28 47 6c  |..8_.........(Gl|
+00000050  db 9b 38 9d e7 37 75 01  af 16 03 03 00 14 c3 86  |..8..7u.........|
+00000060  cd a6 a3 dd 62 c9 4b be  e5 2d 3f 31 a0 cc 87 f8  |....b.K..-?1....|
+00000070  78 61                                             |xa|
 >>> Flow 11 (client to server)
-00000000  15 03 03 00 12 af 73 0e  40 39 dd 1e 04 99 3e 10  |......s.@9....>.|
-00000010  c9 62 b3 78 77 9b 56 15  03 03 00 12 25 8b 87 29  |.b.xw.V.....%..)|
-00000020  82 d0 9f 5e 9a 27 bd c1  bf b7 a2 f0 92 ac        |...^.'........|
+00000000  15 03 03 00 12 35 45 94  25 9c 40 dd df 00 a9 13  |.....5E.%.@.....|
+00000010  f2 7c 47 63 98 22 c5 15  03 03 00 12 60 26 66 bb  |.|Gc."......`&f.|
+00000020  8b 92 9d da 32 e3 97 92  ae 89 a9 2a d0 9a        |....2......*..|
diff --git a/src/crypto/tls/testdata/Client-TLSv12-RenegotiationRejected b/src/crypto/tls/testdata/Client-TLSv12-RenegotiationRejected
index f7a7668..8307ee3 100644
--- a/src/crypto/tls/testdata/Client-TLSv12-RenegotiationRejected
+++ b/src/crypto/tls/testdata/Client-TLSv12-RenegotiationRejected
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fe 01 00 00  fa 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 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,89 +7,90 @@
 00000050  cc a8 c0 2b c0 2f c0 2c  c0 30 c0 09 c0 13 c0 0a  |...+./.,.0......|
 00000060  c0 14 00 9c 00 9d 00 2f  00 35 c0 12 00 0a c0 23  |......./.5.....#|
 00000070  c0 27 00 3c c0 07 c0 11  00 05 13 03 13 01 13 02  |.'.<............|
-00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
+00000080  01 00 00 7f 00 05 00 05  01 00 00 00 00 00 0a 00  |................|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
 000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
 000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
-000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
-000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
-000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
-000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
+000000c0  01 00 01 00 00 17 00 00  00 12 00 00 00 2b 00 09  |.............+..|
+000000d0  08 03 04 03 03 03 02 03  01 00 33 00 26 00 24 00  |..........3.&.$.|
+000000e0  1d 00 20 2f e5 7d a3 47  cd 62 43 15 28 da ac 5f  |.. /.}.G.bC.(.._|
+000000f0  bb 29 07 30 ff f6 84 af  c4 cf c2 ed 90 99 5f 58  |.).0.........._X|
+00000100  cb 3b 74                                          |.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 59 02 00 00  55 03 03 a3 55 d2 e2 bd  |....Y...U...U...|
-00000010  94 8f 04 51 26 1c a6 61  b1 ed 05 e2 39 44 33 05  |...Q&..a....9D3.|
-00000020  79 14 b7 1f 89 1e bb ba  53 0d 12 20 09 29 6d 26  |y.......S.. .)m&|
-00000030  04 70 4a 5d 01 90 f2 c6  28 df 11 6a 64 23 ec 9e  |.pJ]....(..jd#..|
-00000040  9f 2b 15 33 dc 88 26 35  3a b0 86 92 cc a8 00 00  |.+.3..&5:.......|
-00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
-00000060  03 02 59 0b 00 02 55 00  02 52 00 02 4f 30 82 02  |..Y...U..R..O0..|
-00000070  4b 30 82 01 b4 a0 03 02  01 02 02 09 00 e8 f0 9d  |K0..............|
-00000080  3f e2 5b ea a6 30 0d 06  09 2a 86 48 86 f7 0d 01  |?.[..0...*.H....|
-00000090  01 0b 05 00 30 1f 31 0b  30 09 06 03 55 04 0a 13  |....0.1.0...U...|
-000000a0  02 47 6f 31 10 30 0e 06  03 55 04 03 13 07 47 6f  |.Go1.0...U....Go|
-000000b0  20 52 6f 6f 74 30 1e 17  0d 31 36 30 31 30 31 30  | Root0...1601010|
-000000c0  30 30 30 30 30 5a 17 0d  32 35 30 31 30 31 30 30  |00000Z..25010100|
-000000d0  30 30 30 30 5a 30 1a 31  0b 30 09 06 03 55 04 0a  |0000Z0.1.0...U..|
-000000e0  13 02 47 6f 31 0b 30 09  06 03 55 04 03 13 02 47  |..Go1.0...U....G|
-000000f0  6f 30 81 9f 30 0d 06 09  2a 86 48 86 f7 0d 01 01  |o0..0...*.H.....|
-00000100  01 05 00 03 81 8d 00 30  81 89 02 81 81 00 db 46  |.......0.......F|
-00000110  7d 93 2e 12 27 06 48 bc  06 28 21 ab 7e c4 b6 a2  |}...'.H..(!.~...|
-00000120  5d fe 1e 52 45 88 7a 36  47 a5 08 0d 92 42 5b c2  |]..RE.z6G....B[.|
-00000130  81 c0 be 97 79 98 40 fb  4f 6d 14 fd 2b 13 8b c2  |....y.@.Om..+...|
-00000140  a5 2e 67 d8 d4 09 9e d6  22 38 b7 4a 0b 74 73 2b  |..g....."8.J.ts+|
-00000150  c2 34 f1 d1 93 e5 96 d9  74 7b f3 58 9f 6c 61 3c  |.4......t{.X.la<|
-00000160  c0 b0 41 d4 d9 2b 2b 24  23 77 5b 1c 3b bd 75 5d  |..A..++$#w[.;.u]|
-00000170  ce 20 54 cf a1 63 87 1d  1e 24 c4 f3 1d 1a 50 8b  |. T..c...$....P.|
-00000180  aa b6 14 43 ed 97 a7 75  62 f4 14 c8 52 d7 02 03  |...C...ub...R...|
-00000190  01 00 01 a3 81 93 30 81  90 30 0e 06 03 55 1d 0f  |......0..0...U..|
-000001a0  01 01 ff 04 04 03 02 05  a0 30 1d 06 03 55 1d 25  |.........0...U.%|
-000001b0  04 16 30 14 06 08 2b 06  01 05 05 07 03 01 06 08  |..0...+.........|
-000001c0  2b 06 01 05 05 07 03 02  30 0c 06 03 55 1d 13 01  |+.......0...U...|
-000001d0  01 ff 04 02 30 00 30 19  06 03 55 1d 0e 04 12 04  |....0.0...U.....|
-000001e0  10 9f 91 16 1f 43 43 3e  49 a6 de 6d b6 80 d7 9f  |.....CC>I..m....|
-000001f0  60 30 1b 06 03 55 1d 23  04 14 30 12 80 10 48 13  |`0...U.#..0...H.|
-00000200  49 4d 13 7e 16 31 bb a3  01 d5 ac ab 6e 7b 30 19  |IM.~.1......n{0.|
-00000210  06 03 55 1d 11 04 12 30  10 82 0e 65 78 61 6d 70  |..U....0...examp|
-00000220  6c 65 2e 67 6f 6c 61 6e  67 30 0d 06 09 2a 86 48  |le.golang0...*.H|
-00000230  86 f7 0d 01 01 0b 05 00  03 81 81 00 9d 30 cc 40  |.............0.@|
-00000240  2b 5b 50 a0 61 cb ba e5  53 58 e1 ed 83 28 a9 58  |+[P.a...SX...(.X|
-00000250  1a a9 38 a4 95 a1 ac 31  5a 1a 84 66 3d 43 d3 2d  |..8....1Z..f=C.-|
-00000260  d9 0b f2 97 df d3 20 64  38 92 24 3a 00 bc cf 9c  |...... d8.$:....|
-00000270  7d b7 40 20 01 5f aa d3  16 61 09 a2 76 fd 13 c3  |}.@ ._...a..v...|
-00000280  cc e1 0c 5c ee b1 87 82  f1 6c 04 ed 73 bb b3 43  |...\.....l..s..C|
-00000290  77 8d 0c 1c f1 0f a1 d8  40 83 61 c9 4c 72 2b 9d  |w.......@.a.Lr+.|
-000002a0  ae db 46 06 06 4d f4 c1  b3 3e c0 d1 bd 42 d4 db  |..F..M...>...B..|
-000002b0  fe 3d 13 60 84 5c 21 d3  3b e9 fa e7 16 03 03 00  |.=.`.\!.;.......|
-000002c0  ac 0c 00 00 a8 03 00 1d  20 43 6b 44 5b 79 c9 38  |........ CkD[y.8|
-000002d0  dc e4 ab fa 88 fa e6 06  89 b1 4e ff ab 8d d6 f7  |..........N.....|
-000002e0  21 b4 ff 9d a0 c8 54 cc  63 08 04 00 80 cd f4 d6  |!.....T.c.......|
-000002f0  c8 ad 03 e7 f0 e8 f4 c9  f0 e6 28 db cd 3b 7c bf  |..........(..;|.|
-00000300  05 af 3d fe c1 f9 f1 7a  ec 41 bf 1f a8 95 6d ee  |..=....z.A....m.|
-00000310  e6 92 cb c0 ff fd c1 ed  86 b0 59 45 3e 2d 1d 66  |..........YE>-.f|
-00000320  56 d1 9f e2 b7 79 ac aa  81 6d b0 42 36 96 80 4d  |V....y...m.B6..M|
-00000330  ca 36 29 1b 65 03 73 3f  85 ec 59 cb b4 a5 a0 c0  |.6).e.s?..Y.....|
-00000340  0c 16 ad e2 6b 35 3c ab  1e da 69 19 7d a2 63 a7  |....k5<...i.}.c.|
-00000350  69 2a d2 3f 12 17 bf 4c  ed 8a f7 75 fe ce d4 2b  |i*.?...L...u...+|
-00000360  4d 35 bf 65 d6 9e 01 69  a8 0a 73 26 34 16 03 03  |M5.e...i..s&4...|
-00000370  00 04 0e 00 00 00                                 |......|
+00000000  16 03 03 00 5d 02 00 00  59 03 03 8a 1d c8 bd c6  |....]...Y.......|
+00000010  43 4c 78 5c 99 f4 8f e3  72 4b 73 a3 20 10 5b 8b  |CLx\....rKs. .[.|
+00000020  3e 04 7f 4c 5c 58 fb d5  ed c6 d9 20 ff 23 98 81  |>..L\X..... .#..|
+00000030  0a 7f d2 f4 ed ae 87 2e  ad e7 a9 60 31 b1 36 ab  |...........`1.6.|
+00000040  f4 b6 cc 98 a0 8b 62 ca  57 ed 58 87 cc a8 00 00  |......b.W.X.....|
+00000050  11 ff 01 00 01 00 00 0b  00 04 03 00 01 02 00 17  |................|
+00000060  00 00 16 03 03 02 59 0b  00 02 55 00 02 52 00 02  |......Y...U..R..|
+00000070  4f 30 82 02 4b 30 82 01  b4 a0 03 02 01 02 02 09  |O0..K0..........|
+00000080  00 e8 f0 9d 3f e2 5b ea  a6 30 0d 06 09 2a 86 48  |....?.[..0...*.H|
+00000090  86 f7 0d 01 01 0b 05 00  30 1f 31 0b 30 09 06 03  |........0.1.0...|
+000000a0  55 04 0a 13 02 47 6f 31  10 30 0e 06 03 55 04 03  |U....Go1.0...U..|
+000000b0  13 07 47 6f 20 52 6f 6f  74 30 1e 17 0d 31 36 30  |..Go Root0...160|
+000000c0  31 30 31 30 30 30 30 30  30 5a 17 0d 32 35 30 31  |101000000Z..2501|
+000000d0  30 31 30 30 30 30 30 30  5a 30 1a 31 0b 30 09 06  |01000000Z0.1.0..|
+000000e0  03 55 04 0a 13 02 47 6f  31 0b 30 09 06 03 55 04  |.U....Go1.0...U.|
+000000f0  03 13 02 47 6f 30 81 9f  30 0d 06 09 2a 86 48 86  |...Go0..0...*.H.|
+00000100  f7 0d 01 01 01 05 00 03  81 8d 00 30 81 89 02 81  |...........0....|
+00000110  81 00 db 46 7d 93 2e 12  27 06 48 bc 06 28 21 ab  |...F}...'.H..(!.|
+00000120  7e c4 b6 a2 5d fe 1e 52  45 88 7a 36 47 a5 08 0d  |~...]..RE.z6G...|
+00000130  92 42 5b c2 81 c0 be 97  79 98 40 fb 4f 6d 14 fd  |.B[.....y.@.Om..|
+00000140  2b 13 8b c2 a5 2e 67 d8  d4 09 9e d6 22 38 b7 4a  |+.....g....."8.J|
+00000150  0b 74 73 2b c2 34 f1 d1  93 e5 96 d9 74 7b f3 58  |.ts+.4......t{.X|
+00000160  9f 6c 61 3c c0 b0 41 d4  d9 2b 2b 24 23 77 5b 1c  |.la<..A..++$#w[.|
+00000170  3b bd 75 5d ce 20 54 cf  a1 63 87 1d 1e 24 c4 f3  |;.u]. T..c...$..|
+00000180  1d 1a 50 8b aa b6 14 43  ed 97 a7 75 62 f4 14 c8  |..P....C...ub...|
+00000190  52 d7 02 03 01 00 01 a3  81 93 30 81 90 30 0e 06  |R.........0..0..|
+000001a0  03 55 1d 0f 01 01 ff 04  04 03 02 05 a0 30 1d 06  |.U...........0..|
+000001b0  03 55 1d 25 04 16 30 14  06 08 2b 06 01 05 05 07  |.U.%..0...+.....|
+000001c0  03 01 06 08 2b 06 01 05  05 07 03 02 30 0c 06 03  |....+.......0...|
+000001d0  55 1d 13 01 01 ff 04 02  30 00 30 19 06 03 55 1d  |U.......0.0...U.|
+000001e0  0e 04 12 04 10 9f 91 16  1f 43 43 3e 49 a6 de 6d  |.........CC>I..m|
+000001f0  b6 80 d7 9f 60 30 1b 06  03 55 1d 23 04 14 30 12  |....`0...U.#..0.|
+00000200  80 10 48 13 49 4d 13 7e  16 31 bb a3 01 d5 ac ab  |..H.IM.~.1......|
+00000210  6e 7b 30 19 06 03 55 1d  11 04 12 30 10 82 0e 65  |n{0...U....0...e|
+00000220  78 61 6d 70 6c 65 2e 67  6f 6c 61 6e 67 30 0d 06  |xample.golang0..|
+00000230  09 2a 86 48 86 f7 0d 01  01 0b 05 00 03 81 81 00  |.*.H............|
+00000240  9d 30 cc 40 2b 5b 50 a0  61 cb ba e5 53 58 e1 ed  |.0.@+[P.a...SX..|
+00000250  83 28 a9 58 1a a9 38 a4  95 a1 ac 31 5a 1a 84 66  |.(.X..8....1Z..f|
+00000260  3d 43 d3 2d d9 0b f2 97  df d3 20 64 38 92 24 3a  |=C.-...... d8.$:|
+00000270  00 bc cf 9c 7d b7 40 20  01 5f aa d3 16 61 09 a2  |....}.@ ._...a..|
+00000280  76 fd 13 c3 cc e1 0c 5c  ee b1 87 82 f1 6c 04 ed  |v......\.....l..|
+00000290  73 bb b3 43 77 8d 0c 1c  f1 0f a1 d8 40 83 61 c9  |s..Cw.......@.a.|
+000002a0  4c 72 2b 9d ae db 46 06  06 4d f4 c1 b3 3e c0 d1  |Lr+...F..M...>..|
+000002b0  bd 42 d4 db fe 3d 13 60  84 5c 21 d3 3b e9 fa e7  |.B...=.`.\!.;...|
+000002c0  16 03 03 00 ac 0c 00 00  a8 03 00 1d 20 ba 3a 8d  |............ .:.|
+000002d0  07 bd 2e fa bd 85 70 45  e9 b6 eb 1f 2c 15 a2 15  |......pE....,...|
+000002e0  d7 29 2c a9 a8 ec 46 b0  77 0a 49 c2 49 08 04 00  |.),...F.w.I.I...|
+000002f0  80 5c a8 eb 85 8d 5f 01  9f 19 b8 6b 9a 66 ed 07  |.\...._....k.f..|
+00000300  ad e9 2e 85 c1 b8 94 56  17 84 0d d4 14 7b e2 c1  |.......V.....{..|
+00000310  89 80 f5 92 31 a0 90 6f  59 fb e7 af a9 e9 6d f3  |....1..oY.....m.|
+00000320  72 aa aa e5 d9 4c d9 ac  bb 05 ac 51 e2 3f 64 05  |r....L.....Q.?d.|
+00000330  e8 e4 fd 80 b3 b9 6f 54  91 13 72 8d 45 ea 0f 13  |......oT..r.E...|
+00000340  f7 22 19 92 ce 66 fc d0  be af d3 8e 01 ef a5 7a  |."...f.........z|
+00000350  08 6e f3 f7 28 55 33 bf  e9 2a b6 60 d5 32 3f df  |.n..(U3..*.`.2?.|
+00000360  e7 df 11 21 e4 c5 6e 13  bb f7 ad c7 ca 2e 11 2e  |...!..n.........|
+00000370  22 16 03 03 00 04 0e 00  00 00                    |".........|
 >>> Flow 3 (client to server)
 00000000  16 03 03 00 25 10 00 00  21 20 2f e5 7d a3 47 cd  |....%...! /.}.G.|
 00000010  62 43 15 28 da ac 5f bb  29 07 30 ff f6 84 af c4  |bC.(.._.).0.....|
 00000020  cf c2 ed 90 99 5f 58 cb  3b 74 14 03 03 00 01 01  |....._X.;t......|
-00000030  16 03 03 00 20 b8 d8 22  20 8d 69 23 05 34 eb 69  |.... .." .i#.4.i|
-00000040  92 a0 a9 6c cd 94 3b 72  49 91 72 8e 65 79 ca 62  |...l..;rI.r.ey.b|
-00000050  14 cf da 2e b6                                    |.....|
+00000030  16 03 03 00 20 46 20 45  1d b3 e5 62 1d 89 b7 67  |.... F E...b...g|
+00000040  23 76 0b f4 fb c3 fd 57  80 09 ee 69 e3 ad bb 42  |#v.....W...i...B|
+00000050  56 55 b6 6b 73                                    |VU.ks|
 >>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 20 31 25 d4 c7 92  |.......... 1%...|
-00000010  16 0b 92 2d a2 20 8b b2  c7 96 a6 b7 b6 b3 82 3a  |...-. .........:|
-00000020  4d a1 a8 96 29 fb 99 e9  ea 04 6c                 |M...).....l|
+00000000  14 03 03 00 01 01 16 03  03 00 20 69 d6 1d dd 67  |.......... i...g|
+00000010  bb 02 a5 41 a5 11 6d e2  54 9a e8 c7 e5 b5 60 b5  |...A..m.T.....`.|
+00000020  77 fb e6 61 22 c7 0d 2f  bb bf d4                 |w..a"../...|
 >>> Flow 5 (client to server)
-00000000  17 03 03 00 16 8b 92 f3  f8 99 bf a3 7c c4 03 d8  |............|...|
-00000010  4d e7 1b ad 50 e1 99 17  33 68 e2                 |M...P...3h.|
+00000000  17 03 03 00 16 bb a9 4d  d8 15 fc 1f 99 96 03 80  |.......M........|
+00000010  5e fc b5 f8 ac 14 10 82  f5 08 c6                 |^..........|
 >>> Flow 6 (server to client)
-00000000  16 03 03 00 14 91 99 15  68 ae 92 52 bd 13 75 45  |........h..R..uE|
-00000010  6d a9 f0 2d ee f5 c3 9b  e7                       |m..-.....|
+00000000  16 03 03 00 14 0f 7d 98  6c 60 b3 cc cf c5 f3 0a  |......}.l`......|
+00000010  8f d2 40 6a 5b e5 45 1b  8b                       |..@j[.E..|
 >>> Flow 7 (client to server)
-00000000  15 03 03 00 12 be 8b 4b  a6 a7 7a 62 45 32 ff db  |.......K..zbE2..|
-00000010  07 ad a0 1b 46 9d c9 15  03 03 00 12 16 da d4 86  |....F...........|
-00000020  4f c8 26 5a d0 34 82 fe  47 34 ae 31 db a7        |O.&Z.4..G4.1..|
+00000000  15 03 03 00 12 f4 9f 10  dc f2 69 4c 21 0c a0 8f  |..........iL!...|
+00000010  6b fd aa a1 93 9a 3a 15  03 03 00 12 be 68 f2 b8  |k.....:......h..|
+00000020  8b 0d a5 1f 98 f0 c2 dd  d4 0a 8c 46 b8 f5        |...........F..|
diff --git a/src/crypto/tls/testdata/Client-TLSv12-SCT b/src/crypto/tls/testdata/Client-TLSv12-SCT
index 8492ee9..01fa299 100644
--- a/src/crypto/tls/testdata/Client-TLSv12-SCT
+++ b/src/crypto/tls/testdata/Client-TLSv12-SCT
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fe 01 00 00  fa 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 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,21 +7,22 @@
 00000050  cc a8 c0 2b c0 2f c0 2c  c0 30 c0 09 c0 13 c0 0a  |...+./.,.0......|
 00000060  c0 14 00 9c 00 9d 00 2f  00 35 c0 12 00 0a c0 23  |......./.5.....#|
 00000070  c0 27 00 3c c0 07 c0 11  00 05 13 03 13 01 13 02  |.'.<............|
-00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
+00000080  01 00 00 7f 00 05 00 05  01 00 00 00 00 00 0a 00  |................|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
 000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
 000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
-000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
-000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
-000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
-000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
+000000c0  01 00 01 00 00 17 00 00  00 12 00 00 00 2b 00 09  |.............+..|
+000000d0  08 03 04 03 03 03 02 03  01 00 33 00 26 00 24 00  |..........3.&.$.|
+000000e0  1d 00 20 2f e5 7d a3 47  cd 62 43 15 28 da ac 5f  |.. /.}.G.bC.(.._|
+000000f0  bb 29 07 30 ff f6 84 af  c4 cf c2 ed 90 99 5f 58  |.).0.........._X|
+00000100  cb 3b 74                                          |.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 01 c6 02 00 01  c2 03 03 b0 59 eb bc ae  |............Y...|
-00000010  f3 42 03 d1 fe 2c 7d 6f  0e ff e4 0c 9e 13 00 b9  |.B...,}o........|
-00000020  46 99 e2 84 49 64 a9 05  05 8a fb 20 16 12 dc b7  |F...Id..... ....|
-00000030  e0 09 a2 a6 56 83 43 54  de 40 53 47 43 f0 2f c9  |....V.CT.@SGC./.|
-00000040  2d 92 5e a0 9d a3 6a c4  55 17 01 cb cc a8 00 01  |-.^...j.U.......|
-00000050  7a 00 12 01 69 01 67 00  75 00 a4 b9 09 90 b4 18  |z...i.g.u.......|
+00000000  16 03 03 01 ca 02 00 01  c6 03 03 37 df c1 4d 8a  |...........7..M.|
+00000010  eb 27 a3 6c ec 70 05 9f  f0 86 80 01 6e ad 88 55  |.'.l.p......n..U|
+00000020  f2 1a 44 fb 42 d6 03 5d  f8 74 18 20 0a f5 d0 22  |..D.B..].t. ..."|
+00000030  aa f2 9f e3 9a 0c 86 27  2e 66 be d5 3a c2 4d 77  |.......'.f..:.Mw|
+00000040  f8 5e 78 2b 71 ab 5e 0a  09 bc e1 d6 cc a8 00 01  |.^x+q.^.........|
+00000050  7e 00 12 01 69 01 67 00  75 00 a4 b9 09 90 b4 18  |~...i.g.u.......|
 00000060  58 14 87 bb 13 a2 cc 67  70 0a 3c 35 98 04 f9 1b  |X......gp.<5....|
 00000070  df b8 e3 77 cd 0e c8 0d  dc 10 00 00 01 47 97 99  |...w.........G..|
 00000080  ee 16 00 00 04 03 00 46  30 44 02 20 1c 4b 82 5d  |.......F0D. .K.]|
@@ -44,70 +45,70 @@
 00000190  ed 8f 9b 02 e9 fa c2 4c  ba a2 be 02 21 00 af 43  |.......L....!..C|
 000001a0  64 52 71 15 29 58 40 91  c7 08 16 96 03 a8 73 a5  |dRq.)X@.......s.|
 000001b0  65 a0 6c b8 48 56 5a b6  29 83 64 6d 2a 9d ff 01  |e.l.HVZ.).dm*...|
-000001c0  00 01 00 00 0b 00 04 03  00 01 02 16 03 03 02 59  |...............Y|
-000001d0  0b 00 02 55 00 02 52 00  02 4f 30 82 02 4b 30 82  |...U..R..O0..K0.|
-000001e0  01 b4 a0 03 02 01 02 02  09 00 e8 f0 9d 3f e2 5b  |.............?.[|
-000001f0  ea a6 30 0d 06 09 2a 86  48 86 f7 0d 01 01 0b 05  |..0...*.H.......|
-00000200  00 30 1f 31 0b 30 09 06  03 55 04 0a 13 02 47 6f  |.0.1.0...U....Go|
-00000210  31 10 30 0e 06 03 55 04  03 13 07 47 6f 20 52 6f  |1.0...U....Go Ro|
-00000220  6f 74 30 1e 17 0d 31 36  30 31 30 31 30 30 30 30  |ot0...1601010000|
-00000230  30 30 5a 17 0d 32 35 30  31 30 31 30 30 30 30 30  |00Z..25010100000|
-00000240  30 5a 30 1a 31 0b 30 09  06 03 55 04 0a 13 02 47  |0Z0.1.0...U....G|
-00000250  6f 31 0b 30 09 06 03 55  04 03 13 02 47 6f 30 81  |o1.0...U....Go0.|
-00000260  9f 30 0d 06 09 2a 86 48  86 f7 0d 01 01 01 05 00  |.0...*.H........|
-00000270  03 81 8d 00 30 81 89 02  81 81 00 db 46 7d 93 2e  |....0.......F}..|
-00000280  12 27 06 48 bc 06 28 21  ab 7e c4 b6 a2 5d fe 1e  |.'.H..(!.~...]..|
-00000290  52 45 88 7a 36 47 a5 08  0d 92 42 5b c2 81 c0 be  |RE.z6G....B[....|
-000002a0  97 79 98 40 fb 4f 6d 14  fd 2b 13 8b c2 a5 2e 67  |.y.@.Om..+.....g|
-000002b0  d8 d4 09 9e d6 22 38 b7  4a 0b 74 73 2b c2 34 f1  |....."8.J.ts+.4.|
-000002c0  d1 93 e5 96 d9 74 7b f3  58 9f 6c 61 3c c0 b0 41  |.....t{.X.la<..A|
-000002d0  d4 d9 2b 2b 24 23 77 5b  1c 3b bd 75 5d ce 20 54  |..++$#w[.;.u]. T|
-000002e0  cf a1 63 87 1d 1e 24 c4  f3 1d 1a 50 8b aa b6 14  |..c...$....P....|
-000002f0  43 ed 97 a7 75 62 f4 14  c8 52 d7 02 03 01 00 01  |C...ub...R......|
-00000300  a3 81 93 30 81 90 30 0e  06 03 55 1d 0f 01 01 ff  |...0..0...U.....|
-00000310  04 04 03 02 05 a0 30 1d  06 03 55 1d 25 04 16 30  |......0...U.%..0|
-00000320  14 06 08 2b 06 01 05 05  07 03 01 06 08 2b 06 01  |...+.........+..|
-00000330  05 05 07 03 02 30 0c 06  03 55 1d 13 01 01 ff 04  |.....0...U......|
-00000340  02 30 00 30 19 06 03 55  1d 0e 04 12 04 10 9f 91  |.0.0...U........|
-00000350  16 1f 43 43 3e 49 a6 de  6d b6 80 d7 9f 60 30 1b  |..CC>I..m....`0.|
-00000360  06 03 55 1d 23 04 14 30  12 80 10 48 13 49 4d 13  |..U.#..0...H.IM.|
-00000370  7e 16 31 bb a3 01 d5 ac  ab 6e 7b 30 19 06 03 55  |~.1......n{0...U|
-00000380  1d 11 04 12 30 10 82 0e  65 78 61 6d 70 6c 65 2e  |....0...example.|
-00000390  67 6f 6c 61 6e 67 30 0d  06 09 2a 86 48 86 f7 0d  |golang0...*.H...|
-000003a0  01 01 0b 05 00 03 81 81  00 9d 30 cc 40 2b 5b 50  |..........0.@+[P|
-000003b0  a0 61 cb ba e5 53 58 e1  ed 83 28 a9 58 1a a9 38  |.a...SX...(.X..8|
-000003c0  a4 95 a1 ac 31 5a 1a 84  66 3d 43 d3 2d d9 0b f2  |....1Z..f=C.-...|
-000003d0  97 df d3 20 64 38 92 24  3a 00 bc cf 9c 7d b7 40  |... d8.$:....}.@|
-000003e0  20 01 5f aa d3 16 61 09  a2 76 fd 13 c3 cc e1 0c  | ._...a..v......|
-000003f0  5c ee b1 87 82 f1 6c 04  ed 73 bb b3 43 77 8d 0c  |\.....l..s..Cw..|
-00000400  1c f1 0f a1 d8 40 83 61  c9 4c 72 2b 9d ae db 46  |.....@.a.Lr+...F|
-00000410  06 06 4d f4 c1 b3 3e c0  d1 bd 42 d4 db fe 3d 13  |..M...>...B...=.|
-00000420  60 84 5c 21 d3 3b e9 fa  e7 16 03 03 00 ac 0c 00  |`.\!.;..........|
-00000430  00 a8 03 00 1d 20 4c 46  c9 9f ed 2e 81 0f 8c 4b  |..... LF.......K|
-00000440  bc 05 53 74 c6 c8 76 99  21 94 1b 8f 93 c6 64 ce  |..St..v.!.....d.|
-00000450  e9 9d 6b 1d 66 51 08 04  00 80 09 9e c2 21 89 93  |..k.fQ.......!..|
-00000460  1f c5 2e 2c fa 67 7b 42  23 e1 e0 67 5c 6d e9 1e  |...,.g{B#..g\m..|
-00000470  e8 a2 ac d7 cf f4 12 98  f6 e6 3d 51 0c 2c 29 ad  |..........=Q.,).|
-00000480  f8 8e 24 2a a3 99 2e f3  b2 a7 fe a9 6c e9 00 d8  |..$*........l...|
-00000490  6a 7f 41 12 84 a0 d6 19  38 b1 5a 13 b6 71 cf bd  |j.A.....8.Z..q..|
-000004a0  e2 6e 04 01 c8 cd 83 12  71 85 ae bc 94 b1 e4 4d  |.n......q......M|
-000004b0  a5 5f 9e a5 5d 95 76 fe  f5 d6 a9 f0 4c 07 c9 6e  |._..].v.....L..n|
-000004c0  fc 4a 56 2b 56 4e 9c ec  2c fe bc 9c 9e 57 f3 90  |.JV+VN..,....W..|
-000004d0  c6 6e 77 5a cf 8c 1a 15  cd 90 16 03 03 00 04 0e  |.nwZ............|
-000004e0  00 00 00                                          |...|
+000001c0  00 01 00 00 0b 00 04 03  00 01 02 00 17 00 00 16  |................|
+000001d0  03 03 02 59 0b 00 02 55  00 02 52 00 02 4f 30 82  |...Y...U..R..O0.|
+000001e0  02 4b 30 82 01 b4 a0 03  02 01 02 02 09 00 e8 f0  |.K0.............|
+000001f0  9d 3f e2 5b ea a6 30 0d  06 09 2a 86 48 86 f7 0d  |.?.[..0...*.H...|
+00000200  01 01 0b 05 00 30 1f 31  0b 30 09 06 03 55 04 0a  |.....0.1.0...U..|
+00000210  13 02 47 6f 31 10 30 0e  06 03 55 04 03 13 07 47  |..Go1.0...U....G|
+00000220  6f 20 52 6f 6f 74 30 1e  17 0d 31 36 30 31 30 31  |o Root0...160101|
+00000230  30 30 30 30 30 30 5a 17  0d 32 35 30 31 30 31 30  |000000Z..2501010|
+00000240  30 30 30 30 30 5a 30 1a  31 0b 30 09 06 03 55 04  |00000Z0.1.0...U.|
+00000250  0a 13 02 47 6f 31 0b 30  09 06 03 55 04 03 13 02  |...Go1.0...U....|
+00000260  47 6f 30 81 9f 30 0d 06  09 2a 86 48 86 f7 0d 01  |Go0..0...*.H....|
+00000270  01 01 05 00 03 81 8d 00  30 81 89 02 81 81 00 db  |........0.......|
+00000280  46 7d 93 2e 12 27 06 48  bc 06 28 21 ab 7e c4 b6  |F}...'.H..(!.~..|
+00000290  a2 5d fe 1e 52 45 88 7a  36 47 a5 08 0d 92 42 5b  |.]..RE.z6G....B[|
+000002a0  c2 81 c0 be 97 79 98 40  fb 4f 6d 14 fd 2b 13 8b  |.....y.@.Om..+..|
+000002b0  c2 a5 2e 67 d8 d4 09 9e  d6 22 38 b7 4a 0b 74 73  |...g....."8.J.ts|
+000002c0  2b c2 34 f1 d1 93 e5 96  d9 74 7b f3 58 9f 6c 61  |+.4......t{.X.la|
+000002d0  3c c0 b0 41 d4 d9 2b 2b  24 23 77 5b 1c 3b bd 75  |<..A..++$#w[.;.u|
+000002e0  5d ce 20 54 cf a1 63 87  1d 1e 24 c4 f3 1d 1a 50  |]. T..c...$....P|
+000002f0  8b aa b6 14 43 ed 97 a7  75 62 f4 14 c8 52 d7 02  |....C...ub...R..|
+00000300  03 01 00 01 a3 81 93 30  81 90 30 0e 06 03 55 1d  |.......0..0...U.|
+00000310  0f 01 01 ff 04 04 03 02  05 a0 30 1d 06 03 55 1d  |..........0...U.|
+00000320  25 04 16 30 14 06 08 2b  06 01 05 05 07 03 01 06  |%..0...+........|
+00000330  08 2b 06 01 05 05 07 03  02 30 0c 06 03 55 1d 13  |.+.......0...U..|
+00000340  01 01 ff 04 02 30 00 30  19 06 03 55 1d 0e 04 12  |.....0.0...U....|
+00000350  04 10 9f 91 16 1f 43 43  3e 49 a6 de 6d b6 80 d7  |......CC>I..m...|
+00000360  9f 60 30 1b 06 03 55 1d  23 04 14 30 12 80 10 48  |.`0...U.#..0...H|
+00000370  13 49 4d 13 7e 16 31 bb  a3 01 d5 ac ab 6e 7b 30  |.IM.~.1......n{0|
+00000380  19 06 03 55 1d 11 04 12  30 10 82 0e 65 78 61 6d  |...U....0...exam|
+00000390  70 6c 65 2e 67 6f 6c 61  6e 67 30 0d 06 09 2a 86  |ple.golang0...*.|
+000003a0  48 86 f7 0d 01 01 0b 05  00 03 81 81 00 9d 30 cc  |H.............0.|
+000003b0  40 2b 5b 50 a0 61 cb ba  e5 53 58 e1 ed 83 28 a9  |@+[P.a...SX...(.|
+000003c0  58 1a a9 38 a4 95 a1 ac  31 5a 1a 84 66 3d 43 d3  |X..8....1Z..f=C.|
+000003d0  2d d9 0b f2 97 df d3 20  64 38 92 24 3a 00 bc cf  |-...... d8.$:...|
+000003e0  9c 7d b7 40 20 01 5f aa  d3 16 61 09 a2 76 fd 13  |.}.@ ._...a..v..|
+000003f0  c3 cc e1 0c 5c ee b1 87  82 f1 6c 04 ed 73 bb b3  |....\.....l..s..|
+00000400  43 77 8d 0c 1c f1 0f a1  d8 40 83 61 c9 4c 72 2b  |Cw.......@.a.Lr+|
+00000410  9d ae db 46 06 06 4d f4  c1 b3 3e c0 d1 bd 42 d4  |...F..M...>...B.|
+00000420  db fe 3d 13 60 84 5c 21  d3 3b e9 fa e7 16 03 03  |..=.`.\!.;......|
+00000430  00 ac 0c 00 00 a8 03 00  1d 20 63 41 30 1c 95 79  |......... cA0..y|
+00000440  1b a6 85 f4 e1 b6 d7 f5  82 e2 4f 2b ae cd 7b 4b  |..........O+..{K|
+00000450  20 e2 7e 43 f1 59 e5 83  92 55 08 04 00 80 5c aa  | .~C.Y...U....\.|
+00000460  39 6d 57 d3 b6 15 4d 9e  c8 e1 dc 50 b3 89 69 99  |9mW...M....P..i.|
+00000470  da 07 64 74 c4 ab d3 83  f0 9b fc 3a da 26 9f ce  |..dt.......:.&..|
+00000480  37 e9 7a 50 e5 70 d1 71  0b 0d 73 03 9c c1 3f 81  |7.zP.p.q..s...?.|
+00000490  f9 1d 57 32 6b 48 50 1d  5d 7d 64 56 f0 c9 8c 69  |..W2kHP.]}dV...i|
+000004a0  d6 91 15 85 95 9a 0c 76  f0 9c d2 fe d4 df 65 00  |.......v......e.|
+000004b0  a1 cc 65 4a a2 8e 06 fc  50 77 ff 00 44 b5 cc f5  |..eJ....Pw..D...|
+000004c0  9f 39 2f 95 72 4f 51 af  21 09 6a 6a 21 60 24 65  |.9/.rOQ.!.jj!`$e|
+000004d0  78 20 9b 06 0e 24 1b 79  f2 8d 15 35 49 44 16 03  |x ...$.y...5ID..|
+000004e0  03 00 04 0e 00 00 00                              |.......|
 >>> Flow 3 (client to server)
 00000000  16 03 03 00 25 10 00 00  21 20 2f e5 7d a3 47 cd  |....%...! /.}.G.|
 00000010  62 43 15 28 da ac 5f bb  29 07 30 ff f6 84 af c4  |bC.(.._.).0.....|
 00000020  cf c2 ed 90 99 5f 58 cb  3b 74 14 03 03 00 01 01  |....._X.;t......|
-00000030  16 03 03 00 20 19 bf ac  05 d4 bb 8a 6d 11 f4 98  |.... .......m...|
-00000040  0d af 78 57 49 74 5c 44  45 9e 2c 92 26 b9 10 b5  |..xWIt\DE.,.&...|
-00000050  6d 5f 24 bc a6                                    |m_$..|
+00000030  16 03 03 00 20 d0 2b f9  13 8b 71 de 1b 1d 63 2e  |.... .+...q...c.|
+00000040  66 05 12 ee 11 d5 9b 75  ee 51 fa 42 fa 5d 86 eb  |f......u.Q.B.]..|
+00000050  f0 c5 c5 cb 5b                                    |....[|
 >>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 20 69 3a c4 9c ee  |.......... i:...|
-00000010  91 6b bc 33 39 82 64 c2  0a f0 a4 dd 85 16 3c ce  |.k.39.d.......<.|
-00000020  39 c4 98 37 77 47 1e c2  c6 d8 f6                 |9..7wG.....|
+00000000  14 03 03 00 01 01 16 03  03 00 20 71 ac 7b 2e ba  |.......... q.{..|
+00000010  d5 7e 70 6c 7c 94 0e 55  0f 65 8c 1d ff 5e 79 d6  |.~pl|..U.e...^y.|
+00000020  21 9b 8a f4 82 35 69 b8  5a d9 1a                 |!....5i.Z..|
 >>> Flow 5 (client to server)
-00000000  17 03 03 00 16 92 25 9b  97 11 08 71 63 b2 c1 35  |......%....qc..5|
-00000010  14 3b e7 15 f6 05 67 51  46 db ba 15 03 03 00 12  |.;....gQF.......|
-00000020  b2 53 a1 ec a8 cf 79 7d  f8 86 70 05 e5 81 a1 6c  |.S....y}..p....l|
-00000030  41 ab                                             |A.|
+00000000  17 03 03 00 16 82 6e 37  1a 95 19 06 bf da ca 8c  |......n7........|
+00000010  f4 07 3a 63 69 c7 00 ce  5c b9 bf 15 03 03 00 12  |..:ci...\.......|
+00000020  eb 05 f5 6f 8c 59 16 ed  26 1b f9 1f 2e 4e b8 89  |...o.Y..&....N..|
+00000030  80 77                                             |.w|
diff --git a/src/crypto/tls/testdata/Client-TLSv12-X25519-ECDHE b/src/crypto/tls/testdata/Client-TLSv12-X25519-ECDHE
index 3d3de61..372abea 100644
--- a/src/crypto/tls/testdata/Client-TLSv12-X25519-ECDHE
+++ b/src/crypto/tls/testdata/Client-TLSv12-X25519-ECDHE
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 f4 01 00 00  f0 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 f8 01 00 00  f4 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 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,86 +7,86 @@
 00000050  cc a8 c0 2b c0 2f c0 2c  c0 30 c0 09 c0 13 c0 0a  |...+./.,.0......|
 00000060  c0 14 00 9c 00 9d 00 2f  00 35 c0 12 00 0a c0 23  |......./.5.....#|
 00000070  c0 27 00 3c c0 07 c0 11  00 05 13 03 13 01 13 02  |.'.<............|
-00000080  01 00 00 75 00 05 00 05  01 00 00 00 00 00 0a 00  |...u............|
+00000080  01 00 00 79 00 05 00 05  01 00 00 00 00 00 0a 00  |...y............|
 00000090  04 00 02 00 1d 00 0b 00  02 01 00 00 0d 00 1a 00  |................|
 000000a0  18 08 04 04 03 08 07 08  05 08 06 04 01 05 01 06  |................|
-000000b0  01 05 03 06 03 02 01 02  03 ff 01 00 01 00 00 12  |................|
-000000c0  00 00 00 2b 00 09 08 03  04 03 03 03 02 03 01 00  |...+............|
-000000d0  33 00 26 00 24 00 1d 00  20 2f e5 7d a3 47 cd 62  |3.&.$... /.}.G.b|
-000000e0  43 15 28 da ac 5f bb 29  07 30 ff f6 84 af c4 cf  |C.(.._.).0......|
-000000f0  c2 ed 90 99 5f 58 cb 3b  74                       |...._X.;t|
+000000b0  01 05 03 06 03 02 01 02  03 ff 01 00 01 00 00 17  |................|
+000000c0  00 00 00 12 00 00 00 2b  00 09 08 03 04 03 03 03  |.......+........|
+000000d0  02 03 01 00 33 00 26 00  24 00 1d 00 20 2f e5 7d  |....3.&.$... /.}|
+000000e0  a3 47 cd 62 43 15 28 da  ac 5f bb 29 07 30 ff f6  |.G.bC.(.._.).0..|
+000000f0  84 af c4 cf c2 ed 90 99  5f 58 cb 3b 74           |........_X.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 59 02 00 00  55 03 03 f7 79 97 18 3c  |....Y...U...y..<|
-00000010  fa 52 c6 d2 6b 1e de a5  60 da d5 e2 0b f6 23 a8  |.R..k...`.....#.|
-00000020  48 94 e8 1f fb b9 76 43  94 e8 98 20 31 a5 85 d5  |H.....vC... 1...|
-00000030  2f c4 93 b1 ae aa 50 bc  14 9e 57 79 18 85 cd ef  |/.....P...Wy....|
-00000040  b4 f0 42 c9 6c b1 86 c1  03 27 ca df c0 2f 00 00  |..B.l....'.../..|
-00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
-00000060  03 02 59 0b 00 02 55 00  02 52 00 02 4f 30 82 02  |..Y...U..R..O0..|
-00000070  4b 30 82 01 b4 a0 03 02  01 02 02 09 00 e8 f0 9d  |K0..............|
-00000080  3f e2 5b ea a6 30 0d 06  09 2a 86 48 86 f7 0d 01  |?.[..0...*.H....|
-00000090  01 0b 05 00 30 1f 31 0b  30 09 06 03 55 04 0a 13  |....0.1.0...U...|
-000000a0  02 47 6f 31 10 30 0e 06  03 55 04 03 13 07 47 6f  |.Go1.0...U....Go|
-000000b0  20 52 6f 6f 74 30 1e 17  0d 31 36 30 31 30 31 30  | Root0...1601010|
-000000c0  30 30 30 30 30 5a 17 0d  32 35 30 31 30 31 30 30  |00000Z..25010100|
-000000d0  30 30 30 30 5a 30 1a 31  0b 30 09 06 03 55 04 0a  |0000Z0.1.0...U..|
-000000e0  13 02 47 6f 31 0b 30 09  06 03 55 04 03 13 02 47  |..Go1.0...U....G|
-000000f0  6f 30 81 9f 30 0d 06 09  2a 86 48 86 f7 0d 01 01  |o0..0...*.H.....|
-00000100  01 05 00 03 81 8d 00 30  81 89 02 81 81 00 db 46  |.......0.......F|
-00000110  7d 93 2e 12 27 06 48 bc  06 28 21 ab 7e c4 b6 a2  |}...'.H..(!.~...|
-00000120  5d fe 1e 52 45 88 7a 36  47 a5 08 0d 92 42 5b c2  |]..RE.z6G....B[.|
-00000130  81 c0 be 97 79 98 40 fb  4f 6d 14 fd 2b 13 8b c2  |....y.@.Om..+...|
-00000140  a5 2e 67 d8 d4 09 9e d6  22 38 b7 4a 0b 74 73 2b  |..g....."8.J.ts+|
-00000150  c2 34 f1 d1 93 e5 96 d9  74 7b f3 58 9f 6c 61 3c  |.4......t{.X.la<|
-00000160  c0 b0 41 d4 d9 2b 2b 24  23 77 5b 1c 3b bd 75 5d  |..A..++$#w[.;.u]|
-00000170  ce 20 54 cf a1 63 87 1d  1e 24 c4 f3 1d 1a 50 8b  |. T..c...$....P.|
-00000180  aa b6 14 43 ed 97 a7 75  62 f4 14 c8 52 d7 02 03  |...C...ub...R...|
-00000190  01 00 01 a3 81 93 30 81  90 30 0e 06 03 55 1d 0f  |......0..0...U..|
-000001a0  01 01 ff 04 04 03 02 05  a0 30 1d 06 03 55 1d 25  |.........0...U.%|
-000001b0  04 16 30 14 06 08 2b 06  01 05 05 07 03 01 06 08  |..0...+.........|
-000001c0  2b 06 01 05 05 07 03 02  30 0c 06 03 55 1d 13 01  |+.......0...U...|
-000001d0  01 ff 04 02 30 00 30 19  06 03 55 1d 0e 04 12 04  |....0.0...U.....|
-000001e0  10 9f 91 16 1f 43 43 3e  49 a6 de 6d b6 80 d7 9f  |.....CC>I..m....|
-000001f0  60 30 1b 06 03 55 1d 23  04 14 30 12 80 10 48 13  |`0...U.#..0...H.|
-00000200  49 4d 13 7e 16 31 bb a3  01 d5 ac ab 6e 7b 30 19  |IM.~.1......n{0.|
-00000210  06 03 55 1d 11 04 12 30  10 82 0e 65 78 61 6d 70  |..U....0...examp|
-00000220  6c 65 2e 67 6f 6c 61 6e  67 30 0d 06 09 2a 86 48  |le.golang0...*.H|
-00000230  86 f7 0d 01 01 0b 05 00  03 81 81 00 9d 30 cc 40  |.............0.@|
-00000240  2b 5b 50 a0 61 cb ba e5  53 58 e1 ed 83 28 a9 58  |+[P.a...SX...(.X|
-00000250  1a a9 38 a4 95 a1 ac 31  5a 1a 84 66 3d 43 d3 2d  |..8....1Z..f=C.-|
-00000260  d9 0b f2 97 df d3 20 64  38 92 24 3a 00 bc cf 9c  |...... d8.$:....|
-00000270  7d b7 40 20 01 5f aa d3  16 61 09 a2 76 fd 13 c3  |}.@ ._...a..v...|
-00000280  cc e1 0c 5c ee b1 87 82  f1 6c 04 ed 73 bb b3 43  |...\.....l..s..C|
-00000290  77 8d 0c 1c f1 0f a1 d8  40 83 61 c9 4c 72 2b 9d  |w.......@.a.Lr+.|
-000002a0  ae db 46 06 06 4d f4 c1  b3 3e c0 d1 bd 42 d4 db  |..F..M...>...B..|
-000002b0  fe 3d 13 60 84 5c 21 d3  3b e9 fa e7 16 03 03 00  |.=.`.\!.;.......|
-000002c0  ac 0c 00 00 a8 03 00 1d  20 90 95 bd 82 cf 8a cc  |........ .......|
-000002d0  08 b4 09 09 8d 59 2d 03  7a bb 92 4a c4 5c 08 4d  |.....Y-.z..J.\.M|
-000002e0  42 a3 ba cb 9a 43 ae f0  22 08 04 00 80 a0 97 ac  |B....C..".......|
-000002f0  01 a5 c8 7b 4c 73 7e 70  7a 9a fc 9d 71 2f fe 67  |...{Ls~pz...q/.g|
-00000300  ca dd 6b 43 db 64 0f 64  52 e7 d3 5d 6d b2 7c 50  |..kC.d.dR..]m.|P|
-00000310  74 7e 80 d5 22 77 3f fb  c2 e8 dc 92 37 4f 1e 1e  |t~.."w?.....7O..|
-00000320  e7 13 f2 01 33 80 32 66  4f c2 17 8e ec 4f ed 4a  |....3.2fO....O.J|
-00000330  15 6c e8 86 ec df d5 46  6c a5 43 0d 40 fe a0 c8  |.l.....Fl.C.@...|
-00000340  65 b4 76 46 b8 36 2c da  87 7c 60 87 db 39 4c 2e  |e.vF.6,..|`..9L.|
-00000350  0f e4 72 32 11 26 99 7e  c8 7a c0 bc 9c a7 29 57  |..r2.&.~.z....)W|
-00000360  9d 27 37 4e ec c5 bb fd  a1 3c f3 66 63 16 03 03  |.'7N.....<.fc...|
-00000370  00 04 0e 00 00 00                                 |......|
+00000000  16 03 03 00 5d 02 00 00  59 03 03 19 05 85 f6 4a  |....]...Y......J|
+00000010  53 c9 c6 4f ac 38 b7 cc  d8 5d 00 dc 3b 97 9c 0d  |S..O.8...]..;...|
+00000020  d0 e0 9f d8 71 28 a1 ab  e8 b7 cc 20 a6 a4 8c 69  |....q(..... ...i|
+00000030  6e 9c ee ae 75 14 b8 0f  93 b3 c2 82 ff 01 9b d7  |n...u...........|
+00000040  25 90 d7 53 02 6d 3b ec  e9 1a 21 e5 c0 2f 00 00  |%..S.m;...!../..|
+00000050  11 ff 01 00 01 00 00 0b  00 04 03 00 01 02 00 17  |................|
+00000060  00 00 16 03 03 02 59 0b  00 02 55 00 02 52 00 02  |......Y...U..R..|
+00000070  4f 30 82 02 4b 30 82 01  b4 a0 03 02 01 02 02 09  |O0..K0..........|
+00000080  00 e8 f0 9d 3f e2 5b ea  a6 30 0d 06 09 2a 86 48  |....?.[..0...*.H|
+00000090  86 f7 0d 01 01 0b 05 00  30 1f 31 0b 30 09 06 03  |........0.1.0...|
+000000a0  55 04 0a 13 02 47 6f 31  10 30 0e 06 03 55 04 03  |U....Go1.0...U..|
+000000b0  13 07 47 6f 20 52 6f 6f  74 30 1e 17 0d 31 36 30  |..Go Root0...160|
+000000c0  31 30 31 30 30 30 30 30  30 5a 17 0d 32 35 30 31  |101000000Z..2501|
+000000d0  30 31 30 30 30 30 30 30  5a 30 1a 31 0b 30 09 06  |01000000Z0.1.0..|
+000000e0  03 55 04 0a 13 02 47 6f  31 0b 30 09 06 03 55 04  |.U....Go1.0...U.|
+000000f0  03 13 02 47 6f 30 81 9f  30 0d 06 09 2a 86 48 86  |...Go0..0...*.H.|
+00000100  f7 0d 01 01 01 05 00 03  81 8d 00 30 81 89 02 81  |...........0....|
+00000110  81 00 db 46 7d 93 2e 12  27 06 48 bc 06 28 21 ab  |...F}...'.H..(!.|
+00000120  7e c4 b6 a2 5d fe 1e 52  45 88 7a 36 47 a5 08 0d  |~...]..RE.z6G...|
+00000130  92 42 5b c2 81 c0 be 97  79 98 40 fb 4f 6d 14 fd  |.B[.....y.@.Om..|
+00000140  2b 13 8b c2 a5 2e 67 d8  d4 09 9e d6 22 38 b7 4a  |+.....g....."8.J|
+00000150  0b 74 73 2b c2 34 f1 d1  93 e5 96 d9 74 7b f3 58  |.ts+.4......t{.X|
+00000160  9f 6c 61 3c c0 b0 41 d4  d9 2b 2b 24 23 77 5b 1c  |.la<..A..++$#w[.|
+00000170  3b bd 75 5d ce 20 54 cf  a1 63 87 1d 1e 24 c4 f3  |;.u]. T..c...$..|
+00000180  1d 1a 50 8b aa b6 14 43  ed 97 a7 75 62 f4 14 c8  |..P....C...ub...|
+00000190  52 d7 02 03 01 00 01 a3  81 93 30 81 90 30 0e 06  |R.........0..0..|
+000001a0  03 55 1d 0f 01 01 ff 04  04 03 02 05 a0 30 1d 06  |.U...........0..|
+000001b0  03 55 1d 25 04 16 30 14  06 08 2b 06 01 05 05 07  |.U.%..0...+.....|
+000001c0  03 01 06 08 2b 06 01 05  05 07 03 02 30 0c 06 03  |....+.......0...|
+000001d0  55 1d 13 01 01 ff 04 02  30 00 30 19 06 03 55 1d  |U.......0.0...U.|
+000001e0  0e 04 12 04 10 9f 91 16  1f 43 43 3e 49 a6 de 6d  |.........CC>I..m|
+000001f0  b6 80 d7 9f 60 30 1b 06  03 55 1d 23 04 14 30 12  |....`0...U.#..0.|
+00000200  80 10 48 13 49 4d 13 7e  16 31 bb a3 01 d5 ac ab  |..H.IM.~.1......|
+00000210  6e 7b 30 19 06 03 55 1d  11 04 12 30 10 82 0e 65  |n{0...U....0...e|
+00000220  78 61 6d 70 6c 65 2e 67  6f 6c 61 6e 67 30 0d 06  |xample.golang0..|
+00000230  09 2a 86 48 86 f7 0d 01  01 0b 05 00 03 81 81 00  |.*.H............|
+00000240  9d 30 cc 40 2b 5b 50 a0  61 cb ba e5 53 58 e1 ed  |.0.@+[P.a...SX..|
+00000250  83 28 a9 58 1a a9 38 a4  95 a1 ac 31 5a 1a 84 66  |.(.X..8....1Z..f|
+00000260  3d 43 d3 2d d9 0b f2 97  df d3 20 64 38 92 24 3a  |=C.-...... d8.$:|
+00000270  00 bc cf 9c 7d b7 40 20  01 5f aa d3 16 61 09 a2  |....}.@ ._...a..|
+00000280  76 fd 13 c3 cc e1 0c 5c  ee b1 87 82 f1 6c 04 ed  |v......\.....l..|
+00000290  73 bb b3 43 77 8d 0c 1c  f1 0f a1 d8 40 83 61 c9  |s..Cw.......@.a.|
+000002a0  4c 72 2b 9d ae db 46 06  06 4d f4 c1 b3 3e c0 d1  |Lr+...F..M...>..|
+000002b0  bd 42 d4 db fe 3d 13 60  84 5c 21 d3 3b e9 fa e7  |.B...=.`.\!.;...|
+000002c0  16 03 03 00 ac 0c 00 00  a8 03 00 1d 20 3d 1d f3  |............ =..|
+000002d0  d4 cb 57 6a d8 c4 23 34  84 30 2a 80 02 0c 86 de  |..Wj..#4.0*.....|
+000002e0  94 ae c8 78 07 f5 0c eb  61 f2 2f a6 2d 08 04 00  |...x....a./.-...|
+000002f0  80 08 5e b0 4b ed 7b e1  48 45 80 6a 63 5c 1e 9a  |..^.K.{.HE.jc\..|
+00000300  01 4e f1 c3 92 b2 a4 83  18 ee 55 01 36 55 57 59  |.N........U.6UWY|
+00000310  84 46 70 60 43 32 05 25  18 de 05 76 24 57 69 a3  |.Fp`C2.%...v$Wi.|
+00000320  34 a6 bd 4c b5 45 2c 6e  63 81 a3 82 a7 4a a5 5f  |4..L.E,nc....J._|
+00000330  27 c2 a2 58 2b 77 9f cf  cb 63 e0 2b da 75 eb 9c  |'..X+w...c.+.u..|
+00000340  6e 6b cd d5 ae 59 8d c8  0f c6 34 30 68 42 67 d5  |nk...Y....40hBg.|
+00000350  1f e7 b1 22 60 b5 ca 4b  a5 bd ce a0 44 50 df 45  |..."`..K....DP.E|
+00000360  8b d8 e4 04 53 8a f8 fa  91 b2 09 fb 42 92 5f dd  |....S.......B._.|
+00000370  05 16 03 03 00 04 0e 00  00 00                    |..........|
 >>> Flow 3 (client to server)
 00000000  16 03 03 00 25 10 00 00  21 20 2f e5 7d a3 47 cd  |....%...! /.}.G.|
 00000010  62 43 15 28 da ac 5f bb  29 07 30 ff f6 84 af c4  |bC.(.._.).0.....|
 00000020  cf c2 ed 90 99 5f 58 cb  3b 74 14 03 03 00 01 01  |....._X.;t......|
-00000030  16 03 03 00 28 00 00 00  00 00 00 00 00 81 b1 2c  |....(..........,|
-00000040  a2 3b 38 34 a6 66 57 02  e3 67 1b ee 73 95 50 de  |.;84.fW..g..s.P.|
-00000050  dd 5a fd 4e 0d ee b7 a6  46 1a 34 61 73           |.Z.N....F.4as|
+00000030  16 03 03 00 28 00 00 00  00 00 00 00 00 bb 7a 8d  |....(.........z.|
+00000040  2b 4d 9e e9 b6 b7 bf 30  e3 fd 4b e6 2e 6c ba 61  |+M.....0..K..l.a|
+00000050  2b 15 58 52 d0 70 36 e5  da 64 21 28 06           |+.XR.p6..d!(.|
 >>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 28 2f a9 80 36 d8  |..........(/..6.|
-00000010  d0 74 e4 39 46 04 88 8e  91 ea fd 96 ed 1f 89 9f  |.t.9F...........|
-00000020  a4 e9 24 0e ca 48 2b 5c  5d f1 cc 57 ce 92 1a ad  |..$..H+\]..W....|
-00000030  b9 10 11                                          |...|
+00000000  14 03 03 00 01 01 16 03  03 00 28 11 6b 33 c7 32  |..........(.k3.2|
+00000010  9b 34 14 98 1d 90 97 cc  3a fe c1 98 f7 9d e3 dc  |.4......:.......|
+00000020  dc f2 e2 34 c9 5d aa 5b  02 e3 9f 33 88 5b 21 65  |...4.].[...3.[!e|
+00000030  b0 f1 36                                          |..6|
 >>> Flow 5 (client to server)
-00000000  17 03 03 00 1e 00 00 00  00 00 00 00 01 da be 68  |...............h|
-00000010  97 b4 a4 72 d0 ed 75 66  6a a9 6f 39 8a 08 a9 db  |...r..ufj.o9....|
-00000020  de 4d e1 15 03 03 00 1a  00 00 00 00 00 00 00 02  |.M..............|
-00000030  14 90 0e 1d 26 5c 18 c6  5c 93 66 c4 90 78 a8 91  |....&\..\.f..x..|
-00000040  cb fd                                             |..|
+00000000  17 03 03 00 1e 00 00 00  00 00 00 00 01 4b 49 39  |.............KI9|
+00000010  01 d1 34 c1 b9 72 f6 25  39 c9 e6 77 5c f3 7a 4f  |..4..r.%9..w\.zO|
+00000020  fa f7 43 15 03 03 00 1a  00 00 00 00 00 00 00 02  |..C.............|
+00000030  99 cf 0c 0e 51 f8 37 22  50 2e 98 30 bc 13 e9 f5  |....Q.7"P..0....|
+00000040  d3 75                                             |.u|
diff --git a/src/crypto/tls/testdata/Client-TLSv13-AES128-SHA256 b/src/crypto/tls/testdata/Client-TLSv13-AES128-SHA256
index f8a733e..1097116 100644
--- a/src/crypto/tls/testdata/Client-TLSv13-AES128-SHA256
+++ b/src/crypto/tls/testdata/Client-TLSv13-AES128-SHA256
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fe 01 00 00  fa 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 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,84 +7,85 @@
 00000050  cc a8 c0 2b c0 2f c0 2c  c0 30 c0 09 c0 13 c0 0a  |...+./.,.0......|
 00000060  c0 14 00 9c 00 9d 00 2f  00 35 c0 12 00 0a c0 23  |......./.5.....#|
 00000070  c0 27 00 3c c0 07 c0 11  00 05 13 03 13 01 13 02  |.'.<............|
-00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
+00000080  01 00 00 7f 00 05 00 05  01 00 00 00 00 00 0a 00  |................|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
 000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
 000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
-000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
-000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
-000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
-000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
+000000c0  01 00 01 00 00 17 00 00  00 12 00 00 00 2b 00 09  |.............+..|
+000000d0  08 03 04 03 03 03 02 03  01 00 33 00 26 00 24 00  |..........3.&.$.|
+000000e0  1d 00 20 2f e5 7d a3 47  cd 62 43 15 28 da ac 5f  |.. /.}.G.bC.(.._|
+000000f0  bb 29 07 30 ff f6 84 af  c4 cf c2 ed 90 99 5f 58  |.).0.........._X|
+00000100  cb 3b 74                                          |.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 7a 02 00 00  76 03 03 f1 4c f4 16 24  |....z...v...L..$|
-00000010  e5 c6 b5 ce 72 08 3b 33  9f 1f 1f 80 2c 10 0b 34  |....r.;3....,..4|
-00000020  01 99 85 ba b0 3c 85 50  3d bf 73 20 00 00 00 00  |.....<.P=.s ....|
+00000000  16 03 03 00 7a 02 00 00  76 03 03 0e f8 bf 2d c5  |....z...v.....-.|
+00000010  14 c9 b0 54 dd 64 27 22  ce 6e e1 cb 24 46 76 5c  |...T.d'".n..$Fv\|
+00000020  3c 6b cf 3a 1a bb ca d9  55 18 d2 20 00 00 00 00  |<k.:....U.. ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000040  00 00 00 00 00 00 00 00  00 00 00 00 13 01 00 00  |................|
-00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 69  |..+.....3.$... i|
-00000060  94 3b 83 cd 1f 93 53 53  82 de 14 cb 76 2a 19 62  |.;....SS....v*.b|
-00000070  0f f8 9e d1 e3 e0 a9 d5  23 ac 07 64 53 27 4b 14  |........#..dS'K.|
-00000080  03 03 00 01 01 17 03 03  00 17 ef 24 2c ea 6f 05  |...........$,.o.|
-00000090  c2 07 7a d2 12 30 ce 01  f4 96 b8 dc e6 c2 27 02  |..z..0........'.|
-000000a0  bd 17 03 03 02 6d 99 2b  cb 79 43 01 66 24 eb f1  |.....m.+.yC.f$..|
-000000b0  14 d2 ea 1e 57 67 81 e3  a0 9c 99 1b 1f d5 f0 c7  |....Wg..........|
-000000c0  78 48 61 01 42 25 85 0b  cd a1 b1 75 3c 50 01 cc  |xHa.B%.....u<P..|
-000000d0  69 09 22 a5 fb db 43 76  2f 4e 34 4e 14 a3 e4 89  |i."...Cv/N4N....|
-000000e0  f7 d7 cd 66 da b3 1d fd  f0 98 60 18 41 09 a5 22  |...f......`.A.."|
-000000f0  6d c9 21 bc c3 cd 53 ca  c3 a5 d7 24 57 b4 f5 bc  |m.!...S....$W...|
-00000100  ec b1 48 70 12 55 a5 a6  01 10 68 0f c4 e5 de 89  |..Hp.U....h.....|
-00000110  f9 0d ab 48 92 d4 12 d7  75 77 c3 2f ae 2f 6f 58  |...H....uw././oX|
-00000120  2d 6e ad 72 43 dc ce 4b  c9 74 3d eb db da 37 2c  |-n.rC..K.t=...7,|
-00000130  1e a2 86 c4 b3 64 69 f6  84 ce 52 b5 32 c6 b9 c2  |.....di...R.2...|
-00000140  49 2d 08 f9 d4 9a 29 09  5b 71 09 81 a3 19 c2 4d  |I-....).[q.....M|
-00000150  8c 48 2c e3 c6 cb 81 d4  7f 10 b3 c8 2b 21 ad 83  |.H,.........+!..|
-00000160  97 d2 bd 11 90 39 1e f4  de 65 e2 e8 e8 c7 ce f9  |.....9...e......|
-00000170  6d ad b0 60 5c 4b 59 c4  96 ce b3 a1 83 b2 7c 71  |m..`\KY.......|q|
-00000180  74 e6 a9 a7 89 bf 8d 0d  6c 8d b5 04 33 38 ff 68  |t.......l...38.h|
-00000190  42 0e 84 da d2 b2 16 29  83 66 82 a9 2a d2 67 1b  |B......).f..*.g.|
-000001a0  18 a6 7d e3 f1 d3 f1 b4  cc 6c 14 e2 cd 2d 96 7b  |..}......l...-.{|
-000001b0  76 dd b0 1d 24 7f ea c0  14 24 d7 37 00 7c cd e3  |v...$....$.7.|..|
-000001c0  20 33 a4 3a 22 2a be 3e  e8 f8 7c 0d 3e 51 f7 6b  | 3.:"*.>..|.>Q.k|
-000001d0  ce f3 51 cf 7e ae 55 40  bb ab 0e 40 6b d9 8a 3b  |..Q.~.U@...@k..;|
-000001e0  d5 f2 1f 76 6a 05 9b 87  e2 3b db fa cc e8 93 8a  |...vj....;......|
-000001f0  d9 ba 2b 63 77 77 62 f1  22 ce 11 a9 26 b5 e8 a2  |..+cwwb."...&...|
-00000200  ec 3f 98 44 01 27 d7 e1  39 26 33 e3 86 00 60 f7  |.?.D.'..9&3...`.|
-00000210  a7 91 07 45 f8 3f 78 dc  88 71 30 26 0c f9 0d 51  |...E.?x..q0&...Q|
-00000220  2a c5 ce 33 ac b7 91 a9  74 2e 46 68 80 6e 62 cd  |*..3....t.Fh.nb.|
-00000230  2d 5e 43 fe bd d1 37 07  71 85 5d c7 38 17 50 3a  |-^C...7.q.].8.P:|
-00000240  1c 5e 9f cf 1e 3c 96 d0  26 5d 4c 82 78 a8 69 e7  |.^...<..&]L.x.i.|
-00000250  d3 9a 81 e5 85 66 c3 d9  74 a1 82 9d fb 24 81 13  |.....f..t....$..|
-00000260  0d ce cb 43 61 3c 3a a7  d1 80 7f 1d 41 d8 62 43  |...Ca<:.....A.bC|
-00000270  c6 08 5d 91 05 ed 2c 50  04 42 8c db 2a 11 61 96  |..]...,P.B..*.a.|
-00000280  9b d2 1d 40 af 83 ed 93  06 ba 65 22 0a a5 e8 a6  |...@......e"....|
-00000290  b9 4a 63 6f c0 ac da 72  10 24 c6 ed 08 86 c8 a1  |.Jco...r.$......|
-000002a0  92 5e d0 d8 8b 04 b7 43  50 0b 03 41 3f f9 96 16  |.^.....CP..A?...|
-000002b0  a3 c8 09 e8 ac 91 b2 45  d5 58 5f 41 05 7c b3 88  |.......E.X_A.|..|
-000002c0  7a 59 cd 1a 00 86 29 72  77 a5 19 43 32 79 fc d6  |zY....)rw..C2y..|
-000002d0  d7 e9 81 08 e3 d9 d9 56  39 59 7c 1e d3 10 3e a4  |.......V9Y|...>.|
-000002e0  c6 80 d3 8b 9b 36 51 c5  d3 14 64 a6 65 e2 1a 26  |.....6Q...d.e..&|
-000002f0  c4 a8 31 07 bb 58 8c 9b  d8 7d 86 fd 54 6c c9 ae  |..1..X...}..Tl..|
-00000300  7d 88 4b 13 0f 52 10 41  d6 be 01 32 f2 42 47 0f  |}.K..R.A...2.BG.|
-00000310  7a 8c 7e 17 03 03 00 99  8b ce c4 db 9c 9c 88 e3  |z.~.............|
-00000320  88 58 de 8f 10 e9 fb 4a  c7 26 96 60 48 84 2c b1  |.X.....J.&.`H.,.|
-00000330  2b 6c 35 70 8a d7 39 91  51 d7 3f db 81 f0 41 07  |+l5p..9.Q.?...A.|
-00000340  a2 c9 c1 74 76 62 58 f1  cb e2 50 48 57 bb 6e 3d  |...tvbX...PHW.n=|
-00000350  ee ee 4a 53 e7 3c 66 aa  e3 d9 c1 f1 74 1a 93 b9  |..JS.<f.....t...|
-00000360  44 90 f6 a5 a4 da f5 6b  75 01 38 52 8f 9c ab 01  |D......ku.8R....|
-00000370  78 88 a6 cc 65 15 61 a8  8c cc 14 59 07 ea 6f 25  |x...e.a....Y..o%|
-00000380  5c 86 89 16 eb e7 da 20  82 d7 96 e4 78 7a c3 36  |\...... ....xz.6|
-00000390  b3 5c e7 17 1b 07 30 a2  72 ca a2 f3 dc 7e 45 c9  |.\....0.r....~E.|
-000003a0  7f 94 f8 a1 7b bb 2a 30  d7 bc 51 03 fb e6 2a fa  |....{.*0..Q...*.|
-000003b0  17 17 03 03 00 35 c1 a0  76 b6 35 4b 5c 26 94 c6  |.....5..v.5K\&..|
-000003c0  ba b1 7b b1 13 00 f2 2c  17 ed ac ab 47 9a a1 8d  |..{....,....G...|
-000003d0  3a 1c 78 44 14 a1 04 31  3d eb 9a 8d bb 2f 73 46  |:.xD...1=..../sF|
-000003e0  cb 5c f6 86 81 fa 56 fb  39 8c 55                 |.\....V.9.U|
+00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 f0  |..+.....3.$... .|
+00000060  f3 c3 c9 89 b9 92 ce df  d1 bd f1 11 25 4d 73 3b  |............%Ms;|
+00000070  da 10 b8 4c c8 22 00 6a  24 6b b8 73 4e de 42 14  |...L.".j$k.sN.B.|
+00000080  03 03 00 01 01 17 03 03  00 17 0d c6 b2 56 f3 da  |.............V..|
+00000090  2d 18 93 c6 59 8c be b9  7f 1d 48 bd 7a a2 85 d3  |-...Y.....H.z...|
+000000a0  74 17 03 03 02 6d d5 8a  aa 3c ca d2 98 eb 0c bb  |t....m...<......|
+000000b0  54 00 49 eb 94 48 be 31  a5 c6 13 a6 98 1a df 43  |T.I..H.1.......C|
+000000c0  b8 5d 11 6e c2 80 18 88  a0 84 f2 4b 67 58 64 ae  |.].n.......KgXd.|
+000000d0  e9 7d 97 6a ec af 1f 80  c9 1b 5e ce d5 88 7d c3  |.}.j......^...}.|
+000000e0  05 36 7c 8d ac 70 8d 36  84 d6 12 ed a7 86 87 0c  |.6|..p.6........|
+000000f0  a0 b3 8c c4 20 0c c3 01  04 ef 27 1b cc bd 27 72  |.... .....'...'r|
+00000100  4f 92 61 6f 1c 21 1e 6a  27 22 3f a9 3c a7 b9 b3  |O.ao.!.j'"?.<...|
+00000110  d4 3c 1f 7b 78 97 f1 52  ca b9 cc a8 2b 2b be a2  |.<.{x..R....++..|
+00000120  fb 9b 47 f1 d4 c0 8e eb  3b c2 5b 4d 74 18 c3 ce  |..G.....;.[Mt...|
+00000130  0c a7 8d 3e 1c f8 13 5e  8e 20 68 a8 1c 75 bd f4  |...>...^. h..u..|
+00000140  5a ba 16 71 8c 97 db 6d  90 7c 64 56 0d 29 99 16  |Z..q...m.|dV.)..|
+00000150  9b f2 85 4c 84 11 b0 c4  76 f2 d8 bd 7f 19 cb 80  |...L....v.......|
+00000160  ec ad 18 e0 d5 c7 a7 f7  70 08 36 c6 0c 8a 88 ef  |........p.6.....|
+00000170  d9 20 7e e2 b8 a7 c9 18  26 d3 8e c6 d6 48 02 1c  |. ~.....&....H..|
+00000180  cb 02 7b 52 93 dc 4b da  82 9d 07 b9 65 0d 2a 7a  |..{R..K.....e.*z|
+00000190  3a 8b 3a 3d 58 79 e2 a8  14 83 25 06 64 e0 48 71  |:.:=Xy....%.d.Hq|
+000001a0  ef 2f 28 74 3f 46 04 f5  60 01 fb 53 d5 ff ca 7f  |./(t?F..`..S....|
+000001b0  89 4c 80 e6 e7 44 cb ad  93 d0 6a 8a 14 13 cc 09  |.L...D....j.....|
+000001c0  bf 54 12 56 94 17 1e f3  c5 7a 06 d3 28 3d 61 0d  |.T.V.....z..(=a.|
+000001d0  1e ad d3 55 28 1e e7 f6  6a e6 da 31 3d 99 61 df  |...U(...j..1=.a.|
+000001e0  94 d1 1a 58 f6 06 55 0a  43 20 23 dc 58 2b d4 db  |...X..U.C #.X+..|
+000001f0  35 91 16 e1 29 62 e7 fd  aa fe 65 d7 ef b2 a6 2b  |5...)b....e....+|
+00000200  6b c8 29 4b c0 94 ca bc  32 c4 d8 7a 2a 66 ea 25  |k.)K....2..z*f.%|
+00000210  ee 8f fc 85 28 5f b6 1a  11 0b cb dc 57 0b 70 7e  |....(_......W.p~|
+00000220  58 fc f5 09 41 88 0d a0  fc 03 58 a6 e3 48 29 ed  |X...A.....X..H).|
+00000230  4e e4 ff cc 4b 42 fd 53  e7 e5 2d 57 0e 6a 88 96  |N...KB.S..-W.j..|
+00000240  12 03 54 c3 de 8f 9a 46  98 2c ef ac cd 72 bc 7f  |..T....F.,...r..|
+00000250  f6 1b cb 98 d4 0c 46 32  1e 18 51 39 d1 ee bf 83  |......F2..Q9....|
+00000260  71 e1 df 3a 31 82 22 2f  ba 0e 69 a3 93 9d 0c 5c  |q..:1."/..i....\|
+00000270  8f e5 ea e8 25 26 b1 40  8e 19 0c f4 55 ff 7b cb  |....%&.@....U.{.|
+00000280  96 d2 0f 07 a0 da 99 38  df 63 9b 9e 33 5b 87 f2  |.......8.c..3[..|
+00000290  1b f7 3f 36 e4 65 ae 95  69 0f ec fc 34 fb 1e e5  |..?6.e..i...4...|
+000002a0  f7 ce 78 b0 c5 d6 94 e8  e5 ee 37 56 20 ac 58 c4  |..x.......7V .X.|
+000002b0  3a 5e cd e2 7f ac 23 c6  5e 2e 45 aa 8a d5 ea 0e  |:^....#.^.E.....|
+000002c0  0b 1d 13 19 72 0f 8d 48  6b 2f aa 8d d3 74 bb d2  |....r..Hk/...t..|
+000002d0  ff fb 46 f7 7f 7d 03 50  9e 3b a8 2d 73 c4 e5 db  |..F..}.P.;.-s...|
+000002e0  82 8a 48 5f b4 4e 49 35  4b 04 ca 70 35 30 c4 c9  |..H_.NI5K..p50..|
+000002f0  d5 94 cb 58 e3 40 e4 8f  3f 17 f5 dd c8 80 d9 41  |...X.@..?......A|
+00000300  e2 2a 7b 63 e7 87 84 9a  aa 54 3c 1f 4b 64 7b 32  |.*{c.....T<.Kd{2|
+00000310  17 d4 f3 17 03 03 00 99  47 1a 1f d9 17 60 17 4a  |........G....`.J|
+00000320  7a 68 c2 69 4f 59 6e b5  72 2f e9 a8 42 db 9c 49  |zh.iOYn.r/..B..I|
+00000330  62 3c db 0c fd 49 2f 0b  4f fa de db ef 7d 5e 60  |b<...I/.O....}^`|
+00000340  6b 99 39 ab b3 44 ac bc  68 2b 86 fd db 91 63 6c  |k.9..D..h+....cl|
+00000350  da 2f 6b 32 c4 99 b4 51  84 5c a8 0d 1d 31 05 f3  |./k2...Q.\...1..|
+00000360  45 e3 b4 83 3d c8 17 2e  f9 4e f7 61 6c 4b e5 d4  |E...=....N.alK..|
+00000370  24 04 2e 3f c9 f4 c9 8a  2d 8f 50 d0 c2 f8 35 56  |$..?....-.P...5V|
+00000380  1a 59 08 99 3d 0e 47 ea  54 44 75 d1 2b 31 28 71  |.Y..=.G.TDu.+1(q|
+00000390  fb 88 69 0a d2 50 30 77  41 ab ed 29 51 58 75 87  |..i..P0wA..)QXu.|
+000003a0  5a 59 bc 66 6b f3 d5 5f  ad c4 26 9d e6 a8 7e 70  |ZY.fk.._..&...~p|
+000003b0  b3 17 03 03 00 35 fe f7  08 e7 c6 3e 00 c3 5e a3  |.....5.....>..^.|
+000003c0  87 23 df 10 46 4f bb 17  ee bf 93 df b7 6d f0 45  |.#..FO.......m.E|
+000003d0  77 bf 60 6d f9 bb ce 58  f2 59 4a 40 5e d6 dd 0b  |w.`m...X.YJ@^...|
+000003e0  19 9a 41 8e 6b 03 16 e3  ce cd b6                 |..A.k......|
 >>> Flow 3 (client to server)
-00000000  14 03 03 00 01 01 17 03  03 00 35 97 2c 39 3a a5  |..........5.,9:.|
-00000010  32 33 e5 74 43 97 98 ef  ef 30 de 27 8b f7 b5 ab  |23.tC....0.'....|
-00000020  dd af 87 7c a5 5e 76 cf  50 2a 03 f8 94 a4 7a df  |...|.^v.P*....z.|
-00000030  14 0a 2d 39 57 3b 02 97  c5 d7 63 85 21 3f 55 27  |..-9W;....c.!?U'|
-00000040  17 03 03 00 17 7c b4 8b  82 f0 0a ec 6f fa 60 ef  |.....|......o.`.|
-00000050  4c 0a 1c 0b ad 99 c3 89  fb a4 40 2c 17 03 03 00  |L.........@,....|
-00000060  13 f2 d5 58 ba 6b ca e8  f4 14 4c 66 23 38 f2 e8  |...X.k....Lf#8..|
-00000070  ea a9 ba c1                                       |....|
+00000000  14 03 03 00 01 01 17 03  03 00 35 3c 85 dc 33 0a  |..........5<..3.|
+00000010  bd 78 f0 fc 0a 07 3a 9e  a5 31 ca b8 f6 23 d5 26  |.x....:..1...#.&|
+00000020  2a 60 ce d9 d2 da 37 e5  e8 27 bb 99 a3 43 ad 66  |*`....7..'...C.f|
+00000030  e2 07 33 de ca dc 2f d4  73 f4 71 50 d0 99 3b 7d  |..3.../.s.qP..;}|
+00000040  17 03 03 00 17 de 7a 55  7a 1d e3 1e 51 10 df 9e  |......zUz...Q...|
+00000050  30 a6 b9 15 79 b4 20 82  01 e5 b2 34 17 03 03 00  |0...y. ....4....|
+00000060  13 85 50 af bc 99 0b eb  84 58 b9 6c 46 88 22 b0  |..P......X.lF.".|
+00000070  7e 42 79 01                                       |~By.|
diff --git a/src/crypto/tls/testdata/Client-TLSv13-AES256-SHA384 b/src/crypto/tls/testdata/Client-TLSv13-AES256-SHA384
index 8ea3ed6..39b2e09 100644
--- a/src/crypto/tls/testdata/Client-TLSv13-AES256-SHA384
+++ b/src/crypto/tls/testdata/Client-TLSv13-AES256-SHA384
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fe 01 00 00  fa 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 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,86 +7,87 @@
 00000050  cc a8 c0 2b c0 2f c0 2c  c0 30 c0 09 c0 13 c0 0a  |...+./.,.0......|
 00000060  c0 14 00 9c 00 9d 00 2f  00 35 c0 12 00 0a c0 23  |......./.5.....#|
 00000070  c0 27 00 3c c0 07 c0 11  00 05 13 03 13 01 13 02  |.'.<............|
-00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
+00000080  01 00 00 7f 00 05 00 05  01 00 00 00 00 00 0a 00  |................|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
 000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
 000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
-000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
-000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
-000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
-000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
+000000c0  01 00 01 00 00 17 00 00  00 12 00 00 00 2b 00 09  |.............+..|
+000000d0  08 03 04 03 03 03 02 03  01 00 33 00 26 00 24 00  |..........3.&.$.|
+000000e0  1d 00 20 2f e5 7d a3 47  cd 62 43 15 28 da ac 5f  |.. /.}.G.bC.(.._|
+000000f0  bb 29 07 30 ff f6 84 af  c4 cf c2 ed 90 99 5f 58  |.).0.........._X|
+00000100  cb 3b 74                                          |.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 7a 02 00 00  76 03 03 71 00 90 30 07  |....z...v..q..0.|
-00000010  24 01 ae 33 b2 e8 4f 1f  9a 2c 83 e5 7b 30 1e a2  |$..3..O..,..{0..|
-00000020  8e 4a d0 df d1 ec 23 b5  ba aa 75 20 00 00 00 00  |.J....#...u ....|
+00000000  16 03 03 00 7a 02 00 00  76 03 03 fc b2 8e 30 c0  |....z...v.....0.|
+00000010  a2 bd d8 1c 4b 68 bc e0  a1 56 5f 5b 05 54 b7 7a  |....Kh...V_[.T.z|
+00000020  60 9a 49 68 f5 f4 f0 b1  49 27 79 20 00 00 00 00  |`.Ih....I'y ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000040  00 00 00 00 00 00 00 00  00 00 00 00 13 02 00 00  |................|
-00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 06  |..+.....3.$... .|
-00000060  2a 26 bd 81 c2 90 9b 17  6e d0 b5 ab 72 e6 93 ce  |*&......n...r...|
-00000070  53 6d 8c 54 b5 a4 50 91  93 32 6e 88 e6 b2 69 14  |Sm.T..P..2n...i.|
-00000080  03 03 00 01 01 17 03 03  00 17 7d 11 37 f0 18 b1  |..........}.7...|
-00000090  53 55 38 bb 12 7c e8 b3  89 bc 35 fb 2a 36 d1 0f  |SU8..|....5.*6..|
-000000a0  3a 17 03 03 02 6d a0 fa  dc 8e ac a6 90 5a 20 0e  |:....m.......Z .|
-000000b0  ee 22 89 7b 69 5b c9 1a  a1 c6 43 b9 40 f6 85 78  |.".{i[....C.@..x|
-000000c0  61 0b 14 c6 e6 3b a9 ac  4c 7a 96 9b 7b 87 d0 ce  |a....;..Lz..{...|
-000000d0  42 cc 75 9d fc 06 44 3e  e8 12 3a 94 b7 de 86 c4  |B.u...D>..:.....|
-000000e0  b5 66 e1 f5 48 21 f7 f1  58 7f 23 6c 3f 76 a0 cb  |.f..H!..X.#l?v..|
-000000f0  a7 f6 72 34 07 fa c1 55  3e 61 cf 72 c4 6c f1 ca  |..r4...U>a.r.l..|
-00000100  dd dc ec 66 3d 7b f6 cf  53 3b 28 bd 27 1b aa a6  |...f={..S;(.'...|
-00000110  28 2a ab fa 48 a5 08 67  b5 49 c7 c7 5d f8 2c ec  |(*..H..g.I..].,.|
-00000120  83 af 58 33 42 6c c1 4c  94 17 7e 36 1c a9 48 34  |..X3Bl.L..~6..H4|
-00000130  5f 26 78 f6 69 88 3a a5  1b d1 76 ad 88 63 25 33  |_&x.i.:...v..c%3|
-00000140  0d e3 d0 34 6b 7f fc 96  2b 8d 22 6f 3f 21 8a 14  |...4k...+."o?!..|
-00000150  01 e0 5c 54 6c c3 b8 12  f9 17 f5 4c ce e0 bd 10  |..\Tl......L....|
-00000160  e7 e1 29 24 73 94 c2 5e  b0 ad d3 91 9e 87 ea 23  |..)$s..^.......#|
-00000170  4d fd 8f 12 ca 87 ff 2e  93 9f 16 a8 18 e1 66 8f  |M.............f.|
-00000180  50 76 15 cd 70 5c a2 1d  91 51 e5 54 13 5f 73 d3  |Pv..p\...Q.T._s.|
-00000190  b2 6e b1 27 80 0b 3d 64  d5 fa f3 a4 fb 77 33 cb  |.n.'..=d.....w3.|
-000001a0  ac 93 54 36 2d 71 c3 9e  dd 37 02 a9 9d b0 9b ac  |..T6-q...7......|
-000001b0  f8 c5 dc 43 9b d8 db c7  d0 fb cf 69 fa 62 e4 9d  |...C.......i.b..|
-000001c0  b7 04 f8 49 d3 a7 8d bd  cf 8a e3 4a 62 cb bb 29  |...I.......Jb..)|
-000001d0  b5 db 21 80 76 eb 28 67  34 1e 40 0b 83 83 19 10  |..!.v.(g4.@.....|
-000001e0  46 8f bd 78 d6 7c 05 c2  19 82 1c e8 7d 84 f2 79  |F..x.|......}..y|
-000001f0  c4 a6 e0 f7 7e df 70 7f  42 48 9f e4 99 03 7f 9e  |....~.p.BH......|
-00000200  e8 fd 75 c3 8a 55 55 8e  08 2e 62 28 a5 16 b7 11  |..u..UU...b(....|
-00000210  d8 9a 11 48 46 ad d3 ba  4f 91 c8 fd 72 d9 df 98  |...HF...O...r...|
-00000220  1a 59 51 55 af ab 73 b9  f3 bf fe 7d 55 7d 44 54  |.YQU..s....}U}DT|
-00000230  cd bb f3 eb 6e ff 5a 09  e9 b9 c1 66 97 8e a5 7c  |....n.Z....f...||
-00000240  89 4a 51 1d 8b e4 40 fb  97 ce ef 9d 7c 02 e4 db  |.JQ...@.....|...|
-00000250  f1 ca 01 d9 05 b4 de 10  23 33 92 ff 26 3b 09 8f  |........#3..&;..|
-00000260  11 7c 37 ad fb 58 ed 7a  10 08 fd df 98 dd d6 c5  |.|7..X.z........|
-00000270  b8 fd 59 37 21 1d 6e 27  8a 56 24 45 e7 64 61 0b  |..Y7!.n'.V$E.da.|
-00000280  20 2d bc 79 89 fa 6d 7a  06 77 61 0c 60 25 e2 79  | -.y..mz.wa.`%.y|
-00000290  6a 54 9e 5b 4b 33 68 17  da 63 ba a7 f9 ad 2c 84  |jT.[K3h..c....,.|
-000002a0  52 e9 27 85 71 74 d2 5f  c9 f8 8e 67 f7 47 58 f5  |R.'.qt._...g.GX.|
-000002b0  e4 72 a7 bd 1c 94 4b 4d  13 5a 62 69 d9 6f 3a 51  |.r....KM.Zbi.o:Q|
-000002c0  f0 18 90 e5 b6 21 23 97  70 74 93 ba 9b bc dc e4  |.....!#.pt......|
-000002d0  3d 9c 52 3f 93 f0 48 05  e8 50 d0 b4 98 92 7a 18  |=.R?..H..P....z.|
-000002e0  3f 39 ba f8 f7 ee 19 b0  ce ac d0 ab 9e 83 ee 0e  |?9..............|
-000002f0  5d 2a 72 74 a8 8b 4d de  6b a9 91 ad b4 a4 26 99  |]*rt..M.k.....&.|
-00000300  4e aa 6d 48 77 83 78 78  be 96 f1 17 d6 96 74 4a  |N.mHw.xx......tJ|
-00000310  80 d1 5b 17 03 03 00 99  d9 40 96 5c fb 5d 65 69  |..[......@.\.]ei|
-00000320  db 54 a8 f6 8c b7 d3 25  8d 2d c5 f1 40 5b f2 26  |.T.....%.-..@[.&|
-00000330  f3 86 9e 61 6a a5 b9 66  b1 27 b1 20 6b 2c 64 84  |...aj..f.'. k,d.|
-00000340  3f 48 24 5d d9 90 4b d1  ed 1b 0e 05 84 7f ad 0e  |?H$]..K.........|
-00000350  e6 75 f6 f9 33 90 73 7c  88 10 d7 e9 74 41 4b c3  |.u..3.s|....tAK.|
-00000360  19 8e e1 a8 a6 7c 3c 9a  bc 69 a7 e7 bb d6 af 98  |.....|<..i......|
-00000370  f1 49 53 14 95 80 d6 95  81 5a 5e 88 2c 29 70 df  |.IS......Z^.,)p.|
-00000380  b2 df fe f3 17 03 e7 de  af 12 57 c5 7a ef 70 eb  |..........W.z.p.|
-00000390  8a c6 c3 05 de 5b 15 af  5f 54 8c 7b 23 b7 e1 f1  |.....[.._T.{#...|
-000003a0  30 b1 ed 34 4c 59 f5 68  c2 50 e8 c3 83 78 1d 1f  |0..4LY.h.P...x..|
-000003b0  eb 17 03 03 00 45 1a d4  61 ba 4a a5 1e 02 80 04  |.....E..a.J.....|
-000003c0  2a 19 11 af 8c e9 bd ab  22 6b 75 41 a8 40 de 57  |*......."kuA.@.W|
-000003d0  54 8c dc 09 cc 57 76 82  27 5e 59 0c 30 f7 9d c4  |T....Wv.'^Y.0...|
-000003e0  fe 1c 09 f2 f4 5f e0 79  ac 02 06 80 f3 60 c4 92  |....._.y.....`..|
-000003f0  cd 6a df b6 46 7c de 90  8d bb 94                 |.j..F|.....|
+00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 d3  |..+.....3.$... .|
+00000060  d7 9e 72 ae 5f f9 92 24  6b 76 e5 a1 00 71 78 cf  |..r._..$kv...qx.|
+00000070  e9 55 29 5b fe a8 71 14  e9 02 b0 65 12 e8 04 14  |.U)[..q....e....|
+00000080  03 03 00 01 01 17 03 03  00 17 24 a0 73 a6 7b ab  |..........$.s.{.|
+00000090  9c d8 69 e7 15 68 4b 26  0a 15 0c ff c4 40 7d b8  |..i..hK&.....@}.|
+000000a0  ad 17 03 03 02 6d 05 b2  f9 6e 05 48 18 92 2b 87  |.....m...n.H..+.|
+000000b0  29 1c 5b 8c a8 ae 0e 4b  fc 3b 1e b9 2c c2 0c 33  |).[....K.;..,..3|
+000000c0  f8 5d 16 37 39 b3 b2 4e  12 a4 02 4c fb 3b 16 4e  |.].79..N...L.;.N|
+000000d0  63 92 72 56 49 d6 5b 63  34 20 67 c8 07 a2 b6 0d  |c.rVI.[c4 g.....|
+000000e0  f1 06 b4 bd 88 54 4d 33  66 1a d4 fc 42 9c 4e 00  |.....TM3f...B.N.|
+000000f0  40 34 5d cf c4 5d f1 ba  14 de 34 50 f5 2f 3d b7  |@4]..]....4P./=.|
+00000100  1c 17 33 6e 9a 2b 39 1b  f1 a6 0d fb b7 0c c3 b3  |..3n.+9.........|
+00000110  02 f8 0c 30 e8 31 d7 ee  bf a1 a0 64 28 67 64 50  |...0.1.....d(gdP|
+00000120  24 ce 37 fd 15 2e c7 13  1b 8b f0 22 19 e4 ec c8  |$.7........"....|
+00000130  8c b0 76 b8 d0 2d 87 99  86 8b ec ca e9 9d 8f 23  |..v..-.........#|
+00000140  bf 3d bf b8 ed 85 34 85  31 15 dd 7a 36 f7 3e 0e  |.=....4.1..z6.>.|
+00000150  df e7 4c e8 ae 5a 98 05  f8 34 76 33 c3 4c 81 fb  |..L..Z...4v3.L..|
+00000160  d8 29 14 b3 47 32 eb 5f  73 5a 95 4a c7 3d 89 2a  |.)..G2._sZ.J.=.*|
+00000170  21 22 bd 97 b2 9d 4b dd  2c eb a5 e3 37 d6 a9 84  |!"....K.,...7...|
+00000180  0c b6 02 2f 1f 5c 18 1b  be 92 be 58 a7 e1 a0 49  |.../.\.....X...I|
+00000190  95 dc d7 07 70 b1 5b 15  86 3f 55 fc ad 32 39 5d  |....p.[..?U..29]|
+000001a0  95 63 fd d4 85 55 b2 e9  c2 68 d0 09 f9 53 f9 4f  |.c...U...h...S.O|
+000001b0  0e 89 1c a0 85 74 7f 10  97 e7 86 8a 18 28 83 e6  |.....t.......(..|
+000001c0  66 3c 2a f5 8f 14 1d 90  58 ef ad 1f d3 7f 42 0a  |f<*.....X.....B.|
+000001d0  08 d5 b4 96 b0 9d 3f 72  49 5a 06 13 7c 4b bc 79  |......?rIZ..|K.y|
+000001e0  8c db 1f 1f 5e 3d c2 fe  ad 57 e6 d9 14 bb d0 72  |....^=...W.....r|
+000001f0  d7 90 14 35 ec 34 31 f6  fd b1 fd 3d 46 6e 4f a7  |...5.41....=FnO.|
+00000200  1e 7d 14 40 17 0c ef c0  c8 70 fe dc 6a f1 78 6a  |.}.@.....p..j.xj|
+00000210  c6 df 70 2e ac 07 d9 6d  f7 90 0e 4a 92 08 cf 88  |..p....m...J....|
+00000220  26 c0 11 4a 7d e4 34 ba  86 43 cb 94 f8 d7 61 5a  |&..J}.4..C....aZ|
+00000230  05 f5 f9 49 b4 04 f1 c8  43 b6 12 52 ae cf 7c b9  |...I....C..R..|.|
+00000240  39 d1 90 91 6e 80 43 cf  4c 23 3d 7c c0 c8 88 46  |9...n.C.L#=|...F|
+00000250  e2 91 86 e4 41 cb ed f2  3a 92 01 9f 04 7c d2 81  |....A...:....|..|
+00000260  42 18 6c 04 91 25 8a 29  0e d9 23 aa 58 e5 e8 ee  |B.l..%.)..#.X...|
+00000270  39 79 a5 a7 3a 4d e3 cc  15 79 3f 7b f9 e4 21 76  |9y..:M...y?{..!v|
+00000280  5c 9a d8 de d3 9a f3 9e  69 44 c0 2a 56 04 b4 d2  |\.......iD.*V...|
+00000290  c3 c1 4c d6 ad b8 d8 ad  c8 c2 0d fa ea e1 bc 11  |..L.............|
+000002a0  67 15 80 ef c6 01 48 7f  de f1 c2 36 a7 dd a9 38  |g.....H....6...8|
+000002b0  31 8b 14 ed 5c 2a 66 55  3b 25 e3 85 cb d9 a9 82  |1...\*fU;%......|
+000002c0  7a 95 99 b3 c8 aa ac 66  30 b0 c5 3d d1 2a ab b9  |z......f0..=.*..|
+000002d0  56 b3 5e 9d e0 d7 81 ac  6f 2e ae 62 a2 ef ca ef  |V.^.....o..b....|
+000002e0  7b cf 0f af f6 0b 29 97  2d 27 33 58 ad b6 1b d2  |{.....).-'3X....|
+000002f0  0a c7 11 ec 89 b0 0d 2e  ff 27 64 c2 bf 8e 85 a4  |.........'d.....|
+00000300  ea 14 52 71 55 1a ec ef  0d ff 14 00 ce 3d 9d 3d  |..RqU........=.=|
+00000310  a9 d3 17 17 03 03 00 99  5e ba 1f f3 93 71 7a 88  |........^....qz.|
+00000320  bc 14 71 7e 85 15 c9 da  fe ee c1 b1 3d f6 ff 67  |..q~........=..g|
+00000330  fd 28 96 f3 44 44 6f 8f  32 b4 22 be 69 29 e6 dd  |.(..DDo.2.".i)..|
+00000340  60 07 1d 98 0b 0c 0f ec  df fa 46 c0 67 66 f2 18  |`.........F.gf..|
+00000350  bf 5e 36 56 b2 b2 25 ef  aa 76 51 ea f7 47 1d ee  |.^6V..%..vQ..G..|
+00000360  7b 25 e5 97 89 4a 04 07  f8 ff 05 73 25 71 e4 28  |{%...J.....s%q.(|
+00000370  9e 91 45 ff 4c df 82 dc  85 16 02 ba 15 9b 37 91  |..E.L.........7.|
+00000380  eb 65 12 66 38 59 8a 85  a2 2e af 2f d7 74 75 c1  |.e.f8Y...../.tu.|
+00000390  7e f6 64 87 7e 4c 86 c8  25 bb 59 8d f8 9c e3 e5  |~.d.~L..%.Y.....|
+000003a0  a4 53 a5 c6 00 bd 78 d8  07 0e f5 42 92 e3 42 11  |.S....x....B..B.|
+000003b0  57 17 03 03 00 45 77 98  db b2 e4 66 e3 dc 3e 4f  |W....Ew....f..>O|
+000003c0  49 92 b3 ac 74 cd 1c 3b  e2 81 3c 64 0b a5 c9 8c  |I...t..;..<d....|
+000003d0  7e 9a 22 9f df 7e e8 68  99 56 93 49 d5 81 3f c1  |~."..~.h.V.I..?.|
+000003e0  de 00 07 bd 6e ba 25 00  63 f0 82 41 46 ba 04 b7  |....n.%.c..AF...|
+000003f0  1f 37 aa 1c f6 49 8f e6  83 e8 23                 |.7...I....#|
 >>> Flow 3 (client to server)
-00000000  14 03 03 00 01 01 17 03  03 00 45 8c 37 d5 7e 3e  |..........E.7.~>|
-00000010  c4 24 64 8b fa fc 8d 03  a7 92 34 35 c3 2c f2 54  |.$d.......45.,.T|
-00000020  43 06 5d 8a c9 c0 e8 7d  22 d3 99 58 01 0e 44 aa  |C.]....}"..X..D.|
-00000030  3c 26 eb 68 45 14 cd bf  6c 61 bb 31 91 9d b4 57  |<&.hE...la.1...W|
-00000040  42 79 14 8c 67 c6 65 52  15 07 c8 f3 c3 9f 23 ef  |By..g.eR......#.|
-00000050  17 03 03 00 17 21 51 dd  67 e4 be f8 7c 7b 84 0d  |.....!Q.g...|{..|
-00000060  78 3c 7f ac 50 f8 34 7b  fb 38 09 d0 17 03 03 00  |x<..P.4{.8......|
-00000070  13 35 1a 52 9d de 4a 74  1f 01 70 de 05 c5 c3 b9  |.5.R..Jt..p.....|
-00000080  e6 de 9c 0f                                       |....|
+00000000  14 03 03 00 01 01 17 03  03 00 45 75 66 f7 1c cc  |..........Euf...|
+00000010  a5 d2 e0 60 37 ff ab 89  16 88 c1 27 ba 57 0c 0d  |...`7......'.W..|
+00000020  28 c9 c3 8a 53 57 05 1c  2a 47 52 b6 98 f9 26 4f  |(...SW..*GR...&O|
+00000030  34 7c 7a 71 00 87 47 c3  a5 b8 0c 8c 03 87 5e de  |4|zq..G.......^.|
+00000040  a1 40 33 9b e1 7f ad 36  71 10 9a e7 28 45 e1 e2  |.@3....6q...(E..|
+00000050  17 03 03 00 17 a3 83 88  cd fa fc f4 60 12 e7 be  |............`...|
+00000060  8d 11 31 74 3f 25 3e 32  6f 7f 73 57 17 03 03 00  |..1t?%>2o.sW....|
+00000070  13 7f ab 29 bc f6 7e ea  f7 17 ee 7a ef 38 ff bc  |...)..~....z.8..|
+00000080  82 68 f5 07                                       |.h..|
diff --git a/src/crypto/tls/testdata/Client-TLSv13-ALPN b/src/crypto/tls/testdata/Client-TLSv13-ALPN
index 1d8da26..b291259 100644
--- a/src/crypto/tls/testdata/Client-TLSv13-ALPN
+++ b/src/crypto/tls/testdata/Client-TLSv13-ALPN
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 01 0e 01 00 01  0a 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 01 12 01 00 01  0e 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 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,87 +7,87 @@
 00000050  cc a8 c0 2b c0 2f c0 2c  c0 30 c0 09 c0 13 c0 0a  |...+./.,.0......|
 00000060  c0 14 00 9c 00 9d 00 2f  00 35 c0 12 00 0a c0 23  |......./.5.....#|
 00000070  c0 27 00 3c c0 07 c0 11  00 05 13 03 13 01 13 02  |.'.<............|
-00000080  01 00 00 8f 00 05 00 05  01 00 00 00 00 00 0a 00  |................|
+00000080  01 00 00 93 00 05 00 05  01 00 00 00 00 00 0a 00  |................|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
 000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
 000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
-000000c0  01 00 01 00 00 10 00 10  00 0e 06 70 72 6f 74 6f  |...........proto|
-000000d0  32 06 70 72 6f 74 6f 31  00 12 00 00 00 2b 00 09  |2.proto1.....+..|
-000000e0  08 03 04 03 03 03 02 03  01 00 33 00 26 00 24 00  |..........3.&.$.|
-000000f0  1d 00 20 2f e5 7d a3 47  cd 62 43 15 28 da ac 5f  |.. /.}.G.bC.(.._|
-00000100  bb 29 07 30 ff f6 84 af  c4 cf c2 ed 90 99 5f 58  |.).0.........._X|
-00000110  cb 3b 74                                          |.;t|
+000000c0  01 00 01 00 00 17 00 00  00 10 00 10 00 0e 06 70  |...............p|
+000000d0  72 6f 74 6f 32 06 70 72  6f 74 6f 31 00 12 00 00  |roto2.proto1....|
+000000e0  00 2b 00 09 08 03 04 03  03 03 02 03 01 00 33 00  |.+............3.|
+000000f0  26 00 24 00 1d 00 20 2f  e5 7d a3 47 cd 62 43 15  |&.$... /.}.G.bC.|
+00000100  28 da ac 5f bb 29 07 30  ff f6 84 af c4 cf c2 ed  |(.._.).0........|
+00000110  90 99 5f 58 cb 3b 74                              |.._X.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 7a 02 00 00  76 03 03 c2 91 70 7a 7a  |....z...v....pzz|
-00000010  d4 c9 46 7a e9 44 d1 c0  92 a6 0a 43 34 08 b2 ce  |..Fz.D.....C4...|
-00000020  14 99 8f 6c f7 37 fb a1  28 00 ae 20 00 00 00 00  |...l.7..(.. ....|
+00000000  16 03 03 00 7a 02 00 00  76 03 03 90 3b d5 53 eb  |....z...v...;.S.|
+00000010  af 38 68 af fc 8f 47 f5  3f 13 5c c5 46 9d 97 b7  |.8h...G.?.\.F...|
+00000020  e2 c4 0c 93 d4 91 2b 45  77 11 1b 20 00 00 00 00  |......+Ew.. ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000040  00 00 00 00 00 00 00 00  00 00 00 00 13 03 00 00  |................|
-00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 60  |..+.....3.$... `|
-00000060  96 62 c2 30 4e ae b6 89  f2 06 e0 4e 8e 32 27 04  |.b.0N......N.2'.|
-00000070  b5 74 80 d8 c3 f5 76 7d  0e 0e e1 8d bc 2c 2c 14  |.t....v}.....,,.|
-00000080  03 03 00 01 01 17 03 03  00 24 45 c7 50 3e a9 63  |.........$E.P>.c|
-00000090  24 0b e9 80 3f 59 bb be  23 8a 5d 46 eb ee 17 9c  |$...?Y..#.]F....|
-000000a0  70 6f 52 1f 18 f3 9f 72  d6 35 44 55 91 d2 17 03  |poR....r.5DU....|
-000000b0  03 02 6d c2 c0 1f 53 2a  0c 3c 7f 08 c3 cb 53 4e  |..m...S*.<....SN|
-000000c0  b2 f5 b3 2d a5 10 e1 97  00 89 67 db 4e df ad 75  |...-......g.N..u|
-000000d0  94 b4 56 c4 8a a3 49 41  43 a1 3f aa 9b 8e e1 8d  |..V...IAC.?.....|
-000000e0  4c 9c 36 f6 80 da 4e 7f  00 10 c0 81 3e 45 1b a0  |L.6...N.....>E..|
-000000f0  b7 7f 2c bd eb 2a 8b c4  e6 fa c8 b3 59 28 f6 b8  |..,..*......Y(..|
-00000100  0a 93 cb b3 bf 28 e7 1a  ae a0 f5 ff 3a 42 f5 64  |.....(......:B.d|
-00000110  92 2c dd c2 24 77 2f a6  7e 23 63 3f 24 16 b3 d5  |.,..$w/.~#c?$...|
-00000120  b7 df 3f 30 23 a4 aa c9  14 78 6c f2 82 45 52 df  |..?0#....xl..ER.|
-00000130  cf a1 1d 35 fd 2a 30 89  14 38 5a 23 b1 63 2c c1  |...5.*0..8Z#.c,.|
-00000140  6d 6b 07 d0 41 38 4f 4c  87 d3 bd f1 ec ed 29 52  |mk..A8OL......)R|
-00000150  3d c7 74 3d e9 d3 ce 47  1c 24 d5 78 19 c9 5e 01  |=.t=...G.$.x..^.|
-00000160  66 a0 f1 8f ea a6 c1 e4  b4 e0 c2 2e d7 d6 64 36  |f.............d6|
-00000170  c9 bc d1 27 33 6f 26 a8  c6 aa 0d bc ae f9 2e bc  |...'3o&.........|
-00000180  f1 a7 82 42 09 83 62 88  c0 9f 20 95 a9 38 50 b4  |...B..b... ..8P.|
-00000190  55 d6 e9 f4 c6 a1 e6 67  a9 5f e4 15 97 44 13 ef  |U......g._...D..|
-000001a0  d3 50 8b 61 38 5e 89 75  b1 cf 6a 6f 0c c5 26 13  |.P.a8^.u..jo..&.|
-000001b0  2c 5a 26 c9 81 98 88 cd  ec 8c 2c 99 a0 ff 55 8f  |,Z&.......,...U.|
-000001c0  3f 9b c3 3b 52 d0 a3 3a  f9 b8 f0 17 81 53 00 f3  |?..;R..:.....S..|
-000001d0  ef 72 b3 4e b9 65 28 8f  a2 48 dc dd 6b 16 61 c3  |.r.N.e(..H..k.a.|
-000001e0  4e 0e c0 1c ac 8c 40 28  27 63 66 c7 74 40 8d 93  |N.....@('cf.t@..|
-000001f0  71 e9 f6 3f d8 8d 5d c6  28 11 4f ac 55 6f 80 1b  |q..?..].(.O.Uo..|
-00000200  2e 84 05 94 e0 4f e7 63  62 65 c7 52 99 49 2f 5d  |.....O.cbe.R.I/]|
-00000210  b4 99 d3 c3 fa b9 f5 83  aa 28 2e 9d ce af 72 7f  |.........(....r.|
-00000220  57 ea 81 f3 bf b5 d7 93  3a 1f a0 83 4d 8a 91 85  |W.......:...M...|
-00000230  fe b7 a1 b3 cb 1d b1 85  9b bb 36 1b 12 9f ed 13  |..........6.....|
-00000240  09 55 31 bd ee 61 06 57  b4 07 4d c6 1e fa b9 7f  |.U1..a.W..M.....|
-00000250  c7 b6 60 70 92 b7 9a ff  80 7d da 7f 2a 62 89 be  |..`p.....}..*b..|
-00000260  79 43 d3 ae 9c f1 00 6d  68 6c a3 f6 48 6e e0 48  |yC.....mhl..Hn.H|
-00000270  97 0f 5c 44 43 9f a8 88  27 96 fc 53 a0 e1 f2 7a  |..\DC...'..S...z|
-00000280  a6 a7 d9 96 2e 3d c4 e0  d9 18 79 ec 83 c2 9b da  |.....=....y.....|
-00000290  0b d4 8b 87 c5 98 f5 8b  e7 e3 d1 bd 2b 2b 42 e2  |............++B.|
-000002a0  4b 3e 64 88 4b 72 d0 35  cc c3 e6 68 c6 f6 4f 23  |K>d.Kr.5...h..O#|
-000002b0  39 a7 94 8d f3 e6 bd cd  d5 e9 8c 53 83 a7 87 09  |9..........S....|
-000002c0  15 fe ea eb 2e 56 da 6b  d9 5b b7 b1 c5 c4 ba 65  |.....V.k.[.....e|
-000002d0  39 89 16 f5 f6 4e e6 3a  63 34 1b 5d f5 fa 6b 8d  |9....N.:c4.]..k.|
-000002e0  c3 49 07 88 12 ca 18 c5  50 da 74 44 c0 c0 33 bd  |.I......P.tD..3.|
-000002f0  2e 45 94 af e1 40 90 00  11 2d 08 7b fc e4 3b f0  |.E...@...-.{..;.|
-00000300  94 fd 5a 0c 3a f9 76 df  3b 5e a3 0d 0f e7 2d df  |..Z.:.v.;^....-.|
-00000310  fd e9 ce 45 5a 13 36 a6  18 ae 46 30 00 fc d5 e3  |...EZ.6...F0....|
-00000320  17 03 03 00 99 0e 35 b6  91 ad cd a6 62 6e 79 12  |......5.....bny.|
-00000330  53 d5 f0 78 72 c5 dd 94  00 e3 75 2c 11 a3 72 f6  |S..xr.....u,..r.|
-00000340  b7 b3 5e d9 51 79 d5 a9  1e 21 2f df 0d 53 9a c8  |..^.Qy...!/..S..|
-00000350  43 a9 58 e2 a9 3d 9a b4  b4 72 bb 62 65 4b 83 f8  |C.X..=...r.beK..|
-00000360  cd 1b 58 e0 69 d9 87 3b  8d 05 42 e1 22 23 e9 5b  |..X.i..;..B."#.[|
-00000370  3a 5a 38 17 17 fb 3a 56  de fc 56 f8 77 12 31 4a  |:Z8...:V..V.w.1J|
-00000380  c5 38 ec 69 72 54 e5 63  2a a0 1e b4 7d 86 43 29  |.8.irT.c*...}.C)|
-00000390  21 ba 56 c2 d9 1b 9f a4  c1 02 f3 83 c1 9a 56 69  |!.V...........Vi|
-000003a0  5c 9e 5f ae 94 9d 6f 03  ec 75 7a 19 98 cd a9 dd  |\._...o..uz.....|
-000003b0  4a 01 41 72 2e 60 9f ca  4c d2 27 d9 0f 4f 17 03  |J.Ar.`..L.'..O..|
-000003c0  03 00 35 5d 61 3c 07 70  2f 35 ba d0 93 44 16 bd  |..5]a<.p/5...D..|
-000003d0  73 4b a0 fb 05 52 6a cc  5a 2e f2 94 d6 77 98 03  |sK...Rj.Z....w..|
-000003e0  c3 2e 8e a9 d1 38 14 d2  cd e6 e3 b6 ad ec d6 a0  |.....8..........|
-000003f0  cf b0 58 5f 8f d3 43 4b                           |..X_..CK|
+00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 a6  |..+.....3.$... .|
+00000060  5a 75 77 6c 3a 65 d9 7d  c4 72 ef 66 3e 15 80 e4  |Zuwl:e.}.r.f>...|
+00000070  b6 c5 55 2e fb cf 3a 17  9e 28 de de b1 ce 06 14  |..U...:..(......|
+00000080  03 03 00 01 01 17 03 03  00 24 45 28 86 50 9e 48  |.........$E(.P.H|
+00000090  66 13 75 a6 43 19 b2 ce  79 2b 5c 06 d0 f7 ff 4c  |f.u.C...y+\....L|
+000000a0  d5 bb 39 67 50 aa 78 97  1b 5a 58 a7 95 44 17 03  |..9gP.x..ZX..D..|
+000000b0  03 02 6d 10 9e 3c f4 7e  c6 2d e4 2a 04 10 95 dd  |..m..<.~.-.*....|
+000000c0  47 56 02 08 91 5e 60 c5  5c eb a1 65 f0 9d a6 2a  |GV...^`.\..e...*|
+000000d0  55 bc fe 58 1a b0 3e f9  d6 f0 1c 7c 70 c5 bf 14  |U..X..>....|p...|
+000000e0  3c c7 bf a4 ac f8 c5 77  1c 7b f2 bb 15 01 f8 c6  |<......w.{......|
+000000f0  2c 19 dd 22 29 3b 32 09  33 b7 c5 be 2e 9b 43 7c  |,..");2.3.....C||
+00000100  1f b7 a2 99 09 e6 42 c3  13 b0 10 2b 15 e8 8a 89  |......B....+....|
+00000110  62 ac 27 b1 09 cc e3 78  67 07 8e c9 21 d4 17 df  |b.'....xg...!...|
+00000120  dc db 30 9b 8e a4 6f 8e  fb 1b 5a d9 22 b0 5d 9b  |..0...o...Z.".].|
+00000130  f1 d0 c7 d6 5e 64 00 23  36 96 8e 22 39 ab 52 3a  |....^d.#6.."9.R:|
+00000140  10 02 c3 6b 02 c7 87 8f  cd 45 40 18 26 41 ca 06  |...k.....E@.&A..|
+00000150  36 09 59 fc 0c d8 fc fe  35 b6 fb 9e 2a e3 db 29  |6.Y.....5...*..)|
+00000160  dc 1b 89 08 f2 e5 06 a1  2a 62 cb 89 39 be 30 47  |........*b..9.0G|
+00000170  81 5d 12 5d e5 f2 38 ae  f9 6a 0a bc b6 7d 1a fc  |.].]..8..j...}..|
+00000180  62 24 1f ab 25 1a 81 4e  29 c1 32 89 9e 75 3d e9  |b$..%..N).2..u=.|
+00000190  aa a7 ab 15 0f eb f6 e6  a4 1c c2 c6 48 8b 88 a9  |............H...|
+000001a0  24 34 92 49 f9 85 4e 2c  b5 eb 69 d7 55 db e5 b6  |$4.I..N,..i.U...|
+000001b0  ec 09 5d 08 b0 d3 8f 0c  01 47 46 3f f8 ae eb ef  |..]......GF?....|
+000001c0  72 37 2e 48 03 5a 03 ed  1c 5e 6e be 59 f1 16 98  |r7.H.Z...^n.Y...|
+000001d0  f9 0e 3e 04 6d 9f 53 72  29 62 5b b3 f1 b9 1a 72  |..>.m.Sr)b[....r|
+000001e0  61 06 ad 97 e1 e1 31 d4  ae a0 92 02 27 94 66 ca  |a.....1.....'.f.|
+000001f0  21 37 dd 2e a4 b4 4b 8f  7d 47 1c 3c 3d 14 ca 92  |!7....K.}G.<=...|
+00000200  e3 fc 9f 73 4f 17 3e 2a  62 9b 45 bd 5d 6b d2 90  |...sO.>*b.E.]k..|
+00000210  b4 77 5b 61 81 52 10 b6  d4 0e 48 f4 d1 b4 a5 eb  |.w[a.R....H.....|
+00000220  4c c2 29 dd e0 74 b0 2b  d0 28 09 65 bc f2 f4 12  |L.)..t.+.(.e....|
+00000230  6d 25 c7 7d 84 39 4a 2a  36 4e 4c 94 bb 02 66 2e  |m%.}.9J*6NL...f.|
+00000240  58 17 0c 3d 1f aa 6b 25  92 d5 a3 39 9c 50 28 43  |X..=..k%...9.P(C|
+00000250  5c 39 17 34 4a 59 f9 6c  65 a3 4d 35 74 65 11 04  |\9.4JY.le.M5te..|
+00000260  25 99 d1 42 93 70 95 28  6f 59 a0 13 95 2c bb 79  |%..B.p.(oY...,.y|
+00000270  05 dd 8c 82 e1 08 57 6d  c4 8e fc c4 f5 49 17 1f  |......Wm.....I..|
+00000280  94 4c cc ea 6f cd ab a9  33 ed 4b fa 47 02 1a f2  |.L..o...3.K.G...|
+00000290  5b 64 8d 3f e4 65 ea 78  82 78 f0 0d eb 74 c1 cc  |[d.?.e.x.x...t..|
+000002a0  25 f7 d4 7c 74 fc 8d 53  76 f6 fb 31 62 8d d6 83  |%..|t..Sv..1b...|
+000002b0  57 56 43 dc 40 51 94 b0  44 db d2 7f f3 fe 58 ff  |WVC.@Q..D.....X.|
+000002c0  c5 13 22 aa bf 77 ea 16  93 85 b0 89 cf b2 1d 0b  |.."..w..........|
+000002d0  8c 89 9f 4c 68 43 98 53  c0 97 ba aa 82 d0 e5 e4  |...LhC.S........|
+000002e0  ce 8d 16 91 46 c0 ff 38  1f 2d 3d cd 9e 65 c9 7d  |....F..8.-=..e.}|
+000002f0  a2 b6 21 b3 55 9d 2c ff  b5 c7 aa cb 5a 51 ce e6  |..!.U.,.....ZQ..|
+00000300  5c 6f 72 58 fc 8d 49 68  13 b3 a9 14 03 8a 89 ff  |\orX..Ih........|
+00000310  1e 05 91 a3 30 64 3a 10  06 c8 1f b0 b8 b6 4d 95  |....0d:.......M.|
+00000320  17 03 03 00 99 2f cd 21  80 f7 39 77 c5 ed 5f b8  |...../.!..9w.._.|
+00000330  75 fb bd 82 f1 84 09 d3  bc 2f 21 f6 d3 a2 4b b1  |u......../!...K.|
+00000340  e4 67 59 7d db 64 47 20  19 9b 9d 68 33 4a 9d e1  |.gY}.dG ...h3J..|
+00000350  c5 ec cc ab 66 25 a2 1b  89 6c a6 03 b6 20 3d c6  |....f%...l... =.|
+00000360  03 fd 12 80 70 b9 e5 2e  27 c8 25 d2 00 00 4e e9  |....p...'.%...N.|
+00000370  1a 65 4a 52 31 a0 3f e6  7c fc 77 48 83 76 11 34  |.eJR1.?.|.wH.v.4|
+00000380  c1 71 36 0d 56 13 7f a2  3c 4a ac 5c 73 82 b1 f5  |.q6.V...<J.\s...|
+00000390  a9 ab 84 ec ac 79 de ea  ae 46 a0 41 53 33 e9 be  |.....y...F.AS3..|
+000003a0  09 7f d5 f6 a4 93 6c 93  0f 98 c6 49 26 68 f9 6a  |......l....I&h.j|
+000003b0  66 d7 04 15 ae e0 5e f6  2e 78 cf e3 a5 d2 17 03  |f.....^..x......|
+000003c0  03 00 35 35 ac 0b 2c c1  a1 90 3a 67 58 a8 3c 6c  |..55..,...:gX.<l|
+000003d0  9c af e9 f5 e7 c2 e3 cd  fd 56 a9 de 8f 33 c5 97  |.........V...3..|
+000003e0  a5 06 70 53 3b fb 3d 17  5a 05 f4 2b 72 b1 6b c5  |..pS;.=.Z..+r.k.|
+000003f0  92 25 8a c2 2d 18 20 5c                           |.%..-. \|
 >>> Flow 3 (client to server)
-00000000  14 03 03 00 01 01 17 03  03 00 35 3d 0a fd 33 39  |..........5=..39|
-00000010  b6 94 43 53 ae ee 3f 4e  c6 2d a2 3a f0 ef 94 7d  |..CS..?N.-.:...}|
-00000020  32 0a b6 90 cd a1 6f 29  88 ff 3c 91 c1 e5 e5 ae  |2.....o)..<.....|
-00000030  b7 a0 0b b3 c0 e6 37 9d  06 8b d8 ae 06 c0 0e 7b  |......7........{|
-00000040  17 03 03 00 17 c2 a1 82  db df fa 54 28 79 a0 0c  |...........T(y..|
-00000050  97 8c 82 ee 22 c9 b9 35  32 7a 21 4b 17 03 03 00  |...."..52z!K....|
-00000060  13 87 2b f8 38 81 df fa  e5 2e ff e2 d2 51 3e bc  |..+.8........Q>.|
-00000070  dd d3 e8 62                                       |...b|
+00000000  14 03 03 00 01 01 17 03  03 00 35 fc ac 12 d4 36  |..........5....6|
+00000010  13 c6 fe 02 f8 ea 05 0b  5c cb 31 d4 8d ee ba 6f  |........\.1....o|
+00000020  36 ac aa 89 b9 10 f3 b3  a1 89 03 0e d2 5a 92 c7  |6............Z..|
+00000030  62 4c 56 0c 42 69 68 a5  d7 79 cc b5 24 25 7b 80  |bLV.Bih..y..$%{.|
+00000040  17 03 03 00 17 a3 f6 4f  1d 36 bb 5f 0b 59 12 ef  |.......O.6._.Y..|
+00000050  72 d4 c6 1d c8 82 94 1d  f2 9c 46 d5 17 03 03 00  |r.........F.....|
+00000060  13 3c 66 6b 59 a1 b2 e9  47 e8 06 fe 15 3f 0c 39  |.<fkY...G....?.9|
+00000070  ab f9 20 57                                       |.. W|
diff --git a/src/crypto/tls/testdata/Client-TLSv13-CHACHA20-SHA256 b/src/crypto/tls/testdata/Client-TLSv13-CHACHA20-SHA256
index 69749f0..e029f00 100644
--- a/src/crypto/tls/testdata/Client-TLSv13-CHACHA20-SHA256
+++ b/src/crypto/tls/testdata/Client-TLSv13-CHACHA20-SHA256
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fe 01 00 00  fa 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 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,84 +7,85 @@
 00000050  cc a8 c0 2b c0 2f c0 2c  c0 30 c0 09 c0 13 c0 0a  |...+./.,.0......|
 00000060  c0 14 00 9c 00 9d 00 2f  00 35 c0 12 00 0a c0 23  |......./.5.....#|
 00000070  c0 27 00 3c c0 07 c0 11  00 05 13 03 13 01 13 02  |.'.<............|
-00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
+00000080  01 00 00 7f 00 05 00 05  01 00 00 00 00 00 0a 00  |................|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
 000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
 000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
-000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
-000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
-000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
-000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
+000000c0  01 00 01 00 00 17 00 00  00 12 00 00 00 2b 00 09  |.............+..|
+000000d0  08 03 04 03 03 03 02 03  01 00 33 00 26 00 24 00  |..........3.&.$.|
+000000e0  1d 00 20 2f e5 7d a3 47  cd 62 43 15 28 da ac 5f  |.. /.}.G.bC.(.._|
+000000f0  bb 29 07 30 ff f6 84 af  c4 cf c2 ed 90 99 5f 58  |.).0.........._X|
+00000100  cb 3b 74                                          |.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 7a 02 00 00  76 03 03 39 b2 74 80 d8  |....z...v..9.t..|
-00000010  49 72 79 63 9b 7b da d7  cf b4 29 20 f8 80 ed d9  |Iryc.{....) ....|
-00000020  66 09 65 22 b6 27 16 c5  a7 6f 8b 20 00 00 00 00  |f.e".'...o. ....|
+00000000  16 03 03 00 7a 02 00 00  76 03 03 ce bd 20 50 3d  |....z...v.... P=|
+00000010  7e 80 5d e3 c4 d1 f4 d7  9b 28 0d ad c7 2c c9 b0  |~.]......(...,..|
+00000020  bb 25 e4 98 56 77 9a dd  7c 2e e7 20 00 00 00 00  |.%..Vw..|.. ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000040  00 00 00 00 00 00 00 00  00 00 00 00 13 03 00 00  |................|
-00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 42  |..+.....3.$... B|
-00000060  80 fb 4a d3 49 53 a5 9f  f6 da ca 64 f8 5d 2c f5  |..J.IS.....d.],.|
-00000070  45 4d f1 a5 ec c3 c6 fc  d2 ff 56 b1 63 53 1a 14  |EM........V.cS..|
-00000080  03 03 00 01 01 17 03 03  00 17 f8 d8 e1 1a e0 c8  |................|
-00000090  75 f9 40 90 da 16 a0 41  4f 8c 23 e7 47 43 89 cf  |u.@....AO.#.GC..|
-000000a0  d4 17 03 03 02 6d d6 23  1d c6 c0 d4 5e a3 fe 2b  |.....m.#....^..+|
-000000b0  03 04 6c 88 d1 4a ac 9b  dd 90 e5 18 c5 35 9c 4a  |..l..J.......5.J|
-000000c0  f3 c4 64 e2 c2 40 62 fb  68 b3 22 37 9f f4 eb ae  |..d..@b.h."7....|
-000000d0  45 d9 a8 be f4 1e 89 16  88 b5 10 e3 5c 2e 42 15  |E...........\.B.|
-000000e0  34 24 f3 bd dd 73 6d 6b  d1 db 3e 69 b0 0a 54 e6  |4$...smk..>i..T.|
-000000f0  b7 2c b7 80 86 93 91 d5  26 02 77 bf 10 38 ee 40  |.,......&.w..8.@|
-00000100  22 4d 3f 67 02 6b f8 1c  4a ad 2b c7 f6 19 d4 36  |"M?g.k..J.+....6|
-00000110  9b ff c4 08 73 e1 48 0a  a6 e8 80 3b 88 8a c2 e8  |....s.H....;....|
-00000120  c6 4a ae da a1 4f 3b 9e  fb 80 3b 78 ca 80 42 00  |.J...O;...;x..B.|
-00000130  a4 5c 9d a0 6c 63 a7 66  e6 26 b7 14 d8 8b ba 1a  |.\..lc.f.&......|
-00000140  4b 13 81 3c e4 76 4e ac  6c 2f b4 71 e9 dc c4 c8  |K..<.vN.l/.q....|
-00000150  ef f0 61 22 f4 6b 83 ae  d8 d0 a7 c6 d9 ea 95 85  |..a".k..........|
-00000160  77 90 0f 22 a0 50 cb ff  50 a5 98 ee de e4 89 f3  |w..".P..P.......|
-00000170  20 f2 63 a2 45 3a 48 33  d5 b9 ff 5e f8 7d c5 2d  | .c.E:H3...^.}.-|
-00000180  b9 9c b2 65 bf d5 13 36  46 a5 96 9f f4 de 7c 1c  |...e...6F.....|.|
-00000190  78 3f 1a 0a 62 14 13 8e  55 7e cd 47 87 1b 7e a8  |x?..b...U~.G..~.|
-000001a0  7f 03 ec 1c d3 72 eb e5  94 d9 9d 95 d6 f5 ad 2c  |.....r.........,|
-000001b0  e9 7d 0f 2c ea 7b 1e 8e  d7 b4 f1 5d 12 be d7 cf  |.}.,.{.....]....|
-000001c0  b7 43 89 65 e9 04 0e f8  b4 b4 4d 9c 9c 42 3c 50  |.C.e......M..B<P|
-000001d0  a7 91 d0 7f c0 de fb 99  08 ce 5c fd 67 3a cb 1a  |..........\.g:..|
-000001e0  d3 1a 4c a2 2e 7d 73 01  2b 5f bb a2 86 7d 0e e0  |..L..}s.+_...}..|
-000001f0  a1 c9 06 c0 4a 0a f6 c6  c4 b5 53 51 3e 2f f4 60  |....J.....SQ>/.`|
-00000200  1d 41 55 9d c4 88 f3 76  4f 92 b5 03 98 23 6b c4  |.AU....vO....#k.|
-00000210  c3 62 bd 12 dd 3a bc 37  d0 18 64 c6 e1 2c cb 62  |.b...:.7..d..,.b|
-00000220  f6 d3 24 35 47 e7 cf 15  d3 53 9d ac 3f 97 48 c1  |..$5G....S..?.H.|
-00000230  b8 d3 a3 2c 9f cd 2b 72  bc bd a6 8a b1 54 48 7b  |...,..+r.....TH{|
-00000240  e0 b7 a2 2e 46 04 cc e5  29 1d 73 c7 67 f8 f0 d8  |....F...).s.g...|
-00000250  e0 88 f0 7b 11 ff e1 1d  95 6c 85 c4 08 72 3e 94  |...{.....l...r>.|
-00000260  92 4b 8a 58 62 04 10 83  7c 5e 65 20 a7 5d 6d 16  |.K.Xb...|^e .]m.|
-00000270  30 64 fc aa 7f 8f 06 ed  4e 3c 86 c8 10 92 fb 0d  |0d......N<......|
-00000280  7b 81 10 07 cf 30 7f 6b  11 63 60 2a 61 92 cb 74  |{....0.k.c`*a..t|
-00000290  82 a4 04 cf 23 43 21 55  45 2a 29 93 42 0f 0c f6  |....#C!UE*).B...|
-000002a0  9b 14 b5 96 09 25 1b bc  b0 7b 72 e2 6f b8 55 74  |.....%...{r.o.Ut|
-000002b0  00 bb 1c 7c b1 9b 58 63  97 bb 6d c5 fb a4 da 24  |...|..Xc..m....$|
-000002c0  1e b2 97 18 75 ab 8b a2  77 50 38 4d f8 a0 39 58  |....u...wP8M..9X|
-000002d0  8c 2d 3e ba 27 03 e9 51  87 0a 95 e0 08 40 5d e6  |.->.'..Q.....@].|
-000002e0  6a dd 10 1d 6d 8c 32 88  a8 32 ee dd 44 9c 9b b0  |j...m.2..2..D...|
-000002f0  6f f5 4b 08 60 9d 83 1e  ab 83 c0 92 10 c7 aa 90  |o.K.`...........|
-00000300  d2 b2 61 5e 12 b5 e8 ea  a7 68 59 17 a4 f4 15 f7  |..a^.....hY.....|
-00000310  dc 10 81 17 03 03 00 99  8a 61 79 8f 33 51 7b a9  |.........ay.3Q{.|
-00000320  ce 3f 82 2b bb da 40 2e  73 c8 d9 6e 7d 72 ba 94  |.?.+..@.s..n}r..|
-00000330  7d ad fb b7 ba 9c 74 00  0b c9 1d b6 8d 54 b9 48  |}.....t......T.H|
-00000340  eb 49 78 c3 1a 75 b8 16  22 5d 50 f5 4a 81 59 d3  |.Ix..u.."]P.J.Y.|
-00000350  38 79 38 c1 35 11 55 69  6b d2 86 3c 0f 12 26 57  |8y8.5.Uik..<..&W|
-00000360  f5 84 d7 dd 74 61 6f b8  08 66 e9 3c f7 43 29 a5  |....tao..f.<.C).|
-00000370  94 9e ab af 68 04 c1 6a  ae 9d 12 2d 57 e9 ff 30  |....h..j...-W..0|
-00000380  7d 80 35 65 cc df c8 65  0b a1 f9 6d 6b a5 0b df  |}.5e...e...mk...|
-00000390  0c 1a 04 0a 00 8f ac 2b  29 60 92 4e 91 d3 42 25  |.......+)`.N..B%|
-000003a0  b4 a5 0a 1a 5f 83 ec 9a  f0 0a 2c 6d 65 00 24 d3  |...._.....,me.$.|
-000003b0  e1 17 03 03 00 35 e4 72  aa 9e 6c a8 93 7b e4 49  |.....5.r..l..{.I|
-000003c0  1e 23 7c 50 18 59 00 08  3b f1 c1 5f 20 ba 51 56  |.#|P.Y..;.._ .QV|
-000003d0  fe bb 93 99 52 e6 5e 6d  26 cc 60 11 c2 a1 c8 18  |....R.^m&.`.....|
-000003e0  2e 72 bd ee 36 ca 41 25  73 f2 30                 |.r..6.A%s.0|
+00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 75  |..+.....3.$... u|
+00000060  35 5d ce ae 93 0b e6 2c  c7 aa 67 6d 9d bd b2 8d  |5].....,..gm....|
+00000070  83 ac 17 7c 21 21 b2 c1  dc a1 4d 54 72 66 05 14  |...|!!....MTrf..|
+00000080  03 03 00 01 01 17 03 03  00 17 88 68 f2 3c 98 b5  |...........h.<..|
+00000090  ef 6e 2b ba aa d3 d4 0c  28 aa 3a 6f 51 a7 dc 89  |.n+.....(.:oQ...|
+000000a0  fb 17 03 03 02 6d ae f6  44 17 0d 3b ee 41 5b a9  |.....m..D..;.A[.|
+000000b0  d2 63 7c 98 25 e7 ca 46  29 05 9e 75 9f 71 58 99  |.c|.%..F)..u.qX.|
+000000c0  57 a3 c3 88 08 54 88 ea  8f ea ca 87 88 c0 53 d7  |W....T........S.|
+000000d0  de b6 3d 14 98 64 1a 6b  8f 90 e7 6a 10 e2 4b 42  |..=..d.k...j..KB|
+000000e0  13 59 f0 bc a0 74 3b 5b  a8 15 74 3a 30 9f 28 ed  |.Y...t;[..t:0.(.|
+000000f0  b2 a0 48 15 5a 3b 0c 61  26 4e 3f 5a 33 3d d9 88  |..H.Z;.a&N?Z3=..|
+00000100  97 9f fe 2a d5 df f7 01  40 84 75 90 89 7d 34 23  |...*....@.u..}4#|
+00000110  3e 70 85 82 94 b7 21 94  e6 0c d1 f1 88 06 ff 34  |>p....!........4|
+00000120  64 2f e5 e6 80 10 2b 0c  fe 18 f5 2c cc b0 27 37  |d/....+....,..'7|
+00000130  2b 5a 4b 43 e8 b7 ad 97  a0 8c d1 49 bb f9 4a 65  |+ZKC.......I..Je|
+00000140  99 bf cd 7f 77 ef 0f b6  d7 91 ce 4d 53 79 d0 5e  |....w......MSy.^|
+00000150  b7 51 5e 8d 0f 13 85 53  7d 81 27 b2 e1 5a e0 d0  |.Q^....S}.'..Z..|
+00000160  d9 b0 3b c6 30 15 ac 3e  60 7f 01 90 da b1 c5 8c  |..;.0..>`.......|
+00000170  06 7c 8f 31 86 7e 53 5b  1a 4b 8f d0 ff 2c f9 9e  |.|.1.~S[.K...,..|
+00000180  c4 08 02 12 e4 97 af 3f  07 d0 25 0d 50 90 21 1f  |.......?..%.P.!.|
+00000190  fa 8d ea 02 16 a4 56 2e  2b e1 3f c2 e2 f5 53 d0  |......V.+.?...S.|
+000001a0  6e a2 d4 b9 b6 ae 69 12  74 d4 2f 8f 55 1e 5f b8  |n.....i.t./.U._.|
+000001b0  1f b6 29 ee 11 21 81 9f  37 6e 40 b1 27 22 15 7b  |..)..!..7n@.'".{|
+000001c0  ba bb bd ee 7a 7e 1f e4  7e 63 a1 60 53 a1 c7 0f  |....z~..~c.`S...|
+000001d0  f8 2e c3 07 cd 60 ec 83  0f 18 55 50 5c 11 ec 93  |.....`....UP\...|
+000001e0  85 dd 38 5c 7e 4a 0a af  4b c9 22 8d 43 ce 76 62  |..8\~J..K.".C.vb|
+000001f0  d7 73 3f ef 67 2d 6a 02  bd b5 8f c4 8b 64 b1 a3  |.s?.g-j......d..|
+00000200  c4 40 c1 ea 7e 57 b9 25  45 61 96 97 69 69 9f 2b  |.@..~W.%Ea..ii.+|
+00000210  a7 56 b5 8b 80 25 3e 3c  73 14 b2 21 10 ee 47 cd  |.V...%><s..!..G.|
+00000220  5f 6f 6f fa 71 bf 88 47  39 21 05 b9 e3 0b f2 ad  |_oo.q..G9!......|
+00000230  68 52 8a fe 9d 90 60 49  bb ea 73 02 a6 2d 55 93  |hR....`I..s..-U.|
+00000240  d5 cd e1 f6 2b 40 8c 9a  22 e8 65 3f fb 5e 8e 88  |....+@..".e?.^..|
+00000250  d2 38 10 00 c6 25 26 77  78 a9 f9 fe 27 29 c7 5a  |.8...%&wx...').Z|
+00000260  e1 24 97 a7 6b ea 3f 57  4f 1c b9 cf 0a 75 3b c7  |.$..k.?WO....u;.|
+00000270  81 df 4b 9c 37 80 15 01  22 a0 ac f7 a8 cc 72 f7  |..K.7...".....r.|
+00000280  63 df 49 31 8d 70 1c a6  c5 3c c5 4e 22 cf b7 b3  |c.I1.p...<.N"...|
+00000290  a5 27 ce 9f d5 34 1b d7  de 67 a9 af b2 d9 04 0c  |.'...4...g......|
+000002a0  f6 bd 33 b8 91 c8 66 02  90 a8 82 76 9e 4b 86 7f  |..3...f....v.K..|
+000002b0  d9 8a d1 ea fc 2a 9a 8e  2b 61 10 c9 5e 62 86 78  |.....*..+a..^b.x|
+000002c0  df 7d 09 14 0b ec ac 76  dc 62 7f 00 a3 16 9b 30  |.}.....v.b.....0|
+000002d0  f7 17 92 79 c1 03 af cd  ef 4d 09 c3 a1 13 cd 83  |...y.....M......|
+000002e0  05 47 9b 61 80 54 56 de  b9 9c 78 43 e9 70 af db  |.G.a.TV...xC.p..|
+000002f0  bb f6 4f 17 6b c4 61 57  5f 57 91 3e e7 f4 dc 0c  |..O.k.aW_W.>....|
+00000300  e2 01 51 80 b3 de cb ac  67 41 cb e9 92 4b ba 18  |..Q.....gA...K..|
+00000310  c5 58 f4 17 03 03 00 99  9c bf 47 cb 60 c1 51 50  |.X........G.`.QP|
+00000320  73 87 10 02 5b e7 b4 f5  4f 60 65 de 44 ae 5c 15  |s...[...O`e.D.\.|
+00000330  0e df 8b fa 47 0f 51 0a  a1 05 70 a6 8f a0 2a 27  |....G.Q...p...*'|
+00000340  84 e9 a1 38 43 3d 2a e5  10 45 22 01 0a b2 8e 6d  |...8C=*..E"....m|
+00000350  27 53 b9 ea b5 5d 6d a7  50 69 c2 4c 50 cf 3d d9  |'S...]m.Pi.LP.=.|
+00000360  47 82 62 4b 0b 42 6a 3f  e5 4f a8 04 9b 7d f2 26  |G.bK.Bj?.O...}.&|
+00000370  15 ce 88 74 40 59 87 2b  11 a5 ac 9a e5 3f 03 db  |...t@Y.+.....?..|
+00000380  33 cb 27 be d9 2a 69 1d  1e 68 6b 0e 54 0a f4 1c  |3.'..*i..hk.T...|
+00000390  63 b3 bb 55 63 e7 b6 b7  0e 2c ad 9e b5 1d 51 b4  |c..Uc....,....Q.|
+000003a0  41 77 4b 80 17 47 c9 8f  9e 02 cd 87 2e 20 72 e4  |AwK..G....... r.|
+000003b0  44 17 03 03 00 35 0e 4f  8b e7 ae ca 38 35 85 d8  |D....5.O....85..|
+000003c0  fb 23 c3 39 d4 80 25 15  d3 39 4e 19 34 93 21 13  |.#.9..%..9N.4.!.|
+000003d0  a2 84 2c 0f 3e 5e c3 62  95 41 c7 4d a7 81 2d 60  |..,.>^.b.A.M..-`|
+000003e0  99 56 db d5 0e 2e 42 b3  16 72 22                 |.V....B..r"|
 >>> Flow 3 (client to server)
-00000000  14 03 03 00 01 01 17 03  03 00 35 b6 c3 b9 b1 52  |..........5....R|
-00000010  88 d2 78 2b ec 1c 63 e8  d5 08 0e 4e d6 51 b9 02  |..x+..c....N.Q..|
-00000020  ba cc a8 ca b6 da 45 a9  7c 1a 18 39 47 84 db 34  |......E.|..9G..4|
-00000030  d6 05 6f e5 16 19 57 6f  65 0b 7a e7 37 b5 d3 28  |..o...Woe.z.7..(|
-00000040  17 03 03 00 17 dc b8 e2  1c aa b8 f5 cb b6 fd ba  |................|
-00000050  29 34 73 bb c6 e0 3a fc  3e fb d3 01 17 03 03 00  |)4s...:.>.......|
-00000060  13 eb 66 ab 47 38 1b 01  96 6c 59 46 c2 ad bf 2d  |..f.G8...lYF...-|
-00000070  36 22 97 19                                       |6"..|
+00000000  14 03 03 00 01 01 17 03  03 00 35 db e3 68 0f 7c  |..........5..h.||
+00000010  36 8e c4 5b 10 11 89 61  b7 f1 a9 f3 43 a5 28 e6  |6..[...a....C.(.|
+00000020  86 8c f0 c3 3b 54 5b 86  3c b6 42 6e 3d 56 93 0a  |....;T[.<.Bn=V..|
+00000030  2c ca 2e 39 27 1c 12 e2  d7 e7 b5 57 a6 29 5c 4a  |,..9'......W.)\J|
+00000040  17 03 03 00 17 02 0d 23  ca 06 5e 1c 0f a8 a2 39  |.......#..^....9|
+00000050  32 00 01 b5 ba e7 52 82  fa 2c e3 27 17 03 03 00  |2.....R..,.'....|
+00000060  13 ea 39 b7 18 2d 01 1a  c3 9c b5 51 cc d2 f3 40  |..9..-.....Q...@|
+00000070  55 69 87 65                                       |Ui.e|
diff --git a/src/crypto/tls/testdata/Client-TLSv13-ClientCert-ECDSA-RSA b/src/crypto/tls/testdata/Client-TLSv13-ClientCert-ECDSA-RSA
index bd8f6cd..8e87aa5 100644
--- a/src/crypto/tls/testdata/Client-TLSv13-ClientCert-ECDSA-RSA
+++ b/src/crypto/tls/testdata/Client-TLSv13-ClientCert-ECDSA-RSA
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fe 01 00 00  fa 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 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,133 +7,134 @@
 00000050  cc a8 c0 2b c0 2f c0 2c  c0 30 c0 09 c0 13 c0 0a  |...+./.,.0......|
 00000060  c0 14 00 9c 00 9d 00 2f  00 35 c0 12 00 0a c0 23  |......./.5.....#|
 00000070  c0 27 00 3c c0 07 c0 11  00 05 13 03 13 01 13 02  |.'.<............|
-00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
+00000080  01 00 00 7f 00 05 00 05  01 00 00 00 00 00 0a 00  |................|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
 000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
 000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
-000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
-000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
-000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
-000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
+000000c0  01 00 01 00 00 17 00 00  00 12 00 00 00 2b 00 09  |.............+..|
+000000d0  08 03 04 03 03 03 02 03  01 00 33 00 26 00 24 00  |..........3.&.$.|
+000000e0  1d 00 20 2f e5 7d a3 47  cd 62 43 15 28 da ac 5f  |.. /.}.G.bC.(.._|
+000000f0  bb 29 07 30 ff f6 84 af  c4 cf c2 ed 90 99 5f 58  |.).0.........._X|
+00000100  cb 3b 74                                          |.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 7a 02 00 00  76 03 03 85 46 7d 9f 55  |....z...v...F}.U|
-00000010  82 34 10 06 5e 8d 60 5d  00 9d 28 cd 18 c2 18 ee  |.4..^.`]..(.....|
-00000020  cb 9a 63 ee 9a 30 7d 5d  87 3d 24 20 00 00 00 00  |..c..0}].=$ ....|
+00000000  16 03 03 00 7a 02 00 00  76 03 03 98 a2 b1 a3 c2  |....z...v.......|
+00000010  3a ad 0c cb df b0 4b 9d  37 a9 57 5f f0 c5 3f dd  |:.....K.7.W_..?.|
+00000020  73 c1 e6 7f 1e 45 7d ef  17 e8 61 20 00 00 00 00  |s....E}...a ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000040  00 00 00 00 00 00 00 00  00 00 00 00 13 03 00 00  |................|
-00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 15  |..+.....3.$... .|
-00000060  b8 ae de 9d dc 14 58 fe  01 5d 08 ed 41 ac c6 c7  |......X..]..A...|
-00000070  85 fe b1 a3 ae b6 8c 47  f3 e1 4e c5 f8 8b 48 14  |.......G..N...H.|
-00000080  03 03 00 01 01 17 03 03  00 17 d6 72 35 0b 81 34  |...........r5..4|
-00000090  42 89 f1 9b 31 94 72 af  0c 3c 45 36 96 26 71 e8  |B...1.r..<E6.&q.|
-000000a0  86 17 03 03 00 42 47 ed  30 6f 20 53 07 4f b2 c1  |.....BG.0o S.O..|
-000000b0  35 49 fa 5b d9 af 6c 0b  c3 71 7a f3 a8 5b 24 ba  |5I.[..l..qz..[$.|
-000000c0  59 dd 34 b7 02 07 63 5d  a1 ad ac 4c a2 58 e7 cd  |Y.4...c]...L.X..|
-000000d0  6d f7 23 4e e1 a9 af 75  23 93 37 25 59 7e fb 52  |m.#N...u#.7%Y~.R|
-000000e0  65 a4 e7 ea 0a df a7 ce  17 03 03 02 6d e5 aa db  |e...........m...|
-000000f0  1d 7e 55 0f b4 79 96 de  15 74 52 95 52 c8 ce d6  |.~U..y...tR.R...|
-00000100  85 a9 a8 6f 79 63 cf d7  3a 9e 38 d2 9d 0a 73 a0  |...oyc..:.8...s.|
-00000110  0b c3 f3 85 77 d3 63 16  9b 13 79 e6 61 96 08 57  |....w.c...y.a..W|
-00000120  ba 4a 64 b6 af 1a 98 22  a6 d9 20 82 2c 40 28 57  |.Jd....".. .,@(W|
-00000130  b8 95 d6 b4 94 46 8f 67  2d eb ee 02 74 d3 94 e7  |.....F.g-...t...|
-00000140  6e 5b 2f a9 7d a2 c2 aa  89 0c 43 c3 9d 92 6f 16  |n[/.}.....C...o.|
-00000150  27 84 d7 79 dd 4b 6a ed  9b fc cd d7 c0 c4 59 09  |'..y.Kj.......Y.|
-00000160  21 1f 83 67 e7 76 c8 ee  bf f5 79 87 a0 bd 14 6d  |!..g.v....y....m|
-00000170  db ac 06 04 c4 3b 3a a7  1e cb 22 d1 97 21 9d c2  |.....;:..."..!..|
-00000180  ee ed a8 41 f7 a0 6a a0  64 2f b0 0a 6f b7 78 b8  |...A..j.d/..o.x.|
-00000190  20 36 ed 7a e9 3c 26 cb  36 7d 3c ee 73 27 32 e7  | 6.z.<&.6}<.s'2.|
-000001a0  e7 fd 6e 27 d9 da ad 48  67 29 94 50 f5 0e 56 af  |..n'...Hg).P..V.|
-000001b0  e4 c5 1d d3 59 a4 de 59  d7 79 7a f3 10 36 fb ed  |....Y..Y.yz..6..|
-000001c0  b1 97 00 a4 dd 6e c2 65  19 0a 73 fe 2c 49 dc c5  |.....n.e..s.,I..|
-000001d0  df 19 53 c2 7e de 0b 2b  55 3d ca 0b 39 a4 77 c4  |..S.~..+U=..9.w.|
-000001e0  21 53 93 12 f0 9a 3a 3b  97 0c 93 80 50 23 80 9e  |!S....:;....P#..|
-000001f0  84 2e ef 22 2b c1 b3 dd  b1 55 38 76 9a d6 a6 f1  |..."+....U8v....|
-00000200  67 11 df d9 a0 8a 18 c6  68 ef d8 7b d7 36 4b 57  |g.......h..{.6KW|
-00000210  a7 bf 4e 77 a5 f6 4f 1e  be 6e 14 40 67 73 1c 20  |..Nw..O..n.@gs. |
-00000220  9f 17 30 b6 76 00 87 56  8c 2b 76 5f 04 46 5a a1  |..0.v..V.+v_.FZ.|
-00000230  0f fa 64 b3 fa da 4e 72  eb a7 95 c3 93 de 97 20  |..d...Nr....... |
-00000240  2d ea 06 84 aa f0 b6 5a  ac ea 64 06 2a 8c b0 eb  |-......Z..d.*...|
-00000250  58 0a e8 51 e1 34 c4 03  38 9f f7 fb ec 98 78 07  |X..Q.4..8.....x.|
-00000260  71 73 ad a5 d7 d5 d1 2d  95 b6 4f 7c 5a ee d9 f1  |qs.....-..O|Z...|
-00000270  fa e3 7d ae bd 31 98 27  31 07 f2 86 cf e5 8d 2c  |..}..1.'1......,|
-00000280  e8 55 40 69 b0 26 a3 51  e8 60 59 6f 66 bb 36 4f  |.U@i.&.Q.`Yof.6O|
-00000290  85 fc 36 d1 72 99 9d e1  83 ad ec 3f e8 90 a8 48  |..6.r......?...H|
-000002a0  f5 d1 41 30 59 4e 44 79  e4 de 6f 0d 37 61 01 bb  |..A0YNDy..o.7a..|
-000002b0  b8 7f ee c7 a2 35 c7 12  dc d3 ca 49 8d d9 3e d8  |.....5.....I..>.|
-000002c0  24 69 34 a4 8f 92 f2 77  61 cb b7 04 f8 02 25 9c  |$i4....wa.....%.|
-000002d0  88 ea c7 f0 13 3e 17 bc  ac 5a 80 c4 80 c6 b0 19  |.....>...Z......|
-000002e0  d3 73 b5 94 5a 27 df 08  05 23 6e 03 64 67 ab c8  |.s..Z'...#n.dg..|
-000002f0  63 7c 76 b3 92 39 ef 29  77 28 ec 6f 05 70 a6 2f  |c|v..9.)w(.o.p./|
-00000300  a0 d2 73 fd f9 cc 4f d7  6f 86 db 9a 02 84 8c 6c  |..s...O.o......l|
-00000310  39 3a 54 28 38 43 ca 0d  da 34 b5 d4 03 0c f8 c1  |9:T(8C...4......|
-00000320  8d 48 d0 63 c7 41 da 4c  db 0a 45 56 cf 6b 0b ca  |.H.c.A.L..EV.k..|
-00000330  2f a3 82 6e 8e 90 6f 8a  f2 41 33 c5 56 c5 15 bd  |/..n..o..A3.V...|
-00000340  c2 02 45 41 7a e7 2b 0d  15 82 a7 37 34 ea 19 c2  |..EAz.+....74...|
-00000350  8b 1d d4 17 9c 2d d4 c0  9d f3 17 03 03 00 99 37  |.....-.........7|
-00000360  6a b2 6e 07 32 19 45 80  7b 80 ef 93 b3 6e c3 19  |j.n.2.E.{....n..|
-00000370  4d fe 3e e9 7f e4 b9 37  d2 b0 83 56 f7 2f 9b 61  |M.>....7...V./.a|
-00000380  67 a1 65 b4 38 4b a1 06  c5 4a 20 44 37 26 d0 2a  |g.e.8K...J D7&.*|
-00000390  b7 96 1e 72 ef a8 5d fb  5a b8 ea 26 0e 4b 38 e0  |...r..].Z..&.K8.|
-000003a0  6a 3a ab 4a e3 b4 db 00  f8 30 e6 db 02 e4 cf 89  |j:.J.....0......|
-000003b0  5b 57 b8 b8 3e 0a 97 b4  61 9e 89 7d 76 b3 9f 51  |[W..>...a..}v..Q|
-000003c0  a0 b8 46 95 8b 2b b9 25  8e 39 29 f5 97 41 e6 f1  |..F..+.%.9)..A..|
-000003d0  f0 0c 8b 70 bc 63 a0 56  24 c0 fb 0d 44 7f d8 78  |...p.c.V$...D..x|
-000003e0  c0 d5 a2 b7 53 67 c5 6d  0f 37 25 3e dc 08 e2 50  |....Sg.m.7%>...P|
-000003f0  ca 28 c3 1b ec 28 26 0c  17 03 03 00 35 ef 63 88  |.(...(&.....5.c.|
-00000400  13 79 07 a1 28 af 88 6e  8c e4 ad b3 0a 28 2a ce  |.y..(..n.....(*.|
-00000410  db 0f 63 8a 16 95 ab 0a  01 51 4f 28 79 15 78 00  |..c......QO(y.x.|
-00000420  f9 7a a6 40 1b 39 98 d8  8d df 1b b9 ab 82 b9 59  |.z.@.9.........Y|
-00000430  67 b9                                             |g.|
+00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 9b  |..+.....3.$... .|
+00000060  8a e8 f7 9b f3 9a 73 54  81 4c aa 41 06 e8 fd 21  |......sT.L.A...!|
+00000070  f7 e6 62 2e 7a 1f 29 0e  1c 48 21 dc 82 3b 1b 14  |..b.z.)..H!..;..|
+00000080  03 03 00 01 01 17 03 03  00 17 07 dc 9b 84 a2 d4  |................|
+00000090  b9 80 93 7f 29 3e 7c 97  9e 46 e0 6d 0c 3d 24 4b  |....)>|..F.m.=$K|
+000000a0  1c 17 03 03 00 42 2c 3c  9c 8d 63 93 a7 02 57 8b  |.....B,<..c...W.|
+000000b0  3d e6 d1 f0 05 03 ff 91  77 55 01 6c 65 57 8f 67  |=.......wU.leW.g|
+000000c0  44 f8 c1 8f c5 ee 00 9f  45 66 b0 c5 f0 61 20 b7  |D.......Ef...a .|
+000000d0  4f f0 14 05 1d 47 10 af  f9 11 ed 62 5e 78 12 60  |O....G.....b^x.`|
+000000e0  65 b7 65 33 a9 b3 38 61  17 03 03 02 6d 9e c3 b9  |e.e3..8a....m...|
+000000f0  0e 43 aa bd 17 a2 51 a8  9b a0 62 73 73 58 84 21  |.C....Q...bssX.!|
+00000100  d2 fa 4f ad fe c3 56 b6  7f 93 e9 4d 4b 83 59 0c  |..O...V....MK.Y.|
+00000110  be 47 fd c5 f7 01 b2 03  18 77 9c ae 41 dd 26 44  |.G.......w..A.&D|
+00000120  a2 8a 45 56 6d 61 bc 16  ff 52 d0 1a 48 37 c5 e8  |..EVma...R..H7..|
+00000130  07 71 d1 3d c9 e2 75 3b  6f 16 43 9d a2 56 9c d6  |.q.=..u;o.C..V..|
+00000140  90 d1 d4 fd 23 5e 32 84  bc 97 9e 33 4e cd 54 b6  |....#^2....3N.T.|
+00000150  66 5c 52 be b0 b7 10 70  5c 3a 61 ec 4a e2 d4 43  |f\R....p\:a.J..C|
+00000160  b0 87 8a 48 bd f5 81 cb  ee 5a 72 de 26 13 49 31  |...H.....Zr.&.I1|
+00000170  e7 02 53 54 b3 fc 86 b4  70 25 a6 f8 83 24 31 f3  |..ST....p%...$1.|
+00000180  22 dd b1 ca 96 7e f3 9e  dc 3b ce 7c 1f 7e 44 37  |"....~...;.|.~D7|
+00000190  ba be 42 e3 14 29 14 8f  ad 79 e6 d7 64 a9 11 ac  |..B..)...y..d...|
+000001a0  78 f5 fc 3c af e7 0a 55  26 07 a1 7e 81 1f 16 b5  |x..<...U&..~....|
+000001b0  ad 4b cf 46 cf 7a ba d3  3b 2d 97 55 31 bb 20 68  |.K.F.z..;-.U1. h|
+000001c0  c6 f6 19 99 af 98 25 cd  6e 76 39 03 32 14 08 fd  |......%.nv9.2...|
+000001d0  77 43 7d d0 f4 d4 8b 58  42 d6 6c 45 a5 b6 af 04  |wC}....XB.lE....|
+000001e0  14 28 47 9f 45 bb af e8  8d e0 d6 54 55 e5 d2 ae  |.(G.E......TU...|
+000001f0  84 a1 0c 0b 42 5f 9a 9c  93 fb b9 cd e6 43 5f a3  |....B_.......C_.|
+00000200  cc 6a 6a da 85 7d c1 37  af 04 1a 8b e7 4a 40 82  |.jj..}.7.....J@.|
+00000210  82 88 0f dc 78 51 74 f7  2c c8 e0 01 eb f7 f9 ca  |....xQt.,.......|
+00000220  28 0a 79 c9 f9 fb 35 c1  e7 8e 65 9e 8b 40 75 29  |(.y...5...e..@u)|
+00000230  f1 56 79 33 41 39 96 c4  ab 15 28 7c cc 5a cd 81  |.Vy3A9....(|.Z..|
+00000240  c4 57 d2 d9 86 f7 7f 63  30 2d 89 71 29 3c 99 cc  |.W.....c0-.q)<..|
+00000250  d8 fb 01 03 f3 de 3d 57  5d f3 85 b5 7a a8 f1 5c  |......=W]...z..\|
+00000260  05 39 d7 ac 15 03 be 88  fb e8 4c d2 8f 0f 3f 68  |.9........L...?h|
+00000270  c2 e0 e8 44 c0 97 83 f4  3f f2 4a ba 9e 4c b7 c1  |...D....?.J..L..|
+00000280  ea 55 e4 f4 ce 55 69 83  5b 6e 02 07 06 c4 f3 70  |.U...Ui.[n.....p|
+00000290  13 3e ed 76 f0 ec 7b 5d  1e 9b 5e 73 5f ef 5b 33  |.>.v..{]..^s_.[3|
+000002a0  41 e9 38 45 80 c8 f2 3e  17 ec 30 8b ce 35 87 00  |A.8E...>..0..5..|
+000002b0  a8 02 66 b4 fc d4 69 ae  12 df c6 a4 68 06 2d 8b  |..f...i.....h.-.|
+000002c0  9c b6 e3 0e 2c 2a d9 05  cc ac f1 32 e9 57 6d e4  |....,*.....2.Wm.|
+000002d0  0e f5 ed d0 05 a4 4a 10  02 87 5b 90 f9 89 88 30  |......J...[....0|
+000002e0  3a 65 9d 2d 41 07 7a d7  8b 16 cb 57 01 9d ad bb  |:e.-A.z....W....|
+000002f0  76 4a 6a 3f 77 ae 29 55  61 b5 04 6b 9f eb 6e 34  |vJj?w.)Ua..k..n4|
+00000300  a7 c6 97 92 6f d3 29 0e  65 1e 83 74 e9 2c 5a 8a  |....o.).e..t.,Z.|
+00000310  a8 a7 7a b1 55 76 b9 6a  98 b9 09 d5 01 48 ae 06  |..z.Uv.j.....H..|
+00000320  ff 88 cb 59 f4 64 f2 ad  3b 4c 8c 39 85 b1 5f ae  |...Y.d..;L.9.._.|
+00000330  07 c1 a9 0f f5 0e 02 27  28 74 0d 9f c5 b2 8e 18  |.......'(t......|
+00000340  6a 66 b9 86 ca 41 1f 6f  4a 05 d1 0d 69 ad f0 b6  |jf...A.oJ...i...|
+00000350  2d 6a 24 df 6f 9b 5c 07  b1 04 17 03 03 00 99 11  |-j$.o.\.........|
+00000360  46 8d 44 89 36 f4 ff dc  5a 8e 1e 68 f3 63 03 b6  |F.D.6...Z..h.c..|
+00000370  40 40 26 1b 28 41 d9 78  f5 5e 51 c6 21 b8 fa c5  |@@&.(A.x.^Q.!...|
+00000380  a7 c4 20 d3 b0 c0 f0 ec  9a 0e 1a 5b 1c 8d 57 58  |.. ........[..WX|
+00000390  32 f9 75 69 9a 5e 1d 96  0b fa 77 d8 c7 d1 a0 8b  |2.ui.^....w.....|
+000003a0  e6 f8 33 3a f9 90 22 a7  19 37 50 d8 f0 90 34 4f  |..3:.."..7P...4O|
+000003b0  c3 bb 1c a2 c3 b8 3e d3  6b ee a0 39 40 98 e5 93  |......>.k..9@...|
+000003c0  f8 16 29 6a 1e 12 20 4d  5c bd fd 11 f6 c5 cc d6  |..)j.. M\.......|
+000003d0  08 d9 bc f5 ce 95 70 2c  dd 9f 70 08 7c c4 55 59  |......p,..p.|.UY|
+000003e0  8f 57 25 16 36 53 b4 3c  14 df af 1c 5f ec 2a 5a  |.W%.6S.<...._.*Z|
+000003f0  61 7c c4 1e 96 9c aa 9b  17 03 03 00 35 ef b8 e8  |a|..........5...|
+00000400  5d ef 00 77 46 05 77 37  7b f6 3e b4 e9 b4 67 a8  |]..wF.w7{.>...g.|
+00000410  88 49 6d d8 2f 3a 88 db  48 47 e1 cb a5 f9 38 17  |.Im./:..HG....8.|
+00000420  09 c8 a7 0b 92 7c d9 17  9f 2d 34 9c 9a d0 da 02  |.....|...-4.....|
+00000430  a8 d0                                             |..|
 >>> Flow 3 (client to server)
-00000000  14 03 03 00 01 01 17 03  03 02 1e ad ee 84 48 28  |..............H(|
-00000010  bb dc e6 01 81 4c b3 55  85 2a 73 3a 34 d6 6b 3a  |.....L.U.*s:4.k:|
-00000020  c6 e7 6b da e8 97 dc 13  72 9c d4 03 e2 fc ec e0  |..k.....r.......|
-00000030  0b 00 09 a9 3c 85 19 79  80 a3 fc da 39 b1 13 90  |....<..y....9...|
-00000040  3e 0c be 19 5a be a9 ac  a5 46 a0 07 79 74 be 59  |>...Z....F..yt.Y|
-00000050  18 23 55 79 c0 29 3f 8c  37 d6 21 0c 64 57 4c f0  |.#Uy.)?.7.!.dWL.|
-00000060  a1 34 e0 52 f7 e5 3c af  48 b4 82 78 bd be 7c 90  |.4.R..<.H..x..|.|
-00000070  df 0e f3 46 84 6a e2 bb  88 aa 9a a0 ce 04 de 2b  |...F.j.........+|
-00000080  b3 17 78 e1 a0 bb 65 7f  c5 b3 a6 45 13 c6 11 e1  |..x...e....E....|
-00000090  e2 b4 ec 80 43 80 b6 a5  12 58 ac 5e 30 d3 a0 61  |....C....X.^0..a|
-000000a0  60 c2 90 36 aa 82 f7 ff  55 aa 4e 25 b3 29 5d 41  |`..6....U.N%.)]A|
-000000b0  67 4e 9c d4 f1 1d 55 f1  29 54 13 25 3c 04 41 8f  |gN....U.)T.%<.A.|
-000000c0  6b 9d 95 06 3f 04 84 55  dd 43 7a fb 9f 73 ff df  |k...?..U.Cz..s..|
-000000d0  3b da 12 3b 97 36 fa 51  0b ca c7 0b fb 6a 09 dd  |;..;.6.Q.....j..|
-000000e0  61 2a df 79 b3 66 90 45  76 3c 2b c6 98 42 5a 82  |a*.y.f.Ev<+..BZ.|
-000000f0  0e 93 cf 6f 2b 60 e4 66  67 ad 43 66 73 d2 8c 94  |...o+`.fg.Cfs...|
-00000100  7f 7a 97 d5 a1 8b 07 63  44 cb 51 18 ac 2a af 19  |.z.....cD.Q..*..|
-00000110  66 df ab 18 6f 2a bf fc  7a fa 64 52 c4 1e 91 71  |f...o*..z.dR...q|
-00000120  f1 f7 7f 79 e1 ed 07 3a  e1 08 07 d3 db 4d 74 76  |...y...:.....Mtv|
-00000130  db fa b9 b4 68 e3 d8 e7  8d ad 49 a7 1d 6d 7e 4e  |....h.....I..m~N|
-00000140  3a 6a d2 9a c3 b0 72 61  bb 72 b8 8d 98 58 6e 2e  |:j....ra.r...Xn.|
-00000150  20 f8 ab 4a df 96 c7 6c  fe 33 5b 76 b0 80 26 34  | ..J...l.3[v..&4|
-00000160  b9 5c 9a 79 50 d7 6a 29  25 11 20 4e 3c b6 a7 73  |.\.yP.j)%. N<..s|
-00000170  64 55 a6 8e 57 22 4a 98  5e 14 95 21 ff 8d 3f 05  |dU..W"J.^..!..?.|
-00000180  eb d9 30 8e f1 a3 56 3a  d8 6d 6e 07 de a2 62 ec  |..0...V:.mn...b.|
-00000190  e4 06 bb 96 ae a3 23 d0  bd fd c7 f3 ee 2f 21 3f  |......#....../!?|
-000001a0  8f 25 7a 4a fb 47 cf 78  db 74 35 c8 67 e6 f0 99  |.%zJ.G.x.t5.g...|
-000001b0  39 4e 1f 50 1a bc 64 2e  ae 8e b5 38 63 06 86 5a  |9N.P..d....8c..Z|
-000001c0  2b 1b b5 b9 a1 18 58 24  32 ce c9 de 66 ba 21 b3  |+.....X$2...f.!.|
-000001d0  d8 0f fa 3a 88 ac 6e 66  57 2c 45 5b 59 85 d4 b0  |...:..nfW,E[Y...|
-000001e0  ad 32 8c ef 0c 2a 51 1a  cc ca 6a 82 3e 70 41 cc  |.2...*Q...j.>pA.|
-000001f0  b8 80 db a0 48 22 47 49  a1 a5 d2 9a 80 dc 09 bc  |....H"GI........|
-00000200  c8 c7 dd 53 4b 44 2f 9a  75 06 b7 31 5e fd 74 f5  |...SKD/.u..1^.t.|
-00000210  d4 53 e2 90 dc b7 9a 13  ca 00 96 56 a1 1b dd 71  |.S.........V...q|
-00000220  54 25 77 fa 42 31 95 dd  ba 17 03 03 00 a3 9e 23  |T%w.B1.........#|
-00000230  96 bb c9 d5 30 f7 f4 a3  4c 33 a4 bd 2b 09 93 f5  |....0...L3..+...|
-00000240  04 02 a7 d7 9d 2e 00 5e  18 bc 18 de 1b 94 28 51  |.......^......(Q|
-00000250  4b cd 2c 15 0e 75 b1 59  12 96 8f eb cb b5 a4 4a  |K.,..u.Y.......J|
-00000260  ea c2 e0 1d 28 72 4b 8f  62 d3 7d f0 2f f1 c4 de  |....(rK.b.}./...|
-00000270  6a 6e dc 9c 43 80 c8 ae  99 86 97 de 67 58 d6 4c  |jn..C.......gX.L|
-00000280  91 74 dc c3 23 a5 32 9b  df f5 1e 64 15 04 7d df  |.t..#.2....d..}.|
-00000290  12 e4 40 52 77 5c a3 26  de 20 b6 92 a5 d8 18 cf  |..@Rw\.&. ......|
-000002a0  63 7e 9e 47 b8 ed db ee  b7 9d b6 1c e5 c0 ad 7f  |c~.G............|
-000002b0  d6 07 89 d8 b3 a0 2e 87  b9 81 0d 44 37 c2 c5 13  |...........D7...|
-000002c0  cc cb 70 87 e3 49 6e eb  66 79 76 37 4a f1 c4 4e  |..p..In.fyv7J..N|
-000002d0  82 17 03 03 00 35 52 42  2a a8 a5 7a eb 5f 32 d5  |.....5RB*..z._2.|
-000002e0  68 71 42 8b ce 62 f0 48  43 0b 0f b8 8c ed 16 f4  |hqB..b.HC.......|
-000002f0  64 7e d3 74 57 9d 83 00  ad bc 9b f8 ed bb 23 35  |d~.tW.........#5|
-00000300  07 e9 7c b2 a1 d6 76 d0  f5 ba 15 17 03 03 00 17  |..|...v.........|
-00000310  e2 3f a0 cb 23 fe 4c f1  aa cb 21 70 74 46 4f 10  |.?..#.L...!ptFO.|
-00000320  30 76 0a 72 49 09 65 17  03 03 00 13 ee 7b 9d 32  |0v.rI.e......{.2|
-00000330  ac d4 8a 40 99 1b 0a 23  f7 a4 c6 a6 ef 33 77     |...@...#.....3w|
+00000000  14 03 03 00 01 01 17 03  03 02 1e 57 f6 58 1b c5  |...........W.X..|
+00000010  ad 34 85 01 b8 a0 3f a6  b4 b8 e1 b1 7b fa 10 f8  |.4....?.....{...|
+00000020  05 c3 07 ba ef a7 08 ed  d0 0e f4 4a e0 1e 49 d8  |...........J..I.|
+00000030  d8 a6 82 3c ca cd 4c b8  c3 27 40 28 49 69 47 a2  |...<..L..'@(IiG.|
+00000040  ab 4b 14 e2 b5 ac 02 aa  7c 92 17 c0 6e cc 42 dc  |.K......|...n.B.|
+00000050  ce 10 d1 cb 25 9e fe 4f  21 a3 76 1b b4 d4 62 5b  |....%..O!.v...b[|
+00000060  51 8a 64 4a 6c 4c 7b e8  87 79 50 51 4a b3 39 f3  |Q.dJlL{..yPQJ.9.|
+00000070  37 9f 30 23 eb 6a 26 bc  49 3f 41 76 d2 c9 06 63  |7.0#.j&.I?Av...c|
+00000080  41 11 58 02 0b ae ac 52  4b e6 4e 03 88 ef e6 8d  |A.X....RK.N.....|
+00000090  51 7b 02 e2 a5 a3 70 79  d1 16 5f 8b b9 2e d6 48  |Q{....py.._....H|
+000000a0  87 2b c9 49 7f 1a 33 65  55 61 80 bd e5 cb dc 74  |.+.I..3eUa.....t|
+000000b0  84 4d dd c8 9a 6b 84 c2  b5 68 de 5e 9b 42 cf 99  |.M...k...h.^.B..|
+000000c0  a5 69 93 89 63 a7 94 60  0c 97 7c ab ec 18 61 a8  |.i..c..`..|...a.|
+000000d0  68 e3 c8 66 ab 08 2c 96  49 76 b2 3e 40 22 5e 95  |h..f..,.Iv.>@"^.|
+000000e0  7e 79 f0 53 43 2f 0d a0  c2 ec eb 6f ec 41 da ef  |~y.SC/.....o.A..|
+000000f0  a0 6f cb 22 bb 55 19 2d  6d 6e 04 cc 77 fb 00 a2  |.o.".U.-mn..w...|
+00000100  99 53 cf b6 30 95 f4 04  83 9e ab a9 c4 cd 21 a4  |.S..0.........!.|
+00000110  4a d9 e4 f9 a6 96 5e ef  8d b7 c0 62 2a 25 68 a4  |J.....^....b*%h.|
+00000120  53 50 7c cf d5 9d b9 3d  78 2b 76 65 63 95 b4 8d  |SP|....=x+vec...|
+00000130  87 41 68 3d dc 80 be 40  24 33 b5 c3 90 ee 8f fa  |.Ah=...@$3......|
+00000140  f8 25 0d 48 6a c7 b5 e6  b5 ab b5 10 4b ad b3 95  |.%.Hj.......K...|
+00000150  62 6b 76 9b 21 b2 96 86  0d f6 c1 a8 d3 5a 9f 3e  |bkv.!........Z.>|
+00000160  e8 50 2f 72 49 1c 0a fa  47 90 87 75 f8 a4 7e 95  |.P/rI...G..u..~.|
+00000170  d2 74 ca 78 c5 fa f8 8d  ca 83 81 ec 93 89 e0 50  |.t.x...........P|
+00000180  62 49 15 87 5e 16 4c 17  aa f3 a1 1b 0c 4b 9a 68  |bI..^.L......K.h|
+00000190  1b d5 48 a5 da fe c8 84  fe e6 fc 24 3d 9d 14 e8  |..H........$=...|
+000001a0  e5 38 45 20 bd cb 22 2a  95 3e de 84 4f 85 6b e2  |.8E .."*.>..O.k.|
+000001b0  be dc e1 1a 55 78 68 dc  fd c7 c8 e2 d6 90 a7 14  |....Uxh.........|
+000001c0  44 b6 6a a0 4e 01 0f 73  9b 97 ac ef 17 91 90 16  |D.j.N..s........|
+000001d0  14 e5 f7 88 df 08 8b d6  48 49 c5 9b 72 81 0b b8  |........HI..r...|
+000001e0  67 e4 5a b0 a6 a8 37 ef  d3 96 28 dd f9 cc 24 c0  |g.Z...7...(...$.|
+000001f0  6f fc 7e 68 f5 25 df 38  73 1a ea b1 3d 8d 88 90  |o.~h.%.8s...=...|
+00000200  90 51 f3 f5 02 df 5a b2  5a 29 81 3c b6 aa 60 f2  |.Q....Z.Z).<..`.|
+00000210  79 ea 11 54 9d 6e ad e4  9b 48 35 6a 7b 95 ac 75  |y..T.n...H5j{..u|
+00000220  5e a5 dd 55 c7 97 10 aa  22 17 03 03 00 a2 12 24  |^..U...."......$|
+00000230  cd 8b fc be 73 28 ab a6  1e e6 f9 c2 d3 5e 98 db  |....s(.......^..|
+00000240  a9 30 02 c7 87 20 c9 34  d3 11 ea 3e 9f 3e 12 c7  |.0... .4...>.>..|
+00000250  55 16 8d 3a 33 8f 71 08  b0 10 e4 0a 43 6d 1e 59  |U..:3.q.....Cm.Y|
+00000260  79 e4 f0 86 6a bb 4a 4e  bf 03 7a 5a 7d 76 a1 be  |y...j.JN..zZ}v..|
+00000270  26 95 87 e4 8c 14 85 f3  a6 ec 9c 44 e2 80 04 96  |&..........D....|
+00000280  12 6a c5 97 c0 0c 4e 94  49 ef f9 78 38 09 c7 65  |.j....N.I..x8..e|
+00000290  6c 51 2b 2a a3 da 9c 95  37 1a da 37 f6 da c2 79  |lQ+*....7..7...y|
+000002a0  be 5a 1f 0a 59 5b d8 31  b8 c5 b1 12 ef 57 1b fc  |.Z..Y[.1.....W..|
+000002b0  62 8f de 94 3d 02 3c 96  cf 76 02 46 b7 64 0a 41  |b...=.<..v.F.d.A|
+000002c0  87 94 d6 98 61 82 8c ff  9f 42 dc f0 8e 6a 59 a5  |....a....B...jY.|
+000002d0  17 03 03 00 35 ec 44 9e  59 91 95 ae 8d f5 90 13  |....5.D.Y.......|
+000002e0  6e cf e5 4c a3 89 a0 65  54 f8 6c c0 b7 12 2b 26  |n..L...eT.l...+&|
+000002f0  fb d6 16 33 1e cd 5f dc  c1 06 f3 6e 9a 5a 30 c8  |...3.._....n.Z0.|
+00000300  87 6a ee 13 06 b8 30 c6  33 3b 17 03 03 00 17 a4  |.j....0.3;......|
+00000310  d8 51 e6 cd d0 30 f3 2b  5d 17 fa d4 c8 96 d1 8c  |.Q...0.+].......|
+00000320  2d b6 58 68 c7 93 17 03  03 00 13 1b a1 ec 18 a4  |-.Xh............|
+00000330  6f c6 5a 27 a3 1c a3 75  6d bd 68 61 28 cd        |o.Z'...um.ha(.|
diff --git a/src/crypto/tls/testdata/Client-TLSv13-ClientCert-Ed25519 b/src/crypto/tls/testdata/Client-TLSv13-ClientCert-Ed25519
index 689c287..94abf06 100644
--- a/src/crypto/tls/testdata/Client-TLSv13-ClientCert-Ed25519
+++ b/src/crypto/tls/testdata/Client-TLSv13-ClientCert-Ed25519
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fe 01 00 00  fa 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 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,116 +7,117 @@
 00000050  cc a8 c0 2b c0 2f c0 2c  c0 30 c0 09 c0 13 c0 0a  |...+./.,.0......|
 00000060  c0 14 00 9c 00 9d 00 2f  00 35 c0 12 00 0a c0 23  |......./.5.....#|
 00000070  c0 27 00 3c c0 07 c0 11  00 05 13 03 13 01 13 02  |.'.<............|
-00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
+00000080  01 00 00 7f 00 05 00 05  01 00 00 00 00 00 0a 00  |................|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
 000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
 000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
-000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
-000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
-000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
-000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
+000000c0  01 00 01 00 00 17 00 00  00 12 00 00 00 2b 00 09  |.............+..|
+000000d0  08 03 04 03 03 03 02 03  01 00 33 00 26 00 24 00  |..........3.&.$.|
+000000e0  1d 00 20 2f e5 7d a3 47  cd 62 43 15 28 da ac 5f  |.. /.}.G.bC.(.._|
+000000f0  bb 29 07 30 ff f6 84 af  c4 cf c2 ed 90 99 5f 58  |.).0.........._X|
+00000100  cb 3b 74                                          |.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 7a 02 00 00  76 03 03 4e 4c 01 f1 4e  |....z...v..NL..N|
-00000010  49 97 ec eb df ce 50 4d  1c 9c d0 35 92 10 97 0a  |I.....PM...5....|
-00000020  dd fb a8 4f 39 c6 14 21  d6 42 ac 20 00 00 00 00  |...O9..!.B. ....|
+00000000  16 03 03 00 7a 02 00 00  76 03 03 63 7c fe 18 f1  |....z...v..c|...|
+00000010  82 47 f8 e9 56 0a ef 41  1c da 7b ef 4e 37 f7 37  |.G..V..A..{.N7.7|
+00000020  9c 70 58 73 97 a4 2b df  93 24 98 20 00 00 00 00  |.pXs..+..$. ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000040  00 00 00 00 00 00 00 00  00 00 00 00 13 03 00 00  |................|
-00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 c1  |..+.....3.$... .|
-00000060  c2 ca 32 aa 48 d8 52 bc  c8 23 6d 98 18 3e 15 b6  |..2.H.R..#m..>..|
-00000070  0b 25 db f9 6f a7 e1 75  95 a1 46 d3 47 4a 0e 14  |.%..o..u..F.GJ..|
-00000080  03 03 00 01 01 17 03 03  00 17 87 10 92 da b4 9a  |................|
-00000090  03 a5 0f 73 e6 93 cb 71  1d 58 6e 5d 27 eb ee b6  |...s...q.Xn]'...|
-000000a0  c7 17 03 03 00 42 89 8d  57 16 95 5b f0 98 ad c7  |.....B..W..[....|
-000000b0  d7 94 ba 4d 7e 88 b9 8d  13 26 a6 6c 81 90 a6 1e  |...M~....&.l....|
-000000c0  2b 4e 91 70 e2 da 9d a2  0d 6f 9b 5b ee 69 58 a1  |+N.p.....o.[.iX.|
-000000d0  4c c3 59 57 28 62 b3 ed  26 15 79 db 01 8c 88 e3  |L.YW(b..&.y.....|
-000000e0  63 1f bc b0 01 c9 82 ca  17 03 03 02 6d e5 d6 77  |c...........m..w|
-000000f0  4e d3 af c3 5e 01 e9 1b  31 63 a4 84 d3 cc 2d f8  |N...^...1c....-.|
-00000100  5d 73 f9 3e 83 03 c5 c5  cd 95 00 7b f2 b5 79 fa  |]s.>.......{..y.|
-00000110  47 e5 07 89 a9 22 49 7a  7e 7e 6e d2 3b 68 e8 9c  |G...."Iz~~n.;h..|
-00000120  40 1c 86 2a 48 ee 59 8e  1c 04 8b 91 20 68 65 31  |@..*H.Y..... he1|
-00000130  e7 76 dc 6c 5a ce cb 32  d3 e8 71 7f 93 08 b5 01  |.v.lZ..2..q.....|
-00000140  84 0a b4 ec 80 68 69 9b  b3 4a 4a 4d 56 16 eb 42  |.....hi..JJMV..B|
-00000150  29 93 4d b4 76 f6 e0 15  fe 25 b1 cb 5a da 22 4b  |).M.v....%..Z."K|
-00000160  88 4c ec 66 48 09 e1 d1  0f 3e 3a ad 65 d7 d7 85  |.L.fH....>:.e...|
-00000170  1d cb 35 2c 84 60 ec a1  6d f1 60 cf c6 c7 82 1a  |..5,.`..m.`.....|
-00000180  7c 91 40 2e 3e 88 1f ff  79 2e 6e 97 c5 45 9f e1  ||.@.>...y.n..E..|
-00000190  bf 33 ad 65 df f3 ce 1a  d7 57 7e db f2 28 79 a9  |.3.e.....W~..(y.|
-000001a0  9e 4f 9e 8a ce 02 5a 18  bb f1 ac 72 5b 3f 4c 6b  |.O....Z....r[?Lk|
-000001b0  97 14 14 f9 82 8a 4f 99  21 98 db af 3e 08 ab 4f  |......O.!...>..O|
-000001c0  d8 3f f6 cc da 76 77 eb  02 39 0a 00 23 a5 e0 92  |.?...vw..9..#...|
-000001d0  01 10 3f 76 ab 1a 38 8e  f9 a1 d0 25 c3 9d 50 a4  |..?v..8....%..P.|
-000001e0  ef a5 8c f8 5d bc d9 fd  dd 25 cd 42 38 52 d1 cd  |....]....%.B8R..|
-000001f0  d2 1b fc ba 7d 8b bd 82  05 23 c3 9d 02 ff 1b 4e  |....}....#.....N|
-00000200  08 e1 f3 7c 35 15 0f e8  0e b7 8a e5 4a 2b da 45  |...|5.......J+.E|
-00000210  4a 72 9a 32 7e 55 52 65  d2 a8 32 90 53 bf 25 29  |Jr.2~URe..2.S.%)|
-00000220  1e 8d d7 a3 22 d6 40 19  95 58 a8 37 af a8 52 e7  |....".@..X.7..R.|
-00000230  79 b9 4e 61 d8 f0 7d d2  69 25 99 28 3f 31 f6 b2  |y.Na..}.i%.(?1..|
-00000240  44 65 1f 9c 41 08 17 c9  01 5d 20 ea ab fe 06 64  |De..A....] ....d|
-00000250  9a f4 d0 24 e0 b5 88 0a  2b 96 e9 71 11 a8 49 b4  |...$....+..q..I.|
-00000260  40 62 1b 45 15 47 cb a5  fc 4f 07 58 2b ef d4 5d  |@b.E.G...O.X+..]|
-00000270  df 40 38 6c 6e ca 63 c5  95 2d 79 26 86 ff 33 02  |.@8ln.c..-y&..3.|
-00000280  da 5a 85 0c 8f 7f 58 ba  ea 88 cf bc 51 92 12 86  |.Z....X.....Q...|
-00000290  f1 c1 f9 0a d0 6e cc b4  2b 16 98 ad f8 11 ad 63  |.....n..+......c|
-000002a0  82 d7 4e ea a5 ee 78 a2  9a 35 b6 b3 d9 24 cf 66  |..N...x..5...$.f|
-000002b0  03 d2 25 1f 15 37 c7 b5  8e bb 0a 40 0f 28 c2 16  |..%..7.....@.(..|
-000002c0  90 a4 61 9e dd fd b5 ad  97 39 0d 66 e7 fa 5b e2  |..a......9.f..[.|
-000002d0  c2 ef 44 5d 44 07 d6 c3  ed e2 89 6e 4c ed 79 42  |..D]D......nL.yB|
-000002e0  86 3b f4 94 0c 82 5e 52  ce 00 ab 5c 20 b4 18 db  |.;....^R...\ ...|
-000002f0  c9 fe 8b be 8d da e9 86  13 62 6b 8d 0d 57 c8 fe  |.........bk..W..|
-00000300  a6 4b 82 52 d5 d8 05 18  2f a0 43 d6 c8 89 fb e7  |.K.R..../.C.....|
-00000310  72 17 61 89 36 5b e0 aa  4d 6c 20 ee 68 db 32 e4  |r.a.6[..Ml .h.2.|
-00000320  97 9f 18 26 7c 1a cd e8  b9 05 ae fd 86 bf 0e 47  |...&|..........G|
-00000330  09 06 bd de 2d b9 50 6a  0c a6 27 04 5e aa e0 ce  |....-.Pj..'.^...|
-00000340  e7 cf 98 f9 7e 7d b9 4d  77 9a 88 3a d4 41 07 cc  |....~}.Mw..:.A..|
-00000350  87 b6 41 53 8b 8c 79 8e  07 b9 17 03 03 00 99 0b  |..AS..y.........|
-00000360  63 4e d8 79 d7 11 f2 46  00 6c 5d d2 9e 49 df 7e  |cN.y...F.l]..I.~|
-00000370  f2 96 1a 68 9d 6a 05 dc  61 45 47 a4 18 5c 65 04  |...h.j..aEG..\e.|
-00000380  00 38 d1 25 0c ff a3 a2  c0 c2 82 7f b1 1b a1 c6  |.8.%............|
-00000390  7b ac fb 71 48 b6 e4 e2  7b c4 d0 44 8e 22 d6 91  |{..qH...{..D."..|
-000003a0  99 87 a2 88 3d bb b4 80  13 57 2a 6a b0 2d 52 16  |....=....W*j.-R.|
-000003b0  d3 f2 e4 cd d0 79 9a 31  ce 68 65 b3 61 67 a0 b9  |.....y.1.he.ag..|
-000003c0  1e 6b 9f 73 dc 46 be 5e  df d7 c2 30 d5 60 b5 e5  |.k.s.F.^...0.`..|
-000003d0  60 cc 10 ae 9a f9 b6 9a  fd 14 b9 1e b7 3c 1d 3e  |`............<.>|
-000003e0  34 a6 49 d2 48 f7 24 56  29 c9 98 f1 33 b1 e5 5e  |4.I.H.$V)...3..^|
-000003f0  2c 7b bb 5f b6 53 6a c8  17 03 03 00 35 d9 af 32  |,{._.Sj.....5..2|
-00000400  1f a5 09 3f 8a 10 df a7  34 9b f8 ec 07 81 80 73  |...?....4......s|
-00000410  dc ba 09 fc 40 e4 1e df  f6 de 02 54 3c 7d ea 49  |....@......T<}.I|
-00000420  91 16 72 70 8e 1a 21 76  c6 00 0e 03 9f 0a 82 fe  |..rp..!v........|
-00000430  4c 18                                             |L.|
+00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 fe  |..+.....3.$... .|
+00000060  8e 92 58 47 f1 85 83 58  b6 18 1a 05 fb 40 99 25  |..XG...X.....@.%|
+00000070  10 d0 6d 4c c0 43 8b b5  a9 18 51 8f 84 73 56 14  |..mL.C....Q..sV.|
+00000080  03 03 00 01 01 17 03 03  00 17 3e f9 39 72 d3 bd  |..........>.9r..|
+00000090  1f 3f ff 30 cb 7e f8 3d  a7 7d 8c 09 94 d3 79 24  |.?.0.~.=.}....y$|
+000000a0  10 17 03 03 00 42 28 16  54 10 dd db 62 c6 08 c9  |.....B(.T...b...|
+000000b0  56 43 8d 0e 04 bc d1 78  54 21 1f 08 c0 80 e2 76  |VC.....xT!.....v|
+000000c0  8b 64 e2 63 97 a8 73 8a  14 16 2f 92 39 9c 59 e9  |.d.c..s.../.9.Y.|
+000000d0  59 a0 88 4b 9d 19 49 cf  34 98 c5 2a 48 eb d2 0f  |Y..K..I.4..*H...|
+000000e0  95 7a 25 f2 23 b3 88 61  17 03 03 02 6d 98 62 0c  |.z%.#..a....m.b.|
+000000f0  ed 07 3e a7 5b 8e 69 20  90 cb ff 25 06 fb 80 dc  |..>.[.i ...%....|
+00000100  b6 e6 bc 95 9c 6b 1e b4  11 a7 2f 72 17 c7 b5 67  |.....k..../r...g|
+00000110  93 a9 5c b8 ef aa e1 cb  6b f4 2d db e3 a4 c9 cf  |..\.....k.-.....|
+00000120  66 45 d9 1d 02 1d 9c b7  84 4f 83 5b 7f f3 16 0a  |fE.......O.[....|
+00000130  f7 37 86 19 c0 29 95 5a  aa 46 62 10 c9 22 62 f0  |.7...).Z.Fb.."b.|
+00000140  4f a9 a3 75 ea 46 af 75  54 9e 69 87 ce a9 d9 b9  |O..u.F.uT.i.....|
+00000150  35 d6 c0 4a f0 22 0b d1  e5 4b 48 99 70 fa bc ed  |5..J."...KH.p...|
+00000160  8a 8b 7d a2 f0 52 3d e0  bc d3 7e ca 1b 89 b6 78  |..}..R=...~....x|
+00000170  24 8d 13 0d 7d f2 3f d7  71 c9 d6 5a 00 8e 8c 7f  |$...}.?.q..Z....|
+00000180  ed 5b 39 f3 67 76 c3 7a  75 1e 4a 4b 63 36 e7 d4  |.[9.gv.zu.JKc6..|
+00000190  04 46 e0 17 f4 d0 41 9d  cf 01 f4 f7 b4 7e 11 73  |.F....A......~.s|
+000001a0  c4 46 ac d3 78 54 17 83  10 12 48 d1 36 ee 37 90  |.F..xT....H.6.7.|
+000001b0  f1 5f 7d f9 bc ac 95 ae  01 0e ca 0d 93 07 6e 87  |._}...........n.|
+000001c0  c9 27 79 46 0f 27 a1 31  f8 92 9e 73 3d 2e 29 f5  |.'yF.'.1...s=.).|
+000001d0  88 d1 67 a6 6a fb d5 59  39 65 46 b0 92 11 55 de  |..g.j..Y9eF...U.|
+000001e0  6f 9f 1d ea a0 71 65 4c  c8 03 b7 f1 25 ff f1 c9  |o....qeL....%...|
+000001f0  fa a7 1e 36 f3 91 bd d7  91 00 b5 3e 6f b1 67 5b  |...6.......>o.g[|
+00000200  fc 64 1d 76 0e a7 36 15  93 a1 ea 53 06 15 2b cf  |.d.v..6....S..+.|
+00000210  29 ea c6 5b 58 bb 08 a0  b8 9c e1 70 8d 2d 55 81  |)..[X......p.-U.|
+00000220  ac d9 0d 45 ec f9 c3 56  31 00 db 46 81 68 98 db  |...E...V1..F.h..|
+00000230  8d 97 ce d1 b9 83 af 5f  6a a2 1a 22 2f 52 a0 d1  |......._j.."/R..|
+00000240  8c 40 35 68 a2 ee 30 ef  d4 bf 08 46 76 7c dd 57  |.@5h..0....Fv|.W|
+00000250  c3 fb 7d fd af 01 37 cc  c2 44 f6 cf 80 f4 ab c2  |..}...7..D......|
+00000260  2e 82 18 5e c4 91 a8 b7  ad 29 e7 54 4f 02 47 5e  |...^.....).TO.G^|
+00000270  82 26 25 c6 b5 8e c9 a7  19 00 32 1b 3b e8 8c 35  |.&%.......2.;..5|
+00000280  25 01 ed e4 b2 29 e2 f4  d7 0f c8 39 f8 5d 7b 1e  |%....).....9.]{.|
+00000290  db 7b 39 f4 e2 cd 1a 57  07 48 2b 15 e4 39 03 54  |.{9....W.H+..9.T|
+000002a0  cf 39 fe 3d 15 47 bb 87  cf a5 f4 17 cc ad dd fa  |.9.=.G..........|
+000002b0  58 b6 e8 23 9c 1d 92 6b  32 36 12 ba 87 56 a4 2f  |X..#...k26...V./|
+000002c0  fe cc 93 98 62 84 5c e6  f9 fd d4 86 df ce 42 32  |....b.\.......B2|
+000002d0  08 da a4 13 40 a0 33 c2  2a 54 2b da 50 5b 27 d9  |....@.3.*T+.P['.|
+000002e0  3a 76 16 6c 89 bf 31 48  a3 ad c3 a6 ee 17 7d 86  |:v.l..1H......}.|
+000002f0  88 52 57 77 01 94 ba dc  f0 a6 c3 d3 30 ae be aa  |.RWw........0...|
+00000300  11 0a e8 54 8c b2 cb 7f  e6 b6 d3 17 f4 2e 54 94  |...T..........T.|
+00000310  31 43 33 07 5d 51 96 11  21 91 f9 7e 93 79 70 85  |1C3.]Q..!..~.yp.|
+00000320  d3 0b ee fd 0e eb db ad  71 fe ba fc fe fa ef 0e  |........q.......|
+00000330  a1 a4 c5 99 e2 fa 3c df  8b 52 33 89 fd 15 45 1b  |......<..R3...E.|
+00000340  4e 5f 0e ca e9 c5 6e 11  06 ae 37 2a db 4c 9f 2c  |N_....n...7*.L.,|
+00000350  21 67 af e7 ae 09 e8 96  2f f0 17 03 03 00 99 ed  |!g....../.......|
+00000360  df 2c ff 14 ed 8e 5e 83  63 5d 82 99 19 ef 4c b1  |.,....^.c]....L.|
+00000370  4b f6 88 29 27 72 b4 47  41 ab 61 58 67 7f 1c d0  |K..)'r.GA.aXg...|
+00000380  a5 6d 83 3a 4e be 98 7d  55 e3 cc a5 24 41 28 91  |.m.:N..}U...$A(.|
+00000390  33 b8 94 a8 e3 54 88 2b  22 89 c2 b8 86 96 d0 24  |3....T.+"......$|
+000003a0  99 6c 4c 26 ee 39 67 b6  8b 30 49 b9 d4 cd c0 b3  |.lL&.9g..0I.....|
+000003b0  bd f0 1d 2c 96 c7 9c 10  a7 4b 0e 2b 51 92 96 2f  |...,.....K.+Q../|
+000003c0  70 40 12 f3 91 53 eb 25  34 e6 ae ef df d4 3e f5  |p@...S.%4.....>.|
+000003d0  fa 9f c2 85 71 5d 21 fd  ee e0 3b 5a 23 db 19 e6  |....q]!...;Z#...|
+000003e0  ce 04 6c e6 37 2c 43 df  4c 1f 0a 84 36 5e 26 82  |..l.7,C.L...6^&.|
+000003f0  fa f4 38 ea 49 bb d2 65  17 03 03 00 35 a7 a0 78  |..8.I..e....5..x|
+00000400  91 74 da 83 6f bd 49 ae  52 e2 c2 a7 d9 b4 a1 bc  |.t..o.I.R.......|
+00000410  b8 59 ab 56 25 60 05 39  db 3b 5e 95 6f a6 43 b9  |.Y.V%`.9.;^.o.C.|
+00000420  1b 7a 84 ac ea 8a 62 f2  7c 50 68 43 0a c8 71 25  |.z....b.|PhC..q%|
+00000430  44 a0                                             |D.|
 >>> Flow 3 (client to server)
-00000000  14 03 03 00 01 01 17 03  03 01 50 1d 6e 16 0d 4e  |..........P.n..N|
-00000010  c0 a2 41 c3 a2 84 c9 80  c0 f0 ef c0 5d 3a 3b f2  |..A.........]:;.|
-00000020  bf 1c 9e 79 d7 d3 94 0b  41 2d bc 50 eb 0f 60 f4  |...y....A-.P..`.|
-00000030  bd cd f6 03 22 7b 68 68  44 34 c9 0f 23 ca 76 6f  |...."{hhD4..#.vo|
-00000040  f2 97 38 07 43 56 7e b7  ce 67 68 67 37 34 d0 f7  |..8.CV~..ghg74..|
-00000050  c5 92 fd 65 98 b8 7e 5f  48 a8 a3 aa a8 96 65 b5  |...e..~_H.....e.|
-00000060  48 be 91 99 67 0a 37 c7  31 b4 43 ba 26 bb 87 98  |H...g.7.1.C.&...|
-00000070  3c 55 e4 63 b0 33 ca ee  0a a5 fe 36 88 ef cf f0  |<U.c.3.....6....|
-00000080  ab 6b 7d e8 f6 1f 14 12  49 f7 14 b7 12 bb d8 1e  |.k}.....I.......|
-00000090  e0 be ed 56 75 b9 ab 8a  20 75 d9 6f 45 2d 71 b3  |...Vu... u.oE-q.|
-000000a0  2f b7 cd 9c c5 16 ed 37  0e 08 15 a5 49 18 7c 13  |/......7....I.|.|
-000000b0  8e 0b 66 01 b1 8c 1d 89  d4 91 9e 5a 6b 94 f6 fa  |..f........Zk...|
-000000c0  7b a8 14 1c a7 20 55 c5  e4 0e 9d e0 5b d6 d4 b7  |{.... U.....[...|
-000000d0  1d 93 2b 7c 25 46 28 11  06 57 a3 cb 2f 4b 39 cf  |..+|%F(..W../K9.|
-000000e0  61 be 60 9a fd f1 6e e1  a2 a7 20 f2 fd 50 a2 d2  |a.`...n... ..P..|
-000000f0  17 db 16 4f 3f 8c 20 e4  4d 56 37 3b c2 42 17 cc  |...O?. .MV7;.B..|
-00000100  5d 99 06 fc 18 0d 1a 88  e8 f9 6f cf 7d 2e 57 73  |].........o.}.Ws|
-00000110  85 47 ed d0 2d b3 9a 05  cf 0c 7d e6 ed 29 95 f4  |.G..-.....}..)..|
-00000120  d5 e0 96 6a 1d 67 3e 5f  43 9f b5 f6 66 f5 84 63  |...j.g>_C...f..c|
-00000130  bd 42 a6 f8 ef 38 42 8a  d8 28 dc 55 e5 88 03 76  |.B...8B..(.U...v|
-00000140  96 ba 89 35 63 7e 6c da  39 d8 9a 27 04 ab d5 0e  |...5c~l.9..'....|
-00000150  48 89 cc 81 25 44 61 16  2c b2 69 17 03 03 00 59  |H...%Da.,.i....Y|
-00000160  81 8f 94 30 8d fc 47 13  7e 84 06 9b 4a 85 2c bb  |...0..G.~...J.,.|
-00000170  b3 a0 0d 4f 50 6a cb 0b  9b 40 ef cc 84 70 1f 69  |...OPj...@...p.i|
-00000180  b9 3e a6 c4 ba 66 eb a9  6f 78 83 7f d4 1f d8 c4  |.>...f..ox......|
-00000190  b0 f6 9b 03 29 7f b1 f8  60 40 0b 28 91 32 2c 03  |....)...`@.(.2,.|
-000001a0  aa 9e 7b fb 99 c2 11 51  1f a7 81 69 16 39 f4 52  |..{....Q...i.9.R|
-000001b0  ca d8 d0 f3 87 6f 58 ab  9a 17 03 03 00 35 de 03  |.....oX......5..|
-000001c0  88 61 50 5c 08 88 77 28  6a 1d 28 44 3d 49 8b 79  |.aP\..w(j.(D=I.y|
-000001d0  d1 a2 13 67 95 0f 7c 18  fe e2 e0 07 f1 ce b9 be  |...g..|.........|
-000001e0  79 aa 40 d6 cf 66 53 ac  15 ae 2a 14 a9 63 98 55  |y.@..fS...*..c.U|
-000001f0  96 16 6f 17 03 03 00 17  a8 ac 17 c5 eb d9 8e 77  |..o............w|
-00000200  9e 4b e0 20 c6 0c 34 b6  c3 ab c4 b6 8b b2 77 17  |.K. ..4.......w.|
-00000210  03 03 00 13 58 d4 7b 8f  ca 20 41 e3 3f d1 ae cf  |....X.{.. A.?...|
-00000220  3d e1 86 91 c0 a1 08                              |=......|
+00000000  14 03 03 00 01 01 17 03  03 01 50 e5 d5 ff 01 ac  |..........P.....|
+00000010  29 be dc aa 07 05 88 f6  e6 ae aa 3f 10 c6 72 1e  |)..........?..r.|
+00000020  31 1a dc e5 64 ab 1f 82  60 0a a3 24 59 4a 91 86  |1...d...`..$YJ..|
+00000030  d0 90 e5 5a ca ad 5b c4  18 a6 c3 d8 56 7b 86 7c  |...Z..[.....V{.||
+00000040  53 b4 59 7e 91 5d 9c 32  11 44 66 7c 75 43 d1 d9  |S.Y~.].2.Df|uC..|
+00000050  dc bd 99 7d 37 37 c1 be  ef 61 bf fb b4 f4 2e 2e  |...}77...a......|
+00000060  c5 66 fa d2 a1 86 4e 42  03 ed 7b 78 2b 82 f8 6d  |.f....NB..{x+..m|
+00000070  f5 12 6f 60 c7 93 03 12  43 5a 4b 21 25 88 8b 54  |..o`....CZK!%..T|
+00000080  37 2e 9b 1d bb 86 4a 85  80 e2 cb b1 0b 38 05 b1  |7.....J......8..|
+00000090  d2 a7 04 c6 a3 db df cb  18 90 db 17 dd f1 04 44  |...............D|
+000000a0  c0 5a ce ed 39 4e 89 91  8c 00 a2 8e 5f c4 64 8d  |.Z..9N......_.d.|
+000000b0  22 e5 53 7c ea 2d 09 65  0f 76 31 ef 50 b6 b7 6f  |".S|.-.e.v1.P..o|
+000000c0  a4 63 83 c2 90 07 67 28  37 c2 56 cb 56 71 92 3c  |.c....g(7.V.Vq.<|
+000000d0  ea 34 3b 54 58 78 b1 c0  ef 1c fc 4e c4 c5 f7 89  |.4;TXx.....N....|
+000000e0  55 f4 95 c0 bc af 1f 9e  0d f3 b8 35 54 64 c2 4b  |U..........5Td.K|
+000000f0  cc 4b 30 6f e0 5c 7b 51  1c 05 51 b3 6a f2 60 1f  |.K0o.\{Q..Q.j.`.|
+00000100  a5 26 ec ad 5f 93 1a 45  f9 88 73 5a 9a 51 fe c8  |.&.._..E..sZ.Q..|
+00000110  1a e7 9b 8c 9d a6 55 68  57 80 a5 81 8e bd 1a 5f  |......UhW......_|
+00000120  9d 56 89 8f 32 9a 5b 4c  60 e0 b2 73 e5 5c 04 62  |.V..2.[L`..s.\.b|
+00000130  62 1c ee 89 6d 00 4a bb  e0 b9 5f 6f f3 a7 5e bc  |b...m.J..._o..^.|
+00000140  95 a1 a8 a7 94 c2 06 19  97 0f 2f ff b0 95 c6 39  |........../....9|
+00000150  8d 96 59 71 87 90 34 76  b2 3b 7d 17 03 03 00 59  |..Yq..4v.;}....Y|
+00000160  7d ba 65 99 35 1b 2b 93  b1 76 99 9a 5a 90 4c 2a  |}.e.5.+..v..Z.L*|
+00000170  2a 14 1e 99 dd 23 10 95  fb 5b 9f 28 47 4d 41 3e  |*....#...[.(GMA>|
+00000180  71 d4 93 20 ee 69 32 85  b5 59 2a d0 1c 19 53 84  |q.. .i2..Y*...S.|
+00000190  46 0d cc 6a 9b a3 83 68  22 79 e5 e3 f4 56 a9 76  |F..j...h"y...V.v|
+000001a0  a0 9f d9 3c 27 3f 28 cb  ab eb f3 55 41 2b ce 6f  |...<'?(....UA+.o|
+000001b0  5a e5 22 c1 c9 0f 44 fc  8f 17 03 03 00 35 f6 80  |Z."...D......5..|
+000001c0  8e d2 cc 5b 6d 94 18 83  d2 70 87 e5 2c f2 0a 7a  |...[m....p..,..z|
+000001d0  44 a4 e9 6d f3 74 02 61  1b 87 6c b7 bf 8a ba 41  |D..m.t.a..l....A|
+000001e0  3b d8 18 2f 1d ad c3 9c  c8 6c c9 a0 82 7c bf 2b  |;../.....l...|.+|
+000001f0  f8 c2 09 17 03 03 00 17  79 0a 43 29 1d d6 b5 fc  |........y.C)....|
+00000200  fe 27 55 b8 5a 69 f1 b9  ed 31 63 2f 51 76 e1 17  |.'U.Zi...1c/Qv..|
+00000210  03 03 00 13 72 86 7e a3  6c af 2b e3 85 4c 16 74  |....r.~.l.+..L.t|
+00000220  97 73 48 96 ba 46 bd                              |.sH..F.|
diff --git a/src/crypto/tls/testdata/Client-TLSv13-ClientCert-RSA-ECDSA b/src/crypto/tls/testdata/Client-TLSv13-ClientCert-RSA-ECDSA
index 8e361ea..e0acf89 100644
--- a/src/crypto/tls/testdata/Client-TLSv13-ClientCert-RSA-ECDSA
+++ b/src/crypto/tls/testdata/Client-TLSv13-ClientCert-RSA-ECDSA
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fe 01 00 00  fa 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 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,128 +7,129 @@
 00000050  cc a8 c0 2b c0 2f c0 2c  c0 30 c0 09 c0 13 c0 0a  |...+./.,.0......|
 00000060  c0 14 00 9c 00 9d 00 2f  00 35 c0 12 00 0a c0 23  |......./.5.....#|
 00000070  c0 27 00 3c c0 07 c0 11  00 05 13 03 13 01 13 02  |.'.<............|
-00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
+00000080  01 00 00 7f 00 05 00 05  01 00 00 00 00 00 0a 00  |................|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
 000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
 000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
-000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
-000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
-000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
-000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
+000000c0  01 00 01 00 00 17 00 00  00 12 00 00 00 2b 00 09  |.............+..|
+000000d0  08 03 04 03 03 03 02 03  01 00 33 00 26 00 24 00  |..........3.&.$.|
+000000e0  1d 00 20 2f e5 7d a3 47  cd 62 43 15 28 da ac 5f  |.. /.}.G.bC.(.._|
+000000f0  bb 29 07 30 ff f6 84 af  c4 cf c2 ed 90 99 5f 58  |.).0.........._X|
+00000100  cb 3b 74                                          |.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 7a 02 00 00  76 03 03 30 0a c5 df b0  |....z...v..0....|
-00000010  90 3a 48 4b 20 f1 89 62  be 1f 1b 64 c2 7e 69 25  |.:HK ..b...d.~i%|
-00000020  9f b7 f9 2c 86 e7 40 e7  e8 10 fa 20 00 00 00 00  |...,..@.... ....|
+00000000  16 03 03 00 7a 02 00 00  76 03 03 17 5d 17 94 35  |....z...v...]..5|
+00000010  cc 45 ba fc 44 dd 02 57  2c 67 67 c1 f9 7d bb 52  |.E..D..W,gg..}.R|
+00000020  fb 5e dd a2 29 43 14 95  be a7 98 20 00 00 00 00  |.^..)C..... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000040  00 00 00 00 00 00 00 00  00 00 00 00 13 03 00 00  |................|
-00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 94  |..+.....3.$... .|
-00000060  e8 ab 87 65 c8 dd 6f ee  b4 d6 0b bb fd 18 9a 2d  |...e..o........-|
-00000070  e4 bc c6 20 98 09 71 65  7d 54 35 73 22 99 1b 14  |... ..qe}T5s"...|
-00000080  03 03 00 01 01 17 03 03  00 17 37 b7 eb eb a2 9f  |..........7.....|
-00000090  7f 00 8c 9d a9 50 7c 0c  15 31 63 71 45 7a 3d ee  |.....P|..1cqEz=.|
-000000a0  5e 17 03 03 00 42 9f 23  07 cf d0 bc e8 bb 95 01  |^....B.#........|
-000000b0  37 94 18 2e 05 02 8a eb  0a 37 10 79 51 a9 d4 43  |7........7.yQ..C|
-000000c0  18 18 e6 00 9d 68 ff 74  f3 9c 19 bf 5e 51 0c 47  |.....h.t....^Q.G|
-000000d0  61 35 8c b2 58 5f 32 bc  88 c4 fb 5a 22 61 14 98  |a5..X_2....Z"a..|
-000000e0  28 26 8c 75 9d 1d 19 05  17 03 03 02 22 d2 2c 1a  |(&.u........".,.|
-000000f0  e5 58 0d d7 0b c4 66 b2  06 90 bc 92 0f 05 34 5d  |.X....f.......4]|
-00000100  2b 20 26 02 cc ac 90 40  a0 f1 5f 0e b9 99 7c 0f  |+ &....@.._...|.|
-00000110  c9 3e 60 0b 39 ec 6c 94  3a d4 f7 b7 49 5e c7 6e  |.>`.9.l.:...I^.n|
-00000120  df 3b cc 33 cb 32 41 53  dd 09 8e 91 97 d2 e0 06  |.;.3.2AS........|
-00000130  5e 0c 4c 49 46 18 83 fc  ac b4 f8 76 2d 18 ee 0b  |^.LIF......v-...|
-00000140  b6 4a b9 aa eb ee db 7a  aa 6d 04 84 ed 8e 15 bc  |.J.....z.m......|
-00000150  bf 6f a1 29 bc 0b 9f ba  05 a5 42 82 fd 1c 30 c9  |.o.)......B...0.|
-00000160  20 df 8e ba 28 ab 0b a2  42 09 5e e8 c1 61 d2 25  | ...(...B.^..a.%|
-00000170  fc 05 53 62 91 45 29 54  60 31 b8 4f 01 9c 7b 6a  |..Sb.E)T`1.O..{j|
-00000180  04 27 df bc e0 a0 3d b3  80 73 22 ca 9b 41 be b6  |.'....=..s"..A..|
-00000190  09 22 67 1e 54 52 ce 14  b5 56 7a ca 3f a8 3e 01  |."g.TR...Vz.?.>.|
-000001a0  d2 e4 36 18 87 f6 08 19  55 d2 ba 3c a3 c5 11 84  |..6.....U..<....|
-000001b0  62 2a 09 c6 67 de cd ab  66 12 dd 0a 23 77 18 b7  |b*..g...f...#w..|
-000001c0  73 c1 29 61 52 32 95 eb  a0 db 72 ae b7 ff 2a b2  |s.)aR2....r...*.|
-000001d0  08 f6 d7 69 32 c2 f8 8b  e1 40 a9 d0 fe 11 64 a2  |...i2....@....d.|
-000001e0  a2 dd a7 e6 a6 dd 5d 79  49 df bb c0 83 da 56 7a  |......]yI.....Vz|
-000001f0  a5 22 8e 60 df 89 48 e0  e2 e9 5f d5 fe dd ba 34  |.".`..H..._....4|
-00000200  ad 91 52 d8 2f 7e a4 73  50 e8 b7 83 e2 d9 5e 05  |..R./~.sP.....^.|
-00000210  96 08 e4 d4 bb 01 39 99  aa 1d fd 74 1b dc ca c2  |......9....t....|
-00000220  8f bb b8 bf c4 eb 00 6f  cc 70 eb 7c c7 29 e4 64  |.......o.p.|.).d|
-00000230  8c 76 a7 b5 79 ea b6 96  fe eb 8f e7 81 9b d1 d0  |.v..y...........|
-00000240  41 16 db ef 9e 55 2a 77  6c 34 54 22 48 6a ca 78  |A....U*wl4T"Hj.x|
-00000250  31 6e d2 00 7f 54 93 65  ec 28 42 66 7b 74 4d 58  |1n...T.e.(Bf{tMX|
-00000260  fe 25 74 bd 9f a4 ff f2  45 06 c6 63 1f 11 68 a4  |.%t.....E..c..h.|
-00000270  fb fe 62 2b f8 19 e3 32  2c cc 5d 71 37 21 05 82  |..b+...2,.]q7!..|
-00000280  c9 c7 30 c7 74 64 d9 f9  6b c2 ae d8 15 2b 2a 79  |..0.td..k....+*y|
-00000290  a0 2d a3 18 1f d7 20 99  96 86 52 32 cf 84 bd 73  |.-.... ...R2...s|
-000002a0  63 85 82 a3 64 fb e3 ea  1b 31 f5 df 1c 74 06 48  |c...d....1...t.H|
-000002b0  69 8a e3 f0 72 8c 59 8b  de 0b 06 02 47 54 4c 2d  |i...r.Y.....GTL-|
-000002c0  46 ac d4 f5 4d 5c fe 0d  bf af d0 37 58 82 3e d2  |F...M\.....7X.>.|
-000002d0  4e c1 7e 0f b0 21 f7 8e  2c 88 db 83 43 ed ad 5b  |N.~..!..,...C..[|
-000002e0  0f a2 ce 47 e4 3f dd 1b  71 fe f0 a7 a1 8d 8c dc  |...G.?..q.......|
-000002f0  75 e0 7a 89 f7 14 5b 37  9d 35 f6 23 91 a8 d2 1a  |u.z...[7.5.#....|
-00000300  96 07 1b 5b 9c 35 27 b8  b9 0c 92 1e cf 1b 3c 17  |...[.5'.......<.|
-00000310  03 03 00 a4 f0 59 e1 1d  62 39 69 c5 53 ae 66 85  |.....Y..b9i.S.f.|
-00000320  df ea 32 73 ca 94 e2 b5  14 d4 30 07 dd fd 2f 9a  |..2s......0.../.|
-00000330  16 fc e9 71 4a 20 b8 d2  7e 17 26 ff a9 55 56 24  |...qJ ..~.&..UV$|
-00000340  31 85 bc ea 19 1c 37 b7  fe 8b 47 5f a3 99 0f 5d  |1.....7...G_...]|
-00000350  17 92 4b 2a 4c b5 6c db  8f bb 46 ee 89 31 53 79  |..K*L.l...F..1Sy|
-00000360  aa 34 9d 9b e8 9b e7 82  55 a3 92 f6 53 53 d3 72  |.4......U...SS.r|
-00000370  17 23 33 01 e8 75 7e 8d  63 91 a0 67 8f a5 f0 15  |.#3..u~.c..g....|
-00000380  8c f5 81 e2 c4 08 ff 14  1d 96 cf ef 4e 09 18 a1  |............N...|
-00000390  2c 38 0a f7 33 f0 1d ef  9d 12 4d 8c 25 f0 80 a2  |,8..3.....M.%...|
-000003a0  aa a7 cf e4 7c e6 44 58  6d 30 70 48 55 3b b5 79  |....|.DXm0pHU;.y|
-000003b0  55 aa 03 ed 14 ea e5 ee  17 03 03 00 35 72 1a ca  |U...........5r..|
-000003c0  5c 3d 3b 75 29 cc a9 09  85 67 89 37 18 91 c0 af  |\=;u)....g.7....|
-000003d0  28 d2 0c c9 8b 05 94 04  3a 68 38 f0 c3 db 95 89  |(.......:h8.....|
-000003e0  c8 28 fc 07 4b 49 7d b6  25 36 05 53 96 e0 d9 35  |.(..KI}.%6.S...5|
-000003f0  e5 7c                                             |.||
+00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 8f  |..+.....3.$... .|
+00000060  cd f2 33 7c ee 70 18 fa  98 64 43 1b 24 e2 80 80  |..3|.p...dC.$...|
+00000070  a9 e3 3c 49 f3 a2 68 b6  ba 09 3b ef f4 4e 20 14  |..<I..h...;..N .|
+00000080  03 03 00 01 01 17 03 03  00 17 cc f4 79 1c f5 ef  |............y...|
+00000090  db b2 3b 82 f6 02 31 e7  2f 26 9a 6d 3b 8c 3d f1  |..;...1./&.m;.=.|
+000000a0  b5 17 03 03 00 42 74 b6  78 89 0f ce a8 80 4c 07  |.....Bt.x.....L.|
+000000b0  f5 3b 4d ce da 18 ee 39  c0 d9 9d c7 75 97 cc 50  |.;M....9....u..P|
+000000c0  8d de 0d a0 33 fc ab be  71 52 7c 7e fb 09 90 a3  |....3...qR|~....|
+000000d0  94 79 b7 16 04 4d db 57  29 dd 09 f1 94 b6 d4 ba  |.y...M.W).......|
+000000e0  b9 79 c2 76 49 81 d6 06  17 03 03 02 22 d2 06 bc  |.y.vI......."...|
+000000f0  ce f7 c8 18 26 55 74 75  6a 9d ff d7 0a 5b 19 a8  |....&Utuj....[..|
+00000100  c4 c7 66 2c 5b 94 09 0a  f7 f4 3b 2b 22 e0 89 6b  |..f,[.....;+"..k|
+00000110  2f 98 fa 03 55 3e 2d 08  ba 40 94 15 37 53 8a 0e  |/...U>-..@..7S..|
+00000120  8a da 06 d7 26 a9 ae e0  f4 b3 d2 33 37 06 8d 76  |....&......37..v|
+00000130  24 63 42 33 65 ad dd 23  c3 cb b3 6f 8c 0c ee be  |$cB3e..#...o....|
+00000140  63 1a 61 13 29 2a af 74  67 6a 19 d7 22 12 8a dc  |c.a.)*.tgj.."...|
+00000150  ce 77 81 26 b1 1a 2b 5d  77 0c 9a 65 6d 75 f0 90  |.w.&..+]w..emu..|
+00000160  95 66 84 3d d6 fd 95 c5  dd fd 80 5b 8e ab 1b 0b  |.f.=.......[....|
+00000170  f1 f0 b9 8c fc e2 3b ce  05 03 ef dc 4b 08 69 af  |......;.....K.i.|
+00000180  22 58 7b ab 6b cf 8e 63  40 e4 8d c3 5c f4 29 cc  |"X{.k..c@...\.).|
+00000190  d7 d2 17 94 af a3 ff 31  e4 75 78 c5 17 fb 84 f5  |.......1.ux.....|
+000001a0  e0 4b f8 70 3d 57 e0 dc  70 c5 5e 44 5a ea 2a 33  |.K.p=W..p.^DZ.*3|
+000001b0  22 47 a3 e4 7a 95 d6 10  7e 6f 87 b4 bc 5a 9a ba  |"G..z...~o...Z..|
+000001c0  99 af 7c 0d 6f 4d cc c7  0d 12 c9 99 e1 d7 90 2d  |..|.oM.........-|
+000001d0  8c 7b 24 11 c6 3e d0 16  fb a5 87 06 8f b5 e3 a5  |.{$..>..........|
+000001e0  f2 e5 d4 76 09 9e 9f ec  ef 58 b0 34 9c ff 21 aa  |...v.....X.4..!.|
+000001f0  48 a0 c8 2e ca 2d 8a cc  ad aa 9a 07 bd cc e4 12  |H....-..........|
+00000200  cd 33 5d b2 a7 95 a2 8c  e0 74 5b 6f e3 dd ce af  |.3]......t[o....|
+00000210  05 8a fe 52 d8 23 b8 70  bd 45 90 38 05 bf d5 89  |...R.#.p.E.8....|
+00000220  0f 4b 08 83 03 07 f0 24  bc 9d a9 d7 f4 0a 2b 94  |.K.....$......+.|
+00000230  82 f1 7a 3b 49 85 06 0e  d9 e6 c8 7c 69 f9 f6 61  |..z;I......|i..a|
+00000240  34 0e 6e 8c c5 76 18 f0  88 22 a0 3d b5 9a 92 55  |4.n..v...".=...U|
+00000250  88 37 ff 06 53 a9 64 4c  7d 12 c8 ac 72 de 74 d6  |.7..S.dL}...r.t.|
+00000260  62 ea 27 f5 e8 d1 09 a2  b1 df 1d 32 d3 15 b0 52  |b.'........2...R|
+00000270  98 fd 24 0b dd 33 0a 88  92 d1 cf c5 1a ef 27 8a  |..$..3........'.|
+00000280  7d b2 59 74 97 24 9c c3  cc 0e 1c a5 26 c7 5a 10  |}.Yt.$......&.Z.|
+00000290  0d be 10 b2 bc 79 76 21  b5 b7 48 24 59 08 41 4d  |.....yv!..H$Y.AM|
+000002a0  3c 31 ad cf 02 4b ed a5  fb 0d d7 55 60 fa cf 04  |<1...K.....U`...|
+000002b0  dd 84 0c 0b e9 eb ea 6d  e2 33 9d 04 1d 0b fe b1  |.......m.3......|
+000002c0  e2 cd 2d c8 84 2d be fd  ae 9e 1a 61 70 b9 d4 6e  |..-..-.....ap..n|
+000002d0  74 9f 68 b3 60 aa 42 bc  98 8d d7 45 f4 3b 00 2b  |t.h.`.B....E.;.+|
+000002e0  0d 55 f4 14 5d 9a ab f9  d1 af 9c b3 18 e3 8d f9  |.U..]...........|
+000002f0  8d 11 89 3e e7 6a f2 b8  52 fd 67 71 37 b4 ec c1  |...>.j..R.gq7...|
+00000300  6f d9 d6 57 67 4d 05 48  22 3a 4b 79 3b 2c 70 17  |o..WgM.H":Ky;,p.|
+00000310  03 03 00 a3 c6 8b 11 15  2c 6f 55 2f 96 01 24 f1  |........,oU/..$.|
+00000320  bd c2 79 09 2f d3 ff 9a  bb a4 b8 f5 f3 fe 85 d7  |..y./...........|
+00000330  7a 21 b9 92 e6 b5 89 c9  fb fb e2 4a 8f 5a 5c 63  |z!.........J.Z\c|
+00000340  7d 8c 4e 9a 27 1b 4a bb  e4 bb f0 cf 3f 5c c6 db  |}.N.'.J.....?\..|
+00000350  d8 83 bf 57 be ac ed 5f  1a 2c 10 77 7c b7 70 0f  |...W..._.,.w|.p.|
+00000360  4b 2d 93 e5 46 d1 75 fa  e4 da 73 c2 72 d6 48 6f  |K-..F.u...s.r.Ho|
+00000370  0d 21 eb 9d 2b d3 12 d9  d1 3c 9b 56 c3 90 2d 1b  |.!..+....<.V..-.|
+00000380  79 9a ab e8 2c 55 0e 67  0b 58 f8 ac 24 3a 6c a5  |y...,U.g.X..$:l.|
+00000390  34 29 30 6a b3 84 5a bc  59 f8 9c 07 75 b1 e8 ed  |4)0j..Z.Y...u...|
+000003a0  80 96 11 ad da 74 3b d8  9c 5c 71 8f a6 30 ad 77  |.....t;..\q..0.w|
+000003b0  e7 64 13 50 5e 76 ef 17  03 03 00 35 b3 db 05 94  |.d.P^v.....5....|
+000003c0  08 9b e0 1d 45 12 11 c7  b0 5e 61 ac a0 e7 8e 80  |....E....^a.....|
+000003d0  30 7f 20 19 69 da 73 06  a5 dd 7c 85 4e fa cc 37  |0. .i.s...|.N..7|
+000003e0  2c f8 4e fd ce 2b 4b f4  fd 68 de 23 15 36 00 8c  |,.N..+K..h.#.6..|
+000003f0  e7                                                |.|
 >>> Flow 3 (client to server)
-00000000  14 03 03 00 01 01 17 03  03 02 11 6a 55 c4 ff 7a  |...........jU..z|
-00000010  5b c4 b7 cb 8d ad ae 53  53 3d 41 3a fc 16 44 fd  |[......SS=A:..D.|
-00000020  c8 5f 39 c3 5e 6b ee 7d  ea 88 9c a9 78 f9 dc 51  |._9.^k.}....x..Q|
-00000030  b2 90 68 7d ae 2c b7 90  6e 79 cf f4 97 50 95 87  |..h}.,..ny...P..|
-00000040  f1 f6 2c 14 bc 2b a3 68  0d e6 c8 66 2f 3b 89 72  |..,..+.h...f/;.r|
-00000050  67 4d d8 e9 8d 6a 89 2a  f9 e4 c1 b5 c0 92 16 25  |gM...j.*.......%|
-00000060  61 a6 98 ec b6 6b 52 8b  a5 80 5a 9e 6d 03 ad 42  |a....kR...Z.m..B|
-00000070  a9 46 2f d8 e5 67 c9 8d  89 f7 34 93 82 7c a3 bb  |.F/..g....4..|..|
-00000080  48 62 06 90 5c 5a aa fd  7c 71 88 24 22 f9 6a 2c  |Hb..\Z..|q.$".j,|
-00000090  d1 d9 7e 0a 4c 39 11 e8  c0 17 1d 83 64 f2 2b c6  |..~.L9......d.+.|
-000000a0  c0 81 8c 6a 39 a9 09 aa  1e 58 eb 30 88 59 4d f2  |...j9....X.0.YM.|
-000000b0  d2 64 9f 4c 90 29 c0 66  94 e3 df 12 9c 75 33 24  |.d.L.).f.....u3$|
-000000c0  fb 14 bc 70 e1 b5 de 54  28 b0 3f 01 2c 2e 5f 35  |...p...T(.?.,._5|
-000000d0  e3 01 59 2a 3f ce ca 11  bb 29 97 03 f6 f4 30 b9  |..Y*?....)....0.|
-000000e0  66 db 3c f7 06 41 7b e8  f8 af 3e 03 65 2f 5f 88  |f.<..A{...>.e/_.|
-000000f0  fd 30 45 7a c9 b4 9f bf  03 eb c9 dd 06 ac 82 06  |.0Ez............|
-00000100  e8 81 8e ea 29 45 78 5c  0f 8e 21 8a fb 0b 95 c1  |....)Ex\..!.....|
-00000110  63 e9 18 c1 9a a4 c6 7d  56 4b 9a de 96 dd 37 54  |c......}VK....7T|
-00000120  92 ef 71 42 a8 66 e7 df  e7 ea ec 4e 3c b3 8e 7d  |..qB.f.....N<..}|
-00000130  ed 92 da 86 e5 fa 51 f8  e4 b0 09 f3 06 4d 38 f1  |......Q......M8.|
-00000140  d5 5f d2 72 1e 5f c3 1e  1d fd 96 70 e7 9c ae ea  |._.r._.....p....|
-00000150  62 ce e4 a9 31 34 47 bc  f0 9f 1c c7 b6 66 f0 70  |b...14G......f.p|
-00000160  7a e1 c5 a9 76 64 d4 25  0f 56 cd 36 17 67 bd 4d  |z...vd.%.V.6.g.M|
-00000170  c7 78 d8 23 46 4b ac 46  34 1a d2 2d c5 e6 67 55  |.x.#FK.F4..-..gU|
-00000180  11 ec 8c f0 67 84 bf 89  ce 3c 71 4e 3a ab ff 22  |....g....<qN:.."|
-00000190  59 23 00 54 4b b6 9e c4  01 a1 9f e1 46 a6 a6 f3  |Y#.TK.......F...|
-000001a0  24 58 0c b4 6e 85 4c c1  8a d6 f8 02 c9 54 fb 85  |$X..n.L......T..|
-000001b0  c7 63 9b 47 28 10 a0 2d  b6 c2 83 16 71 ae a7 c2  |.c.G(..-....q...|
-000001c0  e0 dc 8b 6d 57 e0 4b a2  a8 5d 4d 8b ed 72 31 d6  |...mW.K..]M..r1.|
-000001d0  54 33 78 df bb 4a f9 58  9f 8c 2b 11 36 29 a0 f0  |T3x..J.X..+.6)..|
-000001e0  8a 95 20 d8 f1 8c 08 e1  54 0a 81 79 33 20 23 de  |.. .....T..y3 #.|
-000001f0  34 c8 2b 45 3a 59 c5 78  39 65 ea 70 e2 fe 59 4c  |4.+E:Y.x9e.p..YL|
-00000200  ed 7f 07 07 25 a7 ff fa  c9 c3 1f 33 55 c4 16 bb  |....%......3U...|
-00000210  c9 b9 e0 2e ff 94 7c de  84 30 60 d6 17 03 03 00  |......|..0`.....|
-00000220  99 53 44 d2 12 38 c4 a7  7e f5 f5 67 b3 79 cf 8a  |.SD..8..~..g.y..|
-00000230  34 0f 5d 49 0f bb 5f 30  c8 36 13 61 8d b5 b1 b0  |4.]I.._0.6.a....|
-00000240  dc 73 2f 1a 51 2f d4 8e  25 71 e1 46 af 11 96 19  |.s/.Q/..%q.F....|
-00000250  f7 fe 09 d9 6e 70 d5 fc  b9 5b 1c ae ed 06 37 af  |....np...[....7.|
-00000260  a1 bf 35 c6 6b 30 33 a2  c4 f6 c8 d4 73 34 73 8e  |..5.k03.....s4s.|
-00000270  69 08 be 91 2c 8d 01 52  30 14 b3 d3 a0 7d 8a 9d  |i...,..R0....}..|
-00000280  e9 af b2 77 64 eb 16 c1  8e 19 72 ad 4a fd d4 c9  |...wd.....r.J...|
-00000290  08 d0 54 6c f1 06 8c 70  2f e6 ef 23 23 67 96 db  |..Tl...p/..##g..|
-000002a0  5f aa 81 6c 41 17 6b f4  30 ce 00 d6 a2 d8 28 f8  |_..lA.k.0.....(.|
-000002b0  be 9f 04 94 fa e3 fa 76  d0 30 17 03 03 00 35 9b  |.......v.0....5.|
-000002c0  43 c4 8f dc b7 a1 44 4e  00 66 0a 95 a6 d7 46 79  |C.....DN.f....Fy|
-000002d0  30 2d 57 51 4e 21 a7 ed  43 e7 22 2d eb 07 9b 7d  |0-WQN!..C."-...}|
-000002e0  ea a4 ff 14 5d 97 1f d5  e8 f1 3d 8d e3 13 b6 79  |....].....=....y|
-000002f0  36 ce 83 e8 17 03 03 00  17 d5 98 a6 a3 b7 40 2b  |6.............@+|
-00000300  26 87 2f 4f 64 95 f1 2d  e0 7b e3 98 c2 81 dc 7b  |&./Od..-.{.....{|
-00000310  17 03 03 00 13 5b ab 65  e4 b1 d0 bd e9 c6 b2 3a  |.....[.e.......:|
-00000320  4b 66 ce eb 25 0c bc 7d                           |Kf..%..}|
+00000000  14 03 03 00 01 01 17 03  03 02 11 ee 00 8e e7 34  |...............4|
+00000010  b5 6f 32 2e e9 11 e3 7f  24 ff 64 6a 47 04 6d f7  |.o2.....$.djG.m.|
+00000020  3a 92 d5 45 12 92 c7 67  ea 91 31 9e 6e 61 a1 52  |:..E...g..1.na.R|
+00000030  9c e6 16 17 d3 8e 9e 41  85 1f a5 6a 69 97 53 f8  |.......A...ji.S.|
+00000040  35 b8 81 43 af 59 25 fc  78 42 b4 6f c1 4b 54 e2  |5..C.Y%.xB.o.KT.|
+00000050  e1 c1 97 b5 74 ea c8 b7  42 20 b2 42 27 68 7d f7  |....t...B .B'h}.|
+00000060  8c e0 18 53 46 e1 fc 86  55 bc 28 8a e1 95 94 24  |...SF...U.(....$|
+00000070  d4 38 80 a7 7e 85 2c a9  81 c2 4b c7 51 d5 0f 1f  |.8..~.,...K.Q...|
+00000080  88 8a 93 7d 74 53 1e f3  2b b6 b3 4a b5 a8 0c ea  |...}tS..+..J....|
+00000090  c4 6e 10 c3 8f ac 96 2f  c5 6b 63 f0 11 b0 38 81  |.n...../.kc...8.|
+000000a0  16 3c 96 fb d0 e9 18 5a  08 a0 f4 5e f0 6d 01 ff  |.<.....Z...^.m..|
+000000b0  13 04 c3 f7 e8 23 2a 06  32 6d 2b f1 d4 cc 60 ab  |.....#*.2m+...`.|
+000000c0  c9 9e c8 08 1d 8a 06 ff  7f 26 e1 db 13 d5 cd 3e  |.........&.....>|
+000000d0  5f 61 11 9b 43 cc 1e 19  32 6e 01 f0 79 3e cb 02  |_a..C...2n..y>..|
+000000e0  7d 4c 27 ee b0 4a 24 44  c7 ff 16 e5 59 c0 b1 2f  |}L'..J$D....Y../|
+000000f0  9a f6 c5 39 1f f2 f3 f0  70 89 e3 cb a4 43 81 16  |...9....p....C..|
+00000100  40 dd e2 3a e1 12 be 29  64 cb f3 f9 20 2c c9 62  |@..:...)d... ,.b|
+00000110  84 9c 31 fb 9b 95 a4 ac  3e 1d f4 19 bb 0a ce 89  |..1.....>.......|
+00000120  3a 33 9e 40 2b da 42 5c  71 59 54 bb 65 de eb 9e  |:3.@+.B\qYT.e...|
+00000130  71 46 40 9f 3d 6d 88 3a  0d b9 08 63 7d 4f a3 5b  |qF@.=m.:...c}O.[|
+00000140  9a 67 03 a0 d9 c6 47 4b  3b 11 d0 7b 13 fb 93 d1  |.g....GK;..{....|
+00000150  fc 63 dc 45 f2 b4 8b 22  12 31 20 48 6e 9a 4e 7d  |.c.E...".1 Hn.N}|
+00000160  3f 7e cd 09 6a ea 5f a1  0a e5 d8 80 c0 ed 6a cb  |?~..j._.......j.|
+00000170  0a af 1e 8f 88 63 63 13  49 02 d9 01 87 03 4f 9f  |.....cc.I.....O.|
+00000180  cc a2 5f 2f a8 3d 2b 9f  a2 f0 81 b5 b0 d2 92 6c  |.._/.=+........l|
+00000190  8f 3b f6 5c 66 27 d4 98  6e 86 e5 a5 ab 3c 1b b8  |.;.\f'..n....<..|
+000001a0  eb cb 72 d9 6c d8 49 9a  33 db 75 e6 3f ff 2a b0  |..r.l.I.3.u.?.*.|
+000001b0  77 c6 02 f1 c0 a5 74 99  42 42 e8 97 b5 27 a9 11  |w.....t.BB...'..|
+000001c0  af b7 65 b3 a8 51 dd 44  35 6e 0c 34 d5 b2 38 75  |..e..Q.D5n.4..8u|
+000001d0  f0 cf 10 ff 5a 7a 16 ca  bd 44 e8 99 91 50 9f db  |....Zz...D...P..|
+000001e0  8c ff 54 3a 24 73 de d1  29 5a 49 fc b3 d0 31 80  |..T:$s..)ZI...1.|
+000001f0  6f 16 84 c1 83 cf 9d 75  d4 b5 a5 a0 a0 15 bc 03  |o......u........|
+00000200  38 61 89 f5 16 98 25 f0  e8 72 28 3e d4 d6 64 66  |8a....%..r(>..df|
+00000210  de ff be 71 34 7c b1 63  38 38 81 03 17 03 03 00  |...q4|.c88......|
+00000220  99 3d e0 6d 2f 4c 22 62  d8 5f 0b 53 8a 99 c4 b2  |.=.m/L"b._.S....|
+00000230  66 88 d0 71 0c 90 b3 2e  9c 24 d1 89 4d f0 4d 29  |f..q.....$..M.M)|
+00000240  a7 11 87 db 08 cd 04 6c  1f 60 54 12 47 83 c7 82  |.......l.`T.G...|
+00000250  be 1b d8 ed 2f 43 c1 cf  63 21 bc 21 80 ad 7b ed  |..../C..c!.!..{.|
+00000260  5c 0b 41 0d 5e 63 eb 82  15 69 d7 11 c4 3f 0d fb  |\.A.^c...i...?..|
+00000270  07 96 34 a9 2c 9f 7f d7  fa 2c 24 c8 52 59 c3 07  |..4.,....,$.RY..|
+00000280  03 c7 88 65 8a 20 f2 1a  23 f8 18 2e 94 c6 be 77  |...e. ..#......w|
+00000290  bc 6e ff 7e 83 3e 9f 1f  77 b5 2b 67 e9 3d 03 c7  |.n.~.>..w.+g.=..|
+000002a0  b4 be 58 d1 12 69 39 3c  2d b3 dd 2e fb 41 b3 0b  |..X..i9<-....A..|
+000002b0  b2 74 d0 80 8a 90 40 ab  59 30 17 03 03 00 35 ef  |.t....@.Y0....5.|
+000002c0  7c c8 f8 01 6b 69 36 b2  26 9f 65 d8 a8 04 8a 41  ||...ki6.&.e....A|
+000002d0  58 e3 7a 6d 55 94 ec 09  df 6a a8 0d 86 54 c3 00  |X.zmU....j...T..|
+000002e0  a8 c2 46 e1 c0 83 fd 16  40 98 b3 5d c6 cc dc 3f  |..F.....@..]...?|
+000002f0  c2 4f 95 61 17 03 03 00  17 39 cc 91 bc 98 39 0c  |.O.a.....9....9.|
+00000300  1c 43 3c b5 cb 3b c0 99  68 9c 31 b5 1a d0 41 f9  |.C<..;..h.1...A.|
+00000310  17 03 03 00 13 65 9c ec  ea 6e ac de 8c aa 1d 5e  |.....e...n.....^|
+00000320  ff 7f 0d 3e 84 7a 90 6a                           |...>.z.j|
diff --git a/src/crypto/tls/testdata/Client-TLSv13-ClientCert-RSA-RSAPSS b/src/crypto/tls/testdata/Client-TLSv13-ClientCert-RSA-RSAPSS
index 2367a39..ec18187 100644
--- a/src/crypto/tls/testdata/Client-TLSv13-ClientCert-RSA-RSAPSS
+++ b/src/crypto/tls/testdata/Client-TLSv13-ClientCert-RSA-RSAPSS
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fe 01 00 00  fa 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 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,137 +7,138 @@
 00000050  cc a8 c0 2b c0 2f c0 2c  c0 30 c0 09 c0 13 c0 0a  |...+./.,.0......|
 00000060  c0 14 00 9c 00 9d 00 2f  00 35 c0 12 00 0a c0 23  |......./.5.....#|
 00000070  c0 27 00 3c c0 07 c0 11  00 05 13 03 13 01 13 02  |.'.<............|
-00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
+00000080  01 00 00 7f 00 05 00 05  01 00 00 00 00 00 0a 00  |................|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
 000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
 000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
-000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
-000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
-000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
-000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
+000000c0  01 00 01 00 00 17 00 00  00 12 00 00 00 2b 00 09  |.............+..|
+000000d0  08 03 04 03 03 03 02 03  01 00 33 00 26 00 24 00  |..........3.&.$.|
+000000e0  1d 00 20 2f e5 7d a3 47  cd 62 43 15 28 da ac 5f  |.. /.}.G.bC.(.._|
+000000f0  bb 29 07 30 ff f6 84 af  c4 cf c2 ed 90 99 5f 58  |.).0.........._X|
+00000100  cb 3b 74                                          |.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 7a 02 00 00  76 03 03 a9 f1 13 c3 3c  |....z...v......<|
-00000010  1c dd c9 3a a1 ad 92 92  f1 f4 16 39 be 14 64 9c  |...:.......9..d.|
-00000020  66 d8 28 cd b7 bb 40 43  ec f4 67 20 00 00 00 00  |f.(...@C..g ....|
+00000000  16 03 03 00 7a 02 00 00  76 03 03 60 e7 99 c9 b0  |....z...v..`....|
+00000010  be be 74 84 1e 55 cd 83  d6 0d ba 9c a0 44 fb b4  |..t..U.......D..|
+00000020  a8 f6 3c 93 12 de 47 4a  7f 32 a6 20 00 00 00 00  |..<...GJ.2. ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000040  00 00 00 00 00 00 00 00  00 00 00 00 13 03 00 00  |................|
-00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 ff  |..+.....3.$... .|
-00000060  53 ac b3 b0 48 47 d0 1e  b1 70 eb dd 02 e5 e8 07  |S...HG...p......|
-00000070  ce c7 e0 af d7 e0 46 c7  ff f5 97 30 e5 80 5b 14  |......F....0..[.|
-00000080  03 03 00 01 01 17 03 03  00 17 0b 12 ef 6d ea 5e  |.............m.^|
-00000090  71 41 83 d6 35 9f 39 2c  f0 ab 01 e9 03 54 c6 9e  |qA..5.9,.....T..|
-000000a0  37 17 03 03 00 20 15 7a  35 f4 a6 6e 65 89 10 ae  |7.... .z5..ne...|
-000000b0  18 31 c0 0c 15 1c b8 c5  5d f3 54 0c 98 32 a4 5e  |.1......].T..2.^|
-000000c0  91 f7 03 8a 80 b9 17 03  03 02 7a fa 93 7f c6 d1  |..........z.....|
-000000d0  2f 7e 2d d6 1b b7 ff fd  96 6e a1 f7 0e 98 dc 77  |/~-......n.....w|
-000000e0  cc 6a 4e 91 3d c1 ad 4b  5c 28 ee ea a7 0a ce 8f  |.jN.=..K\(......|
-000000f0  51 dd 89 fd 5a 81 6d 21  d6 0d 35 70 84 73 8c fa  |Q...Z.m!..5p.s..|
-00000100  2e 7a e0 af ab 79 79 aa  67 2b 80 a8 b3 a8 fb 0d  |.z...yy.g+......|
-00000110  eb 87 66 d5 be 33 0b f0  80 b8 5e 21 84 be 25 fe  |..f..3....^!..%.|
-00000120  47 98 5a 26 5d c3 96 2e  c5 b8 da 9f a6 d4 ca bb  |G.Z&]...........|
-00000130  de 7f 2c 0a 28 a8 f3 41  bc a2 2e 70 f2 b3 6f a3  |..,.(..A...p..o.|
-00000140  10 0e 1f 11 af 11 50 2b  22 84 97 d7 80 f5 62 77  |......P+".....bw|
-00000150  a6 94 47 22 ef 24 c6 0e  dc 5c f5 40 08 f7 21 78  |..G".$...\.@..!x|
-00000160  ae 11 f3 d8 a5 d8 20 ac  90 73 d7 a2 e3 f0 08 57  |...... ..s.....W|
-00000170  fc 74 70 66 fd 3d 49 c7  99 37 98 5e b1 1c c4 38  |.tpf.=I..7.^...8|
-00000180  64 09 e6 70 b6 8b 00 72  2d 5b b4 70 39 d6 e9 d5  |d..p...r-[.p9...|
-00000190  dc cd 8e 01 eb 5f 34 61  d0 97 62 0b 4f 81 ed 30  |....._4a..b.O..0|
-000001a0  64 56 f2 6e 31 5e 24 e8  56 2b d6 31 54 c4 48 47  |dV.n1^$.V+.1T.HG|
-000001b0  16 00 a7 65 c1 fa ea 12  30 78 41 e7 30 2d 71 cf  |...e....0xA.0-q.|
-000001c0  b0 e9 be e4 a2 33 38 87  2d 37 14 2d 03 cf ae 87  |.....38.-7.-....|
-000001d0  9a 09 f2 ed f3 44 66 c3  8a 56 8e e4 c4 aa e9 f7  |.....Df..V......|
-000001e0  cd 75 52 1b d9 ed 66 04  13 dd dd cf 0f 44 cd 18  |.uR...f......D..|
-000001f0  68 c5 2c 4c f9 e3 d3 02  12 78 38 5c f6 96 d7 80  |h.,L.....x8\....|
-00000200  f0 83 03 fe 7a e0 35 7e  a3 ad 99 52 ec fc ee 74  |....z.5~...R...t|
-00000210  f5 09 0f ca 69 f0 fb d0  40 90 1b 46 9e 2d 62 c9  |....i...@..F.-b.|
-00000220  0f 59 b2 cc a0 4a 9b 84  14 3a 1b 51 fc e7 e8 a1  |.Y...J...:.Q....|
-00000230  26 fd 20 8c 88 6f 87 11  ae 97 76 f8 4b cc 67 1a  |&. ..o....v.K.g.|
-00000240  3e 58 65 77 77 82 06 c0  d4 41 4e 66 d2 5a 83 b1  |>Xeww....ANf.Z..|
-00000250  ee 19 5d 7b 99 34 d3 2f  6c bd 30 a3 8c 75 89 ec  |..]{.4./l.0..u..|
-00000260  cb 90 8b 89 05 b8 e4 6e  3b 60 5d 0e 19 8f d6 c7  |.......n;`].....|
-00000270  86 f0 a9 2b c7 12 4a 4c  d8 a5 e8 64 49 1d 49 99  |...+..JL...dI.I.|
-00000280  a7 80 01 f0 77 57 4a 78  3c ac 38 40 bb d2 10 24  |....wWJx<.8@...$|
-00000290  9d e2 29 b2 1e 4b 50 66  64 07 79 80 c7 81 9d e2  |..)..KPfd.y.....|
-000002a0  f5 a9 10 9a 8d 3b de 0e  21 85 13 ac 26 30 f9 e4  |.....;..!...&0..|
-000002b0  a6 f9 8f e0 3c c1 69 7e  11 4c d1 a8 4e 88 30 fc  |....<.i~.L..N.0.|
-000002c0  52 6e b0 4f b6 7e 15 9e  a5 8a 46 ca 1f ac 8e 2a  |Rn.O.~....F....*|
-000002d0  07 34 d7 c2 14 c6 c1 ed  a1 f9 1e 59 b4 b4 86 3e  |.4.........Y...>|
-000002e0  d3 d0 78 a6 07 62 d3 88  80 54 a8 2a e9 38 2e 58  |..x..b...T.*.8.X|
-000002f0  43 94 cc ed f0 46 f6 cc  4b 7a b8 f5 a2 d6 a8 36  |C....F..Kz.....6|
-00000300  e2 8e 11 fb e7 21 19 c5  fa c9 90 98 72 43 88 ac  |.....!......rC..|
-00000310  c0 56 84 9e cd b7 e5 26  d6 49 19 88 a5 12 ac 49  |.V.....&.I.....I|
-00000320  5d 77 37 2a ff 38 5a 7a  5b c8 74 5d 74 fc 22 7f  |]w7*.8Zz[.t]t.".|
-00000330  46 97 2b 34 32 fb 83 65  75 b6 8b 5c 8a b1 d4 a2  |F.+42..eu..\....|
-00000340  14 7f 46 0d 63 17 03 03  00 99 c7 79 bb 4f 88 a0  |..F.c......y.O..|
-00000350  78 be 04 ca 39 1f 1f a8  82 59 b5 dd 96 93 0d c4  |x...9....Y......|
-00000360  30 f4 22 4c e2 52 51 d4  33 b8 35 7b ed 01 19 25  |0."L.RQ.3.5{...%|
-00000370  b5 31 36 25 23 a2 51 d9  7a a9 00 72 05 34 81 62  |.16%#.Q.z..r.4.b|
-00000380  d0 df 8b 3a 65 98 4e 87  e2 29 9b 44 77 8c dd c9  |...:e.N..).Dw...|
-00000390  4c a5 de 14 97 e0 f1 2c  e8 5d 0e 8f d0 fd f6 77  |L......,.].....w|
-000003a0  c1 1f ac 79 4d 32 19 09  98 a8 f0 2f 3e d5 7e f7  |...yM2...../>.~.|
-000003b0  aa c1 f0 36 b1 8e c7 0b  ce 09 00 ac 28 64 c0 33  |...6........(d.3|
-000003c0  58 cc 48 3a 15 a4 77 24  50 67 f2 39 53 4d 63 23  |X.H:..w$Pg.9SMc#|
-000003d0  48 74 bd 0a c8 02 17 be  e4 64 af 6e 02 a9 22 92  |Ht.......d.n..".|
-000003e0  65 04 c6 17 03 03 00 35  e0 4e 15 4b 9d 53 57 c6  |e......5.N.K.SW.|
-000003f0  97 b4 9d 1a 03 39 26 b9  ca 5b 04 50 af db 52 99  |.....9&..[.P..R.|
-00000400  d9 13 40 6a 89 23 99 42  9a 91 1d d1 6c 07 a0 aa  |..@j.#.B....l...|
-00000410  05 6e 60 0b fd e7 de 32  c3 97 18 0d 9b           |.n`....2.....|
+00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 1d  |..+.....3.$... .|
+00000060  6d 42 7d 8f 02 04 a1 81  8a eb 36 fd 64 4b d1 6c  |mB}.......6.dK.l|
+00000070  98 e8 69 82 2e 92 7a 27  53 4f 74 bb 68 f2 7d 14  |..i...z'SOt.h.}.|
+00000080  03 03 00 01 01 17 03 03  00 17 2d 08 0f 31 27 58  |..........-..1'X|
+00000090  7b 40 eb cc 81 b9 7b 78  b4 c1 60 1e 10 74 3e f7  |{@....{x..`..t>.|
+000000a0  dc 17 03 03 00 20 af 35  53 ab e6 10 47 24 e5 79  |..... .5S...G$.y|
+000000b0  70 53 da 8e a2 bf 9a 81  ab 4d ba 80 09 40 e4 02  |pS.......M...@..|
+000000c0  8c cb cc 78 1c d4 17 03  03 02 7a 9a eb 2c 4f f5  |...x......z..,O.|
+000000d0  1a b9 d5 bc 47 d1 bc 35  47 07 66 bf 6d c9 35 b2  |....G..5G.f.m.5.|
+000000e0  b2 78 ef 18 22 9a e4 fa  b4 f8 12 0e fd aa a4 f7  |.x.."...........|
+000000f0  9f f6 5b 2a 7b 05 c1 52  f8 2e 53 84 6c ef 51 e7  |..[*{..R..S.l.Q.|
+00000100  4f e2 f5 e9 4b 20 da 94  5d 97 bb c2 66 fb 74 38  |O...K ..]...f.t8|
+00000110  d6 15 0c c9 6e c6 67 ac  ad 6f 4d d2 bf a2 13 29  |....n.g..oM....)|
+00000120  87 69 9b 4d cd 2e 83 60  db 5f ee f3 80 64 02 93  |.i.M...`._...d..|
+00000130  4f 1e 35 0b 01 25 1f cd  27 24 7a 82 8d 00 94 3a  |O.5..%..'$z....:|
+00000140  34 b0 f2 53 36 0b f6 04  d3 25 2a 4e 2a 7e 26 98  |4..S6....%*N*~&.|
+00000150  41 ce 68 64 17 c9 65 9e  f7 f9 bb df ee fb cb 74  |A.hd..e........t|
+00000160  db 7d 8a 43 d2 49 03 f6  e5 be e1 5e 45 df 77 c4  |.}.C.I.....^E.w.|
+00000170  1d 6e 9c ec 29 51 2b 7f  5e 75 46 05 50 39 5f fa  |.n..)Q+.^uF.P9_.|
+00000180  5f 53 04 56 25 87 09 26  36 8d 55 ac 03 87 35 28  |_S.V%..&6.U...5(|
+00000190  52 05 c0 23 ff d5 57 58  7a 63 09 9d 87 15 b4 35  |R..#..WXzc.....5|
+000001a0  d9 40 19 4e 67 ce cd be  5b a0 14 e2 a8 4a ad 44  |.@.Ng...[....J.D|
+000001b0  ea a9 1b 14 e7 30 05 c9  23 48 4a 7a 7a 3f cc 9a  |.....0..#HJzz?..|
+000001c0  ce ca 0e 5f a0 79 17 e0  e7 5b 30 79 38 2d 5b 1e  |..._.y...[0y8-[.|
+000001d0  5c ae 4e 1f 00 ed fb 9f  b6 e7 92 42 7d f0 30 82  |\.N........B}.0.|
+000001e0  70 18 dc 07 c1 64 ec 09  7e d7 8f eb 68 31 75 cb  |p....d..~...h1u.|
+000001f0  69 24 30 89 8b 69 df 69  86 23 77 d2 61 4b 66 7e  |i$0..i.i.#w.aKf~|
+00000200  6d 34 50 a5 da 86 12 22  e3 51 ac 6a 23 55 d4 d5  |m4P....".Q.j#U..|
+00000210  51 73 ac 85 c9 3a 57 c2  4b 55 96 4b c6 cc 62 15  |Qs...:W.KU.K..b.|
+00000220  c9 10 09 ac ec 75 1a a6  3e e8 da aa 4d fe 7d 51  |.....u..>...M.}Q|
+00000230  80 c3 a7 98 5d 29 cf c6  a0 8c 37 6e a8 f0 ad 41  |....])....7n...A|
+00000240  34 60 44 98 57 3a 97 1f  29 08 f4 fc 4e 76 2e 0b  |4`D.W:..)...Nv..|
+00000250  26 8d fa 6c 38 0e 17 8a  2c de 51 94 f5 37 63 a0  |&..l8...,.Q..7c.|
+00000260  40 71 51 c0 b9 d4 04 b2  ef 88 80 8f 34 74 35 5a  |@qQ.........4t5Z|
+00000270  c4 96 68 4f 27 0c 53 db  f4 3c d1 88 86 b2 24 4f  |..hO'.S..<....$O|
+00000280  c7 a7 d9 b4 56 22 e5 9d  3f ec eb 1a af 77 9a 47  |....V"..?....w.G|
+00000290  26 bb d5 3d 90 1d 6d fb  d9 29 7e b4 b2 b2 ec 10  |&..=..m..)~.....|
+000002a0  67 de d2 02 74 b3 91 a0  c4 b3 7c ba bb 90 b5 da  |g...t.....|.....|
+000002b0  97 fb 84 cd 4b 5e 33 c0  0a 56 73 98 8c 81 5b 9d  |....K^3..Vs...[.|
+000002c0  8d 83 df c3 8d 3d 3c 58  55 a3 e7 bd ef d0 37 0b  |.....=<XU.....7.|
+000002d0  1d 0d 6d 59 81 d7 5d 34  b3 c9 bd ea 96 9a 33 02  |..mY..]4......3.|
+000002e0  50 6d 81 1f 58 36 95 0c  c0 6d b6 3e 2e e0 0a b7  |Pm..X6...m.>....|
+000002f0  c8 ae d8 84 06 2c 64 3c  35 a7 39 e4 a6 9e 0c 59  |.....,d<5.9....Y|
+00000300  89 59 9a dd c3 fb 6c ae  34 ec 66 c5 d5 1f 7b 13  |.Y....l.4.f...{.|
+00000310  66 23 8d 22 93 da 53 6c  3f 85 bb 5c 52 75 ba 81  |f#."..Sl?..\Ru..|
+00000320  e8 bf 57 ce a8 45 68 ad  57 2f 4e 51 d3 65 f3 d0  |..W..Eh.W/NQ.e..|
+00000330  1f 09 1e 3f 5e a1 9e 56  61 ca 88 e7 44 f6 f6 93  |...?^..Va...D...|
+00000340  cb ae 28 2b 74 17 03 03  00 99 de 30 0f 41 8e d8  |..(+t......0.A..|
+00000350  37 a0 c4 f3 af c3 f8 39  b7 44 83 6a c4 11 9e a4  |7......9.D.j....|
+00000360  a9 f0 08 22 77 ce 09 a3  2d 94 99 2a c7 1b 9c 25  |..."w...-..*...%|
+00000370  b6 79 ec 7b 2f 70 6a bd  2f f0 0f e0 6d 6e c0 69  |.y.{/pj./...mn.i|
+00000380  0c 52 13 1f f9 99 97 04  2f fc fb f8 0a 4b ab bc  |.R....../....K..|
+00000390  a3 00 02 7f 0f 30 e2 66  c2 df 63 69 ad 08 76 ec  |.....0.f..ci..v.|
+000003a0  58 99 42 6a 11 e6 7a 27  57 98 71 c9 4d 78 c8 4a  |X.Bj..z'W.q.Mx.J|
+000003b0  3a 62 59 62 fb 2b 6f 15  79 22 50 40 bf db 29 d5  |:bYb.+o.y"P@..).|
+000003c0  32 e5 e7 1e 76 50 05 e4  26 24 97 79 2a 9a a5 ec  |2...vP..&$.y*...|
+000003d0  c7 8c 68 e3 71 97 0c 85  51 74 db 5b 86 fb fb 23  |..h.q...Qt.[...#|
+000003e0  e6 ef 57 17 03 03 00 35  5c 96 e3 26 e5 49 d8 02  |..W....5\..&.I..|
+000003f0  b0 d0 4d 20 15 72 76 49  48 ee 2b 0a 19 44 05 cd  |..M .rvIH.+..D..|
+00000400  b1 0a 76 4e a9 21 45 5e  de 00 6b c3 53 7c c9 8d  |..vN.!E^..k.S|..|
+00000410  43 72 06 78 0c ce 78 0f  01 ca d1 92 e5           |Cr.x..x......|
 >>> Flow 3 (client to server)
-00000000  14 03 03 00 01 01 17 03  03 02 7a 94 78 2d 5d 5a  |..........z.x-]Z|
-00000010  3e 96 7f 19 29 51 99 f3  6e d3 a4 d5 3c 9a 3d d5  |>...)Q..n...<.=.|
-00000020  37 bc 3b 71 b3 54 83 d9  5e 9d 64 76 f9 74 7a 24  |7.;q.T..^.dv.tz$|
-00000030  e3 cb ea aa 17 f4 44 41  73 71 39 d6 9b d5 a6 a2  |......DAsq9.....|
-00000040  6a 1e 1c 02 a1 d5 e3 e8  f5 f7 07 9d 3b ea f8 6d  |j...........;..m|
-00000050  80 cf 6b 14 71 b8 bd c4  8a 07 49 31 e7 bd d5 91  |..k.q.....I1....|
-00000060  ac 80 70 25 5e f4 db 07  ed 36 c2 3a 1d ad 86 6e  |..p%^....6.:...n|
-00000070  68 1a ca 4f a1 ba c3 2f  de 49 01 fa a9 39 a6 51  |h..O.../.I...9.Q|
-00000080  3a e6 9f cf 6b 02 4e 1e  70 dd f2 10 c2 62 9b 1f  |:...k.N.p....b..|
-00000090  83 10 fa 85 52 a8 a7 08  37 9c 92 b0 9c fe 00 78  |....R...7......x|
-000000a0  0b a4 7b b5 f9 9f 87 d2  d3 07 72 b2 ab 96 9e 73  |..{.......r....s|
-000000b0  55 3c 1e 65 99 89 36 78  7e 42 8f 05 de b6 fb fc  |U<.e..6x~B......|
-000000c0  1b 34 18 e6 4d 15 6c d1  2f 2c b0 ef 00 e9 07 89  |.4..M.l./,......|
-000000d0  ca 91 d9 c1 73 bf 8f a5  a4 7d 7e cc f5 85 fb af  |....s....}~.....|
-000000e0  57 70 35 63 71 d6 78 57  13 48 27 ba a4 42 22 c2  |Wp5cq.xW.H'..B".|
-000000f0  56 f4 ae 38 39 a0 1f 57  44 57 c4 8a 70 90 30 70  |V..89..WDW..p.0p|
-00000100  ba 4a 98 29 0f aa e2 33  27 24 ee d9 e9 02 80 68  |.J.)...3'$.....h|
-00000110  4c 55 08 fb 3d 25 d6 d4  9d 83 ea 14 99 c2 77 94  |LU..=%........w.|
-00000120  f9 70 34 a8 ed 35 e6 4f  c2 75 50 63 d5 9d 9a 89  |.p4..5.O.uPc....|
-00000130  8f 2e 5b ca 6b b3 ad e7  a2 c6 f7 0c 45 08 b7 f4  |..[.k.......E...|
-00000140  58 d3 d5 54 c2 67 f3 76  fb fc 9d fe 42 43 ea 90  |X..T.g.v....BC..|
-00000150  2b 29 e7 10 2f d7 9c 04  c4 cc 89 8f a9 36 14 f6  |+)../........6..|
-00000160  fc f1 25 6c 90 12 bf c6  cd ad 46 ce 17 3b 26 fb  |..%l......F..;&.|
-00000170  c6 98 cb 6c f2 2c fd b9  2f 52 3e 56 42 78 0b 92  |...l.,../R>VBx..|
-00000180  a5 27 56 18 3d d6 26 3f  e4 a1 6f ce c8 f1 f1 7a  |.'V.=.&?..o....z|
-00000190  1f 84 66 c9 d9 8a 5c 0e  34 80 ba 58 b3 8b 7f f3  |..f...\.4..X....|
-000001a0  8a c9 6b c4 99 94 2c b7  e8 e8 9a a5 43 75 f8 e0  |..k...,.....Cu..|
-000001b0  29 1f 70 77 c7 4a 9f de  ca 92 88 7c 37 12 d9 ef  |).pw.J.....|7...|
-000001c0  2f 94 de ea d1 d9 69 6a  93 06 36 e0 68 02 53 ae  |/.....ij..6.h.S.|
-000001d0  0e 00 cd ad d3 10 a7 89  2c 53 a7 03 d9 07 3c e9  |........,S....<.|
-000001e0  0b b0 18 2e 03 88 03 5c  f4 b2 7e 59 f4 22 8c f7  |.......\..~Y."..|
-000001f0  5e d7 c7 ea ac 0f bc f7  3e 3f 75 fd 6d 9c 4c 3c  |^.......>?u.m.L<|
-00000200  41 8d f5 30 17 20 83 c3  27 83 ce 84 6a e3 75 2b  |A..0. ..'...j.u+|
-00000210  9d 7d de 2a bf 5a fb e1  2f 80 74 74 f6 09 bc 1f  |.}.*.Z../.tt....|
-00000220  be f0 59 9e ce a1 62 46  54 a4 9a 25 97 b7 cd 1a  |..Y...bFT..%....|
-00000230  0a d0 44 f6 ea a4 ed 63  e7 49 9a 4b f4 1a 39 91  |..D....c.I.K..9.|
-00000240  e6 34 e1 7b dd e7 53 ab  83 56 57 b2 89 3f 90 1f  |.4.{..S..VW..?..|
-00000250  98 c4 64 27 b5 f5 f6 57  16 ca d9 0a 33 de 24 c3  |..d'...W....3.$.|
-00000260  f3 7c 23 37 94 93 c5 1a  42 da 18 6b 24 dd 37 54  |.|#7....B..k$.7T|
-00000270  ae f3 8a 3e 10 42 20 6e  49 23 1a 0f bd 65 7e 45  |...>.B nI#...e~E|
-00000280  12 7a 64 9a 30 17 03 03  00 99 af 41 cf 95 21 1f  |.zd.0......A..!.|
-00000290  34 df 1c c7 a8 b6 ee 31  8d b3 9e 5a 59 8e c4 37  |4......1...ZY..7|
-000002a0  79 a4 d8 75 22 da 12 21  e5 de d4 ad 98 17 e2 ae  |y..u"..!........|
-000002b0  ae 9f f6 e8 29 66 d0 ac  b4 08 16 24 40 67 9d d5  |....)f.....$@g..|
-000002c0  bf a4 64 91 a1 17 82 c0  e7 77 b6 20 26 4a 70 1d  |..d......w. &Jp.|
-000002d0  c8 f8 ec 18 b7 c6 3c 81  b9 c6 04 9c 0d 37 a6 39  |......<......7.9|
-000002e0  fd 2d 99 d7 ba 41 a4 91  60 f1 1f d2 76 76 aa 47  |.-...A..`...vv.G|
-000002f0  89 0a d1 97 0b 91 20 a9  43 c9 ce 2c 84 ba 81 7a  |...... .C..,...z|
-00000300  39 91 7d 12 75 05 8e 87  b1 3f 80 8d 12 ca 8f 91  |9.}.u....?......|
-00000310  23 84 28 11 c3 81 ed 09  05 16 6e 50 57 76 ad 5c  |#.(.......nPWv.\|
-00000320  c5 92 77 17 03 03 00 35  5a d9 15 29 1f a3 f0 cf  |..w....5Z..)....|
-00000330  74 c4 1d 0c c3 fa 54 59  1e 54 06 0d 1b ce 07 00  |t.....TY.T......|
-00000340  f9 66 3d e1 75 10 cf de  cb 7d 0d d6 d1 4d 87 81  |.f=.u....}...M..|
-00000350  13 ec 2c 28 13 a5 b3 01  c7 86 3a 84 65 17 03 03  |..,(......:.e...|
-00000360  00 17 b4 e4 18 61 62 04  b3 ca 98 36 93 42 a2 be  |.....ab....6.B..|
-00000370  2c f5 18 11 bd 7d 64 70  bc 17 03 03 00 13 32 65  |,....}dp......2e|
-00000380  fa 07 3e 3c ed 9d 85 31  ba 8e 92 ea de 17 59 cd  |..><...1......Y.|
-00000390  db                                                |.|
+00000000  14 03 03 00 01 01 17 03  03 02 7a 98 e7 1d af de  |..........z.....|
+00000010  f0 97 05 09 b8 cc a4 5e  e2 ba 26 13 bd dd a4 de  |.......^..&.....|
+00000020  c6 fd 81 dc 0c 55 68 d8  90 32 36 e2 1d 05 15 c4  |.....Uh..26.....|
+00000030  d2 c6 2b 99 b3 22 fd 4a  15 82 34 93 f8 39 04 6c  |..+..".J..4..9.l|
+00000040  e0 d1 c3 d3 16 77 dc 51  65 f9 ac 04 1d 38 8e e7  |.....w.Qe....8..|
+00000050  10 ee 22 c6 25 6b 20 e7  1d e7 89 c1 88 ee d9 80  |..".%k .........|
+00000060  29 45 83 64 12 a6 50 18  42 04 1f 34 15 35 24 f9  |)E.d..P.B..4.5$.|
+00000070  86 0b a0 be c6 4b 9b ab  7f 07 7f 74 09 78 56 77  |.....K.....t.xVw|
+00000080  72 ef 57 52 22 14 38 ee  70 e8 93 38 b0 cc cc 13  |r.WR".8.p..8....|
+00000090  fe 3f 04 a2 af 20 f4 cf  f4 bc 22 76 54 9e 43 63  |.?... ...."vT.Cc|
+000000a0  e6 2d 77 c3 b8 b2 79 79  b8 89 86 9e 3c 01 c2 4b  |.-w...yy....<..K|
+000000b0  a7 48 3c 7b 5d 74 6e 79  88 e1 3b 73 e0 04 57 20  |.H<{]tny..;s..W |
+000000c0  f7 36 c8 1a 9a 09 b2 77  20 6d 1b 7c 01 d2 6a 66  |.6.....w m.|..jf|
+000000d0  8e 9a 14 02 ef 7d 26 52  eb 50 93 56 77 d7 04 3b  |.....}&R.P.Vw..;|
+000000e0  62 6f 9e 64 f4 f5 d6 83  f6 27 d8 37 05 cb dc 86  |bo.d.....'.7....|
+000000f0  df 7f 0a 7e bc 23 bf 5a  b4 72 b9 5e 1c 8b b5 e8  |...~.#.Z.r.^....|
+00000100  b8 d7 3e a8 72 0a 2b c0  cc b0 6b a2 f9 5a db 1d  |..>.r.+...k..Z..|
+00000110  ea 5a b1 28 d0 ad 0c db  91 45 b9 b7 cd 25 51 1b  |.Z.(.....E...%Q.|
+00000120  47 e8 9e bf 25 6b 65 a9  c7 ed 39 a1 68 49 83 55  |G...%ke...9.hI.U|
+00000130  3c 74 36 dc 71 f6 38 72  20 94 53 bf fb 0a 1c b4  |<t6.q.8r .S.....|
+00000140  80 d0 18 94 08 0f f5 a1  22 ee 4c d8 c3 b5 fa c6  |........".L.....|
+00000150  2c 53 bd 48 35 77 d9 68  9f a7 96 6d 6a fa 8e 8b  |,S.H5w.h...mj...|
+00000160  3e 13 1e 72 10 e0 0c cb  76 f9 0b 5a 2f a7 f1 63  |>..r....v..Z/..c|
+00000170  70 06 40 a8 57 46 c5 02  e1 74 71 2b e3 16 9e 6e  |p.@.WF...tq+...n|
+00000180  54 00 cc f1 9b ab e5 89  88 f8 84 47 c4 8a da 4a  |T..........G...J|
+00000190  62 d2 8d 64 8d 38 58 23  29 fa e9 41 c3 72 7b 3a  |b..d.8X#)..A.r{:|
+000001a0  5c fa b4 f5 12 be 1f cc  35 92 ec 24 8b c4 78 ef  |\.......5..$..x.|
+000001b0  3e db 36 a1 78 6c e6 51  a7 c4 1b fd bd 4d 6f b9  |>.6.xl.Q.....Mo.|
+000001c0  7d 51 c3 a5 e7 cb 2a 20  99 74 4e 1d 1a 4f 6d ce  |}Q....* .tN..Om.|
+000001d0  fb 11 77 1c e5 20 f1 0e  38 8b 5e 6c af f4 98 63  |..w.. ..8.^l...c|
+000001e0  e7 38 1c 31 62 12 0e e7  13 4b b9 ec c0 8d 84 aa  |.8.1b....K......|
+000001f0  1c 18 6e 4d 90 13 dc 01  a2 87 0e d8 b2 36 c1 d6  |..nM.........6..|
+00000200  03 f6 a0 4c 83 de 88 b2  4e 97 be 4f 75 7b fb 42  |...L....N..Ou{.B|
+00000210  84 e2 94 28 68 b0 37 4f  bc 86 5d d4 74 84 15 53  |...(h.7O..].t..S|
+00000220  a8 c8 47 86 0e fc d0 54  59 81 cb a6 c1 37 3b 1a  |..G....TY....7;.|
+00000230  2d a3 d7 2c 8c 23 f6 1f  0e 31 98 09 57 00 45 dc  |-..,.#...1..W.E.|
+00000240  35 e7 8f a7 24 74 e6 b0  3a 40 8c be e3 ff 0b 08  |5...$t..:@......|
+00000250  3d c8 3d 84 ce 2c 1c 05  81 0c b5 83 8a de 2f 9f  |=.=..,......../.|
+00000260  6a 83 88 a0 c2 9d 26 2d  0f 9e 40 33 48 b7 59 c3  |j.....&-..@3H.Y.|
+00000270  98 9c aa 3c 95 4b 86 35  02 91 dd 62 e0 2c 67 b6  |...<.K.5...b.,g.|
+00000280  65 33 09 dc b4 17 03 03  00 99 94 6d 12 c3 3d 58  |e3.........m..=X|
+00000290  0d 5d 8b 94 ba 26 20 97  12 a8 65 02 d1 d2 8c 8d  |.]...& ...e.....|
+000002a0  82 cb eb fa b3 e8 72 8b  f2 4f 17 c8 52 53 9e 83  |......r..O..RS..|
+000002b0  54 dc 84 37 be 3b 79 81  59 61 6f 67 ff cb c3 ae  |T..7.;y.Yaog....|
+000002c0  a1 9f d9 b0 a9 9d d0 8a  55 1f 58 48 a8 c6 2e c9  |........U.XH....|
+000002d0  8e 79 6d 16 1b 68 db 45  40 84 a5 6a b1 fe a6 76  |.ym..h.E@..j...v|
+000002e0  de 22 c9 a9 9a 95 a2 1d  96 86 9e 79 8f ed 0f fb  |.".........y....|
+000002f0  63 10 a0 d5 38 d5 78 e2  a6 6d 97 09 6e 17 1a 85  |c...8.x..m..n...|
+00000300  2b 51 a4 a8 59 a1 06 6b  89 37 1e 5a 99 a3 66 89  |+Q..Y..k.7.Z..f.|
+00000310  50 bc f7 49 e7 a9 82 da  ec cf eb 33 76 af 65 76  |P..I.......3v.ev|
+00000320  a5 84 93 17 03 03 00 35  5d 1d 31 e0 3b 1f 3f d6  |.......5].1.;.?.|
+00000330  6c f9 55 6e 8f 86 1f 4f  85 a1 b5 3f c3 1e 3e ff  |l.Un...O...?..>.|
+00000340  29 9c a7 1d 06 e9 de d2  98 d5 fb 37 2e e6 2e ba  |)..........7....|
+00000350  b3 77 d0 d0 e6 ef 84 4e  05 14 47 2c 5e 17 03 03  |.w.....N..G,^...|
+00000360  00 17 80 d7 97 10 67 71  db aa 0f 6f 76 86 20 37  |......gq...ov. 7|
+00000370  0e a7 f1 53 71 c1 fe f7  09 17 03 03 00 13 79 a8  |...Sq.........y.|
+00000380  bd 36 37 a9 5b b0 57 de  c7 ea 2e 71 25 62 81 ea  |.67.[.W....q%b..|
+00000390  b5                                                |.|
diff --git a/src/crypto/tls/testdata/Client-TLSv13-ECDSA b/src/crypto/tls/testdata/Client-TLSv13-ECDSA
index dac9ef7..b1d1e6a 100644
--- a/src/crypto/tls/testdata/Client-TLSv13-ECDSA
+++ b/src/crypto/tls/testdata/Client-TLSv13-ECDSA
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fe 01 00 00  fa 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 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,80 +7,81 @@
 00000050  cc a8 c0 2b c0 2f c0 2c  c0 30 c0 09 c0 13 c0 0a  |...+./.,.0......|
 00000060  c0 14 00 9c 00 9d 00 2f  00 35 c0 12 00 0a c0 23  |......./.5.....#|
 00000070  c0 27 00 3c c0 07 c0 11  00 05 13 03 13 01 13 02  |.'.<............|
-00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
+00000080  01 00 00 7f 00 05 00 05  01 00 00 00 00 00 0a 00  |................|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
 000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
 000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
-000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
-000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
-000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
-000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
+000000c0  01 00 01 00 00 17 00 00  00 12 00 00 00 2b 00 09  |.............+..|
+000000d0  08 03 04 03 03 03 02 03  01 00 33 00 26 00 24 00  |..........3.&.$.|
+000000e0  1d 00 20 2f e5 7d a3 47  cd 62 43 15 28 da ac 5f  |.. /.}.G.bC.(.._|
+000000f0  bb 29 07 30 ff f6 84 af  c4 cf c2 ed 90 99 5f 58  |.).0.........._X|
+00000100  cb 3b 74                                          |.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 7a 02 00 00  76 03 03 e3 21 e8 24 fb  |....z...v...!.$.|
-00000010  e8 fe 46 e2 54 a7 db 98  ae a4 b2 fc f8 17 99 b4  |..F.T...........|
-00000020  ed 6a aa 9c f9 ce e2 0f  f8 88 05 20 00 00 00 00  |.j......... ....|
+00000000  16 03 03 00 7a 02 00 00  76 03 03 be 96 55 22 ae  |....z...v....U".|
+00000010  2e be 57 a1 0a 48 2e e3  ac 8e a7 d0 d5 a6 47 a9  |..W..H........G.|
+00000020  c4 11 bb e1 37 73 19 6b  de 6b 2e 20 00 00 00 00  |....7s.k.k. ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000040  00 00 00 00 00 00 00 00  00 00 00 00 13 03 00 00  |................|
-00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 a9  |..+.....3.$... .|
-00000060  5a 5c e9 b1 71 e8 a8 64  97 65 02 6b 3d 25 6f 6f  |Z\..q..d.e.k=%oo|
-00000070  9a 47 cb 4a 81 ac 89 23  22 c1 f4 3d db 77 1e 14  |.G.J...#"..=.w..|
-00000080  03 03 00 01 01 17 03 03  00 17 12 15 75 15 9f 10  |............u...|
-00000090  90 07 34 9c eb 05 d0 a1  4b 36 5b 4c 7b 26 2a 00  |..4.....K6[L{&*.|
-000000a0  29 17 03 03 02 22 85 a0  67 d7 72 57 83 19 79 12  |)...."..g.rW..y.|
-000000b0  b7 bd 37 ed ab 49 5d 15  49 2b 4f a1 b2 25 08 22  |..7..I].I+O..%."|
-000000c0  88 83 70 07 bc 8f 69 45  1b 21 36 99 f4 99 40 f8  |..p...iE.!6...@.|
-000000d0  0d 30 13 87 70 68 f6 9d  ce c7 9e 25 2c 1e 7a b5  |.0..ph.....%,.z.|
-000000e0  52 ed f8 0f f7 d9 e5 15  fc a3 47 83 0d 18 c4 de  |R.........G.....|
-000000f0  a1 a6 24 35 aa 56 d1 8b  95 07 5f 0f ba 1f 96 c3  |..$5.V...._.....|
-00000100  5b 36 cc d2 15 e6 b4 88  8f e3 7f 79 c2 24 d5 f3  |[6.........y.$..|
-00000110  a7 35 69 4e d2 2a f7 5c  08 8a c0 26 dd b9 77 5b  |.5iN.*.\...&..w[|
-00000120  96 1b 5f 03 89 07 a0 6a  b1 14 1d 02 46 08 eb 80  |.._....j....F...|
-00000130  d5 4c dc 69 63 8f 14 a1  e5 02 95 05 8a 8b c8 68  |.L.ic..........h|
-00000140  c3 d8 75 56 47 94 32 ba  67 71 ed 4b b4 62 ba 6a  |..uVG.2.gq.K.b.j|
-00000150  31 20 a7 d6 f8 8c a0 e9  e8 d2 1a 6b 85 6b b7 ee  |1 .........k.k..|
-00000160  78 e1 2e 4c 14 f0 b3 3e  b8 dc 7d af f0 9d 29 f3  |x..L...>..}...).|
-00000170  54 1d 9d dc 9e a3 9f 29  5b 33 1d f7 00 98 85 bd  |T......)[3......|
-00000180  42 39 85 75 cf fa dc f3  7e 80 14 4e a5 90 80 b6  |B9.u....~..N....|
-00000190  e3 37 d3 27 c6 7b b9 ee  32 61 a5 72 e5 2f a6 ab  |.7.'.{..2a.r./..|
-000001a0  cb 8e ac 53 4b 86 24 92  4b 77 d6 8d aa b4 37 d5  |...SK.$.Kw....7.|
-000001b0  2b b2 2f 07 23 37 4a d9  1f cc 6c 72 c6 21 5b 38  |+./.#7J...lr.![8|
-000001c0  a3 33 5c 86 50 69 34 8f  5a b8 cc 5e 82 7d 5b b2  |.3\.Pi4.Z..^.}[.|
-000001d0  5b f5 58 7f 2c 61 08 4b  3d 8b 67 09 19 01 d2 4f  |[.X.,a.K=.g....O|
-000001e0  06 62 17 4e d4 bf 88 89  bb c4 6e 14 2b 3a 50 c9  |.b.N......n.+:P.|
-000001f0  56 8a c1 0a 45 e6 67 32  f3 96 37 4b ba c2 2a 2b  |V...E.g2..7K..*+|
-00000200  84 e1 ff bb e0 ea 68 9b  98 fc 78 26 25 f6 50 25  |......h...x&%.P%|
-00000210  52 57 83 94 39 b9 a7 8d  38 43 70 a8 b7 61 a6 cf  |RW..9...8Cp..a..|
-00000220  09 77 db 3d 64 94 63 73  5b a1 6d f4 06 c1 b3 fb  |.w.=d.cs[.m.....|
-00000230  c6 9a 0b ea 9f 8e 6d 58  53 0e 13 e0 a6 21 69 7a  |......mXS....!iz|
-00000240  d3 57 32 d4 c6 32 ef 02  8e 54 1d 72 2d d6 a7 dc  |.W2..2...T.r-...|
-00000250  59 54 be 69 3f 5c 53 23  a9 f7 3e a9 e6 e7 e0 98  |YT.i?\S#..>.....|
-00000260  65 f6 74 f4 49 1c 77 0f  92 34 87 81 29 85 d1 e0  |e.t.I.w..4..)...|
-00000270  1e 4d b4 eb c2 44 43 a7  10 51 7c 5e 8e a4 b6 37  |.M...DC..Q|^...7|
-00000280  78 e8 35 02 07 3d 60 a5  01 75 01 25 f3 ff 32 ff  |x.5..=`..u.%..2.|
-00000290  34 ab a4 c3 4c ad 21 b8  91 0a d6 54 4b 7d cf c5  |4...L.!....TK}..|
-000002a0  ec 0f e5 4a 4d 75 4c ec  fc 37 2b 26 5a 73 93 70  |...JMuL..7+&Zs.p|
-000002b0  88 c7 9c cf 32 f9 ee a7  27 6e 1d 9e 36 a2 31 9e  |....2...'n..6.1.|
-000002c0  cd 0e c2 89 ef 2b 40 1a  17 03 03 00 a4 ad 19 05  |.....+@.........|
-000002d0  e6 40 5e b1 ec 69 6b 47  ef 5d d3 ee a6 94 51 85  |.@^..ikG.]....Q.|
-000002e0  d8 28 d9 df 8b d0 df 23  7e bd 98 6c 33 26 45 fa  |.(.....#~..l3&E.|
-000002f0  60 71 8b f5 71 5c 22 4e  b3 a7 01 fe 17 39 89 67  |`q..q\"N.....9.g|
-00000300  0b 70 ff 52 b9 10 9c e9  02 c0 1c 56 9d c8 45 51  |.p.R.......V..EQ|
-00000310  5a dd 86 79 6d a7 7d eb  16 c2 1a 5f 6a 3b 93 42  |Z..ym.}...._j;.B|
-00000320  13 f3 3d 8a 39 21 5f a9  7f cf 4b 1e 22 f1 a3 f8  |..=.9!_...K."...|
-00000330  5c 35 41 2a e2 91 72 4f  59 61 1c 15 be 27 6a bd  |\5A*..rOYa...'j.|
-00000340  b7 16 1f 63 97 51 d6 96  dd 81 f9 e7 fd 97 33 6e  |...c.Q........3n|
-00000350  da 5a 61 77 57 6e 3b 65  24 db b3 3a 18 7b dc f4  |.ZawWn;e$..:.{..|
-00000360  7c ff ab 43 7f 1b ae ae  b8 73 71 9e be 91 d6 56  ||..C.....sq....V|
-00000370  13 17 03 03 00 35 39 61  a3 b7 e5 1d 3d 87 92 84  |.....59a....=...|
-00000380  11 39 7d f4 ce 29 b9 4b  fd 3c 0c 5a b6 3a fa e2  |.9}..).K.<.Z.:..|
-00000390  a8 5b e6 d2 e5 7e e3 a6  33 59 e4 a8 59 95 5d b9  |.[...~..3Y..Y.].|
-000003a0  31 6d 51 90 22 be c0 3f  6e 43 f2                 |1mQ."..?nC.|
+00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 0f  |..+.....3.$... .|
+00000060  ae 71 f3 56 39 91 5f 75  18 40 73 b7 82 b9 67 05  |.q.V9._u.@s...g.|
+00000070  09 d6 be 04 1f 66 b4 c4  18 1a 19 1d e7 bb 15 14  |.....f..........|
+00000080  03 03 00 01 01 17 03 03  00 17 7d 5b c9 52 40 79  |..........}[.R@y|
+00000090  4b 2b 2e b9 cb 7c 16 1b  2e df 3c e9 69 24 ea 47  |K+...|....<.i$.G|
+000000a0  7f 17 03 03 02 22 a0 a0  bf fa 2c 0c 99 08 ad 4d  |....."....,....M|
+000000b0  03 05 54 93 67 8f 95 31  61 16 cb ef 2f 30 7f b8  |..T.g..1a.../0..|
+000000c0  f8 97 c9 7a a8 71 e8 f2  ab 73 51 c4 1c a5 f4 6c  |...z.q...sQ....l|
+000000d0  54 6e f0 42 ae 58 25 84  de 9b e1 08 2a df ba 1e  |Tn.B.X%.....*...|
+000000e0  e5 c7 8e 57 b8 a6 e4 6a  c8 02 0d 77 e7 79 f7 a2  |...W...j...w.y..|
+000000f0  3a 18 f2 c5 f5 74 71 83  26 49 a6 2f 5c ac a4 a7  |:....tq.&I./\...|
+00000100  0d f3 65 5a a9 ed a0 f5  f1 ce c9 80 bc 75 f2 e7  |..eZ.........u..|
+00000110  68 11 b5 fb aa a8 e0 85  b9 37 b6 04 f6 f3 6d 8a  |h........7....m.|
+00000120  ed 5c 0e 9a 25 52 f2 84  ca 2c 19 54 c1 0c 5e 24  |.\..%R...,.T..^$|
+00000130  e2 32 3e 99 18 84 17 84  8c 03 55 06 4f a0 ff 16  |.2>.......U.O...|
+00000140  89 9e 1e d4 75 1e 3f a5  4d 0b 24 41 bc ca 6e 48  |....u.?.M.$A..nH|
+00000150  77 53 e3 12 ee 00 69 11  19 c8 9b 43 b0 49 d3 a7  |wS....i....C.I..|
+00000160  48 69 08 d0 14 fa d1 2b  d5 66 a3 40 b4 51 4b e3  |Hi.....+.f.@.QK.|
+00000170  f0 d3 c2 97 de 19 e8 02  66 9a ba 9f 59 7a 77 a4  |........f...Yzw.|
+00000180  d1 29 71 5f 60 04 f6 f2  f5 d6 ce df 6a 19 6d 6a  |.)q_`.......j.mj|
+00000190  ae a5 df 25 d3 fb da 4c  54 d1 1e d8 68 59 d0 a8  |...%...LT...hY..|
+000001a0  3d 6a ce 84 57 0e 01 8f  d6 f1 7f cd 9f 4c 26 ae  |=j..W........L&.|
+000001b0  88 b5 af 31 b4 15 c0 bc  70 86 d4 7e 3f 7c 69 39  |...1....p..~?|i9|
+000001c0  ff db 74 5b 18 54 dc 55  ec 7f 60 c8 38 03 1f e8  |..t[.T.U..`.8...|
+000001d0  a0 9f 3b 79 12 ca c4 3f  41 d3 3d 80 88 a2 7e fa  |..;y...?A.=...~.|
+000001e0  a1 5c f0 df 1b 61 73 e0  2a d3 d8 88 0e 22 20 09  |.\...as.*...." .|
+000001f0  62 42 3a 09 77 e5 39 c1  f2 a1 e5 29 f8 ab 4b de  |bB:.w.9....)..K.|
+00000200  0c 3c 39 e8 13 34 73 d0  e3 25 39 bf f7 23 c4 1b  |.<9..4s..%9..#..|
+00000210  06 c0 c4 16 80 14 15 a0  09 ac f0 fb 77 40 30 14  |............w@0.|
+00000220  07 5d 1c 34 58 90 27 53  3f da c5 2a 7d 0f b7 4c  |.].4X.'S?..*}..L|
+00000230  15 09 ea cf f1 51 6c 84  3a f1 f7 d0 66 b8 fb 0c  |.....Ql.:...f...|
+00000240  82 1e 86 2d 23 84 b8 d2  df d7 db a6 f2 7c da d8  |...-#........|..|
+00000250  e3 f8 a9 2c 0a fb 65 e8  2a 16 f6 c8 b7 dc b5 03  |...,..e.*.......|
+00000260  fd bc 76 67 c5 0a 9e 8a  c6 89 04 b4 e1 5b 23 89  |..vg.........[#.|
+00000270  ca 03 73 4c e2 49 3e a8  ce c9 4c 0a 98 8c 78 b9  |..sL.I>...L...x.|
+00000280  12 d4 32 94 84 66 5a d3  07 78 df 74 00 d7 ca df  |..2..fZ..x.t....|
+00000290  40 e6 b6 37 08 bc a8 fa  9a 28 e7 77 e2 78 39 d8  |@..7.....(.w.x9.|
+000002a0  e3 71 e5 2b f6 dc 9b 20  3e 38 77 80 f7 c9 e2 81  |.q.+... >8w.....|
+000002b0  07 4c 06 43 b7 b1 ff 1d  f9 b4 24 ca ad db d3 f5  |.L.C......$.....|
+000002c0  3b 05 d8 0f 1e 6d 1a 6d  17 03 03 00 a4 fd 5d 1f  |;....m.m......].|
+000002d0  1c 88 af a8 df 19 44 bd  80 81 78 fd 2d 84 ff a4  |......D...x.-...|
+000002e0  51 45 9a 98 7c 45 cb 84  2c fb 54 d1 33 06 67 e4  |QE..|E..,.T.3.g.|
+000002f0  95 f2 c5 5e 1b 49 41 b3  73 6c 5e 4d 2c 2d 77 1f  |...^.IA.sl^M,-w.|
+00000300  59 cb 39 e9 87 3a 10 83  72 ab b3 ce f8 28 94 8f  |Y.9..:..r....(..|
+00000310  47 8f 3d 2e 65 0a 42 b0  a5 13 61 bb 3b c7 a9 52  |G.=.e.B...a.;..R|
+00000320  cd 26 f6 ab c1 d3 3a a4  51 a6 7a 74 3b 76 19 ee  |.&....:.Q.zt;v..|
+00000330  71 09 b6 b8 e6 3d 3e a3  df db a9 69 52 fe 66 3a  |q....=>....iR.f:|
+00000340  dc 19 f6 56 ea 81 10 ab  43 2e e2 17 20 08 92 62  |...V....C... ..b|
+00000350  62 98 73 cb 16 9a 13 7d  b3 b4 6a fd 18 28 25 05  |b.s....}..j..(%.|
+00000360  b2 3f e7 14 94 cf 9d 67  74 11 83 21 da d8 36 da  |.?.....gt..!..6.|
+00000370  8e 17 03 03 00 35 89 67  70 a6 1c 3b 7c 59 59 23  |.....5.gp..;|YY#|
+00000380  92 33 ee 35 11 5d 8c fb  bd f0 21 a4 8d 09 e3 e7  |.3.5.]....!.....|
+00000390  dd 96 8c ad cc 57 97 6a  4d 33 49 cc f6 c6 a9 4d  |.....W.jM3I....M|
+000003a0  9b 3f 22 88 f5 06 b3 c2  a3 34 46                 |.?"......4F|
 >>> Flow 3 (client to server)
-00000000  14 03 03 00 01 01 17 03  03 00 35 50 4f ce ae a5  |..........5PO...|
-00000010  f7 b0 7e 2b 91 86 72 da  90 65 fd 1b a5 46 c6 98  |..~+..r..e...F..|
-00000020  47 90 5a f2 b8 5a 1f 18  44 19 bd ca dd 2a 15 e7  |G.Z..Z..D....*..|
-00000030  53 f5 17 e8 7d 9b f1 9a  63 ac b0 b0 df c3 0e 4c  |S...}...c......L|
-00000040  17 03 03 00 17 8b bd fb  bc fd f7 af 53 9b 8b 1a  |............S...|
-00000050  a3 e5 f6 e9 87 bd 4a 8a  1b 0e c9 d9 17 03 03 00  |......J.........|
-00000060  13 8e c6 d3 6e 04 8f 3b  d4 76 a4 c7 c8 63 a8 a8  |....n..;.v...c..|
-00000070  9e ba e7 fd                                       |....|
+00000000  14 03 03 00 01 01 17 03  03 00 35 f4 b7 bd 05 e3  |..........5.....|
+00000010  04 c1 da 80 2f 16 6c 14  fe 7e bd 74 65 ab 76 e8  |..../.l..~.te.v.|
+00000020  7a 62 dc 89 11 10 ee 58  93 fc 30 0e 30 fa b6 a0  |zb.....X..0.0...|
+00000030  48 11 5d 78 9a fc 6b 44  1c 67 52 21 b4 b8 69 18  |H.]x..kD.gR!..i.|
+00000040  17 03 03 00 17 12 f2 ed  80 d2 91 8a bc 19 25 1d  |..............%.|
+00000050  54 d6 56 04 b4 4d 1a 01  9f ea 7f 0c 17 03 03 00  |T.V..M..........|
+00000060  13 aa bb f9 4e 8f 2e 49  9c 07 65 31 8a 14 05 d8  |....N..I..e1....|
+00000070  d5 3a 83 23                                       |.:.#|
diff --git a/src/crypto/tls/testdata/Client-TLSv13-Ed25519 b/src/crypto/tls/testdata/Client-TLSv13-Ed25519
index d284740..e509e8a 100644
--- a/src/crypto/tls/testdata/Client-TLSv13-Ed25519
+++ b/src/crypto/tls/testdata/Client-TLSv13-Ed25519
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fe 01 00 00  fa 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 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,62 +7,63 @@
 00000050  cc a8 c0 2b c0 2f c0 2c  c0 30 c0 09 c0 13 c0 0a  |...+./.,.0......|
 00000060  c0 14 00 9c 00 9d 00 2f  00 35 c0 12 00 0a c0 23  |......./.5.....#|
 00000070  c0 27 00 3c c0 07 c0 11  00 05 13 03 13 01 13 02  |.'.<............|
-00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
+00000080  01 00 00 7f 00 05 00 05  01 00 00 00 00 00 0a 00  |................|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
 000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
 000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
-000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
-000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
-000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
-000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
+000000c0  01 00 01 00 00 17 00 00  00 12 00 00 00 2b 00 09  |.............+..|
+000000d0  08 03 04 03 03 03 02 03  01 00 33 00 26 00 24 00  |..........3.&.$.|
+000000e0  1d 00 20 2f e5 7d a3 47  cd 62 43 15 28 da ac 5f  |.. /.}.G.bC.(.._|
+000000f0  bb 29 07 30 ff f6 84 af  c4 cf c2 ed 90 99 5f 58  |.).0.........._X|
+00000100  cb 3b 74                                          |.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 7a 02 00 00  76 03 03 6f b6 d3 79 9b  |....z...v..o..y.|
-00000010  00 17 a8 46 3f e4 bc fc  08 1e 56 6c d8 63 86 f3  |...F?.....Vl.c..|
-00000020  83 1b d8 26 6d 86 d6 4c  f3 4f e1 20 00 00 00 00  |...&m..L.O. ....|
+00000000  16 03 03 00 7a 02 00 00  76 03 03 41 71 01 fb 3b  |....z...v..Aq..;|
+00000010  86 8b 75 5d 8d 98 1d 98  e7 19 0c 87 87 d0 a6 b5  |..u]............|
+00000020  5f 51 70 32 37 bc 58 b6  93 fb b1 20 00 00 00 00  |_Qp27.X.... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000040  00 00 00 00 00 00 00 00  00 00 00 00 13 03 00 00  |................|
-00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 5b  |..+.....3.$... [|
-00000060  8f 4f 5a a9 95 6b 04 07  31 d3 ed 91 8b 25 b4 7b  |.OZ..k..1....%.{|
-00000070  5c a1 0a a6 26 09 92 9b  b0 72 26 f9 0d 09 60 14  |\...&....r&...`.|
-00000080  03 03 00 01 01 17 03 03  00 17 a8 99 d3 76 1f 12  |.............v..|
-00000090  19 18 15 8e 4c 59 43 92  11 4a aa 50 98 7e 4c d9  |....LYC..J.P.~L.|
-000000a0  63 17 03 03 01 50 66 f5  d6 ce 35 0f 10 e5 ab 34  |c....Pf...5....4|
-000000b0  78 17 c6 b6 60 40 eb 53  34 9f ce 02 c4 36 51 18  |x...`@.S4....6Q.|
-000000c0  c2 b3 fb f3 98 92 d0 f2  b7 be 28 f5 c7 2d fa 1f  |..........(..-..|
-000000d0  9b 8b aa e5 45 54 6b 0e  ed 6b 44 cb d4 4d 62 b2  |....ETk..kD..Mb.|
-000000e0  30 c9 df ac cf a3 7e 43  58 1e bf 6e 5b 69 4e 48  |0.....~CX..n[iNH|
-000000f0  1c 39 49 eb 8a 0c 22 f3  70 4a 80 50 39 d6 68 29  |.9I...".pJ.P9.h)|
-00000100  d0 6d 08 20 26 39 6d 37  5a 9f 79 e9 16 e3 7e 94  |.m. &9m7Z.y...~.|
-00000110  8f 5f 9b 97 2d e1 b1 48  e4 a3 36 63 40 5a 80 93  |._..-..H..6c@Z..|
-00000120  06 27 3b 93 d9 ed 2d b1  3e 74 ed bc 38 a1 cb 17  |.';...-.>t..8...|
-00000130  06 4a 9b c1 c1 d7 7a 1c  ca ff 4d ee 91 6d d0 3c  |.J....z...M..m.<|
-00000140  c2 4b cc 33 c6 7c 76 8e  db a2 e0 fe 15 e2 ec db  |.K.3.|v.........|
-00000150  1f 5d 05 c8 5e 0e 7f 2c  7a 95 08 34 68 a2 2c 7c  |.]..^..,z..4h.,||
-00000160  04 16 92 7a c8 ec 52 2d  1a c4 7a ea 12 cd 0f b9  |...z..R-..z.....|
-00000170  7c 00 51 55 02 5b 02 7d  ec 89 af f5 6d 76 89 0e  ||.QU.[.}....mv..|
-00000180  67 42 f0 e4 67 4d 3f 70  ff 2c 64 81 1c 4a 92 1f  |gB..gM?p.,d..J..|
-00000190  26 8b a4 4f 15 18 b5 11  4a 61 df 45 53 74 fd 8d  |&..O....Ja.ESt..|
-000001a0  ff 22 32 91 af c7 7f a4  7b 62 c3 3b 30 51 b6 34  |."2.....{b.;0Q.4|
-000001b0  b6 01 21 f9 86 74 be 62  27 1a 41 1f f0 0d 8b 5c  |..!..t.b'.A....\|
-000001c0  4b 82 ea 76 23 9c 36 af  25 1f f6 2d 5f 9c 28 bd  |K..v#.6.%..-_.(.|
-000001d0  b6 d5 1e 26 8b c1 dc ac  ed 6d 10 ff 13 ed fc 08  |...&.....m......|
-000001e0  08 0a 74 1c b1 5b f8 45  e4 83 44 f2 be ce 8d ac  |..t..[.E..D.....|
-000001f0  ee ae e6 21 da c7 17 03  03 00 59 d9 b3 95 0a f7  |...!......Y.....|
-00000200  1a 1a 54 fa ab 09 38 6d  6d 53 0a ef 11 73 bc a2  |..T...8mmS...s..|
-00000210  20 03 31 48 e2 0a d1 af  56 6c ca dd 88 ba 72 3a  | .1H....Vl....r:|
-00000220  c1 e0 c5 60 44 74 d6 c9  18 23 96 2c e7 88 c8 3e  |...`Dt...#.,...>|
-00000230  02 73 c0 38 d4 bd 85 a4  bb 78 a0 ba d3 fd f1 c4  |.s.8.....x......|
-00000240  27 08 05 fb 2c 26 20 b7  1a 41 87 a6 b7 97 19 26  |'...,& ..A.....&|
-00000250  50 ed 9a e4 17 03 03 00  35 68 36 c7 78 c3 5e ff  |P.......5h6.x.^.|
-00000260  b3 92 a7 25 31 2a a2 fa  24 d9 da 69 16 03 8b db  |...%1*..$..i....|
-00000270  fe b2 3f 63 88 49 f1 14  63 7a 58 a9 6f c5 64 92  |..?c.I..czX.o.d.|
-00000280  21 84 82 d8 49 98 fb f3  f1 fd 52 83 32 97        |!...I.....R.2.|
+00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 17  |..+.....3.$... .|
+00000060  4e 27 d2 df c9 6d 88 15  a2 02 f2 fc 4d 87 65 92  |N'...m......M.e.|
+00000070  67 92 90 6c 8b e0 fb 27  2b d6 e8 e1 0e b2 7b 14  |g..l...'+.....{.|
+00000080  03 03 00 01 01 17 03 03  00 17 ef ca 93 ae 3b 4b  |..............;K|
+00000090  ef ba c7 f1 44 89 61 b5  6c 05 c5 d9 59 4d 50 ab  |....D.a.l...YMP.|
+000000a0  ff 17 03 03 01 50 71 7e  a6 0b 61 c5 f1 b0 9b ab  |.....Pq~..a.....|
+000000b0  3e 15 7a 0c ac 01 d7 cb  3e 04 85 e1 7a 59 95 92  |>.z.....>...zY..|
+000000c0  cb 91 5f 91 a4 e2 1b 6a  d7 72 d5 ee 70 ae 51 ed  |.._....j.r..p.Q.|
+000000d0  c7 78 ea 69 e5 a6 0b cc  72 43 6f 2e da c3 74 4c  |.x.i....rCo...tL|
+000000e0  00 53 79 38 3b 10 7e 98  25 32 ad 7f e4 0b 9b ad  |.Sy8;.~.%2......|
+000000f0  4a 5d f4 d9 a1 fe d6 ce  32 ff 2d 2e 26 49 78 3f  |J]......2.-.&Ix?|
+00000100  4e 37 e9 c7 d3 af b7 4d  75 f2 71 f2 20 b8 28 64  |N7.....Mu.q. .(d|
+00000110  7c 0c 7a 3c f0 35 4e c6  ba 2d fc 76 53 a5 76 f9  ||.z<.5N..-.vS.v.|
+00000120  3e e3 4e 41 b9 52 e1 dc  62 9f 13 bf b7 ef c2 c1  |>.NA.R..b.......|
+00000130  ef 9c 04 4d 4c d0 20 e8  7e 62 bc 23 8a c0 02 62  |...ML. .~b.#...b|
+00000140  1d 8e c1 6f e0 23 70 0e  08 5c a0 47 92 40 5c 31  |...o.#p..\.G.@\1|
+00000150  d9 03 5b a5 9a dd 2f b9  4f 8a 4a 8d d9 c3 63 cb  |..[.../.O.J...c.|
+00000160  61 16 3c be 9e dc 9d 11  bf c8 b9 5b 2d 69 5d 94  |a.<........[-i].|
+00000170  ef 6b 87 2d 59 42 05 51  88 9d 5a 8d bc ae 7c 65  |.k.-YB.Q..Z...|e|
+00000180  e2 a1 b5 eb c6 23 30 3c  ab 52 f1 a3 90 77 1c a2  |.....#0<.R...w..|
+00000190  65 e0 ef 9c c7 1f b3 ad  7a 63 01 d9 b6 5c de c5  |e.......zc...\..|
+000001a0  3e ec b0 0c 1c 34 ea e1  8e d9 68 67 d8 1b 0c 94  |>....4....hg....|
+000001b0  4d 0a e1 e7 c7 4f 6e 03  c2 0f d6 4e 87 b9 e4 5c  |M....On....N...\|
+000001c0  d6 d7 4a f0 90 fb 8c 56  ce 20 d3 09 db a2 3a 8f  |..J....V. ....:.|
+000001d0  56 bc 1f 5d d8 0f ab 05  9c 2e 96 7e 09 bf 0f 45  |V..].......~...E|
+000001e0  81 83 81 63 d5 0e ef fb  bd db 1d c8 17 4a ef d1  |...c.........J..|
+000001f0  ce 9d 76 c5 1c 3a 17 03  03 00 59 f8 6e 9b 48 45  |..v..:....Y.n.HE|
+00000200  96 86 f0 87 4f 95 75 72  90 16 ee 40 e6 a5 da d6  |....O.ur...@....|
+00000210  9a 93 5a f2 e1 14 c7 ef  99 5e 55 80 9c 2b a5 f0  |..Z......^U..+..|
+00000220  24 d0 0c b3 5c cd 7e 9f  a7 8d 80 6d 24 0f 55 44  |$...\.~....m$.UD|
+00000230  25 23 04 30 0a b8 4b 87  81 7d f6 46 af a0 e9 6c  |%#.0..K..}.F...l|
+00000240  ce cc 3b 8f 93 75 2b d3  65 84 0d fc 11 b3 49 93  |..;..u+.e.....I.|
+00000250  21 8c 12 28 17 03 03 00  35 11 5a 66 4d 6e f2 a1  |!..(....5.ZfMn..|
+00000260  d5 c7 e0 0d fb c0 23 72  61 40 56 c9 2b cf 19 91  |......#ra@V.+...|
+00000270  1e 9a 0b 20 65 dd f2 ec  54 f8 6a 6f a0 7f bf d2  |... e...T.jo....|
+00000280  92 e0 41 ae 8c a0 4e 33  be a0 f8 8e b3 c7        |..A...N3......|
 >>> Flow 3 (client to server)
-00000000  14 03 03 00 01 01 17 03  03 00 35 07 7b a2 7a 4f  |..........5.{.zO|
-00000010  40 e9 a2 94 9f b7 2d 91  87 1e 37 b0 ca b7 ea 91  |@.....-...7.....|
-00000020  53 f1 bf 7d 56 6a 0c 6a  9d 07 ac 93 9c db ca ac  |S..}Vj.j........|
-00000030  43 7b eb 56 9d 6c 79 f2  72 f8 0b 8d 15 08 84 d5  |C{.V.ly.r.......|
-00000040  17 03 03 00 17 07 b3 7d  a9 56 c4 76 e5 12 97 29  |.......}.V.v...)|
-00000050  b7 99 e6 3e 08 79 2d fb  1a 5b eb 7a 17 03 03 00  |...>.y-..[.z....|
-00000060  13 66 b7 65 57 0d 54 7b  6a 34 98 a1 4e 29 d5 92  |.f.eW.T{j4..N)..|
-00000070  1e b6 52 bc                                       |..R.|
+00000000  14 03 03 00 01 01 17 03  03 00 35 a6 8b c2 c6 31  |..........5....1|
+00000010  c1 73 78 0f f6 09 bb 09  d5 bc da 6b e6 21 e7 3e  |.sx........k.!.>|
+00000020  19 ba 60 74 d4 32 71 37  a0 13 d8 ae e0 85 f7 71  |..`t.2q7.......q|
+00000030  d0 4e 2f 29 81 bb 8b 86  24 67 5b c9 b7 6e 6a 11  |.N/)....$g[..nj.|
+00000040  17 03 03 00 17 43 59 8a  71 7c f9 e8 b9 36 56 bc  |.....CY.q|...6V.|
+00000050  07 67 34 1c f9 47 b0 fa  3a a0 15 9a 17 03 03 00  |.g4..G..:.......|
+00000060  13 dc 3e d0 92 97 41 13  06 65 b2 af e5 fa 16 d5  |..>...A..e......|
+00000070  9b 82 57 91                                       |..W.|
diff --git a/src/crypto/tls/testdata/Client-TLSv13-ExportKeyingMaterial b/src/crypto/tls/testdata/Client-TLSv13-ExportKeyingMaterial
index a0ede61..13ac4fc 100644
--- a/src/crypto/tls/testdata/Client-TLSv13-ExportKeyingMaterial
+++ b/src/crypto/tls/testdata/Client-TLSv13-ExportKeyingMaterial
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fe 01 00 00  fa 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 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,84 +7,85 @@
 00000050  cc a8 c0 2b c0 2f c0 2c  c0 30 c0 09 c0 13 c0 0a  |...+./.,.0......|
 00000060  c0 14 00 9c 00 9d 00 2f  00 35 c0 12 00 0a c0 23  |......./.5.....#|
 00000070  c0 27 00 3c c0 07 c0 11  00 05 13 03 13 01 13 02  |.'.<............|
-00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
+00000080  01 00 00 7f 00 05 00 05  01 00 00 00 00 00 0a 00  |................|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
 000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
 000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
-000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
-000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
-000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
-000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
+000000c0  01 00 01 00 00 17 00 00  00 12 00 00 00 2b 00 09  |.............+..|
+000000d0  08 03 04 03 03 03 02 03  01 00 33 00 26 00 24 00  |..........3.&.$.|
+000000e0  1d 00 20 2f e5 7d a3 47  cd 62 43 15 28 da ac 5f  |.. /.}.G.bC.(.._|
+000000f0  bb 29 07 30 ff f6 84 af  c4 cf c2 ed 90 99 5f 58  |.).0.........._X|
+00000100  cb 3b 74                                          |.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 7a 02 00 00  76 03 03 d6 7f ef 2d f6  |....z...v.....-.|
-00000010  82 d9 be 6d 33 80 73 c0  d4 d8 63 e9 95 a6 5b 1f  |...m3.s...c...[.|
-00000020  ce c0 ec 13 07 f4 68 7d  cc 79 18 20 00 00 00 00  |......h}.y. ....|
+00000000  16 03 03 00 7a 02 00 00  76 03 03 5a a0 51 7e b3  |....z...v..Z.Q~.|
+00000010  75 e4 ba 57 52 a0 56 68  55 2b 40 16 e3 d4 b1 4f  |u..WR.VhU+@....O|
+00000020  5e 2c a0 ab 31 76 e8 c5  ab ca 60 20 00 00 00 00  |^,..1v....` ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000040  00 00 00 00 00 00 00 00  00 00 00 00 13 03 00 00  |................|
-00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 00  |..+.....3.$... .|
-00000060  e9 40 7a 65 78 98 47 43  aa e1 63 fd 6b c4 21 1d  |.@zex.GC..c.k.!.|
-00000070  58 45 5f 64 a0 18 55 a0  c3 14 7d 4e 12 93 7c 14  |XE_d..U...}N..|.|
-00000080  03 03 00 01 01 17 03 03  00 17 4c 01 0b f7 e7 1b  |..........L.....|
-00000090  a9 47 84 10 3b 50 85 6e  3d 8e 52 bc 99 bf d4 35  |.G..;P.n=.R....5|
-000000a0  45 17 03 03 02 6d 8c b3  22 04 de 8b 09 e5 e7 9f  |E....m..".......|
-000000b0  d5 1f fb 8a 57 ad a7 93  4c 5f 29 46 df c3 e5 86  |....W...L_)F....|
-000000c0  66 f1 c7 6b 14 79 cf 9d  cc e1 f5 3f 31 2c dc ff  |f..k.y.....?1,..|
-000000d0  77 99 14 9e 56 12 4e a4  cb 56 5c d6 c0 5b 57 dc  |w...V.N..V\..[W.|
-000000e0  22 72 12 2d d6 a0 8a c7  90 e6 41 66 78 1a d7 a6  |"r.-......Afx...|
-000000f0  87 db f1 e3 9b 86 8c cf  94 22 cf 81 99 20 bc 19  |........."... ..|
-00000100  50 f9 fe 6c ab ea d4 a2  ee f8 17 1d ae 37 86 2a  |P..l.........7.*|
-00000110  f9 83 3c 59 d0 aa 63 22  18 d5 12 40 be f7 02 f1  |..<Y..c"...@....|
-00000120  9a bf 07 39 23 73 23 a1  66 70 b7 be 9a 24 de 30  |...9#s#.fp...$.0|
-00000130  2f 62 6e f8 d5 ee 69 a7  87 3c 73 10 4c 7c 97 42  |/bn...i..<s.L|.B|
-00000140  62 b9 d5 74 40 f0 d7 b3  74 42 73 d7 41 bc 35 43  |b..t@...tBs.A.5C|
-00000150  87 2e c5 1b e9 15 e8 5e  18 b9 6b 57 2a ee 59 7a  |.......^..kW*.Yz|
-00000160  1c a6 2b cb b4 db e8 bb  99 87 74 4a ee 57 3a 87  |..+.......tJ.W:.|
-00000170  3c 2d b9 76 41 4a 7a a5  6a fa 92 e9 80 24 08 dc  |<-.vAJz.j....$..|
-00000180  18 44 4b 59 7c 81 99 29  f2 c4 55 b6 58 71 0d 68  |.DKY|..)..U.Xq.h|
-00000190  6b 06 bd 13 2c a0 04 15  2e 49 cc 99 7f a6 b4 5d  |k...,....I.....]|
-000001a0  d3 49 a5 21 15 d7 66 2d  a2 e8 cd a7 7e 46 c4 ac  |.I.!..f-....~F..|
-000001b0  89 ae cb 58 73 42 9f dc  c3 c9 5a 13 2f 6f f7 ab  |...XsB....Z./o..|
-000001c0  04 4b 9f f1 6c c4 ac 0f  f5 eb 8d 7a ef cf 01 00  |.K..l......z....|
-000001d0  8a 02 ec 16 09 c1 e9 27  81 32 70 b1 24 d4 db 4e  |.......'.2p.$..N|
-000001e0  9e 22 65 21 a7 8f 19 d5  c6 57 78 8a fa a6 41 87  |."e!.....Wx...A.|
-000001f0  52 eb 5d ef f8 7e 3b 34  a5 31 ff 33 33 fd 85 03  |R.]..~;4.1.33...|
-00000200  e4 94 56 ef 11 c0 fe 84  f6 87 94 26 de 7c bd d1  |..V........&.|..|
-00000210  1b ea 15 34 62 e5 da bd  e6 c4 b0 74 b5 27 ad 21  |...4b......t.'.!|
-00000220  39 16 c8 be e8 41 50 7b  de fb 71 10 4c b1 f4 5a  |9....AP{..q.L..Z|
-00000230  bf ea fd 9b 86 a5 c6 e7  2f c2 13 e4 d2 cd 32 7a  |......../.....2z|
-00000240  6b ad ab 43 12 3b 45 b9  5c e4 cf 2c f9 f3 44 2c  |k..C.;E.\..,..D,|
-00000250  11 31 ce c5 65 dd ea e6  52 bd 8a 35 d0 31 d4 4f  |.1..e...R..5.1.O|
-00000260  01 24 54 e4 d2 bf 6e 79  b2 bf a8 f0 5d 9d 72 44  |.$T...ny....].rD|
-00000270  6e df 29 8a d2 cc a8 d2  ee 0c 51 50 cd 71 a6 2a  |n.).......QP.q.*|
-00000280  fe 53 2e f7 ae fa 4c 34  d0 68 31 d5 69 be 64 a5  |.S....L4.h1.i.d.|
-00000290  03 54 31 1a dc f0 9e c7  82 1f 15 d1 64 ff 79 07  |.T1.........d.y.|
-000002a0  5e 71 3a 98 3c 21 a7 8e  1e bf 2d f3 86 4b 3f 30  |^q:.<!....-..K?0|
-000002b0  73 0d 7c 5d 57 1b a9 89  2b 52 70 84 8e e6 bb fe  |s.|]W...+Rp.....|
-000002c0  b7 1f 65 6a 08 63 58 16  81 51 09 b2 79 7d 84 c0  |..ej.cX..Q..y}..|
-000002d0  6f e1 ab 92 35 16 2e 8f  5c 17 2d 5e 68 7f d4 94  |o...5...\.-^h...|
-000002e0  5a 1b 1d 6c 5f e0 36 a0  ae 54 5b e9 39 1f bc 73  |Z..l_.6..T[.9..s|
-000002f0  f9 04 80 e9 36 d2 2c de  64 ca 08 95 d0 98 4b da  |....6.,.d.....K.|
-00000300  7b 0d 7f 79 1b a0 56 6c  dd 3c 40 52 3e 7a 8f 52  |{..y..Vl.<@R>z.R|
-00000310  3c c9 2f 17 03 03 00 99  07 91 f0 6b e0 bb 6f 0b  |<./........k..o.|
-00000320  ff 08 69 bc d2 1d f1 40  d2 d7 c7 f6 c2 b3 57 d7  |..i....@......W.|
-00000330  90 00 c9 9e ef 40 b6 96  86 0d 27 8b 6f ac 54 2f  |.....@....'.o.T/|
-00000340  73 b3 b4 82 1b d3 f5 e9  41 a7 fd d5 b1 67 f7 6e  |s.......A....g.n|
-00000350  2e c1 06 34 ef a3 b9 97  4d a8 64 4f f8 48 24 5c  |...4....M.dO.H$\|
-00000360  66 f4 d7 d4 e3 ad 45 fb  4a 42 0d 19 bb a1 cc b3  |f.....E.JB......|
-00000370  88 d2 2a d7 c3 53 c4 7b  08 a5 68 dc c4 1a f6 f3  |..*..S.{..h.....|
-00000380  a1 42 48 1c c9 2b 1f fb  5d fc 49 ed ce 16 14 34  |.BH..+..].I....4|
-00000390  34 01 c9 ef e6 29 9c 81  1a 7d 7b bd 95 eb ad 5f  |4....)...}{...._|
-000003a0  ce 19 30 9c e6 ae 09 15  3c 2b 38 8b e6 97 76 4e  |..0.....<+8...vN|
-000003b0  dd 17 03 03 00 35 d2 a1  3f 22 e9 2b b6 7a d1 d8  |.....5..?".+.z..|
-000003c0  7b 87 bf d1 bf 56 0b 55  52 d0 a9 cf ae 57 6e 6f  |{....V.UR....Wno|
-000003d0  29 0c c3 f7 f3 d4 bf ff  a4 6b 49 1a 57 57 27 89  |)........kI.WW'.|
-000003e0  e0 f5 bb d2 16 85 39 40  fd 77 a3                 |......9@.w.|
+00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 1e  |..+.....3.$... .|
+00000060  8e a4 e9 85 bd af 87 81  48 56 10 3d 4d d2 07 42  |........HV.=M..B|
+00000070  7f a2 db 93 42 98 df 67  6d 79 b3 fb 4f bb 67 14  |....B..gmy..O.g.|
+00000080  03 03 00 01 01 17 03 03  00 17 db c6 9e 4c ff 07  |.............L..|
+00000090  33 5a d9 47 e2 08 d5 10  bf 70 c5 5b 22 48 a7 fd  |3Z.G.....p.["H..|
+000000a0  8d 17 03 03 02 6d cd a7  97 1c 26 3c a9 70 93 c5  |.....m....&<.p..|
+000000b0  98 ac 09 11 75 24 a1 97  4a a7 65 a0 d7 40 08 c9  |....u$..J.e..@..|
+000000c0  fd 31 5f 47 c3 95 38 cf  cd e0 77 52 db c1 fe 3a  |.1_G..8...wR...:|
+000000d0  2e 5f ae 5a 9a cf 96 5f  83 f5 7e 6b b0 d7 bf 27  |._.Z..._..~k...'|
+000000e0  bd 22 af a1 05 79 48 c7  56 e9 56 a9 4f 34 82 9c  |."...yH.V.V.O4..|
+000000f0  41 c5 cf 72 d1 56 18 d4  fb d7 94 e1 72 9f 2a c0  |A..r.V......r.*.|
+00000100  2f 3b fe de 46 36 4f 0d  15 12 4d e2 2a fb 42 20  |/;..F6O...M.*.B |
+00000110  1e 7f 0f 50 be 56 10 2d  83 9f c0 c4 9e 0a 29 c4  |...P.V.-......).|
+00000120  07 a1 ba c0 70 d4 93 8a  27 a1 e2 00 98 11 3e 4e  |....p...'.....>N|
+00000130  07 46 54 68 5a d2 e3 85  ca 6d 66 b1 28 d7 a3 c9  |.FThZ....mf.(...|
+00000140  cb 9b 5b 4c 94 4a 56 69  dc 6e ba 84 08 7e 31 14  |..[L.JVi.n...~1.|
+00000150  5d a0 e0 00 b2 23 63 fe  67 8c ae 75 56 44 9c 9c  |]....#c.g..uVD..|
+00000160  c4 4c 31 a9 d7 df 3b ec  59 1e 2e 85 fd 08 8d ba  |.L1...;.Y.......|
+00000170  b2 09 f6 3e 19 7b 29 ab  6a b3 5a 00 be 76 fb 39  |...>.{).j.Z..v.9|
+00000180  98 c4 3e 4b a6 ae 68 ba  6c 9a a6 5d 20 33 96 55  |..>K..h.l..] 3.U|
+00000190  27 66 aa c2 c0 6d f0 80  cc c7 64 5f 7b 42 56 b4  |'f...m....d_{BV.|
+000001a0  a2 6b a3 29 9a 49 d2 fc  74 53 21 fe e3 87 ab d9  |.k.).I..tS!.....|
+000001b0  e4 3e e7 8a a0 c6 49 08  d1 45 14 53 fb 28 39 cb  |.>....I..E.S.(9.|
+000001c0  99 86 c2 3f dc b3 f6 86  a7 87 b2 88 d9 4f 62 d6  |...?.........Ob.|
+000001d0  d4 bb 84 93 56 5a 99 8e  8a 5b 1b 9a 1c ef 4a f1  |....VZ...[....J.|
+000001e0  85 62 08 1f 27 c2 20 a1  9c 73 91 05 d8 9b 32 90  |.b..'. ..s....2.|
+000001f0  74 80 08 dd 52 87 9f 6e  c3 89 14 f3 23 0e 1f d0  |t...R..n....#...|
+00000200  3c e0 51 48 a4 b2 f2 43  05 bd a3 95 35 70 37 cc  |<.QH...C....5p7.|
+00000210  89 f3 23 b7 70 5f 36 24  78 ea 21 ec 7c 06 3a d6  |..#.p_6$x.!.|.:.|
+00000220  b5 fd d1 c4 bb 32 39 78  6a f6 ed 91 83 c8 d4 bd  |.....29xj.......|
+00000230  33 55 cf a8 5a b9 46 ec  fa 87 5a c0 35 d1 f6 5e  |3U..Z.F...Z.5..^|
+00000240  1f 7a 8e 82 e1 97 38 f9  ad 6e 00 ba d1 4b 82 dd  |.z....8..n...K..|
+00000250  b0 87 0e 18 70 27 6c cd  dd 0d d7 4b 46 e9 a3 dc  |....p'l....KF...|
+00000260  5d 60 e7 eb a9 b4 99 f2  bc 9f a4 ed dc c6 63 24  |]`............c$|
+00000270  f8 91 f3 ee 7f 47 40 03  95 34 53 8c 38 90 3f 0f  |.....G@..4S.8.?.|
+00000280  a6 d8 a1 a7 39 64 45 7e  9e 94 aa 3e 19 df 28 f1  |....9dE~...>..(.|
+00000290  ab 14 22 ce e8 80 a6 73  59 f7 92 85 13 20 6c cf  |.."....sY.... l.|
+000002a0  d8 ff ce f4 5d 79 f8 37  38 b6 9f 81 97 9f 72 31  |....]y.78.....r1|
+000002b0  e0 fe ca d2 03 cd 3b 00  9f cb 55 a7 de 79 80 d8  |......;...U..y..|
+000002c0  0b ae 5a e6 a7 ba a5 35  da d3 03 95 56 c0 ac c9  |..Z....5....V...|
+000002d0  2a 36 cf 53 d0 44 48 b3  19 6c 44 ab 6b a1 7f a2  |*6.S.DH..lD.k...|
+000002e0  f6 18 90 4f 16 a9 d5 77  ef 01 81 e1 ef a7 b9 3f  |...O...w.......?|
+000002f0  35 82 66 c7 9c 82 cc 00  fa 74 71 ed 99 ab fc d5  |5.f......tq.....|
+00000300  ce 0a 05 80 56 5f 54 79  a9 b2 82 38 af 52 94 d1  |....V_Ty...8.R..|
+00000310  7e 15 1e 17 03 03 00 99  94 6e e7 f3 9a a6 90 24  |~........n.....$|
+00000320  c8 59 16 e6 58 d1 a2 55  ab 90 d6 59 00 06 0f 22  |.Y..X..U...Y..."|
+00000330  2d 7e 1a 13 ce 64 05 a0  e2 a2 22 36 d4 51 69 ce  |-~...d...."6.Qi.|
+00000340  8c 13 85 2e ad a3 9d c9  cf 50 be 06 db 75 41 1e  |.........P...uA.|
+00000350  01 64 8e 55 13 31 42 a0  b9 90 30 75 a3 b5 a1 36  |.d.U.1B...0u...6|
+00000360  e8 1d 5f 32 f4 8f 68 f3  ca d9 f2 36 cf 77 2a ae  |.._2..h....6.w*.|
+00000370  03 db 01 bb 51 25 bb 65  76 0a 81 bf db 6a 0a 85  |....Q%.ev....j..|
+00000380  3d 2a ee 71 ff a5 91 75  3f 44 23 31 70 1f b4 4c  |=*.q...u?D#1p..L|
+00000390  a1 f2 ec cb ac bb de 36  3a 46 a6 3d a8 c5 57 92  |.......6:F.=..W.|
+000003a0  a4 7c d4 54 fa de b6 77  62 95 24 aa 63 70 4a 04  |.|.T...wb.$.cpJ.|
+000003b0  cb 17 03 03 00 35 07 18  23 d6 3d 11 1c 50 e1 22  |.....5..#.=..P."|
+000003c0  c7 83 33 84 c3 e1 30 b0  43 68 19 2b c4 43 95 25  |..3...0.Ch.+.C.%|
+000003d0  8c b7 37 c1 d0 3c ef f4  4f 29 b7 18 34 25 d2 8a  |..7..<..O)..4%..|
+000003e0  44 52 37 4e ff f9 aa 2b  33 61 4a                 |DR7N...+3aJ|
 >>> Flow 3 (client to server)
-00000000  14 03 03 00 01 01 17 03  03 00 35 b3 39 ad 6b 24  |..........5.9.k$|
-00000010  47 e3 9f 11 f9 7e 9a cf  41 db c8 43 ce 86 ae ce  |G....~..A..C....|
-00000020  0c af 17 42 d7 24 57 13  e6 ba a7 44 7c 72 38 aa  |...B.$W....D|r8.|
-00000030  8f fa a2 a2 9f b0 ba 43  47 20 e8 03 3c 00 ee ad  |.......CG ..<...|
-00000040  17 03 03 00 17 ff 5b 79  f8 c8 0c 7a 52 6d b0 b2  |......[y...zRm..|
-00000050  22 17 3b 5d f9 75 23 bb  27 38 35 a6 17 03 03 00  |".;].u#.'85.....|
-00000060  13 d3 94 d9 b5 8b fa dc  b6 fe 26 ca b0 52 5c ef  |..........&..R\.|
-00000070  84 e3 3c f9                                       |..<.|
+00000000  14 03 03 00 01 01 17 03  03 00 35 7d e0 1b 46 05  |..........5}..F.|
+00000010  4a e2 11 2c a4 22 62 cb  bc e7 f4 11 d2 05 ca c6  |J..,."b.........|
+00000020  17 98 10 88 03 12 d1 1e  6a dc e8 bb 91 df 65 47  |........j.....eG|
+00000030  78 f0 32 d1 7d c0 56 92  78 56 6b 75 cc 2d eb 2d  |x.2.}.V.xVku.-.-|
+00000040  17 03 03 00 17 ad cc 95  e5 1c 77 7c de 6f e8 8d  |..........w|.o..|
+00000050  06 8e b6 8e d0 95 3f 71  0b 15 6e 0e 17 03 03 00  |......?q..n.....|
+00000060  13 8e 23 c7 75 9d f7 e1  b9 b5 ed 79 86 e0 64 68  |..#.u......y..dh|
+00000070  01 ef 70 e1                                       |..p.|
diff --git a/src/crypto/tls/testdata/Client-TLSv13-HelloRetryRequest b/src/crypto/tls/testdata/Client-TLSv13-HelloRetryRequest
index 4840339..d6b570f 100644
--- a/src/crypto/tls/testdata/Client-TLSv13-HelloRetryRequest
+++ b/src/crypto/tls/testdata/Client-TLSv13-HelloRetryRequest
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 f6 01 00 00  f2 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fa 01 00 00  f6 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 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,14 +7,14 @@
 00000050  cc a8 c0 2b c0 2f c0 2c  c0 30 c0 09 c0 13 c0 0a  |...+./.,.0......|
 00000060  c0 14 00 9c 00 9d 00 2f  00 35 c0 12 00 0a c0 23  |......./.5.....#|
 00000070  c0 27 00 3c c0 07 c0 11  00 05 13 03 13 01 13 02  |.'.<............|
-00000080  01 00 00 77 00 05 00 05  01 00 00 00 00 00 0a 00  |...w............|
+00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
 00000090  06 00 04 00 1d 00 17 00  0b 00 02 01 00 00 0d 00  |................|
 000000a0  1a 00 18 08 04 04 03 08  07 08 05 08 06 04 01 05  |................|
 000000b0  01 06 01 05 03 06 03 02  01 02 03 ff 01 00 01 00  |................|
-000000c0  00 12 00 00 00 2b 00 09  08 03 04 03 03 03 02 03  |.....+..........|
-000000d0  01 00 33 00 26 00 24 00  1d 00 20 2f e5 7d a3 47  |..3.&.$... /.}.G|
-000000e0  cd 62 43 15 28 da ac 5f  bb 29 07 30 ff f6 84 af  |.bC.(.._.).0....|
-000000f0  c4 cf c2 ed 90 99 5f 58  cb 3b 74                 |......_X.;t|
+000000c0  00 17 00 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
+000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
+000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
+000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
 >>> Flow 2 (server to client)
 00000000  16 03 03 00 58 02 00 00  54 03 03 cf 21 ad 74 e5  |....X...T...!.t.|
 00000010  9a 61 11 be 1d 8c 02 1e  65 b8 91 c2 a2 11 16 7a  |.a......e......z|
@@ -24,7 +24,7 @@
 00000050  0c 00 2b 00 02 03 04 00  33 00 02 00 17 14 03 03  |..+.....3.......|
 00000060  00 01 01                                          |...|
 >>> Flow 3 (client to server)
-00000000  14 03 03 00 01 01 16 03  03 01 17 01 00 01 13 03  |................|
+00000000  14 03 03 00 01 01 16 03  03 01 1b 01 00 01 17 03  |................|
 00000010  03 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 00 00 00  |................|
 00000030  00 20 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |. ..............|
@@ -32,88 +32,88 @@
 00000050  00 00 00 32 cc a9 cc a8  c0 2b c0 2f c0 2c c0 30  |...2.....+./.,.0|
 00000060  c0 09 c0 13 c0 0a c0 14  00 9c 00 9d 00 2f 00 35  |............./.5|
 00000070  c0 12 00 0a c0 23 c0 27  00 3c c0 07 c0 11 00 05  |.....#.'.<......|
-00000080  13 03 13 01 13 02 01 00  00 98 00 05 00 05 01 00  |................|
+00000080  13 03 13 01 13 02 01 00  00 9c 00 05 00 05 01 00  |................|
 00000090  00 00 00 00 0a 00 06 00  04 00 1d 00 17 00 0b 00  |................|
 000000a0  02 01 00 00 0d 00 1a 00  18 08 04 04 03 08 07 08  |................|
 000000b0  05 08 06 04 01 05 01 06  01 05 03 06 03 02 01 02  |................|
-000000c0  03 ff 01 00 01 00 00 12  00 00 00 2b 00 09 08 03  |...........+....|
-000000d0  04 03 03 03 02 03 01 00  33 00 47 00 45 00 17 00  |........3.G.E...|
-000000e0  41 04 1e 18 37 ef 0d 19  51 88 35 75 71 b5 e5 54  |A...7...Q.5uq..T|
-000000f0  5b 12 2e 8f 09 67 fd a7  24 20 3e b2 56 1c ce 97  |[....g..$ >.V...|
-00000100  28 5e f8 2b 2d 4f 9e f1  07 9f 6c 4b 5b 83 56 e2  |(^.+-O....lK[.V.|
-00000110  32 42 e9 58 b6 d7 49 a6  b5 68 1a 41 03 56 6b dc  |2B.X..I..h.A.Vk.|
-00000120  5a 89                                             |Z.|
+000000c0  03 ff 01 00 01 00 00 17  00 00 00 12 00 00 00 2b  |...............+|
+000000d0  00 09 08 03 04 03 03 03  02 03 01 00 33 00 47 00  |............3.G.|
+000000e0  45 00 17 00 41 04 1e 18  37 ef 0d 19 51 88 35 75  |E...A...7...Q.5u|
+000000f0  71 b5 e5 54 5b 12 2e 8f  09 67 fd a7 24 20 3e b2  |q..T[....g..$ >.|
+00000100  56 1c ce 97 28 5e f8 2b  2d 4f 9e f1 07 9f 6c 4b  |V...(^.+-O....lK|
+00000110  5b 83 56 e2 32 42 e9 58  b6 d7 49 a6 b5 68 1a 41  |[.V.2B.X..I..h.A|
+00000120  03 56 6b dc 5a 89                                 |.Vk.Z.|
 >>> Flow 4 (server to client)
-00000000  16 03 03 00 9b 02 00 00  97 03 03 1d 65 62 8f 58  |............eb.X|
-00000010  2b 99 04 1d fd cc e3 0b  46 5c 55 a9 3a 80 76 60  |+.......F\U.:.v`|
-00000020  8f 52 09 6e 48 5d 5a e3  92 da a3 20 00 00 00 00  |.R.nH]Z.... ....|
+00000000  16 03 03 00 9b 02 00 00  97 03 03 4f 5c 5c 6c f2  |...........O\\l.|
+00000010  79 f3 d8 d4 be 78 c3 a4  b6 82 a5 ee 37 c3 a1 f7  |y....x......7...|
+00000020  87 83 ac 75 62 29 48 80  55 64 9b 20 00 00 00 00  |...ub)H.Ud. ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000040  00 00 00 00 00 00 00 00  00 00 00 00 13 03 00 00  |................|
 00000050  4f 00 2b 00 02 03 04 00  33 00 45 00 17 00 41 04  |O.+.....3.E...A.|
-00000060  1c 01 c6 9e c8 49 43 49  6f 0f 17 f3 ce 87 1a 0f  |.....ICIo.......|
-00000070  1f 2c 70 18 e4 29 f2 16  a2 e0 02 b7 9d 52 bc b9  |.,p..).......R..|
-00000080  d4 b0 1d 19 da 3a 38 f6  93 04 0b ae 5f 60 45 87  |.....:8....._`E.|
-00000090  57 80 20 27 c6 9c d4 eb  ec c0 85 df f5 aa be de  |W. '............|
-000000a0  17 03 03 00 17 d4 a9 5f  09 d3 e6 47 ad a7 7b 38  |......._...G..{8|
-000000b0  a3 b8 02 37 16 ec 03 56  df d5 8d ec 17 03 03 02  |...7...V........|
-000000c0  6d be 1b 2a 60 52 3c 01  2e 6e 7f e3 68 fa de 09  |m..*`R<..n..h...|
-000000d0  ed 5e 8f 0f a0 34 d5 0a  8b 2f 30 8f 6c 56 9e fe  |.^...4.../0.lV..|
-000000e0  e6 9a a9 f1 6e 7c 63 a7  d8 88 e2 95 fa 17 ad 0c  |....n|c.........|
-000000f0  49 20 93 18 3c ba db fc  a1 14 60 2c 77 d4 44 5f  |I ..<.....`,w.D_|
-00000100  69 9c c7 a3 b9 d0 ee e8  c5 ec 45 d3 79 d0 ee 04  |i.........E.y...|
-00000110  fd c3 6d 12 1a f2 6e 62  9f eb ff 32 88 17 4c df  |..m...nb...2..L.|
-00000120  20 4f cc f9 fd d5 7c 8b  8c c2 da 7d 8a c9 f9 27  | O....|....}...'|
-00000130  32 06 75 fe 75 e2 bb bd  6c 31 5d 32 af 36 95 39  |2.u.u...l1]2.6.9|
-00000140  92 6c 32 e5 4f b5 f7 07  9f b3 1b b8 10 a8 d9 db  |.l2.O...........|
-00000150  d3 b0 40 2f 1e e6 54 f5  35 73 7d 22 b3 6b b8 3c  |..@/..T.5s}".k.<|
-00000160  83 82 8a 75 f4 ec 18 94  57 0c de 98 41 73 61 63  |...u....W...Asac|
-00000170  5b 95 3e 4e d4 02 c3 b7  f9 4c 6f 01 c9 52 3c b9  |[.>N.....Lo..R<.|
-00000180  ad 61 83 2c 89 6d 63 40  fd d4 67 83 36 8b 9a 1c  |.a.,.mc@..g.6...|
-00000190  ca 93 16 d8 e3 91 08 d1  3f ba af cb d9 69 09 10  |........?....i..|
-000001a0  07 a7 54 9c ee a2 7d 97  ce b6 1f 31 9b 85 b0 82  |..T...}....1....|
-000001b0  fc 22 87 70 93 59 9c c9  e3 07 9b d0 c0 a4 1d d4  |.".p.Y..........|
-000001c0  2e 36 c0 72 b6 d5 2a f5  b3 fa ab fb 1a 90 05 51  |.6.r..*........Q|
-000001d0  b7 19 15 af d9 b2 5f 32  ef e6 5a 2d 4a 2c 7f a9  |......_2..Z-J,..|
-000001e0  43 cf b8 ac e4 8a f0 bf  68 90 b9 7c 1c 7e fa f0  |C.......h..|.~..|
-000001f0  bc e3 a9 4f a7 2d 3a f3  12 eb b1 93 b4 b9 1b d7  |...O.-:.........|
-00000200  81 31 db 58 c4 8e 9f 46  44 39 74 a1 a8 b0 78 0c  |.1.X...FD9t...x.|
-00000210  b9 23 6d 90 bb a8 b0 7c  e2 a3 a3 c4 e6 83 32 5d  |.#m....|......2]|
-00000220  ea 5a a4 3d 94 ca 51 3c  71 28 cf 43 27 9f 66 9b  |.Z.=..Q<q(.C'.f.|
-00000230  ec 49 0f a4 12 f5 a3 96  cd 3e 05 5b 9c d0 07 6f  |.I.......>.[...o|
-00000240  8a 11 df 2f be a7 1d 0d  9f a8 04 41 3d 5e 1b f6  |.../.......A=^..|
-00000250  b0 10 9b 6a 49 da 6c f9  6c 6e 2e 6c 9b cf f1 fe  |...jI.l.ln.l....|
-00000260  49 92 2b 16 3f 63 ef 87  71 9c da 0d 49 63 2a 4c  |I.+.?c..q...Ic*L|
-00000270  b5 82 c8 b0 75 5b 7b 89  39 cd 9a da dc 42 d1 1f  |....u[{.9....B..|
-00000280  92 61 e1 71 b9 b5 d2 40  3c 7a 4a 8d 91 1f e6 9d  |.a.q...@<zJ.....|
-00000290  79 37 71 3c dc a3 98 0b  b3 64 39 74 f1 8f 84 35  |y7q<.....d9t...5|
-000002a0  1d 6b b7 0a f9 aa 26 55  a8 39 7f 11 26 18 98 fe  |.k....&U.9..&...|
-000002b0  94 fb 5d e4 a1 2f 0f 3b  f0 b6 78 d5 87 32 73 6e  |..]../.;..x..2sn|
-000002c0  3e b1 3e 3c 19 31 7a ae  d8 73 67 96 56 9c 38 a6  |>.><.1z..sg.V.8.|
-000002d0  bc 39 1f 11 74 ad 69 c6  d2 40 0f 65 d8 ee aa 87  |.9..t.i..@.e....|
-000002e0  b3 4c 6c 1a 1d 62 4a 7a  d9 15 05 54 0d 8a 22 68  |.Ll..bJz...T.."h|
-000002f0  8e 41 22 b0 ee 41 b3 94  5d 1a 62 d8 bb ac f2 87  |.A"..A..].b.....|
-00000300  ad 91 19 e7 e1 bc 29 3b  96 8c d1 76 99 e5 82 48  |......);...v...H|
-00000310  0b 87 6a 93 3b 2c b7 c1  73 07 53 7c 1f 9f 48 dd  |..j.;,..s.S|..H.|
-00000320  71 da 55 e1 4a a3 86 d2  ff 23 b2 1d ea b0 17 03  |q.U.J....#......|
-00000330  03 00 99 75 af 84 36 54  8e 17 09 c7 2e 72 de 7d  |...u..6T.....r.}|
-00000340  29 5c 94 a9 e3 d3 d0 9b  3e a0 84 e6 cf b4 48 d8  |)\......>.....H.|
-00000350  dd 7c 8a 82 96 15 aa cb  95 38 88 9e 48 c4 bf 75  |.|.......8..H..u|
-00000360  9c f4 07 ed 5d 4d 36 8b  58 7f 9c 32 0b f9 d2 44  |....]M6.X..2...D|
-00000370  3d d6 ab 3b 3d 38 1f 8d  7e e8 b6 26 57 c9 c6 98  |=..;=8..~..&W...|
-00000380  49 4f 1e ad 5d fa 8b ca  bc ce 99 f2 d9 5b 14 54  |IO..]........[.T|
-00000390  56 0c 59 c8 22 9f 77 f1  db 92 43 c3 dd a5 29 ec  |V.Y.".w...C...).|
-000003a0  0d 79 0d b3 04 3f 4b 6b  d6 a8 da 99 64 94 78 a5  |.y...?Kk....d.x.|
-000003b0  e9 cd 7e f8 0c fb 72 d6  03 89 dd 00 13 f3 14 18  |..~...r.........|
-000003c0  ba 59 3c 04 7f 6a b5 62  37 56 2e 2d 17 03 03 00  |.Y<..j.b7V.-....|
-000003d0  35 af eb 05 4e ec ee 4b  d6 6b 03 35 d8 ba a3 cf  |5...N..K.k.5....|
-000003e0  50 c6 80 07 90 92 1c ed  1f d2 d5 12 e3 7f 74 1a  |P.............t.|
-000003f0  2c 3b 4b 6c f4 58 af 9a  1a cd 90 f4 d8 78 97 09  |,;Kl.X.......x..|
-00000400  2f f6 35 c1 29 b8                                 |/.5.).|
+00000060  be 02 77 b3 71 8c 25 30  15 18 cd 54 f8 99 b7 a4  |..w.q.%0...T....|
+00000070  1b 43 6e a5 bf 94 d3 7e  8f 07 4e 78 15 af 48 fe  |.Cn....~..Nx..H.|
+00000080  14 60 0d f1 1b 31 f5 30  5b 37 34 da d2 b8 a9 43  |.`...1.0[74....C|
+00000090  5e 5e 9e 32 9c 7c 94 21  fc 1e db 0a b3 e1 f5 7a  |^^.2.|.!.......z|
+000000a0  17 03 03 00 17 fc 15 53  2f 26 26 78 e5 5e 22 74  |.......S/&&x.^"t|
+000000b0  8a cb 74 2c f8 4c 04 5d  0b 53 d9 93 17 03 03 02  |..t,.L.].S......|
+000000c0  6d 58 f2 20 bc 2e 2b c7  67 79 b1 19 09 d8 73 9c  |mX. ..+.gy....s.|
+000000d0  74 b4 55 b4 24 5e a3 66  f1 a3 81 55 cb 77 5e c1  |t.U.$^.f...U.w^.|
+000000e0  5e b1 ba 4e ff 29 6e 10  a3 9c 20 68 fb c1 35 a8  |^..N.)n... h..5.|
+000000f0  02 10 0e b6 b1 a1 84 d1  e4 41 92 15 93 ea 9c c1  |.........A......|
+00000100  93 4b 54 28 da 49 f5 eb  a5 a5 92 3b 91 37 48 8a  |.KT(.I.....;.7H.|
+00000110  4a 0a 3c 3a b9 10 2b 1b  e8 33 4f e2 1b a4 e1 0e  |J.<:..+..3O.....|
+00000120  4c 81 38 13 36 f2 87 e9  58 be e4 16 d9 eb 17 9d  |L.8.6...X.......|
+00000130  61 69 7b 41 c9 29 99 bd  b1 5b 66 49 3d f1 e5 6f  |ai{A.)...[fI=..o|
+00000140  e4 91 a1 48 a3 89 91 00  8c 33 2c 0b 07 82 10 26  |...H.....3,....&|
+00000150  fb 7b c6 b0 64 56 1b 2b  1f 21 3a be 72 6d 9b fe  |.{..dV.+.!:.rm..|
+00000160  ad bd 1c 59 05 38 9b 27  88 55 76 88 45 cf 03 be  |...Y.8.'.Uv.E...|
+00000170  2a 8d 5f a6 39 1f 5e b7  1c 68 28 60 f5 cb e4 5e  |*._.9.^..h(`...^|
+00000180  08 6c 3c 85 72 6f 31 26  30 0c 25 94 0e 4d 5b 5b  |.l<.ro1&0.%..M[[|
+00000190  46 ba 0e 27 e1 17 3d 68  95 7e 2f a4 a0 16 54 e2  |F..'..=h.~/...T.|
+000001a0  35 3b a5 79 c8 45 2d e0  57 33 02 4e 81 bd dc 6a  |5;.y.E-.W3.N...j|
+000001b0  9b b7 1e a8 9e ff 75 7f  11 47 9c ac 60 05 bd 9d  |......u..G..`...|
+000001c0  59 2b 92 5a 94 f4 ca 8f  3e 53 b3 8a a5 ab 28 e2  |Y+.Z....>S....(.|
+000001d0  9f ed 29 f2 8b c7 82 92  86 d8 12 71 b1 97 24 26  |..)........q..$&|
+000001e0  f5 96 fc 16 a8 ff 39 1c  87 62 ec 4a b4 c3 03 13  |......9..b.J....|
+000001f0  e8 17 57 6b 48 6c 08 08  b0 6d 1f 1a 8c 1f 48 66  |..WkHl...m....Hf|
+00000200  aa 51 38 59 ac 1e 58 e7  ff 85 e1 60 e0 e5 42 65  |.Q8Y..X....`..Be|
+00000210  9e ff ab 65 bb 06 b2 8b  c6 f2 95 ad 3c eb c7 1c  |...e........<...|
+00000220  d6 2a 60 d3 e4 5f cb 65  ee 3d 45 75 93 53 eb 70  |.*`.._.e.=Eu.S.p|
+00000230  5c f4 ae 5c 6b e0 f1 6d  2c fe 88 cb 32 b4 53 90  |\..\k..m,...2.S.|
+00000240  c5 5b 9e 8c de 08 ff 49  86 2a a5 ef 59 50 f8 68  |.[.....I.*..YP.h|
+00000250  2a 3b e5 44 2a e8 7d c9  6e 5c c1 4f 99 d7 2b 67  |*;.D*.}.n\.O..+g|
+00000260  98 72 38 64 b3 e9 64 95  c1 1c 9d 5c 82 d9 e7 1e  |.r8d..d....\....|
+00000270  ac cf 12 05 d8 da eb 75  69 e3 fb 08 c3 c7 d2 2d  |.......ui......-|
+00000280  aa 3f 9d cc b7 31 b5 03  59 67 03 32 6f ed bc 87  |.?...1..Yg.2o...|
+00000290  47 c6 69 79 23 98 94 b7  4a 58 5f 68 5c 14 77 b5  |G.iy#...JX_h\.w.|
+000002a0  4b db 6e d9 c2 74 d0 8a  94 a6 3f 61 7a 1d b8 53  |K.n..t....?az..S|
+000002b0  c7 fb 1c d7 b7 ae 2b f2  c7 fc ed c3 77 47 8a be  |......+.....wG..|
+000002c0  c4 0a e2 3a da f6 f0 06  15 df 32 06 5e 81 17 aa  |...:......2.^...|
+000002d0  25 5c b0 56 56 ce 93 11  42 4d b1 b5 b5 d4 c9 47  |%\.VV...BM.....G|
+000002e0  df 7c 44 ac 23 bc 49 f6  aa f8 9a e3 fc 4e 7e 11  |.|D.#.I......N~.|
+000002f0  e5 da cc 0e c3 4e 57 5e  0d 7c 5a 98 e8 25 65 2e  |.....NW^.|Z..%e.|
+00000300  d0 9e 73 f1 eb 16 3b c4  bc 87 97 37 38 45 a0 77  |..s...;....78E.w|
+00000310  79 37 30 aa 05 0a 42 04  e2 e3 09 ce 5b d7 04 c1  |y70...B.....[...|
+00000320  b1 c4 89 bc 5d 92 eb 9a  a2 b4 12 87 98 05 17 03  |....]...........|
+00000330  03 00 99 0d 23 22 ba 58  d1 0a 8d 15 c6 ab 47 92  |....#".X......G.|
+00000340  4b ab 8b 31 d3 cd f6 c9  17 31 62 e2 4f 78 3d 87  |K..1.....1b.Ox=.|
+00000350  9f f9 54 10 4b db 86 99  dd eb e7 75 9d d1 dc 1c  |..T.K......u....|
+00000360  03 e2 b2 ae 61 69 66 33  e0 0f 95 4a 41 4f 36 6d  |....aif3...JAO6m|
+00000370  ed bd 80 51 8b 6c 92 dc  29 af 8d 17 12 b8 3d d7  |...Q.l..).....=.|
+00000380  db 05 63 4f ad e5 6e 32  5b 02 27 f6 8f e3 7c 02  |..cO..n2[.'...|.|
+00000390  15 c8 5e c8 f3 14 45 7c  2f 2d 81 aa ec 01 4f 12  |..^...E|/-....O.|
+000003a0  f3 aa c8 e5 ca 52 62 41  7d ca f2 9e 40 c3 36 d3  |.....RbA}...@.6.|
+000003b0  d8 40 be 59 0c 6a 67 aa  75 03 1c b7 b7 4b 21 3f  |.@.Y.jg.u....K!?|
+000003c0  13 28 10 e7 3f a1 25 1a  5d e4 a0 b9 17 03 03 00  |.(..?.%.].......|
+000003d0  35 93 e3 71 c4 3b b0 4a  37 6d 1a 97 a5 c4 17 c4  |5..q.;.J7m......|
+000003e0  cd 0c a0 f5 bb 06 1d 0c  f6 0f c4 c3 de b9 0a b7  |................|
+000003f0  37 9c d6 d4 43 a6 37 78  76 69 31 33 ed d8 db b4  |7...C.7xvi13....|
+00000400  3a ac cc 0d db 1b                                 |:.....|
 >>> Flow 5 (client to server)
-00000000  17 03 03 00 35 8d 07 5a  33 f5 d1 e7 6d 71 48 45  |....5..Z3...mqHE|
-00000010  3e 2a c0 7e 66 03 77 b5  69 b1 e5 13 04 0e 0d ea  |>*.~f.w.i.......|
-00000020  6f 80 46 a1 9a 54 09 6f  a7 be b7 a3 a1 0c d4 ba  |o.F..T.o........|
-00000030  0e 7d 00 8f 1b 01 0b d4  6b 4c 17 03 03 00 17 b9  |.}......kL......|
-00000040  fd 5a 5c a1 c2 33 71 63  99 25 bd 03 a3 24 a7 b6  |.Z\..3qc.%...$..|
-00000050  e7 42 04 6a 81 c5 17 03  03 00 13 b6 4a f1 0a 26  |.B.j........J..&|
-00000060  95 e8 fb 4b d1 db 24 95  8f 65 1f 3c 5d b9        |...K..$..e.<].|
+00000000  17 03 03 00 35 ee c2 44  be 17 16 64 cc e6 68 9b  |....5..D...d..h.|
+00000010  4d 75 86 c5 b5 9b f3 1c  7c b5 98 3f 9c 7b 07 65  |Mu......|..?.{.e|
+00000020  53 f1 6c d9 cd 17 54 3f  64 d3 ca 47 9c 1e 2d 13  |S.l...T?d..G..-.|
+00000030  fa 29 5e d8 91 5a 05 e8  03 21 17 03 03 00 17 41  |.)^..Z...!.....A|
+00000040  a1 aa 11 80 44 b8 26 a8  06 62 46 65 59 35 0b 06  |....D.&..bFeY5..|
+00000050  8e bf 6c 02 9d 5f 17 03  03 00 13 40 6d 8b 65 c6  |..l.._.....@m.e.|
+00000060  9c 9d b1 ec 29 f3 3d 23  56 28 f6 5a 5b e3        |....).=#V(.Z[.|
diff --git a/src/crypto/tls/testdata/Client-TLSv13-KeyUpdate b/src/crypto/tls/testdata/Client-TLSv13-KeyUpdate
index ea10f66..02c0a1a 100644
--- a/src/crypto/tls/testdata/Client-TLSv13-KeyUpdate
+++ b/src/crypto/tls/testdata/Client-TLSv13-KeyUpdate
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 fa 01 00 00  f6 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 fe 01 00 00  fa 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 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,96 +7,97 @@
 00000050  cc a8 c0 2b c0 2f c0 2c  c0 30 c0 09 c0 13 c0 0a  |...+./.,.0......|
 00000060  c0 14 00 9c 00 9d 00 2f  00 35 c0 12 00 0a c0 23  |......./.5.....#|
 00000070  c0 27 00 3c c0 07 c0 11  00 05 13 03 13 01 13 02  |.'.<............|
-00000080  01 00 00 7b 00 05 00 05  01 00 00 00 00 00 0a 00  |...{............|
+00000080  01 00 00 7f 00 05 00 05  01 00 00 00 00 00 0a 00  |................|
 00000090  0a 00 08 00 1d 00 17 00  18 00 19 00 0b 00 02 01  |................|
 000000a0  00 00 0d 00 1a 00 18 08  04 04 03 08 07 08 05 08  |................|
 000000b0  06 04 01 05 01 06 01 05  03 06 03 02 01 02 03 ff  |................|
-000000c0  01 00 01 00 00 12 00 00  00 2b 00 09 08 03 04 03  |.........+......|
-000000d0  03 03 02 03 01 00 33 00  26 00 24 00 1d 00 20 2f  |......3.&.$... /|
-000000e0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
-000000f0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74     |.........._X.;t|
+000000c0  01 00 01 00 00 17 00 00  00 12 00 00 00 2b 00 09  |.............+..|
+000000d0  08 03 04 03 03 03 02 03  01 00 33 00 26 00 24 00  |..........3.&.$.|
+000000e0  1d 00 20 2f e5 7d a3 47  cd 62 43 15 28 da ac 5f  |.. /.}.G.bC.(.._|
+000000f0  bb 29 07 30 ff f6 84 af  c4 cf c2 ed 90 99 5f 58  |.).0.........._X|
+00000100  cb 3b 74                                          |.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 7a 02 00 00  76 03 03 86 ed 46 3d 38  |....z...v....F=8|
-00000010  c5 47 10 b5 4e ac e5 b7  d7 ba cc 23 db f5 0a f4  |.G..N......#....|
-00000020  5e d3 62 af 47 8a 23 34  59 5c db 20 00 00 00 00  |^.b.G.#4Y\. ....|
+00000000  16 03 03 00 7a 02 00 00  76 03 03 70 a7 d4 99 55  |....z...v..p...U|
+00000010  7d 12 fd ca 3a 43 97 78  16 66 c2 bd 22 8b 6c 91  |}...:C.x.f..".l.|
+00000020  85 92 99 76 c8 4c 0f 4c  dc 94 0b 20 00 00 00 00  |...v.L.L... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000040  00 00 00 00 00 00 00 00  00 00 00 00 13 03 00 00  |................|
-00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 e3  |..+.....3.$... .|
-00000060  ff 35 33 31 c9 d8 5c 68  2a e5 73 98 4d 11 5b d7  |.531..\h*.s.M.[.|
-00000070  06 18 a9 dd 0e 4a 21 92  5b 15 8f bb 91 a9 6c 14  |.....J!.[.....l.|
-00000080  03 03 00 01 01 17 03 03  00 17 ea ac f8 a0 41 47  |..............AG|
-00000090  af 01 fb 51 2e ec 3b 79  f1 8a 54 2b 93 45 33 c3  |...Q..;y..T+.E3.|
-000000a0  79 17 03 03 02 6d 0e c9  a4 55 8e 8c 09 55 cd a6  |y....m...U...U..|
-000000b0  d4 dc 1e 5a de ee 56 c8  c2 ac 12 77 77 76 82 fc  |...Z..V....wwv..|
-000000c0  a6 44 cb c8 c3 16 c4 5e  bc 3f f3 3b 6c 33 f3 35  |.D.....^.?.;l3.5|
-000000d0  ed bd 8e 37 1a 25 de 7e  b3 88 71 ce f9 e5 9b a6  |...7.%.~..q.....|
-000000e0  99 11 0f 71 6b 36 11 04  66 a2 5f 74 1c c6 6a 99  |...qk6..f._t..j.|
-000000f0  49 84 d1 36 96 df 6d 2c  c5 a3 cf 5a c9 37 22 8a  |I..6..m,...Z.7".|
-00000100  72 e4 d4 25 ed 4a b1 c4  85 5a 9a f7 de 0b dd 41  |r..%.J...Z.....A|
-00000110  7d 14 63 35 2e 1c 77 6c  9e 6f 41 d1 cb 29 ca 6d  |}.c5..wl.oA..).m|
-00000120  88 1c 35 53 1b 14 24 79  84 ec 85 0d de e3 0f 2c  |..5S..$y.......,|
-00000130  23 ae 41 72 85 fb 43 36  82 ba 8f 78 79 a2 c3 95  |#.Ar..C6...xy...|
-00000140  72 19 ea 1d 2f 29 0e d5  11 85 e4 cc 8c a5 f4 8e  |r.../)..........|
-00000150  39 ba 88 8f e1 5a 54 7c  53 8b a3 1a 44 9c ae 5b  |9....ZT|S...D..[|
-00000160  1f 0e ea 06 f1 8e 5f 22  d1 ef ee e1 4c b6 1a 26  |......_"....L..&|
-00000170  db 53 96 e6 bc 0b 2f ee  b7 fa 47 af 1e 9c f6 7b  |.S..../...G....{|
-00000180  81 97 0f c3 08 9b 2c a3  de bd f7 8a 1e 13 ad de  |......,.........|
-00000190  a5 fc 5f c7 7a 53 72 e5  17 dc 0a eb 90 91 29 2e  |.._.zSr.......).|
-000001a0  7a a5 09 fd be 31 ff 81  ec a3 fc 91 41 4f cb c7  |z....1......AO..|
-000001b0  27 c3 39 8f cd 77 62 72  9a e9 e9 16 da 90 b6 6b  |'.9..wbr.......k|
-000001c0  05 70 c8 aa f5 cd 88 13  4d ff a5 a9 0f e7 d2 d3  |.p......M.......|
-000001d0  97 2b eb e1 d7 fe 74 da  fb 1e af 94 e6 52 18 48  |.+....t......R.H|
-000001e0  5b e8 c3 10 9d 76 de 17  86 67 83 4a e9 fa 30 e8  |[....v...g.J..0.|
-000001f0  46 95 f5 81 b1 a5 76 38  57 37 3a 8d df ad e7 30  |F.....v8W7:....0|
-00000200  41 b2 94 31 da 0d d6 5c  df 76 01 cd 4d c2 1b fe  |A..1...\.v..M...|
-00000210  bc 69 41 ac dd d7 dd 0a  7c 5b 31 5c c8 1e b3 14  |.iA.....|[1\....|
-00000220  39 20 51 26 6d e5 55 27  a4 9a bb fc 3d 4b 6a b0  |9 Q&m.U'....=Kj.|
-00000230  54 92 ee 33 1b 9b d5 41  fd ef 21 c6 f0 f8 90 a0  |T..3...A..!.....|
-00000240  c4 f5 86 d4 d9 c7 89 6f  67 23 37 31 44 2f 8f 55  |.......og#71D/.U|
-00000250  0a aa e1 9a ec 32 26 e2  ce 96 90 c6 f5 cc 95 79  |.....2&........y|
-00000260  da 0c b4 c1 62 d3 0a 8d  7b 83 33 8e af ff 57 c0  |....b...{.3...W.|
-00000270  5b ca 0f b5 64 10 81 43  12 86 67 cf b2 0a 53 f2  |[...d..C..g...S.|
-00000280  04 46 4f 99 ee e2 cd ce  3e 82 1f 34 43 26 f9 4c  |.FO.....>..4C&.L|
-00000290  57 b0 10 c0 37 40 9c 4f  fb 14 fa 4e 1e 4b 40 da  |W...7@.O...N.K@.|
-000002a0  cc c3 d0 d7 ee 63 18 2e  97 06 a6 49 69 07 7a 3e  |.....c.....Ii.z>|
-000002b0  da 47 68 70 b0 10 bf 8d  18 d2 14 c0 18 18 b2 61  |.Ghp...........a|
-000002c0  45 54 e8 20 34 f8 a3 74  5a 8d aa c2 63 af e8 ff  |ET. 4..tZ...c...|
-000002d0  f9 1b 33 d6 34 c2 f2 c2  3d d8 0e 32 7a 10 cc 21  |..3.4...=..2z..!|
-000002e0  02 22 a6 aa 7d 15 c3 7b  3f a2 50 5a 4e 53 ec f5  |."..}..{?.PZNS..|
-000002f0  11 dd 48 6e 7e e9 c5 94  2c c4 9a 6e 10 a6 c6 a5  |..Hn~...,..n....|
-00000300  9d e1 c5 43 e6 69 a1 91  65 50 eb e6 76 db f0 09  |...C.i..eP..v...|
-00000310  14 45 ef 17 03 03 00 99  e4 82 99 6b d8 57 ca 1b  |.E.........k.W..|
-00000320  78 98 88 ad c7 04 b7 d2  b2 d5 00 3b a9 bf 86 66  |x..........;...f|
-00000330  a7 30 72 95 29 2a 27 9f  9a 3d bd 0b e6 a0 04 22  |.0r.)*'..=....."|
-00000340  56 3d d8 08 84 a7 e7 c5  67 74 34 7d 57 1f c9 df  |V=......gt4}W...|
-00000350  71 0c 97 55 5a d9 8d 99  df 49 b5 a9 57 6d b0 c7  |q..UZ....I..Wm..|
-00000360  2d 4b 70 9d e7 e3 70 31  f0 2f 32 15 7b 67 b4 4c  |-Kp...p1./2.{g.L|
-00000370  f0 f0 4a 16 a5 37 b2 ae  9b 2a 72 7c 2e d8 22 a1  |..J..7...*r|..".|
-00000380  2b 91 f2 14 fc f9 27 fd  ca ad 27 dd 15 11 df b1  |+.....'...'.....|
-00000390  cc 4c 3a 45 3f b6 7c 53  c5 d0 82 49 1a f2 28 63  |.L:E?.|S...I..(c|
-000003a0  a2 be 6f 2f db d8 d3 76  0a 12 fa 87 14 00 11 e7  |..o/...v........|
-000003b0  1f 17 03 03 00 35 0c af  49 a1 ba 14 d4 e5 5c cf  |.....5..I.....\.|
-000003c0  c8 f7 fb 93 e3 d5 45 ac  59 ed 56 3c 1c e6 53 6a  |......E.Y.V<..Sj|
-000003d0  77 62 a3 1a 8c 55 14 b0  d8 6f dd 1c fb a4 6f 25  |wb...U...o....o%|
-000003e0  18 28 ab 9e a5 ad 6d 97  63 f4 9c                 |.(....m.c..|
+00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 df  |..+.....3.$... .|
+00000060  af ca 9c 12 9b 83 69 24  89 3e 44 fe 1c 31 dd 0d  |......i$.>D..1..|
+00000070  3b 52 fd 8e b6 c6 7b 05  9e d4 cc 62 a5 f0 27 14  |;R....{....b..'.|
+00000080  03 03 00 01 01 17 03 03  00 17 a8 47 c6 45 41 bc  |...........G.EA.|
+00000090  7e e3 fb 85 43 5d 6a 69  07 7f 62 05 9d 9e 5f 1f  |~...C]ji..b..._.|
+000000a0  9a 17 03 03 02 6d 7d 46  ba ff 8a 8a 3d a2 d0 29  |.....m}F....=..)|
+000000b0  1e 0d 18 03 84 13 03 de  cf 64 15 28 71 9a bb 80  |.........d.(q...|
+000000c0  d0 4f de 07 d8 f4 47 d5  78 1c 93 e1 50 27 70 81  |.O....G.x...P'p.|
+000000d0  34 c2 0d 63 ee 76 20 dd  c7 34 71 e5 c7 04 91 62  |4..c.v ..4q....b|
+000000e0  06 73 5c 71 e9 ce 13 f9  1c 5b 29 b5 16 64 0f 5b  |.s\q.....[)..d.[|
+000000f0  35 53 0d ba a6 26 1c 98  fa 20 41 a0 08 b1 d1 74  |5S...&... A....t|
+00000100  cd 00 92 7e b4 ce 0e b8  2a 6d e0 25 57 2f e1 af  |...~....*m.%W/..|
+00000110  2c 23 03 03 1d b6 98 70  ec 7d 57 a9 6c 8f 25 3d  |,#.....p.}W.l.%=|
+00000120  63 a3 0e 53 b2 15 8d 1d  62 14 04 50 a9 bc ab 7d  |c..S....b..P...}|
+00000130  ac fa 6a 68 ed f0 72 fd  9a 04 ac bd 44 10 a6 f0  |..jh..r.....D...|
+00000140  df 55 30 54 eb a1 c8 27  4d 6d 97 a1 c0 fc ca a5  |.U0T...'Mm......|
+00000150  c0 9c b8 29 53 13 f2 c8  81 f1 3d f8 35 e5 8d b0  |...)S.....=.5...|
+00000160  d9 c1 68 31 80 4f fb 3a  7a fc 20 ce 75 22 dc f6  |..h1.O.:z. .u"..|
+00000170  94 e9 ff c4 5a c2 1d e9  a2 55 11 df 5d 29 92 17  |....Z....U..])..|
+00000180  5e 9d df 16 97 e3 f0 d0  b6 bd 88 cf 5f 53 e5 da  |^..........._S..|
+00000190  08 98 37 ec d5 1d 8b 4b  59 33 6e 67 d7 e5 eb 9e  |..7....KY3ng....|
+000001a0  31 90 6b 75 c7 41 7c 1d  84 c3 78 03 0e 2b ce 5c  |1.ku.A|...x..+.\|
+000001b0  9a c2 e8 20 7c 8e bc 4a  6e e6 b9 30 ff b3 c0 33  |... |..Jn..0...3|
+000001c0  73 91 f7 b6 13 bc 2c 85  97 ed a6 23 ed c1 e0 ce  |s.....,....#....|
+000001d0  8a 67 9a a3 b2 80 bb 06  ea 9c ec cd 27 f6 1f ae  |.g..........'...|
+000001e0  22 6e e4 c6 ec 5d e3 d9  99 8d 5e 15 5c d0 f1 83  |"n...]....^.\...|
+000001f0  f2 dc 20 a0 67 ee e0 94  05 e3 d7 e9 a2 65 ae d8  |.. .g........e..|
+00000200  da 12 2a db cd 2b 31 c3  ec 12 5b e0 5e 48 66 00  |..*..+1...[.^Hf.|
+00000210  d9 f5 b8 28 1f ef 90 e8  8f a7 78 d7 1c 49 1d 10  |...(......x..I..|
+00000220  d0 79 08 23 12 e1 30 91  7f 26 43 e2 0d dd 0f 6b  |.y.#..0..&C....k|
+00000230  ca ac 25 5f 18 86 40 fd  04 50 f6 dc fb 25 e4 67  |..%_..@..P...%.g|
+00000240  d5 94 fe 3a 55 7f 0e 63  31 f2 96 40 cd 61 c4 e1  |...:U..c1..@.a..|
+00000250  06 bc 5f 80 e9 1d 69 7c  70 7e e6 7f 25 00 75 ce  |.._...i|p~..%.u.|
+00000260  49 e4 bc 4c f4 79 8a d7  67 f3 50 a3 85 d2 96 cb  |I..L.y..g.P.....|
+00000270  51 f4 99 93 d6 20 cf 0d  5f 2d 87 83 df 7b d2 76  |Q.... .._-...{.v|
+00000280  da 9c 47 fb 08 80 43 8e  1f c7 db 8e a9 a7 d5 bb  |..G...C.........|
+00000290  a3 af 0a 3e a3 a3 8c eb  eb e0 93 45 56 a3 eb f0  |...>.......EV...|
+000002a0  6e cd be 8f 42 4c aa 39  36 0e f2 d6 cc 37 ce a4  |n...BL.96....7..|
+000002b0  31 c0 e0 24 3e 52 8c 3f  dc 6e 73 e0 0e ef 54 b7  |1..$>R.?.ns...T.|
+000002c0  27 2f 80 f8 16 0b 27 ea  73 66 c1 59 0b 91 a6 ae  |'/....'.sf.Y....|
+000002d0  f9 d7 d3 60 c0 b0 da 0f  83 19 c2 e0 6e e0 d0 a6  |...`........n...|
+000002e0  87 74 91 f8 6c 46 e3 cd  3a 4c e5 ee 48 94 5b bc  |.t..lF..:L..H.[.|
+000002f0  e4 b5 ed 35 ba 11 c7 0d  76 e9 0a 52 11 a1 35 c2  |...5....v..R..5.|
+00000300  e3 c3 9d fa 9d 9b 45 59  6a de 5b 9c c8 7e c3 00  |......EYj.[..~..|
+00000310  16 06 d9 17 03 03 00 99  63 23 47 37 41 24 5e b5  |........c#G7A$^.|
+00000320  7a 9d 0c 74 c7 f8 c8 62  9e c1 8a 44 29 22 d0 96  |z..t...b...D)"..|
+00000330  c7 94 a1 c5 f6 80 1f 23  70 d5 61 cf b5 87 41 26  |.......#p.a...A&|
+00000340  74 74 9b f4 1c 9d eb b3  da 39 0f 93 74 6a 2d 44  |tt.......9..tj-D|
+00000350  b2 04 31 c0 b0 e8 27 1e  eb 6e 1d 76 aa a7 15 11  |..1...'..n.v....|
+00000360  fd 5a 46 68 e2 76 ec 92  fe 25 41 10 0f 99 da cf  |.ZFh.v...%A.....|
+00000370  1a 04 a2 09 8e a1 73 ca  74 7e f7 d2 0e f1 cf 74  |......s.t~.....t|
+00000380  14 c4 bc 66 6e 28 58 24  09 cb bc da 4d da 4f af  |...fn(X$....M.O.|
+00000390  b8 c5 18 37 34 02 e2 60  b9 cc e9 4b 93 08 0a 22  |...74..`...K..."|
+000003a0  b6 a1 85 b2 ab cd 9c b6  1b 1d 18 46 63 4c 11 c5  |...........FcL..|
+000003b0  67 17 03 03 00 35 10 30  1b 3e 00 ea 4a 8a ab f7  |g....5.0.>..J...|
+000003c0  19 f8 3b 99 5f 56 a6 a3  ed dd 43 33 d9 8f 17 30  |..;._V....C3...0|
+000003d0  f5 a9 fb cd df 5e 95 e8  ff 35 1d 8d de d2 48 5a  |.....^...5....HZ|
+000003e0  af a1 b5 60 4f 75 98 58  1c 24 a1                 |...`Ou.X.$.|
 >>> Flow 3 (client to server)
-00000000  14 03 03 00 01 01 17 03  03 00 35 12 2a a7 31 42  |..........5.*.1B|
-00000010  e9 65 d6 88 9c 49 85 53  16 6c 85 bc d1 70 65 3a  |.e...I.S.l...pe:|
-00000020  aa cd d3 12 ce 69 e3 3a  63 7a 8d ed 54 df 9c 97  |.....i.:cz..T...|
-00000030  4e ef 7c 20 ce 41 ac 33  a9 3b fc 5e 35 34 65 00  |N.| .A.3.;.^54e.|
-00000040  17 03 03 00 17 11 5f 88  3b 45 0e 4e 8a 26 43 a3  |......_.;E.N.&C.|
-00000050  9e 77 10 76 8c e1 ed d3  19 f4 27 5f              |.w.v......'_|
+00000000  14 03 03 00 01 01 17 03  03 00 35 a5 8d 0a 81 b7  |..........5.....|
+00000010  76 39 48 24 74 8a a8 f0  91 9b b7 10 14 e3 1f fe  |v9H$t...........|
+00000020  a5 2f 96 6a 7a c3 9d 90  66 99 46 78 c8 d0 1d ba  |./.jz...f.Fx....|
+00000030  34 be 04 c1 a9 4d 17 60  06 a8 04 18 f3 53 9b 33  |4....M.`.....S.3|
+00000040  17 03 03 00 17 14 2c cf  98 1c b3 44 d5 cb 9a 8a  |......,....D....|
+00000050  46 84 e8 d2 7d 81 bf 74  e6 08 4b 1c              |F...}..t..K.|
 >>> Flow 4 (server to client)
-00000000  17 03 03 00 16 7d 92 67  60 95 ba fa a0 5f 03 e9  |.....}.g`...._..|
-00000010  2b e6 53 ed fb 6b 4f b9  e9 09 10                 |+.S..kO....|
+00000000  17 03 03 00 16 3e c3 0e  81 bd 7c e9 21 c8 d1 3f  |.....>....|.!..?|
+00000010  94 a9 37 43 21 42 3b 81  ba 65 53                 |..7C!B;..eS|
 >>> Flow 5 (client to server)
-00000000  17 03 03 00 16 06 17 fb  4b 33 c7 06 d5 a9 40 e8  |........K3....@.|
-00000010  c7 09 65 b2 5c 2d 45 2f  bf 45 a8                 |..e.\-E/.E.|
+00000000  17 03 03 00 16 63 a6 48  59 77 ae a9 a7 40 e2 57  |.....c.HYw...@.W|
+00000010  9b 41 bb e8 14 06 01 46  71 46 77                 |.A.....FqFw|
 >>> Flow 6 (server to client)
-00000000  17 03 03 00 1a 04 5e c0  bb ad 6c 2f 65 61 5c 39  |......^...l/ea\9|
-00000010  a9 e2 c4 9e 0e 4c 68 d2  a9 97 8a bf 95 39 3f     |.....Lh......9?|
+00000000  17 03 03 00 1a 20 8a 20  30 bc 48 17 8f ed 57 bb  |..... . 0.H...W.|
+00000010  e8 2a da 2a 21 5b 4d 11  74 13 32 6f 1c d6 7c     |.*.*![M.t.2o..||
 >>> Flow 7 (client to server)
-00000000  17 03 03 00 1d 1f 74 d0  fb ed fa 59 81 21 7e f0  |......t....Y.!~.|
-00000010  41 c8 6e 6b 9f b6 1a 86  ad 2e ac 9e 3d 3b 66 c9  |A.nk........=;f.|
-00000020  4a 87 17 03 03 00 13 7b  76 c4 85 c1 41 47 6d 35  |J......{v...AGm5|
-00000030  98 86 02 d5 3b e4 6b 4c  3e 7a                    |....;.kL>z|
+00000000  17 03 03 00 1d fb 5b 0c  dc f1 6b 02 a7 f6 68 21  |......[...k...h!|
+00000010  a4 5c 29 7e 52 08 5f 4d  fb cb e4 a6 ae c9 e0 09  |.\)~R._M........|
+00000020  01 02 17 03 03 00 13 4e  79 eb 2d 97 87 45 9d 73  |.......Ny.-..E.s|
+00000030  6f 13 be c5 68 50 ef 03  4c 18                    |o...hP..L.|
diff --git a/src/crypto/tls/testdata/Client-TLSv13-P256-ECDHE b/src/crypto/tls/testdata/Client-TLSv13-P256-ECDHE
index db87bef..7280daf 100644
--- a/src/crypto/tls/testdata/Client-TLSv13-P256-ECDHE
+++ b/src/crypto/tls/testdata/Client-TLSv13-P256-ECDHE
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 01 15 01 00 01  11 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 01 19 01 00 01  15 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 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,88 +7,88 @@
 00000050  cc a8 c0 2b c0 2f c0 2c  c0 30 c0 09 c0 13 c0 0a  |...+./.,.0......|
 00000060  c0 14 00 9c 00 9d 00 2f  00 35 c0 12 00 0a c0 23  |......./.5.....#|
 00000070  c0 27 00 3c c0 07 c0 11  00 05 13 03 13 01 13 02  |.'.<............|
-00000080  01 00 00 96 00 05 00 05  01 00 00 00 00 00 0a 00  |................|
+00000080  01 00 00 9a 00 05 00 05  01 00 00 00 00 00 0a 00  |................|
 00000090  04 00 02 00 17 00 0b 00  02 01 00 00 0d 00 1a 00  |................|
 000000a0  18 08 04 04 03 08 07 08  05 08 06 04 01 05 01 06  |................|
-000000b0  01 05 03 06 03 02 01 02  03 ff 01 00 01 00 00 12  |................|
-000000c0  00 00 00 2b 00 09 08 03  04 03 03 03 02 03 01 00  |...+............|
-000000d0  33 00 47 00 45 00 17 00  41 04 1e 18 37 ef 0d 19  |3.G.E...A...7...|
-000000e0  51 88 35 75 71 b5 e5 54  5b 12 2e 8f 09 67 fd a7  |Q.5uq..T[....g..|
-000000f0  24 20 3e b2 56 1c ce 97  28 5e f8 2b 2d 4f 9e f1  |$ >.V...(^.+-O..|
-00000100  07 9f 6c 4b 5b 83 56 e2  32 42 e9 58 b6 d7 49 a6  |..lK[.V.2B.X..I.|
-00000110  b5 68 1a 41 03 56 6b dc  5a 89                    |.h.A.Vk.Z.|
+000000b0  01 05 03 06 03 02 01 02  03 ff 01 00 01 00 00 17  |................|
+000000c0  00 00 00 12 00 00 00 2b  00 09 08 03 04 03 03 03  |.......+........|
+000000d0  02 03 01 00 33 00 47 00  45 00 17 00 41 04 1e 18  |....3.G.E...A...|
+000000e0  37 ef 0d 19 51 88 35 75  71 b5 e5 54 5b 12 2e 8f  |7...Q.5uq..T[...|
+000000f0  09 67 fd a7 24 20 3e b2  56 1c ce 97 28 5e f8 2b  |.g..$ >.V...(^.+|
+00000100  2d 4f 9e f1 07 9f 6c 4b  5b 83 56 e2 32 42 e9 58  |-O....lK[.V.2B.X|
+00000110  b6 d7 49 a6 b5 68 1a 41  03 56 6b dc 5a 89        |..I..h.A.Vk.Z.|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 9b 02 00 00  97 03 03 bb 03 f1 4e 88  |..............N.|
-00000010  23 9e 85 ee 32 13 db 0d  69 11 48 47 c6 c9 e5 b2  |#...2...i.HG....|
-00000020  25 9d 0c 27 87 05 3f 58  42 60 2d 20 00 00 00 00  |%..'..?XB`- ....|
+00000000  16 03 03 00 9b 02 00 00  97 03 03 fe 3a 17 76 b0  |............:.v.|
+00000010  7f a1 ed 8e fa 88 7a c6  d0 78 62 83 db b8 a3 72  |......z..xb....r|
+00000020  77 c7 18 54 f3 07 3b 08  f0 fb be 20 00 00 00 00  |w..T..;.... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000040  00 00 00 00 00 00 00 00  00 00 00 00 13 03 00 00  |................|
 00000050  4f 00 2b 00 02 03 04 00  33 00 45 00 17 00 41 04  |O.+.....3.E...A.|
-00000060  85 3c 83 1b e5 02 e9 0d  89 cc c0 f7 af 1e ba af  |.<..............|
-00000070  de ad cb 8f 4d 58 04 40  c2 60 e9 41 8b 94 26 76  |....MX.@.`.A..&v|
-00000080  73 64 c3 27 e3 51 9d 5f  21 97 59 a3 02 cc 20 61  |sd.'.Q._!.Y... a|
-00000090  b7 ef cb bb d9 31 b6 b7  b1 77 ea 8d 69 13 13 48  |.....1...w..i..H|
-000000a0  14 03 03 00 01 01 17 03  03 00 17 ab ac 2e 62 de  |..............b.|
-000000b0  b6 f4 c7 35 cf b4 75 fc  a4 a5 2c 40 68 f5 48 80  |...5..u...,@h.H.|
-000000c0  d2 8b 17 03 03 02 6d a9  36 b5 10 78 1f af 79 65  |......m.6..x..ye|
-000000d0  dd ee 36 08 b9 96 e2 bf  09 53 c7 ee 12 19 1b de  |..6......S......|
-000000e0  96 25 cb a7 55 71 28 22  16 3f 4b 3e 15 a2 2e 57  |.%..Uq(".?K>...W|
-000000f0  99 85 28 b2 01 16 3a 75  ff 5e 21 39 6c be fc bd  |..(...:u.^!9l...|
-00000100  24 33 ec c7 50 83 49 91  8a ed 43 38 b5 48 cd 92  |$3..P.I...C8.H..|
-00000110  dd 9a f1 b7 90 61 3b 8f  ff b9 cf 97 3d 8e 23 8e  |.....a;.....=.#.|
-00000120  d1 78 52 b4 ba a1 75 97  32 52 e3 1f c8 43 ca b7  |.xR...u.2R...C..|
-00000130  89 46 e6 30 c2 c5 32 b3  5f a8 ea ea e2 31 d2 41  |.F.0..2._....1.A|
-00000140  23 5e 64 a2 b9 23 27 73  b2 df 77 cd 04 8b dd 37  |#^d..#'s..w....7|
-00000150  a5 77 df 0e 4f 9d 01 22  7b be 7a 0c 18 5c 8b 62  |.w..O.."{.z..\.b|
-00000160  7c 6b 7e a7 54 8c 69 97  50 d7 cf a0 a4 cb 3a 3b  ||k~.T.i.P.....:;|
-00000170  76 7b 0a de 80 d1 40 c3  05 5e b3 4e 71 cd 03 82  |v{....@..^.Nq...|
-00000180  d5 95 d0 38 ab 65 83 24  66 d2 31 2d 9e 58 16 87  |...8.e.$f.1-.X..|
-00000190  b8 ab 4c 4e 75 40 7e 3d  33 2f f4 ed 0b a8 11 1c  |..LNu@~=3/......|
-000001a0  7a a4 b0 e3 6a 73 d0 6e  e6 82 39 c1 cf 57 a4 9a  |z...js.n..9..W..|
-000001b0  8b fc bc 8e e8 6a c3 e1  b0 64 18 55 6d 19 30 25  |.....j...d.Um.0%|
-000001c0  34 f8 b1 ef cf 3c 04 08  69 10 ad 08 67 5b 8d 64  |4....<..i...g[.d|
-000001d0  eb 83 72 39 2e 56 e4 d2  e9 f2 da 40 3e 85 29 ab  |..r9.V.....@>.).|
-000001e0  5b 83 e5 b0 d2 9b eb c3  99 6e 2a f3 78 95 d4 7a  |[........n*.x..z|
-000001f0  7f bf 9c 16 55 77 43 4d  67 f7 4a 6f 40 27 a2 82  |....UwCMg.Jo@'..|
-00000200  b9 86 05 5d 90 e2 52 a2  d4 7c 7b 3e da 30 c1 aa  |...]..R..|{>.0..|
-00000210  30 2e 9a 34 c5 59 dd db  e9 25 67 da 22 47 f2 be  |0..4.Y...%g."G..|
-00000220  cc c8 5a 4e da cf ad 86  8d bd b0 68 26 69 ea 3a  |..ZN.......h&i.:|
-00000230  1c 1e 29 ae e1 09 63 88  f0 81 31 f9 70 a7 92 27  |..)...c...1.p..'|
-00000240  32 9e 3b 6f 09 5e 42 20  53 88 bf 09 8b a8 17 5c  |2.;o.^B S......\|
-00000250  24 7c 18 1f 9c 99 9b db  6d 11 26 8e 92 2c a1 b4  |$|......m.&..,..|
-00000260  5c 9f d9 0a a8 af 25 f7  84 f5 65 d1 b1 6c d8 aa  |\.....%...e..l..|
-00000270  49 c7 a6 13 47 2e 55 f4  2e de 3d 43 c1 15 8d 60  |I...G.U...=C...`|
-00000280  c1 27 59 7e 7b 14 ee 54  09 fc 99 79 c9 bf fb 45  |.'Y~{..T...y...E|
-00000290  2d 32 ed 1a 2c 84 bc f4  a2 b5 5f 4e cf 60 29 91  |-2..,....._N.`).|
-000002a0  90 b6 ab 06 8f 2d 43 a5  a5 54 0d 67 52 c2 1c fb  |.....-C..T.gR...|
-000002b0  f3 41 b7 67 b4 50 05 86  19 75 93 8b 6c c3 bf 08  |.A.g.P...u..l...|
-000002c0  64 f2 df ff 37 6d 2f 1e  3a 28 f4 ba 27 8d 61 d5  |d...7m/.:(..'.a.|
-000002d0  79 70 19 82 99 7a e5 68  f3 c1 23 da 5d e1 98 b2  |yp...z.h..#.]...|
-000002e0  69 ca 42 83 61 29 3f d9  20 51 f2 a9 ea 1c 0b 5a  |i.B.a)?. Q.....Z|
-000002f0  20 b0 af 70 cc c5 ad 72  6b 09 85 56 8a 26 86 cf  | ..p...rk..V.&..|
-00000300  4e 9a 56 97 5d 63 8d 1d  46 04 48 16 c9 1e 91 47  |N.V.]c..F.H....G|
-00000310  74 53 28 51 7e 3c 84 a1  50 d6 f3 ac 31 ce 04 18  |tS(Q~<..P...1...|
-00000320  81 38 0d c5 3d f5 d5 04  2f f0 96 9b 73 49 4c d6  |.8..=.../...sIL.|
-00000330  89 d9 b9 be 17 03 03 00  99 3a 37 ed 2d 98 80 f9  |.........:7.-...|
-00000340  d0 04 14 12 8c 63 45 cc  8d cb 29 5f 0e f0 86 ef  |.....cE...)_....|
-00000350  8d 6c d6 0f ef 66 99 91  e8 8c d7 7b 21 07 7e 96  |.l...f.....{!.~.|
-00000360  84 f8 f9 5b 1b 39 8b 4f  16 ec 5c 69 7b 18 09 5d  |...[.9.O..\i{..]|
-00000370  95 f1 f3 73 4b 8f 84 66  ee 61 85 dd fe ea 36 df  |...sK..f.a....6.|
-00000380  e5 2a 71 ec 2d 7e 47 1c  b7 79 2d 87 f8 dc 44 27  |.*q.-~G..y-...D'|
-00000390  8a f1 13 6e df ca 59 79  9b 18 01 7e 31 bd 44 f7  |...n..Yy...~1.D.|
-000003a0  8d ad 1c 97 e7 e1 b9 a6  17 d1 25 d1 b8 0d 04 bb  |..........%.....|
-000003b0  21 a4 08 db a2 08 87 5c  04 9a 11 fa c6 24 db 20  |!......\.....$. |
-000003c0  42 79 9c 97 dd 6c d2 e7  24 b4 79 47 be f3 43 87  |By...l..$.yG..C.|
-000003d0  0f 95 17 03 03 00 35 9e  7d 12 0e d6 0a e6 af a3  |......5.}.......|
-000003e0  83 dd eb 08 73 2d 43 7e  81 85 51 4c d1 ad d0 77  |....s-C~..QL...w|
-000003f0  8d 28 62 44 41 9c b0 e9  93 d7 3d 07 e4 e1 6e 4c  |.(bDA.....=...nL|
-00000400  a8 5b 4a 3f 58 3f 97 07  73 d7 5a 62              |.[J?X?..s.Zb|
+00000060  e2 a0 62 23 50 9d 82 7d  bc f4 f4 e7 ed d0 6c 6e  |..b#P..}......ln|
+00000070  f2 46 f4 e6 11 5f e0 f3  02 e3 13 67 e3 92 da 39  |.F..._.....g...9|
+00000080  15 a2 3a c7 80 16 e6 25  fd 86 59 56 08 ee 78 eb  |..:....%..YV..x.|
+00000090  d9 ba 36 69 d3 fe bc fc  92 a1 1b 48 a1 a5 6c 09  |..6i.......H..l.|
+000000a0  14 03 03 00 01 01 17 03  03 00 17 0f 26 b2 e7 86  |............&...|
+000000b0  1a 6f e5 19 28 d1 0c 5f  4d 45 7e e6 9f f8 16 03  |.o..(.._ME~.....|
+000000c0  d2 71 17 03 03 02 6d 2e  bc 2a 2c eb e1 97 06 37  |.q....m..*,....7|
+000000d0  87 39 bf f1 79 3a ba 23  51 26 37 a1 ba 2c 30 d9  |.9..y:.#Q&7..,0.|
+000000e0  65 f8 8e 54 b7 1a 8a ff  e8 eb 50 ab f4 e5 0f 07  |e..T......P.....|
+000000f0  94 6b 3d 40 2f bc f7 1c  51 b7 6a 22 78 da 4c ab  |.k=@/...Q.j"x.L.|
+00000100  74 2b b5 f9 c5 2f f5 b8  8a c0 3b c3 56 d8 79 94  |t+.../....;.V.y.|
+00000110  d7 2c bc 7e 2d a8 aa 7d  93 1e 24 49 34 a2 c8 83  |.,.~-..}..$I4...|
+00000120  fc 0e b2 c7 f8 15 9c fd  6f 67 d8 32 e4 ce e6 c2  |........og.2....|
+00000130  a5 ae c2 8b 40 dd b5 46  dc b9 40 e1 21 47 0e 55  |....@..F..@.!G.U|
+00000140  7b f5 87 35 6d 10 22 04  a3 4f f8 95 54 0c 41 a6  |{..5m."..O..T.A.|
+00000150  95 7b 0e 96 4b 73 c2 75  c9 87 ce a9 89 06 a9 7a  |.{..Ks.u.......z|
+00000160  26 ec 81 70 48 4d 24 f4  09 00 aa 92 ac a2 77 9d  |&..pHM$.......w.|
+00000170  ad aa 18 0f e0 f7 91 c9  80 46 c2 db e7 87 fd 3d  |.........F.....=|
+00000180  f2 8f ee cb 26 7d ae 1f  17 6e d0 d4 cd 11 80 a2  |....&}...n......|
+00000190  57 57 88 78 2e 32 ac 2f  1c ad 5b 86 d2 94 55 9f  |WW.x.2./..[...U.|
+000001a0  cd 41 b7 cf 6d bb 45 6a  0b 72 79 91 81 1a 79 b3  |.A..m.Ej.ry...y.|
+000001b0  6e 7f f4 8a 7b c0 b0 a6  00 0e c0 fe 67 4e e3 96  |n...{.......gN..|
+000001c0  5b 0f 1b 47 b5 43 94 91  e9 c4 5f 0b 04 46 bd 53  |[..G.C...._..F.S|
+000001d0  f0 44 a9 0c 46 39 d0 e0  9c 25 76 4e 26 f4 49 12  |.D..F9...%vN&.I.|
+000001e0  42 7a a7 19 98 f0 93 1f  42 78 c7 1c 87 f0 92 ab  |Bz......Bx......|
+000001f0  ec 8b f9 4f e3 60 ea fd  88 b5 9d 68 18 59 60 ee  |...O.`.....h.Y`.|
+00000200  66 a9 0a 24 33 4a 9f c1  c0 e1 70 a0 c3 b1 8d f5  |f..$3J....p.....|
+00000210  4a eb 5e f6 8f a9 2f c7  df 88 40 41 61 b3 3e 18  |J.^.../...@Aa.>.|
+00000220  66 f7 e1 b7 a6 a9 3a 10  73 ab a4 ce 39 40 8a 78  |f.....:.s...9@.x|
+00000230  47 7f bc c9 08 c3 f0 0e  1e 09 87 bf fc e0 46 38  |G.............F8|
+00000240  e7 79 4e 9e 50 94 e7 94  ab 54 47 a7 07 7f 9d 7c  |.yN.P....TG....||
+00000250  9e 83 9b ba dd 33 5d de  db 80 9f a0 7d 9f c3 57  |.....3].....}..W|
+00000260  83 45 0d a6 82 61 75 b7  14 54 0c 7e 94 8a fb 4a  |.E...au..T.~...J|
+00000270  9b 62 bf 8f ae 37 76 23  a0 e0 c0 e0 c1 2c 53 28  |.b...7v#.....,S(|
+00000280  4c 5b b7 b3 c1 4e bb e5  cd e8 b0 7b 8e 38 b0 bb  |L[...N.....{.8..|
+00000290  74 d2 00 63 b4 7b 97 a3  48 52 0f f2 60 0c 0b e4  |t..c.{..HR..`...|
+000002a0  b4 0f 1c 9c 97 e1 fa ff  26 61 f8 3c ee 41 66 f8  |........&a.<.Af.|
+000002b0  b3 91 cd 30 bd ef 81 cf  23 3a ea fd b8 96 b6 e3  |...0....#:......|
+000002c0  bd 32 f2 0f 7a 3d 08 2c  50 a4 16 4e a6 2b 6b 2e  |.2..z=.,P..N.+k.|
+000002d0  3e 7e a0 bc 10 c2 3c 30  65 fc 26 cd 2b 51 54 27  |>~....<0e.&.+QT'|
+000002e0  29 62 eb 99 bb 0b f8 29  ce 8a 21 87 c1 8e f8 6c  |)b.....)..!....l|
+000002f0  17 fe 96 08 db 03 ef 22  ab 2a 55 8e 11 15 19 97  |.......".*U.....|
+00000300  66 9b f3 16 b4 ce 7c 29  f7 e0 ba 1a 14 46 42 20  |f.....|).....FB |
+00000310  38 8b 26 8a 53 13 83 a0  a5 76 2d 4c 3c 88 6e a0  |8.&.S....v-L<.n.|
+00000320  38 23 69 20 d1 3e c9 40  9b 46 4c 09 d9 50 80 49  |8#i .>.@.FL..P.I|
+00000330  bd 59 d9 ec 17 03 03 00  99 a2 f2 c7 ce c6 45 c8  |.Y............E.|
+00000340  45 9a 9d a8 83 d9 81 ff  2d ef 81 f9 b7 3d 0e 79  |E.......-....=.y|
+00000350  54 5f f4 ca f0 41 20 91  f7 5c 53 49 09 ee b6 27  |T_...A ..\SI...'|
+00000360  82 61 0f 1e b9 2d 0f 4e  dd e7 3f 05 3c eb bc 2c  |.a...-.N..?.<..,|
+00000370  81 ca 5d 2f e5 56 f8 ec  e5 cb 69 da e9 16 79 ba  |..]/.V....i...y.|
+00000380  61 8d a9 09 31 2f d3 4c  87 bf 6c 1a 50 df 81 cd  |a...1/.L..l.P...|
+00000390  ba 4c 28 a1 47 05 13 65  f5 6d a0 fb 04 f6 5f 78  |.L(.G..e.m...._x|
+000003a0  d9 28 67 99 ee b9 a1 07  85 3c 5b 17 48 f3 87 43  |.(g......<[.H..C|
+000003b0  ca 40 12 59 85 34 da 67  8a 26 3e 0c 11 9f 42 82  |.@.Y.4.g.&>...B.|
+000003c0  81 80 56 5b a9 6f c2 73  9d 9a 5e ab 97 a2 a4 49  |..V[.o.s..^....I|
+000003d0  9f 73 17 03 03 00 35 7c  74 eb 0d 2b 2f b3 92 2e  |.s....5|t..+/...|
+000003e0  54 12 f9 cb ae fb d4 8d  6f 7f 93 c5 bd 54 1d d5  |T.......o....T..|
+000003f0  06 71 bf 3f 43 71 7b ce  20 9d a9 12 bf dd 2c 3c  |.q.?Cq{. .....,<|
+00000400  b5 7e 9d 3a 56 e3 8b d1  15 0e 69 35              |.~.:V.....i5|
 >>> Flow 3 (client to server)
-00000000  14 03 03 00 01 01 17 03  03 00 35 df 31 1a 84 e2  |..........5.1...|
-00000010  93 54 01 f2 d1 e8 32 6c  32 91 e5 64 86 68 ad 5f  |.T....2l2..d.h._|
-00000020  aa 24 54 86 b2 39 92 24  06 65 5c 06 67 43 7d 09  |.$T..9.$.e\.gC}.|
-00000030  79 78 c6 f3 cf 6c a9 ec  38 e3 ec 81 c4 9b c5 33  |yx...l..8......3|
-00000040  17 03 03 00 17 25 ed 98  67 8f ad e8 60 ce 5b ad  |.....%..g...`.[.|
-00000050  ab 3e 67 64 e3 8d bf 98  96 a2 3d 99 17 03 03 00  |.>gd......=.....|
-00000060  13 9d 28 f2 24 fe d6 11  b0 64 d6 8a 8d c1 81 e0  |..(.$....d......|
-00000070  17 d5 a0 f3                                       |....|
+00000000  14 03 03 00 01 01 17 03  03 00 35 07 f8 0f 71 b3  |..........5...q.|
+00000010  74 36 f9 e0 2c a4 ac bc  9f 19 fc a7 aa 3d 8e cb  |t6..,........=..|
+00000020  22 4b 8f 54 f3 4f b2 a5  85 8a c9 ab b0 b7 62 61  |"K.T.O........ba|
+00000030  58 dc 64 88 bb 43 6e 61  af 02 88 ca d8 15 b3 02  |X.d..Cna........|
+00000040  17 03 03 00 17 25 37 e4  43 40 29 dd 4b fd a6 22  |.....%7.C@).K.."|
+00000050  00 75 02 49 c6 64 a1 ed  de ed 96 cb 17 03 03 00  |.u.I.d..........|
+00000060  13 d6 49 0b ba 13 f3 5b  80 63 79 c8 6a f6 2d df  |..I....[.cy.j.-.|
+00000070  3f d3 2c 8b                                       |?.,.|
diff --git a/src/crypto/tls/testdata/Client-TLSv13-X25519-ECDHE b/src/crypto/tls/testdata/Client-TLSv13-X25519-ECDHE
index 4a43382..b430ce0 100644
--- a/src/crypto/tls/testdata/Client-TLSv13-X25519-ECDHE
+++ b/src/crypto/tls/testdata/Client-TLSv13-X25519-ECDHE
@@ -1,5 +1,5 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 f4 01 00 00  f0 03 03 00 00 00 00 00  |................|
+00000000  16 03 01 00 f8 01 00 00  f4 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 20 00 00 00 00  |........... ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
@@ -7,84 +7,84 @@
 00000050  cc a8 c0 2b c0 2f c0 2c  c0 30 c0 09 c0 13 c0 0a  |...+./.,.0......|
 00000060  c0 14 00 9c 00 9d 00 2f  00 35 c0 12 00 0a c0 23  |......./.5.....#|
 00000070  c0 27 00 3c c0 07 c0 11  00 05 13 03 13 01 13 02  |.'.<............|
-00000080  01 00 00 75 00 05 00 05  01 00 00 00 00 00 0a 00  |...u............|
+00000080  01 00 00 79 00 05 00 05  01 00 00 00 00 00 0a 00  |...y............|
 00000090  04 00 02 00 1d 00 0b 00  02 01 00 00 0d 00 1a 00  |................|
 000000a0  18 08 04 04 03 08 07 08  05 08 06 04 01 05 01 06  |................|
-000000b0  01 05 03 06 03 02 01 02  03 ff 01 00 01 00 00 12  |................|
-000000c0  00 00 00 2b 00 09 08 03  04 03 03 03 02 03 01 00  |...+............|
-000000d0  33 00 26 00 24 00 1d 00  20 2f e5 7d a3 47 cd 62  |3.&.$... /.}.G.b|
-000000e0  43 15 28 da ac 5f bb 29  07 30 ff f6 84 af c4 cf  |C.(.._.).0......|
-000000f0  c2 ed 90 99 5f 58 cb 3b  74                       |...._X.;t|
+000000b0  01 05 03 06 03 02 01 02  03 ff 01 00 01 00 00 17  |................|
+000000c0  00 00 00 12 00 00 00 2b  00 09 08 03 04 03 03 03  |.......+........|
+000000d0  02 03 01 00 33 00 26 00  24 00 1d 00 20 2f e5 7d  |....3.&.$... /.}|
+000000e0  a3 47 cd 62 43 15 28 da  ac 5f bb 29 07 30 ff f6  |.G.bC.(.._.).0..|
+000000f0  84 af c4 cf c2 ed 90 99  5f 58 cb 3b 74           |........_X.;t|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 7a 02 00 00  76 03 03 eb 1b 4e e5 65  |....z...v....N.e|
-00000010  54 ab 07 68 1c d9 32 0f  0e c2 ae a3 2a 89 37 50  |T..h..2.....*.7P|
-00000020  23 51 61 7d 68 60 34 0d  40 2f b8 20 00 00 00 00  |#Qa}h`4.@/. ....|
+00000000  16 03 03 00 7a 02 00 00  76 03 03 94 fd 21 44 52  |....z...v....!DR|
+00000010  54 21 7e 4a 1c 83 6a ce  c7 21 df b2 f3 1e 4c 73  |T!~J..j..!....Ls|
+00000020  d3 f0 8b cc 24 58 17 5c  9c 0c 28 20 00 00 00 00  |....$X.\..( ....|
 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000040  00 00 00 00 00 00 00 00  00 00 00 00 13 03 00 00  |................|
-00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 17  |..+.....3.$... .|
-00000060  7d df 14 8a ad 43 51 c3  c2 08 3a ea f7 e3 96 6a  |}....CQ...:....j|
-00000070  b7 8b 61 66 d9 82 c5 7b  b9 77 bc 62 6a 19 04 14  |..af...{.w.bj...|
-00000080  03 03 00 01 01 17 03 03  00 17 4e 7b b6 d1 b1 19  |..........N{....|
-00000090  0d 0c d0 d3 5a 66 44 5c  81 49 74 f3 71 3b 97 5e  |....ZfD\.It.q;.^|
-000000a0  ee 17 03 03 02 6d 00 17  b1 4d b9 f5 fc ea 48 72  |.....m...M....Hr|
-000000b0  aa a5 1c 8b fe 97 08 54  ab 2d 0a 0e f7 51 41 bf  |.......T.-...QA.|
-000000c0  7b 14 ba b7 d9 0a 30 44  db b9 06 e7 6b a9 0a 94  |{.....0D....k...|
-000000d0  49 a2 29 50 f2 7f 7e 68  91 41 ad a9 cb ee e2 bd  |I.)P..~h.A......|
-000000e0  03 fd 95 79 ea c3 77 ee  88 3b 7a 81 15 9f 17 96  |...y..w..;z.....|
-000000f0  b2 db b9 f3 26 dd 75 69  ef 12 c0 63 b0 04 63 ae  |....&.ui...c..c.|
-00000100  aa b3 67 f8 7f a5 17 cf  56 5f ee 34 2d d7 83 23  |..g.....V_.4-..#|
-00000110  84 00 4b 94 1a 76 2a 01  ce 49 0a 57 7d c8 65 7a  |..K..v*..I.W}.ez|
-00000120  d7 16 34 1c a8 37 fd 71  d4 79 08 b1 44 9f 9e a7  |..4..7.q.y..D...|
-00000130  78 ab 9d 0d c4 80 0e 81  35 75 23 59 89 1b 2c d3  |x.......5u#Y..,.|
-00000140  bc c9 86 b9 7b 22 19 30  dd cc 68 93 ab d2 98 dd  |....{".0..h.....|
-00000150  c2 9f 20 af c9 1a 87 b3  28 73 84 83 ca 98 1d 60  |.. .....(s.....`|
-00000160  df 12 19 70 80 f2 ff 20  64 b5 8c ef e2 e8 6a 5a  |...p... d.....jZ|
-00000170  df 8e ba 95 d8 2c c4 b6  4f a1 33 8c 8d a3 fc d3  |.....,..O.3.....|
-00000180  c4 4b ba b2 6d 3a f7 da  38 23 5f 03 a7 92 13 76  |.K..m:..8#_....v|
-00000190  12 73 26 17 30 e0 21 f1  16 8f a1 e5 6d f0 21 a8  |.s&.0.!.....m.!.|
-000001a0  c6 25 64 86 95 5e 6f 4d  21 f0 f3 a3 27 23 2b 4b  |.%d..^oM!...'#+K|
-000001b0  90 03 ba 6c ce 9c 20 ed  69 15 76 cb 39 bc fd 44  |...l.. .i.v.9..D|
-000001c0  10 b4 72 d5 44 9d f7 eb  a4 b0 d5 07 20 a1 6b 71  |..r.D....... .kq|
-000001d0  16 e4 f7 8f a0 d8 fa 86  db e6 ef eb 63 41 a0 17  |............cA..|
-000001e0  83 71 0d 1c 4b ec 58 c3  90 9c ea 34 79 a7 91 43  |.q..K.X....4y..C|
-000001f0  ad 3d ff 28 c8 b4 3e 7a  b6 83 53 f4 99 0b 86 bc  |.=.(..>z..S.....|
-00000200  f2 cf ae 1d a7 5c 7f 57  d9 85 95 25 33 bb 4d 79  |.....\.W...%3.My|
-00000210  25 2e 54 6d 5d 14 32 68  7d 6e 45 bd b1 e1 24 30  |%.Tm].2h}nE...$0|
-00000220  c2 1c 45 b9 a2 42 ae b5  c6 6a 56 f9 8a 12 51 f9  |..E..B...jV...Q.|
-00000230  61 a2 9d 56 98 09 8d ea  70 17 48 d8 23 48 ca 18  |a..V....p.H.#H..|
-00000240  43 1e a2 bc 88 69 3d 45  95 89 cc f0 74 8d 88 36  |C....i=E....t..6|
-00000250  5e a8 1b be 88 41 35 8d  de a9 20 23 f3 5e ab c9  |^....A5... #.^..|
-00000260  61 22 2e 86 54 2f c4 4a  60 04 c2 e3 b8 cf 1a 41  |a"..T/.J`......A|
-00000270  a6 31 ab 7a b5 07 dc 54  82 89 b1 1f 9f 62 98 bc  |.1.z...T.....b..|
-00000280  bd 39 be 23 ed d5 bc 0d  8e a6 69 14 26 39 fe ed  |.9.#......i.&9..|
-00000290  98 c8 48 36 6c 8e 9f 93  57 7a ba 33 03 35 c6 de  |..H6l...Wz.3.5..|
-000002a0  55 03 63 e8 a4 53 08 0a  b0 a7 3e a3 cb f2 df 3d  |U.c..S....>....=|
-000002b0  cd 59 df ee f6 45 2d 77  39 32 4a 1f 08 21 e7 db  |.Y...E-w92J..!..|
-000002c0  52 2a 06 86 e6 00 98 ca  9f a3 ad 0f 7f d3 25 6d  |R*............%m|
-000002d0  56 58 21 e2 39 59 56 15  74 4d 18 37 f5 40 29 db  |VX!.9YV.tM.7.@).|
-000002e0  de be 49 77 e0 2c 5c 6b  ee b1 bd 4a ea 2a 07 94  |..Iw.,\k...J.*..|
-000002f0  0f 21 7c bb 1f bd 3e ad  9e b6 95 7d 16 e8 f0 4e  |.!|...>....}...N|
-00000300  de e2 ca 9c 34 9f b8 e5  57 d5 b7 b5 8d 60 dd c2  |....4...W....`..|
-00000310  ce 47 2c 17 03 03 00 99  37 37 20 49 98 44 f6 b4  |.G,.....77 I.D..|
-00000320  58 54 ff 5e b0 05 22 8e  c6 68 9a ae 49 51 e9 f1  |XT.^.."..h..IQ..|
-00000330  71 75 cf 1a 79 da 33 f1  5f 7e a1 02 81 05 12 8b  |qu..y.3._~......|
-00000340  a3 a8 ad 87 ee f0 87 da  f1 16 80 9d 2e fa 5a 22  |..............Z"|
-00000350  a5 f5 b9 14 f5 8f 9b 35  87 ba 1a f7 c4 17 c8 f6  |.......5........|
-00000360  a1 1e 28 cd fe 03 90 9f  f0 81 d3 80 bb 4c 1a b1  |..(..........L..|
-00000370  c6 11 de 19 a1 5a 3c 73  77 f0 70 b8 d1 38 16 f3  |.....Z<sw.p..8..|
-00000380  64 d0 8e 9c fe 4d 83 48  dc 20 78 db 6a 65 3f f4  |d....M.H. x.je?.|
-00000390  0f a0 70 cc 30 bb cd 86  51 0c 20 ea 59 a5 ed e8  |..p.0...Q. .Y...|
-000003a0  72 d9 5e f3 c3 41 0b 19  f3 97 0f fc 77 42 6d 15  |r.^..A......wBm.|
-000003b0  92 17 03 03 00 35 ac 97  30 a0 8a d8 d2 e6 4a 5b  |.....5..0.....J[|
-000003c0  f5 58 32 22 63 8e 36 2e  21 a2 30 33 ae 49 55 76  |.X2"c.6.!.03.IUv|
-000003d0  cf c8 b3 3f 82 8d c3 0e  ea 22 ec 8f 65 c8 c4 0d  |...?....."..e...|
-000003e0  bf cc 6a 86 e9 32 50 db  02 93 ec                 |..j..2P....|
+00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 a0  |..+.....3.$... .|
+00000060  72 12 62 31 e2 99 77 93  96 75 a3 64 33 87 33 ab  |r.b1..w..u.d3.3.|
+00000070  be 61 78 45 34 c4 e7 14  d0 c1 3b cc bb cc 78 14  |.axE4.....;...x.|
+00000080  03 03 00 01 01 17 03 03  00 17 13 0e ae 6e fd 8b  |.............n..|
+00000090  f0 27 06 82 41 f5 68 63  1c 58 38 ad 3a 9e 59 4d  |.'..A.hc.X8.:.YM|
+000000a0  49 17 03 03 02 6d d8 a3  1c 91 84 93 3d 8d 27 4e  |I....m......=.'N|
+000000b0  70 a7 fd ac be cb 87 bc  20 19 ef c3 1a be ad b2  |p....... .......|
+000000c0  b2 9d 4a e8 00 31 81 e0  43 09 4a b4 90 cc 1a d5  |..J..1..C.J.....|
+000000d0  e9 47 56 64 cc e6 cc 3e  fa a6 a9 8f 79 0c ea 47  |.GVd...>....y..G|
+000000e0  55 5c 29 1a 3c ce 32 ea  45 30 66 01 07 30 22 60  |U\).<.2.E0f..0"`|
+000000f0  a0 2b 63 40 29 18 a2 7f  81 bd af 6a dd a9 44 8f  |.+c@)......j..D.|
+00000100  d3 e8 58 8d 63 11 00 e2  31 9f 98 3c 15 a0 8b 9e  |..X.c...1..<....|
+00000110  61 12 df a8 87 b5 2e 81  41 ed 3b a6 12 77 05 69  |a.......A.;..w.i|
+00000120  09 d1 9d cb 56 ee 86 24  cc ac 4c ff 17 b6 99 a2  |....V..$..L.....|
+00000130  c9 22 8a 9c 07 b3 a6 72  aa 33 30 8e 42 18 1d af  |.".....r.30.B...|
+00000140  73 a5 28 99 12 05 bd 5e  34 cc 72 9a e4 51 2d 46  |s.(....^4.r..Q-F|
+00000150  35 55 8d 7b f3 ce f5 50  43 70 f1 4a ea 92 eb bd  |5U.{...PCp.J....|
+00000160  18 72 b4 e9 90 fe e2 18  64 61 20 02 18 78 e8 75  |.r......da ..x.u|
+00000170  33 00 ff cc 72 f2 89 0e  fe 7d 7a 07 f8 64 95 6f  |3...r....}z..d.o|
+00000180  0b 3b 76 96 8f c1 d9 9f  6b 1a 10 28 d7 94 36 dc  |.;v.....k..(..6.|
+00000190  87 de f2 95 a3 f6 15 44  13 2e 0d 88 aa 86 10 38  |.......D.......8|
+000001a0  ff 5f 58 a9 b8 e0 b9 4c  fb a6 bb 1f f5 f6 25 4c  |._X....L......%L|
+000001b0  d5 ab bb 62 70 82 7f 47  5e 05 99 aa 1c d4 12 be  |...bp..G^.......|
+000001c0  77 2c 67 a3 5f 6c 9f 93  37 36 5f 96 34 8e 22 9d  |w,g._l..76_.4.".|
+000001d0  a4 5e 4f 8c ce 54 e7 ea  7c 40 f5 9b 20 84 2e 96  |.^O..T..|@.. ...|
+000001e0  32 37 6b 65 cf e8 0d cb  3b 54 67 32 ed f6 49 b9  |27ke....;Tg2..I.|
+000001f0  d0 4f 36 e6 8a 1c df 35  ee 8a be 3f 8f 5a c9 35  |.O6....5...?.Z.5|
+00000200  3d 1b 7e 78 e4 0a d6 f4  6d 3e 48 dc 0d 4e 03 47  |=.~x....m>H..N.G|
+00000210  81 db 60 a9 fb 17 8c 39  5e 7d 77 07 21 13 3b 53  |..`....9^}w.!.;S|
+00000220  f2 50 bb c3 16 37 24 b8  ef 4a 45 ad 3e ce 05 6a  |.P...7$..JE.>..j|
+00000230  25 fa 27 05 c8 f9 c5 d5  c3 b0 82 a8 0c ca ef 66  |%.'............f|
+00000240  58 a4 51 85 ee 94 2a 07  d9 a4 e5 1a b9 b8 9d a1  |X.Q...*.........|
+00000250  42 ae 3c 01 dc c2 96 84  a6 bd e4 e2 e6 37 f4 16  |B.<..........7..|
+00000260  51 62 9c ce 26 d5 fe ce  69 7a f5 dd f2 b9 7c d5  |Qb..&...iz....|.|
+00000270  9f 9d f6 ca d2 a3 3b 9d  73 99 72 38 3b be 3e 93  |......;.s.r8;.>.|
+00000280  d1 81 19 76 10 25 5b f7  3b b9 c3 21 b5 ef 1b 09  |...v.%[.;..!....|
+00000290  a5 97 76 a2 b6 4e a7 9e  9c b5 0a 9a a4 99 ec 5c  |..v..N.........\|
+000002a0  02 fc 1a 83 b8 a2 f1 a5  16 0f 09 7a 21 2b 75 cd  |...........z!+u.|
+000002b0  23 b5 cc 29 d5 09 3a 5e  88 9b 6b 4f 41 30 2a 42  |#..)..:^..kOA0*B|
+000002c0  03 98 56 2b 19 da e0 6f  5b f0 ee b9 a0 3d 98 12  |..V+...o[....=..|
+000002d0  41 af 96 ee 1c ae 55 84  b4 c5 98 f7 50 a7 62 cd  |A.....U.....P.b.|
+000002e0  d7 99 4f be c8 65 fa 64  a3 2b bd b2 cc 9a 96 89  |..O..e.d.+......|
+000002f0  bb 9a 78 8f 60 5f 37 12  96 28 21 3d b5 0f 9c 3e  |..x.`_7..(!=...>|
+00000300  ce 74 8b 9a 66 f0 ef af  38 1e 07 8e ca 6f 5a 35  |.t..f...8....oZ5|
+00000310  c9 87 71 17 03 03 00 99  c1 76 e9 d2 52 3f 6d 1b  |..q......v..R?m.|
+00000320  ca eb 7d 24 2e c9 12 1b  44 f0 9c 06 95 26 d0 a3  |..}$....D....&..|
+00000330  04 e1 f1 8f e4 c0 83 91  e2 cf da 6c a1 b3 87 05  |...........l....|
+00000340  18 ae f1 7f 8d d3 43 9a  f9 a8 9e 73 89 1a 61 2d  |......C....s..a-|
+00000350  4f 2b 33 0b fd c0 12 0e  d2 32 06 52 26 99 1d ce  |O+3......2.R&...|
+00000360  49 11 a2 ec 23 ad 7f 22  1f 6e c6 12 21 f3 56 1c  |I...#..".n..!.V.|
+00000370  fe d1 32 dd 1f b5 36 5d  e3 78 fb 9c 3e 74 00 aa  |..2...6].x..>t..|
+00000380  9d fd 92 f8 45 f9 1f e8  c3 4d 89 a8 91 d0 6c 2c  |....E....M....l,|
+00000390  4f 82 52 f4 43 b0 1b fa  16 75 a4 78 f9 24 d1 3a  |O.R.C....u.x.$.:|
+000003a0  1e 6b 97 6f 0e 3d bb 34  b3 0a 83 2f 56 88 b8 0e  |.k.o.=.4.../V...|
+000003b0  90 17 03 03 00 35 cd f0  e5 f9 3f 62 e7 67 25 5f  |.....5....?b.g%_|
+000003c0  4f 11 d9 d9 d0 e3 3b 9a  a9 c0 27 1d d3 a4 06 1f  |O.....;...'.....|
+000003d0  8d 61 b4 38 aa fe fd f8  6c 10 57 b6 7d 9c 92 96  |.a.8....l.W.}...|
+000003e0  c9 70 c2 67 a7 76 7d bb  ab 0e 2d                 |.p.g.v}...-|
 >>> Flow 3 (client to server)
-00000000  14 03 03 00 01 01 17 03  03 00 35 e5 27 80 72 fd  |..........5.'.r.|
-00000010  6c 0d b5 a7 14 23 08 0b  f5 54 70 8c 29 61 d0 2a  |l....#...Tp.)a.*|
-00000020  81 2d 05 83 2a 21 1e 16  94 5b 65 0d 6a ca b6 81  |.-..*!...[e.j...|
-00000030  d9 9d 3c 5c 9c fe 2b 01  a8 3b 23 fb 9e eb 2c 56  |..<\..+..;#...,V|
-00000040  17 03 03 00 17 79 fd 43  29 72 96 e0 ad fd 7e 60  |.....y.C)r....~`|
-00000050  94 51 8d 8a 6e 6a 5d 6c  f3 0d 4b 74 17 03 03 00  |.Q..nj]l..Kt....|
-00000060  13 a4 7c e1 31 71 61 82  e7 7d 28 0f 63 d7 ae 76  |..|.1qa..}(.c..v|
-00000070  9c 71 37 cd                                       |.q7.|
+00000000  14 03 03 00 01 01 17 03  03 00 35 7d 7c fa 64 ea  |..........5}|.d.|
+00000010  ba 90 be e8 a7 0c 0c 48  10 fc 2d ac 5e dd 1c cf  |.......H..-.^...|
+00000020  e8 d3 d9 98 3b c2 2b 80  93 44 22 85 bf cb ec c6  |....;.+..D".....|
+00000030  4a 13 6d 68 80 22 8b af  aa f4 7c de 6b 28 fe ef  |J.mh."....|.k(..|
+00000040  17 03 03 00 17 4e bd e5  fe 5c 6b 9c bb 48 b8 23  |.....N...\k..H.#|
+00000050  55 0f f7 21 25 cb 4c ae  74 b7 54 a2 17 03 03 00  |U..!%.L.t.T.....|
+00000060  13 c8 35 e9 be f6 74 09  23 55 ec 78 05 83 89 38  |..5...t.#U.x...8|
+00000070  ee 1c b3 3e                                       |...>|
diff --git a/src/crypto/tls/testdata/Server-TLSv10-ECDHE-ECDSA-AES b/src/crypto/tls/testdata/Server-TLSv10-ECDHE-ECDSA-AES
index c8f11ea..c5d947c 100644
--- a/src/crypto/tls/testdata/Server-TLSv10-ECDHE-ECDSA-AES
+++ b/src/crypto/tls/testdata/Server-TLSv10-ECDHE-ECDSA-AES
@@ -1,79 +1,79 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 51 01 00 00  4d 03 01 8a c0 af 21 2c  |....Q...M.....!,|
-00000010  ff 48 d6 fd 10 92 4a 8c  84 c7 9e c3 90 3a f5 bf  |.H....J......:..|
-00000020  cd 36 1b 2f 96 8b 13 86  f1 ff 5e 00 00 04 c0 0a  |.6./......^.....|
+00000000  16 03 01 00 51 01 00 00  4d 03 01 5e bf ff e7 c2  |....Q...M..^....|
+00000010  c1 98 4a a3 cf 5a e8 8d  8f 19 9e 85 48 5b 92 cc  |..J..Z......H[..|
+00000020  7d 0c 14 1e 2e 50 5b d7  dd fe ef 00 00 04 c0 0a  |}....P[.........|
 00000030  00 ff 01 00 00 20 00 0b  00 04 03 00 01 02 00 0a  |..... ..........|
 00000040  00 0c 00 0a 00 1d 00 17  00 1e 00 19 00 18 00 16  |................|
 00000050  00 00 00 17 00 00                                 |......|
 >>> Flow 2 (server to client)
-00000000  16 03 01 00 37 02 00 00  33 03 01 00 00 00 00 00  |....7...3.......|
+00000000  16 03 01 00 3b 02 00 00  37 03 01 00 00 00 00 00  |....;...7.......|
 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000020  00 00 00 44 4f 57 4e 47  52 44 00 00 c0 0a 00 00  |...DOWNGRD......|
-00000030  0b ff 01 00 01 00 00 0b  00 02 01 00 16 03 01 02  |................|
-00000040  0e 0b 00 02 0a 00 02 07  00 02 04 30 82 02 00 30  |...........0...0|
-00000050  82 01 62 02 09 00 b8 bf  2d 47 a0 d2 eb f4 30 09  |..b.....-G....0.|
-00000060  06 07 2a 86 48 ce 3d 04  01 30 45 31 0b 30 09 06  |..*.H.=..0E1.0..|
-00000070  03 55 04 06 13 02 41 55  31 13 30 11 06 03 55 04  |.U....AU1.0...U.|
-00000080  08 13 0a 53 6f 6d 65 2d  53 74 61 74 65 31 21 30  |...Some-State1!0|
-00000090  1f 06 03 55 04 0a 13 18  49 6e 74 65 72 6e 65 74  |...U....Internet|
-000000a0  20 57 69 64 67 69 74 73  20 50 74 79 20 4c 74 64  | Widgits Pty Ltd|
-000000b0  30 1e 17 0d 31 32 31 31  32 32 31 35 30 36 33 32  |0...121122150632|
-000000c0  5a 17 0d 32 32 31 31 32  30 31 35 30 36 33 32 5a  |Z..221120150632Z|
-000000d0  30 45 31 0b 30 09 06 03  55 04 06 13 02 41 55 31  |0E1.0...U....AU1|
-000000e0  13 30 11 06 03 55 04 08  13 0a 53 6f 6d 65 2d 53  |.0...U....Some-S|
-000000f0  74 61 74 65 31 21 30 1f  06 03 55 04 0a 13 18 49  |tate1!0...U....I|
-00000100  6e 74 65 72 6e 65 74 20  57 69 64 67 69 74 73 20  |nternet Widgits |
-00000110  50 74 79 20 4c 74 64 30  81 9b 30 10 06 07 2a 86  |Pty Ltd0..0...*.|
-00000120  48 ce 3d 02 01 06 05 2b  81 04 00 23 03 81 86 00  |H.=....+...#....|
-00000130  04 00 c4 a1 ed be 98 f9  0b 48 73 36 7e c3 16 56  |.........Hs6~..V|
-00000140  11 22 f2 3d 53 c3 3b 4d  21 3d cd 6b 75 e6 f6 b0  |.".=S.;M!=.ku...|
-00000150  dc 9a df 26 c1 bc b2 87  f0 72 32 7c b3 64 2f 1c  |...&.....r2|.d/.|
-00000160  90 bc ea 68 23 10 7e fe  e3 25 c0 48 3a 69 e0 28  |...h#.~..%.H:i.(|
-00000170  6d d3 37 00 ef 04 62 dd  0d a0 9c 70 62 83 d8 81  |m.7...b....pb...|
-00000180  d3 64 31 aa 9e 97 31 bd  96 b0 68 c0 9b 23 de 76  |.d1...1...h..#.v|
-00000190  64 3f 1a 5c 7f e9 12 0e  58 58 b6 5f 70 dd 9b d8  |d?.\....XX._p...|
-000001a0  ea d5 d7 f5 d5 cc b9 b6  9f 30 66 5b 66 9a 20 e2  |.........0f[f. .|
-000001b0  27 e5 bf fe 3b 30 09 06  07 2a 86 48 ce 3d 04 01  |'...;0...*.H.=..|
-000001c0  03 81 8c 00 30 81 88 02  42 01 88 a2 4f eb e2 45  |....0...B...O..E|
-000001d0  c5 48 7d 1b ac f5 ed 98  9d ae 47 70 c0 5e 1b b6  |.H}.......Gp.^..|
-000001e0  2f bd f1 b6 4d b7 61 40  d3 11 a2 ce ee 0b 7e 92  |/...M.a@......~.|
-000001f0  7e ff 76 9d c3 3b 7e a5  3f ce fa 10 e2 59 ec 47  |~.v..;~.?....Y.G|
-00000200  2d 7c ac da 4e 97 0e 15  a0 6f d0 02 42 01 4d fc  |-|..N....o..B.M.|
-00000210  be 67 13 9c 2d 05 0e bd  3f a3 8c 25 c1 33 13 83  |.g..-...?..%.3..|
-00000220  0d 94 06 bb d4 37 7a f6  ec 7a c9 86 2e dd d7 11  |.....7z..z......|
-00000230  69 7f 85 7c 56 de fb 31  78 2b e4 c7 78 0d ae cb  |i..|V..1x+..x...|
-00000240  be 9e 4e 36 24 31 7b 6a  0f 39 95 12 07 8f 2a 16  |..N6$1{j.9....*.|
-00000250  03 01 00 b4 0c 00 00 b0  03 00 1d 20 2f e5 7d a3  |........... /.}.|
-00000260  47 cd 62 43 15 28 da ac  5f bb 29 07 30 ff f6 84  |G.bC.(.._.).0...|
-00000270  af c4 cf c2 ed 90 99 5f  58 cb 3b 74 00 8a 30 81  |......._X.;t..0.|
-00000280  87 02 42 01 ea 1b 6f 67  3e cd 57 50 12 78 5a db  |..B...og>.WP.xZ.|
-00000290  06 12 77 04 9d df 0c b0  98 4b a7 e8 23 fb ad 46  |..w......K..#..F|
-000002a0  ef 9b 99 d3 02 4b 46 51  c4 49 2a ae 29 b4 a7 e5  |.....KFQ.I*.)...|
-000002b0  08 d0 db ce 28 af 21 43  37 d4 29 03 00 e3 5f 50  |....(.!C7.)..._P|
-000002c0  35 cd 0a 3f 9d 02 41 35  05 7c a0 ed 81 23 98 38  |5..?..A5.|...#.8|
-000002d0  af 2c 12 8f 59 94 77 c7  56 ef 0b db 60 d0 5b 72  |.,..Y.w.V...`.[r|
-000002e0  9e fd 2a 6c ea 1d af cb  ce 5b df 34 52 2a 4b 38  |..*l.....[.4R*K8|
-000002f0  48 81 2c 39 76 61 58 19  80 1b e0 eb fb 53 35 94  |H.,9vaX......S5.|
-00000300  55 ba a6 2b a2 b3 50 b4  16 03 01 00 04 0e 00 00  |U..+..P.........|
-00000310  00                                                |.|
+00000030  0f ff 01 00 01 00 00 17  00 00 00 0b 00 02 01 00  |................|
+00000040  16 03 01 02 0e 0b 00 02  0a 00 02 07 00 02 04 30  |...............0|
+00000050  82 02 00 30 82 01 62 02  09 00 b8 bf 2d 47 a0 d2  |...0..b.....-G..|
+00000060  eb f4 30 09 06 07 2a 86  48 ce 3d 04 01 30 45 31  |..0...*.H.=..0E1|
+00000070  0b 30 09 06 03 55 04 06  13 02 41 55 31 13 30 11  |.0...U....AU1.0.|
+00000080  06 03 55 04 08 13 0a 53  6f 6d 65 2d 53 74 61 74  |..U....Some-Stat|
+00000090  65 31 21 30 1f 06 03 55  04 0a 13 18 49 6e 74 65  |e1!0...U....Inte|
+000000a0  72 6e 65 74 20 57 69 64  67 69 74 73 20 50 74 79  |rnet Widgits Pty|
+000000b0  20 4c 74 64 30 1e 17 0d  31 32 31 31 32 32 31 35  | Ltd0...12112215|
+000000c0  30 36 33 32 5a 17 0d 32  32 31 31 32 30 31 35 30  |0632Z..221120150|
+000000d0  36 33 32 5a 30 45 31 0b  30 09 06 03 55 04 06 13  |632Z0E1.0...U...|
+000000e0  02 41 55 31 13 30 11 06  03 55 04 08 13 0a 53 6f  |.AU1.0...U....So|
+000000f0  6d 65 2d 53 74 61 74 65  31 21 30 1f 06 03 55 04  |me-State1!0...U.|
+00000100  0a 13 18 49 6e 74 65 72  6e 65 74 20 57 69 64 67  |...Internet Widg|
+00000110  69 74 73 20 50 74 79 20  4c 74 64 30 81 9b 30 10  |its Pty Ltd0..0.|
+00000120  06 07 2a 86 48 ce 3d 02  01 06 05 2b 81 04 00 23  |..*.H.=....+...#|
+00000130  03 81 86 00 04 00 c4 a1  ed be 98 f9 0b 48 73 36  |.............Hs6|
+00000140  7e c3 16 56 11 22 f2 3d  53 c3 3b 4d 21 3d cd 6b  |~..V.".=S.;M!=.k|
+00000150  75 e6 f6 b0 dc 9a df 26  c1 bc b2 87 f0 72 32 7c  |u......&.....r2||
+00000160  b3 64 2f 1c 90 bc ea 68  23 10 7e fe e3 25 c0 48  |.d/....h#.~..%.H|
+00000170  3a 69 e0 28 6d d3 37 00  ef 04 62 dd 0d a0 9c 70  |:i.(m.7...b....p|
+00000180  62 83 d8 81 d3 64 31 aa  9e 97 31 bd 96 b0 68 c0  |b....d1...1...h.|
+00000190  9b 23 de 76 64 3f 1a 5c  7f e9 12 0e 58 58 b6 5f  |.#.vd?.\....XX._|
+000001a0  70 dd 9b d8 ea d5 d7 f5  d5 cc b9 b6 9f 30 66 5b  |p............0f[|
+000001b0  66 9a 20 e2 27 e5 bf fe  3b 30 09 06 07 2a 86 48  |f. .'...;0...*.H|
+000001c0  ce 3d 04 01 03 81 8c 00  30 81 88 02 42 01 88 a2  |.=......0...B...|
+000001d0  4f eb e2 45 c5 48 7d 1b  ac f5 ed 98 9d ae 47 70  |O..E.H}.......Gp|
+000001e0  c0 5e 1b b6 2f bd f1 b6  4d b7 61 40 d3 11 a2 ce  |.^../...M.a@....|
+000001f0  ee 0b 7e 92 7e ff 76 9d  c3 3b 7e a5 3f ce fa 10  |..~.~.v..;~.?...|
+00000200  e2 59 ec 47 2d 7c ac da  4e 97 0e 15 a0 6f d0 02  |.Y.G-|..N....o..|
+00000210  42 01 4d fc be 67 13 9c  2d 05 0e bd 3f a3 8c 25  |B.M..g..-...?..%|
+00000220  c1 33 13 83 0d 94 06 bb  d4 37 7a f6 ec 7a c9 86  |.3.......7z..z..|
+00000230  2e dd d7 11 69 7f 85 7c  56 de fb 31 78 2b e4 c7  |....i..|V..1x+..|
+00000240  78 0d ae cb be 9e 4e 36  24 31 7b 6a 0f 39 95 12  |x.....N6$1{j.9..|
+00000250  07 8f 2a 16 03 01 00 b5  0c 00 00 b1 03 00 1d 20  |..*............ |
+00000260  2f e5 7d a3 47 cd 62 43  15 28 da ac 5f bb 29 07  |/.}.G.bC.(.._.).|
+00000270  30 ff f6 84 af c4 cf c2  ed 90 99 5f 58 cb 3b 74  |0.........._X.;t|
+00000280  00 8b 30 81 88 02 42 00  c3 eb 60 b8 d3 af cb 2d  |..0...B...`....-|
+00000290  4f ca 46 6d e4 fe 47 41  82 1e d4 14 0f 08 ab b6  |O.Fm..GA........|
+000002a0  b8 41 8b 46 f5 28 bb 87  28 73 a0 5c e9 ce f5 56  |.A.F.(..(s.\...V|
+000002b0  11 02 17 2c 39 b6 28 6c  ec de 12 bf 22 91 3d 06  |...,9.(l....".=.|
+000002c0  ac 8e 0a 92 b1 46 69 86  44 02 42 01 fd 70 6e 63  |.....Fi.D.B..pnc|
+000002d0  1b 2a 21 47 9b 42 9c d4  4a 38 20 dd 94 05 c4 0f  |.*!G.B..J8 .....|
+000002e0  5d b2 48 c8 17 90 01 4d  4f 7e 7a ef bb b2 5b 26  |].H....MO~z...[&|
+000002f0  7e e1 24 f5 80 93 69 72  3f cf bb 5d 52 ee ec b4  |~.$...ir?..]R...|
+00000300  cc 0c 96 1f 93 4c d6 a8  c7 b2 91 f5 6d 16 03 01  |.....L......m...|
+00000310  00 04 0e 00 00 00                                 |......|
 >>> Flow 3 (client to server)
-00000000  16 03 01 00 25 10 00 00  21 20 29 f2 f2 54 f4 ff  |....%...! )..T..|
-00000010  59 de df ab 55 18 04 cd  8c 27 28 7e 11 11 09 84  |Y...U....'(~....|
-00000020  18 e1 0f 09 70 f8 d7 13  a1 38 14 03 01 00 01 01  |....p....8......|
-00000030  16 03 01 00 30 d8 40 dc  30 cb d6 25 de 23 01 84  |....0.@.0..%.#..|
-00000040  30 75 1c 17 bd f3 fe 7e  b4 cd 61 f3 55 c4 30 55  |0u.....~..a.U.0U|
-00000050  ee 43 6f f0 6b a7 0a ed  88 d9 d4 72 7c c7 c6 c7  |.Co.k......r|...|
-00000060  4d 2f 7b 9f 9b                                    |M/{..|
+00000000  16 03 01 00 25 10 00 00  21 20 ec f2 2d ca 02 ce  |....%...! ..-...|
+00000010  11 2d eb 26 d7 d9 fc b2  a7 2d 34 5b a9 3a 0b 2f  |.-.&.....-4[.:./|
+00000020  5c 49 a9 69 1a 3a 83 90  ec 5f 14 03 01 00 01 01  |\I.i.:..._......|
+00000030  16 03 01 00 30 9f 06 c7  a7 a0 c3 a5 3d 60 6e fb  |....0.......=`n.|
+00000040  c6 18 a4 d2 80 2e ad 8f  cf 92 84 94 36 f8 81 28  |............6..(|
+00000050  c5 3f 37 e8 d6 e7 6d a3  f5 32 63 a0 ab 7a db 12  |.?7...m..2c..z..|
+00000060  17 e1 e4 33 d6                                    |...3.|
 >>> Flow 4 (server to client)
-00000000  14 03 01 00 01 01 16 03  01 00 30 60 b7 c0 a3 ba  |..........0`....|
-00000010  ad dd 52 99 15 7a f2 9e  10 21 02 7c 91 6d cf c9  |..R..z...!.|.m..|
-00000020  09 ab fe 9c b3 46 46 60  1c 24 66 3f b6 14 b1 51  |.....FF`.$f?...Q|
-00000030  ac 05 75 48 03 c1 e0 3a  c2 6d 5e 17 03 01 00 20  |..uH...:.m^.... |
-00000040  82 87 18 81 c3 24 55 8f  9c a3 49 fc 8a 8a 7a fe  |.....$U...I...z.|
-00000050  93 05 c9 7e 90 73 a4 b1  0a d7 3b 7d 72 1f fc 6c  |...~.s....;}r..l|
-00000060  17 03 01 00 30 1f 51 a5  44 2e 7a 40 12 43 28 c6  |....0.Q.D.z@.C(.|
-00000070  99 05 6d 92 d9 ed 0d f2  fb a7 48 a3 03 e9 34 b1  |..m.......H...4.|
-00000080  52 32 e1 be a9 7e bf b1  0e 1f b4 1c 3e 0a 9d d9  |R2...~......>...|
-00000090  90 10 4f 79 dd 15 03 01  00 20 57 98 fd dd 09 f9  |..Oy..... W.....|
-000000a0  c5 d9 33 24 1a b2 ed 56  ad 91 c9 25 2f ff ff 09  |..3$...V...%/...|
-000000b0  dc b0 2c 38 cc 70 1f cc  6f f4                    |..,8.p..o.|
+00000000  14 03 01 00 01 01 16 03  01 00 30 18 29 35 d7 c5  |..........0.)5..|
+00000010  a2 31 3b 26 85 de 50 26  39 4d 16 22 58 a2 17 bd  |.1;&..P&9M."X...|
+00000020  4b 73 33 8d dc 3f 92 20  f2 ca 22 00 f5 31 db a7  |Ks3..?. .."..1..|
+00000030  18 79 fc 71 87 68 a5 1d  a6 db 33 17 03 01 00 20  |.y.q.h....3.... |
+00000040  0d be 57 e4 12 6d 2d 3a  33 24 a0 0c c4 9b 27 09  |..W..m-:3$....'.|
+00000050  85 e0 0e 42 04 79 21 9a  bf 47 fa 0b 38 1a ce 8f  |...B.y!..G..8...|
+00000060  17 03 01 00 30 6d 27 f1  9b cf 55 4d 65 48 38 1b  |....0m'...UMeH8.|
+00000070  d9 dd 1d 5b 81 2f 10 a5  65 28 83 93 b3 b1 3a 72  |...[./..e(....:r|
+00000080  f0 15 9a e5 9f 21 80 f1  59 a5 0e f1 0c 2b d1 0c  |.....!..Y....+..|
+00000090  d4 27 73 f3 7e 15 03 01  00 20 6f 08 27 3a d2 60  |.'s.~.... o.':.`|
+000000a0  c3 27 bc 73 55 bb 43 53  e2 e0 87 16 ca 8f 49 f0  |.'.sU.CS......I.|
+000000b0  88 a8 20 30 9d 42 86 d9  c3 36                    |.. 0.B...6|
diff --git a/src/crypto/tls/testdata/Server-TLSv10-ExportKeyingMaterial b/src/crypto/tls/testdata/Server-TLSv10-ExportKeyingMaterial
index cb3b8da..b3d0f7d 100644
--- a/src/crypto/tls/testdata/Server-TLSv10-ExportKeyingMaterial
+++ b/src/crypto/tls/testdata/Server-TLSv10-ExportKeyingMaterial
@@ -1,93 +1,92 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 67 01 00 00  63 03 01 41 69 16 b5 d5  |....g...c..Ai...|
-00000010  c2 9d 36 2b 95 8e e5 41  9b 92 82 27 2a cc 4e 6e  |..6+...A...'*.Nn|
-00000020  5d f1 1b 58 49 3c 95 1d  8b 61 35 00 00 04 c0 14  |]..XI<...a5.....|
-00000030  00 ff 01 00 00 36 00 00  00 0e 00 0c 00 00 09 31  |.....6.........1|
-00000040  32 37 2e 30 2e 30 2e 31  00 0b 00 04 03 00 01 02  |27.0.0.1........|
-00000050  00 0a 00 0c 00 0a 00 1d  00 17 00 1e 00 19 00 18  |................|
-00000060  00 23 00 00 00 16 00 00  00 17 00 00              |.#..........|
+00000000  16 03 01 00 55 01 00 00  51 03 01 e0 8d 7b f2 8d  |....U...Q....{..|
+00000010  45 9f c5 40 1b be 81 05  a1 83 82 c1 54 4a c7 1c  |E..@........TJ..|
+00000020  f1 f8 d5 6c 7a ff 93 81  e2 a2 ba 00 00 04 c0 14  |...lz...........|
+00000030  00 ff 01 00 00 24 00 0b  00 04 03 00 01 02 00 0a  |.....$..........|
+00000040  00 0c 00 0a 00 1d 00 17  00 1e 00 19 00 18 00 23  |...............#|
+00000050  00 00 00 16 00 00 00 17  00 00                    |..........|
 >>> Flow 2 (server to client)
-00000000  16 03 01 00 3b 02 00 00  37 03 01 00 00 00 00 00  |....;...7.......|
+00000000  16 03 01 00 3f 02 00 00  3b 03 01 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 44 4f 57 4e 47  52 44 00 00 c0 14 00 00  |...DOWNGRD......|
-00000030  0f 00 23 00 00 ff 01 00  01 00 00 0b 00 02 01 00  |..#.............|
-00000040  16 03 01 02 59 0b 00 02  55 00 02 52 00 02 4f 30  |....Y...U..R..O0|
-00000050  82 02 4b 30 82 01 b4 a0  03 02 01 02 02 09 00 e8  |..K0............|
-00000060  f0 9d 3f e2 5b ea a6 30  0d 06 09 2a 86 48 86 f7  |..?.[..0...*.H..|
-00000070  0d 01 01 0b 05 00 30 1f  31 0b 30 09 06 03 55 04  |......0.1.0...U.|
-00000080  0a 13 02 47 6f 31 10 30  0e 06 03 55 04 03 13 07  |...Go1.0...U....|
-00000090  47 6f 20 52 6f 6f 74 30  1e 17 0d 31 36 30 31 30  |Go Root0...16010|
-000000a0  31 30 30 30 30 30 30 5a  17 0d 32 35 30 31 30 31  |1000000Z..250101|
-000000b0  30 30 30 30 30 30 5a 30  1a 31 0b 30 09 06 03 55  |000000Z0.1.0...U|
-000000c0  04 0a 13 02 47 6f 31 0b  30 09 06 03 55 04 03 13  |....Go1.0...U...|
-000000d0  02 47 6f 30 81 9f 30 0d  06 09 2a 86 48 86 f7 0d  |.Go0..0...*.H...|
-000000e0  01 01 01 05 00 03 81 8d  00 30 81 89 02 81 81 00  |.........0......|
-000000f0  db 46 7d 93 2e 12 27 06  48 bc 06 28 21 ab 7e c4  |.F}...'.H..(!.~.|
-00000100  b6 a2 5d fe 1e 52 45 88  7a 36 47 a5 08 0d 92 42  |..]..RE.z6G....B|
-00000110  5b c2 81 c0 be 97 79 98  40 fb 4f 6d 14 fd 2b 13  |[.....y.@.Om..+.|
-00000120  8b c2 a5 2e 67 d8 d4 09  9e d6 22 38 b7 4a 0b 74  |....g....."8.J.t|
-00000130  73 2b c2 34 f1 d1 93 e5  96 d9 74 7b f3 58 9f 6c  |s+.4......t{.X.l|
-00000140  61 3c c0 b0 41 d4 d9 2b  2b 24 23 77 5b 1c 3b bd  |a<..A..++$#w[.;.|
-00000150  75 5d ce 20 54 cf a1 63  87 1d 1e 24 c4 f3 1d 1a  |u]. T..c...$....|
-00000160  50 8b aa b6 14 43 ed 97  a7 75 62 f4 14 c8 52 d7  |P....C...ub...R.|
-00000170  02 03 01 00 01 a3 81 93  30 81 90 30 0e 06 03 55  |........0..0...U|
-00000180  1d 0f 01 01 ff 04 04 03  02 05 a0 30 1d 06 03 55  |...........0...U|
-00000190  1d 25 04 16 30 14 06 08  2b 06 01 05 05 07 03 01  |.%..0...+.......|
-000001a0  06 08 2b 06 01 05 05 07  03 02 30 0c 06 03 55 1d  |..+.......0...U.|
-000001b0  13 01 01 ff 04 02 30 00  30 19 06 03 55 1d 0e 04  |......0.0...U...|
-000001c0  12 04 10 9f 91 16 1f 43  43 3e 49 a6 de 6d b6 80  |.......CC>I..m..|
-000001d0  d7 9f 60 30 1b 06 03 55  1d 23 04 14 30 12 80 10  |..`0...U.#..0...|
-000001e0  48 13 49 4d 13 7e 16 31  bb a3 01 d5 ac ab 6e 7b  |H.IM.~.1......n{|
-000001f0  30 19 06 03 55 1d 11 04  12 30 10 82 0e 65 78 61  |0...U....0...exa|
-00000200  6d 70 6c 65 2e 67 6f 6c  61 6e 67 30 0d 06 09 2a  |mple.golang0...*|
-00000210  86 48 86 f7 0d 01 01 0b  05 00 03 81 81 00 9d 30  |.H.............0|
-00000220  cc 40 2b 5b 50 a0 61 cb  ba e5 53 58 e1 ed 83 28  |.@+[P.a...SX...(|
-00000230  a9 58 1a a9 38 a4 95 a1  ac 31 5a 1a 84 66 3d 43  |.X..8....1Z..f=C|
-00000240  d3 2d d9 0b f2 97 df d3  20 64 38 92 24 3a 00 bc  |.-...... d8.$:..|
-00000250  cf 9c 7d b7 40 20 01 5f  aa d3 16 61 09 a2 76 fd  |..}.@ ._...a..v.|
-00000260  13 c3 cc e1 0c 5c ee b1  87 82 f1 6c 04 ed 73 bb  |.....\.....l..s.|
-00000270  b3 43 77 8d 0c 1c f1 0f  a1 d8 40 83 61 c9 4c 72  |.Cw.......@.a.Lr|
-00000280  2b 9d ae db 46 06 06 4d  f4 c1 b3 3e c0 d1 bd 42  |+...F..M...>...B|
-00000290  d4 db fe 3d 13 60 84 5c  21 d3 3b e9 fa e7 16 03  |...=.`.\!.;.....|
-000002a0  01 00 aa 0c 00 00 a6 03  00 1d 20 2f e5 7d a3 47  |.......... /.}.G|
-000002b0  cd 62 43 15 28 da ac 5f  bb 29 07 30 ff f6 84 af  |.bC.(.._.).0....|
-000002c0  c4 cf c2 ed 90 99 5f 58  cb 3b 74 00 80 c6 ad e2  |......_X.;t.....|
-000002d0  21 0d d7 30 42 da 08 52  d5 46 70 a3 e5 d6 40 ab  |!..0B..R.Fp...@.|
-000002e0  bf 52 f8 da a5 41 86 1d  48 e6 51 91 52 8d 3c 5d  |.R...A..H.Q.R.<]|
-000002f0  ca 36 4c 62 d1 6b c8 48  8c 99 50 89 a9 27 4b 21  |.6Lb.k.H..P..'K!|
-00000300  c9 9d a6 43 34 d2 47 a7  b3 1a 6d 98 b3 7f 37 94  |...C4.G...m...7.|
-00000310  60 ba 88 f1 b7 ed 34 2b  47 f4 80 27 d3 a0 74 6a  |`.....4+G..'..tj|
-00000320  c6 d6 49 e3 8a e5 5d f1  a7 54 8a b4 84 8d a8 6b  |..I...]..T.....k|
-00000330  3b 7a 3f eb 81 77 4b bf  be 1e ac cd aa f9 4b 79  |;z?..wK.......Ky|
-00000340  24 78 6c 67 14 13 ab f8  ad 33 7c 94 38 16 03 01  |$xlg.....3|.8...|
-00000350  00 04 0e 00 00 00                                 |......|
+00000030  13 00 23 00 00 ff 01 00  01 00 00 17 00 00 00 0b  |..#.............|
+00000040  00 02 01 00 16 03 01 02  59 0b 00 02 55 00 02 52  |........Y...U..R|
+00000050  00 02 4f 30 82 02 4b 30  82 01 b4 a0 03 02 01 02  |..O0..K0........|
+00000060  02 09 00 e8 f0 9d 3f e2  5b ea a6 30 0d 06 09 2a  |......?.[..0...*|
+00000070  86 48 86 f7 0d 01 01 0b  05 00 30 1f 31 0b 30 09  |.H........0.1.0.|
+00000080  06 03 55 04 0a 13 02 47  6f 31 10 30 0e 06 03 55  |..U....Go1.0...U|
+00000090  04 03 13 07 47 6f 20 52  6f 6f 74 30 1e 17 0d 31  |....Go Root0...1|
+000000a0  36 30 31 30 31 30 30 30  30 30 30 5a 17 0d 32 35  |60101000000Z..25|
+000000b0  30 31 30 31 30 30 30 30  30 30 5a 30 1a 31 0b 30  |0101000000Z0.1.0|
+000000c0  09 06 03 55 04 0a 13 02  47 6f 31 0b 30 09 06 03  |...U....Go1.0...|
+000000d0  55 04 03 13 02 47 6f 30  81 9f 30 0d 06 09 2a 86  |U....Go0..0...*.|
+000000e0  48 86 f7 0d 01 01 01 05  00 03 81 8d 00 30 81 89  |H............0..|
+000000f0  02 81 81 00 db 46 7d 93  2e 12 27 06 48 bc 06 28  |.....F}...'.H..(|
+00000100  21 ab 7e c4 b6 a2 5d fe  1e 52 45 88 7a 36 47 a5  |!.~...]..RE.z6G.|
+00000110  08 0d 92 42 5b c2 81 c0  be 97 79 98 40 fb 4f 6d  |...B[.....y.@.Om|
+00000120  14 fd 2b 13 8b c2 a5 2e  67 d8 d4 09 9e d6 22 38  |..+.....g....."8|
+00000130  b7 4a 0b 74 73 2b c2 34  f1 d1 93 e5 96 d9 74 7b  |.J.ts+.4......t{|
+00000140  f3 58 9f 6c 61 3c c0 b0  41 d4 d9 2b 2b 24 23 77  |.X.la<..A..++$#w|
+00000150  5b 1c 3b bd 75 5d ce 20  54 cf a1 63 87 1d 1e 24  |[.;.u]. T..c...$|
+00000160  c4 f3 1d 1a 50 8b aa b6  14 43 ed 97 a7 75 62 f4  |....P....C...ub.|
+00000170  14 c8 52 d7 02 03 01 00  01 a3 81 93 30 81 90 30  |..R.........0..0|
+00000180  0e 06 03 55 1d 0f 01 01  ff 04 04 03 02 05 a0 30  |...U...........0|
+00000190  1d 06 03 55 1d 25 04 16  30 14 06 08 2b 06 01 05  |...U.%..0...+...|
+000001a0  05 07 03 01 06 08 2b 06  01 05 05 07 03 02 30 0c  |......+.......0.|
+000001b0  06 03 55 1d 13 01 01 ff  04 02 30 00 30 19 06 03  |..U.......0.0...|
+000001c0  55 1d 0e 04 12 04 10 9f  91 16 1f 43 43 3e 49 a6  |U..........CC>I.|
+000001d0  de 6d b6 80 d7 9f 60 30  1b 06 03 55 1d 23 04 14  |.m....`0...U.#..|
+000001e0  30 12 80 10 48 13 49 4d  13 7e 16 31 bb a3 01 d5  |0...H.IM.~.1....|
+000001f0  ac ab 6e 7b 30 19 06 03  55 1d 11 04 12 30 10 82  |..n{0...U....0..|
+00000200  0e 65 78 61 6d 70 6c 65  2e 67 6f 6c 61 6e 67 30  |.example.golang0|
+00000210  0d 06 09 2a 86 48 86 f7  0d 01 01 0b 05 00 03 81  |...*.H..........|
+00000220  81 00 9d 30 cc 40 2b 5b  50 a0 61 cb ba e5 53 58  |...0.@+[P.a...SX|
+00000230  e1 ed 83 28 a9 58 1a a9  38 a4 95 a1 ac 31 5a 1a  |...(.X..8....1Z.|
+00000240  84 66 3d 43 d3 2d d9 0b  f2 97 df d3 20 64 38 92  |.f=C.-...... d8.|
+00000250  24 3a 00 bc cf 9c 7d b7  40 20 01 5f aa d3 16 61  |$:....}.@ ._...a|
+00000260  09 a2 76 fd 13 c3 cc e1  0c 5c ee b1 87 82 f1 6c  |..v......\.....l|
+00000270  04 ed 73 bb b3 43 77 8d  0c 1c f1 0f a1 d8 40 83  |..s..Cw.......@.|
+00000280  61 c9 4c 72 2b 9d ae db  46 06 06 4d f4 c1 b3 3e  |a.Lr+...F..M...>|
+00000290  c0 d1 bd 42 d4 db fe 3d  13 60 84 5c 21 d3 3b e9  |...B...=.`.\!.;.|
+000002a0  fa e7 16 03 01 00 aa 0c  00 00 a6 03 00 1d 20 2f  |.............. /|
+000002b0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
+000002c0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74 00  |.........._X.;t.|
+000002d0  80 3d ff b7 ad d5 15 4f  10 6e 8a d2 ad 8a 6b 1b  |.=.....O.n....k.|
+000002e0  9d 6c f2 92 99 c7 d7 d8  07 d5 c7 77 09 22 41 4f  |.l.........w."AO|
+000002f0  7f ca 3e 8c 22 ba 2b f2  75 5f 47 c9 7e 0c 03 5d  |..>.".+.u_G.~..]|
+00000300  1a 66 c3 c8 f3 76 f0 f6  fa 03 40 3a 9b e7 2b 35  |.f...v....@:..+5|
+00000310  bc c7 5e 62 a6 97 8a 1a  17 e3 13 4c 1f 88 39 2a  |..^b.......L..9*|
+00000320  5b cc 9c 65 df 27 1e b3  26 d7 46 3e 76 a9 ae 71  |[..e.'..&.F>v..q|
+00000330  11 4d d6 10 b4 2e 30 37  a1 b4 ff 46 91 77 c7 4c  |.M....07...F.w.L|
+00000340  f9 8e e3 96 88 d2 1e c5  9d fb a1 be c6 ef 5d f0  |..............].|
+00000350  52 16 03 01 00 04 0e 00  00 00                    |R.........|
 >>> Flow 3 (client to server)
-00000000  16 03 01 00 25 10 00 00  21 20 f5 be 48 cb fb 0d  |....%...! ..H...|
-00000010  69 27 a8 ab 59 c4 9a ac  92 71 46 d1 17 7e 35 67  |i'..Y....qF..~5g|
-00000020  15 b1 ea 9f 53 48 a3 b5  f9 55 14 03 01 00 01 01  |....SH...U......|
-00000030  16 03 01 00 30 e1 79 95  7c ab 01 74 35 39 9b ce  |....0.y.|..t59..|
-00000040  79 5f 15 21 88 fc be fc  46 a9 31 ca 82 07 0c 1f  |y_.!....F.1.....|
-00000050  d8 2f 93 b5 5d 23 bf f9  10 40 bc b5 22 53 df d6  |./..]#...@.."S..|
-00000060  b1 10 b9 16 96                                    |.....|
+00000000  16 03 01 00 25 10 00 00  21 20 01 39 8b 2b 21 99  |....%...! .9.+!.|
+00000010  fd fc b8 20 f1 51 97 c7  85 13 05 64 55 41 6b c4  |... .Q.....dUAk.|
+00000020  1a 5e d5 b2 7c 8b 31 08  0f 78 14 03 01 00 01 01  |.^..|.1..x......|
+00000030  16 03 01 00 30 d8 3b e6  9f f8 a8 b2 6b 8b fb 89  |....0.;.....k...|
+00000040  71 3b 55 cd c3 c9 78 3c  45 1b 8d 5f 70 4f bd 64  |q;U...x<E.._pO.d|
+00000050  a9 d1 c0 4d ce 34 e1 f9  d2 90 c9 49 b0 1f a3 76  |...M.4.....I...v|
+00000060  bd f4 78 d0 43                                    |..x.C|
 >>> Flow 4 (server to client)
-00000000  16 03 01 00 8b 04 00 00  87 00 00 00 00 00 81 50  |...............P|
-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  6d ec a4 83 51 ed 14 ef  68 ca 42 c5 4c d2 34 08  |m...Q...h.B.L.4.|
-00000040  0b cc b9 32 8f 21 f7 50  c4 e1 28 9b 7d 5e ed de  |...2.!.P..(.}^..|
-00000050  0a df 30 0d 16 34 6b 6d  22 3c d3 c8 b2 99 84 8e  |..0..4km"<......|
-00000060  09 6d 3c 62 d4 0f f6 37  dc 53 ae 72 40 49 38 16  |.m<b...7.S.r@I8.|
-00000070  9c 30 34 bf 6e 34 bb 54  73 33 c0 c9 8c 12 ae bc  |.04.n4.Ts3......|
-00000080  e9 a8 80 23 de d0 e5 d3  46 d8 6a 86 c7 a5 6c 61  |...#....F.j...la|
-00000090  14 03 01 00 01 01 16 03  01 00 30 27 a7 5d e7 93  |..........0'.]..|
-000000a0  54 9a 77 d5 43 aa e3 ec  21 00 fa d4 36 04 c3 82  |T.w.C...!...6...|
-000000b0  b0 b7 f5 b4 19 ce f9 58  0a b4 7f d6 bf 95 43 9d  |.......X......C.|
-000000c0  26 44 46 77 48 cd 77 82  e2 48 51 17 03 01 00 20  |&DFwH.w..HQ.... |
-000000d0  c0 9b b1 d3 9f e6 4f 55  59 17 5a dc e4 2f bc 04  |......OUY.Z../..|
-000000e0  6f eb 4d d9 22 6e 97 20  33 94 d4 91 aa 70 4d ab  |o.M."n. 3....pM.|
-000000f0  17 03 01 00 30 9b 0f 50  a8 95 f5 db 67 96 c2 3e  |....0..P....g..>|
-00000100  46 a7 41 99 d5 e2 ab 60  b1 eb 8d 68 2f 71 30 70  |F.A....`...h/q0p|
-00000110  75 cc b8 50 1a 58 3b 96  d3 5c 99 43 27 4f b1 4a  |u..P.X;..\.C'O.J|
-00000120  c8 8d 5b ab 49 15 03 01  00 20 34 a6 41 25 fd 23  |..[.I.... 4.A%.#|
-00000130  44 6d 60 7f 79 5d 27 23  f7 cb 77 d0 cd 81 c4 67  |Dm`.y]'#..w....g|
-00000140  0e 56 92 60 ac a1 32 a5  0d 94                    |.V.`..2...|
+00000000  16 03 01 00 83 04 00 00  7f 00 00 00 00 00 79 00  |..............y.|
+00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 94  |................|
+00000020  6d 2d 70 97 51 ed 14 ef  68 ca 42 c5 4c 71 8e 74  |m-p.Q...h.B.Lq.t|
+00000030  d4 83 d6 4a 5b 69 f8 af  61 3a 98 83 19 d5 7c 60  |...J[i..a:....|`|
+00000040  4a 1e f4 b7 26 b8 99 b5  45 6f a3 8d 97 63 5f 1b  |J...&...Eo...c_.|
+00000050  ab f4 84 59 db ce 99 ce  b8 6a 23 d5 15 49 38 16  |...Y.....j#..I8.|
+00000060  7e 51 5c e5 15 c0 58 7d  c0 ee 59 1b e4 6e 1f c8  |~Q\...X}..Y..n..|
+00000070  fc d4 2c 33 ed 0a 2b e0  78 04 64 4b 56 e4 af 61  |..,3..+.x.dKV..a|
+00000080  c6 b5 7d f5 a0 86 9f e3  14 03 01 00 01 01 16 03  |..}.............|
+00000090  01 00 30 73 2b f0 16 d3  a8 02 b3 73 98 5e 4e a0  |..0s+......s.^N.|
+000000a0  ca 5b c4 50 fb 5a 92 11  43 97 e9 e3 16 9f 08 0a  |.[.P.Z..C.......|
+000000b0  56 73 e6 44 67 70 aa 3d  bb c1 36 c8 63 1c 2b 51  |Vs.Dgp.=..6.c.+Q|
+000000c0  1f 3b 81 17 03 01 00 20  4c 93 10 5c 01 e2 63 12  |.;..... L..\..c.|
+000000d0  97 6b e1 89 fb e7 14 cf  ec 70 d1 fe 6f ea 8b 09  |.k.......p..o...|
+000000e0  63 5f 8c 8a 9e b5 ac b8  17 03 01 00 30 a1 ad dd  |c_..........0...|
+000000f0  92 ac a8 6e 77 ed c2 ed  59 b6 a8 41 ad 45 59 8c  |...nw...Y..A.EY.|
+00000100  4e 1d 16 36 57 e6 2f 47  3d 10 0f 36 04 00 b0 c1  |N..6W./G=..6....|
+00000110  a7 94 25 8e 77 1e 69 20  41 6c c0 9d 26 15 03 01  |..%.w.i Al..&...|
+00000120  00 20 c5 83 26 5d 20 cb  16 7e 27 63 d7 96 aa 96  |. ..&] ..~'c....|
+00000130  37 19 2a 7a 18 d4 85 08  25 32 85 d5 b5 e3 4e 9b  |7.*z....%2....N.|
+00000140  98 f5                                             |..|
diff --git a/src/crypto/tls/testdata/Server-TLSv10-RSA-3DES b/src/crypto/tls/testdata/Server-TLSv10-RSA-3DES
index 502fd28..e4853a4 100644
--- a/src/crypto/tls/testdata/Server-TLSv10-RSA-3DES
+++ b/src/crypto/tls/testdata/Server-TLSv10-RSA-3DES
@@ -1,76 +1,73 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 63 01 00 00  5f 03 01 25 03 63 bf 34  |....c..._..%.c.4|
-00000010  89 c8 9e f6 e0 46 f8 30  5c e8 62 0a f7 db 68 c9  |.....F.0\.b...h.|
-00000020  50 54 0e c2 15 f1 cb 07  66 06 3d 00 00 04 00 0a  |PT......f.=.....|
-00000030  00 ff 01 00 00 32 00 00  00 0e 00 0c 00 00 09 31  |.....2.........1|
-00000040  32 37 2e 30 2e 30 2e 31  00 0b 00 04 03 00 01 02  |27.0.0.1........|
-00000050  00 0a 00 0c 00 0a 00 1d  00 17 00 1e 00 19 00 18  |................|
-00000060  00 16 00 00 00 17 00 00                           |........|
+00000000  16 03 01 00 39 01 00 00  35 03 01 51 7a 48 8d de  |....9...5..QzH..|
+00000010  0b 30 0f 9a 91 56 30 20  30 dd bd 74 3b e2 d7 db  |.0...V0 0..t;...|
+00000020  46 3d bf 6f b6 ae 53 8a  7d 18 50 00 00 04 00 0a  |F=.o..S.}.P.....|
+00000030  00 ff 01 00 00 08 00 16  00 00 00 17 00 00        |..............|
 >>> Flow 2 (server to client)
-00000000  16 03 01 00 37 02 00 00  33 03 01 00 00 00 00 00  |....7...3.......|
+00000000  16 03 01 00 35 02 00 00  31 03 01 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 44 4f 57 4e 47  52 44 00 00 00 0a 00 00  |...DOWNGRD......|
-00000030  0b ff 01 00 01 00 00 0b  00 02 01 00 16 03 01 02  |................|
-00000040  59 0b 00 02 55 00 02 52  00 02 4f 30 82 02 4b 30  |Y...U..R..O0..K0|
-00000050  82 01 b4 a0 03 02 01 02  02 09 00 e8 f0 9d 3f e2  |..............?.|
-00000060  5b ea a6 30 0d 06 09 2a  86 48 86 f7 0d 01 01 0b  |[..0...*.H......|
-00000070  05 00 30 1f 31 0b 30 09  06 03 55 04 0a 13 02 47  |..0.1.0...U....G|
-00000080  6f 31 10 30 0e 06 03 55  04 03 13 07 47 6f 20 52  |o1.0...U....Go R|
-00000090  6f 6f 74 30 1e 17 0d 31  36 30 31 30 31 30 30 30  |oot0...160101000|
-000000a0  30 30 30 5a 17 0d 32 35  30 31 30 31 30 30 30 30  |000Z..2501010000|
-000000b0  30 30 5a 30 1a 31 0b 30  09 06 03 55 04 0a 13 02  |00Z0.1.0...U....|
-000000c0  47 6f 31 0b 30 09 06 03  55 04 03 13 02 47 6f 30  |Go1.0...U....Go0|
-000000d0  81 9f 30 0d 06 09 2a 86  48 86 f7 0d 01 01 01 05  |..0...*.H.......|
-000000e0  00 03 81 8d 00 30 81 89  02 81 81 00 db 46 7d 93  |.....0.......F}.|
-000000f0  2e 12 27 06 48 bc 06 28  21 ab 7e c4 b6 a2 5d fe  |..'.H..(!.~...].|
-00000100  1e 52 45 88 7a 36 47 a5  08 0d 92 42 5b c2 81 c0  |.RE.z6G....B[...|
-00000110  be 97 79 98 40 fb 4f 6d  14 fd 2b 13 8b c2 a5 2e  |..y.@.Om..+.....|
-00000120  67 d8 d4 09 9e d6 22 38  b7 4a 0b 74 73 2b c2 34  |g....."8.J.ts+.4|
-00000130  f1 d1 93 e5 96 d9 74 7b  f3 58 9f 6c 61 3c c0 b0  |......t{.X.la<..|
-00000140  41 d4 d9 2b 2b 24 23 77  5b 1c 3b bd 75 5d ce 20  |A..++$#w[.;.u]. |
-00000150  54 cf a1 63 87 1d 1e 24  c4 f3 1d 1a 50 8b aa b6  |T..c...$....P...|
-00000160  14 43 ed 97 a7 75 62 f4  14 c8 52 d7 02 03 01 00  |.C...ub...R.....|
-00000170  01 a3 81 93 30 81 90 30  0e 06 03 55 1d 0f 01 01  |....0..0...U....|
-00000180  ff 04 04 03 02 05 a0 30  1d 06 03 55 1d 25 04 16  |.......0...U.%..|
-00000190  30 14 06 08 2b 06 01 05  05 07 03 01 06 08 2b 06  |0...+.........+.|
-000001a0  01 05 05 07 03 02 30 0c  06 03 55 1d 13 01 01 ff  |......0...U.....|
-000001b0  04 02 30 00 30 19 06 03  55 1d 0e 04 12 04 10 9f  |..0.0...U.......|
-000001c0  91 16 1f 43 43 3e 49 a6  de 6d b6 80 d7 9f 60 30  |...CC>I..m....`0|
-000001d0  1b 06 03 55 1d 23 04 14  30 12 80 10 48 13 49 4d  |...U.#..0...H.IM|
-000001e0  13 7e 16 31 bb a3 01 d5  ac ab 6e 7b 30 19 06 03  |.~.1......n{0...|
-000001f0  55 1d 11 04 12 30 10 82  0e 65 78 61 6d 70 6c 65  |U....0...example|
-00000200  2e 67 6f 6c 61 6e 67 30  0d 06 09 2a 86 48 86 f7  |.golang0...*.H..|
-00000210  0d 01 01 0b 05 00 03 81  81 00 9d 30 cc 40 2b 5b  |...........0.@+[|
-00000220  50 a0 61 cb ba e5 53 58  e1 ed 83 28 a9 58 1a a9  |P.a...SX...(.X..|
-00000230  38 a4 95 a1 ac 31 5a 1a  84 66 3d 43 d3 2d d9 0b  |8....1Z..f=C.-..|
-00000240  f2 97 df d3 20 64 38 92  24 3a 00 bc cf 9c 7d b7  |.... d8.$:....}.|
-00000250  40 20 01 5f aa d3 16 61  09 a2 76 fd 13 c3 cc e1  |@ ._...a..v.....|
-00000260  0c 5c ee b1 87 82 f1 6c  04 ed 73 bb b3 43 77 8d  |.\.....l..s..Cw.|
-00000270  0c 1c f1 0f a1 d8 40 83  61 c9 4c 72 2b 9d ae db  |......@.a.Lr+...|
-00000280  46 06 06 4d f4 c1 b3 3e  c0 d1 bd 42 d4 db fe 3d  |F..M...>...B...=|
-00000290  13 60 84 5c 21 d3 3b e9  fa e7 16 03 01 00 04 0e  |.`.\!.;.........|
-000002a0  00 00 00                                          |...|
+00000030  09 ff 01 00 01 00 00 17  00 00 16 03 01 02 59 0b  |..............Y.|
+00000040  00 02 55 00 02 52 00 02  4f 30 82 02 4b 30 82 01  |..U..R..O0..K0..|
+00000050  b4 a0 03 02 01 02 02 09  00 e8 f0 9d 3f e2 5b ea  |............?.[.|
+00000060  a6 30 0d 06 09 2a 86 48  86 f7 0d 01 01 0b 05 00  |.0...*.H........|
+00000070  30 1f 31 0b 30 09 06 03  55 04 0a 13 02 47 6f 31  |0.1.0...U....Go1|
+00000080  10 30 0e 06 03 55 04 03  13 07 47 6f 20 52 6f 6f  |.0...U....Go Roo|
+00000090  74 30 1e 17 0d 31 36 30  31 30 31 30 30 30 30 30  |t0...16010100000|
+000000a0  30 5a 17 0d 32 35 30 31  30 31 30 30 30 30 30 30  |0Z..250101000000|
+000000b0  5a 30 1a 31 0b 30 09 06  03 55 04 0a 13 02 47 6f  |Z0.1.0...U....Go|
+000000c0  31 0b 30 09 06 03 55 04  03 13 02 47 6f 30 81 9f  |1.0...U....Go0..|
+000000d0  30 0d 06 09 2a 86 48 86  f7 0d 01 01 01 05 00 03  |0...*.H.........|
+000000e0  81 8d 00 30 81 89 02 81  81 00 db 46 7d 93 2e 12  |...0.......F}...|
+000000f0  27 06 48 bc 06 28 21 ab  7e c4 b6 a2 5d fe 1e 52  |'.H..(!.~...]..R|
+00000100  45 88 7a 36 47 a5 08 0d  92 42 5b c2 81 c0 be 97  |E.z6G....B[.....|
+00000110  79 98 40 fb 4f 6d 14 fd  2b 13 8b c2 a5 2e 67 d8  |y.@.Om..+.....g.|
+00000120  d4 09 9e d6 22 38 b7 4a  0b 74 73 2b c2 34 f1 d1  |...."8.J.ts+.4..|
+00000130  93 e5 96 d9 74 7b f3 58  9f 6c 61 3c c0 b0 41 d4  |....t{.X.la<..A.|
+00000140  d9 2b 2b 24 23 77 5b 1c  3b bd 75 5d ce 20 54 cf  |.++$#w[.;.u]. T.|
+00000150  a1 63 87 1d 1e 24 c4 f3  1d 1a 50 8b aa b6 14 43  |.c...$....P....C|
+00000160  ed 97 a7 75 62 f4 14 c8  52 d7 02 03 01 00 01 a3  |...ub...R.......|
+00000170  81 93 30 81 90 30 0e 06  03 55 1d 0f 01 01 ff 04  |..0..0...U......|
+00000180  04 03 02 05 a0 30 1d 06  03 55 1d 25 04 16 30 14  |.....0...U.%..0.|
+00000190  06 08 2b 06 01 05 05 07  03 01 06 08 2b 06 01 05  |..+.........+...|
+000001a0  05 07 03 02 30 0c 06 03  55 1d 13 01 01 ff 04 02  |....0...U.......|
+000001b0  30 00 30 19 06 03 55 1d  0e 04 12 04 10 9f 91 16  |0.0...U.........|
+000001c0  1f 43 43 3e 49 a6 de 6d  b6 80 d7 9f 60 30 1b 06  |.CC>I..m....`0..|
+000001d0  03 55 1d 23 04 14 30 12  80 10 48 13 49 4d 13 7e  |.U.#..0...H.IM.~|
+000001e0  16 31 bb a3 01 d5 ac ab  6e 7b 30 19 06 03 55 1d  |.1......n{0...U.|
+000001f0  11 04 12 30 10 82 0e 65  78 61 6d 70 6c 65 2e 67  |...0...example.g|
+00000200  6f 6c 61 6e 67 30 0d 06  09 2a 86 48 86 f7 0d 01  |olang0...*.H....|
+00000210  01 0b 05 00 03 81 81 00  9d 30 cc 40 2b 5b 50 a0  |.........0.@+[P.|
+00000220  61 cb ba e5 53 58 e1 ed  83 28 a9 58 1a a9 38 a4  |a...SX...(.X..8.|
+00000230  95 a1 ac 31 5a 1a 84 66  3d 43 d3 2d d9 0b f2 97  |...1Z..f=C.-....|
+00000240  df d3 20 64 38 92 24 3a  00 bc cf 9c 7d b7 40 20  |.. d8.$:....}.@ |
+00000250  01 5f aa d3 16 61 09 a2  76 fd 13 c3 cc e1 0c 5c  |._...a..v......\|
+00000260  ee b1 87 82 f1 6c 04 ed  73 bb b3 43 77 8d 0c 1c  |.....l..s..Cw...|
+00000270  f1 0f a1 d8 40 83 61 c9  4c 72 2b 9d ae db 46 06  |....@.a.Lr+...F.|
+00000280  06 4d f4 c1 b3 3e c0 d1  bd 42 d4 db fe 3d 13 60  |.M...>...B...=.`|
+00000290  84 5c 21 d3 3b e9 fa e7  16 03 01 00 04 0e 00 00  |.\!.;...........|
+000002a0  00                                                |.|
 >>> Flow 3 (client to server)
-00000000  16 03 01 00 86 10 00 00  82 00 80 0f e9 83 ca 77  |...............w|
-00000010  c8 26 16 24 00 b7 09 d2  73 aa c1 d9 77 f3 fc 38  |.&.$....s...w..8|
-00000020  1c 2e c0 26 b4 a6 40 e1  1b 93 39 8f a2 1f f2 f9  |...&..@...9.....|
-00000030  18 2a 7b 0e cd 9b 9b 9c  49 86 43 3d 48 fd 40 d7  |.*{.....I.C=H.@.|
-00000040  af f9 2b 5e c6 cc c6 2d  8d 36 fe b1 75 c1 b5 a0  |..+^...-.6..u...|
-00000050  57 97 0f 01 ee b4 6a af  0c fe f0 68 78 04 6a 3e  |W.....j....hx.j>|
-00000060  83 d0 72 34 80 d8 7d cd  8b 83 06 5b 36 50 10 8e  |..r4..}....[6P..|
-00000070  b4 27 3d 6a ae b7 7f 8b  2a b1 0b 51 49 05 b5 01  |.'=j....*..QI...|
-00000080  3c 27 9a 59 e3 41 18 38  d6 8f 7a 14 03 01 00 01  |<'.Y.A.8..z.....|
-00000090  01 16 03 01 00 28 c0 46  65 9f 7f d8 c3 c4 a7 33  |.....(.Fe......3|
-000000a0  50 f9 07 41 95 12 a6 f3  ca 53 b9 96 f8 a8 a6 5f  |P..A.....S....._|
-000000b0  1e c8 20 e5 8b 87 4e 12  73 13 e0 e4 c6 89        |.. ...N.s.....|
+00000000  16 03 01 00 86 10 00 00  82 00 80 54 53 e6 48 5d  |...........TS.H]|
+00000010  bb 47 19 7e ab 31 3b 4a  c8 fb da 69 9d 74 b3 e1  |.G.~.1;J...i.t..|
+00000020  dc 8c ea 36 f7 a1 06 68  52 79 c3 08 be b9 5c 1a  |...6...hRy....\.|
+00000030  80 cc 13 b8 7b b8 02 98  5e f8 50 47 a5 0d 37 dd  |....{...^.PG..7.|
+00000040  86 c5 69 9c 1c 1c 91 39  ea 80 dc d1 87 d3 f8 f6  |..i....9........|
+00000050  84 c6 65 72 af 71 dc 98  56 9e bc e7 a9 9d 9b 31  |..er.q..V......1|
+00000060  d0 c3 54 28 05 86 91 e4  03 40 f7 2a cb 07 13 41  |..T(.....@.*...A|
+00000070  1e 30 0b b1 2d 52 ae 1f  a1 6b a9 db c2 76 1d 4a  |.0..-R...k...v.J|
+00000080  a6 81 ba 3c cb e9 3a 6b  f3 70 ed 14 03 01 00 01  |...<..:k.p......|
+00000090  01 16 03 01 00 28 01 84  d8 e4 7a b1 11 3e 27 fb  |.....(....z..>'.|
+000000a0  66 10 1a db 20 fb 9e e3  f1 a5 a7 86 2f fd c9 d2  |f... ......./...|
+000000b0  1c b8 a4 2b af 2b 66 fc  ad 31 72 28 d7 1a        |...+.+f..1r(..|
 >>> Flow 4 (server to client)
-00000000  14 03 01 00 01 01 16 03  01 00 28 e2 47 2b 57 fe  |..........(.G+W.|
-00000010  74 71 95 6a ee 68 2b f3  48 40 13 52 35 46 58 d4  |tq.j.h+.H@.R5FX.|
-00000020  ee aa 4c a8 53 0f 3a 19  ed 18 37 2d e4 b9 1e e6  |..L.S.:...7-....|
-00000030  28 42 a1 17 03 01 00 18  d8 7c 20 f2 03 6d a9 ed  |(B.......| ..m..|
-00000040  c9 73 50 d7 56 4f 0b d8  4b 44 f6 80 e4 c1 a9 f5  |.sP.VO..KD......|
-00000050  17 03 01 00 28 f5 b2 11  6b a6 4b 22 30 42 3c cc  |....(...k.K"0B<.|
-00000060  07 0d ed 10 d0 c7 7b ec  b3 60 0b 2b 3c fb ec 3a  |......{..`.+<..:|
-00000070  c0 be 44 e7 76 b6 9e db  17 36 92 df 88 15 03 01  |..D.v....6......|
-00000080  00 18 7a d9 2f 46 2e 0f  ec c5 ee 7b ef bd fb e5  |..z./F.....{....|
-00000090  26 40 0a a2 4e eb 56 0e  ca 03                    |&@..N.V...|
+00000000  14 03 01 00 01 01 16 03  01 00 28 67 3d c4 e9 a6  |..........(g=...|
+00000010  bb 99 57 90 eb fa 86 ee  ab 00 08 61 2d c8 50 5b  |..W........a-.P[|
+00000020  83 9c ce 83 60 7a 89 33  90 b7 f9 31 e9 37 04 3d  |....`z.3...1.7.=|
+00000030  d6 01 44 17 03 01 00 18  0a 1c 6c 75 23 bc b2 e7  |..D.......lu#...|
+00000040  30 2d 61 57 d3 a6 a2 72  6a 7a 2d 8a 7b fd 45 67  |0-aW...rjz-.{.Eg|
+00000050  17 03 01 00 28 23 8b 77  dd a3 f2 b6 0e 59 40 3b  |....(#.w.....Y@;|
+00000060  4e 3a 1b 0c 11 2f 99 00  b9 e1 2c 11 89 53 fb 23  |N:.../....,..S.#|
+00000070  fb 6c 60 71 db a8 43 a4  92 ad 68 24 e9 15 03 01  |.l`q..C...h$....|
+00000080  00 18 24 19 84 35 13 29  ed 3a f0 57 a9 e1 b6 e9  |..$..5.).:.W....|
+00000090  05 64 fe 46 c0 ca b1 88  12 a7                    |.d.F......|
diff --git a/src/crypto/tls/testdata/Server-TLSv10-RSA-AES b/src/crypto/tls/testdata/Server-TLSv10-RSA-AES
index 7425376..f362a7a 100644
--- a/src/crypto/tls/testdata/Server-TLSv10-RSA-AES
+++ b/src/crypto/tls/testdata/Server-TLSv10-RSA-AES
@@ -1,79 +1,76 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 63 01 00 00  5f 03 01 78 91 f6 ad 9e  |....c..._..x....|
-00000010  79 23 92 10 d9 c5 43 52  8f f6 f4 3f f4 eb ac 6b  |y#....CR...?...k|
-00000020  f3 ce a9 76 a2 bf c3 5b  9d bc 52 00 00 04 00 2f  |...v...[..R..../|
-00000030  00 ff 01 00 00 32 00 00  00 0e 00 0c 00 00 09 31  |.....2.........1|
-00000040  32 37 2e 30 2e 30 2e 31  00 0b 00 04 03 00 01 02  |27.0.0.1........|
-00000050  00 0a 00 0c 00 0a 00 1d  00 17 00 1e 00 19 00 18  |................|
-00000060  00 16 00 00 00 17 00 00                           |........|
+00000000  16 03 01 00 39 01 00 00  35 03 01 96 f7 15 21 fc  |....9...5.....!.|
+00000010  31 f5 cf cf e9 82 0f 84  db 34 a8 e4 3c e9 39 b4  |1........4..<.9.|
+00000020  90 af d7 47 2b b5 71 8a  bb 26 b5 00 00 04 00 2f  |...G+.q..&...../|
+00000030  00 ff 01 00 00 08 00 16  00 00 00 17 00 00        |..............|
 >>> Flow 2 (server to client)
-00000000  16 03 01 00 37 02 00 00  33 03 01 00 00 00 00 00  |....7...3.......|
+00000000  16 03 01 00 35 02 00 00  31 03 01 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 44 4f 57 4e 47  52 44 00 00 00 2f 00 00  |...DOWNGRD.../..|
-00000030  0b ff 01 00 01 00 00 0b  00 02 01 00 16 03 01 02  |................|
-00000040  59 0b 00 02 55 00 02 52  00 02 4f 30 82 02 4b 30  |Y...U..R..O0..K0|
-00000050  82 01 b4 a0 03 02 01 02  02 09 00 e8 f0 9d 3f e2  |..............?.|
-00000060  5b ea a6 30 0d 06 09 2a  86 48 86 f7 0d 01 01 0b  |[..0...*.H......|
-00000070  05 00 30 1f 31 0b 30 09  06 03 55 04 0a 13 02 47  |..0.1.0...U....G|
-00000080  6f 31 10 30 0e 06 03 55  04 03 13 07 47 6f 20 52  |o1.0...U....Go R|
-00000090  6f 6f 74 30 1e 17 0d 31  36 30 31 30 31 30 30 30  |oot0...160101000|
-000000a0  30 30 30 5a 17 0d 32 35  30 31 30 31 30 30 30 30  |000Z..2501010000|
-000000b0  30 30 5a 30 1a 31 0b 30  09 06 03 55 04 0a 13 02  |00Z0.1.0...U....|
-000000c0  47 6f 31 0b 30 09 06 03  55 04 03 13 02 47 6f 30  |Go1.0...U....Go0|
-000000d0  81 9f 30 0d 06 09 2a 86  48 86 f7 0d 01 01 01 05  |..0...*.H.......|
-000000e0  00 03 81 8d 00 30 81 89  02 81 81 00 db 46 7d 93  |.....0.......F}.|
-000000f0  2e 12 27 06 48 bc 06 28  21 ab 7e c4 b6 a2 5d fe  |..'.H..(!.~...].|
-00000100  1e 52 45 88 7a 36 47 a5  08 0d 92 42 5b c2 81 c0  |.RE.z6G....B[...|
-00000110  be 97 79 98 40 fb 4f 6d  14 fd 2b 13 8b c2 a5 2e  |..y.@.Om..+.....|
-00000120  67 d8 d4 09 9e d6 22 38  b7 4a 0b 74 73 2b c2 34  |g....."8.J.ts+.4|
-00000130  f1 d1 93 e5 96 d9 74 7b  f3 58 9f 6c 61 3c c0 b0  |......t{.X.la<..|
-00000140  41 d4 d9 2b 2b 24 23 77  5b 1c 3b bd 75 5d ce 20  |A..++$#w[.;.u]. |
-00000150  54 cf a1 63 87 1d 1e 24  c4 f3 1d 1a 50 8b aa b6  |T..c...$....P...|
-00000160  14 43 ed 97 a7 75 62 f4  14 c8 52 d7 02 03 01 00  |.C...ub...R.....|
-00000170  01 a3 81 93 30 81 90 30  0e 06 03 55 1d 0f 01 01  |....0..0...U....|
-00000180  ff 04 04 03 02 05 a0 30  1d 06 03 55 1d 25 04 16  |.......0...U.%..|
-00000190  30 14 06 08 2b 06 01 05  05 07 03 01 06 08 2b 06  |0...+.........+.|
-000001a0  01 05 05 07 03 02 30 0c  06 03 55 1d 13 01 01 ff  |......0...U.....|
-000001b0  04 02 30 00 30 19 06 03  55 1d 0e 04 12 04 10 9f  |..0.0...U.......|
-000001c0  91 16 1f 43 43 3e 49 a6  de 6d b6 80 d7 9f 60 30  |...CC>I..m....`0|
-000001d0  1b 06 03 55 1d 23 04 14  30 12 80 10 48 13 49 4d  |...U.#..0...H.IM|
-000001e0  13 7e 16 31 bb a3 01 d5  ac ab 6e 7b 30 19 06 03  |.~.1......n{0...|
-000001f0  55 1d 11 04 12 30 10 82  0e 65 78 61 6d 70 6c 65  |U....0...example|
-00000200  2e 67 6f 6c 61 6e 67 30  0d 06 09 2a 86 48 86 f7  |.golang0...*.H..|
-00000210  0d 01 01 0b 05 00 03 81  81 00 9d 30 cc 40 2b 5b  |...........0.@+[|
-00000220  50 a0 61 cb ba e5 53 58  e1 ed 83 28 a9 58 1a a9  |P.a...SX...(.X..|
-00000230  38 a4 95 a1 ac 31 5a 1a  84 66 3d 43 d3 2d d9 0b  |8....1Z..f=C.-..|
-00000240  f2 97 df d3 20 64 38 92  24 3a 00 bc cf 9c 7d b7  |.... d8.$:....}.|
-00000250  40 20 01 5f aa d3 16 61  09 a2 76 fd 13 c3 cc e1  |@ ._...a..v.....|
-00000260  0c 5c ee b1 87 82 f1 6c  04 ed 73 bb b3 43 77 8d  |.\.....l..s..Cw.|
-00000270  0c 1c f1 0f a1 d8 40 83  61 c9 4c 72 2b 9d ae db  |......@.a.Lr+...|
-00000280  46 06 06 4d f4 c1 b3 3e  c0 d1 bd 42 d4 db fe 3d  |F..M...>...B...=|
-00000290  13 60 84 5c 21 d3 3b e9  fa e7 16 03 01 00 04 0e  |.`.\!.;.........|
-000002a0  00 00 00                                          |...|
+00000030  09 ff 01 00 01 00 00 17  00 00 16 03 01 02 59 0b  |..............Y.|
+00000040  00 02 55 00 02 52 00 02  4f 30 82 02 4b 30 82 01  |..U..R..O0..K0..|
+00000050  b4 a0 03 02 01 02 02 09  00 e8 f0 9d 3f e2 5b ea  |............?.[.|
+00000060  a6 30 0d 06 09 2a 86 48  86 f7 0d 01 01 0b 05 00  |.0...*.H........|
+00000070  30 1f 31 0b 30 09 06 03  55 04 0a 13 02 47 6f 31  |0.1.0...U....Go1|
+00000080  10 30 0e 06 03 55 04 03  13 07 47 6f 20 52 6f 6f  |.0...U....Go Roo|
+00000090  74 30 1e 17 0d 31 36 30  31 30 31 30 30 30 30 30  |t0...16010100000|
+000000a0  30 5a 17 0d 32 35 30 31  30 31 30 30 30 30 30 30  |0Z..250101000000|
+000000b0  5a 30 1a 31 0b 30 09 06  03 55 04 0a 13 02 47 6f  |Z0.1.0...U....Go|
+000000c0  31 0b 30 09 06 03 55 04  03 13 02 47 6f 30 81 9f  |1.0...U....Go0..|
+000000d0  30 0d 06 09 2a 86 48 86  f7 0d 01 01 01 05 00 03  |0...*.H.........|
+000000e0  81 8d 00 30 81 89 02 81  81 00 db 46 7d 93 2e 12  |...0.......F}...|
+000000f0  27 06 48 bc 06 28 21 ab  7e c4 b6 a2 5d fe 1e 52  |'.H..(!.~...]..R|
+00000100  45 88 7a 36 47 a5 08 0d  92 42 5b c2 81 c0 be 97  |E.z6G....B[.....|
+00000110  79 98 40 fb 4f 6d 14 fd  2b 13 8b c2 a5 2e 67 d8  |y.@.Om..+.....g.|
+00000120  d4 09 9e d6 22 38 b7 4a  0b 74 73 2b c2 34 f1 d1  |...."8.J.ts+.4..|
+00000130  93 e5 96 d9 74 7b f3 58  9f 6c 61 3c c0 b0 41 d4  |....t{.X.la<..A.|
+00000140  d9 2b 2b 24 23 77 5b 1c  3b bd 75 5d ce 20 54 cf  |.++$#w[.;.u]. T.|
+00000150  a1 63 87 1d 1e 24 c4 f3  1d 1a 50 8b aa b6 14 43  |.c...$....P....C|
+00000160  ed 97 a7 75 62 f4 14 c8  52 d7 02 03 01 00 01 a3  |...ub...R.......|
+00000170  81 93 30 81 90 30 0e 06  03 55 1d 0f 01 01 ff 04  |..0..0...U......|
+00000180  04 03 02 05 a0 30 1d 06  03 55 1d 25 04 16 30 14  |.....0...U.%..0.|
+00000190  06 08 2b 06 01 05 05 07  03 01 06 08 2b 06 01 05  |..+.........+...|
+000001a0  05 07 03 02 30 0c 06 03  55 1d 13 01 01 ff 04 02  |....0...U.......|
+000001b0  30 00 30 19 06 03 55 1d  0e 04 12 04 10 9f 91 16  |0.0...U.........|
+000001c0  1f 43 43 3e 49 a6 de 6d  b6 80 d7 9f 60 30 1b 06  |.CC>I..m....`0..|
+000001d0  03 55 1d 23 04 14 30 12  80 10 48 13 49 4d 13 7e  |.U.#..0...H.IM.~|
+000001e0  16 31 bb a3 01 d5 ac ab  6e 7b 30 19 06 03 55 1d  |.1......n{0...U.|
+000001f0  11 04 12 30 10 82 0e 65  78 61 6d 70 6c 65 2e 67  |...0...example.g|
+00000200  6f 6c 61 6e 67 30 0d 06  09 2a 86 48 86 f7 0d 01  |olang0...*.H....|
+00000210  01 0b 05 00 03 81 81 00  9d 30 cc 40 2b 5b 50 a0  |.........0.@+[P.|
+00000220  61 cb ba e5 53 58 e1 ed  83 28 a9 58 1a a9 38 a4  |a...SX...(.X..8.|
+00000230  95 a1 ac 31 5a 1a 84 66  3d 43 d3 2d d9 0b f2 97  |...1Z..f=C.-....|
+00000240  df d3 20 64 38 92 24 3a  00 bc cf 9c 7d b7 40 20  |.. d8.$:....}.@ |
+00000250  01 5f aa d3 16 61 09 a2  76 fd 13 c3 cc e1 0c 5c  |._...a..v......\|
+00000260  ee b1 87 82 f1 6c 04 ed  73 bb b3 43 77 8d 0c 1c  |.....l..s..Cw...|
+00000270  f1 0f a1 d8 40 83 61 c9  4c 72 2b 9d ae db 46 06  |....@.a.Lr+...F.|
+00000280  06 4d f4 c1 b3 3e c0 d1  bd 42 d4 db fe 3d 13 60  |.M...>...B...=.`|
+00000290  84 5c 21 d3 3b e9 fa e7  16 03 01 00 04 0e 00 00  |.\!.;...........|
+000002a0  00                                                |.|
 >>> Flow 3 (client to server)
-00000000  16 03 01 00 86 10 00 00  82 00 80 73 aa be d1 21  |...........s...!|
-00000010  67 e9 9c 20 40 cf 0a 47  31 61 e9 2b ba 06 4f aa  |g.. @..G1a.+..O.|
-00000020  ce 15 6a b7 df 0d 0e b0  fe b5 f2 c0 26 81 39 6e  |..j.........&.9n|
-00000030  5b 96 3c 2f 42 4f 08 92  48 a3 95 c8 ad 0d 0e 8f  |[.</BO..H.......|
-00000040  9c 9e fc bf d7 25 2e c7  d1 e2 e6 66 9b bf 20 94  |.....%.....f.. .|
-00000050  6f d3 62 77 38 0f f6 96  ae 54 f1 8c 6a c2 17 bd  |o.bw8....T..j...|
-00000060  c6 7c 99 f0 e5 6d 1b f2  81 c6 49 29 c2 24 db a7  |.|...m....I).$..|
-00000070  0f c0 53 15 6f 3e 9b d8  c2 32 f1 3e 16 b7 d3 b2  |..S.o>...2.>....|
-00000080  36 99 9f b7 53 ef 34 e8  d6 13 3b 14 03 01 00 01  |6...S.4...;.....|
-00000090  01 16 03 01 00 30 c6 d2  a6 85 cf 2a e4 9e 9e e1  |.....0.....*....|
-000000a0  d0 82 d0 2a f8 e5 bd f6  9a 67 0b c6 47 07 9c 14  |...*.....g..G...|
-000000b0  7e 73 9e 4c 8b d2 55 4f  b2 32 9a 16 16 a5 e8 25  |~s.L..UO.2.....%|
-000000c0  62 e2 e9 88 b6 44                                 |b....D|
+00000000  16 03 01 00 86 10 00 00  82 00 80 47 20 04 47 3e  |...........G .G>|
+00000010  d0 67 d1 d9 5d 17 eb 85  2c 3f 1c 4b 93 f9 ff 51  |.g..]...,?.K...Q|
+00000020  ca 61 eb 04 54 6d 49 97  02 67 fe 28 79 be 4d 37  |.a..TmI..g.(y.M7|
+00000030  f7 ba e8 e0 2b 90 31 fe  66 d8 04 ad bf fb 2c 05  |....+.1.f.....,.|
+00000040  7e 41 a0 5d 00 47 20 84  83 2c 39 7f 29 aa 72 72  |~A.].G ..,9.).rr|
+00000050  89 e3 c7 bb ea 07 d2 29  94 de 54 23 eb 9f ae fa  |.......)..T#....|
+00000060  3b 9a 23 bd a8 43 11 ab  b5 6c 8a ae c6 71 2c c4  |;.#..C...l...q,.|
+00000070  f6 4d 0d 19 8e f6 7e 44  d2 04 58 68 a7 bd 84 34  |.M....~D..Xh...4|
+00000080  5f e5 98 56 a5 1e 61 57  f2 f4 ea 14 03 01 00 01  |_..V..aW........|
+00000090  01 16 03 01 00 30 eb 07  c2 ed 41 24 ab 50 74 82  |.....0....A$.Pt.|
+000000a0  c4 83 28 2c b3 33 88 a1  c7 61 89 61 29 58 78 fc  |..(,.3...a.a)Xx.|
+000000b0  b5 99 54 d2 c2 2b 14 e4  6b a9 9b b8 69 17 6c 53  |..T..+..k...i.lS|
+000000c0  dd dd d7 7b a5 a7                                 |...{..|
 >>> Flow 4 (server to client)
-00000000  14 03 01 00 01 01 16 03  01 00 30 21 7a ee 62 6a  |..........0!z.bj|
-00000010  20 39 2a 39 d1 d3 f7 bd  53 05 4f 1a 36 71 3b b6  | 9*9....S.O.6q;.|
-00000020  c5 5a b7 3b c3 0b 3f b9  2f ac 62 1c c2 2f fa 29  |.Z.;..?./.b../.)|
-00000030  dd f3 bc ff 35 28 7f 86  b8 0f 33 17 03 01 00 20  |....5(....3.... |
-00000040  3a 6c 47 23 37 5a 15 bd  03 c6 64 c5 59 2f 91 e8  |:lG#7Z....d.Y/..|
-00000050  a6 1b d5 04 c2 a7 80 0e  94 6c 3c e4 70 2c ea 81  |.........l<.p,..|
-00000060  17 03 01 00 30 60 14 bc  6b 84 16 9f 53 b6 ee c9  |....0`..k...S...|
-00000070  43 cf f3 46 97 45 e1 2f  86 96 26 cc ef ea 09 72  |C..F.E./..&....r|
-00000080  36 92 4e 9e 2a 8e a2 d7  9a cd 5f 38 a8 07 c4 54  |6.N.*....._8...T|
-00000090  a1 4d 6e 7a 36 15 03 01  00 20 1e c2 df a3 3e 8e  |.Mnz6.... ....>.|
-000000a0  15 c4 c0 90 8f 7c 5a e0  68 d7 ea 86 76 8d d1 27  |.....|Z.h...v..'|
-000000b0  c1 d9 32 55 f9 ce f5 92  e6 51                    |..2U.....Q|
+00000000  14 03 01 00 01 01 16 03  01 00 30 17 39 24 df 39  |..........0.9$.9|
+00000010  2f b4 09 7b d8 76 fa c2  0a e2 68 f9 23 0c be 1b  |/..{.v....h.#...|
+00000020  9d ba 91 16 2c f3 5b 6a  3d d3 63 12 35 76 91 38  |....,.[j=.c.5v.8|
+00000030  f3 a5 37 4a bc 65 f4 85  cb b8 65 17 03 01 00 20  |..7J.e....e.... |
+00000040  0c 59 ac 4f 44 97 46 bd  d5 ae 98 74 9f 86 3e ef  |.Y.OD.F....t..>.|
+00000050  b3 09 3c c4 0c 45 58 10  4f fd e0 be 86 ac 3e c8  |..<..EX.O.....>.|
+00000060  17 03 01 00 30 8c 76 1f  5a 4a 3b 98 4d 5c 0d c7  |....0.v.ZJ;.M\..|
+00000070  dc 55 df 70 ed 75 22 d2  a5 28 a7 4e 9f ed 83 3b  |.U.p.u"..(.N...;|
+00000080  88 85 7d 1a 7e f9 6f e7  f3 26 e1 b1 7b 4e 52 a5  |..}.~.o..&..{NR.|
+00000090  29 55 a4 04 df 15 03 01  00 20 8b 10 5c 79 5e f8  |)U....... ..\y^.|
+000000a0  1d 41 1c b2 05 fd 58 5a  80 69 e5 ce db c3 ac a4  |.A....XZ.i......|
+000000b0  e6 95 1d 9d 32 e2 66 4b  af 43                    |....2.fK.C|
diff --git a/src/crypto/tls/testdata/Server-TLSv10-RSA-RC4 b/src/crypto/tls/testdata/Server-TLSv10-RSA-RC4
index 8b1de03..e07b8d8 100644
--- a/src/crypto/tls/testdata/Server-TLSv10-RSA-RC4
+++ b/src/crypto/tls/testdata/Server-TLSv10-RSA-RC4
@@ -1,73 +1,70 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 63 01 00 00  5f 03 01 55 31 1a ed 02  |....c..._..U1...|
-00000010  35 fe 3c ea 62 08 52 96  93 bc 2a 1b 82 fe b9 8f  |5.<.b.R...*.....|
-00000020  7a 47 0e 6a 9b e8 86 ca  89 a0 e6 00 00 04 00 05  |zG.j............|
-00000030  00 ff 01 00 00 32 00 00  00 0e 00 0c 00 00 09 31  |.....2.........1|
-00000040  32 37 2e 30 2e 30 2e 31  00 0b 00 04 03 00 01 02  |27.0.0.1........|
-00000050  00 0a 00 0c 00 0a 00 1d  00 17 00 1e 00 19 00 18  |................|
-00000060  00 16 00 00 00 17 00 00                           |........|
+00000000  16 03 01 00 39 01 00 00  35 03 01 eb 78 34 78 f6  |....9...5...x4x.|
+00000010  8f 87 2f ee 5e da ee 37  5d 0a d5 79 d5 0e db b1  |../.^..7]..y....|
+00000020  b7 03 37 1f 2d ce 04 b9  2d 65 d7 00 00 04 00 05  |..7.-...-e......|
+00000030  00 ff 01 00 00 08 00 16  00 00 00 17 00 00        |..............|
 >>> Flow 2 (server to client)
-00000000  16 03 01 00 37 02 00 00  33 03 01 00 00 00 00 00  |....7...3.......|
+00000000  16 03 01 00 35 02 00 00  31 03 01 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 44 4f 57 4e 47  52 44 00 00 00 05 00 00  |...DOWNGRD......|
-00000030  0b ff 01 00 01 00 00 0b  00 02 01 00 16 03 01 02  |................|
-00000040  59 0b 00 02 55 00 02 52  00 02 4f 30 82 02 4b 30  |Y...U..R..O0..K0|
-00000050  82 01 b4 a0 03 02 01 02  02 09 00 e8 f0 9d 3f e2  |..............?.|
-00000060  5b ea a6 30 0d 06 09 2a  86 48 86 f7 0d 01 01 0b  |[..0...*.H......|
-00000070  05 00 30 1f 31 0b 30 09  06 03 55 04 0a 13 02 47  |..0.1.0...U....G|
-00000080  6f 31 10 30 0e 06 03 55  04 03 13 07 47 6f 20 52  |o1.0...U....Go R|
-00000090  6f 6f 74 30 1e 17 0d 31  36 30 31 30 31 30 30 30  |oot0...160101000|
-000000a0  30 30 30 5a 17 0d 32 35  30 31 30 31 30 30 30 30  |000Z..2501010000|
-000000b0  30 30 5a 30 1a 31 0b 30  09 06 03 55 04 0a 13 02  |00Z0.1.0...U....|
-000000c0  47 6f 31 0b 30 09 06 03  55 04 03 13 02 47 6f 30  |Go1.0...U....Go0|
-000000d0  81 9f 30 0d 06 09 2a 86  48 86 f7 0d 01 01 01 05  |..0...*.H.......|
-000000e0  00 03 81 8d 00 30 81 89  02 81 81 00 db 46 7d 93  |.....0.......F}.|
-000000f0  2e 12 27 06 48 bc 06 28  21 ab 7e c4 b6 a2 5d fe  |..'.H..(!.~...].|
-00000100  1e 52 45 88 7a 36 47 a5  08 0d 92 42 5b c2 81 c0  |.RE.z6G....B[...|
-00000110  be 97 79 98 40 fb 4f 6d  14 fd 2b 13 8b c2 a5 2e  |..y.@.Om..+.....|
-00000120  67 d8 d4 09 9e d6 22 38  b7 4a 0b 74 73 2b c2 34  |g....."8.J.ts+.4|
-00000130  f1 d1 93 e5 96 d9 74 7b  f3 58 9f 6c 61 3c c0 b0  |......t{.X.la<..|
-00000140  41 d4 d9 2b 2b 24 23 77  5b 1c 3b bd 75 5d ce 20  |A..++$#w[.;.u]. |
-00000150  54 cf a1 63 87 1d 1e 24  c4 f3 1d 1a 50 8b aa b6  |T..c...$....P...|
-00000160  14 43 ed 97 a7 75 62 f4  14 c8 52 d7 02 03 01 00  |.C...ub...R.....|
-00000170  01 a3 81 93 30 81 90 30  0e 06 03 55 1d 0f 01 01  |....0..0...U....|
-00000180  ff 04 04 03 02 05 a0 30  1d 06 03 55 1d 25 04 16  |.......0...U.%..|
-00000190  30 14 06 08 2b 06 01 05  05 07 03 01 06 08 2b 06  |0...+.........+.|
-000001a0  01 05 05 07 03 02 30 0c  06 03 55 1d 13 01 01 ff  |......0...U.....|
-000001b0  04 02 30 00 30 19 06 03  55 1d 0e 04 12 04 10 9f  |..0.0...U.......|
-000001c0  91 16 1f 43 43 3e 49 a6  de 6d b6 80 d7 9f 60 30  |...CC>I..m....`0|
-000001d0  1b 06 03 55 1d 23 04 14  30 12 80 10 48 13 49 4d  |...U.#..0...H.IM|
-000001e0  13 7e 16 31 bb a3 01 d5  ac ab 6e 7b 30 19 06 03  |.~.1......n{0...|
-000001f0  55 1d 11 04 12 30 10 82  0e 65 78 61 6d 70 6c 65  |U....0...example|
-00000200  2e 67 6f 6c 61 6e 67 30  0d 06 09 2a 86 48 86 f7  |.golang0...*.H..|
-00000210  0d 01 01 0b 05 00 03 81  81 00 9d 30 cc 40 2b 5b  |...........0.@+[|
-00000220  50 a0 61 cb ba e5 53 58  e1 ed 83 28 a9 58 1a a9  |P.a...SX...(.X..|
-00000230  38 a4 95 a1 ac 31 5a 1a  84 66 3d 43 d3 2d d9 0b  |8....1Z..f=C.-..|
-00000240  f2 97 df d3 20 64 38 92  24 3a 00 bc cf 9c 7d b7  |.... d8.$:....}.|
-00000250  40 20 01 5f aa d3 16 61  09 a2 76 fd 13 c3 cc e1  |@ ._...a..v.....|
-00000260  0c 5c ee b1 87 82 f1 6c  04 ed 73 bb b3 43 77 8d  |.\.....l..s..Cw.|
-00000270  0c 1c f1 0f a1 d8 40 83  61 c9 4c 72 2b 9d ae db  |......@.a.Lr+...|
-00000280  46 06 06 4d f4 c1 b3 3e  c0 d1 bd 42 d4 db fe 3d  |F..M...>...B...=|
-00000290  13 60 84 5c 21 d3 3b e9  fa e7 16 03 01 00 04 0e  |.`.\!.;.........|
-000002a0  00 00 00                                          |...|
+00000030  09 ff 01 00 01 00 00 17  00 00 16 03 01 02 59 0b  |..............Y.|
+00000040  00 02 55 00 02 52 00 02  4f 30 82 02 4b 30 82 01  |..U..R..O0..K0..|
+00000050  b4 a0 03 02 01 02 02 09  00 e8 f0 9d 3f e2 5b ea  |............?.[.|
+00000060  a6 30 0d 06 09 2a 86 48  86 f7 0d 01 01 0b 05 00  |.0...*.H........|
+00000070  30 1f 31 0b 30 09 06 03  55 04 0a 13 02 47 6f 31  |0.1.0...U....Go1|
+00000080  10 30 0e 06 03 55 04 03  13 07 47 6f 20 52 6f 6f  |.0...U....Go Roo|
+00000090  74 30 1e 17 0d 31 36 30  31 30 31 30 30 30 30 30  |t0...16010100000|
+000000a0  30 5a 17 0d 32 35 30 31  30 31 30 30 30 30 30 30  |0Z..250101000000|
+000000b0  5a 30 1a 31 0b 30 09 06  03 55 04 0a 13 02 47 6f  |Z0.1.0...U....Go|
+000000c0  31 0b 30 09 06 03 55 04  03 13 02 47 6f 30 81 9f  |1.0...U....Go0..|
+000000d0  30 0d 06 09 2a 86 48 86  f7 0d 01 01 01 05 00 03  |0...*.H.........|
+000000e0  81 8d 00 30 81 89 02 81  81 00 db 46 7d 93 2e 12  |...0.......F}...|
+000000f0  27 06 48 bc 06 28 21 ab  7e c4 b6 a2 5d fe 1e 52  |'.H..(!.~...]..R|
+00000100  45 88 7a 36 47 a5 08 0d  92 42 5b c2 81 c0 be 97  |E.z6G....B[.....|
+00000110  79 98 40 fb 4f 6d 14 fd  2b 13 8b c2 a5 2e 67 d8  |y.@.Om..+.....g.|
+00000120  d4 09 9e d6 22 38 b7 4a  0b 74 73 2b c2 34 f1 d1  |...."8.J.ts+.4..|
+00000130  93 e5 96 d9 74 7b f3 58  9f 6c 61 3c c0 b0 41 d4  |....t{.X.la<..A.|
+00000140  d9 2b 2b 24 23 77 5b 1c  3b bd 75 5d ce 20 54 cf  |.++$#w[.;.u]. T.|
+00000150  a1 63 87 1d 1e 24 c4 f3  1d 1a 50 8b aa b6 14 43  |.c...$....P....C|
+00000160  ed 97 a7 75 62 f4 14 c8  52 d7 02 03 01 00 01 a3  |...ub...R.......|
+00000170  81 93 30 81 90 30 0e 06  03 55 1d 0f 01 01 ff 04  |..0..0...U......|
+00000180  04 03 02 05 a0 30 1d 06  03 55 1d 25 04 16 30 14  |.....0...U.%..0.|
+00000190  06 08 2b 06 01 05 05 07  03 01 06 08 2b 06 01 05  |..+.........+...|
+000001a0  05 07 03 02 30 0c 06 03  55 1d 13 01 01 ff 04 02  |....0...U.......|
+000001b0  30 00 30 19 06 03 55 1d  0e 04 12 04 10 9f 91 16  |0.0...U.........|
+000001c0  1f 43 43 3e 49 a6 de 6d  b6 80 d7 9f 60 30 1b 06  |.CC>I..m....`0..|
+000001d0  03 55 1d 23 04 14 30 12  80 10 48 13 49 4d 13 7e  |.U.#..0...H.IM.~|
+000001e0  16 31 bb a3 01 d5 ac ab  6e 7b 30 19 06 03 55 1d  |.1......n{0...U.|
+000001f0  11 04 12 30 10 82 0e 65  78 61 6d 70 6c 65 2e 67  |...0...example.g|
+00000200  6f 6c 61 6e 67 30 0d 06  09 2a 86 48 86 f7 0d 01  |olang0...*.H....|
+00000210  01 0b 05 00 03 81 81 00  9d 30 cc 40 2b 5b 50 a0  |.........0.@+[P.|
+00000220  61 cb ba e5 53 58 e1 ed  83 28 a9 58 1a a9 38 a4  |a...SX...(.X..8.|
+00000230  95 a1 ac 31 5a 1a 84 66  3d 43 d3 2d d9 0b f2 97  |...1Z..f=C.-....|
+00000240  df d3 20 64 38 92 24 3a  00 bc cf 9c 7d b7 40 20  |.. d8.$:....}.@ |
+00000250  01 5f aa d3 16 61 09 a2  76 fd 13 c3 cc e1 0c 5c  |._...a..v......\|
+00000260  ee b1 87 82 f1 6c 04 ed  73 bb b3 43 77 8d 0c 1c  |.....l..s..Cw...|
+00000270  f1 0f a1 d8 40 83 61 c9  4c 72 2b 9d ae db 46 06  |....@.a.Lr+...F.|
+00000280  06 4d f4 c1 b3 3e c0 d1  bd 42 d4 db fe 3d 13 60  |.M...>...B...=.`|
+00000290  84 5c 21 d3 3b e9 fa e7  16 03 01 00 04 0e 00 00  |.\!.;...........|
+000002a0  00                                                |.|
 >>> Flow 3 (client to server)
-00000000  16 03 01 00 86 10 00 00  82 00 80 75 7d be e3 5b  |...........u}..[|
-00000010  66 4b 58 09 f7 86 6a ca  93 8e ba 3c 18 11 47 5e  |fKX...j....<..G^|
-00000020  7e c2 b1 0c 5e a4 c1 07  ef 25 00 d7 bf c7 b0 03  |~...^....%......|
-00000030  0d f6 ff a9 c2 73 a2 c0  dc 8d db f9 5a a9 18 7d  |.....s......Z..}|
-00000040  1f 8e 0b 9c 24 6c c8 49  99 e1 42 e0 86 d5 e1 e1  |....$l.I..B.....|
-00000050  d1 ae fd d2 c4 ef 07 8c  28 95 b7 54 25 57 40 1c  |........(..T%W@.|
-00000060  c6 af 85 46 a0 31 d4 39  b8 47 43 88 a0 a6 5d d7  |...F.1.9.GC...].|
-00000070  95 fb 88 64 ce 36 2b c5  56 85 56 40 f8 d4 d3 90  |...d.6+.V.V@....|
-00000080  d1 25 53 06 d8 ab a0 f2  21 8f 88 14 03 01 00 01  |.%S.....!.......|
-00000090  01 16 03 01 00 24 26 50  7a 2c ab 3f db 41 06 cf  |.....$&Pz,.?.A..|
-000000a0  8b 7b f8 46 ad a4 77 b6  06 f0 44 23 04 34 88 9d  |.{.F..w...D#.4..|
-000000b0  48 d7 5e cc 9e e6 46 a3  04 69                    |H.^...F..i|
+00000000  16 03 01 00 86 10 00 00  82 00 80 d4 db 61 0b 26  |.............a.&|
+00000010  06 af 94 37 9d fc 50 3f  50 4f 58 37 b9 b1 c2 d2  |...7..P?POX7....|
+00000020  92 2b f5 c9 fe 7f 3d f4  32 e3 ee ba 46 ea e5 36  |.+....=.2...F..6|
+00000030  9b fd c5 89 c9 14 45 e7  f7 ea 1a a9 63 c5 62 fb  |......E.....c.b.|
+00000040  34 c4 80 1e 59 60 39 d9  ca 68 3f 3f 1a f9 6a 14  |4...Y`9..h??..j.|
+00000050  f7 c8 91 3b 7d eb cc b9  8c 42 f1 ef d8 0f cd 17  |...;}....B......|
+00000060  64 f3 b8 30 6e 50 d4 23  bb 26 78 c3 fe f0 c4 42  |d..0nP.#.&x....B|
+00000070  0a 89 90 fb 43 fe 7f 0f  06 82 e8 7f fb 42 dd 46  |....C........B.F|
+00000080  fc 38 6e d0 14 05 41 b8  05 6b e7 14 03 01 00 01  |.8n...A..k......|
+00000090  01 16 03 01 00 24 b4 bb  3e 8f 6b 91 43 c2 b9 16  |.....$..>.k.C...|
+000000a0  59 ba 7d f9 89 a4 89 ce  12 c8 76 b0 e3 8f 36 03  |Y.}.......v...6.|
+000000b0  f7 48 03 7e 4a fe e5 8e  88 91                    |.H.~J.....|
 >>> Flow 4 (server to client)
-00000000  14 03 01 00 01 01 16 03  01 00 24 57 fc eb dd 40  |..........$W...@|
-00000010  83 1d 9a 9a 80 a3 62 a0  08 23 c3 97 fd d5 fb d7  |......b..#......|
-00000020  98 f8 14 ae 61 c7 21 fb  8a 18 1e c8 15 05 e7 17  |....a.!.........|
-00000030  03 01 00 21 7c 2b 2d 72  2f 63 56 3a 09 51 4e ab  |...!|+-r/cV:.QN.|
-00000040  31 25 c8 7e 34 5b a4 ab  30 87 50 07 ed 32 3f 79  |1%.~4[..0.P..2?y|
-00000050  f1 db c0 17 f3 15 03 01  00 16 fc ce c9 0c b6 0c  |................|
-00000060  c5 2d d9 3f 2a 9e 9a 83  40 e1 a3 b9 5f 89 aa 75  |.-.?*...@..._..u|
+00000000  14 03 01 00 01 01 16 03  01 00 24 06 5d 9f 70 98  |..........$.].p.|
+00000010  8b 42 79 f1 ba 73 40 8e  b3 f6 ff a1 45 57 c4 f3  |.By..s@.....EW..|
+00000020  6d 00 4e b5 52 f5 3d 08  b4 57 33 74 ab 6f 62 17  |m.N.R.=..W3t.ob.|
+00000030  03 01 00 21 6e 3a c7 a5  63 fb 81 78 10 9c 85 ab  |...!n:..c..x....|
+00000040  3d 3b 50 3a 12 0b c2 0f  f5 7e a2 d3 f7 82 3c 7f  |=;P:.....~....<.|
+00000050  45 29 2c 1e eb 15 03 01  00 16 66 a4 bb 6d d1 fc  |E),.......f..m..|
+00000060  36 b2 a9 e7 e5 7a da a1  37 f1 cf fa 8f 0c 73 f5  |6....z..7.....s.|
diff --git a/src/crypto/tls/testdata/Server-TLSv11-RSA-RC4 b/src/crypto/tls/testdata/Server-TLSv11-RSA-RC4
index dc70edf..27062da 100644
--- a/src/crypto/tls/testdata/Server-TLSv11-RSA-RC4
+++ b/src/crypto/tls/testdata/Server-TLSv11-RSA-RC4
@@ -1,73 +1,70 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 63 01 00 00  5f 03 02 2b b6 22 28 e3  |....c..._..+."(.|
-00000010  1f 42 f4 2e d0 43 4b 9a  ea 2b 36 44 ca 93 6c 71  |.B...CK..+6D..lq|
-00000020  b9 4d 52 44 64 57 b2 05  9b 41 da 00 00 04 00 05  |.MRDdW...A......|
-00000030  00 ff 01 00 00 32 00 00  00 0e 00 0c 00 00 09 31  |.....2.........1|
-00000040  32 37 2e 30 2e 30 2e 31  00 0b 00 04 03 00 01 02  |27.0.0.1........|
-00000050  00 0a 00 0c 00 0a 00 1d  00 17 00 1e 00 19 00 18  |................|
-00000060  00 16 00 00 00 17 00 00                           |........|
+00000000  16 03 01 00 39 01 00 00  35 03 02 ac 4f 36 f3 4c  |....9...5...O6.L|
+00000010  64 ae 8d fc 50 a3 e1 e4  70 5d ba 8c de de c8 07  |d...P...p]......|
+00000020  70 24 8d bd c1 69 a3 0e  ad 16 38 00 00 04 00 05  |p$...i....8.....|
+00000030  00 ff 01 00 00 08 00 16  00 00 00 17 00 00        |..............|
 >>> Flow 2 (server to client)
-00000000  16 03 02 00 37 02 00 00  33 03 02 00 00 00 00 00  |....7...3.......|
+00000000  16 03 02 00 35 02 00 00  31 03 02 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 44 4f 57 4e 47  52 44 00 00 00 05 00 00  |...DOWNGRD......|
-00000030  0b ff 01 00 01 00 00 0b  00 02 01 00 16 03 02 02  |................|
-00000040  59 0b 00 02 55 00 02 52  00 02 4f 30 82 02 4b 30  |Y...U..R..O0..K0|
-00000050  82 01 b4 a0 03 02 01 02  02 09 00 e8 f0 9d 3f e2  |..............?.|
-00000060  5b ea a6 30 0d 06 09 2a  86 48 86 f7 0d 01 01 0b  |[..0...*.H......|
-00000070  05 00 30 1f 31 0b 30 09  06 03 55 04 0a 13 02 47  |..0.1.0...U....G|
-00000080  6f 31 10 30 0e 06 03 55  04 03 13 07 47 6f 20 52  |o1.0...U....Go R|
-00000090  6f 6f 74 30 1e 17 0d 31  36 30 31 30 31 30 30 30  |oot0...160101000|
-000000a0  30 30 30 5a 17 0d 32 35  30 31 30 31 30 30 30 30  |000Z..2501010000|
-000000b0  30 30 5a 30 1a 31 0b 30  09 06 03 55 04 0a 13 02  |00Z0.1.0...U....|
-000000c0  47 6f 31 0b 30 09 06 03  55 04 03 13 02 47 6f 30  |Go1.0...U....Go0|
-000000d0  81 9f 30 0d 06 09 2a 86  48 86 f7 0d 01 01 01 05  |..0...*.H.......|
-000000e0  00 03 81 8d 00 30 81 89  02 81 81 00 db 46 7d 93  |.....0.......F}.|
-000000f0  2e 12 27 06 48 bc 06 28  21 ab 7e c4 b6 a2 5d fe  |..'.H..(!.~...].|
-00000100  1e 52 45 88 7a 36 47 a5  08 0d 92 42 5b c2 81 c0  |.RE.z6G....B[...|
-00000110  be 97 79 98 40 fb 4f 6d  14 fd 2b 13 8b c2 a5 2e  |..y.@.Om..+.....|
-00000120  67 d8 d4 09 9e d6 22 38  b7 4a 0b 74 73 2b c2 34  |g....."8.J.ts+.4|
-00000130  f1 d1 93 e5 96 d9 74 7b  f3 58 9f 6c 61 3c c0 b0  |......t{.X.la<..|
-00000140  41 d4 d9 2b 2b 24 23 77  5b 1c 3b bd 75 5d ce 20  |A..++$#w[.;.u]. |
-00000150  54 cf a1 63 87 1d 1e 24  c4 f3 1d 1a 50 8b aa b6  |T..c...$....P...|
-00000160  14 43 ed 97 a7 75 62 f4  14 c8 52 d7 02 03 01 00  |.C...ub...R.....|
-00000170  01 a3 81 93 30 81 90 30  0e 06 03 55 1d 0f 01 01  |....0..0...U....|
-00000180  ff 04 04 03 02 05 a0 30  1d 06 03 55 1d 25 04 16  |.......0...U.%..|
-00000190  30 14 06 08 2b 06 01 05  05 07 03 01 06 08 2b 06  |0...+.........+.|
-000001a0  01 05 05 07 03 02 30 0c  06 03 55 1d 13 01 01 ff  |......0...U.....|
-000001b0  04 02 30 00 30 19 06 03  55 1d 0e 04 12 04 10 9f  |..0.0...U.......|
-000001c0  91 16 1f 43 43 3e 49 a6  de 6d b6 80 d7 9f 60 30  |...CC>I..m....`0|
-000001d0  1b 06 03 55 1d 23 04 14  30 12 80 10 48 13 49 4d  |...U.#..0...H.IM|
-000001e0  13 7e 16 31 bb a3 01 d5  ac ab 6e 7b 30 19 06 03  |.~.1......n{0...|
-000001f0  55 1d 11 04 12 30 10 82  0e 65 78 61 6d 70 6c 65  |U....0...example|
-00000200  2e 67 6f 6c 61 6e 67 30  0d 06 09 2a 86 48 86 f7  |.golang0...*.H..|
-00000210  0d 01 01 0b 05 00 03 81  81 00 9d 30 cc 40 2b 5b  |...........0.@+[|
-00000220  50 a0 61 cb ba e5 53 58  e1 ed 83 28 a9 58 1a a9  |P.a...SX...(.X..|
-00000230  38 a4 95 a1 ac 31 5a 1a  84 66 3d 43 d3 2d d9 0b  |8....1Z..f=C.-..|
-00000240  f2 97 df d3 20 64 38 92  24 3a 00 bc cf 9c 7d b7  |.... d8.$:....}.|
-00000250  40 20 01 5f aa d3 16 61  09 a2 76 fd 13 c3 cc e1  |@ ._...a..v.....|
-00000260  0c 5c ee b1 87 82 f1 6c  04 ed 73 bb b3 43 77 8d  |.\.....l..s..Cw.|
-00000270  0c 1c f1 0f a1 d8 40 83  61 c9 4c 72 2b 9d ae db  |......@.a.Lr+...|
-00000280  46 06 06 4d f4 c1 b3 3e  c0 d1 bd 42 d4 db fe 3d  |F..M...>...B...=|
-00000290  13 60 84 5c 21 d3 3b e9  fa e7 16 03 02 00 04 0e  |.`.\!.;.........|
-000002a0  00 00 00                                          |...|
+00000030  09 ff 01 00 01 00 00 17  00 00 16 03 02 02 59 0b  |..............Y.|
+00000040  00 02 55 00 02 52 00 02  4f 30 82 02 4b 30 82 01  |..U..R..O0..K0..|
+00000050  b4 a0 03 02 01 02 02 09  00 e8 f0 9d 3f e2 5b ea  |............?.[.|
+00000060  a6 30 0d 06 09 2a 86 48  86 f7 0d 01 01 0b 05 00  |.0...*.H........|
+00000070  30 1f 31 0b 30 09 06 03  55 04 0a 13 02 47 6f 31  |0.1.0...U....Go1|
+00000080  10 30 0e 06 03 55 04 03  13 07 47 6f 20 52 6f 6f  |.0...U....Go Roo|
+00000090  74 30 1e 17 0d 31 36 30  31 30 31 30 30 30 30 30  |t0...16010100000|
+000000a0  30 5a 17 0d 32 35 30 31  30 31 30 30 30 30 30 30  |0Z..250101000000|
+000000b0  5a 30 1a 31 0b 30 09 06  03 55 04 0a 13 02 47 6f  |Z0.1.0...U....Go|
+000000c0  31 0b 30 09 06 03 55 04  03 13 02 47 6f 30 81 9f  |1.0...U....Go0..|
+000000d0  30 0d 06 09 2a 86 48 86  f7 0d 01 01 01 05 00 03  |0...*.H.........|
+000000e0  81 8d 00 30 81 89 02 81  81 00 db 46 7d 93 2e 12  |...0.......F}...|
+000000f0  27 06 48 bc 06 28 21 ab  7e c4 b6 a2 5d fe 1e 52  |'.H..(!.~...]..R|
+00000100  45 88 7a 36 47 a5 08 0d  92 42 5b c2 81 c0 be 97  |E.z6G....B[.....|
+00000110  79 98 40 fb 4f 6d 14 fd  2b 13 8b c2 a5 2e 67 d8  |y.@.Om..+.....g.|
+00000120  d4 09 9e d6 22 38 b7 4a  0b 74 73 2b c2 34 f1 d1  |...."8.J.ts+.4..|
+00000130  93 e5 96 d9 74 7b f3 58  9f 6c 61 3c c0 b0 41 d4  |....t{.X.la<..A.|
+00000140  d9 2b 2b 24 23 77 5b 1c  3b bd 75 5d ce 20 54 cf  |.++$#w[.;.u]. T.|
+00000150  a1 63 87 1d 1e 24 c4 f3  1d 1a 50 8b aa b6 14 43  |.c...$....P....C|
+00000160  ed 97 a7 75 62 f4 14 c8  52 d7 02 03 01 00 01 a3  |...ub...R.......|
+00000170  81 93 30 81 90 30 0e 06  03 55 1d 0f 01 01 ff 04  |..0..0...U......|
+00000180  04 03 02 05 a0 30 1d 06  03 55 1d 25 04 16 30 14  |.....0...U.%..0.|
+00000190  06 08 2b 06 01 05 05 07  03 01 06 08 2b 06 01 05  |..+.........+...|
+000001a0  05 07 03 02 30 0c 06 03  55 1d 13 01 01 ff 04 02  |....0...U.......|
+000001b0  30 00 30 19 06 03 55 1d  0e 04 12 04 10 9f 91 16  |0.0...U.........|
+000001c0  1f 43 43 3e 49 a6 de 6d  b6 80 d7 9f 60 30 1b 06  |.CC>I..m....`0..|
+000001d0  03 55 1d 23 04 14 30 12  80 10 48 13 49 4d 13 7e  |.U.#..0...H.IM.~|
+000001e0  16 31 bb a3 01 d5 ac ab  6e 7b 30 19 06 03 55 1d  |.1......n{0...U.|
+000001f0  11 04 12 30 10 82 0e 65  78 61 6d 70 6c 65 2e 67  |...0...example.g|
+00000200  6f 6c 61 6e 67 30 0d 06  09 2a 86 48 86 f7 0d 01  |olang0...*.H....|
+00000210  01 0b 05 00 03 81 81 00  9d 30 cc 40 2b 5b 50 a0  |.........0.@+[P.|
+00000220  61 cb ba e5 53 58 e1 ed  83 28 a9 58 1a a9 38 a4  |a...SX...(.X..8.|
+00000230  95 a1 ac 31 5a 1a 84 66  3d 43 d3 2d d9 0b f2 97  |...1Z..f=C.-....|
+00000240  df d3 20 64 38 92 24 3a  00 bc cf 9c 7d b7 40 20  |.. d8.$:....}.@ |
+00000250  01 5f aa d3 16 61 09 a2  76 fd 13 c3 cc e1 0c 5c  |._...a..v......\|
+00000260  ee b1 87 82 f1 6c 04 ed  73 bb b3 43 77 8d 0c 1c  |.....l..s..Cw...|
+00000270  f1 0f a1 d8 40 83 61 c9  4c 72 2b 9d ae db 46 06  |....@.a.Lr+...F.|
+00000280  06 4d f4 c1 b3 3e c0 d1  bd 42 d4 db fe 3d 13 60  |.M...>...B...=.`|
+00000290  84 5c 21 d3 3b e9 fa e7  16 03 02 00 04 0e 00 00  |.\!.;...........|
+000002a0  00                                                |.|
 >>> Flow 3 (client to server)
-00000000  16 03 02 00 86 10 00 00  82 00 80 3d 47 85 0a ef  |...........=G...|
-00000010  47 7c c5 93 bb 6f 7c 57  dc 2b 3f f4 e7 da 4e fc  |G|...o|W.+?...N.|
-00000020  04 52 36 71 c5 63 1f 6f  e6 43 91 06 bc 5c 14 b0  |.R6q.c.o.C...\..|
-00000030  ee 83 ed 3d 7a d2 4e 2c  d2 2c bb f0 0c b5 82 d5  |...=z.N,.,......|
-00000040  9d c2 5a 03 12 b6 70 20  3c 89 84 af 1b 2c 2f b7  |..Z...p <....,/.|
-00000050  9b fe dd 71 06 ac 46 30  a7 b5 9f 0b aa 6e 58 50  |...q..F0.....nXP|
-00000060  9d da 6b ba 00 51 e9 2a  e9 d2 e9 0f 83 62 73 19  |..k..Q.*.....bs.|
-00000070  91 a4 46 bd 53 42 f7 15  ab ab 6b 8f f3 6f d1 07  |..F.SB....k..o..|
-00000080  44 41 97 4c 7d 89 4b 33  55 30 30 14 03 02 00 01  |DA.L}.K3U00.....|
-00000090  01 16 03 02 00 24 54 fe  a0 7c 16 47 de 0b 8f 7d  |.....$T..|.G...}|
-000000a0  51 68 05 da 1e 6d 96 c9  e1 94 68 fa 79 46 02 db  |Qh...m....h.yF..|
-000000b0  03 4e 2e 70 9f 7e 14 85  fd 1d                    |.N.p.~....|
+00000000  16 03 02 00 86 10 00 00  82 00 80 49 c4 5f 04 e0  |...........I._..|
+00000010  63 96 72 bd c9 00 af 17  b1 59 b4 c7 40 a5 b7 b5  |c.r......Y..@...|
+00000020  68 79 d2 7b b0 2a e7 06  7e 97 ad da d8 3f cb f8  |hy.{.*..~....?..|
+00000030  7c b9 f1 9d be 49 7c 09  6a b0 25 49 9c 06 2a c3  ||....I|.j.%I..*.|
+00000040  d5 0a ae cc cc 08 31 5d  14 82 06 a7 57 fc 66 9c  |......1]....W.f.|
+00000050  90 b7 be aa 15 46 2b aa  ae fc 3a ce 3d 64 4e 80  |.....F+...:.=dN.|
+00000060  90 3f 77 c6 60 cd 6b dc  69 c1 92 a9 1e 8e 30 6a  |.?w.`.k.i.....0j|
+00000070  34 a3 db 1a f5 a3 f9 ac  1c 07 4f be 38 d1 a5 61  |4.........O.8..a|
+00000080  e5 5f 84 99 f0 87 40 dc  b2 cc 05 14 03 02 00 01  |._....@.........|
+00000090  01 16 03 02 00 24 eb d9  48 20 7b db 97 48 f2 c7  |.....$..H {..H..|
+000000a0  bb c1 ef fa 74 44 d8 a1  55 63 f3 d0 90 ef f2 0b  |....tD..Uc......|
+000000b0  67 10 98 27 76 8a 70 78  0b df                    |g..'v.px..|
 >>> Flow 4 (server to client)
-00000000  14 03 02 00 01 01 16 03  02 00 24 4b c5 cf 20 3f  |..........$K.. ?|
-00000010  0a 13 1f 55 25 26 9b 33  fd 14 61 0f 44 32 26 b3  |...U%&.3..a.D2&.|
-00000020  ab 01 ee c2 1f d3 38 08  f0 af 76 6a 0d e1 b7 17  |......8...vj....|
-00000030  03 02 00 21 97 16 df 99  06 81 f2 00 d3 fd b4 03  |...!............|
-00000040  be 16 b6 aa 74 d4 c7 25  67 94 14 34 25 ec 0d 12  |....t..%g..4%...|
-00000050  c7 43 2d a2 1d 15 03 02  00 16 94 58 af 6b 55 5f  |.C-........X.kU_|
-00000060  25 0c 80 28 99 2d 75 1a  ce 24 cd 75 0d 7f b9 71  |%..(.-u..$.u...q|
+00000000  14 03 02 00 01 01 16 03  02 00 24 41 50 b9 88 0e  |..........$AP...|
+00000010  3f 27 36 f0 27 70 ca b8  bc 38 df e9 68 3e 29 cf  |?'6.'p...8..h>).|
+00000020  80 b5 e8 59 bd 52 45 b7  0d fa a7 6d 77 a0 9e 17  |...Y.RE....mw...|
+00000030  03 02 00 21 94 2a 6a ca  f0 b3 7e 1c d6 58 3f 64  |...!.*j...~..X?d|
+00000040  ef 62 35 72 aa c6 84 7b  19 c6 07 0e 04 63 c4 14  |.b5r...{.....c..|
+00000050  43 d8 73 ff 2f 15 03 02  00 16 5a 45 ba 51 95 c9  |C.s./.....ZE.Q..|
+00000060  53 2a a6 b1 61 35 db 0a  7b f9 8e a9 fb 18 87 b1  |S*..a5..{.......|
diff --git a/src/crypto/tls/testdata/Server-TLSv12-ALPN b/src/crypto/tls/testdata/Server-TLSv12-ALPN
index d738662..ccd4a08 100644
--- a/src/crypto/tls/testdata/Server-TLSv12-ALPN
+++ b/src/crypto/tls/testdata/Server-TLSv12-ALPN
@@ -1,7 +1,7 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 9d 01 00 00  99 03 03 53 49 69 68 95  |...........SIih.|
-00000010  b9 7b 2a 84 d2 03 93 d4  33 e7 b7 7e bc b5 97 b0  |.{*.....3..~....|
-00000020  4f 4f 6c d0 96 43 aa c8  6f da 90 00 00 04 cc a8  |OOl..C..o.......|
+00000000  16 03 01 00 9d 01 00 00  99 03 03 f7 12 13 92 75  |...............u|
+00000010  34 ab f3 e8 a2 19 2d 3c  0c 8b 9e c3 e8 22 7e d8  |4.....-<....."~.|
+00000020  66 f9 08 88 70 9b cc 37  95 43 a7 00 00 04 cc a8  |f...p..7.C......|
 00000030  00 ff 01 00 00 6c 00 0b  00 04 03 00 01 02 00 0a  |.....l..........|
 00000040  00 0c 00 0a 00 1d 00 17  00 1e 00 19 00 18 00 23  |...............#|
 00000050  00 00 00 10 00 10 00 0e  06 70 72 6f 74 6f 32 06  |.........proto2.|
@@ -11,82 +11,81 @@
 00000090  03 03 02 03 03 01 02 01  03 02 02 02 04 02 05 02  |................|
 000000a0  06 02                                             |..|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 48 02 00 00  44 03 03 00 00 00 00 00  |....H...D.......|
+00000000  16 03 03 00 4c 02 00 00  48 03 03 00 00 00 00 00  |....L...H.......|
 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000020  00 00 00 44 4f 57 4e 47  52 44 01 00 cc a8 00 00  |...DOWNGRD......|
-00000030  1c 00 23 00 00 ff 01 00  01 00 00 10 00 09 00 07  |..#.............|
-00000040  06 70 72 6f 74 6f 31 00  0b 00 02 01 00 16 03 03  |.proto1.........|
-00000050  02 59 0b 00 02 55 00 02  52 00 02 4f 30 82 02 4b  |.Y...U..R..O0..K|
-00000060  30 82 01 b4 a0 03 02 01  02 02 09 00 e8 f0 9d 3f  |0..............?|
-00000070  e2 5b ea a6 30 0d 06 09  2a 86 48 86 f7 0d 01 01  |.[..0...*.H.....|
-00000080  0b 05 00 30 1f 31 0b 30  09 06 03 55 04 0a 13 02  |...0.1.0...U....|
-00000090  47 6f 31 10 30 0e 06 03  55 04 03 13 07 47 6f 20  |Go1.0...U....Go |
-000000a0  52 6f 6f 74 30 1e 17 0d  31 36 30 31 30 31 30 30  |Root0...16010100|
-000000b0  30 30 30 30 5a 17 0d 32  35 30 31 30 31 30 30 30  |0000Z..250101000|
-000000c0  30 30 30 5a 30 1a 31 0b  30 09 06 03 55 04 0a 13  |000Z0.1.0...U...|
-000000d0  02 47 6f 31 0b 30 09 06  03 55 04 03 13 02 47 6f  |.Go1.0...U....Go|
-000000e0  30 81 9f 30 0d 06 09 2a  86 48 86 f7 0d 01 01 01  |0..0...*.H......|
-000000f0  05 00 03 81 8d 00 30 81  89 02 81 81 00 db 46 7d  |......0.......F}|
-00000100  93 2e 12 27 06 48 bc 06  28 21 ab 7e c4 b6 a2 5d  |...'.H..(!.~...]|
-00000110  fe 1e 52 45 88 7a 36 47  a5 08 0d 92 42 5b c2 81  |..RE.z6G....B[..|
-00000120  c0 be 97 79 98 40 fb 4f  6d 14 fd 2b 13 8b c2 a5  |...y.@.Om..+....|
-00000130  2e 67 d8 d4 09 9e d6 22  38 b7 4a 0b 74 73 2b c2  |.g....."8.J.ts+.|
-00000140  34 f1 d1 93 e5 96 d9 74  7b f3 58 9f 6c 61 3c c0  |4......t{.X.la<.|
-00000150  b0 41 d4 d9 2b 2b 24 23  77 5b 1c 3b bd 75 5d ce  |.A..++$#w[.;.u].|
-00000160  20 54 cf a1 63 87 1d 1e  24 c4 f3 1d 1a 50 8b aa  | T..c...$....P..|
-00000170  b6 14 43 ed 97 a7 75 62  f4 14 c8 52 d7 02 03 01  |..C...ub...R....|
-00000180  00 01 a3 81 93 30 81 90  30 0e 06 03 55 1d 0f 01  |.....0..0...U...|
-00000190  01 ff 04 04 03 02 05 a0  30 1d 06 03 55 1d 25 04  |........0...U.%.|
-000001a0  16 30 14 06 08 2b 06 01  05 05 07 03 01 06 08 2b  |.0...+.........+|
-000001b0  06 01 05 05 07 03 02 30  0c 06 03 55 1d 13 01 01  |.......0...U....|
-000001c0  ff 04 02 30 00 30 19 06  03 55 1d 0e 04 12 04 10  |...0.0...U......|
-000001d0  9f 91 16 1f 43 43 3e 49  a6 de 6d b6 80 d7 9f 60  |....CC>I..m....`|
-000001e0  30 1b 06 03 55 1d 23 04  14 30 12 80 10 48 13 49  |0...U.#..0...H.I|
-000001f0  4d 13 7e 16 31 bb a3 01  d5 ac ab 6e 7b 30 19 06  |M.~.1......n{0..|
-00000200  03 55 1d 11 04 12 30 10  82 0e 65 78 61 6d 70 6c  |.U....0...exampl|
-00000210  65 2e 67 6f 6c 61 6e 67  30 0d 06 09 2a 86 48 86  |e.golang0...*.H.|
-00000220  f7 0d 01 01 0b 05 00 03  81 81 00 9d 30 cc 40 2b  |............0.@+|
-00000230  5b 50 a0 61 cb ba e5 53  58 e1 ed 83 28 a9 58 1a  |[P.a...SX...(.X.|
-00000240  a9 38 a4 95 a1 ac 31 5a  1a 84 66 3d 43 d3 2d d9  |.8....1Z..f=C.-.|
-00000250  0b f2 97 df d3 20 64 38  92 24 3a 00 bc cf 9c 7d  |..... d8.$:....}|
-00000260  b7 40 20 01 5f aa d3 16  61 09 a2 76 fd 13 c3 cc  |.@ ._...a..v....|
-00000270  e1 0c 5c ee b1 87 82 f1  6c 04 ed 73 bb b3 43 77  |..\.....l..s..Cw|
-00000280  8d 0c 1c f1 0f a1 d8 40  83 61 c9 4c 72 2b 9d ae  |.......@.a.Lr+..|
-00000290  db 46 06 06 4d f4 c1 b3  3e c0 d1 bd 42 d4 db fe  |.F..M...>...B...|
-000002a0  3d 13 60 84 5c 21 d3 3b  e9 fa e7 16 03 03 00 ac  |=.`.\!.;........|
-000002b0  0c 00 00 a8 03 00 1d 20  2f e5 7d a3 47 cd 62 43  |....... /.}.G.bC|
-000002c0  15 28 da ac 5f bb 29 07  30 ff f6 84 af c4 cf c2  |.(.._.).0.......|
-000002d0  ed 90 99 5f 58 cb 3b 74  08 04 00 80 3b cd 7a 99  |..._X.;t....;.z.|
-000002e0  3f bf 03 5a 26 21 90 db  b4 8d 3b 69 14 82 1c ae  |?..Z&!....;i....|
-000002f0  7d 72 8f 4e eb ff c4 f0  13 fa 6f 69 48 e7 6d 3d  |}r.N......oiH.m=|
-00000300  fc b3 1c 54 60 54 cf 83  48 1d a3 50 55 28 3f 2c  |...T`T..H..PU(?,|
-00000310  db d3 dc c7 d9 58 74 de  eb 5e 21 26 2f 32 c6 b2  |.....Xt..^!&/2..|
-00000320  be 1b 08 fa d6 9f 3b b0  2b e8 c2 36 2f 9d c1 35  |......;.+..6/..5|
-00000330  c1 54 4b 37 5f ff 99 4f  c1 e4 ad 69 a0 c8 52 d3  |.TK7_..O...i..R.|
-00000340  01 23 0d 57 17 08 7c 07  9a 3a 6d c8 87 5d 7e 09  |.#.W..|..:m..]~.|
-00000350  7b 03 f9 5e de 83 4d 13  89 08 72 96 16 03 03 00  |{..^..M...r.....|
-00000360  04 0e 00 00 00                                    |.....|
+00000030  20 00 23 00 00 ff 01 00  01 00 00 17 00 00 00 10  | .#.............|
+00000040  00 09 00 07 06 70 72 6f  74 6f 31 00 0b 00 02 01  |.....proto1.....|
+00000050  00 16 03 03 02 59 0b 00  02 55 00 02 52 00 02 4f  |.....Y...U..R..O|
+00000060  30 82 02 4b 30 82 01 b4  a0 03 02 01 02 02 09 00  |0..K0...........|
+00000070  e8 f0 9d 3f e2 5b ea a6  30 0d 06 09 2a 86 48 86  |...?.[..0...*.H.|
+00000080  f7 0d 01 01 0b 05 00 30  1f 31 0b 30 09 06 03 55  |.......0.1.0...U|
+00000090  04 0a 13 02 47 6f 31 10  30 0e 06 03 55 04 03 13  |....Go1.0...U...|
+000000a0  07 47 6f 20 52 6f 6f 74  30 1e 17 0d 31 36 30 31  |.Go Root0...1601|
+000000b0  30 31 30 30 30 30 30 30  5a 17 0d 32 35 30 31 30  |01000000Z..25010|
+000000c0  31 30 30 30 30 30 30 5a  30 1a 31 0b 30 09 06 03  |1000000Z0.1.0...|
+000000d0  55 04 0a 13 02 47 6f 31  0b 30 09 06 03 55 04 03  |U....Go1.0...U..|
+000000e0  13 02 47 6f 30 81 9f 30  0d 06 09 2a 86 48 86 f7  |..Go0..0...*.H..|
+000000f0  0d 01 01 01 05 00 03 81  8d 00 30 81 89 02 81 81  |..........0.....|
+00000100  00 db 46 7d 93 2e 12 27  06 48 bc 06 28 21 ab 7e  |..F}...'.H..(!.~|
+00000110  c4 b6 a2 5d fe 1e 52 45  88 7a 36 47 a5 08 0d 92  |...]..RE.z6G....|
+00000120  42 5b c2 81 c0 be 97 79  98 40 fb 4f 6d 14 fd 2b  |B[.....y.@.Om..+|
+00000130  13 8b c2 a5 2e 67 d8 d4  09 9e d6 22 38 b7 4a 0b  |.....g....."8.J.|
+00000140  74 73 2b c2 34 f1 d1 93  e5 96 d9 74 7b f3 58 9f  |ts+.4......t{.X.|
+00000150  6c 61 3c c0 b0 41 d4 d9  2b 2b 24 23 77 5b 1c 3b  |la<..A..++$#w[.;|
+00000160  bd 75 5d ce 20 54 cf a1  63 87 1d 1e 24 c4 f3 1d  |.u]. T..c...$...|
+00000170  1a 50 8b aa b6 14 43 ed  97 a7 75 62 f4 14 c8 52  |.P....C...ub...R|
+00000180  d7 02 03 01 00 01 a3 81  93 30 81 90 30 0e 06 03  |.........0..0...|
+00000190  55 1d 0f 01 01 ff 04 04  03 02 05 a0 30 1d 06 03  |U...........0...|
+000001a0  55 1d 25 04 16 30 14 06  08 2b 06 01 05 05 07 03  |U.%..0...+......|
+000001b0  01 06 08 2b 06 01 05 05  07 03 02 30 0c 06 03 55  |...+.......0...U|
+000001c0  1d 13 01 01 ff 04 02 30  00 30 19 06 03 55 1d 0e  |.......0.0...U..|
+000001d0  04 12 04 10 9f 91 16 1f  43 43 3e 49 a6 de 6d b6  |........CC>I..m.|
+000001e0  80 d7 9f 60 30 1b 06 03  55 1d 23 04 14 30 12 80  |...`0...U.#..0..|
+000001f0  10 48 13 49 4d 13 7e 16  31 bb a3 01 d5 ac ab 6e  |.H.IM.~.1......n|
+00000200  7b 30 19 06 03 55 1d 11  04 12 30 10 82 0e 65 78  |{0...U....0...ex|
+00000210  61 6d 70 6c 65 2e 67 6f  6c 61 6e 67 30 0d 06 09  |ample.golang0...|
+00000220  2a 86 48 86 f7 0d 01 01  0b 05 00 03 81 81 00 9d  |*.H.............|
+00000230  30 cc 40 2b 5b 50 a0 61  cb ba e5 53 58 e1 ed 83  |0.@+[P.a...SX...|
+00000240  28 a9 58 1a a9 38 a4 95  a1 ac 31 5a 1a 84 66 3d  |(.X..8....1Z..f=|
+00000250  43 d3 2d d9 0b f2 97 df  d3 20 64 38 92 24 3a 00  |C.-...... d8.$:.|
+00000260  bc cf 9c 7d b7 40 20 01  5f aa d3 16 61 09 a2 76  |...}.@ ._...a..v|
+00000270  fd 13 c3 cc e1 0c 5c ee  b1 87 82 f1 6c 04 ed 73  |......\.....l..s|
+00000280  bb b3 43 77 8d 0c 1c f1  0f a1 d8 40 83 61 c9 4c  |..Cw.......@.a.L|
+00000290  72 2b 9d ae db 46 06 06  4d f4 c1 b3 3e c0 d1 bd  |r+...F..M...>...|
+000002a0  42 d4 db fe 3d 13 60 84  5c 21 d3 3b e9 fa e7 16  |B...=.`.\!.;....|
+000002b0  03 03 00 ac 0c 00 00 a8  03 00 1d 20 2f e5 7d a3  |........... /.}.|
+000002c0  47 cd 62 43 15 28 da ac  5f bb 29 07 30 ff f6 84  |G.bC.(.._.).0...|
+000002d0  af c4 cf c2 ed 90 99 5f  58 cb 3b 74 08 04 00 80  |......._X.;t....|
+000002e0  2a 3d 85 27 96 fe 41 e2  5a cc 39 dd 8a 8e 64 73  |*=.'..A.Z.9...ds|
+000002f0  ef 98 04 5c ac d2 8f 5e  55 b8 37 da 10 68 33 b8  |...\...^U.7..h3.|
+00000300  63 83 e1 c9 9a e6 3a e9  c9 20 cc 57 58 e2 ba bc  |c.....:.. .WX...|
+00000310  e3 ac ab aa 08 e2 1e 6f  66 90 d7 66 c5 73 60 0d  |.......of..f.s`.|
+00000320  19 4f eb 99 9d d1 b1 91  36 80 b9 20 aa f5 d9 c8  |.O......6.. ....|
+00000330  44 a7 99 c9 a6 4d 2c ff  ca 4d 84 f2 a5 bf 02 c5  |D....M,..M......|
+00000340  61 77 7e 4a e6 7c dd bf  48 fc a6 53 fb c4 d3 dd  |aw~J.|..H..S....|
+00000350  e6 20 b9 74 90 82 4a 3a  73 0a 81 74 07 a3 23 fe  |. .t..J:s..t..#.|
+00000360  16 03 03 00 04 0e 00 00  00                       |.........|
 >>> Flow 3 (client to server)
-00000000  16 03 03 00 25 10 00 00  21 20 fb eb 44 09 0e 62  |....%...! ..D..b|
-00000010  b0 ce d8 1f c5 f9 46 31  1e 1d e8 fb 02 5f 34 3b  |......F1....._4;|
-00000020  c1 6f 9a 38 6a 46 d2 cd  a0 53 14 03 03 00 01 01  |.o.8jF...S......|
-00000030  16 03 03 00 20 88 73 90  39 bc 9b 02 e4 c0 35 f0  |.... .s.9.....5.|
-00000040  ef 40 b0 08 ca b9 bd 25  6b cd 03 7d ec 58 73 65  |.@.....%k..}.Xse|
-00000050  d5 89 f2 f1 70                                    |....p|
+00000000  16 03 03 00 25 10 00 00  21 20 d1 bb f1 17 6c 41  |....%...! ....lA|
+00000010  8f 14 84 d2 98 99 30 0c  8a 00 4c 39 37 15 f5 be  |......0...L97...|
+00000020  81 8d 08 e0 11 c1 f7 65  43 0b 14 03 03 00 01 01  |.......eC.......|
+00000030  16 03 03 00 20 ab 15 bb  47 30 42 c9 7d 45 f8 5d  |.... ...G0B.}E.]|
+00000040  21 79 3b 4d 5e a9 99 f5  7d f3 4e 7e ba b9 9b 30  |!y;M^...}.N~...0|
+00000050  b6 14 4d ba f9                                    |..M..|
 >>> Flow 4 (server to client)
-00000000  16 03 03 00 8b 04 00 00  87 00 00 00 00 00 81 50  |...............P|
-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 e0 18 83 51 ed 14 ef  68 ca 42 c5 4c cd 0b 21  |o...Q...h.B.L..!|
-00000040  a5 29 ef 62 07 a5 11 b9  1f 4e 54 c3 66 4c 1e d3  |.).b.....NT.fL..|
-00000050  1a 00 52 34 67 2b af 73  02 5f c9 6c 7c 6e ba f2  |..R4g+.s._.l|n..|
-00000060  e6 38 bd 23 97 3f 80 6a  3b 8e bb 98 29 49 38 16  |.8.#.?.j;...)I8.|
-00000070  77 74 2a a1 c7 36 80 de  c9 91 cd b2 7d bc 6c 64  |wt*..6......}.ld|
-00000080  6c 06 57 22 d1 f2 51 5f  84 ad 30 85 3a c0 4f e7  |l.W"..Q_..0.:.O.|
-00000090  14 03 03 00 01 01 16 03  03 00 20 32 71 5a d3 94  |.......... 2qZ..|
-000000a0  d5 17 e4 8c 3a 78 d1 48  4e 1b f5 83 36 f1 5a 38  |....:x.HN...6.Z8|
-000000b0  e4 b5 6d ab 46 89 e0 24  74 87 80 17 03 03 00 1d  |..m.F..$t.......|
-000000c0  69 4c a6 24 67 79 18 59  92 4f 9a d0 2d 1d 57 e0  |iL.$gy.Y.O..-.W.|
-000000d0  ec 0c 00 25 6f 2f 3a be  8a aa 80 94 ac 15 03 03  |...%o/:.........|
-000000e0  00 12 ef 86 3e 93 42 bb  72 f1 1b 90 df 9a d3 ed  |....>.B.r.......|
-000000f0  d8 74 35 23                                       |.t5#|
+00000000  16 03 03 00 83 04 00 00  7f 00 00 00 00 00 79 00  |..............y.|
+00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 94  |................|
+00000020  6f 2d 7c 2b 51 ed 14 ef  68 ca 42 c5 4c f3 5c b9  |o-|+Q...h.B.L.\.|
+00000030  84 7d 30 9e 2f 9d 4d 0e  59 b4 28 fd 17 10 cd 1e  |.}0./.M.Y.(.....|
+00000040  1c d3 2c 5e d9 dc db 26  d0 b9 00 4b 0a 13 54 90  |..,^...&...K..T.|
+00000050  f2 7b 68 75 6b 00 34 66  9e 43 29 06 16 49 38 16  |.{huk.4f.C)..I8.|
+00000060  7e 51 5c e5 15 c0 58 7d  52 0b 16 21 d8 2c e8 c8  |~Q\...X}R..!.,..|
+00000070  8e 3a f6 aa fa 21 45 4a  17 02 67 7d 93 1c 95 88  |.:...!EJ..g}....|
+00000080  36 a5 19 53 74 74 81 e1  14 03 03 00 01 01 16 03  |6..Stt..........|
+00000090  03 00 20 3d 66 04 37 0c  40 cc 20 2c 1c 16 ba 05  |.. =f.7.@. ,....|
+000000a0  d6 7b 40 04 27 40 6f cc  d7 af 68 fb 32 49 6c 4f  |.{@.'@o...h.2IlO|
+000000b0  f3 01 bf 17 03 03 00 1d  99 10 78 bc fa 7e 8a 86  |..........x..~..|
+000000c0  4c b8 e4 7c e2 79 70 eb  ad 33 44 e1 ab 7a c9 ae  |L..|.yp..3D..z..|
+000000d0  47 fe 39 50 d1 15 03 03  00 12 9e 9a be b0 55 c3  |G.9P..........U.|
+000000e0  3a 5f 5c e0 4b 8f 4f 81  52 d3 89 09              |:_\.K.O.R...|
diff --git a/src/crypto/tls/testdata/Server-TLSv12-ALPN-Fallback b/src/crypto/tls/testdata/Server-TLSv12-ALPN-Fallback
index 4fadf39..0702012 100644
--- a/src/crypto/tls/testdata/Server-TLSv12-ALPN-Fallback
+++ b/src/crypto/tls/testdata/Server-TLSv12-ALPN-Fallback
@@ -1,7 +1,7 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 a6 01 00 00  a2 03 03 b5 c9 ab 32 7f  |..............2.|
-00000010  e1 af 3f f2 ac 2a 11 dd  33 f9 b5 21 88 0d e4 29  |..?..*..3..!...)|
-00000020  e2 47 49 dc c7 31 a8 a5  25 81 0c 00 00 04 cc a8  |.GI..1..%.......|
+00000000  16 03 01 00 a6 01 00 00  a2 03 03 ea e2 1b 90 0e  |................|
+00000010  91 d5 9f b2 c6 ee 72 37  19 f5 14 cd ca a9 ca 03  |......r7........|
+00000020  98 c4 2e d4 85 05 4a a5  02 e1 4b 00 00 04 cc a8  |......J...K.....|
 00000030  00 ff 01 00 00 75 00 0b  00 04 03 00 01 02 00 0a  |.....u..........|
 00000040  00 0c 00 0a 00 1d 00 17  00 1e 00 19 00 18 00 23  |...............#|
 00000050  00 00 00 10 00 19 00 17  06 70 72 6f 74 6f 33 08  |.........proto3.|
@@ -11,81 +11,80 @@
 00000090  05 08 06 04 01 05 01 06  01 03 03 02 03 03 01 02  |................|
 000000a0  01 03 02 02 02 04 02 05  02 06 02                 |...........|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 3b 02 00 00  37 03 03 00 00 00 00 00  |....;...7.......|
+00000000  16 03 03 00 3f 02 00 00  3b 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 44 4f 57 4e 47  52 44 01 00 cc a8 00 00  |...DOWNGRD......|
-00000030  0f 00 23 00 00 ff 01 00  01 00 00 0b 00 02 01 00  |..#.............|
-00000040  16 03 03 02 59 0b 00 02  55 00 02 52 00 02 4f 30  |....Y...U..R..O0|
-00000050  82 02 4b 30 82 01 b4 a0  03 02 01 02 02 09 00 e8  |..K0............|
-00000060  f0 9d 3f e2 5b ea a6 30  0d 06 09 2a 86 48 86 f7  |..?.[..0...*.H..|
-00000070  0d 01 01 0b 05 00 30 1f  31 0b 30 09 06 03 55 04  |......0.1.0...U.|
-00000080  0a 13 02 47 6f 31 10 30  0e 06 03 55 04 03 13 07  |...Go1.0...U....|
-00000090  47 6f 20 52 6f 6f 74 30  1e 17 0d 31 36 30 31 30  |Go Root0...16010|
-000000a0  31 30 30 30 30 30 30 5a  17 0d 32 35 30 31 30 31  |1000000Z..250101|
-000000b0  30 30 30 30 30 30 5a 30  1a 31 0b 30 09 06 03 55  |000000Z0.1.0...U|
-000000c0  04 0a 13 02 47 6f 31 0b  30 09 06 03 55 04 03 13  |....Go1.0...U...|
-000000d0  02 47 6f 30 81 9f 30 0d  06 09 2a 86 48 86 f7 0d  |.Go0..0...*.H...|
-000000e0  01 01 01 05 00 03 81 8d  00 30 81 89 02 81 81 00  |.........0......|
-000000f0  db 46 7d 93 2e 12 27 06  48 bc 06 28 21 ab 7e c4  |.F}...'.H..(!.~.|
-00000100  b6 a2 5d fe 1e 52 45 88  7a 36 47 a5 08 0d 92 42  |..]..RE.z6G....B|
-00000110  5b c2 81 c0 be 97 79 98  40 fb 4f 6d 14 fd 2b 13  |[.....y.@.Om..+.|
-00000120  8b c2 a5 2e 67 d8 d4 09  9e d6 22 38 b7 4a 0b 74  |....g....."8.J.t|
-00000130  73 2b c2 34 f1 d1 93 e5  96 d9 74 7b f3 58 9f 6c  |s+.4......t{.X.l|
-00000140  61 3c c0 b0 41 d4 d9 2b  2b 24 23 77 5b 1c 3b bd  |a<..A..++$#w[.;.|
-00000150  75 5d ce 20 54 cf a1 63  87 1d 1e 24 c4 f3 1d 1a  |u]. T..c...$....|
-00000160  50 8b aa b6 14 43 ed 97  a7 75 62 f4 14 c8 52 d7  |P....C...ub...R.|
-00000170  02 03 01 00 01 a3 81 93  30 81 90 30 0e 06 03 55  |........0..0...U|
-00000180  1d 0f 01 01 ff 04 04 03  02 05 a0 30 1d 06 03 55  |...........0...U|
-00000190  1d 25 04 16 30 14 06 08  2b 06 01 05 05 07 03 01  |.%..0...+.......|
-000001a0  06 08 2b 06 01 05 05 07  03 02 30 0c 06 03 55 1d  |..+.......0...U.|
-000001b0  13 01 01 ff 04 02 30 00  30 19 06 03 55 1d 0e 04  |......0.0...U...|
-000001c0  12 04 10 9f 91 16 1f 43  43 3e 49 a6 de 6d b6 80  |.......CC>I..m..|
-000001d0  d7 9f 60 30 1b 06 03 55  1d 23 04 14 30 12 80 10  |..`0...U.#..0...|
-000001e0  48 13 49 4d 13 7e 16 31  bb a3 01 d5 ac ab 6e 7b  |H.IM.~.1......n{|
-000001f0  30 19 06 03 55 1d 11 04  12 30 10 82 0e 65 78 61  |0...U....0...exa|
-00000200  6d 70 6c 65 2e 67 6f 6c  61 6e 67 30 0d 06 09 2a  |mple.golang0...*|
-00000210  86 48 86 f7 0d 01 01 0b  05 00 03 81 81 00 9d 30  |.H.............0|
-00000220  cc 40 2b 5b 50 a0 61 cb  ba e5 53 58 e1 ed 83 28  |.@+[P.a...SX...(|
-00000230  a9 58 1a a9 38 a4 95 a1  ac 31 5a 1a 84 66 3d 43  |.X..8....1Z..f=C|
-00000240  d3 2d d9 0b f2 97 df d3  20 64 38 92 24 3a 00 bc  |.-...... d8.$:..|
-00000250  cf 9c 7d b7 40 20 01 5f  aa d3 16 61 09 a2 76 fd  |..}.@ ._...a..v.|
-00000260  13 c3 cc e1 0c 5c ee b1  87 82 f1 6c 04 ed 73 bb  |.....\.....l..s.|
-00000270  b3 43 77 8d 0c 1c f1 0f  a1 d8 40 83 61 c9 4c 72  |.Cw.......@.a.Lr|
-00000280  2b 9d ae db 46 06 06 4d  f4 c1 b3 3e c0 d1 bd 42  |+...F..M...>...B|
-00000290  d4 db fe 3d 13 60 84 5c  21 d3 3b e9 fa e7 16 03  |...=.`.\!.;.....|
-000002a0  03 00 ac 0c 00 00 a8 03  00 1d 20 2f e5 7d a3 47  |.......... /.}.G|
-000002b0  cd 62 43 15 28 da ac 5f  bb 29 07 30 ff f6 84 af  |.bC.(.._.).0....|
-000002c0  c4 cf c2 ed 90 99 5f 58  cb 3b 74 08 04 00 80 5f  |......_X.;t...._|
-000002d0  37 27 84 58 1e ea 1e 40  1b de a9 8f 04 d4 94 64  |7'.X...@.......d|
-000002e0  4e 27 c7 f1 b3 30 d0 53  f5 3d 57 50 d2 17 97 c8  |N'...0.S.=WP....|
-000002f0  3d 61 af a6 21 ab 1c 34  47 70 f8 b1 3b 9c 06 86  |=a..!..4Gp..;...|
-00000300  87 00 e2 13 50 83 91 ad  bc 84 bd b4 7b f3 4b ed  |....P.......{.K.|
-00000310  ca 81 0c 94 37 a8 ec 67  ca 9c f3 00 f6 af c2 92  |....7..g........|
-00000320  c4 8c 78 07 18 0e 43 24  1b 98 16 50 5c 2b 75 0e  |..x...C$...P\+u.|
-00000330  40 66 dc 40 cd 10 1a 51  25 f3 96 25 1a 3e 70 af  |@f.@...Q%..%.>p.|
-00000340  16 24 d0 1c 0e 33 f9 c1  74 cf b7 e2 28 ac 60 16  |.$...3..t...(.`.|
-00000350  03 03 00 04 0e 00 00 00                           |........|
+00000030  13 00 23 00 00 ff 01 00  01 00 00 17 00 00 00 0b  |..#.............|
+00000040  00 02 01 00 16 03 03 02  59 0b 00 02 55 00 02 52  |........Y...U..R|
+00000050  00 02 4f 30 82 02 4b 30  82 01 b4 a0 03 02 01 02  |..O0..K0........|
+00000060  02 09 00 e8 f0 9d 3f e2  5b ea a6 30 0d 06 09 2a  |......?.[..0...*|
+00000070  86 48 86 f7 0d 01 01 0b  05 00 30 1f 31 0b 30 09  |.H........0.1.0.|
+00000080  06 03 55 04 0a 13 02 47  6f 31 10 30 0e 06 03 55  |..U....Go1.0...U|
+00000090  04 03 13 07 47 6f 20 52  6f 6f 74 30 1e 17 0d 31  |....Go Root0...1|
+000000a0  36 30 31 30 31 30 30 30  30 30 30 5a 17 0d 32 35  |60101000000Z..25|
+000000b0  30 31 30 31 30 30 30 30  30 30 5a 30 1a 31 0b 30  |0101000000Z0.1.0|
+000000c0  09 06 03 55 04 0a 13 02  47 6f 31 0b 30 09 06 03  |...U....Go1.0...|
+000000d0  55 04 03 13 02 47 6f 30  81 9f 30 0d 06 09 2a 86  |U....Go0..0...*.|
+000000e0  48 86 f7 0d 01 01 01 05  00 03 81 8d 00 30 81 89  |H............0..|
+000000f0  02 81 81 00 db 46 7d 93  2e 12 27 06 48 bc 06 28  |.....F}...'.H..(|
+00000100  21 ab 7e c4 b6 a2 5d fe  1e 52 45 88 7a 36 47 a5  |!.~...]..RE.z6G.|
+00000110  08 0d 92 42 5b c2 81 c0  be 97 79 98 40 fb 4f 6d  |...B[.....y.@.Om|
+00000120  14 fd 2b 13 8b c2 a5 2e  67 d8 d4 09 9e d6 22 38  |..+.....g....."8|
+00000130  b7 4a 0b 74 73 2b c2 34  f1 d1 93 e5 96 d9 74 7b  |.J.ts+.4......t{|
+00000140  f3 58 9f 6c 61 3c c0 b0  41 d4 d9 2b 2b 24 23 77  |.X.la<..A..++$#w|
+00000150  5b 1c 3b bd 75 5d ce 20  54 cf a1 63 87 1d 1e 24  |[.;.u]. T..c...$|
+00000160  c4 f3 1d 1a 50 8b aa b6  14 43 ed 97 a7 75 62 f4  |....P....C...ub.|
+00000170  14 c8 52 d7 02 03 01 00  01 a3 81 93 30 81 90 30  |..R.........0..0|
+00000180  0e 06 03 55 1d 0f 01 01  ff 04 04 03 02 05 a0 30  |...U...........0|
+00000190  1d 06 03 55 1d 25 04 16  30 14 06 08 2b 06 01 05  |...U.%..0...+...|
+000001a0  05 07 03 01 06 08 2b 06  01 05 05 07 03 02 30 0c  |......+.......0.|
+000001b0  06 03 55 1d 13 01 01 ff  04 02 30 00 30 19 06 03  |..U.......0.0...|
+000001c0  55 1d 0e 04 12 04 10 9f  91 16 1f 43 43 3e 49 a6  |U..........CC>I.|
+000001d0  de 6d b6 80 d7 9f 60 30  1b 06 03 55 1d 23 04 14  |.m....`0...U.#..|
+000001e0  30 12 80 10 48 13 49 4d  13 7e 16 31 bb a3 01 d5  |0...H.IM.~.1....|
+000001f0  ac ab 6e 7b 30 19 06 03  55 1d 11 04 12 30 10 82  |..n{0...U....0..|
+00000200  0e 65 78 61 6d 70 6c 65  2e 67 6f 6c 61 6e 67 30  |.example.golang0|
+00000210  0d 06 09 2a 86 48 86 f7  0d 01 01 0b 05 00 03 81  |...*.H..........|
+00000220  81 00 9d 30 cc 40 2b 5b  50 a0 61 cb ba e5 53 58  |...0.@+[P.a...SX|
+00000230  e1 ed 83 28 a9 58 1a a9  38 a4 95 a1 ac 31 5a 1a  |...(.X..8....1Z.|
+00000240  84 66 3d 43 d3 2d d9 0b  f2 97 df d3 20 64 38 92  |.f=C.-...... d8.|
+00000250  24 3a 00 bc cf 9c 7d b7  40 20 01 5f aa d3 16 61  |$:....}.@ ._...a|
+00000260  09 a2 76 fd 13 c3 cc e1  0c 5c ee b1 87 82 f1 6c  |..v......\.....l|
+00000270  04 ed 73 bb b3 43 77 8d  0c 1c f1 0f a1 d8 40 83  |..s..Cw.......@.|
+00000280  61 c9 4c 72 2b 9d ae db  46 06 06 4d f4 c1 b3 3e  |a.Lr+...F..M...>|
+00000290  c0 d1 bd 42 d4 db fe 3d  13 60 84 5c 21 d3 3b e9  |...B...=.`.\!.;.|
+000002a0  fa e7 16 03 03 00 ac 0c  00 00 a8 03 00 1d 20 2f  |.............. /|
+000002b0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
+000002c0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74 08  |.........._X.;t.|
+000002d0  04 00 80 85 e9 a6 5c 79  bc db ed 97 fb 30 ca fd  |......\y.....0..|
+000002e0  32 13 19 3f da 6f fd c1  11 74 fe e9 6f 60 ec 7e  |2..?.o...t..o`.~|
+000002f0  48 7e 17 33 9b 8d 2a c2  82 e0 18 38 f3 0f 20 27  |H~.3..*....8.. '|
+00000300  81 0f c9 47 bf 5f 2b 2f  65 1c 6b e3 b7 72 85 46  |...G._+/e.k..r.F|
+00000310  5c 15 dc fd e6 be cf 50  51 62 f5 d9 17 e2 e8 bf  |\......PQb......|
+00000320  08 7f 37 71 91 88 83 7f  e3 90 66 66 c4 d8 60 25  |..7q......ff..`%|
+00000330  53 f7 9f 44 20 89 48 ff  c2 3b 6d 21 e5 8c dc e5  |S..D .H..;m!....|
+00000340  42 ea d8 14 93 96 2f 53  24 66 e7 bb e7 2c 1f 92  |B...../S$f...,..|
+00000350  90 80 23 16 03 03 00 04  0e 00 00 00              |..#.........|
 >>> Flow 3 (client to server)
-00000000  16 03 03 00 25 10 00 00  21 20 30 f2 bb f7 a7 ac  |....%...! 0.....|
-00000010  23 20 22 ee 73 0d 49 9c  b3 7b c1 9a db 2c 85 f3  |# ".s.I..{...,..|
-00000020  c0 82 31 60 bd 8b 14 4e  73 43 14 03 03 00 01 01  |..1`...NsC......|
-00000030  16 03 03 00 20 09 8d c7  86 ee cc f4 c7 36 a3 49  |.... ........6.I|
-00000040  d3 f7 a1 4a 68 a2 1e b4  fc cc a2 15 cb 01 92 d8  |...Jh...........|
-00000050  72 b0 d1 6f eb                                    |r..o.|
+00000000  16 03 03 00 25 10 00 00  21 20 e8 d1 46 5e 70 b5  |....%...! ..F^p.|
+00000010  34 1c 6f cd be f0 86 24  2a d6 55 ae 97 de 52 0c  |4.o....$*.U...R.|
+00000020  67 10 a0 02 ed ae f8 47  aa 52 14 03 03 00 01 01  |g......G.R......|
+00000030  16 03 03 00 20 52 cf 5d  07 bb bc e8 86 d4 f4 3e  |.... R.].......>|
+00000040  49 51 a7 1d f5 df 10 c4  5a 77 37 ba 68 3d 4e c5  |IQ......Zw7.h=N.|
+00000050  11 ac 67 b7 e2                                    |..g..|
 >>> Flow 4 (server to client)
-00000000  16 03 03 00 8b 04 00 00  87 00 00 00 00 00 81 50  |...............P|
-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 e0 18 83 51 ed 14 ef  68 ca 42 c5 4c a2 ac 05  |o...Q...h.B.L...|
-00000040  9c 69 69 99 08 9f de a4  d4 e7 37 ab 14 38 4c 47  |.ii.......7..8LG|
-00000050  70 f0 97 1d db 2d 0a 14  c2 1e f0 16 9f 6d 37 02  |p....-.......m7.|
-00000060  4b f1 16 be 98 3f df 74  83 7c 19 85 61 49 38 16  |K....?.t.|..aI8.|
-00000070  ee 35 7a e2 3f 74 fe 8d  e3 07 93 a1 5e fa f2 02  |.5z.?t......^...|
-00000080  e5 c8 60 3f 11 83 8b 0e  32 52 f1 aa 52 b7 0a 89  |..`?....2R..R...|
-00000090  14 03 03 00 01 01 16 03  03 00 20 9e 65 15 cf 45  |.......... .e..E|
-000000a0  a5 03 69 c9 b1 d8 9e 92  a3 a2 b0 df 2e 62 b1 3a  |..i..........b.:|
-000000b0  17 78 cd e5 1d f3 51 42  7e 4e 25 17 03 03 00 1d  |.x....QB~N%.....|
-000000c0  d9 ae d0 fa b7 90 a9 2f  28 8d 1d 6f 54 1f c0 1e  |......./(..oT...|
-000000d0  4d ae b6 91 f0 e8 84 cf  86 11 22 25 ea 15 03 03  |M........."%....|
-000000e0  00 12 0e 71 f2 11 9e 9f  58 ad c0 d8 fc fa 34 bc  |...q....X.....4.|
-000000f0  02 5a 60 00                                       |.Z`.|
+00000000  16 03 03 00 83 04 00 00  7f 00 00 00 00 00 79 00  |..............y.|
+00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 94  |................|
+00000020  6f 2d 7c 2b 51 ed 14 ef  68 ca 42 c5 4c 26 1d 23  |o-|+Q...h.B.L&.#|
+00000030  c4 90 54 85 8b 21 f5 0d  e8 48 f2 5f 4e 6b f1 25  |..T..!...H._Nk.%|
+00000040  e8 46 8a e5 3c 09 57 df  dd 37 a7 57 c5 a5 28 5a  |.F..<.W..7.W..(Z|
+00000050  21 83 2a 98 4b a5 44 aa  5b cc 30 e9 62 49 38 16  |!.*.K.D.[.0.bI8.|
+00000060  7e 51 5c e5 15 c0 58 7d  a4 aa c5 93 39 bb e2 b6  |~Q\...X}....9...|
+00000070  4f c4 3e 1e 03 dc 46 b1  f3 0d d2 61 6c 1e c5 e1  |O.>...F....al...|
+00000080  8f 18 2a 3c 85 83 c4 33  14 03 03 00 01 01 16 03  |..*<...3........|
+00000090  03 00 20 63 76 4f b3 77  4d 63 6c eb 73 f3 b2 ec  |.. cvO.wMcl.s...|
+000000a0  b8 49 3e c5 81 d5 53 0c  96 77 2f 3f 52 d0 e1 5b  |.I>...S..w/?R..[|
+000000b0  62 fa 0b 17 03 03 00 1d  2f 60 09 31 db e9 c5 23  |b......./`.1...#|
+000000c0  98 5c 46 23 a6 58 80 66  7d 50 84 f1 42 b8 65 65  |.\F#.X.f}P..B.ee|
+000000d0  77 2d d2 e4 be 15 03 03  00 12 b7 e8 e1 13 04 68  |w-.............h|
+000000e0  d5 21 c8 98 db 1b 1c 6e  4f b5 0b 9c              |.!.....nO...|
diff --git a/src/crypto/tls/testdata/Server-TLSv12-ALPN-NotConfigured b/src/crypto/tls/testdata/Server-TLSv12-ALPN-NotConfigured
index e1c991b..79f0748 100644
--- a/src/crypto/tls/testdata/Server-TLSv12-ALPN-NotConfigured
+++ b/src/crypto/tls/testdata/Server-TLSv12-ALPN-NotConfigured
@@ -1,7 +1,7 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 9d 01 00 00  99 03 03 92 d8 d4 4f 2e  |..............O.|
-00000010  82 ad e9 4f a2 c3 f7 23  da 2e dc 23 c0 87 fc 33  |...O...#...#...3|
-00000020  14 63 f1 da 98 a8 af 70  3a 7e f3 00 00 04 cc a8  |.c.....p:~......|
+00000000  16 03 01 00 9d 01 00 00  99 03 03 19 26 ad 3f c0  |............&.?.|
+00000010  d6 a0 cc ac 9b 2a 91 d3  1a d5 96 78 5f 7c 3f e0  |.....*.....x_|?.|
+00000020  23 08 75 a1 ca cb aa da  d7 c8 0b 00 00 04 cc a8  |#.u.............|
 00000030  00 ff 01 00 00 6c 00 0b  00 04 03 00 01 02 00 0a  |.....l..........|
 00000040  00 0c 00 0a 00 1d 00 17  00 1e 00 19 00 18 00 23  |...............#|
 00000050  00 00 00 10 00 10 00 0e  06 70 72 6f 74 6f 32 06  |.........proto2.|
@@ -11,81 +11,80 @@
 00000090  03 03 02 03 03 01 02 01  03 02 02 02 04 02 05 02  |................|
 000000a0  06 02                                             |..|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 3b 02 00 00  37 03 03 00 00 00 00 00  |....;...7.......|
+00000000  16 03 03 00 3f 02 00 00  3b 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 44 4f 57 4e 47  52 44 01 00 cc a8 00 00  |...DOWNGRD......|
-00000030  0f 00 23 00 00 ff 01 00  01 00 00 0b 00 02 01 00  |..#.............|
-00000040  16 03 03 02 59 0b 00 02  55 00 02 52 00 02 4f 30  |....Y...U..R..O0|
-00000050  82 02 4b 30 82 01 b4 a0  03 02 01 02 02 09 00 e8  |..K0............|
-00000060  f0 9d 3f e2 5b ea a6 30  0d 06 09 2a 86 48 86 f7  |..?.[..0...*.H..|
-00000070  0d 01 01 0b 05 00 30 1f  31 0b 30 09 06 03 55 04  |......0.1.0...U.|
-00000080  0a 13 02 47 6f 31 10 30  0e 06 03 55 04 03 13 07  |...Go1.0...U....|
-00000090  47 6f 20 52 6f 6f 74 30  1e 17 0d 31 36 30 31 30  |Go Root0...16010|
-000000a0  31 30 30 30 30 30 30 5a  17 0d 32 35 30 31 30 31  |1000000Z..250101|
-000000b0  30 30 30 30 30 30 5a 30  1a 31 0b 30 09 06 03 55  |000000Z0.1.0...U|
-000000c0  04 0a 13 02 47 6f 31 0b  30 09 06 03 55 04 03 13  |....Go1.0...U...|
-000000d0  02 47 6f 30 81 9f 30 0d  06 09 2a 86 48 86 f7 0d  |.Go0..0...*.H...|
-000000e0  01 01 01 05 00 03 81 8d  00 30 81 89 02 81 81 00  |.........0......|
-000000f0  db 46 7d 93 2e 12 27 06  48 bc 06 28 21 ab 7e c4  |.F}...'.H..(!.~.|
-00000100  b6 a2 5d fe 1e 52 45 88  7a 36 47 a5 08 0d 92 42  |..]..RE.z6G....B|
-00000110  5b c2 81 c0 be 97 79 98  40 fb 4f 6d 14 fd 2b 13  |[.....y.@.Om..+.|
-00000120  8b c2 a5 2e 67 d8 d4 09  9e d6 22 38 b7 4a 0b 74  |....g....."8.J.t|
-00000130  73 2b c2 34 f1 d1 93 e5  96 d9 74 7b f3 58 9f 6c  |s+.4......t{.X.l|
-00000140  61 3c c0 b0 41 d4 d9 2b  2b 24 23 77 5b 1c 3b bd  |a<..A..++$#w[.;.|
-00000150  75 5d ce 20 54 cf a1 63  87 1d 1e 24 c4 f3 1d 1a  |u]. T..c...$....|
-00000160  50 8b aa b6 14 43 ed 97  a7 75 62 f4 14 c8 52 d7  |P....C...ub...R.|
-00000170  02 03 01 00 01 a3 81 93  30 81 90 30 0e 06 03 55  |........0..0...U|
-00000180  1d 0f 01 01 ff 04 04 03  02 05 a0 30 1d 06 03 55  |...........0...U|
-00000190  1d 25 04 16 30 14 06 08  2b 06 01 05 05 07 03 01  |.%..0...+.......|
-000001a0  06 08 2b 06 01 05 05 07  03 02 30 0c 06 03 55 1d  |..+.......0...U.|
-000001b0  13 01 01 ff 04 02 30 00  30 19 06 03 55 1d 0e 04  |......0.0...U...|
-000001c0  12 04 10 9f 91 16 1f 43  43 3e 49 a6 de 6d b6 80  |.......CC>I..m..|
-000001d0  d7 9f 60 30 1b 06 03 55  1d 23 04 14 30 12 80 10  |..`0...U.#..0...|
-000001e0  48 13 49 4d 13 7e 16 31  bb a3 01 d5 ac ab 6e 7b  |H.IM.~.1......n{|
-000001f0  30 19 06 03 55 1d 11 04  12 30 10 82 0e 65 78 61  |0...U....0...exa|
-00000200  6d 70 6c 65 2e 67 6f 6c  61 6e 67 30 0d 06 09 2a  |mple.golang0...*|
-00000210  86 48 86 f7 0d 01 01 0b  05 00 03 81 81 00 9d 30  |.H.............0|
-00000220  cc 40 2b 5b 50 a0 61 cb  ba e5 53 58 e1 ed 83 28  |.@+[P.a...SX...(|
-00000230  a9 58 1a a9 38 a4 95 a1  ac 31 5a 1a 84 66 3d 43  |.X..8....1Z..f=C|
-00000240  d3 2d d9 0b f2 97 df d3  20 64 38 92 24 3a 00 bc  |.-...... d8.$:..|
-00000250  cf 9c 7d b7 40 20 01 5f  aa d3 16 61 09 a2 76 fd  |..}.@ ._...a..v.|
-00000260  13 c3 cc e1 0c 5c ee b1  87 82 f1 6c 04 ed 73 bb  |.....\.....l..s.|
-00000270  b3 43 77 8d 0c 1c f1 0f  a1 d8 40 83 61 c9 4c 72  |.Cw.......@.a.Lr|
-00000280  2b 9d ae db 46 06 06 4d  f4 c1 b3 3e c0 d1 bd 42  |+...F..M...>...B|
-00000290  d4 db fe 3d 13 60 84 5c  21 d3 3b e9 fa e7 16 03  |...=.`.\!.;.....|
-000002a0  03 00 ac 0c 00 00 a8 03  00 1d 20 2f e5 7d a3 47  |.......... /.}.G|
-000002b0  cd 62 43 15 28 da ac 5f  bb 29 07 30 ff f6 84 af  |.bC.(.._.).0....|
-000002c0  c4 cf c2 ed 90 99 5f 58  cb 3b 74 08 04 00 80 8c  |......_X.;t.....|
-000002d0  cb 8c f6 6c dd 02 5f c9  13 7e c2 26 26 41 7a 1a  |...l.._..~.&&Az.|
-000002e0  25 c7 3e 22 11 30 32 c0  67 a5 53 32 1e 32 21 cb  |%.>".02.g.S2.2!.|
-000002f0  ff 0a b7 e1 7a 98 26 e9  bf 05 30 f6 13 38 ee 1d  |....z.&...0..8..|
-00000300  90 56 a6 0d e0 65 a8 02  0e 08 3e c0 31 ff dd fa  |.V...e....>.1...|
-00000310  05 3a 22 7c f8 ce 65 43  0c b6 c4 9a e4 ed 22 eb  |.:"|..eC......".|
-00000320  c4 46 b2 3d 1d 9c c1 e7  d4 6a 79 4f cf 8f 1c 45  |.F.=.....jyO...E|
-00000330  52 51 b3 d1 a4 0d 0d df  4e 19 15 e6 af 2e 5a d5  |RQ......N.....Z.|
-00000340  8a 2e 3c 48 8a f7 86 e5  53 0e 35 9a 8a c6 dd 16  |..<H....S.5.....|
-00000350  03 03 00 04 0e 00 00 00                           |........|
+00000030  13 00 23 00 00 ff 01 00  01 00 00 17 00 00 00 0b  |..#.............|
+00000040  00 02 01 00 16 03 03 02  59 0b 00 02 55 00 02 52  |........Y...U..R|
+00000050  00 02 4f 30 82 02 4b 30  82 01 b4 a0 03 02 01 02  |..O0..K0........|
+00000060  02 09 00 e8 f0 9d 3f e2  5b ea a6 30 0d 06 09 2a  |......?.[..0...*|
+00000070  86 48 86 f7 0d 01 01 0b  05 00 30 1f 31 0b 30 09  |.H........0.1.0.|
+00000080  06 03 55 04 0a 13 02 47  6f 31 10 30 0e 06 03 55  |..U....Go1.0...U|
+00000090  04 03 13 07 47 6f 20 52  6f 6f 74 30 1e 17 0d 31  |....Go Root0...1|
+000000a0  36 30 31 30 31 30 30 30  30 30 30 5a 17 0d 32 35  |60101000000Z..25|
+000000b0  30 31 30 31 30 30 30 30  30 30 5a 30 1a 31 0b 30  |0101000000Z0.1.0|
+000000c0  09 06 03 55 04 0a 13 02  47 6f 31 0b 30 09 06 03  |...U....Go1.0...|
+000000d0  55 04 03 13 02 47 6f 30  81 9f 30 0d 06 09 2a 86  |U....Go0..0...*.|
+000000e0  48 86 f7 0d 01 01 01 05  00 03 81 8d 00 30 81 89  |H............0..|
+000000f0  02 81 81 00 db 46 7d 93  2e 12 27 06 48 bc 06 28  |.....F}...'.H..(|
+00000100  21 ab 7e c4 b6 a2 5d fe  1e 52 45 88 7a 36 47 a5  |!.~...]..RE.z6G.|
+00000110  08 0d 92 42 5b c2 81 c0  be 97 79 98 40 fb 4f 6d  |...B[.....y.@.Om|
+00000120  14 fd 2b 13 8b c2 a5 2e  67 d8 d4 09 9e d6 22 38  |..+.....g....."8|
+00000130  b7 4a 0b 74 73 2b c2 34  f1 d1 93 e5 96 d9 74 7b  |.J.ts+.4......t{|
+00000140  f3 58 9f 6c 61 3c c0 b0  41 d4 d9 2b 2b 24 23 77  |.X.la<..A..++$#w|
+00000150  5b 1c 3b bd 75 5d ce 20  54 cf a1 63 87 1d 1e 24  |[.;.u]. T..c...$|
+00000160  c4 f3 1d 1a 50 8b aa b6  14 43 ed 97 a7 75 62 f4  |....P....C...ub.|
+00000170  14 c8 52 d7 02 03 01 00  01 a3 81 93 30 81 90 30  |..R.........0..0|
+00000180  0e 06 03 55 1d 0f 01 01  ff 04 04 03 02 05 a0 30  |...U...........0|
+00000190  1d 06 03 55 1d 25 04 16  30 14 06 08 2b 06 01 05  |...U.%..0...+...|
+000001a0  05 07 03 01 06 08 2b 06  01 05 05 07 03 02 30 0c  |......+.......0.|
+000001b0  06 03 55 1d 13 01 01 ff  04 02 30 00 30 19 06 03  |..U.......0.0...|
+000001c0  55 1d 0e 04 12 04 10 9f  91 16 1f 43 43 3e 49 a6  |U..........CC>I.|
+000001d0  de 6d b6 80 d7 9f 60 30  1b 06 03 55 1d 23 04 14  |.m....`0...U.#..|
+000001e0  30 12 80 10 48 13 49 4d  13 7e 16 31 bb a3 01 d5  |0...H.IM.~.1....|
+000001f0  ac ab 6e 7b 30 19 06 03  55 1d 11 04 12 30 10 82  |..n{0...U....0..|
+00000200  0e 65 78 61 6d 70 6c 65  2e 67 6f 6c 61 6e 67 30  |.example.golang0|
+00000210  0d 06 09 2a 86 48 86 f7  0d 01 01 0b 05 00 03 81  |...*.H..........|
+00000220  81 00 9d 30 cc 40 2b 5b  50 a0 61 cb ba e5 53 58  |...0.@+[P.a...SX|
+00000230  e1 ed 83 28 a9 58 1a a9  38 a4 95 a1 ac 31 5a 1a  |...(.X..8....1Z.|
+00000240  84 66 3d 43 d3 2d d9 0b  f2 97 df d3 20 64 38 92  |.f=C.-...... d8.|
+00000250  24 3a 00 bc cf 9c 7d b7  40 20 01 5f aa d3 16 61  |$:....}.@ ._...a|
+00000260  09 a2 76 fd 13 c3 cc e1  0c 5c ee b1 87 82 f1 6c  |..v......\.....l|
+00000270  04 ed 73 bb b3 43 77 8d  0c 1c f1 0f a1 d8 40 83  |..s..Cw.......@.|
+00000280  61 c9 4c 72 2b 9d ae db  46 06 06 4d f4 c1 b3 3e  |a.Lr+...F..M...>|
+00000290  c0 d1 bd 42 d4 db fe 3d  13 60 84 5c 21 d3 3b e9  |...B...=.`.\!.;.|
+000002a0  fa e7 16 03 03 00 ac 0c  00 00 a8 03 00 1d 20 2f  |.............. /|
+000002b0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
+000002c0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74 08  |.........._X.;t.|
+000002d0  04 00 80 4f 9e 64 41 a6  8a 41 ab 9c c8 09 3e 94  |...O.dA..A....>.|
+000002e0  ee d2 9b ad 1b 3e a9 3c  7b 43 96 95 eb 4d b5 04  |.....>.<{C...M..|
+000002f0  1a 5f 0c b2 b3 a6 2c a4  e6 78 a8 b8 d5 6c 7f d0  |._....,..x...l..|
+00000300  16 e8 56 31 e0 4a 69 d3  6b 27 18 a3 4e f5 d1 6a  |..V1.Ji.k'..N..j|
+00000310  36 15 b5 fc 4d 15 50 90  a0 30 b9 49 3d ac 8c 84  |6...M.P..0.I=...|
+00000320  d2 15 31 70 df e5 a6 97  d0 64 f7 1d 8a a1 87 4d  |..1p.....d.....M|
+00000330  3c ee da 69 20 e4 31 67  ca f2 c0 09 ee 13 7c 78  |<..i .1g......|x|
+00000340  d6 c2 c0 39 e0 b8 00 52  a9 bf d0 99 e0 b0 66 70  |...9...R......fp|
+00000350  46 ae 62 16 03 03 00 04  0e 00 00 00              |F.b.........|
 >>> Flow 3 (client to server)
-00000000  16 03 03 00 25 10 00 00  21 20 b7 d6 2f 99 8f c7  |....%...! ../...|
-00000010  bc 48 b8 4f 01 f8 2c ff  75 e5 fe 10 c6 2d 2d d5  |.H.O..,.u....--.|
-00000020  43 2b c3 14 cb d0 b2 7a  e9 71 14 03 03 00 01 01  |C+.....z.q......|
-00000030  16 03 03 00 20 c9 88 f1  a0 1a 9b 8a 14 00 33 f0  |.... .........3.|
-00000040  e8 01 f3 c2 66 06 98 44  4d 35 89 8f 1b 65 d0 cf  |....f..DM5...e..|
-00000050  eb 7d 9f b1 df                                    |.}...|
+00000000  16 03 03 00 25 10 00 00  21 20 b0 1a 5b c3 55 5f  |....%...! ..[.U_|
+00000010  0b b8 f3 69 ba 4f 49 93  05 0f b1 f1 d7 6b 6c 0c  |...i.OI......kl.|
+00000020  98 d0 22 78 0c ad 15 6b  24 5b 14 03 03 00 01 01  |.."x...k$[......|
+00000030  16 03 03 00 20 9d aa 3f  17 b3 16 88 d5 44 3d 03  |.... ..?.....D=.|
+00000040  3c 3c 8d 92 f1 2f e4 38  cc 42 20 2f ef 6a 29 c6  |<<.../.8.B /.j).|
+00000050  5c ca 44 81 f6                                    |\.D..|
 >>> Flow 4 (server to client)
-00000000  16 03 03 00 8b 04 00 00  87 00 00 00 00 00 81 50  |...............P|
-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 e0 18 83 51 ed 14 ef  68 ca 42 c5 4c 76 fb ec  |o...Q...h.B.Lv..|
-00000040  0d 89 48 e7 19 98 64 df  59 8f df 50 ce 28 e8 3c  |..H...d.Y..P.(.<|
-00000050  b6 f8 5a ae bc 6b 2e a2  d6 23 05 f6 7f 36 ea 55  |..Z..k...#...6.U|
-00000060  13 54 9e 9c 31 df d0 56  00 1f a7 6a b2 49 38 16  |.T..1..V...j.I8.|
-00000070  7f d0 78 12 95 86 11 ca  98 63 07 4a 81 a5 d3 bd  |..x......c.J....|
-00000080  dc 9e 54 9c 25 f2 55 d5  fd cf 36 94 99 e0 c5 82  |..T.%.U...6.....|
-00000090  14 03 03 00 01 01 16 03  03 00 20 e6 d9 c2 bb ca  |.......... .....|
-000000a0  02 d3 79 a4 fb b0 00 7d  e2 47 46 d3 e7 b4 fe be  |..y....}.GF.....|
-000000b0  b3 8f c4 98 b7 f7 25 bc  cc 3f a8 17 03 03 00 1d  |......%..?......|
-000000c0  ad f3 27 a0 c4 a4 5b 7b  40 11 a4 35 e6 10 03 63  |..'...[{@..5...c|
-000000d0  13 d3 1c ce 75 8f 09 8b  85 6c 93 b1 9f 15 03 03  |....u....l......|
-000000e0  00 12 79 0c dd 21 72 68  b8 30 45 5d 45 39 a9 c4  |..y..!rh.0E]E9..|
-000000f0  a6 d7 12 99                                       |....|
+00000000  16 03 03 00 83 04 00 00  7f 00 00 00 00 00 79 00  |..............y.|
+00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 94  |................|
+00000020  6f 2d 7c 2b 51 ed 14 ef  68 ca 42 c5 4c 9a f3 2b  |o-|+Q...h.B.L..+|
+00000030  7a 66 76 26 4f 73 12 14  ef a1 f4 8c c2 08 03 42  |zfv&Os.........B|
+00000040  4d d5 f9 d7 ab 31 78 51  f3 f4 94 49 5f 9d bf 23  |M....1xQ...I_..#|
+00000050  b2 11 7b ac 42 df 71 1a  37 db 64 99 a0 49 38 16  |..{.B.q.7.d..I8.|
+00000060  7e 51 5c e5 15 c0 58 7d  2d 89 ac 0d 05 31 27 ae  |~Q\...X}-....1'.|
+00000070  85 ff 27 56 24 4c 26 b3  bc 6c f6 20 80 dd bd ba  |..'V$L&..l. ....|
+00000080  a3 34 c2 32 a8 58 1b b9  14 03 03 00 01 01 16 03  |.4.2.X..........|
+00000090  03 00 20 74 e1 8a e6 a6  02 0d f7 e1 28 3a f4 c4  |.. t........(:..|
+000000a0  a6 8c 32 81 84 85 ec 58  6a 10 8a 6d c4 cc 10 3a  |..2....Xj..m...:|
+000000b0  32 3e df 17 03 03 00 1d  fd a8 94 23 3e 5d 96 b1  |2>.........#>]..|
+000000c0  68 a6 24 55 bf 29 08 93  c7 7b 9b 05 fc 0b 97 ff  |h.$U.)...{......|
+000000d0  7c 93 b0 34 82 15 03 03  00 12 43 9f 44 e4 63 e7  ||..4......C.D.c.|
+000000e0  3c 30 a5 da 9f 58 ac 01  e4 e2 a7 30              |<0...X.....0|
diff --git a/src/crypto/tls/testdata/Server-TLSv12-ClientAuthRequestedAndECDSAGiven b/src/crypto/tls/testdata/Server-TLSv12-ClientAuthRequestedAndECDSAGiven
index 3d1ceaf..41ed6c4 100644
--- a/src/crypto/tls/testdata/Server-TLSv12-ClientAuthRequestedAndECDSAGiven
+++ b/src/crypto/tls/testdata/Server-TLSv12-ClientAuthRequestedAndECDSAGiven
@@ -1,58 +1,58 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 6d 01 00 00  69 03 03 b0 00 44 aa 86  |....m...i....D..|
-00000010  30 87 8e 3f f1 89 9a 4a  f6 4c 3b 11 f3 4f e9 9f  |0..?...J.L;..O..|
-00000020  00 22 47 82 26 57 c7 d0  f9 59 6f 00 00 04 00 2f  |."G.&W...Yo..../|
+00000000  16 03 01 00 6d 01 00 00  69 03 03 5e 92 9d 30 27  |....m...i..^..0'|
+00000010  23 da fa a0 07 30 03 c8  bd 60 f2 db e9 5e b3 fc  |#....0...`...^..|
+00000020  65 d3 c5 e1 49 35 63 86  53 ec 87 00 00 04 00 2f  |e...I5c.S....../|
 00000030  00 ff 01 00 00 3c 00 16  00 00 00 17 00 00 00 0d  |.....<..........|
 00000040  00 30 00 2e 04 03 05 03  06 03 08 07 08 08 08 09  |.0..............|
 00000050  08 0a 08 0b 08 04 08 05  08 06 04 01 05 01 06 01  |................|
 00000060  03 03 02 03 03 01 02 01  03 02 02 02 04 02 05 02  |................|
 00000070  06 02                                             |..|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 31 02 00 00  2d 03 03 00 00 00 00 00  |....1...-.......|
+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 44 4f 57 4e 47  52 44 01 00 00 2f 00 00  |...DOWNGRD.../..|
-00000030  05 ff 01 00 01 00 16 03  03 02 59 0b 00 02 55 00  |..........Y...U.|
-00000040  02 52 00 02 4f 30 82 02  4b 30 82 01 b4 a0 03 02  |.R..O0..K0......|
-00000050  01 02 02 09 00 e8 f0 9d  3f e2 5b ea a6 30 0d 06  |........?.[..0..|
-00000060  09 2a 86 48 86 f7 0d 01  01 0b 05 00 30 1f 31 0b  |.*.H........0.1.|
-00000070  30 09 06 03 55 04 0a 13  02 47 6f 31 10 30 0e 06  |0...U....Go1.0..|
-00000080  03 55 04 03 13 07 47 6f  20 52 6f 6f 74 30 1e 17  |.U....Go Root0..|
-00000090  0d 31 36 30 31 30 31 30  30 30 30 30 30 5a 17 0d  |.160101000000Z..|
-000000a0  32 35 30 31 30 31 30 30  30 30 30 30 5a 30 1a 31  |250101000000Z0.1|
-000000b0  0b 30 09 06 03 55 04 0a  13 02 47 6f 31 0b 30 09  |.0...U....Go1.0.|
-000000c0  06 03 55 04 03 13 02 47  6f 30 81 9f 30 0d 06 09  |..U....Go0..0...|
-000000d0  2a 86 48 86 f7 0d 01 01  01 05 00 03 81 8d 00 30  |*.H............0|
-000000e0  81 89 02 81 81 00 db 46  7d 93 2e 12 27 06 48 bc  |.......F}...'.H.|
-000000f0  06 28 21 ab 7e c4 b6 a2  5d fe 1e 52 45 88 7a 36  |.(!.~...]..RE.z6|
-00000100  47 a5 08 0d 92 42 5b c2  81 c0 be 97 79 98 40 fb  |G....B[.....y.@.|
-00000110  4f 6d 14 fd 2b 13 8b c2  a5 2e 67 d8 d4 09 9e d6  |Om..+.....g.....|
-00000120  22 38 b7 4a 0b 74 73 2b  c2 34 f1 d1 93 e5 96 d9  |"8.J.ts+.4......|
-00000130  74 7b f3 58 9f 6c 61 3c  c0 b0 41 d4 d9 2b 2b 24  |t{.X.la<..A..++$|
-00000140  23 77 5b 1c 3b bd 75 5d  ce 20 54 cf a1 63 87 1d  |#w[.;.u]. T..c..|
-00000150  1e 24 c4 f3 1d 1a 50 8b  aa b6 14 43 ed 97 a7 75  |.$....P....C...u|
-00000160  62 f4 14 c8 52 d7 02 03  01 00 01 a3 81 93 30 81  |b...R.........0.|
-00000170  90 30 0e 06 03 55 1d 0f  01 01 ff 04 04 03 02 05  |.0...U..........|
-00000180  a0 30 1d 06 03 55 1d 25  04 16 30 14 06 08 2b 06  |.0...U.%..0...+.|
-00000190  01 05 05 07 03 01 06 08  2b 06 01 05 05 07 03 02  |........+.......|
-000001a0  30 0c 06 03 55 1d 13 01  01 ff 04 02 30 00 30 19  |0...U.......0.0.|
-000001b0  06 03 55 1d 0e 04 12 04  10 9f 91 16 1f 43 43 3e  |..U..........CC>|
-000001c0  49 a6 de 6d b6 80 d7 9f  60 30 1b 06 03 55 1d 23  |I..m....`0...U.#|
-000001d0  04 14 30 12 80 10 48 13  49 4d 13 7e 16 31 bb a3  |..0...H.IM.~.1..|
-000001e0  01 d5 ac ab 6e 7b 30 19  06 03 55 1d 11 04 12 30  |....n{0...U....0|
-000001f0  10 82 0e 65 78 61 6d 70  6c 65 2e 67 6f 6c 61 6e  |...example.golan|
-00000200  67 30 0d 06 09 2a 86 48  86 f7 0d 01 01 0b 05 00  |g0...*.H........|
-00000210  03 81 81 00 9d 30 cc 40  2b 5b 50 a0 61 cb ba e5  |.....0.@+[P.a...|
-00000220  53 58 e1 ed 83 28 a9 58  1a a9 38 a4 95 a1 ac 31  |SX...(.X..8....1|
-00000230  5a 1a 84 66 3d 43 d3 2d  d9 0b f2 97 df d3 20 64  |Z..f=C.-...... d|
-00000240  38 92 24 3a 00 bc cf 9c  7d b7 40 20 01 5f aa d3  |8.$:....}.@ ._..|
-00000250  16 61 09 a2 76 fd 13 c3  cc e1 0c 5c ee b1 87 82  |.a..v......\....|
-00000260  f1 6c 04 ed 73 bb b3 43  77 8d 0c 1c f1 0f a1 d8  |.l..s..Cw.......|
-00000270  40 83 61 c9 4c 72 2b 9d  ae db 46 06 06 4d f4 c1  |@.a.Lr+...F..M..|
-00000280  b3 3e c0 d1 bd 42 d4 db  fe 3d 13 60 84 5c 21 d3  |.>...B...=.`.\!.|
-00000290  3b e9 fa e7 16 03 03 00  23 0d 00 00 1f 02 01 40  |;.......#......@|
-000002a0  00 18 08 04 04 03 08 07  08 05 08 06 04 01 05 01  |................|
-000002b0  06 01 05 03 06 03 02 01  02 03 00 00 16 03 03 00  |................|
-000002c0  04 0e 00 00 00                                    |.....|
+00000030  09 ff 01 00 01 00 00 17  00 00 16 03 03 02 59 0b  |..............Y.|
+00000040  00 02 55 00 02 52 00 02  4f 30 82 02 4b 30 82 01  |..U..R..O0..K0..|
+00000050  b4 a0 03 02 01 02 02 09  00 e8 f0 9d 3f e2 5b ea  |............?.[.|
+00000060  a6 30 0d 06 09 2a 86 48  86 f7 0d 01 01 0b 05 00  |.0...*.H........|
+00000070  30 1f 31 0b 30 09 06 03  55 04 0a 13 02 47 6f 31  |0.1.0...U....Go1|
+00000080  10 30 0e 06 03 55 04 03  13 07 47 6f 20 52 6f 6f  |.0...U....Go Roo|
+00000090  74 30 1e 17 0d 31 36 30  31 30 31 30 30 30 30 30  |t0...16010100000|
+000000a0  30 5a 17 0d 32 35 30 31  30 31 30 30 30 30 30 30  |0Z..250101000000|
+000000b0  5a 30 1a 31 0b 30 09 06  03 55 04 0a 13 02 47 6f  |Z0.1.0...U....Go|
+000000c0  31 0b 30 09 06 03 55 04  03 13 02 47 6f 30 81 9f  |1.0...U....Go0..|
+000000d0  30 0d 06 09 2a 86 48 86  f7 0d 01 01 01 05 00 03  |0...*.H.........|
+000000e0  81 8d 00 30 81 89 02 81  81 00 db 46 7d 93 2e 12  |...0.......F}...|
+000000f0  27 06 48 bc 06 28 21 ab  7e c4 b6 a2 5d fe 1e 52  |'.H..(!.~...]..R|
+00000100  45 88 7a 36 47 a5 08 0d  92 42 5b c2 81 c0 be 97  |E.z6G....B[.....|
+00000110  79 98 40 fb 4f 6d 14 fd  2b 13 8b c2 a5 2e 67 d8  |y.@.Om..+.....g.|
+00000120  d4 09 9e d6 22 38 b7 4a  0b 74 73 2b c2 34 f1 d1  |...."8.J.ts+.4..|
+00000130  93 e5 96 d9 74 7b f3 58  9f 6c 61 3c c0 b0 41 d4  |....t{.X.la<..A.|
+00000140  d9 2b 2b 24 23 77 5b 1c  3b bd 75 5d ce 20 54 cf  |.++$#w[.;.u]. T.|
+00000150  a1 63 87 1d 1e 24 c4 f3  1d 1a 50 8b aa b6 14 43  |.c...$....P....C|
+00000160  ed 97 a7 75 62 f4 14 c8  52 d7 02 03 01 00 01 a3  |...ub...R.......|
+00000170  81 93 30 81 90 30 0e 06  03 55 1d 0f 01 01 ff 04  |..0..0...U......|
+00000180  04 03 02 05 a0 30 1d 06  03 55 1d 25 04 16 30 14  |.....0...U.%..0.|
+00000190  06 08 2b 06 01 05 05 07  03 01 06 08 2b 06 01 05  |..+.........+...|
+000001a0  05 07 03 02 30 0c 06 03  55 1d 13 01 01 ff 04 02  |....0...U.......|
+000001b0  30 00 30 19 06 03 55 1d  0e 04 12 04 10 9f 91 16  |0.0...U.........|
+000001c0  1f 43 43 3e 49 a6 de 6d  b6 80 d7 9f 60 30 1b 06  |.CC>I..m....`0..|
+000001d0  03 55 1d 23 04 14 30 12  80 10 48 13 49 4d 13 7e  |.U.#..0...H.IM.~|
+000001e0  16 31 bb a3 01 d5 ac ab  6e 7b 30 19 06 03 55 1d  |.1......n{0...U.|
+000001f0  11 04 12 30 10 82 0e 65  78 61 6d 70 6c 65 2e 67  |...0...example.g|
+00000200  6f 6c 61 6e 67 30 0d 06  09 2a 86 48 86 f7 0d 01  |olang0...*.H....|
+00000210  01 0b 05 00 03 81 81 00  9d 30 cc 40 2b 5b 50 a0  |.........0.@+[P.|
+00000220  61 cb ba e5 53 58 e1 ed  83 28 a9 58 1a a9 38 a4  |a...SX...(.X..8.|
+00000230  95 a1 ac 31 5a 1a 84 66  3d 43 d3 2d d9 0b f2 97  |...1Z..f=C.-....|
+00000240  df d3 20 64 38 92 24 3a  00 bc cf 9c 7d b7 40 20  |.. d8.$:....}.@ |
+00000250  01 5f aa d3 16 61 09 a2  76 fd 13 c3 cc e1 0c 5c  |._...a..v......\|
+00000260  ee b1 87 82 f1 6c 04 ed  73 bb b3 43 77 8d 0c 1c  |.....l..s..Cw...|
+00000270  f1 0f a1 d8 40 83 61 c9  4c 72 2b 9d ae db 46 06  |....@.a.Lr+...F.|
+00000280  06 4d f4 c1 b3 3e c0 d1  bd 42 d4 db fe 3d 13 60  |.M...>...B...=.`|
+00000290  84 5c 21 d3 3b e9 fa e7  16 03 03 00 23 0d 00 00  |.\!.;.......#...|
+000002a0  1f 02 01 40 00 18 08 04  04 03 08 07 08 05 08 06  |...@............|
+000002b0  04 01 05 01 06 01 05 03  06 03 02 01 02 03 00 00  |................|
+000002c0  16 03 03 00 04 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|
@@ -87,40 +87,40 @@
 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 10 ab 2f 0f b9 29  |............/..)|
-00000220  9f 26 36 09 00 96 9a 3d  2a 01 50 03 f3 d6 ac fc  |.&6....=*.P.....|
-00000230  40 76 96 d0 e6 a6 67 89  24 b0 56 80 58 5e 6d 03  |@v....g.$.V.X^m.|
-00000240  e3 0f dc 61 d1 de 25 95  8a 54 9f 5b 3e f2 31 dd  |...a..%..T.[>.1.|
-00000250  14 2a e2 de 7b 70 66 b5  ed 95 d9 cc 6f c0 b3 a1  |.*..{pf.....o...|
-00000260  bb 41 b2 0f 7d e8 ce b5  11 eb 99 e2 ce c0 33 bc  |.A..}.........3.|
-00000270  6a 67 10 84 d2 dd ac 15  8f 8e aa 2b 1a 7b ca d3  |jg.........+.{..|
-00000280  bb 4b 92 c4 b9 2b 08 c1  0d b2 cf 96 63 64 9d 12  |.K...+......cd..|
-00000290  a6 93 cd 21 3b bc 8e 94  72 76 16 03 03 00 93 0f  |...!;...rv......|
-000002a0  00 00 8f 04 03 00 8b 30  81 88 02 42 00 d5 05 54  |.......0...B...T|
-000002b0  b2 68 a5 04 d6 3c 7b 7d  c1 be e3 d1 b4 25 42 d6  |.h...<{}.....%B.|
-000002c0  2a 3a 2e ea 73 0d 57 ba  0f 96 78 66 c2 c5 d7 57  |*:..s.W...xf...W|
-000002d0  79 9c 22 8b 76 e9 45 ff  ef 92 e9 43 3e b8 8b b4  |y.".v.E....C>...|
-000002e0  cf 3f 67 aa 70 d1 e8 a2  1c a8 3d 24 a2 78 02 42  |.?g.p.....=$.x.B|
-000002f0  01 b2 17 64 66 2f 2e 0d  2d b9 1d 67 45 de 48 9e  |...df/..-..gE.H.|
-00000300  32 f2 1f 79 38 39 b8 bb  8b 7f 82 e9 46 fd 9b 1b  |2..y89......F...|
-00000310  b3 dd a4 9c 15 b2 a2 88  4c f7 42 a2 62 92 c0 d0  |........L.B.b...|
-00000320  a1 78 aa 8b 2d 78 4f 02  5a f7 eb ca c7 34 fc b6  |.x..-xO.Z....4..|
-00000330  6c 6e 14 03 03 00 01 01  16 03 03 00 40 bd 47 9b  |ln..........@.G.|
-00000340  ce 31 2c 09 d3 a8 2c bb  28 0c e8 bd 01 a9 54 34  |.1,...,.(.....T4|
-00000350  a5 74 af e0 d2 38 f3 1b  fa d0 2b a6 39 24 ae de  |.t...8....+.9$..|
-00000360  0a cf 4b c0 a2 3b bf 80  23 71 0a 60 ca 94 b7 23  |..K..;..#q.`...#|
-00000370  80 e3 89 89 42 74 0b a1  c6 f6 d2 c0 79           |....Bt......y|
+00000210  03 03 00 86 10 00 00 82  00 80 02 50 e4 cc a3 ad  |...........P....|
+00000220  fb 33 24 a1 b3 0a 7c 0f  00 e6 1a 06 2b 9f 1e 1f  |.3$...|.....+...|
+00000230  cc b8 b2 80 90 e7 86 20  32 40 06 ac 1b b0 41 b7  |....... 2@....A.|
+00000240  0d 9c 4c 41 90 01 0b 7a  7e b2 b2 46 39 dc 51 25  |..LA...z~..F9.Q%|
+00000250  98 e0 b9 ec 36 fc 08 64  f0 51 2a 41 e1 e5 61 3d  |....6..d.Q*A..a=|
+00000260  fc 07 c1 9b 1f 6f 48 d4  1f 46 bf 14 e6 92 61 1a  |.....oH..F....a.|
+00000270  bd 5f 25 1f 5e b1 3c ac  c7 58 63 02 0d 3a e0 d6  |._%.^.<..Xc..:..|
+00000280  e9 39 fc ec 59 66 2e 91  b2 65 37 eb a8 b5 60 d9  |.9..Yf...e7...`.|
+00000290  49 05 9f 6f cc 71 79 bb  f7 68 16 03 03 00 93 0f  |I..o.qy..h......|
+000002a0  00 00 8f 04 03 00 8b 30  81 88 02 42 00 bd 6a 29  |.......0...B..j)|
+000002b0  21 06 1a e2 67 a1 7f 10  ab ca 3f 74 5a bc 2f 5d  |!...g.....?tZ./]|
+000002c0  53 d0 59 90 f2 d0 b4 2d  75 47 67 0b 67 55 b6 4f  |S.Y....-uGg.gU.O|
+000002d0  75 7d 32 d8 a7 25 c8 4c  90 0b 56 65 be 60 5d ee  |u}2..%.L..Ve.`].|
+000002e0  f7 b3 80 79 26 e5 25 1d  17 cc d8 36 fc 39 02 42  |...y&.%....6.9.B|
+000002f0  01 c3 32 d6 f2 59 9e 10  c8 bf 7f 74 27 a1 00 df  |..2..Y.....t'...|
+00000300  55 05 f0 b3 81 a1 6e 10  a6 fb 0b e4 1c 3f 62 02  |U.....n......?b.|
+00000310  c9 cc c2 4b 97 ad 0c 88  98 07 6c 98 6d db 9d 9f  |...K......l.m...|
+00000320  68 a0 56 ab 5f f9 a2 21  33 86 64 53 de 37 ff 68  |h.V._..!3.dS.7.h|
+00000330  04 9d 14 03 03 00 01 01  16 03 03 00 40 85 14 34  |............@..4|
+00000340  d6 74 a9 d0 0b e9 1f 34  a9 e9 6c cf 5a ac 88 22  |.t.....4..l.Z.."|
+00000350  51 4d ae 16 05 dd 9e c1  36 5e e3 cf b1 5a b5 48  |QM......6^...Z.H|
+00000360  6c 24 b1 d6 fb 7f 03 6a  98 41 90 de 6d c7 b2 49  |l$.....j.A..m..I|
+00000370  d9 a3 c7 45 ff 18 7c f7  a4 cf 05 59 87           |...E..|....Y.|
 >>> 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 54 52 4a 33 9e  |...........TRJ3.|
-00000020  bb 59 7e 21 03 a6 23 bd  68 18 43 b5 c5 c5 37 a2  |.Y~!..#.h.C...7.|
-00000030  6f ac 8c 78 c5 cf 8f e6  01 df 17 53 45 6f 1a e0  |o..x.......SEo..|
-00000040  9c 4a 3d 2c cb 0d 55 7d  32 81 ec 17 03 03 00 40  |.J=,..U}2......@|
+00000010  00 00 00 00 00 00 00 00  00 00 00 63 1a 77 66 2a  |...........c.wf*|
+00000020  49 3a b2 17 83 74 e1 d9  70 96 de 01 84 09 f4 88  |I:...t..p.......|
+00000030  c3 e7 3b 65 11 6f 13 32  b8 b4 f4 41 ca 6a d6 d7  |..;e.o.2...A.j..|
+00000040  51 a3 a1 f0 2d 5b b4 55  29 f9 d3 17 03 03 00 40  |Q...-[.U)......@|
 00000050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000060  ba 75 93 00 86 1c bc 66  9e 27 2f 2b 5a 68 0e 44  |.u.....f.'/+Zh.D|
-00000070  81 15 0d 67 e6 ee 7a 43  08 78 93 71 91 00 56 0e  |...g..zC.x.q..V.|
-00000080  c6 e1 73 4b af 2f e6 e0  92 4d e5 35 ea 53 7c 45  |..sK./...M.5.S|E|
+00000060  d7 30 0f 03 89 22 4c 19  5f 06 a7 4b 95 59 91 52  |.0..."L._..K.Y.R|
+00000070  2a 65 ab 99 cb 71 99 8b  13 82 44 92 6b ff 59 07  |*e...q....D.k.Y.|
+00000080  28 ca 01 68 ab ad ba ee  6c 6a 19 0b e5 6d 82 24  |(..h....lj...m.$|
 00000090  15 03 03 00 30 00 00 00  00 00 00 00 00 00 00 00  |....0...........|
-000000a0  00 00 00 00 00 8d 7e 99  bb 93 bd 5d ba 31 b0 0d  |......~....].1..|
-000000b0  1f 76 95 50 7c 1e 24 62  9d 05 65 3f ee b7 c2 24  |.v.P|.$b..e?...$|
-000000c0  13 60 43 69 3a                                    |.`Ci:|
+000000a0  00 00 00 00 00 fc 07 f4  d4 bb 24 a3 f1 cf dc 3c  |..........$....<|
+000000b0  ac 14 63 50 32 34 fd 73  c0 eb f2 78 7b 3b ea 58  |..cP24.s...x{;.X|
+000000c0  cc 3e ff 7f e5                                    |.>...|
diff --git a/src/crypto/tls/testdata/Server-TLSv12-ClientAuthRequestedAndEd25519Given b/src/crypto/tls/testdata/Server-TLSv12-ClientAuthRequestedAndEd25519Given
index 1c3b08f..f8cc960 100644
--- a/src/crypto/tls/testdata/Server-TLSv12-ClientAuthRequestedAndEd25519Given
+++ b/src/crypto/tls/testdata/Server-TLSv12-ClientAuthRequestedAndEd25519Given
@@ -1,58 +1,58 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 6d 01 00 00  69 03 03 aa ad c9 dc 56  |....m...i......V|
-00000010  79 2e da 42 a6 b2 9e 0a  85 a6 1b e0 5e cd 4e f5  |y..B........^.N.|
-00000020  93 93 0c d5 62 a8 53 17  10 f7 e6 00 00 04 00 2f  |....b.S......../|
+00000000  16 03 01 00 6d 01 00 00  69 03 03 8a fe ad ad 75  |....m...i......u|
+00000010  e4 8c bf bf b7 b6 66 14  92 eb 84 85 9c c8 a7 66  |......f........f|
+00000020  04 2a d0 63 5e a6 bf 85  e9 4f 49 00 00 04 00 2f  |.*.c^....OI..../|
 00000030  00 ff 01 00 00 3c 00 16  00 00 00 17 00 00 00 0d  |.....<..........|
 00000040  00 30 00 2e 04 03 05 03  06 03 08 07 08 08 08 09  |.0..............|
 00000050  08 0a 08 0b 08 04 08 05  08 06 04 01 05 01 06 01  |................|
 00000060  03 03 02 03 03 01 02 01  03 02 02 02 04 02 05 02  |................|
 00000070  06 02                                             |..|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 31 02 00 00  2d 03 03 00 00 00 00 00  |....1...-.......|
+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 44 4f 57 4e 47  52 44 01 00 00 2f 00 00  |...DOWNGRD.../..|
-00000030  05 ff 01 00 01 00 16 03  03 02 59 0b 00 02 55 00  |..........Y...U.|
-00000040  02 52 00 02 4f 30 82 02  4b 30 82 01 b4 a0 03 02  |.R..O0..K0......|
-00000050  01 02 02 09 00 e8 f0 9d  3f e2 5b ea a6 30 0d 06  |........?.[..0..|
-00000060  09 2a 86 48 86 f7 0d 01  01 0b 05 00 30 1f 31 0b  |.*.H........0.1.|
-00000070  30 09 06 03 55 04 0a 13  02 47 6f 31 10 30 0e 06  |0...U....Go1.0..|
-00000080  03 55 04 03 13 07 47 6f  20 52 6f 6f 74 30 1e 17  |.U....Go Root0..|
-00000090  0d 31 36 30 31 30 31 30  30 30 30 30 30 5a 17 0d  |.160101000000Z..|
-000000a0  32 35 30 31 30 31 30 30  30 30 30 30 5a 30 1a 31  |250101000000Z0.1|
-000000b0  0b 30 09 06 03 55 04 0a  13 02 47 6f 31 0b 30 09  |.0...U....Go1.0.|
-000000c0  06 03 55 04 03 13 02 47  6f 30 81 9f 30 0d 06 09  |..U....Go0..0...|
-000000d0  2a 86 48 86 f7 0d 01 01  01 05 00 03 81 8d 00 30  |*.H............0|
-000000e0  81 89 02 81 81 00 db 46  7d 93 2e 12 27 06 48 bc  |.......F}...'.H.|
-000000f0  06 28 21 ab 7e c4 b6 a2  5d fe 1e 52 45 88 7a 36  |.(!.~...]..RE.z6|
-00000100  47 a5 08 0d 92 42 5b c2  81 c0 be 97 79 98 40 fb  |G....B[.....y.@.|
-00000110  4f 6d 14 fd 2b 13 8b c2  a5 2e 67 d8 d4 09 9e d6  |Om..+.....g.....|
-00000120  22 38 b7 4a 0b 74 73 2b  c2 34 f1 d1 93 e5 96 d9  |"8.J.ts+.4......|
-00000130  74 7b f3 58 9f 6c 61 3c  c0 b0 41 d4 d9 2b 2b 24  |t{.X.la<..A..++$|
-00000140  23 77 5b 1c 3b bd 75 5d  ce 20 54 cf a1 63 87 1d  |#w[.;.u]. T..c..|
-00000150  1e 24 c4 f3 1d 1a 50 8b  aa b6 14 43 ed 97 a7 75  |.$....P....C...u|
-00000160  62 f4 14 c8 52 d7 02 03  01 00 01 a3 81 93 30 81  |b...R.........0.|
-00000170  90 30 0e 06 03 55 1d 0f  01 01 ff 04 04 03 02 05  |.0...U..........|
-00000180  a0 30 1d 06 03 55 1d 25  04 16 30 14 06 08 2b 06  |.0...U.%..0...+.|
-00000190  01 05 05 07 03 01 06 08  2b 06 01 05 05 07 03 02  |........+.......|
-000001a0  30 0c 06 03 55 1d 13 01  01 ff 04 02 30 00 30 19  |0...U.......0.0.|
-000001b0  06 03 55 1d 0e 04 12 04  10 9f 91 16 1f 43 43 3e  |..U..........CC>|
-000001c0  49 a6 de 6d b6 80 d7 9f  60 30 1b 06 03 55 1d 23  |I..m....`0...U.#|
-000001d0  04 14 30 12 80 10 48 13  49 4d 13 7e 16 31 bb a3  |..0...H.IM.~.1..|
-000001e0  01 d5 ac ab 6e 7b 30 19  06 03 55 1d 11 04 12 30  |....n{0...U....0|
-000001f0  10 82 0e 65 78 61 6d 70  6c 65 2e 67 6f 6c 61 6e  |...example.golan|
-00000200  67 30 0d 06 09 2a 86 48  86 f7 0d 01 01 0b 05 00  |g0...*.H........|
-00000210  03 81 81 00 9d 30 cc 40  2b 5b 50 a0 61 cb ba e5  |.....0.@+[P.a...|
-00000220  53 58 e1 ed 83 28 a9 58  1a a9 38 a4 95 a1 ac 31  |SX...(.X..8....1|
-00000230  5a 1a 84 66 3d 43 d3 2d  d9 0b f2 97 df d3 20 64  |Z..f=C.-...... d|
-00000240  38 92 24 3a 00 bc cf 9c  7d b7 40 20 01 5f aa d3  |8.$:....}.@ ._..|
-00000250  16 61 09 a2 76 fd 13 c3  cc e1 0c 5c ee b1 87 82  |.a..v......\....|
-00000260  f1 6c 04 ed 73 bb b3 43  77 8d 0c 1c f1 0f a1 d8  |.l..s..Cw.......|
-00000270  40 83 61 c9 4c 72 2b 9d  ae db 46 06 06 4d f4 c1  |@.a.Lr+...F..M..|
-00000280  b3 3e c0 d1 bd 42 d4 db  fe 3d 13 60 84 5c 21 d3  |.>...B...=.`.\!.|
-00000290  3b e9 fa e7 16 03 03 00  23 0d 00 00 1f 02 01 40  |;.......#......@|
-000002a0  00 18 08 04 04 03 08 07  08 05 08 06 04 01 05 01  |................|
-000002b0  06 01 05 03 06 03 02 01  02 03 00 00 16 03 03 00  |................|
-000002c0  04 0e 00 00 00                                    |.....|
+00000030  09 ff 01 00 01 00 00 17  00 00 16 03 03 02 59 0b  |..............Y.|
+00000040  00 02 55 00 02 52 00 02  4f 30 82 02 4b 30 82 01  |..U..R..O0..K0..|
+00000050  b4 a0 03 02 01 02 02 09  00 e8 f0 9d 3f e2 5b ea  |............?.[.|
+00000060  a6 30 0d 06 09 2a 86 48  86 f7 0d 01 01 0b 05 00  |.0...*.H........|
+00000070  30 1f 31 0b 30 09 06 03  55 04 0a 13 02 47 6f 31  |0.1.0...U....Go1|
+00000080  10 30 0e 06 03 55 04 03  13 07 47 6f 20 52 6f 6f  |.0...U....Go Roo|
+00000090  74 30 1e 17 0d 31 36 30  31 30 31 30 30 30 30 30  |t0...16010100000|
+000000a0  30 5a 17 0d 32 35 30 31  30 31 30 30 30 30 30 30  |0Z..250101000000|
+000000b0  5a 30 1a 31 0b 30 09 06  03 55 04 0a 13 02 47 6f  |Z0.1.0...U....Go|
+000000c0  31 0b 30 09 06 03 55 04  03 13 02 47 6f 30 81 9f  |1.0...U....Go0..|
+000000d0  30 0d 06 09 2a 86 48 86  f7 0d 01 01 01 05 00 03  |0...*.H.........|
+000000e0  81 8d 00 30 81 89 02 81  81 00 db 46 7d 93 2e 12  |...0.......F}...|
+000000f0  27 06 48 bc 06 28 21 ab  7e c4 b6 a2 5d fe 1e 52  |'.H..(!.~...]..R|
+00000100  45 88 7a 36 47 a5 08 0d  92 42 5b c2 81 c0 be 97  |E.z6G....B[.....|
+00000110  79 98 40 fb 4f 6d 14 fd  2b 13 8b c2 a5 2e 67 d8  |y.@.Om..+.....g.|
+00000120  d4 09 9e d6 22 38 b7 4a  0b 74 73 2b c2 34 f1 d1  |...."8.J.ts+.4..|
+00000130  93 e5 96 d9 74 7b f3 58  9f 6c 61 3c c0 b0 41 d4  |....t{.X.la<..A.|
+00000140  d9 2b 2b 24 23 77 5b 1c  3b bd 75 5d ce 20 54 cf  |.++$#w[.;.u]. T.|
+00000150  a1 63 87 1d 1e 24 c4 f3  1d 1a 50 8b aa b6 14 43  |.c...$....P....C|
+00000160  ed 97 a7 75 62 f4 14 c8  52 d7 02 03 01 00 01 a3  |...ub...R.......|
+00000170  81 93 30 81 90 30 0e 06  03 55 1d 0f 01 01 ff 04  |..0..0...U......|
+00000180  04 03 02 05 a0 30 1d 06  03 55 1d 25 04 16 30 14  |.....0...U.%..0.|
+00000190  06 08 2b 06 01 05 05 07  03 01 06 08 2b 06 01 05  |..+.........+...|
+000001a0  05 07 03 02 30 0c 06 03  55 1d 13 01 01 ff 04 02  |....0...U.......|
+000001b0  30 00 30 19 06 03 55 1d  0e 04 12 04 10 9f 91 16  |0.0...U.........|
+000001c0  1f 43 43 3e 49 a6 de 6d  b6 80 d7 9f 60 30 1b 06  |.CC>I..m....`0..|
+000001d0  03 55 1d 23 04 14 30 12  80 10 48 13 49 4d 13 7e  |.U.#..0...H.IM.~|
+000001e0  16 31 bb a3 01 d5 ac ab  6e 7b 30 19 06 03 55 1d  |.1......n{0...U.|
+000001f0  11 04 12 30 10 82 0e 65  78 61 6d 70 6c 65 2e 67  |...0...example.g|
+00000200  6f 6c 61 6e 67 30 0d 06  09 2a 86 48 86 f7 0d 01  |olang0...*.H....|
+00000210  01 0b 05 00 03 81 81 00  9d 30 cc 40 2b 5b 50 a0  |.........0.@+[P.|
+00000220  61 cb ba e5 53 58 e1 ed  83 28 a9 58 1a a9 38 a4  |a...SX...(.X..8.|
+00000230  95 a1 ac 31 5a 1a 84 66  3d 43 d3 2d d9 0b f2 97  |...1Z..f=C.-....|
+00000240  df d3 20 64 38 92 24 3a  00 bc cf 9c 7d b7 40 20  |.. d8.$:....}.@ |
+00000250  01 5f aa d3 16 61 09 a2  76 fd 13 c3 cc e1 0c 5c  |._...a..v......\|
+00000260  ee b1 87 82 f1 6c 04 ed  73 bb b3 43 77 8d 0c 1c  |.....l..s..Cw...|
+00000270  f1 0f a1 d8 40 83 61 c9  4c 72 2b 9d ae db 46 06  |....@.a.Lr+...F.|
+00000280  06 4d f4 c1 b3 3e c0 d1  bd 42 d4 db fe 3d 13 60  |.M...>...B...=.`|
+00000290  84 5c 21 d3 3b e9 fa e7  16 03 03 00 23 0d 00 00  |.\!.;.......#...|
+000002a0  1f 02 01 40 00 18 08 04  04 03 08 07 08 05 08 06  |...@............|
+000002b0  04 01 05 01 06 01 05 03  06 03 02 01 02 03 00 00  |................|
+000002c0  16 03 03 00 04 0e 00 00  00                       |.........|
 >>> Flow 3 (client to server)
 00000000  16 03 03 01 3c 0b 00 01  38 00 01 35 00 01 32 30  |....<...8..5..20|
 00000010  82 01 2e 30 81 e1 a0 03  02 01 02 02 10 17 d1 81  |...0............|
@@ -74,36 +74,36 @@
 00000110  8a 4e 34 40 39 d6 b3 10  dc 19 fe a0 22 71 b3 f5  |.N4@9......."q..|
 00000120  8f a1 58 0d cd f4 f1 85  24 bf e6 3d 14 df df ed  |..X.....$..=....|
 00000130  0e e1 17 d8 11 a2 60 d0  8a 37 23 2a c2 46 aa 3a  |......`..7#*.F.:|
-00000140  08 16 03 03 00 86 10 00  00 82 00 80 14 f2 ac 22  |..............."|
-00000150  fb 0b f8 03 a7 cf 23 d5  ea 9f b0 f2 64 ae 41 fe  |......#.....d.A.|
-00000160  33 f7 54 69 f5 41 b7 c1  91 6d 2b 3e 14 2a f6 c8  |3.Ti.A...m+>.*..|
-00000170  96 45 00 28 13 f5 2f de  35 f9 64 89 5c 99 3e 89  |.E.(../.5.d.\.>.|
-00000180  06 ff 59 56 69 db 5f 6e  02 84 dd 1c 44 7b 86 e8  |..YVi._n....D{..|
-00000190  e3 d9 03 f1 16 9e 06 23  00 43 91 ec a9 dd da a4  |.......#.C......|
-000001a0  ac fe 5b f8 62 f9 76 19  38 83 54 b4 8c 0b 02 f0  |..[.b.v.8.T.....|
-000001b0  fa 7a 8e 2e da 9d e1 4a  c6 51 92 9b f6 4b a1 31  |.z.....J.Q...K.1|
-000001c0  c9 64 b2 a6 9a 01 52 86  b3 7a 43 17 16 03 03 00  |.d....R..zC.....|
-000001d0  48 0f 00 00 44 08 07 00  40 29 35 71 34 aa b1 f1  |H...D...@)5q4...|
-000001e0  64 08 4e 06 43 db 00 f7  f5 98 8e b6 51 d7 c4 b5  |d.N.C.......Q...|
-000001f0  2b fa 56 8b bd 7b 18 f2  81 e9 2f 81 82 d8 90 e7  |+.V..{..../.....|
-00000200  5b bc 72 7e f7 97 43 df  cd 07 bf 7b ae 60 08 8b  |[.r~..C....{.`..|
-00000210  0a 71 c5 bf f0 7a 3e cc  0b 14 03 03 00 01 01 16  |.q...z>.........|
-00000220  03 03 00 40 85 4f e0 c0  f3 3e a4 51 68 d6 ec 1b  |...@.O...>.Qh...|
-00000230  f1 4b 3e 0e 13 84 87 e3  3c 9a 5f 67 75 3a ad 08  |.K>.....<._gu:..|
-00000240  be 29 15 b0 1f 62 27 fd  d8 dd 58 b1 65 e7 e2 db  |.)...b'...X.e...|
-00000250  fe 55 a5 2d 2e 71 59 07  ad 12 12 80 12 bb 26 36  |.U.-.qY.......&6|
-00000260  93 fb ea b1                                       |....|
+00000140  08 16 03 03 00 86 10 00  00 82 00 80 77 8b 9f 34  |............w..4|
+00000150  b4 db a7 0d 5b ed 1b 2f  4a 41 64 f5 ce 4a 00 7c  |....[../JAd..J.||
+00000160  91 32 b3 cf 61 18 41 04  ae fa 3b 14 de 19 0e 64  |.2..a.A...;....d|
+00000170  f9 ec 75 a6 48 7e 28 57  26 f5 1c 75 1d 42 73 fc  |..u.H~(W&..u.Bs.|
+00000180  11 51 2b ef e5 08 83 ac  17 ec 78 b8 5b 14 84 c9  |.Q+.......x.[...|
+00000190  bc 7f 22 fd 54 69 7a 82  36 c7 21 bc d6 04 c4 e7  |..".Tiz.6.!.....|
+000001a0  bc 48 c8 72 56 5d 1e 65  41 21 0a 26 85 a0 d8 c3  |.H.rV].eA!.&....|
+000001b0  50 f0 b6 07 25 ee 79 b8  f5 e6 17 85 d4 09 e7 d7  |P...%.y.........|
+000001c0  ab 8f 17 cb c2 13 a0 5a  50 cb e4 a7 16 03 03 00  |.......ZP.......|
+000001d0  48 0f 00 00 44 08 07 00  40 b7 24 50 46 db d4 8c  |H...D...@.$PF...|
+000001e0  68 17 f5 5e 79 a9 80 8c  40 23 92 33 4e 1e cc ee  |h..^y...@#.3N...|
+000001f0  d5 35 4d b8 2a 52 f0 7f  50 8e c6 d5 5f bc 08 35  |.5M.*R..P..._..5|
+00000200  a2 6d db cb 96 52 ec 92  c7 62 c7 59 ab d8 6f 9d  |.m...R...b.Y..o.|
+00000210  d7 46 35 71 28 41 89 59  02 14 03 03 00 01 01 16  |.F5q(A.Y........|
+00000220  03 03 00 40 3e 12 44 bc  c6 3d 88 71 ba d3 0c 26  |...@>.D..=.q...&|
+00000230  20 72 b0 7f 25 83 9f fd  77 c1 f5 1e 47 28 2e 60  | r..%...w...G(.`|
+00000240  53 e0 ac 52 e8 94 e4 87  90 3f af f3 a4 c0 d3 ba  |S..R.....?......|
+00000250  fe b7 06 54 f7 13 33 36  47 8f 5e 45 22 84 18 3a  |...T..36G.^E"..:|
+00000260  1f 14 21 85                                       |..!.|
 >>> 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 f4 ed 23 ce da  |.............#..|
-00000020  73 5f ef 6b a2 82 3d a5  c6 f1 fd 8f a0 47 4e 34  |s_.k..=......GN4|
-00000030  f9 7c d0 67 49 00 11 c3  76 83 23 3f 99 41 d5 5c  |.|.gI...v.#?.A.\|
-00000040  aa 9f 97 66 b7 0a 59 ba  f3 40 83 17 03 03 00 40  |...f..Y..@.....@|
+00000010  00 00 00 00 00 00 00 00  00 00 00 d4 e6 b8 6f 53  |..............oS|
+00000020  6a d9 37 2b a4 95 9f 04  e5 99 2f f9 9a 16 fd a7  |j.7+....../.....|
+00000030  2d 39 d9 aa 7c 26 9e 44  4b 7f 8f d5 c6 24 4d ac  |-9..|&.DK....$M.|
+00000040  13 ca 8a 45 1e 66 dc 9a  bf 76 22 17 03 03 00 40  |...E.f...v"....@|
 00000050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000060  82 66 85 d7 47 a6 5a 19  4f 89 5c 56 43 cb 6a bd  |.f..G.Z.O.\VC.j.|
-00000070  1b ae 46 40 7d e8 a9 7b  57 04 91 8b d5 de 24 f1  |..F@}..{W.....$.|
-00000080  c0 df 37 45 e9 af d7 c5  1c e7 ee 80 0d 61 2a 7f  |..7E.........a*.|
+00000060  3f 5c 60 f8 22 7b aa 82  38 c4 4a 2e 07 50 cb 6c  |?\`."{..8.J..P.l|
+00000070  3f 6f a9 39 bf 21 ce 7a  30 72 03 90 ec bc 9c 18  |?o.9.!.z0r......|
+00000080  1f a9 7f 82 3a d9 46 d9  d8 b8 77 65 e8 b3 e7 f5  |....:.F...we....|
 00000090  15 03 03 00 30 00 00 00  00 00 00 00 00 00 00 00  |....0...........|
-000000a0  00 00 00 00 00 5a 97 f3  38 e5 3a f1 07 79 b7 eb  |.....Z..8.:..y..|
-000000b0  ed 85 57 3a 96 16 51 38  85 86 ec 1b 9b 48 82 9c  |..W:..Q8.....H..|
-000000c0  05 bf 4d e5 fb                                    |..M..|
+000000a0  00 00 00 00 00 6d 29 d4  87 0a b4 1d b4 9d f4 12  |.....m).........|
+000000b0  bc 3d a3 1b 79 21 85 0d  e7 10 64 92 40 39 05 99  |.=..y!....d.@9..|
+000000c0  c8 a7 dd ef 0e                                    |.....|
diff --git a/src/crypto/tls/testdata/Server-TLSv12-ClientAuthRequestedAndGiven b/src/crypto/tls/testdata/Server-TLSv12-ClientAuthRequestedAndGiven
index 3dec0de..cc6450a 100644
--- a/src/crypto/tls/testdata/Server-TLSv12-ClientAuthRequestedAndGiven
+++ b/src/crypto/tls/testdata/Server-TLSv12-ClientAuthRequestedAndGiven
@@ -1,58 +1,58 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 6d 01 00 00  69 03 03 e7 7e 1f 56 df  |....m...i...~.V.|
-00000010  f1 1b e5 92 47 3b fb 25  a6 57 7d 13 47 08 f0 0f  |....G;.%.W}.G...|
-00000020  5b 64 64 00 d3 25 33 e5  a5 5b e3 00 00 04 00 2f  |[dd..%3..[...../|
+00000000  16 03 01 00 6d 01 00 00  69 03 03 e9 31 0f d0 25  |....m...i...1..%|
+00000010  ef 25 a7 1a 9b 8c 4b a3  ca 2b a6 54 89 1c e1 68  |.%....K..+.T...h|
+00000020  6f b2 b2 60 6f 8a dc 87  24 8c 7b 00 00 04 00 2f  |o..`o...$.{..../|
 00000030  00 ff 01 00 00 3c 00 16  00 00 00 17 00 00 00 0d  |.....<..........|
 00000040  00 30 00 2e 04 03 05 03  06 03 08 07 08 08 08 09  |.0..............|
 00000050  08 0a 08 0b 08 04 08 05  08 06 04 01 05 01 06 01  |................|
 00000060  03 03 02 03 03 01 02 01  03 02 02 02 04 02 05 02  |................|
 00000070  06 02                                             |..|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 31 02 00 00  2d 03 03 00 00 00 00 00  |....1...-.......|
+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 44 4f 57 4e 47  52 44 01 00 00 2f 00 00  |...DOWNGRD.../..|
-00000030  05 ff 01 00 01 00 16 03  03 02 59 0b 00 02 55 00  |..........Y...U.|
-00000040  02 52 00 02 4f 30 82 02  4b 30 82 01 b4 a0 03 02  |.R..O0..K0......|
-00000050  01 02 02 09 00 e8 f0 9d  3f e2 5b ea a6 30 0d 06  |........?.[..0..|
-00000060  09 2a 86 48 86 f7 0d 01  01 0b 05 00 30 1f 31 0b  |.*.H........0.1.|
-00000070  30 09 06 03 55 04 0a 13  02 47 6f 31 10 30 0e 06  |0...U....Go1.0..|
-00000080  03 55 04 03 13 07 47 6f  20 52 6f 6f 74 30 1e 17  |.U....Go Root0..|
-00000090  0d 31 36 30 31 30 31 30  30 30 30 30 30 5a 17 0d  |.160101000000Z..|
-000000a0  32 35 30 31 30 31 30 30  30 30 30 30 5a 30 1a 31  |250101000000Z0.1|
-000000b0  0b 30 09 06 03 55 04 0a  13 02 47 6f 31 0b 30 09  |.0...U....Go1.0.|
-000000c0  06 03 55 04 03 13 02 47  6f 30 81 9f 30 0d 06 09  |..U....Go0..0...|
-000000d0  2a 86 48 86 f7 0d 01 01  01 05 00 03 81 8d 00 30  |*.H............0|
-000000e0  81 89 02 81 81 00 db 46  7d 93 2e 12 27 06 48 bc  |.......F}...'.H.|
-000000f0  06 28 21 ab 7e c4 b6 a2  5d fe 1e 52 45 88 7a 36  |.(!.~...]..RE.z6|
-00000100  47 a5 08 0d 92 42 5b c2  81 c0 be 97 79 98 40 fb  |G....B[.....y.@.|
-00000110  4f 6d 14 fd 2b 13 8b c2  a5 2e 67 d8 d4 09 9e d6  |Om..+.....g.....|
-00000120  22 38 b7 4a 0b 74 73 2b  c2 34 f1 d1 93 e5 96 d9  |"8.J.ts+.4......|
-00000130  74 7b f3 58 9f 6c 61 3c  c0 b0 41 d4 d9 2b 2b 24  |t{.X.la<..A..++$|
-00000140  23 77 5b 1c 3b bd 75 5d  ce 20 54 cf a1 63 87 1d  |#w[.;.u]. T..c..|
-00000150  1e 24 c4 f3 1d 1a 50 8b  aa b6 14 43 ed 97 a7 75  |.$....P....C...u|
-00000160  62 f4 14 c8 52 d7 02 03  01 00 01 a3 81 93 30 81  |b...R.........0.|
-00000170  90 30 0e 06 03 55 1d 0f  01 01 ff 04 04 03 02 05  |.0...U..........|
-00000180  a0 30 1d 06 03 55 1d 25  04 16 30 14 06 08 2b 06  |.0...U.%..0...+.|
-00000190  01 05 05 07 03 01 06 08  2b 06 01 05 05 07 03 02  |........+.......|
-000001a0  30 0c 06 03 55 1d 13 01  01 ff 04 02 30 00 30 19  |0...U.......0.0.|
-000001b0  06 03 55 1d 0e 04 12 04  10 9f 91 16 1f 43 43 3e  |..U..........CC>|
-000001c0  49 a6 de 6d b6 80 d7 9f  60 30 1b 06 03 55 1d 23  |I..m....`0...U.#|
-000001d0  04 14 30 12 80 10 48 13  49 4d 13 7e 16 31 bb a3  |..0...H.IM.~.1..|
-000001e0  01 d5 ac ab 6e 7b 30 19  06 03 55 1d 11 04 12 30  |....n{0...U....0|
-000001f0  10 82 0e 65 78 61 6d 70  6c 65 2e 67 6f 6c 61 6e  |...example.golan|
-00000200  67 30 0d 06 09 2a 86 48  86 f7 0d 01 01 0b 05 00  |g0...*.H........|
-00000210  03 81 81 00 9d 30 cc 40  2b 5b 50 a0 61 cb ba e5  |.....0.@+[P.a...|
-00000220  53 58 e1 ed 83 28 a9 58  1a a9 38 a4 95 a1 ac 31  |SX...(.X..8....1|
-00000230  5a 1a 84 66 3d 43 d3 2d  d9 0b f2 97 df d3 20 64  |Z..f=C.-...... d|
-00000240  38 92 24 3a 00 bc cf 9c  7d b7 40 20 01 5f aa d3  |8.$:....}.@ ._..|
-00000250  16 61 09 a2 76 fd 13 c3  cc e1 0c 5c ee b1 87 82  |.a..v......\....|
-00000260  f1 6c 04 ed 73 bb b3 43  77 8d 0c 1c f1 0f a1 d8  |.l..s..Cw.......|
-00000270  40 83 61 c9 4c 72 2b 9d  ae db 46 06 06 4d f4 c1  |@.a.Lr+...F..M..|
-00000280  b3 3e c0 d1 bd 42 d4 db  fe 3d 13 60 84 5c 21 d3  |.>...B...=.`.\!.|
-00000290  3b e9 fa e7 16 03 03 00  23 0d 00 00 1f 02 01 40  |;.......#......@|
-000002a0  00 18 08 04 04 03 08 07  08 05 08 06 04 01 05 01  |................|
-000002b0  06 01 05 03 06 03 02 01  02 03 00 00 16 03 03 00  |................|
-000002c0  04 0e 00 00 00                                    |.....|
+00000030  09 ff 01 00 01 00 00 17  00 00 16 03 03 02 59 0b  |..............Y.|
+00000040  00 02 55 00 02 52 00 02  4f 30 82 02 4b 30 82 01  |..U..R..O0..K0..|
+00000050  b4 a0 03 02 01 02 02 09  00 e8 f0 9d 3f e2 5b ea  |............?.[.|
+00000060  a6 30 0d 06 09 2a 86 48  86 f7 0d 01 01 0b 05 00  |.0...*.H........|
+00000070  30 1f 31 0b 30 09 06 03  55 04 0a 13 02 47 6f 31  |0.1.0...U....Go1|
+00000080  10 30 0e 06 03 55 04 03  13 07 47 6f 20 52 6f 6f  |.0...U....Go Roo|
+00000090  74 30 1e 17 0d 31 36 30  31 30 31 30 30 30 30 30  |t0...16010100000|
+000000a0  30 5a 17 0d 32 35 30 31  30 31 30 30 30 30 30 30  |0Z..250101000000|
+000000b0  5a 30 1a 31 0b 30 09 06  03 55 04 0a 13 02 47 6f  |Z0.1.0...U....Go|
+000000c0  31 0b 30 09 06 03 55 04  03 13 02 47 6f 30 81 9f  |1.0...U....Go0..|
+000000d0  30 0d 06 09 2a 86 48 86  f7 0d 01 01 01 05 00 03  |0...*.H.........|
+000000e0  81 8d 00 30 81 89 02 81  81 00 db 46 7d 93 2e 12  |...0.......F}...|
+000000f0  27 06 48 bc 06 28 21 ab  7e c4 b6 a2 5d fe 1e 52  |'.H..(!.~...]..R|
+00000100  45 88 7a 36 47 a5 08 0d  92 42 5b c2 81 c0 be 97  |E.z6G....B[.....|
+00000110  79 98 40 fb 4f 6d 14 fd  2b 13 8b c2 a5 2e 67 d8  |y.@.Om..+.....g.|
+00000120  d4 09 9e d6 22 38 b7 4a  0b 74 73 2b c2 34 f1 d1  |...."8.J.ts+.4..|
+00000130  93 e5 96 d9 74 7b f3 58  9f 6c 61 3c c0 b0 41 d4  |....t{.X.la<..A.|
+00000140  d9 2b 2b 24 23 77 5b 1c  3b bd 75 5d ce 20 54 cf  |.++$#w[.;.u]. T.|
+00000150  a1 63 87 1d 1e 24 c4 f3  1d 1a 50 8b aa b6 14 43  |.c...$....P....C|
+00000160  ed 97 a7 75 62 f4 14 c8  52 d7 02 03 01 00 01 a3  |...ub...R.......|
+00000170  81 93 30 81 90 30 0e 06  03 55 1d 0f 01 01 ff 04  |..0..0...U......|
+00000180  04 03 02 05 a0 30 1d 06  03 55 1d 25 04 16 30 14  |.....0...U.%..0.|
+00000190  06 08 2b 06 01 05 05 07  03 01 06 08 2b 06 01 05  |..+.........+...|
+000001a0  05 07 03 02 30 0c 06 03  55 1d 13 01 01 ff 04 02  |....0...U.......|
+000001b0  30 00 30 19 06 03 55 1d  0e 04 12 04 10 9f 91 16  |0.0...U.........|
+000001c0  1f 43 43 3e 49 a6 de 6d  b6 80 d7 9f 60 30 1b 06  |.CC>I..m....`0..|
+000001d0  03 55 1d 23 04 14 30 12  80 10 48 13 49 4d 13 7e  |.U.#..0...H.IM.~|
+000001e0  16 31 bb a3 01 d5 ac ab  6e 7b 30 19 06 03 55 1d  |.1......n{0...U.|
+000001f0  11 04 12 30 10 82 0e 65  78 61 6d 70 6c 65 2e 67  |...0...example.g|
+00000200  6f 6c 61 6e 67 30 0d 06  09 2a 86 48 86 f7 0d 01  |olang0...*.H....|
+00000210  01 0b 05 00 03 81 81 00  9d 30 cc 40 2b 5b 50 a0  |.........0.@+[P.|
+00000220  61 cb ba e5 53 58 e1 ed  83 28 a9 58 1a a9 38 a4  |a...SX...(.X..8.|
+00000230  95 a1 ac 31 5a 1a 84 66  3d 43 d3 2d d9 0b f2 97  |...1Z..f=C.-....|
+00000240  df d3 20 64 38 92 24 3a  00 bc cf 9c 7d b7 40 20  |.. d8.$:....}.@ |
+00000250  01 5f aa d3 16 61 09 a2  76 fd 13 c3 cc e1 0c 5c  |._...a..v......\|
+00000260  ee b1 87 82 f1 6c 04 ed  73 bb b3 43 77 8d 0c 1c  |.....l..s..Cw...|
+00000270  f1 0f a1 d8 40 83 61 c9  4c 72 2b 9d ae db 46 06  |....@.a.Lr+...F.|
+00000280  06 4d f4 c1 b3 3e c0 d1  bd 42 d4 db fe 3d 13 60  |.M...>...B...=.`|
+00000290  84 5c 21 d3 3b e9 fa e7  16 03 03 00 23 0d 00 00  |.\!.;.......#...|
+000002a0  1f 02 01 40 00 18 08 04  04 03 08 07 08 05 08 06  |...@............|
+000002b0  04 01 05 01 06 01 05 03  06 03 02 01 02 03 00 00  |................|
+000002c0  16 03 03 00 04 0e 00 00  00                       |.........|
 >>> Flow 3 (client to server)
 00000000  16 03 03 01 fd 0b 00 01  f9 00 01 f6 00 01 f3 30  |...............0|
 00000010  82 01 ef 30 82 01 58 a0  03 02 01 02 02 10 5c 19  |...0..X.......\.|
@@ -86,40 +86,40 @@
 000001d0  ac 11 b1 28 56 be 1d cd  61 62 84 09 bf d6 80 c6  |...(V...ab......|
 000001e0  45 8d 82 2c b4 d8 83 9b  db c9 22 b7 2a 12 11 7b  |E..,......".*..{|
 000001f0  fa 02 3b c1 c9 ff ea c9  9d a8 49 d3 95 d7 d5 0e  |..;.......I.....|
-00000200  e5 35 16 03 03 00 86 10  00 00 82 00 80 7f 38 c9  |.5............8.|
-00000210  56 ed de 7d a6 2c dc cc  24 61 ea d3 8a fc b8 18  |V..}.,..$a......|
-00000220  b8 e5 50 3e c3 d1 ca cf  f7 0c d9 9b 22 d8 6d 0f  |..P>........".m.|
-00000230  71 e7 dd 7c 24 84 c6 f1  6a ac a0 3d ea d7 65 24  |q..|$...j..=..e$|
-00000240  d7 3a 17 d5 b7 ec f7 03  bc 58 3a 01 d5 08 27 25  |.:.......X:...'%|
-00000250  b9 2f 3b 96 cb d5 7c 12  20 f4 f1 91 58 13 fb 50  |./;...|. ...X..P|
-00000260  f8 d5 5c e4 43 85 e8 41  37 3e ff fa a6 64 92 4d  |..\.C..A7>...d.M|
-00000270  bd d4 96 59 bd 94 f1 95  21 ad 75 1e 0d a2 8d 30  |...Y....!.u....0|
-00000280  a3 82 f4 56 0f ba 5d 40  32 7f 0c 5f 5a 16 03 03  |...V..]@2.._Z...|
-00000290  00 88 0f 00 00 84 08 04  00 80 39 b4 f4 68 e9 96  |..........9..h..|
-000002a0  01 53 95 31 26 fa 3c 70  46 9f ba 62 b4 37 ea a6  |.S.1&.<pF..b.7..|
-000002b0  e4 81 d1 21 f4 1f 21 d4  6d c0 98 20 40 56 52 79  |...!..!.m.. @VRy|
-000002c0  99 18 c7 f1 6f 01 25 e1  65 71 33 9e 4b 81 11 a0  |....o.%.eq3.K...|
-000002d0  68 e2 be 39 05 86 81 44  a5 64 3d 07 e3 3b 48 70  |h..9...D.d=..;Hp|
-000002e0  14 fd 1f 75 05 23 44 57  3e dd 47 79 17 c3 5e 70  |...u.#DW>.Gy..^p|
-000002f0  30 8c 11 3f 27 43 4f 5d  81 89 83 39 9d fe 0c c3  |0..?'CO]...9....|
-00000300  af 40 8d 2a 41 bf 57 67  7a df b4 89 29 10 9a 84  |.@.*A.Wgz...)...|
-00000310  ff 8c 2f 58 1a 0a b9 62  4e 8e 14 03 03 00 01 01  |../X...bN.......|
-00000320  16 03 03 00 40 7c 7a 79  ae 84 60 b8 95 83 30 78  |....@|zy..`...0x|
-00000330  e9 6e 02 36 52 85 5a 6a  a7 b5 f5 6d 4d a9 09 9d  |.n.6R.Zj...mM...|
-00000340  43 9d 46 da d0 cf 75 25  49 e1 79 0b 23 2d 85 c2  |C.F...u%I.y.#-..|
-00000350  fd 5d 90 08 f5 75 81 ab  01 a0 f4 93 12 87 fb e3  |.]...u..........|
-00000360  9b 99 4d fa c5                                    |..M..|
+00000200  e5 35 16 03 03 00 86 10  00 00 82 00 80 29 51 da  |.5...........)Q.|
+00000210  8e 5c 3e fb 44 8a 0f 97  42 23 8b e2 73 cc e2 90  |.\>.D...B#..s...|
+00000220  11 c4 98 01 e9 60 96 9e  a9 96 30 c5 95 f8 56 0e  |.....`....0...V.|
+00000230  4a 2e 77 e7 7e 23 b7 49  31 c4 87 c5 69 c6 ca 6f  |J.w.~#.I1...i..o|
+00000240  ea 53 41 b4 2e 1e f6 0b  33 f5 e1 40 69 c0 91 6f  |.SA.....3..@i..o|
+00000250  88 c1 68 c8 18 99 6e fe  b3 5f 9b ee f1 4a 76 41  |..h...n.._...JvA|
+00000260  1f d1 05 f5 39 76 61 e6  a6 ea 75 0e 50 32 a1 19  |....9va...u.P2..|
+00000270  20 6a 4c 5d 62 6e 2a 6e  af f9 9c 38 b6 3a bc 86  | jL]bn*n...8.:..|
+00000280  eb ac 6d d3 b5 48 30 11  4d 98 2e 61 34 16 03 03  |..m..H0.M..a4...|
+00000290  00 88 0f 00 00 84 08 04  00 80 82 ed 3f da b5 50  |............?..P|
+000002a0  d2 50 51 14 cf ee f7 b9  7b a9 0c 77 2f 88 42 0a  |.PQ.....{..w/.B.|
+000002b0  34 a9 5d e7 32 26 3a 28  87 49 fb c4 83 31 68 c6  |4.].2&:(.I...1h.|
+000002c0  0d 32 d4 31 0a d1 d6 1e  6f 7f 89 93 bf b7 7c c7  |.2.1....o.....|.|
+000002d0  95 f8 c3 69 d8 58 4e e4  76 07 36 84 b7 c3 e7 22  |...i.XN.v.6...."|
+000002e0  01 4c 59 ae 89 95 bb e0  07 e0 31 6a e2 95 4c d4  |.LY.......1j..L.|
+000002f0  01 54 9d 27 82 60 31 13  39 07 47 c2 0c 08 5c d4  |.T.'.`1.9.G...\.|
+00000300  03 5a 6f d7 89 a0 67 5e  2d a0 11 03 bf 0e 35 d8  |.Zo...g^-.....5.|
+00000310  d0 78 2f 1e d8 15 47 ce  c9 d3 14 03 03 00 01 01  |.x/...G.........|
+00000320  16 03 03 00 40 d0 0a 0e  93 dd 9a 51 4f a9 7f 5f  |....@......QO.._|
+00000330  93 a6 60 a6 f2 10 f1 bd  bd ae 13 5d 11 b7 0d 1a  |..`........]....|
+00000340  3d 1e f3 0c b7 53 7c 10  ed fa 8c d7 3f 20 ec f2  |=....S|.....? ..|
+00000350  7d e9 15 87 3d d3 05 21  3a bc a5 54 fa 40 3b 53  |}...=..!:..T.@;S|
+00000360  41 7c ea c6 28                                    |A|..(|
 >>> 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 48 61 67 c0 1e  |...........Hag..|
-00000020  09 79 82 cc 55 60 fa e5  bd 1a 1d 14 d3 25 e6 4b  |.y..U`.......%.K|
-00000030  b7 a6 47 64 01 65 12 b3  37 42 1a 13 d9 90 12 7e  |..Gd.e..7B.....~|
-00000040  ea d8 30 39 e2 25 5e 9a  05 61 11 17 03 03 00 40  |..09.%^..a.....@|
+00000010  00 00 00 00 00 00 00 00  00 00 00 a8 8e 30 08 f0  |.............0..|
+00000020  87 7b 13 31 99 6d 7e 9a  9b 03 d3 6f 84 d8 d9 31  |.{.1.m~....o...1|
+00000030  2b d2 aa d4 0e ae 6e 72  03 ac e7 7e 5c 22 cc ac  |+.....nr...~\"..|
+00000040  33 b5 df 04 b2 4a 2b 6f  bb a1 6f 17 03 03 00 40  |3....J+o..o....@|
 00000050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000060  cf c5 73 08 e9 15 25 b6  d8 e3 fa 0c a1 25 33 75  |..s...%......%3u|
-00000070  8a 2e 66 03 c2 2d 50 c7  e1 10 b4 2a 0c 88 87 90  |..f..-P....*....|
-00000080  04 4a 80 26 85 4b fd 9a  4f 0e b1 2c f0 18 57 f5  |.J.&.K..O..,..W.|
+00000060  50 9c 81 04 9b 1d 61 8a  30 9c 18 68 c7 e1 c9 f3  |P.....a.0..h....|
+00000070  70 f0 1b b6 4a dd fc c7  e3 e3 20 e2 4d 6f 9f bf  |p...J..... .Mo..|
+00000080  17 b0 5e 5b 45 73 29 1e  d4 30 b4 03 ca 8e 69 63  |..^[Es)..0....ic|
 00000090  15 03 03 00 30 00 00 00  00 00 00 00 00 00 00 00  |....0...........|
-000000a0  00 00 00 00 00 ce e0 a1  71 be 3d 1e b0 bd 06 4c  |........q.=....L|
-000000b0  1f 5b 10 8d 77 18 e0 c5  81 c9 4e 1b 3b 96 f6 6d  |.[..w.....N.;..m|
-000000c0  88 03 53 54 30                                    |..ST0|
+000000a0  00 00 00 00 00 28 ca 6a  4c 1b 3c 11 61 ce b2 58  |.....(.jL.<.a..X|
+000000b0  94 e7 e4 7d c5 ce 51 03  c4 ae b5 4c 33 0b 3c 95  |...}..Q....L3.<.|
+000000c0  ec b1 65 ea da                                    |..e..|
diff --git a/src/crypto/tls/testdata/Server-TLSv12-ClientAuthRequestedAndPKCS1v15Given b/src/crypto/tls/testdata/Server-TLSv12-ClientAuthRequestedAndPKCS1v15Given
index 8efbc91..875fe1b 100644
--- a/src/crypto/tls/testdata/Server-TLSv12-ClientAuthRequestedAndPKCS1v15Given
+++ b/src/crypto/tls/testdata/Server-TLSv12-ClientAuthRequestedAndPKCS1v15Given
@@ -1,58 +1,58 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 6d 01 00 00  69 03 03 4c 65 99 ab e0  |....m...i..Le...|
-00000010  4b 0a 08 f5 06 20 f9 3d  96 4f 05 e3 58 6f 41 50  |K.... .=.O..XoAP|
-00000020  c1 5f e8 a8 0a 5f 8f f2  de 7f 16 00 00 04 00 2f  |._..._........./|
+00000000  16 03 01 00 6d 01 00 00  69 03 03 dc f3 c6 52 a4  |....m...i.....R.|
+00000010  9a 9c 53 e0 5a 3c cc 4c  4f 09 32 7f f1 7c 86 6b  |..S.Z<.LO.2..|.k|
+00000020  75 59 68 a5 81 72 45 46  fb 94 a8 00 00 04 00 2f  |uYh..rEF......./|
 00000030  00 ff 01 00 00 3c 00 16  00 00 00 17 00 00 00 0d  |.....<..........|
 00000040  00 30 00 2e 04 03 05 03  06 03 08 07 08 08 08 09  |.0..............|
 00000050  08 0a 08 0b 08 04 08 05  08 06 04 01 05 01 06 01  |................|
 00000060  03 03 02 03 03 01 02 01  03 02 02 02 04 02 05 02  |................|
 00000070  06 02                                             |..|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 31 02 00 00  2d 03 03 00 00 00 00 00  |....1...-.......|
+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 44 4f 57 4e 47  52 44 01 00 00 2f 00 00  |...DOWNGRD.../..|
-00000030  05 ff 01 00 01 00 16 03  03 02 59 0b 00 02 55 00  |..........Y...U.|
-00000040  02 52 00 02 4f 30 82 02  4b 30 82 01 b4 a0 03 02  |.R..O0..K0......|
-00000050  01 02 02 09 00 e8 f0 9d  3f e2 5b ea a6 30 0d 06  |........?.[..0..|
-00000060  09 2a 86 48 86 f7 0d 01  01 0b 05 00 30 1f 31 0b  |.*.H........0.1.|
-00000070  30 09 06 03 55 04 0a 13  02 47 6f 31 10 30 0e 06  |0...U....Go1.0..|
-00000080  03 55 04 03 13 07 47 6f  20 52 6f 6f 74 30 1e 17  |.U....Go Root0..|
-00000090  0d 31 36 30 31 30 31 30  30 30 30 30 30 5a 17 0d  |.160101000000Z..|
-000000a0  32 35 30 31 30 31 30 30  30 30 30 30 5a 30 1a 31  |250101000000Z0.1|
-000000b0  0b 30 09 06 03 55 04 0a  13 02 47 6f 31 0b 30 09  |.0...U....Go1.0.|
-000000c0  06 03 55 04 03 13 02 47  6f 30 81 9f 30 0d 06 09  |..U....Go0..0...|
-000000d0  2a 86 48 86 f7 0d 01 01  01 05 00 03 81 8d 00 30  |*.H............0|
-000000e0  81 89 02 81 81 00 db 46  7d 93 2e 12 27 06 48 bc  |.......F}...'.H.|
-000000f0  06 28 21 ab 7e c4 b6 a2  5d fe 1e 52 45 88 7a 36  |.(!.~...]..RE.z6|
-00000100  47 a5 08 0d 92 42 5b c2  81 c0 be 97 79 98 40 fb  |G....B[.....y.@.|
-00000110  4f 6d 14 fd 2b 13 8b c2  a5 2e 67 d8 d4 09 9e d6  |Om..+.....g.....|
-00000120  22 38 b7 4a 0b 74 73 2b  c2 34 f1 d1 93 e5 96 d9  |"8.J.ts+.4......|
-00000130  74 7b f3 58 9f 6c 61 3c  c0 b0 41 d4 d9 2b 2b 24  |t{.X.la<..A..++$|
-00000140  23 77 5b 1c 3b bd 75 5d  ce 20 54 cf a1 63 87 1d  |#w[.;.u]. T..c..|
-00000150  1e 24 c4 f3 1d 1a 50 8b  aa b6 14 43 ed 97 a7 75  |.$....P....C...u|
-00000160  62 f4 14 c8 52 d7 02 03  01 00 01 a3 81 93 30 81  |b...R.........0.|
-00000170  90 30 0e 06 03 55 1d 0f  01 01 ff 04 04 03 02 05  |.0...U..........|
-00000180  a0 30 1d 06 03 55 1d 25  04 16 30 14 06 08 2b 06  |.0...U.%..0...+.|
-00000190  01 05 05 07 03 01 06 08  2b 06 01 05 05 07 03 02  |........+.......|
-000001a0  30 0c 06 03 55 1d 13 01  01 ff 04 02 30 00 30 19  |0...U.......0.0.|
-000001b0  06 03 55 1d 0e 04 12 04  10 9f 91 16 1f 43 43 3e  |..U..........CC>|
-000001c0  49 a6 de 6d b6 80 d7 9f  60 30 1b 06 03 55 1d 23  |I..m....`0...U.#|
-000001d0  04 14 30 12 80 10 48 13  49 4d 13 7e 16 31 bb a3  |..0...H.IM.~.1..|
-000001e0  01 d5 ac ab 6e 7b 30 19  06 03 55 1d 11 04 12 30  |....n{0...U....0|
-000001f0  10 82 0e 65 78 61 6d 70  6c 65 2e 67 6f 6c 61 6e  |...example.golan|
-00000200  67 30 0d 06 09 2a 86 48  86 f7 0d 01 01 0b 05 00  |g0...*.H........|
-00000210  03 81 81 00 9d 30 cc 40  2b 5b 50 a0 61 cb ba e5  |.....0.@+[P.a...|
-00000220  53 58 e1 ed 83 28 a9 58  1a a9 38 a4 95 a1 ac 31  |SX...(.X..8....1|
-00000230  5a 1a 84 66 3d 43 d3 2d  d9 0b f2 97 df d3 20 64  |Z..f=C.-...... d|
-00000240  38 92 24 3a 00 bc cf 9c  7d b7 40 20 01 5f aa d3  |8.$:....}.@ ._..|
-00000250  16 61 09 a2 76 fd 13 c3  cc e1 0c 5c ee b1 87 82  |.a..v......\....|
-00000260  f1 6c 04 ed 73 bb b3 43  77 8d 0c 1c f1 0f a1 d8  |.l..s..Cw.......|
-00000270  40 83 61 c9 4c 72 2b 9d  ae db 46 06 06 4d f4 c1  |@.a.Lr+...F..M..|
-00000280  b3 3e c0 d1 bd 42 d4 db  fe 3d 13 60 84 5c 21 d3  |.>...B...=.`.\!.|
-00000290  3b e9 fa e7 16 03 03 00  23 0d 00 00 1f 02 01 40  |;.......#......@|
-000002a0  00 18 08 04 04 03 08 07  08 05 08 06 04 01 05 01  |................|
-000002b0  06 01 05 03 06 03 02 01  02 03 00 00 16 03 03 00  |................|
-000002c0  04 0e 00 00 00                                    |.....|
+00000030  09 ff 01 00 01 00 00 17  00 00 16 03 03 02 59 0b  |..............Y.|
+00000040  00 02 55 00 02 52 00 02  4f 30 82 02 4b 30 82 01  |..U..R..O0..K0..|
+00000050  b4 a0 03 02 01 02 02 09  00 e8 f0 9d 3f e2 5b ea  |............?.[.|
+00000060  a6 30 0d 06 09 2a 86 48  86 f7 0d 01 01 0b 05 00  |.0...*.H........|
+00000070  30 1f 31 0b 30 09 06 03  55 04 0a 13 02 47 6f 31  |0.1.0...U....Go1|
+00000080  10 30 0e 06 03 55 04 03  13 07 47 6f 20 52 6f 6f  |.0...U....Go Roo|
+00000090  74 30 1e 17 0d 31 36 30  31 30 31 30 30 30 30 30  |t0...16010100000|
+000000a0  30 5a 17 0d 32 35 30 31  30 31 30 30 30 30 30 30  |0Z..250101000000|
+000000b0  5a 30 1a 31 0b 30 09 06  03 55 04 0a 13 02 47 6f  |Z0.1.0...U....Go|
+000000c0  31 0b 30 09 06 03 55 04  03 13 02 47 6f 30 81 9f  |1.0...U....Go0..|
+000000d0  30 0d 06 09 2a 86 48 86  f7 0d 01 01 01 05 00 03  |0...*.H.........|
+000000e0  81 8d 00 30 81 89 02 81  81 00 db 46 7d 93 2e 12  |...0.......F}...|
+000000f0  27 06 48 bc 06 28 21 ab  7e c4 b6 a2 5d fe 1e 52  |'.H..(!.~...]..R|
+00000100  45 88 7a 36 47 a5 08 0d  92 42 5b c2 81 c0 be 97  |E.z6G....B[.....|
+00000110  79 98 40 fb 4f 6d 14 fd  2b 13 8b c2 a5 2e 67 d8  |y.@.Om..+.....g.|
+00000120  d4 09 9e d6 22 38 b7 4a  0b 74 73 2b c2 34 f1 d1  |...."8.J.ts+.4..|
+00000130  93 e5 96 d9 74 7b f3 58  9f 6c 61 3c c0 b0 41 d4  |....t{.X.la<..A.|
+00000140  d9 2b 2b 24 23 77 5b 1c  3b bd 75 5d ce 20 54 cf  |.++$#w[.;.u]. T.|
+00000150  a1 63 87 1d 1e 24 c4 f3  1d 1a 50 8b aa b6 14 43  |.c...$....P....C|
+00000160  ed 97 a7 75 62 f4 14 c8  52 d7 02 03 01 00 01 a3  |...ub...R.......|
+00000170  81 93 30 81 90 30 0e 06  03 55 1d 0f 01 01 ff 04  |..0..0...U......|
+00000180  04 03 02 05 a0 30 1d 06  03 55 1d 25 04 16 30 14  |.....0...U.%..0.|
+00000190  06 08 2b 06 01 05 05 07  03 01 06 08 2b 06 01 05  |..+.........+...|
+000001a0  05 07 03 02 30 0c 06 03  55 1d 13 01 01 ff 04 02  |....0...U.......|
+000001b0  30 00 30 19 06 03 55 1d  0e 04 12 04 10 9f 91 16  |0.0...U.........|
+000001c0  1f 43 43 3e 49 a6 de 6d  b6 80 d7 9f 60 30 1b 06  |.CC>I..m....`0..|
+000001d0  03 55 1d 23 04 14 30 12  80 10 48 13 49 4d 13 7e  |.U.#..0...H.IM.~|
+000001e0  16 31 bb a3 01 d5 ac ab  6e 7b 30 19 06 03 55 1d  |.1......n{0...U.|
+000001f0  11 04 12 30 10 82 0e 65  78 61 6d 70 6c 65 2e 67  |...0...example.g|
+00000200  6f 6c 61 6e 67 30 0d 06  09 2a 86 48 86 f7 0d 01  |olang0...*.H....|
+00000210  01 0b 05 00 03 81 81 00  9d 30 cc 40 2b 5b 50 a0  |.........0.@+[P.|
+00000220  61 cb ba e5 53 58 e1 ed  83 28 a9 58 1a a9 38 a4  |a...SX...(.X..8.|
+00000230  95 a1 ac 31 5a 1a 84 66  3d 43 d3 2d d9 0b f2 97  |...1Z..f=C.-....|
+00000240  df d3 20 64 38 92 24 3a  00 bc cf 9c 7d b7 40 20  |.. d8.$:....}.@ |
+00000250  01 5f aa d3 16 61 09 a2  76 fd 13 c3 cc e1 0c 5c  |._...a..v......\|
+00000260  ee b1 87 82 f1 6c 04 ed  73 bb b3 43 77 8d 0c 1c  |.....l..s..Cw...|
+00000270  f1 0f a1 d8 40 83 61 c9  4c 72 2b 9d ae db 46 06  |....@.a.Lr+...F.|
+00000280  06 4d f4 c1 b3 3e c0 d1  bd 42 d4 db fe 3d 13 60  |.M...>...B...=.`|
+00000290  84 5c 21 d3 3b e9 fa e7  16 03 03 00 23 0d 00 00  |.\!.;.......#...|
+000002a0  1f 02 01 40 00 18 08 04  04 03 08 07 08 05 08 06  |...@............|
+000002b0  04 01 05 01 06 01 05 03  06 03 02 01 02 03 00 00  |................|
+000002c0  16 03 03 00 04 0e 00 00  00                       |.........|
 >>> Flow 3 (client to server)
 00000000  16 03 03 01 fd 0b 00 01  f9 00 01 f6 00 01 f3 30  |...............0|
 00000010  82 01 ef 30 82 01 58 a0  03 02 01 02 02 10 5c 19  |...0..X.......\.|
@@ -86,40 +86,40 @@
 000001d0  ac 11 b1 28 56 be 1d cd  61 62 84 09 bf d6 80 c6  |...(V...ab......|
 000001e0  45 8d 82 2c b4 d8 83 9b  db c9 22 b7 2a 12 11 7b  |E..,......".*..{|
 000001f0  fa 02 3b c1 c9 ff ea c9  9d a8 49 d3 95 d7 d5 0e  |..;.......I.....|
-00000200  e5 35 16 03 03 00 86 10  00 00 82 00 80 41 62 b4  |.5...........Ab.|
-00000210  fb 81 80 58 e3 0d c7 b2  c0 55 ee 5b 1a ba 2d 8f  |...X.....U.[..-.|
-00000220  9f 79 24 0a d5 be c7 2b  55 ec 51 6d b9 78 63 85  |.y$....+U.Qm.xc.|
-00000230  82 d2 ea 02 0c 06 fe 05  fd ed 08 be 71 99 5f 53  |............q._S|
-00000240  94 85 01 ff ba 2a ee 14  cb 99 0a df 1e 67 0d 95  |.....*.......g..|
-00000250  63 8d 1f 96 41 75 f9 5d  1a 21 03 6c e3 eb 4f 5e  |c...Au.].!.l..O^|
-00000260  28 c3 4d bb 6d 29 33 bc  24 75 8c 3b f2 c4 6b f5  |(.M.m)3.$u.;..k.|
-00000270  86 db 40 59 34 43 fb a9  1e ea 6f 3f 0e b4 35 39  |..@Y4C....o?..59|
-00000280  52 d8 0f 85 ed 3b 52 b6  5b 7f b0 bf c3 16 03 03  |R....;R.[.......|
-00000290  00 88 0f 00 00 84 04 01  00 80 52 85 ca 08 7d 07  |..........R...}.|
-000002a0  bc d8 0c a4 b8 36 01 c0  b8 8a 18 ba d8 d4 a3 fa  |.....6..........|
-000002b0  fd 32 e2 00 72 e5 d2 c8  5a 59 6b 5e 6e df 35 da  |.2..r...ZYk^n.5.|
-000002c0  c7 1e ee af 87 4b d6 30  7e 27 1c 76 70 28 79 ac  |.....K.0~'.vp(y.|
-000002d0  7f 31 bc 44 55 3c 15 61  d2 0d 24 9c 48 43 9f 12  |.1.DU<.a..$.HC..|
-000002e0  a6 74 5c 2f 5b 4e 96 4a  47 b4 6b 7c fa da 37 96  |.t\/[N.JG.k|..7.|
-000002f0  ec 46 7d 05 be 24 8f cf  11 31 ab 4c 5b c7 3e 94  |.F}..$...1.L[.>.|
-00000300  9a 2a 39 e8 fe aa aa ee  e3 00 a3 a8 1e 75 4a 21  |.*9..........uJ!|
-00000310  b4 ad 24 8f ee e8 30 85  b1 28 14 03 03 00 01 01  |..$...0..(......|
-00000320  16 03 03 00 40 71 47 13  68 49 74 9c 2a 81 35 94  |....@qG.hIt.*.5.|
-00000330  52 f6 44 44 67 3b 62 e1  ef 34 18 e7 8a 56 71 88  |R.DDg;b..4...Vq.|
-00000340  83 7e 67 28 20 18 b1 c5  8a c8 8b 6a fe ee bf da  |.~g( ......j....|
-00000350  5f 6e cd fa a8 5c af 5c  3c 83 80 78 f3 fe 1b dc  |_n...\.\<..x....|
-00000360  95 fe 22 16 82                                    |.."..|
+00000200  e5 35 16 03 03 00 86 10  00 00 82 00 80 b5 77 6b  |.5............wk|
+00000210  fa 10 fb df 48 8f e7 51  b4 cb 14 c5 48 bd 63 d6  |....H..Q....H.c.|
+00000220  0e 19 d0 81 a8 5a d7 b5  43 84 35 85 37 b7 8d 2e  |.....Z..C.5.7...|
+00000230  c7 c8 70 4c f4 45 bf be  17 86 e7 40 1d 6f 88 2a  |..pL.E.....@.o.*|
+00000240  91 b5 aa aa 34 f7 9a f3  96 e4 dd 51 15 88 be f1  |....4......Q....|
+00000250  80 a9 6f 94 ed c7 5d 28  66 b4 37 e8 22 4f 42 c3  |..o...](f.7."OB.|
+00000260  b5 f0 2f dd 57 dc 8d e5  5a c0 9d fa ce 3c 7a 2d  |../.W...Z....<z-|
+00000270  1d 45 9b fc 7b ba e7 11  eb 16 ae 68 bd b4 94 14  |.E..{......h....|
+00000280  3a a2 4d 0d e0 cd 53 a9  f1 07 d6 4a 41 16 03 03  |:.M...S....JA...|
+00000290  00 88 0f 00 00 84 04 01  00 80 78 60 7e 91 f5 47  |..........x`~..G|
+000002a0  15 61 85 70 cf b3 16 6e  45 4c 8b 42 2a 66 7e b6  |.a.p...nEL.B*f~.|
+000002b0  76 4f 26 6b b5 d7 e1 68  c2 2e bf b9 71 f2 30 7f  |vO&k...h....q.0.|
+000002c0  e4 50 56 1e 0e 64 cf 05  5c 57 be 84 ce ac 8e 04  |.PV..d..\W......|
+000002d0  44 f8 c5 2a 55 ab c5 50  84 c4 b0 73 c7 73 46 80  |D..*U..P...s.sF.|
+000002e0  bd 33 0f bc 90 2f af 50  5a 21 a7 ec 01 6b f2 ae  |.3.../.PZ!...k..|
+000002f0  84 bf 08 cb 7b 3a ca cb  76 bb e3 d7 e1 8e ee e2  |....{:..v.......|
+00000300  88 25 b0 9b 68 74 ff 48  5f 48 e0 8e bd 04 d0 85  |.%..ht.H_H......|
+00000310  ea 58 93 0c c4 27 01 38  5b c5 14 03 03 00 01 01  |.X...'.8[.......|
+00000320  16 03 03 00 40 9a 93 f3  2f 40 10 df 03 f1 90 8f  |....@.../@......|
+00000330  41 4a 76 77 44 7c 00 13  c0 2b a2 86 b3 4e 09 93  |AJvwD|...+...N..|
+00000340  01 e4 3a d4 53 ae a1 4c  07 56 18 3c ec 7f 98 a6  |..:.S..L.V.<....|
+00000350  04 7b 15 23 e4 e1 75 15  ec 33 1d 09 04 e8 04 1a  |.{.#..u..3......|
+00000360  e1 51 0c 78 99                                    |.Q.x.|
 >>> 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 20 f7 51 8f 23  |........... .Q.#|
-00000020  08 8d 67 5d 12 06 b0 48  81 2d 0c ba 88 03 88 31  |..g]...H.-.....1|
-00000030  d0 ab 63 0d 9f 28 60 21  0a a3 58 47 c2 04 cc f1  |..c..(`!..XG....|
-00000040  50 0d 88 b2 e5 54 50 26  e6 6e ed 17 03 03 00 40  |P....TP&.n.....@|
+00000010  00 00 00 00 00 00 00 00  00 00 00 a2 b0 ad 7e 71  |..............~q|
+00000020  0c 2c db df 4c b1 4f 19  e6 00 4f 11 ff 5e 4a c5  |.,..L.O...O..^J.|
+00000030  c2 9d 8c 6c 03 50 12 3d  81 ec 44 5a 75 ba 2d 48  |...l.P.=..DZu.-H|
+00000040  7a 74 c3 a3 68 5a 26 ee  7e f5 a2 17 03 03 00 40  |zt..hZ&.~......@|
 00000050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000060  fa 4d e5 00 14 2c 65 82  5d 1b bf 99 6a 54 16 98  |.M...,e.]...jT..|
-00000070  ef 55 15 00 f9 c4 3e 61  88 83 63 fd 60 66 f1 87  |.U....>a..c.`f..|
-00000080  fa c4 45 ae de b8 0a 36  75 f5 b2 b6 f5 d8 9b df  |..E....6u.......|
+00000060  ad 1b 16 8e 39 99 64 7c  c5 49 24 83 c4 4e f6 86  |....9.d|.I$..N..|
+00000070  6b 5d 68 ae f4 0b 58 23  83 eb ab 01 52 4d 07 a1  |k]h...X#....RM..|
+00000080  59 00 e8 dc a5 a1 6f 76  e2 e9 f2 e1 21 58 6b a0  |Y.....ov....!Xk.|
 00000090  15 03 03 00 30 00 00 00  00 00 00 00 00 00 00 00  |....0...........|
-000000a0  00 00 00 00 00 54 cc c0  15 e5 6d 62 4d 13 54 e8  |.....T....mbM.T.|
-000000b0  fa cf 76 a6 de d6 48 f8  0d ef 30 b7 12 05 cf 75  |..v...H...0....u|
-000000c0  8b 00 9e d5 63                                    |....c|
+000000a0  00 00 00 00 00 3c 6e a7  81 36 d0 8c 99 d8 f3 55  |.....<n..6.....U|
+000000b0  02 2e 1a 48 2d 5c 46 6e  ff f2 17 f2 d4 60 b5 9e  |...H-\Fn.....`..|
+000000c0  33 54 50 0d 6d                                    |3TP.m|
diff --git a/src/crypto/tls/testdata/Server-TLSv12-ClientAuthRequestedNotGiven b/src/crypto/tls/testdata/Server-TLSv12-ClientAuthRequestedNotGiven
index a81c173..7c2c59d 100644
--- a/src/crypto/tls/testdata/Server-TLSv12-ClientAuthRequestedNotGiven
+++ b/src/crypto/tls/testdata/Server-TLSv12-ClientAuthRequestedNotGiven
@@ -1,85 +1,85 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 6d 01 00 00  69 03 03 be a7 a4 6c f7  |....m...i.....l.|
-00000010  f6 b4 f2 64 5d 0e 36 b6  05 f5 f1 c9 fe 3c c2 8e  |...d].6......<..|
-00000020  c4 b7 18 68 b9 0c 1d 51  50 2f 1e 00 00 04 00 2f  |...h...QP/...../|
+00000000  16 03 01 00 6d 01 00 00  69 03 03 ac ea d9 49 98  |....m...i.....I.|
+00000010  9a 0c 7c 86 64 7c 73 72  6d 79 3f 7b e9 11 8b 1d  |..|.d|srmy?{....|
+00000020  79 95 f5 f5 23 9f b2 f1  9c f4 b5 00 00 04 00 2f  |y...#........../|
 00000030  00 ff 01 00 00 3c 00 16  00 00 00 17 00 00 00 0d  |.....<..........|
 00000040  00 30 00 2e 04 03 05 03  06 03 08 07 08 08 08 09  |.0..............|
 00000050  08 0a 08 0b 08 04 08 05  08 06 04 01 05 01 06 01  |................|
 00000060  03 03 02 03 03 01 02 01  03 02 02 02 04 02 05 02  |................|
 00000070  06 02                                             |..|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 31 02 00 00  2d 03 03 00 00 00 00 00  |....1...-.......|
+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 44 4f 57 4e 47  52 44 01 00 00 2f 00 00  |...DOWNGRD.../..|
-00000030  05 ff 01 00 01 00 16 03  03 02 59 0b 00 02 55 00  |..........Y...U.|
-00000040  02 52 00 02 4f 30 82 02  4b 30 82 01 b4 a0 03 02  |.R..O0..K0......|
-00000050  01 02 02 09 00 e8 f0 9d  3f e2 5b ea a6 30 0d 06  |........?.[..0..|
-00000060  09 2a 86 48 86 f7 0d 01  01 0b 05 00 30 1f 31 0b  |.*.H........0.1.|
-00000070  30 09 06 03 55 04 0a 13  02 47 6f 31 10 30 0e 06  |0...U....Go1.0..|
-00000080  03 55 04 03 13 07 47 6f  20 52 6f 6f 74 30 1e 17  |.U....Go Root0..|
-00000090  0d 31 36 30 31 30 31 30  30 30 30 30 30 5a 17 0d  |.160101000000Z..|
-000000a0  32 35 30 31 30 31 30 30  30 30 30 30 5a 30 1a 31  |250101000000Z0.1|
-000000b0  0b 30 09 06 03 55 04 0a  13 02 47 6f 31 0b 30 09  |.0...U....Go1.0.|
-000000c0  06 03 55 04 03 13 02 47  6f 30 81 9f 30 0d 06 09  |..U....Go0..0...|
-000000d0  2a 86 48 86 f7 0d 01 01  01 05 00 03 81 8d 00 30  |*.H............0|
-000000e0  81 89 02 81 81 00 db 46  7d 93 2e 12 27 06 48 bc  |.......F}...'.H.|
-000000f0  06 28 21 ab 7e c4 b6 a2  5d fe 1e 52 45 88 7a 36  |.(!.~...]..RE.z6|
-00000100  47 a5 08 0d 92 42 5b c2  81 c0 be 97 79 98 40 fb  |G....B[.....y.@.|
-00000110  4f 6d 14 fd 2b 13 8b c2  a5 2e 67 d8 d4 09 9e d6  |Om..+.....g.....|
-00000120  22 38 b7 4a 0b 74 73 2b  c2 34 f1 d1 93 e5 96 d9  |"8.J.ts+.4......|
-00000130  74 7b f3 58 9f 6c 61 3c  c0 b0 41 d4 d9 2b 2b 24  |t{.X.la<..A..++$|
-00000140  23 77 5b 1c 3b bd 75 5d  ce 20 54 cf a1 63 87 1d  |#w[.;.u]. T..c..|
-00000150  1e 24 c4 f3 1d 1a 50 8b  aa b6 14 43 ed 97 a7 75  |.$....P....C...u|
-00000160  62 f4 14 c8 52 d7 02 03  01 00 01 a3 81 93 30 81  |b...R.........0.|
-00000170  90 30 0e 06 03 55 1d 0f  01 01 ff 04 04 03 02 05  |.0...U..........|
-00000180  a0 30 1d 06 03 55 1d 25  04 16 30 14 06 08 2b 06  |.0...U.%..0...+.|
-00000190  01 05 05 07 03 01 06 08  2b 06 01 05 05 07 03 02  |........+.......|
-000001a0  30 0c 06 03 55 1d 13 01  01 ff 04 02 30 00 30 19  |0...U.......0.0.|
-000001b0  06 03 55 1d 0e 04 12 04  10 9f 91 16 1f 43 43 3e  |..U..........CC>|
-000001c0  49 a6 de 6d b6 80 d7 9f  60 30 1b 06 03 55 1d 23  |I..m....`0...U.#|
-000001d0  04 14 30 12 80 10 48 13  49 4d 13 7e 16 31 bb a3  |..0...H.IM.~.1..|
-000001e0  01 d5 ac ab 6e 7b 30 19  06 03 55 1d 11 04 12 30  |....n{0...U....0|
-000001f0  10 82 0e 65 78 61 6d 70  6c 65 2e 67 6f 6c 61 6e  |...example.golan|
-00000200  67 30 0d 06 09 2a 86 48  86 f7 0d 01 01 0b 05 00  |g0...*.H........|
-00000210  03 81 81 00 9d 30 cc 40  2b 5b 50 a0 61 cb ba e5  |.....0.@+[P.a...|
-00000220  53 58 e1 ed 83 28 a9 58  1a a9 38 a4 95 a1 ac 31  |SX...(.X..8....1|
-00000230  5a 1a 84 66 3d 43 d3 2d  d9 0b f2 97 df d3 20 64  |Z..f=C.-...... d|
-00000240  38 92 24 3a 00 bc cf 9c  7d b7 40 20 01 5f aa d3  |8.$:....}.@ ._..|
-00000250  16 61 09 a2 76 fd 13 c3  cc e1 0c 5c ee b1 87 82  |.a..v......\....|
-00000260  f1 6c 04 ed 73 bb b3 43  77 8d 0c 1c f1 0f a1 d8  |.l..s..Cw.......|
-00000270  40 83 61 c9 4c 72 2b 9d  ae db 46 06 06 4d f4 c1  |@.a.Lr+...F..M..|
-00000280  b3 3e c0 d1 bd 42 d4 db  fe 3d 13 60 84 5c 21 d3  |.>...B...=.`.\!.|
-00000290  3b e9 fa e7 16 03 03 00  23 0d 00 00 1f 02 01 40  |;.......#......@|
-000002a0  00 18 08 04 04 03 08 07  08 05 08 06 04 01 05 01  |................|
-000002b0  06 01 05 03 06 03 02 01  02 03 00 00 16 03 03 00  |................|
-000002c0  04 0e 00 00 00                                    |.....|
+00000030  09 ff 01 00 01 00 00 17  00 00 16 03 03 02 59 0b  |..............Y.|
+00000040  00 02 55 00 02 52 00 02  4f 30 82 02 4b 30 82 01  |..U..R..O0..K0..|
+00000050  b4 a0 03 02 01 02 02 09  00 e8 f0 9d 3f e2 5b ea  |............?.[.|
+00000060  a6 30 0d 06 09 2a 86 48  86 f7 0d 01 01 0b 05 00  |.0...*.H........|
+00000070  30 1f 31 0b 30 09 06 03  55 04 0a 13 02 47 6f 31  |0.1.0...U....Go1|
+00000080  10 30 0e 06 03 55 04 03  13 07 47 6f 20 52 6f 6f  |.0...U....Go Roo|
+00000090  74 30 1e 17 0d 31 36 30  31 30 31 30 30 30 30 30  |t0...16010100000|
+000000a0  30 5a 17 0d 32 35 30 31  30 31 30 30 30 30 30 30  |0Z..250101000000|
+000000b0  5a 30 1a 31 0b 30 09 06  03 55 04 0a 13 02 47 6f  |Z0.1.0...U....Go|
+000000c0  31 0b 30 09 06 03 55 04  03 13 02 47 6f 30 81 9f  |1.0...U....Go0..|
+000000d0  30 0d 06 09 2a 86 48 86  f7 0d 01 01 01 05 00 03  |0...*.H.........|
+000000e0  81 8d 00 30 81 89 02 81  81 00 db 46 7d 93 2e 12  |...0.......F}...|
+000000f0  27 06 48 bc 06 28 21 ab  7e c4 b6 a2 5d fe 1e 52  |'.H..(!.~...]..R|
+00000100  45 88 7a 36 47 a5 08 0d  92 42 5b c2 81 c0 be 97  |E.z6G....B[.....|
+00000110  79 98 40 fb 4f 6d 14 fd  2b 13 8b c2 a5 2e 67 d8  |y.@.Om..+.....g.|
+00000120  d4 09 9e d6 22 38 b7 4a  0b 74 73 2b c2 34 f1 d1  |...."8.J.ts+.4..|
+00000130  93 e5 96 d9 74 7b f3 58  9f 6c 61 3c c0 b0 41 d4  |....t{.X.la<..A.|
+00000140  d9 2b 2b 24 23 77 5b 1c  3b bd 75 5d ce 20 54 cf  |.++$#w[.;.u]. T.|
+00000150  a1 63 87 1d 1e 24 c4 f3  1d 1a 50 8b aa b6 14 43  |.c...$....P....C|
+00000160  ed 97 a7 75 62 f4 14 c8  52 d7 02 03 01 00 01 a3  |...ub...R.......|
+00000170  81 93 30 81 90 30 0e 06  03 55 1d 0f 01 01 ff 04  |..0..0...U......|
+00000180  04 03 02 05 a0 30 1d 06  03 55 1d 25 04 16 30 14  |.....0...U.%..0.|
+00000190  06 08 2b 06 01 05 05 07  03 01 06 08 2b 06 01 05  |..+.........+...|
+000001a0  05 07 03 02 30 0c 06 03  55 1d 13 01 01 ff 04 02  |....0...U.......|
+000001b0  30 00 30 19 06 03 55 1d  0e 04 12 04 10 9f 91 16  |0.0...U.........|
+000001c0  1f 43 43 3e 49 a6 de 6d  b6 80 d7 9f 60 30 1b 06  |.CC>I..m....`0..|
+000001d0  03 55 1d 23 04 14 30 12  80 10 48 13 49 4d 13 7e  |.U.#..0...H.IM.~|
+000001e0  16 31 bb a3 01 d5 ac ab  6e 7b 30 19 06 03 55 1d  |.1......n{0...U.|
+000001f0  11 04 12 30 10 82 0e 65  78 61 6d 70 6c 65 2e 67  |...0...example.g|
+00000200  6f 6c 61 6e 67 30 0d 06  09 2a 86 48 86 f7 0d 01  |olang0...*.H....|
+00000210  01 0b 05 00 03 81 81 00  9d 30 cc 40 2b 5b 50 a0  |.........0.@+[P.|
+00000220  61 cb ba e5 53 58 e1 ed  83 28 a9 58 1a a9 38 a4  |a...SX...(.X..8.|
+00000230  95 a1 ac 31 5a 1a 84 66  3d 43 d3 2d d9 0b f2 97  |...1Z..f=C.-....|
+00000240  df d3 20 64 38 92 24 3a  00 bc cf 9c 7d b7 40 20  |.. d8.$:....}.@ |
+00000250  01 5f aa d3 16 61 09 a2  76 fd 13 c3 cc e1 0c 5c  |._...a..v......\|
+00000260  ee b1 87 82 f1 6c 04 ed  73 bb b3 43 77 8d 0c 1c  |.....l..s..Cw...|
+00000270  f1 0f a1 d8 40 83 61 c9  4c 72 2b 9d ae db 46 06  |....@.a.Lr+...F.|
+00000280  06 4d f4 c1 b3 3e c0 d1  bd 42 d4 db fe 3d 13 60  |.M...>...B...=.`|
+00000290  84 5c 21 d3 3b e9 fa e7  16 03 03 00 23 0d 00 00  |.\!.;.......#...|
+000002a0  1f 02 01 40 00 18 08 04  04 03 08 07 08 05 08 06  |...@............|
+000002b0  04 01 05 01 06 01 05 03  06 03 02 01 02 03 00 00  |................|
+000002c0  16 03 03 00 04 0e 00 00  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 a9  b6 12 e2 84 71 62 7a 20  |............qbz |
-00000020  63 80 99 c6 ee f7 61 f9  74 d6 0b ab 31 74 69 ca  |c.....a.t...1ti.|
-00000030  94 20 9e 1b 0e 52 45 c4  f4 b3 cb fb a4 07 61 6f  |. ...RE.......ao|
-00000040  a1 5a 84 4c 4f f6 4a e4  bc c5 c2 b0 ee 8a 30 5b  |.Z.LO.J.......0[|
-00000050  10 e0 ed d3 4c b7 32 8c  ed 3f 89 a7 a7 95 60 86  |....L.2..?....`.|
-00000060  97 1a ae ab 2f 5c e6 6d  1b c3 35 bd f5 c1 f0 1a  |..../\.m..5.....|
-00000070  d4 70 e5 00 f2 d4 d1 20  6a 82 db e7 52 ca 88 e5  |.p..... j...R...|
-00000080  2d cc 79 0c f6 09 84 65  f0 30 41 67 10 0a 48 d1  |-.y....e.0Ag..H.|
-00000090  09 3e 56 7a aa 57 bc 14  03 03 00 01 01 16 03 03  |.>Vz.W..........|
-000000a0  00 40 e6 0a 91 5f 30 f8  52 75 94 8e ab 82 ec 1d  |.@..._0.Ru......|
-000000b0  b7 a1 1c 18 1a aa 1c f8  73 93 0e 20 ad 68 a7 65  |........s.. .h.e|
-000000c0  86 c9 f5 90 f9 b2 fd d1  32 94 52 6e 82 9b b9 45  |........2.Rn...E|
-000000d0  97 52 4b 1e c2 31 a6 2e  c8 b3 1a 62 22 83 8f df  |.RK..1.....b"...|
-000000e0  d7 06                                             |..|
+00000010  86 10 00 00 82 00 80 2e  37 44 fb d7 1d 2f 3d a5  |........7D.../=.|
+00000020  1b 43 cf f4 1c cf 9d 95  fa be 9f 9d 96 8a 27 5d  |.C............']|
+00000030  7b be 19 10 bd 5e 9a 3e  49 49 d2 af 85 07 70 f8  |{....^.>II....p.|
+00000040  c8 4f 69 02 ff 4e 9d ee  f4 0d 4d 54 a1 aa 61 a3  |.Oi..N....MT..a.|
+00000050  e0 cc db a7 2c 46 80 6e  eb 10 fb cd 2e 3b c5 50  |....,F.n.....;.P|
+00000060  2b a5 d9 a0 bf 01 d2 f8  d8 51 2b ad 40 6f c6 6f  |+........Q+.@o.o|
+00000070  0e 30 53 27 73 89 b7 1b  c1 28 ff ff 18 4c fa 6f  |.0S's....(...L.o|
+00000080  fa 5f 16 b3 38 36 9f f4  07 74 ca bb bb c2 3f aa  |._..86...t....?.|
+00000090  0d e7 42 24 fb f8 4c 14  03 03 00 01 01 16 03 03  |..B$..L.........|
+000000a0  00 40 19 02 9e 3a ce b9  38 40 ce d6 3b 87 b2 f6  |.@...:..8@..;...|
+000000b0  1b 7d ee 76 62 f8 6e 04  80 8f cb 1b f7 1e 1d a6  |.}.vb.n.........|
+000000c0  50 8a 59 b1 ad 7d c5 9d  2f 2d 14 56 2e e5 3b b3  |P.Y..}../-.V..;.|
+000000d0  db da 7e 37 10 97 71 91  d3 7b 93 f6 64 a4 d7 8b  |..~7..q..{..d...|
+000000e0  d2 f0                                             |..|
 >>> 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 b0 2c 61 79 87  |............,ay.|
-00000020  59 d4 9e 4d e7 56 4a 34  ba 78 d5 06 98 a2 92 35  |Y..M.VJ4.x.....5|
-00000030  a1 fc 57 5a 6e d3 0f 44  08 1c a1 7b 3c d3 f1 86  |..WZn..D...{<...|
-00000040  a2 04 04 5e 1b 7c 00 4f  51 71 73 17 03 03 00 40  |...^.|.OQqs....@|
+00000010  00 00 00 00 00 00 00 00  00 00 00 46 c8 31 06 11  |...........F.1..|
+00000020  01 8e df b0 e7 cc 16 d3  97 2e a2 68 e7 a4 d1 0f  |...........h....|
+00000030  91 71 dd ba db 97 20 45  60 c2 47 c7 ee 56 c4 68  |.q.... E`.G..V.h|
+00000040  a4 b1 05 09 e2 68 4d 54  fa ff 01 17 03 03 00 40  |.....hMT.......@|
 00000050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000060  aa 5c 1a 9a 70 bc b3 fb  70 07 0b 24 cb 95 84 61  |.\..p...p..$...a|
-00000070  96 ed d8 97 2f d6 79 51  ed cd 67 44 e5 d4 a3 57  |..../.yQ..gD...W|
-00000080  95 f6 c8 31 a8 95 c2 07  a4 ce 1c fc 4a dc 93 d9  |...1........J...|
+00000060  79 bf ad 63 e3 11 2b d0  41 0e 24 85 92 c4 9b b5  |y..c..+.A.$.....|
+00000070  b2 d3 2e fc aa 46 84 85  a7 37 90 fc f0 2b 5a 7e  |.....F...7...+Z~|
+00000080  28 9f 2e 57 1d 8f c3 ca  eb 40 32 79 af 4b b8 28  |(..W.....@2y.K.(|
 00000090  15 03 03 00 30 00 00 00  00 00 00 00 00 00 00 00  |....0...........|
-000000a0  00 00 00 00 00 ae dd c4  f4 04 d3 b1 1a 8a 56 f7  |..............V.|
-000000b0  73 c9 d5 aa 6c 59 d7 66  77 34 64 2d 19 79 13 80  |s...lY.fw4d-.y..|
-000000c0  98 60 6d f4 d9                                    |.`m..|
+000000a0  00 00 00 00 00 8b 6c 27  b8 ff f9 ea ca 68 75 54  |......l'.....huT|
+000000b0  bf bf a7 f4 b1 58 a5 b3  31 01 4d c7 85 58 31 d4  |.....X..1.M..X1.|
+000000c0  e7 da 7e 77 68                                    |..~wh|
diff --git a/src/crypto/tls/testdata/Server-TLSv12-ECDHE-ECDSA-AES b/src/crypto/tls/testdata/Server-TLSv12-ECDHE-ECDSA-AES
index 62f4311..697b810 100644
--- a/src/crypto/tls/testdata/Server-TLSv12-ECDHE-ECDSA-AES
+++ b/src/crypto/tls/testdata/Server-TLSv12-ECDHE-ECDSA-AES
@@ -1,7 +1,7 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 85 01 00 00  81 03 03 20 34 f0 4b 7a  |........... 4.Kz|
-00000010  4f ed 31 de 38 ef 33 2e  69 7d 74 35 e5 02 b9 bb  |O.1.8.3.i}t5....|
-00000020  bd 1a 5c 3a f2 57 f1 23  62 66 52 00 00 04 c0 0a  |..\:.W.#bfR.....|
+00000000  16 03 01 00 85 01 00 00  81 03 03 83 21 a6 e4 ea  |............!...|
+00000010  e9 7b 3a 7c 72 28 ee 68  c5 c7 fa f1 98 ed 4a be  |.{:|r(.h......J.|
+00000020  b8 42 13 fb d3 ab 63 16  d2 74 c8 00 00 04 c0 0a  |.B....c..t......|
 00000030  00 ff 01 00 00 54 00 0b  00 04 03 00 01 02 00 0a  |.....T..........|
 00000040  00 0c 00 0a 00 1d 00 17  00 1e 00 19 00 18 00 16  |................|
 00000050  00 00 00 17 00 00 00 0d  00 30 00 2e 04 03 05 03  |.........0......|
@@ -9,76 +9,76 @@
 00000070  08 06 04 01 05 01 06 01  03 03 02 03 03 01 02 01  |................|
 00000080  03 02 02 02 04 02 05 02  06 02                    |..........|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 37 02 00 00  33 03 03 00 00 00 00 00  |....7...3.......|
+00000000  16 03 03 00 3b 02 00 00  37 03 03 00 00 00 00 00  |....;...7.......|
 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000020  00 00 00 44 4f 57 4e 47  52 44 01 00 c0 0a 00 00  |...DOWNGRD......|
-00000030  0b ff 01 00 01 00 00 0b  00 02 01 00 16 03 03 02  |................|
-00000040  0e 0b 00 02 0a 00 02 07  00 02 04 30 82 02 00 30  |...........0...0|
-00000050  82 01 62 02 09 00 b8 bf  2d 47 a0 d2 eb f4 30 09  |..b.....-G....0.|
-00000060  06 07 2a 86 48 ce 3d 04  01 30 45 31 0b 30 09 06  |..*.H.=..0E1.0..|
-00000070  03 55 04 06 13 02 41 55  31 13 30 11 06 03 55 04  |.U....AU1.0...U.|
-00000080  08 13 0a 53 6f 6d 65 2d  53 74 61 74 65 31 21 30  |...Some-State1!0|
-00000090  1f 06 03 55 04 0a 13 18  49 6e 74 65 72 6e 65 74  |...U....Internet|
-000000a0  20 57 69 64 67 69 74 73  20 50 74 79 20 4c 74 64  | Widgits Pty Ltd|
-000000b0  30 1e 17 0d 31 32 31 31  32 32 31 35 30 36 33 32  |0...121122150632|
-000000c0  5a 17 0d 32 32 31 31 32  30 31 35 30 36 33 32 5a  |Z..221120150632Z|
-000000d0  30 45 31 0b 30 09 06 03  55 04 06 13 02 41 55 31  |0E1.0...U....AU1|
-000000e0  13 30 11 06 03 55 04 08  13 0a 53 6f 6d 65 2d 53  |.0...U....Some-S|
-000000f0  74 61 74 65 31 21 30 1f  06 03 55 04 0a 13 18 49  |tate1!0...U....I|
-00000100  6e 74 65 72 6e 65 74 20  57 69 64 67 69 74 73 20  |nternet Widgits |
-00000110  50 74 79 20 4c 74 64 30  81 9b 30 10 06 07 2a 86  |Pty Ltd0..0...*.|
-00000120  48 ce 3d 02 01 06 05 2b  81 04 00 23 03 81 86 00  |H.=....+...#....|
-00000130  04 00 c4 a1 ed be 98 f9  0b 48 73 36 7e c3 16 56  |.........Hs6~..V|
-00000140  11 22 f2 3d 53 c3 3b 4d  21 3d cd 6b 75 e6 f6 b0  |.".=S.;M!=.ku...|
-00000150  dc 9a df 26 c1 bc b2 87  f0 72 32 7c b3 64 2f 1c  |...&.....r2|.d/.|
-00000160  90 bc ea 68 23 10 7e fe  e3 25 c0 48 3a 69 e0 28  |...h#.~..%.H:i.(|
-00000170  6d d3 37 00 ef 04 62 dd  0d a0 9c 70 62 83 d8 81  |m.7...b....pb...|
-00000180  d3 64 31 aa 9e 97 31 bd  96 b0 68 c0 9b 23 de 76  |.d1...1...h..#.v|
-00000190  64 3f 1a 5c 7f e9 12 0e  58 58 b6 5f 70 dd 9b d8  |d?.\....XX._p...|
-000001a0  ea d5 d7 f5 d5 cc b9 b6  9f 30 66 5b 66 9a 20 e2  |.........0f[f. .|
-000001b0  27 e5 bf fe 3b 30 09 06  07 2a 86 48 ce 3d 04 01  |'...;0...*.H.=..|
-000001c0  03 81 8c 00 30 81 88 02  42 01 88 a2 4f eb e2 45  |....0...B...O..E|
-000001d0  c5 48 7d 1b ac f5 ed 98  9d ae 47 70 c0 5e 1b b6  |.H}.......Gp.^..|
-000001e0  2f bd f1 b6 4d b7 61 40  d3 11 a2 ce ee 0b 7e 92  |/...M.a@......~.|
-000001f0  7e ff 76 9d c3 3b 7e a5  3f ce fa 10 e2 59 ec 47  |~.v..;~.?....Y.G|
-00000200  2d 7c ac da 4e 97 0e 15  a0 6f d0 02 42 01 4d fc  |-|..N....o..B.M.|
-00000210  be 67 13 9c 2d 05 0e bd  3f a3 8c 25 c1 33 13 83  |.g..-...?..%.3..|
-00000220  0d 94 06 bb d4 37 7a f6  ec 7a c9 86 2e dd d7 11  |.....7z..z......|
-00000230  69 7f 85 7c 56 de fb 31  78 2b e4 c7 78 0d ae cb  |i..|V..1x+..x...|
-00000240  be 9e 4e 36 24 31 7b 6a  0f 39 95 12 07 8f 2a 16  |..N6$1{j.9....*.|
-00000250  03 03 00 b6 0c 00 00 b2  03 00 1d 20 2f e5 7d a3  |........... /.}.|
-00000260  47 cd 62 43 15 28 da ac  5f bb 29 07 30 ff f6 84  |G.bC.(.._.).0...|
-00000270  af c4 cf c2 ed 90 99 5f  58 cb 3b 74 04 03 00 8a  |......._X.;t....|
-00000280  30 81 87 02 41 21 2b cf  6b fc 8a 13 b6 21 8a 46  |0...A!+.k....!.F|
-00000290  fc 7c 56 7e 28 22 4d b2  c2 c8 45 92 cc 99 6a 3c  |.|V~("M...E...j<|
-000002a0  48 0f 16 95 6c 43 3d ea  bd ac 25 88 a3 35 0c 14  |H...lC=...%..5..|
-000002b0  c6 43 46 16 ec b5 57 76  86 1c 5a d1 52 44 3b 8c  |.CF...Wv..Z.RD;.|
-000002c0  e5 b3 46 3b 47 d8 02 42  01 ad a2 c3 4c 69 35 13  |..F;G..B....Li5.|
-000002d0  d7 66 37 63 c9 43 50 68  f6 ff 7f 7d be 7e 8d 89  |.f7c.CPh...}.~..|
-000002e0  db 57 3e 0f 51 c8 49 9b  3a e2 87 65 dd 28 21 9a  |.W>.Q.I.:..e.(!.|
-000002f0  c3 36 28 a4 e8 25 7b ae  8e 45 35 22 8f 2d 97 27  |.6(..%{..E5".-.'|
-00000300  fe b8 99 a9 c1 5f d8 8b  70 d3 16 03 03 00 04 0e  |....._..p.......|
-00000310  00 00 00                                          |...|
+00000030  0f ff 01 00 01 00 00 17  00 00 00 0b 00 02 01 00  |................|
+00000040  16 03 03 02 0e 0b 00 02  0a 00 02 07 00 02 04 30  |...............0|
+00000050  82 02 00 30 82 01 62 02  09 00 b8 bf 2d 47 a0 d2  |...0..b.....-G..|
+00000060  eb f4 30 09 06 07 2a 86  48 ce 3d 04 01 30 45 31  |..0...*.H.=..0E1|
+00000070  0b 30 09 06 03 55 04 06  13 02 41 55 31 13 30 11  |.0...U....AU1.0.|
+00000080  06 03 55 04 08 13 0a 53  6f 6d 65 2d 53 74 61 74  |..U....Some-Stat|
+00000090  65 31 21 30 1f 06 03 55  04 0a 13 18 49 6e 74 65  |e1!0...U....Inte|
+000000a0  72 6e 65 74 20 57 69 64  67 69 74 73 20 50 74 79  |rnet Widgits Pty|
+000000b0  20 4c 74 64 30 1e 17 0d  31 32 31 31 32 32 31 35  | Ltd0...12112215|
+000000c0  30 36 33 32 5a 17 0d 32  32 31 31 32 30 31 35 30  |0632Z..221120150|
+000000d0  36 33 32 5a 30 45 31 0b  30 09 06 03 55 04 06 13  |632Z0E1.0...U...|
+000000e0  02 41 55 31 13 30 11 06  03 55 04 08 13 0a 53 6f  |.AU1.0...U....So|
+000000f0  6d 65 2d 53 74 61 74 65  31 21 30 1f 06 03 55 04  |me-State1!0...U.|
+00000100  0a 13 18 49 6e 74 65 72  6e 65 74 20 57 69 64 67  |...Internet Widg|
+00000110  69 74 73 20 50 74 79 20  4c 74 64 30 81 9b 30 10  |its Pty Ltd0..0.|
+00000120  06 07 2a 86 48 ce 3d 02  01 06 05 2b 81 04 00 23  |..*.H.=....+...#|
+00000130  03 81 86 00 04 00 c4 a1  ed be 98 f9 0b 48 73 36  |.............Hs6|
+00000140  7e c3 16 56 11 22 f2 3d  53 c3 3b 4d 21 3d cd 6b  |~..V.".=S.;M!=.k|
+00000150  75 e6 f6 b0 dc 9a df 26  c1 bc b2 87 f0 72 32 7c  |u......&.....r2||
+00000160  b3 64 2f 1c 90 bc ea 68  23 10 7e fe e3 25 c0 48  |.d/....h#.~..%.H|
+00000170  3a 69 e0 28 6d d3 37 00  ef 04 62 dd 0d a0 9c 70  |:i.(m.7...b....p|
+00000180  62 83 d8 81 d3 64 31 aa  9e 97 31 bd 96 b0 68 c0  |b....d1...1...h.|
+00000190  9b 23 de 76 64 3f 1a 5c  7f e9 12 0e 58 58 b6 5f  |.#.vd?.\....XX._|
+000001a0  70 dd 9b d8 ea d5 d7 f5  d5 cc b9 b6 9f 30 66 5b  |p............0f[|
+000001b0  66 9a 20 e2 27 e5 bf fe  3b 30 09 06 07 2a 86 48  |f. .'...;0...*.H|
+000001c0  ce 3d 04 01 03 81 8c 00  30 81 88 02 42 01 88 a2  |.=......0...B...|
+000001d0  4f eb e2 45 c5 48 7d 1b  ac f5 ed 98 9d ae 47 70  |O..E.H}.......Gp|
+000001e0  c0 5e 1b b6 2f bd f1 b6  4d b7 61 40 d3 11 a2 ce  |.^../...M.a@....|
+000001f0  ee 0b 7e 92 7e ff 76 9d  c3 3b 7e a5 3f ce fa 10  |..~.~.v..;~.?...|
+00000200  e2 59 ec 47 2d 7c ac da  4e 97 0e 15 a0 6f d0 02  |.Y.G-|..N....o..|
+00000210  42 01 4d fc be 67 13 9c  2d 05 0e bd 3f a3 8c 25  |B.M..g..-...?..%|
+00000220  c1 33 13 83 0d 94 06 bb  d4 37 7a f6 ec 7a c9 86  |.3.......7z..z..|
+00000230  2e dd d7 11 69 7f 85 7c  56 de fb 31 78 2b e4 c7  |....i..|V..1x+..|
+00000240  78 0d ae cb be 9e 4e 36  24 31 7b 6a 0f 39 95 12  |x.....N6$1{j.9..|
+00000250  07 8f 2a 16 03 03 00 b7  0c 00 00 b3 03 00 1d 20  |..*............ |
+00000260  2f e5 7d a3 47 cd 62 43  15 28 da ac 5f bb 29 07  |/.}.G.bC.(.._.).|
+00000270  30 ff f6 84 af c4 cf c2  ed 90 99 5f 58 cb 3b 74  |0.........._X.;t|
+00000280  04 03 00 8b 30 81 88 02  42 00 b9 39 44 59 12 77  |....0...B..9DY.w|
+00000290  8d e2 79 25 01 d1 6a 05  3d 53 ea f3 91 d6 c5 09  |..y%..j.=S......|
+000002a0  24 bd 0c ad 24 cc 1c a7  fb 03 eb 0a 0d f4 30 96  |$...$.........0.|
+000002b0  8d 28 a1 b3 64 ba 30 27  95 29 23 22 91 62 c3 1f  |.(..d.0'.)#".b..|
+000002c0  51 aa c8 be 17 85 31 8e  f5 40 3e 02 42 00 ee a1  |Q.....1..@>.B...|
+000002d0  64 14 a1 52 b3 e5 54 c9  24 53 94 5a 43 d8 4f 79  |d..R..T.$S.ZC.Oy|
+000002e0  69 4b a8 51 ee de b3 b0  f7 1a 57 a3 28 72 d2 13  |iK.Q......W.(r..|
+000002f0  a6 d3 17 0b c4 45 34 7f  10 3b 81 cb 0c 8d 51 b6  |.....E4..;....Q.|
+00000300  0b 86 21 d0 ee 1d 7e 73  6b ea 77 8c 66 dc 65 16  |..!...~sk.w.f.e.|
+00000310  03 03 00 04 0e 00 00 00                           |........|
 >>> Flow 3 (client to server)
-00000000  16 03 03 00 25 10 00 00  21 20 c4 25 45 6f 39 18  |....%...! .%Eo9.|
-00000010  b1 f6 0a b3 f7 3e 98 ed  63 ae bd 74 12 91 0d 81  |.....>..c..t....|
-00000020  84 71 13 3c a7 cf a5 d2  24 5f 14 03 03 00 01 01  |.q.<....$_......|
-00000030  16 03 03 00 40 27 8d 44  74 7a ae 8a 4e 1c f9 1b  |....@'.Dtz..N...|
-00000040  05 23 c4 89 57 27 4c dc  db 4a ae aa 08 74 00 55  |.#..W'L..J...t.U|
-00000050  f9 4e 63 02 75 24 ca fb  30 78 cc 82 8a 69 be ab  |.Nc.u$..0x...i..|
-00000060  10 9d 25 2d a8 b6 bb 64  6e 32 68 4b 0a 32 06 74  |..%-...dn2hK.2.t|
-00000070  26 5e bc 68 25                                    |&^.h%|
+00000000  16 03 03 00 25 10 00 00  21 20 ed 3e ba a7 43 53  |....%...! .>..CS|
+00000010  5e e4 60 aa 31 3f e1 69  60 32 25 3d fd 8b 32 da  |^.`.1?.i`2%=..2.|
+00000020  f2 c5 db c7 02 e6 4d d0  de 15 14 03 03 00 01 01  |......M.........|
+00000030  16 03 03 00 40 ee 28 f2  27 82 24 9d 17 d1 48 7a  |....@.(.'.$...Hz|
+00000040  74 2d dd 16 18 b7 70 97  2f 2b 91 47 eb c2 1d ae  |t-....p./+.G....|
+00000050  3f 48 52 cd ff e7 9e 0b  35 ad 1f 60 5e 07 b1 5e  |?HR.....5..`^..^|
+00000060  1c ba 6a 85 bb 6b 30 94  41 8a 59 81 cf 37 5f 26  |..j..k0.A.Y..7_&|
+00000070  b1 52 36 5f df                                    |.R6_.|
 >>> 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 b0 cf 70 b3 00  |.............p..|
-00000020  89 e2 77 af 87 08 f5 2f  2c c8 75 ce 8a ed 30 d8  |..w..../,.u...0.|
-00000030  f7 44 f3 9d 8b 4c 42 7a  52 d0 c8 37 9b 45 46 1c  |.D...LBzR..7.EF.|
-00000040  56 3b ee 52 5d c4 72 04  13 49 aa 17 03 03 00 40  |V;.R].r..I.....@|
+00000010  00 00 00 00 00 00 00 00  00 00 00 f5 05 5a a6 22  |.............Z."|
+00000020  90 4e 8d d9 f1 55 c4 78  f2 ec 9d 97 cd fe af ae  |.N...U.x........|
+00000030  b7 62 00 67 2e b2 d9 1e  0c a3 c8 6a bf d2 3c 42  |.b.g.......j..<B|
+00000040  c4 0a d1 08 36 64 8e bd  0a 2f a2 17 03 03 00 40  |....6d.../.....@|
 00000050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000060  ce c4 34 c2 d8 4e f5 db  d1 ff 6d 64 ae 39 6d 78  |..4..N....md.9mx|
-00000070  3c c4 57 32 d1 af 35 d3  b4 79 3c b4 bd a1 21 7b  |<.W2..5..y<...!{|
-00000080  1f ef b8 3c 97 37 18 e5  10 62 e8 3d 7d 12 f5 db  |...<.7...b.=}...|
+00000060  ef 16 5e cb e7 c4 2d a8  76 77 da 18 91 bd cb 78  |..^...-.vw.....x|
+00000070  76 c5 5d 70 e5 ba 57 2a  1f 2b 11 3f 18 18 e6 1b  |v.]p..W*.+.?....|
+00000080  36 78 c9 f1 5e 71 f1 71  f1 01 31 e6 37 fa 76 92  |6x..^q.q..1.7.v.|
 00000090  15 03 03 00 30 00 00 00  00 00 00 00 00 00 00 00  |....0...........|
-000000a0  00 00 00 00 00 81 75 ae  71 18 61 61 ae 35 ce c8  |......u.q.aa.5..|
-000000b0  43 57 52 c9 68 5e 0d 63  c4 0e 7d 36 90 b2 f6 f6  |CWR.h^.c..}6....|
-000000c0  ea 72 3c d9 41                                    |.r<.A|
+000000a0  00 00 00 00 00 13 3e 42  a5 61 84 ae 49 8b b9 91  |......>B.a..I...|
+000000b0  c2 a3 76 74 1e 4f 53 0a  fc 71 de 0d d2 44 c8 ac  |..vt.OS..q...D..|
+000000c0  2e 09 27 e6 ad                                    |..'..|
diff --git a/src/crypto/tls/testdata/Server-TLSv12-Ed25519 b/src/crypto/tls/testdata/Server-TLSv12-Ed25519
index dd34592..42bb154 100644
--- a/src/crypto/tls/testdata/Server-TLSv12-Ed25519
+++ b/src/crypto/tls/testdata/Server-TLSv12-Ed25519
@@ -1,7 +1,7 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 85 01 00 00  81 03 03 f0 8d 1b 90 67  |...............g|
-00000010  3b 23 46 ac f7 79 f2 f9  e8 90 98 b3 52 b2 55 2a  |;#F..y......R.U*|
-00000020  fb 0f 1e dd 4f b3 75 4b  9b 88 0e 00 00 04 cc a9  |....O.uK........|
+00000000  16 03 01 00 85 01 00 00  81 03 03 f3 04 e3 e7 a2  |................|
+00000010  39 79 b2 9e 94 35 cf c3  a8 54 77 ab 96 72 b6 40  |9y...5...Tw..r.@|
+00000020  de 59 6b cf d4 f5 f4 2c  fd 7d f6 00 00 04 cc a9  |.Yk....,.}......|
 00000030  00 ff 01 00 00 54 00 0b  00 04 03 00 01 02 00 0a  |.....T..........|
 00000040  00 0c 00 0a 00 1d 00 17  00 1e 00 19 00 18 00 16  |................|
 00000050  00 00 00 17 00 00 00 0d  00 30 00 2e 04 03 05 03  |.........0......|
@@ -9,50 +9,50 @@
 00000070  08 06 04 01 05 01 06 01  03 03 02 03 03 01 02 01  |................|
 00000080  03 02 02 02 04 02 05 02  06 02                    |..........|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 37 02 00 00  33 03 03 00 00 00 00 00  |....7...3.......|
+00000000  16 03 03 00 3b 02 00 00  37 03 03 00 00 00 00 00  |....;...7.......|
 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000020  00 00 00 44 4f 57 4e 47  52 44 01 00 cc a9 00 00  |...DOWNGRD......|
-00000030  0b ff 01 00 01 00 00 0b  00 02 01 00 16 03 03 01  |................|
-00000040  3c 0b 00 01 38 00 01 35  00 01 32 30 82 01 2e 30  |<...8..5..20...0|
-00000050  81 e1 a0 03 02 01 02 02  10 0f 43 1c 42 57 93 94  |..........C.BW..|
-00000060  1d e9 87 e4 f1 ad 15 00  5d 30 05 06 03 2b 65 70  |........]0...+ep|
-00000070  30 12 31 10 30 0e 06 03  55 04 0a 13 07 41 63 6d  |0.1.0...U....Acm|
-00000080  65 20 43 6f 30 1e 17 0d  31 39 30 35 31 36 32 31  |e Co0...19051621|
-00000090  33 38 30 31 5a 17 0d 32  30 30 35 31 35 32 31 33  |3801Z..200515213|
-000000a0  38 30 31 5a 30 12 31 10  30 0e 06 03 55 04 0a 13  |801Z0.1.0...U...|
-000000b0  07 41 63 6d 65 20 43 6f  30 2a 30 05 06 03 2b 65  |.Acme Co0*0...+e|
-000000c0  70 03 21 00 3f e2 15 2e  e6 e3 ef 3f 4e 85 4a 75  |p.!.?......?N.Ju|
-000000d0  77 a3 64 9e ed e0 bf 84  2c cc 92 26 8f fa 6f 34  |w.d.....,..&..o4|
-000000e0  83 aa ec 8f a3 4d 30 4b  30 0e 06 03 55 1d 0f 01  |.....M0K0...U...|
-000000f0  01 ff 04 04 03 02 05 a0  30 13 06 03 55 1d 25 04  |........0...U.%.|
-00000100  0c 30 0a 06 08 2b 06 01  05 05 07 03 01 30 0c 06  |.0...+.......0..|
-00000110  03 55 1d 13 01 01 ff 04  02 30 00 30 16 06 03 55  |.U.......0.0...U|
-00000120  1d 11 04 0f 30 0d 82 0b  65 78 61 6d 70 6c 65 2e  |....0...example.|
-00000130  63 6f 6d 30 05 06 03 2b  65 70 03 41 00 63 44 ed  |com0...+ep.A.cD.|
-00000140  9c c4 be 53 24 53 9f d2  10 8d 9f e8 21 08 90 95  |...S$S......!...|
-00000150  39 e5 0d c1 55 ff 2c 16  b7 1d fc ab 7d 4d d4 e0  |9...U.,.....}M..|
-00000160  93 13 d0 a9 42 e0 b6 6b  fe 5d 67 48 d7 9f 50 bc  |....B..k.]gH..P.|
-00000170  6c cd 4b 03 83 7c f2 08  58 cd ac cf 0c 16 03 03  |l.K..|..X.......|
-00000180  00 6c 0c 00 00 68 03 00  1d 20 2f e5 7d a3 47 cd  |.l...h... /.}.G.|
-00000190  62 43 15 28 da ac 5f bb  29 07 30 ff f6 84 af c4  |bC.(.._.).0.....|
-000001a0  cf c2 ed 90 99 5f 58 cb  3b 74 08 07 00 40 1f 56  |....._X.;t...@.V|
-000001b0  21 8a 44 04 69 65 ee f8  93 52 4c f0 49 42 57 4c  |!.D.ie...RL.IBWL|
-000001c0  5b f5 1a ef 43 ad 39 93  03 a3 64 84 da e5 82 32  |[...C.9...d....2|
-000001d0  fc 77 12 61 f3 f4 2c d8  61 9e 86 01 1f c0 a0 98  |.w.a..,.a.......|
-000001e0  94 a3 7f 15 75 c8 e6 2f  20 bd af 7c be 0e 16 03  |....u../ ..|....|
-000001f0  03 00 04 0e 00 00 00                              |.......|
+00000030  0f ff 01 00 01 00 00 17  00 00 00 0b 00 02 01 00  |................|
+00000040  16 03 03 01 3c 0b 00 01  38 00 01 35 00 01 32 30  |....<...8..5..20|
+00000050  82 01 2e 30 81 e1 a0 03  02 01 02 02 10 0f 43 1c  |...0..........C.|
+00000060  42 57 93 94 1d e9 87 e4  f1 ad 15 00 5d 30 05 06  |BW..........]0..|
+00000070  03 2b 65 70 30 12 31 10  30 0e 06 03 55 04 0a 13  |.+ep0.1.0...U...|
+00000080  07 41 63 6d 65 20 43 6f  30 1e 17 0d 31 39 30 35  |.Acme Co0...1905|
+00000090  31 36 32 31 33 38 30 31  5a 17 0d 32 30 30 35 31  |16213801Z..20051|
+000000a0  35 32 31 33 38 30 31 5a  30 12 31 10 30 0e 06 03  |5213801Z0.1.0...|
+000000b0  55 04 0a 13 07 41 63 6d  65 20 43 6f 30 2a 30 05  |U....Acme Co0*0.|
+000000c0  06 03 2b 65 70 03 21 00  3f e2 15 2e e6 e3 ef 3f  |..+ep.!.?......?|
+000000d0  4e 85 4a 75 77 a3 64 9e  ed e0 bf 84 2c cc 92 26  |N.Juw.d.....,..&|
+000000e0  8f fa 6f 34 83 aa ec 8f  a3 4d 30 4b 30 0e 06 03  |..o4.....M0K0...|
+000000f0  55 1d 0f 01 01 ff 04 04  03 02 05 a0 30 13 06 03  |U...........0...|
+00000100  55 1d 25 04 0c 30 0a 06  08 2b 06 01 05 05 07 03  |U.%..0...+......|
+00000110  01 30 0c 06 03 55 1d 13  01 01 ff 04 02 30 00 30  |.0...U.......0.0|
+00000120  16 06 03 55 1d 11 04 0f  30 0d 82 0b 65 78 61 6d  |...U....0...exam|
+00000130  70 6c 65 2e 63 6f 6d 30  05 06 03 2b 65 70 03 41  |ple.com0...+ep.A|
+00000140  00 63 44 ed 9c c4 be 53  24 53 9f d2 10 8d 9f e8  |.cD....S$S......|
+00000150  21 08 90 95 39 e5 0d c1  55 ff 2c 16 b7 1d fc ab  |!...9...U.,.....|
+00000160  7d 4d d4 e0 93 13 d0 a9  42 e0 b6 6b fe 5d 67 48  |}M......B..k.]gH|
+00000170  d7 9f 50 bc 6c cd 4b 03  83 7c f2 08 58 cd ac cf  |..P.l.K..|..X...|
+00000180  0c 16 03 03 00 6c 0c 00  00 68 03 00 1d 20 2f e5  |.....l...h... /.|
+00000190  7d a3 47 cd 62 43 15 28  da ac 5f bb 29 07 30 ff  |}.G.bC.(.._.).0.|
+000001a0  f6 84 af c4 cf c2 ed 90  99 5f 58 cb 3b 74 08 07  |........._X.;t..|
+000001b0  00 40 a2 12 66 be 81 b1  24 93 f2 e1 60 9f c4 13  |.@..f...$...`...|
+000001c0  04 3f 39 77 8f fe e4 33  5b f7 9d 84 f5 0f 96 aa  |.?9w...3[.......|
+000001d0  a0 d6 9d da ae b2 eb 76  64 02 82 58 d4 bc 5a 44  |.......vd..X..ZD|
+000001e0  b9 5a f5 33 57 fa a6 9c  d5 05 84 9a 19 0b 65 37  |.Z.3W.........e7|
+000001f0  bc 05 16 03 03 00 04 0e  00 00 00                 |...........|
 >>> Flow 3 (client to server)
-00000000  16 03 03 00 25 10 00 00  21 20 26 b0 6c 90 e7 71  |....%...! &.l..q|
-00000010  23 78 4b a1 a1 32 7c 28  e9 df 7e 98 e9 78 be 8d  |#xK..2|(..~..x..|
-00000020  0d ec fc 30 82 99 16 f0  9f 20 14 03 03 00 01 01  |...0..... ......|
-00000030  16 03 03 00 20 e9 81 b0  ea b3 f3 21 40 9a 3b 3e  |.... ......!@.;>|
-00000040  71 a7 13 f5 3a 8a cd 86  34 8b 7e 41 b5 2a 1b 03  |q...:...4.~A.*..|
-00000050  29 77 b3 b2 da                                    |)w...|
+00000000  16 03 03 00 25 10 00 00  21 20 95 58 05 04 03 27  |....%...! .X...'|
+00000010  5e 14 d4 41 5a 3b eb d3  13 ad d4 16 fb 43 bf d6  |^..AZ;.......C..|
+00000020  7c 0a 1e a9 6c f9 72 84  47 1a 14 03 03 00 01 01  ||...l.r.G.......|
+00000030  16 03 03 00 20 06 f8 af  f4 38 35 de 88 74 d6 cc  |.... ....85..t..|
+00000040  a8 fa 2c ee a4 88 42 5c  4a aa 62 49 dc 32 da 15  |..,...B\J.bI.2..|
+00000050  1d 9c 5a b8 59                                    |..Z.Y|
 >>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 20 54 5a ff 09 7d  |.......... TZ..}|
-00000010  46 04 40 62 c5 63 71 85  c7 b4 6c 09 ee 15 71 6b  |F.@b.cq...l...qk|
-00000020  60 3b 00 3d 46 47 13 a5  f7 15 16 17 03 03 00 1d  |`;.=FG..........|
-00000030  13 8d 00 50 58 d0 2a 47  a8 d8 de 87 d4 3e ff ee  |...PX.*G.....>..|
-00000040  f1 4d 6b 25 94 6f 01 7b  70 ee 53 d9 be 15 03 03  |.Mk%.o.{p.S.....|
-00000050  00 12 13 ea 17 69 00 0e  2b ae 21 a9 5e 0a 41 2d  |.....i..+.!.^.A-|
-00000060  1b 73 f0 2d                                       |.s.-|
+00000000  14 03 03 00 01 01 16 03  03 00 20 3a 16 00 b6 c5  |.......... :....|
+00000010  76 1f 39 6b 17 2d 2f 34  83 c2 fd 1b 57 c4 0c 02  |v.9k.-/4....W...|
+00000020  18 16 6c d2 92 69 63 9b  32 33 e0 17 03 03 00 1d  |..l..ic.23......|
+00000030  04 97 df f0 2c 4b 3d 69  99 36 eb 0b 11 56 97 ab  |....,K=i.6...V..|
+00000040  98 5d d9 d4 6f 93 92 5c  cc f6 7e 77 40 15 03 03  |.]..o..\..~w@...|
+00000050  00 12 58 cf 6e 90 04 6b  ae 4f cf 6b 71 15 80 22  |..X.n..k.O.kq.."|
+00000060  f5 80 fa df                                       |....|
diff --git a/src/crypto/tls/testdata/Server-TLSv12-ExportKeyingMaterial b/src/crypto/tls/testdata/Server-TLSv12-ExportKeyingMaterial
index e01c32c..ff8d635 100644
--- a/src/crypto/tls/testdata/Server-TLSv12-ExportKeyingMaterial
+++ b/src/crypto/tls/testdata/Server-TLSv12-ExportKeyingMaterial
@@ -1,7 +1,7 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 89 01 00 00  85 03 03 9a d9 fe da 40  |...............@|
-00000010  cf 8b ed 11 09 8e 3f 29  4b 0d 46 ff fc f6 56 2c  |......?)K.F...V,|
-00000020  a8 e7 16 84 8a a4 e9 44  89 97 0b 00 00 04 cc a8  |.......D........|
+00000000  16 03 01 00 89 01 00 00  85 03 03 ad 13 87 9e b3  |................|
+00000010  c7 71 bb bf be e3 b9 80  3f 17 bf 41 37 95 22 e6  |.q......?..A7.".|
+00000020  f2 98 a9 15 62 1d 65 06  69 ea 53 00 00 04 c0 14  |....b.e.i.S.....|
 00000030  00 ff 01 00 00 58 00 0b  00 04 03 00 01 02 00 0a  |.....X..........|
 00000040  00 0c 00 0a 00 1d 00 17  00 1e 00 19 00 18 00 23  |...............#|
 00000050  00 00 00 16 00 00 00 17  00 00 00 0d 00 30 00 2e  |.............0..|
@@ -9,81 +9,88 @@
 00000070  08 04 08 05 08 06 04 01  05 01 06 01 03 03 02 03  |................|
 00000080  03 01 02 01 03 02 02 02  04 02 05 02 06 02        |..............|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 3b 02 00 00  37 03 03 00 00 00 00 00  |....;...7.......|
+00000000  16 03 03 00 3f 02 00 00  3b 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 44 4f 57 4e 47  52 44 01 00 cc a8 00 00  |...DOWNGRD......|
-00000030  0f 00 23 00 00 ff 01 00  01 00 00 0b 00 02 01 00  |..#.............|
-00000040  16 03 03 02 59 0b 00 02  55 00 02 52 00 02 4f 30  |....Y...U..R..O0|
-00000050  82 02 4b 30 82 01 b4 a0  03 02 01 02 02 09 00 e8  |..K0............|
-00000060  f0 9d 3f e2 5b ea a6 30  0d 06 09 2a 86 48 86 f7  |..?.[..0...*.H..|
-00000070  0d 01 01 0b 05 00 30 1f  31 0b 30 09 06 03 55 04  |......0.1.0...U.|
-00000080  0a 13 02 47 6f 31 10 30  0e 06 03 55 04 03 13 07  |...Go1.0...U....|
-00000090  47 6f 20 52 6f 6f 74 30  1e 17 0d 31 36 30 31 30  |Go Root0...16010|
-000000a0  31 30 30 30 30 30 30 5a  17 0d 32 35 30 31 30 31  |1000000Z..250101|
-000000b0  30 30 30 30 30 30 5a 30  1a 31 0b 30 09 06 03 55  |000000Z0.1.0...U|
-000000c0  04 0a 13 02 47 6f 31 0b  30 09 06 03 55 04 03 13  |....Go1.0...U...|
-000000d0  02 47 6f 30 81 9f 30 0d  06 09 2a 86 48 86 f7 0d  |.Go0..0...*.H...|
-000000e0  01 01 01 05 00 03 81 8d  00 30 81 89 02 81 81 00  |.........0......|
-000000f0  db 46 7d 93 2e 12 27 06  48 bc 06 28 21 ab 7e c4  |.F}...'.H..(!.~.|
-00000100  b6 a2 5d fe 1e 52 45 88  7a 36 47 a5 08 0d 92 42  |..]..RE.z6G....B|
-00000110  5b c2 81 c0 be 97 79 98  40 fb 4f 6d 14 fd 2b 13  |[.....y.@.Om..+.|
-00000120  8b c2 a5 2e 67 d8 d4 09  9e d6 22 38 b7 4a 0b 74  |....g....."8.J.t|
-00000130  73 2b c2 34 f1 d1 93 e5  96 d9 74 7b f3 58 9f 6c  |s+.4......t{.X.l|
-00000140  61 3c c0 b0 41 d4 d9 2b  2b 24 23 77 5b 1c 3b bd  |a<..A..++$#w[.;.|
-00000150  75 5d ce 20 54 cf a1 63  87 1d 1e 24 c4 f3 1d 1a  |u]. T..c...$....|
-00000160  50 8b aa b6 14 43 ed 97  a7 75 62 f4 14 c8 52 d7  |P....C...ub...R.|
-00000170  02 03 01 00 01 a3 81 93  30 81 90 30 0e 06 03 55  |........0..0...U|
-00000180  1d 0f 01 01 ff 04 04 03  02 05 a0 30 1d 06 03 55  |...........0...U|
-00000190  1d 25 04 16 30 14 06 08  2b 06 01 05 05 07 03 01  |.%..0...+.......|
-000001a0  06 08 2b 06 01 05 05 07  03 02 30 0c 06 03 55 1d  |..+.......0...U.|
-000001b0  13 01 01 ff 04 02 30 00  30 19 06 03 55 1d 0e 04  |......0.0...U...|
-000001c0  12 04 10 9f 91 16 1f 43  43 3e 49 a6 de 6d b6 80  |.......CC>I..m..|
-000001d0  d7 9f 60 30 1b 06 03 55  1d 23 04 14 30 12 80 10  |..`0...U.#..0...|
-000001e0  48 13 49 4d 13 7e 16 31  bb a3 01 d5 ac ab 6e 7b  |H.IM.~.1......n{|
-000001f0  30 19 06 03 55 1d 11 04  12 30 10 82 0e 65 78 61  |0...U....0...exa|
-00000200  6d 70 6c 65 2e 67 6f 6c  61 6e 67 30 0d 06 09 2a  |mple.golang0...*|
-00000210  86 48 86 f7 0d 01 01 0b  05 00 03 81 81 00 9d 30  |.H.............0|
-00000220  cc 40 2b 5b 50 a0 61 cb  ba e5 53 58 e1 ed 83 28  |.@+[P.a...SX...(|
-00000230  a9 58 1a a9 38 a4 95 a1  ac 31 5a 1a 84 66 3d 43  |.X..8....1Z..f=C|
-00000240  d3 2d d9 0b f2 97 df d3  20 64 38 92 24 3a 00 bc  |.-...... d8.$:..|
-00000250  cf 9c 7d b7 40 20 01 5f  aa d3 16 61 09 a2 76 fd  |..}.@ ._...a..v.|
-00000260  13 c3 cc e1 0c 5c ee b1  87 82 f1 6c 04 ed 73 bb  |.....\.....l..s.|
-00000270  b3 43 77 8d 0c 1c f1 0f  a1 d8 40 83 61 c9 4c 72  |.Cw.......@.a.Lr|
-00000280  2b 9d ae db 46 06 06 4d  f4 c1 b3 3e c0 d1 bd 42  |+...F..M...>...B|
-00000290  d4 db fe 3d 13 60 84 5c  21 d3 3b e9 fa e7 16 03  |...=.`.\!.;.....|
-000002a0  03 00 ac 0c 00 00 a8 03  00 1d 20 2f e5 7d a3 47  |.......... /.}.G|
-000002b0  cd 62 43 15 28 da ac 5f  bb 29 07 30 ff f6 84 af  |.bC.(.._.).0....|
-000002c0  c4 cf c2 ed 90 99 5f 58  cb 3b 74 08 04 00 80 89  |......_X.;t.....|
-000002d0  f8 62 c5 1a ba 78 74 da  6f 96 76 00 0f 6b a9 fb  |.b...xt.o.v..k..|
-000002e0  83 d4 52 c0 80 0b 81 02  e3 b0 07 c2 9d ff b4 cc  |..R.............|
-000002f0  ea 2e c7 82 91 35 74 ef  1e 9a ba 78 3e 60 6c 86  |.....5t....x>`l.|
-00000300  1d b0 14 52 84 84 70 ce  66 22 31 66 e2 53 04 bd  |...R..p.f"1f.S..|
-00000310  4d 2b 5e 86 8b 79 dc 17  7a 4f bc 62 5a 21 a1 f6  |M+^..y..zO.bZ!..|
-00000320  46 1a 12 aa 7a 98 25 02  97 a8 9c 71 a4 4a 5b 28  |F...z.%....q.J[(|
-00000330  c8 11 6a 5f f1 b3 13 a7  f2 26 12 59 02 fa 28 e2  |..j_.....&.Y..(.|
-00000340  ba 8c c0 cd 50 c6 60 db  69 9a a1 92 12 26 23 16  |....P.`.i....&#.|
-00000350  03 03 00 04 0e 00 00 00                           |........|
+00000020  00 00 00 44 4f 57 4e 47  52 44 01 00 c0 14 00 00  |...DOWNGRD......|
+00000030  13 00 23 00 00 ff 01 00  01 00 00 17 00 00 00 0b  |..#.............|
+00000040  00 02 01 00 16 03 03 02  59 0b 00 02 55 00 02 52  |........Y...U..R|
+00000050  00 02 4f 30 82 02 4b 30  82 01 b4 a0 03 02 01 02  |..O0..K0........|
+00000060  02 09 00 e8 f0 9d 3f e2  5b ea a6 30 0d 06 09 2a  |......?.[..0...*|
+00000070  86 48 86 f7 0d 01 01 0b  05 00 30 1f 31 0b 30 09  |.H........0.1.0.|
+00000080  06 03 55 04 0a 13 02 47  6f 31 10 30 0e 06 03 55  |..U....Go1.0...U|
+00000090  04 03 13 07 47 6f 20 52  6f 6f 74 30 1e 17 0d 31  |....Go Root0...1|
+000000a0  36 30 31 30 31 30 30 30  30 30 30 5a 17 0d 32 35  |60101000000Z..25|
+000000b0  30 31 30 31 30 30 30 30  30 30 5a 30 1a 31 0b 30  |0101000000Z0.1.0|
+000000c0  09 06 03 55 04 0a 13 02  47 6f 31 0b 30 09 06 03  |...U....Go1.0...|
+000000d0  55 04 03 13 02 47 6f 30  81 9f 30 0d 06 09 2a 86  |U....Go0..0...*.|
+000000e0  48 86 f7 0d 01 01 01 05  00 03 81 8d 00 30 81 89  |H............0..|
+000000f0  02 81 81 00 db 46 7d 93  2e 12 27 06 48 bc 06 28  |.....F}...'.H..(|
+00000100  21 ab 7e c4 b6 a2 5d fe  1e 52 45 88 7a 36 47 a5  |!.~...]..RE.z6G.|
+00000110  08 0d 92 42 5b c2 81 c0  be 97 79 98 40 fb 4f 6d  |...B[.....y.@.Om|
+00000120  14 fd 2b 13 8b c2 a5 2e  67 d8 d4 09 9e d6 22 38  |..+.....g....."8|
+00000130  b7 4a 0b 74 73 2b c2 34  f1 d1 93 e5 96 d9 74 7b  |.J.ts+.4......t{|
+00000140  f3 58 9f 6c 61 3c c0 b0  41 d4 d9 2b 2b 24 23 77  |.X.la<..A..++$#w|
+00000150  5b 1c 3b bd 75 5d ce 20  54 cf a1 63 87 1d 1e 24  |[.;.u]. T..c...$|
+00000160  c4 f3 1d 1a 50 8b aa b6  14 43 ed 97 a7 75 62 f4  |....P....C...ub.|
+00000170  14 c8 52 d7 02 03 01 00  01 a3 81 93 30 81 90 30  |..R.........0..0|
+00000180  0e 06 03 55 1d 0f 01 01  ff 04 04 03 02 05 a0 30  |...U...........0|
+00000190  1d 06 03 55 1d 25 04 16  30 14 06 08 2b 06 01 05  |...U.%..0...+...|
+000001a0  05 07 03 01 06 08 2b 06  01 05 05 07 03 02 30 0c  |......+.......0.|
+000001b0  06 03 55 1d 13 01 01 ff  04 02 30 00 30 19 06 03  |..U.......0.0...|
+000001c0  55 1d 0e 04 12 04 10 9f  91 16 1f 43 43 3e 49 a6  |U..........CC>I.|
+000001d0  de 6d b6 80 d7 9f 60 30  1b 06 03 55 1d 23 04 14  |.m....`0...U.#..|
+000001e0  30 12 80 10 48 13 49 4d  13 7e 16 31 bb a3 01 d5  |0...H.IM.~.1....|
+000001f0  ac ab 6e 7b 30 19 06 03  55 1d 11 04 12 30 10 82  |..n{0...U....0..|
+00000200  0e 65 78 61 6d 70 6c 65  2e 67 6f 6c 61 6e 67 30  |.example.golang0|
+00000210  0d 06 09 2a 86 48 86 f7  0d 01 01 0b 05 00 03 81  |...*.H..........|
+00000220  81 00 9d 30 cc 40 2b 5b  50 a0 61 cb ba e5 53 58  |...0.@+[P.a...SX|
+00000230  e1 ed 83 28 a9 58 1a a9  38 a4 95 a1 ac 31 5a 1a  |...(.X..8....1Z.|
+00000240  84 66 3d 43 d3 2d d9 0b  f2 97 df d3 20 64 38 92  |.f=C.-...... d8.|
+00000250  24 3a 00 bc cf 9c 7d b7  40 20 01 5f aa d3 16 61  |$:....}.@ ._...a|
+00000260  09 a2 76 fd 13 c3 cc e1  0c 5c ee b1 87 82 f1 6c  |..v......\.....l|
+00000270  04 ed 73 bb b3 43 77 8d  0c 1c f1 0f a1 d8 40 83  |..s..Cw.......@.|
+00000280  61 c9 4c 72 2b 9d ae db  46 06 06 4d f4 c1 b3 3e  |a.Lr+...F..M...>|
+00000290  c0 d1 bd 42 d4 db fe 3d  13 60 84 5c 21 d3 3b e9  |...B...=.`.\!.;.|
+000002a0  fa e7 16 03 03 00 ac 0c  00 00 a8 03 00 1d 20 2f  |.............. /|
+000002b0  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
+000002c0  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74 08  |.........._X.;t.|
+000002d0  04 00 80 41 24 c2 f9 e8  40 21 47 3c ab 8e 99 5e  |...A$...@!G<...^|
+000002e0  0e 08 27 86 6c 29 ae 36  ed 21 18 23 67 cc f7 d5  |..'.l).6.!.#g...|
+000002f0  3f e2 2c 48 2f 3d 47 e5  af d5 61 86 0f 91 69 30  |?.,H/=G...a...i0|
+00000300  cf 84 56 f2 d3 c1 9a a3  a1 a2 c8 ef 4d 33 de 12  |..V.........M3..|
+00000310  d6 46 55 5b c6 6a 65 a5  36 b5 51 5b db 04 25 aa  |.FU[.je.6.Q[..%.|
+00000320  1c af a0 b0 2d ee db 00  c5 ad 1b 94 d3 90 11 86  |....-...........|
+00000330  10 83 35 41 65 9e a4 2c  a9 ee 37 ac d4 cc 05 76  |..5Ae..,..7....v|
+00000340  92 59 f9 51 68 79 6d 9e  5f eb 80 47 3a 7c e0 74  |.Y.Qhym._..G:|.t|
+00000350  ac f5 36 16 03 03 00 04  0e 00 00 00              |..6.........|
 >>> Flow 3 (client to server)
-00000000  16 03 03 00 25 10 00 00  21 20 ba 1b c8 ae 22 78  |....%...! ...."x|
-00000010  84 ba d8 1c b3 87 52 f0  bf 13 76 2b a5 47 37 13  |......R...v+.G7.|
-00000020  30 89 01 13 1a cb 63 ea  b3 37 14 03 03 00 01 01  |0.....c..7......|
-00000030  16 03 03 00 20 ac d7 79  45 e6 65 1d 20 1a 95 5e  |.... ..yE.e. ..^|
-00000040  68 f7 0f ee 8c 3f 3d 0b  bc 58 31 aa 46 d7 e3 00  |h....?=..X1.F...|
-00000050  7b 10 8c 01 5d                                    |{...]|
+00000000  16 03 03 00 25 10 00 00  21 20 d2 ed 26 ce 1f 5d  |....%...! ..&..]|
+00000010  50 b8 f4 19 fc 63 e2 b6  3d 7d 39 54 c2 c1 61 a9  |P....c..=}9T..a.|
+00000020  2a 82 d8 e3 a9 2f 22 8c  b2 18 14 03 03 00 01 01  |*..../".........|
+00000030  16 03 03 00 40 82 78 f0  1e e6 03 20 67 66 4e d6  |....@.x.... gfN.|
+00000040  93 25 69 9e 38 c6 dd 17  92 02 18 7f 5f 9c 9c f0  |.%i.8......._...|
+00000050  a3 f7 45 d3 ba 82 e3 01  38 e5 4f cf 8b 0e 77 6e  |..E.....8.O...wn|
+00000060  91 99 83 e0 f1 3d e8 a1  39 d4 ea b3 2e 1c 67 59  |.....=..9.....gY|
+00000070  c5 5d 83 30 dc                                    |.].0.|
 >>> Flow 4 (server to client)
-00000000  16 03 03 00 8b 04 00 00  87 00 00 00 00 00 81 50  |...............P|
-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 e0 18 83 51 ed 14 ef  68 ca 42 c5 4c f8 79 c6  |o...Q...h.B.L.y.|
-00000040  80 85 74 9c 35 6f 4e 9d  60 0b a2 28 b0 45 b6 f6  |..t.5oN.`..(.E..|
-00000050  71 a3 f6 a6 95 71 cd 1e  53 e9 58 9f 94 18 ac d6  |q....q..S.X.....|
-00000060  6b 03 ba ac b4 4f c2 02  cc 1c 5b 88 84 49 38 16  |k....O....[..I8.|
-00000070  d9 5e b8 11 ab c6 f8 a7  9d 5d 58 99 b1 b6 8a be  |.^.......]X.....|
-00000080  4e 9e 40 3d 00 22 11 25  c7 51 8e cb d2 10 d4 7d  |N.@=.".%.Q.....}|
-00000090  14 03 03 00 01 01 16 03  03 00 20 ff 4b 1e 87 3e  |.......... .K..>|
-000000a0  05 5c b4 3e e4 b9 5c 47  f0 a2 0b 67 47 89 c6 48  |.\.>..\G...gG..H|
-000000b0  d5 e3 73 d2 00 44 56 e4  8d b6 fb 17 03 03 00 1d  |..s..DV.........|
-000000c0  58 28 94 02 c2 a9 99 3d  b6 0b de 9c fd 52 61 bf  |X(.....=.....Ra.|
-000000d0  55 c0 12 7f be a8 52 98  d7 99 a5 d0 60 15 03 03  |U.....R.....`...|
-000000e0  00 12 26 44 ad f0 a7 56  e5 23 6f 1b 7a 7e f8 e4  |..&D...V.#o.z~..|
-000000f0  42 49 5d 1d                                       |BI].|
+00000000  16 03 03 00 83 04 00 00  7f 00 00 00 00 00 79 00  |..............y.|
+00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 94  |................|
+00000020  6f 2d 70 97 51 ed 14 ef  68 ca 42 c5 4c ff 6b a2  |o-p.Q...h.B.L.k.|
+00000030  3e f9 07 a9 91 ad 0d c7  23 bd 7f 04 cf 4d a0 eb  |>.......#....M..|
+00000040  58 e0 e1 37 73 d3 cc 4b  e2 7f 6d 3a 2e 47 b5 b4  |X..7s..K..m:.G..|
+00000050  60 dd e6 9a ea 30 1e 6e  7a e7 8e 84 ca 49 38 16  |`....0.nz....I8.|
+00000060  7e 51 5c e5 15 c0 58 7d  a2 ba e2 ca 90 24 11 ea  |~Q\...X}.....$..|
+00000070  53 9c 7d cb 47 13 91 cf  f6 05 f0 2f db 57 1a 40  |S.}.G....../.W.@|
+00000080  57 b0 d4 97 8e 23 7e f5  14 03 03 00 01 01 16 03  |W....#~.........|
+00000090  03 00 40 00 00 00 00 00  00 00 00 00 00 00 00 00  |..@.............|
+000000a0  00 00 00 72 43 0e f2 f3  bb e8 6d 3b f2 ff 96 53  |...rC.....m;...S|
+000000b0  12 36 07 e0 f0 17 35 e7  52 87 a3 12 7b 53 d4 83  |.6....5.R...{S..|
+000000c0  cc d2 d3 06 4b e2 3a fc  38 4f a7 75 d8 3c 6a a4  |....K.:.8O.u.<j.|
+000000d0  b7 5f e8 17 03 03 00 40  00 00 00 00 00 00 00 00  |._.....@........|
+000000e0  00 00 00 00 00 00 00 00  7d b5 ce 35 23 2a ba 64  |........}..5#*.d|
+000000f0  0d 4e cc 9d 53 37 84 1d  6d c5 b0 ae a6 64 76 82  |.N..S7..m....dv.|
+00000100  4d 80 97 1e 16 5f 0a 85  72 be 27 41 a3 e0 45 35  |M...._..r.'A..E5|
+00000110  6e d4 c0 41 e5 99 8c 19  15 03 03 00 30 00 00 00  |n..A........0...|
+00000120  00 00 00 00 00 00 00 00  00 00 00 00 00 c9 f3 4e  |...............N|
+00000130  91 b6 c2 c0 a5 cf 21 6b  ed 58 d9 cf 9c 9b ff 0a  |......!k.X......|
+00000140  6c 62 73 de f8 c3 39 22  2e d3 c6 45 9d           |lbs...9"...E.|
diff --git a/src/crypto/tls/testdata/Server-TLSv12-IssueTicket b/src/crypto/tls/testdata/Server-TLSv12-IssueTicket
index f70c759..ee29358 100644
--- a/src/crypto/tls/testdata/Server-TLSv12-IssueTicket
+++ b/src/crypto/tls/testdata/Server-TLSv12-IssueTicket
@@ -1,91 +1,90 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 71 01 00 00  6d 03 03 3d 21 91 3a 4e  |....q...m..=!.:N|
-00000010  8e cd 65 eb 0f 1c ae 2a  58 40 4c 38 22 c9 46 2c  |..e....*X@L8".F,|
-00000020  b8 cd dd 38 ad c6 4b a7  60 a9 56 00 00 04 00 2f  |...8..K.`.V..../|
+00000000  16 03 01 00 71 01 00 00  6d 03 03 bf f8 80 5d 1b  |....q...m.....].|
+00000010  ea 95 cb 32 3b 8f ff 5e  f9 4d 58 7d dc a4 50 cc  |...2;..^.MX}..P.|
+00000020  68 4d 40 98 11 af f3 e4  d7 31 43 00 00 04 00 2f  |hM@......1C..../|
 00000030  00 ff 01 00 00 40 00 23  00 00 00 16 00 00 00 17  |.....@.#........|
 00000040  00 00 00 0d 00 30 00 2e  04 03 05 03 06 03 08 07  |.....0..........|
 00000050  08 08 08 09 08 0a 08 0b  08 04 08 05 08 06 04 01  |................|
 00000060  05 01 06 01 03 03 02 03  03 01 02 01 03 02 02 02  |................|
 00000070  04 02 05 02 06 02                                 |......|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 35 02 00 00  31 03 03 00 00 00 00 00  |....5...1.......|
+00000000  16 03 03 00 39 02 00 00  35 03 03 00 00 00 00 00  |....9...5.......|
 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000020  00 00 00 44 4f 57 4e 47  52 44 01 00 00 2f 00 00  |...DOWNGRD.../..|
-00000030  09 00 23 00 00 ff 01 00  01 00 16 03 03 02 59 0b  |..#...........Y.|
-00000040  00 02 55 00 02 52 00 02  4f 30 82 02 4b 30 82 01  |..U..R..O0..K0..|
-00000050  b4 a0 03 02 01 02 02 09  00 e8 f0 9d 3f e2 5b ea  |............?.[.|
-00000060  a6 30 0d 06 09 2a 86 48  86 f7 0d 01 01 0b 05 00  |.0...*.H........|
-00000070  30 1f 31 0b 30 09 06 03  55 04 0a 13 02 47 6f 31  |0.1.0...U....Go1|
-00000080  10 30 0e 06 03 55 04 03  13 07 47 6f 20 52 6f 6f  |.0...U....Go Roo|
-00000090  74 30 1e 17 0d 31 36 30  31 30 31 30 30 30 30 30  |t0...16010100000|
-000000a0  30 5a 17 0d 32 35 30 31  30 31 30 30 30 30 30 30  |0Z..250101000000|
-000000b0  5a 30 1a 31 0b 30 09 06  03 55 04 0a 13 02 47 6f  |Z0.1.0...U....Go|
-000000c0  31 0b 30 09 06 03 55 04  03 13 02 47 6f 30 81 9f  |1.0...U....Go0..|
-000000d0  30 0d 06 09 2a 86 48 86  f7 0d 01 01 01 05 00 03  |0...*.H.........|
-000000e0  81 8d 00 30 81 89 02 81  81 00 db 46 7d 93 2e 12  |...0.......F}...|
-000000f0  27 06 48 bc 06 28 21 ab  7e c4 b6 a2 5d fe 1e 52  |'.H..(!.~...]..R|
-00000100  45 88 7a 36 47 a5 08 0d  92 42 5b c2 81 c0 be 97  |E.z6G....B[.....|
-00000110  79 98 40 fb 4f 6d 14 fd  2b 13 8b c2 a5 2e 67 d8  |y.@.Om..+.....g.|
-00000120  d4 09 9e d6 22 38 b7 4a  0b 74 73 2b c2 34 f1 d1  |...."8.J.ts+.4..|
-00000130  93 e5 96 d9 74 7b f3 58  9f 6c 61 3c c0 b0 41 d4  |....t{.X.la<..A.|
-00000140  d9 2b 2b 24 23 77 5b 1c  3b bd 75 5d ce 20 54 cf  |.++$#w[.;.u]. T.|
-00000150  a1 63 87 1d 1e 24 c4 f3  1d 1a 50 8b aa b6 14 43  |.c...$....P....C|
-00000160  ed 97 a7 75 62 f4 14 c8  52 d7 02 03 01 00 01 a3  |...ub...R.......|
-00000170  81 93 30 81 90 30 0e 06  03 55 1d 0f 01 01 ff 04  |..0..0...U......|
-00000180  04 03 02 05 a0 30 1d 06  03 55 1d 25 04 16 30 14  |.....0...U.%..0.|
-00000190  06 08 2b 06 01 05 05 07  03 01 06 08 2b 06 01 05  |..+.........+...|
-000001a0  05 07 03 02 30 0c 06 03  55 1d 13 01 01 ff 04 02  |....0...U.......|
-000001b0  30 00 30 19 06 03 55 1d  0e 04 12 04 10 9f 91 16  |0.0...U.........|
-000001c0  1f 43 43 3e 49 a6 de 6d  b6 80 d7 9f 60 30 1b 06  |.CC>I..m....`0..|
-000001d0  03 55 1d 23 04 14 30 12  80 10 48 13 49 4d 13 7e  |.U.#..0...H.IM.~|
-000001e0  16 31 bb a3 01 d5 ac ab  6e 7b 30 19 06 03 55 1d  |.1......n{0...U.|
-000001f0  11 04 12 30 10 82 0e 65  78 61 6d 70 6c 65 2e 67  |...0...example.g|
-00000200  6f 6c 61 6e 67 30 0d 06  09 2a 86 48 86 f7 0d 01  |olang0...*.H....|
-00000210  01 0b 05 00 03 81 81 00  9d 30 cc 40 2b 5b 50 a0  |.........0.@+[P.|
-00000220  61 cb ba e5 53 58 e1 ed  83 28 a9 58 1a a9 38 a4  |a...SX...(.X..8.|
-00000230  95 a1 ac 31 5a 1a 84 66  3d 43 d3 2d d9 0b f2 97  |...1Z..f=C.-....|
-00000240  df d3 20 64 38 92 24 3a  00 bc cf 9c 7d b7 40 20  |.. d8.$:....}.@ |
-00000250  01 5f aa d3 16 61 09 a2  76 fd 13 c3 cc e1 0c 5c  |._...a..v......\|
-00000260  ee b1 87 82 f1 6c 04 ed  73 bb b3 43 77 8d 0c 1c  |.....l..s..Cw...|
-00000270  f1 0f a1 d8 40 83 61 c9  4c 72 2b 9d ae db 46 06  |....@.a.Lr+...F.|
-00000280  06 4d f4 c1 b3 3e c0 d1  bd 42 d4 db fe 3d 13 60  |.M...>...B...=.`|
-00000290  84 5c 21 d3 3b e9 fa e7  16 03 03 00 04 0e 00 00  |.\!.;...........|
-000002a0  00                                                |.|
+00000030  0d 00 23 00 00 ff 01 00  01 00 00 17 00 00 16 03  |..#.............|
+00000040  03 02 59 0b 00 02 55 00  02 52 00 02 4f 30 82 02  |..Y...U..R..O0..|
+00000050  4b 30 82 01 b4 a0 03 02  01 02 02 09 00 e8 f0 9d  |K0..............|
+00000060  3f e2 5b ea a6 30 0d 06  09 2a 86 48 86 f7 0d 01  |?.[..0...*.H....|
+00000070  01 0b 05 00 30 1f 31 0b  30 09 06 03 55 04 0a 13  |....0.1.0...U...|
+00000080  02 47 6f 31 10 30 0e 06  03 55 04 03 13 07 47 6f  |.Go1.0...U....Go|
+00000090  20 52 6f 6f 74 30 1e 17  0d 31 36 30 31 30 31 30  | Root0...1601010|
+000000a0  30 30 30 30 30 5a 17 0d  32 35 30 31 30 31 30 30  |00000Z..25010100|
+000000b0  30 30 30 30 5a 30 1a 31  0b 30 09 06 03 55 04 0a  |0000Z0.1.0...U..|
+000000c0  13 02 47 6f 31 0b 30 09  06 03 55 04 03 13 02 47  |..Go1.0...U....G|
+000000d0  6f 30 81 9f 30 0d 06 09  2a 86 48 86 f7 0d 01 01  |o0..0...*.H.....|
+000000e0  01 05 00 03 81 8d 00 30  81 89 02 81 81 00 db 46  |.......0.......F|
+000000f0  7d 93 2e 12 27 06 48 bc  06 28 21 ab 7e c4 b6 a2  |}...'.H..(!.~...|
+00000100  5d fe 1e 52 45 88 7a 36  47 a5 08 0d 92 42 5b c2  |]..RE.z6G....B[.|
+00000110  81 c0 be 97 79 98 40 fb  4f 6d 14 fd 2b 13 8b c2  |....y.@.Om..+...|
+00000120  a5 2e 67 d8 d4 09 9e d6  22 38 b7 4a 0b 74 73 2b  |..g....."8.J.ts+|
+00000130  c2 34 f1 d1 93 e5 96 d9  74 7b f3 58 9f 6c 61 3c  |.4......t{.X.la<|
+00000140  c0 b0 41 d4 d9 2b 2b 24  23 77 5b 1c 3b bd 75 5d  |..A..++$#w[.;.u]|
+00000150  ce 20 54 cf a1 63 87 1d  1e 24 c4 f3 1d 1a 50 8b  |. T..c...$....P.|
+00000160  aa b6 14 43 ed 97 a7 75  62 f4 14 c8 52 d7 02 03  |...C...ub...R...|
+00000170  01 00 01 a3 81 93 30 81  90 30 0e 06 03 55 1d 0f  |......0..0...U..|
+00000180  01 01 ff 04 04 03 02 05  a0 30 1d 06 03 55 1d 25  |.........0...U.%|
+00000190  04 16 30 14 06 08 2b 06  01 05 05 07 03 01 06 08  |..0...+.........|
+000001a0  2b 06 01 05 05 07 03 02  30 0c 06 03 55 1d 13 01  |+.......0...U...|
+000001b0  01 ff 04 02 30 00 30 19  06 03 55 1d 0e 04 12 04  |....0.0...U.....|
+000001c0  10 9f 91 16 1f 43 43 3e  49 a6 de 6d b6 80 d7 9f  |.....CC>I..m....|
+000001d0  60 30 1b 06 03 55 1d 23  04 14 30 12 80 10 48 13  |`0...U.#..0...H.|
+000001e0  49 4d 13 7e 16 31 bb a3  01 d5 ac ab 6e 7b 30 19  |IM.~.1......n{0.|
+000001f0  06 03 55 1d 11 04 12 30  10 82 0e 65 78 61 6d 70  |..U....0...examp|
+00000200  6c 65 2e 67 6f 6c 61 6e  67 30 0d 06 09 2a 86 48  |le.golang0...*.H|
+00000210  86 f7 0d 01 01 0b 05 00  03 81 81 00 9d 30 cc 40  |.............0.@|
+00000220  2b 5b 50 a0 61 cb ba e5  53 58 e1 ed 83 28 a9 58  |+[P.a...SX...(.X|
+00000230  1a a9 38 a4 95 a1 ac 31  5a 1a 84 66 3d 43 d3 2d  |..8....1Z..f=C.-|
+00000240  d9 0b f2 97 df d3 20 64  38 92 24 3a 00 bc cf 9c  |...... d8.$:....|
+00000250  7d b7 40 20 01 5f aa d3  16 61 09 a2 76 fd 13 c3  |}.@ ._...a..v...|
+00000260  cc e1 0c 5c ee b1 87 82  f1 6c 04 ed 73 bb b3 43  |...\.....l..s..C|
+00000270  77 8d 0c 1c f1 0f a1 d8  40 83 61 c9 4c 72 2b 9d  |w.......@.a.Lr+.|
+00000280  ae db 46 06 06 4d f4 c1  b3 3e c0 d1 bd 42 d4 db  |..F..M...>...B..|
+00000290  fe 3d 13 60 84 5c 21 d3  3b e9 fa e7 16 03 03 00  |.=.`.\!.;.......|
+000002a0  04 0e 00 00 00                                    |.....|
 >>> Flow 3 (client to server)
-00000000  16 03 03 00 86 10 00 00  82 00 80 1d 1a 1a b8 f4  |................|
-00000010  05 77 7a 96 2b 5f 50 7f  1e 69 14 be 40 ad 0c c9  |.wz.+_P..i..@...|
-00000020  7e df 2f 1d aa 74 ee b4  a5 05 fa 05 e1 85 a4 87  |~./..t..........|
-00000030  59 6a d1 e4 98 ce df e3  a5 82 98 77 c2 c4 fc 2f  |Yj.........w.../|
-00000040  ec 1d 2e 96 0c 27 12 0d  64 ba 58 90 ff 7d d1 27  |.....'..d.X..}.'|
-00000050  9a b9 b5 fb 1d 76 6f 3e  af f8 70 a3 cc 53 95 98  |.....vo>..p..S..|
-00000060  2c 7e a9 42 25 e5 3a e2  55 3f 19 57 6b 83 43 6a  |,~.B%.:.U?.Wk.Cj|
-00000070  93 34 2c 6e cb 4e 9d 25  8b 4d 7d d7 cc e1 16 59  |.4,n.N.%.M}....Y|
-00000080  2a 95 60 e4 31 0e df 7f  cb 9d b7 14 03 03 00 01  |*.`.1...........|
-00000090  01 16 03 03 00 40 28 33  df 69 4f 4c 48 b1 fb 8d  |.....@(3.iOLH...|
-000000a0  3f 3c d2 81 7c 33 cf 21  6a f7 d6 43 82 22 5b de  |?<..|3.!j..C."[.|
-000000b0  46 7f 7b e2 39 23 bd 39  fa 03 bd 11 9d a8 a2 84  |F.{.9#.9........|
-000000c0  4a 90 1a ab e1 b4 23 9f  72 d0 97 9e 05 5c 47 2b  |J.....#.r....\G+|
-000000d0  7a 53 bb ec a0 07                                 |zS....|
+00000000  16 03 03 00 86 10 00 00  82 00 80 35 d7 dd 48 68  |...........5..Hh|
+00000010  17 8c 9b 02 75 0c 6b 76  17 0a e1 f8 06 c0 d7 1d  |....u.kv........|
+00000020  bf a5 97 d2 59 0f c9 90  4a f0 6f 40 dc e7 30 c4  |....Y...J.o@..0.|
+00000030  75 ab 74 9c 32 48 a4 84  3c 40 a0 bd 03 aa 09 2b  |u.t.2H..<@.....+|
+00000040  b2 4c 80 82 17 b8 3d 27  16 9a b7 90 66 f2 10 4e  |.L....='....f..N|
+00000050  41 7e 78 24 de 27 91 f9  e9 bc bf 15 3a 35 1b ae  |A~x$.'......:5..|
+00000060  28 9e e1 09 f0 7a 4d 66  7e de d1 43 bf f5 e4 09  |(....zMf~..C....|
+00000070  a7 21 cb 0e 1d 59 6d a0  a6 41 44 58 f4 ab ac 6a  |.!...Ym..ADX...j|
+00000080  98 db 25 e3 57 ee 94 87  85 51 ea 14 03 03 00 01  |..%.W....Q......|
+00000090  01 16 03 03 00 40 c9 64  79 e7 15 1d 30 15 95 89  |.....@.dy...0...|
+000000a0  b1 9b 12 42 69 4b 22 20  54 5a aa b6 71 02 1c 3f  |...BiK" TZ..q..?|
+000000b0  7c b5 66 07 b5 1f 55 96  3f ce 47 1f 66 52 d8 6b  ||.f...U.?.G.fR.k|
+000000c0  65 71 c0 4e 0b 7e 55 e0  f5 af 42 29 af 2b 1d 0e  |eq.N.~U...B).+..|
+000000d0  e6 96 cd 7b fc d3                                 |...{..|
 >>> Flow 4 (server to client)
-00000000  16 03 03 00 8b 04 00 00  87 00 00 00 00 00 81 50  |...............P|
-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 9f 83 51 ed 14 ef  68 ca 42 c5 4c 75 5e a5  |o,..Q...h.B.Lu^.|
-00000040  6f d2 49 61 e4 fb 83 46  7c 4c ab f9 c6 d1 3c 9e  |o.Ia...F|L....<.|
-00000050  5b 8d d8 bc c0 a5 2d 84  db 24 dd a0 16 60 1d 87  |[.....-..$...`..|
-00000060  a0 52 88 25 6c c6 8e 5b  71 0f 74 c3 48 49 38 16  |.R.%l..[q.t.HI8.|
-00000070  92 8c de 77 bd 8a 2b 45  4d 58 86 40 b1 d6 0f 99  |...w..+EMX.@....|
-00000080  de 27 41 b2 41 27 aa fe  26 e9 24 91 2a 00 ff 08  |.'A.A'..&.$.*...|
-00000090  14 03 03 00 01 01 16 03  03 00 40 00 00 00 00 00  |..........@.....|
-000000a0  00 00 00 00 00 00 00 00  00 00 00 fc cd 6b 01 90  |.............k..|
-000000b0  7b 0c 31 54 a0 3a 8b f7  ba 45 e7 e0 df 9a 59 6d  |{.1T.:...E....Ym|
-000000c0  83 b6 b2 c8 93 d8 d9 b6  fe 19 56 51 75 a3 ea 0e  |..........VQu...|
-000000d0  f4 4b 64 27 66 fc 19 7b  7e 13 e7 17 03 03 00 40  |.Kd'f..{~......@|
-000000e0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-000000f0  c2 1b 6f f1 1e 05 1b 8a  19 16 67 00 0f dc a8 a2  |..o.......g.....|
-00000100  00 56 49 0a bb c5 df 7e  96 0c 5c db a0 f4 3e b4  |.VI....~..\...>.|
-00000110  30 3e b6 f0 16 dd d4 ed  c9 de 64 49 00 9b 51 dc  |0>........dI..Q.|
-00000120  15 03 03 00 30 00 00 00  00 00 00 00 00 00 00 00  |....0...........|
-00000130  00 00 00 00 00 e1 9d 08  1a 2e 9a 0f 84 6d 4e e5  |.............mN.|
-00000140  2c 50 b9 28 5d 88 ea bb  48 4d af 26 7f 82 0b 56  |,P.(]...HM.&...V|
-00000150  c5 87 71 2a e7                                    |..q*.|
+00000000  16 03 03 00 83 04 00 00  7f 00 00 00 00 00 79 00  |..............y.|
+00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 94  |................|
+00000020  6f 2d b0 ac 51 ed 14 ef  68 ca 42 c5 4c 85 f6 26  |o-..Q...h.B.L..&|
+00000030  0d a4 ad a8 f5 14 64 4f  b9 c3 fb 1e 55 c1 1f c7  |......dO....U...|
+00000040  31 57 72 68 db 03 37 a8  c9 07 f4 ca 62 6c 5c f3  |1Wrh..7.....bl\.|
+00000050  8b 5a 3d 76 dd 63 ea 68  61 6b a1 2d 95 49 38 16  |.Z=v.c.hak.-.I8.|
+00000060  7e 51 5c e5 15 c0 58 7d  c5 67 4a 6f 64 b6 79 1a  |~Q\...X}.gJod.y.|
+00000070  41 9b b1 33 15 38 74 92  5c a5 48 c3 f2 94 bb 33  |A..3.8t.\.H....3|
+00000080  ec af cf d7 e7 c9 3e 35  14 03 03 00 01 01 16 03  |......>5........|
+00000090  03 00 40 00 00 00 00 00  00 00 00 00 00 00 00 00  |..@.............|
+000000a0  00 00 00 19 51 7c 1c a3  80 34 e1 81 30 3f f9 a4  |....Q|...4..0?..|
+000000b0  a0 97 97 fd 94 fb ab e8  80 48 25 7b 83 ca 38 61  |.........H%{..8a|
+000000c0  34 95 d0 52 6f 09 ad 4f  74 35 c5 3d e8 bb aa 5d  |4..Ro..Ot5.=...]|
+000000d0  d0 fc 85 17 03 03 00 40  00 00 00 00 00 00 00 00  |.......@........|
+000000e0  00 00 00 00 00 00 00 00  e7 19 f9 fd 10 7c 17 04  |.............|..|
+000000f0  2d ce 5f a6 41 33 3d 05  b0 29 91 ff a0 a5 76 52  |-._.A3=..)....vR|
+00000100  e1 b9 ba 6a ca d3 79 60  11 ac 43 b5 30 f7 15 dc  |...j..y`..C.0...|
+00000110  6f b1 d2 b2 00 85 43 40  15 03 03 00 30 00 00 00  |o.....C@....0...|
+00000120  00 00 00 00 00 00 00 00  00 00 00 00 00 19 99 8a  |................|
+00000130  4c 18 e0 03 cc 27 7a be  2c e5 d2 16 95 f6 a4 6e  |L....'z.,......n|
+00000140  11 d3 1d f4 01 52 2b fc  98 04 b1 0b 31           |.....R+.....1|
diff --git a/src/crypto/tls/testdata/Server-TLSv12-IssueTicketPreDisable b/src/crypto/tls/testdata/Server-TLSv12-IssueTicketPreDisable
index 8cb57f5..20ce3c3 100644
--- a/src/crypto/tls/testdata/Server-TLSv12-IssueTicketPreDisable
+++ b/src/crypto/tls/testdata/Server-TLSv12-IssueTicketPreDisable
@@ -1,91 +1,90 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 71 01 00 00  6d 03 03 e1 40 35 c8 5c  |....q...m...@5.\|
-00000010  71 63 3f 5a 00 42 e6 3e  64 62 b8 c4 e7 e7 ba 98  |qc?Z.B.>db......|
-00000020  d8 fa 2c b5 65 f7 50 db  43 d9 70 00 00 04 00 2f  |..,.e.P.C.p..../|
+00000000  16 03 01 00 71 01 00 00  6d 03 03 a1 ba 69 29 39  |....q...m....i)9|
+00000010  b5 fc c7 90 90 54 35 be  5a ad 4a e2 b2 3d b9 01  |.....T5.Z.J..=..|
+00000020  f0 48 fd 77 b5 9e bc 89  f5 d4 df 00 00 04 00 2f  |.H.w.........../|
 00000030  00 ff 01 00 00 40 00 23  00 00 00 16 00 00 00 17  |.....@.#........|
 00000040  00 00 00 0d 00 30 00 2e  04 03 05 03 06 03 08 07  |.....0..........|
 00000050  08 08 08 09 08 0a 08 0b  08 04 08 05 08 06 04 01  |................|
 00000060  05 01 06 01 03 03 02 03  03 01 02 01 03 02 02 02  |................|
 00000070  04 02 05 02 06 02                                 |......|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 35 02 00 00  31 03 03 00 00 00 00 00  |....5...1.......|
+00000000  16 03 03 00 39 02 00 00  35 03 03 00 00 00 00 00  |....9...5.......|
 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000020  00 00 00 44 4f 57 4e 47  52 44 01 00 00 2f 00 00  |...DOWNGRD.../..|
-00000030  09 00 23 00 00 ff 01 00  01 00 16 03 03 02 59 0b  |..#...........Y.|
-00000040  00 02 55 00 02 52 00 02  4f 30 82 02 4b 30 82 01  |..U..R..O0..K0..|
-00000050  b4 a0 03 02 01 02 02 09  00 e8 f0 9d 3f e2 5b ea  |............?.[.|
-00000060  a6 30 0d 06 09 2a 86 48  86 f7 0d 01 01 0b 05 00  |.0...*.H........|
-00000070  30 1f 31 0b 30 09 06 03  55 04 0a 13 02 47 6f 31  |0.1.0...U....Go1|
-00000080  10 30 0e 06 03 55 04 03  13 07 47 6f 20 52 6f 6f  |.0...U....Go Roo|
-00000090  74 30 1e 17 0d 31 36 30  31 30 31 30 30 30 30 30  |t0...16010100000|
-000000a0  30 5a 17 0d 32 35 30 31  30 31 30 30 30 30 30 30  |0Z..250101000000|
-000000b0  5a 30 1a 31 0b 30 09 06  03 55 04 0a 13 02 47 6f  |Z0.1.0...U....Go|
-000000c0  31 0b 30 09 06 03 55 04  03 13 02 47 6f 30 81 9f  |1.0...U....Go0..|
-000000d0  30 0d 06 09 2a 86 48 86  f7 0d 01 01 01 05 00 03  |0...*.H.........|
-000000e0  81 8d 00 30 81 89 02 81  81 00 db 46 7d 93 2e 12  |...0.......F}...|
-000000f0  27 06 48 bc 06 28 21 ab  7e c4 b6 a2 5d fe 1e 52  |'.H..(!.~...]..R|
-00000100  45 88 7a 36 47 a5 08 0d  92 42 5b c2 81 c0 be 97  |E.z6G....B[.....|
-00000110  79 98 40 fb 4f 6d 14 fd  2b 13 8b c2 a5 2e 67 d8  |y.@.Om..+.....g.|
-00000120  d4 09 9e d6 22 38 b7 4a  0b 74 73 2b c2 34 f1 d1  |...."8.J.ts+.4..|
-00000130  93 e5 96 d9 74 7b f3 58  9f 6c 61 3c c0 b0 41 d4  |....t{.X.la<..A.|
-00000140  d9 2b 2b 24 23 77 5b 1c  3b bd 75 5d ce 20 54 cf  |.++$#w[.;.u]. T.|
-00000150  a1 63 87 1d 1e 24 c4 f3  1d 1a 50 8b aa b6 14 43  |.c...$....P....C|
-00000160  ed 97 a7 75 62 f4 14 c8  52 d7 02 03 01 00 01 a3  |...ub...R.......|
-00000170  81 93 30 81 90 30 0e 06  03 55 1d 0f 01 01 ff 04  |..0..0...U......|
-00000180  04 03 02 05 a0 30 1d 06  03 55 1d 25 04 16 30 14  |.....0...U.%..0.|
-00000190  06 08 2b 06 01 05 05 07  03 01 06 08 2b 06 01 05  |..+.........+...|
-000001a0  05 07 03 02 30 0c 06 03  55 1d 13 01 01 ff 04 02  |....0...U.......|
-000001b0  30 00 30 19 06 03 55 1d  0e 04 12 04 10 9f 91 16  |0.0...U.........|
-000001c0  1f 43 43 3e 49 a6 de 6d  b6 80 d7 9f 60 30 1b 06  |.CC>I..m....`0..|
-000001d0  03 55 1d 23 04 14 30 12  80 10 48 13 49 4d 13 7e  |.U.#..0...H.IM.~|
-000001e0  16 31 bb a3 01 d5 ac ab  6e 7b 30 19 06 03 55 1d  |.1......n{0...U.|
-000001f0  11 04 12 30 10 82 0e 65  78 61 6d 70 6c 65 2e 67  |...0...example.g|
-00000200  6f 6c 61 6e 67 30 0d 06  09 2a 86 48 86 f7 0d 01  |olang0...*.H....|
-00000210  01 0b 05 00 03 81 81 00  9d 30 cc 40 2b 5b 50 a0  |.........0.@+[P.|
-00000220  61 cb ba e5 53 58 e1 ed  83 28 a9 58 1a a9 38 a4  |a...SX...(.X..8.|
-00000230  95 a1 ac 31 5a 1a 84 66  3d 43 d3 2d d9 0b f2 97  |...1Z..f=C.-....|
-00000240  df d3 20 64 38 92 24 3a  00 bc cf 9c 7d b7 40 20  |.. d8.$:....}.@ |
-00000250  01 5f aa d3 16 61 09 a2  76 fd 13 c3 cc e1 0c 5c  |._...a..v......\|
-00000260  ee b1 87 82 f1 6c 04 ed  73 bb b3 43 77 8d 0c 1c  |.....l..s..Cw...|
-00000270  f1 0f a1 d8 40 83 61 c9  4c 72 2b 9d ae db 46 06  |....@.a.Lr+...F.|
-00000280  06 4d f4 c1 b3 3e c0 d1  bd 42 d4 db fe 3d 13 60  |.M...>...B...=.`|
-00000290  84 5c 21 d3 3b e9 fa e7  16 03 03 00 04 0e 00 00  |.\!.;...........|
-000002a0  00                                                |.|
+00000030  0d 00 23 00 00 ff 01 00  01 00 00 17 00 00 16 03  |..#.............|
+00000040  03 02 59 0b 00 02 55 00  02 52 00 02 4f 30 82 02  |..Y...U..R..O0..|
+00000050  4b 30 82 01 b4 a0 03 02  01 02 02 09 00 e8 f0 9d  |K0..............|
+00000060  3f e2 5b ea a6 30 0d 06  09 2a 86 48 86 f7 0d 01  |?.[..0...*.H....|
+00000070  01 0b 05 00 30 1f 31 0b  30 09 06 03 55 04 0a 13  |....0.1.0...U...|
+00000080  02 47 6f 31 10 30 0e 06  03 55 04 03 13 07 47 6f  |.Go1.0...U....Go|
+00000090  20 52 6f 6f 74 30 1e 17  0d 31 36 30 31 30 31 30  | Root0...1601010|
+000000a0  30 30 30 30 30 5a 17 0d  32 35 30 31 30 31 30 30  |00000Z..25010100|
+000000b0  30 30 30 30 5a 30 1a 31  0b 30 09 06 03 55 04 0a  |0000Z0.1.0...U..|
+000000c0  13 02 47 6f 31 0b 30 09  06 03 55 04 03 13 02 47  |..Go1.0...U....G|
+000000d0  6f 30 81 9f 30 0d 06 09  2a 86 48 86 f7 0d 01 01  |o0..0...*.H.....|
+000000e0  01 05 00 03 81 8d 00 30  81 89 02 81 81 00 db 46  |.......0.......F|
+000000f0  7d 93 2e 12 27 06 48 bc  06 28 21 ab 7e c4 b6 a2  |}...'.H..(!.~...|
+00000100  5d fe 1e 52 45 88 7a 36  47 a5 08 0d 92 42 5b c2  |]..RE.z6G....B[.|
+00000110  81 c0 be 97 79 98 40 fb  4f 6d 14 fd 2b 13 8b c2  |....y.@.Om..+...|
+00000120  a5 2e 67 d8 d4 09 9e d6  22 38 b7 4a 0b 74 73 2b  |..g....."8.J.ts+|
+00000130  c2 34 f1 d1 93 e5 96 d9  74 7b f3 58 9f 6c 61 3c  |.4......t{.X.la<|
+00000140  c0 b0 41 d4 d9 2b 2b 24  23 77 5b 1c 3b bd 75 5d  |..A..++$#w[.;.u]|
+00000150  ce 20 54 cf a1 63 87 1d  1e 24 c4 f3 1d 1a 50 8b  |. T..c...$....P.|
+00000160  aa b6 14 43 ed 97 a7 75  62 f4 14 c8 52 d7 02 03  |...C...ub...R...|
+00000170  01 00 01 a3 81 93 30 81  90 30 0e 06 03 55 1d 0f  |......0..0...U..|
+00000180  01 01 ff 04 04 03 02 05  a0 30 1d 06 03 55 1d 25  |.........0...U.%|
+00000190  04 16 30 14 06 08 2b 06  01 05 05 07 03 01 06 08  |..0...+.........|
+000001a0  2b 06 01 05 05 07 03 02  30 0c 06 03 55 1d 13 01  |+.......0...U...|
+000001b0  01 ff 04 02 30 00 30 19  06 03 55 1d 0e 04 12 04  |....0.0...U.....|
+000001c0  10 9f 91 16 1f 43 43 3e  49 a6 de 6d b6 80 d7 9f  |.....CC>I..m....|
+000001d0  60 30 1b 06 03 55 1d 23  04 14 30 12 80 10 48 13  |`0...U.#..0...H.|
+000001e0  49 4d 13 7e 16 31 bb a3  01 d5 ac ab 6e 7b 30 19  |IM.~.1......n{0.|
+000001f0  06 03 55 1d 11 04 12 30  10 82 0e 65 78 61 6d 70  |..U....0...examp|
+00000200  6c 65 2e 67 6f 6c 61 6e  67 30 0d 06 09 2a 86 48  |le.golang0...*.H|
+00000210  86 f7 0d 01 01 0b 05 00  03 81 81 00 9d 30 cc 40  |.............0.@|
+00000220  2b 5b 50 a0 61 cb ba e5  53 58 e1 ed 83 28 a9 58  |+[P.a...SX...(.X|
+00000230  1a a9 38 a4 95 a1 ac 31  5a 1a 84 66 3d 43 d3 2d  |..8....1Z..f=C.-|
+00000240  d9 0b f2 97 df d3 20 64  38 92 24 3a 00 bc cf 9c  |...... d8.$:....|
+00000250  7d b7 40 20 01 5f aa d3  16 61 09 a2 76 fd 13 c3  |}.@ ._...a..v...|
+00000260  cc e1 0c 5c ee b1 87 82  f1 6c 04 ed 73 bb b3 43  |...\.....l..s..C|
+00000270  77 8d 0c 1c f1 0f a1 d8  40 83 61 c9 4c 72 2b 9d  |w.......@.a.Lr+.|
+00000280  ae db 46 06 06 4d f4 c1  b3 3e c0 d1 bd 42 d4 db  |..F..M...>...B..|
+00000290  fe 3d 13 60 84 5c 21 d3  3b e9 fa e7 16 03 03 00  |.=.`.\!.;.......|
+000002a0  04 0e 00 00 00                                    |.....|
 >>> Flow 3 (client to server)
-00000000  16 03 03 00 86 10 00 00  82 00 80 4f ce 06 88 66  |...........O...f|
-00000010  dd e1 0a 55 ef fb 1b 9e  70 62 8b 3b 0d e4 19 0f  |...U....pb.;....|
-00000020  4f 16 c9 79 92 9c 4d 16  21 ea 43 d7 58 7f 35 65  |O..y..M.!.C.X.5e|
-00000030  a3 15 7a 8d b5 6e 9b f6  73 19 c2 0c 58 be 9d 8a  |..z..n..s...X...|
-00000040  5a a8 be f3 89 48 64 28  6a 7f be b7 4a 58 93 af  |Z....Hd(j...JX..|
-00000050  c0 ff 8a ae 01 34 1f cf  7b b0 7a 5e 69 19 43 fa  |.....4..{.z^i.C.|
-00000060  21 b8 dc ee 0e ab 3b 81  c9 b9 be b9 56 a0 dd 62  |!.....;.....V..b|
-00000070  02 45 14 54 4d 05 5a cc  31 68 1f 17 91 a6 0e d7  |.E.TM.Z.1h......|
-00000080  5a f3 ae bb 5e 90 1d c3  c9 56 2a 14 03 03 00 01  |Z...^....V*.....|
-00000090  01 16 03 03 00 40 a1 34  07 ef 45 42 d2 88 bb 6e  |.....@.4..EB...n|
-000000a0  7f 3a 2a 39 67 3f 90 76  95 b7 cc 86 b6 1a 6c c6  |.:*9g?.v......l.|
-000000b0  da 8f 26 f3 34 6c 1f 6f  05 11 39 40 00 46 00 be  |..&.4l.o..9@.F..|
-000000c0  8f 3a af 86 d6 6d 5d 00  f3 5d 22 1c 31 2c 24 ee  |.:...m]..]".1,$.|
-000000d0  e5 11 ba 94 5f b1                                 |...._.|
+00000000  16 03 03 00 86 10 00 00  82 00 80 cc 4e 62 e0 bf  |............Nb..|
+00000010  21 65 dc f2 57 fb fe 6e  e4 cc de b4 1f aa af 52  |!e..W..n.......R|
+00000020  a4 e0 0e 1b fa 8b 23 4b  d9 e2 4b 62 6a 26 80 f7  |......#K..Kbj&..|
+00000030  15 82 ba 44 4a 18 b8 97  ca a1 79 4b 11 59 90 7d  |...DJ.....yK.Y.}|
+00000040  ea 89 7c f9 6b 5f 29 c7  ca 32 bf 3b 53 b2 bb bb  |..|.k_)..2.;S...|
+00000050  77 0a 5c 1f c2 d8 20 cf  59 19 4e a0 ff ef ca ca  |w.\... .Y.N.....|
+00000060  25 39 ac c7 64 b9 e8 68  09 f2 49 96 8e 49 c7 4c  |%9..d..h..I..I.L|
+00000070  cd ff 28 6f d8 0d d3 7a  ae 7a 51 9e 04 70 8a 59  |..(o...z.zQ..p.Y|
+00000080  8c 05 61 c9 2b bd e1 05  5a 12 63 14 03 03 00 01  |..a.+...Z.c.....|
+00000090  01 16 03 03 00 40 ac 30  bb 83 2f e2 a1 98 a3 c5  |.....@.0../.....|
+000000a0  9c e3 55 36 70 a0 10 fc  53 7e 2d ae f1 02 d7 04  |..U6p...S~-.....|
+000000b0  1f 4e 5d ed 33 29 99 04  54 8e 51 74 d5 2a 73 21  |.N].3)..T.Qt.*s!|
+000000c0  4f bf 8b 0c 04 b2 f2 d4  3e a7 f6 ee 8b fb 3a 0b  |O.......>.....:.|
+000000d0  86 27 7c a7 bb 32                                 |.'|..2|
 >>> Flow 4 (server to client)
-00000000  16 03 03 00 8b 04 00 00  87 00 00 00 00 00 81 50  |...............P|
-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 9f 83 51 ed 14 ef  68 ca 42 c5 4c 20 33 6c  |o,..Q...h.B.L 3l|
-00000040  01 97 a5 69 44 bf 8f ea  db 83 05 fb ef cc 51 1f  |...iD.........Q.|
-00000050  0b 4d 44 77 89 11 cf c8  38 16 67 ea a2 3e 8b 2a  |.MDw....8.g..>.*|
-00000060  18 f2 f7 25 ce e0 d8 4c  93 31 b0 59 23 49 38 16  |...%...L.1.Y#I8.|
-00000070  3a f9 63 9e 61 21 1b ab  67 09 6a 23 07 8e d0 4a  |:.c.a!..g.j#...J|
-00000080  19 78 9c 1e 60 40 a7 83  c5 9a 48 41 35 c4 e9 63  |.x..`@....HA5..c|
-00000090  14 03 03 00 01 01 16 03  03 00 40 00 00 00 00 00  |..........@.....|
-000000a0  00 00 00 00 00 00 00 00  00 00 00 b8 46 07 9e 14  |............F...|
-000000b0  85 ba 6d e0 f1 f5 99 43  80 9a 54 6b 33 1e 4f c1  |..m....C..Tk3.O.|
-000000c0  88 b7 3d 60 04 d4 e9 b0  b2 6d c4 1a ca 3b 9f 83  |..=`.....m...;..|
-000000d0  28 5f ea b2 54 e4 11 78  69 de 1a 17 03 03 00 40  |(_..T..xi......@|
-000000e0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-000000f0  55 34 ad ae 9b 37 df cd  88 ae fc 6a ac c5 cf 16  |U4...7.....j....|
-00000100  ec f1 bc 22 1e d2 c1 52  5e a2 e7 d2 6e 37 7a 29  |..."...R^...n7z)|
-00000110  c8 b9 d4 7d 81 63 1a f0  53 d9 10 fd 4f 3d 1c dd  |...}.c..S...O=..|
-00000120  15 03 03 00 30 00 00 00  00 00 00 00 00 00 00 00  |....0...........|
-00000130  00 00 00 00 00 8f f2 11  0d 93 99 83 29 d4 10 a4  |............)...|
-00000140  7c bb 26 7b 24 f1 15 3a  9b 81 0e cb 0a 51 4b 39  ||.&{$..:.....QK9|
-00000150  69 1d e5 38 5e                                    |i..8^|
+00000000  16 03 03 00 83 04 00 00  7f 00 00 00 00 00 79 00  |..............y.|
+00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 94  |................|
+00000020  6f 2d b0 ac 51 ed 14 ef  68 ca 42 c5 4c fa 53 68  |o-..Q...h.B.L.Sh|
+00000030  d9 20 e9 d9 c1 9c 90 3b  f2 e6 57 af 04 e5 db 6b  |. .....;..W....k|
+00000040  36 0b b5 b8 e2 a5 a4 bf  52 31 80 32 b9 da d9 32  |6.......R1.2...2|
+00000050  36 e7 31 d3 22 78 12 ae  7a 80 ac fa 6d 49 38 16  |6.1."x..z...mI8.|
+00000060  7e 51 5c e5 15 c0 58 7d  d6 77 d5 17 1b d9 a8 74  |~Q\...X}.w.....t|
+00000070  be 93 25 54 84 a7 1a 93  1f 20 a4 49 eb 26 e7 8e  |..%T..... .I.&..|
+00000080  d3 0f cf 9c 75 cc 6f 36  14 03 03 00 01 01 16 03  |....u.o6........|
+00000090  03 00 40 00 00 00 00 00  00 00 00 00 00 00 00 00  |..@.............|
+000000a0  00 00 00 eb f1 52 79 ff  b8 6c 9c 23 f3 22 bc 96  |.....Ry..l.#."..|
+000000b0  2a bc e7 73 05 32 4b 2e  e4 5e 31 97 62 86 cc 12  |*..s.2K..^1.b...|
+000000c0  ae 22 77 92 37 5d 82 41  57 48 aa f4 0a f3 94 30  |."w.7].AWH.....0|
+000000d0  5d 06 7b 17 03 03 00 40  00 00 00 00 00 00 00 00  |].{....@........|
+000000e0  00 00 00 00 00 00 00 00  8f 8d a7 06 a7 d6 52 5a  |..............RZ|
+000000f0  b9 66 5e ef e3 8d 1d 91  d0 6d 30 29 92 4e 6a 81  |.f^......m0).Nj.|
+00000100  f4 77 97 06 de a8 c8 d1  4c 6b 15 07 1f 9b 59 6d  |.w......Lk....Ym|
+00000110  cb 4f 23 20 58 aa 22 21  15 03 03 00 30 00 00 00  |.O# X."!....0...|
+00000120  00 00 00 00 00 00 00 00  00 00 00 00 00 06 55 3d  |..............U=|
+00000130  42 f5 12 b2 66 aa af 00  91 5e b8 31 ae 19 0e 35  |B...f....^.1...5|
+00000140  a2 d7 a6 e7 0c 3c 2b 95  62 69 d7 a0 81           |.....<+.bi...|
diff --git a/src/crypto/tls/testdata/Server-TLSv12-P256 b/src/crypto/tls/testdata/Server-TLSv12-P256
index 58b9bed..349857e 100644
--- a/src/crypto/tls/testdata/Server-TLSv12-P256
+++ b/src/crypto/tls/testdata/Server-TLSv12-P256
@@ -1,86 +1,84 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 8f 01 00 00  8b 03 03 49 de 51 77 8e  |...........I.Qw.|
-00000010  58 03 e9 25 0b 9a 88 ef  35 2d 35 a8 30 29 22 61  |X..%....5-5.0)"a|
-00000020  ae b4 af 8a a1 2c 45 59  40 5f aa 00 00 04 c0 2f  |.....,EY@_...../|
-00000030  00 ff 01 00 00 5e 00 00  00 0e 00 0c 00 00 09 31  |.....^.........1|
-00000040  32 37 2e 30 2e 30 2e 31  00 0b 00 04 03 00 01 02  |27.0.0.1........|
-00000050  00 0a 00 04 00 02 00 17  00 16 00 00 00 17 00 00  |................|
-00000060  00 0d 00 30 00 2e 04 03  05 03 06 03 08 07 08 08  |...0............|
-00000070  08 09 08 0a 08 0b 08 04  08 05 08 06 04 01 05 01  |................|
-00000080  06 01 03 03 02 03 03 01  02 01 03 02 02 02 04 02  |................|
-00000090  05 02 06 02                                       |....|
+00000000  16 03 01 00 7d 01 00 00  79 03 03 26 b5 ad b7 ec  |....}...y..&....|
+00000010  e9 2f d5 cc 9e c2 f6 6f  dd ab c5 4b 2c 74 48 a5  |./.....o...K,tH.|
+00000020  9c c5 21 41 fd 32 91 04  8f 1b 6c 00 00 04 cc a8  |..!A.2....l.....|
+00000030  00 ff 01 00 00 4c 00 0b  00 04 03 00 01 02 00 0a  |.....L..........|
+00000040  00 04 00 02 00 17 00 16  00 00 00 17 00 00 00 0d  |................|
+00000050  00 30 00 2e 04 03 05 03  06 03 08 07 08 08 08 09  |.0..............|
+00000060  08 0a 08 0b 08 04 08 05  08 06 04 01 05 01 06 01  |................|
+00000070  03 03 02 03 03 01 02 01  03 02 02 02 04 02 05 02  |................|
+00000080  06 02                                             |..|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 37 02 00 00  33 03 03 00 00 00 00 00  |....7...3.......|
+00000000  16 03 03 00 3b 02 00 00  37 03 03 00 00 00 00 00  |....;...7.......|
 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000020  00 00 00 44 4f 57 4e 47  52 44 01 00 c0 2f 00 00  |...DOWNGRD.../..|
-00000030  0b ff 01 00 01 00 00 0b  00 02 01 00 16 03 03 02  |................|
-00000040  59 0b 00 02 55 00 02 52  00 02 4f 30 82 02 4b 30  |Y...U..R..O0..K0|
-00000050  82 01 b4 a0 03 02 01 02  02 09 00 e8 f0 9d 3f e2  |..............?.|
-00000060  5b ea a6 30 0d 06 09 2a  86 48 86 f7 0d 01 01 0b  |[..0...*.H......|
-00000070  05 00 30 1f 31 0b 30 09  06 03 55 04 0a 13 02 47  |..0.1.0...U....G|
-00000080  6f 31 10 30 0e 06 03 55  04 03 13 07 47 6f 20 52  |o1.0...U....Go R|
-00000090  6f 6f 74 30 1e 17 0d 31  36 30 31 30 31 30 30 30  |oot0...160101000|
-000000a0  30 30 30 5a 17 0d 32 35  30 31 30 31 30 30 30 30  |000Z..2501010000|
-000000b0  30 30 5a 30 1a 31 0b 30  09 06 03 55 04 0a 13 02  |00Z0.1.0...U....|
-000000c0  47 6f 31 0b 30 09 06 03  55 04 03 13 02 47 6f 30  |Go1.0...U....Go0|
-000000d0  81 9f 30 0d 06 09 2a 86  48 86 f7 0d 01 01 01 05  |..0...*.H.......|
-000000e0  00 03 81 8d 00 30 81 89  02 81 81 00 db 46 7d 93  |.....0.......F}.|
-000000f0  2e 12 27 06 48 bc 06 28  21 ab 7e c4 b6 a2 5d fe  |..'.H..(!.~...].|
-00000100  1e 52 45 88 7a 36 47 a5  08 0d 92 42 5b c2 81 c0  |.RE.z6G....B[...|
-00000110  be 97 79 98 40 fb 4f 6d  14 fd 2b 13 8b c2 a5 2e  |..y.@.Om..+.....|
-00000120  67 d8 d4 09 9e d6 22 38  b7 4a 0b 74 73 2b c2 34  |g....."8.J.ts+.4|
-00000130  f1 d1 93 e5 96 d9 74 7b  f3 58 9f 6c 61 3c c0 b0  |......t{.X.la<..|
-00000140  41 d4 d9 2b 2b 24 23 77  5b 1c 3b bd 75 5d ce 20  |A..++$#w[.;.u]. |
-00000150  54 cf a1 63 87 1d 1e 24  c4 f3 1d 1a 50 8b aa b6  |T..c...$....P...|
-00000160  14 43 ed 97 a7 75 62 f4  14 c8 52 d7 02 03 01 00  |.C...ub...R.....|
-00000170  01 a3 81 93 30 81 90 30  0e 06 03 55 1d 0f 01 01  |....0..0...U....|
-00000180  ff 04 04 03 02 05 a0 30  1d 06 03 55 1d 25 04 16  |.......0...U.%..|
-00000190  30 14 06 08 2b 06 01 05  05 07 03 01 06 08 2b 06  |0...+.........+.|
-000001a0  01 05 05 07 03 02 30 0c  06 03 55 1d 13 01 01 ff  |......0...U.....|
-000001b0  04 02 30 00 30 19 06 03  55 1d 0e 04 12 04 10 9f  |..0.0...U.......|
-000001c0  91 16 1f 43 43 3e 49 a6  de 6d b6 80 d7 9f 60 30  |...CC>I..m....`0|
-000001d0  1b 06 03 55 1d 23 04 14  30 12 80 10 48 13 49 4d  |...U.#..0...H.IM|
-000001e0  13 7e 16 31 bb a3 01 d5  ac ab 6e 7b 30 19 06 03  |.~.1......n{0...|
-000001f0  55 1d 11 04 12 30 10 82  0e 65 78 61 6d 70 6c 65  |U....0...example|
-00000200  2e 67 6f 6c 61 6e 67 30  0d 06 09 2a 86 48 86 f7  |.golang0...*.H..|
-00000210  0d 01 01 0b 05 00 03 81  81 00 9d 30 cc 40 2b 5b  |...........0.@+[|
-00000220  50 a0 61 cb ba e5 53 58  e1 ed 83 28 a9 58 1a a9  |P.a...SX...(.X..|
-00000230  38 a4 95 a1 ac 31 5a 1a  84 66 3d 43 d3 2d d9 0b  |8....1Z..f=C.-..|
-00000240  f2 97 df d3 20 64 38 92  24 3a 00 bc cf 9c 7d b7  |.... d8.$:....}.|
-00000250  40 20 01 5f aa d3 16 61  09 a2 76 fd 13 c3 cc e1  |@ ._...a..v.....|
-00000260  0c 5c ee b1 87 82 f1 6c  04 ed 73 bb b3 43 77 8d  |.\.....l..s..Cw.|
-00000270  0c 1c f1 0f a1 d8 40 83  61 c9 4c 72 2b 9d ae db  |......@.a.Lr+...|
-00000280  46 06 06 4d f4 c1 b3 3e  c0 d1 bd 42 d4 db fe 3d  |F..M...>...B...=|
-00000290  13 60 84 5c 21 d3 3b e9  fa e7 16 03 03 00 cd 0c  |.`.\!.;.........|
-000002a0  00 00 c9 03 00 17 41 04  1e 18 37 ef 0d 19 51 88  |......A...7...Q.|
-000002b0  35 75 71 b5 e5 54 5b 12  2e 8f 09 67 fd a7 24 20  |5uq..T[....g..$ |
-000002c0  3e b2 56 1c ce 97 28 5e  f8 2b 2d 4f 9e f1 07 9f  |>.V...(^.+-O....|
-000002d0  6c 4b 5b 83 56 e2 32 42  e9 58 b6 d7 49 a6 b5 68  |lK[.V.2B.X..I..h|
-000002e0  1a 41 03 56 6b dc 5a 89  08 04 00 80 7b bd 89 a1  |.A.Vk.Z.....{...|
-000002f0  d8 9d cf e4 75 ac 15 60  a9 49 0c c7 68 61 4e e4  |....u..`.I..haN.|
-00000300  2b 51 37 5a 65 38 a4 52  6a d0 4f 8b 76 93 a4 7c  |+Q7Ze8.Rj.O.v..||
-00000310  ac 30 6b 89 f1 c7 88 8f  f3 5c c7 e9 d6 7c 33 94  |.0k......\...|3.|
-00000320  f7 fc f8 69 35 f3 f7 e0  ea fc 51 5c b2 e2 dc 9e  |...i5.....Q\....|
-00000330  57 03 af e6 19 0d 0d e4  25 b6 52 19 12 ad 35 fc  |W.......%.R...5.|
-00000340  7f c3 6a 1f ed 06 82 34  81 13 d7 c1 67 a9 18 88  |..j....4....g...|
-00000350  2f bb 00 54 5d d9 01 16  29 dd 03 3c 69 f7 46 52  |/..T]...)..<i.FR|
-00000360  6a 95 51 81 75 68 fa 15  09 11 38 94 16 03 03 00  |j.Q.uh....8.....|
-00000370  04 0e 00 00 00                                    |.....|
+00000020  00 00 00 44 4f 57 4e 47  52 44 01 00 cc a8 00 00  |...DOWNGRD......|
+00000030  0f ff 01 00 01 00 00 17  00 00 00 0b 00 02 01 00  |................|
+00000040  16 03 03 02 59 0b 00 02  55 00 02 52 00 02 4f 30  |....Y...U..R..O0|
+00000050  82 02 4b 30 82 01 b4 a0  03 02 01 02 02 09 00 e8  |..K0............|
+00000060  f0 9d 3f e2 5b ea a6 30  0d 06 09 2a 86 48 86 f7  |..?.[..0...*.H..|
+00000070  0d 01 01 0b 05 00 30 1f  31 0b 30 09 06 03 55 04  |......0.1.0...U.|
+00000080  0a 13 02 47 6f 31 10 30  0e 06 03 55 04 03 13 07  |...Go1.0...U....|
+00000090  47 6f 20 52 6f 6f 74 30  1e 17 0d 31 36 30 31 30  |Go Root0...16010|
+000000a0  31 30 30 30 30 30 30 5a  17 0d 32 35 30 31 30 31  |1000000Z..250101|
+000000b0  30 30 30 30 30 30 5a 30  1a 31 0b 30 09 06 03 55  |000000Z0.1.0...U|
+000000c0  04 0a 13 02 47 6f 31 0b  30 09 06 03 55 04 03 13  |....Go1.0...U...|
+000000d0  02 47 6f 30 81 9f 30 0d  06 09 2a 86 48 86 f7 0d  |.Go0..0...*.H...|
+000000e0  01 01 01 05 00 03 81 8d  00 30 81 89 02 81 81 00  |.........0......|
+000000f0  db 46 7d 93 2e 12 27 06  48 bc 06 28 21 ab 7e c4  |.F}...'.H..(!.~.|
+00000100  b6 a2 5d fe 1e 52 45 88  7a 36 47 a5 08 0d 92 42  |..]..RE.z6G....B|
+00000110  5b c2 81 c0 be 97 79 98  40 fb 4f 6d 14 fd 2b 13  |[.....y.@.Om..+.|
+00000120  8b c2 a5 2e 67 d8 d4 09  9e d6 22 38 b7 4a 0b 74  |....g....."8.J.t|
+00000130  73 2b c2 34 f1 d1 93 e5  96 d9 74 7b f3 58 9f 6c  |s+.4......t{.X.l|
+00000140  61 3c c0 b0 41 d4 d9 2b  2b 24 23 77 5b 1c 3b bd  |a<..A..++$#w[.;.|
+00000150  75 5d ce 20 54 cf a1 63  87 1d 1e 24 c4 f3 1d 1a  |u]. T..c...$....|
+00000160  50 8b aa b6 14 43 ed 97  a7 75 62 f4 14 c8 52 d7  |P....C...ub...R.|
+00000170  02 03 01 00 01 a3 81 93  30 81 90 30 0e 06 03 55  |........0..0...U|
+00000180  1d 0f 01 01 ff 04 04 03  02 05 a0 30 1d 06 03 55  |...........0...U|
+00000190  1d 25 04 16 30 14 06 08  2b 06 01 05 05 07 03 01  |.%..0...+.......|
+000001a0  06 08 2b 06 01 05 05 07  03 02 30 0c 06 03 55 1d  |..+.......0...U.|
+000001b0  13 01 01 ff 04 02 30 00  30 19 06 03 55 1d 0e 04  |......0.0...U...|
+000001c0  12 04 10 9f 91 16 1f 43  43 3e 49 a6 de 6d b6 80  |.......CC>I..m..|
+000001d0  d7 9f 60 30 1b 06 03 55  1d 23 04 14 30 12 80 10  |..`0...U.#..0...|
+000001e0  48 13 49 4d 13 7e 16 31  bb a3 01 d5 ac ab 6e 7b  |H.IM.~.1......n{|
+000001f0  30 19 06 03 55 1d 11 04  12 30 10 82 0e 65 78 61  |0...U....0...exa|
+00000200  6d 70 6c 65 2e 67 6f 6c  61 6e 67 30 0d 06 09 2a  |mple.golang0...*|
+00000210  86 48 86 f7 0d 01 01 0b  05 00 03 81 81 00 9d 30  |.H.............0|
+00000220  cc 40 2b 5b 50 a0 61 cb  ba e5 53 58 e1 ed 83 28  |.@+[P.a...SX...(|
+00000230  a9 58 1a a9 38 a4 95 a1  ac 31 5a 1a 84 66 3d 43  |.X..8....1Z..f=C|
+00000240  d3 2d d9 0b f2 97 df d3  20 64 38 92 24 3a 00 bc  |.-...... d8.$:..|
+00000250  cf 9c 7d b7 40 20 01 5f  aa d3 16 61 09 a2 76 fd  |..}.@ ._...a..v.|
+00000260  13 c3 cc e1 0c 5c ee b1  87 82 f1 6c 04 ed 73 bb  |.....\.....l..s.|
+00000270  b3 43 77 8d 0c 1c f1 0f  a1 d8 40 83 61 c9 4c 72  |.Cw.......@.a.Lr|
+00000280  2b 9d ae db 46 06 06 4d  f4 c1 b3 3e c0 d1 bd 42  |+...F..M...>...B|
+00000290  d4 db fe 3d 13 60 84 5c  21 d3 3b e9 fa e7 16 03  |...=.`.\!.;.....|
+000002a0  03 00 cd 0c 00 00 c9 03  00 17 41 04 1e 18 37 ef  |..........A...7.|
+000002b0  0d 19 51 88 35 75 71 b5  e5 54 5b 12 2e 8f 09 67  |..Q.5uq..T[....g|
+000002c0  fd a7 24 20 3e b2 56 1c  ce 97 28 5e f8 2b 2d 4f  |..$ >.V...(^.+-O|
+000002d0  9e f1 07 9f 6c 4b 5b 83  56 e2 32 42 e9 58 b6 d7  |....lK[.V.2B.X..|
+000002e0  49 a6 b5 68 1a 41 03 56  6b dc 5a 89 08 04 00 80  |I..h.A.Vk.Z.....|
+000002f0  ca 2e 5d 9c 99 56 e6 7a  60 e2 b6 65 09 2e 4f ee  |..]..V.z`..e..O.|
+00000300  5d 7f d0 c0 f6 01 fe 62  13 12 14 dd 4d c9 eb e5  |]......b....M...|
+00000310  ee 27 ab 56 77 d1 0b 65  83 96 e5 72 ea 9a 78 85  |.'.Vw..e...r..x.|
+00000320  07 e6 86 bf 58 84 a8 4d  08 4a 56 14 a6 7f 0c 5a  |....X..M.JV....Z|
+00000330  68 3c 6a 9e 0e 2a 70 6a  4f 58 96 45 f2 14 11 45  |h<j..*pjOX.E...E|
+00000340  49 fc b1 0b 13 ff e8 f9  40 71 fb b6 05 ef 88 32  |I.......@q.....2|
+00000350  06 19 e0 e9 9d 97 20 e2  78 0b 4b 4c 71 4a 08 ee  |...... .x.KLqJ..|
+00000360  31 27 ef dd d0 5b d9 32  88 76 51 38 03 00 ba 67  |1'...[.2.vQ8...g|
+00000370  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 a6 c3 8d d1 32  |....F...BA.....2|
-00000010  8e b4 ac 27 75 4a 57 26  7f 6a 52 a7 82 ee c2 b1  |...'uJW&.jR.....|
-00000020  a3 68 0a 8d 09 ff 82 61  57 f3 32 5e ec 1a 2f 20  |.h.....aW.2^../ |
-00000030  8c c1 d4 cf 27 7b f0 1d  f9 5d f6 24 80 6a 45 d2  |....'{...].$.jE.|
-00000040  97 cf f1 5d a2 e3 b0 15  7d e6 a4 14 03 03 00 01  |...]....}.......|
-00000050  01 16 03 03 00 28 21 36  fe 82 d2 4a b4 da f8 14  |.....(!6...J....|
-00000060  d6 d6 8c be 56 1f ca 82  7f 20 bb 01 be fb 2a 0d  |....V.... ....*.|
-00000070  a8 31 ee 79 f7 8a 8b 4a  1b a7 66 3a 89 67        |.1.y...J..f:.g|
+00000000  16 03 03 00 46 10 00 00  42 41 04 1c 05 a2 39 1b  |....F...BA....9.|
+00000010  b9 e6 ef 38 6d 6f fe 95  0e ef 8d 8a 1b 70 10 b6  |...8mo.......p..|
+00000020  fc 0e 5f ee 0f 6e 08 b6  2d 4f 26 b1 5a af be f8  |.._..n..-O&.Z...|
+00000030  77 72 e4 19 5d a3 91 c6  0c 72 a3 19 9f 20 4f 6e  |wr..]....r... On|
+00000040  75 91 ef 62 4f 1a aa 29  b2 75 6f 14 03 03 00 01  |u..bO..).uo.....|
+00000050  01 16 03 03 00 20 44 af  52 7b ff ca cf 30 ce 71  |..... D.R{...0.q|
+00000060  94 6d 90 2b 6d f3 0e a6  5d 60 15 29 b2 03 81 59  |.m.+m...]`.)...Y|
+00000070  ec 37 a1 cf a5 79                                 |.7...y|
 >>> 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 00 0a 97 89 c3  74 09 63 25 2a fc e1 29  |........t.c%*..)|
-00000020  18 b1 bc d6 75 2e 3b 2a  fb 90 17 b9 b8 ea e2 c4  |....u.;*........|
-00000030  29 94 16 17 03 03 00 25  00 00 00 00 00 00 00 01  |)......%........|
-00000040  8c 30 76 b7 fd b1 96 0b  2a 8f f3 e1 b3 38 16 15  |.0v.....*....8..|
-00000050  10 3d 32 ee 29 b5 12 cb  cb cf 98 a3 c5 15 03 03  |.=2.)...........|
-00000060  00 1a 00 00 00 00 00 00  00 02 9e 4a 55 8e 91 ff  |...........JU...|
-00000070  13 0b 56 be 3c 5d b8 26  42 f1 c8 28              |..V.<].&B..(|
+00000000  14 03 03 00 01 01 16 03  03 00 20 af 15 24 30 06  |.......... ..$0.|
+00000010  dd 4c 8b 8a 87 e1 f5 24  ac 36 bc 43 8d 89 20 19  |.L.....$.6.C.. .|
+00000020  04 d2 9c 14 c4 af 24 30  bf ef 1e 17 03 03 00 1d  |......$0........|
+00000030  82 3b 55 e7 67 fe 89 bf  5b c1 7e d6 98 94 36 1f  |.;U.g...[.~...6.|
+00000040  74 f3 34 2b cb 95 48 ed  4d 33 64 b9 ce 15 03 03  |t.4+..H.M3d.....|
+00000050  00 12 ca bf 01 54 b4 c3  b4 f8 04 87 6d 75 ef 8c  |.....T......mu..|
+00000060  c7 9d 1b 1c                                       |....|
diff --git a/src/crypto/tls/testdata/Server-TLSv12-RSA-3DES b/src/crypto/tls/testdata/Server-TLSv12-RSA-3DES
index 17a5ad0..0298d49 100644
--- a/src/crypto/tls/testdata/Server-TLSv12-RSA-3DES
+++ b/src/crypto/tls/testdata/Server-TLSv12-RSA-3DES
@@ -1,80 +1,78 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 97 01 00 00  93 03 03 e2 8f 43 82 4c  |.............C.L|
-00000010  13 33 88 d2 53 5d b6 02  d2 b6 b2 a1 11 f0 30 14  |.3..S]........0.|
-00000020  41 1e 8c 79 85 38 75 cd  e8 a6 a7 00 00 04 00 0a  |A..y.8u.........|
-00000030  00 ff 01 00 00 66 00 00  00 0e 00 0c 00 00 09 31  |.....f.........1|
-00000040  32 37 2e 30 2e 30 2e 31  00 0b 00 04 03 00 01 02  |27.0.0.1........|
-00000050  00 0a 00 0c 00 0a 00 1d  00 17 00 1e 00 19 00 18  |................|
-00000060  00 16 00 00 00 17 00 00  00 0d 00 30 00 2e 04 03  |...........0....|
-00000070  05 03 06 03 08 07 08 08  08 09 08 0a 08 0b 08 04  |................|
-00000080  08 05 08 06 04 01 05 01  06 01 03 03 02 03 03 01  |................|
-00000090  02 01 03 02 02 02 04 02  05 02 06 02              |............|
+00000000  16 03 01 00 6d 01 00 00  69 03 03 6c 16 54 e2 20  |....m...i..l.T. |
+00000010  da ff dc 37 ae f5 5d e2  77 32 fe 7b 7a cc 31 1f  |...7..].w2.{z.1.|
+00000020  f5 49 6e 75 89 27 b0 aa  67 e7 99 00 00 04 00 0a  |.Inu.'..g.......|
+00000030  00 ff 01 00 00 3c 00 16  00 00 00 17 00 00 00 0d  |.....<..........|
+00000040  00 30 00 2e 04 03 05 03  06 03 08 07 08 08 08 09  |.0..............|
+00000050  08 0a 08 0b 08 04 08 05  08 06 04 01 05 01 06 01  |................|
+00000060  03 03 02 03 03 01 02 01  03 02 02 02 04 02 05 02  |................|
+00000070  06 02                                             |..|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 37 02 00 00  33 03 03 00 00 00 00 00  |....7...3.......|
+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 44 4f 57 4e 47  52 44 01 00 00 0a 00 00  |...DOWNGRD......|
-00000030  0b ff 01 00 01 00 00 0b  00 02 01 00 16 03 03 02  |................|
-00000040  59 0b 00 02 55 00 02 52  00 02 4f 30 82 02 4b 30  |Y...U..R..O0..K0|
-00000050  82 01 b4 a0 03 02 01 02  02 09 00 e8 f0 9d 3f e2  |..............?.|
-00000060  5b ea a6 30 0d 06 09 2a  86 48 86 f7 0d 01 01 0b  |[..0...*.H......|
-00000070  05 00 30 1f 31 0b 30 09  06 03 55 04 0a 13 02 47  |..0.1.0...U....G|
-00000080  6f 31 10 30 0e 06 03 55  04 03 13 07 47 6f 20 52  |o1.0...U....Go R|
-00000090  6f 6f 74 30 1e 17 0d 31  36 30 31 30 31 30 30 30  |oot0...160101000|
-000000a0  30 30 30 5a 17 0d 32 35  30 31 30 31 30 30 30 30  |000Z..2501010000|
-000000b0  30 30 5a 30 1a 31 0b 30  09 06 03 55 04 0a 13 02  |00Z0.1.0...U....|
-000000c0  47 6f 31 0b 30 09 06 03  55 04 03 13 02 47 6f 30  |Go1.0...U....Go0|
-000000d0  81 9f 30 0d 06 09 2a 86  48 86 f7 0d 01 01 01 05  |..0...*.H.......|
-000000e0  00 03 81 8d 00 30 81 89  02 81 81 00 db 46 7d 93  |.....0.......F}.|
-000000f0  2e 12 27 06 48 bc 06 28  21 ab 7e c4 b6 a2 5d fe  |..'.H..(!.~...].|
-00000100  1e 52 45 88 7a 36 47 a5  08 0d 92 42 5b c2 81 c0  |.RE.z6G....B[...|
-00000110  be 97 79 98 40 fb 4f 6d  14 fd 2b 13 8b c2 a5 2e  |..y.@.Om..+.....|
-00000120  67 d8 d4 09 9e d6 22 38  b7 4a 0b 74 73 2b c2 34  |g....."8.J.ts+.4|
-00000130  f1 d1 93 e5 96 d9 74 7b  f3 58 9f 6c 61 3c c0 b0  |......t{.X.la<..|
-00000140  41 d4 d9 2b 2b 24 23 77  5b 1c 3b bd 75 5d ce 20  |A..++$#w[.;.u]. |
-00000150  54 cf a1 63 87 1d 1e 24  c4 f3 1d 1a 50 8b aa b6  |T..c...$....P...|
-00000160  14 43 ed 97 a7 75 62 f4  14 c8 52 d7 02 03 01 00  |.C...ub...R.....|
-00000170  01 a3 81 93 30 81 90 30  0e 06 03 55 1d 0f 01 01  |....0..0...U....|
-00000180  ff 04 04 03 02 05 a0 30  1d 06 03 55 1d 25 04 16  |.......0...U.%..|
-00000190  30 14 06 08 2b 06 01 05  05 07 03 01 06 08 2b 06  |0...+.........+.|
-000001a0  01 05 05 07 03 02 30 0c  06 03 55 1d 13 01 01 ff  |......0...U.....|
-000001b0  04 02 30 00 30 19 06 03  55 1d 0e 04 12 04 10 9f  |..0.0...U.......|
-000001c0  91 16 1f 43 43 3e 49 a6  de 6d b6 80 d7 9f 60 30  |...CC>I..m....`0|
-000001d0  1b 06 03 55 1d 23 04 14  30 12 80 10 48 13 49 4d  |...U.#..0...H.IM|
-000001e0  13 7e 16 31 bb a3 01 d5  ac ab 6e 7b 30 19 06 03  |.~.1......n{0...|
-000001f0  55 1d 11 04 12 30 10 82  0e 65 78 61 6d 70 6c 65  |U....0...example|
-00000200  2e 67 6f 6c 61 6e 67 30  0d 06 09 2a 86 48 86 f7  |.golang0...*.H..|
-00000210  0d 01 01 0b 05 00 03 81  81 00 9d 30 cc 40 2b 5b  |...........0.@+[|
-00000220  50 a0 61 cb ba e5 53 58  e1 ed 83 28 a9 58 1a a9  |P.a...SX...(.X..|
-00000230  38 a4 95 a1 ac 31 5a 1a  84 66 3d 43 d3 2d d9 0b  |8....1Z..f=C.-..|
-00000240  f2 97 df d3 20 64 38 92  24 3a 00 bc cf 9c 7d b7  |.... d8.$:....}.|
-00000250  40 20 01 5f aa d3 16 61  09 a2 76 fd 13 c3 cc e1  |@ ._...a..v.....|
-00000260  0c 5c ee b1 87 82 f1 6c  04 ed 73 bb b3 43 77 8d  |.\.....l..s..Cw.|
-00000270  0c 1c f1 0f a1 d8 40 83  61 c9 4c 72 2b 9d ae db  |......@.a.Lr+...|
-00000280  46 06 06 4d f4 c1 b3 3e  c0 d1 bd 42 d4 db fe 3d  |F..M...>...B...=|
-00000290  13 60 84 5c 21 d3 3b e9  fa e7 16 03 03 00 04 0e  |.`.\!.;.........|
-000002a0  00 00 00                                          |...|
+00000030  09 ff 01 00 01 00 00 17  00 00 16 03 03 02 59 0b  |..............Y.|
+00000040  00 02 55 00 02 52 00 02  4f 30 82 02 4b 30 82 01  |..U..R..O0..K0..|
+00000050  b4 a0 03 02 01 02 02 09  00 e8 f0 9d 3f e2 5b ea  |............?.[.|
+00000060  a6 30 0d 06 09 2a 86 48  86 f7 0d 01 01 0b 05 00  |.0...*.H........|
+00000070  30 1f 31 0b 30 09 06 03  55 04 0a 13 02 47 6f 31  |0.1.0...U....Go1|
+00000080  10 30 0e 06 03 55 04 03  13 07 47 6f 20 52 6f 6f  |.0...U....Go Roo|
+00000090  74 30 1e 17 0d 31 36 30  31 30 31 30 30 30 30 30  |t0...16010100000|
+000000a0  30 5a 17 0d 32 35 30 31  30 31 30 30 30 30 30 30  |0Z..250101000000|
+000000b0  5a 30 1a 31 0b 30 09 06  03 55 04 0a 13 02 47 6f  |Z0.1.0...U....Go|
+000000c0  31 0b 30 09 06 03 55 04  03 13 02 47 6f 30 81 9f  |1.0...U....Go0..|
+000000d0  30 0d 06 09 2a 86 48 86  f7 0d 01 01 01 05 00 03  |0...*.H.........|
+000000e0  81 8d 00 30 81 89 02 81  81 00 db 46 7d 93 2e 12  |...0.......F}...|
+000000f0  27 06 48 bc 06 28 21 ab  7e c4 b6 a2 5d fe 1e 52  |'.H..(!.~...]..R|
+00000100  45 88 7a 36 47 a5 08 0d  92 42 5b c2 81 c0 be 97  |E.z6G....B[.....|
+00000110  79 98 40 fb 4f 6d 14 fd  2b 13 8b c2 a5 2e 67 d8  |y.@.Om..+.....g.|
+00000120  d4 09 9e d6 22 38 b7 4a  0b 74 73 2b c2 34 f1 d1  |...."8.J.ts+.4..|
+00000130  93 e5 96 d9 74 7b f3 58  9f 6c 61 3c c0 b0 41 d4  |....t{.X.la<..A.|
+00000140  d9 2b 2b 24 23 77 5b 1c  3b bd 75 5d ce 20 54 cf  |.++$#w[.;.u]. T.|
+00000150  a1 63 87 1d 1e 24 c4 f3  1d 1a 50 8b aa b6 14 43  |.c...$....P....C|
+00000160  ed 97 a7 75 62 f4 14 c8  52 d7 02 03 01 00 01 a3  |...ub...R.......|
+00000170  81 93 30 81 90 30 0e 06  03 55 1d 0f 01 01 ff 04  |..0..0...U......|
+00000180  04 03 02 05 a0 30 1d 06  03 55 1d 25 04 16 30 14  |.....0...U.%..0.|
+00000190  06 08 2b 06 01 05 05 07  03 01 06 08 2b 06 01 05  |..+.........+...|
+000001a0  05 07 03 02 30 0c 06 03  55 1d 13 01 01 ff 04 02  |....0...U.......|
+000001b0  30 00 30 19 06 03 55 1d  0e 04 12 04 10 9f 91 16  |0.0...U.........|
+000001c0  1f 43 43 3e 49 a6 de 6d  b6 80 d7 9f 60 30 1b 06  |.CC>I..m....`0..|
+000001d0  03 55 1d 23 04 14 30 12  80 10 48 13 49 4d 13 7e  |.U.#..0...H.IM.~|
+000001e0  16 31 bb a3 01 d5 ac ab  6e 7b 30 19 06 03 55 1d  |.1......n{0...U.|
+000001f0  11 04 12 30 10 82 0e 65  78 61 6d 70 6c 65 2e 67  |...0...example.g|
+00000200  6f 6c 61 6e 67 30 0d 06  09 2a 86 48 86 f7 0d 01  |olang0...*.H....|
+00000210  01 0b 05 00 03 81 81 00  9d 30 cc 40 2b 5b 50 a0  |.........0.@+[P.|
+00000220  61 cb ba e5 53 58 e1 ed  83 28 a9 58 1a a9 38 a4  |a...SX...(.X..8.|
+00000230  95 a1 ac 31 5a 1a 84 66  3d 43 d3 2d d9 0b f2 97  |...1Z..f=C.-....|
+00000240  df d3 20 64 38 92 24 3a  00 bc cf 9c 7d b7 40 20  |.. d8.$:....}.@ |
+00000250  01 5f aa d3 16 61 09 a2  76 fd 13 c3 cc e1 0c 5c  |._...a..v......\|
+00000260  ee b1 87 82 f1 6c 04 ed  73 bb b3 43 77 8d 0c 1c  |.....l..s..Cw...|
+00000270  f1 0f a1 d8 40 83 61 c9  4c 72 2b 9d ae db 46 06  |....@.a.Lr+...F.|
+00000280  06 4d f4 c1 b3 3e c0 d1  bd 42 d4 db fe 3d 13 60  |.M...>...B...=.`|
+00000290  84 5c 21 d3 3b e9 fa e7  16 03 03 00 04 0e 00 00  |.\!.;...........|
+000002a0  00                                                |.|
 >>> Flow 3 (client to server)
-00000000  16 03 03 00 86 10 00 00  82 00 80 57 ce 41 c0 4d  |...........W.A.M|
-00000010  b1 69 27 6e cb 92 a5 71  52 85 e7 a8 69 b0 31 d1  |.i'n...qR...i.1.|
-00000020  0a b0 3d a6 9d ab 04 e8  a2 4c d8 67 95 97 da 63  |..=......L.g...c|
-00000030  f7 0b 6e 62 29 5b 8b cf  77 f1 80 a5 1f 67 08 71  |..nb)[..w....g.q|
-00000040  50 c3 a9 90 ea b8 11 3d  5d c9 f5 1c 37 fa 67 b1  |P......=]...7.g.|
-00000050  64 b0 04 3e c1 0d db 77  fe b9 a0 ea f2 0f 1d af  |d..>...w........|
-00000060  9a 77 b3 96 4f 3f 3c 52  a7 ed c4 3f 48 ef ff f8  |.w..O?<R...?H...|
-00000070  38 f6 34 60 5a 29 12 37  85 23 1c 39 8e 1a a7 2f  |8.4`Z).7.#.9.../|
-00000080  68 39 1f 37 ed 08 a8 a5  b2 c1 f0 14 03 03 00 01  |h9.7............|
-00000090  01 16 03 03 00 30 8d 64  b1 cb 97 76 8a 78 08 d1  |.....0.d...v.x..|
-000000a0  c0 af 60 9c 0d f0 ae 41  93 f4 97 2b 46 f7 65 52  |..`....A...+F.eR|
-000000b0  55 a7 90 4a 83 47 cc e4  51 29 0d 6e 0b 42 52 c2  |U..J.G..Q).n.BR.|
-000000c0  bf 13 b8 01 72 d3                                 |....r.|
+00000000  16 03 03 00 86 10 00 00  82 00 80 bc bb c4 2a df  |..............*.|
+00000010  56 75 8b 3e e1 cd 12 f8  58 29 4d 4d ab f0 12 0c  |Vu.>....X)MM....|
+00000020  d7 20 3b cb d5 68 5e c1  a4 03 89 f7 d4 f4 ee c9  |. ;..h^.........|
+00000030  38 8e bb 42 de e4 fb c6  9f df db 7f af 6c ae b5  |8..B.........l..|
+00000040  6a 99 70 3c 1e 88 38 22  aa 1e 81 51 1e 7d 36 31  |j.p<..8"...Q.}61|
+00000050  4e d2 a9 08 c0 bc 11 d8  27 41 26 75 f3 35 74 74  |N.......'A&u.5tt|
+00000060  ef 50 0e 2b bd da 41 ed  81 56 b9 e4 13 74 e9 80  |.P.+..A..V...t..|
+00000070  9f a2 90 d1 fd 85 26 02  f3 aa 75 53 d9 58 bc 2f  |......&...uS.X./|
+00000080  3b e5 60 cb f8 ac e6 32  6e 5f 80 14 03 03 00 01  |;.`....2n_......|
+00000090  01 16 03 03 00 30 8c e6  a6 6a 76 aa 84 32 0c 6b  |.....0...jv..2.k|
+000000a0  17 41 9d 56 46 46 5c 34  a1 37 d5 7f e6 ab 55 de  |.A.VFF\4.7....U.|
+000000b0  70 54 69 0a 6d 18 1c 14  87 ee 73 8b f9 57 37 2f  |pTi.m.....s..W7/|
+000000c0  2e bb 07 4c f1 a9                                 |...L..|
 >>> 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 0d 0f 3c 6a 28  f0 97 90 1a c3 7e c8 63  |.....<j(.....~.c|
-00000020  15 75 1b 71 c8 bb 7d 83  b0 9b a6 73 3d 3d 51 7a  |.u.q..}....s==Qz|
-00000030  52 5b e4 33 16 93 40 23  43 7c a2 17 03 03 00 30  |R[.3..@#C|.....0|
-00000040  00 00 00 00 00 00 00 00  be db 1d 03 aa 15 53 49  |..............SI|
-00000050  a3 57 00 24 75 3a b1 48  71 ec d9 7d e1 40 5c dc  |.W.$u:.Hq..}.@\.|
-00000060  fd f5 33 6f 6b c7 3e 9e  2e 05 af 1b 12 73 75 8c  |..3ok.>......su.|
-00000070  15 03 03 00 20 00 00 00  00 00 00 00 00 5c 30 63  |.... ........\0c|
-00000080  23 55 26 ee 8d 81 9a 2e  b4 e7 38 6b 04 e7 42 43  |#U&.......8k..BC|
-00000090  50 de 1e 40 2d                                    |P..@-|
+00000010  00 00 00 49 b9 2a 89 cb  6e 15 d4 a6 f7 24 a5 3a  |...I.*..n....$.:|
+00000020  da f3 5b ac ff 43 a2 a6  5b 27 36 9c 6d 55 ba c8  |..[..C..['6.mU..|
+00000030  f4 77 f7 44 8c bc a7 5e  3f c6 59 17 03 03 00 30  |.w.D...^?.Y....0|
+00000040  00 00 00 00 00 00 00 00  44 44 d7 76 36 88 a6 84  |........DD.v6...|
+00000050  02 27 40 d6 d1 bb a5 20  41 d5 06 66 3a 56 05 94  |.'@.... A..f:V..|
+00000060  41 97 fc 85 95 70 28 85  7a 7a ce 43 71 5d ad a8  |A....p(.zz.Cq]..|
+00000070  15 03 03 00 20 00 00 00  00 00 00 00 00 8e 63 57  |.... .........cW|
+00000080  61 6d c1 0b ca ea 89 9e  b4 9e 6d fb 9f 3b 2a fc  |am........m..;*.|
+00000090  a0 56 d1 21 5d                                    |.V.!]|
diff --git a/src/crypto/tls/testdata/Server-TLSv12-RSA-AES b/src/crypto/tls/testdata/Server-TLSv12-RSA-AES
index 0196e21..68a1cb1 100644
--- a/src/crypto/tls/testdata/Server-TLSv12-RSA-AES
+++ b/src/crypto/tls/testdata/Server-TLSv12-RSA-AES
@@ -1,84 +1,82 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 97 01 00 00  93 03 03 dd 28 eb 68 4a  |............(.hJ|
-00000010  8a 71 d2 98 d0 2d 21 c7  e9 19 19 de c8 13 0b 67  |.q...-!........g|
-00000020  f4 ff 4c d0 37 f5 72 9f  2d fb b3 00 00 04 00 2f  |..L.7.r.-....../|
-00000030  00 ff 01 00 00 66 00 00  00 0e 00 0c 00 00 09 31  |.....f.........1|
-00000040  32 37 2e 30 2e 30 2e 31  00 0b 00 04 03 00 01 02  |27.0.0.1........|
-00000050  00 0a 00 0c 00 0a 00 1d  00 17 00 1e 00 19 00 18  |................|
-00000060  00 16 00 00 00 17 00 00  00 0d 00 30 00 2e 04 03  |...........0....|
-00000070  05 03 06 03 08 07 08 08  08 09 08 0a 08 0b 08 04  |................|
-00000080  08 05 08 06 04 01 05 01  06 01 03 03 02 03 03 01  |................|
-00000090  02 01 03 02 02 02 04 02  05 02 06 02              |............|
+00000000  16 03 01 00 6d 01 00 00  69 03 03 0a b6 18 8a 8f  |....m...i.......|
+00000010  90 e2 fb ee cd e3 d5 62  53 17 45 bd b3 7f 53 4d  |.......bS.E...SM|
+00000020  4e 06 62 66 25 60 b1 3f  96 b0 21 00 00 04 00 2f  |N.bf%`.?..!..../|
+00000030  00 ff 01 00 00 3c 00 16  00 00 00 17 00 00 00 0d  |.....<..........|
+00000040  00 30 00 2e 04 03 05 03  06 03 08 07 08 08 08 09  |.0..............|
+00000050  08 0a 08 0b 08 04 08 05  08 06 04 01 05 01 06 01  |................|
+00000060  03 03 02 03 03 01 02 01  03 02 02 02 04 02 05 02  |................|
+00000070  06 02                                             |..|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 37 02 00 00  33 03 03 00 00 00 00 00  |....7...3.......|
+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 44 4f 57 4e 47  52 44 01 00 00 2f 00 00  |...DOWNGRD.../..|
-00000030  0b ff 01 00 01 00 00 0b  00 02 01 00 16 03 03 02  |................|
-00000040  59 0b 00 02 55 00 02 52  00 02 4f 30 82 02 4b 30  |Y...U..R..O0..K0|
-00000050  82 01 b4 a0 03 02 01 02  02 09 00 e8 f0 9d 3f e2  |..............?.|
-00000060  5b ea a6 30 0d 06 09 2a  86 48 86 f7 0d 01 01 0b  |[..0...*.H......|
-00000070  05 00 30 1f 31 0b 30 09  06 03 55 04 0a 13 02 47  |..0.1.0...U....G|
-00000080  6f 31 10 30 0e 06 03 55  04 03 13 07 47 6f 20 52  |o1.0...U....Go R|
-00000090  6f 6f 74 30 1e 17 0d 31  36 30 31 30 31 30 30 30  |oot0...160101000|
-000000a0  30 30 30 5a 17 0d 32 35  30 31 30 31 30 30 30 30  |000Z..2501010000|
-000000b0  30 30 5a 30 1a 31 0b 30  09 06 03 55 04 0a 13 02  |00Z0.1.0...U....|
-000000c0  47 6f 31 0b 30 09 06 03  55 04 03 13 02 47 6f 30  |Go1.0...U....Go0|
-000000d0  81 9f 30 0d 06 09 2a 86  48 86 f7 0d 01 01 01 05  |..0...*.H.......|
-000000e0  00 03 81 8d 00 30 81 89  02 81 81 00 db 46 7d 93  |.....0.......F}.|
-000000f0  2e 12 27 06 48 bc 06 28  21 ab 7e c4 b6 a2 5d fe  |..'.H..(!.~...].|
-00000100  1e 52 45 88 7a 36 47 a5  08 0d 92 42 5b c2 81 c0  |.RE.z6G....B[...|
-00000110  be 97 79 98 40 fb 4f 6d  14 fd 2b 13 8b c2 a5 2e  |..y.@.Om..+.....|
-00000120  67 d8 d4 09 9e d6 22 38  b7 4a 0b 74 73 2b c2 34  |g....."8.J.ts+.4|
-00000130  f1 d1 93 e5 96 d9 74 7b  f3 58 9f 6c 61 3c c0 b0  |......t{.X.la<..|
-00000140  41 d4 d9 2b 2b 24 23 77  5b 1c 3b bd 75 5d ce 20  |A..++$#w[.;.u]. |
-00000150  54 cf a1 63 87 1d 1e 24  c4 f3 1d 1a 50 8b aa b6  |T..c...$....P...|
-00000160  14 43 ed 97 a7 75 62 f4  14 c8 52 d7 02 03 01 00  |.C...ub...R.....|
-00000170  01 a3 81 93 30 81 90 30  0e 06 03 55 1d 0f 01 01  |....0..0...U....|
-00000180  ff 04 04 03 02 05 a0 30  1d 06 03 55 1d 25 04 16  |.......0...U.%..|
-00000190  30 14 06 08 2b 06 01 05  05 07 03 01 06 08 2b 06  |0...+.........+.|
-000001a0  01 05 05 07 03 02 30 0c  06 03 55 1d 13 01 01 ff  |......0...U.....|
-000001b0  04 02 30 00 30 19 06 03  55 1d 0e 04 12 04 10 9f  |..0.0...U.......|
-000001c0  91 16 1f 43 43 3e 49 a6  de 6d b6 80 d7 9f 60 30  |...CC>I..m....`0|
-000001d0  1b 06 03 55 1d 23 04 14  30 12 80 10 48 13 49 4d  |...U.#..0...H.IM|
-000001e0  13 7e 16 31 bb a3 01 d5  ac ab 6e 7b 30 19 06 03  |.~.1......n{0...|
-000001f0  55 1d 11 04 12 30 10 82  0e 65 78 61 6d 70 6c 65  |U....0...example|
-00000200  2e 67 6f 6c 61 6e 67 30  0d 06 09 2a 86 48 86 f7  |.golang0...*.H..|
-00000210  0d 01 01 0b 05 00 03 81  81 00 9d 30 cc 40 2b 5b  |...........0.@+[|
-00000220  50 a0 61 cb ba e5 53 58  e1 ed 83 28 a9 58 1a a9  |P.a...SX...(.X..|
-00000230  38 a4 95 a1 ac 31 5a 1a  84 66 3d 43 d3 2d d9 0b  |8....1Z..f=C.-..|
-00000240  f2 97 df d3 20 64 38 92  24 3a 00 bc cf 9c 7d b7  |.... d8.$:....}.|
-00000250  40 20 01 5f aa d3 16 61  09 a2 76 fd 13 c3 cc e1  |@ ._...a..v.....|
-00000260  0c 5c ee b1 87 82 f1 6c  04 ed 73 bb b3 43 77 8d  |.\.....l..s..Cw.|
-00000270  0c 1c f1 0f a1 d8 40 83  61 c9 4c 72 2b 9d ae db  |......@.a.Lr+...|
-00000280  46 06 06 4d f4 c1 b3 3e  c0 d1 bd 42 d4 db fe 3d  |F..M...>...B...=|
-00000290  13 60 84 5c 21 d3 3b e9  fa e7 16 03 03 00 04 0e  |.`.\!.;.........|
-000002a0  00 00 00                                          |...|
+00000030  09 ff 01 00 01 00 00 17  00 00 16 03 03 02 59 0b  |..............Y.|
+00000040  00 02 55 00 02 52 00 02  4f 30 82 02 4b 30 82 01  |..U..R..O0..K0..|
+00000050  b4 a0 03 02 01 02 02 09  00 e8 f0 9d 3f e2 5b ea  |............?.[.|
+00000060  a6 30 0d 06 09 2a 86 48  86 f7 0d 01 01 0b 05 00  |.0...*.H........|
+00000070  30 1f 31 0b 30 09 06 03  55 04 0a 13 02 47 6f 31  |0.1.0...U....Go1|
+00000080  10 30 0e 06 03 55 04 03  13 07 47 6f 20 52 6f 6f  |.0...U....Go Roo|
+00000090  74 30 1e 17 0d 31 36 30  31 30 31 30 30 30 30 30  |t0...16010100000|
+000000a0  30 5a 17 0d 32 35 30 31  30 31 30 30 30 30 30 30  |0Z..250101000000|
+000000b0  5a 30 1a 31 0b 30 09 06  03 55 04 0a 13 02 47 6f  |Z0.1.0...U....Go|
+000000c0  31 0b 30 09 06 03 55 04  03 13 02 47 6f 30 81 9f  |1.0...U....Go0..|
+000000d0  30 0d 06 09 2a 86 48 86  f7 0d 01 01 01 05 00 03  |0...*.H.........|
+000000e0  81 8d 00 30 81 89 02 81  81 00 db 46 7d 93 2e 12  |...0.......F}...|
+000000f0  27 06 48 bc 06 28 21 ab  7e c4 b6 a2 5d fe 1e 52  |'.H..(!.~...]..R|
+00000100  45 88 7a 36 47 a5 08 0d  92 42 5b c2 81 c0 be 97  |E.z6G....B[.....|
+00000110  79 98 40 fb 4f 6d 14 fd  2b 13 8b c2 a5 2e 67 d8  |y.@.Om..+.....g.|
+00000120  d4 09 9e d6 22 38 b7 4a  0b 74 73 2b c2 34 f1 d1  |...."8.J.ts+.4..|
+00000130  93 e5 96 d9 74 7b f3 58  9f 6c 61 3c c0 b0 41 d4  |....t{.X.la<..A.|
+00000140  d9 2b 2b 24 23 77 5b 1c  3b bd 75 5d ce 20 54 cf  |.++$#w[.;.u]. T.|
+00000150  a1 63 87 1d 1e 24 c4 f3  1d 1a 50 8b aa b6 14 43  |.c...$....P....C|
+00000160  ed 97 a7 75 62 f4 14 c8  52 d7 02 03 01 00 01 a3  |...ub...R.......|
+00000170  81 93 30 81 90 30 0e 06  03 55 1d 0f 01 01 ff 04  |..0..0...U......|
+00000180  04 03 02 05 a0 30 1d 06  03 55 1d 25 04 16 30 14  |.....0...U.%..0.|
+00000190  06 08 2b 06 01 05 05 07  03 01 06 08 2b 06 01 05  |..+.........+...|
+000001a0  05 07 03 02 30 0c 06 03  55 1d 13 01 01 ff 04 02  |....0...U.......|
+000001b0  30 00 30 19 06 03 55 1d  0e 04 12 04 10 9f 91 16  |0.0...U.........|
+000001c0  1f 43 43 3e 49 a6 de 6d  b6 80 d7 9f 60 30 1b 06  |.CC>I..m....`0..|
+000001d0  03 55 1d 23 04 14 30 12  80 10 48 13 49 4d 13 7e  |.U.#..0...H.IM.~|
+000001e0  16 31 bb a3 01 d5 ac ab  6e 7b 30 19 06 03 55 1d  |.1......n{0...U.|
+000001f0  11 04 12 30 10 82 0e 65  78 61 6d 70 6c 65 2e 67  |...0...example.g|
+00000200  6f 6c 61 6e 67 30 0d 06  09 2a 86 48 86 f7 0d 01  |olang0...*.H....|
+00000210  01 0b 05 00 03 81 81 00  9d 30 cc 40 2b 5b 50 a0  |.........0.@+[P.|
+00000220  61 cb ba e5 53 58 e1 ed  83 28 a9 58 1a a9 38 a4  |a...SX...(.X..8.|
+00000230  95 a1 ac 31 5a 1a 84 66  3d 43 d3 2d d9 0b f2 97  |...1Z..f=C.-....|
+00000240  df d3 20 64 38 92 24 3a  00 bc cf 9c 7d b7 40 20  |.. d8.$:....}.@ |
+00000250  01 5f aa d3 16 61 09 a2  76 fd 13 c3 cc e1 0c 5c  |._...a..v......\|
+00000260  ee b1 87 82 f1 6c 04 ed  73 bb b3 43 77 8d 0c 1c  |.....l..s..Cw...|
+00000270  f1 0f a1 d8 40 83 61 c9  4c 72 2b 9d ae db 46 06  |....@.a.Lr+...F.|
+00000280  06 4d f4 c1 b3 3e c0 d1  bd 42 d4 db fe 3d 13 60  |.M...>...B...=.`|
+00000290  84 5c 21 d3 3b e9 fa e7  16 03 03 00 04 0e 00 00  |.\!.;...........|
+000002a0  00                                                |.|
 >>> Flow 3 (client to server)
-00000000  16 03 03 00 86 10 00 00  82 00 80 c0 37 ef f3 d9  |............7...|
-00000010  6b 7b 3f c4 9f 46 d2 6b  8f 7f 8d ce 89 cf 8e 2b  |k{?..F.k.......+|
-00000020  1f 0d 86 f9 90 5a 23 28  6c d3 14 ce 2a 0b f1 0e  |.....Z#(l...*...|
-00000030  96 1c 11 7d c0 b8 fb 4b  2e cb 07 1c fe b9 e1 62  |...}...K.......b|
-00000040  2c 38 1c 46 21 74 23 a9  f2 0b 15 36 ef 88 32 e8  |,8.F!t#....6..2.|
-00000050  28 66 8e ab 14 be e9 02  04 9d 92 99 cc 6e 28 d0  |(f...........n(.|
-00000060  f9 3d dc 61 7f f7 17 59  ab 1c 86 94 9a 28 7b 46  |.=.a...Y.....({F|
-00000070  3c 36 ff d3 26 3c ad 2d  33 ef 99 83 09 a5 a8 2f  |<6..&<.-3....../|
-00000080  b3 a3 74 7f 49 a3 f1 47  7d 8c 12 14 03 03 00 01  |..t.I..G}.......|
-00000090  01 16 03 03 00 40 32 68  cb ea 32 cb f2 7a 0e 4b  |.....@2h..2..z.K|
-000000a0  63 72 96 93 e8 2d 5b 22  a6 3a 05 9d 60 50 e5 d0  |cr...-[".:..`P..|
-000000b0  f3 f8 14 ed 81 fe 17 a0  ee 3f 7b aa ca dc 06 bc  |.........?{.....|
-000000c0  28 90 73 33 84 0c 92 39  b7 cb da 06 08 05 0b 03  |(.s3...9........|
-000000d0  86 be cc 70 0e c2                                 |...p..|
+00000000  16 03 03 00 86 10 00 00  82 00 80 19 dc d4 4c b0  |..............L.|
+00000010  5c 30 24 b8 fd e1 cd 4e  af bc c3 f5 78 12 8c 51  |\0$....N....x..Q|
+00000020  a9 a9 ab fd 87 72 a4 bc  0c fc 87 5e 1d af 67 02  |.....r.....^..g.|
+00000030  13 c5 c2 8c 00 5f 33 d1  86 43 50 b3 3a 1d b8 69  |....._3..CP.:..i|
+00000040  b1 2f ce 82 cd 8d 31 0d  15 c1 fb af b3 47 64 57  |./....1......GdW|
+00000050  38 24 33 46 03 d5 ba 33  36 a0 eb de 21 2b ae 64  |8$3F...36...!+.d|
+00000060  cc 0c 43 fe a3 7b 34 a1  d2 de d5 85 ec ac c7 0d  |..C..{4.........|
+00000070  04 ec 63 62 ab fe 86 ba  e9 ee 31 2c 09 84 13 6a  |..cb......1,...j|
+00000080  10 bc 0f 71 93 9d e8 c4  e3 f6 a9 14 03 03 00 01  |...q............|
+00000090  01 16 03 03 00 40 b7 75  28 6e 6b 9a 60 8f fc 5b  |.....@.u(nk.`..[|
+000000a0  91 0a 16 54 ec b1 4b 55  b8 b2 5c 53 48 92 aa dc  |...T..KU..\SH...|
+000000b0  55 64 2c b0 dc 77 b4 6f  7a a9 23 9c 44 8b 74 64  |Ud,..w.oz.#.D.td|
+000000c0  c5 28 ea c7 8d 97 9b c8  a3 ec 11 d7 93 81 08 20  |.(............. |
+000000d0  9c 2f 79 32 92 45                                 |./y2.E|
 >>> 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 10 a0 48 48 86  |.............HH.|
-00000020  ac 1f f4 05 4d 12 9d 90  54 26 ec c8 1f 6d e7 d5  |....M...T&...m..|
-00000030  0c 92 61 88 2f 43 77 75  0c 08 0f 33 ac c3 d3 b0  |..a./Cwu...3....|
-00000040  94 68 e3 3f 9f c9 43 a5  8b ee ed 17 03 03 00 40  |.h.?..C........@|
+00000010  00 00 00 00 00 00 00 00  00 00 00 92 50 e8 02 a0  |............P...|
+00000020  14 d6 03 5d db bb 29 21  09 a3 71 08 54 f3 5e 7c  |...]..)!..q.T.^||
+00000030  9a 64 18 f3 4f 64 84 4d  b7 e9 82 a8 2c 3b 46 70  |.d..Od.M....,;Fp|
+00000040  cb cb de b5 e3 c3 12 d5  7b 6f 08 17 03 03 00 40  |........{o.....@|
 00000050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000060  fd 7d d3 d6 3f a5 10 37  a1 93 20 ca c8 8c 9d c3  |.}..?..7.. .....|
-00000070  90 df 2f 40 e6 83 af b6  be e4 3d 07 ff 0d 24 97  |../@......=...$.|
-00000080  c2 ff af 81 eb b5 91 72  6b 6d 70 8c af 3f 9f 76  |.......rkmp..?.v|
+00000060  4f 4f fe dd e5 b1 38 6b  b1 2f 5d 23 8b b2 34 b1  |OO....8k./]#..4.|
+00000070  c6 9f 8d 32 83 5f b5 36  0b df a6 aa 3f 90 30 b7  |...2._.6....?.0.|
+00000080  1d 66 26 89 29 ab 71 dc  00 14 d6 8e 7e 47 bd ee  |.f&.).q.....~G..|
 00000090  15 03 03 00 30 00 00 00  00 00 00 00 00 00 00 00  |....0...........|
-000000a0  00 00 00 00 00 6b 80 aa  88 45 8c 39 a8 4c ca 33  |.....k...E.9.L.3|
-000000b0  f2 33 85 a0 74 6a 64 a3  43 17 4c 5c 9b 50 e5 8d  |.3..tjd.C.L\.P..|
-000000c0  ff 26 03 e1 07                                    |.&...|
+000000a0  00 00 00 00 00 e3 72 e5  7c 8c c6 f5 72 ba 37 52  |......r.|...r.7R|
+000000b0  be 38 a0 a2 62 71 d9 f6  a2 9e b5 4a af 0f 13 3e  |.8..bq.....J...>|
+000000c0  3c 85 ab ea eb                                    |<....|
diff --git a/src/crypto/tls/testdata/Server-TLSv12-RSA-AES-GCM b/src/crypto/tls/testdata/Server-TLSv12-RSA-AES-GCM
index fa4b47b..8d8c3b4 100644
--- a/src/crypto/tls/testdata/Server-TLSv12-RSA-AES-GCM
+++ b/src/crypto/tls/testdata/Server-TLSv12-RSA-AES-GCM
@@ -1,82 +1,81 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 97 01 00 00  93 03 03 8a ca f1 8f ad  |................|
-00000010  fe 0b a3 e1 b8 08 10 1a  40 57 b6 f7 f7 e3 72 c4  |........@W....r.|
-00000020  57 4a 71 f8 30 cd 62 62  c7 0f 2d 00 00 04 c0 2f  |WJq.0.bb..-..../|
-00000030  00 ff 01 00 00 66 00 00  00 0e 00 0c 00 00 09 31  |.....f.........1|
-00000040  32 37 2e 30 2e 30 2e 31  00 0b 00 04 03 00 01 02  |27.0.0.1........|
-00000050  00 0a 00 0c 00 0a 00 1d  00 17 00 1e 00 19 00 18  |................|
-00000060  00 16 00 00 00 17 00 00  00 0d 00 30 00 2e 04 03  |...........0....|
-00000070  05 03 06 03 08 07 08 08  08 09 08 0a 08 0b 08 04  |................|
-00000080  08 05 08 06 04 01 05 01  06 01 03 03 02 03 03 01  |................|
-00000090  02 01 03 02 02 02 04 02  05 02 06 02              |............|
+00000000  16 03 01 00 85 01 00 00  81 03 03 6e 70 d5 90 98  |...........np...|
+00000010  0a 70 40 22 4f 31 e8 7d  a0 81 bd 22 e8 4e 97 8b  |.p@"O1.}...".N..|
+00000020  4d bb 3d d1 d6 2f 09 b9  bd 2f 43 00 00 04 c0 2f  |M.=../.../C..../|
+00000030  00 ff 01 00 00 54 00 0b  00 04 03 00 01 02 00 0a  |.....T..........|
+00000040  00 0c 00 0a 00 1d 00 17  00 1e 00 19 00 18 00 16  |................|
+00000050  00 00 00 17 00 00 00 0d  00 30 00 2e 04 03 05 03  |.........0......|
+00000060  06 03 08 07 08 08 08 09  08 0a 08 0b 08 04 08 05  |................|
+00000070  08 06 04 01 05 01 06 01  03 03 02 03 03 01 02 01  |................|
+00000080  03 02 02 02 04 02 05 02  06 02                    |..........|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 37 02 00 00  33 03 03 00 00 00 00 00  |....7...3.......|
+00000000  16 03 03 00 3b 02 00 00  37 03 03 00 00 00 00 00  |....;...7.......|
 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000020  00 00 00 44 4f 57 4e 47  52 44 01 00 c0 2f 00 00  |...DOWNGRD.../..|
-00000030  0b ff 01 00 01 00 00 0b  00 02 01 00 16 03 03 02  |................|
-00000040  59 0b 00 02 55 00 02 52  00 02 4f 30 82 02 4b 30  |Y...U..R..O0..K0|
-00000050  82 01 b4 a0 03 02 01 02  02 09 00 e8 f0 9d 3f e2  |..............?.|
-00000060  5b ea a6 30 0d 06 09 2a  86 48 86 f7 0d 01 01 0b  |[..0...*.H......|
-00000070  05 00 30 1f 31 0b 30 09  06 03 55 04 0a 13 02 47  |..0.1.0...U....G|
-00000080  6f 31 10 30 0e 06 03 55  04 03 13 07 47 6f 20 52  |o1.0...U....Go R|
-00000090  6f 6f 74 30 1e 17 0d 31  36 30 31 30 31 30 30 30  |oot0...160101000|
-000000a0  30 30 30 5a 17 0d 32 35  30 31 30 31 30 30 30 30  |000Z..2501010000|
-000000b0  30 30 5a 30 1a 31 0b 30  09 06 03 55 04 0a 13 02  |00Z0.1.0...U....|
-000000c0  47 6f 31 0b 30 09 06 03  55 04 03 13 02 47 6f 30  |Go1.0...U....Go0|
-000000d0  81 9f 30 0d 06 09 2a 86  48 86 f7 0d 01 01 01 05  |..0...*.H.......|
-000000e0  00 03 81 8d 00 30 81 89  02 81 81 00 db 46 7d 93  |.....0.......F}.|
-000000f0  2e 12 27 06 48 bc 06 28  21 ab 7e c4 b6 a2 5d fe  |..'.H..(!.~...].|
-00000100  1e 52 45 88 7a 36 47 a5  08 0d 92 42 5b c2 81 c0  |.RE.z6G....B[...|
-00000110  be 97 79 98 40 fb 4f 6d  14 fd 2b 13 8b c2 a5 2e  |..y.@.Om..+.....|
-00000120  67 d8 d4 09 9e d6 22 38  b7 4a 0b 74 73 2b c2 34  |g....."8.J.ts+.4|
-00000130  f1 d1 93 e5 96 d9 74 7b  f3 58 9f 6c 61 3c c0 b0  |......t{.X.la<..|
-00000140  41 d4 d9 2b 2b 24 23 77  5b 1c 3b bd 75 5d ce 20  |A..++$#w[.;.u]. |
-00000150  54 cf a1 63 87 1d 1e 24  c4 f3 1d 1a 50 8b aa b6  |T..c...$....P...|
-00000160  14 43 ed 97 a7 75 62 f4  14 c8 52 d7 02 03 01 00  |.C...ub...R.....|
-00000170  01 a3 81 93 30 81 90 30  0e 06 03 55 1d 0f 01 01  |....0..0...U....|
-00000180  ff 04 04 03 02 05 a0 30  1d 06 03 55 1d 25 04 16  |.......0...U.%..|
-00000190  30 14 06 08 2b 06 01 05  05 07 03 01 06 08 2b 06  |0...+.........+.|
-000001a0  01 05 05 07 03 02 30 0c  06 03 55 1d 13 01 01 ff  |......0...U.....|
-000001b0  04 02 30 00 30 19 06 03  55 1d 0e 04 12 04 10 9f  |..0.0...U.......|
-000001c0  91 16 1f 43 43 3e 49 a6  de 6d b6 80 d7 9f 60 30  |...CC>I..m....`0|
-000001d0  1b 06 03 55 1d 23 04 14  30 12 80 10 48 13 49 4d  |...U.#..0...H.IM|
-000001e0  13 7e 16 31 bb a3 01 d5  ac ab 6e 7b 30 19 06 03  |.~.1......n{0...|
-000001f0  55 1d 11 04 12 30 10 82  0e 65 78 61 6d 70 6c 65  |U....0...example|
-00000200  2e 67 6f 6c 61 6e 67 30  0d 06 09 2a 86 48 86 f7  |.golang0...*.H..|
-00000210  0d 01 01 0b 05 00 03 81  81 00 9d 30 cc 40 2b 5b  |...........0.@+[|
-00000220  50 a0 61 cb ba e5 53 58  e1 ed 83 28 a9 58 1a a9  |P.a...SX...(.X..|
-00000230  38 a4 95 a1 ac 31 5a 1a  84 66 3d 43 d3 2d d9 0b  |8....1Z..f=C.-..|
-00000240  f2 97 df d3 20 64 38 92  24 3a 00 bc cf 9c 7d b7  |.... d8.$:....}.|
-00000250  40 20 01 5f aa d3 16 61  09 a2 76 fd 13 c3 cc e1  |@ ._...a..v.....|
-00000260  0c 5c ee b1 87 82 f1 6c  04 ed 73 bb b3 43 77 8d  |.\.....l..s..Cw.|
-00000270  0c 1c f1 0f a1 d8 40 83  61 c9 4c 72 2b 9d ae db  |......@.a.Lr+...|
-00000280  46 06 06 4d f4 c1 b3 3e  c0 d1 bd 42 d4 db fe 3d  |F..M...>...B...=|
-00000290  13 60 84 5c 21 d3 3b e9  fa e7 16 03 03 00 ac 0c  |.`.\!.;.........|
-000002a0  00 00 a8 03 00 1d 20 2f  e5 7d a3 47 cd 62 43 15  |...... /.}.G.bC.|
-000002b0  28 da ac 5f bb 29 07 30  ff f6 84 af c4 cf c2 ed  |(.._.).0........|
-000002c0  90 99 5f 58 cb 3b 74 08  04 00 80 50 0b d9 1c 03  |.._X.;t....P....|
-000002d0  6f 08 05 a6 39 cc 9f 7e  3d f1 fb af 8e 0b 9a ef  |o...9..~=.......|
-000002e0  39 d3 b6 e3 71 9c 5a 37  a1 86 f2 f0 59 01 fc b2  |9...q.Z7....Y...|
-000002f0  51 1c 0e 22 42 24 3e c6  db fb a1 39 9d 75 f4 79  |Q.."B$>....9.u.y|
-00000300  55 dd e5 99 0b 22 5b ed  c7 19 ac db ed d3 ee 23  |U...."[........#|
-00000310  b9 37 2b 51 ea 7f 39 4d  8b 0a bc a2 2e f2 ef 9e  |.7+Q..9M........|
-00000320  a5 8c 99 77 ff d2 fb 46  e4 10 4e a9 b2 a9 ce b6  |...w...F..N.....|
-00000330  50 d4 0a 28 a5 3f 0e 2c  60 cd 0f 07 9c 7e 60 c3  |P..(.?.,`....~`.|
-00000340  79 a5 cf f3 cd 77 5a 16  8d fc 14 16 03 03 00 04  |y....wZ.........|
-00000350  0e 00 00 00                                       |....|
+00000030  0f ff 01 00 01 00 00 17  00 00 00 0b 00 02 01 00  |................|
+00000040  16 03 03 02 59 0b 00 02  55 00 02 52 00 02 4f 30  |....Y...U..R..O0|
+00000050  82 02 4b 30 82 01 b4 a0  03 02 01 02 02 09 00 e8  |..K0............|
+00000060  f0 9d 3f e2 5b ea a6 30  0d 06 09 2a 86 48 86 f7  |..?.[..0...*.H..|
+00000070  0d 01 01 0b 05 00 30 1f  31 0b 30 09 06 03 55 04  |......0.1.0...U.|
+00000080  0a 13 02 47 6f 31 10 30  0e 06 03 55 04 03 13 07  |...Go1.0...U....|
+00000090  47 6f 20 52 6f 6f 74 30  1e 17 0d 31 36 30 31 30  |Go Root0...16010|
+000000a0  31 30 30 30 30 30 30 5a  17 0d 32 35 30 31 30 31  |1000000Z..250101|
+000000b0  30 30 30 30 30 30 5a 30  1a 31 0b 30 09 06 03 55  |000000Z0.1.0...U|
+000000c0  04 0a 13 02 47 6f 31 0b  30 09 06 03 55 04 03 13  |....Go1.0...U...|
+000000d0  02 47 6f 30 81 9f 30 0d  06 09 2a 86 48 86 f7 0d  |.Go0..0...*.H...|
+000000e0  01 01 01 05 00 03 81 8d  00 30 81 89 02 81 81 00  |.........0......|
+000000f0  db 46 7d 93 2e 12 27 06  48 bc 06 28 21 ab 7e c4  |.F}...'.H..(!.~.|
+00000100  b6 a2 5d fe 1e 52 45 88  7a 36 47 a5 08 0d 92 42  |..]..RE.z6G....B|
+00000110  5b c2 81 c0 be 97 79 98  40 fb 4f 6d 14 fd 2b 13  |[.....y.@.Om..+.|
+00000120  8b c2 a5 2e 67 d8 d4 09  9e d6 22 38 b7 4a 0b 74  |....g....."8.J.t|
+00000130  73 2b c2 34 f1 d1 93 e5  96 d9 74 7b f3 58 9f 6c  |s+.4......t{.X.l|
+00000140  61 3c c0 b0 41 d4 d9 2b  2b 24 23 77 5b 1c 3b bd  |a<..A..++$#w[.;.|
+00000150  75 5d ce 20 54 cf a1 63  87 1d 1e 24 c4 f3 1d 1a  |u]. T..c...$....|
+00000160  50 8b aa b6 14 43 ed 97  a7 75 62 f4 14 c8 52 d7  |P....C...ub...R.|
+00000170  02 03 01 00 01 a3 81 93  30 81 90 30 0e 06 03 55  |........0..0...U|
+00000180  1d 0f 01 01 ff 04 04 03  02 05 a0 30 1d 06 03 55  |...........0...U|
+00000190  1d 25 04 16 30 14 06 08  2b 06 01 05 05 07 03 01  |.%..0...+.......|
+000001a0  06 08 2b 06 01 05 05 07  03 02 30 0c 06 03 55 1d  |..+.......0...U.|
+000001b0  13 01 01 ff 04 02 30 00  30 19 06 03 55 1d 0e 04  |......0.0...U...|
+000001c0  12 04 10 9f 91 16 1f 43  43 3e 49 a6 de 6d b6 80  |.......CC>I..m..|
+000001d0  d7 9f 60 30 1b 06 03 55  1d 23 04 14 30 12 80 10  |..`0...U.#..0...|
+000001e0  48 13 49 4d 13 7e 16 31  bb a3 01 d5 ac ab 6e 7b  |H.IM.~.1......n{|
+000001f0  30 19 06 03 55 1d 11 04  12 30 10 82 0e 65 78 61  |0...U....0...exa|
+00000200  6d 70 6c 65 2e 67 6f 6c  61 6e 67 30 0d 06 09 2a  |mple.golang0...*|
+00000210  86 48 86 f7 0d 01 01 0b  05 00 03 81 81 00 9d 30  |.H.............0|
+00000220  cc 40 2b 5b 50 a0 61 cb  ba e5 53 58 e1 ed 83 28  |.@+[P.a...SX...(|
+00000230  a9 58 1a a9 38 a4 95 a1  ac 31 5a 1a 84 66 3d 43  |.X..8....1Z..f=C|
+00000240  d3 2d d9 0b f2 97 df d3  20 64 38 92 24 3a 00 bc  |.-...... d8.$:..|
+00000250  cf 9c 7d b7 40 20 01 5f  aa d3 16 61 09 a2 76 fd  |..}.@ ._...a..v.|
+00000260  13 c3 cc e1 0c 5c ee b1  87 82 f1 6c 04 ed 73 bb  |.....\.....l..s.|
+00000270  b3 43 77 8d 0c 1c f1 0f  a1 d8 40 83 61 c9 4c 72  |.Cw.......@.a.Lr|
+00000280  2b 9d ae db 46 06 06 4d  f4 c1 b3 3e c0 d1 bd 42  |+...F..M...>...B|
+00000290  d4 db fe 3d 13 60 84 5c  21 d3 3b e9 fa e7 16 03  |...=.`.\!.;.....|
+000002a0  03 00 ac 0c 00 00 a8 03  00 1d 20 2f e5 7d a3 47  |.......... /.}.G|
+000002b0  cd 62 43 15 28 da ac 5f  bb 29 07 30 ff f6 84 af  |.bC.(.._.).0....|
+000002c0  c4 cf c2 ed 90 99 5f 58  cb 3b 74 08 04 00 80 49  |......_X.;t....I|
+000002d0  51 c7 81 cd e1 9f 67 83  76 7e 51 19 83 2a 34 47  |Q.....g.v~Q..*4G|
+000002e0  5a e8 6d 13 dd e5 44 eb  1a 20 42 ac d3 65 e8 2e  |Z.m...D.. B..e..|
+000002f0  8d c5 79 56 e6 5e 26 00  9b 2a 80 16 d8 2e af 42  |..yV.^&..*.....B|
+00000300  35 b7 0f f8 6a 41 87 b6  c5 6a 37 6e bc 17 5e a4  |5...jA...j7n..^.|
+00000310  1f ba 93 33 98 92 92 2e  76 7b 49 55 8d 37 c2 c3  |...3....v{IU.7..|
+00000320  d5 65 4a 73 84 28 6c 0a  4b 26 62 61 fa 46 0f 47  |.eJs.(l.K&ba.F.G|
+00000330  d5 e5 99 05 57 23 76 6d  c9 7b 0d 8d ff 91 98 eb  |....W#vm.{......|
+00000340  17 96 c0 00 a6 88 3c be  03 5b db e7 a5 84 ae 16  |......<..[......|
+00000350  03 03 00 04 0e 00 00 00                           |........|
 >>> Flow 3 (client to server)
-00000000  16 03 03 00 25 10 00 00  21 20 ef 3b b1 d2 a3 f6  |....%...! .;....|
-00000010  be f2 fc 2e b5 ed d3 ec  6a fb 2f 0d 5a 04 98 61  |........j./.Z..a|
-00000020  92 26 59 ba 17 26 1b 60  27 2b 14 03 03 00 01 01  |.&Y..&.`'+......|
-00000030  16 03 03 00 28 e2 94 22  bb 71 70 c8 a6 63 e5 6f  |....(..".qp..c.o|
-00000040  2e 00 0f b9 bf 6b 54 34  dc ce b0 12 0b 16 e5 ac  |.....kT4........|
-00000050  8f 6b 1e 96 a1 e3 86 b7  6f 8c 76 09 da           |.k......o.v..|
+00000000  16 03 03 00 25 10 00 00  21 20 7d 0c 38 84 cd 0b  |....%...! }.8...|
+00000010  d1 65 02 f7 ab 8b 8b 4e  8f 05 a5 ea 7a 32 db 1b  |.e.....N....z2..|
+00000020  e7 42 5b 2b 83 95 2b e1  aa 30 14 03 03 00 01 01  |.B[+..+..0......|
+00000030  16 03 03 00 28 7d f6 5b  8f 2e 17 84 50 23 db ad  |....(}.[....P#..|
+00000040  47 84 59 ba e8 d7 ab c5  28 dc 06 51 aa 9c 7a d0  |G.Y.....(..Q..z.|
+00000050  6e ae 27 90 e9 aa 92 9e  83 6f 4e eb 6a           |n.'......oN.j|
 >>> 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 f5 dc 00 28 06  03 50 9b b2 db 4d 89 25  |......(..P...M.%|
-00000020  3a 94 04 85 5b 7a 3f 16  fb 55 8f e0 c3 a3 33 21  |:...[z?..U....3!|
-00000030  65 84 c5 17 03 03 00 25  00 00 00 00 00 00 00 01  |e......%........|
-00000040  a9 35 62 24 4b 63 6e 62  1c 8f 99 e4 e0 3e f0 a2  |.5b$Kcnb.....>..|
-00000050  e3 02 34 6f 10 71 9c 6b  b3 4a 2d 7f 71 15 03 03  |..4o.q.k.J-.q...|
-00000060  00 1a 00 00 00 00 00 00  00 02 91 43 07 98 b1 ba  |...........C....|
-00000070  06 1b dd 21 46 82 63 67  8b bb 1f b5              |...!F.cg....|
+00000010  00 00 00 a5 ec 31 bb 01  5d a3 15 01 22 88 0e f1  |.....1..]..."...|
+00000020  2a 21 18 47 10 64 3d f0  d0 fb f8 fd 27 ed 34 88  |*!.G.d=.....'.4.|
+00000030  c1 b5 b3 17 03 03 00 25  00 00 00 00 00 00 00 01  |.......%........|
+00000040  e4 3c 6a db 2b a9 59 64  d1 3f 4b a0 98 37 52 03  |.<j.+.Yd.?K..7R.|
+00000050  b7 b1 6e 98 ed c0 da e4  75 63 27 64 c4 15 03 03  |..n.....uc'd....|
+00000060  00 1a 00 00 00 00 00 00  00 02 84 a5 21 7b b0 77  |............!{.w|
+00000070  83 03 52 57 79 1f 5c ec  75 da 49 89              |..RWy.\.u.I.|
diff --git a/src/crypto/tls/testdata/Server-TLSv12-RSA-AES256-GCM-SHA384 b/src/crypto/tls/testdata/Server-TLSv12-RSA-AES256-GCM-SHA384
index 2cc2c28..e1b8f7e 100644
--- a/src/crypto/tls/testdata/Server-TLSv12-RSA-AES256-GCM-SHA384
+++ b/src/crypto/tls/testdata/Server-TLSv12-RSA-AES256-GCM-SHA384
@@ -1,82 +1,81 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 97 01 00 00  93 03 03 0f 13 d8 49 94  |..............I.|
-00000010  b9 cc 41 1d d4 3d bb d2  c9 a3 2c 74 11 ca 01 e8  |..A..=....,t....|
-00000020  5b b0 2e 57 60 b5 30 37  2d b9 f0 00 00 04 c0 30  |[..W`.07-......0|
-00000030  00 ff 01 00 00 66 00 00  00 0e 00 0c 00 00 09 31  |.....f.........1|
-00000040  32 37 2e 30 2e 30 2e 31  00 0b 00 04 03 00 01 02  |27.0.0.1........|
-00000050  00 0a 00 0c 00 0a 00 1d  00 17 00 1e 00 19 00 18  |................|
-00000060  00 16 00 00 00 17 00 00  00 0d 00 30 00 2e 04 03  |...........0....|
-00000070  05 03 06 03 08 07 08 08  08 09 08 0a 08 0b 08 04  |................|
-00000080  08 05 08 06 04 01 05 01  06 01 03 03 02 03 03 01  |................|
-00000090  02 01 03 02 02 02 04 02  05 02 06 02              |............|
+00000000  16 03 01 00 85 01 00 00  81 03 03 0f 5a 3f b1 98  |............Z?..|
+00000010  d1 40 d3 93 3a cf 86 50  56 51 7a b4 1d f5 c8 53  |.@..:..PVQz....S|
+00000020  74 9e 5b c3 27 a3 7d fe  a3 4a 73 00 00 04 c0 30  |t.[.'.}..Js....0|
+00000030  00 ff 01 00 00 54 00 0b  00 04 03 00 01 02 00 0a  |.....T..........|
+00000040  00 0c 00 0a 00 1d 00 17  00 1e 00 19 00 18 00 16  |................|
+00000050  00 00 00 17 00 00 00 0d  00 30 00 2e 04 03 05 03  |.........0......|
+00000060  06 03 08 07 08 08 08 09  08 0a 08 0b 08 04 08 05  |................|
+00000070  08 06 04 01 05 01 06 01  03 03 02 03 03 01 02 01  |................|
+00000080  03 02 02 02 04 02 05 02  06 02                    |..........|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 37 02 00 00  33 03 03 00 00 00 00 00  |....7...3.......|
+00000000  16 03 03 00 3b 02 00 00  37 03 03 00 00 00 00 00  |....;...7.......|
 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000020  00 00 00 44 4f 57 4e 47  52 44 01 00 c0 30 00 00  |...DOWNGRD...0..|
-00000030  0b ff 01 00 01 00 00 0b  00 02 01 00 16 03 03 02  |................|
-00000040  59 0b 00 02 55 00 02 52  00 02 4f 30 82 02 4b 30  |Y...U..R..O0..K0|
-00000050  82 01 b4 a0 03 02 01 02  02 09 00 e8 f0 9d 3f e2  |..............?.|
-00000060  5b ea a6 30 0d 06 09 2a  86 48 86 f7 0d 01 01 0b  |[..0...*.H......|
-00000070  05 00 30 1f 31 0b 30 09  06 03 55 04 0a 13 02 47  |..0.1.0...U....G|
-00000080  6f 31 10 30 0e 06 03 55  04 03 13 07 47 6f 20 52  |o1.0...U....Go R|
-00000090  6f 6f 74 30 1e 17 0d 31  36 30 31 30 31 30 30 30  |oot0...160101000|
-000000a0  30 30 30 5a 17 0d 32 35  30 31 30 31 30 30 30 30  |000Z..2501010000|
-000000b0  30 30 5a 30 1a 31 0b 30  09 06 03 55 04 0a 13 02  |00Z0.1.0...U....|
-000000c0  47 6f 31 0b 30 09 06 03  55 04 03 13 02 47 6f 30  |Go1.0...U....Go0|
-000000d0  81 9f 30 0d 06 09 2a 86  48 86 f7 0d 01 01 01 05  |..0...*.H.......|
-000000e0  00 03 81 8d 00 30 81 89  02 81 81 00 db 46 7d 93  |.....0.......F}.|
-000000f0  2e 12 27 06 48 bc 06 28  21 ab 7e c4 b6 a2 5d fe  |..'.H..(!.~...].|
-00000100  1e 52 45 88 7a 36 47 a5  08 0d 92 42 5b c2 81 c0  |.RE.z6G....B[...|
-00000110  be 97 79 98 40 fb 4f 6d  14 fd 2b 13 8b c2 a5 2e  |..y.@.Om..+.....|
-00000120  67 d8 d4 09 9e d6 22 38  b7 4a 0b 74 73 2b c2 34  |g....."8.J.ts+.4|
-00000130  f1 d1 93 e5 96 d9 74 7b  f3 58 9f 6c 61 3c c0 b0  |......t{.X.la<..|
-00000140  41 d4 d9 2b 2b 24 23 77  5b 1c 3b bd 75 5d ce 20  |A..++$#w[.;.u]. |
-00000150  54 cf a1 63 87 1d 1e 24  c4 f3 1d 1a 50 8b aa b6  |T..c...$....P...|
-00000160  14 43 ed 97 a7 75 62 f4  14 c8 52 d7 02 03 01 00  |.C...ub...R.....|
-00000170  01 a3 81 93 30 81 90 30  0e 06 03 55 1d 0f 01 01  |....0..0...U....|
-00000180  ff 04 04 03 02 05 a0 30  1d 06 03 55 1d 25 04 16  |.......0...U.%..|
-00000190  30 14 06 08 2b 06 01 05  05 07 03 01 06 08 2b 06  |0...+.........+.|
-000001a0  01 05 05 07 03 02 30 0c  06 03 55 1d 13 01 01 ff  |......0...U.....|
-000001b0  04 02 30 00 30 19 06 03  55 1d 0e 04 12 04 10 9f  |..0.0...U.......|
-000001c0  91 16 1f 43 43 3e 49 a6  de 6d b6 80 d7 9f 60 30  |...CC>I..m....`0|
-000001d0  1b 06 03 55 1d 23 04 14  30 12 80 10 48 13 49 4d  |...U.#..0...H.IM|
-000001e0  13 7e 16 31 bb a3 01 d5  ac ab 6e 7b 30 19 06 03  |.~.1......n{0...|
-000001f0  55 1d 11 04 12 30 10 82  0e 65 78 61 6d 70 6c 65  |U....0...example|
-00000200  2e 67 6f 6c 61 6e 67 30  0d 06 09 2a 86 48 86 f7  |.golang0...*.H..|
-00000210  0d 01 01 0b 05 00 03 81  81 00 9d 30 cc 40 2b 5b  |...........0.@+[|
-00000220  50 a0 61 cb ba e5 53 58  e1 ed 83 28 a9 58 1a a9  |P.a...SX...(.X..|
-00000230  38 a4 95 a1 ac 31 5a 1a  84 66 3d 43 d3 2d d9 0b  |8....1Z..f=C.-..|
-00000240  f2 97 df d3 20 64 38 92  24 3a 00 bc cf 9c 7d b7  |.... d8.$:....}.|
-00000250  40 20 01 5f aa d3 16 61  09 a2 76 fd 13 c3 cc e1  |@ ._...a..v.....|
-00000260  0c 5c ee b1 87 82 f1 6c  04 ed 73 bb b3 43 77 8d  |.\.....l..s..Cw.|
-00000270  0c 1c f1 0f a1 d8 40 83  61 c9 4c 72 2b 9d ae db  |......@.a.Lr+...|
-00000280  46 06 06 4d f4 c1 b3 3e  c0 d1 bd 42 d4 db fe 3d  |F..M...>...B...=|
-00000290  13 60 84 5c 21 d3 3b e9  fa e7 16 03 03 00 ac 0c  |.`.\!.;.........|
-000002a0  00 00 a8 03 00 1d 20 2f  e5 7d a3 47 cd 62 43 15  |...... /.}.G.bC.|
-000002b0  28 da ac 5f bb 29 07 30  ff f6 84 af c4 cf c2 ed  |(.._.).0........|
-000002c0  90 99 5f 58 cb 3b 74 08  04 00 80 40 f3 67 86 41  |.._X.;t....@.g.A|
-000002d0  93 17 f7 db b2 80 ca 73  f9 f8 45 24 cc 46 57 47  |.......s..E$.FWG|
-000002e0  28 83 19 df e8 63 e7 19  c4 a2 04 85 25 7d ec 55  |(....c......%}.U|
-000002f0  91 d4 df eb 77 53 c2 3b  d5 71 1a f7 39 d2 ee b4  |....wS.;.q..9...|
-00000300  06 4b e4 07 b7 fa 8a 8e  fa 64 22 83 dd 22 8b b8  |.K.......d".."..|
-00000310  4d a5 1a f5 e3 81 01 81  6a a1 6e 62 54 3a 3a 09  |M.......j.nbT::.|
-00000320  ed 76 f2 5a d3 4e 4b 74  be 46 50 0d 51 77 34 f6  |.v.Z.NKt.FP.Qw4.|
-00000330  02 ef 57 39 29 bf d9 64  ad 65 06 ae a6 8d 94 86  |..W9)..d.e......|
-00000340  84 76 cf 2c 36 98 04 5b  a1 59 6c 16 03 03 00 04  |.v.,6..[.Yl.....|
-00000350  0e 00 00 00                                       |....|
+00000030  0f ff 01 00 01 00 00 17  00 00 00 0b 00 02 01 00  |................|
+00000040  16 03 03 02 59 0b 00 02  55 00 02 52 00 02 4f 30  |....Y...U..R..O0|
+00000050  82 02 4b 30 82 01 b4 a0  03 02 01 02 02 09 00 e8  |..K0............|
+00000060  f0 9d 3f e2 5b ea a6 30  0d 06 09 2a 86 48 86 f7  |..?.[..0...*.H..|
+00000070  0d 01 01 0b 05 00 30 1f  31 0b 30 09 06 03 55 04  |......0.1.0...U.|
+00000080  0a 13 02 47 6f 31 10 30  0e 06 03 55 04 03 13 07  |...Go1.0...U....|
+00000090  47 6f 20 52 6f 6f 74 30  1e 17 0d 31 36 30 31 30  |Go Root0...16010|
+000000a0  31 30 30 30 30 30 30 5a  17 0d 32 35 30 31 30 31  |1000000Z..250101|
+000000b0  30 30 30 30 30 30 5a 30  1a 31 0b 30 09 06 03 55  |000000Z0.1.0...U|
+000000c0  04 0a 13 02 47 6f 31 0b  30 09 06 03 55 04 03 13  |....Go1.0...U...|
+000000d0  02 47 6f 30 81 9f 30 0d  06 09 2a 86 48 86 f7 0d  |.Go0..0...*.H...|
+000000e0  01 01 01 05 00 03 81 8d  00 30 81 89 02 81 81 00  |.........0......|
+000000f0  db 46 7d 93 2e 12 27 06  48 bc 06 28 21 ab 7e c4  |.F}...'.H..(!.~.|
+00000100  b6 a2 5d fe 1e 52 45 88  7a 36 47 a5 08 0d 92 42  |..]..RE.z6G....B|
+00000110  5b c2 81 c0 be 97 79 98  40 fb 4f 6d 14 fd 2b 13  |[.....y.@.Om..+.|
+00000120  8b c2 a5 2e 67 d8 d4 09  9e d6 22 38 b7 4a 0b 74  |....g....."8.J.t|
+00000130  73 2b c2 34 f1 d1 93 e5  96 d9 74 7b f3 58 9f 6c  |s+.4......t{.X.l|
+00000140  61 3c c0 b0 41 d4 d9 2b  2b 24 23 77 5b 1c 3b bd  |a<..A..++$#w[.;.|
+00000150  75 5d ce 20 54 cf a1 63  87 1d 1e 24 c4 f3 1d 1a  |u]. T..c...$....|
+00000160  50 8b aa b6 14 43 ed 97  a7 75 62 f4 14 c8 52 d7  |P....C...ub...R.|
+00000170  02 03 01 00 01 a3 81 93  30 81 90 30 0e 06 03 55  |........0..0...U|
+00000180  1d 0f 01 01 ff 04 04 03  02 05 a0 30 1d 06 03 55  |...........0...U|
+00000190  1d 25 04 16 30 14 06 08  2b 06 01 05 05 07 03 01  |.%..0...+.......|
+000001a0  06 08 2b 06 01 05 05 07  03 02 30 0c 06 03 55 1d  |..+.......0...U.|
+000001b0  13 01 01 ff 04 02 30 00  30 19 06 03 55 1d 0e 04  |......0.0...U...|
+000001c0  12 04 10 9f 91 16 1f 43  43 3e 49 a6 de 6d b6 80  |.......CC>I..m..|
+000001d0  d7 9f 60 30 1b 06 03 55  1d 23 04 14 30 12 80 10  |..`0...U.#..0...|
+000001e0  48 13 49 4d 13 7e 16 31  bb a3 01 d5 ac ab 6e 7b  |H.IM.~.1......n{|
+000001f0  30 19 06 03 55 1d 11 04  12 30 10 82 0e 65 78 61  |0...U....0...exa|
+00000200  6d 70 6c 65 2e 67 6f 6c  61 6e 67 30 0d 06 09 2a  |mple.golang0...*|
+00000210  86 48 86 f7 0d 01 01 0b  05 00 03 81 81 00 9d 30  |.H.............0|
+00000220  cc 40 2b 5b 50 a0 61 cb  ba e5 53 58 e1 ed 83 28  |.@+[P.a...SX...(|
+00000230  a9 58 1a a9 38 a4 95 a1  ac 31 5a 1a 84 66 3d 43  |.X..8....1Z..f=C|
+00000240  d3 2d d9 0b f2 97 df d3  20 64 38 92 24 3a 00 bc  |.-...... d8.$:..|
+00000250  cf 9c 7d b7 40 20 01 5f  aa d3 16 61 09 a2 76 fd  |..}.@ ._...a..v.|
+00000260  13 c3 cc e1 0c 5c ee b1  87 82 f1 6c 04 ed 73 bb  |.....\.....l..s.|
+00000270  b3 43 77 8d 0c 1c f1 0f  a1 d8 40 83 61 c9 4c 72  |.Cw.......@.a.Lr|
+00000280  2b 9d ae db 46 06 06 4d  f4 c1 b3 3e c0 d1 bd 42  |+...F..M...>...B|
+00000290  d4 db fe 3d 13 60 84 5c  21 d3 3b e9 fa e7 16 03  |...=.`.\!.;.....|
+000002a0  03 00 ac 0c 00 00 a8 03  00 1d 20 2f e5 7d a3 47  |.......... /.}.G|
+000002b0  cd 62 43 15 28 da ac 5f  bb 29 07 30 ff f6 84 af  |.bC.(.._.).0....|
+000002c0  c4 cf c2 ed 90 99 5f 58  cb 3b 74 08 04 00 80 da  |......_X.;t.....|
+000002d0  4d 5e f1 10 1f ed 70 d1  88 7a 22 79 6e 5c c9 4c  |M^....p..z"yn\.L|
+000002e0  e3 e7 a2 bd f4 3d f4 75  dc a3 85 5e f1 af 55 6f  |.....=.u...^..Uo|
+000002f0  e3 36 21 c6 8a 44 e9 58  29 89 32 4d 14 90 9d 1b  |.6!..D.X).2M....|
+00000300  bd 0e fa c3 eb 40 5d 05  5d ba 58 55 3e f9 30 b8  |.....@].].XU>.0.|
+00000310  8f 56 35 71 12 33 92 0e  14 f9 90 2c ee 36 03 50  |.V5q.3.....,.6.P|
+00000320  1c f6 76 a7 99 3e fd bb  5f 21 96 c5 56 1e ed 28  |..v..>.._!..V..(|
+00000330  00 0b cd ac cd 70 1a 7e  2d 2d 7d 1d 76 7d e6 89  |.....p.~--}.v}..|
+00000340  ba 35 dc e1 9f 48 39 ff  9e a9 48 77 8e d3 71 16  |.5...H9...Hw..q.|
+00000350  03 03 00 04 0e 00 00 00                           |........|
 >>> Flow 3 (client to server)
-00000000  16 03 03 00 25 10 00 00  21 20 d5 2b 0e 3c e9 3e  |....%...! .+.<.>|
-00000010  e9 b0 3d 86 a9 85 b5 68  af cf 27 cf 4b d4 49 2e  |..=....h..'.K.I.|
-00000020  68 f2 9e 3c 32 7c cb fb  dc 57 14 03 03 00 01 01  |h..<2|...W......|
-00000030  16 03 03 00 28 5a cc f4  77 38 94 46 7b 39 5d 81  |....(Z..w8.F{9].|
-00000040  be 77 a5 4a 76 c9 46 62  17 0b 2b ea 89 c2 29 bd  |.w.Jv.Fb..+...).|
-00000050  4b b0 dd 51 1e b8 7b a9  55 f5 fb b3 6a           |K..Q..{.U...j|
+00000000  16 03 03 00 25 10 00 00  21 20 80 4d 7d 95 1c e0  |....%...! .M}...|
+00000010  d5 c1 f6 6d 43 92 08 23  82 cb 30 e0 d7 15 d8 51  |...mC..#..0....Q|
+00000020  14 2f 8a 1c 3a 07 be d9  96 54 14 03 03 00 01 01  |./..:....T......|
+00000030  16 03 03 00 28 00 a6 4e  03 ff 76 94 d4 b8 c6 c5  |....(..N..v.....|
+00000040  7d 4d 2b 7e 5d 4f 5c b8  5a 78 46 c9 0f ce 57 7f  |}M+~]O\.ZxF...W.|
+00000050  02 a0 1a 83 b1 92 3f 96  ce 8a 00 8f 30           |......?.....0|
 >>> 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 b9 9b c0 b1 2b  71 af 0b 44 4e 4a cd e8  |.......+q..DNJ..|
-00000020  c6 68 b8 2a d9 67 6f 7f  18 12 22 5c 4b 5c ca 43  |.h.*.go..."\K\.C|
-00000030  ff c1 9d 17 03 03 00 25  00 00 00 00 00 00 00 01  |.......%........|
-00000040  3c ae 33 dd 69 6c 01 a0  d2 a7 91 52 43 f3 78 38  |<.3.il.....RC.x8|
-00000050  94 f4 24 0b 3d c9 bb 5f  02 27 89 bb 9b 15 03 03  |..$.=.._.'......|
-00000060  00 1a 00 00 00 00 00 00  00 02 68 8d d7 d8 2f 95  |..........h.../.|
-00000070  61 09 59 52 0d b8 12 fc  6a 07 28 37              |a.YR....j.(7|
+00000010  00 00 00 2f ec 4b c3 a6  99 1f ab 91 62 01 d5 e6  |.../.K......b...|
+00000020  93 23 20 7e b8 61 be 90  a0 10 e3 f1 8a 82 f9 bc  |.# ~.a..........|
+00000030  27 fe 65 17 03 03 00 25  00 00 00 00 00 00 00 01  |'.e....%........|
+00000040  54 bd d1 e8 02 9a ab fa  2f d1 19 e9 45 81 05 d1  |T......./...E...|
+00000050  ba d2 d7 77 54 88 cc fe  14 b3 3b d1 28 15 03 03  |...wT.....;.(...|
+00000060  00 1a 00 00 00 00 00 00  00 02 de 3f 93 32 6e f5  |...........?.2n.|
+00000070  07 60 ed 65 6f 81 62 90  52 f6 4a a2              |.`.eo.b.R.J.|
diff --git a/src/crypto/tls/testdata/Server-TLSv12-RSA-RC4 b/src/crypto/tls/testdata/Server-TLSv12-RSA-RC4
index 47a4ef2..30b00f6 100644
--- a/src/crypto/tls/testdata/Server-TLSv12-RSA-RC4
+++ b/src/crypto/tls/testdata/Server-TLSv12-RSA-RC4
@@ -1,76 +1,74 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 97 01 00 00  93 03 03 2c 3c 18 04 94  |...........,<...|
-00000010  e0 bb 10 99 7c 0c cd 0e  e7 72 bc 83 4d f0 cf d7  |....|....r..M...|
-00000020  4b 8e 2c 8b 52 bf ed 86  65 d2 a3 00 00 04 00 05  |K.,.R...e.......|
-00000030  00 ff 01 00 00 66 00 00  00 0e 00 0c 00 00 09 31  |.....f.........1|
-00000040  32 37 2e 30 2e 30 2e 31  00 0b 00 04 03 00 01 02  |27.0.0.1........|
-00000050  00 0a 00 0c 00 0a 00 1d  00 17 00 1e 00 19 00 18  |................|
-00000060  00 16 00 00 00 17 00 00  00 0d 00 30 00 2e 04 03  |...........0....|
-00000070  05 03 06 03 08 07 08 08  08 09 08 0a 08 0b 08 04  |................|
-00000080  08 05 08 06 04 01 05 01  06 01 03 03 02 03 03 01  |................|
-00000090  02 01 03 02 02 02 04 02  05 02 06 02              |............|
+00000000  16 03 01 00 6d 01 00 00  69 03 03 dd 92 e1 75 15  |....m...i.....u.|
+00000010  1d 9f 00 c5 2b 8a 14 86  aa 93 7c c0 32 2a 29 14  |....+.....|.2*).|
+00000020  38 75 ce 62 a7 df c1 4a  eb 1e 0c 00 00 04 00 05  |8u.b...J........|
+00000030  00 ff 01 00 00 3c 00 16  00 00 00 17 00 00 00 0d  |.....<..........|
+00000040  00 30 00 2e 04 03 05 03  06 03 08 07 08 08 08 09  |.0..............|
+00000050  08 0a 08 0b 08 04 08 05  08 06 04 01 05 01 06 01  |................|
+00000060  03 03 02 03 03 01 02 01  03 02 02 02 04 02 05 02  |................|
+00000070  06 02                                             |..|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 37 02 00 00  33 03 03 00 00 00 00 00  |....7...3.......|
+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 44 4f 57 4e 47  52 44 01 00 00 05 00 00  |...DOWNGRD......|
-00000030  0b ff 01 00 01 00 00 0b  00 02 01 00 16 03 03 02  |................|
-00000040  59 0b 00 02 55 00 02 52  00 02 4f 30 82 02 4b 30  |Y...U..R..O0..K0|
-00000050  82 01 b4 a0 03 02 01 02  02 09 00 e8 f0 9d 3f e2  |..............?.|
-00000060  5b ea a6 30 0d 06 09 2a  86 48 86 f7 0d 01 01 0b  |[..0...*.H......|
-00000070  05 00 30 1f 31 0b 30 09  06 03 55 04 0a 13 02 47  |..0.1.0...U....G|
-00000080  6f 31 10 30 0e 06 03 55  04 03 13 07 47 6f 20 52  |o1.0...U....Go R|
-00000090  6f 6f 74 30 1e 17 0d 31  36 30 31 30 31 30 30 30  |oot0...160101000|
-000000a0  30 30 30 5a 17 0d 32 35  30 31 30 31 30 30 30 30  |000Z..2501010000|
-000000b0  30 30 5a 30 1a 31 0b 30  09 06 03 55 04 0a 13 02  |00Z0.1.0...U....|
-000000c0  47 6f 31 0b 30 09 06 03  55 04 03 13 02 47 6f 30  |Go1.0...U....Go0|
-000000d0  81 9f 30 0d 06 09 2a 86  48 86 f7 0d 01 01 01 05  |..0...*.H.......|
-000000e0  00 03 81 8d 00 30 81 89  02 81 81 00 db 46 7d 93  |.....0.......F}.|
-000000f0  2e 12 27 06 48 bc 06 28  21 ab 7e c4 b6 a2 5d fe  |..'.H..(!.~...].|
-00000100  1e 52 45 88 7a 36 47 a5  08 0d 92 42 5b c2 81 c0  |.RE.z6G....B[...|
-00000110  be 97 79 98 40 fb 4f 6d  14 fd 2b 13 8b c2 a5 2e  |..y.@.Om..+.....|
-00000120  67 d8 d4 09 9e d6 22 38  b7 4a 0b 74 73 2b c2 34  |g....."8.J.ts+.4|
-00000130  f1 d1 93 e5 96 d9 74 7b  f3 58 9f 6c 61 3c c0 b0  |......t{.X.la<..|
-00000140  41 d4 d9 2b 2b 24 23 77  5b 1c 3b bd 75 5d ce 20  |A..++$#w[.;.u]. |
-00000150  54 cf a1 63 87 1d 1e 24  c4 f3 1d 1a 50 8b aa b6  |T..c...$....P...|
-00000160  14 43 ed 97 a7 75 62 f4  14 c8 52 d7 02 03 01 00  |.C...ub...R.....|
-00000170  01 a3 81 93 30 81 90 30  0e 06 03 55 1d 0f 01 01  |....0..0...U....|
-00000180  ff 04 04 03 02 05 a0 30  1d 06 03 55 1d 25 04 16  |.......0...U.%..|
-00000190  30 14 06 08 2b 06 01 05  05 07 03 01 06 08 2b 06  |0...+.........+.|
-000001a0  01 05 05 07 03 02 30 0c  06 03 55 1d 13 01 01 ff  |......0...U.....|
-000001b0  04 02 30 00 30 19 06 03  55 1d 0e 04 12 04 10 9f  |..0.0...U.......|
-000001c0  91 16 1f 43 43 3e 49 a6  de 6d b6 80 d7 9f 60 30  |...CC>I..m....`0|
-000001d0  1b 06 03 55 1d 23 04 14  30 12 80 10 48 13 49 4d  |...U.#..0...H.IM|
-000001e0  13 7e 16 31 bb a3 01 d5  ac ab 6e 7b 30 19 06 03  |.~.1......n{0...|
-000001f0  55 1d 11 04 12 30 10 82  0e 65 78 61 6d 70 6c 65  |U....0...example|
-00000200  2e 67 6f 6c 61 6e 67 30  0d 06 09 2a 86 48 86 f7  |.golang0...*.H..|
-00000210  0d 01 01 0b 05 00 03 81  81 00 9d 30 cc 40 2b 5b  |...........0.@+[|
-00000220  50 a0 61 cb ba e5 53 58  e1 ed 83 28 a9 58 1a a9  |P.a...SX...(.X..|
-00000230  38 a4 95 a1 ac 31 5a 1a  84 66 3d 43 d3 2d d9 0b  |8....1Z..f=C.-..|
-00000240  f2 97 df d3 20 64 38 92  24 3a 00 bc cf 9c 7d b7  |.... d8.$:....}.|
-00000250  40 20 01 5f aa d3 16 61  09 a2 76 fd 13 c3 cc e1  |@ ._...a..v.....|
-00000260  0c 5c ee b1 87 82 f1 6c  04 ed 73 bb b3 43 77 8d  |.\.....l..s..Cw.|
-00000270  0c 1c f1 0f a1 d8 40 83  61 c9 4c 72 2b 9d ae db  |......@.a.Lr+...|
-00000280  46 06 06 4d f4 c1 b3 3e  c0 d1 bd 42 d4 db fe 3d  |F..M...>...B...=|
-00000290  13 60 84 5c 21 d3 3b e9  fa e7 16 03 03 00 04 0e  |.`.\!.;.........|
-000002a0  00 00 00                                          |...|
+00000030  09 ff 01 00 01 00 00 17  00 00 16 03 03 02 59 0b  |..............Y.|
+00000040  00 02 55 00 02 52 00 02  4f 30 82 02 4b 30 82 01  |..U..R..O0..K0..|
+00000050  b4 a0 03 02 01 02 02 09  00 e8 f0 9d 3f e2 5b ea  |............?.[.|
+00000060  a6 30 0d 06 09 2a 86 48  86 f7 0d 01 01 0b 05 00  |.0...*.H........|
+00000070  30 1f 31 0b 30 09 06 03  55 04 0a 13 02 47 6f 31  |0.1.0...U....Go1|
+00000080  10 30 0e 06 03 55 04 03  13 07 47 6f 20 52 6f 6f  |.0...U....Go Roo|
+00000090  74 30 1e 17 0d 31 36 30  31 30 31 30 30 30 30 30  |t0...16010100000|
+000000a0  30 5a 17 0d 32 35 30 31  30 31 30 30 30 30 30 30  |0Z..250101000000|
+000000b0  5a 30 1a 31 0b 30 09 06  03 55 04 0a 13 02 47 6f  |Z0.1.0...U....Go|
+000000c0  31 0b 30 09 06 03 55 04  03 13 02 47 6f 30 81 9f  |1.0...U....Go0..|
+000000d0  30 0d 06 09 2a 86 48 86  f7 0d 01 01 01 05 00 03  |0...*.H.........|
+000000e0  81 8d 00 30 81 89 02 81  81 00 db 46 7d 93 2e 12  |...0.......F}...|
+000000f0  27 06 48 bc 06 28 21 ab  7e c4 b6 a2 5d fe 1e 52  |'.H..(!.~...]..R|
+00000100  45 88 7a 36 47 a5 08 0d  92 42 5b c2 81 c0 be 97  |E.z6G....B[.....|
+00000110  79 98 40 fb 4f 6d 14 fd  2b 13 8b c2 a5 2e 67 d8  |y.@.Om..+.....g.|
+00000120  d4 09 9e d6 22 38 b7 4a  0b 74 73 2b c2 34 f1 d1  |...."8.J.ts+.4..|
+00000130  93 e5 96 d9 74 7b f3 58  9f 6c 61 3c c0 b0 41 d4  |....t{.X.la<..A.|
+00000140  d9 2b 2b 24 23 77 5b 1c  3b bd 75 5d ce 20 54 cf  |.++$#w[.;.u]. T.|
+00000150  a1 63 87 1d 1e 24 c4 f3  1d 1a 50 8b aa b6 14 43  |.c...$....P....C|
+00000160  ed 97 a7 75 62 f4 14 c8  52 d7 02 03 01 00 01 a3  |...ub...R.......|
+00000170  81 93 30 81 90 30 0e 06  03 55 1d 0f 01 01 ff 04  |..0..0...U......|
+00000180  04 03 02 05 a0 30 1d 06  03 55 1d 25 04 16 30 14  |.....0...U.%..0.|
+00000190  06 08 2b 06 01 05 05 07  03 01 06 08 2b 06 01 05  |..+.........+...|
+000001a0  05 07 03 02 30 0c 06 03  55 1d 13 01 01 ff 04 02  |....0...U.......|
+000001b0  30 00 30 19 06 03 55 1d  0e 04 12 04 10 9f 91 16  |0.0...U.........|
+000001c0  1f 43 43 3e 49 a6 de 6d  b6 80 d7 9f 60 30 1b 06  |.CC>I..m....`0..|
+000001d0  03 55 1d 23 04 14 30 12  80 10 48 13 49 4d 13 7e  |.U.#..0...H.IM.~|
+000001e0  16 31 bb a3 01 d5 ac ab  6e 7b 30 19 06 03 55 1d  |.1......n{0...U.|
+000001f0  11 04 12 30 10 82 0e 65  78 61 6d 70 6c 65 2e 67  |...0...example.g|
+00000200  6f 6c 61 6e 67 30 0d 06  09 2a 86 48 86 f7 0d 01  |olang0...*.H....|
+00000210  01 0b 05 00 03 81 81 00  9d 30 cc 40 2b 5b 50 a0  |.........0.@+[P.|
+00000220  61 cb ba e5 53 58 e1 ed  83 28 a9 58 1a a9 38 a4  |a...SX...(.X..8.|
+00000230  95 a1 ac 31 5a 1a 84 66  3d 43 d3 2d d9 0b f2 97  |...1Z..f=C.-....|
+00000240  df d3 20 64 38 92 24 3a  00 bc cf 9c 7d b7 40 20  |.. d8.$:....}.@ |
+00000250  01 5f aa d3 16 61 09 a2  76 fd 13 c3 cc e1 0c 5c  |._...a..v......\|
+00000260  ee b1 87 82 f1 6c 04 ed  73 bb b3 43 77 8d 0c 1c  |.....l..s..Cw...|
+00000270  f1 0f a1 d8 40 83 61 c9  4c 72 2b 9d ae db 46 06  |....@.a.Lr+...F.|
+00000280  06 4d f4 c1 b3 3e c0 d1  bd 42 d4 db fe 3d 13 60  |.M...>...B...=.`|
+00000290  84 5c 21 d3 3b e9 fa e7  16 03 03 00 04 0e 00 00  |.\!.;...........|
+000002a0  00                                                |.|
 >>> Flow 3 (client to server)
-00000000  16 03 03 00 86 10 00 00  82 00 80 a2 43 45 e6 1e  |............CE..|
-00000010  08 d3 29 62 0b 40 75 98  a3 f6 68 d7 78 31 b0 c9  |..)b.@u...h.x1..|
-00000020  f4 f8 a6 98 dc d8 72 c1  2a 68 80 26 54 1c 16 af  |......r.*h.&T...|
-00000030  9f 67 cf ee 74 de 9e 29  b6 cd 0d eb df aa ea 44  |.g..t..).......D|
-00000040  72 c9 aa fc ff c9 2d 9d  bf bc f0 9b c1 7b 0d 5c  |r.....-......{.\|
-00000050  69 0c 75 d8 23 09 29 97  f6 38 9c f9 4f 1b 4a d5  |i.u.#.)..8..O.J.|
-00000060  bd 04 d4 15 b3 a6 80 02  a4 11 32 d7 c0 cf 89 1f  |..........2.....|
-00000070  93 80 2b 48 49 51 44 b7  77 3c bf b1 a6 87 a3 ff  |..+HIQD.w<......|
-00000080  39 37 4a 42 49 92 93 25  0a 51 9a 14 03 03 00 01  |97JBI..%.Q......|
-00000090  01 16 03 03 00 24 b5 c9  d6 9c ec 77 38 d2 30 79  |.....$.....w8.0y|
-000000a0  f1 00 77 31 78 9b e6 ab  ed 46 7c c6 e5 26 0b 44  |..w1x....F|..&.D|
-000000b0  fd 30 b0 fe 0c 84 6f 9a  cf 57                    |.0....o..W|
+00000000  16 03 03 00 86 10 00 00  82 00 80 8d bb 5a 48 87  |.............ZH.|
+00000010  95 ca 2d eb a8 47 de 35  4d 70 3e 89 a1 ce c5 8d  |..-..G.5Mp>.....|
+00000020  02 95 f6 ac e6 2f 1f ae  c5 4a 82 08 22 d5 89 0b  |...../...J.."...|
+00000030  c1 0e be 18 39 d0 e9 e5  ed 87 92 6e 61 3f 68 e5  |....9......na?h.|
+00000040  ed 1d a5 cc 43 d1 42 28  be 4d 31 11 27 f7 dd 25  |....C.B(.M1.'..%|
+00000050  58 b7 fc 76 bb 7c 06 d8  c2 69 0a 87 2b 54 bf 4e  |X..v.|...i..+T.N|
+00000060  8a fa 54 db 78 d4 98 51  21 e4 32 28 49 31 51 c0  |..T.x..Q!.2(I1Q.|
+00000070  a8 7e f0 97 d9 f3 f7 18  d7 a9 74 79 4d 2f 3f df  |.~........tyM/?.|
+00000080  b1 25 88 9e 15 cf 94 42  15 68 65 14 03 03 00 01  |.%.....B.he.....|
+00000090  01 16 03 03 00 24 cb ac  7c 7c 16 02 a9 08 c3 53  |.....$..||.....S|
+000000a0  b8 0e ee 24 fa 51 e0 ce  37 40 e7 f2 ab 93 3d 81  |...$.Q..7@....=.|
+000000b0  58 49 96 0e e7 54 43 67  42 1b                    |XI...TCgB.|
 >>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 24 58 cc 9f 3f ac  |..........$X..?.|
-00000010  2e 20 73 c9 5e 13 d3 12  3a 63 1e a9 ee 13 3d 0d  |. s.^...:c....=.|
-00000020  51 e9 15 5b 7b 33 92 85  6c fa d6 8a 15 16 dc 17  |Q..[{3..l.......|
-00000030  03 03 00 21 bc af 01 72  48 0c 16 c9 7a c0 3c 27  |...!...rH...z.<'|
-00000040  63 0a f8 34 e4 54 6a 39  39 61 02 bc c2 a0 07 03  |c..4.Tj99a......|
-00000050  fb 2c d0 1b 6a 15 03 03  00 16 98 71 13 a6 5d f5  |.,..j......q..].|
-00000060  7d aa 6d 05 2d a2 dc c0  7b 41 88 36 a2 49 a4 8b  |}.m.-...{A.6.I..|
+00000000  14 03 03 00 01 01 16 03  03 00 24 e4 2f 5e 7f 6f  |..........$./^.o|
+00000010  46 22 85 a0 2d 5a fd 36  0b 9f eb 26 80 89 1d 7e  |F"..-Z.6...&...~|
+00000020  ca 57 a7 f5 5d 54 1c e4  85 77 f5 28 54 a5 15 17  |.W..]T...w.(T...|
+00000030  03 03 00 21 84 a2 f5 c9  e4 df b4 31 8a cf 04 77  |...!.......1...w|
+00000040  22 ab 93 9a ae d2 45 d0  d1 7d 42 11 92 b6 b5 1c  |".....E..}B.....|
+00000050  ac 60 0b d1 9e 15 03 03  00 16 ed f3 12 75 df bc  |.`...........u..|
+00000060  32 e6 c3 fa 74 7a 32 c6  d7 21 67 0a df be b1 15  |2...tz2..!g.....|
diff --git a/src/crypto/tls/testdata/Server-TLSv12-RSA-RSAPKCS1v15 b/src/crypto/tls/testdata/Server-TLSv12-RSA-RSAPKCS1v15
index b193771..1c7bcea 100644
--- a/src/crypto/tls/testdata/Server-TLSv12-RSA-RSAPKCS1v15
+++ b/src/crypto/tls/testdata/Server-TLSv12-RSA-RSAPKCS1v15
@@ -1,77 +1,77 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 59 01 00 00  55 03 03 60 c3 e9 6a 99  |....Y...U..`..j.|
-00000010  72 7a 1c b9 1e 10 4b 9a  82 d5 ea b9 b0 6f 1e 05  |rz....K......o..|
-00000020  74 a4 35 bb 71 c7 d2 56  87 b8 69 00 00 04 cc a8  |t.5.q..V..i.....|
+00000000  16 03 01 00 59 01 00 00  55 03 03 01 3d 46 ff b5  |....Y...U...=F..|
+00000010  47 eb 03 bd 9b 27 66 92  92 db 11 f9 58 1d 21 ba  |G....'f.....X.!.|
+00000020  b9 51 90 81 d0 8f 7e 3c  cd 7b b8 00 00 04 cc a8  |.Q....~<.{......|
 00000030  00 ff 01 00 00 28 00 0b  00 04 03 00 01 02 00 0a  |.....(..........|
 00000040  00 0c 00 0a 00 1d 00 17  00 1e 00 19 00 18 00 16  |................|
 00000050  00 00 00 17 00 00 00 0d  00 04 00 02 04 01        |..............|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 37 02 00 00  33 03 03 00 00 00 00 00  |....7...3.......|
+00000000  16 03 03 00 3b 02 00 00  37 03 03 00 00 00 00 00  |....;...7.......|
 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000020  00 00 00 44 4f 57 4e 47  52 44 01 00 cc a8 00 00  |...DOWNGRD......|
-00000030  0b ff 01 00 01 00 00 0b  00 02 01 00 16 03 03 02  |................|
-00000040  59 0b 00 02 55 00 02 52  00 02 4f 30 82 02 4b 30  |Y...U..R..O0..K0|
-00000050  82 01 b4 a0 03 02 01 02  02 09 00 e8 f0 9d 3f e2  |..............?.|
-00000060  5b ea a6 30 0d 06 09 2a  86 48 86 f7 0d 01 01 0b  |[..0...*.H......|
-00000070  05 00 30 1f 31 0b 30 09  06 03 55 04 0a 13 02 47  |..0.1.0...U....G|
-00000080  6f 31 10 30 0e 06 03 55  04 03 13 07 47 6f 20 52  |o1.0...U....Go R|
-00000090  6f 6f 74 30 1e 17 0d 31  36 30 31 30 31 30 30 30  |oot0...160101000|
-000000a0  30 30 30 5a 17 0d 32 35  30 31 30 31 30 30 30 30  |000Z..2501010000|
-000000b0  30 30 5a 30 1a 31 0b 30  09 06 03 55 04 0a 13 02  |00Z0.1.0...U....|
-000000c0  47 6f 31 0b 30 09 06 03  55 04 03 13 02 47 6f 30  |Go1.0...U....Go0|
-000000d0  81 9f 30 0d 06 09 2a 86  48 86 f7 0d 01 01 01 05  |..0...*.H.......|
-000000e0  00 03 81 8d 00 30 81 89  02 81 81 00 db 46 7d 93  |.....0.......F}.|
-000000f0  2e 12 27 06 48 bc 06 28  21 ab 7e c4 b6 a2 5d fe  |..'.H..(!.~...].|
-00000100  1e 52 45 88 7a 36 47 a5  08 0d 92 42 5b c2 81 c0  |.RE.z6G....B[...|
-00000110  be 97 79 98 40 fb 4f 6d  14 fd 2b 13 8b c2 a5 2e  |..y.@.Om..+.....|
-00000120  67 d8 d4 09 9e d6 22 38  b7 4a 0b 74 73 2b c2 34  |g....."8.J.ts+.4|
-00000130  f1 d1 93 e5 96 d9 74 7b  f3 58 9f 6c 61 3c c0 b0  |......t{.X.la<..|
-00000140  41 d4 d9 2b 2b 24 23 77  5b 1c 3b bd 75 5d ce 20  |A..++$#w[.;.u]. |
-00000150  54 cf a1 63 87 1d 1e 24  c4 f3 1d 1a 50 8b aa b6  |T..c...$....P...|
-00000160  14 43 ed 97 a7 75 62 f4  14 c8 52 d7 02 03 01 00  |.C...ub...R.....|
-00000170  01 a3 81 93 30 81 90 30  0e 06 03 55 1d 0f 01 01  |....0..0...U....|
-00000180  ff 04 04 03 02 05 a0 30  1d 06 03 55 1d 25 04 16  |.......0...U.%..|
-00000190  30 14 06 08 2b 06 01 05  05 07 03 01 06 08 2b 06  |0...+.........+.|
-000001a0  01 05 05 07 03 02 30 0c  06 03 55 1d 13 01 01 ff  |......0...U.....|
-000001b0  04 02 30 00 30 19 06 03  55 1d 0e 04 12 04 10 9f  |..0.0...U.......|
-000001c0  91 16 1f 43 43 3e 49 a6  de 6d b6 80 d7 9f 60 30  |...CC>I..m....`0|
-000001d0  1b 06 03 55 1d 23 04 14  30 12 80 10 48 13 49 4d  |...U.#..0...H.IM|
-000001e0  13 7e 16 31 bb a3 01 d5  ac ab 6e 7b 30 19 06 03  |.~.1......n{0...|
-000001f0  55 1d 11 04 12 30 10 82  0e 65 78 61 6d 70 6c 65  |U....0...example|
-00000200  2e 67 6f 6c 61 6e 67 30  0d 06 09 2a 86 48 86 f7  |.golang0...*.H..|
-00000210  0d 01 01 0b 05 00 03 81  81 00 9d 30 cc 40 2b 5b  |...........0.@+[|
-00000220  50 a0 61 cb ba e5 53 58  e1 ed 83 28 a9 58 1a a9  |P.a...SX...(.X..|
-00000230  38 a4 95 a1 ac 31 5a 1a  84 66 3d 43 d3 2d d9 0b  |8....1Z..f=C.-..|
-00000240  f2 97 df d3 20 64 38 92  24 3a 00 bc cf 9c 7d b7  |.... d8.$:....}.|
-00000250  40 20 01 5f aa d3 16 61  09 a2 76 fd 13 c3 cc e1  |@ ._...a..v.....|
-00000260  0c 5c ee b1 87 82 f1 6c  04 ed 73 bb b3 43 77 8d  |.\.....l..s..Cw.|
-00000270  0c 1c f1 0f a1 d8 40 83  61 c9 4c 72 2b 9d ae db  |......@.a.Lr+...|
-00000280  46 06 06 4d f4 c1 b3 3e  c0 d1 bd 42 d4 db fe 3d  |F..M...>...B...=|
-00000290  13 60 84 5c 21 d3 3b e9  fa e7 16 03 03 00 ac 0c  |.`.\!.;.........|
-000002a0  00 00 a8 03 00 1d 20 2f  e5 7d a3 47 cd 62 43 15  |...... /.}.G.bC.|
-000002b0  28 da ac 5f bb 29 07 30  ff f6 84 af c4 cf c2 ed  |(.._.).0........|
-000002c0  90 99 5f 58 cb 3b 74 04  01 00 80 4e c9 fd 39 89  |.._X.;t....N..9.|
-000002d0  52 c1 6b ba 3b c9 02 35  89 e8 e3 f8 41 15 ee 6d  |R.k.;..5....A..m|
-000002e0  f6 08 6d 1a 47 aa 3b 5c  1d 9b 42 9b 50 85 af 56  |..m.G.;\..B.P..V|
-000002f0  a3 99 78 84 7f 06 91 97  e9 33 0d 1d 9b 17 ce 3b  |..x......3.....;|
-00000300  30 f2 d0 10 1c b6 e2 7d  fd b3 e1 bc 14 7a 1a 96  |0......}.....z..|
-00000310  be b9 dc 0d 29 33 84 5f  d1 77 91 0a a1 f2 2b cc  |....)3._.w....+.|
-00000320  dc 5e 9b f9 8b e3 34 d2  bd f3 46 b4 0d 97 de 44  |.^....4...F....D|
-00000330  aa 83 10 82 bd ca 83 27  d0 40 a7 b1 64 15 dd 84  |.......'.@..d...|
-00000340  5f 3c d9 62 42 0d 8f a6  19 0f b1 16 03 03 00 04  |_<.bB...........|
-00000350  0e 00 00 00                                       |....|
+00000030  0f ff 01 00 01 00 00 17  00 00 00 0b 00 02 01 00  |................|
+00000040  16 03 03 02 59 0b 00 02  55 00 02 52 00 02 4f 30  |....Y...U..R..O0|
+00000050  82 02 4b 30 82 01 b4 a0  03 02 01 02 02 09 00 e8  |..K0............|
+00000060  f0 9d 3f e2 5b ea a6 30  0d 06 09 2a 86 48 86 f7  |..?.[..0...*.H..|
+00000070  0d 01 01 0b 05 00 30 1f  31 0b 30 09 06 03 55 04  |......0.1.0...U.|
+00000080  0a 13 02 47 6f 31 10 30  0e 06 03 55 04 03 13 07  |...Go1.0...U....|
+00000090  47 6f 20 52 6f 6f 74 30  1e 17 0d 31 36 30 31 30  |Go Root0...16010|
+000000a0  31 30 30 30 30 30 30 5a  17 0d 32 35 30 31 30 31  |1000000Z..250101|
+000000b0  30 30 30 30 30 30 5a 30  1a 31 0b 30 09 06 03 55  |000000Z0.1.0...U|
+000000c0  04 0a 13 02 47 6f 31 0b  30 09 06 03 55 04 03 13  |....Go1.0...U...|
+000000d0  02 47 6f 30 81 9f 30 0d  06 09 2a 86 48 86 f7 0d  |.Go0..0...*.H...|
+000000e0  01 01 01 05 00 03 81 8d  00 30 81 89 02 81 81 00  |.........0......|
+000000f0  db 46 7d 93 2e 12 27 06  48 bc 06 28 21 ab 7e c4  |.F}...'.H..(!.~.|
+00000100  b6 a2 5d fe 1e 52 45 88  7a 36 47 a5 08 0d 92 42  |..]..RE.z6G....B|
+00000110  5b c2 81 c0 be 97 79 98  40 fb 4f 6d 14 fd 2b 13  |[.....y.@.Om..+.|
+00000120  8b c2 a5 2e 67 d8 d4 09  9e d6 22 38 b7 4a 0b 74  |....g....."8.J.t|
+00000130  73 2b c2 34 f1 d1 93 e5  96 d9 74 7b f3 58 9f 6c  |s+.4......t{.X.l|
+00000140  61 3c c0 b0 41 d4 d9 2b  2b 24 23 77 5b 1c 3b bd  |a<..A..++$#w[.;.|
+00000150  75 5d ce 20 54 cf a1 63  87 1d 1e 24 c4 f3 1d 1a  |u]. T..c...$....|
+00000160  50 8b aa b6 14 43 ed 97  a7 75 62 f4 14 c8 52 d7  |P....C...ub...R.|
+00000170  02 03 01 00 01 a3 81 93  30 81 90 30 0e 06 03 55  |........0..0...U|
+00000180  1d 0f 01 01 ff 04 04 03  02 05 a0 30 1d 06 03 55  |...........0...U|
+00000190  1d 25 04 16 30 14 06 08  2b 06 01 05 05 07 03 01  |.%..0...+.......|
+000001a0  06 08 2b 06 01 05 05 07  03 02 30 0c 06 03 55 1d  |..+.......0...U.|
+000001b0  13 01 01 ff 04 02 30 00  30 19 06 03 55 1d 0e 04  |......0.0...U...|
+000001c0  12 04 10 9f 91 16 1f 43  43 3e 49 a6 de 6d b6 80  |.......CC>I..m..|
+000001d0  d7 9f 60 30 1b 06 03 55  1d 23 04 14 30 12 80 10  |..`0...U.#..0...|
+000001e0  48 13 49 4d 13 7e 16 31  bb a3 01 d5 ac ab 6e 7b  |H.IM.~.1......n{|
+000001f0  30 19 06 03 55 1d 11 04  12 30 10 82 0e 65 78 61  |0...U....0...exa|
+00000200  6d 70 6c 65 2e 67 6f 6c  61 6e 67 30 0d 06 09 2a  |mple.golang0...*|
+00000210  86 48 86 f7 0d 01 01 0b  05 00 03 81 81 00 9d 30  |.H.............0|
+00000220  cc 40 2b 5b 50 a0 61 cb  ba e5 53 58 e1 ed 83 28  |.@+[P.a...SX...(|
+00000230  a9 58 1a a9 38 a4 95 a1  ac 31 5a 1a 84 66 3d 43  |.X..8....1Z..f=C|
+00000240  d3 2d d9 0b f2 97 df d3  20 64 38 92 24 3a 00 bc  |.-...... d8.$:..|
+00000250  cf 9c 7d b7 40 20 01 5f  aa d3 16 61 09 a2 76 fd  |..}.@ ._...a..v.|
+00000260  13 c3 cc e1 0c 5c ee b1  87 82 f1 6c 04 ed 73 bb  |.....\.....l..s.|
+00000270  b3 43 77 8d 0c 1c f1 0f  a1 d8 40 83 61 c9 4c 72  |.Cw.......@.a.Lr|
+00000280  2b 9d ae db 46 06 06 4d  f4 c1 b3 3e c0 d1 bd 42  |+...F..M...>...B|
+00000290  d4 db fe 3d 13 60 84 5c  21 d3 3b e9 fa e7 16 03  |...=.`.\!.;.....|
+000002a0  03 00 ac 0c 00 00 a8 03  00 1d 20 2f e5 7d a3 47  |.......... /.}.G|
+000002b0  cd 62 43 15 28 da ac 5f  bb 29 07 30 ff f6 84 af  |.bC.(.._.).0....|
+000002c0  c4 cf c2 ed 90 99 5f 58  cb 3b 74 04 01 00 80 21  |......_X.;t....!|
+000002d0  b5 82 7e 5a 7d 93 55 15  db e1 eb cc 62 8d f8 45  |..~Z}.U.....b..E|
+000002e0  2f e0 5d 57 51 08 80 86  b6 43 85 0f be f7 49 ca  |/.]WQ....C....I.|
+000002f0  97 f2 f1 20 51 e6 29 8d  c6 88 91 e3 60 8c 88 69  |... Q.).....`..i|
+00000300  73 9b 38 70 ad 2f 5b 44  62 05 05 20 28 92 57 f9  |s.8p./[Db.. (.W.|
+00000310  51 6e 6b 8c b7 3f c3 6e  a3 53 b9 bd 02 bd 69 ae  |Qnk..?.n.S....i.|
+00000320  ee 5f 96 57 7b a2 02 86  70 33 6b e7 ad 03 25 13  |._.W{...p3k...%.|
+00000330  10 f8 d7 cb 2e 33 b2 1f  53 64 77 d1 e5 8a 32 bc  |.....3..Sdw...2.|
+00000340  e0 bc 65 9d 94 de fb 9a  d5 66 00 7a 79 dc da 16  |..e......f.zy...|
+00000350  03 03 00 04 0e 00 00 00                           |........|
 >>> Flow 3 (client to server)
-00000000  16 03 03 00 25 10 00 00  21 20 82 3a 50 41 f7 b1  |....%...! .:PA..|
-00000010  0f 97 ba 38 04 db f3 a6  ec 8b d1 db 06 c1 84 89  |...8............|
-00000020  a0 53 84 92 27 a2 53 e8  5d 21 14 03 03 00 01 01  |.S..'.S.]!......|
-00000030  16 03 03 00 20 7d 80 6d  7f a9 28 d6 0d 50 d6 b4  |.... }.m..(..P..|
-00000040  24 d3 92 f8 0b 8e 6b d8  7c 64 9e 6c 87 a9 8e 37  |$.....k.|d.l...7|
-00000050  9e 1b 0b 2d a5                                    |...-.|
+00000000  16 03 03 00 25 10 00 00  21 20 6d d3 b6 6a f0 ac  |....%...! m..j..|
+00000010  40 6e e8 73 db a2 04 41  6a 7f c1 cc ae 13 44 e1  |@n.s...Aj.....D.|
+00000020  1c f4 5a 59 1b 88 4b a8  89 61 14 03 03 00 01 01  |..ZY..K..a......|
+00000030  16 03 03 00 20 5f 09 a4  44 8e a8 6d 09 14 32 05  |.... _..D..m..2.|
+00000040  ce ae f9 ad ad a2 d9 45  77 be e2 2c bd 97 22 1a  |.......Ew..,..".|
+00000050  7d 3b 54 db 82                                    |};T..|
 >>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 20 e4 58 cf fb 81  |.......... .X...|
-00000010  be dd 5b 98 97 bd bd 6a  f0 76 92 b6 bb 2c 8f a3  |..[....j.v...,..|
-00000020  e5 52 5b 1d f4 17 7b 2a  a8 40 26 17 03 03 00 1d  |.R[...{*.@&.....|
-00000030  58 ef 4f 1d 98 0f 3d 59  88 df 6e ac c9 37 43 d5  |X.O...=Y..n..7C.|
-00000040  f5 58 b3 7a 62 a3 7d 26  a2 a2 80 23 ef 15 03 03  |.X.zb.}&...#....|
-00000050  00 12 05 b8 57 6a 80 71  b6 a4 58 94 15 f4 2f 0c  |....Wj.q..X.../.|
-00000060  8e 76 b2 aa                                       |.v..|
+00000000  14 03 03 00 01 01 16 03  03 00 20 54 52 24 a8 3a  |.......... TR$.:|
+00000010  e3 45 a2 49 1c c5 10 62  6e d1 32 fe 70 0f 32 e0  |.E.I...bn.2.p.2.|
+00000020  fc 95 22 81 32 38 ab f2  0a ba 6c 17 03 03 00 1d  |..".28....l.....|
+00000030  b7 a9 2a a5 ad e5 9e 39  cc a9 bc 81 ef a1 67 e1  |..*....9......g.|
+00000040  85 08 9f f4 e7 04 c8 0b  0d fd 5c ec 94 15 03 03  |..........\.....|
+00000050  00 12 d7 18 99 08 6c 98  dc 05 20 19 cd dd f2 29  |......l... ....)|
+00000060  14 3c cf 31                                       |.<.1|
diff --git a/src/crypto/tls/testdata/Server-TLSv12-RSA-RSAPSS b/src/crypto/tls/testdata/Server-TLSv12-RSA-RSAPSS
index af4c069..46ee1aa 100644
--- a/src/crypto/tls/testdata/Server-TLSv12-RSA-RSAPSS
+++ b/src/crypto/tls/testdata/Server-TLSv12-RSA-RSAPSS
@@ -1,77 +1,77 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 5b 01 00 00  57 03 03 e0 83 fd ef f8  |....[...W.......|
-00000010  cb 41 23 14 36 21 07 eb  4e 01 7d 80 63 e4 b9 45  |.A#.6!..N.}.c..E|
-00000020  f0 84 72 71 9b ac 60 49  6c 70 74 00 00 04 cc a8  |..rq..`Ilpt.....|
+00000000  16 03 01 00 5b 01 00 00  57 03 03 ee 47 d0 cd 83  |....[...W...G...|
+00000010  ff 1e f3 45 81 2e 59 6a  84 da c9 29 bd b0 8b f5  |...E..Yj...)....|
+00000020  3c 47 58 b0 94 59 33 9a  f6 00 2d 00 00 04 cc a8  |<GX..Y3...-.....|
 00000030  00 ff 01 00 00 2a 00 0b  00 04 03 00 01 02 00 0a  |.....*..........|
 00000040  00 0c 00 0a 00 1d 00 17  00 1e 00 19 00 18 00 16  |................|
 00000050  00 00 00 17 00 00 00 0d  00 06 00 04 08 06 08 04  |................|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 37 02 00 00  33 03 03 00 00 00 00 00  |....7...3.......|
+00000000  16 03 03 00 3b 02 00 00  37 03 03 00 00 00 00 00  |....;...7.......|
 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 00000020  00 00 00 44 4f 57 4e 47  52 44 01 00 cc a8 00 00  |...DOWNGRD......|
-00000030  0b ff 01 00 01 00 00 0b  00 02 01 00 16 03 03 02  |................|
-00000040  59 0b 00 02 55 00 02 52  00 02 4f 30 82 02 4b 30  |Y...U..R..O0..K0|
-00000050  82 01 b4 a0 03 02 01 02  02 09 00 e8 f0 9d 3f e2  |..............?.|
-00000060  5b ea a6 30 0d 06 09 2a  86 48 86 f7 0d 01 01 0b  |[..0...*.H......|
-00000070  05 00 30 1f 31 0b 30 09  06 03 55 04 0a 13 02 47  |..0.1.0...U....G|
-00000080  6f 31 10 30 0e 06 03 55  04 03 13 07 47 6f 20 52  |o1.0...U....Go R|
-00000090  6f 6f 74 30 1e 17 0d 31  36 30 31 30 31 30 30 30  |oot0...160101000|
-000000a0  30 30 30 5a 17 0d 32 35  30 31 30 31 30 30 30 30  |000Z..2501010000|
-000000b0  30 30 5a 30 1a 31 0b 30  09 06 03 55 04 0a 13 02  |00Z0.1.0...U....|
-000000c0  47 6f 31 0b 30 09 06 03  55 04 03 13 02 47 6f 30  |Go1.0...U....Go0|
-000000d0  81 9f 30 0d 06 09 2a 86  48 86 f7 0d 01 01 01 05  |..0...*.H.......|
-000000e0  00 03 81 8d 00 30 81 89  02 81 81 00 db 46 7d 93  |.....0.......F}.|
-000000f0  2e 12 27 06 48 bc 06 28  21 ab 7e c4 b6 a2 5d fe  |..'.H..(!.~...].|
-00000100  1e 52 45 88 7a 36 47 a5  08 0d 92 42 5b c2 81 c0  |.RE.z6G....B[...|
-00000110  be 97 79 98 40 fb 4f 6d  14 fd 2b 13 8b c2 a5 2e  |..y.@.Om..+.....|
-00000120  67 d8 d4 09 9e d6 22 38  b7 4a 0b 74 73 2b c2 34  |g....."8.J.ts+.4|
-00000130  f1 d1 93 e5 96 d9 74 7b  f3 58 9f 6c 61 3c c0 b0  |......t{.X.la<..|
-00000140  41 d4 d9 2b 2b 24 23 77  5b 1c 3b bd 75 5d ce 20  |A..++$#w[.;.u]. |
-00000150  54 cf a1 63 87 1d 1e 24  c4 f3 1d 1a 50 8b aa b6  |T..c...$....P...|
-00000160  14 43 ed 97 a7 75 62 f4  14 c8 52 d7 02 03 01 00  |.C...ub...R.....|
-00000170  01 a3 81 93 30 81 90 30  0e 06 03 55 1d 0f 01 01  |....0..0...U....|
-00000180  ff 04 04 03 02 05 a0 30  1d 06 03 55 1d 25 04 16  |.......0...U.%..|
-00000190  30 14 06 08 2b 06 01 05  05 07 03 01 06 08 2b 06  |0...+.........+.|
-000001a0  01 05 05 07 03 02 30 0c  06 03 55 1d 13 01 01 ff  |......0...U.....|
-000001b0  04 02 30 00 30 19 06 03  55 1d 0e 04 12 04 10 9f  |..0.0...U.......|
-000001c0  91 16 1f 43 43 3e 49 a6  de 6d b6 80 d7 9f 60 30  |...CC>I..m....`0|
-000001d0  1b 06 03 55 1d 23 04 14  30 12 80 10 48 13 49 4d  |...U.#..0...H.IM|
-000001e0  13 7e 16 31 bb a3 01 d5  ac ab 6e 7b 30 19 06 03  |.~.1......n{0...|
-000001f0  55 1d 11 04 12 30 10 82  0e 65 78 61 6d 70 6c 65  |U....0...example|
-00000200  2e 67 6f 6c 61 6e 67 30  0d 06 09 2a 86 48 86 f7  |.golang0...*.H..|
-00000210  0d 01 01 0b 05 00 03 81  81 00 9d 30 cc 40 2b 5b  |...........0.@+[|
-00000220  50 a0 61 cb ba e5 53 58  e1 ed 83 28 a9 58 1a a9  |P.a...SX...(.X..|
-00000230  38 a4 95 a1 ac 31 5a 1a  84 66 3d 43 d3 2d d9 0b  |8....1Z..f=C.-..|
-00000240  f2 97 df d3 20 64 38 92  24 3a 00 bc cf 9c 7d b7  |.... d8.$:....}.|
-00000250  40 20 01 5f aa d3 16 61  09 a2 76 fd 13 c3 cc e1  |@ ._...a..v.....|
-00000260  0c 5c ee b1 87 82 f1 6c  04 ed 73 bb b3 43 77 8d  |.\.....l..s..Cw.|
-00000270  0c 1c f1 0f a1 d8 40 83  61 c9 4c 72 2b 9d ae db  |......@.a.Lr+...|
-00000280  46 06 06 4d f4 c1 b3 3e  c0 d1 bd 42 d4 db fe 3d  |F..M...>...B...=|
-00000290  13 60 84 5c 21 d3 3b e9  fa e7 16 03 03 00 ac 0c  |.`.\!.;.........|
-000002a0  00 00 a8 03 00 1d 20 2f  e5 7d a3 47 cd 62 43 15  |...... /.}.G.bC.|
-000002b0  28 da ac 5f bb 29 07 30  ff f6 84 af c4 cf c2 ed  |(.._.).0........|
-000002c0  90 99 5f 58 cb 3b 74 08  04 00 80 58 d3 5f 28 bc  |.._X.;t....X._(.|
-000002d0  50 79 b9 3d f1 ac a1 af  52 cd d3 fd e7 75 47 c3  |Py.=....R....uG.|
-000002e0  65 3a 6f 62 22 c2 b5 cc  2b 22 f3 5d 3f b5 b6 9e  |e:ob"...+".]?...|
-000002f0  57 bf c7 4e 08 bd fb 5a  17 13 09 1a e9 6c b6 ce  |W..N...Z.....l..|
-00000300  b2 0e 88 ae ba a3 a0 b5  2c ff 51 b5 87 95 14 09  |........,.Q.....|
-00000310  6d 9c 73 3f f0 c7 40 6b  4c ca 40 96 d6 44 96 d0  |m.s?..@kL.@..D..|
-00000320  6f b1 a0 1c 4f 66 cc 9b  4f 85 98 3c 03 68 e3 a8  |o...Of..O..<.h..|
-00000330  5b 28 04 fb 1e be 9e 2a  66 c1 6e f1 2e a4 20 08  |[(.....*f.n... .|
-00000340  7e 11 78 7b fc c4 43 af  2a b4 8b 16 03 03 00 04  |~.x{..C.*.......|
-00000350  0e 00 00 00                                       |....|
+00000030  0f ff 01 00 01 00 00 17  00 00 00 0b 00 02 01 00  |................|
+00000040  16 03 03 02 59 0b 00 02  55 00 02 52 00 02 4f 30  |....Y...U..R..O0|
+00000050  82 02 4b 30 82 01 b4 a0  03 02 01 02 02 09 00 e8  |..K0............|
+00000060  f0 9d 3f e2 5b ea a6 30  0d 06 09 2a 86 48 86 f7  |..?.[..0...*.H..|
+00000070  0d 01 01 0b 05 00 30 1f  31 0b 30 09 06 03 55 04  |......0.1.0...U.|
+00000080  0a 13 02 47 6f 31 10 30  0e 06 03 55 04 03 13 07  |...Go1.0...U....|
+00000090  47 6f 20 52 6f 6f 74 30  1e 17 0d 31 36 30 31 30  |Go Root0...16010|
+000000a0  31 30 30 30 30 30 30 5a  17 0d 32 35 30 31 30 31  |1000000Z..250101|
+000000b0  30 30 30 30 30 30 5a 30  1a 31 0b 30 09 06 03 55  |000000Z0.1.0...U|
+000000c0  04 0a 13 02 47 6f 31 0b  30 09 06 03 55 04 03 13  |....Go1.0...U...|
+000000d0  02 47 6f 30 81 9f 30 0d  06 09 2a 86 48 86 f7 0d  |.Go0..0...*.H...|
+000000e0  01 01 01 05 00 03 81 8d  00 30 81 89 02 81 81 00  |.........0......|
+000000f0  db 46 7d 93 2e 12 27 06  48 bc 06 28 21 ab 7e c4  |.F}...'.H..(!.~.|
+00000100  b6 a2 5d fe 1e 52 45 88  7a 36 47 a5 08 0d 92 42  |..]..RE.z6G....B|
+00000110  5b c2 81 c0 be 97 79 98  40 fb 4f 6d 14 fd 2b 13  |[.....y.@.Om..+.|
+00000120  8b c2 a5 2e 67 d8 d4 09  9e d6 22 38 b7 4a 0b 74  |....g....."8.J.t|
+00000130  73 2b c2 34 f1 d1 93 e5  96 d9 74 7b f3 58 9f 6c  |s+.4......t{.X.l|
+00000140  61 3c c0 b0 41 d4 d9 2b  2b 24 23 77 5b 1c 3b bd  |a<..A..++$#w[.;.|
+00000150  75 5d ce 20 54 cf a1 63  87 1d 1e 24 c4 f3 1d 1a  |u]. T..c...$....|
+00000160  50 8b aa b6 14 43 ed 97  a7 75 62 f4 14 c8 52 d7  |P....C...ub...R.|
+00000170  02 03 01 00 01 a3 81 93  30 81 90 30 0e 06 03 55  |........0..0...U|
+00000180  1d 0f 01 01 ff 04 04 03  02 05 a0 30 1d 06 03 55  |...........0...U|
+00000190  1d 25 04 16 30 14 06 08  2b 06 01 05 05 07 03 01  |.%..0...+.......|
+000001a0  06 08 2b 06 01 05 05 07  03 02 30 0c 06 03 55 1d  |..+.......0...U.|
+000001b0  13 01 01 ff 04 02 30 00  30 19 06 03 55 1d 0e 04  |......0.0...U...|
+000001c0  12 04 10 9f 91 16 1f 43  43 3e 49 a6 de 6d b6 80  |.......CC>I..m..|
+000001d0  d7 9f 60 30 1b 06 03 55  1d 23 04 14 30 12 80 10  |..`0...U.#..0...|
+000001e0  48 13 49 4d 13 7e 16 31  bb a3 01 d5 ac ab 6e 7b  |H.IM.~.1......n{|
+000001f0  30 19 06 03 55 1d 11 04  12 30 10 82 0e 65 78 61  |0...U....0...exa|
+00000200  6d 70 6c 65 2e 67 6f 6c  61 6e 67 30 0d 06 09 2a  |mple.golang0...*|
+00000210  86 48 86 f7 0d 01 01 0b  05 00 03 81 81 00 9d 30  |.H.............0|
+00000220  cc 40 2b 5b 50 a0 61 cb  ba e5 53 58 e1 ed 83 28  |.@+[P.a...SX...(|
+00000230  a9 58 1a a9 38 a4 95 a1  ac 31 5a 1a 84 66 3d 43  |.X..8....1Z..f=C|
+00000240  d3 2d d9 0b f2 97 df d3  20 64 38 92 24 3a 00 bc  |.-...... d8.$:..|
+00000250  cf 9c 7d b7 40 20 01 5f  aa d3 16 61 09 a2 76 fd  |..}.@ ._...a..v.|
+00000260  13 c3 cc e1 0c 5c ee b1  87 82 f1 6c 04 ed 73 bb  |.....\.....l..s.|
+00000270  b3 43 77 8d 0c 1c f1 0f  a1 d8 40 83 61 c9 4c 72  |.Cw.......@.a.Lr|
+00000280  2b 9d ae db 46 06 06 4d  f4 c1 b3 3e c0 d1 bd 42  |+...F..M...>...B|
+00000290  d4 db fe 3d 13 60 84 5c  21 d3 3b e9 fa e7 16 03  |...=.`.\!.;.....|
+000002a0  03 00 ac 0c 00 00 a8 03  00 1d 20 2f e5 7d a3 47  |.......... /.}.G|
+000002b0  cd 62 43 15 28 da ac 5f  bb 29 07 30 ff f6 84 af  |.bC.(.._.).0....|
+000002c0  c4 cf c2 ed 90 99 5f 58  cb 3b 74 08 04 00 80 95  |......_X.;t.....|
+000002d0  e0 3f 63 8b d7 e0 51 5a  eb ea 5e de ce da 62 02  |.?c...QZ..^...b.|
+000002e0  7d 7d 42 7f 9f db 53 a2  a9 e5 be b4 32 47 65 9a  |}}B...S.....2Ge.|
+000002f0  cc d6 9f ee 4c bc 28 7d  27 00 69 e2 fa fd fa 65  |....L.(}'.i....e|
+00000300  a0 3d c1 00 85 a9 28 8c  d1 9b 6d 49 2f 84 17 b0  |.=....(...mI/...|
+00000310  59 cd ac 79 a8 6d cc 8a  a0 05 e9 ca e8 df 14 2d  |Y..y.m.........-|
+00000320  a0 59 a3 75 a6 c6 ec 91  37 e1 e6 dc 6d d8 74 96  |.Y.u....7...m.t.|
+00000330  95 bc ff 11 ca fe 91 4a  d6 9e d7 73 5f bd 28 6a  |.......J...s_.(j|
+00000340  23 6d c5 2b ee 25 17 6c  e1 50 c1 f9 42 7e 3c 16  |#m.+.%.l.P..B~<.|
+00000350  03 03 00 04 0e 00 00 00                           |........|
 >>> Flow 3 (client to server)
-00000000  16 03 03 00 25 10 00 00  21 20 e2 54 7d 82 d2 8d  |....%...! .T}...|
-00000010  b8 d6 87 17 ec 2a 64 4e  15 6b b0 b3 01 66 b0 7d  |.....*dN.k...f.}|
-00000020  73 20 9f cb 30 9d 3c 27  ac 13 14 03 03 00 01 01  |s ..0.<'........|
-00000030  16 03 03 00 20 fa a0 b7  eb ef 49 97 d5 da f0 9d  |.... .....I.....|
-00000040  85 a6 e6 67 f3 30 e8 f0  82 3a 7a c4 3f 76 f6 c5  |...g.0...:z.?v..|
-00000050  8f d3 a5 65 f3                                    |...e.|
+00000000  16 03 03 00 25 10 00 00  21 20 51 de e0 c4 a5 8f  |....%...! Q.....|
+00000010  ee 05 c5 d5 a2 ce 9c 4a  19 6d 14 cb 61 88 a6 fe  |.......J.m..a...|
+00000020  38 24 b6 4e d7 f0 c5 27  97 32 14 03 03 00 01 01  |8$.N...'.2......|
+00000030  16 03 03 00 20 0e 14 d4  f5 c2 10 a1 80 b3 b4 90  |.... ...........|
+00000040  17 43 1f 22 69 78 00 bb  87 c3 78 23 8e 03 8f c4  |.C."ix....x#....|
+00000050  28 1c f8 42 e6                                    |(..B.|
 >>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 20 6b cf 58 e1 52  |.......... k.X.R|
-00000010  e3 2c 05 e6 a3 05 c1 36  02 f0 90 63 bb 86 0f 54  |.,.....6...c...T|
-00000020  61 d7 1a 31 7d bd 08 00  22 71 09 17 03 03 00 1d  |a..1}..."q......|
-00000030  4a 8e 05 28 e3 77 31 43  be ac 32 c6 af f2 7b 1c  |J..(.w1C..2...{.|
-00000040  ab 11 7f 32 5a 6a eb 76  ac c6 eb f1 dc 15 03 03  |...2Zj.v........|
-00000050  00 12 3a f1 ee a3 6f bf  9b 9e 5e b8 20 76 84 bc  |..:...o...^. v..|
-00000060  1e 2e a0 87                                       |....|
+00000000  14 03 03 00 01 01 16 03  03 00 20 6f a9 ff 13 fb  |.......... o....|
+00000010  85 fa e4 fc cd ca 74 59  21 cd 3c fd 73 43 a2 48  |......tY!.<.sC.H|
+00000020  f5 cf cd f7 9b 24 1d db  8a 52 a6 17 03 03 00 1d  |.....$...R......|
+00000030  63 25 92 b2 0c f7 d1 92  83 95 3c 13 ee 78 4c c1  |c%........<..xL.|
+00000040  60 66 60 ed 8e 86 5b 1d  2d 1b a5 ab 38 15 03 03  |`f`...[.-...8...|
+00000050  00 12 d5 3c b4 59 87 f5  45 fc 68 9b 03 7e 5b 97  |...<.Y..E.h..~[.|
+00000060  c1 83 13 33                                       |...3|
diff --git a/src/crypto/tls/testdata/Server-TLSv12-Resume b/src/crypto/tls/testdata/Server-TLSv12-Resume
index 456fe2a..cd0a124 100644
--- a/src/crypto/tls/testdata/Server-TLSv12-Resume
+++ b/src/crypto/tls/testdata/Server-TLSv12-Resume
@@ -1,46 +1,54 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 01 12 01 00 01  0e 03 03 90 27 78 df 71  |............'x.q|
-00000010  d3 0e ce 1d de ec d2 1b  70 e0 89 da 98 a9 45 3e  |........p.....E>|
-00000020  9c ee 93 90 8f 61 d0 a3  b4 a4 5a 20 9d cd d4 81  |.....a....Z ....|
-00000030  e2 c0 59 81 21 bc 9f 2a  84 3e 91 15 3e b9 c0 a1  |..Y.!..*.>..>...|
-00000040  e0 6b 73 9c 45 53 03 ad  b9 e6 c2 77 00 04 00 2f  |.ks.ES.....w.../|
-00000050  00 ff 01 00 00 c1 00 23  00 81 50 46 ad c1 db a8  |.......#..PF....|
-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 9f 83 51  |...........o,..Q|
-00000080  ed 14 ef 68 ca 42 c5 4c  75 5e a5 6f d2 49 61 e4  |...h.B.Lu^.o.Ia.|
-00000090  fb 83 46 7c 4c ab f9 c6  d1 3c 9e 5b 8d d8 bc c0  |..F|L....<.[....|
-000000a0  a5 2d 84 db 24 dd a0 16  60 1d 87 a0 52 88 25 6c  |.-..$...`...R.%l|
-000000b0  c6 8e 5b 71 0f 74 c3 48  49 38 16 92 8c de 77 bd  |..[q.t.HI8....w.|
-000000c0  8a 2b 45 4d 58 86 40 b1  d6 0f 99 de 27 41 b2 41  |.+EMX.@.....'A.A|
-000000d0  27 aa fe 26 e9 24 91 2a  00 ff 08 00 16 00 00 00  |'..&.$.*........|
-000000e0  17 00 00 00 0d 00 30 00  2e 04 03 05 03 06 03 08  |......0.........|
-000000f0  07 08 08 08 09 08 0a 08  0b 08 04 08 05 08 06 04  |................|
-00000100  01 05 01 06 01 03 03 02  03 03 01 02 01 03 02 02  |................|
-00000110  02 04 02 05 02 06 02                              |.......|
+00000000  16 03 01 01 0a 01 00 01  06 03 03 2d b6 ca ea 39  |...........-...9|
+00000010  59 17 86 df 90 2f 73 e0  a0 5c 6e 28 09 78 69 d6  |Y..../s..\n(.xi.|
+00000020  30 06 b7 7b 17 a9 79 30  2a d8 57 20 c5 5c ed 86  |0..{..y0*.W .\..|
+00000030  15 f4 3b c8 d2 5f 7a 80  2a 6a cd 40 c2 da 6f a8  |..;.._z.*j.@..o.|
+00000040  cd d7 e7 bf 48 bd fb a1  e9 4b 9b a9 00 04 00 2f  |....H....K...../|
+00000050  00 ff 01 00 00 b9 00 23  00 79 00 00 00 00 00 00  |.......#.y......|
+00000060  00 00 00 00 00 00 00 00  00 00 94 6f 2d b0 ac 51  |...........o-..Q|
+00000070  ed 14 ef 68 ca 42 c5 4c  85 f6 26 0d a4 ad a8 f5  |...h.B.L..&.....|
+00000080  14 64 4f b9 c3 fb 1e 55  c1 1f c7 31 57 72 68 db  |.dO....U...1Wrh.|
+00000090  03 37 a8 c9 07 f4 ca 62  6c 5c f3 8b 5a 3d 76 dd  |.7.....bl\..Z=v.|
+000000a0  63 ea 68 61 6b a1 2d 95  49 38 16 7e 51 5c e5 15  |c.hak.-.I8.~Q\..|
+000000b0  c0 58 7d c5 67 4a 6f 64  b6 79 1a 41 9b b1 33 15  |.X}.gJod.y.A..3.|
+000000c0  38 74 92 5c a5 48 c3 f2  94 bb 33 ec af cf d7 e7  |8t.\.H....3.....|
+000000d0  c9 3e 35 00 16 00 00 00  17 00 00 00 0d 00 30 00  |.>5...........0.|
+000000e0  2e 04 03 05 03 06 03 08  07 08 08 08 09 08 0a 08  |................|
+000000f0  0b 08 04 08 05 08 06 04  01 05 01 06 01 03 03 02  |................|
+00000100  03 03 01 02 01 03 02 02  02 04 02 05 02 06 02     |...............|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 51 02 00 00  4d 03 03 00 00 00 00 00  |....Q...M.......|
+00000000  16 03 03 00 59 02 00 00  55 03 03 00 00 00 00 00  |....Y...U.......|
 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000020  00 00 00 44 4f 57 4e 47  52 44 01 20 9d cd d4 81  |...DOWNGRD. ....|
-00000030  e2 c0 59 81 21 bc 9f 2a  84 3e 91 15 3e b9 c0 a1  |..Y.!..*.>..>...|
-00000040  e0 6b 73 9c 45 53 03 ad  b9 e6 c2 77 00 2f 00 00  |.ks.ES.....w./..|
-00000050  05 ff 01 00 01 00 14 03  03 00 01 01 16 03 03 00  |................|
-00000060  40 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |@...............|
-00000070  00 57 8e 5f 0a f6 3f 3b  43 f1 33 bc ef 5e c6 8d  |.W._..?;C.3..^..|
-00000080  86 92 58 58 71 51 e8 54  57 96 5f bd 36 3a 9f d3  |..XXqQ.TW._.6:..|
-00000090  e9 27 01 bf fb 6a 05 57  de 2d db b2 79 38 72 95  |.'...j.W.-..y8r.|
-000000a0  fd                                                |.|
+00000020  00 00 00 44 4f 57 4e 47  52 44 01 20 c5 5c ed 86  |...DOWNGRD. .\..|
+00000030  15 f4 3b c8 d2 5f 7a 80  2a 6a cd 40 c2 da 6f a8  |..;.._z.*j.@..o.|
+00000040  cd d7 e7 bf 48 bd fb a1  e9 4b 9b a9 00 2f 00 00  |....H....K.../..|
+00000050  0d 00 23 00 00 ff 01 00  01 00 00 17 00 00 16 03  |..#.............|
+00000060  03 00 83 04 00 00 7f 00  00 00 00 00 79 00 00 00  |............y...|
+00000070  00 00 00 00 00 00 00 00  00 00 00 00 00 94 6f 2d  |..............o-|
+00000080  b0 ac 51 ed 14 ef 68 ca  42 c5 4c 85 f6 26 0d a4  |..Q...h.B.L..&..|
+00000090  ad a8 f5 14 64 4f b9 c3  fb 1e 55 c1 1f c7 31 57  |....dO....U...1W|
+000000a0  72 68 db 03 37 a8 c9 07  f4 ca 62 6c 5c f3 8b 5a  |rh..7.....bl\..Z|
+000000b0  3d 76 dd 63 ea 68 61 6b  a1 2d 95 49 38 16 7e 51  |=v.c.hak.-.I8.~Q|
+000000c0  5c e5 15 c0 58 7d c5 67  4a 6f 64 b6 79 1a 41 9b  |\...X}.gJod.y.A.|
+000000d0  b1 33 15 38 74 92 5c a5  48 c3 f2 94 bb 33 ec af  |.3.8t.\.H....3..|
+000000e0  cf d7 e7 c9 3e 35 14 03  03 00 01 01 16 03 03 00  |....>5..........|
+000000f0  40 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |@...............|
+00000100  00 47 68 3a 66 5b d6 ed  b7 60 a9 fb e8 37 d6 9d  |.Gh:f[...`...7..|
+00000110  a6 b9 4d d5 f3 9f 0f c6  3c 21 6e d5 80 08 a8 34  |..M.....<!n....4|
+00000120  34 da a3 1f b0 20 28 e4  2f 2b 6b c6 3e dc ac 6b  |4.... (./+k.>..k|
+00000130  40                                                |@|
 >>> Flow 3 (client to server)
-00000000  14 03 03 00 01 01 16 03  03 00 40 6d 3c 76 31 a4  |..........@m<v1.|
-00000010  c5 41 d4 67 9f 20 7d 3e  f4 35 76 02 ef a2 4b 18  |.A.g. }>.5v...K.|
-00000020  01 f8 a8 83 0c eb 58 f7  d6 93 c6 b6 40 0e c8 24  |......X.....@..$|
-00000030  46 58 0c 79 4a c6 b4 15  65 1e 9c bd ff 51 4d d0  |FX.yJ...e....QM.|
-00000040  44 66 fe c0 98 d5 26 11  98 cf 52                 |Df....&...R|
+00000000  14 03 03 00 01 01 16 03  03 00 40 46 34 b3 97 54  |..........@F4..T|
+00000010  20 5b 95 f3 22 f8 a1 89  c8 95 93 ba 7b a4 a8 8f  | [..".......{...|
+00000020  46 a8 d6 c1 b3 ac f0 e0  49 3d 8d e4 1c ac b8 a4  |F.......I=......|
+00000030  01 21 5e d8 f0 f5 10 10  f7 de 8b 33 9d 94 cf f6  |.!^........3....|
+00000040  f2 9b 39 22 5c e6 c0 5e  b4 1d cd                 |..9"\..^...|
 >>> Flow 4 (server to client)
 00000000  17 03 03 00 40 00 00 00  00 00 00 00 00 00 00 00  |....@...........|
-00000010  00 00 00 00 00 4e 8e bd  e5 c8 d4 1a 14 00 f1 ed  |.....N..........|
-00000020  c4 88 b3 5c 92 b9 ad 8a  68 d4 f3 85 1b 02 25 aa  |...\....h.....%.|
-00000030  a0 65 49 08 0d 2a b4 0a  64 eb ea ab 06 73 08 ca  |.eI..*..d....s..|
-00000040  62 c9 56 45 a9 15 03 03  00 30 00 00 00 00 00 00  |b.VE.....0......|
-00000050  00 00 00 00 00 00 00 00  00 00 60 51 ae 81 79 6d  |..........`Q..ym|
-00000060  91 95 02 42 30 3f c4 3c  2b fc 74 47 a7 a9 17 22  |...B0?.<+.tG..."|
-00000070  88 26 6d 18 b9 8f ad 43  e3 b0                    |.&m....C..|
+00000010  00 00 00 00 00 5c bc 45  06 2e d3 7b 30 99 a6 af  |.....\.E...{0...|
+00000020  64 0e 63 93 73 6f 0a e7  a4 1d ac 94 25 11 a5 63  |d.c.so......%..c|
+00000030  8d b2 44 aa 98 44 f8 b5  51 ea 2c fb 26 99 f6 a4  |..D..D..Q.,.&...|
+00000040  2c f8 15 c3 90 15 03 03  00 30 00 00 00 00 00 00  |,........0......|
+00000050  00 00 00 00 00 00 00 00  00 00 c6 58 8e 7c 97 de  |...........X.|..|
+00000060  3b b8 39 cd 7b 1d 67 77  27 da 93 39 52 a7 81 9b  |;.9.{.gw'..9R...|
+00000070  ab 5a bc e9 00 1a 64 3a  ca f5                    |.Z....d:..|
diff --git a/src/crypto/tls/testdata/Server-TLSv12-ResumeDisabled b/src/crypto/tls/testdata/Server-TLSv12-ResumeDisabled
index 339fd9a..9110f54 100644
--- a/src/crypto/tls/testdata/Server-TLSv12-ResumeDisabled
+++ b/src/crypto/tls/testdata/Server-TLSv12-ResumeDisabled
@@ -1,91 +1,91 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 01 12 01 00 01  0e 03 03 b8 aa 9b e6 98  |................|
-00000010  be 93 d6 03 f2 cd 62 23  76 dd 74 6c 48 ac 9a f6  |......b#v.tlH...|
-00000020  f3 27 62 93 6e 99 b2 0d  54 af b7 20 2d 20 97 9a  |.'b.n...T.. - ..|
-00000030  c8 88 50 65 95 2a 02 8f  7b 47 77 6d 3c 49 ba a9  |..Pe.*..{Gwm<I..|
-00000040  0c 8a 68 0d b9 30 64 c9  c1 f0 d4 61 00 04 00 2f  |..h..0d....a.../|
-00000050  00 ff 01 00 00 c1 00 23  00 81 50 46 ad c1 db a8  |.......#..PF....|
-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 9f 83 51  |...........o,..Q|
-00000080  ed 14 ef 68 ca 42 c5 4c  20 33 6c 01 97 a5 69 44  |...h.B.L 3l...iD|
-00000090  bf 8f ea db 83 05 fb ef  cc 51 1f 0b 4d 44 77 89  |.........Q..MDw.|
-000000a0  11 cf c8 38 16 67 ea a2  3e 8b 2a 18 f2 f7 25 ce  |...8.g..>.*...%.|
-000000b0  e0 d8 4c 93 31 b0 59 23  49 38 16 3a f9 63 9e 61  |..L.1.Y#I8.:.c.a|
-000000c0  21 1b ab 67 09 6a 23 07  8e d0 4a 19 78 9c 1e 60  |!..g.j#...J.x..`|
-000000d0  40 a7 83 c5 9a 48 41 35  c4 e9 63 00 16 00 00 00  |@....HA5..c.....|
-000000e0  17 00 00 00 0d 00 30 00  2e 04 03 05 03 06 03 08  |......0.........|
-000000f0  07 08 08 08 09 08 0a 08  0b 08 04 08 05 08 06 04  |................|
-00000100  01 05 01 06 01 03 03 02  03 03 01 02 01 03 02 02  |................|
-00000110  02 04 02 05 02 06 02                              |.......|
+00000000  16 03 01 01 06 01 00 01  02 03 03 dc 6d 25 a7 37  |............m%.7|
+00000010  5a 18 ef e8 ba a7 4b cb  25 8b 5a 61 bd fd 99 56  |Z.....K.%.Za...V|
+00000020  a8 7f 10 26 f7 f4 e9 3e  16 89 ce 20 ac c3 35 13  |...&...>... ..5.|
+00000030  d1 28 31 15 15 2d 6b e9  50 20 07 2c c5 48 6c 21  |.(1..-k.P .,.Hl!|
+00000040  78 bf c9 7c c4 39 e7 2e  0a ed 71 21 00 04 00 2f  |x..|.9....q!.../|
+00000050  00 ff 01 00 00 b5 00 23  00 75 00 00 00 00 00 00  |.......#.u......|
+00000060  00 00 00 00 00 00 00 00  00 00 94 6f 2d b0 ac 51  |...........o-..Q|
+00000070  ed 14 ef 68 ca 42 c5 4c  22 21 0e 9f b0 e7 07 47  |...h.B.L"!.....G|
+00000080  1d 09 01 ee 9b 67 49 2f  06 cb 51 1b d9 33 b3 ff  |.....gI/..Q..3..|
+00000090  30 6c d4 a3 d6 6b 49 aa  f8 2e 20 35 79 5a 76 91  |0l...kI... 5yZv.|
+000000a0  46 71 26 91 22 4f 32 50  49 38 16 7f 51 5c e5 47  |Fq&."O2PI8..Q\.G|
+000000b0  26 64 f4 0c dd 12 66 59  0d 8f 92 07 ab ff 68 01  |&d....fY......h.|
+000000c0  0d d5 54 06 2d 08 b1 09  a1 3c ff f9 bc 78 03 00  |..T.-....<...x..|
+000000d0  16 00 00 00 17 00 00 00  0d 00 30 00 2e 04 03 05  |..........0.....|
+000000e0  03 06 03 08 07 08 08 08  09 08 0a 08 0b 08 04 08  |................|
+000000f0  05 08 06 04 01 05 01 06  01 03 03 02 03 03 01 02  |................|
+00000100  01 03 02 02 02 04 02 05  02 06 02                 |...........|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 31 02 00 00  2d 03 03 00 00 00 00 00  |....1...-.......|
+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 44 4f 57 4e 47  52 44 01 00 00 2f 00 00  |...DOWNGRD.../..|
-00000030  05 ff 01 00 01 00 16 03  03 02 59 0b 00 02 55 00  |..........Y...U.|
-00000040  02 52 00 02 4f 30 82 02  4b 30 82 01 b4 a0 03 02  |.R..O0..K0......|
-00000050  01 02 02 09 00 e8 f0 9d  3f e2 5b ea a6 30 0d 06  |........?.[..0..|
-00000060  09 2a 86 48 86 f7 0d 01  01 0b 05 00 30 1f 31 0b  |.*.H........0.1.|
-00000070  30 09 06 03 55 04 0a 13  02 47 6f 31 10 30 0e 06  |0...U....Go1.0..|
-00000080  03 55 04 03 13 07 47 6f  20 52 6f 6f 74 30 1e 17  |.U....Go Root0..|
-00000090  0d 31 36 30 31 30 31 30  30 30 30 30 30 5a 17 0d  |.160101000000Z..|
-000000a0  32 35 30 31 30 31 30 30  30 30 30 30 5a 30 1a 31  |250101000000Z0.1|
-000000b0  0b 30 09 06 03 55 04 0a  13 02 47 6f 31 0b 30 09  |.0...U....Go1.0.|
-000000c0  06 03 55 04 03 13 02 47  6f 30 81 9f 30 0d 06 09  |..U....Go0..0...|
-000000d0  2a 86 48 86 f7 0d 01 01  01 05 00 03 81 8d 00 30  |*.H............0|
-000000e0  81 89 02 81 81 00 db 46  7d 93 2e 12 27 06 48 bc  |.......F}...'.H.|
-000000f0  06 28 21 ab 7e c4 b6 a2  5d fe 1e 52 45 88 7a 36  |.(!.~...]..RE.z6|
-00000100  47 a5 08 0d 92 42 5b c2  81 c0 be 97 79 98 40 fb  |G....B[.....y.@.|
-00000110  4f 6d 14 fd 2b 13 8b c2  a5 2e 67 d8 d4 09 9e d6  |Om..+.....g.....|
-00000120  22 38 b7 4a 0b 74 73 2b  c2 34 f1 d1 93 e5 96 d9  |"8.J.ts+.4......|
-00000130  74 7b f3 58 9f 6c 61 3c  c0 b0 41 d4 d9 2b 2b 24  |t{.X.la<..A..++$|
-00000140  23 77 5b 1c 3b bd 75 5d  ce 20 54 cf a1 63 87 1d  |#w[.;.u]. T..c..|
-00000150  1e 24 c4 f3 1d 1a 50 8b  aa b6 14 43 ed 97 a7 75  |.$....P....C...u|
-00000160  62 f4 14 c8 52 d7 02 03  01 00 01 a3 81 93 30 81  |b...R.........0.|
-00000170  90 30 0e 06 03 55 1d 0f  01 01 ff 04 04 03 02 05  |.0...U..........|
-00000180  a0 30 1d 06 03 55 1d 25  04 16 30 14 06 08 2b 06  |.0...U.%..0...+.|
-00000190  01 05 05 07 03 01 06 08  2b 06 01 05 05 07 03 02  |........+.......|
-000001a0  30 0c 06 03 55 1d 13 01  01 ff 04 02 30 00 30 19  |0...U.......0.0.|
-000001b0  06 03 55 1d 0e 04 12 04  10 9f 91 16 1f 43 43 3e  |..U..........CC>|
-000001c0  49 a6 de 6d b6 80 d7 9f  60 30 1b 06 03 55 1d 23  |I..m....`0...U.#|
-000001d0  04 14 30 12 80 10 48 13  49 4d 13 7e 16 31 bb a3  |..0...H.IM.~.1..|
-000001e0  01 d5 ac ab 6e 7b 30 19  06 03 55 1d 11 04 12 30  |....n{0...U....0|
-000001f0  10 82 0e 65 78 61 6d 70  6c 65 2e 67 6f 6c 61 6e  |...example.golan|
-00000200  67 30 0d 06 09 2a 86 48  86 f7 0d 01 01 0b 05 00  |g0...*.H........|
-00000210  03 81 81 00 9d 30 cc 40  2b 5b 50 a0 61 cb ba e5  |.....0.@+[P.a...|
-00000220  53 58 e1 ed 83 28 a9 58  1a a9 38 a4 95 a1 ac 31  |SX...(.X..8....1|
-00000230  5a 1a 84 66 3d 43 d3 2d  d9 0b f2 97 df d3 20 64  |Z..f=C.-...... d|
-00000240  38 92 24 3a 00 bc cf 9c  7d b7 40 20 01 5f aa d3  |8.$:....}.@ ._..|
-00000250  16 61 09 a2 76 fd 13 c3  cc e1 0c 5c ee b1 87 82  |.a..v......\....|
-00000260  f1 6c 04 ed 73 bb b3 43  77 8d 0c 1c f1 0f a1 d8  |.l..s..Cw.......|
-00000270  40 83 61 c9 4c 72 2b 9d  ae db 46 06 06 4d f4 c1  |@.a.Lr+...F..M..|
-00000280  b3 3e c0 d1 bd 42 d4 db  fe 3d 13 60 84 5c 21 d3  |.>...B...=.`.\!.|
-00000290  3b e9 fa e7 16 03 03 00  04 0e 00 00 00           |;............|
+00000030  09 ff 01 00 01 00 00 17  00 00 16 03 03 02 59 0b  |..............Y.|
+00000040  00 02 55 00 02 52 00 02  4f 30 82 02 4b 30 82 01  |..U..R..O0..K0..|
+00000050  b4 a0 03 02 01 02 02 09  00 e8 f0 9d 3f e2 5b ea  |............?.[.|
+00000060  a6 30 0d 06 09 2a 86 48  86 f7 0d 01 01 0b 05 00  |.0...*.H........|
+00000070  30 1f 31 0b 30 09 06 03  55 04 0a 13 02 47 6f 31  |0.1.0...U....Go1|
+00000080  10 30 0e 06 03 55 04 03  13 07 47 6f 20 52 6f 6f  |.0...U....Go Roo|
+00000090  74 30 1e 17 0d 31 36 30  31 30 31 30 30 30 30 30  |t0...16010100000|
+000000a0  30 5a 17 0d 32 35 30 31  30 31 30 30 30 30 30 30  |0Z..250101000000|
+000000b0  5a 30 1a 31 0b 30 09 06  03 55 04 0a 13 02 47 6f  |Z0.1.0...U....Go|
+000000c0  31 0b 30 09 06 03 55 04  03 13 02 47 6f 30 81 9f  |1.0...U....Go0..|
+000000d0  30 0d 06 09 2a 86 48 86  f7 0d 01 01 01 05 00 03  |0...*.H.........|
+000000e0  81 8d 00 30 81 89 02 81  81 00 db 46 7d 93 2e 12  |...0.......F}...|
+000000f0  27 06 48 bc 06 28 21 ab  7e c4 b6 a2 5d fe 1e 52  |'.H..(!.~...]..R|
+00000100  45 88 7a 36 47 a5 08 0d  92 42 5b c2 81 c0 be 97  |E.z6G....B[.....|
+00000110  79 98 40 fb 4f 6d 14 fd  2b 13 8b c2 a5 2e 67 d8  |y.@.Om..+.....g.|
+00000120  d4 09 9e d6 22 38 b7 4a  0b 74 73 2b c2 34 f1 d1  |...."8.J.ts+.4..|
+00000130  93 e5 96 d9 74 7b f3 58  9f 6c 61 3c c0 b0 41 d4  |....t{.X.la<..A.|
+00000140  d9 2b 2b 24 23 77 5b 1c  3b bd 75 5d ce 20 54 cf  |.++$#w[.;.u]. T.|
+00000150  a1 63 87 1d 1e 24 c4 f3  1d 1a 50 8b aa b6 14 43  |.c...$....P....C|
+00000160  ed 97 a7 75 62 f4 14 c8  52 d7 02 03 01 00 01 a3  |...ub...R.......|
+00000170  81 93 30 81 90 30 0e 06  03 55 1d 0f 01 01 ff 04  |..0..0...U......|
+00000180  04 03 02 05 a0 30 1d 06  03 55 1d 25 04 16 30 14  |.....0...U.%..0.|
+00000190  06 08 2b 06 01 05 05 07  03 01 06 08 2b 06 01 05  |..+.........+...|
+000001a0  05 07 03 02 30 0c 06 03  55 1d 13 01 01 ff 04 02  |....0...U.......|
+000001b0  30 00 30 19 06 03 55 1d  0e 04 12 04 10 9f 91 16  |0.0...U.........|
+000001c0  1f 43 43 3e 49 a6 de 6d  b6 80 d7 9f 60 30 1b 06  |.CC>I..m....`0..|
+000001d0  03 55 1d 23 04 14 30 12  80 10 48 13 49 4d 13 7e  |.U.#..0...H.IM.~|
+000001e0  16 31 bb a3 01 d5 ac ab  6e 7b 30 19 06 03 55 1d  |.1......n{0...U.|
+000001f0  11 04 12 30 10 82 0e 65  78 61 6d 70 6c 65 2e 67  |...0...example.g|
+00000200  6f 6c 61 6e 67 30 0d 06  09 2a 86 48 86 f7 0d 01  |olang0...*.H....|
+00000210  01 0b 05 00 03 81 81 00  9d 30 cc 40 2b 5b 50 a0  |.........0.@+[P.|
+00000220  61 cb ba e5 53 58 e1 ed  83 28 a9 58 1a a9 38 a4  |a...SX...(.X..8.|
+00000230  95 a1 ac 31 5a 1a 84 66  3d 43 d3 2d d9 0b f2 97  |...1Z..f=C.-....|
+00000240  df d3 20 64 38 92 24 3a  00 bc cf 9c 7d b7 40 20  |.. d8.$:....}.@ |
+00000250  01 5f aa d3 16 61 09 a2  76 fd 13 c3 cc e1 0c 5c  |._...a..v......\|
+00000260  ee b1 87 82 f1 6c 04 ed  73 bb b3 43 77 8d 0c 1c  |.....l..s..Cw...|
+00000270  f1 0f a1 d8 40 83 61 c9  4c 72 2b 9d ae db 46 06  |....@.a.Lr+...F.|
+00000280  06 4d f4 c1 b3 3e c0 d1  bd 42 d4 db fe 3d 13 60  |.M...>...B...=.`|
+00000290  84 5c 21 d3 3b e9 fa e7  16 03 03 00 04 0e 00 00  |.\!.;...........|
+000002a0  00                                                |.|
 >>> Flow 3 (client to server)
-00000000  16 03 03 00 86 10 00 00  82 00 80 1f e2 43 ee 88  |.............C..|
-00000010  22 0d a0 66 18 ce 8a 04  d1 00 fc 2b 6b 93 d5 b6  |"..f.......+k...|
-00000020  fd 13 48 fd ea 19 d8 5d  02 bf 8c d9 fb 64 e8 17  |..H....].....d..|
-00000030  a3 49 dc 1d 4d b7 8c eb  7d 8b 1d 13 20 78 4e 02  |.I..M...}... xN.|
-00000040  49 7e a5 bd dd 57 ac 45  47 e6 ea 2e 87 6f d2 ca  |I~...W.EG....o..|
-00000050  e6 ef a4 9e 2d 3a 02 22  2e 67 6f ff 2d 78 6c 7d  |....-:.".go.-xl}|
-00000060  33 a1 4c 5b ec d5 ae cb  4f db c0 7d 75 01 61 fa  |3.L[....O..}u.a.|
-00000070  c2 8a dc 75 77 51 60 90  5d 35 45 ca 13 bb 1a c4  |...uwQ`.]5E.....|
-00000080  eb f3 74 ef 77 ec 23 ec  98 30 3c 14 03 03 00 01  |..t.w.#..0<.....|
-00000090  01 16 03 03 00 40 7a 07  bc 74 d3 6f ef 93 22 69  |.....@z..t.o.."i|
-000000a0  a8 05 df df db 5e 58 1e  4b 84 4f 20 7c f5 2c c3  |.....^X.K.O |.,.|
-000000b0  0d 51 0a a8 d0 a8 f0 07  02 d5 ca ec f2 4b 3f ef  |.Q...........K?.|
-000000c0  c9 57 cb 9b 26 2e 62 e7  f2 84 6e ed b9 6e 1d 15  |.W..&.b...n..n..|
-000000d0  32 8c d6 b8 0d 8a                                 |2.....|
+00000000  16 03 03 00 86 10 00 00  82 00 80 c0 3f 68 b7 3f  |............?h.?|
+00000010  6c 1f de 6b 2d 67 9e 1b  13 13 ad 67 d8 0f b2 b1  |l..k-g.....g....|
+00000020  95 17 e7 0b e1 ba 6f 93  20 43 aa c7 a4 02 8e 38  |......o. C.....8|
+00000030  01 6b 53 55 33 6e 82 ea  70 d7 e2 a6 bd be 57 2d  |.kSU3n..p.....W-|
+00000040  85 1c 4a 28 30 42 34 e6  f9 38 9c 59 ed 1c fc ff  |..J(0B4..8.Y....|
+00000050  19 0f 1d 71 f1 4b 2a 7a  b1 c6 d9 11 a5 5e ca 1c  |...q.K*z.....^..|
+00000060  14 70 71 4c 3a c8 8d ca  d9 4b 57 f8 76 2c 8f 89  |.pqL:....KW.v,..|
+00000070  84 41 96 fb 37 2d 17 a9  28 c8 c6 47 1b fb 3d 42  |.A..7-..(..G..=B|
+00000080  64 12 8f c7 e7 36 35 bf  ce df d7 14 03 03 00 01  |d....65.........|
+00000090  01 16 03 03 00 40 47 f9  4a d1 3b af 27 48 8a 15  |.....@G.J.;.'H..|
+000000a0  c1 61 61 41 cc c3 4f 1d  9c 86 42 a9 17 1d e3 68  |.aaA..O...B....h|
+000000b0  84 1f ae b7 9f 4b 70 be  72 0b 2c 48 88 ea ff 43  |.....Kp.r.,H...C|
+000000c0  37 01 cc 37 c0 2d e9 da  8b 94 ef ed f9 02 95 a9  |7..7.-..........|
+000000d0  bf 63 0f 6a 7c c0                                 |.c.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 67 e1 22 17 24  |...........g.".$|
-00000020  95 b4 e5 62 59 15 56 4a  af e4 82 76 ad b7 48 81  |...bY.VJ...v..H.|
-00000030  cf 55 d1 75 cd 36 86 0d  9d 15 24 4b 84 23 bc 98  |.U.u.6....$K.#..|
-00000040  8e c4 62 57 ab 96 0c 27  5d 1c 07 17 03 03 00 40  |..bW...']......@|
+00000010  00 00 00 00 00 00 00 00  00 00 00 4a bf f1 2b 6a  |...........J..+j|
+00000020  af e5 b9 51 69 38 3e a3  47 bf 0b 67 83 15 e0 91  |...Qi8>.G..g....|
+00000030  c6 b3 cb fc 24 05 31 b7  51 3d fa bb 08 9a f9 f8  |....$.1.Q=......|
+00000040  89 2a f1 5a b1 a8 1a ed  aa 63 00 17 03 03 00 40  |.*.Z.....c.....@|
 00000050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000060  c9 b2 0e 04 40 43 26 92  91 45 e3 63 d7 49 09 3e  |....@C&..E.c.I.>|
-00000070  03 45 e3 d6 af a2 d8 d9  61 36 e5 95 83 75 66 fa  |.E......a6...uf.|
-00000080  90 c2 80 53 a2 d5 31 aa  b1 2a da 45 a9 b3 aa 1f  |...S..1..*.E....|
+00000060  80 37 dc f6 b1 a2 80 91  0e c9 71 c6 1c 1e 45 14  |.7........q...E.|
+00000070  50 cd 39 85 73 8a f5 90  75 28 05 ab 69 ae 1a bd  |P.9.s...u(..i...|
+00000080  b9 ee 39 e8 3f 2d 73 4d  21 fa 2e 05 b4 a1 02 64  |..9.?-sM!......d|
 00000090  15 03 03 00 30 00 00 00  00 00 00 00 00 00 00 00  |....0...........|
-000000a0  00 00 00 00 00 c4 52 cf  b9 f6 0f e2 30 ba 90 18  |......R.....0...|
-000000b0  0c 76 c2 ee 4c 78 fb c2  cb 34 7f cb 35 15 5e b0  |.v..Lx...4..5.^.|
-000000c0  17 70 cb 76 8a                                    |.p.v.|
+000000a0  00 00 00 00 00 14 1e f7  64 d8 47 a6 93 aa 03 aa  |........d.G.....|
+000000b0  7c f3 a2 fb b8 6f cf f2  0d e4 2d d1 d6 67 f3 6b  ||....o....-..g.k|
+000000c0  ef e3 5d dc 5b                                    |..].[|
diff --git a/src/crypto/tls/testdata/Server-TLSv12-SNI b/src/crypto/tls/testdata/Server-TLSv12-SNI
index 0ea8375..c3dc1b6 100644
--- a/src/crypto/tls/testdata/Server-TLSv12-SNI
+++ b/src/crypto/tls/testdata/Server-TLSv12-SNI
@@ -1,84 +1,83 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 99 01 00 00  95 03 03 fb d6 71 b2 32  |.............q.2|
-00000010  74 6c e1 56 19 42 e6 46  a2 0e 37 1f ad 96 4b af  |tl.V.B.F..7...K.|
-00000020  8b 4c aa 71 2a 53 d8 df  74 7d 39 00 00 04 00 2f  |.L.q*S..t}9..../|
-00000030  00 ff 01 00 00 68 00 00  00 10 00 0e 00 00 0b 73  |.....h.........s|
-00000040  6e 69 74 65 73 74 2e 63  6f 6d 00 0b 00 04 03 00  |nitest.com......|
-00000050  01 02 00 0a 00 0c 00 0a  00 1d 00 17 00 1e 00 19  |................|
-00000060  00 18 00 16 00 00 00 17  00 00 00 0d 00 30 00 2e  |.............0..|
-00000070  04 03 05 03 06 03 08 07  08 08 08 09 08 0a 08 0b  |................|
-00000080  08 04 08 05 08 06 04 01  05 01 06 01 03 03 02 03  |................|
-00000090  03 01 02 01 03 02 02 02  04 02 05 02 06 02        |..............|
+00000000  16 03 01 00 81 01 00 00  7d 03 03 cc a1 7b c4 56  |........}....{.V|
+00000010  9f 65 31 01 b0 23 09 18  10 50 7c 1e 14 7b b5 dd  |.e1..#...P|..{..|
+00000020  d4 70 07 3e 0b 19 19 31  6b f7 4d 00 00 04 00 2f  |.p.>...1k.M..../|
+00000030  00 ff 01 00 00 50 00 00  00 10 00 0e 00 00 0b 73  |.....P.........s|
+00000040  6e 69 74 65 73 74 2e 63  6f 6d 00 16 00 00 00 17  |nitest.com......|
+00000050  00 00 00 0d 00 30 00 2e  04 03 05 03 06 03 08 07  |.....0..........|
+00000060  08 08 08 09 08 0a 08 0b  08 04 08 05 08 06 04 01  |................|
+00000070  05 01 06 01 03 03 02 03  03 01 02 01 03 02 02 02  |................|
+00000080  04 02 05 02 06 02                                 |......|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 37 02 00 00  33 03 03 00 00 00 00 00  |....7...3.......|
+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 44 4f 57 4e 47  52 44 01 00 00 2f 00 00  |...DOWNGRD.../..|
-00000030  0b ff 01 00 01 00 00 0b  00 02 01 00 16 03 03 02  |................|
-00000040  59 0b 00 02 55 00 02 52  00 02 4f 30 82 02 4b 30  |Y...U..R..O0..K0|
-00000050  82 01 b4 a0 03 02 01 02  02 09 00 e8 f0 9d 3f e2  |..............?.|
-00000060  5b ea a6 30 0d 06 09 2a  86 48 86 f7 0d 01 01 0b  |[..0...*.H......|
-00000070  05 00 30 1f 31 0b 30 09  06 03 55 04 0a 13 02 47  |..0.1.0...U....G|
-00000080  6f 31 10 30 0e 06 03 55  04 03 13 07 47 6f 20 52  |o1.0...U....Go R|
-00000090  6f 6f 74 30 1e 17 0d 31  36 30 31 30 31 30 30 30  |oot0...160101000|
-000000a0  30 30 30 5a 17 0d 32 35  30 31 30 31 30 30 30 30  |000Z..2501010000|
-000000b0  30 30 5a 30 1a 31 0b 30  09 06 03 55 04 0a 13 02  |00Z0.1.0...U....|
-000000c0  47 6f 31 0b 30 09 06 03  55 04 03 13 02 47 6f 30  |Go1.0...U....Go0|
-000000d0  81 9f 30 0d 06 09 2a 86  48 86 f7 0d 01 01 01 05  |..0...*.H.......|
-000000e0  00 03 81 8d 00 30 81 89  02 81 81 00 db 46 7d 93  |.....0.......F}.|
-000000f0  2e 12 27 06 48 bc 06 28  21 ab 7e c4 b6 a2 5d fe  |..'.H..(!.~...].|
-00000100  1e 52 45 88 7a 36 47 a5  08 0d 92 42 5b c2 81 c0  |.RE.z6G....B[...|
-00000110  be 97 79 98 40 fb 4f 6d  14 fd 2b 13 8b c2 a5 2e  |..y.@.Om..+.....|
-00000120  67 d8 d4 09 9e d6 22 38  b7 4a 0b 74 73 2b c2 34  |g....."8.J.ts+.4|
-00000130  f1 d1 93 e5 96 d9 74 7b  f3 58 9f 6c 61 3c c0 b0  |......t{.X.la<..|
-00000140  41 d4 d9 2b 2b 24 23 77  5b 1c 3b bd 75 5d ce 20  |A..++$#w[.;.u]. |
-00000150  54 cf a1 63 87 1d 1e 24  c4 f3 1d 1a 50 8b aa b6  |T..c...$....P...|
-00000160  14 43 ed 97 a7 75 62 f4  14 c8 52 d7 02 03 01 00  |.C...ub...R.....|
-00000170  01 a3 81 93 30 81 90 30  0e 06 03 55 1d 0f 01 01  |....0..0...U....|
-00000180  ff 04 04 03 02 05 a0 30  1d 06 03 55 1d 25 04 16  |.......0...U.%..|
-00000190  30 14 06 08 2b 06 01 05  05 07 03 01 06 08 2b 06  |0...+.........+.|
-000001a0  01 05 05 07 03 02 30 0c  06 03 55 1d 13 01 01 ff  |......0...U.....|
-000001b0  04 02 30 00 30 19 06 03  55 1d 0e 04 12 04 10 9f  |..0.0...U.......|
-000001c0  91 16 1f 43 43 3e 49 a6  de 6d b6 80 d7 9f 60 30  |...CC>I..m....`0|
-000001d0  1b 06 03 55 1d 23 04 14  30 12 80 10 48 13 49 4d  |...U.#..0...H.IM|
-000001e0  13 7e 16 31 bb a3 01 d5  ac ab 6e 7b 30 19 06 03  |.~.1......n{0...|
-000001f0  55 1d 11 04 12 30 10 82  0e 65 78 61 6d 70 6c 65  |U....0...example|
-00000200  2e 67 6f 6c 61 6e 67 30  0d 06 09 2a 86 48 86 f7  |.golang0...*.H..|
-00000210  0d 01 01 0b 05 00 03 81  81 00 9d 30 cc 40 2b 5b  |...........0.@+[|
-00000220  50 a0 61 cb ba e5 53 58  e1 ed 83 28 a9 58 1a a9  |P.a...SX...(.X..|
-00000230  38 a4 95 a1 ac 31 5a 1a  84 66 3d 43 d3 2d d9 0b  |8....1Z..f=C.-..|
-00000240  f2 97 df d3 20 64 38 92  24 3a 00 bc cf 9c 7d b7  |.... d8.$:....}.|
-00000250  40 20 01 5f aa d3 16 61  09 a2 76 fd 13 c3 cc e1  |@ ._...a..v.....|
-00000260  0c 5c ee b1 87 82 f1 6c  04 ed 73 bb b3 43 77 8d  |.\.....l..s..Cw.|
-00000270  0c 1c f1 0f a1 d8 40 83  61 c9 4c 72 2b 9d ae db  |......@.a.Lr+...|
-00000280  46 06 06 4d f4 c1 b3 3e  c0 d1 bd 42 d4 db fe 3d  |F..M...>...B...=|
-00000290  13 60 84 5c 21 d3 3b e9  fa e7 16 03 03 00 04 0e  |.`.\!.;.........|
-000002a0  00 00 00                                          |...|
+00000030  09 ff 01 00 01 00 00 17  00 00 16 03 03 02 59 0b  |..............Y.|
+00000040  00 02 55 00 02 52 00 02  4f 30 82 02 4b 30 82 01  |..U..R..O0..K0..|
+00000050  b4 a0 03 02 01 02 02 09  00 e8 f0 9d 3f e2 5b ea  |............?.[.|
+00000060  a6 30 0d 06 09 2a 86 48  86 f7 0d 01 01 0b 05 00  |.0...*.H........|
+00000070  30 1f 31 0b 30 09 06 03  55 04 0a 13 02 47 6f 31  |0.1.0...U....Go1|
+00000080  10 30 0e 06 03 55 04 03  13 07 47 6f 20 52 6f 6f  |.0...U....Go Roo|
+00000090  74 30 1e 17 0d 31 36 30  31 30 31 30 30 30 30 30  |t0...16010100000|
+000000a0  30 5a 17 0d 32 35 30 31  30 31 30 30 30 30 30 30  |0Z..250101000000|
+000000b0  5a 30 1a 31 0b 30 09 06  03 55 04 0a 13 02 47 6f  |Z0.1.0...U....Go|
+000000c0  31 0b 30 09 06 03 55 04  03 13 02 47 6f 30 81 9f  |1.0...U....Go0..|
+000000d0  30 0d 06 09 2a 86 48 86  f7 0d 01 01 01 05 00 03  |0...*.H.........|
+000000e0  81 8d 00 30 81 89 02 81  81 00 db 46 7d 93 2e 12  |...0.......F}...|
+000000f0  27 06 48 bc 06 28 21 ab  7e c4 b6 a2 5d fe 1e 52  |'.H..(!.~...]..R|
+00000100  45 88 7a 36 47 a5 08 0d  92 42 5b c2 81 c0 be 97  |E.z6G....B[.....|
+00000110  79 98 40 fb 4f 6d 14 fd  2b 13 8b c2 a5 2e 67 d8  |y.@.Om..+.....g.|
+00000120  d4 09 9e d6 22 38 b7 4a  0b 74 73 2b c2 34 f1 d1  |...."8.J.ts+.4..|
+00000130  93 e5 96 d9 74 7b f3 58  9f 6c 61 3c c0 b0 41 d4  |....t{.X.la<..A.|
+00000140  d9 2b 2b 24 23 77 5b 1c  3b bd 75 5d ce 20 54 cf  |.++$#w[.;.u]. T.|
+00000150  a1 63 87 1d 1e 24 c4 f3  1d 1a 50 8b aa b6 14 43  |.c...$....P....C|
+00000160  ed 97 a7 75 62 f4 14 c8  52 d7 02 03 01 00 01 a3  |...ub...R.......|
+00000170  81 93 30 81 90 30 0e 06  03 55 1d 0f 01 01 ff 04  |..0..0...U......|
+00000180  04 03 02 05 a0 30 1d 06  03 55 1d 25 04 16 30 14  |.....0...U.%..0.|
+00000190  06 08 2b 06 01 05 05 07  03 01 06 08 2b 06 01 05  |..+.........+...|
+000001a0  05 07 03 02 30 0c 06 03  55 1d 13 01 01 ff 04 02  |....0...U.......|
+000001b0  30 00 30 19 06 03 55 1d  0e 04 12 04 10 9f 91 16  |0.0...U.........|
+000001c0  1f 43 43 3e 49 a6 de 6d  b6 80 d7 9f 60 30 1b 06  |.CC>I..m....`0..|
+000001d0  03 55 1d 23 04 14 30 12  80 10 48 13 49 4d 13 7e  |.U.#..0...H.IM.~|
+000001e0  16 31 bb a3 01 d5 ac ab  6e 7b 30 19 06 03 55 1d  |.1......n{0...U.|
+000001f0  11 04 12 30 10 82 0e 65  78 61 6d 70 6c 65 2e 67  |...0...example.g|
+00000200  6f 6c 61 6e 67 30 0d 06  09 2a 86 48 86 f7 0d 01  |olang0...*.H....|
+00000210  01 0b 05 00 03 81 81 00  9d 30 cc 40 2b 5b 50 a0  |.........0.@+[P.|
+00000220  61 cb ba e5 53 58 e1 ed  83 28 a9 58 1a a9 38 a4  |a...SX...(.X..8.|
+00000230  95 a1 ac 31 5a 1a 84 66  3d 43 d3 2d d9 0b f2 97  |...1Z..f=C.-....|
+00000240  df d3 20 64 38 92 24 3a  00 bc cf 9c 7d b7 40 20  |.. d8.$:....}.@ |
+00000250  01 5f aa d3 16 61 09 a2  76 fd 13 c3 cc e1 0c 5c  |._...a..v......\|
+00000260  ee b1 87 82 f1 6c 04 ed  73 bb b3 43 77 8d 0c 1c  |.....l..s..Cw...|
+00000270  f1 0f a1 d8 40 83 61 c9  4c 72 2b 9d ae db 46 06  |....@.a.Lr+...F.|
+00000280  06 4d f4 c1 b3 3e c0 d1  bd 42 d4 db fe 3d 13 60  |.M...>...B...=.`|
+00000290  84 5c 21 d3 3b e9 fa e7  16 03 03 00 04 0e 00 00  |.\!.;...........|
+000002a0  00                                                |.|
 >>> Flow 3 (client to server)
-00000000  16 03 03 00 86 10 00 00  82 00 80 a4 48 88 75 7b  |............H.u{|
-00000010  a2 04 19 14 69 30 12 d6  14 00 0c 44 e4 68 06 c6  |....i0.....D.h..|
-00000020  11 56 53 0c e5 52 fb 84  e2 6e b7 c6 eb 0d 79 25  |.VS..R...n....y%|
-00000030  19 f0 bf e4 51 73 85 d5  82 5a 07 53 b2 65 97 6a  |....Qs...Z.S.e.j|
-00000040  a1 1b 56 bb 23 35 15 83  0f 60 ee de 16 a2 ea 61  |..V.#5...`.....a|
-00000050  23 10 e1 5e cf 73 fe 5d  5a 53 16 42 0c 29 a5 ff  |#..^.s.]ZS.B.)..|
-00000060  06 e5 c4 87 11 d6 24 91  25 e5 58 81 40 80 9e 71  |......$.%.X.@..q|
-00000070  49 40 47 50 37 28 7b ed  76 cc 5a fb 04 ba 9c f8  |I@GP7({.v.Z.....|
-00000080  be ce 87 07 75 d2 30 88  09 cf bc 14 03 03 00 01  |....u.0.........|
-00000090  01 16 03 03 00 40 60 1c  31 95 7d c2 a9 9b 29 c2  |.....@`.1.}...).|
-000000a0  ef 59 58 dd fb 26 34 81  60 dc 17 19 c1 23 8d 8f  |.YX..&4.`....#..|
-000000b0  a8 d2 62 31 96 3d d2 61  b9 c8 7e bf 47 4c 04 fd  |..b1.=.a..~.GL..|
-000000c0  7c 30 05 37 8e 03 df 13  a1 4d f1 81 05 d7 4c 49  ||0.7.....M....LI|
-000000d0  88 d6 c0 21 52 e3                                 |...!R.|
+00000000  16 03 03 00 86 10 00 00  82 00 80 04 36 4c 25 96  |............6L%.|
+00000010  b0 1a 33 80 88 98 4f 2a  c8 93 24 81 0a 78 6c 85  |..3...O*..$..xl.|
+00000020  06 4d f1 cf 25 18 e0 f0  61 50 c5 45 c1 24 1b b3  |.M..%...aP.E.$..|
+00000030  d6 3c d3 49 a6 40 81 2c  bb ef 49 76 c0 10 4c ad  |.<.I.@.,..Iv..L.|
+00000040  2e 7d 4d f4 0b 96 bc 1c  eb 3d 1d 7d 18 25 34 14  |.}M......=.}.%4.|
+00000050  ed 76 f2 a1 17 aa 87 1b  ef ff 11 93 a7 44 0c 33  |.v...........D.3|
+00000060  86 27 38 3d 5d 3f bb f1  8d a9 f5 44 28 d1 28 41  |.'8=]?.....D(.(A|
+00000070  bb b7 9a fb 83 81 91 92  4e 7d 71 55 43 ed 42 12  |........N}qUC.B.|
+00000080  86 5f de 02 13 1f c4 63  08 87 db 14 03 03 00 01  |._.....c........|
+00000090  01 16 03 03 00 40 32 01  5f a2 e1 08 cf 6b ce 11  |.....@2._....k..|
+000000a0  db 82 94 c5 f1 12 9a ac  68 dc f9 c8 2c 00 a5 dd  |........h...,...|
+000000b0  6b 49 c8 8b b7 9f e3 90  27 a5 c2 45 fc 75 e5 ac  |kI......'..E.u..|
+000000c0  77 0c 80 bd 43 41 d4 00  c0 fb 8d 08 a6 f4 f7 63  |w...CA.........c|
+000000d0  07 01 09 06 e5 fc                                 |......|
 >>> 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 73 15 54 76 ad  |...........s.Tv.|
-00000020  c4 38 b0 40 45 32 a8 ca  05 19 bd ce 6e 39 77 6b  |.8.@E2......n9wk|
-00000030  46 a7 f8 45 a8 cd cd 98  8c aa cf 46 83 f0 20 93  |F..E.......F.. .|
-00000040  0d 18 99 d4 2a f9 15 4a  2b f6 bf 17 03 03 00 40  |....*..J+......@|
+00000010  00 00 00 00 00 00 00 00  00 00 00 6d 31 fe 01 3d  |...........m1..=|
+00000020  2a c3 97 67 9f 08 f8 c9  ce 57 5c 4a e6 da 17 f2  |*..g.....W\J....|
+00000030  f8 47 2b d9 9d 7e af 59  b8 a9 23 9d 7e d5 ed 77  |.G+..~.Y..#.~..w|
+00000040  3b cd d4 b7 76 5b 6f 6d  09 bd 0c 17 03 03 00 40  |;...v[om.......@|
 00000050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000060  79 8d 24 ef 72 b3 2c e2  10 a5 6d 3d 61 6c df c1  |y.$.r.,...m=al..|
-00000070  26 bf 7e b5 cd b2 8e 87  b9 54 bf ee 35 07 bc 55  |&.~......T..5..U|
-00000080  6c cd a2 d3 b4 bb 8c 63  fd ef b1 f0 2f 6d aa d9  |l......c..../m..|
+00000060  d2 8c 47 46 36 47 fa d8  f8 1c b4 fc f6 fd fb 4b  |..GF6G.........K|
+00000070  79 e1 a3 39 df ac 6c 94  61 dd 20 1a e7 c0 4c 9c  |y..9..l.a. ...L.|
+00000080  45 69 69 cf 73 cb b1 6c  fc 71 49 de 41 ca 4d 4f  |Eii.s..l.qI.A.MO|
 00000090  15 03 03 00 30 00 00 00  00 00 00 00 00 00 00 00  |....0...........|
-000000a0  00 00 00 00 00 7b f7 81  e6 5c f2 5c 9d 45 ec 1f  |.....{...\.\.E..|
-000000b0  7b 0d f8 62 19 d4 83 a8  e5 90 71 03 6e 6a 72 4b  |{..b......q.njrK|
-000000c0  7e 64 c4 c4 1a                                    |~d...|
+000000a0  00 00 00 00 00 d1 66 64  ce 59 eb 23 13 e9 92 28  |......fd.Y.#...(|
+000000b0  a4 2a 7a b0 e1 79 ce 92  34 77 6e b3 8d d3 bb e6  |.*z..y..4wn.....|
+000000c0  ad 90 e8 a2 1a                                    |.....|
diff --git a/src/crypto/tls/testdata/Server-TLSv12-SNI-GetCertificate b/src/crypto/tls/testdata/Server-TLSv12-SNI-GetCertificate
index 199253f..474ab1a 100644
--- a/src/crypto/tls/testdata/Server-TLSv12-SNI-GetCertificate
+++ b/src/crypto/tls/testdata/Server-TLSv12-SNI-GetCertificate
@@ -1,84 +1,83 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 99 01 00 00  95 03 03 cf 09 e7 0d ce  |................|
-00000010  ce d4 72 66 9d 30 e8 ee  39 b3 95 4c 3b 59 25 66  |..rf.0..9..L;Y%f|
-00000020  d2 f5 d3 82 68 7d e7 26  2e 38 97 00 00 04 00 2f  |....h}.&.8...../|
-00000030  00 ff 01 00 00 68 00 00  00 10 00 0e 00 00 0b 73  |.....h.........s|
-00000040  6e 69 74 65 73 74 2e 63  6f 6d 00 0b 00 04 03 00  |nitest.com......|
-00000050  01 02 00 0a 00 0c 00 0a  00 1d 00 17 00 1e 00 19  |................|
-00000060  00 18 00 16 00 00 00 17  00 00 00 0d 00 30 00 2e  |.............0..|
-00000070  04 03 05 03 06 03 08 07  08 08 08 09 08 0a 08 0b  |................|
-00000080  08 04 08 05 08 06 04 01  05 01 06 01 03 03 02 03  |................|
-00000090  03 01 02 01 03 02 02 02  04 02 05 02 06 02        |..............|
+00000000  16 03 01 00 81 01 00 00  7d 03 03 02 34 82 a7 1a  |........}...4...|
+00000010  fe 81 b0 1c 2e df cc 04  2d f7 22 39 34 95 c7 c1  |........-."94...|
+00000020  b2 92 a2 d2 aa ca 57 0f  9c be b4 00 00 04 00 2f  |......W......../|
+00000030  00 ff 01 00 00 50 00 00  00 10 00 0e 00 00 0b 73  |.....P.........s|
+00000040  6e 69 74 65 73 74 2e 63  6f 6d 00 16 00 00 00 17  |nitest.com......|
+00000050  00 00 00 0d 00 30 00 2e  04 03 05 03 06 03 08 07  |.....0..........|
+00000060  08 08 08 09 08 0a 08 0b  08 04 08 05 08 06 04 01  |................|
+00000070  05 01 06 01 03 03 02 03  03 01 02 01 03 02 02 02  |................|
+00000080  04 02 05 02 06 02                                 |......|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 37 02 00 00  33 03 03 00 00 00 00 00  |....7...3.......|
+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 44 4f 57 4e 47  52 44 01 00 00 2f 00 00  |...DOWNGRD.../..|
-00000030  0b ff 01 00 01 00 00 0b  00 02 01 00 16 03 03 02  |................|
-00000040  59 0b 00 02 55 00 02 52  00 02 4f 30 82 02 4b 30  |Y...U..R..O0..K0|
-00000050  82 01 b4 a0 03 02 01 02  02 09 00 e8 f0 9d 3f e2  |..............?.|
-00000060  5b ea a6 30 0d 06 09 2a  86 48 86 f7 0d 01 01 0b  |[..0...*.H......|
-00000070  05 00 30 1f 31 0b 30 09  06 03 55 04 0a 13 02 47  |..0.1.0...U....G|
-00000080  6f 31 10 30 0e 06 03 55  04 03 13 07 47 6f 20 52  |o1.0...U....Go R|
-00000090  6f 6f 74 30 1e 17 0d 31  36 30 31 30 31 30 30 30  |oot0...160101000|
-000000a0  30 30 30 5a 17 0d 32 35  30 31 30 31 30 30 30 30  |000Z..2501010000|
-000000b0  30 30 5a 30 1a 31 0b 30  09 06 03 55 04 0a 13 02  |00Z0.1.0...U....|
-000000c0  47 6f 31 0b 30 09 06 03  55 04 03 13 02 47 6f 30  |Go1.0...U....Go0|
-000000d0  81 9f 30 0d 06 09 2a 86  48 86 f7 0d 01 01 01 05  |..0...*.H.......|
-000000e0  00 03 81 8d 00 30 81 89  02 81 81 00 db 46 7d 93  |.....0.......F}.|
-000000f0  2e 12 27 06 48 bc 06 28  21 ab 7e c4 b6 a2 5d fe  |..'.H..(!.~...].|
-00000100  1e 52 45 88 7a 36 47 a5  08 0d 92 42 5b c2 81 c0  |.RE.z6G....B[...|
-00000110  be 97 79 98 40 fb 4f 6d  14 fd 2b 13 8b c2 a5 2e  |..y.@.Om..+.....|
-00000120  67 d8 d4 09 9e d6 22 38  b7 4a 0b 74 73 2b c2 34  |g....."8.J.ts+.4|
-00000130  f1 d1 93 e5 96 d9 74 7b  f3 58 9f 6c 61 3c c0 b0  |......t{.X.la<..|
-00000140  41 d4 d9 2b 2b 24 23 77  5b 1c 3b bd 75 5d ce 20  |A..++$#w[.;.u]. |
-00000150  54 cf a1 63 87 1d 1e 24  c4 f3 1d 1a 50 8b aa b6  |T..c...$....P...|
-00000160  14 43 ed 97 a7 75 62 f4  14 c8 52 d7 02 03 01 00  |.C...ub...R.....|
-00000170  01 a3 81 93 30 81 90 30  0e 06 03 55 1d 0f 01 01  |....0..0...U....|
-00000180  ff 04 04 03 02 05 a0 30  1d 06 03 55 1d 25 04 16  |.......0...U.%..|
-00000190  30 14 06 08 2b 06 01 05  05 07 03 01 06 08 2b 06  |0...+.........+.|
-000001a0  01 05 05 07 03 02 30 0c  06 03 55 1d 13 01 01 ff  |......0...U.....|
-000001b0  04 02 30 00 30 19 06 03  55 1d 0e 04 12 04 10 9f  |..0.0...U.......|
-000001c0  91 16 1f 43 43 3e 49 a6  de 6d b6 80 d7 9f 60 30  |...CC>I..m....`0|
-000001d0  1b 06 03 55 1d 23 04 14  30 12 80 10 48 13 49 4d  |...U.#..0...H.IM|
-000001e0  13 7e 16 31 bb a3 01 d5  ac ab 6e 7b 30 19 06 03  |.~.1......n{0...|
-000001f0  55 1d 11 04 12 30 10 82  0e 65 78 61 6d 70 6c 65  |U....0...example|
-00000200  2e 67 6f 6c 61 6e 67 30  0d 06 09 2a 86 48 86 f7  |.golang0...*.H..|
-00000210  0d 01 01 0b 05 00 03 81  81 00 9d 30 cc 40 2b 5b  |...........0.@+[|
-00000220  50 a0 61 cb ba e5 53 58  e1 ed 83 28 a9 58 1a a9  |P.a...SX...(.X..|
-00000230  38 a4 95 a1 ac 31 5a 1a  84 66 3d 43 d3 2d d9 0b  |8....1Z..f=C.-..|
-00000240  f2 97 df d3 20 64 38 92  24 3a 00 bc cf 9c 7d b7  |.... d8.$:....}.|
-00000250  40 20 01 5f aa d3 16 61  09 a2 76 fd 13 c3 cc e1  |@ ._...a..v.....|
-00000260  0c 5c ee b1 87 82 f1 6c  04 ed 73 bb b3 43 77 8d  |.\.....l..s..Cw.|
-00000270  0c 1c f1 0f a1 d8 40 83  61 c9 4c 72 2b 9d ae db  |......@.a.Lr+...|
-00000280  46 06 06 4d f4 c1 b3 3e  c0 d1 bd 42 d4 db fe 3d  |F..M...>...B...=|
-00000290  13 60 84 5c 21 d3 3b e9  fa e7 16 03 03 00 04 0e  |.`.\!.;.........|
-000002a0  00 00 00                                          |...|
+00000030  09 ff 01 00 01 00 00 17  00 00 16 03 03 02 59 0b  |..............Y.|
+00000040  00 02 55 00 02 52 00 02  4f 30 82 02 4b 30 82 01  |..U..R..O0..K0..|
+00000050  b4 a0 03 02 01 02 02 09  00 e8 f0 9d 3f e2 5b ea  |............?.[.|
+00000060  a6 30 0d 06 09 2a 86 48  86 f7 0d 01 01 0b 05 00  |.0...*.H........|
+00000070  30 1f 31 0b 30 09 06 03  55 04 0a 13 02 47 6f 31  |0.1.0...U....Go1|
+00000080  10 30 0e 06 03 55 04 03  13 07 47 6f 20 52 6f 6f  |.0...U....Go Roo|
+00000090  74 30 1e 17 0d 31 36 30  31 30 31 30 30 30 30 30  |t0...16010100000|
+000000a0  30 5a 17 0d 32 35 30 31  30 31 30 30 30 30 30 30  |0Z..250101000000|
+000000b0  5a 30 1a 31 0b 30 09 06  03 55 04 0a 13 02 47 6f  |Z0.1.0...U....Go|
+000000c0  31 0b 30 09 06 03 55 04  03 13 02 47 6f 30 81 9f  |1.0...U....Go0..|
+000000d0  30 0d 06 09 2a 86 48 86  f7 0d 01 01 01 05 00 03  |0...*.H.........|
+000000e0  81 8d 00 30 81 89 02 81  81 00 db 46 7d 93 2e 12  |...0.......F}...|
+000000f0  27 06 48 bc 06 28 21 ab  7e c4 b6 a2 5d fe 1e 52  |'.H..(!.~...]..R|
+00000100  45 88 7a 36 47 a5 08 0d  92 42 5b c2 81 c0 be 97  |E.z6G....B[.....|
+00000110  79 98 40 fb 4f 6d 14 fd  2b 13 8b c2 a5 2e 67 d8  |y.@.Om..+.....g.|
+00000120  d4 09 9e d6 22 38 b7 4a  0b 74 73 2b c2 34 f1 d1  |...."8.J.ts+.4..|
+00000130  93 e5 96 d9 74 7b f3 58  9f 6c 61 3c c0 b0 41 d4  |....t{.X.la<..A.|
+00000140  d9 2b 2b 24 23 77 5b 1c  3b bd 75 5d ce 20 54 cf  |.++$#w[.;.u]. T.|
+00000150  a1 63 87 1d 1e 24 c4 f3  1d 1a 50 8b aa b6 14 43  |.c...$....P....C|
+00000160  ed 97 a7 75 62 f4 14 c8  52 d7 02 03 01 00 01 a3  |...ub...R.......|
+00000170  81 93 30 81 90 30 0e 06  03 55 1d 0f 01 01 ff 04  |..0..0...U......|
+00000180  04 03 02 05 a0 30 1d 06  03 55 1d 25 04 16 30 14  |.....0...U.%..0.|
+00000190  06 08 2b 06 01 05 05 07  03 01 06 08 2b 06 01 05  |..+.........+...|
+000001a0  05 07 03 02 30 0c 06 03  55 1d 13 01 01 ff 04 02  |....0...U.......|
+000001b0  30 00 30 19 06 03 55 1d  0e 04 12 04 10 9f 91 16  |0.0...U.........|
+000001c0  1f 43 43 3e 49 a6 de 6d  b6 80 d7 9f 60 30 1b 06  |.CC>I..m....`0..|
+000001d0  03 55 1d 23 04 14 30 12  80 10 48 13 49 4d 13 7e  |.U.#..0...H.IM.~|
+000001e0  16 31 bb a3 01 d5 ac ab  6e 7b 30 19 06 03 55 1d  |.1......n{0...U.|
+000001f0  11 04 12 30 10 82 0e 65  78 61 6d 70 6c 65 2e 67  |...0...example.g|
+00000200  6f 6c 61 6e 67 30 0d 06  09 2a 86 48 86 f7 0d 01  |olang0...*.H....|
+00000210  01 0b 05 00 03 81 81 00  9d 30 cc 40 2b 5b 50 a0  |.........0.@+[P.|
+00000220  61 cb ba e5 53 58 e1 ed  83 28 a9 58 1a a9 38 a4  |a...SX...(.X..8.|
+00000230  95 a1 ac 31 5a 1a 84 66  3d 43 d3 2d d9 0b f2 97  |...1Z..f=C.-....|
+00000240  df d3 20 64 38 92 24 3a  00 bc cf 9c 7d b7 40 20  |.. d8.$:....}.@ |
+00000250  01 5f aa d3 16 61 09 a2  76 fd 13 c3 cc e1 0c 5c  |._...a..v......\|
+00000260  ee b1 87 82 f1 6c 04 ed  73 bb b3 43 77 8d 0c 1c  |.....l..s..Cw...|
+00000270  f1 0f a1 d8 40 83 61 c9  4c 72 2b 9d ae db 46 06  |....@.a.Lr+...F.|
+00000280  06 4d f4 c1 b3 3e c0 d1  bd 42 d4 db fe 3d 13 60  |.M...>...B...=.`|
+00000290  84 5c 21 d3 3b e9 fa e7  16 03 03 00 04 0e 00 00  |.\!.;...........|
+000002a0  00                                                |.|
 >>> Flow 3 (client to server)
-00000000  16 03 03 00 86 10 00 00  82 00 80 04 57 b2 56 f0  |............W.V.|
-00000010  a5 fb c3 4d 4e 7d ba 29  18 04 ea 6e 66 d3 97 68  |...MN}.)...nf..h|
-00000020  58 4e c1 47 fe 30 42 4d  bf 5b 10 38 6a 01 83 98  |XN.G.0BM.[.8j...|
-00000030  2b e3 3a ac c8 67 e5 41  0c 5c 3f 88 d5 15 a2 ab  |+.:..g.A.\?.....|
-00000040  6a 2b 70 24 d8 40 78 c1  d9 58 78 04 4d 90 03 eb  |j+p$.@x..Xx.M...|
-00000050  3c b1 61 da 26 62 db b3  41 ab dc 94 22 44 66 b8  |<.a.&b..A..."Df.|
-00000060  49 2c fa 59 de c0 69 3c  20 f8 2f a5 e0 47 1d ec  |I,.Y..i< ./..G..|
-00000070  3c 49 2d 39 f6 41 09 06  79 5f 26 c4 12 3d 9c 8d  |<I-9.A..y_&..=..|
-00000080  16 7b 45 25 65 01 69 9c  a8 f7 90 14 03 03 00 01  |.{E%e.i.........|
-00000090  01 16 03 03 00 40 96 71  33 e6 7e 26 2c 52 9b a5  |.....@.q3.~&,R..|
-000000a0  b3 d2 4e a3 6a 8f 9f 2a  ec c6 23 51 6c 92 5d dd  |..N.j..*..#Ql.].|
-000000b0  6e dd f2 5f 28 5e 8d e4  1f 80 35 16 84 59 0f 36  |n.._(^....5..Y.6|
-000000c0  ce a4 36 16 18 09 a8 30  8b 73 f6 22 0a 8f 22 28  |..6....0.s.".."(|
-000000d0  00 62 d2 8e 19 82                                 |.b....|
+00000000  16 03 03 00 86 10 00 00  82 00 80 d9 90 3c 11 be  |.............<..|
+00000010  f3 48 de f0 8f 9e 12 ca  e0 ab 86 e0 7e e7 8b ea  |.H..........~...|
+00000020  1a 76 3e 65 8d 7a d6 1c  72 2a f7 1e aa 0a 12 8f  |.v>e.z..r*......|
+00000030  54 ac 33 95 9d 00 a9 a6  94 54 7b 6a d9 e3 f4 67  |T.3......T{j...g|
+00000040  a6 d3 b1 c1 5d 86 51 aa  63 67 6b 6e cb 3b 5e 59  |....].Q.cgkn.;^Y|
+00000050  02 c2 57 fd 37 39 1b 73  9a 61 b0 78 de e8 cc f8  |..W.79.s.a.x....|
+00000060  b3 01 11 e5 e9 31 85 4d  fe 60 d4 12 70 71 64 45  |.....1.M.`..pqdE|
+00000070  e8 7d fb be 5b 82 c0 c4  e1 57 09 2c f2 d7 a3 79  |.}..[....W.,...y|
+00000080  1c 40 08 e1 e6 cd e2 3e  e7 55 da 14 03 03 00 01  |.@.....>.U......|
+00000090  01 16 03 03 00 40 29 9e  b7 cf 5e 7c e9 40 91 5f  |.....@)...^|.@._|
+000000a0  b6 12 d4 42 ec 6a bc 03  d9 fa e4 d8 bf c7 2c c5  |...B.j........,.|
+000000b0  52 74 17 77 b1 aa 13 87  f0 81 da 0d ca 7f d9 ca  |Rt.w............|
+000000c0  18 46 55 62 3f 90 21 60  fa 85 8c 80 6b 23 45 e7  |.FUb?.!`....k#E.|
+000000d0  0b 6e 8c e2 c3 f6                                 |.n....|
 >>> 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 5e ea d1 03 d7  |...........^....|
-00000020  de 82 9a b4 07 52 46 16  fd 28 86 fe 17 2e 77 52  |.....RF..(....wR|
-00000030  67 8f ec 64 93 1e 8e c9  fc fb 69 61 47 78 1a 1b  |g..d......iaGx..|
-00000040  97 8d fc 56 76 f6 53 8b  62 53 4f 17 03 03 00 40  |...Vv.S.bSO....@|
+00000010  00 00 00 00 00 00 00 00  00 00 00 ee 8d 0f cd 15  |................|
+00000020  db b4 cd 25 27 b6 7e 9b  82 91 2f 01 e1 4f f9 0c  |...%'.~.../..O..|
+00000030  68 4c bf 26 2b 4b 49 f5  0a 67 8a 4f 12 35 37 75  |hL.&+KI..g.O.57u|
+00000040  16 fe cc 26 35 66 60 8c  ed 42 40 17 03 03 00 40  |...&5f`..B@....@|
 00000050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000060  f8 17 e8 ba c4 fb 0b 76  f5 a8 2d 3c 48 44 73 da  |.......v..-<HDs.|
-00000070  dc 34 5d fe e4 23 85 28  38 df 1d fe c6 a6 32 35  |.4]..#.(8.....25|
-00000080  c6 bb 71 4a 6e ec e7 c4  4f e6 28 2b fc 06 5e ac  |..qJn...O.(+..^.|
+00000060  f5 7a ee 53 aa 85 bb 81  c4 57 68 12 f1 40 4c 20  |.z.S.....Wh..@L |
+00000070  2a ff fc 6c dd 73 65 fc  41 e6 5b 96 6b 35 2f 8a  |*..l.se.A.[.k5/.|
+00000080  62 49 4a da f4 df 93 a0  ab e1 12 4d 8d 34 2c 6a  |bIJ........M.4,j|
 00000090  15 03 03 00 30 00 00 00  00 00 00 00 00 00 00 00  |....0...........|
-000000a0  00 00 00 00 00 b0 5a ef  20 24 de e4 16 ad 7e 54  |......Z. $....~T|
-000000b0  43 d1 22 a8 fb a6 a4 98  54 74 58 2d 5c af 34 24  |C.".....TtX-\.4$|
-000000c0  89 d1 ab 32 8b                                    |...2.|
+000000a0  00 00 00 00 00 1c 08 e5  52 29 79 d6 15 07 10 44  |........R)y....D|
+000000b0  95 07 07 cb 3b 2b 37 2f  e3 dc 17 f9 27 b6 5d 44  |....;+7/....'.]D|
+000000c0  d0 30 4b 2e 21                                    |.0K.!|
diff --git a/src/crypto/tls/testdata/Server-TLSv12-SNI-GetCertificateNotFound b/src/crypto/tls/testdata/Server-TLSv12-SNI-GetCertificateNotFound
index 870e8fa..0c06ce9 100644
--- a/src/crypto/tls/testdata/Server-TLSv12-SNI-GetCertificateNotFound
+++ b/src/crypto/tls/testdata/Server-TLSv12-SNI-GetCertificateNotFound
@@ -1,84 +1,83 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 99 01 00 00  95 03 03 34 7d 89 eb 2a  |...........4}..*|
-00000010  19 64 32 17 5d 37 0e dd  51 2c 7e 08 56 47 f3 2c  |.d2.]7..Q,~.VG.,|
-00000020  ca d0 08 51 86 a6 a3 10  85 5a 41 00 00 04 00 2f  |...Q.....ZA..../|
-00000030  00 ff 01 00 00 68 00 00  00 10 00 0e 00 00 0b 73  |.....h.........s|
-00000040  6e 69 74 65 73 74 2e 63  6f 6d 00 0b 00 04 03 00  |nitest.com......|
-00000050  01 02 00 0a 00 0c 00 0a  00 1d 00 17 00 1e 00 19  |................|
-00000060  00 18 00 16 00 00 00 17  00 00 00 0d 00 30 00 2e  |.............0..|
-00000070  04 03 05 03 06 03 08 07  08 08 08 09 08 0a 08 0b  |................|
-00000080  08 04 08 05 08 06 04 01  05 01 06 01 03 03 02 03  |................|
-00000090  03 01 02 01 03 02 02 02  04 02 05 02 06 02        |..............|
+00000000  16 03 01 00 81 01 00 00  7d 03 03 77 e7 c3 97 fa  |........}..w....|
+00000010  59 80 de d1 f5 9f ce e5  a5 38 60 2c 30 b2 64 5b  |Y........8`,0.d[|
+00000020  6c 0a 56 49 1d 6f 19 57  5a ac 05 00 00 04 00 2f  |l.VI.o.WZ....../|
+00000030  00 ff 01 00 00 50 00 00  00 10 00 0e 00 00 0b 73  |.....P.........s|
+00000040  6e 69 74 65 73 74 2e 63  6f 6d 00 16 00 00 00 17  |nitest.com......|
+00000050  00 00 00 0d 00 30 00 2e  04 03 05 03 06 03 08 07  |.....0..........|
+00000060  08 08 08 09 08 0a 08 0b  08 04 08 05 08 06 04 01  |................|
+00000070  05 01 06 01 03 03 02 03  03 01 02 01 03 02 02 02  |................|
+00000080  04 02 05 02 06 02                                 |......|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 37 02 00 00  33 03 03 00 00 00 00 00  |....7...3.......|
+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 44 4f 57 4e 47  52 44 01 00 00 2f 00 00  |...DOWNGRD.../..|
-00000030  0b ff 01 00 01 00 00 0b  00 02 01 00 16 03 03 02  |................|
-00000040  59 0b 00 02 55 00 02 52  00 02 4f 30 82 02 4b 30  |Y...U..R..O0..K0|
-00000050  82 01 b4 a0 03 02 01 02  02 09 00 e8 f0 9d 3f e2  |..............?.|
-00000060  5b ea a6 30 0d 06 09 2a  86 48 86 f7 0d 01 01 0b  |[..0...*.H......|
-00000070  05 00 30 1f 31 0b 30 09  06 03 55 04 0a 13 02 47  |..0.1.0...U....G|
-00000080  6f 31 10 30 0e 06 03 55  04 03 13 07 47 6f 20 52  |o1.0...U....Go R|
-00000090  6f 6f 74 30 1e 17 0d 31  36 30 31 30 31 30 30 30  |oot0...160101000|
-000000a0  30 30 30 5a 17 0d 32 35  30 31 30 31 30 30 30 30  |000Z..2501010000|
-000000b0  30 30 5a 30 1a 31 0b 30  09 06 03 55 04 0a 13 02  |00Z0.1.0...U....|
-000000c0  47 6f 31 0b 30 09 06 03  55 04 03 13 02 47 6f 30  |Go1.0...U....Go0|
-000000d0  81 9f 30 0d 06 09 2a 86  48 86 f7 0d 01 01 01 05  |..0...*.H.......|
-000000e0  00 03 81 8d 00 30 81 89  02 81 81 00 db 46 7d 93  |.....0.......F}.|
-000000f0  2e 12 27 06 48 bc 06 28  21 ab 7e c4 b6 a2 5d fe  |..'.H..(!.~...].|
-00000100  1e 52 45 88 7a 36 47 a5  08 0d 92 42 5b c2 81 c0  |.RE.z6G....B[...|
-00000110  be 97 79 98 40 fb 4f 6d  14 fd 2b 13 8b c2 a5 2e  |..y.@.Om..+.....|
-00000120  67 d8 d4 09 9e d6 22 38  b7 4a 0b 74 73 2b c2 34  |g....."8.J.ts+.4|
-00000130  f1 d1 93 e5 96 d9 74 7b  f3 58 9f 6c 61 3c c0 b0  |......t{.X.la<..|
-00000140  41 d4 d9 2b 2b 24 23 77  5b 1c 3b bd 75 5d ce 20  |A..++$#w[.;.u]. |
-00000150  54 cf a1 63 87 1d 1e 24  c4 f3 1d 1a 50 8b aa b6  |T..c...$....P...|
-00000160  14 43 ed 97 a7 75 62 f4  14 c8 52 d7 02 03 01 00  |.C...ub...R.....|
-00000170  01 a3 81 93 30 81 90 30  0e 06 03 55 1d 0f 01 01  |....0..0...U....|
-00000180  ff 04 04 03 02 05 a0 30  1d 06 03 55 1d 25 04 16  |.......0...U.%..|
-00000190  30 14 06 08 2b 06 01 05  05 07 03 01 06 08 2b 06  |0...+.........+.|
-000001a0  01 05 05 07 03 02 30 0c  06 03 55 1d 13 01 01 ff  |......0...U.....|
-000001b0  04 02 30 00 30 19 06 03  55 1d 0e 04 12 04 10 9f  |..0.0...U.......|
-000001c0  91 16 1f 43 43 3e 49 a6  de 6d b6 80 d7 9f 60 30  |...CC>I..m....`0|
-000001d0  1b 06 03 55 1d 23 04 14  30 12 80 10 48 13 49 4d  |...U.#..0...H.IM|
-000001e0  13 7e 16 31 bb a3 01 d5  ac ab 6e 7b 30 19 06 03  |.~.1......n{0...|
-000001f0  55 1d 11 04 12 30 10 82  0e 65 78 61 6d 70 6c 65  |U....0...example|
-00000200  2e 67 6f 6c 61 6e 67 30  0d 06 09 2a 86 48 86 f7  |.golang0...*.H..|
-00000210  0d 01 01 0b 05 00 03 81  81 00 9d 30 cc 40 2b 5b  |...........0.@+[|
-00000220  50 a0 61 cb ba e5 53 58  e1 ed 83 28 a9 58 1a a9  |P.a...SX...(.X..|
-00000230  38 a4 95 a1 ac 31 5a 1a  84 66 3d 43 d3 2d d9 0b  |8....1Z..f=C.-..|
-00000240  f2 97 df d3 20 64 38 92  24 3a 00 bc cf 9c 7d b7  |.... d8.$:....}.|
-00000250  40 20 01 5f aa d3 16 61  09 a2 76 fd 13 c3 cc e1  |@ ._...a..v.....|
-00000260  0c 5c ee b1 87 82 f1 6c  04 ed 73 bb b3 43 77 8d  |.\.....l..s..Cw.|
-00000270  0c 1c f1 0f a1 d8 40 83  61 c9 4c 72 2b 9d ae db  |......@.a.Lr+...|
-00000280  46 06 06 4d f4 c1 b3 3e  c0 d1 bd 42 d4 db fe 3d  |F..M...>...B...=|
-00000290  13 60 84 5c 21 d3 3b e9  fa e7 16 03 03 00 04 0e  |.`.\!.;.........|
-000002a0  00 00 00                                          |...|
+00000030  09 ff 01 00 01 00 00 17  00 00 16 03 03 02 59 0b  |..............Y.|
+00000040  00 02 55 00 02 52 00 02  4f 30 82 02 4b 30 82 01  |..U..R..O0..K0..|
+00000050  b4 a0 03 02 01 02 02 09  00 e8 f0 9d 3f e2 5b ea  |............?.[.|
+00000060  a6 30 0d 06 09 2a 86 48  86 f7 0d 01 01 0b 05 00  |.0...*.H........|
+00000070  30 1f 31 0b 30 09 06 03  55 04 0a 13 02 47 6f 31  |0.1.0...U....Go1|
+00000080  10 30 0e 06 03 55 04 03  13 07 47 6f 20 52 6f 6f  |.0...U....Go Roo|
+00000090  74 30 1e 17 0d 31 36 30  31 30 31 30 30 30 30 30  |t0...16010100000|
+000000a0  30 5a 17 0d 32 35 30 31  30 31 30 30 30 30 30 30  |0Z..250101000000|
+000000b0  5a 30 1a 31 0b 30 09 06  03 55 04 0a 13 02 47 6f  |Z0.1.0...U....Go|
+000000c0  31 0b 30 09 06 03 55 04  03 13 02 47 6f 30 81 9f  |1.0...U....Go0..|
+000000d0  30 0d 06 09 2a 86 48 86  f7 0d 01 01 01 05 00 03  |0...*.H.........|
+000000e0  81 8d 00 30 81 89 02 81  81 00 db 46 7d 93 2e 12  |...0.......F}...|
+000000f0  27 06 48 bc 06 28 21 ab  7e c4 b6 a2 5d fe 1e 52  |'.H..(!.~...]..R|
+00000100  45 88 7a 36 47 a5 08 0d  92 42 5b c2 81 c0 be 97  |E.z6G....B[.....|
+00000110  79 98 40 fb 4f 6d 14 fd  2b 13 8b c2 a5 2e 67 d8  |y.@.Om..+.....g.|
+00000120  d4 09 9e d6 22 38 b7 4a  0b 74 73 2b c2 34 f1 d1  |...."8.J.ts+.4..|
+00000130  93 e5 96 d9 74 7b f3 58  9f 6c 61 3c c0 b0 41 d4  |....t{.X.la<..A.|
+00000140  d9 2b 2b 24 23 77 5b 1c  3b bd 75 5d ce 20 54 cf  |.++$#w[.;.u]. T.|
+00000150  a1 63 87 1d 1e 24 c4 f3  1d 1a 50 8b aa b6 14 43  |.c...$....P....C|
+00000160  ed 97 a7 75 62 f4 14 c8  52 d7 02 03 01 00 01 a3  |...ub...R.......|
+00000170  81 93 30 81 90 30 0e 06  03 55 1d 0f 01 01 ff 04  |..0..0...U......|
+00000180  04 03 02 05 a0 30 1d 06  03 55 1d 25 04 16 30 14  |.....0...U.%..0.|
+00000190  06 08 2b 06 01 05 05 07  03 01 06 08 2b 06 01 05  |..+.........+...|
+000001a0  05 07 03 02 30 0c 06 03  55 1d 13 01 01 ff 04 02  |....0...U.......|
+000001b0  30 00 30 19 06 03 55 1d  0e 04 12 04 10 9f 91 16  |0.0...U.........|
+000001c0  1f 43 43 3e 49 a6 de 6d  b6 80 d7 9f 60 30 1b 06  |.CC>I..m....`0..|
+000001d0  03 55 1d 23 04 14 30 12  80 10 48 13 49 4d 13 7e  |.U.#..0...H.IM.~|
+000001e0  16 31 bb a3 01 d5 ac ab  6e 7b 30 19 06 03 55 1d  |.1......n{0...U.|
+000001f0  11 04 12 30 10 82 0e 65  78 61 6d 70 6c 65 2e 67  |...0...example.g|
+00000200  6f 6c 61 6e 67 30 0d 06  09 2a 86 48 86 f7 0d 01  |olang0...*.H....|
+00000210  01 0b 05 00 03 81 81 00  9d 30 cc 40 2b 5b 50 a0  |.........0.@+[P.|
+00000220  61 cb ba e5 53 58 e1 ed  83 28 a9 58 1a a9 38 a4  |a...SX...(.X..8.|
+00000230  95 a1 ac 31 5a 1a 84 66  3d 43 d3 2d d9 0b f2 97  |...1Z..f=C.-....|
+00000240  df d3 20 64 38 92 24 3a  00 bc cf 9c 7d b7 40 20  |.. d8.$:....}.@ |
+00000250  01 5f aa d3 16 61 09 a2  76 fd 13 c3 cc e1 0c 5c  |._...a..v......\|
+00000260  ee b1 87 82 f1 6c 04 ed  73 bb b3 43 77 8d 0c 1c  |.....l..s..Cw...|
+00000270  f1 0f a1 d8 40 83 61 c9  4c 72 2b 9d ae db 46 06  |....@.a.Lr+...F.|
+00000280  06 4d f4 c1 b3 3e c0 d1  bd 42 d4 db fe 3d 13 60  |.M...>...B...=.`|
+00000290  84 5c 21 d3 3b e9 fa e7  16 03 03 00 04 0e 00 00  |.\!.;...........|
+000002a0  00                                                |.|
 >>> Flow 3 (client to server)
-00000000  16 03 03 00 86 10 00 00  82 00 80 38 86 92 3e 9a  |...........8..>.|
-00000010  54 2d 44 46 76 d1 7c 07  04 83 2f 19 6d 89 c6 95  |T-DFv.|.../.m...|
-00000020  07 63 17 7d ac e5 f7 95  7f f7 f2 3a f6 eb 38 26  |.c.}.......:..8&|
-00000030  e5 c9 32 b1 27 88 46 85  f8 f6 eb 27 a8 9e de 5b  |..2.'.F....'...[|
-00000040  92 f7 3f 03 be 73 f0 de  2e b4 44 a8 89 4a 5a 6f  |..?..s....D..JZo|
-00000050  dc e7 16 9c dc f7 9f ca  40 9e 34 4b c2 45 58 7a  |........@.4K.EXz|
-00000060  6d 5c 4c 58 6a 45 10 21  fb b5 2a 58 17 7d d9 c4  |m\LXjE.!..*X.}..|
-00000070  c9 7d d1 3b df 39 1b 59  6a 49 18 e1 fd 02 a2 1d  |.}.;.9.YjI......|
-00000080  5a 2d 3d c5 ab e7 f6 60  0d aa 38 14 03 03 00 01  |Z-=....`..8.....|
-00000090  01 16 03 03 00 40 0e 2a  fd e7 cd d0 72 ce 06 5c  |.....@.*....r..\|
-000000a0  40 c1 81 ef eb 27 e9 77  a8 d4 cc 5c 1e 15 7c 62  |@....'.w...\..|b|
-000000b0  87 bd c5 8e b4 e6 6a 3f  be 37 9d c0 fe f7 65 8b  |......j?.7....e.|
-000000c0  b1 3a b8 b4 76 67 ca 58  1c f5 3f f1 10 7c 5b 57  |.:..vg.X..?..|[W|
-000000d0  90 e6 43 de d6 25                                 |..C..%|
+00000000  16 03 03 00 86 10 00 00  82 00 80 67 0c a0 f8 da  |...........g....|
+00000010  2e d9 9e 9d ef c8 9b 77  f5 fe 25 32 74 49 1d a7  |.......w..%2tI..|
+00000020  7d 69 37 2a 94 07 5a 15  e8 f1 1d 36 25 ae 32 e4  |}i7*..Z....6%.2.|
+00000030  9c f5 35 fb 54 81 f2 19  4f 8d 6b 64 1a b2 a2 2e  |..5.T...O.kd....|
+00000040  c4 cb 5b 73 9d 46 97 01  33 d3 b8 a9 18 39 2c ad  |..[s.F..3....9,.|
+00000050  f2 eb 6b 02 38 44 f8 cf  ae ac a6 e6 54 92 29 ae  |..k.8D......T.).|
+00000060  a6 8a 4e 82 99 f3 77 8c  b6 3a a1 5c 4f 25 3b 7f  |..N...w..:.\O%;.|
+00000070  39 2f cd 51 dc e3 fc 7c  5a 5a 33 e4 af 43 d0 d3  |9/.Q...|ZZ3..C..|
+00000080  eb 3b 86 71 af 92 53 6e  02 b9 59 14 03 03 00 01  |.;.q..Sn..Y.....|
+00000090  01 16 03 03 00 40 8b e4  6f d3 88 e7 6a e9 aa f2  |.....@..o...j...|
+000000a0  4f 67 69 80 bc f1 78 ca  a9 f9 29 ce 44 93 81 46  |Ogi...x...).D..F|
+000000b0  0e 18 d1 2a 14 8b 3b b5  15 e4 b5 2a bb 88 d4 80  |...*..;....*....|
+000000c0  7b 2f 03 c7 83 7c 61 24  29 fe dd bc 49 8a b1 88  |{/...|a$)...I...|
+000000d0  41 ac 8a 12 f8 d6                                 |A.....|
 >>> 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 8b 11 9a 67 af  |..............g.|
-00000020  5b 0e c9 01 dc 76 e8 48  2f 40 5c 76 13 ca 28 63  |[....v.H/@\v..(c|
-00000030  a9 6d 3c 6b c1 d4 79 4d  39 17 55 a5 b9 0e b6 fd  |.m<k..yM9.U.....|
-00000040  9b 1a 8c 62 98 34 3c 85  b9 2b 40 17 03 03 00 40  |...b.4<..+@....@|
+00000010  00 00 00 00 00 00 00 00  00 00 00 e7 d3 34 46 88  |.............4F.|
+00000020  0e 7f ae 5b d6 e5 70 d2  7d 99 25 1b 27 89 8a a4  |...[..p.}.%.'...|
+00000030  02 03 01 a4 e1 d6 72 af  c3 5a 55 f7 56 69 60 91  |......r..ZU.Vi`.|
+00000040  49 29 68 36 99 e5 09 ac  7a e3 4f 17 03 03 00 40  |I)h6....z.O....@|
 00000050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000060  5e 82 20 cb bc 9a fd 36  13 3d aa 1b d6 72 df cb  |^. ....6.=...r..|
-00000070  09 e1 2f 85 6c 99 12 36  73 f3 c7 44 47 d7 60 19  |../.l..6s..DG.`.|
-00000080  2e 59 23 7d fa 16 b9 64  40 ed 96 79 66 b7 97 4c  |.Y#}...d@..yf..L|
+00000060  71 d0 36 7d 2c 3b 40 e3  a9 3f c1 d0 5e 3a ee d2  |q.6},;@..?..^:..|
+00000070  4d 0d b7 f4 83 3e 75 e0  ed 8a fc b2 9b ed 98 a8  |M....>u.........|
+00000080  ec 49 65 83 53 e0 79 52  03 2b 78 8a 64 3e 4c 5e  |.Ie.S.yR.+x.d>L^|
 00000090  15 03 03 00 30 00 00 00  00 00 00 00 00 00 00 00  |....0...........|
-000000a0  00 00 00 00 00 88 a2 85  5b 80 7d ee 4a 63 be da  |........[.}.Jc..|
-000000b0  e4 8f cd 6f 1d f4 03 da  ee 7c 29 2b d0 2d 3e 1c  |...o.....|)+.->.|
-000000c0  b2 ea 47 71 1f                                    |..Gq.|
+000000a0  00 00 00 00 00 76 38 c3  3d 86 d8 58 f2 16 48 94  |.....v8.=..X..H.|
+000000b0  46 65 ea 80 46 74 fe 66  7c 72 99 30 b3 05 08 14  |Fe..Ft.f|r.0....|
+000000c0  19 e3 ee 6f cf                                    |...o.|
diff --git a/src/crypto/tls/testdata/Server-TLSv12-X25519 b/src/crypto/tls/testdata/Server-TLSv12-X25519
index c196336..09f321e 100644
--- a/src/crypto/tls/testdata/Server-TLSv12-X25519
+++ b/src/crypto/tls/testdata/Server-TLSv12-X25519
@@ -1,82 +1,80 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 8f 01 00 00  8b 03 03 5d ff d6 27 db  |...........]..'.|
-00000010  3b e5 2b 79 3a a6 cf 75  3d f7 c9 d9 0a d4 8c b2  |;.+y:..u=.......|
-00000020  af 3c 29 84 65 a2 d6 98  52 e2 eb 00 00 04 c0 2f  |.<).e...R....../|
-00000030  00 ff 01 00 00 5e 00 00  00 0e 00 0c 00 00 09 31  |.....^.........1|
-00000040  32 37 2e 30 2e 30 2e 31  00 0b 00 04 03 00 01 02  |27.0.0.1........|
-00000050  00 0a 00 04 00 02 00 1d  00 16 00 00 00 17 00 00  |................|
-00000060  00 0d 00 30 00 2e 04 03  05 03 06 03 08 07 08 08  |...0............|
-00000070  08 09 08 0a 08 0b 08 04  08 05 08 06 04 01 05 01  |................|
-00000080  06 01 03 03 02 03 03 01  02 01 03 02 02 02 04 02  |................|
-00000090  05 02 06 02                                       |....|
+00000000  16 03 01 00 7d 01 00 00  79 03 03 dc 04 e9 5b d1  |....}...y.....[.|
+00000010  6b d9 b9 5e f7 4c 01 7e  58 4a 99 d9 90 c8 a2 7b  |k..^.L.~XJ.....{|
+00000020  f4 55 08 68 9b 42 34 6a  14 6c 01 00 00 04 cc a8  |.U.h.B4j.l......|
+00000030  00 ff 01 00 00 4c 00 0b  00 04 03 00 01 02 00 0a  |.....L..........|
+00000040  00 04 00 02 00 1d 00 16  00 00 00 17 00 00 00 0d  |................|
+00000050  00 30 00 2e 04 03 05 03  06 03 08 07 08 08 08 09  |.0..............|
+00000060  08 0a 08 0b 08 04 08 05  08 06 04 01 05 01 06 01  |................|
+00000070  03 03 02 03 03 01 02 01  03 02 02 02 04 02 05 02  |................|
+00000080  06 02                                             |..|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 37 02 00 00  33 03 03 00 00 00 00 00  |....7...3.......|
+00000000  16 03 03 00 3b 02 00 00  37 03 03 00 00 00 00 00  |....;...7.......|
 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000020  00 00 00 44 4f 57 4e 47  52 44 01 00 c0 2f 00 00  |...DOWNGRD.../..|
-00000030  0b ff 01 00 01 00 00 0b  00 02 01 00 16 03 03 02  |................|
-00000040  59 0b 00 02 55 00 02 52  00 02 4f 30 82 02 4b 30  |Y...U..R..O0..K0|
-00000050  82 01 b4 a0 03 02 01 02  02 09 00 e8 f0 9d 3f e2  |..............?.|
-00000060  5b ea a6 30 0d 06 09 2a  86 48 86 f7 0d 01 01 0b  |[..0...*.H......|
-00000070  05 00 30 1f 31 0b 30 09  06 03 55 04 0a 13 02 47  |..0.1.0...U....G|
-00000080  6f 31 10 30 0e 06 03 55  04 03 13 07 47 6f 20 52  |o1.0...U....Go R|
-00000090  6f 6f 74 30 1e 17 0d 31  36 30 31 30 31 30 30 30  |oot0...160101000|
-000000a0  30 30 30 5a 17 0d 32 35  30 31 30 31 30 30 30 30  |000Z..2501010000|
-000000b0  30 30 5a 30 1a 31 0b 30  09 06 03 55 04 0a 13 02  |00Z0.1.0...U....|
-000000c0  47 6f 31 0b 30 09 06 03  55 04 03 13 02 47 6f 30  |Go1.0...U....Go0|
-000000d0  81 9f 30 0d 06 09 2a 86  48 86 f7 0d 01 01 01 05  |..0...*.H.......|
-000000e0  00 03 81 8d 00 30 81 89  02 81 81 00 db 46 7d 93  |.....0.......F}.|
-000000f0  2e 12 27 06 48 bc 06 28  21 ab 7e c4 b6 a2 5d fe  |..'.H..(!.~...].|
-00000100  1e 52 45 88 7a 36 47 a5  08 0d 92 42 5b c2 81 c0  |.RE.z6G....B[...|
-00000110  be 97 79 98 40 fb 4f 6d  14 fd 2b 13 8b c2 a5 2e  |..y.@.Om..+.....|
-00000120  67 d8 d4 09 9e d6 22 38  b7 4a 0b 74 73 2b c2 34  |g....."8.J.ts+.4|
-00000130  f1 d1 93 e5 96 d9 74 7b  f3 58 9f 6c 61 3c c0 b0  |......t{.X.la<..|
-00000140  41 d4 d9 2b 2b 24 23 77  5b 1c 3b bd 75 5d ce 20  |A..++$#w[.;.u]. |
-00000150  54 cf a1 63 87 1d 1e 24  c4 f3 1d 1a 50 8b aa b6  |T..c...$....P...|
-00000160  14 43 ed 97 a7 75 62 f4  14 c8 52 d7 02 03 01 00  |.C...ub...R.....|
-00000170  01 a3 81 93 30 81 90 30  0e 06 03 55 1d 0f 01 01  |....0..0...U....|
-00000180  ff 04 04 03 02 05 a0 30  1d 06 03 55 1d 25 04 16  |.......0...U.%..|
-00000190  30 14 06 08 2b 06 01 05  05 07 03 01 06 08 2b 06  |0...+.........+.|
-000001a0  01 05 05 07 03 02 30 0c  06 03 55 1d 13 01 01 ff  |......0...U.....|
-000001b0  04 02 30 00 30 19 06 03  55 1d 0e 04 12 04 10 9f  |..0.0...U.......|
-000001c0  91 16 1f 43 43 3e 49 a6  de 6d b6 80 d7 9f 60 30  |...CC>I..m....`0|
-000001d0  1b 06 03 55 1d 23 04 14  30 12 80 10 48 13 49 4d  |...U.#..0...H.IM|
-000001e0  13 7e 16 31 bb a3 01 d5  ac ab 6e 7b 30 19 06 03  |.~.1......n{0...|
-000001f0  55 1d 11 04 12 30 10 82  0e 65 78 61 6d 70 6c 65  |U....0...example|
-00000200  2e 67 6f 6c 61 6e 67 30  0d 06 09 2a 86 48 86 f7  |.golang0...*.H..|
-00000210  0d 01 01 0b 05 00 03 81  81 00 9d 30 cc 40 2b 5b  |...........0.@+[|
-00000220  50 a0 61 cb ba e5 53 58  e1 ed 83 28 a9 58 1a a9  |P.a...SX...(.X..|
-00000230  38 a4 95 a1 ac 31 5a 1a  84 66 3d 43 d3 2d d9 0b  |8....1Z..f=C.-..|
-00000240  f2 97 df d3 20 64 38 92  24 3a 00 bc cf 9c 7d b7  |.... d8.$:....}.|
-00000250  40 20 01 5f aa d3 16 61  09 a2 76 fd 13 c3 cc e1  |@ ._...a..v.....|
-00000260  0c 5c ee b1 87 82 f1 6c  04 ed 73 bb b3 43 77 8d  |.\.....l..s..Cw.|
-00000270  0c 1c f1 0f a1 d8 40 83  61 c9 4c 72 2b 9d ae db  |......@.a.Lr+...|
-00000280  46 06 06 4d f4 c1 b3 3e  c0 d1 bd 42 d4 db fe 3d  |F..M...>...B...=|
-00000290  13 60 84 5c 21 d3 3b e9  fa e7 16 03 03 00 ac 0c  |.`.\!.;.........|
-000002a0  00 00 a8 03 00 1d 20 2f  e5 7d a3 47 cd 62 43 15  |...... /.}.G.bC.|
-000002b0  28 da ac 5f bb 29 07 30  ff f6 84 af c4 cf c2 ed  |(.._.).0........|
-000002c0  90 99 5f 58 cb 3b 74 08  04 00 80 73 d6 a4 35 5f  |.._X.;t....s..5_|
-000002d0  3f 46 ad de 81 13 a8 d9  21 17 25 37 61 cb 62 0d  |?F......!.%7a.b.|
-000002e0  e2 bf 95 51 0e 9e e7 b1  ab bc be f6 ec 80 b1 f4  |...Q............|
-000002f0  3e 9c 69 3f c8 1e a4 02  82 fd 57 01 e7 0c 18 be  |>.i?......W.....|
-00000300  c6 1b 01 68 cb ef dc d8  16 92 fb 1b 07 fd 98 f8  |...h............|
-00000310  00 77 a9 8e 71 2a e0 6c  68 d5 83 f9 36 c3 3b 99  |.w..q*.lh...6.;.|
-00000320  44 98 a0 96 00 1a 02 95  c5 7c ea ae 51 81 89 94  |D........|..Q...|
-00000330  57 b6 37 c5 88 56 9f 49  bf 36 26 48 08 36 a1 69  |W.7..V.I.6&H.6.i|
-00000340  48 a2 c4 b2 6f 0f 43 70  91 1e 8a 16 03 03 00 04  |H...o.Cp........|
-00000350  0e 00 00 00                                       |....|
+00000020  00 00 00 44 4f 57 4e 47  52 44 01 00 cc a8 00 00  |...DOWNGRD......|
+00000030  0f ff 01 00 01 00 00 17  00 00 00 0b 00 02 01 00  |................|
+00000040  16 03 03 02 59 0b 00 02  55 00 02 52 00 02 4f 30  |....Y...U..R..O0|
+00000050  82 02 4b 30 82 01 b4 a0  03 02 01 02 02 09 00 e8  |..K0............|
+00000060  f0 9d 3f e2 5b ea a6 30  0d 06 09 2a 86 48 86 f7  |..?.[..0...*.H..|
+00000070  0d 01 01 0b 05 00 30 1f  31 0b 30 09 06 03 55 04  |......0.1.0...U.|
+00000080  0a 13 02 47 6f 31 10 30  0e 06 03 55 04 03 13 07  |...Go1.0...U....|
+00000090  47 6f 20 52 6f 6f 74 30  1e 17 0d 31 36 30 31 30  |Go Root0...16010|
+000000a0  31 30 30 30 30 30 30 5a  17 0d 32 35 30 31 30 31  |1000000Z..250101|
+000000b0  30 30 30 30 30 30 5a 30  1a 31 0b 30 09 06 03 55  |000000Z0.1.0...U|
+000000c0  04 0a 13 02 47 6f 31 0b  30 09 06 03 55 04 03 13  |....Go1.0...U...|
+000000d0  02 47 6f 30 81 9f 30 0d  06 09 2a 86 48 86 f7 0d  |.Go0..0...*.H...|
+000000e0  01 01 01 05 00 03 81 8d  00 30 81 89 02 81 81 00  |.........0......|
+000000f0  db 46 7d 93 2e 12 27 06  48 bc 06 28 21 ab 7e c4  |.F}...'.H..(!.~.|
+00000100  b6 a2 5d fe 1e 52 45 88  7a 36 47 a5 08 0d 92 42  |..]..RE.z6G....B|
+00000110  5b c2 81 c0 be 97 79 98  40 fb 4f 6d 14 fd 2b 13  |[.....y.@.Om..+.|
+00000120  8b c2 a5 2e 67 d8 d4 09  9e d6 22 38 b7 4a 0b 74  |....g....."8.J.t|
+00000130  73 2b c2 34 f1 d1 93 e5  96 d9 74 7b f3 58 9f 6c  |s+.4......t{.X.l|
+00000140  61 3c c0 b0 41 d4 d9 2b  2b 24 23 77 5b 1c 3b bd  |a<..A..++$#w[.;.|
+00000150  75 5d ce 20 54 cf a1 63  87 1d 1e 24 c4 f3 1d 1a  |u]. T..c...$....|
+00000160  50 8b aa b6 14 43 ed 97  a7 75 62 f4 14 c8 52 d7  |P....C...ub...R.|
+00000170  02 03 01 00 01 a3 81 93  30 81 90 30 0e 06 03 55  |........0..0...U|
+00000180  1d 0f 01 01 ff 04 04 03  02 05 a0 30 1d 06 03 55  |...........0...U|
+00000190  1d 25 04 16 30 14 06 08  2b 06 01 05 05 07 03 01  |.%..0...+.......|
+000001a0  06 08 2b 06 01 05 05 07  03 02 30 0c 06 03 55 1d  |..+.......0...U.|
+000001b0  13 01 01 ff 04 02 30 00  30 19 06 03 55 1d 0e 04  |......0.0...U...|
+000001c0  12 04 10 9f 91 16 1f 43  43 3e 49 a6 de 6d b6 80  |.......CC>I..m..|
+000001d0  d7 9f 60 30 1b 06 03 55  1d 23 04 14 30 12 80 10  |..`0...U.#..0...|
+000001e0  48 13 49 4d 13 7e 16 31  bb a3 01 d5 ac ab 6e 7b  |H.IM.~.1......n{|
+000001f0  30 19 06 03 55 1d 11 04  12 30 10 82 0e 65 78 61  |0...U....0...exa|
+00000200  6d 70 6c 65 2e 67 6f 6c  61 6e 67 30 0d 06 09 2a  |mple.golang0...*|
+00000210  86 48 86 f7 0d 01 01 0b  05 00 03 81 81 00 9d 30  |.H.............0|
+00000220  cc 40 2b 5b 50 a0 61 cb  ba e5 53 58 e1 ed 83 28  |.@+[P.a...SX...(|
+00000230  a9 58 1a a9 38 a4 95 a1  ac 31 5a 1a 84 66 3d 43  |.X..8....1Z..f=C|
+00000240  d3 2d d9 0b f2 97 df d3  20 64 38 92 24 3a 00 bc  |.-...... d8.$:..|
+00000250  cf 9c 7d b7 40 20 01 5f  aa d3 16 61 09 a2 76 fd  |..}.@ ._...a..v.|
+00000260  13 c3 cc e1 0c 5c ee b1  87 82 f1 6c 04 ed 73 bb  |.....\.....l..s.|
+00000270  b3 43 77 8d 0c 1c f1 0f  a1 d8 40 83 61 c9 4c 72  |.Cw.......@.a.Lr|
+00000280  2b 9d ae db 46 06 06 4d  f4 c1 b3 3e c0 d1 bd 42  |+...F..M...>...B|
+00000290  d4 db fe 3d 13 60 84 5c  21 d3 3b e9 fa e7 16 03  |...=.`.\!.;.....|
+000002a0  03 00 ac 0c 00 00 a8 03  00 1d 20 2f e5 7d a3 47  |.......... /.}.G|
+000002b0  cd 62 43 15 28 da ac 5f  bb 29 07 30 ff f6 84 af  |.bC.(.._.).0....|
+000002c0  c4 cf c2 ed 90 99 5f 58  cb 3b 74 08 04 00 80 27  |......_X.;t....'|
+000002d0  d6 32 9d 2d 17 61 04 13  02 29 ad c2 af f7 ac 7b  |.2.-.a...).....{|
+000002e0  65 1c 6b cd 1d 7d 05 d7  b9 55 82 1b 23 92 6b b5  |e.k..}...U..#.k.|
+000002f0  a2 d6 65 d7 42 6f a3 b6  2a f0 ac a4 6c dd f3 11  |..e.Bo..*...l...|
+00000300  a0 20 ee 45 42 33 fc 45  d1 9e d7 bb 75 0e d1 bd  |. .EB3.E....u...|
+00000310  cd 8f 64 35 85 79 88 9b  63 1e 8c 08 1b fd 19 5e  |..d5.y..c......^|
+00000320  a9 ac 06 79 1e 4a 95 fa  cd 60 86 e3 10 e4 d0 39  |...y.J...`.....9|
+00000330  0c a0 0b 6f 6f 55 a4 7d  65 d4 41 ee 60 62 42 a8  |...ooU.}e.A.`bB.|
+00000340  5e 22 55 48 3c 54 53 f0  28 e1 7f 67 4f f0 1f 16  |^"UH<TS.(..gO...|
+00000350  03 03 00 04 0e 00 00 00                           |........|
 >>> Flow 3 (client to server)
-00000000  16 03 03 00 25 10 00 00  21 20 0a 1b 78 c4 bb eb  |....%...! ..x...|
-00000010  a4 01 33 3b 69 95 c2 06  5d c9 3e b3 13 51 4b 93  |..3;i...].>..QK.|
-00000020  5e 3c 3e a7 42 12 22 e8  7e 49 14 03 03 00 01 01  |^<>.B.".~I......|
-00000030  16 03 03 00 28 fc c7 a1  45 50 e0 fe 27 fd ac a4  |....(...EP..'...|
-00000040  d8 a2 c6 54 df e1 d3 6f  e7 d8 45 a6 57 16 2f 1f  |...T...o..E.W./.|
-00000050  cf 89 26 c6 0a c3 4f 63  df ac bc c9 79           |..&...Oc....y|
+00000000  16 03 03 00 25 10 00 00  21 20 35 e6 c9 e2 76 cf  |....%...! 5...v.|
+00000010  36 af dc 27 30 6b eb f4  ae 62 f1 f4 40 81 04 d2  |6..'0k...b..@...|
+00000020  f1 c7 d5 af 7d 64 ef 64  d0 58 14 03 03 00 01 01  |....}d.d.X......|
+00000030  16 03 03 00 20 5b 64 ec  49 29 26 ba 8c ed 85 fb  |.... [d.I)&.....|
+00000040  3e 09 c4 66 bb 60 4e d7  b1 69 73 5a 67 51 77 20  |>..f.`N..isZgQw |
+00000050  5b 14 1f c0 69                                    |[...i|
 >>> 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 37 25 28 76 4e  31 dd 5e b0 5b 39 87 fc  |...7%(vN1.^.[9..|
-00000020  0f 10 3c bc 6d 12 9a dd  59 89 0b 09 bc f2 2c d8  |..<.m...Y.....,.|
-00000030  05 a7 77 17 03 03 00 25  00 00 00 00 00 00 00 01  |..w....%........|
-00000040  fe 79 9d dd d9 e3 bc 48  47 65 30 64 c7 74 82 0a  |.y.....HGe0d.t..|
-00000050  9f b7 45 a2 62 40 b5 dd  79 b9 ce 06 83 15 03 03  |..E.b@..y.......|
-00000060  00 1a 00 00 00 00 00 00  00 02 58 ed 37 40 33 e4  |..........X.7@3.|
-00000070  75 f0 a6 fa 14 f5 6b 93  9e 54 f2 a4              |u.....k..T..|
+00000000  14 03 03 00 01 01 16 03  03 00 20 74 49 81 b6 d3  |.......... tI...|
+00000010  79 68 0d 78 47 7a 97 a7  cd 3b 2c 24 a3 42 83 18  |yh.xGz...;,$.B..|
+00000020  e4 0c c3 da 4a 1c ff 7b  5d 4c 08 17 03 03 00 1d  |....J..{]L......|
+00000030  c2 8a f4 f2 de db 53 69  79 61 c9 30 7b ae 74 cc  |......Siya.0{.t.|
+00000040  eb 37 b7 e8 19 cb e6 5f  49 7f 3d a0 37 15 03 03  |.7....._I.=.7...|
+00000050  00 12 99 68 9b 76 f6 66  52 55 fc 8e 4f 17 56 a7  |...h.v.fRU..O.V.|
+00000060  33 0b db 05                                       |3...|
diff --git a/src/crypto/tls/testdata/Server-TLSv13-AES128-SHA256 b/src/crypto/tls/testdata/Server-TLSv13-AES128-SHA256
index a071f60..465d5f9f 100644
--- a/src/crypto/tls/testdata/Server-TLSv13-AES128-SHA256
+++ b/src/crypto/tls/testdata/Server-TLSv13-AES128-SHA256
@@ -1,100 +1,97 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 dc 01 00 00  d8 03 03 5f b5 79 18 5f  |..........._.y._|
-00000010  d2 f8 b0 fc da 39 90 af  e1 ba 04 b5 70 86 c3 6b  |.....9......p..k|
-00000020  ba b4 87 e3 81 9a 86 02  9b 26 44 20 21 e3 5b 03  |.........&D !.[.|
-00000030  0d 0a 6c 1f 71 ea b4 4c  56 aa b6 d1 e8 91 d6 7b  |..l.q..LV......{|
-00000040  59 12 63 af db d2 69 80  cd 5f 62 22 00 04 13 01  |Y.c...i.._b"....|
-00000050  00 ff 01 00 00 8b 00 00  00 0e 00 0c 00 00 09 31  |...............1|
-00000060  32 37 2e 30 2e 30 2e 31  00 0b 00 04 03 00 01 02  |27.0.0.1........|
-00000070  00 0a 00 0c 00 0a 00 1d  00 17 00 1e 00 19 00 18  |................|
-00000080  00 16 00 00 00 17 00 00  00 0d 00 1e 00 1c 04 03  |................|
-00000090  05 03 06 03 08 07 08 08  08 09 08 0a 08 0b 08 04  |................|
-000000a0  08 05 08 06 04 01 05 01  06 01 00 2b 00 03 02 03  |...........+....|
-000000b0  04 00 2d 00 02 01 01 00  33 00 26 00 24 00 1d 00  |..-.....3.&.$...|
-000000c0  20 57 12 bc 06 e0 46 c7  75 43 b8 af f9 c1 f6 b8  | W....F.uC......|
-000000d0  e4 1e 13 6b 02 07 23 d2  e6 89 ec 18 ab c0 9f ae  |...k..#.........|
-000000e0  69                                                |i|
+00000000  16 03 01 00 ca 01 00 00  c6 03 03 8e 4c 3b 7c dc  |............L;|.|
+00000010  d6 2d c0 19 de dd 85 01  ce 5a 48 3e 63 ab 4a 21  |.-.......ZH>c.J!|
+00000020  9c 0e 23 4f 41 99 43 bd  78 5b 82 20 90 e6 4e 23  |..#OA.C.x[. ..N#|
+00000030  34 72 2a ad 9a cf 95 20  20 f0 e9 cf 7a 4a 57 65  |4r*....  ...zJWe|
+00000040  87 09 c7 76 79 25 9c 3e  16 22 4c c5 00 04 13 01  |...vy%.>."L.....|
+00000050  00 ff 01 00 00 79 00 0b  00 04 03 00 01 02 00 0a  |.....y..........|
+00000060  00 0c 00 0a 00 1d 00 17  00 1e 00 19 00 18 00 16  |................|
+00000070  00 00 00 17 00 00 00 0d  00 1e 00 1c 04 03 05 03  |................|
+00000080  06 03 08 07 08 08 08 09  08 0a 08 0b 08 04 08 05  |................|
+00000090  08 06 04 01 05 01 06 01  00 2b 00 03 02 03 04 00  |.........+......|
+000000a0  2d 00 02 01 01 00 33 00  26 00 24 00 1d 00 20 74  |-.....3.&.$... t|
+000000b0  47 39 80 c0 36 61 58 c4  16 58 d5 e1 9f 60 ca a8  |G9..6aX..X...`..|
+000000c0  f8 ef 86 40 65 2d 5b 5d  4b cc 37 1d 66 15 66     |...@e-[]K.7.f.f|
 >>> Flow 2 (server to client)
 00000000  16 03 03 00 7a 02 00 00  76 03 03 00 00 00 00 00  |....z...v.......|
 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 21 e3 5b 03  |........... !.[.|
-00000030  0d 0a 6c 1f 71 ea b4 4c  56 aa b6 d1 e8 91 d6 7b  |..l.q..LV......{|
-00000040  59 12 63 af db d2 69 80  cd 5f 62 22 13 01 00 00  |Y.c...i.._b"....|
+00000020  00 00 00 00 00 00 00 00  00 00 00 20 90 e6 4e 23  |........... ..N#|
+00000030  34 72 2a ad 9a cf 95 20  20 f0 e9 cf 7a 4a 57 65  |4r*....  ...zJWe|
+00000040  87 09 c7 76 79 25 9c 3e  16 22 4c c5 13 01 00 00  |...vy%.>."L.....|
 00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 2f  |..+.....3.$... /|
 00000060  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
 00000070  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74 14  |.........._X.;t.|
-00000080  03 03 00 01 01 17 03 03  00 17 be 8f 95 d9 22 d7  |..............".|
-00000090  f7 ff 75 78 b6 9c bc 93  23 2f 76 62 c6 cd c6 92  |..ux....#/vb....|
-000000a0  fe 17 03 03 02 6d 31 54  c9 32 d0 38 53 8f f0 15  |.....m1T.2.8S...|
-000000b0  03 42 16 39 71 61 f9 17  f2 da c5 2e 4c 19 c3 30  |.B.9qa......L..0|
-000000c0  d5 c6 b8 ea 5d 3b 47 1b  d9 20 31 64 ab 5c f3 00  |....];G.. 1d.\..|
-000000d0  43 5b e7 3b 36 69 12 c9  3b 3d e7 4f 91 72 e4 29  |C[.;6i..;=.O.r.)|
-000000e0  93 54 65 50 88 07 b9 e2  ed 5e 18 f7 00 0a 49 e5  |.TeP.....^....I.|
-000000f0  19 cc d8 e5 b2 c5 f6 bd  34 7a 7f e2 f1 7c 9d a0  |........4z...|..|
-00000100  d6 0c 50 4f 80 8a c5 a1  fe b8 2e 54 7c 0c ae 48  |..PO.......T|..H|
-00000110  c5 ff 46 d9 45 e6 c0 df  61 74 fc d5 e8 ec e1 84  |..F.E...at......|
-00000120  0b c8 df 73 77 e4 9f 13  e5 52 e5 0b d8 9f 65 b7  |...sw....R....e.|
-00000130  89 d5 04 74 f8 8d a6 2a  c7 a1 76 ff 27 85 6a bb  |...t...*..v.'.j.|
-00000140  ee 86 c9 38 5a 54 bc ac  bc ad 79 85 7c 26 65 c3  |...8ZT....y.|&e.|
-00000150  36 97 56 76 d2 4c 55 32  71 82 ec d1 81 22 46 9e  |6.Vv.LU2q...."F.|
-00000160  75 d8 55 a8 1e 61 10 c8  dc e8 c7 ad fe 96 0e 54  |u.U..a.........T|
-00000170  1c 79 0c 41 b9 98 b0 44  f8 45 6e c7 b3 41 68 2d  |.y.A...D.En..Ah-|
-00000180  ea 73 be 55 99 fe 88 02  e3 5d 0f f3 d1 70 9a 5e  |.s.U.....]...p.^|
-00000190  be e7 80 96 6c 94 7f 9f  ec 1c b6 24 28 ef 90 95  |....l......$(...|
-000001a0  d5 5b d4 7b 1b b1 a4 9c  66 09 11 23 ad f5 87 ee  |.[.{....f..#....|
-000001b0  0b 1f e5 d2 0e 57 16 e9  14 ae 0f 98 9b a1 bc 9e  |.....W..........|
-000001c0  68 dc d0 fb 76 aa c8 f2  bc e5 d3 ff e2 85 df 01  |h...v...........|
-000001d0  2f ad 72 78 85 0f f7 0a  64 a4 cd 61 2a e6 2b a3  |/.rx....d..a*.+.|
-000001e0  d5 4a c9 08 00 af 5c 6c  9d 35 e4 1e 7c 32 1a d0  |.J....\l.5..|2..|
-000001f0  f3 6d 73 16 9c c8 72 28  4b 67 cf d8 ff 2b 1e 33  |.ms...r(Kg...+.3|
-00000200  18 c4 ed c9 31 5d 6a 0f  c5 05 bf 08 eb 0b 44 05  |....1]j.......D.|
-00000210  83 49 40 d2 1f 7f 5c 08  ef 98 1f 09 f1 09 33 02  |.I@...\.......3.|
-00000220  56 04 66 53 69 93 ef 07  0d 8a e7 84 b5 03 b9 78  |V.fSi..........x|
-00000230  bb 52 84 3f bb 4e d3 f9  c4 8a 2a d1 59 02 59 36  |.R.?.N....*.Y.Y6|
-00000240  88 52 6a 9d 1f 7e c1 5b  a6 8a a4 cc 42 f4 44 59  |.Rj..~.[....B.DY|
-00000250  ca d2 fa 0e 09 5f 25 e5  cc 27 55 8b 16 b5 f1 62  |....._%..'U....b|
-00000260  aa f7 a9 bc 7a 36 fa 16  34 b7 ce 2d b8 bd 67 f0  |....z6..4..-..g.|
-00000270  75 15 17 c4 49 81 55 b1  5a e0 d2 b8 45 79 d0 16  |u...I.U.Z...Ey..|
-00000280  71 21 01 57 ad 10 48 1f  0d bf 43 da b7 c9 a8 93  |q!.W..H...C.....|
-00000290  88 af be 2d 65 a0 81 26  23 de fe e2 a3 9c f6 40  |...-e..&#......@|
-000002a0  96 f9 a1 21 0b fe 31 7f  24 ec 75 ae cf b0 8c a7  |...!..1.$.u.....|
-000002b0  fe f8 2f ee 60 65 72 5c  86 a6 45 22 11 55 62 29  |../.`er\..E".Ub)|
-000002c0  02 8b b5 ff 4b f8 73 71  3d 8c c3 37 68 2d 2c 24  |....K.sq=..7h-,$|
-000002d0  b7 dc be 5a 37 d8 25 3b  b6 16 e6 2a e9 80 48 0b  |...Z7.%;...*..H.|
-000002e0  77 be 05 35 b2 86 97 51  49 31 ac de 85 eb a9 a8  |w..5...QI1......|
-000002f0  74 1d 00 07 4c 1b 8c a5  ec 1b b5 7a 57 84 da 40  |t...L......zW..@|
-00000300  10 6c c9 ed b3 43 06 81  11 e2 84 3c 4c ae 22 6b  |.l...C.....<L."k|
-00000310  e6 96 dc 17 03 03 00 99  2b 4a 51 8f 5e c1 82 70  |........+JQ.^..p|
-00000320  e7 e2 ca 34 cb d1 24 c9  da 69 06 7c 75 d0 0f 16  |...4..$..i.|u...|
-00000330  cc 9c e1 26 60 d0 cc 18  16 18 15 f0 26 f8 d4 d7  |...&`.......&...|
-00000340  f8 81 77 0c 68 cd fe 7a  28 d6 32 60 29 c3 e2 87  |..w.h..z(.2`)...|
-00000350  9b 1c ad 3b 7d 42 31 23  74 61 f5 b7 28 5f 5a 8a  |...;}B1#ta..(_Z.|
-00000360  16 98 f8 74 01 63 7d 0a  2c 51 d7 5e 04 8b 2e 58  |...t.c}.,Q.^...X|
-00000370  c3 6f d7 4a 1e fa 55 84  8d a9 24 ef de 4c e3 2e  |.o.J..U...$..L..|
-00000380  44 2b 1f e8 b4 a2 6f cc  e6 a6 d2 1f fa 60 ab 20  |D+....o......`. |
-00000390  e0 06 8e 00 1a 24 57 50  93 e5 71 d0 cc 63 9b 60  |.....$WP..q..c.`|
-000003a0  f8 e9 c2 de 4b 65 b6 9a  3b dd 60 d6 fb 37 c7 3c  |....Ke..;.`..7.<|
-000003b0  e2 17 03 03 00 35 82 7c  22 13 69 48 00 19 51 5c  |.....5.|".iH..Q\|
-000003c0  9d 19 3b 1a 25 a9 b8 db  9b c3 25 40 c9 ed c7 dd  |..;.%.....%@....|
-000003d0  e6 31 e7 55 ed 48 f0 af  95 1b 0e ca 9a f4 7f 60  |.1.U.H.........`|
-000003e0  03 11 e8 51 57 5e df 4e  c2 ec 7a 17 03 03 00 93  |...QW^.N..z.....|
-000003f0  76 84 60 d6 f5 6f 27 c2  47 88 fa 80 78 a6 22 0a  |v.`..o'.G...x.".|
-00000400  16 a6 26 12 1b 14 6c 6f  40 10 ce 7c 7c 16 f9 64  |..&...lo@..||..d|
-00000410  e6 98 13 51 36 b0 41 d9  6d 9c fb ba 3e 59 9d 33  |...Q6.A.m...>Y.3|
-00000420  76 f0 23 23 27 94 df 2f  21 6a c0 a9 5a 3d af 41  |v.##'../!j..Z=.A|
-00000430  31 4d 9b d5 75 57 f1 a9  c5 57 2a 7a c7 1d b1 a7  |1M..uW...W*z....|
-00000440  15 a5 80 ae 63 f8 85 92  46 13 d2 31 26 62 7d 83  |....c...F..1&b}.|
-00000450  95 f9 97 9d e8 86 7d 09  f3 cc 30 b1 db 54 2a 8d  |......}...0..T*.|
-00000460  0f 04 da d9 cf 59 52 2a  e3 7d 64 20 f3 26 4a 2e  |.....YR*.}d .&J.|
-00000470  74 07 c5 2f 98 a2 f7 e1  53 01 e0 c2 3b c7 42 1b  |t../....S...;.B.|
-00000480  a0 48 12                                          |.H.|
+00000080  03 03 00 01 01 17 03 03  00 17 e2 d2 17 5f 12 74  |............._.t|
+00000090  c1 79 bc 63 27 63 e7 52  05 50 f5 13 16 ea 3e 9e  |.y.c'c.R.P....>.|
+000000a0  19 17 03 03 02 6d dd 67  27 89 03 8e f4 db 9b 65  |.....m.g'......e|
+000000b0  bc ff 5e 8a 9b a2 20 3c  4d ee b2 98 e3 52 94 b1  |..^... <M....R..|
+000000c0  ab b2 6c 96 31 08 29 d8  f8 f3 a6 86 42 1e 82 42  |..l.1.).....B..B|
+000000d0  79 ad 44 de da 44 ac c6  c8 ae 0f ce 8c f5 03 1a  |y.D..D..........|
+000000e0  26 78 0e 92 e4 0b 81 84  ce 89 f1 a6 ee b1 c1 62  |&x.............b|
+000000f0  92 79 69 2b b6 4b 1f 2d  81 9c 06 1e f2 c5 0a 21  |.yi+.K.-.......!|
+00000100  5c f8 1f 3a 8d 0c dd 04  2b fb 96 0c e5 ed a9 9c  |\..:....+.......|
+00000110  34 42 fb 31 89 04 09 a5  9f ed ec cd ba 88 d7 de  |4B.1............|
+00000120  ae bb 96 1a fd 49 c7 6b  1f 9e 5a 2b 12 26 91 3b  |.....I.k..Z+.&.;|
+00000130  17 5a 32 d1 7e 60 4a 55  de ed 39 0d 6b e2 ed a8  |.Z2.~`JU..9.k...|
+00000140  21 bc 3f 94 3d bf aa b9  84 5a 76 21 27 e7 9e 7a  |!.?.=....Zv!'..z|
+00000150  f0 93 8b e3 3f a5 00 af  8d 62 b6 c8 ef 69 cf 99  |....?....b...i..|
+00000160  0e 94 90 29 e4 ed 8b d5  06 c6 1e ea f0 a1 08 48  |...)...........H|
+00000170  4a 6a cf 9b 6c 8a b7 41  ad 58 ea fe 90 43 94 77  |Jj..l..A.X...C.w|
+00000180  b0 80 c9 26 79 a3 5d 89  ef 93 10 f1 37 43 07 e2  |...&y.].....7C..|
+00000190  c3 af 1f 6c 46 d8 3b c6  54 c1 d4 72 ad 15 a1 b9  |...lF.;.T..r....|
+000001a0  4f 72 74 f0 ed 62 3b 83  75 ab 12 5c 87 df 8e b8  |Ort..b;.u..\....|
+000001b0  79 af c3 f8 e0 fb f6 b7  ab ec 67 3e ec 05 a1 69  |y.........g>...i|
+000001c0  69 d5 56 45 b2 3b 5f 24  42 b9 4f 43 ec 0d 0d 6c  |i.VE.;_$B.OC...l|
+000001d0  0e 44 10 e6 45 e1 a2 11  27 e6 70 a8 d3 a4 2e a1  |.D..E...'.p.....|
+000001e0  43 d6 a5 46 79 d1 e8 37  07 c0 29 68 fa ab dc 67  |C..Fy..7..)h...g|
+000001f0  91 94 04 28 aa 12 01 3f  c7 4f d6 a8 93 99 53 5e  |...(...?.O....S^|
+00000200  0b 5f ff 83 a0 14 47 23  e6 5e 3c a0 e4 47 28 74  |._....G#.^<..G(t|
+00000210  20 a4 cc 28 03 41 62 5a  27 eb 22 33 ba ac e2 63  | ..(.AbZ'."3...c|
+00000220  c7 a6 09 c7 87 70 45 1a  8b df 96 89 bc 3f 14 0d  |.....pE......?..|
+00000230  28 5a 67 a1 d4 30 a3 c3  3a 4b 1f 0e a7 7d 40 cd  |(Zg..0..:K...}@.|
+00000240  0e 59 12 2d be 40 ea c1  cb fc b0 d3 42 72 56 4b  |.Y.-.@......BrVK|
+00000250  7a a8 e8 70 d6 07 e0 0a  69 ad e6 0b e9 da b7 27  |z..p....i......'|
+00000260  57 e6 aa d3 0d 46 86 93  c0 ce e6 1a b8 8f bb 95  |W....F..........|
+00000270  09 58 e7 51 96 53 4e 71  70 bf 34 7a b0 e9 a8 e7  |.X.Q.SNqp.4z....|
+00000280  51 0f 0c 68 f1 9f 17 28  53 d4 ac 7a 9f 06 cc ce  |Q..h...(S..z....|
+00000290  36 81 e7 bf f2 85 b5 5b  4e 23 84 70 67 d5 45 a3  |6......[N#.pg.E.|
+000002a0  3a df f2 26 7c 93 d0 47  f9 0d 87 21 a0 e3 05 a3  |:..&|..G...!....|
+000002b0  ed 7b 99 7d 56 1f 43 77  4e fb db 7d 63 70 a0 fb  |.{.}V.CwN..}cp..|
+000002c0  bf 41 d7 48 a8 ae b1 70  1e 99 ae 2b e5 1c 7b 4d  |.A.H...p...+..{M|
+000002d0  a8 a6 86 39 83 d4 63 32  56 57 44 4c 44 2e 77 22  |...9..c2VWDLD.w"|
+000002e0  7b e4 33 3a 40 df f1 7e  21 8a 8d da 72 dd 6f 29  |{.3:@..~!...r.o)|
+000002f0  5a de 90 0c a2 76 e0 73  7a 82 d3 26 88 e1 f7 c5  |Z....v.sz..&....|
+00000300  69 c2 04 9b 98 4b 49 7f  e3 ac 18 90 85 4f ec c7  |i....KI......O..|
+00000310  29 67 b7 17 03 03 00 99  1c 83 e0 03 3a 6e 3e 08  |)g..........:n>.|
+00000320  e5 33 26 ca 22 a7 01 d9  8c fa f8 75 74 4a 34 a9  |.3&."......utJ4.|
+00000330  12 f7 0a fd 49 2e ef 7d  07 97 59 d7 5a 69 b2 cb  |....I..}..Y.Zi..|
+00000340  07 a4 5e 5d 52 f5 4b 50  b3 df 46 fd 3e 86 fe 07  |..^]R.KP..F.>...|
+00000350  98 94 ad cd 2b a2 11 03  1c 1b 13 03 ba 13 68 e4  |....+.........h.|
+00000360  45 5a 70 41 92 a1 67 65  a3 23 4b 81 47 3b 18 a4  |EZpA..ge.#K.G;..|
+00000370  6e 8f 62 e1 2b ee 5f 77  35 e2 07 f7 c9 39 ec 9f  |n.b.+._w5....9..|
+00000380  e5 dc b6 e9 64 b9 83 50  02 3f e6 2f ba 3e f6 97  |....d..P.?./.>..|
+00000390  0b 75 9d e2 d6 ac 86 89  a2 ce 99 29 7b 11 de 6a  |.u.........){..j|
+000003a0  23 da 7c 84 ec d3 71 f4  fd 6b 5c 0a c0 25 3e c0  |#.|...q..k\..%>.|
+000003b0  11 17 03 03 00 35 39 bb  d8 45 80 5d 07 86 99 65  |.....59..E.]...e|
+000003c0  7c 85 6f 3a 08 e2 a4 fa  2e be 23 63 51 64 71 7c  ||.o:......#cQdq||
+000003d0  d7 5d 87 31 91 53 6e 77  7d ea d1 66 fd b7 a9 0e  |.].1.Snw}..f....|
+000003e0  c9 da dc ba b7 d9 5f 0f  33 fd 52 17 03 03 00 8b  |......_.3.R.....|
+000003f0  99 86 2a e1 93 87 40 c9  6e 9d 27 7d dd a0 03 a2  |..*...@.n.'}....|
+00000400  65 cb c2 63 33 59 2f 4a  a7 01 56 94 28 e4 ec c7  |e..c3Y/J..V.(...|
+00000410  8f 62 ed 71 c1 80 b9 f8  55 07 0b ab 2a bd f8 68  |.b.q....U...*..h|
+00000420  7d 90 a9 98 36 5b d8 f3  00 22 d9 a9 76 30 ef cd  |}...6[..."..v0..|
+00000430  3f 42 68 af 70 5b 12 c8  9d f8 00 01 3d 02 82 44  |?Bh.p[......=..D|
+00000440  2d a6 2e dc 3b b4 42 5c  c6 01 c4 fb a3 32 86 10  |-...;.B\.....2..|
+00000450  d8 25 ab 87 24 d7 38 7f  dd b8 5f f9 5e 47 a9 57  |.%..$.8..._.^G.W|
+00000460  cc 48 fb 0f 74 4a db 4f  db 92 21 be 08 7c 53 6f  |.H..tJ.O..!..|So|
+00000470  89 3f 68 77 cd 02 a7 aa  9c 9d b5                 |.?hw.......|
 >>> Flow 3 (client to server)
-00000000  14 03 03 00 01 01 17 03  03 00 35 57 4a c4 5a c1  |..........5WJ.Z.|
-00000010  3a b9 ae f0 1d e8 8f 31  38 0e 64 9e 61 13 e6 b2  |:......18.d.a...|
-00000020  1b 02 aa b6 46 5a 50 97  07 93 86 13 dc 3d 76 6a  |....FZP......=vj|
-00000030  67 01 1b 18 9b 7e 21 b2  c1 d4 a5 25 22 4d 14 dc  |g....~!....%"M..|
+00000000  14 03 03 00 01 01 17 03  03 00 35 1d f1 fe e2 c3  |..........5.....|
+00000010  4e 95 57 0b 7e d6 32 45  6b 9c ed 89 c2 69 62 70  |N.W.~.2Ek....ibp|
+00000020  79 0f a8 42 72 94 05 ad  f5 fe a5 83 4b 56 80 41  |y..Br.......KV.A|
+00000030  2c 58 e0 e2 00 70 de c1  39 c8 fa c4 bb 89 57 aa  |,X...p..9.....W.|
 >>> Flow 4 (server to client)
-00000000  17 03 03 00 1e 61 63 5a  22 d2 e6 8e e8 8e 69 7d  |.....acZ".....i}|
-00000010  24 69 a5 b8 e3 59 98 ac  64 0b 34 6b 16 60 92 db  |$i...Y..d.4k.`..|
-00000020  6b 62 45 17 03 03 00 13  b7 12 c6 59 fe 23 f4 6c  |kbE........Y.#.l|
-00000030  a6 d3 8d 59 1b 40 60 72  d6 97 b4                 |...Y.@`r...|
+00000000  17 03 03 00 1e a3 8a 39  2d 93 5d d3 ce cd 5a 31  |.......9-.]...Z1|
+00000010  19 21 b8 b5 6f 3e 58 7a  0c 09 9b a8 4b 23 3d 3d  |.!..o>Xz....K#==|
+00000020  d7 73 7a 17 03 03 00 13  d1 a5 7c 5e 2e fa 6b 86  |.sz.......|^..k.|
+00000030  f9 36 3c 8d 2b 5b 7e 58  db c8 0d                 |.6<.+[~X...|
diff --git a/src/crypto/tls/testdata/Server-TLSv13-AES256-SHA384 b/src/crypto/tls/testdata/Server-TLSv13-AES256-SHA384
index 60aa82d..64310a1 100644
--- a/src/crypto/tls/testdata/Server-TLSv13-AES256-SHA384
+++ b/src/crypto/tls/testdata/Server-TLSv13-AES256-SHA384
@@ -1,103 +1,100 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 dc 01 00 00  d8 03 03 70 b7 07 12 16  |...........p....|
-00000010  50 d7 b9 c9 5f 02 47 2d  ff 93 a7 2f e8 51 dc a0  |P..._.G-.../.Q..|
-00000020  8f 0d c8 80 38 c7 af 7e  da bb ed 20 67 73 58 d7  |....8..~... gsX.|
-00000030  11 8b c6 0d 72 86 e0 08  3e 2d d9 b9 16 9f 85 6e  |....r...>-.....n|
-00000040  3c 87 fd 87 c3 95 f6 4c  76 21 50 af 00 04 13 02  |<......Lv!P.....|
-00000050  00 ff 01 00 00 8b 00 00  00 0e 00 0c 00 00 09 31  |...............1|
-00000060  32 37 2e 30 2e 30 2e 31  00 0b 00 04 03 00 01 02  |27.0.0.1........|
-00000070  00 0a 00 0c 00 0a 00 1d  00 17 00 1e 00 19 00 18  |................|
-00000080  00 16 00 00 00 17 00 00  00 0d 00 1e 00 1c 04 03  |................|
-00000090  05 03 06 03 08 07 08 08  08 09 08 0a 08 0b 08 04  |................|
-000000a0  08 05 08 06 04 01 05 01  06 01 00 2b 00 03 02 03  |...........+....|
-000000b0  04 00 2d 00 02 01 01 00  33 00 26 00 24 00 1d 00  |..-.....3.&.$...|
-000000c0  20 f4 08 51 f6 69 b7 d6  a9 3e 18 a7 ee c0 30 f3  | ..Q.i...>....0.|
-000000d0  13 63 52 40 30 7c 79 6c  24 03 c9 89 25 bd a4 5f  |.cR@0|yl$...%.._|
-000000e0  64                                                |d|
+00000000  16 03 01 00 ca 01 00 00  c6 03 03 c4 ac 32 36 24  |.............26$|
+00000010  08 b0 6c 1d 1e 58 7e b3  3d 52 35 29 85 52 3a b3  |..l..X~.=R5).R:.|
+00000020  32 a2 71 86 4b 33 5d bb  b8 b8 ac 20 77 6d 45 2f  |2.q.K3].... wmE/|
+00000030  a3 fe 59 3f 9b cf 4e 60  55 84 f7 99 c2 f5 7e 1e  |..Y?..N`U.....~.|
+00000040  6f 0a 4d fe bf 13 e8 95  80 a7 7d c6 00 04 13 02  |o.M.......}.....|
+00000050  00 ff 01 00 00 79 00 0b  00 04 03 00 01 02 00 0a  |.....y..........|
+00000060  00 0c 00 0a 00 1d 00 17  00 1e 00 19 00 18 00 16  |................|
+00000070  00 00 00 17 00 00 00 0d  00 1e 00 1c 04 03 05 03  |................|
+00000080  06 03 08 07 08 08 08 09  08 0a 08 0b 08 04 08 05  |................|
+00000090  08 06 04 01 05 01 06 01  00 2b 00 03 02 03 04 00  |.........+......|
+000000a0  2d 00 02 01 01 00 33 00  26 00 24 00 1d 00 20 8f  |-.....3.&.$... .|
+000000b0  5a 28 ca 6a 1b 42 2f 1a  53 8f cc 4f 88 b3 0c ad  |Z(.j.B/.S..O....|
+000000c0  35 59 c5 10 46 ef a4 5f  1e d4 63 69 93 4f 15     |5Y..F.._..ci.O.|
 >>> Flow 2 (server to client)
 00000000  16 03 03 00 7a 02 00 00  76 03 03 00 00 00 00 00  |....z...v.......|
 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 67 73 58 d7  |........... gsX.|
-00000030  11 8b c6 0d 72 86 e0 08  3e 2d d9 b9 16 9f 85 6e  |....r...>-.....n|
-00000040  3c 87 fd 87 c3 95 f6 4c  76 21 50 af 13 02 00 00  |<......Lv!P.....|
+00000020  00 00 00 00 00 00 00 00  00 00 00 20 77 6d 45 2f  |........... wmE/|
+00000030  a3 fe 59 3f 9b cf 4e 60  55 84 f7 99 c2 f5 7e 1e  |..Y?..N`U.....~.|
+00000040  6f 0a 4d fe bf 13 e8 95  80 a7 7d c6 13 02 00 00  |o.M.......}.....|
 00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 2f  |..+.....3.$... /|
 00000060  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
 00000070  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74 14  |.........._X.;t.|
-00000080  03 03 00 01 01 17 03 03  00 17 cc b9 e4 43 5e f6  |.............C^.|
-00000090  9a 5a 62 14 02 39 fb 13  76 e8 10 db 26 1c 07 ec  |.Zb..9..v...&...|
-000000a0  06 17 03 03 02 6d 39 e9  a0 33 ee 39 36 54 62 f1  |.....m9..3.96Tb.|
-000000b0  e9 1d 32 45 0f 5a ca 72  f7 7e 43 d8 89 97 00 3d  |..2E.Z.r.~C....=|
-000000c0  59 70 08 b4 d1 e1 84 24  7a b8 45 3c b8 32 93 b5  |Yp.....$z.E<.2..|
-000000d0  51 a5 58 60 3f 60 52 aa  c1 ff 85 fb fd 50 87 38  |Q.X`?`R......P.8|
-000000e0  47 7a 88 c6 d1 e6 3c b3  16 14 5b cb 23 50 26 7a  |Gz....<...[.#P&z|
-000000f0  1d 28 d1 d2 29 5d b0 40  97 2f 3b 58 7c 8a 76 1f  |.(..)].@./;X|.v.|
-00000100  1c c1 d2 2b 63 9d 53 bc  fb c2 42 cb 40 0d d0 7c  |...+c.S...B.@..||
-00000110  73 6c dc 63 90 89 e3 66  67 2b a2 70 af e0 af fe  |sl.c...fg+.p....|
-00000120  0c c0 db 41 76 d0 16 37  2a 09 7a 79 31 03 c6 4a  |...Av..7*.zy1..J|
-00000130  f4 06 22 ac 96 b4 25 1f  54 11 24 c8 67 22 8f 2a  |.."...%.T.$.g".*|
-00000140  56 0c 24 fa 20 ed a8 37  66 f7 38 44 43 e2 e6 e3  |V.$. ..7f.8DC...|
-00000150  96 b5 d5 dd a5 2c 23 e4  57 57 7d 7a 59 e2 4f 66  |.....,#.WW}zY.Of|
-00000160  c4 29 d6 d1 32 a3 9c 4c  dd 63 b2 a6 dc ff 6f 61  |.)..2..L.c....oa|
-00000170  c2 db 88 80 23 c1 27 d4  be dd 4f b4 c9 b8 56 4c  |....#.'...O...VL|
-00000180  65 b6 f8 32 b2 60 7b af  5f 54 71 61 20 db 25 85  |e..2.`{._Tqa .%.|
-00000190  34 b6 58 9b 71 01 dd 53  cd 13 65 2e 23 69 96 0e  |4.X.q..S..e.#i..|
-000001a0  89 94 75 09 64 60 76 d2  65 85 38 3d f1 0e cb 47  |..u.d`v.e.8=...G|
-000001b0  c1 2c 52 f8 ce 7a a6 9f  dd 7c 39 7e a7 f9 a6 1b  |.,R..z...|9~....|
-000001c0  c1 23 81 a6 7a b1 6c d4  3c 1c f3 71 ce 72 24 01  |.#..z.l.<..q.r$.|
-000001d0  4a 8d e9 24 47 51 73 67  dc 7a 9f 0b 63 7d 29 e1  |J..$GQsg.z..c}).|
-000001e0  3e 5e ac 72 d7 c8 d9 c2  13 de 92 dd 04 cb 09 21  |>^.r...........!|
-000001f0  ad 41 69 27 77 48 eb 87  cb 3b 23 ba 06 a3 68 96  |.Ai'wH...;#...h.|
-00000200  ad 24 35 f6 a6 03 87 a7  4d 9f d4 bf e5 8b 9f 56  |.$5.....M......V|
-00000210  54 dd 0e 08 da 29 ff eb  9b e1 0a a5 25 b1 85 be  |T....)......%...|
-00000220  f8 ae 63 f4 49 64 cc 0a  41 0e 26 8a 8e bc 6f c9  |..c.Id..A.&...o.|
-00000230  f5 41 55 80 0d bd 70 ad  85 b0 d4 8d 33 ac b6 40  |.AU...p.....3..@|
-00000240  3e 76 fc fb 8f d2 7d 06  14 d4 45 24 6e 36 46 1c  |>v....}...E$n6F.|
-00000250  06 d3 f7 f3 4c 3a a5 83  4f 75 72 77 b4 5e 37 49  |....L:..Ourw.^7I|
-00000260  41 f1 9f e6 d1 46 87 56  c8 64 28 fd 38 f0 0f 9c  |A....F.V.d(.8...|
-00000270  d0 39 ff 4b 46 56 73 0d  12 7d bf 63 b4 b8 0d 33  |.9.KFVs..}.c...3|
-00000280  6b 4a 2b f8 39 67 f1 ec  2d a6 0b 5c 91 2d d8 3e  |kJ+.9g..-..\.-.>|
-00000290  91 81 1a 37 29 c7 14 d2  be db 31 61 dc 5d b1 e4  |...7).....1a.]..|
-000002a0  64 af 14 9c 93 85 e7 5b  0e 42 63 c7 5e b5 cc 51  |d......[.Bc.^..Q|
-000002b0  ca 83 ca fa 52 bd 44 a1  1c 76 20 bc 3d 9f 82 79  |....R.D..v .=..y|
-000002c0  20 5c 01 14 e3 07 02 4c  f6 87 f7 46 b8 de 47 23  | \.....L...F..G#|
-000002d0  5d 5c b3 8f cd 96 49 51  32 3f d2 5d 92 32 19 b5  |]\....IQ2?.].2..|
-000002e0  10 33 46 37 f0 b5 82 23  a5 91 1f 60 fb 21 2c 08  |.3F7...#...`.!,.|
-000002f0  c3 6e 17 72 0b 5d c9 7b  cc 77 97 6f 20 d9 a6 fa  |.n.r.].{.w.o ...|
-00000300  cc 4a bb c6 3b 0e b1 66  ae 57 f5 1b 16 46 36 b7  |.J..;..f.W...F6.|
-00000310  a5 94 ae 17 03 03 00 99  d7 86 a0 5f c0 d2 33 3e  |..........._..3>|
-00000320  ce ce ea db cb a1 a5 11  b7 cc a1 48 b6 86 f5 11  |...........H....|
-00000330  d6 32 8c f9 e8 bb e3 3e  ea 6f 1a df 64 cd c8 7d  |.2.....>.o..d..}|
-00000340  e9 cb e4 19 fe cd 75 74  03 4a fe 91 1d 87 28 65  |......ut.J....(e|
-00000350  25 79 3a 19 13 ba 67 16  aa 7e 8e c0 e6 53 4f bb  |%y:...g..~...SO.|
-00000360  98 ed cc 59 db 5e 73 23  d4 a9 a7 2a 6d 01 73 4a  |...Y.^s#...*m.sJ|
-00000370  e6 65 2e c0 34 49 c1 d8  70 2e 70 1b 10 97 74 23  |.e..4I..p.p...t#|
-00000380  fe 6b 5d cd fa 71 c8 43  c3 5b 42 5c 7b e0 9e 3f  |.k]..q.C.[B\{..?|
-00000390  a8 3d a9 d1 97 17 87 80  af 7c 5d 8b 70 ba 87 06  |.=.......|].p...|
-000003a0  67 dd 29 df f3 ca 9a f4  c8 93 e8 f8 ac c0 df 8e  |g.).............|
-000003b0  c5 17 03 03 00 45 40 a4  26 66 29 18 b8 d6 a7 87  |.....E@.&f).....|
-000003c0  91 5f 6d 79 13 f8 7a 47  cf ac 93 7c 11 cb 4a b2  |._my..zG...|..J.|
-000003d0  24 a6 40 fb d4 ed 71 ec  19 53 ba ae e0 bb e6 cf  |$.@...q..S......|
-000003e0  d6 8a a6 3c 6a 4e a3 6f  6c d7 2d e1 8a a4 6c da  |...<jN.ol.-...l.|
-000003f0  a1 ab fd c0 de 59 e9 18  fc 47 f2 17 03 03 00 a3  |.....Y...G......|
-00000400  5b 85 84 a4 0d ff be 3e  ea 00 71 3d ea be c7 e2  |[......>..q=....|
-00000410  dc 2f 4a 62 c2 9f e2 e5  16 51 ff 35 a7 70 df 12  |./Jb.....Q.5.p..|
-00000420  23 d6 f7 6c 96 91 7f 0f  6d d4 45 5f c6 8c c5 93  |#..l....m.E_....|
-00000430  b1 b7 46 ef f0 f4 a3 68  35 ff 09 38 8d 6d c6 84  |..F....h5..8.m..|
-00000440  d3 1c 4d 48 4e fc 4a c0  46 06 b1 a5 1c 74 a0 44  |..MHN.J.F....t.D|
-00000450  69 68 20 33 df 70 60 69  57 c7 85 bd 3e ed 55 d0  |ih 3.p`iW...>.U.|
-00000460  56 84 8f 19 03 5a 54 9a  d5 3e 5d 37 98 40 4c f0  |V....ZT..>]7.@L.|
-00000470  5e f1 26 e5 97 01 fc 0f  2a 09 e9 7a 51 69 c0 8e  |^.&.....*..zQi..|
-00000480  d4 25 80 f4 ca 91 f3 a7  5c 0c 96 ba ec a8 b5 ee  |.%......\.......|
-00000490  ab ec 05 cb 99 30 78 48  1b 78 bf 3d b9 f4 e8 33  |.....0xH.x.=...3|
-000004a0  4d 45 d1                                          |ME.|
+00000080  03 03 00 01 01 17 03 03  00 17 e4 b2 43 7d 15 fc  |............C}..|
+00000090  ae 58 44 9d 0d 82 a4 1c  21 c4 3f 86 fb 4b 6b d1  |.XD.....!.?..Kk.|
+000000a0  96 17 03 03 02 6d 03 84  7a 2c 7e d8 c8 ca 31 07  |.....m..z,~...1.|
+000000b0  fc 2c 47 5b e4 c1 e1 5f  1a c9 a0 45 4e 9a 3d 63  |.,G[..._...EN.=c|
+000000c0  11 3b 26 d7 05 e3 6c 36  c3 49 46 c3 73 4e ee 97  |.;&...l6.IF.sN..|
+000000d0  dc 4e 09 f4 22 0f 34 05  e1 84 d5 ed 76 a1 4e ba  |.N..".4.....v.N.|
+000000e0  7c d7 9c 9d 16 ae 96 0f  62 41 64 80 ed fc 4c 1e  ||.......bAd...L.|
+000000f0  75 a4 5a fe bf 7c 95 6f  81 ef bb e9 9c 69 63 df  |u.Z..|.o.....ic.|
+00000100  b0 07 d1 4f 1e 96 9e c9  a4 09 d6 79 f2 33 58 eb  |...O.......y.3X.|
+00000110  78 a5 a7 29 27 58 1b 99  79 79 e3 1d 61 6e fd 7b  |x..)'X..yy..an.{|
+00000120  c8 7f c6 07 3a f5 23 d6  4d 7a 74 af 53 f6 b1 63  |....:.#.Mzt.S..c|
+00000130  2f eb 51 65 b5 91 ac af  4b bf 9e 98 90 8a ae 02  |/.Qe....K.......|
+00000140  86 35 78 66 13 2c de 95  5b e1 d8 78 18 bf 65 8f  |.5xf.,..[..x..e.|
+00000150  a2 30 ae e7 fa aa ac bc  44 72 03 f5 86 b1 1b c2  |.0......Dr......|
+00000160  d5 61 dc 4d 74 47 73 67  f1 43 11 1a 95 6f e3 88  |.a.MtGsg.C...o..|
+00000170  51 9a 4b c7 bd dc 36 8f  5d de 56 4c 8d 30 8d ec  |Q.K...6.].VL.0..|
+00000180  08 0b 90 be c8 dc df 7d  6e e7 85 c9 ab dd be a9  |.......}n.......|
+00000190  57 c4 6a 76 36 bb a8 4b  e2 be d1 28 67 3b a9 0c  |W.jv6..K...(g;..|
+000001a0  a1 78 2e e4 af f4 51 a3  f5 8c b3 8d c8 7c 8e e7  |.x....Q......|..|
+000001b0  d2 7f 38 91 04 42 f4 e9  ae e2 3a 3d 37 10 78 f3  |..8..B....:=7.x.|
+000001c0  2d 9c 9f f7 4f 49 f0 45  bd 1e 8d 7d e3 84 b9 9a  |-...OI.E...}....|
+000001d0  75 40 fb 2b 4f 71 2d b7  bd 1a 6e 4a 7a b4 53 f8  |u@.+Oq-...nJz.S.|
+000001e0  d7 c9 6e d9 f6 7b de fa  f0 12 5d fc c0 71 1a bf  |..n..{....]..q..|
+000001f0  76 d8 c4 ad c5 f7 e2 79  55 79 40 e5 55 ee bc dc  |v......yUy@.U...|
+00000200  42 06 97 89 da 2d a7 e9  26 e4 82 e1 63 5f e2 ee  |B....-..&...c_..|
+00000210  1a 37 6d 65 bf d7 5f 2e  86 a5 a8 4d b2 e1 31 2f  |.7me.._....M..1/|
+00000220  8b c5 0b 88 03 bf 1f 37  8c 96 ec 54 4f 75 9b f9  |.......7...TOu..|
+00000230  00 98 96 e6 db c1 24 94  6a d1 dd f7 9b d2 2e 24  |......$.j......$|
+00000240  82 c7 34 5a f6 aa 36 5b  b7 63 11 b2 1d 15 a6 48  |..4Z..6[.c.....H|
+00000250  74 5c a7 70 a9 c4 fc 14  67 51 7e 16 7c 90 5b 64  |t\.p....gQ~.|.[d|
+00000260  ff 49 02 f6 4d 7a c2 f9  d7 1d 47 4b de bf ae ca  |.I..Mz....GK....|
+00000270  03 56 84 31 01 37 80 85  79 fb d8 f4 72 9f 98 a3  |.V.1.7..y...r...|
+00000280  44 d4 52 f8 af 8c 98 d8  66 69 f7 71 58 db 42 fa  |D.R.....fi.qX.B.|
+00000290  d7 c9 05 d1 9d 7a df 9f  a9 b1 12 53 d2 70 fa ca  |.....z.....S.p..|
+000002a0  7e a6 de 8d ed 08 69 b2  34 45 3a a5 ba 1d 2e d8  |~.....i.4E:.....|
+000002b0  d5 ee ee 60 16 18 cc e1  db aa e6 1b 19 5a ec e6  |...`.........Z..|
+000002c0  b8 ec 51 46 99 6d 1e 83  9b 9d 44 a7 85 5a 10 23  |..QF.m....D..Z.#|
+000002d0  74 a3 b6 09 b5 d7 2a 12  6a e2 2a da 5d 87 d9 fe  |t.....*.j.*.]...|
+000002e0  b6 c7 8f c8 03 27 b0 6e  98 57 6f e4 d5 8b 88 5d  |.....'.n.Wo....]|
+000002f0  0a b3 c4 a1 ae df 89 53  af d5 8e 59 97 2d 65 c0  |.......S...Y.-e.|
+00000300  52 e8 5f 8a 37 3f 8b ef  77 fc 93 0c b5 50 3b 94  |R._.7?..w....P;.|
+00000310  13 1b 3b 17 03 03 00 99  3e e8 05 5a 69 dc 0c 90  |..;.....>..Zi...|
+00000320  a3 17 35 ea 27 2b da 64  44 72 30 5b 9c a5 6b 1b  |..5.'+.dDr0[..k.|
+00000330  c2 a8 af 38 c3 43 52 14  fd ec a8 8b c9 ab 6b 67  |...8.CR.......kg|
+00000340  32 84 f9 b4 e1 89 08 8f  6a c2 2a 17 b9 f5 92 c8  |2.......j.*.....|
+00000350  3a 97 62 98 b8 93 94 5d  a1 6b 05 17 56 5d 6e b5  |:.b....].k..V]n.|
+00000360  d3 72 a6 06 77 b2 45 fe  2d 37 10 7e b8 16 16 f4  |.r..w.E.-7.~....|
+00000370  70 86 56 a4 be 52 54 3e  90 7d 47 66 23 35 e9 a2  |p.V..RT>.}Gf#5..|
+00000380  e9 4f 86 e2 a7 b9 20 b6  c8 9f 19 08 6b 73 93 86  |.O.... .....ks..|
+00000390  d7 8d 1a 9a 00 6b cf fb  cb 32 5d 36 91 4f 39 e2  |.....k...2]6.O9.|
+000003a0  f5 0d fa 37 3d b8 c6 86  cb 57 71 a8 c6 f8 74 cb  |...7=....Wq...t.|
+000003b0  c0 17 03 03 00 45 67 fe  1b 83 1a bf ac 3b ee 0f  |.....Eg......;..|
+000003c0  31 35 da 42 6c e3 3f 14  63 4a f3 5b 5b 02 76 c8  |15.Bl.?.cJ.[[.v.|
+000003d0  21 84 7e 11 42 e3 8c e7  b6 7c 1d ba 41 ec dd 68  |!.~.B....|..A..h|
+000003e0  73 4a 1b c5 bc 11 fa 22  33 9b 51 7d f0 27 88 4a  |sJ....."3.Q}.'.J|
+000003f0  1b bf e8 a9 3f f5 2f 9a  05 ce 07 17 03 03 00 9b  |....?./.........|
+00000400  da 09 d0 83 a3 24 92 94  b7 9f 34 10 7b 1c b9 e4  |.....$....4.{...|
+00000410  ca 56 c9 8f 71 03 99 0b  c5 ea 6d 50 6d 75 dd 7b  |.V..q.....mPmu.{|
+00000420  28 4d 5c 6e 32 83 61 36  68 0b 64 ac b7 6b ec bb  |(M\n2.a6h.d..k..|
+00000430  22 72 56 4b 6a 58 98 a2  62 9c 15 28 fa a8 38 a3  |"rVKjX..b..(..8.|
+00000440  63 b7 8b d4 3d 63 3f 64  34 45 e2 f1 ad e6 3e 66  |c...=c?d4E....>f|
+00000450  8e 45 5f 3e ca fc 5e a8  40 17 a9 ac c6 52 e4 4e  |.E_>..^.@....R.N|
+00000460  14 15 0b a1 00 db 8c a2  dd 41 35 74 1f f4 06 ac  |.........A5t....|
+00000470  72 8c 86 1f a9 de 6d 1c  24 6d 2d 37 f2 dd 1a f9  |r.....m.$m-7....|
+00000480  60 0d 48 fc 8e a3 97 5a  9b 6b 99 13 77 4c f8 bf  |`.H....Z.k..wL..|
+00000490  b3 e5 db 07 31 3d b9 a9  56 9f c2                 |....1=..V..|
 >>> Flow 3 (client to server)
-00000000  14 03 03 00 01 01 17 03  03 00 45 54 0e c1 aa 95  |..........ET....|
-00000010  fd c5 d2 8b a0 ae 40 a1  9a b8 87 39 17 53 f7 10  |......@....9.S..|
-00000020  62 6f 55 18 42 cf 75 cb  05 de 32 28 c4 a0 f1 17  |boU.B.u...2(....|
-00000030  f1 55 ae 2c 97 9e dd d2  d0 a7 6b c6 51 51 c6 0c  |.U.,......k.QQ..|
-00000040  81 3f 04 db 94 e6 68 f0  a1 80 10 39 06 99 25 e2  |.?....h....9..%.|
+00000000  14 03 03 00 01 01 17 03  03 00 45 2a e9 8b e0 d6  |..........E*....|
+00000010  52 b2 a9 01 20 d1 48 61  5e 6a c3 cf 79 14 f3 c0  |R... .Ha^j..y...|
+00000020  8e 1f 76 2b 16 d5 53 c8  ae a8 a5 7b 14 aa 8c 4b  |..v+..S....{...K|
+00000030  5d 76 e6 dd 5b b9 1f 87  39 62 f6 e5 72 13 1e d0  |]v..[...9b..r...|
+00000040  48 06 f5 d9 ce b8 4d 32  42 49 f1 dd 52 96 e5 68  |H.....M2BI..R..h|
 >>> Flow 4 (server to client)
-00000000  17 03 03 00 1e e4 4f d5  b0 e7 a0 e2 13 69 75 7c  |......O......iu||
-00000010  b1 84 93 be 99 ea 27 20  dd 08 89 6c e2 5a c6 bc  |......' ...l.Z..|
-00000020  b8 41 3d 17 03 03 00 13  cf 64 ad ad d9 84 87 36  |.A=......d.....6|
-00000030  b9 ea b8 76 97 93 c1 03  44 c5 de                 |...v....D..|
+00000000  17 03 03 00 1e 97 3a d5  e2 f1 22 da d5 0a 3a 2c  |......:..."...:,|
+00000010  c1 c0 53 ff 44 bd 06 02  02 eb b6 91 c5 b3 d7 c7  |..S.D...........|
+00000020  c2 6e 56 17 03 03 00 13  af c2 91 94 6e db 5e 62  |.nV.........n.^b|
+00000030  9a 1e 40 e4 50 a1 b4 9c  16 45 be                 |..@.P....E.|
diff --git a/src/crypto/tls/testdata/Server-TLSv13-ALPN b/src/crypto/tls/testdata/Server-TLSv13-ALPN
index df8dd45..7537272 100644
--- a/src/crypto/tls/testdata/Server-TLSv13-ALPN
+++ b/src/crypto/tls/testdata/Server-TLSv13-ALPN
@@ -1,9 +1,9 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 e2 01 00 00  de 03 03 8e d2 a1 8f ea  |................|
-00000010  e3 7d 5f 7c 70 74 c3 7e  5f 06 bb 21 35 28 38 7a  |.}_|pt.~_..!5(8z|
-00000020  7f 00 11 86 6e ac 19 38  7f d4 88 20 33 3a b2 14  |....n..8... 3:..|
-00000030  c2 4e 6a 39 71 24 81 21  27 21 2d b7 3d bc 5e 97  |.Nj9q$.!'!-.=.^.|
-00000040  f8 ed 55 83 be 9a d3 27  b5 e0 0e bd 00 04 13 03  |..U....'........|
+00000000  16 03 01 00 e2 01 00 00  de 03 03 35 09 24 92 91  |...........5.$..|
+00000010  f9 de f8 f0 68 a2 6d f2  e6 2a df de f1 7c c4 44  |....h.m..*...|.D|
+00000020  7b 22 14 03 29 2a f2 1b  6c a2 0e 20 e4 bc 0e 83  |{"..)*..l.. ....|
+00000030  35 d7 c1 4c ea 8f ba 77  32 ae c9 44 b0 51 16 05  |5..L...w2..D.Q..|
+00000040  06 03 6b c9 23 06 42 26  80 25 6d 67 00 04 13 03  |..k.#.B&.%mg....|
 00000050  00 ff 01 00 00 91 00 0b  00 04 03 00 01 02 00 0a  |................|
 00000060  00 0c 00 0a 00 1d 00 17  00 1e 00 19 00 18 00 23  |...............#|
 00000070  00 00 00 10 00 10 00 0e  06 70 72 6f 74 6f 32 06  |.........proto2.|
@@ -11,90 +11,90 @@
 00000090  00 1e 00 1c 04 03 05 03  06 03 08 07 08 08 08 09  |................|
 000000a0  08 0a 08 0b 08 04 08 05  08 06 04 01 05 01 06 01  |................|
 000000b0  00 2b 00 03 02 03 04 00  2d 00 02 01 01 00 33 00  |.+......-.....3.|
-000000c0  26 00 24 00 1d 00 20 89  4d b8 22 62 39 22 e6 5a  |&.$... .M."b9".Z|
-000000d0  b1 86 ea c9 d9 d1 77 c9  12 c3 62 e1 8e 17 cb ab  |......w...b.....|
-000000e0  91 83 d8 af 9b be 0a                              |.......|
+000000c0  26 00 24 00 1d 00 20 59  cf 4e a0 d2 89 c8 fd 8b  |&.$... Y.N......|
+000000d0  22 e8 ce 43 a4 b4 2b b3  9f 12 46 c0 21 2a 10 55  |"..C..+...F.!*.U|
+000000e0  fd a7 6f 65 04 51 21                              |..oe.Q!|
 >>> Flow 2 (server to client)
 00000000  16 03 03 00 7a 02 00 00  76 03 03 00 00 00 00 00  |....z...v.......|
 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 33 3a b2 14  |........... 3:..|
-00000030  c2 4e 6a 39 71 24 81 21  27 21 2d b7 3d bc 5e 97  |.Nj9q$.!'!-.=.^.|
-00000040  f8 ed 55 83 be 9a d3 27  b5 e0 0e bd 13 03 00 00  |..U....'........|
+00000020  00 00 00 00 00 00 00 00  00 00 00 20 e4 bc 0e 83  |........... ....|
+00000030  35 d7 c1 4c ea 8f ba 77  32 ae c9 44 b0 51 16 05  |5..L...w2..D.Q..|
+00000040  06 03 6b c9 23 06 42 26  80 25 6d 67 13 03 00 00  |..k.#.B&.%mg....|
 00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 2f  |..+.....3.$... /|
 00000060  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
 00000070  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74 14  |.........._X.;t.|
-00000080  03 03 00 01 01 17 03 03  00 24 60 9e a3 43 47 75  |.........$`..CGu|
-00000090  d2 38 11 fd 9d da a5 f6  65 de 3c 2a 3d a9 46 7e  |.8......e.<*=.F~|
-000000a0  50 c8 52 a1 7d e6 95 a7  4b 48 b7 35 e7 a7 17 03  |P.R.}...KH.5....|
-000000b0  03 02 6d b8 30 43 88 03  d4 6c cf c6 45 80 b2 6c  |..m.0C...l..E..l|
-000000c0  52 d7 1e 08 de 0b 6e 7a  27 c8 2c 59 d4 03 41 24  |R.....nz'.,Y..A$|
-000000d0  e3 4a e1 d3 85 68 de 23  f6 c4 3a bb 45 ae b1 ac  |.J...h.#..:.E...|
-000000e0  8b b3 22 7d e7 a6 7c e3  07 68 b1 9c 97 6a d3 e4  |.."}..|..h...j..|
-000000f0  5d 0a 73 a3 16 ad e4 7f  b9 d7 0a b7 7c 48 bb f2  |].s.........|H..|
-00000100  ed 49 61 f7 cb 5e ea d2  d9 a3 73 ea a7 4f a3 10  |.Ia..^....s..O..|
-00000110  f7 3e 8f ce b9 56 a0 88  54 52 59 1f f3 55 2b 15  |.>...V..TRY..U+.|
-00000120  df fd fa 85 9e 20 ff 72  f3 26 6a 2c 1f 11 a8 3d  |..... .r.&j,...=|
-00000130  8e 66 75 aa 90 fc 9f 9f  a7 67 8f ac 98 54 19 04  |.fu......g...T..|
-00000140  c9 1f 48 f7 ed 8f 13 0a  f9 6c 9b f8 e9 0a c5 a9  |..H......l......|
-00000150  f2 ef 5b 65 a1 ad 40 e4  e7 ff c1 ff e9 d6 ab 5c  |..[e..@........\|
-00000160  f8 f1 7b 4d 39 33 1d 68  d3 38 20 10 c4 3b 7a 9f  |..{M93.h.8 ..;z.|
-00000170  fe 55 1d 83 5c 8f 67 d0  bb 5f 32 80 b2 91 38 0a  |.U..\.g.._2...8.|
-00000180  71 bb b4 3a 10 1c 98 f9  d4 19 7c 7d d5 f7 4b 0a  |q..:......|}..K.|
-00000190  02 2f bd 0b f9 ff 28 b2  2d ba dd 7f 0d 51 a2 4c  |./....(.-....Q.L|
-000001a0  51 92 1e e9 47 51 ae 1a  d0 66 9c ef 0a 02 dc 69  |Q...GQ...f.....i|
-000001b0  95 79 2b b0 8f 7b a2 3d  57 cf 5c 7e b4 0a 91 34  |.y+..{.=W.\~...4|
-000001c0  e6 d0 0d 93 1b 6c 61 9e  58 12 47 5f 3a ec 67 19  |.....la.X.G_:.g.|
-000001d0  d8 fb 44 43 4d cd 4e ad  1d bc f2 05 66 42 3f 3f  |..DCM.N.....fB??|
-000001e0  85 5d 93 56 8e ca 62 47  38 ee d2 0e 81 8b 71 7d  |.].V..bG8.....q}|
-000001f0  d8 cf 6e 4b 61 80 fe 28  34 f4 f1 58 06 36 2a 40  |..nKa..(4..X.6*@|
-00000200  93 98 3d d0 9c 69 6f 6a  3a 40 b9 8c 2e 71 5d 52  |..=..ioj:@...q]R|
-00000210  66 5d 55 45 e7 38 b7 ce  74 c2 1c ae 2e 4a 03 86  |f]UE.8..t....J..|
-00000220  d4 15 c3 40 d9 58 b7 ba  ed 84 fd 20 35 a4 1c c6  |...@.X..... 5...|
-00000230  8a 50 7a 0c 87 53 d7 2d  4b 5b 7d 23 79 8f 66 f8  |.Pz..S.-K[}#y.f.|
-00000240  72 05 72 7b 7d 7a 64 97  8d da c9 dd 23 6a 44 b6  |r.r{}zd.....#jD.|
-00000250  e1 99 e4 45 76 a5 53 d8  1b 54 a0 b9 9e ec 0e d3  |...Ev.S..T......|
-00000260  91 1b 5e c0 a7 c8 3a 34  22 f9 58 7d da 2b f4 fd  |..^...:4".X}.+..|
-00000270  2b 9a 9e 26 20 6f d3 9d  e9 48 a1 62 70 fe 06 04  |+..& o...H.bp...|
-00000280  c2 63 f7 c4 a2 b9 74 28  a8 b3 f9 f0 a1 2a 46 0c  |.c....t(.....*F.|
-00000290  f5 6b cc 7e b4 c0 47 eb  00 96 6a 3d 32 58 e0 0a  |.k.~..G...j=2X..|
-000002a0  59 01 3c 42 45 a7 76 6d  78 05 1f 2c db a4 08 5b  |Y.<BE.vmx..,...[|
-000002b0  e8 8e b1 10 cb a9 d9 e5  c3 a4 5a f7 63 30 c7 ac  |..........Z.c0..|
-000002c0  8d 62 14 9d 30 ee 9f 9f  1b c4 ca 7f e8 d4 64 2a  |.b..0.........d*|
-000002d0  46 0d 43 e1 bd 4e ed 83  f1 6b 33 78 ed 8e 98 58  |F.C..N...k3x...X|
-000002e0  13 c5 7a 8a b3 20 c4 db  17 1a 83 7d 04 ec ae 02  |..z.. .....}....|
-000002f0  cd ef 9b 27 5a f0 94 0d  71 24 bf 6f 31 c4 05 a3  |...'Z...q$.o1...|
-00000300  ca b5 bf 5d cb 23 e7 76  75 b0 2e 8b d7 65 60 12  |...].#.vu....e`.|
-00000310  97 8b 02 6c 4a ba 44 2d  a3 e8 47 ff 0e cd 7e a1  |...lJ.D-..G...~.|
-00000320  17 03 03 00 99 a9 d7 60  8b 76 f6 fa 62 91 32 fe  |.......`.v..b.2.|
-00000330  70 3f a1 87 36 b3 d0 01  22 61 76 4f 62 52 26 08  |p?..6..."avObR&.|
-00000340  06 db 41 b9 f6 57 ed 7f  7d 69 5b 19 37 f1 8c 99  |..A..W..}i[.7...|
-00000350  c1 8f d8 45 ab 6f 30 5f  11 34 12 9e 18 7a e9 8d  |...E.o0_.4...z..|
-00000360  33 23 c1 61 19 f7 3b 90  60 04 86 53 7d a0 be e9  |3#.a..;.`..S}...|
-00000370  c8 48 19 ef 99 16 54 e1  82 7f e9 7c b4 50 bd d0  |.H....T....|.P..|
-00000380  75 31 69 77 f5 d5 64 41  82 21 5c aa a9 a6 b2 cf  |u1iw..dA.!\.....|
-00000390  d6 73 d3 79 3f b5 ba cb  d4 4a 70 ae b8 9a d8 0f  |.s.y?....Jp.....|
-000003a0  24 47 3a 30 31 6e 4c 79  a4 28 63 6e 2b 90 1c 6d  |$G:01nLy.(cn+..m|
-000003b0  00 6e e3 90 60 fb d2 96  66 f9 a2 c0 af c9 17 03  |.n..`...f.......|
-000003c0  03 00 35 f6 41 b8 95 b6  98 56 4b 39 4f 42 8a 88  |..5.A....VK9OB..|
-000003d0  35 f1 15 7f 7a e0 0e 04  a8 6f 02 f0 64 e8 83 f2  |5...z....o..d...|
-000003e0  2f 03 2e 1f 24 0f 7a 4e  36 2d f7 54 9e ad 22 15  |/...$.zN6-.T..".|
-000003f0  f5 57 8f 19 f0 f0 46 11  17 03 03 00 93 26 4a 78  |.W....F......&Jx|
-00000400  60 d7 d6 5c 18 17 12 f5  a7 c5 42 de 63 6a cb 10  |`..\......B.cj..|
-00000410  c3 a1 66 57 85 0e 78 50  99 77 aa 5e 8f fb 0d 59  |..fW..xP.w.^...Y|
-00000420  f0 09 b1 b1 10 be a5 64  e1 85 48 79 8d b6 07 52  |.......d..Hy...R|
-00000430  05 bb aa 0d 46 42 dd 1d  1b 2e a7 cb 28 cd 97 24  |....FB......(..$|
-00000440  8e d4 7a 2d 1c 4a 25 12  eb 25 0b 14 40 94 0e 5d  |..z-.J%..%..@..]|
-00000450  d0 04 9c 87 88 44 d5 70  c6 3d 0b 3f 10 19 cc 18  |.....D.p.=.?....|
-00000460  c5 89 b8 c3 5d 5f 3e 96  cc 9b 63 e9 f3 b1 66 2f  |....]_>...c...f/|
-00000470  24 2a 06 1b f3 91 a7 7c  dd d9 b5 1f b3 9e 7f ce  |$*.....|........|
-00000480  db 96 cd 2e 36 69 f0 94  0c 5f e8 0b 15 6a 38 40  |....6i..._...j8@|
+00000080  03 03 00 01 01 17 03 03  00 24 7a a5 d4 28 fe 61  |.........$z..(.a|
+00000090  12 68 43 19 5a 01 88 e7  ae 24 e4 6f d3 c6 e7 13  |.hC.Z....$.o....|
+000000a0  32 aa 80 56 e2 1b 8c bb  5f ee 33 5f 86 8e 17 03  |2..V...._.3_....|
+000000b0  03 02 6d ee 98 f9 eb 4c  74 7f 2b 73 22 7e 79 e7  |..m....Lt.+s"~y.|
+000000c0  ed ed 93 f5 0b 68 0b 5a  14 79 45 83 9a b7 ea e7  |.....h.Z.yE.....|
+000000d0  9b 89 21 97 c4 dc cd 89  e7 27 44 d9 5c de a2 79  |..!......'D.\..y|
+000000e0  5c bb 9b f1 4a fc 3e 04  64 b4 70 cc 30 a3 3a bc  |\...J.>.d.p.0.:.|
+000000f0  4c d3 4d 90 b8 1c cf 3f  ad 63 12 a6 b7 df 6a a5  |L.M....?.c....j.|
+00000100  03 1f a6 96 d5 94 ea fd  fc a3 95 2b 38 cb 25 47  |...........+8.%G|
+00000110  63 d4 42 10 2c 91 d3 d9  12 79 e2 ba 3e 0b 82 09  |c.B.,....y..>...|
+00000120  c6 02 ee 55 14 17 73 3e  11 17 e9 d7 b5 9c d2 b7  |...U..s>........|
+00000130  d7 2f f0 23 51 a1 d3 71  68 9d 4c 01 98 a9 07 e0  |./.#Q..qh.L.....|
+00000140  b0 fd f8 74 0c bc eb 5e  57 1d 48 65 ac 80 d4 f4  |...t...^W.He....|
+00000150  4e 56 1d 89 ce ab 21 5e  5f a0 5c ed a3 e7 07 5d  |NV....!^_.\....]|
+00000160  c3 d9 9d 31 62 e0 91 2b  c6 e2 5c f6 69 2a 06 b8  |...1b..+..\.i*..|
+00000170  e1 24 92 39 7b 06 58 72  a1 84 87 c4 e9 53 83 12  |.$.9{.Xr.....S..|
+00000180  2a 03 24 6a 9d 84 55 30  04 15 7b 68 88 46 75 6e  |*.$j..U0..{h.Fun|
+00000190  3f 0a f7 e8 9f 64 04 32  b7 5e 8c 64 82 ec 6d 9b  |?....d.2.^.d..m.|
+000001a0  e0 41 33 69 e4 75 51 d9  e3 ba 7a 9e 7b 8f b7 3e  |.A3i.uQ...z.{..>|
+000001b0  bc 30 3a 55 10 81 ec 1f  f9 c1 77 30 3d 7e 3f b5  |.0:U......w0=~?.|
+000001c0  db 44 a5 54 d1 b3 81 64  20 5d 8d 31 48 19 5a 2f  |.D.T...d ].1H.Z/|
+000001d0  4a b9 b2 31 b8 56 f4 9c  9d ac 35 5d 54 55 0b 09  |J..1.V....5]TU..|
+000001e0  e0 10 13 47 b1 ad 3f 9b  62 39 84 4e 49 99 d0 38  |...G..?.b9.NI..8|
+000001f0  fe 7d 8b f2 a5 50 ab 62  54 85 7f 70 ae 51 13 6a  |.}...P.bT..p.Q.j|
+00000200  7a 5d eb cd c6 e2 29 47  a6 e0 a2 b1 46 da bc 7c  |z]....)G....F..||
+00000210  38 8b 45 a7 07 c1 f4 e6  fe f0 83 24 fa 87 d1 17  |8.E........$....|
+00000220  d1 6b 0d 6f 96 2a 28 35  81 5c 78 6e a8 16 f9 0a  |.k.o.*(5.\xn....|
+00000230  71 47 72 5d 21 ad b9 93  63 16 b9 58 e6 22 66 86  |qGr]!...c..X."f.|
+00000240  b5 43 c0 91 c9 cd 70 8e  f9 c0 38 c9 4d 04 fa 39  |.C....p...8.M..9|
+00000250  e1 02 46 59 85 67 38 35  ce 84 ec b9 34 50 84 03  |..FY.g85....4P..|
+00000260  82 12 75 ee 4a c5 db 61  d1 31 2e c5 62 88 cb 10  |..u.J..a.1..b...|
+00000270  c9 bc 65 7b cd df d5 0a  56 75 81 a0 a8 f0 ee 54  |..e{....Vu.....T|
+00000280  f5 b3 c8 36 13 c7 6d 95  4a 72 61 d9 98 c4 08 dc  |...6..m.Jra.....|
+00000290  7f 35 de 4c 5b aa 6f 7d  6d f2 e0 e2 46 1f 5d 72  |.5.L[.o}m...F.]r|
+000002a0  a5 c1 ee 5e af 34 44 8b  07 90 9a 2f d3 3e cf 8d  |...^.4D..../.>..|
+000002b0  69 54 19 ae 3e c2 89 55  5e 0b 98 e1 24 c5 6b 88  |iT..>..U^...$.k.|
+000002c0  2e 67 83 9e cc 97 b0 06  58 7d 5f 82 55 21 d3 79  |.g......X}_.U!.y|
+000002d0  04 d8 2e 59 08 67 78 70  ee bc 9b 26 12 50 da 5a  |...Y.gxp...&.P.Z|
+000002e0  40 66 45 b8 36 16 50 5b  93 15 a9 a8 c0 85 34 ee  |@fE.6.P[......4.|
+000002f0  d2 ee 4e 7d 66 28 f6 65  5c 88 3c b1 de e9 de 8b  |..N}f(.e\.<.....|
+00000300  e8 b2 51 d7 f0 51 69 fd  fe f1 8c 57 df 3f d5 40  |..Q..Qi....W.?.@|
+00000310  e8 54 a0 b2 59 e1 75 27  fc fd b7 41 d9 ad 49 5e  |.T..Y.u'...A..I^|
+00000320  17 03 03 00 99 2c 47 73  11 39 91 57 05 d0 f6 0f  |.....,Gs.9.W....|
+00000330  8c 6c f2 66 a0 d1 cd 3f  80 3c bb f3 27 78 83 64  |.l.f...?.<..'x.d|
+00000340  4d 33 de b8 f5 8b 27 a9  1f 8b 75 9f b2 c6 d7 08  |M3....'...u.....|
+00000350  13 8e 73 a6 81 0e 71 fd  7b 33 87 c2 23 6f bc ad  |..s...q.{3..#o..|
+00000360  9b e6 60 91 12 3f 74 de  8f 7c 49 9f 0a 74 cc e0  |..`..?t..|I..t..|
+00000370  68 e3 50 cc ca 2f a2 30  a9 32 31 ec 92 5f 4d d1  |h.P../.0.21.._M.|
+00000380  39 f1 4d f6 2d 21 3c 54  33 38 a2 46 c0 7a 55 8c  |9.M.-!<T38.F.zU.|
+00000390  7f 7e 88 00 21 9c c9 53  fe 30 01 42 7c d8 e8 5b  |.~..!..S.0.B|..[|
+000003a0  46 c3 28 73 7f ab 84 aa  83 f1 2e 51 eb 0d 90 ec  |F.(s.......Q....|
+000003b0  fa 96 3c 79 9d 8f ce 59  57 15 94 18 3f 53 17 03  |..<y...YW...?S..|
+000003c0  03 00 35 dd 46 07 33 0d  1e 78 18 5a f6 45 43 ae  |..5.F.3..x.Z.EC.|
+000003d0  61 ed 97 94 eb 67 82 cf  43 3f cb e7 23 68 fb cc  |a....g..C?..#h..|
+000003e0  a3 c1 91 74 2f cc fc 49  44 a8 7b 7b 17 44 6a d5  |...t/..ID.{{.Dj.|
+000003f0  4e 0c a7 21 ff 01 fc 2f  17 03 03 00 8b 59 58 d0  |N..!.../.....YX.|
+00000400  30 c0 e9 18 f6 de 1c fa  95 a9 1a 3a d4 f9 ed 28  |0..........:...(|
+00000410  bd 81 0c 68 82 17 a0 c5  55 5e 96 58 29 c7 50 25  |...h....U^.X).P%|
+00000420  8b 62 b3 2f 63 27 3c b4  03 83 78 e5 30 7b 03 6a  |.b./c'<...x.0{.j|
+00000430  aa 2e 0b 61 bc cf 36 84  7c 72 4e 4c 52 d7 a7 b6  |...a..6.|rNLR...|
+00000440  93 7b 52 09 a9 13 dc 96  61 2e c3 88 37 8f a7 ae  |.{R.....a...7...|
+00000450  eb 9f f3 fd 05 fb f1 71  bd 73 a3 4a 53 72 51 60  |.......q.s.JSrQ`|
+00000460  eb 06 3f 37 52 e7 d4 4b  06 f1 37 46 f9 bf 87 9c  |..?7R..K..7F....|
+00000470  d8 c7 be ad 7d 8d 12 54  93 d3 43 15 af f8 c6 8d  |....}..T..C.....|
+00000480  c5 5d b0 74 bc 4c 70 44                           |.].t.LpD|
 >>> Flow 3 (client to server)
-00000000  14 03 03 00 01 01 17 03  03 00 35 32 39 09 c6 64  |..........529..d|
-00000010  aa 86 b7 a7 37 6c fa ef  66 01 d4 de e6 35 8d 31  |....7l..f....5.1|
-00000020  68 71 f3 27 56 fd 7f 7b  cf c8 3c d1 44 ff e0 c7  |hq.'V..{..<.D...|
-00000030  78 b7 6c c8 ac 01 0e ee  e1 78 b9 dd 1a e1 a9 b6  |x.l......x......|
+00000000  14 03 03 00 01 01 17 03  03 00 35 de e1 cc 43 bc  |..........5...C.|
+00000010  ae b2 a6 66 68 d4 c4 b9  18 72 1f 26 f7 03 c9 6e  |...fh....r.&...n|
+00000020  9b 12 0e ff 65 ff f5 5f  84 6c fb 99 be e6 b3 07  |....e.._.l......|
+00000030  db ea d2 33 cc 7e 8c eb  42 db db fd e8 21 62 b0  |...3.~..B....!b.|
 >>> Flow 4 (server to client)
-00000000  17 03 03 00 1e da e7 79  04 f5 65 2e f6 c3 c3 b9  |.......y..e.....|
-00000010  34 37 14 8f c2 32 cb 81  58 bc cf d0 3b 08 f0 61  |47...2..X...;..a|
-00000020  b3 ae b4 17 03 03 00 13  e3 32 09 02 e0 29 5e 4a  |.........2...)^J|
-00000030  9b 36 a9 b0 65 e9 2c 1d  fb ad 50                 |.6..e.,...P|
+00000000  17 03 03 00 1e 1e 5c 6b  1e dd ea a2 1d bd 6e 66  |......\k......nf|
+00000010  0b 99 e0 91 0b c1 3e 9b  49 e7 40 0d a7 7a bb 31  |......>.I.@..z.1|
+00000020  4c 5c c2 17 03 03 00 13  a5 98 a7 8a 05 a7 bb 60  |L\.............`|
+00000030  11 aa b3 05 f6 cd 8b 16  3d 97 3e                 |........=.>|
diff --git a/src/crypto/tls/testdata/Server-TLSv13-ALPN-Fallback b/src/crypto/tls/testdata/Server-TLSv13-ALPN-Fallback
index 6203e68..d4a054d 100644
--- a/src/crypto/tls/testdata/Server-TLSv13-ALPN-Fallback
+++ b/src/crypto/tls/testdata/Server-TLSv13-ALPN-Fallback
@@ -1,9 +1,9 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 eb 01 00 00  e7 03 03 1c d3 8e 3b d9  |..............;.|
-00000010  fe 7d e7 f9 9f fa c6 51  c3 8c 1b dd dc 87 95 f4  |.}.....Q........|
-00000020  39 23 67 e4 d6 bd 94 93  fc 88 4e 20 c3 c0 e2 c1  |9#g.......N ....|
-00000030  3d 12 ec 4c 0a 3f 40 51  13 24 61 11 c0 5d 09 f9  |=..L.?@Q.$a..]..|
-00000040  08 d6 3e cd e7 b3 51 c3  06 8f b4 42 00 04 13 03  |..>...Q....B....|
+00000000  16 03 01 00 eb 01 00 00  e7 03 03 ca 9d 80 22 cc  |..............".|
+00000010  77 d9 f2 87 3f a8 93 a1  13 6f a0 f5 4e d0 1b fe  |w...?....o..N...|
+00000020  cc 04 c0 7c 8d 7d 2e 5c  c2 6d 69 20 1e 1f 96 97  |...|.}.\.mi ....|
+00000030  82 97 85 5b fd c1 59 cb  a5 2a 91 c1 b5 88 06 6c  |...[..Y..*.....l|
+00000040  b0 ed 5c 41 78 cc f6 3c  28 d9 29 2b 00 04 13 03  |..\Ax..<(.)+....|
 00000050  00 ff 01 00 00 9a 00 0b  00 04 03 00 01 02 00 0a  |................|
 00000060  00 0c 00 0a 00 1d 00 17  00 1e 00 19 00 18 00 23  |...............#|
 00000070  00 00 00 10 00 19 00 17  06 70 72 6f 74 6f 33 08  |.........proto3.|
@@ -12,89 +12,88 @@
 000000a0  03 06 03 08 07 08 08 08  09 08 0a 08 0b 08 04 08  |................|
 000000b0  05 08 06 04 01 05 01 06  01 00 2b 00 03 02 03 04  |..........+.....|
 000000c0  00 2d 00 02 01 01 00 33  00 26 00 24 00 1d 00 20  |.-.....3.&.$... |
-000000d0  f4 05 eb 4a 7a 73 20 18  74 aa 14 2a 0c 35 63 29  |...Jzs .t..*.5c)|
-000000e0  cb f2 ad d1 a2 3d bd 9d  02 b4 62 00 bc eb 10 58  |.....=....b....X|
+000000d0  c1 26 2b f3 64 5e 41 1a  11 9c 1d 4b 09 bd f4 98  |.&+.d^A....K....|
+000000e0  b4 7d 06 bb 88 97 5c ef  01 24 0b 3d 9e ed 91 0f  |.}....\..$.=....|
 >>> Flow 2 (server to client)
 00000000  16 03 03 00 7a 02 00 00  76 03 03 00 00 00 00 00  |....z...v.......|
 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 c3 c0 e2 c1  |........... ....|
-00000030  3d 12 ec 4c 0a 3f 40 51  13 24 61 11 c0 5d 09 f9  |=..L.?@Q.$a..]..|
-00000040  08 d6 3e cd e7 b3 51 c3  06 8f b4 42 13 03 00 00  |..>...Q....B....|
+00000020  00 00 00 00 00 00 00 00  00 00 00 20 1e 1f 96 97  |........... ....|
+00000030  82 97 85 5b fd c1 59 cb  a5 2a 91 c1 b5 88 06 6c  |...[..Y..*.....l|
+00000040  b0 ed 5c 41 78 cc f6 3c  28 d9 29 2b 13 03 00 00  |..\Ax..<(.)+....|
 00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 2f  |..+.....3.$... /|
 00000060  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
 00000070  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74 14  |.........._X.;t.|
-00000080  03 03 00 01 01 17 03 03  00 17 fb 75 d8 5c 50 35  |...........u.\P5|
-00000090  55 82 ba 65 1e 63 73 b8  c1 e9 d7 f5 28 68 3c c1  |U..e.cs.....(h<.|
-000000a0  5d 17 03 03 02 6d 56 c9  a9 09 73 6a bc fd 1a 3c  |]....mV...sj...<|
-000000b0  6a f8 3e 32 99 83 e8 f6  01 9e 5e 30 e8 53 7f 72  |j.>2......^0.S.r|
-000000c0  fd 86 72 a8 9e 47 25 67  c1 f1 9a 03 c0 9d 6f 9d  |..r..G%g......o.|
-000000d0  bd ed 29 30 8f 3c 01 ce  49 bb 5f dd 58 9a ae 80  |..)0.<..I._.X...|
-000000e0  5c 2d 81 fc ea 7b 03 03  3d 5d bb 92 23 73 67 89  |\-...{..=]..#sg.|
-000000f0  2e f0 ec 08 20 8a 36 eb  43 a6 a1 68 d0 39 95 37  |.... .6.C..h.9.7|
-00000100  6b 15 a9 0e 46 20 92 51  9c 04 bf 3b 07 97 84 cb  |k...F .Q...;....|
-00000110  1f 30 38 37 2e ff e7 0f  f5 14 93 5a 84 f1 f7 10  |.087.......Z....|
-00000120  c2 a5 0d bb 97 96 ef 4a  e0 13 c0 63 72 2b 60 f3  |.......J...cr+`.|
-00000130  59 b5 57 aa 5f d1 da a9  0e dd 9c dd c2 cb 61 fe  |Y.W._.........a.|
-00000140  e2 69 8e db 5d 70 6c 3a  33 e0 9e db 9a 31 26 6a  |.i..]pl:3....1&j|
-00000150  2b 9e 19 8e bb 5d 06 48  ea c0 a1 c6 11 24 fb c4  |+....].H.....$..|
-00000160  ce ae 48 54 64 81 d1 84  38 a6 e0 7a 7b 74 2b bc  |..HTd...8..z{t+.|
-00000170  ce 07 8b b6 04 1f 5b 4c  36 29 68 0c 8c c7 32 15  |......[L6)h...2.|
-00000180  93 e0 10 52 c2 27 23 96  c5 0c 9c e9 e2 a9 08 7d  |...R.'#........}|
-00000190  25 68 65 f5 4e 44 eb a9  85 78 13 e1 0d 86 5e dc  |%he.ND...x....^.|
-000001a0  fd e5 c6 dd 65 46 8e 2f  32 82 83 0b dd 67 f8 42  |....eF./2....g.B|
-000001b0  65 87 3b 08 fe b1 f5 12  e9 74 21 04 12 6d 75 35  |e.;......t!..mu5|
-000001c0  b2 eb 93 95 72 10 fa 56  96 77 c3 0c 17 8c 9e f6  |....r..V.w......|
-000001d0  77 19 28 37 96 3e 73 98  f4 d2 91 4f 40 db 76 56  |w.(7.>s....O@.vV|
-000001e0  ce b5 a8 7a b8 86 d0 9a  ba b5 8b 40 c2 63 e1 cf  |...z.......@.c..|
-000001f0  49 29 2c 5d 1a 9b 8b 56  cb 93 ca 2c c0 d0 15 b7  |I),]...V...,....|
-00000200  8a f1 6a d5 0a a8 81 57  b1 6e 10 cd a5 ff b1 4d  |..j....W.n.....M|
-00000210  47 c6 9b 35 f1 5f 83 91  22 f6 88 68 65 b3 b9 c9  |G..5._.."..he...|
-00000220  02 dc 4b f7 13 39 06 e6  3a ec 94 ef 51 15 05 72  |..K..9..:...Q..r|
-00000230  1d f4 9d 3b da ca 8d 2c  64 be 9b 45 99 2c 63 cc  |...;...,d..E.,c.|
-00000240  22 b3 8b 93 ad f6 2c f0  d2 d9 11 3f 5b c0 40 fa  |".....,....?[.@.|
-00000250  90 6e a0 76 b2 43 b9 4c  72 c4 24 28 a2 bf 56 d6  |.n.v.C.Lr.$(..V.|
-00000260  d2 a7 2a d1 8c 5e 1d eb  f8 be d0 43 da 7a c7 88  |..*..^.....C.z..|
-00000270  61 67 a2 69 85 23 43 3e  d4 88 f2 33 c3 5b 38 0a  |ag.i.#C>...3.[8.|
-00000280  1e de 28 3b 3b 19 de 95  2f 84 c0 37 88 80 59 2f  |..(;;.../..7..Y/|
-00000290  a6 ee 93 1a 69 08 c3 df  7c cf da c3 9b 96 70 d9  |....i...|.....p.|
-000002a0  60 c5 e9 0f 42 f6 1a f2  58 5e f2 32 61 6a b2 a3  |`...B...X^.2aj..|
-000002b0  1f 97 fa 08 6c 3f 4b 83  1f 04 66 80 8a 26 3a 7f  |....l?K...f..&:.|
-000002c0  24 30 ec 10 ae 7d 19 ff  39 91 ca 97 4e ed 0a d7  |$0...}..9...N...|
-000002d0  64 3b 6b 50 29 33 0d b2  10 bc 83 63 3c fb 9a 82  |d;kP)3.....c<...|
-000002e0  3b 7f bc 04 40 f1 33 64  4a 80 cd 01 f9 f4 c6 89  |;...@.3dJ.......|
-000002f0  65 27 25 f9 cf 4f 7e c8  6e d9 0e ec 47 4a 51 29  |e'%..O~.n...GJQ)|
-00000300  2f be 34 50 bd 9b d2 d8  b7 ea bb 0b a1 e0 20 1b  |/.4P.......... .|
-00000310  02 9c f2 17 03 03 00 99  61 dc 0b 3a 30 de 39 f6  |........a..:0.9.|
-00000320  f3 db f8 6c 3b fa 4e 1e  7e 62 a5 ae 73 ba e1 41  |...l;.N.~b..s..A|
-00000330  58 77 2a c1 7a 0c 50 bb  0c 57 b4 c4 25 bf 2f 9f  |Xw*.z.P..W..%./.|
-00000340  38 91 e2 65 22 9d ca ac  18 58 7e 81 2d fd 74 24  |8..e"....X~.-.t$|
-00000350  28 69 76 11 df 9d 23 b8  be ae 8b e0 93 8e 5d df  |(iv...#.......].|
-00000360  0a 64 d0 b7 02 68 aa 86  01 0d 55 11 3b 76 70 c6  |.d...h....U.;vp.|
-00000370  83 0c 5e 0a e3 37 a5 8b  ad 25 50 b9 e8 5c 6b 04  |..^..7...%P..\k.|
-00000380  b4 51 ec 9c d3 fa c6 b7  9c f0 46 aa 73 da 3c 0d  |.Q........F.s.<.|
-00000390  d3 bd 32 81 d4 d2 f1 1a  b0 92 f3 73 3e 54 2b 05  |..2........s>T+.|
-000003a0  92 24 34 75 df d6 18 a0  6a 82 95 4c 9b fc 7e b6  |.$4u....j..L..~.|
-000003b0  8e 17 03 03 00 35 8f 34  0e 3b 91 d8 e7 74 24 71  |.....5.4.;...t$q|
-000003c0  0e 7b f3 12 bb 76 2f 31  12 17 b8 9e 24 ce f9 2f  |.{...v/1....$../|
-000003d0  3f 5d f2 13 4b 2e 9b 1e  c4 78 03 a6 c8 07 11 a3  |?]..K....x......|
-000003e0  98 79 61 6e 4f 44 6e 18  ee c4 9b 17 03 03 00 93  |.yanODn.........|
-000003f0  64 dd 52 a9 d9 51 63 6a  a0 a3 c2 75 6b 5d 1d 54  |d.R..Qcj...uk].T|
-00000400  ce d4 53 7e 14 8e d9 26  93 28 78 65 16 1b 95 77  |..S~...&.(xe...w|
-00000410  68 0a 46 f1 82 36 bb 8a  fa 0d df 54 8c 3d 83 e0  |h.F..6.....T.=..|
-00000420  d7 de 2d 96 e9 c4 d7 22  d3 97 8e ae 90 f8 fc e6  |..-...."........|
-00000430  a6 4b 78 98 4c c5 28 87  91 46 fa f4 1c 8d 0e ec  |.Kx.L.(..F......|
-00000440  0d 71 40 9a 04 49 b4 e8  5b 62 6f cd 16 c1 d5 fb  |.q@..I..[bo.....|
-00000450  73 2a 96 8f e5 a2 f4 11  1e df 2d 40 45 6b d5 a9  |s*........-@Ek..|
-00000460  e4 e3 f7 93 fc fa d7 20  af d5 f7 b4 0e 09 ad d5  |....... ........|
-00000470  26 87 b8 6c e2 20 95 fb  c0 70 3e 38 be b7 b1 9f  |&..l. ...p>8....|
-00000480  70 da c1                                          |p..|
+00000080  03 03 00 01 01 17 03 03  00 17 ca 84 74 0d 35 9d  |............t.5.|
+00000090  80 3d d8 95 cb f2 12 f1  10 6b f6 91 12 ab 37 ea  |.=.......k....7.|
+000000a0  a2 17 03 03 02 6d 1e 6b  ca 76 70 67 ce 22 70 8c  |.....m.k.vpg."p.|
+000000b0  ab 4d 33 a8 2e 93 77 2c  2f b1 7a e3 42 ca 83 e2  |.M3...w,/.z.B...|
+000000c0  e5 c9 45 dc 97 d3 85 64  e8 07 13 c8 55 7c cd bf  |..E....d....U|..|
+000000d0  20 d1 3b 43 a7 13 a1 f6  66 0e 98 e7 23 18 cf 38  | .;C....f...#..8|
+000000e0  d3 92 d7 29 30 44 fa dc  81 1d e3 04 ca b0 b3 08  |...)0D..........|
+000000f0  d4 a4 64 18 f4 4f 06 ca  ca a0 bb 90 38 6d 09 21  |..d..O......8m.!|
+00000100  42 c1 a0 c4 51 90 78 61  b1 55 eb 63 8d 65 73 47  |B...Q.xa.U.c.esG|
+00000110  7c 6d f5 7f c6 dc 55 a1  a3 a4 16 6b 2d 62 d2 8d  ||m....U....k-b..|
+00000120  1f 96 8f 84 96 a6 94 f0  a0 9e 03 04 67 a2 e9 e3  |............g...|
+00000130  38 0c cd f3 af 45 77 65  33 06 e7 aa cf a0 e6 01  |8....Ewe3.......|
+00000140  a7 5f 62 95 32 18 b9 58  03 db 9c ca c7 50 80 cf  |._b.2..X.....P..|
+00000150  15 1c b0 7e 97 30 bb e2  bf d5 67 f4 e1 87 1e 07  |...~.0....g.....|
+00000160  71 2f f5 31 7e 7e 05 8a  cb a1 98 83 de de aa 87  |q/.1~~..........|
+00000170  b9 d2 4a 5e 4c 27 04 15  6b 3a 21 02 28 2c 3a 76  |..J^L'..k:!.(,:v|
+00000180  64 1f b0 f3 45 1e 2a fc  97 3f 0e 18 c8 00 a2 0b  |d...E.*..?......|
+00000190  51 4a 8f 1d d7 a6 d7 b9  64 11 bc ed 74 c9 90 bd  |QJ......d...t...|
+000001a0  a3 27 b3 c0 95 ea 49 88  af de 76 d9 82 67 01 0f  |.'....I...v..g..|
+000001b0  60 f1 f7 84 7e 56 46 65  c7 42 cc fb 99 25 a3 77  |`...~VFe.B...%.w|
+000001c0  c5 8c 02 87 4e d4 78 17  0d 16 f1 00 de f9 d5 0b  |....N.x.........|
+000001d0  36 28 f5 27 59 4b fd ba  38 cb 3c 53 3d 02 3b 77  |6(.'YK..8.<S=.;w|
+000001e0  b6 f1 e8 0d 87 58 f9 5b  ac 87 53 ba e7 1c 0c 1b  |.....X.[..S.....|
+000001f0  be e1 43 a6 8f 0d ab a7  3e e6 ed cb 66 c1 06 49  |..C.....>...f..I|
+00000200  9a cd 52 91 5e bc 1f a5  c6 78 2c d0 a4 67 14 3f  |..R.^....x,..g.?|
+00000210  94 2a 9c 9f 47 ee fa c7  50 ca 00 c2 30 69 d9 ca  |.*..G...P...0i..|
+00000220  30 b7 ac f4 3b d9 91 d7  33 40 87 de d9 a2 7f 77  |0...;...3@.....w|
+00000230  5b b0 57 ca 10 03 ec 3b  95 e9 c2 de 50 f1 28 7a  |[.W....;....P.(z|
+00000240  49 c1 be ef 6d 99 ea 98  47 8b af 51 d0 fb 0a d0  |I...m...G..Q....|
+00000250  b5 b2 ad e3 69 ba fc 34  c7 aa 04 8b d5 fc 17 54  |....i..4.......T|
+00000260  e1 51 f0 26 32 21 71 90  0e 30 10 f6 68 6f 53 b7  |.Q.&2!q..0..hoS.|
+00000270  b6 d8 1c 13 0a c9 fb 9e  46 13 22 4c 7c 93 18 ed  |........F."L|...|
+00000280  b8 72 69 56 00 ab df ec  f5 4c 32 60 0e a4 a3 b0  |.riV.....L2`....|
+00000290  b3 12 5c 61 26 1c aa b2  c2 68 64 65 cc 01 57 c9  |..\a&....hde..W.|
+000002a0  70 18 f7 db 2c 0d 24 b3  68 3a 08 db 07 ff 3c f5  |p...,.$.h:....<.|
+000002b0  2e 9a 1e d1 9c 62 4d 6d  4b 48 37 dd 62 0b 2b ab  |.....bMmKH7.b.+.|
+000002c0  49 a1 0f 7e 1b 6f 4e 43  69 63 3d 8e ce 51 f9 32  |I..~.oNCic=..Q.2|
+000002d0  4e f4 21 97 f5 16 e4 2b  0b f3 6f 5d 15 7e 68 dd  |N.!....+..o].~h.|
+000002e0  c6 5b 5f ac 56 42 99 76  28 38 d2 8b ed 0e c6 a4  |.[_.VB.v(8......|
+000002f0  69 d3 f1 c4 a9 d6 7a d2  00 ac ad ff 9c d2 8d 1e  |i.....z.........|
+00000300  46 88 64 24 51 78 2a a8  4a ea a4 fa 28 3b 70 3a  |F.d$Qx*.J...(;p:|
+00000310  75 8b 9d 17 03 03 00 99  22 d3 e9 8f ae 4e 5e 17  |u......."....N^.|
+00000320  3e 86 54 cd fd 66 68 c6  fe 73 ac 19 98 c1 a1 66  |>.T..fh..s.....f|
+00000330  4f 7a 4f 5e 0b c5 a1 43  74 d4 c2 0a ce 45 05 2f  |OzO^...Ct....E./|
+00000340  5f f1 1b 50 eb 08 8f 36  30 f0 78 e9 1d c1 e5 b0  |_..P...60.x.....|
+00000350  cf 27 14 ed 67 ed 12 7e  f1 4c 10 e8 ff 6f 13 7d  |.'..g..~.L...o.}|
+00000360  0f a8 c3 b6 19 22 9a 68  9b ab 6d 77 09 f5 56 de  |.....".h..mw..V.|
+00000370  84 23 d6 ed 38 62 06 4b  05 9b 59 39 2f 09 65 70  |.#..8b.K..Y9/.ep|
+00000380  9e 9c f9 fe a2 e4 db 1e  c0 12 d2 ee 41 77 b3 05  |............Aw..|
+00000390  a1 c3 bb 41 70 0e dd f7  0d ca 41 58 12 9e 4f 23  |...Ap.....AX..O#|
+000003a0  2e 72 00 9b 19 70 78 54  b4 27 69 16 15 e8 6f d4  |.r...pxT.'i...o.|
+000003b0  e7 17 03 03 00 35 ad df  36 e1 d4 a4 04 8e fa 1a  |.....5..6.......|
+000003c0  77 da e7 99 62 e9 8f a0  27 af a6 ba 7f 47 49 47  |w...b...'....GIG|
+000003d0  aa a3 bd bb cd 32 f6 e6  90 77 95 34 e5 72 f0 f9  |.....2...w.4.r..|
+000003e0  75 8c cf 25 5b bc 2a b0  98 be fb 17 03 03 00 8b  |u..%[.*.........|
+000003f0  e9 20 f8 90 78 d5 78 11  c3 bb 5c 41 f0 cd 51 3e  |. ..x.x...\A..Q>|
+00000400  a1 20 bb 72 98 e3 d1 fe  9d 61 ae a4 8f 71 57 6c  |. .r.....a...qWl|
+00000410  e7 68 de 63 95 ed 46 00  f4 8f cd 59 c7 97 7f 98  |.h.c..F....Y....|
+00000420  61 f3 68 18 18 1e 94 16  f7 f2 de 73 81 3d a5 7e  |a.h........s.=.~|
+00000430  12 68 65 70 6f ca bd 2b  92 f8 7c ec 88 2c 3f c0  |.hepo..+..|..,?.|
+00000440  76 52 cc e3 38 e0 ce 0b  dc 35 ef 87 cf ea 4b 2b  |vR..8....5....K+|
+00000450  53 88 52 3f f6 e1 d7 ea  5f a2 d9 4f a7 03 ac c1  |S.R?...._..O....|
+00000460  7d ab 95 ce a5 f5 00 53  f6 6d ab 7e 07 88 51 9b  |}......S.m.~..Q.|
+00000470  2c e9 e9 ac 1b f9 17 ac  33 17 00                 |,.......3..|
 >>> Flow 3 (client to server)
-00000000  14 03 03 00 01 01 17 03  03 00 35 29 d2 b9 bb 9b  |..........5)....|
-00000010  de 6c 5d 22 23 c1 fe 99  4c c5 33 bf fd 70 36 6b  |.l]"#...L.3..p6k|
-00000020  f1 a5 92 e8 bf 7c 3d 6e  ef 6a 44 73 bc cb 27 1c  |.....|=n.jDs..'.|
-00000030  09 5d bf 99 4c 19 24 c3  3b 30 91 b5 e3 b6 63 45  |.]..L.$.;0....cE|
+00000000  14 03 03 00 01 01 17 03  03 00 35 52 13 5e 7a c8  |..........5R.^z.|
+00000010  3e b6 e1 8e 59 c9 cf 54  0b c8 c2 17 ab 76 0d 3d  |>...Y..T.....v.=|
+00000020  ec 5c 76 2c 21 21 f3 1e  a7 25 ba 67 97 8a 8f de  |.\v,!!...%.g....|
+00000030  03 7d 1a bc 0a 9e c7 e7  02 52 cf d4 80 3e 80 7e  |.}.......R...>.~|
 >>> Flow 4 (server to client)
-00000000  17 03 03 00 1e 52 55 85  7c b8 87 dd c7 b2 d9 5b  |.....RU.|......[|
-00000010  18 1d bb ac bf b6 ab 76  82 be 64 0e b2 7b 2c 0f  |.......v..d..{,.|
-00000020  aa 17 92 17 03 03 00 13  79 0a 60 b1 46 20 33 74  |........y.`.F 3t|
-00000030  ed 12 a0 23 de 68 88 fc  6f dd 8e                 |...#.h..o..|
+00000000  17 03 03 00 1e 77 f7 66  ab db 08 5c e5 9d 7f a3  |.....w.f...\....|
+00000010  f7 37 24 70 e7 7c d2 44  25 de 3d c3 71 18 aa 24  |.7$p.|.D%.=.q..$|
+00000020  9b 9d 18 17 03 03 00 13  e3 6e e2 8a d9 ae 0f c3  |.........n......|
+00000030  ad 90 03 90 40 be 42 fe  4e ad d2                 |....@.B.N..|
diff --git a/src/crypto/tls/testdata/Server-TLSv13-ALPN-NoMatch b/src/crypto/tls/testdata/Server-TLSv13-ALPN-NoMatch
index b51ff25..a8b3d80 100644
--- a/src/crypto/tls/testdata/Server-TLSv13-ALPN-NoMatch
+++ b/src/crypto/tls/testdata/Server-TLSv13-ALPN-NoMatch
@@ -1,9 +1,9 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 e2 01 00 00  de 03 03 9f 73 81 5f 56  |............s._V|
-00000010  a9 02 5f 8c 33 db dc 2a  92 d0 5e 7c e9 e6 01 d7  |.._.3..*..^|....|
-00000020  67 b6 bb 74 da bb d0 c1  11 08 20 20 9f bd d6 f8  |g..t......  ....|
-00000030  d7 8c e5 32 15 1d 4a 4c  36 ce 72 90 cb 68 ca dc  |...2..JL6.r..h..|
-00000040  ea b3 57 93 9a 12 e6 0e  9a bd 91 1a 00 04 13 03  |..W.............|
+00000000  16 03 01 00 e2 01 00 00  de 03 03 3d ae 42 d4 d3  |...........=.B..|
+00000010  a9 75 5b a6 8f 9f 47 6f  fe e7 3d 3e 5c d8 35 01  |.u[...Go..=>\.5.|
+00000020  c9 25 fd 94 e4 ac 7e b4  e1 4e 0f 20 56 29 44 cd  |.%....~..N. V)D.|
+00000030  7f 99 7b a6 9a 4d d4 3c  e8 01 00 93 e5 e0 a8 7b  |..{..M.<.......{|
+00000040  81 13 85 e9 2e 4e 12 a2  b9 d4 7d 8e 00 04 13 03  |.....N....}.....|
 00000050  00 ff 01 00 00 91 00 0b  00 04 03 00 01 02 00 0a  |................|
 00000060  00 0c 00 0a 00 1d 00 17  00 1e 00 19 00 18 00 23  |...............#|
 00000070  00 00 00 10 00 10 00 0e  06 70 72 6f 74 6f 32 06  |.........proto2.|
@@ -11,17 +11,8 @@
 00000090  00 1e 00 1c 04 03 05 03  06 03 08 07 08 08 08 09  |................|
 000000a0  08 0a 08 0b 08 04 08 05  08 06 04 01 05 01 06 01  |................|
 000000b0  00 2b 00 03 02 03 04 00  2d 00 02 01 01 00 33 00  |.+......-.....3.|
-000000c0  26 00 24 00 1d 00 20 79  79 04 d3 03 58 93 22 5d  |&.$... yy...X."]|
-000000d0  06 69 1a 03 11 4e 65 e5  30 85 29 02 22 c8 11 6d  |.i...Ne.0.)."..m|
-000000e0  21 86 d4 4d 58 93 74                              |!..MX.t|
+000000c0  26 00 24 00 1d 00 20 3c  8b f2 09 ad ff 96 76 0f  |&.$... <......v.|
+000000d0  9b 05 eb c8 5a 48 68 be  a6 6e dd f6 f5 7d 56 89  |....ZHh..n...}V.|
+000000e0  ff 37 75 13 b1 1b 01                              |.7u....|
 >>> Flow 2 (server to client)
-00000000  16 03 03 00 7a 02 00 00  76 03 03 00 00 00 00 00  |....z...v.......|
-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 9f bd d6 f8  |........... ....|
-00000030  d7 8c e5 32 15 1d 4a 4c  36 ce 72 90 cb 68 ca dc  |...2..JL6.r..h..|
-00000040  ea b3 57 93 9a 12 e6 0e  9a bd 91 1a 13 03 00 00  |..W.............|
-00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 2f  |..+.....3.$... /|
-00000060  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
-00000070  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74 14  |.........._X.;t.|
-00000080  03 03 00 01 01 17 03 03  00 13 7c ab 7f dd 94 cf  |..........|.....|
-00000090  d7 98 34 16 75 02 63 37  fa 4f 19 4e 18           |..4.u.c7.O.N.|
+00000000  15 03 03 00 02 02 78                              |......x|
diff --git a/src/crypto/tls/testdata/Server-TLSv13-ALPN-NotConfigured b/src/crypto/tls/testdata/Server-TLSv13-ALPN-NotConfigured
index e0830d3..c4bd035 100644
--- a/src/crypto/tls/testdata/Server-TLSv13-ALPN-NotConfigured
+++ b/src/crypto/tls/testdata/Server-TLSv13-ALPN-NotConfigured
@@ -1,9 +1,9 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 e2 01 00 00  de 03 03 9f 49 a7 46 f8  |............I.F.|
-00000010  72 04 47 a1 8e 4f 89 c3  cd 89 92 2f 7a 8a 07 37  |r.G..O...../z..7|
-00000020  8c 25 10 42 26 07 8b a2  71 3e 92 20 4c 83 1b 70  |.%.B&...q>. L..p|
-00000030  45 c3 79 68 c3 83 a7 05  c2 22 06 c6 91 da 8b 96  |E.yh....."......|
-00000040  4c 9d 89 c2 ec b8 49 87  17 3f 6c ae 00 04 13 03  |L.....I..?l.....|
+00000000  16 03 01 00 e2 01 00 00  de 03 03 1f f5 b0 88 a0  |................|
+00000010  fd 0e cd 4d 25 21 88 bf  07 16 95 49 6a 78 2d 70  |...M%!.....Ijx-p|
+00000020  25 f7 06 36 f2 98 4c 23  16 41 a5 20 87 60 d3 78  |%..6..L#.A. .`.x|
+00000030  c7 ab 8b f9 2b 2c 21 1e  f4 5b 25 bc 81 53 18 5c  |....+,!..[%..S.\|
+00000040  3b 7e dd 3e 7b c4 ee d1  f8 9d bf 7a 00 04 13 03  |;~.>{......z....|
 00000050  00 ff 01 00 00 91 00 0b  00 04 03 00 01 02 00 0a  |................|
 00000060  00 0c 00 0a 00 1d 00 17  00 1e 00 19 00 18 00 23  |...............#|
 00000070  00 00 00 10 00 10 00 0e  06 70 72 6f 74 6f 32 06  |.........proto2.|
@@ -11,90 +11,89 @@
 00000090  00 1e 00 1c 04 03 05 03  06 03 08 07 08 08 08 09  |................|
 000000a0  08 0a 08 0b 08 04 08 05  08 06 04 01 05 01 06 01  |................|
 000000b0  00 2b 00 03 02 03 04 00  2d 00 02 01 01 00 33 00  |.+......-.....3.|
-000000c0  26 00 24 00 1d 00 20 f4  91 87 6a ac cd 25 5e f1  |&.$... ...j..%^.|
-000000d0  0d 25 fb af a4 d4 fb 16  32 63 af 04 2d 21 d7 2f  |.%......2c..-!./|
-000000e0  61 f2 c2 d4 c4 6c 2b                              |a....l+|
+000000c0  26 00 24 00 1d 00 20 5f  8f fa 0f 94 46 78 3d a9  |&.$... _....Fx=.|
+000000d0  7d d8 2b 65 f6 c1 55 6b  fd aa 4b 65 23 7b ad 13  |}.+e..Uk..Ke#{..|
+000000e0  88 06 ce 54 f1 77 63                              |...T.wc|
 >>> Flow 2 (server to client)
 00000000  16 03 03 00 7a 02 00 00  76 03 03 00 00 00 00 00  |....z...v.......|
 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 4c 83 1b 70  |........... L..p|
-00000030  45 c3 79 68 c3 83 a7 05  c2 22 06 c6 91 da 8b 96  |E.yh....."......|
-00000040  4c 9d 89 c2 ec b8 49 87  17 3f 6c ae 13 03 00 00  |L.....I..?l.....|
+00000020  00 00 00 00 00 00 00 00  00 00 00 20 87 60 d3 78  |........... .`.x|
+00000030  c7 ab 8b f9 2b 2c 21 1e  f4 5b 25 bc 81 53 18 5c  |....+,!..[%..S.\|
+00000040  3b 7e dd 3e 7b c4 ee d1  f8 9d bf 7a 13 03 00 00  |;~.>{......z....|
 00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 2f  |..+.....3.$... /|
 00000060  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
 00000070  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74 14  |.........._X.;t.|
-00000080  03 03 00 01 01 17 03 03  00 17 60 79 16 61 4f 6c  |..........`y.aOl|
-00000090  9e 2e ce fd cc f5 29 67  38 e7 53 67 92 b1 5f 9d  |......)g8.Sg.._.|
-000000a0  db 17 03 03 02 6d 54 d9  d6 a1 8e c2 1b 70 3f 3d  |.....mT......p?=|
-000000b0  a2 2e 0f a5 37 96 e1 68  66 69 cc f8 e9 06 4d bc  |....7..hfi....M.|
-000000c0  c2 9a 6e 0f ea d4 73 59  6a 59 28 79 7f 44 0c 32  |..n...sYjY(y.D.2|
-000000d0  29 22 51 d1 fb 00 c7 33  44 8b 19 71 98 8a 03 44  |)"Q....3D..q...D|
-000000e0  e0 95 ad 8f 91 66 e6 15  b8 99 b3 f8 2f 02 e9 a0  |.....f....../...|
-000000f0  4a 25 ec 3f 36 56 0c eb  0a a3 e0 d3 79 a1 b3 9e  |J%.?6V......y...|
-00000100  dc 42 08 76 a4 c3 55 91  06 11 e7 0c 94 dd 71 fc  |.B.v..U.......q.|
-00000110  bf 8a 87 d2 97 07 a3 b9  36 7e 58 ff ef b3 a3 f4  |........6~X.....|
-00000120  6e f1 23 d6 50 e3 23 d3  dc e7 20 ce 9d 84 17 cf  |n.#.P.#... .....|
-00000130  2d 5f b1 f9 8d 36 41 7d  ba 3b 93 63 2f bc be f0  |-_...6A}.;.c/...|
-00000140  a1 3a bb 5f b3 99 03 13  fb d2 2c 1a 8c cc 32 02  |.:._......,...2.|
-00000150  ef 93 b4 58 a8 f8 b1 42  52 24 c2 73 01 cb 5a fb  |...X...BR$.s..Z.|
-00000160  9f fc 38 08 d7 f9 0d d7  20 fa dc 8b 1a 8c 73 0f  |..8..... .....s.|
-00000170  f8 79 b2 84 e1 49 2d 8e  6d 46 16 38 0e 02 2a 2c  |.y...I-.mF.8..*,|
-00000180  f4 44 89 da f1 7a 01 55  9e 93 a8 d6 d5 f5 72 28  |.D...z.U......r(|
-00000190  47 2b 4f 17 7e a5 01 fd  ad 85 e0 6d f9 82 e8 cd  |G+O.~......m....|
-000001a0  09 18 84 8c 9d 4f 4e a1  43 ff d6 3d 55 05 fc 56  |.....ON.C..=U..V|
-000001b0  e6 d6 b6 61 4a c7 c7 9c  62 64 26 1d 33 1e 4f d5  |...aJ...bd&.3.O.|
-000001c0  5e ee 1f a9 ad 24 e4 7f  05 cc 02 7a f7 e0 c2 ce  |^....$.....z....|
-000001d0  b8 11 c9 a1 fd c5 d8 0e  ef f8 c9 6a 2d 49 30 63  |...........j-I0c|
-000001e0  e3 9b 43 bf 87 e1 5f 55  39 fa 80 ec 84 55 59 5d  |..C..._U9....UY]|
-000001f0  52 76 4c f4 70 eb 43 6a  b2 07 d5 29 4c 58 39 04  |RvL.p.Cj...)LX9.|
-00000200  46 42 70 8d 28 61 7c d5  7a 3a 2e a0 9f 74 49 2d  |FBp.(a|.z:...tI-|
-00000210  33 8d 39 18 70 8d 3c 50  4f 62 07 77 2d 15 1f 4b  |3.9.p.<POb.w-..K|
-00000220  22 01 c6 cb ac 2f 2d 9a  cf a6 9b 0e 24 99 41 64  |"..../-.....$.Ad|
-00000230  3e f2 9f 5f 17 7b d7 b8  3c b6 6d 24 5b 91 8c 13  |>.._.{..<.m$[...|
-00000240  1a 40 4e 80 7f 44 12 57  c9 03 57 c6 9b 54 0d 39  |.@N..D.W..W..T.9|
-00000250  91 88 72 3e c8 f9 18 eb  34 7c 0a eb 2d c8 56 1c  |..r>....4|..-.V.|
-00000260  84 8a 62 a2 3a 0a 52 b8  5a b6 5d 54 78 ae 05 b2  |..b.:.R.Z.]Tx...|
-00000270  f4 6c 2d 5e 92 94 6b f3  1e 93 13 1a 65 74 60 e3  |.l-^..k.....et`.|
-00000280  dd 15 36 62 2b 71 b1 bb  59 19 08 af 8e 9b d0 47  |..6b+q..Y......G|
-00000290  05 7b a3 89 ac 68 cf a0  32 ba 4a 2b 9e 5f a5 dc  |.{...h..2.J+._..|
-000002a0  b3 00 79 a8 1c f6 11 b8  6d 9c 51 b7 f1 f6 b2 13  |..y.....m.Q.....|
-000002b0  56 57 4e ac 97 ff 5a b8  52 33 0c c1 3d 52 81 6e  |VWN...Z.R3..=R.n|
-000002c0  85 ba b2 04 4b eb 41 aa  03 ff ae 63 93 72 3a 5f  |....K.A....c.r:_|
-000002d0  65 81 f9 6a 2a e4 70 f8  b3 59 31 51 62 ad 25 24  |e..j*.p..Y1Qb.%$|
-000002e0  82 0c b5 ad 7c 87 21 97  07 c0 c1 6d f0 22 97 0d  |....|.!....m."..|
-000002f0  28 cf a7 4d 74 d2 9c ac  d7 15 83 26 f7 2f 76 d4  |(..Mt......&./v.|
-00000300  ad cf e7 ef 1c f4 3e 1f  b4 f4 4f 76 6a 98 15 01  |......>...Ovj...|
-00000310  cd 17 8b 17 03 03 00 99  0b 15 9d 16 c6 2a 52 53  |.............*RS|
-00000320  33 d7 01 db 8a 49 1d d6  83 b7 28 a4 07 f0 73 5e  |3....I....(...s^|
-00000330  60 03 2c 6f 3f e0 88 a1  76 22 d6 23 0a df ca 86  |`.,o?...v".#....|
-00000340  b0 44 b9 1d 9a d7 53 f2  2b 57 a1 65 01 d4 e7 b4  |.D....S.+W.e....|
-00000350  9e 22 00 d2 20 da cd 55  7d 61 86 86 19 81 f9 ed  |.".. ..U}a......|
-00000360  f8 af c4 69 54 1d 35 0a  6f 9e 69 40 13 08 82 dd  |...iT.5.o.i@....|
-00000370  59 11 31 f2 81 a7 4b f1  bd d9 f2 5c 29 22 16 49  |Y.1...K....\)".I|
-00000380  86 62 8c a8 b8 89 58 96  cc d1 e4 e8 5e ef 6c b7  |.b....X.....^.l.|
-00000390  00 71 3d ab 92 b8 78 56  a7 25 5e a0 c4 d8 8c 02  |.q=...xV.%^.....|
-000003a0  c4 c8 eb d3 be 68 21 05  5c 5f 9c b0 ec 20 99 ff  |.....h!.\_... ..|
-000003b0  00 17 03 03 00 35 c9 c1  5e 25 1c b9 64 8e c2 fd  |.....5..^%..d...|
-000003c0  50 87 48 e6 02 36 75 31  67 f6 82 3c 94 79 7d 0b  |P.H..6u1g..<.y}.|
-000003d0  cb 83 b1 f4 e1 00 5f a6  b6 2c 2d 63 40 ab 98 f9  |......_..,-c@...|
-000003e0  e3 8e 4a 7e d4 77 3d 55  90 10 75 17 03 03 00 93  |..J~.w=U..u.....|
-000003f0  47 c4 6e 19 29 c2 5e d5  93 b7 c2 cc 46 a9 49 9d  |G.n.).^.....F.I.|
-00000400  8a 3b 9a 35 bb 45 22 13  b6 eb c9 ec ba 44 3c 24  |.;.5.E"......D<$|
-00000410  f2 ed bd 76 11 cc af 00  b3 89 63 5d 79 32 cc d7  |...v......c]y2..|
-00000420  5c 34 f3 5e 64 36 92 5d  ac ac 33 74 f4 3d c4 b8  |\4.^d6.]..3t.=..|
-00000430  4d ac d0 49 4e 59 1c 16  74 8c 43 94 4b 13 b9 22  |M..INY..t.C.K.."|
-00000440  de d7 ee 30 09 63 f3 32  5f a2 9d a1 20 ea ee 91  |...0.c.2_... ...|
-00000450  ca d8 01 33 df 43 19 69  63 ee 6a 2c 80 99 ad f0  |...3.C.ic.j,....|
-00000460  5e 20 b6 b6 81 28 b6 9d  4a 9a 91 30 30 04 c1 70  |^ ...(..J..00..p|
-00000470  68 54 1e e0 72 00 4c fd  23 a8 41 a2 6a ab a3 01  |hT..r.L.#.A.j...|
-00000480  7a 40 1a                                          |z@.|
+00000080  03 03 00 01 01 17 03 03  00 17 30 cc 27 0f 8c cd  |..........0.'...|
+00000090  77 85 98 61 e4 19 19 63  ac 5b 55 37 c2 73 6d f6  |w..a...c.[U7.sm.|
+000000a0  a1 17 03 03 02 6d 5f 60  9f d3 fc 5e 57 fb b6 35  |.....m_`...^W..5|
+000000b0  99 3c a7 65 6f eb b5 89  5a 3c be e1 a5 c7 af 14  |.<.eo...Z<......|
+000000c0  67 d4 0c 87 d4 dd c9 28  1c 5c 89 c6 55 68 e0 b3  |g......(.\..Uh..|
+000000d0  42 d8 e4 4f 64 df 26 4a  a2 14 eb 34 69 9f 8d 8e  |B..Od.&J...4i...|
+000000e0  fc 21 db 17 93 37 7d d4  57 bb 76 4d 1e 70 9f 58  |.!...7}.W.vM.p.X|
+000000f0  f3 ae 12 71 aa 4b 30 e3  86 92 32 c6 55 12 08 42  |...q.K0...2.U..B|
+00000100  bf 6a 6a f9 79 b9 50 37  11 15 a4 b3 c8 a8 16 da  |.jj.y.P7........|
+00000110  e9 62 ed 3d 80 da 38 22  c6 c3 fd 1c b2 d2 8c 74  |.b.=..8".......t|
+00000120  23 39 70 67 b0 34 25 24  eb 72 e2 c1 63 d6 48 09  |#9pg.4%$.r..c.H.|
+00000130  ee d7 5e 15 2b 78 64 97  c8 d0 6b 2a 1c b6 d8 12  |..^.+xd...k*....|
+00000140  9e 9a b5 dc 24 51 5a 38  a1 4c 9c df 74 3f 63 f0  |....$QZ8.L..t?c.|
+00000150  d2 45 49 58 5c 3c 42 f2  56 fd bc 0e c1 d6 8b 7d  |.EIX\<B.V......}|
+00000160  31 bf af c7 a2 91 8a c7  e2 ef 3d fe 66 5b 29 97  |1.........=.f[).|
+00000170  40 7e 84 2e 83 2b 41 48  69 72 02 75 49 74 77 18  |@~...+AHir.uItw.|
+00000180  af a9 ef 22 66 f2 2f 37  79 e7 10 6d 22 e9 81 86  |..."f./7y..m"...|
+00000190  c1 55 28 7d a1 1f 80 dc  c8 f1 00 d7 21 c9 ff 69  |.U(}........!..i|
+000001a0  8c f0 b3 48 c4 8b 97 6a  bf fc 24 ad d2 23 f5 6b  |...H...j..$..#.k|
+000001b0  4d c8 96 d6 85 91 7b c6  21 79 2f e5 59 32 7d e7  |M.....{.!y/.Y2}.|
+000001c0  7b 77 46 c7 f8 6d 6e 8c  4f c8 47 84 0c f4 9d 81  |{wF..mn.O.G.....|
+000001d0  be 2e 38 c6 79 43 d1 ca  78 81 40 1a a3 0e bc fd  |..8.yC..x.@.....|
+000001e0  42 2d de 55 33 48 50 6a  5b 47 b6 cb ea 6c e6 e9  |B-.U3HPj[G...l..|
+000001f0  ab 11 10 34 c3 4e 61 e1  dd a8 8d 8b c3 af 18 13  |...4.Na.........|
+00000200  2c 17 02 c9 7d 21 74 12  e1 9b a7 1e 95 8f 3a 6f  |,...}!t.......:o|
+00000210  60 75 f6 e9 f8 87 e5 15  de 33 ba 01 50 28 5c 2d  |`u.......3..P(\-|
+00000220  cf 74 64 c5 c8 36 48 2a  f6 32 12 96 07 2f 2d 20  |.td..6H*.2.../- |
+00000230  97 cb c1 c9 8f d1 27 f0  90 66 70 1c 45 20 c9 99  |......'..fp.E ..|
+00000240  5c 9c 44 2d a2 93 5c 4c  48 7a 6b 0c 2e a7 b9 21  |\.D-..\LHzk....!|
+00000250  1b 86 94 41 2c 53 72 0b  91 55 2b 6a b2 8f 67 f9  |...A,Sr..U+j..g.|
+00000260  2a 17 84 6f b0 f6 5e 0d  57 ad ca 1d 85 77 a7 03  |*..o..^.W....w..|
+00000270  c4 ea 62 b3 63 34 59 81  a4 90 b7 f7 39 61 8e e2  |..b.c4Y.....9a..|
+00000280  79 9c bd 71 49 7a 0c 34  2b a7 4a f4 65 f0 14 96  |y..qIz.4+.J.e...|
+00000290  4a fa 5f d6 03 eb 9e 40  04 4b 45 1c 58 a6 f7 04  |J._....@.KE.X...|
+000002a0  25 27 d3 7d 7b 28 0c 43  8b cd dd 8b 5b 19 6c 21  |%'.}{(.C....[.l!|
+000002b0  c1 03 9d 75 2e 7d 83 c8  f1 ad dc fd 96 75 6f 56  |...u.}.......uoV|
+000002c0  3d 9f e9 e3 52 ff d4 b0  55 c1 43 d9 74 b1 c7 f8  |=...R...U.C.t...|
+000002d0  99 91 e5 b7 b1 28 64 64  d8 7a de 35 64 7d 75 d6  |.....(dd.z.5d}u.|
+000002e0  7f 4b 56 63 9b fb c3 6f  f1 00 e6 f2 0a 7f 06 47  |.KVc...o.......G|
+000002f0  3c b9 dc 5f 2d b2 ef ca  2b 51 de a1 db 09 5d ec  |<.._-...+Q....].|
+00000300  80 c3 85 36 09 b4 61 6a  21 c2 68 bb 31 6b f6 14  |...6..aj!.h.1k..|
+00000310  5c 18 73 17 03 03 00 99  0b 3b ee 6c 6e c6 5f fd  |\.s......;.ln._.|
+00000320  33 e5 38 52 86 25 8f 76  93 db 62 77 2f 28 7a 19  |3.8R.%.v..bw/(z.|
+00000330  d1 78 ed 1a a4 e3 aa 13  b7 c4 24 d1 f9 f6 77 85  |.x........$...w.|
+00000340  a6 bd cf 21 3a 95 4d 70  3d 3e 40 3b 23 17 da b4  |...!:.Mp=>@;#...|
+00000350  b0 1d b7 bb 4f 90 8c 73  5a d2 f5 5b 4a 74 b0 25  |....O..sZ..[Jt.%|
+00000360  eb a8 7e a0 9d 1a e4 4e  bf 4f 55 b8 9d 93 cf 5b  |..~....N.OU....[|
+00000370  a4 22 3d 3b d5 8f 23 de  41 70 47 d8 3b 82 6b ba  |."=;..#.ApG.;.k.|
+00000380  26 f2 a2 e9 45 8e a9 72  1e 37 2e 0d a9 4b 54 b2  |&...E..r.7...KT.|
+00000390  6f 8f ec 04 97 86 b4 e4  4c cc f1 ed c9 e1 61 b1  |o.......L.....a.|
+000003a0  f8 a2 d7 fc a5 1a 8c 44  95 16 fc e3 25 b1 a9 d6  |.......D....%...|
+000003b0  21 17 03 03 00 35 fa ad  27 32 8d 61 3a 32 36 ef  |!....5..'2.a:26.|
+000003c0  ea ff 4e 95 cd a6 83 19  e2 72 85 44 33 b2 c0 45  |..N......r.D3..E|
+000003d0  f0 34 92 ca 5a a2 14 4c  6c a3 95 bd fe 3b f8 fd  |.4..Z..Ll....;..|
+000003e0  e1 11 9b f6 8f 4f c6 ae  05 31 55 17 03 03 00 8b  |.....O...1U.....|
+000003f0  8a a3 df b3 a0 68 8a e1  4f db c6 2a 8e df dc b6  |.....h..O..*....|
+00000400  07 b5 c4 c7 34 7f d8 e9  3f 88 0f 15 14 01 50 bc  |....4...?.....P.|
+00000410  64 05 8d 91 fa 24 1e 0e  cf db 11 8c 46 58 6e f1  |d....$......FXn.|
+00000420  09 68 14 9a 89 e0 6b ef  ac 90 27 69 2b 01 6c 2e  |.h....k...'i+.l.|
+00000430  6d e9 26 9f b1 ff b8 6c  8b 33 bb e8 42 54 85 c9  |m.&....l.3..BT..|
+00000440  14 d5 89 48 50 a6 8d be  dd b8 96 f1 45 4f 90 08  |...HP.......EO..|
+00000450  da cf 1f 75 33 85 d9 be  8e a5 4a c5 be a9 a3 16  |...u3.....J.....|
+00000460  f6 37 02 79 ea c3 e5 10  ed ff d5 f2 3d 46 7b ed  |.7.y........=F{.|
+00000470  bf be 36 a2 8a 00 9f 30  02 54 71                 |..6....0.Tq|
 >>> Flow 3 (client to server)
-00000000  14 03 03 00 01 01 17 03  03 00 35 20 1f 0d 20 a8  |..........5 .. .|
-00000010  34 c4 dc fa f9 d6 2b fe  01 eb f1 54 f0 14 c2 2d  |4.....+....T...-|
-00000020  bb 59 db 04 96 f2 18 8b  bd 7e b0 38 b7 15 b5 d8  |.Y.......~.8....|
-00000030  6b f2 80 25 40 f6 97 67  fb 9e 5a 5c ad 33 c6 5f  |k..%@..g..Z\.3._|
+00000000  14 03 03 00 01 01 17 03  03 00 35 b6 3d e7 c7 a8  |..........5.=...|
+00000010  2d c2 a7 8b cc 13 db 7d  c2 75 18 f9 86 20 2b f0  |-......}.u... +.|
+00000020  e1 5d 11 b1 2d df 0c 12  a7 c5 3a 28 97 6e f8 f0  |.]..-.....:(.n..|
+00000030  7f c0 81 72 68 a5 41 68  59 ef da 3e 2f ef 97 45  |...rh.AhY..>/..E|
 >>> Flow 4 (server to client)
-00000000  17 03 03 00 1e 3a 8a fc  60 3a 99 ee b6 01 b7 fe  |.....:..`:......|
-00000010  54 a9 2d 34 28 ae af 3b  6a bd e0 32 6b df 87 fe  |T.-4(..;j..2k...|
-00000020  d0 97 8d 17 03 03 00 13  c6 89 d5 ae 4c fa d5 71  |............L..q|
-00000030  66 6e 07 b5 9b 00 e8 50  7e b9 5f                 |fn.....P~._|
+00000000  17 03 03 00 1e fd 53 e4  87 a2 41 38 98 a6 d8 fa  |......S...A8....|
+00000010  7b 65 66 98 37 a6 4a 06  6b 25 11 66 ed 9c 00 22  |{ef.7.J.k%.f..."|
+00000020  83 6e f5 17 03 03 00 13  fc bb b9 93 79 3c 94 6c  |.n..........y<.l|
+00000030  1d 48 d9 5c 3e 51 86 fb  2a 0d d8                 |.H.\>Q..*..|
diff --git a/src/crypto/tls/testdata/Server-TLSv13-CHACHA20-SHA256 b/src/crypto/tls/testdata/Server-TLSv13-CHACHA20-SHA256
index 760c597..1357ed4 100644
--- a/src/crypto/tls/testdata/Server-TLSv13-CHACHA20-SHA256
+++ b/src/crypto/tls/testdata/Server-TLSv13-CHACHA20-SHA256
@@ -1,100 +1,97 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 dc 01 00 00  d8 03 03 7f d6 02 2f 2d  |............../-|
-00000010  ed b1 3c f2 c2 48 5e d5  f4 57 c9 8c ba 81 36 52  |..<..H^..W....6R|
-00000020  85 3e 79 de 79 cc 36 6a  f9 88 89 20 db e1 89 a5  |.>y.y.6j... ....|
-00000030  26 4c 2a 2d 0f 33 e2 3f  57 05 cc 74 cd 4c 96 be  |&L*-.3.?W..t.L..|
-00000040  91 94 ef 54 1c 1f 01 ef  d4 36 75 2f 00 04 13 03  |...T.....6u/....|
-00000050  00 ff 01 00 00 8b 00 00  00 0e 00 0c 00 00 09 31  |...............1|
-00000060  32 37 2e 30 2e 30 2e 31  00 0b 00 04 03 00 01 02  |27.0.0.1........|
-00000070  00 0a 00 0c 00 0a 00 1d  00 17 00 1e 00 19 00 18  |................|
-00000080  00 16 00 00 00 17 00 00  00 0d 00 1e 00 1c 04 03  |................|
-00000090  05 03 06 03 08 07 08 08  08 09 08 0a 08 0b 08 04  |................|
-000000a0  08 05 08 06 04 01 05 01  06 01 00 2b 00 03 02 03  |...........+....|
-000000b0  04 00 2d 00 02 01 01 00  33 00 26 00 24 00 1d 00  |..-.....3.&.$...|
-000000c0  20 30 20 a8 d0 3d ea df  38 aa 65 6f dd c8 25 13  | 0 ..=..8.eo..%.|
-000000d0  03 c4 a2 24 d4 a8 0d 1a  a6 65 32 75 83 ef 71 70  |...$.....e2u..qp|
-000000e0  30                                                |0|
+00000000  16 03 01 00 ca 01 00 00  c6 03 03 c4 32 0e 10 66  |............2..f|
+00000010  40 b2 cd 10 90 69 42 31  34 21 b1 a4 0e 15 f9 1e  |@....iB14!......|
+00000020  cd 2b 1d 1a 9a a5 4c 27  87 aa ba 20 6a f8 a9 57  |.+....L'... j..W|
+00000030  72 d6 5b 81 86 e7 df a0  9c a3 f4 21 30 c9 68 f3  |r.[........!0.h.|
+00000040  81 7c 2a 3a c6 fe 97 d7  40 c9 41 79 00 04 13 03  |.|*:....@.Ay....|
+00000050  00 ff 01 00 00 79 00 0b  00 04 03 00 01 02 00 0a  |.....y..........|
+00000060  00 0c 00 0a 00 1d 00 17  00 1e 00 19 00 18 00 16  |................|
+00000070  00 00 00 17 00 00 00 0d  00 1e 00 1c 04 03 05 03  |................|
+00000080  06 03 08 07 08 08 08 09  08 0a 08 0b 08 04 08 05  |................|
+00000090  08 06 04 01 05 01 06 01  00 2b 00 03 02 03 04 00  |.........+......|
+000000a0  2d 00 02 01 01 00 33 00  26 00 24 00 1d 00 20 89  |-.....3.&.$... .|
+000000b0  77 64 a7 d7 9f 30 4d 07  5c 4c f5 3b 67 a3 f2 e3  |wd...0M.\L.;g...|
+000000c0  55 bb bb 9f 2e 18 26 04  b2 1a a2 64 c5 39 67     |U.....&....d.9g|
 >>> Flow 2 (server to client)
 00000000  16 03 03 00 7a 02 00 00  76 03 03 00 00 00 00 00  |....z...v.......|
 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 db e1 89 a5  |........... ....|
-00000030  26 4c 2a 2d 0f 33 e2 3f  57 05 cc 74 cd 4c 96 be  |&L*-.3.?W..t.L..|
-00000040  91 94 ef 54 1c 1f 01 ef  d4 36 75 2f 13 03 00 00  |...T.....6u/....|
+00000020  00 00 00 00 00 00 00 00  00 00 00 20 6a f8 a9 57  |........... j..W|
+00000030  72 d6 5b 81 86 e7 df a0  9c a3 f4 21 30 c9 68 f3  |r.[........!0.h.|
+00000040  81 7c 2a 3a c6 fe 97 d7  40 c9 41 79 13 03 00 00  |.|*:....@.Ay....|
 00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 2f  |..+.....3.$... /|
 00000060  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
 00000070  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74 14  |.........._X.;t.|
-00000080  03 03 00 01 01 17 03 03  00 17 f4 9a 6e ea 99 81  |............n...|
-00000090  59 33 26 a6 6a 40 1d a9  59 67 31 35 09 b0 ed 15  |Y3&.j@..Yg15....|
-000000a0  83 17 03 03 02 6d 56 59  69 c8 6d 45 c6 2f 58 3d  |.....mVYi.mE./X=|
-000000b0  db 87 dd 56 0f 2d d9 21  1b 97 94 77 f2 72 28 0d  |...V.-.!...w.r(.|
-000000c0  48 04 79 83 7e 2e a1 c9  30 56 d7 9c c8 0a 37 65  |H.y.~...0V....7e|
-000000d0  b6 6b 31 ae 9a 5f ff 13  15 94 99 7c 92 e1 32 80  |.k1.._.....|..2.|
-000000e0  28 3c ab b1 cc fe ba 92  3c 03 bb fd b8 55 f5 f2  |(<......<....U..|
-000000f0  ba be 28 90 c5 7e 07 48  d5 45 b6 84 80 02 2d cd  |..(..~.H.E....-.|
-00000100  14 27 81 b6 4e b4 7f 5f  78 a3 26 c2 0c af 12 d6  |.'..N.._x.&.....|
-00000110  e9 14 22 c8 ee 2e 5e fc  c3 ca 8f 01 9b 37 6a b0  |.."...^......7j.|
-00000120  f8 53 b2 8e 31 d7 1f 34  f6 35 ed 81 e0 f7 6f e1  |.S..1..4.5....o.|
-00000130  90 cf 1a 4f 44 50 d5 cd  96 c3 4a 22 7a 54 28 bd  |...ODP....J"zT(.|
-00000140  88 56 5c 77 67 eb a6 78  5c 8b 82 39 03 13 55 c3  |.V\wg..x\..9..U.|
-00000150  20 68 45 26 7a 96 fe 1c  f9 33 14 1e 1d 8a 5f 51  | hE&z....3...._Q|
-00000160  c3 2f 17 91 ba 37 63 49  e1 65 89 bf e8 a1 27 5f  |./...7cI.e....'_|
-00000170  fd 59 46 80 f7 9b 45 89  50 ab cd 9b aa b4 45 04  |.YF...E.P.....E.|
-00000180  b5 1b 85 88 1c 59 ba b2  d6 50 0b fd 5c d9 59 83  |.....Y...P..\.Y.|
-00000190  7a 6c 9b ad 27 33 a0 49  74 eb a6 cd a8 e8 4b d7  |zl..'3.It.....K.|
-000001a0  71 ef 63 64 ff 24 a7 09  2e b7 f6 6f 9d 9f 75 84  |q.cd.$.....o..u.|
-000001b0  97 0a 76 bf 72 ed ff e8  1a 49 ca 0b 0d f5 2c fb  |..v.r....I....,.|
-000001c0  69 c2 5c fe db 58 0a a1  9c d4 47 6a 8f a6 bd ec  |i.\..X....Gj....|
-000001d0  32 fb 40 6a 71 9d 19 37  e6 fd d4 3d fa 5b f3 53  |2.@jq..7...=.[.S|
-000001e0  43 df d5 fa 53 29 40 70  77 a6 9e f7 03 7d 08 8b  |C...S)@pw....}..|
-000001f0  5a 71 73 e5 af 45 58 56  9f 56 ad 73 aa d2 b3 7c  |Zqs..EXV.V.s...||
-00000200  92 99 c8 04 16 bf ca f2  81 2e 29 c3 79 21 f1 11  |..........).y!..|
-00000210  92 f4 1d 34 24 73 e3 82  28 5a 31 70 45 da 8d 94  |...4$s..(Z1pE...|
-00000220  38 75 31 bc f9 e5 2b 11  7e fd bc 19 fe 65 ad 53  |8u1...+.~....e.S|
-00000230  e5 e6 17 b8 69 ea 54 fd  92 a9 41 7a 8c 7f da 4f  |....i.T...Az...O|
-00000240  ba f1 9f a2 e2 5b e7 7a  23 17 9e 29 95 7e 72 79  |.....[.z#..).~ry|
-00000250  22 67 c5 68 0a 4d fb e9  64 61 3a 53 18 e7 dd 7d  |"g.h.M..da:S...}|
-00000260  5b 16 b9 fa 69 95 82 eb  ee 1a 30 97 93 97 fc ee  |[...i.....0.....|
-00000270  9e 2b 22 64 08 7d 25 05  77 5e d7 bd 0e c3 9f a4  |.+"d.}%.w^......|
-00000280  f4 bf 77 3d 56 84 c8 a1  10 1c e0 5b da 39 3d 2d  |..w=V......[.9=-|
-00000290  92 80 9a 07 b2 29 c5 ab  e0 e1 1c ad ba 3e fa 4e  |.....).......>.N|
-000002a0  65 4f 31 63 de 33 6a 5c  af e0 88 70 fc 6e 6a a2  |eO1c.3j\...p.nj.|
-000002b0  ca da 2f 14 1d 4f 8c 7d  8d da 36 9b ea 7f 7e 79  |../..O.}..6...~y|
-000002c0  9c dc 4a 3b 69 d9 50 31  bb f2 f8 8a 7f 6e 73 bc  |..J;i.P1.....ns.|
-000002d0  41 7c 3a 86 10 91 9b 3a  8e 3e c8 bc 6a c4 4d f2  |A|:....:.>..j.M.|
-000002e0  45 87 49 49 d2 2f aa 4d  d0 6f e9 1e a4 d6 06 63  |E.II./.M.o.....c|
-000002f0  ac 90 ce 9a cb f7 97 55  2b e8 8c 8d 55 f6 32 26  |.......U+...U.2&|
-00000300  55 d4 60 0e c0 0b da 0e  ac c9 4c c3 95 03 54 d7  |U.`.......L...T.|
-00000310  99 ec e1 17 03 03 00 99  c4 65 5e 67 e3 a1 98 d6  |.........e^g....|
-00000320  f8 34 15 ed a9 55 80 c7  c0 e7 ca 67 f1 cb 58 e2  |.4...U.....g..X.|
-00000330  6e 4d d4 9e 18 c3 37 c2  ff 72 bc cb 8e 6a 97 e2  |nM....7..r...j..|
-00000340  b5 83 75 34 2a 75 9f 7f  8e 1e 47 e6 cd 53 85 c5  |..u4*u....G..S..|
-00000350  69 b6 c0 46 9f 46 a8 09  6a 21 d5 af 36 d2 d0 ba  |i..F.F..j!..6...|
-00000360  65 0f da a5 af eb 3a 0c  8b 85 00 2a dd 11 71 28  |e.....:....*..q(|
-00000370  5b 71 a9 df 69 20 8a d9  27 1e 4f 02 89 03 6f 27  |[q..i ..'.O...o'|
-00000380  20 e1 37 17 69 c2 62 3e  46 39 43 2d 64 43 f3 cc  | .7.i.b>F9C-dC..|
-00000390  14 5f a0 73 06 bf 42 cb  da 79 21 28 b1 a1 c4 de  |._.s..B..y!(....|
-000003a0  39 98 83 ad 3a d6 05 fd  58 b0 2c 97 bf 48 74 0e  |9...:...X.,..Ht.|
-000003b0  25 17 03 03 00 35 69 10  76 25 e3 9e 63 10 76 73  |%....5i.v%..c.vs|
-000003c0  f5 fc 90 2c 95 e5 dc 29  79 a0 ed 0a 3a 72 58 38  |...,...)y...:rX8|
-000003d0  bf b9 17 af 77 9f 05 92  af d4 a7 c7 d6 56 77 01  |....w........Vw.|
-000003e0  da 94 31 d2 be be 95 e1  b1 95 75 17 03 03 00 93  |..1.......u.....|
-000003f0  f9 fa a9 41 89 d3 e8 3b  cb 11 63 76 56 fe 28 86  |...A...;..cvV.(.|
-00000400  87 b0 0f d0 4d a8 fb 22  e9 89 f6 40 8a db 51 be  |....M.."...@..Q.|
-00000410  2c 9f 9c 39 f4 43 bc 1f  b0 32 9b 9c 8e a6 6e e1  |,..9.C...2....n.|
-00000420  f3 f7 f0 91 ed 56 6f 2d  be 37 6b 3b ed f7 5b a6  |.....Vo-.7k;..[.|
-00000430  d3 14 0a f9 58 b8 7b 37  fc 15 97 57 79 16 8c 0c  |....X.{7...Wy...|
-00000440  d2 93 7a 58 b8 48 51 f7  58 82 7d a0 4b e1 41 f6  |..zX.HQ.X.}.K.A.|
-00000450  e1 44 12 1e ea 80 f3 b6  d0 72 ec 5c 84 01 6a b3  |.D.......r.\..j.|
-00000460  f7 83 b5 47 22 0b e7 03  60 09 a7 23 23 20 5e 6b  |...G"...`..## ^k|
-00000470  f6 25 34 64 11 ad 46 90  db cb 13 f5 10 0a 75 e8  |.%4d..F.......u.|
-00000480  3e c8 03                                          |>..|
+00000080  03 03 00 01 01 17 03 03  00 17 db 02 44 4c 7e 06  |............DL~.|
+00000090  95 c7 f2 f7 8f f7 80 96  d0 11 b7 d7 d6 9e 40 3b  |..............@;|
+000000a0  0f 17 03 03 02 6d 63 90  e6 9e e7 fd 52 34 74 8f  |.....mc.....R4t.|
+000000b0  e5 db e8 90 49 90 89 8a  c3 7f 33 a0 c7 91 2a 3f  |....I.....3...*?|
+000000c0  c5 1f 0c 00 58 9f 5e d7  01 35 24 92 a7 66 db 0e  |....X.^..5$..f..|
+000000d0  fd d3 6c ff 58 61 56 39  b3 9b 05 d2 a1 9f ab f1  |..l.XaV9........|
+000000e0  29 ce b0 c6 37 c5 56 8d  0b 2a bd 0c 04 a3 c8 4e  |)...7.V..*.....N|
+000000f0  61 08 44 4b b7 f1 12 60  a9 f6 e7 02 14 e7 d4 1a  |a.DK...`........|
+00000100  cf e6 4d ce 11 7c e3 7b  44 95 6d fa 8e b2 3b f4  |..M..|.{D.m...;.|
+00000110  bb 8e fa ed be ec fb f4  1d d0 12 56 d3 64 c8 cd  |...........V.d..|
+00000120  58 e0 e0 df c1 f2 c7 b5  7a 6c 23 ff d1 78 b7 76  |X.......zl#..x.v|
+00000130  a5 96 66 5c 4e 49 5a 8e  fd 9d 74 dc e7 f0 99 f8  |..f\NIZ...t.....|
+00000140  d5 95 7a 5b ba b6 ab 87  90 a5 35 19 bf 99 2c 04  |..z[......5...,.|
+00000150  93 61 e3 9b 5c 06 48 38  f0 25 8a be 30 cd 43 c0  |.a..\.H8.%..0.C.|
+00000160  10 c9 1d 51 3e 93 5f 6c  02 1c 38 fe 78 44 1a ea  |...Q>._l..8.xD..|
+00000170  99 a4 ef 7d 03 ce 71 95  d7 1d e1 b3 b8 e2 20 99  |...}..q....... .|
+00000180  aa 30 0f c1 75 a7 0d 39  98 12 96 27 c6 39 b8 57  |.0..u..9...'.9.W|
+00000190  6e ab 79 c7 91 c2 56 9d  b3 e1 cb 17 6a cc 42 47  |n.y...V.....j.BG|
+000001a0  fc a4 52 10 ab cd 4b 1f  65 3e 35 61 ed 38 99 7b  |..R...K.e>5a.8.{|
+000001b0  a7 79 02 f2 16 cb 85 fb  85 f8 86 56 40 6b ee 2f  |.y.........V@k./|
+000001c0  38 c6 4f 9c 25 14 b6 e4  5f 5c cc 73 ef 69 f3 5a  |8.O.%..._\.s.i.Z|
+000001d0  c6 ef 0d 65 e8 d4 f8 c6  0c 5b 09 88 4d 09 e7 50  |...e.....[..M..P|
+000001e0  86 d0 2d 6c 8c 99 d0 d9  6a 24 77 97 47 59 9d ce  |..-l....j$w.GY..|
+000001f0  b9 a5 34 99 f6 0b 08 9a  7e 79 8d 84 8e c2 ae ac  |..4.....~y......|
+00000200  ca b3 af 5d 7d 96 d2 99  3b da ee ec 36 b3 ad 71  |...]}...;...6..q|
+00000210  89 17 de 52 71 75 99 ca  e7 02 c2 ab ae da 5b 22  |...Rqu........["|
+00000220  a7 88 0c ae c5 c0 b0 1f  3c cd da fa e7 8b 39 46  |........<.....9F|
+00000230  84 c0 1a 33 29 ed 90 0e  5b 32 86 96 9f 97 69 66  |...3)...[2....if|
+00000240  90 08 0e 0e 84 4d 43 55  c1 be 08 20 85 fc 9d 7a  |.....MCU... ...z|
+00000250  a6 df e8 31 b0 35 c3 69  b6 14 b2 ec 6c 7d ad ae  |...1.5.i....l}..|
+00000260  2b b4 c0 5a d1 07 a7 45  17 93 d6 a5 50 d0 e4 cc  |+..Z...E....P...|
+00000270  97 85 5d 06 21 62 e2 95  d7 b5 a5 a9 08 cf 34 f4  |..].!b........4.|
+00000280  ae cc 17 e4 0e 4e 5a 13  b1 73 03 45 b9 29 b5 45  |.....NZ..s.E.).E|
+00000290  77 a1 4b 2f 8f c5 72 41  dc ab f9 b7 f3 72 28 f4  |w.K/..rA.....r(.|
+000002a0  cb 08 07 0a 20 7c 8b 26  70 92 7b 7b b9 99 61 0a  |.... |.&p.{{..a.|
+000002b0  63 17 e2 96 86 0a 6a 56  a1 90 1f 5e 50 bb 7f 72  |c.....jV...^P..r|
+000002c0  73 58 f4 25 c8 18 ec a5  b1 86 cd 96 77 57 91 67  |sX.%........wW.g|
+000002d0  76 e1 7a bf 1b 40 62 a0  58 d7 e8 2c 4c 86 7b ed  |v.z..@b.X..,L.{.|
+000002e0  7f 3f 43 38 88 97 f7 a1  5f 22 0c a0 4a a4 b3 b9  |.?C8...._"..J...|
+000002f0  11 2c 31 f3 98 f0 21 42  fb 42 a7 9e 38 ce 58 5f  |.,1...!B.B..8.X_|
+00000300  bc d0 a5 43 07 d2 e1 4b  5f 5c fd 56 da 99 63 2a  |...C...K_\.V..c*|
+00000310  0d 7f 46 17 03 03 00 99  bf be 5f 82 e4 2b d8 9f  |..F......._..+..|
+00000320  cf ab 68 b0 3d a4 a0 c7  c3 41 dd e5 46 cf 7b 55  |..h.=....A..F.{U|
+00000330  c7 6d 76 e4 62 60 c5 ae  d3 a0 f0 44 8c 88 de 05  |.mv.b`.....D....|
+00000340  5e 5e 03 61 fe 66 22 31  cf f5 75 b6 97 51 36 79  |^^.a.f"1..u..Q6y|
+00000350  f0 b7 d1 7f e6 1a fa 04  73 23 ad 66 f8 6c 47 a7  |........s#.f.lG.|
+00000360  cc 0b 96 c4 a7 a8 e8 4c  91 bc c9 32 30 ec db 2e  |.......L...20...|
+00000370  73 68 00 5b c3 83 17 60  51 b1 03 8d c3 f9 e1 e8  |sh.[...`Q.......|
+00000380  f7 e7 a8 f4 94 b7 4f c1  bf aa 50 49 61 b1 11 0a  |......O...PIa...|
+00000390  78 24 cc 16 3b e5 10 72  95 df e4 a3 5d 2c ff ad  |x$..;..r....],..|
+000003a0  bd 50 04 93 3c 3c 48 28  0b e3 d9 d3 db 4d 4a 8f  |.P..<<H(.....MJ.|
+000003b0  62 17 03 03 00 35 b2 f4  32 f5 f9 b9 f3 cc 15 d5  |b....5..2.......|
+000003c0  d7 85 83 e7 37 5f ac 10  4f 2f 43 59 0b a6 4b 9c  |....7_..O/CY..K.|
+000003d0  2b e8 c3 87 fa 3f 4d b5  54 75 93 ab 2f 4c 72 03  |+....?M.Tu../Lr.|
+000003e0  6f 8f f4 ac 43 d1 4c dc  62 b7 6d 17 03 03 00 8b  |o...C.L.b.m.....|
+000003f0  89 17 54 55 04 e9 55 45  a3 82 7e e9 7c 2e 28 6b  |..TU..UE..~.|.(k|
+00000400  28 a7 82 f1 e7 db cd 3e  ac 6e d8 d0 0b 0e 52 73  |(......>.n....Rs|
+00000410  b0 01 2c 04 8e 7b 70 c3  36 85 a4 44 aa 15 63 d6  |..,..{p.6..D..c.|
+00000420  7d f4 81 86 3c 1e ad d3  b3 2c ea 33 bf 0e 71 68  |}...<....,.3..qh|
+00000430  4a 1a 3a 98 bb 21 d4 75  6c 0d d2 30 b4 b3 86 5d  |J.:..!.ul..0...]|
+00000440  90 ab 49 dc 18 4f 08 10  8b 23 8d bd 61 68 75 ee  |..I..O...#..ahu.|
+00000450  87 62 54 2d 2d 1e c0 39  5c eb 32 40 7a da 4d 2f  |.bT--..9\.2@z.M/|
+00000460  83 f9 e8 1f 71 d7 79 99  24 8a b7 13 25 64 a6 ae  |....q.y.$...%d..|
+00000470  29 e2 48 6f f7 52 cf a4  aa c2 70                 |).Ho.R....p|
 >>> Flow 3 (client to server)
-00000000  14 03 03 00 01 01 17 03  03 00 35 27 f0 39 68 fc  |..........5'.9h.|
-00000010  9f 6c a4 fd a7 cf 1f 25  67 54 3c e6 9e 7c 99 5a  |.l.....%gT<..|.Z|
-00000020  e9 b7 3c 0c f2 dc b6 22  36 0d 43 a3 ee 76 4b a9  |..<...."6.C..vK.|
-00000030  6a cb b8 f6 8a c8 58 91  79 19 95 7c 83 a0 87 57  |j.....X.y..|...W|
+00000000  14 03 03 00 01 01 17 03  03 00 35 5e e5 2f e4 ed  |..........5^./..|
+00000010  87 c3 26 01 1a d0 4d c7  95 16 76 be 17 a3 f4 1f  |..&...M...v.....|
+00000020  57 27 f6 19 62 30 7e f0  47 6e 11 7f ce 85 54 9a  |W'..b0~.Gn....T.|
+00000030  1e 86 9a c6 10 5e 38 3c  0a de d1 4e 7e f1 9d 0f  |.....^8<...N~...|
 >>> Flow 4 (server to client)
-00000000  17 03 03 00 1e d5 8a ef  04 f9 6c 27 62 0a f1 a4  |..........l'b...|
-00000010  4b 7f e4 e4 ff 53 f3 61  20 b9 56 96 30 f9 06 c9  |K....S.a .V.0...|
-00000020  cc 9c ed 17 03 03 00 13  4a 83 cd 86 98 97 20 45  |........J..... E|
-00000030  ab 2f c5 72 15 f6 ed a8  8c 8c 0e                 |./.r.......|
+00000000  17 03 03 00 1e 1f a0 f2  e5 47 62 54 e2 07 3d e2  |.........GbT..=.|
+00000010  42 8a be ec e0 92 4e ae  1e 7a 75 6f 8d c0 65 73  |B.....N..zuo..es|
+00000020  b5 eb bc 17 03 03 00 13  89 03 04 f9 42 a9 6d cf  |............B.m.|
+00000030  68 67 f4 ca e0 87 f9 ef  d4 42 6a                 |hg.......Bj|
diff --git a/src/crypto/tls/testdata/Server-TLSv13-ClientAuthRequestedAndECDSAGiven b/src/crypto/tls/testdata/Server-TLSv13-ClientAuthRequestedAndECDSAGiven
index 0b6eaf4..a957c26 100644
--- a/src/crypto/tls/testdata/Server-TLSv13-ClientAuthRequestedAndECDSAGiven
+++ b/src/crypto/tls/testdata/Server-TLSv13-ClientAuthRequestedAndECDSAGiven
@@ -1,179 +1,180 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 ca 01 00 00  c6 03 03 54 78 64 8e b6  |...........Txd..|
-00000010  69 c6 1c 8a 69 eb 09 ef  32 59 f9 9f 63 ac 6e 66  |i...i...2Y..c.nf|
-00000020  97 b4 bb b7 71 27 60 52  af c4 64 20 26 de 8d 3e  |....q'`R..d &..>|
-00000030  90 5b c8 96 b5 10 a3 e4  67 f3 39 fb f5 b7 df 50  |.[......g.9....P|
-00000040  2b 8f 2d cb a5 c4 0a c9  28 1b c3 21 00 04 13 01  |+.-.....(..!....|
+00000000  16 03 01 00 ca 01 00 00  c6 03 03 cd 87 c0 5e 7c  |..............^||
+00000010  7b d7 c6 77 d9 21 6f 46  00 07 88 61 18 8c b9 d4  |{..w.!oF...a....|
+00000020  ad 25 6a 9d 7e 54 cc 70  52 7c 0f 20 67 9b dd 18  |.%j.~T.pR|. g...|
+00000030  84 bb 23 7d 53 10 b9 6c  01 ef 30 6f 79 7d 64 5c  |..#}S..l..0oy}d\|
+00000040  79 3e c1 11 8f 75 cf 83  02 d3 e8 d9 00 04 13 01  |y>...u..........|
 00000050  00 ff 01 00 00 79 00 0b  00 04 03 00 01 02 00 0a  |.....y..........|
 00000060  00 0c 00 0a 00 1d 00 17  00 1e 00 19 00 18 00 16  |................|
 00000070  00 00 00 17 00 00 00 0d  00 1e 00 1c 04 03 05 03  |................|
 00000080  06 03 08 07 08 08 08 09  08 0a 08 0b 08 04 08 05  |................|
 00000090  08 06 04 01 05 01 06 01  00 2b 00 03 02 03 04 00  |.........+......|
-000000a0  2d 00 02 01 01 00 33 00  26 00 24 00 1d 00 20 65  |-.....3.&.$... e|
-000000b0  42 a2 bd 1e e0 0a 52 2d  7a 1e f0 37 86 db 9e c6  |B.....R-z..7....|
-000000c0  d6 cd ff 7b 71 f3 4c a3  23 44 2d 94 60 93 0b     |...{q.L.#D-.`..|
+000000a0  2d 00 02 01 01 00 33 00  26 00 24 00 1d 00 20 d7  |-.....3.&.$... .|
+000000b0  18 8a c1 a5 4d cb 7c f2  7d e4 cf 7a c6 92 28 ee  |....M.|.}..z..(.|
+000000c0  a6 b4 79 65 bf 2b fb 71  2e a5 2a 58 da 6f 5e     |..ye.+.q..*X.o^|
 >>> Flow 2 (server to client)
 00000000  16 03 03 00 7a 02 00 00  76 03 03 00 00 00 00 00  |....z...v.......|
 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 26 de 8d 3e  |........... &..>|
-00000030  90 5b c8 96 b5 10 a3 e4  67 f3 39 fb f5 b7 df 50  |.[......g.9....P|
-00000040  2b 8f 2d cb a5 c4 0a c9  28 1b c3 21 13 01 00 00  |+.-.....(..!....|
+00000020  00 00 00 00 00 00 00 00  00 00 00 20 67 9b dd 18  |........... g...|
+00000030  84 bb 23 7d 53 10 b9 6c  01 ef 30 6f 79 7d 64 5c  |..#}S..l..0oy}d\|
+00000040  79 3e c1 11 8f 75 cf 83  02 d3 e8 d9 13 01 00 00  |y>...u..........|
 00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 2f  |..+.....3.$... /|
 00000060  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
 00000070  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74 14  |.........._X.;t.|
-00000080  03 03 00 01 01 17 03 03  00 17 f1 7c 16 5a 86 b4  |...........|.Z..|
-00000090  13 82 93 fa ba 07 35 24  03 f5 24 25 cc 2d c8 e5  |......5$..$%.-..|
-000000a0  6c 17 03 03 00 3e cb 02  08 06 a3 75 03 c6 5d d9  |l....>.....u..].|
-000000b0  9c 66 ad db 29 6d 93 a6  53 c6 38 7f 9c 56 1e b1  |.f..)m..S.8..V..|
-000000c0  f5 a8 77 19 43 c3 93 5e  67 dc 80 db 1b c8 30 b2  |..w.C..^g.....0.|
-000000d0  04 85 6e 5c 8f 3a 4a f2  d2 aa 17 c7 d3 ea 29 f2  |..n\.:J.......).|
-000000e0  09 08 49 90 17 03 03 02  6d dd 26 0f f5 1b 6b 11  |..I.....m.&...k.|
-000000f0  1c c7 e9 87 bf de 58 08  e4 bc a6 49 98 fd bf 87  |......X....I....|
-00000100  31 35 59 c1 88 5a 8c 0d  e7 42 47 b6 cb ec 3c 6f  |15Y..Z...BG...<o|
-00000110  ba 01 4a bb 0c 7d d3 ae  0c 62 97 20 b5 f4 84 a0  |..J..}...b. ....|
-00000120  4c 30 87 8e 3c 11 24 b6  6f cc 8b de d4 ee 47 c0  |L0..<.$.o.....G.|
-00000130  47 92 00 0f 56 91 04 b3  42 93 1f 5c df 6e f6 f1  |G...V...B..\.n..|
-00000140  51 68 95 ad cd 4d 6e 7e  98 b9 57 da fb 01 45 45  |Qh...Mn~..W...EE|
-00000150  a7 d6 62 3d cb 48 f2 7c  18 03 52 50 51 c4 84 3e  |..b=.H.|..RPQ..>|
-00000160  16 e6 ff be 29 a3 60 13  f8 8c 82 6c 84 dd c1 c8  |....).`....l....|
-00000170  8b a2 bf e5 70 03 c3 a4  92 3d 99 a8 fc 92 15 e4  |....p....=......|
-00000180  1d 13 7d b5 1f d3 a6 76  1c 8c 9f 9f e7 87 b4 fb  |..}....v........|
-00000190  25 b8 cf 83 0a 3b bd c7  e8 30 d4 15 6f ae d5 b9  |%....;...0..o...|
-000001a0  da 3b c6 3f 0c 06 7a 78  e6 ac ca 64 cb 34 cc 7b  |.;.?..zx...d.4.{|
-000001b0  46 78 ec e2 22 9e 31 39  63 a7 7b 1d d6 c2 4b 91  |Fx..".19c.{...K.|
-000001c0  45 fa 95 54 ef 9b b3 2e  55 83 77 c8 cf 15 b5 34  |E..T....U.w....4|
-000001d0  11 4c 92 36 22 54 3d 2f  b0 cb 28 7f 2b 1e b1 3f  |.L.6"T=/..(.+..?|
-000001e0  38 4a 4a d6 e8 a1 e6 e0  4f 20 ab 04 6f 6b 00 5e  |8JJ.....O ..ok.^|
-000001f0  d4 16 42 ab a5 04 67 9b  89 45 78 8b ea 0e 7d c8  |..B...g..Ex...}.|
-00000200  24 d5 fb 83 c7 13 25 b7  1b 6f 3f 2a 2e cf bb 71  |$.....%..o?*...q|
-00000210  11 48 5d e6 98 5e ca dd  f7 6d dc 93 b1 51 1e 99  |.H]..^...m...Q..|
-00000220  b9 e0 4c 39 c8 82 d8 9f  8d 70 25 78 5b b1 85 1d  |..L9.....p%x[...|
-00000230  cb 75 31 61 c3 ad d5 c1  d5 1f 26 06 60 5f cd eb  |.u1a......&.`_..|
-00000240  ee 4c 99 43 02 b9 e5 f5  99 98 94 cf 14 1c ad 54  |.L.C...........T|
-00000250  20 a9 d3 73 f2 3f bc a1  25 39 8b ff c4 e0 ee 8b  | ..s.?..%9......|
-00000260  ba ec fc b0 c2 42 4c 5a  30 9c 26 1b f0 f2 da 94  |.....BLZ0.&.....|
-00000270  26 69 55 0e fb 84 a0 58  95 43 08 6c 87 82 93 02  |&iU....X.C.l....|
-00000280  cf 27 99 94 a3 ae 9f 08  d0 6e f2 a8 e8 29 fc a8  |.'.......n...)..|
-00000290  67 d3 20 37 83 5d 8a 12  0a 57 10 bf 30 5a e1 05  |g. 7.]...W..0Z..|
-000002a0  30 e0 b7 7b 47 7e a6 07  cc 9a dd 6d e8 11 89 c7  |0..{G~.....m....|
-000002b0  7d 98 c3 6d 83 9f 1b f4  ff ca 31 c8 39 7b c2 fb  |}..m......1.9{..|
-000002c0  69 dc ee eb ab e2 39 72  35 6b 22 e4 84 2f 1d 58  |i.....9r5k"../.X|
-000002d0  07 b0 9e 3e 69 ca ff 17  44 d6 e4 a8 56 6a 24 35  |...>i...D...Vj$5|
-000002e0  08 39 42 41 da 76 4b 4f  00 ce 41 58 4e 70 d5 b6  |.9BA.vKO..AXNp..|
-000002f0  50 b4 88 91 47 4a 89 04  ef e8 14 2e cf e3 9d 36  |P...GJ.........6|
-00000300  c0 b5 2b 8e 42 2f 4b 95  39 55 6f 5a 23 5b 5e 05  |..+.B/K.9UoZ#[^.|
-00000310  f0 34 70 c0 f7 92 54 e2  5c 52 20 b0 c1 2a 9a cb  |.4p...T.\R ..*..|
-00000320  3a 32 0e 93 77 96 f2 6a  d8 f7 bc 7c d8 40 4e 5e  |:2..w..j...|.@N^|
-00000330  37 1c 8b aa 75 89 94 51  da 19 72 80 86 c8 3d bd  |7...u..Q..r...=.|
-00000340  fd 7d 06 13 bb 54 a1 0b  46 58 07 e5 35 b3 f3 ff  |.}...T..FX..5...|
-00000350  8a 98 9d e6 e8 05 17 03  03 00 99 5a 63 3c ff cc  |...........Zc<..|
-00000360  a0 ec 5f 52 4d 28 96 80  22 f7 8c a7 ad b7 1f 4a  |.._RM(.."......J|
-00000370  8c 46 79 06 31 96 46 f9  f0 57 8c c4 5b f9 71 61  |.Fy.1.F..W..[.qa|
-00000380  34 0d 3e 78 67 05 1c 93  a7 a2 cd ea ce e5 a2 6e  |4.>xg..........n|
-00000390  37 4f 16 a4 e4 4c 60 d5  5a 37 f1 2a bf ce 2f 80  |7O...L`.Z7.*../.|
-000003a0  ea 65 e6 25 03 fc 2b 17  3f a4 71 3f 04 46 2b f7  |.e.%..+.?.q?.F+.|
-000003b0  12 b0 a6 f3 fc 8d cf 5e  95 85 84 88 e4 db 46 a4  |.......^......F.|
-000003c0  f2 3a a5 27 44 3d a2 03  b3 65 af 1f e3 44 aa 02  |.:.'D=...e...D..|
-000003d0  0f 39 eb 3d 0e 2a ae 0c  1b ed 84 df 8d e3 a2 1d  |.9.=.*..........|
-000003e0  6d 55 bf d6 13 f6 00 da  93 a7 fc b1 50 79 2c a9  |mU..........Py,.|
-000003f0  93 cb 7d 70 17 03 03 00  35 9e b7 c2 c6 29 a9 43  |..}p....5....).C|
-00000400  3f df 06 80 31 ac d9 f7  3b cd 14 16 a0 85 ca e6  |?...1...;.......|
-00000410  34 70 e3 fc af 1c 94 9b  87 b3 17 6c a4 83 64 2c  |4p.........l..d,|
-00000420  6e 26 4c e9 ab 79 a9 c8  1d d4 1c 96 2c f2        |n&L..y......,.|
+00000080  03 03 00 01 01 17 03 03  00 17 4d 4b 33 12 cb ed  |..........MK3...|
+00000090  f7 a2 55 e7 a6 ab 5b b1  55 16 30 c3 ee e1 5c 14  |..U...[.U.0...\.|
+000000a0  b8 17 03 03 00 3e 30 04  2a e5 e8 b8 f3 25 9b a9  |.....>0.*....%..|
+000000b0  92 e6 eb d9 fb b6 62 64  e2 de 9d c0 48 68 b3 d7  |......bd....Hh..|
+000000c0  0f 8b ad 21 69 c7 f0 d7  96 ff 6a 24 2f 01 c9 e7  |...!i.....j$/...|
+000000d0  e9 06 4b 93 94 67 97 44  46 c4 69 2f 0e aa e0 9b  |..K..g.DF.i/....|
+000000e0  8d 19 f2 2c 17 03 03 02  6d a1 fb 2b 5f 10 e9 62  |...,....m..+_..b|
+000000f0  8b ad c1 33 58 f6 a7 89  78 a6 dd 64 ff c2 c7 57  |...3X...x..d...W|
+00000100  80 9f 59 be 2d bd f5 b9  8a 6b d9 22 1c fe 10 ea  |..Y.-....k."....|
+00000110  c4 a5 3e 45 d9 d7 12 cf  48 d5 26 18 49 50 80 69  |..>E....H.&.IP.i|
+00000120  44 28 03 3b b6 f8 0a 0e  b4 cb 5e 5b 57 0f c0 2f  |D(.;......^[W../|
+00000130  59 4f 13 e3 9c 02 18 b1  ce 94 78 05 18 64 73 c6  |YO........x..ds.|
+00000140  05 89 d1 54 37 18 ea 09  61 08 c5 6a 54 f6 48 44  |...T7...a..jT.HD|
+00000150  40 63 6a 53 b9 41 5f 4f  8e 05 e7 31 7b 08 d0 67  |@cjS.A_O...1{..g|
+00000160  8e bf 56 c4 56 0a 82 b2  74 6a 89 dd b4 f7 3c 0b  |..V.V...tj....<.|
+00000170  3c fd 21 1f 00 72 1d 4f  be b1 50 44 9a 14 67 7d  |<.!..r.O..PD..g}|
+00000180  a9 93 30 a2 4e ea 61 c9  fd 44 de 5c 88 36 59 a2  |..0.N.a..D.\.6Y.|
+00000190  e3 63 b1 9c ea dd 47 0a  ca 63 9e 50 9d ca 57 12  |.c....G..c.P..W.|
+000001a0  05 9b fc f1 26 a2 5e 18  9b 32 00 38 1f ce a6 58  |....&.^..2.8...X|
+000001b0  58 0f 61 e2 44 c2 89 34  cc f4 fd 9a dc 1a 67 a6  |X.a.D..4......g.|
+000001c0  e8 b1 fc 9f dc bd 0b 21  01 49 0d 9b e1 40 00 f6  |.......!.I...@..|
+000001d0  33 1a 57 c5 84 c1 98 3d  7f 53 d3 4d 2e 04 5e 40  |3.W....=.S.M..^@|
+000001e0  7d 38 80 66 bc c5 40 d9  14 f6 83 26 82 9b c8 14  |}8.f..@....&....|
+000001f0  61 aa 6c 1c a1 53 81 f8  b0 7f 06 92 5c af be 57  |a.l..S......\..W|
+00000200  1a 54 97 02 27 31 1f 58  52 cf 39 2f 82 26 ae 6c  |.T..'1.XR.9/.&.l|
+00000210  86 d9 46 cd 38 16 e2 67  62 82 2e 53 7a 86 15 30  |..F.8..gb..Sz..0|
+00000220  08 0c a7 e2 85 18 55 79  16 44 4d 50 9e b5 e7 e1  |......Uy.DMP....|
+00000230  2c 1e 1d eb e1 83 f3 9e  d0 7b 45 b8 1e 51 d9 79  |,........{E..Q.y|
+00000240  91 7a b8 90 bc 18 94 69  ad 94 08 e5 23 de 2b fa  |.z.....i....#.+.|
+00000250  8d ef 23 4c 40 df e1 43  0d 71 51 ef 88 a9 bb 89  |..#L@..C.qQ.....|
+00000260  59 87 9c db e1 d4 31 94  a7 f5 af 7d 51 be e9 d0  |Y.....1....}Q...|
+00000270  f2 49 12 72 47 65 a0 5b  7d 9f 91 85 f7 e8 d6 90  |.I.rGe.[}.......|
+00000280  b3 4d f3 5d 6a 51 96 a9  81 84 72 95 47 e8 0a f5  |.M.]jQ....r.G...|
+00000290  8d d6 2a 64 c2 34 1b d8  f0 f9 62 0c be 17 12 9b  |..*d.4....b.....|
+000002a0  40 a2 c3 8a eb 30 20 04  e4 69 a3 27 90 a6 1a 4f  |@....0 ..i.'...O|
+000002b0  3f 95 65 e6 9e c7 ad 03  e1 d2 34 d2 84 d5 f6 8c  |?.e.......4.....|
+000002c0  1e 8a aa e4 75 c0 7f 1d  79 4e 70 10 4e 18 9c eb  |....u...yNp.N...|
+000002d0  17 76 0c 66 6c 82 72 41  83 98 fc 41 41 4a 07 03  |.v.fl.rA...AAJ..|
+000002e0  a6 16 51 0d 60 96 43 0a  97 27 72 42 31 70 6b 02  |..Q.`.C..'rB1pk.|
+000002f0  e4 58 b0 15 4f 2e a3 5a  ed dc 82 99 82 47 d5 6c  |.X..O..Z.....G.l|
+00000300  4b b4 68 70 f5 a3 31 36  52 8d af ab d1 ac f6 28  |K.hp..16R......(|
+00000310  2e 18 bc 4f 1b 7c a8 ad  c3 1f 2f 70 a6 c4 39 c6  |...O.|..../p..9.|
+00000320  ae 0f 2e b7 58 c9 c0 2a  4b 34 c2 42 12 e3 5d ed  |....X..*K4.B..].|
+00000330  d1 ac e1 f1 14 66 d4 09  1c a0 99 82 d3 04 13 2a  |.....f.........*|
+00000340  a4 20 c4 e7 38 1e 0a 02  4e 96 02 71 9d f6 f7 86  |. ..8...N..q....|
+00000350  f7 30 1a 5d 65 4f 17 03  03 00 99 3f 3d 4a 91 ae  |.0.]eO.....?=J..|
+00000360  0f 80 52 0f 1c d1 a2 75  83 e5 08 d8 1f 9d c8 24  |..R....u.......$|
+00000370  fc 85 ba 76 1f 9e 1e 35  a3 dd 45 83 8e b9 55 a6  |...v...5..E...U.|
+00000380  3b 26 ae 82 4f 1f 2e 8f  e5 25 fb d6 22 0f 55 d6  |;&..O....%..".U.|
+00000390  ac fa 93 6d d1 d3 7c 41  af c0 15 5c 8b e1 64 c1  |...m..|A...\..d.|
+000003a0  3f a2 c8 9e 48 f5 63 61  3a df 13 6e f4 e3 60 9d  |?...H.ca:..n..`.|
+000003b0  bc 52 bd b7 94 e9 4b 7a  65 97 28 ac 39 6a 77 a7  |.R....Kze.(.9jw.|
+000003c0  86 1d b4 6b e4 15 c4 bd  2b 41 b6 06 ac ff b5 9f  |...k....+A......|
+000003d0  17 47 b4 a7 1d 69 8b 6e  82 eb f7 39 03 95 10 dd  |.G...i.n...9....|
+000003e0  18 78 50 58 c8 78 80 ae  45 dc 54 0f 33 cb 4a d2  |.xPX.x..E.T.3.J.|
+000003f0  90 00 12 d4 17 03 03 00  35 76 fa bf ab 3f c3 3d  |........5v...?.=|
+00000400  dd 78 65 cc 35 1e 24 35  4f 7d 3c e4 bb 73 d8 19  |.xe.5.$5O}<..s..|
+00000410  56 94 f4 ce ad bc 1d 6a  fb 1b 75 01 93 36 2b 44  |V......j..u..6+D|
+00000420  3a 3c a3 9b 7c 57 6f 98  24 a3 64 b1 13 47        |:<..|Wo.$.d..G|
 >>> Flow 3 (client to server)
-00000000  14 03 03 00 01 01 17 03  03 02 1e 08 6d ee 1c 88  |............m...|
-00000010  63 86 93 3e 73 8e 87 6f  51 8b d3 d2 91 c5 cb 55  |c..>s..oQ......U|
-00000020  2d 7c 9f 32 d8 0a ab e5  53 95 4b 0c 22 12 23 56  |-|.2....S.K.".#V|
-00000030  07 ce 1b e1 46 f7 46 84  cb 47 83 62 4a 16 39 44  |....F.F..G.bJ.9D|
-00000040  bf 58 25 6e f1 22 d0 ea  06 d8 da 44 91 bb 27 41  |.X%n.".....D..'A|
-00000050  1f 6e 46 89 88 93 a7 0a  60 8f 1a e5 31 19 5c 27  |.nF.....`...1.\'|
-00000060  a3 f6 8c 1b ee 5b 2b 21  c4 64 c7 d9 92 7b e9 ca  |.....[+!.d...{..|
-00000070  e0 16 29 d0 64 32 95 a8  8f a8 24 cc 56 c6 3e 7d  |..).d2....$.V.>}|
-00000080  1b f6 06 a6 fa d6 dc 79  38 60 4f 6f b7 e1 10 ab  |.......y8`Oo....|
-00000090  21 14 8e e1 90 95 6d b6  f3 ca 86 1a dd 32 c5 33  |!.....m......2.3|
-000000a0  e1 fc 8c da 77 02 54 88  73 f3 72 71 c6 58 ad 1a  |....w.T.s.rq.X..|
-000000b0  10 b8 15 c3 69 f1 cc 71  b6 ea 7e b7 81 4b de 7b  |....i..q..~..K.{|
-000000c0  77 87 24 e0 c0 39 5c 5b  17 ad 7c 59 53 43 cf 7e  |w.$..9\[..|YSC.~|
-000000d0  cb 70 4d 51 f1 7e 8c 2b  19 61 13 75 bf 25 df 80  |.pMQ.~.+.a.u.%..|
-000000e0  f2 fa cd 70 8d db eb bc  38 ae 6a 0c ad ef d2 e2  |...p....8.j.....|
-000000f0  f0 f1 02 97 ce 37 8b 8f  9e bd 4f 92 40 e7 8f 9f  |.....7....O.@...|
-00000100  26 b7 cd ef cf 57 28 2f  12 cc 69 e1 be f2 59 c6  |&....W(/..i...Y.|
-00000110  be dc 51 9a 67 be 4a f1  97 f9 7a d9 01 05 1f d0  |..Q.g.J...z.....|
-00000120  2b 96 5b b5 4d 1d c1 2e  99 7e eb e3 20 92 b0 f8  |+.[.M....~.. ...|
-00000130  ac 9f c1 e3 10 cd b1 e9  05 46 15 3c c2 fb ce 27  |.........F.<...'|
-00000140  5e f1 47 e7 d8 ca 89 0e  77 37 86 6c c9 d4 e3 ae  |^.G.....w7.l....|
-00000150  1e 6e 63 4f 5c 2d aa a0  88 7c 35 47 87 e8 40 22  |.ncO\-...|5G..@"|
-00000160  f8 45 2f 57 b4 e8 e1 95  45 58 02 53 3c 19 b5 92  |.E/W....EX.S<...|
-00000170  73 55 fd 49 31 ec db dc  4c 6f 6f a7 9a 90 89 83  |sU.I1...Loo.....|
-00000180  08 97 53 5a c6 6c 23 75  cd 68 37 54 2c 00 d3 56  |..SZ.l#u.h7T,..V|
-00000190  5e 24 87 7b 92 a9 61 73  1e 84 31 0e ff d7 f2 fb  |^$.{..as..1.....|
-000001a0  62 5e f9 27 35 18 bb ca  b2 c2 d7 5c bf 7f 6d 36  |b^.'5......\..m6|
-000001b0  fa e6 02 4a d0 fa bd b8  c0 d0 2f 0c 27 6b 49 92  |...J....../.'kI.|
-000001c0  20 54 01 ea 3c d2 07 f1  2e d6 e3 a3 a3 bd 1d 33  | T..<..........3|
-000001d0  90 ee 26 ad a6 5c ee c7  de 4d e8 fc d2 b5 5a b5  |..&..\...M....Z.|
-000001e0  7c 6f c5 61 23 11 20 eb  0f 7c b7 0a cc 8c 65 b7  ||o.a#. ..|....e.|
-000001f0  e2 87 16 10 b0 fd 40 75  78 d1 3c 70 54 66 b8 cb  |......@ux.<pTf..|
-00000200  a5 84 c6 ee af 57 3c 73  64 2d ba 5d b9 a3 93 84  |.....W<sd-.]....|
-00000210  d1 2e d4 87 15 4f 9b 1c  e5 da 02 b0 c5 2e 9f 31  |.....O.........1|
-00000220  d4 3f 6e e8 b7 02 d3 f3  71 17 03 03 00 a4 14 81  |.?n.....q.......|
-00000230  dd 8d 55 4d 0a 18 cb 08  0a b0 1e e3 7d d6 54 8e  |..UM........}.T.|
-00000240  e3 e6 5d 2a c8 59 6c 5e  19 a7 db 0f 96 b2 55 db  |..]*.Yl^......U.|
-00000250  71 f8 6f bb a4 b8 d3 c7  a2 ee 01 c0 1a 15 00 20  |q.o............ |
-00000260  1a 88 07 b5 69 83 4d 8b  45 65 da 6d e5 df c2 82  |....i.M.Ee.m....|
-00000270  a3 b5 92 75 7b 76 86 f8  f8 13 63 c9 37 2f 06 ce  |...u{v....c.7/..|
-00000280  7c 64 da 08 1f 4e a3 4f  a4 5a 4a 36 a3 b8 99 6f  ||d...N.O.ZJ6...o|
-00000290  fa b2 8a f6 41 91 ea 5e  6c bd c9 40 65 a1 10 08  |....A..^l..@e...|
-000002a0  c2 a5 2e 13 d9 ce 59 d8  fb d1 48 77 94 5a 2d d0  |......Y...Hw.Z-.|
-000002b0  23 ba 02 4a 55 b5 be da  ca c1 61 f5 15 d0 7a ba  |#..JU.....a...z.|
-000002c0  a4 cf e7 1f 1d 99 32 cf  41 19 87 eb 79 97 0e fa  |......2.A...y...|
-000002d0  6e ae 17 03 03 00 35 7c  26 f7 77 3f 3c 10 90 47  |n.....5|&.w?<..G|
-000002e0  54 bd e7 c6 b7 9e 14 a9  ca 3a 12 c8 42 9a e1 38  |T........:..B..8|
-000002f0  e4 60 ed a9 4a d8 d3 6d  15 ab b2 f2 16 81 09 b1  |.`..J..m........|
-00000300  fd b5 56 67 8d e0 b1 e9  4b b9 ad 7a              |..Vg....K..z|
+00000000  14 03 03 00 01 01 17 03  03 02 1e e0 29 6d d1 38  |............)m.8|
+00000010  a6 03 d7 fc 2b df a4 a4  d0 ae 87 01 b8 82 5d eb  |....+.........].|
+00000020  3c 25 3e a1 33 89 b5 05  eb bc 02 0f ad 84 f0 2b  |<%>.3..........+|
+00000030  5f 14 af 0d f8 f1 08 e3  ca c1 8e ad 4b a5 a0 09  |_...........K...|
+00000040  b8 a0 4f bf e4 0f 93 a9  4a 35 35 26 22 d7 04 03  |..O.....J55&"...|
+00000050  70 95 4f 80 df d4 47 5b  21 14 27 d6 17 ea 32 6e  |p.O...G[!.'...2n|
+00000060  ea 3a ca 31 7c f2 d1 46  a2 ef 47 b9 16 d6 18 d5  |.:.1|..F..G.....|
+00000070  17 35 71 9d 14 37 63 cd  e1 c6 ff 3d ec a5 d8 53  |.5q..7c....=...S|
+00000080  48 d5 d8 0b 75 39 c1 d2  66 ad 97 4e 5f eb c3 c7  |H...u9..f..N_...|
+00000090  e0 77 95 fd 16 84 e2 a3  6a f2 a8 88 5e 4c 86 be  |.w......j...^L..|
+000000a0  81 a5 f2 6b 12 86 63 f1  4f a6 8d 63 7c 07 0f 8d  |...k..c.O..c|...|
+000000b0  53 d5 d4 00 c7 b7 2a ef  b2 1d 07 4e 43 d6 25 35  |S.....*....NC.%5|
+000000c0  c9 b1 fa 91 d1 f7 87 c6  98 c7 e7 c2 c3 7d 42 09  |.............}B.|
+000000d0  e5 3c 50 83 1b 20 ef ec  e4 ac 2e f2 3e 03 73 52  |.<P.. ......>.sR|
+000000e0  2e 1d 20 cf e2 8d 15 c3  c7 a6 2f 68 b5 8e 5f bc  |.. ......./h.._.|
+000000f0  c5 73 61 ff 52 3c b0 7b  47 82 47 a0 73 f8 1c ab  |.sa.R<.{G.G.s...|
+00000100  4d ea 15 fa 94 e0 7f 70  c1 c8 9c 55 f0 96 38 42  |M......p...U..8B|
+00000110  76 d4 26 6d a7 73 11 59  43 19 2f 49 70 a9 18 1c  |v.&m.s.YC./Ip...|
+00000120  12 9e ee d3 eb ca 1c c0  3b e1 99 e3 c2 25 de 39  |........;....%.9|
+00000130  1a 15 e0 d7 20 9d 1b 95  74 8c ee 96 7b 5e de 13  |.... ...t...{^..|
+00000140  99 56 54 a2 31 7b e9 96  02 9e 86 7b 15 9d c6 3e  |.VT.1{.....{...>|
+00000150  24 a5 19 e5 8e de 85 97  05 68 4f 39 d1 49 05 c9  |$........hO9.I..|
+00000160  7a 54 90 29 e7 93 ec 8e  6f cc 73 73 82 7d 72 8d  |zT.)....o.ss.}r.|
+00000170  4a 85 29 7f a5 53 13 26  16 b2 fa c3 ce 1f 8b ae  |J.)..S.&........|
+00000180  e6 60 8c 2d b0 64 66 d4  29 7c b5 2d 1d 11 c5 09  |.`.-.df.)|.-....|
+00000190  bb a5 44 c6 c8 af e6 f1  d5 f8 d9 45 97 64 7f 03  |..D........E.d..|
+000001a0  02 f7 f5 9f cb 31 1e 89  e4 5d a0 e9 34 db be 28  |.....1...]..4..(|
+000001b0  51 15 68 54 01 7c e5 1d  b4 05 d2 d6 24 ca 10 69  |Q.hT.|......$..i|
+000001c0  31 bf 8b 7a ee d9 bf e1  2a d4 7c c8 e8 79 ca dd  |1..z....*.|..y..|
+000001d0  0f 73 09 c8 cf 97 28 78  04 5b 04 51 44 c4 5f d1  |.s....(x.[.QD._.|
+000001e0  dc da 4f f5 d9 5c 9c b1  ea f8 1b f7 43 90 c0 c0  |..O..\......C...|
+000001f0  fd 82 56 e3 71 15 18 5e  7e 5c 61 5e b3 80 c1 1c  |..V.q..^~\a^....|
+00000200  22 92 32 67 23 f6 3b 74  e4 20 4e 1f fb f8 89 55  |".2g#.;t. N....U|
+00000210  e7 3c 18 30 24 77 7c 33  5c 89 91 60 65 14 06 9e  |.<.0$w|3\..`e...|
+00000220  e2 6d f0 07 84 4b b4 14  e8 17 03 03 00 a3 a7 e1  |.m...K..........|
+00000230  f7 26 48 56 da 6d ef a5  f4 5f 19 52 37 9e e7 6d  |.&HV.m..._.R7..m|
+00000240  28 07 70 ee 1e de 85 2b  7a 2d bf eb 48 06 f5 d4  |(.p....+z-..H...|
+00000250  ea 4d 83 86 59 d4 14 4f  46 bc 17 89 f1 f5 37 0e  |.M..Y..OF.....7.|
+00000260  84 60 6e ba 73 d7 c1 bc  6f d7 aa cf f0 36 96 a2  |.`n.s...o....6..|
+00000270  83 60 81 6f 48 6c 9d 87  e5 b6 5e 77 ab c5 e3 cb  |.`.oHl....^w....|
+00000280  8e 55 94 dc 94 f3 8a ce  cb f7 b4 d5 33 55 df 88  |.U..........3U..|
+00000290  22 44 04 ee 4e f5 30 e7  30 94 dc 95 2d 97 2c e4  |"D..N.0.0...-.,.|
+000002a0  34 58 4d 38 9e 25 61 96  c1 37 66 34 2b be ee e6  |4XM8.%a..7f4+...|
+000002b0  ee 39 73 89 a3 aa 1b 0a  5a bf 44 23 4e 19 5c c4  |.9s.....Z.D#N.\.|
+000002c0  3f 27 47 5c 40 67 6c 50  b8 3f 7c c9 97 f0 55 02  |?'G\@glP.?|...U.|
+000002d0  16 17 03 03 00 35 82 8b  0d 4e 87 3c c6 bc 41 8b  |.....5...N.<..A.|
+000002e0  ec ab 71 9d 57 7b e6 22  e4 87 82 61 5d f8 69 31  |..q.W{."...a].i1|
+000002f0  8a 2c be 2c d8 4d 2f dc  9a 91 31 7a ab d8 a4 0e  |.,.,.M/...1z....|
+00000300  ba cb fc ef 17 a4 7c 87  ca 13 bb 17 03 03 00 13  |......|.........|
+00000310  3b d0 da 9f d4 be fa 59  7a 30 8b 7e 8e a0 99 c0  |;......Yz0.~....|
+00000320  c2 36 f3                                          |.6.|
 >>> Flow 4 (server to client)
-00000000  17 03 03 02 98 07 3b b6  4e c1 7e 84 44 a0 5d 3c  |......;.N.~.D.]<|
-00000010  b8 45 37 1e bf 0f 43 cf  d6 11 c7 0d d9 a4 25 7b  |.E7...C.......%{|
-00000020  27 fa 6e e1 9c 24 5f e5  f9 12 e8 a1 33 2e cc 24  |'.n..$_.....3..$|
-00000030  43 3b ac e3 bd f2 7b 1d  66 70 eb 31 21 7f 3e 5e  |C;....{.fp.1!.>^|
-00000040  09 7a 29 8f 43 43 cb c4  6d 70 a7 51 1c 0f dc 21  |.z).CC..mp.Q...!|
-00000050  e9 4c f5 16 8f 35 e8 5b  ae 7f e0 47 e7 d4 53 66  |.L...5.[...G..Sf|
-00000060  b2 cc ef 44 b7 3e 34 2b  32 a9 e6 89 b9 c6 f6 56  |...D.>4+2......V|
-00000070  97 b3 78 37 3c 89 2f 35  8e a5 c7 ae c4 92 91 69  |..x7<./5.......i|
-00000080  50 ae ee c9 7b 7a 3a 10  ce 1c 68 fd 09 57 3d 92  |P...{z:...h..W=.|
-00000090  52 42 0e 4e 91 12 b4 fd  e4 59 d4 1e 5a c7 25 b3  |RB.N.....Y..Z.%.|
-000000a0  dd a1 dd 7d 7d 92 08 52  ec 85 15 c7 b6 60 70 fb  |...}}..R.....`p.|
-000000b0  76 6b 42 da 84 8e e5 a9  cb a4 b1 76 89 51 93 55  |vkB........v.Q.U|
-000000c0  f3 92 aa cc 04 3b 78 97  ed 10 88 d8 77 d1 32 35  |.....;x.....w.25|
-000000d0  93 82 a4 1d ca 47 df c8  72 93 10 90 e0 75 2d 3f  |.....G..r....u-?|
-000000e0  b0 6a 3d 9e b6 20 1d 0a  2a 03 66 be 18 18 d3 25  |.j=.. ..*.f....%|
-000000f0  47 a2 ab 67 08 44 24 cb  94 29 8a f7 8b 8e ca a0  |G..g.D$..)......|
-00000100  20 71 d0 af 87 5b e1 d9  5d e0 0c 70 13 3d 82 42  | q...[..]..p.=.B|
-00000110  b3 b8 fb 5e 1d f1 58 88  ea 11 67 28 49 11 d4 27  |...^..X...g(I..'|
-00000120  05 87 e4 b1 21 15 d1 3a  6a df ee 6d 40 7c 3f 8c  |....!..:j..m@|?.|
-00000130  7e cd 7b 0c 0e ef fd 17  29 29 f8 03 98 8e 76 ac  |~.{.....))....v.|
-00000140  23 e2 81 30 8b c7 7b 9b  5a 78 f7 6a 53 32 5c bd  |#..0..{.Zx.jS2\.|
-00000150  d7 42 cb 77 f5 1d ea 03  74 9f ec 1d 1b 68 72 aa  |.B.w....t....hr.|
-00000160  9f e0 7d 58 2f 26 47 6b  2d e4 1f 78 f4 ab d3 ae  |..}X/&Gk-..x....|
-00000170  51 6c 2a 35 0a 6f 9a c8  2b 75 ff 69 3e 4b 61 bc  |Ql*5.o..+u.i>Ka.|
-00000180  03 29 60 04 8b 53 9f ae  e4 00 7f 88 7a d4 70 b8  |.)`..S......z.p.|
-00000190  65 83 87 96 5d ef f1 b2  e8 7e 0e af 0b 2c 07 dd  |e...]....~...,..|
-000001a0  a9 0e f8 c3 9b 59 aa cf  74 02 5e 46 8c cb 3d ee  |.....Y..t.^F..=.|
-000001b0  72 67 7c 46 37 29 78 d8  80 6e 42 16 b7 a8 59 35  |rg|F7)x..nB...Y5|
-000001c0  cb 36 ce 73 50 80 d2 35  7a 69 b9 f3 14 73 04 e7  |.6.sP..5zi...s..|
-000001d0  ec dd 92 80 b0 f6 b7 51  28 15 56 c4 bb 83 00 86  |.......Q(.V.....|
-000001e0  9e 21 e7 bd 91 33 15 d4  aa da 8a 07 eb 2e d9 48  |.!...3.........H|
-000001f0  c3 71 1a da be 6f 00 45  bd 08 a3 70 17 d5 c0 1a  |.q...o.E...p....|
-00000200  74 87 5a 95 60 aa 1d ce  0e e1 46 57 85 8c e0 ae  |t.Z.`.....FW....|
-00000210  98 1a f9 83 7f ec 04 bd  90 dc 51 4f 7e d2 52 28  |..........QO~.R(|
-00000220  ca 33 f6 60 4a 0c e4 7d  b3 93 4f 70 7a ce d3 3e  |.3.`J..}..Opz..>|
-00000230  0a dd 50 b0 17 0a 2e db  2c ad 3d 86 d3 e6 60 07  |..P.....,.=...`.|
-00000240  43 61 9c a0 ff 45 37 9a  60 3d c5 f7 4d 27 fc b4  |Ca...E7.`=..M'..|
-00000250  9a 05 1c 0a ae 08 9d d9  5c 15 09 c9 8e 24 bb e2  |........\....$..|
-00000260  ec a1 a7 27 f0 42 97 a9  af ed 25 fd 5f f1 2a 4d  |...'.B....%._.*M|
-00000270  ac ab 9c a5 7d 28 6b c8  36 ec 0c 12 5b eb fa 64  |....}(k.6...[..d|
-00000280  83 74 13 6e 44 5a 23 38  f0 a6 22 3e f9 88 f1 0d  |.t.nDZ#8..">....|
-00000290  2a 55 b8 bf aa 87 de a4  7f 8b ba 52 23 17 03 03  |*U.........R#...|
-000002a0  00 1e fb 80 15 2b ff db  63 29 a7 77 ef 1e 82 28  |.....+..c).w...(|
-000002b0  8d d5 f0 5b 5d 42 8e 34  f9 64 5c 47 eb c3 10 4c  |...[]B.4.d\G...L|
-000002c0  17 03 03 00 13 a1 8b 9e  d8 57 0e 04 96 7c b4 83  |.........W...|..|
-000002d0  70 a2 20 03 ee 28 23 c7                           |p. ..(#.|
+00000000  17 03 03 02 90 a2 a0 e4  83 63 ad 8d d5 45 25 dc  |.........c...E%.|
+00000010  41 02 31 28 8d b0 87 85  66 b8 9c 36 f3 1f 97 87  |A.1(....f..6....|
+00000020  8c c9 e6 b4 67 1e 42 ab  84 c4 eb 0a 41 b1 0f 50  |....g.B.....A..P|
+00000030  25 c3 7e 69 20 cf 8a d0  56 79 61 e3 e1 5b cc a4  |%.~i ...Vya..[..|
+00000040  24 5a c7 2d 3b 17 33 92  59 6c 7e 29 a9 a2 2c 73  |$Z.-;.3.Yl~)..,s|
+00000050  3e b1 65 32 3d 6a 2b 61  5d 76 c4 66 0e 4f f1 da  |>.e2=j+a]v.f.O..|
+00000060  dd d3 7e 29 3d f5 42 99  9e 04 60 a4 9a a1 c0 f7  |..~)=.B...`.....|
+00000070  54 4e d5 58 73 85 02 83  38 ba 4e 93 9a 69 68 07  |TN.Xs...8.N..ih.|
+00000080  71 c9 a7 e4 83 51 4c 11  21 26 b2 dd ad 4b 2a ef  |q....QL.!&...K*.|
+00000090  23 9b b0 f6 d6 96 9f 99  1f 69 fe 35 28 86 49 bc  |#........i.5(.I.|
+000000a0  ec 97 11 4d 4e b7 c1 c2  da 6c ae c7 40 b9 2a 1f  |...MN....l..@.*.|
+000000b0  ff 9d 9d ea 90 b9 61 6f  76 ae fe 55 70 f6 ee 54  |......aov..Up..T|
+000000c0  54 62 6d 19 9a fc 40 16  e5 c2 e2 3e d1 68 c6 09  |Tbm...@....>.h..|
+000000d0  be 54 64 25 8a a0 2b e6  b3 14 7e 74 17 91 f0 de  |.Td%..+...~t....|
+000000e0  87 e8 3c 3e 58 8d 1b b2  4e 2d 7d c1 f8 aa 16 ca  |..<>X...N-}.....|
+000000f0  2a 3e 8f aa 52 14 e4 f2  2a b9 6e 62 46 ab ed 3a  |*>..R...*.nbF..:|
+00000100  ff a1 51 53 92 7a 78 c4  ed 9d fd 1f b4 62 2e e7  |..QS.zx......b..|
+00000110  cc 9d 09 fa 06 2e 9e 55  e5 98 9e b8 be e9 12 94  |.......U........|
+00000120  33 58 6b be 71 a1 4f f8  a0 83 85 f8 7e b4 28 a7  |3Xk.q.O.....~.(.|
+00000130  ee 1b ac 3c 46 b6 ac 60  af 5d cc b0 a8 2c 3f 95  |...<F..`.]...,?.|
+00000140  75 2a 73 ac 02 7e d8 04  21 fc 68 d7 6f 1d 31 40  |u*s..~..!.h.o.1@|
+00000150  43 81 26 b7 00 5f 77 d9  21 7b b4 7c cd 9f 89 69  |C.&.._w.!{.|...i|
+00000160  ef 11 0c 60 db 22 94 98  eb 10 d9 0c 0e 29 c2 d9  |...`.".......)..|
+00000170  74 8d 71 25 b8 5a c1 13  d6 f6 01 58 6d 71 31 7c  |t.q%.Z.....Xmq1||
+00000180  66 e8 e5 36 06 b3 e4 51  0c b1 43 88 bf 2b 54 d7  |f..6...Q..C..+T.|
+00000190  52 79 3d 07 a9 c2 e5 97  cc 79 87 b1 c7 8b 30 7b  |Ry=......y....0{|
+000001a0  b1 fe 90 58 35 a1 dc 18  8a fa cc df 63 2b 72 57  |...X5.......c+rW|
+000001b0  14 e1 12 4c bc d7 ba c2  e5 f7 4c 40 d6 34 ea 11  |...L......L@.4..|
+000001c0  8f be 3d 7a 34 11 c1 1a  ad f8 2e 89 94 8a 3a ce  |..=z4.........:.|
+000001d0  e5 8f e8 bc 77 71 38 8c  3c 6e 29 a3 1a 14 9d 3d  |....wq8.<n)....=|
+000001e0  a3 28 46 32 38 f0 14 74  ff 9b 99 71 65 ab ef c8  |.(F28..t...qe...|
+000001f0  67 ab 47 91 61 d1 af cf  7d 96 89 d5 57 17 96 d3  |g.G.a...}...W...|
+00000200  30 d5 fb 74 3b b8 df 77  98 7b 04 3e a1 a8 5a f1  |0..t;..w.{.>..Z.|
+00000210  6b 5c d2 4d b2 20 35 63  9e 83 c0 7e 83 60 46 57  |k\.M. 5c...~.`FW|
+00000220  c0 80 0d d7 b9 9f 14 c0  58 2d 48 2a cc 8c 1d 32  |........X-H*...2|
+00000230  2c 34 ec 10 f2 34 b4 28  e1 0e 83 38 c4 2e 5a 09  |,4...4.(...8..Z.|
+00000240  ff e6 3f d3 9a 32 8e 33  9e 31 18 e5 1d 6b 97 12  |..?..2.3.1...k..|
+00000250  9b 93 84 86 62 8a 0a 8a  ab 8d 37 68 af a1 ec 8e  |....b.....7h....|
+00000260  38 c8 47 ef 10 f8 64 7c  e1 13 0a 33 eb c2 4b bf  |8.G...d|...3..K.|
+00000270  47 49 6d 93 3c c9 44 aa  74 67 a9 93 dd de 66 47  |GIm.<.D.tg....fG|
+00000280  1e b3 55 47 b1 16 88 68  82 24 d6 b8 81 b0 5a b6  |..UG...h.$....Z.|
+00000290  27 7a f8 0b 5c 17 03 03  00 1e a5 9b 8c d2 3e 96  |'z..\.........>.|
+000002a0  f3 49 7a ed d9 fc 33 62  15 12 43 76 11 f9 dc fc  |.Iz...3b..Cv....|
+000002b0  ea d2 d7 87 22 6f 9e 3d  17 03 03 00 13 e1 30 4e  |...."o.=......0N|
+000002c0  4c 1d 02 78 57 a5 ee 8f  1c 5f 19 f0 57 3a 8d 7e  |L..xW...._..W:.~|
diff --git a/src/crypto/tls/testdata/Server-TLSv13-ClientAuthRequestedAndEd25519Given b/src/crypto/tls/testdata/Server-TLSv13-ClientAuthRequestedAndEd25519Given
index d80b76f..6943bf6 100644
--- a/src/crypto/tls/testdata/Server-TLSv13-ClientAuthRequestedAndEd25519Given
+++ b/src/crypto/tls/testdata/Server-TLSv13-ClientAuthRequestedAndEd25519Given
@@ -1,149 +1,149 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 ca 01 00 00  c6 03 03 3d 6d 5a b0 92  |...........=mZ..|
-00000010  7b 62 6d 14 22 f5 08 70  77 4a 80 fa 69 1a 1c 92  |{bm."..pwJ..i...|
-00000020  4c d3 e5 ca 3a d0 ee 33  40 c8 64 20 e5 a7 f1 57  |L...:..3@.d ...W|
-00000030  39 32 e3 9f 7c 33 58 16  61 58 29 44 aa e4 50 b1  |92..|3X.aX)D..P.|
-00000040  37 c5 59 27 f2 d5 b8 6e  01 24 c2 6b 00 04 13 01  |7.Y'...n.$.k....|
+00000000  16 03 01 00 ca 01 00 00  c6 03 03 e4 83 a9 75 06  |..............u.|
+00000010  0f 8b c9 35 1e 62 89 7f  a8 df 7c 93 b6 f0 8f 94  |...5.b....|.....|
+00000020  ea 31 dc 66 11 66 bd 77  33 54 bf 20 38 77 15 8d  |.1.f.f.w3T. 8w..|
+00000030  b4 21 50 72 6f 95 61 6c  15 b8 35 c9 92 10 72 99  |.!Pro.al..5...r.|
+00000040  bc 41 03 53 7c 5e 7b b3  a4 2e b4 19 00 04 13 01  |.A.S|^{.........|
 00000050  00 ff 01 00 00 79 00 0b  00 04 03 00 01 02 00 0a  |.....y..........|
 00000060  00 0c 00 0a 00 1d 00 17  00 1e 00 19 00 18 00 16  |................|
 00000070  00 00 00 17 00 00 00 0d  00 1e 00 1c 04 03 05 03  |................|
 00000080  06 03 08 07 08 08 08 09  08 0a 08 0b 08 04 08 05  |................|
 00000090  08 06 04 01 05 01 06 01  00 2b 00 03 02 03 04 00  |.........+......|
-000000a0  2d 00 02 01 01 00 33 00  26 00 24 00 1d 00 20 cb  |-.....3.&.$... .|
-000000b0  da f4 03 da e7 6f e5 2b  25 c0 cb cf 52 0a fb af  |.....o.+%...R...|
-000000c0  8a 87 4c 2b 88 e4 1a b3  a0 34 30 fb 9d 4e 0e     |..L+.....40..N.|
+000000a0  2d 00 02 01 01 00 33 00  26 00 24 00 1d 00 20 8e  |-.....3.&.$... .|
+000000b0  cf 32 24 aa f2 36 c7 41  50 66 dd 57 ce 97 72 8d  |.2$..6.APf.W..r.|
+000000c0  f3 b6 7d a0 a4 5e 5d fe  be bb ce 32 9f 03 75     |..}..^]....2..u|
 >>> Flow 2 (server to client)
 00000000  16 03 03 00 7a 02 00 00  76 03 03 00 00 00 00 00  |....z...v.......|
 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 e5 a7 f1 57  |........... ...W|
-00000030  39 32 e3 9f 7c 33 58 16  61 58 29 44 aa e4 50 b1  |92..|3X.aX)D..P.|
-00000040  37 c5 59 27 f2 d5 b8 6e  01 24 c2 6b 13 01 00 00  |7.Y'...n.$.k....|
+00000020  00 00 00 00 00 00 00 00  00 00 00 20 38 77 15 8d  |........... 8w..|
+00000030  b4 21 50 72 6f 95 61 6c  15 b8 35 c9 92 10 72 99  |.!Pro.al..5...r.|
+00000040  bc 41 03 53 7c 5e 7b b3  a4 2e b4 19 13 01 00 00  |.A.S|^{.........|
 00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 2f  |..+.....3.$... /|
 00000060  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
 00000070  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74 14  |.........._X.;t.|
-00000080  03 03 00 01 01 17 03 03  00 17 2d 8b 08 3c eb 5e  |..........-..<.^|
-00000090  e6 d7 8e 9a 11 d0 e1 a3  3f 88 cc 83 49 e3 af 50  |........?...I..P|
-000000a0  66 17 03 03 00 3e 24 ba  0e 2f d7 51 a9 52 5d 51  |f....>$../.Q.R]Q|
-000000b0  a4 7d b6 dc 5c 43 2e d8  58 5e 72 f1 86 98 15 b8  |.}..\C..X^r.....|
-000000c0  db 0a 48 0a 06 c4 ad 36  41 84 f1 89 36 e9 24 da  |..H....6A...6.$.|
-000000d0  05 5a dc 82 02 a1 3d 39  ae 4c 7e d9 7b 43 1f 2c  |.Z....=9.L~.{C.,|
-000000e0  06 71 a0 2f 17 03 03 02  6d 48 44 6b d1 65 fb e1  |.q./....mHDk.e..|
-000000f0  fb 96 00 e5 ad c6 60 e2  b5 f6 bf 7c b7 f4 6f 0e  |......`....|..o.|
-00000100  db a2 4b f7 cd d7 73 29  f8 af 23 5d d4 55 df 37  |..K...s)..#].U.7|
-00000110  b7 62 38 d0 95 5c f1 48  32 5f cb fa 67 18 20 7f  |.b8..\.H2_..g. .|
-00000120  b7 0f ac fc 64 b7 b0 7b  4b 1f 65 1d 2a 94 8d 76  |....d..{K.e.*..v|
-00000130  b4 30 3b ee 44 a5 f6 74  5b 7e bd a7 bb b2 d8 d6  |.0;.D..t[~......|
-00000140  ac c6 1f b4 88 34 85 7e  89 2c 2e 0d bf 6c 16 0c  |.....4.~.,...l..|
-00000150  ce 35 57 13 29 55 60 20  86 21 20 c0 46 bc 9e dd  |.5W.)U` .! .F...|
-00000160  8a a0 41 60 b5 a9 16 cc  66 cb 4a ba 58 e0 70 d1  |..A`....f.J.X.p.|
-00000170  a5 b4 eb ac 54 7e 95 11  00 f0 70 63 af 56 57 99  |....T~....pc.VW.|
-00000180  68 57 b4 5b aa db f1 08  2e c0 fb df 93 b8 4a f8  |hW.[..........J.|
-00000190  2e 04 b3 2c 2b f9 47 09  a1 5f a3 3e 97 eb d4 d5  |...,+.G.._.>....|
-000001a0  df ec d1 9e 05 5e 10 b0  2b 7e 0e b4 c8 e1 e3 50  |.....^..+~.....P|
-000001b0  29 19 8b 3c f7 d0 95 30  ae 4c e4 60 c8 13 09 15  |)..<...0.L.`....|
-000001c0  b7 80 f3 ad a0 06 6b a7  b7 4a c4 6d 65 09 21 d3  |......k..J.me.!.|
-000001d0  3b 56 dc ce f5 d3 fa 93  e9 03 8e 0c c9 47 21 89  |;V...........G!.|
-000001e0  7f 39 23 f8 aa 68 f6 b4  82 50 1f b8 46 5d 26 dc  |.9#..h...P..F]&.|
-000001f0  b1 1f e5 e5 6b ad ad 0d  d8 55 b7 8b 7a f8 5d fc  |....k....U..z.].|
-00000200  bd 74 a4 15 72 33 1b a7  3b 8c 09 55 d9 fd 21 bf  |.t..r3..;..U..!.|
-00000210  cd dd 67 d2 0c d0 bd 9b  de 52 e3 5f 4d 54 c0 6c  |..g......R._MT.l|
-00000220  bd 93 ae 66 55 4b e9 75  6b db cd 6b 80 33 f4 b7  |...fUK.uk..k.3..|
-00000230  61 9e e4 5d 75 b5 44 26  79 b5 da bf af 54 8c 40  |a..]u.D&y....T.@|
-00000240  23 99 32 60 2a 76 b3 0a  46 37 c9 85 1c fe e9 a1  |#.2`*v..F7......|
-00000250  a3 e8 61 67 04 eb 3e e8  2b d3 12 75 87 04 67 40  |..ag..>.+..u..g@|
-00000260  19 63 c5 ef 75 d0 39 63  a0 c3 ae 3c b1 88 34 db  |.c..u.9c...<..4.|
-00000270  c7 29 0c 33 c8 40 c0 b0  e6 76 44 cc 99 4f 2b a6  |.).3.@...vD..O+.|
-00000280  b3 e1 28 69 6c 41 74 55  53 a9 87 06 9a cb 14 5d  |..(ilAtUS......]|
-00000290  ec 74 77 e2 a0 ce 54 02  ba f8 04 2c 84 9a de 2b  |.tw...T....,...+|
-000002a0  dc 02 32 01 ad 96 5c a0  87 3c 55 dd ee 4d cb fd  |..2...\..<U..M..|
-000002b0  ee a1 d4 9e 3f fd 66 10  fc eb cf 2e d3 f1 aa 9d  |....?.f.........|
-000002c0  a2 fe 37 d5 b7 c7 6a b2  59 48 7a 57 9f 45 ff 22  |..7...j.YHzW.E."|
-000002d0  4c e2 dd 50 72 00 e0 9e  af 35 7e 19 32 f2 f8 f0  |L..Pr....5~.2...|
-000002e0  5c af ff 4f e8 37 44 8a  12 f5 14 e6 c2 79 7e 90  |\..O.7D......y~.|
-000002f0  72 65 b7 cf f4 51 fc c9  fb 08 80 ef d5 4c ba 4e  |re...Q.......L.N|
-00000300  a0 e2 0a 72 1a 4c 02 35  14 59 41 02 28 73 12 94  |...r.L.5.YA.(s..|
-00000310  ef 39 c5 b8 0e 43 ae 4e  0e 96 de d3 6e 25 8f ae  |.9...C.N....n%..|
-00000320  ff 52 c2 ca 22 bb 77 b3  48 0c 9b e8 c1 0c 03 94  |.R..".w.H.......|
-00000330  a9 1e a5 6b 00 46 39 f7  52 4f 39 14 07 40 99 5a  |...k.F9.RO9..@.Z|
-00000340  b0 c0 ba d3 0f a6 1e 30  ab 06 b4 5a b6 21 c6 93  |.......0...Z.!..|
-00000350  88 f8 a4 18 4d 37 17 03  03 00 99 87 d1 c8 64 88  |....M7........d.|
-00000360  d3 01 40 b6 89 cd 3d 26  a9 ea 36 bb 13 29 fa a0  |..@...=&..6..)..|
-00000370  f2 ba 28 65 a9 55 05 ff  47 53 37 0d 09 c6 30 b2  |..(e.U..GS7...0.|
-00000380  be 9f 31 e3 97 bc 5f 06  25 c2 d1 8a b6 3b c1 4e  |..1..._.%....;.N|
-00000390  54 1a ea 57 2a 10 33 df  ec 57 27 2e 71 a9 ea 16  |T..W*.3..W'.q...|
-000003a0  09 98 dd 40 f1 4d f3 34  d8 c5 f9 7a d3 db 57 f1  |...@.M.4...z..W.|
-000003b0  cc e8 1a 0f 88 51 ba 52  23 5f e9 91 f5 e3 1c ef  |.....Q.R#_......|
-000003c0  59 b1 e1 e5 da 64 0e 56  00 65 77 82 32 b9 eb bd  |Y....d.V.ew.2...|
-000003d0  d2 07 87 cd 83 94 39 63  64 90 d7 e7 8e 25 b9 66  |......9cd....%.f|
-000003e0  34 d3 a1 80 06 33 4d c9  69 ff ab 28 12 b9 19 a4  |4....3M.i..(....|
-000003f0  a6 05 94 db 17 03 03 00  35 68 36 21 a4 85 d8 96  |........5h6!....|
-00000400  52 51 a3 99 61 41 1e c4  84 97 9f 85 ed da d7 72  |RQ..aA.........r|
-00000410  79 ce 52 3a b9 31 31 19  f3 e5 d7 03 72 0c ab a9  |y.R:.11.....r...|
-00000420  7c 0f 17 38 9c 82 26 a5  95 1f 02 85 5b f6        ||..8..&.....[.|
+00000080  03 03 00 01 01 17 03 03  00 17 3b ca 9a d3 b7 99  |..........;.....|
+00000090  d7 d8 c9 f9 96 b8 70 69  3b 22 42 0f c4 72 de 7c  |......pi;"B..r.||
+000000a0  05 17 03 03 00 3e 38 d7  00 60 b9 ce 17 31 26 9f  |.....>8..`...1&.|
+000000b0  db ef e2 b1 99 55 c8 f9  f3 a0 81 19 12 a7 63 85  |.....U........c.|
+000000c0  5a 26 2d d1 1c ad 5d ae  d6 4b 66 93 62 d7 fe 08  |Z&-...]..Kf.b...|
+000000d0  40 e9 fa 16 8b 89 f8 04  e8 33 67 20 2b 21 91 a0  |@........3g +!..|
+000000e0  c6 0a 87 ff 17 03 03 02  6d 79 97 6c 2f f6 01 7b  |........my.l/..{|
+000000f0  3a 49 0e 1a 00 96 10 fd  7f 77 db 76 b2 d4 e4 68  |:I.......w.v...h|
+00000100  46 4e 4f 3c 64 54 ca 27  9a 5c 78 98 f4 96 a4 fe  |FNO<dT.'.\x.....|
+00000110  29 e5 44 cb 6d 3e bd ce  89 15 c6 75 d8 28 00 da  |).D.m>.....u.(..|
+00000120  ff d8 ec 27 2c f2 4c e5  a0 6e 88 ce 67 6e 35 f4  |...',.L..n..gn5.|
+00000130  e5 d5 96 2d 40 af fa 88  12 8a 48 24 2c f9 82 f5  |...-@.....H$,...|
+00000140  cb a4 6e 95 a6 53 bc 79  f7 6a ef 66 77 bc 46 f0  |..n..S.y.j.fw.F.|
+00000150  1b 0d 6b 5c 76 82 15 c4  d0 1c dd ec cc ce 09 93  |..k\v...........|
+00000160  ce 21 55 9b d8 8a 11 1b  0c 24 fa 9e 5f 29 4a f1  |.!U......$.._)J.|
+00000170  2a 2e ad c0 6d 6d 46 06  5b c9 75 b3 3e 32 45 67  |*...mmF.[.u.>2Eg|
+00000180  05 26 cc d8 a8 4a a9 b1  67 71 a6 82 1c dc f0 15  |.&...J..gq......|
+00000190  6d 25 f5 6e be a2 5f 45  39 dc d1 2e df fa e1 e9  |m%.n.._E9.......|
+000001a0  48 ca 7a 78 fa 0e 53 d1  5c 8f c2 40 91 d5 fa 40  |H.zx..S.\..@...@|
+000001b0  7e a1 52 23 c8 56 1f 31  17 91 5c 38 bb 54 56 f3  |~.R#.V.1..\8.TV.|
+000001c0  1e 14 90 43 b7 ef fd 56  b5 ae 13 90 97 dc 60 15  |...C...V......`.|
+000001d0  67 72 fc c2 0a 32 90 be  ec de 69 16 d3 1b 22 2c  |gr...2....i...",|
+000001e0  25 9f 91 27 a7 6d 8c a4  de 02 fd 0e da bf ca 71  |%..'.m.........q|
+000001f0  77 9b 56 b8 07 e8 80 00  9b d9 36 1c 09 4f 9f 54  |w.V.......6..O.T|
+00000200  76 d5 76 f4 9a 03 94 bb  9e 93 f0 b5 3c a1 71 ec  |v.v.........<.q.|
+00000210  b3 83 3a 06 b4 46 97 bf  ef bb f0 26 94 4e b0 08  |..:..F.....&.N..|
+00000220  3b ec 81 20 66 92 11 85  a0 c2 90 fd c5 bc ae 39  |;.. f..........9|
+00000230  2c 87 ec e4 5d 59 ee b4  e9 0d f7 2a e0 3b 2a 94  |,...]Y.....*.;*.|
+00000240  1a 79 2f e8 5c 88 d3 61  2e 47 c0 f3 c4 01 84 a9  |.y/.\..a.G......|
+00000250  cf f6 36 13 cb 4b 0b f7  9a 14 f1 d5 0e 10 80 fd  |..6..K..........|
+00000260  11 79 20 20 ae 56 5e de  58 53 19 38 26 e2 ac bc  |.y  .V^.XS.8&...|
+00000270  0c 40 38 8b f9 67 62 4c  42 7d 18 4f 27 e9 53 96  |.@8..gbLB}.O'.S.|
+00000280  78 4b fa 44 fe c2 c3 d9  99 f2 2c 59 2b 2b 2c 88  |xK.D......,Y++,.|
+00000290  5b dc a8 98 3d 17 14 09  70 ce e4 02 8b 3c 5d 94  |[...=...p....<].|
+000002a0  44 ac ba 57 2d a9 bf b8  70 e9 b8 a8 c3 b8 90 da  |D..W-...p.......|
+000002b0  ec b1 b4 57 d6 e3 0f 41  82 bb 21 4a 57 dc ac 4b  |...W...A..!JW..K|
+000002c0  89 34 75 fc c4 56 6b 70  3d 83 2b fa be c8 2b cd  |.4u..Vkp=.+...+.|
+000002d0  f8 4f 9f 9e 9a 0e d2 d0  46 cd 21 a5 f7 07 a6 2a  |.O......F.!....*|
+000002e0  85 7b 30 92 78 a2 da a5  1d 1c 1c 54 63 4b 66 b2  |.{0.x......TcKf.|
+000002f0  f1 a7 c4 43 57 97 7f 28  37 e7 15 62 9b 1c f5 90  |...CW..(7..b....|
+00000300  0c 19 36 1a c1 48 48 e5  7d 56 93 3c 13 e3 cd 6a  |..6..HH.}V.<...j|
+00000310  aa aa ba d5 24 95 c7 df  9c a9 76 6c 07 bf 09 2d  |....$.....vl...-|
+00000320  4b 7b 55 94 37 ec d4 69  ce ab 0f 48 37 74 37 99  |K{U.7..i...H7t7.|
+00000330  83 0d 60 8a 73 56 fb e2  9e 0c 39 0e 23 bf 68 b2  |..`.sV....9.#.h.|
+00000340  92 51 12 bc cf 1b af 9d  7c fe 77 14 c8 66 4a 6f  |.Q......|.w..fJo|
+00000350  91 06 55 6a 11 61 17 03  03 00 99 c2 bf 26 a6 fa  |..Uj.a.......&..|
+00000360  67 16 a3 b9 1f 36 f8 4f  5d 59 b1 be 43 3a 70 01  |g....6.O]Y..C:p.|
+00000370  c0 3a 4b c5 20 b1 22 49  04 22 bb 7f 5f f4 bb f8  |.:K. ."I.".._...|
+00000380  35 03 0e dc ba ce de 2a  25 ea 96 dd 3d 64 34 90  |5......*%...=d4.|
+00000390  30 f8 34 22 bb e4 94 00  bb b3 ea 3c d2 87 90 9a  |0.4".......<....|
+000003a0  86 76 6b b7 e3 78 fc 35  10 50 ce b6 c0 71 52 ae  |.vk..x.5.P...qR.|
+000003b0  a5 f7 bf 8c 5e 5d c1 96  c7 92 6f f0 04 87 d9 a8  |....^]....o.....|
+000003c0  72 f4 9e ed 6d ab 28 42  7c c8 60 39 81 66 74 a1  |r...m.(B|.`9.ft.|
+000003d0  79 79 6a 59 02 29 b8 14  12 34 a7 96 8f e0 c1 d6  |yyjY.)...4......|
+000003e0  4e da e2 63 22 c1 60 b1  87 64 d3 80 b9 c4 df 9a  |N..c".`..d......|
+000003f0  5f 2c 22 91 17 03 03 00  35 9a 62 4d a2 ba 27 31  |_,".....5.bM..'1|
+00000400  fc 8e 23 cc 5f f0 5c 8c  9b c1 b0 ae 7b b8 fa e2  |..#._.\.....{...|
+00000410  f3 af 6c 6c ac 86 1e e1  2b 9f 14 a1 f3 5f b5 f9  |..ll....+...._..|
+00000420  76 b6 dd 73 f5 6a 08 29  f1 29 9e 79 87 aa        |v..s.j.).).y..|
 >>> Flow 3 (client to server)
-00000000  14 03 03 00 01 01 17 03  03 01 50 d8 03 a6 37 13  |..........P...7.|
-00000010  5f fb 65 9f 33 33 79 ae  89 c3 de ea 4b 55 e2 b3  |_.e.33y.....KU..|
-00000020  13 07 0d 95 c6 f7 79 74  ad 8a 42 dd 78 55 a5 01  |......yt..B.xU..|
-00000030  69 f2 11 cf 72 de 85 04  56 78 9c ba 21 77 b8 76  |i...r...Vx..!w.v|
-00000040  e3 58 23 3d 2b 8a ee a4  5c 52 60 4b 50 0d c4 83  |.X#=+...\R`KP...|
-00000050  a1 8d 06 82 68 99 34 65  7a 7b 55 8e 46 04 47 55  |....h.4ez{U.F.GU|
-00000060  4d 42 02 41 b6 e4 dd a4  33 6a 04 97 e6 4a 80 3a  |MB.A....3j...J.:|
-00000070  e1 7e 0a a5 4f 0c f9 de  7a 91 96 4f 6a 6a 8a 4b  |.~..O...z..Ojj.K|
-00000080  fd 24 b9 bf e7 d5 5a 27  17 18 45 77 1d e2 c9 ea  |.$....Z'..Ew....|
-00000090  23 57 c4 e1 30 9e de d2  bd 0c 28 59 dc a1 12 d9  |#W..0.....(Y....|
-000000a0  ee 2e 43 4b 83 fc d7 6c  a4 e7 47 c4 14 c1 1f ee  |..CK...l..G.....|
-000000b0  79 60 26 86 73 5c ec c9  c0 ec f9 c9 38 98 2d ba  |y`&.s\......8.-.|
-000000c0  10 83 1b fe 8f cf 59 77  f0 60 fe c0 d0 7e 0f 2d  |......Yw.`...~.-|
-000000d0  69 04 dd 79 49 c5 b1 d9  9b 48 ad de 55 cf d3 47  |i..yI....H..U..G|
-000000e0  9b eb 64 ae ed cb b0 48  78 a9 27 24 b8 8d 53 36  |..d....Hx.'$..S6|
-000000f0  b7 0f 82 1c ee 11 4b 5a  98 1d 21 73 b4 f4 06 ce  |......KZ..!s....|
-00000100  50 bc 36 27 e1 87 70 04  68 1b 30 3a 86 68 b3 71  |P.6'..p.h.0:.h.q|
-00000110  8c 57 69 60 d6 a8 bd fa  13 46 2b 52 00 dc 45 53  |.Wi`.....F+R..ES|
-00000120  06 79 5b 96 78 69 d0 a8  cd 2d 39 8c 11 12 9f 65  |.y[.xi...-9....e|
-00000130  72 01 5e b4 c5 df bc 9d  a2 7f 00 a7 cc 95 3b 0b  |r.^...........;.|
-00000140  09 05 19 9f a5 b7 dd 48  3f ab f1 aa 36 da 70 96  |.......H?...6.p.|
-00000150  0f f9 f3 bc 80 84 09 a3  76 92 56 17 03 03 00 59  |........v.V....Y|
-00000160  4a ba a9 1c c7 f6 ef 77  8e cc 9a 8c 51 9f 43 1e  |J......w....Q.C.|
-00000170  ec 8f f3 33 93 eb 81 db  06 03 97 fd 3f b2 e0 e5  |...3........?...|
-00000180  e7 73 b2 2c 2c f0 c0 a4  51 18 10 79 4e 30 96 3a  |.s.,,...Q..yN0.:|
-00000190  d8 26 b1 a0 f4 1b e6 12  fe 74 58 68 97 45 1e 85  |.&.......tXh.E..|
-000001a0  3a db 04 a6 12 5d ba 19  e4 f6 b1 17 f3 04 75 f2  |:....]........u.|
-000001b0  ea 04 db 6c d4 d8 d5 cc  fb 17 03 03 00 35 1d c5  |...l.........5..|
-000001c0  cd 92 9c 80 3a ec 3c 06  3e 12 ed 7a 82 23 ab 18  |....:.<.>..z.#..|
-000001d0  67 4a 92 7d 30 e4 57 7b  25 34 a1 54 46 41 b7 60  |gJ.}0.W{%4.TFA.`|
-000001e0  69 cf a2 61 7a 59 6f b3  78 6f 41 0f 7d 9b 4f 00  |i..azYo.xoA.}.O.|
-000001f0  91 c7 93                                          |...|
+00000000  14 03 03 00 01 01 17 03  03 01 50 ef 68 27 d6 ec  |..........P.h'..|
+00000010  76 00 e1 c6 ed 3c f6 a1  83 b4 4b 26 28 ba 0f d6  |v....<....K&(...|
+00000020  2a fd f0 4a 10 8f 9c ed  84 3f 0a 0e 5b 77 e2 7d  |*..J.....?..[w.}|
+00000030  1e 03 2a 76 5b 2b 87 78  ad bd 45 8b 03 b3 8d e7  |..*v[+.x..E.....|
+00000040  b7 66 ca 5e 36 f8 53 87  90 3c 1a 33 46 1d 32 4f  |.f.^6.S..<.3F.2O|
+00000050  f1 90 fb 36 da 96 1c 1a  db 9f 9b e6 9f 85 f8 13  |...6............|
+00000060  7d e1 ab e1 ca c6 05 df  15 ea af dd 55 58 c7 5f  |}...........UX._|
+00000070  de 62 1b 93 60 a4 fc 39  0a ef 95 bc 0c ca 8f 84  |.b..`..9........|
+00000080  98 0a 6d 5b fd c6 0c ad  02 7f 0c f8 b4 be fe 5a  |..m[...........Z|
+00000090  fb 22 00 08 09 5d c7 47  76 89 e5 06 d1 90 5b e6  |."...].Gv.....[.|
+000000a0  63 64 06 28 37 d9 1b e9  0d 27 45 f7 72 30 d7 f2  |cd.(7....'E.r0..|
+000000b0  db 8e bf 95 97 29 43 e7  16 bf a0 59 9c fa d9 59  |.....)C....Y...Y|
+000000c0  a0 a6 9b 1f b5 74 80 87  d0 61 2f d5 a5 ac dd b2  |.....t...a/.....|
+000000d0  8d 27 fc e6 68 eb 07 b3  3d 97 a9 93 5b 35 99 e9  |.'..h...=...[5..|
+000000e0  ba 99 fe 49 d6 39 1a 0a  38 98 cd 47 b9 67 9b 9a  |...I.9..8..G.g..|
+000000f0  77 65 45 f8 48 fb d3 1c  0f a2 2e af e0 29 68 bc  |weE.H........)h.|
+00000100  81 24 3b 9b 36 0a ef 51  75 ff 61 6a d4 6c 59 42  |.$;.6..Qu.aj.lYB|
+00000110  54 31 47 e9 02 9e 58 33  9e 89 65 b6 65 db b2 81  |T1G...X3..e.e...|
+00000120  bd c1 f4 0a 34 eb f3 26  f5 8d 36 6d da 78 e6 88  |....4..&..6m.x..|
+00000130  00 8f 92 24 dc 76 e3 95  dc 13 b5 92 91 ee c0 82  |...$.v..........|
+00000140  cb 63 85 b6 59 67 dc 14  2e 2d 58 8e 56 7e 7c db  |.c..Yg...-X.V~|.|
+00000150  2f 54 01 ed 17 8d 9a 97  22 39 7f 17 03 03 00 59  |/T......"9.....Y|
+00000160  a1 f2 0d 19 e7 d8 a8 6d  cd ea f6 82 ee 5d 0a 55  |.......m.....].U|
+00000170  22 61 11 21 f7 b0 1d 86  a8 4d c2 e2 9b ac bb 87  |"a.!.....M......|
+00000180  a2 82 67 ee 78 76 9b e0  c0 00 85 bf 1e 2b ab e6  |..g.xv.......+..|
+00000190  f1 43 79 69 a0 3d 04 b7  d9 7f 31 c7 7a b7 4f 5c  |.Cyi.=....1.z.O\|
+000001a0  9f 62 84 dc f4 6d a1 ce  3d ff 24 88 15 10 4a e6  |.b...m..=.$...J.|
+000001b0  5c 12 68 08 3c 55 a2 a9  d7 17 03 03 00 35 f4 d9  |\.h.<U.......5..|
+000001c0  9f 41 70 39 d4 88 2a 0b  43 c3 78 0f c2 42 48 b8  |.Ap9..*.C.x..BH.|
+000001d0  e5 26 ad e3 72 40 66 d7  a0 5e 5e 0c 6a af 1a 47  |.&..r@f..^^.j..G|
+000001e0  c6 5f 25 ce c9 13 77 60  8f 6e a7 9f bc e3 f9 58  |._%...w`.n.....X|
+000001f0  9c 12 cc                                          |...|
 >>> Flow 4 (server to client)
-00000000  17 03 03 01 ca 52 99 bb  74 e8 8e ab 48 c6 03 1d  |.....R..t...H...|
-00000010  f9 9a a8 be e4 b1 dc b9  8d e5 a8 11 2b d6 54 63  |............+.Tc|
-00000020  6f 0d dc 6e d7 55 c8 af  3c 88 c4 3e ab 30 ab b9  |o..n.U..<..>.0..|
-00000030  69 94 75 60 0f 75 77 e1  b1 29 09 9f db c1 74 43  |i.u`.uw..)....tC|
-00000040  92 2a 55 b9 ae 71 12 79  b9 4d ba 82 84 96 b1 01  |.*U..q.y.M......|
-00000050  14 b5 9c 5d 0c fe eb cc  a6 44 e5 0b 93 1c 8d 45  |...].....D.....E|
-00000060  d8 aa 7c 1b d1 47 5a 36  46 f8 f5 82 c7 fe 2b f3  |..|..GZ6F.....+.|
-00000070  46 17 9f 0c 03 df cd dd  0a 38 77 28 45 45 f2 3c  |F........8w(EE.<|
-00000080  06 1d 88 1b 55 d8 8f 70  9b a8 bb 37 a8 41 81 a6  |....U..p...7.A..|
-00000090  a7 f4 28 c1 f1 d2 8b ba  98 0e 35 92 88 ac cb b6  |..(.......5.....|
-000000a0  25 dd 5e 62 d5 e7 e9 da  4f 0e 55 b4 36 4d 09 20  |%.^b....O.U.6M. |
-000000b0  73 ef b3 6c 4c 6d c6 6a  e9 f3 f8 28 74 0d 50 b0  |s..lLm.j...(t.P.|
-000000c0  ad 75 f7 c5 fb eb bc 06  6b 07 23 80 70 87 8e a8  |.u......k.#.p...|
-000000d0  3e 66 87 07 53 8e 19 bb  3f 94 f1 9e 4b 05 f6 55  |>f..S...?...K..U|
-000000e0  34 3b d0 14 36 32 66 6a  62 8a ec 22 a1 82 0a 95  |4;..62fjb.."....|
-000000f0  95 b6 85 0c 2c c4 b4 3e  00 59 2a 1e c6 03 4b 2a  |....,..>.Y*...K*|
-00000100  e4 06 d5 29 e5 a1 e1 57  b0 a1 45 1b b7 0c 12 3f  |...)...W..E....?|
-00000110  0d 31 1a b2 ef 3d 90 73  3a 39 28 00 8a 0d e0 20  |.1...=.s:9(.... |
-00000120  83 a7 32 b8 02 d0 9f 90  f3 b3 ca df 36 ae d4 f8  |..2.........6...|
-00000130  c4 4b 82 06 13 04 66 e7  01 63 4e e8 80 b8 52 c0  |.K....f..cN...R.|
-00000140  8c a4 5b 3f b9 85 48 ac  01 f0 b6 ee db 73 d0 62  |..[?..H......s.b|
-00000150  e2 05 e7 71 7e 87 4b 7b  cf d0 a1 77 eb 38 64 85  |...q~.K{...w.8d.|
-00000160  5c 3d af fc e3 17 46 e7  c5 71 c9 63 bf 03 ae 35  |\=....F..q.c...5|
-00000170  7b 60 61 5d 5a 7b 57 88  79 82 55 68 45 a1 59 bc  |{`a]Z{W.y.UhE.Y.|
-00000180  e5 3b 5a 31 32 5c 24 13  e3 fc b7 53 41 76 1d 24  |.;Z12\$....SAv.$|
-00000190  7f 08 89 c6 f0 b9 57 3a  4d 91 66 66 e4 57 33 51  |......W:M.ff.W3Q|
-000001a0  1d b9 1e c5 68 9a 6a 74  1e c3 16 de 15 92 e3 d0  |....h.jt........|
-000001b0  0a 64 a4 64 e8 c4 a5 9c  55 30 a9 c3 b0 53 72 54  |.d.d....U0...SrT|
-000001c0  75 d7 a0 7a 54 85 6e 9a  4d ff 9f 13 3c b9 42 17  |u..zT.n.M...<.B.|
-000001d0  03 03 00 1e 6f 06 3f 1c  da f6 55 50 05 de 38 9d  |....o.?...UP..8.|
-000001e0  07 00 bb 28 32 a5 3f 04  22 4c 6e f2 ea 3a e0 cc  |...(2.?."Ln..:..|
-000001f0  5d 5b 17 03 03 00 13 3b  b8 7c df 14 b4 ba fa 6e  |][.....;.|.....n|
-00000200  2e 61 d6 6b bf b5 ad c2  35 73                    |.a.k....5s|
+00000000  17 03 03 01 c2 80 69 97  9a 20 30 2a 1c f4 31 f9  |......i.. 0*..1.|
+00000010  0f cf f7 79 c0 01 e1 f3  35 f5 16 a0 33 d6 eb 21  |...y....5...3..!|
+00000020  44 db bc c6 c4 91 6b a6  75 da ca d3 63 78 47 8b  |D.....k.u...cxG.|
+00000030  96 e5 6f 63 2c 77 c0 33  29 d8 3e ee bf 8e 6b d4  |..oc,w.3).>...k.|
+00000040  de f7 1b 0e e6 ae ce cd  17 0d 24 77 10 3d e4 89  |..........$w.=..|
+00000050  06 07 a3 77 68 ac 20 ec  0b ae 47 41 3b 80 4e 95  |...wh. ...GA;.N.|
+00000060  02 aa 13 36 19 03 06 1c  47 b3 f7 f0 4b 6d 5a c6  |...6....G...KmZ.|
+00000070  42 14 95 03 20 c7 46 96  42 d3 18 5a 40 bd a1 03  |B... .F.B..Z@...|
+00000080  b6 d2 8b f9 ff 2d d1 b1  3c 8a 34 af 23 64 31 7d  |.....-..<.4.#d1}|
+00000090  46 47 21 b4 82 16 df a2  a4 0f 96 03 4b 38 3d 5d  |FG!.........K8=]|
+000000a0  d0 d1 78 d1 6e 6a a2 95  c0 a7 e6 ee 07 eb 77 68  |..x.nj........wh|
+000000b0  35 78 72 3e df d9 4b e9  1b ab 34 99 2d fe 52 99  |5xr>..K...4.-.R.|
+000000c0  6e 57 63 13 39 ae 5e ce  b6 43 21 07 fd fe b7 6d  |nWc.9.^..C!....m|
+000000d0  8f 72 a4 f8 7e 0a 56 60  61 d5 5a d4 01 b3 47 8e  |.r..~.V`a.Z...G.|
+000000e0  f0 48 cd 85 61 a3 d2 d1  eb ba 04 39 6b 5e 5f fc  |.H..a......9k^_.|
+000000f0  e3 90 c1 cb 3f 40 30 00  5c 94 df bf 5b 89 6d ab  |....?@0.\...[.m.|
+00000100  15 1e 72 50 ac 56 ee 16  7d 84 4c e6 0c 89 68 fa  |..rP.V..}.L...h.|
+00000110  d5 8d 5f 09 85 25 5f 8c  70 df 0b b7 94 15 40 20  |.._..%_.p.....@ |
+00000120  b1 ff 41 50 5d 9f c6 8a  9b 7f 40 6f dc bd 4f 54  |..AP].....@o..OT|
+00000130  d8 1f e6 f1 44 00 11 97  45 ca 80 bc 15 eb 93 01  |....D...E.......|
+00000140  dd 54 c6 75 7e 08 b9 38  f5 4d 97 c5 50 56 97 3c  |.T.u~..8.M..PV.<|
+00000150  3c 72 9a 33 7c 68 b1 73  2b 38 c7 b8 a8 3c 5d af  |<r.3|h.s+8...<].|
+00000160  a6 3e 12 ef d1 c1 99 36  10 02 af 0c 5b 16 16 7a  |.>.....6....[..z|
+00000170  f5 74 8d ac a4 0f 38 34  ee cd 08 50 e0 33 b0 e1  |.t....84...P.3..|
+00000180  52 e1 5d f2 7d c6 7b 64  c7 46 f6 9e d0 a2 cf 89  |R.].}.{d.F......|
+00000190  3c c9 ab 2f fb 8a f3 ba  78 e9 4c c5 2d 62 32 6b  |<../....x.L.-b2k|
+000001a0  50 4c a0 7e d3 bb 2a 66  57 99 38 69 e8 77 ef 18  |PL.~..*fW.8i.w..|
+000001b0  24 af b3 cb e5 c0 37 a2  97 f6 00 d4 68 8a 71 af  |$.....7.....h.q.|
+000001c0  24 a4 ab 19 07 3b c0 17  03 03 00 1e 60 b4 fc 15  |$....;......`...|
+000001d0  f9 9c b1 a1 60 1a ba f5  1b b9 c1 33 f1 8b e5 c0  |....`......3....|
+000001e0  48 77 4f 11 42 21 ad 8c  d2 d6 17 03 03 00 13 5c  |HwO.B!.........\|
+000001f0  db 07 5e 65 40 58 74 a4  7f ab 5f cc f0 9a 91 0c  |..^e@Xt..._.....|
+00000200  17 3d                                             |.=|
diff --git a/src/crypto/tls/testdata/Server-TLSv13-ClientAuthRequestedAndGiven b/src/crypto/tls/testdata/Server-TLSv13-ClientAuthRequestedAndGiven
index 800f999..8ba88eb 100644
--- a/src/crypto/tls/testdata/Server-TLSv13-ClientAuthRequestedAndGiven
+++ b/src/crypto/tls/testdata/Server-TLSv13-ClientAuthRequestedAndGiven
@@ -1,177 +1,177 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 ca 01 00 00  c6 03 03 c8 2f b4 54 5b  |............/.T[|
-00000010  11 8a 88 a9 a2 9b bf 66  f2 b4 e5 fb 32 af d6 dd  |.......f....2...|
-00000020  6c 6c 99 4f d6 48 cd eb  63 6e 1d 20 bb 0a 48 2e  |ll.O.H..cn. ..H.|
-00000030  45 4e 86 2d ae d6 fb 3e  0c 3e 9f a3 17 4a e3 39  |EN.-...>.>...J.9|
-00000040  58 a7 92 92 cb 30 03 0d  be b5 79 a5 00 04 13 01  |X....0....y.....|
+00000000  16 03 01 00 ca 01 00 00  c6 03 03 56 2e 3c 64 35  |...........V.<d5|
+00000010  b8 7d db 8a 3c f0 93 73  0f 64 8d 84 da b6 59 37  |.}..<..s.d....Y7|
+00000020  22 99 3f 69 16 56 16 39  a2 a9 58 20 7c d3 26 20  |".?i.V.9..X |.& |
+00000030  a0 dc e9 7a 07 71 02 2d  3b 27 85 16 fb 6e 26 e5  |...z.q.-;'...n&.|
+00000040  c3 67 e5 0b bd e5 50 8f  bd 39 6f 2c 00 04 13 01  |.g....P..9o,....|
 00000050  00 ff 01 00 00 79 00 0b  00 04 03 00 01 02 00 0a  |.....y..........|
 00000060  00 0c 00 0a 00 1d 00 17  00 1e 00 19 00 18 00 16  |................|
 00000070  00 00 00 17 00 00 00 0d  00 1e 00 1c 04 03 05 03  |................|
 00000080  06 03 08 07 08 08 08 09  08 0a 08 0b 08 04 08 05  |................|
 00000090  08 06 04 01 05 01 06 01  00 2b 00 03 02 03 04 00  |.........+......|
-000000a0  2d 00 02 01 01 00 33 00  26 00 24 00 1d 00 20 f0  |-.....3.&.$... .|
-000000b0  8e 19 a6 04 b7 f1 b0 cd  a1 28 bb 10 60 30 92 dc  |.........(..`0..|
-000000c0  bc 7a 1c fc a7 f4 dc 01  2e 88 f3 0e 80 82 71     |.z............q|
+000000a0  2d 00 02 01 01 00 33 00  26 00 24 00 1d 00 20 f6  |-.....3.&.$... .|
+000000b0  96 06 42 18 9d ae a6 49  01 d1 a5 d3 ee c7 5a ed  |..B....I......Z.|
+000000c0  26 20 c7 d5 e8 3c 58 21  1b 17 28 ea f9 e3 45     |& ...<X!..(...E|
 >>> Flow 2 (server to client)
 00000000  16 03 03 00 7a 02 00 00  76 03 03 00 00 00 00 00  |....z...v.......|
 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 bb 0a 48 2e  |........... ..H.|
-00000030  45 4e 86 2d ae d6 fb 3e  0c 3e 9f a3 17 4a e3 39  |EN.-...>.>...J.9|
-00000040  58 a7 92 92 cb 30 03 0d  be b5 79 a5 13 01 00 00  |X....0....y.....|
+00000020  00 00 00 00 00 00 00 00  00 00 00 20 7c d3 26 20  |........... |.& |
+00000030  a0 dc e9 7a 07 71 02 2d  3b 27 85 16 fb 6e 26 e5  |...z.q.-;'...n&.|
+00000040  c3 67 e5 0b bd e5 50 8f  bd 39 6f 2c 13 01 00 00  |.g....P..9o,....|
 00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 2f  |..+.....3.$... /|
 00000060  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
 00000070  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74 14  |.........._X.;t.|
-00000080  03 03 00 01 01 17 03 03  00 17 1a 9d c2 a8 12 c1  |................|
-00000090  c3 97 41 bd 1f 6e 48 98  36 4b 13 cd b9 9f 70 34  |..A..nH.6K....p4|
-000000a0  60 17 03 03 00 3e f8 19  ab 88 f7 15 07 97 72 ec  |`....>........r.|
-000000b0  41 6c 0a 64 b3 26 4a 56  21 20 d7 9c a2 84 06 ab  |Al.d.&JV! ......|
-000000c0  cb e6 99 1b 45 ce ca e7  c6 57 04 c9 3a 76 84 97  |....E....W..:v..|
-000000d0  fe a3 be 60 b2 2c 53 31  ab cd 49 d5 fc 59 80 69  |...`.,S1..I..Y.i|
-000000e0  38 d3 66 32 17 03 03 02  6d 8f 8b 7a 7d 78 d3 4b  |8.f2....m..z}x.K|
-000000f0  98 1e 0b 05 38 60 58 d0  0a 7a f8 a7 70 53 67 ce  |....8`X..z..pSg.|
-00000100  ea ed 86 3e 79 9d 37 66  b2 61 be 34 bf 15 5a d8  |...>y.7f.a.4..Z.|
-00000110  4e fb 52 62 8d e2 ae e9  58 b9 bc f9 e9 75 81 16  |N.Rb....X....u..|
-00000120  af fa 92 c3 aa ac d2 2c  7b c2 21 2f b0 0d e9 53  |.......,{.!/...S|
-00000130  d3 e3 ec d5 e7 95 23 83  d9 b1 ff 25 55 47 6a 1c  |......#....%UGj.|
-00000140  97 37 84 9a ce 67 15 63  0f ff 24 63 af 43 8a 7d  |.7...g.c..$c.C.}|
-00000150  46 63 bb 33 67 7a de 86  b4 6a 70 2d 6a 7f 82 c2  |Fc.3gz...jp-j...|
-00000160  24 3c e1 0f a9 7f 93 76  d2 c9 e2 56 d3 cb b9 17  |$<.....v...V....|
-00000170  97 2f 8a 25 40 dc 35 e4  00 3a 3f 2b 1e 09 1b f2  |./.%@.5..:?+....|
-00000180  12 2a 76 c0 2e cd 17 06  32 a9 f8 08 70 3f 06 fa  |.*v.....2...p?..|
-00000190  c7 1b c4 50 4f b8 1e 0f  6f 6a 3a ba f6 28 1b d0  |...PO...oj:..(..|
-000001a0  a7 34 a5 8c 02 fe 35 4f  b4 97 45 96 48 bc b9 0d  |.4....5O..E.H...|
-000001b0  c9 2f df bd c1 8b 19 44  33 12 90 2c d2 99 09 36  |./.....D3..,...6|
-000001c0  97 3f 29 56 30 77 15 df  15 c9 b1 26 9c f4 6a 59  |.?)V0w.....&..jY|
-000001d0  00 3e d8 28 74 19 6c 38  6c 68 63 16 ab cb f0 3d  |.>.(t.l8lhc....=|
-000001e0  ce 30 f6 9c 06 00 06 cc  5a 8e 78 73 af 53 a4 e6  |.0......Z.xs.S..|
-000001f0  49 10 5b 9d 4d f3 7d 48  f0 5d 87 27 d8 7e 58 a6  |I.[.M.}H.].'.~X.|
-00000200  86 51 a0 d6 e8 82 20 6b  d3 f9 99 4d 11 b7 49 ad  |.Q.... k...M..I.|
-00000210  f9 1a 1b f5 cd 81 81 bd  51 76 a4 5a 5f 35 7a 52  |........Qv.Z_5zR|
-00000220  12 1b 73 f6 f3 1d cf 93  7a 8e a0 1d 4c f3 b2 f5  |..s.....z...L...|
-00000230  16 00 57 21 2f c6 85 af  8c 8b f9 bd 2a f1 ee 15  |..W!/.......*...|
-00000240  ec ee 80 b9 8b 0a 50 36  cb 53 fd ca 53 b4 0e 96  |......P6.S..S...|
-00000250  7b db e6 93 f7 9e 8d e4  6a d5 ff e3 74 31 76 3a  |{.......j...t1v:|
-00000260  a8 de ce 06 97 3d 4e 91  c5 cd 85 06 c9 a6 02 91  |.....=N.........|
-00000270  f9 36 33 8d 28 23 54 f5  c3 f0 b2 1a a1 6b b7 c6  |.63.(#T......k..|
-00000280  d1 c3 31 ad d6 6f 0c 44  e4 34 d8 26 b6 ff 06 6f  |..1..o.D.4.&...o|
-00000290  f3 56 19 46 8d f3 75 c2  d9 69 4a 5b ff 3a b8 1d  |.V.F..u..iJ[.:..|
-000002a0  86 a9 6f 45 dc 3a e4 aa  9b 7d 3a 5a 50 ad c6 f6  |..oE.:...}:ZP...|
-000002b0  8c e3 0e ca b6 7a 99 e7  4b 58 26 c2 18 95 14 a4  |.....z..KX&.....|
-000002c0  f9 ae 79 4f f6 c0 f8 0e  d4 52 fb 3c 5d a2 30 9c  |..yO.....R.<].0.|
-000002d0  ea d9 8d f4 27 4c 6f 7a  02 45 8f ca 8c b1 bc d2  |....'Loz.E......|
-000002e0  c5 dc 8b 09 d7 c4 0f ea  f6 51 be f7 cd 01 1e 78  |.........Q.....x|
-000002f0  a1 37 4a 88 ae 5f c5 79  9c e2 4d c9 74 e7 2e 18  |.7J.._.y..M.t...|
-00000300  86 e8 62 3f 6c 39 73 eb  c2 e2 54 0c 13 ca f6 57  |..b?l9s...T....W|
-00000310  20 92 6a 1d 03 28 d0 53  6f 6e cb 57 da 33 20 1a  | .j..(.Son.W.3 .|
-00000320  c8 3d 09 73 5f 28 14 6f  4c 16 8c 41 cd 44 ad df  |.=.s_(.oL..A.D..|
-00000330  77 08 0f f1 3c 4c 2b 37  03 60 9d 07 85 e7 66 f7  |w...<L+7.`....f.|
-00000340  e7 7f 7b 45 0a db 3f 62  88 ca 84 ff e9 08 32 92  |..{E..?b......2.|
-00000350  07 77 cc c0 b7 31 17 03  03 00 99 d0 7e f0 62 28  |.w...1......~.b(|
-00000360  21 cb 07 5c 54 0b 79 94  26 e3 63 25 57 df e4 79  |!..\T.y.&.c%W..y|
-00000370  32 d1 1d 08 dc 66 76 30  68 62 c1 a7 9c 72 f6 07  |2....fv0hb...r..|
-00000380  e6 0e 30 de ef 4a 6e d8  0d 0e df 40 e7 6e 8b 48  |..0..Jn....@.n.H|
-00000390  07 62 27 7f 97 c8 8d 3f  8d ce b3 e4 9e ed c5 e0  |.b'....?........|
-000003a0  9e ec f2 7b 7e 4d e0 1b  14 69 ef c6 5d 04 5c a6  |...{~M...i..].\.|
-000003b0  1a 41 62 25 79 88 39 0e  b5 1a 6c 75 d0 fe 92 6a  |.Ab%y.9...lu...j|
-000003c0  7e 4f e2 36 f0 09 b8 a7  1a 4a 3a 94 f6 27 25 7f  |~O.6.....J:..'%.|
-000003d0  c9 ad 2e 50 41 64 a4 73  34 d2 4e 02 05 af 68 84  |...PAd.s4.N...h.|
-000003e0  40 81 d9 f7 a9 0b 77 ee  6c 83 0c d5 d5 70 49 e5  |@.....w.l....pI.|
-000003f0  a5 0a 3e 12 17 03 03 00  35 35 88 42 4c 14 18 a9  |..>.....55.BL...|
-00000400  3e 26 15 0a f1 c3 a6 ab  94 a3 72 bd c7 04 22 bc  |>&........r...".|
-00000410  67 32 15 16 23 f5 50 97  bc 7f ab f8 ef f0 02 7d  |g2..#.P........}|
-00000420  2d 76 01 18 72 18 77 c1  f5 9b e9 e9 97 8d        |-v..r.w.......|
+00000080  03 03 00 01 01 17 03 03  00 17 43 8e 41 a4 04 13  |..........C.A...|
+00000090  01 08 9f 6e 1a fd 00 68  38 5c 93 d9 9a f7 1e 36  |...n...h8\.....6|
+000000a0  ea 17 03 03 00 3e 9f ae  80 ef f4 20 66 e7 44 fc  |.....>..... f.D.|
+000000b0  4d a4 3f 0e dc bb 33 47  0f 13 96 fa 03 07 d6 6f  |M.?...3G.......o|
+000000c0  cc 9f 3c fd 01 f5 87 d9  ec c9 d0 fc dd bf c8 5c  |..<............\|
+000000d0  0b 3d aa a7 c6 1d 90 18  d9 a1 1a a0 a1 ea 49 32  |.=............I2|
+000000e0  9e 45 86 f7 17 03 03 02  6d 61 29 fe 45 7e 5c b3  |.E......ma).E~\.|
+000000f0  8a 73 f2 65 c1 90 4e 93  0d 84 b2 bd e4 46 93 c2  |.s.e..N......F..|
+00000100  52 3f 07 38 e7 23 db 25  5e 71 98 a9 7d fd e9 ef  |R?.8.#.%^q..}...|
+00000110  3f 2c d8 9c ae 41 c4 d3  c7 9e d5 6e f0 0c 33 78  |?,...A.....n..3x|
+00000120  98 cf bf 22 3d 1f d0 f3  c8 a2 34 e8 ce 5e 0d 37  |..."=.....4..^.7|
+00000130  52 e2 b8 e3 50 ea 35 3e  e5 59 a0 6d ed 9e 09 36  |R...P.5>.Y.m...6|
+00000140  59 20 33 08 a9 41 f4 72  aa 2d 0c b5 d6 96 d9 04  |Y 3..A.r.-......|
+00000150  1a f1 d8 45 ed 67 ab f9  15 fa 25 ef 6d 87 72 ad  |...E.g....%.m.r.|
+00000160  f0 06 59 a5 8e 61 80 8b  28 f9 a0 df 5b b2 a2 3a  |..Y..a..(...[..:|
+00000170  1c 91 43 18 f4 a2 f3 4e  db dc 24 1b c3 0e 77 22  |..C....N..$...w"|
+00000180  83 ae 88 9f 8e 8d 48 38  f4 60 51 42 fa f2 a4 de  |......H8.`QB....|
+00000190  33 78 35 d0 b6 01 3d 7a  f5 54 68 51 fd 0e 4c 9b  |3x5...=z.ThQ..L.|
+000001a0  92 7c a5 01 96 52 7e de  38 b9 b0 ee 60 1e aa eb  |.|...R~.8...`...|
+000001b0  8c e6 b4 f4 7c 35 d2 0b  9b 83 94 ac ac ce 7e 58  |....|5........~X|
+000001c0  51 6e c3 ae 3b cd f5 85  8a 1e 43 78 19 ee dc a1  |Qn..;.....Cx....|
+000001d0  a3 d0 93 24 0d 3b 6a 4b  cd dc 78 9c 0b 2f bc 41  |...$.;jK..x../.A|
+000001e0  46 2f 64 3c 23 95 04 8b  60 75 bf 4d 45 3b e4 1e  |F/d<#...`u.ME;..|
+000001f0  9c 5b 1a 46 bb f3 4d a9  1b 59 33 b4 40 78 bd ff  |.[.F..M..Y3.@x..|
+00000200  30 7d d4 cc 5e 83 03 de  8d a3 a6 27 b4 bc 12 6e  |0}..^......'...n|
+00000210  5e f2 88 e8 b6 60 f3 01  e8 4a 53 c7 a9 fc a1 cc  |^....`...JS.....|
+00000220  27 45 c1 06 90 38 9a fb  1b 2a 9e ed 9e f6 19 85  |'E...8...*......|
+00000230  dd f7 8a 7f 95 08 3a 25  c0 5b 63 96 44 71 c2 16  |......:%.[c.Dq..|
+00000240  9c e1 10 69 e5 6a 5c 4a  e8 2a ed 6f bd de f5 98  |...i.j\J.*.o....|
+00000250  c0 a0 c5 54 7c cc 06 11  b2 54 1a c3 b4 46 c2 b4  |...T|....T...F..|
+00000260  97 d8 9c 7d f1 f3 d4 6f  3c a0 ef 18 c5 a6 e9 13  |...}...o<.......|
+00000270  e9 f4 9d bf 9b 25 a2 da  c6 ba 7a 6d 91 fd 41 a4  |.....%....zm..A.|
+00000280  e8 88 e3 79 2c 99 df 4d  21 48 89 57 5a bf 2a 2d  |...y,..M!H.WZ.*-|
+00000290  72 4e 1e 3a e8 c9 82 7b  c0 ff 6b 7c e8 8f 41 bf  |rN.:...{..k|..A.|
+000002a0  83 19 9e 96 d1 3f 2b 60  8f 7f 0b f8 6c 70 82 dd  |.....?+`....lp..|
+000002b0  34 da 91 62 17 20 e9 99  2e e2 a9 9a 9d fd 5d f8  |4..b. ........].|
+000002c0  a5 c0 ac e8 a3 df 11 b5  df 2c bd e1 e8 0f 7e 0a  |.........,....~.|
+000002d0  f2 47 4c 92 33 7b 6b 49  e5 30 31 8b 2e 16 81 3e  |.GL.3{kI.01....>|
+000002e0  79 25 f7 d7 d2 8f 5e e6  e3 2d ed 0d e1 08 97 13  |y%....^..-......|
+000002f0  f3 ce 7d b1 36 0d 7c b0  4f 23 6b 12 ef 3a a4 8b  |..}.6.|.O#k..:..|
+00000300  b5 d0 c9 ee 48 77 70 28  61 ff ad 49 f6 48 4c 37  |....Hwp(a..I.HL7|
+00000310  7b 00 c4 01 5d 8b 54 bc  44 5c 5f 98 6f 7d 84 84  |{...].T.D\_.o}..|
+00000320  c8 d0 55 88 f9 17 f6 02  f1 84 b6 3c 1a 03 e8 7b  |..U........<...{|
+00000330  b9 4e 24 c6 d8 0a f6 8c  b9 49 c6 10 38 53 e1 10  |.N$......I..8S..|
+00000340  8f 91 cd 39 9a 3a e8 c7  10 f3 c3 91 84 3c 8c a6  |...9.:.......<..|
+00000350  55 ab f4 f5 ab e7 17 03  03 00 99 e5 40 f6 35 34  |U...........@.54|
+00000360  2d 42 3e 7f e1 51 26 56  50 4e 60 b0 2f 65 e3 cd  |-B>..Q&VPN`./e..|
+00000370  c7 08 0e 96 77 08 c7 f6  4f e6 70 90 bc 80 95 e7  |....w...O.p.....|
+00000380  b2 df 98 83 94 4d 9e 5c  8a af d3 45 da e9 d7 fa  |.....M.\...E....|
+00000390  d8 d2 60 f8 b1 06 d9 27  64 45 4d e8 d3 07 8a bb  |..`....'dEM.....|
+000003a0  72 7a c6 71 00 7e 8b b0  2b 7d d0 f7 ab 1a bf d2  |rz.q.~..+}......|
+000003b0  50 be a9 3a 0c 68 b8 48  9a 91 ee db 26 4d d3 66  |P..:.h.H....&M.f|
+000003c0  5b 00 ef c3 cc b8 f2 4e  1e 51 c7 9b 34 3c e3 01  |[......N.Q..4<..|
+000003d0  7f 75 4e 41 e4 56 34 ec  14 92 0f 1e 6d dd 51 9a  |.uNA.V4.....m.Q.|
+000003e0  e0 8b 33 54 df 77 1f ff  d3 72 67 4c 62 16 b7 f8  |..3T.w...rgLb...|
+000003f0  4f 8f f8 ee 17 03 03 00  35 b7 83 d2 27 a3 15 f2  |O.......5...'...|
+00000400  75 55 aa 06 8c 5f c4 fa  0f 43 88 c9 c5 e3 c7 36  |uU..._...C.....6|
+00000410  40 6b 35 0b 7e 60 a1 1e  48 ef 46 2c d6 e4 48 80  |@k5.~`..H.F,..H.|
+00000420  91 b0 e5 3b c0 58 5d fe  5d bd 0a 6c 19 ea        |...;.X].]..l..|
 >>> Flow 3 (client to server)
-00000000  14 03 03 00 01 01 17 03  03 02 11 4b 29 10 c9 7b  |...........K)..{|
-00000010  98 9a fa ce 7a 17 a4 7d  15 5f 97 4f 40 67 37 f0  |....z..}._.O@g7.|
-00000020  0b 2d ca 62 77 23 ab 78  d7 9f b6 1d 5c 64 fb 68  |.-.bw#.x....\d.h|
-00000030  70 5f 21 df e1 55 3b e3  bb 8e 61 31 11 ba 2b eb  |p_!..U;...a1..+.|
-00000040  de 78 39 5c 31 62 a3 fb  9a 57 a4 50 34 43 76 55  |.x9\1b...W.P4CvU|
-00000050  ae f9 36 b1 35 ee 2b 8d  ab c2 70 52 b0 8c d6 1b  |..6.5.+...pR....|
-00000060  fe 0f fc 5e 79 c3 cf ab  d3 9a 81 af 63 2c b3 f7  |...^y.......c,..|
-00000070  a6 b7 13 c4 70 22 fa 56  6d 77 cb d1 bf a5 9e c8  |....p".Vmw......|
-00000080  74 83 80 f9 9a 19 f3 a3  94 15 72 7c 55 0e 21 47  |t.........r|U.!G|
-00000090  2b a2 d3 b8 74 e1 07 37  7f 12 f6 ad ba 71 e5 ca  |+...t..7.....q..|
-000000a0  17 42 2b 78 9e 90 7d 28  b1 f4 dd 7d b8 69 dd c6  |.B+x..}(...}.i..|
-000000b0  eb 3d 93 45 06 ac 5d fe  02 18 b8 f3 8c e4 4e 97  |.=.E..].......N.|
-000000c0  05 8b 36 94 cb 0f 66 64  ed a8 50 22 ba c8 a7 23  |..6...fd..P"...#|
-000000d0  7d f9 d5 4f d5 27 83 f3  b6 09 3f 4f 69 92 6d be  |}..O.'....?Oi.m.|
-000000e0  4a 30 02 d2 d5 e6 14 d4  21 e2 c8 5b cb 08 1e 9a  |J0......!..[....|
-000000f0  28 f7 f4 13 8c 58 9b 69  2c 55 3d 78 f2 ce 93 89  |(....X.i,U=x....|
-00000100  2f 62 56 ea a3 21 96 f6  e7 ee a4 3d d8 7d 86 4d  |/bV..!.....=.}.M|
-00000110  79 c9 3b c8 cf ea a0 6b  5f 29 8c ed c2 d6 73 27  |y.;....k_)....s'|
-00000120  a0 35 bb 2b 8b 6c 4e 59  74 e5 84 c4 d2 1a f1 0d  |.5.+.lNYt.......|
-00000130  5c 36 33 f7 42 d6 08 c3  f8 5b ea 27 a1 cc b9 72  |\63.B....[.'...r|
-00000140  d5 b9 4e 17 36 b3 05 29  50 da 52 bc 23 f7 82 82  |..N.6..)P.R.#...|
-00000150  c0 67 2b 80 a2 7f e2 ec  b9 12 bb dc b6 04 b6 4f  |.g+............O|
-00000160  87 15 16 13 de c4 1c 04  71 33 ba d7 a7 da f1 f5  |........q3......|
-00000170  77 c6 4e 8e b2 65 a1 6c  a8 c2 5b a1 f5 da 49 6c  |w.N..e.l..[...Il|
-00000180  85 ee 21 8d 10 6b 82 bf  0c 0f 7e 33 8b 5e 44 5b  |..!..k....~3.^D[|
-00000190  70 db bc 76 40 a0 5c 02  f6 8a 9b de aa a4 b2 94  |p..v@.\.........|
-000001a0  d0 e0 b7 60 af df ad 3d  e3 17 a9 60 e0 d9 a8 3e  |...`...=...`...>|
-000001b0  c6 06 9b ad 97 0b dc 21  16 9d 42 29 74 a1 f5 03  |.......!..B)t...|
-000001c0  d4 15 0d ee fd fa 6b 85  12 2f 8c 26 fd 96 ce 85  |......k../.&....|
-000001d0  a5 b7 ba bb ac 8a 6d 54  f5 fd e6 6c 32 24 a9 e7  |......mT...l2$..|
-000001e0  1a 11 bf 4d cb f9 18 9a  b8 1e a6 e4 1f 61 b1 ce  |...M.........a..|
-000001f0  1c ca 5d 81 e7 84 e0 a9  4e c7 f9 5d 71 72 76 4b  |..].....N..]qrvK|
-00000200  65 ca 3a a4 4d d8 ec 82  aa 33 80 bb 15 48 2d 7c  |e.:.M....3...H-||
-00000210  4e 5e d2 ec 13 1a e7 03  d5 29 95 80 17 03 03 00  |N^.......)......|
-00000220  99 60 a2 43 34 23 c0 a4  4c 0a 18 c5 27 96 2f 7c  |.`.C4#..L...'./||
-00000230  af 2b 2c 36 f2 9b cf 93  e7 3e 79 3b 20 d4 3b 60  |.+,6.....>y; .;`|
-00000240  a2 ef af 36 d5 45 d4 20  89 be 80 1d 1e ca f7 19  |...6.E. ........|
-00000250  35 8f 26 3f be c0 a2 f6  c6 85 a3 88 76 cd 06 f9  |5.&?........v...|
-00000260  4f ff 54 79 6c ac 33 71  31 90 70 36 eb 9c c1 b4  |O.Tyl.3q1.p6....|
-00000270  4a c8 3a 52 85 2b be 4a  19 8a 24 fd 6f 08 47 19  |J.:R.+.J..$.o.G.|
-00000280  84 88 a0 48 f6 17 80 f8  fe 9e 21 68 e1 75 17 14  |...H......!h.u..|
-00000290  d4 e2 3a e2 de 9d 19 56  ad cc 33 13 f3 52 b2 1b  |..:....V..3..R..|
-000002a0  f4 65 04 05 79 9f 3e 14  fb 1f 9c d1 c4 53 c0 93  |.e..y.>......S..|
-000002b0  49 ad 3c 2e de c1 b4 fe  be b3 17 03 03 00 35 32  |I.<...........52|
-000002c0  81 98 1a 6c 38 ca 67 64  c5 30 0b 81 7d fd a1 b9  |...l8.gd.0..}...|
-000002d0  2e af 41 1d e9 b7 31 17  d8 08 ce d5 f6 12 4d da  |..A...1.......M.|
-000002e0  fc db fb e1 fa 5b cd 70  12 e7 bb 26 dd 53 9c 43  |.....[.p...&.S.C|
-000002f0  02 06 1f 70                                       |...p|
+00000000  14 03 03 00 01 01 17 03  03 02 11 9e 9e cf 44 84  |..............D.|
+00000010  df e7 23 47 2d 4e 85 fa  f2 02 2a 79 4d 3a 3d df  |..#G-N....*yM:=.|
+00000020  48 95 2e d7 0d 3c d0 05  fc bf bb 23 0a 25 59 76  |H....<.....#.%Yv|
+00000030  fd 04 f8 f0 81 88 85 9f  99 f0 55 91 9a 79 8a 39  |..........U..y.9|
+00000040  f4 6e 49 92 be ed 1d d1  20 19 77 bc 55 9b b0 da  |.nI..... .w.U...|
+00000050  d1 c4 9f b5 2f 5c 1a 60  38 e1 92 9b f9 a1 97 6b  |..../\.`8......k|
+00000060  1b d0 d0 d0 05 7a 41 26  d4 6b 12 a0 b3 c6 33 13  |.....zA&.k....3.|
+00000070  4f 74 10 d6 91 fb b0 69  46 46 ca de 7c 05 d6 62  |Ot.....iFF..|..b|
+00000080  51 23 12 58 00 ff 25 8e  c8 5f 54 85 f4 2f e9 f9  |Q#.X..%.._T../..|
+00000090  f1 1e 32 b9 f1 a6 fb 90  9b a9 65 d2 c9 ea a7 1a  |..2.......e.....|
+000000a0  e8 c9 a8 bb 7e 3d 3f 03  62 fc f4 06 a4 a2 f7 41  |....~=?.b......A|
+000000b0  60 f5 f1 df 3e d6 31 51  f4 dc b1 d3 60 4b 84 4f  |`...>.1Q....`K.O|
+000000c0  99 e2 9f b2 f0 d5 fd b2  f3 5c 24 5f 91 a6 94 cd  |.........\$_....|
+000000d0  37 61 91 4e cc ae cd c1  b5 cc 58 5f 9a 91 a1 13  |7a.N......X_....|
+000000e0  23 42 8a c5 27 4c 66 32  69 9c 75 9f 2a ed 73 1d  |#B..'Lf2i.u.*.s.|
+000000f0  29 2e 36 50 34 b4 80 d2  08 e6 9f c6 3e da df 9f  |).6P4.......>...|
+00000100  e0 2a 08 88 47 b6 d3 ff  f7 6c 6c 91 1a 8e 53 89  |.*..G....ll...S.|
+00000110  53 6c b8 d7 83 37 ab 03  59 e6 4f 41 42 af d4 f9  |Sl...7..Y.OAB...|
+00000120  ac 9d ae d1 77 f1 71 79  a0 16 c4 c7 b5 a6 a9 9f  |....w.qy........|
+00000130  59 da 55 fb c5 88 8c 13  04 c2 06 39 8f ae 7e ca  |Y.U........9..~.|
+00000140  99 ce cd aa 86 0a 00 bd  56 f1 98 d9 c8 d2 c1 c0  |........V.......|
+00000150  df 16 c2 6f 78 da 66 3f  cc 43 c7 38 33 1b 3b 5b  |...ox.f?.C.83.;[|
+00000160  f8 7e d8 b7 ef 4c 6d c7  f6 84 56 8d 76 f7 0d 83  |.~...Lm...V.v...|
+00000170  94 e6 ad c5 f3 05 5c f4  17 69 d5 83 98 c3 43 8e  |......\..i....C.|
+00000180  9f a5 5c 7b 12 ea f4 1f  39 ce 0d 83 15 b1 e6 ce  |..\{....9.......|
+00000190  c1 35 9b 8c ec c6 d2 d7  f9 02 36 90 24 f4 3a 70  |.5........6.$.:p|
+000001a0  ce bb 8d bb 4b b2 aa 64  f0 b5 c0 88 cc 06 e3 9c  |....K..d........|
+000001b0  f7 70 64 fd 5d 48 f5 c8  07 48 c2 09 c4 07 56 b9  |.pd.]H...H....V.|
+000001c0  86 e9 d6 7b dc ac a5 00  2c 1d 80 8f 47 f2 c4 c7  |...{....,...G...|
+000001d0  ab dc 7b 41 7b 3d 47 db  09 12 02 9f 1b 63 e7 cc  |..{A{=G......c..|
+000001e0  38 1d 33 56 e0 ae 63 7a  95 73 5f e6 da 13 53 49  |8.3V..cz.s_...SI|
+000001f0  5f 69 e9 ff 86 26 bd 9a  dd be 5c 75 e7 69 66 b4  |_i...&....\u.if.|
+00000200  27 3f 79 d2 2e 8e 79 9e  89 42 58 20 a2 ca 8c 2a  |'?y...y..BX ...*|
+00000210  37 b8 99 81 66 3a 31 66  1a 95 4c 47 17 03 03 00  |7...f:1f..LG....|
+00000220  99 66 08 07 06 6d 95 fe  f1 72 2a 7c de 84 06 b0  |.f...m...r*|....|
+00000230  3d d7 d1 6b 47 0e 4d fb  9e ab 55 f7 71 c5 5d 11  |=..kG.M...U.q.].|
+00000240  cb c7 fb 45 90 9d 22 eb  ec 03 d6 ce 8c 01 ff 81  |...E..".........|
+00000250  a2 90 23 1d 7a f3 cb 16  76 a5 05 57 77 f6 af f0  |..#.z...v..Ww...|
+00000260  29 6c 6c 39 9e 99 55 c0  38 c3 31 68 49 b3 bf cc  |)ll9..U.8.1hI...|
+00000270  31 e2 6d a4 4c e7 99 53  2f 31 3f 05 2c 7c 1b 10  |1.m.L..S/1?.,|..|
+00000280  60 ce 8b 60 47 16 eb e5  8b be 1b 7a 95 b9 3c 60  |`..`G......z..<`|
+00000290  1c d6 b5 13 5f ad b9 bb  13 dd d6 08 8e 70 cb 2a  |...._........p.*|
+000002a0  26 3e df ce 7c 21 e5 27  7e 27 ec 75 b6 47 a0 89  |&>..|!.'~'.u.G..|
+000002b0  2e e1 3c ab 0d 72 90 d1  d5 07 17 03 03 00 35 82  |..<..r........5.|
+000002c0  6b 48 4a 9a 63 16 07 8f  b2 d3 4a 65 7d e0 c4 e8  |kHJ.c.....Je}...|
+000002d0  27 3e ce 4a 0a c8 63 e0  f9 70 98 c0 6a 12 39 ec  |'>.J..c..p..j.9.|
+000002e0  e1 52 de 73 58 2d f0 7c  bc 8d 41 16 be 89 a0 88  |.R.sX-.|..A.....|
+000002f0  56 e5 ef f6                                       |V...|
 >>> Flow 4 (server to client)
-00000000  17 03 03 02 8b 8e b1 29  40 b6 53 bc 89 c7 87 69  |.......)@.S....i|
-00000010  4c 6d 5b 61 d9 ba 5b 96  22 ac 57 71 58 f8 0e ea  |Lm[a..[.".WqX...|
-00000020  81 ea bf f9 34 6d a0 ce  1f d2 97 52 62 2b 9e f7  |....4m.....Rb+..|
-00000030  03 28 96 56 c0 a1 0e 69  7c 98 13 e5 91 8c 48 5f  |.(.V...i|.....H_|
-00000040  4e 78 87 14 38 f8 fa 3c  17 97 f9 de 38 3b cf 0f  |Nx..8..<....8;..|
-00000050  d9 dd 41 0a bb 65 ca a7  0b fd a5 11 c2 c3 6a b8  |..A..e........j.|
-00000060  5a e1 68 a1 8d f8 35 9d  c6 e1 3e e1 03 a9 06 ee  |Z.h...5...>.....|
-00000070  1f 92 ca b5 f4 df 3e e5  69 63 9e a2 ea 5e b8 d9  |......>.ic...^..|
-00000080  26 31 9e 25 de a8 ea 44  1a c0 86 0b 38 75 04 dc  |&1.%...D....8u..|
-00000090  2d 37 ad 40 e3 2f d1 b0  9e 9e 64 57 8b 31 20 d6  |-7.@./....dW.1 .|
-000000a0  16 64 fd 1b c1 01 58 af  4b 88 49 23 7a f6 a2 15  |.d....X.K.I#z...|
-000000b0  ca 02 4b d6 6d 7c f8 7a  c9 c0 0d 32 6e 1d 83 ca  |..K.m|.z...2n...|
-000000c0  47 e5 6f 86 a0 f7 8b 50  1d 91 ec fa 2b 4a 72 f7  |G.o....P....+Jr.|
-000000d0  a0 09 f1 65 fb 81 32 d2  a0 be 18 07 9f 5d 89 98  |...e..2......]..|
-000000e0  08 09 a6 1d 9a 5a 10 67  81 58 82 00 9d 01 48 a8  |.....Z.g.X....H.|
-000000f0  5b df 54 b3 cd 84 87 e0  41 e6 1e 47 46 33 56 0c  |[.T.....A..GF3V.|
-00000100  67 82 b9 bc 28 68 f3 5b  51 a8 c0 0e 43 14 62 bb  |g...(h.[Q...C.b.|
-00000110  8a bd 3f 4d d6 33 c4 76  4f c1 06 f8 9b bf 64 41  |..?M.3.vO.....dA|
-00000120  6c e5 40 8d 93 4a 6b 6f  fe 72 6b db ac 35 b4 fc  |l.@..Jko.rk..5..|
-00000130  84 13 fa 8a 7d 35 e3 73  12 eb 1a 5f a9 e2 28 53  |....}5.s..._..(S|
-00000140  0c 6d 41 ec 4b 76 f5 d9  48 2a c2 85 2a 1f 7d 61  |.mA.Kv..H*..*.}a|
-00000150  f6 1f 27 ef 47 c9 c7 b3  19 5c 07 d5 18 ec fd 3e  |..'.G....\.....>|
-00000160  78 41 cb a4 3a 47 22 cf  7e 7e 17 be 27 c4 90 ce  |xA..:G".~~..'...|
-00000170  2a cb cd ed 0f a3 bf 1e  4c 62 7a 80 ff 21 38 c5  |*.......Lbz..!8.|
-00000180  c2 37 9f 62 4b d8 c0 9e  df ae 3c 69 cd 25 f5 65  |.7.bK.....<i.%.e|
-00000190  ec f6 c2 0e 0f f0 b2 12  85 c4 2a 4b 8f 18 1a 0a  |..........*K....|
-000001a0  fa 4d 12 5f ee d4 11 64  21 f9 c7 c4 a6 ba e5 3b  |.M._...d!......;|
-000001b0  e9 54 ec ee e6 d3 09 31  9f 6e 99 ec 71 7e 42 5d  |.T.....1.n..q~B]|
-000001c0  78 88 ba eb 9f dd 99 59  fe 4e 29 1a 2e 35 12 4b  |x......Y.N)..5.K|
-000001d0  98 d4 14 79 80 b7 86 d3  da b5 c8 a6 34 cb 06 57  |...y........4..W|
-000001e0  a6 70 5c 6d 15 0b a7 ec  c9 ab fb 24 ad b7 c0 2b  |.p\m.......$...+|
-000001f0  ec fb 9b d4 57 b1 44 86  cf 75 c4 de c6 32 f9 01  |....W.D..u...2..|
-00000200  ab 84 85 17 2a 0a 7e 48  e9 94 28 0c ba a8 98 a8  |....*.~H..(.....|
-00000210  b2 36 89 62 ed 0d d8 e8  af 91 1b fd f8 97 25 c9  |.6.b..........%.|
-00000220  56 27 ff 1b d8 56 23 ec  96 8f ed 7b db 80 1e d4  |V'...V#....{....|
-00000230  b8 79 d4 23 d2 3c 89 38  32 14 b9 4e b4 55 99 1f  |.y.#.<.82..N.U..|
-00000240  4f 56 3f 65 c7 b8 bd 28  47 f8 74 50 bb 16 5f de  |OV?e...(G.tP.._.|
-00000250  e1 4d bf d9 bf 0e c0 57  3b a4 7d 7a 95 42 49 95  |.M.....W;.}z.BI.|
-00000260  b2 e2 99 68 72 38 9b 87  b6 c0 4c d5 b9 da 08 81  |...hr8....L.....|
-00000270  27 f8 5f 68 30 fd 01 7f  c4 d5 74 9f e6 3f 28 93  |'._h0.....t..?(.|
-00000280  83 18 38 bd c5 cf be c7  a1 bd 65 a1 74 fb cc e9  |..8.......e.t...|
-00000290  17 03 03 00 1e c3 24 ce  a6 69 b8 6c fe 2a 71 a9  |......$..i.l.*q.|
-000002a0  74 4a 04 8b 40 f4 06 06  99 e0 52 fd 13 78 b2 08  |tJ..@.....R..x..|
-000002b0  b7 c1 8a 17 03 03 00 13  ea fb 49 f8 a7 37 b2 f0  |..........I..7..|
-000002c0  ef 9d 6b 7e 68 04 5a 27  fa 36 a5                 |..k~h.Z'.6.|
+00000000  17 03 03 02 83 ce c4 10  39 1a fe 62 a2 ff 27 6d  |........9..b..'m|
+00000010  b7 e3 1d d6 8e b8 a2 7e  f5 30 87 35 16 41 fb 04  |.......~.0.5.A..|
+00000020  3c 79 9e 02 9b 06 4c a7  ba 01 5b cf 94 bc c8 08  |<y....L...[.....|
+00000030  15 03 91 2c 24 34 17 a4  60 dc a5 72 04 5d 78 49  |...,$4..`..r.]xI|
+00000040  4c 2f e4 6a df 1c 38 fe  b2 8c 61 5e a8 ac 3e d1  |L/.j..8...a^..>.|
+00000050  58 7d fe c1 e3 78 79 31  48 d2 74 c0 8d 17 97 6f  |X}...xy1H.t....o|
+00000060  30 bb 8a 2c 8c d4 76 3d  3f f0 20 24 3d 5a 21 0c  |0..,..v=?. $=Z!.|
+00000070  37 7b 14 45 e6 69 db ed  52 50 a0 77 e9 a2 84 59  |7{.E.i..RP.w...Y|
+00000080  0c 96 c1 ad 48 ed 8d 9f  00 4d f2 15 86 71 c0 fa  |....H....M...q..|
+00000090  14 b9 77 cb 9f 04 d9 1b  be da 68 8e 31 8f 25 14  |..w.......h.1.%.|
+000000a0  f5 43 bd e5 6e c5 10 ab  f7 68 22 7f c2 ba 5c a6  |.C..n....h"...\.|
+000000b0  88 31 c0 a5 fb 63 05 95  52 b3 04 94 14 fe eb 0c  |.1...c..R.......|
+000000c0  53 a0 c2 bf ae 58 e3 f9  84 22 6b ca 95 33 12 80  |S....X..."k..3..|
+000000d0  09 e2 97 b0 2b 4b ed fa  34 e1 5a b1 de 52 b1 2c  |....+K..4.Z..R.,|
+000000e0  a0 aa 11 d6 fa 07 e1 41  ed 36 9f 9a 1a 56 18 b0  |.......A.6...V..|
+000000f0  ef e7 85 dc 5b 53 23 56  c2 ac 34 64 c8 9d 4b 49  |....[S#V..4d..KI|
+00000100  6d 29 7e 4b 73 4f 0b 8e  30 86 87 ea cf 1c dd 62  |m)~KsO..0......b|
+00000110  c0 a4 96 aa fe 41 e7 25  94 8e 08 b5 4d 42 26 d3  |.....A.%....MB&.|
+00000120  ba 84 98 bf 27 2b d5 3d  37 b9 b1 b5 24 33 e3 4d  |....'+.=7...$3.M|
+00000130  3f 05 38 54 fe 2c 15 63  20 2e 70 c0 c6 da 0e 89  |?.8T.,.c .p.....|
+00000140  b6 99 07 db e3 7c 3e 58  d0 a3 2b 50 c4 f3 21 92  |.....|>X..+P..!.|
+00000150  62 e0 e9 b5 d4 7a 6b 23  a2 05 ef 9c f5 f5 05 57  |b....zk#.......W|
+00000160  cd d4 4d 0a 2f 17 ca ac  fc 9d 7e 60 ec 3c 80 8c  |..M./.....~`.<..|
+00000170  1f 99 da b7 f6 14 7a e1  86 76 50 8d f8 6b 92 24  |......z..vP..k.$|
+00000180  f2 b7 82 fa 3c 9b 14 af  0f 37 40 ae 7f 10 f5 0a  |....<....7@.....|
+00000190  f2 0f 0f bd 01 b7 0a f7  b6 d0 7f cf bf e6 67 55  |..............gU|
+000001a0  cc 36 af a6 d8 c4 ca 80  c7 af 35 ff 6e 83 56 30  |.6........5.n.V0|
+000001b0  62 26 49 bb 1a 04 8b 39  10 7b 0f 09 19 2b 0f 95  |b&I....9.{...+..|
+000001c0  08 9d c8 85 3b 5d 8c 97  16 ae cd 92 00 d5 3e 50  |....;]........>P|
+000001d0  54 66 85 8f 42 9b 60 3d  f8 99 ca c7 07 3b 51 18  |Tf..B.`=.....;Q.|
+000001e0  d5 20 37 57 35 0a d8 c6  13 0f 48 94 8f 50 7d 0e  |. 7W5.....H..P}.|
+000001f0  5a f0 98 b2 5d 5f 46 fb  ba 85 c8 4f ba 02 19 86  |Z...]_F....O....|
+00000200  0b ef 4a 04 49 1f 06 cd  be dc d5 32 74 14 d8 60  |..J.I......2t..`|
+00000210  17 a5 b5 a2 70 8e b1 75  29 bc e0 02 e0 a2 1c 7b  |....p..u)......{|
+00000220  58 cd 96 69 84 0f 95 7b  78 3e 09 72 a6 e0 50 7e  |X..i...{x>.r..P~|
+00000230  76 b0 7b 44 11 9b b8 7e  7d 09 49 91 75 5b 9b 6f  |v.{D...~}.I.u[.o|
+00000240  42 a4 e6 54 4d c6 21 65  c4 64 7d c6 29 74 13 8d  |B..TM.!e.d}.)t..|
+00000250  69 5f 20 8c f1 88 e8 1e  2d c3 13 d5 f5 52 70 24  |i_ .....-....Rp$|
+00000260  de ec 64 c7 00 3f 57 e2  3f c4 23 fe e9 65 e6 d9  |..d..?W.?.#..e..|
+00000270  92 ae f0 2f 05 4d 01 72  be 0d 7d c0 f4 30 ac 69  |.../.M.r..}..0.i|
+00000280  3c 7c c1 72 c1 b7 c4 c9  17 03 03 00 1e 73 8f 48  |<|.r.........s.H|
+00000290  cf 34 35 31 9b 63 59 59  1b 23 e1 6b b2 3a 0f df  |.451.cYY.#.k.:..|
+000002a0  21 69 8e 73 1a 61 09 5b  82 c7 78 17 03 03 00 13  |!i.s.a.[..x.....|
+000002b0  4f a0 ab 25 3f a4 85 9e  78 58 69 d2 2c c3 b6 df  |O..%?...xXi.,...|
+000002c0  32 4a 7f                                          |2J.|
diff --git a/src/crypto/tls/testdata/Server-TLSv13-ClientAuthRequestedNotGiven b/src/crypto/tls/testdata/Server-TLSv13-ClientAuthRequestedNotGiven
index fb2fb34..b839c95 100644
--- a/src/crypto/tls/testdata/Server-TLSv13-ClientAuthRequestedNotGiven
+++ b/src/crypto/tls/testdata/Server-TLSv13-ClientAuthRequestedNotGiven
@@ -1,104 +1,103 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 ca 01 00 00  c6 03 03 15 b6 db 09 24  |...............$|
-00000010  50 ea d6 f7 ae d7 32 2f  72 25 23 db 11 ad 6f c1  |P.....2/r%#...o.|
-00000020  5d 62 af e7 93 63 1a 8b  f3 82 80 20 5f 15 2e 86  |]b...c..... _...|
-00000030  86 2c 2e 2f 82 11 3c d2  9f 00 32 d4 3d 05 04 fa  |.,./..<...2.=...|
-00000040  36 41 8d dc 30 ce a6 2b  6e d4 3c 9c 00 04 13 01  |6A..0..+n.<.....|
+00000000  16 03 01 00 ca 01 00 00  c6 03 03 4a ea 7e 77 82  |...........J.~w.|
+00000010  17 37 46 db 49 14 d2 41  e4 14 b0 46 20 9d 50 45  |.7F.I..A...F .PE|
+00000020  d1 75 08 82 2b 8d bc 9a  75 e3 71 20 ce 77 9a 79  |.u..+...u.q .w.y|
+00000030  98 24 bc 15 be ac 30 fe  66 35 ab 51 be bd b4 fa  |.$....0.f5.Q....|
+00000040  6f 53 1f e9 5f 54 58 75  ce 94 f9 47 00 04 13 01  |oS.._TXu...G....|
 00000050  00 ff 01 00 00 79 00 0b  00 04 03 00 01 02 00 0a  |.....y..........|
 00000060  00 0c 00 0a 00 1d 00 17  00 1e 00 19 00 18 00 16  |................|
 00000070  00 00 00 17 00 00 00 0d  00 1e 00 1c 04 03 05 03  |................|
 00000080  06 03 08 07 08 08 08 09  08 0a 08 0b 08 04 08 05  |................|
 00000090  08 06 04 01 05 01 06 01  00 2b 00 03 02 03 04 00  |.........+......|
-000000a0  2d 00 02 01 01 00 33 00  26 00 24 00 1d 00 20 98  |-.....3.&.$... .|
-000000b0  b7 40 03 d8 a3 4c 9e 16  82 77 16 9b c1 17 3a 2a  |.@...L...w....:*|
-000000c0  fc 25 73 5d 2d 5c dc 15  78 36 12 7a 28 f2 0e     |.%s]-\..x6.z(..|
+000000a0  2d 00 02 01 01 00 33 00  26 00 24 00 1d 00 20 e0  |-.....3.&.$... .|
+000000b0  64 7e 58 b6 e7 32 fc c9  d6 3e f7 e0 f5 6a 9c 3a  |d~X..2...>...j.:|
+000000c0  e6 8f 83 d7 1c 27 62 72  71 06 71 de 49 96 05     |.....'brq.q.I..|
 >>> Flow 2 (server to client)
 00000000  16 03 03 00 7a 02 00 00  76 03 03 00 00 00 00 00  |....z...v.......|
 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 5f 15 2e 86  |........... _...|
-00000030  86 2c 2e 2f 82 11 3c d2  9f 00 32 d4 3d 05 04 fa  |.,./..<...2.=...|
-00000040  36 41 8d dc 30 ce a6 2b  6e d4 3c 9c 13 01 00 00  |6A..0..+n.<.....|
+00000020  00 00 00 00 00 00 00 00  00 00 00 20 ce 77 9a 79  |........... .w.y|
+00000030  98 24 bc 15 be ac 30 fe  66 35 ab 51 be bd b4 fa  |.$....0.f5.Q....|
+00000040  6f 53 1f e9 5f 54 58 75  ce 94 f9 47 13 01 00 00  |oS.._TXu...G....|
 00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 2f  |..+.....3.$... /|
 00000060  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
 00000070  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74 14  |.........._X.;t.|
-00000080  03 03 00 01 01 17 03 03  00 17 14 12 e8 30 75 5a  |.............0uZ|
-00000090  a4 27 7d 83 2e 51 0e 48  14 7b 53 0c 65 24 71 c5  |.'}..Q.H.{S.e$q.|
-000000a0  44 17 03 03 00 3e 34 38  ac c0 b5 05 e1 03 e1 a3  |D....>48........|
-000000b0  d3 42 ec e3 94 96 e7 a3  05 d8 44 ca 1d 89 b6 6f  |.B........D....o|
-000000c0  52 ce 3c 7d 61 f1 b4 a2  83 31 ab cf e7 ca 53 57  |R.<}a....1....SW|
-000000d0  b8 eb f4 7a 8a 7c ce 31  fe a4 b6 c7 a5 ed f2 2d  |...z.|.1.......-|
-000000e0  da 36 d6 49 17 03 03 02  6d 2c b4 e1 f3 87 4e c7  |.6.I....m,....N.|
-000000f0  ab db ea fa 0d 31 20 f2  1e 63 1d 10 bd 61 98 a2  |.....1 ..c...a..|
-00000100  50 8d 12 0d c8 5c f8 e4  97 9c 5f f3 47 f4 60 a5  |P....\...._.G.`.|
-00000110  59 16 a2 27 06 94 80 93  af 1e 9d c0 9a 23 20 bf  |Y..'.........# .|
-00000120  a4 5a 26 2c 37 86 d8 8a  b7 e2 bd e2 4f ab 53 65  |.Z&,7.......O.Se|
-00000130  bd 34 2c 1a 88 72 bf 8f  20 0c e2 51 0f ea 3f 47  |.4,..r.. ..Q..?G|
-00000140  dc 0e cd 21 3c d0 cc 7d  38 b8 b9 1b 20 67 83 a9  |...!<..}8... g..|
-00000150  af 4c f7 7b c0 d9 00 5c  66 e3 d7 2e 3b 6a b5 9c  |.L.{...\f...;j..|
-00000160  6e f6 ed 96 25 3c ce ea  db fa 85 ba e2 d8 4c 95  |n...%<........L.|
-00000170  92 06 0a 38 19 7f 52 30  2b ef fc 23 c6 b3 e5 d1  |...8..R0+..#....|
-00000180  83 2e 56 65 d6 ef 06 3a  71 d6 39 e9 16 62 65 78  |..Ve...:q.9..bex|
-00000190  59 c1 9f 7f 99 be c2 b9  0b 56 0a db 26 ec 16 15  |Y........V..&...|
-000001a0  be 27 cb bb cf 4a 9c a1  fd 5c 7d 5d c6 df a2 ed  |.'...J...\}]....|
-000001b0  f1 70 74 03 40 7c 8f af  ea 3c 6a c7 c6 30 98 4c  |.pt.@|...<j..0.L|
-000001c0  5a c1 e5 33 fb 56 8f 02  df 22 01 7b 11 f7 8a 5f  |Z..3.V...".{..._|
-000001d0  70 75 39 96 f9 1f 1b c9  d4 64 d8 8c a2 04 33 fd  |pu9......d....3.|
-000001e0  5e 07 37 30 12 2a 91 21  6f 83 23 95 2b 5a 72 13  |^.70.*.!o.#.+Zr.|
-000001f0  5a 0d 4a 05 57 c9 dd fc  77 ff 74 b1 5d 14 25 70  |Z.J.W...w.t.].%p|
-00000200  ee 8e 93 1b bc d3 3c d9  ba 3f 8a f0 79 45 a2 c6  |......<..?..yE..|
-00000210  23 f2 7d dc 21 4f cd 01  a5 4a 2c 46 96 21 5c 15  |#.}.!O...J,F.!\.|
-00000220  30 eb 1d 44 0f e7 fc 45  6b d5 e6 33 f5 88 71 53  |0..D...Ek..3..qS|
-00000230  96 2a c1 c7 61 cb 1d 6a  95 8d ee 64 8a 58 1c a6  |.*..a..j...d.X..|
-00000240  6a c9 75 86 6a f0 d2 4c  f0 1c 6d 36 18 fd 6b d8  |j.u.j..L..m6..k.|
-00000250  da 3d d0 0f 7b d3 33 f8  30 c9 f2 1a c2 1d 55 3d  |.=..{.3.0.....U=|
-00000260  2d 71 15 6d 26 f7 ad 05  23 de b0 50 83 f5 c0 39  |-q.m&...#..P...9|
-00000270  09 62 73 d6 c2 b9 53 c9  85 ff b9 ff 60 23 5c 06  |.bs...S.....`#\.|
-00000280  f9 87 e3 25 28 cf 75 9d  58 26 76 9e 55 91 71 aa  |...%(.u.X&v.U.q.|
-00000290  92 ea 3c 97 d4 43 4b d8  b8 5f 8a fc 4b a4 ad a0  |..<..CK.._..K...|
-000002a0  aa 5b 91 b6 8d 5d 84 19  40 13 93 5a 33 a9 fd 65  |.[...]..@..Z3..e|
-000002b0  86 ca b3 fe be e7 ef 75  a5 b2 35 8d 6f cb ed 27  |.......u..5.o..'|
-000002c0  17 2e 72 f8 46 60 f1 90  79 46 30 6b 42 31 09 4b  |..r.F`..yF0kB1.K|
-000002d0  fa a4 9b 69 4c 86 0c 9f  e4 6b 13 08 c4 9c 81 a3  |...iL....k......|
-000002e0  f3 74 99 1f d7 c1 d6 7c  12 25 25 92 3a 05 33 eb  |.t.....|.%%.:.3.|
-000002f0  3b be 38 f3 07 1d 3b 9d  a9 1b cc bc 37 2d 41 1d  |;.8...;.....7-A.|
-00000300  61 c6 ac b7 30 30 78 df  b4 be f6 1d d6 e5 c8 af  |a...00x.........|
-00000310  42 9b a7 b3 9c 4c 70 2c  23 e8 d5 8b 14 e0 21 d1  |B....Lp,#.....!.|
-00000320  66 af 2a 3a b4 f0 fa 44  88 2e 05 7a 2a 36 b2 21  |f.*:...D...z*6.!|
-00000330  27 5f a7 ff 3a cf dc 63  9e bd 81 d1 30 06 4b da  |'_..:..c....0.K.|
-00000340  ed f5 3f 1e 69 83 9b e2  7c 58 26 fa de d9 49 8c  |..?.i...|X&...I.|
-00000350  96 35 d0 37 63 08 17 03  03 00 99 4b 17 f2 3b bc  |.5.7c......K..;.|
-00000360  f3 b5 e2 0a da dd 4f 17  49 78 51 9b 58 b1 5c 79  |......O.IxQ.X.\y|
-00000370  d7 bd ac ee b9 25 24 9e  3d 28 37 ea 81 3c 98 ac  |.....%$.=(7..<..|
-00000380  c6 bd a8 e2 8a b4 f7 15  a3 07 b0 2c 09 de 62 4d  |...........,..bM|
-00000390  be 09 6e 3c 4f 7d c2 0e  35 d7 22 39 0e 8b 0a 99  |..n<O}..5."9....|
-000003a0  c8 60 21 cf bd 41 57 da  69 47 fe 6e 15 22 90 a7  |.`!..AW.iG.n."..|
-000003b0  34 51 64 d2 3a b6 8e 6e  28 a6 e3 42 1e 45 d9 9a  |4Qd.:..n(..B.E..|
-000003c0  95 71 82 a8 18 2b 13 93  ed 8f dd 74 8e 20 6e c7  |.q...+.....t. n.|
-000003d0  09 35 94 92 6b 98 9c c8  2c 03 30 16 67 f1 ee 4d  |.5..k...,.0.g..M|
-000003e0  26 7c be ae 38 83 e3 b9  e4 60 cc e3 6b 3f 8e ad  |&|..8....`..k?..|
-000003f0  63 90 c5 25 17 03 03 00  35 d9 2b cb 6f 6c 5b ac  |c..%....5.+.ol[.|
-00000400  01 e1 c6 f8 5e 70 62 56  03 a9 a4 19 c4 55 d2 d5  |....^pbV.....U..|
-00000410  96 1f 48 85 13 24 57 f1  34 4c 4e 79 03 ec 84 c2  |..H..$W.4LNy....|
-00000420  ce c6 83 3c 71 1d 93 6d  d7 e3 7a e0 4a 11        |...<q..m..z.J.|
+00000080  03 03 00 01 01 17 03 03  00 17 d0 8f 0a 7e 6c 33  |.............~l3|
+00000090  0b be 2a 24 0e fc af df  6e 7d ad 22 28 82 77 60  |..*$....n}."(.w`|
+000000a0  3d 17 03 03 00 3e 8f 87  8f f1 5a f6 6f eb eb d9  |=....>....Z.o...|
+000000b0  da aa fc 3c 6d ac 73 94  a3 13 5f fe 01 bb 75 eb  |...<m.s..._...u.|
+000000c0  ce d5 75 68 39 3c 0b 3c  5d ab 3f dc eb 6d 30 79  |..uh9<.<].?..m0y|
+000000d0  25 35 a8 2b 72 57 e4 9f  6f 4a 1e 03 74 eb 04 f9  |%5.+rW..oJ..t...|
+000000e0  c4 4f c1 46 17 03 03 02  6d 50 d5 4a 67 1e a7 43  |.O.F....mP.Jg..C|
+000000f0  50 f5 b9 55 8d 57 a3 0e  e4 b0 ae 6c 5b ca f9 d7  |P..U.W.....l[...|
+00000100  f7 22 34 92 72 76 a4 5b  c4 c7 0a 75 cc 97 0c 03  |."4.rv.[...u....|
+00000110  37 25 04 65 a6 fc da a8  fb 8c ef f1 25 d6 4b f6  |7%.e........%.K.|
+00000120  ed d5 80 2b 10 b2 0b 31  f5 33 d7 df a7 9b c7 6e  |...+...1.3.....n|
+00000130  52 f6 ed ac e0 20 1e f2  93 11 b7 bd b0 0d 5e 41  |R.... ........^A|
+00000140  be e4 b5 e4 a1 6d 21 45  27 1d 5e 65 fe 2c e9 f4  |.....m!E'.^e.,..|
+00000150  97 5c 45 5b 23 5a 8c dc  29 64 61 28 48 cf ae 3f  |.\E[#Z..)da(H..?|
+00000160  2c 21 b1 68 9e 09 74 76  77 65 f4 85 07 dc f3 0e  |,!.h..tvwe......|
+00000170  27 97 4d 60 47 35 31 13  92 15 90 f4 ca 24 84 6e  |'.M`G51......$.n|
+00000180  da 91 13 a3 37 54 4e 52  d4 9c 2f 82 6e 76 fd d7  |....7TNR../.nv..|
+00000190  81 29 fa 76 ac be 32 04  0d 7e d0 09 b0 47 ff 6d  |.).v..2..~...G.m|
+000001a0  37 32 6d 2c 8e d3 06 94  da 3f 20 87 56 f8 4a 2f  |72m,.....? .V.J/|
+000001b0  d6 75 4d 90 5c c1 e5 f6  82 c4 3c d9 da a2 95 0a  |.uM.\.....<.....|
+000001c0  4c 36 59 a9 10 50 a0 0d  61 06 4f 65 6e 64 bb 29  |L6Y..P..a.Oend.)|
+000001d0  42 9f 62 81 65 54 22 cb  4c a5 95 1b 2a 49 18 2f  |B.b.eT".L...*I./|
+000001e0  fc 54 b4 38 27 3f cf ab  b0 97 3e 17 8b ae 98 a0  |.T.8'?....>.....|
+000001f0  50 76 d6 79 39 e8 25 bc  3b d9 5a a4 a8 5e 08 6a  |Pv.y9.%.;.Z..^.j|
+00000200  1c 48 b1 11 f0 d9 b9 48  39 e1 23 db 41 8c bf bd  |.H.....H9.#.A...|
+00000210  20 27 7b 0c 89 10 1f b0  ae 70 18 9a 7f f2 b4 1d  | '{......p......|
+00000220  20 cd 6d 80 38 00 a4 33  de 22 ef f6 42 52 c7 66  | .m.8..3."..BR.f|
+00000230  83 4a 67 18 6b a6 38 27  d3 40 cf a2 a9 3e 58 06  |.Jg.k.8'.@...>X.|
+00000240  91 a7 36 08 29 10 4d 8f  1b f9 7c 5a 17 05 81 b9  |..6.).M...|Z....|
+00000250  4b 60 48 40 49 73 63 8a  ef 9f f2 9e 80 85 57 fa  |K`H@Isc.......W.|
+00000260  0a b8 72 83 f3 26 fa 07  ae d2 47 99 b5 a6 5d c5  |..r..&....G...].|
+00000270  1e b5 fc ea 0f 17 f8 ba  e2 5c 7d 59 70 53 2e 23  |.........\}YpS.#|
+00000280  f7 55 75 cb de 82 dc ca  b1 bf 3f 5f 7d 7d 92 3c  |.Uu.......?_}}.<|
+00000290  29 29 64 30 74 0a 01 0b  c0 95 db 45 fe 20 be 38  |))d0t......E. .8|
+000002a0  c5 87 b7 e4 a9 93 63 67  6b 9a 2f 24 9e 62 8f 1d  |......cgk./$.b..|
+000002b0  bd 8c 4a d4 b0 0f 95 2f  56 b2 1c e8 5a 58 81 2e  |..J..../V...ZX..|
+000002c0  b5 b5 b5 f2 1b 7f 6c 39  58 75 51 dc 83 2a 59 0b  |......l9XuQ..*Y.|
+000002d0  78 5e 22 7e af ee 59 af  b9 8f dc 65 97 af a5 b5  |x^"~..Y....e....|
+000002e0  b8 50 af 35 51 30 e7 0a  75 e2 d0 33 e2 fb f4 b1  |.P.5Q0..u..3....|
+000002f0  99 cd 5f 72 6b a9 f8 85  a1 a5 19 7e 2b 91 01 19  |.._rk......~+...|
+00000300  09 dd 88 6e a7 d6 54 57  cd ef d0 97 6a 68 d9 6e  |...n..TW....jh.n|
+00000310  52 38 ef a5 fa 84 63 70  f0 6d 64 ec 66 1a c9 b5  |R8....cp.md.f...|
+00000320  78 ba 17 74 f4 b4 2b a2  fe 9a 7f 38 b8 5e 8b 56  |x..t..+....8.^.V|
+00000330  a6 7b 2c 92 7f db 58 c8  fa f9 2d 6b 00 25 dc 0a  |.{,...X...-k.%..|
+00000340  aa 13 e8 40 f3 fd 47 23  f6 bf 1c 30 fc 91 18 95  |...@..G#...0....|
+00000350  ac a8 82 3d f5 ef 17 03  03 00 99 7e 30 4f f1 00  |...=.......~0O..|
+00000360  1e dd eb c6 54 d2 f5 f7  21 aa 6b b0 83 0c fa 8b  |....T...!.k.....|
+00000370  12 af ac 15 3e 54 b6 1c  85 9b 0c 80 02 d8 e3 5f  |....>T........._|
+00000380  36 57 64 fe 7a b8 31 d0  aa 59 f1 e6 af e0 27 c5  |6Wd.z.1..Y....'.|
+00000390  b8 d8 2f ab e0 cc c3 02  18 73 30 36 b5 2a 0d 12  |../......s06.*..|
+000003a0  a4 45 e6 c3 79 9f 54 cb  51 61 1a b8 aa 87 45 43  |.E..y.T.Qa....EC|
+000003b0  8e 93 58 66 f2 97 cb 3b  44 df ae 93 17 de 22 99  |..Xf...;D.....".|
+000003c0  3c b4 9d 21 a6 db 03 ce  7b fb 67 b9 6e fb ab 50  |<..!....{.g.n..P|
+000003d0  f8 33 9f 20 a0 fb e9 54  bb 62 16 19 d6 df 8c fe  |.3. ...T.b......|
+000003e0  3d 63 42 7c b0 72 2b 0d  87 1e f7 7d bb 59 ba f5  |=cB|.r+....}.Y..|
+000003f0  d6 e8 f3 57 17 03 03 00  35 9e 6f 39 92 2e 32 10  |...W....5.o9..2.|
+00000400  03 cd f0 28 2c 1a 32 77  19 c8 39 38 60 0c 28 b7  |...(,.2w..98`.(.|
+00000410  8c 3a d8 50 a1 44 e4 d6  c5 64 59 88 2d a4 23 c9  |.:.P.D...dY.-.#.|
+00000420  26 d1 96 0c c9 5d da 84  3e 8a 7d fe 80 77        |&....]..>.}..w|
 >>> Flow 3 (client to server)
-00000000  14 03 03 00 01 01 17 03  03 00 19 83 88 d2 c3 d4  |................|
-00000010  a8 98 6c 8f fa 1b 52 a5  83 58 e3 62 89 3e 22 a3  |..l...R..X.b.>".|
-00000020  37 b8 ee 13 17 03 03 00  35 b5 5f aa fd ca 85 74  |7.......5._....t|
-00000030  ee c6 06 d9 2e d8 4f 7d  87 a2 b7 20 80 a5 3b 97  |......O}... ..;.|
-00000040  41 bc 80 20 af b5 c4 66  26 2e 39 fd 81 e0 1a a0  |A.. ...f&.9.....|
-00000050  6f c3 08 d0 23 c2 27 49  91 58 77 15 2d 49        |o...#.'I.Xw.-I|
+00000000  14 03 03 00 01 01 17 03  03 00 19 87 49 99 a6 d9  |............I...|
+00000010  ed cd f7 7a 75 14 e1 26  41 d2 6e 5c 79 a6 be 7c  |...zu..&A.n\y..||
+00000020  5d 9d 44 36 17 03 03 00  35 1b 51 a9 b1 ce 11 ed  |].D6....5.Q.....|
+00000030  95 47 34 b9 3d 2f 6e 27  b2 e5 31 54 7f e3 8a 11  |.G4.=/n'..1T....|
+00000040  fd 54 75 2c b6 8a 56 25  00 29 a7 5f 7a 1e 16 be  |.Tu,..V%.)._z...|
+00000050  16 e3 86 3a 72 84 0e bc  40 ef fd ad 18 33        |...:r...@....3|
 >>> Flow 4 (server to client)
-00000000  17 03 03 00 93 10 f4 e9  f1 51 30 25 9e f0 c4 d2  |.........Q0%....|
-00000010  b8 f4 4b ad dd 89 ad ab  1a 39 88 44 98 a2 53 4e  |..K......9.D..SN|
-00000020  1c e9 bb 4a b7 c1 d8 cc  bc 76 e6 a8 e6 41 b9 42  |...J.....v...A.B|
-00000030  c8 7a 0a f4 35 73 cc 9f  9d 30 ff 4e e3 44 89 a5  |.z..5s...0.N.D..|
-00000040  d0 2b 88 36 0a 87 72 b4  bf 48 6a 4e 2e 03 1a 96  |.+.6..r..HjN....|
-00000050  1e 01 07 90 61 b0 f1 c5  58 e0 48 30 db d6 e9 5c  |....a...X.H0...\|
-00000060  88 05 0d 47 fc d1 33 6e  7e c4 fb 81 e3 80 ce 67  |...G..3n~......g|
-00000070  93 59 5e 68 39 6c b2 c3  c3 56 09 61 e5 a1 d6 d9  |.Y^h9l...V.a....|
-00000080  95 3a 70 6a 5c 4a 51 24  d9 e7 ed 88 7f 6c 32 0a  |.:pj\JQ$.....l2.|
-00000090  2d 5d 79 40 75 c9 b9 d4  17 03 03 00 1e 24 cc 07  |-]y@u........$..|
-000000a0  53 2b 27 c1 36 47 88 b8  3c 91 9e 8b 13 da 9d 3c  |S+'.6G..<......<|
-000000b0  f9 65 9d 78 ed 92 36 11  41 fe 42 17 03 03 00 13  |.e.x..6.A.B.....|
-000000c0  2b 52 80 d0 d5 39 77 77  38 ad e0 ad 78 f8 0a 59  |+R...9ww8...x..Y|
-000000d0  96 18 7e                                          |..~|
+00000000  17 03 03 00 8b 69 2e 81  c4 4d 43 a6 1f 96 b7 8e  |.....i...MC.....|
+00000010  87 4a 9b be 48 3c 31 18  98 f4 8c 04 24 b2 52 96  |.J..H<1.....$.R.|
+00000020  04 b5 12 7c 54 37 83 6d  51 42 c6 52 f4 a5 bc d3  |...|T7.mQB.R....|
+00000030  d1 c8 29 ab 4f e4 02 da  74 ec 8e 13 ad 03 f3 e0  |..).O...t.......|
+00000040  7f 44 58 6b c7 28 a5 6a  75 30 b8 b1 31 38 fe ba  |.DXk.(.ju0..18..|
+00000050  e7 27 ae b3 e7 cb 5e 78  24 82 03 61 ba ae dd 4c  |.'....^x$..a...L|
+00000060  c6 7b f3 45 cf 6f a8 dc  7d 5d 73 65 db ae dc 10  |.{.E.o..}]se....|
+00000070  ff 32 dc 4c b4 5e dc ce  4c 34 37 83 a0 0c d5 20  |.2.L.^..L47.... |
+00000080  f1 f6 81 42 bc 63 65 47  80 d0 d6 f3 08 aa e2 58  |...B.ceG.......X|
+00000090  17 03 03 00 1e 85 84 f3  e4 0f a8 24 c0 fe fa 2c  |...........$...,|
+000000a0  8b 60 52 32 73 2b 95 e9  37 3d 1c bd 2f ee ff e2  |.`R2s+..7=../...|
+000000b0  70 13 df 17 03 03 00 13  65 2b 11 5f 50 7c 11 eb  |p.......e+._P|..|
+000000c0  3b 06 75 23 28 13 ca 4a  b5 fb dc                 |;.u#(..J...|
diff --git a/src/crypto/tls/testdata/Server-TLSv13-ECDHE-ECDSA-AES b/src/crypto/tls/testdata/Server-TLSv13-ECDHE-ECDSA-AES
index 22909cc..d2ed2ee 100644
--- a/src/crypto/tls/testdata/Server-TLSv13-ECDHE-ECDSA-AES
+++ b/src/crypto/tls/testdata/Server-TLSv13-ECDHE-ECDSA-AES
@@ -1,94 +1,93 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 ca 01 00 00  c6 03 03 30 09 bc 8e d5  |...........0....|
-00000010  59 36 2b f3 2b 0f 9d 32  ff 23 ba c7 4a 1f 50 e6  |Y6+.+..2.#..J.P.|
-00000020  32 bd 0e c3 f6 df b7 70  dc d5 0c 20 44 0e b7 7b  |2......p... D..{|
-00000030  a0 37 9f 1d 8d 7e 93 f7  c0 7d 25 d3 f8 e5 65 50  |.7...~...}%...eP|
-00000040  79 5e 4f 53 e5 67 40 f0  bf ad 4d f8 00 04 13 01  |y^OS.g@...M.....|
+00000000  16 03 01 00 ca 01 00 00  c6 03 03 be 5b 8c 08 2b  |............[..+|
+00000010  26 a0 41 0f e3 4e b6 5c  9f 5d 53 04 67 4a 1d a2  |&.A..N.\.]S.gJ..|
+00000020  26 3b 83 ab b4 7b c6 ec  f8 a6 41 20 a6 de ad e2  |&;...{....A ....|
+00000030  0c fd 02 99 11 51 c6 be  e8 52 df 0b e2 b3 6f fe  |.....Q...R....o.|
+00000040  33 3e 2f 90 ac d2 e8 a2  53 8b d9 05 00 04 13 01  |3>/.....S.......|
 00000050  00 ff 01 00 00 79 00 0b  00 04 03 00 01 02 00 0a  |.....y..........|
 00000060  00 0c 00 0a 00 1d 00 17  00 1e 00 19 00 18 00 16  |................|
 00000070  00 00 00 17 00 00 00 0d  00 1e 00 1c 04 03 05 03  |................|
 00000080  06 03 08 07 08 08 08 09  08 0a 08 0b 08 04 08 05  |................|
 00000090  08 06 04 01 05 01 06 01  00 2b 00 03 02 03 04 00  |.........+......|
-000000a0  2d 00 02 01 01 00 33 00  26 00 24 00 1d 00 20 23  |-.....3.&.$... #|
-000000b0  23 ab 76 3d e8 d5 1b 9f  03 71 bc bf 3d 18 3a 86  |#.v=.....q..=.:.|
-000000c0  5d 59 ee ac b9 0a 2f f6  fc 5d 13 7b 3e 88 68     |]Y..../..].{>.h|
+000000a0  2d 00 02 01 01 00 33 00  26 00 24 00 1d 00 20 31  |-.....3.&.$... 1|
+000000b0  8e dd f4 7c cf 22 04 c1  c3 04 5c 24 49 db ae ab  |...|."....\$I...|
+000000c0  0a d0 42 e8 70 51 c7 4f  88 e2 4e 2e 0b 80 65     |..B.pQ.O..N...e|
 >>> Flow 2 (server to client)
 00000000  16 03 03 00 7a 02 00 00  76 03 03 00 00 00 00 00  |....z...v.......|
 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 44 0e b7 7b  |........... D..{|
-00000030  a0 37 9f 1d 8d 7e 93 f7  c0 7d 25 d3 f8 e5 65 50  |.7...~...}%...eP|
-00000040  79 5e 4f 53 e5 67 40 f0  bf ad 4d f8 13 01 00 00  |y^OS.g@...M.....|
+00000020  00 00 00 00 00 00 00 00  00 00 00 20 a6 de ad e2  |........... ....|
+00000030  0c fd 02 99 11 51 c6 be  e8 52 df 0b e2 b3 6f fe  |.....Q...R....o.|
+00000040  33 3e 2f 90 ac d2 e8 a2  53 8b d9 05 13 01 00 00  |3>/.....S.......|
 00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 2f  |..+.....3.$... /|
 00000060  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
 00000070  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74 14  |.........._X.;t.|
-00000080  03 03 00 01 01 17 03 03  00 17 2a db 0a 1b 36 73  |..........*...6s|
-00000090  de 3d 2f d9 c8 c0 2b 93  43 b3 a8 96 30 d2 bc 3d  |.=/...+.C...0..=|
-000000a0  f7 17 03 03 02 22 72 49  cc 6d 9e 7f f5 42 1c 8b  |....."rI.m...B..|
-000000b0  8a 0e 1b ad 71 f4 21 50  be ad 91 df e0 d4 a0 dc  |....q.!P........|
-000000c0  61 d2 eb 6a 39 f1 8d 31  66 9f 97 d9 b2 79 bf 10  |a..j9..1f....y..|
-000000d0  cc e1 2a 7f da 9f ff 10  22 a8 0b d6 26 c9 7c a4  |..*....."...&.|.|
-000000e0  51 8d a7 62 af 96 ec 01  72 7b 08 27 9f ff 1d a6  |Q..b....r{.'....|
-000000f0  26 54 6e 48 09 73 ac 7c  b2 bc a5 04 4e a2 41 66  |&TnH.s.|....N.Af|
-00000100  37 07 dd 7f 0d 8b 5b fa  84 a4 12 8b 44 9b b3 44  |7.....[.....D..D|
-00000110  71 bb 3a ce 95 8b a1 c5  e2 9f d2 86 0b 2b b2 43  |q.:..........+.C|
-00000120  aa 24 4c 69 0f c8 e8 7d  ff 53 2a 56 e8 dd 53 bf  |.$Li...}.S*V..S.|
-00000130  1b a7 fa 74 f2 c3 3d fa  11 b4 30 ce c0 9b 05 a5  |...t..=...0.....|
-00000140  13 b9 d1 1d a7 02 0a a6  36 31 b5 91 1f 5e 7f 65  |........61...^.e|
-00000150  24 48 3c ec fa d3 db 11  31 d1 c3 cd 47 b2 89 95  |$H<.....1...G...|
-00000160  80 55 25 1a 66 bf d9 ba  42 05 1d 20 b3 6e 09 bc  |.U%.f...B.. .n..|
-00000170  5f 1d 81 15 b2 54 c6 65  7e 75 35 e7 54 60 28 e1  |_....T.e~u5.T`(.|
-00000180  15 0e ee 51 09 3c c1 5b  ba 90 2e af 0a 85 40 0a  |...Q.<.[......@.|
-00000190  de 78 c8 c9 15 75 61 1f  75 a2 5c 80 d5 ed a5 71  |.x...ua.u.\....q|
-000001a0  a7 d8 21 f3 9c 84 f5 af  b1 5c 45 76 de a7 05 20  |..!......\Ev... |
-000001b0  7f c4 c4 71 b1 68 e0 a2  17 7f ac f8 c4 80 a8 89  |...q.h..........|
-000001c0  e8 35 68 ae 98 cf 2d 29  4e dc 84 45 21 d3 bb 0a  |.5h...-)N..E!...|
-000001d0  d8 c9 e1 41 48 b2 a8 53  31 5c 26 d0 28 9e 8e df  |...AH..S1\&.(...|
-000001e0  72 f2 ef f7 78 3d 7e b9  09 0c a4 e8 3e c5 a5 f6  |r...x=~.....>...|
-000001f0  e3 aa 32 1d da 98 7b 0a  f1 0a 42 f6 71 92 45 01  |..2...{...B.q.E.|
-00000200  e4 28 f3 c6 0f a2 cf c3  74 3b 09 f5 75 51 8e fa  |.(......t;..uQ..|
-00000210  6c 12 9e 80 2b 0a 87 fb  29 3d 0d a6 c4 7b c8 42  |l...+...)=...{.B|
-00000220  75 57 48 b3 78 20 2c b3  a1 d7 b7 6f 95 18 a2 bc  |uWH.x ,....o....|
-00000230  fd c9 22 d3 49 ae 5b 2a  ec b1 1a ff cd 38 3a bf  |..".I.[*.....8:.|
-00000240  45 e8 a8 fe 39 d5 f8 a2  89 73 7f 8f 2c 65 8a e6  |E...9....s..,e..|
-00000250  b7 20 f7 c9 5c 02 ea 33  4f f6 fc 68 2f d6 a0 d9  |. ..\..3O..h/...|
-00000260  73 10 38 35 ba d8 74 2d  cf 05 07 ee d4 fc 09 89  |s.85..t-........|
-00000270  0b 77 72 61 74 1f 16 8d  1f 29 3b 20 8d ef 99 b8  |.wrat....); ....|
-00000280  3d 80 24 5a 1d 32 9b 2e  50 4c 35 7e 4f c9 bc a7  |=.$Z.2..PL5~O...|
-00000290  6e ae 26 42 fb 4e c3 a8  7c 77 b4 c5 4c 1b 3a db  |n.&B.N..|w..L.:.|
-000002a0  cc 3f 44 fe ae d7 3f 42  5f ee 05 6a 1d 72 98 0e  |.?D...?B_..j.r..|
-000002b0  db 97 3c 11 06 c7 9e 5b  03 95 e0 52 09 54 39 b1  |..<....[...R.T9.|
-000002c0  13 19 f3 98 6c ed e3 ab  17 03 03 00 a3 49 60 43  |....l........I`C|
-000002d0  34 81 d3 6f fe c4 eb ac  49 64 51 9f 22 81 03 41  |4..o....IdQ."..A|
-000002e0  fd bc 4f 41 78 59 81 8a  82 b5 c3 06 79 8d d4 b2  |..OAxY......y...|
-000002f0  8b 9f 08 2b 09 ae 88 7d  bd 87 6a 40 19 b8 c7 1b  |...+...}..j@....|
-00000300  e1 55 69 8d 47 7a 49 66  fe 22 1f 95 c7 b5 15 ce  |.Ui.GzIf."......|
-00000310  6b d6 5b 37 45 57 72 ba  5f a3 62 49 13 80 b9 47  |k.[7EWr._.bI...G|
-00000320  9c e3 ce 6e a0 40 03 7d  41 4e 41 0d 21 ee e4 f6  |...n.@.}ANA.!...|
-00000330  71 74 12 48 1e d1 b2 80  82 b0 bf ff 07 61 04 82  |qt.H.........a..|
-00000340  db 4b 00 a1 11 97 48 1b  9b 13 b3 0e 5b 7f 99 f3  |.K....H.....[...|
-00000350  6f c1 a0 2f 41 d9 e2 30  f9 fa 0b 8a ef 6d d1 e1  |o../A..0.....m..|
-00000360  30 3d 07 5a 8a ef 8b a1  2b 44 c5 58 0d 3f 13 d7  |0=.Z....+D.X.?..|
-00000370  17 03 03 00 35 a2 fb e8  71 06 77 fa 70 66 75 01  |....5...q.w.pfu.|
-00000380  0a a0 d7 49 20 f0 8a f0  ea bf 79 20 68 46 02 43  |...I .....y hF.C|
-00000390  3c b9 cc c9 5f 1d c7 80  d8 58 f5 e3 94 6e 85 02  |<..._....X...n..|
-000003a0  c8 b2 4e a1 a2 43 b8 8d  ae 89 17 03 03 00 93 4a  |..N..C.........J|
-000003b0  dd 6b 37 b9 20 fa 51 b2  e2 60 a1 8e 08 40 bf c6  |.k7. .Q..`...@..|
-000003c0  25 22 9a 26 3a ec 35 aa  f2 26 9c bc 39 05 91 7b  |%".&:.5..&..9..{|
-000003d0  81 45 18 8d f7 f4 29 88  76 43 a8 63 e3 d3 59 d7  |.E....).vC.c..Y.|
-000003e0  2d 67 b3 4d 2f 6d c6 62  cf fd ac ed d6 80 04 57  |-g.M/m.b.......W|
-000003f0  b3 ac af 59 ce 35 43 94  1d 97 8c 2d 8d 89 b1 a7  |...Y.5C....-....|
-00000400  90 76 89 ec e4 0a 8f a9  9b 8d 22 02 8b 87 55 a4  |.v........"...U.|
-00000410  9b 55 da 85 a6 06 47 63  4c a2 1c 96 eb e1 77 35  |.U....GcL.....w5|
-00000420  71 0d 7e e5 78 ab 25 da  ee 5e ae 07 a9 ed 44 3a  |q.~.x.%..^....D:|
-00000430  75 ff 5c 4f 4e e5 01 27  7f 9e eb 63 db e2 85 70  |u.\ON..'...c...p|
-00000440  fc 99                                             |..|
+00000080  03 03 00 01 01 17 03 03  00 17 cc d0 60 a1 dc d6  |............`...|
+00000090  46 57 69 3d df 0e 0f 7f  a8 34 2d 87 71 84 16 54  |FWi=.....4-.q..T|
+000000a0  9d 17 03 03 02 22 cb 9c  f9 3e a0 fd bf 07 03 7c  |....."...>.....||
+000000b0  53 0c 15 22 0b 78 e5 02  36 e6 e7 6c 5b f9 aa 8d  |S..".x..6..l[...|
+000000c0  54 8e b1 15 d4 23 05 12  5e 6e 0f 0f 65 77 bf b5  |T....#..^n..ew..|
+000000d0  32 28 0e 32 ca 9f 61 c3  37 23 87 e8 ec 19 1d ba  |2(.2..a.7#......|
+000000e0  ef f5 18 eb ba 49 2d 86  a6 d1 f7 c1 9e 67 10 9f  |.....I-......g..|
+000000f0  a1 d2 62 bd 4c 6c 5e a4  41 f6 1e fa fd e7 55 bc  |..b.Ll^.A.....U.|
+00000100  16 ad 91 91 de 03 86 d7  e1 88 87 ab 0e f4 f5 bb  |................|
+00000110  16 da 37 bb a4 ce 4e 6c  5f 88 41 f9 a2 90 9a 2d  |..7...Nl_.A....-|
+00000120  5c 14 d5 01 28 06 a9 20  a4 ae 92 17 c5 95 b1 dc  |\...(.. ........|
+00000130  02 a8 3f 3b a7 97 91 5a  4f 56 bb db b6 30 0d 80  |..?;...ZOV...0..|
+00000140  35 ac 91 6f 4f ba 1e 10  c6 fc d2 ca 96 e4 9d 1f  |5..oO...........|
+00000150  2f 29 00 3a 11 b7 77 dd  d5 ed 76 9f 67 a1 b1 0c  |/).:..w...v.g...|
+00000160  5d 34 34 eb 42 49 23 15  49 12 24 24 73 be a9 65  |]44.BI#.I.$$s..e|
+00000170  99 b6 b4 3f 18 0c d1 32  26 eb 86 93 5c 0e e8 06  |...?...2&...\...|
+00000180  fb d7 9f 0e d9 26 14 47  b8 e5 67 8c c8 cb 0c 55  |.....&.G..g....U|
+00000190  61 70 a9 ce 0d 4e bf ca  40 9c e7 0d 2b 5d 54 b7  |ap...N..@...+]T.|
+000001a0  5a 64 50 e6 a1 c9 fc 47  7d e7 0a 13 36 8d 70 eb  |ZdP....G}...6.p.|
+000001b0  68 65 e4 9b 9d 12 d1 d9  0d 32 72 59 0f 46 b2 e2  |he.......2rY.F..|
+000001c0  21 ab 13 d4 ab f3 6e b6  44 16 b8 85 bb dc f4 f7  |!.....n.D.......|
+000001d0  d6 ce 5c 9f c0 4c 28 8f  36 39 ec 29 c7 33 bd ea  |..\..L(.69.).3..|
+000001e0  2d 10 16 84 50 c5 18 5b  2c a3 99 bb 3b 0b 70 66  |-...P..[,...;.pf|
+000001f0  72 9a 83 01 06 2a bf 4a  60 c5 5d 41 a1 f0 92 bb  |r....*.J`.]A....|
+00000200  3b 2a 1a 41 3a 57 c3 22  13 2c b4 7b 3e 47 52 ea  |;*.A:W.".,.{>GR.|
+00000210  79 8a bf ef 2e 2c f7 89  c7 36 5a df 38 c2 04 b6  |y....,...6Z.8...|
+00000220  6f 96 cd 7c 01 b3 e3 cd  4a 83 56 40 06 58 8a 7c  |o..|....J.V@.X.||
+00000230  8c 75 df b6 b8 76 63 71  89 72 0a 64 de 23 7d 50  |.u...vcq.r.d.#}P|
+00000240  77 a8 f6 a0 81 9d e9 ed  81 5e 20 c8 9f 65 3c 95  |w........^ ..e<.|
+00000250  cf ed 99 80 71 06 5e 00  46 0d 0c 22 b3 88 f0 c5  |....q.^.F.."....|
+00000260  33 3e 13 6b f2 07 9c db  20 31 9c 8d ea d7 73 e8  |3>.k.... 1....s.|
+00000270  00 e1 2b f4 c8 d7 34 37  4a 98 b9 4d 28 db 15 8a  |..+...47J..M(...|
+00000280  af 53 14 3b 02 54 a3 0b  5f 10 ff 5d 20 1c 19 ae  |.S.;.T.._..] ...|
+00000290  6b 8a 99 a5 8f e0 ac dd  c1 ba 1f 85 56 a3 94 bc  |k...........V...|
+000002a0  79 03 5f d5 dd e1 8e 62  b7 82 fa 92 c3 d5 8a fc  |y._....b........|
+000002b0  6b 17 24 d9 af db 3d 9c  0f 51 82 3d a2 ec 5f 9c  |k.$...=..Q.=.._.|
+000002c0  dc 69 a5 ce db d8 8b 87  17 03 03 00 a3 69 cd 7b  |.i...........i.{|
+000002d0  9f ac ad 72 11 b2 5d ee  19 63 d0 35 12 6d 5e 3f  |...r..]..c.5.m^?|
+000002e0  81 a8 18 4a d4 09 f3 80  38 4a 31 08 3e a0 4c 78  |...J....8J1.>.Lx|
+000002f0  48 08 e9 90 ba e7 2a b4  73 2e 2b 2b 15 60 ce 09  |H.....*.s.++.`..|
+00000300  7d df 49 31 e1 9d ff 92  1d b4 af 2e 8c f8 a6 2e  |}.I1............|
+00000310  93 d7 b9 10 69 10 7f 04  0d 8d e2 37 09 a7 d0 2a  |....i......7...*|
+00000320  ac ea 51 49 50 1d 1c 54  7f b9 15 ad 8c 77 ef 1d  |..QIP..T.....w..|
+00000330  a6 59 a3 bf b2 53 f7 6c  21 92 e0 36 c5 0d 61 94  |.Y...S.l!..6..a.|
+00000340  be 61 5e 77 25 35 df e4  5f 67 c1 c6 af 51 e4 ce  |.a^w%5.._g...Q..|
+00000350  c4 28 c5 4e bc f6 c6 ba  32 dc 8e c7 45 f3 4d a1  |.(.N....2...E.M.|
+00000360  70 53 98 46 8f 39 c2 cc  b7 fc f7 24 11 97 72 b3  |pS.F.9.....$..r.|
+00000370  17 03 03 00 35 76 be b6  7a 3f e3 08 7a a2 65 25  |....5v..z?..z.e%|
+00000380  fd 0b c3 87 be ba eb ca  cb 3d c1 25 10 e0 7b 00  |.........=.%..{.|
+00000390  37 7a 52 9e d6 b2 e7 ba  8e 51 de 15 c4 e8 16 eb  |7zR......Q......|
+000003a0  c6 21 92 42 b1 62 f4 ce  27 ba 17 03 03 00 8b 54  |.!.B.b..'......T|
+000003b0  03 de d7 a7 85 2f 4b 23  2d d5 3a b4 3d 3d f6 00  |...../K#-.:.==..|
+000003c0  ac ab bd 6f dd bf 9f 24  fb 1b d4 01 39 3e c0 87  |...o...$....9>..|
+000003d0  bb 32 ca f6 61 b2 ef 5d  9c 2c 1b a5 10 66 7b fd  |.2..a..].,...f{.|
+000003e0  4b d0 03 dc 53 a9 0d 5a  d5 c4 4c 25 9c 55 e6 f8  |K...S..Z..L%.U..|
+000003f0  d1 d8 49 dc 36 a1 92 ae  f1 3e 2f 11 66 87 93 69  |..I.6....>/.f..i|
+00000400  24 2e 5d 6c f6 79 15 68  a8 99 2e 1a 9c e2 85 4e  |$.]l.y.h.......N|
+00000410  5f d6 a8 3c 70 e1 67 cb  df b2 1b ab 2b ed dc b6  |_..<p.g.....+...|
+00000420  64 f4 bc 22 35 20 7f ff  64 b3 be d9 eb a1 ab 5d  |d.."5 ..d......]|
+00000430  d9 3b ae 30 46 76 70 48  04 43                    |.;.0FvpH.C|
 >>> Flow 3 (client to server)
-00000000  14 03 03 00 01 01 17 03  03 00 35 8c c8 26 94 66  |..........5..&.f|
-00000010  2e fd e0 4e bf b8 77 9d  12 d9 f6 9c 1b 15 c4 f1  |...N..w.........|
-00000020  39 f8 91 27 16 0c 34 ef  33 46 22 4e 19 d6 d0 d2  |9..'..4.3F"N....|
-00000030  ef 6b 57 91 f8 e4 17 fe  f9 ec f4 f1 ce c0 44 26  |.kW...........D&|
+00000000  14 03 03 00 01 01 17 03  03 00 35 46 8b fa 42 0d  |..........5F..B.|
+00000010  fa 3e 9e 80 76 12 ce 73  ae 85 67 ee af 1e 25 6e  |.>..v..s..g...%n|
+00000020  0b 46 4c bd 5a 46 8e 5c  27 7a 0a 8d d3 9c 3c 29  |.FL.ZF.\'z....<)|
+00000030  4c c8 08 78 ac 9f f4 7a  38 8d 49 6a 01 b6 f5 83  |L..x...z8.Ij....|
 >>> Flow 4 (server to client)
-00000000  17 03 03 00 1e ab 4d 1a  04 59 10 8b ef f9 b5 8a  |......M..Y......|
-00000010  62 34 91 4e f9 cd 93 8c  7a 6d be d6 72 42 ad 45  |b4.N....zm..rB.E|
-00000020  21 f5 4e 17 03 03 00 13  1e bf bd 27 1a ad ab 1f  |!.N........'....|
-00000030  32 f5 99 95 dc 34 e3 eb  9c c1 1c                 |2....4.....|
+00000000  17 03 03 00 1e c2 1a dc  0a cb 9a 11 f7 a1 c2 1f  |................|
+00000010  54 7d 32 6f 0e 13 b6 6b  9f e1 c6 14 63 fc 18 b9  |T}2o...k....c...|
+00000020  81 53 44 17 03 03 00 13  c9 72 ae 5e 2b c1 6f 64  |.SD......r.^+.od|
+00000030  e0 70 47 15 b1 ec c3 25  00 7f 4e                 |.pG....%..N|
diff --git a/src/crypto/tls/testdata/Server-TLSv13-Ed25519 b/src/crypto/tls/testdata/Server-TLSv13-Ed25519
index a94597a..dea3675 100644
--- a/src/crypto/tls/testdata/Server-TLSv13-Ed25519
+++ b/src/crypto/tls/testdata/Server-TLSv13-Ed25519
@@ -1,76 +1,75 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 ca 01 00 00  c6 03 03 a1 5b 14 56 ac  |............[.V.|
-00000010  3f 2b b0 8e e9 0b ae 7e  f7 3b 3b 20 90 b6 e4 06  |?+.....~.;; ....|
-00000020  c2 b9 71 88 e4 4c 01 28  41 b3 e8 20 49 01 f7 fc  |..q..L.(A.. I...|
-00000030  ce 52 3e f4 58 60 56 7d  36 21 ba 23 87 21 f7 36  |.R>.X`V}6!.#.!.6|
-00000040  48 88 22 78 26 37 27 a4  fc 7a 8b ea 00 04 13 03  |H."x&7'..z......|
+00000000  16 03 01 00 ca 01 00 00  c6 03 03 08 d3 0c d5 aa  |................|
+00000010  d7 b1 55 99 bc fa a7 17  09 ed 93 47 96 44 70 28  |..U........G.Dp(|
+00000020  03 b7 c6 40 ee 98 fe 30  83 86 ea 20 d0 89 76 54  |...@...0... ..vT|
+00000030  87 71 b7 9c b7 fd f2 19  15 5f 3b 39 c9 ad 6b 97  |.q......._;9..k.|
+00000040  89 6e c4 69 cc 83 b1 f0  e7 94 68 85 00 04 13 03  |.n.i......h.....|
 00000050  00 ff 01 00 00 79 00 0b  00 04 03 00 01 02 00 0a  |.....y..........|
 00000060  00 0c 00 0a 00 1d 00 17  00 1e 00 19 00 18 00 16  |................|
 00000070  00 00 00 17 00 00 00 0d  00 1e 00 1c 04 03 05 03  |................|
 00000080  06 03 08 07 08 08 08 09  08 0a 08 0b 08 04 08 05  |................|
 00000090  08 06 04 01 05 01 06 01  00 2b 00 03 02 03 04 00  |.........+......|
-000000a0  2d 00 02 01 01 00 33 00  26 00 24 00 1d 00 20 f4  |-.....3.&.$... .|
-000000b0  2c db e8 c0 9e 7d 52 f6  fa 33 fe f7 9a 66 ca 5f  |,....}R..3...f._|
-000000c0  a3 28 e9 80 21 28 b8 ef  e9 9f 1e 26 9c cf 0f     |.(..!(.....&...|
+000000a0  2d 00 02 01 01 00 33 00  26 00 24 00 1d 00 20 d8  |-.....3.&.$... .|
+000000b0  dc 54 00 21 d1 f5 6e 1b  fc a4 44 4e eb 97 4d 0f  |.T.!..n...DN..M.|
+000000c0  4a 5c ab 4c 27 72 23 69  72 7e 37 e8 bf 69 15     |J\.L'r#ir~7..i.|
 >>> Flow 2 (server to client)
 00000000  16 03 03 00 7a 02 00 00  76 03 03 00 00 00 00 00  |....z...v.......|
 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 49 01 f7 fc  |........... I...|
-00000030  ce 52 3e f4 58 60 56 7d  36 21 ba 23 87 21 f7 36  |.R>.X`V}6!.#.!.6|
-00000040  48 88 22 78 26 37 27 a4  fc 7a 8b ea 13 03 00 00  |H."x&7'..z......|
+00000020  00 00 00 00 00 00 00 00  00 00 00 20 d0 89 76 54  |........... ..vT|
+00000030  87 71 b7 9c b7 fd f2 19  15 5f 3b 39 c9 ad 6b 97  |.q......._;9..k.|
+00000040  89 6e c4 69 cc 83 b1 f0  e7 94 68 85 13 03 00 00  |.n.i......h.....|
 00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 2f  |..+.....3.$... /|
 00000060  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
 00000070  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74 14  |.........._X.;t.|
-00000080  03 03 00 01 01 17 03 03  00 17 f9 df 7b 4f f9 a1  |............{O..|
-00000090  f7 78 eb 10 59 5c 4f ed  42 09 08 10 0f c7 a4 81  |.x..Y\O.B.......|
-000000a0  8b 17 03 03 01 50 38 d7  96 35 05 7d 3d 3a 60 02  |.....P8..5.}=:`.|
-000000b0  bf 93 37 f2 60 3e 64 cb  1a 6f 9c 69 af 06 ca 70  |..7.`>d..o.i...p|
-000000c0  94 e2 d1 7f 4a 5d c7 57  0e 11 c7 4e 24 c6 ba 57  |....J].W...N$..W|
-000000d0  9f d7 67 3a 0a 8b 93 08  d4 de c5 be 62 79 61 2a  |..g:........bya*|
-000000e0  3d 4e 57 f9 98 e5 4f 5e  5a 74 52 5b a4 d0 07 ae  |=NW...O^ZtR[....|
-000000f0  8c 2a cb 50 dd b3 76 ab  3a 61 5b 55 83 8e 37 8d  |.*.P..v.:a[U..7.|
-00000100  39 e5 4f 58 7e 7a bc 80  26 f6 0f 47 8f 11 55 77  |9.OX~z..&..G..Uw|
-00000110  24 b1 a7 06 d8 d2 30 82  0d 99 39 04 5f 97 d8 1d  |$.....0...9._...|
-00000120  99 67 99 89 f0 ee 4f 18  8b 49 24 d3 6a d0 65 c9  |.g....O..I$.j.e.|
-00000130  01 a2 48 54 8b d2 bb 56  d4 0a 73 62 88 fa 70 4e  |..HT...V..sb..pN|
-00000140  7f dd 59 5b 14 7b 28 02  07 75 01 4d 41 ab 1d 7e  |..Y[.{(..u.MA..~|
-00000150  ef 24 42 ee 85 7f fa 5f  9e f0 9f f2 7f 92 00 52  |.$B...._.......R|
-00000160  ca 73 8a 73 c6 d7 13 f5  9d 31 6f 76 75 db e7 53  |.s.s.....1ovu..S|
-00000170  4d 44 40 8f 47 be bd 0e  71 13 d0 f7 f2 72 67 3a  |MD@.G...q....rg:|
-00000180  de b8 da b0 1d 84 85 d0  c2 c4 8d 16 87 68 c7 98  |.............h..|
-00000190  40 0a 92 c8 fb 8a 3a e4  7b 34 43 47 b7 4f 28 8e  |@.....:.{4CG.O(.|
-000001a0  11 01 98 88 b6 cd ca aa  d4 dc 52 5d f9 cf 55 bb  |..........R]..U.|
-000001b0  f3 13 f2 ce dc 67 74 a7  4d 5e 65 6f 18 cd 82 4e  |.....gt.M^eo...N|
-000001c0  fc 80 2c 14 17 99 08 6d  59 b3 3f 38 00 52 a2 a3  |..,....mY.?8.R..|
-000001d0  c1 98 84 15 91 82 3f e9  47 82 12 a0 94 dc 19 9e  |......?.G.......|
-000001e0  2e b7 25 79 30 b9 81 d6  9f 33 8e 49 80 7a 4c a2  |..%y0....3.I.zL.|
-000001f0  b7 9a e6 17 2c 06 17 03  03 00 59 97 c7 4b ac c3  |....,.....Y..K..|
-00000200  ed b3 bd 82 7a c2 45 a0  18 70 7b 88 fe 8b fd 6b  |....z.E..p{....k|
-00000210  83 f2 dd 77 15 74 9c f0  a6 27 22 bf ee 25 53 07  |...w.t...'"..%S.|
-00000220  81 95 3c 91 b3 89 3c ca  f9 5b c7 cf bb 32 55 f8  |..<...<..[...2U.|
-00000230  3c 76 70 f6 11 ca 5d 92  aa 78 9e 8a 2f ab e0 6f  |<vp...]..x../..o|
-00000240  c0 94 df 24 59 05 83 1a  28 c9 23 c8 e9 92 e1 bf  |...$Y...(.#.....|
-00000250  9c 90 99 07 17 03 03 00  35 4c 01 d0 d9 5f b3 6a  |........5L..._.j|
-00000260  a3 50 58 45 99 82 f4 a5  52 73 9e 7d 54 62 88 b1  |.PXE....Rs.}Tb..|
-00000270  2a 11 56 be be 57 9c 34  77 88 ab ca a6 48 c8 47  |*.V..W.4w....H.G|
-00000280  a8 25 ff 84 c6 e7 49 4e  9a dd 6f 7f 2c 4f 17 03  |.%....IN..o.,O..|
-00000290  03 00 93 72 a7 27 87 ee  0d f2 27 49 d1 8a 3f 9a  |...r.'....'I..?.|
-000002a0  4b 8c 67 72 58 b0 cf 11  24 72 44 6e e1 53 06 1f  |K.grX...$rDn.S..|
-000002b0  6a 70 ce c8 46 40 ca a0  6c fd 09 1d b1 58 2a 8f  |jp..F@..l....X*.|
-000002c0  13 37 00 3d 02 c0 a8 e2  bc 77 39 83 43 f5 c1 c5  |.7.=.....w9.C...|
-000002d0  d8 5f 32 0a 16 b1 25 4b  74 b8 b8 09 d8 c8 dd 7e  |._2...%Kt......~|
-000002e0  c7 6e 03 16 93 f2 1e a2  14 e1 ee 14 ec 8d 59 4f  |.n............YO|
-000002f0  f4 b5 50 f0 68 d3 06 ea  22 78 94 18 52 e7 3d 98  |..P.h..."x..R.=.|
-00000300  41 8c 5a bb d0 08 f7 b1  16 91 ce c9 73 41 24 e0  |A.Z.........sA$.|
-00000310  6d ea 7b e5 3f 98 9c d7  3f 91 2c 51 5a 9f ab 82  |m.{.?...?.,QZ...|
-00000320  4a f7 b7 39 f1 b5                                 |J..9..|
+00000080  03 03 00 01 01 17 03 03  00 17 6a 47 be 2b 06 13  |..........jG.+..|
+00000090  cf 8b 2f c5 ee d5 b0 5b  c1 47 9a b2 5e a2 0d c5  |../....[.G..^...|
+000000a0  41 17 03 03 01 50 c0 1e  e0 f5 55 6e 92 52 99 d8  |A....P....Un.R..|
+000000b0  62 06 9a 59 c7 b0 d7 5e  c9 6d 76 a6 7a c9 55 fe  |b..Y...^.mv.z.U.|
+000000c0  83 d5 84 fc 3c f0 02 fe  0f f8 b4 2e a0 45 29 cd  |....<........E).|
+000000d0  37 ea 9d 2e 75 c4 06 1e  58 5f 21 31 4b 8c 5e 91  |7...u...X_!1K.^.|
+000000e0  83 c1 0d 2c 21 68 1b 05  85 d2 35 1c 36 ee 9c b2  |...,!h....5.6...|
+000000f0  14 52 49 d8 7f 59 80 9c  80 a3 d8 99 34 d4 5c 01  |.RI..Y......4.\.|
+00000100  03 6c 52 fe cf a0 0a 47  11 e8 45 7c 85 76 6e 6e  |.lR....G..E|.vnn|
+00000110  29 1f af b7 97 bb fd 52  bd 4d 0a 4d 53 04 db 01  |)......R.M.MS...|
+00000120  5c 63 da c6 5a 7c d4 d8  fb ab bf fb bd 6f 64 58  |\c..Z|.......odX|
+00000130  8b e4 91 48 16 20 06 ca  2a 1f 5e 1e 33 c3 e8 cb  |...H. ..*.^.3...|
+00000140  ab d6 98 25 a6 12 86 28  95 d4 0c 0d c7 1e e3 ba  |...%...(........|
+00000150  f5 78 f9 10 97 60 19 8c  43 90 f6 aa 4d df da 91  |.x...`..C...M...|
+00000160  89 63 f4 38 18 e6 70 42  66 be f2 ec d9 85 88 ad  |.c.8..pBf.......|
+00000170  59 c7 d1 57 3c 52 70 4a  d4 db c8 b4 2c 37 7b 61  |Y..W<RpJ....,7{a|
+00000180  a9 4f 6a 4f 4a 64 04 7a  61 2b 01 f3 eb f0 c9 6a  |.OjOJd.za+.....j|
+00000190  65 9f 67 e2 94 16 66 5f  4c 62 e8 17 38 18 17 0a  |e.g...f_Lb..8...|
+000001a0  e2 bc 75 cf 32 71 a2 ab  ae 2f 61 c9 a1 fa 59 1f  |..u.2q.../a...Y.|
+000001b0  3f 4e 67 4e 0e 44 22 8a  59 04 cb 8e b3 77 fa 3d  |?NgN.D".Y....w.=|
+000001c0  c9 60 90 73 91 f6 a6 91  33 88 0b eb 4f 0e 48 be  |.`.s....3...O.H.|
+000001d0  f7 6f 30 7f 17 4b d2 ec  6e 21 ec a6 24 9d f8 85  |.o0..K..n!..$...|
+000001e0  07 b2 b3 86 02 9f 27 b9  e5 26 c1 ae 54 1b d3 19  |......'..&..T...|
+000001f0  ea cc bb c0 d0 e5 17 03  03 00 59 e2 56 da fa 80  |..........Y.V...|
+00000200  90 07 f7 93 2e d9 16 e1  43 c6 bf 35 4c b2 1d 83  |........C..5L...|
+00000210  ca a3 03 b4 d5 e0 b6 bc  da b1 6f 91 a8 dc b5 a9  |..........o.....|
+00000220  1a 99 31 32 a8 61 d8 d2  2b 95 df 6f a3 64 6b 52  |..12.a..+..o.dkR|
+00000230  72 52 4f 7d f3 59 75 2f  36 4e 7f 91 59 50 69 95  |rRO}.Yu/6N..YPi.|
+00000240  70 51 d3 74 a9 a3 3f bd  9d 0c af 9a ec d3 a1 85  |pQ.t..?.........|
+00000250  38 24 8a 97 17 03 03 00  35 a9 9e 65 43 66 a2 22  |8$......5..eCf."|
+00000260  dc 0d f2 48 64 09 64 71  a8 e1 cb 2e b5 a1 f2 6a  |...Hd.dq.......j|
+00000270  d0 c9 fa 32 60 14 6a 74  3a 5e 77 67 5b 90 3d 69  |...2`.jt:^wg[.=i|
+00000280  2d 1c af e2 6d 9d 91 aa  d3 0d f9 33 a5 a5 17 03  |-...m......3....|
+00000290  03 00 8b 34 60 2b a5 83  76 9b 8d b9 3c 83 a1 8f  |...4`+..v...<...|
+000002a0  07 80 3c 47 11 3b 4a 98  ec ba 6a e9 f2 f9 44 f9  |..<G.;J...j...D.|
+000002b0  96 98 a5 23 c1 62 16 43  eb 8b 37 5d a0 87 7d 7c  |...#.b.C..7]..}||
+000002c0  13 07 67 e7 85 b3 da e3  99 58 db d6 6c 32 c4 a7  |..g......X..l2..|
+000002d0  60 f6 1c 7d a1 05 b5 97  9a cf 64 b3 28 09 00 b0  |`..}......d.(...|
+000002e0  af 3d 9f ce ac f5 c6 ac  01 d0 bb c0 30 d6 1a f6  |.=..........0...|
+000002f0  ec 70 d8 28 27 5a f0 24  c9 66 aa 56 59 64 7f f1  |.p.('Z.$.f.VYd..|
+00000300  b1 7c 66 2e 7d c4 01 08  47 da a3 99 98 8a b3 89  |.|f.}...G.......|
+00000310  4a 04 4b 84 ea 15 98 4e  fe 10 0f b9 27 0c        |J.K....N....'.|
 >>> Flow 3 (client to server)
-00000000  14 03 03 00 01 01 17 03  03 00 35 19 fa 19 c0 ce  |..........5.....|
-00000010  09 87 c2 06 69 56 2a 0a  a7 9c 79 76 03 1b 70 5e  |....iV*...yv..p^|
-00000020  56 2d d4 a1 09 e3 99 f7  a9 7a e5 ba 3e 17 8b b2  |V-.......z..>...|
-00000030  fe da 70 81 d9 30 83 27  b1 da 2e df da 94 75 72  |..p..0.'......ur|
+00000000  14 03 03 00 01 01 17 03  03 00 35 b0 21 d1 14 37  |..........5.!..7|
+00000010  3e 4f 3c 00 bf 99 4d da  f5 22 f8 ab d0 9b 0e 59  |>O<...M..".....Y|
+00000020  33 1c 21 44 53 cf c7 31  16 df 3f fb a7 e2 f6 32  |3.!DS..1..?....2|
+00000030  2c a6 c2 9f 35 d6 8a cc  0a 82 6c 46 c4 55 b1 a8  |,...5.....lF.U..|
 >>> Flow 4 (server to client)
-00000000  17 03 03 00 1e 83 53 ed  09 07 d3 87 ab 37 a2 08  |......S......7..|
-00000010  a8 50 66 87 97 54 04 38  4b a6 25 f8 ab 75 ac 39  |.Pf..T.8K.%..u.9|
-00000020  52 e2 8d 17 03 03 00 13  86 58 ef 44 c1 59 5e 2e  |R........X.D.Y^.|
-00000030  e4 2e df 93 6e 52 76 58  c1 9d 2a                 |....nRvX..*|
+00000000  17 03 03 00 1e 0a 98 f1  c8 c1 dd 02 e9 bd b4 99  |................|
+00000010  80 aa dd 14 1d 2a 73 e2  20 e3 55 14 f8 5b c8 b6  |.....*s. .U..[..|
+00000020  55 98 73 17 03 03 00 13  e6 93 11 04 c5 32 15 7d  |U.s..........2.}|
+00000030  44 db bd 6c 6d 84 60 90  11 0c 52                 |D..lm.`...R|
diff --git a/src/crypto/tls/testdata/Server-TLSv13-ExportKeyingMaterial b/src/crypto/tls/testdata/Server-TLSv13-ExportKeyingMaterial
index 8267ca0..0b4f8c0 100644
--- a/src/crypto/tls/testdata/Server-TLSv13-ExportKeyingMaterial
+++ b/src/crypto/tls/testdata/Server-TLSv13-ExportKeyingMaterial
@@ -1,99 +1,98 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 ce 01 00 00  ca 03 03 26 86 8d 61 97  |...........&..a.|
-00000010  6c da 93 d7 43 5c b3 0c  06 5c c2 cb e0 89 46 9f  |l...C\...\....F.|
-00000020  cc b0 a3 cf 41 3d cf 7a  9e 02 bc 20 a6 33 fe 0b  |....A=.z... .3..|
-00000030  90 24 8b ed 69 48 86 9b  d2 1a 5c 04 66 52 4f 5d  |.$..iH....\.fRO]|
-00000040  a4 24 6b d2 84 08 c0 48  a9 55 ef 0c 00 04 13 03  |.$k....H.U......|
+00000000  16 03 01 00 ce 01 00 00  ca 03 03 4b 42 c7 99 9e  |...........KB...|
+00000010  1a 3d 10 18 84 4b 27 8e  b7 49 cd 95 34 42 54 6e  |.=...K'..I..4BTn|
+00000020  fa 08 92 9b 43 f5 ca b4  57 44 2b 20 2d 75 50 cf  |....C...WD+ -uP.|
+00000030  7c f7 1a 45 b0 6d a0 d9  29 ee ac 2c 1f c9 b3 96  ||..E.m..)..,....|
+00000040  2f ad 77 69 fc 92 65 75  af 9f ab da 00 04 13 03  |/.wi..eu........|
 00000050  00 ff 01 00 00 7d 00 0b  00 04 03 00 01 02 00 0a  |.....}..........|
 00000060  00 0c 00 0a 00 1d 00 17  00 1e 00 19 00 18 00 23  |...............#|
 00000070  00 00 00 16 00 00 00 17  00 00 00 0d 00 1e 00 1c  |................|
 00000080  04 03 05 03 06 03 08 07  08 08 08 09 08 0a 08 0b  |................|
 00000090  08 04 08 05 08 06 04 01  05 01 06 01 00 2b 00 03  |.............+..|
 000000a0  02 03 04 00 2d 00 02 01  01 00 33 00 26 00 24 00  |....-.....3.&.$.|
-000000b0  1d 00 20 b9 ab 39 93 6b  9f aa 46 0a 61 c6 f8 58  |.. ..9.k..F.a..X|
-000000c0  45 26 16 6f b6 cb 42 52  e8 24 ab cc a4 2d b6 7a  |E&.o..BR.$...-.z|
-000000d0  a5 90 67                                          |..g|
+000000b0  1d 00 20 1c b6 f8 ed 5c  d6 4c 45 22 bb 99 6f e9  |.. ....\.LE"..o.|
+000000c0  f8 d8 78 d7 6f a3 28 4f  06 16 f9 18 64 6c 30 23  |..x.o.(O....dl0#|
+000000d0  8a a5 14                                          |...|
 >>> Flow 2 (server to client)
 00000000  16 03 03 00 7a 02 00 00  76 03 03 00 00 00 00 00  |....z...v.......|
 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 a6 33 fe 0b  |........... .3..|
-00000030  90 24 8b ed 69 48 86 9b  d2 1a 5c 04 66 52 4f 5d  |.$..iH....\.fRO]|
-00000040  a4 24 6b d2 84 08 c0 48  a9 55 ef 0c 13 03 00 00  |.$k....H.U......|
+00000020  00 00 00 00 00 00 00 00  00 00 00 20 2d 75 50 cf  |........... -uP.|
+00000030  7c f7 1a 45 b0 6d a0 d9  29 ee ac 2c 1f c9 b3 96  ||..E.m..)..,....|
+00000040  2f ad 77 69 fc 92 65 75  af 9f ab da 13 03 00 00  |/.wi..eu........|
 00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 2f  |..+.....3.$... /|
 00000060  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
 00000070  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74 14  |.........._X.;t.|
-00000080  03 03 00 01 01 17 03 03  00 17 e9 4c 8a ed 0c af  |...........L....|
-00000090  04 d2 18 14 38 48 c1 71  da 59 db 46 f4 00 0d 19  |....8H.q.Y.F....|
-000000a0  1e 17 03 03 02 6d e0 d2  7b bf 0a 51 48 a9 67 46  |.....m..{..QH.gF|
-000000b0  25 3b 07 e9 68 da 4d cf  47 31 0f 7d ad 4e 0d 6d  |%;..h.M.G1.}.N.m|
-000000c0  c3 ad 03 61 4a c0 ae 06  4d b7 84 29 1b 44 49 26  |...aJ...M..).DI&|
-000000d0  f4 99 fc 58 1e 5b f0 15  ee be 19 c3 b3 23 20 f0  |...X.[.......# .|
-000000e0  7a 10 e4 ab c8 00 f6 e4  93 d6 b3 2a fd 14 10 c9  |z..........*....|
-000000f0  72 b2 21 ba 93 50 08 4e  d2 1f 3f 64 68 73 3c c7  |r.!..P.N..?dhs<.|
-00000100  11 3c f5 84 61 b0 2c 84  42 0c ef a9 03 a2 74 aa  |.<..a.,.B.....t.|
-00000110  3b 07 e0 d5 f5 c4 d1 a8  8e f5 64 0e 52 41 b1 4d  |;.........d.RA.M|
-00000120  aa 43 0d f3 6b 0c 19 36  66 fe 4c 73 cd 52 03 2f  |.C..k..6f.Ls.R./|
-00000130  61 f1 9d 23 12 e2 b9 69  d9 48 92 07 1b 5d 6f 28  |a..#...i.H...]o(|
-00000140  e1 96 39 d8 59 19 9d 9c  bf 99 3a af 03 68 bd 34  |..9.Y.....:..h.4|
-00000150  38 04 9d 8c 9a bf 75 67  74 dd 9c eb 89 13 6d 55  |8.....ugt.....mU|
-00000160  b4 c4 17 11 05 54 d7 f9  d7 5a ed ec d5 15 31 5e  |.....T...Z....1^|
-00000170  2f ed 69 fa 99 23 57 e3  62 98 35 27 17 34 e1 c4  |/.i..#W.b.5'.4..|
-00000180  3c 95 3f 69 de 01 aa a9  66 55 4a 40 3a f1 4f 19  |<.?i....fUJ@:.O.|
-00000190  02 2f df 51 0c 69 ec 48  7a 60 f7 72 5e f6 f0 4d  |./.Q.i.Hz`.r^..M|
-000001a0  a1 b2 7a 06 df 69 a1 19  42 29 56 5c 67 99 3d 0e  |..z..i..B)V\g.=.|
-000001b0  5d da df 7b 93 8e 9a 26  6e 2e 09 c4 30 40 ad a9  |]..{...&n...0@..|
-000001c0  ee 4b bd 21 41 b6 cb fc  97 0f fc a2 cf 26 31 d6  |.K.!A........&1.|
-000001d0  d6 77 96 4e c6 a2 fd 5a  0e cb d5 31 a6 21 e8 76  |.w.N...Z...1.!.v|
-000001e0  a2 48 4d 43 d4 c9 18 b2  21 cc 13 13 84 f2 c2 cf  |.HMC....!.......|
-000001f0  60 8f 2e 36 39 8a a8 26  03 1d 51 24 b4 08 c5 5d  |`..69..&..Q$...]|
-00000200  96 b9 4a 46 02 41 1f 59  ea 47 a9 37 bc a0 c4 70  |..JF.A.Y.G.7...p|
-00000210  26 d6 8c 11 62 45 1d 92  5d ea 39 cd af af 13 38  |&...bE..].9....8|
-00000220  85 ca a8 74 1a 09 07 f2  7c d6 49 0d 2d ad 1c 9f  |...t....|.I.-...|
-00000230  db 8b 56 91 45 51 32 db  ca 9c f4 d2 72 09 8a fe  |..V.EQ2.....r...|
-00000240  98 9e a8 b5 b2 49 9c 0b  e9 3a 42 d0 53 e0 20 6c  |.....I...:B.S. l|
-00000250  e3 07 36 ef cc 85 56 fd  b4 6e ff d2 7c 96 52 27  |..6...V..n..|.R'|
-00000260  46 c9 3c b3 bf fb 16 0b  61 54 09 9c ac 3b 18 5f  |F.<.....aT...;._|
-00000270  5a 01 4b 25 67 22 ef 19  86 a3 3a 80 f0 12 f5 60  |Z.K%g"....:....`|
-00000280  4c 77 cf bd a9 e8 a1 19  d4 8c e1 a8 b2 b8 19 b8  |Lw..............|
-00000290  98 85 c3 da 1a b8 4d 6e  1f 35 73 28 32 3c a0 44  |......Mn.5s(2<.D|
-000002a0  c9 77 46 b8 c6 54 4d 80  67 72 58 c4 e3 0b f3 6c  |.wF..TM.grX....l|
-000002b0  43 eb e2 89 f1 30 cc 90  b4 e9 b8 ec e2 5f c1 31  |C....0......._.1|
-000002c0  a2 de 9d e9 fe 9c fe b0  83 b7 aa e9 2e 62 35 89  |.............b5.|
-000002d0  90 0d 36 79 8f 23 bb 7a  ae dc db db 1c c3 96 5d  |..6y.#.z.......]|
-000002e0  7c 06 e9 1c ee 82 58 46  7c 1b 90 9d cf 2d 31 54  ||.....XF|....-1T|
-000002f0  96 94 58 dc 95 26 85 c7  f4 c9 9c 2b 8a 2f ae b3  |..X..&.....+./..|
-00000300  70 10 bf f1 0e 66 ef f1  1c 66 da 6c 52 d8 6e aa  |p....f...f.lR.n.|
-00000310  3a 14 d8 17 03 03 00 99  69 45 ee c3 c9 b3 4d 9a  |:.......iE....M.|
-00000320  01 00 70 27 54 8c 12 bb  74 67 e8 88 07 ac 4e ab  |..p'T...tg....N.|
-00000330  b1 41 f4 65 ee 3b 06 87  79 5d 9b 1d 70 df 2f f7  |.A.e.;..y]..p./.|
-00000340  e0 88 45 2b a1 b9 ca 67  88 65 65 33 51 41 c0 b2  |..E+...g.ee3QA..|
-00000350  da 6a 7a 7c bf 42 58 8d  ae 7b 24 d0 8a f7 47 c0  |.jz|.BX..{$...G.|
-00000360  a9 45 da 24 82 03 a1 65  03 7c 3c 2a bf 48 e2 0d  |.E.$...e.|<*.H..|
-00000370  fa cc 3f 00 53 63 5d f9  b4 a1 00 d2 a7 3c 81 64  |..?.Sc]......<.d|
-00000380  8a d5 90 4f b9 58 2b 1e  1d a7 7e ad 3e 8f d4 4a  |...O.X+...~.>..J|
-00000390  7b 66 b7 4e 68 04 ac 66  24 6e 76 ed f4 5c aa 52  |{f.Nh..f$nv..\.R|
-000003a0  3d f8 f5 ea d0 0a 74 ba  39 da 21 e0 f1 03 80 cd  |=.....t.9.!.....|
-000003b0  5b 17 03 03 00 35 7b 1f  6e 37 6c 15 5b 1b f7 ea  |[....5{.n7l.[...|
-000003c0  bf 03 68 5f 15 1f e7 99  a8 64 f1 60 3d e0 b6 5e  |..h_.....d.`=..^|
-000003d0  c1 60 18 61 e5 ea dc ab  b5 d3 5f 10 1b 5c 3a 1b  |.`.a......_..\:.|
-000003e0  c5 fe a6 d3 fc 45 6b db  b1 27 60 17 03 03 00 93  |.....Ek..'`.....|
-000003f0  e3 f1 5f f1 18 a6 ab 67  88 e4 5a f9 fd 71 77 4b  |.._....g..Z..qwK|
-00000400  6c 0d 98 ef 71 72 2a aa  d2 0a 2d 72 ac 40 57 2d  |l...qr*...-r.@W-|
-00000410  73 ad 77 cd 01 19 19 be  e7 49 d4 6a aa 97 f9 40  |s.w......I.j...@|
-00000420  b1 85 cc bb 5c 57 1a 17  a8 48 65 d3 4d e9 a9 29  |....\W...He.M..)|
-00000430  4b 08 6b b3 33 2c 97 d0  89 0a 50 e2 66 06 c6 63  |K.k.3,....P.f..c|
-00000440  c3 6f 8d 5e ab a4 af 7a  6a 5e 25 8d 4a 17 ea aa  |.o.^...zj^%.J...|
-00000450  67 8a ad af c3 1e d6 47  db a5 b5 db 32 1b 83 f8  |g......G....2...|
-00000460  2d f9 bc 99 28 07 0d d0  fe 34 bf 52 ae 59 27 40  |-...(....4.R.Y'@|
-00000470  cd 0e 4d 4d 12 28 21 01  30 38 b1 c3 df 63 e9 9e  |..MM.(!.08...c..|
-00000480  34 91 84                                          |4..|
+00000080  03 03 00 01 01 17 03 03  00 17 1b 8e de 2f c7 92  |............./..|
+00000090  de 8e 8c fa 0c 7a e5 1f  ee 4c 4c d9 42 de 76 3d  |.....z...LL.B.v=|
+000000a0  2f 17 03 03 02 6d e9 b0  9a 48 a0 96 b9 52 a1 88  |/....m...H...R..|
+000000b0  e4 03 62 85 7d 6b 08 37  dc 50 13 7d aa 99 ba 73  |..b.}k.7.P.}...s|
+000000c0  38 08 e8 64 cd 37 a4 44  9d 86 e3 5e 24 df d9 da  |8..d.7.D...^$...|
+000000d0  0a 3b 97 9c 30 37 d9 99  0f a6 17 ef 5a e7 1b e9  |.;..07......Z...|
+000000e0  f6 5e c3 2b fc cc 8c 98  b9 7e 5f de bb 3c 19 9a  |.^.+.....~_..<..|
+000000f0  59 75 e4 5e db 06 64 28  8d 26 88 41 b3 c2 2e 7f  |Yu.^..d(.&.A....|
+00000100  fd 17 78 79 a0 ab 9a 48  7e 3d ef 78 c0 f1 9c 96  |..xy...H~=.x....|
+00000110  b2 21 b1 a8 18 d2 69 25  ad 51 8c 48 0f 66 28 a5  |.!....i%.Q.H.f(.|
+00000120  cf 76 16 c3 68 17 d9 33  f2 1f 5c 5f a1 19 08 e8  |.v..h..3..\_....|
+00000130  77 da d0 e0 c0 dc 4a 77  78 65 d1 3a 36 60 d9 0b  |w.....Jwxe.:6`..|
+00000140  e9 f8 5e 4f 41 32 71 c4  a9 6c ca 29 da 25 ad 35  |..^OA2q..l.).%.5|
+00000150  da 14 79 21 6d cb 57 b8  49 03 59 d4 d8 8b 76 71  |..y!m.W.I.Y...vq|
+00000160  11 9d 5f 03 62 52 01 bb  69 77 45 19 ee 5b 11 8f  |.._.bR..iwE..[..|
+00000170  75 65 49 e4 df cd 87 7c  ab c9 7d 0c 1c ed b0 08  |ueI....|..}.....|
+00000180  c7 ba 08 2d a7 26 75 80  1d 1d 0c 7f 01 15 6f 82  |...-.&u.......o.|
+00000190  bf 5a a3 84 cd ac 91 56  cb d2 17 78 a5 b0 22 bf  |.Z.....V...x..".|
+000001a0  d2 f3 1e 9f 8f f7 66 b7  a0 ec 28 f1 c5 b6 4e 24  |......f...(...N$|
+000001b0  63 46 88 d2 7a 84 11 8e  ce 5d ab 5f e7 81 7d a5  |cF..z....]._..}.|
+000001c0  2f df f3 a6 2d 1f d9 e1  01 80 53 cf 4f 2c be bc  |/...-.....S.O,..|
+000001d0  dd 68 cf fe c1 ce 15 ed  7d 59 e2 48 57 ac c6 73  |.h......}Y.HW..s|
+000001e0  b0 70 68 d1 a3 9a b0 f2  e2 07 2c ae 8a 5f 04 e9  |.ph.......,.._..|
+000001f0  f2 f7 d8 d4 63 92 7d a1  bd 8b 57 61 1f 13 48 7e  |....c.}...Wa..H~|
+00000200  8a a2 5d 51 a8 fb 0a a7  02 73 c7 33 4b 9e 28 d5  |..]Q.....s.3K.(.|
+00000210  ea dd a5 84 21 c4 ba 0b  77 2c 08 f1 30 ff 92 9b  |....!...w,..0...|
+00000220  8b c3 17 db 08 15 b3 f7  7b 01 8b 2c a8 e1 a7 f6  |........{..,....|
+00000230  a3 73 3d 5f 03 13 b8 e8  8c 19 a1 d6 7f fd f7 9f  |.s=_............|
+00000240  37 ee ce f5 70 26 d2 18  39 54 c4 4e 4e e6 08 5d  |7...p&..9T.NN..]|
+00000250  6b 7f cc b4 68 78 50 75  e2 f1 ec 73 93 a3 12 7f  |k...hxPu...s....|
+00000260  e5 1a ec 55 f4 85 d0 10  12 29 fd b0 e1 3e d5 d1  |...U.....)...>..|
+00000270  a6 d1 25 48 01 45 82 ec  83 e0 83 29 7b 46 c7 a9  |..%H.E.....){F..|
+00000280  5c ca bf e9 28 f1 76 ef  c5 72 5f 92 41 84 0e 64  |\...(.v..r_.A..d|
+00000290  af 6f f4 94 23 0a b5 2d  8b 56 66 a8 6b bb 4f a9  |.o..#..-.Vf.k.O.|
+000002a0  90 b6 d5 0a ab 76 7e 18  5c 3f 67 d5 7b c2 01 80  |.....v~.\?g.{...|
+000002b0  ce c8 8e d4 cd 86 0b 90  84 3a 68 82 f4 46 bc 72  |.........:h..F.r|
+000002c0  91 aa 92 46 e8 40 3e 40  21 c9 6a e5 d6 5a b2 01  |...F.@>@!.j..Z..|
+000002d0  d0 ef a7 f1 4e f6 e6 32  0c e1 07 19 cc fb 6e ff  |....N..2......n.|
+000002e0  f7 53 35 81 4d 09 75 fb  42 42 41 18 8f be cf 71  |.S5.M.u.BBA....q|
+000002f0  43 20 e0 23 b6 39 1c ab  52 6e 8e bf b2 d3 59 16  |C .#.9..Rn....Y.|
+00000300  a8 15 d6 b7 cc cd ed 28  5a 8e de 64 ae 85 f5 0d  |.......(Z..d....|
+00000310  7f 58 66 17 03 03 00 99  51 80 02 3d be 7a 45 b3  |.Xf.....Q..=.zE.|
+00000320  c3 f6 68 39 59 03 7b 2e  0c b3 22 f1 b3 6e a6 b2  |..h9Y.{..."..n..|
+00000330  64 f4 c6 77 7b 38 e0 94  97 2c 69 5b 29 63 e2 6b  |d..w{8...,i[)c.k|
+00000340  d5 d4 d0 b4 c1 45 04 4c  c4 19 6d 75 fd ef 3a 77  |.....E.L..mu..:w|
+00000350  f2 81 e4 8d 51 97 11 6b  6c ce b7 7a 11 fd 71 f7  |....Q..kl..z..q.|
+00000360  ee 67 c6 83 27 31 39 1f  d4 d1 be b8 c2 06 11 e3  |.g..'19.........|
+00000370  34 36 ff f3 c7 e6 1d b5  87 6b cf 12 56 2c e8 03  |46.......k..V,..|
+00000380  83 bf 03 f8 57 fd 54 c7  32 19 b1 ba fe e4 58 05  |....W.T.2.....X.|
+00000390  77 6f 48 f4 af 2f 99 dd  47 a5 1a 30 17 2f 1d 25  |woH../..G..0./.%|
+000003a0  80 8c d7 cd 33 b7 db d0  9d 58 4c 5d ef 14 2f 7a  |....3....XL]../z|
+000003b0  f2 17 03 03 00 35 04 7f  e7 0b a2 30 a0 93 c2 f7  |.....5.....0....|
+000003c0  84 64 be 47 37 b0 46 8d  78 1b 69 b8 40 90 db 57  |.d.G7.F.x.i.@..W|
+000003d0  f9 e5 4e fa ba a4 3c 3e  af db 67 18 2c 5f 32 77  |..N...<>..g.,_2w|
+000003e0  88 1e 30 85 b4 c0 46 c9  5c 85 ef 17 03 03 00 8b  |..0...F.\.......|
+000003f0  a6 13 6e 2a 9f 36 5e 06  de 8a f8 95 68 0a 05 2b  |..n*.6^.....h..+|
+00000400  e7 e7 fa 1b 2c 69 0c 30  75 a1 81 5a e6 e6 ab c5  |....,i.0u..Z....|
+00000410  22 b0 7d e1 ba 4f d7 75  89 88 23 35 be 36 9d 64  |".}..O.u..#5.6.d|
+00000420  3e 16 8d 5f 42 0f 6f 9a  78 8f 45 df 21 3e 4b 34  |>.._B.o.x.E.!>K4|
+00000430  6c ae ea c6 4a 71 0b d8  fd 70 f3 ac ce 68 3d f8  |l...Jq...p...h=.|
+00000440  62 d4 86 1e ac 3f ab 7d  36 83 80 4f c6 be 54 b7  |b....?.}6..O..T.|
+00000450  c1 1e bd 82 ea ad 42 9a  f0 c8 79 77 24 27 dd 24  |......B...yw$'.$|
+00000460  68 b0 ca 17 a6 a2 14 2e  1f 57 54 d1 79 94 99 d3  |h........WT.y...|
+00000470  96 68 db c2 19 14 ce 89  04 c2 b8                 |.h.........|
 >>> Flow 3 (client to server)
-00000000  14 03 03 00 01 01 17 03  03 00 35 1d d8 d0 a8 ec  |..........5.....|
-00000010  04 45 13 43 a1 72 38 4e  54 85 7a a2 17 dc eb 39  |.E.C.r8NT.z....9|
-00000020  36 7d 50 25 5f d3 0d 7f  c3 a7 75 93 e9 1e 17 0a  |6}P%_.....u.....|
-00000030  a3 d7 a8 74 23 98 5e 3a  3a 4c 2c d3 78 b4 04 48  |...t#.^::L,.x..H|
+00000000  14 03 03 00 01 01 17 03  03 00 35 96 8c 0d e9 39  |..........5....9|
+00000010  98 d4 ed 41 d5 fe f8 55  00 51 f0 71 6c 12 ed bd  |...A...U.Q.ql...|
+00000020  13 40 7d 4e 85 ef 8b 88  80 88 c3 fd 55 41 cb 7f  |.@}N........UA..|
+00000030  d7 96 04 3d f0 d5 26 c7  92 0a 64 bf 59 18 2a bd  |...=..&...d.Y.*.|
 >>> Flow 4 (server to client)
-00000000  17 03 03 00 1e 53 e2 0d  f2 62 e8 be 84 e0 33 1a  |.....S...b....3.|
-00000010  56 bc 45 f9 0b 69 63 72  03 f3 34 c6 72 d8 f9 c4  |V.E..icr..4.r...|
-00000020  ba 53 3d 17 03 03 00 13  11 b5 0d 7f d4 e7 51 90  |.S=...........Q.|
-00000030  39 be 2b d8 d6 7c e8 12  ea 61 83                 |9.+..|...a.|
+00000000  17 03 03 00 1e 90 ae 0a  4e 61 d1 14 64 90 3b a0  |........Na..d.;.|
+00000010  cd 33 67 f7 87 e6 93 3d  41 18 81 66 0c b2 26 f0  |.3g....=A..f..&.|
+00000020  76 94 cd 17 03 03 00 13  ef 96 85 4e 34 8a 64 ed  |v..........N4.d.|
+00000030  5d 4a 58 e4 74 50 35 7c  47 a6 a5                 |]JX.tP5|G..|
diff --git a/src/crypto/tls/testdata/Server-TLSv13-HelloRetryRequest b/src/crypto/tls/testdata/Server-TLSv13-HelloRetryRequest
index 95eefd2..55ecaf4 100644
--- a/src/crypto/tls/testdata/Server-TLSv13-HelloRetryRequest
+++ b/src/crypto/tls/testdata/Server-TLSv13-HelloRetryRequest
@@ -1,123 +1,123 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 c4 01 00 00  c0 03 03 16 5e f5 e2 4e  |............^..N|
-00000010  27 ce 8e 88 0b e9 13 6d  12 a6 6d 27 c9 ab 95 47  |'......m..m'...G|
-00000020  6f 9d 5d a0 92 64 35 c1  b6 70 90 20 ff 47 6f 67  |o.]..d5..p. .Gog|
-00000030  69 49 88 2a 84 69 79 48  fe cc 92 db 6e 9e ab 47  |iI.*.iyH....n..G|
-00000040  8e 47 10 58 db ad 22 8e  da bb 86 e6 00 04 13 03  |.G.X..".........|
+00000000  16 03 01 00 c4 01 00 00  c0 03 03 53 14 36 0d 63  |...........S.6.c|
+00000010  da e2 6a da b6 ce ab a7  79 a4 49 94 af fc b3 cd  |..j.....y.I.....|
+00000020  18 bb c3 4e ca c2 40 07  01 2b 5c 20 90 fc 6b be  |...N..@..+\ ..k.|
+00000030  26 4f 94 c1 f7 06 e6 ae  e6 0f 67 2f c7 de b0 6b  |&O........g/...k|
+00000040  4a f8 9c a2 43 b6 64 62  08 27 0b 45 00 04 13 03  |J...C.db.'.E....|
 00000050  00 ff 01 00 00 73 00 0b  00 04 03 00 01 02 00 0a  |.....s..........|
 00000060  00 06 00 04 00 1d 00 17  00 16 00 00 00 17 00 00  |................|
 00000070  00 0d 00 1e 00 1c 04 03  05 03 06 03 08 07 08 08  |................|
 00000080  08 09 08 0a 08 0b 08 04  08 05 08 06 04 01 05 01  |................|
 00000090  06 01 00 2b 00 03 02 03  04 00 2d 00 02 01 01 00  |...+......-.....|
-000000a0  33 00 26 00 24 00 1d 00  20 7e a4 de 34 df 01 99  |3.&.$... ~..4...|
-000000b0  37 77 f7 de 6a e2 79 e7  63 eb 86 6c 62 61 fd b0  |7w..j.y.c..lba..|
-000000c0  c6 95 04 c8 63 29 cd 32  00                       |....c).2.|
+000000a0  33 00 26 00 24 00 1d 00  20 a5 12 8a 90 4d a6 20  |3.&.$... ....M. |
+000000b0  36 c8 47 e0 0e 02 2e c3  24 dd f0 33 b2 aa 57 54  |6.G.....$..3..WT|
+000000c0  9d e7 c4 d7 7a f1 42 12  0e                       |....z.B..|
 >>> Flow 2 (server to client)
 00000000  16 03 03 00 58 02 00 00  54 03 03 cf 21 ad 74 e5  |....X...T...!.t.|
 00000010  9a 61 11 be 1d 8c 02 1e  65 b8 91 c2 a2 11 16 7a  |.a......e......z|
-00000020  bb 8c 5e 07 9e 09 e2 c8  a8 33 9c 20 ff 47 6f 67  |..^......3. .Gog|
-00000030  69 49 88 2a 84 69 79 48  fe cc 92 db 6e 9e ab 47  |iI.*.iyH....n..G|
-00000040  8e 47 10 58 db ad 22 8e  da bb 86 e6 13 03 00 00  |.G.X..".........|
+00000020  bb 8c 5e 07 9e 09 e2 c8  a8 33 9c 20 90 fc 6b be  |..^......3. ..k.|
+00000030  26 4f 94 c1 f7 06 e6 ae  e6 0f 67 2f c7 de b0 6b  |&O........g/...k|
+00000040  4a f8 9c a2 43 b6 64 62  08 27 0b 45 13 03 00 00  |J...C.db.'.E....|
 00000050  0c 00 2b 00 02 03 04 00  33 00 02 00 17 14 03 03  |..+.....3.......|
 00000060  00 01 01                                          |...|
 >>> Flow 3 (client to server)
 00000000  14 03 03 00 01 01 16 03  03 00 e5 01 00 00 e1 03  |................|
-00000010  03 16 5e f5 e2 4e 27 ce  8e 88 0b e9 13 6d 12 a6  |..^..N'......m..|
-00000020  6d 27 c9 ab 95 47 6f 9d  5d a0 92 64 35 c1 b6 70  |m'...Go.]..d5..p|
-00000030  90 20 ff 47 6f 67 69 49  88 2a 84 69 79 48 fe cc  |. .GogiI.*.iyH..|
-00000040  92 db 6e 9e ab 47 8e 47  10 58 db ad 22 8e da bb  |..n..G.G.X.."...|
-00000050  86 e6 00 04 13 03 00 ff  01 00 00 94 00 0b 00 04  |................|
+00000010  03 53 14 36 0d 63 da e2  6a da b6 ce ab a7 79 a4  |.S.6.c..j.....y.|
+00000020  49 94 af fc b3 cd 18 bb  c3 4e ca c2 40 07 01 2b  |I........N..@..+|
+00000030  5c 20 90 fc 6b be 26 4f  94 c1 f7 06 e6 ae e6 0f  |\ ..k.&O........|
+00000040  67 2f c7 de b0 6b 4a f8  9c a2 43 b6 64 62 08 27  |g/...kJ...C.db.'|
+00000050  0b 45 00 04 13 03 00 ff  01 00 00 94 00 0b 00 04  |.E..............|
 00000060  03 00 01 02 00 0a 00 06  00 04 00 1d 00 17 00 16  |................|
 00000070  00 00 00 17 00 00 00 0d  00 1e 00 1c 04 03 05 03  |................|
 00000080  06 03 08 07 08 08 08 09  08 0a 08 0b 08 04 08 05  |................|
 00000090  08 06 04 01 05 01 06 01  00 2b 00 03 02 03 04 00  |.........+......|
 000000a0  2d 00 02 01 01 00 33 00  47 00 45 00 17 00 41 04  |-.....3.G.E...A.|
-000000b0  ca c3 69 88 b3 ed f4 ad  7f 9c 03 6c 7a 44 55 d6  |..i........lzDU.|
-000000c0  68 1d a4 27 67 57 d7 27  08 27 e8 b9 c9 32 49 a2  |h..'gW.'.'...2I.|
-000000d0  e4 f6 c2 f2 62 bd 74 67  77 f9 26 27 ee d7 a7 f0  |....b.tgw.&'....|
-000000e0  9c 9a 41 cd 8b bf 76 25  df ff 5a 9f 4e f5 41 95  |..A...v%..Z.N.A.|
+000000b0  de 5f 45 a6 5a fb df 47  33 52 cf 63 63 b7 e2 c1  |._E.Z..G3R.cc...|
+000000c0  f0 ad 4e b7 a3 09 7a 83  cf 58 cb 26 98 51 59 ee  |..N...z..X.&.QY.|
+000000d0  9e 33 a4 39 0d 49 17 98  35 31 99 9c 5a 84 c8 e5  |.3.9.I..51..Z...|
+000000e0  8c d4 90 22 45 ef 65 3b  9d 85 0f 92 b0 ab 0e 8f  |..."E.e;........|
 >>> Flow 4 (server to client)
 00000000  16 03 03 00 9b 02 00 00  97 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 20 ff 47 6f 67  |........... .Gog|
-00000030  69 49 88 2a 84 69 79 48  fe cc 92 db 6e 9e ab 47  |iI.*.iyH....n..G|
-00000040  8e 47 10 58 db ad 22 8e  da bb 86 e6 13 03 00 00  |.G.X..".........|
+00000020  00 00 00 00 00 00 00 00  00 00 00 20 90 fc 6b be  |........... ..k.|
+00000030  26 4f 94 c1 f7 06 e6 ae  e6 0f 67 2f c7 de b0 6b  |&O........g/...k|
+00000040  4a f8 9c a2 43 b6 64 62  08 27 0b 45 13 03 00 00  |J...C.db.'.E....|
 00000050  4f 00 2b 00 02 03 04 00  33 00 45 00 17 00 41 04  |O.+.....3.E...A.|
 00000060  1e 18 37 ef 0d 19 51 88  35 75 71 b5 e5 54 5b 12  |..7...Q.5uq..T[.|
 00000070  2e 8f 09 67 fd a7 24 20  3e b2 56 1c ce 97 28 5e  |...g..$ >.V...(^|
 00000080  f8 2b 2d 4f 9e f1 07 9f  6c 4b 5b 83 56 e2 32 42  |.+-O....lK[.V.2B|
 00000090  e9 58 b6 d7 49 a6 b5 68  1a 41 03 56 6b dc 5a 89  |.X..I..h.A.Vk.Z.|
-000000a0  17 03 03 00 17 c0 07 64  56 b1 bb f8 bf 36 6b df  |.......dV....6k.|
-000000b0  e9 ee 72 cc 79 45 f5 8c  b8 0c b3 5d 17 03 03 02  |..r.yE.....]....|
-000000c0  6d 2e ab b5 84 4f d7 9e  4e 0d 6e a0 42 c1 f0 a6  |m....O..N.n.B...|
-000000d0  62 a3 26 eb 9d 9a 42 a5  5d 1f 59 ad 37 a9 8a af  |b.&...B.].Y.7...|
-000000e0  0d 7b 8f 5a d1 d5 d8 bc  15 5b 0d 0e d2 a9 bb 14  |.{.Z.....[......|
-000000f0  56 ed 30 4e 9b aa f9 5a  66 7d 4c 41 8e 6d 58 90  |V.0N...Zf}LA.mX.|
-00000100  52 4a f2 78 72 59 34 aa  58 7e 0c 44 1e bc 84 d8  |RJ.xrY4.X~.D....|
-00000110  50 17 bd aa 8c 4c d0 c5  e7 69 32 b8 c3 d6 e6 f9  |P....L...i2.....|
-00000120  70 93 99 1c 75 1b 13 f2  85 e0 b5 07 1b d8 5a 31  |p...u.........Z1|
-00000130  0a 1a 2e 97 86 ff 75 a1  db 45 b2 47 68 ed 88 d9  |......u..E.Gh...|
-00000140  fe 31 c9 c0 5e 37 f2 62  37 f7 01 81 11 07 a7 0f  |.1..^7.b7.......|
-00000150  44 ec 17 3a 4a 38 b3 91  9f 77 6f f9 58 9e 9c 12  |D..:J8...wo.X...|
-00000160  6e 54 4c de 43 58 46 a5  f6 c7 58 7e df 33 d7 91  |nTL.CXF...X~.3..|
-00000170  e5 cb 9e 28 9d 7f a7 8a  bd be 01 48 b7 b1 1e e2  |...(.......H....|
-00000180  7a 80 aa f9 cd 3f 62 0d  a0 a0 63 0c ca 4b 5f a8  |z....?b...c..K_.|
-00000190  a9 5f 42 ac 44 57 67 b2  0f 5a b5 bb 59 a9 56 bd  |._B.DWg..Z..Y.V.|
-000001a0  28 3c fb 5e 43 33 61 43  7b 60 48 7d 27 67 6a 06  |(<.^C3aC{`H}'gj.|
-000001b0  ac 0d db e4 d2 d4 b8 fa  fb e8 32 f3 22 83 3a 63  |..........2.".:c|
-000001c0  f6 73 02 62 e0 d5 8a d2  61 a5 bf e1 2d 10 59 93  |.s.b....a...-.Y.|
-000001d0  55 60 be 32 ce 5c d5 5a  f0 54 21 7d 8a 02 23 cf  |U`.2.\.Z.T!}..#.|
-000001e0  38 2b 2b 67 50 22 72 f7  f7 bf 20 c2 34 df ae 3a  |8++gP"r... .4..:|
-000001f0  44 b0 a6 2a 51 79 6f b1  7b ff d7 77 45 83 a9 fa  |D..*Qyo.{..wE...|
-00000200  bf 3c de 34 e8 6a 33 74  6c 24 0b 85 39 ea 7c 13  |.<.4.j3tl$..9.|.|
-00000210  43 26 13 1b 61 56 85 0a  08 83 04 45 5f 5a 36 df  |C&..aV.....E_Z6.|
-00000220  17 c0 59 e9 92 d8 6b 78  66 1f 43 a0 99 f8 4b b1  |..Y...kxf.C...K.|
-00000230  f0 8d 25 6f 0f 2e c7 f9  4d bb 79 74 b8 95 e6 b7  |..%o....M.yt....|
-00000240  41 0c de 2a d3 7e fc 0f  18 87 2d 21 dd 8d 5f 20  |A..*.~....-!.._ |
-00000250  4c 88 cb 63 f4 9c 07 64  14 02 0c 19 46 32 e5 1e  |L..c...d....F2..|
-00000260  85 84 4a 71 b8 a5 50 92  ca 72 fe f4 9c 69 05 d4  |..Jq..P..r...i..|
-00000270  93 22 38 c1 09 e2 da 49  17 e8 e1 b3 f9 42 ee bf  |."8....I.....B..|
-00000280  ea 40 b2 00 af b9 a8 f9  97 8e ef de 41 de 01 87  |.@..........A...|
-00000290  cc 13 23 64 8c a1 10 9a  91 38 9b cb fb 0b 04 66  |..#d.....8.....f|
-000002a0  fb 4b e3 77 e7 da 7a 75  5c 66 20 7e dc 22 a9 e6  |.K.w..zu\f ~."..|
-000002b0  6a 27 06 ed 3c fc 4c 30  ed f0 31 92 b2 eb a1 f3  |j'..<.L0..1.....|
-000002c0  a4 fd 83 20 37 62 71 95  ff 7c 65 e8 88 aa e7 c7  |... 7bq..|e.....|
-000002d0  3f 17 9c 94 6f 1a d9 c8  ac 00 8d ec 30 22 98 85  |?...o.......0"..|
-000002e0  da cc 69 41 f4 3a 66 1b  e6 4c 38 62 8d 37 dc a1  |..iA.:f..L8b.7..|
-000002f0  08 cf 88 d4 26 7f 47 33  54 d8 aa d6 c5 02 fc 72  |....&.G3T......r|
-00000300  ff 50 19 9f 4a 0e 8b c8  32 6d 8e 15 e4 f1 ed 2e  |.P..J...2m......|
-00000310  43 cb 9f 8c 7a 0e e1 a2  79 e2 f9 52 12 e4 2f a9  |C...z...y..R../.|
-00000320  c1 c5 0b 1f c2 21 c5 2e  21 de 3e 76 29 db 17 03  |.....!..!.>v)...|
-00000330  03 00 99 8a ee 54 88 93  d0 4b a0 31 18 ed 83 ff  |.....T...K.1....|
-00000340  2c 44 78 ab 88 ea 72 d2  2a 27 71 a9 a1 ba 26 a5  |,Dx...r.*'q...&.|
-00000350  9a 9b 64 92 e8 c9 f8 02  47 b9 9f 53 95 a8 ad 5b  |..d.....G..S...[|
-00000360  bd 81 17 87 69 0c 77 c1  0e d7 cb 5b 9f 2d 36 86  |....i.w....[.-6.|
-00000370  f5 fc 6d ba d8 f5 63 dd  e4 f5 0a 61 8d b2 a9 bb  |..m...c....a....|
-00000380  a5 a5 d6 41 d4 aa db 46  79 56 02 51 f4 ac d3 57  |...A...FyV.Q...W|
-00000390  57 b4 53 71 9f fe ea a6  76 f3 0f ca 39 93 f3 34  |W.Sq....v...9..4|
-000003a0  c6 96 96 09 8e 12 04 cc  1e 82 9f 78 6b 1c a2 fc  |...........xk...|
-000003b0  0c 9d c6 00 3c 33 3a 92  c5 ce 96 15 50 1a 75 6d  |....<3:.....P.um|
-000003c0  85 ec b6 64 12 2b eb 3a  52 8f 6d 35 17 03 03 00  |...d.+.:R.m5....|
-000003d0  35 7f 2b 30 fa e0 92 25  a2 1b 11 f8 cd 04 0d 57  |5.+0...%.......W|
-000003e0  01 42 cf e9 0c 92 7f d1  fd fa 26 61 0d 85 d7 d5  |.B........&a....|
-000003f0  3c fd cf 73 98 dc 88 a2  76 63 59 82 45 2d e3 bc  |<..s....vcY.E-..|
-00000400  a2 c0 0b 83 41 75 17 03  03 00 93 f3 17 09 b2 e8  |....Au..........|
-00000410  53 11 9b 3e 3a 10 a0 e6  58 04 81 82 cb eb a5 19  |S..>:...X.......|
-00000420  0f a3 25 e2 eb ab 7c 07  2b e6 22 19 30 aa fc a6  |..%...|.+.".0...|
-00000430  bd c4 7d 69 33 38 2b 58  55 5b a7 27 29 86 af d5  |..}i38+XU[.')...|
-00000440  f9 5a b4 85 ad a0 73 ab  f7 61 3f 2e 66 53 f5 8f  |.Z....s..a?.fS..|
-00000450  c7 09 4b 01 99 d0 68 93  32 d1 2e 8f 89 e5 e1 ea  |..K...h.2.......|
-00000460  ba f2 fb 07 ee 58 7c 28  ff 59 1d d7 f7 b3 e2 56  |.....X|(.Y.....V|
-00000470  98 56 cd 9d d1 4f 26 7e  77 0d a0 c1 92 c5 a0 83  |.V...O&~w.......|
-00000480  c9 7c d8 7d a8 91 d3 ae  71 41 1d 06 33 68 b8 52  |.|.}....qA..3h.R|
-00000490  ad 84 a7 21 80 8f e5 c6  37 11 da 6c 5a 3a        |...!....7..lZ:|
+000000a0  17 03 03 00 17 41 5e 1d  29 7e 4d ad 56 1c e4 42  |.....A^.)~M.V..B|
+000000b0  9d 99 61 93 95 d3 7a 1c  9c b0 1b ba 17 03 03 02  |..a...z.........|
+000000c0  6d 62 fd b6 84 db 87 5f  ec 30 bc df 0c 5d b7 f9  |mb....._.0...]..|
+000000d0  58 6b 7e ce 19 54 a9 0c  3f 66 f6 23 b6 36 19 a9  |Xk~..T..?f.#.6..|
+000000e0  ba e2 44 28 70 b9 35 14  fe 33 50 64 30 dd b1 35  |..D(p.5..3Pd0..5|
+000000f0  9c e5 f6 f5 66 09 be 05  82 c8 9c 7a 28 d1 6a 3d  |....f......z(.j=|
+00000100  31 a3 9d 0b 5a 1c 9e f1  77 c8 be eb 71 a7 9d 63  |1...Z...w...q..c|
+00000110  20 18 ef 97 4b fb 60 4d  2f 31 49 b2 1c 47 30 eb  | ...K.`M/1I..G0.|
+00000120  80 c1 e6 28 e0 67 a8 1b  8f 79 9f 40 ca 97 bd d9  |...(.g...y.@....|
+00000130  b9 cc 55 56 00 32 8d 76  76 88 be 62 42 e9 2f 53  |..UV.2.vv..bB./S|
+00000140  9b ab 56 98 e6 03 15 17  1a 2b 70 50 8a d8 ba 9d  |..V......+pP....|
+00000150  ab 5a ea 68 ec 98 7a f5  c1 9b 21 f8 f3 0b 5d a3  |.Z.h..z...!...].|
+00000160  7a 70 ae ff 67 e0 e8 2d  97 e5 72 d7 c4 27 9b 8d  |zp..g..-..r..'..|
+00000170  f8 47 dd 9e 15 2a 1e 38  eb 82 24 e5 85 55 ec a4  |.G...*.8..$..U..|
+00000180  22 ee 1f 9d c2 f3 1c 47  7a 26 0b 1a 4b d8 e4 58  |"......Gz&..K..X|
+00000190  ad b2 99 72 5b f8 97 33  f6 26 58 e3 58 1e 66 12  |...r[..3.&X.X.f.|
+000001a0  51 ba dc 66 bb c7 7d af  90 4b c2 79 2c b3 d8 34  |Q..f..}..K.y,..4|
+000001b0  2a d2 6b 37 71 88 e0 4a  c3 16 50 81 21 e1 a7 6d  |*.k7q..J..P.!..m|
+000001c0  42 e7 f5 86 7e b3 4b b8  9d bb dc 49 7d ce 6c 98  |B...~.K....I}.l.|
+000001d0  fd 87 2e fc 1a 17 34 12  90 a0 bc 06 46 7b e9 0b  |......4.....F{..|
+000001e0  d3 aa f7 77 30 43 6e 5f  4e fa e3 b1 a6 c8 80 47  |...w0Cn_N......G|
+000001f0  16 71 a0 bc 9e d3 89 14  49 ca 9a 87 8b b0 3b c7  |.q......I.....;.|
+00000200  a7 f4 6d 2a cb 0a 5e 8a  e5 f1 45 65 e4 51 da b1  |..m*..^...Ee.Q..|
+00000210  5c e2 88 90 46 e7 cb 01  0b 99 64 fe 5b b4 b3 e6  |\...F.....d.[...|
+00000220  aa 6f 59 25 25 79 2b 8e  6b 59 65 15 51 a1 8f a2  |.oY%%y+.kYe.Q...|
+00000230  f5 cd db df 63 fb 86 72  a5 9d 6c 7d b9 a0 e9 d5  |....c..r..l}....|
+00000240  c7 79 ca f1 3f c3 ed 72  29 3c 58 ed bd 4e 3a 27  |.y..?..r)<X..N:'|
+00000250  2c 40 34 82 47 62 3d bb  5a 90 70 cb 33 f6 f3 31  |,@4.Gb=.Z.p.3..1|
+00000260  3d 49 5f 9c 7e 21 7e cc  9b 09 38 3c e5 33 9f 11  |=I_.~!~...8<.3..|
+00000270  2e eb a0 d6 df cd 86 ef  3c 6d b8 d4 5c 8b b4 ce  |........<m..\...|
+00000280  8a f4 ef f8 78 5e ad c2  ea 52 ed 30 a2 4c 50 d2  |....x^...R.0.LP.|
+00000290  8a 4e 9e 1b 2a e6 04 86  e2 b8 84 f3 fe 6e 34 78  |.N..*........n4x|
+000002a0  28 fb 97 d7 30 66 a7 20  57 c1 ca e4 0c 7f a0 2c  |(...0f. W......,|
+000002b0  4e e1 87 ee 3f cc fe 18  a7 49 a7 70 45 94 73 8c  |N...?....I.pE.s.|
+000002c0  66 b8 b1 54 58 1a 39 3d  16 40 da e5 e5 51 c6 07  |f..TX.9=.@...Q..|
+000002d0  bc 30 ff 6a 66 3c bf 92  bc 0c 5c b5 c8 b9 55 6b  |.0.jf<....\...Uk|
+000002e0  26 f3 cd 4c ab 40 05 f5  8e 8d f8 55 b1 90 6a 93  |&..L.@.....U..j.|
+000002f0  d3 74 72 54 26 c0 1d 56  26 15 4c cf 63 4e 51 8c  |.trT&..V&.L.cNQ.|
+00000300  6f 92 85 8c 24 78 1e 8f  c4 cd 13 6b 42 6f 58 9a  |o...$x.....kBoX.|
+00000310  77 da 6c 73 1f dc 03 ff  33 9c d9 66 af 06 1d 1a  |w.ls....3..f....|
+00000320  fe 6f 13 3a 83 b2 dc ac  01 b4 e6 ca 5c 9e 17 03  |.o.:........\...|
+00000330  03 00 99 d2 6f 24 aa 51  a7 3d 2d fa 18 57 8e 7c  |....o$.Q.=-..W.||
+00000340  43 4f da 6c 31 97 bb d7  6f 64 2a db 7c 76 41 11  |CO.l1...od*.|vA.|
+00000350  cc e9 0f ea e8 03 99 49  4e c4 2c 43 36 54 b9 61  |.......IN.,C6T.a|
+00000360  af d1 56 00 9a e4 f2 c2  6d cf e9 25 32 f5 34 b6  |..V.....m..%2.4.|
+00000370  08 45 0f 43 71 6f 88 3f  7a 07 68 0b 91 fd 15 c3  |.E.Cqo.?z.h.....|
+00000380  43 8a 9d c3 bf f9 56 3c  3d 07 62 d0 94 11 14 95  |C.....V<=.b.....|
+00000390  63 27 28 d2 94 07 ff 1f  2b 99 76 a8 03 b4 8b 8f  |c'(.....+.v.....|
+000003a0  dd 56 d9 55 5d 4a 47 bf  77 25 eb 6a 2a ee 1c ea  |.V.U]JG.w%.j*...|
+000003b0  e9 58 0b 17 a5 56 99 d7  b6 9e 2a 4e 9a e4 07 68  |.X...V....*N...h|
+000003c0  dd df ce fc 8f 16 66 c1  4f f7 4b 20 17 03 03 00  |......f.O.K ....|
+000003d0  35 f6 71 3a 27 56 09 70  a2 dd 9d 5e 24 09 54 ce  |5.q:'V.p...^$.T.|
+000003e0  f3 6d f1 74 49 48 3e 2f  72 73 88 c7 fc 29 ec 3f  |.m.tIH>/rs...).?|
+000003f0  fa 0f 96 72 46 7d 6b 2f  ed 23 63 75 b7 26 f2 ea  |...rF}k/.#cu.&..|
+00000400  77 0f 3a 68 1e ee 17 03  03 00 8b b0 54 d9 ec c4  |w.:h........T...|
+00000410  44 cb e4 f6 f2 cb 66 31  c7 d8 ef 45 bf 9c 03 c4  |D.....f1...E....|
+00000420  7c 3f 91 e1 cf e8 c6 e5  a8 12 f1 e0 72 6b a2 9a  ||?..........rk..|
+00000430  f7 73 3d 13 3d 30 91 54  27 02 f7 ab a3 7e bb 5f  |.s=.=0.T'....~._|
+00000440  21 a6 fa 09 98 39 7f 99  13 5a c5 c5 6c 7b d2 91  |!....9...Z..l{..|
+00000450  7c de 26 88 b9 17 bd b9  b2 9a 7c 01 35 ad 7b 3b  ||.&.......|.5.{;|
+00000460  3d 15 33 9e 78 ea a1 df  94 80 fa e4 59 ef 49 06  |=.3.x.......Y.I.|
+00000470  31 41 8a 83 e9 98 37 e6  5a 69 f9 0a 7d 63 8e 6a  |1A....7.Zi..}c.j|
+00000480  9c bd 5b d4 69 72 3d 82  c9 c0 11 d6 68 13 17 9d  |..[.ir=.....h...|
+00000490  0e 32 48 bf 33 ab                                 |.2H.3.|
 >>> Flow 5 (client to server)
-00000000  17 03 03 00 35 28 34 b9  16 07 9a c1 82 ad 9f b7  |....5(4.........|
-00000010  78 fa 1a d0 1f 57 98 95  37 86 cf 1d 67 19 47 48  |x....W..7...g.GH|
-00000020  e9 ab fe 0c ff 26 c6 78  88 1a ad 75 48 63 4b 6e  |.....&.x...uHcKn|
-00000030  72 4a 44 4f 27 b6 9d 56  b6 43                    |rJDO'..V.C|
+00000000  17 03 03 00 35 c6 da dd  4b 11 a3 87 cd fd f9 99  |....5...K.......|
+00000010  a6 0b 76 c0 00 89 e1 87  d1 2c 43 0b f1 74 e5 60  |..v......,C..t.`|
+00000020  49 94 5f d2 d9 b5 0b bd  6c d8 2c 84 4d 4f da 43  |I._.....l.,.MO.C|
+00000030  f0 33 dd 54 bd 0c d9 f2  71 82                    |.3.T....q.|
 >>> Flow 6 (server to client)
-00000000  17 03 03 00 1e d9 1f 35  86 22 7e 10 f1 8d e5 82  |.......5."~.....|
-00000010  f2 f6 88 81 a3 66 da 6a  1e 2f 94 94 16 02 2a 52  |.....f.j./....*R|
-00000020  69 8b bb 17 03 03 00 13  3c 87 88 8c c0 78 64 18  |i.......<....xd.|
-00000030  9a 9e 07 fd ac d7 2d 5d  ab bf a8                 |......-]...|
+00000000  17 03 03 00 1e 6d f2 53  68 26 89 6e 4a 66 6a a9  |.....m.Sh&.nJfj.|
+00000010  12 9e 89 f0 be eb ff ed  b4 f0 ca f2 b8 7a b2 5e  |.............z.^|
+00000020  98 50 cb 17 03 03 00 13  ab 2b 9c 98 f0 1b 5c a2  |.P.......+....\.|
+00000030  f3 b2 a1 16 e0 74 eb 02  c4 7d d5                 |.....t...}.|
diff --git a/src/crypto/tls/testdata/Server-TLSv13-IssueTicket b/src/crypto/tls/testdata/Server-TLSv13-IssueTicket
index fa1f801..7fe5184 100644
--- a/src/crypto/tls/testdata/Server-TLSv13-IssueTicket
+++ b/src/crypto/tls/testdata/Server-TLSv13-IssueTicket
@@ -1,99 +1,98 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 ce 01 00 00  ca 03 03 bb e2 a4 a5 7e  |...............~|
-00000010  63 65 5c a5 7f 3f 13 a1  9d 5f 53 3c d2 b1 84 bd  |ce\..?..._S<....|
-00000020  51 0c 9a 14 e8 8a 5a 53  b8 27 88 20 e7 04 4d dc  |Q.....ZS.'. ..M.|
-00000030  76 f3 7f bd 00 ce 46 d2  a6 58 26 99 02 91 88 bf  |v.....F..X&.....|
-00000040  b5 6b 56 2b b6 bc 51 b2  e4 cd 82 8d 00 04 13 01  |.kV+..Q.........|
+00000000  16 03 01 00 ce 01 00 00  ca 03 03 9b 80 62 b8 bb  |.............b..|
+00000010  fc 09 cc 19 31 91 f7 4b  8a e8 fc 69 45 33 bd 64  |....1..K...iE3.d|
+00000020  8c 88 6e 07 0d 33 e7 f2  ce 4b 46 20 81 23 01 a2  |..n..3...KF .#..|
+00000030  64 c3 6d 55 ee 3c f1 c5  16 48 cb a7 61 fe 15 57  |d.mU.<...H..a..W|
+00000040  fa 9e 36 f2 ad 5b 19 2e  73 b9 8f 57 00 04 13 01  |..6..[..s..W....|
 00000050  00 ff 01 00 00 7d 00 0b  00 04 03 00 01 02 00 0a  |.....}..........|
 00000060  00 0c 00 0a 00 1d 00 17  00 1e 00 19 00 18 00 23  |...............#|
 00000070  00 00 00 16 00 00 00 17  00 00 00 0d 00 1e 00 1c  |................|
 00000080  04 03 05 03 06 03 08 07  08 08 08 09 08 0a 08 0b  |................|
 00000090  08 04 08 05 08 06 04 01  05 01 06 01 00 2b 00 03  |.............+..|
 000000a0  02 03 04 00 2d 00 02 01  01 00 33 00 26 00 24 00  |....-.....3.&.$.|
-000000b0  1d 00 20 b2 99 9c bb d1  4c c7 61 5f aa bf 2f 06  |.. .....L.a_../.|
-000000c0  a3 50 e7 49 7d 11 ae 68  9b b0 be be 82 6d 27 29  |.P.I}..h.....m')|
-000000d0  89 4c 4a                                          |.LJ|
+000000b0  1d 00 20 e2 26 c1 8e 1b  73 8a e1 ec 95 a0 01 1a  |.. .&...s.......|
+000000c0  15 98 9d a2 d0 ac 02 4d  14 a9 8d 42 3a 68 e6 d2  |.......M...B:h..|
+000000d0  9f 09 49                                          |..I|
 >>> Flow 2 (server to client)
 00000000  16 03 03 00 7a 02 00 00  76 03 03 00 00 00 00 00  |....z...v.......|
 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 e7 04 4d dc  |........... ..M.|
-00000030  76 f3 7f bd 00 ce 46 d2  a6 58 26 99 02 91 88 bf  |v.....F..X&.....|
-00000040  b5 6b 56 2b b6 bc 51 b2  e4 cd 82 8d 13 01 00 00  |.kV+..Q.........|
+00000020  00 00 00 00 00 00 00 00  00 00 00 20 81 23 01 a2  |........... .#..|
+00000030  64 c3 6d 55 ee 3c f1 c5  16 48 cb a7 61 fe 15 57  |d.mU.<...H..a..W|
+00000040  fa 9e 36 f2 ad 5b 19 2e  73 b9 8f 57 13 01 00 00  |..6..[..s..W....|
 00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 2f  |..+.....3.$... /|
 00000060  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
 00000070  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74 14  |.........._X.;t.|
-00000080  03 03 00 01 01 17 03 03  00 17 c6 67 93 be 69 04  |...........g..i.|
-00000090  58 4f 1d 93 b6 5c 1c 10  8a 91 d0 c0 db 0b d1 0a  |XO...\..........|
-000000a0  d1 17 03 03 02 6d da d6  28 74 c7 60 d6 02 3e 28  |.....m..(t.`..>(|
-000000b0  29 17 50 b9 01 4b 9b 93  07 9d 09 f0 17 05 e0 88  |).P..K..........|
-000000c0  53 ec c3 28 f7 a6 4e 9b  80 a3 fd 20 db 97 51 6a  |S..(..N.... ..Qj|
-000000d0  b1 7a 6d 93 26 61 c8 9c  6d 37 65 94 b4 74 a0 60  |.zm.&a..m7e..t.`|
-000000e0  b1 a1 38 4c eb 5e a9 c4  bd d4 29 ee e9 e3 ab 56  |..8L.^....)....V|
-000000f0  68 67 57 da b3 3d 85 bd  26 67 e1 52 83 a6 69 14  |hgW..=..&g.R..i.|
-00000100  3b 30 31 c7 71 83 fa 62  13 ea a3 a5 de 4b 32 3f  |;01.q..b.....K2?|
-00000110  c6 48 0b 96 cd 4b da 96  6d e2 31 88 ca 96 5f 63  |.H...K..m.1..._c|
-00000120  cb 39 37 d8 fa 8f 1f b9  e2 c5 6b ae 60 05 5b ed  |.97.......k.`.[.|
-00000130  e0 5d 83 fa 2b 22 f4 e8  33 27 48 e7 c4 3d 54 22  |.]..+"..3'H..=T"|
-00000140  5a 60 a9 7a 0d 9b 42 e2  50 28 0e 6c 13 16 a1 51  |Z`.z..B.P(.l...Q|
-00000150  60 81 8f 80 e2 1b 53 24  62 78 b7 0a 4a 9b 2f a7  |`.....S$bx..J./.|
-00000160  97 b3 ba e5 34 0d 76 a6  0e ea ec 91 f0 9c a9 6d  |....4.v........m|
-00000170  57 47 ef a3 c4 7a 62 a8  1f c0 1a d7 ea 31 90 20  |WG...zb......1. |
-00000180  76 13 ae f1 24 9d 60 9f  30 9f 2b 2a 2f 0a 39 6c  |v...$.`.0.+*/.9l|
-00000190  7a 47 fe 11 1c 78 42 a1  1c ed c3 cd d2 6a cd 4f  |zG...xB......j.O|
-000001a0  66 1b 51 d4 43 4e 45 23  15 48 e4 84 3e 89 a3 55  |f.Q.CNE#.H..>..U|
-000001b0  7e b0 a6 c2 1c cd eb cf  88 6b e7 d2 07 25 ef 37  |~........k...%.7|
-000001c0  e1 8a a5 b9 03 7e 70 73  9c 23 1a 62 07 56 db ed  |.....~ps.#.b.V..|
-000001d0  93 e3 8a 91 8b 90 74 14  14 cc ff 9e ea e5 45 dd  |......t.......E.|
-000001e0  a6 2d dc e6 cb 8c 59 33  91 da e6 5c b4 73 4f 36  |.-....Y3...\.sO6|
-000001f0  f1 3c d9 6e ba 2c c4 51  de 4f 8a 69 62 c4 db b1  |.<.n.,.Q.O.ib...|
-00000200  9e 67 7a 5f 01 7b b7 b2  55 b1 14 c0 46 d1 43 16  |.gz_.{..U...F.C.|
-00000210  a0 70 84 7e b8 a3 04 ce  e3 e0 0e 5e 5f 3f 95 7a  |.p.~.......^_?.z|
-00000220  ef 79 8d 50 84 cd 02 f1  e0 e5 f9 26 cf 7a f9 da  |.y.P.......&.z..|
-00000230  a3 7d 22 31 4d 61 82 f6  ff fd 69 23 07 53 07 df  |.}"1Ma....i#.S..|
-00000240  5a eb 50 86 28 44 24 06  9b 21 ef ef 78 bc 67 13  |Z.P.(D$..!..x.g.|
-00000250  c5 27 d8 18 db c7 fa d5  a6 0c 40 09 e3 e5 17 0c  |.'........@.....|
-00000260  61 ae bc 48 98 ab 7b 57  82 f7 87 a5 4b 96 25 77  |a..H..{W....K.%w|
-00000270  e4 59 53 d1 d3 7b 55 08  e0 1a 5d 9b 0f 2e 6f cd  |.YS..{U...]...o.|
-00000280  96 9d 19 09 07 84 08 c1  cf bd 99 af 80 52 c0 f7  |.............R..|
-00000290  0c 50 85 14 7c fd cb 61  01 05 ee 92 60 bb ac 4c  |.P..|..a....`..L|
-000002a0  b4 37 48 dc b1 34 9d 26  3a fd dc ae 21 2f d3 51  |.7H..4.&:...!/.Q|
-000002b0  84 c3 0e 8f e1 b4 fb 0b  2e 3b 51 a9 e8 c2 d9 d9  |.........;Q.....|
-000002c0  6b a5 af 90 30 97 a2 32  9a a3 9d 5d b3 75 c6 48  |k...0..2...].u.H|
-000002d0  4b ee a3 23 85 98 a5 b5  00 fd c5 3a 27 65 9e d0  |K..#.......:'e..|
-000002e0  19 a8 5a 8c 8b eb 49 c6  58 16 9a 88 67 54 82 a9  |..Z...I.X...gT..|
-000002f0  29 0a 98 82 e4 f8 f0 c9  17 a6 81 91 1b c1 2a b7  |).............*.|
-00000300  de c3 8b 2d a6 55 1f 61  89 90 84 15 c8 33 6e cb  |...-.U.a.....3n.|
-00000310  5c f4 e2 17 03 03 00 99  49 e0 38 43 34 61 b9 37  |\.......I.8C4a.7|
-00000320  2c 3e d5 c7 8c d7 9b a6  6c 8e ef a6 28 13 3c 79  |,>......l...(.<y|
-00000330  36 35 3e ba 70 5b 4e 6b  c3 f5 52 06 ae ff 68 1d  |65>.p[Nk..R...h.|
-00000340  a0 07 ac c1 17 6e d1 11  76 1d d7 1e e2 26 3e 76  |.....n..v....&>v|
-00000350  2b f9 a4 55 67 0b 9c cd  db ab 71 1a 84 33 74 eb  |+..Ug.....q..3t.|
-00000360  b1 4b 26 d8 e8 1c 84 2b  62 c7 70 27 16 fb 16 ae  |.K&....+b.p'....|
-00000370  9d 72 3a 42 c1 cb cd c8  d0 dd 9c f0 51 2e 33 c1  |.r:B........Q.3.|
-00000380  46 35 56 ad 3b ea be 6e  14 4d 05 d1 6d 85 93 86  |F5V.;..n.M..m...|
-00000390  cc 6a 1c bf 03 cf 8f 92  c9 18 74 e0 66 0a b6 9a  |.j........t.f...|
-000003a0  38 ac 1a 73 f4 e0 70 ec  93 61 67 9f b8 12 6f 1f  |8..s..p..ag...o.|
-000003b0  17 17 03 03 00 35 59 6b  86 a8 cc 89 c6 fa 4f 95  |.....5Yk......O.|
-000003c0  25 b6 90 08 ac bf 9f d5  c9 3c 6c e5 cd 0d 14 00  |%........<l.....|
-000003d0  20 c9 01 ca 44 bc 9f 66  e0 3d e9 a0 11 40 c7 72  | ...D..f.=...@.r|
-000003e0  57 c8 54 d2 30 65 34 a1  09 27 63 17 03 03 00 93  |W.T.0e4..'c.....|
-000003f0  34 b8 fe 42 51 8b 9a 39  66 52 ec 19 95 2d 38 84  |4..BQ..9fR...-8.|
-00000400  36 36 09 e8 7c 86 51 81  90 7c b8 3b ed ec 9e a9  |66..|.Q..|.;....|
-00000410  09 ef 3b ca 86 2c 4d 05  3c 83 62 1c 8c e2 73 a1  |..;..,M.<.b...s.|
-00000420  3b 99 97 d9 90 24 df be  94 67 73 36 ac 92 ce 10  |;....$...gs6....|
-00000430  7a be 6f 1f b8 9d 0c c5  31 90 47 95 02 4d bd 86  |z.o.....1.G..M..|
-00000440  1a 89 3c e7 b6 71 9a f0  5c 36 41 a2 8f b6 d3 5c  |..<..q..\6A....\|
-00000450  3b 2f a2 0e c8 c5 ae eb  d1 4a d2 ab 12 8c 86 3a  |;/.......J.....:|
-00000460  51 ef 9a e0 44 6f 0a cc  17 61 5d 12 db 2c d7 9f  |Q...Do...a]..,..|
-00000470  d1 a3 30 2e ad f2 4c c8  f8 1e 7f 4c a5 8c c6 f8  |..0...L....L....|
-00000480  3d cb 01                                          |=..|
+00000080  03 03 00 01 01 17 03 03  00 17 c9 df 69 cf ca 6d  |............i..m|
+00000090  b4 7b 81 46 34 f6 0c e3  5b 88 92 91 24 80 93 03  |.{.F4...[...$...|
+000000a0  f8 17 03 03 02 6d b9 46  75 89 0d 64 9d 7b 9a 2a  |.....m.Fu..d.{.*|
+000000b0  48 78 eb 93 8d c8 4d 16  fb 7e 95 77 ff 06 d2 aa  |Hx....M..~.w....|
+000000c0  30 34 cc 9e 5a f3 c1 b6  d5 17 fb b2 15 bb eb 11  |04..Z...........|
+000000d0  28 5a 2f 6b d6 87 8c c6  17 00 4d 58 d1 27 af 88  |(Z/k......MX.'..|
+000000e0  39 1f db 2e 0a 5b 36 8f  a1 26 a9 00 be ba 5a b2  |9....[6..&....Z.|
+000000f0  65 fa 14 8a 53 3c 6a 9e  b7 73 1f fa 80 fd 03 c2  |e...S<j..s......|
+00000100  0e 53 27 25 42 fb 4a 75  9e 18 80 09 d0 b5 dc 37  |.S'%B.Ju.......7|
+00000110  a7 d3 d6 9d a1 a0 4e bc  1a a6 c8 78 e4 b9 e2 02  |......N....x....|
+00000120  00 2a 4a c9 e5 8d 5a e3  83 60 ae 74 11 06 33 93  |.*J...Z..`.t..3.|
+00000130  5d ed 89 6c 17 6b a4 c4  45 06 d0 8d 64 9a 37 eb  |]..l.k..E...d.7.|
+00000140  34 22 1d 70 b0 96 74 8b  ba 17 ad bb 42 fd c7 30  |4".p..t.....B..0|
+00000150  16 6a cc dd a9 97 1d 0a  34 1e f9 52 3b e8 49 e7  |.j......4..R;.I.|
+00000160  41 ab 8a fb 29 b7 22 93  c1 ea 92 29 45 a1 e5 46  |A...)."....)E..F|
+00000170  92 98 30 5f 2e f1 90 f4  a0 cb b3 0a 64 16 be 4c  |..0_........d..L|
+00000180  18 2c 83 ef 7b 7b e8 74  6f cf 99 c3 47 37 fd c4  |.,..{{.to...G7..|
+00000190  a7 57 ba 2b d2 69 01 71  47 37 ac bd 7d a3 d7 cf  |.W.+.i.qG7..}...|
+000001a0  ce e5 bc d3 75 f8 d3 d8  e7 b4 57 81 8d 92 05 04  |....u.....W.....|
+000001b0  12 b1 76 d0 9a 5c d6 76  54 9a 99 03 19 ee 92 ff  |..v..\.vT.......|
+000001c0  8e 12 50 50 d5 cb 2c d4  df 0b 6b 43 54 59 39 17  |..PP..,...kCTY9.|
+000001d0  0e 3c 6a 87 6c 34 3a ec  fb 87 88 bc df aa fc 08  |.<j.l4:.........|
+000001e0  80 c8 c7 b8 5d 6e dc f9  e3 d3 15 36 5e db 64 cb  |....]n.....6^.d.|
+000001f0  6d f5 09 87 3e f8 b8 7c  e0 89 7c 9b ca 3d bf 68  |m...>..|..|..=.h|
+00000200  de 8f 68 89 02 c5 67 5a  ff 71 02 34 00 96 15 d4  |..h...gZ.q.4....|
+00000210  01 6d 6d 31 dc 77 62 b8  3e 72 b0 ab 4d da ea 6d  |.mm1.wb.>r..M..m|
+00000220  9a 2d 0e 5d b7 8e cc bc  5c 0a b3 13 5b 8c 86 de  |.-.]....\...[...|
+00000230  e3 1a 70 cd 9d 63 4c ea  e2 56 f9 3b 05 8e 0b 96  |..p..cL..V.;....|
+00000240  16 c9 a4 67 09 fe 88 ae  4b 8c d1 b3 19 10 0f fd  |...g....K.......|
+00000250  07 33 86 3a 6a 54 ef 69  27 02 bf 76 7c 05 ab 40  |.3.:jT.i'..v|..@|
+00000260  e6 43 9e 3c 9b ee 0c d8  14 ff c1 09 a6 73 65 66  |.C.<.........sef|
+00000270  54 1f a9 9c af fb 73 c4  cb 8c a7 3b c7 23 d6 99  |T.....s....;.#..|
+00000280  a7 c6 af a1 62 54 30 f7  18 30 23 7d c0 e6 d3 fe  |....bT0..0#}....|
+00000290  a0 58 f1 c5 5e 37 70 90  47 73 45 b0 70 a9 45 1c  |.X..^7p.GsE.p.E.|
+000002a0  87 9f 0d ed bc ee 65 c2  50 91 55 a3 f9 eb 71 e8  |......e.P.U...q.|
+000002b0  5a ee b3 3f 79 75 3a c9  98 7d 57 fc 51 78 b5 e5  |Z..?yu:..}W.Qx..|
+000002c0  33 90 f1 d0 74 86 1a 51  2b f4 89 1a 19 48 2d 68  |3...t..Q+....H-h|
+000002d0  d0 7b be c1 bb 9e c7 3e  af 4b 80 1c ab 8f a2 9d  |.{.....>.K......|
+000002e0  17 96 da 42 16 49 a6 74  35 07 9a 7d 89 80 4d d6  |...B.I.t5..}..M.|
+000002f0  04 43 11 68 6b e4 87 32  33 43 82 b3 9e b0 03 eb  |.C.hk..23C......|
+00000300  b9 15 01 86 01 db ea e3  67 5b 7f 9c 0e 54 03 21  |........g[...T.!|
+00000310  04 29 7e 17 03 03 00 99  21 c7 e4 ea 6e 27 82 c6  |.)~.....!...n'..|
+00000320  15 6a 4d cd 8d c5 41 e5  1e aa 5c 8b b9 e8 ee 2a  |.jM...A...\....*|
+00000330  04 53 ee 39 3d a1 9b 53  ab f8 4a 97 95 69 53 ef  |.S.9=..S..J..iS.|
+00000340  9b a9 3a d5 d1 0c a6 e3  fb 7d 30 b1 00 45 43 58  |..:......}0..ECX|
+00000350  51 65 1f 60 e7 f4 0a 6a  f6 8a 06 60 9b 5b 60 31  |Qe.`...j...`.[`1|
+00000360  d5 df 8b 28 1a c4 cb 39  5d a3 2b fb eb c8 07 14  |...(...9].+.....|
+00000370  07 ee 02 11 7f 85 c9 78  d8 f5 c1 6b 70 c1 b3 c1  |.......x...kp...|
+00000380  c0 a8 a0 08 ac d3 4e 39  ca 21 b0 e6 1d ea 97 58  |......N9.!.....X|
+00000390  6a e0 ac ad 10 19 75 13  7e 35 5d c6 2c ad a1 a2  |j.....u.~5].,...|
+000003a0  79 ac 33 ed 4d 77 41 29  6c e2 05 80 d7 7b 05 a4  |y.3.MwA)l....{..|
+000003b0  03 17 03 03 00 35 4b 22  e9 78 9e b1 75 a9 cd 91  |.....5K".x..u...|
+000003c0  c6 4d f1 e9 f2 a7 42 59  d5 c0 9e f3 9e 8f 7a 17  |.M....BY......z.|
+000003d0  21 ba 01 5b d3 0f 91 52  63 12 d9 4f be 84 75 2e  |!..[...Rc..O..u.|
+000003e0  a2 46 a9 45 f5 d6 a1 60  a0 17 79 17 03 03 00 8b  |.F.E...`..y.....|
+000003f0  92 fc 11 26 97 33 82 f1  e4 62 5d 2a 56 3c d8 80  |...&.3...b]*V<..|
+00000400  6b 6d ce f9 5f 43 2f 8e  24 0b 46 0b a5 5a 22 d5  |km.._C/.$.F..Z".|
+00000410  ff 33 d7 e6 04 2e 37 5b  00 45 9d 8b 62 49 81 b1  |.3....7[.E..bI..|
+00000420  97 ca d5 84 dd f9 7e 1a  7a a3 45 46 b9 db a7 d4  |......~.z.EF....|
+00000430  07 3d 54 39 b1 de 54 16  bc d7 ba e7 b8 92 02 eb  |.=T9..T.........|
+00000440  0c 3c b1 48 40 53 68 f5  fc 0f 6a 64 67 fb 79 cd  |.<.H@Sh...jdg.y.|
+00000450  75 ed 65 7c 88 01 04 43  ed 00 44 68 c3 74 c1 bc  |u.e|...C..Dh.t..|
+00000460  63 4a cf e9 e5 20 21 0e  da da 09 fd ac c6 1c 7a  |cJ... !........z|
+00000470  69 e4 90 fc e2 3b 12 df  3a 11 f4                 |i....;..:..|
 >>> Flow 3 (client to server)
-00000000  14 03 03 00 01 01 17 03  03 00 35 74 1e 4a 56 2c  |..........5t.JV,|
-00000010  fc 14 0b 66 ab 2f 56 5b  fd 33 fe c2 a4 df 0b 62  |...f./V[.3.....b|
-00000020  63 11 40 67 d2 11 1b 53  c5 b9 1e 0e 20 83 85 b0  |c.@g...S.... ...|
-00000030  3a 81 79 bc a7 9f 49 ab  22 bd 10 8d 3e c9 95 79  |:.y...I."...>..y|
+00000000  14 03 03 00 01 01 17 03  03 00 35 0f c5 0c ac c4  |..........5.....|
+00000010  a9 7e 32 56 fd 68 b8 86  66 8a 66 da 65 0a 5a ee  |.~2V.h..f.f.e.Z.|
+00000020  1a a5 11 ec 1c 42 28 2f  8e a3 98 49 80 a5 9e e3  |.....B(/...I....|
+00000030  5f cf 51 93 44 b2 f2 e0  6e 58 ea c6 50 84 14 ef  |_.Q.D...nX..P...|
 >>> Flow 4 (server to client)
-00000000  17 03 03 00 1e a4 83 3b  61 a1 00 d5 56 84 4c 83  |.......;a...V.L.|
-00000010  0a 8c 86 13 0c e7 95 71  aa 48 e0 d2 5f 11 5f 45  |.......q.H.._._E|
-00000020  41 7a 10 17 03 03 00 13  ca 8b f5 38 e5 5f e0 8a  |Az.........8._..|
-00000030  e3 08 ba 7d 06 f6 b3 b4  6f e9 2b                 |...}....o.+|
+00000000  17 03 03 00 1e 3c 0f a4  3b d6 72 2e 40 dd 5d 79  |.....<..;.r.@.]y|
+00000010  e4 57 25 46 95 76 98 6a  4f aa 75 b5 2f 40 67 2e  |.W%F.v.jO.u./@g.|
+00000020  ff ac 49 17 03 03 00 13  93 90 ac d8 14 54 32 66  |..I..........T2f|
+00000030  fa af 38 24 7c 58 75 62  88 60 34                 |..8$|Xub.`4|
diff --git a/src/crypto/tls/testdata/Server-TLSv13-IssueTicketPreDisable b/src/crypto/tls/testdata/Server-TLSv13-IssueTicketPreDisable
index a939822..abdf41d 100644
--- a/src/crypto/tls/testdata/Server-TLSv13-IssueTicketPreDisable
+++ b/src/crypto/tls/testdata/Server-TLSv13-IssueTicketPreDisable
@@ -1,99 +1,98 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 ce 01 00 00  ca 03 03 cd 51 e4 0b ee  |............Q...|
-00000010  9c 83 0f a1 bd 1a c8 b4  94 17 5e 17 fb 63 43 31  |..........^..cC1|
-00000020  89 86 03 fa 82 d4 bb c5  ba 9d 60 20 a1 0b c7 9c  |..........` ....|
-00000030  b0 3f d9 7a 52 bd c0 3f  cd c5 21 54 40 a5 60 73  |.?.zR..?..!T@.`s|
-00000040  fd ff 07 99 75 59 0d f3  bd 57 f6 81 00 04 13 01  |....uY...W......|
+00000000  16 03 01 00 ce 01 00 00  ca 03 03 1f 69 f6 99 9f  |............i...|
+00000010  ee 81 23 41 5d 81 d6 aa  1b 5a 44 9e 56 78 21 6a  |..#A]....ZD.Vx!j|
+00000020  fa a1 17 9b 6f 97 3d d5  ee 11 7a 20 01 bd 29 e6  |....o.=...z ..).|
+00000030  6b be 9e 23 35 3a ab 47  92 6f 71 b3 69 82 63 7d  |k..#5:.G.oq.i.c}|
+00000040  43 c0 ae eb 05 8e 54 9b  e9 55 ec c2 00 04 13 01  |C.....T..U......|
 00000050  00 ff 01 00 00 7d 00 0b  00 04 03 00 01 02 00 0a  |.....}..........|
 00000060  00 0c 00 0a 00 1d 00 17  00 1e 00 19 00 18 00 23  |...............#|
 00000070  00 00 00 16 00 00 00 17  00 00 00 0d 00 1e 00 1c  |................|
 00000080  04 03 05 03 06 03 08 07  08 08 08 09 08 0a 08 0b  |................|
 00000090  08 04 08 05 08 06 04 01  05 01 06 01 00 2b 00 03  |.............+..|
 000000a0  02 03 04 00 2d 00 02 01  01 00 33 00 26 00 24 00  |....-.....3.&.$.|
-000000b0  1d 00 20 04 16 08 0b 67  76 58 60 4a 32 c2 ea 1b  |.. ....gvX`J2...|
-000000c0  4a 54 fa 55 9b 39 d8 80  c4 eb 42 cc 1a 84 fe d7  |JT.U.9....B.....|
-000000d0  0a 0d 43                                          |..C|
+000000b0  1d 00 20 9c 90 86 ec 0c  c9 4e 43 4d d7 00 3d 39  |.. ......NCM..=9|
+000000c0  50 25 c9 b9 f8 7f cc 6a  39 95 bc f0 1f 0d bc a7  |P%.....j9.......|
+000000d0  21 ff 69                                          |!.i|
 >>> Flow 2 (server to client)
 00000000  16 03 03 00 7a 02 00 00  76 03 03 00 00 00 00 00  |....z...v.......|
 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 a1 0b c7 9c  |........... ....|
-00000030  b0 3f d9 7a 52 bd c0 3f  cd c5 21 54 40 a5 60 73  |.?.zR..?..!T@.`s|
-00000040  fd ff 07 99 75 59 0d f3  bd 57 f6 81 13 01 00 00  |....uY...W......|
+00000020  00 00 00 00 00 00 00 00  00 00 00 20 01 bd 29 e6  |........... ..).|
+00000030  6b be 9e 23 35 3a ab 47  92 6f 71 b3 69 82 63 7d  |k..#5:.G.oq.i.c}|
+00000040  43 c0 ae eb 05 8e 54 9b  e9 55 ec c2 13 01 00 00  |C.....T..U......|
 00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 2f  |..+.....3.$... /|
 00000060  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
 00000070  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74 14  |.........._X.;t.|
-00000080  03 03 00 01 01 17 03 03  00 17 ec 4d 41 82 de 4f  |...........MA..O|
-00000090  c6 cf 1e 56 06 65 0e a4  e7 66 34 1d 89 59 b3 c2  |...V.e...f4..Y..|
-000000a0  0a 17 03 03 02 6d 00 e1  17 f1 b3 5e a7 14 b3 f8  |.....m.....^....|
-000000b0  3a ab 85 d4 80 75 69 01  6c 91 3f 79 ab 8f 51 e0  |:....ui.l.?y..Q.|
-000000c0  f6 a5 65 ab 7e 72 e5 83  99 b2 cb cd f9 5f 27 db  |..e.~r......._'.|
-000000d0  90 70 9c c1 e5 6d 80 3e  59 7c 4d fa f1 23 8a a7  |.p...m.>Y|M..#..|
-000000e0  f4 81 22 32 5b e2 4e d0  eb ab bd 96 05 42 05 5c  |.."2[.N......B.\|
-000000f0  20 5c 8a 3e ca fd b8 aa  dd f2 c4 3e dc 7e a5 ab  | \.>.......>.~..|
-00000100  95 a4 20 03 0e 41 9b 14  55 91 1b 9c 3b 17 bc 2a  |.. ..A..U...;..*|
-00000110  60 c0 ee b1 78 e9 37 c4  65 ef 8c 29 ec d9 10 81  |`...x.7.e..)....|
-00000120  a0 1d c9 ac cf e5 36 90  88 d3 70 6d 59 66 61 a8  |......6...pmYfa.|
-00000130  18 79 ad d8 c7 3e 1f a5  db dc b5 21 83 b0 ae 16  |.y...>.....!....|
-00000140  ce 8e 98 d4 8e 28 c1 d3  d2 ef 51 35 45 41 a7 b4  |.....(....Q5EA..|
-00000150  e1 15 bb 32 10 aa b1 27  be 53 5e 96 ef 0b bd 2f  |...2...'.S^..../|
-00000160  81 66 18 f4 8b 9a cc be  67 c1 32 e3 c0 ea e5 c0  |.f......g.2.....|
-00000170  76 2c 36 7f 91 11 13 c1  a4 04 7e 8e 7b 60 a5 3d  |v,6.......~.{`.=|
-00000180  fa 3c d8 68 9a 7e 4b 23  3d 18 1b a3 34 a9 81 a4  |.<.h.~K#=...4...|
-00000190  00 09 cd 56 eb f2 29 9f  17 8d 48 4d 21 a2 4e ec  |...V..)...HM!.N.|
-000001a0  f0 a0 8d b1 ed d6 c7 01  d0 8e 2f 25 65 9f ac eb  |........../%e...|
-000001b0  44 09 f2 75 db 37 a3 94  cb 70 29 59 37 97 71 63  |D..u.7...p)Y7.qc|
-000001c0  9b fa 0f 0f 33 75 0a 60  4f 78 97 9e 6a 2c 4b df  |....3u.`Ox..j,K.|
-000001d0  54 cc c0 ac 57 4c f3 3a  e3 79 01 b9 c3 8c 37 d2  |T...WL.:.y....7.|
-000001e0  8f d9 e7 cd 33 5a 0c bb  43 7e 39 5f 63 9f a5 11  |....3Z..C~9_c...|
-000001f0  f5 6e e0 95 1f 09 03 56  0f ec b9 7d 08 31 c5 57  |.n.....V...}.1.W|
-00000200  fa a6 57 15 6c 6b 91 d4  9f 5d c2 40 8b 3d 3a 57  |..W.lk...].@.=:W|
-00000210  c2 64 55 bd 88 bb 5e 24  7f fe 79 0c 88 f3 a7 1c  |.dU...^$..y.....|
-00000220  f8 20 6f ba d6 ec fc b2  04 2a d7 b7 17 5e 4c 2e  |. o......*...^L.|
-00000230  24 cd 1b 8a 04 fe 21 e0  5b 90 ec f4 30 df bf fe  |$.....!.[...0...|
-00000240  a8 f9 2b 40 c1 23 15 f2  44 87 9a aa 30 80 70 27  |..+@.#..D...0.p'|
-00000250  80 6f 90 08 b5 47 2e 01  ea 77 3a ba a4 4b 77 8a  |.o...G...w:..Kw.|
-00000260  12 b4 4e e1 a6 04 8a 01  31 60 27 35 bf 76 de 09  |..N.....1`'5.v..|
-00000270  aa 8a c4 c4 21 31 9f eb  c2 92 05 be a1 b5 24 eb  |....!1........$.|
-00000280  71 24 55 f9 aa 5c 62 59  49 bf 42 4c 69 01 4f f7  |q$U..\bYI.BLi.O.|
-00000290  b6 27 14 d4 cc 40 80 13  9b 8b 30 55 1f 32 c1 ee  |.'...@....0U.2..|
-000002a0  51 bd 71 f7 63 3f c2 00  90 60 dc 13 0f 62 c3 06  |Q.q.c?...`...b..|
-000002b0  80 f6 4f cc 44 71 d7 5c  2e 18 82 45 ca 80 b7 0e  |..O.Dq.\...E....|
-000002c0  0c 6f 75 1b 23 cb 86 c1  2d 1e 1b 02 2a 15 fa c7  |.ou.#...-...*...|
-000002d0  b2 af 80 5c 48 c2 b7 12  59 a3 e4 3c ed df 26 d0  |...\H...Y..<..&.|
-000002e0  85 9b 5a 2d 7b 66 e6 c4  b3 fe cd 4d 72 4d fb da  |..Z-{f.....MrM..|
-000002f0  1c 0d 5c fb 2f 8a e3 70  98 ee 95 9c 12 1a fa c7  |..\./..p........|
-00000300  94 7a 8e ca 4d a4 bb 2f  70 3b 67 95 fb 23 fb 8f  |.z..M../p;g..#..|
-00000310  8c 77 4c 17 03 03 00 99  8a 72 14 c7 82 18 d7 ed  |.wL......r......|
-00000320  c7 5d 32 df 44 91 6b 40  3e 0b eb a1 74 da d9 3a  |.]2.D.k@>...t..:|
-00000330  3c 7a 2e 7a 73 3b 63 72  33 c4 c5 27 29 33 f5 30  |<z.zs;cr3..')3.0|
-00000340  cf d3 e7 50 3f 44 33 79  6c 96 ed 80 32 02 5f 6b  |...P?D3yl...2._k|
-00000350  d7 ec d7 67 df 2d 7d bc  2b dd f0 21 39 ef 54 9b  |...g.-}.+..!9.T.|
-00000360  c3 55 1f f9 85 c4 4e 31  ce ba 28 a5 3d 68 64 60  |.U....N1..(.=hd`|
-00000370  9e 0a 99 76 a3 25 7c d6  4f 30 37 48 b4 93 6a 4f  |...v.%|.O07H..jO|
-00000380  ff 0b df 83 ac 6f 27 9e  ec d0 01 17 03 b9 a8 74  |.....o'........t|
-00000390  b9 b4 4c 59 ae da de 8a  18 16 54 18 ac 69 01 20  |..LY......T..i. |
-000003a0  6c f3 0b 93 8d 8c e7 70  79 d5 be 80 5e 87 5a 9c  |l......py...^.Z.|
-000003b0  86 17 03 03 00 35 a7 cf  76 44 4f 48 f3 8c 9b 43  |.....5..vDOH...C|
-000003c0  a2 4e bf c5 e3 e7 08 43  d1 a4 4d 92 b3 3b f4 0a  |.N.....C..M..;..|
-000003d0  06 2f b0 84 43 39 8e 29  a9 42 5d 63 c1 b2 f3 2d  |./..C9.).B]c...-|
-000003e0  0e 57 8e c6 39 aa 29 45  d3 7e 78 17 03 03 00 93  |.W..9.)E.~x.....|
-000003f0  af 0d 9c 38 bd aa 63 fc  de 80 59 28 32 11 0f f5  |...8..c...Y(2...|
-00000400  91 57 cd 15 f7 21 37 43  71 d8 32 7d 14 4b d2 28  |.W...!7Cq.2}.K.(|
-00000410  03 45 12 b5 cf f2 55 02  ae 47 34 ac f0 4c 6e d6  |.E....U..G4..Ln.|
-00000420  30 e4 eb 22 08 a8 10 8c  bb 40 6e ec 96 68 b5 6b  |0..".....@n..h.k|
-00000430  c2 a0 eb fb 53 49 4c 1d  73 b5 4d 80 18 b2 e4 af  |....SIL.s.M.....|
-00000440  8b fa 85 f4 48 d4 e6 51  58 16 04 87 53 5c ff 93  |....H..QX...S\..|
-00000450  3d a8 e4 79 7e 82 79 e9  1f 6a dc ba 43 6f 15 b6  |=..y~.y..j..Co..|
-00000460  35 1b 84 72 a3 4c 65 3d  f3 71 45 0b dc b9 74 13  |5..r.Le=.qE...t.|
-00000470  ed ce 9c fc dd b3 8c d8  ce 84 3e 95 d2 7e 62 60  |..........>..~b`|
-00000480  5d 0a 82                                          |]..|
+00000080  03 03 00 01 01 17 03 03  00 17 05 f8 de 75 03 3e  |.............u.>|
+00000090  8f 8d df 8d c4 31 5e 59  2b a6 26 2c 81 86 e0 93  |.....1^Y+.&,....|
+000000a0  98 17 03 03 02 6d 73 67  7c 14 ba 17 23 fc f1 2e  |.....msg|...#...|
+000000b0  53 5b 47 58 e2 ed b3 6a  30 70 40 98 82 4b 43 0d  |S[GX...j0p@..KC.|
+000000c0  f6 e4 74 09 c8 08 9e a2  6d 23 3c 81 64 a9 39 e4  |..t.....m#<.d.9.|
+000000d0  be cc 6e 4c f1 df 7c b1  a5 cd 91 7c e7 e0 e9 97  |..nL..|....|....|
+000000e0  a3 06 20 92 7c 1c f6 e1  93 cd b2 65 ba 10 c0 54  |.. .|......e...T|
+000000f0  32 89 60 7e 6f ac 29 7f  df e8 ff d2 0f 0d 8a f8  |2.`~o.).........|
+00000100  2a 56 fd 4a 07 27 f1 cc  c1 81 fb bd 5e 33 92 34  |*V.J.'......^3.4|
+00000110  24 e9 a6 7f ff 76 e4 19  82 ca b8 92 aa 98 9c ac  |$....v..........|
+00000120  51 25 fc 3a 74 f6 f3 36  b4 ae 00 cd d9 e0 17 c4  |Q%.:t..6........|
+00000130  9f 56 67 d0 ab 22 a1 38  57 a9 58 66 b4 f8 60 0b  |.Vg..".8W.Xf..`.|
+00000140  20 c4 0c d0 f1 bc ce 4d  20 d2 e0 6f 1e f2 dd f0  | ......M ..o....|
+00000150  14 98 5c 33 92 08 af a9  42 ec 9e 8d 6e 92 cf 87  |..\3....B...n...|
+00000160  b7 79 90 18 1b 3b 78 77  1e 55 c7 68 9b 98 ae ae  |.y...;xw.U.h....|
+00000170  33 d8 50 b8 3d fa 6b 96  99 7a b5 ca 98 fa a9 21  |3.P.=.k..z.....!|
+00000180  46 6a a1 74 bf bc 2f 51  0e 66 e2 35 2c d3 c9 3c  |Fj.t../Q.f.5,..<|
+00000190  06 d0 79 31 00 d2 0a 1d  77 dd da 07 3a 31 7c 51  |..y1....w...:1|Q|
+000001a0  5e 53 b0 fe 55 21 1c 6c  fa d2 a3 71 18 1d 8f ec  |^S..U!.l...q....|
+000001b0  a3 ab 89 10 19 6d 45 50  9e f8 bf aa 3a 91 3b 80  |.....mEP....:.;.|
+000001c0  68 33 c0 d2 4c 10 39 b6  01 79 aa 27 a5 3e e7 59  |h3..L.9..y.'.>.Y|
+000001d0  6e fa c3 16 68 7f 7e ce  05 b0 96 e9 dd 2c 4a 7b  |n...h.~......,J{|
+000001e0  5e 63 65 e6 6f f1 05 95  40 e3 71 15 c6 bd ec 60  |^ce.o...@.q....`|
+000001f0  01 08 2b 23 d6 be c6 7f  00 aa 32 78 cb 77 d8 5c  |..+#......2x.w.\|
+00000200  e5 b6 b8 be 08 84 1a 47  57 b7 d8 72 27 e7 f6 08  |.......GW..r'...|
+00000210  7b 8a fa d8 a6 06 15 68  cc 90 a4 fe 8e 25 5c cb  |{......h.....%\.|
+00000220  03 e8 ab 19 32 05 f4 88  d9 11 03 72 48 a3 a9 b2  |....2......rH...|
+00000230  41 d3 60 80 d5 93 ae 18  1e 3d ed a7 ac 7f a6 eb  |A.`......=......|
+00000240  3c 5c 78 11 fb a6 b8 00  d6 7b 98 67 d5 fd 7c 87  |<\x......{.g..|.|
+00000250  80 b9 a4 23 71 31 93 77  98 90 fc 29 95 f4 6d 09  |...#q1.w...)..m.|
+00000260  87 2e 4b e7 a7 98 af 72  10 c2 dd 05 6e 60 b9 4c  |..K....r....n`.L|
+00000270  33 65 cf 26 fc 7d 81 cc  f0 4d 83 34 11 d2 0f 13  |3e.&.}...M.4....|
+00000280  7f 97 4a 12 17 44 fc 9a  32 08 de eb 5e 2a 87 d6  |..J..D..2...^*..|
+00000290  ed 7f ea 2a ed e3 2d 7a  ea 19 40 7c 6e a2 13 e6  |...*..-z..@|n...|
+000002a0  ff 9b f6 3c ff 5e 97 9c  de f8 c3 52 cb d8 d2 b0  |...<.^.....R....|
+000002b0  45 45 6e 63 d4 9f bf a5  7c c8 f4 65 84 ff 62 30  |EEnc....|..e..b0|
+000002c0  71 d4 65 a8 9e 43 e2 73  12 e9 d0 58 8c 1a 6e 0c  |q.e..C.s...X..n.|
+000002d0  2f 64 02 4d 1f 4f c0 69  d8 d5 44 97 7b 8a 09 d4  |/d.M.O.i..D.{...|
+000002e0  8f 68 13 68 b9 7f 7b d8  29 b8 d7 3a 8f 78 eb 73  |.h.h..{.)..:.x.s|
+000002f0  1b eb 1b 2d 7e 46 78 0b  ad 89 e5 d9 69 4b 1c 46  |...-~Fx.....iK.F|
+00000300  e7 13 c3 0d 54 f0 70 f8  99 60 45 78 fc a3 fc 72  |....T.p..`Ex...r|
+00000310  ca 84 57 17 03 03 00 99  05 02 eb 76 1b 1a f0 aa  |..W........v....|
+00000320  dd 0d 91 1e 0b c1 14 1c  6f 5e 9b b3 33 8c 70 87  |........o^..3.p.|
+00000330  f2 0e 1e 45 0e 36 1a 06  77 97 a1 95 cd d1 ec 3e  |...E.6..w......>|
+00000340  24 f9 b2 d5 47 5a c8 99  49 ca 59 bc 1d 6a 16 e7  |$...GZ..I.Y..j..|
+00000350  9a 51 c8 9a f7 ab b9 e4  fe 1e 22 1f ed c8 bf 1a  |.Q........".....|
+00000360  8e 06 6a 07 4a c7 ef 57  f9 4a 84 1c 4b 1b 60 24  |..j.J..W.J..K.`$|
+00000370  5a d7 c0 34 57 68 1c fd  3f 2a 0a 17 9a 1f 70 19  |Z..4Wh..?*....p.|
+00000380  08 ff c5 33 79 4e 85 fb  8c 8d 76 6c be 8c 9c bf  |...3yN....vl....|
+00000390  7a ac 87 8a d1 ea d0 a4  1e 25 64 ae 63 e7 29 59  |z........%d.c.)Y|
+000003a0  d8 27 88 4c e2 c7 42 9d  08 75 62 49 df fa 84 e8  |.'.L..B..ubI....|
+000003b0  11 17 03 03 00 35 39 db  59 c8 ab 08 33 da 2c 19  |.....59.Y...3.,.|
+000003c0  04 10 bb 18 b3 10 78 4b  2c a2 2b a2 e2 67 d1 6f  |......xK,.+..g.o|
+000003d0  07 9c 0b d2 e1 24 a8 ac  7b ce 77 55 7d b8 b3 9b  |.....$..{.wU}...|
+000003e0  82 7f bc 18 7a 61 a8 28  e2 a9 1e 17 03 03 00 8b  |....za.(........|
+000003f0  6e a6 11 39 b9 d7 7b a0  67 76 c2 a6 d0 e4 c4 ba  |n..9..{.gv......|
+00000400  a3 3d 37 bb 6d 82 5e 2e  80 e8 e6 4b 98 89 69 e9  |.=7.m.^....K..i.|
+00000410  27 cb c9 83 a5 2b a4 78  00 dd 46 4d 45 f7 4e a7  |'....+.x..FME.N.|
+00000420  3b c2 e1 84 5c ff af 75  25 1a 52 c4 b6 29 48 bb  |;...\..u%.R..)H.|
+00000430  31 30 e2 8c ac f0 e8 bd  78 26 f2 d1 d6 1e d5 3e  |10......x&.....>|
+00000440  6d 61 7e 80 e5 bc 81 28  e3 1f 62 40 0e 31 0b e1  |ma~....(..b@.1..|
+00000450  23 1c e1 fa 32 94 c3 4e  1d 09 81 d9 b6 89 c4 9c  |#...2..N........|
+00000460  5e 38 85 ab 38 29 03 42  ea c0 94 d7 65 40 1f 1d  |^8..8).B....e@..|
+00000470  49 39 9a e9 76 92 38 2f  17 8b ee                 |I9..v.8/...|
 >>> Flow 3 (client to server)
-00000000  14 03 03 00 01 01 17 03  03 00 35 35 fd 9a 7d 02  |..........55..}.|
-00000010  fb b2 eb fa 51 27 3e 80  ab 60 f6 a1 54 31 13 2f  |....Q'>..`..T1./|
-00000020  02 b9 19 ac 68 be 25 69  b3 c4 48 87 42 75 b0 93  |....h.%i..H.Bu..|
-00000030  66 3e 2e 0b 79 4f 0b 3a  59 ef 89 83 65 c9 10 9b  |f>..yO.:Y...e...|
+00000000  14 03 03 00 01 01 17 03  03 00 35 e1 c3 64 6d 3b  |..........5..dm;|
+00000010  7d 3c d3 c6 ee 3a f9 cc  a6 29 18 3a 7b bd b1 07  |}<...:...).:{...|
+00000020  01 b4 06 8d fe a0 6e 23  40 52 5a f1 a3 4c 59 0a  |......n#@RZ..LY.|
+00000030  ea b5 e3 7f e3 b9 0e e5  70 8a 47 a1 1e 2a 00 03  |........p.G..*..|
 >>> Flow 4 (server to client)
-00000000  17 03 03 00 1e 58 0f 73  e3 ba ff d3 19 0d 89 c9  |.....X.s........|
-00000010  94 8a fb 24 02 58 2a 2c  eb 69 29 4e 57 d3 d2 5e  |...$.X*,.i)NW..^|
-00000020  ba b2 75 17 03 03 00 13  9c 5c 46 44 71 dc 68 b8  |..u......\FDq.h.|
-00000030  39 cc e1 fd 2d 2a a1 a9  50 6c af                 |9...-*..Pl.|
+00000000  17 03 03 00 1e 4e a9 f3  57 a0 f8 b2 0b dd 8e 90  |.....N..W.......|
+00000010  61 96 d9 53 c8 69 87 65  fd f4 fb ae 55 95 0d 07  |a..S.i.e....U...|
+00000020  69 e3 29 17 03 03 00 13  02 ba 24 dc 82 fc 91 9f  |i.).......$.....|
+00000030  91 ff b9 6e 71 8e e3 2d  2f e8 8f                 |...nq..-/..|
diff --git a/src/crypto/tls/testdata/Server-TLSv13-P256 b/src/crypto/tls/testdata/Server-TLSv13-P256
index dd8e0f4..c3a2ee0 100644
--- a/src/crypto/tls/testdata/Server-TLSv13-P256
+++ b/src/crypto/tls/testdata/Server-TLSv13-P256
@@ -1,102 +1,101 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 e3 01 00 00  df 03 03 c8 5f 11 a2 29  |............_..)|
-00000010  7b c3 b7 72 5e ba e1 c5  83 45 c8 87 e1 51 27 d9  |{..r^....E...Q'.|
-00000020  33 0e 68 e0 71 76 9e 8f  4e f4 da 20 da fd c6 1d  |3.h.qv..N.. ....|
-00000030  46 55 42 89 0a 80 e0 d3  e4 dd db 7d b1 3a 76 a3  |FUB........}.:v.|
-00000040  5b d9 2a c7 f1 1a 3b 0b  8c 24 dd 4d 00 04 13 03  |[.*...;..$.M....|
+00000000  16 03 01 00 e3 01 00 00  df 03 03 18 3b 05 4d 40  |............;.M@|
+00000010  41 61 2a 64 35 7a e4 a7  c2 8b ab e5 e3 90 04 6d  |Aa*d5z.........m|
+00000020  18 75 15 88 88 c7 af ba  05 e7 9c 20 78 e2 6d 28  |.u......... x.m(|
+00000030  fb 06 f6 e8 33 cd cc ba  db 53 6d 4e 28 54 ca 62  |....3....SmN(T.b|
+00000040  c8 44 e3 cc 58 b5 07 ec  84 c9 e6 45 00 04 13 03  |.D..X......E....|
 00000050  00 ff 01 00 00 92 00 0b  00 04 03 00 01 02 00 0a  |................|
 00000060  00 04 00 02 00 17 00 16  00 00 00 17 00 00 00 0d  |................|
 00000070  00 1e 00 1c 04 03 05 03  06 03 08 07 08 08 08 09  |................|
 00000080  08 0a 08 0b 08 04 08 05  08 06 04 01 05 01 06 01  |................|
 00000090  00 2b 00 03 02 03 04 00  2d 00 02 01 01 00 33 00  |.+......-.....3.|
-000000a0  47 00 45 00 17 00 41 04  04 48 71 9f a6 06 17 16  |G.E...A..Hq.....|
-000000b0  04 d2 b4 e7 6b 5c cf d8  9f ca 64 a7 39 9e 1a 22  |....k\....d.9.."|
-000000c0  aa fc b5 4c d9 d3 b3 37  e3 d4 e1 3b 5b 00 74 df  |...L...7...;[.t.|
-000000d0  df e5 29 8f 7c f7 6b 02  f0 e7 fb 9b 43 6a 41 fb  |..).|.k.....CjA.|
-000000e0  77 5b c2 6e 99 48 69 78                           |w[.n.Hix|
+000000a0  47 00 45 00 17 00 41 04  a1 27 f2 a0 16 66 17 e9  |G.E...A..'...f..|
+000000b0  73 ff 49 d4 99 47 19 b6  c1 ea 67 ea ef fd ad 07  |s.I..G....g.....|
+000000c0  c8 f4 19 e8 16 da a2 d0  bc c2 cc 58 c8 e4 d0 89  |...........X....|
+000000d0  c6 75 8f ac 87 e0 d6 4a  44 fa 14 c5 d6 ac ce d8  |.u.....JD.......|
+000000e0  8f 1d 5f d0 06 96 6c bb                           |.._...l.|
 >>> Flow 2 (server to client)
 00000000  16 03 03 00 9b 02 00 00  97 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 20 da fd c6 1d  |........... ....|
-00000030  46 55 42 89 0a 80 e0 d3  e4 dd db 7d b1 3a 76 a3  |FUB........}.:v.|
-00000040  5b d9 2a c7 f1 1a 3b 0b  8c 24 dd 4d 13 03 00 00  |[.*...;..$.M....|
+00000020  00 00 00 00 00 00 00 00  00 00 00 20 78 e2 6d 28  |........... x.m(|
+00000030  fb 06 f6 e8 33 cd cc ba  db 53 6d 4e 28 54 ca 62  |....3....SmN(T.b|
+00000040  c8 44 e3 cc 58 b5 07 ec  84 c9 e6 45 13 03 00 00  |.D..X......E....|
 00000050  4f 00 2b 00 02 03 04 00  33 00 45 00 17 00 41 04  |O.+.....3.E...A.|
 00000060  1e 18 37 ef 0d 19 51 88  35 75 71 b5 e5 54 5b 12  |..7...Q.5uq..T[.|
 00000070  2e 8f 09 67 fd a7 24 20  3e b2 56 1c ce 97 28 5e  |...g..$ >.V...(^|
 00000080  f8 2b 2d 4f 9e f1 07 9f  6c 4b 5b 83 56 e2 32 42  |.+-O....lK[.V.2B|
 00000090  e9 58 b6 d7 49 a6 b5 68  1a 41 03 56 6b dc 5a 89  |.X..I..h.A.Vk.Z.|
-000000a0  14 03 03 00 01 01 17 03  03 00 17 81 b8 e3 25 04  |..............%.|
-000000b0  6c d8 f6 7c 04 a1 2c 8b  1f 0d cb de 29 1b e1 a3  |l..|..,.....)...|
-000000c0  6f 8c 17 03 03 02 6d 81  db bc b4 f8 02 f3 c5 4e  |o.....m........N|
-000000d0  9e f7 5f 55 54 3e 25 a9  2f 03 06 62 2f 1e 7e d4  |.._UT>%./..b/.~.|
-000000e0  19 27 88 1e ac f2 44 87  29 84 08 69 2f 5d a3 ca  |.'....D.)..i/]..|
-000000f0  de 8f 98 ad 25 6b c5 94  62 34 44 95 bc 17 ed e6  |....%k..b4D.....|
-00000100  fe 89 9c ef 46 c9 cb ee  16 d4 42 b6 d3 50 7b 3a  |....F.....B..P{:|
-00000110  51 d8 20 23 02 3e 69 a8  1a 80 eb bf 7c 82 2b 1f  |Q. #.>i.....|.+.|
-00000120  10 5a 30 85 dd bc ff 65  4d c6 4f 7b bc 3d 64 e2  |.Z0....eM.O{.=d.|
-00000130  93 2a 05 a0 af de b1 41  48 85 db 98 c9 a9 96 5c  |.*.....AH......\|
-00000140  64 a4 70 2e f9 4e de 38  9f 48 f7 eb 6e 14 42 3f  |d.p..N.8.H..n.B?|
-00000150  9f 86 0f 2d 70 6a 30 96  1c dd c6 11 28 6f 86 b6  |...-pj0.....(o..|
-00000160  da bb 5b 76 c8 56 18 4a  67 bf 59 db 56 46 f0 c7  |..[v.V.Jg.Y.VF..|
-00000170  80 2b 0f 0c 8a 02 58 a1  13 aa 2e 5d 61 e2 d5 23  |.+....X....]a..#|
-00000180  3c 1c 75 06 e4 e4 e1 39  eb 65 6a ff 38 21 28 c9  |<.u....9.ej.8!(.|
-00000190  c5 8b a5 12 21 18 2a 59  e7 4e 66 53 be d3 49 97  |....!.*Y.NfS..I.|
-000001a0  f9 b1 7d e2 75 44 37 38  36 35 af 78 27 f4 74 e0  |..}.uD7865.x'.t.|
-000001b0  45 ca fd 79 3c 39 65 00  46 58 4b 8b db f9 6e c0  |E..y<9e.FXK...n.|
-000001c0  69 ec 1e 25 87 66 e1 b8  d8 cc 16 5b 16 9e 90 2e  |i..%.f.....[....|
-000001d0  16 0c 8f 25 04 cf 40 c8  50 dd c4 63 19 8f f1 76  |...%..@.P..c...v|
-000001e0  5e fa 24 1d 8a d2 c1 d4  98 49 48 f0 e6 fa f3 6e  |^.$......IH....n|
-000001f0  63 0b a5 7a 2f f2 f0 47  0b c0 89 9f 7b 9f ef 48  |c..z/..G....{..H|
-00000200  df fd 38 5d a9 71 ce 0c  3c 6f 88 0b 1b d3 93 8c  |..8].q..<o......|
-00000210  14 9a ff 8a db 3f 07 f7  46 54 fe c0 8c 06 7f e0  |.....?..FT......|
-00000220  de e9 c8 3c 4b cd 7b c3  59 11 63 01 8e 69 40 00  |...<K.{.Y.c..i@.|
-00000230  d5 e0 4c 01 00 12 89 3a  98 e3 3f e1 a3 69 f6 ee  |..L....:..?..i..|
-00000240  e7 94 65 b1 61 58 08 07  4a d5 ab aa 43 3e cf 02  |..e.aX..J...C>..|
-00000250  96 5a 3c 97 8e 7b 47 b8  f0 58 16 12 05 69 69 a1  |.Z<..{G..X...ii.|
-00000260  36 7b ff dd 92 60 26 e2  f9 53 4c 3a 25 ac 88 dd  |6{...`&..SL:%...|
-00000270  9a 81 7c 1f 58 27 33 14  68 44 06 e2 01 14 94 99  |..|.X'3.hD......|
-00000280  00 05 8f 64 47 ca 95 fa  92 57 a9 1a 53 d5 47 52  |...dG....W..S.GR|
-00000290  e8 c4 aa eb 0a f5 1b a9  09 72 92 37 f5 8d 90 b8  |.........r.7....|
-000002a0  4b 08 7f 55 19 2d a7 d8  7b d9 ba 7f 5e 56 bb 80  |K..U.-..{...^V..|
-000002b0  c7 d0 49 99 ae ce 2f a4  f0 ab d1 bd ba f3 0f 85  |..I.../.........|
-000002c0  f1 68 c1 9d 2a 37 ff de  a4 0a 6f 58 27 1d 1d 2b  |.h..*7....oX'..+|
-000002d0  87 9d 52 d3 70 37 a6 03  cd 77 61 9b 56 64 49 62  |..R.p7...wa.VdIb|
-000002e0  ef a1 ed fe 75 1a 61 4a  58 01 d6 80 2f ab ab fc  |....u.aJX.../...|
-000002f0  b2 49 1f 51 b7 51 29 c1  a1 39 fc f4 0a 9b 0d 76  |.I.Q.Q)..9.....v|
-00000300  c6 d0 89 c9 8f 88 e9 ec  13 90 78 4f 0c f5 c9 7e  |..........xO...~|
-00000310  d5 b3 13 ad 35 6d 53 d0  88 50 e8 47 15 a0 ca fc  |....5mS..P.G....|
-00000320  5f 6e 98 23 46 6a 69 84  3c a9 3f eb d1 05 f5 97  |_n.#Fji.<.?.....|
-00000330  11 39 7f 39 17 03 03 00  99 84 8e 37 a9 57 78 12  |.9.9.......7.Wx.|
-00000340  8e 9a e7 8e 45 ee 55 61  66 24 ed 5a 36 19 e3 1c  |....E.Uaf$.Z6...|
-00000350  22 3b 8b c0 4b c9 cd 2c  4c 17 d2 a9 40 2c 02 40  |";..K..,L...@,.@|
-00000360  74 ba 11 de a5 d4 01 11  ae 9d 71 76 4c f0 87 0f  |t.........qvL...|
-00000370  5e 75 c0 67 c0 33 e7 3e  9b d3 a4 21 e8 40 a6 9f  |^u.g.3.>...!.@..|
-00000380  d8 24 a7 d7 c1 99 cc 8d  33 10 91 0a 41 a6 05 1c  |.$......3...A...|
-00000390  85 4c c5 a8 c9 dd 74 d0  5c 67 2e 2a 50 4e 30 c7  |.L....t.\g.*PN0.|
-000003a0  bb fa f8 65 ee 48 23 f5  c5 d3 a1 ec 4d 3f ac 4b  |...e.H#.....M?.K|
-000003b0  ef 1e 8d 84 07 b9 69 2a  34 51 73 ba fb b5 7d 64  |......i*4Qs...}d|
-000003c0  1f fc 0e c8 33 d9 77 5e  41 00 65 25 ea 75 75 c9  |....3.w^A.e%.uu.|
-000003d0  2b 03 17 03 03 00 35 54  c2 06 55 7c 6f 92 8a d2  |+.....5T..U|o...|
-000003e0  d5 35 0c 4b 0d df cb d7  6e 5d 64 e1 2e cf 50 b8  |.5.K....n]d...P.|
-000003f0  d8 04 9a f4 ce 69 d3 ac  bb 47 cd 57 ac 07 aa 40  |.....i...G.W...@|
-00000400  e3 fc 01 bc d6 a1 0e 16  4e 6b 04 cc 17 03 03 00  |........Nk......|
-00000410  93 b2 c3 64 29 13 07 75  b4 c4 84 f7 0e 99 d9 9f  |...d)..u........|
-00000420  8d 5b fd 26 07 42 48 33  3a ab 6f 7d 07 8b f6 8a  |.[.&.BH3:.o}....|
-00000430  22 a4 ce 64 0f 69 ea 61  95 70 6d d3 f8 5f 8b ad  |"..d.i.a.pm.._..|
-00000440  02 43 94 41 51 f4 f8 0b  52 fc 58 c1 23 5e 22 a7  |.C.AQ...R.X.#^".|
-00000450  74 49 a1 46 e8 29 ab d6  ae 02 a4 7b e4 23 f1 89  |tI.F.).....{.#..|
-00000460  1c b1 74 86 92 1b 6a 7c  2f 55 2b 89 f6 01 fc e2  |..t...j|/U+.....|
-00000470  d6 15 b9 b1 64 1c 4a af  f8 fe 3e e0 76 0f cf 08  |....d.J...>.v...|
-00000480  e1 2c db f6 1c 77 6f e4  a4 80 ad 13 74 3d 02 52  |.,...wo.....t=.R|
-00000490  a1 ff 3e 85 1d d3 77 bc  f2 48 73 1c 45 09 62 34  |..>...w..Hs.E.b4|
-000004a0  80 09 21 41                                       |..!A|
+000000a0  14 03 03 00 01 01 17 03  03 00 17 ab 5f 7d 4f ab  |............_}O.|
+000000b0  25 00 54 5f b7 5a f9 e3  f8 ce c1 79 9f db 25 bd  |%.T_.Z.....y..%.|
+000000c0  23 17 17 03 03 02 6d 2f  59 02 6a af c5 7d a1 e1  |#.....m/Y.j..}..|
+000000d0  b3 f8 4d 80 c5 9f 54 2f  27 4c a0 c0 0d dd 0e b5  |..M...T/'L......|
+000000e0  5b 2c a4 54 f3 25 65 aa  3e 43 fb 5b de 15 76 51  |[,.T.%e.>C.[..vQ|
+000000f0  f0 5f a0 8f ce 3d 2b 27  de 0e cb af 97 65 7a 81  |._...=+'.....ez.|
+00000100  a3 d2 a1 f1 44 75 04 12  41 48 b0 70 7a b7 ce ba  |....Du..AH.pz...|
+00000110  de b5 ba 49 a4 25 08 6c  90 cb 82 b9 74 02 cf 09  |...I.%.l....t...|
+00000120  f0 83 77 a3 a4 30 ea 49  fb 61 ea 89 f6 96 b8 c1  |..w..0.I.a......|
+00000130  8a 5d a6 3d f4 f8 66 9c  3f d8 66 90 b2 93 7c 5e  |.].=..f.?.f...|^|
+00000140  3e 9d d7 4c bc 4a 2e ef  d9 d1 00 db fd 83 f3 43  |>..L.J.........C|
+00000150  a4 d7 fa 84 dd 4f a4 44  2f d2 b7 4f 5e ab a2 0e  |.....O.D/..O^...|
+00000160  86 ab 65 8d 3c 63 a2 e4  55 ce b5 72 3f 77 e8 a7  |..e.<c..U..r?w..|
+00000170  40 c7 04 4d a8 4a 38 a4  5c 6d 15 a1 3b 0c cc 2a  |@..M.J8.\m..;..*|
+00000180  7e 67 02 3b 58 95 bc e8  85 6c 81 45 81 44 a9 dd  |~g.;X....l.E.D..|
+00000190  b0 26 71 73 29 a6 1a 40  2f 5c 81 af f0 cc 2d bf  |.&qs)..@/\....-.|
+000001a0  1e fc 2e b2 7a 3a 07 22  72 25 dc d3 d1 8f 38 07  |....z:."r%....8.|
+000001b0  63 2f 18 f5 da b0 91 66  a1 47 16 ad 76 82 98 07  |c/.....f.G..v...|
+000001c0  6f a7 c8 79 43 73 4c 8c  2b 5d af 5a 7c c2 19 18  |o..yCsL.+].Z|...|
+000001d0  8d ee e2 ba fc 07 9b df  7e 17 af 54 c4 1f d8 a1  |........~..T....|
+000001e0  bd 66 93 e3 80 7e 9d a3  43 46 34 eb f9 9e 0b 77  |.f...~..CF4....w|
+000001f0  24 52 a8 85 8c 29 0b 53  0d 8b bf ba eb 8b f7 39  |$R...).S.......9|
+00000200  e4 81 95 fd e0 0d e3 de  05 31 48 37 dc 41 45 4e  |.........1H7.AEN|
+00000210  77 d1 bd f6 a8 b9 1f 82  c2 51 3f 8b d0 7e 8d 4a  |w........Q?..~.J|
+00000220  7c 13 f3 f4 cd 95 b3 51  14 80 7e 6e 41 63 de 3d  ||......Q..~nAc.=|
+00000230  f0 51 22 a4 47 43 9a 73  d2 22 58 67 47 df 1c 37  |.Q".GC.s."XgG..7|
+00000240  d7 30 ff 49 de 8b 30 1b  a9 9e c9 f1 e0 3e 19 5f  |.0.I..0......>._|
+00000250  da 15 87 69 99 e1 64 2c  fc 6b 07 61 9d ca 2f 8f  |...i..d,.k.a../.|
+00000260  b2 d4 bb a4 0e ec e2 66  eb ca aa b2 fe 91 eb 2f  |.......f......./|
+00000270  b0 d9 98 bb 9e 36 e1 e0  1f 89 5d cd 87 c8 28 85  |.....6....]...(.|
+00000280  ef c9 4a 57 6e 45 ca 07  02 be 30 1b 74 0a e4 4d  |..JWnE....0.t..M|
+00000290  2c c1 77 fe 42 73 63 e6  e4 11 15 5b c4 df 40 f7  |,.w.Bsc....[..@.|
+000002a0  83 b5 43 50 f2 a1 04 fe  b1 0e 49 63 8c 73 ab b8  |..CP......Ic.s..|
+000002b0  b4 31 d7 5e d3 50 c4 2a  a8 51 2b 81 c3 80 70 22  |.1.^.P.*.Q+...p"|
+000002c0  af d3 1f 36 ba b5 b3 d9  d9 49 17 8f d8 f7 a2 05  |...6.....I......|
+000002d0  6d 5e 46 7b 40 be 86 58  0e 90 42 46 91 6e 0d d7  |m^F{@..X..BF.n..|
+000002e0  7e f0 7f e9 5b 6e 9c d8  b5 fe 3b 8e 03 57 0a 9b  |~...[n....;..W..|
+000002f0  72 ee 5c 49 50 79 0e 75  8f 84 dd e8 2e 8d d6 37  |r.\IPy.u.......7|
+00000300  ad a8 f4 47 a6 e4 c9 e4  3b a5 7c 7f 2a 36 c5 39  |...G....;.|.*6.9|
+00000310  32 77 e1 7b a9 e7 47 b9  f2 a6 6b 75 ab 90 63 66  |2w.{..G...ku..cf|
+00000320  8d 50 62 d3 76 07 65 aa  57 87 bb a6 01 fc cb 93  |.Pb.v.e.W.......|
+00000330  c8 ed b8 64 17 03 03 00  99 1b b1 7a 13 30 73 85  |...d.......z.0s.|
+00000340  5a a4 81 29 0b 66 58 57  93 d9 24 f9 2e f9 8d cd  |Z..).fXW..$.....|
+00000350  18 d7 48 16 8d d5 95 68  42 d0 c1 1d 08 6d 12 85  |..H....hB....m..|
+00000360  ed 3d 0f a7 33 86 d9 92  fe 02 58 ce 74 7d 5c 04  |.=..3.....X.t}\.|
+00000370  12 3d af 89 c5 83 1e cd  6b 25 3a c2 c1 50 23 9a  |.=......k%:..P#.|
+00000380  f7 0f 7f c4 d8 a3 a4 99  50 a0 56 81 30 09 93 db  |........P.V.0...|
+00000390  7a eb 51 2f 65 f3 96 95  eb be 92 c6 47 57 d4 d7  |z.Q/e.......GW..|
+000003a0  cf 7c 97 19 1f 87 76 8e  41 16 af 2d 3e af 1c 1d  |.|....v.A..->...|
+000003b0  ee 0d 51 99 5b 59 e4 03  3c cb ad 18 a1 3a ae 18  |..Q.[Y..<....:..|
+000003c0  10 f2 f0 38 8f ee a0 8a  65 fd 10 ac 64 ac a8 72  |...8....e...d..r|
+000003d0  cf 54 17 03 03 00 35 bc  e8 03 81 94 22 f7 a9 16  |.T....5....."...|
+000003e0  0e 65 d4 7e 8d 18 58 b0  3c 18 97 35 0e 73 bf d0  |.e.~..X.<..5.s..|
+000003f0  65 dc 63 d7 e6 51 f6 52  75 22 f0 cf f7 70 1e ae  |e.c..Q.Ru"...p..|
+00000400  cd 4c fb 1e 21 97 ea db  07 36 8a d3 17 03 03 00  |.L..!....6......|
+00000410  8b 73 a1 d3 6c f8 7d d5  c0 79 dc 30 e4 40 f8 2a  |.s..l.}..y.0.@.*|
+00000420  60 57 69 61 b9 cb 81 9f  de 74 7c c1 ee d2 bd f5  |`Wia.....t|.....|
+00000430  bf 22 99 17 e3 05 25 3c  94 22 ee e6 6b 01 6a e9  |."....%<."..k.j.|
+00000440  39 8b 9a 08 4e 2a a8 7d  96 ae 6d 43 25 e0 03 11  |9...N*.}..mC%...|
+00000450  07 84 fb 47 fa ff 13 8f  0d a2 7e e8 a5 5d 76 e5  |...G......~..]v.|
+00000460  07 10 7d 6d f4 64 d4 54  ff 45 d9 17 18 5f e2 dd  |..}m.d.T.E..._..|
+00000470  54 ef 32 4a 69 7c 4a 16  06 6d 21 dc 67 0a 84 33  |T.2Ji|J..m!.g..3|
+00000480  13 65 86 99 0d 09 33 59  96 d8 5a 6c f4 b1 c7 8c  |.e....3Y..Zl....|
+00000490  fc bf 2b 8e e2 ee 63 28  62 bd 73 fb              |..+...c(b.s.|
 >>> Flow 3 (client to server)
-00000000  14 03 03 00 01 01 17 03  03 00 35 ab dd 69 66 c8  |..........5..if.|
-00000010  f9 eb e6 e6 b0 a9 9b 10  1d fc ad 89 ad 4d f5 2b  |.............M.+|
-00000020  e4 d7 12 5b 1c 1e 81 12  df 24 ba ea 6b 3e 6f 82  |...[.....$..k>o.|
-00000030  dd 2f 38 a1 65 07 55 6a  4f 8e 99 5d 4f 35 b8 5d  |./8.e.UjO..]O5.]|
+00000000  14 03 03 00 01 01 17 03  03 00 35 4c 7a 0a 1d 11  |..........5Lz...|
+00000010  7c 9f 98 44 c7 f6 03 8b  9f 7b b1 dc 25 18 c2 f0  ||..D.....{..%...|
+00000020  17 b4 8c 83 68 11 0e 95  7e ce 9c ad 13 cb 79 63  |....h...~.....yc|
+00000030  03 80 d8 59 7e 25 e9 75  95 d0 6c 40 ab f2 8b f9  |...Y~%.u..l@....|
 >>> Flow 4 (server to client)
-00000000  17 03 03 00 1e e5 f4 e6  14 79 8c b9 a9 77 6b c9  |.........y...wk.|
-00000010  ff ad 60 f3 03 cf 48 19  19 71 6c 85 da 92 cb 79  |..`...H..ql....y|
-00000020  2b 20 41 17 03 03 00 13  69 de ca 08 9c cf 70 37  |+ A.....i.....p7|
-00000030  5e fc 32 31 1c 93 d1 e4  01 f3 c6                 |^.21.......|
+00000000  17 03 03 00 1e ce 93 89  a4 0d db 14 53 be 22 ff  |............S.".|
+00000010  53 1d 78 31 d3 17 c7 90  66 8d 2e e0 fe 98 e6 4b  |S.x1....f......K|
+00000020  ee 6d 41 17 03 03 00 13  5d b7 e7 82 68 6a 7a 71  |.mA.....]...hjzq|
+00000030  32 25 34 83 c4 63 12 f5  8e ab e9                 |2%4..c.....|
diff --git a/src/crypto/tls/testdata/Server-TLSv13-RSA-RSAPSS b/src/crypto/tls/testdata/Server-TLSv13-RSA-RSAPSS
index db53ebb..1caf831 100644
--- a/src/crypto/tls/testdata/Server-TLSv13-RSA-RSAPSS
+++ b/src/crypto/tls/testdata/Server-TLSv13-RSA-RSAPSS
@@ -1,97 +1,96 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 b2 01 00 00  ae 03 03 4d a5 7b 2c da  |...........M.{,.|
-00000010  67 11 9d 4d a0 92 2a 96  6c 85 ef 8c 52 0a 31 cf  |g..M..*.l...R.1.|
-00000020  43 23 3e 8d 67 63 9b 7e  84 94 17 20 a2 a1 87 c6  |C#>.gc.~... ....|
-00000030  5e 64 34 75 da ac ee ba  d4 d8 8f 2a a6 55 9f 4f  |^d4u.......*.U.O|
-00000040  48 38 5a 29 61 a4 ef 7d  1d 74 a7 71 00 04 13 03  |H8Z)a..}.t.q....|
+00000000  16 03 01 00 b2 01 00 00  ae 03 03 4f 1c 96 1a 7c  |...........O...||
+00000010  56 ea 59 60 5f bc 59 a4  c8 c1 ab 17 86 0b f9 d6  |V.Y`_.Y.........|
+00000020  7d 15 e4 b7 01 d3 27 55  af 8d 45 20 4b 2c f9 5c  |}.....'U..E K,.\|
+00000030  05 ff 79 28 e6 63 7e 1f  d7 10 26 07 2d ec c7 ed  |..y(.c~...&.-...|
+00000040  1c c2 07 f1 ac 3b e9 2d  1a 8d 71 a0 00 04 13 03  |.....;.-..q.....|
 00000050  00 ff 01 00 00 61 00 0b  00 04 03 00 01 02 00 0a  |.....a..........|
 00000060  00 0c 00 0a 00 1d 00 17  00 1e 00 19 00 18 00 16  |................|
 00000070  00 00 00 17 00 00 00 0d  00 06 00 04 08 06 08 04  |................|
 00000080  00 2b 00 03 02 03 04 00  2d 00 02 01 01 00 33 00  |.+......-.....3.|
-00000090  26 00 24 00 1d 00 20 16  5e 23 ca e7 24 31 81 c2  |&.$... .^#..$1..|
-000000a0  78 21 3a ee 8a f3 61 8a  46 a0 56 ee a9 ed 82 3a  |x!:...a.F.V....:|
-000000b0  87 b7 4a 0a 03 fe 59                              |..J...Y|
+00000090  26 00 24 00 1d 00 20 bd  6f e3 5c 82 72 3d cf 0d  |&.$... .o.\.r=..|
+000000a0  2e 49 d0 c9 7e cc 36 88  ff 05 ed b3 c6 f1 93 9b  |.I..~.6.........|
+000000b0  2a 6c 5f ca e5 eb 0f                              |*l_....|
 >>> Flow 2 (server to client)
 00000000  16 03 03 00 7a 02 00 00  76 03 03 00 00 00 00 00  |....z...v.......|
 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 a2 a1 87 c6  |........... ....|
-00000030  5e 64 34 75 da ac ee ba  d4 d8 8f 2a a6 55 9f 4f  |^d4u.......*.U.O|
-00000040  48 38 5a 29 61 a4 ef 7d  1d 74 a7 71 13 03 00 00  |H8Z)a..}.t.q....|
+00000020  00 00 00 00 00 00 00 00  00 00 00 20 4b 2c f9 5c  |........... K,.\|
+00000030  05 ff 79 28 e6 63 7e 1f  d7 10 26 07 2d ec c7 ed  |..y(.c~...&.-...|
+00000040  1c c2 07 f1 ac 3b e9 2d  1a 8d 71 a0 13 03 00 00  |.....;.-..q.....|
 00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 2f  |..+.....3.$... /|
 00000060  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
 00000070  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74 14  |.........._X.;t.|
-00000080  03 03 00 01 01 17 03 03  00 17 f8 7a 9c bc 58 8d  |...........z..X.|
-00000090  ce cd ff e6 ae 2d c2 e0  40 33 4e c4 ec f5 90 dd  |.....-..@3N.....|
-000000a0  ba 17 03 03 02 6d f3 65  a1 b4 fe ef 40 37 72 fa  |.....m.e....@7r.|
-000000b0  a5 b8 10 ad 32 e3 08 e1  ac bb 14 f2 34 bf 25 19  |....2.......4.%.|
-000000c0  aa 2d 1a 78 cc 26 2f 5c  0b 7e 13 73 36 85 92 96  |.-.x.&/\.~.s6...|
-000000d0  0a 7a 27 f5 35 86 f1 ea  1a 5f 5c 3a 90 28 63 6a  |.z'.5...._\:.(cj|
-000000e0  b3 7c e0 56 32 10 55 67  59 e0 65 d6 11 ef 7c 50  |.|.V2.UgY.e...|P|
-000000f0  0b 9e 88 0a 61 96 93 cf  05 51 47 33 c3 5c e3 82  |....a....QG3.\..|
-00000100  01 6d f1 f7 5c dc df b2  61 7c d7 9f de b4 3e c0  |.m..\...a|....>.|
-00000110  6d b5 52 39 3b f6 33 c2  03 65 2b 66 39 ed d6 f0  |m.R9;.3..e+f9...|
-00000120  83 46 61 db fc 27 a5 8a  68 d6 8a 85 5d 3f b1 46  |.Fa..'..h...]?.F|
-00000130  a2 3a 32 37 1f e0 76 a6  79 7f eb b2 81 52 e7 e0  |.:27..v.y....R..|
-00000140  4f b2 db 48 7d 20 61 52  d4 22 2a b7 81 2f da 5b  |O..H} aR."*../.[|
-00000150  f6 e8 0a a6 91 b5 d1 f5  6b 5e 2b ad fd 70 cd a1  |........k^+..p..|
-00000160  f8 4d 73 31 3d 2a 49 d3  2e 6b b3 31 95 61 09 08  |.Ms1=*I..k.1.a..|
-00000170  c5 f9 eb db 42 b0 e1 5d  47 00 3e 7e 80 31 c6 d2  |....B..]G.>~.1..|
-00000180  37 dc 68 d7 36 05 ad 8a  a4 05 87 7a 1c 12 f6 ab  |7.h.6......z....|
-00000190  0e e1 5b 29 b1 1c 16 20  29 75 5a b0 59 24 59 df  |..[)... )uZ.Y$Y.|
-000001a0  62 fe f2 26 ad ab bf 2b  25 d7 9e db 04 f6 26 96  |b..&...+%.....&.|
-000001b0  f7 5f 2c ff 2e 6d 85 c7  58 c8 15 9c d0 7d dd 8e  |._,..m..X....}..|
-000001c0  1a 39 fc 3d 62 58 47 ce  83 7a ff fc 45 98 02 3d  |.9.=bXG..z..E..=|
-000001d0  aa 37 b7 5e a7 7b 8e fa  f2 05 8b 61 7f 04 08 f5  |.7.^.{.....a....|
-000001e0  af 1d 6e 55 18 d2 12 2e  bd 8a 80 3d cb e6 0f cd  |..nU.......=....|
-000001f0  3c d8 a5 38 db ee 07 c6  3b 75 55 c2 ee 2e 6a a3  |<..8....;uU...j.|
-00000200  fa 54 ce e3 45 92 c0 b9  8c 10 3d 2f 86 cb a5 c9  |.T..E.....=/....|
-00000210  af 37 f7 f6 6c 3e 4b 15  04 bd 46 98 31 5a b9 8c  |.7..l>K...F.1Z..|
-00000220  ec 67 0d 97 9d 26 56 65  9c a7 74 bb 88 45 dc 4e  |.g...&Ve..t..E.N|
-00000230  ce 70 a1 fc ce fc a7 d4  e1 7d a7 43 82 a6 e2 30  |.p.......}.C...0|
-00000240  e2 94 88 e5 1a 05 c5 28  06 14 7b 29 75 f9 4d 2c  |.......(..{)u.M,|
-00000250  bb 54 ee f5 17 4e 2a bf  04 e6 38 f2 cf ed ab a2  |.T...N*...8.....|
-00000260  ef ae ac 3d 80 5e 03 71  74 70 0c 68 93 ca ea 93  |...=.^.qtp.h....|
-00000270  e5 b1 d1 18 80 98 0e c6  e8 f5 65 87 e7 9a 33 1d  |..........e...3.|
-00000280  e6 3d e2 28 82 19 2a 9d  5f 1a a2 74 fa 27 8b d0  |.=.(..*._..t.'..|
-00000290  09 9a ba 1b c5 a6 4c 3b  c3 02 12 61 a1 8a 20 d3  |......L;...a.. .|
-000002a0  a4 3c 3b aa f2 08 de e0  de 07 9f a0 13 b4 e8 23  |.<;............#|
-000002b0  d3 a5 ff 12 74 55 29 3a  57 f5 14 b3 af e6 28 ed  |....tU):W.....(.|
-000002c0  b1 60 9c 6b 7d 55 a1 58  50 ab 42 71 5d 0e dc 76  |.`.k}U.XP.Bq]..v|
-000002d0  87 cd a1 d3 e4 26 25 c4  c1 23 1e 3b 31 13 3d f8  |.....&%..#.;1.=.|
-000002e0  b2 1b a8 07 f6 68 83 b4  7e 94 ca 84 95 55 38 d1  |.....h..~....U8.|
-000002f0  eb af 19 83 90 4a ab 0a  8d f6 48 9a 25 fa 59 97  |.....J....H.%.Y.|
-00000300  3c 5f 6a 2d 68 ec 29 d5  53 b4 9a 97 ea 59 fe 74  |<_j-h.).S....Y.t|
-00000310  81 0e b9 17 03 03 00 99  12 25 df 91 85 91 ac c0  |.........%......|
-00000320  60 4e 6e ed c4 b2 f0 f3  8b 66 53 75 11 07 29 d6  |`Nn......fSu..).|
-00000330  1f 01 81 60 de 5f b7 6b  5e 39 c8 ea f1 f8 2a 94  |...`._.k^9....*.|
-00000340  dd b6 c5 a9 31 be 87 a7  aa a9 64 03 16 40 df ef  |....1.....d..@..|
-00000350  37 ac 66 4c 19 f1 60 d5  b4 88 93 a7 42 ac e3 81  |7.fL..`.....B...|
-00000360  c8 88 3f e2 30 a0 ff b7  d5 19 fc f2 72 a7 97 a8  |..?.0.......r...|
-00000370  31 ce 20 be 90 bc f5 8a  24 31 b1 c6 2b 2a ad c5  |1. .....$1..+*..|
-00000380  7a 34 69 eb a7 86 53 61  a1 88 4f 58 2a 65 a2 18  |z4i...Sa..OX*e..|
-00000390  7a 93 81 c6 bd c7 bc 84  5b ff 85 aa ff fc 68 50  |z.......[.....hP|
-000003a0  cb 57 37 54 a7 0f 2e 64  82 53 b7 dc ea c2 e3 49  |.W7T...d.S.....I|
-000003b0  fd 17 03 03 00 35 da 2a  8c 37 83 a5 a0 d4 06 c4  |.....5.*.7......|
-000003c0  ff f3 85 6f e4 11 1f 37  0f 06 35 45 e9 51 43 6f  |...o...7..5E.QCo|
-000003d0  d2 a4 cb b7 ad f0 66 1c  20 40 c3 14 32 c0 57 71  |......f. @..2.Wq|
-000003e0  d3 8c 9c 7f 5b e6 50 a1  c2 e5 62 17 03 03 00 93  |....[.P...b.....|
-000003f0  30 b8 ab dc 3b df 60 aa  b1 d2 25 5a 60 da b6 c8  |0...;.`...%Z`...|
-00000400  22 88 93 79 25 44 56 aa  ec 93 e8 01 11 bf 69 ad  |"..y%DV.......i.|
-00000410  b2 c9 43 67 33 aa 6d ae  73 a3 95 2b f0 86 ed a2  |..Cg3.m.s..+....|
-00000420  db df e3 dc 9b 16 1d 8d  fc 2f a5 c4 41 d0 86 2f  |........./..A../|
-00000430  cc a1 a1 ce 9a e5 e6 c8  a2 d1 a8 b2 a4 15 9c 69  |...............i|
-00000440  38 5a fa fd de d4 02 95  24 67 1b 61 76 1f c4 65  |8Z......$g.av..e|
-00000450  01 fc 36 2d ef 2d 0f 8e  f0 5a 6d 04 07 b8 26 18  |..6-.-...Zm...&.|
-00000460  90 fc 82 1b 99 68 b0 13  7f 6e a1 9b c4 2a f3 b8  |.....h...n...*..|
-00000470  0b 6a 44 cd 04 e8 20 96  6d f5 48 cb 71 8a 04 10  |.jD... .m.H.q...|
-00000480  b8 8d 56                                          |..V|
+00000080  03 03 00 01 01 17 03 03  00 17 ce 73 37 c4 06 32  |...........s7..2|
+00000090  74 c4 3d 2d 55 10 b4 ce  3f 66 fa ec 9a 8c d1 4a  |t.=-U...?f.....J|
+000000a0  cd 17 03 03 02 6d 6a 73  5d 98 e7 fc 37 d2 b8 5d  |.....mjs]...7..]|
+000000b0  2a 1c 75 80 b3 a9 ce 6e  e2 d0 b5 5c 70 2b e5 c0  |*.u....n...\p+..|
+000000c0  28 4e bf 8c af 5a 78 a2  bc 29 fd 60 68 f8 fa ed  |(N...Zx..).`h...|
+000000d0  5d 92 b2 d0 e8 69 e7 f7  1b 71 0b 30 4b c5 46 53  |]....i...q.0K.FS|
+000000e0  df 73 b9 95 65 6e cd df  26 b3 2b fd 7a 41 e9 4b  |.s..en..&.+.zA.K|
+000000f0  8c 27 a3 d5 96 ed 44 01  9d 50 a8 39 28 f7 63 3d  |.'....D..P.9(.c=|
+00000100  9e b7 1c 70 bf 2c d9 c4  67 5f 4f a7 7d b1 7a 4d  |...p.,..g_O.}.zM|
+00000110  eb bd a3 4c 3b 0b ca 92  c4 db 21 dd 36 f2 4e ce  |...L;.....!.6.N.|
+00000120  17 95 25 df bc 4a 2a 82  bb 5c 12 e4 6f ab 5a 03  |..%..J*..\..o.Z.|
+00000130  b7 7b 9f 8b 8e df ce c1  14 61 39 f1 8d f6 bb 90  |.{.......a9.....|
+00000140  a6 3a c0 21 13 9b a0 28  f6 05 34 a1 5a c5 ed 13  |.:.!...(..4.Z...|
+00000150  43 3d b6 3a 06 f8 89 ac  fe 8f 71 76 58 43 32 56  |C=.:......qvXC2V|
+00000160  71 5c ad 4c 19 e6 54 ba  32 49 83 c7 b6 5a a8 9d  |q\.L..T.2I...Z..|
+00000170  00 37 05 09 50 db c9 52  98 0d 96 03 11 22 a3 39  |.7..P..R.....".9|
+00000180  75 fe a7 34 20 0e f6 9c  a9 79 0f 9e 05 fc 5a 4e  |u..4 ....y....ZN|
+00000190  76 7c 13 0e a7 6a 1e 4a  f7 ba a7 a8 18 8d 89 4a  |v|...j.J.......J|
+000001a0  ad 34 40 81 2c e9 07 18  ba 95 48 dd 11 e7 11 0b  |.4@.,.....H.....|
+000001b0  27 fe 9f 3c e6 44 72 16  89 dc 7d 8e 22 cf 4d 96  |'..<.Dr...}.".M.|
+000001c0  60 3c 78 7a ed 6e a9 ba  d1 c3 59 b7 a7 32 bc 44  |`<xz.n....Y..2.D|
+000001d0  07 ef 1d b6 c0 21 5b 8b  b6 b9 df 4b 47 90 64 f0  |.....![....KG.d.|
+000001e0  32 3c 09 4c 8d f2 17 75  81 5a 82 f3 d8 d0 05 7b  |2<.L...u.Z.....{|
+000001f0  c8 d0 59 e3 59 a5 88 60  cc 31 0c 69 b2 05 fd b1  |..Y.Y..`.1.i....|
+00000200  16 c1 a5 00 1a 42 9e 4c  88 e0 3a 1c 68 2e 31 05  |.....B.L..:.h.1.|
+00000210  e6 09 04 c3 ef 57 00 ae  9e de a2 a3 5f fd 4e c9  |.....W......_.N.|
+00000220  e9 4c a4 51 dd 9b e1 a9  03 5c b4 19 ed 54 3f a0  |.L.Q.....\...T?.|
+00000230  a8 41 a9 bf df ca 74 ec  e7 af 4b 0d 24 ad e7 e0  |.A....t...K.$...|
+00000240  27 eb 06 26 9e 32 5c 08  3c e4 93 8e d0 50 b5 f9  |'..&.2\.<....P..|
+00000250  33 4d c5 94 f6 f1 de 02  80 9f 1e 5c 09 c2 a1 8a  |3M.........\....|
+00000260  15 89 91 91 41 71 48 2c  03 89 b7 bd e9 bd 7b 0c  |....AqH,......{.|
+00000270  61 74 f5 2a 50 bd 44 da  06 37 77 55 10 6c 5a 75  |at.*P.D..7wU.lZu|
+00000280  f0 fd c3 db c7 46 fa b5  de cf 53 f6 09 de 03 77  |.....F....S....w|
+00000290  90 57 a7 4d 4a 2c 77 10  6c 99 5d b2 24 32 c7 b3  |.W.MJ,w.l.].$2..|
+000002a0  fc 09 4e d6 e9 a7 7e a3  c8 b7 22 b5 e3 4e a1 1f  |..N...~..."..N..|
+000002b0  f9 81 06 d6 cd 42 09 49  ea 2d 98 d0 da 4f ad c2  |.....B.I.-...O..|
+000002c0  78 bd 8f 7c 2f 65 9e fc  35 be 46 bb f4 4a 2a 8f  |x..|/e..5.F..J*.|
+000002d0  46 a3 94 f5 1d b2 4b 39  07 53 d1 2a 8e e1 eb 73  |F.....K9.S.*...s|
+000002e0  57 88 16 34 03 55 56 52  50 c8 42 45 28 ef 20 ef  |W..4.UVRP.BE(. .|
+000002f0  ea c3 77 c9 a5 fe 92 51  2d ee d4 39 33 43 ae fa  |..w....Q-..93C..|
+00000300  bb 85 d1 cb eb e6 37 2c  98 f6 b5 b9 5e 1b e6 22  |......7,....^.."|
+00000310  2a 63 92 17 03 03 00 99  c6 ed c3 5d 8e 74 7e f3  |*c.........].t~.|
+00000320  f6 cc 5f e8 24 4d 78 1c  cd f1 a0 38 50 84 3a cb  |.._.$Mx....8P.:.|
+00000330  ae 8c d4 73 33 a0 10 de  ff 7b 3f a7 df 85 84 3b  |...s3....{?....;|
+00000340  36 04 4e 9e 47 fa 87 9b  a6 01 be 59 85 3c a4 ef  |6.N.G......Y.<..|
+00000350  9a 58 81 9b 67 1e 16 74  34 64 b1 3e 43 0e 83 a0  |.X..g..t4d.>C...|
+00000360  41 51 24 49 1f e3 09 16  cd b6 4a db 62 ce 8f 79  |AQ$I......J.b..y|
+00000370  19 6b 4d e4 e9 61 4f ef  43 31 e1 82 e3 57 32 01  |.kM..aO.C1...W2.|
+00000380  58 d5 67 5f bd 5e d6 f5  b9 3c 91 65 96 49 81 b2  |X.g_.^...<.e.I..|
+00000390  8c 6d a8 ba 37 2f dd 8b  bc 3a 33 9a 44 8a da e7  |.m..7/...:3.D...|
+000003a0  16 e1 d7 67 09 3a 3c d6  9f be bd 2b 50 d6 5d 3f  |...g.:<....+P.]?|
+000003b0  96 17 03 03 00 35 77 34  06 35 5c 89 77 e6 a2 f8  |.....5w4.5\.w...|
+000003c0  3f b4 9e 45 ce 29 a8 f7  24 45 7c 00 36 96 f9 c4  |?..E.)..$E|.6...|
+000003d0  7b 6b 29 78 9e 13 78 95  9f 21 64 cb 5f a0 f1 ef  |{k)x..x..!d._...|
+000003e0  3b 19 47 30 85 08 67 8f  84 b8 9c 17 03 03 00 8b  |;.G0..g.........|
+000003f0  af fb c3 c3 f4 33 c3 e7  52 e0 c2 1b 3d f3 7f 40  |.....3..R...=..@|
+00000400  7d 33 38 8e 59 7d 3e 4f  8e 93 95 f8 9c 09 56 1b  |}38.Y}>O......V.|
+00000410  68 d8 0c 11 a9 e6 6a c6  ea 6c 00 1e eb 3d d1 7b  |h.....j..l...=.{|
+00000420  fc 1b 8e 52 69 f1 30 8c  3d 9d 3a 26 6e 9e 72 d9  |...Ri.0.=.:&n.r.|
+00000430  c4 00 a1 ae 87 ca 21 fc  45 ae af 58 9f 09 38 10  |......!.E..X..8.|
+00000440  94 b2 4c 58 46 da 8f fd  c5 4a 60 0c ee 79 b7 6b  |..LXF....J`..y.k|
+00000450  5a 74 f6 b4 e6 a0 1b 0c  8f 94 d9 79 07 36 05 ea  |Zt.........y.6..|
+00000460  3b a3 11 ec 4a 86 b8 22  3c 94 eb da e1 d6 d4 91  |;...J.."<.......|
+00000470  e7 99 af 6b 39 4a 6c ef  d7 8b c7                 |...k9Jl....|
 >>> Flow 3 (client to server)
-00000000  14 03 03 00 01 01 17 03  03 00 35 54 e5 3f f8 77  |..........5T.?.w|
-00000010  59 e3 8b 02 0b 80 8d 59  12 22 23 09 cb d9 93 67  |Y......Y."#....g|
-00000020  c7 35 b4 45 a0 54 49 fd  65 b5 ff e6 3e 3c b9 bf  |.5.E.TI.e...><..|
-00000030  26 ca df 86 db a4 66 b5  3e 1f 36 69 a5 99 2b ed  |&.....f.>.6i..+.|
+00000000  14 03 03 00 01 01 17 03  03 00 35 e9 ef 1b b1 01  |..........5.....|
+00000010  b9 f2 6f e6 eb a0 52 01  81 f6 18 cf 28 f7 8a 09  |..o...R.....(...|
+00000020  65 32 30 4b 67 1b df d5  9c 4c cb 83 11 4e 3d 7f  |e20Kg....L...N=.|
+00000030  d2 b8 a2 03 de 28 2d ef  d0 68 b0 92 db 70 04 e2  |.....(-..h...p..|
 >>> Flow 4 (server to client)
-00000000  17 03 03 00 1e e3 b4 3e  81 ff 1a 36 f8 11 53 64  |.......>...6..Sd|
-00000010  b9 28 4e 68 de ee 9c b6  4d 71 21 fa 85 56 30 ad  |.(Nh....Mq!..V0.|
-00000020  e9 c2 27 17 03 03 00 13  3d b8 13 b0 5f df 5a 05  |..'.....=..._.Z.|
-00000030  85 cf eb 48 86 fb c5 a0  67 f7 ee                 |...H....g..|
+00000000  17 03 03 00 1e d8 d0 6a  a0 02 0a cf 78 95 08 e1  |.......j....x...|
+00000010  2f dd 6b e3 db dc 8c f7  e3 5d 6e e2 48 5d d7 2c  |/.k......]n.H].,|
+00000020  2c 26 7b 17 03 03 00 13  0a cd 02 95 d2 79 5a 1c  |,&{..........yZ.|
+00000030  8a 27 a4 90 d3 7f ff 5c  f1 b9 d8                 |.'.....\...|
diff --git a/src/crypto/tls/testdata/Server-TLSv13-Resume b/src/crypto/tls/testdata/Server-TLSv13-Resume
index 091ffc3..29e41c6 100644
--- a/src/crypto/tls/testdata/Server-TLSv13-Resume
+++ b/src/crypto/tls/testdata/Server-TLSv13-Resume
@@ -1,60 +1,59 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 01 6e 01 00 01  6a 03 03 b6 39 89 61 fd  |....n...j...9.a.|
-00000010  11 84 b3 4b a9 18 23 b2  35 3d 82 85 75 5c e2 f3  |...K..#.5=..u\..|
-00000020  c9 f4 b0 2f 05 fb 5a 90  da 73 38 20 7f 06 81 e5  |.../..Z..s8 ....|
-00000030  d0 10 08 d1 b0 3c 3c 4b  28 39 34 9a 56 ca 47 4a  |.....<<K(94.V.GJ|
-00000040  01 f9 03 2b 54 f1 14 53  bd 28 22 60 00 04 13 01  |...+T..S.("`....|
-00000050  00 ff 01 00 01 1d 00 0b  00 04 03 00 01 02 00 0a  |................|
+00000000  16 03 01 01 66 01 00 01  62 03 03 45 a3 e1 2e f2  |....f...b..E....|
+00000010  03 d1 82 45 cb cd fc da  ae 9d 47 ce 2b fd 5a df  |...E......G.+.Z.|
+00000020  ad dd 7b 1a 4a 14 93 bb  d1 fe f5 20 78 6c c9 94  |..{.J...... xl..|
+00000030  6a b6 3e 65 97 42 9f c3  80 3c 8a 23 f5 af 6d 4b  |j.>e.B...<.#..mK|
+00000040  cb dc e9 93 22 bd bf b5  e6 09 0d e1 00 04 13 01  |...."...........|
+00000050  00 ff 01 00 01 15 00 0b  00 04 03 00 01 02 00 0a  |................|
 00000060  00 0c 00 0a 00 1d 00 17  00 1e 00 19 00 18 00 23  |...............#|
 00000070  00 00 00 16 00 00 00 17  00 00 00 0d 00 1e 00 1c  |................|
 00000080  04 03 05 03 06 03 08 07  08 08 08 09 08 0a 08 0b  |................|
 00000090  08 04 08 05 08 06 04 01  05 01 06 01 00 2b 00 03  |.............+..|
 000000a0  02 03 04 00 2d 00 02 01  01 00 33 00 26 00 24 00  |....-.....3.&.$.|
-000000b0  1d 00 20 83 a4 df 27 8d  52 a8 ce 3c af 7e 79 0c  |.. ...'.R..<.~y.|
-000000c0  b7 30 5e 5f 8d d6 14 1c  a1 65 72 40 73 bc 22 44  |.0^_.....er@s."D|
-000000d0  58 05 10 00 29 00 9c 00  77 00 71 50 46 ad c1 db  |X...)...w.qPF...|
-000000e0  a8 38 86 7b 2b bb fd d0  c3 42 3e 00 00 00 00 00  |.8.{+....B>.....|
-000000f0  00 00 00 00 00 00 00 00  00 00 00 94 68 2c a3 82  |............h,..|
-00000100  51 ed 14 ef 68 ca 42 c5  5c ab 26 c2 91 a9 01 83  |Q...h.B.\.&.....|
-00000110  13 26 8f 62 7c 89 c0 a2  b5 9b 6d 4f a4 c9 e2 49  |.&.b|.....mO...I|
-00000120  34 03 2c b2 7d d9 af eb  1a 99 76 3c a5 ef 70 78  |4.,.}.....v<..px|
-00000130  59 58 1c 45 80 c5 f1 b8  91 b2 54 71 3f bf 4f 2a  |YX.E......Tq?.O*|
-00000140  b2 9d 9d 6f 6f 1c f1 3c  6c e6 a2 73 00 00 00 00  |...oo..<l..s....|
-00000150  00 21 20 95 92 91 9a 6d  da d5 c4 94 f7 2e ed 1a  |.! ....m........|
-00000160  5b cd 54 55 8f 87 25 ee  58 d6 92 94 a4 e7 c5 e3  |[.TU..%.X.......|
-00000170  58 4f bd                                          |XO.|
+000000b0  1d 00 20 49 31 09 86 3b  71 6b ff 6c bc 6f 40 4c  |.. I1..;qk.l.o@L|
+000000c0  3a 04 44 c3 83 6c 9b 1d  99 a6 10 c7 07 f9 9d 57  |:.D..l.........W|
+000000d0  2d b4 59 00 29 00 94 00  6f 00 69 00 00 00 00 00  |-.Y.)...o.i.....|
+000000e0  00 00 00 00 00 00 00 00  00 00 00 94 68 2d a3 82  |............h-..|
+000000f0  51 ed 14 ef 68 ca 42 c5  5c 95 7a 77 9a 7a 61 99  |Q...h.B.\.zw.za.|
+00000100  c6 44 1e e6 5d 71 41 c8  77 d1 d4 b6 39 bb 38 57  |.D..]qA.w...9.8W|
+00000110  41 b8 41 f2 02 96 d0 b0  5b 99 76 3c 2b 52 f2 8f  |A.A.....[.v<+R..|
+00000120  5f 33 94 fa 66 74 cc f0  60 1b ee 0a 38 30 78 b2  |_3..ft..`...80x.|
+00000130  9e 54 16 d6 71 0e b2 ea  4e 0f 13 f0 6e 63 88 e7  |.T..q...N...nc..|
+00000140  9f 55 65 0b 00 00 00 00  00 21 20 21 c5 95 b2 62  |.Ue......! !...b|
+00000150  61 dc b6 32 34 60 19 58  8c 6b 4b de dc 39 c7 d6  |a..24`.X.kK..9..|
+00000160  82 55 c8 de 80 dc b7 05  0c be a6                 |.U.........|
 >>> Flow 2 (server to client)
 00000000  16 03 03 00 80 02 00 00  7c 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 20 7f 06 81 e5  |........... ....|
-00000030  d0 10 08 d1 b0 3c 3c 4b  28 39 34 9a 56 ca 47 4a  |.....<<K(94.V.GJ|
-00000040  01 f9 03 2b 54 f1 14 53  bd 28 22 60 13 01 00 00  |...+T..S.("`....|
+00000020  00 00 00 00 00 00 00 00  00 00 00 20 78 6c c9 94  |........... xl..|
+00000030  6a b6 3e 65 97 42 9f c3  80 3c 8a 23 f5 af 6d 4b  |j.>e.B...<.#..mK|
+00000040  cb dc e9 93 22 bd bf b5  e6 09 0d e1 13 01 00 00  |...."...........|
 00000050  34 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 2f  |4.+.....3.$... /|
 00000060  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
 00000070  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74 00  |.........._X.;t.|
 00000080  29 00 02 00 00 14 03 03  00 01 01 17 03 03 00 17  |)...............|
-00000090  18 d7 0c 38 47 21 c2 8e  01 fe e7 1f 35 ee 7f 8f  |...8G!......5...|
-000000a0  04 10 7a 06 61 1f 4d 17  03 03 00 35 b3 38 29 ce  |..z.a.M....5.8).|
-000000b0  18 2b 22 5e 01 4d 07 04  87 65 68 85 9d 10 e9 9e  |.+"^.M...eh.....|
-000000c0  5a a8 a5 cb 8d f9 48 fe  1b 17 30 04 be 55 92 ce  |Z.....H...0..U..|
-000000d0  74 9b 8e 9c 6b 77 5d 09  ca 58 8e c0 ac 85 3b 4e  |t...kw]..X....;N|
-000000e0  0b 17 03 03 00 93 90 64  70 a6 d7 20 8e 50 6d b7  |.......dp.. .Pm.|
-000000f0  53 3d ed eb 85 e0 2f fe  a2 88 84 3d 26 8a 18 65  |S=..../....=&..e|
-00000100  d1 c0 d2 c4 66 2a 2e 8c  06 5f 46 ee fe 36 f7 00  |....f*..._F..6..|
-00000110  57 3f 95 b3 36 47 0c 1a  78 c4 e3 d6 c1 ae 2f 96  |W?..6G..x...../.|
-00000120  f0 e6 5e 61 86 d7 c1 d7  cc d2 a6 19 0c 29 f5 19  |..^a.........)..|
-00000130  d5 5e 75 6f 8b 49 4b 0b  e9 c9 3c 69 87 ab b7 1d  |.^uo.IK...<i....|
-00000140  38 84 28 0e 40 79 be 71  dc 61 68 72 c9 a6 83 a4  |8.(.@y.q.ahr....|
-00000150  79 c9 53 4d 43 98 0f e9  33 3c 63 d3 99 e2 97 46  |y.SMC...3<c....F|
-00000160  d1 c1 18 b6 b8 14 ee 19  df 56 94 43 34 b8 af 1f  |.........V.C4...|
-00000170  4f f7 c1 e6 d5 17 13 6c  bd                       |O......l.|
+00000090  b4 11 54 4d 78 28 66 53  0f fd c8 7c d5 1c 1d b2  |..TMx(fS...|....|
+000000a0  06 31 23 27 a4 70 b2 17  03 03 00 35 86 87 b6 21  |.1#'.p.....5...!|
+000000b0  1c db f6 8c 4f ae 46 26  27 23 5d 1f 41 1d 42 94  |....O.F&'#].A.B.|
+000000c0  68 32 e5 49 19 e9 bc ba  4e 0a e2 71 7e 31 d2 a0  |h2.I....N..q~1..|
+000000d0  c2 24 b3 a9 3d 26 a5 eb  c9 44 09 03 7a 14 54 5d  |.$..=&...D..z.T]|
+000000e0  8f 17 03 03 00 8b fd cd  ed ac c5 f2 7c 99 66 85  |............|.f.|
+000000f0  e6 0c 3b 9d ca a2 fb 22  69 fc 40 61 3a 98 f2 db  |..;...."i.@a:...|
+00000100  84 7b d9 70 06 7f 00 20  53 cb ce 27 f1 93 fd 01  |.{.p... S..'....|
+00000110  fb 0d 32 61 0d 04 93 d3  53 94 a4 37 ed a6 6e 5c  |..2a....S..7..n\|
+00000120  2f 9a 9a a9 1b b2 26 1d  24 9f 78 05 53 1d aa 40  |/.....&.$.x.S..@|
+00000130  bb 3f 27 29 ac 56 97 d7  f8 a8 77 e9 d4 b3 c0 43  |.?').V....w....C|
+00000140  a8 27 12 0f 13 fd 62 27  01 54 90 b5 66 fd d8 41  |.'....b'.T..f..A|
+00000150  a0 3a 5f b5 eb 53 25 83  f0 35 65 b2 7b f7 c6 a1  |.:_..S%..5e.{...|
+00000160  47 20 c5 91 00 69 b4 28  32 3c 55 8d 34 b9 ab b7  |G ...i.(2<U.4...|
+00000170  4b                                                |K|
 >>> Flow 3 (client to server)
-00000000  14 03 03 00 01 01 17 03  03 00 35 69 08 b0 a0 71  |..........5i...q|
-00000010  1f 95 45 c4 b2 11 43 a9  b5 da ba 11 0a 2b 24 49  |..E...C......+$I|
-00000020  ac 3d 8e ec 32 c9 7f 3e  cc 1b fc 9a 68 d0 22 cb  |.=..2..>....h.".|
-00000030  37 0e 8f fe 4f 75 1a 62  44 20 60 c2 64 de 48 6d  |7...Ou.bD `.d.Hm|
+00000000  14 03 03 00 01 01 17 03  03 00 35 fb 04 e7 9f ad  |..........5.....|
+00000010  51 52 7e 72 61 46 df d0  80 5b 1a f3 ce 78 9e ae  |QR~raF...[...x..|
+00000020  f8 cb 08 7e 2b 45 e9 f6  20 10 e0 99 4f 1a 62 51  |...~+E.. ...O.bQ|
+00000030  4f b6 d4 2a 5e b8 04 2b  09 06 4a 03 c4 01 ca bf  |O..*^..+..J.....|
 >>> Flow 4 (server to client)
-00000000  17 03 03 00 1e d5 71 aa  53 2d 55 b7 76 11 45 b0  |......q.S-U.v.E.|
-00000010  f3 de f7 f1 78 0b 10 3f  49 7f ea 83 17 2e b9 50  |....x..?I......P|
-00000020  ec d2 0f 17 03 03 00 13  0a 22 58 66 d8 f7 ad fc  |........."Xf....|
-00000030  9c f2 da d1 ae 02 f8 99  d2 26 63                 |.........&c|
+00000000  17 03 03 00 1e 5c c3 b1  a5 d9 f3 a7 0b 48 b6 1f  |.....\.......H..|
+00000010  73 ca d2 f5 07 6c e5 37  e9 b0 5f 87 a4 59 0d da  |s....l.7.._..Y..|
+00000020  e2 3f ee 17 03 03 00 13  06 d0 6c 12 91 3c 0d cf  |.?........l..<..|
+00000030  d2 0f 7f 74 e6 26 79 87  cf 76 71                 |...t.&y..vq|
diff --git a/src/crypto/tls/testdata/Server-TLSv13-Resume-HelloRetryRequest b/src/crypto/tls/testdata/Server-TLSv13-Resume-HelloRetryRequest
index d0aa66a..8896455 100644
--- a/src/crypto/tls/testdata/Server-TLSv13-Resume-HelloRetryRequest
+++ b/src/crypto/tls/testdata/Server-TLSv13-Resume-HelloRetryRequest
@@ -1,96 +1,94 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 01 68 01 00 01  64 03 03 a0 27 b0 af b0  |....h...d...'...|
-00000010  15 2c ed 88 b2 e8 c5 67  2e db 0d 29 13 64 bb 58  |.,.....g...).d.X|
-00000020  3b 71 67 a9 47 65 8a 3c  09 44 29 20 46 fe 89 4b  |;qg.Ge.<.D) F..K|
-00000030  f3 1d ed 40 2d 5c 1b 23  26 f5 72 6f d1 b4 77 f5  |...@-\.#&.ro..w.|
-00000040  1a 9f d1 98 34 46 fe 89  0b 2d c1 f9 00 04 13 01  |....4F...-......|
-00000050  00 ff 01 00 01 17 00 0b  00 04 03 00 01 02 00 0a  |................|
+00000000  16 03 01 01 60 01 00 01  5c 03 03 c6 2c d1 55 71  |....`...\...,.Uq|
+00000010  9a 6b 02 54 cb 33 30 34  5f 22 2a bc 96 df 2e d3  |.k.T.304_"*.....|
+00000020  43 9c 9a be c9 93 b9 e1  9f 42 74 20 5d a2 d5 2d  |C........Bt ]..-|
+00000030  d6 9f 76 0c 14 dd e0 d3  71 a6 44 6a bc 3c ff a5  |..v.....q.Dj.<..|
+00000040  97 49 56 e0 3f 5b 47 87  31 83 1f 80 00 04 13 01  |.IV.?[G.1.......|
+00000050  00 ff 01 00 01 0f 00 0b  00 04 03 00 01 02 00 0a  |................|
 00000060  00 06 00 04 00 1d 00 17  00 23 00 00 00 16 00 00  |.........#......|
 00000070  00 17 00 00 00 0d 00 1e  00 1c 04 03 05 03 06 03  |................|
 00000080  08 07 08 08 08 09 08 0a  08 0b 08 04 08 05 08 06  |................|
 00000090  04 01 05 01 06 01 00 2b  00 03 02 03 04 00 2d 00  |.......+......-.|
-000000a0  02 01 01 00 33 00 26 00  24 00 1d 00 20 8c 7b 61  |....3.&.$... .{a|
-000000b0  71 c8 0b 1a 17 14 d9 eb  21 38 e6 2f c0 40 e9 2d  |q.......!8./.@.-|
-000000c0  3c 91 c5 4e 9d bb dd af  40 bc 91 38 74 00 29 00  |<..N....@..8t.).|
-000000d0  9c 00 77 00 71 50 46 ad  c1 db a8 38 86 7b 2b bb  |..w.qPF....8.{+.|
-000000e0  fd d0 c3 42 3e 00 00 00  00 00 00 00 00 00 00 00  |...B>...........|
-000000f0  00 00 00 00 00 94 68 2c  a3 82 51 ed 14 ef 68 ca  |......h,..Q...h.|
-00000100  42 c5 5c ab 26 c2 91 a9  01 83 13 26 8f 62 7c 89  |B.\.&......&.b|.|
-00000110  c0 a2 b5 9b 6d 4f a4 c9  e2 49 34 03 2c b2 7d d9  |....mO...I4.,.}.|
-00000120  af eb 1a 99 76 3c a5 ef  70 78 59 58 1c 45 80 c5  |....v<..pxYX.E..|
-00000130  f1 b8 91 b2 54 71 3f bf  4f 2a b2 9d 9d 6f 6f 1c  |....Tq?.O*...oo.|
-00000140  f1 3c 6c e6 a2 73 00 00  00 00 00 21 20 7b 6e 44  |.<l..s.....! {nD|
-00000150  ea e1 4c 20 9a d4 1c b5  32 0b d4 79 8e c7 50 fb  |..L ....2..y..P.|
-00000160  4e 94 6e 02 1c d3 6a 4e  86 cb ae 2c 02           |N.n...jN...,.|
+000000a0  02 01 01 00 33 00 26 00  24 00 1d 00 20 8e a4 3b  |....3.&.$... ..;|
+000000b0  ae a1 3e 4f be 70 12 25  be 4d 07 59 da dc 08 4c  |..>O.p.%.M.Y...L|
+000000c0  53 e3 f3 15 b0 99 6f 5a  2d 16 30 e6 37 00 29 00  |S.....oZ-.0.7.).|
+000000d0  94 00 6f 00 69 00 00 00  00 00 00 00 00 00 00 00  |..o.i...........|
+000000e0  00 00 00 00 00 94 68 2d  a3 82 51 ed 14 ef 68 ca  |......h-..Q...h.|
+000000f0  42 c5 5c 95 7a 77 9a 7a  61 99 c6 44 1e e6 5d 71  |B.\.zw.za..D..]q|
+00000100  41 c8 77 d1 d4 b6 39 bb  38 57 41 b8 41 f2 02 96  |A.w...9.8WA.A...|
+00000110  d0 b0 5b 99 76 3c 2b 52  f2 8f 5f 33 94 fa 66 74  |..[.v<+R.._3..ft|
+00000120  cc f0 60 1b ee 0a 38 30  78 b2 9e 54 16 d6 71 0e  |..`...80x..T..q.|
+00000130  b2 ea 4e 0f 13 f0 6e 63  88 e7 9f 55 65 0b 00 00  |..N...nc...Ue...|
+00000140  00 00 00 21 20 f1 10 27  87 e9 eb 1d b9 5f 0e f4  |...! ..'....._..|
+00000150  67 e3 19 b6 52 b4 1a 9f  b7 68 0c 4e 25 42 3a 78  |g...R....h.N%B:x|
+00000160  91 e1 9d 62 f4                                    |...b.|
 >>> Flow 2 (server to client)
 00000000  16 03 03 00 58 02 00 00  54 03 03 cf 21 ad 74 e5  |....X...T...!.t.|
 00000010  9a 61 11 be 1d 8c 02 1e  65 b8 91 c2 a2 11 16 7a  |.a......e......z|
-00000020  bb 8c 5e 07 9e 09 e2 c8  a8 33 9c 20 46 fe 89 4b  |..^......3. F..K|
-00000030  f3 1d ed 40 2d 5c 1b 23  26 f5 72 6f d1 b4 77 f5  |...@-\.#&.ro..w.|
-00000040  1a 9f d1 98 34 46 fe 89  0b 2d c1 f9 13 01 00 00  |....4F...-......|
+00000020  bb 8c 5e 07 9e 09 e2 c8  a8 33 9c 20 5d a2 d5 2d  |..^......3. ]..-|
+00000030  d6 9f 76 0c 14 dd e0 d3  71 a6 44 6a bc 3c ff a5  |..v.....q.Dj.<..|
+00000040  97 49 56 e0 3f 5b 47 87  31 83 1f 80 13 01 00 00  |.IV.?[G.1.......|
 00000050  0c 00 2b 00 02 03 04 00  33 00 02 00 17 14 03 03  |..+.....3.......|
 00000060  00 01 01                                          |...|
 >>> Flow 3 (client to server)
-00000000  14 03 03 00 01 01 16 03  03 01 89 01 00 01 85 03  |................|
-00000010  03 a0 27 b0 af b0 15 2c  ed 88 b2 e8 c5 67 2e db  |..'....,.....g..|
-00000020  0d 29 13 64 bb 58 3b 71  67 a9 47 65 8a 3c 09 44  |.).d.X;qg.Ge.<.D|
-00000030  29 20 46 fe 89 4b f3 1d  ed 40 2d 5c 1b 23 26 f5  |) F..K...@-\.#&.|
-00000040  72 6f d1 b4 77 f5 1a 9f  d1 98 34 46 fe 89 0b 2d  |ro..w.....4F...-|
-00000050  c1 f9 00 04 13 01 00 ff  01 00 01 38 00 0b 00 04  |...........8....|
+00000000  14 03 03 00 01 01 16 03  03 01 81 01 00 01 7d 03  |..............}.|
+00000010  03 c6 2c d1 55 71 9a 6b  02 54 cb 33 30 34 5f 22  |..,.Uq.k.T.304_"|
+00000020  2a bc 96 df 2e d3 43 9c  9a be c9 93 b9 e1 9f 42  |*.....C........B|
+00000030  74 20 5d a2 d5 2d d6 9f  76 0c 14 dd e0 d3 71 a6  |t ]..-..v.....q.|
+00000040  44 6a bc 3c ff a5 97 49  56 e0 3f 5b 47 87 31 83  |Dj.<...IV.?[G.1.|
+00000050  1f 80 00 04 13 01 00 ff  01 00 01 30 00 0b 00 04  |...........0....|
 00000060  03 00 01 02 00 0a 00 06  00 04 00 1d 00 17 00 23  |...............#|
 00000070  00 00 00 16 00 00 00 17  00 00 00 0d 00 1e 00 1c  |................|
 00000080  04 03 05 03 06 03 08 07  08 08 08 09 08 0a 08 0b  |................|
 00000090  08 04 08 05 08 06 04 01  05 01 06 01 00 2b 00 03  |.............+..|
 000000a0  02 03 04 00 2d 00 02 01  01 00 33 00 47 00 45 00  |....-.....3.G.E.|
-000000b0  17 00 41 04 6e 14 0d ac  3f 1a 2a 36 54 4f ec 9d  |..A.n...?.*6TO..|
-000000c0  da 5b 93 12 42 eb 58 11  1b 4c 5c 39 a2 32 b8 5b  |.[..B.X..L\9.2.[|
-000000d0  41 13 51 05 88 fe 45 d2  01 ef 8d 14 bc 96 de d3  |A.Q...E.........|
-000000e0  1c e3 eb 0c a0 a7 a3 7c  1c b1 9e 38 c2 dc f6 35  |.......|...8...5|
-000000f0  7b 5b 08 2e 00 29 00 9c  00 77 00 71 50 46 ad c1  |{[...)...w.qPF..|
-00000100  db a8 38 86 7b 2b bb fd  d0 c3 42 3e 00 00 00 00  |..8.{+....B>....|
-00000110  00 00 00 00 00 00 00 00  00 00 00 00 94 68 2c a3  |.............h,.|
-00000120  82 51 ed 14 ef 68 ca 42  c5 5c ab 26 c2 91 a9 01  |.Q...h.B.\.&....|
-00000130  83 13 26 8f 62 7c 89 c0  a2 b5 9b 6d 4f a4 c9 e2  |..&.b|.....mO...|
-00000140  49 34 03 2c b2 7d d9 af  eb 1a 99 76 3c a5 ef 70  |I4.,.}.....v<..p|
-00000150  78 59 58 1c 45 80 c5 f1  b8 91 b2 54 71 3f bf 4f  |xYX.E......Tq?.O|
-00000160  2a b2 9d 9d 6f 6f 1c f1  3c 6c e6 a2 73 00 00 00  |*...oo..<l..s...|
-00000170  00 00 21 20 10 ac 47 8c  dd 4f 9c ee f3 b2 0a 6b  |..! ..G..O.....k|
-00000180  30 56 13 1e a9 53 5b 02  a8 a0 c0 db 1a 44 f7 43  |0V...S[......D.C|
-00000190  af a3 8f b8                                       |....|
+000000b0  17 00 41 04 ef 92 7c 5c  e3 0d 1b 5c 8f 56 a2 93  |..A...|\...\.V..|
+000000c0  62 86 e4 5d ea 0b 63 1e  e1 ea db 85 a0 28 68 89  |b..]..c......(h.|
+000000d0  07 47 d6 18 b0 6e db c2  3c 7d b4 7e a3 cb 54 25  |.G...n..<}.~..T%|
+000000e0  73 9f f6 d1 83 c1 2e 67  2a db ec 4a 09 9e 20 cf  |s......g*..J.. .|
+000000f0  3f 8b 5d 9d 00 29 00 94  00 6f 00 69 00 00 00 00  |?.]..)...o.i....|
+00000100  00 00 00 00 00 00 00 00  00 00 00 00 94 68 2d a3  |.............h-.|
+00000110  82 51 ed 14 ef 68 ca 42  c5 5c 95 7a 77 9a 7a 61  |.Q...h.B.\.zw.za|
+00000120  99 c6 44 1e e6 5d 71 41  c8 77 d1 d4 b6 39 bb 38  |..D..]qA.w...9.8|
+00000130  57 41 b8 41 f2 02 96 d0  b0 5b 99 76 3c 2b 52 f2  |WA.A.....[.v<+R.|
+00000140  8f 5f 33 94 fa 66 74 cc  f0 60 1b ee 0a 38 30 78  |._3..ft..`...80x|
+00000150  b2 9e 54 16 d6 71 0e b2  ea 4e 0f 13 f0 6e 63 88  |..T..q...N...nc.|
+00000160  e7 9f 55 65 0b 00 00 00  00 00 21 20 fa ea cb 6c  |..Ue......! ...l|
+00000170  87 dc 71 c9 d3 b8 c5 6b  d2 4d a7 dd 01 6c f0 26  |..q....k.M...l.&|
+00000180  c6 bd 6a ce e8 37 5b a9  d3 ac 87 2d              |..j..7[....-|
 >>> Flow 4 (server to client)
 00000000  16 03 03 00 a1 02 00 00  9d 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 20 46 fe 89 4b  |........... F..K|
-00000030  f3 1d ed 40 2d 5c 1b 23  26 f5 72 6f d1 b4 77 f5  |...@-\.#&.ro..w.|
-00000040  1a 9f d1 98 34 46 fe 89  0b 2d c1 f9 13 01 00 00  |....4F...-......|
+00000020  00 00 00 00 00 00 00 00  00 00 00 20 5d a2 d5 2d  |........... ]..-|
+00000030  d6 9f 76 0c 14 dd e0 d3  71 a6 44 6a bc 3c ff a5  |..v.....q.Dj.<..|
+00000040  97 49 56 e0 3f 5b 47 87  31 83 1f 80 13 01 00 00  |.IV.?[G.1.......|
 00000050  55 00 2b 00 02 03 04 00  33 00 45 00 17 00 41 04  |U.+.....3.E...A.|
 00000060  1e 18 37 ef 0d 19 51 88  35 75 71 b5 e5 54 5b 12  |..7...Q.5uq..T[.|
 00000070  2e 8f 09 67 fd a7 24 20  3e b2 56 1c ce 97 28 5e  |...g..$ >.V...(^|
 00000080  f8 2b 2d 4f 9e f1 07 9f  6c 4b 5b 83 56 e2 32 42  |.+-O....lK[.V.2B|
 00000090  e9 58 b6 d7 49 a6 b5 68  1a 41 03 56 6b dc 5a 89  |.X..I..h.A.Vk.Z.|
-000000a0  00 29 00 02 00 00 17 03  03 00 17 ea 86 30 48 65  |.)...........0He|
-000000b0  cf a6 d4 9d af f7 75 d4  d3 dd af 79 ce 3a 42 5b  |......u....y.:B[|
-000000c0  68 7a 17 03 03 00 35 ef  d6 22 53 ec 3c 27 84 c7  |hz....5.."S.<'..|
-000000d0  7f b2 81 8e 3e 70 51 25  95 b4 6a 79 01 15 60 c0  |....>pQ%..jy..`.|
-000000e0  39 eb 5b 90 7b 50 f5 3b  50 64 d2 b2 d6 c7 72 cf  |9.[.{P.;Pd....r.|
-000000f0  35 f3 25 1c 86 4b 69 ab  6e 50 86 2e 17 03 03 00  |5.%..Ki.nP......|
-00000100  93 66 5a c1 de c6 92 96  95 92 48 90 e7 0f e1 08  |.fZ.......H.....|
-00000110  25 b2 72 a5 7f c5 17 6e  70 5d 6e 68 78 32 72 8d  |%.r....np]nhx2r.|
-00000120  3a fa 7a 66 76 26 10 9e  f9 92 ca 3b a7 6c 6c fa  |:.zfv&.....;.ll.|
-00000130  72 d1 22 f4 b0 b9 2a 90  bd ce 58 e4 ff 1d 88 99  |r."...*...X.....|
-00000140  a4 8d f9 10 af c8 35 cd  c4 6f 99 cd 9e 6c 95 b1  |......5..o...l..|
-00000150  b7 6e a4 48 9e 75 f1 d3  c0 b3 27 f1 61 83 ea 13  |.n.H.u....'.a...|
-00000160  06 7f 37 38 f1 31 9e 71  5a 97 15 b5 46 63 44 e8  |..78.1.qZ...FcD.|
-00000170  f4 a1 fc 81 5d f4 c7 65  be 76 da 79 bd fb e4 e6  |....]..e.v.y....|
-00000180  68 de ce f3 32 6b 0c ee  19 18 75 33 77 f2 34 3d  |h...2k....u3w.4=|
-00000190  9e c3 da b7                                       |....|
+000000a0  00 29 00 02 00 00 17 03  03 00 17 47 b9 2a 97 3d  |.).........G.*.=|
+000000b0  84 f9 65 f5 cf 27 b3 52  6d 2d 49 9d c1 c4 ea 14  |..e..'.Rm-I.....|
+000000c0  d5 dc 17 03 03 00 35 21  4d a1 eb 9f 49 63 35 99  |......5!M...Ic5.|
+000000d0  a3 85 ce 3a 40 cf 53 29  e6 d5 59 d5 26 12 78 c6  |...:@.S)..Y.&.x.|
+000000e0  be 01 c9 a2 f2 3d ba f9  ad 80 a1 f4 78 08 71 5e  |.....=......x.q^|
+000000f0  04 7c df 80 0f 2d 5d e4  be 50 74 31 17 03 03 00  |.|...-]..Pt1....|
+00000100  8b 90 1a fd 79 a1 b9 08  4d db 32 01 6d 36 be 1a  |....y...M.2.m6..|
+00000110  3f a8 b3 c7 5b 7b b1 f0  5d 55 67 ed af 87 50 16  |?...[{..]Ug...P.|
+00000120  ad d9 f1 af d2 3c 18 83  52 d5 3b e3 6d 7e ab 9a  |.....<..R.;.m~..|
+00000130  33 cd 2c e7 f4 18 84 3a  db 8b 73 d2 89 45 39 cf  |3.,....:..s..E9.|
+00000140  f0 19 78 ab 20 b6 81 3c  3b b5 55 2c c1 6d 6f d8  |..x. ..<;.U,.mo.|
+00000150  52 1f 90 b5 ed eb e3 0c  35 40 16 ff f3 15 06 4e  |R.......5@.....N|
+00000160  7e 98 3b f7 43 f9 98 80  84 36 1c 63 a0 3c 4b 57  |~.;.C....6.c.<KW|
+00000170  f1 89 57 df 64 b3 9a 77  86 d4 bc 85 eb 8a 1c e5  |..W.d..w........|
+00000180  98 d9 f6 cb 98 e0 20 84  07 8e 9b 2b              |...... ....+|
 >>> Flow 5 (client to server)
-00000000  17 03 03 00 35 59 51 fe  aa 0a 69 ef d5 0e ee e3  |....5YQ...i.....|
-00000010  0e 21 f7 e0 80 88 a0 da  23 7a 38 7f 73 e1 da e9  |.!......#z8.s...|
-00000020  7c 02 73 5e f2 64 e5 60  0e c6 d5 9e 7a 45 c2 0b  ||.s^.d.`....zE..|
-00000030  6f 08 46 46 5b f1 5b 67  5d 42                    |o.FF[.[g]B|
+00000000  17 03 03 00 35 dc 6e fd  7a 4f d5 b9 d5 d8 71 b7  |....5.n.zO....q.|
+00000010  14 b1 cb 86 5b e0 01 b1  75 ff 33 a3 42 36 bf fc  |....[...u.3.B6..|
+00000020  98 cc 15 c6 27 b2 57 1b  ce f0 b7 93 15 52 29 77  |....'.W......R)w|
+00000030  9e fe d2 4e fe 05 d3 a5  f7 01                    |...N......|
 >>> Flow 6 (server to client)
-00000000  17 03 03 00 1e 3c a5 86  73 ea 62 44 ee 3b 45 a2  |.....<..s.bD.;E.|
-00000010  2a 57 ed 27 0e 65 40 48  23 10 7f ff 27 e5 4e d1  |*W.'.e@H#...'.N.|
-00000020  99 9a e1 17 03 03 00 13  1e 78 1a 08 4b 24 1b fc  |.........x..K$..|
-00000030  78 e5 ab fd 8f bf 53 26  f9 b7 c0                 |x.....S&...|
+00000000  17 03 03 00 1e 70 33 b5  fd 3d b0 d6 e4 54 9b 15  |.....p3..=...T..|
+00000010  f9 d5 2e 12 4a ce d2 ba  b2 5d fe 92 ab d0 26 da  |....J....]....&.|
+00000020  7c 0b 9e 17 03 03 00 13  ba a1 6a a9 db 16 2d cf  ||.........j...-.|
+00000030  7e 54 77 8b 0a 6e 7d 31  fc dd 5e                 |~Tw..n}1..^|
diff --git a/src/crypto/tls/testdata/Server-TLSv13-X25519 b/src/crypto/tls/testdata/Server-TLSv13-X25519
index 0160c5a..62cd23b 100644
--- a/src/crypto/tls/testdata/Server-TLSv13-X25519
+++ b/src/crypto/tls/testdata/Server-TLSv13-X25519
@@ -1,98 +1,97 @@
 >>> Flow 1 (client to server)
-00000000  16 03 01 00 c2 01 00 00  be 03 03 cb 53 78 a8 58  |............Sx.X|
-00000010  de 5b 75 c2 c5 b3 ac fa  c3 6e 85 a7 e5 a3 a4 ca  |.[u......n......|
-00000020  1f 82 95 38 fa 79 4c e2  c8 66 8a 20 be 7a 94 d6  |...8.yL..f. .z..|
-00000030  f4 82 e2 2f 3b 2c e4 5f  ae c2 8b be d1 2f b6 67  |.../;,._...../.g|
-00000040  9e 78 7a 51 86 1f c1 d9  8f 43 2f 78 00 04 13 03  |.xzQ.....C/x....|
+00000000  16 03 01 00 c2 01 00 00  be 03 03 c1 f4 f0 72 fe  |..............r.|
+00000010  b9 17 c8 9e 71 08 cf 40  80 1a 11 06 68 dc de 21  |....q..@....h..!|
+00000020  14 fe e2 2f 6e 55 cf 9b  83 87 dd 20 63 a3 3f 38  |.../nU..... c.?8|
+00000030  4c 26 be 3c c0 2e e0 e0  5d 49 1b 92 45 6b 82 a9  |L&.<....]I..Ek..|
+00000040  10 ae c0 e4 65 b0 ce 48  75 5f 5b 12 00 04 13 03  |....e..Hu_[.....|
 00000050  00 ff 01 00 00 71 00 0b  00 04 03 00 01 02 00 0a  |.....q..........|
 00000060  00 04 00 02 00 1d 00 16  00 00 00 17 00 00 00 0d  |................|
 00000070  00 1e 00 1c 04 03 05 03  06 03 08 07 08 08 08 09  |................|
 00000080  08 0a 08 0b 08 04 08 05  08 06 04 01 05 01 06 01  |................|
 00000090  00 2b 00 03 02 03 04 00  2d 00 02 01 01 00 33 00  |.+......-.....3.|
-000000a0  26 00 24 00 1d 00 20 7f  3e a2 2e 2f 88 8a e1 f3  |&.$... .>../....|
-000000b0  6a a4 47 d7 6d b7 3c 02  c4 bb f6 de 41 38 50 74  |j.G.m.<.....A8Pt|
-000000c0  29 21 f5 fe 9f 0b 6f                              |)!....o|
+000000a0  26 00 24 00 1d 00 20 3e  7f 8c d5 2f 42 d2 cd 67  |&.$... >.../B..g|
+000000b0  24 07 69 fe 7e d0 3e 70  24 e4 62 aa 19 d6 c2 00  |$.i.~.>p$.b.....|
+000000c0  5c 0d 25 10 5f 36 09                              |\.%._6.|
 >>> Flow 2 (server to client)
 00000000  16 03 03 00 7a 02 00 00  76 03 03 00 00 00 00 00  |....z...v.......|
 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 be 7a 94 d6  |........... .z..|
-00000030  f4 82 e2 2f 3b 2c e4 5f  ae c2 8b be d1 2f b6 67  |.../;,._...../.g|
-00000040  9e 78 7a 51 86 1f c1 d9  8f 43 2f 78 13 03 00 00  |.xzQ.....C/x....|
+00000020  00 00 00 00 00 00 00 00  00 00 00 20 63 a3 3f 38  |........... c.?8|
+00000030  4c 26 be 3c c0 2e e0 e0  5d 49 1b 92 45 6b 82 a9  |L&.<....]I..Ek..|
+00000040  10 ae c0 e4 65 b0 ce 48  75 5f 5b 12 13 03 00 00  |....e..Hu_[.....|
 00000050  2e 00 2b 00 02 03 04 00  33 00 24 00 1d 00 20 2f  |..+.....3.$... /|
 00000060  e5 7d a3 47 cd 62 43 15  28 da ac 5f bb 29 07 30  |.}.G.bC.(.._.).0|
 00000070  ff f6 84 af c4 cf c2 ed  90 99 5f 58 cb 3b 74 14  |.........._X.;t.|
-00000080  03 03 00 01 01 17 03 03  00 17 fb 0e 8b 72 0d 35  |.............r.5|
-00000090  97 db e2 2e b8 20 be 96  27 6b cd ab 6b 24 5b c4  |..... ..'k..k$[.|
-000000a0  e9 17 03 03 02 6d 3a 21  03 ea 45 e9 4e f1 19 1e  |.....m:!..E.N...|
-000000b0  33 37 04 5b 3e db 54 f0  27 6f c7 96 78 50 01 46  |37.[>.T.'o..xP.F|
-000000c0  d1 8b 8f 79 70 21 9d 62  97 b9 bf 6d 14 e5 82 f4  |...yp!.b...m....|
-000000d0  ad 89 90 77 12 1f 61 8e  1d 94 d3 27 0f 0e eb 77  |...w..a....'...w|
-000000e0  8d b2 2f fb 58 b4 ee 88  19 91 47 d1 3d 10 9e 4a  |../.X.....G.=..J|
-000000f0  1e 41 b9 c6 41 8f 59 11  7f e0 ac e7 b9 d5 be 40  |.A..A.Y........@|
-00000100  cc aa bc ab 56 5a 2b a9  c9 cf df c0 dc 8f d2 9d  |....VZ+.........|
-00000110  59 a7 88 36 98 2e 87 c6  1d af 26 a1 e8 08 2d bd  |Y..6......&...-.|
-00000120  9b 5b 1c 4e 22 d2 a1 7c  4d 0b 0f af da 5d fe f7  |.[.N"..|M....]..|
-00000130  83 4d f6 54 c1 fe 03 73  6d c9 17 02 6b 78 09 91  |.M.T...sm...kx..|
-00000140  aa 61 9a 93 04 66 fa 6b  e8 2e d7 18 d2 4d 6e 25  |.a...f.k.....Mn%|
-00000150  c3 01 2f a5 0e 1b da a1  64 67 e5 a5 c0 5b ef ec  |../.....dg...[..|
-00000160  83 5a d3 0e 44 b7 d5 97  9c c7 c4 94 b4 4b 01 e6  |.Z..D........K..|
-00000170  48 28 21 cb 04 10 be b0  3b 53 df 15 47 12 67 ea  |H(!.....;S..G.g.|
-00000180  24 65 a1 ce 0b af 05 5b  c9 95 bf 28 2e 55 3c 21  |$e.....[...(.U<!|
-00000190  dc 6f 43 54 87 4d 2a b0  4a e8 01 01 e8 cf 07 6a  |.oCT.M*.J......j|
-000001a0  09 d0 f7 ae 97 e1 68 78  ff 33 7e 07 e1 77 ee ec  |......hx.3~..w..|
-000001b0  b8 1f d5 73 34 06 3f 32  57 e2 a4 52 82 31 86 cc  |...s4.?2W..R.1..|
-000001c0  2f 1b 9c 77 78 64 de 01  ac 4c f4 b9 bc 3d 0e f8  |/..wxd...L...=..|
-000001d0  d1 b7 bd 9c 35 05 19 dc  1c 3b 05 c2 c0 66 e7 c3  |....5....;...f..|
-000001e0  68 0e 6d d0 83 92 46 d1  7b 81 9b 87 5b 3f 5b b9  |h.m...F.{...[?[.|
-000001f0  fa cc a5 cc 04 d3 01 54  39 a7 66 50 82 b8 64 a6  |.......T9.fP..d.|
-00000200  06 e3 24 34 62 80 79 28  74 15 1c 8d 91 00 b0 fa  |..$4b.y(t.......|
-00000210  af 52 c3 6a fb c8 41 af  77 3d bd 67 d3 e6 2a 76  |.R.j..A.w=.g..*v|
-00000220  ab 63 90 bc 3c 56 31 2d  62 dd 84 98 3f 6a 6b e9  |.c..<V1-b...?jk.|
-00000230  af 2a ed 1a bf da b9 bd  23 f3 b0 5b a3 a3 72 21  |.*......#..[..r!|
-00000240  fb e9 0d 27 58 27 bd 11  60 49 4f f4 6a 38 a4 db  |...'X'..`IO.j8..|
-00000250  ff 26 88 d6 1b 50 35 a6  02 d9 e8 c6 05 54 2d 62  |.&...P5......T-b|
-00000260  92 7a 45 86 e5 7d 61 93  05 d6 61 ae af b4 43 cf  |.zE..}a...a...C.|
-00000270  21 40 d0 f1 7f 92 48 92  ed d5 bd 33 3c f9 69 0d  |!@....H....3<.i.|
-00000280  bf 7c 72 c4 85 e0 c3 42  4d 69 30 d1 5a 2d 11 95  |.|r....BMi0.Z-..|
-00000290  ee 9f 69 9b 99 b9 0c 17  51 15 17 d7 ea fb c8 01  |..i.....Q.......|
-000002a0  22 ac 3e 54 9f 2c 95 9d  3f 98 d3 9c ec d9 ac d8  |".>T.,..?.......|
-000002b0  71 6a d6 0f 53 5e ea 92  53 e3 dd 96 be 38 61 74  |qj..S^..S....8at|
-000002c0  5d 74 ac c4 8c 72 c6 82  dc f4 22 fb 5c 64 0f 33  |]t...r....".\d.3|
-000002d0  b3 31 a1 a9 e0 6d 96 14  0b e1 00 7d 42 44 45 02  |.1...m.....}BDE.|
-000002e0  42 63 a1 15 14 73 b6 e4  18 a7 30 9e e0 df a9 ba  |Bc...s....0.....|
-000002f0  44 72 64 ea 06 a4 a1 46  58 07 b1 a8 48 dc ea 73  |Drd....FX...H..s|
-00000300  35 d8 98 de 6c 13 93 bb  7a 64 fb df bf 93 cb 65  |5...l...zd.....e|
-00000310  a4 1a 3a 17 03 03 00 99  41 8d 8b b5 97 ae 6a fb  |..:.....A.....j.|
-00000320  28 ae 10 17 a7 a7 bd a2  a2 54 61 33 ea 5c 3d 82  |(........Ta3.\=.|
-00000330  6c 7d fe 3e 3b 6f 92 6b  6a 0a ee fe 85 90 67 59  |l}.>;o.kj.....gY|
-00000340  df d9 fc c0 4a 9a 5b ae  57 29 5d fb ff 74 28 f1  |....J.[.W)]..t(.|
-00000350  27 f4 ab ee f9 e8 04 cf  2b 62 4d a8 6a 4f ac 85  |'.......+bM.jO..|
-00000360  ec a5 18 d7 88 74 9e 3e  ea 79 8e 5d df f8 8a 1c  |.....t.>.y.]....|
-00000370  10 1b 1d d3 4a cf 2a 56  f2 ca 90 1f 37 2c cc b7  |....J.*V....7,..|
-00000380  31 91 fb d7 7f bb 07 e2  ec 84 8a 6f 08 a1 7e 2e  |1..........o..~.|
-00000390  62 8a 5c b9 76 d3 68 e5  d0 b8 73 92 86 80 e5 af  |b.\.v.h...s.....|
-000003a0  b4 ef 13 ea 3c 09 2a 3f  7e be 16 72 1c 46 a0 29  |....<.*?~..r.F.)|
-000003b0  0a 17 03 03 00 35 a7 10  63 c4 a1 7f 26 17 ba b7  |.....5..c...&...|
-000003c0  e3 86 6e 52 36 00 8e 68  84 dc 51 8d a6 0c 21 ba  |..nR6..h..Q...!.|
-000003d0  c3 d9 84 49 ed 57 78 98  68 be 78 a6 d1 f0 67 ac  |...I.Wx.h.x...g.|
-000003e0  65 9e d2 d8 f3 b9 58 27  24 57 83 17 03 03 00 93  |e.....X'$W......|
-000003f0  00 54 de 7f 11 18 1d 12  83 10 77 b2 e9 fd a7 a4  |.T........w.....|
-00000400  46 c4 1c 15 0d 24 e0 94  f8 ff 84 19 45 ad 52 c8  |F....$......E.R.|
-00000410  85 0b c5 4a a7 6d a1 b0  12 cb 13 58 f6 44 a3 e2  |...J.m.....X.D..|
-00000420  b8 7a b5 8c 8f 8a 47 76  ef cb 2d 7b 6e 75 81 39  |.z....Gv..-{nu.9|
-00000430  3e 12 e8 b5 c6 2d cb e0  fd ac af 58 5a 01 70 32  |>....-.....XZ.p2|
-00000440  0e 12 32 95 10 70 94 28  ec 9b 50 e5 78 c4 b7 75  |..2..p.(..P.x..u|
-00000450  97 4a 54 97 bb 30 e6 19  8a 86 87 d7 50 02 8f a8  |.JT..0......P...|
-00000460  1b 97 d6 e7 bf 25 66 9a  5a cd 5c 84 33 42 f1 72  |.....%f.Z.\.3B.r|
-00000470  d2 44 f1 64 e1 3d 38 b7  7a 32 e3 e8 9a 49 19 90  |.D.d.=8.z2...I..|
-00000480  00 2b f6                                          |.+.|
+00000080  03 03 00 01 01 17 03 03  00 17 4f 52 70 18 74 9c  |..........ORp.t.|
+00000090  40 4e b0 5a 7a bc aa b0  b9 22 70 b1 90 9c 04 ef  |@N.Zz...."p.....|
+000000a0  e7 17 03 03 02 6d a8 7e  5a 4a 5f 3d 97 f2 74 93  |.....m.~ZJ_=..t.|
+000000b0  ce 75 f5 be 0f 2e c4 58  d6 91 4d fb 9f 80 56 3c  |.u.....X..M...V<|
+000000c0  9c d8 ea 20 2e f7 ce 34  80 af 47 0f 41 3f f9 2f  |... ...4..G.A?./|
+000000d0  23 c1 94 9e de 51 43 c5  1e 31 98 e6 15 33 63 64  |#....QC..1...3cd|
+000000e0  22 39 87 83 87 66 d0 9e  85 2a b2 62 5e fd 50 ec  |"9...f...*.b^.P.|
+000000f0  0f d0 ec dd d4 75 57 0d  3f 7e a3 a4 40 f7 67 d2  |.....uW.?~..@.g.|
+00000100  22 ba 5f a1 38 0b ea 8e  7d 95 43 70 52 0f b0 5f  |"._.8...}.CpR.._|
+00000110  ef 26 5a 52 a6 94 b4 69  89 e9 0e 4f f5 d8 60 1b  |.&ZR...i...O..`.|
+00000120  d3 6a fd 74 8d 19 ce 6a  72 f1 c1 96 f9 86 66 3b  |.j.t...jr.....f;|
+00000130  2b 38 b3 e3 76 4b fd 4a  82 3e f2 2c bc 4c 19 d7  |+8..vK.J.>.,.L..|
+00000140  7a 62 21 3e 7c 41 ff 23  87 66 81 79 f0 ad a1 3e  |zb!>|A.#.f.y...>|
+00000150  c2 e9 f3 ba 38 3a b5 ad  49 f3 ae 70 71 0a af d2  |....8:..I..pq...|
+00000160  f3 ae 70 df fd 93 8c 3d  ca bd 8c 86 39 c9 9c d4  |..p....=....9...|
+00000170  a9 a8 37 04 92 9b 0a 4e  8d 43 96 3d a4 b5 e0 5d  |..7....N.C.=...]|
+00000180  18 b1 03 32 0a b5 f2 e6  8c ca 1d ff cf 39 b7 00  |...2.........9..|
+00000190  5a 5a 1a 3d de 75 17 84  12 a4 f1 08 9d b3 ae 56  |ZZ.=.u.........V|
+000001a0  9d e9 af 30 67 64 fb 13  9a de 2e ba 03 ee 52 4c  |...0gd........RL|
+000001b0  4f 85 f3 1b fc d0 ef 75  1a 31 99 d9 89 74 41 9d  |O......u.1...tA.|
+000001c0  c8 96 48 49 f5 f3 ca 8c  6f 08 67 2a d1 b5 05 19  |..HI....o.g*....|
+000001d0  13 6b 0b 4c 87 f8 00 ab  83 70 4e bb 7e c7 f3 1e  |.k.L.....pN.~...|
+000001e0  ba 83 4b 7f 65 c2 42 8d  00 b1 3e 3d f8 4d c3 7a  |..K.e.B...>=.M.z|
+000001f0  b9 af 68 dc 0d 24 7a a6  41 15 16 db fb 57 99 68  |..h..$z.A....W.h|
+00000200  a9 35 77 40 6a 45 94 d3  e0 03 8d 41 86 d5 51 c6  |.5w@jE.....A..Q.|
+00000210  05 27 c5 56 97 30 41 44  26 18 e0 0f 93 cc f2 5e  |.'.V.0AD&......^|
+00000220  f1 35 35 0f 54 25 51 23  78 37 39 80 d9 c2 e8 54  |.55.T%Q#x79....T|
+00000230  79 16 e0 e0 36 cf f1 8b  23 fa 67 46 66 e0 25 0e  |y...6...#.gFf.%.|
+00000240  25 33 c4 52 93 ac 12 e0  8e f9 e8 c9 ec e7 f8 e6  |%3.R............|
+00000250  09 81 c1 d1 89 33 24 a3  c6 c7 27 6c 3b c8 b7 4f  |.....3$...'l;..O|
+00000260  8a 14 ed 58 a7 5f ba fc  cc 4f 6b eb ff c2 60 68  |...X._...Ok...`h|
+00000270  41 9c 4b b6 34 10 a6 8f  f8 3c 47 2f 39 75 86 03  |A.K.4....<G/9u..|
+00000280  60 35 06 84 f2 96 35 39  0a c2 3e cb 3c fa d8 fa  |`5....59..>.<...|
+00000290  66 3c 9c c9 6b 32 3f ea  bd 5d 4d 75 e5 4b 88 93  |f<..k2?..]Mu.K..|
+000002a0  1f 47 73 3b 55 8a e0 e4  7e e5 2f dc 2d d4 f6 c0  |.Gs;U...~./.-...|
+000002b0  3a b4 e4 72 b2 5a 0d d1  10 28 3f 61 73 96 94 d0  |:..r.Z...(?as...|
+000002c0  fb 26 83 95 0e 7a 47 6d  75 d4 f4 ad cc 3e 8f 4c  |.&...zGmu....>.L|
+000002d0  3b 95 83 61 40 4f 3e 82  58 d0 ca 7f 1d 9a e3 86  |;..a@O>.X.......|
+000002e0  48 53 1f 5d 35 9d 1e 46  c2 4b 70 53 60 1e 1d 04  |HS.]5..F.KpS`...|
+000002f0  9c 5b 6a f2 0b fc 4d 04  a6 38 85 b8 f1 06 cd 40  |.[j...M..8.....@|
+00000300  bb 73 fa bf 75 21 70 93  31 83 8d 8a a4 b3 4a 2f  |.s..u!p.1.....J/|
+00000310  45 f0 b2 17 03 03 00 99  eb ae 23 e6 63 22 52 ac  |E.........#.c"R.|
+00000320  2b 69 05 9d 7d b3 c6 b6  1f 5b 00 7c fb 67 1b af  |+i..}....[.|.g..|
+00000330  42 38 40 ea ca bb dc 7d  92 94 dd ed 1a 20 65 8a  |B8@....}..... e.|
+00000340  5c a3 5c 28 9f 10 8b 11  61 bb 0a 56 5a ef ec 7a  |\.\(....a..VZ..z|
+00000350  50 b5 2d 67 62 77 80 dc  ee a6 cd f3 09 ff 8f d8  |P.-gbw..........|
+00000360  ff 6d d8 47 95 58 cf 2b  e7 b0 f8 26 61 58 35 a3  |.m.G.X.+...&aX5.|
+00000370  07 4d 2f 99 5d 33 6b e8  ac 6a 14 ef 2c 57 9a e3  |.M/.]3k..j..,W..|
+00000380  b7 1b bf d6 bf b8 6a 29  4a 74 0d 15 91 90 c3 4a  |......j)Jt.....J|
+00000390  40 13 8c 52 e6 67 d6 de  6c d8 4e 35 20 d3 0b e6  |@..R.g..l.N5 ...|
+000003a0  36 58 4e 79 3a 03 f0 bc  34 1b 3e 7e e3 ad d8 e3  |6XNy:...4.>~....|
+000003b0  58 17 03 03 00 35 ba 6d  a2 40 3a cb 43 80 cb af  |X....5.m.@:.C...|
+000003c0  df 8f 2c 0d 20 53 f5 13  06 6b 0b e8 e7 36 31 4b  |..,. S...k...61K|
+000003d0  19 ad 86 5e 39 2e 52 5a  d9 86 f4 64 0e 8c 9a d5  |...^9.RZ...d....|
+000003e0  9a a2 c1 81 65 1e da 05  28 8a 36 17 03 03 00 8b  |....e...(.6.....|
+000003f0  48 2d b0 5b 7e 39 95 b2  6a de 46 53 fb ba 7b 12  |H-.[~9..j.FS..{.|
+00000400  26 a1 1a b0 24 c0 8c c3  77 e1 0e 09 1c 5f 6a 7b  |&...$...w...._j{|
+00000410  03 0b 3d 92 77 81 b1 97  22 0f 6e cd 04 97 28 79  |..=.w...".n...(y|
+00000420  eb 88 3d 7b 20 93 0b 67  df 32 2e bb 38 13 8f 28  |..={ ..g.2..8..(|
+00000430  c1 b8 2c 22 75 42 01 b8  50 2c 20 30 91 0d e5 a0  |..,"uB..P, 0....|
+00000440  5c dd 5b 53 c6 30 fd b4  a5 f7 e9 6f 49 61 70 32  |\.[S.0.....oIap2|
+00000450  7f fd bb 08 c4 93 e8 e2  0a f6 7d 0f e8 94 22 fe  |..........}...".|
+00000460  af b7 b6 4a 35 d1 63 6c  bd ce 1e 72 63 ca 05 7c  |...J5.cl...rc..||
+00000470  64 4d ae 94 28 b2 15 b5  71 16 77                 |dM..(...q.w|
 >>> Flow 3 (client to server)
-00000000  14 03 03 00 01 01 17 03  03 00 35 9d c7 a1 4d 5f  |..........5...M_|
-00000010  7f 3a 04 b0 cf de 09 d5  84 c1 8f 9b 85 a6 a0 53  |.:.............S|
-00000020  c3 aa 19 5e a0 b2 a2 f1  22 f2 51 e0 25 c5 49 57  |...^....".Q.%.IW|
-00000030  52 de ad 75 ec e4 e3 36  84 78 22 c8 6c 80 88 8c  |R..u...6.x".l...|
+00000000  14 03 03 00 01 01 17 03  03 00 35 97 9f be 06 f2  |..........5.....|
+00000010  96 ae fa 11 e0 23 2b 6a  b0 2e f5 e9 fc 10 b2 36  |.....#+j.......6|
+00000020  dc 62 b0 70 1e 42 e3 c5  ce c8 f7 a7 cb 1b c6 3b  |.b.p.B.........;|
+00000030  59 23 d0 10 be f5 f0 1e  38 f4 63 bd 36 28 24 eb  |Y#......8.c.6($.|
 >>> Flow 4 (server to client)
-00000000  17 03 03 00 1e 3f 0d f6  84 47 21 4e 37 7b df eb  |.....?...G!N7{..|
-00000010  eb 38 af a5 ec b9 b6 20  24 f5 1a 1e 25 77 92 82  |.8..... $...%w..|
-00000020  97 88 9f 17 03 03 00 13  e2 80 d8 e1 2a bf d5 e3  |............*...|
-00000030  bc b7 82 2f 50 2c e5 b9  4b 8c d6                 |.../P,..K..|
+00000000  17 03 03 00 1e 05 1b a2  f1 4b 74 46 76 1b 23 77  |.........KtFv.#w|
+00000010  79 df f1 67 bf e9 39 f3  b7 56 76 ba fa 4f 30 49  |y..g..9..Vv..O0I|
+00000020  18 7b 52 17 03 03 00 13  ef 66 20 67 cb 74 a9 b6  |.{R......f g.t..|
+00000030  93 6f cc a3 9e d5 f2 7d  81 10 71                 |.o.....}..q|
diff --git a/src/crypto/tls/ticket.go b/src/crypto/tls/ticket.go
index b82ccd1..b43101f 100644
--- a/src/crypto/tls/ticket.go
+++ b/src/crypto/tls/ticket.go
@@ -5,181 +5,417 @@
 package tls
 
 import (
-	"bytes"
 	"crypto/aes"
 	"crypto/cipher"
 	"crypto/hmac"
 	"crypto/sha256"
 	"crypto/subtle"
+	"crypto/x509"
 	"errors"
 	"io"
 
 	"golang.org/x/crypto/cryptobyte"
 )
 
-// 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
-	createdAt    uint64
-	masterSecret []byte // opaque master_secret<1..2^16-1>;
-	// struct { opaque certificate<1..2^24-1> } Certificate;
-	certificates [][]byte // Certificate certificate_list<0..2^24-1>;
+// A SessionState is a resumable session.
+type SessionState struct {
+	// Encoded as a SessionState (in the language of RFC 8446, Section 3).
+	//
+	//   enum { server(1), client(2) } SessionStateType;
+	//
+	//   opaque Certificate<1..2^24-1>;
+	//
+	//   Certificate CertificateChain<0..2^24-1>;
+	//
+	//   opaque Extra<0..2^24-1>;
+	//
+	//   struct {
+	//       uint16 version;
+	//       SessionStateType type;
+	//       uint16 cipher_suite;
+	//       uint64 created_at;
+	//       opaque secret<1..2^8-1>;
+	//       Extra extra<0..2^24-1>;
+	//       uint8 ext_master_secret = { 0, 1 };
+	//       uint8 early_data = { 0, 1 };
+	//       CertificateEntry certificate_list<0..2^24-1>;
+	//       CertificateChain verified_chains<0..2^24-1>; /* excluding leaf */
+	//       select (SessionState.early_data) {
+	//           case 0: Empty;
+	//           case 1: opaque alpn<1..2^8-1>;
+	//       };
+	//       select (SessionState.type) {
+	//           case server: Empty;
+	//           case client: struct {
+	//               select (SessionState.version) {
+	//                   case VersionTLS10..VersionTLS12: Empty;
+	//                   case VersionTLS13: struct {
+	//                       uint64 use_by;
+	//                       uint32 age_add;
+	//                   };
+	//               };
+	//           };
+	//       };
+	//   } SessionState;
+	//
 
-	// 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
+	// Extra is ignored by crypto/tls, but is encoded by [SessionState.Bytes]
+	// and parsed by [ParseSessionState].
+	//
+	// This allows [Config.UnwrapSession]/[Config.WrapSession] and
+	// [ClientSessionCache] implementations to store and retrieve additional
+	// data alongside this session.
+	//
+	// To allow different layers in a protocol stack to share this field,
+	// applications must only append to it, not replace it, and must use entries
+	// that can be recognized even if out of order (for example, by starting
+	// with a id and version prefix).
+	Extra [][]byte
+
+	// EarlyData indicates whether the ticket can be used for 0-RTT in a QUIC
+	// connection. The application may set this to false if it is true to
+	// decline to offer 0-RTT even if supported.
+	EarlyData bool
+
+	version     uint16
+	isClient    bool
+	cipherSuite uint16
+	// createdAt is the generation time of the secret on the sever (which for
+	// TLS 1.0–1.2 might be earlier than the current session) and the time at
+	// which the ticket was received on the client.
+	createdAt         uint64 // seconds since UNIX epoch
+	secret            []byte // master secret for TLS 1.2, or the PSK for TLS 1.3
+	extMasterSecret   bool
+	peerCertificates  []*x509.Certificate
+	activeCertHandles []*activeCert
+	ocspResponse      []byte
+	scts              [][]byte
+	verifiedChains    [][]*x509.Certificate
+	alpnProtocol      string // only set if EarlyData is true
+
+	// Client-side TLS 1.3-only fields.
+	useBy  uint64 // seconds since UNIX epoch
+	ageAdd uint32
 }
 
-func (m *sessionState) marshal() ([]byte, error) {
+// Bytes encodes the session, including any private fields, so that it can be
+// parsed by [ParseSessionState]. The encoding contains secret values critical
+// to the security of future and possibly past sessions.
+//
+// The specific encoding should be considered opaque and may change incompatibly
+// between Go versions.
+func (s *SessionState) Bytes() ([]byte, error) {
 	var b cryptobyte.Builder
-	b.AddUint16(m.vers)
-	b.AddUint16(m.cipherSuite)
-	addUint64(&b, m.createdAt)
-	b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
-		b.AddBytes(m.masterSecret)
+	b.AddUint16(s.version)
+	if s.isClient {
+		b.AddUint8(2) // client
+	} else {
+		b.AddUint8(1) // server
+	}
+	b.AddUint16(s.cipherSuite)
+	addUint64(&b, s.createdAt)
+	b.AddUint8LengthPrefixed(func(b *cryptobyte.Builder) {
+		b.AddBytes(s.secret)
 	})
 	b.AddUint24LengthPrefixed(func(b *cryptobyte.Builder) {
-		for _, cert := range m.certificates {
+		for _, extra := range s.Extra {
 			b.AddUint24LengthPrefixed(func(b *cryptobyte.Builder) {
-				b.AddBytes(cert)
+				b.AddBytes(extra)
 			})
 		}
 	})
-	return b.Bytes()
-}
-
-func (m *sessionState) unmarshal(data []byte) bool {
-	*m = sessionState{usedOldKey: m.usedOldKey}
-	s := cryptobyte.String(data)
-	if ok := s.ReadUint16(&m.vers) &&
-		s.ReadUint16(&m.cipherSuite) &&
-		readUint64(&s, &m.createdAt) &&
-		readUint16LengthPrefixed(&s, &m.masterSecret) &&
-		len(m.masterSecret) != 0; !ok {
-		return false
+	if s.extMasterSecret {
+		b.AddUint8(1)
+	} else {
+		b.AddUint8(0)
 	}
-	var certList cryptobyte.String
-	if !s.ReadUint24LengthPrefixed(&certList) {
-		return false
+	if s.EarlyData {
+		b.AddUint8(1)
+	} else {
+		b.AddUint8(0)
 	}
-	for !certList.Empty() {
-		var cert []byte
-		if !readUint24LengthPrefixed(&certList, &cert) {
-			return false
-		}
-		m.certificates = append(m.certificates, cert)
-	}
-	return s.Empty()
-}
-
-// sessionStateTLS13 is the content of a TLS 1.3 session ticket. Its first
-// version (revision = 0) doesn't carry any of the information needed for 0-RTT
-// validation and the nonce is always empty.
-type sessionStateTLS13 struct {
-	// uint8 version  = 0x0304;
-	// uint8 revision = 0;
-	cipherSuite      uint16
-	createdAt        uint64
-	resumptionSecret []byte      // opaque resumption_master_secret<1..2^8-1>;
-	certificate      Certificate // CertificateEntry certificate_list<0..2^24-1>;
-}
-
-func (m *sessionStateTLS13) marshal() ([]byte, error) {
-	var b cryptobyte.Builder
-	b.AddUint16(VersionTLS13)
-	b.AddUint8(0) // revision
-	b.AddUint16(m.cipherSuite)
-	addUint64(&b, m.createdAt)
-	b.AddUint8LengthPrefixed(func(b *cryptobyte.Builder) {
-		b.AddBytes(m.resumptionSecret)
+	marshalCertificate(&b, Certificate{
+		Certificate:                 certificatesToBytesSlice(s.peerCertificates),
+		OCSPStaple:                  s.ocspResponse,
+		SignedCertificateTimestamps: s.scts,
 	})
-	marshalCertificate(&b, m.certificate)
+	b.AddUint24LengthPrefixed(func(b *cryptobyte.Builder) {
+		for _, chain := range s.verifiedChains {
+			b.AddUint24LengthPrefixed(func(b *cryptobyte.Builder) {
+				// We elide the first certificate because it's always the leaf.
+				if len(chain) == 0 {
+					b.SetError(errors.New("tls: internal error: empty verified chain"))
+					return
+				}
+				for _, cert := range chain[1:] {
+					b.AddUint24LengthPrefixed(func(b *cryptobyte.Builder) {
+						b.AddBytes(cert.Raw)
+					})
+				}
+			})
+		}
+	})
+	if s.EarlyData {
+		b.AddUint8LengthPrefixed(func(b *cryptobyte.Builder) {
+			b.AddBytes([]byte(s.alpnProtocol))
+		})
+	}
+	if s.isClient {
+		if s.version >= VersionTLS13 {
+			addUint64(&b, s.useBy)
+			b.AddUint32(s.ageAdd)
+		}
+	}
 	return b.Bytes()
 }
 
-func (m *sessionStateTLS13) unmarshal(data []byte) bool {
-	*m = sessionStateTLS13{}
-	s := cryptobyte.String(data)
-	var version uint16
-	var revision uint8
-	return s.ReadUint16(&version) &&
-		version == VersionTLS13 &&
-		s.ReadUint8(&revision) &&
-		revision == 0 &&
-		s.ReadUint16(&m.cipherSuite) &&
-		readUint64(&s, &m.createdAt) &&
-		readUint8LengthPrefixed(&s, &m.resumptionSecret) &&
-		len(m.resumptionSecret) != 0 &&
-		unmarshalCertificate(&s, &m.certificate) &&
-		s.Empty()
+func certificatesToBytesSlice(certs []*x509.Certificate) [][]byte {
+	s := make([][]byte, 0, len(certs))
+	for _, c := range certs {
+		s = append(s, c.Raw)
+	}
+	return s
 }
 
-func (c *Conn) encryptTicket(state []byte) ([]byte, error) {
-	if len(c.ticketKeys) == 0 {
+// ParseSessionState parses a [SessionState] encoded by [SessionState.Bytes].
+func ParseSessionState(data []byte) (*SessionState, error) {
+	ss := &SessionState{}
+	s := cryptobyte.String(data)
+	var typ, extMasterSecret, earlyData uint8
+	var cert Certificate
+	var extra cryptobyte.String
+	if !s.ReadUint16(&ss.version) ||
+		!s.ReadUint8(&typ) ||
+		(typ != 1 && typ != 2) ||
+		!s.ReadUint16(&ss.cipherSuite) ||
+		!readUint64(&s, &ss.createdAt) ||
+		!readUint8LengthPrefixed(&s, &ss.secret) ||
+		!s.ReadUint24LengthPrefixed(&extra) ||
+		!s.ReadUint8(&extMasterSecret) ||
+		!s.ReadUint8(&earlyData) ||
+		len(ss.secret) == 0 ||
+		!unmarshalCertificate(&s, &cert) {
+		return nil, errors.New("tls: invalid session encoding")
+	}
+	for !extra.Empty() {
+		var e []byte
+		if !readUint24LengthPrefixed(&extra, &e) {
+			return nil, errors.New("tls: invalid session encoding")
+		}
+		ss.Extra = append(ss.Extra, e)
+	}
+	switch extMasterSecret {
+	case 0:
+		ss.extMasterSecret = false
+	case 1:
+		ss.extMasterSecret = true
+	default:
+		return nil, errors.New("tls: invalid session encoding")
+	}
+	switch earlyData {
+	case 0:
+		ss.EarlyData = false
+	case 1:
+		ss.EarlyData = true
+	default:
+		return nil, errors.New("tls: invalid session encoding")
+	}
+	for _, cert := range cert.Certificate {
+		c, err := globalCertCache.newCert(cert)
+		if err != nil {
+			return nil, err
+		}
+		ss.activeCertHandles = append(ss.activeCertHandles, c)
+		ss.peerCertificates = append(ss.peerCertificates, c.cert)
+	}
+	ss.ocspResponse = cert.OCSPStaple
+	ss.scts = cert.SignedCertificateTimestamps
+	var chainList cryptobyte.String
+	if !s.ReadUint24LengthPrefixed(&chainList) {
+		return nil, errors.New("tls: invalid session encoding")
+	}
+	for !chainList.Empty() {
+		var certList cryptobyte.String
+		if !chainList.ReadUint24LengthPrefixed(&certList) {
+			return nil, errors.New("tls: invalid session encoding")
+		}
+		var chain []*x509.Certificate
+		if len(ss.peerCertificates) == 0 {
+			return nil, errors.New("tls: invalid session encoding")
+		}
+		chain = append(chain, ss.peerCertificates[0])
+		for !certList.Empty() {
+			var cert []byte
+			if !readUint24LengthPrefixed(&certList, &cert) {
+				return nil, errors.New("tls: invalid session encoding")
+			}
+			c, err := globalCertCache.newCert(cert)
+			if err != nil {
+				return nil, err
+			}
+			ss.activeCertHandles = append(ss.activeCertHandles, c)
+			chain = append(chain, c.cert)
+		}
+		ss.verifiedChains = append(ss.verifiedChains, chain)
+	}
+	if ss.EarlyData {
+		var alpn []byte
+		if !readUint8LengthPrefixed(&s, &alpn) {
+			return nil, errors.New("tls: invalid session encoding")
+		}
+		ss.alpnProtocol = string(alpn)
+	}
+	if isClient := typ == 2; !isClient {
+		if !s.Empty() {
+			return nil, errors.New("tls: invalid session encoding")
+		}
+		return ss, nil
+	}
+	ss.isClient = true
+	if len(ss.peerCertificates) == 0 {
+		return nil, errors.New("tls: no server certificates in client session")
+	}
+	if ss.version < VersionTLS13 {
+		if !s.Empty() {
+			return nil, errors.New("tls: invalid session encoding")
+		}
+		return ss, nil
+	}
+	if !s.ReadUint64(&ss.useBy) || !s.ReadUint32(&ss.ageAdd) || !s.Empty() {
+		return nil, errors.New("tls: invalid session encoding")
+	}
+	return ss, nil
+}
+
+// sessionState returns a partially filled-out [SessionState] with information
+// from the current connection.
+func (c *Conn) sessionState() (*SessionState, error) {
+	return &SessionState{
+		version:           c.vers,
+		cipherSuite:       c.cipherSuite,
+		createdAt:         uint64(c.config.time().Unix()),
+		alpnProtocol:      c.clientProtocol,
+		peerCertificates:  c.peerCertificates,
+		activeCertHandles: c.activeCertHandles,
+		ocspResponse:      c.ocspResponse,
+		scts:              c.scts,
+		isClient:          c.isClient,
+		extMasterSecret:   c.extMasterSecret,
+		verifiedChains:    c.verifiedChains,
+	}, nil
+}
+
+// EncryptTicket encrypts a ticket with the Config's configured (or default)
+// session ticket keys. It can be used as a [Config.WrapSession] implementation.
+func (c *Config) EncryptTicket(cs ConnectionState, ss *SessionState) ([]byte, error) {
+	ticketKeys := c.ticketKeys(nil)
+	stateBytes, err := ss.Bytes()
+	if err != nil {
+		return nil, err
+	}
+	return c.encryptTicket(stateBytes, ticketKeys)
+}
+
+func (c *Config) encryptTicket(state []byte, ticketKeys []ticketKey) ([]byte, error) {
+	if len(ticketKeys) == 0 {
 		return nil, errors.New("tls: internal error: session ticket keys unavailable")
 	}
 
-	encrypted := make([]byte, ticketKeyNameLen+aes.BlockSize+len(state)+sha256.Size)
-	keyName := encrypted[:ticketKeyNameLen]
-	iv := encrypted[ticketKeyNameLen : ticketKeyNameLen+aes.BlockSize]
+	encrypted := make([]byte, aes.BlockSize+len(state)+sha256.Size)
+	iv := encrypted[:aes.BlockSize]
+	ciphertext := encrypted[aes.BlockSize : len(encrypted)-sha256.Size]
+	authenticated := encrypted[:len(encrypted)-sha256.Size]
 	macBytes := encrypted[len(encrypted)-sha256.Size:]
 
-	if _, err := io.ReadFull(c.config.rand(), iv); err != nil {
+	if _, err := io.ReadFull(c.rand(), iv); err != nil {
 		return nil, err
 	}
-	key := c.ticketKeys[0]
-	copy(keyName, key.keyName[:])
+	key := ticketKeys[0]
 	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:], state)
+	cipher.NewCTR(block, iv).XORKeyStream(ciphertext, state)
 
 	mac := hmac.New(sha256.New, key.hmacKey[:])
-	mac.Write(encrypted[:len(encrypted)-sha256.Size])
+	mac.Write(authenticated)
 	mac.Sum(macBytes[:0])
 
 	return encrypted, nil
 }
 
-func (c *Conn) decryptTicket(encrypted []byte) (plaintext []byte, usedOldKey bool) {
-	if len(encrypted) < ticketKeyNameLen+aes.BlockSize+sha256.Size {
-		return nil, false
+// DecryptTicket decrypts a ticket encrypted by [Config.EncryptTicket]. It can
+// be used as a [Config.UnwrapSession] implementation.
+//
+// If the ticket can't be decrypted or parsed, DecryptTicket returns (nil, nil).
+func (c *Config) DecryptTicket(identity []byte, cs ConnectionState) (*SessionState, error) {
+	ticketKeys := c.ticketKeys(nil)
+	stateBytes := c.decryptTicket(identity, ticketKeys)
+	if stateBytes == nil {
+		return nil, nil
 	}
-
-	keyName := encrypted[:ticketKeyNameLen]
-	iv := encrypted[ticketKeyNameLen : ticketKeyNameLen+aes.BlockSize]
-	macBytes := encrypted[len(encrypted)-sha256.Size:]
-	ciphertext := encrypted[ticketKeyNameLen+aes.BlockSize : len(encrypted)-sha256.Size]
-
-	keyIndex := -1
-	for i, candidateKey := range c.ticketKeys {
-		if bytes.Equal(keyName, candidateKey.keyName[:]) {
-			keyIndex = i
-			break
-		}
-	}
-	if keyIndex == -1 {
-		return nil, false
-	}
-	key := &c.ticketKeys[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[:])
+	s, err := ParseSessionState(stateBytes)
 	if err != nil {
-		return nil, false
+		return nil, nil // drop unparsable tickets on the floor
 	}
-	plaintext = make([]byte, len(ciphertext))
-	cipher.NewCTR(block, iv).XORKeyStream(plaintext, ciphertext)
+	return s, nil
+}
 
-	return plaintext, keyIndex > 0
+func (c *Config) decryptTicket(encrypted []byte, ticketKeys []ticketKey) []byte {
+	if len(encrypted) < aes.BlockSize+sha256.Size {
+		return nil
+	}
+
+	iv := encrypted[:aes.BlockSize]
+	ciphertext := encrypted[aes.BlockSize : len(encrypted)-sha256.Size]
+	authenticated := encrypted[:len(encrypted)-sha256.Size]
+	macBytes := encrypted[len(encrypted)-sha256.Size:]
+
+	for _, key := range ticketKeys {
+		mac := hmac.New(sha256.New, key.hmacKey[:])
+		mac.Write(authenticated)
+		expected := mac.Sum(nil)
+
+		if subtle.ConstantTimeCompare(macBytes, expected) != 1 {
+			continue
+		}
+
+		block, err := aes.NewCipher(key.aesKey[:])
+		if err != nil {
+			return nil
+		}
+		plaintext := make([]byte, len(ciphertext))
+		cipher.NewCTR(block, iv).XORKeyStream(plaintext, ciphertext)
+
+		return plaintext
+	}
+
+	return nil
+}
+
+// ClientSessionState contains the state needed by a client to
+// resume a previous TLS session.
+type ClientSessionState struct {
+	ticket  []byte
+	session *SessionState
+}
+
+// ResumptionState returns the session ticket sent by the server (also known as
+// the session's identity) and the state necessary to resume this session.
+//
+// It can be called by [ClientSessionCache.Put] to serialize (with
+// [SessionState.Bytes]) and store the session.
+func (cs *ClientSessionState) ResumptionState() (ticket []byte, state *SessionState, err error) {
+	return cs.ticket, cs.session, nil
+}
+
+// NewResumptionState returns a state value that can be returned by
+// [ClientSessionCache.Get] to resume a previous session.
+//
+// state needs to be returned by [ParseSessionState], and the ticket and session
+// state must have been returned by [ClientSessionState.ResumptionState].
+func NewResumptionState(ticket []byte, state *SessionState) (*ClientSessionState, error) {
+	return &ClientSessionState{
+		ticket: ticket, session: state,
+	}, nil
 }
diff --git a/src/crypto/tls/ticket_test.go b/src/crypto/tls/ticket_test.go
new file mode 100644
index 0000000..f925451
--- /dev/null
+++ b/src/crypto/tls/ticket_test.go
@@ -0,0 +1,8 @@
+// Copyright 2023 The Go Authors. 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
+
+var _ = &Config{WrapSession: (&Config{}).EncryptTicket}
+var _ = &Config{UnwrapSession: (&Config{}).DecryptTicket}
diff --git a/src/crypto/tls/tls_test.go b/src/crypto/tls/tls_test.go
index d8a43ad..c3f16c7 100644
--- a/src/crypto/tls/tls_test.go
+++ b/src/crypto/tls/tls_test.go
@@ -170,35 +170,59 @@
 	if testing.Short() {
 		t.Skip("skipping in short mode")
 	}
-	listener := newLocalListener(t)
 
-	addr := listener.Addr().String()
-	defer listener.Close()
+	timeout := 100 * time.Microsecond
+	for !t.Failed() {
+		acceptc := make(chan net.Conn)
+		listener := newLocalListener(t)
+		go func() {
+			for {
+				conn, err := listener.Accept()
+				if err != nil {
+					close(acceptc)
+					return
+				}
+				acceptc <- conn
+			}
+		}()
 
-	complete := make(chan bool)
-	defer close(complete)
-
-	go func() {
-		conn, err := listener.Accept()
-		if err != nil {
-			t.Error(err)
-			return
+		addr := listener.Addr().String()
+		dialer := &net.Dialer{
+			Timeout: timeout,
 		}
-		<-complete
-		conn.Close()
-	}()
+		if conn, err := DialWithDialer(dialer, "tcp", addr, nil); err == nil {
+			conn.Close()
+			t.Errorf("DialWithTimeout unexpectedly completed successfully")
+		} else if !isTimeoutError(err) {
+			t.Errorf("resulting error not a timeout: %v\nType %T: %#v", err, err, err)
+		}
 
-	dialer := &net.Dialer{
-		Timeout: 10 * time.Millisecond,
-	}
+		listener.Close()
 
-	var err error
-	if _, err = DialWithDialer(dialer, "tcp", addr, nil); err == nil {
-		t.Fatal("DialWithTimeout completed successfully")
-	}
+		// We're looking for a timeout during the handshake, so check that the
+		// Listener actually accepted the connection to initiate it. (If the server
+		// takes too long to accept the connection, we might cancel before the
+		// underlying net.Conn is ever dialed — without ever attempting a
+		// handshake.)
+		lconn, ok := <-acceptc
+		if ok {
+			// The Listener accepted a connection, so assume that it was from our
+			// Dial: we triggered the timeout at the point where we wanted it!
+			t.Logf("Listener accepted a connection from %s", lconn.RemoteAddr())
+			lconn.Close()
+		}
+		// Close any spurious extra connecitions from the listener. (This is
+		// possible if there are, for example, stray Dial calls from other tests.)
+		for extraConn := range acceptc {
+			t.Logf("spurious extra connection from %s", extraConn.RemoteAddr())
+			extraConn.Close()
+		}
+		if ok {
+			break
+		}
 
-	if !isTimeoutError(err) {
-		t.Errorf("resulting error not a timeout: %v\nType %T: %#v", err, err, err)
+		t.Logf("with timeout %v, DialWithDialer returned before listener accepted any connections; retrying", timeout)
+		timeout *= 2
 	}
 }
 
@@ -450,6 +474,9 @@
 	if !bytes.Equal(conn.ConnectionState().TLSUnique, serverTLSUniquesValue) {
 		t.Error("client and server channel bindings differ")
 	}
+	if serverTLSUniquesValue == nil || bytes.Equal(serverTLSUniquesValue, make([]byte, 12)) {
+		t.Error("tls-unique is empty or zero")
+	}
 	conn.Close()
 
 	conn, err = Dial("tcp", ln.Addr().String(), clientConfig)
@@ -470,6 +497,9 @@
 	if !bytes.Equal(conn.ConnectionState().TLSUnique, serverTLSUniquesValue) {
 		t.Error("client and server channel bindings differ when session resumption is used")
 	}
+	if serverTLSUniquesValue == nil || bytes.Equal(serverTLSUniquesValue, make([]byte, 12)) {
+		t.Error("resumption tls-unique is empty or zero")
+	}
 }
 
 func TestVerifyHostname(t *testing.T) {
@@ -734,7 +764,7 @@
 }
 
 func TestCloneFuncFields(t *testing.T) {
-	const expectedCount = 6
+	const expectedCount = 8
 	called := 0
 
 	c1 := Config{
@@ -762,6 +792,14 @@
 			called |= 1 << 5
 			return nil
 		},
+		UnwrapSession: func(identity []byte, cs ConnectionState) (*SessionState, error) {
+			called |= 1 << 6
+			return nil, nil
+		},
+		WrapSession: func(cs ConnectionState, ss *SessionState) ([]byte, error) {
+			called |= 1 << 7
+			return nil, nil
+		},
 	}
 
 	c2 := c1.Clone()
@@ -772,6 +810,8 @@
 	c2.GetConfigForClient(nil)
 	c2.VerifyPeerCertificate(nil, nil)
 	c2.VerifyConnection(ConnectionState{})
+	c2.UnwrapSession(nil, ConnectionState{})
+	c2.WrapSession(ConnectionState{}, nil)
 
 	if called != (1<<expectedCount)-1 {
 		t.Fatalf("expected %d calls but saw calls %b", expectedCount, called)
@@ -790,7 +830,7 @@
 		switch fn := typ.Field(i).Name; fn {
 		case "Rand":
 			f.Set(reflect.ValueOf(io.Reader(os.Stdin)))
-		case "Time", "GetCertificate", "GetConfigForClient", "VerifyPeerCertificate", "VerifyConnection", "GetClientCertificate":
+		case "Time", "GetCertificate", "GetConfigForClient", "VerifyPeerCertificate", "VerifyConnection", "GetClientCertificate", "WrapSession", "UnwrapSession":
 			// DeepEqual can't compare functions. If you add a
 			// function field to this list, you must also change
 			// TestCloneFuncFields to ensure that the func field is
@@ -1550,6 +1590,15 @@
 	}
 }
 
+func TestVersionName(t *testing.T) {
+	if got, exp := VersionName(VersionTLS13), "TLS 1.3"; got != exp {
+		t.Errorf("unexpected VersionName: got %q, expected %q", got, exp)
+	}
+	if got, exp := VersionName(0x12a), "0x012A"; got != exp {
+		t.Errorf("unexpected fallback VersionName: got %q, expected %q", got, exp)
+	}
+}
+
 // http2isBadCipher is copied from net/http.
 // TODO: if it ends up exposed somewhere, use that instead.
 func http2isBadCipher(cipher uint16) bool {
@@ -1609,3 +1658,147 @@
 		t.Error(err)
 	}
 }
+
+func TestVerifyCertificates(t *testing.T) {
+	// See https://go.dev/issue/31641.
+	t.Run("TLSv12", func(t *testing.T) { testVerifyCertificates(t, VersionTLS12) })
+	t.Run("TLSv13", func(t *testing.T) { testVerifyCertificates(t, VersionTLS13) })
+}
+
+func testVerifyCertificates(t *testing.T, version uint16) {
+	tests := []struct {
+		name string
+
+		InsecureSkipVerify bool
+		ClientAuth         ClientAuthType
+		ClientCertificates bool
+	}{
+		{
+			name: "defaults",
+		},
+		{
+			name:               "InsecureSkipVerify",
+			InsecureSkipVerify: true,
+		},
+		{
+			name:       "RequestClientCert with no certs",
+			ClientAuth: RequestClientCert,
+		},
+		{
+			name:               "RequestClientCert with certs",
+			ClientAuth:         RequestClientCert,
+			ClientCertificates: true,
+		},
+		{
+			name:               "RequireAnyClientCert",
+			ClientAuth:         RequireAnyClientCert,
+			ClientCertificates: true,
+		},
+		{
+			name:       "VerifyClientCertIfGiven with no certs",
+			ClientAuth: VerifyClientCertIfGiven,
+		},
+		{
+			name:               "VerifyClientCertIfGiven with certs",
+			ClientAuth:         VerifyClientCertIfGiven,
+			ClientCertificates: true,
+		},
+		{
+			name:               "RequireAndVerifyClientCert",
+			ClientAuth:         RequireAndVerifyClientCert,
+			ClientCertificates: true,
+		},
+	}
+
+	issuer, err := x509.ParseCertificate(testRSACertificateIssuer)
+	if err != nil {
+		t.Fatal(err)
+	}
+	rootCAs := x509.NewCertPool()
+	rootCAs.AddCert(issuer)
+
+	for _, test := range tests {
+		test := test
+		t.Run(test.name, func(t *testing.T) {
+			t.Parallel()
+
+			var serverVerifyConnection, clientVerifyConnection bool
+			var serverVerifyPeerCertificates, clientVerifyPeerCertificates bool
+
+			clientConfig := testConfig.Clone()
+			clientConfig.Time = func() time.Time { return time.Unix(1476984729, 0) }
+			clientConfig.MaxVersion = version
+			clientConfig.MinVersion = version
+			clientConfig.RootCAs = rootCAs
+			clientConfig.ServerName = "example.golang"
+			clientConfig.ClientSessionCache = NewLRUClientSessionCache(1)
+			serverConfig := clientConfig.Clone()
+			serverConfig.ClientCAs = rootCAs
+
+			clientConfig.VerifyConnection = func(cs ConnectionState) error {
+				clientVerifyConnection = true
+				return nil
+			}
+			clientConfig.VerifyPeerCertificate = func(rawCerts [][]byte, verifiedChains [][]*x509.Certificate) error {
+				clientVerifyPeerCertificates = true
+				return nil
+			}
+			serverConfig.VerifyConnection = func(cs ConnectionState) error {
+				serverVerifyConnection = true
+				return nil
+			}
+			serverConfig.VerifyPeerCertificate = func(rawCerts [][]byte, verifiedChains [][]*x509.Certificate) error {
+				serverVerifyPeerCertificates = true
+				return nil
+			}
+
+			clientConfig.InsecureSkipVerify = test.InsecureSkipVerify
+			serverConfig.ClientAuth = test.ClientAuth
+			if !test.ClientCertificates {
+				clientConfig.Certificates = nil
+			}
+
+			if _, _, err := testHandshake(t, clientConfig, serverConfig); err != nil {
+				t.Fatal(err)
+			}
+
+			want := serverConfig.ClientAuth != NoClientCert
+			if serverVerifyPeerCertificates != want {
+				t.Errorf("VerifyPeerCertificates on the server: got %v, want %v",
+					serverVerifyPeerCertificates, want)
+			}
+			if !clientVerifyPeerCertificates {
+				t.Errorf("VerifyPeerCertificates not called on the client")
+			}
+			if !serverVerifyConnection {
+				t.Error("VerifyConnection did not get called on the server")
+			}
+			if !clientVerifyConnection {
+				t.Error("VerifyConnection did not get called on the client")
+			}
+
+			serverVerifyPeerCertificates, clientVerifyPeerCertificates = false, false
+			serverVerifyConnection, clientVerifyConnection = false, false
+			cs, _, err := testHandshake(t, clientConfig, serverConfig)
+			if err != nil {
+				t.Fatal(err)
+			}
+			if !cs.DidResume {
+				t.Error("expected resumption")
+			}
+
+			if serverVerifyPeerCertificates {
+				t.Error("VerifyPeerCertificates got called on the server on resumption")
+			}
+			if clientVerifyPeerCertificates {
+				t.Error("VerifyPeerCertificates got called on the client on resumption")
+			}
+			if !serverVerifyConnection {
+				t.Error("VerifyConnection did not get called on the server on resumption")
+			}
+			if !clientVerifyConnection {
+				t.Error("VerifyConnection did not get called on the client on resumption")
+			}
+		})
+	}
+}
diff --git a/src/crypto/x509/parser.go b/src/crypto/x509/parser.go
index 6ea3017..6695212 100644
--- a/src/crypto/x509/parser.go
+++ b/src/crypto/x509/parser.go
@@ -334,17 +334,17 @@
 func parseBasicConstraintsExtension(der cryptobyte.String) (bool, int, error) {
 	var isCA bool
 	if !der.ReadASN1(&der, cryptobyte_asn1.SEQUENCE) {
-		return false, 0, errors.New("x509: invalid basic constraints a")
+		return false, 0, errors.New("x509: invalid basic constraints")
 	}
 	if der.PeekASN1Tag(cryptobyte_asn1.BOOLEAN) {
 		if !der.ReadASN1Boolean(&isCA) {
-			return false, 0, errors.New("x509: invalid basic constraints b")
+			return false, 0, errors.New("x509: invalid basic constraints")
 		}
 	}
 	maxPathLen := -1
-	if !der.Empty() && der.PeekASN1Tag(cryptobyte_asn1.INTEGER) {
+	if der.PeekASN1Tag(cryptobyte_asn1.INTEGER) {
 		if !der.ReadASN1Integer(&maxPathLen) {
-			return false, 0, errors.New("x509: invalid basic constraints c")
+			return false, 0, errors.New("x509: invalid basic constraints")
 		}
 	}
 
@@ -1104,16 +1104,22 @@
 			return nil, errors.New("x509: malformed crl")
 		}
 		for !revokedSeq.Empty() {
+			rce := RevocationListEntry{}
+
 			var certSeq cryptobyte.String
-			if !revokedSeq.ReadASN1(&certSeq, cryptobyte_asn1.SEQUENCE) {
+			if !revokedSeq.ReadASN1Element(&certSeq, cryptobyte_asn1.SEQUENCE) {
 				return nil, errors.New("x509: malformed crl")
 			}
-			rc := pkix.RevokedCertificate{}
-			rc.SerialNumber = new(big.Int)
-			if !certSeq.ReadASN1Integer(rc.SerialNumber) {
+			rce.Raw = certSeq
+			if !certSeq.ReadASN1(&certSeq, cryptobyte_asn1.SEQUENCE) {
+				return nil, errors.New("x509: malformed crl")
+			}
+
+			rce.SerialNumber = new(big.Int)
+			if !certSeq.ReadASN1Integer(rce.SerialNumber) {
 				return nil, errors.New("x509: malformed serial number")
 			}
-			rc.RevocationTime, err = parseTime(&certSeq)
+			rce.RevocationTime, err = parseTime(&certSeq)
 			if err != nil {
 				return nil, err
 			}
@@ -1132,11 +1138,23 @@
 					if err != nil {
 						return nil, err
 					}
-					rc.Extensions = append(rc.Extensions, ext)
+					if ext.Id.Equal(oidExtensionReasonCode) {
+						val := cryptobyte.String(ext.Value)
+						if !val.ReadASN1Enum(&rce.ReasonCode) {
+							return nil, fmt.Errorf("x509: malformed reasonCode extension")
+						}
+					}
+					rce.Extensions = append(rce.Extensions, ext)
 				}
 			}
 
-			rl.RevokedCertificates = append(rl.RevokedCertificates, rc)
+			rl.RevokedCertificateEntries = append(rl.RevokedCertificateEntries, rce)
+			rcDeprecated := pkix.RevokedCertificate{
+				SerialNumber:   rce.SerialNumber,
+				RevocationTime: rce.RevocationTime,
+				Extensions:     rce.Extensions,
+			}
+			rl.RevokedCertificates = append(rl.RevokedCertificates, rcDeprecated)
 		}
 	}
 
diff --git a/src/crypto/x509/pkcs8.go b/src/crypto/x509/pkcs8.go
index 2d085e0..74b2f99 100644
--- a/src/crypto/x509/pkcs8.go
+++ b/src/crypto/x509/pkcs8.go
@@ -27,8 +27,8 @@
 
 // ParsePKCS8PrivateKey parses an unencrypted private key in PKCS #8, ASN.1 DER form.
 //
-// It returns a *rsa.PrivateKey, a *ecdsa.PrivateKey, a ed25519.PrivateKey (not
-// a pointer), or a *ecdh.PrivateKey (for X25519). More types might be supported
+// It returns a *rsa.PrivateKey, an *ecdsa.PrivateKey, an ed25519.PrivateKey (not
+// a pointer), or an *ecdh.PrivateKey (for X25519). More types might be supported
 // in the future.
 //
 // This kind of key is commonly encoded in PEM blocks of type "PRIVATE KEY".
diff --git a/src/crypto/x509/platform_root_cert.pem b/src/crypto/x509/platform_root_cert.pem
new file mode 100644
index 0000000..bef31f4
--- /dev/null
+++ b/src/crypto/x509/platform_root_cert.pem
@@ -0,0 +1,13 @@
+-----BEGIN CERTIFICATE-----
+MIIB/DCCAaOgAwIBAgICIzEwCgYIKoZIzj0EAwIwLDEqMCgGA1UEAxMhR28gcGxh
+dGZvcm0gdmVyaWZpZXIgdGVzdGluZyByb290MB4XDTIzMDUyNjE3NDQwMVoXDTI4
+MDUyNDE4NDQwMVowLDEqMCgGA1UEAxMhR28gcGxhdGZvcm0gdmVyaWZpZXIgdGVz
+dGluZyByb290MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE5dNQY4FY29i2g3xx
+7FyH4XiZz0C0AM4uyPUsXCZNb7CsctHDLhLtzABWSfFz76j+oVhq+qKrwIHsLX+7
+f6YTQqOBtDCBsTAOBgNVHQ8BAf8EBAMCAgQwEwYDVR0lBAwwCgYIKwYBBQUHAwEw
+DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUEJInRbtQR6xTUSwvtdAe9A4XHwQw
+WgYDVR0eAQH/BFAwTqAaMBiCFnRlc3RpbmcuZ29sYW5nLmludmFsaWShMDAKhwgA
+AAAAAAAAADAihyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAKBggq
+hkjOPQQDAgNHADBEAiBgzgLyQm4rK1AuIcElH3MdRqlteq3nzZCxKOI4xHXYjQIg
+BCSzaCb1+/AK+mhRubrdebFYlUdveTH98wAfKQHaw64=
+-----END CERTIFICATE-----
diff --git a/src/crypto/x509/platform_root_key.pem b/src/crypto/x509/platform_root_key.pem
new file mode 100644
index 0000000..c0b6eeb
--- /dev/null
+++ b/src/crypto/x509/platform_root_key.pem
@@ -0,0 +1,5 @@
+-----BEGIN EC PRIVATE KEY-----
+MHcCAQEEIHhv8LVzb9gqJzAY0P442+FW0oqbfBrLnfqxyyAujOFSoAoGCCqGSM49
+AwEHoUQDQgAE5dNQY4FY29i2g3xx7FyH4XiZz0C0AM4uyPUsXCZNb7CsctHDLhLt
+zABWSfFz76j+oVhq+qKrwIHsLX+7f6YTQg==
+-----END EC PRIVATE KEY-----
diff --git a/src/crypto/x509/platform_test.go b/src/crypto/x509/platform_test.go
new file mode 100644
index 0000000..c35f0b4
--- /dev/null
+++ b/src/crypto/x509/platform_test.go
@@ -0,0 +1,251 @@
+// Copyright 2023 The Go Authors. 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
+
+//go:generate go run gen_testing_root.go
+
+import (
+	"crypto/ecdsa"
+	"crypto/elliptic"
+	"crypto/rand"
+	"encoding/pem"
+	"math/big"
+	"os"
+	"runtime"
+	"strings"
+	"testing"
+	"time"
+)
+
+// In order to run this test suite locally, you need to insert the test root, at
+// the path below, into your trust store. This root is constrained such that it
+// should not be dangerous to local developers to trust, but care should be
+// taken when inserting it into the trust store not to give it increased
+// permissions.
+//
+// On macOS the certificate can be further constrained to only be valid for
+// 'SSL' in the certificate properties pane of the 'Keychain Access' program.
+//
+// On Windows the certificate can also be constrained to only server
+// authentication in the properties pane of the certificate in the
+// "Certificates" snap-in of mmc.exe.
+
+const (
+	rootCertPath = "platform_root_cert.pem"
+	rootKeyPath  = "platform_root_key.pem"
+)
+
+func TestPlatformVerifier(t *testing.T) {
+	if runtime.GOOS != "windows" && runtime.GOOS != "darwin" {
+		t.Skip("only tested on windows and darwin")
+	}
+
+	der, err := os.ReadFile(rootCertPath)
+	if err != nil {
+		t.Fatalf("failed to read test root: %s", err)
+	}
+	b, _ := pem.Decode(der)
+	testRoot, err := ParseCertificate(b.Bytes)
+	if err != nil {
+		t.Fatalf("failed to parse test root: %s", err)
+	}
+
+	der, err = os.ReadFile(rootKeyPath)
+	if err != nil {
+		t.Fatalf("failed to read test key: %s", err)
+	}
+	b, _ = pem.Decode(der)
+	testRootKey, err := ParseECPrivateKey(b.Bytes)
+	if err != nil {
+		t.Fatalf("failed to parse test key: %s", err)
+	}
+
+	if _, err := testRoot.Verify(VerifyOptions{}); err != nil {
+		t.Skipf("test root is not in trust store, skipping (err: %q)", err)
+	}
+
+	now := time.Now()
+
+	tests := []struct {
+		name       string
+		cert       *Certificate
+		selfSigned bool
+		dnsName    string
+		time       time.Time
+		eku        []ExtKeyUsage
+
+		expectedErr string
+		windowsErr  string
+		macosErr    string
+	}{
+		{
+			name: "valid",
+			cert: &Certificate{
+				SerialNumber: big.NewInt(1),
+				DNSNames:     []string{"valid.testing.golang.invalid"},
+				NotBefore:    now.Add(-time.Hour),
+				NotAfter:     now.Add(time.Hour),
+				ExtKeyUsage:  []ExtKeyUsage{ExtKeyUsageServerAuth},
+			},
+		},
+		{
+			name: "valid (with name)",
+			cert: &Certificate{
+				SerialNumber: big.NewInt(1),
+				DNSNames:     []string{"valid.testing.golang.invalid"},
+				NotBefore:    now.Add(-time.Hour),
+				NotAfter:     now.Add(time.Hour),
+				ExtKeyUsage:  []ExtKeyUsage{ExtKeyUsageServerAuth},
+			},
+			dnsName: "valid.testing.golang.invalid",
+		},
+		{
+			name: "valid (with time)",
+			cert: &Certificate{
+				SerialNumber: big.NewInt(1),
+				DNSNames:     []string{"valid.testing.golang.invalid"},
+				NotBefore:    now.Add(-time.Hour),
+				NotAfter:     now.Add(time.Hour),
+				ExtKeyUsage:  []ExtKeyUsage{ExtKeyUsageServerAuth},
+			},
+			time: now.Add(time.Minute * 30),
+		},
+		{
+			name: "valid (with eku)",
+			cert: &Certificate{
+				SerialNumber: big.NewInt(1),
+				DNSNames:     []string{"valid.testing.golang.invalid"},
+				NotBefore:    now.Add(-time.Hour),
+				NotAfter:     now.Add(time.Hour),
+				ExtKeyUsage:  []ExtKeyUsage{ExtKeyUsageServerAuth},
+			},
+			eku: []ExtKeyUsage{ExtKeyUsageServerAuth},
+		},
+		{
+			name: "wrong name",
+			cert: &Certificate{
+				SerialNumber: big.NewInt(1),
+				DNSNames:     []string{"valid.testing.golang.invalid"},
+				NotBefore:    now.Add(-time.Hour),
+				NotAfter:     now.Add(time.Hour),
+				ExtKeyUsage:  []ExtKeyUsage{ExtKeyUsageServerAuth},
+			},
+			dnsName:     "invalid.testing.golang.invalid",
+			expectedErr: "x509: certificate is valid for valid.testing.golang.invalid, not invalid.testing.golang.invalid",
+		},
+		{
+			name: "expired (future)",
+			cert: &Certificate{
+				SerialNumber: big.NewInt(1),
+				DNSNames:     []string{"valid.testing.golang.invalid"},
+				NotBefore:    now.Add(-time.Hour),
+				NotAfter:     now.Add(time.Hour),
+				ExtKeyUsage:  []ExtKeyUsage{ExtKeyUsageServerAuth},
+			},
+			time:        now.Add(time.Hour * 2),
+			expectedErr: "x509: certificate has expired or is not yet valid",
+		},
+		{
+			name: "expired (past)",
+			cert: &Certificate{
+				SerialNumber: big.NewInt(1),
+				DNSNames:     []string{"valid.testing.golang.invalid"},
+				NotBefore:    now.Add(-time.Hour),
+				NotAfter:     now.Add(time.Hour),
+				ExtKeyUsage:  []ExtKeyUsage{ExtKeyUsageServerAuth},
+			},
+			time:        now.Add(time.Hour * 2),
+			expectedErr: "x509: certificate has expired or is not yet valid",
+		},
+		{
+			name: "self-signed",
+			cert: &Certificate{
+				SerialNumber: big.NewInt(1),
+				DNSNames:     []string{"valid.testing.golang.invalid"},
+				NotBefore:    now.Add(-time.Hour),
+				NotAfter:     now.Add(time.Hour),
+				ExtKeyUsage:  []ExtKeyUsage{ExtKeyUsageServerAuth},
+			},
+			selfSigned: true,
+			macosErr:   "x509: “valid.testing.golang.invalid” certificate is not trusted",
+			windowsErr: "x509: certificate signed by unknown authority",
+		},
+		{
+			name: "non-specified KU",
+			cert: &Certificate{
+				SerialNumber: big.NewInt(1),
+				DNSNames:     []string{"valid.testing.golang.invalid"},
+				NotBefore:    now.Add(-time.Hour),
+				NotAfter:     now.Add(time.Hour),
+				ExtKeyUsage:  []ExtKeyUsage{ExtKeyUsageServerAuth},
+			},
+			eku:         []ExtKeyUsage{ExtKeyUsageEmailProtection},
+			expectedErr: "x509: certificate specifies an incompatible key usage",
+		},
+		{
+			name: "non-nested KU",
+			cert: &Certificate{
+				SerialNumber: big.NewInt(1),
+				DNSNames:     []string{"valid.testing.golang.invalid"},
+				NotBefore:    now.Add(-time.Hour),
+				NotAfter:     now.Add(time.Hour),
+				ExtKeyUsage:  []ExtKeyUsage{ExtKeyUsageEmailProtection},
+			},
+			macosErr:   "x509: “valid.testing.golang.invalid” certificate is not permitted for this usage",
+			windowsErr: "x509: certificate specifies an incompatible key usage",
+		},
+	}
+
+	leafKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
+	if err != nil {
+		t.Fatalf("ecdsa.GenerateKey failed: %s", err)
+	}
+
+	for _, tc := range tests {
+		tc := tc
+		t.Run(tc.name, func(t *testing.T) {
+			t.Parallel()
+			parent := testRoot
+			if tc.selfSigned {
+				parent = tc.cert
+			}
+			certDER, err := CreateCertificate(rand.Reader, tc.cert, parent, leafKey.Public(), testRootKey)
+			if err != nil {
+				t.Fatalf("CreateCertificate failed: %s", err)
+			}
+			cert, err := ParseCertificate(certDER)
+			if err != nil {
+				t.Fatalf("ParseCertificate failed: %s", err)
+			}
+
+			var opts VerifyOptions
+			if tc.dnsName != "" {
+				opts.DNSName = tc.dnsName
+			}
+			if !tc.time.IsZero() {
+				opts.CurrentTime = tc.time
+			}
+			if len(tc.eku) > 0 {
+				opts.KeyUsages = tc.eku
+			}
+
+			expectedErr := tc.expectedErr
+			if runtime.GOOS == "darwin" && tc.macosErr != "" {
+				expectedErr = tc.macosErr
+			} else if runtime.GOOS == "windows" && tc.windowsErr != "" {
+				expectedErr = tc.windowsErr
+			}
+
+			_, err = cert.Verify(opts)
+			if err != nil && expectedErr == "" {
+				t.Errorf("unexpected verification error: %s", err)
+			} else if err != nil && !strings.HasPrefix(err.Error(), expectedErr) {
+				t.Errorf("unexpected verification error: got %q, want %q", err.Error(), expectedErr)
+			} else if err == nil && expectedErr != "" {
+				t.Errorf("unexpected verification success: want %q", expectedErr)
+			}
+		})
+	}
+}
diff --git a/src/crypto/x509/root.go b/src/crypto/x509/root.go
index d6b07a1..b454af2 100644
--- a/src/crypto/x509/root.go
+++ b/src/crypto/x509/root.go
@@ -33,7 +33,7 @@
 	}
 }
 
-var forceFallback = godebug.New("x509usefallbackroots")
+var x509usefallbackroots = godebug.New("x509usefallbackroots")
 
 // SetFallbackRoots sets the roots to use during certificate verification, if no
 // custom roots are specified and a platform verifier or a system certificate
@@ -65,8 +65,11 @@
 	}
 	fallbacksSet = true
 
-	if systemRoots != nil && (systemRoots.len() > 0 || systemRoots.systemPool) && forceFallback.Value() != "1" {
-		return
+	if systemRoots != nil && (systemRoots.len() > 0 || systemRoots.systemPool) {
+		if x509usefallbackroots.Value() != "1" {
+			return
+		}
+		x509usefallbackroots.IncNonDefault()
 	}
 	systemRoots, systemRootsErr = roots, nil
 }
diff --git a/src/crypto/x509/root_darwin_test.go b/src/crypto/x509/root_darwin_test.go
index 299cecf..e6b52e9 100644
--- a/src/crypto/x509/root_darwin_test.go
+++ b/src/crypto/x509/root_darwin_test.go
@@ -12,7 +12,9 @@
 	"time"
 )
 
-func TestPlatformVerifier(t *testing.T) {
+func TestPlatformVerifierLegacy(t *testing.T) {
+	// TODO(#52108): This can be removed once the synthetic test root is deployed on
+	// builders.
 	if !testenv.HasExternalNetwork() {
 		t.Skip()
 	}
@@ -33,6 +35,7 @@
 		verifyTime  time.Time
 		verifyEKU   []x509.ExtKeyUsage
 		expectedErr string
+		skip        string
 	}{
 		{
 			// whatever google.com serves should, hopefully, be trusted
@@ -64,11 +67,13 @@
 			name:        "revoked leaf",
 			host:        "revoked.badssl.com",
 			expectedErr: "x509: “revoked.badssl.com” certificate is revoked",
+			skip:        "skipping; broken on recent versions of macOS. See issue 57428.",
 		},
 		{
 			name:        "leaf missing SCTs",
 			host:        "no-sct.badssl.com",
 			expectedErr: "x509: “no-sct.badssl.com” certificate is not standards compliant",
+			skip:        "skipping; broken on recent versions of macOS. See issue 57428.",
 		},
 		{
 			name:        "expired leaf (custom time)",
@@ -91,6 +96,10 @@
 
 	for _, tc := range tests {
 		t.Run(tc.name, func(t *testing.T) {
+			if tc.skip != "" {
+				t.Skip(tc.skip)
+			}
+
 			chain := getChain(tc.host)
 			var opts x509.VerifyOptions
 			if len(chain) > 1 {
diff --git a/src/crypto/x509/root_js.go b/src/crypto/x509/root_js.go
deleted file mode 100644
index 7b3f1e4..0000000
--- a/src/crypto/x509/root_js.go
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2018 The Go 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:build js && wasm
-
-package x509
-
-// Possible certificate files; stop after finding one.
-var certFiles = []string{}
-
-// Possible directories with certificate files; all will be read.
-var certDirectories = []string{}
diff --git a/src/crypto/x509/root_unix.go b/src/crypto/x509/root_unix.go
index aa54f89..c513b20 100644
--- a/src/crypto/x509/root_unix.go
+++ b/src/crypto/x509/root_unix.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build aix || dragonfly || freebsd || (js && wasm) || linux || netbsd || openbsd || solaris
+//go:build aix || dragonfly || freebsd || (js && wasm) || linux || netbsd || openbsd || solaris || wasip1
 
 package x509
 
diff --git a/src/crypto/x509/root_wasm.go b/src/crypto/x509/root_wasm.go
new file mode 100644
index 0000000..275c921
--- /dev/null
+++ b/src/crypto/x509/root_wasm.go
@@ -0,0 +1,13 @@
+// Copyright 2018 The Go 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:build wasm
+
+package x509
+
+// Possible certificate files; stop after finding one.
+var certFiles = []string{}
+
+// Possible directories with certificate files; all will be read.
+var certDirectories = []string{}
diff --git a/src/crypto/x509/root_windows.go b/src/crypto/x509/root_windows.go
index 76d6e6a..11a4257 100644
--- a/src/crypto/x509/root_windows.go
+++ b/src/crypto/x509/root_windows.go
@@ -7,6 +7,7 @@
 import (
 	"bytes"
 	"errors"
+	"strings"
 	"syscall"
 	"unsafe"
 )
@@ -109,7 +110,7 @@
 // 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)
+	servernamep, err := syscall.UTF16PtrFromString(strings.TrimSuffix(opts.DNSName, "."))
 	if err != nil {
 		return err
 	}
diff --git a/src/crypto/x509/root_windows_test.go b/src/crypto/x509/root_windows_test.go
index f6dafe4..1372c04 100644
--- a/src/crypto/x509/root_windows_test.go
+++ b/src/crypto/x509/root_windows_test.go
@@ -16,7 +16,9 @@
 	"time"
 )
 
-func TestPlatformVerifier(t *testing.T) {
+func TestPlatformVerifierLegacy(t *testing.T) {
+	// TODO(#52108): This can be removed once the synthetic test root is deployed on
+	// builders.
 	if !testenv.HasExternalNetwork() {
 		t.Skip()
 	}
@@ -52,6 +54,16 @@
 			host: "google.com",
 		},
 		{
+			name:       "valid chain (dns check)",
+			host:       "google.com",
+			verifyName: "google.com",
+		},
+		{
+			name:       "valid chain (fqdn dns check)",
+			host:       "google.com.",
+			verifyName: "google.com.",
+		},
+		{
 			name:        "expired leaf",
 			host:        "expired.badssl.com",
 			expectedErr: "x509: certificate has expired or is not yet valid: ",
diff --git a/src/crypto/x509/sec1.go b/src/crypto/x509/sec1.go
index 027c17c..6bfba0d 100644
--- a/src/crypto/x509/sec1.go
+++ b/src/crypto/x509/sec1.go
@@ -67,7 +67,7 @@
 	})
 }
 
-// marshalECPrivateKeyWithOID marshals an EC private key into ASN.1, DER format
+// marshalECDHPrivateKey marshals an EC private key into ASN.1, DER format
 // suitable for NIST curves.
 func marshalECDHPrivateKey(key *ecdh.PrivateKey) ([]byte, error) {
 	return asn1.Marshal(ecPrivateKey{
diff --git a/src/crypto/x509/verify.go b/src/crypto/x509/verify.go
index 0b01f8b..345d434 100644
--- a/src/crypto/x509/verify.go
+++ b/src/crypto/x509/verify.go
@@ -591,22 +591,19 @@
 	}
 	comparisonCount := 0
 
-	var leaf *Certificate
 	if certType == intermediateCertificate || certType == rootCertificate {
 		if len(currentChain) == 0 {
 			return errors.New("x509: internal error: empty chain when appending CA cert")
 		}
-		leaf = currentChain[0]
 	}
 
 	if (certType == intermediateCertificate || certType == rootCertificate) &&
 		c.hasNameConstraints() {
 		toCheck := []*Certificate{}
-		if leaf.hasSANExtension() {
-			toCheck = append(toCheck, leaf)
-		}
-		if c.hasSANExtension() {
-			toCheck = append(toCheck, c)
+		for _, c := range currentChain {
+			if c.hasSANExtension() {
+				toCheck = append(toCheck, c)
+			}
 		}
 		for _, sanCert := range toCheck {
 			err := forEachSAN(sanCert.getSANExtension(), func(tag int, data []byte) error {
@@ -1081,7 +1078,7 @@
 // IP addresses can be optionally enclosed in square brackets and are checked
 // against the IPAddresses field. Other names are checked case insensitively
 // against the DNSNames field. If the names are valid hostnames, the certificate
-// fields can have a wildcard as the left-most label.
+// fields can have a wildcard as the complete left-most label (e.g. *.example.com).
 //
 // Note that the legacy Common Name field is ignored.
 func (c *Certificate) VerifyHostname(h string) error {
diff --git a/src/crypto/x509/verify_test.go b/src/crypto/x509/verify_test.go
index 164c47f..3551b47 100644
--- a/src/crypto/x509/verify_test.go
+++ b/src/crypto/x509/verify_test.go
@@ -53,6 +53,18 @@
 		},
 	},
 	{
+		name:          "Valid (fqdn)",
+		leaf:          googleLeaf,
+		intermediates: []string{gtsIntermediate},
+		roots:         []string{gtsRoot},
+		currentTime:   1677615892,
+		dnsName:       "www.google.com.",
+
+		expectedChains: [][]string{
+			{"www.google.com", "GTS CA 1C3", "GTS Root R1"},
+		},
+	},
+	{
 		name:          "MixedCase",
 		leaf:          googleLeaf,
 		intermediates: []string{gtsIntermediate},
@@ -500,22 +512,21 @@
 		return true
 	}
 
-	// Every expected chain should match 1 returned chain
+	// Every expected chain should match one (or more) returned chain. We tolerate multiple
+	// matches, as due to root store semantics it is plausible that (at least on the system
+	// verifiers) multiple identical (looking) chains may be returned when two roots with the
+	// same subject are present.
 	for _, expectedChain := range test.expectedChains {
-		nChainMatched := 0
+		var match bool
 		for _, chain := range chains {
 			if doesMatch(expectedChain, chain) {
-				nChainMatched++
+				match = true
+				break
 			}
 		}
 
-		if nChainMatched != 1 {
-			t.Errorf("Got %v matches instead of %v for expected chain %v", nChainMatched, 1, expectedChain)
-			for _, chain := range chains {
-				if doesMatch(expectedChain, chain) {
-					t.Errorf("\t matched %v", chainToDebugString(chain))
-				}
-			}
+		if !match {
+			t.Errorf("No match found for %v", expectedChain)
 		}
 	}
 
@@ -1909,8 +1920,13 @@
 	MutateTemplate func(*Certificate)
 }
 
+type rootDescription struct {
+	Subject        string
+	MutateTemplate func(*Certificate)
+}
+
 type trustGraphDescription struct {
-	Roots []string
+	Roots []rootDescription
 	Leaf  string
 	Graph []trustGraphEdge
 }
@@ -1965,10 +1981,10 @@
 		if err != nil {
 			t.Fatalf("failed to generate test key: %s", err)
 		}
-		root := genCertEdge(t, r, k, nil, rootCertificate, nil, nil)
+		root := genCertEdge(t, r.Subject, k, r.MutateTemplate, rootCertificate, nil, nil)
 		roots = append(roots, root)
-		certs[r] = root
-		keys[r] = k
+		certs[r.Subject] = root
+		keys[r.Subject] = k
 	}
 
 	intermediates := []*Certificate{}
@@ -2060,7 +2076,7 @@
 			//       +----+
 			name: "bad EKU",
 			graph: trustGraphDescription{
-				Roots: []string{"root"},
+				Roots: []rootDescription{{Subject: "root"}},
 				Leaf:  "leaf",
 				Graph: []trustGraphEdge{
 					{
@@ -2136,7 +2152,7 @@
 			//       +----+
 			name: "bad EKU",
 			graph: trustGraphDescription{
-				Roots: []string{"root"},
+				Roots: []rootDescription{{Subject: "root"}},
 				Leaf:  "leaf",
 				Graph: []trustGraphEdge{
 					{
@@ -2218,7 +2234,7 @@
 			//            +----+
 			name: "all paths",
 			graph: trustGraphDescription{
-				Roots: []string{"root"},
+				Roots: []rootDescription{{Subject: "root"}},
 				Leaf:  "leaf",
 				Graph: []trustGraphEdge{
 					{
@@ -2282,7 +2298,7 @@
 			//       +----+
 			name: "ignore cross-sig loops",
 			graph: trustGraphDescription{
-				Roots: []string{"root"},
+				Roots: []rootDescription{{Subject: "root"}},
 				Leaf:  "leaf",
 				Graph: []trustGraphEdge{
 					{
@@ -2335,7 +2351,7 @@
 			// the leaf has SANs.
 			name: "leaf with same subject, key, as parent but with SAN",
 			graph: trustGraphDescription{
-				Roots: []string{"root"},
+				Roots: []rootDescription{{Subject: "root"}},
 				Leaf:  "root",
 				Graph: []trustGraphEdge{
 					{
@@ -2357,7 +2373,7 @@
 			// through C should be ignored, because it has invalid EKU nesting.
 			name: "ignore invalid EKU path",
 			graph: trustGraphDescription{
-				Roots: []string{"root"},
+				Roots: []rootDescription{{Subject: "root"}},
 				Leaf:  "leaf",
 				Graph: []trustGraphEdge{
 					{
@@ -2400,6 +2416,70 @@
 				"CN=leaf -> CN=inter b -> CN=inter a -> CN=root",
 			},
 		},
+		{
+			// A name constraint on the root should apply to any names that appear
+			// on the intermediate, meaning there is no valid chain.
+			name: "constrained root, invalid intermediate",
+			graph: trustGraphDescription{
+				Roots: []rootDescription{
+					{
+						Subject: "root",
+						MutateTemplate: func(t *Certificate) {
+							t.PermittedDNSDomains = []string{"example.com"}
+						},
+					},
+				},
+				Leaf: "leaf",
+				Graph: []trustGraphEdge{
+					{
+						Issuer:  "root",
+						Subject: "inter",
+						Type:    intermediateCertificate,
+						MutateTemplate: func(t *Certificate) {
+							t.DNSNames = []string{"beep.com"}
+						},
+					},
+					{
+						Issuer:  "inter",
+						Subject: "leaf",
+						Type:    leafCertificate,
+						MutateTemplate: func(t *Certificate) {
+							t.DNSNames = []string{"www.example.com"}
+						},
+					},
+				},
+			},
+			expectedErr: "x509: a root or intermediate certificate is not authorized to sign for this name: DNS name \"beep.com\" is not permitted by any constraint",
+		},
+		{
+			// A name constraint on the intermediate does not apply to the intermediate
+			// itself, so this is a valid chain.
+			name: "constrained intermediate, non-matching SAN",
+			graph: trustGraphDescription{
+				Roots: []rootDescription{{Subject: "root"}},
+				Leaf:  "leaf",
+				Graph: []trustGraphEdge{
+					{
+						Issuer:  "root",
+						Subject: "inter",
+						Type:    intermediateCertificate,
+						MutateTemplate: func(t *Certificate) {
+							t.DNSNames = []string{"beep.com"}
+							t.PermittedDNSDomains = []string{"example.com"}
+						},
+					},
+					{
+						Issuer:  "inter",
+						Subject: "leaf",
+						Type:    leafCertificate,
+						MutateTemplate: func(t *Certificate) {
+							t.DNSNames = []string{"www.example.com"}
+						},
+					},
+				},
+			},
+			expectedChains: []string{"CN=leaf -> CN=inter -> CN=root"},
+		},
 	}
 
 	for _, tc := range tests {
@@ -2412,6 +2492,9 @@
 			if err != nil && err.Error() != tc.expectedErr {
 				t.Fatalf("unexpected error: got %q, want %q", err, tc.expectedErr)
 			}
+			if len(tc.expectedChains) == 0 {
+				return
+			}
 			gotChains := chainsToStrings(chains)
 			if !reflect.DeepEqual(gotChains, tc.expectedChains) {
 				t.Errorf("unexpected chains returned:\ngot:\n\t%s\nwant:\n\t%s", strings.Join(gotChains, "\n\t"), strings.Join(tc.expectedChains, "\n\t"))
diff --git a/src/crypto/x509/x509.go b/src/crypto/x509/x509.go
index 36229bb..9d80b1d 100644
--- a/src/crypto/x509/x509.go
+++ b/src/crypto/x509/x509.go
@@ -893,8 +893,11 @@
 		return InsecureAlgorithmError(algo)
 	case crypto.SHA1:
 		// SHA-1 signatures are mostly disabled. See go.dev/issue/41682.
-		if !allowSHA1 && x509sha1.Value() != "1" {
-			return InsecureAlgorithmError(algo)
+		if !allowSHA1 {
+			if x509sha1.Value() != "1" {
+				return InsecureAlgorithmError(algo)
+			}
+			x509sha1.IncNonDefault()
 		}
 		fallthrough
 	default:
@@ -1025,6 +1028,7 @@
 	oidExtensionCRLDistributionPoints = []int{2, 5, 29, 31}
 	oidExtensionAuthorityInfoAccess   = []int{1, 3, 6, 1, 5, 5, 7, 1, 1}
 	oidExtensionCRLNumber             = []int{2, 5, 29, 20}
+	oidExtensionReasonCode            = []int{2, 5, 29, 21}
 )
 
 var (
@@ -2151,8 +2155,45 @@
 	return checkSignature(c.SignatureAlgorithm, c.RawTBSCertificateRequest, c.Signature, c.PublicKey, true)
 }
 
-// RevocationList contains the fields used to create an X.509 v2 Certificate
-// Revocation list with CreateRevocationList.
+// RevocationListEntry represents an entry in the revokedCertificates
+// sequence of a CRL.
+type RevocationListEntry struct {
+	// Raw contains the raw bytes of the revokedCertificates entry. It is set when
+	// parsing a CRL; it is ignored when generating a CRL.
+	Raw []byte
+
+	// SerialNumber represents the serial number of a revoked certificate. It is
+	// both used when creating a CRL and populated when parsing a CRL. It must not
+	// be nil.
+	SerialNumber *big.Int
+	// RevocationTime represents the time at which the certificate was revoked. It
+	// is both used when creating a CRL and populated when parsing a CRL. It must
+	// not be the zero time.
+	RevocationTime time.Time
+	// ReasonCode represents the reason for revocation, using the integer enum
+	// values specified in RFC 5280 Section 5.3.1. When creating a CRL, the zero
+	// value will result in the reasonCode extension being omitted. When parsing a
+	// CRL, the zero value may represent either the reasonCode extension being
+	// absent (which implies the default revocation reason of 0/Unspecified), or
+	// it may represent the reasonCode extension being present and explicitly
+	// containing a value of 0/Unspecified (which should not happen according to
+	// the DER encoding rules, but can and does happen anyway).
+	ReasonCode int
+
+	// Extensions contains raw X.509 extensions. When parsing CRL entries,
+	// this can be used to extract non-critical extensions that are not
+	// parsed by this package. When marshaling CRL entries, the Extensions
+	// field is ignored, see ExtraExtensions.
+	Extensions []pkix.Extension
+	// ExtraExtensions contains extensions to be copied, raw, into any
+	// marshaled CRL entries. Values override any extensions that would
+	// otherwise be produced based on the other fields. The ExtraExtensions
+	// field is not populated when parsing CRL entries, see Extensions.
+	ExtraExtensions []pkix.Extension
+}
+
+// RevocationList represents a Certificate Revocation List (CRL) as specified
+// by RFC 5280.
 type RevocationList struct {
 	// Raw contains the complete ASN.1 DER content of the CRL (tbsCertList,
 	// signatureAlgorithm, and signatureValue.)
@@ -2177,9 +2218,17 @@
 	// key will be used.
 	SignatureAlgorithm SignatureAlgorithm
 
+	// RevokedCertificateEntries represents the revokedCertificates sequence in
+	// the CRL. It is used when creating a CRL and also populated when parsing a
+	// CRL. When creating a CRL, it may be empty or nil, in which case the
+	// revokedCertificates ASN.1 sequence will be omitted from the CRL entirely.
+	RevokedCertificateEntries []RevocationListEntry
+
 	// RevokedCertificates is used to populate the revokedCertificates
-	// sequence in the CRL, it may be empty. RevokedCertificates may be nil,
-	// in which case an empty CRL will be created.
+	// sequence in the CRL if RevokedCertificateEntries is empty. It may be empty
+	// or nil, in which case an empty CRL will be created.
+	//
+	// Deprecated: Use RevokedCertificateEntries instead.
 	RevokedCertificates []pkix.RevokedCertificate
 
 	// Number is used to populate the X.509 v2 cRLNumber extension in the CRL,
@@ -2265,11 +2314,62 @@
 		return nil, err
 	}
 
-	// Force revocation times to UTC per RFC 5280.
-	revokedCertsUTC := make([]pkix.RevokedCertificate, len(template.RevokedCertificates))
-	for i, rc := range template.RevokedCertificates {
-		rc.RevocationTime = rc.RevocationTime.UTC()
-		revokedCertsUTC[i] = rc
+	var revokedCerts []pkix.RevokedCertificate
+	// Only process the deprecated RevokedCertificates field if it is populated
+	// and the new RevokedCertificateEntries field is not populated.
+	if len(template.RevokedCertificates) > 0 && len(template.RevokedCertificateEntries) == 0 {
+		// Force revocation times to UTC per RFC 5280.
+		revokedCerts = make([]pkix.RevokedCertificate, len(template.RevokedCertificates))
+		for i, rc := range template.RevokedCertificates {
+			rc.RevocationTime = rc.RevocationTime.UTC()
+			revokedCerts[i] = rc
+		}
+	} else {
+		// Convert the ReasonCode field to a proper extension, and force revocation
+		// times to UTC per RFC 5280.
+		revokedCerts = make([]pkix.RevokedCertificate, len(template.RevokedCertificateEntries))
+		for i, rce := range template.RevokedCertificateEntries {
+			if rce.SerialNumber == nil {
+				return nil, errors.New("x509: template contains entry with nil SerialNumber field")
+			}
+			if rce.RevocationTime.IsZero() {
+				return nil, errors.New("x509: template contains entry with zero RevocationTime field")
+			}
+
+			rc := pkix.RevokedCertificate{
+				SerialNumber:   rce.SerialNumber,
+				RevocationTime: rce.RevocationTime.UTC(),
+			}
+
+			// Copy over any extra extensions, except for a Reason Code extension,
+			// because we'll synthesize that ourselves to ensure it is correct.
+			exts := make([]pkix.Extension, 0, len(rce.ExtraExtensions))
+			for _, ext := range rce.ExtraExtensions {
+				if ext.Id.Equal(oidExtensionReasonCode) {
+					return nil, errors.New("x509: template contains entry with ReasonCode ExtraExtension; use ReasonCode field instead")
+				}
+				exts = append(exts, ext)
+			}
+
+			// Only add a reasonCode extension if the reason is non-zero, as per
+			// RFC 5280 Section 5.3.1.
+			if rce.ReasonCode != 0 {
+				reasonBytes, err := asn1.Marshal(asn1.Enumerated(rce.ReasonCode))
+				if err != nil {
+					return nil, err
+				}
+
+				exts = append(exts, pkix.Extension{
+					Id:    oidExtensionReasonCode,
+					Value: reasonBytes,
+				})
+			}
+
+			if len(exts) > 0 {
+				rc.Extensions = exts
+			}
+			revokedCerts[i] = rc
+		}
 	}
 
 	aki, err := asn1.Marshal(authKeyId{Id: issuer.SubjectKeyId})
@@ -2308,8 +2408,8 @@
 			},
 		},
 	}
-	if len(revokedCertsUTC) > 0 {
-		tbsCertList.RevokedCertificates = revokedCertsUTC
+	if len(revokedCerts) > 0 {
+		tbsCertList.RevokedCertificates = revokedCerts
 	}
 
 	if len(template.ExtraExtensions) > 0 {
diff --git a/src/crypto/x509/x509_test.go b/src/crypto/x509/x509_test.go
index 8846b00..19deeab 100644
--- a/src/crypto/x509/x509_test.go
+++ b/src/crypto/x509/x509_test.go
@@ -154,7 +154,7 @@
 -----END RSA TESTING KEY-----
 `)
 
-// pemEd25519Key is the example from RFC 8410, Secrion 4.
+// pemEd25519Key is the example from RFC 8410, Section 4.
 var pemEd25519Key = `
 -----BEGIN PUBLIC KEY-----
 MCowBQYDK2VwAyEAGb9ECWmEzf6FQbrBZ9w7lshQhqowtrbLDFw4rXAxZuE=
@@ -2586,7 +2586,7 @@
 				SubjectKeyId: []byte{1, 2, 3},
 			},
 			template: &RevocationList{
-				RevokedCertificates: []pkix.RevokedCertificate{
+				RevokedCertificateEntries: []RevocationListEntry{
 					{
 						SerialNumber:   big.NewInt(2),
 						RevocationTime: time.Time{}.Add(time.Hour),
@@ -2598,6 +2598,29 @@
 			},
 		},
 		{
+			name: "valid, reason code",
+			key:  ec256Priv,
+			issuer: &Certificate{
+				KeyUsage: KeyUsageCRLSign,
+				Subject: pkix.Name{
+					CommonName: "testing",
+				},
+				SubjectKeyId: []byte{1, 2, 3},
+			},
+			template: &RevocationList{
+				RevokedCertificateEntries: []RevocationListEntry{
+					{
+						SerialNumber:   big.NewInt(2),
+						RevocationTime: time.Time{}.Add(time.Hour),
+						ReasonCode:     1,
+					},
+				},
+				Number:     big.NewInt(5),
+				ThisUpdate: time.Time{}.Add(time.Hour * 24),
+				NextUpdate: time.Time{}.Add(time.Hour * 48),
+			},
+		},
+		{
 			name: "valid, extra entry extension",
 			key:  ec256Priv,
 			issuer: &Certificate{
@@ -2608,6 +2631,107 @@
 				SubjectKeyId: []byte{1, 2, 3},
 			},
 			template: &RevocationList{
+				RevokedCertificateEntries: []RevocationListEntry{
+					{
+						SerialNumber:   big.NewInt(2),
+						RevocationTime: time.Time{}.Add(time.Hour),
+						ExtraExtensions: []pkix.Extension{
+							{
+								Id:    []int{2, 5, 29, 99},
+								Value: []byte{5, 0},
+							},
+						},
+					},
+				},
+				Number:     big.NewInt(5),
+				ThisUpdate: time.Time{}.Add(time.Hour * 24),
+				NextUpdate: time.Time{}.Add(time.Hour * 48),
+			},
+		},
+		{
+			name: "valid, Ed25519 key",
+			key:  ed25519Priv,
+			issuer: &Certificate{
+				KeyUsage: KeyUsageCRLSign,
+				Subject: pkix.Name{
+					CommonName: "testing",
+				},
+				SubjectKeyId: []byte{1, 2, 3},
+			},
+			template: &RevocationList{
+				RevokedCertificateEntries: []RevocationListEntry{
+					{
+						SerialNumber:   big.NewInt(2),
+						RevocationTime: time.Time{}.Add(time.Hour),
+					},
+				},
+				Number:     big.NewInt(5),
+				ThisUpdate: time.Time{}.Add(time.Hour * 24),
+				NextUpdate: time.Time{}.Add(time.Hour * 48),
+			},
+		},
+		{
+			name: "valid, non-default signature algorithm",
+			key:  ec256Priv,
+			issuer: &Certificate{
+				KeyUsage: KeyUsageCRLSign,
+				Subject: pkix.Name{
+					CommonName: "testing",
+				},
+				SubjectKeyId: []byte{1, 2, 3},
+			},
+			template: &RevocationList{
+				SignatureAlgorithm: ECDSAWithSHA512,
+				RevokedCertificateEntries: []RevocationListEntry{
+					{
+						SerialNumber:   big.NewInt(2),
+						RevocationTime: time.Time{}.Add(time.Hour),
+					},
+				},
+				Number:     big.NewInt(5),
+				ThisUpdate: time.Time{}.Add(time.Hour * 24),
+				NextUpdate: time.Time{}.Add(time.Hour * 48),
+			},
+		},
+		{
+			name: "valid, extra extension",
+			key:  ec256Priv,
+			issuer: &Certificate{
+				KeyUsage: KeyUsageCRLSign,
+				Subject: pkix.Name{
+					CommonName: "testing",
+				},
+				SubjectKeyId: []byte{1, 2, 3},
+			},
+			template: &RevocationList{
+				RevokedCertificateEntries: []RevocationListEntry{
+					{
+						SerialNumber:   big.NewInt(2),
+						RevocationTime: time.Time{}.Add(time.Hour),
+					},
+				},
+				Number:     big.NewInt(5),
+				ThisUpdate: time.Time{}.Add(time.Hour * 24),
+				NextUpdate: time.Time{}.Add(time.Hour * 48),
+				ExtraExtensions: []pkix.Extension{
+					{
+						Id:    []int{2, 5, 29, 99},
+						Value: []byte{5, 0},
+					},
+				},
+			},
+		},
+		{
+			name: "valid, deprecated entries with extension",
+			key:  ec256Priv,
+			issuer: &Certificate{
+				KeyUsage: KeyUsageCRLSign,
+				Subject: pkix.Name{
+					CommonName: "testing",
+				},
+				SubjectKeyId: []byte{1, 2, 3},
+			},
+			template: &RevocationList{
 				RevokedCertificates: []pkix.RevokedCertificate{
 					{
 						SerialNumber:   big.NewInt(2),
@@ -2626,79 +2750,6 @@
 			},
 		},
 		{
-			name: "valid, Ed25519 key",
-			key:  ed25519Priv,
-			issuer: &Certificate{
-				KeyUsage: KeyUsageCRLSign,
-				Subject: pkix.Name{
-					CommonName: "testing",
-				},
-				SubjectKeyId: []byte{1, 2, 3},
-			},
-			template: &RevocationList{
-				RevokedCertificates: []pkix.RevokedCertificate{
-					{
-						SerialNumber:   big.NewInt(2),
-						RevocationTime: time.Time{}.Add(time.Hour),
-					},
-				},
-				Number:     big.NewInt(5),
-				ThisUpdate: time.Time{}.Add(time.Hour * 24),
-				NextUpdate: time.Time{}.Add(time.Hour * 48),
-			},
-		},
-		{
-			name: "valid, non-default signature algorithm",
-			key:  ec256Priv,
-			issuer: &Certificate{
-				KeyUsage: KeyUsageCRLSign,
-				Subject: pkix.Name{
-					CommonName: "testing",
-				},
-				SubjectKeyId: []byte{1, 2, 3},
-			},
-			template: &RevocationList{
-				SignatureAlgorithm: ECDSAWithSHA512,
-				RevokedCertificates: []pkix.RevokedCertificate{
-					{
-						SerialNumber:   big.NewInt(2),
-						RevocationTime: time.Time{}.Add(time.Hour),
-					},
-				},
-				Number:     big.NewInt(5),
-				ThisUpdate: time.Time{}.Add(time.Hour * 24),
-				NextUpdate: time.Time{}.Add(time.Hour * 48),
-			},
-		},
-		{
-			name: "valid, extra extension",
-			key:  ec256Priv,
-			issuer: &Certificate{
-				KeyUsage: KeyUsageCRLSign,
-				Subject: pkix.Name{
-					CommonName: "testing",
-				},
-				SubjectKeyId: []byte{1, 2, 3},
-			},
-			template: &RevocationList{
-				RevokedCertificates: []pkix.RevokedCertificate{
-					{
-						SerialNumber:   big.NewInt(2),
-						RevocationTime: time.Time{}.Add(time.Hour),
-					},
-				},
-				Number:     big.NewInt(5),
-				ThisUpdate: time.Time{}.Add(time.Hour * 24),
-				NextUpdate: time.Time{}.Add(time.Hour * 48),
-				ExtraExtensions: []pkix.Extension{
-					{
-						Id:    []int{2, 5, 29, 99},
-						Value: []byte{5, 0},
-					},
-				},
-			},
-		},
-		{
 			name: "valid, empty list",
 			key:  ec256Priv,
 			issuer: &Certificate{
@@ -2751,9 +2802,32 @@
 					tc.template.SignatureAlgorithm)
 			}
 
-			if !reflect.DeepEqual(parsedCRL.RevokedCertificates, tc.template.RevokedCertificates) {
-				t.Fatalf("RevokedCertificates mismatch: got %v; want %v.",
-					parsedCRL.RevokedCertificates, tc.template.RevokedCertificates)
+			if len(tc.template.RevokedCertificates) > 0 {
+				if !reflect.DeepEqual(parsedCRL.RevokedCertificates, tc.template.RevokedCertificates) {
+					t.Fatalf("RevokedCertificates mismatch: got %v; want %v.",
+						parsedCRL.RevokedCertificates, tc.template.RevokedCertificates)
+				}
+			} else {
+				if len(parsedCRL.RevokedCertificateEntries) != len(tc.template.RevokedCertificateEntries) {
+					t.Fatalf("RevokedCertificateEntries length mismatch: got %d; want %d.",
+						len(parsedCRL.RevokedCertificateEntries),
+						len(tc.template.RevokedCertificateEntries))
+				}
+				for i, rce := range parsedCRL.RevokedCertificateEntries {
+					expected := tc.template.RevokedCertificateEntries[i]
+					if rce.SerialNumber.Cmp(expected.SerialNumber) != 0 {
+						t.Fatalf("RevocationListEntry serial mismatch: got %d; want %d.",
+							rce.SerialNumber, expected.SerialNumber)
+					}
+					if !rce.RevocationTime.Equal(expected.RevocationTime) {
+						t.Fatalf("RevocationListEntry revocation time mismatch: got %v; want %v.",
+							rce.RevocationTime, expected.RevocationTime)
+					}
+					if rce.ReasonCode != expected.ReasonCode {
+						t.Fatalf("RevocationListEntry reason code mismatch: got %d; want %d.",
+							rce.ReasonCode, expected.ReasonCode)
+					}
+				}
 			}
 
 			if len(parsedCRL.Extensions) != 2+len(tc.template.ExtraExtensions) {
@@ -3599,9 +3673,10 @@
 		t.Errorf("error parsing: %s", err)
 		return
 	}
-	numCerts := len(certList.RevokedCertificates)
+	numCerts := len(certList.RevokedCertificateEntries)
+	numCertsDeprecated := len(certList.RevokedCertificateEntries)
 	expected := 88
-	if numCerts != expected {
+	if numCerts != expected || numCertsDeprecated != expected {
 		t.Errorf("bad number of revoked certificates. got: %d want: %d", numCerts, expected)
 	}
 }
diff --git a/src/database/sql/convert.go b/src/database/sql/convert.go
index 32941cb..ffc4e49 100644
--- a/src/database/sql/convert.go
+++ b/src/database/sql/convert.go
@@ -422,7 +422,7 @@
 	switch dv.Kind() {
 	case reflect.Pointer:
 		if src == nil {
-			dv.Set(reflect.Zero(dv.Type()))
+			dv.SetZero()
 			return nil
 		}
 		dv.Set(reflect.New(dv.Type().Elem()))
diff --git a/src/database/sql/fakedb_test.go b/src/database/sql/fakedb_test.go
index 2fe5ea4..cfeb3b3 100644
--- a/src/database/sql/fakedb_test.go
+++ b/src/database/sql/fakedb_test.go
@@ -15,6 +15,7 @@
 	"strconv"
 	"strings"
 	"sync"
+	"sync/atomic"
 	"testing"
 	"time"
 )
@@ -90,6 +91,8 @@
 type fakeDB struct {
 	name string
 
+	useRawBytes atomic.Bool
+
 	mu       sync.Mutex
 	tables   map[string]*table
 	badConn  bool
@@ -697,6 +700,8 @@
 		switch cmd {
 		case "WIPE":
 			// Nothing
+		case "USE_RAWBYTES":
+			c.db.useRawBytes.Store(true)
 		case "SELECT":
 			stmt, err = c.prepareSelect(stmt, parts)
 		case "CREATE":
@@ -800,6 +805,9 @@
 	case "WIPE":
 		db.wipe()
 		return driver.ResultNoRows, nil
+	case "USE_RAWBYTES":
+		s.c.db.useRawBytes.Store(true)
+		return driver.ResultNoRows, nil
 	case "CREATE":
 		if err := db.createTable(s.table, s.colName, s.colType); err != nil {
 			return nil, err
@@ -929,6 +937,7 @@
 				txStatus = "transaction"
 			}
 			cursor := &rowsCursor{
+				db:        s.c.db,
 				parentMem: s.c,
 				posRow:    -1,
 				rows: [][]*row{
@@ -1025,6 +1034,7 @@
 	}
 
 	cursor := &rowsCursor{
+		db:        s.c.db,
 		parentMem: s.c,
 		posRow:    -1,
 		rows:      setMRows,
@@ -1067,6 +1077,7 @@
 }
 
 type rowsCursor struct {
+	db        *fakeDB
 	parentMem memToucher
 	cols      [][]string
 	colType   [][]string
@@ -1141,7 +1152,7 @@
 		// messing up conversions or doing them differently.
 		dest[i] = v
 
-		if bs, ok := v.([]byte); ok {
+		if bs, ok := v.([]byte); ok && !rc.db.useRawBytes.Load() {
 			if rc.bytesClone == nil {
 				rc.bytesClone = make(map[*byte][]byte)
 			}
diff --git a/src/database/sql/sql.go b/src/database/sql/sql.go
index ad17eb3..836fe83 100644
--- a/src/database/sql/sql.go
+++ b/src/database/sql/sql.go
@@ -1947,20 +1947,27 @@
 	// it's returned to the connection pool.
 	dc *driverConn
 
-	// done transitions from 0 to 1 exactly once, on close.
+	// done transitions from false to true exactly once, on close.
 	// Once done, all operations fail with ErrConnDone.
-	// Use atomic operations on value when checking value.
-	done int32
+	done atomic.Bool
+
+	// releaseConn is a cache of c.closemuRUnlockCondReleaseConn
+	// to save allocations in a call to grabConn.
+	releaseConnOnce  sync.Once
+	releaseConnCache releaseConn
 }
 
 // grabConn takes a context to implement stmtConnGrabber
 // but the context is not used.
 func (c *Conn) grabConn(context.Context) (*driverConn, releaseConn, error) {
-	if atomic.LoadInt32(&c.done) != 0 {
+	if c.done.Load() {
 		return nil, nil, ErrConnDone
 	}
+	c.releaseConnOnce.Do(func() {
+		c.releaseConnCache = c.closemuRUnlockCondReleaseConn
+	})
 	c.closemu.RLock()
-	return c.dc, c.closemuRUnlockCondReleaseConn, nil
+	return c.dc, c.releaseConnCache, nil
 }
 
 // PingContext verifies the connection to the database is still alive.
@@ -2084,7 +2091,7 @@
 }
 
 func (c *Conn) close(err error) error {
-	if !atomic.CompareAndSwapInt32(&c.done, 0, 1) {
+	if !c.done.CompareAndSwap(false, true) {
 		return ErrConnDone
 	}
 
@@ -2886,6 +2893,8 @@
 	cancel      func()      // called when Rows is closed, may be nil.
 	closeStmt   *driverStmt // if non-nil, statement to Close on close
 
+	contextDone atomic.Pointer[error] // error that awaitDone saw; set before close attempt
+
 	// closemu prevents Rows from closing while there
 	// is an active streaming result. It is held for read during non-close operations
 	// and exclusively during close.
@@ -2898,6 +2907,21 @@
 	// lastcols is only used in Scan, Next, and NextResultSet which are expected
 	// not to be called concurrently.
 	lastcols []driver.Value
+
+	// closemuScanHold is whether the previous call to Scan kept closemu RLock'ed
+	// without unlocking it. It does that when the user passes a *RawBytes scan
+	// target. In that case, we need to prevent awaitDone from closing the Rows
+	// while the user's still using the memory. See go.dev/issue/60304.
+	//
+	// It is only used by Scan, Next, and NextResultSet which are expected
+	// not to be called concurrently.
+	closemuScanHold bool
+
+	// hitEOF is whether Next hit the end of the rows without
+	// encountering an error. It's set in Next before
+	// returning. It's only used by Next and Err which are
+	// expected not to be called concurrently.
+	hitEOF bool
 }
 
 // lasterrOrErrLocked returns either lasterr or the provided err.
@@ -2920,22 +2944,31 @@
 	if bypassRowsAwaitDone {
 		return
 	}
-	ctx, rs.cancel = context.WithCancel(ctx)
-	go rs.awaitDone(ctx, txctx)
+	closectx, cancel := context.WithCancel(ctx)
+	rs.cancel = cancel
+	go rs.awaitDone(ctx, txctx, closectx)
 }
 
-// awaitDone blocks until either ctx or txctx is canceled. The ctx is provided
-// from the query context and is canceled when the query Rows is closed.
+// awaitDone blocks until ctx, txctx, or closectx is canceled.
+// The ctx is provided from the query context.
 // If the query was issued in a transaction, the transaction's context
-// is also provided in txctx to ensure Rows is closed if the Tx is closed.
-func (rs *Rows) awaitDone(ctx, txctx context.Context) {
+// is also provided in txctx, to ensure Rows is closed if the Tx is closed.
+// The closectx is closed by an explicit call to rs.Close.
+func (rs *Rows) awaitDone(ctx, txctx, closectx context.Context) {
 	var txctxDone <-chan struct{}
 	if txctx != nil {
 		txctxDone = txctx.Done()
 	}
 	select {
 	case <-ctx.Done():
+		err := ctx.Err()
+		rs.contextDone.Store(&err)
 	case <-txctxDone:
+		err := txctx.Err()
+		rs.contextDone.Store(&err)
+	case <-closectx.Done():
+		// rs.cancel was called via Close(); don't store this into contextDone
+		// to ensure Err() is unaffected.
 	}
 	rs.close(ctx.Err())
 }
@@ -2947,6 +2980,15 @@
 //
 // Every call to Scan, even the first one, must be preceded by a call to Next.
 func (rs *Rows) Next() bool {
+	// If the user's calling Next, they're done with their previous row's Scan
+	// results (any RawBytes memory), so we can release the read lock that would
+	// be preventing awaitDone from calling close.
+	rs.closemuRUnlockIfHeldByScan()
+
+	if rs.contextDone.Load() != nil {
+		return false
+	}
+
 	var doClose, ok bool
 	withLock(rs.closemu.RLocker(), func() {
 		doClose, ok = rs.nextLocked()
@@ -2954,6 +2996,9 @@
 	if doClose {
 		rs.Close()
 	}
+	if doClose && !ok {
+		rs.hitEOF = true
+	}
 	return ok
 }
 
@@ -3001,6 +3046,11 @@
 // scanning. If there are further result sets they may not have rows in the result
 // set.
 func (rs *Rows) NextResultSet() bool {
+	// If the user's calling NextResultSet, they're done with their previous
+	// row's Scan results (any RawBytes memory), so we can release the read lock
+	// that would be preventing awaitDone from calling close.
+	rs.closemuRUnlockIfHeldByScan()
+
 	var doClose bool
 	defer func() {
 		if doClose {
@@ -3037,6 +3087,16 @@
 // 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 {
+	// Return any context error that might've happened during row iteration,
+	// but only if we haven't reported the final Next() = false after rows
+	// are done, in which case the user might've canceled their own context
+	// before calling Rows.Err.
+	if !rs.hitEOF {
+		if errp := rs.contextDone.Load(); errp != nil {
+			return *errp
+		}
+	}
+
 	rs.closemu.RLock()
 	defer rs.closemu.RUnlock()
 	return rs.lasterrOrErrLocked(nil)
@@ -3230,6 +3290,11 @@
 // If any of the first arguments implementing Scanner returns an error,
 // that error will be wrapped in the returned error.
 func (rs *Rows) Scan(dest ...any) error {
+	if rs.closemuScanHold {
+		// This should only be possible if the user calls Scan twice in a row
+		// without calling Next.
+		return fmt.Errorf("sql: Scan called without calling Next (closemuScanHold)")
+	}
 	rs.closemu.RLock()
 
 	if rs.lasterr != nil && rs.lasterr != io.EOF {
@@ -3241,23 +3306,50 @@
 		rs.closemu.RUnlock()
 		return err
 	}
-	rs.closemu.RUnlock()
+
+	if scanArgsContainRawBytes(dest) {
+		rs.closemuScanHold = true
+	} else {
+		rs.closemu.RUnlock()
+	}
 
 	if rs.lastcols == nil {
+		rs.closemuRUnlockIfHeldByScan()
 		return errors.New("sql: Scan called without calling Next")
 	}
 	if len(dest) != len(rs.lastcols) {
+		rs.closemuRUnlockIfHeldByScan()
 		return fmt.Errorf("sql: expected %d destination arguments in Scan, not %d", len(rs.lastcols), len(dest))
 	}
+
 	for i, sv := range rs.lastcols {
 		err := convertAssignRows(dest[i], sv, rs)
 		if err != nil {
+			rs.closemuRUnlockIfHeldByScan()
 			return fmt.Errorf(`sql: Scan error on column index %d, name %q: %w`, i, rs.rowsi.Columns()[i], err)
 		}
 	}
 	return nil
 }
 
+// closemuRUnlockIfHeldByScan releases any closemu.RLock held open by a previous
+// call to Scan with *RawBytes.
+func (rs *Rows) closemuRUnlockIfHeldByScan() {
+	if rs.closemuScanHold {
+		rs.closemuScanHold = false
+		rs.closemu.RUnlock()
+	}
+}
+
+func scanArgsContainRawBytes(args []any) bool {
+	for _, a := range args {
+		if _, ok := a.(*RawBytes); ok {
+			return true
+		}
+	}
+	return false
+}
+
 // rowsCloseHook returns a function so tests may install the
 // hook through a test only mutex.
 var rowsCloseHook = func() func(*Rows, *error) { return nil }
@@ -3267,6 +3359,11 @@
 // 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 the user's calling Close, they're done with their previous row's Scan
+	// results (any RawBytes memory), so we can release the read lock that would
+	// be preventing awaitDone from calling the unexported close before we do so.
+	rs.closemuRUnlockIfHeldByScan()
+
 	return rs.close(nil)
 }
 
diff --git a/src/database/sql/sql_test.go b/src/database/sql/sql_test.go
index 8c58723..e6a5cd9 100644
--- a/src/database/sql/sql_test.go
+++ b/src/database/sql/sql_test.go
@@ -9,6 +9,8 @@
 	"database/sql/driver"
 	"errors"
 	"fmt"
+	"internal/race"
+	"internal/testenv"
 	"math/rand"
 	"reflect"
 	"runtime"
@@ -4383,6 +4385,139 @@
 	}
 }
 
+func TestContextCancelDuringRawBytesScan(t *testing.T) {
+	for _, mode := range []string{"nocancel", "top", "bottom", "go"} {
+		t.Run(mode, func(t *testing.T) {
+			testContextCancelDuringRawBytesScan(t, mode)
+		})
+	}
+}
+
+// From go.dev/issue/60304
+func testContextCancelDuringRawBytesScan(t *testing.T, mode string) {
+	db := newTestDB(t, "people")
+	defer closeDB(t, db)
+
+	if _, err := db.Exec("USE_RAWBYTES"); err != nil {
+		t.Fatal(err)
+	}
+
+	// cancel used to call close asynchronously.
+	// This test checks that it waits so as not to interfere with RawBytes.
+	ctx, cancel := context.WithCancel(context.Background())
+	defer cancel()
+
+	r, err := db.QueryContext(ctx, "SELECT|people|name|")
+	if err != nil {
+		t.Fatal(err)
+	}
+	numRows := 0
+	var sink byte
+	for r.Next() {
+		if mode == "top" && numRows == 2 {
+			// cancel between Next and Scan is observed by Scan as err = context.Canceled.
+			// The sleep here is only to make it more likely that the cancel will be observed.
+			// If not, the test should still pass, like in "go" mode.
+			cancel()
+			time.Sleep(100 * time.Millisecond)
+		}
+		numRows++
+		var s RawBytes
+		err = r.Scan(&s)
+		if numRows == 3 && err == context.Canceled {
+			if r.closemuScanHold {
+				t.Errorf("expected closemu NOT to be held")
+			}
+			break
+		}
+		if !r.closemuScanHold {
+			t.Errorf("expected closemu to be held")
+		}
+		if err != nil {
+			t.Fatal(err)
+		}
+		t.Logf("read %q", s)
+		if mode == "bottom" && numRows == 2 {
+			// cancel before Next should be observed by Next, exiting the loop.
+			// The sleep here is only to make it more likely that the cancel will be observed.
+			// If not, the test should still pass, like in "go" mode.
+			cancel()
+			time.Sleep(100 * time.Millisecond)
+		}
+		if mode == "go" && numRows == 2 {
+			// cancel at any future time, to catch other cases
+			go cancel()
+		}
+		for _, b := range s { // some operation reading from the raw memory
+			sink += b
+		}
+	}
+	if r.closemuScanHold {
+		t.Errorf("closemu held; should not be")
+	}
+
+	// There are 3 rows. We canceled after reading 2 so we expect either
+	// 2 or 3 depending on how the awaitDone goroutine schedules.
+	switch numRows {
+	case 0, 1:
+		t.Errorf("got %d rows; want 2+", numRows)
+	case 2:
+		if err := r.Err(); err != context.Canceled {
+			t.Errorf("unexpected error: %v (%T)", err, err)
+		}
+	default:
+		// Made it to the end. This is rare, but fine. Permit it.
+	}
+
+	if err := r.Close(); err != nil {
+		t.Fatal(err)
+	}
+}
+
+func TestContextCancelBetweenNextAndErr(t *testing.T) {
+	db := newTestDB(t, "people")
+	defer closeDB(t, db)
+	ctx, cancel := context.WithCancel(context.Background())
+	defer cancel()
+
+	r, err := db.QueryContext(ctx, "SELECT|people|name|")
+	if err != nil {
+		t.Fatal(err)
+	}
+	for r.Next() {
+	}
+	cancel()                          // wake up the awaitDone goroutine
+	time.Sleep(10 * time.Millisecond) // increase odds of seeing failure
+	if err := r.Err(); err != nil {
+		t.Fatal(err)
+	}
+}
+
+func TestNilErrorAfterClose(t *testing.T) {
+	db := newTestDB(t, "people")
+	defer closeDB(t, db)
+
+	// This WithCancel is important; Rows contains an optimization to avoid
+	// spawning a goroutine when the query/transaction context cannot be
+	// canceled, but this test tests a bug which is caused by said goroutine.
+	ctx, cancel := context.WithCancel(context.Background())
+	defer cancel()
+
+	r, err := db.QueryContext(ctx, "SELECT|people|name|")
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	if err := r.Close(); err != nil {
+		t.Fatal(err)
+	}
+
+	time.Sleep(10 * time.Millisecond) // increase odds of seeing failure
+	if err := r.Err(); err != nil {
+		t.Fatal(err)
+	}
+}
+
 // badConn implements a bad driver.Conn, for TestBadDriver.
 // The Exec method panics.
 type badConn struct{}
@@ -4583,3 +4718,35 @@
 		}
 	})
 }
+
+func TestGrabConnAllocs(t *testing.T) {
+	testenv.SkipIfOptimizationOff(t)
+	if race.Enabled {
+		t.Skip("skipping allocation test when using race detector")
+	}
+	c := new(Conn)
+	ctx := context.Background()
+	n := int(testing.AllocsPerRun(1000, func() {
+		_, release, err := c.grabConn(ctx)
+		if err != nil {
+			t.Fatal(err)
+		}
+		release(nil)
+	}))
+	if n > 0 {
+		t.Fatalf("Conn.grabConn allocated %v objects; want 0", n)
+	}
+}
+
+func BenchmarkGrabConn(b *testing.B) {
+	b.ReportAllocs()
+	c := new(Conn)
+	ctx := context.Background()
+	for i := 0; i < b.N; i++ {
+		_, release, err := c.grabConn(ctx)
+		if err != nil {
+			b.Fatal(err)
+		}
+		release(nil)
+	}
+}
diff --git a/src/debug/buildinfo/buildinfo.go b/src/debug/buildinfo/buildinfo.go
index 8bc5753..3409356 100644
--- a/src/debug/buildinfo/buildinfo.go
+++ b/src/debug/buildinfo/buildinfo.go
@@ -19,6 +19,7 @@
 	"encoding/binary"
 	"errors"
 	"fmt"
+	"internal/saferio"
 	"internal/xcoff"
 	"io"
 	"io/fs"
@@ -125,6 +126,12 @@
 			return "", "", errUnrecognizedFormat
 		}
 		x = &machoExe{f}
+	case bytes.HasPrefix(ident, []byte("\xCA\xFE\xBA\xBE")) || bytes.HasPrefix(ident, []byte("\xCA\xFE\xBA\xBF")):
+		f, err := macho.NewFatFile(r)
+		if err != nil || len(f.Arches) == 0 {
+			return "", "", errUnrecognizedFormat
+		}
+		x = &machoExe{f.Arches[0].File}
 	case bytes.HasPrefix(ident, []byte{0x01, 0xDF}) || bytes.HasPrefix(ident, []byte{0x01, 0xF7}):
 		f, err := xcoff.NewFile(r)
 		if err != nil {
@@ -260,12 +267,7 @@
 			if n > size {
 				n = size
 			}
-			data := make([]byte, n)
-			_, err := prog.ReadAt(data, int64(addr-prog.Vaddr))
-			if err != nil {
-				return nil, err
-			}
-			return data, nil
+			return saferio.ReadDataAt(prog, n, int64(addr-prog.Vaddr))
 		}
 	}
 	return nil, errUnrecognizedFormat
@@ -308,12 +310,7 @@
 			if n > size {
 				n = size
 			}
-			data := make([]byte, n)
-			_, err := sect.ReadAt(data, int64(addr-uint64(sect.VirtualAddress)))
-			if err != nil {
-				return nil, errUnrecognizedFormat
-			}
-			return data, nil
+			return saferio.ReadDataAt(sect, n, int64(addr-uint64(sect.VirtualAddress)))
 		}
 	}
 	return nil, errUnrecognizedFormat
@@ -360,12 +357,7 @@
 			if n > size {
 				n = size
 			}
-			data := make([]byte, n)
-			_, err := seg.ReadAt(data, int64(addr-seg.Addr))
-			if err != nil {
-				return nil, err
-			}
-			return data, nil
+			return saferio.ReadDataAt(seg, n, int64(addr-seg.Addr))
 		}
 	}
 	return nil, errUnrecognizedFormat
@@ -401,12 +393,7 @@
 			if n > size {
 				n = size
 			}
-			data := make([]byte, n)
-			_, err := sect.ReadAt(data, int64(addr-sect.VirtualAddress))
-			if err != nil {
-				return nil, err
-			}
-			return data, nil
+			return saferio.ReadDataAt(sect, n, int64(addr-sect.VirtualAddress))
 		}
 	}
 	return nil, errors.New("address not mapped")
@@ -438,14 +425,8 @@
 			if n > size {
 				n = size
 			}
-			data := make([]byte, n)
-			_, err := sect.ReadAt(data, int64(addr-uint64(sect.Offset)))
-			if err != nil {
-				return nil, err
-			}
-			return data, nil
+			return saferio.ReadDataAt(sect, n, int64(addr-uint64(sect.Offset)))
 		}
 	}
 	return nil, errors.New("address not mapped")
-
 }
diff --git a/src/debug/dwarf/class_string.go b/src/debug/dwarf/class_string.go
index 76de7ca..163bed7 100644
--- a/src/debug/dwarf/class_string.go
+++ b/src/debug/dwarf/class_string.go
@@ -23,11 +23,16 @@
 	_ = x[ClassString-12]
 	_ = x[ClassReferenceAlt-13]
 	_ = x[ClassStringAlt-14]
+	_ = x[ClassAddrPtr-15]
+	_ = x[ClassLocList-16]
+	_ = x[ClassRngList-17]
+	_ = x[ClassRngListsPtr-18]
+	_ = x[ClassStrOffsetsPtr-19]
 }
 
-const _Class_name = "ClassUnknownClassAddressClassBlockClassConstantClassExprLocClassFlagClassLinePtrClassLocListPtrClassMacPtrClassRangeListPtrClassReferenceClassReferenceSigClassStringClassReferenceAltClassStringAlt"
+const _Class_name = "ClassUnknownClassAddressClassBlockClassConstantClassExprLocClassFlagClassLinePtrClassLocListPtrClassMacPtrClassRangeListPtrClassReferenceClassReferenceSigClassStringClassReferenceAltClassStringAltClassAddrPtrClassLocListClassRngListClassRngListsPtrClassStrOffsetsPtr"
 
-var _Class_index = [...]uint8{0, 12, 24, 34, 47, 59, 68, 80, 95, 106, 123, 137, 154, 165, 182, 196}
+var _Class_index = [...]uint16{0, 12, 24, 34, 47, 59, 68, 80, 95, 106, 123, 137, 154, 165, 182, 196, 208, 220, 232, 248, 266}
 
 func (i Class) String() string {
 	if i < 0 || i >= Class(len(_Class_index)-1) {
diff --git a/src/debug/dwarf/entry.go b/src/debug/dwarf/entry.go
index 5bb4297..f1215d2 100644
--- a/src/debug/dwarf/entry.go
+++ b/src/debug/dwarf/entry.go
@@ -975,9 +975,12 @@
 		u := &r.d.unit[unit]
 		r.b = makeBuf(r.d, u, "info", u.off, u.data)
 		e, err := r.Next()
-		if err != nil || e == nil || e.Tag == 0 {
+		if err != nil {
 			return nil, err
 		}
+		if e == nil || e.Tag == 0 {
+			return nil, ErrUnknownPC
+		}
 		ranges, err := r.d.Ranges(e)
 		if err != nil {
 			return nil, err
diff --git a/src/debug/dwarf/entry_test.go b/src/debug/dwarf/entry_test.go
index 4e96dbf..1ce1c98 100644
--- a/src/debug/dwarf/entry_test.go
+++ b/src/debug/dwarf/entry_test.go
@@ -69,6 +69,12 @@
 		{0x40117e, nil},
 	}
 	testRanges(t, "testdata/line-clang-dwarf5.elf", want)
+
+	want = []wantRange{
+		{0x401126, [][2]uint64{{0x401126, 0x40116a}}},
+		{0x40116a, [][2]uint64{{0x40116a, 0x401180}}},
+	}
+	testRanges(t, "testdata/line-gcc-zstd.elf", want)
 }
 
 func TestRangesSection(t *testing.T) {
@@ -156,6 +162,15 @@
 				{"f2", [][2]uint64{{0x401180, 0x401197}}},
 			},
 		},
+		{
+			"testdata/line-gcc-zstd.elf",
+			subprograms{
+				{"f2", nil},
+				{"main", [][2]uint64{{0x40114b, 0x40116a}}},
+				{"f1", [][2]uint64{{0x401126, 0x40114b}}},
+				{"f2", [][2]uint64{{0x40116a, 0x401180}}},
+			},
+		},
 	}
 
 	for _, test := range tests {
diff --git a/src/debug/dwarf/line_test.go b/src/debug/dwarf/line_test.go
index 163fc3b..e947d99 100644
--- a/src/debug/dwarf/line_test.go
+++ b/src/debug/dwarf/line_test.go
@@ -48,6 +48,44 @@
 	testLineTable(t, want, files, elfData(t, "testdata/line-gcc.elf"))
 }
 
+func TestLineELFGCCZstd(t *testing.T) {
+	// Generated by:
+	//   # gcc --version | head -n1
+	//   gcc (Debian 12.2.0-10) 12.2.0
+	//   # gcc -g -no-pie -Wl,--compress-debug-sections=zstd line*.c
+
+	zfile1H := &LineFile{Name: "/home/iant/go/src/debug/dwarf/testdata/line1.h"}
+	zfile1C := &LineFile{Name: "/home/iant/go/src/debug/dwarf/testdata/line1.c"}
+	zfile2C := &LineFile{Name: "/home/iant/go/src/debug/dwarf/testdata/line2.c"}
+
+	// Line table based on readelf --debug-dump=rawline,decodedline
+	want := []LineEntry{
+		{Address: 0x401126, File: zfile1H, Line: 2, Column: 1, IsStmt: true},
+		{Address: 0x40112a, File: zfile1H, Line: 5, Column: 8, IsStmt: true},
+		{Address: 0x401131, File: zfile1H, Line: 5, Column: 2, IsStmt: true},
+		{Address: 0x401133, File: zfile1H, Line: 6, Column: 10, IsStmt: true, Discriminator: 3},
+		{Address: 0x40113d, File: zfile1H, Line: 5, Column: 22, IsStmt: true, Discriminator: 3},
+		{Address: 0x401141, File: zfile1H, Line: 5, Column: 15, IsStmt: true, Discriminator: 1},
+		{Address: 0x401147, File: zfile1H, Line: 7, Column: 1, IsStmt: true},
+		{Address: 0x40114b, File: zfile1C, Line: 6, Column: 1, IsStmt: true},
+		{Address: 0x40114f, File: zfile1C, Line: 7, Column: 2, IsStmt: true},
+		{Address: 0x401159, File: zfile1C, Line: 8, Column: 2, IsStmt: true},
+		{Address: 0x401168, File: zfile1C, Line: 9, Column: 1, IsStmt: true},
+		{Address: 0x40116a, EndSequence: true},
+
+		{Address: 0x40116a, File: zfile2C, Line: 4, Column: 1, IsStmt: true},
+		{Address: 0x40116e, File: zfile2C, Line: 5, Column: 2, IsStmt: true},
+		{Address: 0x40117d, File: zfile2C, Line: 6, Column: 1, IsStmt: true},
+		{Address: 0x401180, EndSequence: true},
+	}
+	files := [][]*LineFile{
+		{zfile1C, zfile1H, zfile1C},
+		{zfile2C, zfile2C},
+	}
+
+	testLineTable(t, want, files, elfData(t, "testdata/line-gcc-zstd.elf"))
+}
+
 func TestLineGCCWindows(t *testing.T) {
 	// Generated by:
 	//   > gcc --version
@@ -277,7 +315,7 @@
 	}
 
 	// Compare line tables.
-	if !compareLines(got, want) {
+	if !compareLines(t, got, want) {
 		t.Log("Line tables do not match. Got:")
 		dumpLines(t, got)
 		t.Log("Want:")
@@ -312,8 +350,10 @@
 	}
 }
 
-func compareLines(a, b []LineEntry) bool {
+func compareLines(t *testing.T, a, b []LineEntry) bool {
+	t.Helper()
 	if len(a) != len(b) {
+		t.Errorf("len(a) == %d, len(b) == %d", len(a), len(b))
 		return false
 	}
 
@@ -326,11 +366,13 @@
 			continue
 		}
 		if al.File.Name != bl.File.Name {
+			t.Errorf("%d: name %v != name %v", i, al.File.Name, bl.File.Name)
 			return false
 		}
 		al.File = nil
 		bl.File = nil
 		if al != bl {
+			t.Errorf("%d: %#v != %#v", i, al, bl)
 			return false
 		}
 	}
diff --git a/src/debug/dwarf/testdata/line-gcc-zstd.elf b/src/debug/dwarf/testdata/line-gcc-zstd.elf
new file mode 100644
index 0000000..45cbe72
--- /dev/null
+++ b/src/debug/dwarf/testdata/line-gcc-zstd.elf
Binary files differ
diff --git a/src/debug/elf/elf.go b/src/debug/elf/elf.go
index 02cda16..c982c68 100644
--- a/src/debug/elf/elf.go
+++ b/src/debug/elf/elf.go
@@ -13,7 +13,7 @@
  * $FreeBSD: src/sys/sparc64/include/elf.h,v 1.12 2003/09/25 01:10:26 peter Exp $
  * "System V ABI" (http://www.sco.com/developers/gabi/latest/ch4.eheader.html)
  * "ELF for the ARM® 64-bit Architecture (AArch64)" (ARM IHI 0056B)
- * "RISC-V ELF psABI specification" (https://github.com/riscv/riscv-elf-psabi-doc/blob/master/riscv-elf.md)
+ * "RISC-V ELF psABI specification" (https://github.com/riscv/riscv-elf-psabi-doc/blob/master/riscv-elf.adoc)
  * llvm/BinaryFormat/ELF.h - ELF constants and structures
  *
  * Copyright (c) 1996-1998 John D. Polstra.  All rights reserved.
@@ -728,6 +728,7 @@
 
 const (
 	COMPRESS_ZLIB   CompressionType = 1          /* ZLIB compression. */
+	COMPRESS_ZSTD   CompressionType = 2          /* ZSTD compression. */
 	COMPRESS_LOOS   CompressionType = 0x60000000 /* First OS-specific. */
 	COMPRESS_HIOS   CompressionType = 0x6fffffff /* Last OS-specific. */
 	COMPRESS_LOPROC CompressionType = 0x70000000 /* First processor-specific type. */
@@ -736,6 +737,7 @@
 
 var compressionStrings = []intName{
 	{1, "COMPRESS_ZLIB"},
+	{2, "COMPRESS_ZSTD"},
 	{0x60000000, "COMPRESS_LOOS"},
 	{0x6fffffff, "COMPRESS_HIOS"},
 	{0x70000000, "COMPRESS_LOPROC"},
@@ -1107,6 +1109,124 @@
 func (i DynFlag) String() string   { return flagName(uint32(i), dflagStrings, false) }
 func (i DynFlag) GoString() string { return flagName(uint32(i), dflagStrings, true) }
 
+// DT_FLAGS_1 values.
+type DynFlag1 uint32
+
+const (
+	// Indicates that all relocations for this object must be processed before
+	// returning control to the program.
+	DF_1_NOW DynFlag1 = 0x00000001
+	// Unused.
+	DF_1_GLOBAL DynFlag1 = 0x00000002
+	// Indicates that the object is a member of a group.
+	DF_1_GROUP DynFlag1 = 0x00000004
+	// Indicates that the object cannot be deleted from a process.
+	DF_1_NODELETE DynFlag1 = 0x00000008
+	// Meaningful only for filters. Indicates that all associated filtees be
+	// processed immediately.
+	DF_1_LOADFLTR DynFlag1 = 0x00000010
+	// Indicates that this object's initialization section be run before any other
+	// objects loaded.
+	DF_1_INITFIRST DynFlag1 = 0x00000020
+	// Indicates that the object cannot be added to a running process with dlopen.
+	DF_1_NOOPEN DynFlag1 = 0x00000040
+	// Indicates the object requires $ORIGIN processing.
+	DF_1_ORIGIN DynFlag1 = 0x00000080
+	// Indicates that the object should use direct binding information.
+	DF_1_DIRECT DynFlag1 = 0x00000100
+	// Unused.
+	DF_1_TRANS DynFlag1 = 0x00000200
+	// Indicates that the objects symbol table is to interpose before all symbols
+	// except the primary load object, which is typically the executable.
+	DF_1_INTERPOSE DynFlag1 = 0x00000400
+	// Indicates that the search for dependencies of this object ignores any
+	// default library search paths.
+	DF_1_NODEFLIB DynFlag1 = 0x00000800
+	// Indicates that this object is not dumped by dldump. Candidates are objects
+	// with no relocations that might get included when generating alternative
+	// objects using.
+	DF_1_NODUMP DynFlag1 = 0x00001000
+	// Identifies this object as a configuration alternative object generated by
+	// crle. Triggers the runtime linker to search for a configuration file $ORIGIN/ld.config.app-name.
+	DF_1_CONFALT DynFlag1 = 0x00002000
+	// Meaningful only for filtees. Terminates a filters search for any
+	// further filtees.
+	DF_1_ENDFILTEE DynFlag1 = 0x00004000
+	// Indicates that this object has displacement relocations applied.
+	DF_1_DISPRELDNE DynFlag1 = 0x00008000
+	// Indicates that this object has displacement relocations pending.
+	DF_1_DISPRELPND DynFlag1 = 0x00010000
+	// Indicates that this object contains symbols that cannot be directly
+	// bound to.
+	DF_1_NODIRECT DynFlag1 = 0x00020000
+	// Reserved for internal use by the kernel runtime-linker.
+	DF_1_IGNMULDEF DynFlag1 = 0x00040000
+	// Reserved for internal use by the kernel runtime-linker.
+	DF_1_NOKSYMS DynFlag1 = 0x00080000
+	// Reserved for internal use by the kernel runtime-linker.
+	DF_1_NOHDR DynFlag1 = 0x00100000
+	// Indicates that this object has been edited or has been modified since the
+	// objects original construction by the link-editor.
+	DF_1_EDITED DynFlag1 = 0x00200000
+	// Reserved for internal use by the kernel runtime-linker.
+	DF_1_NORELOC DynFlag1 = 0x00400000
+	// Indicates that the object contains individual symbols that should interpose
+	// before all symbols except the primary load object, which is typically the
+	// executable.
+	DF_1_SYMINTPOSE DynFlag1 = 0x00800000
+	// Indicates that the executable requires global auditing.
+	DF_1_GLOBAUDIT DynFlag1 = 0x01000000
+	// Indicates that the object defines, or makes reference to singleton symbols.
+	DF_1_SINGLETON DynFlag1 = 0x02000000
+	// Indicates that the object is a stub.
+	DF_1_STUB DynFlag1 = 0x04000000
+	// Indicates that the object is a position-independent executable.
+	DF_1_PIE DynFlag1 = 0x08000000
+	// Indicates that the object is a kernel module.
+	DF_1_KMOD DynFlag1 = 0x10000000
+	// Indicates that the object is a weak standard filter.
+	DF_1_WEAKFILTER DynFlag1 = 0x20000000
+	// Unused.
+	DF_1_NOCOMMON DynFlag1 = 0x40000000
+)
+
+var dflag1Strings = []intName{
+	{0x00000001, "DF_1_NOW"},
+	{0x00000002, "DF_1_GLOBAL"},
+	{0x00000004, "DF_1_GROUP"},
+	{0x00000008, "DF_1_NODELETE"},
+	{0x00000010, "DF_1_LOADFLTR"},
+	{0x00000020, "DF_1_INITFIRST"},
+	{0x00000040, "DF_1_NOOPEN"},
+	{0x00000080, "DF_1_ORIGIN"},
+	{0x00000100, "DF_1_DIRECT"},
+	{0x00000200, "DF_1_TRANS"},
+	{0x00000400, "DF_1_INTERPOSE"},
+	{0x00000800, "DF_1_NODEFLIB"},
+	{0x00001000, "DF_1_NODUMP"},
+	{0x00002000, "DF_1_CONFALT"},
+	{0x00004000, "DF_1_ENDFILTEE"},
+	{0x00008000, "DF_1_DISPRELDNE"},
+	{0x00010000, "DF_1_DISPRELPND"},
+	{0x00020000, "DF_1_NODIRECT"},
+	{0x00040000, "DF_1_IGNMULDEF"},
+	{0x00080000, "DF_1_NOKSYMS"},
+	{0x00100000, "DF_1_NOHDR"},
+	{0x00200000, "DF_1_EDITED"},
+	{0x00400000, "DF_1_NORELOC"},
+	{0x00800000, "DF_1_SYMINTPOSE"},
+	{0x01000000, "DF_1_GLOBAUDIT"},
+	{0x02000000, "DF_1_SINGLETON"},
+	{0x04000000, "DF_1_STUB"},
+	{0x08000000, "DF_1_PIE"},
+	{0x10000000, "DF_1_KMOD"},
+	{0x20000000, "DF_1_WEAKFILTER"},
+	{0x40000000, "DF_1_NOCOMMON"},
+}
+
+func (i DynFlag1) String() string   { return flagName(uint32(i), dflag1Strings, false) }
+func (i DynFlag1) GoString() string { return flagName(uint32(i), dflag1Strings, true) }
+
 // NType values; used in core files.
 type NType int
 
@@ -2643,6 +2763,7 @@
 	R_PPC64_PLTSEQ_NOTOC       R_PPC64 = 121
 	R_PPC64_PLTCALL_NOTOC      R_PPC64 = 122
 	R_PPC64_PCREL_OPT          R_PPC64 = 123
+	R_PPC64_REL24_P9NOTOC      R_PPC64 = 124
 	R_PPC64_D34                R_PPC64 = 128
 	R_PPC64_D34_LO             R_PPC64 = 129
 	R_PPC64_D34_HI30           R_PPC64 = 130
@@ -2806,6 +2927,7 @@
 	{121, "R_PPC64_PLTSEQ_NOTOC"},
 	{122, "R_PPC64_PLTCALL_NOTOC"},
 	{123, "R_PPC64_PCREL_OPT"},
+	{124, "R_PPC64_REL24_P9NOTOC"},
 	{128, "R_PPC64_D34"},
 	{129, "R_PPC64_D34_LO"},
 	{130, "R_PPC64_D34_HI30"},
diff --git a/src/debug/elf/elf_test.go b/src/debug/elf/elf_test.go
index 814c6bd..0350d53 100644
--- a/src/debug/elf/elf_test.go
+++ b/src/debug/elf/elf_test.go
@@ -25,6 +25,7 @@
 	{PF_W + PF_R + 0x50, "PF_W+PF_R+0x50"},
 	{DT_SYMBOLIC, "DT_SYMBOLIC"},
 	{DF_BIND_NOW, "DF_BIND_NOW"},
+	{DF_1_PIE, "DF_1_PIE"},
 	{NT_FPREGSET, "NT_FPREGSET"},
 	{STB_GLOBAL, "STB_GLOBAL"},
 	{STT_COMMON, "STT_COMMON"},
@@ -37,7 +38,7 @@
 	{R_SPARC_GOT22, "R_SPARC_GOT22"},
 	{ET_LOOS + 5, "ET_LOOS+5"},
 	{ProgFlag(0x50), "0x50"},
-	{COMPRESS_ZLIB + 1, "COMPRESS_ZLIB+1"},
+	{COMPRESS_ZLIB + 2, "COMPRESS_ZSTD+1"},
 }
 
 func TestNames(t *testing.T) {
diff --git a/src/debug/elf/file.go b/src/debug/elf/file.go
index 88b9576..7485337 100644
--- a/src/debug/elf/file.go
+++ b/src/debug/elf/file.go
@@ -23,6 +23,7 @@
 	"errors"
 	"fmt"
 	"internal/saferio"
+	"internal/zstd"
 	"io"
 	"os"
 	"strings"
@@ -137,20 +138,50 @@
 	if s.Type == SHT_NOBITS {
 		return io.NewSectionReader(&nobitsSectionReader{}, 0, int64(s.Size))
 	}
+
+	var zrd func(io.Reader) (io.ReadCloser, error)
 	if s.Flags&SHF_COMPRESSED == 0 {
-		return io.NewSectionReader(s.sr, 0, 1<<63-1)
+
+		if !strings.HasPrefix(s.Name, ".zdebug") {
+			return io.NewSectionReader(s.sr, 0, 1<<63-1)
+		}
+
+		b := make([]byte, 12)
+		n, _ := s.sr.ReadAt(b, 0)
+		if n != 12 || string(b[:4]) != "ZLIB" {
+			return io.NewSectionReader(s.sr, 0, 1<<63-1)
+		}
+
+		s.compressionOffset = 12
+		s.compressionType = COMPRESS_ZLIB
+		s.Size = binary.BigEndian.Uint64(b[4:12])
+		zrd = zlib.NewReader
+
+	} else if s.Flags&SHF_ALLOC != 0 {
+		return errorReader{&FormatError{int64(s.Offset),
+			"SHF_COMPRESSED applies only to non-allocable sections", s.compressionType}}
 	}
-	if s.compressionType == COMPRESS_ZLIB {
-		return &readSeekerFromReader{
-			reset: func() (io.Reader, error) {
-				fr := io.NewSectionReader(s.sr, s.compressionOffset, int64(s.FileSize)-s.compressionOffset)
-				return zlib.NewReader(fr)
-			},
-			size: int64(s.Size),
+
+	switch s.compressionType {
+	case COMPRESS_ZLIB:
+		zrd = zlib.NewReader
+	case COMPRESS_ZSTD:
+		zrd = func(r io.Reader) (io.ReadCloser, error) {
+			return io.NopCloser(zstd.NewReader(r)), nil
 		}
 	}
-	err := &FormatError{int64(s.Offset), "unknown compression type", s.compressionType}
-	return errorReader{err}
+
+	if zrd == nil {
+		return errorReader{&FormatError{int64(s.Offset), "unknown compression type", s.compressionType}}
+	}
+
+	return &readSeekerFromReader{
+		reset: func() (io.Reader, error) {
+			fr := io.NewSectionReader(s.sr, s.compressionOffset, int64(s.FileSize)-s.compressionOffset)
+			return zrd(fr)
+		},
+		size: int64(s.Size),
+	}
 }
 
 // A ProgHeader represents a single ELF program header.
@@ -1309,44 +1340,6 @@
 		if err != nil && uint64(len(b)) < s.Size {
 			return nil, err
 		}
-		var dlen uint64
-		if len(b) >= 12 && string(b[:4]) == "ZLIB" {
-			dlen = binary.BigEndian.Uint64(b[4:12])
-			s.compressionOffset = 12
-		}
-		if dlen == 0 && len(b) >= 12 && s.Flags&SHF_COMPRESSED != 0 &&
-			s.Flags&SHF_ALLOC == 0 &&
-			f.FileHeader.ByteOrder.Uint32(b[:]) == uint32(COMPRESS_ZLIB) {
-			s.compressionType = COMPRESS_ZLIB
-			switch f.FileHeader.Class {
-			case ELFCLASS32:
-				// Chdr32.Size offset
-				dlen = uint64(f.FileHeader.ByteOrder.Uint32(b[4:]))
-				s.compressionOffset = 12
-			case ELFCLASS64:
-				if len(b) < 24 {
-					return nil, errors.New("invalid compress header 64")
-				}
-				// Chdr64.Size offset
-				dlen = f.FileHeader.ByteOrder.Uint64(b[8:])
-				s.compressionOffset = 24
-			default:
-				return nil, fmt.Errorf("unsupported compress header:%s", f.FileHeader.Class)
-			}
-		}
-		if dlen > 0 {
-			r, err := zlib.NewReader(bytes.NewBuffer(b[s.compressionOffset:]))
-			if err != nil {
-				return nil, err
-			}
-			b, err = saferio.ReadData(r, dlen)
-			if err != nil {
-				return nil, err
-			}
-			if err := r.Close(); err != nil {
-				return nil, err
-			}
-		}
 
 		if f.Type == ET_EXEC {
 			// Do not apply relocations to DWARF sections for ET_EXEC binaries.
@@ -1642,6 +1635,40 @@
 	return all, nil
 }
 
+// DynValue returns the values listed for the given tag in the file's dynamic
+// section.
+func (f *File) DynValue(tag DynTag) ([]uint64, error) {
+	ds := f.SectionByType(SHT_DYNAMIC)
+	if ds == nil {
+		return nil, nil
+	}
+	d, err := ds.Data()
+	if err != nil {
+		return nil, err
+	}
+
+	// Parse the .dynamic section as a string of bytes.
+	var vals []uint64
+	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 {
+			vals = append(vals, v)
+		}
+	}
+	return vals, nil
+}
+
 type nobitsSectionReader struct{}
 
 func (*nobitsSectionReader) ReadAt(p []byte, off int64) (n int, err error) {
diff --git a/src/debug/elf/file_test.go b/src/debug/elf/file_test.go
index 282e1fc..51a3634 100644
--- a/src/debug/elf/file_test.go
+++ b/src/debug/elf/file_test.go
@@ -7,6 +7,7 @@
 import (
 	"bytes"
 	"compress/gzip"
+	"compress/zlib"
 	"debug/dwarf"
 	"encoding/binary"
 	"fmt"
@@ -17,6 +18,7 @@
 	"path"
 	"reflect"
 	"runtime"
+	"strings"
 	"testing"
 )
 
@@ -900,7 +902,7 @@
 func TestNoSectionOverlaps(t *testing.T) {
 	// Ensure cmd/link outputs sections without overlaps.
 	switch runtime.GOOS {
-	case "aix", "android", "darwin", "ios", "js", "plan9", "windows":
+	case "aix", "android", "darwin", "ios", "js", "plan9", "windows", "wasip1":
 		t.Skipf("cmd/link doesn't produce ELF binaries on %s", runtime.GOOS)
 	}
 	_ = net.ResolveIPAddr // force dynamic linkage
@@ -1224,3 +1226,65 @@
 		t.Fatalf("opening invalid ELF file unexpectedly succeeded")
 	}
 }
+
+func TestDynValue(t *testing.T) {
+	const testdata = "testdata/gcc-amd64-linux-exec"
+	f, err := Open(testdata)
+	if err != nil {
+		t.Fatalf("could not read %s: %v", testdata, err)
+	}
+	defer f.Close()
+
+	vals, err := f.DynValue(DT_VERNEEDNUM)
+	if err != nil {
+		t.Fatalf("DynValue(DT_VERNEEDNUM): got unexpected error %v", err)
+	}
+
+	if len(vals) != 1 || vals[0] != 1 {
+		t.Errorf("DynValue(DT_VERNEEDNUM): got %v, want [1]", vals)
+	}
+}
+
+func TestIssue59208(t *testing.T) {
+	// corrupted dwarf data should raise invalid dwarf data instead of invalid zlib
+	const orig = "testdata/compressed-64.obj"
+	f, err := Open(orig)
+	if err != nil {
+		t.Fatal(err)
+	}
+	sec := f.Section(".debug_info")
+
+	data, err := os.ReadFile(orig)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	dn := make([]byte, len(data))
+	zoffset := sec.Offset + uint64(sec.compressionOffset)
+	copy(dn, data[:zoffset])
+
+	ozd, err := sec.Data()
+	if err != nil {
+		t.Fatal(err)
+	}
+	buf := bytes.NewBuffer(nil)
+	wr := zlib.NewWriter(buf)
+	// corrupt origin data same as COMPRESS_ZLIB
+	copy(ozd, []byte{1, 0, 0, 0})
+	wr.Write(ozd)
+	wr.Close()
+
+	copy(dn[zoffset:], buf.Bytes())
+	copy(dn[sec.Offset+sec.FileSize:], data[sec.Offset+sec.FileSize:])
+
+	nf, err := NewFile(bytes.NewReader(dn))
+	if err != nil {
+		t.Error(err)
+	}
+
+	const want = "decoding dwarf section info"
+	_, err = nf.DWARF()
+	if err == nil || !strings.Contains(err.Error(), want) {
+		t.Errorf("DWARF = %v; want %q", err, want)
+	}
+}
diff --git a/src/debug/macho/file.go b/src/debug/macho/file.go
index ecde25a..7cba339 100644
--- a/src/debug/macho/file.go
+++ b/src/debug/macho/file.go
@@ -323,8 +323,8 @@
 			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 {
+			strtab, err := saferio.ReadDataAt(r, uint64(hdr.Strsize), int64(hdr.Stroff))
+			if err != nil {
 				return nil, err
 			}
 			var symsz int
@@ -350,7 +350,9 @@
 			if err := binary.Read(b, bo, &hdr); err != nil {
 				return nil, err
 			}
-			if hdr.Iundefsym > uint32(len(f.Symtab.Syms)) {
+			if f.Symtab == nil {
+				return nil, &FormatError{offset, "dynamic symbol table seen before any ordinary symbol table", nil}
+			} else if hdr.Iundefsym > uint32(len(f.Symtab.Syms)) {
 				return nil, &FormatError{offset, fmt.Sprintf(
 					"undefined symbols index in dynamic symbol table command is greater than symbol table length (%d > %d)",
 					hdr.Iundefsym, len(f.Symtab.Syms)), nil}
@@ -359,8 +361,8 @@
 					"number of undefined symbols after index in dynamic symbol table command is greater than symbol table length (%d > %d)",
 					hdr.Iundefsym+hdr.Nundefsym, len(f.Symtab.Syms)), nil}
 			}
-			dat := make([]byte, hdr.Nindirectsyms*4)
-			if _, err := r.ReadAt(dat, int64(hdr.Indirectsymoff)); err != nil {
+			dat, err := saferio.ReadDataAt(r, uint64(hdr.Nindirectsyms)*4, int64(hdr.Indirectsymoff))
+			if err != nil {
 				return nil, err
 			}
 			x := make([]uint32, hdr.Nindirectsyms)
diff --git a/src/debug/macho/reloctype_string.go b/src/debug/macho/reloctype_string.go
index 9c2b131..cb31627 100644
--- a/src/debug/macho/reloctype_string.go
+++ b/src/debug/macho/reloctype_string.go
@@ -4,6 +4,18 @@
 
 import "strconv"
 
+func _() {
+	// An "invalid array index" compiler error signifies that the constant values have changed.
+	// Re-run the stringer command to generate them again.
+	var x [1]struct{}
+	_ = x[GENERIC_RELOC_VANILLA-0]
+	_ = x[GENERIC_RELOC_PAIR-1]
+	_ = x[GENERIC_RELOC_SECTDIFF-2]
+	_ = x[GENERIC_RELOC_PB_LA_PTR-3]
+	_ = x[GENERIC_RELOC_LOCAL_SECTDIFF-4]
+	_ = x[GENERIC_RELOC_TLV-5]
+}
+
 const _RelocTypeGeneric_name = "GENERIC_RELOC_VANILLAGENERIC_RELOC_PAIRGENERIC_RELOC_SECTDIFFGENERIC_RELOC_PB_LA_PTRGENERIC_RELOC_LOCAL_SECTDIFFGENERIC_RELOC_TLV"
 
 var _RelocTypeGeneric_index = [...]uint8{0, 21, 39, 61, 84, 112, 129}
@@ -14,6 +26,21 @@
 	}
 	return _RelocTypeGeneric_name[_RelocTypeGeneric_index[i]:_RelocTypeGeneric_index[i+1]]
 }
+func _() {
+	// An "invalid array index" compiler error signifies that the constant values have changed.
+	// Re-run the stringer command to generate them again.
+	var x [1]struct{}
+	_ = x[X86_64_RELOC_UNSIGNED-0]
+	_ = x[X86_64_RELOC_SIGNED-1]
+	_ = x[X86_64_RELOC_BRANCH-2]
+	_ = x[X86_64_RELOC_GOT_LOAD-3]
+	_ = x[X86_64_RELOC_GOT-4]
+	_ = x[X86_64_RELOC_SUBTRACTOR-5]
+	_ = x[X86_64_RELOC_SIGNED_1-6]
+	_ = x[X86_64_RELOC_SIGNED_2-7]
+	_ = x[X86_64_RELOC_SIGNED_4-8]
+	_ = x[X86_64_RELOC_TLV-9]
+}
 
 const _RelocTypeX86_64_name = "X86_64_RELOC_UNSIGNEDX86_64_RELOC_SIGNEDX86_64_RELOC_BRANCHX86_64_RELOC_GOT_LOADX86_64_RELOC_GOTX86_64_RELOC_SUBTRACTORX86_64_RELOC_SIGNED_1X86_64_RELOC_SIGNED_2X86_64_RELOC_SIGNED_4X86_64_RELOC_TLV"
 
@@ -25,6 +52,21 @@
 	}
 	return _RelocTypeX86_64_name[_RelocTypeX86_64_index[i]:_RelocTypeX86_64_index[i+1]]
 }
+func _() {
+	// An "invalid array index" compiler error signifies that the constant values have changed.
+	// Re-run the stringer command to generate them again.
+	var x [1]struct{}
+	_ = x[ARM_RELOC_VANILLA-0]
+	_ = x[ARM_RELOC_PAIR-1]
+	_ = x[ARM_RELOC_SECTDIFF-2]
+	_ = x[ARM_RELOC_LOCAL_SECTDIFF-3]
+	_ = x[ARM_RELOC_PB_LA_PTR-4]
+	_ = x[ARM_RELOC_BR24-5]
+	_ = x[ARM_THUMB_RELOC_BR22-6]
+	_ = x[ARM_THUMB_32BIT_BRANCH-7]
+	_ = x[ARM_RELOC_HALF-8]
+	_ = x[ARM_RELOC_HALF_SECTDIFF-9]
+}
 
 const _RelocTypeARM_name = "ARM_RELOC_VANILLAARM_RELOC_PAIRARM_RELOC_SECTDIFFARM_RELOC_LOCAL_SECTDIFFARM_RELOC_PB_LA_PTRARM_RELOC_BR24ARM_THUMB_RELOC_BR22ARM_THUMB_32BIT_BRANCHARM_RELOC_HALFARM_RELOC_HALF_SECTDIFF"
 
@@ -36,6 +78,22 @@
 	}
 	return _RelocTypeARM_name[_RelocTypeARM_index[i]:_RelocTypeARM_index[i+1]]
 }
+func _() {
+	// An "invalid array index" compiler error signifies that the constant values have changed.
+	// Re-run the stringer command to generate them again.
+	var x [1]struct{}
+	_ = x[ARM64_RELOC_UNSIGNED-0]
+	_ = x[ARM64_RELOC_SUBTRACTOR-1]
+	_ = x[ARM64_RELOC_BRANCH26-2]
+	_ = x[ARM64_RELOC_PAGE21-3]
+	_ = x[ARM64_RELOC_PAGEOFF12-4]
+	_ = x[ARM64_RELOC_GOT_LOAD_PAGE21-5]
+	_ = x[ARM64_RELOC_GOT_LOAD_PAGEOFF12-6]
+	_ = x[ARM64_RELOC_POINTER_TO_GOT-7]
+	_ = x[ARM64_RELOC_TLVP_LOAD_PAGE21-8]
+	_ = x[ARM64_RELOC_TLVP_LOAD_PAGEOFF12-9]
+	_ = x[ARM64_RELOC_ADDEND-10]
+}
 
 const _RelocTypeARM64_name = "ARM64_RELOC_UNSIGNEDARM64_RELOC_SUBTRACTORARM64_RELOC_BRANCH26ARM64_RELOC_PAGE21ARM64_RELOC_PAGEOFF12ARM64_RELOC_GOT_LOAD_PAGE21ARM64_RELOC_GOT_LOAD_PAGEOFF12ARM64_RELOC_POINTER_TO_GOTARM64_RELOC_TLVP_LOAD_PAGE21ARM64_RELOC_TLVP_LOAD_PAGEOFF12ARM64_RELOC_ADDEND"
 
diff --git a/src/debug/pe/file.go b/src/debug/pe/file.go
index f8c922d..06c1601 100644
--- a/src/debug/pe/file.go
+++ b/src/debug/pe/file.go
@@ -20,6 +20,7 @@
 	"compress/zlib"
 	"debug/dwarf"
 	"encoding/binary"
+	"errors"
 	"fmt"
 	"io"
 	"os"
@@ -165,7 +166,7 @@
 		}
 		r2 := r
 		if sh.PointerToRawData == 0 { // .bss must have all 0s
-			r2 = zeroReaderAt{}
+			r2 = &nobitsSectionReader{}
 		}
 		s.sr = io.NewSectionReader(r2, int64(s.SectionHeader.Offset), int64(s.SectionHeader.Size))
 		s.ReaderAt = s.sr
@@ -182,15 +183,10 @@
 	return f, nil
 }
 
-// zeroReaderAt is ReaderAt that reads 0s.
-type zeroReaderAt struct{}
+type nobitsSectionReader struct{}
 
-// ReadAt writes len(p) 0s into p.
-func (w zeroReaderAt) ReadAt(p []byte, off int64) (n int, err error) {
-	for i := range p {
-		p[i] = 0
-	}
-	return len(p), nil
+func (*nobitsSectionReader) ReadAt(p []byte, off int64) (n int, err error) {
+	return 0, errors.New("unexpected read from section with uninitialized data")
 }
 
 // getString extracts a string from symbol string table.
@@ -363,6 +359,9 @@
 	var ds *Section
 	ds = nil
 	for _, s := range f.Sections {
+		if s.Offset == 0 {
+			continue
+		}
 		// We are using distance between s.VirtualAddress and idd.VirtualAddress
 		// to avoid potential overflow of uint32 caused by addition of s.VirtualSize
 		// to s.VirtualAddress.
@@ -464,7 +463,7 @@
 	return "unknown error"
 }
 
-// readOptionalHeader accepts a io.ReadSeeker pointing to optional header in the PE file
+// readOptionalHeader accepts an io.ReadSeeker pointing to optional header in the PE file
 // and its size as seen in the file header.
 // It parses the given size of bytes and returns optional header. It infers whether the
 // bytes being parsed refer to 32 bit or 64 bit version of optional header.
@@ -612,7 +611,7 @@
 	}
 }
 
-// readDataDirectories accepts a io.ReadSeeker pointing to data directories in the PE file,
+// readDataDirectories accepts an io.ReadSeeker pointing to data directories in the PE file,
 // its size and number of data directories as seen in optional header.
 // It parses the given size of bytes and returns given number of data directories.
 func readDataDirectories(r io.ReadSeeker, sz uint16, n uint32) ([]DataDirectory, error) {
diff --git a/src/debug/pe/file_test.go b/src/debug/pe/file_test.go
index 5368e08..3d960ab 100644
--- a/src/debug/pe/file_test.go
+++ b/src/debug/pe/file_test.go
@@ -511,17 +511,9 @@
 	if bss == nil {
 		t.Fatal("could not find .bss section")
 	}
-	data, err := bss.Data()
-	if err != nil {
-		t.Fatal(err)
-	}
-	if len(data) == 0 {
-		t.Fatalf("%s file .bss section cannot be empty", objpath)
-	}
-	for _, b := range data {
-		if b != 0 {
-			t.Fatalf(".bss section has non zero bytes: %v", data)
-		}
+	// We expect an error from bss.Data, as there are no contents.
+	if _, err := bss.Data(); err == nil {
+		t.Error("bss.Data succeeded, expected error")
 	}
 }
 
diff --git a/src/debug/pe/section.go b/src/debug/pe/section.go
index fabb47a..70d0c22 100644
--- a/src/debug/pe/section.go
+++ b/src/debug/pe/section.go
@@ -97,11 +97,17 @@
 }
 
 // Data reads and returns the contents of the PE section s.
+//
+// If s.Offset is 0, the section has no contents,
+// and Data will always return a non-nil error.
 func (s *Section) Data() ([]byte, error) {
 	return saferio.ReadDataAt(s.sr, uint64(s.Size), 0)
 }
 
 // Open returns a new ReadSeeker reading the PE section s.
+//
+// If s.Offset is 0, the section has no contents, and all calls
+// to the returned reader will return a non-nil error.
 func (s *Section) Open() io.ReadSeeker {
 	return io.NewSectionReader(s.sr, 0, 1<<63-1)
 }
diff --git a/src/debug/pe/symbol.go b/src/debug/pe/symbol.go
index b1654f8..c33a4fc 100644
--- a/src/debug/pe/symbol.go
+++ b/src/debug/pe/symbol.go
@@ -180,7 +180,7 @@
 	IMAGE_COMDAT_SELECT_LARGEST      = 6
 )
 
-// COFFSymbolReadSectionDefAux returns a blob of axiliary information
+// COFFSymbolReadSectionDefAux returns a blob of auxiliary information
 // (including COMDAT info) for a section definition symbol. Here 'idx'
 // is the index of a section symbol in the main COFFSymbol array for
 // the File. Return value is a pointer to the appropriate aux symbol
diff --git a/src/embed/embed.go b/src/embed/embed.go
index c54b961..8d155eb 100644
--- a/src/embed/embed.go
+++ b/src/embed/embed.go
@@ -243,6 +243,10 @@
 	return 0444
 }
 
+func (f *file) String() string {
+	return fs.FormatFileInfo(f)
+}
+
 // dotFile is a file for the root directory,
 // which is omitted from the files list in a FS.
 var dotFile = &file{name: "./"}
@@ -297,7 +301,7 @@
 
 // Open opens the named file for reading and returns it as an fs.File.
 //
-// The returned file implements io.Seeker when the file is not a directory.
+// The returned file implements io.Seeker and io.ReaderAt when the file is not a directory.
 func (f FS) Open(name string) (fs.File, error) {
 	file := f.lookup(name)
 	if file == nil {
@@ -346,7 +350,8 @@
 }
 
 var (
-	_ io.Seeker = (*openFile)(nil)
+	_ io.Seeker   = (*openFile)(nil)
+	_ io.ReaderAt = (*openFile)(nil)
 )
 
 func (f *openFile) Close() error               { return nil }
@@ -380,6 +385,17 @@
 	return offset, nil
 }
 
+func (f *openFile) ReadAt(b []byte, offset int64) (int, error) {
+	if offset < 0 || offset > int64(len(f.f.data)) {
+		return 0, &fs.PathError{Op: "read", Path: f.f.name, Err: fs.ErrInvalid}
+	}
+	n := copy(b, f.f.data[offset:])
+	if n < len(b) {
+		return n, io.EOF
+	}
+	return n, nil
+}
+
 // An openDir is a directory open for reading.
 type openDir struct {
 	f      *file  // the directory file itself
diff --git a/src/embed/internal/embedtest/embed_test.go b/src/embed/internal/embedtest/embed_test.go
index cbd58ee..a6e673a 100644
--- a/src/embed/internal/embedtest/embed_test.go
+++ b/src/embed/internal/embedtest/embed_test.go
@@ -6,6 +6,7 @@
 
 import (
 	"embed"
+	"io"
 	"reflect"
 	"testing"
 	"testing/fstest"
@@ -176,3 +177,74 @@
 	check(helloBytes)
 	check(helloString)
 }
+
+func TestOffset(t *testing.T) {
+	file, err := testDirAll.Open("testdata/hello.txt")
+	if err != nil {
+		t.Fatal("Open:", err)
+	}
+
+	want := "hello, world\n"
+
+	// Read the entire file.
+	got := make([]byte, len(want))
+	n, err := file.Read(got)
+	if err != nil {
+		t.Fatal("Read:", err)
+	}
+	if n != len(want) {
+		t.Fatal("Read:", n)
+	}
+	if string(got) != want {
+		t.Fatalf("Read: %q", got)
+	}
+
+	// Try to read one byte; confirm we're at the EOF.
+	var buf [1]byte
+	n, err = file.Read(buf[:])
+	if err != io.EOF {
+		t.Fatal("Read:", err)
+	}
+	if n != 0 {
+		t.Fatal("Read:", n)
+	}
+
+	// Use seek to get the offset at the EOF.
+	seeker := file.(io.Seeker)
+	off, err := seeker.Seek(0, io.SeekCurrent)
+	if err != nil {
+		t.Fatal("Seek:", err)
+	}
+	if off != int64(len(want)) {
+		t.Fatal("Seek:", off)
+	}
+
+	// Use ReadAt to read the entire file, ignoring the offset.
+	at := file.(io.ReaderAt)
+	got = make([]byte, len(want))
+	n, err = at.ReadAt(got, 0)
+	if err != nil {
+		t.Fatal("ReadAt:", err)
+	}
+	if n != len(want) {
+		t.Fatalf("ReadAt: got %d bytes, want %d bytes", n, len(want))
+	}
+	if string(got) != want {
+		t.Fatalf("ReadAt: got %q, want %q", got, want)
+	}
+
+	// Use ReadAt with non-zero offset.
+	off = int64(7)
+	want = want[off:]
+	got = make([]byte, len(want))
+	n, err = at.ReadAt(got, off)
+	if err != nil {
+		t.Fatal("ReadAt:", err)
+	}
+	if n != len(want) {
+		t.Fatalf("ReadAt: got %d bytes, want %d bytes", n, len(want))
+	}
+	if string(got) != want {
+		t.Fatalf("ReadAt: got %q, want %q", got, want)
+	}
+}
diff --git a/src/encoding/asn1/asn1.go b/src/encoding/asn1/asn1.go
index 2e32089..e7bf793 100644
--- a/src/encoding/asn1/asn1.go
+++ b/src/encoding/asn1/asn1.go
@@ -26,6 +26,7 @@
 	"math/big"
 	"reflect"
 	"strconv"
+	"strings"
 	"time"
 	"unicode/utf16"
 	"unicode/utf8"
@@ -236,16 +237,18 @@
 }
 
 func (oi ObjectIdentifier) String() string {
-	var s string
+	var s strings.Builder
+	s.Grow(32)
 
+	buf := make([]byte, 0, 19)
 	for i, v := range oi {
 		if i > 0 {
-			s += "."
+			s.WriteByte('.')
 		}
-		s += strconv.Itoa(v)
+		s.Write(strconv.AppendInt(buf, int64(v), 10))
 	}
 
-	return s
+	return s.String()
 }
 
 // parseObjectIdentifier parses an OBJECT IDENTIFIER from the given bytes and
@@ -365,7 +368,7 @@
 // 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"
+	const formatStr = "20060102150405.999999999Z0700"
 	s := string(bytes)
 
 	if ret, err = time.Parse(formatStr, s); err != nil {
diff --git a/src/encoding/asn1/asn1_test.go b/src/encoding/asn1/asn1_test.go
index 90bdfcd..9a605e2 100644
--- a/src/encoding/asn1/asn1_test.go
+++ b/src/encoding/asn1/asn1_test.go
@@ -323,6 +323,10 @@
 var generalizedTimeTestData = []timeTest{
 	{"20100102030405Z", true, time.Date(2010, 01, 02, 03, 04, 05, 0, time.UTC)},
 	{"20100102030405", false, time.Time{}},
+	{"20100102030405.123456Z", true, time.Date(2010, 01, 02, 03, 04, 05, 123456e3, time.UTC)},
+	{"20100102030405.123456", false, time.Time{}},
+	{"20100102030405.Z", false, time.Time{}},
+	{"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
@@ -1164,3 +1168,10 @@
 		t.Fatalf("accepted non-minimally encoded oid")
 	}
 }
+
+func BenchmarkObjectIdentifierString(b *testing.B) {
+	oidPublicKeyRSA := ObjectIdentifier{1, 2, 840, 113549, 1, 1, 1}
+	for i := 0; i < b.N; i++ {
+		_ = oidPublicKeyRSA.String()
+	}
+}
diff --git a/src/encoding/base32/base32.go b/src/encoding/base32/base32.go
index 41d343a..3dc37b0 100644
--- a/src/encoding/base32/base32.go
+++ b/src/encoding/base32/base32.go
@@ -50,7 +50,8 @@
 const encodeHex = "0123456789ABCDEFGHIJKLMNOPQRSTUV"
 
 // NewEncoding returns a new Encoding defined by the given alphabet,
-// which must be a 32-byte string.
+// which must be a 32-byte string. The alphabet is treated as sequence
+// of byte values without any special treatment for multi-byte UTF-8.
 func NewEncoding(encoder string) *Encoding {
 	if len(encoder) != 32 {
 		panic("encoding alphabet is not 32-bytes long")
@@ -80,6 +81,8 @@
 // The padding character must not be '\r' or '\n', must not
 // be contained in the encoding's alphabet and must be a rune equal or
 // below '\xff'.
+// Padding characters above '\x7f' are encoded as their exact byte value
+// rather than using the UTF-8 representation of the codepoint.
 func (enc Encoding) WithPadding(padding rune) *Encoding {
 	if padding == '\r' || padding == '\n' || padding > 0xff {
 		panic("invalid padding")
diff --git a/src/encoding/base64/base64.go b/src/encoding/base64/base64.go
index 0e12d90..6aa8a15 100644
--- a/src/encoding/base64/base64.go
+++ b/src/encoding/base64/base64.go
@@ -54,7 +54,8 @@
 
 // NewEncoding returns a new padded Encoding defined by the given alphabet,
 // which must be a 64-byte string that does not contain the padding character
-// or CR / LF ('\r', '\n').
+// or CR / LF ('\r', '\n'). The alphabet is treated as sequence of byte values
+// without any special treatment for multi-byte UTF-8.
 // The resulting Encoding uses the default padding character ('='),
 // which may be changed or disabled via WithPadding.
 func NewEncoding(encoder string) *Encoding {
@@ -83,6 +84,8 @@
 // The padding character must not be '\r' or '\n', must not
 // be contained in the encoding's alphabet and must be a rune equal or
 // below '\xff'.
+// Padding characters above '\x7f' are encoded as their exact byte value
+// rather than using the UTF-8 representation of the codepoint.
 func (enc Encoding) WithPadding(padding rune) *Encoding {
 	if padding == '\r' || padding == '\n' || padding > 0xff {
 		panic("invalid padding")
diff --git a/src/encoding/binary/binary.go b/src/encoding/binary/binary.go
index 0681511..3fb18a7 100644
--- a/src/encoding/binary/binary.go
+++ b/src/encoding/binary/binary.go
@@ -210,6 +210,10 @@
 
 func (bigEndian) GoString() string { return "binary.BigEndian" }
 
+func (nativeEndian) String() string { return "NativeEndian" }
+
+func (nativeEndian) GoString() string { return "binary.NativeEndian" }
+
 // 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.
@@ -447,7 +451,7 @@
 	v := reflect.Indirect(reflect.ValueOf(data))
 	size := dataSize(v)
 	if size < 0 {
-		return errors.New("binary.Write: invalid type " + reflect.TypeOf(data).String())
+		return errors.New("binary.Write: some values are not fixed-sized in type " + reflect.TypeOf(data).String())
 	}
 	buf := make([]byte, size)
 	e := &encoder{order: order, buf: buf}
@@ -475,7 +479,6 @@
 		if s := sizeof(v.Type().Elem()); s >= 0 {
 			return s * v.Len()
 		}
-		return -1
 
 	case reflect.Struct:
 		t := v.Type()
@@ -487,8 +490,12 @@
 		return size
 
 	default:
-		return sizeof(v.Type())
+		if v.IsValid() {
+			return sizeof(v.Type())
+		}
 	}
+
+	return -1
 }
 
 // sizeof returns the size >= 0 of variables for the given type or -1 if the type is not acceptable.
diff --git a/src/encoding/binary/binary_test.go b/src/encoding/binary/binary_test.go
index 09d08f5..4b22b28 100644
--- a/src/encoding/binary/binary_test.go
+++ b/src/encoding/binary/binary_test.go
@@ -13,6 +13,7 @@
 	"strings"
 	"sync"
 	"testing"
+	"unsafe"
 )
 
 type Struct struct {
@@ -350,6 +351,26 @@
 	}
 }
 
+func TestSizeInvalid(t *testing.T) {
+	testcases := []any{
+		int(0),
+		new(int),
+		(*int)(nil),
+		[1]uint{},
+		new([1]uint),
+		(*[1]uint)(nil),
+		[]int{},
+		[]int(nil),
+		new([]int),
+		(*[]int)(nil),
+	}
+	for _, tc := range testcases {
+		if got := Size(tc); got != -1 {
+			t.Errorf("Size(%T) = %d, want -1", tc, got)
+		}
+	}
+}
+
 // 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.
@@ -539,6 +560,30 @@
 	}
 }
 
+func TestNoFixedSize(t *testing.T) {
+	type Person struct {
+		Age    int
+		Weight float64
+		Height float64
+	}
+
+	person := Person{
+		Age:    27,
+		Weight: 67.3,
+		Height: 177.8,
+	}
+
+	buf := new(bytes.Buffer)
+	err := Write(buf, LittleEndian, &person)
+	if err == nil {
+		t.Fatal("binary.Write: unexpected success as size of type *binary.Person is not fixed")
+	}
+	errs := "binary.Write: some values are not fixed-sized in type *binary.Person"
+	if err.Error() != errs {
+		t.Fatalf("got %q, want %q", err, errs)
+	}
+}
+
 type byteSliceReader struct {
 	remain []byte
 }
@@ -831,3 +876,12 @@
 		Write(w, BigEndian, slice)
 	}
 }
+
+func TestNativeEndian(t *testing.T) {
+	const val = 0x12345678
+	i := uint32(val)
+	s := unsafe.Slice((*byte)(unsafe.Pointer(&i)), unsafe.Sizeof(i))
+	if v := NativeEndian.Uint32(s); v != val {
+		t.Errorf("NativeEndian.Uint32 returned %#x, expected %#x", v, val)
+	}
+}
diff --git a/src/encoding/binary/native_endian_big.go b/src/encoding/binary/native_endian_big.go
new file mode 100644
index 0000000..1a24354
--- /dev/null
+++ b/src/encoding/binary/native_endian_big.go
@@ -0,0 +1,14 @@
+// Copyright 2023 The Go 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:build armbe || arm64be || m68k || mips || mips64 || mips64p32 || ppc || ppc64 || s390 || s390x || shbe || sparc || sparc64
+
+package binary
+
+type nativeEndian struct {
+	bigEndian
+}
+
+// NativeEndian is the native-endian implementation of ByteOrder and AppendByteOrder.
+var NativeEndian nativeEndian
diff --git a/src/encoding/binary/native_endian_little.go b/src/encoding/binary/native_endian_little.go
new file mode 100644
index 0000000..67b41ae
--- /dev/null
+++ b/src/encoding/binary/native_endian_little.go
@@ -0,0 +1,14 @@
+// Copyright 2023 The Go 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:build 386 || amd64 || amd64p32 || alpha || arm || arm64 || loong64 || mipsle || mips64le || mips64p32le || nios2 || ppc64le || riscv || riscv64 || sh || wasm
+
+package binary
+
+type nativeEndian struct {
+	littleEndian
+}
+
+// NativeEndian is the native-endian implementation of ByteOrder and AppendByteOrder.
+var NativeEndian nativeEndian
diff --git a/src/encoding/binary/varint.go b/src/encoding/binary/varint.go
index 18e1ff1..7b14fb2 100644
--- a/src/encoding/binary/varint.go
+++ b/src/encoding/binary/varint.go
@@ -123,7 +123,7 @@
 	return x, n
 }
 
-var overflow = errors.New("binary: varint overflows a 64-bit integer")
+var errOverflow = errors.New("binary: varint overflows a 64-bit integer")
 
 // ReadUvarint reads an encoded unsigned integer from r and returns it as a uint64.
 // The error is EOF only if no bytes were read.
@@ -142,14 +142,14 @@
 		}
 		if b < 0x80 {
 			if i == MaxVarintLen64-1 && b > 1 {
-				return x, overflow
+				return x, errOverflow
 			}
 			return x | uint64(b)<<s, nil
 		}
 		x |= uint64(b&0x7f) << s
 		s += 7
 	}
-	return x, overflow
+	return x, errOverflow
 }
 
 // ReadVarint reads an encoded signed integer from r and returns it as an int64.
diff --git a/src/encoding/binary/varint_test.go b/src/encoding/binary/varint_test.go
index a3caea8..5c3ea31 100644
--- a/src/encoding/binary/varint_test.go
+++ b/src/encoding/binary/varint_test.go
@@ -212,9 +212,9 @@
 }
 
 func TestOverflow(t *testing.T) {
-	testOverflow(t, []byte{0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x2}, 0, -10, overflow)
-	testOverflow(t, []byte{0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x1, 0, 0}, 0, -11, overflow)
-	testOverflow(t, []byte{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, 1<<64-1, -11, overflow) // 11 bytes, should overflow
+	testOverflow(t, []byte{0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x2}, 0, -10, errOverflow)
+	testOverflow(t, []byte{0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x1, 0, 0}, 0, -11, errOverflow)
+	testOverflow(t, []byte{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, 1<<64-1, -11, errOverflow) // 11 bytes, should overflow
 }
 
 func TestNonCanonicalZero(t *testing.T) {
diff --git a/src/encoding/csv/reader.go b/src/encoding/csv/reader.go
index b83208e..c6a8ed0 100644
--- a/src/encoding/csv/reader.go
+++ b/src/encoding/csv/reader.go
@@ -187,8 +187,9 @@
 // Read reads one record (a slice of fields) from r.
 // If the record has an unexpected number of fields,
 // Read returns the record along with the error ErrFieldCount.
-// Except for that case, Read always returns either a non-nil
-// record or a non-nil error, but not both.
+// If the record contains a field that cannot be parsed,
+// Read returns a partial record along with the parse error.
+// The partial record contains all fields read before the error.
 // If there is no data left to be read, Read returns nil, io.EOF.
 // If ReuseRecord is true, the returned slice may be shared
 // between multiple calls to Read.
diff --git a/src/encoding/encoding.go b/src/encoding/encoding.go
index cc5a536..50acf3c 100644
--- a/src/encoding/encoding.go
+++ b/src/encoding/encoding.go
@@ -9,6 +9,12 @@
 // 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.
+//
+// Adding encoding/decoding methods to existing types may constitute a breaking change,
+// as they can be used for serialization in communicating with programs
+// written with different library versions.
+// The policy for packages maintained by the Go project is to only allow
+// the addition of marshaling functions if no existing, reasonable marshaling exists.
 package encoding
 
 // BinaryMarshaler is the interface implemented by an object that can
diff --git a/src/encoding/gob/codec_test.go b/src/encoding/gob/codec_test.go
index 54c356c..1b8f195 100644
--- a/src/encoding/gob/codec_test.go
+++ b/src/encoding/gob/codec_test.go
@@ -1544,6 +1544,10 @@
 	S []StringPair
 }
 
+type LargeSliceString struct {
+	S []string
+}
+
 func testEncodeDecode(t *testing.T, in, out any) {
 	t.Helper()
 	var b bytes.Buffer
@@ -1592,4 +1596,26 @@
 		rt := &LargeSliceStruct{}
 		testEncodeDecode(t, st, rt)
 	})
+	t.Run("string", func(t *testing.T) {
+		t.Parallel()
+		s := make([]string, 1<<21)
+		for i := range s {
+			s[i] = string(rune(i))
+		}
+		st := &LargeSliceString{S: s}
+		rt := &LargeSliceString{}
+		testEncodeDecode(t, st, rt)
+	})
+}
+
+func TestLocalRemoteTypesMismatch(t *testing.T) {
+	// Test data is from https://go.dev/issue/62117.
+	testData := []byte{9, 127, 3, 1, 2, 255, 128, 0, 0, 0, 3, 255, 128, 0}
+
+	var v []*struct{}
+	buf := bytes.NewBuffer(testData)
+	err := NewDecoder(buf).Decode(&v)
+	if err == nil {
+		t.Error("Encode/Decode: expected error but got err == nil")
+	}
 }
diff --git a/src/encoding/gob/debug.go b/src/encoding/gob/debug.go
index dc572fc..a6b1a74 100644
--- a/src/encoding/gob/debug.go
+++ b/src/encoding/gob/debug.go
@@ -465,8 +465,7 @@
 	deb.dump("Singleton value")
 	// is it a builtin type?
 	wire := deb.wireType[id]
-	_, ok := builtinIdToType[id]
-	if !ok && wire == nil {
+	if builtinIdToType(id) == nil && wire == nil {
 		errorf("type id %d not defined", id)
 	}
 	m := deb.uint64()
@@ -573,8 +572,7 @@
 //
 //	builtinValue | ArrayValue | MapValue | SliceValue | StructValue | InterfaceValue
 func (deb *debugger) fieldValue(indent tab, id typeId) {
-	_, ok := builtinIdToType[id]
-	if ok {
+	if builtinIdToType(id) != nil {
 		if id == tInterface {
 			deb.interfaceValue(indent)
 		} else {
diff --git a/src/encoding/gob/dec_helpers.go b/src/encoding/gob/dec_helpers.go
index a09ac8f..44a74e2 100644
--- a/src/encoding/gob/dec_helpers.go
+++ b/src/encoding/gob/dec_helpers.go
@@ -358,6 +358,10 @@
 		if state.b.Len() == 0 {
 			errorf("decoding string array or slice: length exceeds input size (%d elements)", length)
 		}
+		if i >= len(slice) {
+			// This is a slice that we only partially allocated.
+			growSlice(v, &slice, length)
+		}
 		u := state.decodeUint()
 		n := int(u)
 		if n < 0 || uint64(n) != u || n > state.b.Len() {
diff --git a/src/encoding/gob/decgen.go b/src/encoding/gob/decgen.go
index e40816e..27a30ea 100644
--- a/src/encoding/gob/decgen.go
+++ b/src/encoding/gob/decgen.go
@@ -180,6 +180,7 @@
 		fmt.Fprintf(&b, arrayHelper, t.lower, t.upper)
 		fmt.Fprintf(&b, sliceHelper, t.lower, t.upper, t.decoder)
 	}
+	fmt.Fprintf(&b, trailer)
 	source, err := format.Source(b.Bytes())
 	if err != nil {
 		log.Fatal("source format error:", err)
@@ -236,8 +237,29 @@
 		if state.b.Len() == 0 {
 			errorf("decoding %[1]s array or slice: length exceeds input size (%%d elements)", length)
 		}
+		if i >= len(slice) {
+			// This is a slice that we only partially allocated.
+			growSlice(v, &slice, length)
+		}
 		%[3]s
 	}
 	return true
 }
 `
+
+const trailer = `
+// growSlice is called for a slice that we only partially allocated,
+// to grow it up to length.
+func growSlice[E any](v reflect.Value, ps *[]E, length int) {
+	var zero E
+	s := *ps
+	s = append(s, zero)
+	cp := cap(s)
+	if cp > length {
+		cp = length
+	}
+	s = s[:cp]
+	v.Set(reflect.ValueOf(s))
+	*ps = s
+}
+`
diff --git a/src/encoding/gob/decode.go b/src/encoding/gob/decode.go
index f46a391..c0b054e 100644
--- a/src/encoding/gob/decode.go
+++ b/src/encoding/gob/decode.go
@@ -381,10 +381,10 @@
 			if i >= ln {
 				// We didn't allocate the entire slice,
 				// due to using saferio.SliceCap.
-				// Append a value to grow the slice.
+				// Grow the slice for one more element.
 				// The slice is full, so this should
 				// bump up the capacity.
-				value.Set(reflect.Append(value, reflect.Zero(value.Type().Elem())))
+				value.Grow(1)
 			}
 			// Copy into s up to the capacity or n,
 			// whichever is less.
@@ -549,8 +549,8 @@
 		}
 		if i >= ln {
 			// This is a slice that we only partially allocated.
-			// Grow it using append, up to length.
-			value.Set(reflect.Append(value, reflect.Zero(value.Type().Elem())))
+			// Grow it up to length.
+			value.Grow(1)
 			cp := value.Cap()
 			if cp > length {
 				cp = length
@@ -601,15 +601,13 @@
 	keyInstr := &decInstr{keyOp, 0, nil, ovfl}
 	elemInstr := &decInstr{elemOp, 0, nil, ovfl}
 	keyP := reflect.New(mtyp.Key())
-	keyZ := reflect.Zero(mtyp.Key())
 	elemP := reflect.New(mtyp.Elem())
-	elemZ := reflect.Zero(mtyp.Elem())
 	for i := 0; i < n; i++ {
 		key := decodeIntoValue(state, keyOp, keyIsPtr, keyP.Elem(), keyInstr)
 		elem := decodeIntoValue(state, elemOp, elemIsPtr, elemP.Elem(), elemInstr)
 		value.SetMapIndex(key, elem)
-		keyP.Elem().Set(keyZ)
-		elemP.Elem().Set(elemZ)
+		keyP.Elem().SetZero()
+		elemP.Elem().SetZero()
 	}
 }
 
@@ -692,7 +690,7 @@
 	// Allocate the destination interface value.
 	if len(name) == 0 {
 		// Copy the nil interface value to the target.
-		value.Set(reflect.Zero(value.Type()))
+		value.SetZero()
 		return
 	}
 	if len(name) > 1024 {
@@ -875,7 +873,7 @@
 				break
 			}
 			var elemId typeId
-			if tt, ok := builtinIdToType[wireId]; ok {
+			if tt := builtinIdToType(wireId); tt != nil {
 				elemId = tt.(*sliceType).Elem
 			} else {
 				elemId = dec.wireType[wireId].SliceT.Elem
@@ -1068,7 +1066,7 @@
 		}
 		// Extract and compare element types.
 		var sw *sliceType
-		if tt, ok := builtinIdToType[fw]; ok {
+		if tt := builtinIdToType(fw); tt != nil {
 			sw, _ = tt.(*sliceType)
 		} else if wire != nil {
 			sw = wire.SliceT
@@ -1084,7 +1082,7 @@
 func (dec *Decoder) typeString(remoteId typeId) string {
 	typeLock.Lock()
 	defer typeLock.Unlock()
-	if t := idToType[remoteId]; t != nil {
+	if t := idToType(remoteId); t != nil {
 		// globally known type.
 		return t.string()
 	}
@@ -1136,7 +1134,7 @@
 	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 {
+	if t := builtinIdToType(remoteId); t != nil {
 		wireStruct, _ = t.(*structType)
 	} else {
 		wire := dec.wireType[remoteId]
@@ -1199,7 +1197,7 @@
 // emptyStruct is the type we compile into when ignoring a struct value.
 type emptyStruct struct{}
 
-var emptyStructType = reflect.TypeOf(emptyStruct{})
+var emptyStructType = reflect.TypeOf((*emptyStruct)(nil)).Elem()
 
 // 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) {
diff --git a/src/encoding/gob/doc.go b/src/encoding/gob/doc.go
index 15473f1..53c47e7 100644
--- a/src/encoding/gob/doc.go
+++ b/src/encoding/gob/doc.go
@@ -6,7 +6,7 @@
 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".
+[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,
diff --git a/src/encoding/gob/encode.go b/src/encoding/gob/encode.go
index 3843034..5f4d253 100644
--- a/src/encoding/gob/encode.go
+++ b/src/encoding/gob/encode.go
@@ -430,42 +430,7 @@
 	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.Pointer:
-		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.
+// encodeGobEncoder 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?
@@ -615,7 +580,7 @@
 			}
 			v = v.Addr()
 		}
-		if !state.sendZero && isZero(v) {
+		if !state.sendZero && v.IsZero() {
 			return
 		}
 		state.update(i)
diff --git a/src/encoding/gob/encoder.go b/src/encoding/gob/encoder.go
index 5a80e6c..aa41393 100644
--- a/src/encoding/gob/encoder.go
+++ b/src/encoding/gob/encoder.go
@@ -60,7 +60,7 @@
 	}
 }
 
-// writeMessage sends the data item preceded by a unsigned count of its length.
+// writeMessage sends the data item preceded by an 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
diff --git a/src/encoding/gob/timing_test.go b/src/encoding/gob/timing_test.go
index bdee39c..84349fb 100644
--- a/src/encoding/gob/timing_test.go
+++ b/src/encoding/gob/timing_test.go
@@ -21,6 +21,7 @@
 }
 
 func benchmarkEndToEnd(b *testing.B, ctor func() any, pipe func() (r io.Reader, w io.Writer, err error)) {
+	b.ReportAllocs()
 	b.RunParallel(func(pb *testing.PB) {
 		r, w, err := pipe()
 		if err != nil {
@@ -135,6 +136,7 @@
 
 func benchmarkEncodeSlice(b *testing.B, a any) {
 	b.ResetTimer()
+	b.ReportAllocs()
 	b.RunParallel(func(pb *testing.PB) {
 		var buf bytes.Buffer
 		enc := NewEncoder(&buf)
@@ -229,6 +231,7 @@
 	rt := ra.Type()
 	b.ResetTimer()
 
+	b.ReportAllocs()
 	b.RunParallel(func(pb *testing.PB) {
 		// TODO(#19025): Move per-thread allocation before ResetTimer.
 		rp := reflect.New(rt)
@@ -316,6 +319,7 @@
 	}
 	bbuf := benchmarkBuf{data: buf.Bytes()}
 	b.ResetTimer()
+	b.ReportAllocs()
 	for i := 0; i < b.N; i++ {
 		var rm map[int]int
 		bbuf.reset()
diff --git a/src/encoding/gob/type.go b/src/encoding/gob/type.go
index 3114cb0..bd7d919 100644
--- a/src/encoding/gob/type.go
+++ b/src/encoding/gob/type.go
@@ -109,6 +109,8 @@
 	binaryUnmarshalerInterfaceType = reflect.TypeOf((*encoding.BinaryUnmarshaler)(nil)).Elem()
 	textMarshalerInterfaceType     = reflect.TypeOf((*encoding.TextMarshaler)(nil)).Elem()
 	textUnmarshalerInterfaceType   = reflect.TypeOf((*encoding.TextUnmarshaler)(nil)).Elem()
+
+	wireTypeType = reflect.TypeOf((*wireType)(nil)).Elem()
 )
 
 // implementsInterface reports whether the type implements the
@@ -160,7 +162,6 @@
 // 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
 
@@ -172,25 +173,41 @@
 	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
+var (
+	types                = make(map[reflect.Type]gobType, 32)
+	idToTypeSlice        = make([]gobType, 1, firstUserId)
+	builtinIdToTypeSlice [firstUserId]gobType // set in init() after builtins are established
+)
+
+func idToType(id typeId) gobType {
+	if id < 0 || int(id) >= len(idToTypeSlice) {
+		return nil
+	}
+	return idToTypeSlice[id]
+}
+
+func builtinIdToType(id typeId) gobType {
+	if id < 0 || int(id) >= len(builtinIdToTypeSlice) {
+		return nil
+	}
+	return builtinIdToTypeSlice[id]
+}
 
 func setTypeId(typ gobType) {
 	// When building recursive types, someone may get there before us.
 	if typ.id() != 0 {
 		return
 	}
-	nextId++
+	nextId := typeId(len(idToTypeSlice))
 	typ.setId(nextId)
-	idToType[nextId] = typ
+	idToTypeSlice = append(idToTypeSlice, typ)
 }
 
 func (t typeId) gobType() gobType {
 	if t == 0 {
 		return nil
 	}
-	return idToType[t]
+	return idToType(t)
 }
 
 // string returns the string representation of the type associated with the typeId.
@@ -237,51 +254,48 @@
 	// 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", (*any)(nil), 8)
+	tBool      = bootstrapType("bool", (*bool)(nil))
+	tInt       = bootstrapType("int", (*int)(nil))
+	tUint      = bootstrapType("uint", (*uint)(nil))
+	tFloat     = bootstrapType("float", (*float64)(nil))
+	tBytes     = bootstrapType("bytes", (*[]byte)(nil))
+	tString    = bootstrapType("string", (*string)(nil))
+	tComplex   = bootstrapType("complex", (*complex128)(nil))
+	tInterface = bootstrapType("interface", (*any)(nil))
 	// 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)
+	tReserved7 = bootstrapType("_reserved1", (*struct{ r7 int })(nil))
+	tReserved6 = bootstrapType("_reserved1", (*struct{ r6 int })(nil))
+	tReserved5 = bootstrapType("_reserved1", (*struct{ r5 int })(nil))
+	tReserved4 = bootstrapType("_reserved1", (*struct{ r4 int })(nil))
+	tReserved3 = bootstrapType("_reserved1", (*struct{ r3 int })(nil))
+	tReserved2 = bootstrapType("_reserved1", (*struct{ r2 int })(nil))
+	tReserved1 = bootstrapType("_reserved1", (*struct{ r1 int })(nil))
 )
 
 // Predefined because it's needed by the Decoder
-var tWireType = mustGetTypeInfo(reflect.TypeOf(wireType{})).id
-var wireTypeUserInfo *userTypeInfo // userTypeInfo of (*wireType)
+var tWireType = mustGetTypeInfo(wireTypeType).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)
+	checkId(17, mustGetTypeInfo(reflect.TypeOf((*arrayType)(nil)).Elem()).id)
+	checkId(18, mustGetTypeInfo(reflect.TypeOf((*CommonType)(nil)).Elem()).id)
+	checkId(19, mustGetTypeInfo(reflect.TypeOf((*sliceType)(nil)).Elem()).id)
+	checkId(20, mustGetTypeInfo(reflect.TypeOf((*structType)(nil)).Elem()).id)
+	checkId(21, mustGetTypeInfo(reflect.TypeOf((*fieldType)(nil)).Elem()).id)
+	checkId(23, mustGetTypeInfo(reflect.TypeOf((*mapType)(nil)).Elem()).id)
 
-	builtinIdToType = make(map[typeId]gobType)
-	for k, v := range idToType {
-		builtinIdToType[k] = v
-	}
+	copy(builtinIdToTypeSlice[:], idToTypeSlice)
 
 	// Move the id space upwards to allow for growth in the predefined world
 	// without breaking existing files.
-	if nextId > firstUserId {
+	if nextId := len(idToTypeSlice); nextId > firstUserId {
 		panic(fmt.Sprintln("nextId too large:", nextId))
 	}
-	nextId = firstUserId
+	idToTypeSlice = idToTypeSlice[:firstUserId]
 	registerBasics()
-	wireTypeUserInfo = userType(reflect.TypeOf((*wireType)(nil)))
+	wireTypeUserInfo = userType(wireTypeType)
 }
 
 // Array type
@@ -401,7 +415,7 @@
 
 type structType struct {
 	CommonType
-	Field []*fieldType
+	Field []fieldType
 }
 
 func (s *structType) safeString(seen map[typeId]bool) string {
@@ -521,7 +535,7 @@
 	case reflect.Struct:
 		st := newStructType(name)
 		types[rt] = st
-		idToType[st.id()] = st
+		idToTypeSlice[st.id()] = st
 		for i := 0; i < t.NumField(); i++ {
 			f := t.Field(i)
 			if !isSent(&f) {
@@ -544,7 +558,7 @@
 			if gt.id() == 0 {
 				setTypeId(gt)
 			}
-			st.Field = append(st.Field, &fieldType{f.Name, gt.id()})
+			st.Field = append(st.Field, fieldType{f.Name, gt.id()})
 		}
 		return st, nil
 
@@ -611,7 +625,7 @@
 
 // used for building the basic types; called only from init().  the incoming
 // interface always refers to a pointer.
-func bootstrapType(name string, e any, expect typeId) typeId {
+func bootstrapType(name string, e any) typeId {
 	rt := reflect.TypeOf(e).Elem()
 	_, present := types[rt]
 	if present {
@@ -620,9 +634,7 @@
 	typ := &CommonType{Name: name}
 	types[rt] = typ
 	setTypeId(typ)
-	checkId(expect, nextId)
-	userType(rt) // might as well cache it now
-	return nextId
+	return typ.id()
 }
 
 // Representation of the information we send and receive about this type.
@@ -674,7 +686,7 @@
 	id      typeId
 	encInit sync.Mutex // protects creation of encoder
 	encoder atomic.Pointer[encEngine]
-	wire    *wireType
+	wire    wireType
 }
 
 // typeInfoMap is an atomic pointer to map[reflect.Type]*typeInfo.
@@ -685,7 +697,16 @@
 // protected by a mutex.
 var typeInfoMap atomic.Value
 
+// typeInfoMapInit is used instead of typeInfoMap during init time,
+// as types are registered sequentially during init and we can save
+// the overhead of making map copies.
+// It is saved to typeInfoMap and set to nil before init finishes.
+var typeInfoMapInit = make(map[reflect.Type]*typeInfo, 16)
+
 func lookupTypeInfo(rt reflect.Type) *typeInfo {
+	if m := typeInfoMapInit; m != nil {
+		return m[rt]
+	}
 	m, _ := typeInfoMap.Load().(map[reflect.Type]*typeInfo)
 	return m[rt]
 }
@@ -726,33 +747,38 @@
 		gt := userType.id().gobType().(*gobEncoderType)
 		switch ut.externalEnc {
 		case xGob:
-			info.wire = &wireType{GobEncoderT: gt}
+			info.wire.GobEncoderT = gt
 		case xBinary:
-			info.wire = &wireType{BinaryMarshalerT: gt}
+			info.wire.BinaryMarshalerT = gt
 		case xText:
-			info.wire = &wireType{TextMarshalerT: gt}
+			info.wire.TextMarshalerT = gt
 		}
 		rt = ut.user
 	} else {
 		t := info.id.gobType()
 		switch typ := rt; typ.Kind() {
 		case reflect.Array:
-			info.wire = &wireType{ArrayT: t.(*arrayType)}
+			info.wire.ArrayT = t.(*arrayType)
 		case reflect.Map:
-			info.wire = &wireType{MapT: t.(*mapType)}
+			info.wire.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)}
+				info.wire.SliceT = t.(*sliceType)
 			}
 		case reflect.Struct:
-			info.wire = &wireType{StructT: t.(*structType)}
+			info.wire.StructT = t.(*structType)
 		}
 	}
 
+	if m := typeInfoMapInit; m != nil {
+		m[rt] = info
+		return info, nil
+	}
+
 	// Create new map with old contents plus new entry.
-	newm := make(map[reflect.Type]*typeInfo)
 	m, _ := typeInfoMap.Load().(map[reflect.Type]*typeInfo)
+	newm := make(map[reflect.Type]*typeInfo, len(m))
 	for k, v := range m {
 		newm[k] = v
 	}
@@ -911,3 +937,8 @@
 	Register([]bool(nil))
 	Register([]string(nil))
 }
+
+func init() {
+	typeInfoMap.Store(typeInfoMapInit)
+	typeInfoMapInit = nil
+}
diff --git a/src/encoding/json/decode.go b/src/encoding/json/decode.go
index 01af489..53470d8 100644
--- a/src/encoding/json/decode.go
+++ b/src/encoding/json/decode.go
@@ -540,17 +540,10 @@
 			break
 		}
 
-		// Get element of array, growing if necessary.
+		// Expand slice length, growing the slice 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)
+				v.Grow(1)
 			}
 			if i >= v.Len() {
 				v.SetLen(i + 1)
@@ -584,13 +577,11 @@
 
 	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)
+				v.Index(i).SetZero() // zero remainder of array
 			}
 		} else {
-			v.SetLen(i)
+			v.SetLen(i) // truncate the slice
 		}
 	}
 	if i == 0 && v.Kind() == reflect.Slice {
@@ -695,24 +686,13 @@
 			if !mapElem.IsValid() {
 				mapElem = reflect.New(elemType).Elem()
 			} else {
-				mapElem.Set(reflect.Zero(elemType))
+				mapElem.SetZero()
 			}
 			subv = mapElem
 		} else {
-			var f *field
-			if i, ok := fields.nameIndex[string(key)]; ok {
-				// Found an exact name match.
-				f = &fields.list[i]
-			} else {
-				// Fall back to the expensive case-insensitive
-				// linear search.
-				for i := range fields.list {
-					ff := &fields.list[i]
-					if ff.equalFold(ff.nameBytes, key) {
-						f = ff
-						break
-					}
-				}
+			f := fields.byExactName[string(key)]
+			if f == nil {
+				f = fields.byFoldedName[string(foldName(key))]
 			}
 			if f != nil {
 				subv = v
@@ -909,7 +889,7 @@
 		}
 		switch v.Kind() {
 		case reflect.Interface, reflect.Pointer, reflect.Map, reflect.Slice:
-			v.Set(reflect.Zero(v.Type()))
+			v.SetZero()
 			// otherwise, ignore null for primitives/string
 		}
 	case 't', 'f': // true, false
diff --git a/src/encoding/json/encode.go b/src/encoding/json/encode.go
index 9d59b0f..6da0bd9 100644
--- a/src/encoding/json/encode.go
+++ b/src/encoding/json/encode.go
@@ -42,6 +42,7 @@
 // Boolean values encode as JSON booleans.
 //
 // Floating point, integer, and Number values encode as JSON numbers.
+// NaN and +/-Inf values will return an [UnsupportedValueError].
 //
 // String values encode as JSON strings coerced to valid UTF-8,
 // replacing invalid bytes with the Unicode replacement rune.
@@ -175,47 +176,12 @@
 	if err != nil {
 		return nil, err
 	}
-	var buf bytes.Buffer
-	err = Indent(&buf, b, prefix, indent)
+	b2 := make([]byte, 0, indentGrowthFactor*len(b))
+	b2, err = appendIndent(b2, 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:])
-	}
+	return b2, nil
 }
 
 // Marshaler is the interface implemented by types that
@@ -284,7 +250,6 @@
 // An encodeState encodes JSON into a bytes.Buffer.
 type encodeState struct {
 	bytes.Buffer // accumulated output
-	scratch      [64]byte
 
 	// Keep track of what pointers we've seen in the current recursive call
 	// path, to avoid cycles that could lead to a stack overflow. Only do
@@ -341,7 +306,7 @@
 	case reflect.Array, reflect.Map, reflect.Slice, reflect.String:
 		return v.Len() == 0
 	case reflect.Bool:
-		return !v.Bool()
+		return v.Bool() == false
 	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:
@@ -476,8 +441,10 @@
 	}
 	b, err := m.MarshalJSON()
 	if err == nil {
-		// copy JSON into buffer, checking validity.
-		err = compact(&e.Buffer, b, opts.escapeHTML)
+		e.Grow(len(b))
+		out := e.AvailableBuffer()
+		out, err = appendCompact(out, b, opts.escapeHTML)
+		e.Buffer.Write(out)
 	}
 	if err != nil {
 		e.error(&MarshalerError{v.Type(), err, "MarshalJSON"})
@@ -493,8 +460,10 @@
 	m := va.Interface().(Marshaler)
 	b, err := m.MarshalJSON()
 	if err == nil {
-		// copy JSON into buffer, checking validity.
-		err = compact(&e.Buffer, b, opts.escapeHTML)
+		e.Grow(len(b))
+		out := e.AvailableBuffer()
+		out, err = appendCompact(out, b, opts.escapeHTML)
+		e.Buffer.Write(out)
 	}
 	if err != nil {
 		e.error(&MarshalerError{v.Type(), err, "MarshalJSON"})
@@ -515,7 +484,7 @@
 	if err != nil {
 		e.error(&MarshalerError{v.Type(), err, "MarshalText"})
 	}
-	e.stringBytes(b, opts.escapeHTML)
+	e.Write(appendString(e.AvailableBuffer(), b, opts.escapeHTML))
 }
 
 func addrTextMarshalerEncoder(e *encodeState, v reflect.Value, opts encOpts) {
@@ -529,43 +498,31 @@
 	if err != nil {
 		e.error(&MarshalerError{v.Type(), err, "MarshalText"})
 	}
-	e.stringBytes(b, opts.escapeHTML)
+	e.Write(appendString(e.AvailableBuffer(), b, opts.escapeHTML))
 }
 
 func boolEncoder(e *encodeState, v reflect.Value, opts encOpts) {
-	if opts.quoted {
-		e.WriteByte('"')
-	}
-	if v.Bool() {
-		e.WriteString("true")
-	} else {
-		e.WriteString("false")
-	}
-	if opts.quoted {
-		e.WriteByte('"')
-	}
+	b := e.AvailableBuffer()
+	b = mayAppendQuote(b, opts.quoted)
+	b = strconv.AppendBool(b, v.Bool())
+	b = mayAppendQuote(b, opts.quoted)
+	e.Write(b)
 }
 
 func intEncoder(e *encodeState, v reflect.Value, opts encOpts) {
-	b := strconv.AppendInt(e.scratch[:0], v.Int(), 10)
-	if opts.quoted {
-		e.WriteByte('"')
-	}
+	b := e.AvailableBuffer()
+	b = mayAppendQuote(b, opts.quoted)
+	b = strconv.AppendInt(b, v.Int(), 10)
+	b = mayAppendQuote(b, opts.quoted)
 	e.Write(b)
-	if opts.quoted {
-		e.WriteByte('"')
-	}
 }
 
 func uintEncoder(e *encodeState, v reflect.Value, opts encOpts) {
-	b := strconv.AppendUint(e.scratch[:0], v.Uint(), 10)
-	if opts.quoted {
-		e.WriteByte('"')
-	}
+	b := e.AvailableBuffer()
+	b = mayAppendQuote(b, opts.quoted)
+	b = strconv.AppendUint(b, v.Uint(), 10)
+	b = mayAppendQuote(b, opts.quoted)
 	e.Write(b)
-	if opts.quoted {
-		e.WriteByte('"')
-	}
 }
 
 type floatEncoder int // number of bits
@@ -581,7 +538,8 @@
 	// See golang.org/issue/6384 and golang.org/issue/14135.
 	// Like fmt %g, but the exponent cutoffs are different
 	// and exponents themselves are not padded to two digits.
-	b := e.scratch[:0]
+	b := e.AvailableBuffer()
+	b = mayAppendQuote(b, opts.quoted)
 	abs := math.Abs(f)
 	fmt := byte('f')
 	// Note: Must use float32 comparisons for underlying float32 value to get precise cutoffs right.
@@ -599,14 +557,8 @@
 			b = b[:n-1]
 		}
 	}
-
-	if opts.quoted {
-		e.WriteByte('"')
-	}
+	b = mayAppendQuote(b, opts.quoted)
 	e.Write(b)
-	if opts.quoted {
-		e.WriteByte('"')
-	}
 }
 
 var (
@@ -625,24 +577,18 @@
 		if !isValidNumber(numStr) {
 			e.error(fmt.Errorf("json: invalid number literal %q", numStr))
 		}
-		if opts.quoted {
-			e.WriteByte('"')
-		}
-		e.WriteString(numStr)
-		if opts.quoted {
-			e.WriteByte('"')
-		}
+		b := e.AvailableBuffer()
+		b = mayAppendQuote(b, opts.quoted)
+		b = append(b, numStr...)
+		b = mayAppendQuote(b, opts.quoted)
+		e.Write(b)
 		return
 	}
 	if opts.quoted {
-		e2 := newEncodeState()
-		// Since we encode the string twice, we only need to escape HTML
-		// the first time.
-		e2.string(v.String(), opts.escapeHTML)
-		e.stringBytes(e2.Bytes(), false)
-		encodeStatePool.Put(e2)
+		b := appendString(nil, v.String(), opts.escapeHTML)
+		e.Write(appendString(e.AvailableBuffer(), b, false)) // no need to escape again since it is already escaped
 	} else {
-		e.string(v.String(), opts.escapeHTML)
+		e.Write(appendString(e.AvailableBuffer(), v.String(), opts.escapeHTML))
 	}
 }
 
@@ -723,8 +669,9 @@
 }
 
 type structFields struct {
-	list      []field
-	nameIndex map[string]int
+	list         []field
+	byExactName  map[string]*field
+	byFoldedName map[string]*field
 }
 
 func (se structEncoder) encode(e *encodeState, v reflect.Value, opts encOpts) {
@@ -807,7 +754,7 @@
 		if i > 0 {
 			e.WriteByte(',')
 		}
-		e.string(kv.ks, opts.escapeHTML)
+		e.Write(appendString(e.AvailableBuffer(), kv.ks, opts.escapeHTML))
 		e.WriteByte(':')
 		me.elemEnc(e, kv.v, opts)
 	}
@@ -835,28 +782,16 @@
 		return
 	}
 	s := v.Bytes()
-	e.WriteByte('"')
 	encodedLen := base64.StdEncoding.EncodedLen(len(s))
-	if encodedLen <= len(e.scratch) {
-		// If the encoded bytes fit in e.scratch, avoid an extra
-		// allocation and use the cheaper Encoding.Encode.
-		dst := e.scratch[:encodedLen]
-		base64.StdEncoding.Encode(dst, s)
-		e.Write(dst)
-	} else if encodedLen <= 1024 {
-		// The encoded bytes are short enough to allocate for, and
-		// Encoding.Encode is still cheaper.
-		dst := make([]byte, encodedLen)
-		base64.StdEncoding.Encode(dst, s)
-		e.Write(dst)
-	} else {
-		// The encoded bytes are too long to cheaply allocate, and
-		// Encoding.Encode is no longer noticeably cheaper.
-		enc := base64.NewEncoder(base64.StdEncoding, e)
-		enc.Write(s)
-		enc.Close()
-	}
-	e.WriteByte('"')
+	e.Grow(len(`"`) + encodedLen + len(`"`))
+
+	// TODO(https://go.dev/issue/53693): Use base64.Encoding.AppendEncode.
+	b := e.AvailableBuffer()
+	b = append(b, '"')
+	base64.StdEncoding.Encode(b[len(b):][:encodedLen], s)
+	b = b[:len(b)+encodedLen]
+	b = append(b, '"')
+	e.Write(b)
 }
 
 // sliceEncoder just wraps an arrayEncoder, checking to make sure the value isn't nil.
@@ -1025,49 +960,49 @@
 	panic("unexpected map key type")
 }
 
-// NOTE: keep in sync with stringBytes below.
-func (e *encodeState) string(s string, escapeHTML bool) {
-	e.WriteByte('"')
+func appendString[Bytes []byte | string](dst []byte, src Bytes, escapeHTML bool) []byte {
+	dst = append(dst, '"')
 	start := 0
-	for i := 0; i < len(s); {
-		if b := s[i]; b < utf8.RuneSelf {
+	for i := 0; i < len(src); {
+		if b := src[i]; b < utf8.RuneSelf {
 			if htmlSafeSet[b] || (!escapeHTML && safeSet[b]) {
 				i++
 				continue
 			}
-			if start < i {
-				e.WriteString(s[start:i])
-			}
-			e.WriteByte('\\')
+			dst = append(dst, src[start:i]...)
 			switch b {
 			case '\\', '"':
-				e.WriteByte(b)
+				dst = append(dst, '\\', b)
 			case '\n':
-				e.WriteByte('n')
+				dst = append(dst, '\\', 'n')
 			case '\r':
-				e.WriteByte('r')
+				dst = append(dst, '\\', 'r')
 			case '\t':
-				e.WriteByte('t')
+				dst = append(dst, '\\', 't')
 			default:
 				// This encodes bytes < 0x20 except for \t, \n and \r.
 				// If escapeHTML is set, it also escapes <, >, and &
 				// 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])
+				dst = append(dst, '\\', 'u', '0', '0', hex[b>>4], hex[b&0xF])
 			}
 			i++
 			start = i
 			continue
 		}
-		c, size := utf8.DecodeRuneInString(s[i:])
+		// TODO(https://go.dev/issue/56948): Use generic utf8 functionality.
+		// For now, cast only a small portion of byte slices to a string
+		// so that it can be stack allocated. This slows down []byte slightly
+		// due to the extra copy, but keeps string performance roughly the same.
+		n := len(src) - i
+		if n > utf8.UTFMax {
+			n = utf8.UTFMax
+		}
+		c, size := utf8.DecodeRuneInString(string(src[i : i+n]))
 		if c == utf8.RuneError && size == 1 {
-			if start < i {
-				e.WriteString(s[start:i])
-			}
-			e.WriteString(`\ufffd`)
+			dst = append(dst, src[start:i]...)
+			dst = append(dst, `\ufffd`...)
 			i += size
 			start = i
 			continue
@@ -1080,100 +1015,23 @@
 		// 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])
+			dst = append(dst, src[start:i]...)
+			dst = append(dst, '\\', 'u', '2', '0', '2', hex[c&0xF])
 			i += size
 			start = i
 			continue
 		}
 		i += size
 	}
-	if start < len(s) {
-		e.WriteString(s[start:])
-	}
-	e.WriteByte('"')
-}
-
-// NOTE: keep in sync with string above.
-func (e *encodeState) stringBytes(s []byte, escapeHTML bool) {
-	e.WriteByte('"')
-	start := 0
-	for i := 0; i < len(s); {
-		if b := s[i]; b < utf8.RuneSelf {
-			if htmlSafeSet[b] || (!escapeHTML && safeSet[b]) {
-				i++
-				continue
-			}
-			if start < i {
-				e.Write(s[start:i])
-			}
-			e.WriteByte('\\')
-			switch b {
-			case '\\', '"':
-				e.WriteByte(b)
-			case '\n':
-				e.WriteByte('n')
-			case '\r':
-				e.WriteByte('r')
-			case '\t':
-				e.WriteByte('t')
-			default:
-				// This encodes bytes < 0x20 except for \t, \n and \r.
-				// If escapeHTML is set, it also escapes <, >, and &
-				// 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('"')
+	dst = append(dst, src[start:]...)
+	dst = append(dst, '"')
+	return dst
 }
 
 // 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
+	nameBytes []byte // []byte(name)
 
 	nameNonEsc  string // `"` + name + `":`
 	nameEscHTML string // `"` + HTMLEscape(name) + `":`
@@ -1223,8 +1081,8 @@
 	// Fields found.
 	var fields []field
 
-	// Buffer to run HTMLEscape on field names.
-	var nameEscBuf bytes.Buffer
+	// Buffer to run appendHTMLEscape on field names.
+	var nameEscBuf []byte
 
 	for len(next) > 0 {
 		current, next = next, current[:0]
@@ -1300,14 +1158,10 @@
 						quoted:    quoted,
 					}
 					field.nameBytes = []byte(field.name)
-					field.equalFold = foldFunc(field.nameBytes)
 
 					// Build nameEscHTML and nameNonEsc ahead of time.
-					nameEscBuf.Reset()
-					nameEscBuf.WriteString(`"`)
-					HTMLEscape(&nameEscBuf, field.nameBytes)
-					nameEscBuf.WriteString(`":`)
-					field.nameEscHTML = nameEscBuf.String()
+					nameEscBuf = appendHTMLEscape(nameEscBuf[:0], field.nameBytes)
+					field.nameEscHTML = `"` + string(nameEscBuf) + `":`
 					field.nameNonEsc = `"` + field.name + `":`
 
 					fields = append(fields, field)
@@ -1382,11 +1236,16 @@
 		f := &fields[i]
 		f.encoder = typeEncoder(typeByIndex(t, f.index))
 	}
-	nameIndex := make(map[string]int, len(fields))
+	exactNameIndex := make(map[string]*field, len(fields))
+	foldedNameIndex := make(map[string]*field, len(fields))
 	for i, field := range fields {
-		nameIndex[field.name] = i
+		exactNameIndex[field.name] = &fields[i]
+		// For historical reasons, first folded match takes precedence.
+		if _, ok := foldedNameIndex[string(foldName(field.nameBytes))]; !ok {
+			foldedNameIndex[string(foldName(field.nameBytes))] = &fields[i]
+		}
 	}
-	return structFields{fields, nameIndex}
+	return structFields{fields, exactNameIndex, foldedNameIndex}
 }
 
 // dominantField looks through the fields, all of which are known to
@@ -1415,3 +1274,10 @@
 	f, _ := fieldCache.LoadOrStore(t, typeFields(t))
 	return f.(structFields)
 }
+
+func mayAppendQuote(b []byte, quoted bool) []byte {
+	if quoted {
+		b = append(b, '"')
+	}
+	return b
+}
diff --git a/src/encoding/json/encode_test.go b/src/encoding/json/encode_test.go
index c1b9ed2..d027972 100644
--- a/src/encoding/json/encode_test.go
+++ b/src/encoding/json/encode_test.go
@@ -15,7 +15,6 @@
 	"runtime/debug"
 	"strconv"
 	"testing"
-	"unicode"
 )
 
 type Optionals struct {
@@ -701,54 +700,6 @@
 	}
 }
 
-func TestStringBytes(t *testing.T) {
-	t.Parallel()
-	// Test that encodeState.stringBytes and encodeState.string use the same encoding.
-	var r []rune
-	for i := '\u0000'; i <= unicode.MaxRune; i++ {
-		if testing.Short() && i > 1000 {
-			i = unicode.MaxRune
-		}
-		r = append(r, i)
-	}
-	s := string(r) + "\xff\xff\xffhello" // some invalid UTF-8 too
-
-	for _, escapeHTML := range []bool{true, false} {
-		es := &encodeState{}
-		es.string(s, escapeHTML)
-
-		esBytes := &encodeState{}
-		esBytes.stringBytes([]byte(s), escapeHTML)
-
-		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("with escapeHTML=%t, encodings differ at %#q vs %#q",
-				escapeHTML, enc, encBytes)
-		}
-	}
-}
-
 func TestIssue10281(t *testing.T) {
 	type Foo struct {
 		N Number
diff --git a/src/encoding/json/fold.go b/src/encoding/json/fold.go
index 0f9b09d..c4c671b 100644
--- a/src/encoding/json/fold.go
+++ b/src/encoding/json/fold.go
@@ -5,137 +5,44 @@
 package json
 
 import (
-	"bytes"
+	"unicode"
 	"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
+// foldName returns a folded string such that foldName(x) == foldName(y)
+// is identical to bytes.EqualFold(x, y).
+func foldName(in []byte) []byte {
+	// This is inlinable to take advantage of "function outlining".
+	var arr [32]byte // large enough for most JSON names
+	return appendFoldedName(arr[:0], in)
 }
 
-// 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
-				}
+func appendFoldedName(out, in []byte) []byte {
+	for i := 0; i < len(in); {
+		// Handle single-byte ASCII.
+		if c := in[i]; c < utf8.RuneSelf {
+			if 'a' <= c && c <= 'z' {
+				c -= 'a' - 'A'
 			}
-			t = t[1:]
+			out = append(out, c)
+			i++
 			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:]
-
+		// Handle multi-byte Unicode.
+		r, n := utf8.DecodeRune(in[i:])
+		out = utf8.AppendRune(out, foldRune(r))
+		i += n
 	}
-	return len(t) == 0
+	return out
 }
 
-// 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
+// foldRune is returns the smallest rune for all runes in the same fold set.
+func foldRune(r rune) rune {
+	for {
+		r2 := unicode.SimpleFold(r)
+		if r2 <= r {
+			return r2
 		}
-		if ('a' <= sb && sb <= 'z') || ('A' <= sb && sb <= 'Z') {
-			if sb&caseMask != tb&caseMask {
-				return false
-			}
-		} else {
-			return false
-		}
+		r = r2
 	}
-	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/src/encoding/json/fold_test.go b/src/encoding/json/fold_test.go
index 4daa359..9d6fd05 100644
--- a/src/encoding/json/fold_test.go
+++ b/src/encoding/json/fold_test.go
@@ -6,105 +6,45 @@
 
 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)
+func FuzzEqualFold(f *testing.F) {
+	for _, ss := range [][2]string{
+		{"", ""},
+		{"123abc", "123ABC"},
+		{"αβδ", "ΑΒΔ"},
+		{"abc", "xyz"},
+		{"abc", "XYZ"},
+		{"1", "2"},
+		{"hello, world!", "hello, world!"},
+		{"hello, world!", "Hello, World!"},
+		{"hello, world!", "HELLO, WORLD!"},
+		{"hello, world!", "jello, world!"},
+		{"γειά, κόσμε!", "γειά, κόσμε!"},
+		{"γειά, κόσμε!", "Γειά, Κόσμε!"},
+		{"γειά, κόσμε!", "ΓΕΙΆ, ΚΌΣΜΕ!"},
+		{"γειά, κόσμε!", "ΛΕΙΆ, ΚΌΣΜΕ!"},
+		{"AESKey", "aesKey"},
+		{"AESKEY", "aes_key"},
+		{"aes_key", "AES_KEY"},
+		{"AES_KEY", "aes-key"},
+		{"aes-key", "AES-KEY"},
+		{"AES-KEY", "aesKey"},
+		{"aesKey", "AesKey"},
+		{"AesKey", "AESKey"},
+		{"AESKey", "aeskey"},
+		{"DESKey", "aeskey"},
+		{"AES Key", "aeskey"},
+	} {
+		f.Add([]byte(ss[0]), []byte(ss[1]))
+	}
+	equalFold := func(x, y []byte) bool { return string(foldName(x)) == string(foldName(y)) }
+	f.Fuzz(func(t *testing.T, x, y []byte) {
+		got := equalFold(x, y)
+		want := bytes.EqualFold(x, y)
+		if got != want {
+			t.Errorf("equalFold(%q, %q) = %v, want %v", x, y, got, 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) {
-	var buf1, buf2 []byte
-	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(utf8.AppendRune(append(buf1[:0], 'x'), r), 'x')
-				buf2 = append(utf8.AppendRune(append(buf2[:0], 'x'), r2), '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/src/encoding/json/fuzz.go b/src/encoding/json/fuzz.go
deleted file mode 100644
index b8f4ff2..0000000
--- a/src/encoding/json/fuzz.go
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2019 The Go 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:build gofuzz
-
-package json
-
-import (
-	"fmt"
-)
-
-func Fuzz(data []byte) (score int) {
-	for _, ctor := range []func() any{
-		func() any { return new(any) },
-		func() any { return new(map[string]any) },
-		func() any { return new([]any) },
-	} {
-		v := ctor()
-		err := Unmarshal(data, v)
-		if err != nil {
-			continue
-		}
-		score = 1
-
-		m, err := Marshal(v)
-		if err != nil {
-			fmt.Printf("v=%#v\n", v)
-			panic(err)
-		}
-
-		u := ctor()
-		err = Unmarshal(m, u)
-		if err != nil {
-			fmt.Printf("v=%#v\n", v)
-			fmt.Printf("m=%s\n", m)
-			panic(err)
-		}
-	}
-
-	return
-}
diff --git a/src/encoding/json/indent.go b/src/encoding/json/indent.go
index 2924d3b..26bb5d2 100644
--- a/src/encoding/json/indent.go
+++ b/src/encoding/json/indent.go
@@ -4,69 +4,98 @@
 
 package json
 
-import (
-	"bytes"
-)
+import "bytes"
+
+// 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) {
+	dst.Grow(len(src))
+	dst.Write(appendHTMLEscape(dst.AvailableBuffer(), src))
+}
+
+func appendHTMLEscape(dst, src []byte) []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 == '&' {
+			dst = append(dst, src[start:i]...)
+			dst = append(dst, '\\', 'u', '0', '0', hex[c>>4], 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 {
+			dst = append(dst, src[start:i]...)
+			dst = append(dst, '\\', 'u', '2', '0', '2', hex[src[i+2]&0xF])
+			start = i + len("\u2029")
+		}
+	}
+	return append(dst, src[start:]...)
+}
 
 // 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)
+	dst.Grow(len(src))
+	b := dst.AvailableBuffer()
+	b, err := appendCompact(b, src, false)
+	dst.Write(b)
+	return err
 }
 
-func compact(dst *bytes.Buffer, src []byte, escape bool) error {
-	origLen := dst.Len()
+func appendCompact(dst, src []byte, escape bool) ([]byte, error) {
+	origLen := len(dst)
 	scan := newScanner()
 	defer freeScanner(scan)
 	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])
+			dst = append(dst, src[start:i]...)
+			dst = append(dst, '\\', 'u', '0', '0', hex[c>>4], hex[c&0xF])
 			start = i + 1
 		}
 		// Convert U+2028 and U+2029 (E2 80 A8 and E2 80 A9).
 		if escape && 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
+			dst = append(dst, src[start:i]...)
+			dst = append(dst, '\\', 'u', '2', '0', '2', hex[src[i+2]&0xF])
+			start = i + len("\u2029")
 		}
 		v := scan.step(scan, c)
 		if v >= scanSkipSpace {
 			if v == scanError {
 				break
 			}
-			if start < i {
-				dst.Write(src[start:i])
-			}
+			dst = append(dst, src[start:i]...)
 			start = i + 1
 		}
 	}
 	if scan.eof() == scanError {
-		dst.Truncate(origLen)
-		return scan.err
+		return dst[:origLen], scan.err
 	}
-	if start < len(src) {
-		dst.Write(src[start:])
-	}
-	return nil
+	dst = append(dst, src[start:]...)
+	return dst, nil
 }
 
-func newline(dst *bytes.Buffer, prefix, indent string, depth int) {
-	dst.WriteByte('\n')
-	dst.WriteString(prefix)
+func appendNewline(dst []byte, prefix, indent string, depth int) []byte {
+	dst = append(dst, '\n')
+	dst = append(dst, prefix...)
 	for i := 0; i < depth; i++ {
-		dst.WriteString(indent)
+		dst = append(dst, indent...)
 	}
+	return dst
 }
 
+// indentGrowthFactor specifies the growth factor of indenting JSON input.
+// Empirically, the growth factor was measured to be between 1.4x to 1.8x
+// for some set of compacted JSON with the indent being a single tab.
+// Specify a growth factor slightly larger than what is observed
+// to reduce probability of allocation in appendIndent.
+// A factor no higher than 2 ensures that wasted space never exceeds 50%.
+const indentGrowthFactor = 2
+
 // 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
@@ -79,7 +108,15 @@
 // For example, if src has no trailing spaces, neither will dst;
 // if src ends in a trailing newline, so will dst.
 func Indent(dst *bytes.Buffer, src []byte, prefix, indent string) error {
-	origLen := dst.Len()
+	dst.Grow(indentGrowthFactor * len(src))
+	b := dst.AvailableBuffer()
+	b, err := appendIndent(b, src, prefix, indent)
+	dst.Write(b)
+	return err
+}
+
+func appendIndent(dst, src []byte, prefix, indent string) ([]byte, error) {
+	origLen := len(dst)
 	scan := newScanner()
 	defer freeScanner(scan)
 	needIndent := false
@@ -96,13 +133,13 @@
 		if needIndent && v != scanEndObject && v != scanEndArray {
 			needIndent = false
 			depth++
-			newline(dst, prefix, indent, depth)
+			dst = appendNewline(dst, prefix, indent, depth)
 		}
 
 		// Emit semantically uninteresting bytes
 		// (in particular, punctuation in strings) unmodified.
 		if v == scanContinue {
-			dst.WriteByte(c)
+			dst = append(dst, c)
 			continue
 		}
 
@@ -111,33 +148,27 @@
 		case '{', '[':
 			// delay indent so that empty object and array are formatted as {} and [].
 			needIndent = true
-			dst.WriteByte(c)
-
+			dst = append(dst, c)
 		case ',':
-			dst.WriteByte(c)
-			newline(dst, prefix, indent, depth)
-
+			dst = append(dst, c)
+			dst = appendNewline(dst, prefix, indent, depth)
 		case ':':
-			dst.WriteByte(c)
-			dst.WriteByte(' ')
-
+			dst = append(dst, c, ' ')
 		case '}', ']':
 			if needIndent {
 				// suppress indent in empty object/array
 				needIndent = false
 			} else {
 				depth--
-				newline(dst, prefix, indent, depth)
+				dst = appendNewline(dst, prefix, indent, depth)
 			}
-			dst.WriteByte(c)
-
+			dst = append(dst, c)
 		default:
-			dst.WriteByte(c)
+			dst = append(dst, c)
 		}
 	}
 	if scan.eof() == scanError {
-		dst.Truncate(origLen)
-		return scan.err
+		return dst[:origLen], scan.err
 	}
-	return nil
+	return dst, nil
 }
diff --git a/src/encoding/json/stream.go b/src/encoding/json/stream.go
index 1442ef2..b4146a3 100644
--- a/src/encoding/json/stream.go
+++ b/src/encoding/json/stream.go
@@ -183,7 +183,7 @@
 	err        error
 	escapeHTML bool
 
-	indentBuf    *bytes.Buffer
+	indentBuf    []byte
 	indentPrefix string
 	indentValue  string
 }
@@ -221,15 +221,11 @@
 
 	b := e.Bytes()
 	if enc.indentPrefix != "" || enc.indentValue != "" {
-		if enc.indentBuf == nil {
-			enc.indentBuf = new(bytes.Buffer)
-		}
-		enc.indentBuf.Reset()
-		err = Indent(enc.indentBuf, b, enc.indentPrefix, enc.indentValue)
+		enc.indentBuf, err = appendIndent(enc.indentBuf[:0], b, enc.indentPrefix, enc.indentValue)
 		if err != nil {
 			return err
 		}
-		b = enc.indentBuf.Bytes()
+		b = enc.indentBuf
 	}
 	if _, err = enc.w.Write(b); err != nil {
 		enc.err = err
diff --git a/src/encoding/xml/marshal.go b/src/encoding/xml/marshal.go
index 07b6042..ae39846 100644
--- a/src/encoding/xml/marshal.go
+++ b/src/encoding/xml/marshal.go
@@ -543,6 +543,12 @@
 		}
 	}
 
+	// If a empty name was found, namespace is overridden with an empty space
+	if tinfo.xmlname != nil && start.Name.Space == "" &&
+		tinfo.xmlname.xmlns == "" && tinfo.xmlname.name == "" &&
+		len(p.tags) != 0 && p.tags[len(p.tags)-1].Space != "" {
+		start.Attr = append(start.Attr, Attr{Name{"", xmlnsPrefix}, ""})
+	}
 	if err := p.writeStart(&start); err != nil {
 		return err
 	}
diff --git a/src/encoding/xml/read.go b/src/encoding/xml/read.go
index 43be08e..c1c843e 100644
--- a/src/encoding/xml/read.go
+++ b/src/encoding/xml/read.go
@@ -284,7 +284,8 @@
 		// Slice of element values.
 		// Grow slice.
 		n := val.Len()
-		val.Set(reflect.Append(val, reflect.Zero(val.Type().Elem())))
+		val.Grow(1)
+		val.SetLen(n + 1)
 
 		// Recur to read element into slice.
 		if err := d.unmarshalAttr(val.Index(n), attr); err != nil {
@@ -410,7 +411,8 @@
 		// Slice of element values.
 		// Grow slice.
 		n := v.Len()
-		v.Set(reflect.Append(val, reflect.Zero(v.Type().Elem())))
+		v.Grow(1)
+		v.SetLen(n + 1)
 
 		// Recur to read element into slice.
 		if err := d.unmarshal(v.Index(n), start, depth+1); err != nil {
diff --git a/src/encoding/xml/xml.go b/src/encoding/xml/xml.go
index 1f3084e..d121986 100644
--- a/src/encoding/xml/xml.go
+++ b/src/encoding/xml/xml.go
@@ -262,6 +262,9 @@
 // or EOF before all expected end elements,
 // it will return an error.
 //
+// If CharsetReader is called and returns an error,
+// the error is wrapped and returned.
+//
 // Token implements XML name spaces as described by
 // https://www.w3.org/TR/REC-xml-names/. Each of the
 // Name structures contained in the Token has the Space
@@ -634,7 +637,7 @@
 				}
 				newr, err := d.CharsetReader(enc, d.r.(io.Reader))
 				if err != nil {
-					d.err = fmt.Errorf("xml: opening charset %q: %v", enc, err)
+					d.err = fmt.Errorf("xml: opening charset %q: %w", enc, err)
 					return nil, d.err
 				}
 				if newr == nil {
diff --git a/src/encoding/xml/xml_test.go b/src/encoding/xml/xml_test.go
index 30fb94d..42f5f5f 100644
--- a/src/encoding/xml/xml_test.go
+++ b/src/encoding/xml/xml_test.go
@@ -1059,6 +1059,61 @@
 	}
 }
 
+func TestIssue7113(t *testing.T) {
+	type C struct {
+		XMLName Name `xml:""` // Sets empty namespace
+	}
+
+	type D struct {
+		XMLName Name `xml:"d"`
+	}
+
+	type A struct {
+		XMLName Name `xml:""`
+		C       C    `xml:""`
+		D       D
+	}
+
+	var a A
+	structSpace := "b"
+	xmlTest := `<A xmlns="` + structSpace + `"><C xmlns=""></C><d></d></A>`
+	t.Log(xmlTest)
+	err := Unmarshal([]byte(xmlTest), &a)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	if a.XMLName.Space != structSpace {
+		t.Errorf("overidding with empty namespace: unmarshalling, got %s, want %s\n", a.XMLName.Space, structSpace)
+	}
+	if len(a.C.XMLName.Space) != 0 {
+		t.Fatalf("overidding with empty namespace: unmarshalling, got %s, want empty\n", a.C.XMLName.Space)
+	}
+
+	var b []byte
+	b, err = Marshal(&a)
+	if err != nil {
+		t.Fatal(err)
+	}
+	if len(a.C.XMLName.Space) != 0 {
+		t.Errorf("overidding with empty namespace: marshaling, got %s in C tag which should be empty\n", a.C.XMLName.Space)
+	}
+	if string(b) != xmlTest {
+		t.Fatalf("overidding with empty namespace: marshalling, got %s, want %s\n", b, xmlTest)
+	}
+	var c A
+	err = Unmarshal(b, &c)
+	if err != nil {
+		t.Fatalf("second Unmarshal failed: %s", err)
+	}
+	if c.XMLName.Space != "b" {
+		t.Errorf("overidding with empty namespace: after marshaling & unmarshaling, XML name space: got %s, want %s\n", a.XMLName.Space, structSpace)
+	}
+	if len(c.C.XMLName.Space) != 0 {
+		t.Errorf("overidding with empty namespace: after marshaling & unmarshaling, got %s, want empty\n", a.C.XMLName.Space)
+	}
+}
+
 func TestIssue20396(t *testing.T) {
 
 	var attrError = UnmarshalError("XML syntax error on line 1: expected attribute name in element")
@@ -1309,8 +1364,9 @@
 			}
 			continue
 		}
-		if err == nil || err == io.EOF {
-			t.Errorf("parse %s: have no error, expected a non-nil error", test.src)
+		// Inv: err != nil
+		if err == io.EOF {
+			t.Errorf("parse %s: unexpected EOF", test.src)
 			continue
 		}
 		if !strings.Contains(err.Error(), test.err) {
diff --git a/src/errors/errors.go b/src/errors/errors.go
index 8436f81..4139777 100644
--- a/src/errors/errors.go
+++ b/src/errors/errors.go
@@ -4,7 +4,7 @@
 
 // Package errors implements functions to manipulate errors.
 //
-// The New function creates errors whose only content is a text message.
+// The [New] function creates errors whose only content is a text message.
 //
 // An error e wraps another error if e's type has one of the methods
 //
@@ -16,12 +16,12 @@
 // indicates that e does not wrap any error. It is invalid for an
 // Unwrap method to return an []error containing a nil error value.
 //
-// An easy way to create wrapped errors is to call fmt.Errorf and apply
+// An easy way to create wrapped errors is to call [fmt.Errorf] and apply
 // the %w verb to the error argument:
 //
 //	wrapsErr := fmt.Errorf("... %w ...", ..., err, ...)
 //
-// Successive unwrapping of an error creates a tree. The Is and As
+// Successive unwrapping of an error creates a tree. The [Is] and [As]
 // functions inspect an error's tree by examining first the error
 // itself followed by the tree of each of its children in turn
 // (pre-order, depth-first traversal).
@@ -36,7 +36,7 @@
 //
 //	if err == fs.ErrExist
 //
-// because the former will succeed if err wraps fs.ErrExist.
+// because the former will succeed if err wraps [io/fs.ErrExist].
 //
 // As examines the tree of its first argument looking for an error that can be
 // assigned to its second argument, which must be a pointer. If it succeeds, it
@@ -53,7 +53,7 @@
 //		fmt.Println(perr.Path)
 //	}
 //
-// because the former will succeed if err wraps an *fs.PathError.
+// because the former will succeed if err wraps an [*io/fs.PathError].
 package errors
 
 // New returns an error that formats as the given text.
@@ -70,3 +70,18 @@
 func (e *errorString) Error() string {
 	return e.s
 }
+
+// ErrUnsupported indicates that a requested operation cannot be performed,
+// because it is unsupported. For example, a call to [os.Link] when using a
+// file system that does not support hard links.
+//
+// Functions and methods should not return this error but should instead
+// return an error including appropriate context that satisfies
+//
+//	errors.Is(err, errors.ErrUnsupported)
+//
+// either by directly wrapping ErrUnsupported or by implementing an Is method.
+//
+// Functions and methods should document the cases in which an error
+// wrapping this will be returned.
+var ErrUnsupported = New("unsupported operation")
diff --git a/src/errors/errors_test.go b/src/errors/errors_test.go
index 8b93f53..08ed54e 100644
--- a/src/errors/errors_test.go
+++ b/src/errors/errors_test.go
@@ -6,7 +6,6 @@
 
 import (
 	"errors"
-	"fmt"
 	"testing"
 )
 
@@ -32,40 +31,3 @@
 		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
-}
-
-func ExampleJoin() {
-	err1 := errors.New("err1")
-	err2 := errors.New("err2")
-	err := errors.Join(err1, err2)
-	fmt.Println(err)
-	if errors.Is(err, err1) {
-		fmt.Println("err is err1")
-	}
-	if errors.Is(err, err2) {
-		fmt.Println("err is err2")
-	}
-	// Output:
-	// err1
-	// err2
-	// err is err1
-	// err is err2
-}
diff --git a/src/errors/example_test.go b/src/errors/example_test.go
index 5dc8841..beb5edc 100644
--- a/src/errors/example_test.go
+++ b/src/errors/example_test.go
@@ -5,7 +5,10 @@
 package errors_test
 
 import (
+	"errors"
 	"fmt"
+	"io/fs"
+	"os"
 	"time"
 )
 
@@ -32,3 +35,77 @@
 	}
 	// Output: 1989-03-15 22:30:00 +0000 UTC: the file system has gone away
 }
+
+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
+}
+
+func ExampleJoin() {
+	err1 := errors.New("err1")
+	err2 := errors.New("err2")
+	err := errors.Join(err1, err2)
+	fmt.Println(err)
+	if errors.Is(err, err1) {
+		fmt.Println("err is err1")
+	}
+	if errors.Is(err, err2) {
+		fmt.Println("err is err2")
+	}
+	// Output:
+	// err1
+	// err2
+	// err is err1
+	// err is err2
+}
+
+func ExampleIs() {
+	if _, err := os.Open("non-existing"); err != nil {
+		if errors.Is(err, fs.ErrNotExist) {
+			fmt.Println("file does not exist")
+		} else {
+			fmt.Println(err)
+		}
+	}
+
+	// Output:
+	// file does not exist
+}
+
+func ExampleAs() {
+	if _, err := os.Open("non-existing"); err != nil {
+		var pathError *fs.PathError
+		if errors.As(err, &pathError) {
+			fmt.Println("Failed at path:", pathError.Path)
+		} else {
+			fmt.Println(err)
+		}
+	}
+
+	// Output:
+	// Failed at path: non-existing
+}
+
+func ExampleUnwrap() {
+	err1 := errors.New("error1")
+	err2 := fmt.Errorf("error2: [%w]", err1)
+	fmt.Println(err2)
+	fmt.Println(errors.Unwrap(err2))
+	// Output
+	// error2: [error1]
+	// error1
+}
diff --git a/src/errors/join.go b/src/errors/join.go
index dc5a716..1c486d5 100644
--- a/src/errors/join.go
+++ b/src/errors/join.go
@@ -6,10 +6,12 @@
 
 // Join returns an error that wraps the given errors.
 // Any nil error values are discarded.
-// Join returns nil if errs contains no non-nil values.
+// Join returns nil if every value in errs is nil.
 // The error formats as the concatenation of the strings obtained
 // by calling the Error method of each element of errs, with a newline
 // between each string.
+//
+// A non-nil error returned by Join implements the Unwrap() []error method.
 func Join(errs ...error) error {
 	n := 0
 	for _, err := range errs {
diff --git a/src/errors/wrap.go b/src/errors/wrap.go
index a719655..2c934ee 100644
--- a/src/errors/wrap.go
+++ b/src/errors/wrap.go
@@ -12,7 +12,8 @@
 // type contains an Unwrap method returning error.
 // Otherwise, Unwrap returns nil.
 //
-// Unwrap returns nil if the Unwrap method returns []error.
+// Unwrap only calls a method of the form "Unwrap() error".
+// In particular Unwrap does not unwrap errors returned by [Join].
 func Unwrap(err error) error {
 	u, ok := err.(interface {
 		Unwrap() error
@@ -37,7 +38,7 @@
 //
 //	func (m MyError) Is(target error) bool { return target == fs.ErrExist }
 //
-// then Is(MyError{}, fs.ErrExist) returns true. See syscall.Errno.Is for
+// then Is(MyError{}, fs.ErrExist) returns true. See [syscall.Errno.Is] for
 // an example in the standard library. An Is method should only shallowly
 // compare err and the target and not call Unwrap on either.
 func Is(err, target error) bool {
diff --git a/src/errors/wrap_test.go b/src/errors/wrap_test.go
index 9efbe45..ca9dc0f 100644
--- a/src/errors/wrap_test.go
+++ b/src/errors/wrap_test.go
@@ -288,40 +288,3 @@
 	_, ok := target.(errorUncomparable)
 	return ok
 }
-
-func ExampleIs() {
-	if _, err := os.Open("non-existing"); err != nil {
-		if errors.Is(err, fs.ErrNotExist) {
-			fmt.Println("file does not exist")
-		} else {
-			fmt.Println(err)
-		}
-	}
-
-	// Output:
-	// file does not exist
-}
-
-func ExampleAs() {
-	if _, err := os.Open("non-existing"); err != nil {
-		var pathError *fs.PathError
-		if errors.As(err, &pathError) {
-			fmt.Println("Failed at path:", pathError.Path)
-		} else {
-			fmt.Println(err)
-		}
-	}
-
-	// Output:
-	// Failed at path: non-existing
-}
-
-func ExampleUnwrap() {
-	err1 := errors.New("error1")
-	err2 := fmt.Errorf("error2: [%w]", err1)
-	fmt.Println(err2)
-	fmt.Println(errors.Unwrap(err2))
-	// Output
-	// error2: [error1]
-	// error1
-}
diff --git a/src/flag/example_func_test.go b/src/flag/example_func_test.go
index 7c30c5e..ac9f985 100644
--- a/src/flag/example_func_test.go
+++ b/src/flag/example_func_test.go
@@ -39,3 +39,19 @@
 	//     	IP address to parse
 	// {ip: <nil>, loopback: false}
 }
+
+func ExampleBoolFunc() {
+	fs := flag.NewFlagSet("ExampleBoolFunc", flag.ContinueOnError)
+	fs.SetOutput(os.Stdout)
+
+	fs.BoolFunc("log", "logs a dummy message", func(s string) error {
+		fmt.Println("dummy message:", s)
+		return nil
+	})
+	fs.Parse([]string{"-log"})
+	fs.Parse([]string{"-log=0"})
+
+	// Output:
+	// dummy message: true
+	// dummy message: 0
+}
diff --git a/src/flag/flag.go b/src/flag/flag.go
index ef3cf29..9d3e8d3 100644
--- a/src/flag/flag.go
+++ b/src/flag/flag.go
@@ -89,6 +89,7 @@
 	"io"
 	"os"
 	"reflect"
+	"runtime"
 	"sort"
 	"strconv"
 	"strings"
@@ -337,6 +338,15 @@
 
 func (f funcValue) String() string { return "" }
 
+// -- boolFunc Value
+type boolFuncValue func(string) error
+
+func (f boolFuncValue) Set(s string) error { return f(s) }
+
+func (f boolFuncValue) String() string { return "" }
+
+func (f boolFuncValue) IsBoolFlag() bool { return true }
+
 // Value is the interface to the dynamic value stored in a flag.
 // (The default value is represented as a string.)
 //
@@ -390,7 +400,8 @@
 	formal        map[string]*Flag
 	args          []string // arguments after flags
 	errorHandling ErrorHandling
-	output        io.Writer // nil means stderr; use Output() accessor
+	output        io.Writer         // nil means stderr; use Output() accessor
+	undef         map[string]string // flags which didn't exist at the time of Set
 }
 
 // A Flag represents the state of a flag.
@@ -481,8 +492,29 @@
 
 // Set sets the value of the named flag.
 func (f *FlagSet) Set(name, value string) error {
+	return f.set(name, value)
+}
+func (f *FlagSet) set(name, value string) error {
 	flag, ok := f.formal[name]
 	if !ok {
+		// Remember that a flag that isn't defined is being set.
+		// We return an error in this case, but in addition if
+		// subsequently that flag is defined, we want to panic
+		// at the definition point.
+		// This is a problem which occurs if both the definition
+		// and the Set call are in init code and for whatever
+		// reason the init code changes evaluation order.
+		// See issue 57411.
+		_, file, line, ok := runtime.Caller(2)
+		if !ok {
+			file = "?"
+			line = 0
+		}
+		if f.undef == nil {
+			f.undef = map[string]string{}
+		}
+		f.undef[name] = fmt.Sprintf("%s:%d", file, line)
+
 		return fmt.Errorf("no such flag -%v", name)
 	}
 	err := flag.Value.Set(value)
@@ -498,7 +530,7 @@
 
 // Set sets the value of the named command-line flag.
 func Set(name, value string) error {
-	return CommandLine.Set(name, value)
+	return CommandLine.set(name, value)
 }
 
 // isZeroValue determines whether the string represents the zero
@@ -955,6 +987,20 @@
 	CommandLine.Func(name, usage, fn)
 }
 
+// BoolFunc defines a flag with the specified name and usage string without requiring values.
+// Each time the flag is seen, fn is called with the value of the flag.
+// If fn returns a non-nil error, it will be treated as a flag value parsing error.
+func (f *FlagSet) BoolFunc(name, usage string, fn func(string) error) {
+	f.Var(boolFuncValue(fn), name, usage)
+}
+
+// BoolFunc defines a flag with the specified name and usage string without requiring values.
+// Each time the flag is seen, fn is called with the value of the flag.
+// If fn returns a non-nil error, it will be treated as a flag value parsing error.
+func BoolFunc(name, usage string, fn func(string) error) {
+	CommandLine.BoolFunc(name, usage, fn)
+}
+
 // 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
@@ -981,6 +1027,9 @@
 		}
 		panic(msg) // Happens only if flags are declared with identical names
 	}
+	if pos := f.undef[name]; pos != "" {
+		panic(fmt.Sprintf("flag %s set at %s before being defined", name, pos))
+	}
 	if f.formal == nil {
 		f.formal = make(map[string]*Flag)
 	}
diff --git a/src/flag/flag_test.go b/src/flag/flag_test.go
index 1755168..57c88f0 100644
--- a/src/flag/flag_test.go
+++ b/src/flag/flag_test.go
@@ -12,6 +12,7 @@
 	"io"
 	"os"
 	"os/exec"
+	"regexp"
 	"runtime"
 	"sort"
 	"strconv"
@@ -38,6 +39,7 @@
 	Float64("test_float64", 0, "float64 value")
 	Duration("test_duration", 0, "time.Duration value")
 	Func("test_func", "func value", func(string) error { return nil })
+	BoolFunc("test_boolfunc", "func", func(string) error { return nil })
 
 	m := make(map[string]*Flag)
 	desired := "0"
@@ -54,6 +56,8 @@
 				ok = true
 			case f.Name == "test_func" && f.Value.String() == "":
 				ok = true
+			case f.Name == "test_boolfunc" && f.Value.String() == "":
+				ok = true
 			}
 			if !ok {
 				t.Error("Visit: bad value", f.Value.String(), "for", f.Name)
@@ -61,7 +65,7 @@
 		}
 	}
 	VisitAll(visitor)
-	if len(m) != 9 {
+	if len(m) != 10 {
 		t.Error("VisitAll misses some flags")
 		for k, v := range m {
 			t.Log(k, *v)
@@ -85,9 +89,10 @@
 	Set("test_float64", "1")
 	Set("test_duration", "1s")
 	Set("test_func", "1")
+	Set("test_boolfunc", "")
 	desired = "1"
 	Visit(visitor)
-	if len(m) != 9 {
+	if len(m) != 10 {
 		t.Error("Visit fails after set")
 		for k, v := range m {
 			t.Log(k, *v)
@@ -722,7 +727,7 @@
 		case nil:
 			t.Errorf("%s\n: expected panic(%q), but did not panic", testName, expected)
 		case string:
-			if msg != expected {
+			if ok, _ := regexp.MatchString(expected, msg); !ok {
 				t.Errorf("%s\n: expected panic(%q), but got panic(%q)", testName, expected, msg)
 			}
 		default:
@@ -797,3 +802,57 @@
 		}
 	}
 }
+
+func TestUserDefinedBoolFunc(t *testing.T) {
+	flags := NewFlagSet("test", ContinueOnError)
+	flags.SetOutput(io.Discard)
+	var ss []string
+	flags.BoolFunc("v", "usage", func(s string) error {
+		ss = append(ss, s)
+		return nil
+	})
+	if err := flags.Parse([]string{"-v", "", "-v", "1", "-v=2"}); err != nil {
+		t.Error(err)
+	}
+	if len(ss) != 1 {
+		t.Fatalf("got %d args; want 1 arg", len(ss))
+	}
+	want := "[true]"
+	if got := fmt.Sprint(ss); got != want {
+		t.Errorf("got %q; want %q", got, want)
+	}
+	// test usage
+	var buf strings.Builder
+	flags.SetOutput(&buf)
+	flags.Parse([]string{"-h"})
+	if usage := buf.String(); !strings.Contains(usage, "usage") {
+		t.Errorf("usage string not included: %q", usage)
+	}
+	// test BoolFunc error
+	flags = NewFlagSet("test", ContinueOnError)
+	flags.SetOutput(io.Discard)
+	flags.BoolFunc("v", "usage", func(s string) error {
+		return fmt.Errorf("test error")
+	})
+	// flag not set, so no error
+	if err := flags.Parse(nil); err != nil {
+		t.Error(err)
+	}
+	// flag set, expect error
+	if err := flags.Parse([]string{"-v", ""}); err == nil {
+		t.Error("got err == nil; want err != nil")
+	} else if errMsg := err.Error(); !strings.Contains(errMsg, "test error") {
+		t.Errorf(`got %q; error should contain "test error"`, errMsg)
+	}
+}
+
+func TestDefineAfterSet(t *testing.T) {
+	flags := NewFlagSet("test", ContinueOnError)
+	// Set by itself doesn't panic.
+	flags.Set("myFlag", "value")
+
+	// Define-after-set panics.
+	mustPanic(t, "DefineAfterSet", "flag myFlag set at .*/flag_test.go:.* before being defined", func() {
+		_ = flags.String("myFlag", "default", "usage")
+	})
+}
diff --git a/src/fmt/fmt_test.go b/src/fmt/fmt_test.go
index 37d82ac..6a79862 100644
--- a/src/fmt/fmt_test.go
+++ b/src/fmt/fmt_test.go
@@ -1238,7 +1238,7 @@
 func BenchmarkSprintfPadding(b *testing.B) {
 	b.RunParallel(func(pb *testing.PB) {
 		for pb.Next() {
-			Sprintf("%16f", 1.0)
+			_ = Sprintf("%16f", 1.0)
 		}
 	})
 }
@@ -1246,7 +1246,7 @@
 func BenchmarkSprintfEmpty(b *testing.B) {
 	b.RunParallel(func(pb *testing.PB) {
 		for pb.Next() {
-			Sprintf("")
+			_ = Sprintf("")
 		}
 	})
 }
@@ -1254,7 +1254,7 @@
 func BenchmarkSprintfString(b *testing.B) {
 	b.RunParallel(func(pb *testing.PB) {
 		for pb.Next() {
-			Sprintf("%s", "hello")
+			_ = Sprintf("%s", "hello")
 		}
 	})
 }
@@ -1262,7 +1262,7 @@
 func BenchmarkSprintfTruncateString(b *testing.B) {
 	b.RunParallel(func(pb *testing.PB) {
 		for pb.Next() {
-			Sprintf("%.3s", "日本語日本語日本語日本語")
+			_ = Sprintf("%.3s", "日本語日本語日本語日本語")
 		}
 	})
 }
@@ -1271,7 +1271,7 @@
 	var bytes any = []byte("日本語日本語日本語日本語")
 	b.RunParallel(func(pb *testing.PB) {
 		for pb.Next() {
-			Sprintf("%.3s", bytes)
+			_ = Sprintf("%.3s", bytes)
 		}
 	})
 }
@@ -1279,7 +1279,7 @@
 func BenchmarkSprintfSlowParsingPath(b *testing.B) {
 	b.RunParallel(func(pb *testing.PB) {
 		for pb.Next() {
-			Sprintf("%.v", nil)
+			_ = Sprintf("%.v", nil)
 		}
 	})
 }
@@ -1287,7 +1287,7 @@
 func BenchmarkSprintfQuoteString(b *testing.B) {
 	b.RunParallel(func(pb *testing.PB) {
 		for pb.Next() {
-			Sprintf("%q", "日本語日本語日本語")
+			_ = Sprintf("%q", "日本語日本語日本語")
 		}
 	})
 }
@@ -1295,7 +1295,7 @@
 func BenchmarkSprintfInt(b *testing.B) {
 	b.RunParallel(func(pb *testing.PB) {
 		for pb.Next() {
-			Sprintf("%d", 5)
+			_ = Sprintf("%d", 5)
 		}
 	})
 }
@@ -1303,7 +1303,7 @@
 func BenchmarkSprintfIntInt(b *testing.B) {
 	b.RunParallel(func(pb *testing.PB) {
 		for pb.Next() {
-			Sprintf("%d %d", 5, 6)
+			_ = Sprintf("%d %d", 5, 6)
 		}
 	})
 }
@@ -1311,7 +1311,7 @@
 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)
+			_ = Sprintf("This is some meaningless prefix text that needs to be scanned %d", 6)
 		}
 	})
 }
@@ -1319,7 +1319,7 @@
 func BenchmarkSprintfFloat(b *testing.B) {
 	b.RunParallel(func(pb *testing.PB) {
 		for pb.Next() {
-			Sprintf("%g", 5.23184)
+			_ = Sprintf("%g", 5.23184)
 		}
 	})
 }
@@ -1327,7 +1327,7 @@
 func BenchmarkSprintfComplex(b *testing.B) {
 	b.RunParallel(func(pb *testing.PB) {
 		for pb.Next() {
-			Sprintf("%f", 5.23184+5.23184i)
+			_ = Sprintf("%f", 5.23184+5.23184i)
 		}
 	})
 }
@@ -1335,7 +1335,7 @@
 func BenchmarkSprintfBoolean(b *testing.B) {
 	b.RunParallel(func(pb *testing.PB) {
 		for pb.Next() {
-			Sprintf("%t", true)
+			_ = Sprintf("%t", true)
 		}
 	})
 }
@@ -1343,7 +1343,7 @@
 func BenchmarkSprintfHexString(b *testing.B) {
 	b.RunParallel(func(pb *testing.PB) {
 		for pb.Next() {
-			Sprintf("% #x", "0123456789abcdef")
+			_ = Sprintf("% #x", "0123456789abcdef")
 		}
 	})
 }
@@ -1352,7 +1352,7 @@
 	data := []byte("0123456789abcdef")
 	b.RunParallel(func(pb *testing.PB) {
 		for pb.Next() {
-			Sprintf("% #x", data)
+			_ = Sprintf("% #x", data)
 		}
 	})
 }
@@ -1361,7 +1361,7 @@
 	data := []byte("0123456789abcdef")
 	b.RunParallel(func(pb *testing.PB) {
 		for pb.Next() {
-			Sprintf("%v", data)
+			_ = Sprintf("%v", data)
 		}
 	})
 }
@@ -1370,7 +1370,7 @@
 	stringer := I(12345)
 	b.RunParallel(func(pb *testing.PB) {
 		for pb.Next() {
-			Sprintf("%v", stringer)
+			_ = Sprintf("%v", stringer)
 		}
 	})
 }
@@ -1379,7 +1379,7 @@
 	s := &[]any{SI{12345}, map[int]string{0: "hello"}}
 	b.RunParallel(func(pb *testing.PB) {
 		for pb.Next() {
-			Sprintf("%#v", s)
+			_ = Sprintf("%#v", s)
 		}
 	})
 }
@@ -1428,14 +1428,14 @@
 	desc  string
 	fn    func()
 }{
-	{0, `Sprintf("")`, func() { Sprintf("") }},
-	{1, `Sprintf("xxx")`, func() { Sprintf("xxx") }},
-	{0, `Sprintf("%x")`, func() { Sprintf("%x", 7) }},
-	{1, `Sprintf("%x")`, func() { Sprintf("%x", 1<<16) }},
-	{3, `Sprintf("%80000s")`, func() { Sprintf("%80000s", "hello") }}, // large buffer (>64KB)
-	{1, `Sprintf("%s")`, func() { Sprintf("%s", "hello") }},
-	{1, `Sprintf("%x %x")`, func() { Sprintf("%x %x", 7, 112) }},
-	{1, `Sprintf("%g")`, func() { Sprintf("%g", float32(3.14159)) }},
+	{0, `Sprintf("")`, func() { _ = Sprintf("") }},
+	{1, `Sprintf("xxx")`, func() { _ = Sprintf("xxx") }},
+	{0, `Sprintf("%x")`, func() { _ = Sprintf("%x", 7) }},
+	{1, `Sprintf("%x")`, func() { _ = Sprintf("%x", 1<<16) }},
+	{3, `Sprintf("%80000s")`, func() { _ = Sprintf("%80000s", "hello") }}, // large buffer (>64KB)
+	{1, `Sprintf("%s")`, func() { _ = Sprintf("%s", "hello") }},
+	{1, `Sprintf("%x %x")`, func() { _ = Sprintf("%x %x", 7, 112) }},
+	{1, `Sprintf("%g")`, func() { _ = Sprintf("%g", float32(3.14159)) }},
 	{0, `Fprintf(buf, "%s")`, func() { mallocBuf.Reset(); Fprintf(&mallocBuf, "%s", "hello") }},
 	{0, `Fprintf(buf, "%x")`, func() { mallocBuf.Reset(); Fprintf(&mallocBuf, "%x", 7) }},
 	{0, `Fprintf(buf, "%x")`, func() { mallocBuf.Reset(); Fprintf(&mallocBuf, "%x", 1<<16) }},
@@ -1773,13 +1773,13 @@
 func TestBadVerbRecursion(t *testing.T) {
 	failed := false
 	r := &Recur{3, &failed}
-	Sprintf("recur@%p value: %d\n", &r, r.i)
+	_ = 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)
+	_ = Sprintf("recur@%p, value: %d\n", r, r.i)
 	if failed {
 		t.Error("fail with value")
 	}
diff --git a/src/fmt/print.go b/src/fmt/print.go
index b3dd43c..9c3bd3e 100644
--- a/src/fmt/print.go
+++ b/src/fmt/print.go
@@ -50,7 +50,7 @@
 
 // Formatter is implemented by any value that has a Format method.
 // The implementation controls how State and rune are interpreted,
-// and may call Sprint(f) or Fprint(f) etc. to generate its output.
+// and may call Sprint() or Fprint(f) etc. to generate its output.
 type Formatter interface {
 	Format(f State, verb rune)
 }
diff --git a/src/fmt/scan.go b/src/fmt/scan.go
index d38610d..5dd0971 100644
--- a/src/fmt/scan.go
+++ b/src/fmt/scan.go
@@ -462,8 +462,8 @@
 	return s.buf
 }
 
-var complexError = errors.New("syntax error scanning complex number")
-var boolError = errors.New("syntax error scanning boolean")
+var errComplex = errors.New("syntax error scanning complex number")
+var errBool = errors.New("syntax error scanning boolean")
 
 func indexRune(s string, r rune) int {
 	for i, c := range s {
@@ -542,12 +542,12 @@
 		return true
 	case 't', 'T':
 		if s.accept("rR") && (!s.accept("uU") || !s.accept("eE")) {
-			s.error(boolError)
+			s.error(errBool)
 		}
 		return true
 	case 'f', 'F':
 		if s.accept("aA") && (!s.accept("lL") || !s.accept("sS") || !s.accept("eE")) {
-			s.error(boolError)
+			s.error(errBool)
 		}
 		return false
 	}
@@ -747,16 +747,16 @@
 	s.buf = s.buf[:0]
 	// Must now have a sign.
 	if !s.accept("+-") {
-		s.error(complexError)
+		s.error(errComplex)
 	}
 	// Sign is now in buffer
 	imagSign := string(s.buf)
 	imag = s.floatToken()
 	if !s.accept("i") {
-		s.error(complexError)
+		s.error(errComplex)
 	}
 	if parens && !s.accept(")") {
-		s.error(complexError)
+		s.error(errComplex)
 	}
 	return real, imagSign + imag
 }
@@ -803,7 +803,7 @@
 	return f
 }
 
-// convertComplex converts the next token to a complex128 value.
+// scanComplex 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.
diff --git a/src/fmt/scan_test.go b/src/fmt/scan_test.go
index e8c5769..a4f80c2 100644
--- a/src/fmt/scan_test.go
+++ b/src/fmt/scan_test.go
@@ -1096,10 +1096,10 @@
 }
 
 func BenchmarkScanInts(b *testing.B) {
-	b.ResetTimer()
+	b.StopTimer()
 	ints := makeInts(intCount)
 	var r RecursiveInt
-	for i := b.N - 1; i >= 0; i-- {
+	for i := 0; i < b.N; i++ {
 		buf := bytes.NewBuffer(ints)
 		b.StartTimer()
 		scanInts(&r, buf)
@@ -1108,10 +1108,10 @@
 }
 
 func BenchmarkScanRecursiveInt(b *testing.B) {
-	b.ResetTimer()
+	b.StopTimer()
 	ints := makeInts(intCount)
 	var r RecursiveInt
-	for i := b.N - 1; i >= 0; i-- {
+	for i := 0; i < b.N; i++ {
 		buf := bytes.NewBuffer(ints)
 		b.StartTimer()
 		Fscan(buf, &r)
@@ -1120,10 +1120,10 @@
 }
 
 func BenchmarkScanRecursiveIntReaderWrapper(b *testing.B) {
-	b.ResetTimer()
+	b.StopTimer()
 	ints := makeInts(intCount)
 	var r RecursiveInt
-	for i := b.N - 1; i >= 0; i-- {
+	for i := 0; i < b.N; i++ {
 		buf := struct{ io.Reader }{strings.NewReader(string(ints))}
 		b.StartTimer()
 		Fscan(buf, &r)
diff --git a/src/go.mod b/src/go.mod
index 4697da2..3b24053 100644
--- a/src/go.mod
+++ b/src/go.mod
@@ -1,13 +1,13 @@
 module std
 
-go 1.20
+go 1.21
 
 require (
-	golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a
-	golang.org/x/net v0.4.1-0.20230214201333-88ed8ca3307d
+	golang.org/x/crypto v0.11.1-0.20230711161743-2e82bdd1719d
+	golang.org/x/net v0.12.1-0.20231027154334-5ca955b1789c
 )
 
 require (
-	golang.org/x/sys v0.3.0 // indirect
-	golang.org/x/text v0.5.0 // indirect
+	golang.org/x/sys v0.10.0 // indirect
+	golang.org/x/text v0.11.0 // indirect
 )
diff --git a/src/go.sum b/src/go.sum
index 625f207..caf8ff0 100644
--- a/src/go.sum
+++ b/src/go.sum
@@ -1,8 +1,8 @@
-golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a h1:diz9pEYuTIuLMJLs3rGDkeaTsNyRs6duYdFyPAxzE/U=
-golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4=
-golang.org/x/net v0.4.1-0.20230214201333-88ed8ca3307d h1:KHU/KRz6+/yWyRHEC24m7T5gou5VSh62duch955ktBY=
-golang.org/x/net v0.4.1-0.20230214201333-88ed8ca3307d/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE=
-golang.org/x/sys v0.3.0 h1:w8ZOecv6NaNa/zC8944JTU3vz4u6Lagfk4RPQxv92NQ=
-golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/text v0.5.0 h1:OLmvp0KP+FVG99Ct/qFiL/Fhk4zp4QQnZ7b2U+5piUM=
-golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
+golang.org/x/crypto v0.11.1-0.20230711161743-2e82bdd1719d h1:LiA25/KWKuXfIq5pMIBq1s5hz3HQxhJJSu/SUGlD+SM=
+golang.org/x/crypto v0.11.1-0.20230711161743-2e82bdd1719d/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio=
+golang.org/x/net v0.12.1-0.20231027154334-5ca955b1789c h1:d+VvAxu4S13DWtf73R5eY//VaCk3aUcVdyYjM1SX7zw=
+golang.org/x/net v0.12.1-0.20231027154334-5ca955b1789c/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA=
+golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA=
+golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4=
+golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
diff --git a/src/go/ast/ast.go b/src/go/ast/ast.go
index 9baf72f..c439052 100644
--- a/src/go/ast/ast.go
+++ b/src/go/ast/ast.go
@@ -1046,6 +1046,7 @@
 	Imports            []*ImportSpec   // imports in this file
 	Unresolved         []*Ident        // unresolved identifiers in this file
 	Comments           []*CommentGroup // list of all comments in the source file
+	GoVersion          string          // minimum Go version required by //go:build or // +build directives
 }
 
 // Pos returns the position of the package declaration.
@@ -1072,3 +1073,40 @@
 
 func (p *Package) Pos() token.Pos { return token.NoPos }
 func (p *Package) End() token.Pos { return token.NoPos }
+
+// IsGenerated reports whether the file was generated by a program,
+// not handwritten, by detecting the special comment described
+// at https://go.dev/s/generatedcode.
+//
+// The syntax tree must have been parsed with the ParseComments flag.
+// Example:
+//
+//	f, err := parser.ParseFile(fset, filename, src, parser.ParseComments|parser.PackageClauseOnly)
+//	if err != nil { ... }
+//	gen := ast.IsGenerated(f)
+func IsGenerated(file *File) bool {
+	_, ok := generator(file)
+	return ok
+}
+
+func generator(file *File) (string, bool) {
+	for _, group := range file.Comments {
+		for _, comment := range group.List {
+			if comment.Pos() > file.Package {
+				break // after package declaration
+			}
+			// opt: check Contains first to avoid unnecessary array allocation in Split.
+			const prefix = "// Code generated "
+			if strings.Contains(comment.Text, prefix) {
+				for _, line := range strings.Split(comment.Text, "\n") {
+					if rest, ok := strings.CutPrefix(line, prefix); ok {
+						if gen, ok := strings.CutSuffix(rest, " DO NOT EDIT."); ok {
+							return gen, true
+						}
+					}
+				}
+			}
+		}
+	}
+	return "", false
+}
diff --git a/src/go/ast/example_test.go b/src/go/ast/example_test.go
index c6904be..4ce42fb 100644
--- a/src/go/ast/example_test.go
+++ b/src/go/ast/example_test.go
@@ -136,7 +136,8 @@
 	//     57  .  Unresolved: []*ast.Ident (len = 1) {
 	//     58  .  .  0: *(obj @ 29)
 	//     59  .  }
-	//     60  }
+	//     60  .  GoVersion: ""
+	//     61  }
 }
 
 // This example illustrates how to remove a variable declaration
diff --git a/src/go/ast/filter.go b/src/go/ast/filter.go
index 7d2a11e..c9e733a 100644
--- a/src/go/ast/filter.go
+++ b/src/go/ast/filter.go
@@ -491,5 +491,5 @@
 	}
 
 	// TODO(gri) need to compute unresolved identifiers!
-	return &File{doc, pos, NewIdent(pkg.Name), decls, minPos, maxPos, pkg.Scope, imports, nil, comments}
+	return &File{doc, pos, NewIdent(pkg.Name), decls, minPos, maxPos, pkg.Scope, imports, nil, comments, ""}
 }
diff --git a/src/go/ast/issues_test.go b/src/go/ast/issues_test.go
index 788c557..28d6a30 100644
--- a/src/go/ast/issues_test.go
+++ b/src/go/ast/issues_test.go
@@ -40,3 +40,100 @@
 		}
 	}
 }
+
+// TestIssue28089 exercises the IsGenerated function.
+func TestIssue28089(t *testing.T) {
+	for i, test := range []struct {
+		src  string
+		want bool
+	}{
+		// No file comments.
+		{`package p`, false},
+		// Irrelevant file comments.
+		{`// Package p doc.
+package p`, false},
+		// Special comment misplaced after package decl.
+		{`// Package p doc.
+package p
+// Code generated by gen. DO NOT EDIT.
+`, false},
+		// Special comment appears inside string literal.
+		{`// Package p doc.
+package p
+const c = "` + "`" + `
+// Code generated by gen. DO NOT EDIT.
+` + "`" + `
+`, false},
+		// Special comment appears properly.
+		{`// Copyright 2019 The Go Authors. 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 doc comment goes here.
+//
+// Code generated by gen. DO NOT EDIT.
+package p
+
+... `, true},
+		// Special comment is indented.
+		//
+		// Strictly, the indent should cause IsGenerated to
+		// yield false, but we cannot detect the indent
+		// without either source text or a token.File.
+		// In other words, the function signature cannot
+		// implement the spec. Let's brush this under the
+		// rug since well-formatted code has no indent.
+		{`// Package p doc comment goes here.
+//
+	// Code generated by gen. DO NOT EDIT.
+package p
+
+... `, true},
+		// Special comment has unwanted spaces after "DO NOT EDIT."
+		{`// Copyright 2019 The Go Authors. 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 doc comment goes here.
+//
+// Code generated by gen. DO NOT EDIT. 
+package p
+
+... `, false},
+		// Special comment has rogue interior space.
+		{`//     Code generated by gen. DO NOT EDIT.
+package p
+`, false},
+		// Special comment lacks the middle portion.
+		{`// Code generated DO NOT EDIT.
+package p
+`, false},
+		// Special comment (incl. "//") appears within a /* block */ comment,
+		// an obscure corner case of the spec.
+		{`/* start of a general comment
+
+// Code generated by tool; DO NOT EDIT.
+
+end of a general comment */
+
+// +build !dev
+
+// Package comment.
+package p
+
+// Does match even though it's inside general comment (/*-style).
+`, true},
+	} {
+		fset := token.NewFileSet()
+		f, err := parser.ParseFile(fset, "", test.src, parser.PackageClauseOnly|parser.ParseComments)
+		if f == nil {
+			t.Fatalf("parse %d failed to return AST: %v", i, err)
+		}
+
+		got := ast.IsGenerated(f)
+		if got != test.want {
+			t.Errorf("%d: IsGenerated on <<%s>> returned %t", i, test.src, got)
+		}
+	}
+
+}
diff --git a/src/go/build/build.go b/src/go/build/build.go
index 420873c..dd6cdc9 100644
--- a/src/go/build/build.go
+++ b/src/go/build/build.go
@@ -16,6 +16,7 @@
 	"internal/godebug"
 	"internal/goroot"
 	"internal/goversion"
+	"internal/platform"
 	"io"
 	"io/fs"
 	"os"
@@ -345,7 +346,7 @@
 	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]
+			c.CgoEnabled = platform.CgoSupported(c.GOOS, c.GOARCH)
 			break
 		}
 		c.CgoEnabled = false
@@ -455,6 +456,11 @@
 	TestGoFiles  []string // _test.go files in package
 	XTestGoFiles []string // _test.go files outside package
 
+	// Go directive comments (//go:zzz...) found in source files.
+	Directives      []Directive
+	TestDirectives  []Directive
+	XTestDirectives []Directive
+
 	// Dependency information
 	Imports        []string                    // import paths from GoFiles, CgoFiles
 	ImportPos      map[string][]token.Position // line information for Imports
@@ -476,6 +482,12 @@
 	XTestEmbedPatternPos map[string][]token.Position // line information for XTestEmbedPatternPos
 }
 
+// A Directive is a Go directive comment (//go:zzz...) found in a source file.
+type Directive struct {
+	Text string         // full line comment including leading slashes
+	Pos  token.Position // position of comment
+}
+
 // IsCommand reports whether the package is considered a
 // command to be installed (not just a library).
 // Packages named "main" are treated as commands.
@@ -786,6 +798,9 @@
 
 			// Set the install target if applicable.
 			if !p.Goroot || (installgoroot.Value() == "all" && p.ImportPath != "unsafe" && p.ImportPath != "builtin") {
+				if p.Goroot {
+					installgoroot.IncNonDefault()
+				}
 				p.PkgObj = ctxt.joinPath(p.Root, pkga)
 			}
 		}
@@ -966,6 +981,7 @@
 
 		var fileList *[]string
 		var importMap, embedMap map[string][]token.Position
+		var directives *[]Directive
 		switch {
 		case isCgo:
 			allTags["cgo"] = true
@@ -973,6 +989,7 @@
 				fileList = &p.CgoFiles
 				importMap = importPos
 				embedMap = embedPos
+				directives = &p.Directives
 			} else {
 				// Ignore imports and embeds from cgo files if cgo is disabled.
 				fileList = &p.IgnoredGoFiles
@@ -981,14 +998,17 @@
 			fileList = &p.XTestGoFiles
 			importMap = xTestImportPos
 			embedMap = xTestEmbedPos
+			directives = &p.XTestDirectives
 		case isTest:
 			fileList = &p.TestGoFiles
 			importMap = testImportPos
 			embedMap = testEmbedPos
+			directives = &p.TestDirectives
 		default:
 			fileList = &p.GoFiles
 			importMap = importPos
 			embedMap = embedPos
+			directives = &p.Directives
 		}
 		*fileList = append(*fileList, name)
 		if importMap != nil {
@@ -1001,6 +1021,9 @@
 				embedMap[emb.pattern] = append(embedMap[emb.pattern], emb.pos)
 			}
 		}
+		if directives != nil {
+			*directives = append(*directives, info.directives...)
+		}
 	}
 
 	for tag := range allTags {
@@ -1380,13 +1403,14 @@
 
 // fileInfo records information learned about a file included in a build.
 type fileInfo struct {
-	name     string // full name including dir
-	header   []byte
-	fset     *token.FileSet
-	parsed   *ast.File
-	parseErr error
-	imports  []fileImport
-	embeds   []fileEmbed
+	name       string // full name including dir
+	header     []byte
+	fset       *token.FileSet
+	parsed     *ast.File
+	parseErr   error
+	imports    []fileImport
+	embeds     []fileEmbed
+	directives []Directive
 }
 
 type fileImport struct {
diff --git a/src/go/build/build_test.go b/src/go/build/build_test.go
index 2e60ecc..cef0230 100644
--- a/src/go/build/build_test.go
+++ b/src/go/build/build_test.go
@@ -5,6 +5,7 @@
 package build
 
 import (
+	"fmt"
 	"internal/testenv"
 	"io"
 	"os"
@@ -524,10 +525,10 @@
 				errOk := (err != nil && strings.HasPrefix(err.Error(), "cannot find package"))
 				wantErr := `"cannot find package" error`
 				if test.srcDir == "" {
-					if err != nil && strings.Contains(err.Error(), "is not in GOROOT") {
+					if err != nil && strings.Contains(err.Error(), "is not in std") {
 						errOk = true
 					}
-					wantErr = `"cannot find package" or "is not in GOROOT" error`
+					wantErr = `"cannot find package" or "is not in std" error`
 				}
 				if !errOk {
 					t.Errorf("%s got error: %q, want %s", test.label, err, wantErr)
@@ -801,3 +802,27 @@
 		t.Errorf("AllTags = %v, want empty", p.AllTags)
 	}
 }
+
+func TestDirectives(t *testing.T) {
+	p, err := ImportDir("testdata/directives", 0)
+	if err != nil {
+		t.Fatalf("could not import testdata: %v", err)
+	}
+
+	check := func(name string, list []Directive, want string) {
+		if runtime.GOOS == "windows" {
+			want = strings.ReplaceAll(want, "testdata/directives/", `testdata\\directives\\`)
+		}
+		t.Helper()
+		s := fmt.Sprintf("%q", list)
+		if s != want {
+			t.Errorf("%s = %s, want %s", name, s, want)
+		}
+	}
+	check("Directives", p.Directives,
+		`[{"//go:main1" "testdata/directives/a.go:1:1"} {"//go:plant" "testdata/directives/eve.go:1:1"}]`)
+	check("TestDirectives", p.TestDirectives,
+		`[{"//go:test1" "testdata/directives/a_test.go:1:1"} {"//go:test2" "testdata/directives/b_test.go:1:1"}]`)
+	check("XTestDirectives", p.XTestDirectives,
+		`[{"//go:xtest1" "testdata/directives/c_test.go:1:1"} {"//go:xtest2" "testdata/directives/d_test.go:1:1"} {"//go:xtest3" "testdata/directives/d_test.go:2:1"}]`)
+}
diff --git a/src/go/build/constraint/vers.go b/src/go/build/constraint/vers.go
new file mode 100644
index 0000000..34c44dc
--- /dev/null
+++ b/src/go/build/constraint/vers.go
@@ -0,0 +1,105 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package constraint
+
+import (
+	"strconv"
+	"strings"
+)
+
+// GoVersion returns the minimum Go version implied by a given build expression.
+// If the expression can be satisfied without any Go version tags, GoVersion returns an empty string.
+//
+// For example:
+//
+//	GoVersion(linux && go1.22) = "go1.22"
+//	GoVersion((linux && go1.22) || (windows && go1.20)) = "go1.20" => go1.20
+//	GoVersion(linux) = ""
+//	GoVersion(linux || (windows && go1.22)) = ""
+//	GoVersion(!go1.22) = ""
+//
+// GoVersion assumes that any tag or negated tag may independently be true,
+// so that its analysis can be purely structural, without SAT solving.
+// “Impossible” subexpressions may therefore affect the result.
+//
+// For example:
+//
+//	GoVersion((linux && !linux && go1.20) || go1.21) = "go1.20"
+func GoVersion(x Expr) string {
+	v := minVersion(x, +1)
+	if v < 0 {
+		return ""
+	}
+	if v == 0 {
+		return "go1"
+	}
+	return "go1." + strconv.Itoa(v)
+}
+
+// minVersion returns the minimum Go major version (9 for go1.9)
+// implied by expression z, or if sign < 0, by expression !z.
+func minVersion(z Expr, sign int) int {
+	switch z := z.(type) {
+	default:
+		return -1
+	case *AndExpr:
+		op := andVersion
+		if sign < 0 {
+			op = orVersion
+		}
+		return op(minVersion(z.X, sign), minVersion(z.Y, sign))
+	case *OrExpr:
+		op := orVersion
+		if sign < 0 {
+			op = andVersion
+		}
+		return op(minVersion(z.X, sign), minVersion(z.Y, sign))
+	case *NotExpr:
+		return minVersion(z.X, -sign)
+	case *TagExpr:
+		if sign < 0 {
+			// !foo implies nothing
+			return -1
+		}
+		if z.Tag == "go1" {
+			return 0
+		}
+		_, v, _ := stringsCut(z.Tag, "go1.")
+		n, err := strconv.Atoi(v)
+		if err != nil {
+			// not a go1.N tag
+			return -1
+		}
+		return n
+	}
+}
+
+// TODO: Delete, replace calls with strings.Cut once Go bootstrap toolchain is bumped.
+func stringsCut(s, sep string) (before, after string, found bool) {
+	if i := strings.Index(s, sep); i >= 0 {
+		return s[:i], s[i+len(sep):], true
+	}
+	return s, "", false
+}
+
+// andVersion returns the minimum Go version
+// implied by the AND of two minimum Go versions,
+// which is the max of the versions.
+func andVersion(x, y int) int {
+	if x > y {
+		return x
+	}
+	return y
+}
+
+// orVersion returns the minimum Go version
+// implied by the OR of two minimum Go versions,
+// which is the min of the versions.
+func orVersion(x, y int) int {
+	if x < y {
+		return x
+	}
+	return y
+}
diff --git a/src/go/build/constraint/vers_test.go b/src/go/build/constraint/vers_test.go
new file mode 100644
index 0000000..044de7f
--- /dev/null
+++ b/src/go/build/constraint/vers_test.go
@@ -0,0 +1,45 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package constraint
+
+import (
+	"fmt"
+	"testing"
+)
+
+var tests = []struct {
+	in  string
+	out int
+}{
+	{"//go:build linux && go1.60", 60},
+	{"//go:build ignore && go1.60", 60},
+	{"//go:build ignore || go1.60", -1},
+	{"//go:build go1.50 || (ignore && go1.60)", 50},
+	{"// +build go1.60,linux", 60},
+	{"// +build go1.60 linux", -1},
+	{"//go:build go1.50 && !go1.60", 50},
+	{"//go:build !go1.60", -1},
+	{"//go:build linux && go1.50 || darwin && go1.60", 50},
+	{"//go:build linux && go1.50 || !(!darwin || !go1.60)", 50},
+}
+
+func TestGoVersion(t *testing.T) {
+	for _, tt := range tests {
+		x, err := Parse(tt.in)
+		if err != nil {
+			t.Fatal(err)
+		}
+		v := GoVersion(x)
+		want := ""
+		if tt.out == 0 {
+			want = "go1"
+		} else if tt.out > 0 {
+			want = fmt.Sprintf("go1.%d", tt.out)
+		}
+		if v != want {
+			t.Errorf("GoVersion(%q) = %q, want %q, nil", tt.in, v, want)
+		}
+	}
+}
diff --git a/src/go/build/deps_test.go b/src/go/build/deps_test.go
index 08452c7..592f2fd 100644
--- a/src/go/build/deps_test.go
+++ b/src/go/build/deps_test.go
@@ -39,12 +39,13 @@
 var depsRules = `
 	# No dependencies allowed for any of these packages.
 	NONE
-	< constraints, container/list, container/ring,
+	< cmp, container/list, container/ring,
 	  internal/cfg, internal/coverage, internal/coverage/rtcov,
 	  internal/coverage/uleb128, internal/coverage/calloc,
-	  internal/cpu, internal/goarch,
+	  internal/cpu, internal/goarch, internal/godebugs,
 	  internal/goexperiment, internal/goos,
 	  internal/goversion, internal/nettrace, internal/platform,
+	  log/internal,
 	  unicode/utf8, unicode/utf16, unicode,
 	  unsafe;
 
@@ -52,9 +53,11 @@
 	internal/goarch, unsafe
 	< internal/abi;
 
+	unsafe < maps;
+
 	# RUNTIME is the core runtime group of packages, all of them very light-weight.
 	internal/abi, internal/cpu, internal/goarch,
-	internal/coverage/rtcov, internal/goexperiment,
+	internal/coverage/rtcov, internal/godebugs, internal/goexperiment,
 	internal/goos, unsafe
 	< internal/bytealg
 	< internal/itoa
@@ -67,6 +70,7 @@
 	< sync/atomic
 	< internal/race
 	< sync
+	< internal/bisect
 	< internal/godebug
 	< internal/reflectlite
 	< errors
@@ -153,7 +157,7 @@
 
 	unicode, fmt !< net, os, os/signal;
 
-	os/signal, STR
+	os/signal, internal/safefilepath, STR
 	< path/filepath
 	< io/ioutil;
 
@@ -217,7 +221,12 @@
 	# hashes
 	io
 	< hash
-	< hash/adler32, hash/crc32, hash/crc64, hash/fnv, hash/maphash;
+	< hash/adler32, hash/crc32, hash/crc64, hash/fnv;
+
+	# slices depends on unsafe for overlapping check, cmp for comparison
+	# semantics, and math/bits for # calculating bitlength of numbers.
+	unsafe, cmp, math/bits
+	< slices;
 
 	# math/big
 	FMT, encoding/binary, math/rand
@@ -225,7 +234,7 @@
 
 	# compression
 	FMT, encoding/binary, hash/adler32, hash/crc32
-	< compress/bzip2, compress/flate, compress/lzw
+	< compress/bzip2, compress/flate, compress/lzw, internal/zstd
 	< archive/zip, compress/gzip, compress/zlib;
 
 	# templates
@@ -236,21 +245,21 @@
 	< text/template
 	< internal/lazytemplate;
 
-	encoding/json, html, text/template
-	< html/template;
-
 	# regexp
 	FMT
 	< regexp/syntax
 	< regexp
 	< internal/lazyregexp;
 
+	encoding/json, html, text/template, regexp
+	< html/template;
+
 	# suffix array
 	encoding/binary, regexp
 	< index/suffixarray;
 
 	# executable parsing
-	FMT, encoding/binary, compress/zlib, internal/saferio
+	FMT, encoding/binary, compress/zlib, internal/saferio, internal/zstd
 	< runtime/debug
 	< debug/dwarf
 	< debug/elf, debug/gosym, debug/macho, debug/pe, debug/plan9obj, internal/xcoff
@@ -262,29 +271,36 @@
 	< go/token
 	< go/scanner
 	< go/ast
-	< go/internal/typeparams
-	< go/parser;
+	< go/internal/typeparams;
 
 	FMT
 	< go/build/constraint, go/doc/comment;
 
-	go/build/constraint, go/doc/comment, go/parser, text/tabwriter
+	go/internal/typeparams, go/build/constraint
+	< go/parser;
+
+	go/doc/comment, go/parser, text/tabwriter
 	< go/printer
 	< go/format;
 
-	go/doc/comment, go/parser, internal/lazyregexp, text/template
-	< go/doc;
-
 	math/big, go/token
 	< go/constant;
 
-	container/heap, go/constant, go/parser, internal/types/errors, regexp
+	container/heap, go/constant, go/parser, internal/goversion, internal/types/errors
 	< go/types;
 
+	# The vast majority of standard library packages should not be resorting to regexp.
+	# go/types is a good chokepoint. It shouldn't use regexp, nor should anything
+	# that is low-enough level to be used by go/types.
+	regexp !< go/types;
+
+	go/doc/comment, go/parser, internal/lazyregexp, text/template
+	< go/doc;
+
 	FMT, internal/goexperiment
 	< internal/buildcfg;
 
-	go/build/constraint, go/doc, go/parser, internal/buildcfg, internal/goroot, internal/goversion
+	go/build/constraint, go/doc, go/parser, internal/buildcfg, internal/goroot, internal/goversion, internal/platform
 	< go/build;
 
 	# databases
@@ -317,7 +333,7 @@
 
 	# Bulk of the standard library must not use cgo.
 	# The prohibition stops at net and os/user.
-	C !< fmt, go/types, CRYPTO-MATH;
+	C !< fmt, go/types, CRYPTO-MATH, log/slog;
 
 	CGO, OS
 	< plugin;
@@ -369,14 +385,25 @@
 	< NET;
 
 	# logging - most packages should not import; http and up is allowed
-	FMT
+	FMT, log/internal
 	< log;
 
-	log !< crypto/tls, database/sql, go/importer, testing;
+	log, log/slog !< crypto/tls, database/sql, go/importer, testing;
 
 	FMT, log, net
 	< log/syslog;
 
+	RUNTIME
+	< log/slog/internal, log/slog/internal/buffer;
+
+	FMT,
+	encoding, encoding/json,
+	log, log/internal,
+	log/slog/internal, log/slog/internal/buffer,
+	slices
+	< log/slog
+	< log/slog/internal/slogtest, log/slog/internal/benchmarks;
+
 	NET, log
 	< net/mail;
 
@@ -472,6 +499,9 @@
 	crypto/tls
 	< net/smtp;
 
+	crypto/rand
+	< hash/maphash; # for purego implementation
+
 	# HTTP, King of Dependencies.
 
 	FMT
@@ -520,7 +550,7 @@
 	FMT, compress/gzip, encoding/binary, text/tabwriter
 	< runtime/pprof;
 
-	OS, compress/gzip, regexp
+	OS, compress/gzip, internal/lazyregexp
 	< internal/profile;
 
 	html, internal/profile, net/http, runtime/pprof, runtime/trace
@@ -540,6 +570,9 @@
 	< testing/iotest
 	< testing/fstest;
 
+	log/slog
+	< testing/slogtest;
+
 	FMT, flag, math/rand
 	< testing/quick;
 
@@ -589,6 +622,7 @@
 	internal/coverage/cmerge
 	< internal/coverage/cformat;
 
+    encoding/json,
 	runtime/debug,
 	internal/coverage/calloc,
 	internal/coverage/cformat,
diff --git a/src/go/build/read.go b/src/go/build/read.go
index 52adfea..5289197 100644
--- a/src/go/build/read.go
+++ b/src/go/build/read.go
@@ -11,6 +11,7 @@
 	"fmt"
 	"go/ast"
 	"go/parser"
+	"go/scanner"
 	"go/token"
 	"io"
 	"strconv"
@@ -459,6 +460,13 @@
 			if err != nil {
 				return fmt.Errorf("parser returned invalid quoted string: <%s>", quoted)
 			}
+			if !isValidImport(path) {
+				// The parser used to return a parse error for invalid import paths, but
+				// no longer does, so check for and create the error here instead.
+				info.parseErr = scanner.Error{Pos: info.fset.Position(spec.Pos()), Msg: "invalid import path: " + path}
+				info.imports = nil
+				return nil
+			}
 			if path == "embed" {
 				hasEmbed = true
 			}
@@ -471,6 +479,18 @@
 		}
 	}
 
+	// Extract directives.
+	for _, group := range info.parsed.Comments {
+		if group.Pos() >= info.parsed.Package {
+			break
+		}
+		for _, c := range group.List {
+			if strings.HasPrefix(c.Text, "//go:") {
+				info.directives = append(info.directives, Directive{c.Text, info.fset.Position(c.Slash)})
+			}
+		}
+	}
+
 	// If the file imports "embed",
 	// we have to look for //go:embed comments
 	// in the remainder of the file.
@@ -504,6 +524,20 @@
 	return nil
 }
 
+// isValidImport checks if the import is a valid import using the more strict
+// checks allowed by the implementation restriction in https://go.dev/ref/spec#Import_declarations.
+// It was ported from the function of the same name that was removed from the
+// parser in CL 424855, when the parser stopped doing these checks.
+func isValidImport(s string) bool {
+	const illegalChars = `!"#$%&'()*,:;<=>?[\]^{|}` + "`\uFFFD"
+	for _, r := range s {
+		if !unicode.IsGraphic(r) || unicode.IsSpace(r) || strings.ContainsRune(illegalChars, r) {
+			return false
+		}
+	}
+	return s != ""
+}
+
 // parseGoEmbed parses the text following "//go:embed" to extract the glob patterns.
 // It accepts unquoted space-separated patterns as well as double-quoted and back-quoted Go strings.
 // This is based on a similar function in cmd/compile/internal/gc/noder.go;
diff --git a/src/go/build/syslist.go b/src/go/build/syslist.go
index 78ca565..783bbe6 100644
--- a/src/go/build/syslist.go
+++ b/src/go/build/syslist.go
@@ -27,6 +27,7 @@
 	"openbsd":   true,
 	"plan9":     true,
 	"solaris":   true,
+	"wasip1":    true,
 	"windows":   true,
 	"zos":       true,
 }
diff --git a/src/go/build/testdata/directives/a.go b/src/go/build/testdata/directives/a.go
new file mode 100644
index 0000000..7bad420
--- /dev/null
+++ b/src/go/build/testdata/directives/a.go
@@ -0,0 +1,3 @@
+//go:main1
+
+package p
diff --git a/src/go/build/testdata/directives/a_test.go b/src/go/build/testdata/directives/a_test.go
new file mode 100644
index 0000000..44ed3c0
--- /dev/null
+++ b/src/go/build/testdata/directives/a_test.go
@@ -0,0 +1,3 @@
+//go:test1
+
+package p
diff --git a/src/go/build/testdata/directives/b_test.go b/src/go/build/testdata/directives/b_test.go
new file mode 100644
index 0000000..9ab0e5c
--- /dev/null
+++ b/src/go/build/testdata/directives/b_test.go
@@ -0,0 +1,5 @@
+//go:test2
+
+package p
+
+//go:ignored
diff --git a/src/go/build/testdata/directives/c_test.go b/src/go/build/testdata/directives/c_test.go
new file mode 100644
index 0000000..aeb6e97
--- /dev/null
+++ b/src/go/build/testdata/directives/c_test.go
@@ -0,0 +1,5 @@
+//go:xtest1
+
+package p_test
+
+//go:ignored
diff --git a/src/go/build/testdata/directives/d_test.go b/src/go/build/testdata/directives/d_test.go
new file mode 100644
index 0000000..5736a33
--- /dev/null
+++ b/src/go/build/testdata/directives/d_test.go
@@ -0,0 +1,4 @@
+//go:xtest2
+//go:xtest3
+
+package p_test
diff --git a/src/go/build/testdata/directives/eve.go b/src/go/build/testdata/directives/eve.go
new file mode 100644
index 0000000..14e53ba
--- /dev/null
+++ b/src/go/build/testdata/directives/eve.go
@@ -0,0 +1,4 @@
+//go:plant
+//axiom:plant
+
+package p
diff --git a/src/go/doc/comment/print.go b/src/go/doc/comment/print.go
index 4e9da3d..e1c070d 100644
--- a/src/go/doc/comment/print.go
+++ b/src/go/doc/comment/print.go
@@ -148,8 +148,6 @@
 
 type commentPrinter struct {
 	*Printer
-	headingPrefix string
-	needDoc       map[string]bool
 }
 
 // Comment returns the standard Go formatting of the Doc,
diff --git a/src/go/doc/comment/std.go b/src/go/doc/comment/std.go
index 71f15f4..fd8c8ce 100644
--- a/src/go/doc/comment/std.go
+++ b/src/go/doc/comment/std.go
@@ -10,6 +10,7 @@
 var stdPkgs = []string{
 	"bufio",
 	"bytes",
+	"cmp",
 	"context",
 	"crypto",
 	"embed",
@@ -23,6 +24,7 @@
 	"image",
 	"io",
 	"log",
+	"maps",
 	"math",
 	"mime",
 	"net",
@@ -32,6 +34,7 @@
 	"reflect",
 	"regexp",
 	"runtime",
+	"slices",
 	"sort",
 	"strconv",
 	"strings",
diff --git a/src/go/importer/importer_test.go b/src/go/importer/importer_test.go
index 142efd3..e5c50f6 100644
--- a/src/go/importer/importer_test.go
+++ b/src/go/importer/importer_test.go
@@ -7,7 +7,6 @@
 import (
 	"go/build"
 	"go/token"
-	"internal/buildcfg"
 	"internal/testenv"
 	"io"
 	"os"
@@ -68,7 +67,7 @@
 		// support for it in unified IR. It's not clear that we actually
 		// need to support importing "math/big" as "math/bigger", for
 		// example. cmd/link no longer supports that.
-		if buildcfg.Experiment.Unified {
+		if true /* was buildcfg.Experiment.Unified */ {
 			t.Skip("not supported by GOEXPERIMENT=unified; see go.dev/cl/406319")
 		}
 
diff --git a/src/go/internal/gcimporter/gcimporter.go b/src/go/internal/gcimporter/gcimporter.go
index 2140a9f..93b33d1 100644
--- a/src/go/internal/gcimporter/gcimporter.go
+++ b/src/go/internal/gcimporter/gcimporter.go
@@ -13,6 +13,7 @@
 	"go/token"
 	"go/types"
 	"internal/pkgbits"
+	"internal/saferio"
 	"io"
 	"os"
 	"os/exec"
@@ -42,8 +43,9 @@
 		)
 		f, _ = exportMap.LoadOrStore(pkgDir, func() (string, bool) {
 			listOnce.Do(func() {
-				cmd := exec.Command("go", "list", "-export", "-f", "{{.Export}}", pkgDir)
+				cmd := exec.Command(filepath.Join(build.Default.GOROOT, "bin", "go"), "list", "-export", "-f", "{{.Export}}", pkgDir)
 				cmd.Dir = build.Default.GOROOT
+				cmd.Env = append(cmd.Environ(), "GOROOT="+build.Default.GOROOT)
 				var output []byte
 				output, err := cmd.Output()
 				if err != nil {
@@ -204,6 +206,7 @@
 		if exportFormat, err = buf.ReadByte(); err != nil {
 			return
 		}
+		size--
 
 		// The unified export format starts with a 'u'; the indexed export
 		// format starts with an 'i'; and the older binary export format
@@ -214,9 +217,10 @@
 			var data []byte
 			var r io.Reader = buf
 			if size >= 0 {
-				r = io.LimitReader(r, int64(size))
-			}
-			if data, err = io.ReadAll(r); err != nil {
+				if data, err = saferio.ReadData(r, uint64(size)); err != nil {
+					return
+				}
+			} else if data, err = io.ReadAll(r); err != nil {
 				return
 			}
 			s := string(data)
diff --git a/src/go/internal/gcimporter/gcimporter_test.go b/src/go/internal/gcimporter/gcimporter_test.go
index f2202ab..25ff402 100644
--- a/src/go/internal/gcimporter/gcimporter_test.go
+++ b/src/go/internal/gcimporter/gcimporter_test.go
@@ -7,8 +7,6 @@
 import (
 	"bytes"
 	"fmt"
-	"internal/goexperiment"
-	"internal/goroot"
 	"internal/testenv"
 	"os"
 	"os/exec"
@@ -37,7 +35,7 @@
 // compile runs the compiler on filename, with dirname as the working directory,
 // and writes the output file to outdirname.
 // compile gives the resulting package a packagepath of testdata/<filebasename>.
-func compile(t *testing.T, dirname, filename, outdirname string, packagefiles map[string]string) string {
+func compile(t *testing.T, dirname, filename, outdirname string, packageFiles map[string]string, pkgImports ...string) string {
 	// filename must end with ".go"
 	basename, ok := strings.CutSuffix(filepath.Base(filename), ".go")
 	if !ok {
@@ -47,16 +45,9 @@
 	outname := filepath.Join(outdirname, objname)
 
 	importcfgfile := os.DevNull
-	if len(packagefiles) > 0 {
+	if len(packageFiles) > 0 || len(pkgImports) > 0 {
 		importcfgfile = filepath.Join(outdirname, basename) + ".importcfg"
-		importcfg := new(bytes.Buffer)
-		fmt.Fprintf(importcfg, "# import config")
-		for k, v := range packagefiles {
-			fmt.Fprintf(importcfg, "\npackagefile %s=%s\n", k, v)
-		}
-		if err := os.WriteFile(importcfgfile, importcfg.Bytes(), 0655); err != nil {
-			t.Fatal(err)
-		}
+		testenv.WriteImportcfg(t, importcfgfile, packageFiles, pkgImports...)
 	}
 
 	pkgpath := path.Join("testdata", basename)
@@ -108,7 +99,7 @@
 		"exports.go":  {"go/ast", "go/token"},
 		"generics.go": nil,
 	}
-	if goexperiment.Unified {
+	if true /* was goexperiment.Unified */ {
 		// TODO(mdempsky): Fix test below to flatten the transitive
 		// Package.Imports graph. Unified IR is more precise about
 		// recreating the package import graph.
@@ -119,16 +110,7 @@
 		tmpdir := mktmpdir(t)
 		defer os.RemoveAll(tmpdir)
 
-		packageFiles := map[string]string{}
-		for _, pkg := range wantImports {
-			export, _ := FindPkg(pkg, "testdata")
-			if export == "" {
-				t.Fatalf("no export data found for %s", pkg)
-			}
-			packageFiles[pkg] = export
-		}
-
-		compile(t, "testdata", testfile, filepath.Join(tmpdir, "testdata"), packageFiles)
+		compile(t, "testdata", testfile, filepath.Join(tmpdir, "testdata"), nil, wantImports...)
 		path := "./testdata/" + strings.TrimSuffix(testfile, ".go")
 
 		if pkg := testPath(t, path, tmpdir); pkg != nil {
@@ -155,6 +137,16 @@
 		t.Skipf("gc-built packages not available (compiler = %s)", runtime.Compiler)
 	}
 
+	// cmd/distpack removes the GOROOT/test directory, so skip if it isn't there.
+	// cmd/distpack also requires the presence of GOROOT/VERSION, so use that to
+	// avoid false-positive skips.
+	gorootTest := filepath.Join(testenv.GOROOT(t), "test")
+	if _, err := os.Stat(gorootTest); os.IsNotExist(err) {
+		if _, err := os.Stat(filepath.Join(testenv.GOROOT(t), "VERSION")); err == nil {
+			t.Skipf("skipping: GOROOT/test not present")
+		}
+	}
+
 	testenv.MustHaveGoBuild(t)
 
 	tmpdir := mktmpdir(t)
@@ -162,23 +154,12 @@
 
 	// Check go files in test/typeparam, except those that fail for a known
 	// reason.
-	rootDir := filepath.Join(testenv.GOROOT(t), "test", "typeparam")
+	rootDir := filepath.Join(gorootTest, "typeparam")
 	list, err := os.ReadDir(rootDir)
 	if err != nil {
 		t.Fatal(err)
 	}
 
-	var skip map[string]string
-	if !goexperiment.Unified {
-		// The Go 1.18 frontend still fails several cases.
-		skip = map[string]string{
-			"equal.go":      "inconsistent embedded sorting", // TODO(rfindley): investigate this.
-			"nested.go":     "fails to compile",              // TODO(rfindley): investigate this.
-			"issue47631.go": "can not handle local type declarations",
-			"issue55101.go": "fails to compile",
-		}
-	}
-
 	for _, entry := range list {
 		if entry.IsDir() || !strings.HasSuffix(entry.Name(), ".go") {
 			// For now, only consider standalone go files.
@@ -186,10 +167,6 @@
 		}
 
 		t.Run(entry.Name(), func(t *testing.T) {
-			if reason, ok := skip[entry.Name()]; ok {
-				t.Skip(reason)
-			}
-
 			filename := filepath.Join(rootDir, entry.Name())
 			src, err := os.ReadFile(filename)
 			if err != nil {
@@ -204,11 +181,7 @@
 
 			// Compile and import, and compare the resulting package with the package
 			// that was type-checked directly.
-			pkgFiles, err := goroot.PkgfileMap()
-			if err != nil {
-				t.Fatal(err)
-			}
-			compile(t, rootDir, entry.Name(), filepath.Join(tmpdir, "testdata"), pkgFiles)
+			compile(t, rootDir, entry.Name(), filepath.Join(tmpdir, "testdata"), nil, filename)
 			pkgName := strings.TrimSuffix(entry.Name(), ".go")
 			imported := importPkg(t, "./testdata/"+pkgName, tmpdir)
 			checked := checkFile(t, filename, src)
@@ -567,12 +540,6 @@
 		t.Skipf("gc-built packages not available (compiler = %s)", runtime.Compiler)
 	}
 
-	// On windows, we have to set the -D option for the compiler to avoid having a drive
-	// letter and an illegal ':' in the import path - just skip it (see also issue #3483).
-	if runtime.GOOS == "windows" {
-		t.Skip("avoid dealing with relative paths/drive letters on windows")
-	}
-
 	tmpdir := mktmpdir(t)
 	defer os.RemoveAll(tmpdir)
 	testoutdir := filepath.Join(tmpdir, "testdata")
@@ -585,13 +552,8 @@
 		t.Fatal(err)
 	}
 
-	jsonExport, _ := FindPkg("encoding/json", "testdata")
-	if jsonExport == "" {
-		t.Fatalf("no export data found for encoding/json")
-	}
-
-	compile(t, "testdata", "a.go", testoutdir, map[string]string{"encoding/json": jsonExport})
-	compile(t, testoutdir, bpath, testoutdir, map[string]string{"testdata/a": filepath.Join(testoutdir, "a.o")})
+	compile(t, "testdata", "a.go", testoutdir, nil, "encoding/json")
+	compile(t, testoutdir, bpath, testoutdir, map[string]string{"testdata/a": filepath.Join(testoutdir, "a.o")}, "encoding/json")
 
 	// import must succeed (test for issue at hand)
 	pkg := importPkg(t, "./testdata/b", tmpdir)
@@ -612,12 +574,6 @@
 		t.Skipf("gc-built packages not available (compiler = %s)", runtime.Compiler)
 	}
 
-	// On windows, we have to set the -D option for the compiler to avoid having a drive
-	// letter and an illegal ':' in the import path - just skip it (see also issue #3483).
-	if runtime.GOOS == "windows" {
-		t.Skip("avoid dealing with relative paths/drive letters on windows")
-	}
-
 	tmpdir := mktmpdir(t)
 	defer os.RemoveAll(tmpdir)
 	testoutdir := filepath.Join(tmpdir, "testdata")
@@ -683,12 +639,6 @@
 		t.Skipf("gc-built packages not available (compiler = %s)", runtime.Compiler)
 	}
 
-	// On windows, we have to set the -D option for the compiler to avoid having a drive
-	// letter and an illegal ':' in the import path - just skip it (see also issue #3483).
-	if runtime.GOOS == "windows" {
-		t.Skip("avoid dealing with relative paths/drive letters on windows")
-	}
-
 	tmpdir := mktmpdir(t)
 	defer os.RemoveAll(tmpdir)
 
@@ -723,12 +673,6 @@
 		t.Skipf("gc-built packages not available (compiler = %s)", runtime.Compiler)
 	}
 
-	// On windows, we have to set the -D option for the compiler to avoid having a drive
-	// letter and an illegal ':' in the import path - just skip it (see also issue #3483).
-	if runtime.GOOS == "windows" {
-		t.Skip("avoid dealing with relative paths/drive letters on windows")
-	}
-
 	compileAndImportPkg(t, "issue15920")
 }
 
@@ -740,12 +684,6 @@
 		t.Skipf("gc-built packages not available (compiler = %s)", runtime.Compiler)
 	}
 
-	// On windows, we have to set the -D option for the compiler to avoid having a drive
-	// letter and an illegal ':' in the import path - just skip it (see also issue #3483).
-	if runtime.GOOS == "windows" {
-		t.Skip("avoid dealing with relative paths/drive letters on windows")
-	}
-
 	// "./issue20046".V.M must exist
 	pkg := compileAndImportPkg(t, "issue20046")
 	obj := lookupObj(t, pkg.Scope(), "V")
@@ -761,12 +699,6 @@
 		t.Skipf("gc-built packages not available (compiler = %s)", runtime.Compiler)
 	}
 
-	// On windows, we have to set the -D option for the compiler to avoid having a drive
-	// letter and an illegal ':' in the import path - just skip it (see also issue #3483).
-	if runtime.GOOS == "windows" {
-		t.Skip("avoid dealing with relative paths/drive letters on windows")
-	}
-
 	compileAndImportPkg(t, "issue25301")
 }
 
@@ -778,12 +710,6 @@
 		t.Skipf("gc-built packages not available (compiler = %s)", runtime.Compiler)
 	}
 
-	// On windows, we have to set the -D option for the compiler to avoid having a drive
-	// letter and an illegal ':' in the import path - just skip it (see also issue #3483).
-	if runtime.GOOS == "windows" {
-		t.Skip("avoid dealing with relative paths/drive letters on windows")
-	}
-
 	compileAndImportPkg(t, "issue25596")
 }
 
@@ -795,12 +721,6 @@
 		t.Skipf("gc-built packages not available (compiler = %s)", runtime.Compiler)
 	}
 
-	// On windows, we have to set the -D option for the compiler to avoid having a drive
-	// letter and an illegal ':' in the import path - just skip it (see also issue #3483).
-	if runtime.GOOS == "windows" {
-		t.Skip("avoid dealing with relative paths/drive letters on windows")
-	}
-
 	compileAndImportPkg(t, "issue57015")
 }
 
diff --git a/src/go/internal/gcimporter/ureader.go b/src/go/internal/gcimporter/ureader.go
index ffd8402..ac85a41 100644
--- a/src/go/internal/gcimporter/ureader.go
+++ b/src/go/internal/gcimporter/ureader.go
@@ -8,6 +8,7 @@
 	"go/token"
 	"go/types"
 	"internal/pkgbits"
+	"sort"
 )
 
 // A pkgReader holds the shared state for reading a unified IR package
@@ -83,6 +84,16 @@
 		iface.Complete()
 	}
 
+	// Imports() of pkg are all of the transitive packages that were loaded.
+	var imps []*types.Package
+	for _, imp := range pr.pkgs {
+		if imp != nil && imp != pkg {
+			imps = append(imps, imp)
+		}
+	}
+	sort.Sort(byPath(imps))
+	pkg.SetImports(imps)
+
 	pkg.MarkComplete()
 	return pkg
 }
@@ -222,45 +233,9 @@
 	pkg := types.NewPackage(path, name)
 	r.p.imports[path] = pkg
 
-	imports := make([]*types.Package, r.Len())
-	for i := range imports {
-		imports[i] = r.pkg()
-	}
-
-	// The documentation for (*types.Package).Imports requires
-	// flattening the import graph when reading from export data, as
-	// obviously incorrect as that is.
-	//
-	// TODO(mdempsky): Remove this if go.dev/issue/54096 is accepted.
-	pkg.SetImports(flattenImports(imports))
-
 	return pkg
 }
 
-// flattenImports returns the transitive closure of all imported
-// packages rooted from pkgs.
-func flattenImports(pkgs []*types.Package) []*types.Package {
-	var res []*types.Package
-	seen := make(map[*types.Package]struct{})
-	for _, pkg := range pkgs {
-		if _, ok := seen[pkg]; ok {
-			continue
-		}
-		seen[pkg] = struct{}{}
-		res = append(res, pkg)
-
-		// pkg.Imports() is already flattened.
-		for _, pkg := range pkg.Imports() {
-			if _, ok := seen[pkg]; ok {
-				continue
-			}
-			seen[pkg] = struct{}{}
-			res = append(res, pkg)
-		}
-	}
-	return res
-}
-
 // @@@ Types
 
 func (r *reader) typ() types.Type {
diff --git a/src/go/internal/srcimporter/srcimporter_test.go b/src/go/internal/srcimporter/srcimporter_test.go
index e877458..61ae0c1 100644
--- a/src/go/internal/srcimporter/srcimporter_test.go
+++ b/src/go/internal/srcimporter/srcimporter_test.go
@@ -244,9 +244,8 @@
 	testenv.MustHaveCGO(t)
 
 	buildCtx := build.Default
-	buildCtx.Dir = filepath.Join(testenv.GOROOT(t), "misc")
 	importer := New(&buildCtx, token.NewFileSet(), make(map[string]*types.Package))
-	_, err := importer.ImportFrom("./cgo/test", buildCtx.Dir, 0)
+	_, err := importer.ImportFrom("cmd/cgo/internal/test", buildCtx.Dir, 0)
 	if err != nil {
 		t.Fatalf("Import failed: %v", err)
 	}
diff --git a/src/go/parser/parser.go b/src/go/parser/parser.go
index fac24df..e1d941e 100644
--- a/src/go/parser/parser.go
+++ b/src/go/parser/parser.go
@@ -18,9 +18,11 @@
 import (
 	"fmt"
 	"go/ast"
+	"go/build/constraint"
 	"go/internal/typeparams"
 	"go/scanner"
 	"go/token"
+	"strings"
 )
 
 // The parser structure holds the parser's internal state.
@@ -38,6 +40,8 @@
 	comments    []*ast.CommentGroup
 	leadComment *ast.CommentGroup // last lead comment
 	lineComment *ast.CommentGroup // last line comment
+	top         bool              // in top of file (before package clause)
+	goVersion   string            // minimum Go version found in //go:build comment
 
 	// Next token
 	pos token.Pos   // token position
@@ -64,13 +68,10 @@
 
 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.scanner.Init(p.file, src, eh, scanner.ScanComments)
 
+	p.top = true
 	p.mode = mode
 	p.trace = mode&Trace != 0 // for convenience (p.trace is used frequently)
 	p.next()
@@ -142,7 +143,23 @@
 		}
 	}
 
-	p.pos, p.tok, p.lit = p.scanner.Scan()
+	for {
+		p.pos, p.tok, p.lit = p.scanner.Scan()
+		if p.tok == token.COMMENT {
+			if p.top && strings.HasPrefix(p.lit, "//go:build") {
+				if x, err := constraint.Parse(p.lit); err == nil {
+					p.goVersion = constraint.GoVersion(x)
+				}
+			}
+			if p.mode&ParseComments == 0 {
+				continue
+			}
+		} else {
+			// Found a non-comment; top of file is over.
+			p.top = false
+		}
+		break
+	}
 }
 
 // Consume a comment and return it and the line on which it ends.
@@ -1213,7 +1230,7 @@
 	}
 
 	// TODO(rfindley): the error produced here could be improved, since we could
-	// accept a identifier, 'type', or a '}' at this point.
+	// accept an identifier, 'type', or a '}' at this point.
 	rbrace := p.expect(token.RBRACE)
 
 	return &ast.InterfaceType{
@@ -2851,6 +2868,7 @@
 		FileEnd:   token.Pos(p.file.Base() + p.file.Size()),
 		Imports:   p.imports,
 		Comments:  p.comments,
+		GoVersion: p.goVersion,
 	}
 	var declErr func(token.Pos, string)
 	if p.mode&DeclarationErrors != 0 {
diff --git a/src/go/parser/parser_test.go b/src/go/parser/parser_test.go
index 153562d..0848aca 100644
--- a/src/go/parser/parser_test.go
+++ b/src/go/parser/parser_test.go
@@ -573,7 +573,7 @@
 var parseDepthTests = []struct {
 	name   string
 	format string
-	// multipler is used when a single statement may result in more than one
+	// multiplier is used when a single statement may result in more than one
 	// change in the depth level, for instance "1+(..." produces a BinaryExpr
 	// followed by a UnaryExpr, which increments the depth twice. The test
 	// case comment explains which nodes are triggering the multiple depth
@@ -764,3 +764,39 @@
 		})
 	}
 }
+
+// TestIssue59180 tests that line number overflow doesn't cause an infinite loop.
+func TestIssue59180(t *testing.T) {
+	testcases := []string{
+		"package p\n//line :9223372036854775806\n\n//",
+		"package p\n//line :1:9223372036854775806\n\n//",
+		"package p\n//line file:9223372036854775806\n\n//",
+	}
+
+	for _, src := range testcases {
+		_, err := ParseFile(token.NewFileSet(), "", src, ParseComments)
+		if err == nil {
+			t.Errorf("ParseFile(%s) succeeded unexpectedly", src)
+		}
+	}
+}
+
+func TestGoVersion(t *testing.T) {
+	fset := token.NewFileSet()
+	pkgs, err := ParseDir(fset, "./testdata/goversion", nil, 0)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	for _, p := range pkgs {
+		want := strings.ReplaceAll(p.Name, "_", ".")
+		if want == "none" {
+			want = ""
+		}
+		for _, f := range p.Files {
+			if f.GoVersion != want {
+				t.Errorf("%s: GoVersion = %q, want %q", fset.Position(f.Pos()), f.GoVersion, want)
+			}
+		}
+	}
+}
diff --git a/src/go/parser/testdata/goversion/t01.go b/src/go/parser/testdata/goversion/t01.go
new file mode 100644
index 0000000..5cfa0cc
--- /dev/null
+++ b/src/go/parser/testdata/goversion/t01.go
@@ -0,0 +1,3 @@
+//go:build windows
+
+package none
diff --git a/src/go/parser/testdata/goversion/t02.go b/src/go/parser/testdata/goversion/t02.go
new file mode 100644
index 0000000..d91f995
--- /dev/null
+++ b/src/go/parser/testdata/goversion/t02.go
@@ -0,0 +1,3 @@
+//go:build linux && go1.2
+
+package go1_2
diff --git a/src/go/parser/testdata/goversion/t03.go b/src/go/parser/testdata/goversion/t03.go
new file mode 100644
index 0000000..97fc9ae
--- /dev/null
+++ b/src/go/parser/testdata/goversion/t03.go
@@ -0,0 +1,3 @@
+//go:build linux && go1.2 || windows
+
+package none
diff --git a/src/go/parser/testdata/goversion/t04.go b/src/go/parser/testdata/goversion/t04.go
new file mode 100644
index 0000000..e81f9c0
--- /dev/null
+++ b/src/go/parser/testdata/goversion/t04.go
@@ -0,0 +1,5 @@
+// copyright notice
+
+//go:build (linux && go1.2) || (windows && go1.1)
+
+package go1_1
diff --git a/src/go/parser/testdata/goversion/t05.go b/src/go/parser/testdata/goversion/t05.go
new file mode 100644
index 0000000..42c6b33
--- /dev/null
+++ b/src/go/parser/testdata/goversion/t05.go
@@ -0,0 +1,3 @@
+//go:build linux && go1.2 && go1.4
+
+package go1_4
diff --git a/src/go/parser/testdata/goversion/t06.go b/src/go/parser/testdata/goversion/t06.go
new file mode 100644
index 0000000..22944de
--- /dev/null
+++ b/src/go/parser/testdata/goversion/t06.go
@@ -0,0 +1,3 @@
+//go:build go1
+
+package go1
diff --git a/src/go/printer/printer.go b/src/go/printer/printer.go
index 741e3f7..5cf4e4b 100644
--- a/src/go/printer/printer.go
+++ b/src/go/printer/printer.go
@@ -75,10 +75,11 @@
 	// white space). If there's a difference and SourcePos is set in
 	// ConfigMode, //line directives 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
+	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
+	sourcePosErr error          // if non-nil, the first error emitting a //line directive
 
 	// The list of all source comments, in order of appearance.
 	comments        []*ast.CommentGroup // may be nil
@@ -196,6 +197,13 @@
 // writeLineDirective writes a //line directive if necessary.
 func (p *printer) writeLineDirective(pos token.Position) {
 	if pos.IsValid() && (p.out.Line != pos.Line || p.out.Filename != pos.Filename) {
+		if strings.ContainsAny(pos.Filename, "\r\n") {
+			if p.sourcePosErr == nil {
+				p.sourcePosErr = fmt.Errorf("go/printer: source filename contains unexpected newline character: %q", pos.Filename)
+			}
+			return
+		}
+
 		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)
@@ -805,7 +813,7 @@
 	return
 }
 
-// whiteWhitespace writes the first n whitespace entries.
+// writeWhitespace writes the first n whitespace entries.
 func (p *printer) writeWhitespace(n int) {
 	// write entries
 	for i := 0; i < n; i++ {
@@ -1169,7 +1177,7 @@
 		goto unsupported
 	}
 
-	return nil
+	return p.sourcePosErr
 
 unsupported:
 	return fmt.Errorf("go/printer: unsupported node type %T", node)
diff --git a/src/go/printer/printer_test.go b/src/go/printer/printer_test.go
index cb62b3e..3a8ce60 100644
--- a/src/go/printer/printer_test.go
+++ b/src/go/printer/printer_test.go
@@ -797,3 +797,31 @@
 		t.Fatalf("got %q, want %q", got, want)
 	}
 }
+
+func TestSourcePosNewline(t *testing.T) {
+	// We don't provide a syntax for escaping or unescaping characters in line
+	// directives (see https://go.dev/issue/24183#issuecomment-372449628).
+	// As a result, we cannot write a line directive with the correct path for a
+	// filename containing newlines. We should return an error rather than
+	// silently dropping or mangling it.
+
+	fname := "foo\nbar/bar.go"
+	src := `package bar`
+	fset := token.NewFileSet()
+	f, err := parser.ParseFile(fset, fname, src, parser.ParseComments|parser.AllErrors|parser.SkipObjectResolution)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	cfg := &Config{
+		Mode:     SourcePos, // emit line comments
+		Tabwidth: 8,
+	}
+	var buf bytes.Buffer
+	if err := cfg.Fprint(&buf, fset, f); err == nil {
+		t.Errorf("Fprint did not error for source file path containing newline")
+	}
+	if buf.Len() != 0 {
+		t.Errorf("unexpected Fprint output:\n%s", buf.Bytes())
+	}
+}
diff --git a/src/go/scanner/scanner.go b/src/go/scanner/scanner.go
index 16958d2..75f835d 100644
--- a/src/go/scanner/scanner.go
+++ b/src/go/scanner/scanner.go
@@ -253,13 +253,17 @@
 		return
 	}
 
+	// Put a cap on the maximum size of line and column numbers.
+	// 30 bits allows for some additional space before wrapping an int32.
+	// Keep this consistent with cmd/compile/internal/syntax.PosMax.
+	const maxLineCol = 1 << 30
 	var line, col int
 	i2, n2, ok2 := trailingDigits(text[:i-1])
 	if ok2 {
 		//line filename:line:col
 		i, i2 = i2, i
 		line, col = n2, n
-		if col == 0 {
+		if col == 0 || col > maxLineCol {
 			s.error(offs+i2, "invalid column number: "+string(text[i2:]))
 			return
 		}
@@ -269,7 +273,7 @@
 		line = n
 	}
 
-	if line == 0 {
+	if line == 0 || line > maxLineCol {
 		s.error(offs+i, "invalid line number: "+string(text[i:]))
 		return
 	}
diff --git a/src/go/scanner/scanner_test.go b/src/go/scanner/scanner_test.go
index 4f320ee..9046148 100644
--- a/src/go/scanner/scanner_test.go
+++ b/src/go/scanner/scanner_test.go
@@ -351,7 +351,7 @@
 			break
 		}
 		if tok == token.SEMICOLON && lit != ";" {
-			// Artifical semicolon:
+			// Artificial semicolon:
 			// assert that position is EOF or that of a newline.
 			off := file.Offset(pos)
 			if off != len(input) && input[off] != '\n' {
diff --git a/src/go/token/position.go b/src/go/token/position.go
index cbc2ddb..a644382 100644
--- a/src/go/token/position.go
+++ b/src/go/token/position.go
@@ -7,6 +7,7 @@
 import (
 	"fmt"
 	"sort"
+	"strconv"
 	"sync"
 	"sync/atomic"
 )
@@ -41,7 +42,7 @@
 		if s != "" {
 			s += ":"
 		}
-		s += fmt.Sprintf("%d", pos.Line)
+		s += strconv.Itoa(pos.Line)
 		if pos.Column != 0 {
 			s += fmt.Sprintf(":%d", pos.Column)
 		}
@@ -159,6 +160,15 @@
 	f.lines = f.lines[:len(f.lines)-1]
 }
 
+// Lines returns the effective line offset table of the form described by SetLines.
+// Callers must not mutate the result.
+func (f *File) Lines() []int {
+	f.mutex.Lock()
+	lines := f.lines
+	f.mutex.Unlock()
+	return lines
+}
+
 // 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}.
@@ -392,7 +402,6 @@
 	b := s.base
 	s.mutex.RUnlock()
 	return b
-
 }
 
 // AddFile adds a new file with a given filename, base offset, and file size
diff --git a/src/go/token/position_test.go b/src/go/token/position_test.go
index 65cb242..19774a9 100644
--- a/src/go/token/position_test.go
+++ b/src/go/token/position_test.go
@@ -130,6 +130,9 @@
 		if f.LineCount() != len(test.lines) {
 			t.Errorf("%s, SetLines: got line count %d; want %d", f.Name(), f.LineCount(), len(test.lines))
 		}
+		if !reflect.DeepEqual(f.Lines(), test.lines) {
+			t.Errorf("%s, Lines after SetLines(v): got %v; want %v", f.Name(), f.Lines(), test.lines)
+		}
 		verifyPositions(t, fset, f, test.lines)
 
 		// add lines with SetLinesForContent and verify all positions
diff --git a/src/go/types/api.go b/src/go/types/api.go
index eda41b3..ad4c1a2 100644
--- a/src/go/types/api.go
+++ b/src/go/types/api.go
@@ -114,11 +114,11 @@
 	// type checker will initialize this field with a newly created context.
 	Context *Context
 
-	// GoVersion describes the accepted Go language version. The string
-	// must follow the format "go%d.%d" (e.g. "go1.12") or it must be
-	// empty; an empty string indicates the latest language version.
-	// If the format is invalid, invoking the type checker will cause a
-	// panic.
+	// GoVersion describes the accepted Go language version. The string must
+	// start with a prefix of the form "go%d.%d" (e.g. "go1.20", "go1.21rc1", or
+	// "go1.21.0") or it must be empty; an empty string disables Go language
+	// version checks. If the format is invalid, invoking the type checker will
+	// result in an error.
 	GoVersion string
 
 	// If IgnoreFuncBodies is set, function bodies are not
@@ -143,6 +143,9 @@
 	// It is an error to set both FakeImportC and go115UsesCgo.
 	go115UsesCgo bool
 
+	// If _Trace is set, a debug trace is printed to stdout.
+	_Trace 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
@@ -168,10 +171,11 @@
 	// for unused imports.
 	DisableUnusedImportCheck bool
 
-	// If oldComparableSemantics is set, ordinary (non-type parameter)
-	// interfaces do not satisfy the comparable constraint.
-	// TODO(gri) remove this flag for Go 1.21
-	oldComparableSemantics bool
+	// If a non-empty _ErrorURL format string is provided, it is used
+	// to format an error URL link that is appended to the first line
+	// of an error message. ErrorURL must be a format string containing
+	// exactly one "%s" format, e.g. "[go.dev/e/%s]".
+	_ErrorURL string
 }
 
 func srcimporter_setUsesCgo(conf *Config) {
@@ -283,6 +287,10 @@
 	InitOrder []*Initializer
 }
 
+func (info *Info) recordTypes() bool {
+	return info.Types != nil
+}
+
 // 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 {
@@ -430,7 +438,7 @@
 	if T.Underlying() == Typ[Invalid] {
 		return false
 	}
-	return (*Checker)(nil).newAssertableTo(V, T)
+	return (*Checker)(nil).newAssertableTo(nopos, V, T, nil)
 }
 
 // AssignableTo reports whether a value of type V is assignable to a variable
@@ -468,7 +476,7 @@
 	if V.Underlying() == Typ[Invalid] {
 		return false
 	}
-	return (*Checker)(nil).implements(V, T, false, nil)
+	return (*Checker)(nil).implements(0, V, T, false, nil)
 }
 
 // Satisfies reports whether type V satisfies the constraint T.
@@ -476,17 +484,20 @@
 // The behavior of Satisfies is unspecified if V is Typ[Invalid] or an uninstantiated
 // generic type.
 func Satisfies(V Type, T *Interface) bool {
-	return (*Checker)(nil).implements(V, T, true, nil)
+	return (*Checker)(nil).implements(0, V, T, true, nil)
 }
 
 // Identical reports whether x and y are identical types.
 // Receivers of Signature types are ignored.
 func Identical(x, y Type) bool {
-	return identical(x, y, true, nil)
+	var c comparer
+	return c.identical(x, y, nil)
 }
 
 // IdenticalIgnoreTags reports whether x and y are identical types if tags are ignored.
 // Receivers of Signature types are ignored.
 func IdenticalIgnoreTags(x, y Type) bool {
-	return identical(x, y, false, nil)
+	var c comparer
+	c.ignoreTags = true
+	return c.identical(x, y, nil)
 }
diff --git a/src/go/types/api_test.go b/src/go/types/api_test.go
index 98ef6c4..a4ce86f 100644
--- a/src/go/types/api_test.go
+++ b/src/go/types/api_test.go
@@ -21,39 +21,51 @@
 	. "go/types"
 )
 
-func parse(fset *token.FileSet, filename, src string) (*ast.File, error) {
-	return parser.ParseFile(fset, filename, src, 0)
-}
+// nopos indicates an unknown position
+var nopos token.Pos
 
-func mustParse(fset *token.FileSet, filename, src string) *ast.File {
-	f, err := parse(fset, filename, src)
+func mustParse(fset *token.FileSet, src string) *ast.File {
+	f, err := parser.ParseFile(fset, pkgName(src), src, 0)
 	if err != nil {
 		panic(err) // so we don't need to pass *testing.T
 	}
 	return f
 }
 
-func typecheck(path, src string, info *Info) (*Package, error) {
+func typecheck(src string, conf *Config, info *Info) (*Package, error) {
 	fset := token.NewFileSet()
-	f, err := parse(fset, path, src)
-	if f == nil { // ignore errors unless f is nil
-		return nil, err
-	}
-	conf := Config{
-		Error:    func(err error) {}, // collect all errors
-		Importer: importer.Default(),
+	f := mustParse(fset, src)
+	if conf == nil {
+		conf = &Config{
+			Error:    func(err error) {}, // collect all errors
+			Importer: importer.Default(),
+		}
 	}
 	return conf.Check(f.Name.Name, fset, []*ast.File{f}, info)
 }
 
-func mustTypecheck(path, src string, info *Info) *Package {
-	pkg, err := typecheck(path, src, info)
+func mustTypecheck(src string, conf *Config, info *Info) *Package {
+	pkg, err := typecheck(src, conf, info)
 	if err != nil {
 		panic(err) // so we don't need to pass *testing.T
 	}
 	return pkg
 }
 
+// pkgName extracts the package name from src, which must contain a package header.
+func pkgName(src string) string {
+	const kw = "package "
+	if i := strings.Index(src, kw); i >= 0 {
+		after := src[i+len(kw):]
+		n := len(after)
+		if i := strings.IndexAny(after, "\n\t ;/"); i >= 0 {
+			n = i
+		}
+		return after[:n]
+	}
+	panic("missing package header: " + src)
+}
+
 func TestValuesInfo(t *testing.T) {
 	var tests = []struct {
 		src  string
@@ -129,15 +141,15 @@
 		{`package f6b; var _            =  1e-2000i`, `1e-2000i`, `complex128`, `(0 + 0i)`},
 		{`package f7b; var _            = -1e-2000i`, `-1e-2000i`, `complex128`, `(0 + 0i)`},
 
-		{`package g0; const (a = len([iota]int{}); b; c); const _ = c`, `c`, `int`, `2`}, // issue #22341
-		{`package g1; var(j int32; s int; n = 1.0<<s == j)`, `1.0`, `int32`, `1`},        // issue #48422
+		{`package g0; const (a = len([iota]int{}); b; c); const _ = c`, `c`, `int`, `2`}, // go.dev/issue/22341
+		{`package g1; var(j int32; s int; n = 1.0<<s == j)`, `1.0`, `int32`, `1`},        // go.dev/issue/48422
 	}
 
 	for _, test := range tests {
 		info := Info{
 			Types: make(map[ast.Expr]TypeAndValue),
 		}
-		name := mustTypecheck("ValuesInfo", test.src, &info).Name()
+		name := mustTypecheck(test.src, nil, &info).Name()
 
 		// look for expression
 		var expr ast.Expr
@@ -243,7 +255,7 @@
 			`(string, bool)`,
 		},
 
-		// issue 6796
+		// go.dev/issue/6796
 		{`package issue6796_a; var x interface{}; var _, _ = (x.(int))`,
 			`x.(int)`,
 			`(int, bool)`,
@@ -265,7 +277,7 @@
 			`(string, bool)`,
 		},
 
-		// issue 7060
+		// go.dev/issue/7060
 		{`package issue7060_a; var ( m map[int]string; x, ok = m[0] )`,
 			`m[0]`,
 			`(string, bool)`,
@@ -291,7 +303,7 @@
 			`(string, bool)`,
 		},
 
-		// issue 28277
+		// go.dev/issue/28277
 		{`package issue28277_a; func f(...int)`,
 			`...int`,
 			`[]int`,
@@ -301,7 +313,7 @@
 			`[][]struct{}`,
 		},
 
-		// issue 47243
+		// go.dev/issue/47243
 		{`package issue47243_a; var x int32; var _ = x << 3`, `3`, `untyped int`},
 		{`package issue47243_b; var x int32; var _ = x << 3.`, `3.`, `untyped float`},
 		{`package issue47243_c; var x int32; var _ = 1 << x`, `1 << x`, `int`},
@@ -313,10 +325,10 @@
 		{`package issue47243_i; var x int32; var _ = 1 << (2 << x)`, `(2 << x)`, `untyped int`},
 		{`package issue47243_j; var x int32; var _ = 1 << (2 << x)`, `2`, `untyped int`},
 
-		// tests for broken code that doesn't parse or type-check
+		// tests for broken code that doesn't type-check
 		{broken + `x0; func _() { var x struct {f string}; x.f := 0 }`, `x.f`, `string`},
 		{broken + `x1; func _() { var z string; type x struct {f string}; y := &x{q: z}}`, `z`, `string`},
-		{broken + `x2; func _() { var a, b string; type x struct {f string}; z := &x{f: a; f: b;}}`, `b`, `string`},
+		{broken + `x2; func _() { var a, b string; type x struct {f string}; z := &x{f: a, f: b,}}`, `b`, `string`},
 		{broken + `x3; var x = panic("");`, `panic`, `func(interface{})`},
 		{`package x4; func _() { panic("") }`, `panic`, `func(interface{})`},
 		{broken + `x5; func _() { var x map[string][...]int; x = map[string][...]int{"": {1,2,3}} }`, `x`, `map[string]invalid type`},
@@ -339,13 +351,13 @@
 		// instantiated types must be sanitized
 		{`package g0; type t[P any] int; var x struct{ f t[int] }; var _ = x.f`, `x.f`, `g0.t[int]`},
 
-		// issue 45096
+		// go.dev/issue/45096
 		{`package issue45096; func _[T interface{ ~int8 | ~int16 | ~int32  }](x T) { _ = x < 0 }`, `0`, `T`},
 
-		// issue 47895
+		// go.dev/issue/47895
 		{`package p; import "unsafe"; type S struct { f int }; var s S; var _ = unsafe.Offsetof(s.f)`, `s.f`, `int`},
 
-		// issue 50093
+		// go.dev/issue/50093
 		{`package u0a; func _[_ interface{int}]() {}`, `int`, `int`},
 		{`package u1a; func _[_ interface{~int}]() {}`, `~int`, `~int`},
 		{`package u2a; func _[_ interface{int | string}]() {}`, `int | string`, `int | string`},
@@ -369,13 +381,33 @@
 		{`package u3c; type _ interface{int | string | ~bool}`, `int | string`, `int | string`},
 		{`package u3c; type _ interface{int | string | ~bool}`, `~bool`, `~bool`},
 		{`package u3c; type _ interface{int | string | ~float64|~bool}`, `int | string | ~float64`, `int | string | ~float64`},
+
+		// reverse type inference
+		{`package r1; var _ func(int) = g; func g[P any](P) {}`, `g`, `func(int)`},
+		{`package r2; var _ func(int) = g[int]; func g[P any](P) {}`, `g`, `func[P any](P)`}, // go.dev/issues/60212
+		{`package r3; var _ func(int) = g[int]; func g[P any](P) {}`, `g[int]`, `func(int)`},
+		{`package r4; var _ func(int, string) = g; func g[P, Q any](P, Q) {}`, `g`, `func(int, string)`},
+		{`package r5; var _ func(int, string) = g[int]; func g[P, Q any](P, Q) {}`, `g`, `func[P, Q any](P, Q)`}, // go.dev/issues/60212
+		{`package r6; var _ func(int, string) = g[int]; func g[P, Q any](P, Q) {}`, `g[int]`, `func(int, string)`},
+
+		{`package s1; func _() { f(g) }; func f(func(int)) {}; func g[P any](P) {}`, `g`, `func(int)`},
+		{`package s2; func _() { f(g[int]) }; func f(func(int)) {}; func g[P any](P) {}`, `g`, `func[P any](P)`}, // go.dev/issues/60212
+		{`package s3; func _() { f(g[int]) }; func f(func(int)) {}; func g[P any](P) {}`, `g[int]`, `func(int)`},
+		{`package s4; func _() { f(g) }; func f(func(int, string)) {}; func g[P, Q any](P, Q) {}`, `g`, `func(int, string)`},
+		{`package s5; func _() { f(g[int]) }; func f(func(int, string)) {}; func g[P, Q any](P, Q) {}`, `g`, `func[P, Q any](P, Q)`}, // go.dev/issues/60212
+		{`package s6; func _() { f(g[int]) }; func f(func(int, string)) {}; func g[P, Q any](P, Q) {}`, `g[int]`, `func(int, string)`},
+
+		{`package s7; func _() { f(g, h) }; func f[P any](func(int, P), func(P, string)) {}; func g[P any](P, P) {}; func h[P, Q any](P, Q) {}`, `g`, `func(int, int)`},
+		{`package s8; func _() { f(g, h) }; func f[P any](func(int, P), func(P, string)) {}; func g[P any](P, P) {}; func h[P, Q any](P, Q) {}`, `h`, `func(int, string)`},
+		{`package s9; func _() { f(g, h[int]) }; func f[P any](func(int, P), func(P, string)) {}; func g[P any](P, P) {}; func h[P, Q any](P, Q) {}`, `h`, `func[P, Q any](P, Q)`}, // go.dev/issues/60212
+		{`package s10; func _() { f(g, h[int]) }; func f[P any](func(int, P), func(P, string)) {}; func g[P any](P, P) {}; func h[P, Q any](P, Q) {}`, `h[int]`, `func(int, string)`},
 	}
 
 	for _, test := range tests {
 		info := Info{Types: make(map[ast.Expr]TypeAndValue)}
 		var name string
 		if strings.HasPrefix(test.src, broken) {
-			pkg, err := typecheck("TypesInfo", test.src, &info)
+			pkg, err := typecheck(test.src, nil, &info)
 			if err == nil {
 				t.Errorf("package %s: expected to fail but passed", pkg.Name())
 				continue
@@ -384,7 +416,7 @@
 				name = pkg.Name()
 			}
 		} else {
-			name = mustTypecheck("TypesInfo", test.src, &info).Name()
+			name = mustTypecheck(test.src, nil, &info).Name()
 		}
 
 		// look for expression type
@@ -402,7 +434,7 @@
 
 		// check that type is correct
 		if got := typ.String(); got != test.typ {
-			t.Errorf("package %s: got %s; want %s", name, got, test.typ)
+			t.Errorf("package %s: expr = %s: got %s; want %s", name, test.expr, got, test.typ)
 		}
 	}
 }
@@ -538,19 +570,62 @@
 		{`package issue51803; func foo[T any](T) {}; func _() { foo[int]( /* leave arg away on purpose */ ) }`,
 			[]testInst{{`foo`, []string{`int`}, `func(int)`}},
 		},
+
+		// reverse type inference
+		{`package reverse1a; var f func(int) = g; func g[P any](P) {}`,
+			[]testInst{{`g`, []string{`int`}, `func(int)`}},
+		},
+		{`package reverse1b; func f(func(int)) {}; func g[P any](P) {}; func _() { f(g) }`,
+			[]testInst{{`g`, []string{`int`}, `func(int)`}},
+		},
+		{`package reverse2a; var f func(int, string) = g; func g[P, Q any](P, Q) {}`,
+			[]testInst{{`g`, []string{`int`, `string`}, `func(int, string)`}},
+		},
+		{`package reverse2b; func f(func(int, string)) {}; func g[P, Q any](P, Q) {}; func _() { f(g) }`,
+			[]testInst{{`g`, []string{`int`, `string`}, `func(int, string)`}},
+		},
+		{`package reverse2c; func f(func(int, string)) {}; func g[P, Q any](P, Q) {}; func _() { f(g[int]) }`,
+			[]testInst{{`g`, []string{`int`, `string`}, `func(int, string)`}},
+		},
+		// reverse3a not possible (cannot assign to generic function outside of argument passing)
+		{`package reverse3b; func f[R any](func(int) R) {}; func g[P any](P) string { return "" }; func _() { f(g) }`,
+			[]testInst{
+				{`f`, []string{`string`}, `func(func(int) string)`},
+				{`g`, []string{`int`}, `func(int) string`},
+			},
+		},
+		{`package reverse4a; var _, _ func([]int, *float32) = g, h; func g[P, Q any]([]P, *Q) {}; func h[R any]([]R, *float32) {}`,
+			[]testInst{
+				{`g`, []string{`int`, `float32`}, `func([]int, *float32)`},
+				{`h`, []string{`int`}, `func([]int, *float32)`},
+			},
+		},
+		{`package reverse4b; func f(_, _ func([]int, *float32)) {}; func g[P, Q any]([]P, *Q) {}; func h[R any]([]R, *float32) {}; func _() { f(g, h) }`,
+			[]testInst{
+				{`g`, []string{`int`, `float32`}, `func([]int, *float32)`},
+				{`h`, []string{`int`}, `func([]int, *float32)`},
+			},
+		},
+		{`package issue59956; func f(func(int), func(string), func(bool)) {}; func g[P any](P) {}; func _() { f(g, g, g) }`,
+			[]testInst{
+				{`g`, []string{`int`}, `func(int)`},
+				{`g`, []string{`string`}, `func(string)`},
+				{`g`, []string{`bool`}, `func(bool)`},
+			},
+		},
 	}
 
 	for _, test := range tests {
 		imports := make(testImporter)
-		conf := Config{
-			Importer: imports,
-			Error:    func(error) {}, // ignore errors
-		}
+		conf := Config{Importer: imports}
 		instMap := make(map[*ast.Ident]Instance)
 		useMap := make(map[*ast.Ident]Object)
 		makePkg := func(src string) *Package {
-			f := mustParse(fset, "p.go", src)
-			pkg, _ := conf.Check("", fset, []*ast.File{f}, &Info{Instances: instMap, Uses: useMap})
+			pkg, err := typecheck(src, &conf, &Info{Instances: instMap, Uses: useMap})
+			// allow error for issue51803
+			if err != nil && (pkg == nil || pkg.Name() != "issue51803") {
+				t.Fatal(err)
+			}
 			imports[pkg.Name()] = pkg
 			return pkg
 		}
@@ -617,7 +692,7 @@
 		instances = append(instances, recordedInstance{id, inst})
 	}
 	sort.Slice(instances, func(i, j int) bool {
-		return instances[i].Ident.Pos() < instances[j].Ident.Pos()
+		return CmpPos(instances[i].Ident.Pos(), instances[j].Ident.Pos()) < 0
 	})
 	return instances
 }
@@ -645,7 +720,7 @@
 		info := Info{
 			Defs: make(map[*ast.Ident]Object),
 		}
-		name := mustTypecheck("DefsInfo", test.src, &info).Name()
+		name := mustTypecheck(test.src, nil, &info).Name()
 
 		// find object
 		var def Object
@@ -712,7 +787,7 @@
 		info := Info{
 			Uses: make(map[*ast.Ident]Object),
 		}
-		name := mustTypecheck("UsesInfo", test.src, &info).Name()
+		name := mustTypecheck(test.src, nil, &info).Name()
 
 		// find object
 		var use Object
@@ -745,7 +820,7 @@
 func (r *N[C]) n() {  }
 `
 	fset := token.NewFileSet()
-	f := mustParse(fset, "p.go", src)
+	f := mustParse(fset, src)
 	info := Info{
 		Defs:       make(map[*ast.Ident]Object),
 		Uses:       make(map[*ast.Ident]Object),
@@ -853,7 +928,7 @@
 		info := Info{
 			Implicits: make(map[ast.Node]Object),
 		}
-		name := mustTypecheck("ImplicitsInfo", test.src, &info).Name()
+		name := mustTypecheck(test.src, nil, &info).Name()
 
 		// the test cases expect at most one Implicits entry
 		if len(info.Implicits) > 1 {
@@ -981,7 +1056,7 @@
 
 	for _, test := range tests {
 		info := Info{Types: make(map[ast.Expr]TypeAndValue)}
-		name := mustTypecheck("PredicatesInfo", test.src, &info).Name()
+		name := mustTypecheck(test.src, nil, &info).Name()
 
 		// look for expression predicates
 		got := "<missing>"
@@ -1073,7 +1148,7 @@
 
 	for _, test := range tests {
 		info := Info{Scopes: make(map[ast.Node]*Scope)}
-		name := mustTypecheck("ScopesInfo", test.src, &info).Name()
+		name := mustTypecheck(test.src, nil, &info).Name()
 
 		// number of scopes must match
 		if len(info.Scopes) != len(test.scopes) {
@@ -1184,7 +1259,7 @@
 		}`, []string{
 			"d = 3", "b = f()", "c = f()", "a = c + b",
 		}},
-		// test case for issue 7131
+		// test case for go.dev/issue/7131
 		{`package main
 
 		var counter int
@@ -1199,7 +1274,7 @@
 		`, []string{
 			"a = next()", "b = next()", "c = next()", "d = next()", "e = next()", "f = next()", "_ = makeOrder()",
 		}},
-		// test case for issue 10709
+		// test case for go.dev/issue/10709
 		{`package p13
 
 		var (
@@ -1219,7 +1294,7 @@
 		}`, []string{
 			"t = makeT(0)", "v = t.m()",
 		}},
-		// test case for issue 10709: same as test before, but variable decls swapped
+		// test case for go.dev/issue/10709: same as test before, but variable decls swapped
 		{`package p14
 
 		var (
@@ -1239,7 +1314,7 @@
 		}`, []string{
 			"t = makeT(0)", "v = t.m()",
 		}},
-		// another candidate possibly causing problems with issue 10709
+		// another candidate possibly causing problems with go.dev/issue/10709
 		{`package p15
 
 		var y1 = f1()
@@ -1261,7 +1336,7 @@
 
 	for _, test := range tests {
 		info := Info{}
-		name := mustTypecheck("InitOrderInfo", test.src, &info).Name()
+		name := mustTypecheck(test.src, nil, &info).Name()
 
 		// number of initializers must match
 		if len(info.InitOrder) != len(test.inits) {
@@ -1282,8 +1357,8 @@
 
 func TestMultiFileInitOrder(t *testing.T) {
 	fset := token.NewFileSet()
-	fileA := mustParse(fset, "", `package main; var a = 1`)
-	fileB := mustParse(fset, "", `package main; var b = 2`)
+	fileA := mustParse(fset, `package main; var a = 1`)
+	fileB := mustParse(fset, `package main; var b = 2`)
 
 	// The initialization order must not depend on the parse
 	// order of the files, only on the presentation order to
@@ -1319,10 +1394,8 @@
 	var info Info
 	check := NewChecker(&conf, fset, pkg, &info)
 
-	for i, src := range sources {
-		filename := fmt.Sprintf("sources%d", i)
-		f := mustParse(fset, filename, src)
-		if err := check.Files([]*ast.File{f}); err != nil {
+	for _, src := range sources {
+		if err := check.Files([]*ast.File{mustParse(fset, src)}); err != nil {
 			t.Error(err)
 		}
 	}
@@ -1351,12 +1424,13 @@
 func TestSelection(t *testing.T) {
 	selections := make(map[*ast.SelectorExpr]*Selection)
 
+	// We need a specific fileset in this test below for positions.
+	// Cannot use typecheck helper.
 	fset := token.NewFileSet()
 	imports := make(testImporter)
 	conf := Config{Importer: imports}
 	makePkg := func(path, src string) {
-		f := mustParse(fset, path+".go", src)
-		pkg, err := conf.Check(path, fset, []*ast.File{f}, &Info{Selections: selections})
+		pkg, err := conf.Check(path, fset, []*ast.File{mustParse(fset, src)}, &Info{Selections: selections})
 		if err != nil {
 			t.Fatal(err)
 		}
@@ -1533,9 +1607,7 @@
 		Importer: imports,
 	}
 	makePkg := func(path, src string) {
-		f := mustParse(fset, path, src)
-		pkg, _ := conf.Check(path, fset, []*ast.File{f}, nil) // errors logged via conf.Error
-		imports[path] = pkg
+		imports[path], _ = conf.Check(path, fset, []*ast.File{mustParse(fset, src)}, nil) // errors logged via conf.Error
 	}
 
 	const libSrc = `
@@ -1556,6 +1628,32 @@
 	makePkg("main", mainSrc) // don't crash when type-checking this package
 }
 
+func TestIssue59603(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) {
+		imports[path], _ = conf.Check(path, fset, []*ast.File{mustParse(fset, src)}, nil) // errors logged via conf.Error
+	}
+
+	const libSrc = `
+package a
+const C = foo
+`
+
+	const mainSrc = `
+package main
+import "a"
+const _ = a.C
+`
+
+	makePkg("a", libSrc)
+	makePkg("main", mainSrc) // don't crash when type-checking this package
+}
+
 func TestLookupFieldOrMethodOnNil(t *testing.T) {
 	// LookupFieldOrMethod on a nil type is expected to produce a run-time panic.
 	defer func() {
@@ -1617,13 +1715,13 @@
 		// outside method set of a generic type
 		{"var x T[int]; type T[P any] struct{}; func (*T[P]) f() {}", false, nil, true},
 
-		// recursive generic types; see golang/go#52715
+		// recursive generic types; see go.dev/issue/52715
 		{"var a T[int]; type ( T[P any] struct { *N[P] }; N[P any] struct { *T[P] } ); func (N[P]) f() {}", true, []int{0, 0}, true},
 		{"var a T[int]; type ( T[P any] struct { *N[P] }; N[P any] struct { *T[P] } ); func (T[P]) f() {}", true, []int{0}, false},
 	}
 
 	for _, test := range tests {
-		pkg := mustTypecheck("test", "package p;"+test.src, nil)
+		pkg := mustTypecheck("package p;"+test.src, nil, nil)
 
 		obj := pkg.Scope().Lookup("a")
 		if obj == nil {
@@ -1650,7 +1748,7 @@
 	}
 }
 
-// Test for golang/go#52715
+// Test for go.dev/issue/52715
 func TestLookupFieldOrMethod_RecursiveGeneric(t *testing.T) {
 	const src = `
 package pkg
@@ -1669,7 +1767,7 @@
 `
 
 	fset := token.NewFileSet()
-	f := mustParse(fset, "foo.go", src)
+	f := mustParse(fset, src)
 	pkg := NewPackage("pkg", f.Name.Name)
 	if err := NewChecker(nil, fset, pkg, nil).Files([]*ast.File{f}); err != nil {
 		panic(err)
@@ -1706,7 +1804,7 @@
 		}
 	}
 
-	makePkg("lib", mustParse(fset, "", "package lib; var X int"))
+	makePkg("lib", mustParse(fset, "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.
@@ -1750,7 +1848,7 @@
 `
 
 	info.Uses = make(map[*ast.Ident]Object)
-	f := mustParse(fset, "", mainSrc)
+	f := mustParse(fset, mainSrc)
 	makePkg("main", f)
 	mainScope := imports["main"].Scope()
 	rx := regexp.MustCompile(`^/\*(\w*)=([\w:]*)\*/$`)
@@ -1816,7 +1914,7 @@
 // newDefined creates a new defined type named T with the given underlying type.
 // Helper function for use with TestIncompleteInterfaces only.
 func newDefined(underlying Type) *Named {
-	tname := NewTypeName(token.NoPos, nil, "T", nil)
+	tname := NewTypeName(nopos, nil, "T", nil)
 	return NewNamed(tname, underlying, nil)
 }
 
@@ -1892,7 +1990,7 @@
 		{`func X(int) string { return "" }; func Y(int) {}`, false},
 
 		// Generic functions. Type parameters should be considered identical modulo
-		// renaming. See also issue #49722.
+		// renaming. See also go.dev/issue/49722.
 		{`func X[P ~int](){}; func Y[Q ~int]() {}`, true},
 		{`func X[P1 any, P2 ~*P1](){}; func Y[Q1 any, Q2 ~*Q1]() {}`, true},
 		{`func X[P1 any, P2 ~[]P1](){}; func Y[Q1 any, Q2 ~*Q1]() {}`, false},
@@ -1902,7 +2000,7 @@
 	}
 
 	for _, test := range tests {
-		pkg := mustTypecheck("test", "package p;"+test.src, nil)
+		pkg := mustTypecheck("package p;"+test.src, nil, nil)
 		X := pkg.Scope().Lookup("X")
 		Y := pkg.Scope().Lookup("Y")
 		if X == nil || Y == nil {
@@ -1932,7 +2030,7 @@
 }
 
 func TestIdenticalUnions(t *testing.T) {
-	tname := NewTypeName(token.NoPos, nil, "myInt", nil)
+	tname := NewTypeName(nopos, nil, "myInt", nil)
 	myInt := NewNamed(tname, Typ[Int], nil)
 	tmap := map[string]*Term{
 		"int":     NewTerm(false, Typ[Int]),
@@ -1973,10 +2071,33 @@
 	}
 }
 
+func TestIssue61737(t *testing.T) {
+	// This test verifies that it is possible to construct invalid interfaces
+	// containing duplicate methods using the go/types API.
+	//
+	// It must be possible for importers to construct such invalid interfaces.
+	// Previously, this panicked.
+
+	sig1 := NewSignatureType(nil, nil, nil, NewTuple(NewParam(nopos, nil, "", Typ[Int])), nil, false)
+	sig2 := NewSignatureType(nil, nil, nil, NewTuple(NewParam(nopos, nil, "", Typ[String])), nil, false)
+
+	methods := []*Func{
+		NewFunc(nopos, nil, "M", sig1),
+		NewFunc(nopos, nil, "M", sig2),
+	}
+
+	embeddedMethods := []*Func{
+		NewFunc(nopos, nil, "M", sig2),
+	}
+	embedded := NewInterfaceType(embeddedMethods, nil)
+	iface := NewInterfaceType(methods, []Type{embedded})
+	iface.Complete()
+}
+
 func TestIssue15305(t *testing.T) {
 	const src = "package p; func f() int16; var _ = f(undef)"
 	fset := token.NewFileSet()
-	f := mustParse(fset, "issue15305.go", src)
+	f := mustParse(fset, src)
 	conf := Config{
 		Error: func(err error) {}, // allow errors
 	}
@@ -1999,20 +2120,20 @@
 // types for composite literal expressions and composite literal type
 // expressions.
 func TestCompositeLitTypes(t *testing.T) {
-	for _, test := range []struct {
+	for i, test := range []struct {
 		lit, typ string
 	}{
 		{`[16]byte{}`, `[16]byte`},
-		{`[...]byte{}`, `[0]byte`},                // test for issue #14092
-		{`[...]int{1, 2, 3}`, `[3]int`},           // test for issue #14092
-		{`[...]int{90: 0, 98: 1, 2}`, `[100]int`}, // test for issue #14092
+		{`[...]byte{}`, `[0]byte`},                // test for go.dev/issue/14092
+		{`[...]int{1, 2, 3}`, `[3]int`},           // test for go.dev/issue/14092
+		{`[...]int{90: 0, 98: 1, 2}`, `[100]int`}, // test for go.dev/issue/14092
 		{`[]int{}`, `[]int`},
 		{`map[string]bool{"foo": true}`, `map[string]bool`},
 		{`struct{}{}`, `struct{}`},
 		{`struct{x, y int; z complex128}{}`, `struct{x int; y int; z complex128}`},
 	} {
 		fset := token.NewFileSet()
-		f := mustParse(fset, test.lit, "package p; var _ = "+test.lit)
+		f := mustParse(fset, fmt.Sprintf("package p%d; var _ = %s", i, test.lit))
 		types := make(map[ast.Expr]TypeAndValue)
 		if _, err := new(Config).Check("p", fset, []*ast.File{f}, &Info{Types: types}); err != nil {
 			t.Fatalf("%s: %v", test.lit, err)
@@ -2067,7 +2188,7 @@
 `
 
 	fset := token.NewFileSet()
-	f := mustParse(fset, "src", src)
+	f := mustParse(fset, src)
 
 	info := &Info{
 		Defs: make(map[*ast.Ident]Object),
@@ -2126,7 +2247,7 @@
 func f(x T) T { return foo.F(x) }
 `
 	fset := token.NewFileSet()
-	f := mustParse(fset, "src", src)
+	f := mustParse(fset, src)
 	files := []*ast.File{f}
 
 	// type-check using all possible importers
@@ -2181,7 +2302,7 @@
 func TestInstantiate(t *testing.T) {
 	// eventually we like more tests but this is a start
 	const src = "package p; type T[P any] *T[P]"
-	pkg := mustTypecheck(".", src, nil)
+	pkg := mustTypecheck(src, nil, nil)
 
 	// type T should have one type parameter
 	T := pkg.Scope().Lookup("T").Type().(*Named)
@@ -2216,7 +2337,7 @@
 
 	for _, test := range tests {
 		src := "package p; " + test.src
-		pkg := mustTypecheck(".", src, nil)
+		pkg := mustTypecheck(src, nil, nil)
 
 		T := pkg.Scope().Lookup("T").Type().(*Named)
 
@@ -2255,7 +2376,7 @@
 	conf := Config{Importer: imports}
 	makePkg := func(src string) {
 		fset := token.NewFileSet()
-		f := mustParse(fset, "", src)
+		f := mustParse(fset, src)
 		name := f.Name.Name
 		pkg, err := conf.Check(name, fset, []*ast.File{f}, nil)
 		if err != nil {
@@ -2312,7 +2433,7 @@
 		Defs: make(map[*ast.Ident]Object),
 	}
 	fset := token.NewFileSet()
-	f := mustParse(fset, "p.go", src)
+	f := mustParse(fset, src)
 	conf := Config{}
 	pkg, err := conf.Check(f.Name.Name, fset, []*ast.File{f}, info)
 	if err != nil {
@@ -2444,7 +2565,7 @@
 `
 
 	fset := token.NewFileSet()
-	f := mustParse(fset, "p.go", src)
+	f := mustParse(fset, src)
 	conf := Config{Error: func(error) {}}
 	pkg, _ := conf.Check(f.Name.Name, fset, []*ast.File{f}, nil)
 
@@ -2539,7 +2660,7 @@
 func (V4) M()
 `
 
-	pkg := mustTypecheck("p.go", src, nil)
+	pkg := mustTypecheck(src, nil, nil)
 
 	T := pkg.Scope().Lookup("T").Type().Underlying().(*Interface)
 	lookup := func(name string) (*Func, bool) {
@@ -2571,3 +2692,29 @@
 	// V4 has no method m but has M. Should not report wrongType.
 	checkMissingMethod("V4", false)
 }
+
+func TestErrorURL(t *testing.T) {
+	var conf Config
+	*stringFieldAddr(&conf, "_ErrorURL") = " [go.dev/e/%s]"
+
+	// test case for a one-line error
+	const src1 = `
+package p
+var _ T
+`
+	_, err := typecheck(src1, &conf, nil)
+	if err == nil || !strings.HasSuffix(err.Error(), " [go.dev/e/UndeclaredName]") {
+		t.Errorf("src1: unexpected error: got %v", err)
+	}
+
+	// test case for a multi-line error
+	const src2 = `
+package p
+func f() int { return 0 }
+var _ = f(1, 2)
+`
+	_, err = typecheck(src2, &conf, nil)
+	if err == nil || !strings.Contains(err.Error(), " [go.dev/e/WrongArgCount]\n") {
+		t.Errorf("src1: unexpected error: got %v", err)
+	}
+}
diff --git a/src/go/types/array.go b/src/go/types/array.go
index 5b28474..f19ce6e 100644
--- a/src/go/types/array.go
+++ b/src/go/types/array.go
@@ -1,3 +1,5 @@
+// Code generated by "go test -run=Generate -write=all"; DO NOT EDIT.
+
 // Copyright 2011 The Go Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
@@ -21,5 +23,5 @@
 // Elem returns element type of array a.
 func (a *Array) Elem() Type { return a.elem }
 
-func (t *Array) Underlying() Type { return t }
-func (t *Array) String() string   { return TypeString(t, nil) }
+func (a *Array) Underlying() Type { return a }
+func (a *Array) String() string   { return TypeString(a, nil) }
diff --git a/src/go/types/assignments.go b/src/go/types/assignments.go
index 4d5acb1..1ea5114 100644
--- a/src/go/types/assignments.go
+++ b/src/go/types/assignments.go
@@ -9,7 +9,6 @@
 import (
 	"fmt"
 	"go/ast"
-	"go/token"
 	. "internal/types/errors"
 	"strings"
 )
@@ -18,7 +17,7 @@
 // if necessary by attempting to convert untyped values to the appropriate
 // type. context describes the context in which the assignment takes place.
 // Use T == nil to indicate assignment to an untyped blank identifier.
-// x.mode is set to invalid if the assignment failed.
+// If the assignment check fails, x.mode is set to invalid.
 func (check *Checker) assignment(x *operand, T Type, context string) {
 	check.singleValue(x)
 
@@ -28,9 +27,10 @@
 	case constant_, variable, mapindex, value, commaok, commaerr:
 		// ok
 	default:
-		// we may get here because of other problems (issue #39634, crash 12)
+		// we may get here because of other problems (go.dev/issue/39634, crash 12)
 		// TODO(gri) do we need a new "generic" error code here?
 		check.errorf(x, IncompatibleAssign, "cannot assign %s to %s in %s", x, T, context)
+		x.mode = invalid
 		return
 	}
 
@@ -73,10 +73,13 @@
 			check.updateExprType(x.expr, newType, false)
 		}
 	}
+	// x.typ is typed
 
 	// A generic (non-instantiated) function value cannot be assigned to a variable.
 	if sig, _ := under(x.typ).(*Signature); sig != nil && sig.TypeParams().Len() > 0 {
 		check.errorf(x, WrongTypeArgCount, "cannot use generic function %s without instantiation in %s", x, context)
+		x.mode = invalid
+		return
 	}
 
 	// spec: "If a left-hand side is the blank identifier, any typed or
@@ -128,15 +131,20 @@
 	lhs.val = x.val
 }
 
-func (check *Checker) initVar(lhs *Var, x *operand, context string) Type {
+// initVar checks the initialization lhs = x in a variable declaration.
+// If lhs doesn't have a type yet, it is given the type of x,
+// or Typ[Invalid] in case of an error.
+// If the initialization check fails, x.mode is set to invalid.
+func (check *Checker) initVar(lhs *Var, x *operand, context string) {
 	if x.mode == invalid || x.typ == Typ[Invalid] || lhs.typ == Typ[Invalid] {
 		if lhs.typ == nil {
 			lhs.typ = Typ[Invalid]
 		}
-		return nil
+		x.mode = invalid
+		return
 	}
 
-	// If the lhs doesn't have a type yet, use the type of x.
+	// If lhs doesn't have a type yet, use the type of x.
 	if lhs.typ == nil {
 		typ := x.typ
 		if isUntyped(typ) {
@@ -144,7 +152,8 @@
 			if typ == Typ[UntypedNil] {
 				check.errorf(x, UntypedNilUse, "use of untyped nil in %s", context)
 				lhs.typ = Typ[Invalid]
-				return nil
+				x.mode = invalid
+				return
 			}
 			typ = Default(typ)
 		}
@@ -152,33 +161,23 @@
 	}
 
 	check.assignment(x, lhs.typ, context)
-	if x.mode == invalid {
-		return nil
-	}
-
-	return x.typ
 }
 
-func (check *Checker) assignVar(lhs ast.Expr, x *operand) Type {
-	if x.mode == invalid || x.typ == Typ[Invalid] {
-		check.useLHS(lhs)
-		return nil
-	}
-
+// lhsVar checks a lhs variable in an assignment and returns its type.
+// lhsVar takes care of not counting a lhs identifier as a "use" of
+// that identifier. The result is nil if it is the blank identifier,
+// and Typ[Invalid] if it is an invalid lhs expression.
+func (check *Checker) lhsVar(lhs ast.Expr) Type {
 	// 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)
-		check.assignment(x, nil, "assignment to _ identifier")
-		if x.mode == invalid {
-			return nil
-		}
-		return x.typ
+		return nil
 	}
 
-	// If the lhs is an identifier denoting a variable v, this assignment
+	// If the lhs is an identifier denoting a variable v, this reference
 	// is not a 'use' of v. Remember current value of v.used and restore
 	// after evaluating the lhs via check.expr.
 	var v *Var
@@ -195,44 +194,66 @@
 		}
 	}
 
-	var z operand
-	check.expr(&z, lhs)
+	var x operand
+	check.expr(nil, &x, lhs)
+
 	if v != nil {
 		v.used = v_used // restore v.used
 	}
 
-	if z.mode == invalid || z.typ == Typ[Invalid] {
-		return nil
+	if x.mode == invalid || x.typ == Typ[Invalid] {
+		return Typ[Invalid]
 	}
 
 	// spec: "Each left-hand side operand must be addressable, a map index
 	// expression, or the blank identifier. Operands may be parenthesized."
-	switch z.mode {
+	switch x.mode {
 	case invalid:
-		return nil
+		return Typ[Invalid]
 	case variable, mapindex:
 		// ok
 	default:
-		if sel, ok := z.expr.(*ast.SelectorExpr); ok {
+		if sel, ok := x.expr.(*ast.SelectorExpr); ok {
 			var op operand
-			check.expr(&op, sel.X)
+			check.expr(nil, &op, sel.X)
 			if op.mode == mapindex {
-				check.errorf(&z, UnaddressableFieldAssign, "cannot assign to struct field %s in map", ExprString(z.expr))
-				return nil
+				check.errorf(&x, UnaddressableFieldAssign, "cannot assign to struct field %s in map", ExprString(x.expr))
+				return Typ[Invalid]
 			}
 		}
-		check.errorf(&z, UnassignableOperand, "cannot assign to %s", &z)
-		return nil
-	}
-
-	check.assignment(x, z.typ, "assignment")
-	if x.mode == invalid {
-		return nil
+		check.errorf(&x, UnassignableOperand, "cannot assign to %s (neither addressable nor a map index expression)", x.expr)
+		return Typ[Invalid]
 	}
 
 	return x.typ
 }
 
+// assignVar checks the assignment lhs = rhs (if x == nil), or lhs = x (if x != nil).
+// If x != nil, it must be the evaluation of rhs (and rhs will be ignored).
+// If the assignment check fails and x != nil, x.mode is set to invalid.
+func (check *Checker) assignVar(lhs, rhs ast.Expr, x *operand) {
+	T := check.lhsVar(lhs) // nil if lhs is _
+	if T == Typ[Invalid] {
+		if x != nil {
+			x.mode = invalid
+		} else {
+			check.use(rhs)
+		}
+		return
+	}
+
+	if x == nil {
+		x = new(operand)
+		check.expr(T, x, rhs)
+	}
+
+	context := "assignment"
+	if T == nil {
+		context = "assignment to _ identifier"
+	}
+	check.assignment(x, T, context)
+}
+
 // operandTypes returns the list of types for the given operands.
 func operandTypes(list []*operand) (res []Type) {
 	for _, x := range list {
@@ -261,7 +282,7 @@
 		case t == nil:
 			fallthrough // should not happen but be cautious
 		case t == Typ[Invalid]:
-			s = "<T>"
+			s = "unknown type"
 		case isUntyped(t):
 			if isNumeric(t) {
 				// Do not imply a specific type requirement:
@@ -292,9 +313,9 @@
 	return fmt.Sprintf("%d %s", x, unit)
 }
 
-func (check *Checker) assignError(rhs []ast.Expr, nvars, nvals int) {
-	vars := measure(nvars, "variable")
-	vals := measure(nvals, "value")
+func (check *Checker) assignError(rhs []ast.Expr, l, r int) {
+	vars := measure(l, "variable")
+	vals := measure(r, "value")
 	rhs0 := rhs[0]
 
 	if len(rhs) == 1 {
@@ -306,90 +327,159 @@
 	check.errorf(rhs0, WrongAssignCount, "assignment mismatch: %s but %s", vars, vals)
 }
 
-// If returnStmt != nil, initVars is called to type-check the assignment
-// of return expressions, and returnStmt is the return statement.
-func (check *Checker) initVars(lhs []*Var, origRHS []ast.Expr, returnStmt ast.Stmt) {
-	rhs, commaOk := check.exprList(origRHS, len(lhs) == 2 && returnStmt == nil)
-
-	if len(lhs) != len(rhs) {
-		// invalidate lhs
-		for _, obj := range lhs {
-			obj.used = true // avoid declared and not used errors
-			if obj.typ == nil {
-				obj.typ = Typ[Invalid]
-			}
-		}
-		// don't report an error if we already reported one
-		for _, x := range rhs {
-			if x.mode == invalid {
-				return
-			}
-		}
-		if returnStmt != nil {
-			var at positioner = returnStmt
-			qualifier := "not enough"
-			if len(rhs) > len(lhs) {
-				at = rhs[len(lhs)].expr // report at first extra value
-				qualifier = "too many"
-			} else if len(rhs) > 0 {
-				at = rhs[len(rhs)-1].expr // report at last value
-			}
-			err := newErrorf(at, WrongResultCount, "%s return values", qualifier)
-			err.errorf(token.NoPos, "have %s", check.typesSummary(operandTypes(rhs), false))
-			err.errorf(token.NoPos, "want %s", check.typesSummary(varTypes(lhs), false))
-			check.report(err)
-			return
-		}
-		check.assignError(origRHS, len(lhs), len(rhs))
-		return
+func (check *Checker) returnError(at positioner, lhs []*Var, rhs []*operand) {
+	l, r := len(lhs), len(rhs)
+	qualifier := "not enough"
+	if r > l {
+		at = rhs[l] // report at first extra value
+		qualifier = "too many"
+	} else if r > 0 {
+		at = rhs[r-1] // report at last value
 	}
+	var err error_
+	err.code = WrongResultCount
+	err.errorf(at.Pos(), "%s return values", qualifier)
+	err.errorf(nopos, "have %s", check.typesSummary(operandTypes(rhs), false))
+	err.errorf(nopos, "want %s", check.typesSummary(varTypes(lhs), false))
+	check.report(&err)
+}
 
+// initVars type-checks assignments of initialization expressions orig_rhs
+// to variables lhs.
+// If returnStmt is non-nil, initVars type-checks the implicit assignment
+// of result expressions orig_rhs to function result parameters lhs.
+func (check *Checker) initVars(lhs []*Var, orig_rhs []ast.Expr, returnStmt ast.Stmt) {
 	context := "assignment"
 	if returnStmt != nil {
 		context = "return statement"
 	}
 
-	if commaOk {
-		var a [2]Type
-		for i := range a {
-			a[i] = check.initVar(lhs[i], rhs[i], context)
+	l, r := len(lhs), len(orig_rhs)
+
+	// If l == 1 and the rhs is a single call, for a better
+	// error message don't handle it as n:n mapping below.
+	isCall := false
+	if r == 1 {
+		_, isCall = unparen(orig_rhs[0]).(*ast.CallExpr)
+	}
+
+	// If we have a n:n mapping from lhs variable to rhs expression,
+	// each value can be assigned to its corresponding variable.
+	if l == r && !isCall {
+		var x operand
+		for i, lhs := range lhs {
+			check.expr(lhs.typ, &x, orig_rhs[i])
+			check.initVar(lhs, &x, context)
 		}
-		check.recordCommaOkTypes(origRHS[0], a)
 		return
 	}
 
-	for i, lhs := range lhs {
-		check.initVar(lhs, rhs[i], context)
-	}
-}
-
-func (check *Checker) assignVars(lhs, origRHS []ast.Expr) {
-	rhs, commaOk := check.exprList(origRHS, len(lhs) == 2)
-
-	if len(lhs) != len(rhs) {
-		check.useLHS(lhs...)
-		// don't report an error if we already reported one
-		for _, x := range rhs {
-			if x.mode == invalid {
-				return
+	// If we don't have an n:n mapping, the rhs must be a single expression
+	// resulting in 2 or more values; otherwise we have an assignment mismatch.
+	if r != 1 {
+		// Only report a mismatch error if there are no other errors on the rhs.
+		if check.use(orig_rhs...) {
+			if returnStmt != nil {
+				rhs := check.exprList(orig_rhs)
+				check.returnError(returnStmt, lhs, rhs)
+			} else {
+				check.assignError(orig_rhs, l, r)
 			}
 		}
-		check.assignError(origRHS, len(lhs), len(rhs))
-		return
-	}
-
-	if commaOk {
-		var a [2]Type
-		for i := range a {
-			a[i] = check.assignVar(lhs[i], rhs[i])
+		// ensure that LHS variables have a type
+		for _, v := range lhs {
+			if v.typ == nil {
+				v.typ = Typ[Invalid]
+			}
 		}
-		check.recordCommaOkTypes(origRHS[0], a)
 		return
 	}
 
-	for i, lhs := range lhs {
-		check.assignVar(lhs, rhs[i])
+	rhs, commaOk := check.multiExpr(orig_rhs[0], l == 2 && returnStmt == nil)
+	r = len(rhs)
+	if l == r {
+		for i, lhs := range lhs {
+			check.initVar(lhs, rhs[i], context)
+		}
+		// Only record comma-ok expression if both initializations succeeded
+		// (go.dev/issue/59371).
+		if commaOk && rhs[0].mode != invalid && rhs[1].mode != invalid {
+			check.recordCommaOkTypes(orig_rhs[0], rhs)
+		}
+		return
 	}
+
+	// In all other cases we have an assignment mismatch.
+	// Only report a mismatch error if there are no other errors on the rhs.
+	if rhs[0].mode != invalid {
+		if returnStmt != nil {
+			check.returnError(returnStmt, lhs, rhs)
+		} else {
+			check.assignError(orig_rhs, l, r)
+		}
+	}
+	// ensure that LHS variables have a type
+	for _, v := range lhs {
+		if v.typ == nil {
+			v.typ = Typ[Invalid]
+		}
+	}
+	// orig_rhs[0] was already evaluated
+}
+
+// assignVars type-checks assignments of expressions orig_rhs to variables lhs.
+func (check *Checker) assignVars(lhs, orig_rhs []ast.Expr) {
+	l, r := len(lhs), len(orig_rhs)
+
+	// If l == 1 and the rhs is a single call, for a better
+	// error message don't handle it as n:n mapping below.
+	isCall := false
+	if r == 1 {
+		_, isCall = unparen(orig_rhs[0]).(*ast.CallExpr)
+	}
+
+	// If we have a n:n mapping from lhs variable to rhs expression,
+	// each value can be assigned to its corresponding variable.
+	if l == r && !isCall {
+		for i, lhs := range lhs {
+			check.assignVar(lhs, orig_rhs[i], nil)
+		}
+		return
+	}
+
+	// If we don't have an n:n mapping, the rhs must be a single expression
+	// resulting in 2 or more values; otherwise we have an assignment mismatch.
+	if r != 1 {
+		// Only report a mismatch error if there are no other errors on the lhs or rhs.
+		okLHS := check.useLHS(lhs...)
+		okRHS := check.use(orig_rhs...)
+		if okLHS && okRHS {
+			check.assignError(orig_rhs, l, r)
+		}
+		return
+	}
+
+	rhs, commaOk := check.multiExpr(orig_rhs[0], l == 2)
+	r = len(rhs)
+	if l == r {
+		for i, lhs := range lhs {
+			check.assignVar(lhs, nil, rhs[i])
+		}
+		// Only record comma-ok expression if both assignments succeeded
+		// (go.dev/issue/59371).
+		if commaOk && rhs[0].mode != invalid && rhs[1].mode != invalid {
+			check.recordCommaOkTypes(orig_rhs[0], rhs)
+		}
+		return
+	}
+
+	// In all other cases we have an assignment mismatch.
+	// Only report a mismatch error if there are no other errors on the rhs.
+	if rhs[0].mode != invalid {
+		check.assignError(orig_rhs, l, r)
+	}
+	check.useLHS(lhs...)
+	// orig_rhs[0] was already evaluated
 }
 
 func (check *Checker) shortVarDecl(pos positioner, lhs, rhs []ast.Expr) {
diff --git a/src/go/types/basic.go b/src/go/types/basic.go
index 215923f..d483616 100644
--- a/src/go/types/basic.go
+++ b/src/go/types/basic.go
@@ -1,3 +1,5 @@
+// Code generated by "go test -run=Generate -write=all"; DO NOT EDIT.
+
 // Copyright 2011 The Go Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
@@ -78,5 +80,5 @@
 // Name returns the name of basic type b.
 func (b *Basic) Name() string { return b.name }
 
-func (t *Basic) Underlying() Type { return t }
-func (t *Basic) String() string   { return TypeString(t, nil) }
+func (b *Basic) Underlying() Type { return b }
+func (b *Basic) String() string   { return TypeString(b, nil) }
diff --git a/src/go/types/builtins.go b/src/go/types/builtins.go
index d3bca60..11eacef 100644
--- a/src/go/types/builtins.go
+++ b/src/go/types/builtins.go
@@ -18,13 +18,15 @@
 // 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) {
+	argList := call.Args
+
 	// 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.errorf(atPos(call.Ellipsis),
 			InvalidDotDotDot,
 			invalidOp+"invalid use of ... with built-in %s", bin.name)
-		check.use(call.Args...)
+		check.use(argList...)
 		return
 	}
 
@@ -40,24 +42,28 @@
 		check.hasCallOrRecv = false
 	}
 
-	// determine actual arguments
-	var arg func(*operand, int) // TODO(gri) remove use of arg getter in favor of using xlist directly
-	nargs := len(call.Args)
+	// Evaluate arguments for built-ins that use ordinary (value) arguments.
+	// For built-ins with special argument handling (make, new, etc.),
+	// evaluation is done by the respective built-in code.
+	var args []*operand // not valid for _Make, _New, _Offsetof, _Trace
+	var nargs int
 	switch id {
 	default:
-		// make argument getter
-		xlist, _ := check.exprList(call.Args, false)
-		arg = func(x *operand, i int) { *x = *xlist[i] }
-		nargs = len(xlist)
-		// evaluate first argument, if present
-		if nargs > 0 {
-			arg(x, 0)
-			if x.mode == invalid {
+		// check all arguments
+		args = check.exprList(argList)
+		nargs = len(args)
+		for _, a := range args {
+			if a.mode == invalid {
 				return
 			}
 		}
+		// first argument is always in x
+		if nargs > 0 {
+			*x = *args[0]
+		}
 	case _Make, _New, _Offsetof, _Trace:
 		// arguments require special handling
+		nargs = len(argList)
 	}
 
 	// check argument count
@@ -99,26 +105,20 @@
 			default:
 				cause = check.sprintf("have %s", x)
 			}
-			// don't use Checker.invalidArg here as it would repeat "argument" in the error message
+			// don't use invalidArg prefix here as it would repeat "argument" in the error message
 			check.errorf(x, InvalidAppend, "first argument to append must be a slice; %s", cause)
 			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() {
 			if ok, _ := x.assignableTo(check, NewSlice(universeByte), nil); ok {
-				arg(x, 1)
-				if x.mode == invalid {
-					return
-				}
-				if t := coreString(x.typ); t != nil && isString(t) {
-					if check.Types != nil {
-						sig := makeSig(S, S, x.typ)
+				y := args[1]
+				if t := coreString(y.typ); t != nil && isString(t) {
+					if check.recordTypes() {
+						sig := makeSig(S, S, y.typ)
 						sig.variadic = true
 						check.recordBuiltinType(call.Fun, sig)
 					}
@@ -126,30 +126,18 @@
 					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
-		var xlist []*operand
-		// convert []operand to []*operand
-		for i := range alist {
-			xlist = append(xlist, &alist[i])
-		}
-		for i := len(alist); i < nargs; i++ {
-			var x operand
-			arg(&x, i)
-			xlist = append(xlist, &x)
-		}
-		check.arguments(call, sig, nil, xlist, nil) // discard result (we know the result type)
+		check.arguments(call, sig, nil, nil, args, nil, nil) // discard result (we know the result type)
 		// ok to continue even if check.arguments reported errors
 
 		x.mode = value
 		x.typ = S
-		if check.Types != nil {
+		if check.recordTypes() {
 			check.recordBuiltinType(call.Fun, sig)
 		}
 
@@ -215,17 +203,20 @@
 			}
 		}
 
-		if mode == invalid && under(x.typ) != Typ[Invalid] {
-			code := InvalidCap
-			if id == _Len {
-				code = InvalidLen
+		if mode == invalid {
+			// avoid error if underlying type is invalid
+			if under(x.typ) != Typ[Invalid] {
+				code := InvalidCap
+				if id == _Len {
+					code = InvalidLen
+				}
+				check.errorf(x, code, invalidArg+"%s for %s", x, bin.name)
 			}
-			check.errorf(x, code, invalidArg+"%s for %s", x, bin.name)
 			return
 		}
 
 		// record the signature before changing x.typ
-		if check.Types != nil && mode != constant_ {
+		if check.recordTypes() && mode != constant_ {
 			check.recordBuiltinType(call.Fun, makeSig(Typ[Int], x.typ))
 		}
 
@@ -235,28 +226,21 @@
 
 	case _Clear:
 		// clear(m)
-		if !check.allowVersion(check.pkg, 1, 21) {
-			check.error(call.Fun, UnsupportedFeature, "clear requires go1.21 or later")
-			return
-		}
+		check.verifyVersionf(call.Fun, go1_21, "clear")
 
 		if !underIs(x.typ, func(u Type) bool {
-			switch u := u.(type) {
+			switch u.(type) {
 			case *Map, *Slice:
 				return true
-			case *Pointer:
-				if _, ok := under(u.base).(*Array); ok {
-					return true
-				}
 			}
-			check.errorf(x, InvalidClear, invalidArg+"cannot clear %s: argument must be (or constrained by) map, slice, or array pointer", x)
+			check.errorf(x, InvalidClear, invalidArg+"cannot clear %s: argument must be (or constrained by) map or slice", x)
 			return false
 		}) {
 			return
 		}
 
 		x.mode = novalue
-		if check.Types != nil {
+		if check.recordTypes() {
 			check.recordBuiltinType(call.Fun, makeSig(nil, x.typ))
 		}
 
@@ -277,17 +261,13 @@
 			return
 		}
 		x.mode = novalue
-		if check.Types != nil {
+		if check.recordTypes() {
 			check.recordBuiltinType(call.Fun, makeSig(nil, x.typ))
 		}
 
 	case _Complex:
 		// complex(x, y floatT) complexT
-		var y operand
-		arg(&y, 1)
-		if y.mode == invalid {
-			return
-		}
+		y := args[1]
 
 		// convert or check untyped arguments
 		d := 0
@@ -305,7 +285,7 @@
 			check.convertUntyped(x, y.typ)
 		case 2:
 			// only y is untyped => convert to type of x
-			check.convertUntyped(&y, x.typ)
+			check.convertUntyped(y, x.typ)
 		case 3:
 			// x and y are untyped =>
 			// 1) if both are constants, convert them to untyped
@@ -322,10 +302,10 @@
 					}
 				}
 				toFloat(x)
-				toFloat(&y)
+				toFloat(y)
 			} else {
 				check.convertUntyped(x, Typ[Float64])
-				check.convertUntyped(&y, Typ[Float64])
+				check.convertUntyped(y, Typ[Float64])
 				// x and y should be invalid now, but be conservative
 				// and check below
 			}
@@ -336,7 +316,7 @@
 
 		// both argument types must be identical
 		if !Identical(x.typ, y.typ) {
-			check.errorf(x, InvalidComplex, invalidArg+"mismatched types %s and %s", x.typ, y.typ)
+			check.errorf(x, InvalidComplex, invalidOp+"%v (mismatched types %s and %s)", call, x.typ, y.typ)
 			return
 		}
 
@@ -369,7 +349,7 @@
 			x.mode = value
 		}
 
-		if check.Types != nil && x.mode != constant_ {
+		if check.recordTypes() && x.mode != constant_ {
 			check.recordBuiltinType(call.Fun, makeSig(resTyp, x.typ, x.typ))
 		}
 
@@ -379,11 +359,7 @@
 		// copy(x, y []T) int
 		dst, _ := coreType(x.typ).(*Slice)
 
-		var y operand
-		arg(&y, 1)
-		if y.mode == invalid {
-			return
-		}
+		y := args[1]
 		src0 := coreString(y.typ)
 		if src0 != nil && isString(src0) {
 			src0 = NewSlice(universeByte)
@@ -391,16 +367,16 @@
 		src, _ := src0.(*Slice)
 
 		if dst == nil || src == nil {
-			check.errorf(x, InvalidCopy, invalidArg+"copy expects slice arguments; found %s and %s", x, &y)
+			check.errorf(x, InvalidCopy, invalidArg+"copy expects slice arguments; found %s and %s", x, y)
 			return
 		}
 
 		if !Identical(dst.elem, src.elem) {
-			check.errorf(x, InvalidCopy, "arguments to copy %s and %s have different element types %s and %s", x, &y, dst.elem, src.elem)
+			check.errorf(x, InvalidCopy, invalidArg+"arguments to copy %s and %s have different element types %s and %s", x, y, dst.elem, src.elem)
 			return
 		}
 
-		if check.Types != nil {
+		if check.recordTypes() {
 			check.recordBuiltinType(call.Fun, makeSig(Typ[Int], x.typ, y.typ))
 		}
 		x.mode = value
@@ -428,18 +404,14 @@
 			return
 		}
 
-		arg(x, 1) // k
-		if x.mode == invalid {
-			return
-		}
-
+		*x = *args[1] // key
 		check.assignment(x, key, "argument to delete")
 		if x.mode == invalid {
 			return
 		}
 
 		x.mode = novalue
-		if check.Types != nil {
+		if check.recordTypes() {
 			check.recordBuiltinType(call.Fun, makeSig(nil, map_, key))
 		}
 
@@ -505,7 +477,7 @@
 			x.mode = value
 		}
 
-		if check.Types != nil && x.mode != constant_ {
+		if check.recordTypes() && x.mode != constant_ {
 			check.recordBuiltinType(call.Fun, makeSig(resTyp, x.typ))
 		}
 
@@ -515,7 +487,7 @@
 		// make(T, n)
 		// make(T, n, m)
 		// (no argument evaluated yet)
-		arg0 := call.Args[0]
+		arg0 := argList[0]
 		T := check.varType(arg0)
 		if T == Typ[Invalid] {
 			return
@@ -528,7 +500,7 @@
 		case *Map, *Chan:
 			min = 1
 		case nil:
-			check.errorf(arg0, InvalidMake, "cannot make %s: no core type", arg0)
+			check.errorf(arg0, InvalidMake, invalidArg+"cannot make %s: no core type", arg0)
 			return
 		default:
 			check.errorf(arg0, InvalidMake, invalidArg+"cannot make %s; type must be slice, map, or channel", arg0)
@@ -541,7 +513,7 @@
 
 		types := []Type{T}
 		var sizes []int64 // constant integer arguments, if any
-		for _, arg := range call.Args[1:] {
+		for _, arg := range argList[1:] {
 			typ, size := check.index(arg, -1) // ok to continue with typ == Typ[Invalid]
 			types = append(types, typ)
 			if size >= 0 {
@@ -549,26 +521,91 @@
 			}
 		}
 		if len(sizes) == 2 && sizes[0] > sizes[1] {
-			check.error(call.Args[1], SwappedMakeArgs, invalidArg+"length and capacity swapped")
+			check.error(argList[1], SwappedMakeArgs, invalidArg+"length and capacity swapped")
 			// safe to continue
 		}
 		x.mode = value
 		x.typ = T
-		if check.Types != nil {
+		if check.recordTypes() {
+			check.recordBuiltinType(call.Fun, makeSig(x.typ, types...))
+		}
+
+	case _Max, _Min:
+		// max(x, ...)
+		// min(x, ...)
+		check.verifyVersionf(call.Fun, go1_21, bin.name)
+
+		op := token.LSS
+		if id == _Max {
+			op = token.GTR
+		}
+
+		for i, a := range args {
+			if a.mode == invalid {
+				return
+			}
+
+			if !allOrdered(a.typ) {
+				check.errorf(a, InvalidMinMaxOperand, invalidArg+"%s cannot be ordered", a)
+				return
+			}
+
+			// The first argument is already in x and there's nothing left to do.
+			if i > 0 {
+				check.matchTypes(x, a)
+				if x.mode == invalid {
+					return
+				}
+
+				if !Identical(x.typ, a.typ) {
+					check.errorf(a, MismatchedTypes, invalidArg+"mismatched types %s (previous argument) and %s (type of %s)", x.typ, a.typ, a.expr)
+					return
+				}
+
+				if x.mode == constant_ && a.mode == constant_ {
+					if constant.Compare(a.val, op, x.val) {
+						*x = *a
+					}
+				} else {
+					x.mode = value
+				}
+			}
+		}
+
+		// If nargs == 1, make sure x.mode is either a value or a constant.
+		if x.mode != constant_ {
+			x.mode = value
+			// A value must not be untyped.
+			check.assignment(x, &emptyInterface, "argument to "+bin.name)
+			if x.mode == invalid {
+				return
+			}
+		}
+
+		// Use the final type computed above for all arguments.
+		for _, a := range args {
+			check.updateExprType(a.expr, x.typ, true)
+		}
+
+		if check.recordTypes() && x.mode != constant_ {
+			types := make([]Type, nargs)
+			for i := range types {
+				types[i] = x.typ
+			}
 			check.recordBuiltinType(call.Fun, makeSig(x.typ, types...))
 		}
 
 	case _New:
 		// new(T)
 		// (no argument evaluated yet)
-		T := check.varType(call.Args[0])
+		T := check.varType(argList[0])
 		if T == Typ[Invalid] {
 			return
 		}
 
 		x.mode = value
 		x.typ = &Pointer{base: T}
-		if check.Types != nil {
+		if check.recordTypes() {
 			check.recordBuiltinType(call.Fun, makeSig(x.typ, T))
 		}
 
@@ -593,7 +630,7 @@
 		}
 
 		x.mode = novalue
-		if check.Types != nil {
+		if check.recordTypes() {
 			check.recordBuiltinType(call.Fun, makeSig(nil, &emptyInterface))
 		}
 
@@ -603,21 +640,17 @@
 		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
-				}
-				check.assignment(x, nil, "argument to "+predeclaredFuncs[id].name)
-				if x.mode == invalid {
-					// TODO(gri) "use" all arguments?
+			for i, a := range args {
+				check.assignment(a, nil, "argument to "+predeclaredFuncs[id].name)
+				if a.mode == invalid {
 					return
 				}
-				params[i] = x.typ
+				params[i] = a.typ
 			}
 		}
 
 		x.mode = novalue
-		if check.Types != nil {
+		if check.recordTypes() {
 			check.recordBuiltinType(call.Fun, makeSig(nil, params...))
 		}
 
@@ -625,31 +658,27 @@
 		// recover() interface{}
 		x.mode = value
 		x.typ = &emptyInterface
-		if check.Types != nil {
+		if check.recordTypes() {
 			check.recordBuiltinType(call.Fun, makeSig(x.typ))
 		}
 
 	case _Add:
 		// unsafe.Add(ptr unsafe.Pointer, len IntegerType) unsafe.Pointer
-		if !check.allowVersion(check.pkg, 1, 17) {
-			check.error(call.Fun, UnsupportedFeature, "unsafe.Add requires go1.17 or later")
-			return
-		}
+		check.verifyVersionf(call.Fun, go1_17, "unsafe.Add")
 
 		check.assignment(x, Typ[UnsafePointer], "argument to unsafe.Add")
 		if x.mode == invalid {
 			return
 		}
 
-		var y operand
-		arg(&y, 1)
-		if !check.isValidIndex(&y, InvalidUnsafeAdd, "length", true) {
+		y := args[1]
+		if !check.isValidIndex(y, InvalidUnsafeAdd, "length", true) {
 			return
 		}
 
 		x.mode = value
 		x.typ = Typ[UnsafePointer]
-		if check.Types != nil {
+		if check.recordTypes() {
 			check.recordBuiltinType(call.Fun, makeSig(x.typ, x.typ, y.typ))
 		}
 
@@ -662,7 +691,7 @@
 
 		if hasVarSize(x.typ, nil) {
 			x.mode = value
-			if check.Types != nil {
+			if check.recordTypes() {
 				check.recordBuiltinType(call.Fun, makeSig(Typ[Uintptr], x.typ))
 			}
 		} else {
@@ -675,7 +704,7 @@
 	case _Offsetof:
 		// unsafe.Offsetof(x T) uintptr, where x must be a selector
 		// (no argument evaluated yet)
-		arg0 := call.Args[0]
+		arg0 := argList[0]
 		selx, _ := unparen(arg0).(*ast.SelectorExpr)
 		if selx == nil {
 			check.errorf(arg0, BadOffsetofSyntax, invalidArg+"%s is not a selector expression", arg0)
@@ -683,7 +712,7 @@
 			return
 		}
 
-		check.expr(x, selx.X)
+		check.expr(nil, x, selx.X)
 		if x.mode == invalid {
 			return
 		}
@@ -711,7 +740,7 @@
 		// TODO(gri) Should we pass x.typ instead of base (and have indirect report if derefStructPtr indirected)?
 		check.recordSelection(selx, FieldVal, base, obj, index, false)
 
-		// record the selector expression (was bug - issue #47895)
+		// record the selector expression (was bug - go.dev/issue/47895)
 		{
 			mode := value
 			if x.mode == variable || indirect {
@@ -726,12 +755,17 @@
 		// arranging struct fields if it wanted to.
 		if hasVarSize(base, nil) {
 			x.mode = value
-			if check.Types != nil {
+			if check.recordTypes() {
 				check.recordBuiltinType(call.Fun, makeSig(Typ[Uintptr], obj.Type()))
 			}
 		} else {
+			offs := check.conf.offsetof(base, index)
+			if offs < 0 {
+				check.errorf(x, TypeTooLarge, "%s is too large", x)
+				return
+			}
 			x.mode = constant_
-			x.val = constant.MakeInt64(check.conf.offsetof(base, index))
+			x.val = constant.MakeInt64(offs)
 			// result is constant - no need to record signature
 		}
 		x.typ = Typ[Uintptr]
@@ -745,22 +779,24 @@
 
 		if hasVarSize(x.typ, nil) {
 			x.mode = value
-			if check.Types != nil {
+			if check.recordTypes() {
 				check.recordBuiltinType(call.Fun, makeSig(Typ[Uintptr], x.typ))
 			}
 		} else {
+			size := check.conf.sizeof(x.typ)
+			if size < 0 {
+				check.errorf(x, TypeTooLarge, "%s is too large", x)
+				return
+			}
 			x.mode = constant_
-			x.val = constant.MakeInt64(check.conf.sizeof(x.typ))
+			x.val = constant.MakeInt64(size)
 			// result is constant - no need to record signature
 		}
 		x.typ = Typ[Uintptr]
 
 	case _Slice:
 		// unsafe.Slice(ptr *T, len IntegerType) []T
-		if !check.allowVersion(check.pkg, 1, 17) {
-			check.error(call.Fun, UnsupportedFeature, "unsafe.Slice requires go1.17 or later")
-			return
-		}
+		check.verifyVersionf(call.Fun, go1_17, "unsafe.Slice")
 
 		ptr, _ := under(x.typ).(*Pointer) // TODO(gri) should this be coreType rather than under?
 		if ptr == nil {
@@ -768,24 +804,20 @@
 			return
 		}
 
-		var y operand
-		arg(&y, 1)
-		if !check.isValidIndex(&y, InvalidUnsafeSlice, "length", false) {
+		y := args[1]
+		if !check.isValidIndex(y, InvalidUnsafeSlice, "length", false) {
 			return
 		}
 
 		x.mode = value
 		x.typ = NewSlice(ptr.base)
-		if check.Types != nil {
+		if check.recordTypes() {
 			check.recordBuiltinType(call.Fun, makeSig(x.typ, ptr, y.typ))
 		}
 
 	case _SliceData:
 		// unsafe.SliceData(slice []T) *T
-		if !check.allowVersion(check.pkg, 1, 20) {
-			check.error(call.Fun, UnsupportedFeature, "unsafe.SliceData requires go1.20 or later")
-			return
-		}
+		check.verifyVersionf(call.Fun, go1_20, "unsafe.SliceData")
 
 		slice, _ := under(x.typ).(*Slice) // TODO(gri) should this be coreType rather than under?
 		if slice == nil {
@@ -795,40 +827,33 @@
 
 		x.mode = value
 		x.typ = NewPointer(slice.elem)
-		if check.Types != nil {
+		if check.recordTypes() {
 			check.recordBuiltinType(call.Fun, makeSig(x.typ, slice))
 		}
 
 	case _String:
 		// unsafe.String(ptr *byte, len IntegerType) string
-		if !check.allowVersion(check.pkg, 1, 20) {
-			check.error(call.Fun, UnsupportedFeature, "unsafe.String requires go1.20 or later")
-			return
-		}
+		check.verifyVersionf(call.Fun, go1_20, "unsafe.String")
 
 		check.assignment(x, NewPointer(universeByte), "argument to unsafe.String")
 		if x.mode == invalid {
 			return
 		}
 
-		var y operand
-		arg(&y, 1)
-		if !check.isValidIndex(&y, InvalidUnsafeString, "length", false) {
+		y := args[1]
+		if !check.isValidIndex(y, InvalidUnsafeString, "length", false) {
 			return
 		}
 
 		x.mode = value
 		x.typ = Typ[String]
-		if check.Types != nil {
+		if check.recordTypes() {
 			check.recordBuiltinType(call.Fun, makeSig(x.typ, NewPointer(universeByte), y.typ))
 		}
 
 	case _StringData:
 		// unsafe.StringData(str string) *byte
-		if !check.allowVersion(check.pkg, 1, 20) {
-			check.error(call.Fun, UnsupportedFeature, "unsafe.StringData requires go1.20 or later")
-			return
-		}
+		check.verifyVersionf(call.Fun, go1_20, "unsafe.StringData")
 
 		check.assignment(x, Typ[String], "argument to unsafe.StringData")
 		if x.mode == invalid {
@@ -837,7 +862,7 @@
 
 		x.mode = value
 		x.typ = NewPointer(universeByte)
-		if check.Types != nil {
+		if check.recordTypes() {
 			check.recordBuiltinType(call.Fun, makeSig(x.typ, Typ[String]))
 		}
 
@@ -872,17 +897,21 @@
 		}
 		var t operand
 		x1 := x
-		for _, arg := range call.Args {
-			check.rawExpr(x1, arg, nil, false) // permit trace for types, e.g.: new(trace(T))
+		for _, arg := range argList {
+			check.rawExpr(nil, x1, arg, nil, false) // permit trace for types, e.g.: new(trace(T))
 			check.dump("%v: %s", x1.Pos(), x1)
 			x1 = &t // use incoming x only for first argument
 		}
+		if x.mode == invalid {
+			return
+		}
 		// trace is only available in test mode - no need to record signature
 
 	default:
 		unreachable()
 	}
 
+	assert(x.mode != invalid)
 	return true
 }
 
@@ -950,7 +979,7 @@
 
 		// We can type-check this fine but we're introducing a synthetic
 		// type parameter for the result. It's not clear what the API
-		// implications are here. Report an error for 1.18 (see #50912),
+		// implications are here. Report an error for 1.18 (see go.dev/issue/50912),
 		// but continue type-checking.
 		var code Code
 		switch id {
@@ -963,12 +992,12 @@
 		default:
 			unreachable()
 		}
-		check.softErrorf(x, code, "%s not supported as argument to %s for go1.18 (see issue #50937)", x, predeclaredFuncs[id].name)
+		check.softErrorf(x, code, "%s not supported as argument to %s for go1.18 (see go.dev/issue/50937)", x, predeclaredFuncs[id].name)
 
 		// Construct a suitable new type parameter for the result type.
 		// The type parameter is placed in the current package so export/import
 		// works as expected.
-		tpar := NewTypeName(token.NoPos, check.pkg, tp.obj.name, nil)
+		tpar := NewTypeName(nopos, check.pkg, tp.obj.name, nil)
 		ptyp := check.newTypeParam(tpar, NewInterfaceType(nil, []Type{NewUnion(terms)})) // assigns type to tpar as a side-effect
 		ptyp.index = tp.index
 
@@ -983,13 +1012,13 @@
 func makeSig(res Type, args ...Type) *Signature {
 	list := make([]*Var, len(args))
 	for i, param := range args {
-		list[i] = NewVar(token.NoPos, nil, "", Default(param))
+		list[i] = NewVar(nopos, nil, "", Default(param))
 	}
 	params := NewTuple(list...)
 	var result *Tuple
 	if res != nil {
 		assert(!isUntyped(res))
-		result = NewTuple(NewVar(token.NoPos, nil, "", res))
+		result = NewTuple(NewVar(nopos, nil, "", res))
 	}
 	return &Signature{params: params, results: result}
 }
diff --git a/src/go/types/builtins_test.go b/src/go/types/builtins_test.go
index fb71c48..4b198ef 100644
--- a/src/go/types/builtins_test.go
+++ b/src/go/types/builtins_test.go
@@ -7,8 +7,6 @@
 import (
 	"fmt"
 	"go/ast"
-	"go/importer"
-	"go/parser"
 	"testing"
 
 	. "go/types"
@@ -44,8 +42,6 @@
 
 	{"clear", `var m map[float64]int; clear(m)`, `func(map[float64]int)`},
 	{"clear", `var s []byte; clear(s)`, `func([]byte)`},
-	{"clear", `var p *[10]int; clear(p)`, `func(*[10]int)`},
-	{"clear", `var s P; clear(s)`, `func(P)`},
 
 	{"close", `var c chan int; close(c)`, `func(chan int)`},
 	{"close", `var c chan<- chan string; close(c)`, `func(chan<- chan string)`},
@@ -80,7 +76,7 @@
 	{"make", `_ = make([]int, 10)`, `func([]int, int) []int`},
 	{"make", `type T []byte; _ = make(T, 10, 20)`, `func(p.T, int, int) p.T`},
 
-	// issue #37349
+	// go.dev/issue/37349
 	{"make", `              _ = make([]int, 0   )`, `func([]int, int) []int`},
 	{"make", `var l    int; _ = make([]int, l   )`, `func([]int, int) []int`},
 	{"make", `              _ = make([]int, 0, 0)`, `func([]int, int, int) []int`},
@@ -88,7 +84,7 @@
 	{"make", `var    c int; _ = make([]int, 0, c)`, `func([]int, int, int) []int`},
 	{"make", `var l, c int; _ = make([]int, l, c)`, `func([]int, int, int) []int`},
 
-	// issue #37393
+	// go.dev/issue/37393
 	{"make", `                _ = make([]int       , 0   )`, `func([]int, int) []int`},
 	{"make", `var l    byte ; _ = make([]int8      , l   )`, `func([]int8, byte) []int8`},
 	{"make", `                _ = make([]int16     , 0, 0)`, `func([]int16, int, int) []int16`},
@@ -96,9 +92,21 @@
 	{"make", `var    c int32; _ = make([]float64   , 0, c)`, `func([]float64, int, int32) []float64`},
 	{"make", `var l, c uint ; _ = make([]complex128, l, c)`, `func([]complex128, uint, uint) []complex128`},
 
-	// issue #45667
+	// go.dev/issue/45667
 	{"make", `const l uint = 1; _ = make([]int, l)`, `func([]int, uint) []int`},
 
+	{"max", `               _ = max(0        )`, `invalid type`}, // constant
+	{"max", `var x int    ; _ = max(x        )`, `func(int) int`},
+	{"max", `var x int    ; _ = max(0, x     )`, `func(int, int) int`},
+	{"max", `var x string ; _ = max("a", x   )`, `func(string, string) string`},
+	{"max", `var x float32; _ = max(0, 1.0, x)`, `func(float32, float32, float32) float32`},
+
+	{"min", `               _ = min(0        )`, `invalid type`}, // constant
+	{"min", `var x int    ; _ = min(x        )`, `func(int) int`},
+	{"min", `var x int    ; _ = min(0, x     )`, `func(int, int) int`},
+	{"min", `var x string ; _ = min("a", x   )`, `func(string, string) string`},
+	{"min", `var x float32; _ = min(0, 1.0, x)`, `func(float32, float32, float32) float32`},
+
 	{"new", `_ = new(int)`, `func(int) *int`},
 	{"new", `type T struct{}; _ = new(T)`, `func(p.T) *p.T`},
 
@@ -173,24 +181,12 @@
 	}
 }
 
-// parseGenericSrc in types2 is not necessary. We can just parse in testBuiltinSignature below.
-
 func testBuiltinSignature(t *testing.T, name, src0, want string) {
 	src := fmt.Sprintf(`package p; import "unsafe"; type _ unsafe.Pointer /* use unsafe */; func _[P ~[]byte]() { %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
-	}
+	mustTypecheck(src, nil, &Info{Uses: uses, Types: types})
 
 	// find called function
 	n := 0
diff --git a/src/go/types/call.go b/src/go/types/call.go
index db603b5..f00290a 100644
--- a/src/go/types/call.go
+++ b/src/go/types/call.go
@@ -15,57 +15,131 @@
 	"unicode"
 )
 
-// funcInst type-checks a function instantiation inst and returns the result in x.
-// The operand x must be the evaluation of inst.X and its type must be a signature.
-func (check *Checker) funcInst(x *operand, ix *typeparams.IndexExpr) {
-	if !check.allowVersion(check.pkg, 1, 18) {
-		check.softErrorf(inNode(ix.Orig, ix.Lbrack), UnsupportedFeature, "function instantiation requires go1.18 or later")
+// funcInst type-checks a function instantiation.
+// The incoming x must be a generic function.
+// If ix != nil, it provides some or all of the type arguments (ix.Indices).
+// If target type tsig != nil, the signature may be used to infer missing type
+// arguments of x, if any. At least one of tsig or inst must be provided.
+//
+// There are two modes of operation:
+//
+//  1. If infer == true, funcInst infers missing type arguments as needed and
+//     instantiates the function x. The returned results are nil.
+//
+//  2. If infer == false and inst provides all type arguments, funcInst
+//     instantiates the function x. The returned results are nil.
+//     If inst doesn't provide enough type arguments, funcInst returns the
+//     available arguments and the corresponding expression list; x remains
+//     unchanged.
+//
+// If an error (other than a version error) occurs in any case, it is reported
+// and x.mode is set to invalid.
+func (check *Checker) funcInst(tsig *Signature, pos token.Pos, x *operand, ix *typeparams.IndexExpr, infer bool) ([]Type, []ast.Expr) {
+	assert(tsig != nil || ix != nil)
+
+	var instErrPos positioner
+	if ix != nil {
+		instErrPos = inNode(ix.Orig, ix.Lbrack)
+	} else {
+		instErrPos = atPos(pos)
+	}
+	versionErr := !check.verifyVersionf(instErrPos, go1_18, "function instantiation")
+
+	// targs and xlist are the type arguments and corresponding type expressions, or nil.
+	var targs []Type
+	var xlist []ast.Expr
+	if ix != nil {
+		xlist = ix.Indices
+		targs = check.typeList(xlist)
+		if targs == nil {
+			x.mode = invalid
+			x.expr = ix
+			return nil, nil
+		}
+		assert(len(targs) == len(xlist))
 	}
 
-	targs := check.typeList(ix.Indices)
-	if targs == nil {
-		x.mode = invalid
-		x.expr = ix.Orig
-		return
-	}
-	assert(len(targs) == len(ix.Indices))
-
-	// check number of type arguments (got) vs number of type parameters (want)
+	// Check the number of type arguments (got) vs number of type parameters (want).
+	// Note that x is a function value, not a type expression, so we don't need to
+	// call under below.
 	sig := x.typ.(*Signature)
 	got, want := len(targs), sig.TypeParams().Len()
 	if got > want {
+		// Providing too many type arguments is always an error.
 		check.errorf(ix.Indices[got-1], WrongTypeArgCount, "got %d type arguments but want %d", got, want)
 		x.mode = invalid
 		x.expr = ix.Orig
-		return
+		return nil, nil
 	}
 
 	if got < want {
-		targs = check.infer(ix.Orig, sig.TypeParams().list(), targs, nil, nil)
+		if !infer {
+			return targs, xlist
+		}
+
+		// If the uninstantiated or partially instantiated function x is used in
+		// an assignment (tsig != nil), infer missing type arguments by treating
+		// the assignment
+		//
+		//    var tvar tsig = x
+		//
+		// like a call g(tvar) of the synthetic generic function g
+		//
+		//    func g[type_parameters_of_x](func_type_of_x)
+		//
+		var args []*operand
+		var params []*Var
+		if tsig != nil && sig.tparams != nil {
+			if !versionErr && !check.allowVersion(check.pkg, instErrPos, go1_21) {
+				if ix != nil {
+					check.versionErrorf(instErrPos, go1_21, "partially instantiated function in assignment")
+				} else {
+					check.versionErrorf(instErrPos, go1_21, "implicitly instantiated function in assignment")
+				}
+			}
+			gsig := NewSignatureType(nil, nil, nil, sig.params, sig.results, sig.variadic)
+			params = []*Var{NewVar(x.Pos(), check.pkg, "", gsig)}
+			// The type of the argument operand is tsig, which is the type of the LHS in an assignment
+			// or the result type in a return statement. Create a pseudo-expression for that operand
+			// that makes sense when reported in error messages from infer, below.
+			expr := ast.NewIdent("variable in assignment")
+			expr.NamePos = x.Pos() // correct position
+			args = []*operand{{mode: value, expr: expr, typ: tsig}}
+		}
+
+		// Rename type parameters to avoid problems with recursive instantiations.
+		// Note that NewTuple(params...) below is (*Tuple)(nil) if len(params) == 0, as desired.
+		tparams, params2 := check.renameTParams(pos, sig.TypeParams().list(), NewTuple(params...))
+
+		targs = check.infer(atPos(pos), tparams, targs, params2.(*Tuple), args)
 		if targs == nil {
 			// error was already reported
 			x.mode = invalid
-			x.expr = ix.Orig
-			return
+			x.expr = ix // TODO(gri) is this correct?
+			return nil, nil
 		}
 		got = len(targs)
 	}
 	assert(got == want)
 
 	// instantiate function signature
-	sig = check.instantiateSignature(x.Pos(), sig, targs, ix.Indices)
-	assert(sig.TypeParams().Len() == 0) // signature is not generic anymore
-	check.recordInstance(ix.Orig, targs, sig)
+	expr := x.expr // if we don't have an index expression, keep the existing expression of x
+	if ix != nil {
+		expr = ix.Orig
+	}
+	sig = check.instantiateSignature(x.Pos(), expr, sig, targs, xlist)
+
 	x.typ = sig
 	x.mode = value
-	x.expr = ix.Orig
+	x.expr = expr
+	return nil, nil
 }
 
-func (check *Checker) instantiateSignature(pos token.Pos, typ *Signature, targs []Type, xlist []ast.Expr) (res *Signature) {
+func (check *Checker) instantiateSignature(pos token.Pos, expr ast.Expr, typ *Signature, targs []Type, xlist []ast.Expr) (res *Signature) {
 	assert(check != nil)
 	assert(len(targs) == typ.TypeParams().Len())
 
-	if trace {
+	if check.conf._Trace {
 		check.trace(pos, "-- instantiating signature %s with %s", typ, targs)
 		check.indent++
 		defer func() {
@@ -75,9 +149,11 @@
 	}
 
 	inst := check.instance(pos, typ, targs, nil, check.context()).(*Signature)
+	assert(inst.TypeParams().Len() == 0) // signature is not generic anymore
+	check.recordInstance(expr, targs, inst)
 	assert(len(xlist) <= len(targs))
 
-	// verify instantiation lazily (was issue #50450)
+	// verify instantiation lazily (was go.dev/issue/50450)
 	check.later(func() {
 		tparams := typ.TypeParams().list()
 		if i, err := check.verify(pos, tparams, targs, check.context()); err != nil {
@@ -121,7 +197,7 @@
 
 	case typexpr:
 		// conversion
-		check.nonGeneric(x)
+		check.nonGeneric(nil, x)
 		if x.mode == invalid {
 			return conversion
 		}
@@ -131,7 +207,7 @@
 		case 0:
 			check.errorf(inNode(call, call.Rparen), WrongArgCount, "missing argument in conversion to %s", T)
 		case 1:
-			check.expr(x, call.Args[0])
+			check.expr(nil, x, call.Args[0])
 			if x.mode != invalid {
 				if call.Ellipsis.IsValid() {
 					check.errorf(call.Args[0], BadDotDotDotSyntax, "invalid use of ... in conversion to %s", T)
@@ -212,14 +288,8 @@
 		// is an error checking its arguments (for example, if an incorrect number
 		// of arguments is supplied).
 		if got == want && want > 0 {
-			if !check.allowVersion(check.pkg, 1, 18) {
-				check.softErrorf(inNode(call.Fun, ix.Lbrack), UnsupportedFeature, "function instantiation requires go1.18 or later")
-			}
-
-			sig = check.instantiateSignature(ix.Pos(), sig, targs, xlist)
-			assert(sig.TypeParams().Len() == 0) // signature is not generic anymore
-			check.recordInstance(ix.Orig, targs, sig)
-
+			check.verifyVersionf(atPos(ix.Lbrack), go1_18, "function instantiation")
+			sig = check.instantiateSignature(ix.Pos(), ix.Orig, sig, targs, xlist)
 			// targs have been consumed; proceed with checking arguments of the
 			// non-generic signature.
 			targs = nil
@@ -228,8 +298,8 @@
 	}
 
 	// evaluate arguments
-	args, _ := check.exprList(call.Args, false)
-	sig = check.arguments(call, sig, targs, args, xlist)
+	args, atargs, atxlist := check.genericExprList(call.Args)
+	sig = check.arguments(call, sig, targs, xlist, args, atargs, atxlist)
 
 	if wasGeneric && sig.TypeParams().Len() == 0 {
 		// Update the recorded type of call.Fun to its instantiated type.
@@ -254,8 +324,8 @@
 	x.expr = call
 	check.hasCallOrRecv = true
 
-	// if type inference failed, a parametrized result must be invalidated
-	// (operands cannot have a parametrized type)
+	// if type inference failed, a parameterized result must be invalidated
+	// (operands cannot have a parameterized type)
 	if x.mode == value && sig.TypeParams().Len() > 0 && isParameterized(sig.TypeParams().list(), x.typ) {
 		x.mode = invalid
 	}
@@ -263,64 +333,136 @@
 	return statement
 }
 
-func (check *Checker) exprList(elist []ast.Expr, allowCommaOk bool) (xlist []*operand, commaOk bool) {
-	switch len(elist) {
-	case 0:
-		// nothing to do
-
-	case 1:
-		// single (possibly comma-ok) value, or function returning multiple values
-		e := elist[0]
-		var x operand
-		check.multiExpr(&x, e)
-		if t, ok := x.typ.(*Tuple); ok && x.mode != invalid {
-			// multiple values
-			xlist = make([]*operand, t.Len())
-			for i, v := range t.vars {
-				xlist[i] = &operand{mode: value, expr: e, typ: v.typ}
-			}
-			break
-		}
-
-		// exactly one (possibly invalid or comma-ok) value
-		xlist = []*operand{&x}
-		if allowCommaOk && (x.mode == mapindex || x.mode == commaok || x.mode == commaerr) {
-			x2 := &operand{mode: value, expr: e, typ: Typ[UntypedBool]}
-			if x.mode == commaerr {
-				x2.typ = universeError
-			}
-			xlist = append(xlist, x2)
-			commaOk = true
-		}
-
-	default:
+// exprList evaluates a list of expressions and returns the corresponding operands.
+// A single-element expression list may evaluate to multiple operands.
+func (check *Checker) exprList(elist []ast.Expr) (xlist []*operand) {
+	if n := len(elist); n == 1 {
+		xlist, _ = check.multiExpr(elist[0], false)
+	} else if n > 1 {
 		// multiple (possibly invalid) values
-		xlist = make([]*operand, len(elist))
+		xlist = make([]*operand, n)
 		for i, e := range elist {
 			var x operand
-			check.expr(&x, e)
+			check.expr(nil, &x, e)
 			xlist[i] = &x
 		}
 	}
+	return
+}
+
+// genericExprList is like exprList but result operands may be uninstantiated or partially
+// instantiated generic functions (where constraint information is insufficient to infer
+// the missing type arguments) for Go 1.21 and later.
+// For each non-generic or uninstantiated generic operand, the corresponding targsList and
+// xlistList elements do not exist (targsList and xlistList are nil) or the elements are nil.
+// For each partially instantiated generic function operand, the corresponding targsList and
+// xlistList elements are the operand's partial type arguments and type expression lists.
+func (check *Checker) genericExprList(elist []ast.Expr) (resList []*operand, targsList [][]Type, xlistList [][]ast.Expr) {
+	if debug {
+		defer func() {
+			// targsList and xlistList must have matching lengths
+			assert(len(targsList) == len(xlistList))
+			// type arguments must only exist for partially instantiated functions
+			for i, x := range resList {
+				if i < len(targsList) {
+					if n := len(targsList[i]); n > 0 {
+						// x must be a partially instantiated function
+						assert(n < x.typ.(*Signature).TypeParams().Len())
+					}
+				}
+			}
+		}()
+	}
+
+	// Before Go 1.21, uninstantiated or partially instantiated argument functions are
+	// nor permitted. Checker.funcInst must infer missing type arguments in that case.
+	infer := true // for -lang < go1.21
+	n := len(elist)
+	if n > 0 && check.allowVersion(check.pkg, elist[0], go1_21) {
+		infer = false
+	}
+
+	if n == 1 {
+		// single value (possibly a partially instantiated function), or a multi-valued expression
+		e := elist[0]
+		var x operand
+		if ix := typeparams.UnpackIndexExpr(e); ix != nil && check.indexExpr(&x, ix) {
+			// x is a generic function.
+			targs, xlist := check.funcInst(nil, x.Pos(), &x, ix, infer)
+			if targs != nil {
+				// x was not instantiated: collect the (partial) type arguments.
+				targsList = [][]Type{targs}
+				xlistList = [][]ast.Expr{xlist}
+				// Update x.expr so that we can record the partially instantiated function.
+				x.expr = ix.Orig
+			} else {
+				// x was instantiated: we must record it here because we didn't
+				// use the usual expression evaluators.
+				check.record(&x)
+			}
+			resList = []*operand{&x}
+		} else {
+			// x is not a function instantiation (it may still be a generic function).
+			check.rawExpr(nil, &x, e, nil, true)
+			check.exclude(&x, 1<<novalue|1<<builtin|1<<typexpr)
+			if t, ok := x.typ.(*Tuple); ok && x.mode != invalid {
+				// x is a function call returning multiple values; it cannot be generic.
+				resList = make([]*operand, t.Len())
+				for i, v := range t.vars {
+					resList[i] = &operand{mode: value, expr: e, typ: v.typ}
+				}
+			} else {
+				// x is exactly one value (possibly invalid or uninstantiated generic function).
+				resList = []*operand{&x}
+			}
+		}
+	} else if n > 1 {
+		// multiple values
+		resList = make([]*operand, n)
+		targsList = make([][]Type, n)
+		xlistList = make([][]ast.Expr, n)
+		for i, e := range elist {
+			var x operand
+			if ix := typeparams.UnpackIndexExpr(e); ix != nil && check.indexExpr(&x, ix) {
+				// x is a generic function.
+				targs, xlist := check.funcInst(nil, x.Pos(), &x, ix, infer)
+				if targs != nil {
+					// x was not instantiated: collect the (partial) type arguments.
+					targsList[i] = targs
+					xlistList[i] = xlist
+					// Update x.expr so that we can record the partially instantiated function.
+					x.expr = ix.Orig
+				} else {
+					// x was instantiated: we must record it here because we didn't
+					// use the usual expression evaluators.
+					check.record(&x)
+				}
+			} else {
+				// x is exactly one value (possibly invalid or uninstantiated generic function).
+				check.genericExpr(&x, e)
+			}
+			resList[i] = &x
+		}
+	}
 
 	return
 }
 
-// xlist is the list of type argument expressions supplied in the source code.
-func (check *Checker) arguments(call *ast.CallExpr, sig *Signature, targs []Type, args []*operand, xlist []ast.Expr) (rsig *Signature) {
+// arguments type-checks arguments passed to a function call with the given signature.
+// The function and its arguments may be generic, and possibly partially instantiated.
+// targs and xlist are the function's type arguments (and corresponding expressions).
+// args are the function arguments. If an argument args[i] is a partially instantiated
+// generic function, atargs[i] and atxlist[i] are the corresponding type arguments
+// (and corresponding expressions).
+// If the callee is variadic, arguments adjusts its signature to match the provided
+// arguments. The type parameters and arguments of the callee and all its arguments
+// are used together to infer any missing type arguments, and the callee and argument
+// functions are instantiated as necessary.
+// The result signature is the (possibly adjusted and instantiated) function signature.
+// If an error occurred, the result signature is the incoming sig.
+func (check *Checker) arguments(call *ast.CallExpr, sig *Signature, targs []Type, xlist []ast.Expr, args []*operand, atargs [][]Type, atxlist [][]ast.Expr) (rsig *Signature) {
 	rsig = sig
 
-	// TODO(gri) try to eliminate this extra verification loop
-	for _, a := range args {
-		switch a.mode {
-		case typexpr:
-			check.errorf(a, NotAnExpr, "%s used as value", a)
-			return
-		case invalid:
-			return
-		}
-	}
-
 	// Function call argument/parameter count requirements
 	//
 	//               | standard call    | dotdotdot call |
@@ -336,7 +478,7 @@
 
 	// set up parameters
 	sigParams := sig.params // adjusted for variadic functions (may be nil for empty parameter lists!)
-	adjusted := false       // indicates if sigParams is different from t.params
+	adjusted := false       // indicates if sigParams is different from sig.params
 	if sig.variadic {
 		if ddd {
 			// variadic_func(a, b, c...)
@@ -391,40 +533,116 @@
 			params = sig.params.vars
 		}
 		err := newErrorf(at, WrongArgCount, "%s arguments in call to %s", qualifier, call.Fun)
-		err.errorf(token.NoPos, "have %s", check.typesSummary(operandTypes(args), false))
-		err.errorf(token.NoPos, "want %s", check.typesSummary(varTypes(params), sig.variadic))
+		err.errorf(nopos, "have %s", check.typesSummary(operandTypes(args), false))
+		err.errorf(nopos, "want %s", check.typesSummary(varTypes(params), sig.variadic))
 		check.report(err)
 		return
 	}
 
-	// infer type arguments and instantiate signature if necessary
-	if sig.TypeParams().Len() > 0 {
-		if !check.allowVersion(check.pkg, 1, 18) {
+	// collect type parameters of callee and generic function arguments
+	var tparams []*TypeParam
+
+	// collect type parameters of callee
+	n := sig.TypeParams().Len()
+	if n > 0 {
+		if !check.allowVersion(check.pkg, call, go1_18) {
 			switch call.Fun.(type) {
 			case *ast.IndexExpr, *ast.IndexListExpr:
 				ix := typeparams.UnpackIndexExpr(call.Fun)
-				check.softErrorf(inNode(call.Fun, ix.Lbrack), UnsupportedFeature, "function instantiation requires go1.18 or later")
+				check.versionErrorf(inNode(call.Fun, ix.Lbrack), go1_18, "function instantiation")
 			default:
-				check.softErrorf(inNode(call, call.Lparen), UnsupportedFeature, "implicit function instantiation requires go1.18 or later")
+				check.versionErrorf(inNode(call, call.Lparen), go1_18, "implicit function instantiation")
 			}
 		}
-		targs := check.infer(call, sig.TypeParams().list(), targs, sigParams, args)
+		// rename type parameters to avoid problems with recursive calls
+		var tmp Type
+		tparams, tmp = check.renameTParams(call.Pos(), sig.TypeParams().list(), sigParams)
+		sigParams = tmp.(*Tuple)
+		// make sure targs and tparams have the same length
+		for len(targs) < len(tparams) {
+			targs = append(targs, nil)
+		}
+	}
+	assert(len(tparams) == len(targs))
+
+	// collect type parameters from generic function arguments
+	var genericArgs []int // indices of generic function arguments
+	if enableReverseTypeInference {
+		for i, arg := range args {
+			// generic arguments cannot have a defined (*Named) type - no need for underlying type below
+			if asig, _ := arg.typ.(*Signature); asig != nil && asig.TypeParams().Len() > 0 {
+				// The argument type is a generic function signature. This type is
+				// pointer-identical with (it's copied from) the type of the generic
+				// function argument and thus the function object.
+				// Before we change the type (type parameter renaming, below), make
+				// a clone of it as otherwise we implicitly modify the object's type
+				// (go.dev/issues/63260).
+				clone := *asig
+				asig = &clone
+				// Rename type parameters for cases like f(g, g); this gives each
+				// generic function argument a unique type identity (go.dev/issues/59956).
+				// TODO(gri) Consider only doing this if a function argument appears
+				//           multiple times, which is rare (possible optimization).
+				atparams, tmp := check.renameTParams(call.Pos(), asig.TypeParams().list(), asig)
+				asig = tmp.(*Signature)
+				asig.tparams = &TypeParamList{atparams} // renameTParams doesn't touch associated type parameters
+				arg.typ = asig                          // new type identity for the function argument
+				tparams = append(tparams, atparams...)
+				// add partial list of type arguments, if any
+				if i < len(atargs) {
+					targs = append(targs, atargs[i]...)
+				}
+				// make sure targs and tparams have the same length
+				for len(targs) < len(tparams) {
+					targs = append(targs, nil)
+				}
+				genericArgs = append(genericArgs, i)
+			}
+		}
+	}
+	assert(len(tparams) == len(targs))
+
+	// at the moment we only support implicit instantiations of argument functions
+	_ = len(genericArgs) > 0 && check.verifyVersionf(args[genericArgs[0]], go1_21, "implicitly instantiated function as argument")
+
+	// tparams holds the type parameters of the callee and generic function arguments, if any:
+	// the first n type parameters belong to the callee, followed by mi type parameters for each
+	// of the generic function arguments, where mi = args[i].typ.(*Signature).TypeParams().Len().
+
+	// infer missing type arguments of callee and function arguments
+	if len(tparams) > 0 {
+		targs = check.infer(call, tparams, targs, sigParams, args)
 		if targs == nil {
+			// TODO(gri) If infer inferred the first targs[:n], consider instantiating
+			//           the call signature for better error messages/gopls behavior.
+			//           Perhaps instantiate as much as we can, also for arguments.
+			//           This will require changes to how infer returns its results.
 			return // error already reported
 		}
 
-		// compute result signature
-		rsig = check.instantiateSignature(call.Pos(), sig, targs, xlist)
-		assert(rsig.TypeParams().Len() == 0) // signature is not generic anymore
-		check.recordInstance(call.Fun, targs, rsig)
+		// update result signature: instantiate if needed
+		if n > 0 {
+			rsig = check.instantiateSignature(call.Pos(), call.Fun, sig, targs[:n], xlist)
+			// If the callee's parameter list was adjusted we need to update (instantiate)
+			// it separately. Otherwise we can simply use the result signature's parameter
+			// list.
+			if adjusted {
+				sigParams = check.subst(call.Pos(), sigParams, makeSubstMap(tparams[:n], targs[:n]), nil, check.context()).(*Tuple)
+			} else {
+				sigParams = rsig.params
+			}
+		}
 
-		// Optimization: Only if the parameter list was adjusted do we
-		// need to compute it from the adjusted list; otherwise we can
-		// simply use the result signature's parameter list.
-		if adjusted {
-			sigParams = check.subst(call.Pos(), sigParams, makeSubstMap(sig.TypeParams().list(), targs), nil, check.context()).(*Tuple)
-		} else {
-			sigParams = rsig.params
+		// compute argument signatures: instantiate if needed
+		j := n
+		for _, i := range genericArgs {
+			arg := args[i]
+			asig := arg.typ.(*Signature)
+			k := j + asig.TypeParams().Len()
+			// targs[j:k] are the inferred type arguments for asig
+			arg.typ = check.instantiateSignature(call.Pos(), arg.expr, asig, targs[j:k], nil) // TODO(gri) provide xlist if possible (partial instantiations)
+			check.record(arg)                                                                 // record here because we didn't use the usual expr evaluators
+			j = k
 		}
 	}
 
@@ -550,7 +768,7 @@
 	check.exprOrType(x, e.X, false)
 	switch x.mode {
 	case typexpr:
-		// don't crash for "type T T.x" (was issue #51509)
+		// don't crash for "type T T.x" (was go.dev/issue/51509)
 		if def != nil && x.typ == def {
 			check.cycleError([]Object{def.obj})
 			goto Error
@@ -573,7 +791,7 @@
 	// All codepaths below return a non-type expression. If we get here while
 	// expecting a type expression, it is an error.
 	//
-	// See issue #57522 for more details.
+	// See go.dev/issue/57522 for more details.
 	//
 	// TODO(rfindley): We should do better by refusing to check selectors in all cases where
 	// x.typ is incomplete.
@@ -584,7 +802,7 @@
 
 	obj, index, indirect = LookupFieldOrMethod(x.typ, x.mode == variable, check.pkg, sel)
 	if obj == nil {
-		// Don't report another error if the underlying type was invalid (issue #49541).
+		// Don't report another error if the underlying type was invalid (go.dev/issue/49541).
 		if under(x.typ) == Typ[Invalid] {
 			goto Error
 		}
@@ -769,37 +987,44 @@
 
 // use type-checks each argument.
 // Useful to make sure expressions are evaluated
-// (and variables are "used") in the presence of other errors.
-// The arguments may be nil.
-func (check *Checker) use(arg ...ast.Expr) {
-	var x operand
-	for _, e := range arg {
-		// The nil check below is necessary since certain AST fields
-		// may legally be nil (e.g., the ast.SliceExpr.High field).
-		if e != nil {
-			check.rawExpr(&x, e, nil, false)
-		}
-	}
-}
+// (and variables are "used") in the presence of
+// other errors. Arguments may be nil.
+// Reports if all arguments evaluated without error.
+func (check *Checker) use(args ...ast.Expr) bool { return check.useN(args, false) }
 
 // useLHS is like use, but doesn't "use" top-level identifiers.
 // It should be called instead of use if the arguments are
 // expressions on the lhs of an assignment.
-// The arguments must not be nil.
-func (check *Checker) useLHS(arg ...ast.Expr) {
+func (check *Checker) useLHS(args ...ast.Expr) bool { return check.useN(args, true) }
+
+func (check *Checker) useN(args []ast.Expr, lhs bool) bool {
+	ok := true
+	for _, e := range args {
+		if !check.use1(e, lhs) {
+			ok = false
+		}
+	}
+	return ok
+}
+
+func (check *Checker) use1(e ast.Expr, lhs bool) bool {
 	var x operand
-	for _, e := range arg {
+	x.mode = value // anything but invalid
+	switch n := unparen(e).(type) {
+	case nil:
+		// nothing to do
+	case *ast.Ident:
+		// don't report an error evaluating blank
+		if n.Name == "_" {
+			break
+		}
 		// 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.rawExpr.
 		var v *Var
 		var v_used bool
-		if ident, _ := unparen(e).(*ast.Ident); ident != nil {
-			// never type-check the blank name on the lhs
-			if ident.Name == "_" {
-				continue
-			}
-			if _, obj := check.scope.LookupParent(ident.Name, token.NoPos); obj != nil {
+		if lhs {
+			if _, obj := check.scope.LookupParent(n.Name, nopos); obj != nil {
 				// It's ok to mark non-local variables, but ignore variables
 				// from other packages to avoid potential race conditions with
 				// dot-imported variables.
@@ -809,9 +1034,12 @@
 				}
 			}
 		}
-		check.rawExpr(&x, e, nil, false)
+		check.exprOrType(&x, n, true)
 		if v != nil {
 			v.used = v_used // restore v.used
 		}
+	default:
+		check.rawExpr(nil, &x, e, nil, true)
 	}
+	return x.mode != invalid
 }
diff --git a/src/go/types/chan.go b/src/go/types/chan.go
index 1f7b72b..9406200 100644
--- a/src/go/types/chan.go
+++ b/src/go/types/chan.go
@@ -1,3 +1,5 @@
+// Code generated by "go test -run=Generate -write=all"; DO NOT EDIT.
+
 // Copyright 2011 The Go Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
@@ -31,5 +33,5 @@
 // Elem returns the element type of channel c.
 func (c *Chan) Elem() Type { return c.elem }
 
-func (t *Chan) Underlying() Type { return t }
-func (t *Chan) String() string   { return TypeString(t, nil) }
+func (c *Chan) Underlying() Type { return c }
+func (c *Chan) String() string   { return TypeString(c, nil) }
diff --git a/src/go/types/check.go b/src/go/types/check.go
index 50d8afe..3b0f5e4 100644
--- a/src/go/types/check.go
+++ b/src/go/types/check.go
@@ -12,14 +12,15 @@
 	"go/ast"
 	"go/constant"
 	"go/token"
+	"internal/goversion"
 	. "internal/types/errors"
 )
 
+// nopos indicates an unknown position
+var nopos token.Pos
+
 // debugging/development support
-const (
-	debug = false // leave on during development
-	trace = false // turn on for detailed type resolution traces
-)
+const debug = false // leave on during development
 
 // exprInfo stores information about an untyped expression.
 type exprInfo struct {
@@ -118,6 +119,7 @@
 	// (initialized by Files, valid only for the duration of check.Files;
 	// maps and lists are allocated on demand)
 	files         []*ast.File               // package files
+	posVers       map[*token.File]version   // Pos -> Go version mapping
 	imports       []*PkgName                // list of imported packages
 	dotImportMap  map[dotImportKey]*PkgName // maps dot-imported objects to the package they were dot-imported through
 	recvTParamMap map[*ast.Ident]*TypeParam // maps blank receiver type parameters to their type
@@ -232,20 +234,20 @@
 		info = new(Info)
 	}
 
-	version, err := parseGoVersion(conf.GoVersion)
-	if err != nil {
-		panic(fmt.Sprintf("invalid Go version %q (%v)", conf.GoVersion, err))
-	}
+	// Note: clients may call NewChecker with the Unsafe package, which is
+	// globally shared and must not be mutated. Therefore NewChecker must not
+	// mutate *pkg.
+	//
+	// (previously, pkg.goVersion was mutated here: go.dev/issue/61212)
 
 	return &Checker{
-		conf:    conf,
-		ctxt:    conf.Context,
-		fset:    fset,
-		pkg:     pkg,
-		Info:    info,
-		version: version,
-		objMap:  make(map[Object]*declInfo),
-		impMap:  make(map[importKey]*Package),
+		conf:   conf,
+		ctxt:   conf.Context,
+		fset:   fset,
+		pkg:    pkg,
+		Info:   info,
+		objMap: make(map[Object]*declInfo),
+		impMap: make(map[importKey]*Package),
 	}
 }
 
@@ -284,6 +286,41 @@
 			// ignore this file
 		}
 	}
+
+	for _, file := range check.files {
+		v, _ := parseGoVersion(file.GoVersion)
+		if v.major > 0 {
+			if v.equal(check.version) {
+				continue
+			}
+			// Go 1.21 introduced the feature of setting the go.mod
+			// go line to an early version of Go and allowing //go:build lines
+			// to “upgrade” the Go version in a given file.
+			// We can do that backwards compatibly.
+			// Go 1.21 also introduced the feature of allowing //go:build lines
+			// to “downgrade” the Go version in a given file.
+			// That can't be done compatibly in general, since before the
+			// build lines were ignored and code got the module's Go version.
+			// To work around this, downgrades are only allowed when the
+			// module's Go version is Go 1.21 or later.
+			// If there is no check.version, then we don't really know what Go version to apply.
+			// Legacy tools may do this, and they historically have accepted everything.
+			// Preserve that behavior by ignoring //go:build constraints entirely in that case.
+			if (v.before(check.version) && check.version.before(version{1, 21})) || check.version.equal(version{0, 0}) {
+				continue
+			}
+			if check.posVers == nil {
+				check.posVers = make(map[*token.File]version)
+			}
+			check.posVers[check.fset.File(file.FileStart)] = v
+		}
+	}
+}
+
+// A posVers records that the file starting at pos declares the Go version vers.
+type posVers struct {
+	pos  token.Pos
+	vers version
 }
 
 // A bailout panic is used for early termination.
@@ -306,6 +343,20 @@
 var errBadCgo = errors.New("cannot use FakeImportC and go115UsesCgo together")
 
 func (check *Checker) checkFiles(files []*ast.File) (err error) {
+	if check.pkg == Unsafe {
+		// Defensive handling for Unsafe, which cannot be type checked, and must
+		// not be mutated. See https://go.dev/issue/61212 for an example of where
+		// Unsafe is passed to NewChecker.
+		return nil
+	}
+
+	check.version, err = parseGoVersion(check.conf.GoVersion)
+	if err != nil {
+		return err
+	}
+	if check.version.after(version{1, goversion.Version}) {
+		return fmt.Errorf("package requires newer Go version %v", check.version)
+	}
 	if check.conf.FakeImportC && check.conf.go115UsesCgo {
 		return errBadCgo
 	}
@@ -313,7 +364,7 @@
 	defer check.handleBailout(&err)
 
 	print := func(msg string) {
-		if trace {
+		if check.conf._Trace {
 			fmt.Println()
 			fmt.Println(msg)
 		}
@@ -350,6 +401,7 @@
 		check.monomorph()
 	}
 
+	check.pkg.goVersion = check.conf.GoVersion
 	check.pkg.complete = true
 
 	// no longer needed - release memory
@@ -377,15 +429,15 @@
 	// this is a sufficiently bounded process.
 	for i := top; i < len(check.delayed); i++ {
 		a := &check.delayed[i]
-		if trace {
+		if check.conf._Trace {
 			if a.desc != nil {
 				check.trace(a.desc.pos.Pos(), "-- "+a.desc.format, a.desc.args...)
 			} else {
-				check.trace(token.NoPos, "-- delayed %p", a.f)
+				check.trace(nopos, "-- delayed %p", a.f)
 			}
 		}
 		a.f() // may append to check.delayed
-		if trace {
+		if check.conf._Trace {
 			fmt.Println()
 		}
 	}
@@ -478,20 +530,24 @@
 	}
 }
 
-func (check *Checker) recordCommaOkTypes(x ast.Expr, a [2]Type) {
+// recordCommaOkTypes updates recorded types to reflect that x is used in a commaOk context
+// (and therefore has tuple type).
+func (check *Checker) recordCommaOkTypes(x ast.Expr, a []*operand) {
 	assert(x != nil)
-	if a[0] == nil || a[1] == nil {
+	assert(len(a) == 2)
+	if a[0].mode == invalid {
 		return
 	}
-	assert(isTyped(a[0]) && isTyped(a[1]) && (isBoolean(a[1]) || a[1] == universeError))
+	t0, t1 := a[0].typ, a[1].typ
+	assert(isTyped(t0) && isTyped(t1) && (isBoolean(t1) || t1 == universeError))
 	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]),
+				NewVar(pos, check.pkg, "", t0),
+				NewVar(pos, check.pkg, "", t1),
 			)
 			m[x] = tv
 			// if x is a parenthesized expression (p.X), update p.X
diff --git a/src/go/types/check_test.go b/src/go/types/check_test.go
index 215a836..9093a46 100644
--- a/src/go/types/check_test.go
+++ b/src/go/types/check_test.go
@@ -4,20 +4,27 @@
 
 // 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.
+// compared against the errors 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.
+// Expected errors are indicated in the test files by putting comments
+// of the form /* ERROR pattern */ or /* ERRORx pattern */ (or a similar
+// //-style line comment) immediately following the tokens where errors
+// are reported. There must be exactly one blank before and after the
+// ERROR/ERRORx indicator, and the pattern must be a properly quoted Go
+// string.
 //
-// For instance, the following test file indicates that a "not declared"
+// The harness will verify that each ERROR pattern is a substring of the
+// error reported at that source position, and that each ERRORx pattern
+// is a regular expression matching the respective error.
+// Consecutive comments may be used to indicate multiple errors reported
+// at the same position.
+//
+// For instance, the following test source indicates that an "undeclared"
 // error should be reported for the undeclared variable x:
 //
 //	package p
 //	func f() {
-//		_ = x /* ERROR "not declared" */ + 1
+//		_ = x /* ERROR "undeclared" */ + 1
 //	}
 
 package types_test
@@ -32,10 +39,12 @@
 	"go/scanner"
 	"go/token"
 	"internal/testenv"
+	"internal/types/errors"
 	"os"
 	"path/filepath"
 	"reflect"
 	"regexp"
+	"strconv"
 	"strings"
 	"testing"
 
@@ -49,21 +58,6 @@
 
 var fset = token.NewFileSet()
 
-// Positioned errors are of the form filename:line:column: message .
-var posMsgRx = regexp.MustCompile(`^(.*:\d+:\d+): *(?s)(.*)`)
-
-// 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, srcs [][]byte, mode parser.Mode) ([]*ast.File, []error) {
 	var files []*ast.File
 	var errlist []error
@@ -86,110 +80,28 @@
 	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.
-var errRx = regexp.MustCompile(`^ *ERROR *"?([^"]*)"?`)
-
-// errMap collects the regular expressions of ERROR comments found
-// in files and returns them as a map of error positions to error messages.
-//
-// srcs must be a slice of the same length as files, containing the original
-// source for the parsed AST.
-func errMap(t *testing.T, files []*ast.File, srcs [][]byte) map[string][]string {
-	// map of position strings to lists of error message patterns
-	errmap := make(map[string][]string)
-
-	for i, file := range files {
-		tok := fset.File(file.Package)
-		src := srcs[i]
-		var s scanner.Scanner
-		s.Init(tok, src, nil, scanner.ScanComments)
-		var prev token.Pos // position of last non-comment, non-semicolon token
-
-	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) == 2 {
-					p := fset.Position(prev).String()
-					errmap[p] = append(errmap[p], strings.TrimSpace(s[1]))
-				}
-			case token.SEMICOLON:
-				// ignore automatically inserted semicolon
-				if lit == "\n" {
-					continue scanFile
-				}
-				fallthrough
-			default:
-				prev = pos
-			}
-		}
+func unpackError(fset *token.FileSet, err error) (token.Position, string) {
+	switch err := err.(type) {
+	case *scanner.Error:
+		return err.Pos, err.Msg
+	case Error:
+		return fset.Position(err.Pos), err.Msg
 	}
-
-	return errmap
+	panic("unreachable")
 }
 
-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)
-		}
+// absDiff returns the absolute difference between x and y.
+func absDiff(x, y int) int {
+	if x < y {
+		return y - x
 	}
+	return x - y
 }
 
-// parseFlags parses flags from the first line of the given source
-// (from src if present, or by reading from the file) if the line
-// starts with "//" (line comment) followed by "-" (possibly with
-// spaces between). Otherwise the line is ignored.
-func parseFlags(filename string, src []byte, flags *flag.FlagSet) error {
-	// If there is no src, read from the file.
-	const maxLen = 256
-	if len(src) == 0 {
-		f, err := os.Open(filename)
-		if err != nil {
-			return err
-		}
-
-		var buf [maxLen]byte
-		n, err := f.Read(buf[:])
-		if err != nil {
-			return err
-		}
-		src = buf[:n]
-	}
-
+// parseFlags parses flags from the first line of the given source if the line
+// starts with "//" (line comment) followed by "-" (possibly with spaces
+// between). Otherwise the line is ignored.
+func parseFlags(src []byte, flags *flag.FlagSet) error {
 	// we must have a line comment that starts with a "-"
 	const prefix = "//"
 	if !bytes.HasPrefix(src, []byte(prefix)) {
@@ -200,6 +112,7 @@
 		return nil // comment doesn't start with a "-"
 	}
 	end := bytes.Index(src, []byte("\n"))
+	const maxLen = 256
 	if end < 0 || end > maxLen {
 		return fmt.Errorf("flags comment line too long")
 	}
@@ -207,18 +120,24 @@
 	return flags.Parse(strings.Fields(string(src[:end])))
 }
 
-func testFiles(t *testing.T, sizes Sizes, filenames []string, srcs [][]byte, manual bool, imp Importer) {
+// testFiles type-checks the package consisting of the given files, and
+// compares the resulting errors with the ERROR annotations in the source.
+//
+// The srcs slice contains the file content for the files named in the
+// filenames slice. The manual parameter specifies whether this is a 'manual'
+// test.
+//
+// If provided, opts may be used to mutate the Config before type-checking.
+func testFiles(t *testing.T, filenames []string, srcs [][]byte, manual bool, opts ...func(*Config)) {
 	if len(filenames) == 0 {
 		t.Fatal("no source files")
 	}
 
 	var conf Config
-	conf.Sizes = sizes
 	flags := flag.NewFlagSet("", flag.PanicOnError)
 	flags.StringVar(&conf.GoVersion, "lang", "", "")
 	flags.BoolVar(&conf.FakeImportC, "fakeImportC", false, "")
-	flags.BoolVar(addrOldComparableSemantics(&conf), "oldComparableSemantics", false, "")
-	if err := parseFlags(filenames[0], srcs[0], flags); err != nil {
+	if err := parseFlags(srcs[0], flags); err != nil {
 		t.Fatal(err)
 	}
 
@@ -238,10 +157,8 @@
 	}
 
 	// typecheck and collect typechecker errors
-	if imp == nil {
-		imp = importer.Default()
-	}
-	conf.Importer = imp
+	*boolFieldAddr(&conf, "_Trace") = manual && testing.Verbose()
+	conf.Importer = importer.Default()
 	conf.Error = func(err error) {
 		if *haltOnError {
 			defer panic(err)
@@ -256,48 +173,138 @@
 			errlist = append(errlist, err)
 		}
 	}
+
+	for _, opt := range opts {
+		opt(&conf)
+	}
+
 	conf.Check(pkgName, fset, files, nil)
 
 	if listErrors {
 		return
 	}
 
-	for _, err := range errlist {
-		err, ok := err.(Error)
-		if !ok {
-			continue
-		}
-		code := readCode(err)
-		if code == 0 {
-			t.Errorf("missing error code: %v", err)
+	// collect expected errors
+	errmap := make(map[string]map[int][]comment)
+	for i, filename := range filenames {
+		if m := commentMap(srcs[i], regexp.MustCompile("^ ERRORx? ")); len(m) > 0 {
+			errmap[filename] = m
 		}
 	}
 
-	// match and eliminate errors;
-	// we are expecting the following errors
-	errmap := errMap(t, files, srcs)
-	eliminate(t, errmap, errlist)
+	// match against found errors
+	var indices []int // list indices of matching errors, reused for each error
+	for _, err := range errlist {
+		gotPos, gotMsg := unpackError(fset, err)
+
+		// find list of errors for the respective error line
+		filename := gotPos.Filename
+		filemap := errmap[filename]
+		line := gotPos.Line
+		var errList []comment
+		if filemap != nil {
+			errList = filemap[line]
+		}
+
+		// At least one of the errors in errList should match the current error.
+		indices = indices[:0]
+		for i, want := range errList {
+			pattern, substr := strings.CutPrefix(want.text, " ERROR ")
+			if !substr {
+				var found bool
+				pattern, found = strings.CutPrefix(want.text, " ERRORx ")
+				if !found {
+					panic("unreachable")
+				}
+			}
+			pattern, err := strconv.Unquote(strings.TrimSpace(pattern))
+			if err != nil {
+				t.Errorf("%s:%d:%d: %v", filename, line, want.col, err)
+				continue
+			}
+			if substr {
+				if !strings.Contains(gotMsg, pattern) {
+					continue
+				}
+			} else {
+				rx, err := regexp.Compile(pattern)
+				if err != nil {
+					t.Errorf("%s:%d:%d: %v", filename, line, want.col, err)
+					continue
+				}
+				if !rx.MatchString(gotMsg) {
+					continue
+				}
+			}
+			indices = append(indices, i)
+		}
+		if len(indices) == 0 {
+			t.Errorf("%s: no error expected: %q", gotPos, gotMsg)
+			continue
+		}
+		// len(indices) > 0
+
+		// If there are multiple matching errors, select the one with the closest column position.
+		index := -1 // index of matching error
+		var delta int
+		for _, i := range indices {
+			if d := absDiff(gotPos.Column, errList[i].col); index < 0 || d < delta {
+				index, delta = i, d
+			}
+		}
+
+		// The closest column position must be within expected colDelta.
+		const colDelta = 0 // go/types errors are positioned correctly
+		if delta > colDelta {
+			t.Errorf("%s: got col = %d; want %d", gotPos, gotPos.Column, errList[index].col)
+		}
+
+		// eliminate from errList
+		if n := len(errList) - 1; n > 0 {
+			// not the last entry - slide entries down (don't reorder)
+			copy(errList[index:], errList[index+1:])
+			filemap[line] = errList[:n]
+		} else {
+			// last entry - remove errList from filemap
+			delete(filemap, line)
+		}
+
+		// if filemap is empty, eliminate from errmap
+		if len(filemap) == 0 {
+			delete(errmap, filename)
+		}
+	}
 
 	// 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)
+		t.Errorf("--- %s: unreported errors:", pkgName)
+		for filename, filemap := range errmap {
+			for line, errList := range filemap {
+				for _, err := range errList {
+					t.Errorf("%s:%d:%d: %s", filename, line, err.col, err.text)
+				}
 			}
 		}
 	}
 }
 
-func readCode(err Error) int {
+func readCode(err Error) errors.Code {
 	v := reflect.ValueOf(err)
-	return int(v.FieldByName("go116code").Int())
+	return errors.Code(v.FieldByName("go116code").Int())
 }
 
-// addrOldComparableSemantics(conf) returns &conf.oldComparableSemantics (unexported field).
-func addrOldComparableSemantics(conf *Config) *bool {
+// boolFieldAddr(conf, name) returns the address of the boolean field conf.<name>.
+// For accessing unexported fields.
+func boolFieldAddr(conf *Config, name string) *bool {
 	v := reflect.Indirect(reflect.ValueOf(conf))
-	return (*bool)(v.FieldByName("oldComparableSemantics").Addr().UnsafePointer())
+	return (*bool)(v.FieldByName(name).Addr().UnsafePointer())
+}
+
+// stringFieldAddr(conf, name) returns the address of the string field conf.<name>.
+// For accessing unexported fields.
+func stringFieldAddr(conf *Config, name string) *string {
+	v := reflect.Indirect(reflect.ValueOf(conf))
+	return (*string)(v.FieldByName(name).Addr().UnsafePointer())
 }
 
 // TestManual is for manual testing of a package - either provided
@@ -339,24 +346,30 @@
 }
 
 func TestLongConstants(t *testing.T) {
-	format := "package longconst\n\nconst _ = %s /* ERROR constant overflow */ \nconst _ = %s // ERROR excessively long constant"
+	format := `package longconst; const _ = %s /* ERROR "constant overflow" */; const _ = %s // ERROR "excessively long constant"`
 	src := fmt.Sprintf(format, strings.Repeat("1", 9999), strings.Repeat("1", 10001))
-	testFiles(t, nil, []string{"longconst.go"}, [][]byte{[]byte(src)}, false, nil)
+	testFiles(t, []string{"longconst.go"}, [][]byte{[]byte(src)}, false)
+}
+
+func withSizes(sizes Sizes) func(*Config) {
+	return func(cfg *Config) {
+		cfg.Sizes = sizes
+	}
 }
 
 // TestIndexRepresentability tests that constant index operands must
 // be representable as int even if they already have a type that can
 // represent larger values.
 func TestIndexRepresentability(t *testing.T) {
-	const src = "package index\n\nvar s []byte\nvar _ = s[int64 /* ERROR \"int64\\(1\\) << 40 \\(.*\\) overflows int\" */ (1) << 40]"
-	testFiles(t, &StdSizes{4, 4}, []string{"index.go"}, [][]byte{[]byte(src)}, false, nil)
+	const src = `package index; var s []byte; var _ = s[int64 /* ERRORx "int64\\(1\\) << 40 \\(.*\\) overflows int" */ (1) << 40]`
+	testFiles(t, []string{"index.go"}, [][]byte{[]byte(src)}, false, withSizes(&StdSizes{4, 4}))
 }
 
 func TestIssue47243_TypedRHS(t *testing.T) {
 	// The RHS of the shift expression below overflows uint on 32bit platforms,
 	// but this is OK as it is explicitly typed.
-	const src = "package issue47243\n\nvar a uint64; var _ = a << uint64(4294967296)" // uint64(1<<32)
-	testFiles(t, &StdSizes{4, 4}, []string{"p.go"}, [][]byte{[]byte(src)}, false, nil)
+	const src = `package issue47243; var a uint64; var _ = a << uint64(4294967296)` // uint64(1<<32)
+	testFiles(t, []string{"p.go"}, [][]byte{[]byte(src)}, false, withSizes(&StdSizes{4, 4}))
 }
 
 func TestCheck(t *testing.T) {
@@ -411,7 +424,6 @@
 	})
 }
 
-// TODO(rFindley) reconcile the different test setup in go/types with types2.
 func testPkg(t *testing.T, filenames []string, manual bool) {
 	srcs := make([][]byte, len(filenames))
 	for i, filename := range filenames {
@@ -421,5 +433,5 @@
 		}
 		srcs[i] = src
 	}
-	testFiles(t, nil, filenames, srcs, manual, nil)
+	testFiles(t, filenames, srcs, manual)
 }
diff --git a/src/go/types/commentMap_test.go b/src/go/types/commentMap_test.go
new file mode 100644
index 0000000..e0e3f63
--- /dev/null
+++ b/src/go/types/commentMap_test.go
@@ -0,0 +1,103 @@
+// Copyright 2022 The Go Authors. 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/scanner"
+	"go/token"
+	"regexp"
+	"strings"
+	"testing"
+)
+
+type comment struct {
+	line, col int    // comment position
+	text      string // comment text, excluding "//", "/*", or "*/"
+}
+
+// commentMap collects all comments in the given src with comment text
+// that matches the supplied regular expression rx and returns them as
+// []comment lists in a map indexed by line number. The comment text is
+// the comment with any comment markers ("//", "/*", or "*/") stripped.
+// The position for each comment is the position of the token immediately
+// preceding the comment, with all comments that are on the same line
+// collected in a slice, in source order. If there is no preceding token
+// (the matching comment appears at the beginning of the file), then the
+// recorded position is unknown (line, col = 0, 0).
+// If there are no matching comments, the result is nil.
+func commentMap(src []byte, rx *regexp.Regexp) (res map[int][]comment) {
+	fset := token.NewFileSet()
+	file := fset.AddFile("", -1, len(src))
+
+	var s scanner.Scanner
+	s.Init(file, src, nil, scanner.ScanComments)
+	var prev token.Pos // position of last non-comment, non-semicolon token
+
+	for {
+		pos, tok, lit := s.Scan()
+		switch tok {
+		case token.EOF:
+			return
+		case token.COMMENT:
+			if lit[1] == '*' {
+				lit = lit[:len(lit)-2] // strip trailing */
+			}
+			lit = lit[2:] // strip leading // or /*
+			if rx.MatchString(lit) {
+				p := fset.Position(prev)
+				err := comment{p.Line, p.Column, lit}
+				if res == nil {
+					res = make(map[int][]comment)
+				}
+				res[p.Line] = append(res[p.Line], err)
+			}
+		case token.SEMICOLON:
+			// ignore automatically inserted semicolon
+			if lit == "\n" {
+				continue
+			}
+			fallthrough
+		default:
+			prev = pos
+		}
+	}
+}
+
+func TestCommentMap(t *testing.T) {
+	const src = `/* ERROR "0:0" */ /* ERROR "0:0" */ // ERROR "0:0"
+// ERROR "0:0"
+x /* ERROR "3:1" */                // ignore automatically inserted semicolon here
+/* ERROR "3:1" */                  // position of x on previous line
+   x /* ERROR "5:4" */ ;           // do not ignore this semicolon
+/* ERROR "5:24" */                 // position of ; on previous line
+	package /* ERROR "7:2" */  // indented with tab
+        import  /* ERROR "8:9" */  // indented with blanks
+`
+	m := commentMap([]byte(src), regexp.MustCompile("^ ERROR "))
+	found := 0 // number of errors found
+	for line, errlist := range m {
+		for _, err := range errlist {
+			if err.line != line {
+				t.Errorf("%v: got map line %d; want %d", err, err.line, line)
+				continue
+			}
+			// err.line == line
+
+			got := strings.TrimSpace(err.text[len(" ERROR "):])
+			want := fmt.Sprintf(`"%d:%d"`, line, err.col)
+			if got != want {
+				t.Errorf("%v: got msg %q; want %q", err, got, want)
+				continue
+			}
+			found++
+		}
+	}
+
+	want := strings.Count(src, " ERROR ")
+	if found != want {
+		t.Errorf("commentMap got %d errors; want %d", found, want)
+	}
+}
diff --git a/src/go/types/const.go b/src/go/types/const.go
new file mode 100644
index 0000000..bffea14
--- /dev/null
+++ b/src/go/types/const.go
@@ -0,0 +1,307 @@
+// Code generated by "go test -run=Generate -write=all"; DO NOT EDIT.
+
+// Copyright 2023 The Go 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 functions for untyped constant operands.
+
+package types
+
+import (
+	"go/constant"
+	"go/token"
+	. "internal/types/errors"
+	"math"
+)
+
+// overflow checks that the constant x is representable by its type.
+// For untyped constants, it checks that the value doesn't become
+// arbitrarily large.
+func (check *Checker) overflow(x *operand, opPos token.Pos) {
+	assert(x.mode == constant_)
+
+	if x.val.Kind() == constant.Unknown {
+		// TODO(gri) We should report exactly what went wrong. At the
+		//           moment we don't have the (go/constant) API for that.
+		//           See also TODO in go/constant/value.go.
+		check.error(atPos(opPos), InvalidConstVal, "constant result is not representable")
+		return
+	}
+
+	// Typed constants must be representable in
+	// their type after each constant operation.
+	// x.typ cannot be a type parameter (type
+	// parameters cannot be constant types).
+	if isTyped(x.typ) {
+		check.representable(x, under(x.typ).(*Basic))
+		return
+	}
+
+	// Untyped integer values must not grow arbitrarily.
+	const prec = 512 // 512 is the constant precision
+	if x.val.Kind() == constant.Int && constant.BitLen(x.val) > prec {
+		op := opName(x.expr)
+		if op != "" {
+			op += " "
+		}
+		check.errorf(atPos(opPos), InvalidConstVal, "constant %soverflow", op)
+		x.val = constant.MakeUnknown()
+	}
+}
+
+// representableConst reports whether x can be represented as
+// value of the given basic type 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 and complex values, and to an Int
+// value for integer values; it is left alone otherwise.
+// It is ok to provide the addressof the first argument for rounded.
+//
+// The check parameter may be nil if representableConst is invoked
+// (indirectly) through an exported API call (AssignableTo, ConvertibleTo)
+// because we don't need the Checker's config for those calls.
+func representableConst(x constant.Value, check *Checker, typ *Basic, rounded *constant.Value) bool {
+	if x.Kind() == constant.Unknown {
+		return true // avoid follow-up errors
+	}
+
+	var conf *Config
+	if check != nil {
+		conf = check.conf
+	}
+
+	sizeof := func(T Type) int64 {
+		s := conf.sizeof(T)
+		return s
+	}
+
+	switch {
+	case isInteger(typ):
+		x := constant.ToInt(x)
+		if x.Kind() != constant.Int {
+			return false
+		}
+		if rounded != nil {
+			*rounded = x
+		}
+		if x, ok := constant.Int64Val(x); ok {
+			switch typ.kind {
+			case Int:
+				var s = uint(sizeof(typ)) * 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, UntypedInt:
+				return true
+			case Uint, Uintptr:
+				if s := uint(sizeof(typ)) * 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
+			default:
+				unreachable()
+			}
+		}
+		// x does not fit into int64
+		switch n := constant.BitLen(x); typ.kind {
+		case Uint, Uintptr:
+			var s = uint(sizeof(typ)) * 8
+			return constant.Sign(x) >= 0 && n <= int(s)
+		case Uint64:
+			return constant.Sign(x) >= 0 && n <= 64
+		case UntypedInt:
+			return true
+		}
+
+	case isFloat(typ):
+		x := constant.ToFloat(x)
+		if x.Kind() != constant.Float {
+			return false
+		}
+		switch typ.kind {
+		case Float32:
+			if rounded == nil {
+				return fitsFloat32(x)
+			}
+			r := roundFloat32(x)
+			if r != nil {
+				*rounded = r
+				return true
+			}
+		case Float64:
+			if rounded == nil {
+				return fitsFloat64(x)
+			}
+			r := roundFloat64(x)
+			if r != nil {
+				*rounded = r
+				return true
+			}
+		case UntypedFloat:
+			return true
+		default:
+			unreachable()
+		}
+
+	case isComplex(typ):
+		x := constant.ToComplex(x)
+		if x.Kind() != constant.Complex {
+			return false
+		}
+		switch typ.kind {
+		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
+		default:
+			unreachable()
+		}
+
+	case isString(typ):
+		return x.Kind() == constant.String
+
+	case isBoolean(typ):
+		return x.Kind() == constant.Bool
+	}
+
+	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
+}
+
+// representable checks that a constant operand is representable in the given
+// basic type.
+func (check *Checker) representable(x *operand, typ *Basic) {
+	v, code := check.representation(x, typ)
+	if code != 0 {
+		check.invalidConversion(code, x, typ)
+		x.mode = invalid
+		return
+	}
+	assert(v != nil)
+	x.val = v
+}
+
+// representation returns the representation of the constant operand x as the
+// basic type typ.
+//
+// If no such representation is possible, it returns a non-zero error code.
+func (check *Checker) representation(x *operand, typ *Basic) (constant.Value, Code) {
+	assert(x.mode == constant_)
+	v := x.val
+	if !representableConst(x.val, check, typ, &v) {
+		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) {
+				return nil, TruncatedFloat
+			} else {
+				return nil, NumericOverflow
+			}
+		}
+		return nil, InvalidConstVal
+	}
+	return v, 0
+}
+
+func (check *Checker) invalidConversion(code Code, x *operand, target Type) {
+	msg := "cannot convert %s to type %s"
+	switch code {
+	case TruncatedFloat:
+		msg = "%s truncated to %s"
+	case NumericOverflow:
+		msg = "%s overflows %s"
+	}
+	check.errorf(x, code, msg, x, target)
+}
+
+// convertUntyped attempts to set the type of an untyped value to the target type.
+func (check *Checker) convertUntyped(x *operand, target Type) {
+	newType, val, code := check.implicitTypeAndValue(x, target)
+	if code != 0 {
+		t := target
+		if !isTypeParam(target) {
+			t = safeUnderlying(target)
+		}
+		check.invalidConversion(code, x, t)
+		x.mode = invalid
+		return
+	}
+	if val != nil {
+		x.val = val
+		check.updateExprVal(x.expr, val)
+	}
+	if newType != x.typ {
+		x.typ = newType
+		check.updateExprType(x.expr, newType, false)
+	}
+}
diff --git a/src/go/types/context.go b/src/go/types/context.go
index 15756b0..56368e1 100644
--- a/src/go/types/context.go
+++ b/src/go/types/context.go
@@ -1,3 +1,5 @@
+// Code generated by "go test -run=Generate -write=all"; DO NOT EDIT.
+
 // Copyright 2021 The Go Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
diff --git a/src/go/types/context_test.go b/src/go/types/context_test.go
index ec30050..c9f6dce 100644
--- a/src/go/types/context_test.go
+++ b/src/go/types/context_test.go
@@ -1,3 +1,5 @@
+// Code generated by "go test -run=Generate -write=all"; DO NOT EDIT.
+
 // Copyright 2021 The Go Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
@@ -5,7 +7,6 @@
 package types
 
 import (
-	"go/token"
 	"testing"
 )
 
@@ -28,18 +29,18 @@
 	var nullaryP, nullaryQ, unaryP Type
 	{
 		// type nullaryP = func[P any]()
-		tparam := NewTypeParam(NewTypeName(token.NoPos, nil, "P", nil), &emptyInterface)
+		tparam := NewTypeParam(NewTypeName(nopos, nil, "P", nil), &emptyInterface)
 		nullaryP = NewSignatureType(nil, nil, []*TypeParam{tparam}, nil, nil, false)
 	}
 	{
 		// type nullaryQ = func[Q any]()
-		tparam := NewTypeParam(NewTypeName(token.NoPos, nil, "Q", nil), &emptyInterface)
+		tparam := NewTypeParam(NewTypeName(nopos, nil, "Q", nil), &emptyInterface)
 		nullaryQ = NewSignatureType(nil, nil, []*TypeParam{tparam}, nil, nil, false)
 	}
 	{
 		// type unaryP = func[P any](_ P)
-		tparam := NewTypeParam(NewTypeName(token.NoPos, nil, "P", nil), &emptyInterface)
-		params := NewTuple(NewVar(token.NoPos, nil, "_", tparam))
+		tparam := NewTypeParam(NewTypeName(nopos, nil, "P", nil), &emptyInterface)
+		params := NewTuple(NewVar(nopos, nil, "_", tparam))
 		unaryP = NewSignatureType(nil, nil, []*TypeParam{tparam}, params, nil, false)
 	}
 
diff --git a/src/go/types/conversions.go b/src/go/types/conversions.go
index 3cdbedb..2fa3f92 100644
--- a/src/go/types/conversions.go
+++ b/src/go/types/conversions.go
@@ -12,7 +12,7 @@
 	"unicode"
 )
 
-// Conversion type-checks the conversion T(x).
+// conversion type-checks the conversion T(x).
 // The result is in x.
 func (check *Checker) conversion(x *operand, T Type) {
 	constArg := x.mode == constant_
@@ -111,7 +111,7 @@
 // the spec) is that we cannot shift a floating-point value: 1 in 1<<s should
 // be converted to UntypedFloat because of the addition of 1.0. Fixing this
 // is tricky because we'd have to run updateExprType on the argument first.
-// (Issue #21982.)
+// (go.dev/issue/21982.)
 
 // convertibleTo reports whether T(x) is valid. In the failure case, *cause
 // may be set to the cause for the failure.
@@ -181,7 +181,7 @@
 		switch a := Tu.(type) {
 		case *Array:
 			if Identical(s.Elem(), a.Elem()) {
-				if check == nil || check.allowVersion(check.pkg, 1, 20) {
+				if check == nil || check.allowVersion(check.pkg, x, go1_20) {
 					return true
 				}
 				// check != nil
@@ -194,7 +194,7 @@
 		case *Pointer:
 			if a, _ := under(a.Elem()).(*Array); a != nil {
 				if Identical(s.Elem(), a.Elem()) {
-					if check == nil || check.allowVersion(check.pkg, 1, 17) {
+					if check == nil || check.allowVersion(check.pkg, x, go1_17) {
 						return true
 					}
 					// check != nil
diff --git a/src/go/types/decl.go b/src/go/types/decl.go
index adc485c..af8ec84 100644
--- a/src/go/types/decl.go
+++ b/src/go/types/decl.go
@@ -54,7 +54,7 @@
 // objDecl type-checks the declaration of obj in its respective (file) environment.
 // For the meaning of def, see Checker.definedType, in typexpr.go.
 func (check *Checker) objDecl(obj Object, def *Named) {
-	if trace && obj.Type() == nil {
+	if check.conf._Trace && obj.Type() == nil {
 		if check.indent == 0 {
 			fmt.Println() // empty line between top-level objects for readability
 		}
@@ -264,7 +264,7 @@
 		}
 	}
 
-	if trace {
+	if check.conf._Trace {
 		check.trace(obj.Pos(), "## cycle detected: objPath = %s->%s (len = %d)", pathString(cycle), obj.Name(), len(cycle))
 		if tparCycle {
 			check.trace(obj.Pos(), "## cycle contains: generic type in a type parameter list")
@@ -305,7 +305,7 @@
 func (check *Checker) cycleError(cycle []Object) {
 	// name returns the (possibly qualified) object name.
 	// This is needed because with generic types, cycles
-	// may refer to imported types. See issue #50788.
+	// may refer to imported types. See go.dev/issue/50788.
 	// TODO(gri) Thus functionality is used elsewhere. Factor it out.
 	name := func(obj Object) string {
 		return packagePrefix(obj.Pkg(), check.qualifier) + obj.Name()
@@ -355,7 +355,7 @@
 func firstInSrc(path []Object) int {
 	fst, pos := 0, path[0].Pos()
 	for i, t := range path[1:] {
-		if t.Pos() < pos {
+		if cmpPos(t.Pos(), pos) < 0 {
 			fst, pos = i+1, t.Pos()
 		}
 	}
@@ -455,7 +455,7 @@
 		t := check.typ(typ)
 		if !isConstType(t) {
 			// don't report an error if the type is an invalid C (defined) type
-			// (issue #22090)
+			// (go.dev/issue/22090)
 			if under(t) != Typ[Invalid] {
 				check.errorf(typ, InvalidConstType, "invalid constant type %s", t)
 			}
@@ -474,10 +474,10 @@
 			// expression and not the current constant declaration. Use
 			// the constant identifier position for any errors during
 			// init expression evaluation since that is all we have
-			// (see issues #42991, #42992).
+			// (see issues go.dev/issue/42991, go.dev/issue/42992).
 			check.errpos = atPos(obj.pos)
 		}
-		check.expr(&x, init)
+		check.expr(nil, &x, init)
 	}
 	check.initConst(obj, &x)
 }
@@ -510,7 +510,7 @@
 	if lhs == nil || len(lhs) == 1 {
 		assert(lhs == nil || lhs[0] == obj)
 		var x operand
-		check.expr(&x, init)
+		check.expr(obj.typ, &x, init)
 		check.initVar(obj, &x, "variable declaration")
 		return
 	}
@@ -532,7 +532,7 @@
 	// We have multiple variables on the lhs and one init expr.
 	// Make sure all variables have been given the same type if
 	// one was specified, otherwise they assume the type of the
-	// init expression values (was issue #15755).
+	// init expression values (was go.dev/issue/15755).
 	if typ != nil {
 		for _, lhs := range lhs {
 			lhs.typ = obj.typ
@@ -561,9 +561,7 @@
 			check.validType(t)
 		}
 		// If typ is local, an error was already reported where typ is specified/defined.
-		if check.isImportedConstraint(rhs) && !check.allowVersion(check.pkg, 1, 18) {
-			check.errorf(tdecl.Type, UnsupportedFeature, "using type constraint %s requires go1.18 or later", rhs)
-		}
+		_ = check.isImportedConstraint(rhs) && check.verifyVersionf(tdecl.Type, go1_18, "using type constraint %s", rhs)
 	}).describef(obj, "validType(%s)", obj.Name())
 
 	alias := tdecl.Assign.IsValid()
@@ -576,10 +574,7 @@
 
 	// alias declaration
 	if alias {
-		if !check.allowVersion(check.pkg, 1, 9) {
-			check.error(atPos(tdecl.Assign), UnsupportedFeature, "type aliases requires go1.9 or later")
-		}
-
+		check.verifyVersionf(atPos(tdecl.Assign), go1_9, "type aliases")
 		check.brokenAlias(obj)
 		rhs = check.typ(tdecl.Type)
 		check.validAlias(obj, rhs)
@@ -607,7 +602,7 @@
 		named.underlying = Typ[Invalid]
 	}
 
-	// Disallow a lone type parameter as the RHS of a type declaration (issue #45639).
+	// Disallow a lone type parameter as the RHS of a type declaration (go.dev/issue/45639).
 	// We don't need this restriction anymore if we make the underlying type of a type
 	// parameter its constraint interface: if the RHS is a lone type parameter, we will
 	// use its underlying type (like we do for any RHS in a type declaration), and its
@@ -628,7 +623,7 @@
 	}
 
 	// Set the type parameters before collecting the type constraints because
-	// the parameterized type may be used by the constraints (issue #47887).
+	// the parameterized type may be used by the constraints (go.dev/issue/47887).
 	// Example: type T[P T[P]] interface{}
 	*dst = bindTParams(tparams)
 
@@ -707,7 +702,7 @@
 		tparams = append(tparams, tpar)
 	}
 
-	if trace && len(names) > 0 {
+	if check.conf._Trace && len(names) > 0 {
 		check.trace(names[0].Pos(), "type params = %v", tparams[len(tparams)-len(names):])
 	}
 
@@ -735,7 +730,7 @@
 	if base != nil {
 		assert(base.TypeArgs().Len() == 0) // collectMethods should not be called on an instantiated type
 
-		// See issue #52529: we must delay the expansion of underlying here, as
+		// See go.dev/issue/52529: we must delay the expansion of underlying here, as
 		// base may not be fully set-up.
 		check.later(func() {
 			check.checkFieldUniqueness(base)
diff --git a/src/go/types/errorcalls_test.go b/src/go/types/errorcalls_test.go
index 6d6bd60..d76c06d 100644
--- a/src/go/types/errorcalls_test.go
+++ b/src/go/types/errorcalls_test.go
@@ -7,13 +7,18 @@
 import (
 	"go/ast"
 	"go/token"
+	"strconv"
 	"testing"
 )
 
-const errorfMinArgCount = 4
+const (
+	errorfMinArgCount = 4
+	errorfFormatIndex = 2
+)
 
 // TestErrorCalls makes sure that check.errorf calls have at least
-// errorfMinArgCount arguments (otherwise we should use check.error).
+// errorfMinArgCount arguments (otherwise we should use check.error)
+// and use balanced parentheses/brackets.
 func TestErrorCalls(t *testing.T) {
 	fset := token.NewFileSet()
 	files, err := pkgFiles(fset, ".")
@@ -40,7 +45,19 @@
 				t.Errorf("%s: got %d arguments, want at least %d", fset.Position(call.Pos()), n, errorfMinArgCount)
 				return false
 			}
-			return true
+			format := call.Args[errorfFormatIndex]
+			ast.Inspect(format, func(n ast.Node) bool {
+				if lit, _ := n.(*ast.BasicLit); lit != nil && lit.Kind == token.STRING {
+					if s, err := strconv.Unquote(lit.Value); err == nil {
+						if !balancedParentheses(s) {
+							t.Errorf("%s: unbalanced parentheses/brackets", fset.Position(lit.ValuePos))
+						}
+					}
+					return false
+				}
+				return true
+			})
+			return false
 		})
 	}
 }
@@ -51,3 +68,30 @@
 	}
 	return false
 }
+
+func balancedParentheses(s string) bool {
+	var stack []byte
+	for _, ch := range s {
+		var open byte
+		switch ch {
+		case '(', '[', '{':
+			stack = append(stack, byte(ch))
+			continue
+		case ')':
+			open = '('
+		case ']':
+			open = '['
+		case '}':
+			open = '{'
+		default:
+			continue
+		}
+		// closing parenthesis/bracket must have matching opening
+		top := len(stack) - 1
+		if top < 0 || stack[top] != open {
+			return false
+		}
+		stack = stack[:top]
+	}
+	return len(stack) == 0
+}
diff --git a/src/go/types/errors.go b/src/go/types/errors.go
index b52019d..14d0383 100644
--- a/src/go/types/errors.go
+++ b/src/go/types/errors.go
@@ -54,7 +54,7 @@
 
 func (err *error_) pos() token.Pos {
 	if err.empty() {
-		return token.NoPos
+		return nopos
 	}
 	return err.desc[0].posn.Pos()
 }
@@ -228,6 +228,16 @@
 		panic("no error code provided")
 	}
 
+	// If we have an URL for error codes, add a link to the first line.
+	if errp.code != 0 && check.conf._ErrorURL != "" {
+		u := fmt.Sprintf(check.conf._ErrorURL, errp.code)
+		if i := strings.Index(msg, "\n"); i >= 0 {
+			msg = msg[:i] + u + msg[i:]
+		} else {
+			msg += u
+		}
+	}
+
 	span := spanOf(errp.desc[0].posn)
 	e := Error{
 		Fset:       check.fset,
@@ -266,7 +276,7 @@
 		check.firstErr = err
 	}
 
-	if trace {
+	if check.conf._Trace {
 		pos := e.Pos
 		msg := e.Msg
 		check.trace(pos, "ERROR: %s", msg)
@@ -293,7 +303,7 @@
 }
 
 func (check *Checker) error(at positioner, code Code, msg string) {
-	check.report(newErrorf(at, code, msg))
+	check.report(newErrorf(at, code, "%s", msg))
 }
 
 func (check *Checker) errorf(at positioner, code Code, format string, args ...any) {
@@ -306,10 +316,10 @@
 	check.report(err)
 }
 
-func (check *Checker) versionErrorf(at positioner, goVersion string, format string, args ...interface{}) {
+func (check *Checker) versionErrorf(at positioner, v version, format string, args ...interface{}) {
 	msg := check.sprintf(format, args...)
 	var err *error_
-	err = newErrorf(at, UnsupportedFeature, "%s requires %s or later", msg, goVersion)
+	err = newErrorf(at, UnsupportedFeature, "%s requires %s or later", msg, v)
 	check.report(err)
 }
 
@@ -367,7 +377,7 @@
 			pos := x.Pos()
 			return posSpan{pos, pos, x.expr.End()}
 		}
-		return posSpan{token.NoPos, token.NoPos, token.NoPos}
+		return posSpan{nopos, nopos, nopos}
 	default:
 		pos := at.Pos()
 		return posSpan{pos, pos, pos}
diff --git a/src/go/types/errors_test.go b/src/go/types/errors_test.go
index 4b5dab6..3fb9c55 100644
--- a/src/go/types/errors_test.go
+++ b/src/go/types/errors_test.go
@@ -5,7 +5,6 @@
 package types
 
 import (
-	"go/token"
 	"testing"
 )
 
@@ -17,13 +16,13 @@
 	}
 
 	want = "0: foo 42"
-	err.errorf(token.NoPos, "foo %d", 42)
+	err.errorf(nopos, "foo %d", 42)
 	if got := err.String(); got != want {
 		t.Errorf("simple error: got %q, want %q", got, want)
 	}
 
 	want = "0: foo 42\n\tbar 43"
-	err.errorf(token.NoPos, "bar %d", 43)
+	err.errorf(nopos, "bar %d", 43)
 	if got := err.String(); got != want {
 		t.Errorf("simple error: got %q, want %q", got, want)
 	}
diff --git a/src/go/types/eval.go b/src/go/types/eval.go
index 084f746..ff2af58 100644
--- a/src/go/types/eval.go
+++ b/src/go/types/eval.go
@@ -52,13 +52,13 @@
 // to compute types and values, but in addition to Check, as these
 // functions ignore 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.
+// untyped type rather than the respective context-specific type.
 func CheckExpr(fset *token.FileSet, pkg *Package, pos token.Pos, expr ast.Expr, info *Info) (err error) {
 	// determine scope
 	var scope *Scope
 	if pkg == nil {
 		scope = Universe
-		pos = token.NoPos
+		pos = nopos
 	} else if !pos.IsValid() {
 		scope = pkg.scope
 	} else {
@@ -91,8 +91,8 @@
 
 	// evaluate node
 	var x operand
-	check.rawExpr(&x, expr, nil, true) // allow generic expressions
-	check.processDelayed(0)            // incl. all functions
+	check.rawExpr(nil, &x, expr, nil, true) // allow generic expressions
+	check.processDelayed(0)                 // incl. all functions
 	check.recordUntyped()
 
 	return nil
diff --git a/src/go/types/eval_test.go b/src/go/types/eval_test.go
index b0745c1..4e995af 100644
--- a/src/go/types/eval_test.go
+++ b/src/go/types/eval_test.go
@@ -59,14 +59,14 @@
 func TestEvalBasic(t *testing.T) {
 	fset := token.NewFileSet()
 	for _, typ := range Typ[Bool : String+1] {
-		testEval(t, fset, nil, token.NoPos, typ.Name(), typ, "", "")
+		testEval(t, fset, nil, 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, "")
+		testEval(t, fset, nil, nopos, test.src, nil, test.str, "")
 	}
 }
 
@@ -83,7 +83,7 @@
 	}
 	fset := token.NewFileSet()
 	for _, test := range tests {
-		testEval(t, fset, nil, token.NoPos, test, Typ[UntypedBool], "", "true")
+		testEval(t, fset, nil, nopos, test, Typ[UntypedBool], "", "true")
 	}
 }
 
diff --git a/src/go/types/example_test.go b/src/go/types/example_test.go
index 605e987..1ee47bc 100644
--- a/src/go/types/example_test.go
+++ b/src/go/types/example_test.go
@@ -5,7 +5,7 @@
 // Only run where builders (build.golang.org) have
 // access to compiled packages for import.
 //
-//go:build !android && !ios && !js
+//go:build !android && !ios && !js && !wasip1
 
 package types_test
 
@@ -35,25 +35,23 @@
 	// 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
+	for _, src := range []string{
+		`package main
 import "fmt"
 func main() {
 	freezing := FToC(-18)
 	fmt.Println(freezing, Boiling) }
-`},
-		{"celsius.go", `
-package main
+`,
+		`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
 func Unused() { {}; {{ var x int; _ = x }} } // make sure empty block scopes get printed
-`},
+`,
 	} {
-		files = append(files, mustParse(fset, file.name, file.input))
+		files = append(files, mustParse(fset, src))
 	}
 
 	// Type-check a package consisting of these files.
@@ -79,13 +77,13 @@
 	// .  func temperature.FToC(f float64) temperature.Celsius
 	// .  func temperature.Unused()
 	// .  func temperature.main()
-	// .  main.go scope {
+	// .  main scope {
 	// .  .  package fmt
 	// .  .  function scope {
 	// .  .  .  var freezing temperature.Celsius
 	// .  .  }
 	// .  }
-	// .  celsius.go scope {
+	// .  main scope {
 	// .  .  package fmt
 	// .  .  function scope {
 	// .  .  .  var c temperature.Celsius
@@ -180,8 +178,10 @@
 	}
 	return fib(x-1) - fib(x-2)
 }`
+	// We need a specific fileset in this test below for positions.
+	// Cannot use typecheck helper.
 	fset := token.NewFileSet()
-	f := mustParse(fset, "fib.go", input)
+	f := mustParse(fset, input)
 
 	// Type-check the package.
 	// We create an empty map for each kind of input
@@ -248,10 +248,10 @@
 	//   defined at -
 	//   used at 6:15
 	// func fib(x int) int:
-	//   defined at fib.go:8:6
+	//   defined at fib:8:6
 	//   used at 12:20, 12:9
 	// type S string:
-	//   defined at fib.go:4:6
+	//   defined at fib:4:6
 	//   used at 6:23
 	// type int:
 	//   defined at -
@@ -260,13 +260,13 @@
 	//   defined at -
 	//   used at 4:8
 	// var b S:
-	//   defined at fib.go:6:8
+	//   defined at fib:6:8
 	//   used at 6:19
 	// var c string:
-	//   defined at fib.go:6:11
+	//   defined at fib:6:11
 	//   used at 6:25
 	// var x int:
-	//   defined at fib.go:8:10
+	//   defined at fib:8:10
 	//   used at 10:10, 12:13, 12:24, 9:5
 	//
 	// Types and Values of each expression:
diff --git a/src/go/types/expr.go b/src/go/types/expr.go
index aa90145..fd776c2 100644
--- a/src/go/types/expr.go
+++ b/src/go/types/expr.go
@@ -13,7 +13,6 @@
 	"go/internal/typeparams"
 	"go/token"
 	. "internal/types/errors"
-	"math"
 )
 
 /*
@@ -85,41 +84,6 @@
 	return true
 }
 
-// overflow checks that the constant x is representable by its type.
-// For untyped constants, it checks that the value doesn't become
-// arbitrarily large.
-func (check *Checker) overflow(x *operand, opPos token.Pos) {
-	assert(x.mode == constant_)
-
-	if x.val.Kind() == constant.Unknown {
-		// TODO(gri) We should report exactly what went wrong. At the
-		//           moment we don't have the (go/constant) API for that.
-		//           See also TODO in go/constant/value.go.
-		check.error(atPos(opPos), InvalidConstVal, "constant result is not representable")
-		return
-	}
-
-	// Typed constants must be representable in
-	// their type after each constant operation.
-	// x.typ cannot be a type parameter (type
-	// parameters cannot be constant types).
-	if isTyped(x.typ) {
-		check.representable(x, under(x.typ).(*Basic))
-		return
-	}
-
-	// Untyped integer values must not grow arbitrarily.
-	const prec = 512 // 512 is the constant precision
-	if x.val.Kind() == constant.Int && constant.BitLen(x.val) > prec {
-		op := opName(x.expr)
-		if op != "" {
-			op += " "
-		}
-		check.errorf(atPos(opPos), InvalidConstVal, "constant %soverflow", op)
-		x.val = constant.MakeUnknown()
-	}
-}
-
 // opName returns the name of the operation if x is an operation
 // that might overflow; otherwise it returns the empty string.
 func opName(e ast.Expr) string {
@@ -160,11 +124,13 @@
 
 // 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) {
-	check.expr(x, e.X)
+	check.expr(nil, x, e.X)
 	if x.mode == invalid {
 		return
 	}
-	switch e.Op {
+
+	op := e.Op
+	switch op {
 	case token.AND:
 		// spec: "As an exception to the addressability
 		// requirement x may also be a composite literal."
@@ -202,13 +168,17 @@
 		return
 
 	case token.TILDE:
-		// Provide a better error position and message than what check.op below could do.
-		check.error(e, UndefinedOp, "cannot use ~ outside of interface or type constraint")
-		x.mode = invalid
-		return
+		// Provide a better error position and message than what check.op below would do.
+		if !allInteger(x.typ) {
+			check.error(e, UndefinedOp, "cannot use ~ outside of interface or type constraint")
+			x.mode = invalid
+			return
+		}
+		check.error(e, UndefinedOp, "cannot use ~ outside of interface or type constraint (use ^ for bitwise complement)")
+		op = token.XOR
 	}
 
-	if !check.op(unaryOpPredicates, x, e.Op) {
+	if !check.op(unaryOpPredicates, x, op) {
 		x.mode = invalid
 		return
 	}
@@ -222,7 +192,7 @@
 		if isUnsigned(x.typ) {
 			prec = uint(check.conf.sizeof(x.typ) * 8)
 		}
-		x.val = constant.UnaryOp(e.Op, x.val, prec)
+		x.val = constant.UnaryOp(op, x.val, prec)
 		x.expr = e
 		check.overflow(x, x.Pos())
 		return
@@ -245,235 +215,6 @@
 	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 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 and complex values, and to an Int
-// value for integer values; it is left alone otherwise.
-// It is ok to provide the addressof the first argument for rounded.
-//
-// The check parameter may be nil if representableConst is invoked
-// (indirectly) through an exported API call (AssignableTo, ConvertibleTo)
-// because we don't need the Checker's config for those calls.
-func representableConst(x constant.Value, check *Checker, typ *Basic, rounded *constant.Value) bool {
-	if x.Kind() == constant.Unknown {
-		return true // avoid follow-up errors
-	}
-
-	var conf *Config
-	if check != nil {
-		conf = check.conf
-	}
-
-	switch {
-	case isInteger(typ):
-		x := constant.ToInt(x)
-		if x.Kind() != constant.Int {
-			return false
-		}
-		if rounded != nil {
-			*rounded = x
-		}
-		if x, ok := constant.Int64Val(x); ok {
-			switch typ.kind {
-			case Int:
-				var s = uint(conf.sizeof(typ)) * 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, UntypedInt:
-				return true
-			case Uint, Uintptr:
-				if s := uint(conf.sizeof(typ)) * 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
-			default:
-				unreachable()
-			}
-		}
-		// x does not fit into int64
-		switch n := constant.BitLen(x); typ.kind {
-		case Uint, Uintptr:
-			var s = uint(conf.sizeof(typ)) * 8
-			return constant.Sign(x) >= 0 && n <= int(s)
-		case Uint64:
-			return constant.Sign(x) >= 0 && n <= 64
-		case UntypedInt:
-			return true
-		}
-
-	case isFloat(typ):
-		x := constant.ToFloat(x)
-		if x.Kind() != constant.Float {
-			return false
-		}
-		switch typ.kind {
-		case Float32:
-			if rounded == nil {
-				return fitsFloat32(x)
-			}
-			r := roundFloat32(x)
-			if r != nil {
-				*rounded = r
-				return true
-			}
-		case Float64:
-			if rounded == nil {
-				return fitsFloat64(x)
-			}
-			r := roundFloat64(x)
-			if r != nil {
-				*rounded = r
-				return true
-			}
-		case UntypedFloat:
-			return true
-		default:
-			unreachable()
-		}
-
-	case isComplex(typ):
-		x := constant.ToComplex(x)
-		if x.Kind() != constant.Complex {
-			return false
-		}
-		switch typ.kind {
-		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
-		default:
-			unreachable()
-		}
-
-	case isString(typ):
-		return x.Kind() == constant.String
-
-	case isBoolean(typ):
-		return x.Kind() == constant.Bool
-	}
-
-	return false
-}
-
-// representable checks that a constant operand is representable in the given
-// basic type.
-func (check *Checker) representable(x *operand, typ *Basic) {
-	v, code := check.representation(x, typ)
-	if code != 0 {
-		check.invalidConversion(code, x, typ)
-		x.mode = invalid
-		return
-	}
-	assert(v != nil)
-	x.val = v
-}
-
-// representation returns the representation of the constant operand x as the
-// basic type typ.
-//
-// If no such representation is possible, it returns a non-zero error code.
-func (check *Checker) representation(x *operand, typ *Basic) (constant.Value, Code) {
-	assert(x.mode == constant_)
-	v := x.val
-	if !representableConst(x.val, check, typ, &v) {
-		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) {
-				return nil, TruncatedFloat
-			} else {
-				return nil, NumericOverflow
-			}
-		}
-		return nil, InvalidConstVal
-	}
-	return v, 0
-}
-
-func (check *Checker) invalidConversion(code Code, x *operand, target Type) {
-	msg := "cannot convert %s to type %s"
-	switch code {
-	case TruncatedFloat:
-		msg = "%s truncated to %s"
-	case NumericOverflow:
-		msg = "%s overflows %s"
-	}
-	check.errorf(x, code, msg, x, target)
-}
-
 // 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
@@ -585,7 +326,7 @@
 		}
 		// Even if we have an integer, if the value is a constant we
 		// still must check that it is representable as the specific
-		// int type requested (was issue #22969). Fall through here.
+		// int type requested (was go.dev/issue/22969). Fall through here.
 	}
 	if old.val != nil {
 		// If x is a constant, it must be representable as a value of typ.
@@ -608,28 +349,6 @@
 	}
 }
 
-// convertUntyped attempts to set the type of an untyped value to the target type.
-func (check *Checker) convertUntyped(x *operand, target Type) {
-	newType, val, code := check.implicitTypeAndValue(x, target)
-	if code != 0 {
-		t := target
-		if !isTypeParam(target) {
-			t = safeUnderlying(target)
-		}
-		check.invalidConversion(code, x, t)
-		x.mode = invalid
-		return
-	}
-	if val != nil {
-		x.val = val
-		check.updateExprVal(x.expr, val)
-	}
-	if newType != x.typ {
-		x.typ = newType
-		check.updateExprType(x.expr, newType, false)
-	}
-}
-
 // implicitTypeAndValue returns the implicit type of x when used in a context
 // where the target type is expected. If no such implicit conversion is
 // possible, it returns a nil Type and non-zero error code.
@@ -640,19 +359,14 @@
 	if x.mode == invalid || isTyped(x.typ) || target == Typ[Invalid] {
 		return x.typ, nil, 0
 	}
+	// x is untyped
 
 	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 {
-				return target, nil, 0
-			}
-		} else if xkind != tkind {
-			return nil, nil, InvalidUntypedConversion
+		if m := maxType(x.typ, target); m != nil {
+			return m, nil, 0
 		}
-		return x.typ, nil, 0
+		return nil, nil, InvalidUntypedConversion
 	}
 
 	switch u := under(target).(type) {
@@ -689,7 +403,7 @@
 			if !hasNil(target) {
 				return nil, nil, InvalidUntypedConversion
 			}
-			// Preserve the type of nil as UntypedNil: see #13061.
+			// Preserve the type of nil as UntypedNil: see go.dev/issue/13061.
 			return Typ[UntypedNil], nil, 0
 		default:
 			return nil, nil, InvalidUntypedConversion
@@ -705,7 +419,7 @@
 			}) {
 				return nil, nil, InvalidUntypedConversion
 			}
-			// keep nil untyped (was bug #39755)
+			// keep nil untyped (was bug go.dev/issue/39755)
 			if x.isNil() {
 				return Typ[UntypedNil], nil, 0
 			}
@@ -737,7 +451,7 @@
 
 // If switchCase is true, the operator op is ignored.
 func (check *Checker) comparison(x, y *operand, op token.Token, switchCase bool) {
-	// Avoid spurious errors if any of the operands has an invalid type (issue #54405).
+	// Avoid spurious errors if any of the operands has an invalid type (go.dev/issue/54405).
 	if x.typ == Typ[Invalid] || y.typ == Typ[Invalid] {
 		x.mode = invalid
 		return
@@ -919,7 +633,7 @@
 	// or be an untyped constant representable by a value of type uint."
 
 	// Check that constants are representable by uint, but do not convert them
-	// (see also issue #47243).
+	// (see also go.dev/issue/47243).
 	var yval constant.Value
 	if y.mode == constant_ {
 		// Provide a good error message for negative shift counts.
@@ -932,7 +646,7 @@
 
 		if isUntyped(y.typ) {
 			// Caution: Check for representability here, rather than in the switch
-			// below, because isInteger includes untyped integers (was bug #43697).
+			// below, because isInteger includes untyped integers (was bug go.dev/issue/43697).
 			check.representable(y, Typ[Uint])
 			if y.mode == invalid {
 				x.mode = invalid
@@ -943,14 +657,13 @@
 		// Check that RHS is otherwise at least of integer type.
 		switch {
 		case allInteger(y.typ):
-			if !allUnsigned(y.typ) && !check.allowVersion(check.pkg, 1, 13) {
-				check.errorf(y, UnsupportedFeature, invalidOp+"signed shift count %s requires go1.13 or later", y)
+			if !allUnsigned(y.typ) && !check.verifyVersionf(y, go1_13, invalidOp+"signed shift count %s", y) {
 				x.mode = invalid
 				return
 			}
 		case isUntyped(y.typ):
 			// This is incorrect, but preserves pre-existing behavior.
-			// See also bug #47410.
+			// See also go.dev/issue/47410.
 			check.convertUntyped(y, Typ[Uint])
 			if y.mode == invalid {
 				x.mode = invalid
@@ -975,7 +688,7 @@
 				return
 			}
 			// rhs must be within reasonable bounds in constant shifts
-			const shiftBound = 1023 - 1 + 52 // so we can express smallestFloat64 (see issue #44057)
+			const shiftBound = 1023 - 1 + 52 // so we can express smallestFloat64 (see go.dev/issue/44057)
 			s, ok := constant.Uint64Val(yval)
 			if !ok || s > shiftBound {
 				check.errorf(y, InvalidShiftCount, invalidOp+"invalid shift count %s", y)
@@ -1020,7 +733,7 @@
 			// the same expr node still just leads to one entry for
 			// that node, and it can only be deleted once).
 			// Be cautious and check for presence of entry.
-			// Example: var e, f = int(1<<""[f]) // issue 11347
+			// Example: var e, f = int(1<<""[f]) // go.dev/issue/11347
 			if info, found := check.untyped[x.expr]; found {
 				info.isLhs = true
 				check.untyped[x.expr] = info
@@ -1067,8 +780,8 @@
 func (check *Checker) binary(x *operand, e ast.Expr, lhs, rhs ast.Expr, op token.Token, opPos token.Pos) {
 	var y operand
 
-	check.expr(x, lhs)
-	check.expr(&y, rhs)
+	check.expr(nil, x, lhs)
+	check.expr(nil, &y, rhs)
 
 	if x.mode == invalid {
 		return
@@ -1084,6 +797,83 @@
 		return
 	}
 
+	check.matchTypes(x, &y)
+	if x.mode == invalid {
+		return
+	}
+
+	if isComparison(op) {
+		check.comparison(x, &y, op, false)
+		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] {
+			var posn positioner = x
+			if e != nil {
+				posn = e
+			}
+			if e != nil {
+				check.errorf(posn, MismatchedTypes, invalidOp+"%s (mismatched types %s and %s)", e, x.typ, y.typ)
+			} else {
+				check.errorf(posn, MismatchedTypes, invalidOp+"%s %s= %s (mismatched types %s and %s)", lhs, op, rhs, 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 {
+		// check for zero divisor
+		if (x.mode == constant_ || allInteger(x.typ)) && y.mode == constant_ && constant.Sign(y.val) == 0 {
+			check.error(&y, DivByZero, invalidOp+"division by zero")
+			x.mode = invalid
+			return
+		}
+
+		// check for divisor underflow in complex division (see go.dev/issue/20227)
+		if x.mode == constant_ && y.mode == constant_ && isComplex(x.typ) {
+			re, im := constant.Real(y.val), constant.Imag(y.val)
+			re2, im2 := constant.BinaryOp(re, token.MUL, re), constant.BinaryOp(im, token.MUL, im)
+			if constant.Sign(re2) == 0 && constant.Sign(im2) == 0 {
+				check.error(&y, DivByZero, invalidOp+"division by zero")
+				x.mode = invalid
+				return
+			}
+		}
+	}
+
+	if x.mode == constant_ && y.mode == constant_ {
+		// if either x or y has an unknown value, the result is unknown
+		if x.val.Kind() == constant.Unknown || y.val.Kind() == constant.Unknown {
+			x.val = constant.MakeUnknown()
+			// x.typ is unchanged
+			return
+		}
+		// force integer division of integer operands
+		if op == token.QUO && isInteger(x.typ) {
+			op = token.QUO_ASSIGN
+		}
+		x.val = constant.BinaryOp(x.val, op, y.val)
+		x.expr = e
+		check.overflow(x, opPos)
+		return
+	}
+
+	x.mode = value
+	// x.typ is unchanged
+}
+
+// matchTypes attempts to convert any untyped types x and y such that they match.
+// If an error occurs, x.mode is set to invalid.
+func (check *Checker) matchTypes(x, y *operand) {
 	// mayConvert reports whether the operands x and y may
 	// possibly have matching types after converting one
 	// untyped operand to the type of the other.
@@ -1127,85 +917,18 @@
 		}
 		return true
 	}
-	if mayConvert(x, &y) {
+
+	if mayConvert(x, y) {
 		check.convertUntyped(x, y.typ)
 		if x.mode == invalid {
 			return
 		}
-		check.convertUntyped(&y, x.typ)
+		check.convertUntyped(y, x.typ)
 		if y.mode == invalid {
 			x.mode = invalid
 			return
 		}
 	}
-
-	if isComparison(op) {
-		check.comparison(x, &y, op, false)
-		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] {
-			var posn positioner = x
-			if e != nil {
-				posn = e
-			}
-			if e != nil {
-				check.errorf(posn, MismatchedTypes, invalidOp+"%s (mismatched types %s and %s)", e, x.typ, y.typ)
-			} else {
-				check.errorf(posn, MismatchedTypes, invalidOp+"%s %s= %s (mismatched types %s and %s)", lhs, op, rhs, 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 {
-		// check for zero divisor
-		if (x.mode == constant_ || allInteger(x.typ)) && y.mode == constant_ && constant.Sign(y.val) == 0 {
-			check.error(&y, DivByZero, invalidOp+"division by zero")
-			x.mode = invalid
-			return
-		}
-
-		// check for divisor underflow in complex division (see issue 20227)
-		if x.mode == constant_ && y.mode == constant_ && isComplex(x.typ) {
-			re, im := constant.Real(y.val), constant.Imag(y.val)
-			re2, im2 := constant.BinaryOp(re, token.MUL, re), constant.BinaryOp(im, token.MUL, im)
-			if constant.Sign(re2) == 0 && constant.Sign(im2) == 0 {
-				check.error(&y, DivByZero, invalidOp+"division by zero")
-				x.mode = invalid
-				return
-			}
-		}
-	}
-
-	if x.mode == constant_ && y.mode == constant_ {
-		// if either x or y has an unknown value, the result is unknown
-		if x.val.Kind() == constant.Unknown || y.val.Kind() == constant.Unknown {
-			x.val = constant.MakeUnknown()
-			// x.typ is unchanged
-			return
-		}
-		// force integer division of integer operands
-		if op == token.QUO && isInteger(x.typ) {
-			op = token.QUO_ASSIGN
-		}
-		x.val = constant.BinaryOp(x.val, op, y.val)
-		x.expr = e
-		check.overflow(x, opPos)
-		return
-	}
-
-	x.mode = value
-	// x.typ is unchanged
 }
 
 // exprKind describes the kind of an expression; the kind
@@ -1218,13 +941,19 @@
 	statement
 )
 
+// TODO(gri) In rawExpr below, consider using T instead of hint and
+//           some sort of "operation mode" instead of allowGeneric.
+//           May be clearer and less error-prone.
+
 // rawExpr typechecks expression e and initializes x with the expression
 // value or type. If an error occurred, x.mode is set to invalid.
+// If a non-nil target type T is given and e is a generic function
+// or function call, T is used to infer the type arguments for e.
 // If hint != nil, it is the type of a composite literal element.
 // If allowGeneric is set, the operand type may be an uninstantiated
 // parameterized type or function value.
-func (check *Checker) rawExpr(x *operand, e ast.Expr, hint Type, allowGeneric bool) exprKind {
-	if trace {
+func (check *Checker) rawExpr(T Type, x *operand, e ast.Expr, hint Type, allowGeneric bool) exprKind {
+	if check.conf._Trace {
 		check.trace(e.Pos(), "-- expr %s", e)
 		check.indent++
 		defer func() {
@@ -1233,10 +962,10 @@
 		}()
 	}
 
-	kind := check.exprInternal(x, e, hint)
+	kind := check.exprInternal(T, x, e, hint)
 
 	if !allowGeneric {
-		check.nonGeneric(x)
+		check.nonGeneric(T, x)
 	}
 
 	check.record(x)
@@ -1244,9 +973,10 @@
 	return kind
 }
 
-// If x is a generic function or type, nonGeneric reports an error and invalidates x.mode and x.typ.
+// If x is a generic type, or a generic function whose type arguments cannot be inferred
+// from a non-nil target type T, nonGeneric reports an error and invalidates x.mode and x.typ.
 // Otherwise it leaves x alone.
-func (check *Checker) nonGeneric(x *operand) {
+func (check *Checker) nonGeneric(T Type, x *operand) {
 	if x.mode == invalid || x.mode == novalue {
 		return
 	}
@@ -1258,6 +988,12 @@
 		}
 	case *Signature:
 		if t.tparams != nil {
+			if enableReverseTypeInference && T != nil {
+				if tsig, _ := under(T).(*Signature); tsig != nil {
+					check.funcInst(tsig, x.Pos(), x, nil, true)
+					return
+				}
+			}
 			what = "function"
 		}
 	}
@@ -1270,9 +1006,10 @@
 
 // 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 {
+// (See rawExpr for an explanation of the parameters.)
+func (check *Checker) exprInternal(T Type, x *operand, e ast.Expr, hint Type) exprKind {
 	// make sure x has a valid state in case of bailout
-	// (was issue 5770)
+	// (was go.dev/issue/5770)
 	x.mode = invalid
 	x.typ = Typ[Invalid]
 
@@ -1317,7 +1054,7 @@
 			check.errorf(e, InvalidConstVal, "malformed constant: %s", e.Value)
 			goto Error
 		}
-		// Ensure that integer values don't overflow (issue #54280).
+		// Ensure that integer values don't overflow (go.dev/issue/54280).
 		check.overflow(x, e.Pos())
 
 	case *ast.FuncLit:
@@ -1327,11 +1064,11 @@
 				// init expression/func declaration which contains
 				// them: use existing package-level declaration info.
 				decl := check.decl // capture for use in closure below
-				iota := check.iota // capture for use in closure below (#22345)
+				iota := check.iota // capture for use in closure below (go.dev/issue/22345)
 				// Don't type-check right away because the function may
 				// be part of a type definition to which the function
 				// body refers. Instead, type-check as soon as possible,
-				// but before the enclosing scope contents changes (#22992).
+				// but before the enclosing scope contents changes (go.dev/issue/22992).
 				check.later(func() {
 					check.funcBody(decl, "<function literal>", sig, e.Body, iota)
 				}).describef(e, "func literal")
@@ -1406,7 +1143,7 @@
 					key, _ := kv.Key.(*ast.Ident)
 					// do all possible checks early (before exiting due to errors)
 					// so we don't drop information on the floor
-					check.expr(x, kv.Value)
+					check.expr(nil, x, kv.Value)
 					if key == nil {
 						check.errorf(kv, InvalidLitField, "invalid field name %s in struct literal", kv.Key)
 						continue
@@ -1434,7 +1171,7 @@
 						check.error(kv, MixedStructLit, "mixture of field:value and value elements in struct literal")
 						continue
 					}
-					check.expr(x, e)
+					check.expr(nil, x, e)
 					if i >= len(fields) {
 						check.errorf(x, InvalidStructLit, "too many values in struct literal of type %s", base)
 						break // cannot continue
@@ -1457,7 +1194,7 @@
 			}
 
 		case *Array:
-			// Prevent crash if the array referred to is not yet set up. Was issue #18643.
+			// Prevent crash if the array referred to is not yet set up. Was go.dev/issue/18643.
 			// This is a stop-gap solution. Should use Checker.objPath to report entire
 			// path starting with earliest declaration in the source. TODO(gri) fix this.
 			if utyp.elem == nil {
@@ -1472,7 +1209,7 @@
 			// length the same here because it makes sense to "guess" the length for
 			// the latter if we have a composite literal; e.g. for [n]int{1, 2, 3}
 			// where n is invalid for some reason, it seems fair to assume it should
-			// be 3 (see also Checked.arrayLength and issue #27346).
+			// be 3 (see also Checked.arrayLength and go.dev/issue/27346).
 			if utyp.len < 0 {
 				utyp.len = n
 				// e.Type is missing if we have a composite literal element
@@ -1563,7 +1300,8 @@
 		x.typ = typ
 
 	case *ast.ParenExpr:
-		kind := check.rawExpr(x, e.X, nil, false)
+		// type inference doesn't go past parentheses (targe type T = nil)
+		kind := check.rawExpr(nil, x, e.X, nil, false)
 		x.expr = e
 		return kind
 
@@ -1573,7 +1311,11 @@
 	case *ast.IndexExpr, *ast.IndexListExpr:
 		ix := typeparams.UnpackIndexExpr(e)
 		if check.indexExpr(x, ix) {
-			check.funcInst(x, ix)
+			var tsig *Signature
+			if enableReverseTypeInference && T != nil {
+				tsig, _ = under(T).(*Signature)
+			}
+			check.funcInst(tsig, e.Pos(), x, ix, true)
 		}
 		if x.mode == invalid {
 			goto Error
@@ -1586,19 +1328,10 @@
 		}
 
 	case *ast.TypeAssertExpr:
-		check.expr(x, e.X)
+		check.expr(nil, x, e.X)
 		if x.mode == invalid {
 			goto Error
 		}
-		// TODO(gri) we may want to permit type assertions on type parameter values at some point
-		if isTypeParam(x.typ) {
-			check.errorf(x, InvalidAssert, invalidOp+"cannot use type assertion on type parameter value %s", x)
-			goto Error
-		}
-		if _, ok := under(x.typ).(*Interface); !ok {
-			check.errorf(x, InvalidAssert, invalidOp+"%s is not an interface", x)
-			goto Error
-		}
 		// x.(type) expressions are handled explicitly in type switches
 		if e.Type == nil {
 			// Don't use invalidAST because this can occur in the AST produced by
@@ -1606,6 +1339,14 @@
 			check.error(e, BadTypeKeyword, "use of .(type) outside type switch")
 			goto Error
 		}
+		if isTypeParam(x.typ) {
+			check.errorf(x, InvalidAssert, invalidOp+"cannot use type assertion on type parameter value %s", x)
+			goto Error
+		}
+		if _, ok := under(x.typ).(*Interface); !ok {
+			check.errorf(x, InvalidAssert, invalidOp+"%s is not an interface", x)
+			goto Error
+		}
 		T := check.varType(e.Type)
 		if T == Typ[Invalid] {
 			goto Error
@@ -1735,13 +1476,11 @@
 
 // typeAssertion checks x.(T). The type of x must be an interface.
 func (check *Checker) typeAssertion(e ast.Expr, x *operand, T Type, typeSwitch bool) {
-	method, alt := check.assertableTo(under(x.typ).(*Interface), T)
-	if method == nil {
+	var cause string
+	if check.assertableTo(x.typ, T, &cause) {
 		return // success
 	}
 
-	cause := check.missingMethodCause(T, x.typ, method, alt)
-
 	if typeSwitch {
 		check.errorf(e, ImpossibleAssert, "impossible type switch case: %s\n\t%s cannot have dynamic type %s %s", e, x, T, cause)
 		return
@@ -1751,18 +1490,54 @@
 }
 
 // expr typechecks expression e and initializes x with the expression value.
+// If a non-nil target type T is given and e is a generic function
+// or function call, T is used to infer the type arguments for e.
 // The result must be a single 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, false)
+func (check *Checker) expr(T Type, x *operand, e ast.Expr) {
+	check.rawExpr(T, x, e, nil, false)
 	check.exclude(x, 1<<novalue|1<<builtin|1<<typexpr)
 	check.singleValue(x)
 }
 
-// multiExpr is like expr but the result may also be a multi-value.
-func (check *Checker) multiExpr(x *operand, e ast.Expr) {
-	check.rawExpr(x, e, nil, false)
+// genericExpr is like expr but the result may also be generic.
+func (check *Checker) genericExpr(x *operand, e ast.Expr) {
+	check.rawExpr(nil, x, e, nil, true)
 	check.exclude(x, 1<<novalue|1<<builtin|1<<typexpr)
+	check.singleValue(x)
+}
+
+// multiExpr typechecks e and returns its value (or values) in list.
+// If allowCommaOk is set and e is a map index, comma-ok, or comma-err
+// expression, the result is a two-element list containing the value
+// of e, and an untyped bool value or an error value, respectively.
+// If an error occurred, list[0] is not valid.
+func (check *Checker) multiExpr(e ast.Expr, allowCommaOk bool) (list []*operand, commaOk bool) {
+	var x operand
+	check.rawExpr(nil, &x, e, nil, false)
+	check.exclude(&x, 1<<novalue|1<<builtin|1<<typexpr)
+
+	if t, ok := x.typ.(*Tuple); ok && x.mode != invalid {
+		// multiple values
+		list = make([]*operand, t.Len())
+		for i, v := range t.vars {
+			list[i] = &operand{mode: value, expr: e, typ: v.typ}
+		}
+		return
+	}
+
+	// exactly one (possibly invalid or comma-ok) value
+	list = []*operand{&x}
+	if allowCommaOk && (x.mode == mapindex || x.mode == commaok || x.mode == commaerr) {
+		x2 := &operand{mode: value, expr: e, typ: Typ[UntypedBool]}
+		if x.mode == commaerr {
+			x2.typ = universeError
+		}
+		list = append(list, x2)
+		commaOk = true
+	}
+
+	return
 }
 
 // exprWithHint typechecks expression e and initializes x with the expression value;
@@ -1770,7 +1545,7 @@
 // If an error occurred, x.mode is set to invalid.
 func (check *Checker) exprWithHint(x *operand, e ast.Expr, hint Type) {
 	assert(hint != nil)
-	check.rawExpr(x, e, hint, false)
+	check.rawExpr(nil, x, e, hint, false)
 	check.exclude(x, 1<<novalue|1<<builtin|1<<typexpr)
 	check.singleValue(x)
 }
@@ -1780,7 +1555,7 @@
 // value.
 // If an error occurred, x.mode is set to invalid.
 func (check *Checker) exprOrType(x *operand, e ast.Expr, allowGeneric bool) {
-	check.rawExpr(x, e, nil, allowGeneric)
+	check.rawExpr(nil, x, e, nil, allowGeneric)
 	check.exclude(x, 1<<novalue)
 	check.singleValue(x)
 }
diff --git a/src/go/types/gccgosizes.go b/src/go/types/gccgosizes.go
index 9d077cc..9152c81 100644
--- a/src/go/types/gccgosizes.go
+++ b/src/go/types/gccgosizes.go
@@ -1,3 +1,5 @@
+// Code generated by "go test -run=Generate -write=all"; DO NOT EDIT.
+
 // Copyright 2019 The Go Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
diff --git a/src/go/types/generate.go b/src/go/types/generate.go
new file mode 100644
index 0000000..7fec743
--- /dev/null
+++ b/src/go/types/generate.go
@@ -0,0 +1,8 @@
+// Copyright 2023 The Go 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 only to drive go:generate.
+//go:generate go test -run=Generate -write=all
+
+package types
diff --git a/src/go/types/generate_test.go b/src/go/types/generate_test.go
new file mode 100644
index 0000000..2578cbb
--- /dev/null
+++ b/src/go/types/generate_test.go
@@ -0,0 +1,369 @@
+// Copyright 2023 The Go 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 custom generator to create various go/types
+// source files from the corresponding types2 files.
+
+package types_test
+
+import (
+	"bytes"
+	"flag"
+	"go/ast"
+	"go/format"
+	"go/parser"
+	"go/token"
+	"internal/diff"
+	"os"
+	"path/filepath"
+	"runtime"
+	"strings"
+	"testing"
+)
+
+var filesToWrite = flag.String("write", "", `go/types files to generate, or "all" for all files`)
+
+const (
+	srcDir = "/src/cmd/compile/internal/types2/"
+	dstDir = "/src/go/types/"
+)
+
+// TestGenerate verifies that generated files in go/types match their types2
+// counterpart. If -write is set, this test actually writes the expected
+// content to go/types; otherwise, it just compares with the existing content.
+func TestGenerate(t *testing.T) {
+	// If filesToWrite is set, write the generated content to disk.
+	// In the special case of "all", write all files in filemap.
+	write := *filesToWrite != ""
+	var files []string // files to process
+	if *filesToWrite != "" && *filesToWrite != "all" {
+		files = strings.Split(*filesToWrite, ",")
+	} else {
+		for file := range filemap {
+			files = append(files, file)
+		}
+	}
+
+	for _, filename := range files {
+		generate(t, filename, write)
+	}
+}
+
+func generate(t *testing.T, filename string, write bool) {
+	// parse src
+	srcFilename := filepath.FromSlash(runtime.GOROOT() + srcDir + filename)
+	file, err := parser.ParseFile(fset, srcFilename, nil, parser.ParseComments)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	// fix package name
+	file.Name.Name = strings.ReplaceAll(file.Name.Name, "types2", "types")
+
+	// rewrite AST as needed
+	if action := filemap[filename]; action != nil {
+		action(file)
+	}
+
+	// format AST
+	var buf bytes.Buffer
+	buf.WriteString("// Code generated by \"go test -run=Generate -write=all\"; DO NOT EDIT.\n\n")
+	if err := format.Node(&buf, fset, file); err != nil {
+		t.Fatal(err)
+	}
+	generatedContent := buf.Bytes()
+
+	dstFilename := filepath.FromSlash(runtime.GOROOT() + dstDir + filename)
+	onDiskContent, err := os.ReadFile(dstFilename)
+	if err != nil {
+		t.Fatalf("reading %q: %v", filename, err)
+	}
+
+	if d := diff.Diff(filename+" (on disk)", onDiskContent, filename+" (generated)", generatedContent); d != nil {
+		if write {
+			t.Logf("applying change:\n%s", d)
+			if err := os.WriteFile(dstFilename, generatedContent, 0o644); err != nil {
+				t.Fatalf("writing %q: %v", filename, err)
+			}
+		} else {
+			t.Errorf("generated file content does not match:\n%s", string(d))
+		}
+	}
+}
+
+type action func(in *ast.File)
+
+var filemap = map[string]action{
+	"array.go":        nil,
+	"basic.go":        nil,
+	"chan.go":         nil,
+	"const.go":        func(f *ast.File) { fixTokenPos(f) },
+	"context.go":      nil,
+	"context_test.go": nil,
+	"gccgosizes.go":   nil,
+	"hilbert_test.go": func(f *ast.File) { renameImportPath(f, `"cmd/compile/internal/types2"`, `"go/types"`) },
+	"infer.go": func(f *ast.File) {
+		fixTokenPos(f)
+		fixInferSig(f)
+	},
+	// "initorder.go": fixErrErrorfCall, // disabled for now due to unresolved error_ use implications for gopls
+	"instantiate.go":      func(f *ast.File) { fixTokenPos(f); fixCheckErrorfCall(f) },
+	"instantiate_test.go": func(f *ast.File) { renameImportPath(f, `"cmd/compile/internal/types2"`, `"go/types"`) },
+	"lookup.go":           func(f *ast.File) { fixTokenPos(f) },
+	"main_test.go":        nil,
+	"map.go":              nil,
+	"named.go":            func(f *ast.File) { fixTokenPos(f); fixTraceSel(f) },
+	"object.go":           func(f *ast.File) { fixTokenPos(f); renameIdent(f, "NewTypeNameLazy", "_NewTypeNameLazy") },
+	"object_test.go":      func(f *ast.File) { renameImportPath(f, `"cmd/compile/internal/types2"`, `"go/types"`) },
+	"objset.go":           nil,
+	"package.go":          nil,
+	"pointer.go":          nil,
+	"predicates.go":       nil,
+	"scope.go": func(f *ast.File) {
+		fixTokenPos(f)
+		renameIdent(f, "Squash", "squash")
+		renameIdent(f, "InsertLazy", "_InsertLazy")
+	},
+	"selection.go":     nil,
+	"sizes.go":         func(f *ast.File) { renameIdent(f, "IsSyncAtomicAlign64", "_IsSyncAtomicAlign64") },
+	"slice.go":         nil,
+	"subst.go":         func(f *ast.File) { fixTokenPos(f); fixTraceSel(f) },
+	"termlist.go":      nil,
+	"termlist_test.go": nil,
+	"tuple.go":         nil,
+	"typelists.go":     nil,
+	"typeparam.go":     nil,
+	"typeterm_test.go": nil,
+	"typeterm.go":      nil,
+	"under.go":         nil,
+	"unify.go":         fixSprintf,
+	"universe.go":      fixGlobalTypVarDecl,
+	"util_test.go":     fixTokenPos,
+	"validtype.go":     nil,
+	"version_test.go":  nil,
+}
+
+// TODO(gri) We should be able to make these rewriters more configurable/composable.
+//           For now this is a good starting point.
+
+// renameIdent renames an identifier.
+// Note: This doesn't change the use of the identifier in comments.
+func renameIdent(f *ast.File, from, to string) {
+	ast.Inspect(f, func(n ast.Node) bool {
+		switch n := n.(type) {
+		case *ast.Ident:
+			if n.Name == from {
+				n.Name = to
+			}
+			return false
+		}
+		return true
+	})
+}
+
+// renameImportPath renames an import path.
+func renameImportPath(f *ast.File, from, to string) {
+	ast.Inspect(f, func(n ast.Node) bool {
+		switch n := n.(type) {
+		case *ast.ImportSpec:
+			if n.Path.Kind == token.STRING && n.Path.Value == from {
+				n.Path.Value = to
+				return false
+			}
+		}
+		return true
+	})
+}
+
+// fixTokenPos changes imports of "cmd/compile/internal/syntax" to "go/token",
+// uses of syntax.Pos to token.Pos, and calls to x.IsKnown() to x.IsValid().
+func fixTokenPos(f *ast.File) {
+	ast.Inspect(f, func(n ast.Node) bool {
+		switch n := n.(type) {
+		case *ast.ImportSpec:
+			// rewrite import path "cmd/compile/internal/syntax" to "go/token"
+			if n.Path.Kind == token.STRING && n.Path.Value == `"cmd/compile/internal/syntax"` {
+				n.Path.Value = `"go/token"`
+				return false
+			}
+		case *ast.SelectorExpr:
+			// rewrite syntax.Pos to token.Pos
+			if x, _ := n.X.(*ast.Ident); x != nil && x.Name == "syntax" && n.Sel.Name == "Pos" {
+				x.Name = "token"
+				return false
+			}
+		case *ast.CallExpr:
+			// rewrite x.IsKnown() to x.IsValid()
+			if fun, _ := n.Fun.(*ast.SelectorExpr); fun != nil && fun.Sel.Name == "IsKnown" && len(n.Args) == 0 {
+				fun.Sel.Name = "IsValid"
+				return false
+			}
+		}
+		return true
+	})
+}
+
+// fixInferSig updates the Checker.infer signature to use a positioner instead of a token.Position
+// as first argument, renames the argument from "pos" to "posn", and updates a few internal uses of
+// "pos" to "posn" and "posn.Pos()" respectively.
+func fixInferSig(f *ast.File) {
+	ast.Inspect(f, func(n ast.Node) bool {
+		switch n := n.(type) {
+		case *ast.FuncDecl:
+			if n.Name.Name == "infer" || n.Name.Name == "infer1" || n.Name.Name == "infer2" {
+				// rewrite (pos token.Pos, ...) to (posn positioner, ...)
+				par := n.Type.Params.List[0]
+				if len(par.Names) == 1 && par.Names[0].Name == "pos" {
+					par.Names[0] = newIdent(par.Names[0].Pos(), "posn")
+					par.Type = newIdent(par.Type.Pos(), "positioner")
+					return true
+				}
+			}
+		case *ast.CallExpr:
+			if selx, _ := n.Fun.(*ast.SelectorExpr); selx != nil {
+				switch selx.Sel.Name {
+				case "renameTParams":
+					// rewrite check.renameTParams(pos, ... ) to check.renameTParams(posn.Pos(), ... )
+					if ident, _ := n.Args[0].(*ast.Ident); ident != nil && ident.Name == "pos" {
+						pos := n.Args[0].Pos()
+						fun := &ast.SelectorExpr{X: newIdent(pos, "posn"), Sel: newIdent(pos, "Pos")}
+						arg := &ast.CallExpr{Fun: fun, Lparen: pos, Args: nil, Ellipsis: token.NoPos, Rparen: pos}
+						n.Args[0] = arg
+						return false
+					}
+				case "errorf", "infer1", "infer2":
+					// rewrite check.errorf(pos, ...) to check.errorf(posn, ...)
+					// rewrite check.infer1(pos, ...) to check.infer1(posn, ...)
+					// rewrite check.infer2(pos, ...) to check.infer2(posn, ...)
+					if ident, _ := n.Args[0].(*ast.Ident); ident != nil && ident.Name == "pos" {
+						pos := n.Args[0].Pos()
+						arg := newIdent(pos, "posn")
+						n.Args[0] = arg
+						return false
+					}
+				case "allowVersion":
+					// rewrite check.allowVersion(..., pos, ...) to check.allowVersion(..., posn, ...)
+					if ident, _ := n.Args[1].(*ast.Ident); ident != nil && ident.Name == "pos" {
+						pos := n.Args[1].Pos()
+						arg := newIdent(pos, "posn")
+						n.Args[1] = arg
+						return false
+					}
+				}
+			}
+		}
+		return true
+	})
+}
+
+// fixErrErrorfCall updates calls of the form err.errorf(obj, ...) to err.errorf(obj.Pos(), ...).
+func fixErrErrorfCall(f *ast.File) {
+	ast.Inspect(f, func(n ast.Node) bool {
+		switch n := n.(type) {
+		case *ast.CallExpr:
+			if selx, _ := n.Fun.(*ast.SelectorExpr); selx != nil {
+				if ident, _ := selx.X.(*ast.Ident); ident != nil && ident.Name == "err" {
+					switch selx.Sel.Name {
+					case "errorf":
+						// rewrite err.errorf(obj, ... ) to err.errorf(obj.Pos(), ... )
+						if ident, _ := n.Args[0].(*ast.Ident); ident != nil && ident.Name == "obj" {
+							pos := n.Args[0].Pos()
+							fun := &ast.SelectorExpr{X: ident, Sel: newIdent(pos, "Pos")}
+							arg := &ast.CallExpr{Fun: fun, Lparen: pos, Args: nil, Ellipsis: token.NoPos, Rparen: pos}
+							n.Args[0] = arg
+							return false
+						}
+					}
+				}
+			}
+		}
+		return true
+	})
+}
+
+// fixCheckErrorfCall updates calls of the form check.errorf(pos, ...) to check.errorf(atPos(pos), ...).
+func fixCheckErrorfCall(f *ast.File) {
+	ast.Inspect(f, func(n ast.Node) bool {
+		switch n := n.(type) {
+		case *ast.CallExpr:
+			if selx, _ := n.Fun.(*ast.SelectorExpr); selx != nil {
+				if ident, _ := selx.X.(*ast.Ident); ident != nil && ident.Name == "check" {
+					switch selx.Sel.Name {
+					case "errorf":
+						// rewrite check.errorf(pos, ... ) to check.errorf(atPos(pos), ... )
+						if ident, _ := n.Args[0].(*ast.Ident); ident != nil && ident.Name == "pos" {
+							pos := n.Args[0].Pos()
+							fun := newIdent(pos, "atPos")
+							arg := &ast.CallExpr{Fun: fun, Lparen: pos, Args: []ast.Expr{ident}, Ellipsis: token.NoPos, Rparen: pos}
+							n.Args[0] = arg
+							return false
+						}
+					}
+				}
+			}
+		}
+		return true
+	})
+}
+
+// fixTraceSel renames uses of x.Trace to x.trace, where x for any x with a Trace field.
+func fixTraceSel(f *ast.File) {
+	ast.Inspect(f, func(n ast.Node) bool {
+		switch n := n.(type) {
+		case *ast.SelectorExpr:
+			// rewrite x.Trace to x._Trace (for Config.Trace)
+			if n.Sel.Name == "Trace" {
+				n.Sel.Name = "_Trace"
+				return false
+			}
+		}
+		return true
+	})
+}
+
+// fixGlobalTypVarDecl changes the global Typ variable from an array to a slice
+// (in types2 we use an array for efficiency, in go/types it's a slice and we
+// cannot change that).
+func fixGlobalTypVarDecl(f *ast.File) {
+	ast.Inspect(f, func(n ast.Node) bool {
+		switch n := n.(type) {
+		case *ast.ValueSpec:
+			// rewrite type Typ = [...]Type{...} to type Typ = []Type{...}
+			if len(n.Names) == 1 && n.Names[0].Name == "Typ" && len(n.Values) == 1 {
+				n.Values[0].(*ast.CompositeLit).Type.(*ast.ArrayType).Len = nil
+				return false
+			}
+		}
+		return true
+	})
+}
+
+// fixSprintf adds an extra nil argument for the *token.FileSet parameter in sprintf calls.
+func fixSprintf(f *ast.File) {
+	ast.Inspect(f, func(n ast.Node) bool {
+		switch n := n.(type) {
+		case *ast.CallExpr:
+			if fun, _ := n.Fun.(*ast.Ident); fun != nil && fun.Name == "sprintf" && len(n.Args) >= 4 /* ... args */ {
+				n.Args = insert(n.Args, 1, newIdent(n.Args[1].Pos(), "nil"))
+				return false
+			}
+		}
+		return true
+	})
+}
+
+// newIdent returns a new identifier with the given position and name.
+func newIdent(pos token.Pos, name string) *ast.Ident {
+	id := ast.NewIdent(name)
+	id.NamePos = pos
+	return id
+}
+
+// insert inserts x at list[at] and moves the remaining elements up.
+func insert(list []ast.Expr, at int, x ast.Expr) []ast.Expr {
+	list = append(list, nil)
+	copy(list[at+1:], list[at:])
+	list[at] = x
+	return list
+}
diff --git a/src/go/types/hilbert_test.go b/src/go/types/hilbert_test.go
index 7d0f58e..434d78f 100644
--- a/src/go/types/hilbert_test.go
+++ b/src/go/types/hilbert_test.go
@@ -1,3 +1,5 @@
+// Code generated by "go test -run=Generate -write=all"; DO NOT EDIT.
+
 // Copyright 2013 The Go Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
@@ -8,10 +10,6 @@
 	"bytes"
 	"flag"
 	"fmt"
-	"go/ast"
-	"go/importer"
-	"go/parser"
-	"go/token"
 	"os"
 	"testing"
 
@@ -31,20 +29,8 @@
 		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)
-	}
+	DefPredeclaredTestFuncs() // declare assert (used by code generated by verify)
+	mustTypecheck(string(src), nil, nil)
 }
 
 func program(n int, out string) []byte {
@@ -84,7 +70,7 @@
 	bytes.Buffer
 }
 
-func (g *gen) p(format string, args ...any) {
+func (g *gen) p(format string, args ...interface{}) {
 	fmt.Fprintf(&g.Buffer, format, args...)
 }
 
diff --git a/src/go/types/index.go b/src/go/types/index.go
index 45d591e..c1c0f40 100644
--- a/src/go/types/index.go
+++ b/src/go/types/index.go
@@ -43,7 +43,7 @@
 	}
 
 	// x should not be generic at this point, but be safe and check
-	check.nonGeneric(x)
+	check.nonGeneric(nil, x)
 	if x.mode == invalid {
 		return false
 	}
@@ -93,7 +93,7 @@
 			return false
 		}
 		var key operand
-		check.expr(&key, index)
+		check.expr(nil, &key, index)
 		check.assignment(&key, typ.key, "map index")
 		// ok to continue even if indexing failed - map element type is known
 		x.mode = mapindex
@@ -167,7 +167,7 @@
 					return false
 				}
 				var k operand
-				check.expr(&k, index)
+				check.expr(nil, &k, index)
 				check.assignment(&k, key, "map index")
 				// ok to continue even if indexing failed - map element type is known
 				x.mode = mapindex
@@ -186,6 +186,7 @@
 	if !valid {
 		// types2 uses the position of '[' for the error
 		check.errorf(x, NonIndexableOperand, invalidOp+"cannot index %s", x)
+		check.use(e.Indices...)
 		x.mode = invalid
 		return false
 	}
@@ -208,7 +209,7 @@
 }
 
 func (check *Checker) sliceExpr(x *operand, e *ast.SliceExpr) {
-	check.expr(x, e.X)
+	check.expr(nil, x, e.X)
 	if x.mode == invalid {
 		check.use(e.Low, e.High, e.Max)
 		return
@@ -350,7 +351,7 @@
 	val = -1
 
 	var x operand
-	check.expr(&x, index)
+	check.expr(nil, &x, index)
 	if !check.isValidIndex(&x, InvalidIndex, "index", false) {
 		return
 	}
@@ -408,7 +409,7 @@
 	return true
 }
 
-// indexElts checks the elements (elts) of an array or slice composite literal
+// indexedElts 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).
diff --git a/src/go/types/infer.go b/src/go/types/infer.go
index dc87902..cb76344 100644
--- a/src/go/types/infer.go
+++ b/src/go/types/infer.go
@@ -1,9 +1,10 @@
+// Code generated by "go test -run=Generate -write=all"; DO NOT EDIT.
+
 // Copyright 2018 The Go 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 parameter inference given
-// a list of concrete arguments and a parameter list.
+// This file implements type parameter inference.
 
 package types
 
@@ -14,37 +15,30 @@
 	"strings"
 )
 
+// If enableReverseTypeInference is set, uninstantiated and
+// partially instantiated generic functions may be assigned
+// (incl. returned) to variables of function type and type
+// inference will attempt to infer the missing type arguments.
+// Available with go1.21.
+const enableReverseTypeInference = true // disable for debugging
+
 // infer attempts to infer the complete set of type arguments for generic function instantiation/call
 // based on the given type parameters tparams, type arguments targs, function parameters params, and
 // function arguments args, if any. There must be at least one type parameter, no more type arguments
 // than type parameters, and params and args must match in number (incl. zero).
-// If successful, infer returns the complete list of type arguments, one for each type parameter.
-// Otherwise the result is nil and appropriate errors will be reported.
-//
-// Inference proceeds as follows:
-//
-//	Starting with given type arguments
-//	1) apply FTI (function type inference) with typed arguments,
-//	2) apply CTI (constraint type inference),
-//	3) apply FTI with untyped function arguments,
-//	4) apply CTI.
-//
-// The process stops as soon as all type arguments are known or an error occurs.
-func (check *Checker) infer(posn positioner, tparams []*TypeParam, targs []Type, params *Tuple, args []*operand) (result []Type) {
+// If successful, infer returns the complete list of given and inferred type arguments, one for each
+// type parameter. Otherwise the result is nil and appropriate errors will be reported.
+func (check *Checker) infer(posn positioner, tparams []*TypeParam, targs []Type, params *Tuple, args []*operand) (inferred []Type) {
 	if debug {
 		defer func() {
-			assert(result == nil || len(result) == len(tparams))
-			for _, targ := range result {
-				assert(targ != nil)
-			}
-			//check.dump("### inferred targs = %s", result)
+			assert(inferred == nil || len(inferred) == len(tparams) && !containsNil(inferred))
 		}()
 	}
 
 	if traceInference {
-		check.dump("-- inferA %s%s ➞ %s", tparams, params, targs)
+		check.dump("== infer : %s%s ➞ %s", tparams, params, targs) // aligned with rename print below
 		defer func() {
-			check.dump("=> inferA %s ➞ %s", tparams, result)
+			check.dump("=> %s ➞ %s\n", tparams, inferred)
 		}()
 	}
 
@@ -52,115 +46,16 @@
 	n := len(tparams)
 	assert(n > 0 && len(targs) <= n)
 
-	// Function parameters and arguments must match in number.
+	// Parameters and arguments must match in number.
 	assert(params.Len() == len(args))
 
 	// If we already have all type arguments, we're done.
-	if len(targs) == n {
+	if len(targs) == n && !containsNil(targs) {
 		return targs
 	}
-	// len(targs) < n
 
-	const enableTparamRenaming = true
-	if enableTparamRenaming {
-		// For the purpose of type inference we must differentiate type parameters
-		// occurring in explicit type or value function arguments from the type
-		// parameters we are solving for via unification, because they may be the
-		// same in self-recursive calls. For example:
-		//
-		//  func f[P *Q, Q any](p P, q Q) {
-		//    f(p)
-		//  }
-		//
-		// In this example, the fact that the P used in the instantation f[P] has
-		// the same pointer identity as the P we are trying to solve for via
-		// unification is coincidental: there is nothing special about recursive
-		// calls that should cause them to conflate the identity of type arguments
-		// with type parameters. To put it another way: any such self-recursive
-		// call is equivalent to a mutually recursive call, which does not run into
-		// any problems of type parameter identity. For example, the following code
-		// is equivalent to the code above.
-		//
-		//  func f[P interface{*Q}, Q any](p P, q Q) {
-		//    f2(p)
-		//  }
-		//
-		//  func f2[P interface{*Q}, Q any](p P, q Q) {
-		//    f(p)
-		//  }
-		//
-		// We turn the first example into the second example by renaming type
-		// parameters in the original signature to give them a new identity.
-		tparams2 := make([]*TypeParam, len(tparams))
-		for i, tparam := range tparams {
-			tname := NewTypeName(tparam.Obj().Pos(), tparam.Obj().Pkg(), tparam.Obj().Name(), nil)
-			tparams2[i] = NewTypeParam(tname, nil)
-			tparams2[i].index = tparam.index // == i
-		}
-
-		renameMap := makeRenameMap(tparams, tparams2)
-		for i, tparam := range tparams {
-			tparams2[i].bound = check.subst(posn.Pos(), tparam.bound, renameMap, nil, check.context())
-		}
-
-		tparams = tparams2
-		params = check.subst(posn.Pos(), params, renameMap, nil, check.context()).(*Tuple)
-	}
-
-	// If we have more than 2 arguments, we may have arguments with named and unnamed types.
-	// If that is the case, permutate params and args such that the arguments with named
-	// types are first in the list. This doesn't affect type inference if all types are taken
-	// as is. But when we have inexact unification enabled (as is the case for function type
-	// inference), when a named type is unified with an unnamed type, unification proceeds
-	// with the underlying type of the named type because otherwise unification would fail
-	// right away. This leads to an asymmetry in type inference: in cases where arguments of
-	// named and unnamed types are passed to parameters with identical type, different types
-	// (named vs underlying) may be inferred depending on the order of the arguments.
-	// By ensuring that named types are seen first, order dependence is avoided and unification
-	// succeeds where it can (issue #43056).
-	const enableArgSorting = true
-	if m := len(args); m >= 2 && enableArgSorting {
-		// Determine indices of arguments with named and unnamed types.
-		var named, unnamed []int
-		for i, arg := range args {
-			if hasName(arg.typ) {
-				named = append(named, i)
-			} else {
-				unnamed = append(unnamed, i)
-			}
-		}
-
-		// If we have named and unnamed types, move the arguments with
-		// named types first. Update the parameter list accordingly.
-		// Make copies so as not to clobber the incoming slices.
-		if len(named) != 0 && len(unnamed) != 0 {
-			params2 := make([]*Var, m)
-			args2 := make([]*operand, m)
-			i := 0
-			for _, j := range named {
-				params2[i] = params.At(j)
-				args2[i] = args[j]
-				i++
-			}
-			for _, j := range unnamed {
-				params2[i] = params.At(j)
-				args2[i] = args[j]
-				i++
-			}
-			params = NewTuple(params2...)
-			args = args2
-		}
-	}
-
-	// --- 1 ---
-	// Continue with the type arguments we have. Avoid matching generic
-	// parameters that already have type arguments against function arguments:
-	// It may fail because matching uses type identity while parameter passing
-	// uses assignment rules. Instantiate the parameter list with the type
-	// arguments we have, and continue with that parameter list.
-
-	// First, make sure we have a "full" list of type arguments, some of which
-	// may be nil (unknown). Make a copy so as to not clobber the incoming slice.
+	// Make sure we have a "full" list of type arguments, some of which may
+	// be nil (unknown). Make a copy so as to not clobber the incoming slice.
 	if len(targs) < n {
 		targs2 := make([]Type, n)
 		copy(targs2, targs)
@@ -168,32 +63,47 @@
 	}
 	// len(targs) == n
 
+	// Continue with the type arguments we have. Avoid matching generic
+	// parameters that already have type arguments against function arguments:
+	// It may fail because matching uses type identity while parameter passing
+	// uses assignment rules. Instantiate the parameter list with the type
+	// arguments we have, and continue with that parameter list.
+
 	// Substitute type arguments for their respective type parameters in params,
 	// if any. Note that nil targs entries are ignored by check.subst.
-	// TODO(gri) Can we avoid this (we're setting known type arguments below,
-	//           but that doesn't impact the isParameterized check for now).
+	// We do this for better error messages; it's not needed for correctness.
+	// For instance, given:
+	//
+	//   func f[P, Q any](P, Q) {}
+	//
+	//   func _(s string) {
+	//           f[int](s, s) // ERROR
+	//   }
+	//
+	// With substitution, we get the error:
+	//   "cannot use s (variable of type string) as int value in argument to f[int]"
+	//
+	// Without substitution we get the (worse) error:
+	//   "type string of s does not match inferred type int for P"
+	// even though the type int was provided (not inferred) for P.
+	//
+	// TODO(gri) We might be able to finesse this in the error message reporting
+	//           (which only happens in case of an error) and then avoid doing
+	//           the substitution (which always happens).
 	if params.Len() > 0 {
 		smap := makeSubstMap(tparams, targs)
-		params = check.subst(token.NoPos, params, smap, nil, check.context()).(*Tuple)
+		params = check.subst(nopos, params, smap, nil, check.context()).(*Tuple)
 	}
 
 	// Unify parameter and argument types for generic parameters with typed arguments
 	// and collect the indices of generic parameters with untyped arguments.
 	// Terminology: generic parameter = function parameter with a type-parameterized type
-	u := newUnifier(false)
-	u.x.init(tparams)
-
-	// Set the type arguments which we know already.
-	for i, targ := range targs {
-		if targ != nil {
-			u.x.set(i, targ)
-		}
-	}
+	u := newUnifier(tparams, targs, check.allowVersion(check.pkg, posn, go1_21))
 
 	errorf := func(kind string, tpar, targ Type, arg *operand) {
 		// provide a better error message if we can
-		targs, index := u.x.types()
-		if index == 0 {
+		targs := u.inferred(tparams)
+		if targs[0] == nil {
 			// The first type parameter couldn't be inferred.
 			// If none of them could be inferred, don't try
 			// to provide the inferred type in the error msg.
@@ -210,12 +120,12 @@
 			}
 		}
 		smap := makeSubstMap(tparams, targs)
-		// TODO(rFindley): pass a positioner here, rather than arg.Pos().
+		// TODO(gri): pass a poser here, rather than arg.Pos().
 		inferred := check.subst(arg.Pos(), tpar, smap, nil, check.context())
-		// _CannotInferTypeArgs indicates a failure of inference, though the actual
+		// CannotInferTypeArgs indicates a failure of inference, though the actual
 		// error may be better attributed to a user-provided type argument (hence
-		// _InvalidTypeArg). We can't differentiate these cases, so fall back on
-		// the more general _CannotInferTypeArgs.
+		// InvalidTypeArg). We can't differentiate these cases, so fall back on
+		// the more general CannotInferTypeArgs.
 		if inferred != tpar {
 			check.errorf(arg, CannotInferTypeArgs, "%s %s of %s does not match inferred type %s for %s", kind, targ, arg.expr, inferred, tpar)
 		} else {
@@ -223,94 +133,354 @@
 		}
 	}
 
-	// indices of the generic parameters with untyped arguments - save for later
-	var indices []int
+	// indices of generic parameters with untyped arguments, for later use
+	var untyped []int
+
+	// --- 1 ---
+	// use information from function arguments
+
+	if traceInference {
+		u.tracef("== function parameters: %s", params)
+		u.tracef("-- function arguments : %s", args)
+	}
+
 	for i, arg := range args {
+		if arg.mode == invalid {
+			// An error was reported earlier. Ignore this arg
+			// and continue, we may still be able to infer all
+			// targs resulting in fewer follow-on errors.
+			// TODO(gri) determine if we still need this check
+			continue
+		}
 		par := params.At(i)
-		// If we permit bidirectional unification, this conditional code needs to be
-		// executed even if par.typ is not parameterized since the argument may be a
-		// generic function (for which we want to infer its type arguments).
-		if isParameterized(tparams, par.typ) {
-			if arg.mode == invalid {
-				// An error was reported earlier. Ignore this targ
-				// and continue, we may still be able to infer all
-				// targs resulting in fewer follow-on errors.
-				continue
-			}
-			if targ := arg.typ; isTyped(targ) {
-				// If we permit bidirectional unification, and targ is
-				// a generic function, we need to initialize u.y with
-				// the respective type parameters of targ.
-				if !u.unify(par.typ, targ) {
-					errorf("type", par.typ, targ, arg)
+		if isParameterized(tparams, par.typ) || isParameterized(tparams, arg.typ) {
+			// Function parameters are always typed. Arguments may be untyped.
+			// Collect the indices of untyped arguments and handle them later.
+			if isTyped(arg.typ) {
+				if !u.unify(par.typ, arg.typ, assign) {
+					errorf("type", par.typ, arg.typ, arg)
 					return nil
 				}
-			} else if _, ok := par.typ.(*TypeParam); ok {
+			} else if _, ok := par.typ.(*TypeParam); ok && !arg.isNil() {
 				// Since default types are all basic (i.e., non-composite) types, an
 				// untyped argument will never match a composite parameter type; the
 				// only parameter type it can possibly match against is a *TypeParam.
 				// Thus, for untyped arguments we only need to look at parameter types
 				// that are single type parameters.
-				indices = append(indices, i)
+				// Also, untyped nils don't have a default type and can be ignored.
+				untyped = append(untyped, i)
 			}
 		}
 	}
 
-	// If we've got all type arguments, we're done.
-	var index int
-	targs, index = u.x.types()
-	if index < 0 {
-		return targs
+	if traceInference {
+		inferred := u.inferred(tparams)
+		u.tracef("=> %s ➞ %s\n", tparams, inferred)
 	}
 
 	// --- 2 ---
-	// See how far we get with constraint type inference.
-	// Note that even if we don't have any type arguments, constraint type inference
-	// may produce results for constraints that explicitly specify a type.
-	targs, index = check.inferB(posn, tparams, targs)
-	if targs == nil || index < 0 {
-		return targs
+	// use information from type parameter constraints
+
+	if traceInference {
+		u.tracef("== type parameters: %s", tparams)
 	}
 
-	// --- 3 ---
-	// Use any untyped arguments to infer additional type arguments.
-	// Some generic parameters with untyped arguments may have been given
-	// a type by now, we can ignore them.
-	for _, i := range indices {
-		tpar := params.At(i).typ.(*TypeParam) // is type parameter by construction of indices
-		// Only consider untyped arguments for which the corresponding type
-		// parameter doesn't have an inferred type yet.
-		if targs[tpar.index] == nil {
-			arg := args[i]
-			targ := Default(arg.typ)
-			// The default type for an untyped nil is untyped nil. We must not
-			// infer an untyped nil type as type parameter type. Ignore untyped
-			// nil by making sure all default argument types are typed.
-			if isTyped(targ) && !u.unify(tpar, targ) {
-				errorf("default type", tpar, targ, arg)
-				return nil
+	// Unify type parameters with their constraints as long
+	// as progress is being made.
+	//
+	// This is an O(n^2) algorithm where n is the number of
+	// type parameters: if there is progress, at least one
+	// type argument is inferred per iteration, and we have
+	// a doubly nested loop.
+	//
+	// In practice this is not a problem because the number
+	// of type parameters tends to be very small (< 5 or so).
+	// (It should be possible for unification to efficiently
+	// signal newly inferred type arguments; then the loops
+	// here could handle the respective type parameters only,
+	// but that will come at a cost of extra complexity which
+	// may not be worth it.)
+	for i := 0; ; i++ {
+		nn := u.unknowns()
+		if traceInference {
+			if i > 0 {
+				fmt.Println()
 			}
+			u.tracef("-- iteration %d", i)
+		}
+
+		for _, tpar := range tparams {
+			tx := u.at(tpar)
+			core, single := coreTerm(tpar)
+			if traceInference {
+				u.tracef("-- type parameter %s = %s: core(%s) = %s, single = %v", tpar, tx, tpar, core, single)
+			}
+
+			// If there is a core term (i.e., a core type with tilde information)
+			// unify the type parameter with the core type.
+			if core != nil {
+				// A type parameter can be unified with its core type in two cases.
+				switch {
+				case tx != nil:
+					// The corresponding type argument tx is known. There are 2 cases:
+					// 1) If the core type has a tilde, per spec requirement for tilde
+					//    elements, the core type is an underlying (literal) type.
+					//    And because of the tilde, the underlying type of tx must match
+					//    against the core type.
+					//    But because unify automatically matches a defined type against
+					//    an underlying literal type, we can simply unify tx with the
+					//    core type.
+					// 2) If the core type doesn't have a tilde, we also must unify tx
+					//    with the core type.
+					if !u.unify(tx, core.typ, 0) {
+						// TODO(gri) Type parameters that appear in the constraint and
+						//           for which we have type arguments inferred should
+						//           use those type arguments for a better error message.
+						check.errorf(posn, CannotInferTypeArgs, "%s (type %s) does not satisfy %s", tpar, tx, tpar.Constraint())
+						return nil
+					}
+				case single && !core.tilde:
+					// The corresponding type argument tx is unknown and there's a single
+					// specific type and no tilde.
+					// In this case the type argument must be that single type; set it.
+					u.set(tpar, core.typ)
+				}
+			} else {
+				if tx != nil {
+					// We don't have a core type, but the type argument tx is known.
+					// It must have (at least) all the methods of the type constraint,
+					// and the method signatures must unify; otherwise tx cannot satisfy
+					// the constraint.
+					// TODO(gri) Now that unification handles interfaces, this code can
+					//           be reduced to calling u.unify(tx, tpar.iface(), assign)
+					//           (which will compare signatures exactly as we do below).
+					//           We leave it as is for now because missingMethod provides
+					//           a failure cause which allows for a better error message.
+					//           Eventually, unify should return an error with cause.
+					var cause string
+					constraint := tpar.iface()
+					if m, _ := check.missingMethod(tx, constraint, true, func(x, y Type) bool { return u.unify(x, y, exact) }, &cause); m != nil {
+						// TODO(gri) better error message (see TODO above)
+						check.errorf(posn, CannotInferTypeArgs, "%s (type %s) does not satisfy %s %s", tpar, tx, tpar.Constraint(), cause)
+						return nil
+					}
+				}
+			}
+		}
+
+		if u.unknowns() == nn {
+			break // no progress
 		}
 	}
 
-	// If we've got all type arguments, we're done.
-	targs, index = u.x.types()
-	if index < 0 {
-		return targs
+	if traceInference {
+		inferred := u.inferred(tparams)
+		u.tracef("=> %s ➞ %s\n", tparams, inferred)
 	}
 
-	// --- 4 ---
-	// Again, follow up with constraint type inference.
-	targs, index = check.inferB(posn, tparams, targs)
-	if targs == nil || index < 0 {
-		return targs
+	// --- 3 ---
+	// use information from untyped constants
+
+	if traceInference {
+		u.tracef("== untyped arguments: %v", untyped)
 	}
 
-	// At least one type argument couldn't be inferred.
-	assert(index >= 0 && targs[index] == nil)
-	tpar := tparams[index]
-	check.errorf(posn, CannotInferTypeArgs, "cannot infer %s (%v)", tpar.obj.name, tpar.obj.pos)
-	return nil
+	// Some generic parameters with untyped arguments may have been given a type by now.
+	// Collect all remaining parameters that don't have a type yet and determine the
+	// maximum untyped type for each of those parameters, if possible.
+	var maxUntyped map[*TypeParam]Type // lazily allocated (we may not need it)
+	for _, index := range untyped {
+		tpar := params.At(index).typ.(*TypeParam) // is type parameter by construction of untyped
+		if u.at(tpar) == nil {
+			arg := args[index] // arg corresponding to tpar
+			if maxUntyped == nil {
+				maxUntyped = make(map[*TypeParam]Type)
+			}
+			max := maxUntyped[tpar]
+			if max == nil {
+				max = arg.typ
+			} else {
+				m := maxType(max, arg.typ)
+				if m == nil {
+					check.errorf(arg, CannotInferTypeArgs, "mismatched types %s and %s (cannot infer %s)", max, arg.typ, tpar)
+					return nil
+				}
+				max = m
+			}
+			maxUntyped[tpar] = max
+		}
+	}
+	// maxUntyped contains the maximum untyped type for each type parameter
+	// which doesn't have a type yet. Set the respective default types.
+	for tpar, typ := range maxUntyped {
+		d := Default(typ)
+		assert(isTyped(d))
+		u.set(tpar, d)
+	}
+
+	// --- simplify ---
+
+	// u.inferred(tparams) now contains the incoming type arguments plus any additional type
+	// arguments which were inferred. The inferred non-nil entries may still contain
+	// references to other type parameters found in constraints.
+	// For instance, for [A any, B interface{ []C }, C interface{ *A }], if A == int
+	// was given, unification produced the type list [int, []C, *A]. We eliminate the
+	// remaining type parameters by substituting the type parameters in this type list
+	// until nothing changes anymore.
+	inferred = u.inferred(tparams)
+	if debug {
+		for i, targ := range targs {
+			assert(targ == nil || inferred[i] == targ)
+		}
+	}
+
+	// The data structure of each (provided or inferred) type represents a graph, where
+	// each node corresponds to a type and each (directed) vertex points to a component
+	// type. The substitution process described above repeatedly replaces type parameter
+	// nodes in these graphs with the graphs of the types the type parameters stand for,
+	// which creates a new (possibly bigger) graph for each type.
+	// The substitution process will not stop if the replacement graph for a type parameter
+	// also contains that type parameter.
+	// For instance, for [A interface{ *A }], without any type argument provided for A,
+	// unification produces the type list [*A]. Substituting A in *A with the value for
+	// A will lead to infinite expansion by producing [**A], [****A], [********A], etc.,
+	// because the graph A -> *A has a cycle through A.
+	// Generally, cycles may occur across multiple type parameters and inferred types
+	// (for instance, consider [P interface{ *Q }, Q interface{ func(P) }]).
+	// We eliminate cycles by walking the graphs for all type parameters. If a cycle
+	// through a type parameter is detected, killCycles nils out the respective type
+	// (in the inferred list) which kills the cycle, and marks the corresponding type
+	// parameter as not inferred.
+	//
+	// TODO(gri) If useful, we could report the respective cycle as an error. We don't
+	//           do this now because type inference will fail anyway, and furthermore,
+	//           constraints with cycles of this kind cannot currently be satisfied by
+	//           any user-supplied type. But should that change, reporting an error
+	//           would be wrong.
+	killCycles(tparams, inferred)
+
+	// dirty tracks the indices of all types that may still contain type parameters.
+	// We know that nil type entries and entries corresponding to provided (non-nil)
+	// type arguments are clean, so exclude them from the start.
+	var dirty []int
+	for i, typ := range inferred {
+		if typ != nil && (i >= len(targs) || targs[i] == nil) {
+			dirty = append(dirty, i)
+		}
+	}
+
+	for len(dirty) > 0 {
+		if traceInference {
+			u.tracef("-- simplify %s ➞ %s", tparams, inferred)
+		}
+		// TODO(gri) Instead of creating a new substMap for each iteration,
+		// provide an update operation for substMaps and only change when
+		// needed. Optimization.
+		smap := makeSubstMap(tparams, inferred)
+		n := 0
+		for _, index := range dirty {
+			t0 := inferred[index]
+			if t1 := check.subst(nopos, t0, smap, nil, check.context()); t1 != t0 {
+				// t0 was simplified to t1.
+				// If t0 was a generic function, but the simplified signature t1 does
+				// not contain any type parameters anymore, the function is not generic
+				// anymore. Remove it's type parameters. (go.dev/issue/59953)
+				// Note that if t0 was a signature, t1 must be a signature, and t1
+				// can only be a generic signature if it originated from a generic
+				// function argument. Those signatures are never defined types and
+				// thus there is no need to call under below.
+				// TODO(gri) Consider doing this in Checker.subst.
+				//           Then this would fall out automatically here and also
+				//           in instantiation (where we also explicitly nil out
+				//           type parameters). See the *Signature TODO in subst.
+				if sig, _ := t1.(*Signature); sig != nil && sig.TypeParams().Len() > 0 && !isParameterized(tparams, sig) {
+					sig.tparams = nil
+				}
+				inferred[index] = t1
+				dirty[n] = index
+				n++
+			}
+		}
+		dirty = dirty[:n]
+	}
+
+	// Once nothing changes anymore, we may still have type parameters left;
+	// e.g., a constraint with core type *P may match a type parameter Q but
+	// we don't have any type arguments to fill in for *P or Q (go.dev/issue/45548).
+	// Don't let such inferences escape; instead treat them as unresolved.
+	for i, typ := range inferred {
+		if typ == nil || isParameterized(tparams, typ) {
+			obj := tparams[i].obj
+			check.errorf(posn, CannotInferTypeArgs, "cannot infer %s (%s)", obj.name, obj.pos)
+			return nil
+		}
+	}
+
+	return
+}
+
+// containsNil reports whether list contains a nil entry.
+func containsNil(list []Type) bool {
+	for _, t := range list {
+		if t == nil {
+			return true
+		}
+	}
+	return false
+}
+
+// renameTParams renames the type parameters in the given type such that each type
+// parameter is given a new identity. renameTParams returns the new type parameters
+// and updated type. If the result type is unchanged from the argument type, none
+// of the type parameters in tparams occurred in the type.
+// If typ is a generic function, type parameters held with typ are not changed and
+// must be updated separately if desired.
+// The positions is only used for debug traces.
+func (check *Checker) renameTParams(pos token.Pos, tparams []*TypeParam, typ Type) ([]*TypeParam, Type) {
+	// For the purpose of type inference we must differentiate type parameters
+	// occurring in explicit type or value function arguments from the type
+	// parameters we are solving for via unification because they may be the
+	// same in self-recursive calls:
+	//
+	//   func f[P constraint](x P) {
+	//           f(x)
+	//   }
+	//
+	// In this example, without type parameter renaming, the P used in the
+	// instantiation f[P] has the same pointer identity as the P we are trying
+	// to solve for through type inference. This causes problems for type
+	// unification. Because any such self-recursive call is equivalent to
+	// a mutually recursive call, type parameter renaming can be used to
+	// create separate, disentangled type parameters. The above example
+	// can be rewritten into the following equivalent code:
+	//
+	//   func f[P constraint](x P) {
+	//           f2(x)
+	//   }
+	//
+	//   func f2[P2 constraint](x P2) {
+	//           f(x)
+	//   }
+	//
+	// Type parameter renaming turns the first example into the second
+	// example by renaming the type parameter P into P2.
+	if len(tparams) == 0 {
+		return nil, typ // nothing to do
+	}
+
+	tparams2 := make([]*TypeParam, len(tparams))
+	for i, tparam := range tparams {
+		tname := NewTypeName(tparam.Obj().Pos(), tparam.Obj().Pkg(), tparam.Obj().Name(), nil)
+		tparams2[i] = NewTypeParam(tname, nil)
+		tparams2[i].index = tparam.index // == i
+	}
+
+	renameMap := makeRenameMap(tparams, tparams2)
+	for i, tparam := range tparams {
+		tparams2[i].bound = check.subst(pos, tparam.bound, renameMap, nil, check.context())
+	}
+
+	return tparams2, check.subst(pos, typ, renameMap, nil, check.context())
 }
 
 // typeParamsString produces a string containing all the type parameter names
@@ -341,17 +511,19 @@
 }
 
 // isParameterized reports whether typ contains any of the type parameters of tparams.
+// If typ is a generic function, isParameterized ignores the type parameter declarations;
+// it only considers the signature proper (incoming and result parameters).
 func isParameterized(tparams []*TypeParam, typ Type) bool {
 	w := tpWalker{
-		seen:    make(map[Type]bool),
 		tparams: tparams,
+		seen:    make(map[Type]bool),
 	}
 	return w.isParameterized(typ)
 }
 
 type tpWalker struct {
-	seen    map[Type]bool
 	tparams []*TypeParam
+	seen    map[Type]bool
 }
 
 func (w *tpWalker) isParameterized(typ Type) (res bool) {
@@ -365,8 +537,8 @@
 	}()
 
 	switch t := typ.(type) {
-	case nil, *Basic: // TODO(gri) should nil be handled here?
-		break
+	case *Basic:
+		// nothing to do
 
 	case *Array:
 		return w.isParameterized(t.elem)
@@ -375,32 +547,28 @@
 		return w.isParameterized(t.elem)
 
 	case *Struct:
-		for _, fld := range t.fields {
-			if w.isParameterized(fld.typ) {
-				return true
-			}
-		}
+		return w.varList(t.fields)
 
 	case *Pointer:
 		return w.isParameterized(t.base)
 
 	case *Tuple:
-		n := t.Len()
-		for i := 0; i < n; i++ {
-			if w.isParameterized(t.At(i).typ) {
-				return true
-			}
-		}
+		// This case does not occur from within isParameterized
+		// because tuples only appear in signatures where they
+		// are handled explicitly. But isParameterized is also
+		// called by Checker.callExpr with a function result tuple
+		// if instantiation failed (go.dev/issue/59890).
+		return t != nil && w.varList(t.vars)
 
 	case *Signature:
 		// t.tparams may not be nil if we are looking at a signature
 		// of a generic function type (or an interface method) that is
 		// part of the type we're testing. We don't care about these type
 		// parameters.
-		// Similarly, the receiver of a method may declare (rather then
+		// Similarly, the receiver of a method may declare (rather than
 		// use) type parameters, we don't care about those either.
 		// Thus, we only need to look at the input and result parameters.
-		return w.isParameterized(t.params) || w.isParameterized(t.results)
+		return t.params != nil && w.varList(t.params.vars) || t.results != nil && w.varList(t.results.vars)
 
 	case *Interface:
 		tset := t.typeSet()
@@ -420,229 +588,31 @@
 		return w.isParameterized(t.elem)
 
 	case *Named:
-		return w.isParameterizedTypeList(t.TypeArgs().list())
+		for _, t := range t.TypeArgs().list() {
+			if w.isParameterized(t) {
+				return true
+			}
+		}
 
 	case *TypeParam:
-		// t must be one of w.tparams
 		return tparamIndex(w.tparams, t) >= 0
 
 	default:
-		unreachable()
+		panic(fmt.Sprintf("unexpected %T", typ))
 	}
 
 	return false
 }
 
-func (w *tpWalker) isParameterizedTypeList(list []Type) bool {
-	for _, t := range list {
-		if w.isParameterized(t) {
+func (w *tpWalker) varList(list []*Var) bool {
+	for _, v := range list {
+		if w.isParameterized(v.typ) {
 			return true
 		}
 	}
 	return false
 }
 
-// inferB returns the list of actual type arguments inferred from the type parameters'
-// bounds and an initial set of type arguments. If type inference is impossible because
-// unification fails, an error is reported if report is set to true, the resulting types
-// list is nil, and index is 0.
-// Otherwise, types is the list of inferred type arguments, and index is the index of the
-// first type argument in that list that couldn't be inferred (and thus is nil). If all
-// type arguments were inferred successfully, index is < 0. The number of type arguments
-// provided may be less than the number of type parameters, but there must be at least one.
-func (check *Checker) inferB(posn positioner, tparams []*TypeParam, targs []Type) (types []Type, index int) {
-	assert(len(tparams) >= len(targs) && len(targs) > 0)
-
-	if traceInference {
-		check.dump("-- inferB %s ➞ %s", tparams, targs)
-		defer func() {
-			check.dump("=> inferB %s ➞ %s", tparams, types)
-		}()
-	}
-
-	// Setup bidirectional unification between constraints
-	// and the corresponding type arguments (which may be nil!).
-	u := newUnifier(false)
-	u.x.init(tparams)
-	u.y = u.x // type parameters between LHS and RHS of unification are identical
-
-	// Set the type arguments which we know already.
-	for i, targ := range targs {
-		if targ != nil {
-			u.x.set(i, targ)
-		}
-	}
-
-	// Repeatedly apply constraint type inference as long as
-	// there are still unknown type arguments and progress is
-	// being made.
-	//
-	// This is an O(n^2) algorithm where n is the number of
-	// type parameters: if there is progress (and iteration
-	// continues), at least one type argument is inferred
-	// per iteration and we have a doubly nested loop.
-	// In practice this is not a problem because the number
-	// of type parameters tends to be very small (< 5 or so).
-	// (It should be possible for unification to efficiently
-	// signal newly inferred type arguments; then the loops
-	// here could handle the respective type parameters only,
-	// but that will come at a cost of extra complexity which
-	// may not be worth it.)
-	for n := u.x.unknowns(); n > 0; {
-		nn := n
-
-		for i, tpar := range tparams {
-			// If there is a core term (i.e., a core type with tilde information)
-			// unify the type parameter with the core type.
-			if core, single := coreTerm(tpar); core != nil {
-				// A type parameter can be unified with its core type in two cases.
-				tx := u.x.at(i)
-				switch {
-				case tx != nil:
-					// The corresponding type argument tx is known.
-					// In this case, if the core type has a tilde, the type argument's underlying
-					// type must match the core type, otherwise the type argument and the core type
-					// must match.
-					// If tx is an external type parameter, don't consider its underlying type
-					// (which is an interface). Core type unification will attempt to unify against
-					// core.typ.
-					// Note also that even with inexact unification we cannot leave away the under
-					// call here because it's possible that both tx and core.typ are named types,
-					// with under(tx) being a (named) basic type matching core.typ. Such cases do
-					// not match with inexact unification.
-					if core.tilde && !isTypeParam(tx) {
-						tx = under(tx)
-					}
-					if !u.unify(tx, core.typ) {
-						// TODO(gri) improve error message by providing the type arguments
-						//           which we know already
-						// Don't use term.String() as it always qualifies types, even if they
-						// are in the current package.
-						tilde := ""
-						if core.tilde {
-							tilde = "~"
-						}
-						check.errorf(posn, InvalidTypeArg, "%s does not match %s%s", tx, tilde, core.typ)
-						return nil, 0
-					}
-
-				case single && !core.tilde:
-					// The corresponding type argument tx is unknown and there's a single
-					// specific type and no tilde.
-					// In this case the type argument must be that single type; set it.
-					u.x.set(i, core.typ)
-
-				default:
-					// Unification is not possible and no progress was made.
-					continue
-				}
-
-				// The number of known type arguments may have changed.
-				nn = u.x.unknowns()
-				if nn == 0 {
-					break // all type arguments are known
-				}
-			}
-		}
-
-		assert(nn <= n)
-		if nn == n {
-			break // no progress
-		}
-		n = nn
-	}
-
-	// u.x.types() now contains the incoming type arguments plus any additional type
-	// arguments which were inferred from core terms. The newly inferred non-nil
-	// entries may still contain references to other type parameters.
-	// For instance, for [A any, B interface{ []C }, C interface{ *A }], if A == int
-	// was given, unification produced the type list [int, []C, *A]. We eliminate the
-	// remaining type parameters by substituting the type parameters in this type list
-	// until nothing changes anymore.
-	types, _ = u.x.types()
-	if debug {
-		for i, targ := range targs {
-			assert(targ == nil || types[i] == targ)
-		}
-	}
-
-	// The data structure of each (provided or inferred) type represents a graph, where
-	// each node corresponds to a type and each (directed) vertex points to a component
-	// type. The substitution process described above repeatedly replaces type parameter
-	// nodes in these graphs with the graphs of the types the type parameters stand for,
-	// which creates a new (possibly bigger) graph for each type.
-	// The substitution process will not stop if the replacement graph for a type parameter
-	// also contains that type parameter.
-	// For instance, for [A interface{ *A }], without any type argument provided for A,
-	// unification produces the type list [*A]. Substituting A in *A with the value for
-	// A will lead to infinite expansion by producing [**A], [****A], [********A], etc.,
-	// because the graph A -> *A has a cycle through A.
-	// Generally, cycles may occur across multiple type parameters and inferred types
-	// (for instance, consider [P interface{ *Q }, Q interface{ func(P) }]).
-	// We eliminate cycles by walking the graphs for all type parameters. If a cycle
-	// through a type parameter is detected, cycleFinder nils out the respective type
-	// which kills the cycle; this also means that the respective type could not be
-	// inferred.
-	//
-	// TODO(gri) If useful, we could report the respective cycle as an error. We don't
-	//           do this now because type inference will fail anyway, and furthermore,
-	//           constraints with cycles of this kind cannot currently be satisfied by
-	//           any user-supplied type. But should that change, reporting an error
-	//           would be wrong.
-	w := cycleFinder{tparams, types, make(map[Type]bool)}
-	for _, t := range tparams {
-		w.typ(t) // t != nil
-	}
-
-	// dirty tracks the indices of all types that may still contain type parameters.
-	// We know that nil type entries and entries corresponding to provided (non-nil)
-	// type arguments are clean, so exclude them from the start.
-	var dirty []int
-	for i, typ := range types {
-		if typ != nil && (i >= len(targs) || targs[i] == nil) {
-			dirty = append(dirty, i)
-		}
-	}
-
-	for len(dirty) > 0 {
-		// TODO(gri) Instead of creating a new substMap for each iteration,
-		// provide an update operation for substMaps and only change when
-		// needed. Optimization.
-		smap := makeSubstMap(tparams, types)
-		n := 0
-		for _, index := range dirty {
-			t0 := types[index]
-			if t1 := check.subst(token.NoPos, t0, smap, nil, check.context()); t1 != t0 {
-				types[index] = t1
-				dirty[n] = index
-				n++
-			}
-		}
-		dirty = dirty[:n]
-	}
-
-	// Once nothing changes anymore, we may still have type parameters left;
-	// e.g., a constraint with core type *P may match a type parameter Q but
-	// we don't have any type arguments to fill in for *P or Q (issue #45548).
-	// Don't let such inferences escape, instead nil them out.
-	for i, typ := range types {
-		if typ != nil && isParameterized(tparams, typ) {
-			types[i] = nil
-		}
-	}
-
-	// update index
-	index = -1
-	for i, typ := range types {
-		if typ == nil {
-			index = i
-			break
-		}
-	}
-
-	return
-}
-
 // If the type parameter has a single specific type S, coreTerm returns (S, true).
 // Otherwise, if tpar has a core type T, it returns a term corresponding to that
 // core type and false. In that case, if any term of tpar has a tilde, the core
@@ -679,21 +649,35 @@
 	return nil, false
 }
 
+// killCycles walks through the given type parameters and looks for cycles
+// created by type parameters whose inferred types refer back to that type
+// parameter, either directly or indirectly. If such a cycle is detected,
+// it is killed by setting the corresponding inferred type to nil.
+//
+// TODO(gri) Determine if we can simply abort inference as soon as we have
+// found a single cycle.
+func killCycles(tparams []*TypeParam, inferred []Type) {
+	w := cycleFinder{tparams, inferred, make(map[Type]bool)}
+	for _, t := range tparams {
+		w.typ(t) // t != nil
+	}
+}
+
 type cycleFinder struct {
-	tparams []*TypeParam
-	types   []Type
-	seen    map[Type]bool
+	tparams  []*TypeParam
+	inferred []Type
+	seen     map[Type]bool
 }
 
 func (w *cycleFinder) typ(typ Type) {
 	if w.seen[typ] {
 		// We have seen typ before. If it is one of the type parameters
-		// in tparams, iterative substitution will lead to infinite expansion.
+		// in w.tparams, iterative substitution will lead to infinite expansion.
 		// Nil out the corresponding type which effectively kills the cycle.
 		if tpar, _ := typ.(*TypeParam); tpar != nil {
 			if i := tparamIndex(w.tparams, tpar); i >= 0 {
 				// cycle through tpar
-				w.types[i] = nil
+				w.inferred[i] = nil
 			}
 		}
 		// If we don't have one of our type parameters, the cycle is due
@@ -757,8 +741,8 @@
 		}
 
 	case *TypeParam:
-		if i := tparamIndex(w.tparams, t); i >= 0 && w.types[i] != nil {
-			w.typ(w.types[i])
+		if i := tparamIndex(w.tparams, t); i >= 0 && w.inferred[i] != nil {
+			w.typ(w.inferred[i])
 		}
 
 	default:
@@ -771,3 +755,14 @@
 		w.typ(v.typ)
 	}
 }
+
+// If tpar is a type parameter in list, tparamIndex returns the index
+// of the type parameter in list. Otherwise the result is < 0.
+func tparamIndex(list []*TypeParam, tpar *TypeParam) int {
+	for i, p := range list {
+		if p == tpar {
+			return i
+		}
+	}
+	return -1
+}
diff --git a/src/go/types/instantiate.go b/src/go/types/instantiate.go
index 2cf48c1..088b433 100644
--- a/src/go/types/instantiate.go
+++ b/src/go/types/instantiate.go
@@ -1,3 +1,5 @@
+// Code generated by "go test -run=Generate -write=all"; DO NOT EDIT.
+
 // Copyright 2021 The Go Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
@@ -55,12 +57,12 @@
 		if len(targs) != len(tparams) {
 			return nil, fmt.Errorf("got %d type arguments but %s has %d type parameters", len(targs), orig, len(tparams))
 		}
-		if i, err := (*Checker)(nil).verify(token.NoPos, tparams, targs, ctxt); err != nil {
+		if i, err := (*Checker)(nil).verify(nopos, tparams, targs, ctxt); err != nil {
 			return nil, &ArgumentError{i, err}
 		}
 	}
 
-	inst := (*Checker)(nil).instance(token.NoPos, orig, targs, nil, ctxt)
+	inst := (*Checker)(nil).instance(nopos, orig, targs, nil, ctxt)
 	return inst, nil
 }
 
@@ -168,7 +170,7 @@
 func (check *Checker) verify(pos token.Pos, tparams []*TypeParam, targs []Type, ctxt *Context) (int, error) {
 	smap := makeSubstMap(tparams, targs)
 	for i, tpar := range tparams {
-		// Ensure that we have a (possibly implicit) interface as type bound (issue #51048).
+		// Ensure that we have a (possibly implicit) interface as type bound (go.dev/issue/51048).
 		tpar.iface()
 		// The type parameter bound is parameterized with the same type parameters
 		// as the instantiated type; before we can use it for bounds checking we
@@ -176,7 +178,7 @@
 		// the parameterized type.
 		bound := check.subst(pos, tpar.bound, smap, nil, ctxt)
 		var cause string
-		if !check.implements(targs[i], bound, true, &cause) {
+		if !check.implements(pos, targs[i], bound, true, &cause) {
 			return i, errors.New(cause)
 		}
 	}
@@ -189,14 +191,14 @@
 //
 // If the provided cause is non-nil, it may be set to an error string
 // explaining why V does not implement (or satisfy, for constraints) T.
-func (check *Checker) implements(V, T Type, constraint bool, cause *string) bool {
+func (check *Checker) implements(pos token.Pos, V, T Type, constraint bool, cause *string) bool {
 	Vu := under(V)
 	Tu := under(T)
 	if Vu == Typ[Invalid] || Tu == Typ[Invalid] {
 		return true // avoid follow-on errors
 	}
 	if p, _ := Vu.(*Pointer); p != nil && under(p.base) == Typ[Invalid] {
-		return true // avoid follow-on errors (see issue #49541 for an example)
+		return true // avoid follow-on errors (see go.dev/issue/49541 for an example)
 	}
 
 	verb := "implement"
@@ -241,9 +243,9 @@
 	}
 
 	// V must implement T's methods, if any.
-	if m, wrong := check.missingMethod(V, Ti, true); m != nil /* !Implements(V, Ti) */ {
+	if m, _ := check.missingMethod(V, T, true, Identical, cause); m != nil /* !Implements(V, T) */ {
 		if cause != nil {
-			*cause = check.sprintf("%s does not %s %s %s", V, verb, T, check.missingMethodCause(V, T, m, wrong))
+			*cause = check.sprintf("%s does not %s %s %s", V, verb, T, *cause)
 		}
 		return false
 	}
@@ -258,20 +260,11 @@
 		if comparable(V, false /* strict comparability */, nil, nil) {
 			return true
 		}
-		// If check.conf.OldComparableSemantics is set (by the compiler or
-		// a test), we only consider strict comparability and we're done.
-		// TODO(gri) remove this check for Go 1.21
-		if check != nil && check.conf.oldComparableSemantics {
-			if cause != nil {
-				*cause = check.sprintf("%s does not %s comparable", V, verb)
-			}
-			return false
-		}
 		// For constraint satisfaction, use dynamic (spec) comparability
 		// so that ordinary, non-type parameter interfaces implement comparable.
 		if constraint && comparable(V, true /* spec comparability */, nil, nil) {
 			// V is comparable if we are at Go 1.20 or higher.
-			if check == nil || check.allowVersion(check.pkg, 1, 20) {
+			if check == nil || check.allowVersion(check.pkg, atPos(pos), go1_20) { // atPos needed so that go/types generate passes
 				return true
 			}
 			if cause != nil {
diff --git a/src/go/types/instantiate_test.go b/src/go/types/instantiate_test.go
index 0b44a1a..58dfa70 100644
--- a/src/go/types/instantiate_test.go
+++ b/src/go/types/instantiate_test.go
@@ -1,11 +1,11 @@
+// Code generated by "go test -run=Generate -write=all"; DO NOT EDIT.
+
 // Copyright 2021 The Go Authors. 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/token"
 	. "go/types"
 	"strings"
 	"testing"
@@ -43,13 +43,13 @@
 			// interface{interface{...}} is equivalent to interface{...}
 			"package equivalentinterfaces; type T[P any] int",
 			"T", []Type{
-				NewInterfaceType([]*Func{NewFunc(token.NoPos, nil, "M", emptySignature)}, nil),
+				NewInterfaceType([]*Func{NewFunc(nopos, nil, "M", emptySignature)}, nil),
 			},
 			"T", []Type{
 				NewInterfaceType(
 					nil,
 					[]Type{
-						NewInterfaceType([]*Func{NewFunc(token.NoPos, nil, "M", emptySignature)}, nil),
+						NewInterfaceType([]*Func{NewFunc(nopos, nil, "M", emptySignature)}, nil),
 					},
 				),
 			},
@@ -109,7 +109,7 @@
 	}
 
 	for _, test := range tests {
-		pkg := mustTypecheck(".", test.src, nil)
+		pkg := mustTypecheck(test.src, nil, nil)
 
 		t.Run(pkg.Name(), func(t *testing.T) {
 			ctxt := NewContext()
@@ -135,15 +135,12 @@
 
 func TestInstantiateNonEquality(t *testing.T) {
 	const src = "package p; type T[P any] int"
-
-	pkg1 := mustTypecheck(".", src, nil)
-	pkg2 := mustTypecheck(".", src, nil)
-
+	pkg1 := mustTypecheck(src, nil, nil)
+	pkg2 := mustTypecheck(src, nil, nil)
 	// We consider T1 and T2 to be distinct types, so their instances should not
 	// be deduplicated by the context.
 	T1 := pkg1.Scope().Lookup("T").Type().(*Named)
 	T2 := pkg2.Scope().Lookup("T").Type().(*Named)
-
 	ctxt := NewContext()
 	res1, err := Instantiate(ctxt, T1, []Type{Typ[Int]}, false)
 	if err != nil {
@@ -153,7 +150,6 @@
 	if err != nil {
 		t.Fatal(err)
 	}
-
 	if res1 == res2 {
 		t.Errorf("instance from pkg1 (%s) is pointer-equivalent to instance from pkg2 (%s)", res1, res2)
 	}
@@ -185,7 +181,7 @@
 
 	for _, test := range tests {
 		src := prefix + test.decl
-		pkg := mustTypecheck(".", src, nil)
+		pkg := mustTypecheck(src, nil, nil)
 		typ := NewPointer(pkg.Scope().Lookup("X").Type())
 		obj, _, _ := LookupFieldOrMethod(typ, false, pkg, "m")
 		m, _ := obj.(*Func)
@@ -207,7 +203,7 @@
 
 var _ T[int]
 `
-	pkg := mustTypecheck(".", src, nil)
+	pkg := mustTypecheck(src, nil, nil)
 	typ := pkg.Scope().Lookup("T").Type().(*Named)
 	obj, _, _ := LookupFieldOrMethod(typ, false, pkg, "m")
 	if obj == nil {
diff --git a/src/go/types/interface.go b/src/go/types/interface.go
index 83538d2..f2bb15e 100644
--- a/src/go/types/interface.go
+++ b/src/go/types/interface.go
@@ -26,7 +26,7 @@
 }
 
 // typeSet returns the type set for interface t.
-func (t *Interface) typeSet() *_TypeSet { return computeInterfaceTypeSet(t.check, token.NoPos, t) }
+func (t *Interface) typeSet() *_TypeSet { return computeInterfaceTypeSet(t.check, nopos, t) }
 
 // emptyInterface represents the empty (completed) interface
 var emptyInterface = Interface{complete: true, tset: &topTypeSet}
diff --git a/src/go/types/issues_test.go b/src/go/types/issues_test.go
index b4845b1..4a559cb 100644
--- a/src/go/types/issues_test.go
+++ b/src/go/types/issues_test.go
@@ -10,6 +10,7 @@
 	"fmt"
 	"go/ast"
 	"go/importer"
+	"go/parser"
 	"go/token"
 	"internal/testenv"
 	"regexp"
@@ -21,9 +22,7 @@
 )
 
 func TestIssue5770(t *testing.T) {
-	f := mustParse(fset, "", `package p; type S struct{T}`)
-	conf := Config{Importer: importer.Default()}
-	_, err := conf.Check(f.Name.Name, fset, []*ast.File{f}, nil) // do not crash
+	_, err := typecheck(`package p; type S struct{T}`, nil, nil)
 	const want = "undefined: T"
 	if err == nil || !strings.Contains(err.Error(), want) {
 		t.Errorf("got: %v; want: %s", err, want)
@@ -43,7 +42,7 @@
 	_ = (interface{})(nil)
 )`
 	types := make(map[ast.Expr]TypeAndValue)
-	mustTypecheck("p", src, &Info{Types: types})
+	mustTypecheck(src, nil, &Info{Types: types})
 
 	for x, tv := range types {
 		var want Type
@@ -82,7 +81,7 @@
 }
 `
 	types := make(map[ast.Expr]TypeAndValue)
-	mustTypecheck("p", src, &Info{Types: types})
+	mustTypecheck(src, nil, &Info{Types: types})
 
 	want := Typ[Int]
 	n := 0
@@ -106,7 +105,7 @@
 func (T) m() (res bool) { return }
 type T struct{} // receiver type after method declaration
 `
-	f := mustParse(fset, "", src)
+	f := mustParse(fset, src)
 
 	var conf Config
 	defs := make(map[*ast.Ident]Object)
@@ -137,7 +136,10 @@
         _, _, _ = x, y, z  // uses x, y, z
 }
 `
-	f := mustParse(fset, "", src)
+	// We need a specific fileset in this test below for positions.
+	// Cannot use typecheck helper.
+	fset := token.NewFileSet()
+	f := mustParse(fset, src)
 
 	const want = `L3 defs func p._()
 L4 defs const w untyped int
@@ -155,7 +157,7 @@
 	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") {
+	if s := err.Error(); !strings.HasSuffix(s, "cannot assign to w") {
 		t.Errorf("Check: unexpected error: %s", s)
 	}
 
@@ -233,13 +235,8 @@
 }
 `
 	f := func(test, src string) {
-		f := mustParse(fset, "", src)
-		cfg := Config{Importer: importer.Default()}
-		info := Info{Uses: make(map[*ast.Ident]Object)}
-		_, err := cfg.Check("main", fset, []*ast.File{f}, &info)
-		if err != nil {
-			t.Fatal(err)
-		}
+		info := &Info{Uses: make(map[*ast.Ident]Object)}
+		mustTypecheck(src, nil, info)
 
 		var pkg *Package
 		count := 0
@@ -263,17 +260,17 @@
 }
 
 func TestIssue22525(t *testing.T) {
-	f := mustParse(fset, "", `package p; func f() { var a, b, c, d, e int }`)
+	const src = `package p; func f() { var a, b, c, d, e int }`
 
 	got := "\n"
 	conf := Config{Error: func(err error) { got += err.Error() + "\n" }}
-	conf.Check(f.Name.Name, fset, []*ast.File{f}, nil) // do not crash
+	typecheck(src, &conf, nil) // do not crash
 	want := `
-1:27: a declared and not used
-1:30: b declared and not used
-1:33: c declared and not used
-1:36: d declared and not used
-1:39: e declared and not used
+p:1:27: a declared and not used
+p:1:30: b declared and not used
+p:1:33: c declared and not used
+p:1:36: d declared and not used
+p:1:39: e declared and not used
 `
 	if got != want {
 		t.Errorf("got: %swant: %s", got, want)
@@ -293,7 +290,7 @@
 		`struct { *I }`,
 		`struct { a int; b Missing; *Missing }`,
 	} {
-		f := mustParse(fset, "", prefix+src)
+		f := mustParse(fset, prefix+src)
 
 		cfg := Config{Importer: importer.Default(), Error: func(err error) {}}
 		info := &Info{Types: make(map[ast.Expr]TypeAndValue)}
@@ -330,7 +327,7 @@
 	// compute original file ASTs
 	var orig [len(sources)]*ast.File
 	for i, src := range sources {
-		orig[i] = mustParse(fset, "", src)
+		orig[i] = mustParse(fset, src)
 	}
 
 	// run the test for all order permutations of the incoming files
@@ -404,8 +401,8 @@
 }
 
 func TestIssue29029(t *testing.T) {
-	f1 := mustParse(fset, "", `package p; type A interface { M() }`)
-	f2 := mustParse(fset, "", `package p; var B interface { A }`)
+	f1 := mustParse(fset, `package p; type A interface { M() }`)
+	f2 := mustParse(fset, `package p; var B interface { A }`)
 
 	// printInfo prints the *Func definitions recorded in info, one *Func per line.
 	printInfo := func(info *Info) string {
@@ -451,14 +448,10 @@
 	const asrc = `package a; type I interface{ M() }; type T struct { F interface { I } }`
 	const bsrc = `package b; import "a"; type T struct { F interface { a.I } }; var _ = a.T(T{})`
 
-	a := mustTypecheck("a", asrc, nil)
+	a := mustTypecheck(asrc, nil, nil)
 
-	bast := mustParse(fset, "", bsrc)
 	conf := Config{Importer: importHelper{pkg: a}}
-	b, err := conf.Check(bast.Name.Name, fset, []*ast.File{bast}, nil)
-	if err != nil {
-		t.Errorf("package %s failed to typecheck: %v", b.Name(), err)
-	}
+	mustTypecheck(bsrc, &conf, nil)
 }
 
 type importHelper struct {
@@ -496,13 +489,8 @@
 
 	var pkg *Package
 	for _, src := range sources {
-		f := mustParse(fset, "", src)
 		conf := Config{Importer: importHelper{pkg: pkg}}
-		res, err := conf.Check(f.Name.Name, fset, []*ast.File{f}, nil)
-		if err != nil {
-			t.Errorf("%q failed to typecheck: %v", src, err)
-		}
-		pkg = res // res is imported by the next package in this test
+		pkg = mustTypecheck(src, &conf, nil) // pkg imported by the next package in this test
 	}
 }
 
@@ -516,14 +504,14 @@
 	//                 _ T2
 	//         }
 	// }
-	n1 := NewTypeName(token.NoPos, nil, "T1", nil)
+	n1 := NewTypeName(nopos, nil, "T1", nil)
 	T1 := NewNamed(n1, nil, nil)
-	n2 := NewTypeName(token.NoPos, nil, "T2", nil)
+	n2 := NewTypeName(nopos, nil, "T2", nil)
 	T2 := NewNamed(n2, nil, nil)
-	s1 := NewStruct([]*Var{NewField(token.NoPos, nil, "_", T2, false)}, nil)
+	s1 := NewStruct([]*Var{NewField(nopos, nil, "_", T2, false)}, nil)
 	T1.SetUnderlying(s1)
-	s2 := NewStruct([]*Var{NewField(token.NoPos, nil, "_", T2, false)}, nil)
-	s3 := NewStruct([]*Var{NewField(token.NoPos, nil, "_", s2, false)}, nil)
+	s2 := NewStruct([]*Var{NewField(nopos, nil, "_", T2, false)}, nil)
+	s3 := NewStruct([]*Var{NewField(nopos, nil, "_", s2, false)}, nil)
 	T2.SetUnderlying(s3)
 
 	// These calls must terminate (no endless recursion).
@@ -574,7 +562,7 @@
 func _() {
 	// Packages should be fully qualified when there is ambiguity within the
 	// error string itself.
-	a.F(template /* ERROR cannot use.*html/template.* as .*text/template */ .Template{})
+	a.F(template /* ERRORx "cannot use.*html/template.* as .*text/template" */ .Template{})
 }
 `
 		csrc = `
@@ -586,13 +574,13 @@
 	"html/template"
 )
 
-// Issue #46905: make sure template is not the first package qualified.
-var _ fmt.Stringer = 1 // ERROR cannot use 1.*as fmt\.Stringer
+// go.dev/issue/46905: make sure template is not the first package qualified.
+var _ fmt.Stringer = 1 // ERRORx "cannot use 1.*as fmt\\.Stringer"
 
 // Packages should be fully qualified when there is ambiguity in reachable
 // packages. In this case both a (and for that matter html/template) import
 // text/template.
-func _() { a.G(template /* ERROR cannot use .*html/template.*Template */ .Template{}) }
+func _() { a.G(template /* ERRORx "cannot use .*html/template.*Template" */ .Template{}) }
 `
 
 		tsrc = `
@@ -603,16 +591,20 @@
 type T int
 
 // Verify that the current package name also causes disambiguation.
-var _ T = template /* ERROR cannot use.*text/template.* as T value */.Template{}
+var _ T = template /* ERRORx "cannot use.*text/template.* as T value" */.Template{}
 `
 	)
 
-	a := mustTypecheck("a", asrc, nil)
+	a := mustTypecheck(asrc, nil, nil)
 	imp := importHelper{pkg: a, fallback: importer.Default()}
 
-	testFiles(t, nil, []string{"b.go"}, [][]byte{[]byte(bsrc)}, false, imp)
-	testFiles(t, nil, []string{"c.go"}, [][]byte{[]byte(csrc)}, false, imp)
-	testFiles(t, nil, []string{"t.go"}, [][]byte{[]byte(tsrc)}, false, imp)
+	withImporter := func(cfg *Config) {
+		cfg.Importer = imp
+	}
+
+	testFiles(t, []string{"b.go"}, [][]byte{[]byte(bsrc)}, false, withImporter)
+	testFiles(t, []string{"c.go"}, [][]byte{[]byte(csrc)}, false, withImporter)
+	testFiles(t, []string{"t.go"}, [][]byte{[]byte(tsrc)}, false, withImporter)
 }
 
 func TestIssue50646(t *testing.T) {
@@ -644,7 +636,7 @@
 func TestIssue55030(t *testing.T) {
 	// makeSig makes the signature func(typ...)
 	makeSig := func(typ Type) {
-		par := NewVar(token.NoPos, nil, "", typ)
+		par := NewVar(nopos, nil, "", typ)
 		params := NewTuple(par)
 		NewSignatureType(nil, nil, nil, params, nil, true)
 	}
@@ -658,22 +650,22 @@
 
 	// P where P's core type is string
 	{
-		P := NewTypeName(token.NoPos, nil, "P", nil) // [P string]
+		P := NewTypeName(nopos, nil, "P", nil) // [P string]
 		makeSig(NewTypeParam(P, NewInterfaceType(nil, []Type{Typ[String]})))
 	}
 
 	// P where P's core type is an (unnamed) slice
 	{
-		P := NewTypeName(token.NoPos, nil, "P", nil) // [P []int]
+		P := NewTypeName(nopos, nil, "P", nil) // [P []int]
 		makeSig(NewTypeParam(P, NewInterfaceType(nil, []Type{NewSlice(Typ[Int])})))
 	}
 
 	// P where P's core type is bytestring (i.e., string or []byte)
 	{
-		t1 := NewTerm(true, Typ[String])             // ~string
-		t2 := NewTerm(false, NewSlice(Typ[Byte]))    // []byte
-		u := NewUnion([]*Term{t1, t2})               // ~string | []byte
-		P := NewTypeName(token.NoPos, nil, "P", nil) // [P ~string | []byte]
+		t1 := NewTerm(true, Typ[String])          // ~string
+		t2 := NewTerm(false, NewSlice(Typ[Byte])) // []byte
+		u := NewUnion([]*Term{t1, t2})            // ~string | []byte
+		P := NewTypeName(nopos, nil, "P", nil)    // [P ~string | []byte]
 		makeSig(NewTypeParam(P, NewInterfaceType(nil, []Type{u})))
 	}
 }
@@ -704,7 +696,7 @@
 	for _, test := range tests {
 		src := fmt.Sprintf("package p; func _[P %s]() { _ = P(%s) }", test.typ, test.val)
 		types := make(map[ast.Expr]TypeAndValue)
-		mustTypecheck("p", src, &Info{Types: types})
+		mustTypecheck(src, nil, &Info{Types: types})
 
 		var n int
 		for x, tv := range types {
@@ -836,8 +828,8 @@
 	fset := token.NewFileSet()
 	test := func(main, b, want string) {
 		re := regexp.MustCompile(want)
-		bpkg := mustTypecheck("b", b, nil)
-		mast := mustParse(fset, "main.go", main)
+		bpkg := mustTypecheck(b, nil, nil)
+		mast := mustParse(fset, main)
 		conf := Config{Importer: importHelper{pkg: bpkg}}
 		_, err := conf.Check(mast.Name.Name, fset, []*ast.File{mast}, nil)
 		if err == nil {
@@ -852,3 +844,133 @@
 		test(t.main, t.b, t.want)
 	}
 }
+
+func TestIssue59944(t *testing.T) {
+	testenv.MustHaveCGO(t)
+
+	// The typechecker should resolve methods declared on aliases of cgo types.
+	const src = `
+package p
+
+/*
+struct layout {
+	int field;
+};
+*/
+import "C"
+
+type Layout = C.struct_layout
+
+func (l *Layout) Binding() {}
+
+func _() {
+	_ = (*Layout).Binding
+}
+`
+
+	// code generated by cmd/cgo for the above source.
+	const cgoTypes = `
+// Code generated by cmd/cgo; DO NOT EDIT.
+
+package p
+
+import "unsafe"
+
+import "syscall"
+
+import _cgopackage "runtime/cgo"
+
+type _ _cgopackage.Incomplete
+var _ syscall.Errno
+func _Cgo_ptr(ptr unsafe.Pointer) unsafe.Pointer { return ptr }
+
+//go:linkname _Cgo_always_false runtime.cgoAlwaysFalse
+var _Cgo_always_false bool
+//go:linkname _Cgo_use runtime.cgoUse
+func _Cgo_use(interface{})
+type _Ctype_int int32
+
+type _Ctype_struct_layout struct {
+	field _Ctype_int
+}
+
+type _Ctype_void [0]byte
+
+//go:linkname _cgo_runtime_cgocall runtime.cgocall
+func _cgo_runtime_cgocall(unsafe.Pointer, uintptr) int32
+
+//go:linkname _cgoCheckPointer runtime.cgoCheckPointer
+func _cgoCheckPointer(interface{}, interface{})
+
+//go:linkname _cgoCheckResult runtime.cgoCheckResult
+func _cgoCheckResult(interface{})
+`
+	testFiles(t, []string{"p.go", "_cgo_gotypes.go"}, [][]byte{[]byte(src), []byte(cgoTypes)}, false, func(cfg *Config) {
+		*boolFieldAddr(cfg, "go115UsesCgo") = true
+	})
+}
+
+func TestIssue61931(t *testing.T) {
+	const src = `
+package p
+
+func A(func(any), ...any) {}
+func B[T any](T)          {}
+
+func _() {
+	A(B, nil // syntax error: missing ',' before newline in argument list
+}
+`
+	fset := token.NewFileSet()
+	f, err := parser.ParseFile(fset, pkgName(src), src, 0)
+	if err == nil {
+		t.Fatal("expected syntax error")
+	}
+
+	var conf Config
+	conf.Check(f.Name.Name, fset, []*ast.File{f}, nil) // must not panic
+}
+
+func TestIssue63260(t *testing.T) {
+	const src = `
+package p
+
+func _() {
+        use(f[*string])
+}
+
+func use(func()) {}
+
+func f[I *T, T any]() {
+        var v T
+        _ = v
+}`
+
+	info := Info{
+		Defs: make(map[*ast.Ident]Object),
+	}
+	pkg := mustTypecheck(src, nil, &info)
+
+	// get type parameter T in signature of f
+	T := pkg.Scope().Lookup("f").Type().(*Signature).TypeParams().At(1)
+	if T.Obj().Name() != "T" {
+		t.Fatalf("got type parameter %s, want T", T)
+	}
+
+	// get type of variable v in body of f
+	var v Object
+	for name, obj := range info.Defs {
+		if name.Name == "v" {
+			v = obj
+			break
+		}
+	}
+	if v == nil {
+		t.Fatal("variable v not found")
+	}
+
+	// type of v and T must be pointer-identical
+	if v.Type() != T {
+		t.Fatalf("types of v and T are not pointer-identical: %p != %p", v.Type().(*TypeParam), T)
+	}
+}
diff --git a/src/go/types/lookup.go b/src/go/types/lookup.go
index 4eedcc2..d96dd86 100644
--- a/src/go/types/lookup.go
+++ b/src/go/types/lookup.go
@@ -1,3 +1,5 @@
+// Code generated by "go test -run=Generate -write=all"; DO NOT EDIT.
+
 // Copyright 2013 The Go Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
@@ -8,6 +10,7 @@
 
 import (
 	"bytes"
+	"go/token"
 	"strings"
 )
 
@@ -52,10 +55,10 @@
 	// 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).
+	// not have found it for T (see also go.dev/issue/8590).
 	if t, _ := T.(*Named); t != nil {
 		if p, _ := t.Underlying().(*Pointer); p != nil {
-			obj, index, indirect = lookupFieldOrMethod(p, false, pkg, name, false)
+			obj, index, indirect = lookupFieldOrMethodImpl(p, false, pkg, name, false)
 			if _, ok := obj.(*Func); ok {
 				return nil, nil, false
 			}
@@ -63,16 +66,16 @@
 		}
 	}
 
-	obj, index, indirect = lookupFieldOrMethod(T, addressable, pkg, name, false)
+	obj, index, indirect = lookupFieldOrMethodImpl(T, addressable, pkg, name, false)
 
 	// If we didn't find anything and if we have a type parameter with a core type,
 	// see if there is a matching field (but not a method, those need to be declared
 	// explicitly in the constraint). If the constraint is a named pointer type (see
 	// above), we are ok here because only fields are accepted as results.
-	const enableTParamFieldLookup = false // see issue #51576
+	const enableTParamFieldLookup = false // see go.dev/issue/51576
 	if enableTParamFieldLookup && obj == nil && isTypeParam(T) {
 		if t := coreType(T); t != nil {
-			obj, index, indirect = lookupFieldOrMethod(t, addressable, pkg, name, false)
+			obj, index, indirect = lookupFieldOrMethodImpl(t, addressable, pkg, name, false)
 			if _, ok := obj.(*Var); !ok {
 				obj, index, indirect = nil, nil, false // accept fields (variables) only
 			}
@@ -81,18 +84,33 @@
 	return
 }
 
-// lookupFieldOrMethod should only be called by LookupFieldOrMethod and missingMethod.
-// If foldCase is true, the lookup for methods will include looking for any method
-// which case-folds to the same as 'name' (used for giving helpful error messages).
+// lookupFieldOrMethodImpl is the implementation of LookupFieldOrMethod.
+// Notably, in contrast to LookupFieldOrMethod, it won't find struct fields
+// in base types of defined (*Named) pointer types T. For instance, given
+// the declaration:
+//
+//	type T *struct{f int}
+//
+// lookupFieldOrMethodImpl won't find the field f in the defined (*Named) type T
+// (methods on T are not permitted in the first place).
+//
+// Thus, lookupFieldOrMethodImpl should only be called by LookupFieldOrMethod
+// and missingMethod (the latter doesn't care about struct fields).
+//
+// If foldCase is true, method names are considered equal if they are equal
+// with case folding.
 //
 // The resulting object may not be fully type-checked.
-func lookupFieldOrMethod(T Type, addressable bool, pkg *Package, name string, foldCase bool) (obj Object, index []int, indirect bool) {
+func lookupFieldOrMethodImpl(T Type, addressable bool, pkg *Package, name string, foldCase bool) (obj Object, index []int, indirect bool) {
 	// WARNING: The code in this function is extremely subtle - do not modify casually!
 
 	if name == "_" {
 		return // blank fields/methods are never found
 	}
 
+	// Importantly, we must not call under before the call to deref below (nor
+	// does deref call under), as doing so could incorrectly result in finding
+	// methods of the pointer base type when T is a (*Named) pointer type.
 	typ, isPtr := deref(T)
 
 	// *typ where typ is an interface (incl. a type parameter) has no methods.
@@ -297,7 +315,7 @@
 
 // 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.
+// just has the wrong type: either a pointer receiver or wrong signature.
 //
 // 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
@@ -305,122 +323,144 @@
 // 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) {
-	m, alt := (*Checker)(nil).missingMethod(V, T, static)
-	// Only report a wrong type if the alternative method has the same name as m.
-	return m, alt != nil && alt.name == m.name // alt != nil implies m != nil
+	return (*Checker)(nil).missingMethod(V, T, static, Identical, nil)
 }
 
-// missingMethod is like MissingMethod but accepts a *Checker as receiver.
+// missingMethod is like MissingMethod but accepts a *Checker as receiver,
+// a comparator equivalent for type comparison, and a *string for error causes.
 // The receiver may be nil if missingMethod is invoked through an exported
 // API call (such as MissingMethod), i.e., when all methods have been type-
 // checked.
-//
-// If a method is missing on T but is found on *T, or if a method is found
-// on T when looked up with case-folding, this alternative method is returned
-// as the second result.
-func (check *Checker) missingMethod(V Type, T *Interface, static bool) (method, alt *Func) {
-	if T.NumMethods() == 0 {
-		return
+// The underlying type of T must be an interface; T (rather than its under-
+// lying type) is used for better error messages (reported through *cause).
+// The comparator is used to compare signatures.
+// If a method is missing and cause is not nil, *cause describes the error.
+func (check *Checker) missingMethod(V, T Type, static bool, equivalent func(x, y Type) bool, cause *string) (method *Func, wrongType bool) {
+	methods := under(T).(*Interface).typeSet().methods // T must be an interface
+	if len(methods) == 0 {
+		return nil, false
 	}
 
-	// V is an interface
+	const (
+		ok = iota
+		notFound
+		wrongName
+		wrongSig
+		ambigSel
+		ptrRecv
+		field
+	)
+
+	state := ok
+	var m *Func // method on T we're trying to implement
+	var f *Func // method on V, if found (state is one of ok, wrongName, wrongSig)
+
 	if u, _ := under(V).(*Interface); u != nil {
 		tset := u.typeSet()
-		for _, m := range T.typeSet().methods {
-			_, f := tset.LookupMethod(m.pkg, m.name, false)
+		for _, m = range methods {
+			_, f = tset.LookupMethod(m.pkg, m.name, false)
 
 			if f == nil {
 				if !static {
 					continue
 				}
-				return m, nil
+				state = notFound
+				break
 			}
 
-			if !Identical(f.typ, m.typ) {
-				return m, f
+			if !equivalent(f.typ, m.typ) {
+				state = wrongSig
+				break
 			}
 		}
+	} else {
+		for _, m = range methods {
+			obj, index, indirect := lookupFieldOrMethodImpl(V, false, m.pkg, m.name, false)
 
-		return
-	}
-
-	// V is not an interface
-	for _, m := range T.typeSet().methods {
-		// TODO(gri) should this be calling LookupFieldOrMethod instead (and why not)?
-		obj, _, _ := lookupFieldOrMethod(V, false, m.pkg, m.name, false)
-
-		// check if m is on *V, or on V with case-folding
-		found := obj != nil
-		if !found {
-			// TODO(gri) Instead of NewPointer(V) below, can we just set the "addressable" argument?
-			obj, _, _ = lookupFieldOrMethod(NewPointer(V), false, m.pkg, m.name, false)
+			// check if m is ambiguous, on *V, or on V with case-folding
 			if obj == nil {
-				obj, _, _ = lookupFieldOrMethod(V, false, m.pkg, m.name, true /* fold case */)
+				switch {
+				case index != nil:
+					state = ambigSel
+				case indirect:
+					state = ptrRecv
+				default:
+					state = notFound
+					obj, _, _ = lookupFieldOrMethodImpl(V, false, m.pkg, m.name, true /* fold case */)
+					f, _ = obj.(*Func)
+					if f != nil {
+						state = wrongName
+					}
+				}
+				break
+			}
+
+			// we must have a method (not a struct field)
+			f, _ = obj.(*Func)
+			if f == nil {
+				state = field
+				break
+			}
+
+			// methods may not have a fully set up signature yet
+			if check != nil {
+				check.objDecl(f, nil)
+			}
+
+			if !equivalent(f.typ, m.typ) {
+				state = wrongSig
+				break
 			}
 		}
+	}
 
-		// we must have a method (not a struct field)
-		f, _ := obj.(*Func)
-		if f == nil {
-			return m, nil
+	if state == ok {
+		return nil, false
+	}
+
+	if cause != nil {
+		if f != nil {
+			// This method may be formatted in funcString below, so must have a fully
+			// set up signature.
+			if check != nil {
+				check.objDecl(f, nil)
+			}
 		}
-
-		// methods may not have a fully set up signature yet
-		if check != nil {
-			check.objDecl(f, nil)
-		}
-
-		if !found || !Identical(f.typ, m.typ) {
-			return m, f
+		switch state {
+		case notFound:
+			switch {
+			case isInterfacePtr(V):
+				*cause = "(" + check.interfacePtrError(V) + ")"
+			case isInterfacePtr(T):
+				*cause = "(" + check.interfacePtrError(T) + ")"
+			default:
+				*cause = check.sprintf("(missing method %s)", m.Name())
+			}
+		case wrongName:
+			fs, ms := check.funcString(f, false), check.funcString(m, false)
+			*cause = check.sprintf("(missing method %s)\n\t\thave %s\n\t\twant %s",
+				m.Name(), fs, ms)
+		case wrongSig:
+			fs, ms := check.funcString(f, false), check.funcString(m, false)
+			if fs == ms {
+				// Don't report "want Foo, have Foo".
+				// Add package information to disambiguate (go.dev/issue/54258).
+				fs, ms = check.funcString(f, true), check.funcString(m, true)
+			}
+			*cause = check.sprintf("(wrong type for method %s)\n\t\thave %s\n\t\twant %s",
+				m.Name(), fs, ms)
+		case ambigSel:
+			*cause = check.sprintf("(ambiguous selector %s.%s)", V, m.Name())
+		case ptrRecv:
+			*cause = check.sprintf("(method %s has pointer receiver)", m.Name())
+		case field:
+			*cause = check.sprintf("(%s.%s is a field, not a method)", V, m.Name())
+		default:
+			unreachable()
 		}
 	}
 
-	return
-}
-
-// missingMethodCause returns a string giving the detailed cause for a missing method m,
-// where m is missing from V, but required by T. It puts the cause in parentheses,
-// and may include more have/want info after that. If non-nil, alt is a relevant
-// method that matches in some way. It may have the correct name, but wrong type, or
-// it may have a pointer receiver, or it may have the correct name except wrong case.
-// check may be nil.
-func (check *Checker) missingMethodCause(V, T Type, m, alt *Func) string {
-	mname := "method " + m.Name()
-
-	if alt != nil {
-		if m.Name() != alt.Name() {
-			return check.sprintf("(missing %s)\n\t\thave %s\n\t\twant %s",
-				mname, check.funcString(alt, false), check.funcString(m, false))
-		}
-
-		if Identical(m.typ, alt.typ) {
-			return check.sprintf("(%s has pointer receiver)", mname)
-		}
-
-		altS, mS := check.funcString(alt, false), check.funcString(m, false)
-		if altS == mS {
-			// Would tell the user that Foo isn't a Foo, add package information to disambiguate.  See #54258.
-			altS, mS = check.funcString(alt, true), check.funcString(m, true)
-		}
-
-		return check.sprintf("(wrong type for %s)\n\t\thave %s\n\t\twant %s",
-			mname, altS, mS)
-	}
-
-	if isInterfacePtr(V) {
-		return "(" + check.interfacePtrError(V) + ")"
-	}
-
-	if isInterfacePtr(T) {
-		return "(" + check.interfacePtrError(T) + ")"
-	}
-
-	obj, _, _ := lookupFieldOrMethod(V, true /* auto-deref */, m.pkg, m.name, false)
-	if fld, _ := obj.(*Var); fld != nil {
-		return check.sprintf("(%s.%s is a field, not a method)", V, fld.Name())
-	}
-
-	return check.sprintf("(missing %s)", mname)
+	return m, state == wrongSig || state == ptrRecv
 }
 
 func isInterfacePtr(T Type) bool {
@@ -453,36 +493,40 @@
 }
 
 // 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.
 // The receiver may be nil if assertableTo is invoked through an exported API call
 // (such as AssertableTo), i.e., when all methods have been type-checked.
+// The underlying type of V must be an interface.
+// If the result is false and cause is not nil, *cause describes the error.
 // TODO(gri) replace calls to this function with calls to newAssertableTo.
-func (check *Checker) assertableTo(V *Interface, T Type) (method, wrongType *Func) {
-	// 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 IsInterface(T) {
-		return
-	}
-	// TODO(gri) fix this for generalized interfaces
-	return check.missingMethod(T, V, false)
-}
-
-// newAssertableTo reports whether a value of type V can be asserted to have type T.
-// It also implements behavior for interfaces that currently are only permitted
-// in constraint position (we have not yet defined that behavior in the spec).
-func (check *Checker) newAssertableTo(V *Interface, T Type) bool {
+func (check *Checker) assertableTo(V, T Type, cause *string) 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 IsInterface(T) {
 		return true
 	}
-	return check.implements(T, V, false, nil)
+	// TODO(gri) fix this for generalized interfaces
+	m, _ := check.missingMethod(T, V, false, Identical, cause)
+	return m == nil
 }
 
-// deref dereferences typ if it is a *Pointer and returns its base and true.
+// newAssertableTo reports whether a value of type V can be asserted to have type T.
+// It also implements behavior for interfaces that currently are only permitted
+// in constraint position (we have not yet defined that behavior in the spec).
+// The underlying type of V must be an interface.
+// If the result is false and cause is not nil, *cause is set to the error cause.
+func (check *Checker) newAssertableTo(pos token.Pos, V, T Type, cause *string) 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 IsInterface(T) {
+		return true
+	}
+	return check.implements(pos, T, V, false, cause)
+}
+
+// deref dereferences typ if it is a *Pointer (but not a *Named type
+// with an underlying pointer type!) and returns its base and true.
 // Otherwise it returns (typ, false).
 func deref(typ Type) (Type, bool) {
 	if p, _ := typ.(*Pointer); p != nil {
diff --git a/src/go/types/main_test.go b/src/go/types/main_test.go
index 73d7d18..fda9d10 100644
--- a/src/go/types/main_test.go
+++ b/src/go/types/main_test.go
@@ -1,3 +1,5 @@
+// Code generated by "go test -run=Generate -write=all"; DO NOT EDIT.
+
 // Copyright 2022 The Go Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
diff --git a/src/go/types/map.go b/src/go/types/map.go
index 01e13b2..febb0d3 100644
--- a/src/go/types/map.go
+++ b/src/go/types/map.go
@@ -1,3 +1,5 @@
+// Code generated by "go test -run=Generate -write=all"; DO NOT EDIT.
+
 // Copyright 2011 The Go Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
diff --git a/src/go/types/methodset.go b/src/go/types/methodset.go
index 2bf3028..0d9d9b4 100644
--- a/src/go/types/methodset.go
+++ b/src/go/types/methodset.go
@@ -76,6 +76,14 @@
 	// TODO(rfindley) confirm that this code is in sync with lookupFieldOrMethod
 	//                with respect to type params.
 
+	// Methods cannot be associated with 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.").
+	if t, _ := T.(*Named); t != nil && isPointer(t) {
+		return &emptyMethodSet
+	}
+
 	// method set up to the current depth, allocated lazily
 	var base methodSet
 
diff --git a/src/go/types/methodset_test.go b/src/go/types/methodset_test.go
index 443994b..c40d05f 100644
--- a/src/go/types/methodset_test.go
+++ b/src/go/types/methodset_test.go
@@ -5,6 +5,7 @@
 package types_test
 
 import (
+	"strings"
 	"testing"
 
 	"go/ast"
@@ -65,7 +66,7 @@
 		"var a struct{ E1; *E2 }; type ( E1 interface{ f() }; E2 struct{ f int })":            {},
 		"var a struct{ E1; *E2 }; type ( E1 struct{ f int }; E2 struct{} ); func (E2) f() {}": {},
 
-		// recursive generic types; see golang/go#52715
+		// recursive generic types; see go.dev/issue/52715
 		"var a T[int]; type ( T[P any] struct { *N[P] }; N[P any] struct { *T[P] } ); func (N[P]) m() {}": {{"m", []int{0, 0}, true}},
 		"var a T[int]; type ( T[P any] struct { *N[P] }; N[P any] struct { *T[P] } ); func (T[P]) m() {}": {{"m", []int{0}, false}},
 	}
@@ -75,16 +76,16 @@
 		"type C interface{ f() }; func g[T C](a T){}":               {{"f", []int{0}, true}},
 		"type C interface{ f() }; func g[T C]() { var a T; _ = a }": {{"f", []int{0}, true}},
 
-		// Issue #43621: We don't allow this anymore. Keep this code in case we
+		// go.dev/issue/43621: We don't allow this anymore. Keep this code in case we
 		// decide to revisit this decision.
 		// "type C interface{ f() }; func g[T C]() { var a struct{T}; _ = a }": {{"f", []int{0, 0}, true}},
 
-		// Issue #45639: We also don't allow this anymore.
+		// go.dev/issue/45639: We also don't allow this anymore.
 		// "type C interface{ f() }; func g[T C]() { type Y T; var a Y; _ = a }": {},
 	}
 
 	check := func(src string, methods []method, generic bool) {
-		pkg := mustTypecheck("test", "package p;"+src, nil)
+		pkg := mustTypecheck("package p;"+src, nil, nil)
 
 		scope := pkg.Scope()
 		if generic {
@@ -125,7 +126,7 @@
 	}
 }
 
-// Test for golang/go#52715
+// Test for go.dev/issue/52715
 func TestNewMethodSet_RecursiveGeneric(t *testing.T) {
 	const src = `
 package pkg
@@ -154,3 +155,43 @@
 	T := pkg.Scope().Lookup("Instance").Type()
 	_ = NewMethodSet(T) // verify that NewMethodSet terminates
 }
+
+func TestIssue60634(t *testing.T) {
+	const src = `
+package p
+type T *int
+func (T) m() {} // expected error: invalid receiver type
+`
+
+	fset := token.NewFileSet()
+	f, err := parser.ParseFile(fset, "p.go", src, 0)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	var conf Config
+	pkg, err := conf.Check("p", fset, []*ast.File{f}, nil)
+	if err == nil || !strings.Contains(err.Error(), "invalid receiver type") {
+		t.Fatalf("missing or unexpected error: %v", err)
+	}
+
+	// look up T.m and (*T).m
+	T := pkg.Scope().Lookup("T").Type()
+	name := "m"
+	for _, recv := range []Type{T, NewPointer(T)} {
+		// LookupFieldOrMethod and NewMethodSet must match:
+		// either both find m or neither finds it.
+		obj1, _, _ := LookupFieldOrMethod(recv, false, pkg, name)
+		mset := NewMethodSet(recv)
+		if (obj1 != nil) != (mset.Len() == 1) {
+			t.Fatalf("lookup(%v.%s): got obj = %v, mset = %v", recv, name, obj1, mset)
+		}
+		// If the method exists, both must return the same object.
+		if obj1 != nil {
+			obj2 := mset.At(0).Obj()
+			if obj1 != obj2 {
+				t.Fatalf("%v != %v", obj1, obj2)
+			}
+		}
+	}
+}
diff --git a/src/go/types/mono.go b/src/go/types/mono.go
index cf3f5a8..ebf4d8c 100644
--- a/src/go/types/mono.go
+++ b/src/go/types/mono.go
@@ -282,7 +282,7 @@
 	// parameters that it's implicitly parameterized by.
 	for scope := obj.Parent(); scope != root; scope = scope.Parent() {
 		for _, elem := range scope.elems {
-			if elem, ok := elem.(*TypeName); ok && !elem.IsAlias() && elem.Pos() < obj.Pos() {
+			if elem, ok := elem.(*TypeName); ok && !elem.IsAlias() && cmpPos(elem.Pos(), obj.Pos()) < 0 {
 				if tpar, ok := elem.Type().(*TypeParam); ok {
 					if idx < 0 {
 						idx = len(w.vertices)
diff --git a/src/go/types/mono_test.go b/src/go/types/mono_test.go
index 02daa4f..ccab846 100644
--- a/src/go/types/mono_test.go
+++ b/src/go/types/mono_test.go
@@ -7,29 +7,21 @@
 import (
 	"errors"
 	"fmt"
-	"go/ast"
 	"go/importer"
-	"go/parser"
-	"go/token"
 	"go/types"
 	"strings"
 	"testing"
 )
 
 func checkMono(t *testing.T, body string) error {
-	fset := token.NewFileSet()
-	file, err := parser.ParseFile(fset, "x.go", "package x; import `unsafe`; var _ unsafe.Pointer;\n"+body, 0)
-	if err != nil {
-		t.Fatal(err)
-	}
-	files := []*ast.File{file}
+	src := "package x; import `unsafe`; var _ unsafe.Pointer;\n" + body
 
 	var buf strings.Builder
 	conf := types.Config{
 		Error:    func(err error) { fmt.Fprintln(&buf, err) },
 		Importer: importer.Default(),
 	}
-	conf.Check("x", fset, files, nil)
+	typecheck(src, &conf, nil)
 	if buf.Len() == 0 {
 		return nil
 	}
diff --git a/src/go/types/named.go b/src/go/types/named.go
index c08997a..413eaad 100644
--- a/src/go/types/named.go
+++ b/src/go/types/named.go
@@ -1,3 +1,5 @@
+// Code generated by "go test -run=Generate -write=all"; DO NOT EDIT.
+
 // Copyright 2011 The Go Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
@@ -539,7 +541,7 @@
 	for n := range seen {
 		// We should never have to update the underlying type of an imported type;
 		// those underlying types should have been resolved during the import.
-		// Also, doing so would lead to a race condition (was issue #31749).
+		// Also, doing so would lead to a race condition (was go.dev/issue/31749).
 		// Do this check always, not just in debug mode (it's cheap).
 		if n.obj.pkg != check.pkg {
 			panic("imported type with unresolved underlying type")
@@ -581,7 +583,7 @@
 // returning the result. Returns Typ[Invalid] if there was an error.
 func (n *Named) expandUnderlying() Type {
 	check := n.check
-	if check != nil && trace {
+	if check != nil && check.conf._Trace {
 		check.trace(n.obj.pos, "-- Named.expandUnderlying %s", n)
 		check.indent++
 		defer func() {
diff --git a/src/go/types/named_test.go b/src/go/types/named_test.go
index 92f17e5..8e00f6e 100644
--- a/src/go/types/named_test.go
+++ b/src/go/types/named_test.go
@@ -32,7 +32,7 @@
 
 type Inst = G[int]
 	`
-	pkg := mustTypecheck("p", src, nil)
+	pkg := mustTypecheck(src, nil, nil)
 
 	var (
 		T        = pkg.Scope().Lookup("T").Type()
@@ -86,7 +86,7 @@
 	return inst
 }
 
-// Test that types do not expand infinitely, as in golang/go#52715.
+// Test that types do not expand infinitely, as in go.dev/issue/52715.
 func TestFiniteTypeExpansion(t *testing.T) {
 	const src = `
 package p
@@ -107,7 +107,7 @@
 `
 
 	fset := token.NewFileSet()
-	f := mustParse(fset, "foo.go", src)
+	f := mustParse(fset, src)
 	pkg := NewPackage("p", f.Name.Name)
 	if err := NewChecker(nil, fset, pkg, nil).Files([]*ast.File{f}); err != nil {
 		t.Fatal(err)
diff --git a/src/go/types/object.go b/src/go/types/object.go
index 6e63948..e47ef2e 100644
--- a/src/go/types/object.go
+++ b/src/go/types/object.go
@@ -1,3 +1,5 @@
+// Code generated by "go test -run=Generate -write=all"; DO NOT EDIT.
+
 // Copyright 2013 The Go Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
@@ -9,6 +11,8 @@
 	"fmt"
 	"go/constant"
 	"go/token"
+	"unicode"
+	"unicode/utf8"
 )
 
 // An Object describes a named language entity such as a package,
@@ -57,10 +61,15 @@
 	setScopePos(pos token.Pos)
 }
 
+func isExported(name string) bool {
+	ch, _ := utf8.DecodeRuneInString(name)
+	return unicode.IsUpper(ch)
+}
+
 // 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 token.IsExported(name) {
+	if isExported(name) {
 		return name
 	}
 	// unexported names need the package path for differentiation
@@ -140,7 +149,7 @@
 // Exported reports whether the object is exported (starts with a capital letter).
 // It doesn't take into account whether the object is in a local (function) scope
 // or not.
-func (obj *object) Exported() bool { return token.IsExported(obj.name) }
+func (obj *object) Exported() bool { return isExported(obj.name) }
 
 // Id is a wrapper for Id(obj.Pkg(), obj.Name()).
 func (obj *object) Id() string { return Id(obj.pkg, obj.name) }
@@ -178,6 +187,42 @@
 	return pkg.path == obj.pkg.path
 }
 
+// less reports whether object a is ordered before object b.
+//
+// Objects are ordered nil before non-nil, exported before
+// non-exported, then by name, and finally (for non-exported
+// functions) by package path.
+func (a *object) less(b *object) bool {
+	if a == b {
+		return false
+	}
+
+	// Nil before non-nil.
+	if a == nil {
+		return true
+	}
+	if b == nil {
+		return false
+	}
+
+	// Exported functions before non-exported.
+	ea := isExported(a.name)
+	eb := isExported(b.name)
+	if ea != eb {
+		return ea
+	}
+
+	// Order by name and then (for non-exported names) by package.
+	if a.name != b.name {
+		return a.name < b.name
+	}
+	if !ea {
+		return a.pkg.path < b.pkg.path
+	}
+
+	return false
+}
+
 // A PkgName represents an imported Go package.
 // PkgNames don't have a type.
 type PkgName struct {
@@ -189,7 +234,7 @@
 // NewPkgName returns a new PkgName object representing an imported package.
 // The remaining arguments set the attributes found with all Objects.
 func NewPkgName(pos token.Pos, pkg *Package, name string, imported *Package) *PkgName {
-	return &PkgName{object{nil, pos, pkg, name, Typ[Invalid], 0, black, token.NoPos}, imported, false}
+	return &PkgName{object{nil, pos, pkg, name, Typ[Invalid], 0, black, nopos}, imported, false}
 }
 
 // Imported returns the package that was imported.
@@ -205,7 +250,7 @@
 // NewConst returns a new constant with value val.
 // The remaining arguments set the attributes found with all Objects.
 func NewConst(pos token.Pos, pkg *Package, name string, typ Type, val constant.Value) *Const {
-	return &Const{object{nil, pos, pkg, name, typ, 0, colorFor(typ), token.NoPos}, val}
+	return &Const{object{nil, pos, pkg, name, typ, 0, colorFor(typ), nopos}, val}
 }
 
 // Val returns the constant's value.
@@ -226,10 +271,10 @@
 // argument for NewNamed, which will set the TypeName's type as a side-
 // effect.
 func NewTypeName(pos token.Pos, pkg *Package, name string, typ Type) *TypeName {
-	return &TypeName{object{nil, pos, pkg, name, typ, 0, colorFor(typ), token.NoPos}}
+	return &TypeName{object{nil, pos, pkg, name, typ, 0, colorFor(typ), nopos}}
 }
 
-// _NewTypeNameLazy returns a new defined type like NewTypeName, but it
+// NewTypeNameLazy returns a new defined type like NewTypeName, but it
 // lazily calls resolve to finish constructing the Named object.
 func _NewTypeNameLazy(pos token.Pos, pkg *Package, name string, load func(named *Named) (tparams []*TypeParam, underlying Type, methods []*Func)) *TypeName {
 	obj := NewTypeName(pos, pkg, name, nil)
@@ -275,19 +320,19 @@
 // NewVar returns a new variable.
 // The arguments set the attributes found with all Objects.
 func NewVar(pos token.Pos, pkg *Package, name string, typ Type) *Var {
-	return &Var{object: object{nil, pos, pkg, name, typ, 0, colorFor(typ), token.NoPos}}
+	return &Var{object: object{nil, pos, pkg, name, typ, 0, colorFor(typ), nopos}}
 }
 
 // NewParam returns a new variable representing a function parameter.
 func NewParam(pos token.Pos, pkg *Package, name string, typ Type) *Var {
-	return &Var{object: object{nil, pos, pkg, name, typ, 0, colorFor(typ), token.NoPos}, used: true} // parameters are always 'used'
+	return &Var{object: object{nil, pos, pkg, name, typ, 0, colorFor(typ), nopos}, used: true} // parameters are always 'used'
 }
 
 // NewField returns a new variable representing a struct field.
 // For embedded fields, the name is the unqualified type name
 // under which the field is accessible.
 func NewField(pos token.Pos, pkg *Package, name string, typ Type, embedded bool) *Var {
-	return &Var{object: object{nil, pos, pkg, name, typ, 0, colorFor(typ), token.NoPos}, embedded: embedded, isField: true}
+	return &Var{object: object{nil, pos, pkg, name, typ, 0, colorFor(typ), nopos}, embedded: embedded, isField: true}
 }
 
 // Anonymous reports whether the variable is an embedded field.
@@ -333,7 +378,7 @@
 	if sig != nil {
 		typ = sig
 	}
-	return &Func{object{nil, pos, pkg, name, typ, 0, colorFor(typ), token.NoPos}, false, nil}
+	return &Func{object{nil, pos, pkg, name, typ, 0, colorFor(typ), nopos}, false, nil}
 }
 
 // FullName returns the package- or receiver-type-qualified name of
diff --git a/src/go/types/object_test.go b/src/go/types/object_test.go
index 60e7a84..74acdae 100644
--- a/src/go/types/object_test.go
+++ b/src/go/types/object_test.go
@@ -1,3 +1,5 @@
+// Code generated by "go test -run=Generate -write=all"; DO NOT EDIT.
+
 // Copyright 2016 The Go Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
@@ -5,8 +7,6 @@
 package types_test
 
 import (
-	"go/ast"
-	"go/token"
 	"internal/testenv"
 	"strings"
 	"testing"
@@ -31,23 +31,23 @@
 
 	// various other types
 	pkg := NewPackage("p", "p")
-	t1 := NewTypeName(0, pkg, "t1", nil)
+	t1 := NewTypeName(nopos, pkg, "t1", nil)
 	n1 := NewNamed(t1, new(Struct), nil)
-	t5 := NewTypeName(0, pkg, "t5", nil)
+	t5 := NewTypeName(nopos, pkg, "t5", nil)
 	NewTypeParam(t5, nil)
 	for _, test := range []struct {
 		name  *TypeName
 		alias bool
 	}{
-		{NewTypeName(0, nil, "t0", nil), false},                       // no type yet
-		{NewTypeName(0, pkg, "t0", nil), false},                       // no type yet
-		{t1, false},                                                   // type name refers to named type and vice versa
-		{NewTypeName(0, nil, "t2", NewInterfaceType(nil, nil)), true}, // type name refers to unnamed type
-		{NewTypeName(0, pkg, "t3", n1), true},                         // type name refers to named type with different type name
-		{NewTypeName(0, nil, "t4", Typ[Int32]), true},                 // type name refers to basic type with different name
-		{NewTypeName(0, nil, "int32", Typ[Int32]), false},             // type name refers to basic type with same name
-		{NewTypeName(0, pkg, "int32", Typ[Int32]), true},              // type name is declared in user-defined package (outside Universe)
-		{NewTypeName(0, nil, "rune", Typ[Rune]), true},                // type name refers to basic type rune which is an alias already
+		{NewTypeName(nopos, nil, "t0", nil), false}, // no type yet
+		{NewTypeName(nopos, pkg, "t0", nil), false}, // no type yet
+		{t1, false}, // type name refers to named type and vice versa
+		{NewTypeName(nopos, nil, "t2", NewInterfaceType(nil, nil)), true}, // type name refers to unnamed type
+		{NewTypeName(nopos, pkg, "t3", n1), true},                         // type name refers to named type with different type name
+		{NewTypeName(nopos, nil, "t4", Typ[Int32]), true},                 // type name refers to basic type with different name
+		{NewTypeName(nopos, nil, "int32", Typ[Int32]), false},             // type name refers to basic type with same name
+		{NewTypeName(nopos, pkg, "int32", Typ[Int32]), true},              // type name is declared in user-defined package (outside Universe)
+		{NewTypeName(nopos, nil, "rune", Typ[Rune]), true},                // type name refers to basic type rune which is an alias already
 		{t5, false}, // type name refers to type parameter and vice versa
 	} {
 		check(test.name, test.alias)
@@ -55,18 +55,10 @@
 }
 
 // TestEmbeddedMethod checks that an embedded method is represented by
-// the same Func Object as the original method. See also issue #34421.
+// the same Func Object as the original method. See also go.dev/issue/34421.
 func TestEmbeddedMethod(t *testing.T) {
 	const src = `package p; type I interface { error }`
-
-	// type-check src
-	fset := token.NewFileSet()
-	f := mustParse(fset, "", src)
-	var conf Config
-	pkg, err := conf.Check(f.Name.Name, fset, []*ast.File{f}, nil)
-	if err != nil {
-		t.Fatalf("typecheck failed: %s", err)
-	}
+	pkg := mustTypecheck(src, nil, nil)
 
 	// get original error.Error method
 	eface := Universe.Lookup("error")
@@ -120,7 +112,7 @@
 
 	for _, test := range testObjects {
 		src := "package p; " + test.src
-		pkg, err := typecheck(filename, src, nil)
+		pkg, err := typecheck(src, nil, nil)
 		if err != nil {
 			t.Errorf("%s: %s", src, err)
 			continue
@@ -131,7 +123,7 @@
 			t.Errorf("%s: invalid object path %s", test.src, test.obj)
 			continue
 		}
-		_, obj := pkg.Scope().LookupParent(names[0], token.NoPos)
+		_, obj := pkg.Scope().LookupParent(names[0], nopos)
 		if obj == nil {
 			t.Errorf("%s: %s not found", test.src, names[0])
 			continue
diff --git a/src/go/types/objset.go b/src/go/types/objset.go
index 55eb74a..e6ea375 100644
--- a/src/go/types/objset.go
+++ b/src/go/types/objset.go
@@ -1,3 +1,5 @@
+// Code generated by "go test -run=Generate -write=all"; DO NOT EDIT.
+
 // Copyright 2013 The Go Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
diff --git a/src/go/types/operand.go b/src/go/types/operand.go
index 819c99e..d7719fd 100644
--- a/src/go/types/operand.go
+++ b/src/go/types/operand.go
@@ -59,11 +59,11 @@
 }
 
 // Pos returns the position of the expression corresponding to x.
-// If x is invalid the position is token.NoPos.
+// If x is invalid the position is 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 nopos
 	}
 	return x.expr.Pos()
 }
@@ -222,10 +222,8 @@
 	x.val = val
 }
 
-// isNil reports whether x is the nil value.
-func (x *operand) isNil() bool {
-	return x.mode == value && x.typ == Typ[UntypedNil]
-}
+// isNil reports whether x is the (untyped) nil value.
+func (x *operand) isNil() bool { return x.mode == value && x.typ == Typ[UntypedNil] }
 
 // assignableTo reports whether x is assignable to a variable of type T. If the
 // result is false and a non-nil cause is provided, it may be set to a more
@@ -279,18 +277,26 @@
 		return true, 0
 	}
 
-	// T is an interface type and x implements T and T is not a type parameter.
-	// Also handle the case where T is a pointer to an interface.
+	// T is an interface type, but not a type parameter, and V implements T.
+	// Also handle the case where T is a pointer to an interface so that we get
+	// the Checker.implements error cause.
 	if _, ok := Tu.(*Interface); ok && Tp == nil || isInterfacePtr(Tu) {
-		if !check.implements(V, T, false, cause) {
+		if check.implements(x.Pos(), V, T, false, cause) {
+			return true, 0
+		}
+		// V doesn't implement T but V may still be assignable to T if V
+		// is a type parameter; do not report an error in that case yet.
+		if Vp == nil {
 			return false, InvalidIfaceAssign
 		}
-		return true, 0
+		if cause != nil {
+			*cause = ""
+		}
 	}
 
 	// If V is an interface, check if a missing type assertion is the problem.
 	if Vi, _ := Vu.(*Interface); Vi != nil && Vp == nil {
-		if check.implements(T, V, false, nil) {
+		if check.implements(x.Pos(), T, V, false, nil) {
 			// T implements V, so give hint about type assertion.
 			if cause != nil {
 				*cause = "need type assertion"
diff --git a/src/go/types/package.go b/src/go/types/package.go
index 2b72ff1..0f52d5f 100644
--- a/src/go/types/package.go
+++ b/src/go/types/package.go
@@ -1,3 +1,5 @@
+// Code generated by "go test -run=Generate -write=all"; DO NOT EDIT.
+
 // Copyright 2013 The Go Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
@@ -6,24 +8,24 @@
 
 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)
-	cgo      bool // uses of this package will be rewritten into uses of declarations from _cgo_gotypes.go
+	path      string
+	name      string
+	scope     *Scope
+	imports   []*Package
+	complete  bool
+	fake      bool   // scope lookup errors are silently dropped if package is fake (internal use only)
+	cgo       bool   // uses of this package will be rewritten into uses of declarations from _cgo_gotypes.go
+	goVersion string // minimum Go version required for package (by Config.GoVersion, typically from go.mod)
 }
 
 // NewPackage returns a new Package for the given package path and name.
 // The package is not complete and contains no explicit imports.
 func NewPackage(path, name string) *Package {
-	scope := NewScope(Universe, token.NoPos, token.NoPos, fmt.Sprintf("package %q", path))
+	scope := NewScope(Universe, nopos, nopos, fmt.Sprintf("package %q", path))
 	return &Package{path: path, name: name, scope: scope}
 }
 
@@ -36,6 +38,12 @@
 // SetName sets the package name.
 func (pkg *Package) SetName(name string) { pkg.name = name }
 
+// GoVersion returns the minimum Go version required by this package.
+// If the minimum version is unknown, GoVersion returns the empty string.
+// Individual source files may specify a different minimum Go version,
+// as reported in the [go/ast.File.GoVersion] field.
+func (pkg *Package) GoVersion() string { return pkg.goVersion }
+
 // Scope returns the (complete or incomplete) package scope
 // holding the objects declared at package level (TypeNames,
 // Consts, Vars, and Funcs).
diff --git a/src/go/types/pointer.go b/src/go/types/pointer.go
index 6352ee5..5b45ab7 100644
--- a/src/go/types/pointer.go
+++ b/src/go/types/pointer.go
@@ -1,3 +1,5 @@
+// Code generated by "go test -run=Generate -write=all"; DO NOT EDIT.
+
 // Copyright 2011 The Go Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
@@ -15,5 +17,5 @@
 // Elem returns the element type for the given pointer p.
 func (p *Pointer) Elem() Type { return p.base }
 
-func (t *Pointer) Underlying() Type { return t }
-func (t *Pointer) String() string   { return TypeString(t, nil) }
+func (p *Pointer) Underlying() Type { return p }
+func (p *Pointer) String() string   { return TypeString(p, nil) }
diff --git a/src/go/types/predicates.go b/src/go/types/predicates.go
index e9a0e43..b821b58 100644
--- a/src/go/types/predicates.go
+++ b/src/go/types/predicates.go
@@ -1,3 +1,5 @@
+// Code generated by "go test -run=Generate -write=all"; DO NOT EDIT.
+
 // 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.
@@ -6,8 +8,6 @@
 
 package types
 
-import "go/token"
-
 // The isX predicates below report whether t is an X.
 // If t is a type parameter the result is false; i.e.,
 // these predicates don't look inside a type parameter.
@@ -36,13 +36,13 @@
 // allX is an optimized version of isX(coreType(t)) (which
 // is the same as underIs(t, isX)).
 
-func allBoolean(typ Type) bool         { return allBasic(typ, IsBoolean) }
-func allInteger(typ Type) bool         { return allBasic(typ, IsInteger) }
-func allUnsigned(typ Type) bool        { return allBasic(typ, IsUnsigned) }
-func allNumeric(typ Type) bool         { return allBasic(typ, IsNumeric) }
-func allString(typ Type) bool          { return allBasic(typ, IsString) }
-func allOrdered(typ Type) bool         { return allBasic(typ, IsOrdered) }
-func allNumericOrString(typ Type) bool { return allBasic(typ, IsNumeric|IsString) }
+func allBoolean(t Type) bool         { return allBasic(t, IsBoolean) }
+func allInteger(t Type) bool         { return allBasic(t, IsInteger) }
+func allUnsigned(t Type) bool        { return allBasic(t, IsUnsigned) }
+func allNumeric(t Type) bool         { return allBasic(t, IsNumeric) }
+func allString(t Type) bool          { return allBasic(t, IsString) }
+func allOrdered(t Type) bool         { return allBasic(t, IsOrdered) }
+func allNumericOrString(t Type) bool { return allBasic(t, IsNumeric|IsString) }
 
 // allBasic reports whether under(t) is a basic type with the specified info.
 // If t is a type parameter, the result is true if isBasic(t, info) is true
@@ -66,6 +66,17 @@
 	return false
 }
 
+// isTypeLit reports whether t is a type literal.
+// This includes all non-defined types, but also basic types.
+// isTypeLit may be called with types that are not fully set up.
+func isTypeLit(t Type) bool {
+	switch t.(type) {
+	case *Named, *TypeParam:
+		return false
+	}
+	return true
+}
+
 // isTyped reports whether t is typed; i.e., not an untyped
 // constant or boolean. isTyped may be called with types that
 // are not fully set up.
@@ -201,12 +212,22 @@
 	return p.x == q.x && p.y == q.y || p.x == q.y && p.y == q.x
 }
 
+// A comparer is used to compare types.
+type comparer struct {
+	ignoreTags     bool // if set, identical ignores struct tags
+	ignoreInvalids bool // if set, identical treats an invalid type as identical to any type
+}
+
 // For changes to this code the corresponding changes should be made to unifier.nify.
-func identical(x, y Type, cmpTags bool, p *ifacePair) bool {
+func (c *comparer) identical(x, y Type, p *ifacePair) bool {
 	if x == y {
 		return true
 	}
 
+	if c.ignoreInvalids && (x == Typ[Invalid] || y == Typ[Invalid]) {
+		return true
+	}
+
 	switch x := x.(type) {
 	case *Basic:
 		// Basic types are singletons except for the rune and byte
@@ -222,13 +243,13 @@
 		if y, ok := y.(*Array); ok {
 			// If one or both array lengths are unknown (< 0) due to some error,
 			// assume they are the same to avoid spurious follow-on errors.
-			return (x.len < 0 || y.len < 0 || x.len == y.len) && identical(x.elem, y.elem, cmpTags, p)
+			return (x.len < 0 || y.len < 0 || x.len == y.len) && c.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, cmpTags, p)
+			return c.identical(x.elem, y.elem, p)
 		}
 
 	case *Struct:
@@ -241,9 +262,9 @@
 				for i, f := range x.fields {
 					g := y.fields[i]
 					if f.embedded != g.embedded ||
-						cmpTags && x.Tag(i) != y.Tag(i) ||
+						!c.ignoreTags && x.Tag(i) != y.Tag(i) ||
 						!f.sameId(g.pkg, g.name) ||
-						!identical(f.typ, g.typ, cmpTags, p) {
+						!c.identical(f.typ, g.typ, p) {
 						return false
 					}
 				}
@@ -254,7 +275,7 @@
 	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, cmpTags, p)
+			return c.identical(x.base, y.base, p)
 		}
 
 	case *Tuple:
@@ -265,7 +286,7 @@
 				if x != nil {
 					for i, v := range x.vars {
 						w := y.vars[i]
-						if !identical(v.typ, w.typ, cmpTags, p) {
+						if !c.identical(v.typ, w.typ, p) {
 							return false
 						}
 					}
@@ -312,27 +333,27 @@
 
 			// Constraints must be pair-wise identical, after substitution.
 			for i, xtparam := range xtparams {
-				ybound := check.subst(token.NoPos, ytparams[i].bound, smap, nil, ctxt)
-				if !identical(xtparam.bound, ybound, cmpTags, p) {
+				ybound := check.subst(nopos, ytparams[i].bound, smap, nil, ctxt)
+				if !c.identical(xtparam.bound, ybound, p) {
 					return false
 				}
 			}
 
-			yparams = check.subst(token.NoPos, y.params, smap, nil, ctxt).(*Tuple)
-			yresults = check.subst(token.NoPos, y.results, smap, nil, ctxt).(*Tuple)
+			yparams = check.subst(nopos, y.params, smap, nil, ctxt).(*Tuple)
+			yresults = check.subst(nopos, y.results, smap, nil, ctxt).(*Tuple)
 		}
 
 		return x.variadic == y.variadic &&
-			identical(x.params, yparams, cmpTags, p) &&
-			identical(x.results, yresults, cmpTags, p)
+			c.identical(x.params, yparams, p) &&
+			c.identical(x.results, yresults, p)
 
 	case *Union:
 		if y, _ := y.(*Union); y != nil {
 			// TODO(rfindley): can this be reached during type checking? If so,
 			// consider passing a type set map.
 			unionSets := make(map[*Union]*_TypeSet)
-			xset := computeUnionTypeSet(nil, unionSets, token.NoPos, x)
-			yset := computeUnionTypeSet(nil, unionSets, token.NoPos, y)
+			xset := computeUnionTypeSet(nil, unionSets, nopos, x)
+			yset := computeUnionTypeSet(nil, unionSets, nopos, y)
 			return xset.terms.equal(yset.terms)
 		}
 
@@ -391,7 +412,7 @@
 				}
 				for i, f := range a {
 					g := b[i]
-					if f.Id() != g.Id() || !identical(f.typ, g.typ, cmpTags, q) {
+					if f.Id() != g.Id() || !c.identical(f.typ, g.typ, q) {
 						return false
 					}
 				}
@@ -402,45 +423,35 @@
 	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, cmpTags, p) && identical(x.elem, y.elem, cmpTags, p)
+			return c.identical(x.key, y.key, p) && c.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, cmpTags, p)
+			return x.dir == y.dir && c.identical(x.elem, y.elem, p)
 		}
 
 	case *Named:
 		// Two named types are identical if their type names originate
-		// in the same type declaration.
+		// in the same type declaration; if they are instantiated they
+		// must have identical type argument lists.
 		if y, ok := y.(*Named); ok {
+			// check type arguments before origins to match unifier
+			// (for correct source code we need to do all checks so
+			// order doesn't matter)
 			xargs := x.TypeArgs().list()
 			yargs := y.TypeArgs().list()
-
 			if len(xargs) != len(yargs) {
 				return false
 			}
-
-			if len(xargs) > 0 {
-				// Instances are identical if their original type and type arguments
-				// are identical.
-				if !Identical(x.Origin(), y.Origin()) {
+			for i, xarg := range xargs {
+				if !Identical(xarg, yargs[i]) {
 					return false
 				}
-				for i, xa := range xargs {
-					if !Identical(xa, yargs[i]) {
-						return false
-					}
-				}
-				return true
 			}
-
-			// TODO(gri) Why is x == y not sufficient? And if it is,
-			//           we can just return false here because x == y
-			//           is caught in the very beginning of this function.
-			return x.obj == y.obj
+			return indenticalOrigin(x, y)
 		}
 
 	case *TypeParam:
@@ -456,6 +467,12 @@
 	return false
 }
 
+// identicalOrigin reports whether x and y originated in the same declaration.
+func indenticalOrigin(x, y *Named) bool {
+	// TODO(gri) is this correct?
+	return x.Origin().obj == y.Origin().obj
+}
+
 // identicalInstance reports if two type instantiations are identical.
 // Instantiations are identical if their origin and type arguments are
 // identical.
@@ -495,3 +512,23 @@
 	}
 	return t
 }
+
+// maxType returns the "largest" type that encompasses both x and y.
+// If x and y are different untyped numeric types, the result is the type of x or y
+// that appears later in this list: integer, rune, floating-point, complex.
+// Otherwise, if x != y, the result is nil.
+func maxType(x, y Type) Type {
+	// We only care about untyped types (for now), so == is good enough.
+	// TODO(gri) investigate generalizing this function to simplify code elsewhere
+	if x == y {
+		return x
+	}
+	if isUntyped(x) && isUntyped(y) && isNumeric(x) && isNumeric(y) {
+		// untyped types are basic types
+		if x.(*Basic).kind > y.(*Basic).kind {
+			return x
+		}
+		return y
+	}
+	return nil
+}
diff --git a/src/go/types/resolver.go b/src/go/types/resolver.go
index 075bd91..6397b39 100644
--- a/src/go/types/resolver.go
+++ b/src/go/types/resolver.go
@@ -118,7 +118,7 @@
 		return
 	}
 
-	check.declare(check.pkg.scope, ident, obj, token.NoPos)
+	check.declare(check.pkg.scope, ident, obj, nopos)
 	check.objMap[obj] = d
 	obj.setOrder(uint32(len(check.objMap)))
 }
@@ -242,7 +242,7 @@
 		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))
+		fileScope := NewScope(pkg.scope, pos, end, check.filename(fileNo))
 		fileScopes = append(fileScopes, fileScope)
 		check.recordScope(file, fileScope)
 
@@ -325,7 +325,7 @@
 							// (Do not use check.declare because it modifies the object
 							// via Object.setScopePos, which leads to a race condition;
 							// the object may be imported into more than one file scope
-							// concurrently. See issue #32154.)
+							// concurrently. See go.dev/issue/32154.)
 							if alt := fileScope.Lookup(name); alt != nil {
 								check.errorf(d.spec.Name, DuplicateDecl, "%s redeclared in this block", alt.Name())
 								check.reportAltDecl(alt)
@@ -338,7 +338,7 @@
 				} else {
 					// declare imported package object in file scope
 					// (no need to provide s.Name since we called check.recordDef earlier)
-					check.declare(fileScope, nil, pkgName, token.NoPos)
+					check.declare(fileScope, nil, pkgName, nopos)
 				}
 			case constDecl:
 				// declare all constants
@@ -386,9 +386,7 @@
 					check.declarePkgObj(name, obj, di)
 				}
 			case typeDecl:
-				if d.spec.TypeParams.NumFields() != 0 && !check.allowVersion(pkg, 1, 18) {
-					check.softErrorf(d.spec.TypeParams.List[0], UnsupportedFeature, "type parameter requires go1.18 or later")
-				}
+				_ = d.spec.TypeParams.NumFields() != 0 && check.verifyVersionf(d.spec.TypeParams.List[0], go1_18, "type parameter")
 				obj := NewTypeName(d.spec.Name.Pos(), pkg, d.spec.Name.Name, nil)
 				check.declarePkgObj(d.spec.Name, obj, &declInfo{file: fileScope, tdecl: d.spec})
 			case funcDecl:
@@ -425,7 +423,7 @@
 							check.softErrorf(obj, MissingInitBody, "missing function body")
 						}
 					} else {
-						check.declare(pkg.scope, d.decl.Name, obj, token.NoPos)
+						check.declare(pkg.scope, d.decl.Name, obj, nopos)
 					}
 				} else {
 					// method
@@ -444,9 +442,7 @@
 					}
 					check.recordDef(d.decl.Name, obj)
 				}
-				if d.decl.Type.TypeParams.NumFields() != 0 && !check.allowVersion(pkg, 1, 18) && !hasTParamError {
-					check.softErrorf(d.decl.Type.TypeParams.List[0], UnsupportedFeature, "type parameter requires go1.18 or later")
-				}
+				_ = d.decl.Type.TypeParams.NumFields() != 0 && !hasTParamError && check.verifyVersionf(d.decl.Type.TypeParams.List[0], go1_18, "type parameter")
 				info := &declInfo{file: fileScope, fdecl: d.decl}
 				// Methods are not package-level objects but we still track them in the
 				// object map so that we can handle them like regular functions (if the
@@ -486,7 +482,7 @@
 	for i := range methods {
 		m := &methods[i]
 		// Determine the receiver base type and associate m with it.
-		ptr, base := check.resolveBaseTypeName(m.ptr, m.recv)
+		ptr, base := check.resolveBaseTypeName(m.ptr, m.recv, fileScopes)
 		if base != nil {
 			m.obj.hasPtrRecv_ = ptr
 			check.methods[base] = append(check.methods[base], m.obj)
@@ -554,7 +550,7 @@
 // there was a pointer indirection to get to it. The base type name must be declared
 // in package scope, and there can be at most one pointer indirection. If no such type
 // name exists, the returned base is nil.
-func (check *Checker) resolveBaseTypeName(seenPtr bool, name *ast.Ident) (ptr bool, base *TypeName) {
+func (check *Checker) resolveBaseTypeName(seenPtr bool, typ ast.Expr, fileScopes []*Scope) (ptr bool, base *TypeName) {
 	// Algorithm: Starting from a type expression, which may be a name,
 	// we follow that type through alias declarations until we reach a
 	// non-alias type name. If we encounter anything but pointer types or
@@ -562,8 +558,9 @@
 	// we're done.
 	ptr = seenPtr
 	var seen map[*TypeName]bool
-	var typ ast.Expr = name
 	for {
+		// Note: this differs from types2, but is necessary. The syntax parser
+		// strips unnecessary parens.
 		typ = unparen(typ)
 
 		// check if we have a pointer type
@@ -576,15 +573,43 @@
 			typ = unparen(pexpr.X) // continue with pointer base type
 		}
 
-		// typ must be a name
-		name, _ := typ.(*ast.Ident)
-		if name == nil {
+		// typ must be a name, or a C.name cgo selector.
+		var name string
+		switch typ := typ.(type) {
+		case *ast.Ident:
+			name = typ.Name
+		case *ast.SelectorExpr:
+			// C.struct_foo is a valid type name for packages using cgo.
+			//
+			// Detect this case, and adjust name so that the correct TypeName is
+			// resolved below.
+			if ident, _ := typ.X.(*ast.Ident); ident != nil && ident.Name == "C" {
+				// Check whether "C" actually resolves to an import of "C", by looking
+				// in the appropriate file scope.
+				var obj Object
+				for _, scope := range fileScopes {
+					if scope.Contains(ident.Pos()) {
+						obj = scope.Lookup(ident.Name)
+					}
+				}
+				// If Config.go115UsesCgo is set, the typechecker will resolve Cgo
+				// selectors to their cgo name. We must do the same here.
+				if pname, _ := obj.(*PkgName); pname != nil {
+					if pname.imported.cgo { // only set if Config.go115UsesCgo is set
+						name = "_Ctype_" + typ.Sel.Name
+					}
+				}
+			}
+			if name == "" {
+				return false, nil
+			}
+		default:
 			return false, nil
 		}
 
 		// name must denote an object found in the current package scope
 		// (note that dot-imported objects are not in the package scope!)
-		obj := check.pkg.scope.Lookup(name.Name)
+		obj := check.pkg.scope.Lookup(name)
 		if obj == nil {
 			return false, nil
 		}
@@ -637,7 +662,7 @@
 	// We process non-alias type declarations first, followed by alias declarations,
 	// and then everything else. This appears to avoid most situations where the type
 	// of an alias is needed before it is available.
-	// There may still be cases where this is not good enough (see also issue #25838).
+	// There may still be cases where this is not good enough (see also go.dev/issue/25838).
 	// In those cases Checker.ident will report an error ("invalid use of type alias").
 	var aliasList []*TypeName
 	var othersList []Object // everything that's not a type
diff --git a/src/go/types/resolver_test.go b/src/go/types/resolver_test.go
index 376ecfb..e95af80 100644
--- a/src/go/types/resolver_test.go
+++ b/src/go/types/resolver_test.go
@@ -119,8 +119,8 @@
 	// parse package files
 	fset := token.NewFileSet()
 	var files []*ast.File
-	for i, src := range sources {
-		files = append(files, mustParse(fset, fmt.Sprintf("sources[%d]", i), src))
+	for _, src := range sources {
+		files = append(files, mustParse(fset, src))
 	}
 
 	// resolve and type-check package AST
@@ -156,7 +156,7 @@
 					}
 					return false
 				}
-				return false
+				return true
 			}
 			return true
 		})
diff --git a/src/go/types/scope.go b/src/go/types/scope.go
index fc42ce6..bf646f6 100644
--- a/src/go/types/scope.go
+++ b/src/go/types/scope.go
@@ -1,3 +1,5 @@
+// Code generated by "go test -run=Generate -write=all"; DO NOT EDIT.
+
 // Copyright 2013 The Go Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
@@ -83,7 +85,7 @@
 // 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.Lookup(name); obj != nil && (!pos.IsValid() || obj.scopePos() <= pos) {
+		if obj := s.Lookup(name); obj != nil && (!pos.IsValid() || cmpPos(obj.scopePos(), pos) <= 0) {
 			return s, obj
 		}
 	}
@@ -107,11 +109,11 @@
 	return nil
 }
 
-// _InsertLazy is like Insert, but allows deferring construction of the
+// InsertLazy is like Insert, but allows deferring construction of the
 // inserted object until it's accessed with Lookup. The Object
-// returned by resolve must have the same name as given to _InsertLazy.
+// returned by resolve must have the same name as given to InsertLazy.
 // If s already contains an alternative object with the same name,
-// _InsertLazy leaves s unchanged and returns false. Otherwise it
+// InsertLazy leaves s unchanged and returns false. Otherwise it
 // records the binding and returns true. The object's parent scope
 // will be set to s after resolve is called.
 func (s *Scope) _InsertLazy(name string, resolve func() Object) bool {
@@ -129,7 +131,7 @@
 	s.elems[name] = obj
 }
 
-// squash merges s with its parent scope p by adding all
+// Squash merges s with its parent scope p by adding all
 // objects of s to p, adding all children of s to the
 // children of p, and removing s from p's children.
 // The function f is called for each object obj in s which
@@ -175,7 +177,7 @@
 // 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
+	return cmpPos(s.pos, pos) <= 0 && cmpPos(pos, s.end) < 0
 }
 
 // Innermost returns the innermost (child) scope containing
diff --git a/src/go/types/selection.go b/src/go/types/selection.go
index 09c304d..c79e13c 100644
--- a/src/go/types/selection.go
+++ b/src/go/types/selection.go
@@ -1,3 +1,5 @@
+// Code generated by "go test -run=Generate -write=all"; DO NOT EDIT.
+
 // Copyright 2013 The Go Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
diff --git a/src/go/types/self_test.go b/src/go/types/self_test.go
index a63f2b7..27fa756 100644
--- a/src/go/types/self_test.go
+++ b/src/go/types/self_test.go
@@ -104,7 +104,7 @@
 }
 
 func pkgFiles(fset *token.FileSet, path string) ([]*ast.File, error) {
-	filenames, err := pkgFilenames(path) // from stdlib_test.go
+	filenames, err := pkgFilenames(path, true) // from stdlib_test.go
 	if err != nil {
 		return nil, err
 	}
diff --git a/src/go/types/signature.go b/src/go/types/signature.go
index 83460ea..8285f1b 100644
--- a/src/go/types/signature.go
+++ b/src/go/types/signature.go
@@ -7,7 +7,6 @@
 import (
 	"fmt"
 	"go/ast"
-	"go/token"
 	. "internal/types/errors"
 )
 
@@ -159,7 +158,7 @@
 			} else if len(tparams) < len(recvTParams) {
 				// Reporting an error here is a stop-gap measure to avoid crashes in the
 				// compiler when a type parameter/argument cannot be inferred later. It
-				// may lead to follow-on errors (see issues #51339, #51343).
+				// may lead to follow-on errors (see issues go.dev/issue/51339, go.dev/issue/51343).
 				// TODO(gri) find a better solution
 				got := measure(len(tparams), "type parameter")
 				check.errorf(recvPar, BadRecv, "got %s, but receiver base type declares %d", got, len(recvTParams))
@@ -180,7 +179,7 @@
 	// Value (non-type) parameters' scope starts in the function body. Use a temporary scope for their
 	// declarations and then squash that scope into the parent scope (and report any redeclarations at
 	// that time).
-	scope := NewScope(check.scope, token.NoPos, token.NoPos, "function body (temp. scope)")
+	scope := NewScope(check.scope, nopos, nopos, "function body (temp. scope)")
 	recvList, _ := check.collectParams(scope, recvPar, false)
 	params, variadic := check.collectParams(scope, ftyp.Params, true)
 	results, _ := check.collectParams(scope, ftyp.Results, false)
@@ -197,7 +196,7 @@
 		switch len(recvList) {
 		case 0:
 			// error reported by resolver
-			recv = NewParam(token.NoPos, nil, "", Typ[Invalid]) // ignore recv below
+			recv = NewParam(nopos, nil, "", Typ[Invalid]) // ignore recv below
 		default:
 			// more than one receiver
 			check.error(recvList[len(recvList)-1], InvalidRecv, "method has multiple receivers")
@@ -208,7 +207,7 @@
 		sig.recv = recv
 
 		// Delay validation of receiver type as it may cause premature expansion
-		// of types the receiver type is dependent on (see issues #51232, #51233).
+		// of types the receiver type is dependent on (see issues go.dev/issue/51232, go.dev/issue/51233).
 		check.later(func() {
 			// spec: "The receiver type must be of the form T or *T where T is a type name."
 			rtyp, _ := deref(recv.typ)
diff --git a/src/go/types/sizeof_test.go b/src/go/types/sizeof_test.go
index d4ce0a7..9e5b5f8 100644
--- a/src/go/types/sizeof_test.go
+++ b/src/go/types/sizeof_test.go
@@ -46,7 +46,7 @@
 
 		// Misc
 		{Scope{}, 44, 88},
-		{Package{}, 40, 80},
+		{Package{}, 44, 88},
 		{_TypeSet{}, 28, 56},
 	}
 	for _, test := range tests {
diff --git a/src/go/types/sizes.go b/src/go/types/sizes.go
index cb5253b..2dcaebe 100644
--- a/src/go/types/sizes.go
+++ b/src/go/types/sizes.go
@@ -1,3 +1,5 @@
+// Code generated by "go test -run=Generate -write=all"; DO NOT EDIT.
+
 // Copyright 2013 The Go Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
@@ -10,14 +12,17 @@
 type Sizes interface {
 	// Alignof returns the alignment of a variable of type T.
 	// Alignof must implement the alignment guarantees required by the spec.
+	// The result must be >= 1.
 	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.
+	// A negative entry in the result indicates that the struct is too large.
 	Offsetsof(fields []*Var) []int64
 
 	// Sizeof returns the size of a variable of type T.
 	// Sizeof must implement the size guarantees required by the spec.
+	// A negative result indicates that T is too large.
 	Sizeof(T Type) int64
 }
 
@@ -44,7 +49,11 @@
 	MaxAlign int64 // maximum alignment in bytes - must be >= 1
 }
 
-func (s *StdSizes) Alignof(T Type) int64 {
+func (s *StdSizes) Alignof(T Type) (result int64) {
+	defer func() {
+		assert(result >= 1)
+	}()
+
 	// For arrays and structs, alignment is defined in terms
 	// of alignment of the elements and fields, respectively.
 	switch t := under(T).(type) {
@@ -53,7 +62,7 @@
 		// is the same as unsafe.Alignof(x[0]), but at least 1."
 		return s.Alignof(t.elem)
 	case *Struct:
-		if len(t.fields) == 0 && isSyncAtomicAlign64(T) {
+		if len(t.fields) == 0 && _IsSyncAtomicAlign64(T) {
 			// Special case: sync/atomic.align64 is an
 			// empty struct we recognize as a signal that
 			// the struct it contains must be
@@ -89,7 +98,7 @@
 	case *TypeParam, *Union:
 		unreachable()
 	}
-	a := s.Sizeof(T) // may be 0
+	a := s.Sizeof(T) // may be 0 or negative
 	// spec: "For a variable x of any type: unsafe.Alignof(x) is at least 1."
 	if a < 1 {
 		return 1
@@ -104,7 +113,7 @@
 	return a
 }
 
-func isSyncAtomicAlign64(T Type) bool {
+func _IsSyncAtomicAlign64(T Type) bool {
 	named, ok := T.(*Named)
 	if !ok {
 		return false
@@ -118,12 +127,22 @@
 
 func (s *StdSizes) Offsetsof(fields []*Var) []int64 {
 	offsets := make([]int64, len(fields))
-	var o int64
+	var offs int64
 	for i, f := range fields {
+		if offs < 0 {
+			// all remaining offsets are too large
+			offsets[i] = -1
+			continue
+		}
+		// offs >= 0
 		a := s.Alignof(f.typ)
-		o = align(o, a)
-		offsets[i] = o
-		o += s.Sizeof(f.typ)
+		offs = align(offs, a) // possibly < 0 if align overflows
+		offsets[i] = offs
+		if d := s.Sizeof(f.typ); d >= 0 && offs >= 0 {
+			offs += d // ok to overflow to < 0
+		} else {
+			offs = -1 // f.typ or offs is too large
+		}
 	}
 	return offsets
 }
@@ -163,9 +182,27 @@
 			return 0
 		}
 		// n > 0
+		esize := s.Sizeof(t.elem)
+		if esize < 0 {
+			return -1 // element too large
+		}
+		if esize == 0 {
+			return 0 // 0-size element
+		}
+		// esize > 0
 		a := s.Alignof(t.elem)
-		z := s.Sizeof(t.elem)
-		return align(z, a)*(n-1) + z
+		ea := align(esize, a) // possibly < 0 if align overflows
+		if ea < 0 {
+			return -1
+		}
+		// ea >= 1
+		n1 := n - 1 // n1 >= 0
+		// Final size is ea*n1 + esize; and size must be <= maxInt64.
+		const maxInt64 = 1<<63 - 1
+		if n1 > 0 && ea > maxInt64/n1 {
+			return -1 // ea*n1 overflows
+		}
+		return ea*n1 + esize // may still overflow to < 0 which is ok
 	case *Slice:
 		return s.WordSize * 3
 	case *Struct:
@@ -174,7 +211,12 @@
 			return 0
 		}
 		offsets := s.Offsetsof(t.fields)
-		return offsets[n-1] + s.Sizeof(t.fields[n-1].typ)
+		offs := offsets[n-1]
+		size := s.Sizeof(t.fields[n-1].typ)
+		if offs < 0 || size < 0 {
+			return -1 // type too large
+		}
+		return offs + size // may overflow to < 0 which is ok
 	case *Interface:
 		// Type parameters lead to variable sizes/alignments;
 		// StdSizes.Sizeof won't be called for them.
@@ -235,62 +277,69 @@
 var stdSizes = SizesFor("gc", "amd64")
 
 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")
+	f := stdSizes.Alignof
+	if conf.Sizes != nil {
+		f = conf.Sizes.Alignof
 	}
-	return stdSizes.Alignof(T)
+	if a := f(T); a >= 1 {
+		return a
+	}
+	panic("implementation of alignof returned an alignment < 1")
 }
 
 func (conf *Config) offsetsof(T *Struct) []int64 {
 	var offsets []int64
 	if 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)
+		f := stdSizes.Offsetsof
+		if conf.Sizes != nil {
+			f = conf.Sizes.Offsetsof
+		}
+		offsets = f(T.fields)
+		// sanity checks
+		if len(offsets) != T.NumFields() {
+			panic("implementation of offsetsof returned the wrong number of 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
+// the index sequence relative to T. All embedded fields
+// must be structs (rather than pointers to structs).
+// If the offset is too large (because T is too large),
+// the result is negative.
+func (conf *Config) offsetof(T Type, index []int) int64 {
+	var offs int64
 	for _, i := range index {
-		s := under(typ).(*Struct)
-		o += conf.offsetsof(s)[i]
-		typ = s.fields[i].typ
+		s := under(T).(*Struct)
+		d := conf.offsetsof(s)[i]
+		if d < 0 {
+			return -1
+		}
+		offs += d
+		if offs < 0 {
+			return -1
+		}
+		T = s.fields[i].typ
 	}
-	return o
+	return offs
 }
 
+// sizeof returns the size of T.
+// If T is too large, the result is negative.
 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")
+	f := stdSizes.Sizeof
+	if conf.Sizes != nil {
+		f = conf.Sizes.Sizeof
 	}
-	return stdSizes.Sizeof(T)
+	return f(T)
 }
 
 // align returns the smallest y >= x such that y % a == 0.
+// a must be within 1 and 8 and it must be a power of 2.
+// The result may be negative due to overflow.
 func align(x, a int64) int64 {
-	y := x + a - 1
-	return y - y%a
+	assert(x >= 0 && 1 <= a && a <= 8 && a&(a-1) == 0)
+	return (x + a - 1) &^ (a - 1)
 }
diff --git a/src/go/types/sizes_test.go b/src/go/types/sizes_test.go
index 09ac9e2..f2e7e8a 100644
--- a/src/go/types/sizes_test.go
+++ b/src/go/types/sizes_test.go
@@ -9,7 +9,6 @@
 import (
 	"go/ast"
 	"go/importer"
-	"go/token"
 	"go/types"
 	"internal/testenv"
 	"testing"
@@ -22,7 +21,7 @@
 
 func findStructTypeConfig(t *testing.T, src string, conf *types.Config) *types.Struct {
 	types_ := make(map[ast.Expr]types.TypeAndValue)
-	mustTypecheck("x", src, &types.Info{Types: types_})
+	mustTypecheck(src, nil, &types.Info{Types: types_})
 	for _, tv := range types_ {
 		if ts, ok := tv.Type.(*types.Struct); ok {
 			return ts
@@ -32,7 +31,7 @@
 	return nil
 }
 
-// Issue 16316
+// go.dev/issue/16316
 func TestMultipleSizeUse(t *testing.T) {
 	const src = `
 package main
@@ -55,7 +54,7 @@
 	}
 }
 
-// Issue 16464
+// go.dev/issue/16464
 func TestAlignofNaclSlice(t *testing.T) {
 	const src = `
 package main
@@ -86,24 +85,19 @@
 
 const _ = unsafe.Offsetof(struct{ x int64 }{}.x)
 `
-	fset := token.NewFileSet()
-	f := mustParse(fset, "x.go", src)
 	info := types.Info{Types: make(map[ast.Expr]types.TypeAndValue)}
 	conf := types.Config{
 		Importer: importer.Default(),
 		Sizes:    &types.StdSizes{WordSize: 8, MaxAlign: 8},
 	}
-	_, err := conf.Check("x", fset, []*ast.File{f}, &info)
-	if err != nil {
-		t.Fatal(err)
-	}
+	mustTypecheck(src, &conf, &info)
 	for _, tv := range info.Types {
 		_ = conf.Sizes.Sizeof(tv.Type)
 		_ = conf.Sizes.Alignof(tv.Type)
 	}
 }
 
-// Issue #53884.
+// go.dev/issue/53884.
 func TestAtomicAlign(t *testing.T) {
 	testenv.MustHaveGoBuild(t) // The Go command is needed for the importer to determine the locations of stdlib .a files.
 
diff --git a/src/go/types/slice.go b/src/go/types/slice.go
index debdd81..934549c 100644
--- a/src/go/types/slice.go
+++ b/src/go/types/slice.go
@@ -1,3 +1,5 @@
+// Code generated by "go test -run=Generate -write=all"; DO NOT EDIT.
+
 // Copyright 2011 The Go Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
@@ -15,5 +17,5 @@
 // Elem returns the element type of slice s.
 func (s *Slice) Elem() Type { return s.elem }
 
-func (t *Slice) Underlying() Type { return t }
-func (t *Slice) String() string   { return TypeString(t, nil) }
+func (s *Slice) Underlying() Type { return s }
+func (s *Slice) String() string   { return TypeString(s, nil) }
diff --git a/src/go/types/stdlib_test.go b/src/go/types/stdlib_test.go
index c0c9fcf..07c9222 100644
--- a/src/go/types/stdlib_test.go
+++ b/src/go/types/stdlib_test.go
@@ -8,6 +8,7 @@
 package types_test
 
 import (
+	"errors"
 	"fmt"
 	"go/ast"
 	"go/build"
@@ -18,7 +19,9 @@
 	"internal/testenv"
 	"os"
 	"path/filepath"
+	"runtime"
 	"strings"
+	"sync"
 	"testing"
 	"time"
 
@@ -36,17 +39,130 @@
 var stdLibImporter = importer.ForCompiler(token.NewFileSet(), "source", nil)
 
 func TestStdlib(t *testing.T) {
+	if testing.Short() {
+		t.Skip("skipping in short mode")
+	}
+
 	testenv.MustHaveGoBuild(t)
 
-	pkgCount := 0
-	duration := walkPkgDirs(filepath.Join(testenv.GOROOT(t), "src"), func(dir string, filenames []string) {
-		typecheckFiles(t, dir, filenames)
-		pkgCount++
+	// Collect non-test files.
+	dirFiles := make(map[string][]string)
+	root := filepath.Join(testenv.GOROOT(t), "src")
+	walkPkgDirs(root, func(dir string, filenames []string) {
+		dirFiles[dir] = filenames
 	}, t.Error)
 
-	if testing.Verbose() {
-		fmt.Println(pkgCount, "packages typechecked in", duration)
+	c := &stdlibChecker{
+		dirFiles: dirFiles,
+		pkgs:     make(map[string]*futurePackage),
 	}
+
+	start := time.Now()
+
+	// Though we read files while parsing, type-checking is otherwise CPU bound.
+	//
+	// This doesn't achieve great CPU utilization as many packages may block
+	// waiting for a common import, but in combination with the non-deterministic
+	// map iteration below this should provide decent coverage of concurrent
+	// type-checking (see golang/go#47729).
+	cpulimit := make(chan struct{}, runtime.GOMAXPROCS(0))
+	var wg sync.WaitGroup
+
+	for dir := range dirFiles {
+		dir := dir
+
+		cpulimit <- struct{}{}
+		wg.Add(1)
+		go func() {
+			defer func() {
+				wg.Done()
+				<-cpulimit
+			}()
+
+			_, err := c.getDirPackage(dir)
+			if err != nil {
+				t.Errorf("error checking %s: %v", dir, err)
+			}
+		}()
+	}
+
+	wg.Wait()
+
+	if testing.Verbose() {
+		fmt.Println(len(dirFiles), "packages typechecked in", time.Since(start))
+	}
+}
+
+// stdlibChecker implements concurrent type-checking of the packages defined by
+// dirFiles, which must define a closed set of packages (such as GOROOT/src).
+type stdlibChecker struct {
+	dirFiles map[string][]string // non-test files per directory; must be pre-populated
+
+	mu   sync.Mutex
+	pkgs map[string]*futurePackage // future cache of type-checking results
+}
+
+// A futurePackage is a future result of type-checking.
+type futurePackage struct {
+	done chan struct{} // guards pkg and err
+	pkg  *Package
+	err  error
+}
+
+func (c *stdlibChecker) Import(path string) (*Package, error) {
+	panic("unimplemented: use ImportFrom")
+}
+
+func (c *stdlibChecker) ImportFrom(path, dir string, _ ImportMode) (*Package, error) {
+	if path == "unsafe" {
+		// unsafe cannot be type checked normally.
+		return Unsafe, nil
+	}
+
+	p, err := build.Default.Import(path, dir, build.FindOnly)
+	if err != nil {
+		return nil, err
+	}
+
+	pkg, err := c.getDirPackage(p.Dir)
+	if pkg != nil {
+		// As long as pkg is non-nil, avoid redundant errors related to failed
+		// imports. TestStdlib will collect errors once for each package.
+		return pkg, nil
+	}
+	return nil, err
+}
+
+// getDirPackage gets the package defined in dir from the future cache.
+//
+// If this is the first goroutine requesting the package, getDirPackage
+// type-checks.
+func (c *stdlibChecker) getDirPackage(dir string) (*Package, error) {
+	c.mu.Lock()
+	fut, ok := c.pkgs[dir]
+	if !ok {
+		// First request for this package dir; type check.
+		fut = &futurePackage{
+			done: make(chan struct{}),
+		}
+		c.pkgs[dir] = fut
+		files, ok := c.dirFiles[dir]
+		c.mu.Unlock()
+		if !ok {
+			fut.err = fmt.Errorf("no files for %s", dir)
+		} else {
+			// Using dir as the package path here may be inconsistent with the behavior
+			// of a normal importer, but is sufficient as dir is by construction unique
+			// to this package.
+			fut.pkg, fut.err = typecheckFiles(dir, files, c)
+		}
+		close(fut.done)
+	} else {
+		// Otherwise, await the result.
+		c.mu.Unlock()
+		<-fut.done
+	}
+	return fut.pkg, fut.err
 }
 
 // firstComment returns the contents of the first non-empty comment in
@@ -93,6 +209,14 @@
 func testTestDir(t *testing.T, path string, ignore ...string) {
 	files, err := os.ReadDir(path)
 	if err != nil {
+		// cmd/distpack deletes GOROOT/test, so skip the test if it isn't present.
+		// cmd/distpack also requires GOROOT/VERSION to exist, so use that to
+		// suppress false-positive skips.
+		if _, err := os.Stat(filepath.Join(testenv.GOROOT(t), "test")); os.IsNotExist(err) {
+			if _, err := os.Stat(filepath.Join(testenv.GOROOT(t), "VERSION")); err == nil {
+				t.Skipf("skipping: GOROOT/test not present")
+			}
+		}
 		t.Fatal(err)
 	}
 
@@ -139,7 +263,10 @@
 		// parse and type-check file
 		file, err := parser.ParseFile(fset, filename, nil, 0)
 		if err == nil {
-			conf := Config{GoVersion: goVersion, Importer: stdLibImporter}
+			conf := Config{
+				GoVersion: goVersion,
+				Importer:  stdLibImporter,
+			}
 			_, err = conf.Check(filename, fset, []*ast.File{file}, nil)
 		}
 
@@ -192,7 +319,7 @@
 		"issue22200b.go", // go/types does not have constraints on stack size
 		"issue25507.go",  // go/types does not have constraints on stack size
 		"issue20780.go",  // go/types does not have constraints on stack size
-		"bug251.go",      // issue #34333 which was exposed with fix for #34151
+		"bug251.go",      // go.dev/issue/34333 which was exposed with fix for go.dev/issue/34151
 		"issue42058a.go", // go/types does not have constraints on channel element size
 		"issue42058b.go", // go/types does not have constraints on channel element size
 		"issue48097.go",  // go/types doesn't check validity of //go:xxx directives, and non-init bodyless function
@@ -224,51 +351,56 @@
 var excluded = map[string]bool{
 	"builtin": true,
 
-	// See #46027: some imports are missing for this submodule.
+	// See go.dev/issue/46027: some imports are missing for this submodule.
 	"crypto/internal/edwards25519/field/_asm": true,
 	"crypto/internal/bigmod/_asm":             true,
 }
 
+// printPackageMu synchronizes the printing of type-checked package files in
+// the typecheckFiles function.
+//
+// Without synchronization, package files may be interleaved during concurrent
+// type-checking.
+var printPackageMu sync.Mutex
+
 // typecheckFiles typechecks the given package files.
-func typecheckFiles(t *testing.T, path string, filenames []string) {
+func typecheckFiles(path string, filenames []string, importer Importer) (*Package, error) {
 	fset := token.NewFileSet()
 
-	// parse package files
+	// 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)
+			return nil, err
 		}
 
 		files = append(files, file)
 	}
 
-	// typecheck package files
+	if testing.Verbose() {
+		printPackageMu.Lock()
+		fmt.Println("package", files[0].Name.Name)
+		for _, filename := range filenames {
+			fmt.Println("\t", filename)
+		}
+		printPackageMu.Unlock()
+	}
+
+	// Typecheck package files.
+	var errs []error
 	conf := Config{
 		Error: func(err error) {
-			t.Helper()
-			t.Error(err)
+			errs = append(errs, err)
 		},
-		Importer: stdLibImporter,
+		Importer: importer,
 	}
 	info := Info{Uses: make(map[*ast.Ident]Object)}
-	conf.Check(path, fset, files, &info)
+	pkg, _ := conf.Check(path, fset, files, &info)
+	err := errors.Join(errs...)
+	if err != nil {
+		return pkg, err
+	}
 
 	// Perform checks of API invariants.
 
@@ -279,16 +411,18 @@
 		if predeclared == (obj.Pkg() != nil) {
 			posn := fset.Position(id.Pos())
 			if predeclared {
-				t.Errorf("%s: predeclared object with package: %s", posn, obj)
+				return nil, fmt.Errorf("%s: predeclared object with package: %s", posn, obj)
 			} else {
-				t.Errorf("%s: user-defined object without package: %s", posn, obj)
+				return nil, fmt.Errorf("%s: user-defined object without package: %s", posn, obj)
 			}
 		}
 	}
+
+	return pkg, nil
 }
 
 // pkgFilenames returns the list of package filenames for the given directory.
-func pkgFilenames(dir string) ([]string, error) {
+func pkgFilenames(dir string, includeTest bool) ([]string, error) {
 	ctxt := build.Default
 	ctxt.CgoEnabled = false
 	pkg, err := ctxt.ImportDir(dir, 0)
@@ -305,31 +439,25 @@
 	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))
+	if includeTest {
+		for _, name := range pkg.TestGoFiles {
+			filenames = append(filenames, filepath.Join(pkg.Dir, name))
+		}
 	}
 	return filenames, nil
 }
 
-func walkPkgDirs(dir string, pkgh func(dir string, filenames []string), errh func(args ...any)) time.Duration {
-	w := walker{time.Now(), 10 * time.Millisecond, pkgh, errh}
+func walkPkgDirs(dir string, pkgh func(dir string, filenames []string), errh func(args ...any)) {
+	w := walker{pkgh, errh}
 	w.walk(dir)
-	return time.Since(w.start)
 }
 
 type walker struct {
-	start time.Time
-	dmax  time.Duration
-	pkgh  func(dir string, filenames []string)
-	errh  func(args ...any)
+	pkgh func(dir string, filenames []string)
+	errh func(args ...any)
 }
 
 func (w *walker) walk(dir string) {
-	// limit run time for short tests
-	if testing.Short() && time.Since(w.start) >= w.dmax {
-		return
-	}
-
 	files, err := os.ReadDir(dir)
 	if err != nil {
 		w.errh(err)
@@ -337,7 +465,9 @@
 	}
 
 	// apply pkgh to the files in directory dir
-	pkgFiles, err := pkgFilenames(dir)
+
+	// Don't get test files as these packages are imported.
+	pkgFiles, err := pkgFilenames(dir, false)
 	if err != nil {
 		w.errh(err)
 		return
diff --git a/src/go/types/stmt.go b/src/go/types/stmt.go
index ac6255d..7869f37 100644
--- a/src/go/types/stmt.go
+++ b/src/go/types/stmt.go
@@ -19,7 +19,7 @@
 		panic("function body not ignored")
 	}
 
-	if trace {
+	if check.conf._Trace {
 		check.trace(body.Pos(), "-- %s: %s", name, sig)
 	}
 
@@ -65,7 +65,7 @@
 		}
 	}
 	sort.Slice(unused, func(i, j int) bool {
-		return unused[i].pos < unused[j].pos
+		return cmpPos(unused[i].pos, unused[j].pos) < 0
 	})
 	for _, v := range unused {
 		check.softErrorf(v, UnusedVar, "%s declared and not used", v.name)
@@ -173,7 +173,7 @@
 	var x operand
 	var msg string
 	var code Code
-	switch check.rawExpr(&x, call, nil, false) {
+	switch check.rawExpr(nil, &x, call, nil, false) {
 	case conversion:
 		msg = "requires function call, not conversion"
 		code = InvalidDefer
@@ -237,7 +237,7 @@
 L:
 	for _, e := range values {
 		var v operand
-		check.expr(&v, e)
+		check.expr(nil, &v, e)
 		if x.mode == invalid || v.mode == invalid {
 			continue L
 		}
@@ -288,7 +288,7 @@
 		// The spec allows the value nil instead of a type.
 		if check.isNil(e) {
 			T = nil
-			check.expr(&dummy, e) // run e through expr so we get the usual Info recordings
+			check.expr(nil, &dummy, e) // run e through expr so we get the usual Info recordings
 		} else {
 			T = check.varType(e)
 			if T == Typ[Invalid] {
@@ -327,7 +327,7 @@
 // 		// The spec allows the value nil instead of a type.
 // 		var hash string
 // 		if check.isNil(e) {
-// 			check.expr(&dummy, e) // run e through expr so we get the usual Info recordings
+// 			check.expr(nil, &dummy, e) // run e through expr so we get the usual Info recordings
 // 			T = nil
 // 			hash = "<nil>" // avoid collision with a type named nil
 // 		} else {
@@ -394,7 +394,7 @@
 		// 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, false)
+		kind := check.rawExpr(nil, &x, s.X, nil, false)
 		var msg string
 		var code Code
 		switch x.mode {
@@ -415,8 +415,8 @@
 
 	case *ast.SendStmt:
 		var ch, val operand
-		check.expr(&ch, s.Chan)
-		check.expr(&val, s.Value)
+		check.expr(nil, &ch, s.Chan)
+		check.expr(nil, &val, s.Value)
 		if ch.mode == invalid || val.mode == invalid {
 			return
 		}
@@ -449,7 +449,7 @@
 		}
 
 		var x operand
-		check.expr(&x, s.X)
+		check.expr(nil, &x, s.X)
 		if x.mode == invalid {
 			return
 		}
@@ -463,7 +463,7 @@
 		if x.mode == invalid {
 			return
 		}
-		check.assignVar(s.X, &x)
+		check.assignVar(s.X, nil, &x)
 
 	case *ast.AssignStmt:
 		switch s.Tok {
@@ -495,7 +495,7 @@
 			if x.mode == invalid {
 				return
 			}
-			check.assignVar(s.Lhs[0], &x)
+			check.assignVar(s.Lhs[0], nil, &x)
 		}
 
 	case *ast.GoStmt:
@@ -570,7 +570,7 @@
 
 		check.simpleStmt(s.Init)
 		var x operand
-		check.expr(&x, s.Cond)
+		check.expr(nil, &x, s.Cond)
 		if x.mode != invalid && !allBoolean(x.typ) {
 			check.error(s.Cond, InvalidCond, "non-boolean condition in if statement")
 		}
@@ -594,7 +594,7 @@
 		check.simpleStmt(s.Init)
 		var x operand
 		if s.Tag != nil {
-			check.expr(&x, s.Tag)
+			check.expr(nil, &x, s.Tag)
 			// By checking assignment of x to an invisible temporary
 			// (as a compiler would), we get all the relevant checks.
 			check.assignment(&x, nil, "switch expression")
@@ -686,7 +686,7 @@
 			return
 		}
 		var x operand
-		check.expr(&x, expr.X)
+		check.expr(nil, &x, expr.X)
 		if x.mode == invalid {
 			return
 		}
@@ -808,7 +808,7 @@
 		check.simpleStmt(s.Init)
 		if s.Cond != nil {
 			var x operand
-			check.expr(&x, s.Cond)
+			check.expr(nil, &x, s.Cond)
 			if x.mode != invalid && !allBoolean(x.typ) {
 				check.error(s.Cond, InvalidCond, "non-boolean condition in for statement")
 			}
@@ -830,7 +830,7 @@
 
 		// check expression to iterate over
 		var x operand
-		check.expr(&x, s.X)
+		check.expr(nil, &x, s.X)
 
 		// determine key/value types
 		var key, val Type
@@ -862,7 +862,7 @@
 		}
 
 		// Open the for-statement block scope now, after the range clause.
-		// Iteration variables declared with := need to go in this scope (was issue #51437).
+		// Iteration variables declared with := need to go in this scope (was go.dev/issue/51437).
 		check.openScope(s, "range")
 		defer check.closeScope()
 
@@ -928,7 +928,7 @@
 					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.assignVar(lhs, nil, &x)
 				}
 			}
 		}
diff --git a/src/go/types/struct.go b/src/go/types/struct.go
index 2ed0e6d..7247a25 100644
--- a/src/go/types/struct.go
+++ b/src/go/types/struct.go
@@ -102,7 +102,7 @@
 	// addInvalid adds an embedded field of invalid type to the struct for
 	// fields with errors; this keeps the number of struct fields in sync
 	// with the source as long as the fields are _ or have different names
-	// (issue #25627).
+	// (go.dev/issue/25627).
 	addInvalid := func(ident *ast.Ident, pos token.Pos) {
 		typ = Typ[Invalid]
 		tag = ""
@@ -122,7 +122,7 @@
 			// 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."
-			pos := f.Type.Pos()
+			pos := f.Type.Pos() // position of type, for errors
 			name := embeddedFieldIdent(f.Type)
 			if name == nil {
 				check.errorf(f.Type, InvalidSyntaxTree, "embedded field type %s has no name", f.Type)
@@ -131,7 +131,7 @@
 				addInvalid(name, pos)
 				continue
 			}
-			add(name, true, pos)
+			add(name, true, name.Pos()) // struct{p.T} field has position of T
 
 			// Because we have a name, typ must be of the form T or *T, where T is the name
 			// of a (named or alias) type, and t (= deref(typ)) must be the type of T.
diff --git a/src/go/types/subst.go b/src/go/types/subst.go
index 5a49c04..30c48e1 100644
--- a/src/go/types/subst.go
+++ b/src/go/types/subst.go
@@ -1,3 +1,5 @@
+// Code generated by "go test -run=Generate -write=all"; DO NOT EDIT.
+
 // Copyright 2018 The Go Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
@@ -46,9 +48,9 @@
 }
 
 // subst returns the type typ with its type parameters tpars replaced by the
-// corresponding type arguments targs, recursively. subst is pure in the sense
-// that it doesn't modify the incoming type. If a substitution took place, the
-// result type is different from the incoming type.
+// corresponding type arguments targs, recursively. subst doesn't modify the
+// incoming type. If a substitution took place, the result type is different
+// from the incoming type.
 //
 // If expanding is non-nil, it is the instance type currently being expanded.
 // One of expanding or ctxt must be non-nil.
@@ -144,7 +146,7 @@
 		if params != t.params || results != t.results {
 			return &Signature{
 				rparams: t.rparams,
-				// TODO(rFindley) why can't we nil out tparams here, rather than in instantiate?
+				// TODO(gri) why can't we nil out tparams here, rather than in instantiate?
 				tparams: t.tparams,
 				// instantiated signatures have a nil scope
 				recv:     recv,
@@ -203,13 +205,13 @@
 
 	case *Named:
 		// dump is for debugging
-		dump := func(string, ...any) {}
-		if subst.check != nil && trace {
+		dump := func(string, ...interface{}) {}
+		if subst.check != nil && subst.check.conf._Trace {
 			subst.check.indent++
 			defer func() {
 				subst.check.indent--
 			}()
-			dump = func(format string, args ...any) {
+			dump = func(format string, args ...interface{}) {
 				subst.check.trace(subst.pos, format, args...)
 			}
 		}
diff --git a/src/go/types/termlist.go b/src/go/types/termlist.go
index 83a02ee..9bc631c 100644
--- a/src/go/types/termlist.go
+++ b/src/go/types/termlist.go
@@ -1,3 +1,5 @@
+// Code generated by "go test -run=Generate -write=all"; DO NOT EDIT.
+
 // Copyright 2021 The Go Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
diff --git a/src/go/types/termlist_test.go b/src/go/types/termlist_test.go
index 0ff687e..cf0c190 100644
--- a/src/go/types/termlist_test.go
+++ b/src/go/types/termlist_test.go
@@ -1,3 +1,5 @@
+// Code generated by "go test -run=Generate -write=all"; DO NOT EDIT.
+
 // Copyright 2021 The Go Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
diff --git a/src/go/types/testdata/local/shifts.go b/src/go/types/testdata/local/shifts.go
index cf847d3..790daa3 100644
--- a/src/go/types/testdata/local/shifts.go
+++ b/src/go/types/testdata/local/shifts.go
@@ -4,10 +4,10 @@
 
 // The following shift tests are disabled in the shared
 // testdata/check/shifts.go file because they don't work
-// correctly with types2 at the moment. See issue #52080.
+// correctly with types2 at the moment. See go.dev/issue/52080.
 // Make sure we keep testing them with go/types.
 //
-// TODO(gri) Once #52080 is fixed, this file can be
+// TODO(gri) Once go.dev/issue/52080 is fixed, this file can be
 //           deleted in favor of the re-enabled tests
 //           in the shared file.
 
diff --git a/src/go/types/testdata/manual.go b/src/go/types/testdata/manual.go
index a7caee9..57dcc22 100644
--- a/src/go/types/testdata/manual.go
+++ b/src/go/types/testdata/manual.go
@@ -1,4 +1,4 @@
-// Copyright 2022 The Go Authors. All rights reserved.
+// Copyright 2023 The Go Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
@@ -6,4 +6,3 @@
 // without source arguments. Use for one-off debugging.
 
 package p
-
diff --git a/src/go/types/tuple.go b/src/go/types/tuple.go
index e85c5aa..e5e3914 100644
--- a/src/go/types/tuple.go
+++ b/src/go/types/tuple.go
@@ -1,3 +1,5 @@
+// Code generated by "go test -run=Generate -write=all"; DO NOT EDIT.
+
 // Copyright 2011 The Go Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
diff --git a/src/go/types/type.go b/src/go/types/type.go
index 1306375..f6bd759 100644
--- a/src/go/types/type.go
+++ b/src/go/types/type.go
@@ -13,112 +13,3 @@
 	// String returns a string representation of a type.
 	String() string
 }
-
-// under returns the true expanded underlying type.
-// If it doesn't exist, the result is Typ[Invalid].
-// under must only be called when a type is known
-// to be fully set up.
-func under(t Type) Type {
-	if t, _ := t.(*Named); t != nil {
-		return t.under()
-	}
-	return t.Underlying()
-}
-
-// If t is not a type parameter, coreType returns the underlying type.
-// If t is a type parameter, coreType returns the single underlying
-// type of all types in its type set if it exists, or nil otherwise. If the
-// type set contains only unrestricted and restricted channel types (with
-// identical element types), the single underlying type is the restricted
-// channel type if the restrictions are always the same, or nil otherwise.
-func coreType(t Type) Type {
-	tpar, _ := t.(*TypeParam)
-	if tpar == nil {
-		return under(t)
-	}
-
-	var su Type
-	if tpar.underIs(func(u Type) bool {
-		if u == nil {
-			return false
-		}
-		if su != nil {
-			u = match(su, u)
-			if u == nil {
-				return false
-			}
-		}
-		// su == nil || match(su, u) != nil
-		su = u
-		return true
-	}) {
-		return su
-	}
-	return nil
-}
-
-// coreString is like coreType but also considers []byte
-// and strings as identical. In this case, if successful and we saw
-// a string, the result is of type (possibly untyped) string.
-func coreString(t Type) Type {
-	tpar, _ := t.(*TypeParam)
-	if tpar == nil {
-		return under(t) // string or untyped string
-	}
-
-	var su Type
-	hasString := false
-	if tpar.underIs(func(u Type) bool {
-		if u == nil {
-			return false
-		}
-		if isString(u) {
-			u = NewSlice(universeByte)
-			hasString = true
-		}
-		if su != nil {
-			u = match(su, u)
-			if u == nil {
-				return false
-			}
-		}
-		// su == nil || match(su, u) != nil
-		su = u
-		return true
-	}) {
-		if hasString {
-			return Typ[String]
-		}
-		return su
-	}
-	return nil
-}
-
-// If x and y are identical, match returns x.
-// If x and y are identical channels but for their direction
-// and one of them is unrestricted, match returns the channel
-// with the restricted direction.
-// In all other cases, match returns nil.
-func match(x, y Type) Type {
-	// Common case: we don't have channels.
-	if Identical(x, y) {
-		return x
-	}
-
-	// We may have channels that differ in direction only.
-	if x, _ := x.(*Chan); x != nil {
-		if y, _ := y.(*Chan); y != nil && Identical(x.elem, y.elem) {
-			// We have channels that differ in direction only.
-			// If there's an unrestricted channel, select the restricted one.
-			switch {
-			case x.dir == SendRecv:
-				return y
-			case y.dir == SendRecv:
-				return x
-			}
-		}
-	}
-
-	// types are different
-	return nil
-}
diff --git a/src/go/types/typelists.go b/src/go/types/typelists.go
index 0f24135..c000de2 100644
--- a/src/go/types/typelists.go
+++ b/src/go/types/typelists.go
@@ -1,3 +1,5 @@
+// Code generated by "go test -run=Generate -write=all"; DO NOT EDIT.
+
 // Copyright 2021 The Go Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
diff --git a/src/go/types/typeparam.go b/src/go/types/typeparam.go
index 40d96ac..763fcc6 100644
--- a/src/go/types/typeparam.go
+++ b/src/go/types/typeparam.go
@@ -1,12 +1,12 @@
+// Code generated by "go test -run=Generate -write=all"; DO NOT EDIT.
+
 // Copyright 2011 The Go Authors. 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 (
-	"sync/atomic"
-)
+import "sync/atomic"
 
 // Note: This is a uint32 rather than a uint64 because the
 // respective 64 bit atomic instructions are not available
@@ -58,15 +58,15 @@
 	return typ
 }
 
+// Obj returns the type name for the type parameter t.
+func (t *TypeParam) Obj() *TypeName { return t.obj }
+
 // Index returns the index of the type param within its param list, or -1 if
 // the type parameter has not yet been bound to a type.
 func (t *TypeParam) Index() int {
 	return t.index
 }
 
-// Obj returns the type name for t.
-func (t *TypeParam) Obj() *TypeName { return t.obj }
-
 // Constraint returns the type constraint specified for t.
 func (t *TypeParam) Constraint() Type {
 	return t.bound
diff --git a/src/go/types/typeset.go b/src/go/types/typeset.go
index d68446d..206aa3d 100644
--- a/src/go/types/typeset.go
+++ b/src/go/types/typeset.go
@@ -5,7 +5,6 @@
 package types
 
 import (
-	"fmt"
 	"go/token"
 	. "internal/types/errors"
 	"sort"
@@ -170,7 +169,7 @@
 		return &topTypeSet
 	}
 
-	if check != nil && trace {
+	if check != nil && check.conf._Trace {
 		// Types don't generally have position information.
 		// If we don't have a valid pos provided, try to use
 		// one close enough.
@@ -208,7 +207,7 @@
 	// the method m in an interface that embeds interface I. On the other hand,
 	// if a method is embedded via multiple overlapping embedded interfaces, we
 	// don't provide a guarantee which "original m" got chosen for the embedding
-	// interface. See also issue #34421.
+	// interface. See also go.dev/issue/34421.
 	//
 	// If we don't care to provide this identity guarantee anymore, instead of
 	// reusing the original method in embeddings, we can clone the method's Func
@@ -216,7 +215,6 @@
 	// we can get rid of the mpos map below and simply use the cloned method's
 	// position.
 
-	var todo []*Func
 	var seen objset
 	var allMethods []*Func
 	mpos := make(map[*Func]token.Pos) // method specification or method embedding position, for good error messages
@@ -226,30 +224,24 @@
 			allMethods = append(allMethods, m)
 			mpos[m] = pos
 		case explicit:
-			if check == nil {
-				panic(fmt.Sprintf("%v: duplicate method %s", m.pos, m.name))
+			if check != nil {
+				check.errorf(atPos(pos), DuplicateDecl, "duplicate method %s", m.name)
+				check.errorf(atPos(mpos[other.(*Func)]), DuplicateDecl, "\tother declaration of %s", m.name) // secondary error, \t indented
 			}
-			// check != nil
-			check.errorf(atPos(pos), DuplicateDecl, "duplicate method %s", m.name)
-			check.errorf(atPos(mpos[other.(*Func)]), DuplicateDecl, "\tother declaration of %s", m.name) // secondary error, \t indented
 		default:
 			// We have a duplicate method name in an embedded (not explicitly declared) method.
-			// Check method signatures after all types are computed (issue #33656).
+			// Check method signatures after all types are computed (go.dev/issue/33656).
 			// If we're pre-go1.14 (overlapping embeddings are not permitted), report that
 			// error here as well (even though we could do it eagerly) because it's the same
 			// error message.
-			if check == nil {
-				// check method signatures after all locally embedded interfaces are computed
-				todo = append(todo, m, other.(*Func))
-				break
+			if check != nil {
+				check.later(func() {
+					if !check.allowVersion(m.pkg, atPos(pos), go1_14) || !Identical(m.typ, other.Type()) {
+						check.errorf(atPos(pos), DuplicateDecl, "duplicate method %s", m.name)
+						check.errorf(atPos(mpos[other.(*Func)]), DuplicateDecl, "\tother declaration of %s", m.name) // secondary error, \t indented
+					}
+				}).describef(atPos(pos), "duplicate method check for %s", m.name)
 			}
-			// check != nil
-			check.later(func() {
-				if !check.allowVersion(m.pkg, 1, 14) || !Identical(m.typ, other.Type()) {
-					check.errorf(atPos(pos), DuplicateDecl, "duplicate method %s", m.name)
-					check.errorf(atPos(mpos[other.(*Func)]), DuplicateDecl, "\tother declaration of %s", m.name) // secondary error, \t indented
-				}
-			}).describef(atPos(pos), "duplicate method check for %s", m.name)
 		}
 	}
 
@@ -276,8 +268,7 @@
 			assert(!isTypeParam(typ))
 			tset := computeInterfaceTypeSet(check, pos, u)
 			// If typ is local, an error was already reported where typ is specified/defined.
-			if check != nil && check.isImportedConstraint(typ) && !check.allowVersion(check.pkg, 1, 18) {
-				check.errorf(atPos(pos), UnsupportedFeature, "embedding constraint interface %s requires go1.18 or later", typ)
+			if check != nil && check.isImportedConstraint(typ) && !check.verifyVersionf(atPos(pos), go1_18, "embedding constraint interface %s", typ) {
 				continue
 			}
 			comparable = tset.comparable
@@ -286,8 +277,7 @@
 			}
 			terms = tset.terms
 		case *Union:
-			if check != nil && !check.allowVersion(check.pkg, 1, 18) {
-				check.errorf(atPos(pos), UnsupportedFeature, "embedding interface element %s requires go1.18 or later", u)
+			if check != nil && !check.verifyVersionf(atPos(pos), go1_18, "embedding interface element %s", u) {
 				continue
 			}
 			tset := computeUnionTypeSet(check, unionSets, pos, u)
@@ -301,8 +291,7 @@
 			if u == Typ[Invalid] {
 				continue
 			}
-			if check != nil && !check.allowVersion(check.pkg, 1, 18) {
-				check.errorf(atPos(pos), UnsupportedFeature, "embedding non-interface type %s requires go1.18 or later", typ)
+			if check != nil && !check.verifyVersionf(atPos(pos), go1_18, "embedding non-interface type %s", typ) {
 				continue
 			}
 			terms = termlist{{false, typ}}
@@ -315,15 +304,6 @@
 	}
 	ityp.embedPos = nil // not needed anymore (errors have been reported)
 
-	// process todo's (this only happens if check == nil)
-	for i := 0; i < len(todo); i += 2 {
-		m := todo[i]
-		other := todo[i+1]
-		if !Identical(m.typ, other.typ) {
-			panic(fmt.Sprintf("%v: duplicate method %s", m.pos, m.name))
-		}
-	}
-
 	ityp.tset.comparable = allComparable
 	if len(allMethods) != 0 {
 		sortMethods(allMethods)
@@ -381,7 +361,7 @@
 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) Less(i, j int) bool { return a[i].less(&a[j].object) }
 func (a byUniqueMethodName) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
 
 // invalidTypeSet is a singleton type set to signal an invalid type set
diff --git a/src/go/types/typestring.go b/src/go/types/typestring.go
index cfeb7eb..9615e24 100644
--- a/src/go/types/typestring.go
+++ b/src/go/types/typestring.go
@@ -161,7 +161,7 @@
 
 			// This doesn't do the right thing for embedded type
 			// aliases where we should print the alias name, not
-			// the aliased type (see issue #44410).
+			// the aliased type (see go.dev/issue/44410).
 			if !f.embedded {
 				w.string(f.name)
 				w.byte(' ')
@@ -318,6 +318,15 @@
 			if w.tpSubscripts || w.ctxt != nil {
 				w.string(subscript(t.id))
 			}
+			// If the type parameter name is the same as a predeclared object
+			// (say int), point out where it is declared to avoid confusing
+			// error messages. This doesn't need to be super-elegant; we just
+			// need a clear indication that this is not a predeclared name.
+			// Note: types2 prints position information here - we can't do
+			//       that because we don't have a token.FileSet accessible.
+			if w.ctxt == nil && Universe.Lookup(t.obj.name) != nil {
+				w.string("/* type parameter */")
+			}
 		}
 
 	default:
diff --git a/src/go/types/typestring_test.go b/src/go/types/typestring_test.go
index e73f241..45670b7 100644
--- a/src/go/types/typestring_test.go
+++ b/src/go/types/typestring_test.go
@@ -119,7 +119,7 @@
 
 	for _, test := range tests {
 		src := `package p; import "io"; type _ io.Writer; type T ` + test.src
-		pkg, err := typecheck(filename, src, nil)
+		pkg, err := typecheck(src, nil, nil)
 		if err != nil {
 			t.Errorf("%s: %s", src, err)
 			continue
@@ -137,8 +137,8 @@
 }
 
 func TestQualifiedTypeString(t *testing.T) {
-	p := mustTypecheck("p.go", "package p; type T int", nil)
-	q := mustTypecheck("q.go", "package q", nil)
+	p := mustTypecheck("package p; type T int", nil, nil)
+	q := mustTypecheck("package q", nil, nil)
 
 	pT := p.Scope().Lookup("T").Type()
 	for _, test := range []struct {
diff --git a/src/go/types/typeterm.go b/src/go/types/typeterm.go
index a7b8969..c86442c 100644
--- a/src/go/types/typeterm.go
+++ b/src/go/types/typeterm.go
@@ -1,3 +1,5 @@
+// Code generated by "go test -run=Generate -write=all"; DO NOT EDIT.
+
 // Copyright 2021 The Go Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
diff --git a/src/go/types/typeterm_test.go b/src/go/types/typeterm_test.go
index 24a1410..c6370f4 100644
--- a/src/go/types/typeterm_test.go
+++ b/src/go/types/typeterm_test.go
@@ -1,3 +1,5 @@
+// Code generated by "go test -run=Generate -write=all"; DO NOT EDIT.
+
 // Copyright 2021 The Go Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
@@ -5,13 +7,12 @@
 package types
 
 import (
-	"go/token"
 	"strings"
 	"testing"
 )
 
 var myInt = func() Type {
-	tname := NewTypeName(token.NoPos, nil, "myInt", nil)
+	tname := NewTypeName(nopos, nil, "myInt", nil)
 	return NewNamed(tname, Typ[Int], nil)
 }()
 
diff --git a/src/go/types/typexpr.go b/src/go/types/typexpr.go
index 03817dd..ca390ab 100644
--- a/src/go/types/typexpr.go
+++ b/src/go/types/typexpr.go
@@ -43,8 +43,7 @@
 		}
 		return
 	case universeAny, universeComparable:
-		if !check.allowVersion(check.pkg, 1, 18) {
-			check.versionErrorf(e, "go1.18", "predeclared %s", e.Name)
+		if !check.verifyVersionf(e, go1_18, "predeclared %s", e.Name) {
 			return // avoid follow-on errors
 		}
 	}
@@ -57,7 +56,7 @@
 	// a cycle which needs to be reported). Otherwise we can skip the
 	// call and avoid a possible cycle error in favor of the more
 	// informative "not a type/value" error that this function's caller
-	// will issue (see issue #25790).
+	// will issue (see go.dev/issue/25790).
 	typ := obj.Type()
 	if _, gotType := obj.(*TypeName); typ == nil || gotType && wantType {
 		check.objDecl(obj, def)
@@ -97,7 +96,7 @@
 
 	case *TypeName:
 		if check.isBrokenAlias(obj) {
-			check.errorf(e, InvalidDeclCycle, "invalid use of type alias %s in recursive type (see issue #50729)", obj.name)
+			check.errorf(e, InvalidDeclCycle, "invalid use of type alias %s in recursive type (see go.dev/issue/50729)", obj.name)
 			return
 		}
 		x.mode = typexpr
@@ -214,7 +213,7 @@
 // typInternal drives type checking of types.
 // Must only be called by definedType or genericType.
 func (check *Checker) typInternal(e0 ast.Expr, def *Named) (T Type) {
-	if trace {
+	if check.conf._Trace {
 		check.trace(e0.Pos(), "-- type %s", e0)
 		check.indent++
 		defer func() {
@@ -273,9 +272,7 @@
 
 	case *ast.IndexExpr, *ast.IndexListExpr:
 		ix := typeparams.UnpackIndexExpr(e)
-		if !check.allowVersion(check.pkg, 1, 18) {
-			check.softErrorf(inNode(e, ix.Lbrack), UnsupportedFeature, "type instantiation requires go1.18 or later")
-		}
+		check.verifyVersionf(inNode(e, ix.Lbrack), go1_18, "type instantiation")
 		return check.instantiatedType(ix, def)
 
 	case *ast.ParenExpr:
@@ -350,7 +347,7 @@
 		// function, map, or slice."
 		//
 		// Delay this check because it requires fully setup types;
-		// it is safe to continue in any case (was issue 6667).
+		// it is safe to continue in any case (was go.dev/issue/6667).
 		check.later(func() {
 			if !Comparable(typ.key) {
 				var why string
@@ -395,7 +392,7 @@
 }
 
 func (check *Checker) instantiatedType(ix *typeparams.IndexExpr, def *Named) (res Type) {
-	if trace {
+	if check.conf._Trace {
 		check.trace(ix.Pos(), "-- instantiating type %s with %s", ix.X, ix.Indices)
 		check.indent++
 		defer func() {
@@ -480,7 +477,7 @@
 	}
 
 	var x operand
-	check.expr(&x, e)
+	check.expr(nil, &x, e)
 	if x.mode != constant_ {
 		if x.mode != invalid {
 			check.errorf(&x, InvalidArrayLen, "array length %s must be constant", &x)
@@ -494,13 +491,17 @@
 				if n, ok := constant.Int64Val(val); ok && n >= 0 {
 					return n
 				}
-				check.errorf(&x, InvalidArrayLen, "invalid array length %s", &x)
-				return -1
 			}
 		}
 	}
 
-	check.errorf(&x, InvalidArrayLen, "array length %s must be integer", &x)
+	var msg string
+	if isInteger(x.typ) {
+		msg = "invalid array length %s"
+	} else {
+		msg = "array length %s must be integer"
+	}
+	check.errorf(&x, InvalidArrayLen, msg, &x)
 	return -1
 }
 
diff --git a/src/go/types/under.go b/src/go/types/under.go
new file mode 100644
index 0000000..f17d3bc
--- /dev/null
+++ b/src/go/types/under.go
@@ -0,0 +1,116 @@
+// Code generated by "go test -run=Generate -write=all"; DO NOT EDIT.
+
+// Copyright 2011 The Go Authors. 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
+
+// under returns the true expanded underlying type.
+// If it doesn't exist, the result is Typ[Invalid].
+// under must only be called when a type is known
+// to be fully set up.
+func under(t Type) Type {
+	if t, _ := t.(*Named); t != nil {
+		return t.under()
+	}
+	return t.Underlying()
+}
+
+// If t is not a type parameter, coreType returns the underlying type.
+// If t is a type parameter, coreType returns the single underlying
+// type of all types in its type set if it exists, or nil otherwise. If the
+// type set contains only unrestricted and restricted channel types (with
+// identical element types), the single underlying type is the restricted
+// channel type if the restrictions are always the same, or nil otherwise.
+func coreType(t Type) Type {
+	tpar, _ := t.(*TypeParam)
+	if tpar == nil {
+		return under(t)
+	}
+
+	var su Type
+	if tpar.underIs(func(u Type) bool {
+		if u == nil {
+			return false
+		}
+		if su != nil {
+			u = match(su, u)
+			if u == nil {
+				return false
+			}
+		}
+		// su == nil || match(su, u) != nil
+		su = u
+		return true
+	}) {
+		return su
+	}
+	return nil
+}
+
+// coreString is like coreType but also considers []byte
+// and strings as identical. In this case, if successful and we saw
+// a string, the result is of type (possibly untyped) string.
+func coreString(t Type) Type {
+	tpar, _ := t.(*TypeParam)
+	if tpar == nil {
+		return under(t) // string or untyped string
+	}
+
+	var su Type
+	hasString := false
+	if tpar.underIs(func(u Type) bool {
+		if u == nil {
+			return false
+		}
+		if isString(u) {
+			u = NewSlice(universeByte)
+			hasString = true
+		}
+		if su != nil {
+			u = match(su, u)
+			if u == nil {
+				return false
+			}
+		}
+		// su == nil || match(su, u) != nil
+		su = u
+		return true
+	}) {
+		if hasString {
+			return Typ[String]
+		}
+		return su
+	}
+	return nil
+}
+
+// If x and y are identical, match returns x.
+// If x and y are identical channels but for their direction
+// and one of them is unrestricted, match returns the channel
+// with the restricted direction.
+// In all other cases, match returns nil.
+func match(x, y Type) Type {
+	// Common case: we don't have channels.
+	if Identical(x, y) {
+		return x
+	}
+
+	// We may have channels that differ in direction only.
+	if x, _ := x.(*Chan); x != nil {
+		if y, _ := y.(*Chan); y != nil && Identical(x.elem, y.elem) {
+			// We have channels that differ in direction only.
+			// If there's an unrestricted channel, select the restricted one.
+			switch {
+			case x.dir == SendRecv:
+				return y
+			case y.dir == SendRecv:
+				return x
+			}
+		}
+	}
+
+	// types are different
+	return nil
+}
diff --git a/src/go/types/unify.go b/src/go/types/unify.go
index 602e304..6680d97 100644
--- a/src/go/types/unify.go
+++ b/src/go/types/unify.go
@@ -1,42 +1,49 @@
+// Code generated by "go test -run=Generate -write=all"; DO NOT EDIT.
+
 // Copyright 2020 The Go 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 unification.
+//
+// Type unification attempts to make two types x and y structurally
+// equivalent by determining the types for a given list of (bound)
+// type parameters which may occur within x and y. If x and y are
+// structurally different (say []T vs chan T), or conflicting
+// types are determined for type parameters, unification fails.
+// If unification succeeds, as a side-effect, the types of the
+// bound type parameters may be determined.
+//
+// Unification typically requires multiple calls u.unify(x, y) to
+// a given unifier u, with various combinations of types x and y.
+// In each call, additional type parameter types may be determined
+// as a side effect and recorded in u.
+// If a call fails (returns false), unification fails.
+//
+// In the unification context, structural equivalence of two types
+// ignores the difference between a defined type and its underlying
+// type if one type is a defined type and the other one is not.
+// It also ignores the difference between an (external, unbound)
+// type parameter and its core type.
+// If two types are not structurally equivalent, they cannot be Go
+// identical types. On the other hand, if they are structurally
+// equivalent, they may be Go identical or at least assignable, or
+// they may be in the type set of a constraint.
+// Whether they indeed are identical or assignable is determined
+// upon instantiation and function argument passing.
 
 package types
 
 import (
 	"bytes"
 	"fmt"
+	"sort"
 	"strings"
 )
 
-// The unifier maintains two separate sets of type parameters x and y
-// which are used to resolve type parameters in the x and y arguments
-// provided to the unify call. For unidirectional unification, only
-// one of these sets (say x) is provided, and then type parameters are
-// only resolved for the x argument passed to unify, not the y argument
-// (even if that also contains possibly the same type parameters). This
-// is crucial to infer the type parameters of self-recursive calls:
-//
-//	func f[P any](a P) { f(a) }
-//
-// For the call f(a) we want to infer that the type argument for P is P.
-// During unification, the parameter type P must be resolved to the type
-// parameter P ("x" side), but the argument type P must be left alone so
-// that unification resolves the type parameter P to P.
-//
-// For bidirectional unification, both sets are provided. This enables
-// unification to go from argument to parameter type and vice versa.
-// For constraint type inference, we use bidirectional unification
-// where both the x and y type parameters are identical. This is done
-// by setting up one of them (using init) and then assigning its value
-// to the other.
-
 const (
 	// Upper limit for recursion depth. Used to catch infinite recursions
-	// due to implementation issues (e.g., see issues #48619, #48656).
+	// due to implementation issues (e.g., see issues go.dev/issue/48619, go.dev/issue/48656).
 	unificationDepthLimit = 50
 
 	// Whether to panic when unificationDepthLimit is reached.
@@ -58,239 +65,241 @@
 	traceInference = false
 )
 
-// A unifier maintains the current type parameters for x and y
-// and the respective types inferred for each type parameter.
+// A unifier maintains a list of type parameters and
+// corresponding types inferred for each type parameter.
 // A unifier is created by calling newUnifier.
 type unifier struct {
-	exact bool
-	x, y  tparamsList // x and y must initialized via tparamsList.init
-	types []Type      // inferred types, shared by x and y
-	depth int         // recursion depth during unification
+	// handles maps each type parameter to its inferred type through
+	// an indirection *Type called (inferred type) "handle".
+	// Initially, each type parameter has its own, separate handle,
+	// with a nil (i.e., not yet inferred) type.
+	// After a type parameter P is unified with a type parameter Q,
+	// P and Q share the same handle (and thus type). This ensures
+	// that inferring the type for a given type parameter P will
+	// automatically infer the same type for all other parameters
+	// unified (joined) with P.
+	handles                  map[*TypeParam]*Type
+	depth                    int  // recursion depth during unification
+	enableInterfaceInference bool // use shared methods for better inference
 }
 
-// newUnifier returns a new unifier.
-// If exact is set, unification requires unified types to match
-// exactly. If exact is not set, a named type's underlying type
-// is considered if unification would fail otherwise, and the
-// direction of channels is ignored.
-// TODO(gri) exact is not set anymore by a caller. Consider removing it.
-func newUnifier(exact bool) *unifier {
-	u := &unifier{exact: exact}
-	u.x.unifier = u
-	u.y.unifier = u
-	return u
+// newUnifier returns a new unifier initialized with the given type parameter
+// and corresponding type argument lists. The type argument list may be shorter
+// than the type parameter list, and it may contain nil types. Matching type
+// parameters and arguments must have the same index.
+func newUnifier(tparams []*TypeParam, targs []Type, enableInterfaceInference bool) *unifier {
+	assert(len(tparams) >= len(targs))
+	handles := make(map[*TypeParam]*Type, len(tparams))
+	// Allocate all handles up-front: in a correct program, all type parameters
+	// must be resolved and thus eventually will get a handle.
+	// Also, sharing of handles caused by unified type parameters is rare and
+	// so it's ok to not optimize for that case (and delay handle allocation).
+	for i, x := range tparams {
+		var t Type
+		if i < len(targs) {
+			t = targs[i]
+		}
+		handles[x] = &t
+	}
+	return &unifier{handles, 0, enableInterfaceInference}
+}
+
+// unifyMode controls the behavior of the unifier.
+type unifyMode uint
+
+const (
+	// If assign is set, we are unifying types involved in an assignment:
+	// they may match inexactly at the top, but element types must match
+	// exactly.
+	assign unifyMode = 1 << iota
+
+	// If exact is set, types unify if they are identical (or can be
+	// made identical with suitable arguments for type parameters).
+	// Otherwise, a named type and a type literal unify if their
+	// underlying types unify, channel directions are ignored, and
+	// if there is an interface, the other type must implement the
+	// interface.
+	exact
+)
+
+func (m unifyMode) String() string {
+	switch m {
+	case 0:
+		return "inexact"
+	case assign:
+		return "assign"
+	case exact:
+		return "exact"
+	case assign | exact:
+		return "assign, exact"
+	}
+	return fmt.Sprintf("mode %d", m)
 }
 
 // unify attempts to unify x and y and reports whether it succeeded.
-func (u *unifier) unify(x, y Type) bool {
-	return u.nify(x, y, nil)
+// As a side-effect, types may be inferred for type parameters.
+// The mode parameter controls how types are compared.
+func (u *unifier) unify(x, y Type, mode unifyMode) bool {
+	return u.nify(x, y, mode, nil)
 }
 
 func (u *unifier) tracef(format string, args ...interface{}) {
 	fmt.Println(strings.Repeat(".  ", u.depth) + sprintf(nil, nil, true, format, args...))
 }
 
-// A tparamsList describes a list of type parameters and the types inferred for them.
-type tparamsList struct {
-	unifier *unifier
-	tparams []*TypeParam
-	// For each tparams element, there is a corresponding type slot index in indices.
-	// index  < 0: unifier.types[-index-1] == nil
-	// index == 0: no type slot allocated yet
-	// index  > 0: unifier.types[index-1] == typ
-	// Joined tparams elements share the same type slot and thus have the same index.
-	// By using a negative index for nil types we don't need to check unifier.types
-	// to see if we have a type or not.
-	indices []int // len(d.indices) == len(d.tparams)
-}
+// String returns a string representation of the current mapping
+// from type parameters to types.
+func (u *unifier) String() string {
+	// sort type parameters for reproducible strings
+	tparams := make(typeParamsById, len(u.handles))
+	i := 0
+	for tpar := range u.handles {
+		tparams[i] = tpar
+		i++
+	}
+	sort.Sort(tparams)
 
-// String returns a string representation for a tparamsList. For debugging.
-func (d *tparamsList) String() string {
 	var buf bytes.Buffer
 	w := newTypeWriter(&buf, nil)
 	w.byte('[')
-	for i, tpar := range d.tparams {
+	for i, x := range tparams {
 		if i > 0 {
 			w.string(", ")
 		}
-		w.typ(tpar)
+		w.typ(x)
 		w.string(": ")
-		w.typ(d.at(i))
+		w.typ(u.at(x))
 	}
 	w.byte(']')
 	return buf.String()
 }
 
-// init initializes d with the given type parameters.
-// The type parameters must be in the order in which they appear in their declaration
-// (this ensures that the tparams indices match the respective type parameter index).
-func (d *tparamsList) init(tparams []*TypeParam) {
-	if len(tparams) == 0 {
-		return
-	}
-	if debug {
-		for i, tpar := range tparams {
-			assert(i == tpar.index)
-		}
-	}
-	d.tparams = tparams
-	d.indices = make([]int, len(tparams))
-}
+type typeParamsById []*TypeParam
 
-// join unifies the i'th type parameter of x with the j'th type parameter of y.
-// If both type parameters already have a type associated with them and they are
-// not joined, join fails and returns false.
-func (u *unifier) join(i, j int) bool {
+func (s typeParamsById) Len() int           { return len(s) }
+func (s typeParamsById) Less(i, j int) bool { return s[i].id < s[j].id }
+func (s typeParamsById) Swap(i, j int)      { s[i], s[j] = s[j], s[i] }
+
+// join unifies the given type parameters x and y.
+// If both type parameters already have a type associated with them
+// and they are not joined, join fails and returns false.
+func (u *unifier) join(x, y *TypeParam) bool {
 	if traceInference {
-		u.tracef("%s ⇄ %s", u.x.tparams[i], u.y.tparams[j])
+		u.tracef("%s ⇄ %s", x, y)
 	}
-	ti := u.x.indices[i]
-	tj := u.y.indices[j]
-	switch {
-	case ti == 0 && tj == 0:
-		// Neither type parameter has a type slot associated with them.
-		// Allocate a new joined nil type slot (negative index).
-		u.types = append(u.types, nil)
-		u.x.indices[i] = -len(u.types)
-		u.y.indices[j] = -len(u.types)
-	case ti == 0:
-		// The type parameter for x has no type slot yet. Use slot of y.
-		u.x.indices[i] = tj
-	case tj == 0:
-		// The type parameter for y has no type slot yet. Use slot of x.
-		u.y.indices[j] = ti
-
-	// Both type parameters have a slot: ti != 0 && tj != 0.
-	case ti == tj:
-		// Both type parameters already share the same slot. Nothing to do.
-		break
-	case ti > 0 && tj > 0:
+	switch hx, hy := u.handles[x], u.handles[y]; {
+	case hx == hy:
+		// Both type parameters already share the same handle. Nothing to do.
+	case *hx != nil && *hy != nil:
 		// Both type parameters have (possibly different) inferred types. Cannot join.
-		// TODO(gri) Should we check if types are identical? Investigate.
 		return false
-	case ti > 0:
-		// Only the type parameter for x has an inferred type. Use x slot for y.
-		u.y.setIndex(j, ti)
-	// This case is handled like the default case.
-	// case tj > 0:
-	// 	// Only the type parameter for y has an inferred type. Use y slot for x.
-	// 	u.x.setIndex(i, tj)
+	case *hx != nil:
+		// Only type parameter x has an inferred type. Use handle of x.
+		u.setHandle(y, hx)
+	// This case is treated like the default case.
+	// case *hy != nil:
+	// 	// Only type parameter y has an inferred type. Use handle of y.
+	//	u.setHandle(x, hy)
 	default:
-		// Neither type parameter has an inferred type. Use y slot for x
-		// (or x slot for y, it doesn't matter).
-		u.x.setIndex(i, tj)
+		// Neither type parameter has an inferred type. Use handle of y.
+		u.setHandle(x, hy)
 	}
 	return true
 }
 
-// If typ is a type parameter of d, index returns the type parameter index.
-// Otherwise, the result is < 0.
-func (d *tparamsList) index(typ Type) int {
-	if tpar, ok := typ.(*TypeParam); ok {
-		return tparamIndex(d.tparams, tpar)
-	}
-	return -1
-}
-
-// If tpar is a type parameter in list, tparamIndex returns the type parameter index.
-// Otherwise, the result is < 0. tpar must not be nil.
-func tparamIndex(list []*TypeParam, tpar *TypeParam) int {
-	// Once a type parameter is bound its index is >= 0. However, there are some
-	// code paths (namely tracing and type hashing) by which it is possible to
-	// arrive here with a type parameter that has not been bound, hence the check
-	// for 0 <= i below.
-	// TODO(rfindley): investigate a better approach for guarding against using
-	// unbound type parameters.
-	if i := tpar.index; 0 <= i && i < len(list) && list[i] == tpar {
-		return i
-	}
-	return -1
-}
-
-// setIndex sets the type slot index for the i'th type parameter
-// (and all its joined parameters) to tj. The type parameter
-// must have a (possibly nil) type slot associated with it.
-func (d *tparamsList) setIndex(i, tj int) {
-	ti := d.indices[i]
-	assert(ti != 0 && tj != 0)
-	for k, tk := range d.indices {
-		if tk == ti {
-			d.indices[k] = tj
+// asTypeParam returns x.(*TypeParam) if x is a type parameter recorded with u.
+// Otherwise, the result is nil.
+func (u *unifier) asTypeParam(x Type) *TypeParam {
+	if x, _ := x.(*TypeParam); x != nil {
+		if _, found := u.handles[x]; found {
+			return x
 		}
 	}
-}
-
-// at returns the type set for the i'th type parameter; or nil.
-func (d *tparamsList) at(i int) Type {
-	if ti := d.indices[i]; ti > 0 {
-		return d.unifier.types[ti-1]
-	}
 	return nil
 }
 
-// set sets the type typ for the i'th type parameter;
-// typ must not be nil and it must not have been set before.
-func (d *tparamsList) set(i int, typ Type) {
-	assert(typ != nil)
-	u := d.unifier
-	if traceInference {
-		u.tracef("%s ➞ %s", d.tparams[i], typ)
-	}
-	switch ti := d.indices[i]; {
-	case ti < 0:
-		u.types[-ti-1] = typ
-		d.setIndex(i, -ti)
-	case ti == 0:
-		u.types = append(u.types, typ)
-		d.indices[i] = len(u.types)
-	default:
-		panic("type already set")
+// setHandle sets the handle for type parameter x
+// (and all its joined type parameters) to h.
+func (u *unifier) setHandle(x *TypeParam, h *Type) {
+	hx := u.handles[x]
+	assert(hx != nil)
+	for y, hy := range u.handles {
+		if hy == hx {
+			u.handles[y] = h
+		}
 	}
 }
 
+// at returns the (possibly nil) type for type parameter x.
+func (u *unifier) at(x *TypeParam) Type {
+	return *u.handles[x]
+}
+
+// set sets the type t for type parameter x;
+// t must not be nil.
+func (u *unifier) set(x *TypeParam, t Type) {
+	assert(t != nil)
+	if traceInference {
+		u.tracef("%s ➞ %s", x, t)
+	}
+	*u.handles[x] = t
+}
+
 // unknowns returns the number of type parameters for which no type has been set yet.
-func (d *tparamsList) unknowns() int {
+func (u *unifier) unknowns() int {
 	n := 0
-	for _, ti := range d.indices {
-		if ti <= 0 {
+	for _, h := range u.handles {
+		if *h == nil {
 			n++
 		}
 	}
 	return n
 }
 
-// types returns the list of inferred types (via unification) for the type parameters
-// described by d, and an index. If all types were inferred, the returned index is < 0.
-// Otherwise, it is the index of the first type parameter which couldn't be inferred;
-// i.e., for which list[index] is nil.
-func (d *tparamsList) types() (list []Type, index int) {
-	list = make([]Type, len(d.tparams))
-	index = -1
-	for i := range d.tparams {
-		t := d.at(i)
-		list[i] = t
-		if index < 0 && t == nil {
-			index = i
-		}
+// inferred returns the list of inferred types for the given type parameter list.
+// The result is never nil and has the same length as tparams; result types that
+// could not be inferred are nil. Corresponding type parameters and result types
+// have identical indices.
+func (u *unifier) inferred(tparams []*TypeParam) []Type {
+	list := make([]Type, len(tparams))
+	for i, x := range tparams {
+		list[i] = u.at(x)
 	}
-	return
+	return list
 }
 
-func (u *unifier) nifyEq(x, y Type, p *ifacePair) bool {
-	return x == y || u.nify(x, y, p)
+// asInterface returns the underlying type of x as an interface if
+// it is a non-type parameter interface. Otherwise it returns nil.
+func asInterface(x Type) (i *Interface) {
+	if _, ok := x.(*TypeParam); !ok {
+		i, _ = under(x).(*Interface)
+	}
+	return i
 }
 
 // nify implements the core unification algorithm which is an
 // adapted version of Checker.identical. For changes to that
 // code the corresponding changes should be made here.
 // Must not be called directly from outside the unifier.
-func (u *unifier) nify(x, y Type, p *ifacePair) (result bool) {
+func (u *unifier) nify(x, y Type, mode unifyMode, p *ifacePair) (result bool) {
+	u.depth++
 	if traceInference {
-		u.tracef("%s ≡ %s", x, y)
+		u.tracef("%s ≡ %s\t// %s", x, y, mode)
+	}
+	defer func() {
+		if traceInference && !result {
+			u.tracef("%s ≢ %s", x, y)
+		}
+		u.depth--
+	}()
+
+	// nothing to do if x == y
+	if x == y {
+		return true
 	}
 
 	// Stop gap for cases where unification fails.
-	if u.depth >= unificationDepthLimit {
+	if u.depth > unificationDepthLimit {
 		if traceInference {
 			u.tracef("depth %d >= %d", u.depth, unificationDepthLimit)
 		}
@@ -299,99 +308,269 @@
 		}
 		return false
 	}
-	u.depth++
-	defer func() {
-		u.depth--
-		if traceInference && !result {
-			u.tracef("%s ≢ %s", x, y)
-		}
-	}()
 
-	if !u.exact {
-		// If exact unification is known to fail because we attempt to
-		// match a type name against an unnamed type literal, consider
-		// the underlying type of the named type.
-		// (We use !hasName to exclude any type with a name, including
-		// basic types and type parameters; the rest are unamed types.)
-		if nx, _ := x.(*Named); nx != nil && !hasName(y) {
-			if traceInference {
-				u.tracef("under %s ≡ %s", nx, y)
-			}
-			return u.nify(nx.under(), y, p)
-		} else if ny, _ := y.(*Named); ny != nil && !hasName(x) {
-			if traceInference {
-				u.tracef("%s ≡ under %s", x, ny)
-			}
-			return u.nify(x, ny.under(), p)
+	// Unification is symmetric, so we can swap the operands.
+	// Ensure that if we have at least one
+	// - defined type, make sure one is in y
+	// - type parameter recorded with u, make sure one is in x
+	if _, ok := x.(*Named); ok || u.asTypeParam(y) != nil {
+		if traceInference {
+			u.tracef("%s ≡ %s\t// swap", y, x)
+		}
+		x, y = y, x
+	}
+
+	// Unification will fail if we match a defined type against a type literal.
+	// If we are matching types in an assignment, at the top-level, types with
+	// the same type structure are permitted as long as at least one of them
+	// is not a defined type. To accommodate for that possibility, we continue
+	// unification with the underlying type of a defined type if the other type
+	// is a type literal. This is controlled by the exact unification mode.
+	// We also continue if the other type is a basic type because basic types
+	// are valid underlying types and may appear as core types of type constraints.
+	// If we exclude them, inferred defined types for type parameters may not
+	// match against the core types of their constraints (even though they might
+	// correctly match against some of the types in the constraint's type set).
+	// Finally, if unification (incorrectly) succeeds by matching the underlying
+	// type of a defined type against a basic type (because we include basic types
+	// as type literals here), and if that leads to an incorrectly inferred type,
+	// we will fail at function instantiation or argument assignment time.
+	//
+	// If we have at least one defined type, there is one in y.
+	if ny, _ := y.(*Named); mode&exact == 0 && ny != nil && isTypeLit(x) && !(u.enableInterfaceInference && IsInterface(x)) {
+		if traceInference {
+			u.tracef("%s ≡ under %s", x, ny)
+		}
+		y = ny.under()
+		// Per the spec, a defined type cannot have an underlying type
+		// that is a type parameter.
+		assert(!isTypeParam(y))
+		// x and y may be identical now
+		if x == y {
+			return true
 		}
 	}
 
-	// Cases where at least one of x or y is a type parameter.
-	switch i, j := u.x.index(x), u.y.index(y); {
-	case i >= 0 && j >= 0:
+	// Cases where at least one of x or y is a type parameter recorded with u.
+	// If we have at least one type parameter, there is one in x.
+	// If we have exactly one type parameter, because it is in x,
+	// isTypeLit(x) is false and y was not changed above. In other
+	// words, if y was a defined type, it is still a defined type
+	// (relevant for the logic below).
+	switch px, py := u.asTypeParam(x), u.asTypeParam(y); {
+	case px != nil && py != nil:
 		// both x and y are type parameters
-		if u.join(i, j) {
+		if u.join(px, py) {
 			return true
 		}
 		// both x and y have an inferred type - they must match
-		return u.nifyEq(u.x.at(i), u.y.at(j), p)
+		return u.nify(u.at(px), u.at(py), mode, p)
 
-	case i >= 0:
+	case px != nil:
 		// x is a type parameter, y is not
-		if tx := u.x.at(i); tx != nil {
-			return u.nifyEq(tx, y, p)
+		if x := u.at(px); x != nil {
+			// x has an inferred type which must match y
+			if u.nify(x, y, mode, p) {
+				// We have a match, possibly through underlying types.
+				xi := asInterface(x)
+				yi := asInterface(y)
+				_, xn := x.(*Named)
+				_, yn := y.(*Named)
+				// If we have two interfaces, what to do depends on
+				// whether they are named and their method sets.
+				if xi != nil && yi != nil {
+					// Both types are interfaces.
+					// If both types are defined types, they must be identical
+					// because unification doesn't know which type has the "right" name.
+					if xn && yn {
+						return Identical(x, y)
+					}
+					// In all other cases, the method sets must match.
+					// The types unified so we know that corresponding methods
+					// match and we can simply compare the number of methods.
+					// TODO(gri) We may be able to relax this rule and select
+					// the more general interface. But if one of them is a defined
+					// type, it's not clear how to choose and whether we introduce
+					// an order dependency or not. Requiring the same method set
+					// is conservative.
+					if len(xi.typeSet().methods) != len(yi.typeSet().methods) {
+						return false
+					}
+				} else if xi != nil || yi != nil {
+					// One but not both of them are interfaces.
+					// In this case, either x or y could be viable matches for the corresponding
+					// type parameter, which means choosing either introduces an order dependence.
+					// Therefore, we must fail unification (go.dev/issue/60933).
+					return false
+				}
+				// If we have inexact unification and one of x or y is a defined type, select the
+				// defined type. This ensures that in a series of types, all matching against the
+				// same type parameter, we infer a defined type if there is one, independent of
+				// order. Type inference or assignment may fail, which is ok.
+				// Selecting a defined type, if any, ensures that we don't lose the type name;
+				// and since we have inexact unification, a value of equally named or matching
+				// undefined type remains assignable (go.dev/issue/43056).
+				//
+				// Similarly, if we have inexact unification and there are no defined types but
+				// channel types, select a directed channel, if any. This ensures that in a series
+				// of unnamed types, all matching against the same type parameter, we infer the
+				// directed channel if there is one, independent of order.
+				// Selecting a directional channel, if any, ensures that a value of another
+				// inexactly unifying channel type remains assignable (go.dev/issue/62157).
+				//
+				// If we have multiple defined channel types, they are either identical or we
+				// have assignment conflicts, so we can ignore directionality in this case.
+				//
+				// If we have defined and literal channel types, a defined type wins to avoid
+				// order dependencies.
+				if mode&exact == 0 {
+					switch {
+					case xn:
+						// x is a defined type: nothing to do.
+					case yn:
+						// x is not a defined type and y is a defined type: select y.
+						u.set(px, y)
+					default:
+						// Neither x nor y are defined types.
+						if yc, _ := under(y).(*Chan); yc != nil && yc.dir != SendRecv {
+							// y is a directed channel type: select y.
+							u.set(px, y)
+						}
+					}
+				}
+				return true
+			}
+			return false
 		}
 		// otherwise, infer type from y
-		u.x.set(i, y)
-		return true
-
-	case j >= 0:
-		// y is a type parameter, x is not
-		if ty := u.y.at(j); ty != nil {
-			return u.nifyEq(x, ty, p)
-		}
-		// otherwise, infer type from x
-		u.y.set(j, x)
+		u.set(px, y)
 		return true
 	}
 
-	// If we get here and x or y is a type parameter, they are type parameters
-	// from outside our declaration list. Try to unify their core types, if any
-	// (see issue #50755 for a test case).
-	if enableCoreTypeUnification && !u.exact {
-		if isTypeParam(x) && !hasName(y) {
-			// When considering the type parameter for unification
-			// we look at the adjusted core term (adjusted core type
-			// with tilde information).
-			// If the adjusted core type is a named type N; the
-			// corresponding core type is under(N). Since !u.exact
-			// and y doesn't have a name, unification will end up
-			// comparing under(N) to y, so we can just use the core
-			// type instead. And we can ignore the tilde because we
-			// already look at the underlying types on both sides
-			// and we have known types on both sides.
-			// Optimization.
-			if cx := coreType(x); cx != nil {
-				if traceInference {
-					u.tracef("core %s ≡ %s", x, y)
-				}
-				return u.nify(cx, y, p)
+	// x != y if we get here
+	assert(x != y)
+
+	// Type elements (array, slice, etc. elements) use emode for unification.
+	// Element types must match exactly if the types are used in an assignment.
+	emode := mode
+	if mode&assign != 0 {
+		emode |= exact
+	}
+
+	// If u.EnableInterfaceInference is set and we don't require exact unification,
+	// if both types are interfaces, one interface must have a subset of the
+	// methods of the other and corresponding method signatures must unify.
+	// If only one type is an interface, all its methods must be present in the
+	// other type and corresponding method signatures must unify.
+	if u.enableInterfaceInference && mode&exact == 0 {
+		// One or both interfaces may be defined types.
+		// Look under the name, but not under type parameters (go.dev/issue/60564).
+		xi := asInterface(x)
+		yi := asInterface(y)
+		// If we have two interfaces, check the type terms for equivalence,
+		// and unify common methods if possible.
+		if xi != nil && yi != nil {
+			xset := xi.typeSet()
+			yset := yi.typeSet()
+			if xset.comparable != yset.comparable {
+				return false
 			}
-		} else if isTypeParam(y) && !hasName(x) {
-			// see comment above
-			if cy := coreType(y); cy != nil {
-				if traceInference {
-					u.tracef("%s ≡ core %s", x, y)
-				}
-				return u.nify(x, cy, p)
+			// For now we require terms to be equal.
+			// We should be able to relax this as well, eventually.
+			if !xset.terms.equal(yset.terms) {
+				return false
 			}
+			// 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{xi, yi, p}
+			for p != nil {
+				if p.identical(q) {
+					return true // same pair was compared before
+				}
+				p = p.prev
+			}
+			// The method set of x must be a subset of the method set
+			// of y or vice versa, and the common methods must unify.
+			xmethods := xset.methods
+			ymethods := yset.methods
+			// The smaller method set must be the subset, if it exists.
+			if len(xmethods) > len(ymethods) {
+				xmethods, ymethods = ymethods, xmethods
+			}
+			// len(xmethods) <= len(ymethods)
+			// Collect the ymethods in a map for quick lookup.
+			ymap := make(map[string]*Func, len(ymethods))
+			for _, ym := range ymethods {
+				ymap[ym.Id()] = ym
+			}
+			// All xmethods must exist in ymethods and corresponding signatures must unify.
+			for _, xm := range xmethods {
+				if ym := ymap[xm.Id()]; ym == nil || !u.nify(xm.typ, ym.typ, exact, p) {
+					return false
+				}
+			}
+			return true
+		}
+
+		// We don't have two interfaces. If we have one, make sure it's in xi.
+		if yi != nil {
+			xi = yi
+			y = x
+		}
+
+		// If we have one interface, at a minimum each of the interface methods
+		// must be implemented and thus unify with a corresponding method from
+		// the non-interface type, otherwise unification fails.
+		if xi != nil {
+			// All xi methods must exist in y and corresponding signatures must unify.
+			xmethods := xi.typeSet().methods
+			for _, xm := range xmethods {
+				obj, _, _ := LookupFieldOrMethod(y, false, xm.pkg, xm.name)
+				if ym, _ := obj.(*Func); ym == nil || !u.nify(xm.typ, ym.typ, exact, p) {
+					return false
+				}
+			}
+			return true
 		}
 	}
 
-	// For type unification, do not shortcut (x == y) for identical
-	// types. Instead keep comparing them element-wise to unify the
-	// matching (and equal type parameter types). A simple test case
-	// where this matters is: func f[P any](a P) { f(a) } .
+	// Unless we have exact unification, neither x nor y are interfaces now.
+	// Except for unbound type parameters (see below), x and y must be structurally
+	// equivalent to unify.
+
+	// If we get here and x or y is a type parameter, they are unbound
+	// (not recorded with the unifier).
+	// Ensure that if we have at least one type parameter, it is in x
+	// (the earlier swap checks for _recorded_ type parameters only).
+	// This ensures that the switch switches on the type parameter.
+	//
+	// TODO(gri) Factor out type parameter handling from the switch.
+	if isTypeParam(y) {
+		if traceInference {
+			u.tracef("%s ≡ %s\t// swap", y, x)
+		}
+		x, y = y, x
+	}
 
 	switch x := x.(type) {
 	case *Basic:
@@ -403,24 +582,24 @@
 		}
 
 	case *Array:
-		// Two array types are identical if they have identical element types
-		// and the same array length.
+		// Two array types unify if they have the same array length
+		// and their element types unify.
 		if y, ok := y.(*Array); ok {
 			// If one or both array lengths are unknown (< 0) due to some error,
 			// assume they are the same to avoid spurious follow-on errors.
-			return (x.len < 0 || y.len < 0 || x.len == y.len) && u.nify(x.elem, y.elem, p)
+			return (x.len < 0 || y.len < 0 || x.len == y.len) && u.nify(x.elem, y.elem, emode, p)
 		}
 
 	case *Slice:
-		// Two slice types are identical if they have identical element types.
+		// Two slice types unify if their element types unify.
 		if y, ok := y.(*Slice); ok {
-			return u.nify(x.elem, y.elem, p)
+			return u.nify(x.elem, y.elem, emode, 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 embedded fields are considered to have the same
+		// Two struct types unify if they have the same sequence of fields,
+		// and if corresponding fields have the same names, their (field) types unify,
+		// and they have identical tags. Two embedded 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() {
@@ -429,7 +608,7 @@
 					if f.embedded != g.embedded ||
 						x.Tag(i) != y.Tag(i) ||
 						!f.sameId(g.pkg, g.name) ||
-						!u.nify(f.typ, g.typ, p) {
+						!u.nify(f.typ, g.typ, emode, p) {
 						return false
 					}
 				}
@@ -438,20 +617,20 @@
 		}
 
 	case *Pointer:
-		// Two pointer types are identical if they have identical base types.
+		// Two pointer types unify if their base types unify.
 		if y, ok := y.(*Pointer); ok {
-			return u.nify(x.base, y.base, p)
+			return u.nify(x.base, y.base, emode, p)
 		}
 
 	case *Tuple:
-		// Two tuples types are identical if they have the same number of elements
-		// and corresponding elements have identical types.
+		// Two tuples types unify if they have the same number of elements
+		// and the types of corresponding elements unify.
 		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 !u.nify(v.typ, w.typ, p) {
+						if !u.nify(v.typ, w.typ, mode, p) {
 							return false
 						}
 					}
@@ -461,21 +640,24 @@
 		}
 
 	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.
+		// Two function types unify if they have the same number of parameters
+		// and result values, corresponding parameter and result types unify,
+		// and either both functions are variadic or neither is.
+		// Parameter and result names are not required to match.
 		// TODO(gri) handle type parameters or document why we can ignore them.
 		if y, ok := y.(*Signature); ok {
 			return x.variadic == y.variadic &&
-				u.nify(x.params, y.params, p) &&
-				u.nify(x.results, y.results, p)
+				u.nify(x.params, y.params, emode, p) &&
+				u.nify(x.results, y.results, emode, 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.
+		assert(!u.enableInterfaceInference || mode&exact != 0) // handled before this switch
+
+		// Two interface types unify if they have the same set of methods with
+		// the same names, and corresponding function types unify.
+		// Lower-case method names from different packages are always different.
+		// The order of the methods is irrelevant.
 		if y, ok := y.(*Interface); ok {
 			xset := x.typeSet()
 			yset := y.typeSet()
@@ -523,7 +705,7 @@
 				}
 				for i, f := range a {
 					g := b[i]
-					if f.Id() != g.Id() || !u.nify(f.typ, g.typ, q) {
+					if f.Id() != g.Id() || !u.nify(f.typ, g.typ, exact, q) {
 						return false
 					}
 				}
@@ -532,51 +714,81 @@
 		}
 
 	case *Map:
-		// Two map types are identical if they have identical key and value types.
+		// Two map types unify if their key and value types unify.
 		if y, ok := y.(*Map); ok {
-			return u.nify(x.key, y.key, p) && u.nify(x.elem, y.elem, p)
+			return u.nify(x.key, y.key, emode, p) && u.nify(x.elem, y.elem, emode, p)
 		}
 
 	case *Chan:
-		// Two channel types are identical if they have identical value types.
+		// Two channel types unify if their value types unify
+		// and if they have the same direction.
+		// The channel direction is ignored for inexact unification.
 		if y, ok := y.(*Chan); ok {
-			return (!u.exact || x.dir == y.dir) && u.nify(x.elem, y.elem, p)
+			return (mode&exact == 0 || x.dir == y.dir) && u.nify(x.elem, y.elem, emode, p)
 		}
 
 	case *Named:
-		// TODO(gri) This code differs now from the parallel code in Checker.identical. Investigate.
+		// Two named types unify if their type names originate in the same type declaration.
+		// If they are instantiated, their type argument lists must unify.
 		if y, ok := y.(*Named); ok {
+			// Check type arguments before origins so they unify
+			// even if the origins don't match; for better error
+			// messages (see go.dev/issue/53692).
 			xargs := x.TypeArgs().list()
 			yargs := y.TypeArgs().list()
-
 			if len(xargs) != len(yargs) {
 				return false
 			}
-
-			// TODO(gri) This is not always correct: two types may have the same names
-			//           in the same package if one of them is nested in a function.
-			//           Extremely unlikely but we need an always correct solution.
-			if x.obj.pkg == y.obj.pkg && x.obj.name == y.obj.name {
-				for i, x := range xargs {
-					if !u.nify(x, yargs[i], p) {
-						return false
-					}
+			for i, xarg := range xargs {
+				if !u.nify(xarg, yargs[i], mode, p) {
+					return false
 				}
-				return true
 			}
+			return indenticalOrigin(x, y)
 		}
 
 	case *TypeParam:
-		// Two type parameters (which are not part of the type parameters of the
-		// enclosing type as those are handled in the beginning of this function)
-		// are identical if they originate in the same declaration.
-		return x == y
+		// x must be an unbound type parameter (see comment above).
+		if debug {
+			assert(u.asTypeParam(x) == nil)
+		}
+		// By definition, a valid type argument must be in the type set of
+		// the respective type constraint. Therefore, the type argument's
+		// underlying type must be in the set of underlying types of that
+		// constraint. If there is a single such underlying type, it's the
+		// constraint's core type. It must match the type argument's under-
+		// lying type, irrespective of whether the actual type argument,
+		// which may be a defined type, is actually in the type set (that
+		// will be determined at instantiation time).
+		// Thus, if we have the core type of an unbound type parameter,
+		// we know the structure of the possible types satisfying such
+		// parameters. Use that core type for further unification
+		// (see go.dev/issue/50755 for a test case).
+		if enableCoreTypeUnification {
+			// Because the core type is always an underlying type,
+			// unification will take care of matching against a
+			// defined or literal type automatically.
+			// If y is also an unbound type parameter, we will end
+			// up here again with x and y swapped, so we don't
+			// need to take care of that case separately.
+			if cx := coreType(x); cx != nil {
+				if traceInference {
+					u.tracef("core %s ≡ %s", x, y)
+				}
+				// If y is a defined type, it may not match against cx which
+				// is an underlying type (incl. int, string, etc.). Use assign
+				// mode here so that the unifier automatically takes under(y)
+				// if necessary.
+				return u.nify(cx, y, assign, p)
+			}
+		}
+		// x != y and there's nothing to do
 
 	case nil:
 		// avoid a crash in case of nil type
 
 	default:
-		panic(sprintf(nil, nil, true, "u.nify(%s, %s), u.x.tparams = %s", x, y, u.x.tparams))
+		panic(sprintf(nil, nil, true, "u.nify(%s, %s, %d)", x, y, mode))
 	}
 
 	return false
diff --git a/src/go/types/union.go b/src/go/types/union.go
index 9509afe..085f507 100644
--- a/src/go/types/union.go
+++ b/src/go/types/union.go
@@ -144,7 +144,7 @@
 		tilde = true
 	}
 	typ := check.typ(x)
-	// Embedding stand-alone type parameters is not permitted (issue #47127).
+	// Embedding stand-alone type parameters is not permitted (go.dev/issue/47127).
 	// We don't need this restriction anymore if we make the underlying type of a type
 	// parameter its constraint interface: if we embed a lone type parameter, we will
 	// simply use its underlying type (like we do for other named, embedded interfaces),
diff --git a/src/go/types/universe.go b/src/go/types/universe.go
index 9103fca..cc4d42d 100644
--- a/src/go/types/universe.go
+++ b/src/go/types/universe.go
@@ -1,3 +1,5 @@
+// Code generated by "go test -run=Generate -write=all"; DO NOT EDIT.
+
 // Copyright 2011 The Go Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
@@ -8,7 +10,6 @@
 
 import (
 	"go/constant"
-	"go/token"
 	"strings"
 )
 
@@ -73,33 +74,33 @@
 
 func defPredeclaredTypes() {
 	for _, t := range Typ {
-		def(NewTypeName(token.NoPos, nil, t.name, t))
+		def(NewTypeName(nopos, nil, t.name, t))
 	}
 	for _, t := range aliases {
-		def(NewTypeName(token.NoPos, nil, t.name, t))
+		def(NewTypeName(nopos, nil, t.name, t))
 	}
 
 	// type any = interface{}
 	// Note: don't use &emptyInterface for the type of any. Using a unique
 	// pointer allows us to detect any and format it as "any" rather than
 	// interface{}, which clarifies user-facing error messages significantly.
-	def(NewTypeName(token.NoPos, nil, "any", &Interface{complete: true, tset: &topTypeSet}))
+	def(NewTypeName(nopos, nil, "any", &Interface{complete: true, tset: &topTypeSet}))
 
 	// type error interface{ Error() string }
 	{
-		obj := NewTypeName(token.NoPos, nil, "error", nil)
+		obj := NewTypeName(nopos, nil, "error", nil)
 		obj.setColor(black)
 		typ := NewNamed(obj, nil, nil)
 
 		// error.Error() string
-		recv := NewVar(token.NoPos, nil, "", typ)
-		res := NewVar(token.NoPos, nil, "", Typ[String])
+		recv := NewVar(nopos, nil, "", typ)
+		res := NewVar(nopos, nil, "", Typ[String])
 		sig := NewSignatureType(recv, nil, nil, nil, NewTuple(res), false)
-		err := NewFunc(token.NoPos, nil, "Error", sig)
+		err := NewFunc(nopos, nil, "Error", sig)
 
 		// interface{ Error() string }
 		ityp := &Interface{methods: []*Func{err}, complete: true}
-		computeInterfaceTypeSet(nil, token.NoPos, ityp) // prevent races due to lazy computation of tset
+		computeInterfaceTypeSet(nil, nopos, ityp) // prevent races due to lazy computation of tset
 
 		typ.SetUnderlying(ityp)
 		def(obj)
@@ -107,7 +108,7 @@
 
 	// type comparable interface{} // marked as comparable
 	{
-		obj := NewTypeName(token.NoPos, nil, "comparable", nil)
+		obj := NewTypeName(nopos, nil, "comparable", nil)
 		obj.setColor(black)
 		typ := NewNamed(obj, nil, nil)
 
@@ -131,7 +132,7 @@
 
 func defPredeclaredConsts() {
 	for _, c := range predeclaredConsts {
-		def(NewConst(token.NoPos, nil, c.name, Typ[c.kind], c.val))
+		def(NewConst(nopos, nil, c.name, Typ[c.kind], c.val))
 	}
 }
 
@@ -154,6 +155,8 @@
 	_Imag
 	_Len
 	_Make
+	_Max
+	_Min
 	_New
 	_Panic
 	_Print
@@ -192,6 +195,9 @@
 	_Imag:    {"imag", 1, false, expression},
 	_Len:     {"len", 1, false, expression},
 	_Make:    {"make", 1, true, expression},
+	// To disable max/min, remove the next two lines.
+	_Max:     {"max", 1, true, expression},
+	_Min:     {"min", 1, true, expression},
 	_New:     {"new", 1, false, expression},
 	_Panic:   {"panic", 1, false, statement},
 	_Print:   {"print", 0, true, statement},
@@ -234,7 +240,7 @@
 }
 
 func init() {
-	Universe = NewScope(nil, token.NoPos, token.NoPos, "universe")
+	Universe = NewScope(nil, nopos, nopos, "universe")
 	Unsafe = NewPackage("unsafe", "unsafe")
 	Unsafe.complete = true
 
diff --git a/src/go/types/util.go b/src/go/types/util.go
new file mode 100644
index 0000000..87e1240
--- /dev/null
+++ b/src/go/types/util.go
@@ -0,0 +1,22 @@
+// Copyright 2023 The Go 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 various functionality that is
+// different between go/types and types2. Factoring
+// out this code allows more of the rest of the code
+// to be shared.
+
+package types
+
+import "go/token"
+
+// cmpPos compares the positions p and q and returns a result r as follows:
+//
+// r <  0: p is before q
+// r == 0: p and q are the same position (but may not be identical)
+// r >  0: p is after q
+//
+// If p and q are in different files, p is before q if the filename
+// of p sorts lexicographically before the filename of q.
+func cmpPos(p, q token.Pos) int { return int(p - q) }
diff --git a/src/go/types/util_test.go b/src/go/types/util_test.go
new file mode 100644
index 0000000..2052372
--- /dev/null
+++ b/src/go/types/util_test.go
@@ -0,0 +1,14 @@
+// Code generated by "go test -run=Generate -write=all"; DO NOT EDIT.
+
+// Copyright 2023 The Go 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 exports various functionality of util.go
+// so that it can be used in (package-external) tests.
+
+package types
+
+import "go/token"
+
+func CmpPos(p, q token.Pos) int { return cmpPos(p, q) }
diff --git a/src/go/types/validtype.go b/src/go/types/validtype.go
index d62c398..d915fef 100644
--- a/src/go/types/validtype.go
+++ b/src/go/types/validtype.go
@@ -1,3 +1,5 @@
+// Code generated by "go test -run=Generate -write=all"; DO NOT EDIT.
+
 // Copyright 2022 The Go Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
diff --git a/src/go/types/version.go b/src/go/types/version.go
index 3958ec9..108d9b3 100644
--- a/src/go/types/version.go
+++ b/src/go/types/version.go
@@ -8,22 +8,101 @@
 	"fmt"
 	"go/ast"
 	"go/token"
-	. "internal/types/errors"
-	"regexp"
-	"strconv"
 	"strings"
 )
 
+// A version represents a released Go version.
+type version struct {
+	major, minor int
+}
+
+func (v version) String() string {
+	return fmt.Sprintf("go%d.%d", v.major, v.minor)
+}
+
+func (v version) equal(u version) bool {
+	return v.major == u.major && v.minor == u.minor
+}
+
+func (v version) before(u version) bool {
+	return v.major < u.major || v.major == u.major && v.minor < u.minor
+}
+
+func (v version) after(u version) bool {
+	return v.major > u.major || v.major == u.major && v.minor > u.minor
+}
+
+// Go versions that introduced language changes.
+var (
+	go0_0  = version{0, 0} // no version specified
+	go1_9  = version{1, 9}
+	go1_13 = version{1, 13}
+	go1_14 = version{1, 14}
+	go1_17 = version{1, 17}
+	go1_18 = version{1, 18}
+	go1_20 = version{1, 20}
+	go1_21 = version{1, 21}
+)
+
+// parseGoVersion parses a Go version string (such as "go1.12")
+// and returns the version, or an error. If s is the empty
+// string, the version is 0.0.
+func parseGoVersion(s string) (v version, err error) {
+	bad := func() (version, error) {
+		return version{}, fmt.Errorf("invalid Go version syntax %q", s)
+	}
+	if s == "" {
+		return
+	}
+	if !strings.HasPrefix(s, "go") {
+		return bad()
+	}
+	s = s[len("go"):]
+	i := 0
+	for ; i < len(s) && '0' <= s[i] && s[i] <= '9'; i++ {
+		if i >= 10 || i == 0 && s[i] == '0' {
+			return bad()
+		}
+		v.major = 10*v.major + int(s[i]) - '0'
+	}
+	if i > 0 && i == len(s) {
+		return
+	}
+	if i == 0 || s[i] != '.' {
+		return bad()
+	}
+	s = s[i+1:]
+	if s == "0" {
+		// We really should not accept "go1.0",
+		// but we didn't reject it from the start
+		// and there are now programs that use it.
+		// So accept it.
+		return
+	}
+	i = 0
+	for ; i < len(s) && '0' <= s[i] && s[i] <= '9'; i++ {
+		if i >= 10 || i == 0 && s[i] == '0' {
+			return bad()
+		}
+		v.minor = 10*v.minor + int(s[i]) - '0'
+	}
+	// Accept any suffix after the minor number.
+	// We are only looking for the language version (major.minor)
+	// but want to accept any valid Go version, like go1.21.0
+	// and go1.21rc2.
+	return
+}
+
 // langCompat reports an error if the representation of a numeric
 // literal is not compatible with the current language version.
 func (check *Checker) langCompat(lit *ast.BasicLit) {
 	s := lit.Value
-	if len(s) <= 2 || check.allowVersion(check.pkg, 1, 13) {
+	if len(s) <= 2 || check.allowVersion(check.pkg, lit, go1_13) {
 		return
 	}
 	// len(s) > 2
 	if strings.Contains(s, "_") {
-		check.error(lit, UnsupportedFeature, "underscores in numeric literals requires go1.13 or later")
+		check.versionErrorf(lit, go1_13, "underscores in numeric literals")
 		return
 	}
 	if s[0] != '0' {
@@ -31,53 +110,45 @@
 	}
 	radix := s[1]
 	if radix == 'b' || radix == 'B' {
-		check.error(lit, UnsupportedFeature, "binary literals requires go1.13 or later")
+		check.versionErrorf(lit, go1_13, "binary literals")
 		return
 	}
 	if radix == 'o' || radix == 'O' {
-		check.error(lit, UnsupportedFeature, "0o/0O-style octal literals requires go1.13 or later")
+		check.versionErrorf(lit, go1_13, "0o/0O-style octal literals")
 		return
 	}
 	if lit.Kind != token.INT && (radix == 'x' || radix == 'X') {
-		check.error(lit, UnsupportedFeature, "hexadecimal floating-point literals requires go1.13 or later")
+		check.versionErrorf(lit, go1_13, "hexadecimal floating-point literals")
 	}
 }
 
 // allowVersion reports whether the given package
 // is allowed to use version major.minor.
-func (check *Checker) allowVersion(pkg *Package, major, minor int) bool {
+func (check *Checker) allowVersion(pkg *Package, at positioner, v version) bool {
 	// We assume that imported packages have all been checked,
 	// so we only have to check for the local package.
 	if pkg != check.pkg {
 		return true
 	}
-	ma, mi := check.version.major, check.version.minor
-	return ma == 0 && mi == 0 || ma > major || ma == major && mi >= minor
+
+	// If the source file declares its Go version, use that to decide.
+	if check.posVers != nil {
+		if src, ok := check.posVers[check.fset.File(at.Pos())]; ok && src.major >= 1 {
+			return !src.before(v)
+		}
+	}
+
+	// Otherwise fall back to the version in the checker.
+	return check.version.equal(go0_0) || !check.version.before(v)
 }
 
-type version struct {
-	major, minor int
+// verifyVersionf is like allowVersion but also accepts a format string and arguments
+// which are used to report a version error if allowVersion returns false. It uses the
+// current package.
+func (check *Checker) verifyVersionf(at positioner, v version, format string, args ...interface{}) bool {
+	if !check.allowVersion(check.pkg, at, v) {
+		check.versionErrorf(at, v, format, args...)
+		return false
+	}
+	return true
 }
-
-// parseGoVersion parses a Go version string (such as "go1.12")
-// and returns the version, or an error. If s is the empty
-// string, the version is 0.0.
-func parseGoVersion(s string) (v version, err error) {
-	if s == "" {
-		return
-	}
-	matches := goVersionRx.FindStringSubmatch(s)
-	if matches == nil {
-		err = fmt.Errorf(`should be something like "go1.12"`)
-		return
-	}
-	v.major, err = strconv.Atoi(matches[1])
-	if err != nil {
-		return
-	}
-	v.minor, err = strconv.Atoi(matches[2])
-	return
-}
-
-// goVersionRx matches a Go version string, e.g. "go1.12".
-var goVersionRx = regexp.MustCompile(`^go([1-9]\d*)\.(0|[1-9]\d*)$`)
diff --git a/src/go/types/version_test.go b/src/go/types/version_test.go
new file mode 100644
index 0000000..d25f7f5
--- /dev/null
+++ b/src/go/types/version_test.go
@@ -0,0 +1,26 @@
+// Code generated by "go test -run=Generate -write=all"; DO NOT EDIT.
+
+// Copyright 2023 The Go Authors. 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 "testing"
+
+var parseGoVersionTests = []struct {
+	in  string
+	out version
+}{
+	{"go1.21", version{1, 21}},
+	{"go1.21.0", version{1, 21}},
+	{"go1.21rc2", version{1, 21}},
+}
+
+func TestParseGoVersion(t *testing.T) {
+	for _, tt := range parseGoVersionTests {
+		if out, err := parseGoVersion(tt.in); out != tt.out || err != nil {
+			t.Errorf("parseGoVersion(%q) = %v, %v, want %v, nil", tt.in, out, err, tt.out)
+		}
+	}
+}
diff --git a/src/hash/crc32/crc32_ppc64le.s b/src/hash/crc32/crc32_ppc64le.s
index 763d327..84ef213 100644
--- a/src/hash/crc32/crc32_ppc64le.s
+++ b/src/hash/crc32/crc32_ppc64le.s
@@ -112,11 +112,11 @@
 	ANDCC	$7,R6,R8	// any leftover bytes
 	BEQ	done		// none --> done
 	MOVD	R8,CTR		// byte count
-        PCALIGN $16             // align short loop
+	PCALIGN $16             // align short loop
 short:
 	MOVBZ   0(R5),R8        // get v
 	MOVBZ   R7,R9           // byte(crc) -> R8 BE vs LE?
-        SRD     $8,R7,R14       // crc>>8
+	SRD     $8,R7,R14       // crc>>8
 	XOR     R8,R9,R8        // byte(crc)^v -> R8
 	ADD	$1,R5		// ptr to next v
 	SLD     $2,R8           // convert index-> bytes
diff --git a/src/hash/crc32/crc32_table_ppc64le.s b/src/hash/crc32/crc32_table_ppc64le.s
index 191810f..453df12 100644
--- a/src/hash/crc32/crc32_table_ppc64le.s
+++ b/src/hash/crc32/crc32_table_ppc64le.s
@@ -1090,7 +1090,7 @@
 
 GLOBL ·IEEEConst(SB),RODATA,$4336
 
- /* Barrett constant m - (4^32)/n */
+	/* Barrett constant m - (4^32)/n */
 DATA ·IEEEBarConst(SB)/8,$0x00000001f7011641
 DATA ·IEEEBarConst+8(SB)/8,$0x0000000000000000
 DATA ·IEEEBarConst+16(SB)/8,$0x00000001db710641
@@ -2184,7 +2184,7 @@
 
 GLOBL ·CastConst(SB),RODATA,$4336
 
- /* Barrett constant m - (4^32)/n */
+	/* Barrett constant m - (4^32)/n */
 DATA ·CastBarConst(SB)/8,$0x00000000dea713f1
 DATA ·CastBarConst+8(SB)/8,$0x0000000000000000
 DATA ·CastBarConst+16(SB)/8,$0x0000000105ec76f1
@@ -3278,7 +3278,7 @@
 
 GLOBL ·KoopConst(SB),RODATA,$4336
 
- /* Barrett constant m - (4^32)/n */
+	/* Barrett constant m - (4^32)/n */
 DATA ·KoopBarConst(SB)/8,$0x0000000017d232cd
 DATA ·KoopBarConst+8(SB)/8,$0x0000000000000000
 DATA ·KoopBarConst+16(SB)/8,$0x00000001d663b05d
diff --git a/src/hash/maphash/maphash.go b/src/hash/maphash/maphash.go
index 690068a..c2e9e40 100644
--- a/src/hash/maphash/maphash.go
+++ b/src/hash/maphash/maphash.go
@@ -12,10 +12,6 @@
 // (See crypto/sha256 and crypto/sha512 for cryptographic use.)
 package maphash
 
-import (
-	"unsafe"
-)
-
 // A Seed is a random value that selects the specific hash function
 // computed by a Hash. If two Hashes use the same Seeds, they
 // will compute the same hash values for any given input.
@@ -44,17 +40,15 @@
 	if state == 0 {
 		panic("maphash: use of uninitialized Seed")
 	}
-	if len(b) == 0 {
-		return rthash(nil, 0, state) // avoid &b[0] index panic below
-	}
+
 	if len(b) > bufSize {
 		b = b[:len(b):len(b)] // merge len and cap calculations when reslicing
 		for len(b) > bufSize {
-			state = rthash(&b[0], bufSize, state)
+			state = rthash(b[:bufSize], state)
 			b = b[bufSize:]
 		}
 	}
-	return rthash(&b[0], len(b), state)
+	return rthash(b, state)
 }
 
 // String returns the hash of s with the given seed.
@@ -71,12 +65,10 @@
 		panic("maphash: use of uninitialized Seed")
 	}
 	for len(s) > bufSize {
-		p := (*byte)(unsafe.StringData(s))
-		state = rthash(p, bufSize, state)
+		state = rthashString(s[:bufSize], state)
 		s = s[bufSize:]
 	}
-	p := (*byte)(unsafe.StringData(s))
-	return rthash(p, len(s), state)
+	return rthashString(s, state)
 }
 
 // A Hash computes a seeded hash of a byte sequence.
@@ -162,7 +154,7 @@
 	if len(b) > bufSize {
 		h.initSeed()
 		for len(b) > bufSize {
-			h.state.s = rthash(&b[0], bufSize, h.state.s)
+			h.state.s = rthash(b[:bufSize], h.state.s)
 			b = b[bufSize:]
 		}
 	}
@@ -189,8 +181,7 @@
 	if len(s) > bufSize {
 		h.initSeed()
 		for len(s) > bufSize {
-			ptr := (*byte)(unsafe.StringData(s))
-			h.state.s = rthash(ptr, bufSize, h.state.s)
+			h.state.s = rthashString(s[:bufSize], h.state.s)
 			s = s[bufSize:]
 		}
 	}
@@ -233,7 +224,7 @@
 		panic("maphash: flush of partially full buffer")
 	}
 	h.initSeed()
-	h.state.s = rthash(&h.buf[0], h.n, h.state.s)
+	h.state.s = rthash(h.buf[:h.n], h.state.s)
 	h.n = 0
 }
 
@@ -246,14 +237,14 @@
 // by using bit masking, shifting, or modular arithmetic.
 func (h *Hash) Sum64() uint64 {
 	h.initSeed()
-	return rthash(&h.buf[0], h.n, h.state.s)
+	return rthash(h.buf[:h.n], h.state.s)
 }
 
 // MakeSeed returns a new random seed.
 func MakeSeed() Seed {
 	var s uint64
 	for {
-		s = runtime_fastrand64()
+		s = randUint64()
 		// We use seed 0 to indicate an uninitialized seed/hash,
 		// so keep trying until we get a non-zero seed.
 		if s != 0 {
@@ -263,28 +254,6 @@
 	return Seed{s: s}
 }
 
-//go:linkname runtime_fastrand64 runtime.fastrand64
-func runtime_fastrand64() uint64
-
-func rthash(ptr *byte, len int, seed uint64) uint64 {
-	if len == 0 {
-		return seed
-	}
-	// The runtime hasher only works on uintptr. For 64-bit
-	// architectures, we use the hasher directly. Otherwise,
-	// we use two parallel hashers on the lower and upper 32 bits.
-	if unsafe.Sizeof(uintptr(0)) == 8 {
-		return uint64(runtime_memhash(unsafe.Pointer(ptr), uintptr(seed), uintptr(len)))
-	}
-	lo := runtime_memhash(unsafe.Pointer(ptr), uintptr(seed), uintptr(len))
-	hi := runtime_memhash(unsafe.Pointer(ptr), uintptr(seed>>32), uintptr(len))
-	return uint64(hi)<<32 | uint64(lo)
-}
-
-//go:linkname runtime_memhash runtime.memhash
-//go:noescape
-func runtime_memhash(p unsafe.Pointer, seed, s uintptr) uintptr
-
 // Sum appends the hash's current 64-bit value to b.
 // It exists for implementing hash.Hash.
 // For direct calls, it is more efficient to use Sum64.
diff --git a/src/hash/maphash/maphash_purego.go b/src/hash/maphash/maphash_purego.go
new file mode 100644
index 0000000..d49a44a
--- /dev/null
+++ b/src/hash/maphash/maphash_purego.go
@@ -0,0 +1,104 @@
+// Copyright 2023 The Go 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:build purego
+
+package maphash
+
+import (
+	"crypto/rand"
+	"math/bits"
+)
+
+func rthash(buf []byte, seed uint64) uint64 {
+	if len(buf) == 0 {
+		return seed
+	}
+	return wyhash(buf, seed, uint64(len(buf)))
+}
+
+func rthashString(s string, state uint64) uint64 {
+	return rthash([]byte(s), state)
+}
+
+func randUint64() uint64 {
+	buf := make([]byte, 8)
+	_, _ = rand.Read(buf)
+	return leUint64(buf)
+}
+
+// This is a port of wyhash implementation in runtime/hash64.go,
+// without using unsafe for purego.
+
+const (
+	m1 = 0xa0761d6478bd642f
+	m2 = 0xe7037ed1a0b428db
+	m3 = 0x8ebc6af09c88c6e3
+	m4 = 0x589965cc75374cc3
+	m5 = 0x1d8e4e27c47d124f
+)
+
+func wyhash(key []byte, seed, len uint64) uint64 {
+	p := key
+	i := len
+	var a, b uint64
+	seed ^= m1
+
+	if i > 16 {
+		if i > 48 {
+			seed1 := seed
+			seed2 := seed
+			for ; i > 48; i -= 48 {
+				seed = mix(r8(p)^m2, r8(p[8:])^seed)
+				seed1 = mix(r8(p[16:])^m3, r8(p[24:])^seed1)
+				seed2 = mix(r8(p[32:])^m4, r8(p[40:])^seed2)
+				p = p[48:]
+			}
+			seed ^= seed1 ^ seed2
+		}
+		for ; i > 16; i -= 16 {
+			seed = mix(r8(p)^m2, r8(p[8:])^seed)
+			p = p[16:]
+		}
+	}
+	switch {
+	case i == 0:
+		return seed
+	case i < 4:
+		a = r3(p, i)
+	default:
+		n := (i >> 3) << 2
+		a = r4(p)<<32 | r4(p[n:])
+		b = r4(p[i-4:])<<32 | r4(p[i-4-n:])
+	}
+	return mix(m5^len, mix(a^m2, b^seed))
+}
+
+func r3(p []byte, k uint64) uint64 {
+	return (uint64(p[0]) << 16) | (uint64(p[k>>1]) << 8) | uint64(p[k-1])
+}
+
+func r4(p []byte) uint64 {
+	return uint64(leUint32(p))
+}
+
+func r8(p []byte) uint64 {
+	return leUint64(p)
+}
+
+func mix(a, b uint64) uint64 {
+	hi, lo := bits.Mul64(a, b)
+	return hi ^ lo
+}
+
+func leUint32(b []byte) uint32 {
+	_ = b[3] // bounds check hint to compiler; see golang.org/issue/14808
+	return uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24
+}
+
+func leUint64(b []byte) uint64 {
+	_ = b[7] // bounds check hint to compiler; see golang.org/issue/14808
+	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
+}
diff --git a/src/hash/maphash/maphash_runtime.go b/src/hash/maphash/maphash_runtime.go
new file mode 100644
index 0000000..98097ff
--- /dev/null
+++ b/src/hash/maphash/maphash_runtime.go
@@ -0,0 +1,43 @@
+// Copyright 2023 The Go 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:build !purego
+
+package maphash
+
+import (
+	"unsafe"
+)
+
+//go:linkname runtime_fastrand64 runtime.fastrand64
+func runtime_fastrand64() uint64
+
+//go:linkname runtime_memhash runtime.memhash
+//go:noescape
+func runtime_memhash(p unsafe.Pointer, seed, s uintptr) uintptr
+
+func rthash(buf []byte, seed uint64) uint64 {
+	if len(buf) == 0 {
+		return seed
+	}
+	len := len(buf)
+	// The runtime hasher only works on uintptr. For 64-bit
+	// architectures, we use the hasher directly. Otherwise,
+	// we use two parallel hashers on the lower and upper 32 bits.
+	if unsafe.Sizeof(uintptr(0)) == 8 {
+		return uint64(runtime_memhash(unsafe.Pointer(&buf[0]), uintptr(seed), uintptr(len)))
+	}
+	lo := runtime_memhash(unsafe.Pointer(&buf[0]), uintptr(seed), uintptr(len))
+	hi := runtime_memhash(unsafe.Pointer(&buf[0]), uintptr(seed>>32), uintptr(len))
+	return uint64(hi)<<32 | uint64(lo)
+}
+
+func rthashString(s string, state uint64) uint64 {
+	buf := unsafe.Slice(unsafe.StringData(s), len(s))
+	return rthash(buf, state)
+}
+
+func randUint64() uint64 {
+	return runtime_fastrand64()
+}
diff --git a/src/hash/maphash/maphash_test.go b/src/hash/maphash/maphash_test.go
index 7526989..ed70f0c 100644
--- a/src/hash/maphash/maphash_test.go
+++ b/src/hash/maphash/maphash_test.go
@@ -141,7 +141,7 @@
 	sum2 := h1.Sum64()
 
 	if sum1 != sum2 {
-		t.Errorf("different sum after reseting: %#x != %#x", sum1, sum2)
+		t.Errorf("different sum after resetting: %#x != %#x", sum1, sum2)
 	}
 
 	h2 := new(Hash)
diff --git a/src/hash/maphash/smhasher_test.go b/src/hash/maphash/smhasher_test.go
index 27cedc4..a6e8a21 100644
--- a/src/hash/maphash/smhasher_test.go
+++ b/src/hash/maphash/smhasher_test.go
@@ -381,7 +381,7 @@
 	// find c such that Prob(mean-c*stddev < x < mean+c*stddev)^N > .9999
 	for c = 0.0; math.Pow(math.Erf(c/math.Sqrt(2)), float64(N)) < .9999; c += .1 {
 	}
-	c *= 4.0 // allowed slack - we don't need to be perfectly random
+	c *= 8.0 // allowed slack - we don't need to be perfectly random
 	mean := .5 * REP
 	stddev := .5 * math.Sqrt(REP)
 	low := int(mean - c*stddev)
diff --git a/src/html/fuzz.go b/src/html/fuzz.go
deleted file mode 100644
index cd70f97..0000000
--- a/src/html/fuzz.go
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2019 The Go 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:build gofuzz
-
-package html
-
-import (
-	"fmt"
-)
-
-func Fuzz(data []byte) int {
-	v := string(data)
-
-	e := EscapeString(v)
-	u := UnescapeString(e)
-	if v != u {
-		fmt.Printf("v = %q\n", v)
-		fmt.Printf("e = %q\n", e)
-		fmt.Printf("u = %q\n", u)
-		panic("not equal")
-	}
-
-	// As per the documentation, this isn't always equal to v, so it makes
-	// no sense to check for equality. It can still be interesting to find
-	// panics in it though.
-	EscapeString(UnescapeString(v))
-
-	return 0
-}
diff --git a/src/html/fuzz_test.go b/src/html/fuzz_test.go
new file mode 100644
index 0000000..ed15d8f
--- /dev/null
+++ b/src/html/fuzz_test.go
@@ -0,0 +1,22 @@
+// Copyright 2019 The Go Authors. 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"
+
+func FuzzEscapeUnescape(f *testing.F) {
+	f.Fuzz(func(t *testing.T, v string) {
+		e := EscapeString(v)
+		u := UnescapeString(e)
+		if u != v {
+			t.Errorf("EscapeString(%q) = %q, UnescapeString(%q) = %q, want %q", v, e, e, u, v)
+		}
+
+		// As per the documentation, this isn't always equal to v, so it makes
+		// no sense to check for equality. It can still be interesting to find
+		// panics in it though.
+		EscapeString(UnescapeString(v))
+	})
+}
diff --git a/src/html/template/attr_string.go b/src/html/template/attr_string.go
index babe70c..51c3f26 100644
--- a/src/html/template/attr_string.go
+++ b/src/html/template/attr_string.go
@@ -4,6 +4,18 @@
 
 import "strconv"
 
+func _() {
+	// An "invalid array index" compiler error signifies that the constant values have changed.
+	// Re-run the stringer command to generate them again.
+	var x [1]struct{}
+	_ = x[attrNone-0]
+	_ = x[attrScript-1]
+	_ = x[attrScriptType-2]
+	_ = x[attrStyle-3]
+	_ = x[attrURL-4]
+	_ = x[attrSrcset-5]
+}
+
 const _attr_name = "attrNoneattrScriptattrScriptTypeattrStyleattrURLattrSrcset"
 
 var _attr_index = [...]uint8{0, 8, 18, 32, 41, 48, 58}
diff --git a/src/html/template/context.go b/src/html/template/context.go
index a97c8be..7987713 100644
--- a/src/html/template/context.go
+++ b/src/html/template/context.go
@@ -120,12 +120,18 @@
 	stateJSDqStr
 	// stateJSSqStr occurs inside a JavaScript single quoted string.
 	stateJSSqStr
+	// stateJSBqStr occurs inside a JavaScript back quoted string.
+	stateJSBqStr
 	// stateJSRegexp occurs inside a JavaScript regexp literal.
 	stateJSRegexp
 	// stateJSBlockCmt occurs inside a JavaScript /* block comment */.
 	stateJSBlockCmt
 	// stateJSLineCmt occurs inside a JavaScript // line comment.
 	stateJSLineCmt
+	// stateJSHTMLOpenCmt occurs inside a JavaScript <!-- HTML-like comment.
+	stateJSHTMLOpenCmt
+	// stateJSHTMLCloseCmt occurs inside a JavaScript --> HTML-like comment.
+	stateJSHTMLCloseCmt
 	// stateCSS occurs inside a <style> element or style attribute.
 	stateCSS
 	// stateCSSDqStr occurs inside a CSS double quoted string.
@@ -153,7 +159,7 @@
 // authors & maintainers, not for end-users or machines.
 func isComment(s state) bool {
 	switch s {
-	case stateHTMLCmt, stateJSBlockCmt, stateJSLineCmt, stateCSSBlockCmt, stateCSSLineCmt:
+	case stateHTMLCmt, stateJSBlockCmt, stateJSLineCmt, stateJSHTMLOpenCmt, stateJSHTMLCloseCmt, stateCSSBlockCmt, stateCSSLineCmt:
 		return true
 	}
 	return false
@@ -168,6 +174,20 @@
 	return false
 }
 
+// isInScriptLiteral returns true if s is one of the literal states within a
+// <script> tag, and as such occurances of "<!--", "<script", and "</script"
+// need to be treated specially.
+func isInScriptLiteral(s state) bool {
+	// Ignore the comment states (stateJSBlockCmt, stateJSLineCmt,
+	// stateJSHTMLOpenCmt, stateJSHTMLCloseCmt) because their content is already
+	// omitted from the output.
+	switch s {
+	case stateJSDqStr, stateJSSqStr, stateJSBqStr, stateJSRegexp:
+		return true
+	}
+	return false
+}
+
 // delim is the delimiter that will end the current HTML attribute.
 type delim uint8
 
diff --git a/src/html/template/css.go b/src/html/template/css.go
index 890a0c6..f650d8b 100644
--- a/src/html/template/css.go
+++ b/src/html/template/css.go
@@ -238,7 +238,7 @@
 	// inside a string that might embed JavaScript source.
 	for i, c := range b {
 		switch c {
-		case 0, '"', '\'', '(', ')', '/', ';', '@', '[', '\\', ']', '`', '{', '}':
+		case 0, '"', '\'', '(', ')', '/', ';', '@', '[', '\\', ']', '`', '{', '}', '<', '>':
 			return filterFailsafe
 		case '-':
 			// Disallow <!-- or -->.
diff --git a/src/html/template/css_test.go b/src/html/template/css_test.go
index a735638..2b76256 100644
--- a/src/html/template/css_test.go
+++ b/src/html/template/css_test.go
@@ -231,6 +231,8 @@
 		{`-exp\000052 ession(alert(1337))`, "ZgotmplZ"},
 		{`-expre\0000073sion`, "-expre\x073sion"},
 		{`@import url evil.css`, "ZgotmplZ"},
+		{"<", "ZgotmplZ"},
+		{">", "ZgotmplZ"},
 	}
 	for _, test := range tests {
 		got := cssValueFilter(test.css)
diff --git a/src/html/template/delim_string.go b/src/html/template/delim_string.go
index 6d80e09..8d82850 100644
--- a/src/html/template/delim_string.go
+++ b/src/html/template/delim_string.go
@@ -4,6 +4,16 @@
 
 import "strconv"
 
+func _() {
+	// An "invalid array index" compiler error signifies that the constant values have changed.
+	// Re-run the stringer command to generate them again.
+	var x [1]struct{}
+	_ = x[delimNone-0]
+	_ = x[delimDoubleQuote-1]
+	_ = x[delimSingleQuote-2]
+	_ = x[delimSpaceOrTagEnd-3]
+}
+
 const _delim_name = "delimNonedelimDoubleQuotedelimSingleQuotedelimSpaceOrTagEnd"
 
 var _delim_index = [...]uint8{0, 9, 25, 41, 59}
diff --git a/src/html/template/doc.go b/src/html/template/doc.go
index 5d1631b..672d42b 100644
--- a/src/html/template/doc.go
+++ b/src/html/template/doc.go
@@ -5,16 +5,16 @@
 /*
 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.
+same interface as [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.
+documentation for [text/template].
 
 # Introduction
 
-This package wraps package text/template so you can share its template API
+This package wraps [text/template] so you can share its template API
 to parse and execute HTML templates safely.
 
 	tmpl, err := template.New("name").Parse(...)
@@ -231,5 +231,12 @@
 "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."
+
+As a consequence of the Least Surprise Property, template actions within an
+ECMAScript 6 template literal are disabled by default.
+Handling string interpolation within these literals is rather complex resulting
+in no clear safe way to support it.
+To re-enable template actions within ECMAScript 6 template literals, use the
+GODEBUG=jstmpllitinterp=1 environment variable.
 */
 package template
diff --git a/src/html/template/element_string.go b/src/html/template/element_string.go
index 4573e08..db28665 100644
--- a/src/html/template/element_string.go
+++ b/src/html/template/element_string.go
@@ -4,6 +4,17 @@
 
 import "strconv"
 
+func _() {
+	// An "invalid array index" compiler error signifies that the constant values have changed.
+	// Re-run the stringer command to generate them again.
+	var x [1]struct{}
+	_ = x[elementNone-0]
+	_ = x[elementScript-1]
+	_ = x[elementStyle-2]
+	_ = x[elementTextarea-3]
+	_ = x[elementTitle-4]
+}
+
 const _element_name = "elementNoneelementScriptelementStyleelementTextareaelementTitle"
 
 var _element_index = [...]uint8{0, 11, 24, 36, 51, 63}
diff --git a/src/html/template/error.go b/src/html/template/error.go
index 5c51f77..a763924 100644
--- a/src/html/template/error.go
+++ b/src/html/template/error.go
@@ -214,6 +214,14 @@
 	//   pipeline occurs in an unquoted attribute value context, "html" is
 	//   disallowed. Avoid using "html" and "urlquery" entirely in new templates.
 	ErrPredefinedEscaper
+
+	// ErrJSTemplate: "... appears in a JS template literal"
+	// Example:
+	//     <script>var tmpl = `{{.Interp}}`</script>
+	// Discussion:
+	//   Package html/template does not support actions inside of JS template
+	//   literals.
+	ErrJSTemplate
 )
 
 func (e *Error) Error() string {
diff --git a/src/html/template/escape.go b/src/html/template/escape.go
index 54fbcdc..01f6303 100644
--- a/src/html/template/escape.go
+++ b/src/html/template/escape.go
@@ -8,7 +8,9 @@
 	"bytes"
 	"fmt"
 	"html"
+	"internal/godebug"
 	"io"
+	"regexp"
 	"text/template"
 	"text/template/parse"
 )
@@ -160,6 +162,8 @@
 	panic("escaping " + n.String() + " is unimplemented")
 }
 
+var debugAllowActionJSTmpl = godebug.New("jstmpllitinterp")
+
 // escapeAction escapes an action template node.
 func (e *escaper) escapeAction(c context, n *parse.ActionNode) context {
 	if len(n.Pipe.Decl) != 0 {
@@ -223,6 +227,16 @@
 		c.jsCtx = jsCtxDivOp
 	case stateJSDqStr, stateJSSqStr:
 		s = append(s, "_html_template_jsstrescaper")
+	case stateJSBqStr:
+		if debugAllowActionJSTmpl.Value() == "1" {
+			debugAllowActionJSTmpl.IncNonDefault()
+			s = append(s, "_html_template_jsstrescaper")
+		} else {
+			return context{
+				state: stateError,
+				err:   errorf(ErrJSTemplate, n, n.Line, "%s appears in a JS template literal", n),
+			}
+		}
 	case stateJSRegexp:
 		s = append(s, "_html_template_jsregexpescaper")
 	case stateCSS:
@@ -369,9 +383,8 @@
 // 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_attrescaper": true,
+		"_html_template_htmlescaper": true,
 	},
 	"_html_template_cssescaper": {
 		"_html_template_attrescaper": true,
@@ -717,6 +730,26 @@
 	delimSpaceOrTagEnd: " \t\n\f\r>",
 }
 
+var (
+	// Per WHATWG HTML specification, section 4.12.1.3, there are extremely
+	// complicated rules for how to handle the set of opening tags <!--,
+	// <script, and </script when they appear in JS literals (i.e. strings,
+	// regexs, and comments). The specification suggests a simple solution,
+	// rather than implementing the arcane ABNF, which involves simply escaping
+	// the opening bracket with \x3C. We use the below regex for this, since it
+	// makes doing the case-insensitive find-replace much simpler.
+	specialScriptTagRE          = regexp.MustCompile("(?i)<(script|/script|!--)")
+	specialScriptTagReplacement = []byte("\\x3C$1")
+)
+
+func containsSpecialScriptTag(s []byte) bool {
+	return specialScriptTagRE.Match(s)
+}
+
+func escapeSpecialScriptTags(s []byte) []byte {
+	return specialScriptTagRE.ReplaceAll(s, specialScriptTagReplacement)
+}
+
 var doctypeBytes = []byte("<!DOCTYPE")
 
 // escapeText escapes a text template node.
@@ -745,7 +778,7 @@
 		} else if isComment(c.state) && c.delim == delimNone {
 			switch c.state {
 			case stateJSBlockCmt:
-				// https://es5.github.com/#x7.4:
+				// https://es5.github.io/#x7.4:
 				// "Comments behave like white space and are
 				// discarded except that, if a MultiLineComment
 				// contains a line terminator character, then
@@ -765,13 +798,21 @@
 		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 {
+			if c1.state == stateHTMLCmt || c1.state == stateJSHTMLOpenCmt {
 				// "<!--" instead of "/*" or "//"
 				cs -= 2
+			} else if c1.state == stateJSHTMLCloseCmt {
+				// "-->" instead of "/*" or "//"
+				cs -= 1
 			}
 			b.Write(s[written:cs])
 			written = i1
 		}
+		if isInScriptLiteral(c.state) && containsSpecialScriptTag(s[i:i1]) {
+			b.Write(s[written:i])
+			b.Write(escapeSpecialScriptTags(s[i:i1]))
+			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:]))
 		}
diff --git a/src/html/template/escape_test.go b/src/html/template/escape_test.go
index 12add07..8a4f62e 100644
--- a/src/html/template/escape_test.go
+++ b/src/html/template/escape_test.go
@@ -504,6 +504,31 @@
 			"<script>var a \nd</script>",
 		},
 		{
+			"JS HTML-like comments",
+			"<script>before <!-- beep\nbetween\nbefore-->boop\n</script>",
+			"<script>before \nbetween\nbefore\n</script>",
+		},
+		{
+			"JS hashbang comment",
+			"<script>#! beep\n</script>",
+			"<script>\n</script>",
+		},
+		{
+			"Special tags in <script> string literals",
+			`<script>var a = "asd < 123 <!-- 456 < fgh <script jkl < 789 </script"</script>`,
+			`<script>var a = "asd < 123 \x3C!-- 456 < fgh \x3Cscript jkl < 789 \x3C/script"</script>`,
+		},
+		{
+			"Special tags in <script> string literals (mixed case)",
+			`<script>var a = "<!-- <ScripT </ScripT"</script>`,
+			`<script>var a = "\x3C!-- \x3CScripT \x3C/ScripT"</script>`,
+		},
+		{
+			"Special tags in <script> regex literals (mixed case)",
+			`<script>var a = /<!-- <ScripT </ScripT/</script>`,
+			`<script>var a = /\x3C!-- \x3CScripT \x3C/ScripT/</script>`,
+		},
+		{
 			"CSS comments",
 			"<style>p// paragraph\n" +
 				`{border: 1px/* color */{{"#00f"}}}</style>`,
@@ -678,38 +703,49 @@
 			`<img srcset={{",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"}}>`,
 			`<img srcset=,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,>`,
 		},
+		{
+			"unquoted empty attribute value (plaintext)",
+			"<p name={{.U}}>",
+			"<p name=ZgotmplZ>",
+		},
+		{
+			"unquoted empty attribute value (url)",
+			"<p href={{.U}}>",
+			"<p href=ZgotmplZ>",
+		},
+		{
+			"quoted empty attribute value",
+			"<p name=\"{{.U}}\">",
+			"<p name=\"\">",
+		},
 	}
 
 	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(strings.Builder)
-		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
-		}
+		t.Run(test.name, func(t *testing.T) {
+			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.Fatalf("%s: tree not set properly", test.name)
+			}
+			b := new(strings.Builder)
+			if err := tmpl.Execute(b, data); err != nil {
+				t.Fatalf("%s: template execution failed: %s", test.name, err)
+			}
+			if w, g := test.output, b.String(); w != g {
+				t.Fatalf("%s: escaped output: want\n\t%q\ngot\n\t%q", test.name, w, g)
+			}
+			b.Reset()
+			if err := tmpl.Execute(b, pdata); err != nil {
+				t.Fatalf("%s: template execution failed for pointer: %s", test.name, err)
+			}
+			if w, g := test.output, b.String(); w != g {
+				t.Fatalf("%s: escaped output for pointer: want\n\t%q\ngot\n\t%q", test.name, w, g)
+			}
+			if tmpl.Tree != tmpl.text.Tree {
+				t.Fatalf("%s: tree mismatch", test.name)
+			}
+		})
 	}
 }
 
@@ -936,6 +972,10 @@
 			"{{range .Items}}<a{{if .X}}{{end}}>{{if .X}}{{break}}{{end}}{{end}}",
 			"",
 		},
+		{
+			"<script>var a = `${a+b}`</script>`",
+			"",
+		},
 		// Error cases.
 		{
 			"{{if .Cond}}<a{{end}}",
@@ -1082,6 +1122,10 @@
 			// html is allowed since it is the last command in the pipeline, but urlquery is not.
 			`predefined escaper "urlquery" disallowed in template`,
 		},
+		{
+			"<script>var tmpl = `asd {{.}}`;</script>",
+			`{{.}} appears in a JS template literal`,
+		},
 	}
 	for _, test := range tests {
 		buf := new(bytes.Buffer)
@@ -1304,6 +1348,10 @@
 			context{state: stateJSSqStr, delim: delimDoubleQuote, attr: attrScript},
 		},
 		{
+			"<a onclick=\"`foo",
+			context{state: stateJSBqStr, delim: delimDoubleQuote, attr: attrScript},
+		},
+		{
 			`<A ONCLICK="'`,
 			context{state: stateJSSqStr, delim: delimDoubleQuote, attr: attrScript},
 		},
@@ -1500,8 +1548,38 @@
 			context{state: stateJS, element: elementScript},
 		},
 		{
+			// <script and </script tags are escaped, so </script> should not
+			// cause us to exit the JS state.
 			`<script>document.write("<script>alert(1)</script>");`,
-			context{state: stateText},
+			context{state: stateJS, element: elementScript},
+		},
+		{
+			`<script>document.write("<script>`,
+			context{state: stateJSDqStr, element: elementScript},
+		},
+		{
+			`<script>document.write("<script>alert(1)</script>`,
+			context{state: stateJSDqStr, element: elementScript},
+		},
+		{
+			`<script>document.write("<script>alert(1)<!--`,
+			context{state: stateJSDqStr, element: elementScript},
+		},
+		{
+			`<script>document.write("<script>alert(1)</Script>");`,
+			context{state: stateJS, element: elementScript},
+		},
+		{
+			`<script>document.write("<!--");`,
+			context{state: stateJS, element: elementScript},
+		},
+		{
+			`<script>let a = /</script`,
+			context{state: stateJSRegexp, element: elementScript},
+		},
+		{
+			`<script>let a = /</script/`,
+			context{state: stateJS, element: elementScript, jsCtx: jsCtxDivOp},
 		},
 		{
 			`<script type="text/template">`,
diff --git a/src/html/template/exec_test.go b/src/html/template/exec_test.go
index 1ec346f..51923ff 100644
--- a/src/html/template/exec_test.go
+++ b/src/html/template/exec_test.go
@@ -920,7 +920,7 @@
 		{`'foo`, `\'foo`},
 		{`Go "jump" \`, `Go \"jump\" \\`},
 		{`Yukihiro says "今日は世界"`, `Yukihiro says \"今日は世界\"`},
-		{"unprintable \uFDFF", `unprintable \uFDFF`},
+		{"unprintable \uFFFE", `unprintable \uFFFE`},
 		{`<html>`, `\u003Chtml\u003E`},
 		{`no = in attributes`, `no \u003D in attributes`},
 		{`&#x27; does not become HTML entity`, `\u0026#x27; does not become HTML entity`},
diff --git a/src/html/template/html.go b/src/html/template/html.go
index bcca0b5..a181699 100644
--- a/src/html/template/html.go
+++ b/src/html/template/html.go
@@ -14,6 +14,9 @@
 // htmlNospaceEscaper escapes for inclusion in unquoted attribute values.
 func htmlNospaceEscaper(args ...any) string {
 	s, t := stringify(args...)
+	if s == "" {
+		return filterFailsafe
+	}
 	if t == contentTypeHTML {
 		return htmlReplacer(stripTags(s), htmlNospaceNormReplacementTable, false)
 	}
diff --git a/src/html/template/js.go b/src/html/template/js.go
index 50523d0..4e05c14 100644
--- a/src/html/template/js.go
+++ b/src/html/template/js.go
@@ -13,6 +13,11 @@
 	"unicode/utf8"
 )
 
+// jsWhitespace contains all of the JS whitespace characters, as defined
+// by the \s character class.
+// See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_expressions/Character_classes.
+const jsWhitespace = "\f\n\r\t\v\u0020\u00a0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u2028\u2029\u202f\u205f\u3000\ufeff"
+
 // 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 /=.
@@ -26,7 +31,8 @@
 // JavaScript 2.0 lexical grammar and requires one token of lookbehind:
 // https://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")
+	// Trim all JS whitespace characters
+	s = bytes.TrimRight(s, jsWhitespace)
 	if len(s) == 0 {
 		return preceding
 	}
@@ -308,6 +314,7 @@
 	// Encode HTML specials as hex so the output can be embedded
 	// in HTML attributes without further encoding.
 	'"':  `\u0022`,
+	'`':  `\u0060`,
 	'&':  `\u0026`,
 	'\'': `\u0027`,
 	'+':  `\u002b`,
@@ -331,6 +338,7 @@
 	'"':  `\u0022`,
 	'&':  `\u0026`,
 	'\'': `\u0027`,
+	'`':  `\u0060`,
 	'+':  `\u002b`,
 	'/':  `\/`,
 	'<':  `\u003c`,
diff --git a/src/html/template/js_test.go b/src/html/template/js_test.go
index 580cb0a..259dcfb 100644
--- a/src/html/template/js_test.go
+++ b/src/html/template/js_test.go
@@ -80,14 +80,17 @@
 		{jsCtxDivOp, "0"},
 		// Dots that are part of a number are div preceders.
 		{jsCtxDivOp, "0."},
+		// Some JS interpreters treat NBSP as a normal space, so
+		// we must too in order to properly escape things.
+		{jsCtxRegexp, "=\u00A0"},
 	}
 
 	for _, test := range tests {
-		if nextJSCtx([]byte(test.s), jsCtxRegexp) != test.jsCtx {
-			t.Errorf("want %s got %q", test.jsCtx, test.s)
+		if ctx := nextJSCtx([]byte(test.s), jsCtxRegexp); ctx != test.jsCtx {
+			t.Errorf("%q: want %s got %s", test.s, test.jsCtx, ctx)
 		}
-		if nextJSCtx([]byte(test.s), jsCtxDivOp) != test.jsCtx {
-			t.Errorf("want %s got %q", test.jsCtx, test.s)
+		if ctx := nextJSCtx([]byte(test.s), jsCtxDivOp); ctx != test.jsCtx {
+			t.Errorf("%q: want %s got %s", test.s, test.jsCtx, ctx)
 		}
 	}
 
@@ -291,7 +294,7 @@
 				`0123456789:;\u003c=\u003e?` +
 				`@ABCDEFGHIJKLMNO` +
 				`PQRSTUVWXYZ[\\]^_` +
-				"`abcdefghijklmno" +
+				"\\u0060abcdefghijklmno" +
 				"pqrstuvwxyz{|}~\u007f" +
 				"\u00A0\u0100\\u2028\\u2029\ufeff\U0001D11E",
 		},
diff --git a/src/html/template/jsctx_string.go b/src/html/template/jsctx_string.go
index dd1d87ee..2394893 100644
--- a/src/html/template/jsctx_string.go
+++ b/src/html/template/jsctx_string.go
@@ -4,6 +4,15 @@
 
 import "strconv"
 
+func _() {
+	// An "invalid array index" compiler error signifies that the constant values have changed.
+	// Re-run the stringer command to generate them again.
+	var x [1]struct{}
+	_ = x[jsCtxRegexp-0]
+	_ = x[jsCtxDivOp-1]
+	_ = x[jsCtxUnknown-2]
+}
+
 const _jsCtx_name = "jsCtxRegexpjsCtxDivOpjsCtxUnknown"
 
 var _jsCtx_index = [...]uint8{0, 11, 21, 33}
diff --git a/src/html/template/state_string.go b/src/html/template/state_string.go
index 05104be..be7a920 100644
--- a/src/html/template/state_string.go
+++ b/src/html/template/state_string.go
@@ -4,9 +4,44 @@
 
 import "strconv"
 
-const _state_name = "stateTextstateTagstateAttrNamestateAfterNamestateBeforeValuestateHTMLCmtstateRCDATAstateAttrstateURLstateSrcsetstateJSstateJSDqStrstateJSSqStrstateJSRegexpstateJSBlockCmtstateJSLineCmtstateCSSstateCSSDqStrstateCSSSqStrstateCSSDqURLstateCSSSqURLstateCSSURLstateCSSBlockCmtstateCSSLineCmtstateError"
+func _() {
+	// An "invalid array index" compiler error signifies that the constant values have changed.
+	// Re-run the stringer command to generate them again.
+	var x [1]struct{}
+	_ = x[stateText-0]
+	_ = x[stateTag-1]
+	_ = x[stateAttrName-2]
+	_ = x[stateAfterName-3]
+	_ = x[stateBeforeValue-4]
+	_ = x[stateHTMLCmt-5]
+	_ = x[stateRCDATA-6]
+	_ = x[stateAttr-7]
+	_ = x[stateURL-8]
+	_ = x[stateSrcset-9]
+	_ = x[stateJS-10]
+	_ = x[stateJSDqStr-11]
+	_ = x[stateJSSqStr-12]
+	_ = x[stateJSBqStr-13]
+	_ = x[stateJSRegexp-14]
+	_ = x[stateJSBlockCmt-15]
+	_ = x[stateJSLineCmt-16]
+	_ = x[stateJSHTMLOpenCmt-17]
+	_ = x[stateJSHTMLCloseCmt-18]
+	_ = x[stateCSS-19]
+	_ = x[stateCSSDqStr-20]
+	_ = x[stateCSSSqStr-21]
+	_ = x[stateCSSDqURL-22]
+	_ = x[stateCSSSqURL-23]
+	_ = x[stateCSSURL-24]
+	_ = x[stateCSSBlockCmt-25]
+	_ = x[stateCSSLineCmt-26]
+	_ = x[stateError-27]
+	_ = x[stateDead-28]
+}
 
-var _state_index = [...]uint16{0, 9, 17, 30, 44, 60, 72, 83, 92, 100, 111, 118, 130, 142, 155, 170, 184, 192, 205, 218, 231, 244, 255, 271, 286, 296}
+const _state_name = "stateTextstateTagstateAttrNamestateAfterNamestateBeforeValuestateHTMLCmtstateRCDATAstateAttrstateURLstateSrcsetstateJSstateJSDqStrstateJSSqStrstateJSBqStrstateJSRegexpstateJSBlockCmtstateJSLineCmtstateJSHTMLOpenCmtstateJSHTMLCloseCmtstateCSSstateCSSDqStrstateCSSSqStrstateCSSDqURLstateCSSSqURLstateCSSURLstateCSSBlockCmtstateCSSLineCmtstateErrorstateDead"
+
+var _state_index = [...]uint16{0, 9, 17, 30, 44, 60, 72, 83, 92, 100, 111, 118, 130, 142, 154, 167, 182, 196, 214, 233, 241, 254, 267, 280, 293, 304, 320, 335, 345, 354}
 
 func (i state) String() string {
 	if i >= state(len(_state_index)-1) {
diff --git a/src/html/template/transition.go b/src/html/template/transition.go
index 06df679..432c365 100644
--- a/src/html/template/transition.go
+++ b/src/html/template/transition.go
@@ -14,31 +14,34 @@
 // 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,
-	stateSrcset:      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,
+	stateText:           tText,
+	stateTag:            tTag,
+	stateAttrName:       tAttrName,
+	stateAfterName:      tAfterName,
+	stateBeforeValue:    tBeforeValue,
+	stateHTMLCmt:        tHTMLCmt,
+	stateRCDATA:         tSpecialTagEnd,
+	stateAttr:           tAttr,
+	stateURL:            tURL,
+	stateSrcset:         tURL,
+	stateJS:             tJS,
+	stateJSDqStr:        tJSDelimited,
+	stateJSSqStr:        tJSDelimited,
+	stateJSBqStr:        tJSDelimited,
+	stateJSRegexp:       tJSDelimited,
+	stateJSBlockCmt:     tBlockCmt,
+	stateJSLineCmt:      tLineCmt,
+	stateJSHTMLOpenCmt:  tLineCmt,
+	stateJSHTMLCloseCmt: tLineCmt,
+	stateCSS:            tCSS,
+	stateCSSDqStr:       tCSSStr,
+	stateCSSSqStr:       tCSSStr,
+	stateCSSDqURL:       tCSSStr,
+	stateCSSSqURL:       tCSSStr,
+	stateCSSURL:         tCSSStr,
+	stateCSSBlockCmt:    tBlockCmt,
+	stateCSSLineCmt:     tLineCmt,
+	stateError:          tError,
 }
 
 var commentStart = []byte("<!--")
@@ -211,6 +214,11 @@
 // element states.
 func tSpecialTagEnd(c context, s []byte) (context, int) {
 	if c.element != elementNone {
+		// script end tags ("</script") within script literals are ignored, so that
+		// we can properly escape them.
+		if c.element == elementScript && (isInScriptLiteral(c.state) || isComment(c.state)) {
+			return c, len(s)
+		}
 		if i := indexTagEnd(s, specialTagEndMarkers[c.element]); i != -1 {
 			return context{}, i
 		}
@@ -262,7 +270,7 @@
 
 // tJS is the context transition function for the JS state.
 func tJS(c context, s []byte) (context, int) {
-	i := bytes.IndexAny(s, `"'/`)
+	i := bytes.IndexAny(s, "\"`'/<-#")
 	if i == -1 {
 		// Entire input is non string, comment, regexp tokens.
 		c.jsCtx = nextJSCtx(s, c.jsCtx)
@@ -274,6 +282,8 @@
 		c.state, c.jsCtx = stateJSDqStr, jsCtxRegexp
 	case '\'':
 		c.state, c.jsCtx = stateJSSqStr, jsCtxRegexp
+	case '`':
+		c.state, c.jsCtx = stateJSBqStr, jsCtxRegexp
 	case '/':
 		switch {
 		case i+1 < len(s) && s[i+1] == '/':
@@ -290,6 +300,26 @@
 				err:   errorf(ErrSlashAmbig, nil, 0, "'/' could start a division or regexp: %.32q", s[i:]),
 			}, len(s)
 		}
+	// ECMAScript supports HTML style comments for legacy reasons, see Appendix
+	// B.1.1 "HTML-like Comments". The handling of these comments is somewhat
+	// confusing. Multi-line comments are not supported, i.e. anything on lines
+	// between the opening and closing tokens is not considered a comment, but
+	// anything following the opening or closing token, on the same line, is
+	// ignored. As such we simply treat any line prefixed with "<!--" or "-->"
+	// as if it were actually prefixed with "//" and move on.
+	case '<':
+		if i+3 < len(s) && bytes.Equal(commentStart, s[i:i+4]) {
+			c.state, i = stateJSHTMLOpenCmt, i+3
+		}
+	case '-':
+		if i+2 < len(s) && bytes.Equal(commentEnd, s[i:i+3]) {
+			c.state, i = stateJSHTMLCloseCmt, i+2
+		}
+	// ECMAScript also supports "hashbang" comment lines, see Section 12.5.
+	case '#':
+		if i+1 < len(s) && s[i+1] == '!' {
+			c.state, i = stateJSLineCmt, i+1
+		}
 	default:
 		panic("unreachable")
 	}
@@ -303,6 +333,8 @@
 	switch c.state {
 	case stateJSSqStr:
 		specials = `\'`
+	case stateJSBqStr:
+		specials = "`\\"
 	case stateJSRegexp:
 		specials = `\/[]`
 	}
@@ -326,6 +358,16 @@
 			inCharset = true
 		case ']':
 			inCharset = false
+		case '/':
+			// If "</script" appears in a regex literal, the '/' should not
+			// close the regex literal, and it will later be escaped to
+			// "\x3C/script" in escapeText.
+			if i > 0 && i+7 <= len(s) && bytes.Compare(bytes.ToLower(s[i-1:i+7]), []byte("</script")) == 0 {
+				i++
+			} else if !inCharset {
+				c.state, c.jsCtx = stateJS, jsCtxDivOp
+				return c, i + 1
+			}
 		default:
 			// end delimiter
 			if !inCharset {
@@ -367,12 +409,12 @@
 	return c, i + 2
 }
 
-// tLineCmt is the context transition function for //comment states.
+// tLineCmt is the context transition function for //comment states, and the JS HTML-like comment state.
 func tLineCmt(c context, s []byte) (context, int) {
 	var lineTerminators string
 	var endState state
 	switch c.state {
-	case stateJSLineCmt:
+	case stateJSLineCmt, stateJSHTMLOpenCmt, stateJSHTMLCloseCmt:
 		lineTerminators, endState = "\n\r\u2028\u2029", stateJS
 	case stateCSSLineCmt:
 		lineTerminators, endState = "\n\f\r", stateCSS
@@ -392,7 +434,7 @@
 		return c, len(s)
 	}
 	c.state = endState
-	// Per section 7.4 of EcmaScript 5 : https://es5.github.com/#x7.4
+	// Per section 7.4 of EcmaScript 5 : https://es5.github.io/#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
diff --git a/src/html/template/urlpart_string.go b/src/html/template/urlpart_string.go
index 813eea9..7bc957e 100644
--- a/src/html/template/urlpart_string.go
+++ b/src/html/template/urlpart_string.go
@@ -4,6 +4,16 @@
 
 import "strconv"
 
+func _() {
+	// An "invalid array index" compiler error signifies that the constant values have changed.
+	// Re-run the stringer command to generate them again.
+	var x [1]struct{}
+	_ = x[urlPartNone-0]
+	_ = x[urlPartPreQuery-1]
+	_ = x[urlPartQueryOrFrag-2]
+	_ = x[urlPartUnknown-3]
+}
+
 const _urlPart_name = "urlPartNoneurlPartPreQueryurlPartQueryOrFragurlPartUnknown"
 
 var _urlPart_index = [...]uint8{0, 11, 26, 44, 58}
diff --git a/src/image/jpeg/huffman.go b/src/image/jpeg/huffman.go
index 95aaf71..7244436 100644
--- a/src/image/jpeg/huffman.go
+++ b/src/image/jpeg/huffman.go
@@ -49,7 +49,7 @@
 	for {
 		c, err := d.readByteStuffedByte()
 		if err != nil {
-			if err == io.EOF {
+			if err == io.ErrUnexpectedEOF {
 				return errShortHuffmanData
 			}
 			return err
diff --git a/src/image/jpeg/reader.go b/src/image/jpeg/reader.go
index b340723..61f2b40 100644
--- a/src/image/jpeg/reader.go
+++ b/src/image/jpeg/reader.go
@@ -164,7 +164,10 @@
 	n, err := d.r.Read(d.bytes.buf[d.bytes.j:])
 	d.bytes.j += n
 	if n > 0 {
-		err = nil
+		return nil
+	}
+	if err == io.EOF {
+		err = io.ErrUnexpectedEOF
 	}
 	return err
 }
@@ -261,9 +264,6 @@
 			break
 		}
 		if err := d.fill(); err != nil {
-			if err == io.EOF {
-				err = io.ErrUnexpectedEOF
-			}
 			return err
 		}
 	}
@@ -291,9 +291,6 @@
 			break
 		}
 		if err := d.fill(); err != nil {
-			if err == io.EOF {
-				err = io.ErrUnexpectedEOF
-			}
 			return err
 		}
 	}
diff --git a/src/image/jpeg/reader_test.go b/src/image/jpeg/reader_test.go
index 02a2eb6..cdac2dd 100644
--- a/src/image/jpeg/reader_test.go
+++ b/src/image/jpeg/reader_test.go
@@ -490,6 +490,20 @@
 	}
 }
 
+func TestIssue56724(t *testing.T) {
+	b, err := os.ReadFile("../testdata/video-001.jpeg")
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	b = b[:24] // truncate image data
+
+	_, err = Decode(bytes.NewReader(b))
+	if err != io.ErrUnexpectedEOF {
+		t.Errorf("got: %v, want: %v", err, io.ErrUnexpectedEOF)
+	}
+}
+
 func benchmarkDecode(b *testing.B, filename string) {
 	data, err := os.ReadFile(filename)
 	if err != nil {
diff --git a/src/index/suffixarray/sais.go b/src/index/suffixarray/sais.go
index 74c5235..3283aa3 100644
--- a/src/index/suffixarray/sais.go
+++ b/src/index/suffixarray/sais.go
@@ -525,7 +525,7 @@
 // Second, to avoid text comparison entirely, if an LMS-substring is very short,
 // sa[j/2] records its actual text instead of its length, so that if two such
 // substrings have matching “length,” the text need not be read at all.
-// The definition of “very short” is that the text bytes must pack into an uint32,
+// The definition of “very short” is that the text bytes must pack into a uint32,
 // and the unsigned encoding e must be ≥ len(text), so that it can be
 // distinguished from a valid length.
 func length_8_32(text []byte, sa []int32, numLMS int) {
diff --git a/src/internal/abi/abi.go b/src/internal/abi/abi.go
index 11acac3..e1c8adc 100644
--- a/src/internal/abi/abi.go
+++ b/src/internal/abi/abi.go
@@ -100,27 +100,3 @@
 func (b *IntArgRegBitmap) Get(i int) bool {
 	return b[i/8]&(uint8(1)<<(i%8)) != 0
 }
-
-// FuncPC* intrinsics.
-//
-// CAREFUL: In programs with plugins, FuncPC* can return different values
-// for the same function (because there are actually multiple copies of
-// the same function in the address space). To be safe, don't use the
-// results of this function in any == expression. It is only safe to
-// use the result as an address at which to start executing code.
-
-// FuncPCABI0 returns the entry PC of the function f, which must be a
-// direct reference of a function defined as ABI0. Otherwise it is a
-// compile-time error.
-//
-// Implemented as a compile intrinsic.
-func FuncPCABI0(f any) uintptr
-
-// FuncPCABIInternal returns the entry PC of the function f. If f is a
-// direct reference of a function, it must be defined as ABIInternal.
-// Otherwise it is a compile-time error. If f is not a direct reference
-// of a defined function, it assumes that f is a func value. Otherwise
-// the behavior is undefined.
-//
-// Implemented as a compile intrinsic.
-func FuncPCABIInternal(f any) uintptr
diff --git a/src/internal/abi/abi_test.go b/src/internal/abi/abi_test.go
index f0d8dce..44b9e78 100644
--- a/src/internal/abi/abi_test.go
+++ b/src/internal/abi/abi_test.go
@@ -7,7 +7,6 @@
 import (
 	"internal/abi"
 	"internal/testenv"
-	"os/exec"
 	"path/filepath"
 	"strings"
 	"testing"
@@ -42,18 +41,19 @@
 	symabi := filepath.Join(tmpdir, "symabi")
 	obj := filepath.Join(tmpdir, "x.o")
 
+	// Write an importcfg file for the dependencies of the package.
 	importcfgfile := filepath.Join(tmpdir, "hello.importcfg")
-	testenv.WriteImportcfg(t, importcfgfile, nil)
+	testenv.WriteImportcfg(t, importcfgfile, nil, "internal/abi")
 
 	// parse assembly code for symabi.
-	cmd := exec.Command(testenv.GoToolPath(t), "tool", "asm", "-gensymabis", "-o", symabi, asmSrc)
+	cmd := testenv.Command(t, testenv.GoToolPath(t), "tool", "asm", "-gensymabis", "-o", symabi, asmSrc)
 	out, err := cmd.CombinedOutput()
 	if err != nil {
 		t.Fatalf("go tool asm -gensymabis failed: %v\n%s", err, out)
 	}
 
 	// compile go code.
-	cmd = exec.Command(testenv.GoToolPath(t), "tool", "compile", "-importcfg="+importcfgfile, "-p=p", "-symabis", symabi, "-o", obj, goSrc)
+	cmd = testenv.Command(t, testenv.GoToolPath(t), "tool", "compile", "-importcfg="+importcfgfile, "-p=p", "-symabis", symabi, "-o", obj, goSrc)
 	out, err = cmd.CombinedOutput()
 	if err == nil {
 		t.Fatalf("go tool compile did not fail")
diff --git a/src/internal/abi/compiletype.go b/src/internal/abi/compiletype.go
new file mode 100644
index 0000000..d92adde
--- /dev/null
+++ b/src/internal/abi/compiletype.go
@@ -0,0 +1,167 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package abi
+
+// These functions are the build-time version of the Go type data structures.
+
+// Their contents must be kept in sync with their definitions.
+// Because the host and target type sizes can differ, the compiler and
+// linker cannot use the host information that they might get from
+// either unsafe.Sizeof and Alignof, nor runtime, reflect, or reflectlite.
+
+// CommonSize returns sizeof(Type) for a compilation target with a given ptrSize
+func CommonSize(ptrSize int) int { return 4*ptrSize + 8 + 8 }
+
+// StructFieldSize returns sizeof(StructField) for a compilation target with a given ptrSize
+func StructFieldSize(ptrSize int) int { return 3 * ptrSize }
+
+// UncommonSize returns sizeof(UncommonType).  This currently does not depend on ptrSize.
+// This exported function is in an internal package, so it may change to depend on ptrSize in the future.
+func UncommonSize() uint64 { return 4 + 2 + 2 + 4 + 4 }
+
+// IMethodSize returns sizeof(IMethod) for a compilation target with a given ptrSize
+func IMethodSize(ptrSize int) int { return 4 + 4 }
+
+// KindOff returns the offset of Type.Kind_ for a compilation target with a given ptrSize
+func KindOff(ptrSize int) int { return 2*ptrSize + 7 }
+
+// SizeOff returns the offset of Type.Size_ for a compilation target with a given ptrSize
+func SizeOff(ptrSize int) int { return 0 }
+
+// PtrBytes returns the offset of Type.PtrBytes for a compilation target with a given ptrSize
+func PtrBytesOff(ptrSize int) int { return ptrSize }
+
+// TFlagOff returns the offset of Type.TFlag for a compilation target with a given ptrSize
+func TFlagOff(ptrSize int) int { return 2*ptrSize + 4 }
+
+// Offset is for computing offsets of type data structures at compile/link time;
+// the target platform may not be the host platform.  Its state includes the
+// current offset, necessary alignment for the sequence of types, and the size
+// of pointers and alignment of slices, interfaces, and strings (this is for tearing-
+// resistant access to these types, if/when that is supported).
+type Offset struct {
+	off        uint64 // the current offset
+	align      uint8  // the required alignmentof the container
+	ptrSize    uint8  // the size of a pointer in bytes
+	sliceAlign uint8  // the alignment of slices (and interfaces and strings)
+}
+
+// NewOffset returns a new Offset with offset 0 and alignment 1.
+func NewOffset(ptrSize uint8, twoWordAlignSlices bool) Offset {
+	if twoWordAlignSlices {
+		return Offset{off: 0, align: 1, ptrSize: ptrSize, sliceAlign: 2 * ptrSize}
+	}
+	return Offset{off: 0, align: 1, ptrSize: ptrSize, sliceAlign: ptrSize}
+}
+
+func assertIsAPowerOfTwo(x uint8) {
+	if x == 0 {
+		panic("Zero is not a power of two")
+	}
+	if x&-x == x {
+		return
+	}
+	panic("Not a power of two")
+}
+
+// InitializedOffset returns a new Offset with specified offset, alignment, pointer size, and slice alignment.
+func InitializedOffset(off int, align uint8, ptrSize uint8, twoWordAlignSlices bool) Offset {
+	assertIsAPowerOfTwo(align)
+	o0 := NewOffset(ptrSize, twoWordAlignSlices)
+	o0.off = uint64(off)
+	o0.align = align
+	return o0
+}
+
+func (o Offset) align_(a uint8) Offset {
+	o.off = (o.off + uint64(a) - 1) & ^(uint64(a) - 1)
+	if o.align < a {
+		o.align = a
+	}
+	return o
+}
+
+// Align returns the offset obtained by aligning offset to a multiple of a.
+// a must be a power of two.
+func (o Offset) Align(a uint8) Offset {
+	assertIsAPowerOfTwo(a)
+	return o.align_(a)
+}
+
+// plus returns the offset obtained by appending a power-of-2-sized-and-aligned object to o.
+func (o Offset) plus(x uint64) Offset {
+	o = o.align_(uint8(x))
+	o.off += x
+	return o
+}
+
+// D8 returns the offset obtained by appending an 8-bit field to o.
+func (o Offset) D8() Offset {
+	return o.plus(1)
+}
+
+// D16 returns the offset obtained by appending a 16-bit field to o.
+func (o Offset) D16() Offset {
+	return o.plus(2)
+}
+
+// D32 returns the offset obtained by appending a 32-bit field to o.
+func (o Offset) D32() Offset {
+	return o.plus(4)
+}
+
+// D64 returns the offset obtained by appending a 64-bit field to o.
+func (o Offset) D64() Offset {
+	return o.plus(8)
+}
+
+// D64 returns the offset obtained by appending a pointer field to o.
+func (o Offset) P() Offset {
+	if o.ptrSize == 0 {
+		panic("This offset has no defined pointer size")
+	}
+	return o.plus(uint64(o.ptrSize))
+}
+
+// Slice returns the offset obtained by appending a slice field to o.
+func (o Offset) Slice() Offset {
+	o = o.align_(o.sliceAlign)
+	o.off += 3 * uint64(o.ptrSize)
+	// There's been discussion of whether slices should be 2-word aligned to allow
+	// use of aligned 2-word load/store to prevent tearing, this is future proofing.
+	// In general, for purposes of struct layout (and very likely default C layout
+	// compatibility) the "size" of a Go type is rounded up to its alignment.
+	return o.Align(o.sliceAlign)
+}
+
+// String returns the offset obtained by appending a string field to o.
+func (o Offset) String() Offset {
+	o = o.align_(o.sliceAlign)
+	o.off += 2 * uint64(o.ptrSize)
+	return o // We "know" it needs no further alignment
+}
+
+// Interface returns the offset obtained by appending an interface field to o.
+func (o Offset) Interface() Offset {
+	o = o.align_(o.sliceAlign)
+	o.off += 2 * uint64(o.ptrSize)
+	return o // We "know" it needs no further alignment
+}
+
+// Offset returns the struct-aligned offset (size) of o.
+// This is at least as large as the current internal offset; it may be larger.
+func (o Offset) Offset() uint64 {
+	return o.Align(o.align).off
+}
+
+func (o Offset) PlusUncommon() Offset {
+	o.off += UncommonSize()
+	return o
+}
+
+// CommonOffset returns the Offset to the data after the common portion of type data structures.
+func CommonOffset(ptrSize int, twoWordAlignSlices bool) Offset {
+	return InitializedOffset(CommonSize(ptrSize), uint8(ptrSize), uint8(ptrSize), twoWordAlignSlices)
+}
diff --git a/src/internal/abi/funcpc.go b/src/internal/abi/funcpc.go
new file mode 100644
index 0000000..e038d36
--- /dev/null
+++ b/src/internal/abi/funcpc.go
@@ -0,0 +1,31 @@
+// Copyright 2023 The Go 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:build !gccgo
+
+package abi
+
+// FuncPC* intrinsics.
+//
+// CAREFUL: In programs with plugins, FuncPC* can return different values
+// for the same function (because there are actually multiple copies of
+// the same function in the address space). To be safe, don't use the
+// results of this function in any == expression. It is only safe to
+// use the result as an address at which to start executing code.
+
+// FuncPCABI0 returns the entry PC of the function f, which must be a
+// direct reference of a function defined as ABI0. Otherwise it is a
+// compile-time error.
+//
+// Implemented as a compile intrinsic.
+func FuncPCABI0(f interface{}) uintptr
+
+// FuncPCABIInternal returns the entry PC of the function f. If f is a
+// direct reference of a function, it must be defined as ABIInternal.
+// Otherwise it is a compile-time error. If f is not a direct reference
+// of a defined function, it assumes that f is a func value. Otherwise
+// the behavior is undefined.
+//
+// Implemented as a compile intrinsic.
+func FuncPCABIInternal(f interface{}) uintptr
diff --git a/src/internal/abi/funcpc_gccgo.go b/src/internal/abi/funcpc_gccgo.go
new file mode 100644
index 0000000..ad5fa52
--- /dev/null
+++ b/src/internal/abi/funcpc_gccgo.go
@@ -0,0 +1,21 @@
+// Copyright 2023 The Go 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 bootstrapping with gccgo.
+
+//go:build gccgo
+
+package abi
+
+import "unsafe"
+
+func FuncPCABI0(f interface{}) uintptr {
+	words := (*[2]unsafe.Pointer)(unsafe.Pointer(&f))
+	return *(*uintptr)(unsafe.Pointer(words[1]))
+}
+
+func FuncPCABIInternal(f interface{}) uintptr {
+	words := (*[2]unsafe.Pointer)(unsafe.Pointer(&f))
+	return *(*uintptr)(unsafe.Pointer(words[1]))
+}
diff --git a/src/internal/abi/map.go b/src/internal/abi/map.go
new file mode 100644
index 0000000..e5b0a0b
--- /dev/null
+++ b/src/internal/abi/map.go
@@ -0,0 +1,14 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package abi
+
+// Map constants common to several packages
+// runtime/runtime-gdb.py:MapTypePrinter contains its own copy
+const (
+	MapBucketCountBits = 3 // log2 of number of elements in a bucket.
+	MapBucketCount     = 1 << MapBucketCountBits
+	MapMaxKeyBytes     = 128 // Must fit in a uint8.
+	MapMaxElemBytes    = 128 // Must fit in a uint8.
+)
diff --git a/src/internal/abi/stack.go b/src/internal/abi/stack.go
new file mode 100644
index 0000000..8e3327e
--- /dev/null
+++ b/src/internal/abi/stack.go
@@ -0,0 +1,33 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package abi
+
+const (
+	// StackNosplitBase is the base maximum number of bytes that a chain of
+	// NOSPLIT functions can use.
+	//
+	// This value must be multiplied by the stack guard multiplier, so do not
+	// use it directly. See runtime/stack.go:stackNosplit and
+	// cmd/internal/objabi/stack.go:StackNosplit.
+	StackNosplitBase = 800
+
+	// We have three different sequences for stack bounds checks, depending on
+	// whether the stack frame of a function is small, big, or huge.
+
+	// After a stack split check the SP is allowed to be StackSmall bytes below
+	// the stack guard.
+	//
+	// Functions that need frames <= StackSmall can perform the stack check
+	// using a single comparison directly between the stack guard and the SP
+	// because we ensure that StackSmall bytes of stack space are available
+	// beyond the stack guard.
+	StackSmall = 128
+
+	// Functions that need frames <= StackBig can assume that neither
+	// SP-framesize nor stackGuard-StackSmall will underflow, and thus use a
+	// more efficient check. In order to ensure this, StackBig must be <= the
+	// size of the unmapped space at zero.
+	StackBig = 4096
+)
diff --git a/src/internal/abi/stub.s b/src/internal/abi/stub.s
new file mode 100644
index 0000000..5bad98d
--- /dev/null
+++ b/src/internal/abi/stub.s
@@ -0,0 +1,7 @@
+// Copyright 2023 The Go 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 silences errors about body-less functions
+// that are provided by intrinsics in the latest version of the compiler,
+// but may not be known to the bootstrap compiler.
diff --git a/src/internal/abi/symtab.go b/src/internal/abi/symtab.go
new file mode 100644
index 0000000..bf6ea82
--- /dev/null
+++ b/src/internal/abi/symtab.go
@@ -0,0 +1,106 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package abi
+
+// A FuncFlag records bits about a function, passed to the runtime.
+type FuncFlag uint8
+
+const (
+	// FuncFlagTopFrame indicates a function that appears at the top of its stack.
+	// The traceback routine stop at such a function and consider that a
+	// successful, complete traversal of the stack.
+	// Examples of TopFrame functions include goexit, which appears
+	// at the top of a user goroutine stack, and mstart, which appears
+	// at the top of a system goroutine stack.
+	FuncFlagTopFrame FuncFlag = 1 << iota
+
+	// FuncFlagSPWrite indicates a function that writes an arbitrary value to SP
+	// (any write other than adding or subtracting a constant amount).
+	// The traceback routines cannot encode such changes into the
+	// pcsp tables, so the function traceback cannot safely unwind past
+	// SPWrite functions. Stopping at an SPWrite function is considered
+	// to be an incomplete unwinding of the stack. In certain contexts
+	// (in particular garbage collector stack scans) that is a fatal error.
+	FuncFlagSPWrite
+
+	// FuncFlagAsm indicates that a function was implemented in assembly.
+	FuncFlagAsm
+)
+
+// A FuncID identifies particular functions that need to be treated
+// specially by the runtime.
+// Note that in some situations involving plugins, there may be multiple
+// copies of a particular special runtime function.
+type FuncID uint8
+
+const (
+	// If you add a FuncID, you probably also want to add an entry to the map in
+	// ../../cmd/internal/objabi/funcid.go
+
+	FuncIDNormal FuncID = iota // not a special function
+	FuncID_abort
+	FuncID_asmcgocall
+	FuncID_asyncPreempt
+	FuncID_cgocallback
+	FuncID_debugCallV2
+	FuncID_gcBgMarkWorker
+	FuncID_goexit
+	FuncID_gogo
+	FuncID_gopanic
+	FuncID_handleAsyncEvent
+	FuncID_mcall
+	FuncID_morestack
+	FuncID_mstart
+	FuncID_panicwrap
+	FuncID_rt0_go
+	FuncID_runfinq
+	FuncID_runtime_main
+	FuncID_sigpanic
+	FuncID_systemstack
+	FuncID_systemstack_switch
+	FuncIDWrapper // any autogenerated code (hash/eq algorithms, method wrappers, etc.)
+)
+
+// ArgsSizeUnknown is set in Func.argsize to mark all functions
+// whose argument size is unknown (C vararg functions, and
+// assembly code without an explicit specification).
+// This value is generated by the compiler, assembler, or linker.
+const ArgsSizeUnknown = -0x80000000
+
+// IDs for PCDATA and FUNCDATA tables in Go binaries.
+//
+// These must agree with ../../../runtime/funcdata.h.
+const (
+	PCDATA_UnsafePoint   = 0
+	PCDATA_StackMapIndex = 1
+	PCDATA_InlTreeIndex  = 2
+	PCDATA_ArgLiveIndex  = 3
+
+	FUNCDATA_ArgsPointerMaps    = 0
+	FUNCDATA_LocalsPointerMaps  = 1
+	FUNCDATA_StackObjects       = 2
+	FUNCDATA_InlTree            = 3
+	FUNCDATA_OpenCodedDeferInfo = 4
+	FUNCDATA_ArgInfo            = 5
+	FUNCDATA_ArgLiveInfo        = 6
+	FUNCDATA_WrapInfo           = 7
+)
+
+// Special values for the PCDATA_UnsafePoint table.
+const (
+	UnsafePointSafe   = -1 // Safe for async preemption
+	UnsafePointUnsafe = -2 // Unsafe for async preemption
+
+	// UnsafePointRestart1(2) apply on a sequence of instructions, within
+	// which if an async preemption happens, we should back off the PC
+	// to the start of the sequence when resuming.
+	// We need two so we can distinguish the start/end of the sequence
+	// in case that two sequences are next to each other.
+	UnsafePointRestart1 = -3
+	UnsafePointRestart2 = -4
+
+	// Like UnsafePointRestart1, but back to function entry if async preempted.
+	UnsafePointRestartAtEntry = -5
+)
diff --git a/src/internal/abi/type.go b/src/internal/abi/type.go
new file mode 100644
index 0000000..4794f5a
--- /dev/null
+++ b/src/internal/abi/type.go
@@ -0,0 +1,712 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package abi
+
+import (
+	"unsafe"
+)
+
+// Type is the runtime representation of a Go type.
+//
+// Type is also referenced implicitly
+// (in the form of expressions involving constants and arch.PtrSize)
+// in cmd/compile/internal/reflectdata/reflect.go
+// and cmd/link/internal/ld/decodesym.go
+// (e.g. data[2*arch.PtrSize+4] references the TFlag field)
+// unsafe.OffsetOf(Type{}.TFlag) cannot be used directly in those
+// places because it varies with cross compilation and experiments.
+type Type struct {
+	Size_       uintptr
+	PtrBytes    uintptr // number of (prefix) bytes in the type that can contain pointers
+	Hash        uint32  // hash of type; avoids computation in hash tables
+	TFlag       TFlag   // extra type information flags
+	Align_      uint8   // alignment of variable with this type
+	FieldAlign_ uint8   // alignment of struct field with this type
+	Kind_       uint8   // enumeration for C
+	// function for comparing objects of this type
+	// (ptr to object A, ptr to object B) -> ==?
+	Equal func(unsafe.Pointer, unsafe.Pointer) bool
+	// GCData stores the GC type data for the garbage collector.
+	// If the KindGCProg bit is set in kind, GCData is a GC program.
+	// Otherwise it is a ptrmask bitmap. See mbitmap.go for details.
+	GCData    *byte
+	Str       NameOff // string form
+	PtrToThis TypeOff // type for pointer to this type, may be zero
+}
+
+// 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
+	Pointer
+	Slice
+	String
+	Struct
+	UnsafePointer
+)
+
+const (
+	// TODO (khr, drchase) why aren't these in TFlag?  Investigate, fix if possible.
+	KindDirectIface = 1 << 5
+	KindGCProg      = 1 << 6 // Type.gc points to GC program
+	KindMask        = (1 << 5) - 1
+)
+
+// TFlag is used by a Type to signal what extra type information is
+// available in the memory directly following the Type value.
+type TFlag uint8
+
+const (
+	// TFlagUncommon means that there is a data with a type, UncommonType,
+	// just beyond the shared-per-type common data.  That is, the data
+	// for struct types will store their UncommonType at one offset, the
+	// data for interface types will store their UncommonType at a different
+	// offset.  UncommonType is always accessed via a pointer that is computed
+	// using trust-us-we-are-the-implementors pointer arithmetic.
+	//
+	// For example, if t.Kind() == Struct and t.tflag&TFlagUncommon != 0,
+	// then t has UncommonType data and it can be accessed as:
+	//
+	//	type structTypeUncommon struct {
+	//		structType
+	//		u UncommonType
+	//	}
+	//	u := &(*structTypeUncommon)(unsafe.Pointer(t)).u
+	TFlagUncommon TFlag = 1 << 0
+
+	// TFlagExtraStar means the name in the str field has an
+	// extraneous '*' prefix. This is because for most types T in
+	// a program, the type *T also exists and reusing the str data
+	// saves binary size.
+	TFlagExtraStar TFlag = 1 << 1
+
+	// TFlagNamed means the type has a name.
+	TFlagNamed TFlag = 1 << 2
+
+	// TFlagRegularMemory means that equal and hash functions can treat
+	// this type as a single region of t.size bytes.
+	TFlagRegularMemory TFlag = 1 << 3
+)
+
+// NameOff is the offset to a name from moduledata.types.  See resolveNameOff in runtime.
+type NameOff int32
+
+// TypeOff is the offset to a type from moduledata.types.  See resolveTypeOff in runtime.
+type TypeOff int32
+
+// TextOff is an offset from the top of a text section.  See (rtype).textOff in runtime.
+type TextOff int32
+
+// String returns the name of k.
+func (k Kind) String() string {
+	if int(k) < len(kindNames) {
+		return kindNames[k]
+	}
+	return kindNames[0]
+}
+
+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",
+	Pointer:       "ptr",
+	Slice:         "slice",
+	String:        "string",
+	Struct:        "struct",
+	UnsafePointer: "unsafe.Pointer",
+}
+
+func (t *Type) Kind() Kind { return Kind(t.Kind_ & KindMask) }
+
+func (t *Type) HasName() bool {
+	return t.TFlag&TFlagNamed != 0
+}
+
+func (t *Type) Pointers() bool { return t.PtrBytes != 0 }
+
+// IfaceIndir reports whether t is stored indirectly in an interface value.
+func (t *Type) IfaceIndir() bool {
+	return t.Kind_&KindDirectIface == 0
+}
+
+// isDirectIface reports whether t is stored directly in an interface value.
+func (t *Type) IsDirectIface() bool {
+	return t.Kind_&KindDirectIface != 0
+}
+
+func (t *Type) GcSlice(begin, end uintptr) []byte {
+	return unsafeSliceFor(t.GCData, int(end))[begin:]
+}
+
+// Method on non-interface type
+type Method struct {
+	Name NameOff // name of method
+	Mtyp TypeOff // method type (without receiver)
+	Ifn  TextOff // fn used in interface call (one-word receiver)
+	Tfn  TextOff // fn used for normal method call
+}
+
+// UncommonType is present only for defined types or types with methods
+// (if T is a defined type, the uncommonTypes for T and *T have methods).
+// Using a pointer to this struct reduces the overall size required
+// to describe a non-defined type with no methods.
+type UncommonType struct {
+	PkgPath NameOff // import path; empty for built-in types like int, string
+	Mcount  uint16  // number of methods
+	Xcount  uint16  // number of exported methods
+	Moff    uint32  // offset from this uncommontype to [mcount]Method
+	_       uint32  // unused
+}
+
+func (t *UncommonType) Methods() []Method {
+	if t.Mcount == 0 {
+		return nil
+	}
+	return (*[1 << 16]Method)(addChecked(unsafe.Pointer(t), uintptr(t.Moff), "t.mcount > 0"))[:t.Mcount:t.Mcount]
+}
+
+func (t *UncommonType) ExportedMethods() []Method {
+	if t.Xcount == 0 {
+		return nil
+	}
+	return (*[1 << 16]Method)(addChecked(unsafe.Pointer(t), uintptr(t.Moff), "t.xcount > 0"))[:t.Xcount:t.Xcount]
+}
+
+// addChecked returns p+x.
+//
+// The whySafe string is ignored, so that the function still inlines
+// as efficiently as p+x, but all call sites should use the string to
+// record why the addition is safe, which is to say why the addition
+// does not cause x to advance to the very end of p's allocation
+// and therefore point incorrectly at the next block in memory.
+func addChecked(p unsafe.Pointer, x uintptr, whySafe string) unsafe.Pointer {
+	return unsafe.Pointer(uintptr(p) + x)
+}
+
+// Imethod represents a method on an interface type
+type Imethod struct {
+	Name NameOff // name of method
+	Typ  TypeOff // .(*FuncType) underneath
+}
+
+// ArrayType represents a fixed array type.
+type ArrayType struct {
+	Type
+	Elem  *Type // array element type
+	Slice *Type // slice type
+	Len   uintptr
+}
+
+// Len returns the length of t if t is an array type, otherwise 0
+func (t *Type) Len() int {
+	if t.Kind() == Array {
+		return int((*ArrayType)(unsafe.Pointer(t)).Len)
+	}
+	return 0
+}
+
+func (t *Type) Common() *Type {
+	return t
+}
+
+type ChanDir int
+
+const (
+	RecvDir    ChanDir = 1 << iota         // <-chan
+	SendDir                                // chan<-
+	BothDir            = RecvDir | SendDir // chan
+	InvalidDir ChanDir = 0
+)
+
+// ChanType represents a channel type
+type ChanType struct {
+	Type
+	Elem *Type
+	Dir  ChanDir
+}
+
+type structTypeUncommon struct {
+	StructType
+	u UncommonType
+}
+
+// ChanDir returns the direction of t if t is a channel type, otherwise InvalidDir (0).
+func (t *Type) ChanDir() ChanDir {
+	if t.Kind() == Chan {
+		ch := (*ChanType)(unsafe.Pointer(t))
+		return ch.Dir
+	}
+	return InvalidDir
+}
+
+// Uncommon returns a pointer to T's "uncommon" data if there is any, otherwise nil
+func (t *Type) Uncommon() *UncommonType {
+	if t.TFlag&TFlagUncommon == 0 {
+		return nil
+	}
+	switch t.Kind() {
+	case Struct:
+		return &(*structTypeUncommon)(unsafe.Pointer(t)).u
+	case Pointer:
+		type u struct {
+			PtrType
+			u UncommonType
+		}
+		return &(*u)(unsafe.Pointer(t)).u
+	case Func:
+		type u struct {
+			FuncType
+			u UncommonType
+		}
+		return &(*u)(unsafe.Pointer(t)).u
+	case Slice:
+		type u struct {
+			SliceType
+			u UncommonType
+		}
+		return &(*u)(unsafe.Pointer(t)).u
+	case Array:
+		type u struct {
+			ArrayType
+			u UncommonType
+		}
+		return &(*u)(unsafe.Pointer(t)).u
+	case Chan:
+		type u struct {
+			ChanType
+			u UncommonType
+		}
+		return &(*u)(unsafe.Pointer(t)).u
+	case Map:
+		type u struct {
+			MapType
+			u UncommonType
+		}
+		return &(*u)(unsafe.Pointer(t)).u
+	case Interface:
+		type u struct {
+			InterfaceType
+			u UncommonType
+		}
+		return &(*u)(unsafe.Pointer(t)).u
+	default:
+		type u struct {
+			Type
+			u UncommonType
+		}
+		return &(*u)(unsafe.Pointer(t)).u
+	}
+}
+
+// Elem returns the element type for t if t is an array, channel, map, pointer, or slice, otherwise nil.
+func (t *Type) Elem() *Type {
+	switch t.Kind() {
+	case Array:
+		tt := (*ArrayType)(unsafe.Pointer(t))
+		return tt.Elem
+	case Chan:
+		tt := (*ChanType)(unsafe.Pointer(t))
+		return tt.Elem
+	case Map:
+		tt := (*MapType)(unsafe.Pointer(t))
+		return tt.Elem
+	case Pointer:
+		tt := (*PtrType)(unsafe.Pointer(t))
+		return tt.Elem
+	case Slice:
+		tt := (*SliceType)(unsafe.Pointer(t))
+		return tt.Elem
+	}
+	return nil
+}
+
+// StructType returns t cast to a *StructType, or nil if its tag does not match.
+func (t *Type) StructType() *StructType {
+	if t.Kind() != Struct {
+		return nil
+	}
+	return (*StructType)(unsafe.Pointer(t))
+}
+
+// MapType returns t cast to a *MapType, or nil if its tag does not match.
+func (t *Type) MapType() *MapType {
+	if t.Kind() != Map {
+		return nil
+	}
+	return (*MapType)(unsafe.Pointer(t))
+}
+
+// ArrayType returns t cast to a *ArrayType, or nil if its tag does not match.
+func (t *Type) ArrayType() *ArrayType {
+	if t.Kind() != Array {
+		return nil
+	}
+	return (*ArrayType)(unsafe.Pointer(t))
+}
+
+// FuncType returns t cast to a *FuncType, or nil if its tag does not match.
+func (t *Type) FuncType() *FuncType {
+	if t.Kind() != Func {
+		return nil
+	}
+	return (*FuncType)(unsafe.Pointer(t))
+}
+
+// InterfaceType returns t cast to a *InterfaceType, or nil if its tag does not match.
+func (t *Type) InterfaceType() *InterfaceType {
+	if t.Kind() != Interface {
+		return nil
+	}
+	return (*InterfaceType)(unsafe.Pointer(t))
+}
+
+// Size returns the size of data with type t.
+func (t *Type) Size() uintptr { return t.Size_ }
+
+// Align returns the alignment of data with type t.
+func (t *Type) Align() int { return int(t.Align_) }
+
+func (t *Type) FieldAlign() int { return int(t.FieldAlign_) }
+
+type InterfaceType struct {
+	Type
+	PkgPath Name      // import path
+	Methods []Imethod // sorted by hash
+}
+
+func (t *Type) ExportedMethods() []Method {
+	ut := t.Uncommon()
+	if ut == nil {
+		return nil
+	}
+	return ut.ExportedMethods()
+}
+
+func (t *Type) NumMethod() int {
+	if t.Kind() == Interface {
+		tt := (*InterfaceType)(unsafe.Pointer(t))
+		return tt.NumMethod()
+	}
+	return len(t.ExportedMethods())
+}
+
+// NumMethod returns the number of interface methods in the type's method set.
+func (t *InterfaceType) NumMethod() int { return len(t.Methods) }
+
+type MapType struct {
+	Type
+	Key    *Type
+	Elem   *Type
+	Bucket *Type // internal type representing a hash bucket
+	// function for hashing keys (ptr to key, seed) -> hash
+	Hasher     func(unsafe.Pointer, uintptr) uintptr
+	KeySize    uint8  // size of key slot
+	ValueSize  uint8  // size of elem slot
+	BucketSize uint16 // size of bucket
+	Flags      uint32
+}
+
+// Note: flag values must match those used in the TMAP case
+// in ../cmd/compile/internal/reflectdata/reflect.go:writeType.
+func (mt *MapType) IndirectKey() bool { // store ptr to key instead of key itself
+	return mt.Flags&1 != 0
+}
+func (mt *MapType) IndirectElem() bool { // store ptr to elem instead of elem itself
+	return mt.Flags&2 != 0
+}
+func (mt *MapType) ReflexiveKey() bool { // true if k==k for all keys
+	return mt.Flags&4 != 0
+}
+func (mt *MapType) NeedKeyUpdate() bool { // true if we need to update key on an overwrite
+	return mt.Flags&8 != 0
+}
+func (mt *MapType) HashMightPanic() bool { // true if hash function might panic
+	return mt.Flags&16 != 0
+}
+
+func (t *Type) Key() *Type {
+	if t.Kind() == Map {
+		return (*MapType)(unsafe.Pointer(t)).Key
+	}
+	return nil
+}
+
+type SliceType struct {
+	Type
+	Elem *Type // slice element type
+}
+
+// funcType represents a function type.
+//
+// A *Type for each in and out parameter is stored in an array that
+// directly follows the funcType (and possibly its uncommonType). So
+// a function type with one method, one input, and one output is:
+//
+//	struct {
+//		funcType
+//		uncommonType
+//		[2]*rtype    // [0] is in, [1] is out
+//	}
+type FuncType struct {
+	Type
+	InCount  uint16
+	OutCount uint16 // top bit is set if last input parameter is ...
+}
+
+func (t *FuncType) In(i int) *Type {
+	return t.InSlice()[i]
+}
+
+func (t *FuncType) NumIn() int {
+	return int(t.InCount)
+}
+
+func (t *FuncType) NumOut() int {
+	return int(t.OutCount & (1<<15 - 1))
+}
+
+func (t *FuncType) Out(i int) *Type {
+	return (t.OutSlice()[i])
+}
+
+func (t *FuncType) InSlice() []*Type {
+	uadd := unsafe.Sizeof(*t)
+	if t.TFlag&TFlagUncommon != 0 {
+		uadd += unsafe.Sizeof(UncommonType{})
+	}
+	if t.InCount == 0 {
+		return nil
+	}
+	return (*[1 << 16]*Type)(addChecked(unsafe.Pointer(t), uadd, "t.inCount > 0"))[:t.InCount:t.InCount]
+}
+func (t *FuncType) OutSlice() []*Type {
+	outCount := uint16(t.NumOut())
+	if outCount == 0 {
+		return nil
+	}
+	uadd := unsafe.Sizeof(*t)
+	if t.TFlag&TFlagUncommon != 0 {
+		uadd += unsafe.Sizeof(UncommonType{})
+	}
+	return (*[1 << 17]*Type)(addChecked(unsafe.Pointer(t), uadd, "outCount > 0"))[t.InCount : t.InCount+outCount : t.InCount+outCount]
+}
+
+func (t *FuncType) IsVariadic() bool {
+	return t.OutCount&(1<<15) != 0
+}
+
+type PtrType struct {
+	Type
+	Elem *Type // pointer element (pointed at) type
+}
+
+type StructField struct {
+	Name   Name    // name is always non-empty
+	Typ    *Type   // type of field
+	Offset uintptr // byte offset of field
+}
+
+func (f *StructField) Embedded() bool {
+	return f.Name.IsEmbedded()
+}
+
+type StructType struct {
+	Type
+	PkgPath Name
+	Fields  []StructField
+}
+
+// Name is an encoded type Name with optional extra data.
+//
+// The first byte is a bit field containing:
+//
+//	1<<0 the name is exported
+//	1<<1 tag data follows the name
+//	1<<2 pkgPath nameOff follows the name and tag
+//	1<<3 the name is of an embedded (a.k.a. anonymous) field
+//
+// Following that, there is a varint-encoded length of the name,
+// followed by the name itself.
+//
+// If tag data is present, it also has a varint-encoded length
+// followed by the tag itself.
+//
+// If the import path follows, then 4 bytes at the end of
+// the data form a nameOff. The import path is only set for concrete
+// methods that are defined in a different package than their type.
+//
+// If a name starts with "*", then the exported bit represents
+// whether the pointed to type is exported.
+//
+// Note: this encoding must match here and in:
+//   cmd/compile/internal/reflectdata/reflect.go
+//   cmd/link/internal/ld/decodesym.go
+
+type Name struct {
+	Bytes *byte
+}
+
+// DataChecked does pointer arithmetic on n's Bytes, and that arithmetic is asserted to
+// be safe for the reason in whySafe (which can appear in a backtrace, etc.)
+func (n Name) DataChecked(off int, whySafe string) *byte {
+	return (*byte)(addChecked(unsafe.Pointer(n.Bytes), uintptr(off), whySafe))
+}
+
+// Data does pointer arithmetic on n's Bytes, and that arithmetic is asserted to
+// be safe because the runtime made the call (other packages use DataChecked)
+func (n Name) Data(off int) *byte {
+	return (*byte)(addChecked(unsafe.Pointer(n.Bytes), uintptr(off), "the runtime doesn't need to give you a reason"))
+}
+
+// IsExported returns "is n exported?"
+func (n Name) IsExported() bool {
+	return (*n.Bytes)&(1<<0) != 0
+}
+
+// HasTag returns true iff there is tag data following this name
+func (n Name) HasTag() bool {
+	return (*n.Bytes)&(1<<1) != 0
+}
+
+// IsEmbedded returns true iff n is embedded (an anonymous field).
+func (n Name) IsEmbedded() bool {
+	return (*n.Bytes)&(1<<3) != 0
+}
+
+// ReadVarint parses a varint as encoded by encoding/binary.
+// It returns the number of encoded bytes and the encoded value.
+func (n Name) ReadVarint(off int) (int, int) {
+	v := 0
+	for i := 0; ; i++ {
+		x := *n.DataChecked(off+i, "read varint")
+		v += int(x&0x7f) << (7 * i)
+		if x&0x80 == 0 {
+			return i + 1, v
+		}
+	}
+}
+
+// IsBlank indicates whether n is "_".
+func (n Name) IsBlank() bool {
+	if n.Bytes == nil {
+		return false
+	}
+	_, l := n.ReadVarint(1)
+	return l == 1 && *n.Data(2) == '_'
+}
+
+// writeVarint writes n to buf in varint form. Returns the
+// number of bytes written. n must be nonnegative.
+// Writes at most 10 bytes.
+func writeVarint(buf []byte, n int) int {
+	for i := 0; ; i++ {
+		b := byte(n & 0x7f)
+		n >>= 7
+		if n == 0 {
+			buf[i] = b
+			return i + 1
+		}
+		buf[i] = b | 0x80
+	}
+}
+
+// Name returns the tag string for n, or empty if there is none.
+func (n Name) Name() string {
+	if n.Bytes == nil {
+		return ""
+	}
+	i, l := n.ReadVarint(1)
+	return unsafeStringFor(n.DataChecked(1+i, "non-empty string"), l)
+}
+
+// Tag returns the tag string for n, or empty if there is none.
+func (n Name) Tag() string {
+	if !n.HasTag() {
+		return ""
+	}
+	i, l := n.ReadVarint(1)
+	i2, l2 := n.ReadVarint(1 + i + l)
+	return unsafeStringFor(n.DataChecked(1+i+l+i2, "non-empty string"), l2)
+}
+
+func NewName(n, tag string, exported, embedded bool) Name {
+	if len(n) >= 1<<29 {
+		panic("abi.NewName: name too long: " + n[:1024] + "...")
+	}
+	if len(tag) >= 1<<29 {
+		panic("abi.NewName: tag too long: " + tag[:1024] + "...")
+	}
+	var nameLen [10]byte
+	var tagLen [10]byte
+	nameLenLen := writeVarint(nameLen[:], len(n))
+	tagLenLen := writeVarint(tagLen[:], len(tag))
+
+	var bits byte
+	l := 1 + nameLenLen + len(n)
+	if exported {
+		bits |= 1 << 0
+	}
+	if len(tag) > 0 {
+		l += tagLenLen + len(tag)
+		bits |= 1 << 1
+	}
+	if embedded {
+		bits |= 1 << 3
+	}
+
+	b := make([]byte, l)
+	b[0] = bits
+	copy(b[1:], nameLen[:nameLenLen])
+	copy(b[1+nameLenLen:], n)
+	if len(tag) > 0 {
+		tb := b[1+nameLenLen+len(n):]
+		copy(tb, tagLen[:tagLenLen])
+		copy(tb[tagLenLen:], tag)
+	}
+
+	return Name{Bytes: &b[0]}
+}
diff --git a/src/internal/abi/unsafestring_go119.go b/src/internal/abi/unsafestring_go119.go
new file mode 100644
index 0000000..a710384
--- /dev/null
+++ b/src/internal/abi/unsafestring_go119.go
@@ -0,0 +1,32 @@
+// Copyright 2023 The Go 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:build !go1.20
+// +build !go1.20
+
+package abi
+
+import "unsafe"
+
+type (
+	stringHeader struct {
+		Data *byte
+		Len  int
+	}
+	sliceHeader struct {
+		Data *byte
+		Len  int
+		Cap  int
+	}
+)
+
+func unsafeStringFor(b *byte, l int) string {
+	h := stringHeader{Data: b, Len: l}
+	return *(*string)(unsafe.Pointer(&h))
+}
+
+func unsafeSliceFor(b *byte, l int) []byte {
+	h := sliceHeader{Data: b, Len: l, Cap: l}
+	return *(*[]byte)(unsafe.Pointer(&h))
+}
diff --git a/src/internal/abi/unsafestring_go120.go b/src/internal/abi/unsafestring_go120.go
new file mode 100644
index 0000000..93ff8ea
--- /dev/null
+++ b/src/internal/abi/unsafestring_go120.go
@@ -0,0 +1,18 @@
+// Copyright 2023 The Go 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:build go1.20
+// +build go1.20
+
+package abi
+
+import "unsafe"
+
+func unsafeStringFor(b *byte, l int) string {
+	return unsafe.String(b, l)
+}
+
+func unsafeSliceFor(b *byte, l int) []byte {
+	return unsafe.Slice(b, l)
+}
diff --git a/src/internal/bisect/bisect.go b/src/internal/bisect/bisect.go
new file mode 100644
index 0000000..48c796e
--- /dev/null
+++ b/src/internal/bisect/bisect.go
@@ -0,0 +1,795 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package bisect can be used by compilers and other programs
+// to serve as a target for the bisect debugging tool.
+// See [golang.org/x/tools/cmd/bisect] for details about using the tool.
+//
+// To be a bisect target, allowing bisect to help determine which of a set of independent
+// changes provokes a failure, a program needs to:
+//
+//  1. Define a way to accept a change pattern on its command line or in its environment.
+//     The most common mechanism is a command-line flag.
+//     The pattern can be passed to [New] to create a [Matcher], the compiled form of a pattern.
+//
+//  2. Assign each change a unique ID. One possibility is to use a sequence number,
+//     but the most common mechanism is to hash some kind of identifying information
+//     like the file and line number where the change might be applied.
+//     [Hash] hashes its arguments to compute an ID.
+//
+//  3. Enable each change that the pattern says should be enabled.
+//     The [Matcher.ShouldEnable] method answers this question for a given change ID.
+//
+//  4. Print a report identifying each change that the pattern says should be printed.
+//     The [Matcher.ShouldPrint] method answers this question for a given change ID.
+//     The report consists of one more lines on standard error or standard output
+//     that contain a “match marker”. [Marker] returns the match marker for a given ID.
+//     When bisect reports a change as causing the failure, it identifies the change
+//     by printing the report lines with the match marker removed.
+//
+// # Example Usage
+//
+// A program starts by defining how it receives the pattern. In this example, we will assume a flag.
+// The next step is to compile the pattern:
+//
+//	m, err := bisect.New(patternFlag)
+//	if err != nil {
+//		log.Fatal(err)
+//	}
+//
+// Then, each time a potential change is considered, the program computes
+// a change ID by hashing identifying information (source file and line, in this case)
+// and then calls m.ShouldPrint and m.ShouldEnable to decide whether to
+// print and enable the change, respectively. The two can return different values
+// depending on whether bisect is trying to find a minimal set of changes to
+// disable or to enable to provoke the failure.
+//
+// It is usually helpful to write a helper function that accepts the identifying information
+// and then takes care of hashing, printing, and reporting whether the identified change
+// should be enabled. For example, a helper for changes identified by a file and line number
+// would be:
+//
+//	func ShouldEnable(file string, line int) {
+//		h := bisect.Hash(file, line)
+//		if m.ShouldPrint(h) {
+//			fmt.Fprintf(os.Stderr, "%v %s:%d\n", bisect.Marker(h), file, line)
+//		}
+//		return m.ShouldEnable(h)
+//	}
+//
+// Finally, note that New returns a nil Matcher when there is no pattern,
+// meaning that the target is not running under bisect at all,
+// so all changes should be enabled and none should be printed.
+// In that common case, the computation of the hash can be avoided entirely
+// by checking for m == nil first:
+//
+//	func ShouldEnable(file string, line int) bool {
+//		if m == nil {
+//			return false
+//		}
+//		h := bisect.Hash(file, line)
+//		if m.ShouldPrint(h) {
+//			fmt.Fprintf(os.Stderr, "%v %s:%d\n", bisect.Marker(h), file, line)
+//		}
+//		return m.ShouldEnable(h)
+//	}
+//
+// When the identifying information is expensive to format, this code can call
+// [Matcher.MarkerOnly] to find out whether short report lines containing only the
+// marker are permitted for a given run. (Bisect permits such lines when it is
+// still exploring the space of possible changes and will not be showing the
+// output to the user.) If so, the client can choose to print only the marker:
+//
+//	func ShouldEnable(file string, line int) bool {
+//		if m == nil {
+//			return false
+//		}
+//		h := bisect.Hash(file, line)
+//		if m.ShouldPrint(h) {
+//			if m.MarkerOnly() {
+//				bisect.PrintMarker(os.Stderr)
+//			} else {
+//				fmt.Fprintf(os.Stderr, "%v %s:%d\n", bisect.Marker(h), file, line)
+//			}
+//		}
+//		return m.ShouldEnable(h)
+//	}
+//
+// This specific helper – deciding whether to enable a change identified by
+// file and line number and printing about the change when necessary – is
+// provided by the [Matcher.FileLine] method.
+//
+// Another common usage is deciding whether to make a change in a function
+// based on the caller's stack, to identify the specific calling contexts that the
+// change breaks. The [Matcher.Stack] method takes care of obtaining the stack,
+// printing it when necessary, and reporting whether to enable the change
+// based on that stack.
+//
+// # Pattern Syntax
+//
+// Patterns are generated by the bisect tool and interpreted by [New].
+// Users should not have to understand the patterns except when
+// debugging a target's bisect support or debugging the bisect tool itself.
+//
+// The pattern syntax selecting a change is a sequence of bit strings
+// separated by + and - operators. Each bit string denotes the set of
+// changes with IDs ending in those bits, + is set addition, - is set subtraction,
+// and the expression is evaluated in the usual left-to-right order.
+// The special binary number “y” denotes the set of all changes,
+// standing in for the empty bit string.
+// In the expression, all the + operators must appear before all the - operators.
+// A leading + adds to an empty set. A leading - subtracts from the set of all
+// possible suffixes.
+//
+// For example:
+//
+//   - “01+10” and “+01+10” both denote the set of changes
+//     with IDs ending with the bits 01 or 10.
+//
+//   - “01+10-1001” denotes the set of changes with IDs
+//     ending with the bits 01 or 10, but excluding those ending in 1001.
+//
+//   - “-01-1000” and “y-01-1000 both denote the set of all changes
+//     with IDs not ending in 01 nor 1000.
+//
+//   - “0+1-01+001” is not a valid pattern, because all the + operators do not
+//     appear before all the - operators.
+//
+// In the syntaxes described so far, the pattern specifies the changes to
+// enable and report. If a pattern is prefixed by a “!”, the meaning
+// changes: the pattern specifies the changes to DISABLE and report. This
+// mode of operation is needed when a program passes with all changes
+// enabled but fails with no changes enabled. In this case, bisect
+// searches for minimal sets of changes to disable.
+// Put another way, the leading “!” inverts the result from [Matcher.ShouldEnable]
+// but does not invert the result from [Matcher.ShouldPrint].
+//
+// As a convenience for manual debugging, “n” is an alias for “!y”,
+// meaning to disable and report all changes.
+//
+// Finally, a leading “v” in the pattern indicates that the reports will be shown
+// to the user of bisect to describe the changes involved in a failure.
+// At the API level, the leading “v” causes [Matcher.Visible] to return true.
+// See the next section for details.
+//
+// # Match Reports
+//
+// The target program must enable only those changed matched
+// by the pattern, and it must print a match report for each such change.
+// A match report consists of one or more lines of text that will be
+// printed by the bisect tool to describe a change implicated in causing
+// a failure. Each line in the report for a given change must contain a
+// match marker with that change ID, as returned by [Marker].
+// The markers are elided when displaying the lines to the user.
+//
+// A match marker has the form “[bisect-match 0x1234]” where
+// 0x1234 is the change ID in hexadecimal.
+// An alternate form is “[bisect-match 010101]”, giving the change ID in binary.
+//
+// When [Matcher.Visible] returns false, the match reports are only
+// being processed by bisect to learn the set of enabled changes,
+// not shown to the user, meaning that each report can be a match
+// marker on a line by itself, eliding the usual textual description.
+// When the textual description is expensive to compute,
+// checking [Matcher.Visible] can help the avoid that expense
+// in most runs.
+package bisect
+
+import (
+	"runtime"
+	"sync"
+	"sync/atomic"
+	"unsafe"
+)
+
+// New creates and returns a new Matcher implementing the given pattern.
+// The pattern syntax is defined in the package doc comment.
+//
+// In addition to the pattern syntax syntax, New("") returns nil, nil.
+// The nil *Matcher is valid for use: it returns true from ShouldEnable
+// and false from ShouldPrint for all changes. Callers can avoid calling
+// [Hash], [Matcher.ShouldEnable], and [Matcher.ShouldPrint] entirely
+// when they recognize the nil Matcher.
+func New(pattern string) (*Matcher, error) {
+	if pattern == "" {
+		return nil, nil
+	}
+
+	m := new(Matcher)
+
+	p := pattern
+	// Special case for leading 'q' so that 'qn' quietly disables, e.g. fmahash=qn to disable fma
+	// Any instance of 'v' disables 'q'.
+	if len(p) > 0 && p[0] == 'q' {
+		m.quiet = true
+		p = p[1:]
+		if p == "" {
+			return nil, &parseError{"invalid pattern syntax: " + pattern}
+		}
+	}
+	// Allow multiple v, so that “bisect cmd vPATTERN” can force verbose all the time.
+	for len(p) > 0 && p[0] == 'v' {
+		m.verbose = true
+		m.quiet = false
+		p = p[1:]
+		if p == "" {
+			return nil, &parseError{"invalid pattern syntax: " + pattern}
+		}
+	}
+
+	// Allow multiple !, each negating the last, so that “bisect cmd !PATTERN” works
+	// even when bisect chooses to add its own !.
+	m.enable = true
+	for len(p) > 0 && p[0] == '!' {
+		m.enable = !m.enable
+		p = p[1:]
+		if p == "" {
+			return nil, &parseError{"invalid pattern syntax: " + pattern}
+		}
+	}
+
+	if p == "n" {
+		// n is an alias for !y.
+		m.enable = !m.enable
+		p = "y"
+	}
+
+	// Parse actual pattern syntax.
+	result := true
+	bits := uint64(0)
+	start := 0
+	wid := 1 // 1-bit (binary); sometimes 4-bit (hex)
+	for i := 0; i <= len(p); i++ {
+		// Imagine a trailing - at the end of the pattern to flush final suffix
+		c := byte('-')
+		if i < len(p) {
+			c = p[i]
+		}
+		if i == start && wid == 1 && c == 'x' { // leading x for hex
+			start = i + 1
+			wid = 4
+			continue
+		}
+		switch c {
+		default:
+			return nil, &parseError{"invalid pattern syntax: " + pattern}
+		case '2', '3', '4', '5', '6', '7', '8', '9':
+			if wid != 4 {
+				return nil, &parseError{"invalid pattern syntax: " + pattern}
+			}
+			fallthrough
+		case '0', '1':
+			bits <<= wid
+			bits |= uint64(c - '0')
+		case 'a', 'b', 'c', 'd', 'e', 'f', 'A', 'B', 'C', 'D', 'E', 'F':
+			if wid != 4 {
+				return nil, &parseError{"invalid pattern syntax: " + pattern}
+			}
+			bits <<= 4
+			bits |= uint64(c&^0x20 - 'A' + 10)
+		case 'y':
+			if i+1 < len(p) && (p[i+1] == '0' || p[i+1] == '1') {
+				return nil, &parseError{"invalid pattern syntax: " + pattern}
+			}
+			bits = 0
+		case '+', '-':
+			if c == '+' && result == false {
+				// Have already seen a -. Should be - from here on.
+				return nil, &parseError{"invalid pattern syntax (+ after -): " + pattern}
+			}
+			if i > 0 {
+				n := (i - start) * wid
+				if n > 64 {
+					return nil, &parseError{"pattern bits too long: " + pattern}
+				}
+				if n <= 0 {
+					return nil, &parseError{"invalid pattern syntax: " + pattern}
+				}
+				if p[start] == 'y' {
+					n = 0
+				}
+				mask := uint64(1)<<n - 1
+				m.list = append(m.list, cond{mask, bits, result})
+			} else if c == '-' {
+				// leading - subtracts from complete set
+				m.list = append(m.list, cond{0, 0, true})
+			}
+			bits = 0
+			result = c == '+'
+			start = i + 1
+			wid = 1
+		}
+	}
+	return m, nil
+}
+
+// A Matcher is the parsed, compiled form of a PATTERN string.
+// The nil *Matcher is valid: it has all changes enabled but none reported.
+type Matcher struct {
+	verbose bool   // annotate reporting with human-helpful information
+	quiet   bool   // disables all reporting.  reset if verbose is true. use case is -d=fmahash=qn
+	enable  bool   // when true, list is for “enable and report” (when false, “disable and report”)
+	list    []cond // conditions; later ones win over earlier ones
+	dedup   atomicPointerDedup
+}
+
+// atomicPointerDedup is an atomic.Pointer[dedup],
+// but we are avoiding using Go 1.19's atomic.Pointer
+// until the bootstrap toolchain can be relied upon to have it.
+type atomicPointerDedup struct {
+	p unsafe.Pointer
+}
+
+func (p *atomicPointerDedup) Load() *dedup {
+	return (*dedup)(atomic.LoadPointer(&p.p))
+}
+
+func (p *atomicPointerDedup) CompareAndSwap(old, new *dedup) bool {
+	return atomic.CompareAndSwapPointer(&p.p, unsafe.Pointer(old), unsafe.Pointer(new))
+}
+
+// A cond is a single condition in the matcher.
+// Given an input id, if id&mask == bits, return the result.
+type cond struct {
+	mask   uint64
+	bits   uint64
+	result bool
+}
+
+// MarkerOnly reports whether it is okay to print only the marker for
+// a given change, omitting the identifying information.
+// MarkerOnly returns true when bisect is using the printed reports
+// only for an intermediate search step, not for showing to users.
+func (m *Matcher) MarkerOnly() bool {
+	return !m.verbose
+}
+
+// ShouldEnable reports whether the change with the given id should be enabled.
+func (m *Matcher) ShouldEnable(id uint64) bool {
+	if m == nil {
+		return true
+	}
+	return m.matchResult(id) == m.enable
+}
+
+// ShouldPrint reports whether to print identifying information about the change with the given id.
+func (m *Matcher) ShouldPrint(id uint64) bool {
+	if m == nil || m.quiet {
+		return false
+	}
+	return m.matchResult(id)
+}
+
+// matchResult returns the result from the first condition that matches id.
+func (m *Matcher) matchResult(id uint64) bool {
+	for i := len(m.list) - 1; i >= 0; i-- {
+		c := &m.list[i]
+		if id&c.mask == c.bits {
+			return c.result
+		}
+	}
+	return false
+}
+
+// FileLine reports whether the change identified by file and line should be enabled.
+// If the change should be printed, FileLine prints a one-line report to w.
+func (m *Matcher) FileLine(w Writer, file string, line int) bool {
+	if m == nil {
+		return true
+	}
+	return m.fileLine(w, file, line)
+}
+
+// fileLine does the real work for FileLine.
+// This lets FileLine's body handle m == nil and potentially be inlined.
+func (m *Matcher) fileLine(w Writer, file string, line int) bool {
+	h := Hash(file, line)
+	if m.ShouldPrint(h) {
+		if m.MarkerOnly() {
+			PrintMarker(w, h)
+		} else {
+			printFileLine(w, h, file, line)
+		}
+	}
+	return m.ShouldEnable(h)
+}
+
+// printFileLine prints a non-marker-only report for file:line to w.
+func printFileLine(w Writer, h uint64, file string, line int) error {
+	const markerLen = 40 // overestimate
+	b := make([]byte, 0, markerLen+len(file)+24)
+	b = AppendMarker(b, h)
+	b = appendFileLine(b, file, line)
+	b = append(b, '\n')
+	_, err := w.Write(b)
+	return err
+}
+
+// appendFileLine appends file:line to dst, returning the extended slice.
+func appendFileLine(dst []byte, file string, line int) []byte {
+	dst = append(dst, file...)
+	dst = append(dst, ':')
+	u := uint(line)
+	if line < 0 {
+		dst = append(dst, '-')
+		u = -u
+	}
+	var buf [24]byte
+	i := len(buf)
+	for i == len(buf) || u > 0 {
+		i--
+		buf[i] = '0' + byte(u%10)
+		u /= 10
+	}
+	dst = append(dst, buf[i:]...)
+	return dst
+}
+
+// MatchStack assigns the current call stack a change ID.
+// If the stack should be printed, MatchStack prints it.
+// Then MatchStack reports whether a change at the current call stack should be enabled.
+func (m *Matcher) Stack(w Writer) bool {
+	if m == nil {
+		return true
+	}
+	return m.stack(w)
+}
+
+// stack does the real work for Stack.
+// This lets stack's body handle m == nil and potentially be inlined.
+func (m *Matcher) stack(w Writer) bool {
+	const maxStack = 16
+	var stk [maxStack]uintptr
+	n := runtime.Callers(2, stk[:])
+	// caller #2 is not for printing; need it to normalize PCs if ASLR.
+	if n <= 1 {
+		return false
+	}
+
+	base := stk[0]
+	// normalize PCs
+	for i := range stk[:n] {
+		stk[i] -= base
+	}
+
+	h := Hash(stk[:n])
+	if m.ShouldPrint(h) {
+		var d *dedup
+		for {
+			d = m.dedup.Load()
+			if d != nil {
+				break
+			}
+			d = new(dedup)
+			if m.dedup.CompareAndSwap(nil, d) {
+				break
+			}
+		}
+
+		if m.MarkerOnly() {
+			if !d.seenLossy(h) {
+				PrintMarker(w, h)
+			}
+		} else {
+			if !d.seen(h) {
+				// Restore PCs in stack for printing
+				for i := range stk[:n] {
+					stk[i] += base
+				}
+				printStack(w, h, stk[1:n])
+			}
+		}
+	}
+	return m.ShouldEnable(h)
+
+}
+
+// Writer is the same interface as io.Writer.
+// It is duplicated here to avoid importing io.
+type Writer interface {
+	Write([]byte) (int, error)
+}
+
+// PrintMarker prints to w a one-line report containing only the marker for h.
+// It is appropriate to use when [Matcher.ShouldPrint] and [Matcher.MarkerOnly] both return true.
+func PrintMarker(w Writer, h uint64) error {
+	var buf [50]byte
+	b := AppendMarker(buf[:], h)
+	b = append(b, '\n')
+	_, err := w.Write(b)
+	return err
+}
+
+// printStack prints to w a multi-line report containing a formatting of the call stack stk,
+// with each line preceded by the marker for h.
+func printStack(w Writer, h uint64, stk []uintptr) error {
+	buf := make([]byte, 0, 2048)
+
+	var prefixBuf [100]byte
+	prefix := AppendMarker(prefixBuf[:0], h)
+
+	frames := runtime.CallersFrames(stk)
+	for {
+		f, more := frames.Next()
+		buf = append(buf, prefix...)
+		buf = append(buf, f.Func.Name()...)
+		buf = append(buf, "()\n"...)
+		buf = append(buf, prefix...)
+		buf = append(buf, '\t')
+		buf = appendFileLine(buf, f.File, f.Line)
+		buf = append(buf, '\n')
+		if !more {
+			break
+		}
+	}
+	buf = append(buf, prefix...)
+	buf = append(buf, '\n')
+	_, err := w.Write(buf)
+	return err
+}
+
+// Marker returns the match marker text to use on any line reporting details
+// about a match of the given ID.
+// It always returns the hexadecimal format.
+func Marker(id uint64) string {
+	return string(AppendMarker(nil, id))
+}
+
+// AppendMarker is like [Marker] but appends the marker to dst.
+func AppendMarker(dst []byte, id uint64) []byte {
+	const prefix = "[bisect-match 0x"
+	var buf [len(prefix) + 16 + 1]byte
+	copy(buf[:], prefix)
+	for i := 0; i < 16; i++ {
+		buf[len(prefix)+i] = "0123456789abcdef"[id>>60]
+		id <<= 4
+	}
+	buf[len(prefix)+16] = ']'
+	return append(dst, buf[:]...)
+}
+
+// CutMarker finds the first match marker in line and removes it,
+// returning the shortened line (with the marker removed),
+// the ID from the match marker,
+// and whether a marker was found at all.
+// If there is no marker, CutMarker returns line, 0, false.
+func CutMarker(line string) (short string, id uint64, ok bool) {
+	// Find first instance of prefix.
+	prefix := "[bisect-match "
+	i := 0
+	for ; ; i++ {
+		if i >= len(line)-len(prefix) {
+			return line, 0, false
+		}
+		if line[i] == '[' && line[i:i+len(prefix)] == prefix {
+			break
+		}
+	}
+
+	// Scan to ].
+	j := i + len(prefix)
+	for j < len(line) && line[j] != ']' {
+		j++
+	}
+	if j >= len(line) {
+		return line, 0, false
+	}
+
+	// Parse id.
+	idstr := line[i+len(prefix) : j]
+	if len(idstr) >= 3 && idstr[:2] == "0x" {
+		// parse hex
+		if len(idstr) > 2+16 { // max 0x + 16 digits
+			return line, 0, false
+		}
+		for i := 2; i < len(idstr); i++ {
+			id <<= 4
+			switch c := idstr[i]; {
+			case '0' <= c && c <= '9':
+				id |= uint64(c - '0')
+			case 'a' <= c && c <= 'f':
+				id |= uint64(c - 'a' + 10)
+			case 'A' <= c && c <= 'F':
+				id |= uint64(c - 'A' + 10)
+			}
+		}
+	} else {
+		if idstr == "" || len(idstr) > 64 { // min 1 digit, max 64 digits
+			return line, 0, false
+		}
+		// parse binary
+		for i := 0; i < len(idstr); i++ {
+			id <<= 1
+			switch c := idstr[i]; c {
+			default:
+				return line, 0, false
+			case '0', '1':
+				id |= uint64(c - '0')
+			}
+		}
+	}
+
+	// Construct shortened line.
+	// Remove at most one space from around the marker,
+	// so that "foo [marker] bar" shortens to "foo bar".
+	j++ // skip ]
+	if i > 0 && line[i-1] == ' ' {
+		i--
+	} else if j < len(line) && line[j] == ' ' {
+		j++
+	}
+	short = line[:i] + line[j:]
+	return short, id, true
+}
+
+// Hash computes a hash of the data arguments,
+// each of which must be of type string, byte, int, uint, int32, uint32, int64, uint64, uintptr, or a slice of one of those types.
+func Hash(data ...any) uint64 {
+	h := offset64
+	for _, v := range data {
+		switch v := v.(type) {
+		default:
+			// Note: Not printing the type, because reflect.ValueOf(v)
+			// would make the interfaces prepared by the caller escape
+			// and therefore allocate. This way, Hash(file, line) runs
+			// without any allocation. It should be clear from the
+			// source code calling Hash what the bad argument was.
+			panic("bisect.Hash: unexpected argument type")
+		case string:
+			h = fnvString(h, v)
+		case byte:
+			h = fnv(h, v)
+		case int:
+			h = fnvUint64(h, uint64(v))
+		case uint:
+			h = fnvUint64(h, uint64(v))
+		case int32:
+			h = fnvUint32(h, uint32(v))
+		case uint32:
+			h = fnvUint32(h, v)
+		case int64:
+			h = fnvUint64(h, uint64(v))
+		case uint64:
+			h = fnvUint64(h, v)
+		case uintptr:
+			h = fnvUint64(h, uint64(v))
+		case []string:
+			for _, x := range v {
+				h = fnvString(h, x)
+			}
+		case []byte:
+			for _, x := range v {
+				h = fnv(h, x)
+			}
+		case []int:
+			for _, x := range v {
+				h = fnvUint64(h, uint64(x))
+			}
+		case []uint:
+			for _, x := range v {
+				h = fnvUint64(h, uint64(x))
+			}
+		case []int32:
+			for _, x := range v {
+				h = fnvUint32(h, uint32(x))
+			}
+		case []uint32:
+			for _, x := range v {
+				h = fnvUint32(h, x)
+			}
+		case []int64:
+			for _, x := range v {
+				h = fnvUint64(h, uint64(x))
+			}
+		case []uint64:
+			for _, x := range v {
+				h = fnvUint64(h, x)
+			}
+		case []uintptr:
+			for _, x := range v {
+				h = fnvUint64(h, uint64(x))
+			}
+		}
+	}
+	return h
+}
+
+// Trivial error implementation, here to avoid importing errors.
+
+// parseError is a trivial error implementation,
+// defined here to avoid importing errors.
+type parseError struct{ text string }
+
+func (e *parseError) Error() string { return e.text }
+
+// FNV-1a implementation. See Go's hash/fnv/fnv.go.
+// Copied here for simplicity (can handle integers more directly)
+// and to avoid importing hash/fnv.
+
+const (
+	offset64 uint64 = 14695981039346656037
+	prime64  uint64 = 1099511628211
+)
+
+func fnv(h uint64, x byte) uint64 {
+	h ^= uint64(x)
+	h *= prime64
+	return h
+}
+
+func fnvString(h uint64, x string) uint64 {
+	for i := 0; i < len(x); i++ {
+		h ^= uint64(x[i])
+		h *= prime64
+	}
+	return h
+}
+
+func fnvUint64(h uint64, x uint64) uint64 {
+	for i := 0; i < 8; i++ {
+		h ^= uint64(x & 0xFF)
+		x >>= 8
+		h *= prime64
+	}
+	return h
+}
+
+func fnvUint32(h uint64, x uint32) uint64 {
+	for i := 0; i < 4; i++ {
+		h ^= uint64(x & 0xFF)
+		x >>= 8
+		h *= prime64
+	}
+	return h
+}
+
+// A dedup is a deduplicator for call stacks, so that we only print
+// a report for new call stacks, not for call stacks we've already
+// reported.
+//
+// It has two modes: an approximate but lock-free mode that
+// may still emit some duplicates, and a precise mode that uses
+// a lock and never emits duplicates.
+type dedup struct {
+	// 128-entry 4-way, lossy cache for seenLossy
+	recent [128][4]uint64
+
+	// complete history for seen
+	mu sync.Mutex
+	m  map[uint64]bool
+}
+
+// seen records that h has now been seen and reports whether it was seen before.
+// When seen returns false, the caller is expected to print a report for h.
+func (d *dedup) seen(h uint64) bool {
+	d.mu.Lock()
+	if d.m == nil {
+		d.m = make(map[uint64]bool)
+	}
+	seen := d.m[h]
+	d.m[h] = true
+	d.mu.Unlock()
+	return seen
+}
+
+// seenLossy is a variant of seen that avoids a lock by using a cache of recently seen hashes.
+// Each cache entry is N-way set-associative: h can appear in any of the slots.
+// If h does not appear in any of them, then it is inserted into a random slot,
+// overwriting whatever was there before.
+func (d *dedup) seenLossy(h uint64) bool {
+	cache := &d.recent[uint(h)%uint(len(d.recent))]
+	for i := 0; i < len(cache); i++ {
+		if atomic.LoadUint64(&cache[i]) == h {
+			return true
+		}
+	}
+
+	// Compute index in set to evict as hash of current set.
+	ch := offset64
+	for _, x := range cache {
+		ch = fnvUint64(ch, x)
+	}
+	atomic.StoreUint64(&cache[uint(ch)%uint(len(cache))], h)
+	return false
+}
diff --git a/src/internal/buildcfg/cfg.go b/src/internal/buildcfg/cfg.go
index a0736aa..b97b9c1 100644
--- a/src/internal/buildcfg/cfg.go
+++ b/src/internal/buildcfg/cfg.go
@@ -16,6 +16,7 @@
 	"os"
 	"path/filepath"
 	"runtime"
+	"strconv"
 	"strings"
 )
 
@@ -181,7 +182,7 @@
 	case "amd64":
 		return "GOAMD64", fmt.Sprintf("v%d", GOAMD64)
 	case "arm":
-		return "GOARM", fmt.Sprintf("%d", GOARM)
+		return "GOARM", strconv.Itoa(GOARM)
 	case "mips", "mipsle":
 		return "GOMIPS", GOMIPS
 	case "mips64", "mips64le":
diff --git a/src/internal/buildcfg/exp.go b/src/internal/buildcfg/exp.go
index 71f8f56..513070c 100644
--- a/src/internal/buildcfg/exp.go
+++ b/src/internal/buildcfg/exp.go
@@ -70,7 +70,6 @@
 	baseline := goexperiment.Flags{
 		RegabiWrappers:   regabiSupported,
 		RegabiArgs:       regabiSupported,
-		Unified:          true,
 		CoverageRedesign: true,
 	}
 
diff --git a/src/internal/bytealg/bytealg.go b/src/internal/bytealg/bytealg.go
index ebebce7..28f2742 100644
--- a/src/internal/bytealg/bytealg.go
+++ b/src/internal/bytealg/bytealg.go
@@ -148,3 +148,8 @@
 	}
 	return -1
 }
+
+// MakeNoZero makes a slice of length and capacity n without zeroing the bytes.
+// It is the caller's responsibility to ensure uninitialized bytes
+// do not leak to the end user.
+func MakeNoZero(n int) []byte
diff --git a/src/internal/bytealg/compare_loong64.s b/src/internal/bytealg/compare_loong64.s
index 54c2dab..c89c5a9 100644
--- a/src/internal/bytealg/compare_loong64.s
+++ b/src/internal/bytealg/compare_loong64.s
@@ -48,6 +48,7 @@
 	AND	$7, R15
 	BNE	R0, R15, byte_loop
 
+	PCALIGN	$16
 chunk16_loop:
 	BEQ	R0, R14, byte_loop
 	MOVV	(R6), R8
diff --git a/src/internal/bytealg/compare_ppc64x.s b/src/internal/bytealg/compare_ppc64x.s
index cbe0525..63c33ee 100644
--- a/src/internal/bytealg/compare_ppc64x.s
+++ b/src/internal/bytealg/compare_ppc64x.s
@@ -7,37 +7,62 @@
 #include "go_asm.h"
 #include "textflag.h"
 
+// Helper names for x-form loads in BE ordering.
+#ifdef  GOARCH_ppc64le
+#define _LDBEX	MOVDBR
+#define _LWBEX	MOVWBR
+#define _LHBEX	MOVHBR
+#else
+#define _LDBEX	MOVD
+#define _LWBEX	MOVW
+#define _LHBEX	MOVH
+#endif
+
+#ifdef GOPPC64_power9
+#define SETB_CR0(rout) SETB CR0, rout
+#define SETB_CR1(rout) SETB CR1, rout
+#define SETB_INIT()
+#define SETB_CR0_NE(rout) SETB_CR0(rout)
+#else
+// A helper macro to emulate SETB on P8. This assumes
+// -1 is in R20, and 1 is in R21. crxlt and crxeq must
+// also be the same CR field.
+#define _SETB(crxlt, crxeq, rout) \
+	ISEL	crxeq,R0,R21,rout \
+	ISEL	crxlt,R20,rout,rout
+
+// A special case when it is know the comparison
+// will always be not equal. The result must be -1 or 1.
+#define SETB_CR0_NE(rout) \
+	ISEL	CR0LT,R20,R21,rout
+
+#define SETB_CR0(rout) _SETB(CR0LT, CR0EQ, rout)
+#define SETB_CR1(rout) _SETB(CR1LT, CR1EQ, rout)
+#define SETB_INIT() \
+	MOVD	$-1,R20 \
+	MOVD	$1,R21
+#endif
+
 TEXT ·Compare<ABIInternal>(SB),NOSPLIT|NOFRAME,$0-56
 	// incoming:
-	// R3 a addr -> R5
-	// R4 a len  -> R3
-	// R5 a cap unused
-	// R6 b addr -> R6
-	// R7 b len  -> R4
-	// R8 b cap unused
-	MOVD	R3, R5
-	MOVD	R4, R3
-	MOVD	R7, R4
-	CMP     R5,R6,CR7
-	CMP	R3,R4,CR6
-	BEQ	CR7,equal
-	MOVBZ	internal∕cpu·PPC64+const_offsetPPC64HasPOWER9(SB), R16
-	CMP	R16,$1
-	BNE	power8
-	BR	cmpbodyp9<>(SB)
-power8:
+	// R3 a addr
+	// R4 a len
+	// R6 b addr
+	// R7 b len
+	//
+	// on entry to cmpbody:
+	// R3 return value if len(a) == len(b)
+	// R5 a addr
+	// R6 b addr
+	// R9 min(len(a),len(b))
+	SETB_INIT()
+	MOVD	R3,R5
+	CMP	R4,R7,CR0
+	CMP	R3,R6,CR7
+	ISEL	CR0LT,R4,R7,R9
+	SETB_CR0(R3)
+	BC	$12,30,LR	// beqlr cr7
 	BR	cmpbody<>(SB)
-equal:
-	BEQ	CR6,done
-	MOVD	$1, R8
-	BGT	CR6,greater
-	NEG	R8
-greater:
-	MOVD	R8, R3
-	RET
-done:
-	MOVD	$0, R3
-	RET
 
 TEXT runtime·cmpstring<ABIInternal>(SB),NOSPLIT|NOFRAME,$0-40
 	// incoming:
@@ -45,32 +70,21 @@
 	// R4 a len  -> R3
 	// R5 b addr -> R6
 	// R6 b len  -> R4
-	MOVD	R6, R7
-	MOVD	R5, R6
-	MOVD	R3, R5
-	MOVD	R4, R3
-	MOVD	R7, R4
-	CMP     R5,R6,CR7
-	CMP	R3,R4,CR6
-	BEQ	CR7,equal
-	MOVBZ	internal∕cpu·PPC64+const_offsetPPC64HasPOWER9(SB), R16
-	CMP	R16,$1
-	BNE	power8
-	BR	cmpbodyp9<>(SB)
-power8:
+	//
+	// on entry to cmpbody:
+	// R3 compare value if compared length is same.
+	// R5 a addr
+	// R6 b addr
+	// R9 min(len(a),len(b))
+	SETB_INIT()
+	CMP	R4,R6,CR0
+	CMP	R3,R5,CR7
+	ISEL	CR0LT,R4,R6,R9
+	MOVD	R5,R6
+	MOVD	R3,R5
+	SETB_CR0(R3)
+	BC	$12,30,LR	// beqlr cr7
 	BR	cmpbody<>(SB)
-equal:
-	BEQ	CR6,done
-	MOVD	$1, R8
-	BGT	CR6,greater
-	NEG	R8
-greater:
-	MOVD	R8, R3
-	RET
-
-done:
-	MOVD	$0, R3
-	RET
 
 #ifdef GOARCH_ppc64le
 DATA byteswap<>+0(SB)/8, $0x0706050403020100
@@ -79,32 +93,33 @@
 #define SWAP V21
 #endif
 
-// Do an efficient memcmp for ppc64le/ppc64/POWER8
-// R3 = a len
-// R4 = b len
-// R5 = a addr
-// R6 = b addr
-// On exit:
-// R3 = return value
 TEXT cmpbody<>(SB),NOSPLIT|NOFRAME,$0-0
-	MOVD	R3,R8		// set up length
-	CMP	R3,R4,CR2	// unequal?
-	BLT	CR2,setuplen	// BLT CR2
-	MOVD	R4,R8		// use R4 for comparison len
-setuplen:
-	CMP	R8,$32		// optimize >= 32
-	MOVD	R8,R9
-	BLT	setup8a		// optimize < 32
-	MOVD	$16,R10		// set offsets to load into vectors
-	CMP	R8,$64
-	BLT	cmp32		// process size 32-63
+start:
+	CMP	R9,$16,CR0
+	CMP	R9,$32,CR1
+	CMP	R9,$64,CR2
+	MOVD	$16,R10
+	BLT	cmp8
+	BLT	CR1,cmp16
+	BLT	CR2,cmp32
 
-	DCBT	(R5)		// optimize >= 64
+cmp64:	// >= 64B
+	DCBT	(R5)		// optimize for size>=64
 	DCBT	(R6)		// cache hint
+
+	SRD	$6,R9,R14	// There is at least one iteration.
+	MOVD	R14,CTR
+	ANDCC   $63,R9,R9
+	CMP	R9,$16,CR1	// Do setup for tail check early on.
+	CMP	R9,$32,CR2
+	CMP	R9,$48,CR3
+	ADD	$-16,R9,R9
+
 	MOVD	$32,R11		// set offsets to load into vector
 	MOVD	$48,R12		// set offsets to load into vector
 
-loop64a:// process size 64 and greater
+	PCALIGN	$16
+cmp64_loop:
 	LXVD2X	(R5)(R0),V3	// load bytes of A at offset 0 into vector
 	LXVD2X	(R6)(R0),V4	// load bytes of B at offset 0 into vector
 	VCMPEQUDCC	V3,V4,V1
@@ -112,391 +127,206 @@
 
 	LXVD2X	(R5)(R10),V3	// load bytes of A at offset 16 into vector
 	LXVD2X	(R6)(R10),V4	// load bytes of B at offset 16 into vector
-
 	VCMPEQUDCC	V3,V4,V1
 	BGE	CR6,different
 
 	LXVD2X	(R5)(R11),V3	// load bytes of A at offset 32 into vector
 	LXVD2X	(R6)(R11),V4	// load bytes of B at offset 32 into vector
-
 	VCMPEQUDCC	V3,V4,V1
 	BGE	CR6,different
 
 	LXVD2X	(R5)(R12),V3	// load bytes of A at offset 64 into vector
 	LXVD2X	(R6)(R12),V4	// load bytes of B at offset 64 into vector
-
 	VCMPEQUDCC	V3,V4,V1
 	BGE	CR6,different
 
-	ADD	$-64,R9,R9	// reduce remaining size by 64
 	ADD	$64,R5,R5	// increment to next 64 bytes of A
 	ADD	$64,R6,R6	// increment to next 64 bytes of B
-	CMPU	R9,$64
-	BGE	loop64a		// loop back to loop64a only if there are >= 64 bytes remaining
-	
-	CMPU	R9,$32
-	BGE	cmp32		// loop to cmp32 if there are 32-64 bytes remaining
-	CMPU	R9,$0
-	BNE	rem		// loop to rem if the remainder is not 0
+	BDNZ	cmp64_loop
+	BC	$12,2,LR	// beqlr
 
-	BEQ	CR2,equal	// remainder is zero, jump to equal if len(A)==len(B)
-	BLT	CR2,less	// jump to less if len(A)<len(B)
-	BR	greater		// jump to greater otherwise
-cmp32:
-	LXVD2X	(R5)(R0),V3	// load bytes of A at offset 0 into vector
-	LXVD2X	(R6)(R0),V4	// load bytes of B at offset 0 into vector
+	// Finish out tail with minimal overlapped checking.
+	// Note, 0 tail is handled by beqlr above.
+	BLE	CR1,cmp64_tail_gt0
+	BLE	CR2,cmp64_tail_gt16
+	BLE	CR3,cmp64_tail_gt32
 
+cmp64_tail_gt48: // 49 - 63 B
+	LXVD2X	(R0)(R5),V3
+	LXVD2X	(R0)(R6),V4
 	VCMPEQUDCC	V3,V4,V1
 	BGE	CR6,different
 
-	LXVD2X	(R5)(R10),V3	// load bytes of A at offset 16 into vector
-	LXVD2X	(R6)(R10),V4	// load bytes of B at offset 16 into vector
-
+	LXVD2X	(R5)(R10),V3
+	LXVD2X	(R6)(R10),V4
 	VCMPEQUDCC	V3,V4,V1
 	BGE	CR6,different
 
-	ADD	$-32,R9,R9	// reduce remaining size by 32
-	ADD	$32,R5,R5	// increment to next 32 bytes of A
-	ADD	$32,R6,R6	// increment to next 32 bytes of B
-	CMPU	R9,$0
-	BNE	rem		// loop to rem if the remainder is not 0
-	BEQ	CR2,equal	// remainder is zero, jump to equal if len(A)==len(B)
-	BLT	CR2,less	// jump to less if len(A)<len(B)
-	BR	greater		// jump to greater otherwise
-rem:
-	MOVD	R9,R8
-	ANDCC	$24,R8,R9	// Any 8 byte chunks?
-	BEQ	leftover	// and result is 0
-	BR	setup8a
+	LXVD2X	(R5)(R11),V3
+	LXVD2X	(R6)(R11),V4
+	VCMPEQUDCC	V3,V4,V1
+	BGE	CR6,different
 
+	BR cmp64_tail_gt0
+
+	PCALIGN $16
+cmp64_tail_gt32: // 33 - 48B
+	LXVD2X	(R0)(R5),V3
+	LXVD2X	(R0)(R6),V4
+	VCMPEQUDCC	V3,V4,V1
+	BGE	CR6,different
+
+	LXVD2X	(R5)(R10),V3
+	LXVD2X	(R6)(R10),V4
+	VCMPEQUDCC	V3,V4,V1
+	BGE	CR6,different
+
+	BR cmp64_tail_gt0
+
+	PCALIGN $16
+cmp64_tail_gt16: // 17 - 32B
+	LXVD2X	(R0)(R5),V3
+	LXVD2X	(R0)(R6),V4
+	VCMPEQUDCC	V3,V4,V1
+	BGE	CR6,different
+
+	BR cmp64_tail_gt0
+
+	PCALIGN $16
+cmp64_tail_gt0: // 1 - 16B
+	LXVD2X	(R5)(R9),V3
+	LXVD2X	(R6)(R9),V4
+	VCMPEQUDCC	V3,V4,V1
+	BGE	CR6,different
+
+	RET
+
+	PCALIGN $16
+cmp32:	// 32 - 63B
+	ANDCC	$31,R9,R9
+
+	LXVD2X	(R0)(R5),V3
+	LXVD2X	(R0)(R6),V4
+	VCMPEQUDCC	V3,V4,V1
+	BGE	CR6,different
+
+	LXVD2X	(R10)(R5),V3
+	LXVD2X	(R10)(R6),V4
+	VCMPEQUDCC	V3,V4,V1
+	BGE	CR6,different
+
+	BC	$12,2,LR	// beqlr
+	ADD	R9,R10,R10
+
+	LXVD2X	(R9)(R5),V3
+	LXVD2X	(R9)(R6),V4
+	VCMPEQUDCC	V3,V4,V1
+	BGE	CR6,different
+
+	LXVD2X	(R10)(R5),V3
+	LXVD2X	(R10)(R6),V4
+	VCMPEQUDCC	V3,V4,V1
+	BGE	CR6,different
+	RET
+
+	PCALIGN $16
+cmp16:	// 16 - 31B
+	ANDCC	$15,R9,R9
+	LXVD2X	(R0)(R5),V3
+	LXVD2X	(R0)(R6),V4
+	VCMPEQUDCC	V3,V4,V1
+	BGE	CR6,different
+	BC	$12,2,LR	// beqlr
+
+	LXVD2X	(R9)(R5),V3
+	LXVD2X	(R9)(R6),V4
+	VCMPEQUDCC	V3,V4,V1
+	BGE	CR6,different
+	RET
+
+	PCALIGN $16
 different:
 #ifdef	GOARCH_ppc64le
-	MOVD	$byteswap<>+00(SB), R16
+	MOVD	$byteswap<>+00(SB),R16
 	LXVD2X	(R16)(R0),SWAP	// Set up swap string
 
 	VPERM	V3,V3,SWAP,V3
 	VPERM	V4,V4,SWAP,V4
 #endif
-	MFVSRD	VS35,R16	// move upper doublwords of A and B into GPR for comparison
+
+	MFVSRD	VS35,R16	// move upper doublewords of A and B into GPR for comparison
 	MFVSRD	VS36,R10
 
 	CMPU	R16,R10
 	BEQ	lower
-	BGT	greater
-	MOVD	$-1,R3		// return value if A < B
+	SETB_CR0_NE(R3)
 	RET
+
+	PCALIGN $16
 lower:
-	VSLDOI	$8,V3,V3,V3	// move lower doublwords of A and B into GPR for comparison
+	VSLDOI	$8,V3,V3,V3	// move lower doublewords of A and B into GPR for comparison
 	MFVSRD	VS35,R16
 	VSLDOI	$8,V4,V4,V4
 	MFVSRD	VS36,R10
 
 	CMPU	R16,R10
-	BGT	greater
-	MOVD	$-1,R3		// return value if A < B
-	RET
-setup8a:
-	SRADCC	$3,R8,R9	// get the 8 byte count
-	BEQ	leftover	// shifted value is 0
-	CMPU	R8,$8		// optimize 8byte move
-	BEQ	size8
-	CMPU	R8,$16
-	BEQ	size16
-	MOVD	R9,CTR		// loop count for doublewords
-loop8:
-#ifdef  GOARCH_ppc64le
-	MOVDBR	(R5+R0),R16	// doublewords to compare
-	MOVDBR	(R6+R0),R10	// LE compare order
-#else
-	MOVD	(R5+R0),R16	// doublewords to compare
-	MOVD	(R6+R0),R10	// BE compare order
-#endif
-	ADD	$8,R5
-	ADD	$8,R6
-	CMPU	R16,R10		// match?
-	BC	8,2,loop8	// bt ctr <> 0 && cr
-	BGT	greater
-	BLT	less
-leftover:
-	ANDCC	$7,R8,R9	// check for leftover bytes
-	BEQ	zeroremainder
-simplecheck:
-	MOVD	R0,R14
-	CMP	R9,$4		// process 4 bytes
-	BLT	halfword
-#ifdef  GOARCH_ppc64le
-	MOVWBR	(R5)(R14),R10
-	MOVWBR	(R6)(R14),R11
-#else
-	MOVWZ	(R5)(R14),R10
-	MOVWZ	(R6)(R14),R11
-#endif
-	CMPU	R10,R11
-	BGT	greater
-	BLT	less
-	ADD	$-4,R9
-	ADD	$4,R14
-	PCALIGN	$16
-
-halfword:
-	CMP	R9,$2		// process 2 bytes
-	BLT	byte
-#ifdef  GOARCH_ppc64le
-	MOVHBR	(R5)(R14),R10
-	MOVHBR	(R6)(R14),R11
-#else
-	MOVHZ	(R5)(R14),R10
-	MOVHZ	(R6)(R14),R11
-#endif
-	CMPU	R10,R11
-	BGT	greater
-	BLT	less
-	ADD	$-2,R9
-	ADD	$2,R14
-	PCALIGN	$16
-byte:
-	CMP	R9,$0		// process 1 byte
-	BEQ	skip
-	MOVBZ	(R5)(R14),R10
-	MOVBZ	(R6)(R14),R11
-	CMPU	R10,R11
-	BGT	greater
-	BLT	less
-	PCALIGN	$16
-skip:
-	BEQ	CR2,equal
-	BGT	CR2,greater
-
-less:	MOVD	$-1,R3		// return value if A < B
-	RET
-size16:
-	LXVD2X	(R5)(R0),V3	// load bytes of A at offset 0 into vector
-	LXVD2X	(R6)(R0),V4	// load bytes of B at offset 0 into vector
-	VCMPEQUDCC	V3,V4,V1
-	BGE	CR6,different
-zeroremainder:
-	BEQ	CR2,equal	// remainder is zero, jump to equal if len(A)==len(B)
-	BLT	CR2,less	// jump to less if len(A)<len(B)
-	BR	greater		// jump to greater otherwise
-size8:
-#ifdef  GOARCH_ppc64le
-	MOVDBR	(R5+R0),R16	// doublewords to compare
-	MOVDBR	(R6+R0),R10	// LE compare order
-#else
-	MOVD	(R5+R0),R16	// doublewords to compare
-	MOVD	(R6+R0),R10	// BE compare order
-#endif
-	CMPU	R16,R10		// match?
-	BGT	greater
-	BLT	less
-	BGT	CR2,greater	// 2nd len > 1st len
-	BLT	CR2,less	// 2nd len < 1st len
-equal:
-	MOVD	$0, R3		// return value if A == B
-	RET
-greater:
-	MOVD	$1,R3		// return value if A > B
+	SETB_CR0_NE(R3)
 	RET
 
-// Do an efficient memcmp for ppc64le/ppc64/POWER9
-// R3 = a len
-// R4 = b len
-// R5 = a addr
-// R6 = b addr
-// On exit:
-// R3 = return value
-TEXT cmpbodyp9<>(SB),NOSPLIT|NOFRAME,$0-0
-	MOVD	R3,R8		// set up length
-	CMP	R3,R4,CR2	// unequal?
-	BLT	CR2,setuplen	// BLT CR2
-	MOVD	R4,R8		// use R4 for comparison len
-setuplen:
-	CMP	R8,$16		// optimize for size<16
-	MOVD	R8,R9
-	BLT	simplecheck
-	MOVD	$16,R10		// set offsets to load into vectors
-	CMP	R8,$32		// optimize for size 16-31
-	BLT	cmp16
-	CMP	R8,$64
-	BLT	cmp32		// optimize for size 32-63
-	DCBT	(R5)		// optimize for size>=64
-	DCBT	(R6)		// cache hint
-
-	MOVD	$32,R11		// set offsets to load into vector
-	MOVD	$48,R12		// set offsets to load into vector
-
-loop64a:// process size 64 and greater
-	LXVB16X	(R0)(R5),V3	// load bytes of A at offset 0 into vector
-	LXVB16X	(R0)(R6),V4	// load bytes of B at offset 0 into vector
-	VCMPNEBCC	V3,V4,V1	// record comparison into V1
-	BNE	CR6,different	// jump out if its different
-
-	LXVB16X	(R10)(R5),V3	// load bytes of A at offset 16 into vector
-	LXVB16X	(R10)(R6),V4	// load bytes of B at offset 16 into vector
-	VCMPNEBCC	V3,V4,V1
-	BNE	CR6,different
-
-	LXVB16X	(R11)(R5),V3	// load bytes of A at offset 32 into vector
-	LXVB16X	(R11)(R6),V4	// load bytes of B at offset 32 into vector
-	VCMPNEBCC	V3,V4,V1
-	BNE	CR6,different
-
-	LXVB16X	(R12)(R5),V3	// load bytes of A at offset 48 into vector
-	LXVB16X	(R12)(R6),V4	// load bytes of B at offset 48 into vector
-	VCMPNEBCC	V3,V4,V1
-	BNE	CR6,different
-
-	ADD	$-64,R9,R9	// reduce remaining size by 64
-	ADD	$64,R5,R5	// increment to next 64 bytes of A
-	ADD	$64,R6,R6	// increment to next 64 bytes of B
-	CMPU	R9,$64
-	BGE	loop64a		// loop back to loop64a only if there are >= 64 bytes remaining
-
-	CMPU	R9,$32
-	BGE	cmp32		// loop to cmp32 if there are 32-64 bytes remaining
-	CMPU	R9,$16
-	BGE	cmp16		// loop to cmp16 if there are 16-31 bytes left
-	CMPU	R9,$0
-	BNE	simplecheck	// loop to simplecheck for remaining bytes
-
-	BEQ	CR2,equal	// remainder is zero, jump to equal if len(A)==len(B)
-	BLT	CR2,less	// jump to less if len(A)<len(B)
-	BR	greater		// jump to greater otherwise
-cmp32:
-	LXVB16X	(R0)(R5),V3	// load bytes of A at offset 0 into vector
-	LXVB16X	(R0)(R6),V4	// load bytes of B at offset 0 into vector
-
-	VCMPNEBCC	V3,V4,V1	// record comparison into V1
-	BNE	CR6,different	// jump out if its different
-
-	LXVB16X	(R10)(R5),V3	// load bytes of A at offset 16 into vector
-	LXVB16X	(R10)(R6),V4	// load bytes of B at offset 16 into vector
-	VCMPNEBCC	V3,V4,V1
-	BNE	CR6,different
-
-	ADD	$-32,R9,R9	// reduce remaining size by 32
-	ADD	$32,R5,R5	// increment to next 32 bytes of A
-	ADD	$32,R6,R6	// increment to next 32 bytes of B
-	CMPU	R9,$16		// loop to cmp16 if there are 16-31 bytes left
-	BGE	cmp16
-	CMPU	R9,$0
-	BNE	simplecheck	// loop to simplecheck for remainder bytes
-	BEQ	CR2,equal	// remainder is zero, jump to equal if len(A)==len(B)
-	BLT	CR2,less	// jump to less if len(A)<len(B)
-	BR	greater		// jump to greater otherwise
-different:
-
-	MFVSRD	VS35,R16	// move upper doublwords of A and B into GPR for comparison
-	MFVSRD	VS36,R10
-
-	CMPU	R16,R10
-	BEQ	lower
-	BGT	greater
-	MOVD	$-1,R3		// return value if A < B
-	RET
-lower:
-	MFVSRLD	VS35,R16	// next move lower doublewords of A and B into GPR for comparison
-	MFVSRLD	VS36,R10
-
-	CMPU	R16,R10
-	BGT	greater
-	MOVD	$-1,R3		// return value if A < B
-	RET
-
-greater:
-	MOVD	$1,R3		// return value if A > B
-	RET
-cmp16:
-	ANDCC	$16,R9,R31
-	BEQ	tail
-
-	LXVB16X	(R0)(R5),V3	// load bytes of A at offset 16 into vector
-	LXVB16X	(R0)(R6),V4	// load bytes of B at offset 16 into vector
-	VCMPEQUDCC	V3,V4,V1
-	BGE	CR6,different
-
-	ADD	$16,R5
-	ADD	$16,R6
-tail:
-	ANDCC	$15,R9		// Load the last 16 bytes (we know there are at least 32b)
-	BEQ	end
-
-	ADD	R9,R5
-	ADD	R9,R6
-	MOVD	$-16,R10
-
-	LXVB16X	(R10)(R5),V3	// load bytes of A at offset 16 into vector
-	LXVB16X	(R10)(R6),V4	// load bytes of B at offset 16 into vector
-	VCMPEQUDCC	V3,V4,V1
-	BGE	CR6,different
-end:
-	BEQ	CR2,equal	// remainder is zero, jump to equal if len(A)==len(B)
-	BLT	CR2,less	// jump to less if BLT CR2 that is, len(A)<len(B)
-	BR	greater		// jump to greater otherwise
-simplecheck:
-	MOVD	$0,R14		// process 8 bytes
+	PCALIGN $16
+cmp8:	// 8 - 15B
 	CMP	R9,$8
-	BLT	word
-#ifdef  GOARCH_ppc64le
-	MOVDBR	(R5+R14),R10
-	MOVDBR	(R6+R14),R11
-#else
-	MOVD	(R5+R14),R10
-	MOVD	(R6+R14),R11
-#endif
-	CMPU	R10,R11
-	BGT	greater
-	BLT	less
-	ADD	$8,R14
-	ADD	$-8,R9
-	PCALIGN	$16
-word:
-	CMP	R9,$4		// process 4 bytes
-	BLT	halfword
-#ifdef  GOARCH_ppc64le
-	MOVWBR	(R5+R14),R10
-	MOVWBR	(R6+R14),R11
-#else
-	MOVWZ	(R5+R14),R10
-	MOVWZ	(R6+R14),R11
-#endif
-	CMPU	R10,R11
-	BGT	greater
-	BLT	less
-	ADD	$4,R14
-	ADD	$-4,R9
-	PCALIGN	$16
-halfword:
-	CMP	R9,$2		// process 2 bytes
-	BLT	byte
-#ifdef  GOARCH_ppc64le
-	MOVHBR	(R5+R14),R10
-	MOVHBR	(R6+R14),R11
-#else
-	MOVHZ	(R5+R14),R10
-	MOVHZ	(R6+R14),R11
-#endif
-	CMPU	R10,R11
-	BGT	greater
-	BLT	less
-	ADD	$2,R14
-	ADD	$-2,R9
-	PCALIGN	$16
-byte:
-	CMP	R9,$0		// process 1 byte
-	BEQ	skip
-	MOVBZ	(R5+R14),R10
-	MOVBZ	(R6+R14),R11
-	CMPU	R10,R11
-	BGT	greater
-	BLT	less
-	PCALIGN	$16
-skip:
-	BEQ	CR2,equal
-	BGT	CR2,greater
-less:
-	MOVD	$-1,R3		// return value if A < B
+	BLT	cmp4
+	ANDCC	$7,R9,R9
+	_LDBEX	(R0)(R5),R10
+	_LDBEX	(R0)(R6),R11
+	_LDBEX	(R9)(R5),R12
+	_LDBEX	(R9)(R6),R14
+	CMPU	R10,R11,CR0
+	SETB_CR0(R5)
+	CMPU	R12,R14,CR1
+	SETB_CR1(R6)
+	CRAND   CR0EQ,CR1EQ,CR1EQ // If both equal, length determines return value.
+	ISEL	CR0EQ,R6,R5,R4
+	ISEL	CR1EQ,R3,R4,R3
 	RET
-equal:
-	MOVD	$0, R3		// return value if A == B
+
+	PCALIGN	$16
+cmp4:	// 4 - 7B
+	CMP	R9,$4
+	BLT	cmp2
+	ANDCC	$3,R9,R9
+	_LWBEX	(R0)(R5),R10
+	_LWBEX	(R0)(R6),R11
+	_LWBEX	(R9)(R5),R12
+	_LWBEX	(R9)(R6),R14
+	RLDIMI	$32,R10,$0,R12
+	RLDIMI	$32,R11,$0,R14
+	CMPU	R12,R14
+	BR	cmp0
+
+	PCALIGN $16
+cmp2:	// 2 - 3B
+	CMP	R9,$2
+	BLT	cmp1
+	ANDCC	$1,R9,R9
+	_LHBEX	(R0)(R5),R10
+	_LHBEX	(R0)(R6),R11
+	_LHBEX	(R9)(R5),R12
+	_LHBEX	(R9)(R6),R14
+	RLDIMI	$32,R10,$0,R12
+	RLDIMI	$32,R11,$0,R14
+	CMPU	R12,R14
+	BR	cmp0
+
+	PCALIGN $16
+cmp1:
+	CMP	R9,$0
+	BEQ	cmp0
+	MOVBZ	(R5),R10
+	MOVBZ	(R6),R11
+	CMPU	R10,R11
+cmp0:
+	SETB_CR0(R6)
+	ISEL	CR0EQ,R3,R6,R3
 	RET
diff --git a/src/internal/bytealg/compare_riscv64.s b/src/internal/bytealg/compare_riscv64.s
index 44a743d..a4164a2 100644
--- a/src/internal/bytealg/compare_riscv64.s
+++ b/src/internal/bytealg/compare_riscv64.s
@@ -40,15 +40,17 @@
 	BEQZ	X5, cmp_len
 
 	MOV	$32, X6
-	BLT	X5, X6, loop4_check
+	BLT	X5, X6, check8_unaligned
 
 	// Check alignment - if alignment differs we have to do one byte at a time.
 	AND	$7, X10, X7
 	AND	$7, X12, X8
-	BNE	X7, X8, loop4_check
-	BEQZ	X7, loop32_check
+	BNE	X7, X8, check8_unaligned
+	BEQZ	X7, compare32
 
 	// Check one byte at a time until we reach 8 byte alignment.
+	SUB	X7, X0, X7
+	ADD	$8, X7, X7
 	SUB	X7, X5, X5
 align:
 	ADD	$-1, X7
@@ -59,94 +61,99 @@
 	ADD	$1, X12
 	BNEZ	X7, align
 
-loop32_check:
-	MOV	$32, X7
-	BLT	X5, X7, loop16_check
-loop32:
+check32:
+	// X6 contains $32
+	BLT	X5, X6, compare16
+compare32:
 	MOV	0(X10), X15
 	MOV	0(X12), X16
 	MOV	8(X10), X17
 	MOV	8(X12), X18
-	BEQ	X15, X16, loop32a
-	JMP	cmp8a
-loop32a:
-	BEQ	X17, X18, loop32b
-	JMP	cmp8b
-loop32b:
+	BNE	X15, X16, cmp8a
+	BNE	X17, X18, cmp8b
 	MOV	16(X10), X15
 	MOV	16(X12), X16
 	MOV	24(X10), X17
 	MOV	24(X12), X18
-	BEQ	X15, X16, loop32c
-	JMP	cmp8a
-loop32c:
-	BEQ	X17, X18, loop32d
-	JMP	cmp8b
-loop32d:
+	BNE	X15, X16, cmp8a
+	BNE	X17, X18, cmp8b
 	ADD	$32, X10
 	ADD	$32, X12
 	ADD	$-32, X5
-	BGE	X5, X7, loop32
+	BGE	X5, X6, compare32
 	BEQZ	X5, cmp_len
 
-loop16_check:
+check16:
 	MOV	$16, X6
-	BLT	X5, X6, loop4_check
-loop16:
+	BLT	X5, X6, check8_unaligned
+compare16:
 	MOV	0(X10), X15
 	MOV	0(X12), X16
 	MOV	8(X10), X17
 	MOV	8(X12), X18
-	BEQ	X15, X16, loop16a
-	JMP	cmp8a
-loop16a:
-	BEQ	X17, X18, loop16b
-	JMP	cmp8b
-loop16b:
+	BNE	X15, X16, cmp8a
+	BNE	X17, X18, cmp8b
 	ADD	$16, X10
 	ADD	$16, X12
 	ADD	$-16, X5
-	BGE	X5, X6, loop16
 	BEQZ	X5, cmp_len
 
-loop4_check:
-	MOV	$4, X6
-	BLT	X5, X6, loop1
-loop4:
+check8_unaligned:
+	MOV	$8, X6
+	BLT	X5, X6, check4_unaligned
+compare8_unaligned:
 	MOVBU	0(X10), X8
-	MOVBU	0(X12), X9
 	MOVBU	1(X10), X15
+	MOVBU	2(X10), X17
+	MOVBU	3(X10), X19
+	MOVBU	4(X10), X21
+	MOVBU	5(X10), X23
+	MOVBU	6(X10), X25
+	MOVBU	7(X10), X29
+	MOVBU	0(X12), X9
 	MOVBU	1(X12), X16
-	BEQ	X8, X9, loop4a
-	SLTU	X9, X8, X5
-	SLTU	X8, X9, X6
-	JMP	cmp_ret
-loop4a:
-	BEQ	X15, X16, loop4b
-	SLTU	X16, X15, X5
-	SLTU	X15, X16, X6
-	JMP	cmp_ret
-loop4b:
-	MOVBU	2(X10), X21
-	MOVBU	2(X12), X22
-	MOVBU	3(X10), X23
-	MOVBU	3(X12), X24
-	BEQ	X21, X22, loop4c
-	SLTU	X22, X21, X5
-	SLTU	X21, X22, X6
-	JMP	cmp_ret
-loop4c:
-	BEQ	X23, X24, loop4d
-	SLTU	X24, X23, X5
-	SLTU	X23, X24, X6
-	JMP	cmp_ret
-loop4d:
+	MOVBU	2(X12), X18
+	MOVBU	3(X12), X20
+	MOVBU	4(X12), X22
+	MOVBU	5(X12), X24
+	MOVBU	6(X12), X28
+	MOVBU	7(X12), X30
+	BNE	X8, X9, cmp1a
+	BNE	X15, X16, cmp1b
+	BNE	X17, X18, cmp1c
+	BNE	X19, X20, cmp1d
+	BNE	X21, X22, cmp1e
+	BNE	X23, X24, cmp1f
+	BNE	X25, X28, cmp1g
+	BNE	X29, X30, cmp1h
+	ADD	$8, X10
+	ADD	$8, X12
+	ADD	$-8, X5
+	BGE	X5, X6, compare8_unaligned
+	BEQZ	X5, cmp_len
+
+check4_unaligned:
+	MOV	$4, X6
+	BLT	X5, X6, compare1
+compare4_unaligned:
+	MOVBU	0(X10), X8
+	MOVBU	1(X10), X15
+	MOVBU	2(X10), X17
+	MOVBU	3(X10), X19
+	MOVBU	0(X12), X9
+	MOVBU	1(X12), X16
+	MOVBU	2(X12), X18
+	MOVBU	3(X12), X20
+	BNE	X8, X9, cmp1a
+	BNE	X15, X16, cmp1b
+	BNE	X17, X18, cmp1c
+	BNE	X19, X20, cmp1d
 	ADD	$4, X10
 	ADD	$4, X12
 	ADD	$-4, X5
-	BGE	X5, X6, loop4
+	BGE	X5, X6, compare4_unaligned
 
-loop1:
+compare1:
 	BEQZ	X5, cmp_len
 	MOVBU	0(X10), X8
 	MOVBU	0(X12), X9
@@ -154,27 +161,55 @@
 	ADD	$1, X10
 	ADD	$1, X12
 	ADD	$-1, X5
-	JMP	loop1
+	JMP	compare1
 
 	// Compare 8 bytes of memory in X15/X16 that are known to differ.
 cmp8a:
-	MOV	$0xff, X19
-cmp8a_loop:
-	AND	X15, X19, X8
-	AND	X16, X19, X9
-	BNE	X8, X9, cmp
-	SLLI	$8, X19
-	JMP	cmp8a_loop
+	MOV	X15, X17
+	MOV	X16, X18
 
 	// Compare 8 bytes of memory in X17/X18 that are known to differ.
 cmp8b:
 	MOV	$0xff, X19
-cmp8b_loop:
+cmp8_loop:
 	AND	X17, X19, X8
 	AND	X18, X19, X9
 	BNE	X8, X9, cmp
 	SLLI	$8, X19
-	JMP	cmp8b_loop
+	JMP	cmp8_loop
+
+cmp1a:
+	SLTU	X9, X8, X5
+	SLTU	X8, X9, X6
+	JMP	cmp_ret
+cmp1b:
+	SLTU	X16, X15, X5
+	SLTU	X15, X16, X6
+	JMP	cmp_ret
+cmp1c:
+	SLTU	X18, X17, X5
+	SLTU	X17, X18, X6
+	JMP	cmp_ret
+cmp1d:
+	SLTU	X20, X19, X5
+	SLTU	X19, X20, X6
+	JMP	cmp_ret
+cmp1e:
+	SLTU	X22, X21, X5
+	SLTU	X21, X22, X6
+	JMP	cmp_ret
+cmp1f:
+	SLTU	X24, X23, X5
+	SLTU	X23, X24, X6
+	JMP	cmp_ret
+cmp1g:
+	SLTU	X28, X25, X5
+	SLTU	X25, X28, X6
+	JMP	cmp_ret
+cmp1h:
+	SLTU	X30, X29, X5
+	SLTU	X29, X30, X6
+	JMP	cmp_ret
 
 cmp_len:
 	MOV	X11, X8
diff --git a/src/internal/bytealg/equal_loong64.s b/src/internal/bytealg/equal_loong64.s
index dcdde89..ba2a557 100644
--- a/src/internal/bytealg/equal_loong64.s
+++ b/src/internal/bytealg/equal_loong64.s
@@ -14,6 +14,7 @@
 	BEQ	R4, R5, eq
 	MOVV	size+16(FP), R6
 	ADDV	R4, R6, R7
+	PCALIGN	$16
 loop:
 	BNE	R4, R7, test
 	MOVV	$1, R4
diff --git a/src/internal/bytealg/equal_ppc64x.s b/src/internal/bytealg/equal_ppc64x.s
index f2c7cc1..07dce80 100644
--- a/src/internal/bytealg/equal_ppc64x.s
+++ b/src/internal/bytealg/equal_ppc64x.s
@@ -10,13 +10,6 @@
 // 4K (smallest case) page size offset mask for PPC64.
 #define PAGE_OFFSET 4095
 
-// TODO: At writing, ISEL and BC do not support CR bit type arguments,
-// define them here for readability.
-#define CR0LT 4*0+0
-#define CR0EQ 4*0+2
-#define CR1LT 4*1+0
-#define CR6LT 4*6+0
-
 // Likewise, the BC opcode is hard to read, and no extended
 // mnemonics are offered for these forms.
 #define BGELR_CR6 BC  4, CR6LT, (LR)
@@ -68,7 +61,7 @@
 	MOVD	$48, R16
 	ANDCC	$0x3F, R5, R5	// len%64==0?
 
-	PCALIGN $32
+	PCALIGN $16
 loop64:
 	LXVD2X	(R8+R0), V0
 	LXVD2X	(R4+R0), V1
@@ -90,7 +83,7 @@
 	ADD	$64,R4
 	BDNZ	loop64
 
-	ISEL	$CR0EQ, R11, R3, R3	// If no tail, return 1, otherwise R3 remains 0.
+	ISEL	CR0EQ, R11, R3, R3	// If no tail, return 1, otherwise R3 remains 0.
 	BEQLR				// return if no tail.
 
 	ADD	$-64, R9, R8
@@ -110,7 +103,7 @@
 	LXVD2X	(R8+R16), V0
 	LXVD2X	(R4+R16), V1
 	VCMPEQUBCC	V0, V1, V2
-	ISEL	$CR6LT, R11, R0, R3
+	ISEL	CR6LT, R11, R0, R3
 	RET
 
 check33_64:
@@ -138,7 +131,7 @@
 	LXVD2X	(R8+R0), V0
 	LXVD2X	(R4+R0), V1
 	VCMPEQUBCC	V0, V1, V2
-	ISEL	$CR6LT, R11, R0, R5
+	ISEL	CR6LT, R11, R0, R5
 
 	// Load sX[len(sX)-16:len(sX)] and compare.
 	ADD	$-16, R9
@@ -146,22 +139,30 @@
 	LXVD2X	(R9+R0), V0
 	LXVD2X	(R10+R0), V1
 	VCMPEQUBCC	V0, V1, V2
-	ISEL	$CR6LT, R5, R0, R3
+	ISEL	CR6LT, R5, R0, R3
 	RET
 
 check0_16:
+#ifdef GOPPC64_power10
+	SLD	$56, R5, R7
+	LXVL	R8, R7, V0
+	LXVL	R4, R7, V1
+	VCMPEQUDCC	V0, V1, V2
+	ISEL	CR6LT, R11, R0, R3
+	RET
+#else
 	CMP	R5, $8
 	BLT	check0_7
 	// Load sX[0:7] and compare.
 	MOVD	(R8), R6
 	MOVD	(R4), R7
 	CMP	R6, R7
-	ISEL	$CR0EQ, R11, R0, R5
+	ISEL	CR0EQ, R11, R0, R5
 	// Load sX[len(sX)-8:len(sX)] and compare.
 	MOVD	-8(R9), R6
 	MOVD	-8(R10), R7
 	CMP	R6, R7
-	ISEL	$CR0EQ, R5, R0, R3
+	ISEL	CR0EQ, R5, R0, R3
 	RET
 
 check0_7:
@@ -183,8 +184,8 @@
 	CMPU	R9, R12, CR0
 	SUB	R12, R8, R6		// compute lower load address
 	SUB	R12, R4, R9
-	ISEL	$CR1LT, R8, R6, R8	// R8 = R6 < 0 ? R8 (&s1) : R6 (&s1 - (8-len))
-	ISEL	$CR0LT, R4, R9, R4	// Similar for s2
+	ISEL	CR1LT, R8, R6, R8	// R8 = R6 < 0 ? R8 (&s1) : R6 (&s1 - (8-len))
+	ISEL	CR0LT, R4, R9, R4	// Similar for s2
 	MOVD	(R8), R15
 	MOVD	(R4), R16
 	SLD	R14, R15, R7
@@ -194,12 +195,13 @@
 	SRD	R14, R15, R6		// Clear the lower (8-len) bytes
 	SRD	R14, R16, R9
 #ifdef GOARCH_ppc64le
-	ISEL	$CR1LT, R7, R6, R8      // Choose the correct len bytes to compare based on alignment
-	ISEL	$CR0LT, R17, R9, R4
+	ISEL	CR1LT, R7, R6, R8      // Choose the correct len bytes to compare based on alignment
+	ISEL	CR0LT, R17, R9, R4
 #else
-	ISEL	$CR1LT, R6, R7, R8
-	ISEL	$CR0LT, R9, R17, R4
+	ISEL	CR1LT, R6, R7, R8
+	ISEL	CR0LT, R9, R17, R4
 #endif
 	CMP	R4, R8
-	ISEL	$CR0EQ, R11, R0, R3
+	ISEL	CR0EQ, R11, R0, R3
 	RET
+#endif	// tail processing if !defined(GOPPC64_power10)
diff --git a/src/internal/bytealg/equal_riscv64.s b/src/internal/bytealg/equal_riscv64.s
index 3834083..503aac5 100644
--- a/src/internal/bytealg/equal_riscv64.s
+++ b/src/internal/bytealg/equal_riscv64.s
@@ -37,6 +37,8 @@
 	BEQZ	X9, loop32_check
 
 	// Check one byte at a time until we reach 8 byte alignment.
+	SUB	X9, X0, X9
+	ADD	$8, X9, X9
 	SUB	X9, X12, X12
 align:
 	ADD	$-1, X9
diff --git a/src/internal/bytealg/index_native.go b/src/internal/bytealg/index_native.go
index 6e4a2f3..59c93f9 100644
--- a/src/internal/bytealg/index_native.go
+++ b/src/internal/bytealg/index_native.go
@@ -6,14 +6,14 @@
 
 package bytealg
 
-//go:noescape
-
 // Index returns the index of the first instance of b in a, or -1 if b is not present in a.
 // Requires 2 <= len(b) <= MaxLen.
-func Index(a, b []byte) int
-
+//
 //go:noescape
+func Index(a, b []byte) int
 
 // IndexString returns the index of the first instance of b in a, or -1 if b is not present in a.
 // Requires 2 <= len(b) <= MaxLen.
+//
+//go:noescape
 func IndexString(a, b string) int
diff --git a/src/internal/bytealg/index_ppc64x.go b/src/internal/bytealg/index_ppc64x.go
index ab3cbe5..720d517 100644
--- a/src/internal/bytealg/index_ppc64x.go
+++ b/src/internal/bytealg/index_ppc64x.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build (aix || linux) && (ppc64 || ppc64le)
+//go:build ppc64 || ppc64le
 
 package bytealg
 
diff --git a/src/internal/bytealg/index_ppc64x.s b/src/internal/bytealg/index_ppc64x.s
index 26205ce..80a1f85 100644
--- a/src/internal/bytealg/index_ppc64x.s
+++ b/src/internal/bytealg/index_ppc64x.s
@@ -434,41 +434,49 @@
 	CMP      R6, $0                // Check sep len
 	BEQ      notfound              // sep len 0 -- not found
 	MOVD     R3, R7                // Copy of string addr
+#ifndef GOPPC64_power10
 	MOVD     $16, R16              // Index value 16
 	MOVD     $17, R17              // Index value 17
 	MOVD     $18, R18              // Index value 18
-	MOVD     $1, R19               // Index value 1
 	VSPLTISB $0xFF, ONES           // splat all 1s
-
-	CMP    R6, $16, CR4        // CR4 for len(sep) >= 16
 	VOR    ONES, ONES, SEPMASK // Set up full SEPMASK
+#else
+	SLD     $56, R6, R14       // Set up separator length for LXVLL
+#endif
+	MOVD   $1, R19             // Index value 1
+	CMP    R6, $16, CR4        // CR4 for len(sep) >= 16
 	BGE    CR4, loadge16       // Load for len(sep) >= 16
+#ifndef GOPPC64_power10
 	SUB    R6, R16, R9         // 16-len of sep
 	SLD    $3, R9              // Set up for VSLO
 	MTVSRD R9, V9              // Set up for VSLO
 	VSLDOI $8, V9, V9, V9      // Set up for VSLO
 	VSLO   ONES, V9, SEPMASK   // Mask for separator len(sep) < 16
-
+#endif
 loadge16:
 	ANDCC $15, R5, R9 // Find byte offset of sep
 	ADD   R9, R6, R10 // Add sep len
 	CMP   R10, $16    // Check if sep len+offset > 16
 	BGT   sepcross16  // Sep crosses 16 byte boundary
-
+#ifdef GOPPC64_power10
+	LXVLL   R5, R14, V0     // Load separator
+#else
 	RLDICR  $0, R5, $59, R8 // Adjust addr to 16 byte container
 	LXVB16X (R8)(R0), V0    // Load 16 bytes @R8 into V0
 	SLD     $3, R9          // Set up shift count for VSLO
 	MTVSRD  R9, V8          // Set up shift count for VSLO
 	VSLDOI  $8, V8, V8, V8
 	VSLO    V0, V8, V0      // Shift by start byte
-
 	VAND V0, SEPMASK, V0 // Mask separator (< 16)
-	BR   index2plus
-
+#endif
+	BR  index2plus
 sepcross16:
-	LXVB16X (R5)(R0), V0 // Load 16 bytes @R5 into V0
-
+#ifdef GOPPC64_power10
+	LXVLL   R5, R14, V0     // Load separator
+#else
+	LXVB16X (R5)(R0), V0    // Load 16 bytes @R5 into V0\
 	VAND V0, SEPMASK, V0 // mask out separator
+#endif
 	BLE  CR4, index2to16
 	BR   index17plus     // Handle sep > 16
 
@@ -659,9 +667,23 @@
 	VSPLTISB $0, V10            // Clear
 	BGT index2to16tail
 
-	MOVD     $3, R17            // Number of bytes beyond 16
-	PCALIGN  $32
+#ifdef GOPPC64_power10
+	ADD     $3,R7, R17          // Base+3
+	ADD     $2,R7, R8           // Base+2
+	ADD     $1,R7, R10          // Base+1
+#else
+	MOVD	$3, R17             // Number of bytes beyond 16
+#endif
+	PCALIGN  $16
+
 index2to16loop:
+
+#ifdef GOPPC64_power10
+	LXVLL  R7, R14, V8          // Load next 16 bytes of string  from Base
+	LXVLL  R10, R14, V9         // Load next 16 bytes of string from Base+1
+	LXVLL  R8, R14, V11         // Load next 16 bytes of string from Base+2
+	LXVLL  R17,R14, V12         // Load next 16 bytes of string  from Base+3
+#else
 	LXVB16X  (R7)(R0), V1       // Load next 16 bytes of string into V1 from R7
 	LXVB16X  (R7)(R17), V5      // Load next 16 bytes of string into V5 from R7+3
 
@@ -672,6 +694,7 @@
 	VAND    V3, SEPMASK, V9    // Mask out sep size 1st index
 	VAND    V4, SEPMASK, V11   // Mask out sep size 2nd index
 	VAND    V5, SEPMASK, V12   // Mask out sep size 3rd index
+#endif
 	VCMPEQUBCC      V0, V8, V8 // compare masked string
 	BLT     CR6, found         // All equal while comparing 0th index
 	VCMPEQUBCC      V0, V9, V9 // compare masked string
@@ -682,14 +705,29 @@
 	BLT     CR6, found4        // All equal while comparing 3rd index
 
 	ADD        $4, R7          // Update ptr to next 4 bytes
+#ifdef GOPPC64_power10
+	ADD        $4, R17         // Update ptr to next 4 bytes
+	ADD        $4, R8          // Update ptr to next 4 bytes
+	ADD        $4, R10         // Update ptr to next 4 bytes
+#endif
 	CMP        R7, LASTSTR     // Still less than last start byte
 	BGT        notfound        // Not found
 	ADD        $19, R7, R9     // Verify remaining bytes
 	CMP        R9, LASTBYTE    // length of string at least 19
 	BLE        index2to16loop  // Try again, else do post processing and jump to index2to16next
-
+	PCALIGN    $32
 	// <19 bytes left, post process the remaining string
 index2to16tail:
+#ifdef GOPPC64_power10
+index2to16next_p10:
+	LXVLL   R7,R14, V1       // Load 16 bytes @R7 into V1
+	VCMPEQUBCC V1, V0, V3      // Compare sep and partial string
+	BLT        CR6, found      // Found
+	ADD        $1, R7          // Not found, try next partial string
+	CMP        R7, LASTSTR     // Check for end of string
+	BLE        index2to16next_p10        // If at end, then not found
+	BR         notfound  // go to remainder loop
+#else
 	ADD     R3, R4, R9         // End of string
 	SUB     R7, R9, R9         // Number of bytes left
 	ANDCC   $15, R7, R10       // 16 byte offset
@@ -738,7 +776,7 @@
 	MTVSRD   R10, V8           // Set up shift
 	VSLDOI   $8, V8, V8, V8
 	VSLO     V1, V8, V1        // Shift by start byte
-	PCALIGN  $32
+	PCALIGN  $16
 index2to16next:
 	VAND       V1, SEPMASK, V2 // Just compare size of sep
 	VCMPEQUBCC V0, V2, V3      // Compare sep and partial string
@@ -748,6 +786,7 @@
 	BGT        notfound        // If at end, then not found
 	VSLDOI     $1, V1, V10, V1 // Shift string left by 1 byte
 	BR         index2to16next  // Check the next partial string
+#endif // Tail processing if GOPPC64!=power10
 
 index17plus:
 	CMP      R6, $32       // Check if 17 < len(sep) <= 32
diff --git a/src/internal/bytealg/indexbyte_loong64.s b/src/internal/bytealg/indexbyte_loong64.s
index baa9c86..6049705 100644
--- a/src/internal/bytealg/indexbyte_loong64.s
+++ b/src/internal/bytealg/indexbyte_loong64.s
@@ -13,6 +13,7 @@
 	ADDV	R4, R5		// end
 	ADDV	$-1, R4
 
+	PCALIGN	$16
 loop:
 	ADDV	$1, R4
 	BEQ	R4, R5, notfound
@@ -36,6 +37,7 @@
 	ADDV	R4, R5		// end
 	ADDV	$-1, R4
 
+	PCALIGN	$16
 loop:
 	ADDV	$1, R4
 	BEQ	R4, R5, notfound
diff --git a/src/internal/bytealg/indexbyte_ppc64x.s b/src/internal/bytealg/indexbyte_ppc64x.s
index 1a6e852..b6714f4 100644
--- a/src/internal/bytealg/indexbyte_ppc64x.s
+++ b/src/internal/bytealg/indexbyte_ppc64x.s
@@ -11,381 +11,304 @@
 	// R3 = byte array pointer
 	// R4 = length
 	MOVD	R6, R5		// R5 = byte
-	MOVBZ	internal∕cpu·PPC64+const_offsetPPC64HasPOWER9(SB), R16
 	BR	indexbytebody<>(SB)
 
 TEXT ·IndexByteString<ABIInternal>(SB),NOSPLIT|NOFRAME,$0-32
 	// R3 = string
 	// R4 = length
 	// R5 = byte
-	MOVBZ	internal∕cpu·PPC64+const_offsetPPC64HasPOWER9(SB), R16
 	BR	indexbytebody<>(SB)
 
+#ifndef GOPPC64_power9
+#ifdef GOARCH_ppc64le
+DATA indexbytevbperm<>+0(SB)/8, $0x3830282018100800
+DATA indexbytevbperm<>+8(SB)/8, $0x7870686058504840
+#else
+DATA indexbytevbperm<>+0(SB)/8, $0x0008101820283038
+DATA indexbytevbperm<>+8(SB)/8, $0x4048505860687078
+#endif
+GLOBL indexbytevbperm<>+0(SB), RODATA, $16
+#endif
+
+// Some operations are endian specific, choose the correct opcode base on GOARCH.
+// Note, _VCZBEBB is only available on power9 and newer.
+#ifdef GOARCH_ppc64le
+#define _LDBEX	MOVDBR
+#define _LWBEX	MOVWBR
+#define _LHBEX	MOVHBR
+#define _VCZBEBB VCTZLSBB
+#else
+#define _LDBEX	MOVD
+#define _LWBEX	MOVW
+#define _LHBEX	MOVH
+#define _VCZBEBB VCLZLSBB
+#endif
+
 // R3 = addr of string
 // R4 = len of string
 // R5 = byte to find
-// R16 = 1 if running on a POWER9 system, 0 otherwise
 // On exit:
 // R3 = return value
 TEXT indexbytebody<>(SB),NOSPLIT|NOFRAME,$0-0
-	MOVD	R3,R17		// Save base address for calculating the index later.
-	RLDICR	$0,R3,$60,R8	// Align address to doubleword boundary in R8.
-	RLDIMI	$8,R5,$48,R5	// Replicating the byte across the register.
-	ADD	R4,R3,R7	// Last acceptable address in R7.
+	CMPU	R4,$32
 
-	RLDIMI	$16,R5,$32,R5
-	CMPU	R4,$32		// Check if it's a small string (≤32 bytes). Those will be processed differently.
-	MOVD	$-1,R9
-	RLWNM	$3,R3,$26,$28,R6	// shift amount for mask (r3&0x7)*8
-	RLDIMI	$32,R5,$0,R5
-	MOVD	R7,R10		// Save last acceptable address in R10 for later.
-	ADD	$-1,R7,R7
-#ifdef GOARCH_ppc64le
-	SLD	R6,R9,R9	// Prepare mask for Little Endian
-#else
-	SRD	R6,R9,R9	// Same for Big Endian
+#ifndef GOPPC64_power9
+	// Load VBPERMQ constant to reduce compare into an ordered bit mask.
+	MOVD	$indexbytevbperm<>+00(SB),R16
+	LXVD2X	(R16),V0	// Set up swap string
 #endif
-	BLT	small_string	// Jump to the small string case if it's <32 bytes.
-	CMP	R16,$1		// optimize for power8 v power9
-	BNE	power8
-	VSPLTISB	$3,V10	// Use V10 as control for VBPERMQ
+
 	MTVRD	R5,V1
-	LVSL	(R0+R0),V11	// set up the permute vector such that V10 has {0x78, .., 0x8, 0x0}
-	VSLB	V11,V10,V10	// to extract the first bit of match result into GPR
 	VSPLTB	$7,V1,V1	// Replicate byte across V1
-	CMP	R4,$64
+
+	BLT	cmp16		// Jump to the small string case if it's <32 bytes.
+
+	CMP	R4,$64,CR1
 	MOVD	$16,R11
 	MOVD	R3,R8
-	BLT	cmp32
+	BLT	CR1,cmp32	// Special case for length 32 - 63
 	MOVD	$32,R12
 	MOVD	$48,R6
 
+	RLDICR  $0,R4,$63-6,R9	// R9 = len &^ 63
+	ADD	R3,R9,R9	// R9 = &s[len &^ 63]
+	ANDCC	$63,R4		// (len &= 63) cmp 0.
+
+	PCALIGN	$16
 loop64:
-	LXVB16X	(R0)(R8),V2	// scan 64 bytes at a time
+	LXVD2X	(R0)(R8),V2	// Scan 64 bytes at a time, starting at &s[0]
 	VCMPEQUBCC	V2,V1,V6
-	BNE	CR6,foundat0	// match found at R8, jump out
+	BNE	CR6,foundat0	// Match found at R8, jump out
 
-	LXVB16X	(R8)(R11),V2
+	LXVD2X	(R11)(R8),V2
 	VCMPEQUBCC	V2,V1,V6
-	BNE	CR6,foundat1	// match found at R8+16 bytes, jump out
+	BNE	CR6,foundat1	// Match found at R8+16 bytes, jump out
 
-	LXVB16X	(R8)(R12),V2
+	LXVD2X	(R12)(R8),V2
 	VCMPEQUBCC	V2,V1,V6
-	BNE	CR6,foundat2	// match found at R8+32 bytes, jump out
+	BNE	CR6,foundat2	// Match found at R8+32 bytes, jump out
 
-	LXVB16X	(R8)(R6),V2
+	LXVD2X	(R6)(R8),V2
 	VCMPEQUBCC	V2,V1,V6
-	BNE	CR6,foundat3	// match found at R8+48 bytes, jump out
+	BNE	CR6,foundat3	// Match found at R8+48 bytes, jump out
+
 	ADD	$64,R8
-	ADD	$-64,R4
-	CMP	R4,$64		// >=64 bytes left to scan?
-	BGE	loop64
-	CMP	R4,$32
-	BLT	rem		// jump to rem if there are < 32 bytes left
-cmp32:
-	LXVB16X	(R0)(R8),V2	// 32-63 bytes left
+	CMPU	R8,R9,CR1
+	BNE	CR1,loop64	// R8 != &s[len &^ 63]?
+
+	PCALIGN	$32
+	BEQ	notfound	// Is tail length 0? CR0 is set before entering loop64.
+
+	CMP	R4,$32		// Tail length >= 32, use cmp32 path.
+	CMP	R4,$16,CR1
+	BGE	cmp32
+
+	ADD	R8,R4,R9
+	ADD	$-16,R9
+	BLE	CR1,cmp64_tail_gt0
+
+cmp64_tail_gt16:	// Tail length 17 - 32
+	LXVD2X	(R0)(R8),V2
 	VCMPEQUBCC	V2,V1,V6
-	BNE	CR6,foundat0	// match found at R8
+	BNE	CR6,foundat0
 
-	LXVB16X	(R11)(R8),V2
+cmp64_tail_gt0:	// Tail length 1 - 16
+	MOVD	R9,R8
+	LXVD2X	(R0)(R9),V2
 	VCMPEQUBCC	V2,V1,V6
-	BNE	CR6,foundat1	// match found at R8+16
+	BNE	CR6,foundat0
 
-	ADD	$32,R8
-	ADD	$-32,R4
-rem:
-	RLDICR	$0,R8,$60,R8	// align address to reuse code for tail end processing
-	BR	small_string
+	BR	notfound
 
+cmp32:	// Length 32 - 63
+
+	// Bytes 0 - 15
+	LXVD2X	(R0)(R8),V2
+	VCMPEQUBCC	V2,V1,V6
+	BNE	CR6,foundat0
+
+	// Bytes 16 - 31
+	LXVD2X	(R8)(R11),V2
+	VCMPEQUBCC	V2,V1,V6
+	BNE	CR6,foundat1		// Match found at R8+16 bytes, jump out
+
+	BEQ	notfound		// Is length <= 32? (CR0 holds this comparison on entry to cmp32)
+	CMP	R4,$48
+
+	ADD	R4,R8,R9		// Compute &s[len(s)-16]
+	ADD	$32,R8,R8
+	ADD	$-16,R9,R9
+	ISEL	CR0GT,R8,R9,R8		// R8 = len(s) <= 48 ? R9 : R8
+
+	// Bytes 33 - 47
+	LXVD2X	(R0)(R8),V2
+	VCMPEQUBCC	V2,V1,V6
+	BNE	CR6,foundat0		// match found at R8+32 bytes, jump out
+
+	BLE	notfound
+
+	// Bytes 48 - 63
+	MOVD	R9,R8			// R9 holds the final check.
+	LXVD2X	(R0)(R9),V2
+	VCMPEQUBCC	V2,V1,V6
+	BNE	CR6,foundat0		// Match found at R8+48 bytes, jump out
+
+	BR	notfound
+
+// If ISA 3.0 instructions are unavailable, we need to account for the extra 16 added by CNTLZW.
+#ifndef GOPPC64_power9
+#define ADJUST_FOR_CNTLZW -16
+#else
+#define ADJUST_FOR_CNTLZW 0
+#endif
+
+// Now, find the index of the 16B vector the match was discovered in. If CNTLZW is used
+// to determine the offset into the 16B vector, it will overcount by 16. Account for it here.
 foundat3:
-	ADD	$16,R8
+	SUB	R3,R8,R3
+	ADD	$48+ADJUST_FOR_CNTLZW,R3
+	BR	vfound
 foundat2:
-	ADD	$16,R8
+	SUB	R3,R8,R3
+	ADD	$32+ADJUST_FOR_CNTLZW,R3
+	BR	vfound
 foundat1:
-	ADD	$16,R8
+	SUB	R3,R8,R3
+	ADD	$16+ADJUST_FOR_CNTLZW,R3
+	BR	vfound
 foundat0:
-	// Compress the result into a single doubleword and
-	// move it to a GPR for the final calculation.
-	VBPERMQ	V6,V10,V6
-	MFVRD	V6,R3
-	// count leading zeroes upto the match that ends up in low 16 bits
-	// in both endian modes, compute index by subtracting the number by 16
-	CNTLZW	R3,R11
-	ADD	$-16,R11
-	ADD	R8,R11,R3	// Calculate byte address
-	SUB	R17,R3
+	SUB	R3,R8,R3
+	ADD	$0+ADJUST_FOR_CNTLZW,R3
+vfound:
+	// Map equal values into a 16 bit value with earlier matches setting higher bits.
+#ifndef GOPPC64_power9
+	VBPERMQ	V6,V0,V6
+	MFVRD	V6,R4
+	CNTLZW	R4,R4
+#else
+#ifdef GOARCH_ppc64le
+	// Put the value back into LE ordering by swapping doublewords.
+	XXPERMDI	V6,V6,$2,V6
+#endif
+	_VCZBEBB	V6,R4
+#endif
+	ADD	R3,R4,R3
 	RET
-power8:
-	// If we are 64-byte aligned, branch to qw_align just to get the auxiliary values
-	// in V0, V1 and V10, then branch to the preloop.
-	ANDCC	$63,R3,R11
-	BEQ	CR0,qw_align
-	RLDICL	$0,R3,$61,R11
 
-	MOVD	0(R8),R12	// Load one doubleword from the aligned address in R8.
-	CMPB	R12,R5,R3	// Check for a match.
-	AND	R9,R3,R3	// Mask bytes below s_base
-	RLDICR	$0,R7,$60,R7	// Last doubleword in R7
-	CMPU	R3,$0,CR7	// If we have a match, jump to the final computation
-	BNE	CR7,done
-	ADD	$8,R8,R8
+cmp16:	// Length 16 - 31
+	CMPU	R4,$16
+	ADD	R4,R3,R9
+	BLT	cmp8
+
+	ADD	$-16,R9,R9		// &s[len(s)-16]
+
+	// Bytes 0 - 15
+	LXVD2X	(R0)(R3),V2
+	VCMPEQUBCC	V2,V1,V6
+	MOVD	R3,R8
+	BNE	CR6,foundat0		// Match found at R8+32 bytes, jump out
+
+	BEQ	notfound
+
+	// Bytes 16 - 30
+	MOVD	R9,R8			// R9 holds the final check.
+	LXVD2X	(R0)(R9),V2
+	VCMPEQUBCC	V2,V1,V6
+	BNE	CR6,foundat0		// Match found at R8+48 bytes, jump out
+
+	BR	notfound
+
+
+cmp8:	// Length 8 - 15
+#ifdef GOPPC64_power10
+	// Load all the bytes into a single VSR in BE order.
+	SLD	$56,R4,R5
+	LXVLL	R3,R5,V2
+	// Compare and count the number which don't match.
+	VCMPEQUB	V2,V1,V6
+	VCLZLSBB	V6,R3
+	// If count is the number of bytes, or more. No matches are found.
+	CMPU	R3,R4
+	MOVD	$-1,R5
+	// Otherwise, the count is the index of the first match.
+	ISEL	CR0LT,R3,R5,R3
+	RET
+#else
+	RLDIMI	$8,R5,$48,R5	// Replicating the byte across the register.
+	RLDIMI	$16,R5,$32,R5
+	RLDIMI	$32,R5,$0,R5
+	CMPU	R4,$8
+	BLT	cmp4
+	MOVD	$-8,R11
 	ADD	$-8,R4,R4
+
+	_LDBEX	(R0)(R3),R10
+	_LDBEX	(R11)(R9),R11
+	CMPB	R10,R5,R10
+	CMPB	R11,R5,R11
+	CMPU	R10,$0
+	CMPU	R11,$0,CR1
+	CNTLZD	R10,R10
+	CNTLZD	R11,R11
+	SRD	$3,R10,R3
+	SRD	$3,R11,R11
+	BNE	found
+
 	ADD	R4,R11,R4
-
-	// Check for quadword alignment
-	ANDCC	$15,R8,R11
-	BEQ	CR0,qw_align
-
-	// Not aligned, so handle the next doubleword
-	MOVD	0(R8),R12
-	CMPB	R12,R5,R3
-	CMPU	R3,$0,CR7
-	BNE	CR7,done
-	ADD	$8,R8,R8
-	ADD	$-8,R4,R4
-
-	// Either quadword aligned or 64-byte at this point. We can use LVX.
-qw_align:
-
-	// Set up auxiliary data for the vectorized algorithm.
-	VSPLTISB  $0,V0		// Replicate 0 across V0
-	VSPLTISB  $3,V10	// Use V10 as control for VBPERMQ
-	MTVRD	  R5,V1
-	LVSL	  (R0+R0),V11
-	VSLB	  V11,V10,V10
-	VSPLTB	  $7,V1,V1	// Replicate byte across V1
-	CMPU	  R4, $64	// If len ≤ 64, don't use the vectorized loop
-	BLE	  tail
-
-	// We will load 4 quardwords per iteration in the loop, so check for
-	// 64-byte alignment. If 64-byte aligned, then branch to the preloop.
-	ANDCC	  $63,R8,R11
-	BEQ	  CR0,preloop
-
-	// Not 64-byte aligned. Load one quadword at a time until aligned.
-	LVX	    (R8+R0),V4
-	VCMPEQUBCC  V1,V4,V6		// Check for byte in V4
-	BNE	    CR6,found_qw_align
-	ADD	    $16,R8,R8
-	ADD	    $-16,R4,R4
-
-	ANDCC	    $63,R8,R11
-	BEQ	    CR0,preloop
-	LVX	    (R8+R0),V4
-	VCMPEQUBCC  V1,V4,V6		// Check for byte in V4
-	BNE	    CR6,found_qw_align
-	ADD	    $16,R8,R8
-	ADD	    $-16,R4,R4
-
-	ANDCC	    $63,R8,R11
-	BEQ	    CR0,preloop
-	LVX	    (R8+R0),V4
-	VCMPEQUBCC  V1,V4,V6		// Check for byte in V4
-	BNE	    CR6,found_qw_align
-	ADD	    $-16,R4,R4
-	ADD	    $16,R8,R8
-
-	// 64-byte aligned. Prepare for the main loop.
-preloop:
-	CMPU	R4,$64
-	BLE	tail	      // If len ≤ 64, don't use the vectorized loop
-
-	// We are now aligned to a 64-byte boundary. We will load 4 quadwords
-	// per loop iteration. The last doubleword is in R10, so our loop counter
-	// starts at (R10-R8)/64.
-	SUB	R8,R10,R6
-	SRD	$6,R6,R9      // Loop counter in R9
-	MOVD	R9,CTR
-
-	ADD	$-64,R8,R8   // Adjust index for loop entry
-	MOVD	$16,R11      // Load offsets for the vector loads
-	MOVD	$32,R9
-	MOVD	$48,R7
-
-	// Main loop we will load 64 bytes per iteration
-loop:
-	ADD	    $64,R8,R8	      // Fuse addi+lvx for performance
-	LVX	    (R8+R0),V2	      // Load 4 16-byte vectors
-	LVX	    (R8+R11),V3
-	VCMPEQUB    V1,V2,V6	      // Look for byte in each vector
-	VCMPEQUB    V1,V3,V7
-
-	LVX	    (R8+R9),V4
-	LVX	    (R8+R7),V5
-	VCMPEQUB    V1,V4,V8
-	VCMPEQUB    V1,V5,V9
-
-	VOR	    V6,V7,V11	      // Compress the result in a single vector
-	VOR	    V8,V9,V12
-	VOR	    V11,V12,V13
-	VCMPEQUBCC  V0,V13,V14	      // Check for byte
-	BGE	    CR6,found
-	BC	    16,0,loop	      // bdnz loop
-
-	// Handle the tailing bytes or R4 ≤ 64
-	RLDICL	$0,R6,$58,R4
-	ADD	$64,R8,R8
-tail:
-	CMPU	    R4,$0
-	BEQ	    notfound
-	LVX	    (R8+R0),V4
-	VCMPEQUBCC  V1,V4,V6
-	BNE	    CR6,found_qw_align
-	ADD	    $16,R8,R8
-	CMPU	    R4,$16,CR6
-	BLE	    CR6,notfound
-	ADD	    $-16,R4,R4
-
-	LVX	    (R8+R0),V4
-	VCMPEQUBCC  V1,V4,V6
-	BNE	    CR6,found_qw_align
-	ADD	    $16,R8,R8
-	CMPU	    R4,$16,CR6
-	BLE	    CR6,notfound
-	ADD	    $-16,R4,R4
-
-	LVX	    (R8+R0),V4
-	VCMPEQUBCC  V1,V4,V6
-	BNE	    CR6,found_qw_align
-	ADD	    $16,R8,R8
-	CMPU	    R4,$16,CR6
-	BLE	    CR6,notfound
-	ADD	    $-16,R4,R4
-
-	LVX	    (R8+R0),V4
-	VCMPEQUBCC  V1,V4,V6
-	BNE	    CR6,found_qw_align
-
-notfound:
-	MOVD	$-1, R3
+	MOVD	$-1,R3
+	ISEL	CR1EQ,R3,R4,R3
 	RET
 
+cmp4:	// Length 4 - 7
+	CMPU	R4,$4
+	BLT	cmp2
+	MOVD	$-4,R11
+	ADD	$-4,R4,R4
+
+	_LWBEX	(R0)(R3),R10
+	_LWBEX	(R11)(R9),R11
+	CMPB	R10,R5,R10
+	CMPB	R11,R5,R11
+	CNTLZW	R10,R10
+	CNTLZW	R11,R11
+	CMPU	R10,$32
+	CMPU	R11,$32,CR1
+	SRD	$3,R10,R3
+	SRD	$3,R11,R11
+	BNE	found
+
+	ADD	R4,R11,R4
+	MOVD	$-1,R3
+	ISEL	CR1EQ,R3,R4,R3
+	RET
+
+cmp2:	// Length 2 - 3
+	CMPU	R4,$2
+	BLT	cmp1
+
+	_LHBEX	(R0)(R3),R10
+	CMPB	R10,R5,R10
+	SLDCC	$48,R10,R10
+	CNTLZD	R10,R10
+	SRD	$3,R10,R3
+	BNE	found
+
+cmp1:	// Length 1
+	MOVD	$-1,R3
+	ANDCC	$1,R4,R31
+	BEQ	found
+
+	MOVBZ	-1(R9),R10
+	CMPB	R10,R5,R10
+	ANDCC	$1,R10
+	ADD	$-1,R4
+	ISEL	CR0EQ,R3,R4,R3
+
 found:
-	// We will now compress the results into a single doubleword,
-	// so it can be moved to a GPR for the final index calculation.
-
-	// The bytes in V6-V9 are either 0x00 or 0xFF. So, permute the
-	// first bit of each byte into bits 48-63.
-	VBPERMQ	  V6,V10,V6
-	VBPERMQ	  V7,V10,V7
-	VBPERMQ	  V8,V10,V8
-	VBPERMQ	  V9,V10,V9
-
-	// Shift each 16-bit component into its correct position for
-	// merging into a single doubleword.
-#ifdef GOARCH_ppc64le
-	VSLDOI	  $2,V7,V7,V7
-	VSLDOI	  $4,V8,V8,V8
-	VSLDOI	  $6,V9,V9,V9
-#else
-	VSLDOI	  $6,V6,V6,V6
-	VSLDOI	  $4,V7,V7,V7
-	VSLDOI	  $2,V8,V8,V8
-#endif
-
-	// Merge V6-V9 into a single doubleword and move to a GPR.
-	VOR	V6,V7,V11
-	VOR	V8,V9,V4
-	VOR	V4,V11,V4
-	MFVRD	V4,R3
-
-#ifdef GOARCH_ppc64le
-	ADD	  $-1,R3,R11
-	ANDN	  R3,R11,R11
-	POPCNTD	  R11,R11	// Count trailing zeros (Little Endian).
-#else
-	CNTLZD	R3,R11		// Count leading zeros (Big Endian).
-#endif
-	ADD	R8,R11,R3	// Calculate byte address
-
-return:
-	SUB	R17, R3
 	RET
-
-found_qw_align:
-	// Use the same algorithm as above. Compress the result into
-	// a single doubleword and move it to a GPR for the final
-	// calculation.
-	VBPERMQ	  V6,V10,V6
-
-#ifdef GOARCH_ppc64le
-	MFVRD	  V6,R3
-	ADD	  $-1,R3,R11
-	ANDN	  R3,R11,R11
-	POPCNTD	  R11,R11
-#else
-	VSLDOI	  $6,V6,V6,V6
-	MFVRD	  V6,R3
-	CNTLZD	  R3,R11
 #endif
-	ADD	  R8,R11,R3
-	CMPU	  R11,R4
-	BLT	  return
-	BR	  notfound
-	PCALIGN	  $16
 
-done:
-	ADD	$-1,R10,R6
-	// Offset of last index for the final
-	// doubleword comparison
-	RLDICL	$0,R6,$61,R6
-	// At this point, R3 has 0xFF in the same position as the byte we are
-	// looking for in the doubleword. Use that to calculate the exact index
-	// of the byte.
-#ifdef GOARCH_ppc64le
-	ADD	$-1,R3,R11
-	ANDN	R3,R11,R11
-	POPCNTD	R11,R11		// Count trailing zeros (Little Endian).
-#else
-	CNTLZD	R3,R11		// Count leading zeros (Big Endian).
-#endif
-	CMPU	R8,R7		// Check if we are at the last doubleword.
-	SRD	$3,R11		// Convert trailing zeros to bytes.
-	ADD	R11,R8,R3
-	CMPU	R11,R6,CR7	// If at the last doubleword, check the byte offset.
-	BNE	return
-	BLE	CR7,return
-	BR	notfound
-
-small_string:
-	// process string of length < 32 bytes
-	// We unroll this loop for better performance.
-	CMPU	R4,$0		// Check for length=0
-	BEQ	notfound
-
-	MOVD	0(R8),R12	// Load one doubleword from the aligned address in R8.
-	CMPB	R12,R5,R3	// Check for a match.
-	AND	R9,R3,R3	// Mask bytes below s_base.
-	CMPU	R3,$0,CR7	// If we have a match, jump to the final computation.
-	RLDICR	$0,R7,$60,R7	// Last doubleword in R7.
-	CMPU	R8,R7
-	BNE	CR7,done
-	BEQ	notfound	// Hit length.
-
-	MOVDU	8(R8),R12
-	CMPB	R12,R5,R3
-	CMPU	R3,$0,CR6
-	CMPU	R8,R7
-	BNE	CR6,done
-	BEQ	notfound
-
-	MOVDU	8(R8),R12
-	CMPB	R12,R5,R3
-	CMPU	R3,$0,CR6
-	CMPU	R8,R7
-	BNE	CR6,done
-	BEQ	notfound
-
-	MOVDU	8(R8),R12
-	CMPB	R12,R5,R3
-	CMPU	R3,$0,CR6
-	CMPU	R8,R7
-	BNE	CR6,done
-	BEQ	notfound
-
-	MOVDU	8(R8),R12
-	CMPB	R12,R5,R3
-	CMPU	R3,$0,CR6
-	BNE	CR6,done
-	BR	notfound
+notfound:
+	MOVD $-1,R3
+	RET
 
diff --git a/src/internal/cfg/cfg.go b/src/internal/cfg/cfg.go
index 78664d7..2af0ec7 100644
--- a/src/internal/cfg/cfg.go
+++ b/src/internal/cfg/cfg.go
@@ -38,6 +38,7 @@
 	GOARM
 	GOBIN
 	GOCACHE
+	GOCACHEPROG
 	GOENV
 	GOEXE
 	GOEXPERIMENT
@@ -59,6 +60,7 @@
 	GOROOT
 	GOSUMDB
 	GOTMPDIR
+	GOTOOLCHAIN
 	GOTOOLDIR
 	GOVCS
 	GOWASM
diff --git a/src/internal/coverage/cformat/fmt_test.go b/src/internal/coverage/cformat/fmt_test.go
index 4d6da44..f5ed01b 100644
--- a/src/internal/coverage/cformat/fmt_test.go
+++ b/src/internal/coverage/cformat/fmt_test.go
@@ -7,13 +7,13 @@
 import (
 	"internal/coverage"
 	"internal/coverage/cformat"
+	"slices"
 	"strings"
 	"testing"
 )
 
 func TestBasics(t *testing.T) {
 	fm := cformat.NewFormatter(coverage.CtrModeAtomic)
-	fm.SetPackage("my/pack")
 
 	mku := func(stl, enl, nx uint32) coverage.CoverableUnit {
 		return coverage.CoverableUnit{
@@ -34,6 +34,7 @@
 	fn3units := []coverage.CoverableUnit{
 		mku(99, 100, 1),
 	}
+	fm.SetPackage("my/pack1")
 	for k, u := range fn1units {
 		fm.AddUnit("p.go", "f1", false, u, uint32(k))
 	}
@@ -41,52 +42,114 @@
 		fm.AddUnit("q.go", "f2", false, u, 0)
 		fm.AddUnit("q.go", "f2", false, u, uint32(k))
 	}
+	fm.SetPackage("my/pack2")
 	for _, u := range fn3units {
 		fm.AddUnit("lit.go", "f3", true, u, 0)
 	}
 
-	var b1, b2, b3 strings.Builder
+	var b1, b2, b3, b4 strings.Builder
 	if err := fm.EmitTextual(&b1); err != nil {
 		t.Fatalf("EmitTextual returned %v", err)
 	}
 	wantText := strings.TrimSpace(`
 mode: atomic
-lit.go:99.0,100.0 1 0
 p.go:10.0,11.0 2 0
 p.go:15.0,11.0 1 1
 q.go:20.0,25.0 3 0
 q.go:30.0,31.0 2 1
-q.go:33.0,40.0 7 2`)
+q.go:33.0,40.0 7 2
+lit.go:99.0,100.0 1 0`)
 	gotText := strings.TrimSpace(b1.String())
 	if wantText != gotText {
 		t.Errorf("emit text: got:\n%s\nwant:\n%s\n", gotText, wantText)
 	}
 
-	if err := fm.EmitPercent(&b2, "", false); err != nil {
+	// Percent output with no aggregation.
+	noCoverPkg := ""
+	if err := fm.EmitPercent(&b2, noCoverPkg, false, false); err != nil {
 		t.Fatalf("EmitPercent returned %v", err)
 	}
-	wantPercent := strings.TrimSpace(`
-my/pack	coverage: 62.5% of statements
+	wantPercent := strings.Fields(`
+       	my/pack1		coverage: 66.7% of statements
+        my/pack2		coverage: 0.0% of statements
 `)
-	gotPercent := strings.TrimSpace(b2.String())
-	if wantPercent != gotPercent {
-		t.Errorf("emit percent: got:\n%s\nwant:\n%s\n", gotPercent, wantPercent)
+	gotPercent := strings.Fields(b2.String())
+	if !slices.Equal(wantPercent, gotPercent) {
+		t.Errorf("emit percent: got:\n%+v\nwant:\n%+v\n",
+			gotPercent, wantPercent)
 	}
 
-	if err := fm.EmitFuncs(&b3); err != nil {
+	// Percent mode with aggregation.
+	withCoverPkg := " in ./..."
+	if err := fm.EmitPercent(&b3, withCoverPkg, false, true); err != nil {
+		t.Fatalf("EmitPercent returned %v", err)
+	}
+	wantPercent = strings.Fields(`
+		coverage: 62.5% of statements in ./...
+`)
+	gotPercent = strings.Fields(b3.String())
+	if !slices.Equal(wantPercent, gotPercent) {
+		t.Errorf("emit percent: got:\n%+v\nwant:\n%+v\n",
+			gotPercent, wantPercent)
+	}
+
+	if err := fm.EmitFuncs(&b4); err != nil {
 		t.Fatalf("EmitFuncs returned %v", err)
 	}
 	wantFuncs := strings.TrimSpace(`
 p.go:10:	f1		33.3%
 q.go:20:	f2		75.0%
 total		(statements)	62.5%`)
-	gotFuncs := strings.TrimSpace(b3.String())
+	gotFuncs := strings.TrimSpace(b4.String())
 	if wantFuncs != gotFuncs {
 		t.Errorf("emit funcs: got:\n%s\nwant:\n%s\n", gotFuncs, wantFuncs)
 	}
 	if false {
 		t.Logf("text is %s\n", b1.String())
 		t.Logf("perc is %s\n", b2.String())
-		t.Logf("funcs is %s\n", b3.String())
+		t.Logf("perc2 is %s\n", b3.String())
+		t.Logf("funcs is %s\n", b4.String())
+	}
+}
+
+func TestEmptyPackages(t *testing.T) {
+
+	fm := cformat.NewFormatter(coverage.CtrModeAtomic)
+	fm.SetPackage("my/pack1")
+	fm.SetPackage("my/pack2")
+
+	// No aggregation.
+	{
+		var b strings.Builder
+		noCoverPkg := ""
+		if err := fm.EmitPercent(&b, noCoverPkg, true, false); err != nil {
+			t.Fatalf("EmitPercent returned %v", err)
+		}
+		wantPercent := strings.Fields(`
+       	my/pack1 coverage:	[no statements]
+        my/pack2 coverage:	[no statements]
+`)
+		gotPercent := strings.Fields(b.String())
+		if !slices.Equal(wantPercent, gotPercent) {
+			t.Errorf("emit percent: got:\n%+v\nwant:\n%+v\n",
+				gotPercent, wantPercent)
+		}
+	}
+
+	// With aggregation.
+	{
+		var b strings.Builder
+		noCoverPkg := ""
+		if err := fm.EmitPercent(&b, noCoverPkg, true, true); err != nil {
+			t.Fatalf("EmitPercent returned %v", err)
+		}
+		wantPercent := strings.Fields(`
+       	coverage:	[no statements]
+`)
+		gotPercent := strings.Fields(b.String())
+		if !slices.Equal(wantPercent, gotPercent) {
+			t.Errorf("emit percent: got:\n%+v\nwant:\n%+v\n",
+				gotPercent, wantPercent)
+		}
 	}
 }
diff --git a/src/internal/coverage/cformat/format.go b/src/internal/coverage/cformat/format.go
index a8276ff..7e7a277 100644
--- a/src/internal/coverage/cformat/format.go
+++ b/src/internal/coverage/cformat/format.go
@@ -23,7 +23,7 @@
 //				}
 //			}
 //		}
-//		myformatter.EmitPercent(os.Stdout, "")
+//		myformatter.EmitPercent(os.Stdout, "", true, true)
 //		myformatter.EmitTextual(somefile)
 //
 // These apis are linked into tests that are built with "-cover", and
@@ -200,17 +200,33 @@
 }
 
 // EmitPercent writes out a "percentage covered" string to the writer 'w'.
-func (fm *Formatter) EmitPercent(w io.Writer, covpkgs string, noteEmpty bool) error {
+func (fm *Formatter) EmitPercent(w io.Writer, covpkgs string, noteEmpty bool, aggregate bool) error {
 	pkgs := make([]string, 0, len(fm.pm))
 	for importpath := range fm.pm {
 		pkgs = append(pkgs, importpath)
 	}
+
+	rep := func(cov, tot uint64) error {
+		if tot != 0 {
+			if _, err := fmt.Fprintf(w, "coverage: %.1f%% of statements%s\n",
+				100.0*float64(cov)/float64(tot), covpkgs); err != nil {
+				return err
+			}
+		} else if noteEmpty {
+			if _, err := fmt.Fprintf(w, "coverage: [no statements]\n"); err != nil {
+				return err
+			}
+		}
+		return nil
+	}
+
 	sort.Strings(pkgs)
-	seenPkg := false
+	var totalStmts, coveredStmts uint64
 	for _, importpath := range pkgs {
-		seenPkg = true
 		p := fm.pm[importpath]
-		var totalStmts, coveredStmts uint64
+		if !aggregate {
+			totalStmts, coveredStmts = 0, 0
+		}
 		for unit, count := range p.unitTable {
 			nx := uint64(unit.NxStmts)
 			totalStmts += nx
@@ -218,21 +234,17 @@
 				coveredStmts += nx
 			}
 		}
-		if _, err := fmt.Fprintf(w, "\t%s\t", importpath); err != nil {
-			return err
-		}
-		if totalStmts == 0 {
-			if _, err := fmt.Fprintf(w, "coverage: [no statements]\n"); err != nil {
+		if !aggregate {
+			if _, err := fmt.Fprintf(w, "\t%s\t\t", importpath); err != nil {
 				return err
 			}
-		} else {
-			if _, err := fmt.Fprintf(w, "coverage: %.1f%% of statements%s\n", 100*float64(coveredStmts)/float64(totalStmts), covpkgs); err != nil {
+			if err := rep(coveredStmts, totalStmts); err != nil {
 				return err
 			}
 		}
 	}
-	if noteEmpty && !seenPkg {
-		if _, err := fmt.Fprintf(w, "coverage: [no statements]\n"); err != nil {
+	if aggregate {
+		if err := rep(coveredStmts, totalStmts); err != nil {
 			return err
 		}
 	}
diff --git a/src/internal/coverage/cmddefs.go b/src/internal/coverage/cmddefs.go
index b30c37a0..49376a4 100644
--- a/src/internal/coverage/cmddefs.go
+++ b/src/internal/coverage/cmddefs.go
@@ -71,3 +71,17 @@
 	// Counter granularity (perblock or perfunc).
 	CounterGranularity string
 }
+
+// MetaFilePaths contains information generated by the Go command and
+// the read in by coverage test support functions within an executing
+// "go test -cover" binary.
+type MetaFileCollection struct {
+	ImportPaths       []string
+	MetaFileFragments []string
+}
+
+// Name of file within the "go test -cover" temp coverdir directory
+// containing a list of meta-data files for packages being tested
+// in a "go test -coverpkg=... ..." run. This constant is shared
+// by the Go command and by the coverage runtime.
+const MetaFilesFileName = "metafiles.txt"
diff --git a/src/internal/coverage/cmerge/merge.go b/src/internal/coverage/cmerge/merge.go
index c482b8b..1339803 100644
--- a/src/internal/coverage/cmerge/merge.go
+++ b/src/internal/coverage/cmerge/merge.go
@@ -13,6 +13,13 @@
 	"math"
 )
 
+type ModeMergePolicy uint8
+
+const (
+	ModeMergeStrict ModeMergePolicy = iota
+	ModeMergeRelaxed
+)
+
 // Merger provides state and methods to help manage the process of
 // merging together coverage counter data for a given function, for
 // tools that need to implicitly merge counter as they read multiple
@@ -20,9 +27,14 @@
 type Merger struct {
 	cmode    coverage.CounterMode
 	cgran    coverage.CounterGranularity
+	policy   ModeMergePolicy
 	overflow bool
 }
 
+func (cm *Merger) SetModeMergePolicy(policy ModeMergePolicy) {
+	cm.policy = policy
+}
+
 // MergeCounters takes the counter values in 'src' and merges them
 // into 'dst' according to the correct counter mode.
 func (m *Merger) MergeCounters(dst, src []uint32) (error, bool) {
@@ -56,7 +68,7 @@
 	return result
 }
 
-// Saturating add does a saturing addition of 'dst' and 'src',
+// Saturating add does a saturating addition of 'dst' and 'src',
 // returning added value or math.MaxUint32 plus an overflow flag.
 func SaturatingAdd(dst, src uint32) (uint32, bool) {
 	d, s := uint64(dst), uint64(src)
@@ -72,20 +84,31 @@
 // SetModeAndGranularity records the counter mode and granularity for
 // the current merge. In the specific case of merging across coverage
 // data files from different binaries, where we're combining data from
-// more than one meta-data file, we need to check for mode/granularity
-// clashes.
+// more than one meta-data file, we need to check for and resolve
+// mode/granularity clashes.
 func (cm *Merger) SetModeAndGranularity(mdf string, cmode coverage.CounterMode, cgran coverage.CounterGranularity) error {
-	// Collect counter mode and granularity so as to detect clashes.
-	if cm.cmode != coverage.CtrModeInvalid {
-		if cm.cmode != cmode {
-			return fmt.Errorf("counter mode clash while reading meta-data file %s: previous file had %s, new file has %s", mdf, cm.cmode.String(), cmode.String())
-		}
+	if cm.cmode == coverage.CtrModeInvalid {
+		// Set merger mode based on what we're seeing here.
+		cm.cmode = cmode
+		cm.cgran = cgran
+	} else {
+		// Granularity clashes are always errors.
 		if cm.cgran != cgran {
 			return fmt.Errorf("counter granularity clash while reading meta-data file %s: previous file had %s, new file has %s", mdf, cm.cgran.String(), cgran.String())
 		}
+		// Mode clashes are treated as errors if we're using the
+		// default strict policy.
+		if cm.cmode != cmode {
+			if cm.policy == ModeMergeStrict {
+				return fmt.Errorf("counter mode clash while reading meta-data file %s: previous file had %s, new file has %s", mdf, cm.cmode.String(), cmode.String())
+			}
+			// In the case of a relaxed mode merge policy, upgrade
+			// mode if needed.
+			if cm.cmode < cmode {
+				cm.cmode = cmode
+			}
+		}
 	}
-	cm.cmode = cmode
-	cm.cgran = cgran
 	return nil
 }
 
diff --git a/src/internal/coverage/cmerge/merge_test.go b/src/internal/coverage/cmerge/merge_test.go
index e45589f..0e6112a 100644
--- a/src/internal/coverage/cmerge/merge_test.go
+++ b/src/internal/coverage/cmerge/merge_test.go
@@ -15,11 +15,11 @@
 	m := &cmerge.Merger{}
 	err := m.SetModeAndGranularity("mdf1.data", coverage.CtrModeSet, coverage.CtrGranularityPerBlock)
 	if err != nil {
-		t.Fatalf("unexpected clash")
+		t.Fatalf("unexpected clash: %v", err)
 	}
 	err = m.SetModeAndGranularity("mdf1.data", coverage.CtrModeSet, coverage.CtrGranularityPerBlock)
 	if err != nil {
-		t.Fatalf("unexpected clash")
+		t.Fatalf("unexpected clash: %v", err)
 	}
 	err = m.SetModeAndGranularity("mdf1.data", coverage.CtrModeCount, coverage.CtrGranularityPerBlock)
 	if err == nil {
@@ -29,10 +29,23 @@
 	if err == nil {
 		t.Fatalf("expected granularity clash, not found")
 	}
+	m.SetModeMergePolicy(cmerge.ModeMergeRelaxed)
+	err = m.SetModeAndGranularity("mdf1.data", coverage.CtrModeCount, coverage.CtrGranularityPerBlock)
+	if err != nil {
+		t.Fatalf("unexpected clash: %v", err)
+	}
+	err = m.SetModeAndGranularity("mdf1.data", coverage.CtrModeSet, coverage.CtrGranularityPerBlock)
+	if err != nil {
+		t.Fatalf("unexpected clash: %v", err)
+	}
+	err = m.SetModeAndGranularity("mdf1.data", coverage.CtrModeAtomic, coverage.CtrGranularityPerBlock)
+	if err != nil {
+		t.Fatalf("unexpected clash: %v", err)
+	}
 	m.ResetModeAndGranularity()
 	err = m.SetModeAndGranularity("mdf1.data", coverage.CtrModeCount, coverage.CtrGranularityPerFunc)
 	if err != nil {
-		t.Fatalf("unexpected clash after reset")
+		t.Fatalf("unexpected clash after reset: %v", err)
 	}
 }
 
diff --git a/src/internal/coverage/decodecounter/decodecounterfile.go b/src/internal/coverage/decodecounter/decodecounterfile.go
index fce060a..83934fe 100644
--- a/src/internal/coverage/decodecounter/decodecounterfile.go
+++ b/src/internal/coverage/decodecounter/decodecounterfile.go
@@ -236,7 +236,7 @@
 	return cdr.ftr.NumSegments
 }
 
-// BeginNextSegment sets up the the reader to read the next segment,
+// BeginNextSegment sets up the reader to read the next segment,
 // returning TRUE if we do have another segment to read, or FALSE
 // if we're done with all the segments (also an error if
 // something went wrong).
diff --git a/src/internal/coverage/decodemeta/decode.go b/src/internal/coverage/decodemeta/decode.go
index 71f1c56..fa047c7 100644
--- a/src/internal/coverage/decodemeta/decode.go
+++ b/src/internal/coverage/decodemeta/decode.go
@@ -14,6 +14,7 @@
 	"internal/coverage"
 	"internal/coverage/slicereader"
 	"internal/coverage/stringtab"
+	"io"
 	"os"
 )
 
@@ -55,7 +56,9 @@
 func (d *CoverageMetaDataDecoder) readStringTable() error {
 	// Seek to the correct location to read the string table.
 	stringTableLocation := int64(coverage.CovMetaHeaderSize + 4*d.hdr.NumFuncs)
-	d.r.SeekTo(stringTableLocation)
+	if _, err := d.r.Seek(stringTableLocation, io.SeekStart); err != nil {
+		return err
+	}
 
 	// Read the table itself.
 	d.strtab = stringtab.NewReader(d.r)
@@ -88,7 +91,9 @@
 
 	// Seek to the correct location to read the function offset and read it.
 	funcOffsetLocation := int64(coverage.CovMetaHeaderSize + 4*fidx)
-	d.r.SeekTo(funcOffsetLocation)
+	if _, err := d.r.Seek(funcOffsetLocation, io.SeekStart); err != nil {
+		return err
+	}
 	foff := d.r.ReadUint32()
 
 	// Check assumptions
@@ -97,7 +102,10 @@
 	}
 
 	// Seek to the correct location to read the function.
-	d.r.SeekTo(int64(foff))
+	floc := int64(foff)
+	if _, err := d.r.Seek(floc, io.SeekStart); err != nil {
+		return err
+	}
 
 	// Preamble containing number of units, file, and function.
 	numUnits := uint32(d.r.ReadULEB128())
diff --git a/src/internal/coverage/defs.go b/src/internal/coverage/defs.go
index 4a41f57..8751b9f 100644
--- a/src/internal/coverage/defs.go
+++ b/src/internal/coverage/defs.go
@@ -4,7 +4,7 @@
 
 package coverage
 
-// Types and constants related to the output files files written
+// Types and constants related to the output files written
 // by code coverage tooling. When a coverage-instrumented binary
 // is run, it emits two output files: a meta-data output file, and
 // a counter data output file.
@@ -172,7 +172,7 @@
 // jumps or control transfers). An "intraline" unit corresponds to a
 // logical clause nested within some other simple unit. A simple unit
 // will have a zero Parent value; for an intraline unit NxStmts will
-// be zero and and Parent will be set to 1 plus the index of the
+// be zero and Parent will be set to 1 plus the index of the
 // containing simple statement. Example:
 //
 //	L7:   q := 1
diff --git a/src/internal/coverage/encodecounter/encode.go b/src/internal/coverage/encodecounter/encode.go
index 8db4f51..5958673 100644
--- a/src/internal/coverage/encodecounter/encode.go
+++ b/src/internal/coverage/encodecounter/encode.go
@@ -26,6 +26,7 @@
 type CoverageDataWriter struct {
 	stab    *stringtab.Writer
 	w       *bufio.Writer
+	csh     coverage.CounterSegmentHeader
 	tmp     []byte
 	cflavor coverage.CounterFlavor
 	segs    uint32
@@ -47,13 +48,10 @@
 
 // CounterVisitor describes a helper object used during counter file
 // writing; when writing counter data files, clients pass a
-// CounterVisitor to the write/emit routines. The writers will then
-// first invoke the visitor's NumFuncs() method to find out how many
-// function's worth of data to write, then it will invoke VisitFuncs.
-// The expectation is that the VisitFuncs method will then invoke the
-// callback "f" with data for each function to emit to the file.
+// CounterVisitor to the write/emit routines, then the expectation is
+// that the VisitFuncs method will then invoke the callback "f" with
+// data for each function to emit to the file.
 type CounterVisitor interface {
-	NumFuncs() (int, error)
 	VisitFuncs(f CounterVisitorFn) error
 }
 
@@ -86,23 +84,43 @@
 	return nil
 }
 
-func (cfw *CoverageDataWriter) writeSegmentPreamble(args map[string]string, visitor CounterVisitor) error {
-	var csh coverage.CounterSegmentHeader
-	if nf, err := visitor.NumFuncs(); err != nil {
-		return err
-	} else {
-		csh.FcnEntries = uint64(nf)
+func (cfw *CoverageDataWriter) patchSegmentHeader(ws *slicewriter.WriteSeeker) error {
+	// record position
+	off, err := ws.Seek(0, io.SeekCurrent)
+	if err != nil {
+		return fmt.Errorf("error seeking in patchSegmentHeader: %v", err)
 	}
+	// seek back to start so that we can update the segment header
+	if _, err := ws.Seek(0, io.SeekStart); err != nil {
+		return fmt.Errorf("error seeking in patchSegmentHeader: %v", err)
+	}
+	if cfw.debug {
+		fmt.Fprintf(os.Stderr, "=-= writing counter segment header: %+v", cfw.csh)
+	}
+	if err := binary.Write(ws, binary.LittleEndian, cfw.csh); err != nil {
+		return err
+	}
+	// ... and finally return to the original offset.
+	if _, err := ws.Seek(off, io.SeekStart); err != nil {
+		return fmt.Errorf("error seeking in patchSegmentHeader: %v", err)
+	}
+	return nil
+}
+
+func (cfw *CoverageDataWriter) writeSegmentPreamble(args map[string]string, ws *slicewriter.WriteSeeker) error {
+	if err := binary.Write(ws, binary.LittleEndian, cfw.csh); err != nil {
+		return err
+	}
+	hdrsz := uint32(len(ws.BytesWritten()))
 
 	// Write string table and args to a byte slice (since we need
 	// to capture offsets at various points), then emit the slice
 	// once we are done.
 	cfw.stab.Freeze()
-	ws := &slicewriter.WriteSeeker{}
 	if err := cfw.stab.Write(ws); err != nil {
 		return err
 	}
-	csh.StrTabLen = uint32(len(ws.BytesWritten()))
+	cfw.csh.StrTabLen = uint32(len(ws.BytesWritten())) - hdrsz
 
 	akeys := make([]string, 0, len(args))
 	for k := range args {
@@ -138,21 +156,8 @@
 	if err := padToFourByteBoundary(ws); err != nil {
 		return err
 	}
-	csh.ArgsLen = uint32(len(ws.BytesWritten())) - csh.StrTabLen
+	cfw.csh.ArgsLen = uint32(len(ws.BytesWritten())) - (cfw.csh.StrTabLen + hdrsz)
 
-	if cfw.debug {
-		fmt.Fprintf(os.Stderr, "=-= counter segment header: %+v", csh)
-		fmt.Fprintf(os.Stderr, " FcnEntries=0x%x StrTabLen=0x%x ArgsLen=0x%x\n",
-			csh.FcnEntries, csh.StrTabLen, csh.ArgsLen)
-	}
-
-	// At this point we can now do the actual write.
-	if err := binary.Write(cfw.w, binary.LittleEndian, csh); err != nil {
-		return err
-	}
-	if err := cfw.writeBytes(ws.BytesWritten()); err != nil {
-		return err
-	}
 	return nil
 }
 
@@ -169,10 +174,17 @@
 		cfw.stab.Lookup(v)
 	}
 
-	if err = cfw.writeSegmentPreamble(args, visitor); err != nil {
+	ws := &slicewriter.WriteSeeker{}
+	if err = cfw.writeSegmentPreamble(args, ws); err != nil {
 		return err
 	}
-	if err = cfw.writeCounters(visitor); err != nil {
+	if err = cfw.writeCounters(visitor, ws); err != nil {
+		return err
+	}
+	if err = cfw.patchSegmentHeader(ws); err != nil {
+		return err
+	}
+	if err := cfw.writeBytes(ws.BytesWritten()); err != nil {
 		return err
 	}
 	if err = cfw.writeFooter(); err != nil {
@@ -214,7 +226,7 @@
 	return nil
 }
 
-func (cfw *CoverageDataWriter) writeCounters(visitor CounterVisitor) error {
+func (cfw *CoverageDataWriter) writeCounters(visitor CounterVisitor, ws *slicewriter.WriteSeeker) error {
 	// Notes:
 	// - this version writes everything little-endian, which means
 	//   a call is needed to encode every value (expensive)
@@ -237,7 +249,7 @@
 		} else {
 			panic("internal error: bad counter flavor")
 		}
-		if sz, err := cfw.w.Write(buf); err != nil {
+		if sz, err := ws.Write(buf); err != nil {
 			return err
 		} else if sz != towr {
 			return fmt.Errorf("writing counters: short write")
@@ -247,6 +259,7 @@
 
 	// Write out entries for each live function.
 	emitter := func(pkid uint32, funcid uint32, counters []uint32) error {
+		cfw.csh.FcnEntries++
 		if err := wrval(uint32(len(counters))); err != nil {
 			return err
 		}
diff --git a/src/internal/coverage/pods/pods.go b/src/internal/coverage/pods/pods.go
index 432c7b6..e08f82e 100644
--- a/src/internal/coverage/pods/pods.go
+++ b/src/internal/coverage/pods/pods.go
@@ -166,6 +166,9 @@
 	pods := make([]Pod, 0, len(mm))
 	for _, p := range mm {
 		sort.Slice(p.elements, func(i, j int) bool {
+			if p.elements[i].origin != p.elements[j].origin {
+				return p.elements[i].origin < p.elements[j].origin
+			}
 			return p.elements[i].file < p.elements[j].file
 		})
 		pod := Pod{
diff --git a/src/internal/coverage/pods/pods_test.go b/src/internal/coverage/pods/pods_test.go
index 28914c5..69c16e0 100644
--- a/src/internal/coverage/pods/pods_test.go
+++ b/src/internal/coverage/pods/pods_test.go
@@ -40,10 +40,9 @@
 		return mkfile(dir, fn)
 	}
 
-	mkcounter := func(dir string, tag string, nt int) string {
+	mkcounter := func(dir string, tag string, nt int, pid int) string {
 		hash := md5.Sum([]byte(tag))
-		dummyPid := int(42)
-		fn := fmt.Sprintf(coverage.CounterFileTempl, coverage.CounterFilePref, hash, dummyPid, nt)
+		fn := fmt.Sprintf(coverage.CounterFileTempl, coverage.CounterFilePref, hash, pid, nt)
 		return mkfile(dir, fn)
 	}
 
@@ -76,18 +75,18 @@
 
 	// Add a meta-data file with two counter files to first dir.
 	mkmeta(o1, "m1")
-	mkcounter(o1, "m1", 1)
-	mkcounter(o1, "m1", 2)
-	mkcounter(o1, "m1", 2)
+	mkcounter(o1, "m1", 1, 42)
+	mkcounter(o1, "m1", 2, 41)
+	mkcounter(o1, "m1", 2, 40)
 
 	// Add a counter file with no associated meta file.
-	mkcounter(o1, "orphan", 9)
+	mkcounter(o1, "orphan", 9, 39)
 
 	// Add a meta-data file with three counter files to second dir.
 	mkmeta(o2, "m2")
-	mkcounter(o2, "m2", 1)
-	mkcounter(o2, "m2", 2)
-	mkcounter(o2, "m2", 3)
+	mkcounter(o2, "m2", 1, 38)
+	mkcounter(o2, "m2", 2, 37)
+	mkcounter(o2, "m2", 3, 36)
 
 	// Add a duplicate of the first meta-file and a corresponding
 	// counter file to the second dir. This is intended to capture
@@ -95,7 +94,7 @@
 	// coverage-instrumented binary, but with the output files
 	// sent to separate directories.
 	mkmeta(o2, "m1")
-	mkcounter(o2, "m1", 11)
+	mkcounter(o2, "m1", 11, 35)
 
 	// Collect pods.
 	podlist, err := pods.CollectPods([]string{o1, o2}, true)
@@ -114,14 +113,15 @@
 
 	expected := []string{
 		`o1/covmeta.ae7be26cdaa742ca148068d5ac90eaca [
+o1/covcounters.ae7be26cdaa742ca148068d5ac90eaca.40.2 o:0
+o1/covcounters.ae7be26cdaa742ca148068d5ac90eaca.41.2 o:0
 o1/covcounters.ae7be26cdaa742ca148068d5ac90eaca.42.1 o:0
-o1/covcounters.ae7be26cdaa742ca148068d5ac90eaca.42.2 o:0
-o2/covcounters.ae7be26cdaa742ca148068d5ac90eaca.42.11 o:1
+o2/covcounters.ae7be26cdaa742ca148068d5ac90eaca.35.11 o:1
 ]`,
 		`o2/covmeta.aaf2f89992379705dac844c0a2a1d45f [
-o2/covcounters.aaf2f89992379705dac844c0a2a1d45f.42.1 o:1
-o2/covcounters.aaf2f89992379705dac844c0a2a1d45f.42.2 o:1
-o2/covcounters.aaf2f89992379705dac844c0a2a1d45f.42.3 o:1
+o2/covcounters.aaf2f89992379705dac844c0a2a1d45f.36.3 o:1
+o2/covcounters.aaf2f89992379705dac844c0a2a1d45f.37.2 o:1
+o2/covcounters.aaf2f89992379705dac844c0a2a1d45f.38.1 o:1
 ]`,
 	}
 	for k, exp := range expected {
@@ -136,7 +136,7 @@
 		dbad := "/dev/null"
 		_, err = pods.CollectPods([]string{dbad}, true)
 		if err == nil {
-			t.Errorf("exected error due to unreadable dir")
+			t.Errorf("executed error due to unreadable dir")
 		}
 	}
 }
diff --git a/src/internal/coverage/slicereader/slicereader.go b/src/internal/coverage/slicereader/slicereader.go
index 3d117ba..d9f2a7e 100644
--- a/src/internal/coverage/slicereader/slicereader.go
+++ b/src/internal/coverage/slicereader/slicereader.go
@@ -6,6 +6,8 @@
 
 import (
 	"encoding/binary"
+	"fmt"
+	"io"
 	"unsafe"
 )
 
@@ -38,8 +40,31 @@
 	return amt, nil
 }
 
-func (r *Reader) SeekTo(off int64) {
-	r.off = off
+func (r *Reader) Seek(offset int64, whence int) (ret int64, err error) {
+	switch whence {
+	case io.SeekStart:
+		if offset < 0 || offset > int64(len(r.b)) {
+			return 0, fmt.Errorf("invalid seek: new offset %d (out of range [0 %d]", offset, len(r.b))
+		}
+		r.off = offset
+		return offset, nil
+	case io.SeekCurrent:
+		newoff := r.off + offset
+		if newoff < 0 || newoff > int64(len(r.b)) {
+			return 0, fmt.Errorf("invalid seek: new offset %d (out of range [0 %d]", newoff, len(r.b))
+		}
+		r.off = newoff
+		return r.off, nil
+	case io.SeekEnd:
+		newoff := int64(len(r.b)) + offset
+		if newoff < 0 || newoff > int64(len(r.b)) {
+			return 0, fmt.Errorf("invalid seek: new offset %d (out of range [0 %d]", newoff, len(r.b))
+		}
+		r.off = newoff
+		return r.off, nil
+	}
+	// other modes are not supported
+	return 0, fmt.Errorf("unsupported seek mode %d", whence)
 }
 
 func (r *Reader) Offset() int64 {
diff --git a/src/internal/coverage/slicereader/slr_test.go b/src/internal/coverage/slicereader/slr_test.go
index 2f7cef0..461436d 100644
--- a/src/internal/coverage/slicereader/slr_test.go
+++ b/src/internal/coverage/slicereader/slr_test.go
@@ -6,6 +6,7 @@
 
 import (
 	"encoding/binary"
+	"io"
 	"testing"
 )
 
@@ -64,10 +65,12 @@
 		if gs2 != s2 {
 			t.Fatalf("readStr got %s want %s", gs2, s2)
 		}
-		slr.SeekTo(4)
+		if _, err := slr.Seek(4, io.SeekStart); err != nil {
+			t.Fatal(err)
+		}
 		off := slr.Offset()
 		if off != 4 {
-			t.Fatalf("Offset(0 returned %d wanted 4", off)
+			t.Fatalf("Offset() returned %d wanted 4", off)
 		}
 		g64 = slr.ReadUint64()
 		if g64 != e64 {
diff --git a/src/internal/coverage/slicewriter/slicewriter.go b/src/internal/coverage/slicewriter/slicewriter.go
index 3522bf5..460e9dc 100644
--- a/src/internal/coverage/slicewriter/slicewriter.go
+++ b/src/internal/coverage/slicewriter/slicewriter.go
@@ -38,21 +38,21 @@
 func (sws *WriteSeeker) Seek(offset int64, whence int) (int64, error) {
 	switch whence {
 	case io.SeekStart:
-		if sws.off != offset && (offset < 0 || offset >= int64(len(sws.payload))) {
+		if sws.off != offset && (offset < 0 || offset > int64(len(sws.payload))) {
 			return 0, fmt.Errorf("invalid seek: new offset %d (out of range [0 %d]", offset, len(sws.payload))
 		}
 		sws.off = offset
 		return offset, nil
 	case io.SeekCurrent:
 		newoff := sws.off + offset
-		if newoff != sws.off && (newoff < 0 || newoff >= int64(len(sws.payload))) {
+		if newoff != sws.off && (newoff < 0 || newoff > int64(len(sws.payload))) {
 			return 0, fmt.Errorf("invalid seek: new offset %d (out of range [0 %d]", newoff, len(sws.payload))
 		}
 		sws.off += offset
 		return sws.off, nil
 	case io.SeekEnd:
 		newoff := int64(len(sws.payload)) + offset
-		if newoff != sws.off && (newoff < 0 || newoff >= int64(len(sws.payload))) {
+		if newoff != sws.off && (newoff < 0 || newoff > int64(len(sws.payload))) {
 			return 0, fmt.Errorf("invalid seek: new offset %d (out of range [0 %d]", newoff, len(sws.payload))
 		}
 		sws.off = newoff
diff --git a/src/internal/coverage/slicewriter/slw_test.go b/src/internal/coverage/slicewriter/slw_test.go
index f4e75f4..9e26767 100644
--- a/src/internal/coverage/slicewriter/slw_test.go
+++ b/src/internal/coverage/slicewriter/slw_test.go
@@ -47,12 +47,13 @@
 		sleq(t, b, p)
 	}
 
-	sk := func(t *testing.T, ws *WriteSeeker, offset int64, whence int) {
+	sk := func(t *testing.T, ws *WriteSeeker, offset int64, whence int) int64 {
 		t.Helper()
-		_, err := ws.Seek(offset, whence)
+		off, err := ws.Seek(offset, whence)
 		if err != nil {
 			t.Fatalf("unexpected seek error: %v", err)
 		}
+		return off
 	}
 
 	wp1 := []byte{1, 2}
@@ -80,6 +81,8 @@
 	rf(t, ws, []byte{2, 7})
 	sk(t, ws, -4, io.SeekEnd)
 	rf(t, ws, []byte{2, 7})
+	off := sk(t, ws, 0, io.SeekEnd)
+	sk(t, ws, off, io.SeekStart)
 
 	// seek back and overwrite
 	sk(t, ws, 1, io.SeekStart)
@@ -98,7 +101,7 @@
 	if err == nil {
 		t.Fatalf("expected error on invalid -1 seek")
 	}
-	_, err = ws.Seek(int64(len(ws.BytesWritten())), io.SeekStart)
+	_, err = ws.Seek(int64(len(ws.BytesWritten())+1), io.SeekStart)
 	if err == nil {
 		t.Fatalf("expected error on invalid %d seek", len(ws.BytesWritten()))
 	}
@@ -108,7 +111,7 @@
 	if err == nil {
 		t.Fatalf("expected error on invalid -1 seek")
 	}
-	_, err = ws.Seek(int64(len(ws.BytesWritten())), io.SeekCurrent)
+	_, err = ws.Seek(int64(len(ws.BytesWritten())+1), io.SeekCurrent)
 	if err == nil {
 		t.Fatalf("expected error on invalid %d seek", len(ws.BytesWritten()))
 	}
diff --git a/src/internal/coverage/test/counter_test.go b/src/internal/coverage/test/counter_test.go
index 3fc111e..e29baed 100644
--- a/src/internal/coverage/test/counter_test.go
+++ b/src/internal/coverage/test/counter_test.go
@@ -19,10 +19,6 @@
 	funcs []decodecounter.FuncPayload
 }
 
-func (v *ctrVis) NumFuncs() (int, error) {
-	return len(v.funcs), nil
-}
-
 func (v *ctrVis) VisitFuncs(f encodecounter.CounterVisitorFn) error {
 	for _, fn := range v.funcs {
 		if err := f(fn.PkgIdx, fn.FuncIdx, fn.Counters); err != nil {
diff --git a/src/internal/cpu/cpu.go b/src/internal/cpu/cpu.go
index aef9fb3..1352810 100644
--- a/src/internal/cpu/cpu.go
+++ b/src/internal/cpu/cpu.go
@@ -57,18 +57,17 @@
 // The booleans in ARM64 contain the correspondingly named cpu feature bit.
 // The struct is padded to avoid false sharing.
 var ARM64 struct {
-	_            CacheLinePad
-	HasAES       bool
-	HasPMULL     bool
-	HasSHA1      bool
-	HasSHA2      bool
-	HasSHA512    bool
-	HasCRC32     bool
-	HasATOMICS   bool
-	HasCPUID     bool
-	IsNeoverseN1 bool
-	IsNeoverseV1 bool
-	_            CacheLinePad
+	_          CacheLinePad
+	HasAES     bool
+	HasPMULL   bool
+	HasSHA1    bool
+	HasSHA2    bool
+	HasSHA512  bool
+	HasCRC32   bool
+	HasATOMICS bool
+	HasCPUID   bool
+	IsNeoverse bool
+	_          CacheLinePad
 }
 
 var MIPS64X struct {
diff --git a/src/internal/cpu/cpu_arm64.go b/src/internal/cpu/cpu_arm64.go
index 85210aa..4a302f2 100644
--- a/src/internal/cpu/cpu_arm64.go
+++ b/src/internal/cpu/cpu_arm64.go
@@ -19,8 +19,7 @@
 		{Name: "crc32", Feature: &ARM64.HasCRC32},
 		{Name: "atomics", Feature: &ARM64.HasATOMICS},
 		{Name: "cpuid", Feature: &ARM64.HasCPUID},
-		{Name: "isNeoverseN1", Feature: &ARM64.IsNeoverseN1},
-		{Name: "isNeoverseV1", Feature: &ARM64.IsNeoverseV1},
+		{Name: "isNeoverse", Feature: &ARM64.IsNeoverse},
 	}
 
 	// arm64 uses different ways to detect CPU features at runtime depending on the operating system.
diff --git a/src/internal/cpu/cpu_arm64_hwcap.go b/src/internal/cpu/cpu_arm64_hwcap.go
index 0fb5fb5..2fabbb6 100644
--- a/src/internal/cpu/cpu_arm64_hwcap.go
+++ b/src/internal/cpu/cpu_arm64_hwcap.go
@@ -19,6 +19,7 @@
 	hwcap_CRC32   = 1 << 7
 	hwcap_ATOMICS = 1 << 8
 	hwcap_CPUID   = 1 << 11
+	hwcap_SHA512  = 1 << 21
 )
 
 func hwcapInit(os string) {
@@ -31,28 +32,31 @@
 	ARM64.HasSHA2 = isSet(HWCap, hwcap_SHA2)
 	ARM64.HasCRC32 = isSet(HWCap, hwcap_CRC32)
 	ARM64.HasCPUID = isSet(HWCap, hwcap_CPUID)
+	ARM64.HasSHA512 = isSet(HWCap, hwcap_SHA512)
 
 	// The Samsung S9+ kernel reports support for atomics, but not all cores
 	// actually support them, resulting in SIGILL. See issue #28431.
 	// TODO(elias.naur): Only disable the optimization on bad chipsets on android.
 	ARM64.HasATOMICS = isSet(HWCap, hwcap_ATOMICS) && os != "android"
 
-	// Check to see if executing on a NeoverseN1 and in order to do that,
+	// Check to see if executing on a Neoverse core and in order to do that,
 	// check the AUXV for the CPUID bit. The getMIDR function executes an
 	// instruction which would normally be an illegal instruction, but it's
-	// trapped by the kernel, the value sanitized and then returned. Without
-	// the CPUID bit the kernel will not trap the instruction and the process
-	// will be terminated with SIGILL.
+	// trapped by the kernel, the value sanitized and then returned.
+	// Without the CPUID bit the kernel will not trap the instruction and the
+	// process will be terminated with SIGILL.
 	if ARM64.HasCPUID {
 		midr := getMIDR()
 		part_num := uint16((midr >> 4) & 0xfff)
 		implementor := byte((midr >> 24) & 0xff)
 
-		if implementor == 'A' && part_num == 0xd0c {
-			ARM64.IsNeoverseN1 = true
-		}
-		if implementor == 'A' && part_num == 0xd40 {
-			ARM64.IsNeoverseV1 = true
+		// d0c - NeoverseN1
+		// d40 - NeoverseV1
+		// d49 - NeoverseN2
+		// d4f - NeoverseV2
+		if implementor == 'A' && (part_num == 0xd0c || part_num == 0xd40 ||
+			part_num == 0xd49 || part_num == 0xd4f) {
+			ARM64.IsNeoverse = true
 		}
 	}
 }
diff --git a/src/internal/cpu/cpu_ppc64x_other.go b/src/internal/cpu/cpu_ppc64x_other.go
new file mode 100644
index 0000000..d5b629d
--- /dev/null
+++ b/src/internal/cpu/cpu_ppc64x_other.go
@@ -0,0 +1,13 @@
+// Copyright 2023 The Go 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:build (ppc64 || ppc64le) && !aix && !linux
+
+package cpu
+
+func osinit() {
+	// Other operating systems do not support reading HWCap from auxiliary vector,
+	// reading privileged system registers or sysctl in user space to detect CPU
+	// features at runtime.
+}
diff --git a/src/internal/cpu/cpu_test.go b/src/internal/cpu/cpu_test.go
index 5aa277f..b8c74f2 100644
--- a/src/internal/cpu/cpu_test.go
+++ b/src/internal/cpu/cpu_test.go
@@ -48,7 +48,7 @@
 func TestAllCapabilitiesDisabled(t *testing.T) {
 	MustHaveDebugOptionsSupport(t)
 
-	if godebug.New("cpu.all").Value() != "off" {
+	if godebug.New("#cpu.all").Value() != "off" {
 		t.Skipf("skipping test: GODEBUG=cpu.all=off not set")
 	}
 
diff --git a/src/internal/cpu/cpu_x86_test.go b/src/internal/cpu/cpu_x86_test.go
index d7be430..8564ccc 100644
--- a/src/internal/cpu/cpu_x86_test.go
+++ b/src/internal/cpu/cpu_x86_test.go
@@ -28,7 +28,7 @@
 func TestSSE3DebugOption(t *testing.T) {
 	MustHaveDebugOptionsSupport(t)
 
-	if godebug.New("cpu.sse3").Value() != "off" {
+	if godebug.New("#cpu.sse3").Value() != "off" {
 		t.Skipf("skipping test: GODEBUG=cpu.sse3=off not set")
 	}
 
diff --git a/src/internal/diff/diff.go b/src/internal/diff/diff.go
index 47b2856..0aeeb75 100644
--- a/src/internal/diff/diff.go
+++ b/src/internal/diff/diff.go
@@ -76,7 +76,7 @@
 
 		// Expand matching lines as far possible,
 		// establishing that x[start.x:end.x] == y[start.y:end.y].
-		// Note that on the first (or last) iteration we may (or definitey do)
+		// Note that on the first (or last) iteration we may (or definitely do)
 		// have an empty match: start.x==end.x and start.y==end.y.
 		start := m
 		for start.x > done.x && start.y > done.y && x[start.x-1] == y[start.y-1] {
diff --git a/src/internal/fuzz/counters_unsupported.go b/src/internal/fuzz/counters_unsupported.go
index 028065c..287bb4b 100644
--- a/src/internal/fuzz/counters_unsupported.go
+++ b/src/internal/fuzz/counters_unsupported.go
@@ -6,7 +6,7 @@
 // the instrumentation is OS specific, but only amd64 and arm64 are
 // supported in the runtime. See src/runtime/libfuzzer*.
 //
-// If you update this constraint, also update internal/platform.FuzzInstrumeted.
+// If you update this constraint, also update internal/platform.FuzzInstrumented.
 //
 //go:build !((darwin || linux || windows || freebsd) && (amd64 || arm64))
 
diff --git a/src/internal/fuzz/fuzz.go b/src/internal/fuzz/fuzz.go
index 7d4fe06..fb4e1d3 100644
--- a/src/internal/fuzz/fuzz.go
+++ b/src/internal/fuzz/fuzz.go
@@ -117,6 +117,15 @@
 	var fuzzErr error
 	stopping := false
 	stop := func(err error) {
+		if shouldPrintDebugInfo() {
+			_, file, line, ok := runtime.Caller(1)
+			if ok {
+				c.debugLogf("stop called at %s:%d. stopping: %t", file, line, stopping)
+			} else {
+				c.debugLogf("stop called at unknown. stopping: %t", stopping)
+			}
+		}
+
 		if err == fuzzCtx.Err() || isInterruptError(err) {
 			// Suppress cancellation errors and terminations due to SIGINT.
 			// The messages are not helpful since either the user triggered the error
@@ -195,6 +204,11 @@
 
 	c.logStats()
 	for {
+		// If there is an execution limit, and we've reached it, stop.
+		if c.opts.Limit > 0 && c.count >= c.opts.Limit {
+			stop(nil)
+		}
+
 		var inputC chan fuzzInput
 		input, ok := c.peekInput()
 		if ok && c.crashMinimizing == nil && !stopping {
@@ -239,6 +253,9 @@
 					if c.crashMinimizing != nil {
 						// This crash is not minimized, and another crash is being minimized.
 						// Ignore this one and wait for the other one to finish.
+						if shouldPrintDebugInfo() {
+							c.debugLogf("found unminimized crasher, skipping in favor of minimizable crasher")
+						}
 						break
 					}
 					// Found a crasher but haven't yet attempted to minimize it.
@@ -259,10 +276,8 @@
 						}
 					}
 					if shouldPrintDebugInfo() {
-						fmt.Fprintf(
-							c.opts.Log,
-							"DEBUG new crasher, elapsed: %s, id: %s, parent: %s, gen: %d, size: %d, exec time: %s\n",
-							c.elapsed(),
+						c.debugLogf(
+							"found crasher, id: %s, parent: %s, gen: %d, size: %d, exec time: %s",
 							result.entry.Path,
 							result.entry.Parent,
 							result.entry.Generation,
@@ -275,10 +290,8 @@
 			} else if result.coverageData != nil {
 				if c.warmupRun() {
 					if shouldPrintDebugInfo() {
-						fmt.Fprintf(
-							c.opts.Log,
-							"DEBUG processed an initial input, elapsed: %s, id: %s, new bits: %d, size: %d, exec time: %s\n",
-							c.elapsed(),
+						c.debugLogf(
+							"processed an initial input, id: %s, new bits: %d, size: %d, exec time: %s",
 							result.entry.Parent,
 							countBits(diffCoverage(c.coverageMask, result.coverageData)),
 							len(result.entry.Data),
@@ -290,10 +303,8 @@
 					if c.warmupInputLeft == 0 {
 						fmt.Fprintf(c.opts.Log, "fuzz: elapsed: %s, gathering baseline coverage: %d/%d completed, now fuzzing with %d workers\n", c.elapsed(), c.warmupInputCount, c.warmupInputCount, c.opts.Parallel)
 						if shouldPrintDebugInfo() {
-							fmt.Fprintf(
-								c.opts.Log,
-								"DEBUG finished processing input corpus, elapsed: %s, entries: %d, initial coverage bits: %d\n",
-								c.elapsed(),
+							c.debugLogf(
+								"finished processing input corpus, entries: %d, initial coverage bits: %d",
 								len(c.corpus.entries),
 								countBits(c.coverageMask),
 							)
@@ -321,16 +332,20 @@
 							break
 						}
 						if !entryNew {
-							continue
+							if shouldPrintDebugInfo() {
+								c.debugLogf(
+									"ignoring duplicate input which increased coverage, id: %s",
+									result.entry.Path,
+								)
+							}
+							break
 						}
 						c.updateCoverage(keepCoverage)
 						c.inputQueue.enqueue(result.entry)
 						c.interestingCount++
 						if shouldPrintDebugInfo() {
-							fmt.Fprintf(
-								c.opts.Log,
-								"DEBUG new interesting input, elapsed: %s, id: %s, parent: %s, gen: %d, new bits: %d, total bits: %d, size: %d, exec time: %s\n",
-								c.elapsed(),
+							c.debugLogf(
+								"new interesting input, id: %s, parent: %s, gen: %d, new bits: %d, total bits: %d, size: %d, exec time: %s",
 								result.entry.Path,
 								result.entry.Parent,
 								result.entry.Generation,
@@ -343,10 +358,8 @@
 					}
 				} else {
 					if shouldPrintDebugInfo() {
-						fmt.Fprintf(
-							c.opts.Log,
-							"DEBUG worker reported interesting input that doesn't expand coverage, elapsed: %s, id: %s, parent: %s, canMinimize: %t\n",
-							c.elapsed(),
+						c.debugLogf(
+							"worker reported interesting input that doesn't expand coverage, id: %s, parent: %s, canMinimize: %t",
 							result.entry.Path,
 							result.entry.Parent,
 							result.canMinimize,
@@ -360,22 +373,14 @@
 				if c.warmupInputLeft == 0 {
 					fmt.Fprintf(c.opts.Log, "fuzz: elapsed: %s, testing seed corpus: %d/%d completed, now fuzzing with %d workers\n", c.elapsed(), c.warmupInputCount, c.warmupInputCount, c.opts.Parallel)
 					if shouldPrintDebugInfo() {
-						fmt.Fprintf(
-							c.opts.Log,
-							"DEBUG finished testing-only phase, elapsed: %s, entries: %d\n",
-							time.Since(c.startTime),
+						c.debugLogf(
+							"finished testing-only phase, entries: %d",
 							len(c.corpus.entries),
 						)
 					}
 				}
 			}
 
-			// Once the result has been processed, stop the worker if we
-			// have reached the fuzzing limit.
-			if c.opts.Limit > 0 && c.count >= c.opts.Limit {
-				stop(nil)
-			}
-
 		case inputC <- input:
 			// Sent the next input to a worker.
 			c.sentInput(input)
@@ -814,6 +819,15 @@
 // queueForMinimization creates a fuzzMinimizeInput from result and adds it
 // to the minimization queue to be sent to workers.
 func (c *coordinator) queueForMinimization(result fuzzResult, keepCoverage []byte) {
+	if shouldPrintDebugInfo() {
+		c.debugLogf(
+			"queueing input for minimization, id: %s, parent: %s, keepCoverage: %t, crasher: %t",
+			result.entry.Path,
+			result.entry.Parent,
+			keepCoverage != nil,
+			result.crasherMsg != "",
+		)
+	}
 	if result.crasherMsg != "" {
 		c.minimizeQueue.clear()
 	}
@@ -1076,8 +1090,13 @@
 	uint64(0),
 }
 
-var debugInfo = godebug.New("fuzzdebug").Value() == "1"
+var debugInfo = godebug.New("#fuzzdebug").Value() == "1"
 
 func shouldPrintDebugInfo() bool {
 	return debugInfo
 }
+
+func (c *coordinator) debugLogf(format string, args ...any) {
+	t := time.Now().Format("2006-01-02 15:04:05.999999999")
+	fmt.Fprintf(c.opts.Log, t+" DEBUG "+format+"\n", args...)
+}
diff --git a/src/internal/fuzz/worker.go b/src/internal/fuzz/worker.go
index 467c39b..c952670 100644
--- a/src/internal/fuzz/worker.go
+++ b/src/internal/fuzz/worker.go
@@ -216,6 +216,16 @@
 					result.crasherMsg = err.Error()
 				}
 			}
+			if shouldPrintDebugInfo() {
+				w.coordinator.debugLogf(
+					"input minimized, id: %s, original id: %s, crasher: %t, originally crasher: %t, minimizing took: %s",
+					result.entry.Path,
+					input.entry.Path,
+					result.crasherMsg != "",
+					input.crasherMsg != "",
+					result.totalDuration,
+				)
+			}
 			w.coordinator.resultC <- result
 		}
 	}
@@ -983,13 +993,13 @@
 	if !ok {
 		return CorpusEntry{}, minimizeResponse{}, errSharedMemClosed
 	}
+	defer func() { wc.memMu <- mem }()
 	mem.header().count = 0
 	inp, err := corpusEntryData(entryIn)
 	if err != nil {
 		return CorpusEntry{}, minimizeResponse{}, err
 	}
 	mem.setValue(inp)
-	defer func() { wc.memMu <- mem }()
 	entryOut = entryIn
 	entryOut.Values, err = unmarshalCorpusFile(inp)
 	if err != nil {
@@ -1072,6 +1082,7 @@
 	mem.header().count = 0
 	inp, err := corpusEntryData(entryIn)
 	if err != nil {
+		wc.memMu <- mem
 		return CorpusEntry{}, fuzzResponse{}, true, err
 	}
 	mem.setValue(inp)
diff --git a/src/internal/godebug/godebug.go b/src/internal/godebug/godebug.go
index dbcd980..36bfeac 100644
--- a/src/internal/godebug/godebug.go
+++ b/src/internal/godebug/godebug.go
@@ -20,34 +20,94 @@
 //		}
 //		...
 //	}
+//
+// Each time a non-default setting causes a change in program behavior,
+// code should call [Setting.IncNonDefault] to increment a counter that can
+// be reported by [runtime/metrics.Read].
+// Note that counters used with IncNonDefault must be added to
+// various tables in other packages. See the [Setting.IncNonDefault]
+// documentation for details.
 package godebug
 
+// Note: Be careful about new imports here. Any package
+// that internal/godebug imports cannot itself import internal/godebug,
+// meaning it cannot introduce a GODEBUG setting of its own.
+// We keep imports to the absolute bare minimum.
 import (
+	"internal/bisect"
+	"internal/godebugs"
 	"sync"
 	"sync/atomic"
+	"unsafe"
 	_ "unsafe" // go:linkname
 )
 
 // A Setting is a single setting in the $GODEBUG environment variable.
 type Setting struct {
-	name  string
-	once  sync.Once
-	value *atomic.Pointer[string]
+	name string
+	once sync.Once
+	*setting
+}
+
+type setting struct {
+	value          atomic.Pointer[value]
+	nonDefaultOnce sync.Once
+	nonDefault     atomic.Uint64
+	info           *godebugs.Info
+}
+
+type value struct {
+	text   string
+	bisect *bisect.Matcher
 }
 
 // New returns a new Setting for the $GODEBUG setting with the given name.
+//
+// GODEBUGs meant for use by end users must be listed in ../godebugs/table.go,
+// which is used for generating and checking various documentation.
+// If the name is not listed in that table, New will succeed but calling Value
+// on the returned Setting will panic.
+// To disable that panic for access to an undocumented setting,
+// prefix the name with a #, as in godebug.New("#gofsystrace").
+// The # is a signal to New but not part of the key used in $GODEBUG.
 func New(name string) *Setting {
 	return &Setting{name: name}
 }
 
 // Name returns the name of the setting.
 func (s *Setting) Name() string {
+	if s.name != "" && s.name[0] == '#' {
+		return s.name[1:]
+	}
 	return s.name
 }
 
+// Undocumented reports whether this is an undocumented setting.
+func (s *Setting) Undocumented() bool {
+	return s.name != "" && s.name[0] == '#'
+}
+
 // String returns a printable form for the setting: name=value.
 func (s *Setting) String() string {
-	return s.name + "=" + s.Value()
+	return s.Name() + "=" + s.Value()
+}
+
+// IncNonDefault increments the non-default behavior counter
+// associated with the given setting.
+// This counter is exposed in the runtime/metrics value
+// /godebug/non-default-behavior/<name>:events.
+//
+// Note that Value must be called at least once before IncNonDefault.
+func (s *Setting) IncNonDefault() {
+	s.nonDefaultOnce.Do(s.register)
+	s.nonDefault.Add(1)
+}
+
+func (s *Setting) register() {
+	if s.info == nil || s.info.Opaque {
+		panic("godebug: unexpected IncNonDefault of " + s.name)
+	}
+	registerMetric("/godebug/non-default-behavior/"+s.Name()+":events", s.nonDefault.Load)
 }
 
 // cache is a cache of all the GODEBUG settings,
@@ -65,7 +125,7 @@
 // Once entered into the map, the name is never removed.
 var cache sync.Map // name string -> value *atomic.Pointer[string]
 
-var empty string
+var empty value
 
 // Value returns the current value for the GODEBUG setting s.
 //
@@ -76,15 +136,32 @@
 // caching of Value's result.
 func (s *Setting) Value() string {
 	s.once.Do(func() {
-		v, ok := cache.Load(s.name)
-		if !ok {
-			p := new(atomic.Pointer[string])
-			p.Store(&empty)
-			v, _ = cache.LoadOrStore(s.name, p)
+		s.setting = lookup(s.Name())
+		if s.info == nil && !s.Undocumented() {
+			panic("godebug: Value of name not listed in godebugs.All: " + s.name)
 		}
-		s.value = v.(*atomic.Pointer[string])
 	})
-	return *s.value.Load()
+	v := *s.value.Load()
+	if v.bisect != nil && !v.bisect.Stack(&stderr) {
+		return ""
+	}
+	return v.text
+}
+
+// lookup returns the unique *setting value for the given name.
+func lookup(name string) *setting {
+	if v, ok := cache.Load(name); ok {
+		return v.(*setting)
+	}
+	s := new(setting)
+	s.info = godebugs.Lookup(name)
+	s.value.Store(&empty)
+	if v, loaded := cache.LoadOrStore(name, s); loaded {
+		// Lost race: someone else created it. Use theirs.
+		return v.(*setting)
+	}
+
+	return s
 }
 
 // setUpdate is provided by package runtime.
@@ -97,8 +174,35 @@
 //go:linkname setUpdate
 func setUpdate(update func(string, string))
 
+// registerMetric is provided by package runtime.
+// It forwards registrations to runtime/metrics.
+//
+//go:linkname registerMetric
+func registerMetric(name string, read func() uint64)
+
+// setNewIncNonDefault is provided by package runtime.
+// The runtime can do
+//
+//	inc := newNonDefaultInc(name)
+//
+// instead of
+//
+//	inc := godebug.New(name).IncNonDefault
+//
+// since it cannot import godebug.
+//
+//go:linkname setNewIncNonDefault
+func setNewIncNonDefault(newIncNonDefault func(string) func())
+
 func init() {
 	setUpdate(update)
+	setNewIncNonDefault(newIncNonDefault)
+}
+
+func newIncNonDefault(name string) func() {
+	s := New(name)
+	s.Value()
+	return s.IncNonDefault
 }
 
 var updateMu sync.Mutex
@@ -119,9 +223,9 @@
 	parse(did, def)
 
 	// Clear any cached values that are no longer present.
-	cache.Range(func(name, v any) bool {
+	cache.Range(func(name, s any) bool {
 		if !did[name.(string)] {
-			v.(*atomic.Pointer[string]).Store(&empty)
+			s.(*setting).value.Store(&empty)
 		}
 		return true
 	})
@@ -132,6 +236,9 @@
 // Later settings override earlier ones.
 // Parse only updates settings k=v for which did[k] = false.
 // It also sets did[k] = true for settings that it updates.
+// Each value v can also have the form v#pattern,
+// in which case the GODEBUG is only enabled for call stacks
+// matching pattern, for use with golang.org/x/tools/cmd/bisect.
 func parse(did map[string]bool, s string) {
 	// Scan the string backward so that later settings are used
 	// and earlier settings are ignored.
@@ -143,16 +250,18 @@
 	for i := end - 1; i >= -1; i-- {
 		if i == -1 || s[i] == ',' {
 			if eq >= 0 {
-				name, value := s[i+1:eq], s[eq+1:end]
+				name, arg := s[i+1:eq], s[eq+1:end]
 				if !did[name] {
 					did[name] = true
-					v, ok := cache.Load(name)
-					if !ok {
-						p := new(atomic.Pointer[string])
-						p.Store(&empty)
-						v, _ = cache.LoadOrStore(name, p)
+					v := &value{text: arg}
+					for j := 0; j < len(arg); j++ {
+						if arg[j] == '#' {
+							v.text = arg[:j]
+							v.bisect, _ = bisect.New(arg[j+1:])
+							break
+						}
 					}
-					v.(*atomic.Pointer[string]).Store(&value)
+					lookup(name).value.Store(v)
 				}
 			}
 			eq = -1
@@ -162,3 +271,20 @@
 		}
 	}
 }
+
+type runtimeStderr struct{}
+
+var stderr runtimeStderr
+
+func (*runtimeStderr) Write(b []byte) (int, error) {
+	if len(b) > 0 {
+		write(2, unsafe.Pointer(&b[0]), int32(len(b)))
+	}
+	return len(b), nil
+}
+
+// Since we cannot import os or syscall, use the runtime's write function
+// to print to standard error.
+//
+//go:linkname write runtime.write
+func write(fd uintptr, p unsafe.Pointer, n int32) int32
diff --git a/src/internal/godebug/godebug_test.go b/src/internal/godebug/godebug_test.go
index 319229d..8e46283 100644
--- a/src/internal/godebug/godebug_test.go
+++ b/src/internal/godebug/godebug_test.go
@@ -5,18 +5,26 @@
 package godebug_test
 
 import (
+	"fmt"
 	. "internal/godebug"
+	"internal/testenv"
+	"os"
+	"os/exec"
+	"reflect"
+	"runtime/metrics"
+	"sort"
+	"strings"
 	"testing"
 )
 
 func TestGet(t *testing.T) {
-	foo := New("foo")
+	foo := New("#foo")
 	tests := []struct {
 		godebug string
 		setting *Setting
 		want    string
 	}{
-		{"", New(""), ""},
+		{"", New("#"), ""},
 		{"", foo, ""},
 		{"foo=bar", foo, "bar"},
 		{"foo=bar,after=x", foo, "bar"},
@@ -27,7 +35,7 @@
 		{"foo=", foo, ""},
 		{"foo", foo, ""},
 		{",foo", foo, ""},
-		{"foo=bar,baz", New("loooooooong"), ""},
+		{"foo=bar,baz", New("#loooooooong"), ""},
 	}
 	for _, tt := range tests {
 		t.Setenv("GODEBUG", tt.godebug)
@@ -37,3 +45,87 @@
 		}
 	}
 }
+
+func TestMetrics(t *testing.T) {
+	const name = "http2client" // must be a real name so runtime will accept it
+
+	var m [1]metrics.Sample
+	m[0].Name = "/godebug/non-default-behavior/" + name + ":events"
+	metrics.Read(m[:])
+	if kind := m[0].Value.Kind(); kind != metrics.KindUint64 {
+		t.Fatalf("NonDefault kind = %v, want uint64", kind)
+	}
+
+	s := New(name)
+	s.Value()
+	s.IncNonDefault()
+	s.IncNonDefault()
+	s.IncNonDefault()
+	metrics.Read(m[:])
+	if kind := m[0].Value.Kind(); kind != metrics.KindUint64 {
+		t.Fatalf("NonDefault kind = %v, want uint64", kind)
+	}
+	if count := m[0].Value.Uint64(); count != 3 {
+		t.Fatalf("NonDefault value = %d, want 3", count)
+	}
+}
+
+func TestCmdBisect(t *testing.T) {
+	testenv.MustHaveGoBuild(t)
+	out, err := exec.Command("go", "run", "cmd/vendor/golang.org/x/tools/cmd/bisect", "GODEBUG=buggy=1#PATTERN", os.Args[0], "-test.run=BisectTestCase").CombinedOutput()
+	if err != nil {
+		t.Fatalf("exec bisect: %v\n%s", err, out)
+	}
+
+	var want []string
+	src, err := os.ReadFile("godebug_test.go")
+	for i, line := range strings.Split(string(src), "\n") {
+		if strings.Contains(line, "BISECT"+" "+"BUG") {
+			want = append(want, fmt.Sprintf("godebug_test.go:%d", i+1))
+		}
+	}
+	sort.Strings(want)
+
+	var have []string
+	for _, line := range strings.Split(string(out), "\n") {
+		if strings.Contains(line, "godebug_test.go:") {
+			have = append(have, line[strings.LastIndex(line, "godebug_test.go:"):])
+		}
+	}
+	sort.Strings(have)
+
+	if !reflect.DeepEqual(have, want) {
+		t.Errorf("bad bisect output:\nhave %v\nwant %v\ncomplete output:\n%s", have, want, string(out))
+	}
+}
+
+// This test does nothing by itself, but you can run
+//
+//	bisect 'GODEBUG=buggy=1#PATTERN' go test -run=BisectTestCase
+//
+// to see that the GODEBUG bisect support is working.
+// TestCmdBisect above does exactly that.
+func TestBisectTestCase(t *testing.T) {
+	s := New("#buggy")
+	for i := 0; i < 10; i++ {
+		a := s.Value() == "1"
+		b := s.Value() == "1"
+		c := s.Value() == "1" // BISECT BUG
+		d := s.Value() == "1" // BISECT BUG
+		e := s.Value() == "1" // BISECT BUG
+
+		if a {
+			t.Log("ok")
+		}
+		if b {
+			t.Log("ok")
+		}
+		if c {
+			t.Error("bug")
+		}
+		if d &&
+			e {
+			t.Error("bug")
+		}
+	}
+}
diff --git a/src/internal/godebugs/godebugs_test.go b/src/internal/godebugs/godebugs_test.go
new file mode 100644
index 0000000..a1cb8d4
--- /dev/null
+++ b/src/internal/godebugs/godebugs_test.go
@@ -0,0 +1,46 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package godebugs_test
+
+import (
+	"internal/godebugs"
+	"internal/testenv"
+	"os"
+	"runtime"
+	"strings"
+	"testing"
+)
+
+func TestAll(t *testing.T) {
+	data, err := os.ReadFile("../../../doc/godebug.md")
+	if err != nil {
+		if os.IsNotExist(err) && (testenv.Builder() == "" || runtime.GOOS != "linux") {
+			t.Skip(err)
+		}
+		t.Fatal(err)
+	}
+	doc := string(data)
+
+	last := ""
+	for _, info := range godebugs.All {
+		if info.Name <= last {
+			t.Errorf("All not sorted: %s then %s", last, info.Name)
+		}
+		last = info.Name
+
+		if info.Package == "" {
+			t.Errorf("Name=%s missing Package", info.Name)
+		}
+		if info.Changed != 0 && info.Old == "" {
+			t.Errorf("Name=%s has Changed, missing Old", info.Name)
+		}
+		if info.Old != "" && info.Changed == 0 {
+			t.Errorf("Name=%s has Old, missing Changed", info.Name)
+		}
+		if !strings.Contains(doc, "`"+info.Name+"`") {
+			t.Errorf("Name=%s not documented in doc/godebug.md", info.Name)
+		}
+	}
+}
diff --git a/src/internal/godebugs/table.go b/src/internal/godebugs/table.go
new file mode 100644
index 0000000..b1711d9
--- /dev/null
+++ b/src/internal/godebugs/table.go
@@ -0,0 +1,69 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package godebugs provides a table of known GODEBUG settings,
+// for use by a variety of other packages, including internal/godebug,
+// runtime, runtime/metrics, and cmd/go/internal/load.
+package godebugs
+
+// An Info describes a single known GODEBUG setting.
+type Info struct {
+	Name    string // name of the setting ("panicnil")
+	Package string // package that uses the setting ("runtime")
+	Changed int    // minor version when default changed, if any; 21 means Go 1.21
+	Old     string // value that restores behavior prior to Changed
+	Opaque  bool   // setting does not export information to runtime/metrics using [internal/godebug.Setting.IncNonDefault]
+}
+
+// All is the table of known settings, sorted by Name.
+//
+// Note: After adding entries to this table, run 'go generate runtime/metrics'
+// to update the runtime/metrics doc comment.
+// (Otherwise the runtime/metrics test will fail.)
+//
+// Note: After adding entries to this table, update the list in doc/godebug.md as well.
+// (Otherwise the test in this package will fail.)
+var All = []Info{
+	{Name: "execerrdot", Package: "os/exec"},
+	{Name: "gocachehash", Package: "cmd/go"},
+	{Name: "gocachetest", Package: "cmd/go"},
+	{Name: "gocacheverify", Package: "cmd/go"},
+	{Name: "http2client", Package: "net/http"},
+	{Name: "http2debug", Package: "net/http", Opaque: true},
+	{Name: "http2server", Package: "net/http"},
+	{Name: "installgoroot", Package: "go/build"},
+	{Name: "jstmpllitinterp", Package: "html/template"},
+	//{Name: "multipartfiles", Package: "mime/multipart"},
+	{Name: "multipartmaxheaders", Package: "mime/multipart"},
+	{Name: "multipartmaxparts", Package: "mime/multipart"},
+	{Name: "multipathtcp", Package: "net"},
+	{Name: "netdns", Package: "net", Opaque: true},
+	{Name: "panicnil", Package: "runtime", Changed: 21, Old: "1"},
+	{Name: "randautoseed", Package: "math/rand"},
+	{Name: "tarinsecurepath", Package: "archive/tar"},
+	{Name: "tlsmaxrsasize", Package: "crypto/tls"},
+	{Name: "x509sha1", Package: "crypto/x509"},
+	{Name: "x509usefallbackroots", Package: "crypto/x509"},
+	{Name: "zipinsecurepath", Package: "archive/zip"},
+}
+
+// Lookup returns the Info with the given name.
+func Lookup(name string) *Info {
+	// binary search, avoiding import of sort.
+	lo := 0
+	hi := len(All)
+	for lo < hi {
+		m := lo + (hi-lo)>>1
+		mid := All[m].Name
+		if name == mid {
+			return &All[m]
+		}
+		if name < mid {
+			hi = m
+		} else {
+			lo = m + 1
+		}
+	}
+	return nil
+}
diff --git a/src/internal/goexperiment/exp_cacheprog_off.go b/src/internal/goexperiment/exp_cacheprog_off.go
new file mode 100644
index 0000000..29aa869
--- /dev/null
+++ b/src/internal/goexperiment/exp_cacheprog_off.go
@@ -0,0 +1,9 @@
+// Code generated by mkconsts.go. DO NOT EDIT.
+
+//go:build !goexperiment.cacheprog
+// +build !goexperiment.cacheprog
+
+package goexperiment
+
+const CacheProg = false
+const CacheProgInt = 0
diff --git a/src/internal/goexperiment/exp_cacheprog_on.go b/src/internal/goexperiment/exp_cacheprog_on.go
new file mode 100644
index 0000000..121b299
--- /dev/null
+++ b/src/internal/goexperiment/exp_cacheprog_on.go
@@ -0,0 +1,9 @@
+// Code generated by mkconsts.go. DO NOT EDIT.
+
+//go:build goexperiment.cacheprog
+// +build goexperiment.cacheprog
+
+package goexperiment
+
+const CacheProg = true
+const CacheProgInt = 1
diff --git a/src/internal/goexperiment/exp_cgocheck2_off.go b/src/internal/goexperiment/exp_cgocheck2_off.go
new file mode 100644
index 0000000..77aa538
--- /dev/null
+++ b/src/internal/goexperiment/exp_cgocheck2_off.go
@@ -0,0 +1,9 @@
+// Code generated by mkconsts.go. DO NOT EDIT.
+
+//go:build !goexperiment.cgocheck2
+// +build !goexperiment.cgocheck2
+
+package goexperiment
+
+const CgoCheck2 = false
+const CgoCheck2Int = 0
diff --git a/src/internal/goexperiment/exp_cgocheck2_on.go b/src/internal/goexperiment/exp_cgocheck2_on.go
new file mode 100644
index 0000000..6201249
--- /dev/null
+++ b/src/internal/goexperiment/exp_cgocheck2_on.go
@@ -0,0 +1,9 @@
+// Code generated by mkconsts.go. DO NOT EDIT.
+
+//go:build goexperiment.cgocheck2
+// +build goexperiment.cgocheck2
+
+package goexperiment
+
+const CgoCheck2 = true
+const CgoCheck2Int = 1
diff --git a/src/internal/goexperiment/exp_loopvar_off.go b/src/internal/goexperiment/exp_loopvar_off.go
new file mode 100644
index 0000000..1cd7ee1
--- /dev/null
+++ b/src/internal/goexperiment/exp_loopvar_off.go
@@ -0,0 +1,9 @@
+// Code generated by mkconsts.go. DO NOT EDIT.
+
+//go:build !goexperiment.loopvar
+// +build !goexperiment.loopvar
+
+package goexperiment
+
+const LoopVar = false
+const LoopVarInt = 0
diff --git a/src/internal/goexperiment/exp_loopvar_on.go b/src/internal/goexperiment/exp_loopvar_on.go
new file mode 100644
index 0000000..e3c8980
--- /dev/null
+++ b/src/internal/goexperiment/exp_loopvar_on.go
@@ -0,0 +1,9 @@
+// Code generated by mkconsts.go. DO NOT EDIT.
+
+//go:build goexperiment.loopvar
+// +build goexperiment.loopvar
+
+package goexperiment
+
+const LoopVar = true
+const LoopVarInt = 1
diff --git a/src/internal/goexperiment/exp_unified_off.go b/src/internal/goexperiment/exp_unified_off.go
deleted file mode 100644
index 4c16fd8..0000000
--- a/src/internal/goexperiment/exp_unified_off.go
+++ /dev/null
@@ -1,9 +0,0 @@
-// Code generated by mkconsts.go. DO NOT EDIT.
-
-//go:build !goexperiment.unified
-// +build !goexperiment.unified
-
-package goexperiment
-
-const Unified = false
-const UnifiedInt = 0
diff --git a/src/internal/goexperiment/exp_unified_on.go b/src/internal/goexperiment/exp_unified_on.go
deleted file mode 100644
index 2b17ba3..0000000
--- a/src/internal/goexperiment/exp_unified_on.go
+++ /dev/null
@@ -1,9 +0,0 @@
-// Code generated by mkconsts.go. DO NOT EDIT.
-
-//go:build goexperiment.unified
-// +build goexperiment.unified
-
-package goexperiment
-
-const Unified = true
-const UnifiedInt = 1
diff --git a/src/internal/goexperiment/flags.go b/src/internal/goexperiment/flags.go
index 02e7443..ae3cbaf 100644
--- a/src/internal/goexperiment/flags.go
+++ b/src/internal/goexperiment/flags.go
@@ -60,10 +60,6 @@
 	StaticLockRanking bool
 	BoringCrypto      bool
 
-	// Unified enables the compiler's unified IR construction
-	// experiment.
-	Unified bool
-
 	// Regabi is split into several sub-experiments that can be
 	// enabled individually. Not all combinations work.
 	// The "regabi" GOEXPERIMENT is an alias for all "working"
@@ -100,4 +96,17 @@
 	// this compels the Go runtime to write to some arbitrary file, which
 	// may be exploited.
 	PageTrace bool
+
+	// CgoCheck2 enables an expensive cgo rule checker.
+	// When this experiment is enabled, cgo rule checks occur regardless
+	// of the GODEBUG=cgocheck setting provided at runtime.
+	CgoCheck2 bool
+
+	// LoopVar changes loop semantics so that each iteration gets its own
+	// copy of the iteration variable.
+	LoopVar bool
+
+	// CacheProg adds support to cmd/go to use a child process to implement
+	// the build cache; see https://github.com/golang/go/issues/59719.
+	CacheProg bool
 }
diff --git a/src/internal/goos/zgoos_aix.go b/src/internal/goos/zgoos_aix.go
index ff86155..24e05c9 100644
--- a/src/internal/goos/zgoos_aix.go
+++ b/src/internal/goos/zgoos_aix.go
@@ -21,5 +21,6 @@
 const IsOpenbsd = 0
 const IsPlan9 = 0
 const IsSolaris = 0
+const IsWasip1 = 0
 const IsWindows = 0
 const IsZos = 0
diff --git a/src/internal/goos/zgoos_android.go b/src/internal/goos/zgoos_android.go
index e8aaa12..3c4a318 100644
--- a/src/internal/goos/zgoos_android.go
+++ b/src/internal/goos/zgoos_android.go
@@ -21,5 +21,6 @@
 const IsOpenbsd = 0
 const IsPlan9 = 0
 const IsSolaris = 0
+const IsWasip1 = 0
 const IsWindows = 0
 const IsZos = 0
diff --git a/src/internal/goos/zgoos_darwin.go b/src/internal/goos/zgoos_darwin.go
index decdd49..10b1499 100644
--- a/src/internal/goos/zgoos_darwin.go
+++ b/src/internal/goos/zgoos_darwin.go
@@ -21,5 +21,6 @@
 const IsOpenbsd = 0
 const IsPlan9 = 0
 const IsSolaris = 0
+const IsWasip1 = 0
 const IsWindows = 0
 const IsZos = 0
diff --git a/src/internal/goos/zgoos_dragonfly.go b/src/internal/goos/zgoos_dragonfly.go
index 2224baa..b92d126 100644
--- a/src/internal/goos/zgoos_dragonfly.go
+++ b/src/internal/goos/zgoos_dragonfly.go
@@ -21,5 +21,6 @@
 const IsOpenbsd = 0
 const IsPlan9 = 0
 const IsSolaris = 0
+const IsWasip1 = 0
 const IsWindows = 0
 const IsZos = 0
diff --git a/src/internal/goos/zgoos_freebsd.go b/src/internal/goos/zgoos_freebsd.go
index 3ee5bf9..f547591 100644
--- a/src/internal/goos/zgoos_freebsd.go
+++ b/src/internal/goos/zgoos_freebsd.go
@@ -21,5 +21,6 @@
 const IsOpenbsd = 0
 const IsPlan9 = 0
 const IsSolaris = 0
+const IsWasip1 = 0
 const IsWindows = 0
 const IsZos = 0
diff --git a/src/internal/goos/zgoos_hurd.go b/src/internal/goos/zgoos_hurd.go
index 8a3d343..1189d65 100644
--- a/src/internal/goos/zgoos_hurd.go
+++ b/src/internal/goos/zgoos_hurd.go
@@ -21,5 +21,6 @@
 const IsOpenbsd = 0
 const IsPlan9 = 0
 const IsSolaris = 0
+const IsWasip1 = 0
 const IsWindows = 0
 const IsZos = 0
diff --git a/src/internal/goos/zgoos_illumos.go b/src/internal/goos/zgoos_illumos.go
index fc1b9a9..4f02540 100644
--- a/src/internal/goos/zgoos_illumos.go
+++ b/src/internal/goos/zgoos_illumos.go
@@ -21,5 +21,6 @@
 const IsOpenbsd = 0
 const IsPlan9 = 0
 const IsSolaris = 0
+const IsWasip1 = 0
 const IsWindows = 0
 const IsZos = 0
diff --git a/src/internal/goos/zgoos_ios.go b/src/internal/goos/zgoos_ios.go
index 746e769..02f3586 100644
--- a/src/internal/goos/zgoos_ios.go
+++ b/src/internal/goos/zgoos_ios.go
@@ -21,5 +21,6 @@
 const IsOpenbsd = 0
 const IsPlan9 = 0
 const IsSolaris = 0
+const IsWasip1 = 0
 const IsWindows = 0
 const IsZos = 0
diff --git a/src/internal/goos/zgoos_js.go b/src/internal/goos/zgoos_js.go
index 6cf2a5d..4818741 100644
--- a/src/internal/goos/zgoos_js.go
+++ b/src/internal/goos/zgoos_js.go
@@ -21,5 +21,6 @@
 const IsOpenbsd = 0
 const IsPlan9 = 0
 const IsSolaris = 0
+const IsWasip1 = 0
 const IsWindows = 0
 const IsZos = 0
diff --git a/src/internal/goos/zgoos_linux.go b/src/internal/goos/zgoos_linux.go
index cb9d6e8..6f4d4e0 100644
--- a/src/internal/goos/zgoos_linux.go
+++ b/src/internal/goos/zgoos_linux.go
@@ -21,5 +21,6 @@
 const IsOpenbsd = 0
 const IsPlan9 = 0
 const IsSolaris = 0
+const IsWasip1 = 0
 const IsWindows = 0
 const IsZos = 0
diff --git a/src/internal/goos/zgoos_netbsd.go b/src/internal/goos/zgoos_netbsd.go
index 8285928..948603d 100644
--- a/src/internal/goos/zgoos_netbsd.go
+++ b/src/internal/goos/zgoos_netbsd.go
@@ -21,5 +21,6 @@
 const IsOpenbsd = 0
 const IsPlan9 = 0
 const IsSolaris = 0
+const IsWasip1 = 0
 const IsWindows = 0
 const IsZos = 0
diff --git a/src/internal/goos/zgoos_openbsd.go b/src/internal/goos/zgoos_openbsd.go
index 3f739a4..f4b2014 100644
--- a/src/internal/goos/zgoos_openbsd.go
+++ b/src/internal/goos/zgoos_openbsd.go
@@ -21,5 +21,6 @@
 const IsOpenbsd = 1
 const IsPlan9 = 0
 const IsSolaris = 0
+const IsWasip1 = 0
 const IsWindows = 0
 const IsZos = 0
diff --git a/src/internal/goos/zgoos_plan9.go b/src/internal/goos/zgoos_plan9.go
index d4c1c65..95572df 100644
--- a/src/internal/goos/zgoos_plan9.go
+++ b/src/internal/goos/zgoos_plan9.go
@@ -21,5 +21,6 @@
 const IsOpenbsd = 0
 const IsPlan9 = 1
 const IsSolaris = 0
+const IsWasip1 = 0
 const IsWindows = 0
 const IsZos = 0
diff --git a/src/internal/goos/zgoos_solaris.go b/src/internal/goos/zgoos_solaris.go
index 69e3285..c705826 100644
--- a/src/internal/goos/zgoos_solaris.go
+++ b/src/internal/goos/zgoos_solaris.go
@@ -21,5 +21,6 @@
 const IsOpenbsd = 0
 const IsPlan9 = 0
 const IsSolaris = 1
+const IsWasip1 = 0
 const IsWindows = 0
 const IsZos = 0
diff --git a/src/internal/goos/zgoos_wasip1.go b/src/internal/goos/zgoos_wasip1.go
new file mode 100644
index 0000000..ae35eeb
--- /dev/null
+++ b/src/internal/goos/zgoos_wasip1.go
@@ -0,0 +1,26 @@
+// Code generated by gengoos.go using 'go generate'. DO NOT EDIT.
+
+//go:build wasip1
+
+package goos
+
+const GOOS = `wasip1`
+
+const IsAix = 0
+const IsAndroid = 0
+const IsDarwin = 0
+const IsDragonfly = 0
+const IsFreebsd = 0
+const IsHurd = 0
+const IsIllumos = 0
+const IsIos = 0
+const IsJs = 0
+const IsLinux = 0
+const IsNacl = 0
+const IsNetbsd = 0
+const IsOpenbsd = 0
+const IsPlan9 = 0
+const IsSolaris = 0
+const IsWasip1 = 1
+const IsWindows = 0
+const IsZos = 0
diff --git a/src/internal/goos/zgoos_windows.go b/src/internal/goos/zgoos_windows.go
index 16158be..f89f4cf 100644
--- a/src/internal/goos/zgoos_windows.go
+++ b/src/internal/goos/zgoos_windows.go
@@ -21,5 +21,6 @@
 const IsOpenbsd = 0
 const IsPlan9 = 0
 const IsSolaris = 0
+const IsWasip1 = 0
 const IsWindows = 1
 const IsZos = 0
diff --git a/src/internal/goos/zgoos_zos.go b/src/internal/goos/zgoos_zos.go
index fb6165c..29fb0f8 100644
--- a/src/internal/goos/zgoos_zos.go
+++ b/src/internal/goos/zgoos_zos.go
@@ -21,5 +21,6 @@
 const IsOpenbsd = 0
 const IsPlan9 = 0
 const IsSolaris = 0
+const IsWasip1 = 0
 const IsWindows = 0
 const IsZos = 1
diff --git a/src/internal/goroot/gc.go b/src/internal/goroot/gc.go
index 79403d2..c0216f4 100644
--- a/src/internal/goroot/gc.go
+++ b/src/internal/goroot/gc.go
@@ -20,8 +20,8 @@
 	switch compiler {
 	case "gc":
 		dir := filepath.Join(goroot, "src", path)
-		_, err := os.Stat(dir)
-		return err == nil
+		info, err := os.Stat(dir)
+		return err == nil && info.IsDir()
 	case "gccgo":
 		return gccgoSearch.isStandard(path)
 	default:
diff --git a/src/internal/goroot/importcfg.go b/src/internal/goroot/importcfg.go
deleted file mode 100644
index e324073..0000000
--- a/src/internal/goroot/importcfg.go
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright 2022 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package goroot
-
-import (
-	"bytes"
-	"fmt"
-	"os/exec"
-	"strings"
-	"sync"
-)
-
-// Importcfg returns an importcfg file to be passed to the
-// Go compiler that contains the cached paths for the .a files for the
-// standard library.
-func Importcfg() (string, error) {
-	var icfg bytes.Buffer
-
-	m, err := PkgfileMap()
-	if err != nil {
-		return "", err
-	}
-	fmt.Fprintf(&icfg, "# import config")
-	for importPath, export := range m {
-		fmt.Fprintf(&icfg, "\npackagefile %s=%s", importPath, export)
-	}
-	s := icfg.String()
-	return s, nil
-}
-
-var (
-	stdlibPkgfileMap map[string]string
-	stdlibPkgfileErr error
-	once             sync.Once
-)
-
-// PkgfileMap returns a map of package paths to the location on disk
-// of the .a file for the package.
-// The caller must not modify the map.
-func PkgfileMap() (map[string]string, error) {
-	once.Do(func() {
-		m := make(map[string]string)
-		output, err := exec.Command("go", "list", "-export", "-e", "-f", "{{.ImportPath}} {{.Export}}", "std", "cmd").Output()
-		if err != nil {
-			stdlibPkgfileErr = err
-		}
-		for _, line := range strings.Split(string(output), "\n") {
-			if line == "" {
-				continue
-			}
-			sp := strings.SplitN(line, " ", 2)
-			if len(sp) != 2 {
-				stdlibPkgfileErr = fmt.Errorf("determining pkgfile map: invalid line in go list output: %q", line)
-				return
-			}
-			importPath, export := sp[0], sp[1]
-			if export != "" {
-				m[importPath] = export
-			}
-		}
-		stdlibPkgfileMap = m
-	})
-	return stdlibPkgfileMap, stdlibPkgfileErr
-}
diff --git a/src/internal/goversion/goversion.go b/src/internal/goversion/goversion.go
index e9ecf8e..5a52f9e 100644
--- a/src/internal/goversion/goversion.go
+++ b/src/internal/goversion/goversion.go
@@ -9,4 +9,4 @@
 //
 // It should be updated at the start of each development cycle to be
 // the version of the next Go 1.x release. See golang.org/issue/40705.
-const Version = 20
+const Version = 21
diff --git a/src/internal/intern/intern.go b/src/internal/intern/intern.go
index 0e6852f..2f97c2e 100644
--- a/src/internal/intern/intern.go
+++ b/src/internal/intern/intern.go
@@ -66,7 +66,7 @@
 	valSafe = safeMap()         // non-nil in safe+leaky mode
 )
 
-var intern = godebug.New("intern")
+var intern = godebug.New("#intern")
 
 // safeMap returns a non-nil map if we're in safe-but-leaky mode,
 // as controlled by GODEBUG=intern=leaky
diff --git a/src/internal/pkgbits/syncmarker_string.go b/src/internal/pkgbits/syncmarker_string.go
index 4a5b0ca..582ad56 100644
--- a/src/internal/pkgbits/syncmarker_string.go
+++ b/src/internal/pkgbits/syncmarker_string.go
@@ -74,11 +74,14 @@
 	_ = x[SyncStmtsEnd-64]
 	_ = x[SyncLabel-65]
 	_ = x[SyncOptLabel-66]
+	_ = x[SyncMultiExpr-67]
+	_ = x[SyncRType-68]
+	_ = x[SyncConvRTTI-69]
 }
 
-const _SyncMarker_name = "EOFBoolInt64Uint64StringValueValRelocsRelocUseRelocPublicPosPosBaseObjectObject1PkgPkgDefMethodTypeTypeIdxTypeParamNamesSignatureParamsParamCodeObjSymLocalIdentSelectorPrivateFuncExtVarExtTypeExtPragmaExprListExprsExprExprTypeAssignOpFuncLitCompLitDeclFuncBodyOpenScopeCloseScopeCloseAnotherScopeDeclNamesDeclNameStmtsBlockStmtIfStmtForStmtSwitchStmtRangeStmtCaseClauseCommClauseSelectStmtDeclsLabeledStmtUseObjLocalAddLocalLinknameStmt1StmtsEndLabelOptLabel"
+const _SyncMarker_name = "EOFBoolInt64Uint64StringValueValRelocsRelocUseRelocPublicPosPosBaseObjectObject1PkgPkgDefMethodTypeTypeIdxTypeParamNamesSignatureParamsParamCodeObjSymLocalIdentSelectorPrivateFuncExtVarExtTypeExtPragmaExprListExprsExprExprTypeAssignOpFuncLitCompLitDeclFuncBodyOpenScopeCloseScopeCloseAnotherScopeDeclNamesDeclNameStmtsBlockStmtIfStmtForStmtSwitchStmtRangeStmtCaseClauseCommClauseSelectStmtDeclsLabeledStmtUseObjLocalAddLocalLinknameStmt1StmtsEndLabelOptLabelMultiExprRTypeConvRTTI"
 
-var _SyncMarker_index = [...]uint16{0, 3, 7, 12, 18, 24, 29, 32, 38, 43, 51, 57, 60, 67, 73, 80, 83, 89, 95, 99, 106, 120, 129, 135, 140, 147, 150, 160, 168, 175, 182, 188, 195, 201, 209, 214, 218, 226, 232, 234, 241, 248, 252, 260, 269, 279, 296, 305, 313, 318, 327, 333, 340, 350, 359, 369, 379, 389, 394, 405, 416, 424, 432, 437, 445, 450, 458}
+var _SyncMarker_index = [...]uint16{0, 3, 7, 12, 18, 24, 29, 32, 38, 43, 51, 57, 60, 67, 73, 80, 83, 89, 95, 99, 106, 120, 129, 135, 140, 147, 150, 160, 168, 175, 182, 188, 195, 201, 209, 214, 218, 226, 232, 234, 241, 248, 252, 260, 269, 279, 296, 305, 313, 318, 327, 333, 340, 350, 359, 369, 379, 389, 394, 405, 416, 424, 432, 437, 445, 450, 458, 467, 472, 480}
 
 func (i SyncMarker) String() string {
 	i -= 1
diff --git a/src/internal/platform/supported.go b/src/internal/platform/supported.go
index 86c9f07..230a952 100644
--- a/src/internal/platform/supported.go
+++ b/src/internal/platform/supported.go
@@ -2,8 +2,19 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
+//go:generate go test . -run=TestGenerated -fix
+
 package platform
 
+// An OSArch is a pair of GOOS and GOARCH values indicating a platform.
+type OSArch struct {
+	GOOS, GOARCH string
+}
+
+func (p OSArch) String() string {
+	return p.GOOS + "/" + p.GOARCH
+}
+
 // RaceDetectorSupported reports whether goos/goarch supports the race
 // detector. There is a copy of this function in cmd/dist/test.go.
 // Race detector only supports 48-bit VMA on arm64. But it will always
@@ -24,7 +35,6 @@
 
 // MSanSupported reports whether goos/goarch supports the memory
 // sanitizer option.
-// There is a copy of this function in misc/cgo/testsanitizers/cc_test.go.
 func MSanSupported(goos, goarch string) bool {
 	switch goos {
 	case "linux":
@@ -38,7 +48,6 @@
 
 // ASanSupported reports whether goos/goarch supports the address
 // sanitizer option.
-// There is a copy of this function in misc/cgo/testsanitizers/cc_test.go.
 func ASanSupported(goos, goarch string) bool {
 	switch goos {
 	case "linux":
@@ -71,8 +80,39 @@
 	}
 }
 
-// MustLinkExternal reports whether goos/goarch requires external linking.
-func MustLinkExternal(goos, goarch string) bool {
+// MustLinkExternal reports whether goos/goarch requires external linking
+// with or without cgo dependencies.
+func MustLinkExternal(goos, goarch string, withCgo bool) bool {
+	if withCgo {
+		switch goarch {
+		case "loong64",
+			"mips", "mipsle", "mips64", "mips64le",
+			"riscv64":
+			// Internally linking cgo is incomplete on some architectures.
+			// https://go.dev/issue/14449
+			return true
+		case "arm64":
+			if goos == "windows" {
+				// windows/arm64 internal linking is not implemented.
+				return true
+			}
+		case "ppc64":
+			// Big Endian PPC64 cgo internal linking is not implemented for aix or linux.
+			// https://go.dev/issue/8912
+			return true
+		}
+
+		switch goos {
+		case "android":
+			return true
+		case "dragonfly":
+			// It seems that on Dragonfly thread local storage is
+			// set up by the dynamic linker, so internal cgo linking
+			// doesn't work. Test case is "go test runtime/cgo".
+			return true
+		}
+	}
+
 	switch goos {
 	case "android":
 		if goarch != "arm64" {
@@ -88,25 +128,48 @@
 
 // BuildModeSupported reports whether goos/goarch supports the given build mode
 // using the given compiler.
+// There is a copy of this function in cmd/dist/test.go.
 func BuildModeSupported(compiler, buildmode, goos, goarch string) bool {
 	if compiler == "gccgo" {
 		return true
 	}
 
-	platform := goos + "/" + goarch
+	if _, ok := distInfo[OSArch{goos, goarch}]; !ok {
+		return false // platform unrecognized
+	}
 
+	platform := goos + "/" + goarch
 	switch buildmode {
 	case "archive":
 		return true
 
 	case "c-archive":
-		// TODO(bcmills): This seems dubious.
-		// Do we really support c-archive mode on js/wasm‽
-		return platform != "linux/ppc64"
+		switch goos {
+		case "aix", "darwin", "ios", "windows":
+			return true
+		case "linux":
+			switch goarch {
+			case "386", "amd64", "arm", "armbe", "arm64", "arm64be", "loong64", "ppc64le", "riscv64", "s390x":
+				// linux/ppc64 not supported because it does
+				// not support external linking mode yet.
+				return true
+			default:
+				// Other targets do not support -shared,
+				// per ParseFlags in
+				// cmd/compile/internal/base/flag.go.
+				// For c-archive the Go tool passes -shared,
+				// so that the result is suitable for inclusion
+				// in a PIE or shared library.
+				return false
+			}
+		case "freebsd":
+			return goarch == "amd64"
+		}
+		return false
 
 	case "c-shared":
 		switch platform {
-		case "linux/amd64", "linux/arm", "linux/arm64", "linux/386", "linux/ppc64le", "linux/riscv64", "linux/s390x",
+		case "linux/amd64", "linux/arm", "linux/arm64", "linux/loong64", "linux/386", "linux/ppc64le", "linux/riscv64", "linux/s390x",
 			"android/amd64", "android/arm", "android/arm64", "android/386",
 			"freebsd/amd64",
 			"darwin/amd64", "darwin/arm64",
@@ -123,7 +186,7 @@
 
 	case "pie":
 		switch platform {
-		case "linux/386", "linux/amd64", "linux/arm", "linux/arm64", "linux/ppc64le", "linux/riscv64", "linux/s390x",
+		case "linux/386", "linux/amd64", "linux/arm", "linux/arm64", "linux/loong64", "linux/ppc64le", "linux/riscv64", "linux/s390x",
 			"android/amd64", "android/arm", "android/arm64", "android/386",
 			"freebsd/amd64",
 			"darwin/amd64", "darwin/arm64",
@@ -144,7 +207,7 @@
 	case "plugin":
 		switch platform {
 		case "linux/amd64", "linux/arm", "linux/arm64", "linux/386", "linux/s390x", "linux/ppc64le",
-			"android/amd64", "android/arm", "android/arm64", "android/386",
+			"android/amd64", "android/386",
 			"darwin/amd64", "darwin/arm64",
 			"freebsd/amd64":
 			return true
@@ -158,11 +221,66 @@
 
 func InternalLinkPIESupported(goos, goarch string) bool {
 	switch goos + "/" + goarch {
-	case "darwin/amd64", "darwin/arm64",
+	case "android/arm64",
+		"darwin/amd64", "darwin/arm64",
 		"linux/amd64", "linux/arm64", "linux/ppc64le",
-		"android/arm64",
-		"windows-amd64", "windows-386", "windows-arm":
+		"windows/386", "windows/amd64", "windows/arm", "windows/arm64":
 		return true
 	}
 	return false
 }
+
+// DefaultPIE reports whether goos/goarch produces a PIE binary when using the
+// "default" buildmode. On Windows this is affected by -race,
+// so force the caller to pass that in to centralize that choice.
+func DefaultPIE(goos, goarch string, isRace bool) bool {
+	switch goos {
+	case "android", "ios":
+		return true
+	case "windows":
+		if isRace {
+			// PIE is not supported with -race on windows;
+			// see https://go.dev/cl/416174.
+			return false
+		}
+		return true
+	case "darwin":
+		return goarch == "arm64"
+	}
+	return false
+}
+
+// ExecutableHasDWARF reports whether the linked executable includes DWARF
+// symbols on goos/goarch.
+func ExecutableHasDWARF(goos, goarch string) bool {
+	switch goos {
+	case "plan9", "ios":
+		return false
+	}
+	return true
+}
+
+// osArchInfo describes information about an OSArch extracted from cmd/dist and
+// stored in the generated distInfo map.
+type osArchInfo struct {
+	CgoSupported bool
+	FirstClass   bool
+	Broken       bool
+}
+
+// CgoSupported reports whether goos/goarch supports cgo.
+func CgoSupported(goos, goarch string) bool {
+	return distInfo[OSArch{goos, goarch}].CgoSupported
+}
+
+// FirstClass reports whether goos/goarch is considered a “first class” port.
+// (See https://go.dev/wiki/PortingPolicy#first-class-ports.)
+func FirstClass(goos, goarch string) bool {
+	return distInfo[OSArch{goos, goarch}].FirstClass
+}
+
+// Broken reportsr whether goos/goarch is considered a broken port.
+// (See https://go.dev/wiki/PortingPolicy#broken-ports.)
+func Broken(goos, goarch string) bool {
+	return distInfo[OSArch{goos, goarch}].Broken
+}
diff --git a/src/internal/platform/zosarch.go b/src/internal/platform/zosarch.go
new file mode 100644
index 0000000..7f5a290
--- /dev/null
+++ b/src/internal/platform/zosarch.go
@@ -0,0 +1,114 @@
+// Code generated by go test internal/platform -fix. DO NOT EDIT.
+
+// To change the information in this file, edit the cgoEnabled and/or firstClass
+// maps in cmd/dist/build.go, then run 'go generate internal/platform'.
+
+package platform
+
+// List is the list of all valid GOOS/GOARCH combinations,
+// including known-broken ports.
+var List = []OSArch{
+	{"aix", "ppc64"},
+	{"android", "386"},
+	{"android", "amd64"},
+	{"android", "arm"},
+	{"android", "arm64"},
+	{"darwin", "amd64"},
+	{"darwin", "arm64"},
+	{"dragonfly", "amd64"},
+	{"freebsd", "386"},
+	{"freebsd", "amd64"},
+	{"freebsd", "arm"},
+	{"freebsd", "arm64"},
+	{"freebsd", "riscv64"},
+	{"illumos", "amd64"},
+	{"ios", "amd64"},
+	{"ios", "arm64"},
+	{"js", "wasm"},
+	{"linux", "386"},
+	{"linux", "amd64"},
+	{"linux", "arm"},
+	{"linux", "arm64"},
+	{"linux", "loong64"},
+	{"linux", "mips"},
+	{"linux", "mips64"},
+	{"linux", "mips64le"},
+	{"linux", "mipsle"},
+	{"linux", "ppc64"},
+	{"linux", "ppc64le"},
+	{"linux", "riscv64"},
+	{"linux", "s390x"},
+	{"linux", "sparc64"},
+	{"netbsd", "386"},
+	{"netbsd", "amd64"},
+	{"netbsd", "arm"},
+	{"netbsd", "arm64"},
+	{"openbsd", "386"},
+	{"openbsd", "amd64"},
+	{"openbsd", "arm"},
+	{"openbsd", "arm64"},
+	{"openbsd", "mips64"},
+	{"openbsd", "ppc64"},
+	{"plan9", "386"},
+	{"plan9", "amd64"},
+	{"plan9", "arm"},
+	{"solaris", "amd64"},
+	{"wasip1", "wasm"},
+	{"windows", "386"},
+	{"windows", "amd64"},
+	{"windows", "arm"},
+	{"windows", "arm64"},
+}
+
+var distInfo = map[OSArch]osArchInfo{
+	{"aix", "ppc64"}:       {CgoSupported: true},
+	{"android", "386"}:     {CgoSupported: true},
+	{"android", "amd64"}:   {CgoSupported: true},
+	{"android", "arm"}:     {CgoSupported: true},
+	{"android", "arm64"}:   {CgoSupported: true},
+	{"darwin", "amd64"}:    {CgoSupported: true, FirstClass: true},
+	{"darwin", "arm64"}:    {CgoSupported: true, FirstClass: true},
+	{"dragonfly", "amd64"}: {CgoSupported: true},
+	{"freebsd", "386"}:     {CgoSupported: true},
+	{"freebsd", "amd64"}:   {CgoSupported: true},
+	{"freebsd", "arm"}:     {CgoSupported: true},
+	{"freebsd", "arm64"}:   {CgoSupported: true},
+	{"freebsd", "riscv64"}: {CgoSupported: true},
+	{"illumos", "amd64"}:   {CgoSupported: true},
+	{"ios", "amd64"}:       {CgoSupported: true},
+	{"ios", "arm64"}:       {CgoSupported: true},
+	{"js", "wasm"}:         {},
+	{"linux", "386"}:       {CgoSupported: true, FirstClass: true},
+	{"linux", "amd64"}:     {CgoSupported: true, FirstClass: true},
+	{"linux", "arm"}:       {CgoSupported: true, FirstClass: true},
+	{"linux", "arm64"}:     {CgoSupported: true, FirstClass: true},
+	{"linux", "loong64"}:   {CgoSupported: true},
+	{"linux", "mips"}:      {CgoSupported: true},
+	{"linux", "mips64"}:    {CgoSupported: true},
+	{"linux", "mips64le"}:  {CgoSupported: true},
+	{"linux", "mipsle"}:    {CgoSupported: true},
+	{"linux", "ppc64"}:     {},
+	{"linux", "ppc64le"}:   {CgoSupported: true},
+	{"linux", "riscv64"}:   {CgoSupported: true},
+	{"linux", "s390x"}:     {CgoSupported: true},
+	{"linux", "sparc64"}:   {CgoSupported: true, Broken: true},
+	{"netbsd", "386"}:      {CgoSupported: true},
+	{"netbsd", "amd64"}:    {CgoSupported: true},
+	{"netbsd", "arm"}:      {CgoSupported: true},
+	{"netbsd", "arm64"}:    {CgoSupported: true},
+	{"openbsd", "386"}:     {CgoSupported: true},
+	{"openbsd", "amd64"}:   {CgoSupported: true},
+	{"openbsd", "arm"}:     {CgoSupported: true},
+	{"openbsd", "arm64"}:   {CgoSupported: true},
+	{"openbsd", "mips64"}:  {CgoSupported: true, Broken: true},
+	{"openbsd", "ppc64"}:   {Broken: true},
+	{"plan9", "386"}:       {},
+	{"plan9", "amd64"}:     {},
+	{"plan9", "arm"}:       {},
+	{"solaris", "amd64"}:   {CgoSupported: true},
+	{"wasip1", "wasm"}:     {},
+	{"windows", "386"}:     {CgoSupported: true, FirstClass: true},
+	{"windows", "amd64"}:   {CgoSupported: true, FirstClass: true},
+	{"windows", "arm"}:     {},
+	{"windows", "arm64"}:   {CgoSupported: true},
+}
diff --git a/src/internal/platform/zosarch_test.go b/src/internal/platform/zosarch_test.go
new file mode 100644
index 0000000..e8ffe9e
--- /dev/null
+++ b/src/internal/platform/zosarch_test.go
@@ -0,0 +1,109 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package platform_test
+
+import (
+	"bytes"
+	"encoding/json"
+	"flag"
+	"internal/diff"
+	"internal/testenv"
+	"os"
+	"os/exec"
+	"testing"
+	"text/template"
+)
+
+var flagFix = flag.Bool("fix", false, "if true, fix out-of-date generated files")
+
+// TestGenerated verifies that zosarch.go is up to date,
+// or regenerates it if the -fix flag is set.
+func TestGenerated(t *testing.T) {
+	testenv.MustHaveGoRun(t)
+
+	// Here we use 'go run cmd/dist' instead of 'go tool dist' in case the
+	// installed cmd/dist is stale or missing. We don't want to miss a
+	// skew in the data due to a stale binary.
+	cmd := testenv.Command(t, "go", "run", "cmd/dist", "list", "-json", "-broken")
+
+	// cmd/dist requires GOROOT to be set explicitly in the environment.
+	cmd.Env = append(cmd.Environ(), "GOROOT="+testenv.GOROOT(t))
+
+	out, err := cmd.Output()
+	if err != nil {
+		if ee, ok := err.(*exec.ExitError); ok && len(ee.Stderr) > 0 {
+			t.Logf("stderr:\n%s", ee.Stderr)
+		}
+		t.Fatalf("%v: %v", cmd, err)
+	}
+
+	type listEntry struct {
+		GOOS, GOARCH string
+		CgoSupported bool
+		FirstClass   bool
+		Broken       bool
+	}
+	var entries []listEntry
+	if err := json.Unmarshal(out, &entries); err != nil {
+		t.Fatal(err)
+	}
+
+	tmplOut := new(bytes.Buffer)
+	tmpl := template.Must(template.New("zosarch").Parse(zosarchTmpl))
+	err = tmpl.Execute(tmplOut, entries)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	cmd = testenv.Command(t, "gofmt")
+	cmd.Stdin = bytes.NewReader(tmplOut.Bytes())
+	want, err := cmd.Output()
+	if err != nil {
+		t.Logf("stdin:\n%s", tmplOut.Bytes())
+		if ee, ok := err.(*exec.ExitError); ok && len(ee.Stderr) > 0 {
+			t.Logf("stderr:\n%s", ee.Stderr)
+		}
+		t.Fatalf("%v: %v", cmd, err)
+	}
+
+	got, err := os.ReadFile("zosarch.go")
+	if err == nil && bytes.Equal(got, want) {
+		return
+	}
+
+	if !*flagFix {
+		if err != nil {
+			t.Log(err)
+		} else {
+			t.Logf("diff:\n%s", diff.Diff("zosarch.go", got, "want", want))
+		}
+		t.Fatalf("zosarch.go is missing or out of date; to regenerate, run\ngo generate internal/platform")
+	}
+
+	if err := os.WriteFile("zosarch.go", want, 0666); err != nil {
+		t.Fatal(err)
+	}
+}
+
+const zosarchTmpl = `// Code generated by go test internal/platform -fix. DO NOT EDIT.
+
+// To change the information in this file, edit the cgoEnabled and/or firstClass
+// maps in cmd/dist/build.go, then run 'go generate internal/platform'.
+
+package platform
+
+// List is the list of all valid GOOS/GOARCH combinations,
+// including known-broken ports.
+var List = []OSArch{
+{{range .}}	{ {{ printf "%q" .GOOS }}, {{ printf "%q" .GOARCH }} },
+{{end}}
+}
+
+var distInfo = map[OSArch]osArchInfo {
+{{range .}}	{ {{ printf "%q" .GOOS }}, {{ printf "%q" .GOARCH }} }:
+{ {{if .CgoSupported}}CgoSupported: true, {{end}}{{if .FirstClass}}FirstClass: true, {{end}}{{if .Broken}} Broken: true, {{end}} },
+{{end}}
+}
+`
diff --git a/src/internal/poll/errno_unix.go b/src/internal/poll/errno_unix.go
index 8eed93a..d1a18ab 100644
--- a/src/internal/poll/errno_unix.go
+++ b/src/internal/poll/errno_unix.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build unix
+//go:build unix || wasip1
 
 package poll
 
diff --git a/src/internal/poll/fcntl_js.go b/src/internal/poll/fcntl_js.go
deleted file mode 100644
index 0f42ef6..0000000
--- a/src/internal/poll/fcntl_js.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2019 The Go 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:build js && wasm
-
-package poll
-
-import "syscall"
-
-// fcntl not supported on js/wasm
-func fcntl(fd int, cmd int, arg int) (int, error) {
-	return 0, syscall.ENOSYS
-}
diff --git a/src/internal/poll/fcntl_libc.go b/src/internal/poll/fcntl_libc.go
deleted file mode 100644
index 529b8e1..0000000
--- a/src/internal/poll/fcntl_libc.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2019 The Go 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:build aix || darwin || (openbsd && !mips64) || solaris
-
-package poll
-
-import _ "unsafe" // for go:linkname
-
-// Implemented in the syscall package.
-//
-//go:linkname fcntl syscall.fcntl
-func fcntl(fd int, cmd int, arg int) (int, error)
diff --git a/src/internal/poll/fcntl_syscall.go b/src/internal/poll/fcntl_syscall.go
deleted file mode 100644
index bbfc8a8..0000000
--- a/src/internal/poll/fcntl_syscall.go
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2019 The Go 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:build dragonfly || freebsd || linux || netbsd || (openbsd && mips64)
-
-package poll
-
-import (
-	"internal/syscall/unix"
-	"syscall"
-)
-
-func fcntl(fd int, cmd int, arg int) (int, error) {
-	r, _, e := syscall.Syscall(unix.FcntlSyscall, uintptr(fd), uintptr(cmd), uintptr(arg))
-	if e != 0 {
-		return int(r), syscall.Errno(e)
-	}
-	return int(r), nil
-}
diff --git a/src/internal/poll/fd_fsync_darwin.go b/src/internal/poll/fd_fsync_darwin.go
index 48e7596..731b7fd 100644
--- a/src/internal/poll/fd_fsync_darwin.go
+++ b/src/internal/poll/fd_fsync_darwin.go
@@ -4,7 +4,10 @@
 
 package poll
 
-import "syscall"
+import (
+	"internal/syscall/unix"
+	"syscall"
+)
 
 // Fsync invokes SYS_FCNTL with SYS_FULLFSYNC because
 // on OS X, SYS_FSYNC doesn't fully flush contents to disk.
@@ -15,7 +18,7 @@
 	}
 	defer fd.decref()
 	return ignoringEINTR(func() error {
-		_, err := fcntl(fd.Sysfd, syscall.F_FULLFSYNC, 0)
+		_, err := unix.Fcntl(fd.Sysfd, syscall.F_FULLFSYNC, 0)
 		return err
 	})
 }
diff --git a/src/internal/poll/fd_fsync_posix.go b/src/internal/poll/fd_fsync_posix.go
index 6f17019..469ca75 100644
--- a/src/internal/poll/fd_fsync_posix.go
+++ b/src/internal/poll/fd_fsync_posix.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build aix || dragonfly || freebsd || (js && wasm) || linux || netbsd || openbsd || solaris
+//go:build aix || dragonfly || freebsd || (js && wasm) || linux || netbsd || openbsd || solaris || wasip1
 
 package poll
 
diff --git a/src/internal/poll/fd_plan9.go b/src/internal/poll/fd_plan9.go
index 0fdf4f6..7cc178a 100644
--- a/src/internal/poll/fd_plan9.go
+++ b/src/internal/poll/fd_plan9.go
@@ -8,7 +8,6 @@
 	"errors"
 	"io"
 	"sync"
-	"sync/atomic"
 	"time"
 )
 
@@ -25,8 +24,8 @@
 	waio      *asyncIO
 	rtimer    *time.Timer
 	wtimer    *time.Timer
-	rtimedout atomic.Bool // set true when read deadline has been reached
-	wtimedout atomic.Bool // set true when write deadline has been reached
+	rtimedout bool // set true when read deadline has been reached
+	wtimedout bool // set true when write deadline has been reached
 
 	// Whether this is a normal file.
 	// On Plan 9 we do not use this package for ordinary files,
@@ -64,7 +63,7 @@
 		return 0, nil
 	}
 	fd.rmu.Lock()
-	if fd.rtimedout.Load() {
+	if fd.rtimedout {
 		fd.rmu.Unlock()
 		return 0, ErrDeadlineExceeded
 	}
@@ -88,7 +87,7 @@
 	}
 	defer fd.writeUnlock()
 	fd.wmu.Lock()
-	if fd.wtimedout.Load() {
+	if fd.wtimedout {
 		fd.wmu.Unlock()
 		return 0, ErrDeadlineExceeded
 	}
@@ -122,60 +121,66 @@
 	if mode == 'r' || mode == 'r'+'w' {
 		fd.rmu.Lock()
 		defer fd.rmu.Unlock()
-		fd.rtimedout.Store(false)
+		if fd.rtimer != nil {
+			fd.rtimer.Stop()
+			fd.rtimer = nil
+		}
+		fd.rtimedout = false
 	}
 	if mode == 'w' || mode == 'r'+'w' {
 		fd.wmu.Lock()
 		defer fd.wmu.Unlock()
-		fd.wtimedout.Store(false)
-	}
-	if t.IsZero() || d < 0 {
-		// Stop timer
-		if mode == 'r' || mode == 'r'+'w' {
-			if fd.rtimer != nil {
-				fd.rtimer.Stop()
-			}
-			fd.rtimer = nil
-		}
-		if mode == 'w' || mode == 'r'+'w' {
-			if fd.wtimer != nil {
-				fd.wtimer.Stop()
-			}
+		if fd.wtimer != nil {
+			fd.wtimer.Stop()
 			fd.wtimer = nil
 		}
-	} else {
+		fd.wtimedout = false
+	}
+	if !t.IsZero() && d > 0 {
 		// Interrupt I/O operation once timer has expired
 		if mode == 'r' || mode == 'r'+'w' {
-			fd.rtimer = time.AfterFunc(d, func() {
+			var timer *time.Timer
+			timer = time.AfterFunc(d, func() {
 				fd.rmu.Lock()
-				fd.rtimedout.Store(true)
+				defer fd.rmu.Unlock()
+				if fd.rtimer != timer {
+					// deadline was changed
+					return
+				}
+				fd.rtimedout = true
 				if fd.raio != nil {
 					fd.raio.Cancel()
 				}
-				fd.rmu.Unlock()
 			})
+			fd.rtimer = timer
 		}
 		if mode == 'w' || mode == 'r'+'w' {
-			fd.wtimer = time.AfterFunc(d, func() {
+			var timer *time.Timer
+			timer = time.AfterFunc(d, func() {
 				fd.wmu.Lock()
-				fd.wtimedout.Store(true)
+				defer fd.wmu.Unlock()
+				if fd.wtimer != timer {
+					// deadline was changed
+					return
+				}
+				fd.wtimedout = true
 				if fd.waio != nil {
 					fd.waio.Cancel()
 				}
-				fd.wmu.Unlock()
 			})
+			fd.wtimer = timer
 		}
 	}
-	if !t.IsZero() && d < 0 {
+	if !t.IsZero() && d <= 0 {
 		// Interrupt current I/O operation
 		if mode == 'r' || mode == 'r'+'w' {
-			fd.rtimedout.Store(true)
+			fd.rtimedout = true
 			if fd.raio != nil {
 				fd.raio.Cancel()
 			}
 		}
 		if mode == 'w' || mode == 'r'+'w' {
-			fd.wtimedout.Store(true)
+			fd.wtimedout = true
 			if fd.waio != nil {
 				fd.waio.Cancel()
 			}
diff --git a/src/internal/poll/fd_poll_js.go b/src/internal/poll/fd_poll_js.go
index 84bfcae..fe5e73a 100644
--- a/src/internal/poll/fd_poll_js.go
+++ b/src/internal/poll/fd_poll_js.go
@@ -42,7 +42,7 @@
 	if pd.closing {
 		return errClosing(isFile)
 	}
-	if isFile { // TODO(neelance): wasm: Use callbacks from JS to block until the read/write finished.
+	if isFile { // TODO(neelance): js/wasm: Use callbacks from JS to block until the read/write finished.
 		return nil
 	}
 	return ErrDeadlineExceeded
diff --git a/src/internal/poll/fd_poll_runtime.go b/src/internal/poll/fd_poll_runtime.go
index 0a2e76d..b51535e 100644
--- a/src/internal/poll/fd_poll_runtime.go
+++ b/src/internal/poll/fd_poll_runtime.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build unix || windows
+//go:build unix || windows || wasip1
 
 package poll
 
diff --git a/src/internal/poll/fd_posix.go b/src/internal/poll/fd_posix.go
index 778fe1e..5bd333b 100644
--- a/src/internal/poll/fd_posix.go
+++ b/src/internal/poll/fd_posix.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build unix || (js && wasm) || windows
+//go:build unix || (js && wasm) || wasip1 || windows
 
 package poll
 
diff --git a/src/internal/poll/fd_unix.go b/src/internal/poll/fd_unix.go
index 2786064..61c2338 100644
--- a/src/internal/poll/fd_unix.go
+++ b/src/internal/poll/fd_unix.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build unix || (js && wasm)
+//go:build unix || (js && wasm) || wasip1
 
 package poll
 
@@ -22,12 +22,12 @@
 	// System file descriptor. Immutable until Close.
 	Sysfd int
 
+	// Platform dependent state of the file descriptor.
+	SysFile
+
 	// I/O poller.
 	pd pollDesc
 
-	// Writev cache.
-	iovecs *[]syscall.Iovec
-
 	// Semaphore signaled when file is closed.
 	csema uint32
 
@@ -52,6 +52,8 @@
 // or "file".
 // Set pollable to true if fd should be managed by runtime netpoll.
 func (fd *FD) Init(net string, pollable bool) error {
+	fd.SysFile.init()
+
 	// We don't actually care about the various network types.
 	if net == "file" {
 		fd.isFile = true
@@ -76,12 +78,7 @@
 	// so this must be executed before CloseFunc.
 	fd.pd.close()
 
-	// We don't use ignoringEINTR here because POSIX does not define
-	// whether the descriptor is closed if close returns EINTR.
-	// If the descriptor is indeed closed, using a loop would race
-	// with some other goroutine opening a new descriptor.
-	// (The Linux kernel guarantees that it is closed on an EINTR error.)
-	err := CloseFunc(fd.Sysfd)
+	err := fd.SysFile.destroy(fd.Sysfd)
 
 	fd.Sysfd = -1
 	runtime_Semrelease(&fd.csema)
@@ -625,38 +622,6 @@
 	}
 }
 
-// Seek wraps syscall.Seek.
-func (fd *FD) Seek(offset int64, whence int) (int64, error) {
-	if err := fd.incref(); err != nil {
-		return 0, err
-	}
-	defer fd.decref()
-	return syscall.Seek(fd.Sysfd, offset, whence)
-}
-
-// ReadDirent wraps syscall.ReadDirent.
-// We treat this like an ordinary system call rather than a call
-// that tries to fill the buffer.
-func (fd *FD) ReadDirent(buf []byte) (int, error) {
-	if err := fd.incref(); err != nil {
-		return 0, err
-	}
-	defer fd.decref()
-	for {
-		n, err := ignoringEINTRIO(syscall.ReadDirent, fd.Sysfd, buf)
-		if err != nil {
-			n = 0
-			if err == syscall.EAGAIN && fd.pd.pollable() {
-				if err = fd.pd.waitRead(fd.isFile); err == nil {
-					continue
-				}
-			}
-		}
-		// Do not call eofError; caller does not expect to see io.EOF.
-		return n, err
-	}
-}
-
 // Fchmod wraps syscall.Fchmod.
 func (fd *FD) Fchmod(mode uint32) error {
 	if err := fd.incref(); err != nil {
@@ -668,15 +633,6 @@
 	})
 }
 
-// Fchdir wraps syscall.Fchdir.
-func (fd *FD) Fchdir() error {
-	if err := fd.incref(); err != nil {
-		return err
-	}
-	defer fd.decref()
-	return syscall.Fchdir(fd.Sysfd)
-}
-
 // Fstat wraps syscall.Fstat
 func (fd *FD) Fstat(s *syscall.Stat_t) error {
 	if err := fd.incref(); err != nil {
@@ -688,43 +644,29 @@
 	})
 }
 
-// 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)
+// dupCloexecUnsupported indicates whether F_DUPFD_CLOEXEC is supported by the kernel.
+var dupCloexecUnsupported atomic.Bool
 
 // DupCloseOnExec dups fd and marks it close-on-exec.
 func DupCloseOnExec(fd int) (int, string, error) {
-	if syscall.F_DUPFD_CLOEXEC != 0 && atomic.LoadInt32(&tryDupCloexec) == 1 {
-		r0, e1 := fcntl(fd, syscall.F_DUPFD_CLOEXEC, 0)
-		if e1 == nil {
+	if syscall.F_DUPFD_CLOEXEC != 0 && !dupCloexecUnsupported.Load() {
+		r0, err := unix.Fcntl(fd, syscall.F_DUPFD_CLOEXEC, 0)
+		if err == nil {
 			return r0, "", nil
 		}
-		switch e1.(syscall.Errno) {
+		switch err {
 		case syscall.EINVAL, syscall.ENOSYS:
 			// Old kernel, or js/wasm (which returns
 			// ENOSYS). Fall back to the portable way from
 			// now on.
-			atomic.StoreInt32(&tryDupCloexec, 0)
+			dupCloexecUnsupported.Store(true)
 		default:
-			return -1, "fcntl", e1
+			return -1, "fcntl", err
 		}
 	}
 	return dupCloseOnExecOld(fd)
 }
 
-// dupCloseOnExecOld is the traditional way to dup an fd and
-// set its O_CLOEXEC bit, using two system calls.
-func dupCloseOnExecOld(fd int) (int, string, error) {
-	syscall.ForkLock.RLock()
-	defer syscall.ForkLock.RUnlock()
-	newfd, err := syscall.Dup(fd)
-	if err != nil {
-		return -1, "dup", err
-	}
-	syscall.CloseOnExec(newfd)
-	return newfd, "", nil
-}
-
 // Dup duplicates the file descriptor.
 func (fd *FD) Dup() (int, string, error) {
 	if err := fd.incref(); err != nil {
diff --git a/src/internal/poll/fd_unixjs.go b/src/internal/poll/fd_unixjs.go
new file mode 100644
index 0000000..090974d
--- /dev/null
+++ b/src/internal/poll/fd_unixjs.go
@@ -0,0 +1,79 @@
+// Copyright 2023 The Go 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:build unix || (js && wasm)
+
+package poll
+
+import "syscall"
+
+type SysFile struct {
+	// Writev cache.
+	iovecs *[]syscall.Iovec
+}
+
+func (s *SysFile) init() {}
+
+func (s *SysFile) destroy(fd int) error {
+	// We don't use ignoringEINTR here because POSIX does not define
+	// whether the descriptor is closed if close returns EINTR.
+	// If the descriptor is indeed closed, using a loop would race
+	// with some other goroutine opening a new descriptor.
+	// (The Linux kernel guarantees that it is closed on an EINTR error.)
+	return CloseFunc(fd)
+}
+
+// dupCloseOnExecOld is the traditional way to dup an fd and
+// set its O_CLOEXEC bit, using two system calls.
+func dupCloseOnExecOld(fd int) (int, string, error) {
+	syscall.ForkLock.RLock()
+	defer syscall.ForkLock.RUnlock()
+	newfd, err := syscall.Dup(fd)
+	if err != nil {
+		return -1, "dup", err
+	}
+	syscall.CloseOnExec(newfd)
+	return newfd, "", nil
+}
+
+// Fchdir wraps syscall.Fchdir.
+func (fd *FD) Fchdir() error {
+	if err := fd.incref(); err != nil {
+		return err
+	}
+	defer fd.decref()
+	return syscall.Fchdir(fd.Sysfd)
+}
+
+// ReadDirent wraps syscall.ReadDirent.
+// We treat this like an ordinary system call rather than a call
+// that tries to fill the buffer.
+func (fd *FD) ReadDirent(buf []byte) (int, error) {
+	if err := fd.incref(); err != nil {
+		return 0, err
+	}
+	defer fd.decref()
+	for {
+		n, err := ignoringEINTRIO(syscall.ReadDirent, fd.Sysfd, buf)
+		if err != nil {
+			n = 0
+			if err == syscall.EAGAIN && fd.pd.pollable() {
+				if err = fd.pd.waitRead(fd.isFile); err == nil {
+					continue
+				}
+			}
+		}
+		// Do not call eofError; caller does not expect to see io.EOF.
+		return n, err
+	}
+}
+
+// Seek wraps syscall.Seek.
+func (fd *FD) Seek(offset int64, whence int) (int64, error) {
+	if err := fd.incref(); err != nil {
+		return 0, err
+	}
+	defer fd.decref()
+	return syscall.Seek(fd.Sysfd, offset, whence)
+}
diff --git a/src/internal/poll/fd_wasip1.go b/src/internal/poll/fd_wasip1.go
new file mode 100644
index 0000000..aecd896
--- /dev/null
+++ b/src/internal/poll/fd_wasip1.go
@@ -0,0 +1,239 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package poll
+
+import (
+	"sync/atomic"
+	"syscall"
+	"unsafe"
+)
+
+type SysFile struct {
+	// RefCountPtr is a pointer to the reference count of Sysfd.
+	//
+	// WASI preview 1 lacks a dup(2) system call. When the os and net packages
+	// need to share a file/socket, instead of duplicating the underlying file
+	// descriptor, we instead provide a way to copy FD instances and manage the
+	// underlying file descriptor with reference counting.
+	RefCountPtr *int32
+
+	// RefCount is the reference count of Sysfd. When a copy of an FD is made,
+	// it points to the reference count of the original FD instance.
+	RefCount int32
+
+	// Cache for the file type, lazily initialized when Seek is called.
+	Filetype uint32
+
+	// If the file represents a directory, this field contains the current
+	// readdir position. It is reset to zero if the program calls Seek(0, 0).
+	Dircookie uint64
+
+	// Absolute path of the file, as returned by syscall.PathOpen;
+	// this is used by Fchdir to emulate setting the current directory
+	// to an open file descriptor.
+	Path string
+
+	// TODO(achille): it could be meaningful to move isFile from FD to a method
+	// on this struct type, and expose it as `IsFile() bool` which derives the
+	// result from the Filetype field. We would need to ensure that Filetype is
+	// always set instead of being lazily initialized.
+}
+
+func (s *SysFile) init() {
+	if s.RefCountPtr == nil {
+		s.RefCount = 1
+		s.RefCountPtr = &s.RefCount
+	}
+}
+
+func (s *SysFile) ref() SysFile {
+	atomic.AddInt32(s.RefCountPtr, +1)
+	return SysFile{RefCountPtr: s.RefCountPtr}
+}
+
+func (s *SysFile) destroy(fd int) error {
+	if s.RefCountPtr != nil && atomic.AddInt32(s.RefCountPtr, -1) > 0 {
+		return nil
+	}
+
+	// We don't use ignoringEINTR here because POSIX does not define
+	// whether the descriptor is closed if close returns EINTR.
+	// If the descriptor is indeed closed, using a loop would race
+	// with some other goroutine opening a new descriptor.
+	// (The Linux kernel guarantees that it is closed on an EINTR error.)
+	return CloseFunc(fd)
+}
+
+// Copy creates a copy of the FD.
+//
+// The FD instance points to the same underlying file descriptor. The file
+// descriptor isn't closed until all FD instances that refer to it have been
+// closed/destroyed.
+func (fd *FD) Copy() FD {
+	return FD{
+		Sysfd:         fd.Sysfd,
+		SysFile:       fd.SysFile.ref(),
+		IsStream:      fd.IsStream,
+		ZeroReadIsEOF: fd.ZeroReadIsEOF,
+		isBlocking:    fd.isBlocking,
+		isFile:        fd.isFile,
+	}
+}
+
+// dupCloseOnExecOld always errors on wasip1 because there is no mechanism to
+// duplicate file descriptors.
+func dupCloseOnExecOld(fd int) (int, string, error) {
+	return -1, "dup", syscall.ENOSYS
+}
+
+// Fchdir wraps syscall.Fchdir.
+func (fd *FD) Fchdir() error {
+	if err := fd.incref(); err != nil {
+		return err
+	}
+	defer fd.decref()
+	return syscall.Chdir(fd.Path)
+}
+
+// ReadDir wraps syscall.ReadDir.
+// We treat this like an ordinary system call rather than a call
+// that tries to fill the buffer.
+func (fd *FD) ReadDir(buf []byte, cookie syscall.Dircookie) (int, error) {
+	if err := fd.incref(); err != nil {
+		return 0, err
+	}
+	defer fd.decref()
+	for {
+		n, err := syscall.ReadDir(fd.Sysfd, buf, cookie)
+		if err != nil {
+			n = 0
+			if err == syscall.EAGAIN && fd.pd.pollable() {
+				if err = fd.pd.waitRead(fd.isFile); err == nil {
+					continue
+				}
+			}
+		}
+		// Do not call eofError; caller does not expect to see io.EOF.
+		return n, err
+	}
+}
+
+func (fd *FD) ReadDirent(buf []byte) (int, error) {
+	n, err := fd.ReadDir(buf, fd.Dircookie)
+	if err != nil {
+		return 0, err
+	}
+	if n <= 0 {
+		return n, nil // EOF
+	}
+
+	// We assume that the caller of ReadDirent will consume the entire buffer
+	// up to the last full entry, so we scan through the buffer looking for the
+	// value of the last next cookie.
+	b := buf[:n]
+
+	for len(b) > 0 {
+		next, ok := direntNext(b)
+		if !ok {
+			break
+		}
+		size, ok := direntReclen(b)
+		if !ok {
+			break
+		}
+		if size > uint64(len(b)) {
+			break
+		}
+		fd.Dircookie = syscall.Dircookie(next)
+		b = b[size:]
+	}
+
+	// Trim a potentially incomplete trailing entry; this is necessary because
+	// the code in src/os/dir_unix.go does not deal well with partial values in
+	// calls to direntReclen, etc... and ends up causing an early EOF before all
+	// directory entries were consumed. ReadDirent is called with a large enough
+	// buffer (8 KiB) that at least one entry should always fit, tho this seems
+	// a bit brittle but cannot be addressed without a large change of the
+	// algorithm in the os.(*File).readdir method.
+	return n - len(b), nil
+}
+
+// Seek wraps syscall.Seek.
+func (fd *FD) Seek(offset int64, whence int) (int64, error) {
+	if err := fd.incref(); err != nil {
+		return 0, err
+	}
+	defer fd.decref()
+	// syscall.Filetype is a uint8 but we store it as a uint32 in SysFile in
+	// order to use atomic load/store on the field, which is why we have to
+	// perform this type conversion.
+	fileType := syscall.Filetype(atomic.LoadUint32(&fd.Filetype))
+
+	if fileType == syscall.FILETYPE_UNKNOWN {
+		var stat syscall.Stat_t
+		if err := fd.Fstat(&stat); err != nil {
+			return 0, err
+		}
+		fileType = stat.Filetype
+		atomic.StoreUint32(&fd.Filetype, uint32(fileType))
+	}
+
+	if fileType == syscall.FILETYPE_DIRECTORY {
+		// If the file descriptor is opened on a directory, we reset the readdir
+		// cookie when seeking back to the beginning to allow reusing the file
+		// descriptor to scan the directory again.
+		if offset == 0 && whence == 0 {
+			fd.Dircookie = 0
+			return 0, nil
+		} else {
+			return 0, syscall.EINVAL
+		}
+	}
+
+	return syscall.Seek(fd.Sysfd, offset, whence)
+}
+
+// https://github.com/WebAssembly/WASI/blob/main/legacy/preview1/docs.md#-dirent-record
+const sizeOfDirent = 24
+
+func direntReclen(buf []byte) (uint64, bool) {
+	namelen, ok := direntNamlen(buf)
+	return sizeOfDirent + namelen, ok
+}
+
+func direntNamlen(buf []byte) (uint64, bool) {
+	return readInt(buf, unsafe.Offsetof(syscall.Dirent{}.Namlen), unsafe.Sizeof(syscall.Dirent{}.Namlen))
+}
+
+func direntNext(buf []byte) (uint64, bool) {
+	return readInt(buf, unsafe.Offsetof(syscall.Dirent{}.Next), unsafe.Sizeof(syscall.Dirent{}.Next))
+}
+
+// readInt returns the size-bytes unsigned integer in native byte order at offset off.
+func readInt(b []byte, off, size uintptr) (u uint64, ok bool) {
+	if len(b) < int(off+size) {
+		return 0, false
+	}
+	return readIntLE(b[off:], size), true
+}
+
+func readIntLE(b []byte, size uintptr) uint64 {
+	switch size {
+	case 1:
+		return uint64(b[0])
+	case 2:
+		_ = b[1] // bounds check hint to compiler; see golang.org/issue/14808
+		return uint64(b[0]) | uint64(b[1])<<8
+	case 4:
+		_ = b[3] // bounds check hint to compiler; see golang.org/issue/14808
+		return uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24
+	case 8:
+		_ = b[7] // bounds check hint to compiler; see golang.org/issue/14808
+		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
+	default:
+		panic("internal/poll: readInt with unsupported size")
+	}
+}
diff --git a/src/internal/poll/fd_windows.go b/src/internal/poll/fd_windows.go
index 3a4a74f..9df39ed 100644
--- a/src/internal/poll/fd_windows.go
+++ b/src/internal/poll/fd_windows.go
@@ -325,9 +325,9 @@
 	if pollable && useSetFileCompletionNotificationModes {
 		// 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:
-		// https://docs.microsoft.com/en-us/archive/blogs/winserverperformance/designing-applications-for-high-performance-part-iii
-		if net == "tcp" {
+		switch net {
+		case "tcp", "tcp4", "tcp6",
+			"udp", "udp4", "udp6":
 			flags |= syscall.FILE_SKIP_COMPLETION_PORT_ON_SUCCESS
 		}
 		err := syscall.SetFileCompletionNotificationModes(fd.Sysfd, flags)
@@ -522,6 +522,10 @@
 
 // Pread emulates the Unix pread system call.
 func (fd *FD) Pread(b []byte, off int64) (int, error) {
+	if fd.kind == kindPipe {
+		// Pread does not work with pipes
+		return 0, syscall.ESPIPE
+	}
 	// Call incref, not readLock, because since pread specifies the
 	// offset it is independent from other reads.
 	if err := fd.incref(); err != nil {
@@ -744,6 +748,10 @@
 
 // Pwrite emulates the Unix pwrite system call.
 func (fd *FD) Pwrite(buf []byte, off int64) (int, error) {
+	if fd.kind == kindPipe {
+		// Pwrite does not work with pipes
+		return 0, syscall.ESPIPE
+	}
 	// Call incref, not writeLock, because since pwrite specifies the
 	// offset it is independent from other writes.
 	if err := fd.incref(); err != nil {
@@ -992,6 +1000,9 @@
 
 // Seek wraps syscall.Seek.
 func (fd *FD) Seek(offset int64, whence int) (int64, error) {
+	if fd.kind == kindPipe {
+		return 0, syscall.ESPIPE
+	}
 	if err := fd.incref(); err != nil {
 		return 0, err
 	}
diff --git a/src/internal/poll/fd_windows_test.go b/src/internal/poll/fd_windows_test.go
index e3ca0e2..f0697a0 100644
--- a/src/internal/poll/fd_windows_test.go
+++ b/src/internal/poll/fd_windows_test.go
@@ -5,12 +5,15 @@
 package poll_test
 
 import (
+	"errors"
 	"fmt"
 	"internal/poll"
+	"internal/syscall/windows"
 	"os"
 	"sync"
 	"syscall"
 	"testing"
+	"unsafe"
 )
 
 type loggedFD struct {
@@ -109,3 +112,87 @@
 		})
 	}
 }
+
+func TestWSASocketConflict(t *testing.T) {
+	s, err := windows.WSASocket(syscall.AF_INET, syscall.SOCK_STREAM, syscall.IPPROTO_TCP, nil, 0, windows.WSA_FLAG_OVERLAPPED)
+	if err != nil {
+		t.Fatal(err)
+	}
+	fd := poll.FD{Sysfd: s, IsStream: true, ZeroReadIsEOF: true}
+	_, err = fd.Init("tcp", true)
+	if err != nil {
+		syscall.CloseHandle(s)
+		t.Fatal(err)
+	}
+	defer fd.Close()
+
+	const SIO_TCP_INFO = syscall.IOC_INOUT | syscall.IOC_VENDOR | 39
+	inbuf := uint32(0)
+	var outbuf _TCP_INFO_v0
+	cbbr := uint32(0)
+
+	var ovs []syscall.Overlapped = make([]syscall.Overlapped, 2)
+	// Attempt to exercise behavior where a user-owned syscall.Overlapped
+	// induces an invalid pointer dereference in the Windows-specific version
+	// of runtime.netpoll.
+	ovs[1].Internal -= 1
+
+	// Create an event so that we can efficiently wait for completion
+	// of a requested overlapped I/O operation.
+	ovs[0].HEvent, _ = windows.CreateEvent(nil, 0, 0, nil)
+	if ovs[0].HEvent == 0 {
+		t.Fatalf("could not create the event!")
+	}
+
+	// Set the low bit of the Event Handle so that the completion
+	// of the overlapped I/O event will not trigger a completion event
+	// on any I/O completion port associated with the handle.
+	ovs[0].HEvent |= 0x1
+
+	if err = fd.WSAIoctl(
+		SIO_TCP_INFO,
+		(*byte)(unsafe.Pointer(&inbuf)),
+		uint32(unsafe.Sizeof(inbuf)),
+		(*byte)(unsafe.Pointer(&outbuf)),
+		uint32(unsafe.Sizeof(outbuf)),
+		&cbbr,
+		&ovs[0],
+		0,
+	); err != nil && !errors.Is(err, syscall.ERROR_IO_PENDING) {
+		t.Fatalf("could not perform the WSAIoctl: %v", err)
+	}
+
+	if err != nil && errors.Is(err, syscall.ERROR_IO_PENDING) {
+		// It is possible that the overlapped I/O operation completed
+		// immediately so there is no need to wait for it to complete.
+		if res, err := syscall.WaitForSingleObject(ovs[0].HEvent, syscall.INFINITE); res != 0 {
+			t.Fatalf("waiting for the completion of the overlapped IO failed: %v", err)
+		}
+	}
+
+	if err = syscall.CloseHandle(ovs[0].HEvent); err != nil {
+		t.Fatalf("could not close the event handle: %v", err)
+	}
+}
+
+type _TCP_INFO_v0 struct {
+	State             uint32
+	Mss               uint32
+	ConnectionTimeMs  uint64
+	TimestampsEnabled bool
+	RttUs             uint32
+	MinRttUs          uint32
+	BytesInFlight     uint32
+	Cwnd              uint32
+	SndWnd            uint32
+	RcvWnd            uint32
+	RcvBuf            uint32
+	BytesOut          uint64
+	BytesIn           uint64
+	BytesReordered    uint32
+	BytesRetrans      uint32
+	FastRetrans       uint32
+	DupAcksIn         uint32
+	TimeoutEpisodes   uint32
+	SynRetrans        uint8
+}
diff --git a/src/internal/poll/hook_unix.go b/src/internal/poll/hook_unix.go
index 1a50356..b3f4f9e 100644
--- a/src/internal/poll/hook_unix.go
+++ b/src/internal/poll/hook_unix.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build unix || (js && wasm)
+//go:build unix || (js && wasm) || wasip1
 
 package poll
 
diff --git a/src/internal/poll/sendfile_windows.go b/src/internal/poll/sendfile_windows.go
index 50c3ee8..8c3353b 100644
--- a/src/internal/poll/sendfile_windows.go
+++ b/src/internal/poll/sendfile_windows.go
@@ -15,6 +15,9 @@
 		// TransmitFile does not work with pipes
 		return 0, syscall.ESPIPE
 	}
+	if ft, _ := syscall.GetFileType(src); ft == syscall.FILE_TYPE_PIPE {
+		return 0, syscall.ESPIPE
+	}
 
 	if err := fd.writeLock(); err != nil {
 		return 0, err
diff --git a/src/internal/poll/sock_cloexec.go b/src/internal/poll/sock_cloexec.go
index f5be2aa..361c11b 100644
--- a/src/internal/poll/sock_cloexec.go
+++ b/src/internal/poll/sock_cloexec.go
@@ -15,8 +15,35 @@
 // descriptor as nonblocking and close-on-exec.
 func accept(s int) (int, syscall.Sockaddr, string, error) {
 	ns, sa, err := Accept4Func(s, syscall.SOCK_NONBLOCK|syscall.SOCK_CLOEXEC)
-	if err != nil {
+	// TODO: We can remove the fallback on Linux and *BSD,
+	// as currently supported versions all support accept4
+	// with SOCK_CLOEXEC, but Solaris does not. See issue #59359.
+	switch err {
+	case nil:
+		return ns, sa, "", nil
+	default: // errors other than the ones listed
 		return -1, sa, "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, "accept", err
+	}
+	if err = syscall.SetNonblock(ns, true); err != nil {
+		CloseFunc(ns)
+		return -1, nil, "setnonblock", err
 	}
 	return ns, sa, "", nil
 }
diff --git a/src/internal/poll/sockopt.go b/src/internal/poll/sockopt.go
index a7c9d11..a87a9e6 100644
--- a/src/internal/poll/sockopt.go
+++ b/src/internal/poll/sockopt.go
@@ -34,3 +34,12 @@
 	defer fd.decref()
 	return syscall.SetsockoptLinger(fd.Sysfd, level, name, l)
 }
+
+// GetsockoptInt wraps the getsockopt network call with an int argument.
+func (fd *FD) GetsockoptInt(level, name int) (int, error) {
+	if err := fd.incref(); err != nil {
+		return -1, err
+	}
+	defer fd.decref()
+	return syscall.GetsockoptInt(fd.Sysfd, level, name)
+}
diff --git a/src/internal/poll/splice_linux.go b/src/internal/poll/splice_linux.go
index 96cbe4a..9505c5d 100644
--- a/src/internal/poll/splice_linux.go
+++ b/src/internal/poll/splice_linux.go
@@ -5,6 +5,7 @@
 package poll
 
 import (
+	"internal/syscall/unix"
 	"runtime"
 	"sync"
 	"syscall"
@@ -12,9 +13,6 @@
 )
 
 const (
-	// spliceNonblock makes calls to splice(2) non-blocking.
-	spliceNonblock = 0x2
-
 	// maxSpliceSize is the maximum amount of data Splice asks
 	// the kernel to move in a single call to splice(2).
 	// We use 1MB as Splice writes data through a pipe, and 1MB is the default maximum pipe buffer size,
@@ -91,15 +89,17 @@
 		return 0, err
 	}
 	for {
-		n, err := splice(pipefd, sock.Sysfd, max, spliceNonblock)
+		n, err := splice(pipefd, sock.Sysfd, max, 0)
 		if err == syscall.EINTR {
 			continue
 		}
 		if err != syscall.EAGAIN {
 			return n, err
 		}
-		if err := sock.pd.waitRead(sock.isFile); err != nil {
-			return n, err
+		if sock.pd.pollable() {
+			if err := sock.pd.waitRead(sock.isFile); err != nil {
+				return n, err
+			}
 		}
 	}
 }
@@ -127,7 +127,7 @@
 	}
 	written := 0
 	for inPipe > 0 {
-		n, err := splice(sock.Sysfd, pipefd, inPipe, spliceNonblock)
+		n, err := splice(sock.Sysfd, pipefd, inPipe, 0)
 		// Here, the condition n == 0 && err == nil should never be
 		// observed, since Splice controls the write side of the pipe.
 		if n > 0 {
@@ -138,8 +138,10 @@
 		if err != syscall.EAGAIN {
 			return written, err
 		}
-		if err := sock.pd.waitWrite(sock.isFile); err != nil {
-			return written, err
+		if sock.pd.pollable() {
+			if err := sock.pd.waitWrite(sock.isFile); err != nil {
+				return written, err
+			}
 		}
 	}
 	return written, nil
@@ -219,7 +221,7 @@
 	// Set the pipe buffer size to maxSpliceSize to optimize that.
 	// Ignore errors here, as a smaller buffer size will work,
 	// although it will require more system calls.
-	fcntl(fds[0], syscall.F_SETPIPE_SZ, maxSpliceSize)
+	unix.Fcntl(fds[0], syscall.F_SETPIPE_SZ, maxSpliceSize)
 
 	return &splicePipe{splicePipeFields: splicePipeFields{rfd: fds[0], wfd: fds[1]}}
 }
diff --git a/src/internal/poll/sys_cloexec.go b/src/internal/poll/sys_cloexec.go
index 7cd8001..2c5da7d 100644
--- a/src/internal/poll/sys_cloexec.go
+++ b/src/internal/poll/sys_cloexec.go
@@ -5,7 +5,7 @@
 // This file implements accept for platforms that do not provide a fast path for
 // setting SetNonblock and CloseOnExec.
 
-//go:build aix || darwin || (js && wasm)
+//go:build aix || darwin || (js && wasm) || wasip1
 
 package poll
 
diff --git a/src/internal/profile/legacy_profile.go b/src/internal/profile/legacy_profile.go
index b102c95..373a6c0 100644
--- a/src/internal/profile/legacy_profile.go
+++ b/src/internal/profile/legacy_profile.go
@@ -11,34 +11,34 @@
 	"bufio"
 	"bytes"
 	"fmt"
+	"internal/lazyregexp"
 	"io"
 	"math"
-	"regexp"
 	"strconv"
 	"strings"
 )
 
 var (
-	countStartRE = regexp.MustCompile(`\A(\w+) profile: total \d+\n\z`)
-	countRE      = regexp.MustCompile(`\A(\d+) @(( 0x[0-9a-f]+)+)\n\z`)
+	countStartRE = lazyregexp.New(`\A(\w+) profile: total \d+\n\z`)
+	countRE      = lazyregexp.New(`\A(\d+) @(( 0x[0-9a-f]+)+)\n\z`)
 
-	heapHeaderRE = regexp.MustCompile(`heap profile: *(\d+): *(\d+) *\[ *(\d+): *(\d+) *\] *@ *(heap[_a-z0-9]*)/?(\d*)`)
-	heapSampleRE = regexp.MustCompile(`(-?\d+): *(-?\d+) *\[ *(\d+): *(\d+) *] @([ x0-9a-f]*)`)
+	heapHeaderRE = lazyregexp.New(`heap profile: *(\d+): *(\d+) *\[ *(\d+): *(\d+) *\] *@ *(heap[_a-z0-9]*)/?(\d*)`)
+	heapSampleRE = lazyregexp.New(`(-?\d+): *(-?\d+) *\[ *(\d+): *(\d+) *] @([ x0-9a-f]*)`)
 
-	contentionSampleRE = regexp.MustCompile(`(\d+) *(\d+) @([ x0-9a-f]*)`)
+	contentionSampleRE = lazyregexp.New(`(\d+) *(\d+) @([ x0-9a-f]*)`)
 
-	hexNumberRE = regexp.MustCompile(`0x[0-9a-f]+`)
+	hexNumberRE = lazyregexp.New(`0x[0-9a-f]+`)
 
-	growthHeaderRE = regexp.MustCompile(`heap profile: *(\d+): *(\d+) *\[ *(\d+): *(\d+) *\] @ growthz`)
+	growthHeaderRE = lazyregexp.New(`heap profile: *(\d+): *(\d+) *\[ *(\d+): *(\d+) *\] @ growthz`)
 
-	fragmentationHeaderRE = regexp.MustCompile(`heap profile: *(\d+): *(\d+) *\[ *(\d+): *(\d+) *\] @ fragmentationz`)
+	fragmentationHeaderRE = lazyregexp.New(`heap profile: *(\d+): *(\d+) *\[ *(\d+): *(\d+) *\] @ fragmentationz`)
 
-	threadzStartRE = regexp.MustCompile(`--- threadz \d+ ---`)
-	threadStartRE  = regexp.MustCompile(`--- Thread ([[:xdigit:]]+) \(name: (.*)/(\d+)\) stack: ---`)
+	threadzStartRE = lazyregexp.New(`--- threadz \d+ ---`)
+	threadStartRE  = lazyregexp.New(`--- Thread ([[:xdigit:]]+) \(name: (.*)/(\d+)\) stack: ---`)
 
-	procMapsRE = regexp.MustCompile(`([[:xdigit:]]+)-([[:xdigit:]]+)\s+([-rwxp]+)\s+([[:xdigit:]]+)\s+([[:xdigit:]]+):([[:xdigit:]]+)\s+([[:digit:]]+)\s*(\S+)?`)
+	procMapsRE = lazyregexp.New(`([[:xdigit:]]+)-([[:xdigit:]]+)\s+([-rwxp]+)\s+([[:xdigit:]]+)\s+([[:xdigit:]]+):([[:xdigit:]]+)\s+([[:digit:]]+)\s*(\S+)?`)
 
-	briefMapsRE = regexp.MustCompile(`\s*([[:xdigit:]]+)-([[:xdigit:]]+):\s*(\S+)(\s.*@)?([[:xdigit:]]+)?`)
+	briefMapsRE = lazyregexp.New(`\s*([[:xdigit:]]+)-([[:xdigit:]]+):\s*(\S+)(\s.*@)?([[:xdigit:]]+)?`)
 
 	// LegacyHeapAllocated instructs the heapz parsers to use the
 	// allocated memory stats instead of the default in-use memory. Note
diff --git a/src/internal/profile/profile.go b/src/internal/profile/profile.go
index 29568aa..c779bb2 100644
--- a/src/internal/profile/profile.go
+++ b/src/internal/profile/profile.go
@@ -11,8 +11,8 @@
 	"bytes"
 	"compress/gzip"
 	"fmt"
+	"internal/lazyregexp"
 	"io"
-	"regexp"
 	"strings"
 	"time"
 )
@@ -192,7 +192,7 @@
 	return p, nil
 }
 
-var libRx = regexp.MustCompile(`([.]so$|[.]so[._][0-9]+)`)
+var libRx = lazyregexp.New(`([.]so$|[.]so[._][0-9]+)`)
 
 // setMain scans Mapping entries and guesses which entry is main
 // because legacy profiles don't obey the convention of putting main
diff --git a/src/internal/reflectlite/all_test.go b/src/internal/reflectlite/all_test.go
index bb3cad4..820b4ae 100644
--- a/src/internal/reflectlite/all_test.go
+++ b/src/internal/reflectlite/all_test.go
@@ -7,6 +7,7 @@
 import (
 	"encoding/base64"
 	"fmt"
+	"internal/abi"
 	. "internal/reflectlite"
 	"math"
 	"reflect"
@@ -240,37 +241,37 @@
 	for i, tt := range valueTests {
 		v := ValueOf(tt.i).Elem()
 		switch v.Kind() {
-		case Int:
+		case abi.Int:
 			v.Set(ValueOf(int(132)))
-		case Int8:
+		case abi.Int8:
 			v.Set(ValueOf(int8(8)))
-		case Int16:
+		case abi.Int16:
 			v.Set(ValueOf(int16(16)))
-		case Int32:
+		case abi.Int32:
 			v.Set(ValueOf(int32(32)))
-		case Int64:
+		case abi.Int64:
 			v.Set(ValueOf(int64(64)))
-		case Uint:
+		case abi.Uint:
 			v.Set(ValueOf(uint(132)))
-		case Uint8:
+		case abi.Uint8:
 			v.Set(ValueOf(uint8(8)))
-		case Uint16:
+		case abi.Uint16:
 			v.Set(ValueOf(uint16(16)))
-		case Uint32:
+		case abi.Uint32:
 			v.Set(ValueOf(uint32(32)))
-		case Uint64:
+		case abi.Uint64:
 			v.Set(ValueOf(uint64(64)))
-		case Float32:
+		case abi.Float32:
 			v.Set(ValueOf(float32(256.25)))
-		case Float64:
+		case abi.Float64:
 			v.Set(ValueOf(512.125))
-		case Complex64:
+		case abi.Complex64:
 			v.Set(ValueOf(complex64(532.125 + 10i)))
-		case Complex128:
+		case abi.Complex128:
 			v.Set(ValueOf(complex128(564.25 + 1i)))
-		case String:
+		case abi.String:
 			v.Set(ValueOf("stringy cheese"))
-		case Bool:
+		case abi.Bool:
 			v.Set(ValueOf(true))
 		}
 		s := valueToString(v)
@@ -946,7 +947,7 @@
 		t.Errorf("field: IsValid=%v, Kind=%v, want true, Interface", v.IsValid(), v.Kind())
 	}
 	v = v.Elem()
-	if v.IsValid() != false || v.Kind() != Invalid {
+	if v.IsValid() != false || v.Kind() != abi.Invalid {
 		t.Errorf("field elem: IsValid=%v, Kind=%v, want false, Invalid", v.IsValid(), v.Kind())
 	}
 }
diff --git a/src/internal/reflectlite/export_test.go b/src/internal/reflectlite/export_test.go
index e9a928b..88be6e2 100644
--- a/src/internal/reflectlite/export_test.go
+++ b/src/internal/reflectlite/export_test.go
@@ -15,17 +15,17 @@
 		panic(&ValueError{"reflect.Value.Field", v.kind()})
 	}
 	tt := (*structType)(unsafe.Pointer(v.typ))
-	if uint(i) >= uint(len(tt.fields)) {
+	if uint(i) >= uint(len(tt.Fields)) {
 		panic("reflect: Field index out of range")
 	}
-	field := &tt.fields[i]
-	typ := field.typ
+	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.name.isExported() {
-		if field.embedded() {
+	if !field.Name.IsExported() {
+		if field.Embedded() {
 			fl |= flagEmbedRO
 		} else {
 			fl |= flagStickyRO
@@ -36,27 +36,27 @@
 	// 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 the correct address.
-	ptr := add(v.ptr, field.offset, "same as non-reflect &v.field")
+	ptr := add(v.ptr, field.Offset, "same as non-reflect &v.field")
 	return Value{typ, ptr, fl}
 }
 
 func TField(typ Type, i int) Type {
-	t := typ.(*rtype)
+	t := typ.(rtype)
 	if t.Kind() != Struct {
 		panic("reflect: Field of non-struct type")
 	}
-	tt := (*structType)(unsafe.Pointer(t))
+	tt := (*structType)(unsafe.Pointer(t.Type))
 
 	return StructFieldType(tt, i)
 }
 
 // Field returns the i'th struct field.
 func StructFieldType(t *structType, i int) Type {
-	if i < 0 || i >= len(t.fields) {
+	if i < 0 || i >= len(t.Fields) {
 		panic("reflect: Field index out of bounds")
 	}
-	p := &t.fields[i]
-	return toType(p.typ)
+	p := &t.Fields[i]
+	return toType(p.Typ)
 }
 
 // Zero returns a Value representing the zero value for the specified type.
@@ -68,7 +68,7 @@
 	if typ == nil {
 		panic("reflect: Zero(nil)")
 	}
-	t := typ.(*rtype)
+	t := typ.common()
 	fl := flag(t.Kind())
 	if ifaceIndir(t) {
 		return Value{t, unsafe_New(t), fl | flagIndir}
@@ -104,12 +104,12 @@
 	if ut == nil {
 		panic("type has no methods")
 	}
-	m := ut.methods()[0]
-	mname := t.(*rtype).nameOff(m.name)
-	if *mname.data(0, "name flag field")&(1<<2) == 0 {
+	m := ut.Methods()[0]
+	mname := t.(rtype).nameOff(m.Name)
+	if *mname.DataChecked(0, "name flag field")&(1<<2) == 0 {
 		panic("method name does not have pkgPath *string")
 	}
-	return mname.bytes
+	return mname.Bytes
 }
 
 type Buffer struct {
diff --git a/src/internal/reflectlite/reflect_mirror_test.go b/src/internal/reflectlite/reflect_mirror_test.go
index 9b28b13..0fd004e 100644
--- a/src/internal/reflectlite/reflect_mirror_test.go
+++ b/src/internal/reflectlite/reflect_mirror_test.go
@@ -19,7 +19,6 @@
 )
 
 var typeNames = []string{
-	"rtype",
 	"uncommonType",
 	"arrayType",
 	"chanType",
@@ -88,6 +87,8 @@
 }
 
 func TestMirrorWithReflect(t *testing.T) {
+	// TODO when the dust clears, figure out what this should actually test.
+	t.Skipf("reflect and reflectlite are out of sync for now")
 	reflectDir := filepath.Join(runtime.GOROOT(), "src", "reflect")
 	if _, err := os.Stat(reflectDir); os.IsNotExist(err) {
 		// On some mobile builders, the test binary executes on a machine without a
@@ -115,7 +116,7 @@
 	wg.Wait()
 
 	if len(rl.m) != len(r.m) {
-		t.Fatalf("number of types mismatch, reflect: %d, reflectlite: %d", len(r.m), len(rl.m))
+		t.Fatalf("number of types mismatch, reflect: %d, reflectlite: %d (%+v, %+v)", len(r.m), len(rl.m), r.m, rl.m)
 	}
 
 	for typName := range r.m {
diff --git a/src/internal/reflectlite/swapper.go b/src/internal/reflectlite/swapper.go
index fc402bb..ac17d9b 100644
--- a/src/internal/reflectlite/swapper.go
+++ b/src/internal/reflectlite/swapper.go
@@ -31,9 +31,9 @@
 		}
 	}
 
-	typ := v.Type().Elem().(*rtype)
+	typ := v.Type().Elem().common()
 	size := typ.Size()
-	hasPtr := typ.ptrdata != 0
+	hasPtr := typ.PtrBytes != 0
 
 	// Some common & small cases, without using memmove:
 	if hasPtr {
diff --git a/src/internal/reflectlite/type.go b/src/internal/reflectlite/type.go
index 43440b1..f13ce8f 100644
--- a/src/internal/reflectlite/type.go
+++ b/src/internal/reflectlite/type.go
@@ -3,10 +3,13 @@
 // license that can be found in the LICENSE file.
 
 // Package reflectlite implements lightweight version of reflect, not using
-// any package except for "runtime" and "unsafe".
+// any package except for "runtime", "unsafe", and "internal/abi"
 package reflectlite
 
-import "unsafe"
+import (
+	"internal/abi"
+	"unsafe"
+)
 
 // Type is the representation of a Go type.
 //
@@ -60,7 +63,7 @@
 	// It panics if the type's Kind is not Ptr.
 	Elem() Type
 
-	common() *rtype
+	common() *abi.Type
 	uncommon() *uncommonType
 }
 
@@ -72,215 +75,64 @@
 
 // A Kind represents the specific kind of type that a Type represents.
 // The zero Kind is not a valid kind.
-type Kind uint
+type Kind = abi.Kind
+
+const Ptr = abi.Pointer
 
 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
-	Pointer
-	Slice
-	String
-	Struct
-	UnsafePointer
+	// Import-and-export these constants as necessary
+	Interface = abi.Interface
+	Slice     = abi.Slice
+	String    = abi.String
+	Struct    = abi.Struct
 )
 
-const Ptr = Pointer
+type nameOff = abi.NameOff
+type typeOff = abi.TypeOff
+type textOff = abi.TextOff
 
-// tflag is used by an rtype to signal what extra type information is
-// available in the memory directly following the rtype value.
-//
-// tflag values must be kept in sync with copies in:
-//
-//	cmd/compile/internal/reflectdata/reflect.go
-//	cmd/link/internal/ld/decodesym.go
-//	runtime/type.go
-type tflag uint8
-
-const (
-	// tflagUncommon means that there is a pointer, *uncommonType,
-	// just beyond the outer type structure.
-	//
-	// For example, if t.Kind() == Struct and t.tflag&tflagUncommon != 0,
-	// then t has uncommonType data and it can be accessed as:
-	//
-	//	type tUncommon struct {
-	//		structType
-	//		u uncommonType
-	//	}
-	//	u := &(*tUncommon)(unsafe.Pointer(t)).u
-	tflagUncommon tflag = 1 << 0
-
-	// tflagExtraStar means the name in the str field has an
-	// extraneous '*' prefix. This is because for most types T in
-	// a program, the type *T also exists and reusing the str data
-	// saves binary size.
-	tflagExtraStar tflag = 1 << 1
-
-	// tflagNamed means the type has a name.
-	tflagNamed tflag = 1 << 2
-
-	// tflagRegularMemory means that equal and hash functions can treat
-	// this type as a single region of t.size bytes.
-	tflagRegularMemory tflag = 1 << 3
-)
-
-// rtype is the common implementation of most values.
-// It is embedded in other struct types.
-//
-// rtype must be kept in sync with ../runtime/type.go:/^type._type.
 type rtype struct {
-	size       uintptr
-	ptrdata    uintptr // number of bytes in the type that can contain pointers
-	hash       uint32  // hash of type; avoids computation in hash tables
-	tflag      tflag   // extra type information flags
-	align      uint8   // alignment of variable with this type
-	fieldAlign uint8   // alignment of struct field with this type
-	kind       uint8   // enumeration for C
-	// function for comparing objects of this type
-	// (ptr to object A, ptr to object B) -> ==?
-	equal     func(unsafe.Pointer, unsafe.Pointer) bool
-	gcdata    *byte   // garbage collection data
-	str       nameOff // string form
-	ptrToThis typeOff // type for pointer to this type, may be zero
-}
-
-// Method on non-interface type
-type method struct {
-	name nameOff // name of method
-	mtyp typeOff // method type (without receiver)
-	ifn  textOff // fn used in interface call (one-word receiver)
-	tfn  textOff // fn used for normal method call
+	*abi.Type
 }
 
 // uncommonType is present only for defined types or types with methods
 // (if T is a defined type, the uncommonTypes for T and *T have methods).
 // Using a pointer to this struct reduces the overall size required
 // to describe a non-defined type with no methods.
-type uncommonType struct {
-	pkgPath nameOff // import path; empty for built-in types like int, string
-	mcount  uint16  // number of methods
-	xcount  uint16  // number of exported methods
-	moff    uint32  // offset from this uncommontype to [mcount]method
-	_       uint32  // unused
-}
-
-// chanDir represents a channel type's direction.
-type chanDir int
-
-const (
-	recvDir chanDir             = 1 << iota // <-chan
-	sendDir                                 // chan<-
-	bothDir = recvDir | sendDir             // chan
-)
+type uncommonType = abi.UncommonType
 
 // arrayType represents a fixed array type.
-type arrayType struct {
-	rtype
-	elem  *rtype // array element type
-	slice *rtype // slice type
-	len   uintptr
-}
+type arrayType = abi.ArrayType
 
 // chanType represents a channel type.
-type chanType struct {
-	rtype
-	elem *rtype  // channel element type
-	dir  uintptr // channel direction (chanDir)
-}
+type chanType = abi.ChanType
 
-// funcType represents a function type.
-//
-// A *rtype for each in and out parameter is stored in an array that
-// directly follows the funcType (and possibly its uncommonType). So
-// a function type with one method, one input, and one output is:
-//
-//	struct {
-//		funcType
-//		uncommonType
-//		[2]*rtype    // [0] is in, [1] is out
-//	}
-type funcType struct {
-	rtype
-	inCount  uint16
-	outCount uint16 // top bit is set if last input parameter is ...
-}
+type funcType = abi.FuncType
 
-// imethod represents a method on an interface type
-type imethod struct {
-	name nameOff // name of method
-	typ  typeOff // .(*FuncType) underneath
-}
-
-// interfaceType represents an interface type.
-type interfaceType struct {
-	rtype
-	pkgPath name      // import path
-	methods []imethod // sorted by hash
-}
+type interfaceType = abi.InterfaceType
 
 // mapType represents a map type.
 type mapType struct {
 	rtype
-	key    *rtype // map key type
-	elem   *rtype // map element (value) type
-	bucket *rtype // internal bucket structure
+	Key    *abi.Type // map key type
+	Elem   *abi.Type // map element (value) type
+	Bucket *abi.Type // internal bucket structure
 	// function for hashing keys (ptr to key, seed) -> hash
-	hasher     func(unsafe.Pointer, uintptr) uintptr
-	keysize    uint8  // size of key slot
-	valuesize  uint8  // size of value slot
-	bucketsize uint16 // size of bucket
-	flags      uint32
+	Hasher     func(unsafe.Pointer, uintptr) uintptr
+	KeySize    uint8  // size of key slot
+	ValueSize  uint8  // size of value slot
+	BucketSize uint16 // size of bucket
+	Flags      uint32
 }
 
 // ptrType represents a pointer type.
-type ptrType struct {
-	rtype
-	elem *rtype // pointer element (pointed at) type
-}
+type ptrType = abi.PtrType
 
 // sliceType represents a slice type.
-type sliceType struct {
-	rtype
-	elem *rtype // slice element type
-}
-
-// Struct field
-type structField struct {
-	name   name    // name is always non-empty
-	typ    *rtype  // type of field
-	offset uintptr // byte offset of field
-}
-
-func (f *structField) embedded() bool {
-	return f.name.embedded()
-}
+type sliceType = abi.SliceType
 
 // structType represents a struct type.
-type structType struct {
-	rtype
-	pkgPath name
-	fields  []structField // sorted by offset
-}
+type structType = abi.StructType
 
 // name is an encoded type name with optional extra data.
 //
@@ -355,21 +207,21 @@
 	return unsafe.String(n.data(1+i+l+i2, "non-empty string"), l2)
 }
 
-func (n name) pkgPath() string {
-	if n.bytes == nil || *n.data(0, "name flag field")&(1<<2) == 0 {
+func pkgPath(n abi.Name) string {
+	if n.Bytes == nil || *n.DataChecked(0, "name flag field")&(1<<2) == 0 {
 		return ""
 	}
-	i, l := n.readVarint(1)
+	i, l := n.ReadVarint(1)
 	off := 1 + i + l
-	if n.hasTag() {
-		i2, l2 := n.readVarint(off)
+	if n.HasTag() {
+		i2, l2 := n.ReadVarint(off)
 		off += i2 + l2
 	}
 	var nameOff int32
 	// Note that this field may not be aligned in memory,
 	// so we cannot use a direct int32 assignment here.
-	copy((*[4]byte)(unsafe.Pointer(&nameOff))[:], (*[4]byte)(unsafe.Pointer(n.data(off, "name offset field")))[:])
-	pkgPathName := name{(*byte)(resolveTypeOff(unsafe.Pointer(n.bytes), nameOff))}
+	copy((*[4]byte)(unsafe.Pointer(&nameOff))[:], (*[4]byte)(unsafe.Pointer(n.DataChecked(off, "name offset field")))[:])
+	pkgPathName := name{(*byte)(resolveTypeOff(unsafe.Pointer(n.Bytes), nameOff))}
 	return pkgPathName.name()
 }
 
@@ -378,64 +230,6 @@
  * The compiler does not know about the data structures and methods below.
  */
 
-const (
-	kindDirectIface = 1 << 5
-	kindGCProg      = 1 << 6 // Type.gc points to GC program
-	kindMask        = (1 << 5) - 1
-)
-
-// String returns the name of k.
-func (k Kind) String() string {
-	if int(k) < len(kindNames) {
-		return kindNames[k]
-	}
-	return kindNames[0]
-}
-
-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) methods() []method {
-	if t.mcount == 0 {
-		return nil
-	}
-	return (*[1 << 16]method)(add(unsafe.Pointer(t), uintptr(t.moff), "t.mcount > 0"))[:t.mcount:t.mcount]
-}
-
-func (t *uncommonType) exportedMethods() []method {
-	if t.xcount == 0 {
-		return nil
-	}
-	return (*[1 << 16]method)(add(unsafe.Pointer(t), uintptr(t.moff), "t.xcount > 0"))[:t.xcount:t.xcount]
-}
-
 // resolveNameOff resolves a name offset from a base pointer.
 // The (*rtype).nameOff method is a convenience wrapper for this function.
 // Implemented in the runtime package.
@@ -446,125 +240,57 @@
 // Implemented in the runtime package.
 func resolveTypeOff(rtype unsafe.Pointer, off int32) unsafe.Pointer
 
-type nameOff int32 // offset to a name
-type typeOff int32 // offset to an *rtype
-type textOff int32 // offset from top of text section
-
-func (t *rtype) nameOff(off nameOff) name {
-	return name{(*byte)(resolveNameOff(unsafe.Pointer(t), int32(off)))}
+func (t rtype) nameOff(off nameOff) abi.Name {
+	return abi.Name{Bytes: (*byte)(resolveNameOff(unsafe.Pointer(t.Type), int32(off)))}
 }
 
-func (t *rtype) typeOff(off typeOff) *rtype {
-	return (*rtype)(resolveTypeOff(unsafe.Pointer(t), int32(off)))
+func (t rtype) typeOff(off typeOff) *abi.Type {
+	return (*abi.Type)(resolveTypeOff(unsafe.Pointer(t.Type), int32(off)))
 }
 
-func (t *rtype) uncommon() *uncommonType {
-	if t.tflag&tflagUncommon == 0 {
-		return nil
-	}
-	switch t.Kind() {
-	case Struct:
-		return &(*structTypeUncommon)(unsafe.Pointer(t)).u
-	case Ptr:
-		type u struct {
-			ptrType
-			u uncommonType
-		}
-		return &(*u)(unsafe.Pointer(t)).u
-	case Func:
-		type u struct {
-			funcType
-			u uncommonType
-		}
-		return &(*u)(unsafe.Pointer(t)).u
-	case Slice:
-		type u struct {
-			sliceType
-			u uncommonType
-		}
-		return &(*u)(unsafe.Pointer(t)).u
-	case Array:
-		type u struct {
-			arrayType
-			u uncommonType
-		}
-		return &(*u)(unsafe.Pointer(t)).u
-	case Chan:
-		type u struct {
-			chanType
-			u uncommonType
-		}
-		return &(*u)(unsafe.Pointer(t)).u
-	case Map:
-		type u struct {
-			mapType
-			u uncommonType
-		}
-		return &(*u)(unsafe.Pointer(t)).u
-	case Interface:
-		type u struct {
-			interfaceType
-			u uncommonType
-		}
-		return &(*u)(unsafe.Pointer(t)).u
-	default:
-		type u struct {
-			rtype
-			u uncommonType
-		}
-		return &(*u)(unsafe.Pointer(t)).u
-	}
+func (t rtype) uncommon() *uncommonType {
+	return t.Uncommon()
 }
 
-func (t *rtype) String() string {
-	s := t.nameOff(t.str).name()
-	if t.tflag&tflagExtraStar != 0 {
+func (t rtype) String() string {
+	s := t.nameOff(t.Str).Name()
+	if t.TFlag&abi.TFlagExtraStar != 0 {
 		return s[1:]
 	}
 	return s
 }
 
-func (t *rtype) Size() uintptr { return t.size }
+func (t rtype) common() *abi.Type { return t.Type }
 
-func (t *rtype) Kind() Kind { return Kind(t.kind & kindMask) }
-
-func (t *rtype) pointers() bool { return t.ptrdata != 0 }
-
-func (t *rtype) common() *rtype { return t }
-
-func (t *rtype) exportedMethods() []method {
+func (t rtype) exportedMethods() []abi.Method {
 	ut := t.uncommon()
 	if ut == nil {
 		return nil
 	}
-	return ut.exportedMethods()
+	return ut.ExportedMethods()
 }
 
-func (t *rtype) NumMethod() int {
-	if t.Kind() == Interface {
-		tt := (*interfaceType)(unsafe.Pointer(t))
+func (t rtype) NumMethod() int {
+	tt := t.Type.InterfaceType()
+	if tt != nil {
 		return tt.NumMethod()
 	}
 	return len(t.exportedMethods())
 }
 
-func (t *rtype) PkgPath() string {
-	if t.tflag&tflagNamed == 0 {
+func (t rtype) PkgPath() string {
+	if t.TFlag&abi.TFlagNamed == 0 {
 		return ""
 	}
 	ut := t.uncommon()
 	if ut == nil {
 		return ""
 	}
-	return t.nameOff(ut.pkgPath).name()
+	return t.nameOff(ut.PkgPath).Name()
 }
 
-func (t *rtype) hasName() bool {
-	return t.tflag&tflagNamed != 0
-}
-
-func (t *rtype) Name() string {
-	if !t.hasName() {
+func (t rtype) Name() string {
+	if !t.HasName() {
 		return ""
 	}
 	s := t.String()
@@ -582,112 +308,76 @@
 	return s[i+1:]
 }
 
-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 toRType(t *abi.Type) rtype {
+	return rtype{t}
 }
 
-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)
+func elem(t *abi.Type) *abi.Type {
+	et := t.Elem()
+	if et != nil {
+		return et
 	}
-	panic("reflect: Elem of invalid type")
+	panic("reflect: Elem of invalid type " + toRType(t).String())
 }
 
-func (t *rtype) In(i int) Type {
-	if t.Kind() != Func {
+func (t rtype) Elem() Type {
+	return toType(elem(t.common()))
+}
+
+func (t rtype) In(i int) Type {
+	tt := t.Type.FuncType()
+	if tt == nil {
 		panic("reflect: In of non-func type")
 	}
-	tt := (*funcType)(unsafe.Pointer(t))
-	return toType(tt.in()[i])
+	return toType(tt.InSlice()[i])
 }
 
-func (t *rtype) Key() Type {
-	if t.Kind() != Map {
+func (t rtype) Key() Type {
+	tt := t.Type.MapType()
+	if tt == nil {
 		panic("reflect: Key of non-map type")
 	}
-	tt := (*mapType)(unsafe.Pointer(t))
-	return toType(tt.key)
+	return toType(tt.Key)
 }
 
-func (t *rtype) Len() int {
-	if t.Kind() != Array {
+func (t rtype) Len() int {
+	tt := t.Type.ArrayType()
+	if tt == nil {
 		panic("reflect: Len of non-array type")
 	}
-	tt := (*arrayType)(unsafe.Pointer(t))
-	return int(tt.len)
+	return int(tt.Len)
 }
 
-func (t *rtype) NumField() int {
-	if t.Kind() != Struct {
+func (t rtype) NumField() int {
+	tt := t.Type.StructType()
+	if tt == nil {
 		panic("reflect: NumField of non-struct type")
 	}
-	tt := (*structType)(unsafe.Pointer(t))
-	return len(tt.fields)
+	return len(tt.Fields)
 }
 
-func (t *rtype) NumIn() int {
-	if t.Kind() != Func {
+func (t rtype) NumIn() int {
+	tt := t.Type.FuncType()
+	if tt == nil {
 		panic("reflect: NumIn of non-func type")
 	}
-	tt := (*funcType)(unsafe.Pointer(t))
-	return int(tt.inCount)
+	return int(tt.InCount)
 }
 
-func (t *rtype) NumOut() int {
-	if t.Kind() != Func {
+func (t rtype) NumOut() int {
+	tt := t.Type.FuncType()
+	if tt == nil {
 		panic("reflect: NumOut of non-func type")
 	}
-	tt := (*funcType)(unsafe.Pointer(t))
-	return len(tt.out())
+	return tt.NumOut()
 }
 
-func (t *rtype) Out(i int) Type {
-	if t.Kind() != Func {
+func (t rtype) Out(i int) Type {
+	tt := t.Type.FuncType()
+	if tt == nil {
 		panic("reflect: Out of non-func type")
 	}
-	tt := (*funcType)(unsafe.Pointer(t))
-	return toType(tt.out()[i])
-}
-
-func (t *funcType) in() []*rtype {
-	uadd := unsafe.Sizeof(*t)
-	if t.tflag&tflagUncommon != 0 {
-		uadd += unsafe.Sizeof(uncommonType{})
-	}
-	if t.inCount == 0 {
-		return nil
-	}
-	return (*[1 << 20]*rtype)(add(unsafe.Pointer(t), uadd, "t.inCount > 0"))[:t.inCount:t.inCount]
-}
-
-func (t *funcType) out() []*rtype {
-	uadd := unsafe.Sizeof(*t)
-	if t.tflag&tflagUncommon != 0 {
-		uadd += unsafe.Sizeof(uncommonType{})
-	}
-	outCount := t.outCount & (1<<15 - 1)
-	if outCount == 0 {
-		return nil
-	}
-	return (*[1 << 20]*rtype)(add(unsafe.Pointer(t), uadd, "outCount > 0"))[t.inCount : t.inCount+outCount : t.inCount+outCount]
+	return toType(tt.OutSlice()[i])
 }
 
 // add returns p+x.
@@ -701,9 +391,6 @@
 	return unsafe.Pointer(uintptr(p) + x)
 }
 
-// NumMethod returns the number of interface methods in the type's method set.
-func (t *interfaceType) NumMethod() int { return len(t.methods) }
-
 // 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 any) Type {
@@ -711,37 +398,40 @@
 	return toType(eface.typ)
 }
 
-func (t *rtype) Implements(u Type) bool {
+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)
+	return implements(u.common(), t.common())
 }
 
-func (t *rtype) AssignableTo(u Type) bool {
+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)
+	uu := u.common()
+	tt := t.common()
+	return directlyAssignable(uu, tt) || implements(uu, tt)
 }
 
-func (t *rtype) Comparable() bool {
-	return t.equal != nil
+func (t rtype) Comparable() bool {
+	return t.Equal != nil
 }
 
 // implements reports whether the type V implements the interface type T.
-func implements(T, V *rtype) bool {
-	if T.Kind() != Interface {
+func implements(T, V *abi.Type) bool {
+	t := T.InterfaceType()
+	if t == nil {
 		return false
 	}
-	t := (*interfaceType)(unsafe.Pointer(T))
-	if len(t.methods) == 0 {
+	if len(t.Methods) == 0 {
 		return true
 	}
+	rT := toRType(T)
+	rV := toRType(V)
 
 	// The same algorithm applies in both cases, but the
 	// method tables for an interface type and a concrete type
@@ -758,26 +448,26 @@
 	if V.Kind() == Interface {
 		v := (*interfaceType)(unsafe.Pointer(V))
 		i := 0
-		for j := 0; j < len(v.methods); j++ {
-			tm := &t.methods[i]
-			tmName := t.nameOff(tm.name)
-			vm := &v.methods[j]
-			vmName := V.nameOff(vm.name)
-			if vmName.name() == tmName.name() && V.typeOff(vm.typ) == t.typeOff(tm.typ) {
-				if !tmName.isExported() {
-					tmPkgPath := tmName.pkgPath()
+		for j := 0; j < len(v.Methods); j++ {
+			tm := &t.Methods[i]
+			tmName := rT.nameOff(tm.Name)
+			vm := &v.Methods[j]
+			vmName := rV.nameOff(vm.Name)
+			if vmName.Name() == tmName.Name() && rV.typeOff(vm.Typ) == rT.typeOff(tm.Typ) {
+				if !tmName.IsExported() {
+					tmPkgPath := pkgPath(tmName)
 					if tmPkgPath == "" {
-						tmPkgPath = t.pkgPath.name()
+						tmPkgPath = t.PkgPath.Name()
 					}
-					vmPkgPath := vmName.pkgPath()
+					vmPkgPath := pkgPath(vmName)
 					if vmPkgPath == "" {
-						vmPkgPath = v.pkgPath.name()
+						vmPkgPath = v.PkgPath.Name()
 					}
 					if tmPkgPath != vmPkgPath {
 						continue
 					}
 				}
-				if i++; i >= len(t.methods) {
+				if i++; i >= len(t.Methods) {
 					return true
 				}
 			}
@@ -785,32 +475,32 @@
 		return false
 	}
 
-	v := V.uncommon()
+	v := V.Uncommon()
 	if v == nil {
 		return false
 	}
 	i := 0
-	vmethods := v.methods()
-	for j := 0; j < int(v.mcount); j++ {
-		tm := &t.methods[i]
-		tmName := t.nameOff(tm.name)
+	vmethods := v.Methods()
+	for j := 0; j < int(v.Mcount); j++ {
+		tm := &t.Methods[i]
+		tmName := rT.nameOff(tm.Name)
 		vm := vmethods[j]
-		vmName := V.nameOff(vm.name)
-		if vmName.name() == tmName.name() && V.typeOff(vm.mtyp) == t.typeOff(tm.typ) {
-			if !tmName.isExported() {
-				tmPkgPath := tmName.pkgPath()
+		vmName := rV.nameOff(vm.Name)
+		if vmName.Name() == tmName.Name() && rV.typeOff(vm.Mtyp) == rT.typeOff(tm.Typ) {
+			if !tmName.IsExported() {
+				tmPkgPath := pkgPath(tmName)
 				if tmPkgPath == "" {
-					tmPkgPath = t.pkgPath.name()
+					tmPkgPath = t.PkgPath.Name()
 				}
-				vmPkgPath := vmName.pkgPath()
+				vmPkgPath := pkgPath(vmName)
 				if vmPkgPath == "" {
-					vmPkgPath = V.nameOff(v.pkgPath).name()
+					vmPkgPath = rV.nameOff(v.PkgPath).Name()
 				}
 				if tmPkgPath != vmPkgPath {
 					continue
 				}
 			}
-			if i++; i >= len(t.methods) {
+			if i++; i >= len(t.Methods) {
 				return true
 			}
 		}
@@ -823,7 +513,7 @@
 // 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 {
+func directlyAssignable(T, V *abi.Type) bool {
 	// x's type V is identical to T?
 	if T == V {
 		return true
@@ -831,7 +521,7 @@
 
 	// Otherwise at least one of T and V must not be defined
 	// and they must have the same kind.
-	if T.hasName() && V.hasName() || T.Kind() != V.Kind() {
+	if T.HasName() && V.HasName() || T.Kind() != V.Kind() {
 		return false
 	}
 
@@ -839,19 +529,19 @@
 	return haveIdenticalUnderlyingType(T, V, true)
 }
 
-func haveIdenticalType(T, V Type, cmpTags bool) bool {
+func haveIdenticalType(T, V *abi.Type, cmpTags bool) bool {
 	if cmpTags {
 		return T == V
 	}
 
-	if T.Name() != V.Name() || T.Kind() != V.Kind() {
+	if toRType(T).Name() != toRType(V).Name() || T.Kind() != V.Kind() {
 		return false
 	}
 
-	return haveIdenticalUnderlyingType(T.common(), V.common(), false)
+	return haveIdenticalUnderlyingType(T, V, false)
 }
 
-func haveIdenticalUnderlyingType(T, V *rtype, cmpTags bool) bool {
+func haveIdenticalUnderlyingType(T, V *abi.Type, cmpTags bool) bool {
 	if T == V {
 		return true
 	}
@@ -863,30 +553,30 @@
 
 	// 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 {
+	if abi.Bool <= kind && kind <= abi.Complex128 || kind == abi.String || kind == abi.UnsafePointer {
 		return true
 	}
 
 	// Composite types.
 	switch kind {
-	case Array:
+	case abi.Array:
 		return T.Len() == V.Len() && haveIdenticalType(T.Elem(), V.Elem(), cmpTags)
 
-	case Chan:
+	case abi.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 && haveIdenticalType(T.Elem(), V.Elem(), cmpTags) {
+		if V.ChanDir() == abi.BothDir && haveIdenticalType(T.Elem(), V.Elem(), cmpTags) {
 			return true
 		}
 
 		// Otherwise continue test for identical underlying type.
-		return V.chanDir() == T.chanDir() && haveIdenticalType(T.Elem(), V.Elem(), cmpTags)
+		return V.ChanDir() == T.ChanDir() && haveIdenticalType(T.Elem(), V.Elem(), cmpTags)
 
-	case Func:
+	case abi.Func:
 		t := (*funcType)(unsafe.Pointer(T))
 		v := (*funcType)(unsafe.Pointer(V))
-		if t.outCount != v.outCount || t.inCount != v.inCount {
+		if t.OutCount != v.OutCount || t.InCount != v.InCount {
 			return false
 		}
 		for i := 0; i < t.NumIn(); i++ {
@@ -904,44 +594,44 @@
 	case Interface:
 		t := (*interfaceType)(unsafe.Pointer(T))
 		v := (*interfaceType)(unsafe.Pointer(V))
-		if len(t.methods) == 0 && len(v.methods) == 0 {
+		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:
+	case abi.Map:
 		return haveIdenticalType(T.Key(), V.Key(), cmpTags) && haveIdenticalType(T.Elem(), V.Elem(), cmpTags)
 
-	case Ptr, Slice:
+	case Ptr, abi.Slice:
 		return haveIdenticalType(T.Elem(), V.Elem(), cmpTags)
 
-	case Struct:
+	case abi.Struct:
 		t := (*structType)(unsafe.Pointer(T))
 		v := (*structType)(unsafe.Pointer(V))
-		if len(t.fields) != len(v.fields) {
+		if len(t.Fields) != len(v.Fields) {
 			return false
 		}
-		if t.pkgPath.name() != v.pkgPath.name() {
+		if t.PkgPath.Name() != v.PkgPath.Name() {
 			return false
 		}
-		for i := range t.fields {
-			tf := &t.fields[i]
-			vf := &v.fields[i]
-			if tf.name.name() != vf.name.name() {
+		for i := range t.Fields {
+			tf := &t.Fields[i]
+			vf := &v.Fields[i]
+			if tf.Name.Name() != vf.Name.Name() {
 				return false
 			}
-			if !haveIdenticalType(tf.typ, vf.typ, cmpTags) {
+			if !haveIdenticalType(tf.Typ, vf.Typ, cmpTags) {
 				return false
 			}
-			if cmpTags && tf.name.tag() != vf.name.tag() {
+			if cmpTags && tf.Name.Tag() != vf.Name.Tag() {
 				return false
 			}
-			if tf.offset != vf.offset {
+			if tf.Offset != vf.Offset {
 				return false
 			}
-			if tf.embedded() != vf.embedded() {
+			if tf.Embedded() != vf.Embedded() {
 				return false
 			}
 		}
@@ -951,24 +641,19 @@
 	return false
 }
 
-type structTypeUncommon struct {
-	structType
-	u uncommonType
-}
-
 // 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.
-func toType(t *rtype) Type {
+func toType(t *abi.Type) Type {
 	if t == nil {
 		return nil
 	}
-	return t
+	return toRType(t)
 }
 
 // ifaceIndir reports whether t is stored indirectly in an interface value.
-func ifaceIndir(t *rtype) bool {
-	return t.kind&kindDirectIface == 0
+func ifaceIndir(t *abi.Type) bool {
+	return t.Kind_&abi.KindDirectIface == 0
 }
diff --git a/src/internal/reflectlite/value.go b/src/internal/reflectlite/value.go
index b9bca3a..eb79894 100644
--- a/src/internal/reflectlite/value.go
+++ b/src/internal/reflectlite/value.go
@@ -5,6 +5,7 @@
 package reflectlite
 
 import (
+	"internal/abi"
 	"internal/goarch"
 	"internal/unsafeheader"
 	"runtime"
@@ -34,7 +35,7 @@
 // they represent.
 type Value struct {
 	// typ holds the type of the value represented by a Value.
-	typ *rtype
+	typ *abi.Type
 
 	// Pointer-valued data or, if flagIndir is set, pointer to data.
 	// Valid when either flagIndir is set or typ.pointers() is true.
@@ -89,7 +90,7 @@
 // pointer returns the underlying pointer represented by v.
 // v.Kind() must be Pointer, Map, Chan, Func, or UnsafePointer
 func (v Value) pointer() unsafe.Pointer {
-	if v.typ.size != goarch.PtrSize || !v.typ.pointers() {
+	if v.typ.Size() != goarch.PtrSize || !v.typ.Pointers() {
 		panic("can't call pointer on a non-pointer Value")
 	}
 	if v.flag&flagIndir != 0 {
@@ -178,7 +179,7 @@
 
 // emptyInterface is the header for an interface{} value.
 type emptyInterface struct {
-	typ  *rtype
+	typ  *abi.Type
 	word unsafe.Pointer
 }
 
@@ -198,7 +199,7 @@
 // or it is not addressable.
 func (f flag) mustBeAssignable() {
 	if f == 0 {
-		panic(&ValueError{methodName(), Invalid})
+		panic(&ValueError{methodName(), abi.Invalid})
 	}
 	// Assignable if addressable and not read-only.
 	if f&flagRO != 0 {
@@ -225,7 +226,7 @@
 func (v Value) Elem() Value {
 	k := v.kind()
 	switch k {
-	case Interface:
+	case abi.Interface:
 		var eface any
 		if v.typ.NumMethod() == 0 {
 			eface = *(*any)(v.ptr)
@@ -239,7 +240,7 @@
 			x.flag |= v.flag.ro()
 		}
 		return x
-	case Pointer:
+	case abi.Pointer:
 		ptr := v.ptr
 		if v.flag&flagIndir != 0 {
 			ptr = *(*unsafe.Pointer)(ptr)
@@ -249,7 +250,7 @@
 			return Value{}
 		}
 		tt := (*ptrType)(unsafe.Pointer(v.typ))
-		typ := tt.elem
+		typ := tt.Elem
 		fl := v.flag&flagRO | flagIndir | flagAddr
 		fl |= flag(typ.Kind())
 		return Value{typ, ptr, fl}
@@ -262,7 +263,7 @@
 		panic(&ValueError{"reflectlite.Value.Interface", 0})
 	}
 
-	if v.kind() == Interface {
+	if v.kind() == abi.Interface {
 		// Special case: return the element inside the interface.
 		// Empty interface has one layout, all interfaces with
 		// methods have a second layout.
@@ -288,7 +289,7 @@
 func (v Value) IsNil() bool {
 	k := v.kind()
 	switch k {
-	case Chan, Func, Map, Pointer, UnsafePointer:
+	case abi.Chan, abi.Func, abi.Map, abi.Pointer, abi.UnsafePointer:
 		// if v.flag&flagMethod != 0 {
 		// 	return false
 		// }
@@ -297,7 +298,7 @@
 			ptr = *(*unsafe.Pointer)(ptr)
 		}
 		return ptr == nil
-	case Interface, Slice:
+	case abi.Interface, abi.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
@@ -329,17 +330,17 @@
 func (v Value) Len() int {
 	k := v.kind()
 	switch k {
-	case Array:
+	case abi.Array:
 		tt := (*arrayType)(unsafe.Pointer(v.typ))
-		return int(tt.len)
-	case Chan:
+		return int(tt.Len)
+	case abi.Chan:
 		return chanlen(v.pointer())
-	case Map:
+	case abi.Map:
 		return maplen(v.pointer())
-	case Slice:
+	case abi.Slice:
 		// Slice is bigger than a word; assume flagIndir.
 		return (*unsafeheader.Slice)(v.ptr).Len
-	case String:
+	case abi.String:
 		// String is bigger than a word; assume flagIndir.
 		return (*unsafeheader.String)(v.ptr).Len
 	}
@@ -349,7 +350,7 @@
 // NumMethod returns the number of exported methods in the value's method set.
 func (v Value) numMethod() int {
 	if v.typ == nil {
-		panic(&ValueError{"reflectlite.Value.NumMethod", Invalid})
+		panic(&ValueError{"reflectlite.Value.NumMethod", abi.Invalid})
 	}
 	return v.typ.NumMethod()
 }
@@ -361,7 +362,7 @@
 	v.mustBeAssignable()
 	x.mustBeExported() // do not let unexported x leak
 	var target unsafe.Pointer
-	if v.kind() == Interface {
+	if v.kind() == abi.Interface {
 		target = v.ptr
 	}
 	x = x.assignTo("reflectlite.Set", v.typ, target)
@@ -376,10 +377,10 @@
 func (v Value) Type() Type {
 	f := v.flag
 	if f == 0 {
-		panic(&ValueError{"reflectlite.Value.Type", Invalid})
+		panic(&ValueError{"reflectlite.Value.Type", abi.Invalid})
 	}
 	// Method values not supported.
-	return v.typ
+	return toRType(v.typ)
 }
 
 /*
@@ -387,7 +388,7 @@
  */
 
 // implemented in package runtime
-func unsafe_New(*rtype) unsafe.Pointer
+func unsafe_New(*abi.Type) unsafe.Pointer
 
 // ValueOf returns a new Value initialized to the concrete value
 // stored in the interface i. ValueOf(nil) returns the zero Value.
@@ -408,7 +409,7 @@
 // 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 {
+func (v Value) assignTo(context string, dst *abi.Type, target unsafe.Pointer) Value {
 	// if v.flag&flagMethod != 0 {
 	// 	v = makeMethodValue(context, v)
 	// }
@@ -425,11 +426,11 @@
 		if target == nil {
 			target = unsafe_New(dst)
 		}
-		if v.Kind() == Interface && v.IsNil() {
+		if v.Kind() == abi.Interface && v.IsNil() {
 			// A nil ReadWriter passed to nil Reader is OK,
 			// but using ifaceE2I below will panic.
 			// Avoid the panic by returning a nil dst (e.g., Reader) explicitly.
-			return Value{dst, nil, flag(Interface)}
+			return Value{dst, nil, flag(abi.Interface)}
 		}
 		x := valueInterface(v)
 		if dst.NumMethod() == 0 {
@@ -437,11 +438,11 @@
 		} else {
 			ifaceE2I(dst, x, target)
 		}
-		return Value{dst, target, flagIndir | flag(Interface)}
+		return Value{dst, target, flagIndir | flag(abi.Interface)}
 	}
 
 	// Failed.
-	panic(context + ": value of type " + v.typ.String() + " is not assignable to type " + dst.String())
+	panic(context + ": value of type " + toRType(v.typ).String() + " is not assignable to type " + toRType(dst).String())
 }
 
 // arrayAt returns the i-th element of p,
@@ -455,12 +456,12 @@
 	return add(p, uintptr(i)*eltSize, "i < len")
 }
 
-func ifaceE2I(t *rtype, src any, dst unsafe.Pointer)
+func ifaceE2I(t *abi.Type, src any, dst unsafe.Pointer)
 
 // typedmemmove copies a value of type t to dst from src.
 //
 //go:noescape
-func typedmemmove(t *rtype, dst, src unsafe.Pointer)
+func typedmemmove(t *abi.Type, dst, src unsafe.Pointer)
 
 // Dummy annotation marking that the value x escapes,
 // for use in cases where the reflect code is so clever that
diff --git a/src/internal/safefilepath/path_windows.go b/src/internal/safefilepath/path_windows.go
index 909c150..7cfd6ce 100644
--- a/src/internal/safefilepath/path_windows.go
+++ b/src/internal/safefilepath/path_windows.go
@@ -20,15 +20,10 @@
 	for p := path; p != ""; {
 		// Find the next path element.
 		i := 0
-		dot := -1
 		for i < len(p) && p[i] != '/' {
 			switch p[i] {
 			case 0, '\\', ':':
 				return "", errInvalidPath
-			case '.':
-				if dot < 0 {
-					dot = i
-				}
 			}
 			i++
 		}
@@ -39,22 +34,8 @@
 		} else {
 			p = ""
 		}
-		// Trim the extension and look for a reserved name.
-		base := part
-		if dot >= 0 {
-			base = part[:dot]
-		}
-		if isReservedName(base) {
-			if dot < 0 {
-				return "", errInvalidPath
-			}
-			// The path element is a reserved name with an extension.
-			// Some Windows versions consider this a reserved name,
-			// while others do not. Use FullPath to see if the name is
-			// reserved.
-			if p, _ := syscall.FullPath(part); len(p) >= 4 && p[:4] == `\\.\` {
-				return "", errInvalidPath
-			}
+		if IsReservedName(part) {
+			return "", errInvalidPath
 		}
 	}
 	if containsSlash {
@@ -70,23 +51,88 @@
 	return path, nil
 }
 
-// isReservedName reports if name is a Windows reserved device name.
+// IsReservedName reports if name is a Windows reserved device name.
 // It does not detect names with an extension, which are also reserved on some Windows versions.
 //
 // For details, search for PRN in
 // https://docs.microsoft.com/en-us/windows/desktop/fileio/naming-a-file.
-func isReservedName(name string) bool {
-	if 3 <= len(name) && len(name) <= 4 {
-		switch string([]byte{toUpper(name[0]), toUpper(name[1]), toUpper(name[2])}) {
-		case "CON", "PRN", "AUX", "NUL":
-			return len(name) == 3
-		case "COM", "LPT":
-			return len(name) == 4 && '1' <= name[3] && name[3] <= '9'
+func IsReservedName(name string) bool {
+	// Device names can have arbitrary trailing characters following a dot or colon.
+	base := name
+	for i := 0; i < len(base); i++ {
+		switch base[i] {
+		case ':', '.':
+			base = base[:i]
 		}
 	}
+	// Trailing spaces in the last path element are ignored.
+	for len(base) > 0 && base[len(base)-1] == ' ' {
+		base = base[:len(base)-1]
+	}
+	if !isReservedBaseName(base) {
+		return false
+	}
+	if len(base) == len(name) {
+		return true
+	}
+	// The path element is a reserved name with an extension.
+	// Some Windows versions consider this a reserved name,
+	// while others do not. Use FullPath to see if the name is
+	// reserved.
+	if p, _ := syscall.FullPath(name); len(p) >= 4 && p[:4] == `\\.\` {
+		return true
+	}
 	return false
 }
 
+func isReservedBaseName(name string) bool {
+	if len(name) == 3 {
+		switch string([]byte{toUpper(name[0]), toUpper(name[1]), toUpper(name[2])}) {
+		case "CON", "PRN", "AUX", "NUL":
+			return true
+		}
+	}
+	if len(name) >= 4 {
+		switch string([]byte{toUpper(name[0]), toUpper(name[1]), toUpper(name[2])}) {
+		case "COM", "LPT":
+			if len(name) == 4 && '1' <= name[3] && name[3] <= '9' {
+				return true
+			}
+			// Superscript ¹, ², and ³ are considered numbers as well.
+			switch name[3:] {
+			case "\u00b2", "\u00b3", "\u00b9":
+				return true
+			}
+			return false
+		}
+	}
+
+	// Passing CONIN$ or CONOUT$ to CreateFile opens a console handle.
+	// https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createfilea#consoles
+	//
+	// While CONIN$ and CONOUT$ aren't documented as being files,
+	// they behave the same as CON. For example, ./CONIN$ also opens the console input.
+	if len(name) == 6 && name[5] == '$' && equalFold(name, "CONIN$") {
+		return true
+	}
+	if len(name) == 7 && name[6] == '$' && equalFold(name, "CONOUT$") {
+		return true
+	}
+	return false
+}
+
+func equalFold(a, b string) bool {
+	if len(a) != len(b) {
+		return false
+	}
+	for i := 0; i < len(a); i++ {
+		if toUpper(a[i]) != toUpper(b[i]) {
+			return false
+		}
+	}
+	return true
+}
+
 func toUpper(c byte) byte {
 	if 'a' <= c && c <= 'z' {
 		return c - ('a' - 'A')
diff --git a/src/internal/singleflight/singleflight_test.go b/src/internal/singleflight/singleflight_test.go
index a13893d..279e1be 100644
--- a/src/internal/singleflight/singleflight_test.go
+++ b/src/internal/singleflight/singleflight_test.go
@@ -100,9 +100,9 @@
 		g.Do(key, func() (i interface{}, e error) {
 			firstStarted.Done()
 			<-firstCh
-			firstFinished.Done()
 			return
 		})
+		firstFinished.Done()
 	}()
 
 	firstStarted.Wait()
diff --git a/src/internal/syscall/execenv/execenv_windows.go b/src/internal/syscall/execenv/execenv_windows.go
index a8aa1a6..2a89ed1 100644
--- a/src/internal/syscall/execenv/execenv_windows.go
+++ b/src/internal/syscall/execenv/execenv_windows.go
@@ -9,7 +9,6 @@
 import (
 	"internal/syscall/windows"
 	"syscall"
-	"unicode/utf16"
 	"unsafe"
 )
 
@@ -25,30 +24,24 @@
 	if sys == nil || sys.Token == 0 {
 		return syscall.Environ(), nil
 	}
-	var block *uint16
-	err = windows.CreateEnvironmentBlock(&block, sys.Token, false)
+	var blockp *uint16
+	err = windows.CreateEnvironmentBlock(&blockp, sys.Token, false)
 	if err != nil {
 		return nil, err
 	}
-	defer windows.DestroyEnvironmentBlock(block)
-	blockp := uintptr(unsafe.Pointer(block))
-	for {
+	defer windows.DestroyEnvironmentBlock(blockp)
 
+	const size = unsafe.Sizeof(*blockp)
+	for *blockp != 0 { // environment block ends with empty string
 		// find NUL terminator
-		end := unsafe.Pointer(blockp)
+		end := unsafe.Add(unsafe.Pointer(blockp), size)
 		for *(*uint16)(end) != 0 {
-			end = unsafe.Pointer(uintptr(end) + 2)
+			end = unsafe.Add(end, size)
 		}
 
-		n := (uintptr(end) - uintptr(unsafe.Pointer(blockp))) / 2
-		if n == 0 {
-			// environment block ends with empty string
-			break
-		}
-
-		entry := (*[(1 << 30) - 1]uint16)(unsafe.Pointer(blockp))[:n:n]
-		env = append(env, string(utf16.Decode(entry)))
-		blockp += 2 * (uintptr(len(entry)) + 1)
+		entry := unsafe.Slice(blockp, (uintptr(end)-uintptr(unsafe.Pointer(blockp)))/2)
+		env = append(env, syscall.UTF16ToString(entry))
+		blockp = (*uint16)(unsafe.Add(end, size))
 	}
 	return
 }
diff --git a/src/internal/syscall/unix/at_aix.go b/src/internal/syscall/unix/at_aix.go
index 425df98..3fe3285 100644
--- a/src/internal/syscall/unix/at_aix.go
+++ b/src/internal/syscall/unix/at_aix.go
@@ -11,4 +11,5 @@
 const (
 	AT_REMOVEDIR        = 0x1
 	AT_SYMLINK_NOFOLLOW = 0x1
+	UTIME_OMIT          = -0x3
 )
diff --git a/src/internal/syscall/unix/at_js.go b/src/internal/syscall/unix/at_js.go
new file mode 100644
index 0000000..d05ccce
--- /dev/null
+++ b/src/internal/syscall/unix/at_js.go
@@ -0,0 +1,13 @@
+// Copyright 2020 The Go Authors. 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
+
+const (
+	// UTIME_OMIT is the sentinel value to indicate that a time value should not
+	// be changed. It is useful for example to indicate for example with UtimesNano
+	// to avoid changing AccessTime or ModifiedTime.
+	// Its value must match syscall/fs_js.go
+	UTIME_OMIT = -0x2
+)
diff --git a/src/internal/syscall/unix/at_solaris.go b/src/internal/syscall/unix/at_solaris.go
index e917c4f..4ab224d 100644
--- a/src/internal/syscall/unix/at_solaris.go
+++ b/src/internal/syscall/unix/at_solaris.go
@@ -16,4 +16,6 @@
 const (
 	AT_REMOVEDIR        = 0x1
 	AT_SYMLINK_NOFOLLOW = 0x1000
+
+	UTIME_OMIT = -0x2
 )
diff --git a/src/internal/syscall/unix/at_sysnum_darwin.go b/src/internal/syscall/unix/at_sysnum_darwin.go
index aaaaa47..208ff34 100644
--- a/src/internal/syscall/unix/at_sysnum_darwin.go
+++ b/src/internal/syscall/unix/at_sysnum_darwin.go
@@ -6,3 +6,5 @@
 
 const AT_REMOVEDIR = 0x80
 const AT_SYMLINK_NOFOLLOW = 0x0020
+
+const UTIME_OMIT = -0x2
diff --git a/src/internal/syscall/unix/at_sysnum_dragonfly.go b/src/internal/syscall/unix/at_sysnum_dragonfly.go
index cec9abc..b7ed3f7 100644
--- a/src/internal/syscall/unix/at_sysnum_dragonfly.go
+++ b/src/internal/syscall/unix/at_sysnum_dragonfly.go
@@ -12,3 +12,5 @@
 
 const AT_REMOVEDIR = 0x2
 const AT_SYMLINK_NOFOLLOW = 0x1
+
+const UTIME_OMIT = -0x1
diff --git a/src/internal/syscall/unix/at_sysnum_freebsd.go b/src/internal/syscall/unix/at_sysnum_freebsd.go
index adfbbcb..9cd5da6 100644
--- a/src/internal/syscall/unix/at_sysnum_freebsd.go
+++ b/src/internal/syscall/unix/at_sysnum_freebsd.go
@@ -10,6 +10,9 @@
 	AT_REMOVEDIR        = 0x800
 	AT_SYMLINK_NOFOLLOW = 0x200
 
-	unlinkatTrap uintptr = syscall.SYS_UNLINKAT
-	openatTrap   uintptr = syscall.SYS_OPENAT
+	UTIME_OMIT = -0x2
+
+	unlinkatTrap       uintptr = syscall.SYS_UNLINKAT
+	openatTrap         uintptr = syscall.SYS_OPENAT
+	posixFallocateTrap uintptr = syscall.SYS_POSIX_FALLOCATE
 )
diff --git a/src/internal/syscall/unix/at_sysnum_linux.go b/src/internal/syscall/unix/at_sysnum_linux.go
index b9b8495..7c3b15c 100644
--- a/src/internal/syscall/unix/at_sysnum_linux.go
+++ b/src/internal/syscall/unix/at_sysnum_linux.go
@@ -14,4 +14,6 @@
 	AT_FDCWD            = -0x64
 	AT_REMOVEDIR        = 0x200
 	AT_SYMLINK_NOFOLLOW = 0x100
+
+	UTIME_OMIT = 0x3ffffffe
 )
diff --git a/src/internal/syscall/unix/at_sysnum_netbsd.go b/src/internal/syscall/unix/at_sysnum_netbsd.go
index fe45e29..becc1bd 100644
--- a/src/internal/syscall/unix/at_sysnum_netbsd.go
+++ b/src/internal/syscall/unix/at_sysnum_netbsd.go
@@ -12,3 +12,5 @@
 
 const AT_REMOVEDIR = 0x800
 const AT_SYMLINK_NOFOLLOW = 0x200
+
+const UTIME_OMIT = (1 << 30) - 2
diff --git a/src/internal/syscall/unix/at_sysnum_openbsd.go b/src/internal/syscall/unix/at_sysnum_openbsd.go
index c2d48b9..fd38947 100644
--- a/src/internal/syscall/unix/at_sysnum_openbsd.go
+++ b/src/internal/syscall/unix/at_sysnum_openbsd.go
@@ -12,3 +12,5 @@
 
 const AT_REMOVEDIR = 0x08
 const AT_SYMLINK_NOFOLLOW = 0x02
+
+const UTIME_OMIT = -0x1
diff --git a/src/internal/syscall/unix/at_wasip1.go b/src/internal/syscall/unix/at_wasip1.go
new file mode 100644
index 0000000..3d47d7e
--- /dev/null
+++ b/src/internal/syscall/unix/at_wasip1.go
@@ -0,0 +1,13 @@
+// Copyright 2020 The Go Authors. 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
+
+const (
+	// UTIME_OMIT is the sentinel value to indicate that a time value should not
+	// be changed. It is useful for example to indicate for example with UtimesNano
+	// to avoid changing AccessTime or ModifiedTime.
+	// Its value must match syscall/fs_wasip1.go
+	UTIME_OMIT = -0x2
+)
diff --git a/src/internal/syscall/unix/fallocate_freebsd_386.go b/src/internal/syscall/unix/fallocate_freebsd_386.go
new file mode 100644
index 0000000..535b23d
--- /dev/null
+++ b/src/internal/syscall/unix/fallocate_freebsd_386.go
@@ -0,0 +1,17 @@
+// Copyright 2023 The Go Authors. 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 "syscall"
+
+func PosixFallocate(fd int, off int64, size int64) error {
+	// If successful, posix_fallocate() returns zero. It returns an error on failure, without
+	// setting errno. See https://man.freebsd.org/cgi/man.cgi?query=posix_fallocate&sektion=2&n=1
+	r1, _, _ := syscall.Syscall6(posixFallocateTrap, uintptr(fd), uintptr(off), uintptr(off>>32), uintptr(size), uintptr(size>>32), 0)
+	if r1 != 0 {
+		return syscall.Errno(r1)
+	}
+	return nil
+}
diff --git a/src/internal/syscall/unix/fallocate_freebsd_64bit.go b/src/internal/syscall/unix/fallocate_freebsd_64bit.go
new file mode 100644
index 0000000..a9d5228
--- /dev/null
+++ b/src/internal/syscall/unix/fallocate_freebsd_64bit.go
@@ -0,0 +1,19 @@
+// Copyright 2023 The Go 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:build freebsd && (amd64 || arm64 || riscv64)
+
+package unix
+
+import "syscall"
+
+func PosixFallocate(fd int, off int64, size int64) error {
+	// If successful, posix_fallocate() returns zero. It returns an error on failure, without
+	// setting errno. See https://man.freebsd.org/cgi/man.cgi?query=posix_fallocate&sektion=2&n=1
+	r1, _, _ := syscall.Syscall(posixFallocateTrap, uintptr(fd), uintptr(off), uintptr(size))
+	if r1 != 0 {
+		return syscall.Errno(r1)
+	}
+	return nil
+}
diff --git a/src/internal/syscall/unix/fallocate_freebsd_arm.go b/src/internal/syscall/unix/fallocate_freebsd_arm.go
new file mode 100644
index 0000000..1ded50f
--- /dev/null
+++ b/src/internal/syscall/unix/fallocate_freebsd_arm.go
@@ -0,0 +1,22 @@
+// Copyright 2023 The Go Authors. 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 "syscall"
+
+func PosixFallocate(fd int, off int64, size int64) error {
+	// If successful, posix_fallocate() returns zero. It returns an error on failure, without
+	// setting errno. See https://man.freebsd.org/cgi/man.cgi?query=posix_fallocate&sektion=2&n=1
+	//
+	// The padding 0 argument is needed because the ARM calling convention requires that if an
+	// argument (off in this case) needs double-word alignment (8-byte), the NCRN (next core
+	// register number) is rounded up to the next even register number.
+	// See https://github.com/ARM-software/abi-aa/blob/2bcab1e3b22d55170c563c3c7940134089176746/aapcs32/aapcs32.rst#parameter-passing
+	r1, _, _ := syscall.Syscall6(posixFallocateTrap, uintptr(fd), 0, uintptr(off), uintptr(off>>32), uintptr(size), uintptr(size>>32))
+	if r1 != 0 {
+		return syscall.Errno(r1)
+	}
+	return nil
+}
diff --git a/src/internal/syscall/unix/fcntl_js.go b/src/internal/syscall/unix/fcntl_js.go
new file mode 100644
index 0000000..bdfb8e0
--- /dev/null
+++ b/src/internal/syscall/unix/fcntl_js.go
@@ -0,0 +1,13 @@
+// Copyright 2023 The Go 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:build js && wasm
+
+package unix
+
+import "syscall"
+
+func Fcntl(fd int, cmd int, arg int) (int, error) {
+	return 0, syscall.ENOSYS
+}
diff --git a/src/internal/syscall/unix/fcntl_linux_32bit.go b/src/internal/syscall/unix/fcntl_linux_32bit.go
deleted file mode 100644
index 7b39ee7..0000000
--- a/src/internal/syscall/unix/fcntl_linux_32bit.go
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2019 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// On 32-bit Linux systems, use SYS_FCNTL64.
-// If you change the build tags here, see syscall/flock_linux_32bit.go.
-
-//go:build (linux && 386) || (linux && arm) || (linux && mips) || (linux && mipsle)
-
-package unix
-
-import "syscall"
-
-func init() {
-	FcntlSyscall = syscall.SYS_FCNTL64
-}
diff --git a/src/internal/syscall/unix/fcntl_unix.go b/src/internal/syscall/unix/fcntl_unix.go
new file mode 100644
index 0000000..6f9e1243
--- /dev/null
+++ b/src/internal/syscall/unix/fcntl_unix.go
@@ -0,0 +1,25 @@
+// Copyright 2023 The Go 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:build unix
+
+package unix
+
+import (
+	"syscall"
+	_ "unsafe" // for go:linkname
+)
+
+// Implemented in the runtime package.
+//
+//go:linkname fcntl runtime.fcntl
+func fcntl(fd int32, cmd int32, arg int32) (int32, int32)
+
+func Fcntl(fd int, cmd int, arg int) (int, error) {
+	val, errno := fcntl(int32(fd), int32(cmd), int32(arg))
+	if val == -1 {
+		return int(val), syscall.Errno(errno)
+	}
+	return int(val), nil
+}
diff --git a/src/internal/syscall/unix/fcntl_wasip1.go b/src/internal/syscall/unix/fcntl_wasip1.go
new file mode 100644
index 0000000..e70cd74
--- /dev/null
+++ b/src/internal/syscall/unix/fcntl_wasip1.go
@@ -0,0 +1,17 @@
+// Copyright 2023 The Go 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:build wasip1
+
+package unix
+
+import "syscall"
+
+func Fcntl(fd int, cmd int, arg int) (int, error) {
+	if cmd == syscall.F_GETFL {
+		flags, err := fd_fdstat_get_flags(fd)
+		return int(flags), err
+	}
+	return 0, syscall.ENOSYS
+}
diff --git a/src/internal/syscall/unix/getrandom.go b/src/internal/syscall/unix/getrandom.go
index a665933..e83f0cd 100644
--- a/src/internal/syscall/unix/getrandom.go
+++ b/src/internal/syscall/unix/getrandom.go
@@ -12,7 +12,7 @@
 	"unsafe"
 )
 
-var getrandomUnsupported int32 // atomic
+var getrandomUnsupported atomic.Bool
 
 // GetRandomFlag is a flag supported by the getrandom system call.
 type GetRandomFlag uintptr
@@ -22,7 +22,7 @@
 	if len(p) == 0 {
 		return 0, nil
 	}
-	if atomic.LoadInt32(&getrandomUnsupported) != 0 {
+	if getrandomUnsupported.Load() {
 		return 0, syscall.ENOSYS
 	}
 	r1, _, errno := syscall.Syscall(getrandomTrap,
@@ -31,7 +31,7 @@
 		uintptr(flags))
 	if errno != 0 {
 		if errno == syscall.ENOSYS {
-			atomic.StoreInt32(&getrandomUnsupported, 1)
+			getrandomUnsupported.Store(true)
 		}
 		return 0, errno
 	}
diff --git a/src/internal/syscall/unix/getrandom_netbsd.go b/src/internal/syscall/unix/getrandom_netbsd.go
new file mode 100644
index 0000000..c83e3b2
--- /dev/null
+++ b/src/internal/syscall/unix/getrandom_netbsd.go
@@ -0,0 +1,56 @@
+// Copyright 2023 The Go Authors. 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 (
+	"sync"
+	"sync/atomic"
+	"syscall"
+	"unsafe"
+)
+
+// NetBSD getrandom system call number.
+const getrandomTrap uintptr = 91
+
+var getrandomUnsupported atomic.Bool
+
+// GetRandomFlag is a flag supported by the getrandom system call.
+type GetRandomFlag uintptr
+
+// GetRandom calls the getrandom system call.
+func GetRandom(p []byte, flags GetRandomFlag) (n int, err error) {
+	if len(p) == 0 {
+		return 0, nil
+	}
+	if getrandomUnsupported.Load() {
+		return 0, syscall.ENOSYS
+	}
+	// getrandom(2) was added in NetBSD 10.0
+	if getOSRevision() < 1000000000 {
+		getrandomUnsupported.Store(true)
+		return 0, syscall.ENOSYS
+	}
+	r1, _, errno := syscall.Syscall(getrandomTrap,
+		uintptr(unsafe.Pointer(&p[0])),
+		uintptr(len(p)),
+		uintptr(flags))
+	if errno != 0 {
+		if errno == syscall.ENOSYS {
+			getrandomUnsupported.Store(true)
+		}
+		return 0, errno
+	}
+	return int(r1), nil
+}
+
+var (
+	osrevisionOnce sync.Once
+	osrevision     uint32
+)
+
+func getOSRevision() uint32 {
+	osrevisionOnce.Do(func() { osrevision, _ = syscall.SysctlUint32("kern.osrevision") })
+	return osrevision
+}
diff --git a/src/internal/syscall/unix/getrandom_solaris.go b/src/internal/syscall/unix/getrandom_solaris.go
index d86775c..cf4f35a 100644
--- a/src/internal/syscall/unix/getrandom_solaris.go
+++ b/src/internal/syscall/unix/getrandom_solaris.go
@@ -16,7 +16,7 @@
 
 var procGetrandom uintptr
 
-var getrandomUnsupported int32 // atomic
+var getrandomUnsupported atomic.Bool
 
 // GetRandomFlag is a flag supported by the getrandom system call.
 type GetRandomFlag uintptr
@@ -34,7 +34,7 @@
 	if len(p) == 0 {
 		return 0, nil
 	}
-	if atomic.LoadInt32(&getrandomUnsupported) != 0 {
+	if getrandomUnsupported.Load() {
 		return 0, syscall.ENOSYS
 	}
 	r1, _, errno := syscall6(uintptr(unsafe.Pointer(&procGetrandom)),
@@ -45,7 +45,7 @@
 		0, 0, 0)
 	if errno != 0 {
 		if errno == syscall.ENOSYS {
-			atomic.StoreInt32(&getrandomUnsupported, 1)
+			getrandomUnsupported.Store(true)
 		}
 		return 0, errno
 	}
diff --git a/src/internal/syscall/unix/net_darwin.go b/src/internal/syscall/unix/net_darwin.go
index b9da4f1..5601b49 100644
--- a/src/internal/syscall/unix/net_darwin.go
+++ b/src/internal/syscall/unix/net_darwin.go
@@ -17,6 +17,7 @@
 	AI_MASK      = 0x1407
 
 	EAI_AGAIN    = 2
+	EAI_NODATA   = 7
 	EAI_NONAME   = 8
 	EAI_SYSTEM   = 11
 	EAI_OVERFLOW = 14
@@ -118,7 +119,7 @@
 func syscall_syscall9(fn, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno)
 
 type ResState struct {
-	unexported [70]uintptr
+	unexported [69]uintptr
 }
 
 //go:cgo_import_dynamic libresolv_res_9_ninit res_9_ninit "/usr/lib/libresolv.9.dylib"
diff --git a/src/internal/syscall/unix/net_wasip1.go b/src/internal/syscall/unix/net_wasip1.go
new file mode 100644
index 0000000..8a60e8f
--- /dev/null
+++ b/src/internal/syscall/unix/net_wasip1.go
@@ -0,0 +1,44 @@
+// Copyright 2023 The Go 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:build wasip1
+
+package unix
+
+import (
+	"syscall"
+	_ "unsafe"
+)
+
+func RecvfromInet4(fd int, p []byte, flags int, from *syscall.SockaddrInet4) (int, error) {
+	return 0, syscall.ENOSYS
+}
+
+func RecvfromInet6(fd int, p []byte, flags int, from *syscall.SockaddrInet6) (n int, err error) {
+	return 0, syscall.ENOSYS
+}
+
+func SendtoInet4(fd int, p []byte, flags int, to *syscall.SockaddrInet4) (err error) {
+	return syscall.ENOSYS
+}
+
+func SendtoInet6(fd int, p []byte, flags int, to *syscall.SockaddrInet6) (err error) {
+	return syscall.ENOSYS
+}
+
+func SendmsgNInet4(fd int, p, oob []byte, to *syscall.SockaddrInet4, flags int) (n int, err error) {
+	return 0, syscall.ENOSYS
+}
+
+func SendmsgNInet6(fd int, p, oob []byte, to *syscall.SockaddrInet6, flags int) (n int, err error) {
+	return 0, syscall.ENOSYS
+}
+
+func RecvmsgInet4(fd int, p, oob []byte, flags int, from *syscall.SockaddrInet4) (n, oobn int, recvflags int, err error) {
+	return 0, 0, 0, syscall.ENOSYS
+}
+
+func RecvmsgInet6(fd int, p, oob []byte, flags int, from *syscall.SockaddrInet6) (n, oobn int, recvflags int, err error) {
+	return 0, 0, 0, syscall.ENOSYS
+}
diff --git a/src/internal/syscall/unix/nonblocking.go b/src/internal/syscall/unix/nonblocking.go
deleted file mode 100644
index a0becd1..0000000
--- a/src/internal/syscall/unix/nonblocking.go
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2018 The Go 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:build dragonfly || freebsd || linux || netbsd || (openbsd && mips64)
-
-package unix
-
-import "syscall"
-
-// FcntlSyscall is the number for the fcntl system call. This is
-// usually SYS_FCNTL, but can be overridden to SYS_FCNTL64.
-var FcntlSyscall uintptr = syscall.SYS_FCNTL
-
-func IsNonblock(fd int) (nonblocking bool, err error) {
-	flag, _, e1 := syscall.Syscall(FcntlSyscall, uintptr(fd), uintptr(syscall.F_GETFL), 0)
-	if e1 != 0 {
-		return false, e1
-	}
-	return flag&syscall.O_NONBLOCK != 0, nil
-}
diff --git a/src/internal/syscall/unix/nonblocking_js.go b/src/internal/syscall/unix/nonblocking_js.go
index 8ed40f3..cfe78c5 100644
--- a/src/internal/syscall/unix/nonblocking_js.go
+++ b/src/internal/syscall/unix/nonblocking_js.go
@@ -9,3 +9,7 @@
 func IsNonblock(fd int) (nonblocking bool, err error) {
 	return false, nil
 }
+
+func HasNonblockFlag(flag int) bool {
+	return false
+}
diff --git a/src/internal/syscall/unix/nonblocking_libc.go b/src/internal/syscall/unix/nonblocking_libc.go
deleted file mode 100644
index bff6684..0000000
--- a/src/internal/syscall/unix/nonblocking_libc.go
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2018 The Go 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:build aix || darwin || (openbsd && !mips64) || solaris
-
-package unix
-
-import (
-	"syscall"
-	_ "unsafe" // for go:linkname
-)
-
-func IsNonblock(fd int) (nonblocking bool, err error) {
-	flag, e1 := fcntl(fd, syscall.F_GETFL, 0)
-	if e1 != nil {
-		return false, e1
-	}
-	return flag&syscall.O_NONBLOCK != 0, nil
-}
-
-// Implemented in the syscall package.
-//
-//go:linkname fcntl syscall.fcntl
-func fcntl(fd int, cmd int, arg int) (int, error)
diff --git a/src/internal/syscall/unix/nonblocking_unix.go b/src/internal/syscall/unix/nonblocking_unix.go
new file mode 100644
index 0000000..fc0bc27
--- /dev/null
+++ b/src/internal/syscall/unix/nonblocking_unix.go
@@ -0,0 +1,21 @@
+// Copyright 2018 The Go 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:build unix
+
+package unix
+
+import "syscall"
+
+func IsNonblock(fd int) (nonblocking bool, err error) {
+	flag, e1 := Fcntl(fd, syscall.F_GETFL, 0)
+	if e1 != nil {
+		return false, e1
+	}
+	return flag&syscall.O_NONBLOCK != 0, nil
+}
+
+func HasNonblockFlag(flag int) bool {
+	return flag&syscall.O_NONBLOCK != 0
+}
diff --git a/src/internal/syscall/unix/nonblocking_wasip1.go b/src/internal/syscall/unix/nonblocking_wasip1.go
new file mode 100644
index 0000000..5b2b53b
--- /dev/null
+++ b/src/internal/syscall/unix/nonblocking_wasip1.go
@@ -0,0 +1,31 @@
+// Copyright 2023 The Go 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:build wasip1
+
+package unix
+
+import (
+	"syscall"
+	_ "unsafe" // for go:linkname
+)
+
+func IsNonblock(fd int) (nonblocking bool, err error) {
+	flags, e1 := fd_fdstat_get_flags(fd)
+	if e1 != nil {
+		return false, e1
+	}
+	return flags&syscall.FDFLAG_NONBLOCK != 0, nil
+}
+
+func HasNonblockFlag(flag int) bool {
+	return flag&syscall.FDFLAG_NONBLOCK != 0
+}
+
+// This helper is implemented in the syscall package. It means we don't have
+// to redefine the fd_fdstat_get host import or the fdstat struct it
+// populates.
+//
+//go:linkname fd_fdstat_get_flags syscall.fd_fdstat_get_flags
+func fd_fdstat_get_flags(fd int) (uint32, error)
diff --git a/src/internal/syscall/windows/net_windows.go b/src/internal/syscall/windows/net_windows.go
index 3d3df71..42c600c 100644
--- a/src/internal/syscall/windows/net_windows.go
+++ b/src/internal/syscall/windows/net_windows.go
@@ -5,6 +5,7 @@
 package windows
 
 import (
+	"sync"
 	"syscall"
 	_ "unsafe"
 )
@@ -16,3 +17,24 @@
 //go:linkname WSASendtoInet6 syscall.wsaSendtoInet6
 //go:noescape
 func WSASendtoInet6(s syscall.Handle, bufs *syscall.WSABuf, bufcnt uint32, sent *uint32, flags uint32, to *syscall.SockaddrInet6, overlapped *syscall.Overlapped, croutine *byte) (err error)
+
+const (
+	SIO_TCP_INITIAL_RTO                    = syscall.IOC_IN | syscall.IOC_VENDOR | 17
+	TCP_INITIAL_RTO_UNSPECIFIED_RTT        = ^uint16(0)
+	TCP_INITIAL_RTO_NO_SYN_RETRANSMISSIONS = ^uint8(1)
+)
+
+type TCP_INITIAL_RTO_PARAMETERS struct {
+	Rtt                   uint16
+	MaxSynRetransmissions uint8
+}
+
+var Support_TCP_INITIAL_RTO_NO_SYN_RETRANSMISSIONS = sync.OnceValue(func() bool {
+	var maj, min, build uint32
+	rtlGetNtVersionNumbers(&maj, &min, &build)
+	return maj >= 10 && build&0xffff >= 16299
+})
+
+//go:linkname rtlGetNtVersionNumbers syscall.rtlGetNtVersionNumbers
+//go:noescape
+func rtlGetNtVersionNumbers(majorVersion *uint32, minorVersion *uint32, buildNumber *uint32)
diff --git a/src/internal/syscall/windows/registry/value.go b/src/internal/syscall/windows/registry/value.go
index 0255740..7dfee03 100644
--- a/src/internal/syscall/windows/registry/value.go
+++ b/src/internal/syscall/windows/registry/value.go
@@ -217,7 +217,7 @@
 	from := 0
 	for i, c := range p {
 		if c == 0 {
-			val = append(val, string(utf16.Decode(p[from:i])))
+			val = append(val, syscall.UTF16ToString(p[from:i]))
 			from = i + 1
 		}
 	}
diff --git a/src/internal/syscall/windows/syscall_windows.go b/src/internal/syscall/windows/syscall_windows.go
index 8ace2a2..892b878 100644
--- a/src/internal/syscall/windows/syscall_windows.go
+++ b/src/internal/syscall/windows/syscall_windows.go
@@ -7,7 +7,6 @@
 import (
 	"sync"
 	"syscall"
-	"unicode/utf16"
 	"unsafe"
 )
 
@@ -17,17 +16,13 @@
 	if p == nil {
 		return ""
 	}
-	// Find NUL terminator.
 	end := unsafe.Pointer(p)
 	n := 0
 	for *(*uint16)(end) != 0 {
 		end = unsafe.Pointer(uintptr(end) + unsafe.Sizeof(*p))
 		n++
 	}
-	// Turn *uint16 into []uint16.
-	s := unsafe.Slice(p, n)
-	// Decode []uint16 into string.
-	return string(utf16.Decode(s))
+	return syscall.UTF16ToString(unsafe.Slice(p, n))
 }
 
 const (
@@ -127,6 +122,12 @@
 	/* more fields might be present here. */
 }
 
+type SecurityAttributes struct {
+	Length             uint16
+	SecurityDescriptor uintptr
+	InheritHandle      bool
+}
+
 type FILE_BASIC_INFO struct {
 	CreationTime   syscall.Filetime
 	LastAccessTime syscall.Filetime
@@ -151,6 +152,7 @@
 //sys	GetModuleFileName(module syscall.Handle, fn *uint16, len uint32) (n uint32, err error) = kernel32.GetModuleFileNameW
 //sys	SetFileInformationByHandle(handle syscall.Handle, fileInformationClass uint32, buf uintptr, bufsize uint32) (err error) = kernel32.SetFileInformationByHandle
 //sys	VirtualQuery(address uintptr, buffer *MemoryBasicInformation, length uintptr) (err error) = kernel32.VirtualQuery
+//sys	GetTempPath2(buflen uint32, buf *uint16) (n uint32, err error) = GetTempPath2W
 
 const (
 	// flags for CreateToolhelp32Snapshot
@@ -363,7 +365,15 @@
 	return procGetFinalPathNameByHandleW.Find()
 }
 
+func ErrorLoadingGetTempPath2() error {
+	return procGetTempPath2W.Find()
+}
+
 //sys	CreateEnvironmentBlock(block **uint16, token syscall.Token, inheritExisting bool) (err error) = userenv.CreateEnvironmentBlock
 //sys	DestroyEnvironmentBlock(block *uint16) (err error) = userenv.DestroyEnvironmentBlock
+//sys	CreateEvent(eventAttrs *SecurityAttributes, manualReset uint32, initialState uint32, name *uint16) (handle syscall.Handle, err error) = kernel32.CreateEventW
 
 //sys	RtlGenRandom(buf []byte) (err error) = advapi32.SystemFunction036
+
+//sys	RtlLookupFunctionEntry(pc uintptr, baseAddress *uintptr, table *byte) (ret uintptr) = kernel32.RtlLookupFunctionEntry
+//sys	RtlVirtualUnwind(handlerType uint32, baseAddress uintptr, pc uintptr, entry uintptr, ctxt uintptr, data *uintptr, frame *uintptr, ctxptrs *byte) (ret uintptr) = kernel32.RtlVirtualUnwind
diff --git a/src/internal/syscall/windows/zsyscall_windows.go b/src/internal/syscall/windows/zsyscall_windows.go
index afd64e3..a5c246b 100644
--- a/src/internal/syscall/windows/zsyscall_windows.go
+++ b/src/internal/syscall/windows/zsyscall_windows.go
@@ -54,6 +54,7 @@
 	procSetTokenInformation          = modadvapi32.NewProc("SetTokenInformation")
 	procSystemFunction036            = modadvapi32.NewProc("SystemFunction036")
 	procGetAdaptersAddresses         = modiphlpapi.NewProc("GetAdaptersAddresses")
+	procCreateEventW                 = modkernel32.NewProc("CreateEventW")
 	procGetACP                       = modkernel32.NewProc("GetACP")
 	procGetComputerNameExW           = modkernel32.NewProc("GetComputerNameExW")
 	procGetConsoleCP                 = modkernel32.NewProc("GetConsoleCP")
@@ -61,11 +62,14 @@
 	procGetFileInformationByHandleEx = modkernel32.NewProc("GetFileInformationByHandleEx")
 	procGetFinalPathNameByHandleW    = modkernel32.NewProc("GetFinalPathNameByHandleW")
 	procGetModuleFileNameW           = modkernel32.NewProc("GetModuleFileNameW")
+	procGetTempPath2W                = modkernel32.NewProc("GetTempPath2W")
 	procLockFileEx                   = modkernel32.NewProc("LockFileEx")
 	procModule32FirstW               = modkernel32.NewProc("Module32FirstW")
 	procModule32NextW                = modkernel32.NewProc("Module32NextW")
 	procMoveFileExW                  = modkernel32.NewProc("MoveFileExW")
 	procMultiByteToWideChar          = modkernel32.NewProc("MultiByteToWideChar")
+	procRtlLookupFunctionEntry       = modkernel32.NewProc("RtlLookupFunctionEntry")
+	procRtlVirtualUnwind             = modkernel32.NewProc("RtlVirtualUnwind")
 	procSetFileInformationByHandle   = modkernel32.NewProc("SetFileInformationByHandle")
 	procUnlockFileEx                 = modkernel32.NewProc("UnlockFileEx")
 	procVirtualQuery                 = modkernel32.NewProc("VirtualQuery")
@@ -164,6 +168,15 @@
 	return
 }
 
+func CreateEvent(eventAttrs *SecurityAttributes, manualReset uint32, initialState uint32, name *uint16) (handle syscall.Handle, err error) {
+	r0, _, e1 := syscall.Syscall6(procCreateEventW.Addr(), 4, uintptr(unsafe.Pointer(eventAttrs)), uintptr(manualReset), uintptr(initialState), uintptr(unsafe.Pointer(name)), 0, 0)
+	handle = syscall.Handle(r0)
+	if handle == 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
 func GetACP() (acp uint32) {
 	r0, _, _ := syscall.Syscall(procGetACP.Addr(), 0, 0, 0, 0)
 	acp = uint32(r0)
@@ -219,6 +232,15 @@
 	return
 }
 
+func GetTempPath2(buflen uint32, buf *uint16) (n uint32, err error) {
+	r0, _, e1 := syscall.Syscall(procGetTempPath2W.Addr(), 2, uintptr(buflen), uintptr(unsafe.Pointer(buf)), 0)
+	n = uint32(r0)
+	if n == 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
 func LockFileEx(file syscall.Handle, flags uint32, reserved uint32, bytesLow uint32, bytesHigh uint32, overlapped *syscall.Overlapped) (err error) {
 	r1, _, e1 := syscall.Syscall6(procLockFileEx.Addr(), 6, uintptr(file), uintptr(flags), uintptr(reserved), uintptr(bytesLow), uintptr(bytesHigh), uintptr(unsafe.Pointer(overlapped)))
 	if r1 == 0 {
@@ -260,6 +282,18 @@
 	return
 }
 
+func RtlLookupFunctionEntry(pc uintptr, baseAddress *uintptr, table *byte) (ret uintptr) {
+	r0, _, _ := syscall.Syscall(procRtlLookupFunctionEntry.Addr(), 3, uintptr(pc), uintptr(unsafe.Pointer(baseAddress)), uintptr(unsafe.Pointer(table)))
+	ret = uintptr(r0)
+	return
+}
+
+func RtlVirtualUnwind(handlerType uint32, baseAddress uintptr, pc uintptr, entry uintptr, ctxt uintptr, data *uintptr, frame *uintptr, ctxptrs *byte) (ret uintptr) {
+	r0, _, _ := syscall.Syscall9(procRtlVirtualUnwind.Addr(), 8, uintptr(handlerType), uintptr(baseAddress), uintptr(pc), uintptr(entry), uintptr(ctxt), uintptr(unsafe.Pointer(data)), uintptr(unsafe.Pointer(frame)), uintptr(unsafe.Pointer(ctxptrs)), 0)
+	ret = uintptr(r0)
+	return
+}
+
 func SetFileInformationByHandle(handle syscall.Handle, fileInformationClass uint32, buf uintptr, bufsize uint32) (err error) {
 	r1, _, e1 := syscall.Syscall6(procSetFileInformationByHandle.Addr(), 4, uintptr(handle), uintptr(fileInformationClass), uintptr(buf), uintptr(bufsize), 0, 0)
 	if r1 == 0 {
diff --git a/src/internal/testenv/exec.go b/src/internal/testenv/exec.go
index 77de59c..50d3b0d 100644
--- a/src/internal/testenv/exec.go
+++ b/src/internal/testenv/exec.go
@@ -6,6 +6,8 @@
 
 import (
 	"context"
+	"errors"
+	"fmt"
 	"os"
 	"os/exec"
 	"runtime"
@@ -16,25 +18,67 @@
 	"time"
 )
 
-// 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 "js", "ios":
-		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.
+//
+// On some platforms MustHaveExec checks for exec support by re-executing the
+// current executable, which must be a binary built by 'go test'.
+// We intentionally do not provide a HasExec function because of the risk of
+// inappropriate recursion in TestMain functions.
+//
+// To check for exec support outside of a test, just try to exec the command.
+// If exec is not supported, testenv.SyscallIsNotSupported will return true
+// for the resulting error.
 func MustHaveExec(t testing.TB) {
-	if !HasExec() {
-		t.Skipf("skipping test: cannot exec subprocess on %s/%s", runtime.GOOS, runtime.GOARCH)
+	tryExecOnce.Do(func() {
+		tryExecErr = tryExec()
+	})
+	if tryExecErr != nil {
+		t.Skipf("skipping test: cannot exec subprocess on %s/%s: %v", runtime.GOOS, runtime.GOARCH, tryExecErr)
 	}
 }
 
+var (
+	tryExecOnce sync.Once
+	tryExecErr  error
+)
+
+func tryExec() error {
+	switch runtime.GOOS {
+	case "wasip1", "js", "ios":
+	default:
+		// Assume that exec always works on non-mobile platforms and Android.
+		return nil
+	}
+
+	// ios has an exec syscall but on real iOS devices it might return a
+	// permission error. In an emulated environment (such as a Corellium host)
+	// it might succeed, so if we need to exec we'll just have to try it and
+	// find out.
+	//
+	// As of 2023-04-19 wasip1 and js don't have exec syscalls at all, but we
+	// may as well use the same path so that this branch can be tested without
+	// an ios environment.
+
+	if !testing.Testing() {
+		// This isn't a standard 'go test' binary, so we don't know how to
+		// self-exec in a way that should succeed without side effects.
+		// Just forget it.
+		return errors.New("can't probe for exec support with a non-test executable")
+	}
+
+	// We know that this is a test executable. We should be able to run it with a
+	// no-op flag to check for overall exec support.
+	exe, err := os.Executable()
+	if err != nil {
+		return fmt.Errorf("can't probe for exec support: %w", err)
+	}
+	cmd := exec.Command(exe, "-test.list=^$")
+	cmd.Env = origEnv
+	return cmd.Run()
+}
+
 var execPaths sync.Map // path -> error
 
 // MustHaveExecPath checks that the current system can start the named executable
@@ -119,8 +163,8 @@
 			// grace periods to clean up: one for the delay between the first
 			// termination signal being sent (via the Cancel callback when the Context
 			// expires) and the process being forcibly terminated (via the WaitDelay
-			// field), and a second one for the delay becween the process being
-			// terminated and and the test logging its output for debugging.
+			// field), and a second one for the delay between the process being
+			// terminated and the test logging its output for debugging.
 			//
 			// (We want to ensure that the test process itself has enough time to
 			// log the output before it is also terminated.)
diff --git a/src/internal/testenv/testenv.go b/src/internal/testenv/testenv.go
index 6a28b25..31b58dd 100644
--- a/src/internal/testenv/testenv.go
+++ b/src/internal/testenv/testenv.go
@@ -11,11 +11,11 @@
 package testenv
 
 import (
+	"bytes"
 	"errors"
 	"flag"
 	"fmt"
 	"internal/cfg"
-	"internal/goroot"
 	"internal/platform"
 	"os"
 	"os/exec"
@@ -27,6 +27,12 @@
 	"testing"
 )
 
+// Save the original environment during init for use in checks. A test
+// binary may modify its environment before calling HasExec to change its
+// behavior (such as mimicking a command-line tool), and that modified
+// environment might cause environment checks to behave erratically.
+var origEnv = os.Environ()
+
 // 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,
@@ -45,22 +51,76 @@
 		// run go build.
 		return false
 	}
-	switch runtime.GOOS {
-	case "android", "js", "ios":
-		return false
-	}
-	return true
+
+	goBuildOnce.Do(func() {
+		// To run 'go build', we need to be able to exec a 'go' command.
+		// We somewhat arbitrarily choose to exec 'go tool -n compile' because that
+		// also confirms that cmd/go can find the compiler. (Before CL 472096,
+		// we sometimes ended up with cmd/go installed in the test environment
+		// without a cmd/compile it could use to actually build things.)
+		cmd := exec.Command("go", "tool", "-n", "compile")
+		cmd.Env = origEnv
+		out, err := cmd.Output()
+		if err != nil {
+			goBuildErr = fmt.Errorf("%v: %w", cmd, err)
+			return
+		}
+		out = bytes.TrimSpace(out)
+		if len(out) == 0 {
+			goBuildErr = fmt.Errorf("%v: no tool reported", cmd)
+			return
+		}
+		if _, err := exec.LookPath(string(out)); err != nil {
+			goBuildErr = err
+			return
+		}
+
+		if platform.MustLinkExternal(runtime.GOOS, runtime.GOARCH, false) {
+			// We can assume that we always have a complete Go toolchain available.
+			// However, this platform requires a C linker to build even pure Go
+			// programs, including tests. Do we have one in the test environment?
+			// (On Android, for example, the device running the test might not have a
+			// C toolchain installed.)
+			//
+			// If CC is set explicitly, assume that we do. Otherwise, use 'go env CC'
+			// to determine which toolchain it would use by default.
+			if os.Getenv("CC") == "" {
+				cmd := exec.Command("go", "env", "CC")
+				cmd.Env = origEnv
+				out, err := cmd.Output()
+				if err != nil {
+					goBuildErr = fmt.Errorf("%v: %w", cmd, err)
+					return
+				}
+				out = bytes.TrimSpace(out)
+				if len(out) == 0 {
+					goBuildErr = fmt.Errorf("%v: no CC reported", cmd)
+					return
+				}
+				_, goBuildErr = exec.LookPath(string(out))
+			}
+		}
+	})
+
+	return goBuildErr == nil
 }
 
+var (
+	goBuildOnce sync.Once
+	goBuildErr  error
+)
+
 // 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.TB) {
 	if os.Getenv("GO_GCFLAGS") != "" {
+		t.Helper()
 		t.Skipf("skipping test: 'go build' not compatible with setting $GO_GCFLAGS")
 	}
 	if !HasGoBuild() {
-		t.Skipf("skipping test: 'go build' not available on %s/%s", runtime.GOOS, runtime.GOARCH)
+		t.Helper()
+		t.Skipf("skipping test: 'go build' unavailable: %v", goBuildErr)
 	}
 }
 
@@ -78,6 +138,25 @@
 	}
 }
 
+// HasParallelism reports whether the current system can execute multiple
+// threads in parallel.
+// There is a copy of this function in cmd/dist/test.go.
+func HasParallelism() bool {
+	switch runtime.GOOS {
+	case "js", "wasip1":
+		return false
+	}
+	return true
+}
+
+// MustHaveParallelism checks that the current system can execute multiple
+// threads in parallel. If not, MustHaveParallelism calls t.Skip with an explanation.
+func MustHaveParallelism(t testing.TB) {
+	if !HasParallelism() {
+		t.Skipf("skipping test: no parallelism available on %s/%s", runtime.GOOS, runtime.GOARCH)
+	}
+}
+
 // GoToolPath reports the path to the Go tool.
 // It is a convenience wrapper around GoTool.
 // If the tool is unavailable GoToolPath calls t.Skip.
@@ -125,6 +204,9 @@
 		// runs the test in the directory containing the packaged under test.) That
 		// means that if we start walking up the tree, we should eventually find
 		// GOROOT/src/go.mod, and we can report the parent directory of that.
+		//
+		// Notably, this works even if we can't run 'go env GOROOT' as a
+		// subprocess.
 
 		cwd, err := os.Getwd()
 		if err != nil {
@@ -175,7 +257,8 @@
 
 // GOROOT reports the path to the directory containing the root of the Go
 // project source tree. This is normally equivalent to runtime.GOROOT, but
-// works even if the test binary was built with -trimpath.
+// works even if the test binary was built with -trimpath and cannot exec
+// 'go env GOROOT'.
 //
 // If GOROOT cannot be found, GOROOT skips t if t is non-nil,
 // or panics otherwise.
@@ -196,25 +279,18 @@
 	if !HasGoBuild() {
 		return "", errors.New("platform cannot run go tool")
 	}
-	var exeSuffix string
-	if runtime.GOOS == "windows" {
-		exeSuffix = ".exe"
-	}
-	goroot, err := findGOROOT()
-	if err != nil {
-		return "", fmt.Errorf("cannot find go tool: %w", err)
-	}
-	path := filepath.Join(goroot, "bin", "go"+exeSuffix)
-	if _, err := os.Stat(path); err == nil {
-		return path, nil
-	}
-	goBin, err := exec.LookPath("go" + exeSuffix)
-	if err != nil {
-		return "", errors.New("cannot find go tool: " + err.Error())
-	}
-	return goBin, nil
+	goToolOnce.Do(func() {
+		goToolPath, goToolErr = exec.LookPath("go")
+	})
+	return goToolPath, goToolErr
 }
 
+var (
+	goToolOnce sync.Once
+	goToolPath string
+	goToolErr  error
+)
+
 // HasSrc reports whether the entire source tree is available under GOROOT.
 func HasSrc() bool {
 	switch runtime.GOOS {
@@ -227,50 +303,83 @@
 // HasExternalNetwork reports whether the current system can use
 // external (non-localhost) networks.
 func HasExternalNetwork() bool {
-	return !testing.Short() && runtime.GOOS != "js"
+	return !testing.Short() && runtime.GOOS != "js" && runtime.GOOS != "wasip1"
 }
 
 // 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.TB) {
-	if runtime.GOOS == "js" {
+	if runtime.GOOS == "js" || runtime.GOOS == "wasip1" {
+		t.Helper()
 		t.Skipf("skipping test: no external network on %s", runtime.GOOS)
 	}
 	if testing.Short() {
+		t.Helper()
 		t.Skipf("skipping test: no external network in -short mode")
 	}
 }
 
-var haveCGO bool
-
 // HasCGO reports whether the current system can use cgo.
 func HasCGO() bool {
-	return haveCGO
+	hasCgoOnce.Do(func() {
+		goTool, err := GoTool()
+		if err != nil {
+			return
+		}
+		cmd := exec.Command(goTool, "env", "CGO_ENABLED")
+		cmd.Env = origEnv
+		out, err := cmd.Output()
+		if err != nil {
+			panic(fmt.Sprintf("%v: %v", cmd, out))
+		}
+		hasCgo, err = strconv.ParseBool(string(bytes.TrimSpace(out)))
+		if err != nil {
+			panic(fmt.Sprintf("%v: non-boolean output %q", cmd, out))
+		}
+	})
+	return hasCgo
 }
 
+var (
+	hasCgoOnce sync.Once
+	hasCgo     bool
+)
+
 // MustHaveCGO calls t.Skip if cgo is not available.
 func MustHaveCGO(t testing.TB) {
-	if !haveCGO {
+	if !HasCGO() {
 		t.Skipf("skipping test: no cgo")
 	}
 }
 
 // CanInternalLink reports whether the current system can link programs with
 // internal linking.
-func CanInternalLink() bool {
-	return !platform.MustLinkExternal(runtime.GOOS, runtime.GOARCH)
+func CanInternalLink(withCgo bool) bool {
+	return !platform.MustLinkExternal(runtime.GOOS, runtime.GOARCH, withCgo)
 }
 
 // MustInternalLink checks that the current system can link programs with internal
 // linking.
 // If not, MustInternalLink calls t.Skip with an explanation.
-func MustInternalLink(t testing.TB) {
-	if !CanInternalLink() {
+func MustInternalLink(t testing.TB, withCgo bool) {
+	if !CanInternalLink(withCgo) {
+		if withCgo && CanInternalLink(false) {
+			t.Skipf("skipping test: internal linking on %s/%s is not supported with cgo", runtime.GOOS, runtime.GOARCH)
+		}
 		t.Skipf("skipping test: internal linking on %s/%s is not supported", runtime.GOOS, runtime.GOARCH)
 	}
 }
 
+// MustHaveBuildMode reports whether the current system can build programs in
+// the given build mode.
+// If not, MustHaveBuildMode calls t.Skip with an explanation.
+func MustHaveBuildMode(t testing.TB, buildmode string) {
+	if !platform.BuildModeSupported(runtime.Compiler, buildmode, runtime.GOOS, runtime.GOARCH) {
+		t.Skipf("skipping test: build mode %s on %s/%s is not supported by the %s compiler", buildmode, runtime.GOOS, runtime.GOARCH, runtime.Compiler)
+	}
+}
+
 // HasSymlink reports whether the current system can use os.Symlink.
 func HasSymlink() bool {
 	ok, _ := hasSymlink()
@@ -282,7 +391,7 @@
 func MustHaveSymlink(t testing.TB) {
 	ok, reason := hasSymlink()
 	if !ok {
-		t.Skipf("skipping test: cannot make symlinks on %s/%s%s", runtime.GOOS, runtime.GOARCH, reason)
+		t.Skipf("skipping test: cannot make symlinks on %s/%s: %s", runtime.GOOS, runtime.GOARCH, reason)
 	}
 }
 
@@ -321,7 +430,7 @@
 // CPUIsSlow reports whether the CPU running the test is suspected to be slow.
 func CPUIsSlow() bool {
 	switch runtime.GOARCH {
-	case "arm", "mips", "mipsle", "mips64", "mips64le":
+	case "arm", "mips", "mipsle", "mips64", "mips64le", "wasm":
 		return true
 	}
 	return false
@@ -347,18 +456,51 @@
 }
 
 // WriteImportcfg writes an importcfg file used by the compiler or linker to
-// dstPath containing entries for the packages in std and cmd in addition
-// to the package to package file mappings in additionalPackageFiles.
-func WriteImportcfg(t testing.TB, dstPath string, additionalPackageFiles map[string]string) {
-	importcfg, err := goroot.Importcfg()
-	for k, v := range additionalPackageFiles {
-		importcfg += fmt.Sprintf("\npackagefile %s=%s", k, v)
+// dstPath containing entries for the file mappings in packageFiles, as well
+// as for the packages transitively imported by the package(s) in pkgs.
+//
+// pkgs may include any package pattern that is valid to pass to 'go list',
+// so it may also be a list of Go source files all in the same directory.
+func WriteImportcfg(t testing.TB, dstPath string, packageFiles map[string]string, pkgs ...string) {
+	t.Helper()
+
+	icfg := new(bytes.Buffer)
+	icfg.WriteString("# import config\n")
+	for k, v := range packageFiles {
+		fmt.Fprintf(icfg, "packagefile %s=%s\n", k, v)
 	}
-	if err != nil {
-		t.Fatalf("preparing the importcfg failed: %s", err)
+
+	if len(pkgs) > 0 {
+		// Use 'go list' to resolve any missing packages and rewrite the import map.
+		cmd := Command(t, GoToolPath(t), "list", "-export", "-deps", "-f", `{{if ne .ImportPath "command-line-arguments"}}{{if .Export}}{{.ImportPath}}={{.Export}}{{end}}{{end}}`)
+		cmd.Args = append(cmd.Args, pkgs...)
+		cmd.Stderr = new(strings.Builder)
+		out, err := cmd.Output()
+		if err != nil {
+			t.Fatalf("%v: %v\n%s", cmd, err, cmd.Stderr)
+		}
+
+		for _, line := range strings.Split(string(out), "\n") {
+			if line == "" {
+				continue
+			}
+			importPath, export, ok := strings.Cut(line, "=")
+			if !ok {
+				t.Fatalf("invalid line in output from %v:\n%s", cmd, line)
+			}
+			if packageFiles[importPath] == "" {
+				fmt.Fprintf(icfg, "packagefile %s=%s\n", importPath, export)
+			}
+		}
 	}
-	err = os.WriteFile(dstPath, []byte(importcfg), 0655)
-	if err != nil {
-		t.Fatalf("writing the importcfg failed: %s", err)
+
+	if err := os.WriteFile(dstPath, icfg.Bytes(), 0666); err != nil {
+		t.Fatal(err)
 	}
 }
+
+// SyscallIsNotSupported reports whether err may indicate that a system call is
+// not supported by the current platform or execution environment.
+func SyscallIsNotSupported(err error) bool {
+	return syscallIsNotSupported(err)
+}
diff --git a/src/internal/testenv/testenv_cgo.go b/src/internal/testenv/testenv_cgo.go
deleted file mode 100644
index 7426a29..0000000
--- a/src/internal/testenv/testenv_cgo.go
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2017 The Go 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:build cgo
-
-package testenv
-
-func init() {
-	haveCGO = true
-}
diff --git a/src/internal/testenv/testenv_notunix.go b/src/internal/testenv/testenv_notunix.go
index 180206b..a7df5f5 100644
--- a/src/internal/testenv/testenv_notunix.go
+++ b/src/internal/testenv/testenv_notunix.go
@@ -2,12 +2,20 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build windows || plan9 || (js && wasm)
+//go:build windows || plan9 || (js && wasm) || wasip1
 
 package testenv
 
-import "os"
+import (
+	"errors"
+	"io/fs"
+	"os"
+)
 
 // Sigquit is the signal to send to kill a hanging subprocess.
 // On Unix we send SIGQUIT, but on non-Unix we only have os.Kill.
 var Sigquit = os.Kill
+
+func syscallIsNotSupported(err error) bool {
+	return errors.Is(err, fs.ErrPermission) || errors.Is(err, errors.ErrUnsupported)
+}
diff --git a/src/internal/testenv/testenv_notwin.go b/src/internal/testenv/testenv_notwin.go
index 81171fd..30e159a 100644
--- a/src/internal/testenv/testenv_notwin.go
+++ b/src/internal/testenv/testenv_notwin.go
@@ -7,13 +7,39 @@
 package testenv
 
 import (
+	"fmt"
+	"os"
+	"path/filepath"
 	"runtime"
 )
 
 func hasSymlink() (ok bool, reason string) {
 	switch runtime.GOOS {
-	case "android", "plan9":
+	case "plan9":
 		return false, ""
+	case "android", "wasip1":
+		// For wasip1, some runtimes forbid absolute symlinks,
+		// or symlinks that escape the current working directory.
+		// Perform a simple test to see whether the runtime
+		// supports symlinks or not. If we get a permission
+		// error, the runtime does not support symlinks.
+		dir, err := os.MkdirTemp("", "")
+		if err != nil {
+			return false, ""
+		}
+		defer func() {
+			_ = os.RemoveAll(dir)
+		}()
+		fpath := filepath.Join(dir, "testfile.txt")
+		if err := os.WriteFile(fpath, nil, 0644); err != nil {
+			return false, ""
+		}
+		if err := os.Symlink(fpath, filepath.Join(dir, "testlink")); err != nil {
+			if SyscallIsNotSupported(err) {
+				return false, fmt.Sprintf("symlinks unsupported: %s", err.Error())
+			}
+			return false, ""
+		}
 	}
 
 	return true, ""
diff --git a/src/internal/testenv/testenv_test.go b/src/internal/testenv/testenv_test.go
index ebc27f1..d748e41 100644
--- a/src/internal/testenv/testenv_test.go
+++ b/src/internal/testenv/testenv_test.go
@@ -5,10 +5,12 @@
 package testenv_test
 
 import (
+	"internal/platform"
 	"internal/testenv"
 	"os"
 	"path/filepath"
 	"runtime"
+	"strings"
 	"testing"
 )
 
@@ -51,3 +53,113 @@
 		t.Fatalf("%q is not the same file as %q", absWant, goTool)
 	}
 }
+
+func TestHasGoBuild(t *testing.T) {
+	if !testenv.HasGoBuild() {
+		switch runtime.GOOS {
+		case "js", "wasip1":
+			// No exec syscall, so these shouldn't be able to 'go build'.
+			t.Logf("HasGoBuild is false on %s", runtime.GOOS)
+			return
+		}
+
+		b := testenv.Builder()
+		if b == "" {
+			// We shouldn't make assumptions about what kind of sandbox or build
+			// environment external Go users may be running in.
+			t.Skipf("skipping: 'go build' unavailable")
+		}
+
+		// Since we control the Go builders, we know which ones ought
+		// to be able to run 'go build'. Check that they can.
+		//
+		// (Note that we don't verify that any builders *can't* run 'go build'.
+		// If a builder starts running 'go build' tests when it shouldn't,
+		// we will presumably find out about it when those tests fail.)
+		switch runtime.GOOS {
+		case "ios":
+			if strings.HasSuffix(b, "-corellium") {
+				// The corellium environment is self-hosting, so it should be able
+				// to build even though real "ios" devices can't exec.
+			} else {
+				// The usual iOS sandbox does not allow the app to start another
+				// process. If we add builders on stock iOS devices, they presumably
+				// will not be able to exec, so we may as well allow that now.
+				t.Logf("HasGoBuild is false on %s", b)
+				return
+			}
+		case "android":
+			if strings.HasSuffix(b, "-emu") && platform.MustLinkExternal(runtime.GOOS, runtime.GOARCH, false) {
+				// As of 2023-05-02, the test environment on the emulated builders is
+				// missing a C linker.
+				t.Logf("HasGoBuild is false on %s", b)
+				return
+			}
+		}
+
+		if strings.HasSuffix(b, "-noopt") {
+			// The -noopt builder sets GO_GCFLAGS, which causes tests of 'go build' to
+			// be skipped.
+			t.Logf("HasGoBuild is false on %s", b)
+			return
+		}
+
+		t.Fatalf("HasGoBuild unexpectedly false on %s", b)
+	}
+
+	t.Logf("HasGoBuild is true; checking consistency with other functions")
+
+	hasExec := false
+	hasExecGo := false
+	t.Run("MustHaveExec", func(t *testing.T) {
+		testenv.MustHaveExec(t)
+		hasExec = true
+	})
+	t.Run("MustHaveExecPath", func(t *testing.T) {
+		testenv.MustHaveExecPath(t, "go")
+		hasExecGo = true
+	})
+	if !hasExec {
+		t.Errorf(`MustHaveExec(t) skipped unexpectedly`)
+	}
+	if !hasExecGo {
+		t.Errorf(`MustHaveExecPath(t, "go") skipped unexpectedly`)
+	}
+
+	dir := t.TempDir()
+	mainGo := filepath.Join(dir, "main.go")
+	if err := os.WriteFile(mainGo, []byte("package main\nfunc main() {}\n"), 0644); err != nil {
+		t.Fatal(err)
+	}
+	cmd := testenv.Command(t, "go", "build", "-o", os.DevNull, mainGo)
+	out, err := cmd.CombinedOutput()
+	if err != nil {
+		t.Fatalf("%v: %v\n%s", cmd, err, out)
+	}
+}
+
+func TestMustHaveExec(t *testing.T) {
+	hasExec := false
+	t.Run("MustHaveExec", func(t *testing.T) {
+		testenv.MustHaveExec(t)
+		t.Logf("MustHaveExec did not skip")
+		hasExec = true
+	})
+
+	switch runtime.GOOS {
+	case "js", "wasip1":
+		if hasExec {
+			// js and wasip1 lack an “exec” syscall.
+			t.Errorf("expected MustHaveExec to skip on %v", runtime.GOOS)
+		}
+	case "ios":
+		if b := testenv.Builder(); strings.HasSuffix(b, "-corellium") && !hasExec {
+			// Most ios environments can't exec, but the corellium builder can.
+			t.Errorf("expected MustHaveExec not to skip on %v", b)
+		}
+	default:
+		if b := testenv.Builder(); b != "" && !hasExec {
+			t.Errorf("expected MustHaveExec not to skip on %v", b)
+		}
+	}
+}
diff --git a/src/internal/testenv/testenv_unix.go b/src/internal/testenv/testenv_unix.go
index a97e88d..a629078 100644
--- a/src/internal/testenv/testenv_unix.go
+++ b/src/internal/testenv/testenv_unix.go
@@ -6,8 +6,38 @@
 
 package testenv
 
-import "syscall"
+import (
+	"errors"
+	"io/fs"
+	"syscall"
+)
 
 // Sigquit is the signal to send to kill a hanging subprocess.
 // Send SIGQUIT to get a stack trace.
 var Sigquit = syscall.SIGQUIT
+
+func syscallIsNotSupported(err error) bool {
+	if err == nil {
+		return false
+	}
+
+	var errno syscall.Errno
+	if errors.As(err, &errno) {
+		switch errno {
+		case syscall.EPERM, syscall.EROFS:
+			// User lacks permission: either the call requires root permission and the
+			// user is not root, or the call is denied by a container security policy.
+			return true
+		case syscall.EINVAL:
+			// Some containers return EINVAL instead of EPERM if a system call is
+			// denied by security policy.
+			return true
+		}
+	}
+
+	if errors.Is(err, fs.ErrPermission) || errors.Is(err, errors.ErrUnsupported) {
+		return true
+	}
+
+	return false
+}
diff --git a/src/internal/testpty/pty_cgo.go b/src/internal/testpty/pty_cgo.go
index 1db6a92..442fbcf 100644
--- a/src/internal/testpty/pty_cgo.go
+++ b/src/internal/testpty/pty_cgo.go
@@ -18,14 +18,14 @@
 
 func open() (pty *os.File, processTTY string, err error) {
 	m, err := C.posix_openpt(C.O_RDWR)
-	if err != nil {
+	if m < 0 {
 		return nil, "", ptyError("posix_openpt", err)
 	}
-	if _, err := C.grantpt(m); err != nil {
+	if res, err := C.grantpt(m); res < 0 {
 		C.close(m)
 		return nil, "", ptyError("grantpt", err)
 	}
-	if _, err := C.unlockpt(m); err != nil {
+	if res, err := C.unlockpt(m); res < 0 {
 		C.close(m)
 		return nil, "", ptyError("unlockpt", err)
 	}
diff --git a/src/internal/trace/gc.go b/src/internal/trace/gc.go
index c1bc862..3bd284e 100644
--- a/src/internal/trace/gc.go
+++ b/src/internal/trace/gc.go
@@ -27,6 +27,7 @@
 
 const (
 	// UtilSTW means utilization should account for STW events.
+	// This includes non-GC STW events, which are typically user-requested.
 	UtilSTW UtilFlags = 1 << iota
 	// UtilBackground means utilization should account for
 	// background mark workers.
@@ -93,11 +94,11 @@
 				}
 				ps = append(ps, perP{series: series})
 			}
-		case EvGCSTWStart:
+		case EvSTWStart:
 			if flags&UtilSTW != 0 {
 				stw++
 			}
-		case EvGCSTWDone:
+		case EvSTWDone:
 			if flags&UtilSTW != 0 {
 				stw--
 			}
diff --git a/src/internal/trace/parser.go b/src/internal/trace/parser.go
index b091a85..67fa60b 100644
--- a/src/internal/trace/parser.go
+++ b/src/internal/trace/parser.go
@@ -151,7 +151,7 @@
 		return
 	}
 	switch ver {
-	case 1005, 1007, 1008, 1009, 1010, 1011, 1019:
+	case 1005, 1007, 1008, 1009, 1010, 1011, 1019, 1021:
 		// Note: When adding a new version, confirm that canned traces from the
 		// old version are part of the test suite. Add them using mkcanned.bash.
 		break
@@ -420,18 +420,29 @@
 				if raw.typ == EvGoStartLabel {
 					e.SArgs = []string{strings[e.Args[2]]}
 				}
-			case EvGCSTWStart:
+			case EvSTWStart:
 				e.G = 0
-				switch e.Args[0] {
-				case 0:
-					e.SArgs = []string{"mark termination"}
-				case 1:
-					e.SArgs = []string{"sweep termination"}
-				default:
-					err = fmt.Errorf("unknown STW kind %d", e.Args[0])
-					return
+				if ver < 1021 {
+					switch e.Args[0] {
+					case 0:
+						e.SArgs = []string{"mark termination"}
+					case 1:
+						e.SArgs = []string{"sweep termination"}
+					default:
+						err = fmt.Errorf("unknown STW kind %d", e.Args[0])
+						return
+					}
+				} else if ver == 1021 {
+					if kind := e.Args[0]; kind < uint64(len(stwReasonStringsGo121)) {
+						e.SArgs = []string{stwReasonStringsGo121[kind]}
+					} else {
+						e.SArgs = []string{"unknown"}
+					}
+				} else {
+					// Can't make any assumptions.
+					e.SArgs = []string{"unknown"}
 				}
-			case EvGCStart, EvGCDone, EvGCSTWDone:
+			case EvGCStart, EvGCDone, EvSTWDone:
 				e.G = 0
 			case EvGoEnd, EvGoStop, EvGoSched, EvGoPreempt,
 				EvGoSleep, EvGoBlock, EvGoBlockSend, EvGoBlockRecv,
@@ -653,20 +664,20 @@
 			}
 			evGC.Link = ev
 			evGC = nil
-		case EvGCSTWStart:
+		case EvSTWStart:
 			evp := &evSTW
 			if ver < 1010 {
-				// Before 1.10, EvGCSTWStart was per-P.
+				// Before 1.10, EvSTWStart was per-P.
 				evp = &p.evSTW
 			}
 			if *evp != nil {
 				return fmt.Errorf("previous STW is not ended before a new one (offset %v, time %v)", ev.Off, ev.Ts)
 			}
 			*evp = ev
-		case EvGCSTWDone:
+		case EvSTWDone:
 			evp := &evSTW
 			if ver < 1010 {
-				// Before 1.10, EvGCSTWDone was per-P.
+				// Before 1.10, EvSTWDone was per-P.
 				evp = &p.evSTW
 			}
 			if *evp == nil {
@@ -1015,7 +1026,7 @@
 		if ver < 1007 {
 			narg-- // 1.7 added an additional seq arg
 		}
-	case EvGCSTWStart:
+	case EvSTWStart:
 		if ver < 1010 {
 			narg-- // 1.10 added an argument
 		}
@@ -1038,8 +1049,8 @@
 	EvProcStop          = 6  // stop of P [timestamp]
 	EvGCStart           = 7  // GC start [timestamp, seq, stack id]
 	EvGCDone            = 8  // GC done [timestamp]
-	EvGCSTWStart        = 9  // GC mark termination start [timestamp, kind]
-	EvGCSTWDone         = 10 // GC mark termination done [timestamp]
+	EvSTWStart          = 9  // GC mark termination start [timestamp, kind]
+	EvSTWDone           = 10 // GC mark termination done [timestamp]
 	EvGCSweepStart      = 11 // GC sweep start [timestamp, stack id]
 	EvGCSweepDone       = 12 // GC sweep done [timestamp, swept, reclaimed]
 	EvGoCreate          = 13 // goroutine creation [timestamp, new goroutine id, new stack id, stack id]
@@ -1074,11 +1085,11 @@
 	EvGoBlockGC         = 42 // goroutine blocks on GC assist [timestamp, stack]
 	EvGCMarkAssistStart = 43 // GC mark assist start [timestamp, stack]
 	EvGCMarkAssistDone  = 44 // GC mark assist done [timestamp]
-	EvUserTaskCreate    = 45 // trace.NewContext [timestamp, internal task id, internal parent id, stack, name string]
+	EvUserTaskCreate    = 45 // trace.NewTask [timestamp, internal task id, internal parent id, name string, stack]
 	EvUserTaskEnd       = 46 // end of task [timestamp, internal task id, stack]
-	EvUserRegion        = 47 // trace.WithRegion [timestamp, internal task id, mode(0:start, 1:end), stack, name string]
+	EvUserRegion        = 47 // trace.WithRegion [timestamp, internal task id, mode(0:start, 1:end), name string, stack]
 	EvUserLog           = 48 // trace.Log [timestamp, internal id, key string id, stack, value string]
-	EvCPUSample         = 49 // CPU profiling sample [timestamp, stack, real timestamp, real P id (-1 when absent), goroutine id]
+	EvCPUSample         = 49 // CPU profiling sample [timestamp, real timestamp, real P id (-1 when absent), goroutine id, stack]
 	EvCount             = 50
 )
 
@@ -1098,8 +1109,8 @@
 	EvProcStop:          {"ProcStop", 1005, false, []string{}, nil},
 	EvGCStart:           {"GCStart", 1005, true, []string{"seq"}, nil}, // in 1.5 format it was {}
 	EvGCDone:            {"GCDone", 1005, false, []string{}, nil},
-	EvGCSTWStart:        {"GCSTWStart", 1005, false, []string{"kindid"}, []string{"kind"}}, // <= 1.9, args was {} (implicitly {0})
-	EvGCSTWDone:         {"GCSTWDone", 1005, false, []string{}, nil},
+	EvSTWStart:          {"STWStart", 1005, false, []string{"kindid"}, []string{"kind"}}, // <= 1.9, args was {} (implicitly {0})
+	EvSTWDone:           {"STWDone", 1005, false, []string{}, nil},
 	EvGCSweepStart:      {"GCSweepStart", 1005, true, []string{}, nil},
 	EvGCSweepDone:       {"GCSweepDone", 1005, false, []string{"swept", "reclaimed"}, nil}, // before 1.9, format was {}
 	EvGoCreate:          {"GoCreate", 1005, true, []string{"g", "stack"}, nil},
@@ -1140,3 +1151,24 @@
 	EvUserLog:           {"UserLog", 1011, true, []string{"id", "keyid"}, []string{"category", "message"}},
 	EvCPUSample:         {"CPUSample", 1019, true, []string{"ts", "p", "g"}, nil},
 }
+
+// Copied from src/runtime/proc.go:stwReasonStrings in Go 1.21.
+var stwReasonStringsGo121 = [...]string{
+	"unknown",
+	"GC mark termination",
+	"GC sweep termination",
+	"write heap dump",
+	"goroutine profile",
+	"goroutine profile cleanup",
+	"all goroutines stack trace",
+	"read mem stats",
+	"AllThreadsSyscall",
+	"GOMAXPROCS",
+	"start trace",
+	"stop trace",
+	"CountPagesInUse (test)",
+	"ReadMetricsSlow (test)",
+	"ReadMemStatsSlow (test)",
+	"PageCachePagesLeaked (test)",
+	"ResetDebugLog (test)",
+}
diff --git a/src/internal/trace/parser_test.go b/src/internal/trace/parser_test.go
index cdab95a..fce660c 100644
--- a/src/internal/trace/parser_test.go
+++ b/src/internal/trace/parser_test.go
@@ -52,12 +52,13 @@
 		}
 		// Instead of Parse that requires a proper binary name for old traces,
 		// we use 'parse' that omits symbol lookup if an empty string is given.
-		_, _, err = parse(bytes.NewReader(data), "")
+		ver, res, err := parse(bytes.NewReader(data), "")
 		switch {
 		case strings.HasSuffix(f.Name(), "_good"):
 			if err != nil {
 				t.Errorf("failed to parse good trace %v: %v", f.Name(), err)
 			}
+			checkTrace(t, ver, res)
 		case strings.HasSuffix(f.Name(), "_unordered"):
 			if err != ErrTimeOrder {
 				t.Errorf("unordered trace is not detected %v: %v", f.Name(), err)
@@ -68,6 +69,18 @@
 	}
 }
 
+// checkTrace walks over a good trace and makes a bunch of additional checks
+// that may not cause the parser to outright fail.
+func checkTrace(t *testing.T, ver int, res ParseResult) {
+	for _, ev := range res.Events {
+		if ver >= 1021 {
+			if ev.Type == EvSTWStart && ev.SArgs[0] == "unknown" {
+				t.Errorf("found unknown STW event; update stwReasonStrings?")
+			}
+		}
+	}
+}
+
 func TestParseVersion(t *testing.T) {
 	tests := map[string]int{
 		"go 1.5 trace\x00\x00\x00\x00": 1005,
diff --git a/src/internal/trace/testdata/http_1_21_good b/src/internal/trace/testdata/http_1_21_good
new file mode 100644
index 0000000..b3295f9
--- /dev/null
+++ b/src/internal/trace/testdata/http_1_21_good
Binary files differ
diff --git a/src/internal/trace/testdata/stress_1_21_good b/src/internal/trace/testdata/stress_1_21_good
new file mode 100644
index 0000000..1ade5e0
--- /dev/null
+++ b/src/internal/trace/testdata/stress_1_21_good
Binary files differ
diff --git a/src/internal/trace/testdata/stress_start_stop_1_21_good b/src/internal/trace/testdata/stress_start_stop_1_21_good
new file mode 100644
index 0000000..fff46a9
--- /dev/null
+++ b/src/internal/trace/testdata/stress_start_stop_1_21_good
Binary files differ
diff --git a/src/internal/trace/testdata/user_task_region_1_21_good b/src/internal/trace/testdata/user_task_region_1_21_good
new file mode 100644
index 0000000..5c01a64
--- /dev/null
+++ b/src/internal/trace/testdata/user_task_region_1_21_good
Binary files differ
diff --git a/src/internal/types/errors/code_string.go b/src/internal/types/errors/code_string.go
new file mode 100644
index 0000000..719fc73
--- /dev/null
+++ b/src/internal/types/errors/code_string.go
@@ -0,0 +1,199 @@
+// Code generated by "stringer -type Code codes.go"; DO NOT EDIT.
+
+package errors
+
+import "strconv"
+
+func _() {
+	// An "invalid array index" compiler error signifies that the constant values have changed.
+	// Re-run the stringer command to generate them again.
+	var x [1]struct{}
+	_ = x[InvalidSyntaxTree - -1]
+	_ = x[Test-1]
+	_ = x[BlankPkgName-2]
+	_ = x[MismatchedPkgName-3]
+	_ = x[InvalidPkgUse-4]
+	_ = x[BadImportPath-5]
+	_ = x[BrokenImport-6]
+	_ = x[ImportCRenamed-7]
+	_ = x[UnusedImport-8]
+	_ = x[InvalidInitCycle-9]
+	_ = x[DuplicateDecl-10]
+	_ = x[InvalidDeclCycle-11]
+	_ = x[InvalidTypeCycle-12]
+	_ = x[InvalidConstInit-13]
+	_ = x[InvalidConstVal-14]
+	_ = x[InvalidConstType-15]
+	_ = x[UntypedNilUse-16]
+	_ = x[WrongAssignCount-17]
+	_ = x[UnassignableOperand-18]
+	_ = x[NoNewVar-19]
+	_ = x[MultiValAssignOp-20]
+	_ = x[InvalidIfaceAssign-21]
+	_ = x[InvalidChanAssign-22]
+	_ = x[IncompatibleAssign-23]
+	_ = x[UnaddressableFieldAssign-24]
+	_ = x[NotAType-25]
+	_ = x[InvalidArrayLen-26]
+	_ = x[BlankIfaceMethod-27]
+	_ = x[IncomparableMapKey-28]
+	_ = x[InvalidPtrEmbed-30]
+	_ = x[BadRecv-31]
+	_ = x[InvalidRecv-32]
+	_ = x[DuplicateFieldAndMethod-33]
+	_ = x[DuplicateMethod-34]
+	_ = x[InvalidBlank-35]
+	_ = x[InvalidIota-36]
+	_ = x[MissingInitBody-37]
+	_ = x[InvalidInitSig-38]
+	_ = x[InvalidInitDecl-39]
+	_ = x[InvalidMainDecl-40]
+	_ = x[TooManyValues-41]
+	_ = x[NotAnExpr-42]
+	_ = x[TruncatedFloat-43]
+	_ = x[NumericOverflow-44]
+	_ = x[UndefinedOp-45]
+	_ = x[MismatchedTypes-46]
+	_ = x[DivByZero-47]
+	_ = x[NonNumericIncDec-48]
+	_ = x[UnaddressableOperand-49]
+	_ = x[InvalidIndirection-50]
+	_ = x[NonIndexableOperand-51]
+	_ = x[InvalidIndex-52]
+	_ = x[SwappedSliceIndices-53]
+	_ = x[NonSliceableOperand-54]
+	_ = x[InvalidSliceExpr-55]
+	_ = x[InvalidShiftCount-56]
+	_ = x[InvalidShiftOperand-57]
+	_ = x[InvalidReceive-58]
+	_ = x[InvalidSend-59]
+	_ = x[DuplicateLitKey-60]
+	_ = x[MissingLitKey-61]
+	_ = x[InvalidLitIndex-62]
+	_ = x[OversizeArrayLit-63]
+	_ = x[MixedStructLit-64]
+	_ = x[InvalidStructLit-65]
+	_ = x[MissingLitField-66]
+	_ = x[DuplicateLitField-67]
+	_ = x[UnexportedLitField-68]
+	_ = x[InvalidLitField-69]
+	_ = x[UntypedLit-70]
+	_ = x[InvalidLit-71]
+	_ = x[AmbiguousSelector-72]
+	_ = x[UndeclaredImportedName-73]
+	_ = x[UnexportedName-74]
+	_ = x[UndeclaredName-75]
+	_ = x[MissingFieldOrMethod-76]
+	_ = x[BadDotDotDotSyntax-77]
+	_ = x[NonVariadicDotDotDot-78]
+	_ = x[MisplacedDotDotDot-79]
+	_ = x[InvalidDotDotDot-81]
+	_ = x[UncalledBuiltin-82]
+	_ = x[InvalidAppend-83]
+	_ = x[InvalidCap-84]
+	_ = x[InvalidClose-85]
+	_ = x[InvalidCopy-86]
+	_ = x[InvalidComplex-87]
+	_ = x[InvalidDelete-88]
+	_ = x[InvalidImag-89]
+	_ = x[InvalidLen-90]
+	_ = x[SwappedMakeArgs-91]
+	_ = x[InvalidMake-92]
+	_ = x[InvalidReal-93]
+	_ = x[InvalidAssert-94]
+	_ = x[ImpossibleAssert-95]
+	_ = x[InvalidConversion-96]
+	_ = x[InvalidUntypedConversion-97]
+	_ = x[BadOffsetofSyntax-98]
+	_ = x[InvalidOffsetof-99]
+	_ = x[UnusedExpr-100]
+	_ = x[UnusedVar-101]
+	_ = x[MissingReturn-102]
+	_ = x[WrongResultCount-103]
+	_ = x[OutOfScopeResult-104]
+	_ = x[InvalidCond-105]
+	_ = x[InvalidPostDecl-106]
+	_ = x[InvalidIterVar-108]
+	_ = x[InvalidRangeExpr-109]
+	_ = x[MisplacedBreak-110]
+	_ = x[MisplacedContinue-111]
+	_ = x[MisplacedFallthrough-112]
+	_ = x[DuplicateCase-113]
+	_ = x[DuplicateDefault-114]
+	_ = x[BadTypeKeyword-115]
+	_ = x[InvalidTypeSwitch-116]
+	_ = x[InvalidExprSwitch-117]
+	_ = x[InvalidSelectCase-118]
+	_ = x[UndeclaredLabel-119]
+	_ = x[DuplicateLabel-120]
+	_ = x[MisplacedLabel-121]
+	_ = x[UnusedLabel-122]
+	_ = x[JumpOverDecl-123]
+	_ = x[JumpIntoBlock-124]
+	_ = x[InvalidMethodExpr-125]
+	_ = x[WrongArgCount-126]
+	_ = x[InvalidCall-127]
+	_ = x[UnusedResults-128]
+	_ = x[InvalidDefer-129]
+	_ = x[InvalidGo-130]
+	_ = x[BadDecl-131]
+	_ = x[RepeatedDecl-132]
+	_ = x[InvalidUnsafeAdd-133]
+	_ = x[InvalidUnsafeSlice-134]
+	_ = x[UnsupportedFeature-135]
+	_ = x[NotAGenericType-136]
+	_ = x[WrongTypeArgCount-137]
+	_ = x[CannotInferTypeArgs-138]
+	_ = x[InvalidTypeArg-139]
+	_ = x[InvalidInstanceCycle-140]
+	_ = x[InvalidUnion-141]
+	_ = x[MisplacedConstraintIface-142]
+	_ = x[InvalidMethodTypeParams-143]
+	_ = x[MisplacedTypeParam-144]
+	_ = x[InvalidUnsafeSliceData-145]
+	_ = x[InvalidUnsafeString-146]
+	_ = x[InvalidClear-148]
+	_ = x[TypeTooLarge-149]
+	_ = x[InvalidMinMaxOperand-150]
+}
+
+const (
+	_Code_name_0 = "InvalidSyntaxTree"
+	_Code_name_1 = "TestBlankPkgNameMismatchedPkgNameInvalidPkgUseBadImportPathBrokenImportImportCRenamedUnusedImportInvalidInitCycleDuplicateDeclInvalidDeclCycleInvalidTypeCycleInvalidConstInitInvalidConstValInvalidConstTypeUntypedNilUseWrongAssignCountUnassignableOperandNoNewVarMultiValAssignOpInvalidIfaceAssignInvalidChanAssignIncompatibleAssignUnaddressableFieldAssignNotATypeInvalidArrayLenBlankIfaceMethodIncomparableMapKey"
+	_Code_name_2 = "InvalidPtrEmbedBadRecvInvalidRecvDuplicateFieldAndMethodDuplicateMethodInvalidBlankInvalidIotaMissingInitBodyInvalidInitSigInvalidInitDeclInvalidMainDeclTooManyValuesNotAnExprTruncatedFloatNumericOverflowUndefinedOpMismatchedTypesDivByZeroNonNumericIncDecUnaddressableOperandInvalidIndirectionNonIndexableOperandInvalidIndexSwappedSliceIndicesNonSliceableOperandInvalidSliceExprInvalidShiftCountInvalidShiftOperandInvalidReceiveInvalidSendDuplicateLitKeyMissingLitKeyInvalidLitIndexOversizeArrayLitMixedStructLitInvalidStructLitMissingLitFieldDuplicateLitFieldUnexportedLitFieldInvalidLitFieldUntypedLitInvalidLitAmbiguousSelectorUndeclaredImportedNameUnexportedNameUndeclaredNameMissingFieldOrMethodBadDotDotDotSyntaxNonVariadicDotDotDotMisplacedDotDotDot"
+	_Code_name_3 = "InvalidDotDotDotUncalledBuiltinInvalidAppendInvalidCapInvalidCloseInvalidCopyInvalidComplexInvalidDeleteInvalidImagInvalidLenSwappedMakeArgsInvalidMakeInvalidRealInvalidAssertImpossibleAssertInvalidConversionInvalidUntypedConversionBadOffsetofSyntaxInvalidOffsetofUnusedExprUnusedVarMissingReturnWrongResultCountOutOfScopeResultInvalidCondInvalidPostDecl"
+	_Code_name_4 = "InvalidIterVarInvalidRangeExprMisplacedBreakMisplacedContinueMisplacedFallthroughDuplicateCaseDuplicateDefaultBadTypeKeywordInvalidTypeSwitchInvalidExprSwitchInvalidSelectCaseUndeclaredLabelDuplicateLabelMisplacedLabelUnusedLabelJumpOverDeclJumpIntoBlockInvalidMethodExprWrongArgCountInvalidCallUnusedResultsInvalidDeferInvalidGoBadDeclRepeatedDeclInvalidUnsafeAddInvalidUnsafeSliceUnsupportedFeatureNotAGenericTypeWrongTypeArgCountCannotInferTypeArgsInvalidTypeArgInvalidInstanceCycleInvalidUnionMisplacedConstraintIfaceInvalidMethodTypeParamsMisplacedTypeParamInvalidUnsafeSliceDataInvalidUnsafeString"
+	_Code_name_5 = "InvalidClearTypeTooLargeInvalidMinMaxOperand"
+)
+
+var (
+	_Code_index_1 = [...]uint16{0, 4, 16, 33, 46, 59, 71, 85, 97, 113, 126, 142, 158, 174, 189, 205, 218, 234, 253, 261, 277, 295, 312, 330, 354, 362, 377, 393, 411}
+	_Code_index_2 = [...]uint16{0, 15, 22, 33, 56, 71, 83, 94, 109, 123, 138, 153, 166, 175, 189, 204, 215, 230, 239, 255, 275, 293, 312, 324, 343, 362, 378, 395, 414, 428, 439, 454, 467, 482, 498, 512, 528, 543, 560, 578, 593, 603, 613, 630, 652, 666, 680, 700, 718, 738, 756}
+	_Code_index_3 = [...]uint16{0, 16, 31, 44, 54, 66, 77, 91, 104, 115, 125, 140, 151, 162, 175, 191, 208, 232, 249, 264, 274, 283, 296, 312, 328, 339, 354}
+	_Code_index_4 = [...]uint16{0, 14, 30, 44, 61, 81, 94, 110, 124, 141, 158, 175, 190, 204, 218, 229, 241, 254, 271, 284, 295, 308, 320, 329, 336, 348, 364, 382, 400, 415, 432, 451, 465, 485, 497, 521, 544, 562, 584, 603}
+	_Code_index_5 = [...]uint8{0, 12, 24, 44}
+)
+
+func (i Code) String() string {
+	switch {
+	case i == -1:
+		return _Code_name_0
+	case 1 <= i && i <= 28:
+		i -= 1
+		return _Code_name_1[_Code_index_1[i]:_Code_index_1[i+1]]
+	case 30 <= i && i <= 79:
+		i -= 30
+		return _Code_name_2[_Code_index_2[i]:_Code_index_2[i+1]]
+	case 81 <= i && i <= 106:
+		i -= 81
+		return _Code_name_3[_Code_index_3[i]:_Code_index_3[i+1]]
+	case 108 <= i && i <= 146:
+		i -= 108
+		return _Code_name_4[_Code_index_4[i]:_Code_index_4[i+1]]
+	case 148 <= i && i <= 150:
+		i -= 148
+		return _Code_name_5[_Code_index_5[i]:_Code_index_5[i+1]]
+	default:
+		return "Code(" + strconv.FormatInt(int64(i), 10) + ")"
+	}
+}
diff --git a/src/internal/types/errors/codes.go b/src/internal/types/errors/codes.go
index acddcbb..62358c7 100644
--- a/src/internal/types/errors/codes.go
+++ b/src/internal/types/errors/codes.go
@@ -4,6 +4,8 @@
 
 package errors
 
+//go:generate stringer -type Code codes.go
+
 type Code int
 
 // This file defines the error codes that can be produced during type-checking.
@@ -1328,10 +1330,10 @@
 	NotAGenericType
 
 	// WrongTypeArgCount occurs when a type or function is instantiated with an
-	// incorrent number of type arguments, including when a generic type or
+	// incorrect number of type arguments, including when a generic type or
 	// function is used without instantiation.
 	//
-	// Errors inolving failed type inference are assigned other error codes.
+	// Errors involving failed type inference are assigned other error codes.
 	//
 	// Example:
 	//  type T[p any] int
@@ -1432,11 +1434,44 @@
 	_ // not used anymore
 
 	// InvalidClear occurs when clear is called with an argument
-	// that is not of map, slice, or pointer-to-array type.
+	// that is not of map or slice type.
 	//
 	// Example:
 	//  func _(x int) {
 	//  	clear(x)
 	//  }
 	InvalidClear
+
+	// TypeTooLarge occurs if unsafe.Sizeof or unsafe.Offsetof is
+	// called with an expression whose type is too large.
+	//
+	// Example:
+	//  import "unsafe"
+	//
+	//  type E [1 << 31 - 1]int
+	//  var a [1 << 31]E
+	//  var _ = unsafe.Sizeof(a)
+	//
+	// Example:
+	//  import "unsafe"
+	//
+	//  type E [1 << 31 - 1]int
+	//  var s struct {
+	//  	_ [1 << 31]E
+	//  	x int
+	//  }
+	// var _ = unsafe.Offsetof(s.x)
+	TypeTooLarge
+
+	// InvalidMinMaxOperand occurs if min or max is called
+	// with an operand that cannot be ordered because it
+	// does not support the < operator.
+	//
+	// Example:
+	//  const _ = min(true)
+	//
+	// Example:
+	//  var s, t []byte
+	//  var _ = max(s, t)
+	InvalidMinMaxOperand
 )
diff --git a/src/internal/types/errors/generrordocs.go b/src/internal/types/errors/generrordocs.go
new file mode 100644
index 0000000..46343be
--- /dev/null
+++ b/src/internal/types/errors/generrordocs.go
@@ -0,0 +1,117 @@
+//go:build ignore
+
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// generrordocs creates a Markdown file for each (compiler) error code
+// and its associated documentation.
+// Note: this program must be run in this directory.
+//   go run generrordocs.go <dir>
+
+//go:generate go run generrordocs.go errors_markdown
+
+package main
+
+import (
+	"bytes"
+	"fmt"
+	"go/ast"
+	"go/importer"
+	"go/parser"
+	"go/token"
+	"log"
+	"os"
+	"path"
+	"strings"
+	"text/template"
+
+	. "go/types"
+)
+
+func main() {
+	if len(os.Args) != 2 {
+		log.Fatal("missing argument: generrordocs <dir>")
+	}
+	outDir := os.Args[1]
+	if err := os.MkdirAll(outDir, 0755); err != nil {
+		log.Fatal("unable to create output directory: %s", err)
+	}
+	walkCodes(func(name string, vs *ast.ValueSpec) {
+		// ignore unused errors
+		if name == "_" {
+			return
+		}
+		// Ensure that < are represented correctly when its included in code
+		// blocks. The goldmark Markdown parser converts them to &amp;lt;
+		// when not escaped. It is the only known string with this issue.
+		desc := strings.ReplaceAll(vs.Doc.Text(), "<", `{{raw "<"}}`)
+		e := struct {
+			Name        string
+			Description string
+		}{
+			Name:        name,
+			Description: fmt.Sprintf("```\n%s```\n", desyc),
+		}
+		var buf bytes.Buffer
+		err := template.Must(template.New("eachError").Parse(markdownTemplate)).Execute(&buf, e)
+		if err != nil {
+			log.Fatalf("template.Must: %s", err)
+		}
+		if err := os.WriteFile(path.Join(outDir, name+".md"), buf.Bytes(), 0660); err != nil {
+			log.Fatalf("os.WriteFile: %s\n", err)
+		}
+	})
+	log.Printf("output directory: %s\n", outDir)
+}
+
+func walkCodes(f func(string, *ast.ValueSpec)) {
+	fset := token.NewFileSet()
+	file, err := parser.ParseFile(fset, "codes.go", nil, parser.ParseComments)
+	if err != nil {
+		log.Fatalf("ParseFile failed: %s", err)
+	}
+	conf := Config{Importer: importer.Default()}
+	info := &Info{
+		Types: make(map[ast.Expr]TypeAndValue),
+		Defs:  make(map[*ast.Ident]Object),
+		Uses:  make(map[*ast.Ident]Object),
+	}
+	_, err = conf.Check("types", fset, []*ast.File{file}, info)
+	if err != nil {
+		log.Fatalf("Check failed: %s", err)
+	}
+	for _, decl := range file.Decls {
+		decl, ok := decl.(*ast.GenDecl)
+		if !ok || decl.Tok != token.CONST {
+			continue
+		}
+		for _, spec := range decl.Specs {
+			spec, ok := spec.(*ast.ValueSpec)
+			if !ok || len(spec.Names) == 0 {
+				continue
+			}
+			obj := info.ObjectOf(spec.Names[0])
+			if named, ok := obj.Type().(*Named); ok && named.Obj().Name() == "Code" {
+				if len(spec.Names) != 1 {
+					log.Fatalf("bad Code declaration for %q: got %d names, want exactly 1", spec.Names[0].Name, len(spec.Names))
+				}
+				codename := spec.Names[0].Name
+				f(codename, spec)
+			}
+		}
+	}
+}
+
+const markdownTemplate = `---
+title: {{.Name}}
+layout: article
+---
+<!-- Copyright 2023 The Go 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 generated by generrordocs.go; DO NOT EDIT. -->
+
+{{.Description}}
+`
diff --git a/src/internal/types/testdata/check/blank.go b/src/internal/types/testdata/check/blank.go
index 6a2507f..2bea11f 100644
--- a/src/internal/types/testdata/check/blank.go
+++ b/src/internal/types/testdata/check/blank.go
@@ -2,4 +2,4 @@
 // 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 */
+package _ /* ERROR "invalid package name" */
diff --git a/src/internal/types/testdata/check/builtins0.go b/src/internal/types/testdata/check/builtins0.go
index 308f70b..ed4769e 100644
--- a/src/internal/types/testdata/check/builtins0.go
+++ b/src/internal/types/testdata/check/builtins0.go
@@ -14,38 +14,38 @@
 	var b byte
 	var x int
 	var s []byte
-	_ = append() // ERROR not enough arguments
-	_ = append("foo" /* ERROR must be a slice */ )
-	_ = append(nil /* ERROR must be a slice */ , s)
-	_ = append(x /* ERROR must be a slice */ , s)
+	_ = append() // ERROR "not enough arguments"
+	_ = append("foo" /* ERROR "must be a slice" */ )
+	_ = append(nil /* ERROR "must be a slice" */ , s)
+	_ = append(x /* ERROR "must be a slice" */ , s)
 	_ = append(s)
 	_ = append(s, nil...)
-	append /* ERROR not used */ (s)
+	append /* ERROR "not used" */ (s)
 
 	_ = append(s, b)
-	_ = append(s, x /* ERROR cannot use x */ )
-	_ = append(s, s /* ERROR cannot use s */ )
-	_ = append(s...) /* ERROR not enough arguments */
-	_ = append(s, b, s /* ERROR too many arguments */ ...)
+	_ = append(s, x /* ERROR "cannot use x" */ )
+	_ = append(s, s /* ERROR "cannot use s" */ )
+	_ = append(s...) /* ERROR "not enough arguments" */
+	_ = append(s, b, s /* ERROR "too many arguments" */ ...)
 	_ = append(s, 1, 2, 3)
-	_ = append(s, 1, 2, 3, x /* ERROR cannot use x */ , 5, 6, 6)
-	_ = append(s, 1, 2 /* ERROR too many arguments */, s...)
+	_ = append(s, 1, 2, 3, x /* ERROR "cannot use x" */ , 5, 6, 6)
+	_ = append(s, 1, 2 /* ERROR "too many arguments" */, s...)
 	_ = append([]interface{}(nil), 1, 2, "foo", x, 3.1425, false)
 
 	type S []byte
 	type T string
 	var t T
-	_ = append(s, "foo" /* ERROR cannot use .* in argument to append */ )
+	_ = append(s, "foo" /* ERRORx `cannot use .* in argument to append` */ )
 	_ = append(s, "foo"...)
-	_ = append(S(s), "foo" /* ERROR cannot use .* in argument to append */ )
+	_ = append(S(s), "foo" /* ERRORx `cannot use .* in argument to append` */ )
 	_ = append(S(s), "foo"...)
-	_ = append(s, t /* ERROR cannot use t */ )
+	_ = append(s, t /* ERROR "cannot use t" */ )
 	_ = append(s, t...)
 	_ = append(s, T("foo")...)
-	_ = append(S(s), t /* ERROR cannot use t */ )
+	_ = append(S(s), t /* ERROR "cannot use t" */ )
 	_ = append(S(s), t...)
 	_ = append(S(s), T("foo")...)
-	_ = append([]string{}, t /* ERROR cannot use t */ , "foo")
+	_ = append([]string{}, t /* ERROR "cannot use t" */ , "foo")
 	_ = append([]T{}, t, "foo")
 }
 
@@ -72,27 +72,27 @@
 	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(f0 /* ERROR "used as value" */ ())
 	_ = append(f1())
 	_ = append(f2())
 	_ = append(f3())
 	_ = append(f5())
-	_ = append(ff /* ERROR must be a slice */ ()) // TODO(gri) better error message
+	_ = append(ff /* ERROR "must be 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 */)
+	_ = 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)
+	cap /* ERROR "not used" */ (c)
 
 	// issue 4744
 	type T struct{ a [10]int }
@@ -100,17 +100,17 @@
 
 	var s [][]byte
 	_ = cap(s)
-	_ = cap(s... /* ERROR invalid use of \.\.\. */ )
+	_ = 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(f0 /* ERROR "used as value" */ ())
 	_ = cap(f1a())
 	_ = cap(f1s())
-	_ = cap(f2()) // ERROR too many arguments
+	_ = cap(f2()) // ERROR "too many arguments"
 }
 
 // test cases for issue 7387
@@ -120,8 +120,8 @@
 	const (
 		_ = cap([4]int{})
 		_ = cap([4]int{x})
-		_ = cap /* ERROR not constant */ ([4]int{f()})
-		_ = cap /* ERROR not constant */ ([4]int{cap([]int{})})
+		_ = cap /* ERROR "not constant" */ ([4]int{f()})
+		_ = cap /* ERROR "not constant" */ ([4]int{cap([]int{})})
 		_ = cap([4]int{cap([4]int{})})
 	)
 	var y float64
@@ -130,12 +130,12 @@
 		_ = cap([4]float64{})
 		_ = cap([4]float64{y})
 		_ = cap([4]float64{real(2i)})
-		_ = cap /* ERROR not constant */ ([4]float64{real(z)})
+		_ = 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]})
+		_ = cap /* ERROR "not constant" */ (<-ch)
+		_ = cap /* ERROR "not constant" */ ([4]int{(<-ch)[0]})
 	)
 }
 
@@ -143,8 +143,8 @@
 	var a [10]int
 	var m map[float64]string
 	var s []byte
-	clear(a /* ERROR cannot clear a */)
-	clear(&a)
+	clear(a /* ERROR "cannot clear a" */)
+	clear(&/* ERROR "cannot clear &a" */a)
 	clear(m)
 	clear(s)
 	clear([]int{})
@@ -153,23 +153,23 @@
 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 cannot close non-channel */)
-	close(r /* ERROR receive-only channel */)
+	close() // ERROR "not enough arguments"
+	close(1, 2) // ERROR "too many arguments"
+	close(42 /* ERROR "cannot close non-channel" */)
+	close(r /* ERROR "receive-only channel" */)
 	close(c)
-	_ = close /* ERROR used as value */ (c)
+	_ = close /* ERROR "used as value" */ (c)
 
 	var s []chan int
-	close(s... /* ERROR invalid use of \.\.\. */ )
+	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(f0 /* ERROR "used as value" */ ())
 	close(f1())
-	close(f2()) // ERROR too many arguments
+	close(f2()) // ERROR "too many arguments"
 }
 
 func complex1() {
@@ -178,16 +178,16 @@
 	var f64 float64
 	var c64 complex64
 	var c128 complex128
-	_ = complex() // ERROR not enough arguments
-	_ = complex(1) // ERROR not enough arguments
-	_ = complex(true /* ERROR mismatched types */ , 0)
-	_ = complex(i32 /* ERROR expected floating-point */ , 0)
-	_ = complex("foo" /* ERROR mismatched types */ , 0)
-	_ = complex(c64 /* ERROR expected floating-point */ , 0)
-	_ = complex(0 /* ERROR mismatched types */ , true)
-	_ = complex(0 /* ERROR expected floating-point */ , i32)
-	_ = complex(0 /* ERROR mismatched types */ , "foo")
-	_ = complex(0 /* ERROR expected floating-point */ , c64)
+	_ = complex() // ERROR "not enough arguments"
+	_ = complex(1) // ERROR "not enough arguments"
+	_ = complex(true /* ERROR "mismatched types" */ , 0)
+	_ = complex(i32 /* ERROR "expected floating-point" */ , 0)
+	_ = complex("foo" /* ERROR "mismatched types" */ , 0)
+	_ = complex(c64 /* ERROR "expected floating-point" */ , 0)
+	_ = complex(0 /* ERROR "mismatched types" */ , true)
+	_ = complex(0 /* ERROR "expected floating-point" */ , i32)
+	_ = complex(0 /* ERROR "mismatched types" */ , "foo")
+	_ = complex(0 /* ERROR "expected floating-point" */ , c64)
 	_ = complex(f32, f32)
 	_ = complex(f32, 1)
 	_ = complex(f32, 1.0)
@@ -196,17 +196,17 @@
 	_ = complex(f64, 1)
 	_ = complex(f64, 1.0)
 	_ = complex(f64, 'a')
-	_ = complex(f32 /* ERROR mismatched types */ , f64)
-	_ = complex(f64 /* ERROR mismatched types */ , f32)
+	_ = 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)
+	complex /* ERROR "not used" */ (1, 2)
 
 	var _ complex64 = complex(f32, f32)
-	var _ complex64 = complex /* ERROR cannot use .* in variable declaration */ (f64, f64)
+	var _ complex64 = complex /* ERRORx `cannot use .* in variable declaration` */ (f64, f64)
 
-	var _ complex128 = complex /* ERROR cannot use .* in variable declaration */ (f32, f32)
+	var _ complex128 = complex /* ERRORx `cannot use .* in variable declaration` */ (f32, f32)
 	var _ complex128 = complex(f64, f64)
 
 	// untyped constants
@@ -218,14 +218,14 @@
 	const _ = complex(0i, 0)
 	const _ int = 1.0 + complex(1, 0i)
 
-	const _ int = complex /* ERROR int */ (1.1, 0)
-	const _ float32 = complex /* ERROR float32 */ (1, 2)
+	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 use .* in variable declaration */ (1 /* ERROR integer */ <<s, 0)
+	_ = complex(1 /* ERROR "integer" */ <<s, 0)
+	const _ = complex /* ERROR "not constant" */ (1 /* ERROR "integer" */ <<s, 0)
+	var _ int = complex /* ERRORx `cannot use .* in variable declaration` */ (1 /* ERROR "integer" */ <<s, 0)
 
 	// floating-point argument types must be identical
 	type F32 float32
@@ -233,33 +233,33 @@
 	var x32 F32
 	var x64 F64
 	c64 = complex(x32, x32)
-	_ = complex(x32 /* ERROR mismatched types */ , f32)
-	_ = complex(f32 /* ERROR mismatched types */ , 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)
+	_ = complex(x64 /* ERROR "mismatched types" */ , f64)
+	_ = complex(f64 /* ERROR "mismatched types" */ , x64)
 
 	var t []float32
-	_ = complex(t... /* ERROR invalid use of \.\.\. */ )
+	_ = 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(f0 /* ERROR "used as value" */ ())
+	_ = complex(f1()) // ERROR "not enough arguments"
 	_ = complex(f2())
-	_ = complex(f3()) // ERROR too many arguments
+	_ = 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")
+	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}
@@ -272,44 +272,44 @@
 
 	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 \.\.\. */ )
+	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(f0 /* ERROR "used as value" */ ())
+	copy(f1()) // ERROR "not enough arguments"
 	copy(f2())
-	copy(f3()) // ERROR too many arguments
+	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 cannot use */)
+	delete() // ERROR "not enough arguments"
+	delete(1) // ERROR "not enough arguments"
+	delete(1, 2, 3) // ERROR "too many arguments"
+	delete(m, 0 /* ERROR "cannot use" */)
 	delete(m, s)
-	_ = delete /* ERROR used as value */ (m, s)
+	_ = delete /* ERROR "used as value" */ (m, s)
 
 	var t []map[string]string
-	delete(t... /* ERROR invalid use of \.\.\. */ )
+	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(f0 /* ERROR "used as value" */ ())
+	delete(f1()) // ERROR "not enough arguments"
 	delete(f2())
-	delete(f3()) // ERROR too many arguments
+	delete(f3()) // ERROR "too many arguments"
 }
 
 func imag1() {
@@ -317,11 +317,11 @@
 	var f64 float64
 	var c64 complex64
 	var c128 complex128
-	_ = imag() // ERROR not enough arguments
-	_ = imag(1, 2) // ERROR too many arguments
+	_ = imag() // ERROR "not enough arguments"
+	_ = imag(1, 2) // ERROR "too many arguments"
 	_ = imag(10)
 	_ = imag(2.7182818)
-	_ = imag("foo" /* ERROR expected complex */)
+	_ = imag("foo" /* ERROR "expected complex" */)
 	_ = imag('a')
 	const _5 = imag(1 + 2i)
 	assert(_5 == 2)
@@ -331,9 +331,9 @@
 	assert(_6 == 0)
 	f32 = imag(c64)
 	f64 = imag(c128)
-	f32 = imag /* ERROR cannot use .* in assignment */ (c128)
-	f64 = imag /* ERROR cannot use .* in assignment */ (c64)
-	imag /* ERROR not used */ (c64)
+	f32 = imag /* ERRORx `cannot use .* in assignment` */ (c128)
+	f64 = imag /* ERRORx `cannot use .* in assignment` */ (c64)
+	imag /* ERROR "not used" */ (c64)
 	_, _ = f32, f64
 
 	// complex type may not be predeclared
@@ -345,7 +345,7 @@
 	f64 = imag(x128)
 
 	var a []complex64
-	_ = imag(a... /* ERROR invalid use of \.\.\. */ )
+	_ = imag(a... /* ERROR "invalid use of ..." */ )
 
 	// if argument is untyped, result is untyped
 	const _ byte = imag(1.2 + 3i)
@@ -353,15 +353,15 @@
 
 	// lhs constant shift operands are typed as complex128
 	var s uint
-	_ = imag(1 /* ERROR must be integer */ << s)
+	_ = imag(1 /* ERROR "must be integer" */ << s)
 }
 
 func imag2() {
 	f1 := func() (x complex128) { return }
 	f2 := func() (x, y complex128) { return }
-	_ = imag(f0 /* ERROR used as value */ ())
+	_ = imag(f0 /* ERROR "used as value" */ ())
 	_ = imag(f1())
-	_ = imag(f2()) // ERROR too many arguments
+	_ = imag(f2()) // ERROR "too many arguments"
 }
 
 func len1() {
@@ -369,9 +369,9 @@
 	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 */)
+	_ = 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)
@@ -379,15 +379,15 @@
 	const _5 = len(p)
 	assert(_5 == 20)
 	_ = len(m)
-	len /* ERROR not used */ (c)
+	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)])
+	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)])
+	const nn = len /* ERROR "not constant" */ (hash[<-ch][len(t)])
 
 	// issue 4744
 	type T struct{ a [10]int }
@@ -395,15 +395,15 @@
 
 	var s [][]byte
 	_ = len(s)
-	_ = len(s... /* ERROR invalid use of \.\.\. */ )
+	_ = 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(f0 /* ERROR "used as value" */ ())
 	_ = len(f1())
-	_ = len(f2()) // ERROR too many arguments
+	_ = len(f2()) // ERROR "too many arguments"
 }
 
 // test cases for issue 7387
@@ -413,8 +413,8 @@
 	const (
 		_ = len([4]int{})
 		_ = len([4]int{x})
-		_ = len /* ERROR not constant */ ([4]int{f()})
-		_ = len /* ERROR not constant */ ([4]int{len([]int{})})
+		_ = len /* ERROR "not constant" */ ([4]int{f()})
+		_ = len /* ERROR "not constant" */ ([4]int{len([]int{})})
 		_ = len([4]int{len([4]int{})})
 	)
 	var y float64
@@ -423,12 +423,12 @@
 		_ = len([4]float64{})
 		_ = len([4]float64{y})
 		_ = len([4]float64{real(2i)})
-		_ = len /* ERROR not constant */ ([4]float64{real(z)})
+		_ = 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]})
+		_ = len /* ERROR "not constant" */ (<-ch)
+		_ = len /* ERROR "not constant" */ ([4]int{(<-ch)[0]})
 	)
 }
 
@@ -437,108 +437,216 @@
 	var m float32
 	var s uint
 
-	_ = make() // ERROR not enough arguments
-	_ = make(1 /* ERROR not a type */)
-	_ = make(int /* ERROR cannot make */)
+	_ = 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/* 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)
+	_ = 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 /* 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)
+        _ = &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 /* 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 "cannot take address" */ (chan bool)
 
-	make /* ERROR not used */ ([]int, 10)
+	make /* ERROR "not used" */ ([]int, 10)
 
 	var t []int
 	_ = make([]int, t[0], t[1])
-	_ = make([]int, t... /* ERROR invalid use of \.\.\. */ )
+	_ = make([]int, t... /* ERROR "invalid use of ..." */ )
 }
 
 func make2() {
 	f1 := func() (x []int) { return }
-	_ = make(f0 /* ERROR not a type */ ())
-	_ = make(f1 /* ERROR not a type */ ())
+	_ = make(f0 /* ERROR "not a type" */ ())
+	_ = make(f1 /* ERROR "not a type" */ ())
+}
+
+func max1() {
+	var b bool
+	var c complex128
+	var x int
+	var s string
+	type myint int
+	var m myint
+	_ = max() /* ERROR "not enough arguments" */
+	_ = max(b /* ERROR "cannot be ordered" */ )
+	_ = max(c /* ERROR "cannot be ordered" */ )
+	_ = max(x)
+	_ = max(s)
+	_ = max(x, x)
+	_ = max(x, x, x, x, x)
+	var _ int = max /* ERROR "cannot use max(m) (value of type myint) as int value" */ (m)
+	_ = max(x, m /* ERROR "invalid argument: mismatched types int (previous argument) and myint (type of m)" */ , x)
+
+	_ = max(1, x)
+	_ = max(1.0, x)
+	_ = max(1.2 /* ERROR "1.2 (untyped float constant) truncated to int" */ , x)
+	_ = max(-10, 1.0, c /* ERROR "cannot be ordered" */ )
+
+	const (
+		_ = max /* ERROR "max(x) (value of type int) is not constant" */ (x)
+		_ = max(true /* ERROR "invalid argument: true (untyped bool constant) cannot be ordered" */ )
+		_ = max(1)
+		_ = max(1, 2.3, 'a')
+		_ = max(1, "foo" /* ERROR "mismatched types" */ )
+		_ = max(1, 0i /* ERROR "cannot be ordered" */ )
+		_ = max(1, 2 /* ERROR "cannot be ordered" */ + 3i )
+	)
+}
+
+func max2() {
+	_ = assert(max(0) == 0)
+	_ = assert(max(0, 1) == 1)
+	_ = assert(max(0, -10, 123456789) == 123456789)
+	_ = assert(max(-12345678901234567890, 0) == 0)
+
+	_ = assert(max(1, 2.3) == 2.3)
+	_ = assert(max(1, 2.3, 'a') == 'a')
+
+	_ = assert(max("", "a") == "a")
+	_ = assert(max("abcde", "xyz", "foo", "bar") == "xyz")
+
+	const (
+		_ int = max(1.0)
+		_ float32 = max(1, 2)
+		_ int = max /* ERROR "cannot use max(1, 2.3) (untyped float constant 2.3) as int value" */ (1, 2.3)
+		_ int = max(1.2, 3) // ok!
+		_ byte = max(1, 'a')
+	)
+}
+
+func min1() {
+	var b bool
+	var c complex128
+	var x int
+	var s string
+	type myint int
+	var m myint
+	_ = min() /* ERROR "not enough arguments" */
+	_ = min(b /* ERROR "cannot be ordered" */ )
+	_ = min(c /* ERROR "cannot be ordered" */ )
+	_ = min(x)
+	_ = min(s)
+	_ = min(x, x)
+	_ = min(x, x, x, x, x)
+	var _ int = min /* ERROR "cannot use min(m) (value of type myint) as int value" */ (m)
+	_ = min(x, m /* ERROR "invalid argument: mismatched types int (previous argument) and myint (type of m)" */ , x)
+
+	_ = min(1, x)
+	_ = min(1.0, x)
+	_ = min(1.2 /* ERROR "1.2 (untyped float constant) truncated to int" */ , x)
+	_ = min(-10, 1.0, c /* ERROR "cannot be ordered" */ )
+
+	const (
+		_ = min /* ERROR "min(x) (value of type int) is not constant" */ (x)
+		_ = min(true /* ERROR "invalid argument: true (untyped bool constant) cannot be ordered" */ )
+		_ = min(1)
+		_ = min(1, 2.3, 'a')
+		_ = min(1, "foo" /* ERROR "mismatched types" */ )
+		_ = min(1, 0i /* ERROR "cannot be ordered" */ )
+		_ = min(1, 2 /* ERROR "cannot be ordered" */ + 3i )
+	)
+}
+
+func min2() {
+	_ = assert(min(0) == 0)
+	_ = assert(min(0, 1) == 0)
+	_ = assert(min(0, -10, 123456789) == -10)
+	_ = assert(min(-12345678901234567890, 0) == -12345678901234567890)
+
+	_ = assert(min(1, 2.3) == 1)
+	_ = assert(min(1, 2.3, 'a') == 1)
+
+	_ = assert(min("", "a") == "")
+	_ = assert(min("abcde", "xyz", "foo", "bar") == "abcde")
+
+	const (
+		_ int = min(1.0)
+		_ float32 = min(1, 2)
+		_ int = min(1, 2.3) // ok!
+		_ int = min /* ERROR "cannot use min(1.2, 3) (untyped float constant 1.2) as int value" */ (1.2, 3)
+		_ byte = min(1, 'a')
+	)
 }
 
 func new1() {
-	_ = new() // ERROR not enough arguments
-	_ = new(1, 2) // ERROR too many arguments
-	_ = new("foo" /* ERROR not a type */)
+	_ = 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 /* ERROR "not used" */ (int)
+        _ = &new /* ERROR "cannot take address" */ (int)
 
-	_ = new(int... /* ERROR invalid use of \.\.\. */ )
+	_ = new(int... /* ERROR "invalid use of ..." */ )
 }
 
 func new2() {
 	f1 := func() (x []int) { return }
-	_ = new(f0 /* ERROR not a type */ ())
-	_ = new(f1 /* ERROR not a type */ ())
+	_ = 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() // ERROR "not enough arguments"
+	panic(1, 2) // ERROR "too many arguments"
 	panic(0)
 	panic("foo")
 	panic(false)
 	panic(1<<10)
-	panic(1 << /* ERROR constant shift overflow */ 1000)
-	_ = panic /* ERROR used as value */ (0)
+	panic(1 << /* ERROR "constant shift overflow" */ 1000)
+	_ = panic /* ERROR "used as value" */ (0)
 
 	var s []byte
 	panic(s)
-	panic(s... /* ERROR invalid use of \.\.\. */ )
+	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(f0 /* ERROR "used as value" */ ())
 	panic(f1())
-	panic(f2()) // ERROR too many arguments
+	panic(f2()) // ERROR "too many arguments"
 }
 
 func print1() {
@@ -549,19 +657,19 @@
 	print(2.718281828)
 	print(false)
 	print(1<<10)
-	print(1 << /* ERROR constant shift overflow */ 1000)
-	println(nil /* ERROR untyped nil */ )
+	print(1 << /* ERROR "constant shift overflow" */ 1000)
+	println(nil /* ERROR "untyped nil" */ )
 
 	var s []int
-	print(s... /* ERROR invalid use of \.\.\. */ )
-	_ = print /* ERROR used as value */ ()
+	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(f0 /* ERROR "used as value" */ ())
 	print(f1())
 	print(f2())
 	print(f3())
@@ -575,19 +683,19 @@
 	println(2.718281828)
 	println(false)
 	println(1<<10)
-	println(1 << /* ERROR constant shift overflow */ 1000)
-	println(nil /* ERROR untyped nil */ )
+	println(1 << /* ERROR "constant shift overflow" */ 1000)
+	println(nil /* ERROR "untyped nil" */ )
 
 	var s []int
-	println(s... /* ERROR invalid use of \.\.\. */ )
-	_ = println /* ERROR used as value */ ()
+	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(f0 /* ERROR "used as value" */ ())
 	println(f1())
 	println(f2())
 	println(f3())
@@ -598,11 +706,11 @@
 	var f64 float64
 	var c64 complex64
 	var c128 complex128
-	_ = real() // ERROR not enough arguments
-	_ = real(1, 2) // ERROR too many arguments
+	_ = real() // ERROR "not enough arguments"
+	_ = real(1, 2) // ERROR "too many arguments"
 	_ = real(10)
 	_ = real(2.7182818)
-	_ = real("foo" /* ERROR expected complex */)
+	_ = real("foo" /* ERROR "expected complex" */)
 	const _5 = real(1 + 2i)
 	assert(_5 == 1)
 	f32 = _5
@@ -611,9 +719,9 @@
 	assert(_6 == 0)
 	f32 = real(c64)
 	f64 = real(c128)
-	f32 = real /* ERROR cannot use .* in assignment */ (c128)
-	f64 = real /* ERROR cannot use .* in assignment */ (c64)
-	real /* ERROR not used */ (c64)
+	f32 = real /* ERRORx `cannot use .* in assignment` */ (c128)
+	f64 = real /* ERRORx `cannot use .* in assignment` */ (c64)
+	real /* ERROR "not used" */ (c64)
 
 	// complex type may not be predeclared
 	type C64 complex64
@@ -625,7 +733,7 @@
 	_, _ = f32, f64
 
 	var a []complex64
-	_ = real(a... /* ERROR invalid use of \.\.\. */ )
+	_ = real(a... /* ERROR "invalid use of ..." */ )
 
 	// if argument is untyped, result is untyped
 	const _ byte = real(1 + 2.3i)
@@ -633,32 +741,32 @@
 
 	// lhs constant shift operands are typed as complex128
 	var s uint
-	_ = real(1 /* ERROR must be integer */ << s)
+	_ = real(1 /* ERROR "must be integer" */ << s)
 }
 
 func real2() {
 	f1 := func() (x complex128) { return }
 	f2 := func() (x, y complex128) { return }
-	_ = real(f0 /* ERROR used as value */ ())
+	_ = real(f0 /* ERROR "used as value" */ ())
 	_ = real(f1())
-	_ = real(f2()) // ERROR too many arguments
+	_ = real(f2()) // ERROR "too many arguments"
 }
 
 func recover1() {
 	_ = recover()
-	_ = recover(10) // ERROR too many arguments
+	_ = recover(10) // ERROR "too many arguments"
 	recover()
 
 	var s []int
-	recover(s... /* ERROR invalid use of \.\.\. */ )
+	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
+	_ = recover(f0 /* ERROR "used as value" */ ())
+	_ = recover(f1()) // ERROR "too many arguments"
+	_ = recover(f2()) // ERROR "too many arguments"
 }
 
 // assuming types.DefaultPtrSize == 8
@@ -700,15 +808,15 @@
 
 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() // 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 constant shift overflow */ 1000)
-	_ = unsafe.Alignof(nil /* ERROR "untyped nil */ )
-	unsafe /* ERROR not used */ .Alignof(x)
+	_ = unsafe.Alignof(1 << /* ERROR "constant shift overflow" */ 1000)
+	_ = unsafe.Alignof(nil /* ERROR "untyped nil" */ )
+	unsafe /* ERROR "not used" */ .Alignof(x)
 
 	var y S0
 	assert(unsafe.Alignof(y.a) == 1)
@@ -719,28 +827,28 @@
 
 	var s []byte
 	_ = unsafe.Alignof(s)
-	_ = unsafe.Alignof(s... /* ERROR invalid use of \.\.\. */ )
+	_ = 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 */ ())
+	_ = unsafe.Alignof(f0 /* ERROR "used as value" */ ())
 	assert(unsafe.Alignof(f1()) == 4)
-	_ = unsafe.Alignof(f2()) // ERROR too many arguments
+	_ = 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() // 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)
+	unsafe /* ERROR "not used" */ .Offsetof(x.f)
 
 	var y0 S0
 	assert(unsafe.Offsetof(y0.a) == 0)
@@ -771,32 +879,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)
+	_ = 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 \.\.\. */ )
+	_ = 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 */ ())
+	_ = 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() // 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 constant shift overflow */ 1000)
-	_ = unsafe.Sizeof(nil /* ERROR untyped nil */ )
-	unsafe /* ERROR not used */ .Sizeof(x)
+	_ = unsafe.Sizeof(1 << /* ERROR "constant shift overflow" */ 1000)
+	_ = unsafe.Sizeof(nil /* ERROR "untyped nil" */ )
+	unsafe /* ERROR "not used" */ .Sizeof(x)
 
 	// basic types have size guarantees
 	assert(unsafe.Sizeof(byte(0)) == 1)
@@ -849,28 +957,28 @@
 
 	var s []byte
 	_ = unsafe.Sizeof(s)
-	_ = unsafe.Sizeof(s... /* ERROR invalid use of \.\.\. */ )
+	_ = 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 */ ())
+	_ = unsafe.Sizeof(f0 /* ERROR "used as value" */ ())
 	assert(unsafe.Sizeof(f1()) == 8)
-	_ = unsafe.Sizeof(f2()) // ERROR too many arguments
+	_ = unsafe.Sizeof(f2()) // ERROR "too many arguments"
 }
 
 func Slice1() {
 	var x int
-	unsafe.Slice()        // ERROR not enough arguments
-	unsafe.Slice(1, 2, 3) // ERROR too many arguments
-	unsafe.Slice(1 /* ERROR is not a pointer */ , 2)
-	unsafe.Slice(nil /* ERROR nil is not a pointer */ , 0)
-	unsafe.Slice(&x, "foo" /* ERROR cannot convert .* to type int */ )
-	unsafe.Slice(&x, 1.2 /* ERROR truncated to int */ )
-	unsafe.Slice(&x, - /* ERROR must not be negative */ 1)
-	unsafe /* ERROR not used */ .Slice(&x, 0)
-	var _ []byte = unsafe /* ERROR value of type \[\]int */ .Slice(&x, 0)
+	unsafe.Slice()        // ERROR "not enough arguments"
+	unsafe.Slice(1, 2, 3) // ERROR "too many arguments"
+	unsafe.Slice(1 /* ERROR "is not a pointer" */ , 2)
+	unsafe.Slice(nil /* ERROR "nil is not a pointer" */ , 0)
+	unsafe.Slice(&x, "foo" /* ERRORx `cannot convert .* to type int` */ )
+	unsafe.Slice(&x, 1.2 /* ERROR "truncated to int" */ )
+	unsafe.Slice(&x, - /* ERROR "must not be negative" */ 1)
+	unsafe /* ERROR "not used" */ .Slice(&x, 0)
+	var _ []byte = unsafe /* ERROR "value of type []int" */ .Slice(&x, 0)
 
 	var _ []int = unsafe.Slice(&x, 0)
 	_ = unsafe.Slice(&x, 1.0)
@@ -879,8 +987,8 @@
 
 func SliceData1() {
 	var s []int
-	unsafe.SliceData(0 /* ERROR not a slice */)
-	unsafe /* ERROR not used */ .SliceData(s)
+	unsafe.SliceData(0 /* ERROR "not a slice" */)
+	unsafe /* ERROR "not used" */ .SliceData(s)
 
 	type S []int
 	_ = unsafe.SliceData(s)
@@ -889,14 +997,14 @@
 
 func String1() {
 	var b byte
-	unsafe.String()        // ERROR not enough arguments
-	unsafe.String(1, 2, 3) // ERROR too many arguments
-	unsafe.String(1 /* ERROR cannot use 1 */ , 2)
-	unsafe.String(&b, "foo" /* ERROR cannot convert .* to type int */ )
-	unsafe.String(&b, 1.2 /* ERROR truncated to int */ )
-	unsafe.String(&b, - /* ERROR must not be negative */ 1)
-	unsafe /* ERROR not used */ .String(&b, 0)
-	var _ []byte = unsafe /* ERROR value of type string */ .String(&b, 0)
+	unsafe.String()        // ERROR "not enough arguments"
+	unsafe.String(1, 2, 3) // ERROR "too many arguments"
+	unsafe.String(1 /* ERROR "cannot use 1" */ , 2)
+	unsafe.String(&b, "foo" /* ERRORx `cannot convert .* to type int` */ )
+	unsafe.String(&b, 1.2 /* ERROR "truncated to int" */ )
+	unsafe.String(&b, - /* ERROR "must not be negative" */ 1)
+	unsafe /* ERROR "not used" */ .String(&b, 0)
+	var _ []byte = unsafe /* ERROR "value of type string" */ .String(&b, 0)
 
 	var _ string = unsafe.String(&b, 0)
 	_ = unsafe.String(&b, 1.0)
@@ -906,9 +1014,9 @@
 func StringData1() {
 	var s string
 	type S string
-	unsafe.StringData(0 /* ERROR cannot use 0 */)
-	unsafe.StringData(S /* ERROR cannot use S */ ("foo"))
-	unsafe /* ERROR not used */ .StringData(s)
+	unsafe.StringData(0 /* ERROR "cannot use 0" */)
+	unsafe.StringData(S /* ERROR "cannot use S" */ ("foo"))
+	unsafe /* ERROR "not used" */ .StringData(s)
 
 	_ = unsafe.StringData(s)
 	_ = unsafe.StringData("foo")
@@ -917,35 +1025,35 @@
 // 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() /* 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 /* ERROR "failed" */ (false)
 	_ = assert(true)
 
 	var s []byte
-	assert(s... /* ERROR invalid use of \.\.\. */ )
+	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 */ ())
+	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 /* ERROR "no value" */ ()
 	// _ = trace(1)
 	// _ = trace(true, 1.2, '\'', "foo", 42i, "foo" <= "bar")
 
 	var s []byte
-	trace(s... /* ERROR invalid use of \.\.\. */ )
+	trace(s... /* ERROR "invalid use of ..." */ )
 }
 
 func trace2() {
diff --git a/src/internal/types/testdata/check/builtins1.go b/src/internal/types/testdata/check/builtins1.go
index 3348861..f7ac72d 100644
--- a/src/internal/types/testdata/check/builtins1.go
+++ b/src/internal/types/testdata/check/builtins1.go
@@ -11,15 +11,15 @@
 // clear
 
 func _[T any](x T) {
-	clear(x /* ERROR cannot clear x */)
+	clear(x /* ERROR "cannot clear x" */)
 }
 
-func _[T ~map[int]string | ~[]byte | ~*[10]int](x T) {
+func _[T ~map[int]string | ~[]byte](x T) {
 	clear(x)
 }
 
 func _[T ~map[int]string | ~[]byte | ~*[10]int | string](x T) {
-	clear(x /* ERROR cannot clear x */)
+	clear(x /* ERROR "cannot clear x" */)
 }
 
 // close
@@ -32,11 +32,11 @@
 type C5[T any] interface{ ~chan T | chan<- T }
 
 func _[T any](ch T) {
-	close(ch /* ERROR cannot close non-channel */)
+	close(ch /* ERROR "cannot close non-channel" */)
 }
 
 func _[T C0](ch T) {
-	close(ch /* ERROR cannot close non-channel */)
+	close(ch /* ERROR "cannot close non-channel" */)
 }
 
 func _[T C1](ch T) {
@@ -44,7 +44,7 @@
 }
 
 func _[T C2](ch T) {
-	close(ch /* ERROR cannot close receive-only channel */)
+	close(ch /* ERROR "cannot close receive-only channel" */)
 }
 
 func _[T C3](ch T) {
@@ -62,13 +62,13 @@
 // copy
 
 func _[T any](x, y T) {
-	copy(x /* ERROR copy expects slice arguments */ , y)
+	copy(x /* ERROR "copy expects slice arguments" */ , y)
 }
 
 func _[T ~[]byte](x, y T) {
 	copy(x, y)
 	copy(x, "foo")
-	copy("foo" /* ERROR expects slice arguments */ , y)
+	copy("foo" /* ERROR "expects slice arguments" */ , y)
 
 	var x2 []byte
 	copy(x2, y) // element types are identical
@@ -76,22 +76,22 @@
 
 	type myByte byte
 	var x3 []myByte
-	copy(x3 /* ERROR different element types */ , y)
-	copy(y /* ERROR different element types */ , x3)
+	copy(x3 /* ERROR "different element types" */ , y)
+	copy(y /* ERROR "different element types" */ , x3)
 }
 
 func _[T ~[]E, E any](x T, y []E) {
 	copy(x, y)
-	copy(x /* ERROR different element types */ , "foo")
+	copy(x /* ERROR "different element types" */ , "foo")
 }
 
 func _[T ~string](x []byte, y T) {
 	copy(x, y)
-	copy(y /* ERROR expects slice arguments */ , x)
+	copy(y /* ERROR "expects slice arguments" */ , x)
 }
 
 func _[T ~[]byte|~string](x T, y []byte) {
-	copy(x /* ERROR expects slice arguments */ , y)
+	copy(x /* ERROR "expects slice arguments" */ , y)
 	copy(y, x)
 }
 
@@ -111,11 +111,11 @@
 type M4[K comparable, V any] interface{ map[K]V | map[rune]V }
 
 func _[T any](m T) {
-	delete(m /* ERROR not a map */, "foo")
+	delete(m /* ERROR "not a map" */, "foo")
 }
 
 func _[T M0](m T) {
-	delete(m /* ERROR not a map */, "foo")
+	delete(m /* ERROR "not a map" */, "foo")
 }
 
 func _[T M1](m T) {
@@ -124,11 +124,11 @@
 
 func _[T M2](m T) {
 	delete(m, "foo")
-	delete(m, 0 /* ERROR cannot use .* as string */)
+	delete(m, 0 /* ERRORx `cannot use .* as string` */)
 }
 
 func _[T M3](m T) {
-	delete(m /* ERROR must have identical key types */, "foo")
+	delete(m /* ERROR "must have identical key types" */, "foo")
 }
 
 func _[T M4[rune, V], V any](m T) {
@@ -136,7 +136,7 @@
 }
 
 func _[T M4[K, V], K comparable, V any](m T) {
-	delete(m /* ERROR must have identical key types */, "foo")
+	delete(m /* ERROR "must have identical key types" */, "foo")
 }
 
 // make
@@ -158,30 +158,72 @@
 	_ = make([]int, 10)
 	_ = make(S0, 10)
 	_ = make(S1, 10)
-	_ = make() /* ERROR not enough arguments */
-	_ = make /* ERROR expects 2 or 3 arguments */ (S1)
+	_ = make() /* ERROR "not enough arguments" */
+	_ = make /* ERROR "expects 2 or 3 arguments" */ (S1)
 	_ = make(S1, 10, 20)
-	_ = make /* ERROR expects 2 or 3 arguments */ (S1, 10, 20, 30)
-	_ = make(S2 /* ERROR cannot make S2: no core type */ , 10)
+	_ = make /* ERROR "expects 2 or 3 arguments" */ (S1, 10, 20, 30)
+	_ = make(S2 /* ERROR "cannot make S2: no core type" */ , 10)
 
 	type M0 map[string]int
 	_ = make(map[string]int)
 	_ = make(M0)
 	_ = make(M1)
 	_ = make(M1, 10)
-	_ = make/* ERROR expects 1 or 2 arguments */(M1, 10, 20)
-	_ = make(M2 /* ERROR cannot make M2: no core type */ )
+	_ = make/* ERROR "expects 1 or 2 arguments" */(M1, 10, 20)
+	_ = make(M2 /* ERROR "cannot make M2: no core type" */ )
 
 	type C0 chan int
 	_ = make(chan int)
 	_ = make(C0)
 	_ = make(C1)
 	_ = make(C1, 10)
-	_ = make/* ERROR expects 1 or 2 arguments */(C1, 10, 20)
-	_ = make(C2 /* ERROR cannot make C2: no core type */ )
+	_ = make/* ERROR "expects 1 or 2 arguments" */(C1, 10, 20)
+	_ = make(C2 /* ERROR "cannot make C2: no core type" */ )
 	_ = make(C3)
 }
 
+// max
+
+func _[
+	P1 ~int|~float64,
+	P2 ~int|~string|~uint,
+	P3 ~int|bool,
+]() {
+	var x1 P1
+	_ = max(x1)
+	_ = max(x1, x1)
+	_ = max(1, x1, 2)
+	const _ = max /* ERROR "max(1, x1, 2) (value of type P1 constrained by ~int | ~float64) is not constant" */ (1, x1, 2)
+
+	var x2 P2
+	_ = max(x2)
+	_ = max(x2, x2)
+	_ = max(1, 2 /* ERROR "cannot convert 2 (untyped int constant) to type P2" */, x2) // error at 2 because max is 2
+
+	_ = max(x1, x2 /* ERROR "mismatched types P1 (previous argument) and P2 (type of x2)" */ )
+}
+
+// min
+
+func _[
+	P1 ~int|~float64,
+	P2 ~int|~string|~uint,
+	P3 ~int|bool,
+]() {
+	var x1 P1
+	_ = min(x1)
+	_ = min(x1, x1)
+	_ = min(1, x1, 2)
+	const _ = min /* ERROR "min(1, x1, 2) (value of type P1 constrained by ~int | ~float64) is not constant" */ (1, x1, 2)
+
+	var x2 P2
+	_ = min(x2)
+	_ = min(x2, x2)
+	_ = min(1 /* ERROR "cannot convert 1 (untyped int constant) to type P2" */ , 2, x2) // error at 1 because min is 1
+
+	_ = min(x1, x2 /* ERROR "mismatched types P1 (previous argument) and P2 (type of x2)" */ )
+}
+
 // unsafe.Alignof
 
 func _[T comparable]() {
@@ -200,8 +242,8 @@
 
 	const bb = unsafe.Alignof(b)
 	assert(bb == 8)
-	const _ = unsafe /* ERROR not constant */ .Alignof(a)
-	const _ = unsafe /* ERROR not constant */ .Alignof(s)
+	const _ = unsafe /* ERROR "not constant" */ .Alignof(a)
+	const _ = unsafe /* ERROR "not constant" */ .Alignof(s)
 	const pp = unsafe.Alignof(p)
 	assert(pp == 8)
 	const ll = unsafe.Alignof(l)
@@ -214,7 +256,7 @@
 	assert(cc == 8)
 	const mm = unsafe.Alignof(m)
 	assert(mm == 8)
-	const _ = unsafe /* ERROR not constant */ .Alignof(t)
+	const _ = unsafe /* ERROR "not constant" */ .Alignof(t)
 }
 
 // unsafe.Offsetof
@@ -235,8 +277,8 @@
 
 	const bb = unsafe.Offsetof(b.f)
 	assert(bb == 8)
-	const _ = unsafe /* ERROR not constant */ .Alignof(a)
-	const _ = unsafe /* ERROR not constant */ .Alignof(s)
+	const _ = unsafe /* ERROR "not constant" */ .Alignof(a)
+	const _ = unsafe /* ERROR "not constant" */ .Alignof(s)
 	const pp = unsafe.Offsetof(p.f)
 	assert(pp == 8)
 	const ll = unsafe.Offsetof(l.f)
@@ -249,7 +291,7 @@
 	assert(cc == 8)
 	const mm = unsafe.Offsetof(m.f)
 	assert(mm == 8)
-	const _ = unsafe /* ERROR not constant */ .Alignof(t)
+	const _ = unsafe /* ERROR "not constant" */ .Alignof(t)
 }
 
 // unsafe.Sizeof
@@ -270,8 +312,8 @@
 
 	const bb = unsafe.Sizeof(b)
 	assert(bb == 8)
-	const _ = unsafe /* ERROR not constant */ .Alignof(a)
-	const _ = unsafe /* ERROR not constant */ .Alignof(s)
+	const _ = unsafe /* ERROR "not constant" */ .Alignof(a)
+	const _ = unsafe /* ERROR "not constant" */ .Alignof(s)
 	const pp = unsafe.Sizeof(p)
 	assert(pp == 8)
 	const ll = unsafe.Sizeof(l)
@@ -284,5 +326,5 @@
 	assert(cc == 8)
 	const mm = unsafe.Sizeof(m)
 	assert(mm == 8)
-	const _ = unsafe /* ERROR not constant */ .Alignof(t)
+	const _ = unsafe /* ERROR "not constant" */ .Alignof(t)
 }
diff --git a/src/internal/types/testdata/check/const0.go b/src/internal/types/testdata/check/const0.go
index 402e6cf..49c62d6 100644
--- a/src/internal/types/testdata/check/const0.go
+++ b/src/internal/types/testdata/check/const0.go
@@ -13,10 +13,10 @@
 const c0 = x /* ERROR "not constant" */
 
 // typed constants must have constant types
-const _ interface /* ERROR invalid constant type */ {} = 0
+const _ interface /* ERROR "invalid constant type" */ {} = 0
 
 func _ () {
-	const _ interface /* ERROR invalid constant type */ {} = 0
+	const _ interface /* ERROR "invalid constant type" */ {} = 0
 	for i := 0; i < 10; i++ {} // don't crash with non-nil iota here
 }
 
@@ -372,11 +372,11 @@
 const prec = 512 // internal maximum precision for integers
 const maxInt = (1<<(prec/2) - 1) * (1<<(prec/2) + 1) // == 1<<prec - 1
 
-const _ = maxInt + /* ERROR constant addition overflow */ 1
-const _ = -maxInt - /* ERROR constant subtraction overflow */ 1
-const _ = maxInt ^ /* ERROR constant bitwise XOR overflow */ -1
-const _ = maxInt * /* ERROR constant multiplication overflow */ 2
-const _ = maxInt << /* ERROR constant shift overflow */ 2
-const _ = 1 << /* ERROR constant shift overflow */ prec
+const _ = maxInt + /* ERROR "constant addition overflow" */ 1
+const _ = -maxInt - /* ERROR "constant subtraction overflow" */ 1
+const _ = maxInt ^ /* ERROR "constant bitwise XOR overflow" */ -1
+const _ = maxInt * /* ERROR "constant multiplication overflow" */ 2
+const _ = maxInt << /* ERROR "constant shift overflow" */ 2
+const _ = 1 << /* ERROR "constant shift overflow" */ prec
 
-const _ = ^ /* ERROR constant bitwise complement overflow */ maxInt
+const _ = ^ /* ERROR "constant bitwise complement overflow" */ maxInt
diff --git a/src/internal/types/testdata/check/constdecl.go b/src/internal/types/testdata/check/constdecl.go
index faa9b9d..e7b871b 100644
--- a/src/internal/types/testdata/check/constdecl.go
+++ b/src/internal/types/testdata/check/constdecl.go
@@ -93,7 +93,7 @@
 }
 
 // Test case for constants depending on function literals (see also #22992).
-const A /* ERROR initialization cycle */ = unsafe.Sizeof(func() { _ = A })
+const A /* ERROR "initialization cycle" */ = unsafe.Sizeof(func() { _ = A })
 
 func _() {
 	// The function literal below must not see a.
@@ -111,13 +111,13 @@
 const (
 	_ byte = 255 + iota
 	/* some gap */
-	_ // ERROR overflows
+	_ // ERROR "overflows"
 	/* some gap */
-	/* some gap */ _ /* ERROR overflows */; _ /* ERROR overflows */
+	/* some gap */ _ /* ERROR "overflows" */; _ /* ERROR "overflows" */
 	/* some gap */
 	_ = 255 + iota
-	_ = byte /* ERROR overflows */ (255) + iota
-	_ /* ERROR overflows */
+	_ = byte /* ERROR "overflows" */ (255) + iota
+	_ /* ERROR "overflows" */
 )
 
 // Test cases from issue.
@@ -125,14 +125,14 @@
 	ok = byte(iota + 253)
 	bad
 	barn
-	bard // ERROR cannot convert
+	bard // ERROR "cannot convert"
 )
 
 const (
 	c = len([1 - iota]int{})
 	d
-	e // ERROR invalid array length
-	f // ERROR invalid array length
+	e // ERROR "invalid array length"
+	f // ERROR "invalid array length"
 )
 
 // Test that identifiers in implicit (omitted) RHS
diff --git a/src/internal/types/testdata/check/conversions1.go b/src/internal/types/testdata/check/conversions1.go
index 93a5f18..65aabde 100644
--- a/src/internal/types/testdata/check/conversions1.go
+++ b/src/internal/types/testdata/check/conversions1.go
@@ -20,7 +20,7 @@
 	var t T
 	var u struct{}
 	s = s
-	s = t // ERROR "cannot use .* in assignment"
+	s = t // ERRORx `cannot use .* in assignment`
 	s = u
 	s = S(s)
 	s = S(t)
@@ -40,12 +40,12 @@
 		x int "bar"
 	}
 	s = s
-	s = t // ERROR "cannot use .* in assignment"
-	s = u // ERROR "cannot use .* in assignment"
+	s = t // ERRORx `cannot use .* in assignment`
+	s = u // ERRORx `cannot use .* in assignment`
 	s = S(s)
 	s = S(t)
 	s = S(u)
-	t = u // ERROR "cannot use .* in assignment"
+	t = u // ERRORx `cannot use .* in assignment`
 	t = T(u)
 }
 
@@ -61,12 +61,12 @@
 		x E "bar"
 	}
 	s = s
-	s = t // ERROR "cannot use .* in assignment"
-	s = u // ERROR "cannot use .* in assignment"
+	s = t // ERRORx `cannot use .* in assignment`
+	s = u // ERRORx `cannot use .* in assignment`
 	s = S(s)
 	s = S(t)
 	s = S(u)
-	t = u // ERROR "cannot use .* in assignment"
+	t = u // ERRORx `cannot use .* in assignment`
 	t = T(u)
 }
 
@@ -89,12 +89,12 @@
 		} "bar"
 	}
 	s = s
-	s = t // ERROR "cannot use .* in assignment"
-	s = u // ERROR "cannot use .* in assignment"
+	s = t // ERRORx `cannot use .* in assignment`
+	s = u // ERRORx `cannot use .* in assignment`
 	s = S(s)
 	s = S(t)
 	s = S(u)
-	t = u // ERROR "cannot use .* in assignment"
+	t = u // ERRORx `cannot use .* in assignment`
 	t = T(u)
 }
 
@@ -115,12 +115,12 @@
 		x E2 "bar"
 	}
 	s = s
-	s = t // ERROR "cannot use .* in assignment"
-	s = u // ERROR "cannot use .* in assignment"
+	s = t // ERRORx `cannot use .* in assignment`
+	s = u // ERRORx `cannot use .* in assignment`
 	s = S(s)
 	s = S(t /* ERROR "cannot convert" */ )
 	s = S(u /* ERROR "cannot convert" */ )
-	t = u   // ERROR "cannot use .* in assignment"
+	t = u   // ERRORx `cannot use .* in assignment`
 	t = T(u)
 }
 
@@ -140,12 +140,12 @@
 	var t T
 	var u struct{ f func(E) }
 	s = s
-	s = t // ERROR "cannot use .* in assignment"
-	s = u // ERROR "cannot use .* in assignment"
+	s = t // ERRORx `cannot use .* in assignment`
+	s = u // ERRORx `cannot use .* in assignment`
 	s = S(s)
 	s = S(t)
 	s = S(u /* ERROR "cannot convert" */ )
-	t = u   // ERROR "cannot use .* in assignment"
+	t = u   // ERRORx `cannot use .* in assignment`
 	t = T(u /* ERROR "cannot convert" */ )
 }
 
@@ -158,12 +158,12 @@
 	var t *T
 	var u *struct{}
 	s = s
-	s = t // ERROR "cannot use .* in assignment"
-	s = u // ERROR "cannot use .* in assignment"
+	s = t // ERRORx `cannot use .* in assignment`
+	s = u // ERRORx `cannot use .* in assignment`
 	s = (*S)(s)
 	s = (*S)(t)
 	s = (*S)(u)
-	t = u // ERROR "cannot use .* in assignment"
+	t = u // ERRORx `cannot use .* in assignment`
 	t = (*T)(u)
 }
 
@@ -178,12 +178,12 @@
 		x int "bar"
 	}
 	s = s
-	s = t // ERROR "cannot use .* in assignment"
-	s = u // ERROR "cannot use .* in assignment"
+	s = t // ERRORx `cannot use .* in assignment`
+	s = u // ERRORx `cannot use .* in assignment`
 	s = (*S)(s)
 	s = (*S)(t)
 	s = (*S)(u)
-	t = u // ERROR "cannot use .* in assignment"
+	t = u // ERRORx `cannot use .* in assignment`
 	t = (*T)(u)
 }
 
@@ -199,12 +199,12 @@
 		x E "bar"
 	}
 	s = s
-	s = t // ERROR "cannot use .* in assignment"
-	s = u // ERROR "cannot use .* in assignment"
+	s = t // ERRORx `cannot use .* in assignment`
+	s = u // ERRORx `cannot use .* in assignment`
 	s = (*S)(s)
 	s = (*S)(t)
 	s = (*S)(u)
-	t = u // ERROR "cannot use .* in assignment"
+	t = u // ERRORx `cannot use .* in assignment`
 	t = (*T)(u)
 }
 
@@ -227,12 +227,12 @@
 		} "bar"
 	}
 	s = s
-	s = t // ERROR "cannot use .* in assignment"
-	s = u // ERROR "cannot use .* in assignment"
+	s = t // ERRORx `cannot use .* in assignment`
+	s = u // ERRORx `cannot use .* in assignment`
 	s = (*S)(s)
 	s = (*S)(t)
 	s = (*S)(u)
-	t = u // ERROR "cannot use .* in assignment"
+	t = u // ERRORx `cannot use .* in assignment`
 	t = (*T)(u)
 }
 
@@ -253,12 +253,12 @@
 		x E2 "bar"
 	}
 	s = s
-	s = t // ERROR "cannot use .* in assignment"
-	s = u // ERROR "cannot use .* in assignment"
+	s = t // ERRORx `cannot use .* in assignment`
+	s = u // ERRORx `cannot use .* in assignment`
 	s = (*S)(s)
 	s = (*S)(t /* ERROR "cannot convert" */ )
 	s = (*S)(u /* ERROR "cannot convert" */ )
-	t = u      // ERROR "cannot use .* in assignment"
+	t = u      // ERRORx `cannot use .* in assignment`
 	t = (*T)(u)
 }
 
@@ -278,12 +278,12 @@
 	var t *T
 	var u *struct{ f func(E) }
 	s = s
-	s = t // ERROR "cannot use .* in assignment"
-	s = u // ERROR "cannot use .* in assignment"
+	s = t // ERRORx `cannot use .* in assignment`
+	s = u // ERRORx `cannot use .* in assignment`
 	s = (*S)(s)
 	s = (*S)(t)
 	s = (*S)(u /* ERROR "cannot convert" */ )
-	t = u      // ERROR "cannot use .* in assignment"
+	t = u      // ERRORx `cannot use .* in assignment`
 	t = (*T)(u /* ERROR "cannot convert" */ )
 }
 
@@ -303,11 +303,11 @@
 	var t *T
 	var u *struct{ f func(E) }
 	s = s
-	s = t // ERROR "cannot use .* in assignment"
-	s = u // ERROR "cannot use .* in assignment"
+	s = t // ERRORx `cannot use .* in assignment`
+	s = u // ERRORx `cannot use .* in assignment`
 	s = (*S)(s)
 	s = (*S)(t)
 	s = (*S)(u /* ERROR "cannot convert" */ )
-	t = u      // ERROR "cannot use .* in assignment"
+	t = u      // ERRORx `cannot use .* in assignment`
 	t = (*T)(u /* ERROR "cannot convert" */ )
 }
diff --git a/src/internal/types/testdata/check/cycles0.go b/src/internal/types/testdata/check/cycles0.go
index 7c00c7d..8ad7877 100644
--- a/src/internal/types/testdata/check/cycles0.go
+++ b/src/internal/types/testdata/check/cycles0.go
@@ -8,10 +8,10 @@
 
 type (
 	T0 int
-	T1 /* ERROR invalid recursive type: T1 refers to itself */ T1
+	T1 /* ERROR "invalid recursive type: T1 refers to itself" */ T1
 	T2 *T2
 
-	T3 /* ERROR invalid recursive type */ T4
+	T3 /* ERROR "invalid recursive type" */ T4
 	T4 T5
 	T5 T3
 
@@ -20,10 +20,10 @@
 	T8 T6
 
 	// arrays
-	A0 /* ERROR invalid recursive type */ [10]A0
+	A0 /* ERROR "invalid recursive type" */ [10]A0
 	A1 [10]*A1
 
-	A2 /* ERROR invalid recursive type */ [10]A3
+	A2 /* ERROR "invalid recursive type" */ [10]A3
 	A3 [10]A4
 	A4 A2
 
@@ -34,18 +34,18 @@
 	L0 []L0
 
 	// structs
-	S0 /* ERROR invalid recursive type: S0 refers to itself */ struct{ _ S0 }
-	S1 /* ERROR invalid recursive type: S1 refers to itself */ struct{ S1 }
+	S0 /* ERROR "invalid recursive type: S0 refers to itself" */ struct{ _ S0 }
+	S1 /* ERROR "invalid recursive type: S1 refers to itself" */ struct{ S1 }
 	S2 struct{ _ *S2 }
 	S3 struct{ *S3 }
 
-	S4 /* ERROR invalid recursive type */ struct{ S5 }
+	S4 /* ERROR "invalid recursive type" */ struct{ S5 }
 	S5 struct{ S6 }
 	S6 S4
 
 	// pointers
 	P0 *P0
-	PP *struct{ PP.f /* ERROR PP.f is not a type */ }
+	PP *struct{ PP.f /* ERROR "PP.f is not a type" */ }
 
 	// functions
 	F0 func(F0)
@@ -53,9 +53,9 @@
 	F2 func(F2) F2
 
 	// interfaces
-	I0 /* ERROR invalid recursive type: I0 refers to itself */ interface{ I0 }
+	I0 /* ERROR "invalid recursive type: I0 refers to itself" */ interface{ I0 }
 
-	I1 /* ERROR invalid recursive type */ interface{ I2 }
+	I1 /* ERROR "invalid recursive type" */ interface{ I2 }
 	I2 interface{ I3 }
 	I3 interface{ I1 }
 
@@ -66,7 +66,7 @@
 	I6 interface{ I5 }
 
 	// maps
-	M0 map[M0 /* ERROR invalid map key */ ]M0
+	M0 map[M0 /* ERROR "invalid map key" */ ]M0
 
 	// channels
 	C0 chan C0
@@ -74,7 +74,7 @@
 
 // test case for issue #34771
 type (
-	AA /* ERROR invalid recursive type */ B
+	AA /* ERROR "invalid recursive type" */ B
 	B C
 	C [10]D
 	D E
@@ -83,23 +83,23 @@
 
 func _() {
 	type (
-		t1 /* ERROR invalid recursive type: t1 refers to itself */ t1
+		t1 /* ERROR "invalid recursive type: t1 refers to itself" */ t1
 		t2 *t2
 
-		t3 t4 /* ERROR undefined */
-		t4 t5 /* ERROR undefined */
+		t3 t4 /* ERROR "undefined" */
+		t4 t5 /* ERROR "undefined" */
 		t5 t3
 
 		// arrays
-		a0 /* ERROR invalid recursive type: a0 refers to itself */ [10]a0
+		a0 /* ERROR "invalid recursive type: a0 refers to itself" */ [10]a0
 		a1 [10]*a1
 
 		// slices
 		l0 []l0
 
 		// structs
-		s0 /* ERROR invalid recursive type: s0 refers to itself */ struct{ _ s0 }
-		s1 /* ERROR invalid recursive type: s1 refers to itself */ struct{ s1 }
+		s0 /* ERROR "invalid recursive type: s0 refers to itself" */ struct{ _ s0 }
+		s1 /* ERROR "invalid recursive type: s1 refers to itself" */ struct{ s1 }
 		s2 struct{ _ *s2 }
 		s3 struct{ *s3 }
 
@@ -112,10 +112,10 @@
 		f2 func(f2) f2
 
 		// interfaces
-		i0 /* ERROR invalid recursive type: i0 refers to itself */ interface{ i0 }
+		i0 /* ERROR "invalid recursive type: i0 refers to itself" */ interface{ i0 }
 
 		// maps
-		m0 map[m0 /* ERROR invalid map key */ ]m0
+		m0 map[m0 /* ERROR "invalid map key" */ ]m0
 
 		// channels
 		c0 chan c0
@@ -124,10 +124,10 @@
 
 // test cases for issue 6667
 
-type A [10]map[A /* ERROR invalid map key */ ]bool
+type A [10]map[A /* ERROR "invalid map key" */ ]bool
 
 type S struct {
-	m map[S /* ERROR invalid map key */ ]bool
+	m map[S /* ERROR "invalid map key" */ ]bool
 }
 
 // test cases for issue 7236
@@ -135,32 +135,32 @@
 
 type (
 	P1 *T9
-	T9 /* ERROR invalid recursive type: T9 refers to itself */ T9
+	T9 /* ERROR "invalid recursive type: T9 refers to itself" */ T9
 
-	T10 /* ERROR invalid recursive type: T10 refers to itself */ T10
+	T10 /* ERROR "invalid recursive type: T10 refers to itself" */ T10
 	P2 *T10
 )
 
 func (T11) m() {}
 
-type T11 /* ERROR invalid recursive type: T11 refers to itself */ struct{ T11 }
+type T11 /* ERROR "invalid recursive type: T11 refers to itself" */ struct{ T11 }
 
-type T12 /* ERROR invalid recursive type: T12 refers to itself */ struct{ T12 }
+type T12 /* ERROR "invalid recursive type: T12 refers to itself" */ struct{ T12 }
 
 func (*T12) m() {}
 
 type (
 	P3 *T13
-	T13 /* ERROR invalid recursive type */ T13
+	T13 /* ERROR "invalid recursive type" */ T13
 )
 
 // test cases for issue 18643
 // (type cycle detection when non-type expressions are involved)
 type (
-	T14 [len(T14 /* ERROR invalid recursive type */ {})]int
-	T15 [][len(T15 /* ERROR invalid recursive type */ {})]int
-	T16 map[[len(T16 /* ERROR invalid recursive type */ {1:2})]int]int
-	T17 map[int][len(T17 /* ERROR invalid recursive type */ {1:2})]int
+	T14 [len(T14 /* ERROR "invalid recursive type" */ {})]int
+	T15 [][len(T15 /* ERROR "invalid recursive type" */ {})]int
+	T16 map[[len(T16 /* ERROR "invalid recursive type" */ {1:2})]int]int
+	T17 map[int][len(T17 /* ERROR "invalid recursive type" */ {1:2})]int
 )
 
 // Test case for types depending on function literals (see also #22992).
@@ -169,7 +169,7 @@
 
 func _() {
 	type T0 func(T0)
-	type T1 /* ERROR invalid recursive type */ = func(T1)
+	type T1 /* ERROR "invalid recursive type" */ = func(T1)
 	type T2 chan [unsafe.Sizeof(func(ch T2){ _ = <-ch })]byte
-	type T3 /* ERROR invalid recursive type */ = chan [unsafe.Sizeof(func(ch T3){ _ = <-ch })]byte
+	type T3 /* ERROR "invalid recursive type" */ = chan [unsafe.Sizeof(func(ch T3){ _ = <-ch })]byte
 }
diff --git a/src/internal/types/testdata/check/cycles2.go b/src/internal/types/testdata/check/cycles2.go
index 8480b29..a932d28 100644
--- a/src/internal/types/testdata/check/cycles2.go
+++ b/src/internal/types/testdata/check/cycles2.go
@@ -65,30 +65,30 @@
 // Test case for issue 6638.
 
 type T interface {
-	m() [T(nil).m /* ERROR undefined */ ()[0]]int
+	m() [T(nil).m /* ERROR "undefined" */ ()[0]]int
 }
 
 // Variations of this test case.
 
-type T1 /* ERROR invalid recursive type */ interface {
+type T1 /* ERROR "invalid recursive type" */ interface {
 	m() [x1.m()[0]]int
 }
 
 var x1 T1
 
-type T2 /* ERROR invalid recursive type */ interface {
+type T2 /* ERROR "invalid recursive type" */ interface {
 	m() [len(x2.m())]int
 }
 
 var x2 T2
 
-type T3 /* ERROR invalid recursive type */ interface {
+type T3 /* ERROR "invalid recursive type" */ interface {
 	m() [unsafe.Sizeof(x3.m)]int
 }
 
 var x3 T3
 
-type T4 /* ERROR invalid recursive type */ interface {
+type T4 /* ERROR "invalid recursive type" */ interface {
 	m() [unsafe.Sizeof(cast4(x4.m))]int // cast is invalid but we have a cycle, so all bets are off
 }
 
diff --git a/src/internal/types/testdata/check/cycles3.go b/src/internal/types/testdata/check/cycles3.go
index 4330551..3ed999c 100644
--- a/src/internal/types/testdata/check/cycles3.go
+++ b/src/internal/types/testdata/check/cycles3.go
@@ -48,7 +48,7 @@
 )
 
 type (
-	U /* ERROR invalid recursive type */ interface {
+	U /* ERROR "invalid recursive type" */ interface {
 		V
 	}
 
diff --git a/src/internal/types/testdata/check/cycles4.go b/src/internal/types/testdata/check/cycles4.go
index 924aabf..e823001 100644
--- a/src/internal/types/testdata/check/cycles4.go
+++ b/src/internal/types/testdata/check/cycles4.go
@@ -115,7 +115,7 @@
 // to follow-on errors due to an incorrectly computed type set.
 
 type T8 interface {
-	m() [unsafe.Sizeof(T8.m /* ERROR undefined */ )]int
+	m() [unsafe.Sizeof(T8.m /* ERROR "undefined" */ )]int
 }
 
 var _ = T8.m // no error expected here
diff --git a/src/internal/types/testdata/check/cycles5.go b/src/internal/types/testdata/check/cycles5.go
index 5e0d191..a863aa8 100644
--- a/src/internal/types/testdata/check/cycles5.go
+++ b/src/internal/types/testdata/check/cycles5.go
@@ -98,12 +98,12 @@
 
 type (
 	T1 interface { T2 }
-	T2 /* ERROR invalid recursive type */ T2
+	T2 /* ERROR "invalid recursive type" */ T2
 )
 
 type (
 	T3 interface { T4 }
-	T4 /* ERROR invalid recursive type */ T5
+	T4 /* ERROR "invalid recursive type" */ T5
 	T5 = T6
 	T6 = T7
 	T7 = T4
@@ -121,8 +121,8 @@
 
 // test cases for varias alias cycles
 
-type T10 /* ERROR invalid recursive type */ = *T10                 // issue #25141
-type T11 /* ERROR invalid recursive type */ = interface{ f(T11) }  // issue #23139
+type T10 /* ERROR "invalid recursive type" */ = *T10                 // issue #25141
+type T11 /* ERROR "invalid recursive type" */ = interface{ f(T11) }  // issue #23139
 
 // issue #18640
 type (
@@ -135,7 +135,7 @@
 type (
 	a struct{ *b }
 	b = c
-	c struct{ *b /* ERROR invalid use of type alias */ }
+	c struct{ *b /* ERROR "invalid use of type alias" */ }
 )
 
 // issue #24939
@@ -145,7 +145,7 @@
 	}
 
 	M interface {
-		F() P // ERROR invalid use of type alias
+		F() P // ERROR "invalid use of type alias"
 	}
 
 	P = interface {
@@ -154,23 +154,23 @@
 )
 
 // issue #8699
-type T12 /* ERROR invalid recursive type */ [len(a12)]int
+type T12 /* ERROR "invalid recursive type" */ [len(a12)]int
 var a12 = makeArray()
 func makeArray() (res T12) { return }
 
 // issue #20770
-var r /* ERROR invalid cycle in declaration of r */ = newReader()
+var r /* ERROR "invalid cycle in declaration of r" */ = newReader()
 func newReader() r
 
 // variations of the theme of #8699 and #20770
-var arr /* ERROR cycle */ = f()
+var arr /* ERROR "cycle" */ = f()
 func f() [len(arr)]int
 
 // issue #25790
-func ff(ff /* ERROR not a type */ )
-func gg((gg /* ERROR not a type */ ))
+func ff(ff /* ERROR "not a type" */ )
+func gg((gg /* ERROR "not a type" */ ))
 
-type T13 /* ERROR invalid recursive type T13 */ [len(b13)]int
+type T13 /* ERROR "invalid recursive type T13" */ [len(b13)]int
 var b13 T13
 
 func g1() [unsafe.Sizeof(g1)]int
@@ -184,13 +184,13 @@
 	assert(unsafe.Sizeof(x2) == 8)
 }
 
-func h() [h /* ERROR no value */ ()[0]]int { panic(0) }
+func h() [h /* ERROR "no value" */ ()[0]]int { panic(0) }
 
-var c14 /* ERROR cycle */ T14
+var c14 /* ERROR "cycle" */ T14
 type T14 [uintptr(unsafe.Sizeof(&c14))]byte
 
 // issue #34333
-type T15 /* ERROR invalid recursive type T15 */ struct {
+type T15 /* ERROR "invalid recursive type T15" */ struct {
 	f func() T16
 	b T16
 }
diff --git a/src/internal/types/testdata/check/decls0.go b/src/internal/types/testdata/check/decls0.go
index 868b318..0b99faa 100644
--- a/src/internal/types/testdata/check/decls0.go
+++ b/src/internal/types/testdata/check/decls0.go
@@ -51,11 +51,11 @@
 
 // invalid array types
 type (
-	iA0 [... /* ERROR "invalid use of \[...\] array" */ ]byte
+	iA0 [... /* ERROR "invalid use of [...] array" */ ]byte
 	// The error message below could be better. At the moment
 	// we believe an integer that is too large is not an integer.
 	// But at least we get an error.
-	iA1 [1 /* ERROR "must be integer" */ <<100]int
+	iA1 [1 /* ERROR "invalid array length" */ <<100]int
 	iA2 [- /* ERROR "invalid array length" */ 1]complex128
 	iA3 ["foo" /* ERROR "must be integer" */ ]string
 	iA4 [float64 /* ERROR "must be integer" */ (0)]int
@@ -189,10 +189,10 @@
 // TODO(#43215) this should be detected as a cycle error
 func f5([unsafe.Sizeof(f5)]int) {}
 
-func (S0) m1 (x S0.m1 /* ERROR S0.m1 is not a type */ ) {}
-func (S0) m2 (x *S0.m2 /* ERROR S0.m2 is not a type */ ) {}
-func (S0) m3 () (x S0.m3 /* ERROR S0.m3 is not a type */ ) { return }
-func (S0) m4 () (x *S0.m4 /* ERROR S0.m4 is not a type */ ) { return }
+func (S0) m1 (x S0.m1 /* ERROR "S0.m1 is not a type" */ ) {}
+func (S0) m2 (x *S0.m2 /* ERROR "S0.m2 is not a type" */ ) {}
+func (S0) m3 () (x S0.m3 /* ERROR "S0.m3 is not a type" */ ) { return }
+func (S0) m4 () (x *S0.m4 /* ERROR "S0.m4 is not a type" */ ) { return }
 
 // interfaces may not have any blank methods
 type BlankI interface {
diff --git a/src/internal/types/testdata/check/decls1.go b/src/internal/types/testdata/check/decls1.go
index b232fc8..06f3b2e 100644
--- a/src/internal/types/testdata/check/decls1.go
+++ b/src/internal/types/testdata/check/decls1.go
@@ -48,16 +48,16 @@
 	s19 = s1 /* ERROR "cannot call" */ ()
  	s20 = f0 /* ERROR "no value" */ ()
 	s21 = f6(1, s1, i)
-	s22 = f6(1, s1, uu /* ERROR "cannot use .* in argument" */ )
+	s22 = f6(1, s1, uu /* ERRORx `cannot use .* in argument` */ )
 
 	t1 int = i + j
 	t2 int = i /* ERROR "mismatched types" */ + x
-	t3 int = c /* ERROR "cannot use .* variable declaration" */ + d
+	t3 int = c /* ERRORx `cannot use .* variable declaration` */ + 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 use .* variable declaration" */ a
+	t8 *int = & /* ERRORx `cannot use .* variable declaration` */ a
 	t10 *int = &42 /* ERROR "cannot take address" */
 	t11 *complex64 = &v
 	t12 complex64 = -(u + *t11) / *&v
@@ -69,7 +69,7 @@
 	t18 float64 = math.Pi * 10.0
 	t19 int = t1 /* ERROR "cannot call" */ ()
 	t20 int = f0 /* ERROR "no value" */ ()
-	t21 int = a /* ERROR "cannot use .* variable declaration" */
+	t21 int = a /* ERRORx `cannot use .* variable declaration` */
 )
 
 // Various more complex expressions
@@ -96,8 +96,8 @@
 	v11 = xx/yy*yy - xx
 	v12 = true && false
 	v13 = nil /* ERROR "use of untyped nil" */
-	v14 string = 257 // ERROR cannot use 257 .* as string value in variable declaration$
-	v15 int8 = 257 // ERROR cannot use 257 .* as int8 value in variable declaration .*overflows
+	v14 string = 257 // ERRORx `cannot use 257 .* as string value in variable declaration$`
+	v15 int8 = 257 // ERRORx `cannot use 257 .* as int8 value in variable declaration .*overflows`
 )
 
 // Multiple assignment expressions
diff --git a/src/internal/types/testdata/check/decls2/decls2a.go b/src/internal/types/testdata/check/decls2/decls2a.go
index 731405b..c2fb421 100644
--- a/src/internal/types/testdata/check/decls2/decls2a.go
+++ b/src/internal/types/testdata/check/decls2/decls2a.go
@@ -95,8 +95,8 @@
 // Methods associated with non-local or unnamed types.
 func (int /* ERROR "cannot define new methods on non-local type int" */ ) m() {}
 func ([ /* ERROR "invalid receiver" */ ]int) m() {}
-func (time /* ERROR "cannot define new methods on non-local type time\.Time" */ .Time) m() {}
-func (* /* ERROR "cannot define new methods on non-local type time\.Time" */ time.Time) m() {}
+func (time /* ERROR "cannot define new methods on non-local type time.Time" */ .Time) m() {}
+func (* /* ERROR "cannot define new methods on non-local type time.Time" */ time.Time) m() {}
 func (x /* ERROR "invalid receiver" */ interface{}) m() {}
 
 // Unsafe.Pointer is treated like a pointer when used as receiver type.
diff --git a/src/internal/types/testdata/check/decls2/decls2b.go b/src/internal/types/testdata/check/decls2/decls2b.go
index d4c5861..dd6cd44 100644
--- a/src/internal/types/testdata/check/decls2/decls2b.go
+++ b/src/internal/types/testdata/check/decls2/decls2b.go
@@ -40,17 +40,17 @@
 // Verify by checking that errors are reported.
 func (T /* ERROR "undefined" */ ) _() {}
 func (T1) _(undefined /* ERROR "undefined" */ ) {}
-func (T1) _() int { return "foo" /* ERROR "cannot use .* in return statement" */ }
+func (T1) _() int { return "foo" /* ERRORx "cannot use .* in return statement" */ }
 
 // Methods with undefined receiver type can still be checked.
 // Verify by checking that errors are reported.
 func (Foo /* ERROR "undefined" */ ) m() {}
 func (Foo /* ERROR "undefined" */ ) m(undefined /* ERROR "undefined" */ ) {}
-func (Foo /* ERROR "undefined" */ ) m() int { return "foo" /* ERROR "cannot use .* in return statement" */ }
+func (Foo /* ERRORx `undefined` */ ) m() int { return "foo" /* ERRORx "cannot use .* in return statement" */ }
 
 func (Foo /* ERROR "undefined" */ ) _() {}
 func (Foo /* ERROR "undefined" */ ) _(undefined /* ERROR "undefined" */ ) {}
-func (Foo /* ERROR "undefined" */ ) _() int { return "foo" /* ERROR "cannot use .* in return statement" */ }
+func (Foo /* ERROR "undefined" */ ) _() int { return "foo" /* ERRORx "cannot use .* in return statement" */ }
 
 // Receiver declarations are regular parameter lists;
 // receiver types may use parentheses, and the list
diff --git a/src/internal/types/testdata/check/decls3.go b/src/internal/types/testdata/check/decls3.go
index 01d4ffe..3d00a58 100644
--- a/src/internal/types/testdata/check/decls3.go
+++ b/src/internal/types/testdata/check/decls3.go
@@ -99,9 +99,9 @@
 	// unsafe.Pointers are treated like regular pointers when embedded
 	type T2 struct {
 		unsafe /* ERROR "cannot be unsafe.Pointer" */ .Pointer
-		*/* ERROR "cannot be unsafe.Pointer" */ /* ERROR "Pointer redeclared" */ unsafe.Pointer
+		*/* ERROR "cannot be unsafe.Pointer" */ unsafe.Pointer /* ERROR "Pointer redeclared" */
 		UP /* ERROR "cannot be unsafe.Pointer" */
-		* /* ERROR "cannot be unsafe.Pointer" */  /* ERROR "UP redeclared" */ UP
+		* /* ERROR "cannot be unsafe.Pointer" */ UP /* ERROR "UP redeclared" */
 	}
 }
 
@@ -223,7 +223,7 @@
 	_ = S2{}.D /* ERROR "no field or method" */
 	_ = S3{}.S1 /* ERROR "ambiguous selector S3{}.S1" */
 	_ = S3{}.A
-	_ = S3{}.B /* ERROR "ambiguous selector" S3{}.B */
+	_ = S3{}.B /* ERROR "ambiguous selector S3{}.B" */
 	_ = S3{}.D
 	_ = S3{}.E
 	_ = S4{}.A
diff --git a/src/internal/types/testdata/check/decls4.go b/src/internal/types/testdata/check/decls4.go
index c1294ee..c47a68d 100644
--- a/src/internal/types/testdata/check/decls4.go
+++ b/src/internal/types/testdata/check/decls4.go
@@ -61,10 +61,10 @@
 // alias receiver types
 func (Ai /* ERROR "cannot define new methods on non-local type int" */) m1() {}
 func (T0) m1() {}
-func (A0) m1 /* ERROR already declared */ () {}
+func (A0) m1 /* ERROR "already declared" */ () {}
 func (A0) m2 () {}
-func (A3 /* ERROR invalid receiver */ ) m1 () {}
-func (A10 /* ERROR invalid receiver */ ) m1() {}
+func (A3 /* ERROR "invalid receiver" */ ) m1 () {}
+func (A10 /* ERROR "invalid receiver" */ ) m1() {}
 
 // x0 has methods m1, m2 declared via receiver type names T0 and A0
 var _ interface{ m1(); m2() } = x0
@@ -95,12 +95,12 @@
 	V3 = T
 )
 
-func (V0) m /* ERROR already declared */ () {}
+func (V0) m /* ERROR "already declared" */ () {}
 func (V1) n() {}
 
 // alias receiver types (invalid due to cycles)
 type (
-	W0 /* ERROR invalid recursive type */ = W1
+	W0 /* ERROR "invalid recursive type" */ = W1
 	W1 = (W2)
 	W2 = ((W0))
 )
@@ -115,19 +115,19 @@
 	B2 = int
 )
 
-func (B0 /* ERROR cannot define new methods on non-local type int */ ) m() {}
-func (B1 /* ERROR cannot define new methods on non-local type int */ ) n() {}
+func (B0 /* ERROR "cannot define new methods on non-local type int" */ ) m() {}
+func (B1 /* ERROR "cannot define new methods on non-local type int" */ ) n() {}
 
 // cycles
 type (
-	C2 /* ERROR invalid recursive type */ = C2
-	C3 /* ERROR invalid recursive type */ = C4
+	C2 /* ERROR "invalid recursive type" */ = C2
+	C3 /* ERROR "invalid recursive type" */ = C4
 	C4 = C3
 	C5 struct {
 		f *C6
 	}
 	C6 = C5
-	C7 /* ERROR invalid recursive type */  struct {
+	C7 /* ERROR "invalid recursive type" */  struct {
 		f C8
 	}
 	C8 = C7
@@ -136,7 +136,7 @@
 // embedded fields
 var (
 	s0 struct { T0 }
-	s1 struct { A0 } = s0 /* ERROR cannot use */ // embedded field names are different
+	s1 struct { A0 } = s0 /* ERROR "cannot use" */ // embedded field names are different
 )
 
 // embedding and lookup of fields and methods
@@ -190,10 +190,10 @@
 }
 
 var (
-	_ = eD{}.xf /* ERROR ambiguous selector eD{}.xf */
-	_ = eD{}.xm /* ERROR ambiguous selector eD{}.xm */
+	_ = eD{}.xf /* ERROR "ambiguous selector eD{}.xf" */
+	_ = eD{}.xm /* ERROR "ambiguous selector eD{}.xm" */
 )
 
 var (
-	_ interface{ xm() } = eD /* ERROR missing method xm */ {}
+	_ interface{ xm() } = eD /* ERROR "ambiguous selector eD.xm" */ {}
 )
\ No newline at end of file
diff --git a/src/internal/types/testdata/check/errors.go b/src/internal/types/testdata/check/errors.go
index b3ab8af..10b6a22 100644
--- a/src/internal/types/testdata/check/errors.go
+++ b/src/internal/types/testdata/check/errors.go
@@ -8,59 +8,59 @@
 // (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)
+	_ = f /* ERROR "f(0, m) (no value) used as value" */ (0, m)
 
 	// built-ins
-	_ = println // ERROR println \(built-in\) must be called
+	_ = println // ERROR "println (built-in) must be called"
 
 	// types
-	_ = complex128 // ERROR complex128 \(type\) is not an expression
+	_ = complex128 // ERROR "complex128 (type) is not an expression"
 
 	// constants
 	const c1 = 991
 	const c2 float32 = 0.5
 	const c3 = "foo"
-	0 // ERROR 0 \(untyped int constant\) is not used
-	0.5 // ERROR 0.5 \(untyped float constant\) is not used
-	"foo" // ERROR "foo" \(untyped string constant\) is not used
-	c1 // ERROR c1 \(untyped int constant 991\) is not used
-	c2 // ERROR c2 \(constant 0.5 of type float32\) is not used
-	c1 /* ERROR c1 \+ c2 \(constant 991.5 of type float32\) is not used */ + c2
-	c3 // ERROR c3 \(untyped string constant "foo"\) is not used
+	0 // ERROR "0 (untyped int constant) is not used"
+	0.5 // ERROR "0.5 (untyped float constant) is not used"
+	"foo" // ERROR `"foo" (untyped string constant) is not used`
+	c1 // ERROR "c1 (untyped int constant 991) is not used"
+	c2 // ERROR "c2 (constant 0.5 of type float32) is not used"
+	c1 /* ERROR "c1 + c2 (constant 991.5 of type float32) is not used" */ + c2
+	c3 // ERROR `c3 (untyped string constant "foo") is not used`
 
 	// variables
-	x // ERROR x \(variable of type int\) is not used
+	x // ERROR "x (variable of type int) is not used"
 
 	// values
-	nil // ERROR nil is not used
-	( /* ERROR \(\*int\)\(nil\) \(value of type \*int\) is not used */ *int)(nil)
-	x /* ERROR x != x \(untyped bool value\) is not used */ != x
-	x /* ERROR x \+ x \(value of type int\) is not used */ + x
+	nil // ERROR "nil is not used"
+	( /* ERROR "(*int)(nil) (value of type *int) is not used" */ *int)(nil)
+	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]
+	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
+	0 /* ERRORx "0 .* is not used" */
+	0 /* ERRORx "0 .* is not used" */
+	0 // ERRORx "0 .* is not used"
+	0 // ERRORx "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 undefined */ (); err != nil /* no error here */ {}
+	if err := foo /* ERROR "undefined" */ (); 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
+var _ int = T /* ERROR "value of type T" */ {} // use T in error message rather than errors.T
 
 // Don't report errors containing "invalid type" (issue #24182).
-func _(x *missing /* ERROR undefined: missing */ ) {
+func _(x *missing /* ERROR "undefined: missing" */ ) {
 	x.m() // there shouldn't be an error here referring to *invalid type
 }
diff --git a/src/internal/types/testdata/check/expr0.go b/src/internal/types/testdata/check/expr0.go
index dd86eca..eba991e 100644
--- a/src/internal/types/testdata/check/expr0.go
+++ b/src/internal/types/testdata/check/expr0.go
@@ -24,12 +24,14 @@
 	b11 = &b0
 	b12 = <-b0 /* ERROR "cannot receive" */
 	b13 = & & /* ERROR "cannot take address" */ b0
+	b14 = ~ /* ERROR "cannot use ~ outside of interface or type constraint" */ b0
 
 	// byte
 	_ = byte(0)
 	_ = byte(- /* ERROR "cannot convert" */ 1)
-	_ = - /* ERROR "-byte\(1\) \(constant -1 of type byte\) overflows byte" */ byte(1) // test for issue 11367
+	_ = - /* ERROR "-byte(1) (constant -1 of type byte) overflows byte" */ byte(1) // test for issue 11367
 	_ = byte /* ERROR "overflows byte" */ (0) - byte(1)
+	_ = ~ /* ERROR "cannot use ~ outside of interface or type constraint (use ^ for bitwise complement)" */ byte(0)
 
 	// int
 	i0 = 1
@@ -51,6 +53,7 @@
 	i16 = &i0
 	i17 = *i16
 	i18 = <-i16 /* ERROR "cannot receive" */
+	i19 = ~ /* ERROR "cannot use ~ outside of interface or type constraint (use ^ for bitwise complement)" */ i0
 
 	// uint
 	u0 = uint(1)
@@ -73,6 +76,7 @@
 	u17 = *u16
 	u18 = <-u16 /* ERROR "cannot receive" */
 	u19 = ^uint(0)
+	u20 = ~ /* ERROR "cannot use ~ outside of interface or type constraint (use ^ for bitwise complement)" */ u0
 
 	// float64
 	f0 = float64(1)
@@ -94,6 +98,7 @@
 	f16 = &f0
 	f17 = *u16
 	f18 = <-u16 /* ERROR "cannot receive" */
+	f19 = ~ /* ERROR "cannot use ~ outside of interface or type constraint" */ f0
 
 	// complex128
 	c0 = complex128(1)
@@ -115,6 +120,7 @@
 	c16 = &c0
 	c17 = *u16
 	c18 = <-u16 /* ERROR "cannot receive" */
+	c19 = ~ /* ERROR "cannot use ~ outside of interface or type constraint" */ c0
 
 	// string
 	s0 = "foo"
@@ -126,6 +132,7 @@
 	s6 = &s4
 	s7 = *s6
 	s8 = <-s7
+	s9 = ~ /* ERROR "cannot use ~ outside of interface or type constraint" */ s0
 
 	// channel
 	ch chan int
@@ -144,7 +151,9 @@
 	ch10, ok = <-ch
 	// ok is of type bool
 	ch11, myok = <-ch
-	_ mybool = myok /* ERROR "cannot use .* in variable declaration" */
+	_ mybool = myok /* ERRORx `cannot use .* in variable declaration` */
+	ch12 = ~ /* ERROR "cannot use ~ outside of interface or type constraint" */ ch
+
 )
 
 // address of composite literals
@@ -175,13 +184,13 @@
 func g() (a, b int) { return }
 
 func _() {
-	_ = -g /* ERROR multiple-value g */ ()
-	_ = <-g /* ERROR multiple-value g */ ()
+	_ = -g /* ERROR "multiple-value g" */ ()
+	_ = <-g /* ERROR "multiple-value g" */ ()
 }
 
 // ~ is accepted as unary operator only permitted in interface type elements
 var (
-	_ = ~ /* ERROR cannot use ~ outside of interface or type constraint */ 0
-	_ = ~ /* ERROR cannot use ~ outside of interface or type constraint */ "foo"
-	_ = ~ /* ERROR cannot use ~ outside of interface or type constraint */ i0
+	_ = ~ /* ERROR "cannot use ~ outside of interface or type constraint" */ 0
+	_ = ~ /* ERROR "cannot use ~ outside of interface or type constraint" */ "foo"
+	_ = ~ /* ERROR "cannot use ~ outside of interface or type constraint" */ i0
 )
diff --git a/src/internal/types/testdata/check/expr1.go b/src/internal/types/testdata/check/expr1.go
index 49e8bae..1c04c8f 100644
--- a/src/internal/types/testdata/check/expr1.go
+++ b/src/internal/types/testdata/check/expr1.go
@@ -16,10 +16,10 @@
 	x = x && true
 	x = x && false
 
-	z = z /* ERROR mismatched types */ || y
+	z = z /* ERROR "mismatched types" */ || y
 	z = z || true
 	z = z || false
-	z = z /* ERROR mismatched types */ && y
+	z = z /* ERROR "mismatched types" */ && y
 	z = z && true
 	z = z && false
 }
@@ -29,7 +29,7 @@
 func _(x, y int, z myint) {
 	x = x + 1
 	x = x + 1.0
-	x = x + 1.1 // ERROR truncated to int
+	x = x + 1.1 // ERROR "truncated to int"
 	x = x + y
 	x = x - y
 	x = x * y
@@ -40,12 +40,12 @@
 
 	z = z + 1
 	z = z + 1.0
-	z = z + 1.1 // ERROR truncated to int
-	z = z /* ERROR mismatched types */ + y
-	z = z /* ERROR mismatched types */ - y
-	z = z /* ERROR mismatched types */ * y
-	z = z /* ERROR mismatched types */ / y
-	z = z /* ERROR mismatched types */ % y
+	z = z + 1.1 // ERROR "truncated to int"
+	z = z /* ERROR "mismatched types" */ + y
+	z = z /* ERROR "mismatched types" */ - y
+	z = z /* ERROR "mismatched types" */ * y
+	z = z /* ERROR "mismatched types" */ / y
+	z = z /* ERROR "mismatched types" */ % y
 	z = z << y
 	z = z >> y
 }
@@ -54,9 +54,9 @@
 
 func _(x, y uint, z myuint) {
 	x = x + 1
-	x = x + - /* ERROR overflows uint */ 1
+	x = x + - /* ERROR "overflows uint" */ 1
 	x = x + 1.0
-	x = x + 1.1 // ERROR truncated to uint
+	x = x + 1.1 // ERROR "truncated to uint"
 	x = x + y
 	x = x - y
 	x = x * y
@@ -66,14 +66,14 @@
 	x = x >> y
 
 	z = z + 1
-	z = x + - /* ERROR overflows uint */ 1
+	z = x + - /* ERROR "overflows uint" */ 1
 	z = z + 1.0
-	z = z + 1.1 // ERROR truncated to uint
-	z = z /* ERROR mismatched types */ + y
-	z = z /* ERROR mismatched types */ - y
-	z = z /* ERROR mismatched types */ * y
-	z = z /* ERROR mismatched types */ / y
-	z = z /* ERROR mismatched types */ % y
+	z = z + 1.1 // ERROR "truncated to uint"
+	z = z /* ERROR "mismatched types" */ + y
+	z = z /* ERROR "mismatched types" */ - y
+	z = z /* ERROR "mismatched types" */ * y
+	z = z /* ERROR "mismatched types" */ / y
+	z = z /* ERROR "mismatched types" */ % y
 	z = z << y
 	z = z >> y
 }
@@ -89,39 +89,39 @@
 	x = x - y
 	x = x * y
 	x = x / y
-	x = x /* ERROR not defined */ % y
-	x = x /* ERROR operand x .* must be integer */ << y
-	x = x /* ERROR operand x .* must be integer */ >> y
+	x = x /* ERROR "not defined" */ % y
+	x = x /* ERRORx `operand x .* must be integer` */ << y
+	x = x /* ERRORx `operand x .* must be integer` */ >> y
 
 	z = z + 1
 	z = z + -1
 	z = z + 1.0
 	z = z + 1.1
-	z = z /* ERROR mismatched types */ + y
-	z = z /* ERROR mismatched types */ - y
-	z = z /* ERROR mismatched types */ * y
-	z = z /* ERROR mismatched types */ / y
-	z = z /* ERROR mismatched types */ % y
-	z = z /* ERROR operand z .* must be integer */ << y
-	z = z /* ERROR operand z .* must be integer */ >> y
+	z = z /* ERROR "mismatched types" */ + y
+	z = z /* ERROR "mismatched types" */ - y
+	z = z /* ERROR "mismatched types" */ * y
+	z = z /* ERROR "mismatched types" */ / y
+	z = z /* ERROR "mismatched types" */ % y
+	z = z /* ERRORx `operand z .* must be integer` */ << y
+	z = z /* ERRORx `operand z .* must be integer` */ >> y
 }
 
 type mystring string
 
 func _(x, y string, z mystring) {
 	x = x + "foo"
-	x = x /* ERROR not defined */ - "foo"
-	x = x /* ERROR mismatched types string and untyped int */ + 1
+	x = x /* ERROR "not defined" */ - "foo"
+	x = x /* ERROR "mismatched types string and untyped int" */ + 1
 	x = x + y
-	x = x /* ERROR not defined */ - y
-	x = x /* ERROR mismatched types string and untyped int */* 10
+	x = x /* ERROR "not defined" */ - y
+	x = x /* ERROR "mismatched types string and untyped int" */* 10
 }
 
 func f() (a, b int) { return }
 
 func _(x int) {
-	_ = f /* ERROR multiple-value f */ () + 1
-	_ = x + f /* ERROR multiple-value f */ ()
-	_ = f /* ERROR multiple-value f */ () + f
-	_ = f /* ERROR multiple-value f */ () + f /* ERROR multiple-value f */ ()
+	_ = f /* ERROR "multiple-value f" */ () + 1
+	_ = x + f /* ERROR "multiple-value f" */ ()
+	_ = f /* ERROR "multiple-value f" */ () + f
+	_ = f /* ERROR "multiple-value f" */ () + f /* ERROR "multiple-value f" */ ()
 }
diff --git a/src/internal/types/testdata/check/expr2.go b/src/internal/types/testdata/check/expr2.go
index 1929664..ebb85eb 100644
--- a/src/internal/types/testdata/check/expr2.go
+++ b/src/internal/types/testdata/check/expr2.go
@@ -9,8 +9,8 @@
 func _bool() {
 	const t = true == true
 	const f = true == false
-	_ = t /* ERROR operator .* not defined */ < f
-	_ = 0 == t /* ERROR mismatched types untyped int and untyped bool */
+	_ = t /* ERRORx `operator .* not defined` */ < f
+	_ = 0 == t /* ERROR "mismatched types untyped int and untyped bool" */
 	var b bool
 	var x, y float32
 	b = x < y
@@ -20,7 +20,7 @@
 
 // corner cases
 var (
-	v0 = nil == nil // ERROR operator == not defined on untyped nil
+	v0 = nil == nil // ERROR "operator == not defined on untyped nil"
 )
 
 func arrays() {
@@ -28,8 +28,8 @@
 	var a, b [10]int
 	_ = a == b
 	_ = a != b
-	_ = a /* ERROR < not defined */ < b
-	_ = a == nil /* ERROR mismatched types */
+	_ = a /* ERROR "< not defined" */ < b
+	_ = a == nil /* ERROR "mismatched types" */
 
 	type C [10]int
 	var c C
@@ -37,10 +37,10 @@
 
 	type D [10]int
 	var d D
-	_ = c == d /* ERROR mismatched types */
+	_ = c == d /* ERROR "mismatched types" */
 
 	var e [10]func() int
-	_ = e /* ERROR \[10\]func\(\) int cannot be compared */ == e
+	_ = e /* ERROR "[10]func() int cannot be compared" */ == e
 }
 
 func structs() {
@@ -52,8 +52,8 @@
 	}
 	_ = s == t
 	_ = s != t
-	_ = s /* ERROR < not defined */ < t
-	_ = s == nil /* ERROR mismatched types */
+	_ = s /* ERROR "< not defined" */ < t
+	_ = s == nil /* ERROR "mismatched types" */
 
 	type S struct {
 		x int
@@ -68,23 +68,23 @@
 	var ss S
 	var tt T
 	_ = s == ss
-	_ = ss == tt /* ERROR mismatched types */
+	_ = ss == tt /* ERROR "mismatched types" */
 
 	var u struct {
 		x int
 		a [10]map[string]int
 	}
-	_ = u /* ERROR cannot be compared */ == u
+	_ = u /* ERROR "cannot be compared" */ == u
 }
 
 func pointers() {
 	// nil
-	_ = nil == nil // ERROR operator == not defined on untyped nil
-	_ = nil != nil // ERROR operator != not defined on untyped nil
-	_ = nil /* ERROR < not defined */ < nil
-	_ = nil /* ERROR <= not defined */ <= nil
-	_ = nil /* ERROR > not defined */ > nil
-	_ = nil /* ERROR >= not defined */ >= nil
+	_ = nil == nil // ERROR "operator == not defined on untyped nil"
+	_ = nil != nil // ERROR "operator != not defined on untyped 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
@@ -96,10 +96,10 @@
 	_ = nil == q
 	_ = nil != q
 
-	_ = p /* ERROR < not defined */ < q
-	_ = p /* ERROR <= not defined */ <= q
-	_ = p /* ERROR > not defined */ > q
-	_ = p /* ERROR >= not defined */ >= 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 (
@@ -115,11 +115,11 @@
 		p2 P2
 	)
 	_ = ps1 == ps1
-	_ = ps1 == ps2 /* ERROR mismatched types */
-	_ = ps2 == ps1 /* ERROR mismatched types */
+	_ = ps1 == ps2 /* ERROR "mismatched types" */
+	_ = ps2 == ps1 /* ERROR "mismatched types" */
 
 	_ = p1 == p1
-	_ = p1 == p2 /* ERROR mismatched types */
+	_ = p1 == p2 /* ERROR "mismatched types" */
 
 	_ = p1 == ps1
 }
@@ -130,7 +130,7 @@
 	_ = c == d
 	_ = c != d
 	_ = c == nil
-	_ = c /* ERROR < not defined */ < d
+	_ = c /* ERROR "< not defined" */ < d
 
 	// various element types (named types)
 	type (
@@ -147,13 +147,13 @@
 		c2 C2
 	)
 	_ = c1 == c1
-	_ = c1 == c1r /* ERROR mismatched types */
-	_ = c1 == c1s /* ERROR mismatched types */
-	_ = c1r == c1s /* ERROR mismatched types */
+	_ = c1 == c1r /* ERROR "mismatched types" */
+	_ = c1 == c1s /* ERROR "mismatched types" */
+	_ = c1r == c1s /* ERROR "mismatched types" */
 	_ = c1 == c1a
 	_ = c1a == c1
-	_ = c1 == c2 /* ERROR mismatched types */
-	_ = c1a == c2 /* ERROR mismatched types */
+	_ = c1 == c2 /* ERROR "mismatched types" */
+	_ = c1a == c2 /* ERROR "mismatched types" */
 
 	// various element types (unnamed types)
 	var (
@@ -166,11 +166,11 @@
 	_ = d1 == d1
 	_ = d1 == d1r
 	_ = d1 == d1s
-	_ = d1r == d1s /* ERROR mismatched types */
+	_ = d1r == d1s /* ERROR "mismatched types" */
 	_ = d1 == d1a
 	_ = d1a == d1
-	_ = d1 == d2 /* ERROR mismatched types */
-	_ = d1a == d2 /* ERROR mismatched types */
+	_ = d1 == d2 /* ERROR "mismatched types" */
+	_ = d1a == d2 /* ERROR "mismatched types" */
 }
 
 // for interfaces test
@@ -188,39 +188,39 @@
 	_ = i == j
 	_ = i != j
 	_ = i == nil
-	_ = i /* ERROR < not defined */ < j
+	_ = i /* ERROR "< not defined" */ < j
 
 	// various interfaces
 	var ii interface { m() int; n() }
 	var k interface { m() float32 }
 	_ = i == ii
-	_ = i == k /* ERROR mismatched types */
+	_ = i == k /* ERROR "mismatched types" */
 
 	// interfaces vs values
 	var s1 S1
 	var s11 S11
 	var s2 S2
 
-	_ = i == 0 /* ERROR cannot convert */
-	_ = i == s1 /* ERROR mismatched types */
+	_ = i == 0 /* ERROR "cannot convert" */
+	_ = i == s1 /* ERROR "mismatched types" */
 	_ = i == &s1
 	_ = i == &s11
 
-	_ = i == s2 /* ERROR mismatched types */
-	_ = i == & /* ERROR mismatched types */ s2
+	_ = i == s2 /* ERROR "mismatched types" */
+	_ = i == & /* ERROR "mismatched types" */ s2
 
 	// issue #28164
 	// testcase from issue
-	_ = interface{}(nil) == [ /* ERROR slice can only be compared to nil */ ]int(nil)
+	_ = interface{}(nil) == [ /* ERROR "slice can only be compared to nil" */ ]int(nil)
 
 	// related cases
 	var e interface{}
 	var s []int
 	var x int
-	_ = e == s // ERROR slice can only be compared to nil
-	_ = s /* ERROR slice can only be compared to nil */ == e
-	_ = e /* ERROR operator < not defined on interface */ < x
-	_ = x < e // ERROR operator < not defined on interface
+	_ = e == s // ERROR "slice can only be compared to nil"
+	_ = s /* ERROR "slice can only be compared to nil" */ == e
+	_ = e /* ERROR "operator < not defined on interface" */ < x
+	_ = x < e // ERROR "operator < not defined on interface"
 }
 
 func slices() {
@@ -228,11 +228,11 @@
 	var s []int
 	_ = s == nil
 	_ = s != nil
-	_ = s /* ERROR < not defined */ < nil
+	_ = s /* ERROR "< not defined" */ < nil
 
 	// slices are not otherwise comparable
-	_ = s /* ERROR slice can only be compared to nil */ == s
-	_ = s /* ERROR < not defined */ < s
+	_ = s /* ERROR "slice can only be compared to nil" */ == s
+	_ = s /* ERROR "< not defined" */ < s
 }
 
 func maps() {
@@ -240,11 +240,11 @@
 	var m map[string]int
 	_ = m == nil
 	_ = m != nil
-	_ = m /* ERROR < not defined */ < nil
+	_ = m /* ERROR "< not defined" */ < nil
 
 	// maps are not otherwise comparable
-	_ = m /* ERROR map can only be compared to nil */ == m
-	_ = m /* ERROR < not defined */ < m
+	_ = m /* ERROR "map can only be compared to nil" */ == m
+	_ = m /* ERROR "< not defined" */ < m
 }
 
 func funcs() {
@@ -252,9 +252,9 @@
 	var f func(int) float32
 	_ = f == nil
 	_ = f != nil
-	_ = f /* ERROR < not defined */ < nil
+	_ = f /* ERROR "< not defined" */ < nil
 
 	// funcs are not otherwise comparable
-	_ = f /* ERROR func can only be compared to nil */ == f
-	_ = f /* ERROR < not defined */ < f
+	_ = f /* ERROR "func can only be compared to nil" */ == f
+	_ = f /* ERROR "< not defined" */ < f
 }
diff --git a/src/internal/types/testdata/check/expr3.go b/src/internal/types/testdata/check/expr3.go
index 2da5984..91534cd 100644
--- a/src/internal/types/testdata/check/expr3.go
+++ b/src/internal/types/testdata/check/expr3.go
@@ -28,22 +28,22 @@
 	a0 = a[0]
 	_ = a0
 	var a1 int32
-	a1 = a /* ERROR "cannot use .* in assignment" */ [1]
+	a1 = a /* ERRORx `cannot use .* in assignment` */ [1]
 	_ = a1
 
 	_ = a[9]
-	_ = a[10 /* ERROR "index .* out of bounds" */ ]
+	_ = a[10 /* ERRORx `index .* out of bounds` */ ]
 	_ = a[1 /* ERROR "overflows" */ <<100]
 	_ = a[1<< /* ERROR "constant shift overflow" */ 1000] // no out-of-bounds follow-on error
 	_ = a[10:]
 	_ = a[:10]
 	_ = a[10:10]
-	_ = a[11 /* ERROR "index .* out of bounds" */ :]
-	_ = a[: 11 /* ERROR "index .* out of bounds" */ ]
+	_ = a[11 /* ERRORx `index .* out of bounds` */ :]
+	_ = a[: 11 /* ERRORx `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[:11 /* ERRORx `index .* out of bounds` */ :10]
+	_ = a[:10:11 /* ERRORx `index .* out of bounds` */ ]
 	_ = a[10:0 /* ERROR "invalid slice indices" */ :10]
 	_ = a[0:10:0 /* ERROR "invalid slice indices" */ ]
 	_ = a[10:0 /* ERROR "invalid slice indices" */:0]
@@ -51,30 +51,30 @@
 
 	pa := &a
 	_ = pa[9]
-	_ = pa[10 /* ERROR "index .* out of bounds" */ ]
+	_ = pa[10 /* ERRORx `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[11 /* ERRORx `index .* out of bounds` */ :]
+	_ = pa[: 11 /* ERRORx `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[:11 /* ERRORx `index .* out of bounds` */ :10]
+	_ = pa[:10:11 /* ERRORx `index .* out of bounds` */ ]
 	_ = pa[10:0 /* ERROR "invalid slice indices" */ :10]
 	_ = pa[0:10:0 /* ERROR "invalid slice indices" */ ]
 	_ = pa[10:0 /* ERROR "invalid slice indices" */ :0]
 	_ = &pa /* ERROR "cannot take address" */ [:10]
 
 	var b [0]int
-	_ = b[0 /* ERROR "index .* out of bounds" */ ]
+	_ = b[0 /* ERRORx `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]
+	_ = b[1 /* ERRORx `index .* out of bounds` */ :0:0]
 
 	var s []int
 	_ = s[- /* ERROR "negative" */ 1]
@@ -95,7 +95,7 @@
 	_ = &s /* ERROR "cannot take address" */ [:10]
 
 	var m map[string]int
-	_ = m[0 /* ERROR "cannot use .* in map index" */ ]
+	_ = m[0 /* ERRORx `cannot use .* in map index` */ ]
 	_ = m /* ERROR "cannot slice" */ ["foo" : "bar"]
 	_ = m["foo"]
 	// ok is of type bool
@@ -115,10 +115,10 @@
 	t0 = t[0]
 	_ = t0
 	var t1 rune
-	t1 = t /* ERROR "cannot use .* in assignment" */ [2]
+	t1 = t /* ERRORx `cannot use .* in assignment` */ [2]
 	_ = t1
 	_ = ("foo" + "bar")[5]
-	_ = ("foo" + "bar")[6 /* ERROR "index .* out of bounds" */ ]
+	_ = ("foo" + "bar")[6 /* ERRORx `index .* out of bounds` */ ]
 
 	const c = "foo"
 	_ = c[- /* ERROR "negative" */ 1]
@@ -128,9 +128,9 @@
 	c0 = c[0]
 	_ = c0
 	var c2 float32
-	c2 = c /* ERROR "cannot use .* in assignment" */ [2]
-	_ = c[3 /* ERROR "index .* out of bounds" */ ]
-	_ = ""[0 /* ERROR "index .* out of bounds" */ ]
+	c2 = c /* ERRORx `cannot use .* in assignment` */ [2]
+	_ = c[3 /* ERRORx `index .* out of bounds` */ ]
+	_ = ""[0 /* ERRORx `index .* out of bounds` */ ]
 	_ = c2
 
 	_ = s[1<<30] // no compile-time error here
@@ -142,8 +142,8 @@
 	var i, j int
 	ss = "foo"[1:2]
 	ss = "foo"[i:j]
-	ms = "foo" /* ERROR "cannot use .* in assignment" */ [1:2]
-	ms = "foo" /* ERROR "cannot use .* in assignment" */ [i:j]
+	ms = "foo" /* ERRORx `cannot use .* in assignment` */ [1:2]
+	ms = "foo" /* ERRORx `cannot use .* in assignment` */ [i:j]
 	_, _ = ss, ms
 }
 
@@ -157,10 +157,10 @@
 func method_expressions() {
 	_ = T.a /* ERROR "no field or method" */
 	_ = T.x /* ERROR "has no method" */
-	_ = T.m /* ERROR "invalid method expression T\.m \(needs pointer receiver \(\*T\)\.m\)" */
+	_ = T.m /* ERROR "invalid method expression T.m (needs pointer receiver (*T).m)" */
 	_ = (*T).m
 
-	var f func(*T) = T.m /* ERROR "invalid method expression T\.m \(needs pointer receiver \(\*T\)\.m\)" */
+	var f func(*T) = T.m /* ERROR "invalid method expression T.m (needs pointer receiver (*T).m)" */
 	var g func(*T) = (*T).m
 	_, _ = f, g
 
@@ -182,11 +182,11 @@
 
 	// keyed elements
 	_ = T1{}
-	_ = T1{a: 0, 1 /* ERROR "mixture of .* elements" */ }
+	_ = T1{a: 0, 1 /* ERRORx `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 use .* in struct literal" */ }
+	_ = T1{a: "foo" /* ERRORx `cannot use .* in struct literal` */ }
 	_ = T1{c /* ERROR "unknown field" */ : 0}
 	_ = T1{T0: { /* ERROR "missing type" */ }} // struct literal element type may not be elided
 	_ = T1{T0: T0{}}
@@ -197,7 +197,7 @@
 	_ = 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 use .* in struct literal" */, 3.4  /* ERROR "cannot use .*\(truncated\)" */}
+	_ = T0{1, "foo" /* ERRORx `cannot use .* in struct literal` */, 3.4  /* ERRORx `cannot use .*\(truncated\)` */}
 
 	// invalid type
 	type P *struct{
@@ -209,35 +209,35 @@
 	_ = time.Time{}
 	_ = time.Time{sec /* ERROR "unknown field" */ : 0}
 	_ = time.Time{
-		0 /* ERROR implicit assignment to unexported field wall in struct literal */,
-		0 /* ERROR implicit assignment */ ,
-		nil /* ERROR implicit assignment */ ,
+		0 /* ERROR "implicit assignment to unexported field wall in struct 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}
+	_ = A0{0 /* ERRORx `index .* out of bounds` */}
+	_ = A0{0 /* ERRORx `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{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 /* ERRORx `index .* out of bounds` */ }
 	_ = A1{- /* ERROR "negative" */ 1: 0}
 	_ = A1{8: 8, 9}
-	_ = A1{8: 8, 9, 10 /* ERROR "index .* out of bounds" */ }
+	_ = A1{8: 8, 9, 10 /* ERRORx `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{10 /* ERRORx `index .* out of bounds` */ : 10, 10 /* ERRORx `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 use .* in array or slice literal" */ }
+	_ = A1{"foo" /* ERRORx `cannot use .* in array or slice literal` */ }
 
 	// indices must be integer constants
 	i := 1
@@ -255,7 +255,7 @@
 	var a13 [3]int
 	var a14 [4]int
 	a13 = a1
-	a14 = a1 /* ERROR "cannot use .* in assignment" */
+	a14 = a1 /* ERRORx `cannot use .* in assignment` */
 	_, _ = a13, a14
 
 	a2 := [...]int{- /* ERROR "negative" */ 1: 0}
@@ -303,7 +303,7 @@
 	_ = S0{5: 5, 6, 7, 4: 4, 1 /* ERROR "overflows" */ <<100: 4}
 	_ = S0{2.0}
 	_ = S0{2.1 /* ERROR "truncated" */ }
-	_ = S0{"foo" /* ERROR "cannot use .* in array or slice literal" */ }
+	_ = S0{"foo" /* ERRORx `cannot use .* in array or slice literal` */ }
 
 	// indices must be resolved correctly
 	const index1 = 1
@@ -356,8 +356,8 @@
 
 	_ = M0{}
 	_ = M0{1 /* ERROR "missing key" */ }
-	_ = M0{1 /* ERROR "cannot use .* in map literal" */ : 2}
-	_ = M0{"foo": "bar" /* ERROR "cannot use .* in map literal" */ }
+	_ = M0{1 /* ERRORx `cannot use .* in map literal` */ : 2}
+	_ = M0{"foo": "bar" /* ERRORx `cannot use .* in map literal` */ }
 	_ = M0{"foo": 1, "bar": 2, "foo" /* ERROR "duplicate key" */ : 3 }
 
 	_ = map[interface{}]int{2: 1, 2 /* ERROR "duplicate key" */ : 1}
@@ -457,7 +457,7 @@
 	_ = myok
 
 	var t I
-	_ = t /* ERROR "use of .* outside type switch" */ .(type)
+	_ = t /* ERRORx `use of .* outside type switch` */ .(type)
 	_ = t /* ERROR "m has pointer receiver" */ .(T)
 	_ = t.(*T)
 	_ = t /* ERROR "missing method m" */ .(T1)
@@ -493,62 +493,62 @@
 	f1(0)
 	f1(x)
 	f1(10.0)
-	f1() /* ERROR "not enough arguments in call to f1\n\thave \(\)\n\twant \(int\)" */
-	f1(x, y /* ERROR "too many arguments in call to f1\n\thave \(int, float32\)\n\twant \(int\)" */ )
-	f1(s /* ERROR "cannot use .* in argument" */ )
+	f1() /* ERROR "not enough arguments in call to f1\n\thave ()\n\twant (int)" */
+	f1(x, y /* ERROR "too many arguments in call to f1\n\thave (int, float32)\n\twant (int)" */ )
+	f1(s /* ERRORx `cannot use .* in argument` */ )
 	f1(x ... /* ERROR "cannot use ..." */ )
 	f1(g0 /* ERROR "used as value" */ ())
 	f1(g1())
-	f1(g2 /* ERROR "too many arguments in call to f1\n\thave \(float32, string\)\n\twant \(int\)" */ ())
+	f1(g2 /* ERROR "too many arguments in call to f1\n\thave (float32, string)\n\twant (int)" */ ())
 
-	f2() /* ERROR "not enough arguments in call to f2\n\thave \(\)\n\twant \(float32, string\)" */
-	f2(3.14) /* ERROR "not enough arguments in call to f2\n\thave \(number\)\n\twant \(float32, string\)" */
+	f2() /* ERROR "not enough arguments in call to f2\n\thave ()\n\twant (float32, string)" */
+	f2(3.14) /* ERROR "not enough arguments in call to f2\n\thave (number)\n\twant (float32, string)" */
 	f2(3.14, "foo")
-	f2(x /* ERROR "cannot use .* in argument" */ , "foo")
-	f2(g0 /* ERROR "used as value" */ ())
-	f2(g1()) /* ERROR "not enough arguments in call to f2\n\thave \(int\)\n\twant \(float32, string\)" */
+	f2(x /* ERRORx `cannot use .* in argument` */ , "foo")
+	f2(g0 /* ERROR "used as value" */ ()) /* ERROR "not enough arguments in call to f2\n\thave (func())\n\twant (float32, string)" */
+	f2(g1()) /* ERROR "not enough arguments in call to f2\n\thave (int)\n\twant (float32, string)" */
 	f2(g2())
 
 	fs() /* ERROR "not enough arguments" */
 	fs(g0 /* ERROR "used as value" */ ())
-	fs(g1 /* ERROR "cannot use .* in argument" */ ())
+	fs(g1 /* ERRORx `cannot use .* in argument` */ ())
 	fs(g2 /* ERROR "too many arguments" */ ())
 	fs(gs())
 
 	fv()
 	fv(1, 2.0, x)
-	fv(s /* ERROR "cannot use .* in argument" */ )
+	fv(s /* ERRORx `cannot use .* in argument` */ )
 	fv(s...)
 	fv(x /* ERROR "cannot use" */ ...)
 	fv(1, s /* ERROR "too many arguments" */ ...)
-	fv(gs /* ERROR "cannot use .* in argument" */ ())
-	fv(gs /* ERROR "cannot use .* in argument" */ ()...)
+	fv(gs /* ERRORx `cannot use .* in argument` */ ())
+	fv(gs /* ERRORx `cannot use .* in argument` */ ()...)
 
 	var t T
 	t.fm()
 	t.fm(1, 2.0, x)
-	t.fm(s /* ERROR "cannot use .* in argument" */ )
+	t.fm(s /* ERRORx `cannot use .* in argument` */ )
 	t.fm(g1())
 	t.fm(1, s /* ERROR "too many arguments" */ ...)
-	t.fm(gs /* ERROR "cannot use .* in argument" */ ())
-	t.fm(gs /* ERROR "cannot use .* in argument" */ ()...)
+	t.fm(gs /* ERRORx `cannot use .* in argument` */ ())
+	t.fm(gs /* ERRORx `cannot use .* in argument` */ ()...)
 
 	T.fm(t, )
 	T.fm(t, 1, 2.0, x)
-	T.fm(t, s /* ERROR "cannot use .* in argument" */ )
+	T.fm(t, s /* ERRORx `cannot use .* in argument` */ )
 	T.fm(t, g1())
 	T.fm(t, 1, s /* ERROR "too many arguments" */ ...)
-	T.fm(t, gs /* ERROR "cannot use .* in argument" */ ())
-	T.fm(t, gs /* ERROR "cannot use .* in argument" */ ()...)
+	T.fm(t, gs /* ERRORx `cannot use .* in argument` */ ())
+	T.fm(t, gs /* ERRORx `cannot use .* in argument` */ ()...)
 
 	var i interface{ fm(x ...int) } = t
 	i.fm()
 	i.fm(1, 2.0, x)
-	i.fm(s /* ERROR "cannot use .* in argument" */ )
+	i.fm(s /* ERRORx `cannot use .* in argument` */ )
 	i.fm(g1())
 	i.fm(1, s /* ERROR "too many arguments" */ ...)
-	i.fm(gs /* ERROR "cannot use .* in argument" */ ())
-	i.fm(gs /* ERROR "cannot use .* in argument" */ ()...)
+	i.fm(gs /* ERRORx `cannot use .* in argument` */ ())
+	i.fm(gs /* ERRORx `cannot use .* in argument` */ ()...)
 
 	fi()
 	fi(1, 2.0, x, 3.14, "foo")
diff --git a/src/internal/types/testdata/check/funcinference.go b/src/internal/types/testdata/check/funcinference.go
index fedf199..e0e978f 100644
--- a/src/internal/types/testdata/check/funcinference.go
+++ b/src/internal/types/testdata/check/funcinference.go
@@ -102,3 +102,11 @@
 }
 
 var _ = FromStrings[Settable]([]string{"1", "2"})
+
+// Suitable error message when the type parameter is provided (rather than inferred).
+
+func f8[P, Q any](P, Q) {}
+
+func _(s string) {
+	f8[int](s /* ERROR "cannot use s (variable of type string) as int value in argument to f8[int]" */ , s)
+}
diff --git a/src/internal/types/testdata/check/go1_12.go b/src/internal/types/testdata/check/go1_12.go
index 56c6d5a..b47d3de 100644
--- a/src/internal/types/testdata/check/go1_12.go
+++ b/src/internal/types/testdata/check/go1_12.go
@@ -31,6 +31,6 @@
 // signed shift counts
 var (
 	s int
-	_ = 1 << s // ERROR "invalid operation: signed shift count s \(variable of type int\) requires go1.13 or later"
+	_ = 1 << s // ERROR "invalid operation: signed shift count s (variable of type int) requires go1.13 or later"
 	_ = 1 >> s // ERROR "signed shift count"
 )
diff --git a/src/internal/types/testdata/check/go1_16.go b/src/internal/types/testdata/check/go1_16.go
index 81b5290..9675b29 100644
--- a/src/internal/types/testdata/check/go1_16.go
+++ b/src/internal/types/testdata/check/go1_16.go
@@ -12,4 +12,4 @@
 type Array [8]byte
 
 var s Slice
-var p = (*Array)(s /* ERROR requires go1.17 or later */ )
+var p = (*Array)(s /* ERROR "requires go1.17 or later" */ )
diff --git a/src/internal/types/testdata/check/go1_19.go b/src/internal/types/testdata/check/go1_19.go
index f899d93..b6cff4f 100644
--- a/src/internal/types/testdata/check/go1_19.go
+++ b/src/internal/types/testdata/check/go1_19.go
@@ -12,4 +12,4 @@
 type Array [8]byte
 
 var s Slice
-var p = (Array)(s /* ERROR requires go1.20 or later */)
+var p = (Array)(s /* ERROR "requires go1.20 or later" */)
diff --git a/src/internal/types/testdata/check/go1_19_20.go b/src/internal/types/testdata/check/go1_19_20.go
new file mode 100644
index 0000000..52e5dfd
--- /dev/null
+++ b/src/internal/types/testdata/check/go1_19_20.go
@@ -0,0 +1,17 @@
+// -lang=go1.19
+
+// Copyright 2022 The Go 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 Go language version-specific errors.
+
+//go:build go1.20
+
+package p
+
+type Slice []byte
+type Array [8]byte
+
+var s Slice
+var p = (Array)(s /* ok */)
diff --git a/src/internal/types/testdata/check/go1_20_19.go b/src/internal/types/testdata/check/go1_20_19.go
new file mode 100644
index 0000000..08365a7
--- /dev/null
+++ b/src/internal/types/testdata/check/go1_20_19.go
@@ -0,0 +1,17 @@
+// -lang=go1.20
+
+// Copyright 2022 The Go 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 Go language version-specific errors.
+
+//go:build go1.19
+
+package p
+
+type Slice []byte
+type Array [8]byte
+
+var s Slice
+var p = (Array)(s /* ok because Go 1.20 ignored the //go:build go1.19 */)
diff --git a/src/internal/types/testdata/check/go1_21_19.go b/src/internal/types/testdata/check/go1_21_19.go
new file mode 100644
index 0000000..2acd258
--- /dev/null
+++ b/src/internal/types/testdata/check/go1_21_19.go
@@ -0,0 +1,17 @@
+// -lang=go1.21
+
+// Copyright 2022 The Go 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 Go language version-specific errors.
+
+//go:build go1.19
+
+package p
+
+type Slice []byte
+type Array [8]byte
+
+var s Slice
+var p = (Array)(s /* ERROR "requires go1.20 or later" */)
diff --git a/src/internal/types/testdata/check/go1_8.go b/src/internal/types/testdata/check/go1_8.go
index 99f2fd4..6a7e639 100644
--- a/src/internal/types/testdata/check/go1_8.go
+++ b/src/internal/types/testdata/check/go1_8.go
@@ -9,4 +9,4 @@
 package p
 
 // type alias declarations
-type any = /* ERROR type aliases requires go1.9 or later */ interface{}
+type any = /* ERROR "type aliases requires go1.9 or later" */ interface{}
diff --git a/src/internal/types/testdata/check/go1_xx_19.go b/src/internal/types/testdata/check/go1_xx_19.go
new file mode 100644
index 0000000..01f6b7d
--- /dev/null
+++ b/src/internal/types/testdata/check/go1_xx_19.go
@@ -0,0 +1,15 @@
+// Copyright 2022 The Go 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 Go language version-specific errors.
+
+//go:build go1.19
+
+package p
+
+type Slice []byte
+type Array [8]byte
+
+var s Slice
+var p = (Array)(s /* ok because Go 1.X prior to Go 1.21 ignored the //go:build go1.19 */)
diff --git a/src/internal/types/testdata/check/importC.go b/src/internal/types/testdata/check/importC.go
index 8078021..2cdf383 100644
--- a/src/internal/types/testdata/check/importC.go
+++ b/src/internal/types/testdata/check/importC.go
@@ -7,9 +7,9 @@
 package importC
 
 import "C"
-import _ /* ERROR cannot rename import "C" */ "C"
-import foo /* ERROR cannot rename import "C" */ "C"
-import . /* ERROR cannot rename import "C" */ "C"
+import _ /* ERROR `cannot rename import "C"` */ "C"
+import foo /* ERROR `cannot rename import "C"` */ "C"
+import . /* ERROR `cannot rename import "C"` */ "C"
 
 // Test cases extracted from issue #22090.
 
diff --git a/src/internal/types/testdata/check/importdecl0/importdecl0b.go b/src/internal/types/testdata/check/importdecl0/importdecl0b.go
index 904faff..99e1d1e 100644
--- a/src/internal/types/testdata/check/importdecl0/importdecl0b.go
+++ b/src/internal/types/testdata/check/importdecl0/importdecl0b.go
@@ -8,13 +8,13 @@
 import m "math"
 
 import . "testing" // declares T in file scope
-import . /* ERROR .unsafe. imported and not used */ "unsafe"
+import . /* ERRORx `.unsafe. imported and not used` */ "unsafe"
 import . "fmt"     // declares Println in file scope
 
 import (
-	"" /* ERROR invalid import path */
-	"a!b" /* ERROR invalid import path */
-	"abc\xffdef" /* ERROR invalid import path */
+	"" /* ERROR "invalid import path" */
+	"a!b" /* ERROR "invalid import path" */
+	"abc\xffdef" /* ERROR "invalid import path" */
 )
 
 // using "math" in this file doesn't affect its use in other files
diff --git a/src/internal/types/testdata/check/importdecl1/importdecl1b.go b/src/internal/types/testdata/check/importdecl1/importdecl1b.go
index ce8b983..49ac2d5 100644
--- a/src/internal/types/testdata/check/importdecl1/importdecl1b.go
+++ b/src/internal/types/testdata/check/importdecl1/importdecl1b.go
@@ -4,7 +4,7 @@
 
 package importdecl1
 
-import . /* ERROR .unsafe. imported and not used */ "unsafe"
+import . /* ERRORx ".unsafe. imported and not used" */ "unsafe"
 
 type B interface {
 	A
diff --git a/src/internal/types/testdata/check/init0.go b/src/internal/types/testdata/check/init0.go
index 5159a17..ee2175e 100644
--- a/src/internal/types/testdata/check/init0.go
+++ b/src/internal/types/testdata/check/init0.go
@@ -8,50 +8,50 @@
 
 // initialization cycles (we don't know the types)
 const (
-	s0 /* ERROR initialization cycle: s0 refers to itself */ = s0
+	s0 /* ERROR "initialization cycle: s0 refers to itself" */ = s0
 
-	x0 /* ERROR initialization cycle for x0 */ = y0
+	x0 /* ERROR "initialization cycle for x0" */ = y0
 	y0 = x0
 
 	a0 = b0
-	b0 /* ERROR initialization cycle for b0 */ = c0
+	b0 /* ERROR "initialization cycle for b0" */ = c0
 	c0 = d0
 	d0 = b0
 )
 
 var (
-	s1 /* ERROR initialization cycle: s1 refers to itself */ = s1
+	s1 /* ERROR "initialization cycle: s1 refers to itself" */ = s1
 
-	x1 /* ERROR initialization cycle for x1 */ = y1
+	x1 /* ERROR "initialization cycle for x1" */ = y1
 	y1 = x1
 
 	a1 = b1
-	b1 /* ERROR initialization cycle for b1 */ = c1
+	b1 /* ERROR "initialization cycle for b1" */ = c1
 	c1 = d1
 	d1 = b1
 )
 
 // initialization cycles (we know the types)
 const (
-	s2 /* ERROR initialization cycle: s2 refers to itself */ int = s2
+	s2 /* ERROR "initialization cycle: s2 refers to itself" */ int = s2
 
-	x2 /* ERROR initialization cycle for x2 */ int = y2
+	x2 /* ERROR "initialization cycle for x2" */ int = y2
 	y2 = x2
 
 	a2 = b2
-	b2 /* ERROR initialization cycle for b2 */ int = c2
+	b2 /* ERROR "initialization cycle for b2" */ int = c2
 	c2 = d2
 	d2 = b2
 )
 
 var (
-	s3 /* ERROR initialization cycle: s3 refers to itself */ int = s3
+	s3 /* ERROR "initialization cycle: s3 refers to itself" */ int = s3
 
-	x3 /* ERROR initialization cycle for x3 */ int = y3
+	x3 /* ERROR "initialization cycle for x3" */ int = y3
 	y3 = x3
 
 	a3 = b3
-	b3 /* ERROR initialization cycle for b3 */ int = c3
+	b3 /* ERROR "initialization cycle for b3" */ int = c3
 	c3 = d3
 	d3 = b3
 )
@@ -61,25 +61,25 @@
 type S1 struct {
 	f int
 }
-const cx3 S1 /* ERROR invalid constant type */ = S1{cx3.f}
-var vx3 /* ERROR initialization cycle: vx3 refers to itself */ S1 = S1{vx3.f}
+const cx3 S1 /* ERROR "invalid constant type" */ = S1{cx3.f}
+var vx3 /* ERROR "initialization cycle: vx3 refers to itself" */ S1 = S1{vx3.f}
 
 // cycles via functions
 
 var x4 = x5
-var x5 /* ERROR initialization cycle for x5 */ = f1()
+var x5 /* ERROR "initialization cycle for x5" */ = f1()
 func f1() int { return x5*10 }
 
-var x6, x7 /* ERROR initialization cycle */ = f2()
+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 function literals
 
-var x9 /* ERROR initialization cycle: x9 refers to itself */ = func() int { return x9 }()
+var x9 /* ERROR "initialization cycle: x9 refers to itself" */ = func() int { return x9 }()
 
-var x10 /* ERROR initialization cycle for x10 */ = f4()
+var x10 /* ERROR "initialization cycle for x10" */ = f4()
 
 func f4() int {
 	_ = func() {
@@ -94,7 +94,7 @@
 
 func (T1) m() bool { _ = x11; return false }
 
-var x11 /* ERROR initialization cycle for x11 */ = T1.m(T1{})
+var x11 /* ERROR "initialization cycle for x11" */ = T1.m(T1{})
 
 // cycles via method values
 
@@ -103,4 +103,4 @@
 func (T2) m() bool { _ = x12; return false }
 
 var t1 T2
-var x12 /* ERROR initialization cycle for x12 */ = t1.m
+var x12 /* ERROR "initialization cycle for x12" */ = t1.m
diff --git a/src/internal/types/testdata/check/init1.go b/src/internal/types/testdata/check/init1.go
index 39ca314..c89032a 100644
--- a/src/internal/types/testdata/check/init1.go
+++ b/src/internal/types/testdata/check/init1.go
@@ -14,7 +14,7 @@
 
 var x0 = T0{}
 
-var y0 /* ERROR initialization cycle */ = x0.m()
+var y0 /* ERROR "initialization cycle" */ = x0.m()
 
 type T1 struct{}
 
@@ -28,7 +28,7 @@
 
 // issue 6703 (modified)
 
-var x2 /* ERROR initialization cycle */ = T2.m
+var x2 /* ERROR "initialization cycle" */ = T2.m
 
 var y2 = x2
 
@@ -39,7 +39,7 @@
 	return 0
 }
 
-var x3 /* ERROR initialization cycle */ = T3.m(T3{}) // <<<< added (T3{})
+var x3 /* ERROR "initialization cycle" */ = T3.m(T3{}) // <<<< added (T3{})
 
 var y3 = x3
 
@@ -50,7 +50,7 @@
 	return 0
 }
 
-var x4 /* ERROR initialization cycle */ = T4{}.m // <<<< added {}
+var x4 /* ERROR "initialization cycle" */ = T4{}.m // <<<< added {}
 
 var y4 = x4
 
@@ -61,7 +61,7 @@
 	return 0
 }
 
-var x5 /* ERROR initialization cycle */ = T5{}.m() // <<<< added ()
+var x5 /* ERROR "initialization cycle" */ = T5{}.m() // <<<< added ()
 
 var y5 = x5
 
@@ -76,7 +76,7 @@
 // simplified test case
 
 var x6 = f6
-var y6 /* ERROR initialization cycle */ = f6
+var y6 /* ERROR "initialization cycle" */ = f6
 func f6() { _ = y6 }
 
 // full test case
@@ -92,6 +92,6 @@
 
 var foo = matcher(matchList)
 
-var matchAny /* ERROR initialization cycle */ = 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/src/internal/types/testdata/check/init2.go b/src/internal/types/testdata/check/init2.go
index 614db6c..24e9277 100644
--- a/src/internal/types/testdata/check/init2.go
+++ b/src/internal/types/testdata/check/init2.go
@@ -9,131 +9,131 @@
 // cycles through functions
 
 func f1() int { _ = x1; return 0 }
-var x1 /* ERROR initialization cycle */ = f1
+var x1 /* ERROR "initialization cycle" */ = f1
 
 func f2() int { _ = x2; return 0 }
-var x2 /* ERROR initialization cycle */ = f2()
+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
+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)
+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
+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)
+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
+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})
+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
+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)
+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
+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()
+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
+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()
+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
+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()
+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
+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()
+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
+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()
+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
+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()
+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
+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()
+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
+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()
+var x10pv /* ERROR "initialization cycle" */ = x10pvar.m()
diff --git a/src/internal/types/testdata/check/issues0.go b/src/internal/types/testdata/check/issues0.go
index 4a66641..6039df9 100644
--- a/src/internal/types/testdata/check/issues0.go
+++ b/src/internal/types/testdata/check/issues0.go
@@ -25,25 +25,25 @@
 func issue8066() {
 	const (
 		_ = float32(340282356779733661637539395458142568447)
-		_ = float32(340282356779733661637539395458142568448 /* ERROR cannot convert */ )
+		_ = float32(340282356779733661637539395458142568448 /* ERROR "cannot convert" */ )
 	)
 }
 
 // Check that a missing identifier doesn't lead to a spurious error cascade.
 func issue8799a() {
-	x, ok := missing /* ERROR undefined */ ()
+	x, ok := missing /* ERROR "undefined" */ ()
 	_ = !ok
 	_ = x
 }
 
 func issue8799b(x int, ok bool) {
-	x, ok = missing /* ERROR undefined */ ()
+	x, ok = missing /* ERROR "undefined" */ ()
 	_ = !ok
 	_ = x
 }
 
 func issue9182() {
-	type Point C /* ERROR undefined */ .Point
+	type Point C /* ERROR "undefined" */ .Point
 	// no error for composite literal based on unknown type
 	_ = Point{x: 1, y: 2}
 }
@@ -59,54 +59,54 @@
 	_ = append(f0())
 	_ = append(f0(), f0()...)
 	_ = append(f1())
-	_ = append(f2 /* ERROR cannot use .* in argument */ ())
-	_ = append(f2()... /* ERROR cannot use ... */ )
-	_ = append(f0(), f1 /* ERROR multiple-value f1 */ ())
-	_ = append(f0(), f2 /* ERROR multiple-value f2 */ ())
-	_ = append(f0(), f1 /* ERROR multiple-value f1 */ ()...)
-	_ = append(f0(), f2 /* ERROR multiple-value f2 */ ()...)
+	_ = append(f2 /* ERRORx `cannot use .* in argument` */ ())
+	_ = append(f2()... /* ERROR "cannot use ..." */ )
+	_ = append(f0(), f1 /* ERROR "multiple-value f1" */ ())
+	_ = append(f0(), f2 /* ERROR "multiple-value f2" */ ())
+	_ = append(f0(), f1 /* ERROR "multiple-value f1" */ ()...)
+	_ = append(f0(), f2 /* ERROR "multiple-value f2" */ ()...)
 
 	// variadic user-defined function
 	append_(f0())
 	append_(f0(), f0()...)
 	append_(f1())
-	append_(f2 /* ERROR cannot use .* in argument */ ())
-	append_(f2()... /* ERROR cannot use ... */ )
-	append_(f0(), f1 /* ERROR multiple-value f1 */ ())
-	append_(f0(), f2 /* ERROR multiple-value f2 */ ())
-	append_(f0(), f1 /* ERROR multiple-value f1 */ ()...)
-	append_(f0(), f2 /* ERROR multiple-value f2 */ ()...)
+	append_(f2 /* ERRORx `cannot use .* in argument` */ ())
+	append_(f2()... /* ERROR "cannot use ..." */ )
+	append_(f0(), f1 /* ERROR "multiple-value f1" */ ())
+	append_(f0(), f2 /* ERROR "multiple-value f2" */ ())
+	append_(f0(), f1 /* ERROR "multiple-value f1" */ ()...)
+	append_(f0(), f2 /* ERROR "multiple-value f2" */ ()...)
 }
 
 // Check that embedding a non-interface type in an interface results in a good error message.
 func issue10979() {
 	type _ interface {
-		int /* ERROR non-interface type int */
+		int /* ERROR "non-interface type int" */
 	}
 	type T struct{}
 	type _ interface {
-		T /* ERROR non-interface type T */
+		T /* ERROR "non-interface type T" */
 	}
 	type _ interface {
-		nosuchtype /* ERROR undefined: nosuchtype */
+		nosuchtype /* ERROR "undefined: nosuchtype" */
 	}
 	type _ interface {
-		fmt.Nosuchtype /* ERROR undefined: fmt\.Nosuchtype */
+		fmt.Nosuchtype /* ERROR "undefined: fmt.Nosuchtype" */
 	}
 	type _ interface {
-		nosuchpkg /* ERROR undefined: nosuchpkg */ .Nosuchtype
+		nosuchpkg /* ERROR "undefined: nosuchpkg" */ .Nosuchtype
 	}
 	type I interface {
-		I.m /* ERROR I.m is not a type */
+		I.m /* ERROR "I.m is not a type" */
 		m()
 	}
 }
 
 // issue11347
 // These should not crash.
-var a1, b1 /* ERROR cycle */ , c1 /* ERROR cycle */ b1 = 0 > 0<<""[""[c1]]>c1
-var a2, b2 /* ERROR cycle */ = 0 /* ERROR assignment mismatch */ /* ERROR assignment mismatch */ > 0<<""[b2]
-var a3, b3 /* ERROR cycle */ = int /* ERROR assignment mismatch */ /* ERROR assignment mismatch */ (1<<""[b3])
+var a1, b1 /* ERROR "cycle" */ , c1 /* ERROR "cycle" */ b1 = 0 > 0<<""[""[c1]]>c1
+var a2, b2 /* ERROR "cycle" */ = 0 /* ERROR "assignment mismatch" */ /* ERROR "assignment mismatch" */ > 0<<""[b2]
+var a3, b3 /* ERROR "cycle" */ = int /* ERROR "assignment mismatch" */ /* ERROR "assignment mismatch" */ (1<<""[b3])
 
 // issue10260
 // Check that error messages explain reason for interface assignment failures.
@@ -133,42 +133,42 @@
 	)
 
 	var x I1
-	x = T1 /* ERROR cannot use T1{} .* as I1 value in assignment: T1 does not implement I1 \(method foo has pointer receiver\) */ {}
-	_ = x /* ERROR impossible type assertion: x\.\(T1\)\n\tT1 does not implement I1 \(method foo has pointer receiver\) */ .(T1)
+	x = T1 /* ERRORx `cannot use T1{} .* as I1 value in assignment: T1 does not implement I1 \(method foo has pointer receiver\)` */ {}
+	_ = x /* ERROR "impossible type assertion: x.(T1)\n\tT1 does not implement I1 (method foo has pointer receiver)" */ .(T1)
 
-	T1{}.foo /* ERROR cannot call pointer method foo on T1 */ ()
-	x.Foo /* ERROR "x.Foo undefined \(type I1 has no field or method Foo, but does have foo\)" */ ()
+	T1{}.foo /* ERROR "cannot call pointer method foo on T1" */ ()
+	x.Foo /* ERROR "x.Foo undefined (type I1 has no field or method Foo, but does have foo)" */ ()
 
-	_ = i2 /* ERROR impossible type assertion: i2\.\(\*T1\)\n\t\*T1 does not implement I2 \(wrong type for method foo\)\n\t\thave foo\(\)\n\t\twant foo\(int\) */ .(*T1)
+	_ = i2 /* ERROR "impossible type assertion: i2.(*T1)\n\t*T1 does not implement I2 (wrong type for method foo)\n\t\thave foo()\n\t\twant foo(int)" */ .(*T1)
 
-	i1 = i0 /* ERROR cannot use i0 .* as I1 value in assignment: I0 does not implement I1 \(missing method foo\) */
-	i1 = t0 /* ERROR .* t0 .* as I1 .*: \*T0 does not implement I1 \(missing method foo\) */
-	i1 = i2 /* ERROR .* i2 .* as I1 .*: I2 does not implement I1 \(wrong type for method foo\)\n\t\thave foo\(int\)\n\t\twant foo\(\) */
-	i1 = t2 /* ERROR .* t2 .* as I1 .*: \*T2 does not implement I1 \(wrong type for method foo\)\n\t\thave foo\(int\)\n\t\twant foo\(\) */
-	i2 = i1 /* ERROR .* i1 .* as I2 .*: I1 does not implement I2 \(wrong type for method foo\)\n\t\thave foo\(\)\n\t\twant foo\(int\) */
-	i2 = t1 /* ERROR .* t1 .* as I2 .*: \*T1 does not implement I2 \(wrong type for method foo\)\n\t\thave foo\(\)\n\t\twant foo\(int\) */
+	i1 = i0 /* ERRORx `cannot use i0 .* as I1 value in assignment: I0 does not implement I1 \(missing method foo\)` */
+	i1 = t0 /* ERRORx `.* t0 .* as I1 .*: \*T0 does not implement I1 \(missing method foo\)` */
+	i1 = i2 /* ERRORx `.* i2 .* as I1 .*: I2 does not implement I1 \(wrong type for method foo\)\n\t\thave foo\(int\)\n\t\twant foo\(\)` */
+	i1 = t2 /* ERRORx `.* t2 .* as I1 .*: \*T2 does not implement I1 \(wrong type for method foo\)\n\t\thave foo\(int\)\n\t\twant foo\(\)` */
+	i2 = i1 /* ERRORx `.* i1 .* as I2 .*: I1 does not implement I2 \(wrong type for method foo\)\n\t\thave foo\(\)\n\t\twant foo\(int\)` */
+	i2 = t1 /* ERRORx `.* t1 .* as I2 .*: \*T1 does not implement I2 \(wrong type for method foo\)\n\t\thave foo\(\)\n\t\twant foo\(int\)` */
 
-	_ = func() I1 { return i0 /* ERROR cannot use i0 .* as I1 value in return statement: I0 does not implement I1 \(missing method foo\) */ }
-	_ = func() I1 { return t0 /* ERROR .* t0 .* as I1 .*: \*T0 does not implement I1 \(missing method foo\) */ }
-	_ = func() I1 { return i2 /* ERROR .* i2 .* as I1 .*: I2 does not implement I1 \(wrong type for method foo\)\n\t\thave foo\(int\)\n\t\twant foo\(\) */ }
-	_ = func() I1 { return t2 /* ERROR .* t2 .* as I1 .*: \*T2 does not implement I1 \(wrong type for method foo\)\n\t\thave foo\(int\)\n\t\twant foo\(\) */ }
-	_ = func() I2 { return i1 /* ERROR .* i1 .* as I2 .*: I1 does not implement I2 \(wrong type for method foo\)\n\t\thave foo\(\)\n\t\twant foo\(int\) */ }
-	_ = func() I2 { return t1 /* ERROR .* t1 .* as I2 .*: \*T1 does not implement I2 \(wrong type for method foo\)\n\t\thave foo\(\)\n\t\twant foo\(int\) */ }
+	_ = func() I1 { return i0 /* ERRORx `cannot use i0 .* as I1 value in return statement: I0 does not implement I1 \(missing method foo\)` */ }
+	_ = func() I1 { return t0 /* ERRORx `.* t0 .* as I1 .*: \*T0 does not implement I1 \(missing method foo\)` */ }
+	_ = func() I1 { return i2 /* ERRORx `.* i2 .* as I1 .*: I2 does not implement I1 \(wrong type for method foo\)\n\t\thave foo\(int\)\n\t\twant foo\(\)` */ }
+	_ = func() I1 { return t2 /* ERRORx `.* t2 .* as I1 .*: \*T2 does not implement I1 \(wrong type for method foo\)\n\t\thave foo\(int\)\n\t\twant foo\(\)` */ }
+	_ = func() I2 { return i1 /* ERRORx `.* i1 .* as I2 .*: I1 does not implement I2 \(wrong type for method foo\)\n\t\thave foo\(\)\n\t\twant foo\(int\)` */ }
+	_ = func() I2 { return t1 /* ERRORx `.* t1 .* as I2 .*: \*T1 does not implement I2 \(wrong type for method foo\)\n\t\thave foo\(\)\n\t\twant foo\(int\)` */ }
 
 	// a few more - less exhaustive now
 
 	f := func(I1, I2){}
-	f(i0 /* ERROR missing method foo */ , i1 /* ERROR wrong type for method foo */ )
+	f(i0 /* ERROR "missing method foo" */ , i1 /* ERROR "wrong type for method foo" */ )
 
-	_ = [...]I1{i0 /* ERROR cannot use i0 .* as I1 value in array or slice literal: I0 does not implement I1 \(missing method foo\) */ }
-	_ = [...]I1{i2 /* ERROR cannot use i2 .* as I1 value in array or slice literal: I2 does not implement I1 \(wrong type for method foo\)\n\t\thave foo\(int\)\n\t\twant foo\(\) */ }
-	_ = []I1{i0 /* ERROR missing method foo */ }
-	_ = []I1{i2 /* ERROR wrong type for method foo */ }
-	_ = map[int]I1{0: i0 /* ERROR missing method foo */ }
-	_ = map[int]I1{0: i2 /* ERROR wrong type for method foo */ }
+	_ = [...]I1{i0 /* ERRORx `cannot use i0 .* as I1 value in array or slice literal: I0 does not implement I1 \(missing method foo\)` */ }
+	_ = [...]I1{i2 /* ERRORx `cannot use i2 .* as I1 value in array or slice literal: I2 does not implement I1 \(wrong type for method foo\)\n\t\thave foo\(int\)\n\t\twant foo\(\)` */ }
+	_ = []I1{i0 /* ERROR "missing method foo" */ }
+	_ = []I1{i2 /* ERROR "wrong type for method foo" */ }
+	_ = map[int]I1{0: i0 /* ERROR "missing method foo" */ }
+	_ = map[int]I1{0: i2 /* ERROR "wrong type for method foo" */ }
 
-	make(chan I1) <- i0 /* ERROR missing method foo */
-	make(chan I1) <- i2 /* ERROR wrong type for method foo */
+	make(chan I1) <- i0 /* ERROR "missing method foo" */
+	make(chan I1) <- i2 /* ERROR "wrong type for method foo" */
 }
 
 // Check that constants representable as integers are in integer form
@@ -199,7 +199,7 @@
 	_ = x == y
 
 	// related: we should see an error since the result of f1 is ([]int, int)
-	var u, v []int = f1 /* ERROR cannot use f1 */ ()
+	var u, v []int = f1 /* ERROR "cannot use f1" */ ()
 	_ = u
 	_ = v
 }
@@ -240,7 +240,7 @@
 	// b and c must not be visible inside function literal
 	a := 0
 	a, b, c := func() (int, int, int) {
-		return a, b /* ERROR undefined */ , c /* ERROR undefined */
+		return a, b /* ERROR "undefined" */ , c /* ERROR "undefined" */
 	}()
 	_, _ = b, c
 }
@@ -260,10 +260,10 @@
 
 // Test that we don't crash when the 'if' condition is missing.
 func issue25438() {
-	if { /* ERROR missing condition */ }
-	if x := 0; /* ERROR missing condition */ { _ = x }
+	if { /* ERROR "missing condition" */ }
+	if x := 0; /* ERROR "missing condition" */ { _ = x }
 	if
-	{ /* ERROR missing condition */ }
+	{ /* ERROR "missing condition" */ }
 }
 
 // Test that we can embed alias type names in interfaces.
@@ -277,12 +277,12 @@
 
 // Test case from issue.
 // cmd/compile reports a cycle as well.
-type issue25301b /* ERROR invalid recursive type */ = interface {
+type issue25301b /* ERROR "invalid recursive type" */ = interface {
 	m() interface{ issue25301b }
 }
 
 type issue25301c interface {
-	notE // ERROR non-interface type struct\{\}
+	notE // ERROR "non-interface type struct{}"
 }
 
 type notE = struct{}
@@ -313,28 +313,28 @@
 
 // Test that we don't crash when type-checking composite literals
 // containing errors in the type.
-var issue27346 = [][n /* ERROR undefined */ ]int{
+var issue27346 = [][n /* ERROR "undefined" */ ]int{
 	0: {},
 }
 
-var issue22467 = map[int][... /* ERROR invalid use of ... */ ]int{0: {}}
+var issue22467 = map[int][... /* ERROR "invalid use of [...] array" */ ]int{0: {}}
 
 // Test that invalid use of ... in parameter lists is recognized
 // (issue #28281).
 func issue28281a(int, int, ...int)
 func issue28281b(a, b int, c ...int)
-func issue28281c(a, b, c ... /* ERROR can only use ... with final parameter */ int)
-func issue28281d(... /* ERROR can only use ... with final parameter */ int, int)
-func issue28281e(a, b, c  ... /* ERROR can only use ... with final parameter */ int, d int)
-func issue28281f(... /* ERROR can only use ... with final parameter */ int, ... /* ERROR can only use ... with final parameter */ int, int)
-func (... /* ERROR can only use ... with final parameter */ TT) f()
-func issue28281g() (... /* ERROR can only use ... with final parameter */ TT)
+func issue28281c(a, b, c ... /* ERROR "can only use ... with final parameter" */ int)
+func issue28281d(... /* ERROR "can only use ... with final parameter" */ int, int)
+func issue28281e(a, b, c  ... /* ERROR "can only use ... with final parameter" */ int, d int)
+func issue28281f(... /* ERROR "can only use ... with final parameter" */ int, ... /* ERROR "can only use ... with final parameter" */ int, int)
+func (... /* ERROR "can only use ... with final parameter" */ TT) f()
+func issue28281g() (... /* ERROR "can only use ... with final parameter" */ TT)
 
 // Issue #26234: Make various field/method lookup errors easier to read by matching cmd/compile's output
 func issue26234a(f *syn.Prog) {
 	// The error message below should refer to the actual package name (syntax)
 	// not the local package name (syn).
-	f.foo /* ERROR f\.foo undefined \(type \*syntax\.Prog has no field or method foo\) */
+	f.foo /* ERROR "f.foo undefined (type *syntax.Prog has no field or method foo)" */
 }
 
 type T struct {
@@ -347,23 +347,23 @@
 type E2 struct{ f int }
 
 func issue26234b(x T) {
-	_ = x.f /* ERROR ambiguous selector x.f */
+	_ = x.f /* ERROR "ambiguous selector x.f" */
 }
 
 func issue26234c() {
-	T.x /* ERROR T.x undefined \(type T has no method x\) */ ()
+	T.x /* ERROR "T.x undefined (type T has no method x)" */ ()
 }
 
 func issue35895() {
 	// T is defined in this package, don't qualify its name with the package name.
-	var _ T = 0 // ERROR cannot use 0 \(untyped int constant\) as T
+	var _ T = 0 // ERROR "cannot use 0 (untyped int constant) as T"
 
 	// There is only one package with name syntax imported, only use the (global) package name in error messages.
-	var _ *syn.Prog = 0 // ERROR cannot use 0 \(untyped int constant\) as \*syntax.Prog
+	var _ *syn.Prog = 0 // ERROR "cannot use 0 (untyped int constant) as *syntax.Prog"
 
 	// Because both t1 and t2 have the same global package name (template),
 	// qualify packages with full path name in this case.
-	var _ t1.Template = t2 /* ERROR cannot use .* \(value of type .html/template.\.Template\) as .text/template.\.Template */ .Template{}
+	var _ t1.Template = t2 /* ERRORx `cannot use .* \(value of type .html/template.\.Template\) as .text/template.\.Template` */ .Template{}
 }
 
 func issue42989(s uint) {
diff --git a/src/internal/types/testdata/check/issues1.go b/src/internal/types/testdata/check/issues1.go
index 2f3414d..72c6cf7 100644
--- a/src/internal/types/testdata/check/issues1.go
+++ b/src/internal/types/testdata/check/issues1.go
@@ -1,5 +1,3 @@
-// -oldComparableSemantics
-
 // Copyright 2020 The Go Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
@@ -18,11 +16,11 @@
 func _[X comparable, Y interface{comparable; m()}]() {
 	var x X
 	var y Y
-	eql(x, y /* ERROR does not match */ ) // interfaces of different types
+	eql(x, y /* ERROR "does not match" */ ) // interfaces of different types
 	eql(x, x)
 	eql(y, y)
-	eql(y, nil /* ERROR cannot use nil as Y value in argument to eql */ )
-	eql[io /* ERROR does not satisfy comparable */ .Reader](nil, nil)
+	eql(y, nil /* ERROR "cannot use nil as Y value in argument to eql" */ )
+	eql[io.Reader](nil, nil)
 }
 
 // If we have a receiver of pointer to type parameter type (below: *T)
@@ -33,12 +31,12 @@
 
 // using type bound C
 func _[T C[T]](x *T) {
-	x.m /* ERROR x\.m undefined */ ()
+	x.m /* ERROR "x.m undefined" */ ()
 }
 
 // using an interface literal as bound
 func _[T interface{ m() }](x *T) {
-	x.m /* ERROR x\.m undefined */ ()
+	x.m /* ERROR "x.m undefined" */ ()
 }
 
 func f2[_ interface{ m1(); m2() }]() {}
@@ -48,7 +46,7 @@
 func (*T) m2()
 
 func _() {
-	f2[T /* ERROR m2 has pointer receiver */ ]()
+	f2[T /* ERROR "m2 has pointer receiver" */ ]()
 	f2[*T]()
 }
 
@@ -58,7 +56,7 @@
 type T1[P interface{~uint}] struct{}
 
 func _[P any]() {
-    _ = T1[P /* ERROR P does not satisfy interface{~uint} */ ]{}
+    _ = T1[P /* ERROR "P does not satisfy interface{~uint}" */ ]{}
 }
 
 // This is the original (simplified) program causing the same issue.
@@ -74,8 +72,8 @@
     return u.s + 1
 }
 
-func NewT2[U any]() T2[U /* ERROR U does not satisfy Unsigned */ ] {
-    return T2[U /* ERROR U does not satisfy Unsigned */ ]{}
+func NewT2[U any]() T2[U /* ERROR "U does not satisfy Unsigned" */ ] {
+    return T2[U /* ERROR "U does not satisfy Unsigned" */ ]{}
 }
 
 func _() {
@@ -145,8 +143,8 @@
 }
 
 // Infinite generic type declarations must lead to an error.
-type inf1[T any] struct{ _ inf1 /* ERROR invalid recursive type */ [T] }
-type inf2[T any] struct{ inf2 /* ERROR invalid recursive type */ [T] }
+type inf1[T any] struct{ _ inf1 /* ERROR "invalid recursive type" */ [T] }
+type inf2[T any] struct{ inf2 /* ERROR "invalid recursive type" */ [T] }
 
 // The implementation of conversions T(x) between integers and floating-point
 // numbers checks that both T and x have either integer or floating-point
@@ -201,7 +199,7 @@
 // (Example by mdempsky@.)
 func _[T interface { ~[10]int }](x T) {
 	_ = x[9] // ok
-	_ = x[20 /* ERROR out of bounds */ ]
+	_ = x[20 /* ERROR "out of bounds" */ ]
 }
 
 // Pointer indirection of a type parameter.
@@ -248,5 +246,5 @@
 func g[T any](T) T { panic(0) }
 
 var _ = g[int]
-var _ = g[nil /* ERROR is not a type */ ]
+var _ = g[nil /* ERROR "is not a type" */ ]
 var _ = g(0)
diff --git a/src/internal/types/testdata/check/main0.go b/src/internal/types/testdata/check/main0.go
index 132a5fe..95a8ed1 100644
--- a/src/internal/types/testdata/check/main0.go
+++ b/src/internal/types/testdata/check/main0.go
@@ -5,5 +5,5 @@
 package main
 
 func main()
-func main /* ERROR "no arguments and no return values" */ /* ERROR redeclared */ (int)
-func main /* ERROR "no arguments and no return values" */ /* ERROR redeclared */ () int
+func main /* ERROR "no arguments and no return values" */ /* ERROR "redeclared" */ (int)
+func main /* ERROR "no arguments and no return values" */ /* ERROR "redeclared" */ () int
diff --git a/src/internal/types/testdata/check/map0.go b/src/internal/types/testdata/check/map0.go
index 814d953..21c989c 100644
--- a/src/internal/types/testdata/check/map0.go
+++ b/src/internal/types/testdata/check/map0.go
@@ -6,7 +6,7 @@
 package orderedmap
 
 // TODO(gri) fix imports for tests
-import "chans" // ERROR could not import
+import "chans" // ERROR "could not import"
 
 // Map is an ordered map.
 type Map[K, V any] struct {
diff --git a/src/internal/types/testdata/check/methodsets.go b/src/internal/types/testdata/check/methodsets.go
index d145bc0..5b3e4a2 100644
--- a/src/internal/types/testdata/check/methodsets.go
+++ b/src/internal/types/testdata/check/methodsets.go
@@ -29,7 +29,7 @@
 func _() {
 	var (
 		_ func(T0) = T0.v0
-		_ = T0.p0 /* ERROR invalid method expression T0\.p0 \(needs pointer receiver \(\*T0\)\.p0\) */
+		_ = T0.p0 /* ERROR "invalid method expression T0.p0 (needs pointer receiver (*T0).p0)" */
 
 		_ func (*T0) = (*T0).v0
 		_ func (*T0) = (*T0).p0
@@ -40,7 +40,7 @@
 		_ func(T2) = T2.p2
 
 		_ func(T3) = T3.v0
-		_ func(T3) = T3.p0 /* ERROR invalid method expression T3\.p0 \(needs pointer receiver \(\*T3\)\.p0\) */
+		_ func(T3) = T3.p0 /* ERROR "invalid method expression T3.p0 (needs pointer receiver (*T3).p0)" */
 		_ func(T3) = T3.v1
 		_ func(T3) = T3.p1
 		_ func(T3) = T3.v2
@@ -196,9 +196,9 @@
 		_ func(error) string = error.Error
 
 		perr = &err
-		_ = perr.Error /* ERROR "type \*error is pointer to interface, not interface" */ ()
-		_ func() string = perr.Error /* ERROR "type \*error is pointer to interface, not interface" */
-		_ func(*error) string = (*error).Error /* ERROR "type \*error is pointer to interface, not interface" */
+		_ = perr.Error /* ERROR "type *error is pointer to interface, not interface" */ ()
+		_ func() string = perr.Error /* ERROR "type *error is pointer to interface, not interface" */
+		_ func(*error) string = (*error).Error /* ERROR "type *error is pointer to interface, not interface" */
 	)
 
 	type T *interface{ m() int }
diff --git a/src/internal/types/testdata/check/shifts.go b/src/internal/types/testdata/check/shifts.go
index 5cd0182..6ae3985 100644
--- a/src/internal/types/testdata/check/shifts.go
+++ b/src/internal/types/testdata/check/shifts.go
@@ -206,7 +206,7 @@
 	// _ = int(1.0<<s)
 	// _ = int(complex(1, 0)<<s)
 	_ = int(float32/* ERROR "must be integer" */(1.0) <<s)
-	_ = int(1.1 /* ERROR must be integer */ <<s)
+	_ = int(1.1 /* ERROR "must be integer" */ <<s)
 	_ = int(( /* ERROR "must be integer" */ 1+1i)  <<s)
 
 	_ = complex(1 /* ERROR "must be integer" */ <<s, 0)
@@ -259,26 +259,26 @@
 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
+	_ = 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)
+	_ = 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)
+	_ = int(1.1 /* ERRORx `shifted operand .* must be integer` */ <<s)
+	_ = float32(1 /* ERRORx `shifted operand .* must be integer` */ <<s)
+	_ = float32(1. /* ERRORx `shifted operand .* must be integer` */ <<s)
+	_ = float32(1.1 /* ERRORx `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)
+	_ = complex64(1.1 /* ERRORx `shifted operand .* must be integer` */ <<s)
 }
 
 func shifts9() {
@@ -382,7 +382,7 @@
 	var a = make([]int, 1<<s + 1.2 /* ERROR "truncated to int" */ )
 	var _ = a[1<<s - 2.3 /* ERROR "truncated to int" */ ]
 	var _ int = 1<<s + 3.4 /* ERROR "truncated to int" */
-	var _ = string(1 /* ERROR shifted operand 1 .* must be integer */ << s)
+	var _ = string(1 /* ERRORx `shifted operand 1 .* must be integer` */ << s)
 	var _ = string(1.0 /* ERROR "cannot convert" */ << s)
 }
 
diff --git a/src/internal/types/testdata/check/slices.go b/src/internal/types/testdata/check/slices.go
index 2bacd1c..2c33518 100644
--- a/src/internal/types/testdata/check/slices.go
+++ b/src/internal/types/testdata/check/slices.go
@@ -56,7 +56,7 @@
 }
 
 var reduced1 = Reduce[int, float64](input, 0, reducer)
-var reduced2 = Reduce(input, 1i /* ERROR overflows */, reducer) // using type inference
+var reduced2 = Reduce(input, 1i /* ERROR "overflows" */, reducer) // using type inference
 var reduced3 = Reduce(input, 1, reducer) // using type inference
 
 func filter(x int) bool {
diff --git a/src/internal/types/testdata/check/stmt0.go b/src/internal/types/testdata/check/stmt0.go
index c456aac..5232285 100644
--- a/src/internal/types/testdata/check/stmt0.go
+++ b/src/internal/types/testdata/check/stmt0.go
@@ -29,19 +29,19 @@
 
 	a, b, c = <- /* ERROR "assignment mismatch: 3 variables but 1 value" */ ch
 
-	return /* ERROR "not enough return values\n\thave \(\)\n\twant \(int, int\)" */
-	return 1 /* ERROR "not enough return values\n\thave \(number\)\n\twant \(int, int\)" */
+	return /* ERROR "not enough return values\n\thave ()\n\twant (int, int)" */
+	return 1 /* ERROR "not enough return values\n\thave (number)\n\twant (int, int)" */
 	return 1, 2
-	return 1, 2, 3 /* ERROR "too many return values\n\thave \(number, number, number\)\n\twant \(int, int\)" */
+	return 1, 2, 3 /* ERROR "too many return values\n\thave (number, number, number)\n\twant (int, int)" */
 }
 
 func assignments1() {
 	b, i, f, c, s := false, 1, 1.0, 1i, "foo"
-	b = i /* ERROR "cannot use .* in assignment" */
-	i = f /* ERROR "cannot use .* in assignment" */
-	f = c /* ERROR "cannot use .* in assignment" */
-	c = s /* ERROR "cannot use .* in assignment" */
-	s = b /* ERROR "cannot use .* in assignment" */
+	b = i /* ERRORx `cannot use .* in assignment` */
+	i = f /* ERRORx `cannot use .* in assignment` */
+	f = c /* ERRORx `cannot use .* in assignment` */
+	c = s /* ERRORx `cannot use .* in assignment` */
+	s = b /* ERRORx `cannot use .* in assignment` */
 
 	v0, v1, v2 := 1 /* ERROR "assignment mismatch" */ , 2, 3, 4
 	_, _, _ = v0, v1, v2
@@ -70,7 +70,7 @@
 	// test cases for issue 5800
 	var (
 		_ int = nil /* ERROR "cannot use nil as int value in variable declaration" */
-		_ [10]int = nil /* ERROR "cannot use nil as \[10\]int value in variable declaration" */
+		_ [10]int = nil /* ERROR "cannot use nil as [10]int value in variable declaration" */
 		_ []byte = nil
 		_ struct{} = nil /* ERROR "cannot use nil as struct{} value in variable declaration" */
 		_ func() = nil
@@ -90,7 +90,7 @@
 
 	// assignments to _
 	_ = nil /* ERROR "use of untyped nil" */
-	_ = 1  << /* ERROR constant shift overflow */ 1000
+	_ = 1  << /* ERROR "constant shift overflow" */ 1000
 	(_) = 0
 }
 
@@ -108,23 +108,23 @@
 	s, b = m["foo"]
 	_, d = m["bar"]
 	m["foo"] = nil
-	m["foo"] = nil /* ERROR assignment mismatch: 1 variable but 2 values */ , false
+	m["foo"] = nil /* ERROR "assignment mismatch: 1 variable but 2 values" */ , 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 mismatch: 1 variable but 2 values */ , false
+	<- /* ERROR "cannot assign" */ c = 0
+	<-c = 0 /* ERROR "assignment mismatch: 1 variable but 2 values" */ , false
 
 	var x interface{}
 	_, b = x.(int)
-	x /* ERROR cannot assign */ .(int) = 0
-	x.(int) = 0 /* ERROR assignment mismatch: 1 variable but 2 values */ , false
+	x /* ERROR "cannot assign" */ .(int) = 0
+	x.(int) = 0 /* ERROR "assignment mismatch: 1 variable but 2 values" */ , false
 
-	assignments2 /* ERROR used as value */ () = nil
-	int /* ERROR not an expression */ = 0
+	assignments2 /* ERROR "used as value" */ () = nil
+	int /* ERROR "not an expression" */ = 0
 }
 
 func issue6487() {
@@ -143,13 +143,13 @@
 }
 
 func issue6766a() {
-	a, a /* ERROR a repeated on left side of := */ := 1, 2
+	a, a /* ERROR "a repeated on left side of :=" */ := 1, 2
 	_ = a
-	a, b, b /* ERROR b repeated on left side of := */ := 1, 2, 3
+	a, b, b /* ERROR "b repeated on left side of :=" */ := 1, 2, 3
 	_ = b
-	c, c /* ERROR c repeated on left side of := */, b := 1, 2, 3
+	c, c /* ERROR "c repeated on left side of :=" */, b := 1, 2, 3
 	_ = c
-	a, b := /* ERROR no new variables */ 1, 2
+	a, b := /* ERROR "no new variables" */ 1, 2
 }
 
 func shortVarDecls1() {
@@ -182,7 +182,7 @@
 	var x int
 	x <- /* ERROR "cannot send" */ x
 	rch <- /* ERROR "cannot send" */ x
-	ch <- "foo" /* ERROR "cannot use .* in send" */
+	ch <- "foo" /* ERRORx `cannot use .* in send` */
 	ch <- x
 }
 
@@ -212,8 +212,8 @@
 	select {
 	case a, b := <-ch:
 		_, b = a, b
-	case x /* ERROR send or receive */ :
-	case a /* ERROR send or receive */ := ch:
+	case x /* ERROR "send or receive" */ :
+	case a /* ERROR "send or receive" */ := ch:
 	}
 
 	// test for issue 9570: ch2 in second case falsely resolved to
@@ -222,7 +222,7 @@
 	ch2 := make(chan int)
 	select {
 	case <-ch1:
-		var ch2 /* ERROR ch2 declared and not used */ chan bool
+		var ch2 /* ERROR "ch2 declared and not used" */ chan bool
 	case i := <-ch2:
 		print(i + 1)
 	}
@@ -231,7 +231,7 @@
 func gos() {
 	go 1; /* ERROR "must be function call" */
 	go int /* ERROR "go requires function call, not conversion" */ (0)
-	go ( /* ERROR expression in go must not be parenthesized */ gos())
+	go ( /* ERROR "expression in go must not be parenthesized" */ gos())
 	go gos()
 	var c chan int
 	go close(c)
@@ -241,7 +241,7 @@
 func defers() {
 	defer 1; /* ERROR "must be function call" */
 	defer int /* ERROR "defer requires function call, not conversion" */ (0)
-	defer ( /* ERROR expression in defer must not be parenthesized */ defers())
+	defer ( /* ERROR "expression in defer must not be parenthesized" */ defers())
 	defer defers()
 	var c chan int
 	defer close(c)
@@ -377,24 +377,24 @@
 
 func returns0() {
 	return
-	return 0 /* ERROR too many return values */
+	return 0 /* ERROR "too many return values" */
 }
 
 func returns1(x float64) (int, *float64) {
 	return 0, &x
-	return /* ERROR not enough return values */
-	return "foo" /* ERROR "cannot .* in return statement" */, x /* ERROR "cannot use .* in return statement" */
-	return 0, &x, 1 /* ERROR too many return values */
+	return /* ERROR "not enough return values" */
+	return "foo" /* ERRORx `cannot .* in return statement` */, x /* ERRORx `cannot use .* in return statement` */
+	return 0, &x, 1 /* ERROR "too many return values" */
 }
 
 func returns2() (a, b int) {
 	return
-	return 1, "foo" /* ERROR cannot use .* in return statement */
-	return 1, 2, 3 /* ERROR too many return values */
+	return 1, "foo" /* ERRORx `cannot use .* in return statement` */
+	return 1, 2, 3 /* ERROR "too many return values" */
 	{
 		type a int
 		return 1, 2
-		return /* ERROR a not in scope at return */
+		return /* ERROR "a not in scope at return" */
 	}
 }
 
@@ -431,7 +431,7 @@
 
 	switch int32(x) {
 	case 1, 2:
-	case x /* ERROR "invalid case x in switch on int32\(x\) \(mismatched types int and int32\)" */ :
+	case x /* ERROR "invalid case x in switch on int32(x) (mismatched types int and int32)" */ :
 	}
 
 	switch x {
@@ -448,36 +448,36 @@
 
 	switch uint64(x) {
 	case 1<<64 - 1:
-	case 1 /* ERROR duplicate case */ <<64 - 1:
+	case 1 /* ERROR "duplicate case" */ <<64 - 1:
 	case 2, 3, 4:
-	case 5, 1 /* ERROR duplicate case */ <<64 - 1:
+	case 5, 1 /* ERROR "duplicate case" */ <<64 - 1:
 	}
 
 	var y32 float32
 	switch y32 {
 	case 1.1:
 	case 11/10: // integer division!
-	case 11. /* ERROR duplicate case */ /10:
+	case 11. /* ERROR "duplicate case" */ /10:
 	case 2, 3.0, 4.1:
-	case 5.2, 1.10 /* ERROR duplicate case */ :
+	case 5.2, 1.10 /* ERROR "duplicate case" */ :
 	}
 
 	var y64 float64
 	switch y64 {
 	case 1.1:
 	case 11/10: // integer division!
-	case 11. /* ERROR duplicate case */ /10:
+	case 11. /* ERROR "duplicate case" */ /10:
 	case 2, 3.0, 4.1:
-	case 5.2, 1.10 /* ERROR duplicate case */ :
+	case 5.2, 1.10 /* ERROR "duplicate case" */ :
 	}
 
 	var s string
 	switch s {
 	case "foo":
-	case "foo" /* ERROR duplicate case */ :
-	case "f" /* ERROR duplicate case */ + "oo":
+	case "foo" /* ERROR "duplicate case" */ :
+	case "f" /* ERROR "duplicate case" */ + "oo":
 	case "abc", "def", "ghi":
-	case "jkl", "foo" /* ERROR duplicate case */ :
+	case "jkl", "foo" /* ERROR "duplicate case" */ :
 	}
 
 	type T int
@@ -492,14 +492,14 @@
 	case (*int)(nil): // do duplicate detection
 	case 1:
 	case byte(1):
-	case int /* ERROR duplicate case */ (1):
+	case int /* ERROR "duplicate case" */ (1):
 	case T(1):
 	case 1.0:
 	case F(1.0):
-	case F /* ERROR duplicate case */ (1.0):
+	case F /* ERROR "duplicate case" */ (1.0):
 	case "hello":
 	case S("hello"):
-	case S /* ERROR duplicate case */ ("hello"):
+	case S /* ERROR "duplicate case" */ ("hello"):
 	case 1==1, B(false):
 	case false, B(2==2):
 	}
@@ -509,7 +509,7 @@
 	switch a {
 	case [3]int{1, 2, 3}:
 	case [3]int{1, 2, 3}: // no duplicate detection
-	case [ /* ERROR "mismatched types */ 4]int{4, 5, 6}:
+	case [ /* ERROR "mismatched types" */ 4]int{4, 5, 6}:
 	}
 
 	// switch on channel
@@ -611,7 +611,7 @@
 	// untyped constants are converted to default types
 	switch 1<<63-1 {
 	}
-	switch 1 /* ERROR "cannot use .* as int value.*\(overflows\)" */ << 63 {
+	switch 1 /* ERRORx `cannot use .* as int value.*\(overflows\)` */ << 63 {
 	}
 	var x int
 	switch 1.0 {
@@ -633,9 +633,9 @@
 }
 
 func issue11667() {
-	switch 9223372036854775808 /* ERROR "cannot use .* as int value.*\(overflows\)" */ {
+	switch 9223372036854775808 /* ERRORx `cannot use .* as int value.*\(overflows\)` */ {
 	}
-	switch 9223372036854775808 /* ERROR "cannot use .* as int value.*\(overflows\)" */ {
+	switch 9223372036854775808 /* ERRORx `cannot use .* as int value.*\(overflows\)` */ {
 	case 9223372036854775808:
 	}
 	var x int
@@ -701,16 +701,16 @@
 
 	switch t := x.(type) {
 	case nil:
-		var v bool = t /* ERROR "cannot use .* in variable declaration" */
+		var v bool = t /* ERRORx `cannot use .* in variable declaration` */
 		_ = v
 	case int:
 		var v int = t
 		_ = v
 	case float32, complex64:
-		var v float32 = t /* ERROR "cannot use .* in variable declaration" */
+		var v float32 = t /* ERRORx `cannot use .* in variable declaration` */
 		_ = v
 	default:
-		var v float32 = t /* ERROR "cannot use .* in variable declaration" */
+		var v float32 = t /* ERRORx `cannot use .* in variable declaration` */
 		_ = v
 	}
 
@@ -726,7 +726,7 @@
 	{
 		x := 1
 		v := 2
-		switch v /* ERROR "v [(]variable of type int[)] is not an interface" */ .(type) {
+		switch v /* ERROR "v (variable of type int) is not an interface" */ .(type) {
 		case int:
 			println(x)
 			println(x / 0 /* ERROR "invalid operation: division by zero" */)
@@ -777,20 +777,20 @@
 	switch x.(type) {
 	case int:
 	case float64:
-	case int /* ERROR duplicate case */ :
+	case int /* ERROR "duplicate case" */ :
 	}
 
 	switch x.(type) {
 	case nil:
 	case int:
-	case nil /* ERROR duplicate case */ , nil /* ERROR duplicate case */ :
+	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 float32, func /* ERROR "duplicate case" */ (x int):
 	case F:
 	}
 }
@@ -800,7 +800,7 @@
 	var i string
 	_ = i
 	for i := 0; i < 10; i++ {}
-	for i := 0; i < 10; j /* ERROR cannot declare */ := 0 {}
+	for i := 0; i < 10; j /* ERROR "cannot declare" */ := 0 {}
 }
 
 func rangeloops1() {
@@ -832,7 +832,7 @@
 		ii = i
 		_ = ii
 		var xx float64
-		xx = x /* ERROR "cannot use .* in assignment" */
+		xx = x /* ERRORx `cannot use .* in assignment` */
 		_ = xx
 	}
 	var ii int
@@ -883,7 +883,7 @@
 	for range m {}
 	for k := range m {
 		var kk int32
-		kk = k /* ERROR "cannot use .* in assignment" */
+		kk = k /* ERRORx `cannot use .* in assignment` */
 		_ = kk
 	}
 	for k, v := range m {
@@ -925,39 +925,39 @@
 	var a [10]int
 	var i I
 	_ = i
-	for i /* ERROR cannot use .* in assignment */ = range a {}
-	for i /* ERROR cannot use .* in assignment */ = range &a {}
-	for i /* ERROR cannot use .* in assignment */ = range a[:] {}
+	for i /* ERRORx `cannot use .* in assignment` */ = range a {}
+	for i /* ERRORx `cannot use .* in assignment` */ = range &a {}
+	for i /* ERRORx `cannot use .* in assignment` */ = range a[:] {}
 
 	var s string
 	var r R
 	_ = r
-	for i /* ERROR cannot use .* in assignment */ = range s {}
-	for i /* ERROR cannot use .* in assignment */ = range "foo" {}
-	for _, r /* ERROR cannot use .* in assignment */ = range s {}
-	for _, r /* ERROR cannot use .* in assignment */ = range "foo" {}
+	for i /* ERRORx `cannot use .* in assignment` */ = range s {}
+	for i /* ERRORx `cannot use .* in assignment` */ = range "foo" {}
+	for _, r /* ERRORx `cannot use .* in assignment` */ = range s {}
+	for _, r /* ERRORx `cannot use .* in assignment` */ = range "foo" {}
 }
 
 func issue6766b() {
-	for _ := /* ERROR no new variables */ range "" {}
-	for a, a /* ERROR redeclared */ := range "" { _ = a }
+	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 }
+	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 and not used */ := range "" {
-		_ = "" /* ERROR mismatched types untyped string and untyped int */ + 1
+	for y /* ERROR "declared and not used" */ := range "" {
+		_ = "" /* ERROR "mismatched types untyped string and untyped int" */ + 1
 	}
-	for range 1 /* ERROR cannot range over 1 */ {
-		_ = "" /* ERROR mismatched types untyped string and untyped int */ + 1
+	for range 1 /* ERROR "cannot range over 1" */ {
+		_ = "" /* ERROR "mismatched types untyped string and untyped int" */ + 1
 	}
-	for y := range 1 /* ERROR cannot range over 1 */ {
-		_ = "" /* ERROR mismatched types untyped string and untyped int */ + 1
+	for y := range 1 /* ERROR "cannot range over 1" */ {
+		_ = "" /* ERROR "mismatched types untyped string and untyped int" */ + 1
 	}
 }
 
diff --git a/src/internal/types/testdata/check/typeinference.go b/src/internal/types/testdata/check/typeinference.go
index 28f3e28..0478d93 100644
--- a/src/internal/types/testdata/check/typeinference.go
+++ b/src/internal/types/testdata/check/typeinference.go
@@ -9,20 +9,20 @@
 // basic inference
 type Tb[P ~*Q, Q any] int
 func _() {
-	var x Tb /* ERROR got 1 arguments */ [*int]
+	var x Tb /* ERROR "got 1 arguments" */ [*int]
 	var y Tb[*int, int]
-	x = y /* ERROR cannot use y .* in assignment */
+	x = y /* ERRORx `cannot use y .* in assignment` */
 	_ = x
 }
 
 // recursive inference
 type Tr[A any, B *C, C *D, D *A] int
 func _() {
-	var x Tr /* ERROR got 1 arguments */ [string]
+	var x Tr /* ERROR "got 1 arguments" */ [string]
 	var y Tr[string, ***string, **string, *string]
 	var z Tr[int, ***int, **int, *int]
-	x = y /* ERROR cannot use y .* in assignment */
-	x = z // ERROR cannot use z .* as Tr
+	x = y /* ERRORx `cannot use y .* in assignment` */
+	x = z // ERRORx `cannot use z .* as Tr`
 	_ = x
 }
 
@@ -33,17 +33,17 @@
 type To3[A any, B [3]*A] int
 type To4[A any, B any, C struct{a A; b B}] int
 func _() {
-	var _ To0 /* ERROR got 1 arguments */ [int]
-	var _ To1 /* ERROR got 1 arguments */ [int]
-	var _ To2 /* ERROR got 1 arguments */ [int]
-	var _ To3 /* ERROR got 1 arguments */ [int]
-	var _ To4 /* ERROR got 2 arguments */ [int, string]
+	var _ To0 /* ERROR "got 1 arguments" */ [int]
+	var _ To1 /* ERROR "got 1 arguments" */ [int]
+	var _ To2 /* ERROR "got 1 arguments" */ [int]
+	var _ To3 /* ERROR "got 1 arguments" */ [int]
+	var _ To4 /* ERROR "got 2 arguments" */ [int, string]
 }
 
 // failed inference
 type Tf0[A, B any] int
 type Tf1[A any, B ~struct{a A; c C}, C any] int
 func _() {
-	var _ Tf0 /* ERROR got 1 arguments but 2 type parameters */ [int]
-	var _ Tf1 /* ERROR got 1 arguments but 3 type parameters */ [int]
+	var _ Tf0 /* ERROR "got 1 arguments but 2 type parameters" */ [int]
+	var _ Tf1 /* ERROR "got 1 arguments but 3 type parameters" */ [int]
 }
diff --git a/src/internal/types/testdata/check/typeinst0.go b/src/internal/types/testdata/check/typeinst0.go
index c21cb53..bbcdaec 100644
--- a/src/internal/types/testdata/check/typeinst0.go
+++ b/src/internal/types/testdata/check/typeinst0.go
@@ -9,7 +9,7 @@
 // Parameterized type declarations
 
 // For now, a lone type parameter is not permitted as RHS in a type declaration (issue #45639).
-type T1[P any] P // ERROR cannot use a type parameter as RHS in type declaration
+type T1[P any] P // ERROR "cannot use a type parameter as RHS in type declaration"
 
 type T2[P any] struct {
         f P
@@ -19,12 +19,12 @@
 type List[P any] []P
 
 // Alias type declarations cannot have type parameters.
-// Issue #46477 proposses to change that.
-type A1[P any] = /* ERROR cannot be alias */ struct{}
+// Issue #46477 proposes to change that.
+type A1[P any] = /* ERROR "cannot be alias" */ struct{}
 
 // Pending clarification of #46477 we disallow aliases
 // of generic types.
-type A2 = List // ERROR cannot use generic type
+type A2 = List // ERROR "cannot use generic type"
 var _ A2[int]
 var _ A2
 
@@ -34,15 +34,15 @@
 // Parameterized type instantiations
 
 var x int
-type _ x /* ERROR not a type */ [int]
+type _ x /* ERROR "not a type" */ [int]
 
-type _ int /* ERROR not a generic type */ [] // ERROR expected type argument list
-type _ myInt /* ERROR not a generic type */ [] // ERROR expected type argument list
+type _ int /* ERROR "not a generic type" */ [] // ERROR "expected type argument list"
+type _ myInt /* ERROR "not a generic type" */ [] // ERROR "expected type argument list"
 
 // TODO(gri) better error messages
-type _ T1[] // ERROR expected type argument list
-type _ T1[x /* ERROR not a type */ ]
-type _ T1 /* ERROR got 2 arguments but 1 type parameters */ [int, float32]
+type _ T1[] // ERROR "expected type argument list"
+type _ T1[x /* ERROR "not a type" */ ]
+type _ T1 /* ERROR "got 2 arguments but 1 type parameters" */ [int, float32]
 
 var _ T2[int] = T2[int]{}
 
@@ -58,5 +58,5 @@
 
 // Self-recursive generic types are not permitted
 
-type self1[P any] self1 /* ERROR invalid recursive type */ [P]
+type self1[P any] self1 /* ERROR "invalid recursive type" */ [P]
 type self2[P any] *self2[P] // this is ok
diff --git a/src/internal/types/testdata/check/typeinst1.go b/src/internal/types/testdata/check/typeinst1.go
index e7bb247..0e09e70 100644
--- a/src/internal/types/testdata/check/typeinst1.go
+++ b/src/internal/types/testdata/check/typeinst1.go
@@ -163,13 +163,13 @@
 
 // Type sets may contain each type at most once.
 type _ interface {
-	~int|~ /* ERROR overlapping terms ~int */ int
-	~int|int /* ERROR overlapping terms int */
-	int|int /* ERROR overlapping terms int */
+	~int|~ /* ERROR "overlapping terms ~int" */ int
+	~int|int /* ERROR "overlapping terms int" */
+	int|int /* ERROR "overlapping terms int" */
 }
 
 type _ interface {
-	~struct{f int} | ~struct{g int} | ~ /* ERROR overlapping terms */ struct{f int}
+	~struct{f int} | ~struct{g int} | ~ /* ERROR "overlapping terms" */ struct{f int}
 }
 
 // Interface term lists can contain any type, incl. *Named types.
@@ -210,7 +210,7 @@
 var _ = f0[int]
 var _ = f0[bool]
 var _ = f0[string]
-var _ = f0[float64 /* ERROR does not satisfy I0 */ ]
+var _ = f0[float64 /* ERROR "does not satisfy I0" */ ]
 
 type I01 interface {
 	E0
@@ -219,9 +219,9 @@
 
 func f01[T I01]() {}
 var _ = f01[int]
-var _ = f01[bool /* ERROR does not satisfy I0 */ ]
+var _ = f01[bool /* ERROR "does not satisfy I0" */ ]
 var _ = f01[string]
-var _ = f01[float64 /* ERROR does not satisfy I0 */ ]
+var _ = f01[float64 /* ERROR "does not satisfy I0" */ ]
 
 type I012 interface {
 	E0
@@ -230,10 +230,10 @@
 }
 
 func f012[T I012]() {}
-var _ = f012[int /* ERROR cannot satisfy I012.*empty type set */ ]
-var _ = f012[bool /* ERROR cannot satisfy I012.*empty type set */ ]
-var _ = f012[string /* ERROR cannot satisfy I012.*empty type set */ ]
-var _ = f012[float64 /* ERROR cannot satisfy I012.*empty type set */ ]
+var _ = f012[int /* ERRORx `cannot satisfy I012.*empty type set` */ ]
+var _ = f012[bool /* ERRORx `cannot satisfy I012.*empty type set` */ ]
+var _ = f012[string /* ERRORx `cannot satisfy I012.*empty type set` */ ]
+var _ = f012[float64 /* ERRORx `cannot satisfy I012.*empty type set` */ ]
 
 type I12 interface {
 	E1
@@ -241,9 +241,9 @@
 }
 
 func f12[T I12]() {}
-var _ = f12[int /* ERROR does not satisfy I12 */ ]
-var _ = f12[bool /* ERROR does not satisfy I12 */ ]
-var _ = f12[string /* ERROR does not satisfy I12 */ ]
+var _ = f12[int /* ERROR "does not satisfy I12" */ ]
+var _ = f12[bool /* ERROR "does not satisfy I12" */ ]
+var _ = f12[string /* ERROR "does not satisfy I12" */ ]
 var _ = f12[float64]
 
 type I0_ interface {
@@ -253,13 +253,13 @@
 
 func f0_[T I0_]() {}
 var _ = f0_[int]
-var _ = f0_[bool /* ERROR does not satisfy I0_ */ ]
-var _ = f0_[string /* ERROR does not satisfy I0_ */ ]
-var _ = f0_[float64 /* ERROR does not satisfy I0_ */ ]
+var _ = f0_[bool /* ERROR "does not satisfy I0_" */ ]
+var _ = f0_[string /* ERROR "does not satisfy I0_" */ ]
+var _ = f0_[float64 /* ERROR "does not satisfy I0_" */ ]
 
 // Using a function instance as a type is an error.
-var _ f0 // ERROR not a type
-var _ f0 /* ERROR not a type */ [int]
+var _ f0 // ERROR "not a type"
+var _ f0 /* ERROR "not a type" */ [int]
 
 // Empty type sets can only be satisfied by empty type sets.
 type none interface {
@@ -273,7 +273,7 @@
 func hh[T ~int]() {}
 
 func _[T none]() {
-	_ = ff[int /* ERROR cannot satisfy none \(empty type set\) */ ]
+	_ = ff[int /* ERROR "cannot satisfy none (empty type set)" */ ]
 	_ = ff[T]  // pathological but ok because T's type set is empty, too
 	_ = gg[int]
 	_ = gg[T]
diff --git a/src/internal/types/testdata/check/typeparams.go b/src/internal/types/testdata/check/typeparams.go
index 0e440d8..b002377 100644
--- a/src/internal/types/testdata/check/typeparams.go
+++ b/src/internal/types/testdata/check/typeparams.go
@@ -14,8 +14,8 @@
 func identity[T any](x T) T { return x }
 
 func _[_ any](x int) int { panic(0) }
-func _[T any](T /* ERROR redeclared */ T)() {}
-func _[T, T /* ERROR redeclared */ any]() {}
+func _[T any](T /* ERROR "redeclared" */ T)() {}
+func _[T, T /* ERROR "redeclared" */ any]() {}
 
 // Constraints (incl. any) may be parenthesized.
 func _[_ (any)]() {}
@@ -31,15 +31,15 @@
         return rlist
 }
 
-var _ = reverse /* ERROR cannot use generic function reverse */
-var _ = reverse[int, float32 /* ERROR got 2 type arguments */ ] ([]int{1, 2, 3})
-var _ = reverse[int]([ /* ERROR cannot use */ ]float32{1, 2, 3})
+var _ = reverse /* ERROR "cannot use generic function reverse" */
+var _ = reverse[int, float32 /* ERROR "got 2 type arguments" */ ] ([]int{1, 2, 3})
+var _ = reverse[int]([ /* ERROR "cannot use" */ ]float32{1, 2, 3})
 var f = reverse[chan int]
-var _ = f(0 /* ERROR cannot use 0 .* as \[\]chan int */ )
+var _ = f(0 /* ERRORx `cannot use 0 .* as \[\]chan int` */ )
 
 func swap[A, B any](a A, b B) (B, A) { return b, a }
 
-var _ = swap /* ERROR multiple-value */ [int, float32](1, 2)
+var _ = swap /* ERROR "multiple-value" */ [int, float32](1, 2)
 var f32, i = swap[int, float32](swap[float32, int](1, 2))
 var _ float32 = f32
 var _ int = i
@@ -58,10 +58,10 @@
 }
 
 func _[T interface{~int | ~float32}](x, y T) bool { return x < y }
-func _[T any](x, y T) bool { return x /* ERROR type parameter T is not comparable */ < y }
-func _[T interface{~int | ~float32 | ~bool}](x, y T) bool { return x /* ERROR type parameter T is not comparable */ < y }
+func _[T any](x, y T) bool { return x /* ERROR "type parameter T is not comparable" */ < y }
+func _[T interface{~int | ~float32 | ~bool}](x, y T) bool { return x /* ERROR "type parameter T is not comparable" */ < y }
 
-func _[T C1[T]](x, y T) bool { return x /* ERROR type parameter T is not comparable */ < y }
+func _[T C1[T]](x, y T) bool { return x /* ERROR "type parameter T is not comparable" */ < y }
 func _[T C2[T]](x, y T) bool { return x < y }
 
 type C1[T any] interface{}
@@ -72,16 +72,16 @@
         return &x
 }
 
-var _ = new /* ERROR cannot use generic function new */
+var _ = new /* ERROR "cannot use generic function new" */
 var _ *int = new[int]()
 
-func _[T any](map[T /* ERROR invalid map key type T \(missing comparable constraint\) */]int) {} // w/o constraint we don't know if T is comparable
+func _[T any](map[T /* ERROR "invalid map key type T (missing comparable constraint)" */]int) {} // w/o constraint we don't know if T is comparable
 
-func f1[T1 any](struct{T1 /* ERROR cannot be a .* type parameter */ }) int { panic(0) }
+func f1[T1 any](struct{T1 /* ERRORx `cannot be a .* type parameter` */ }) int { panic(0) }
 var _ = f1[int](struct{T1}{})
 type T1 = int
 
-func f2[t1 any](struct{t1 /* ERROR cannot be a .* type parameter */ ; x float32}) int { panic(0) }
+func f2[t1 any](struct{t1 /* ERRORx `cannot be a .* type parameter` */ ; x float32}) int { panic(0) }
 var _ = f2[t1](struct{t1; x float32}{})
 type t1 = int
 
@@ -96,29 +96,29 @@
 func _[T interface{ ~int }] (x T, i int) { _ = x /* ERROR "cannot index" */ [i] }
 func _[T interface{ ~string }] (x T, i int) { _ = x[i] }
 func _[T interface{ ~[]int }] (x T, i int) { _ = x[i] }
-func _[T interface{ ~[10]int | ~*[20]int | ~map[int]int }] (x T, i int) { _ = x /* ERROR cannot index */ [i] } // map and non-map types
+func _[T interface{ ~[10]int | ~*[20]int | ~map[int]int }] (x T, i int) { _ = x /* ERROR "cannot index" */ [i] } // map and non-map types
 func _[T interface{ ~string | ~[]byte }] (x T, i int) { _ = x[i] }
 func _[T interface{ ~[]int | ~[1]rune }] (x T, i int) { _ = x /* ERROR "cannot index" */ [i] }
 func _[T interface{ ~string | ~[]rune }] (x T, i int) { _ = x /* ERROR "cannot index" */ [i] }
 
 // indexing with various combinations of map types in type sets (see issue #42616)
-func _[T interface{ ~[]E | ~map[int]E }, E any](x T, i int) { _ = x /* ERROR cannot index */ [i] } // map and non-map types
+func _[T interface{ ~[]E | ~map[int]E }, E any](x T, i int) { _ = x /* ERROR "cannot index" */ [i] } // map and non-map types
 func _[T interface{ ~[]E }, E any](x T, i int) { _ = &x[i] }
 func _[T interface{ ~map[int]E }, E any](x T, i int) { _, _ = x[i] } // comma-ok permitted
-func _[T interface{ ~map[int]E }, E any](x T, i int) { _ = &x /* ERROR cannot take address */ [i] }
-func _[T interface{ ~map[int]E | ~map[uint]E }, E any](x T, i int) { _ = x /* ERROR cannot index */ [i] } // different map element types
-func _[T interface{ ~[]E | ~map[string]E }, E any](x T, i int) { _ = x /* ERROR cannot index */ [i] } // map and non-map types
+func _[T interface{ ~map[int]E }, E any](x T, i int) { _ = &x /* ERROR "cannot take address" */ [i] }
+func _[T interface{ ~map[int]E | ~map[uint]E }, E any](x T, i int) { _ = x /* ERROR "cannot index" */ [i] } // different map element types
+func _[T interface{ ~[]E | ~map[string]E }, E any](x T, i int) { _ = x /* ERROR "cannot index" */ [i] } // map and non-map types
 
 // indexing with various combinations of array and other types in type sets
-func _[T interface{ [10]int }](x T, i int) { _ = x[i]; _ = x[9]; _ = x[10 /* ERROR out of bounds */ ] }
-func _[T interface{ [10]byte | string }](x T, i int) { _ = x[i]; _ = x[9]; _ = x[10 /* ERROR out of bounds */ ] }
-func _[T interface{ [10]int | *[20]int | []int }](x T, i int) { _ = x[i]; _ = x[9]; _ = x[10 /* ERROR out of bounds */ ] }
+func _[T interface{ [10]int }](x T, i int) { _ = x[i]; _ = x[9]; _ = x[10 /* ERROR "out of bounds" */ ] }
+func _[T interface{ [10]byte | string }](x T, i int) { _ = x[i]; _ = x[9]; _ = x[10 /* ERROR "out of bounds" */ ] }
+func _[T interface{ [10]int | *[20]int | []int }](x T, i int) { _ = x[i]; _ = x[9]; _ = x[10 /* ERROR "out of bounds" */ ] }
 
 // indexing with strings and non-variable arrays (assignment not permitted)
-func _[T string](x T) { _ = x[0]; x /* ERROR cannot assign */ [0] = 0 }
-func _[T []byte | string](x T) { x /* ERROR cannot assign */ [0] = 0 }
-func _[T [10]byte]() { f := func() (x T) { return }; f /* ERROR cannot assign */ ()[0] = 0 }
-func _[T [10]byte]() { f := func() (x *T) { return }; f /* ERROR cannot index */ ()[0] = 0 }
+func _[T string](x T) { _ = x[0]; x /* ERROR "cannot assign" */ [0] = 0 }
+func _[T []byte | string](x T) { x /* ERROR "cannot assign" */ [0] = 0 }
+func _[T [10]byte]() { f := func() (x T) { return }; f /* ERROR "cannot assign" */ ()[0] = 0 }
+func _[T [10]byte]() { f := func() (x *T) { return }; f /* ERROR "cannot index" */ ()[0] = 0 }
 func _[T [10]byte]() { f := func() (x *T) { return }; (*f())[0] = 0 }
 func _[T *[10]byte]() { f := func() (x T) { return }; f()[0] = 0 }
 
@@ -129,22 +129,22 @@
 func _[T interface{ ~[]byte }] (x T, i, j, k int) { var _ T = x[i:j] }
 func _[T interface{ ~[]byte }] (x T, i, j, k int) { var _ T = x[i:j:k] }
 func _[T interface{ ~string }] (x T, i, j, k int) { var _ T = x[i:j] }
-func _[T interface{ ~string }] (x T, i, j, k int) { var _ T = x[i:j:k /* ERROR 3-index slice of string */ ] }
+func _[T interface{ ~string }] (x T, i, j, k int) { var _ T = x[i:j:k /* ERROR "3-index slice of string" */ ] }
 
 type myByte1 []byte
 type myByte2 []byte
 func _[T interface{ []byte | myByte1 | myByte2 }] (x T, i, j, k int) { var _ T = x[i:j:k] }
-func _[T interface{ []byte | myByte1 | []int }] (x T, i, j, k int) { var _ T = x /* ERROR no core type */ [i:j:k] }
+func _[T interface{ []byte | myByte1 | []int }] (x T, i, j, k int) { var _ T = x /* ERROR "no core type" */ [i:j:k] }
 
 func _[T interface{ []byte | myByte1 | myByte2 | string }] (x T, i, j, k int) { var _ T = x[i:j] }
-func _[T interface{ []byte | myByte1 | myByte2 | string }] (x T, i, j, k int) { var _ T = x[i:j:k /* ERROR 3-index slice of string */ ] }
-func _[T interface{ []byte | myByte1 | []int | string }] (x T, i, j, k int) { var _ T = x /* ERROR no core type */ [i:j] }
+func _[T interface{ []byte | myByte1 | myByte2 | string }] (x T, i, j, k int) { var _ T = x[i:j:k /* ERROR "3-index slice of string" */ ] }
+func _[T interface{ []byte | myByte1 | []int | string }] (x T, i, j, k int) { var _ T = x /* ERROR "no core type" */ [i:j] }
 
 // len/cap built-ins
 
-func _[T any](x T) { _ = len(x /* ERROR invalid argument */ ) }
-func _[T interface{ ~int }](x T) { _ = len(x /* ERROR invalid argument */ ) }
-func _[T interface{ ~string | ~[]byte | ~int }](x T) { _ = len(x /* ERROR invalid argument */ ) }
+func _[T any](x T) { _ = len(x /* ERROR "invalid argument" */ ) }
+func _[T interface{ ~int }](x T) { _ = len(x /* ERROR "invalid argument" */ ) }
+func _[T interface{ ~string | ~[]byte | ~int }](x T) { _ = len(x /* ERROR "invalid argument" */ ) }
 func _[T interface{ ~string }](x T) { _ = len(x) }
 func _[T interface{ ~[10]int }](x T) { _ = len(x) }
 func _[T interface{ ~[]byte }](x T) { _ = len(x) }
@@ -152,20 +152,20 @@
 func _[T interface{ ~chan int }](x T) { _ = len(x) }
 func _[T interface{ ~string | ~[]byte | ~chan int }](x T) { _ = len(x) }
 
-func _[T any](x T) { _ = cap(x /* ERROR invalid argument */ ) }
-func _[T interface{ ~int }](x T) { _ = cap(x /* ERROR invalid argument */ ) }
-func _[T interface{ ~string | ~[]byte | ~int }](x T) { _ = cap(x /* ERROR invalid argument */ ) }
-func _[T interface{ ~string }](x T) { _ = cap(x /* ERROR invalid argument */ ) }
+func _[T any](x T) { _ = cap(x /* ERROR "invalid argument" */ ) }
+func _[T interface{ ~int }](x T) { _ = cap(x /* ERROR "invalid argument" */ ) }
+func _[T interface{ ~string | ~[]byte | ~int }](x T) { _ = cap(x /* ERROR "invalid argument" */ ) }
+func _[T interface{ ~string }](x T) { _ = cap(x /* ERROR "invalid argument" */ ) }
 func _[T interface{ ~[10]int }](x T) { _ = cap(x) }
 func _[T interface{ ~[]byte }](x T) { _ = cap(x) }
-func _[T interface{ ~map[int]int }](x T) { _ = cap(x /* ERROR invalid argument */ ) }
+func _[T interface{ ~map[int]int }](x T) { _ = cap(x /* ERROR "invalid argument" */ ) }
 func _[T interface{ ~chan int }](x T) { _ = cap(x) }
 func _[T interface{ ~[]byte | ~chan int }](x T) { _ = cap(x) }
 
 // range iteration
 
 func _[T interface{}](x T) {
-        for range x /* ERROR cannot range */ {}
+        for range x /* ERROR "cannot range" */ {}
 }
 
 type myString string
@@ -206,18 +206,18 @@
         var c0 chan int
         for range c0 {}
         for _ = range c0 {}
-        for _, _ /* ERROR permits only one iteration variable */ = range c0 {}
+        for _, _ /* ERROR "permits only one iteration variable" */ = range c0 {}
 
         var c1 C1
         for range c1 {}
         for _ = range c1 {}
-        for _, _ /* ERROR permits only one iteration variable */ = range c1 {}
+        for _, _ /* ERROR "permits only one iteration variable" */ = range c1 {}
 
         var c2 C2
         for range c2 {}
 
         var c3 C3
-        for range c3 /* ERROR receive from send-only channel */ {}
+        for range c3 /* ERROR "receive from send-only channel" */ {}
 
         var s0 []int
         for range s0 {}
@@ -230,7 +230,7 @@
         for _, _ = range s1 {}
 
         var s2 S2
-        for range s2 /* ERROR cannot range over s2.*no core type */ {}
+        for range s2 /* ERRORx `cannot range over s2.*no core type` */ {}
 
         var a0 []int
         for range a0 {}
@@ -243,7 +243,7 @@
         for _, _ = range a1 {}
 
         var a2 A2
-        for range a2 /* ERROR cannot range over a2.*no core type */ {}
+        for range a2 /* ERRORx `cannot range over a2.*no core type` */ {}
 
         var p0 *[10]int
         for range p0 {}
@@ -256,7 +256,7 @@
         for _, _ = range p1 {}
 
         var p2 P2
-        for range p2 /* ERROR cannot range over p2.*no core type */ {}
+        for range p2 /* ERRORx `cannot range over p2.*no core type` */ {}
 
         var m0 map[string]int
         for range m0 {}
@@ -269,22 +269,22 @@
         for _, _ = range m1 {}
 
         var m2 M2
-        for range m2 /* ERROR cannot range over m2.*no core type */ {}
+        for range m2 /* ERRORx `cannot range over m2.*no core type` */ {}
 }
 
 // type inference checks
 
-var _ = new /* ERROR cannot infer T */ ()
+var _ = new /* ERROR "cannot infer T" */ ()
 
 func f4[A, B, C any](A, B) C { panic(0) }
 
-var _ = f4 /* ERROR cannot infer C */ (1, 2)
+var _ = f4 /* ERROR "cannot infer C" */ (1, 2)
 var _ = f4[int, float32, complex128](1, 2)
 
 func f5[A, B, C any](A, []*B, struct{f []C}) int { panic(0) }
 
 var _ = f5[int, float32, complex128](0, nil, struct{f []complex128}{})
-var _ = f5 /* ERROR cannot infer */ (0, nil, struct{f []complex128}{})
+var _ = f5 /* ERROR "cannot infer" */ (0, nil, struct{f []complex128}{})
 var _ = f5(0, []*float32{new[float32]()}, struct{f []complex128}{})
 
 func f6[A any](A, []A) int { panic(0) }
@@ -293,29 +293,29 @@
 
 func f6nil[A any](A) int { panic(0) }
 
-var _ = f6nil /* ERROR cannot infer */ (nil)
+var _ = f6nil /* ERROR "cannot infer" */ (nil)
 
 // type inference with variadic functions
 
 func f7[T any](...T) T { panic(0) }
 
-var _ int = f7 /* ERROR cannot infer T */ ()
+var _ int = f7 /* ERROR "cannot infer T" */ ()
 var _ int = f7(1)
 var _ int = f7(1, 2)
 var _ int = f7([]int{}...)
-var _ int = f7 /* ERROR cannot use */ ([]float64{}...)
+var _ int = f7 /* ERROR "cannot use" */ ([]float64{}...)
 var _ float64 = f7([]float64{}...)
 var _ = f7[float64](1, 2.3)
 var _ = f7(float64(1), 2.3)
-var _ = f7(1, 2.3 /* ERROR does not match */ )
-var _ = f7(1.2, 3 /* ERROR does not match */ )
+var _ = f7(1, 2.3)
+var _ = f7(1.2, 3)
 
 func f8[A, B any](A, B, ...B) int { panic(0) }
 
-var _ = f8(1) /* ERROR not enough arguments */
+var _ = f8(1) /* ERROR "not enough arguments" */
 var _ = f8(1, 2.3)
 var _ = f8(1, 2.3, 3.4, 4.5)
-var _ = f8(1, 2.3, 3.4, 4 /* ERROR does not match */ )
+var _ = f8(1, 2.3, 3.4, 4)
 var _ = f8[int, float64](1, 2.3, 3.4, 4)
 
 var _ = f8[int, float64](0, 0, nil...) // test case for #18268
@@ -323,14 +323,14 @@
 // init functions cannot have type parameters
 
 func init() {}
-func init[_ /* ERROR func init must have no type parameters */ any]() {}
-func init[P /* ERROR func init must have no type parameters */ any]() {}
+func init[_ /* ERROR "func init must have no type parameters" */ any]() {}
+func init[P /* ERROR "func init must have no type parameters" */ any]() {}
 
 type T struct {}
 
 func (T) m1() {}
-func (T) m2[ /* ERROR method must have no type parameters */ _ any]() {}
-func (T) m3[ /* ERROR method must have no type parameters */ P any]() {}
+func (T) m2[ /* ERROR "method must have no type parameters" */ _ any]() {}
+func (T) m3[ /* ERROR "method must have no type parameters" */ P any]() {}
 
 // type inference across parameterized types
 
@@ -354,7 +354,7 @@
 }
 
 // corner case for type inference
-// (was bug: after instanting f11, the type-checker didn't mark f11 as non-generic)
+// (was bug: after instantiating f11, the type-checker didn't mark f11 as non-generic)
 
 func f11[T any]() {}
 
@@ -454,17 +454,17 @@
 //         }
 //
 //         // type assertions and type switches over generic types are strict
-//         _ = p /* ERROR cannot have dynamic type I4 */.(I4)
+//         _ = p /* ERROR "cannot have dynamic type I4" */.(I4)
 //         switch p.(type) {
-//         case I4 /* ERROR cannot have dynamic type I4 */ :
+//         case I4 /* ERROR "cannot have dynamic type I4" */ :
 //         }
 // }
 
 // type assertions and type switches over generic types lead to errors for now
 
 func _[T any](x T) {
-	_ = x /* ERROR cannot use type assertion */ .(int)
-	switch x /* ERROR cannot use type switch */ .(type) {
+	_ = x /* ERROR "cannot use type assertion" */ .(int)
+	switch x /* ERROR "cannot use type switch" */ .(type) {
 	}
 
 	// work-around
@@ -475,8 +475,8 @@
 }
 
 func _[T interface{~int}](x T) {
-	_ = x /* ERROR cannot use type assertion */ .(int)
-	switch x /* ERROR cannot use type switch */ .(type) {
+	_ = x /* ERROR "cannot use type assertion" */ .(int)
+	switch x /* ERROR "cannot use type switch" */ .(type) {
 	}
 
 	// work-around
@@ -490,19 +490,19 @@
 type C[P any] interface{}
 
 func _[P C[P]] (x P) {
-	x.m /* ERROR x.m undefined */ ()
+	x.m /* ERROR "x.m undefined" */ ()
 }
 
 type I interface {}
 
 func _[P I] (x P) {
-	x.m /* ERROR type P has no field or method m */ ()
+	x.m /* ERROR "type P has no field or method m" */ ()
 }
 
 func _[P interface{}] (x P) {
-	x.m /* ERROR type P has no field or method m */ ()
+	x.m /* ERROR "type P has no field or method m" */ ()
 }
 
 func _[P any] (x P) {
-	x.m /* ERROR type P has no field or method m */ ()
+	x.m /* ERROR "type P has no field or method m" */ ()
 }
diff --git a/src/internal/types/testdata/check/unions.go b/src/internal/types/testdata/check/unions.go
index bcd7de6..5a3a9ed 100644
--- a/src/internal/types/testdata/check/unions.go
+++ b/src/internal/types/testdata/check/unions.go
@@ -54,13 +54,13 @@
 	t70|t71|t72|t73|t74|t75|t76|t77|t78|t79|
 	t80|t81|t82|t83|t84|t85|t86|t87|t88|t89|
 	t90|t91|t92|t93|t94|t95|t96|t97|t98|t99|
-        int // ERROR cannot handle more than 100 union terms
+        int // ERROR "cannot handle more than 100 union terms"
 }
 
 type u102 interface {
-        int /* ERROR cannot handle more than 100 union terms */ |string|u100a
+        int /* ERROR "cannot handle more than 100 union terms" */ |string|u100a
 }
 
 type u200 interface {
-        u100a /* ERROR cannot handle more than 100 union terms */ |u100b
+        u100a /* ERROR "cannot handle more than 100 union terms" */ |u100b
 }
diff --git a/src/internal/types/testdata/check/vardecl.go b/src/internal/types/testdata/check/vardecl.go
index 5b68adb..726b619 100644
--- a/src/internal/types/testdata/check/vardecl.go
+++ b/src/internal/types/testdata/check/vardecl.go
@@ -25,39 +25,39 @@
 // Identifier and expression arity must match.
 var _, _ = 1, 2
 var _ = 1, 2 /* ERROR "extra init expr 2" */
-var _, _ = 1 /* ERROR "assignment mismatch: [1-9]+ variables but.*[1-9]+ value(s)?" */
+var _, _ = 1 /* ERRORx `assignment mismatch: [1-9]+ variables but.*[1-9]+ value(s)?` */
 var _, _, _ /* ERROR "missing init expr for _" */ = 1, 2
 
 var _ = g /* ERROR "multiple-value g" */ ()
 var _, _ = g()
-var _, _, _ = g /* ERROR "assignment mismatch: [1-9]+ variables but.*[1-9]+ value(s)?" */ ()
+var _, _, _ = g /* ERRORx `assignment mismatch: [1-9]+ variables but.*[1-9]+ value(s)?` */ ()
 
 var _ = m["foo"]
 var _, _ = m["foo"]
-var _, _, _ = m  /* ERROR "assignment mismatch: [1-9]+ variables but.*[1-9]+ value(s)?" */ ["foo"]
+var _, _, _ = m  /* ERRORx `assignment mismatch: [1-9]+ variables but.*[1-9]+ value(s)?` */ ["foo"]
 
 var _, _ int = 1, 2
 var _ int = 1, 2 /* ERROR "extra init expr 2" */
-var _, _ int = 1 /* ERROR "assignment mismatch: [1-9]+ variables but.*[1-9]+ value(s)?" */
+var _, _ int = 1 /* ERRORx `assignment mismatch: [1-9]+ variables but.*[1-9]+ value(s)?` */
 var _, _, _ /* ERROR "missing init expr for _" */ int = 1, 2
 
 var (
 	_, _ = 1, 2
 	_ = 1, 2 /* ERROR "extra init expr 2" */
-	_, _ = 1 /* ERROR "assignment mismatch: [1-9]+ variables but.*[1-9]+ value(s)?" */
+	_, _ = 1 /* ERRORx `assignment mismatch: [1-9]+ variables but.*[1-9]+ value(s)?` */
 	_, _, _ /* ERROR "missing init expr for _" */ = 1, 2
 
 	_ = g /* ERROR "multiple-value g" */ ()
 	_, _ = g()
-	_, _, _ = g /* ERROR "assignment mismatch: [1-9]+ variables but.*[1-9]+ value(s)?" */ ()
+	_, _, _ = g /* ERRORx `assignment mismatch: [1-9]+ variables but.*[1-9]+ value(s)?` */ ()
 
 	_ = m["foo"]
 	_, _ = m["foo"]
-	_, _, _ = m /* ERROR "assignment mismatch: [1-9]+ variables but.*[1-9]+ value(s)?" */ ["foo"]
+	_, _, _ = m /* ERRORx `assignment mismatch: [1-9]+ variables but.*[1-9]+ value(s)?` */ ["foo"]
 
 	_, _ int = 1, 2
 	_ int = 1, 2 /* ERROR "extra init expr 2" */
-	_, _ int = 1 /* ERROR "assignment mismatch: [1-9]+ variables but.*[1-9]+ value(s)?" */
+	_, _ int = 1 /* ERRORx `assignment mismatch: [1-9]+ variables but.*[1-9]+ value(s)?` */
 	_, _, _ /* ERROR "missing init expr for _" */ int = 1, 2
 )
 
@@ -151,7 +151,7 @@
 // Unused variables in function literals must lead to only one error (issue #22524).
 func _() {
 	_ = func() {
-		var x /* ERROR declared and not used */ int
+		var x /* ERROR "declared and not used" */ int
 	}
 }
 
@@ -171,36 +171,36 @@
 func _() {
 	var a, b, c int
 	var x, y int
-	x, y = a /* ERROR "assignment mismatch: [1-9]+ variables but.*[1-9]+ value(s)?" */ , b, c
+	x, y = a /* ERRORx `assignment mismatch: [1-9]+ variables but.*[1-9]+ value(s)?` */ , b, c
 	_ = x
 	_ = y
 }
 
 func _() {
 	var x int
-	return x /* ERROR too many return values */
-	return math /* ERROR too many return values */ .Sin(0)
+	return x /* ERROR "too many return values" */
+	return math /* ERROR "too many return values" */ .Sin(0)
 }
 
 func _() int {
 	var x, y int
-	return x, y /* ERROR too many return values */
+	return x, y /* ERROR "too many return values" */
 }
 
 // Short variable declarations must declare at least one new non-blank variable.
 func _() {
-	_ := /* ERROR no new variables */ 0
+	_ := /* ERROR "no new variables" */ 0
 	_, a := 0, 1
-	_, a := /* ERROR no new variables */ 0, 1
+	_, a := /* ERROR "no new variables" */ 0, 1
 	_, a, b := 0, 1, 2
-	_, _, _ := /* ERROR no new variables */ 0, 1, 2
+	_, _, _ := /* ERROR "no new variables" */ 0, 1, 2
 
 	_ = a
 	_ = b
 }
 
 // Test case for variables depending on function literals (see also #22992).
-var A /* ERROR initialization cycle */ = func() int { return A }()
+var A /* ERROR "initialization cycle" */ = func() int { return A }()
 
 func _() {
 	// The function literal below must not see a.
diff --git a/src/internal/types/testdata/examples/constraints.go b/src/internal/types/testdata/examples/constraints.go
index 5b14489..4c97a40 100644
--- a/src/internal/types/testdata/examples/constraints.go
+++ b/src/internal/types/testdata/examples/constraints.go
@@ -17,10 +17,10 @@
 	union interface{int|~string}
 
 	// Union terms must describe disjoint (non-overlapping) type sets.
-	_ interface{int|int /* ERROR overlapping terms int */ }
-	_ interface{int|~ /* ERROR overlapping terms ~int */ int }
-	_ interface{~int|~ /* ERROR overlapping terms ~int */ int }
-	_ interface{~int|MyInt /* ERROR overlapping terms p.MyInt and ~int */ }
+	_ interface{int|int /* ERROR "overlapping terms int" */ }
+	_ interface{int|~ /* ERROR "overlapping terms ~int" */ int }
+	_ interface{~int|~ /* ERROR "overlapping terms ~int" */ int }
+	_ interface{~int|MyInt /* ERROR "overlapping terms p.MyInt and ~int" */ }
 	_ interface{int|any}
 	_ interface{int|~string|union}
 	_ interface{int|~string|interface{int}}
@@ -28,8 +28,8 @@
 	_ interface{union|union} // ditto
 
 	// For now we do not permit interfaces with methods in unions.
-	_ interface{~ /* ERROR invalid use of ~ */ any}
-	_ interface{int|interface /* ERROR cannot use .* in union */ { m() }}
+	_ interface{~ /* ERROR "invalid use of ~" */ any}
+	_ interface{int|interface /* ERRORx `cannot use .* in union` */ { m() }}
 )
 
 type (
@@ -37,17 +37,17 @@
 	foo int
 	bar any
 	_ interface{foo}
-	_ interface{~ /* ERROR invalid use of ~ */ foo }
-	_ interface{~ /* ERROR invalid use of ~ */ bar }
+	_ interface{~ /* ERROR "invalid use of ~" */ foo }
+	_ interface{~ /* ERROR "invalid use of ~" */ bar }
 )
 
 // Stand-alone type parameters are not permitted as elements or terms in unions.
 type (
 	_[T interface{ *T } ] struct{}        // ok
 	_[T interface{ int | *T } ] struct{}  // ok
-	_[T interface{ T /* ERROR term cannot be a type parameter */ } ] struct{}
-	_[T interface{ ~T /* ERROR type in term ~T cannot be a type parameter */ } ] struct{}
-	_[T interface{ int|T /* ERROR term cannot be a type parameter */ }] struct{}
+	_[T interface{ T /* ERROR "term cannot be a type parameter" */ } ] struct{}
+	_[T interface{ ~T /* ERROR "type in term ~T cannot be a type parameter" */ } ] struct{}
+	_[T interface{ int|T /* ERROR "term cannot be a type parameter" */ }] struct{}
 )
 
 // Multiple embedded union elements are intersected. The order in which they
@@ -61,8 +61,8 @@
 func _[T interface{ ~int; myInt1|myInt2 }]() T { return T(0) }
 
 // Here the intersections are empty - there's no type that's in the type set of T.
-func _[T interface{ myInt1|myInt2; int }]() T { return T(0 /* ERROR cannot convert */ ) }
-func _[T interface{ int; myInt1|myInt2 }]() T { return T(0 /* ERROR cannot convert */ ) }
+func _[T interface{ myInt1|myInt2; int }]() T { return T(0 /* ERROR "cannot convert" */ ) }
+func _[T interface{ int; myInt1|myInt2 }]() T { return T(0 /* ERROR "cannot convert" */ ) }
 
 // Union elements may be interfaces as long as they don't define
 // any methods or embed comparable.
@@ -75,6 +75,6 @@
 	Number interface{ Integer|Unsigned|Floats|Complex }
 	Ordered interface{ Integer|Unsigned|Floats|~string }
 
-	_ interface{ Number | error /* ERROR cannot use error in union */ }
-	_ interface{ Ordered | comparable /* ERROR cannot use comparable in union */ }
+	_ interface{ Number | error /* ERROR "cannot use error in union" */ }
+	_ interface{ Ordered | comparable /* ERROR "cannot use comparable in union" */ }
 )
diff --git a/src/internal/types/testdata/examples/functions.go b/src/internal/types/testdata/examples/functions.go
index 47e1c35..fdc67e7 100644
--- a/src/internal/types/testdata/examples/functions.go
+++ b/src/internal/types/testdata/examples/functions.go
@@ -68,7 +68,7 @@
 // for variadic functions.
 func variadic[A, B any](A, B, ...B) int { panic(0) }
 
-// var _ = variadic(1) // ERROR not enough arguments
+// var _ = variadic(1) // ERROR "not enough arguments"
 var _ = variadic(1, 2.3)
 var _ = variadic(1, 2.3, 3.4, 4.5)
 var _ = variadic[int, float64](1, 2.3, 3.4, 4)
@@ -128,15 +128,15 @@
 	var send chan<-int
 
 	fboth(both)
-	fboth(recv /* ERROR cannot use */ )
-	fboth(send /* ERROR cannot use */ )
+	fboth(recv /* ERROR "cannot use" */ )
+	fboth(send /* ERROR "cannot use" */ )
 
 	frecv(both)
 	frecv(recv)
-	frecv(send /* ERROR cannot use */ )
+	frecv(send /* ERROR "cannot use" */ )
 
 	fsend(both)
-	fsend(recv /* ERROR cannot use */)
+	fsend(recv /* ERROR "cannot use" */)
 	fsend(send)
 }
 
@@ -150,15 +150,15 @@
 	var send func(chan<- int)
 
 	ffboth(both)
-	ffboth(recv /* ERROR cannot use */ )
-	ffboth(send /* ERROR cannot use */ )
+	ffboth(recv /* ERROR "does not match" */ )
+	ffboth(send /* ERROR "does not match" */ )
 
-	ffrecv(both /* ERROR cannot use */ )
+	ffrecv(both /* ERROR "does not match" */ )
 	ffrecv(recv)
-	ffrecv(send /* ERROR cannot use */ )
+	ffrecv(send /* ERROR "does not match" */ )
 
-	ffsend(both /* ERROR cannot use */ )
-	ffsend(recv /* ERROR cannot use */ )
+	ffsend(both /* ERROR "does not match" */ )
+	ffsend(recv /* ERROR "does not match" */ )
 	ffsend(send)
 }
 
@@ -174,15 +174,15 @@
 func g3[T any](*T, ...T) {}
 
 func _() {
-	type intSlize []int
+	type intSlice []int
 	g1([]int{})
-	g1(intSlize{})
+	g1(intSlice{})
 	g2(nil, 0)
 
 	type myString string
 	var s1 string
 	g3(nil, "1", myString("2"), "3")
-	g3(& /* ERROR does not match */ s1, "1", myString("2"), "3")
+	g3(& /* ERROR "cannot use &s1 (value of type *string) as *myString value in argument to g3" */ s1, "1", myString("2"), "3")
 	_ = s1
 
 	type myStruct struct{x int}
@@ -208,12 +208,12 @@
 // (that would indicate a slice type). Thus, generic functions cannot
 // have empty type parameter lists, either. This is a syntax error.
 
-func h[] /* ERROR empty type parameter list */ () {}
+func h[] /* ERROR "empty type parameter list" */ () {}
 
 func _() {
-	h /* ERROR cannot index */ [] /* ERROR operand */ ()
+	h /* ERROR "cannot index" */ [] /* ERROR "operand" */ ()
 }
 
 // Generic functions must have a function body.
 
-func _ /* ERROR generic function is missing function body */ [P any]()
+func _ /* ERROR "generic function is missing function body" */ [P any]()
diff --git a/src/internal/types/testdata/examples/inference.go b/src/internal/types/testdata/examples/inference.go
index 073df9c..0aaaa82 100644
--- a/src/internal/types/testdata/examples/inference.go
+++ b/src/internal/types/testdata/examples/inference.go
@@ -1,3 +1,5 @@
+// -lang=go1.20
+
 // Copyright 2021 The Go Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
@@ -24,13 +26,13 @@
 	_ = min(x, 1)
 	_ = min(x, 1.0)
 	_ = min(1, 2)
-	_ = min(1, 2.3 /* ERROR default type float64 .* does not match */)
+	_ = min(1, 2.3)
 
 	var y float64
 	_ = min(1, y)
 	_ = min(1.2, y)
 	_ = min(1.2, 3.4)
-	_ = min(1.2, 3 /* ERROR default type int .* does not match */)
+	_ = min(1.2, 3)
 
 	var s string
 	_ = min(s, "foo")
@@ -51,7 +53,7 @@
 
 	// Provided type arguments always take precedence over
 	// inferred types.
-	mixed[int, string](1.1 /* ERROR cannot use 1.1 */, "", false)
+	mixed[int, string](1.1 /* ERROR "cannot use 1.1" */, "", false)
 }
 
 func related1[Slice interface{ ~[]Elem }, Elem any](s Slice, e Elem) {}
@@ -69,13 +71,13 @@
 
 	// A type argument inferred from another explicitly provided
 	// type argument overrides whatever value argument type is given.
-	related1[[]string](ss, 0 /* ERROR cannot use 0 */)
+	related1[[]string](ss, 0 /* ERROR "cannot use 0" */)
 
 	// A type argument may be inferred from a value argument
 	// and then help infer another type argument via constraint
 	// type inference.
 	related1(si, 0)
-	related1(si, "foo" /* ERROR cannot use "foo" */)
+	related1(si, "foo" /* ERROR `cannot use "foo"` */)
 }
 
 func related2[Elem any, Slice interface{ []Elem }](e Elem, s Slice) {}
@@ -97,7 +99,7 @@
 	// last.
 	related2(1.2, []float64{})
 	related2(1.0, []int{})
-	related2 /* ERROR does not satisfy */ (float64(1.0), []int{}) // TODO(gri) fix error position
+	related2 /* ERROR "Slice (type []int) does not satisfy interface{[]Elem}" */ (float64(1.0), []int{}) // TODO(gri) better error message
 }
 
 type List[P any] []P
@@ -112,5 +114,50 @@
 	// The 2nd type argument cannot be inferred from the first
 	// one because there's two possible choices: []Elem and
 	// List[Elem].
-	related3 /* ERROR cannot infer Slice */ [int]()
+	related3 /* ERROR "cannot infer Slice" */ [int]()
 }
+
+func wantsMethods[P interface {
+	m1(Q)
+	m2() R
+}, Q, R any](P) {
+}
+
+type hasMethods1 struct{}
+
+func (hasMethods1) m1(int)
+func (hasMethods1) m2() string
+
+type hasMethods2 struct{}
+
+func (*hasMethods2) m1(int)
+func (*hasMethods2) m2() string
+
+type hasMethods3 interface {
+	m1(float64)
+	m2() complex128
+}
+
+type hasMethods4 interface {
+	m1()
+}
+
+func _() {
+	// wantsMethod can be called with arguments that have the relevant methods
+	// and wantsMethod's type arguments are inferred from those types' method
+	// signatures.
+	wantsMethods(hasMethods1{})
+	wantsMethods(&hasMethods1{})
+	wantsMethods /* ERROR "P (type hasMethods2) does not satisfy interface{m1(Q); m2() R} (method m1 has pointer receiver)" */ (hasMethods2{})
+	wantsMethods(&hasMethods2{})
+	wantsMethods(hasMethods3(nil))
+	wantsMethods /* ERROR "P (type any) does not satisfy interface{m1(Q); m2() R} (missing method m1)" */ (any(nil))
+	wantsMethods /* ERROR "P (type hasMethods4) does not satisfy interface{m1(Q); m2() R} (wrong type for method m1)" */ (hasMethods4(nil))
+}
+
+// "Reverse" type inference is not yet permitted.
+
+func f[P any](P) {}
+
+// This must not crash.
+var _ func(int) = f // ERROR "implicitly instantiated function in assignment requires go1.21 or later"
diff --git a/src/internal/types/testdata/examples/inference2.go b/src/internal/types/testdata/examples/inference2.go
new file mode 100644
index 0000000..6097c2b
--- /dev/null
+++ b/src/internal/types/testdata/examples/inference2.go
@@ -0,0 +1,100 @@
+// Copyright 2023 The Go 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 shows some examples of "reverse" type inference
+// where the type arguments for generic functions are determined
+// from assigning the functions.
+
+package p
+
+func f1[P any](P)        {}
+func f2[P any]() P       { var x P; return x }
+func f3[P, Q any](P) Q   { var x Q; return x }
+func f4[P any](P, P)     {}
+func f5[P any](P) []P    { return nil }
+func f6[P any](int) P    { var x P; return x }
+func f7[P any](P) string { return "" }
+
+// initialization expressions
+var (
+	v1           = f1 // ERROR "cannot use generic function f1 without instantiation"
+	v2 func(int) = f2 // ERROR "cannot infer P"
+
+	v3 func(int)     = f1
+	v4 func() int    = f2
+	v5 func(int) int = f3
+	_  func(int) int = f3[int]
+
+	v6 func(int, int)     = f4
+	v7 func(int, string)  = f4 // ERROR "type func(int, string) of variable in assignment does not match inferred type func(int, int) for func(P, P)"
+	v8 func(int) []int    = f5
+	v9 func(string) []int = f5 // ERROR "type func(string) []int of variable in assignment does not match inferred type func(string) []string for func(P) []P"
+
+	_, _ func(int) = f1, f1
+	_, _ func(int) = f1, f2 // ERROR "cannot infer P"
+)
+
+// Regular assignments
+func _() {
+	v1 = f1 // no error here because v1 is invalid (we don't know its type) due to the error above
+	var v1_ func() int
+	_ = v1_
+	v1_ = f1 // ERROR "cannot infer P"
+	v2 = f2  // ERROR "cannot infer P"
+
+	v3 = f1
+	v4 = f2
+	v5 = f3
+	v5 = f3[int]
+
+	v6 = f4
+	v7 = f4 // ERROR "type func(int, string) of variable in assignment does not match inferred type func(int, int) for func(P, P)"
+	v8 = f5
+	v9 = f5 // ERROR "type func(string) []int of variable in assignment does not match inferred type func(string) []string for func(P) []P"
+}
+
+// Return statements
+func _() func(int)     { return f1 }
+func _() func() int    { return f2 }
+func _() func(int) int { return f3 }
+func _() func(int) int { return f3[int] }
+
+func _() func(int, int) { return f4 }
+func _() func(int, string) {
+	return f4 /* ERROR "type func(int, string) of variable in assignment does not match inferred type func(int, int) for func(P, P)" */
+}
+func _() func(int) []int { return f5 }
+func _() func(string) []int {
+	return f5 /* ERROR "type func(string) []int of variable in assignment does not match inferred type func(string) []string for func(P) []P" */
+}
+
+func _() (_, _ func(int)) { return f1, f1 }
+func _() (_, _ func(int)) { return f1, f2 /* ERROR "cannot infer P" */ }
+
+// Argument passing
+func g1(func(int))                           {}
+func g2(func(int, int))                      {}
+func g3(func(int) string)                    {}
+func g4[P any](func(P) string)               {}
+func g5[P, Q any](func(P) string, func(P) Q) {}
+func g6(func(int), func(string))             {}
+
+func _() {
+	g1(f1)
+	g1(f2 /* ERROR "cannot infer P" */)
+	g2(f4)
+	g4(f6)
+	g5(f6, f7)
+	g6(f1, f1)
+}
+
+// Argument passing of partially instantiated functions
+func h(func(int, string), func(string, int)) {}
+
+func p[P, Q any](P, Q) {}
+
+func _() {
+	h(p, p)
+	h(p[int], p[string])
+}
diff --git a/src/internal/types/testdata/examples/methods.go b/src/internal/types/testdata/examples/methods.go
index a46f789..e92dc50 100644
--- a/src/internal/types/testdata/examples/methods.go
+++ b/src/internal/types/testdata/examples/methods.go
@@ -28,7 +28,7 @@
 // It cannot possibly be some other type because the receiver type is not
 // instantiated with concrete types, it is standing for the parameterized
 // receiver type.
-func (t T1[[ /* ERROR must be an identifier */ ]int]) m2() {}
+func (t T1[[ /* ERROR "must be an identifier" */ ]int]) m2() {}
 
 // Note that using what looks like a predeclared identifier, say int,
 // as type parameter in this situation is deceptive and considered bad
@@ -39,7 +39,7 @@
 // and usually should be avoided. There are some notable exceptions; e.g.,
 // sometimes it makes sense to use the identifier "copy" which happens to
 // also be the name of a predeclared built-in function.
-func (t T1[int]) m3() { var _ int = 42 /* ERROR cannot use 42 .* as int */ }
+func (t T1[int]) m3() { var _ int = 42 /* ERRORx `cannot use 42 .* as int` */ }
 
 // The names of the type parameters used in a parameterized receiver
 // type don't have to match the type parameter names in the declaration
@@ -58,7 +58,7 @@
 // simply that such receiver type expressions perform two tasks simultaneously:
 // they declare the (local) type parameters and then use them to instantiate
 // the receiver type. Forgetting to provide a type parameter leads to an error.
-func (t T1 /* ERROR generic type .* without instantiation */ ) m5() {}
+func (t T1 /* ERRORx `generic type .* without instantiation` */ ) m5() {}
 
 // However, sometimes we don't need the type parameter, and thus it is
 // inconvenient to have to choose a name. Since the receiver type expression
@@ -105,8 +105,8 @@
 // 
 // type T3b[P interface{ ~unsafe.Pointer }] P
 // 
-// func (T3b /* ERROR invalid receiver */ [_]) m() {}
+// func (T3b /* ERROR "invalid receiver" */ [_]) m() {}
 // 
 // type T3c[P interface{ *int | *string }] P
 // 
-// func (T3c /* ERROR invalid receiver */ [_]) m() {}
+// func (T3c /* ERROR "invalid receiver" */ [_]) m() {}
diff --git a/src/internal/types/testdata/examples/operations.go b/src/internal/types/testdata/examples/operations.go
index 18e4d60..9fb95d0 100644
--- a/src/internal/types/testdata/examples/operations.go
+++ b/src/internal/types/testdata/examples/operations.go
@@ -7,11 +7,11 @@
 // indirection
 
 func _[P any](p P) {
-        _ = *p // ERROR cannot indirect p
+        _ = *p // ERROR "cannot indirect p"
 }
 
 func _[P interface{ int }](p P) {
-        _ = *p // ERROR cannot indirect p
+        _ = *p // ERROR "cannot indirect p"
 }
 
 func _[P interface{ *int }](p P) {
@@ -19,7 +19,7 @@
 }
 
 func _[P interface{ *int | *string }](p P) {
-        _ = *p // ERROR must have identical base types
+        _ = *p // ERROR "must have identical base types"
 }
 
 type intPtr *int
diff --git a/src/internal/types/testdata/examples/types.go b/src/internal/types/testdata/examples/types.go
index 052d168..67f1534 100644
--- a/src/internal/types/testdata/examples/types.go
+++ b/src/internal/types/testdata/examples/types.go
@@ -53,7 +53,7 @@
 func _() {
 	// This assignment is invalid because the types of x1, x2 are T1(...)
 	// and T2(...) respectively, which are two different defined types.
-	x1 = x2 // ERROR assignment
+	x1 = x2 // ERROR "assignment"
 
 	// This assignment is valid because the types of x1.f and x2.f are
 	// both struct { g int }; the type parameters act like type aliases
@@ -78,7 +78,7 @@
 var x2a T2a
 
 func _() {
-	x1a = x2a // ERROR assignment
+	x1a = x2a // ERROR "assignment"
 	x1a.f = x2a.f
 }
 
@@ -97,16 +97,16 @@
 // differently depending on the type arguments, and thus we can't possibly
 // consider such types identical. Consequently:
 func _() {
-	xint = xbool // ERROR assignment
+	xint = xbool // ERROR "assignment"
 }
 
 // Generic types cannot be used without instantiation.
-var _ T // ERROR cannot use generic type T
-var _ = T /* ERROR cannot use generic type T */ (0)
+var _ T // ERROR "cannot use generic type T"
+var _ = T /* ERROR "cannot use generic type T" */ (0)
 
 // In type context, generic (parameterized) types cannot be parenthesized before
 // being instantiated. See also NOTES entry from 12/4/2019.
-var _ (T /* ERROR cannot use generic type T */ )[ /* ERROR unexpected \[|expected ';' */ int]
+var _ (T /* ERROR "cannot use generic type T" */ )[ /* ERRORx `unexpected \[|expected ';'` */ int]
 
 // All types may be parameterized, including interfaces.
 type I1[T any] interface{
@@ -114,7 +114,7 @@
 }
 
 // There is no such thing as a variadic generic type.
-type _[T ... /* ERROR invalid use of ... */ any] struct{}
+type _[T ... /* ERROR "invalid use of '...'" */ any] struct{}
 
 // Generic interfaces may be embedded as one would expect.
 type I2 interface {
@@ -146,14 +146,14 @@
 }
 
 type _ struct {
-	( /* ERROR cannot parenthesize */ int8)
-	( /* ERROR cannot parenthesize */ *int16)
-	*( /* ERROR cannot parenthesize */ int32)
+	( /* ERROR "cannot parenthesize" */ int8)
+	( /* ERROR "cannot parenthesize" */ *int16)
+	*( /* ERROR "cannot parenthesize" */ int32)
 	List[int]
 
-	int8 /* ERROR int8 redeclared */
-	* /* ERROR int16 redeclared */ int16
-	List /* ERROR List redeclared */ [int]
+	int8 /* ERROR "int8 redeclared" */
+	*int16 /* ERROR "int16 redeclared" */
+	List /* ERROR "List redeclared" */ [int]
 }
 
 // Issue #45639: We don't allow this anymore. Keep this code
@@ -166,17 +166,17 @@
 // func _[T interface{ m(); ~int }]() {
 // 	type L T
 // 	var x L
-// 
+//
 // 	// m is not defined on L (it is not "inherited" from
 // 	// its underlying type).
-// 	x.m /* ERROR x.m undefined */ ()
-// 
+// 	x.m /* ERROR "x.m undefined" */ ()
+//
 // 	// But the properties of T, such that as that it supports
 // 	// the operations of the types given by its type bound,
 // 	// are also the properties of L.
 // 	x++
 // 	_ = x - x
-// 
+//
 // 	// On the other hand, if we define a local alias for T,
 // 	// that alias stands for T as expected.
 // 	type A = T
@@ -189,8 +189,8 @@
 // // It is not permitted to declare a local type whose underlying
 // // type is a type parameter not declared by that type declaration.
 // func _[T any]() {
-// 	type _ T         // ERROR cannot use function type parameter T as RHS in type declaration
-// 	type _ [_ any] T // ERROR cannot use function type parameter T as RHS in type declaration
+// 	type _ T         // ERROR "cannot use function type parameter T as RHS in type declaration"
+// 	type _ [_ any] T // ERROR "cannot use function type parameter T as RHS in type declaration"
 // }
 
 // As a special case, an explicit type argument may be omitted
@@ -220,11 +220,11 @@
 
 func _[T1 B0]() {}
 func _[T1 B1[T1]]() {}
-func _[T1 B2 /* ERROR cannot use generic type .* without instantiation */ ]() {}
+func _[T1 B2 /* ERRORx `cannot use generic type .* without instantiation` */ ]() {}
 
 func _[T1, T2 B0]() {}
 func _[T1 B1[T1], T2 B1[T2]]() {}
-func _[T1, T2 B2 /* ERROR cannot use generic type .* without instantiation */ ]() {}
+func _[T1, T2 B2 /* ERRORx `cannot use generic type .* without instantiation` */ ]() {}
 
 func _[T1 B0, T2 B1[T2]]() {} // here B1 applies to T2
 
@@ -248,30 +248,30 @@
 }
 
 var (
-	_ interface /* ERROR contains type constraints */ {~int}
-	_ I /* ERROR contains type constraints */
+	_ interface /* ERROR "contains type constraints" */ {~int}
+	_ I /* ERROR "contains type constraints" */
 )
 
-func _(I /* ERROR contains type constraints */ )
-func _(x, y, z I /* ERROR contains type constraints */ )
-func _() I /* ERROR contains type constraints */
+func _(I /* ERROR "contains type constraints" */ )
+func _(x, y, z I /* ERROR "contains type constraints" */ )
+func _() I /* ERROR "contains type constraints" */
 
 func _() {
-	var _ I /* ERROR contains type constraints */
+	var _ I /* ERROR "contains type constraints" */
 }
 
 type C interface {
 	comparable
 }
 
-var _ comparable /* ERROR comparable */
-var _ C /* ERROR comparable */
+var _ comparable /* ERROR "comparable" */
+var _ C /* ERROR "comparable" */
 
-func _(_ comparable /* ERROR comparable */ , _ C /* ERROR comparable */ )
+func _(_ comparable /* ERROR "comparable" */ , _ C /* ERROR "comparable" */ )
 
 func _() {
-	var _ comparable /* ERROR comparable */
-	var _ C /* ERROR comparable */
+	var _ comparable /* ERROR "comparable" */
+	var _ C /* ERROR "comparable" */
 }
 
 // Type parameters are never const types, i.e., it's
@@ -281,8 +281,8 @@
 // first place.)
 func _[T interface{~int|~float64}]() {
 	// not valid
-	const _ = T /* ERROR not constant */ (0)
-	const _ T /* ERROR invalid constant type T */ = 1
+	const _ = T /* ERROR "not constant" */ (0)
+	const _ T /* ERROR "invalid constant type T" */ = 1
 
 	// valid
 	var _ = T(0)
diff --git a/src/internal/types/testdata/examples/typesets.go b/src/internal/types/testdata/examples/typesets.go
index a50beb9..93eada7 100644
--- a/src/internal/types/testdata/examples/typesets.go
+++ b/src/internal/types/testdata/examples/typesets.go
@@ -45,15 +45,15 @@
 
 // A type parameter may not be embedded in an interface;
 // so it can also not be used as a constraint.
-func _[A any, B A /* ERROR cannot use a type parameter as constraint */]()    {}
-func _[A any, B, C A /* ERROR cannot use a type parameter as constraint */]() {}
+func _[A any, B A /* ERROR "cannot use a type parameter as constraint" */]()    {}
+func _[A any, B, C A /* ERROR "cannot use a type parameter as constraint" */]() {}
 
 // Error messages refer to the type constraint as it appears in the source.
 // (No implicit interface should be exposed.)
 func _[T string](x T) T {
-	return x /* ERROR constrained by string */ * x
+	return x /* ERROR "constrained by string" */ * x
 }
 
 func _[T int | string](x T) T {
-	return x /* ERROR constrained by int|string */ * x
+	return x /* ERROR "constrained by int | string" */ * x
 }
diff --git a/src/internal/types/testdata/fixedbugs/54942.go b/src/internal/types/testdata/fixedbugs/54942.go
deleted file mode 100644
index f2e733b..0000000
--- a/src/internal/types/testdata/fixedbugs/54942.go
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2022 The Go Authors. 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 (
-	"context"
-	"database/sql"
-)
-
-type I interface {
-	m(int, int, *int, int)
-}
-
-type T struct{}
-
-func (_ *T) m(a, b, c, d int) {}
-
-var _ I = new /* ERROR have m\(int, int, int, int\)\n\t\twant m\(int, int, \*int, int\) */ (T)
-
-// (slightly modified) test case from issue
-
-type Result struct {
-	Value string
-}
-
-type Executor interface {
-	Execute(context.Context, sql.Stmt, int, []sql.NamedArg, int) (Result, error)
-}
-
-type myExecutor struct{}
-
-func (_ *myExecutor) Execute(ctx context.Context, stmt sql.Stmt, maxrows int, args []sql.NamedArg, urgency int) (*Result, error) {
-	return &Result{}, nil
-}
-
-var ex Executor = new /* ERROR have Execute\(context\.Context, sql\.Stmt, int, \[\]sql\.NamedArg, int\) \(\*Result, error\)\n\t\twant Execute\(context\.Context, sql\.Stmt, int, \[\]sql\.NamedArg, int\) \(Result, error\) */ (myExecutor)
diff --git a/src/internal/types/testdata/fixedbugs/issue20583.go b/src/internal/types/testdata/fixedbugs/issue20583.go
index d26dbad..55cbd94 100644
--- a/src/internal/types/testdata/fixedbugs/issue20583.go
+++ b/src/internal/types/testdata/fixedbugs/issue20583.go
@@ -5,10 +5,10 @@
 package issue20583
 
 const (
-	_ = 6e886451608 /* ERROR malformed constant */ /2
-	_ = 6e886451608i /* ERROR malformed constant */ /2
-	_ = 0 * 1e+1000000000 // ERROR malformed constant
+	_ = 6e886451608 /* ERROR "malformed constant" */ /2
+	_ = 6e886451608i /* ERROR "malformed constant" */ /2
+	_ = 0 * 1e+1000000000 // ERROR "malformed constant"
 
 	x = 1e100000000
-	_ = x*x*x*x*x*x* /* ERROR not representable */ x
+	_ = x*x*x*x*x*x* /* ERROR "not representable" */ x
 )
diff --git a/src/internal/types/testdata/fixedbugs/issue28251.go b/src/internal/types/testdata/fixedbugs/issue28251.go
index ef5e61d..77fd369 100644
--- a/src/internal/types/testdata/fixedbugs/issue28251.go
+++ b/src/internal/types/testdata/fixedbugs/issue28251.go
@@ -60,6 +60,6 @@
         T11 = T
 )
 
-func (T9 /* ERROR invalid receiver type \*\*T */ ) m9() {}
-func _() { (T{}).m9 /* ERROR has no field or method m9 */ () }
-func _() { (&T{}).m9 /* ERROR has no field or method m9 */ () }
+func (T9 /* ERROR "invalid receiver type **T" */ ) m9() {}
+func _() { (T{}).m9 /* ERROR "has no field or method m9" */ () }
+func _() { (&T{}).m9 /* ERROR "has no field or method m9" */ () }
diff --git a/src/internal/types/testdata/fixedbugs/issue3117.go b/src/internal/types/testdata/fixedbugs/issue3117.go
new file mode 100644
index 0000000..16c0afc
--- /dev/null
+++ b/src/internal/types/testdata/fixedbugs/issue3117.go
@@ -0,0 +1,13 @@
+// Copyright 2023 The Go Authors. 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 S struct {
+	a [1]int
+}
+
+func _(m map[int]S, key int) {
+	m /* ERROR "cannot assign to m[key].a[0] (neither addressable nor a map index expression)" */ [key].a[0] = 0
+}
diff --git a/src/internal/types/testdata/fixedbugs/issue39634.go b/src/internal/types/testdata/fixedbugs/issue39634.go
index 6ee1548..591b00e 100644
--- a/src/internal/types/testdata/fixedbugs/issue39634.go
+++ b/src/internal/types/testdata/fixedbugs/issue39634.go
@@ -9,21 +9,21 @@
 package p
 
 // crash 1
-type nt1[_ any]interface{g /* ERROR undefined */ }
-type ph1[e nt1[e],g(d /* ERROR undefined */ )]s /* ERROR undefined */
-func(*ph1[e,e /* ERROR redeclared */ ])h(d /* ERROR undefined */ )
+type nt1[_ any]interface{g /* ERROR "undefined" */ }
+type ph1[e nt1[e],g(d /* ERROR "undefined" */ )]s /* ERROR "undefined" */
+func(*ph1[e,e /* ERROR "redeclared" */ ])h(d /* ERROR "undefined" */ )
 
 // crash 2
 // Disabled: empty []'s are now syntax errors. This example leads to too many follow-on errors.
-// type Numeric2 interface{t2 /* ERROR not a type */ }
-// func t2[T Numeric2](s[]T){0 /* ERROR not a type */ []{s /* ERROR cannot index */ [0][0]}}
+// type Numeric2 interface{t2 /* ERROR "not a type" */ }
+// func t2[T Numeric2](s[]T){0 /* ERROR "not a type */ []{s /* ERROR cannot index" */ [0][0]}}
 
 // crash 3
-type t3 *interface{ t3.p /* ERROR t3.p is not a type */ }
+type t3 *interface{ t3.p /* ERROR "t3.p is not a type" */ }
 
 // crash 4
-type Numeric4 interface{t4 /* ERROR not a type */ }
-func t4[T Numeric4](s[]T){if( /* ERROR non-boolean */ 0){*s /* ERROR cannot indirect */ [0]}}
+type Numeric4 interface{t4 /* ERROR "not a type" */ }
+func t4[T Numeric4](s[]T){if( /* ERROR "non-boolean" */ 0){*s /* ERROR "cannot indirect" */ [0]}}
 
 // crash 7
 type foo7 interface { bar() }
@@ -31,60 +31,60 @@
 func main7() { var _ foo7 = x7[int]{} }
 
 // crash 8
-type foo8[A any] interface { ~A /* ERROR cannot be a type parameter */ }
+type foo8[A any] interface { ~A /* ERROR "cannot be a type parameter" */ }
 func bar8[A foo8[A]](a A) {}
 
 // crash 9
-type foo9[A any] interface { foo9 /* ERROR invalid recursive type */ [A] }
+type foo9[A any] interface { foo9 /* ERROR "invalid recursive type" */ [A] }
 func _() { var _ = new(foo9[int]) }
 
 // crash 12
-var u /* ERROR cycle */ , i [func /* ERROR used as value */ /* ERROR used as value */ (u, c /* ERROR undefined */ /* ERROR undefined */ ) {}(0, len /* ERROR must be called */ /* ERROR must be called */ )]c /* ERROR undefined */ /* ERROR undefined */
+var u /* ERROR "cycle" */ , i [func /* ERROR "used as value" */ /* ERROR "used as value" */ (u, c /* ERROR "undefined" */ /* ERROR "undefined" */ ) {}(0, len /* ERROR "must be called" */ /* ERROR "must be called" */ )]c /* ERROR "undefined" */ /* ERROR "undefined" */
 
 // crash 15
-func y15() { var a /* ERROR declared and not used */ interface{ p() } = G15[string]{} }
-type G15[X any] s /* ERROR undefined */
-func (G15 /* ERROR generic type .* without instantiation */ ) p()
+func y15() { var a /* ERROR "declared and not used" */ interface{ p() } = G15[string]{} }
+type G15[X any] s /* ERROR "undefined" */
+func (G15 /* ERRORx `generic type .* without instantiation` */ ) p()
 
 // crash 16
-type Foo16[T any] r16 /* ERROR not a type */
+type Foo16[T any] r16 /* ERROR "not a type" */
 func r16[T any]() Foo16[Foo16[T]] { panic(0) }
 
 // crash 17
 type Y17 interface{ c() }
 type Z17 interface {
 	c() Y17
-	Y17 /* ERROR duplicate method */
+	Y17 /* ERROR "duplicate method" */
 }
 func F17[T Z17](T) {}
 
 // crash 18
-type o18[T any] []func(_ o18[[]_ /* ERROR cannot use _ */ ])
+type o18[T any] []func(_ o18[[]_ /* ERROR "cannot use _" */ ])
 
 // crash 19
-type Z19 [][[]Z19{}[0][0]]c19 /* ERROR undefined */
+type Z19 [][[]Z19{}[0][0]]c19 /* ERROR "undefined" */
 
 // crash 20
-type Z20 /* ERROR invalid recursive type */ interface{ Z20 }
-func F20[t Z20]() { F20(t /* ERROR invalid composite literal type */ {}) }
+type Z20 /* ERROR "invalid recursive type" */ interface{ Z20 }
+func F20[t Z20]() { F20(t /* ERROR "invalid composite literal type" */ /* ERROR "too many arguments in call to F20\n\thave (unknown type)\n\twant ()" */ {}) }
 
 // crash 21
-type Z21 /* ERROR invalid recursive type */ interface{ Z21 }
-func F21[T Z21]() { ( /* ERROR not used */ F21[Z21]) }
+type Z21 /* ERROR "invalid recursive type" */ interface{ Z21 }
+func F21[T Z21]() { ( /* ERROR "not used" */ F21[Z21]) }
 
 // crash 24
-type T24[P any] P // ERROR cannot use a type parameter as RHS in type declaration
-func (r T24[P]) m() { T24 /* ERROR without instantiation */ .m() }
+type T24[P any] P // ERROR "cannot use a type parameter as RHS in type declaration"
+func (r T24[P]) m() { T24 /* ERROR "without instantiation" */ .m() }
 
 // crash 25
 type T25[A any] int
 func (t T25[A]) m1() {}
-var x T25 /* ERROR without instantiation */ .m1
+var x T25 /* ERROR "without instantiation" */ .m1
 
 // crash 26
-type T26 = interface{ F26[ /* ERROR interface method must have no type parameters */ Z any]() }
-func F26[Z any]() T26 { return F26[] /* ERROR operand */ }
+type T26 = interface{ F26[ /* ERROR "interface method must have no type parameters" */ Z any]() }
+func F26[Z any]() T26 { return F26[] /* ERROR "operand" */ }
 
 // crash 27
-func e27[T any]() interface{ x27 /* ERROR not a type */ } { panic(0) }
-func x27() { e27 /* ERROR cannot infer T */ () }
+func e27[T any]() interface{ x27 /* ERROR "not a type" */ } { panic(0) }
+func x27() { e27 /* ERROR "cannot infer T" */ () }
diff --git a/src/internal/types/testdata/fixedbugs/issue39664.go b/src/internal/types/testdata/fixedbugs/issue39664.go
index 3b3ec56..a8148c6 100644
--- a/src/internal/types/testdata/fixedbugs/issue39664.go
+++ b/src/internal/types/testdata/fixedbugs/issue39664.go
@@ -6,7 +6,7 @@
 
 type T[_ any] struct {}
 
-func (T /* ERROR instantiation */ ) m()
+func (T /* ERROR "instantiation" */ ) m()
 
 func _() {
 	var x interface { m() }
diff --git a/src/internal/types/testdata/fixedbugs/issue39693.go b/src/internal/types/testdata/fixedbugs/issue39693.go
index 496754d..03f2789 100644
--- a/src/internal/types/testdata/fixedbugs/issue39693.go
+++ b/src/internal/types/testdata/fixedbugs/issue39693.go
@@ -11,7 +11,7 @@
 }
 
 func Add1[T Number1](a, b T) T {
-	return a /* ERROR not defined */ + b
+	return a /* ERROR "not defined" */ + b
 }
 
 type Number2 interface {
diff --git a/src/internal/types/testdata/fixedbugs/issue39699.go b/src/internal/types/testdata/fixedbugs/issue39699.go
index 72f8399..73ba0c4 100644
--- a/src/internal/types/testdata/fixedbugs/issue39699.go
+++ b/src/internal/types/testdata/fixedbugs/issue39699.go
@@ -23,7 +23,7 @@
 
 func _() {
 	_ = T0(0)
-	_ = T1 /* ERROR cannot use interface T1 in conversion */ (1)
-	_ = T2 /* ERROR cannot use interface T2 in conversion */ (2)
-	_ = T3 /* ERROR cannot use interface T3 in conversion */ (3)
+	_ = T1 /* ERROR "cannot use interface T1 in conversion" */ (1)
+	_ = T2 /* ERROR "cannot use interface T2 in conversion" */ (2)
+	_ = T3 /* ERROR "cannot use interface T3 in conversion" */ (3)
 }
diff --git a/src/internal/types/testdata/fixedbugs/issue39723.go b/src/internal/types/testdata/fixedbugs/issue39723.go
index 0088523..19e5e80 100644
--- a/src/internal/types/testdata/fixedbugs/issue39723.go
+++ b/src/internal/types/testdata/fixedbugs/issue39723.go
@@ -6,4 +6,4 @@
 
 // A constraint must be an interface; it cannot
 // be a type parameter, for instance.
-func _[A interface{ ~int }, B A /* ERROR cannot use a type parameter as constraint */ ]() {}
+func _[A interface{ ~int }, B A /* ERROR "cannot use a type parameter as constraint" */ ]() {}
diff --git a/src/internal/types/testdata/fixedbugs/issue39725.go b/src/internal/types/testdata/fixedbugs/issue39725.go
index 62dc45a..0145667 100644
--- a/src/internal/types/testdata/fixedbugs/issue39725.go
+++ b/src/internal/types/testdata/fixedbugs/issue39725.go
@@ -6,11 +6,11 @@
 
 func f1[T1, T2 any](T1, T2, struct{a T1; b T2}) {}
 func _() {
-	f1(42, string("foo"), struct /* ERROR does not match inferred type struct\{a int; b string\} */ {a, b int}{})
+	f1(42, string("foo"), struct /* ERROR "does not match inferred type struct{a int; b string}" */ {a, b int}{})
 }
 
 // simplified test case from issue
 func f2[T any](_ []T, _ func(T)) {}
 func _() {
-	f2([]string{}, func /* ERROR does not match inferred type func\(string\) */ (f []byte) {})
+	f2([]string{}, func /* ERROR "does not match inferred type func(string)" */ (f []byte) {})
 }
diff --git a/src/internal/types/testdata/fixedbugs/issue39754.go b/src/internal/types/testdata/fixedbugs/issue39754.go
index 97365e2..a1bd5ba 100644
--- a/src/internal/types/testdata/fixedbugs/issue39754.go
+++ b/src/internal/types/testdata/fixedbugs/issue39754.go
@@ -16,6 +16,6 @@
 

 func _() {

 	f[int, Optional[int], Optional[int]]()

-	_ = f[int, Optional[int], Optional /* ERROR does not satisfy Box */ [string]]

-	_ = f[int, Optional[int], Optional /* ERROR Optional.* does not satisfy Box.* */ [string]]

+	_ = f[int, Optional[int], Optional /* ERROR "does not satisfy Box" */ [string]]

+	_ = f[int, Optional[int], Optional /* ERRORx "Optional.* does not satisfy Box.*" */ [string]]

 }

diff --git a/src/internal/types/testdata/fixedbugs/issue39768.go b/src/internal/types/testdata/fixedbugs/issue39768.go
index 696d9d9..51a4177 100644
--- a/src/internal/types/testdata/fixedbugs/issue39768.go
+++ b/src/internal/types/testdata/fixedbugs/issue39768.go
@@ -6,16 +6,16 @@
 
 // For now, a lone type parameter is not permitted as RHS in a type declaration (issue #45639).
 // type T[P any] P
-// type A = T  // ERROR cannot use generic type
+// type A = T  // ERROR "cannot use generic type"
 // var x A[int]
 // var _ A
 //
 // type B = T[int]
 // var y B = x
-// var _ B /* ERROR not a generic type */ [int]
+// var _ B /* ERROR "not a generic type" */ [int]
 
 // test case from issue
 
 type Vector[T any] []T
-type VectorAlias = Vector // ERROR cannot use generic type
+type VectorAlias = Vector // ERROR "cannot use generic type"
 var v Vector[int]
diff --git a/src/internal/types/testdata/fixedbugs/issue39938.go b/src/internal/types/testdata/fixedbugs/issue39938.go
index 633698d..bd5bdca 100644
--- a/src/internal/types/testdata/fixedbugs/issue39938.go
+++ b/src/internal/types/testdata/fixedbugs/issue39938.go
@@ -23,7 +23,7 @@
         _ E1[T1]
 }
 
-type T2 /* ERROR invalid recursive type */ struct {
+type T2 /* ERROR "invalid recursive type" */ struct {
         _ E2[T2]
 }
 
@@ -31,7 +31,7 @@
         _ E3[T3]
 }
 
-type T4 /* ERROR invalid recursive type */ [10]E5[T4]
+type T4 /* ERROR "invalid recursive type" */ [10]E5[T4]
 
 type T5 struct {
 	_ E0[E2[T5]]
@@ -49,6 +49,6 @@
 	_ E0[[]E2[E0[E2[E2[T8]]]]]
 }
 
-type T9 /* ERROR invalid recursive type */ [10]E2[E5[E2[T9]]]
+type T9 /* ERROR "invalid recursive type" */ [10]E2[E5[E2[T9]]]
 
 type T10 [10]E2[E5[E2[func(T10)]]]
diff --git a/src/internal/types/testdata/fixedbugs/issue39948.go b/src/internal/types/testdata/fixedbugs/issue39948.go
index c893cc0..e4430cf 100644
--- a/src/internal/types/testdata/fixedbugs/issue39948.go
+++ b/src/internal/types/testdata/fixedbugs/issue39948.go
@@ -5,5 +5,5 @@
 package p
 
 type T[P any] interface{
-	P // ERROR term cannot be a type parameter
+	P // ERROR "term cannot be a type parameter"
 }
diff --git a/src/internal/types/testdata/fixedbugs/issue39976.go b/src/internal/types/testdata/fixedbugs/issue39976.go
index d703da9..b622cd9 100644
--- a/src/internal/types/testdata/fixedbugs/issue39976.go
+++ b/src/internal/types/testdata/fixedbugs/issue39976.go
@@ -12,5 +12,5 @@
 func _() {
 	var lru LRU[int, string]
 	NewCache[int, string](&lru)
-	NewCache(& /* ERROR does not match policy\[K, V\] \(cannot infer K and V\) */ lru)
+	NewCache /* ERROR "cannot infer K" */ (&lru)
 }
diff --git a/src/internal/types/testdata/fixedbugs/issue40056.go b/src/internal/types/testdata/fixedbugs/issue40056.go
index 66130c0..ce882e7 100644
--- a/src/internal/types/testdata/fixedbugs/issue40056.go
+++ b/src/internal/types/testdata/fixedbugs/issue40056.go
@@ -5,11 +5,11 @@
 package p
 
 func _() {
-	NewS /* ERROR cannot infer T */ ().M()
+	NewS /* ERROR "cannot infer T" */ ().M()
 }
 
 type S struct {}
 
 func NewS[T any]() *S { panic(0) }
 
-func (_ *S /* ERROR S is not a generic type */ [T]) M()
+func (_ *S /* ERROR "S is not a generic type" */ [T]) M()
diff --git a/src/internal/types/testdata/fixedbugs/issue40057.go b/src/internal/types/testdata/fixedbugs/issue40057.go
index fdc8fb1..2996d39 100644
--- a/src/internal/types/testdata/fixedbugs/issue40057.go
+++ b/src/internal/types/testdata/fixedbugs/issue40057.go
@@ -7,7 +7,7 @@
 func _() {
 	var x interface{}
 	switch t := x.(type) {
-	case S /* ERROR cannot use generic type */ :
+	case S /* ERROR "cannot use generic type" */ :
 		t.m()
 	}
 }
diff --git a/src/internal/types/testdata/fixedbugs/issue40350.go b/src/internal/types/testdata/fixedbugs/issue40350.go
index 08eb426..b7ceb33 100644
--- a/src/internal/types/testdata/fixedbugs/issue40350.go
+++ b/src/internal/types/testdata/fixedbugs/issue40350.go
@@ -12,5 +12,5 @@
 func f[T number]() {}
 
 func _() {
-	_ = f[int /* ERROR int does not satisfy number \(number mentions int, but int is not in the type set of number\)*/]
+	_ = f[int /* ERROR "int does not satisfy number (number mentions int, but int is not in the type set of number)" */]
 }
diff --git a/src/internal/types/testdata/fixedbugs/issue40684.go b/src/internal/types/testdata/fixedbugs/issue40684.go
index 63a058d..4805184 100644
--- a/src/internal/types/testdata/fixedbugs/issue40684.go
+++ b/src/internal/types/testdata/fixedbugs/issue40684.go
@@ -10,6 +10,6 @@
 func g[_, _ any]() {}
 
 func _() {
-	_ = f[T /* ERROR without instantiation */ ]
-	_ = g[T /* ERROR without instantiation */ , T /* ERROR without instantiation */ ]
+	_ = f[T /* ERROR "without instantiation" */ ]
+	_ = g[T /* ERROR "without instantiation" */ , T /* ERROR "without instantiation" */ ]
 }
diff --git a/src/internal/types/testdata/fixedbugs/issue41124.go b/src/internal/types/testdata/fixedbugs/issue41124.go
index 80d1ff4..0f828dc 100644
--- a/src/internal/types/testdata/fixedbugs/issue41124.go
+++ b/src/internal/types/testdata/fixedbugs/issue41124.go
@@ -6,7 +6,7 @@
 
 // Test case from issue.
 
-type Nat /* ERROR invalid recursive type */ interface {
+type Nat /* ERROR "invalid recursive type" */ interface {
 	Zero|Succ
 }
 
@@ -31,61 +31,61 @@
 }
 
 type _ struct {
-	f I1 // ERROR interface is .* comparable
+	f I1 // ERRORx `interface is .* comparable`
 }
 
 type _ struct {
-	comparable // ERROR interface is .* comparable
+	comparable // ERRORx `interface is .* comparable`
 }
 
 type _ struct{
-	I1 // ERROR interface is .* comparable
+	I1 // ERRORx `interface is .* comparable`
 }
 
 type _ struct{
-	I2 // ERROR interface contains type constraints
+	I2 // ERROR "interface contains type constraints"
 }
 
 type _ struct{
-	I3 // ERROR interface contains type constraints
+	I3 // ERROR "interface contains type constraints"
 }
 
 // General composite types.
 
 type (
-	_ [10]I1 // ERROR interface is .* comparable
-	_ [10]I2 // ERROR interface contains type constraints
+	_ [10]I1 // ERRORx `interface is .* comparable`
+	_ [10]I2 // ERROR "interface contains type constraints"
 
-	_ []I1 // ERROR interface is .* comparable
-	_ []I2 // ERROR interface contains type constraints
+	_ []I1 // ERRORx `interface is .* comparable`
+	_ []I2 // ERROR "interface contains type constraints"
 
-	_ *I3 // ERROR interface contains type constraints
-	_ map[I1 /* ERROR interface is .* comparable */ ]I2 // ERROR interface contains type constraints
-	_ chan I3 // ERROR interface contains type constraints
-	_ func(I1 /* ERROR interface is .* comparable */ )
-	_ func() I2 // ERROR interface contains type constraints
+	_ *I3 // ERROR "interface contains type constraints"
+	_ map[I1 /* ERRORx `interface is .* comparable` */ ]I2 // ERROR "interface contains type constraints"
+	_ chan I3 // ERROR "interface contains type constraints"
+	_ func(I1 /* ERRORx `interface is .* comparable` */ )
+	_ func() I2 // ERROR "interface contains type constraints"
 )
 
 // Other cases.
 
-var _ = [...]I3 /* ERROR interface contains type constraints */ {}
+var _ = [...]I3 /* ERROR "interface contains type constraints" */ {}
 
 func _(x interface{}) {
-	_ = x.(I3 /* ERROR interface contains type constraints */ )
+	_ = x.(I3 /* ERROR "interface contains type constraints" */ )
 }
 
 type T1[_ any] struct{}
 type T3[_, _, _ any] struct{}
-var _ T1[I2 /* ERROR interface contains type constraints */ ]
-var _ T3[int, I2 /* ERROR interface contains type constraints */ , float32]
+var _ T1[I2 /* ERROR "interface contains type constraints" */ ]
+var _ T3[int, I2 /* ERROR "interface contains type constraints" */ , float32]
 
 func f1[_ any]() int { panic(0) }
-var _ = f1[I2 /* ERROR interface contains type constraints */ ]()
+var _ = f1[I2 /* ERROR "interface contains type constraints" */ ]()
 func f3[_, _, _ any]() int { panic(0) }
-var _ = f3[int, I2 /* ERROR interface contains type constraints */ , float32]()
+var _ = f3[int, I2 /* ERROR "interface contains type constraints" */ , float32]()
 
 func _(x interface{}) {
 	switch x.(type) {
-	case I2 /* ERROR interface contains type constraints */ :
+	case I2 /* ERROR "interface contains type constraints" */ :
 	}
 }
diff --git a/src/internal/types/testdata/fixedbugs/issue41176.go b/src/internal/types/testdata/fixedbugs/issue41176.go
new file mode 100644
index 0000000..755e83a
--- /dev/null
+++ b/src/internal/types/testdata/fixedbugs/issue41176.go
@@ -0,0 +1,21 @@
+// Copyright 2023 The Go Authors. 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 S struct{}
+
+func (S) M() byte {
+	return 0
+}
+
+type I[T any] interface {
+	M() T
+}
+
+func f[T any](x I[T]) {}
+
+func _() {
+	f(S{})
+}
diff --git a/src/internal/types/testdata/fixedbugs/issue42695.go b/src/internal/types/testdata/fixedbugs/issue42695.go
index d0d6200..4551e9f 100644
--- a/src/internal/types/testdata/fixedbugs/issue42695.go
+++ b/src/internal/types/testdata/fixedbugs/issue42695.go
@@ -4,14 +4,14 @@
 
 package issue42695
 
-const _ = 6e5518446744 // ERROR malformed constant
-const _ uint8 = 6e5518446744 // ERROR malformed constant
+const _ = 6e5518446744 // ERROR "malformed constant"
+const _ uint8 = 6e5518446744 // ERROR "malformed constant"
 
-var _ = 6e5518446744 // ERROR malformed constant
-var _ uint8 = 6e5518446744 // ERROR malformed constant
+var _ = 6e5518446744 // ERROR "malformed constant"
+var _ uint8 = 6e5518446744 // ERROR "malformed constant"
 
 func f(x int) int {
-        return x + 6e5518446744 // ERROR malformed constant
+        return x + 6e5518446744 // ERROR "malformed constant"
 }
 
-var _ = f(6e5518446744 /* ERROR malformed constant */ )
+var _ = f(6e5518446744 /* ERROR "malformed constant" */ )
diff --git a/src/internal/types/testdata/fixedbugs/issue42758.go b/src/internal/types/testdata/fixedbugs/issue42758.go
index 6d75b10..4e1df34 100644
--- a/src/internal/types/testdata/fixedbugs/issue42758.go
+++ b/src/internal/types/testdata/fixedbugs/issue42758.go
@@ -12,7 +12,7 @@
 
 	switch x.(type) {
 	case T:
-	case T /* ERROR duplicate case */ :
+	case T /* ERROR "duplicate case" */ :
 	}
 }
 
@@ -27,7 +27,7 @@
 	}
 }
 
-func _(x constraint /* ERROR contains type constraints */ ) {
+func _(x constraint /* ERROR "contains type constraints" */ ) {
 	switch x.(type) { // no need to report another error
 	}
 }
diff --git a/src/internal/types/testdata/fixedbugs/issue42881.go b/src/internal/types/testdata/fixedbugs/issue42881.go
index 7122d1c..b766b5e 100644
--- a/src/internal/types/testdata/fixedbugs/issue42881.go
+++ b/src/internal/types/testdata/fixedbugs/issue42881.go
@@ -10,7 +10,7 @@
 )
 
 var (
-	_ comparable // ERROR cannot use type comparable outside a type constraint: interface is \(or embeds\) comparable
-	_ T1         // ERROR cannot use type T1 outside a type constraint: interface is \(or embeds\) comparable
-	_ T2         // ERROR cannot use type T2 outside a type constraint: interface contains type constraints
+	_ comparable // ERROR "cannot use type comparable outside a type constraint: interface is (or embeds) comparable"
+	_ T1         // ERROR "cannot use type T1 outside a type constraint: interface is (or embeds) comparable"
+	_ T2         // ERROR "cannot use type T2 outside a type constraint: interface contains type constraints"
 )
diff --git a/src/internal/types/testdata/fixedbugs/issue42987.go b/src/internal/types/testdata/fixedbugs/issue42987.go
index f58c63f..21c14c1 100644
--- a/src/internal/types/testdata/fixedbugs/issue42987.go
+++ b/src/internal/types/testdata/fixedbugs/issue42987.go
@@ -5,4 +5,4 @@
 // Check that there is only one error (no follow-on errors).
 
 package p
-var _ = [ ... /* ERROR invalid use of \[...\] array */ ]byte("foo")
\ No newline at end of file
+var _ = [ ... /* ERROR "invalid use of [...] array" */ ]byte("foo")
\ No newline at end of file
diff --git a/src/internal/types/testdata/fixedbugs/issue43087.go b/src/internal/types/testdata/fixedbugs/issue43087.go
index 85d4450..222fac8 100644
--- a/src/internal/types/testdata/fixedbugs/issue43087.go
+++ b/src/internal/types/testdata/fixedbugs/issue43087.go
@@ -5,7 +5,7 @@
 package p
 
 func _() {
-	a, b, b /* ERROR b repeated on left side of := */ := 1, 2, 3
+	a, b, b /* ERROR "b repeated on left side of :=" */ := 1, 2, 3
 	_ = a
 	_ = b
 }
@@ -17,27 +17,27 @@
 
 func _() {
 	var b int
-	a, b, b /* ERROR b repeated on left side of := */ := 1, 2, 3
+	a, b, b /* ERROR "b repeated on left side of :=" */ := 1, 2, 3
 	_ = a
 	_ = b
 }
 
 func _() {
 	var a []int
-	a /* ERROR non-name .* on left side of := */ [0], b := 1, 2
+	a /* ERRORx `non-name .* on left side of :=` */ [0], b := 1, 2
 	_ = a
 	_ = b
 }
 
 func _() {
 	var a int
-	a, a /* ERROR a repeated on left side of := */ := 1, 2
+	a, a /* ERROR "a repeated on left side of :=" */ := 1, 2
 	_ = a
 }
 
 func _() {
 	var a, b int
-	a, b := /* ERROR no new variables on left side of := */ 1, 2
+	a, b := /* ERROR "no new variables on left side of :=" */ 1, 2
 	_ = a
 	_ = b
 }
diff --git a/src/internal/types/testdata/fixedbugs/issue43109.go b/src/internal/types/testdata/fixedbugs/issue43109.go
index f242f16..5d21a56 100644
--- a/src/internal/types/testdata/fixedbugs/issue43109.go
+++ b/src/internal/types/testdata/fixedbugs/issue43109.go
@@ -7,4 +7,4 @@
 
 package p
 
-import . "/foo" // ERROR could not import \/foo
+import . "/foo" // ERROR "could not import /foo"
diff --git a/src/internal/types/testdata/fixedbugs/issue43110.go b/src/internal/types/testdata/fixedbugs/issue43110.go
index 8d5c983..1e85022 100644
--- a/src/internal/types/testdata/fixedbugs/issue43110.go
+++ b/src/internal/types/testdata/fixedbugs/issue43110.go
@@ -9,10 +9,10 @@
 func _() {
 	// want an error even if the switch is empty
 	var a struct{ _ func() }
-	switch a /* ERROR cannot switch on a */ {
+	switch a /* ERROR "cannot switch on a" */ {
 	}
 
-	switch a /* ERROR cannot switch on a */ {
+	switch a /* ERROR "cannot switch on a" */ {
 	case a: // no follow-on error here
 	}
 
@@ -30,10 +30,10 @@
 	}
 
 	switch (func())(nil) {
-	case f /* ERROR invalid case f in switch on .* \(func can only be compared to nil\) */ :
+	case f /* ERRORx `invalid case f in switch on .* \(func can only be compared to nil\)` */ :
 	}
 
-	switch nil /* ERROR use of untyped nil in switch expression */ {
+	switch nil /* ERROR "use of untyped nil in switch expression" */ {
 	}
 
 	// this is ok
diff --git a/src/internal/types/testdata/fixedbugs/issue43124.go b/src/internal/types/testdata/fixedbugs/issue43124.go
index f429f74..ce26ae1 100644
--- a/src/internal/types/testdata/fixedbugs/issue43124.go
+++ b/src/internal/types/testdata/fixedbugs/issue43124.go
@@ -4,7 +4,7 @@
 
 package p
 
-var _ = int(0 /* ERROR invalid use of \.\.\. in conversion to int */ ...)
+var _ = int(0 /* ERROR "invalid use of ... in conversion to int" */ ...)
 
 // test case from issue
 
@@ -12,5 +12,5 @@
 
 var (
 	x = []string{"a", "b"}
-	_ = M(x /* ERROR invalid use of \.\.\. in conversion to M */ ...)
+	_ = M(x /* ERROR "invalid use of ... in conversion to M" */ ...)
 )
diff --git a/src/internal/types/testdata/fixedbugs/issue43125.go b/src/internal/types/testdata/fixedbugs/issue43125.go
index 456888d..d0d6feb 100644
--- a/src/internal/types/testdata/fixedbugs/issue43125.go
+++ b/src/internal/types/testdata/fixedbugs/issue43125.go
@@ -4,5 +4,5 @@
 
 package p
 
-var _ = new(- /* ERROR not a type */ 1)
-var _ = new(1 /* ERROR not a type */ + 1)
+var _ = new(- /* ERROR "not a type" */ 1)
+var _ = new(1 /* ERROR "not a type" */ + 1)
diff --git a/src/internal/types/testdata/fixedbugs/issue43190.go b/src/internal/types/testdata/fixedbugs/issue43190.go
index d1b46b5..b4d1fa4 100644
--- a/src/internal/types/testdata/fixedbugs/issue43190.go
+++ b/src/internal/types/testdata/fixedbugs/issue43190.go
@@ -7,25 +7,25 @@
 
 package p
 
-import ; // ERROR missing import path
-import "" // ERROR invalid import path \(empty string\)
+import ; // ERROR "missing import path"
+import "" // ERROR "invalid import path (empty string)"
 import
-var /* ERROR missing import path */ _ int
-import .; //  ERROR missing import path
-import 'x' // ERROR import path must be a string
+var /* ERROR "missing import path" */ _ int
+import .; // ERROR "missing import path"
+import 'x' // ERROR "import path must be a string"
 var _ int
-import /* ERROR imports must appear before other declarations */ _ "math"
+import /* ERROR "imports must appear before other declarations" */ _ "math"
 
 // Don't repeat previous error for each immediately following import ...
 import ()
-import (.) // ERROR missing import path
+import (.) // ERROR "missing import path"
 import (
 	"fmt"
 	.
-) // ERROR missing import path
+) // ERROR "missing import path"
 
 // ... but remind with error again if we start a new import section after
 // other declarations
 var _ = fmt.Println
-import /* ERROR imports must appear before other declarations */ _ "math"
+import /* ERROR "imports must appear before other declarations" */ _ "math"
 import _ "math"
diff --git a/src/internal/types/testdata/fixedbugs/issue43527.go b/src/internal/types/testdata/fixedbugs/issue43527.go
index b515100..473ab96 100644
--- a/src/internal/types/testdata/fixedbugs/issue43527.go
+++ b/src/internal/types/testdata/fixedbugs/issue43527.go
@@ -8,8 +8,8 @@
 
 type (
 	_        [L]struct{}
-	_        [A /* ERROR undefined array length A or missing type constraint */ ]struct{}
-	_        [B /* ERROR invalid array length B */ ]struct{}
+	_        [A /* ERROR "undefined array length A or missing type constraint" */ ]struct{}
+	_        [B /* ERROR "invalid array length B" */ ]struct{}
 	_[A any] struct{}
 
 	B int
diff --git a/src/internal/types/testdata/fixedbugs/issue43671.go b/src/internal/types/testdata/fixedbugs/issue43671.go
index 6879aec..be4c9ee 100644
--- a/src/internal/types/testdata/fixedbugs/issue43671.go
+++ b/src/internal/types/testdata/fixedbugs/issue43671.go
@@ -12,11 +12,11 @@
 type C5[T any] interface{ ~chan T | <-chan T }
 
 func _[T any](ch T) {
-	<-ch // ERROR cannot receive from ch .* \(no core type\)
+	<-ch // ERRORx `cannot receive from ch .* \(no core type\)`
 }
 
 func _[T C0](ch T) {
-	<-ch // ERROR cannot receive from non-channel ch
+	<-ch // ERROR "cannot receive from non-channel ch"
 }
 
 func _[T C1](ch T) {
@@ -28,11 +28,11 @@
 }
 
 func _[T C3](ch T) {
-	<-ch // ERROR cannot receive from ch .* \(no core type\)
+	<-ch // ERRORx `cannot receive from ch .* \(no core type\)`
 }
 
 func _[T C4](ch T) {
-	<-ch // ERROR cannot receive from send-only channel
+	<-ch // ERROR "cannot receive from send-only channel"
 }
 
 func _[T C5[X], X any](ch T, x X) {
diff --git a/src/internal/types/testdata/fixedbugs/issue45114.go b/src/internal/types/testdata/fixedbugs/issue45114.go
index 0093660..e51b3f7 100644
--- a/src/internal/types/testdata/fixedbugs/issue45114.go
+++ b/src/internal/types/testdata/fixedbugs/issue45114.go
@@ -5,4 +5,4 @@
 package p
 
 var s uint
-var _ = string(1 /* ERROR shifted operand 1 .* must be integer */ << s)
+var _ = string(1 /* ERRORx `shifted operand 1 .* must be integer` */ << s)
diff --git a/src/internal/types/testdata/fixedbugs/issue45550.go b/src/internal/types/testdata/fixedbugs/issue45550.go
index 498b1eb..2ea4ffe 100644
--- a/src/internal/types/testdata/fixedbugs/issue45550.go
+++ b/src/internal/types/testdata/fixedbugs/issue45550.go
@@ -4,7 +4,7 @@
 
 package p
 
-type Builder /* ERROR invalid recursive type */ [T interface{ struct{ Builder[T] } }] struct{}
+type Builder /* ERROR "invalid recursive type" */ [T interface{ struct{ Builder[T] } }] struct{}
 type myBuilder struct {
 	Builder[myBuilder]
 }
diff --git a/src/internal/types/testdata/fixedbugs/issue45635.go b/src/internal/types/testdata/fixedbugs/issue45635.go
index af05ff0..b83d477 100644
--- a/src/internal/types/testdata/fixedbugs/issue45635.go
+++ b/src/internal/types/testdata/fixedbugs/issue45635.go
@@ -10,7 +10,7 @@
 
 type N[T any] struct{}
 
-var _ N [] // ERROR expected type argument list
+var _ N [] // ERROR "expected type argument list"
 
 type I interface {
 	~[]int
diff --git a/src/internal/types/testdata/fixedbugs/issue45639.go b/src/internal/types/testdata/fixedbugs/issue45639.go
index 80148fe..a224aed 100644
--- a/src/internal/types/testdata/fixedbugs/issue45639.go
+++ b/src/internal/types/testdata/fixedbugs/issue45639.go
@@ -8,6 +8,6 @@
 // // It is not permitted to declare a local type whose underlying
 // // type is a type parameters not declared by that type declaration.
 // func _[T any]() {
-// 	type _ T         // ERROR cannot use function type parameter T as RHS in type declaration
-// 	type _ [_ any] T // ERROR cannot use function type parameter T as RHS in type declaration
+// 	type _ T         // ERROR "cannot use function type parameter T as RHS in type declaration"
+// 	type _ [_ any] T // ERROR "cannot use function type parameter T as RHS in type declaration"
 // }
diff --git a/src/internal/types/testdata/fixedbugs/issue45920.go b/src/internal/types/testdata/fixedbugs/issue45920.go
index 0a281c5..716abb1 100644
--- a/src/internal/types/testdata/fixedbugs/issue45920.go
+++ b/src/internal/types/testdata/fixedbugs/issue45920.go
@@ -8,10 +8,10 @@
 
 func _(ch chan int)   { f1(ch) }
 func _(ch <-chan int) { f1(ch) }
-func _(ch chan<- int) { f1 /* ERROR chan<- int does not satisfy chan int \| <-chan int */ (ch) }
+func _(ch chan<- int) { f1 /* ERROR "chan<- int does not satisfy chan int | <-chan int" */ (ch) }
 
 func f2[T any, C chan T | chan<- T](ch C) {}
 
 func _(ch chan int)   { f2(ch) }
-func _(ch <-chan int) { f2 /* ERROR <-chan int does not satisfy chan int \| chan<- int */ (ch) }
+func _(ch <-chan int) { f2 /* ERROR "<-chan int does not satisfy chan int | chan<- int" */ (ch) }
 func _(ch chan<- int) { f2(ch) }
diff --git a/src/internal/types/testdata/fixedbugs/issue45985.go b/src/internal/types/testdata/fixedbugs/issue45985.go
index ae04ce2..c486150 100644
--- a/src/internal/types/testdata/fixedbugs/issue45985.go
+++ b/src/internal/types/testdata/fixedbugs/issue45985.go
@@ -9,5 +9,5 @@
 }
 
 func _() {
-	_ = app /* ERROR "int does not match" */ [int]
+	_ = app /* ERROR "S (type int) does not satisfy interface{~[]T}" */ [int] // TODO(gri) better error message
 }
diff --git a/src/internal/types/testdata/fixedbugs/issue46090.go b/src/internal/types/testdata/fixedbugs/issue46090.go
index 07f0101..59670da 100644
--- a/src/internal/types/testdata/fixedbugs/issue46090.go
+++ b/src/internal/types/testdata/fixedbugs/issue46090.go
@@ -8,4 +8,4 @@
 
 package p
 
-type _ comparable // ERROR predeclared comparable
+type _ comparable // ERROR "predeclared comparable"
diff --git a/src/internal/types/testdata/fixedbugs/issue46403.go b/src/internal/types/testdata/fixedbugs/issue46403.go
index 9d47522..fc60340 100644
--- a/src/internal/types/testdata/fixedbugs/issue46403.go
+++ b/src/internal/types/testdata/fixedbugs/issue46403.go
@@ -7,5 +7,5 @@
 func _() {
 	// a should be used, despite the parser error below.
 	var a []int
-	var _ = a[] // ERROR expected operand
+	var _ = a[] // ERROR "expected operand"
 }
diff --git a/src/internal/types/testdata/fixedbugs/issue46461.go b/src/internal/types/testdata/fixedbugs/issue46461.go
index fce06f7..ae70048 100644
--- a/src/internal/types/testdata/fixedbugs/issue46461.go
+++ b/src/internal/types/testdata/fixedbugs/issue46461.go
@@ -5,16 +5,16 @@
 package p
 
 // test case 1
-type T /* ERROR invalid recursive type */ [U interface{ M() T[U] }] int
+type T /* ERROR "invalid recursive type" */ [U interface{ M() T[U] }] int
 
 type X int
 
 func (X) M() T[X] { return 0 }
 
 // test case 2
-type A /* ERROR invalid recursive type */ [T interface{ A[T] }] interface{}
+type A /* ERROR "invalid recursive type" */ [T interface{ A[T] }] interface{}
 
 // test case 3
-type A2 /* ERROR invalid recursive type */ [U interface{ A2[U] }] interface{ M() A2[U] }
+type A2 /* ERROR "invalid recursive type" */ [U interface{ A2[U] }] interface{ M() A2[U] }
 
 type I interface{ A2[I]; M() A2[I] }
diff --git a/src/internal/types/testdata/fixedbugs/issue46583.go b/src/internal/types/testdata/fixedbugs/issue46583.go
index da1f1ff..1901bff 100644
--- a/src/internal/types/testdata/fixedbugs/issue46583.go
+++ b/src/internal/types/testdata/fixedbugs/issue46583.go
@@ -21,8 +21,8 @@
 var f4 func(T4)
 
 func _() {
-	f1 = T1 /* ERROR func\(T1, int\) */ .m
-	f2 = T2 /* ERROR func\(t T2, x int\) */ .m
-	f3 = T3 /* ERROR func\(T3, int\) */ .m
-	f4 = T4 /* ERROR func\(_ T4, x int\) */ .m
+	f1 = T1 /* ERROR "func(T1, int)" */ .m
+	f2 = T2 /* ERROR "func(t T2, x int)" */ .m
+	f3 = T3 /* ERROR "func(T3, int)" */ .m
+	f4 = T4 /* ERROR "func(_ T4, x int)" */ .m
 }
diff --git a/src/internal/types/testdata/fixedbugs/issue47031.go b/src/internal/types/testdata/fixedbugs/issue47031.go
index b184f9b..23a9c55 100644
--- a/src/internal/types/testdata/fixedbugs/issue47031.go
+++ b/src/internal/types/testdata/fixedbugs/issue47031.go
@@ -7,7 +7,7 @@
 type Mer interface { M() }
 
 func F[T Mer](p *T) {
-	p.M /* ERROR p\.M undefined */ ()
+	p.M /* ERROR "p.M undefined" */ ()
 }
 
 type MyMer int
diff --git a/src/internal/types/testdata/fixedbugs/issue47115.go b/src/internal/types/testdata/fixedbugs/issue47115.go
index a0bfe38..2d2be34 100644
--- a/src/internal/types/testdata/fixedbugs/issue47115.go
+++ b/src/internal/types/testdata/fixedbugs/issue47115.go
@@ -12,11 +12,11 @@
 type C5[T any] interface{ ~chan T | chan<- T }
 
 func _[T any](ch T) {
-	ch <- /* ERROR cannot send to ch .* no core type */ 0
+	ch <- /* ERRORx `cannot send to ch .* no core type` */ 0
 }
 
 func _[T C0](ch T) {
-	ch <- /* ERROR cannot send to non-channel */ 0
+	ch <- /* ERROR "cannot send to non-channel" */ 0
 }
 
 func _[T C1](ch T) {
@@ -24,11 +24,11 @@
 }
 
 func _[T C2](ch T) {
-	ch  <-/* ERROR cannot send to receive-only channel */ 0
+	ch  <-/* ERROR "cannot send to receive-only channel" */ 0
 }
 
 func _[T C3](ch T) {
-	ch <- /* ERROR cannot send to ch .* no core type */ 0
+	ch <- /* ERRORx `cannot send to ch .* no core type` */ 0
 }
 
 func _[T C4](ch T) {
diff --git a/src/internal/types/testdata/fixedbugs/issue47127.go b/src/internal/types/testdata/fixedbugs/issue47127.go
index bb4b487..b663938 100644
--- a/src/internal/types/testdata/fixedbugs/issue47127.go
+++ b/src/internal/types/testdata/fixedbugs/issue47127.go
@@ -8,30 +8,30 @@
 
 type (
         _[P any] interface{ *P | []P | chan P | map[string]P }
-        _[P any] interface{ P /* ERROR term cannot be a type parameter */ }
-        _[P any] interface{ ~P /* ERROR type in term ~P cannot be a type parameter */ }
-        _[P any] interface{ int | P /* ERROR term cannot be a type parameter */ }
-        _[P any] interface{ int | ~P /* ERROR type in term ~P cannot be a type parameter */ }
+        _[P any] interface{ P /* ERROR "term cannot be a type parameter" */ }
+        _[P any] interface{ ~P /* ERROR "type in term ~P cannot be a type parameter" */ }
+        _[P any] interface{ int | P /* ERROR "term cannot be a type parameter" */ }
+        _[P any] interface{ int | ~P /* ERROR "type in term ~P cannot be a type parameter" */ }
 )
 
 func _[P any]() {
         type (
                 _[P any] interface{ *P | []P | chan P | map[string]P }
-                _[P any] interface{ P /* ERROR term cannot be a type parameter */ }
-                _[P any] interface{ ~P /* ERROR type in term ~P cannot be a type parameter */ }
-                _[P any] interface{ int | P /* ERROR term cannot be a type parameter */ }
-                _[P any] interface{ int | ~P /* ERROR type in term ~P cannot be a type parameter */ }
+                _[P any] interface{ P /* ERROR "term cannot be a type parameter" */ }
+                _[P any] interface{ ~P /* ERROR "type in term ~P cannot be a type parameter" */ }
+                _[P any] interface{ int | P /* ERROR "term cannot be a type parameter" */ }
+                _[P any] interface{ int | ~P /* ERROR "type in term ~P cannot be a type parameter" */ }
 
                 _ interface{ *P | []P | chan P | map[string]P }
-                _ interface{ P /* ERROR term cannot be a type parameter */ }
-                _ interface{ ~P /* ERROR type in term ~P cannot be a type parameter */ }
-                _ interface{ int | P /* ERROR term cannot be a type parameter */ }
-                _ interface{ int | ~P /* ERROR type in term ~P cannot be a type parameter */ }
+                _ interface{ P /* ERROR "term cannot be a type parameter" */ }
+                _ interface{ ~P /* ERROR "type in term ~P cannot be a type parameter" */ }
+                _ interface{ int | P /* ERROR "term cannot be a type parameter" */ }
+                _ interface{ int | ~P /* ERROR "type in term ~P cannot be a type parameter" */ }
         )
 }
 
 func _[P any, Q interface{ *P | []P | chan P | map[string]P }]() {}
-func _[P any, Q interface{ P /* ERROR term cannot be a type parameter */ }]() {}
-func _[P any, Q interface{ ~P /* ERROR type in term ~P cannot be a type parameter */ }]() {}
-func _[P any, Q interface{ int | P /* ERROR term cannot be a type parameter */ }]() {}
-func _[P any, Q interface{ int | ~P /* ERROR type in term ~P cannot be a type parameter */ }]() {}
+func _[P any, Q interface{ P /* ERROR "term cannot be a type parameter" */ }]() {}
+func _[P any, Q interface{ ~P /* ERROR "type in term ~P cannot be a type parameter" */ }]() {}
+func _[P any, Q interface{ int | P /* ERROR "term cannot be a type parameter" */ }]() {}
+func _[P any, Q interface{ int | ~P /* ERROR "type in term ~P cannot be a type parameter" */ }]() {}
diff --git a/src/internal/types/testdata/fixedbugs/issue47411.go b/src/internal/types/testdata/fixedbugs/issue47411.go
index 33b169a..97b5942 100644
--- a/src/internal/types/testdata/fixedbugs/issue47411.go
+++ b/src/internal/types/testdata/fixedbugs/issue47411.go
@@ -15,12 +15,12 @@
         _ = f[int]
         _ = f[P]
         _ = f[Q]
-        _ = f[func /* ERROR does not satisfy comparable */ ()]
-        _ = f[R /* ERROR R does not satisfy comparable */ ]
+        _ = f[func /* ERROR "does not satisfy comparable" */ ()]
+        _ = f[R /* ERROR "R does not satisfy comparable" */ ]
 
         _ = g[int]
-        _ = g[P /* ERROR P does not satisfy interface{interface{comparable; ~int \| ~string} */ ]
+        _ = g[P /* ERROR "P does not satisfy interface{interface{comparable; ~int | ~string}" */ ]
         _ = g[Q]
-        _ = g[func /* ERROR func\(\) does not satisfy interface{interface{comparable; ~int \| ~string}} */ ()]
-        _ = g[R /* ERROR R does not satisfy interface{interface{comparable; ~int \| ~string} */ ]
+        _ = g[func /* ERROR "func() does not satisfy interface{interface{comparable; ~int | ~string}}" */ ()]
+        _ = g[R /* ERROR "R does not satisfy interface{interface{comparable; ~int | ~string}" */ ]
 }
diff --git a/src/internal/types/testdata/fixedbugs/issue47747.go b/src/internal/types/testdata/fixedbugs/issue47747.go
index 6f09fc2..34c78d3 100644
--- a/src/internal/types/testdata/fixedbugs/issue47747.go
+++ b/src/internal/types/testdata/fixedbugs/issue47747.go
@@ -20,7 +20,7 @@
         x.m()
         // (&x).m doesn't exist because &x is of type *P
         // and pointers to type parameters don't have methods
-        (&x).m /* ERROR type \*P is pointer to type parameter, not type parameter */ ()
+        (&x).m /* ERROR "type *P is pointer to type parameter, not type parameter" */ ()
 }
 
 
@@ -29,7 +29,7 @@
 func _(x *T2) {
         // x.m doesn't exists because x is of type *T2
         // and pointers to interfaces don't have methods
-        x.m /* ERROR type \*T2 is pointer to interface, not interface */()
+        x.m /* ERROR "type *T2 is pointer to interface, not interface" */()
 }
 
 // Test case 1 from issue
diff --git a/src/internal/types/testdata/fixedbugs/issue47796.go b/src/internal/types/testdata/fixedbugs/issue47796.go
index 4c59106..7f719ff 100644
--- a/src/internal/types/testdata/fixedbugs/issue47796.go
+++ b/src/internal/types/testdata/fixedbugs/issue47796.go
@@ -6,16 +6,16 @@
 
 // parameterized types with self-recursive constraints
 type (
-	T1 /* ERROR invalid recursive type */ [P T1[P]]                            interface{}
-	T2 /* ERROR invalid recursive type */ [P, Q T2[P, Q]]                      interface{}
+	T1 /* ERROR "invalid recursive type" */ [P T1[P]]                            interface{}
+	T2 /* ERROR "invalid recursive type" */ [P, Q T2[P, Q]]                      interface{}
 	T3[P T2[P, Q], Q interface{ ~string }] interface{}
 
-	T4a /* ERROR invalid recursive type */ [P T4a[P]]                                                        interface{ ~int }
-	T4b /* ERROR invalid recursive type */ [P T4b[int]]                                                      interface{ ~int }
-	T4c /* ERROR invalid recursive type */ [P T4c[string]] interface{ ~int }
+	T4a /* ERROR "invalid recursive type" */ [P T4a[P]]                                                        interface{ ~int }
+	T4b /* ERROR "invalid recursive type" */ [P T4b[int]]                                                      interface{ ~int }
+	T4c /* ERROR "invalid recursive type" */ [P T4c[string]] interface{ ~int }
 
 	// mutually recursive constraints
-	T5 /* ERROR invalid recursive type */ [P T6[P]] interface{ int }
+	T5 /* ERROR "invalid recursive type" */ [P T6[P]] interface{ int }
 	T6[P T5[P]] interface{ int }
 )
 
@@ -28,6 +28,6 @@
 
 // test case from issue
 
-type Eq /* ERROR invalid recursive type */ [a Eq[a]] interface {
+type Eq /* ERROR "invalid recursive type" */ [a Eq[a]] interface {
 	Equal(that a) bool
 }
diff --git a/src/internal/types/testdata/fixedbugs/issue47818.go b/src/internal/types/testdata/fixedbugs/issue47818.go
index e9b0adb..21c8539 100644
--- a/src/internal/types/testdata/fixedbugs/issue47818.go
+++ b/src/internal/types/testdata/fixedbugs/issue47818.go
@@ -10,36 +10,36 @@
 
 package p
 
-type T[P /* ERROR type parameter requires go1\.18 or later */ any /* ERROR predeclared any requires go1\.18 or later */] struct{}
+type T[P /* ERROR "type parameter requires go1.18 or later" */ any /* ERROR "predeclared any requires go1.18 or later" */] struct{}
 
 // for init (and main, but we're not in package main) we should only get one error
-func init[P /* ERROR func init must have no type parameters */ any /* ERROR predeclared any requires go1\.18 or later */]() {
+func init[P /* ERROR "func init must have no type parameters" */ any /* ERROR "predeclared any requires go1.18 or later" */]() {
 }
-func main[P /* ERROR type parameter requires go1\.18 or later */ any /* ERROR predeclared any requires go1\.18 or later */]() {
+func main[P /* ERROR "type parameter requires go1.18 or later" */ any /* ERROR "predeclared any requires go1.18 or later" */]() {
 }
 
-func f[P /* ERROR type parameter requires go1\.18 or later */ any /* ERROR predeclared any requires go1\.18 or later */](x P) {
-	var _ T[ /* ERROR type instantiation requires go1\.18 or later */ int]
-	var _ (T[ /* ERROR type instantiation requires go1\.18 or later */ int])
-	_ = T[ /* ERROR type instantiation requires go1\.18 or later */ int]{}
-	_ = T[ /* ERROR type instantiation requires go1\.18 or later */ int](struct{}{})
+func f[P /* ERROR "type parameter requires go1.18 or later" */ any /* ERROR "predeclared any requires go1.18 or later" */](x P) {
+	var _ T[ /* ERROR "type instantiation requires go1.18 or later" */ int]
+	var _ (T[ /* ERROR "type instantiation requires go1.18 or later" */ int])
+	_ = T[ /* ERROR "type instantiation requires go1.18 or later" */ int]{}
+	_ = T[ /* ERROR "type instantiation requires go1.18 or later" */ int](struct{}{})
 }
 
-func (T[ /* ERROR type instantiation requires go1\.18 or later */ P]) g(x int) {
-	f[ /* ERROR function instantiation requires go1\.18 or later */ int](0)     // explicit instantiation
-	(f[ /* ERROR function instantiation requires go1\.18 or later */ int])(0)   // parentheses (different code path)
-	f( /* ERROR implicit function instantiation requires go1\.18 or later */ x) // implicit instantiation
+func (T[ /* ERROR "type instantiation requires go1.18 or later" */ P]) g(x int) {
+	f[ /* ERROR "function instantiation requires go1.18 or later" */ int](0)     // explicit instantiation
+	(f[ /* ERROR "function instantiation requires go1.18 or later" */ int])(0)   // parentheses (different code path)
+	f( /* ERROR "implicit function instantiation requires go1.18 or later" */ x) // implicit instantiation
 }
 
 type C1 interface {
-	comparable // ERROR predeclared comparable requires go1\.18 or later
+	comparable // ERROR "predeclared comparable requires go1.18 or later"
 }
 
 type C2 interface {
-	comparable // ERROR predeclared comparable requires go1\.18 or later
-	int        // ERROR embedding non-interface type int requires go1\.18 or later
-	~ /* ERROR embedding interface element ~int requires go1\.18 or later */ int
-	int /* ERROR embedding interface element int \| ~string requires go1\.18 or later */ | ~string
+	comparable // ERROR "predeclared comparable requires go1.18 or later"
+	int        // ERROR "embedding non-interface type int requires go1.18 or later"
+	~ /* ERROR "embedding interface element ~int requires go1.18 or later" */ int
+	int /* ERROR "embedding interface element int | ~string requires go1.18 or later" */ | ~string
 }
 
 type _ interface {
@@ -49,12 +49,12 @@
 }
 
 type (
-	_ comparable // ERROR predeclared comparable requires go1\.18 or later
+	_ comparable // ERROR "predeclared comparable requires go1.18 or later"
 	// errors for these were reported with their declaration
 	_ C1
 	_ C2
 
-	_ = comparable // ERROR predeclared comparable requires go1\.18 or later
+	_ = comparable // ERROR "predeclared comparable requires go1.18 or later"
 	// errors for these were reported with their declaration
 	_ = C1
 	_ = C2
diff --git a/src/internal/types/testdata/fixedbugs/issue47968.go b/src/internal/types/testdata/fixedbugs/issue47968.go
index 3dd3039..c516eee 100644
--- a/src/internal/types/testdata/fixedbugs/issue47968.go
+++ b/src/internal/types/testdata/fixedbugs/issue47968.go
@@ -8,14 +8,14 @@
 
 func (T[P]) m1()
 
-type A1 = T // ERROR cannot use generic type
+type A1 = T // ERROR "cannot use generic type"
 
 func (A1[P]) m2() {}
 
 type A2 = T[int]
 
-func (A2 /* ERROR cannot define new methods on instantiated type T\[int\] */) m3()   {}
-func (_ /* ERROR cannot define new methods on instantiated type T\[int\] */ A2) m4() {}
+func (A2 /* ERROR "cannot define new methods on instantiated type T[int]" */) m3()   {}
+func (_ /* ERROR "cannot define new methods on instantiated type T[int]" */ A2) m4() {}
 
 func (T[int]) m5()                                     {} // int is the type parameter name, not an instantiation
-func (T[* /* ERROR must be an identifier */ int]) m6() {} // syntax error
+func (T[* /* ERROR "must be an identifier" */ int]) m6() {} // syntax error
diff --git a/src/internal/types/testdata/fixedbugs/issue48008.go b/src/internal/types/testdata/fixedbugs/issue48008.go
index 6c14c78..8d0c640 100644
--- a/src/internal/types/testdata/fixedbugs/issue48008.go
+++ b/src/internal/types/testdata/fixedbugs/issue48008.go
@@ -21,17 +21,17 @@
 	case map[T[int]] string:
 	case chan T[int]:
 
-	case T /* ERROR cannot use generic type T\[P any\] without instantiation */ :
-	case []T /* ERROR cannot use generic type */ :
-	case [10]T /* ERROR cannot use generic type */ :
-	case struct{T /* ERROR cannot use generic type */ }:
-	case *T /* ERROR cannot use generic type */ :
-	case func(T /* ERROR cannot use generic type */ ):
-	case interface{m(T /* ERROR cannot use generic type */ )}:
-	case map[T /* ERROR cannot use generic type */ ] string:
-	case chan T /* ERROR cannot use generic type */ :
+	case T /* ERROR "cannot use generic type T[P any] without instantiation" */ :
+	case []T /* ERROR "cannot use generic type" */ :
+	case [10]T /* ERROR "cannot use generic type" */ :
+	case struct{T /* ERROR "cannot use generic type" */ }:
+	case *T /* ERROR "cannot use generic type" */ :
+	case func(T /* ERROR "cannot use generic type" */ ):
+	case interface{m(T /* ERROR "cannot use generic type" */ )}:
+	case map[T /* ERROR "cannot use generic type" */ ] string:
+	case chan T /* ERROR "cannot use generic type" */ :
 
-	case T /* ERROR cannot use generic type */ , *T /* ERROR cannot use generic type */ :
+	case T /* ERROR "cannot use generic type" */ , *T /* ERROR "cannot use generic type" */ :
 	}
 }
 
@@ -55,6 +55,6 @@
 func _(x interface{}) {
 	var nil int
 	switch x.(type) {
-	case nil /* ERROR not a type */ : // not ok - this is the variable nil
+	case nil /* ERROR "not a type" */ : // not ok - this is the variable nil
 	}
 }
diff --git a/src/internal/types/testdata/fixedbugs/issue48018.go b/src/internal/types/testdata/fixedbugs/issue48018.go
index e6ccc6b..3df908a 100644
--- a/src/internal/types/testdata/fixedbugs/issue48018.go
+++ b/src/internal/types/testdata/fixedbugs/issue48018.go
@@ -8,7 +8,7 @@
 	value A
 }
 
-func Nest[A /* ERROR instantiation cycle */ any](b Box[A], n int) interface{} {
+func Nest[A /* ERROR "instantiation cycle" */ any](b Box[A], n int) interface{} {
 	if n == 0 {
 		return b
 	}
diff --git a/src/internal/types/testdata/fixedbugs/issue48048.go b/src/internal/types/testdata/fixedbugs/issue48048.go
index f401330..98a03ea 100644
--- a/src/internal/types/testdata/fixedbugs/issue48048.go
+++ b/src/internal/types/testdata/fixedbugs/issue48048.go
@@ -11,5 +11,5 @@
 var _ = (T[int]).A
 var _ = (*T[int]).A
 
-var _ = (T /* ERROR cannot use generic type */).A
-var _ = (*T /* ERROR cannot use generic type */).A
+var _ = (T /* ERROR "cannot use generic type" */).A
+var _ = (*T /* ERROR "cannot use generic type" */).A
diff --git a/src/internal/types/testdata/fixedbugs/issue48082.go b/src/internal/types/testdata/fixedbugs/issue48082.go
index 5395154..648c512 100644
--- a/src/internal/types/testdata/fixedbugs/issue48082.go
+++ b/src/internal/types/testdata/fixedbugs/issue48082.go
@@ -4,4 +4,4 @@
 
 package issue48082
 
-import "init" /* ERROR init must be a func */ /* ERROR could not import init */
+import "init" /* ERROR "init must be a func" */ /* ERROR "could not import init" */
diff --git a/src/internal/types/testdata/fixedbugs/issue48083.go b/src/internal/types/testdata/fixedbugs/issue48083.go
index 3dae514..15e9b70 100644
--- a/src/internal/types/testdata/fixedbugs/issue48083.go
+++ b/src/internal/types/testdata/fixedbugs/issue48083.go
@@ -6,4 +6,4 @@
 
 type T[P any] struct{}
 
-type _ interface{ int | T /* ERROR cannot use generic type */ }
\ No newline at end of file
+type _ interface{ int | T /* ERROR "cannot use generic type" */ }
\ No newline at end of file
diff --git a/src/internal/types/testdata/fixedbugs/issue48136.go b/src/internal/types/testdata/fixedbugs/issue48136.go
index b87f84a..b76322e 100644
--- a/src/internal/types/testdata/fixedbugs/issue48136.go
+++ b/src/internal/types/testdata/fixedbugs/issue48136.go
@@ -12,12 +12,12 @@
 func f6[P interface { *Tree[P] }, Q any ]() {}
 
 func _() {
-        f1 /* ERROR cannot infer P */ ()
-        f2 /* ERROR cannot infer P */ ()
-        f3 /* ERROR cannot infer P */ ()
-        f4 /* ERROR cannot infer P */ ()
-        f5 /* ERROR cannot infer P */ ()
-        f6 /* ERROR cannot infer P */ ()
+        f1 /* ERROR "cannot infer P" */ ()
+        f2 /* ERROR "cannot infer P" */ ()
+        f3 /* ERROR "cannot infer P" */ ()
+        f4 /* ERROR "cannot infer P" */ ()
+        f5 /* ERROR "cannot infer P" */ ()
+        f6 /* ERROR "cannot infer P" */ ()
 }
 
 type Tree[P any] struct {
@@ -32,5 +32,5 @@
 }
 
 func _() {
-        foo /* ERROR cannot infer Src */ ()
+        foo /* ERROR "cannot infer Src" */ ()
 }
diff --git a/src/internal/types/testdata/fixedbugs/issue48312.go b/src/internal/types/testdata/fixedbugs/issue48312.go
index 2fdb7ca..708201b 100644
--- a/src/internal/types/testdata/fixedbugs/issue48312.go
+++ b/src/internal/types/testdata/fixedbugs/issue48312.go
@@ -8,13 +8,13 @@
 type P *T
 
 func _(p *T) {
-	p.m /* ERROR type \*T is pointer to interface, not interface */ ()
+	p.m /* ERROR "type *T is pointer to interface, not interface" */ ()
 }
 
 func _(p P) {
-	p.m /* ERROR type P is pointer to interface, not interface */ ()
+	p.m /* ERROR "type P is pointer to interface, not interface" */ ()
 }
 
 func _[P T](p *P) {
-	p.m /* ERROR type \*P is pointer to type parameter, not type parameter */ ()
+	p.m /* ERROR "type *P is pointer to type parameter, not type parameter" */ ()
 }
diff --git a/src/internal/types/testdata/fixedbugs/issue48472.go b/src/internal/types/testdata/fixedbugs/issue48472.go
index 2d908f4..169ab0d 100644
--- a/src/internal/types/testdata/fixedbugs/issue48472.go
+++ b/src/internal/types/testdata/fixedbugs/issue48472.go
@@ -7,10 +7,10 @@
 func g() {
 	var s string
 	var i int
-	_ = s /* ERROR invalid operation: s \+ i \(mismatched types string and int\) */ + i
+	_ = s /* ERROR "invalid operation: s + i (mismatched types string and int)" */ + i
 }
 
 func f(i int) int {
-        i /* ERROR invalid operation: i \+= "1" \(mismatched types int and untyped string\) */ += "1"
+        i /* ERROR `invalid operation: i += "1" (mismatched types int and untyped string)` */ += "1"
         return i
 }
diff --git a/src/internal/types/testdata/fixedbugs/issue48529.go b/src/internal/types/testdata/fixedbugs/issue48529.go
index d7a70b1..bcc5e35 100644
--- a/src/internal/types/testdata/fixedbugs/issue48529.go
+++ b/src/internal/types/testdata/fixedbugs/issue48529.go
@@ -4,7 +4,7 @@
 
 package p
 
-type T /* ERROR invalid recursive type */ [U interface{ M() T[U, int] }] int
+type T /* ERROR "invalid recursive type" */ [U interface{ M() T[U, int] }] int
 
 type X int
 
diff --git a/src/internal/types/testdata/fixedbugs/issue48582.go b/src/internal/types/testdata/fixedbugs/issue48582.go
index 9e1d526..8ffcd5a 100644
--- a/src/internal/types/testdata/fixedbugs/issue48582.go
+++ b/src/internal/types/testdata/fixedbugs/issue48582.go
@@ -4,11 +4,11 @@
 
 package p
 
-type N /* ERROR invalid recursive type */ interface {
+type N /* ERROR "invalid recursive type" */ interface {
 	int | N
 }
 
-type A /* ERROR invalid recursive type */ interface {
+type A /* ERROR "invalid recursive type" */ interface {
 	int | B
 }
 
@@ -16,8 +16,8 @@
 	int | A
 }
 
-type S /* ERROR invalid recursive type */ struct {
-	I // ERROR interface contains type constraints
+type S /* ERROR "invalid recursive type" */ struct {
+	I // ERROR "interface contains type constraints"
 }
 
 type I interface {
@@ -25,5 +25,5 @@
 }
 
 type P interface {
-	*P // ERROR interface contains type constraints
+	*P // ERROR "interface contains type constraints"
 }
diff --git a/src/internal/types/testdata/fixedbugs/issue48619.go b/src/internal/types/testdata/fixedbugs/issue48619.go
index 72eea1e..fc5dce0 100644
--- a/src/internal/types/testdata/fixedbugs/issue48619.go
+++ b/src/internal/types/testdata/fixedbugs/issue48619.go
@@ -7,8 +7,8 @@
 func f[P any](a, _ P) {
 	var x int
 	// TODO(gri) these error messages, while correct, could be better
-	f(a, x /* ERROR type int of x does not match inferred type P for P */)
-	f(x, a /* ERROR type P of a does not match inferred type int for P */)
+	f(a, x /* ERROR "type int of x does not match inferred type P for P" */)
+	f(x, a /* ERROR "type P of a does not match inferred type int for P" */)
 }
 
 func g[P any](a, b P) {
diff --git a/src/internal/types/testdata/fixedbugs/issue48656.go b/src/internal/types/testdata/fixedbugs/issue48656.go
index 0f60f47..f77e08a 100644
--- a/src/internal/types/testdata/fixedbugs/issue48656.go
+++ b/src/internal/types/testdata/fixedbugs/issue48656.go
@@ -8,6 +8,6 @@
 	_ = f[P]
 }
 
-func f2[P /* ERROR instantiation cycle */ *Q, Q any](P, Q) {
+func f2[P /* ERROR "instantiation cycle" */ *Q, Q any](P, Q) {
 	_ = f2[*P]
 }
diff --git a/src/internal/types/testdata/fixedbugs/issue48703.go b/src/internal/types/testdata/fixedbugs/issue48703.go
index 8a32c1e..89c667b 100644
--- a/src/internal/types/testdata/fixedbugs/issue48703.go
+++ b/src/internal/types/testdata/fixedbugs/issue48703.go
@@ -14,7 +14,7 @@
 // Other types of recursion through methods.
 type R[P any] int
 
-func (*R[R /* ERROR must be an identifier */ [int]]) m0() {}
+func (*R[R /* ERROR "must be an identifier" */ [int]]) m0() {}
 func (R[P]) m1(R[R[P]])                                   {}
 func (R[P]) m2(R[*P])                                     {}
 func (R[P]) m3([unsafe.Sizeof(new(R[P]))]int)             {}
diff --git a/src/internal/types/testdata/fixedbugs/issue48712.go b/src/internal/types/testdata/fixedbugs/issue48712.go
index 63ce7bc..76ad16c 100644
--- a/src/internal/types/testdata/fixedbugs/issue48712.go
+++ b/src/internal/types/testdata/fixedbugs/issue48712.go
@@ -10,7 +10,7 @@
 	_ = y == x
 	_ = y == y
 
-	_ = x /* ERROR type parameter P is not comparable with < */ < y
+	_ = x /* ERROR "type parameter P is not comparable with <" */ < y
 }
 
 func _[P comparable](x P, y any) {
@@ -19,23 +19,23 @@
 	_ = y == x
 	_ = y == y
 
-	_ = x /* ERROR type parameter P is not comparable with < */ < y
+	_ = x /* ERROR "type parameter P is not comparable with <" */ < y
 }
 
 func _[P any](x, y P) {
-	_ = x /* ERROR incomparable types in type set */ == x
-	_ = x /* ERROR incomparable types in type set */ == y
-	_ = y /* ERROR incomparable types in type set */ == x
-	_ = y /* ERROR incomparable types in type set */ == y
+	_ = x /* ERROR "incomparable types in type set" */ == x
+	_ = x /* ERROR "incomparable types in type set" */ == y
+	_ = y /* ERROR "incomparable types in type set" */ == x
+	_ = y /* ERROR "incomparable types in type set" */ == y
 
-	_ = x /* ERROR type parameter P is not comparable with < */ < y
+	_ = x /* ERROR "type parameter P is not comparable with <" */ < y
 }
 
 func _[P any](x P, y any) {
-	_ = x /* ERROR incomparable types in type set */ == x
-	_ = x /* ERROR incomparable types in type set */ == y
-	_ = y == x // ERROR incomparable types in type set
+	_ = x /* ERROR "incomparable types in type set" */ == x
+	_ = x /* ERROR "incomparable types in type set" */ == y
+	_ = y == x // ERROR "incomparable types in type set"
 	_ = y == y
 
-	_ = x /* ERROR type parameter P is not comparable with < */ < y
+	_ = x /* ERROR "type parameter P is not comparable with <" */ < y
 }
diff --git a/src/internal/types/testdata/fixedbugs/issue48819.go b/src/internal/types/testdata/fixedbugs/issue48819.go
index 5d61803..916faaf 100644
--- a/src/internal/types/testdata/fixedbugs/issue48819.go
+++ b/src/internal/types/testdata/fixedbugs/issue48819.go
@@ -6,7 +6,7 @@
 
 import "unsafe"
 
-type T /* ERROR invalid recursive type: T refers to itself */ struct {
+type T /* ERROR "invalid recursive type: T refers to itself" */ struct {
 	T
 }
 
diff --git a/src/internal/types/testdata/fixedbugs/issue48827.go b/src/internal/types/testdata/fixedbugs/issue48827.go
index aa1d12a..bd08835 100644
--- a/src/internal/types/testdata/fixedbugs/issue48827.go
+++ b/src/internal/types/testdata/fixedbugs/issue48827.go
@@ -8,12 +8,12 @@
 
 type (
 	_ G[int]
-	_ G[G /* ERROR "cannot use.*without instantiation" */]
-	_ bool /* ERROR "invalid operation: bool\[int\] \(bool is not a generic type\)" */ [int]
-	_ bool /* ERROR "invalid operation: bool\[G\] \(bool is not a generic type\)" */[G]
+	_ G[G /* ERRORx `cannot use.*without instantiation` */]
+	_ bool /* ERROR "invalid operation: bool[int] (bool is not a generic type)" */ [int]
+	_ bool /* ERROR "invalid operation: bool[G] (bool is not a generic type)" */[G]
 )
 
 // The example from the issue.
 func _() {
-	_ = &([10]bool /* ERROR "invalid operation.*bool is not a generic type" */ [1 /* ERROR "expected type" */ ]{})
+	_ = &([10]bool /* ERRORx `invalid operation.*bool is not a generic type` */ [1 /* ERROR "expected type" */ ]{})
 }
diff --git a/src/internal/types/testdata/fixedbugs/issue48951.go b/src/internal/types/testdata/fixedbugs/issue48951.go
index c94b027..8d6f850 100644
--- a/src/internal/types/testdata/fixedbugs/issue48951.go
+++ b/src/internal/types/testdata/fixedbugs/issue48951.go
@@ -5,17 +5,17 @@
 package p
 
 type (
-        A1[P any] [10]A1 /* ERROR invalid recursive type */ [P]
-        A2[P any] [10]A2 /* ERROR invalid recursive type */ [*P]
+        A1[P any] [10]A1 /* ERROR "invalid recursive type" */ [P]
+        A2[P any] [10]A2 /* ERROR "invalid recursive type" */ [*P]
         A3[P any] [10]*A3[P]
 
         L1[P any] []L1[P]
 
-        S1[P any] struct{ f S1 /* ERROR invalid recursive type */ [P] }
-        S2[P any] struct{ f S2 /* ERROR invalid recursive type */ [*P] } // like example in issue
+        S1[P any] struct{ f S1 /* ERROR "invalid recursive type" */ [P] }
+        S2[P any] struct{ f S2 /* ERROR "invalid recursive type" */ [*P] } // like example in issue
         S3[P any] struct{ f *S3[P] }
 
-        I1[P any] interface{ I1 /* ERROR invalid recursive type */ [P] }
-        I2[P any] interface{ I2 /* ERROR invalid recursive type */ [*P] }
-        I3[P any] interface{ *I3 /* ERROR interface contains type constraints */ [P] }
+        I1[P any] interface{ I1 /* ERROR "invalid recursive type" */ [P] }
+        I2[P any] interface{ I2 /* ERROR "invalid recursive type" */ [*P] }
+        I3[P any] interface{ *I3 /* ERROR "interface contains type constraints" */ [P] }
 )
diff --git a/src/internal/types/testdata/fixedbugs/issue48962.go b/src/internal/types/testdata/fixedbugs/issue48962.go
index 05c681d..4294cf0 100644
--- a/src/internal/types/testdata/fixedbugs/issue48962.go
+++ b/src/internal/types/testdata/fixedbugs/issue48962.go
@@ -8,6 +8,6 @@
 	f P
 }
 
-type T1 /* ERROR invalid recursive type */ struct {
+type T1 /* ERROR "invalid recursive type" */ struct {
 	_ T0[T1]
 }
diff --git a/src/internal/types/testdata/fixedbugs/issue48974.go b/src/internal/types/testdata/fixedbugs/issue48974.go
index d8ff7c8..08d8656 100644
--- a/src/internal/types/testdata/fixedbugs/issue48974.go
+++ b/src/internal/types/testdata/fixedbugs/issue48974.go
@@ -8,7 +8,7 @@
 	Foo()
 }
 
-type Fooable[F /* ERROR instantiation cycle */ Fooer] struct {
+type Fooable[F /* ERROR "instantiation cycle" */ Fooer] struct {
 	ptr F
 }
 
diff --git a/src/internal/types/testdata/fixedbugs/issue49003.go b/src/internal/types/testdata/fixedbugs/issue49003.go
index ece1a27..bf2e6c4 100644
--- a/src/internal/types/testdata/fixedbugs/issue49003.go
+++ b/src/internal/types/testdata/fixedbugs/issue49003.go
@@ -7,4 +7,4 @@
 func f(s string) int {
 	for range s {
 	}
-} // ERROR missing return
+} // ERROR "missing return"
diff --git a/src/internal/types/testdata/fixedbugs/issue49005.go b/src/internal/types/testdata/fixedbugs/issue49005.go
index 5f551b9..d91c207 100644
--- a/src/internal/types/testdata/fixedbugs/issue49005.go
+++ b/src/internal/types/testdata/fixedbugs/issue49005.go
@@ -8,11 +8,11 @@
 
 func F1() T1
 
-var _ = F1().(*X1 /* ERROR undefined: X1 */)
+var _ = F1().(*X1 /* ERROR "undefined: X1" */)
 
 func _() {
 	switch F1().(type) {
-	case *X1 /* ERROR undefined: X1 */ :
+	case *X1 /* ERROR "undefined: X1" */ :
 	}
 }
 
@@ -20,12 +20,12 @@
 
 func F2() T2
 
-var _ = F2 /* ERROR impossible type assertion: F2\(\)\.\(\*X2\)\n\t\*X2 does not implement T2 \(missing method M\) */ ().(*X2)
+var _ = F2 /* ERROR "impossible type assertion: F2().(*X2)\n\t*X2 does not implement T2 (missing method M)" */ ().(*X2)
 
 type X2 struct{}
 
 func _() {
 	switch F2().(type) {
-	case * /* ERROR impossible type switch case: \*X2\n\tF2\(\) \(value of type T2\) cannot have dynamic type \*X2 \(missing method M\) */ X2:
+	case * /* ERROR "impossible type switch case: *X2\n\tF2() (value of type T2) cannot have dynamic type *X2 (missing method M)" */ X2:
 	}
 }
diff --git a/src/internal/types/testdata/fixedbugs/issue49043.go b/src/internal/types/testdata/fixedbugs/issue49043.go
index 3971cf8..7594b32 100644
--- a/src/internal/types/testdata/fixedbugs/issue49043.go
+++ b/src/internal/types/testdata/fixedbugs/issue49043.go
@@ -6,13 +6,13 @@
 
 // The example from the issue.
 type (
-	N[P any] M /* ERROR invalid recursive type */ [P]
+	N[P any] M /* ERROR "invalid recursive type" */ [P]
 	M[P any] N[P]
 )
 
 // A slightly more complicated case.
 type (
-	A[P any] B /* ERROR invalid recursive type */ [P]
+	A[P any] B /* ERROR "invalid recursive type" */ [P]
 	B[P any] C[P]
 	C[P any] A[P]
 )
diff --git a/src/internal/types/testdata/fixedbugs/issue49112.go b/src/internal/types/testdata/fixedbugs/issue49112.go
index dea2608..e87d1c0 100644
--- a/src/internal/types/testdata/fixedbugs/issue49112.go
+++ b/src/internal/types/testdata/fixedbugs/issue49112.go
@@ -7,9 +7,9 @@
 func f[P int](P) {}
 
 func _() {
-        _ = f[int]
-        _ = f[[ /* ERROR \[\]int does not satisfy int */ ]int]
+	_ = f[int]
+	_ = f[[ /* ERROR "[]int does not satisfy int ([]int missing in int)" */ ]int]
 
-        f(0)
-        f/* ERROR \[\]int does not satisfy int */ ([]int{})
+	f(0)
+	f /* ERROR "P (type []int) does not satisfy int" */ ([]int{}) // TODO(gri) better error message
 }
diff --git a/src/internal/types/testdata/fixedbugs/issue49179.go b/src/internal/types/testdata/fixedbugs/issue49179.go
index 2ddfa33..1f8da29 100644
--- a/src/internal/types/testdata/fixedbugs/issue49179.go
+++ b/src/internal/types/testdata/fixedbugs/issue49179.go
@@ -13,11 +13,11 @@
 
 func _() {
 	_ = f1[int]
-	_ = f1[myInt /* ERROR possibly missing ~ for int in int \| string */]
+	_ = f1[myInt /* ERROR "possibly missing ~ for int in int | string" */]
 	_ = f2[myInt]
-	_ = f2[myFloat /* ERROR possibly missing ~ for float64 in ~int \| string \| float64 */]
+	_ = f2[myFloat /* ERROR "possibly missing ~ for float64 in ~int | string | float64" */]
 	var x myInt
-	f3 /* ERROR myInt does not satisfy int \(possibly missing ~ for int in int\) */ (x)
+	f3 /* ERROR "myInt does not satisfy int (possibly missing ~ for int in int)" */ (x)
 }
 
 // test case from the issue
@@ -33,5 +33,5 @@
 type MySlice []int
 
 func f(s MySlice) {
-	Map[MySlice /* ERROR MySlice does not satisfy SliceConstraint\[int\] \(possibly missing ~ for \[\]int in SliceConstraint\[int\]\) */, int](s, nil)
+	Map[MySlice /* ERROR "MySlice does not satisfy SliceConstraint[int] (possibly missing ~ for []int in SliceConstraint[int])" */, int](s, nil)
 }
diff --git a/src/internal/types/testdata/fixedbugs/issue49242.go b/src/internal/types/testdata/fixedbugs/issue49242.go
index 524a0cb..0415bf6 100644
--- a/src/internal/types/testdata/fixedbugs/issue49242.go
+++ b/src/internal/types/testdata/fixedbugs/issue49242.go
@@ -5,23 +5,23 @@
 package p
 
 func _[P int](x P) int {
-	return x // ERROR cannot use x .* as int value in return statement
+	return x // ERRORx `cannot use x .* as int value in return statement`
 }
 
 func _[P int]() int {
-	return P /* ERROR cannot use P\(1\) .* as int value in return statement */ (1)
+	return P /* ERRORx `cannot use P\(1\) .* as int value in return statement` */ (1)
 }
 
 func _[P int](x int) P {
-        return x // ERROR cannot use x .* as P value in return statement
+        return x // ERRORx `cannot use x .* as P value in return statement`
 }
 
 func _[P, Q any](x P) Q {
-        return x // ERROR cannot use x .* as Q value in return statement
+        return x // ERRORx `cannot use x .* as Q value in return statement`
 }
 
 // test case from issue
 func F[G interface{ uint }]() int {
 	f := func(uint) int { return 0 }
-	return f(G /* ERROR cannot use G\(1\) .* as uint value in argument to f */ (1))
+	return f(G /* ERRORx `cannot use G\(1\) .* as uint value in argument to f` */ (1))
 }
diff --git a/src/internal/types/testdata/fixedbugs/issue49247.go b/src/internal/types/testdata/fixedbugs/issue49247.go
index 5be6001..0ad2e29 100644
--- a/src/internal/types/testdata/fixedbugs/issue49247.go
+++ b/src/internal/types/testdata/fixedbugs/issue49247.go
@@ -11,10 +11,10 @@
 
 func Add1024[T integer](s []T) {
 	for i, v := range s {
-		s[i] = v + 1024 // ERROR cannot convert 1024 \(untyped int constant\) to type T
+		s[i] = v + 1024 // ERROR "cannot convert 1024 (untyped int constant) to type T"
 	}
 }
 
 func f[T interface{ int8 }]() {
-	println(T(1024 /* ERROR cannot convert 1024 \(untyped int value\) to type T */))
+	println(T(1024 /* ERROR "cannot convert 1024 (untyped int value) to type T" */))
 }
diff --git a/src/internal/types/testdata/fixedbugs/issue49276.go b/src/internal/types/testdata/fixedbugs/issue49276.go
index ab5794a..bdfb42f 100644
--- a/src/internal/types/testdata/fixedbugs/issue49276.go
+++ b/src/internal/types/testdata/fixedbugs/issue49276.go
@@ -6,7 +6,7 @@
 
 import "unsafe"
 
-type S /* ERROR invalid recursive type S */ struct {
+type S /* ERROR "invalid recursive type S" */ struct {
 	_ [unsafe.Sizeof(s)]byte
 }
 
@@ -15,7 +15,7 @@
 // Since f is a pointer, this case could be valid.
 // But it's pathological and not worth the expense.
 type T struct {
-	f *[unsafe.Sizeof(T /* ERROR invalid recursive type */ {})]int
+	f *[unsafe.Sizeof(T /* ERROR "invalid recursive type" */ {})]int
 }
 
 // a mutually recursive case using unsafe.Sizeof
@@ -25,7 +25,7 @@
 	}
 
 	B1 struct {
-		_ [unsafe.Sizeof(A1 /* ERROR invalid recursive type */ {})]int
+		_ [unsafe.Sizeof(A1 /* ERROR "invalid recursive type" */ {})]int
 	}
 )
 
@@ -36,11 +36,11 @@
 	}
 
 	B2 struct {
-		f [len(A2 /* ERROR invalid recursive type */ {}.f)]int
+		f [len(A2 /* ERROR "invalid recursive type" */ {}.f)]int
 	}
 )
 
 // test case from issue
 type a struct {
-	_ [42 - unsafe.Sizeof(a /* ERROR invalid recursive type */ {})]byte
+	_ [42 - unsafe.Sizeof(a /* ERROR "invalid recursive type" */ {})]byte
 }
diff --git a/src/internal/types/testdata/fixedbugs/issue49296.go b/src/internal/types/testdata/fixedbugs/issue49296.go
index 98ad6f5..c8c5208 100644
--- a/src/internal/types/testdata/fixedbugs/issue49296.go
+++ b/src/internal/types/testdata/fixedbugs/issue49296.go
@@ -9,12 +9,12 @@
         T1 []int,
         T2 ~float64 | ~complex128 | chan int,
 ]() {
-        _ = T0(nil /* ERROR cannot convert nil to type T0 */ )
-        _ = T1(1 /* ERROR cannot convert 1 .* to type T1 */ )
-        _ = T2(2 /* ERROR cannot convert 2 .* to type T2 */ )
+        _ = T0(nil /* ERROR "cannot convert nil to type T0" */ )
+        _ = T1(1 /* ERRORx `cannot convert 1 .* to type T1` */ )
+        _ = T2(2 /* ERRORx `cannot convert 2 .* to type T2` */ )
 }
 
 // test case from issue
 func f[T interface{[]int}]() {
-	_ = T(1 /* ERROR cannot convert */ )
+	_ = T(1 /* ERROR "cannot convert" */ )
 }
diff --git a/src/internal/types/testdata/fixedbugs/issue49439.go b/src/internal/types/testdata/fixedbugs/issue49439.go
index b8ad495..3852f16 100644
--- a/src/internal/types/testdata/fixedbugs/issue49439.go
+++ b/src/internal/types/testdata/fixedbugs/issue49439.go
@@ -6,12 +6,12 @@
 
 import "unsafe"
 
-type T0 /* ERROR invalid recursive type */ [P T0[P]] struct{}
+type T0 /* ERROR "invalid recursive type" */ [P T0[P]] struct{}
 
-type T1 /* ERROR invalid recursive type */ [P T2[P]] struct{}
+type T1 /* ERROR "invalid recursive type" */ [P T2[P]] struct{}
 type T2[P T1[P]] struct{}
 
-type T3 /* ERROR invalid recursive type */ [P interface{ ~struct{ f T3[int] } }] struct{}
+type T3 /* ERROR "invalid recursive type" */ [P interface{ ~struct{ f T3[int] } }] struct{}
 
 // valid cycle in M
 type N[P M[P]] struct{}
@@ -23,4 +23,4 @@
 })]byte] struct{}
 
 // test case from issue
-type X /* ERROR invalid recursive type */ [T any, PT X[T]] interface{}
+type X /* ERROR "invalid recursive type" */ [T any, PT X[T]] interface{}
diff --git a/src/internal/types/testdata/fixedbugs/issue49482.go b/src/internal/types/testdata/fixedbugs/issue49482.go
index 2b9e748..7139bae 100644
--- a/src/internal/types/testdata/fixedbugs/issue49482.go
+++ b/src/internal/types/testdata/fixedbugs/issue49482.go
@@ -12,8 +12,8 @@
 const P = 2 // declare P to avoid noisy 'undefined' errors below.
 
 // The following parse as invalid array types due to parsing ambiguitiues.
-type _ [P *int /* ERROR "int \(type\) is not an expression" */ ]int
-type _ [P /* ERROR non-function P */ (*int)]int
+type _ [P *int /* ERROR "int (type) is not an expression" */ ]int
+type _ [P /* ERROR "non-function P" */ (*int)]int
 
 // Adding a trailing comma or an enclosing interface resolves the ambiguity.
 type _[P *int,] int
diff --git a/src/internal/types/testdata/fixedbugs/issue49541.go b/src/internal/types/testdata/fixedbugs/issue49541.go
index c8499c1..da37311 100644
--- a/src/internal/types/testdata/fixedbugs/issue49541.go
+++ b/src/internal/types/testdata/fixedbugs/issue49541.go
@@ -13,7 +13,7 @@
 // TODO(gri): with type-type inference enabled we should only report one error
 // below. See issue #50588.
 
-func _[A any](s S /* ERROR got 1 arguments but 2 type parameters */ [A]) {
+func _[A any](s S /* ERROR "got 1 arguments but 2 type parameters" */ [A]) {
 	// we should see no follow-on errors below
 	s.f = 1
 	s.m()
@@ -22,7 +22,7 @@
 // another test case from the issue
 
 func _() {
-	X(Interface[*F /* ERROR got 1 arguments but 2 type parameters */ [string]](Impl{}))
+	X /* ERROR "cannot infer Q" */ (Interface[*F /* ERROR "got 1 arguments but 2 type parameters" */ [string]](Impl{}))
 }
 
 func X[Q Qer](fs Interface[Q]) {
diff --git a/src/internal/types/testdata/fixedbugs/issue49579.go b/src/internal/types/testdata/fixedbugs/issue49579.go
index ee2d94a..780859c 100644
--- a/src/internal/types/testdata/fixedbugs/issue49579.go
+++ b/src/internal/types/testdata/fixedbugs/issue49579.go
@@ -9,7 +9,7 @@
 }
 
 func G[F any]() I[any] {
-	return g /* ERROR cannot use g\[F\]{} .* as I\[any\] value in return statement: g\[F\] does not implement I\[any\] \(method Q has pointer receiver\) */ [F]{}
+	return g /* ERRORx `cannot use g\[F\]{} .* as I\[any\] value in return statement: g\[F\] does not implement I\[any\] \(method Q has pointer receiver\)` */ [F]{}
 }
 
 type g[F any] struct{}
diff --git a/src/internal/types/testdata/fixedbugs/issue49602.go b/src/internal/types/testdata/fixedbugs/issue49602.go
index 208501f..09cc969 100644
--- a/src/internal/types/testdata/fixedbugs/issue49602.go
+++ b/src/internal/types/testdata/fixedbugs/issue49602.go
@@ -13,7 +13,7 @@
 }
 
 type _ interface {
-	int | M          // ERROR cannot use p\.M in union \(p\.M contains methods\)
-	int | comparable // ERROR cannot use comparable in union
-	int | C          // ERROR cannot use p\.C in union \(p\.C embeds comparable\)
+	int | M          // ERROR "cannot use p.M in union (p.M contains methods)"
+	int | comparable // ERROR "cannot use comparable in union"
+	int | C          // ERROR "cannot use p.C in union (p.C embeds comparable)"
 }
diff --git a/src/internal/types/testdata/fixedbugs/issue49735.go b/src/internal/types/testdata/fixedbugs/issue49735.go
index 5087022..0fcc778 100644
--- a/src/internal/types/testdata/fixedbugs/issue49735.go
+++ b/src/internal/types/testdata/fixedbugs/issue49735.go
@@ -5,7 +5,7 @@
 package p
 
 func _[P1 any, P2 ~byte](s1 P1, s2 P2) {
-        _ = append(nil /* ERROR first argument to append must be a slice; have untyped nil */ , 0)
-        _ = append(s1 /* ERROR s1 .* has no core type */ , 0)
-        _ = append(s2 /* ERROR s2 .* has core type byte */ , 0)
+        _ = append(nil /* ERROR "first argument to append must be a slice; have untyped nil" */ , 0)
+        _ = append(s1 /* ERRORx `s1 .* has no core type` */ , 0)
+        _ = append(s2 /* ERRORx `s2 .* has core type byte` */ , 0)
 }
diff --git a/src/internal/types/testdata/fixedbugs/issue49739.go b/src/internal/types/testdata/fixedbugs/issue49739.go
index 7feb563..73825f4 100644
--- a/src/internal/types/testdata/fixedbugs/issue49739.go
+++ b/src/internal/types/testdata/fixedbugs/issue49739.go
@@ -9,7 +9,7 @@
 
 type A int
 type C interface {
-	~ /* ERROR invalid use of ~ */ A
+	~ /* ERROR "invalid use of ~" */ A
 }
 
 func f[_ C]()              {}
@@ -17,7 +17,7 @@
 func h[_ C | int]()        {}
 
 func _() {
-	_ = f[int /* ERROR cannot satisfy C \(empty type set\) */]
-	_ = g[int /* ERROR cannot satisfy interface{C} \(empty type set\) */]
+	_ = f[int /* ERROR "cannot satisfy C (empty type set)" */]
+	_ = g[int /* ERROR "cannot satisfy interface{C} (empty type set)" */]
 	_ = h[int]
 }
diff --git a/src/internal/types/testdata/fixedbugs/issue49864.go b/src/internal/types/testdata/fixedbugs/issue49864.go
index 0437e74..8ccd77c 100644
--- a/src/internal/types/testdata/fixedbugs/issue49864.go
+++ b/src/internal/types/testdata/fixedbugs/issue49864.go
@@ -5,5 +5,5 @@
 package p
 
 func _[P ~int, Q any](p P) {
-	_ = Q(p /* ERROR cannot convert */ )
+	_ = Q(p /* ERROR "cannot convert" */ )
 }
diff --git a/src/internal/types/testdata/fixedbugs/issue50321.go b/src/internal/types/testdata/fixedbugs/issue50321.go
index 199e66e..ab2a31b 100644
--- a/src/internal/types/testdata/fixedbugs/issue50321.go
+++ b/src/internal/types/testdata/fixedbugs/issue50321.go
@@ -4,5 +4,5 @@
 
 package p
 
-func Ln[A A /* ERROR cannot use a type parameter as constraint */ ](p A) {
+func Ln[A A /* ERROR "cannot use a type parameter as constraint" */ ](p A) {
 }
diff --git a/src/internal/types/testdata/fixedbugs/issue50372.go b/src/internal/types/testdata/fixedbugs/issue50372.go
index 4c9b65a..10d2a24 100644
--- a/src/internal/types/testdata/fixedbugs/issue50372.go
+++ b/src/internal/types/testdata/fixedbugs/issue50372.go
@@ -11,8 +11,8 @@
         for range s {}
         for i = range s {}
         for i, j = range s {}
-        for i, j, k /* ERROR range clause permits at most two iteration variables|at most 2 expressions */ = range s {}
-        for i, j, k, l /* ERROR range clause permits at most two iteration variables|at most 2 expressions */ = range s {}
+        for i, j, k /* ERRORx "range clause permits at most two iteration variables|at most 2 expressions" */ = range s {}
+        for i, j, k, l /* ERRORx "range clause permits at most two iteration variables|at most 2 expressions" */ = range s {}
 }
 
 func _(s chan int) {
@@ -21,7 +21,7 @@
 
         for range s {}
         for i = range s {}
-        for i, j /* ERROR range over .* permits only one iteration variable */ = range s {}
-        for i, j, k /* ERROR range over .* permits only one iteration variable|at most 2 expressions */ = range s {}
-        for i, j, k, l /* ERROR range over .* permits only one iteration variable|at most 2 expressions */ = range s {}
+        for i, j /* ERRORx `range over .* permits only one iteration variable` */ = range s {}
+        for i, j, k /* ERRORx `range over .* permits only one iteration variable|at most 2 expressions` */ = range s {}
+        for i, j, k, l /* ERRORx `range over .* permits only one iteration variable|at most 2 expressions` */ = range s {}
 }
diff --git a/src/internal/types/testdata/fixedbugs/issue50417.go b/src/internal/types/testdata/fixedbugs/issue50417.go
index 69ebf31..c70898e 100644
--- a/src/internal/types/testdata/fixedbugs/issue50417.go
+++ b/src/internal/types/testdata/fixedbugs/issue50417.go
@@ -13,29 +13,29 @@
 }
 
 func f0[P Sf](p P) {
-        _ = p.f // ERROR p\.f undefined
-        p.f /* ERROR p\.f undefined */ = 0
+        _ = p.f // ERROR "p.f undefined"
+        p.f /* ERROR "p.f undefined" */ = 0
 }
 
 func f0t[P ~struct{f int}](p P) {
-        _ = p.f // ERROR p\.f undefined
-        p.f /* ERROR p\.f undefined */ = 0
+        _ = p.f // ERROR "p.f undefined"
+        p.f /* ERROR "p.f undefined" */ = 0
 }
 
 var _ = f0[Sf]
 var _ = f0t[Sf]
 
-var _ = f0[Sm /* ERROR does not satisfy */ ]
-var _ = f0t[Sm /* ERROR does not satisfy */ ]
+var _ = f0[Sm /* ERROR "does not satisfy" */ ]
+var _ = f0t[Sm /* ERROR "does not satisfy" */ ]
 
 func f1[P interface{ Sf; m() }](p P) {
-        _ = p.f // ERROR p\.f undefined
-        p.f /* ERROR p\.f undefined */ = 0
+        _ = p.f // ERROR "p.f undefined"
+        p.f /* ERROR "p.f undefined" */ = 0
         p.m()
 }
 
-var _ = f1[Sf /* ERROR missing method m */ ]
-var _ = f1[Sm /* ERROR does not satisfy */ ]
+var _ = f1[Sf /* ERROR "missing method m" */ ]
+var _ = f1[Sm /* ERROR "does not satisfy" */ ]
 
 type Sm struct {}
 
@@ -48,8 +48,8 @@
 func (Sfm) m() {}
 
 func f2[P interface{ Sfm; m() }](p P) {
-        _ = p.f // ERROR p\.f undefined
-        p.f /* ERROR p\.f undefined */ = 0
+        _ = p.f // ERROR "p.f undefined"
+        p.f /* ERROR "p.f undefined" */ = 0
         p.m()
 }
 
@@ -60,9 +60,9 @@
 type PSfm *Sfm
 
 func f3[P interface{ PSfm }](p P) {
-        _ = p.f // ERROR p\.f undefined
-        p.f /* ERROR p\.f undefined */ = 0
-        p.m /* ERROR type P has no field or method m */ ()
+        _ = p.f // ERROR "p.f undefined"
+        p.f /* ERROR "p.f undefined" */ = 0
+        p.m /* ERROR "type P has no field or method m" */ ()
 }
 
 var _ = f3[PSfm]
diff --git a/src/internal/types/testdata/fixedbugs/issue50516.go b/src/internal/types/testdata/fixedbugs/issue50516.go
index f73015e..fcaefed 100644
--- a/src/internal/types/testdata/fixedbugs/issue50516.go
+++ b/src/internal/types/testdata/fixedbugs/issue50516.go
@@ -5,9 +5,9 @@
 package p
 
 func _[P struct{ f int }](x P) {
-	_ = x.g // ERROR type P has no field or method g
+	_ = x.g // ERROR "type P has no field or method g"
 }
 
 func _[P struct{ f int } | struct{ g int }](x P) {
-	_ = x.g // ERROR type P has no field or method g
+	_ = x.g // ERROR "type P has no field or method g"
 }
diff --git a/src/internal/types/testdata/fixedbugs/issue50646.go b/src/internal/types/testdata/fixedbugs/issue50646.go
index ed7261c..2c16cfc 100644
--- a/src/internal/types/testdata/fixedbugs/issue50646.go
+++ b/src/internal/types/testdata/fixedbugs/issue50646.go
@@ -1,5 +1,3 @@
-// -oldComparableSemantics
-
 // Copyright 2022 The Go Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
@@ -13,16 +11,16 @@
 
 func _[P comparable, Q ~int, R any]() {
 	_ = f1[int]
-	_ = f1[T /* ERROR T does not satisfy comparable */ ]
-	_ = f1[any /* ERROR any does not satisfy comparable */ ]
+	_ = f1[T]
+	_ = f1[any]
 	_ = f1[P]
 	_ = f1[Q]
-	_ = f1[R /* ERROR R does not satisfy comparable */]
+	_ = f1[R /* ERROR "R does not satisfy comparable" */]
 
 	_ = f2[int]
-	_ = f2[T /* ERROR T does not satisfy comparable */ ]
-	_ = f2[any /* ERROR any does not satisfy comparable */ ]
+	_ = f2[T]
+	_ = f2[any]
 	_ = f2[P]
 	_ = f2[Q]
-	_ = f2[R /* ERROR R does not satisfy comparable */]
+	_ = f2[R /* ERROR "R does not satisfy comparable" */]
 }
diff --git a/src/internal/types/testdata/fixedbugs/issue50779.go b/src/internal/types/testdata/fixedbugs/issue50779.go
index fe68c28..09ddf53 100644
--- a/src/internal/types/testdata/fixedbugs/issue50779.go
+++ b/src/internal/types/testdata/fixedbugs/issue50779.go
@@ -15,7 +15,7 @@
 type SR = R[SS, ST]
 
 type SS interface {
-	NSR(any) *SR // ERROR invalid use of type alias SR in recursive type
+	NSR(any) *SR // ERROR "invalid use of type alias SR in recursive type"
 }
 
 type C interface {
diff --git a/src/internal/types/testdata/fixedbugs/issue50782.go b/src/internal/types/testdata/fixedbugs/issue50782.go
index 0e7b712..97e8f6c 100644
--- a/src/internal/types/testdata/fixedbugs/issue50782.go
+++ b/src/internal/types/testdata/fixedbugs/issue50782.go
@@ -21,10 +21,10 @@
 
 // AbsDifference computes the absolute value of the difference of
 // a and b, where the absolute value is determined by the Abs method.
-func absDifference[T numericAbs[T /* ERROR T does not satisfy Numeric */]](a, b T) T {
+func absDifference[T numericAbs[T /* ERROR "T does not satisfy Numeric" */]](a, b T) T {
 	// Field accesses are not permitted for now. Keep an error so
 	// we can find and fix this code once the situation changes.
-	return a.Value // ERROR a\.Value undefined
+	return a.Value // ERROR "a.Value undefined"
 	// TODO: The error below should probably be positioned on the '-'.
 	// d := a /* ERROR "invalid operation: operator - not defined" */ .Value - b.Value
 	// return d.Abs()
@@ -36,12 +36,12 @@
 func _[P T[P /* ERROR "P does not satisfy int" */ ]]() {}
 
 // Additional tests
-func _[P T[T /* ERROR "T\[P\] does not satisfy int" */ [P /* ERROR "P does not satisfy int" */ ]]]() {}
+func _[P T[T /* ERROR "T[P] does not satisfy int" */ [P /* ERROR "P does not satisfy int" */ ]]]() {}
 func _[P T[Q /* ERROR "Q does not satisfy int" */ ], Q T[P /* ERROR "P does not satisfy int" */ ]]() {}
 func _[P T[Q], Q int]() {}
 
 type C[P comparable] struct{ f P }
 func _[P C[C[P]]]() {}
-func _[P C[C /* ERROR "C\[Q\] does not satisfy comparable" */ [Q /* ERROR "Q does not satisfy comparable" */]], Q func()]() {}
+func _[P C[C /* ERROR "C[Q] does not satisfy comparable" */ [Q /* ERROR "Q does not satisfy comparable" */]], Q func()]() {}
 func _[P [10]C[P]]() {}
 func _[P struct{ f C[C[P]]}]() {}
diff --git a/src/internal/types/testdata/fixedbugs/issue50816.go b/src/internal/types/testdata/fixedbugs/issue50816.go
index e7e31d9..b7c28cd 100644
--- a/src/internal/types/testdata/fixedbugs/issue50816.go
+++ b/src/internal/types/testdata/fixedbugs/issue50816.go
@@ -18,6 +18,6 @@
 
 func _() {
 	var i I
-	_ = i /* ERROR impossible type assertion: i\.\(T1\)\n\tT1 does not implement I \(missing method Foo\)\n\t\thave foo\(\)\n\t\twant Foo\(\) */ .(T1)
-	_ = i /* ERROR impossible type assertion: i\.\(T2\)\n\tT2 does not implement I \(missing method Foo\)\n\t\thave foo\(\) string\n\t\twant Foo\(\) */ .(T2)
+	_ = i /* ERROR "impossible type assertion: i.(T1)\n\tT1 does not implement I (missing method Foo)\n\t\thave foo()\n\t\twant Foo()" */ .(T1)
+	_ = i /* ERROR "impossible type assertion: i.(T2)\n\tT2 does not implement I (missing method Foo)\n\t\thave foo() string\n\t\twant Foo()" */ .(T2)
 }
diff --git a/src/internal/types/testdata/fixedbugs/issue50912.go b/src/internal/types/testdata/fixedbugs/issue50912.go
index f161925..a99fa7b 100644
--- a/src/internal/types/testdata/fixedbugs/issue50912.go
+++ b/src/internal/types/testdata/fixedbugs/issue50912.go
@@ -5,15 +5,15 @@
 package p
 
 func Real[P ~complex128](x P) {
-	_ = real(x /* ERROR not supported */ )
+	_ = real(x /* ERROR "not supported" */ )
 }
 
 func Imag[P ~complex128](x P) {
-	_ = imag(x /* ERROR not supported */ )
+	_ = imag(x /* ERROR "not supported" */ )
 }
 
 func Complex[P ~float64](x P) {
-	_ = complex(x /* ERROR not supported */ , 0)
-	_ = complex(0 /* ERROR not supported */ , x)
-	_ = complex(x /* ERROR not supported */ , x)
+	_ = complex(x /* ERROR "not supported" */ , 0)
+	_ = complex(0 /* ERROR "not supported" */ , x)
+	_ = complex(x /* ERROR "not supported" */ , x)
 }
diff --git a/src/internal/types/testdata/fixedbugs/issue50918.go b/src/internal/types/testdata/fixedbugs/issue50918.go
index 41604b8..5744fa8 100644
--- a/src/internal/types/testdata/fixedbugs/issue50918.go
+++ b/src/internal/types/testdata/fixedbugs/issue50918.go
@@ -14,8 +14,8 @@
 
 func _() {
 	var a1, b1 thing1
-	_ = a1 /* ERROR struct containing \[\]string cannot be compared */ == b1
+	_ = a1 /* ERROR "struct containing []string cannot be compared" */ == b1
 
 	var a2, b2 thing2
-	_ = a2 /* ERROR struct containing \[\]thing1 cannot be compared */ == b2
+	_ = a2 /* ERROR "struct containing []thing1 cannot be compared" */ == b2
 }
diff --git a/src/internal/types/testdata/fixedbugs/issue50929.go b/src/internal/types/testdata/fixedbugs/issue50929.go
index 45e0751..64c7cd6 100644
--- a/src/internal/types/testdata/fixedbugs/issue50929.go
+++ b/src/internal/types/testdata/fixedbugs/issue50929.go
@@ -16,8 +16,8 @@
 
 func _() {
 	// TODO(gri) only report one error below (issue #50932)
-	var x F /* ERROR got 1 arguments but 2 type parameters */ [int]
-	G(x /* ERROR does not match */)
+	var x F /* ERROR "got 1 arguments but 2 type parameters" */ [int]
+	G(x /* ERROR "does not match" */)
 }
 
 // test case from issue
@@ -46,23 +46,23 @@
 	fmt.Println(c)
 }
 
-func MMD[Rc RC /* ERROR got 1 arguments */ [RG], RG any, G any]() M /* ERROR got 2 arguments */ [Rc, RG] {
+func MMD[Rc RC /* ERROR "got 1 arguments" */ [RG], RG any, G any]() M /* ERROR "got 2 arguments" */ [Rc, RG] {
 
-	var nFn NFn /* ERROR got 2 arguments */ [Rc, RG]
+	var nFn NFn /* ERROR "got 2 arguments" */ [Rc, RG]
 
 	var empty Rc
 	switch any(empty).(type) {
-	case BC /* ERROR undefined: BC */ :
+	case BC /* ERROR "undefined: BC" */ :
 
 	case RSC[G]:
-		nFn = NSG /* ERROR cannot use NSG\[G\] */ [G]
+		nFn = NSG /* ERROR "cannot use NSG[G]" */ [G]
 	}
 
-	return M /* ERROR got 2 arguments */ [Rc, RG]{
+	return M /* ERROR "got 2 arguments" */ [Rc, RG]{
 		Fn: func(rc Rc) {
-			NC(nFn /* ERROR does not match */ )
+			NC(nFn /* ERROR "does not match" */ )
 		},
 	}
 
-	return M /* ERROR got 2 arguments */ [Rc, RG]{}
+	return M /* ERROR "got 2 arguments" */ [Rc, RG]{}
 }
diff --git a/src/internal/types/testdata/fixedbugs/issue50965.go b/src/internal/types/testdata/fixedbugs/issue50965.go
index bf2dcc9..79059e9 100644
--- a/src/internal/types/testdata/fixedbugs/issue50965.go
+++ b/src/internal/types/testdata/fixedbugs/issue50965.go
@@ -6,12 +6,12 @@
 
 func _(x int, c string) {
 	switch x {
-	case c /* ERROR invalid case c in switch on x \(mismatched types string and int\) */ :
+	case c /* ERROR "invalid case c in switch on x (mismatched types string and int)" */ :
 	}
 }
 
 func _(x, c []int) {
 	switch x {
-	case c /* ERROR invalid case c in switch on x \(slice can only be compared to nil\) */ :
+	case c /* ERROR "invalid case c in switch on x (slice can only be compared to nil)" */ :
 	}
 }
diff --git a/src/internal/types/testdata/fixedbugs/issue51025.go b/src/internal/types/testdata/fixedbugs/issue51025.go
index 207b06e..caaabd5 100644
--- a/src/internal/types/testdata/fixedbugs/issue51025.go
+++ b/src/internal/types/testdata/fixedbugs/issue51025.go
@@ -4,19 +4,19 @@
 
 package p
 
-var _ interface{ m() } = struct /* ERROR m is a field, not a method */ {
+var _ interface{ m() } = struct /* ERROR "m is a field, not a method" */ {
 	m func()
 }{}
 
-var _ interface{ m() } = & /* ERROR m is a field, not a method */ struct {
+var _ interface{ m() } = & /* ERROR "m is a field, not a method" */ struct {
 	m func()
 }{}
 
-var _ interface{ M() } = struct /* ERROR missing method M */ {
+var _ interface{ M() } = struct /* ERROR "missing method M" */ {
 	m func()
 }{}
 
-var _ interface{ M() } = & /* ERROR missing method M */ struct {
+var _ interface{ M() } = & /* ERROR "missing method M" */ struct {
 	m func()
 }{}
 
@@ -33,6 +33,6 @@
 	var i I
 
 	i = m
-	i = t // ERROR m is a field, not a method
+	i = t // ERROR "m is a field, not a method"
 	_ = i
 }
diff --git a/src/internal/types/testdata/fixedbugs/issue51139.go b/src/internal/types/testdata/fixedbugs/issue51139.go
new file mode 100644
index 0000000..4c460d4
--- /dev/null
+++ b/src/internal/types/testdata/fixedbugs/issue51139.go
@@ -0,0 +1,26 @@
+// Copyright 2022 The Go Authors. 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
+
+func f[S []T, T any](S, T) {}
+
+func _() {
+	type L chan int
+	f([]L{}, make(chan int))
+	f([]L{}, make(L))
+	f([]chan int{}, make(chan int))
+	f /* ERROR "[]chan int does not satisfy []L ([]chan int missing in []p.L)" */ ([]chan int{}, make(L))
+}
+
+// test case from issue
+
+func Append[S ~[]T, T any](s S, x ...T) S { /* implementation of append */ return s }
+
+func _() {
+        type MyPtr *int
+        var x []MyPtr
+        _ = append(x, new(int))
+        _ = Append(x, new(int))
+}
diff --git a/src/internal/types/testdata/fixedbugs/issue51145.go b/src/internal/types/testdata/fixedbugs/issue51145.go
index b84391d..1f970d9 100644
--- a/src/internal/types/testdata/fixedbugs/issue51145.go
+++ b/src/internal/types/testdata/fixedbugs/issue51145.go
@@ -7,10 +7,10 @@
 import "fmt"
 
 type (
-	_ [fmt /* ERROR invalid array length fmt */ ]int
-	_ [float64 /* ERROR invalid array length float64 */ ]int
-	_ [f /* ERROR invalid array length f */ ]int
-	_ [nil /* ERROR invalid array length nil */ ]int
+	_ [fmt /* ERROR "invalid array length fmt" */ ]int
+	_ [float64 /* ERROR "invalid array length float64" */ ]int
+	_ [f /* ERROR "invalid array length f" */ ]int
+	_ [nil /* ERROR "invalid array length nil" */ ]int
 )
 
 func f()
diff --git a/src/internal/types/testdata/fixedbugs/issue51229.go b/src/internal/types/testdata/fixedbugs/issue51229.go
index 808b647..22a9113 100644
--- a/src/internal/types/testdata/fixedbugs/issue51229.go
+++ b/src/internal/types/testdata/fixedbugs/issue51229.go
@@ -105,11 +105,11 @@
 
 func _() {
 	// P can be inferred as there's a single specific type and no tilde.
-	var _ chan int = ch1 /* ERROR cannot use ch1.*value of type chan<- int */ ()
+	var _ chan int = ch1 /* ERRORx `cannot use ch1.*value of type chan<- int` */ ()
 	var _ chan<- int = ch1()
 
 	// P cannot be inferred as there's a tilde.
-	ch2 /* ERROR cannot infer P */ ()
+	ch2 /* ERROR "cannot infer P" */ ()
 	type myChan chan int
 	ch2[myChan]()
 
@@ -118,11 +118,11 @@
 	ch3(e)
 
 	// P cannot be inferred as there's more than one specific type and a tilde.
-	ch4 /* ERROR cannot infer P */ (e)
+	ch4 /* ERROR "cannot infer P" */ (e)
 	_ = ch4[chan int]
 
 	// P cannot be inferred as there's more than one specific type.
-	ch5 /* ERROR cannot infer P */ ()
+	ch5 /* ERROR "cannot infer P" */ ()
 	ch5[chan<- int]()
 }
 
diff --git a/src/internal/types/testdata/fixedbugs/issue51232.go b/src/internal/types/testdata/fixedbugs/issue51232.go
index 3fa6a05..27693a3 100644
--- a/src/internal/types/testdata/fixedbugs/issue51232.go
+++ b/src/internal/types/testdata/fixedbugs/issue51232.go
@@ -11,20 +11,20 @@
 type Fn[RCT RC[RG], RG any] func(RCT)
 
 type F[RCT RC[RG], RG any] interface {
-	Fn() Fn /* ERROR got 1 arguments */ [RCT]
+	Fn() Fn /* ERROR "got 1 arguments" */ [RCT]
 }
 
 type concreteF[RCT RC[RG], RG any] struct {
-	makeFn func() Fn /* ERROR got 1 arguments */ [RCT]
+	makeFn func() Fn /* ERROR "got 1 arguments" */ [RCT]
 }
 
-func (c *concreteF[RCT, RG]) Fn() Fn /* ERROR got 1 arguments */ [RCT] {
+func (c *concreteF[RCT, RG]) Fn() Fn /* ERROR "got 1 arguments" */ [RCT] {
 	return c.makeFn()
 }
 
-func NewConcrete[RCT RC[RG], RG any](Rc RCT) F /* ERROR got 1 arguments */ [RCT] {
+func NewConcrete[RCT RC[RG], RG any](Rc RCT) F /* ERROR "got 1 arguments" */ [RCT] {
 	// TODO(rfindley): eliminate the duplicate error below.
-	return & /* ERROR cannot use .* as F\[RCT\] */ concreteF /* ERROR got 1 arguments */ [RCT]{
+	return & /* ERRORx `cannot use .* as F\[RCT\]` */ concreteF /* ERROR "got 1 arguments" */ [RCT]{
 		makeFn: nil,
 	}
 }
diff --git a/src/internal/types/testdata/fixedbugs/issue51233.go b/src/internal/types/testdata/fixedbugs/issue51233.go
index 9c15028..e2f97fc 100644
--- a/src/internal/types/testdata/fixedbugs/issue51233.go
+++ b/src/internal/types/testdata/fixedbugs/issue51233.go
@@ -12,16 +12,16 @@
 
 type Fn[RCT RC[RG], RG any] func(RCT)
 
-type FFn[RCT RC[RG], RG any] func() Fn /* ERROR got 1 arguments */ [RCT]
+type FFn[RCT RC[RG], RG any] func() Fn /* ERROR "got 1 arguments" */ [RCT]
 
 type F[RCT RC[RG], RG any] interface {
-	Fn() Fn /* ERROR got 1 arguments */ [RCT]
+	Fn() Fn /* ERROR "got 1 arguments" */ [RCT]
 }
 
 type concreteF[RCT RC[RG], RG any] struct {
-	makeFn FFn /* ERROR got 1 arguments */ [RCT]
+	makeFn FFn /* ERROR "got 1 arguments" */ [RCT]
 }
 
-func (c *concreteF[RCT, RG]) Fn() Fn /* ERROR got 1 arguments */ [RCT] {
+func (c *concreteF[RCT, RG]) Fn() Fn /* ERROR "got 1 arguments" */ [RCT] {
 	return c.makeFn()
 }
diff --git a/src/internal/types/testdata/fixedbugs/issue51257.go b/src/internal/types/testdata/fixedbugs/issue51257.go
index be4b81f..828612b 100644
--- a/src/internal/types/testdata/fixedbugs/issue51257.go
+++ b/src/internal/types/testdata/fixedbugs/issue51257.go
@@ -1,5 +1,3 @@
-// -oldComparableSemantics
-
 // Copyright 2022 The Go Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
@@ -14,13 +12,13 @@
 
 func _[P1 comparable, P2 S2]() {
 	_ = f[S1]
-	_ = f[S2 /* ERROR S2 does not satisfy comparable */ ]
-	_ = f[S3 /* ERROR S3 does not satisfy comparable */ ]
+	_ = f[S2]
+	_ = f[S3]
 
 	type L1 struct { x P1 }
 	type L2 struct { x P2 }
 	_ = f[L1]
-	_ = f[L2 /* ERROR L2 does not satisfy comparable */ ]
+	_ = f[L2 /* ERROR "L2 does not satisfy comparable" */ ]
 }
 
 
@@ -41,7 +39,7 @@
 type T struct{ x any }
 
 func main() {
-	NewSetFromSlice /* ERROR T does not satisfy comparable */ ([]T{
+	NewSetFromSlice([]T{
 		{"foo"},
 		{5},
 	})
diff --git a/src/internal/types/testdata/fixedbugs/issue51335.go b/src/internal/types/testdata/fixedbugs/issue51335.go
index 35135cd..04dc04e 100644
--- a/src/internal/types/testdata/fixedbugs/issue51335.go
+++ b/src/internal/types/testdata/fixedbugs/issue51335.go
@@ -8,9 +8,9 @@
 type S2 struct{}
 
 func _[P *S1|*S2]() {
-	_= []P{{ /* ERROR invalid composite literal element type P \(no core type\) */ }}
+	_= []P{{ /* ERROR "invalid composite literal element type P (no core type)" */ }}
 }
 
 func _[P *S1|S1]() {
-	_= []P{{ /* ERROR invalid composite literal element type P \(no core type\) */ }}
+	_= []P{{ /* ERROR "invalid composite literal element type P (no core type)" */ }}
 }
diff --git a/src/internal/types/testdata/fixedbugs/issue51339.go b/src/internal/types/testdata/fixedbugs/issue51339.go
index 38f8610..65c2134 100644
--- a/src/internal/types/testdata/fixedbugs/issue51339.go
+++ b/src/internal/types/testdata/fixedbugs/issue51339.go
@@ -9,10 +9,10 @@
 
 type T[P any, B *P] struct{}
 
-func (T /* ERROR cannot use generic type */ ) m0() {}
+func (T /* ERROR "cannot use generic type" */ ) m0() {}
 
 // TODO(rfindley): eliminate the duplicate errors here.
-func (/* ERROR got 1 type parameter, but receiver base type declares 2 */ T /* ERROR got 1 arguments but 2 type parameters */ [_]) m1() {}
+func (/* ERROR "got 1 type parameter, but receiver base type declares 2" */ T /* ERROR "got 1 arguments but 2 type parameters" */ [_]) m1() {}
 func (T[_, _]) m2() {}
 // TODO(gri) this error is unfortunate (issue #51343)
-func (T /* ERROR got 3 arguments but 2 type parameters */ [_, _, _]) m3() {}
+func (T /* ERROR "got 3 arguments but 2 type parameters" */ [_, _, _]) m3() {}
diff --git a/src/internal/types/testdata/fixedbugs/issue51360.go b/src/internal/types/testdata/fixedbugs/issue51360.go
index fe3de04..1b9c45a 100644
--- a/src/internal/types/testdata/fixedbugs/issue51360.go
+++ b/src/internal/types/testdata/fixedbugs/issue51360.go
@@ -5,9 +5,9 @@
 package p
 
 func _() {
-	len.Println /* ERROR cannot select on len */
-	len.Println /* ERROR cannot select on len */ ()
-	_ = len.Println /* ERROR cannot select on len */
-	_ = len /* ERROR cannot index len */ [0]
-	_ = *len /* ERROR cannot indirect len */
+	len.Println /* ERROR "cannot select on len" */
+	len.Println /* ERROR "cannot select on len" */ ()
+	_ = len.Println /* ERROR "cannot select on len" */
+	_ = len /* ERROR "cannot index len" */ [0]
+	_ = *len /* ERROR "cannot indirect len" */
 }
diff --git a/src/internal/types/testdata/fixedbugs/issue51376.go b/src/internal/types/testdata/fixedbugs/issue51376.go
index 3801d68..0f2ab8e 100644
--- a/src/internal/types/testdata/fixedbugs/issue51376.go
+++ b/src/internal/types/testdata/fixedbugs/issue51376.go
@@ -12,7 +12,7 @@
 func _[M1 ~map[K]V, M2 map[K]V, K comparable, V any]() {
         var m1 M1
         f(m1)
-        g /* ERROR M1 does not satisfy map\[K\]V */ (m1) // M1 has tilde
+        g /* ERROR "M1 does not satisfy map[K]V" */ (m1) // M1 has tilde
 
         var m2 M2
         f(m2)
@@ -20,5 +20,5 @@
 
         var m3 Map
         f(m3)
-        g /* ERROR Map does not satisfy map\[string\]int */ (m3) // M in g does not have tilde
+        g /* ERROR "Map does not satisfy map[string]int" */ (m3) // M in g does not have tilde
 }
diff --git a/src/internal/types/testdata/fixedbugs/issue51472.go b/src/internal/types/testdata/fixedbugs/issue51472.go
index a0f9e9c..6dfff05 100644
--- a/src/internal/types/testdata/fixedbugs/issue51472.go
+++ b/src/internal/types/testdata/fixedbugs/issue51472.go
@@ -21,17 +21,17 @@
 }
 
 func _[T interface{comparable; ~[]byte}](x T) {
-        _ = x /* ERROR empty type set */ == x
+        _ = x /* ERROR "empty type set" */ == x
 }
 
 // TODO(gri) The error message here should be better. See issue #51525.
 func _[T interface{comparable; ~int; ~string}](x T) {
-        _ = x /* ERROR empty type set */ == x
+        _ = x /* ERROR "empty type set" */ == x
 }
 
 // TODO(gri) The error message here should be better. See issue #51525.
 func _[T interface{~int; ~string}](x T) {
-        _ = x /* ERROR empty type set */ == x
+        _ = x /* ERROR "empty type set" */ == x
 }
 
 func _[T interface{comparable; interface{~int}; interface{int|float64}}](x T) {
@@ -39,7 +39,7 @@
 }
 
 func _[T interface{interface{comparable; ~int}; interface{~float64; comparable; m()}}](x T) {
-        _ = x /* ERROR empty type set */ == x
+        _ = x /* ERROR "empty type set" */ == x
 }
 
 // test case from issue
@@ -49,6 +49,6 @@
 }
 
 func _(s []byte) {
-	f /* ERROR \[\]byte does not satisfy interface{comparable; \[\]byte \| string} */ (s)
-        _ = f[[ /* ERROR does not satisfy */ ]byte]
+	f /* ERROR "T (type []byte) does not satisfy interface{comparable; []byte | string}" */ (s) // TODO(gri) better error message (T's type set only contains string!)
+        _ = f[[ /* ERROR "does not satisfy" */ ]byte]
 }
diff --git a/src/internal/types/testdata/fixedbugs/issue51509.go b/src/internal/types/testdata/fixedbugs/issue51509.go
index 64f5d7e..4737a82 100644
--- a/src/internal/types/testdata/fixedbugs/issue51509.go
+++ b/src/internal/types/testdata/fixedbugs/issue51509.go
@@ -4,4 +4,4 @@
 
 package p
 
-type T /* ERROR invalid recursive type */ T.x
+type T /* ERROR "invalid recursive type" */ T.x
diff --git a/src/internal/types/testdata/fixedbugs/issue51525.go b/src/internal/types/testdata/fixedbugs/issue51525.go
index 5856905..af569c8 100644
--- a/src/internal/types/testdata/fixedbugs/issue51525.go
+++ b/src/internal/types/testdata/fixedbugs/issue51525.go
@@ -8,13 +8,13 @@
 	int
 	string
 }](x T) {
-	_ = x /* ERROR empty type set */ == x
-	_ = x /* ERROR empty type set */ + x
-	<-x /* ERROR empty type set */
-	x <- /* ERROR empty type set */ 0
-	close(x /* ERROR empty type set */)
+	_ = x /* ERROR "empty type set" */ == x
+	_ = x /* ERROR "empty type set" */ + x
+	<-x /* ERROR "empty type set" */
+	x <- /* ERROR "empty type set" */ 0
+	close(x /* ERROR "empty type set" */)
 }
 
 func _[T interface{ int | []byte }](x T) {
-	_ = x /* ERROR incomparable types in type set */ == x
+	_ = x /* ERROR "incomparable types in type set" */ == x
 }
diff --git a/src/internal/types/testdata/fixedbugs/issue51533.go b/src/internal/types/testdata/fixedbugs/issue51533.go
index bf46f75..166e5fe 100644
--- a/src/internal/types/testdata/fixedbugs/issue51533.go
+++ b/src/internal/types/testdata/fixedbugs/issue51533.go
@@ -7,14 +7,14 @@
 func _(x any) {
 	switch x {
 	case 0:
-		fallthrough // ERROR fallthrough statement out of place
+		fallthrough // ERROR "fallthrough statement out of place"
 		_ = x
 	default:
 	}
 
 	switch x.(type) {
 	case int:
-		fallthrough // ERROR cannot fallthrough in type switch
+		fallthrough // ERROR "cannot fallthrough in type switch"
 	default:
 	}
 }
diff --git a/src/internal/types/testdata/fixedbugs/issue51578.go b/src/internal/types/testdata/fixedbugs/issue51578.go
index 5c204ba..d2e8a28 100644
--- a/src/internal/types/testdata/fixedbugs/issue51578.go
+++ b/src/internal/types/testdata/fixedbugs/issue51578.go
@@ -4,14 +4,14 @@
 
 package p
 
-var _ = (*interface /* ERROR interface contains type constraints */ {int})(nil)
+var _ = (*interface /* ERROR "interface contains type constraints" */ {int})(nil)
 
 // abbreviated test case from issue
 
 type TypeSet interface{ int | string }
 
 func _() {
-	f((*TypeSet /* ERROR interface contains type constraints */)(nil))
+	f((*TypeSet /* ERROR "interface contains type constraints" */)(nil))
 }
 
 func f(any) {}
\ No newline at end of file
diff --git a/src/internal/types/testdata/fixedbugs/issue51593.go b/src/internal/types/testdata/fixedbugs/issue51593.go
index e06c39f..62b0a56 100644
--- a/src/internal/types/testdata/fixedbugs/issue51593.go
+++ b/src/internal/types/testdata/fixedbugs/issue51593.go
@@ -9,5 +9,5 @@
 type T = interface { m(int) }
 
 func _() {
-	_ = f /* ERROR cannot infer R */ [T] // don't crash in type inference
+	_ = f[T]
 }
diff --git a/src/internal/types/testdata/fixedbugs/issue51607.go b/src/internal/types/testdata/fixedbugs/issue51607.go
index d8df143..298adad 100644
--- a/src/internal/types/testdata/fixedbugs/issue51607.go
+++ b/src/internal/types/testdata/fixedbugs/issue51607.go
@@ -16,13 +16,13 @@
 type (
 	// overlap errors for non-interface terms
 	// (like the interface terms, but explicitly inlined)
-	_ interface{int | int /* ERROR overlapping terms int and int */ }
-	_ interface{int | ~ /* ERROR overlapping terms ~int and int */ int}
-	_ interface{~int | int /* ERROR overlapping terms int and ~int */ }
-	_ interface{~int | ~ /* ERROR overlapping terms ~int and ~int */ int}
+	_ interface{int | int /* ERROR "overlapping terms int and int" */ }
+	_ interface{int | ~ /* ERROR "overlapping terms ~int and int" */ int}
+	_ interface{~int | int /* ERROR "overlapping terms int and ~int" */ }
+	_ interface{~int | ~ /* ERROR "overlapping terms ~int and ~int" */ int}
 
-	_ interface{T1 | bool | string | T1 | bool /* ERROR overlapping terms bool and bool */ | string /* ERROR overlapping terms string and string */ }
-	_ interface{T1 | bool | string | T2 | ~ /* ERROR overlapping terms ~bool and bool */ bool | ~ /* ERROR overlapping terms ~string and string */ string}
+	_ interface{T1 | bool | string | T1 | bool /* ERROR "overlapping terms bool and bool" */ | string /* ERROR "overlapping terms string and string" */ }
+	_ interface{T1 | bool | string | T2 | ~ /* ERROR "overlapping terms ~bool and bool" */ bool | ~ /* ERROR "overlapping terms ~string and string" */ string}
 
 	// no errors for interface terms
 	_ interface{T1 | T1}
@@ -36,10 +36,10 @@
 	_ interface{T4 | T4 | float64 }
 )
 
-func _[_ T1 | bool | string | T1 | bool /* ERROR overlapping terms */ ]() {}
-func _[_ T1 | bool | string | T2 | ~ /* ERROR overlapping terms */ bool ]() {}
-func _[_ T2 | ~bool | ~string | T1 | bool /* ERROR overlapping terms */ ]() {}
-func _[_ T2 | ~bool | ~string | T2 | ~ /* ERROR overlapping terms */ bool ]() {}
+func _[_ T1 | bool | string | T1 | bool /* ERROR "overlapping terms" */ ]() {}
+func _[_ T1 | bool | string | T2 | ~ /* ERROR "overlapping terms" */ bool ]() {}
+func _[_ T2 | ~bool | ~string | T1 | bool /* ERROR "overlapping terms" */ ]() {}
+func _[_ T2 | ~bool | ~string | T2 | ~ /* ERROR "overlapping terms" */ bool ]() {}
 
 func _[_ T3 | T3 | int]() {}
 func _[_ T3 | T4 | bool]() {}
diff --git a/src/internal/types/testdata/fixedbugs/issue51610.go b/src/internal/types/testdata/fixedbugs/issue51610.go
index d10c788..d0bc1ac 100644
--- a/src/internal/types/testdata/fixedbugs/issue51610.go
+++ b/src/internal/types/testdata/fixedbugs/issue51610.go
@@ -5,5 +5,5 @@
 package p
 
 func _[P int | float64 | complex128]() {
-	_ = map[P]int{1: 1, 1.0 /* ERROR duplicate key 1 */ : 2, 1 /* ERROR duplicate key \(1 \+ 0i\) */ + 0i: 3}
+	_ = map[P]int{1: 1, 1.0 /* ERROR "duplicate key 1" */ : 2, 1 /* ERROR "duplicate key (1 + 0i)" */ + 0i: 3}
 }
diff --git a/src/internal/types/testdata/fixedbugs/issue51658.go b/src/internal/types/testdata/fixedbugs/issue51658.go
index f32051c..36e2fdd 100644
--- a/src/internal/types/testdata/fixedbugs/issue51658.go
+++ b/src/internal/types/testdata/fixedbugs/issue51658.go
@@ -8,9 +8,9 @@
 
 package p
 
-type F { // ERROR expected type|type declaration
+type F { // ERRORx "expected type|type declaration"
 	float64
-} // ERROR expected declaration|non-declaration statement
+} // ERRORx "expected declaration|non-declaration statement"
 
 func _[T F | int](x T) {
 	_ = x == 0 // don't crash when recording type of 0
@@ -18,9 +18,9 @@
 
 // test case from issue
 
-type FloatType { // ERROR expected type|type declaration
+type FloatType { // ERRORx "expected type|type declaration"
 	float32 | float64
-} // ERROR expected declaration|non-declaration statement
+} // ERRORx "expected declaration|non-declaration statement"
 
 type IntegerType interface {
 	int8 | int16 | int32 | int64 | int |
diff --git a/src/internal/types/testdata/fixedbugs/issue51877.go b/src/internal/types/testdata/fixedbugs/issue51877.go
index c93242a..4b0e5bc 100644
--- a/src/internal/types/testdata/fixedbugs/issue51877.go
+++ b/src/internal/types/testdata/fixedbugs/issue51877.go
@@ -10,9 +10,9 @@
 }
 
 var (
-	_ = S{0}                    /* ERROR too few values in struct literal */
-	_ = struct{ f1, f2 int }{0} /* ERROR too few values in struct literal */
+	_ = S{0}                    /* ERROR "too few values in struct literal" */
+	_ = struct{ f1, f2 int }{0} /* ERROR "too few values in struct literal" */
 
-	_ = S{0, true, "foo" /* ERROR too many values in struct literal */}
-	_ = struct{ f1, f2 int }{0, 1, 2 /* ERROR too many values in struct literal */}
+	_ = S{0, true, "foo" /* ERROR "too many values in struct literal" */}
+	_ = struct{ f1, f2 int }{0, 1, 2 /* ERROR "too many values in struct literal" */}
 )
diff --git a/src/internal/types/testdata/fixedbugs/issue52031.go b/src/internal/types/testdata/fixedbugs/issue52031.go
index 448a550..5b75b75 100644
--- a/src/internal/types/testdata/fixedbugs/issue52031.go
+++ b/src/internal/types/testdata/fixedbugs/issue52031.go
@@ -25,7 +25,7 @@
 
 // Invalid cases.
 var x int = 1
-var _ = (8 << x /* ERROR "signed shift count .* requires go1.13 or later" */)
+var _ = (8 << x /* ERRORx `signed shift count .* requires go1.13 or later` */)
 
 const _ = (1 << 1.2 /* ERROR "truncated to uint" */)
 
diff --git a/src/internal/types/testdata/fixedbugs/issue52401.go b/src/internal/types/testdata/fixedbugs/issue52401.go
index c7efd8c..ccc32d3 100644
--- a/src/internal/types/testdata/fixedbugs/issue52401.go
+++ b/src/internal/types/testdata/fixedbugs/issue52401.go
@@ -6,6 +6,6 @@
 
 func _() {
 	const x = 0
-	x /* ERROR cannot assign to x */ += 1
-	x /* ERROR cannot assign to x */ ++
+	x /* ERROR "cannot assign to x" */ += 1
+	x /* ERROR "cannot assign to x" */ ++
 }
diff --git a/src/internal/types/testdata/fixedbugs/issue52698.go b/src/internal/types/testdata/fixedbugs/issue52698.go
index ca794f8..20f24f0 100644
--- a/src/internal/types/testdata/fixedbugs/issue52698.go
+++ b/src/internal/types/testdata/fixedbugs/issue52698.go
@@ -9,7 +9,7 @@
 	_ P
 }
 
-type S /* ERROR invalid recursive type */ struct {
+type S /* ERROR "invalid recursive type" */ struct {
 	_ T[S]
 }
 
diff --git a/src/internal/types/testdata/fixedbugs/issue52915.go b/src/internal/types/testdata/fixedbugs/issue52915.go
index 6c43386..70dc664 100644
--- a/src/internal/types/testdata/fixedbugs/issue52915.go
+++ b/src/internal/types/testdata/fixedbugs/issue52915.go
@@ -7,7 +7,7 @@
 import "unsafe"
 
 type T[P any] struct {
-	T /* ERROR   invalid recursive type */ [P]
+	T /* ERROR "invalid recursive type" */ [P]
 }
 
 func _[P any]() {
@@ -20,4 +20,4 @@
 
 // TODO(gri) This is a follow-on error due to T[int] being invalid.
 //           We should try to avoid it.
-const _ = unsafe /* ERROR not constant */ .Sizeof(T[int]{})
+const _ = unsafe /* ERROR "not constant" */ .Sizeof(T[int]{})
diff --git a/src/internal/types/testdata/fixedbugs/issue53358.go b/src/internal/types/testdata/fixedbugs/issue53358.go
index 774136f..67c095c 100644
--- a/src/internal/types/testdata/fixedbugs/issue53358.go
+++ b/src/internal/types/testdata/fixedbugs/issue53358.go
@@ -8,12 +8,12 @@
 
 func (*A) m() int { return 0 }
 
-var _ = A.m /* ERROR invalid method expression A\.m \(needs pointer receiver \(\*A\)\.m\) */ ()
+var _ = A.m /* ERROR "invalid method expression A.m (needs pointer receiver (*A).m)" */ ()
 var _ = (*A).m(nil)
 
 type B struct{ A }
 
-var _ = B.m // ERROR invalid method expression B\.m \(needs pointer receiver \(\*B\)\.m\)
+var _ = B.m // ERROR "invalid method expression B.m (needs pointer receiver (*B).m)"
 var _ = (*B).m
 
-var _ = struct{ A }.m // ERROR invalid method expression struct{A}\.m \(needs pointer receiver \(\*struct{A}\)\.m\)
+var _ = struct{ A }.m // ERROR "invalid method expression struct{A}.m (needs pointer receiver (*struct{A}).m)"
diff --git a/src/internal/types/testdata/fixedbugs/issue53650.go b/src/internal/types/testdata/fixedbugs/issue53650.go
new file mode 100644
index 0000000..4bba59e
--- /dev/null
+++ b/src/internal/types/testdata/fixedbugs/issue53650.go
@@ -0,0 +1,59 @@
+// Copyright 2022 The Go Authors. 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 (
+	"reflect"
+	"testing"
+)
+
+type T1 int
+type T2 int
+
+func f[P T1 | T2, _ []P]() {}
+
+var _ = f[T1]
+
+// test case from issue
+
+type BaseT interface {
+	Type1 | Type2
+}
+type BaseType int
+type Type1 BaseType
+type Type2 BaseType // float64
+
+type ValueT[T BaseT] struct {
+	A1 T
+}
+
+func NewType1() *ValueT[Type1] {
+	r := NewT[Type1]()
+	return r
+}
+func NewType2() *ValueT[Type2] {
+	r := NewT[Type2]()
+	return r
+}
+
+func NewT[TBase BaseT, TVal ValueT[TBase]]() *TVal {
+	ret := TVal{}
+	return &ret
+}
+func TestGoType(t *testing.T) {
+	r1 := NewType1()
+	r2 := NewType2()
+	t.Log(r1, r2)
+	t.Log(reflect.TypeOf(r1), reflect.TypeOf(r2))
+	fooT1(r1.A1)
+	fooT2(r2.A1)
+}
+
+func fooT1(t1 Type1) {
+
+}
+func fooT2(t2 Type2) {
+
+}
diff --git a/src/internal/types/testdata/fixedbugs/issue53692.go b/src/internal/types/testdata/fixedbugs/issue53692.go
new file mode 100644
index 0000000..dc1a76c
--- /dev/null
+++ b/src/internal/types/testdata/fixedbugs/issue53692.go
@@ -0,0 +1,15 @@
+// Copyright 2023 The Go Authors. 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 Cache[K comparable, V any] interface{}
+
+type LRU[K comparable, V any] struct{}
+
+func WithLocking2[K comparable, V any](Cache[K, V]) {}
+
+func _() {
+	WithLocking2 /* ERROR "cannot infer V" */ [string](LRU[string, int]{})
+}
diff --git a/src/internal/types/testdata/fixedbugs/issue54280.go b/src/internal/types/testdata/fixedbugs/issue54280.go
index e83e1a1..9465894 100644
--- a/src/internal/types/testdata/fixedbugs/issue54280.go
+++ b/src/internal/types/testdata/fixedbugs/issue54280.go
@@ -4,4 +4,4 @@
 
 package p
 
-const C = 912_345_678_901_234_567_890_123_456_789_012_345_678_901_234_567_890_912_345_678_901_234_567_890_123_456_789_012_345_678_901_234_567_890_912_345_678_901_234_567_890_123_456_789_012_345_678_901_234_567_890_912 // ERROR constant overflow
+const C = 912_345_678_901_234_567_890_123_456_789_012_345_678_901_234_567_890_912_345_678_901_234_567_890_123_456_789_012_345_678_901_234_567_890_912_345_678_901_234_567_890_123_456_789_012_345_678_901_234_567_890_912 // ERROR "constant overflow"
diff --git a/src/internal/types/testdata/fixedbugs/issue54405.go b/src/internal/types/testdata/fixedbugs/issue54405.go
index 611d830..688fee1 100644
--- a/src/internal/types/testdata/fixedbugs/issue54405.go
+++ b/src/internal/types/testdata/fixedbugs/issue54405.go
@@ -8,9 +8,9 @@
 package p
 
 var x struct {
-	f *NotAType /* ERROR undefined */
+	f *NotAType /* ERROR "undefined" */
 }
 var _ = x.f == nil // no error expected here
 
-var y *NotAType  /* ERROR undefined */
+var y *NotAType  /* ERROR "undefined" */
 var _ = y == nil // no error expected here
diff --git a/src/internal/types/testdata/fixedbugs/issue54424.go b/src/internal/types/testdata/fixedbugs/issue54424.go
new file mode 100644
index 0000000..ebfb83d
--- /dev/null
+++ b/src/internal/types/testdata/fixedbugs/issue54424.go
@@ -0,0 +1,12 @@
+// Copyright 2023 The Go Authors. 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
+
+func f[P ~*T, T any]() {
+	var p P
+	var tp *T
+	tp = p // this assignment is valid
+	_ = tp
+}
diff --git a/src/internal/types/testdata/fixedbugs/issue54942.go b/src/internal/types/testdata/fixedbugs/issue54942.go
new file mode 100644
index 0000000..b9a5cce
--- /dev/null
+++ b/src/internal/types/testdata/fixedbugs/issue54942.go
@@ -0,0 +1,38 @@
+// Copyright 2022 The Go Authors. 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 (
+	"context"
+	"database/sql"
+)
+
+type I interface {
+	m(int, int, *int, int)
+}
+
+type T struct{}
+
+func (_ *T) m(a, b, c, d int) {}
+
+var _ I = new /* ERROR "have m(int, int, int, int)\n\t\twant m(int, int, *int, int)" */ (T)
+
+// (slightly modified) test case from issue
+
+type Result struct {
+	Value string
+}
+
+type Executor interface {
+	Execute(context.Context, sql.Stmt, int, []sql.NamedArg, int) (Result, error)
+}
+
+type myExecutor struct{}
+
+func (_ *myExecutor) Execute(ctx context.Context, stmt sql.Stmt, maxrows int, args []sql.NamedArg, urgency int) (*Result, error) {
+	return &Result{}, nil
+}
+
+var ex Executor = new /* ERROR "have Execute(context.Context, sql.Stmt, int, []sql.NamedArg, int) (*Result, error)\n\t\twant Execute(context.Context, sql.Stmt, int, []sql.NamedArg, int) (Result, error)" */ (myExecutor)
diff --git a/src/internal/types/testdata/fixedbugs/issue56351.go b/src/internal/types/testdata/fixedbugs/issue56351.go
index d7d04b0..eee142c 100644
--- a/src/internal/types/testdata/fixedbugs/issue56351.go
+++ b/src/internal/types/testdata/fixedbugs/issue56351.go
@@ -7,5 +7,5 @@
 package p
 
 func _(s []int) {
-	clear /* ERROR clear requires go1\.21 or later */ (s)
+	clear /* ERROR "clear requires go1.21 or later" */ (s)
 }
diff --git a/src/internal/types/testdata/fixedbugs/issue56665.go b/src/internal/types/testdata/fixedbugs/issue56665.go
index 11786b9..1f787d0 100644
--- a/src/internal/types/testdata/fixedbugs/issue56665.go
+++ b/src/internal/types/testdata/fixedbugs/issue56665.go
@@ -10,7 +10,7 @@
 }
 
 type B[T any] interface {
-	B /* ERROR invalid recursive type */ [*T]
+	B /* ERROR "invalid recursive type" */ [*T]
 }
 
 type C[T any, U B[U]] interface {
@@ -19,12 +19,12 @@
 
 // Simplified reproducer:
 type X[T any] interface {
-	X /* ERROR invalid recursive type */ [*T]
+	X /* ERROR "invalid recursive type" */ [*T]
 }
 
 var _ X[int]
 
 // A related example that doesn't go through interfaces.
-type A2[P any] [10]A2 /* ERROR invalid recursive type */ [*P]
+type A2[P any] [10]A2 /* ERROR "invalid recursive type" */ [*P]
 
 var _ A2[int]
diff --git a/src/internal/types/testdata/fixedbugs/issue57192.go b/src/internal/types/testdata/fixedbugs/issue57192.go
new file mode 100644
index 0000000..6c7894a
--- /dev/null
+++ b/src/internal/types/testdata/fixedbugs/issue57192.go
@@ -0,0 +1,22 @@
+// Copyright 2023 The Go Authors. 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 I1[T any] interface {
+	m1(T)
+}
+type I2[T any] interface {
+	I1[T]
+	m2(T)
+}
+
+var V1 I1[int]
+var V2 I2[int]
+
+func g[T any](I1[T]) {}
+func _() {
+	g(V1)
+	g(V2)
+}
diff --git a/src/internal/types/testdata/fixedbugs/issue57352.go b/src/internal/types/testdata/fixedbugs/issue57352.go
new file mode 100644
index 0000000..2b31700
--- /dev/null
+++ b/src/internal/types/testdata/fixedbugs/issue57352.go
@@ -0,0 +1,21 @@
+// Copyright 2023 The Go Authors. 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()
+}
+
+type AB interface {
+	A
+	b()
+}
+
+type AAB struct {
+	A
+	AB
+}
+
+var _ AB = AAB /* ERROR "ambiguous selector AAB.a" */ {}
diff --git a/src/internal/types/testdata/fixedbugs/issue57486.go b/src/internal/types/testdata/fixedbugs/issue57486.go
index 43ba1b0..933eeb4 100644
--- a/src/internal/types/testdata/fixedbugs/issue57486.go
+++ b/src/internal/types/testdata/fixedbugs/issue57486.go
@@ -24,6 +24,6 @@
 
 func F2[V [2]any](v V) {
 	_ = G2[V /* ERROR "V does not satisfy C2" */]
-	_ = G2[[ /* ERROR "\[2\]any does not satisfy C2 \(C2 mentions \[2\]any, but \[2\]any is not in the type set of C2\)" */ 2]any]
+	_ = G2[[ /* ERROR "[2]any does not satisfy C2 (C2 mentions [2]any, but [2]any is not in the type set of C2)" */ 2]any]
 	_ = G2[int]
 }
diff --git a/src/internal/types/testdata/fixedbugs/issue57500.go b/src/internal/types/testdata/fixedbugs/issue57500.go
index abdcb5e..4a90d47 100644
--- a/src/internal/types/testdata/fixedbugs/issue57500.go
+++ b/src/internal/types/testdata/fixedbugs/issue57500.go
@@ -12,5 +12,5 @@
 func f[T C]() {}
 
 func _() {
-	_ = f[[ /* ERROR \[2\]any does not satisfy C \(C mentions \[2\]any, but \[2\]any is not in the type set of C\) */ 2]any]
+	_ = f[[ /* ERROR "[2]any does not satisfy C (C mentions [2]any, but [2]any is not in the type set of C)" */ 2]any]
 }
diff --git a/src/internal/types/testdata/fixedbugs/issue58611.go b/src/internal/types/testdata/fixedbugs/issue58611.go
new file mode 100644
index 0000000..1ff30f7
--- /dev/null
+++ b/src/internal/types/testdata/fixedbugs/issue58611.go
@@ -0,0 +1,27 @@
+// Copyright 2023 The Go Authors. 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 (
+	"sort"
+	"strings"
+)
+
+func f[int any](x int) {
+	x = 0 /* ERRORx "cannot use 0.*(as int.*with int declared at|type parameter)" */
+}
+
+// test case from issue
+
+type Set[T comparable] map[T]struct{}
+
+func (s *Set[string]) String() string {
+	keys := make([]string, 0, len(*s))
+	for k := range *s {
+		keys = append(keys, k)
+	}
+	sort.Strings(keys /* ERRORx "cannot use keys.*with string declared at.*|type parameter" */ )
+	return strings /* ERROR "cannot use strings.Join" */ .Join(keys /* ERRORx "cannot use keys.*with string declared at.*|type parameter" */ , ",")
+}
diff --git a/src/internal/types/testdata/fixedbugs/issue58612.go b/src/internal/types/testdata/fixedbugs/issue58612.go
new file mode 100644
index 0000000..db6a62d
--- /dev/null
+++ b/src/internal/types/testdata/fixedbugs/issue58612.go
@@ -0,0 +1,14 @@
+// Copyright 2023 The Go Authors. 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
+
+func _() {
+	var x = new(T)
+	f[x /* ERROR "not a type" */ /* ERROR "use of .(type) outside type switch" */ .(type)]()
+}
+
+type T struct{}
+
+func f[_ any]() {}
diff --git a/src/internal/types/testdata/fixedbugs/issue58671.go b/src/internal/types/testdata/fixedbugs/issue58671.go
new file mode 100644
index 0000000..fa964aa
--- /dev/null
+++ b/src/internal/types/testdata/fixedbugs/issue58671.go
@@ -0,0 +1,20 @@
+// Copyright 2023 The Go Authors. 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
+
+func g[P any](...P) P { var x P; return x }
+
+func _() {
+	var (
+		_ int        = g(1, 2)
+		_ rune       = g(1, 'a')
+		_ float64    = g(1, 'a', 2.3)
+		_ float64    = g('a', 2.3)
+		_ complex128 = g(2.3, 'a', 1i)
+	)
+	g(true, 'a' /* ERROR "mismatched types untyped bool and untyped rune (cannot infer P)" */)
+	g(1, "foo" /* ERROR "mismatched types untyped int and untyped string (cannot infer P)" */)
+	g(1, 2.3, "bar" /* ERROR "mismatched types untyped float and untyped string (cannot infer P)" */)
+}
diff --git a/src/internal/types/testdata/fixedbugs/issue58742.go b/src/internal/types/testdata/fixedbugs/issue58742.go
new file mode 100644
index 0000000..b649a49
--- /dev/null
+++ b/src/internal/types/testdata/fixedbugs/issue58742.go
@@ -0,0 +1,18 @@
+// Copyright 2023 The Go Authors. 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
+
+func _() (int, UndefinedType /* ERROR "undefined: UndefinedType" */ , string)  {
+	return 0 // ERROR "not enough return values\n\thave (number)\n\twant (int, unknown type, string)"
+}
+
+func _() (int, UndefinedType /* ERROR "undefined: UndefinedType" */ ) {
+	return 0, 1, 2 // ERROR "too many return values\n\thave (number, number, number)\n\twant (int, unknown type)"
+}
+
+// test case from issue
+func _() UndefinedType /* ERROR "undefined: UndefinedType" */ {
+	return // ERROR "not enough return values\n\thave ()\n\twant (unknown type)"
+}
diff --git a/src/internal/types/testdata/fixedbugs/issue59190.go b/src/internal/types/testdata/fixedbugs/issue59190.go
new file mode 100644
index 0000000..fd08303
--- /dev/null
+++ b/src/internal/types/testdata/fixedbugs/issue59190.go
@@ -0,0 +1,36 @@
+// Copyright 2023 The Go Authors. 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"
+
+type E [1 << 30]complex128
+var a [1 << 30]E
+var _ = unsafe.Sizeof(a /* ERROR "too large" */ )
+
+var s struct {
+	_ [1 << 30]E
+	x int
+}
+var _ = unsafe.Offsetof(s /* ERROR "too large" */ .x)
+
+// Test case from issue (modified so it also triggers on 32-bit platforms).
+
+type A [1]int
+type S struct {
+	x A
+	y [1 << 30]A
+	z [1 << 30]struct{}
+}
+type T [1 << 30][1 << 30]S
+
+func _() {
+	var a A
+	var s S
+	var t T
+	_ = unsafe.Sizeof(a)
+	_ = unsafe.Sizeof(s)
+	_ = unsafe.Sizeof(t /* ERROR "too large" */ )
+}
diff --git a/src/internal/types/testdata/fixedbugs/issue59207.go b/src/internal/types/testdata/fixedbugs/issue59207.go
new file mode 100644
index 0000000..59b36e2
--- /dev/null
+++ b/src/internal/types/testdata/fixedbugs/issue59207.go
@@ -0,0 +1,12 @@
+// Copyright 2023 The Go Authors. 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"
+
+type E [1 << 32]byte
+
+var a [1 << 32]E // size of a must not overflow to 0
+var _ = unsafe.Sizeof(a /* ERROR "too large" */ )
diff --git a/src/internal/types/testdata/fixedbugs/issue59209.go b/src/internal/types/testdata/fixedbugs/issue59209.go
new file mode 100644
index 0000000..870ae52
--- /dev/null
+++ b/src/internal/types/testdata/fixedbugs/issue59209.go
@@ -0,0 +1,11 @@
+// Copyright 2023 The Go Authors. 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 (
+	_ [1 /* ERROR "invalid array length" */ << 100]int
+	_ [1.0]int
+	_ [1.1 /* ERROR "must be integer" */ ]int
+)
diff --git a/src/internal/types/testdata/fixedbugs/issue59338a.go b/src/internal/types/testdata/fixedbugs/issue59338a.go
new file mode 100644
index 0000000..34864dc
--- /dev/null
+++ b/src/internal/types/testdata/fixedbugs/issue59338a.go
@@ -0,0 +1,21 @@
+// -lang=go1.20
+
+// Copyright 2023 The Go Authors. 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
+
+func g[P any](P)      {}
+func h[P, Q any](P) Q { panic(0) }
+
+var _ func(int) = g /* ERROR "implicitly instantiated function in assignment requires go1.21 or later" */
+var _ func(int) string = h[ /* ERROR "partially instantiated function in assignment requires go1.21 or later" */ int]
+
+func f1(func(int))      {}
+func f2(int, func(int)) {}
+
+func _() {
+	f1(g /* ERROR "implicitly instantiated function as argument requires go1.21 or later" */)
+	f2(0, g /* ERROR "implicitly instantiated function as argument requires go1.21 or later" */)
+}
diff --git a/src/internal/types/testdata/fixedbugs/issue59338b.go b/src/internal/types/testdata/fixedbugs/issue59338b.go
new file mode 100644
index 0000000..1a5530a
--- /dev/null
+++ b/src/internal/types/testdata/fixedbugs/issue59338b.go
@@ -0,0 +1,19 @@
+// Copyright 2023 The Go Authors. 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
+
+func g[P any](P)      {}
+func h[P, Q any](P) Q { panic(0) }
+
+var _ func(int) = g
+var _ func(int) string = h[int]
+
+func f1(func(int))      {}
+func f2(int, func(int)) {}
+
+func _() {
+	f1(g)
+	f2(0, g)
+}
diff --git a/src/internal/types/testdata/fixedbugs/issue59371.go b/src/internal/types/testdata/fixedbugs/issue59371.go
new file mode 100644
index 0000000..d5b4db6
--- /dev/null
+++ b/src/internal/types/testdata/fixedbugs/issue59371.go
@@ -0,0 +1,17 @@
+// Copyright 2023 The Go Authors. 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
+
+var m map[int]int
+
+func _() {
+	_, ok /* ERROR "undefined: ok" */ = m[0] // must not crash
+}
+
+func _() {
+	var ok = undef /* ERROR "undefined: undef" */
+	x, ok := m[0]  // must not crash
+	_, _ = x, ok
+}
diff --git a/src/internal/types/testdata/fixedbugs/issue59639.go b/src/internal/types/testdata/fixedbugs/issue59639.go
new file mode 100644
index 0000000..1117668
--- /dev/null
+++ b/src/internal/types/testdata/fixedbugs/issue59639.go
@@ -0,0 +1,11 @@
+// -lang=go1.17
+
+// Copyright 2023 The Go Authors. 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
+
+func f[P /* ERROR "requires go1.18" */ interface{}](P) {}
+
+var v func(int) = f /* ERROR "requires go1.18" */
diff --git a/src/internal/types/testdata/fixedbugs/issue59740.go b/src/internal/types/testdata/fixedbugs/issue59740.go
new file mode 100644
index 0000000..31cd03b
--- /dev/null
+++ b/src/internal/types/testdata/fixedbugs/issue59740.go
@@ -0,0 +1,25 @@
+// Copyright 2023 The Go Authors. 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 F[T any] func(func(F[T]))
+
+func f(F[int])      {}
+func g[T any](F[T]) {}
+
+func _() {
+	g(f /* ERROR "type func(F[int]) of f does not match F[T] (cannot infer T)" */) // type inference/unification must not panic
+}
+
+// original test case from issue
+
+type List[T any] func(T, func(T, List[T]) T) T
+
+func nil[T any](n T, _ List[T]) T        { return n }
+func cons[T any](h T, t List[T]) List[T] { return func(n T, f func(T, List[T]) T) T { return f(h, t) } }
+
+func nums[T any](t T) List[T] {
+	return cons(t, cons(t, nil /* ERROR "type func(n T, _ List[T]) T of nil[T] does not match inferred type List[T] for List[T]" */ [T]))
+}
diff --git a/src/internal/types/testdata/fixedbugs/issue59848.go b/src/internal/types/testdata/fixedbugs/issue59848.go
new file mode 100644
index 0000000..51da747
--- /dev/null
+++ b/src/internal/types/testdata/fixedbugs/issue59848.go
@@ -0,0 +1,10 @@
+// Copyright 2023 The Go Authors. 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 T struct{}
+type I interface{ M() }
+var _ I = T /* ERROR "missing method M" */ {} // must not crash
+func (T) m() {}
diff --git a/src/internal/types/testdata/fixedbugs/issue59890.go b/src/internal/types/testdata/fixedbugs/issue59890.go
new file mode 100644
index 0000000..ed7afd9
--- /dev/null
+++ b/src/internal/types/testdata/fixedbugs/issue59890.go
@@ -0,0 +1,17 @@
+// Copyright 2023 The Go Authors. 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
+
+func _() { g /* ERROR "cannot infer T" */ () }
+
+func g[T any]() (_ /* ERROR "cannot use _ as value or type" */, int) { panic(0) }
+
+// test case from issue
+
+var _ = append(f /* ERROR "cannot infer T" */ ()())
+
+func f[T any]() (_ /* ERROR "cannot use _" */, _ /* ERROR "cannot use _" */, int) {
+	panic("not implemented")
+}
diff --git a/src/internal/types/testdata/fixedbugs/issue59953.go b/src/internal/types/testdata/fixedbugs/issue59953.go
new file mode 100644
index 0000000..b10ced7
--- /dev/null
+++ b/src/internal/types/testdata/fixedbugs/issue59953.go
@@ -0,0 +1,9 @@
+// Copyright 2023 The Go Authors. 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
+
+func _()         { f(g) }
+func f[P any](P) {}
+func g[Q int](Q) {}
diff --git a/src/internal/types/testdata/fixedbugs/issue59956.go b/src/internal/types/testdata/fixedbugs/issue59956.go
new file mode 100644
index 0000000..646b50e
--- /dev/null
+++ b/src/internal/types/testdata/fixedbugs/issue59956.go
@@ -0,0 +1,47 @@
+// Copyright 2023 The Go Authors. 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
+
+func f1(func(int))
+func f2(func(int), func(string))
+func f3(func(int), func(string), func(float32))
+
+func g1[P any](P) {}
+
+func _() {
+	f1(g1)
+	f2(g1, g1)
+	f3(g1, g1, g1)
+}
+
+// More complex examples
+
+func g2[P any](P, P)                                         {}
+func h3[P any](func(P), func(P), func() P)                   {}
+func h4[P, Q any](func(P), func(P, Q), func() Q, func(P, Q)) {}
+
+func r1() int { return 0 }
+
+func _() {
+	h3(g1, g1, r1)
+	h4(g1, g2, r1, g2)
+}
+
+// Variadic cases
+
+func f(func(int))
+func g[P any](P) {}
+
+func d[P any](...func(P)) {}
+
+func _() {
+	d /* ERROR "cannot infer P" */ ()
+	d(f)
+	d(f, g)
+	d(f, g, g)
+	d /* ERROR "cannot infer P" */ (g, g, g)
+	d(g, g, f)
+	d(g, f, g, f)
+}
diff --git a/src/internal/types/testdata/fixedbugs/issue59958.go b/src/internal/types/testdata/fixedbugs/issue59958.go
new file mode 100644
index 0000000..4a4b4dc
--- /dev/null
+++ b/src/internal/types/testdata/fixedbugs/issue59958.go
@@ -0,0 +1,22 @@
+// Copyright 2023 The Go Authors. 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
+
+func f(func(int) string) {}
+
+func g2[P, Q any](P) Q    { var q Q; return q }
+func g3[P, Q, R any](P) R { var r R; return r }
+
+func _() {
+	f(g2)
+	f(g2[int])
+	f(g2[int, string])
+
+	f(g3[int, bool])
+	f(g3[int, bool, string])
+
+	var _ func(int) string = g2
+	var _ func(int) string = g2[int]
+}
diff --git a/src/internal/types/testdata/fixedbugs/issue60346.go b/src/internal/types/testdata/fixedbugs/issue60346.go
new file mode 100644
index 0000000..6dc057b
--- /dev/null
+++ b/src/internal/types/testdata/fixedbugs/issue60346.go
@@ -0,0 +1,17 @@
+// -lang=go1.20
+
+// Copyright 2023 The Go Authors. 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
+
+func F[P any, Q *P](p P) {}
+
+var _ = F[int]
+
+func G[R any](func(R)) {}
+
+func _() {
+	G(F[int])
+}
diff --git a/src/internal/types/testdata/fixedbugs/issue60377.go b/src/internal/types/testdata/fixedbugs/issue60377.go
new file mode 100644
index 0000000..b754f89
--- /dev/null
+++ b/src/internal/types/testdata/fixedbugs/issue60377.go
@@ -0,0 +1,88 @@
+// Copyright 2023 The Go Authors. 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
+
+// The type parameter P is not used in interface T1.
+// T1 is a defined parameterized interface type which
+// can be assigned to any other interface with the same
+// methods. We cannot infer a type argument in this case
+// because any type would do.
+
+type T1[P any] interface{ m() }
+
+func g[P any](T1[P]) {}
+
+func _() {
+	var x T1[int]
+	g /* ERROR "cannot infer P" */ (x)
+	g[int](x)    // int is ok for P
+	g[string](x) // string is also ok for P!
+}
+
+// This is analogous to the above example,
+// but uses two interface types of the same structure.
+
+type T2[P any] interface{ m() }
+
+func _() {
+	var x T2[int]
+	g /* ERROR "cannot infer P" */ (x)
+	g[int](x)    // int is ok for P
+	g[string](x) // string is also ok for P!
+}
+
+// Analogous to the T2 example but using an unparameterized interface T3.
+
+type T3 interface{ m() }
+
+func _() {
+	var x T3
+	g /* ERROR "cannot infer P" */ (x)
+	g[int](x)    // int is ok for P
+	g[string](x) // string is also ok for P!
+}
+
+// The type parameter P is not used in struct S.
+// S is a defined parameterized (non-interface) type which can only
+// be assigned to another type S with the same type argument.
+// Therefore we can infer a type argument in this case.
+
+type S[P any] struct{}
+
+func g4[P any](S[P]) {}
+
+func _() {
+	var x S[int]
+	g4(x)      // we can infer int for P
+	g4[int](x) // int is the correct type argument
+	g4[string](x /* ERROR "cannot use x (variable of type S[int]) as S[string] value in argument to g4[string]" */)
+}
+
+// This is similar to the first example but here T1 is a component
+// of a func type. In this case types must match exactly: P must
+// match int.
+
+func g5[P any](func(T1[P])) {}
+
+func _() {
+	var f func(T1[int])
+	g5(f)
+	g5[int](f)
+	g5[string](f /* ERROR "cannot use f (variable of type func(T1[int])) as func(T1[string]) value in argument to g5[string]" */)
+}
+
+// This example would fail if we were to infer the type argument int for P
+// exactly because any type argument would be ok for the first argument.
+// Choosing the wrong type would cause the second argument to not match.
+
+type T[P any] interface{}
+
+func g6[P any](T[P], P) {}
+
+func _() {
+	var x T[int]
+	g6(x, 1.2)
+	g6(x, "")
+}
diff --git a/src/internal/types/testdata/fixedbugs/issue60460.go b/src/internal/types/testdata/fixedbugs/issue60460.go
new file mode 100644
index 0000000..a9cb3d9
--- /dev/null
+++ b/src/internal/types/testdata/fixedbugs/issue60460.go
@@ -0,0 +1,88 @@
+// Copyright 2023 The Go Authors. 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
+
+// Simplified (representative) test case.
+
+func _() {
+	f(R1{})
+}
+
+func f[T any](R[T]) {}
+
+type R[T any] interface {
+	m(R[T])
+}
+
+type R1 struct{}
+
+func (R1) m(R[int]) {}
+
+// Test case from issue.
+
+func _() {
+	r := newTestRules()
+	NewSet(r)
+	r2 := newTestRules2()
+	NewSet(r2)
+}
+
+type Set[T any] struct {
+	rules Rules[T]
+}
+
+func NewSet[T any](rules Rules[T]) Set[T] {
+	return Set[T]{
+		rules: rules,
+	}
+}
+
+func (s Set[T]) Copy() Set[T] {
+	return NewSet(s.rules)
+}
+
+type Rules[T any] interface {
+	Hash(T) int
+	Equivalent(T, T) bool
+	SameRules(Rules[T]) bool
+}
+
+type testRules struct{}
+
+func newTestRules() Rules[int] {
+	return testRules{}
+}
+
+func (r testRules) Hash(val int) int {
+	return val % 16
+}
+
+func (r testRules) Equivalent(val1 int, val2 int) bool {
+	return val1 == val2
+}
+
+func (r testRules) SameRules(other Rules[int]) bool {
+	_, ok := other.(testRules)
+	return ok
+}
+
+type testRules2 struct{}
+
+func newTestRules2() Rules[string] {
+	return testRules2{}
+}
+
+func (r testRules2) Hash(val string) int {
+	return 16
+}
+
+func (r testRules2) Equivalent(val1 string, val2 string) bool {
+	return val1 == val2
+}
+
+func (r testRules2) SameRules(other Rules[string]) bool {
+	_, ok := other.(testRules2)
+	return ok
+}
diff --git a/src/internal/types/testdata/fixedbugs/issue60500.go b/src/internal/types/testdata/fixedbugs/issue60500.go
new file mode 100644
index 0000000..be8ccaf
--- /dev/null
+++ b/src/internal/types/testdata/fixedbugs/issue60500.go
@@ -0,0 +1,11 @@
+// Copyright 2023 The Go Authors. 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
+
+func _() {
+	log("This is a test %v" /* ERROR "cannot use \"This is a test %v\" (untyped string constant) as bool value in argument to log" */, "foo")
+}
+
+func log(enabled bool, format string, args ...any)
diff --git a/src/internal/types/testdata/fixedbugs/issue60542.go b/src/internal/types/testdata/fixedbugs/issue60542.go
new file mode 100644
index 0000000..b536ddb
--- /dev/null
+++ b/src/internal/types/testdata/fixedbugs/issue60542.go
@@ -0,0 +1,12 @@
+// Copyright 2023 The Go Authors. 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
+
+func Clip[S ~[]E, E any](s S) S {
+	return s
+}
+
+var versions func()
+var _ = Clip /* ERROR "S (type func()) does not satisfy ~[]E" */ (versions)
diff --git a/src/internal/types/testdata/fixedbugs/issue60556.go b/src/internal/types/testdata/fixedbugs/issue60556.go
new file mode 100644
index 0000000..77e5034
--- /dev/null
+++ b/src/internal/types/testdata/fixedbugs/issue60556.go
@@ -0,0 +1,19 @@
+// Copyright 2023 The Go Authors. 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 I[T any] interface {
+	m(I[T])
+}
+
+type S[T any] struct{}
+
+func (S[T]) m(I[T]) {}
+
+func f[T I[E], E any](T) {}
+
+func _() {
+	f(S[int]{})
+}
diff --git a/src/internal/types/testdata/fixedbugs/issue60562.go b/src/internal/types/testdata/fixedbugs/issue60562.go
new file mode 100644
index 0000000..c08bbf3
--- /dev/null
+++ b/src/internal/types/testdata/fixedbugs/issue60562.go
@@ -0,0 +1,61 @@
+// Copyright 2023 The Go Authors. 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 S[T any] struct{}
+
+func (S[T]) m(T) {}
+
+func f0[T any](chan S[T]) {}
+
+func _() {
+	var x chan interface{ m(int) }
+	f0(x /* ERROR "type chan interface{m(int)} of x does not match chan S[T] (cannot infer T)" */)
+}
+
+// variants of the theme
+
+func f1[T any]([]S[T]) {}
+
+func _() {
+	var x []interface{ m(int) }
+	f1(x /* ERROR "type []interface{m(int)} of x does not match []S[T] (cannot infer T)" */)
+}
+
+type I[T any] interface {
+	m(T)
+}
+
+func f2[T any](func(I[T])) {}
+
+func _() {
+	var x func(interface{ m(int) })
+	f2(x /* ERROR "type func(interface{m(int)}) of x does not match func(I[T]) (cannot infer T)" */)
+}
+
+func f3[T any](func(I[T])) {}
+
+func _() {
+	var x func(I[int])
+	f3(x) // but this is correct: I[T] and I[int] can be made identical with T == int
+}
+
+func f4[T any]([10]I[T]) {}
+
+func _() {
+	var x [10]interface{ I[int] }
+	f4(x /* ERROR "type [10]interface{I[int]} of x does not match [10]I[T] (cannot infer T)" */)
+}
+
+func f5[T any](I[T]) {}
+
+func _() {
+	var x interface {
+		m(int)
+		n()
+	}
+	f5(x)
+	f5[int](x) // ok
+}
diff --git a/src/internal/types/testdata/fixedbugs/issue60688.go b/src/internal/types/testdata/fixedbugs/issue60688.go
new file mode 100644
index 0000000..38d90ee
--- /dev/null
+++ b/src/internal/types/testdata/fixedbugs/issue60688.go
@@ -0,0 +1,16 @@
+// Copyright 2023 The Go Authors. 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 String string
+
+func g[P any](P, string) {}
+
+// String and string are not identical and thus must not unify
+// (they are element types of the func type and therefore must
+// be identical to match).
+// The result is an error from type inference, rather than an
+// error from an assignment mismatch.
+var f func(int, String) = g // ERROR "type func(int, String) of variable in assignment does not match inferred type func(int, string) for func(P, string)"
diff --git a/src/internal/types/testdata/fixedbugs/issue60906.go b/src/internal/types/testdata/fixedbugs/issue60906.go
new file mode 100644
index 0000000..2744e89
--- /dev/null
+++ b/src/internal/types/testdata/fixedbugs/issue60906.go
@@ -0,0 +1,11 @@
+// Copyright 2023 The Go Authors. 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
+
+func _() {
+	var x int
+	var f func() []int
+	_ = f /* ERROR "cannot index f" */ [x]
+}
diff --git a/src/internal/types/testdata/fixedbugs/issue60933.go b/src/internal/types/testdata/fixedbugs/issue60933.go
new file mode 100644
index 0000000..9b10237
--- /dev/null
+++ b/src/internal/types/testdata/fixedbugs/issue60933.go
@@ -0,0 +1,67 @@
+// Copyright 2023 The Go Authors. 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 (
+	"io"
+	"os"
+)
+
+func g[T any](...T) {}
+
+// Interface and non-interface types do not match.
+func _() {
+	var file *os.File
+	g(file, io /* ERROR "type io.Writer of io.Discard does not match inferred type *os.File for T" */ .Discard)
+	g(file, os.Stdout)
+}
+
+func _() {
+	var a *os.File
+	var b any
+	g(a, a)
+	g(a, b /* ERROR "type any of b does not match inferred type *os.File for T" */)
+}
+
+var writer interface {
+	Write(p []byte) (n int, err error)
+}
+
+func _() {
+	var file *os.File
+	g(file, writer /* ERROR "type interface{Write(p []byte) (n int, err error)} of writer does not match inferred type *os.File for T" */)
+	g(writer, file /* ERROR "type *os.File of file does not match inferred type interface{Write(p []byte) (n int, err error)} for T" */)
+}
+
+// Different named interface types do not match.
+func _() {
+	g(io.ReadWriter(nil), io.ReadWriter(nil))
+	g(io.ReadWriter(nil), io /* ERROR "does not match" */ .Writer(nil))
+	g(io.Writer(nil), io /* ERROR "does not match" */ .ReadWriter(nil))
+}
+
+// Named and unnamed interface types match if they have the same methods.
+func _() {
+	g(io.Writer(nil), writer)
+	g(io.ReadWriter(nil), writer /* ERROR "does not match" */ )
+}
+
+// There must be no order dependency for named and unnamed interfaces.
+func f[T interface{ m(T) }](a, b T) {}
+
+type F interface {
+	m(F)
+}
+
+func _() {
+	var i F
+	var j interface {
+		m(F)
+	}
+
+	// order doesn't matter
+	f(i, j)
+	f(j, i)
+}
\ No newline at end of file
diff --git a/src/internal/types/testdata/fixedbugs/issue60946.go b/src/internal/types/testdata/fixedbugs/issue60946.go
new file mode 100644
index 0000000..a66254b
--- /dev/null
+++ b/src/internal/types/testdata/fixedbugs/issue60946.go
@@ -0,0 +1,38 @@
+// Copyright 2023 The Go Authors. 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 Tn interface{ m() }
+type T1 struct{}
+type T2 struct{}
+
+func (*T1) m() {}
+func (*T2) m() {}
+
+func g[P any](...P) {}
+
+func _() {
+	var t interface{ m() }
+	var tn Tn
+	var t1 *T1
+	var t2 *T2
+
+	// these are ok (interface types only)
+	g(t, t)
+	g(t, tn)
+	g(tn, t)
+	g(tn, tn)
+
+	// these are not ok (interface and non-interface types)
+	g(t, t1 /* ERROR "does not match" */)
+	g(t1, t /* ERROR "does not match" */)
+	g(tn, t1 /* ERROR "does not match" */)
+	g(t1, tn /* ERROR "does not match" */)
+
+	g(t, t1 /* ERROR "does not match" */, t2)
+	g(t1, t2 /* ERROR "does not match" */, t)
+	g(tn, t1 /* ERROR "does not match" */, t2)
+	g(t1, t2 /* ERROR "does not match" */, tn)
+}
diff --git a/src/internal/types/testdata/fixedbugs/issue61486.go b/src/internal/types/testdata/fixedbugs/issue61486.go
new file mode 100644
index 0000000..b12a800
--- /dev/null
+++ b/src/internal/types/testdata/fixedbugs/issue61486.go
@@ -0,0 +1,9 @@
+// Copyright 2023 The Go Authors. 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
+
+func _(s uint) {
+	_ = min(1 << s)
+}
diff --git a/src/internal/types/testdata/fixedbugs/issue61879.go b/src/internal/types/testdata/fixedbugs/issue61879.go
new file mode 100644
index 0000000..542bc2d
--- /dev/null
+++ b/src/internal/types/testdata/fixedbugs/issue61879.go
@@ -0,0 +1,57 @@
+// Copyright 2023 The Go Authors. 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 "fmt"
+
+type Interface[T any] interface {
+	m(Interface[T])
+}
+
+func f[S []Interface[T], T any](S) {}
+
+func _() {
+	var s []Interface[int]
+	f(s) // panic here
+}
+
+// Larger example from issue
+
+type InterfaceA[T comparable] interface {
+	setData(string) InterfaceA[T]
+}
+
+type ImplA[T comparable] struct {
+	data string
+	args []any
+}
+
+func NewInterfaceA[T comparable](args ...any) InterfaceA[T] {
+	return &ImplA[T]{
+		data: fmt.Sprintf("%v", args...),
+		args: args,
+	}
+}
+
+func (k *ImplA[T]) setData(data string) InterfaceA[T] {
+	k.data = data
+	return k
+}
+
+func Foo[M ~map[InterfaceA[T]]V, T comparable, V any](m M) {
+	// DO SOMETHING HERE
+	return
+}
+
+func Bar() {
+	keys := make([]InterfaceA[int], 0, 10)
+	m := make(map[InterfaceA[int]]int)
+	for i := 0; i < 10; i++ {
+		keys = append(keys, NewInterfaceA[int](i))
+		m[keys[i]] = i
+	}
+
+	Foo(m) // panic here
+}
diff --git a/src/internal/types/testdata/fixedbugs/issue61903.go b/src/internal/types/testdata/fixedbugs/issue61903.go
new file mode 100644
index 0000000..8a6fcd9
--- /dev/null
+++ b/src/internal/types/testdata/fixedbugs/issue61903.go
@@ -0,0 +1,20 @@
+// -lang=go1.20
+
+// Copyright 2023 The Go Authors. 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 T[P any] interface{}
+
+func f1[P any](T[P])    {}
+func f2[P any](T[P], P) {}
+
+func _() {
+	var t T[int]
+	f1(t)
+
+	var s string
+	f2(t, s /* ERROR "type string of s does not match inferred type int for P" */)
+}
diff --git a/src/internal/types/testdata/fixedbugs/issue62157.go b/src/internal/types/testdata/fixedbugs/issue62157.go
new file mode 100644
index 0000000..c44f921
--- /dev/null
+++ b/src/internal/types/testdata/fixedbugs/issue62157.go
@@ -0,0 +1,128 @@
+// Copyright 2023 The Go Authors. 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
+
+func f[T any](...T) T { var x T; return x }
+
+// Test case 1
+
+func _() {
+	var a chan string
+	var b <-chan string
+	f(a, b)
+	f(b, a)
+}
+
+// Test case 2
+
+type F[T any] func(T) bool
+
+func g[T any](T) F[<-chan T] { return nil }
+
+func f1[T any](T, F[T]) {}
+func f2[T any](F[T], T) {}
+
+func _() {
+	var ch chan string
+	f1(ch, g(""))
+	f2(g(""), ch)
+}
+
+// Test case 3: named and directional types combined
+
+func _() {
+	type namedA chan int
+	type namedB chan<- int
+
+	var a chan int
+	var A namedA
+	var b chan<- int
+	var B namedB
+
+	// Defined types win over channel types irrespective of channel direction.
+	f(A, b /* ERROR "cannot use b (variable of type chan<- int) as namedA value in argument to f" */)
+	f(b /* ERROR "cannot use b (variable of type chan<- int) as namedA value in argument to f" */, A)
+
+	f(a, b /* ERROR "cannot use b (variable of type chan<- int) as namedA value in argument to f" */, A)
+	f(a, A, b /* ERROR "cannot use b (variable of type chan<- int) as namedA value in argument to f" */)
+	f(b /* ERROR "cannot use b (variable of type chan<- int) as namedA value in argument to f" */, A, a)
+	f(b /* ERROR "cannot use b (variable of type chan<- int) as namedA value in argument to f" */, a, A)
+	f(A, a, b /* ERROR "cannot use b (variable of type chan<- int) as namedA value in argument to f" */)
+	f(A, b /* ERROR "cannot use b (variable of type chan<- int) as namedA value in argument to f" */, a)
+
+	// Unnamed directed channels win over bidirectional channels.
+	b = f(a, b)
+	b = f(b, a)
+
+	// Defined directed channels win over defined bidirectional channels.
+	A = f(A, a)
+	A = f(a, A)
+	B = f(B, b)
+	B = f(b, B)
+
+	f(a, b, B)
+	f(a, B, b)
+	f(b, B, a)
+	f(b, a, B)
+	f(B, a, b)
+	f(B, b, a)
+
+	// Differently named channel types conflict irrespective of channel direction.
+	f(A, B /* ERROR "type namedB of B does not match inferred type namedA for T" */)
+	f(B, A /* ERROR "type namedA of A does not match inferred type namedB for T" */)
+
+	// Ensure that all combinations of directional and
+	// bidirectional channels with a named directional
+	// channel lead to the correct (named) directional
+	// channel.
+	B = f(a, b)
+	B = f(a, B)
+	B = f(b, a)
+	B = f(B, a)
+
+	B = f(a, b, B)
+	B = f(a, B, b)
+	B = f(b, B, a)
+	B = f(b, a, B)
+	B = f(B, a, b)
+	B = f(B, b, a)
+
+	// verify type error
+	A = f /* ERROR "cannot use f(B, b, a) (value of type namedB) as namedA value in assignment" */ (B, b, a)
+}
+
+// Test case 4: some more combinations
+
+func _() {
+	type A chan int
+	type B chan int
+	type C = chan int
+	type D = chan<- int
+
+	var a A
+	var b B
+	var c C
+	var d D
+
+	f(a, b /* ERROR "type B of b does not match inferred type A for T" */, c)
+	f(c, a, b /* ERROR "type B of b does not match inferred type A for T" */)
+	f(a, b /* ERROR "type B of b does not match inferred type A for T" */, d)
+	f(d, a, b /* ERROR "type B of b does not match inferred type A for T" */)
+}
+
+// Simplified test case from issue
+
+type Matcher[T any] func(T) bool
+
+func Produces[T any](T) Matcher[<-chan T] { return nil }
+
+func Assert1[T any](Matcher[T], T) {}
+func Assert2[T any](T, Matcher[T]) {}
+
+func _() {
+	var ch chan string
+	Assert1(Produces(""), ch)
+	Assert2(ch, Produces(""))
+}
diff --git a/src/internal/types/testdata/fixedbugs/issue6977.go b/src/internal/types/testdata/fixedbugs/issue6977.go
index 8f4e9ba..c455d3a 100644
--- a/src/internal/types/testdata/fixedbugs/issue6977.go
+++ b/src/internal/types/testdata/fixedbugs/issue6977.go
@@ -32,10 +32,10 @@
 type U4 interface { M; M; M }
 type U5 interface { U1; U2; U3; U4 }
 
-type U6 interface { m(); m /* ERROR duplicate method */ () }
-type U7 interface { M32 /* ERROR duplicate method */ ; m() }
-type U8 interface { m(); M32 /* ERROR duplicate method */ }
-type U9 interface { M32; M64 /* ERROR duplicate method */ }
+type U6 interface { m(); m /* ERROR "duplicate method" */ () }
+type U7 interface { M32 /* ERROR "duplicate method" */ ; m() }
+type U8 interface { m(); M32 /* ERROR "duplicate method" */ }
+type U9 interface { M32; M64 /* ERROR "duplicate method" */ }
 
 // Verify that repeated embedding of the same interface(s)
 // eliminates duplicate methods early (rather than at the
diff --git a/src/internal/types/testdata/spec/assignability.go b/src/internal/types/testdata/spec/assignability.go
index 0ab8eb3..6670870 100644
--- a/src/internal/types/testdata/spec/assignability.go
+++ b/src/internal/types/testdata/spec/assignability.go
@@ -37,7 +37,7 @@
 // and at least one of V or T is not a named type."
 // (here a named type is a type with a name)
 func _[TP1, TP2 Interface](X1 TP1, X2 TP2) {
-	b = B // ERROR cannot use B .* as int value
+	b = B // ERRORx `cannot use B .* as int value`
 	a = A
 	l = L
 	s = S
@@ -48,7 +48,7 @@
 	c = C
 	d = D
 
-	B = b // ERROR cannot use b .* as Basic value
+	B = b // ERRORx `cannot use b .* as Basic value`
 	A = a
 	L = l
 	S = s
@@ -58,16 +58,16 @@
 	M = m
 	C = c
 	D = d
-	X1 = i  // ERROR cannot use i .* as TP1 value
-	X1 = X2 // ERROR cannot use X2 .* as TP1 value
+	X1 = i  // ERRORx `cannot use i .* as TP1 value`
+	X1 = X2 // ERRORx `cannot use X2 .* as TP1 value`
 }
 
 // "T is an interface type and x implements T and T is not a type parameter"
 func _[TP Interface](X TP) {
-	i = d // ERROR missing method m
+	i = d // ERROR "missing method m"
 	i = D
 	i = X
-	X = i // ERROR cannot use i .* as TP value
+	X = i // ERRORx `cannot use i .* as TP value`
 }
 
 // "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"
@@ -102,24 +102,24 @@
 		_ RecvChan = c
 		_ Chan     = c
 
-		_ SendChan = C // ERROR cannot use C .* as SendChan value
-		_ RecvChan = C // ERROR cannot use C .* as RecvChan value
+		_ SendChan = C // ERRORx `cannot use C .* as SendChan value`
+		_ RecvChan = C // ERRORx `cannot use C .* as RecvChan value`
 		_ Chan     = C
-		_ Chan     = make /* ERROR cannot use make\(chan Basic\) .* as Chan value */ (chan Basic)
+		_ Chan     = make /* ERRORx `cannot use make\(chan Basic\) .* as Chan value` */ (chan Basic)
 	)
 
 	var (
-		_ _CC = C // ERROR cannot use C .* as _CC value
-		_ _SC = C // ERROR cannot use C .* as _SC value
-		_ _RC = C // ERROR cannot use C .* as _RC value
+		_ _CC = C // ERRORx `cannot use C .* as _CC value`
+		_ _SC = C // ERRORx `cannot use C .* as _SC value`
+		_ _RC = C // ERRORx `cannot use C .* as _RC value`
 
-		_ CC = _CC /* ERROR cannot use _CC\(nil\) .* as CC value */ (nil)
-		_ SC = _CC /* ERROR cannot use _CC\(nil\) .* as SC value */ (nil)
-		_ RC = _CC /* ERROR cannot use _CC\(nil\) .* as RC value */ (nil)
+		_ CC = _CC /* ERRORx `cannot use _CC\(nil\) .* as CC value` */ (nil)
+		_ SC = _CC /* ERRORx `cannot use _CC\(nil\) .* as SC value` */ (nil)
+		_ RC = _CC /* ERRORx `cannot use _CC\(nil\) .* as RC value` */ (nil)
 
-		_ CC = C // ERROR cannot use C .* as CC value
-		_ SC = C // ERROR cannot use C .* as SC value
-		_ RC = C // ERROR cannot use C .* as RC value
+		_ CC = C // ERRORx `cannot use C .* as CC value`
+		_ SC = C // ERRORx `cannot use C .* as SC value`
+		_ RC = C // ERRORx `cannot use C .* as RC value`
 	)
 }
 
@@ -130,11 +130,11 @@
 	TP2 ~chan int | ~chan byte,
 ]() {
 	var (
-		_ TP0 = c // ERROR cannot use c .* as TP0 value
-		_ TP0 = C // ERROR cannot use C .* as TP0 value
+		_ TP0 = c // ERRORx `cannot use c .* as TP0 value`
+		_ TP0 = C // ERRORx `cannot use C .* as TP0 value`
 		_ TP1 = c
-		_ TP1 = C // ERROR cannot use C .* as TP1 value
-		_ TP2 = c // ERROR .* cannot assign chan int to chan byte
+		_ TP1 = C // ERRORx `cannot use C .* as TP1 value`
+		_ TP2 = c // ERRORx `.* cannot assign chan int to chan byte`
 	)
 }
 
@@ -147,34 +147,34 @@
 	i = X0
 	I = X0
 	c = X1
-	C = X1 // ERROR cannot use X1 .* as Chan value
-	c = X2 // ERROR .* cannot assign chan byte \(in TP2\) to chan int
+	C = X1 // ERRORx `cannot use X1 .* as Chan value`
+	c = X2 // ERRORx `.* cannot assign chan byte \(in TP2\) to chan int`
 }
 
 // "x is the predeclared identifier nil and T is a pointer, function, slice, map, channel, or interface type"
 func _[TP Interface](X TP) {
-	b = nil // ERROR cannot use nil
-	a = nil // ERROR cannot use nil
+	b = nil // ERROR "cannot use nil"
+	a = nil // ERROR "cannot use nil"
 	l = nil
-	s = nil // ERROR cannot use nil
+	s = nil // ERROR "cannot use nil"
 	p = nil
 	f = nil
 	i = nil
 	m = nil
 	c = nil
-	d = nil // ERROR cannot use nil
+	d = nil // ERROR "cannot use nil"
 
-	B = nil // ERROR cannot use nil
-	A = nil // ERROR cannot use nil
+	B = nil // ERROR "cannot use nil"
+	A = nil // ERROR "cannot use nil"
 	L = nil
-	S = nil // ERROR cannot use nil
+	S = nil // ERROR "cannot use nil"
 	P = nil
 	F = nil
 	I = nil
 	M = nil
 	C = nil
-	D = nil // ERROR cannot use nil
-	X = nil // ERROR cannot use nil
+	D = nil // ERROR "cannot use nil"
+	X = nil // ERROR "cannot use nil"
 }
 
 // "x is an untyped constant representable by a value of type T"
@@ -206,8 +206,8 @@
 
 	i8_16 = -1 << 7
 	i8_16 = 1<<7 - 1
-	i8_16 = - /* ERROR cannot use .* as Int8_16 */ 1 << 15
-	i8_16 = 1 /* ERROR cannot use .* as Int8_16 */ <<15 - 1
+	i8_16 = - /* ERRORx `cannot use .* as Int8_16` */ 1 << 15
+	i8_16 = 1 /* ERRORx `cannot use .* as Int8_16` */ <<15 - 1
 }
 
 // proto-types for tests
diff --git a/src/internal/types/testdata/spec/comparable.go b/src/internal/types/testdata/spec/comparable.go
index f407c35..211fa11 100644
--- a/src/internal/types/testdata/spec/comparable.go
+++ b/src/internal/types/testdata/spec/comparable.go
@@ -15,12 +15,12 @@
 	_ = f1[any /* any does satisfy comparable */]
 	_ = f1[P]
 	_ = f1[Q]
-	_ = f1[R /* ERROR R does not satisfy comparable */]
+	_ = f1[R /* ERROR "R does not satisfy comparable" */]
 
 	_ = f2[int]
 	_ = f2[T /* T does satisfy comparable */]
 	_ = f2[any /* any does satisfy comparable */]
 	_ = f2[P]
 	_ = f2[Q]
-	_ = f2[R /* ERROR R does not satisfy comparable */]
+	_ = f2[R /* ERROR "R does not satisfy comparable" */]
 }
diff --git a/src/internal/types/testdata/spec/comparable1.19.go b/src/internal/types/testdata/spec/comparable1.19.go
index dc1c5fa..7a4b2a0 100644
--- a/src/internal/types/testdata/spec/comparable1.19.go
+++ b/src/internal/types/testdata/spec/comparable1.19.go
@@ -13,16 +13,16 @@
 
 func _[P comparable, Q ~int, R any]() {
 	_ = f1[int]
-	_ = f1[T /* ERROR T to satisfy comparable requires go1\.20 or later */]
-	_ = f1[any /* ERROR any to satisfy comparable requires go1\.20 or later */]
+	_ = f1[T /* ERROR "T to satisfy comparable requires go1.20 or later" */]
+	_ = f1[any /* ERROR "any to satisfy comparable requires go1.20 or later" */]
 	_ = f1[P]
 	_ = f1[Q]
-	_ = f1[R /* ERROR R does not satisfy comparable */]
+	_ = f1[R /* ERROR "R does not satisfy comparable" */]
 
 	_ = f2[int]
-	_ = f2[T /* ERROR T to satisfy comparable requires go1\.20 or later */]
-	_ = f2[any /* ERROR any to satisfy comparable requires go1\.20 or later */]
+	_ = f2[T /* ERROR "T to satisfy comparable requires go1.20 or later" */]
+	_ = f2[any /* ERROR "any to satisfy comparable requires go1.20 or later" */]
 	_ = f2[P]
 	_ = f2[Q]
-	_ = f2[R /* ERROR R does not satisfy comparable */]
+	_ = f2[R /* ERROR "R does not satisfy comparable" */]
 }
diff --git a/src/internal/types/testdata/spec/comparisons.go b/src/internal/types/testdata/spec/comparisons.go
index 886e78c..492890e 100644
--- a/src/internal/types/testdata/spec/comparisons.go
+++ b/src/internal/types/testdata/spec/comparisons.go
@@ -29,37 +29,37 @@
 )
 
 func _() {
-	_ = nil == nil // ERROR operator == not defined on untyped nil
+	_ = nil == nil // ERROR "operator == not defined on untyped nil"
 	_ = b == b
-	_ = a /* ERROR \[10\]func\(\) cannot be compared */ == a
-	_ = l /* ERROR slice can only be compared to nil */ == l
-	_ = s /* ERROR struct containing \[\]byte cannot be compared */ == s
+	_ = a /* ERROR "[10]func() cannot be compared" */ == a
+	_ = l /* ERROR "slice can only be compared to nil" */ == l
+	_ = s /* ERROR "struct containing []byte cannot be compared" */ == s
 	_ = p == p
-	_ = f /* ERROR func can only be compared to nil */ == f
+	_ = f /* ERROR "func can only be compared to nil" */ == f
 	_ = i == i
-	_ = m /* ERROR map can only be compared to nil */ == m
+	_ = m /* ERROR "map can only be compared to nil" */ == m
 	_ = c == c
 
-	_ = b == nil /* ERROR mismatched types */
-	_ = a == nil /* ERROR mismatched types */
+	_ = b == nil /* ERROR "mismatched types" */
+	_ = a == nil /* ERROR "mismatched types" */
 	_ = l == nil
-	_ = s == nil /* ERROR mismatched types */
+	_ = s == nil /* ERROR "mismatched types" */
 	_ = p == nil
 	_ = f == nil
 	_ = i == nil
 	_ = m == nil
 	_ = c == nil
 
-	_ = nil /* ERROR operator < not defined on untyped nil */ < nil
+	_ = nil /* ERROR "operator < not defined on untyped nil" */ < nil
 	_ = b < b
-	_ = a /* ERROR operator < not defined on array */ < a
-	_ = l /* ERROR operator < not defined on slice */ < l
-	_ = s /* ERROR operator < not defined on struct */ < s
-	_ = p /* ERROR operator < not defined on pointer */ < p
-	_ = f /* ERROR operator < not defined on func */ < f
-	_ = i /* ERROR operator < not defined on interface */ < i
-	_ = m /* ERROR operator < not defined on map */ < m
-	_ = c /* ERROR operator < not defined on chan */ < c
+	_ = a /* ERROR "operator < not defined on array" */ < a
+	_ = l /* ERROR "operator < not defined on slice" */ < l
+	_ = s /* ERROR "operator < not defined on struct" */ < s
+	_ = p /* ERROR "operator < not defined on pointer" */ < p
+	_ = f /* ERROR "operator < not defined on func" */ < f
+	_ = i /* ERROR "operator < not defined on interface" */ < i
+	_ = m /* ERROR "operator < not defined on map" */ < m
+	_ = c /* ERROR "operator < not defined on chan" */ < c
 }
 
 func _[
@@ -86,35 +86,35 @@
 	c C,
 ) {
 	_ = b == b
-	_ = a /* ERROR incomparable types in type set */ == a
-	_ = l /* ERROR incomparable types in type set */ == l
-	_ = s /* ERROR incomparable types in type set */ == s
+	_ = a /* ERROR "incomparable types in type set" */ == a
+	_ = l /* ERROR "incomparable types in type set" */ == l
+	_ = s /* ERROR "incomparable types in type set" */ == s
 	_ = p == p
-	_ = f /* ERROR incomparable types in type set */ == f
-	_ = i /* ERROR incomparable types in type set */ == i
+	_ = f /* ERROR "incomparable types in type set" */ == f
+	_ = i /* ERROR "incomparable types in type set" */ == i
 	_ = j == j
-	_ = m /* ERROR incomparable types in type set */ == m
+	_ = m /* ERROR "incomparable types in type set" */ == m
 	_ = c == c
 
-	_ = b == nil /* ERROR mismatched types */
-	_ = a == nil /* ERROR mismatched types */
+	_ = b == nil /* ERROR "mismatched types" */
+	_ = a == nil /* ERROR "mismatched types" */
 	_ = l == nil
-	_ = s == nil /* ERROR mismatched types */
+	_ = s == nil /* ERROR "mismatched types" */
 	_ = p == nil
 	_ = f == nil
-	_ = i == nil /* ERROR mismatched types */
-	_ = j == nil /* ERROR mismatched types */
+	_ = i == nil /* ERROR "mismatched types" */
+	_ = j == nil /* ERROR "mismatched types" */
 	_ = m == nil
 	_ = c == nil
 
 	_ = b < b
-	_ = a /* ERROR type parameter A is not comparable with < */ < a
-	_ = l /* ERROR type parameter L is not comparable with < */ < l
-	_ = s /* ERROR type parameter S is not comparable with < */ < s
-	_ = p /* ERROR type parameter P is not comparable with < */ < p
-	_ = f /* ERROR type parameter F is not comparable with < */ < f
-	_ = i /* ERROR type parameter I is not comparable with < */ < i
-	_ = j /* ERROR type parameter J is not comparable with < */ < j
-	_ = m /* ERROR type parameter M is not comparable with < */ < m
-	_ = c /* ERROR type parameter C is not comparable with < */ < c
+	_ = a /* ERROR "type parameter A is not comparable with <" */ < a
+	_ = l /* ERROR "type parameter L is not comparable with <" */ < l
+	_ = s /* ERROR "type parameter S is not comparable with <" */ < s
+	_ = p /* ERROR "type parameter P is not comparable with <" */ < p
+	_ = f /* ERROR "type parameter F is not comparable with <" */ < f
+	_ = i /* ERROR "type parameter I is not comparable with <" */ < i
+	_ = j /* ERROR "type parameter J is not comparable with <" */ < j
+	_ = m /* ERROR "type parameter M is not comparable with <" */ < m
+	_ = c /* ERROR "type parameter C is not comparable with <" */ < c
 }
diff --git a/src/internal/types/testdata/spec/conversions.go b/src/internal/types/testdata/spec/conversions.go
index fc014fc..081439e 100644
--- a/src/internal/types/testdata/spec/conversions.go
+++ b/src/internal/types/testdata/spec/conversions.go
@@ -9,22 +9,22 @@
 // constant conversions
 
 func _[T ~byte]() T { return 255 }
-func _[T ~byte]() T { return 256 /* ERROR cannot use 256 .* as T value */ }
+func _[T ~byte]() T { return 256 /* ERRORx `cannot use 256 .* as T value` */ }
 
 func _[T ~byte]() {
-	const _ = T /* ERROR T\(0\) .* is not constant */ (0)
+	const _ = T /* ERRORx `T\(0\) .* is not constant` */ (0)
 	var _ T = 255
-	var _ T = 256 // ERROR cannot use 256 .* as T value
+	var _ T = 256 // ERRORx `cannot use 256 .* as T value`
 }
 
 func _[T ~string]() T                { return T('a') }
 func _[T ~int | ~string]() T         { return T('a') }
-func _[T ~byte | ~int | ~string]() T { return T(256 /* ERROR cannot convert 256 .* to type T */) }
+func _[T ~byte | ~int | ~string]() T { return T(256 /* ERRORx `cannot convert 256 .* to type T` */) }
 
 // implicit conversions never convert to string
 func _[T ~string]() {
-	var _ string = 0 // ERROR cannot use .* as string value
-	var _ T = 0      // ERROR cannot use .* as T value
+	var _ string = 0 // ERRORx `cannot use .* as string value`
+	var _ T = 0      // ERRORx `cannot use .* as T value`
 }
 
 // failing const conversions of constants to type parameters report a cause
@@ -34,10 +34,10 @@
 	T3 ~int | ~float64 | ~bool,
 	T4 ~int | ~string,
 ]() {
-	_ = T1(0 /* ERROR cannot convert 0 .* to type T1: T1 does not contain specific types */)
-	_ = T2(1 /* ERROR cannot convert 1 .* to type T2: T2 does not contain specific types */)
-	_ = T3(2 /* ERROR cannot convert 2 .* to type T3: cannot convert 2 .* to type bool \(in T3\) */)
-	_ = T4(3.14 /* ERROR cannot convert 3.14 .* to type T4: cannot convert 3.14 .* to type int \(in T4\) */)
+	_ = T1(0 /* ERRORx `cannot convert 0 .* to type T1: T1 does not contain specific types` */)
+	_ = T2(1 /* ERRORx `cannot convert 1 .* to type T2: T2 does not contain specific types` */)
+	_ = T3(2 /* ERRORx `cannot convert 2 .* to type T3: cannot convert 2 .* to type bool \(in T3\)` */)
+	_ = T4(3.14 /* ERRORx `cannot convert 3.14 .* to type T4: cannot convert 3.14 .* to type int \(in T4\)` */)
 }
 
 // "x is assignable to T"
@@ -66,7 +66,7 @@
 func _[X Foo | Bar, T Bar](x X) T { return T(x) }
 func _[X Foo, T Foo | Bar](x X) T { return T(x) }
 func _[X Foo, T Far](x X) T {
-	return T(x /* ERROR cannot convert x \(variable of type X constrained by Foo\) to type T: cannot convert Foo \(in X\) to type Far \(in T\) */)
+	return T(x /* ERROR "cannot convert x (variable of type X constrained by Foo) to type T: cannot convert Foo (in X) to type Far (in T)" */)
 }
 
 // "x's type and T are unnamed pointer types and their pointer base types
@@ -76,7 +76,7 @@
 func _[X ~*Foo | ~*Bar, T ~*Bar](x X) T { return T(x) }
 func _[X ~*Foo, T ~*Foo | ~*Bar](x X) T { return T(x) }
 func _[X ~*Foo, T ~*Far](x X) T {
-	return T(x /* ERROR cannot convert x \(variable of type X constrained by ~\*Foo\) to type T: cannot convert \*Foo \(in X\) to type \*Far \(in T\) */)
+	return T(x /* ERROR "cannot convert x (variable of type X constrained by ~*Foo) to type T: cannot convert *Foo (in X) to type *Far (in T)" */)
 }
 
 // Verify that the defined types in constraints are considered for the rule above.
@@ -88,10 +88,10 @@
 	T0 *C
 )
 
-func _(x X0) T0           { return T0(x /* ERROR cannot convert */) } // non-generic reference
-func _[X X0, T T0](x X) T { return T(x /* ERROR cannot convert */) }
-func _[T T0](x X0) T      { return T(x /* ERROR cannot convert */) }
-func _[X X0](x X) T0      { return T0(x /* ERROR cannot convert */) }
+func _(x X0) T0           { return T0(x /* ERROR "cannot convert" */) } // non-generic reference
+func _[X X0, T T0](x X) T { return T(x /* ERROR "cannot convert" */) }
+func _[T T0](x X0) T      { return T(x /* ERROR "cannot convert" */) }
+func _[X X0](x X) T0      { return T0(x /* ERROR "cannot convert" */) }
 
 // "x's type and T are both integer or floating point types"
 
@@ -109,14 +109,14 @@
 
 func _[X, T Integer | Unsigned | Float](x X) T { return T(x) }
 func _[X, T Integer | ~string](x X) T {
-	return T(x /* ERROR cannot convert x \(variable of type X constrained by Integer \| ~string\) to type T: cannot convert string \(in X\) to type int \(in T\) */)
+	return T(x /* ERROR "cannot convert x (variable of type X constrained by Integer | ~string) to type T: cannot convert string (in X) to type int (in T)" */)
 }
 
 // "x's type and T are both complex types"
 
 func _[X, T Complex](x X) T { return T(x) }
 func _[X, T Float | Complex](x X) T {
-	return T(x /* ERROR cannot convert x \(variable of type X constrained by Float \| Complex\) to type T: cannot convert float32 \(in X\) to type complex64 \(in T\) */)
+	return T(x /* ERROR "cannot convert x (variable of type X constrained by Float | Complex) to type T: cannot convert float32 (in X) to type complex64 (in T)" */)
 }
 
 // "x is an integer or a slice of bytes or runes and T is a string type"
@@ -129,7 +129,7 @@
 func _[X Integer](x X) string   { return string(x) }
 func _[X Integer](x X) myString { return myString(x) }
 func _[X Integer](x X) *string {
-	return (*string)(x /* ERROR cannot convert x \(variable of type X constrained by Integer\) to type \*string: cannot convert int \(in X\) to type \*string */)
+	return (*string)(x /* ERROR "cannot convert x (variable of type X constrained by Integer) to type *string: cannot convert int (in X) to type *string" */)
 }
 
 func _[T ~string](x []byte) T                           { return T(x) }
@@ -138,7 +138,7 @@
 func _[X ~[]rune, T ~string](x X) T                     { return T(x) }
 func _[X Integer | ~[]byte | ~[]rune, T ~string](x X) T { return T(x) }
 func _[X Integer | ~[]byte | ~[]rune, T ~*string](x X) T {
-	return T(x /* ERROR cannot convert x \(variable of type X constrained by Integer \| ~\[\]byte \| ~\[\]rune\) to type T: cannot convert int \(in X\) to type \*string \(in T\) */)
+	return T(x /* ERROR "cannot convert x (variable of type X constrained by Integer | ~[]byte | ~[]rune) to type T: cannot convert int (in X) to type *string (in T)" */)
 }
 
 // "x is a string and T is a slice of bytes or runes"
@@ -146,14 +146,14 @@
 func _[T ~[]byte](x string) T { return T(x) }
 func _[T ~[]rune](x string) T { return T(x) }
 func _[T ~[]rune](x *string) T {
-	return T(x /* ERROR cannot convert x \(variable of type \*string\) to type T: cannot convert \*string to type \[\]rune \(in T\) */)
+	return T(x /* ERROR "cannot convert x (variable of type *string) to type T: cannot convert *string to type []rune (in T)" */)
 }
 
 func _[X ~string, T ~[]byte](x X) T           { return T(x) }
 func _[X ~string, T ~[]rune](x X) T           { return T(x) }
 func _[X ~string, T ~[]byte | ~[]rune](x X) T { return T(x) }
 func _[X ~*string, T ~[]byte | ~[]rune](x X) T {
-	return T(x /* ERROR cannot convert x \(variable of type X constrained by ~\*string\) to type T: cannot convert \*string \(in X\) to type \[\]byte \(in T\) */)
+	return T(x /* ERROR "cannot convert x (variable of type X constrained by ~*string) to type T: cannot convert *string (in X) to type []byte (in T)" */)
 }
 
 // package unsafe:
@@ -164,7 +164,7 @@
 func _[X ~uintptr](x X) unsafe.Pointer  { return unsafe.Pointer(x) }
 func _[T unsafe.Pointer](x myUintptr) T { return T(x) }
 func _[T unsafe.Pointer](x int64) T {
-	return T(x /* ERROR cannot convert x \(variable of type int64\) to type T: cannot convert int64 to type unsafe\.Pointer \(in T\) */)
+	return T(x /* ERROR "cannot convert x (variable of type int64) to type T: cannot convert int64 to type unsafe.Pointer (in T)" */)
 }
 
 // "and vice versa"
@@ -173,7 +173,7 @@
 func _[X unsafe.Pointer](x X) uintptr   { return uintptr(x) }
 func _[X unsafe.Pointer](x X) myUintptr { return myUintptr(x) }
 func _[X unsafe.Pointer](x X) int64 {
-	return int64(x /* ERROR cannot convert x \(variable of type X constrained by unsafe\.Pointer\) to type int64: cannot convert unsafe\.Pointer \(in X\) to type int64 */)
+	return int64(x /* ERROR "cannot convert x (variable of type X constrained by unsafe.Pointer) to type int64: cannot convert unsafe.Pointer (in X) to type int64" */)
 }
 
 // "x is a slice, T is an array or pointer-to-array type,
diff --git a/src/internal/types/testdata/spec/oldcomparable.go b/src/internal/types/testdata/spec/oldcomparable.go
deleted file mode 100644
index 081d972..0000000
--- a/src/internal/types/testdata/spec/oldcomparable.go
+++ /dev/null
@@ -1,28 +0,0 @@
-// -oldComparableSemantics
-
-// Copyright 2022 The Go Authors. 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
-
-func f1[_ comparable]()              {}
-func f2[_ interface{ comparable }]() {}
-
-type T interface{ m() }
-
-func _[P comparable, Q ~int, R any]() {
-	_ = f1[int]
-	_ = f1[T /* ERROR T does not satisfy comparable */]
-	_ = f1[any /* ERROR any does not satisfy comparable */]
-	_ = f1[P]
-	_ = f1[Q]
-	_ = f1[R /* ERROR R does not satisfy comparable */]
-
-	_ = f2[int]
-	_ = f2[T /* ERROR T does not satisfy comparable */]
-	_ = f2[any /* ERROR any does not satisfy comparable */]
-	_ = f2[P]
-	_ = f2[Q]
-	_ = f2[R /* ERROR R does not satisfy comparable */]
-}
diff --git a/src/internal/xcoff/ar.go b/src/internal/xcoff/ar.go
index 2b432d5..9cbd50d 100644
--- a/src/internal/xcoff/ar.go
+++ b/src/internal/xcoff/ar.go
@@ -211,12 +211,11 @@
 	}
 
 	return arch, nil
-
 }
 
 // GetFile returns the XCOFF file defined by member name.
 // FIXME: This doesn't work if an archive has two members with the same
-// name which can occur if a archive has both 32-bits and 64-bits files.
+// name which can occur if an archive has both 32-bits and 64-bits files.
 func (arch *Archive) GetFile(name string) (*File, error) {
 	for _, mem := range arch.Members {
 		if mem.Name == name {
@@ -224,5 +223,4 @@
 		}
 	}
 	return nil, fmt.Errorf("unknown member %s in archive", name)
-
 }
diff --git a/src/internal/xcoff/file.go b/src/internal/xcoff/file.go
index e859de9..9135822 100644
--- a/src/internal/xcoff/file.go
+++ b/src/internal/xcoff/file.go
@@ -173,7 +173,7 @@
 	}
 	var nscns uint16
 	var symptr uint64
-	var nsyms int32
+	var nsyms uint32
 	var opthdr uint16
 	var hdrsz int
 	switch f.TargetMachine {
@@ -225,7 +225,11 @@
 	if _, err := sr.Seek(int64(hdrsz)+int64(opthdr), io.SeekStart); err != nil {
 		return nil, err
 	}
-	f.Sections = make([]*Section, nscns)
+	c := saferio.SliceCap((**Section)(nil), uint64(nscns))
+	if c < 0 {
+		return nil, fmt.Errorf("too many XCOFF sections (%d)", nscns)
+	}
+	f.Sections = make([]*Section, 0, c)
 	for i := 0; i < int(nscns); i++ {
 		var scnptr uint64
 		s := new(Section)
@@ -261,7 +265,7 @@
 		}
 		s.sr = io.NewSectionReader(r2, int64(scnptr), int64(s.Size))
 		s.ReaderAt = s.sr
-		f.Sections[i] = s
+		f.Sections = append(f.Sections, s)
 	}
 
 	// Symbol map needed by relocation
@@ -283,9 +287,6 @@
 				return nil, err
 			}
 			numaux = int(se.Nnumaux)
-			if numaux < 0 {
-				return nil, fmt.Errorf("malformed symbol table, invalid number of aux symbols")
-			}
 			sym.SectionNumber = int(se.Nscnum)
 			sym.StorageClass = int(se.Nsclass)
 			sym.Value = uint64(se.Nvalue)
@@ -306,9 +307,6 @@
 				return nil, err
 			}
 			numaux = int(se.Nnumaux)
-			if numaux < 0 {
-				return nil, fmt.Errorf("malformed symbol table, invalid number of aux symbols")
-			}
 			sym.SectionNumber = int(se.Nscnum)
 			sym.StorageClass = int(se.Nsclass)
 			sym.Value = se.Nvalue
@@ -394,34 +392,39 @@
 
 	// Read relocations
 	// Only for .data or .text section
-	for _, sect := range f.Sections {
+	for sectNum, sect := range f.Sections {
 		if sect.Type != STYP_TEXT && sect.Type != STYP_DATA {
 			continue
 		}
-		sect.Relocs = make([]Reloc, sect.Nreloc)
 		if sect.Relptr == 0 {
 			continue
 		}
+		c := saferio.SliceCap((*Reloc)(nil), uint64(sect.Nreloc))
+		if c < 0 {
+			return nil, fmt.Errorf("too many relocs (%d) for section %d", sect.Nreloc, sectNum)
+		}
+		sect.Relocs = make([]Reloc, 0, c)
 		if _, err := sr.Seek(int64(sect.Relptr), io.SeekStart); err != nil {
 			return nil, err
 		}
 		for i := uint32(0); i < sect.Nreloc; i++ {
+			var reloc Reloc
 			switch f.TargetMachine {
 			case U802TOCMAGIC:
 				rel := new(Reloc32)
 				if err := binary.Read(sr, binary.BigEndian, rel); err != nil {
 					return nil, err
 				}
-				sect.Relocs[i].VirtualAddress = uint64(rel.Rvaddr)
-				sect.Relocs[i].Symbol = idxToSym[int(rel.Rsymndx)]
-				sect.Relocs[i].Type = rel.Rtype
-				sect.Relocs[i].Length = rel.Rsize&0x3F + 1
+				reloc.VirtualAddress = uint64(rel.Rvaddr)
+				reloc.Symbol = idxToSym[int(rel.Rsymndx)]
+				reloc.Type = rel.Rtype
+				reloc.Length = rel.Rsize&0x3F + 1
 
 				if rel.Rsize&0x80 != 0 {
-					sect.Relocs[i].Signed = true
+					reloc.Signed = true
 				}
 				if rel.Rsize&0x40 != 0 {
-					sect.Relocs[i].InstructionFixed = true
+					reloc.InstructionFixed = true
 				}
 
 			case U64_TOCMAGIC:
@@ -429,17 +432,19 @@
 				if err := binary.Read(sr, binary.BigEndian, rel); err != nil {
 					return nil, err
 				}
-				sect.Relocs[i].VirtualAddress = rel.Rvaddr
-				sect.Relocs[i].Symbol = idxToSym[int(rel.Rsymndx)]
-				sect.Relocs[i].Type = rel.Rtype
-				sect.Relocs[i].Length = rel.Rsize&0x3F + 1
+				reloc.VirtualAddress = rel.Rvaddr
+				reloc.Symbol = idxToSym[int(rel.Rsymndx)]
+				reloc.Type = rel.Rtype
+				reloc.Length = rel.Rsize&0x3F + 1
 				if rel.Rsize&0x80 != 0 {
-					sect.Relocs[i].Signed = true
+					reloc.Signed = true
 				}
 				if rel.Rsize&0x40 != 0 {
-					sect.Relocs[i].InstructionFixed = true
+					reloc.InstructionFixed = true
 				}
 			}
+
+			sect.Relocs = append(sect.Relocs, reloc)
 		}
 	}
 
@@ -517,7 +522,7 @@
 		return nil, err
 	}
 	var istlen uint32
-	var nimpid int32
+	var nimpid uint32
 	var impoff uint64
 	switch f.TargetMachine {
 	case U802TOCMAGIC:
@@ -587,7 +592,7 @@
 	}
 	var stlen uint32
 	var stoff uint64
-	var nsyms int32
+	var nsyms uint32
 	var symoff uint64
 	switch f.TargetMachine {
 	case U802TOCMAGIC:
@@ -632,7 +637,7 @@
 	all := make([]ImportedSymbol, 0)
 	for i := 0; i < int(nsyms); i++ {
 		var name string
-		var ifile int32
+		var ifile uint32
 		var ok bool
 		switch f.TargetMachine {
 		case U802TOCMAGIC:
diff --git a/src/internal/xcoff/xcoff.go b/src/internal/xcoff/xcoff.go
index f8465d7..db81542 100644
--- a/src/internal/xcoff/xcoff.go
+++ b/src/internal/xcoff/xcoff.go
@@ -8,9 +8,9 @@
 type FileHeader32 struct {
 	Fmagic   uint16 // Target machine
 	Fnscns   uint16 // Number of sections
-	Ftimedat int32  // Time and date of file creation
+	Ftimedat uint32 // Time and date of file creation
 	Fsymptr  uint32 // Byte offset to symbol table start
-	Fnsyms   int32  // Number of entries in symbol table
+	Fnsyms   uint32 // Number of entries in symbol table
 	Fopthdr  uint16 // Number of bytes in optional header
 	Fflags   uint16 // Flags
 }
@@ -18,11 +18,11 @@
 type FileHeader64 struct {
 	Fmagic   uint16 // Target machine
 	Fnscns   uint16 // Number of sections
-	Ftimedat int32  // Time and date of file creation
+	Ftimedat uint32 // Time and date of file creation
 	Fsymptr  uint64 // Byte offset to symbol table start
 	Fopthdr  uint16 // Number of bytes in optional header
 	Fflags   uint16 // Flags
-	Fnsyms   int32  // Number of entries in symbol table
+	Fnsyms   uint32 // Number of entries in symbol table
 }
 
 const (
@@ -109,19 +109,19 @@
 type SymEnt32 struct {
 	Nname   [8]byte // Symbol name
 	Nvalue  uint32  // Symbol value
-	Nscnum  int16   // Section number of symbol
+	Nscnum  uint16  // Section number of symbol
 	Ntype   uint16  // Basic and derived type specification
-	Nsclass int8    // Storage class of symbol
-	Nnumaux int8    // Number of auxiliary entries
+	Nsclass uint8   // Storage class of symbol
+	Nnumaux uint8   // Number of auxiliary entries
 }
 
 type SymEnt64 struct {
 	Nvalue  uint64 // Symbol value
 	Noffset uint32 // Offset of the name in string table or .debug section
-	Nscnum  int16  // Section number of symbol
+	Nscnum  uint16 // Section number of symbol
 	Ntype   uint16 // Basic and derived type specification
-	Nsclass int8   // Storage class of symbol
-	Nnumaux int8   // Number of auxiliary entries
+	Nsclass uint8  // Storage class of symbol
+	Nnumaux uint8  // Number of auxiliary entries
 }
 
 const SYMESZ = 18
@@ -203,7 +203,7 @@
 
 // csect Auxiliary Entry.
 type AuxCSect32 struct {
-	Xscnlen   int32  // Length or symbol table index
+	Xscnlen   uint32 // Length or symbol table index
 	Xparmhash uint32 // Offset of parameter type-check string
 	Xsnhash   uint16 // .typchk section number
 	Xsmtyp    uint8  // Symbol alignment and type
@@ -218,7 +218,7 @@
 	Xsnhash   uint16 // .typchk section number
 	Xsmtyp    uint8  // Symbol alignment and type
 	Xsmclas   uint8  // Storage-mapping class
-	Xscnlenhi int32  // Upper 4 bytes of length or symbol table index
+	Xscnlenhi uint32 // Upper 4 bytes of length or symbol table index
 	Xpad      uint8  // Unused
 	Xauxtype  uint8  // Type of auxiliary entry
 }
@@ -274,22 +274,22 @@
 
 // Loader Header.
 type LoaderHeader32 struct {
-	Lversion int32  // Loader section version number
-	Lnsyms   int32  // Number of symbol table entries
-	Lnreloc  int32  // Number of relocation table entries
+	Lversion uint32 // Loader section version number
+	Lnsyms   uint32 // Number of symbol table entries
+	Lnreloc  uint32 // Number of relocation table entries
 	Listlen  uint32 // Length of import file ID string table
-	Lnimpid  int32  // Number of import file IDs
+	Lnimpid  uint32 // Number of import file IDs
 	Limpoff  uint32 // Offset to start of import file IDs
 	Lstlen   uint32 // Length of string table
 	Lstoff   uint32 // Offset to start of string table
 }
 
 type LoaderHeader64 struct {
-	Lversion int32  // Loader section version number
-	Lnsyms   int32  // Number of symbol table entries
-	Lnreloc  int32  // Number of relocation table entries
+	Lversion uint32 // Loader section version number
+	Lnsyms   uint32 // Number of symbol table entries
+	Lnreloc  uint32 // Number of relocation table entries
 	Listlen  uint32 // Length of import file ID string table
-	Lnimpid  int32  // Number of import file IDs
+	Lnimpid  uint32 // Number of import file IDs
 	Lstlen   uint32 // Length of string table
 	Limpoff  uint64 // Offset to start of import file IDs
 	Lstoff   uint64 // Offset to start of string table
@@ -306,20 +306,20 @@
 type LoaderSymbol32 struct {
 	Lname   [8]byte // Symbol name or byte offset into string table
 	Lvalue  uint32  // Address field
-	Lscnum  int16   // Section number containing symbol
-	Lsmtype int8    // Symbol type, export, import flags
-	Lsmclas int8    // Symbol storage class
-	Lifile  int32   // Import file ID; ordinal of import file IDs
+	Lscnum  uint16  // Section number containing symbol
+	Lsmtype uint8   // Symbol type, export, import flags
+	Lsmclas uint8   // Symbol storage class
+	Lifile  uint32  // Import file ID; ordinal of import file IDs
 	Lparm   uint32  // Parameter type-check field
 }
 
 type LoaderSymbol64 struct {
 	Lvalue  uint64 // Address field
 	Loffset uint32 // Byte offset into string table of symbol name
-	Lscnum  int16  // Section number containing symbol
-	Lsmtype int8   // Symbol type, export, import flags
-	Lsmclas int8   // Symbol storage class
-	Lifile  int32  // Import file ID; ordinal of import file IDs
+	Lscnum  uint16 // Section number containing symbol
+	Lsmtype uint8  // Symbol type, export, import flags
+	Lsmclas uint8  // Symbol storage class
+	Lifile  uint32 // Import file ID; ordinal of import file IDs
 	Lparm   uint32 // Parameter type-check field
 }
 
diff --git a/src/internal/zstd/bits.go b/src/internal/zstd/bits.go
new file mode 100644
index 0000000..c9a2f70
--- /dev/null
+++ b/src/internal/zstd/bits.go
@@ -0,0 +1,130 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package zstd
+
+import (
+	"math/bits"
+)
+
+// block is the data for a single compressed block.
+// The data starts immediately after the 3 byte block header,
+// and is Block_Size bytes long.
+type block []byte
+
+// bitReader reads a bit stream going forward.
+type bitReader struct {
+	r    *Reader // for error reporting
+	data block   // the bits to read
+	off  uint32  // current offset into data
+	bits uint32  // bits ready to be returned
+	cnt  uint32  // number of valid bits in the bits field
+}
+
+// makeBitReader makes a bit reader starting at off.
+func (r *Reader) makeBitReader(data block, off int) bitReader {
+	return bitReader{
+		r:    r,
+		data: data,
+		off:  uint32(off),
+	}
+}
+
+// moreBits is called to read more bits.
+// This ensures that at least 16 bits are available.
+func (br *bitReader) moreBits() error {
+	for br.cnt < 16 {
+		if br.off >= uint32(len(br.data)) {
+			return br.r.makeEOFError(int(br.off))
+		}
+		c := br.data[br.off]
+		br.off++
+		br.bits |= uint32(c) << br.cnt
+		br.cnt += 8
+	}
+	return nil
+}
+
+// val is called to fetch a value of b bits.
+func (br *bitReader) val(b uint8) uint32 {
+	r := br.bits & ((1 << b) - 1)
+	br.bits >>= b
+	br.cnt -= uint32(b)
+	return r
+}
+
+// backup steps back to the last byte we used.
+func (br *bitReader) backup() {
+	for br.cnt >= 8 {
+		br.off--
+		br.cnt -= 8
+	}
+}
+
+// makeError returns an error at the current offset wrapping a string.
+func (br *bitReader) makeError(msg string) error {
+	return br.r.makeError(int(br.off), msg)
+}
+
+// reverseBitReader reads a bit stream in reverse.
+type reverseBitReader struct {
+	r     *Reader // for error reporting
+	data  block   // the bits to read
+	off   uint32  // current offset into data
+	start uint32  // start in data; we read backward to start
+	bits  uint32  // bits ready to be returned
+	cnt   uint32  // number of valid bits in bits field
+}
+
+// makeReverseBitReader makes a reverseBitReader reading backward
+// from off to start. The bitstream starts with a 1 bit in the last
+// byte, at off.
+func (r *Reader) makeReverseBitReader(data block, off, start int) (reverseBitReader, error) {
+	streamStart := data[off]
+	if streamStart == 0 {
+		return reverseBitReader{}, r.makeError(off, "zero byte at reverse bit stream start")
+	}
+	rbr := reverseBitReader{
+		r:     r,
+		data:  data,
+		off:   uint32(off),
+		start: uint32(start),
+		bits:  uint32(streamStart),
+		cnt:   uint32(7 - bits.LeadingZeros8(streamStart)),
+	}
+	return rbr, nil
+}
+
+// val is called to fetch a value of b bits.
+func (rbr *reverseBitReader) val(b uint8) (uint32, error) {
+	if !rbr.fetch(b) {
+		return 0, rbr.r.makeEOFError(int(rbr.off))
+	}
+
+	rbr.cnt -= uint32(b)
+	v := (rbr.bits >> rbr.cnt) & ((1 << b) - 1)
+	return v, nil
+}
+
+// fetch is called to ensure that at least b bits are available.
+// It reports false if this can't be done,
+// in which case only rbr.cnt bits are available.
+func (rbr *reverseBitReader) fetch(b uint8) bool {
+	for rbr.cnt < uint32(b) {
+		if rbr.off <= rbr.start {
+			return false
+		}
+		rbr.off--
+		c := rbr.data[rbr.off]
+		rbr.bits <<= 8
+		rbr.bits |= uint32(c)
+		rbr.cnt += 8
+	}
+	return true
+}
+
+// makeError returns an error at the current offset wrapping a string.
+func (rbr *reverseBitReader) makeError(msg string) error {
+	return rbr.r.makeError(int(rbr.off), msg)
+}
diff --git a/src/internal/zstd/block.go b/src/internal/zstd/block.go
new file mode 100644
index 0000000..bd3040c
--- /dev/null
+++ b/src/internal/zstd/block.go
@@ -0,0 +1,436 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package zstd
+
+import (
+	"io"
+)
+
+// debug can be set in the source to print debug info using println.
+const debug = false
+
+// compressedBlock decompresses a compressed block, storing the decompressed
+// data in r.buffer. The blockSize argument is the compressed size.
+// RFC 3.1.1.3.
+func (r *Reader) compressedBlock(blockSize int) error {
+	if len(r.compressedBuf) >= blockSize {
+		r.compressedBuf = r.compressedBuf[:blockSize]
+	} else {
+		// We know that blockSize <= 128K,
+		// so this won't allocate an enormous amount.
+		need := blockSize - len(r.compressedBuf)
+		r.compressedBuf = append(r.compressedBuf, make([]byte, need)...)
+	}
+
+	if _, err := io.ReadFull(r.r, r.compressedBuf); err != nil {
+		return r.wrapNonEOFError(0, err)
+	}
+
+	data := block(r.compressedBuf)
+	off := 0
+	r.buffer = r.buffer[:0]
+
+	litoff, litbuf, err := r.readLiterals(data, off, r.literals[:0])
+	if err != nil {
+		return err
+	}
+	r.literals = litbuf
+
+	off = litoff
+
+	seqCount, off, err := r.initSeqs(data, off)
+	if err != nil {
+		return err
+	}
+
+	if seqCount == 0 {
+		// No sequences, just literals.
+		if off < len(data) {
+			return r.makeError(off, "extraneous data after no sequences")
+		}
+		if len(litbuf) == 0 {
+			return r.makeError(off, "no sequences and no literals")
+		}
+		r.buffer = append(r.buffer, litbuf...)
+		return nil
+	}
+
+	return r.execSeqs(data, off, litbuf, seqCount)
+}
+
+// seqCode is the kind of sequence codes we have to handle.
+type seqCode int
+
+const (
+	seqLiteral seqCode = iota
+	seqOffset
+	seqMatch
+)
+
+// seqCodeInfoData is the information needed to set up seqTables and
+// seqTableBits for a particular kind of sequence code.
+type seqCodeInfoData struct {
+	predefTable     []fseBaselineEntry // predefined FSE
+	predefTableBits int                // number of bits in predefTable
+	maxSym          int                // max symbol value in FSE
+	maxBits         int                // max bits for FSE
+
+	// toBaseline converts from an FSE table to an FSE baseline table.
+	toBaseline func(*Reader, int, []fseEntry, []fseBaselineEntry) error
+}
+
+// seqCodeInfo is the seqCodeInfoData for each kind of sequence code.
+var seqCodeInfo = [3]seqCodeInfoData{
+	seqLiteral: {
+		predefTable:     predefinedLiteralTable[:],
+		predefTableBits: 6,
+		maxSym:          35,
+		maxBits:         9,
+		toBaseline:      (*Reader).makeLiteralBaselineFSE,
+	},
+	seqOffset: {
+		predefTable:     predefinedOffsetTable[:],
+		predefTableBits: 5,
+		maxSym:          31,
+		maxBits:         8,
+		toBaseline:      (*Reader).makeOffsetBaselineFSE,
+	},
+	seqMatch: {
+		predefTable:     predefinedMatchTable[:],
+		predefTableBits: 6,
+		maxSym:          52,
+		maxBits:         9,
+		toBaseline:      (*Reader).makeMatchBaselineFSE,
+	},
+}
+
+// initSeqs reads the Sequences_Section_Header and sets up the FSE
+// tables used to read the sequence codes. It returns the number of
+// sequences and the new offset. RFC 3.1.1.3.2.1.
+func (r *Reader) initSeqs(data block, off int) (int, int, error) {
+	if off >= len(data) {
+		return 0, 0, r.makeEOFError(off)
+	}
+
+	seqHdr := data[off]
+	off++
+	if seqHdr == 0 {
+		return 0, off, nil
+	}
+
+	var seqCount int
+	if seqHdr < 128 {
+		seqCount = int(seqHdr)
+	} else if seqHdr < 255 {
+		if off >= len(data) {
+			return 0, 0, r.makeEOFError(off)
+		}
+		seqCount = ((int(seqHdr) - 128) << 8) + int(data[off])
+		off++
+	} else {
+		if off+1 >= len(data) {
+			return 0, 0, r.makeEOFError(off)
+		}
+		seqCount = int(data[off]) + (int(data[off+1]) << 8) + 0x7f00
+		off += 2
+	}
+
+	// Read the Symbol_Compression_Modes byte.
+
+	if off >= len(data) {
+		return 0, 0, r.makeEOFError(off)
+	}
+	symMode := data[off]
+	if symMode&3 != 0 {
+		return 0, 0, r.makeError(off, "invalid symbol compression mode")
+	}
+	off++
+
+	// Set up the FSE tables used to decode the sequence codes.
+
+	var err error
+	off, err = r.setSeqTable(data, off, seqLiteral, (symMode>>6)&3)
+	if err != nil {
+		return 0, 0, err
+	}
+
+	off, err = r.setSeqTable(data, off, seqOffset, (symMode>>4)&3)
+	if err != nil {
+		return 0, 0, err
+	}
+
+	off, err = r.setSeqTable(data, off, seqMatch, (symMode>>2)&3)
+	if err != nil {
+		return 0, 0, err
+	}
+
+	return seqCount, off, nil
+}
+
+// setSeqTable uses the Compression_Mode in mode to set up r.seqTables and
+// r.seqTableBits for kind. We store these in the Reader because one of
+// the modes simply reuses the value from the last block in the frame.
+func (r *Reader) setSeqTable(data block, off int, kind seqCode, mode byte) (int, error) {
+	info := &seqCodeInfo[kind]
+	switch mode {
+	case 0:
+		// Predefined_Mode
+		r.seqTables[kind] = info.predefTable
+		r.seqTableBits[kind] = uint8(info.predefTableBits)
+		return off, nil
+
+	case 1:
+		// RLE_Mode
+		if off >= len(data) {
+			return 0, r.makeEOFError(off)
+		}
+		rle := data[off]
+		off++
+
+		// Build a simple baseline table that always returns rle.
+
+		entry := []fseEntry{
+			{
+				sym:  rle,
+				bits: 0,
+				base: 0,
+			},
+		}
+		if cap(r.seqTableBuffers[kind]) == 0 {
+			r.seqTableBuffers[kind] = make([]fseBaselineEntry, 1<<info.maxBits)
+		}
+		r.seqTableBuffers[kind] = r.seqTableBuffers[kind][:1]
+		if err := info.toBaseline(r, off, entry, r.seqTableBuffers[kind]); err != nil {
+			return 0, err
+		}
+
+		r.seqTables[kind] = r.seqTableBuffers[kind]
+		r.seqTableBits[kind] = 0
+		return off, nil
+
+	case 2:
+		// FSE_Compressed_Mode
+		if cap(r.fseScratch) < 1<<info.maxBits {
+			r.fseScratch = make([]fseEntry, 1<<info.maxBits)
+		}
+		r.fseScratch = r.fseScratch[:1<<info.maxBits]
+
+		tableBits, roff, err := r.readFSE(data, off, info.maxSym, info.maxBits, r.fseScratch)
+		if err != nil {
+			return 0, err
+		}
+		r.fseScratch = r.fseScratch[:1<<tableBits]
+
+		if cap(r.seqTableBuffers[kind]) == 0 {
+			r.seqTableBuffers[kind] = make([]fseBaselineEntry, 1<<info.maxBits)
+		}
+		r.seqTableBuffers[kind] = r.seqTableBuffers[kind][:1<<tableBits]
+
+		if err := info.toBaseline(r, roff, r.fseScratch, r.seqTableBuffers[kind]); err != nil {
+			return 0, err
+		}
+
+		r.seqTables[kind] = r.seqTableBuffers[kind]
+		r.seqTableBits[kind] = uint8(tableBits)
+		return roff, nil
+
+	case 3:
+		// Repeat_Mode
+		if len(r.seqTables[kind]) == 0 {
+			return 0, r.makeError(off, "missing repeat sequence FSE table")
+		}
+		return off, nil
+	}
+	panic("unreachable")
+}
+
+// execSeqs reads and executes the sequences. RFC 3.1.1.3.2.1.2.
+func (r *Reader) execSeqs(data block, off int, litbuf []byte, seqCount int) error {
+	// Set up the initial states for the sequence code readers.
+
+	rbr, err := r.makeReverseBitReader(data, len(data)-1, off)
+	if err != nil {
+		return err
+	}
+
+	literalState, err := rbr.val(r.seqTableBits[seqLiteral])
+	if err != nil {
+		return err
+	}
+
+	offsetState, err := rbr.val(r.seqTableBits[seqOffset])
+	if err != nil {
+		return err
+	}
+
+	matchState, err := rbr.val(r.seqTableBits[seqMatch])
+	if err != nil {
+		return err
+	}
+
+	// Read and perform all the sequences. RFC 3.1.1.4.
+
+	seq := 0
+	for seq < seqCount {
+		if len(r.buffer)+len(litbuf) > 128<<10 {
+			return rbr.makeError("uncompressed size too big")
+		}
+
+		ptoffset := &r.seqTables[seqOffset][offsetState]
+		ptmatch := &r.seqTables[seqMatch][matchState]
+		ptliteral := &r.seqTables[seqLiteral][literalState]
+
+		add, err := rbr.val(ptoffset.basebits)
+		if err != nil {
+			return err
+		}
+		offset := ptoffset.baseline + add
+
+		add, err = rbr.val(ptmatch.basebits)
+		if err != nil {
+			return err
+		}
+		match := ptmatch.baseline + add
+
+		add, err = rbr.val(ptliteral.basebits)
+		if err != nil {
+			return err
+		}
+		literal := ptliteral.baseline + add
+
+		// Handle repeat offsets. RFC 3.1.1.5.
+		// See the comment in makeOffsetBaselineFSE.
+		if ptoffset.basebits > 1 {
+			r.repeatedOffset3 = r.repeatedOffset2
+			r.repeatedOffset2 = r.repeatedOffset1
+			r.repeatedOffset1 = offset
+		} else {
+			if literal == 0 {
+				offset++
+			}
+			switch offset {
+			case 1:
+				offset = r.repeatedOffset1
+			case 2:
+				offset = r.repeatedOffset2
+				r.repeatedOffset2 = r.repeatedOffset1
+				r.repeatedOffset1 = offset
+			case 3:
+				offset = r.repeatedOffset3
+				r.repeatedOffset3 = r.repeatedOffset2
+				r.repeatedOffset2 = r.repeatedOffset1
+				r.repeatedOffset1 = offset
+			case 4:
+				offset = r.repeatedOffset1 - 1
+				r.repeatedOffset3 = r.repeatedOffset2
+				r.repeatedOffset2 = r.repeatedOffset1
+				r.repeatedOffset1 = offset
+			}
+		}
+
+		seq++
+		if seq < seqCount {
+			// Update the states.
+			add, err = rbr.val(ptliteral.bits)
+			if err != nil {
+				return err
+			}
+			literalState = uint32(ptliteral.base) + add
+
+			add, err = rbr.val(ptmatch.bits)
+			if err != nil {
+				return err
+			}
+			matchState = uint32(ptmatch.base) + add
+
+			add, err = rbr.val(ptoffset.bits)
+			if err != nil {
+				return err
+			}
+			offsetState = uint32(ptoffset.base) + add
+		}
+
+		// The next sequence is now in literal, offset, match.
+
+		if debug {
+			println("literal", literal, "offset", offset, "match", match)
+		}
+
+		// Copy literal bytes from litbuf.
+		if literal > uint32(len(litbuf)) {
+			return rbr.makeError("literal byte overflow")
+		}
+		if literal > 0 {
+			r.buffer = append(r.buffer, litbuf[:literal]...)
+			litbuf = litbuf[literal:]
+		}
+
+		if match > 0 {
+			if err := r.copyFromWindow(&rbr, offset, match); err != nil {
+				return err
+			}
+		}
+	}
+
+	if len(litbuf) > 0 {
+		r.buffer = append(r.buffer, litbuf...)
+	}
+
+	if rbr.cnt != 0 {
+		return r.makeError(off, "extraneous data after sequences")
+	}
+
+	return nil
+}
+
+// Copy match bytes from the decoded output, or the window, at offset.
+func (r *Reader) copyFromWindow(rbr *reverseBitReader, offset, match uint32) error {
+	if offset == 0 {
+		return rbr.makeError("invalid zero offset")
+	}
+
+	lenBlock := uint32(len(r.buffer))
+	if lenBlock < offset {
+		lenWindow := uint32(len(r.window))
+		windowOffset := offset - lenBlock
+		if windowOffset > lenWindow {
+			return rbr.makeError("offset past window")
+		}
+		from := lenWindow - windowOffset
+		if from+match <= lenWindow {
+			r.buffer = append(r.buffer, r.window[from:from+match]...)
+			return nil
+		}
+		r.buffer = append(r.buffer, r.window[from:]...)
+		copied := lenWindow - from
+		offset -= copied
+		match -= copied
+
+		if offset == 0 && match > 0 {
+			return rbr.makeError("invalid offset")
+		}
+	}
+
+	from := lenBlock - offset
+	if offset >= match {
+		r.buffer = append(r.buffer, r.buffer[from:from+match]...)
+		return nil
+	}
+
+	// We are being asked to copy data that we are adding to the
+	// buffer in the same copy.
+	for match > 0 {
+		var copy uint32
+		if offset >= match {
+			copy = match
+		} else {
+			copy = offset
+		}
+		r.buffer = append(r.buffer, r.buffer[from:from+copy]...)
+		match -= copy
+		from += copy
+	}
+	return nil
+}
diff --git a/src/internal/zstd/fse.go b/src/internal/zstd/fse.go
new file mode 100644
index 0000000..ea661d4
--- /dev/null
+++ b/src/internal/zstd/fse.go
@@ -0,0 +1,437 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package zstd
+
+import (
+	"math/bits"
+)
+
+// fseEntry is one entry in an FSE table.
+type fseEntry struct {
+	sym  uint8  // value that this entry records
+	bits uint8  // number of bits to read to determine next state
+	base uint16 // add those bits to this state to get the next state
+}
+
+// readFSE reads an FSE table from data starting at off.
+// maxSym is the maximum symbol value.
+// maxBits is the maximum number of bits permitted for symbols in the table.
+// The FSE is written into table, which must be at least 1<<maxBits in size.
+// This returns the number of bits in the FSE table and the new offset.
+// RFC 4.1.1.
+func (r *Reader) readFSE(data block, off, maxSym, maxBits int, table []fseEntry) (tableBits, roff int, err error) {
+	br := r.makeBitReader(data, off)
+	if err := br.moreBits(); err != nil {
+		return 0, 0, err
+	}
+
+	accuracyLog := int(br.val(4)) + 5
+	if accuracyLog > maxBits {
+		return 0, 0, br.makeError("FSE accuracy log too large")
+	}
+
+	// The number of remaining probabilities, plus 1.
+	// This determines the number of bits to be read for the next value.
+	remaining := (1 << accuracyLog) + 1
+
+	// The current difference between small and large values,
+	// which depends on the number of remaining values.
+	// Small values use 1 less bit.
+	threshold := 1 << accuracyLog
+
+	// The number of bits needed to compute threshold.
+	bitsNeeded := accuracyLog + 1
+
+	// The next character value.
+	sym := 0
+
+	// Whether the last count was 0.
+	prev0 := false
+
+	var norm [256]int16
+
+	for remaining > 1 && sym <= maxSym {
+		if err := br.moreBits(); err != nil {
+			return 0, 0, err
+		}
+
+		if prev0 {
+			// Previous count was 0, so there is a 2-bit
+			// repeat flag. If the 2-bit flag is 0b11,
+			// it adds 3 and then there is another repeat flag.
+			zsym := sym
+			for (br.bits & 0xfff) == 0xfff {
+				zsym += 3 * 6
+				br.bits >>= 12
+				br.cnt -= 12
+				if err := br.moreBits(); err != nil {
+					return 0, 0, err
+				}
+			}
+			for (br.bits & 3) == 3 {
+				zsym += 3
+				br.bits >>= 2
+				br.cnt -= 2
+				if err := br.moreBits(); err != nil {
+					return 0, 0, err
+				}
+			}
+
+			// We have at least 14 bits here,
+			// no need to call moreBits
+
+			zsym += int(br.val(2))
+
+			if zsym > maxSym {
+				return 0, 0, br.makeError("FSE symbol index overflow")
+			}
+
+			for ; sym < zsym; sym++ {
+				norm[uint8(sym)] = 0
+			}
+
+			prev0 = false
+			continue
+		}
+
+		max := (2*threshold - 1) - remaining
+		var count int
+		if int(br.bits&uint32(threshold-1)) < max {
+			// A small value.
+			count = int(br.bits & uint32((threshold - 1)))
+			br.bits >>= bitsNeeded - 1
+			br.cnt -= uint32(bitsNeeded - 1)
+		} else {
+			// A large value.
+			count = int(br.bits & uint32((2*threshold - 1)))
+			if count >= threshold {
+				count -= max
+			}
+			br.bits >>= bitsNeeded
+			br.cnt -= uint32(bitsNeeded)
+		}
+
+		count--
+		if count >= 0 {
+			remaining -= count
+		} else {
+			remaining--
+		}
+		if sym >= 256 {
+			return 0, 0, br.makeError("FSE sym overflow")
+		}
+		norm[uint8(sym)] = int16(count)
+		sym++
+
+		prev0 = count == 0
+
+		for remaining < threshold {
+			bitsNeeded--
+			threshold >>= 1
+		}
+	}
+
+	if remaining != 1 {
+		return 0, 0, br.makeError("too many symbols in FSE table")
+	}
+
+	for ; sym <= maxSym; sym++ {
+		norm[uint8(sym)] = 0
+	}
+
+	br.backup()
+
+	if err := r.buildFSE(off, norm[:maxSym+1], table, accuracyLog); err != nil {
+		return 0, 0, err
+	}
+
+	return accuracyLog, int(br.off), nil
+}
+
+// buildFSE builds an FSE decoding table from a list of probabilities.
+// The probabilities are in norm. next is scratch space. The number of bits
+// in the table is tableBits.
+func (r *Reader) buildFSE(off int, norm []int16, table []fseEntry, tableBits int) error {
+	tableSize := 1 << tableBits
+	highThreshold := tableSize - 1
+
+	var next [256]uint16
+
+	for i, n := range norm {
+		if n >= 0 {
+			next[uint8(i)] = uint16(n)
+		} else {
+			table[highThreshold].sym = uint8(i)
+			highThreshold--
+			next[uint8(i)] = 1
+		}
+	}
+
+	pos := 0
+	step := (tableSize >> 1) + (tableSize >> 3) + 3
+	mask := tableSize - 1
+	for i, n := range norm {
+		for j := 0; j < int(n); j++ {
+			table[pos].sym = uint8(i)
+			pos = (pos + step) & mask
+			for pos > highThreshold {
+				pos = (pos + step) & mask
+			}
+		}
+	}
+	if pos != 0 {
+		return r.makeError(off, "FSE count error")
+	}
+
+	for i := 0; i < tableSize; i++ {
+		sym := table[i].sym
+		nextState := next[sym]
+		next[sym]++
+
+		if nextState == 0 {
+			return r.makeError(off, "FSE state error")
+		}
+
+		highBit := 15 - bits.LeadingZeros16(nextState)
+
+		bits := tableBits - highBit
+		table[i].bits = uint8(bits)
+		table[i].base = (nextState << bits) - uint16(tableSize)
+	}
+
+	return nil
+}
+
+// fseBaselineEntry is an entry in an FSE baseline table.
+// We use these for literal/match/length values.
+// Those require mapping the symbol to a baseline value,
+// and then reading zero or more bits and adding the value to the baseline.
+// Rather than looking thees up in separate tables,
+// we convert the FSE table to an FSE baseline table.
+type fseBaselineEntry struct {
+	baseline uint32 // baseline for value that this entry represents
+	basebits uint8  // number of bits to read to add to baseline
+	bits     uint8  // number of bits to read to determine next state
+	base     uint16 // add the bits to this base to get the next state
+}
+
+// Given a literal length code, we need to read a number of bits and
+// add that to a baseline. For states 0 to 15 the baseline is the
+// state and the number of bits is zero. RFC 3.1.1.3.2.1.1.
+
+const literalLengthOffset = 16
+
+var literalLengthBase = []uint32{
+	16 | (1 << 24),
+	18 | (1 << 24),
+	20 | (1 << 24),
+	22 | (1 << 24),
+	24 | (2 << 24),
+	28 | (2 << 24),
+	32 | (3 << 24),
+	40 | (3 << 24),
+	48 | (4 << 24),
+	64 | (6 << 24),
+	128 | (7 << 24),
+	256 | (8 << 24),
+	512 | (9 << 24),
+	1024 | (10 << 24),
+	2048 | (11 << 24),
+	4096 | (12 << 24),
+	8192 | (13 << 24),
+	16384 | (14 << 24),
+	32768 | (15 << 24),
+	65536 | (16 << 24),
+}
+
+// makeLiteralBaselineFSE converts the literal length fseTable to baselineTable.
+func (r *Reader) makeLiteralBaselineFSE(off int, fseTable []fseEntry, baselineTable []fseBaselineEntry) error {
+	for i, e := range fseTable {
+		be := fseBaselineEntry{
+			bits: e.bits,
+			base: e.base,
+		}
+		if e.sym < literalLengthOffset {
+			be.baseline = uint32(e.sym)
+			be.basebits = 0
+		} else {
+			if e.sym > 35 {
+				return r.makeError(off, "FSE baseline symbol overflow")
+			}
+			idx := e.sym - literalLengthOffset
+			basebits := literalLengthBase[idx]
+			be.baseline = basebits & 0xffffff
+			be.basebits = uint8(basebits >> 24)
+		}
+		baselineTable[i] = be
+	}
+	return nil
+}
+
+// makeOffsetBaselineFSE converts the offset length fseTable to baselineTable.
+func (r *Reader) makeOffsetBaselineFSE(off int, fseTable []fseEntry, baselineTable []fseBaselineEntry) error {
+	for i, e := range fseTable {
+		be := fseBaselineEntry{
+			bits: e.bits,
+			base: e.base,
+		}
+		if e.sym > 31 {
+			return r.makeError(off, "FSE offset symbol overflow")
+		}
+
+		// The simple way to write this is
+		//     be.baseline = 1 << e.sym
+		//     be.basebits = e.sym
+		// That would give us an offset value that corresponds to
+		// the one described in the RFC. However, for offsets > 3
+		// we have to subtract 3. And for offset values 1, 2, 3
+		// we use a repeated offset.
+		//
+		// The baseline is always a power of 2, and is never 0,
+		// so for those low values we will see one entry that is
+		// baseline 1, basebits 0, and one entry that is baseline 2,
+		// basebits 1. All other entries will have baseline >= 4
+		// basebits >= 2.
+		//
+		// So we can check for RFC offset <= 3 by checking for
+		// basebits <= 1. That means that we can subtract 3 here
+		// and not worry about doing it in the hot loop.
+
+		be.baseline = 1 << e.sym
+		if e.sym >= 2 {
+			be.baseline -= 3
+		}
+		be.basebits = e.sym
+		baselineTable[i] = be
+	}
+	return nil
+}
+
+// Given a match length code, we need to read a number of bits and add
+// that to a baseline. For states 0 to 31 the baseline is state+3 and
+// the number of bits is zero. RFC 3.1.1.3.2.1.1.
+
+const matchLengthOffset = 32
+
+var matchLengthBase = []uint32{
+	35 | (1 << 24),
+	37 | (1 << 24),
+	39 | (1 << 24),
+	41 | (1 << 24),
+	43 | (2 << 24),
+	47 | (2 << 24),
+	51 | (3 << 24),
+	59 | (3 << 24),
+	67 | (4 << 24),
+	83 | (4 << 24),
+	99 | (5 << 24),
+	131 | (7 << 24),
+	259 | (8 << 24),
+	515 | (9 << 24),
+	1027 | (10 << 24),
+	2051 | (11 << 24),
+	4099 | (12 << 24),
+	8195 | (13 << 24),
+	16387 | (14 << 24),
+	32771 | (15 << 24),
+	65539 | (16 << 24),
+}
+
+// makeMatchBaselineFSE converts the match length fseTable to baselineTable.
+func (r *Reader) makeMatchBaselineFSE(off int, fseTable []fseEntry, baselineTable []fseBaselineEntry) error {
+	for i, e := range fseTable {
+		be := fseBaselineEntry{
+			bits: e.bits,
+			base: e.base,
+		}
+		if e.sym < matchLengthOffset {
+			be.baseline = uint32(e.sym) + 3
+			be.basebits = 0
+		} else {
+			if e.sym > 52 {
+				return r.makeError(off, "FSE baseline symbol overflow")
+			}
+			idx := e.sym - matchLengthOffset
+			basebits := matchLengthBase[idx]
+			be.baseline = basebits & 0xffffff
+			be.basebits = uint8(basebits >> 24)
+		}
+		baselineTable[i] = be
+	}
+	return nil
+}
+
+// predefinedLiteralTable is the predefined table to use for literal lengths.
+// Generated from table in RFC 3.1.1.3.2.2.1.
+// Checked by TestPredefinedTables.
+var predefinedLiteralTable = [...]fseBaselineEntry{
+	{0, 0, 4, 0}, {0, 0, 4, 16}, {1, 0, 5, 32},
+	{3, 0, 5, 0}, {4, 0, 5, 0}, {6, 0, 5, 0},
+	{7, 0, 5, 0}, {9, 0, 5, 0}, {10, 0, 5, 0},
+	{12, 0, 5, 0}, {14, 0, 6, 0}, {16, 1, 5, 0},
+	{20, 1, 5, 0}, {22, 1, 5, 0}, {28, 2, 5, 0},
+	{32, 3, 5, 0}, {48, 4, 5, 0}, {64, 6, 5, 32},
+	{128, 7, 5, 0}, {256, 8, 6, 0}, {1024, 10, 6, 0},
+	{4096, 12, 6, 0}, {0, 0, 4, 32}, {1, 0, 4, 0},
+	{2, 0, 5, 0}, {4, 0, 5, 32}, {5, 0, 5, 0},
+	{7, 0, 5, 32}, {8, 0, 5, 0}, {10, 0, 5, 32},
+	{11, 0, 5, 0}, {13, 0, 6, 0}, {16, 1, 5, 32},
+	{18, 1, 5, 0}, {22, 1, 5, 32}, {24, 2, 5, 0},
+	{32, 3, 5, 32}, {40, 3, 5, 0}, {64, 6, 4, 0},
+	{64, 6, 4, 16}, {128, 7, 5, 32}, {512, 9, 6, 0},
+	{2048, 11, 6, 0}, {0, 0, 4, 48}, {1, 0, 4, 16},
+	{2, 0, 5, 32}, {3, 0, 5, 32}, {5, 0, 5, 32},
+	{6, 0, 5, 32}, {8, 0, 5, 32}, {9, 0, 5, 32},
+	{11, 0, 5, 32}, {12, 0, 5, 32}, {15, 0, 6, 0},
+	{18, 1, 5, 32}, {20, 1, 5, 32}, {24, 2, 5, 32},
+	{28, 2, 5, 32}, {40, 3, 5, 32}, {48, 4, 5, 32},
+	{65536, 16, 6, 0}, {32768, 15, 6, 0}, {16384, 14, 6, 0},
+	{8192, 13, 6, 0},
+}
+
+// predefinedOffsetTable is the predefined table to use for offsets.
+// Generated from table in RFC 3.1.1.3.2.2.3.
+// Checked by TestPredefinedTables.
+var predefinedOffsetTable = [...]fseBaselineEntry{
+	{1, 0, 5, 0}, {61, 6, 4, 0}, {509, 9, 5, 0},
+	{32765, 15, 5, 0}, {2097149, 21, 5, 0}, {5, 3, 5, 0},
+	{125, 7, 4, 0}, {4093, 12, 5, 0}, {262141, 18, 5, 0},
+	{8388605, 23, 5, 0}, {29, 5, 5, 0}, {253, 8, 4, 0},
+	{16381, 14, 5, 0}, {1048573, 20, 5, 0}, {1, 2, 5, 0},
+	{125, 7, 4, 16}, {2045, 11, 5, 0}, {131069, 17, 5, 0},
+	{4194301, 22, 5, 0}, {13, 4, 5, 0}, {253, 8, 4, 16},
+	{8189, 13, 5, 0}, {524285, 19, 5, 0}, {2, 1, 5, 0},
+	{61, 6, 4, 16}, {1021, 10, 5, 0}, {65533, 16, 5, 0},
+	{268435453, 28, 5, 0}, {134217725, 27, 5, 0}, {67108861, 26, 5, 0},
+	{33554429, 25, 5, 0}, {16777213, 24, 5, 0},
+}
+
+// predefinedMatchTable is the predefined table to use for match lengths.
+// Generated from table in RFC 3.1.1.3.2.2.2.
+// Checked by TestPredefinedTables.
+var predefinedMatchTable = [...]fseBaselineEntry{
+	{3, 0, 6, 0}, {4, 0, 4, 0}, {5, 0, 5, 32},
+	{6, 0, 5, 0}, {8, 0, 5, 0}, {9, 0, 5, 0},
+	{11, 0, 5, 0}, {13, 0, 6, 0}, {16, 0, 6, 0},
+	{19, 0, 6, 0}, {22, 0, 6, 0}, {25, 0, 6, 0},
+	{28, 0, 6, 0}, {31, 0, 6, 0}, {34, 0, 6, 0},
+	{37, 1, 6, 0}, {41, 1, 6, 0}, {47, 2, 6, 0},
+	{59, 3, 6, 0}, {83, 4, 6, 0}, {131, 7, 6, 0},
+	{515, 9, 6, 0}, {4, 0, 4, 16}, {5, 0, 4, 0},
+	{6, 0, 5, 32}, {7, 0, 5, 0}, {9, 0, 5, 32},
+	{10, 0, 5, 0}, {12, 0, 6, 0}, {15, 0, 6, 0},
+	{18, 0, 6, 0}, {21, 0, 6, 0}, {24, 0, 6, 0},
+	{27, 0, 6, 0}, {30, 0, 6, 0}, {33, 0, 6, 0},
+	{35, 1, 6, 0}, {39, 1, 6, 0}, {43, 2, 6, 0},
+	{51, 3, 6, 0}, {67, 4, 6, 0}, {99, 5, 6, 0},
+	{259, 8, 6, 0}, {4, 0, 4, 32}, {4, 0, 4, 48},
+	{5, 0, 4, 16}, {7, 0, 5, 32}, {8, 0, 5, 32},
+	{10, 0, 5, 32}, {11, 0, 5, 32}, {14, 0, 6, 0},
+	{17, 0, 6, 0}, {20, 0, 6, 0}, {23, 0, 6, 0},
+	{26, 0, 6, 0}, {29, 0, 6, 0}, {32, 0, 6, 0},
+	{65539, 16, 6, 0}, {32771, 15, 6, 0}, {16387, 14, 6, 0},
+	{8195, 13, 6, 0}, {4099, 12, 6, 0}, {2051, 11, 6, 0},
+	{1027, 10, 6, 0},
+}
diff --git a/src/internal/zstd/fse_test.go b/src/internal/zstd/fse_test.go
new file mode 100644
index 0000000..6f106b6
--- /dev/null
+++ b/src/internal/zstd/fse_test.go
@@ -0,0 +1,89 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package zstd
+
+import (
+	"slices"
+	"testing"
+)
+
+// literalPredefinedDistribution is the predefined distribution table
+// for literal lengths. RFC 3.1.1.3.2.2.1.
+var literalPredefinedDistribution = []int16{
+	4, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1,
+	2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 1, 1, 1, 1, 1,
+	-1, -1, -1, -1,
+}
+
+// offsetPredefinedDistribution is the predefined distribution table
+// for offsets. RFC 3.1.1.3.2.2.3.
+var offsetPredefinedDistribution = []int16{
+	1, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1,
+}
+
+// matchPredefinedDistribution is the predefined distribution table
+// for match lengths. RFC 3.1.1.3.2.2.2.
+var matchPredefinedDistribution = []int16{
+	1, 4, 3, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1,
+	-1, -1, -1, -1, -1,
+}
+
+// TestPredefinedTables verifies that we can generate the predefined
+// literal/offset/match tables from the input data in RFC 8878.
+// This serves as a test of the predefined tables, and also of buildFSE
+// and the functions that make baseline FSE tables.
+func TestPredefinedTables(t *testing.T) {
+	tests := []struct {
+		name         string
+		distribution []int16
+		tableBits    int
+		toBaseline   func(*Reader, int, []fseEntry, []fseBaselineEntry) error
+		predef       []fseBaselineEntry
+	}{
+		{
+			name:         "literal",
+			distribution: literalPredefinedDistribution,
+			tableBits:    6,
+			toBaseline:   (*Reader).makeLiteralBaselineFSE,
+			predef:       predefinedLiteralTable[:],
+		},
+		{
+			name:         "offset",
+			distribution: offsetPredefinedDistribution,
+			tableBits:    5,
+			toBaseline:   (*Reader).makeOffsetBaselineFSE,
+			predef:       predefinedOffsetTable[:],
+		},
+		{
+			name:         "match",
+			distribution: matchPredefinedDistribution,
+			tableBits:    6,
+			toBaseline:   (*Reader).makeMatchBaselineFSE,
+			predef:       predefinedMatchTable[:],
+		},
+	}
+	for _, test := range tests {
+		test := test
+		t.Run(test.name, func(t *testing.T) {
+			var r Reader
+			table := make([]fseEntry, 1<<test.tableBits)
+			if err := r.buildFSE(0, test.distribution, table, test.tableBits); err != nil {
+				t.Fatal(err)
+			}
+
+			baselineTable := make([]fseBaselineEntry, len(table))
+			if err := test.toBaseline(&r, 0, table, baselineTable); err != nil {
+				t.Fatal(err)
+			}
+
+			if !slices.Equal(baselineTable, test.predef) {
+				t.Errorf("got %v, want %v", baselineTable, test.predef)
+			}
+		})
+	}
+}
diff --git a/src/internal/zstd/fuzz_test.go b/src/internal/zstd/fuzz_test.go
new file mode 100644
index 0000000..bb6f0a9
--- /dev/null
+++ b/src/internal/zstd/fuzz_test.go
@@ -0,0 +1,140 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package zstd
+
+import (
+	"bytes"
+	"io"
+	"os"
+	"os/exec"
+	"testing"
+)
+
+// badStrings is some inputs that FuzzReader failed on earlier.
+var badStrings = []string{
+	"(\xb5/\xfdd00,\x05\x00\xc4\x0400000000000000000000000000000000000000000000000000000000000000000000000000000 \xa07100000000000000000000000000000000000000000000000000000000000000000000000000aM\x8a2y0B\b",
+	"(\xb5/\xfd00$\x05\x0020 00X70000a70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+	"(\xb5/\xfd00$\x05\x0020 00B00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+	"(\xb5/\xfd00}\x00\x0020\x00\x9000000000000",
+	"(\xb5/\xfd00}\x00\x00&0\x02\x830!000000000",
+	"(\xb5/\xfd\x1002000$\x05\x0010\xcc0\xa8100000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+	"(\xb5/\xfd\x1002000$\x05\x0000\xcc0\xa8100d\x0000001000000000000000000000000000000000000000000000000000000000000000000000000\x000000000000000000000000000000000000000000000000000000000000000000000000000000",
+	"(\xb5/\xfd001\x00\x0000000000000000000",
+}
+
+// This is a simple fuzzer to see if the decompressor panics.
+func FuzzReader(f *testing.F) {
+	for _, test := range tests {
+		f.Add([]byte(test.compressed))
+	}
+	for _, s := range badStrings {
+		f.Add([]byte(s))
+	}
+	f.Fuzz(func(t *testing.T, b []byte) {
+		r := NewReader(bytes.NewReader(b))
+		io.Copy(io.Discard, r)
+	})
+}
+
+// Fuzz test to verify that what we decompress is what we compress.
+// This isn't a great fuzz test because the fuzzer can't efficiently
+// explore the space of decompressor behavior, since it can't see
+// what the compressor is doing. But it's better than nothing.
+func FuzzDecompressor(f *testing.F) {
+	if _, err := os.Stat("/usr/bin/zstd"); err != nil {
+		f.Skip("skipping because /usr/bin/zstd does not exist")
+	}
+
+	for _, test := range tests {
+		f.Add([]byte(test.uncompressed))
+	}
+
+	// Add some larger data, as that has more interesting compression.
+	f.Add(bytes.Repeat([]byte("abcdefghijklmnop"), 256))
+	var buf bytes.Buffer
+	for i := 0; i < 256; i++ {
+		buf.WriteByte(byte(i))
+	}
+	f.Add(bytes.Repeat(buf.Bytes(), 64))
+	f.Add(bigData(f))
+
+	f.Fuzz(func(t *testing.T, b []byte) {
+		cmd := exec.Command("/usr/bin/zstd", "-z")
+		cmd.Stdin = bytes.NewReader(b)
+		var compressed bytes.Buffer
+		cmd.Stdout = &compressed
+		cmd.Stderr = os.Stderr
+		if err := cmd.Run(); err != nil {
+			t.Errorf("running zstd failed: %v", err)
+		}
+
+		r := NewReader(bytes.NewReader(compressed.Bytes()))
+		got, err := io.ReadAll(r)
+		if err != nil {
+			t.Fatal(err)
+		}
+		if !bytes.Equal(got, b) {
+			showDiffs(t, got, b)
+		}
+	})
+}
+
+// Fuzz test to check that if we can decompress some data,
+// so can zstd, and that we get the same result.
+func FuzzReverse(f *testing.F) {
+	if _, err := os.Stat("/usr/bin/zstd"); err != nil {
+		f.Skip("skipping because /usr/bin/zstd does not exist")
+	}
+
+	for _, test := range tests {
+		f.Add([]byte(test.compressed))
+	}
+
+	// Set a hook to reject some cases where we don't match zstd.
+	fuzzing = true
+	defer func() { fuzzing = false }()
+
+	f.Fuzz(func(t *testing.T, b []byte) {
+		r := NewReader(bytes.NewReader(b))
+		goExp, goErr := io.ReadAll(r)
+
+		cmd := exec.Command("/usr/bin/zstd", "-d")
+		cmd.Stdin = bytes.NewReader(b)
+		var uncompressed bytes.Buffer
+		cmd.Stdout = &uncompressed
+		cmd.Stderr = os.Stderr
+		zstdErr := cmd.Run()
+		zstdExp := uncompressed.Bytes()
+
+		if goErr == nil && zstdErr == nil {
+			if !bytes.Equal(zstdExp, goExp) {
+				showDiffs(t, zstdExp, goExp)
+			}
+		} else {
+			// Ideally we should check that this package and
+			// the zstd program both fail or both succeed,
+			// and that if they both fail one byte sequence
+			// is an exact prefix of the other.
+			// Actually trying this proved to be frustrating,
+			// as the zstd program appears to accept invalid
+			// byte sequences using rules that are difficult
+			// to determine.
+			// So we just check the prefix.
+
+			c := len(goExp)
+			if c > len(zstdExp) {
+				c = len(zstdExp)
+			}
+			goExp = goExp[:c]
+			zstdExp = zstdExp[:c]
+			if !bytes.Equal(goExp, zstdExp) {
+				t.Error("byte mismatch after error")
+				t.Logf("Go error: %v\n", goErr)
+				t.Logf("zstd error: %v\n", zstdErr)
+				showDiffs(t, zstdExp, goExp)
+			}
+		}
+	})
+}
diff --git a/src/internal/zstd/huff.go b/src/internal/zstd/huff.go
new file mode 100644
index 0000000..452e24b
--- /dev/null
+++ b/src/internal/zstd/huff.go
@@ -0,0 +1,204 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package zstd
+
+import (
+	"io"
+	"math/bits"
+)
+
+// maxHuffmanBits is the largest possible Huffman table bits.
+const maxHuffmanBits = 11
+
+// readHuff reads Huffman table from data starting at off into table.
+// Each entry in a Huffman table is a pair of bytes.
+// The high byte is the encoded value. The low byte is the number
+// of bits used to encode that value. We index into the table
+// with a value of size tableBits. A value that requires fewer bits
+// appear in the table multiple times.
+// This returns the number of bits in the Huffman table and the new offset.
+// RFC 4.2.1.
+func (r *Reader) readHuff(data block, off int, table []uint16) (tableBits, roff int, err error) {
+	if off >= len(data) {
+		return 0, 0, r.makeEOFError(off)
+	}
+
+	hdr := data[off]
+	off++
+
+	var weights [256]uint8
+	var count int
+	if hdr < 128 {
+		// The table is compressed using an FSE. RFC 4.2.1.2.
+		if len(r.fseScratch) < 1<<6 {
+			r.fseScratch = make([]fseEntry, 1<<6)
+		}
+		fseBits, noff, err := r.readFSE(data, off, 255, 6, r.fseScratch)
+		if err != nil {
+			return 0, 0, err
+		}
+		fseTable := r.fseScratch
+
+		if off+int(hdr) > len(data) {
+			return 0, 0, r.makeEOFError(off)
+		}
+
+		rbr, err := r.makeReverseBitReader(data, off+int(hdr)-1, noff)
+		if err != nil {
+			return 0, 0, err
+		}
+
+		state1, err := rbr.val(uint8(fseBits))
+		if err != nil {
+			return 0, 0, err
+		}
+
+		state2, err := rbr.val(uint8(fseBits))
+		if err != nil {
+			return 0, 0, err
+		}
+
+		// There are two independent FSE streams, tracked by
+		// state1 and state2. We decode them alternately.
+
+		for {
+			pt := &fseTable[state1]
+			if !rbr.fetch(pt.bits) {
+				if count >= 254 {
+					return 0, 0, rbr.makeError("Huffman count overflow")
+				}
+				weights[count] = pt.sym
+				weights[count+1] = fseTable[state2].sym
+				count += 2
+				break
+			}
+
+			v, err := rbr.val(pt.bits)
+			if err != nil {
+				return 0, 0, err
+			}
+			state1 = uint32(pt.base) + v
+
+			if count >= 255 {
+				return 0, 0, rbr.makeError("Huffman count overflow")
+			}
+
+			weights[count] = pt.sym
+			count++
+
+			pt = &fseTable[state2]
+
+			if !rbr.fetch(pt.bits) {
+				if count >= 254 {
+					return 0, 0, rbr.makeError("Huffman count overflow")
+				}
+				weights[count] = pt.sym
+				weights[count+1] = fseTable[state1].sym
+				count += 2
+				break
+			}
+
+			v, err = rbr.val(pt.bits)
+			if err != nil {
+				return 0, 0, err
+			}
+			state2 = uint32(pt.base) + v
+
+			if count >= 255 {
+				return 0, 0, rbr.makeError("Huffman count overflow")
+			}
+
+			weights[count] = pt.sym
+			count++
+		}
+
+		off += int(hdr)
+	} else {
+		// The table is not compressed. Each weight is 4 bits.
+
+		count = int(hdr) - 127
+		if off+((count+1)/2) >= len(data) {
+			return 0, 0, io.ErrUnexpectedEOF
+		}
+		for i := 0; i < count; i += 2 {
+			b := data[off]
+			off++
+			weights[i] = b >> 4
+			weights[i+1] = b & 0xf
+		}
+	}
+
+	// RFC 4.2.1.3.
+
+	var weightMark [13]uint32
+	weightMask := uint32(0)
+	for _, w := range weights[:count] {
+		if w > 12 {
+			return 0, 0, r.makeError(off, "Huffman weight overflow")
+		}
+		weightMark[w]++
+		if w > 0 {
+			weightMask += 1 << (w - 1)
+		}
+	}
+	if weightMask == 0 {
+		return 0, 0, r.makeError(off, "bad Huffman weights")
+	}
+
+	tableBits = 32 - bits.LeadingZeros32(weightMask)
+	if tableBits > maxHuffmanBits {
+		return 0, 0, r.makeError(off, "bad Huffman weights")
+	}
+
+	if len(table) < 1<<tableBits {
+		return 0, 0, r.makeError(off, "Huffman table too small")
+	}
+
+	// Work out the last weight value, which is omitted because
+	// the weights must sum to a power of two.
+	left := (uint32(1) << tableBits) - weightMask
+	if left == 0 {
+		return 0, 0, r.makeError(off, "bad Huffman weights")
+	}
+	highBit := 31 - bits.LeadingZeros32(left)
+	if uint32(1)<<highBit != left {
+		return 0, 0, r.makeError(off, "bad Huffman weights")
+	}
+	if count >= 256 {
+		return 0, 0, r.makeError(off, "Huffman weight overflow")
+	}
+	weights[count] = uint8(highBit + 1)
+	count++
+	weightMark[highBit+1]++
+
+	if weightMark[1] < 2 || weightMark[1]&1 != 0 {
+		return 0, 0, r.makeError(off, "bad Huffman weights")
+	}
+
+	// Change weightMark from a count of weights to the index of
+	// the first symbol for that weight. We shift the indexes to
+	// also store how many we have seen so far,
+	next := uint32(0)
+	for i := 0; i < tableBits; i++ {
+		cur := next
+		next += weightMark[i+1] << i
+		weightMark[i+1] = cur
+	}
+
+	for i, w := range weights[:count] {
+		if w == 0 {
+			continue
+		}
+		length := uint32(1) << (w - 1)
+		tval := uint16(i)<<8 | (uint16(tableBits) + 1 - uint16(w))
+		start := weightMark[w]
+		for j := uint32(0); j < length; j++ {
+			table[start+j] = tval
+		}
+		weightMark[w] += length
+	}
+
+	return tableBits, off, nil
+}
diff --git a/src/internal/zstd/literals.go b/src/internal/zstd/literals.go
new file mode 100644
index 0000000..b46d668
--- /dev/null
+++ b/src/internal/zstd/literals.go
@@ -0,0 +1,330 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package zstd
+
+import (
+	"encoding/binary"
+)
+
+// readLiterals reads and decompresses the literals from data at off.
+// The literals are appended to outbuf, which is returned.
+// Also returns the new input offset. RFC 3.1.1.3.1.
+func (r *Reader) readLiterals(data block, off int, outbuf []byte) (int, []byte, error) {
+	if off >= len(data) {
+		return 0, nil, r.makeEOFError(off)
+	}
+
+	// Literals section header. RFC 3.1.1.3.1.1.
+	hdr := data[off]
+	off++
+
+	if (hdr&3) == 0 || (hdr&3) == 1 {
+		return r.readRawRLELiterals(data, off, hdr, outbuf)
+	} else {
+		return r.readHuffLiterals(data, off, hdr, outbuf)
+	}
+}
+
+// readRawRLELiterals reads and decompresses a Raw_Literals_Block or
+// a RLE_Literals_Block. RFC 3.1.1.3.1.1.
+func (r *Reader) readRawRLELiterals(data block, off int, hdr byte, outbuf []byte) (int, []byte, error) {
+	raw := (hdr & 3) == 0
+
+	var regeneratedSize int
+	switch (hdr >> 2) & 3 {
+	case 0, 2:
+		regeneratedSize = int(hdr >> 3)
+	case 1:
+		if off >= len(data) {
+			return 0, nil, r.makeEOFError(off)
+		}
+		regeneratedSize = int(hdr>>4) + (int(data[off]) << 4)
+		off++
+	case 3:
+		if off+1 >= len(data) {
+			return 0, nil, r.makeEOFError(off)
+		}
+		regeneratedSize = int(hdr>>4) + (int(data[off]) << 4) + (int(data[off+1]) << 12)
+		off += 2
+	}
+
+	// We are going to use the entire literal block in the output.
+	// The maximum size of one decompressed block is 128K,
+	// so we can't have more literals than that.
+	if regeneratedSize > 128<<10 {
+		return 0, nil, r.makeError(off, "literal size too large")
+	}
+
+	if raw {
+		// RFC 3.1.1.3.1.2.
+		if off+regeneratedSize > len(data) {
+			return 0, nil, r.makeError(off, "raw literal size too large")
+		}
+		outbuf = append(outbuf, data[off:off+regeneratedSize]...)
+		off += regeneratedSize
+	} else {
+		// RFC 3.1.1.3.1.3.
+		if off >= len(data) {
+			return 0, nil, r.makeError(off, "RLE literal missing")
+		}
+		rle := data[off]
+		off++
+		for i := 0; i < regeneratedSize; i++ {
+			outbuf = append(outbuf, rle)
+		}
+	}
+
+	return off, outbuf, nil
+}
+
+// readHuffLiterals reads and decompresses a Compressed_Literals_Block or
+// a Treeless_Literals_Block. RFC 3.1.1.3.1.4.
+func (r *Reader) readHuffLiterals(data block, off int, hdr byte, outbuf []byte) (int, []byte, error) {
+	var (
+		regeneratedSize int
+		compressedSize  int
+		streams         int
+	)
+	switch (hdr >> 2) & 3 {
+	case 0, 1:
+		if off+1 >= len(data) {
+			return 0, nil, r.makeEOFError(off)
+		}
+		regeneratedSize = (int(hdr) >> 4) | ((int(data[off]) & 0x3f) << 4)
+		compressedSize = (int(data[off]) >> 6) | (int(data[off+1]) << 2)
+		off += 2
+		if ((hdr >> 2) & 3) == 0 {
+			streams = 1
+		} else {
+			streams = 4
+		}
+	case 2:
+		if off+2 >= len(data) {
+			return 0, nil, r.makeEOFError(off)
+		}
+		regeneratedSize = (int(hdr) >> 4) | (int(data[off]) << 4) | ((int(data[off+1]) & 3) << 12)
+		compressedSize = (int(data[off+1]) >> 2) | (int(data[off+2]) << 6)
+		off += 3
+		streams = 4
+	case 3:
+		if off+3 >= len(data) {
+			return 0, nil, r.makeEOFError(off)
+		}
+		regeneratedSize = (int(hdr) >> 4) | (int(data[off]) << 4) | ((int(data[off+1]) & 0x3f) << 12)
+		compressedSize = (int(data[off+1]) >> 6) | (int(data[off+2]) << 2) | (int(data[off+3]) << 10)
+		off += 4
+		streams = 4
+	}
+
+	// We are going to use the entire literal block in the output.
+	// The maximum size of one decompressed block is 128K,
+	// so we can't have more literals than that.
+	if regeneratedSize > 128<<10 {
+		return 0, nil, r.makeError(off, "literal size too large")
+	}
+
+	roff := off + compressedSize
+	if roff > len(data) || roff < 0 {
+		return 0, nil, r.makeEOFError(off)
+	}
+
+	totalStreamsSize := compressedSize
+	if (hdr & 3) == 2 {
+		// Compressed_Literals_Block.
+		// Read new huffman tree.
+
+		if len(r.huffmanTable) < 1<<maxHuffmanBits {
+			r.huffmanTable = make([]uint16, 1<<maxHuffmanBits)
+		}
+
+		huffmanTableBits, hoff, err := r.readHuff(data, off, r.huffmanTable)
+		if err != nil {
+			return 0, nil, err
+		}
+		r.huffmanTableBits = huffmanTableBits
+
+		if totalStreamsSize < hoff-off {
+			return 0, nil, r.makeError(off, "Huffman table too big")
+		}
+		totalStreamsSize -= hoff - off
+		off = hoff
+	} else {
+		// Treeless_Literals_Block
+		// Reuse previous Huffman tree.
+		if r.huffmanTableBits == 0 {
+			return 0, nil, r.makeError(off, "missing literals Huffman tree")
+		}
+	}
+
+	// Decompress compressedSize bytes of data at off using the
+	// Huffman tree.
+
+	var err error
+	if streams == 1 {
+		outbuf, err = r.readLiteralsOneStream(data, off, totalStreamsSize, regeneratedSize, outbuf)
+	} else {
+		outbuf, err = r.readLiteralsFourStreams(data, off, totalStreamsSize, regeneratedSize, outbuf)
+	}
+
+	if err != nil {
+		return 0, nil, err
+	}
+
+	return roff, outbuf, nil
+}
+
+// readLiteralsOneStream reads a single stream of compressed literals.
+func (r *Reader) readLiteralsOneStream(data block, off, compressedSize, regeneratedSize int, outbuf []byte) ([]byte, error) {
+	// We let the reverse bit reader read earlier bytes,
+	// because the Huffman table ignores bits that it doesn't need.
+	rbr, err := r.makeReverseBitReader(data, off+compressedSize-1, off-2)
+	if err != nil {
+		return nil, err
+	}
+
+	huffTable := r.huffmanTable
+	huffBits := uint32(r.huffmanTableBits)
+	huffMask := (uint32(1) << huffBits) - 1
+
+	for i := 0; i < regeneratedSize; i++ {
+		if !rbr.fetch(uint8(huffBits)) {
+			return nil, rbr.makeError("literals Huffman stream out of bits")
+		}
+
+		var t uint16
+		idx := (rbr.bits >> (rbr.cnt - huffBits)) & huffMask
+		t = huffTable[idx]
+		outbuf = append(outbuf, byte(t>>8))
+		rbr.cnt -= uint32(t & 0xff)
+	}
+
+	return outbuf, nil
+}
+
+// readLiteralsFourStreams reads four interleaved streams of
+// compressed literals.
+func (r *Reader) readLiteralsFourStreams(data block, off, totalStreamsSize, regeneratedSize int, outbuf []byte) ([]byte, error) {
+	// Read the jump table to find out where the streams are.
+	// RFC 3.1.1.3.1.6.
+	if off+5 >= len(data) {
+		return nil, r.makeEOFError(off)
+	}
+	if totalStreamsSize < 6 {
+		return nil, r.makeError(off, "total streams size too small for jump table")
+	}
+
+	streamSize1 := binary.LittleEndian.Uint16(data[off:])
+	streamSize2 := binary.LittleEndian.Uint16(data[off+2:])
+	streamSize3 := binary.LittleEndian.Uint16(data[off+4:])
+	off += 6
+
+	tot := uint64(streamSize1) + uint64(streamSize2) + uint64(streamSize3)
+	if tot > uint64(totalStreamsSize)-6 {
+		return nil, r.makeEOFError(off)
+	}
+	streamSize4 := uint32(totalStreamsSize) - 6 - uint32(tot)
+
+	off--
+	off1 := off + int(streamSize1)
+	start1 := off + 1
+
+	off2 := off1 + int(streamSize2)
+	start2 := off1 + 1
+
+	off3 := off2 + int(streamSize3)
+	start3 := off2 + 1
+
+	off4 := off3 + int(streamSize4)
+	start4 := off3 + 1
+
+	// We let the reverse bit readers read earlier bytes,
+	// because the Huffman tables ignore bits that they don't need.
+
+	rbr1, err := r.makeReverseBitReader(data, off1, start1-2)
+	if err != nil {
+		return nil, err
+	}
+
+	rbr2, err := r.makeReverseBitReader(data, off2, start2-2)
+	if err != nil {
+		return nil, err
+	}
+
+	rbr3, err := r.makeReverseBitReader(data, off3, start3-2)
+	if err != nil {
+		return nil, err
+	}
+
+	rbr4, err := r.makeReverseBitReader(data, off4, start4-2)
+	if err != nil {
+		return nil, err
+	}
+
+	regeneratedStreamSize := (regeneratedSize + 3) / 4
+
+	out1 := len(outbuf)
+	out2 := out1 + regeneratedStreamSize
+	out3 := out2 + regeneratedStreamSize
+	out4 := out3 + regeneratedStreamSize
+
+	regeneratedStreamSize4 := regeneratedSize - regeneratedStreamSize*3
+
+	outbuf = append(outbuf, make([]byte, regeneratedSize)...)
+
+	huffTable := r.huffmanTable
+	huffBits := uint32(r.huffmanTableBits)
+	huffMask := (uint32(1) << huffBits) - 1
+
+	for i := 0; i < regeneratedStreamSize; i++ {
+		use4 := i < regeneratedStreamSize4
+
+		fetchHuff := func(rbr *reverseBitReader) (uint16, error) {
+			if !rbr.fetch(uint8(huffBits)) {
+				return 0, rbr.makeError("literals Huffman stream out of bits")
+			}
+			idx := (rbr.bits >> (rbr.cnt - huffBits)) & huffMask
+			return huffTable[idx], nil
+		}
+
+		t1, err := fetchHuff(&rbr1)
+		if err != nil {
+			return nil, err
+		}
+
+		t2, err := fetchHuff(&rbr2)
+		if err != nil {
+			return nil, err
+		}
+
+		t3, err := fetchHuff(&rbr3)
+		if err != nil {
+			return nil, err
+		}
+
+		if use4 {
+			t4, err := fetchHuff(&rbr4)
+			if err != nil {
+				return nil, err
+			}
+			outbuf[out4] = byte(t4 >> 8)
+			out4++
+			rbr4.cnt -= uint32(t4 & 0xff)
+		}
+
+		outbuf[out1] = byte(t1 >> 8)
+		out1++
+		rbr1.cnt -= uint32(t1 & 0xff)
+
+		outbuf[out2] = byte(t2 >> 8)
+		out2++
+		rbr2.cnt -= uint32(t2 & 0xff)
+
+		outbuf[out3] = byte(t3 >> 8)
+		out3++
+		rbr3.cnt -= uint32(t3 & 0xff)
+	}
+
+	return outbuf, nil
+}
diff --git a/src/internal/zstd/xxhash.go b/src/internal/zstd/xxhash.go
new file mode 100644
index 0000000..4d579ee
--- /dev/null
+++ b/src/internal/zstd/xxhash.go
@@ -0,0 +1,148 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package zstd
+
+import (
+	"encoding/binary"
+	"math/bits"
+)
+
+const (
+	xxhPrime64c1 = 0x9e3779b185ebca87
+	xxhPrime64c2 = 0xc2b2ae3d27d4eb4f
+	xxhPrime64c3 = 0x165667b19e3779f9
+	xxhPrime64c4 = 0x85ebca77c2b2ae63
+	xxhPrime64c5 = 0x27d4eb2f165667c5
+)
+
+// xxhash64 is the state of a xxHash-64 checksum.
+type xxhash64 struct {
+	len uint64    // total length hashed
+	v   [4]uint64 // accumulators
+	buf [32]byte  // buffer
+	cnt int       // number of bytes in buffer
+}
+
+// reset discards the current state and prepares to compute a new hash.
+// We assume a seed of 0 since that is what zstd uses.
+func (xh *xxhash64) reset() {
+	xh.len = 0
+
+	// Separate addition for awkward constant overflow.
+	xh.v[0] = xxhPrime64c1
+	xh.v[0] += xxhPrime64c2
+
+	xh.v[1] = xxhPrime64c2
+	xh.v[2] = 0
+
+	// Separate negation for awkward constant overflow.
+	xh.v[3] = xxhPrime64c1
+	xh.v[3] = -xh.v[3]
+
+	for i := range xh.buf {
+		xh.buf[i] = 0
+	}
+	xh.cnt = 0
+}
+
+// update adds a buffer to the has.
+func (xh *xxhash64) update(b []byte) {
+	xh.len += uint64(len(b))
+
+	if xh.cnt+len(b) < len(xh.buf) {
+		copy(xh.buf[xh.cnt:], b)
+		xh.cnt += len(b)
+		return
+	}
+
+	if xh.cnt > 0 {
+		n := copy(xh.buf[xh.cnt:], b)
+		b = b[n:]
+		xh.v[0] = xh.round(xh.v[0], binary.LittleEndian.Uint64(xh.buf[:]))
+		xh.v[1] = xh.round(xh.v[1], binary.LittleEndian.Uint64(xh.buf[8:]))
+		xh.v[2] = xh.round(xh.v[2], binary.LittleEndian.Uint64(xh.buf[16:]))
+		xh.v[3] = xh.round(xh.v[3], binary.LittleEndian.Uint64(xh.buf[24:]))
+		xh.cnt = 0
+	}
+
+	for len(b) >= 32 {
+		xh.v[0] = xh.round(xh.v[0], binary.LittleEndian.Uint64(b))
+		xh.v[1] = xh.round(xh.v[1], binary.LittleEndian.Uint64(b[8:]))
+		xh.v[2] = xh.round(xh.v[2], binary.LittleEndian.Uint64(b[16:]))
+		xh.v[3] = xh.round(xh.v[3], binary.LittleEndian.Uint64(b[24:]))
+		b = b[32:]
+	}
+
+	if len(b) > 0 {
+		copy(xh.buf[:], b)
+		xh.cnt = len(b)
+	}
+}
+
+// digest returns the final hash value.
+func (xh *xxhash64) digest() uint64 {
+	var h64 uint64
+	if xh.len < 32 {
+		h64 = xh.v[2] + xxhPrime64c5
+	} else {
+		h64 = bits.RotateLeft64(xh.v[0], 1) +
+			bits.RotateLeft64(xh.v[1], 7) +
+			bits.RotateLeft64(xh.v[2], 12) +
+			bits.RotateLeft64(xh.v[3], 18)
+		h64 = xh.mergeRound(h64, xh.v[0])
+		h64 = xh.mergeRound(h64, xh.v[1])
+		h64 = xh.mergeRound(h64, xh.v[2])
+		h64 = xh.mergeRound(h64, xh.v[3])
+	}
+
+	h64 += xh.len
+
+	len := xh.len
+	len &= 31
+	buf := xh.buf[:]
+	for len >= 8 {
+		k1 := xh.round(0, binary.LittleEndian.Uint64(buf))
+		buf = buf[8:]
+		h64 ^= k1
+		h64 = bits.RotateLeft64(h64, 27)*xxhPrime64c1 + xxhPrime64c4
+		len -= 8
+	}
+	if len >= 4 {
+		h64 ^= uint64(binary.LittleEndian.Uint32(buf)) * xxhPrime64c1
+		buf = buf[4:]
+		h64 = bits.RotateLeft64(h64, 23)*xxhPrime64c2 + xxhPrime64c3
+		len -= 4
+	}
+	for len > 0 {
+		h64 ^= uint64(buf[0]) * xxhPrime64c5
+		buf = buf[1:]
+		h64 = bits.RotateLeft64(h64, 11) * xxhPrime64c1
+		len--
+	}
+
+	h64 ^= h64 >> 33
+	h64 *= xxhPrime64c2
+	h64 ^= h64 >> 29
+	h64 *= xxhPrime64c3
+	h64 ^= h64 >> 32
+
+	return h64
+}
+
+// round updates a value.
+func (xh *xxhash64) round(v, n uint64) uint64 {
+	v += n * xxhPrime64c2
+	v = bits.RotateLeft64(v, 31)
+	v *= xxhPrime64c1
+	return v
+}
+
+// mergeRound updates a value in the final round.
+func (xh *xxhash64) mergeRound(v, n uint64) uint64 {
+	n = xh.round(0, n)
+	v ^= n
+	v = v*xxhPrime64c1 + xxhPrime64c4
+	return v
+}
diff --git a/src/internal/zstd/xxhash_test.go b/src/internal/zstd/xxhash_test.go
new file mode 100644
index 0000000..646cee8
--- /dev/null
+++ b/src/internal/zstd/xxhash_test.go
@@ -0,0 +1,105 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package zstd
+
+import (
+	"bytes"
+	"os"
+	"os/exec"
+	"strconv"
+	"testing"
+)
+
+var xxHashTests = []struct {
+	data string
+	hash uint64
+}{
+	{
+		"hello, world",
+		0xb33a384e6d1b1242,
+	},
+	{
+		"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789$",
+		0x1032d841e824f998,
+	},
+}
+
+func TestXXHash(t *testing.T) {
+	var xh xxhash64
+	for i, test := range xxHashTests {
+		xh.reset()
+		xh.update([]byte(test.data))
+		if got := xh.digest(); got != test.hash {
+			t.Errorf("#%d: got %#x want %#x", i, got, test.hash)
+		}
+	}
+}
+
+func TestLargeXXHash(t *testing.T) {
+	if testing.Short() {
+		t.Skip("skipping expensive test in short mode")
+	}
+
+	data := bigData(t)
+	var xh xxhash64
+	xh.reset()
+	i := 0
+	for i < len(data) {
+		// Write varying amounts to test buffering.
+		c := i%4094 + 1
+		if i+c > len(data) {
+			c = len(data) - i
+		}
+		xh.update(data[i : i+c])
+		i += c
+	}
+
+	got := xh.digest()
+	want := uint64(0xf0dd39fd7e063f82)
+	if got != want {
+		t.Errorf("got %#x want %#x", got, want)
+	}
+}
+
+func FuzzXXHash(f *testing.F) {
+	if _, err := os.Stat("/usr/bin/xxhsum"); err != nil {
+		f.Skip("skipping because /usr/bin/xxhsum does not exist")
+	}
+
+	for _, test := range xxHashTests {
+		f.Add([]byte(test.data))
+	}
+	f.Add(bytes.Repeat([]byte("abcdefghijklmnop"), 256))
+	var buf bytes.Buffer
+	for i := 0; i < 256; i++ {
+		buf.WriteByte(byte(i))
+	}
+	f.Add(bytes.Repeat(buf.Bytes(), 64))
+	f.Add(bigData(f))
+
+	f.Fuzz(func(t *testing.T, b []byte) {
+		cmd := exec.Command("/usr/bin/xxhsum", "-H64")
+		cmd.Stdin = bytes.NewReader(b)
+		var hhsumHash bytes.Buffer
+		cmd.Stdout = &hhsumHash
+		if err := cmd.Run(); err != nil {
+			t.Fatalf("running hhsum failed: %v", err)
+		}
+		hhHashBytes := bytes.Fields(bytes.TrimSpace(hhsumHash.Bytes()))[0]
+		hhHash, err := strconv.ParseUint(string(hhHashBytes), 16, 64)
+		if err != nil {
+			t.Fatalf("could not parse hash %q: %v", hhHashBytes, err)
+		}
+
+		var xh xxhash64
+		xh.reset()
+		xh.update(b)
+		goHash := xh.digest()
+
+		if goHash != hhHash {
+			t.Errorf("Go hash %#x != xxhsum hash %#x", goHash, hhHash)
+		}
+	})
+}
diff --git a/src/internal/zstd/zstd.go b/src/internal/zstd/zstd.go
new file mode 100644
index 0000000..a860789
--- /dev/null
+++ b/src/internal/zstd/zstd.go
@@ -0,0 +1,508 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package zstd provides a decompressor for zstd streams,
+// described in RFC 8878. It does not support dictionaries.
+package zstd
+
+import (
+	"encoding/binary"
+	"errors"
+	"fmt"
+	"io"
+)
+
+// fuzzing is a fuzzer hook set to true when fuzzing.
+// This is used to reject cases where we don't match zstd.
+var fuzzing = false
+
+// Reader implements [io.Reader] to read a zstd compressed stream.
+type Reader struct {
+	// The underlying Reader.
+	r io.Reader
+
+	// Whether we have read the frame header.
+	// This is of interest when buffer is empty.
+	// If true we expect to see a new block.
+	sawFrameHeader bool
+
+	// Whether the current frame expects a checksum.
+	hasChecksum bool
+
+	// Whether we have read at least one frame.
+	readOneFrame bool
+
+	// True if the frame size is not known.
+	frameSizeUnknown bool
+
+	// The number of uncompressed bytes remaining in the current frame.
+	// If frameSizeUnknown is true, this is not valid.
+	remainingFrameSize uint64
+
+	// The number of bytes read from r up to the start of the current
+	// block, for error reporting.
+	blockOffset int64
+
+	// Buffered decompressed data.
+	buffer []byte
+	// Current read offset in buffer.
+	off int
+
+	// The current repeated offsets.
+	repeatedOffset1 uint32
+	repeatedOffset2 uint32
+	repeatedOffset3 uint32
+
+	// The current Huffman tree used for compressing literals.
+	huffmanTable     []uint16
+	huffmanTableBits int
+
+	// The window for back references.
+	windowSize int    // maximum required window size
+	window     []byte // window data
+
+	// A buffer available to hold a compressed block.
+	compressedBuf []byte
+
+	// A buffer for literals.
+	literals []byte
+
+	// Sequence decode FSE tables.
+	seqTables    [3][]fseBaselineEntry
+	seqTableBits [3]uint8
+
+	// Buffers for sequence decode FSE tables.
+	seqTableBuffers [3][]fseBaselineEntry
+
+	// Scratch space used for small reads, to avoid allocation.
+	scratch [16]byte
+
+	// A scratch table for reading an FSE. Only temporarily valid.
+	fseScratch []fseEntry
+
+	// For checksum computation.
+	checksum xxhash64
+}
+
+// NewReader creates a new Reader that decompresses data from the given reader.
+func NewReader(input io.Reader) *Reader {
+	r := new(Reader)
+	r.Reset(input)
+	return r
+}
+
+// Reset discards the current state and starts reading a new stream from r.
+// This permits reusing a Reader rather than allocating a new one.
+func (r *Reader) Reset(input io.Reader) {
+	r.r = input
+
+	// Several fields are preserved to avoid allocation.
+	// Others are always set before they are used.
+	r.sawFrameHeader = false
+	r.hasChecksum = false
+	r.readOneFrame = false
+	r.frameSizeUnknown = false
+	r.remainingFrameSize = 0
+	r.blockOffset = 0
+	// buffer
+	r.off = 0
+	// repeatedOffset1
+	// repeatedOffset2
+	// repeatedOffset3
+	// huffmanTable
+	// huffmanTableBits
+	// windowSize
+	// window
+	// compressedBuf
+	// literals
+	// seqTables
+	// seqTableBits
+	// seqTableBuffers
+	// scratch
+	// fseScratch
+}
+
+// Read implements [io.Reader].
+func (r *Reader) Read(p []byte) (int, error) {
+	if err := r.refillIfNeeded(); err != nil {
+		return 0, err
+	}
+	n := copy(p, r.buffer[r.off:])
+	r.off += n
+	return n, nil
+}
+
+// ReadByte implements [io.ByteReader].
+func (r *Reader) ReadByte() (byte, error) {
+	if err := r.refillIfNeeded(); err != nil {
+		return 0, err
+	}
+	ret := r.buffer[r.off]
+	r.off++
+	return ret, nil
+}
+
+// refillIfNeeded reads the next block if necessary.
+func (r *Reader) refillIfNeeded() error {
+	for r.off >= len(r.buffer) {
+		if err := r.refill(); err != nil {
+			return err
+		}
+		r.off = 0
+	}
+	return nil
+}
+
+// refill reads and decompresses the next block.
+func (r *Reader) refill() error {
+	if !r.sawFrameHeader {
+		if err := r.readFrameHeader(); err != nil {
+			return err
+		}
+	}
+	return r.readBlock()
+}
+
+// readFrameHeader reads the frame header and prepares to read a block.
+func (r *Reader) readFrameHeader() error {
+retry:
+	relativeOffset := 0
+
+	// Read magic number. RFC 3.1.1.
+	if _, err := io.ReadFull(r.r, r.scratch[:4]); err != nil {
+		// We require that the stream contain at least one frame.
+		if err == io.EOF && !r.readOneFrame {
+			err = io.ErrUnexpectedEOF
+		}
+		return r.wrapError(relativeOffset, err)
+	}
+
+	if magic := binary.LittleEndian.Uint32(r.scratch[:4]); magic != 0xfd2fb528 {
+		if magic >= 0x184d2a50 && magic <= 0x184d2a5f {
+			// This is a skippable frame.
+			r.blockOffset += int64(relativeOffset) + 4
+			if err := r.skipFrame(); err != nil {
+				return err
+			}
+			goto retry
+		}
+
+		return r.makeError(relativeOffset, "invalid magic number")
+	}
+
+	relativeOffset += 4
+
+	// Read Frame_Header_Descriptor. RFC 3.1.1.1.1.
+	if _, err := io.ReadFull(r.r, r.scratch[:1]); err != nil {
+		return r.wrapNonEOFError(relativeOffset, err)
+	}
+	descriptor := r.scratch[0]
+
+	singleSegment := descriptor&(1<<5) != 0
+
+	fcsFieldSize := 1 << (descriptor >> 6)
+	if fcsFieldSize == 1 && !singleSegment {
+		fcsFieldSize = 0
+	}
+
+	var windowDescriptorSize int
+	if singleSegment {
+		windowDescriptorSize = 0
+	} else {
+		windowDescriptorSize = 1
+	}
+
+	if descriptor&(1<<3) != 0 {
+		return r.makeError(relativeOffset, "reserved bit set in frame header descriptor")
+	}
+
+	r.hasChecksum = descriptor&(1<<2) != 0
+	if r.hasChecksum {
+		r.checksum.reset()
+	}
+
+	if descriptor&3 != 0 {
+		return r.makeError(relativeOffset, "dictionaries are not supported")
+	}
+
+	relativeOffset++
+
+	headerSize := windowDescriptorSize + fcsFieldSize
+
+	if _, err := io.ReadFull(r.r, r.scratch[:headerSize]); err != nil {
+		return r.wrapNonEOFError(relativeOffset, err)
+	}
+
+	// Figure out the maximum amount of data we need to retain
+	// for backreferences.
+
+	if singleSegment {
+		// No window required, as all the data is in a single buffer.
+		r.windowSize = 0
+	} else {
+		// Window descriptor. RFC 3.1.1.1.2.
+		windowDescriptor := r.scratch[0]
+		exponent := uint64(windowDescriptor >> 3)
+		mantissa := uint64(windowDescriptor & 7)
+		windowLog := exponent + 10
+		windowBase := uint64(1) << windowLog
+		windowAdd := (windowBase / 8) * mantissa
+		windowSize := windowBase + windowAdd
+
+		// Default zstd sets limits on the window size.
+		if fuzzing && (windowLog > 31 || windowSize > 1<<27) {
+			return r.makeError(relativeOffset, "windowSize too large")
+		}
+
+		// RFC 8878 permits us to set an 8M max on window size.
+		if windowSize > 8<<20 {
+			windowSize = 8 << 20
+		}
+
+		r.windowSize = int(windowSize)
+	}
+
+	// Frame_Content_Size. RFC 3.1.1.4.
+	r.frameSizeUnknown = false
+	r.remainingFrameSize = 0
+	fb := r.scratch[windowDescriptorSize:]
+	switch fcsFieldSize {
+	case 0:
+		r.frameSizeUnknown = true
+	case 1:
+		r.remainingFrameSize = uint64(fb[0])
+	case 2:
+		r.remainingFrameSize = 256 + uint64(binary.LittleEndian.Uint16(fb))
+	case 4:
+		r.remainingFrameSize = uint64(binary.LittleEndian.Uint32(fb))
+	case 8:
+		r.remainingFrameSize = binary.LittleEndian.Uint64(fb)
+	default:
+		panic("unreachable")
+	}
+
+	relativeOffset += headerSize
+
+	r.sawFrameHeader = true
+	r.readOneFrame = true
+	r.blockOffset += int64(relativeOffset)
+
+	// Prepare to read blocks from the frame.
+	r.repeatedOffset1 = 1
+	r.repeatedOffset2 = 4
+	r.repeatedOffset3 = 8
+	r.huffmanTableBits = 0
+	r.window = r.window[:0]
+	r.seqTables[0] = nil
+	r.seqTables[1] = nil
+	r.seqTables[2] = nil
+
+	return nil
+}
+
+// skipFrame skips a skippable frame. RFC 3.1.2.
+func (r *Reader) skipFrame() error {
+	relativeOffset := 0
+
+	if _, err := io.ReadFull(r.r, r.scratch[:4]); err != nil {
+		return r.wrapNonEOFError(relativeOffset, err)
+	}
+
+	relativeOffset += 4
+
+	size := binary.LittleEndian.Uint32(r.scratch[:4])
+
+	if seeker, ok := r.r.(io.Seeker); ok {
+		if _, err := seeker.Seek(int64(size), io.SeekCurrent); err != nil {
+			return err
+		}
+		r.blockOffset += int64(relativeOffset) + int64(size)
+		return nil
+	}
+
+	var skip []byte
+	const chunk = 1 << 20 // 1M
+	for size >= chunk {
+		if len(skip) == 0 {
+			skip = make([]byte, chunk)
+		}
+		if _, err := io.ReadFull(r.r, skip); err != nil {
+			return r.wrapNonEOFError(relativeOffset, err)
+		}
+		relativeOffset += chunk
+		size -= chunk
+	}
+	if size > 0 {
+		if len(skip) == 0 {
+			skip = make([]byte, size)
+		}
+		if _, err := io.ReadFull(r.r, skip); err != nil {
+			return r.wrapNonEOFError(relativeOffset, err)
+		}
+		relativeOffset += int(size)
+	}
+
+	r.blockOffset += int64(relativeOffset)
+
+	return nil
+}
+
+// readBlock reads the next block from a frame.
+func (r *Reader) readBlock() error {
+	relativeOffset := 0
+
+	// Read Block_Header. RFC 3.1.1.2.
+	if _, err := io.ReadFull(r.r, r.scratch[:3]); err != nil {
+		return r.wrapNonEOFError(relativeOffset, err)
+	}
+
+	relativeOffset += 3
+
+	header := uint32(r.scratch[0]) | (uint32(r.scratch[1]) << 8) | (uint32(r.scratch[2]) << 16)
+
+	lastBlock := header&1 != 0
+	blockType := (header >> 1) & 3
+	blockSize := int(header >> 3)
+
+	// Maximum block size is smaller of window size and 128K.
+	// We don't record the window size for a single segment frame,
+	// so just use 128K. RFC 3.1.1.2.3, 3.1.1.2.4.
+	if blockSize > 128<<10 || (r.windowSize > 0 && blockSize > r.windowSize) {
+		return r.makeError(relativeOffset, "block size too large")
+	}
+
+	// Handle different block types. RFC 3.1.1.2.2.
+	switch blockType {
+	case 0:
+		r.setBufferSize(blockSize)
+		if _, err := io.ReadFull(r.r, r.buffer); err != nil {
+			return r.wrapNonEOFError(relativeOffset, err)
+		}
+		relativeOffset += blockSize
+		r.blockOffset += int64(relativeOffset)
+	case 1:
+		r.setBufferSize(blockSize)
+		if _, err := io.ReadFull(r.r, r.scratch[:1]); err != nil {
+			return r.wrapNonEOFError(relativeOffset, err)
+		}
+		relativeOffset++
+		v := r.scratch[0]
+		for i := range r.buffer {
+			r.buffer[i] = v
+		}
+		r.blockOffset += int64(relativeOffset)
+	case 2:
+		r.blockOffset += int64(relativeOffset)
+		if err := r.compressedBlock(blockSize); err != nil {
+			return err
+		}
+		r.blockOffset += int64(blockSize)
+	case 3:
+		return r.makeError(relativeOffset, "invalid block type")
+	}
+
+	if !r.frameSizeUnknown {
+		if uint64(len(r.buffer)) > r.remainingFrameSize {
+			return r.makeError(relativeOffset, "too many uncompressed bytes in frame")
+		}
+		r.remainingFrameSize -= uint64(len(r.buffer))
+	}
+
+	if r.hasChecksum {
+		r.checksum.update(r.buffer)
+	}
+
+	if !lastBlock {
+		r.saveWindow(r.buffer)
+	} else {
+		if !r.frameSizeUnknown && r.remainingFrameSize != 0 {
+			return r.makeError(relativeOffset, "not enough uncompressed bytes for frame")
+		}
+		// Check for checksum at end of frame. RFC 3.1.1.
+		if r.hasChecksum {
+			if _, err := io.ReadFull(r.r, r.scratch[:4]); err != nil {
+				return r.wrapNonEOFError(0, err)
+			}
+
+			inputChecksum := binary.LittleEndian.Uint32(r.scratch[:4])
+			dataChecksum := uint32(r.checksum.digest())
+			if inputChecksum != dataChecksum {
+				return r.wrapError(0, fmt.Errorf("invalid checksum: got %#x want %#x", dataChecksum, inputChecksum))
+			}
+
+			r.blockOffset += 4
+		}
+		r.sawFrameHeader = false
+	}
+
+	return nil
+}
+
+// setBufferSize sets the decompressed buffer size.
+// When this is called the buffer is empty.
+func (r *Reader) setBufferSize(size int) {
+	if cap(r.buffer) < size {
+		need := size - cap(r.buffer)
+		r.buffer = append(r.buffer[:cap(r.buffer)], make([]byte, need)...)
+	}
+	r.buffer = r.buffer[:size]
+}
+
+// saveWindow saves bytes in the backreference window.
+// TODO: use a circular buffer for less data movement.
+func (r *Reader) saveWindow(buf []byte) {
+	if r.windowSize == 0 {
+		return
+	}
+
+	if len(buf) >= r.windowSize {
+		from := len(buf) - r.windowSize
+		r.window = append(r.window[:0], buf[from:]...)
+		return
+	}
+
+	keep := r.windowSize - len(buf) // must be positive
+	if keep < len(r.window) {
+		remove := len(r.window) - keep
+		copy(r.window[:], r.window[remove:])
+	}
+
+	r.window = append(r.window, buf...)
+}
+
+// zstdError is an error while decompressing.
+type zstdError struct {
+	offset int64
+	err    error
+}
+
+func (ze *zstdError) Error() string {
+	return fmt.Sprintf("zstd decompression error at %d: %v", ze.offset, ze.err)
+}
+
+func (ze *zstdError) Unwrap() error {
+	return ze.err
+}
+
+func (r *Reader) makeEOFError(off int) error {
+	return r.wrapError(off, io.ErrUnexpectedEOF)
+}
+
+func (r *Reader) wrapNonEOFError(off int, err error) error {
+	if err == io.EOF {
+		err = io.ErrUnexpectedEOF
+	}
+	return r.wrapError(off, err)
+}
+
+func (r *Reader) makeError(off int, msg string) error {
+	return r.wrapError(off, errors.New(msg))
+}
+
+func (r *Reader) wrapError(off int, err error) error {
+	if err == io.EOF {
+		return err
+	}
+	return &zstdError{r.blockOffset + int64(off), err}
+}
diff --git a/src/internal/zstd/zstd_test.go b/src/internal/zstd/zstd_test.go
new file mode 100644
index 0000000..bc75e0f
--- /dev/null
+++ b/src/internal/zstd/zstd_test.go
@@ -0,0 +1,249 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package zstd
+
+import (
+	"bytes"
+	"fmt"
+	"internal/race"
+	"internal/testenv"
+	"io"
+	"os"
+	"os/exec"
+	"strings"
+	"sync"
+	"testing"
+)
+
+// tests holds some simple test cases, including some found by fuzzing.
+var tests = []struct {
+	name, uncompressed, compressed string
+}{
+	{
+		"hello",
+		"hello, world\n",
+		"\x28\xb5\x2f\xfd\x24\x0d\x69\x00\x00\x68\x65\x6c\x6c\x6f\x2c\x20\x77\x6f\x72\x6c\x64\x0a\x4c\x1f\xf9\xf1",
+	},
+	{
+		// a small compressed .debug_ranges section.
+		"ranges",
+		"\xcc\x11\x00\x00\x00\x00\x00\x00\xd5\x13\x00\x00\x00\x00\x00\x00" +
+			"\x1c\x14\x00\x00\x00\x00\x00\x00\x72\x14\x00\x00\x00\x00\x00\x00" +
+			"\x9d\x14\x00\x00\x00\x00\x00\x00\xd5\x14\x00\x00\x00\x00\x00\x00" +
+			"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
+			"\xfb\x12\x00\x00\x00\x00\x00\x00\x09\x13\x00\x00\x00\x00\x00\x00" +
+			"\x0c\x13\x00\x00\x00\x00\x00\x00\xcb\x13\x00\x00\x00\x00\x00\x00" +
+			"\x29\x14\x00\x00\x00\x00\x00\x00\x4e\x14\x00\x00\x00\x00\x00\x00" +
+			"\x9d\x14\x00\x00\x00\x00\x00\x00\xd5\x14\x00\x00\x00\x00\x00\x00" +
+			"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
+			"\xfb\x12\x00\x00\x00\x00\x00\x00\x09\x13\x00\x00\x00\x00\x00\x00" +
+			"\x67\x13\x00\x00\x00\x00\x00\x00\xcb\x13\x00\x00\x00\x00\x00\x00" +
+			"\x9d\x14\x00\x00\x00\x00\x00\x00\xd5\x14\x00\x00\x00\x00\x00\x00" +
+			"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
+			"\x5f\x0b\x00\x00\x00\x00\x00\x00\x6c\x0b\x00\x00\x00\x00\x00\x00" +
+			"\x7d\x0b\x00\x00\x00\x00\x00\x00\x7e\x0c\x00\x00\x00\x00\x00\x00" +
+			"\x38\x0f\x00\x00\x00\x00\x00\x00\x5c\x0f\x00\x00\x00\x00\x00\x00" +
+			"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
+			"\x83\x0c\x00\x00\x00\x00\x00\x00\xfa\x0c\x00\x00\x00\x00\x00\x00" +
+			"\xfd\x0d\x00\x00\x00\x00\x00\x00\xef\x0e\x00\x00\x00\x00\x00\x00" +
+			"\x14\x0f\x00\x00\x00\x00\x00\x00\x38\x0f\x00\x00\x00\x00\x00\x00" +
+			"\x9f\x0f\x00\x00\x00\x00\x00\x00\xac\x0f\x00\x00\x00\x00\x00\x00" +
+			"\xdb\x0f\x00\x00\x00\x00\x00\x00\xff\x0f\x00\x00\x00\x00\x00\x00" +
+			"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
+			"\xfd\x0d\x00\x00\x00\x00\x00\x00\xd8\x0e\x00\x00\x00\x00\x00\x00" +
+			"\x9f\x0f\x00\x00\x00\x00\x00\x00\xac\x0f\x00\x00\x00\x00\x00\x00" +
+			"\xdb\x0f\x00\x00\x00\x00\x00\x00\xff\x0f\x00\x00\x00\x00\x00\x00" +
+			"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
+			"\xfa\x0c\x00\x00\x00\x00\x00\x00\xea\x0d\x00\x00\x00\x00\x00\x00" +
+			"\xef\x0e\x00\x00\x00\x00\x00\x00\x14\x0f\x00\x00\x00\x00\x00\x00" +
+			"\x5c\x0f\x00\x00\x00\x00\x00\x00\x9f\x0f\x00\x00\x00\x00\x00\x00" +
+			"\xac\x0f\x00\x00\x00\x00\x00\x00\xdb\x0f\x00\x00\x00\x00\x00\x00" +
+			"\xff\x0f\x00\x00\x00\x00\x00\x00\x2c\x10\x00\x00\x00\x00\x00\x00" +
+			"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
+			"\x60\x11\x00\x00\x00\x00\x00\x00\xd1\x16\x00\x00\x00\x00\x00\x00" +
+			"\x40\x0b\x00\x00\x00\x00\x00\x00\x2c\x10\x00\x00\x00\x00\x00\x00" +
+			"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
+			"\x7a\x00\x00\x00\x00\x00\x00\x00\xb6\x00\x00\x00\x00\x00\x00\x00" +
+			"\x9f\x01\x00\x00\x00\x00\x00\x00\xa7\x01\x00\x00\x00\x00\x00\x00" +
+			"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
+			"\x7a\x00\x00\x00\x00\x00\x00\x00\xa9\x00\x00\x00\x00\x00\x00\x00" +
+			"\x9f\x01\x00\x00\x00\x00\x00\x00\xa7\x01\x00\x00\x00\x00\x00\x00" +
+			"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
+
+		"\x28\xb5\x2f\xfd\x64\xa0\x01\x2d\x05\x00\xc4\x04\xcc\x11\x00\xd5" +
+			"\x13\x00\x1c\x14\x00\x72\x9d\xd5\xfb\x12\x00\x09\x0c\x13\xcb\x13" +
+			"\x29\x4e\x67\x5f\x0b\x6c\x0b\x7d\x0b\x7e\x0c\x38\x0f\x5c\x0f\x83" +
+			"\x0c\xfa\x0c\xfd\x0d\xef\x0e\x14\x38\x9f\x0f\xac\x0f\xdb\x0f\xff" +
+			"\x0f\xd8\x9f\xac\xdb\xff\xea\x5c\x2c\x10\x60\xd1\x16\x40\x0b\x7a" +
+			"\x00\xb6\x00\x9f\x01\xa7\x01\xa9\x36\x20\xa0\x83\x14\x34\x63\x4a" +
+			"\x21\x70\x8c\x07\x46\x03\x4e\x10\x62\x3c\x06\x4e\xc8\x8c\xb0\x32" +
+			"\x2a\x59\xad\xb2\xf1\x02\x82\x7c\x33\xcb\x92\x6f\x32\x4f\x9b\xb0" +
+			"\xa2\x30\xf0\xc0\x06\x1e\x98\x99\x2c\x06\x1e\xd8\xc0\x03\x56\xd8" +
+			"\xc0\x03\x0f\x6c\xe0\x01\xf1\xf0\xee\x9a\xc6\xc8\x97\x99\xd1\x6c" +
+			"\xb4\x21\x45\x3b\x10\xe4\x7b\x99\x4d\x8a\x36\x64\x5c\x77\x08\x02" +
+			"\xcb\xe0\xce",
+	},
+	{
+		"fuzz1",
+		"0\x00\x00\x00\x00\x000\x00\x00\x00\x00\x001\x00\x00\x00\x00\x000000",
+		"(\xb5/\xfd\x04X\x8d\x00\x00P0\x000\x001\x000000\x03T\x02\x00\x01\x01m\xf9\xb7G",
+	},
+}
+
+func TestSamples(t *testing.T) {
+	for _, test := range tests {
+		test := test
+		t.Run(test.name, func(t *testing.T) {
+			r := NewReader(strings.NewReader(test.compressed))
+			got, err := io.ReadAll(r)
+			if err != nil {
+				t.Fatal(err)
+			}
+			gotstr := string(got)
+			if gotstr != test.uncompressed {
+				t.Errorf("got %q want %q", gotstr, test.uncompressed)
+			}
+		})
+	}
+}
+
+var (
+	bigDataOnce  sync.Once
+	bigDataBytes []byte
+	bigDataErr   error
+)
+
+// bigData returns the contents of our large test file.
+func bigData(t testing.TB) []byte {
+	bigDataOnce.Do(func() {
+		bigDataBytes, bigDataErr = os.ReadFile("../../testdata/Isaac.Newton-Opticks.txt")
+	})
+	if bigDataErr != nil {
+		t.Fatal(bigDataErr)
+	}
+	return bigDataBytes
+}
+
+var (
+	zstdBigOnce  sync.Once
+	zstdBigBytes []byte
+	zstdBigSkip  bool
+	zstdBigErr   error
+)
+
+// zstdBigData returns the compressed contents of our large test file.
+// This will only run on Unix systems with zstd installed.
+// That's OK as the package is GOOS-independent.
+func zstdBigData(t testing.TB) []byte {
+	input := bigData(t)
+
+	zstdBigOnce.Do(func() {
+		if _, err := os.Stat("/usr/bin/zstd"); err != nil {
+			zstdBigSkip = true
+			return
+		}
+
+		cmd := exec.Command("/usr/bin/zstd", "-z")
+		cmd.Stdin = bytes.NewReader(input)
+		var compressed bytes.Buffer
+		cmd.Stdout = &compressed
+		cmd.Stderr = os.Stderr
+		if err := cmd.Run(); err != nil {
+			zstdBigErr = fmt.Errorf("running zstd failed: %v", err)
+			return
+		}
+
+		zstdBigBytes = compressed.Bytes()
+	})
+	if zstdBigSkip {
+		t.Skip("skipping because /usr/bin/zstd does not exist")
+	}
+	if zstdBigErr != nil {
+		t.Fatal(zstdBigErr)
+	}
+	return zstdBigBytes
+}
+
+// Test decompressing a large file. We don't have a compressor,
+// so this test only runs on systems with zstd installed.
+func TestLarge(t *testing.T) {
+	if testing.Short() {
+		t.Skip("skipping expensive test in short mode")
+	}
+
+	data := bigData(t)
+	compressed := zstdBigData(t)
+
+	t.Logf("/usr/bin/zstd compressed %d bytes to %d", len(data), len(compressed))
+
+	r := NewReader(bytes.NewReader(compressed))
+	got, err := io.ReadAll(r)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	if !bytes.Equal(got, data) {
+		showDiffs(t, got, data)
+	}
+}
+
+// showDiffs reports the first few differences in two []byte.
+func showDiffs(t *testing.T, got, want []byte) {
+	t.Error("data mismatch")
+	if len(got) != len(want) {
+		t.Errorf("got data length %d, want %d", len(got), len(want))
+	}
+	diffs := 0
+	for i, b := range got {
+		if i >= len(want) {
+			break
+		}
+		if b != want[i] {
+			diffs++
+			if diffs > 20 {
+				break
+			}
+			t.Logf("%d: %#x != %#x", i, b, want[i])
+		}
+	}
+}
+
+func TestAlloc(t *testing.T) {
+	testenv.SkipIfOptimizationOff(t)
+	if race.Enabled {
+		t.Skip("skipping allocation test under race detector")
+	}
+
+	compressed := zstdBigData(t)
+	input := bytes.NewReader(compressed)
+	r := NewReader(input)
+	c := testing.AllocsPerRun(10, func() {
+		input.Reset(compressed)
+		r.Reset(input)
+		io.Copy(io.Discard, r)
+	})
+	if c != 0 {
+		t.Errorf("got %v allocs, want 0", c)
+	}
+}
+
+func BenchmarkLarge(b *testing.B) {
+	b.StopTimer()
+	b.ReportAllocs()
+
+	compressed := zstdBigData(b)
+
+	b.SetBytes(int64(len(compressed)))
+
+	input := bytes.NewReader(compressed)
+	r := NewReader(input)
+
+	b.StartTimer()
+	for i := 0; i < b.N; i++ {
+		input.Reset(compressed)
+		r.Reset(input)
+		io.Copy(io.Discard, r)
+	}
+}
diff --git a/src/io/fs/format.go b/src/io/fs/format.go
new file mode 100644
index 0000000..f490341
--- /dev/null
+++ b/src/io/fs/format.go
@@ -0,0 +1,76 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package fs
+
+import (
+	"time"
+)
+
+// FormatFileInfo returns a formatted version of info for human readability.
+// Implementations of FileInfo can call this from a String method.
+// The output for a file named "hello.go", 100 bytes, mode 0o644, created
+// January 1, 1970 at noon is
+//
+//	-rw-r--r-- 100 1970-01-01 12:00:00 hello.go
+func FormatFileInfo(info FileInfo) string {
+	name := info.Name()
+	b := make([]byte, 0, 40+len(name))
+	b = append(b, info.Mode().String()...)
+	b = append(b, ' ')
+
+	size := info.Size()
+	var usize uint64
+	if size >= 0 {
+		usize = uint64(size)
+	} else {
+		b = append(b, '-')
+		usize = uint64(-size)
+	}
+	var buf [20]byte
+	i := len(buf) - 1
+	for usize >= 10 {
+		q := usize / 10
+		buf[i] = byte('0' + usize - q*10)
+		i--
+		usize = q
+	}
+	buf[i] = byte('0' + usize)
+	b = append(b, buf[i:]...)
+	b = append(b, ' ')
+
+	b = append(b, info.ModTime().Format(time.DateTime)...)
+	b = append(b, ' ')
+
+	b = append(b, name...)
+	if info.IsDir() {
+		b = append(b, '/')
+	}
+
+	return string(b)
+}
+
+// FormatDirEntry returns a formatted version of dir for human readability.
+// Implementations of DirEntry can call this from a String method.
+// The outputs for a directory named subdir and a file named hello.go are:
+//
+//	d subdir/
+//	- hello.go
+func FormatDirEntry(dir DirEntry) string {
+	name := dir.Name()
+	b := make([]byte, 0, 5+len(name))
+
+	// The Type method does not return any permission bits,
+	// so strip them from the string.
+	mode := dir.Type().String()
+	mode = mode[:len(mode)-9]
+
+	b = append(b, mode...)
+	b = append(b, ' ')
+	b = append(b, name...)
+	if dir.IsDir() {
+		b = append(b, '/')
+	}
+	return string(b)
+}
diff --git a/src/io/fs/format_test.go b/src/io/fs/format_test.go
new file mode 100644
index 0000000..a5f5066
--- /dev/null
+++ b/src/io/fs/format_test.go
@@ -0,0 +1,123 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package fs_test
+
+import (
+	. "io/fs"
+	"testing"
+	"time"
+)
+
+// formatTest implements FileInfo to test FormatFileInfo,
+// and implements DirEntry to test FormatDirEntry.
+type formatTest struct {
+	name    string
+	size    int64
+	mode    FileMode
+	modTime time.Time
+	isDir   bool
+}
+
+func (fs *formatTest) Name() string {
+	return fs.name
+}
+
+func (fs *formatTest) Size() int64 {
+	return fs.size
+}
+
+func (fs *formatTest) Mode() FileMode {
+	return fs.mode
+}
+
+func (fs *formatTest) ModTime() time.Time {
+	return fs.modTime
+}
+
+func (fs *formatTest) IsDir() bool {
+	return fs.isDir
+}
+
+func (fs *formatTest) Sys() any {
+	return nil
+}
+
+func (fs *formatTest) Type() FileMode {
+	return fs.mode.Type()
+}
+
+func (fs *formatTest) Info() (FileInfo, error) {
+	return fs, nil
+}
+
+var formatTests = []struct {
+	input        formatTest
+	wantFileInfo string
+	wantDirEntry string
+}{
+	{
+		formatTest{
+			name:    "hello.go",
+			size:    100,
+			mode:    0o644,
+			modTime: time.Date(1970, time.January, 1, 12, 0, 0, 0, time.UTC),
+			isDir:   false,
+		},
+		"-rw-r--r-- 100 1970-01-01 12:00:00 hello.go",
+		"- hello.go",
+	},
+	{
+		formatTest{
+			name:    "home/gopher",
+			size:    0,
+			mode:    ModeDir | 0o755,
+			modTime: time.Date(1970, time.January, 1, 12, 0, 0, 0, time.UTC),
+			isDir:   true,
+		},
+		"drwxr-xr-x 0 1970-01-01 12:00:00 home/gopher/",
+		"d home/gopher/",
+	},
+	{
+		formatTest{
+			name:    "big",
+			size:    0x7fffffffffffffff,
+			mode:    ModeIrregular | 0o644,
+			modTime: time.Date(1970, time.January, 1, 12, 0, 0, 0, time.UTC),
+			isDir:   false,
+		},
+		"?rw-r--r-- 9223372036854775807 1970-01-01 12:00:00 big",
+		"? big",
+	},
+	{
+		formatTest{
+			name:    "small",
+			size:    -0x8000000000000000,
+			mode:    ModeSocket | ModeSetuid | 0o644,
+			modTime: time.Date(1970, time.January, 1, 12, 0, 0, 0, time.UTC),
+			isDir:   false,
+		},
+		"Surw-r--r-- -9223372036854775808 1970-01-01 12:00:00 small",
+		"S small",
+	},
+}
+
+func TestFormatFileInfo(t *testing.T) {
+	for i, test := range formatTests {
+		got := FormatFileInfo(&test.input)
+		if got != test.wantFileInfo {
+			t.Errorf("%d: FormatFileInfo(%#v) = %q, want %q", i, test.input, got, test.wantFileInfo)
+		}
+	}
+}
+
+func TestFormatDirEntry(t *testing.T) {
+	for i, test := range formatTests {
+		got := FormatDirEntry(&test.input)
+		if got != test.wantDirEntry {
+			t.Errorf("%d: FormatDirEntry(%#v) = %q, want %q", i, test.input, got, test.wantDirEntry)
+		}
+	}
+
+}
diff --git a/src/io/fs/readdir.go b/src/io/fs/readdir.go
index 2b10ddb..42aca49 100644
--- a/src/io/fs/readdir.go
+++ b/src/io/fs/readdir.go
@@ -67,6 +67,10 @@
 	return di.fileInfo.Name()
 }
 
+func (di dirInfo) String() string {
+	return FormatDirEntry(di)
+}
+
 // FileInfoToDirEntry returns a DirEntry that returns information from info.
 // If info is nil, FileInfoToDirEntry returns nil.
 func FileInfoToDirEntry(info FileInfo) DirEntry {
diff --git a/src/io/fs/walk.go b/src/io/fs/walk.go
index cff2610..baf559e 100644
--- a/src/io/fs/walk.go
+++ b/src/io/fs/walk.go
@@ -135,3 +135,7 @@
 func (d *statDirEntry) IsDir() bool             { return d.info.IsDir() }
 func (d *statDirEntry) Type() FileMode          { return d.info.Mode().Type() }
 func (d *statDirEntry) Info() (FileInfo, error) { return d.info, nil }
+
+func (d *statDirEntry) String() string {
+	return FormatDirEntry(d)
+}
diff --git a/src/io/io.go b/src/io/io.go
index 630ab73..01f36e0 100644
--- a/src/io/io.go
+++ b/src/io/io.go
@@ -74,6 +74,9 @@
 // that happen after reading some bytes and also both of the
 // allowed EOF behaviors.
 //
+// If len(p) == 0, Read should always return n == 0. It may return a
+// non-nil error if some error condition is known, such as EOF.
+//
 // 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
@@ -575,6 +578,10 @@
 }
 
 func (o *OffsetWriter) WriteAt(p []byte, off int64) (n int, err error) {
+	if off < 0 {
+		return 0, errOffset
+	}
+
 	off += o.base
 	return o.w.WriteAt(p, off)
 }
@@ -694,10 +701,6 @@
 func ReadAll(r Reader) ([]byte, error) {
 	b := make([]byte, 0, 512)
 	for {
-		if len(b) == cap(b) {
-			// Add more capacity (let append pick how much).
-			b = append(b, 0)[:len(b)]
-		}
 		n, err := r.Read(b[len(b):cap(b)])
 		b = b[:len(b)+n]
 		if err != nil {
@@ -706,5 +709,10 @@
 			}
 			return b, err
 		}
+
+		if len(b) == cap(b) {
+			// Add more capacity (let append pick how much).
+			b = append(b, 0)[:len(b)]
+		}
 	}
 }
diff --git a/src/io/io_test.go b/src/io/io_test.go
index 35db15c..c09b5e3 100644
--- a/src/io/io_test.go
+++ b/src/io/io_test.go
@@ -608,6 +608,26 @@
 	}
 }
 
+func TestWriteAt_PositionPriorToBase(t *testing.T) {
+	tmpdir := t.TempDir()
+	tmpfilename := "TestOffsetWriter_WriteAt"
+	tmpfile, err := os.CreateTemp(tmpdir, tmpfilename)
+	if err != nil {
+		t.Fatalf("CreateTemp(%s) failed: %v", tmpfilename, err)
+	}
+	defer tmpfile.Close()
+
+	// start writing position in OffsetWriter
+	offset := int64(10)
+	// position we want to write to the tmpfile
+	at := int64(-1)
+	w := NewOffsetWriter(tmpfile, offset)
+	_, e := w.WriteAt([]byte("hello"), at)
+	if e == nil {
+		t.Errorf("error expected to be not nil")
+	}
+}
+
 func TestOffsetWriter_Write(t *testing.T) {
 	const content = "0123456789ABCDEF"
 	contentSize := len(content)
diff --git a/src/io/ioutil/ioutil.go b/src/io/ioutil/ioutil.go
index 6a1d691..67768e5 100644
--- a/src/io/ioutil/ioutil.go
+++ b/src/io/ioutil/ioutil.go
@@ -5,7 +5,7 @@
 // Package ioutil implements some I/O utility functions.
 //
 // Deprecated: As of Go 1.16, the same functionality is now provided
-// by package io or package os, and those implementations
+// by package [io] or package [os], and those implementations
 // should be preferred in new code.
 // See the specific function documentation for details.
 package ioutil
@@ -22,7 +22,7 @@
 // defined to read from src until EOF, it does not treat an EOF from Read
 // as an error to be reported.
 //
-// Deprecated: As of Go 1.16, this function simply calls io.ReadAll.
+// Deprecated: As of Go 1.16, this function simply calls [io.ReadAll].
 func ReadAll(r io.Reader) ([]byte, error) {
 	return io.ReadAll(r)
 }
@@ -32,7 +32,7 @@
 // reads the whole file, it does not treat an EOF from Read as an error
 // to be reported.
 //
-// Deprecated: As of Go 1.16, this function simply calls os.ReadFile.
+// Deprecated: As of Go 1.16, this function simply calls [os.ReadFile].
 func ReadFile(filename string) ([]byte, error) {
 	return os.ReadFile(filename)
 }
@@ -41,7 +41,7 @@
 // If the file does not exist, WriteFile creates it with permissions perm
 // (before umask); otherwise WriteFile truncates it before writing, without changing permissions.
 //
-// Deprecated: As of Go 1.16, this function simply calls os.WriteFile.
+// Deprecated: As of Go 1.16, this function simply calls [os.WriteFile].
 func WriteFile(filename string, data []byte, perm fs.FileMode) error {
 	return os.WriteFile(filename, data, perm)
 }
@@ -51,12 +51,12 @@
 // sorted by filename. If an error occurs reading the directory,
 // ReadDir returns no directory entries along with the error.
 //
-// Deprecated: As of Go 1.16, os.ReadDir is a more efficient and correct choice:
-// it returns a list of fs.DirEntry instead of fs.FileInfo,
+// Deprecated: As of Go 1.16, [os.ReadDir] is a more efficient and correct choice:
+// it returns a list of [fs.DirEntry] instead of [fs.FileInfo],
 // and it returns partial results in the case of an error
 // midway through reading a directory.
 //
-// If you must continue obtaining a list of fs.FileInfo, you still can:
+// If you must continue obtaining a list of [fs.FileInfo], you still can:
 //
 //	entries, err := os.ReadDir(dirname)
 //	if err != nil { ... }
@@ -83,7 +83,7 @@
 // NopCloser returns a ReadCloser with a no-op Close method wrapping
 // the provided Reader r.
 //
-// Deprecated: As of Go 1.16, this function simply calls io.NopCloser.
+// Deprecated: As of Go 1.16, this function simply calls [io.NopCloser].
 func NopCloser(r io.Reader) io.ReadCloser {
 	return io.NopCloser(r)
 }
@@ -91,5 +91,5 @@
 // Discard is an io.Writer on which all Write calls succeed
 // without doing anything.
 //
-// Deprecated: As of Go 1.16, this value is simply io.Discard.
+// Deprecated: As of Go 1.16, this value is simply [io.Discard].
 var Discard io.Writer = io.Discard
diff --git a/src/io/ioutil/ioutil_test.go b/src/io/ioutil/ioutil_test.go
index db85755..6bff8c6 100644
--- a/src/io/ioutil/ioutil_test.go
+++ b/src/io/ioutil/ioutil_test.go
@@ -9,6 +9,7 @@
 	. "io/ioutil"
 	"os"
 	"path/filepath"
+	"runtime"
 	"testing"
 )
 
@@ -70,6 +71,9 @@
 	if os.Getuid() == 0 {
 		t.Skipf("Root can write to read-only files anyway, so skip the read-only test.")
 	}
+	if runtime.GOOS == "wasip1" {
+		t.Skip("file permissions are not supported by wasip1")
+	}
 
 	// We don't want to use TempFile directly, since that opens a file for us as 0600.
 	tempDir, err := TempDir("", t.Name())
diff --git a/src/io/ioutil/tempfile.go b/src/io/ioutil/tempfile.go
index 0561ad5..5360d96 100644
--- a/src/io/ioutil/tempfile.go
+++ b/src/io/ioutil/tempfile.go
@@ -20,7 +20,7 @@
 // to find the pathname of the file. It is the caller's responsibility
 // to remove the file when no longer needed.
 //
-// Deprecated: As of Go 1.17, this function simply calls os.CreateTemp.
+// Deprecated: As of Go 1.17, this function simply calls [os.CreateTemp].
 func TempFile(dir, pattern string) (f *os.File, err error) {
 	return os.CreateTemp(dir, pattern)
 }
@@ -35,7 +35,7 @@
 // will not choose the same directory. It is the caller's responsibility
 // to remove the directory when no longer needed.
 //
-// Deprecated: As of Go 1.17, this function simply calls os.MkdirTemp.
+// Deprecated: As of Go 1.17, this function simply calls [os.MkdirTemp].
 func TempDir(dir, pattern string) (name string, err error) {
 	return os.MkdirTemp(dir, pattern)
 }
diff --git a/src/log/internal/internal.go b/src/log/internal/internal.go
new file mode 100644
index 0000000..d5af2c5
--- /dev/null
+++ b/src/log/internal/internal.go
@@ -0,0 +1,12 @@
+// Copyright 2023 The Go Authors. 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 contains definitions used by both log and log/slog.
+package internal
+
+// DefaultOutput holds a function which calls the default log.Logger's
+// output function.
+// It allows slog.defaultHandler to call into an unexported function of
+// the log package.
+var DefaultOutput func(pc uintptr, data []byte) error
diff --git a/src/log/log.go b/src/log/log.go
index 566535f..9d5440e 100644
--- a/src/log/log.go
+++ b/src/log/log.go
@@ -17,6 +17,7 @@
 import (
 	"fmt"
 	"io"
+	"log/internal"
 	"os"
 	"runtime"
 	"sync"
@@ -54,12 +55,12 @@
 // 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 on each line to identify the logger (but see Lmsgprefix)
-	flag      int         // properties
-	out       io.Writer   // destination for output
-	buf       []byte      // for accumulating text to write
-	isDiscard atomic.Bool // whether out == io.Discard
+	outMu sync.Mutex
+	out   io.Writer // destination for output
+
+	prefix    atomic.Pointer[string] // prefix on each line to identify the logger (but see Lmsgprefix)
+	flag      atomic.Int32           // properties
+	isDiscard atomic.Bool
 }
 
 // New creates a new Logger. The out variable sets the
@@ -68,17 +69,17 @@
 // after the log header if the Lmsgprefix flag is provided.
 // The flag argument defines the logging properties.
 func New(out io.Writer, prefix string, flag int) *Logger {
-	l := &Logger{out: out, prefix: prefix, flag: flag}
-	if out == io.Discard {
-		l.isDiscard.Store(true)
-	}
+	l := new(Logger)
+	l.SetOutput(out)
+	l.SetPrefix(prefix)
+	l.SetFlags(flag)
 	return l
 }
 
 // SetOutput sets the output destination for the logger.
 func (l *Logger) SetOutput(w io.Writer) {
-	l.mu.Lock()
-	defer l.mu.Unlock()
+	l.outMu.Lock()
+	defer l.outMu.Unlock()
 	l.out = w
 	l.isDiscard.Store(w == io.Discard)
 }
@@ -110,15 +111,15 @@
 //   - date and/or time (if corresponding flags are provided),
 //   - file and line number (if corresponding flags are provided),
 //   - l.prefix (if it's not blank and Lmsgprefix is set).
-func (l *Logger) formatHeader(buf *[]byte, t time.Time, file string, line int) {
-	if l.flag&Lmsgprefix == 0 {
-		*buf = append(*buf, l.prefix...)
+func formatHeader(buf *[]byte, t time.Time, prefix string, flag int, file string, line int) {
+	if flag&Lmsgprefix == 0 {
+		*buf = append(*buf, prefix...)
 	}
-	if l.flag&(Ldate|Ltime|Lmicroseconds) != 0 {
-		if l.flag&LUTC != 0 {
+	if flag&(Ldate|Ltime|Lmicroseconds) != 0 {
+		if flag&LUTC != 0 {
 			t = t.UTC()
 		}
-		if l.flag&Ldate != 0 {
+		if flag&Ldate != 0 {
 			year, month, day := t.Date()
 			itoa(buf, year, 4)
 			*buf = append(*buf, '/')
@@ -127,22 +128,22 @@
 			itoa(buf, day, 2)
 			*buf = append(*buf, ' ')
 		}
-		if l.flag&(Ltime|Lmicroseconds) != 0 {
+		if 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 {
+			if 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 {
+	if flag&(Lshortfile|Llongfile) != 0 {
+		if flag&Lshortfile != 0 {
 			short := file
 			for i := len(file) - 1; i > 0; i-- {
 				if file[i] == '/' {
@@ -157,11 +158,32 @@
 		itoa(buf, line, -1)
 		*buf = append(*buf, ": "...)
 	}
-	if l.flag&Lmsgprefix != 0 {
-		*buf = append(*buf, l.prefix...)
+	if flag&Lmsgprefix != 0 {
+		*buf = append(*buf, prefix...)
 	}
 }
 
+var bufferPool = sync.Pool{New: func() any { return new([]byte) }}
+
+func getBuffer() *[]byte {
+	p := bufferPool.Get().(*[]byte)
+	*p = (*p)[:0]
+	return p
+}
+
+func putBuffer(p *[]byte) {
+	// Proper usage of a sync.Pool requires each entry to have approximately
+	// the same memory cost. To obtain this property when the stored type
+	// contains a variably-sized buffer, we add a hard limit on the maximum buffer
+	// to place back in the pool.
+	//
+	// See https://go.dev/issue/23199
+	if cap(*p) > 64<<10 {
+		*p = nil
+	}
+	bufferPool.Put(p)
+}
+
 // 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
@@ -169,57 +191,91 @@
 // 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 {
+	calldepth++ // +1 for this frame.
+	return l.output(0, calldepth, func(b []byte) []byte {
+		return append(b, s...)
+	})
+}
+
+// output can take either a calldepth or a pc to get source line information.
+// It uses the pc if it is non-zero.
+func (l *Logger) output(pc uintptr, calldepth int, appendOutput func([]byte) []byte) error {
+	if l.isDiscard.Load() {
+		return nil
+	}
+
 	now := time.Now() // get this early.
+
+	// Load prefix and flag once so that their value is consistent within
+	// this call regardless of any concurrent changes to their value.
+	prefix := l.Prefix()
+	flag := l.Flags()
+
 	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
+	if flag&(Lshortfile|Llongfile) != 0 {
+		if pc == 0 {
+			var ok bool
+			_, file, line, ok = runtime.Caller(calldepth)
+			if !ok {
+				file = "???"
+				line = 0
+			}
+		} else {
+			fs := runtime.CallersFrames([]uintptr{pc})
+			f, _ := fs.Next()
+			file = f.File
+			if file == "" {
+				file = "???"
+			}
+			line = f.Line
 		}
-		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')
+
+	buf := getBuffer()
+	defer putBuffer(buf)
+	formatHeader(buf, now, prefix, flag, file, line)
+	*buf = appendOutput(*buf)
+	if len(*buf) == 0 || (*buf)[len(*buf)-1] != '\n' {
+		*buf = append(*buf, '\n')
 	}
-	_, err := l.out.Write(l.buf)
+
+	l.outMu.Lock()
+	defer l.outMu.Unlock()
+	_, err := l.out.Write(*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 ...any) {
-	if l.isDiscard.Load() {
-		return
+func init() {
+	internal.DefaultOutput = func(pc uintptr, data []byte) error {
+		return std.output(pc, 0, func(buf []byte) []byte {
+			return append(buf, data...)
+		})
 	}
-	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 ...any) {
-	if l.isDiscard.Load() {
-		return
-	}
-	l.Output(2, fmt.Sprint(v...))
+	l.output(0, 2, func(b []byte) []byte {
+		return fmt.Append(b, v...)
+	})
+}
+
+// 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 ...any) {
+	l.output(0, 2, func(b []byte) []byte {
+		return fmt.Appendf(b, format, v...)
+	})
 }
 
 // Println calls l.Output to print to the logger.
 // Arguments are handled in the manner of fmt.Println.
 func (l *Logger) Println(v ...any) {
-	if l.isDiscard.Load() {
-		return
-	}
-	l.Output(2, fmt.Sprintln(v...))
+	l.output(0, 2, func(b []byte) []byte {
+		return fmt.Appendln(b, v...)
+	})
 }
 
 // Fatal is equivalent to l.Print() followed by a call to os.Exit(1).
@@ -264,37 +320,32 @@
 // Flags returns the output flags for the logger.
 // The flag bits are Ldate, Ltime, and so on.
 func (l *Logger) Flags() int {
-	l.mu.Lock()
-	defer l.mu.Unlock()
-	return l.flag
+	return int(l.flag.Load())
 }
 
 // SetFlags sets the output flags for the logger.
 // The flag bits are Ldate, Ltime, and so on.
 func (l *Logger) SetFlags(flag int) {
-	l.mu.Lock()
-	defer l.mu.Unlock()
-	l.flag = flag
+	l.flag.Store(int32(flag))
 }
 
 // Prefix returns the output prefix for the logger.
 func (l *Logger) Prefix() string {
-	l.mu.Lock()
-	defer l.mu.Unlock()
-	return l.prefix
+	if p := l.prefix.Load(); p != nil {
+		return *p
+	}
+	return ""
 }
 
 // SetPrefix sets the output prefix for the logger.
 func (l *Logger) SetPrefix(prefix string) {
-	l.mu.Lock()
-	defer l.mu.Unlock()
-	l.prefix = prefix
+	l.prefix.Store(&prefix)
 }
 
 // Writer returns the output destination for the logger.
 func (l *Logger) Writer() io.Writer {
-	l.mu.Lock()
-	defer l.mu.Unlock()
+	l.outMu.Lock()
+	defer l.outMu.Unlock()
 	return l.out
 }
 
@@ -335,28 +386,25 @@
 // Print calls Output to print to the standard logger.
 // Arguments are handled in the manner of fmt.Print.
 func Print(v ...any) {
-	if std.isDiscard.Load() {
-		return
-	}
-	std.Output(2, fmt.Sprint(v...))
+	std.output(0, 2, func(b []byte) []byte {
+		return fmt.Append(b, v...)
+	})
 }
 
 // Printf calls Output to print to the standard logger.
 // Arguments are handled in the manner of fmt.Printf.
 func Printf(format string, v ...any) {
-	if std.isDiscard.Load() {
-		return
-	}
-	std.Output(2, fmt.Sprintf(format, v...))
+	std.output(0, 2, func(b []byte) []byte {
+		return fmt.Appendf(b, format, v...)
+	})
 }
 
 // Println calls Output to print to the standard logger.
 // Arguments are handled in the manner of fmt.Println.
 func Println(v ...any) {
-	if std.isDiscard.Load() {
-		return
-	}
-	std.Output(2, fmt.Sprintln(v...))
+	std.output(0, 2, func(b []byte) []byte {
+		return fmt.Appendln(b, v...)
+	})
 }
 
 // Fatal is equivalent to Print() followed by a call to os.Exit(1).
diff --git a/src/log/log_test.go b/src/log/log_test.go
index f2ef165..c7fa78f 100644
--- a/src/log/log_test.go
+++ b/src/log/log_test.go
@@ -12,7 +12,9 @@
 	"io"
 	"os"
 	"regexp"
+	"runtime"
 	"strings"
+	"sync"
 	"testing"
 	"time"
 )
@@ -21,7 +23,7 @@
 	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         = `(61|63):` // must update if the calls to l.Printf / l.Print below move
+	Rline         = `(63|65):` // 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
 )
@@ -98,15 +100,25 @@
 	}
 }
 
+func TestNonNewLogger(t *testing.T) {
+	var l Logger
+	l.SetOutput(new(bytes.Buffer)) // minimal work to initialize a Logger
+	l.Print("hello")
+}
+
 func TestOutputRace(t *testing.T) {
 	var b bytes.Buffer
 	l := New(&b, "", 0)
+	var wg sync.WaitGroup
+	wg.Add(100)
 	for i := 0; i < 100; i++ {
 		go func() {
+			defer wg.Done()
 			l.SetFlags(0)
+			l.Output(0, "")
 		}()
-		l.Output(0, "")
 	}
+	wg.Wait()
 }
 
 func TestFlagAndPrefixSetting(t *testing.T) {
@@ -140,6 +152,15 @@
 	if !matched {
 		t.Error("message did not match pattern")
 	}
+
+	// Ensure that a newline is added only if the buffer lacks a newline suffix.
+	b.Reset()
+	l.SetFlags(0)
+	l.SetPrefix("\n")
+	l.Output(0, "")
+	if got := b.String(); got != "\n" {
+		t.Errorf("message mismatch:\ngot  %q\nwant %q", got, "\n")
+	}
 }
 
 func TestUTCFlag(t *testing.T) {
@@ -209,6 +230,7 @@
 	const testString = "test"
 	var buf bytes.Buffer
 	l := New(&buf, "", LstdFlags)
+	b.ReportAllocs()
 	for i := 0; i < b.N; i++ {
 		buf.Reset()
 		l.Println(testString)
@@ -219,8 +241,40 @@
 	const testString = "test"
 	var buf bytes.Buffer
 	l := New(&buf, "", 0)
+	b.ReportAllocs()
 	for i := 0; i < b.N; i++ {
 		buf.Reset()
 		l.Println(testString)
 	}
 }
+
+// discard is identical to io.Discard,
+// but copied here to avoid the io.Discard optimization in Logger.
+type discard struct{}
+
+func (discard) Write(p []byte) (int, error) {
+	return len(p), nil
+}
+
+func BenchmarkConcurrent(b *testing.B) {
+	l := New(discard{}, "prefix: ", Ldate|Ltime|Lmicroseconds|Llongfile|Lmsgprefix)
+	var group sync.WaitGroup
+	for i := runtime.NumCPU(); i > 0; i-- {
+		group.Add(1)
+		go func() {
+			for i := 0; i < b.N; i++ {
+				l.Output(0, "hello, world!")
+			}
+			defer group.Done()
+		}()
+	}
+	group.Wait()
+}
+
+func BenchmarkDiscard(b *testing.B) {
+	l := New(io.Discard, "", LstdFlags|Lshortfile)
+	b.ReportAllocs()
+	for i := 0; i < b.N; i++ {
+		l.Printf("processing %d objects from bucket %q", 1234, "fizzbuzz")
+	}
+}
diff --git a/src/log/slog/attr.go b/src/log/slog/attr.go
new file mode 100644
index 0000000..90e343b
--- /dev/null
+++ b/src/log/slog/attr.go
@@ -0,0 +1,102 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package slog
+
+import (
+	"fmt"
+	"time"
+)
+
+// An Attr is a key-value pair.
+type Attr struct {
+	Key   string
+	Value Value
+}
+
+// String returns an Attr for a string value.
+func String(key, value string) Attr {
+	return Attr{key, StringValue(value)}
+}
+
+// Int64 returns an Attr for an int64.
+func Int64(key string, value int64) Attr {
+	return Attr{key, Int64Value(value)}
+}
+
+// Int converts an int to an int64 and returns
+// an Attr with that value.
+func Int(key string, value int) Attr {
+	return Int64(key, int64(value))
+}
+
+// Uint64 returns an Attr for a uint64.
+func Uint64(key string, v uint64) Attr {
+	return Attr{key, Uint64Value(v)}
+}
+
+// Float64 returns an Attr for a floating-point number.
+func Float64(key string, v float64) Attr {
+	return Attr{key, Float64Value(v)}
+}
+
+// Bool returns an Attr for a bool.
+func Bool(key string, v bool) Attr {
+	return Attr{key, BoolValue(v)}
+}
+
+// Time returns an Attr for a time.Time.
+// It discards the monotonic portion.
+func Time(key string, v time.Time) Attr {
+	return Attr{key, TimeValue(v)}
+}
+
+// Duration returns an Attr for a time.Duration.
+func Duration(key string, v time.Duration) Attr {
+	return Attr{key, DurationValue(v)}
+}
+
+// Group returns an Attr for a Group Value.
+// The first argument is the key; the remaining arguments
+// are converted to Attrs as in [Logger.Log].
+//
+// Use Group to collect several key-value pairs under a single
+// key on a log line, or as the result of LogValue
+// in order to log a single value as multiple Attrs.
+func Group(key string, args ...any) Attr {
+	return Attr{key, GroupValue(argsToAttrSlice(args)...)}
+}
+
+func argsToAttrSlice(args []any) []Attr {
+	var (
+		attr  Attr
+		attrs []Attr
+	)
+	for len(args) > 0 {
+		attr, args = argsToAttr(args)
+		attrs = append(attrs, attr)
+	}
+	return attrs
+}
+
+// Any returns an Attr for the supplied value.
+// See [AnyValue] for how values are treated.
+func Any(key string, value any) Attr {
+	return Attr{key, AnyValue(value)}
+}
+
+// Equal reports whether a and b have equal keys and values.
+func (a Attr) Equal(b Attr) bool {
+	return a.Key == b.Key && a.Value.Equal(b.Value)
+}
+
+func (a Attr) String() string {
+	return fmt.Sprintf("%s=%s", a.Key, a.Value)
+}
+
+// isEmpty reports whether a has an empty key and a nil value.
+// That can be written as Attr{} or Any("", nil).
+func (a Attr) isEmpty() bool {
+	return a.Key == "" && a.Value.num == 0 && a.Value.any == nil
+}
diff --git a/src/log/slog/attr_test.go b/src/log/slog/attr_test.go
new file mode 100644
index 0000000..1187a85
--- /dev/null
+++ b/src/log/slog/attr_test.go
@@ -0,0 +1,43 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package slog
+
+import (
+	"internal/testenv"
+	"testing"
+	"time"
+)
+
+func TestAttrNoAlloc(t *testing.T) {
+	testenv.SkipIfOptimizationOff(t)
+	// Assign values just to make sure the compiler doesn't optimize away the statements.
+	var (
+		i int64
+		u uint64
+		f float64
+		b bool
+		s string
+		x any
+		p = &i
+		d time.Duration
+	)
+	a := int(testing.AllocsPerRun(5, func() {
+		i = Int64("key", 1).Value.Int64()
+		u = Uint64("key", 1).Value.Uint64()
+		f = Float64("key", 1).Value.Float64()
+		b = Bool("key", true).Value.Bool()
+		s = String("key", "foo").Value.String()
+		d = Duration("key", d).Value.Duration()
+		x = Any("key", p).Value.Any()
+	}))
+	if a != 0 {
+		t.Errorf("got %d allocs, want zero", a)
+	}
+	_ = u
+	_ = f
+	_ = b
+	_ = s
+	_ = x
+}
diff --git a/src/log/slog/doc.go b/src/log/slog/doc.go
new file mode 100644
index 0000000..088df61
--- /dev/null
+++ b/src/log/slog/doc.go
@@ -0,0 +1,320 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+/*
+Package slog provides structured logging,
+in which log records include a message,
+a severity level, and various other attributes
+expressed as key-value pairs.
+
+It defines a type, [Logger],
+which provides several methods (such as [Logger.Info] and [Logger.Error])
+for reporting events of interest.
+
+Each Logger is associated with a [Handler].
+A Logger output method creates a [Record] from the method arguments
+and passes it to the Handler, which decides how to handle it.
+There is a default Logger accessible through top-level functions
+(such as [Info] and [Error]) that call the corresponding Logger methods.
+
+A log record consists of a time, a level, a message, and a set of key-value
+pairs, where the keys are strings and the values may be of any type.
+As an example,
+
+	slog.Info("hello", "count", 3)
+
+creates a record containing the time of the call,
+a level of Info, the message "hello", and a single
+pair with key "count" and value 3.
+
+The [Info] top-level function calls the [Logger.Info] method on the default Logger.
+In addition to [Logger.Info], there are methods for Debug, Warn and Error levels.
+Besides these convenience methods for common levels,
+there is also a [Logger.Log] method which takes the level as an argument.
+Each of these methods has a corresponding top-level function that uses the
+default logger.
+
+The default handler formats the log record's message, time, level, and attributes
+as a string and passes it to the [log] package.
+
+	2022/11/08 15:28:26 INFO hello count=3
+
+For more control over the output format, create a logger with a different handler.
+This statement uses [New] to create a new logger with a TextHandler
+that writes structured records in text form to standard error:
+
+	logger := slog.New(slog.NewTextHandler(os.Stderr, nil))
+
+[TextHandler] output is a sequence of key=value pairs, easily and unambiguously
+parsed by machine. This statement:
+
+	logger.Info("hello", "count", 3)
+
+produces this output:
+
+	time=2022-11-08T15:28:26.000-05:00 level=INFO msg=hello count=3
+
+The package also provides [JSONHandler], whose output is line-delimited JSON:
+
+	logger := slog.New(slog.NewJSONHandler(os.Stdout, nil))
+	logger.Info("hello", "count", 3)
+
+produces this output:
+
+	{"time":"2022-11-08T15:28:26.000000000-05:00","level":"INFO","msg":"hello","count":3}
+
+Both [TextHandler] and [JSONHandler] can be configured with [HandlerOptions].
+There are options for setting the minimum level (see Levels, below),
+displaying the source file and line of the log call, and
+modifying attributes before they are logged.
+
+Setting a logger as the default with
+
+	slog.SetDefault(logger)
+
+will cause the top-level functions like [Info] to use it.
+[SetDefault] also updates the default logger used by the [log] package,
+so that existing applications that use [log.Printf] and related functions
+will send log records to the logger's handler without needing to be rewritten.
+
+Some attributes are common to many log calls.
+For example, you may wish to include the URL or trace identifier of a server request
+with all log events arising from the request.
+Rather than repeat the attribute with every log call, you can use [Logger.With]
+to construct a new Logger containing the attributes:
+
+	logger2 := logger.With("url", r.URL)
+
+The arguments to With are the same key-value pairs used in [Logger.Info].
+The result is a new Logger with the same handler as the original, but additional
+attributes that will appear in the output of every call.
+
+# Levels
+
+A [Level] is an integer representing the importance or severity of a log event.
+The higher the level, the more severe the event.
+This package defines constants for the most common levels,
+but any int can be used as a level.
+
+In an application, you may wish to log messages only at a certain level or greater.
+One common configuration is to log messages at Info or higher levels,
+suppressing debug logging until it is needed.
+The built-in handlers can be configured with the minimum level to output by
+setting [HandlerOptions.Level].
+The program's `main` function typically does this.
+The default value is LevelInfo.
+
+Setting the [HandlerOptions.Level] field to a [Level] value
+fixes the handler's minimum level throughout its lifetime.
+Setting it to a [LevelVar] allows the level to be varied dynamically.
+A LevelVar holds a Level and is safe to read or write from multiple
+goroutines.
+To vary the level dynamically for an entire program, first initialize
+a global LevelVar:
+
+	var programLevel = new(slog.LevelVar) // Info by default
+
+Then use the LevelVar to construct a handler, and make it the default:
+
+	h := slog.NewJSONHandler(os.Stderr, &slog.HandlerOptions{Level: programLevel})
+	slog.SetDefault(slog.New(h))
+
+Now the program can change its logging level with a single statement:
+
+	programLevel.Set(slog.LevelDebug)
+
+# Groups
+
+Attributes can be collected into groups.
+A group has a name that is used to qualify the names of its attributes.
+How this qualification is displayed depends on the handler.
+[TextHandler] separates the group and attribute names with a dot.
+[JSONHandler] treats each group as a separate JSON object, with the group name as the key.
+
+Use [Group] to create a Group attribute from a name and a list of key-value pairs:
+
+	slog.Group("request",
+	    "method", r.Method,
+	    "url", r.URL)
+
+TextHandler would display this group as
+
+	request.method=GET request.url=http://example.com
+
+JSONHandler would display it as
+
+	"request":{"method":"GET","url":"http://example.com"}
+
+Use [Logger.WithGroup] to qualify all of a Logger's output
+with a group name. Calling WithGroup on a Logger results in a
+new Logger with the same Handler as the original, but with all
+its attributes qualified by the group name.
+
+This can help prevent duplicate attribute keys in large systems,
+where subsystems might use the same keys.
+Pass each subsystem a different Logger with its own group name so that
+potential duplicates are qualified:
+
+	logger := slog.Default().With("id", systemID)
+	parserLogger := logger.WithGroup("parser")
+	parseInput(input, parserLogger)
+
+When parseInput logs with parserLogger, its keys will be qualified with "parser",
+so even if it uses the common key "id", the log line will have distinct keys.
+
+# Contexts
+
+Some handlers may wish to include information from the [context.Context] that is
+available at the call site. One example of such information
+is the identifier for the current span when tracing is enabled.
+
+The [Logger.Log] and [Logger.LogAttrs] methods take a context as a first
+argument, as do their corresponding top-level functions.
+
+Although the convenience methods on Logger (Info and so on) and the
+corresponding top-level functions do not take a context, the alternatives ending
+in "Context" do. For example,
+
+	slog.InfoContext(ctx, "message")
+
+It is recommended to pass a context to an output method if one is available.
+
+# Attrs and Values
+
+An [Attr] is a key-value pair. The Logger output methods accept Attrs as well as
+alternating keys and values. The statement
+
+	slog.Info("hello", slog.Int("count", 3))
+
+behaves the same as
+
+	slog.Info("hello", "count", 3)
+
+There are convenience constructors for [Attr] such as [Int], [String], and [Bool]
+for common types, as well as the function [Any] for constructing Attrs of any
+type.
+
+The value part of an Attr is a type called [Value].
+Like an [any], a Value can hold any Go value,
+but it can represent typical values, including all numbers and strings,
+without an allocation.
+
+For the most efficient log output, use [Logger.LogAttrs].
+It is similar to [Logger.Log] but accepts only Attrs, not alternating
+keys and values; this allows it, too, to avoid allocation.
+
+The call
+
+	logger.LogAttrs(ctx, slog.LevelInfo, "hello", slog.Int("count", 3))
+
+is the most efficient way to achieve the same output as
+
+	slog.Info("hello", "count", 3)
+
+# Customizing a type's logging behavior
+
+If a type implements the [LogValuer] interface, the [Value] returned from its LogValue
+method is used for logging. You can use this to control how values of the type
+appear in logs. For example, you can redact secret information like passwords,
+or gather a struct's fields in a Group. See the examples under [LogValuer] for
+details.
+
+A LogValue method may return a Value that itself implements [LogValuer]. The [Value.Resolve]
+method handles these cases carefully, avoiding infinite loops and unbounded recursion.
+Handler authors and others may wish to use Value.Resolve instead of calling LogValue directly.
+
+# Wrapping output methods
+
+The logger functions use reflection over the call stack to find the file name
+and line number of the logging call within the application. This can produce
+incorrect source information for functions that wrap slog. For instance, if you
+define this function in file mylog.go:
+
+	func Infof(format string, args ...any) {
+	    slog.Default().Info(fmt.Sprintf(format, args...))
+	}
+
+and you call it like this in main.go:
+
+	Infof(slog.Default(), "hello, %s", "world")
+
+then slog will report the source file as mylog.go, not main.go.
+
+A correct implementation of Infof will obtain the source location
+(pc) and pass it to NewRecord.
+The Infof function in the package-level example called "wrapping"
+demonstrates how to do this.
+
+# Working with Records
+
+Sometimes a Handler will need to modify a Record
+before passing it on to another Handler or backend.
+A Record contains a mixture of simple public fields (e.g. Time, Level, Message)
+and hidden fields that refer to state (such as attributes) indirectly. This
+means that modifying a simple copy of a Record (e.g. by calling
+[Record.Add] or [Record.AddAttrs] to add attributes)
+may have unexpected effects on the original.
+Before modifying a Record, use [Record.Clone] to
+create a copy that shares no state with the original,
+or create a new Record with [NewRecord]
+and build up its Attrs by traversing the old ones with [Record.Attrs].
+
+# Performance considerations
+
+If profiling your application demonstrates that logging is taking significant time,
+the following suggestions may help.
+
+If many log lines have a common attribute, use [Logger.With] to create a Logger with
+that attribute. The built-in handlers will format that attribute only once, at the
+call to [Logger.With]. The [Handler] interface is designed to allow that optimization,
+and a well-written Handler should take advantage of it.
+
+The arguments to a log call are always evaluated, even if the log event is discarded.
+If possible, defer computation so that it happens only if the value is actually logged.
+For example, consider the call
+
+	slog.Info("starting request", "url", r.URL.String())  // may compute String unnecessarily
+
+The URL.String method will be called even if the logger discards Info-level events.
+Instead, pass the URL directly:
+
+	slog.Info("starting request", "url", &r.URL) // calls URL.String only if needed
+
+The built-in [TextHandler] will call its String method, but only
+if the log event is enabled.
+Avoiding the call to String also preserves the structure of the underlying value.
+For example [JSONHandler] emits the components of the parsed URL as a JSON object.
+If you want to avoid eagerly paying the cost of the String call
+without causing the handler to potentially inspect the structure of the value,
+wrap the value in a fmt.Stringer implementation that hides its Marshal methods.
+
+You can also use the [LogValuer] interface to avoid unnecessary work in disabled log
+calls. Say you need to log some expensive value:
+
+	slog.Debug("frobbing", "value", computeExpensiveValue(arg))
+
+Even if this line is disabled, computeExpensiveValue will be called.
+To avoid that, define a type implementing LogValuer:
+
+	type expensive struct { arg int }
+
+	func (e expensive) LogValue() slog.Value {
+	    return slog.AnyValue(computeExpensiveValue(e.arg))
+	}
+
+Then use a value of that type in log calls:
+
+	slog.Debug("frobbing", "value", expensive{arg})
+
+Now computeExpensiveValue will only be called when the line is enabled.
+
+The built-in handlers acquire a lock before calling [io.Writer.Write]
+to ensure that each record is written in one piece. User-defined
+handlers are responsible for their own locking.
+
+# Writing a handler
+
+For a guide to writing a custom handler, see https://golang.org/s/slog-handler-guide.
+*/
+package slog
diff --git a/src/log/slog/example_custom_levels_test.go b/src/log/slog/example_custom_levels_test.go
new file mode 100644
index 0000000..7351ca4
--- /dev/null
+++ b/src/log/slog/example_custom_levels_test.go
@@ -0,0 +1,93 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package slog_test
+
+import (
+	"context"
+	"log/slog"
+	"os"
+)
+
+// This example demonstrates using custom log levels and custom log level names.
+// In addition to the default log levels, it introduces Trace, Notice, and
+// Emergency levels. The ReplaceAttr changes the way levels are printed for both
+// the standard log levels and the custom log levels.
+func ExampleHandlerOptions_customLevels() {
+	// Exported constants from a custom logging package.
+	const (
+		LevelTrace     = slog.Level(-8)
+		LevelDebug     = slog.LevelDebug
+		LevelInfo      = slog.LevelInfo
+		LevelNotice    = slog.Level(2)
+		LevelWarning   = slog.LevelWarn
+		LevelError     = slog.LevelError
+		LevelEmergency = slog.Level(12)
+	)
+
+	th := slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{
+		// Set a custom level to show all log output. The default value is
+		// LevelInfo, which would drop Debug and Trace logs.
+		Level: LevelTrace,
+
+		ReplaceAttr: func(groups []string, a slog.Attr) slog.Attr {
+			// Remove time from the output for predictable test output.
+			if a.Key == slog.TimeKey {
+				return slog.Attr{}
+			}
+
+			// Customize the name of the level key and the output string, including
+			// custom level values.
+			if a.Key == slog.LevelKey {
+				// Rename the level key from "level" to "sev".
+				a.Key = "sev"
+
+				// Handle custom level values.
+				level := a.Value.Any().(slog.Level)
+
+				// This could also look up the name from a map or other structure, but
+				// this demonstrates using a switch statement to rename levels. For
+				// maximum performance, the string values should be constants, but this
+				// example uses the raw strings for readability.
+				switch {
+				case level < LevelDebug:
+					a.Value = slog.StringValue("TRACE")
+				case level < LevelInfo:
+					a.Value = slog.StringValue("DEBUG")
+				case level < LevelNotice:
+					a.Value = slog.StringValue("INFO")
+				case level < LevelWarning:
+					a.Value = slog.StringValue("NOTICE")
+				case level < LevelError:
+					a.Value = slog.StringValue("WARNING")
+				case level < LevelEmergency:
+					a.Value = slog.StringValue("ERROR")
+				default:
+					a.Value = slog.StringValue("EMERGENCY")
+				}
+			}
+
+			return a
+		},
+	})
+
+	logger := slog.New(th)
+	ctx := context.Background()
+	logger.Log(ctx, LevelEmergency, "missing pilots")
+	logger.Error("failed to start engines", "err", "missing fuel")
+	logger.Warn("falling back to default value")
+	logger.Log(ctx, LevelNotice, "all systems are running")
+	logger.Info("initiating launch")
+	logger.Debug("starting background job")
+	logger.Log(ctx, LevelTrace, "button clicked")
+
+	// Output:
+	// sev=EMERGENCY msg="missing pilots"
+	// sev=ERROR msg="failed to start engines" err="missing fuel"
+	// sev=WARNING msg="falling back to default value"
+	// sev=NOTICE msg="all systems are running"
+	// sev=INFO msg="initiating launch"
+	// sev=DEBUG msg="starting background job"
+	// sev=TRACE msg="button clicked"
+}
diff --git a/src/log/slog/example_level_handler_test.go b/src/log/slog/example_level_handler_test.go
new file mode 100644
index 0000000..1ff91d4
--- /dev/null
+++ b/src/log/slog/example_level_handler_test.go
@@ -0,0 +1,73 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package slog_test
+
+import (
+	"context"
+	"log/slog"
+	"log/slog/internal/slogtest"
+	"os"
+)
+
+// A LevelHandler wraps a Handler with an Enabled method
+// that returns false for levels below a minimum.
+type LevelHandler struct {
+	level   slog.Leveler
+	handler slog.Handler
+}
+
+// NewLevelHandler returns a LevelHandler with the given level.
+// All methods except Enabled delegate to h.
+func NewLevelHandler(level slog.Leveler, h slog.Handler) *LevelHandler {
+	// Optimization: avoid chains of LevelHandlers.
+	if lh, ok := h.(*LevelHandler); ok {
+		h = lh.Handler()
+	}
+	return &LevelHandler{level, h}
+}
+
+// Enabled implements Handler.Enabled by reporting whether
+// level is at least as large as h's level.
+func (h *LevelHandler) Enabled(_ context.Context, level slog.Level) bool {
+	return level >= h.level.Level()
+}
+
+// Handle implements Handler.Handle.
+func (h *LevelHandler) Handle(ctx context.Context, r slog.Record) error {
+	return h.handler.Handle(ctx, r)
+}
+
+// WithAttrs implements Handler.WithAttrs.
+func (h *LevelHandler) WithAttrs(attrs []slog.Attr) slog.Handler {
+	return NewLevelHandler(h.level, h.handler.WithAttrs(attrs))
+}
+
+// WithGroup implements Handler.WithGroup.
+func (h *LevelHandler) WithGroup(name string) slog.Handler {
+	return NewLevelHandler(h.level, h.handler.WithGroup(name))
+}
+
+// Handler returns the Handler wrapped by h.
+func (h *LevelHandler) Handler() slog.Handler {
+	return h.handler
+}
+
+// This example shows how to Use a LevelHandler to change the level of an
+// existing Handler while preserving its other behavior.
+//
+// This example demonstrates increasing the log level to reduce a logger's
+// output.
+//
+// Another typical use would be to decrease the log level (to LevelDebug, say)
+// during a part of the program that was suspected of containing a bug.
+func ExampleHandler_levelHandler() {
+	th := slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{ReplaceAttr: slogtest.RemoveTime})
+	logger := slog.New(NewLevelHandler(slog.LevelWarn, th))
+	logger.Info("not printed")
+	logger.Warn("printed")
+
+	// Output:
+	// level=WARN msg=printed
+}
diff --git a/src/log/slog/example_logvaluer_group_test.go b/src/log/slog/example_logvaluer_group_test.go
new file mode 100644
index 0000000..4cc478f
--- /dev/null
+++ b/src/log/slog/example_logvaluer_group_test.go
@@ -0,0 +1,35 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package slog_test
+
+import "log/slog"
+
+type Name struct {
+	First, Last string
+}
+
+// LogValue implements slog.LogValuer.
+// It returns a group containing the fields of
+// the Name, so that they appear together in the log output.
+func (n Name) LogValue() slog.Value {
+	return slog.GroupValue(
+		slog.String("first", n.First),
+		slog.String("last", n.Last))
+}
+
+func ExampleLogValuer_group() {
+	n := Name{"Perry", "Platypus"}
+	slog.Info("mission accomplished", "agent", n)
+
+	// JSON Output would look in part like:
+	// {
+	//     ...
+	//     "msg": "mission accomplished",
+	//     "agent": {
+	//         "first": "Perry",
+	//         "last": "Platypus"
+	//     }
+	// }
+}
diff --git a/src/log/slog/example_logvaluer_secret_test.go b/src/log/slog/example_logvaluer_secret_test.go
new file mode 100644
index 0000000..51d0020
--- /dev/null
+++ b/src/log/slog/example_logvaluer_secret_test.go
@@ -0,0 +1,31 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package slog_test
+
+import (
+	"log/slog"
+	"log/slog/internal/slogtest"
+	"os"
+)
+
+// A token is a secret value that grants permissions.
+type Token string
+
+// LogValue implements slog.LogValuer.
+// It avoids revealing the token.
+func (Token) LogValue() slog.Value {
+	return slog.StringValue("REDACTED_TOKEN")
+}
+
+// This example demonstrates a Value that replaces itself
+// with an alternative representation to avoid revealing secrets.
+func ExampleLogValuer_secret() {
+	t := Token("shhhh!")
+	logger := slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{ReplaceAttr: slogtest.RemoveTime}))
+	logger.Info("permission granted", "user", "Perry", "token", t)
+
+	// Output:
+	// level=INFO msg="permission granted" user=Perry token=REDACTED_TOKEN
+}
diff --git a/src/log/slog/example_test.go b/src/log/slog/example_test.go
new file mode 100644
index 0000000..a677456
--- /dev/null
+++ b/src/log/slog/example_test.go
@@ -0,0 +1,29 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package slog_test
+
+import (
+	"log/slog"
+	"log/slog/internal/slogtest"
+	"net/http"
+	"os"
+	"time"
+)
+
+func ExampleGroup() {
+	r, _ := http.NewRequest("GET", "localhost", nil)
+	// ...
+
+	logger := slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{ReplaceAttr: slogtest.RemoveTime}))
+	logger.Info("finished",
+		slog.Group("req",
+			slog.String("method", r.Method),
+			slog.String("url", r.URL.String())),
+		slog.Int("status", http.StatusOK),
+		slog.Duration("duration", time.Second))
+
+	// Output:
+	// level=INFO msg=finished req.method=GET req.url=localhost status=200 duration=1s
+}
diff --git a/src/log/slog/example_wrap_test.go b/src/log/slog/example_wrap_test.go
new file mode 100644
index 0000000..dcc87b8
--- /dev/null
+++ b/src/log/slog/example_wrap_test.go
@@ -0,0 +1,47 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package slog_test
+
+import (
+	"context"
+	"fmt"
+	"log/slog"
+	"os"
+	"path/filepath"
+	"runtime"
+	"time"
+)
+
+// Infof is an example of a user-defined logging function that wraps slog.
+// The log record contains the source position of the caller of Infof.
+func Infof(logger *slog.Logger, format string, args ...any) {
+	if !logger.Enabled(context.Background(), slog.LevelInfo) {
+		return
+	}
+	var pcs [1]uintptr
+	runtime.Callers(2, pcs[:]) // skip [Callers, Infof]
+	r := slog.NewRecord(time.Now(), slog.LevelInfo, fmt.Sprintf(format, args...), pcs[0])
+	_ = logger.Handler().Handle(context.Background(), r)
+}
+
+func Example_wrapping() {
+	replace := func(groups []string, a slog.Attr) slog.Attr {
+		// Remove time.
+		if a.Key == slog.TimeKey && len(groups) == 0 {
+			return slog.Attr{}
+		}
+		// Remove the directory from the source's filename.
+		if a.Key == slog.SourceKey {
+			source := a.Value.Any().(*slog.Source)
+			source.File = filepath.Base(source.File)
+		}
+		return a
+	}
+	logger := slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{AddSource: true, ReplaceAttr: replace}))
+	Infof(logger, "message, %s", "formatted")
+
+	// Output:
+	// level=INFO source=example_wrap_test.go:43 msg="message, formatted"
+}
diff --git a/src/log/slog/handler.go b/src/log/slog/handler.go
new file mode 100644
index 0000000..a73983c
--- /dev/null
+++ b/src/log/slog/handler.go
@@ -0,0 +1,567 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package slog
+
+import (
+	"context"
+	"fmt"
+	"io"
+	"log/slog/internal/buffer"
+	"slices"
+	"strconv"
+	"sync"
+	"time"
+)
+
+// A Handler handles log records produced by a Logger..
+//
+// A typical handler may print log records to standard error,
+// or write them to a file or database, or perhaps augment them
+// with additional attributes and pass them on to another handler.
+//
+// Any of the Handler's methods may be called concurrently with itself
+// or with other methods. It is the responsibility of the Handler to
+// manage this concurrency.
+//
+// Users of the slog package should not invoke Handler methods directly.
+// They should use the methods of [Logger] instead.
+type Handler interface {
+	// Enabled reports whether the handler handles records at the given level.
+	// The handler ignores records whose level is lower.
+	// It is called early, before any arguments are processed,
+	// to save effort if the log event should be discarded.
+	// If called from a Logger method, the first argument is the context
+	// passed to that method, or context.Background() if nil was passed
+	// or the method does not take a context.
+	// The context is passed so Enabled can use its values
+	// to make a decision.
+	Enabled(context.Context, Level) bool
+
+	// Handle handles the Record.
+	// It will only be called when Enabled returns true.
+	// The Context argument is as for Enabled.
+	// It is present solely to provide Handlers access to the context's values.
+	// Canceling the context should not affect record processing.
+	// (Among other things, log messages may be necessary to debug a
+	// cancellation-related problem.)
+	//
+	// Handle methods that produce output should observe the following rules:
+	//   - If r.Time is the zero time, ignore the time.
+	//   - If r.PC is zero, ignore it.
+	//   - Attr's values should be resolved.
+	//   - If an Attr's key and value are both the zero value, ignore the Attr.
+	//     This can be tested with attr.Equal(Attr{}).
+	//   - If a group's key is empty, inline the group's Attrs.
+	//   - If a group has no Attrs (even if it has a non-empty key),
+	//     ignore it.
+	Handle(context.Context, Record) error
+
+	// WithAttrs returns a new Handler whose attributes consist of
+	// both the receiver's attributes and the arguments.
+	// The Handler owns the slice: it may retain, modify or discard it.
+	WithAttrs(attrs []Attr) Handler
+
+	// WithGroup returns a new Handler with the given group appended to
+	// the receiver's existing groups.
+	// The keys of all subsequent attributes, whether added by With or in a
+	// Record, should be qualified by the sequence of group names.
+	//
+	// How this qualification happens is up to the Handler, so long as
+	// this Handler's attribute keys differ from those of another Handler
+	// with a different sequence of group names.
+	//
+	// A Handler should treat WithGroup as starting a Group of Attrs that ends
+	// at the end of the log event. That is,
+	//
+	//     logger.WithGroup("s").LogAttrs(level, msg, slog.Int("a", 1), slog.Int("b", 2))
+	//
+	// should behave like
+	//
+	//     logger.LogAttrs(level, msg, slog.Group("s", slog.Int("a", 1), slog.Int("b", 2)))
+	//
+	// If the name is empty, WithGroup returns the receiver.
+	WithGroup(name string) Handler
+}
+
+type defaultHandler struct {
+	ch *commonHandler
+	// internal.DefaultOutput, except for testing
+	output func(pc uintptr, data []byte) error
+}
+
+func newDefaultHandler(output func(uintptr, []byte) error) *defaultHandler {
+	return &defaultHandler{
+		ch:     &commonHandler{json: false},
+		output: output,
+	}
+}
+
+func (*defaultHandler) Enabled(_ context.Context, l Level) bool {
+	return l >= LevelInfo
+}
+
+// Collect the level, attributes and message in a string and
+// write it with the default log.Logger.
+// Let the log.Logger handle time and file/line.
+func (h *defaultHandler) Handle(ctx context.Context, r Record) error {
+	buf := buffer.New()
+	buf.WriteString(r.Level.String())
+	buf.WriteByte(' ')
+	buf.WriteString(r.Message)
+	state := h.ch.newHandleState(buf, true, " ")
+	defer state.free()
+	state.appendNonBuiltIns(r)
+	return h.output(r.PC, *buf)
+}
+
+func (h *defaultHandler) WithAttrs(as []Attr) Handler {
+	return &defaultHandler{h.ch.withAttrs(as), h.output}
+}
+
+func (h *defaultHandler) WithGroup(name string) Handler {
+	return &defaultHandler{h.ch.withGroup(name), h.output}
+}
+
+// HandlerOptions are options for a TextHandler or JSONHandler.
+// A zero HandlerOptions consists entirely of default values.
+type HandlerOptions struct {
+	// AddSource causes the handler to compute the source code position
+	// of the log statement and add a SourceKey attribute to the output.
+	AddSource bool
+
+	// Level reports the minimum record level that will be logged.
+	// The handler discards records with lower levels.
+	// If Level is nil, the handler assumes LevelInfo.
+	// The handler calls Level.Level for each record processed;
+	// to adjust the minimum level dynamically, use a LevelVar.
+	Level Leveler
+
+	// ReplaceAttr is called to rewrite each non-group attribute before it is logged.
+	// The attribute's value has been resolved (see [Value.Resolve]).
+	// If ReplaceAttr returns a zero Attr, the attribute is discarded.
+	//
+	// The built-in attributes with keys "time", "level", "source", and "msg"
+	// are passed to this function, except that time is omitted
+	// if zero, and source is omitted if AddSource is false.
+	//
+	// The first argument is a list of currently open groups that contain the
+	// Attr. It must not be retained or modified. ReplaceAttr is never called
+	// for Group attributes, only their contents. For example, the attribute
+	// list
+	//
+	//     Int("a", 1), Group("g", Int("b", 2)), Int("c", 3)
+	//
+	// results in consecutive calls to ReplaceAttr with the following arguments:
+	//
+	//     nil, Int("a", 1)
+	//     []string{"g"}, Int("b", 2)
+	//     nil, Int("c", 3)
+	//
+	// ReplaceAttr can be used to change the default keys of the built-in
+	// attributes, convert types (for example, to replace a `time.Time` with the
+	// integer seconds since the Unix epoch), sanitize personal information, or
+	// remove attributes from the output.
+	ReplaceAttr func(groups []string, a Attr) Attr
+}
+
+// Keys for "built-in" attributes.
+const (
+	// TimeKey is the key used by the built-in handlers for the time
+	// when the log method is called. The associated Value is a [time.Time].
+	TimeKey = "time"
+	// LevelKey is the key used by the built-in handlers for the level
+	// of the log call. The associated value is a [Level].
+	LevelKey = "level"
+	// MessageKey is the key used by the built-in handlers for the
+	// message of the log call. The associated value is a string.
+	MessageKey = "msg"
+	// SourceKey is the key used by the built-in handlers for the source file
+	// and line of the log call. The associated value is a string.
+	SourceKey = "source"
+)
+
+type commonHandler struct {
+	json              bool // true => output JSON; false => output text
+	opts              HandlerOptions
+	preformattedAttrs []byte
+	// groupPrefix is for the text handler only.
+	// It holds the prefix for groups that were already pre-formatted.
+	// A group will appear here when a call to WithGroup is followed by
+	// a call to WithAttrs.
+	groupPrefix string
+	groups      []string // all groups started from WithGroup
+	nOpenGroups int      // the number of groups opened in preformattedAttrs
+	mu          *sync.Mutex
+	w           io.Writer
+}
+
+func (h *commonHandler) clone() *commonHandler {
+	// We can't use assignment because we can't copy the mutex.
+	return &commonHandler{
+		json:              h.json,
+		opts:              h.opts,
+		preformattedAttrs: slices.Clip(h.preformattedAttrs),
+		groupPrefix:       h.groupPrefix,
+		groups:            slices.Clip(h.groups),
+		nOpenGroups:       h.nOpenGroups,
+		w:                 h.w,
+		mu:                h.mu, // mutex shared among all clones of this handler
+	}
+}
+
+// enabled reports whether l is greater than or equal to the
+// minimum level.
+func (h *commonHandler) enabled(l Level) bool {
+	minLevel := LevelInfo
+	if h.opts.Level != nil {
+		minLevel = h.opts.Level.Level()
+	}
+	return l >= minLevel
+}
+
+func (h *commonHandler) withAttrs(as []Attr) *commonHandler {
+	// We are going to ignore empty groups, so if the entire slice consists of
+	// them, there is nothing to do.
+	if countEmptyGroups(as) == len(as) {
+		return h
+	}
+	h2 := h.clone()
+	// Pre-format the attributes as an optimization.
+	state := h2.newHandleState((*buffer.Buffer)(&h2.preformattedAttrs), false, "")
+	defer state.free()
+	state.prefix.WriteString(h.groupPrefix)
+	if len(h2.preformattedAttrs) > 0 {
+		state.sep = h.attrSep()
+	}
+	state.openGroups()
+	for _, a := range as {
+		state.appendAttr(a)
+	}
+	// Remember the new prefix for later keys.
+	h2.groupPrefix = state.prefix.String()
+	// Remember how many opened groups are in preformattedAttrs,
+	// so we don't open them again when we handle a Record.
+	h2.nOpenGroups = len(h2.groups)
+	return h2
+}
+
+func (h *commonHandler) withGroup(name string) *commonHandler {
+	h2 := h.clone()
+	h2.groups = append(h2.groups, name)
+	return h2
+}
+
+// handle is the internal implementation of Handler.Handle
+// used by TextHandler and JSONHandler.
+func (h *commonHandler) handle(r Record) error {
+	state := h.newHandleState(buffer.New(), true, "")
+	defer state.free()
+	if h.json {
+		state.buf.WriteByte('{')
+	}
+	// Built-in attributes. They are not in a group.
+	stateGroups := state.groups
+	state.groups = nil // So ReplaceAttrs sees no groups instead of the pre groups.
+	rep := h.opts.ReplaceAttr
+	// time
+	if !r.Time.IsZero() {
+		key := TimeKey
+		val := r.Time.Round(0) // strip monotonic to match Attr behavior
+		if rep == nil {
+			state.appendKey(key)
+			state.appendTime(val)
+		} else {
+			state.appendAttr(Time(key, val))
+		}
+	}
+	// level
+	key := LevelKey
+	val := r.Level
+	if rep == nil {
+		state.appendKey(key)
+		state.appendString(val.String())
+	} else {
+		state.appendAttr(Any(key, val))
+	}
+	// source
+	if h.opts.AddSource {
+		state.appendAttr(Any(SourceKey, r.source()))
+	}
+	key = MessageKey
+	msg := r.Message
+	if rep == nil {
+		state.appendKey(key)
+		state.appendString(msg)
+	} else {
+		state.appendAttr(String(key, msg))
+	}
+	state.groups = stateGroups // Restore groups passed to ReplaceAttrs.
+	state.appendNonBuiltIns(r)
+	state.buf.WriteByte('\n')
+
+	h.mu.Lock()
+	defer h.mu.Unlock()
+	_, err := h.w.Write(*state.buf)
+	return err
+}
+
+func (s *handleState) appendNonBuiltIns(r Record) {
+	// preformatted Attrs
+	if len(s.h.preformattedAttrs) > 0 {
+		s.buf.WriteString(s.sep)
+		s.buf.Write(s.h.preformattedAttrs)
+		s.sep = s.h.attrSep()
+	}
+	// Attrs in Record -- unlike the built-in ones, they are in groups started
+	// from WithGroup.
+	// If the record has no Attrs, don't output any groups.
+	nOpenGroups := s.h.nOpenGroups
+	if r.NumAttrs() > 0 {
+		s.prefix.WriteString(s.h.groupPrefix)
+		s.openGroups()
+		nOpenGroups = len(s.h.groups)
+		r.Attrs(func(a Attr) bool {
+			s.appendAttr(a)
+			return true
+		})
+	}
+	if s.h.json {
+		// Close all open groups.
+		for range s.h.groups[:nOpenGroups] {
+			s.buf.WriteByte('}')
+		}
+		// Close the top-level object.
+		s.buf.WriteByte('}')
+	}
+}
+
+// attrSep returns the separator between attributes.
+func (h *commonHandler) attrSep() string {
+	if h.json {
+		return ","
+	}
+	return " "
+}
+
+// handleState holds state for a single call to commonHandler.handle.
+// The initial value of sep determines whether to emit a separator
+// before the next key, after which it stays true.
+type handleState struct {
+	h       *commonHandler
+	buf     *buffer.Buffer
+	freeBuf bool           // should buf be freed?
+	sep     string         // separator to write before next key
+	prefix  *buffer.Buffer // for text: key prefix
+	groups  *[]string      // pool-allocated slice of active groups, for ReplaceAttr
+}
+
+var groupPool = sync.Pool{New: func() any {
+	s := make([]string, 0, 10)
+	return &s
+}}
+
+func (h *commonHandler) newHandleState(buf *buffer.Buffer, freeBuf bool, sep string) handleState {
+	s := handleState{
+		h:       h,
+		buf:     buf,
+		freeBuf: freeBuf,
+		sep:     sep,
+		prefix:  buffer.New(),
+	}
+	if h.opts.ReplaceAttr != nil {
+		s.groups = groupPool.Get().(*[]string)
+		*s.groups = append(*s.groups, h.groups[:h.nOpenGroups]...)
+	}
+	return s
+}
+
+func (s *handleState) free() {
+	if s.freeBuf {
+		s.buf.Free()
+	}
+	if gs := s.groups; gs != nil {
+		*gs = (*gs)[:0]
+		groupPool.Put(gs)
+	}
+	s.prefix.Free()
+}
+
+func (s *handleState) openGroups() {
+	for _, n := range s.h.groups[s.h.nOpenGroups:] {
+		s.openGroup(n)
+	}
+}
+
+// Separator for group names and keys.
+const keyComponentSep = '.'
+
+// openGroup starts a new group of attributes
+// with the given name.
+func (s *handleState) openGroup(name string) {
+	if s.h.json {
+		s.appendKey(name)
+		s.buf.WriteByte('{')
+		s.sep = ""
+	} else {
+		s.prefix.WriteString(name)
+		s.prefix.WriteByte(keyComponentSep)
+	}
+	// Collect group names for ReplaceAttr.
+	if s.groups != nil {
+		*s.groups = append(*s.groups, name)
+	}
+}
+
+// closeGroup ends the group with the given name.
+func (s *handleState) closeGroup(name string) {
+	if s.h.json {
+		s.buf.WriteByte('}')
+	} else {
+		(*s.prefix) = (*s.prefix)[:len(*s.prefix)-len(name)-1 /* for keyComponentSep */]
+	}
+	s.sep = s.h.attrSep()
+	if s.groups != nil {
+		*s.groups = (*s.groups)[:len(*s.groups)-1]
+	}
+}
+
+// appendAttr appends the Attr's key and value using app.
+// It handles replacement and checking for an empty key.
+// after replacement).
+func (s *handleState) appendAttr(a Attr) {
+	if rep := s.h.opts.ReplaceAttr; rep != nil && a.Value.Kind() != KindGroup {
+		var gs []string
+		if s.groups != nil {
+			gs = *s.groups
+		}
+		// Resolve before calling ReplaceAttr, so the user doesn't have to.
+		a.Value = a.Value.Resolve()
+		a = rep(gs, a)
+	}
+	a.Value = a.Value.Resolve()
+	// Elide empty Attrs.
+	if a.isEmpty() {
+		return
+	}
+	// Special case: Source.
+	if v := a.Value; v.Kind() == KindAny {
+		if src, ok := v.Any().(*Source); ok {
+			if s.h.json {
+				a.Value = src.group()
+			} else {
+				a.Value = StringValue(fmt.Sprintf("%s:%d", src.File, src.Line))
+			}
+		}
+	}
+	if a.Value.Kind() == KindGroup {
+		attrs := a.Value.Group()
+		// Output only non-empty groups.
+		if len(attrs) > 0 {
+			// Inline a group with an empty key.
+			if a.Key != "" {
+				s.openGroup(a.Key)
+			}
+			for _, aa := range attrs {
+				s.appendAttr(aa)
+			}
+			if a.Key != "" {
+				s.closeGroup(a.Key)
+			}
+		}
+	} else {
+		s.appendKey(a.Key)
+		s.appendValue(a.Value)
+	}
+}
+
+func (s *handleState) appendError(err error) {
+	s.appendString(fmt.Sprintf("!ERROR:%v", err))
+}
+
+func (s *handleState) appendKey(key string) {
+	s.buf.WriteString(s.sep)
+	if s.prefix != nil && len(*s.prefix) > 0 {
+		// TODO: optimize by avoiding allocation.
+		s.appendString(string(*s.prefix) + key)
+	} else {
+		s.appendString(key)
+	}
+	if s.h.json {
+		s.buf.WriteByte(':')
+	} else {
+		s.buf.WriteByte('=')
+	}
+	s.sep = s.h.attrSep()
+}
+
+func (s *handleState) appendString(str string) {
+	if s.h.json {
+		s.buf.WriteByte('"')
+		*s.buf = appendEscapedJSONString(*s.buf, str)
+		s.buf.WriteByte('"')
+	} else {
+		// text
+		if needsQuoting(str) {
+			*s.buf = strconv.AppendQuote(*s.buf, str)
+		} else {
+			s.buf.WriteString(str)
+		}
+	}
+}
+
+func (s *handleState) appendValue(v Value) {
+	var err error
+	if s.h.json {
+		err = appendJSONValue(s, v)
+	} else {
+		err = appendTextValue(s, v)
+	}
+	if err != nil {
+		s.appendError(err)
+	}
+}
+
+func (s *handleState) appendTime(t time.Time) {
+	if s.h.json {
+		appendJSONTime(s, t)
+	} else {
+		writeTimeRFC3339Millis(s.buf, t)
+	}
+}
+
+// This takes half the time of Time.AppendFormat.
+func writeTimeRFC3339Millis(buf *buffer.Buffer, t time.Time) {
+	year, month, day := t.Date()
+	buf.WritePosIntWidth(year, 4)
+	buf.WriteByte('-')
+	buf.WritePosIntWidth(int(month), 2)
+	buf.WriteByte('-')
+	buf.WritePosIntWidth(day, 2)
+	buf.WriteByte('T')
+	hour, min, sec := t.Clock()
+	buf.WritePosIntWidth(hour, 2)
+	buf.WriteByte(':')
+	buf.WritePosIntWidth(min, 2)
+	buf.WriteByte(':')
+	buf.WritePosIntWidth(sec, 2)
+	ns := t.Nanosecond()
+	buf.WriteByte('.')
+	buf.WritePosIntWidth(ns/1e6, 3)
+	_, offsetSeconds := t.Zone()
+	if offsetSeconds == 0 {
+		buf.WriteByte('Z')
+	} else {
+		offsetMinutes := offsetSeconds / 60
+		if offsetMinutes < 0 {
+			buf.WriteByte('-')
+			offsetMinutes = -offsetMinutes
+		} else {
+			buf.WriteByte('+')
+		}
+		buf.WritePosIntWidth(offsetMinutes/60, 2)
+		buf.WriteByte(':')
+		buf.WritePosIntWidth(offsetMinutes%60, 2)
+	}
+}
diff --git a/src/log/slog/handler_test.go b/src/log/slog/handler_test.go
new file mode 100644
index 0000000..4f10ee5
--- /dev/null
+++ b/src/log/slog/handler_test.go
@@ -0,0 +1,626 @@
+// Copyright 2022 The Go 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: verify that the output of Marshal{Text,JSON} is suitably escaped.
+
+package slog
+
+import (
+	"bytes"
+	"context"
+	"encoding/json"
+	"io"
+	"log/slog/internal/buffer"
+	"path/filepath"
+	"slices"
+	"strconv"
+	"strings"
+	"sync"
+	"testing"
+	"time"
+)
+
+func TestDefaultHandle(t *testing.T) {
+	ctx := context.Background()
+	preAttrs := []Attr{Int("pre", 0)}
+	attrs := []Attr{Int("a", 1), String("b", "two")}
+	for _, test := range []struct {
+		name  string
+		with  func(Handler) Handler
+		attrs []Attr
+		want  string
+	}{
+		{
+			name: "no attrs",
+			want: "INFO message",
+		},
+		{
+			name:  "attrs",
+			attrs: attrs,
+			want:  "INFO message a=1 b=two",
+		},
+		{
+			name:  "preformatted",
+			with:  func(h Handler) Handler { return h.WithAttrs(preAttrs) },
+			attrs: attrs,
+			want:  "INFO message pre=0 a=1 b=two",
+		},
+		{
+			name: "groups",
+			attrs: []Attr{
+				Int("a", 1),
+				Group("g",
+					Int("b", 2),
+					Group("h", Int("c", 3)),
+					Int("d", 4)),
+				Int("e", 5),
+			},
+			want: "INFO message a=1 g.b=2 g.h.c=3 g.d=4 e=5",
+		},
+		{
+			name:  "group",
+			with:  func(h Handler) Handler { return h.WithAttrs(preAttrs).WithGroup("s") },
+			attrs: attrs,
+			want:  "INFO message pre=0 s.a=1 s.b=two",
+		},
+		{
+			name: "preformatted groups",
+			with: func(h Handler) Handler {
+				return h.WithAttrs([]Attr{Int("p1", 1)}).
+					WithGroup("s1").
+					WithAttrs([]Attr{Int("p2", 2)}).
+					WithGroup("s2")
+			},
+			attrs: attrs,
+			want:  "INFO message p1=1 s1.p2=2 s1.s2.a=1 s1.s2.b=two",
+		},
+		{
+			name: "two with-groups",
+			with: func(h Handler) Handler {
+				return h.WithAttrs([]Attr{Int("p1", 1)}).
+					WithGroup("s1").
+					WithGroup("s2")
+			},
+			attrs: attrs,
+			want:  "INFO message p1=1 s1.s2.a=1 s1.s2.b=two",
+		},
+	} {
+		t.Run(test.name, func(t *testing.T) {
+			var got string
+			var h Handler = newDefaultHandler(func(_ uintptr, b []byte) error {
+				got = string(b)
+				return nil
+			})
+			if test.with != nil {
+				h = test.with(h)
+			}
+			r := NewRecord(time.Time{}, LevelInfo, "message", 0)
+			r.AddAttrs(test.attrs...)
+			if err := h.Handle(ctx, r); err != nil {
+				t.Fatal(err)
+			}
+			if got != test.want {
+				t.Errorf("\ngot  %s\nwant %s", got, test.want)
+			}
+		})
+	}
+}
+
+func TestConcurrentWrites(t *testing.T) {
+	ctx := context.Background()
+	count := 1000
+	for _, handlerType := range []string{"text", "json"} {
+		t.Run(handlerType, func(t *testing.T) {
+			var buf bytes.Buffer
+			var h Handler
+			switch handlerType {
+			case "text":
+				h = NewTextHandler(&buf, nil)
+			case "json":
+				h = NewJSONHandler(&buf, nil)
+			default:
+				t.Fatalf("unexpected handlerType %q", handlerType)
+			}
+			sub1 := h.WithAttrs([]Attr{Bool("sub1", true)})
+			sub2 := h.WithAttrs([]Attr{Bool("sub2", true)})
+			var wg sync.WaitGroup
+			for i := 0; i < count; i++ {
+				sub1Record := NewRecord(time.Time{}, LevelInfo, "hello from sub1", 0)
+				sub1Record.AddAttrs(Int("i", i))
+				sub2Record := NewRecord(time.Time{}, LevelInfo, "hello from sub2", 0)
+				sub2Record.AddAttrs(Int("i", i))
+				wg.Add(1)
+				go func() {
+					defer wg.Done()
+					if err := sub1.Handle(ctx, sub1Record); err != nil {
+						t.Error(err)
+					}
+					if err := sub2.Handle(ctx, sub2Record); err != nil {
+						t.Error(err)
+					}
+				}()
+			}
+			wg.Wait()
+			for i := 1; i <= 2; i++ {
+				want := "hello from sub" + strconv.Itoa(i)
+				n := strings.Count(buf.String(), want)
+				if n != count {
+					t.Fatalf("want %d occurrences of %q, got %d", count, want, n)
+				}
+			}
+		})
+	}
+}
+
+// Verify the common parts of TextHandler and JSONHandler.
+func TestJSONAndTextHandlers(t *testing.T) {
+	// remove all Attrs
+	removeAll := func(_ []string, a Attr) Attr { return Attr{} }
+
+	attrs := []Attr{String("a", "one"), Int("b", 2), Any("", nil)}
+	preAttrs := []Attr{Int("pre", 3), String("x", "y")}
+
+	for _, test := range []struct {
+		name      string
+		replace   func([]string, Attr) Attr
+		addSource bool
+		with      func(Handler) Handler
+		preAttrs  []Attr
+		attrs     []Attr
+		wantText  string
+		wantJSON  string
+	}{
+		{
+			name:     "basic",
+			attrs:    attrs,
+			wantText: "time=2000-01-02T03:04:05.000Z level=INFO msg=message a=one b=2",
+			wantJSON: `{"time":"2000-01-02T03:04:05Z","level":"INFO","msg":"message","a":"one","b":2}`,
+		},
+		{
+			name:     "empty key",
+			attrs:    append(slices.Clip(attrs), Any("", "v")),
+			wantText: `time=2000-01-02T03:04:05.000Z level=INFO msg=message a=one b=2 ""=v`,
+			wantJSON: `{"time":"2000-01-02T03:04:05Z","level":"INFO","msg":"message","a":"one","b":2,"":"v"}`,
+		},
+		{
+			name:     "cap keys",
+			replace:  upperCaseKey,
+			attrs:    attrs,
+			wantText: "TIME=2000-01-02T03:04:05.000Z LEVEL=INFO MSG=message A=one B=2",
+			wantJSON: `{"TIME":"2000-01-02T03:04:05Z","LEVEL":"INFO","MSG":"message","A":"one","B":2}`,
+		},
+		{
+			name:     "remove all",
+			replace:  removeAll,
+			attrs:    attrs,
+			wantText: "",
+			wantJSON: `{}`,
+		},
+		{
+			name:     "preformatted",
+			with:     func(h Handler) Handler { return h.WithAttrs(preAttrs) },
+			preAttrs: preAttrs,
+			attrs:    attrs,
+			wantText: "time=2000-01-02T03:04:05.000Z level=INFO msg=message pre=3 x=y a=one b=2",
+			wantJSON: `{"time":"2000-01-02T03:04:05Z","level":"INFO","msg":"message","pre":3,"x":"y","a":"one","b":2}`,
+		},
+		{
+			name:     "preformatted cap keys",
+			replace:  upperCaseKey,
+			with:     func(h Handler) Handler { return h.WithAttrs(preAttrs) },
+			preAttrs: preAttrs,
+			attrs:    attrs,
+			wantText: "TIME=2000-01-02T03:04:05.000Z LEVEL=INFO MSG=message PRE=3 X=y A=one B=2",
+			wantJSON: `{"TIME":"2000-01-02T03:04:05Z","LEVEL":"INFO","MSG":"message","PRE":3,"X":"y","A":"one","B":2}`,
+		},
+		{
+			name:     "preformatted remove all",
+			replace:  removeAll,
+			with:     func(h Handler) Handler { return h.WithAttrs(preAttrs) },
+			preAttrs: preAttrs,
+			attrs:    attrs,
+			wantText: "",
+			wantJSON: "{}",
+		},
+		{
+			name:     "remove built-in",
+			replace:  removeKeys(TimeKey, LevelKey, MessageKey),
+			attrs:    attrs,
+			wantText: "a=one b=2",
+			wantJSON: `{"a":"one","b":2}`,
+		},
+		{
+			name:     "preformatted remove built-in",
+			replace:  removeKeys(TimeKey, LevelKey, MessageKey),
+			with:     func(h Handler) Handler { return h.WithAttrs(preAttrs) },
+			attrs:    attrs,
+			wantText: "pre=3 x=y a=one b=2",
+			wantJSON: `{"pre":3,"x":"y","a":"one","b":2}`,
+		},
+		{
+			name:    "groups",
+			replace: removeKeys(TimeKey, LevelKey), // to simplify the result
+			attrs: []Attr{
+				Int("a", 1),
+				Group("g",
+					Int("b", 2),
+					Group("h", Int("c", 3)),
+					Int("d", 4)),
+				Int("e", 5),
+			},
+			wantText: "msg=message a=1 g.b=2 g.h.c=3 g.d=4 e=5",
+			wantJSON: `{"msg":"message","a":1,"g":{"b":2,"h":{"c":3},"d":4},"e":5}`,
+		},
+		{
+			name:     "empty group",
+			replace:  removeKeys(TimeKey, LevelKey),
+			attrs:    []Attr{Group("g"), Group("h", Int("a", 1))},
+			wantText: "msg=message h.a=1",
+			wantJSON: `{"msg":"message","h":{"a":1}}`,
+		},
+		{
+			name:    "nested empty group",
+			replace: removeKeys(TimeKey, LevelKey),
+			attrs: []Attr{
+				Group("g",
+					Group("h",
+						Group("i"), Group("j"))),
+			},
+			wantText: `msg=message`,
+			wantJSON: `{"msg":"message"}`,
+		},
+		{
+			name:    "nested non-empty group",
+			replace: removeKeys(TimeKey, LevelKey),
+			attrs: []Attr{
+				Group("g",
+					Group("h",
+						Group("i"), Group("j", Int("a", 1)))),
+			},
+			wantText: `msg=message g.h.j.a=1`,
+			wantJSON: `{"msg":"message","g":{"h":{"j":{"a":1}}}}`,
+		},
+		{
+			name:    "escapes",
+			replace: removeKeys(TimeKey, LevelKey),
+			attrs: []Attr{
+				String("a b", "x\t\n\000y"),
+				Group(" b.c=\"\\x2E\t",
+					String("d=e", "f.g\""),
+					Int("m.d", 1)), // dot is not escaped
+			},
+			wantText: `msg=message "a b"="x\t\n\x00y" " b.c=\"\\x2E\t.d=e"="f.g\"" " b.c=\"\\x2E\t.m.d"=1`,
+			wantJSON: `{"msg":"message","a b":"x\t\n\u0000y"," b.c=\"\\x2E\t":{"d=e":"f.g\"","m.d":1}}`,
+		},
+		{
+			name:    "LogValuer",
+			replace: removeKeys(TimeKey, LevelKey),
+			attrs: []Attr{
+				Int("a", 1),
+				Any("name", logValueName{"Ren", "Hoek"}),
+				Int("b", 2),
+			},
+			wantText: "msg=message a=1 name.first=Ren name.last=Hoek b=2",
+			wantJSON: `{"msg":"message","a":1,"name":{"first":"Ren","last":"Hoek"},"b":2}`,
+		},
+		{
+			// Test resolution when there is no ReplaceAttr function.
+			name: "resolve",
+			attrs: []Attr{
+				Any("", &replace{Value{}}), // should be elided
+				Any("name", logValueName{"Ren", "Hoek"}),
+			},
+			wantText: "time=2000-01-02T03:04:05.000Z level=INFO msg=message name.first=Ren name.last=Hoek",
+			wantJSON: `{"time":"2000-01-02T03:04:05Z","level":"INFO","msg":"message","name":{"first":"Ren","last":"Hoek"}}`,
+		},
+		{
+			name:     "with-group",
+			replace:  removeKeys(TimeKey, LevelKey),
+			with:     func(h Handler) Handler { return h.WithAttrs(preAttrs).WithGroup("s") },
+			attrs:    attrs,
+			wantText: "msg=message pre=3 x=y s.a=one s.b=2",
+			wantJSON: `{"msg":"message","pre":3,"x":"y","s":{"a":"one","b":2}}`,
+		},
+		{
+			name:    "preformatted with-groups",
+			replace: removeKeys(TimeKey, LevelKey),
+			with: func(h Handler) Handler {
+				return h.WithAttrs([]Attr{Int("p1", 1)}).
+					WithGroup("s1").
+					WithAttrs([]Attr{Int("p2", 2)}).
+					WithGroup("s2").
+					WithAttrs([]Attr{Int("p3", 3)})
+			},
+			attrs:    attrs,
+			wantText: "msg=message p1=1 s1.p2=2 s1.s2.p3=3 s1.s2.a=one s1.s2.b=2",
+			wantJSON: `{"msg":"message","p1":1,"s1":{"p2":2,"s2":{"p3":3,"a":"one","b":2}}}`,
+		},
+		{
+			name:    "two with-groups",
+			replace: removeKeys(TimeKey, LevelKey),
+			with: func(h Handler) Handler {
+				return h.WithAttrs([]Attr{Int("p1", 1)}).
+					WithGroup("s1").
+					WithGroup("s2")
+			},
+			attrs:    attrs,
+			wantText: "msg=message p1=1 s1.s2.a=one s1.s2.b=2",
+			wantJSON: `{"msg":"message","p1":1,"s1":{"s2":{"a":"one","b":2}}}`,
+		},
+		{
+			name:    "empty with-groups",
+			replace: removeKeys(TimeKey, LevelKey),
+			with: func(h Handler) Handler {
+				return h.WithGroup("x").WithGroup("y")
+			},
+			wantText: "msg=message",
+			wantJSON: `{"msg":"message"}`,
+		},
+		{
+			name:    "empty with-groups, no non-empty attrs",
+			replace: removeKeys(TimeKey, LevelKey),
+			with: func(h Handler) Handler {
+				return h.WithGroup("x").WithAttrs([]Attr{Group("g")}).WithGroup("y")
+			},
+			wantText: "msg=message",
+			wantJSON: `{"msg":"message"}`,
+		},
+		{
+			name:    "one empty with-group",
+			replace: removeKeys(TimeKey, LevelKey),
+			with: func(h Handler) Handler {
+				return h.WithGroup("x").WithAttrs([]Attr{Int("a", 1)}).WithGroup("y")
+			},
+			attrs:    []Attr{Group("g", Group("h"))},
+			wantText: "msg=message x.a=1",
+			wantJSON: `{"msg":"message","x":{"a":1}}`,
+		},
+		{
+			name:     "GroupValue as Attr value",
+			replace:  removeKeys(TimeKey, LevelKey),
+			attrs:    []Attr{{"v", AnyValue(IntValue(3))}},
+			wantText: "msg=message v=3",
+			wantJSON: `{"msg":"message","v":3}`,
+		},
+		{
+			name:     "byte slice",
+			replace:  removeKeys(TimeKey, LevelKey),
+			attrs:    []Attr{Any("bs", []byte{1, 2, 3, 4})},
+			wantText: `msg=message bs="\x01\x02\x03\x04"`,
+			wantJSON: `{"msg":"message","bs":"AQIDBA=="}`,
+		},
+		{
+			name:     "json.RawMessage",
+			replace:  removeKeys(TimeKey, LevelKey),
+			attrs:    []Attr{Any("bs", json.RawMessage([]byte("1234")))},
+			wantText: `msg=message bs="1234"`,
+			wantJSON: `{"msg":"message","bs":1234}`,
+		},
+		{
+			name:    "inline group",
+			replace: removeKeys(TimeKey, LevelKey),
+			attrs: []Attr{
+				Int("a", 1),
+				Group("", Int("b", 2), Int("c", 3)),
+				Int("d", 4),
+			},
+			wantText: `msg=message a=1 b=2 c=3 d=4`,
+			wantJSON: `{"msg":"message","a":1,"b":2,"c":3,"d":4}`,
+		},
+		{
+			name: "Source",
+			replace: func(gs []string, a Attr) Attr {
+				if a.Key == SourceKey {
+					s := a.Value.Any().(*Source)
+					s.File = filepath.Base(s.File)
+					return Any(a.Key, s)
+				}
+				return removeKeys(TimeKey, LevelKey)(gs, a)
+			},
+			addSource: true,
+			wantText:  `source=handler_test.go:$LINE msg=message`,
+			wantJSON:  `{"source":{"function":"log/slog.TestJSONAndTextHandlers","file":"handler_test.go","line":$LINE},"msg":"message"}`,
+		},
+		{
+			name: "replace built-in with group",
+			replace: func(_ []string, a Attr) Attr {
+				if a.Key == TimeKey {
+					return Group(TimeKey, "mins", 3, "secs", 2)
+				}
+				if a.Key == LevelKey {
+					return Attr{}
+				}
+				return a
+			},
+			wantText: `time.mins=3 time.secs=2 msg=message`,
+			wantJSON: `{"time":{"mins":3,"secs":2},"msg":"message"}`,
+		},
+	} {
+		r := NewRecord(testTime, LevelInfo, "message", callerPC(2))
+		line := strconv.Itoa(r.source().Line)
+		r.AddAttrs(test.attrs...)
+		var buf bytes.Buffer
+		opts := HandlerOptions{ReplaceAttr: test.replace, AddSource: test.addSource}
+		t.Run(test.name, func(t *testing.T) {
+			for _, handler := range []struct {
+				name string
+				h    Handler
+				want string
+			}{
+				{"text", NewTextHandler(&buf, &opts), test.wantText},
+				{"json", NewJSONHandler(&buf, &opts), test.wantJSON},
+			} {
+				t.Run(handler.name, func(t *testing.T) {
+					h := handler.h
+					if test.with != nil {
+						h = test.with(h)
+					}
+					buf.Reset()
+					if err := h.Handle(nil, r); err != nil {
+						t.Fatal(err)
+					}
+					want := strings.ReplaceAll(handler.want, "$LINE", line)
+					got := strings.TrimSuffix(buf.String(), "\n")
+					if got != want {
+						t.Errorf("\ngot  %s\nwant %s\n", got, want)
+					}
+				})
+			}
+		})
+	}
+}
+
+// removeKeys returns a function suitable for HandlerOptions.ReplaceAttr
+// that removes all Attrs with the given keys.
+func removeKeys(keys ...string) func([]string, Attr) Attr {
+	return func(_ []string, a Attr) Attr {
+		for _, k := range keys {
+			if a.Key == k {
+				return Attr{}
+			}
+		}
+		return a
+	}
+}
+
+func upperCaseKey(_ []string, a Attr) Attr {
+	a.Key = strings.ToUpper(a.Key)
+	return a
+}
+
+type logValueName struct {
+	first, last string
+}
+
+func (n logValueName) LogValue() Value {
+	return GroupValue(
+		String("first", n.first),
+		String("last", n.last))
+}
+
+func TestHandlerEnabled(t *testing.T) {
+	levelVar := func(l Level) *LevelVar {
+		var al LevelVar
+		al.Set(l)
+		return &al
+	}
+
+	for _, test := range []struct {
+		leveler Leveler
+		want    bool
+	}{
+		{nil, true},
+		{LevelWarn, false},
+		{&LevelVar{}, true}, // defaults to Info
+		{levelVar(LevelWarn), false},
+		{LevelDebug, true},
+		{levelVar(LevelDebug), true},
+	} {
+		h := &commonHandler{opts: HandlerOptions{Level: test.leveler}}
+		got := h.enabled(LevelInfo)
+		if got != test.want {
+			t.Errorf("%v: got %t, want %t", test.leveler, got, test.want)
+		}
+	}
+}
+
+func TestSecondWith(t *testing.T) {
+	// Verify that a second call to Logger.With does not corrupt
+	// the original.
+	var buf bytes.Buffer
+	h := NewTextHandler(&buf, &HandlerOptions{ReplaceAttr: removeKeys(TimeKey)})
+	logger := New(h).With(
+		String("app", "playground"),
+		String("role", "tester"),
+		Int("data_version", 2),
+	)
+	appLogger := logger.With("type", "log") // this becomes type=met
+	_ = logger.With("type", "metric")
+	appLogger.Info("foo")
+	got := strings.TrimSpace(buf.String())
+	want := `level=INFO msg=foo app=playground role=tester data_version=2 type=log`
+	if got != want {
+		t.Errorf("\ngot  %s\nwant %s", got, want)
+	}
+}
+
+func TestReplaceAttrGroups(t *testing.T) {
+	// Verify that ReplaceAttr is called with the correct groups.
+	type ga struct {
+		groups string
+		key    string
+		val    string
+	}
+
+	var got []ga
+
+	h := NewTextHandler(io.Discard, &HandlerOptions{ReplaceAttr: func(gs []string, a Attr) Attr {
+		v := a.Value.String()
+		if a.Key == TimeKey {
+			v = "<now>"
+		}
+		got = append(got, ga{strings.Join(gs, ","), a.Key, v})
+		return a
+	}})
+	New(h).
+		With(Int("a", 1)).
+		WithGroup("g1").
+		With(Int("b", 2)).
+		WithGroup("g2").
+		With(
+			Int("c", 3),
+			Group("g3", Int("d", 4)),
+			Int("e", 5)).
+		Info("m",
+			Int("f", 6),
+			Group("g4", Int("h", 7)),
+			Int("i", 8))
+
+	want := []ga{
+		{"", "a", "1"},
+		{"g1", "b", "2"},
+		{"g1,g2", "c", "3"},
+		{"g1,g2,g3", "d", "4"},
+		{"g1,g2", "e", "5"},
+		{"", "time", "<now>"},
+		{"", "level", "INFO"},
+		{"", "msg", "m"},
+		{"g1,g2", "f", "6"},
+		{"g1,g2,g4", "h", "7"},
+		{"g1,g2", "i", "8"},
+	}
+	if !slices.Equal(got, want) {
+		t.Errorf("\ngot  %v\nwant %v", got, want)
+	}
+}
+
+const rfc3339Millis = "2006-01-02T15:04:05.000Z07:00"
+
+func TestWriteTimeRFC3339(t *testing.T) {
+	for _, tm := range []time.Time{
+		time.Date(2000, 1, 2, 3, 4, 5, 0, time.UTC),
+		time.Date(2000, 1, 2, 3, 4, 5, 400, time.Local),
+		time.Date(2000, 11, 12, 3, 4, 500, 5e7, time.UTC),
+	} {
+		want := tm.Format(rfc3339Millis)
+		buf := buffer.New()
+		defer buf.Free()
+		writeTimeRFC3339Millis(buf, tm)
+		got := buf.String()
+		if got != want {
+			t.Errorf("got %s, want %s", got, want)
+		}
+	}
+}
+
+func BenchmarkWriteTime(b *testing.B) {
+	buf := buffer.New()
+	defer buf.Free()
+	tm := time.Date(2022, 3, 4, 5, 6, 7, 823456789, time.Local)
+	b.ResetTimer()
+	for i := 0; i < b.N; i++ {
+		writeTimeRFC3339Millis(buf, tm)
+		buf.Reset()
+	}
+}
diff --git a/src/log/slog/internal/benchmarks/benchmarks.go b/src/log/slog/internal/benchmarks/benchmarks.go
new file mode 100644
index 0000000..3a28523
--- /dev/null
+++ b/src/log/slog/internal/benchmarks/benchmarks.go
@@ -0,0 +1,50 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package benchmarks contains benchmarks for slog.
+//
+// These benchmarks are loosely based on github.com/uber-go/zap/benchmarks.
+// They have the following desirable properties:
+//
+//   - They test a complete log event, from the user's call to its return.
+//
+//   - The benchmarked code is run concurrently in multiple goroutines, to
+//     better simulate a real server (the most common environment for structured
+//     logs).
+//
+//   - Some handlers are optimistic versions of real handlers, doing real-world
+//     tasks as fast as possible (and sometimes faster, in that an
+//     implementation may not be concurrency-safe). This gives us an upper bound
+//     on handler performance, so we can evaluate the (handler-independent) core
+//     activity of the package in an end-to-end context without concern that a
+//     slow handler implementation is skewing the results.
+//
+//   - We also test the built-in handlers, for comparison.
+package benchmarks
+
+import (
+	"errors"
+	"log/slog"
+	"time"
+)
+
+const testMessage = "Test logging, but use a somewhat realistic message length."
+
+var (
+	testTime     = time.Date(2022, time.May, 1, 0, 0, 0, 0, time.UTC)
+	testString   = "7e3b3b2aaeff56a7108fe11e154200dd/7819479873059528190"
+	testInt      = 32768
+	testDuration = 23 * time.Second
+	testError    = errors.New("fail")
+)
+
+var testAttrs = []slog.Attr{
+	slog.String("string", testString),
+	slog.Int("status", testInt),
+	slog.Duration("duration", testDuration),
+	slog.Time("time", testTime),
+	slog.Any("error", testError),
+}
+
+const wantText = "time=1651363200 level=0 msg=Test logging, but use a somewhat realistic message length. string=7e3b3b2aaeff56a7108fe11e154200dd/7819479873059528190 status=32768 duration=23000000000 time=1651363200 error=fail\n"
diff --git a/src/log/slog/internal/benchmarks/benchmarks_test.go b/src/log/slog/internal/benchmarks/benchmarks_test.go
new file mode 100644
index 0000000..18643b7
--- /dev/null
+++ b/src/log/slog/internal/benchmarks/benchmarks_test.go
@@ -0,0 +1,152 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package benchmarks
+
+import (
+	"context"
+	"flag"
+	"internal/race"
+	"io"
+	"log/slog"
+	"log/slog/internal"
+	"testing"
+)
+
+func init() {
+	flag.BoolVar(&internal.IgnorePC, "nopc", false, "do not invoke runtime.Callers")
+}
+
+// We pass Attrs inline because it affects allocations: building
+// up a list outside of the benchmarked code and passing it in with "..."
+// reduces measured allocations.
+
+func BenchmarkAttrs(b *testing.B) {
+	ctx := context.Background()
+	for _, handler := range []struct {
+		name     string
+		h        slog.Handler
+		skipRace bool
+	}{
+		{"disabled", disabledHandler{}, false},
+		{"async discard", newAsyncHandler(), true},
+		{"fastText discard", newFastTextHandler(io.Discard), false},
+		{"Text discard", slog.NewTextHandler(io.Discard, nil), false},
+		{"JSON discard", slog.NewJSONHandler(io.Discard, nil), false},
+	} {
+		logger := slog.New(handler.h)
+		b.Run(handler.name, func(b *testing.B) {
+			if handler.skipRace && race.Enabled {
+				b.Skip("skipping benchmark in race mode")
+			}
+			for _, call := range []struct {
+				name string
+				f    func()
+			}{
+				{
+					// The number should match nAttrsInline in slog/record.go.
+					// This should exercise the code path where no allocations
+					// happen in Record or Attr. If there are allocations, they
+					// should only be from Duration.String and Time.String.
+					"5 args",
+					func() {
+						logger.LogAttrs(nil, slog.LevelInfo, testMessage,
+							slog.String("string", testString),
+							slog.Int("status", testInt),
+							slog.Duration("duration", testDuration),
+							slog.Time("time", testTime),
+							slog.Any("error", testError),
+						)
+					},
+				},
+				{
+					"5 args ctx",
+					func() {
+						logger.LogAttrs(ctx, slog.LevelInfo, testMessage,
+							slog.String("string", testString),
+							slog.Int("status", testInt),
+							slog.Duration("duration", testDuration),
+							slog.Time("time", testTime),
+							slog.Any("error", testError),
+						)
+					},
+				},
+				{
+					"10 args",
+					func() {
+						logger.LogAttrs(nil, slog.LevelInfo, testMessage,
+							slog.String("string", testString),
+							slog.Int("status", testInt),
+							slog.Duration("duration", testDuration),
+							slog.Time("time", testTime),
+							slog.Any("error", testError),
+							slog.String("string", testString),
+							slog.Int("status", testInt),
+							slog.Duration("duration", testDuration),
+							slog.Time("time", testTime),
+							slog.Any("error", testError),
+						)
+					},
+				},
+				{
+					// Try an extreme value to see if the results are reasonable.
+					"40 args",
+					func() {
+						logger.LogAttrs(nil, slog.LevelInfo, testMessage,
+							slog.String("string", testString),
+							slog.Int("status", testInt),
+							slog.Duration("duration", testDuration),
+							slog.Time("time", testTime),
+							slog.Any("error", testError),
+							slog.String("string", testString),
+							slog.Int("status", testInt),
+							slog.Duration("duration", testDuration),
+							slog.Time("time", testTime),
+							slog.Any("error", testError),
+							slog.String("string", testString),
+							slog.Int("status", testInt),
+							slog.Duration("duration", testDuration),
+							slog.Time("time", testTime),
+							slog.Any("error", testError),
+							slog.String("string", testString),
+							slog.Int("status", testInt),
+							slog.Duration("duration", testDuration),
+							slog.Time("time", testTime),
+							slog.Any("error", testError),
+							slog.String("string", testString),
+							slog.Int("status", testInt),
+							slog.Duration("duration", testDuration),
+							slog.Time("time", testTime),
+							slog.Any("error", testError),
+							slog.String("string", testString),
+							slog.Int("status", testInt),
+							slog.Duration("duration", testDuration),
+							slog.Time("time", testTime),
+							slog.Any("error", testError),
+							slog.String("string", testString),
+							slog.Int("status", testInt),
+							slog.Duration("duration", testDuration),
+							slog.Time("time", testTime),
+							slog.Any("error", testError),
+							slog.String("string", testString),
+							slog.Int("status", testInt),
+							slog.Duration("duration", testDuration),
+							slog.Time("time", testTime),
+							slog.Any("error", testError),
+						)
+					},
+				},
+			} {
+				b.Run(call.name, func(b *testing.B) {
+					b.ReportAllocs()
+					b.RunParallel(func(pb *testing.PB) {
+						for pb.Next() {
+							call.f()
+						}
+					})
+				})
+			}
+		})
+	}
+}
diff --git a/src/log/slog/internal/benchmarks/handlers.go b/src/log/slog/internal/benchmarks/handlers.go
new file mode 100644
index 0000000..091e2dd
--- /dev/null
+++ b/src/log/slog/internal/benchmarks/handlers.go
@@ -0,0 +1,148 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package benchmarks
+
+// Handlers for benchmarking.
+
+import (
+	"context"
+	"fmt"
+	"io"
+	"log/slog"
+	"log/slog/internal/buffer"
+	"strconv"
+	"time"
+)
+
+// A fastTextHandler writes a Record to an io.Writer in a format similar to
+// slog.TextHandler, but without quoting or locking. It has a few other
+// performance-motivated shortcuts, like writing times as seconds since the
+// epoch instead of strings.
+//
+// It is intended to represent a high-performance Handler that synchronously
+// writes text (as opposed to binary).
+type fastTextHandler struct {
+	w io.Writer
+}
+
+func newFastTextHandler(w io.Writer) slog.Handler {
+	return &fastTextHandler{w: w}
+}
+
+func (h *fastTextHandler) Enabled(context.Context, slog.Level) bool { return true }
+
+func (h *fastTextHandler) Handle(_ context.Context, r slog.Record) error {
+	buf := buffer.New()
+	defer buf.Free()
+
+	if !r.Time.IsZero() {
+		buf.WriteString("time=")
+		h.appendTime(buf, r.Time)
+		buf.WriteByte(' ')
+	}
+	buf.WriteString("level=")
+	*buf = strconv.AppendInt(*buf, int64(r.Level), 10)
+	buf.WriteByte(' ')
+	buf.WriteString("msg=")
+	buf.WriteString(r.Message)
+	r.Attrs(func(a slog.Attr) bool {
+		buf.WriteByte(' ')
+		buf.WriteString(a.Key)
+		buf.WriteByte('=')
+		h.appendValue(buf, a.Value)
+		return true
+	})
+	buf.WriteByte('\n')
+	_, err := h.w.Write(*buf)
+	return err
+}
+
+func (h *fastTextHandler) appendValue(buf *buffer.Buffer, v slog.Value) {
+	switch v.Kind() {
+	case slog.KindString:
+		buf.WriteString(v.String())
+	case slog.KindInt64:
+		*buf = strconv.AppendInt(*buf, v.Int64(), 10)
+	case slog.KindUint64:
+		*buf = strconv.AppendUint(*buf, v.Uint64(), 10)
+	case slog.KindFloat64:
+		*buf = strconv.AppendFloat(*buf, v.Float64(), 'g', -1, 64)
+	case slog.KindBool:
+		*buf = strconv.AppendBool(*buf, v.Bool())
+	case slog.KindDuration:
+		*buf = strconv.AppendInt(*buf, v.Duration().Nanoseconds(), 10)
+	case slog.KindTime:
+		h.appendTime(buf, v.Time())
+	case slog.KindAny:
+		a := v.Any()
+		switch a := a.(type) {
+		case error:
+			buf.WriteString(a.Error())
+		default:
+			fmt.Fprint(buf, a)
+		}
+	default:
+		panic(fmt.Sprintf("bad kind: %s", v.Kind()))
+	}
+}
+
+func (h *fastTextHandler) appendTime(buf *buffer.Buffer, t time.Time) {
+	*buf = strconv.AppendInt(*buf, t.Unix(), 10)
+}
+
+func (h *fastTextHandler) WithAttrs([]slog.Attr) slog.Handler {
+	panic("fastTextHandler: With unimplemented")
+}
+
+func (*fastTextHandler) WithGroup(string) slog.Handler {
+	panic("fastTextHandler: WithGroup unimplemented")
+}
+
+// An asyncHandler simulates a Handler that passes Records to a
+// background goroutine for processing.
+// Because sending to a channel can be expensive due to locking,
+// we simulate a lock-free queue by adding the Record to a ring buffer.
+// Omitting the locking makes this little more than a copy of the Record,
+// but that is a worthwhile thing to measure because Records are on the large
+// side. Since nothing actually reads from the ring buffer, it can handle an
+// arbitrary number of Records without either blocking or allocation.
+type asyncHandler struct {
+	ringBuffer [100]slog.Record
+	next       int
+}
+
+func newAsyncHandler() *asyncHandler {
+	return &asyncHandler{}
+}
+
+func (*asyncHandler) Enabled(context.Context, slog.Level) bool { return true }
+
+func (h *asyncHandler) Handle(_ context.Context, r slog.Record) error {
+	h.ringBuffer[h.next] = r.Clone()
+	h.next = (h.next + 1) % len(h.ringBuffer)
+	return nil
+}
+
+func (*asyncHandler) WithAttrs([]slog.Attr) slog.Handler {
+	panic("asyncHandler: With unimplemented")
+}
+
+func (*asyncHandler) WithGroup(string) slog.Handler {
+	panic("asyncHandler: WithGroup unimplemented")
+}
+
+// A disabledHandler's Enabled method always returns false.
+type disabledHandler struct{}
+
+func (disabledHandler) Enabled(context.Context, slog.Level) bool  { return false }
+func (disabledHandler) Handle(context.Context, slog.Record) error { panic("should not be called") }
+
+func (disabledHandler) WithAttrs([]slog.Attr) slog.Handler {
+	panic("disabledHandler: With unimplemented")
+}
+
+func (disabledHandler) WithGroup(string) slog.Handler {
+	panic("disabledHandler: WithGroup unimplemented")
+}
diff --git a/src/log/slog/internal/benchmarks/handlers_test.go b/src/log/slog/internal/benchmarks/handlers_test.go
new file mode 100644
index 0000000..6c00c80
--- /dev/null
+++ b/src/log/slog/internal/benchmarks/handlers_test.go
@@ -0,0 +1,42 @@
+package benchmarks
+
+import (
+	"bytes"
+	"context"
+	"log/slog"
+	"slices"
+	"testing"
+)
+
+func TestHandlers(t *testing.T) {
+	ctx := context.Background()
+	r := slog.NewRecord(testTime, slog.LevelInfo, testMessage, 0)
+	r.AddAttrs(testAttrs...)
+	t.Run("text", func(t *testing.T) {
+		var b bytes.Buffer
+		h := newFastTextHandler(&b)
+		if err := h.Handle(ctx, r); err != nil {
+			t.Fatal(err)
+		}
+		got := b.String()
+		if got != wantText {
+			t.Errorf("\ngot  %q\nwant %q", got, wantText)
+		}
+	})
+	t.Run("async", func(t *testing.T) {
+		h := newAsyncHandler()
+		if err := h.Handle(ctx, r); err != nil {
+			t.Fatal(err)
+		}
+		got := h.ringBuffer[0]
+		if !got.Time.Equal(r.Time) || !slices.EqualFunc(attrSlice(got), attrSlice(r), slog.Attr.Equal) {
+			t.Errorf("got %+v, want %+v", got, r)
+		}
+	})
+}
+
+func attrSlice(r slog.Record) []slog.Attr {
+	var as []slog.Attr
+	r.Attrs(func(a slog.Attr) bool { as = append(as, a); return true })
+	return as
+}
diff --git a/src/log/slog/internal/buffer/buffer.go b/src/log/slog/internal/buffer/buffer.go
new file mode 100644
index 0000000..c4fcefd
--- /dev/null
+++ b/src/log/slog/internal/buffer/buffer.go
@@ -0,0 +1,84 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package buffer provides a pool-allocated byte buffer.
+package buffer
+
+import "sync"
+
+// buffer adapted from go/src/fmt/print.go
+type Buffer []byte
+
+// Having an initial size gives a dramatic speedup.
+var bufPool = sync.Pool{
+	New: func() any {
+		b := make([]byte, 0, 1024)
+		return (*Buffer)(&b)
+	},
+}
+
+func New() *Buffer {
+	return bufPool.Get().(*Buffer)
+}
+
+func (b *Buffer) Free() {
+	// To reduce peak allocation, return only smaller buffers to the pool.
+	const maxBufferSize = 16 << 10
+	if cap(*b) <= maxBufferSize {
+		*b = (*b)[:0]
+		bufPool.Put(b)
+	}
+}
+
+func (b *Buffer) Reset() {
+	*b = (*b)[:0]
+}
+
+func (b *Buffer) Write(p []byte) (int, error) {
+	*b = append(*b, p...)
+	return len(p), nil
+}
+
+func (b *Buffer) WriteString(s string) (int, error) {
+	*b = append(*b, s...)
+	return len(s), nil
+}
+
+func (b *Buffer) WriteByte(c byte) error {
+	*b = append(*b, c)
+	return nil
+}
+
+func (b *Buffer) WritePosInt(i int) {
+	b.WritePosIntWidth(i, 0)
+}
+
+// WritePosIntWidth writes non-negative integer i to the buffer, padded on the left
+// by zeroes to the given width. Use a width of 0 to omit padding.
+func (b *Buffer) WritePosIntWidth(i, width int) {
+	// Cheap integer to fixed-width decimal ASCII.
+	// Copied from log/log.go.
+
+	if i < 0 {
+		panic("negative int")
+	}
+
+	// Assemble decimal in reverse order.
+	var bb [20]byte
+	bp := len(bb) - 1
+	for i >= 10 || width > 1 {
+		width--
+		q := i / 10
+		bb[bp] = byte('0' + i - q*10)
+		bp--
+		i = q
+	}
+	// i < 10
+	bb[bp] = byte('0' + i)
+	b.Write(bb[bp:])
+}
+
+func (b *Buffer) String() string {
+	return string(*b)
+}
diff --git a/src/log/slog/internal/buffer/buffer_test.go b/src/log/slog/internal/buffer/buffer_test.go
new file mode 100644
index 0000000..40b1d1f
--- /dev/null
+++ b/src/log/slog/internal/buffer/buffer_test.go
@@ -0,0 +1,41 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package buffer
+
+import (
+	"internal/race"
+	"internal/testenv"
+	"testing"
+)
+
+func Test(t *testing.T) {
+	b := New()
+	defer b.Free()
+	b.WriteString("hello")
+	b.WriteByte(',')
+	b.Write([]byte(" world"))
+	b.WritePosIntWidth(17, 4)
+
+	got := b.String()
+	want := "hello, world0017"
+	if got != want {
+		t.Errorf("got %q, want %q", got, want)
+	}
+}
+
+func TestAlloc(t *testing.T) {
+	if race.Enabled {
+		t.Skip("skipping test in race mode")
+	}
+	testenv.SkipIfOptimizationOff(t)
+	got := int(testing.AllocsPerRun(5, func() {
+		b := New()
+		defer b.Free()
+		b.WriteString("not 1K worth of bytes")
+	}))
+	if got != 0 {
+		t.Errorf("got %d allocs, want 0", got)
+	}
+}
diff --git a/src/log/slog/internal/ignorepc.go b/src/log/slog/internal/ignorepc.go
new file mode 100644
index 0000000..d125642
--- /dev/null
+++ b/src/log/slog/internal/ignorepc.go
@@ -0,0 +1,9 @@
+// Copyright 2023 The Go Authors. 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
+
+// If IgnorePC is true, do not invoke runtime.Callers to get the pc.
+// This is solely for benchmarking the slowdown from runtime.Callers.
+var IgnorePC = false
diff --git a/src/log/slog/internal/slogtest/slogtest.go b/src/log/slog/internal/slogtest/slogtest.go
new file mode 100644
index 0000000..d587662
--- /dev/null
+++ b/src/log/slog/internal/slogtest/slogtest.go
@@ -0,0 +1,18 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package slogtest contains support functions for testing slog.
+package slogtest
+
+import "log/slog"
+
+// RemoveTime removes the top-level time attribute.
+// It is intended to be used as a ReplaceAttr function,
+// to make example output deterministic.
+func RemoveTime(groups []string, a slog.Attr) slog.Attr {
+	if a.Key == slog.TimeKey && len(groups) == 0 {
+		return slog.Attr{}
+	}
+	return a
+}
diff --git a/src/log/slog/json_handler.go b/src/log/slog/json_handler.go
new file mode 100644
index 0000000..1c51ab0
--- /dev/null
+++ b/src/log/slog/json_handler.go
@@ -0,0 +1,336 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package slog
+
+import (
+	"bytes"
+	"context"
+	"encoding/json"
+	"errors"
+	"fmt"
+	"io"
+	"log/slog/internal/buffer"
+	"strconv"
+	"sync"
+	"time"
+	"unicode/utf8"
+)
+
+// JSONHandler is a Handler that writes Records to an io.Writer as
+// line-delimited JSON objects.
+type JSONHandler struct {
+	*commonHandler
+}
+
+// NewJSONHandler creates a JSONHandler that writes to w,
+// using the given options.
+// If opts is nil, the default options are used.
+func NewJSONHandler(w io.Writer, opts *HandlerOptions) *JSONHandler {
+	if opts == nil {
+		opts = &HandlerOptions{}
+	}
+	return &JSONHandler{
+		&commonHandler{
+			json: true,
+			w:    w,
+			opts: *opts,
+			mu:   &sync.Mutex{},
+		},
+	}
+}
+
+// Enabled reports whether the handler handles records at the given level.
+// The handler ignores records whose level is lower.
+func (h *JSONHandler) Enabled(_ context.Context, level Level) bool {
+	return h.commonHandler.enabled(level)
+}
+
+// WithAttrs returns a new JSONHandler whose attributes consists
+// of h's attributes followed by attrs.
+func (h *JSONHandler) WithAttrs(attrs []Attr) Handler {
+	return &JSONHandler{commonHandler: h.commonHandler.withAttrs(attrs)}
+}
+
+func (h *JSONHandler) WithGroup(name string) Handler {
+	return &JSONHandler{commonHandler: h.commonHandler.withGroup(name)}
+}
+
+// Handle formats its argument Record as a JSON object on a single line.
+//
+// If the Record's time is zero, the time is omitted.
+// Otherwise, the key is "time"
+// and the value is output as with json.Marshal.
+//
+// If the Record's level is zero, the level is omitted.
+// Otherwise, the key is "level"
+// and the value of [Level.String] is output.
+//
+// If the AddSource option is set and source information is available,
+// the key is "source", and the value is a record of type [Source].
+//
+// The message's key is "msg".
+//
+// To modify these or other attributes, or remove them from the output, use
+// [HandlerOptions.ReplaceAttr].
+//
+// Values are formatted as with an [encoding/json.Encoder] with SetEscapeHTML(false),
+// with two exceptions.
+//
+// First, an Attr whose Value is of type error is formatted as a string, by
+// calling its Error method. Only errors in Attrs receive this special treatment,
+// not errors embedded in structs, slices, maps or other data structures that
+// are processed by the encoding/json package.
+//
+// Second, an encoding failure does not cause Handle to return an error.
+// Instead, the error message is formatted as a string.
+//
+// Each call to Handle results in a single serialized call to io.Writer.Write.
+func (h *JSONHandler) Handle(_ context.Context, r Record) error {
+	return h.commonHandler.handle(r)
+}
+
+// Adapted from time.Time.MarshalJSON to avoid allocation.
+func appendJSONTime(s *handleState, t time.Time) {
+	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.
+		s.appendError(errors.New("time.Time year outside of range [0,9999]"))
+	}
+	s.buf.WriteByte('"')
+	*s.buf = t.AppendFormat(*s.buf, time.RFC3339Nano)
+	s.buf.WriteByte('"')
+}
+
+func appendJSONValue(s *handleState, v Value) error {
+	switch v.Kind() {
+	case KindString:
+		s.appendString(v.str())
+	case KindInt64:
+		*s.buf = strconv.AppendInt(*s.buf, v.Int64(), 10)
+	case KindUint64:
+		*s.buf = strconv.AppendUint(*s.buf, v.Uint64(), 10)
+	case KindFloat64:
+		// json.Marshal is funny about floats; it doesn't
+		// always match strconv.AppendFloat. So just call it.
+		// That's expensive, but floats are rare.
+		if err := appendJSONMarshal(s.buf, v.Float64()); err != nil {
+			return err
+		}
+	case KindBool:
+		*s.buf = strconv.AppendBool(*s.buf, v.Bool())
+	case KindDuration:
+		// Do what json.Marshal does.
+		*s.buf = strconv.AppendInt(*s.buf, int64(v.Duration()), 10)
+	case KindTime:
+		s.appendTime(v.Time())
+	case KindAny:
+		a := v.Any()
+		_, jm := a.(json.Marshaler)
+		if err, ok := a.(error); ok && !jm {
+			s.appendString(err.Error())
+		} else {
+			return appendJSONMarshal(s.buf, a)
+		}
+	default:
+		panic(fmt.Sprintf("bad kind: %s", v.Kind()))
+	}
+	return nil
+}
+
+func appendJSONMarshal(buf *buffer.Buffer, v any) error {
+	// Use a json.Encoder to avoid escaping HTML.
+	var bb bytes.Buffer
+	enc := json.NewEncoder(&bb)
+	enc.SetEscapeHTML(false)
+	if err := enc.Encode(v); err != nil {
+		return err
+	}
+	bs := bb.Bytes()
+	buf.Write(bs[:len(bs)-1]) // remove final newline
+	return nil
+}
+
+// appendEscapedJSONString escapes s for JSON and appends it to buf.
+// It does not surround the string in quotation marks.
+//
+// Modified from encoding/json/encode.go:encodeState.string,
+// with escapeHTML set to false.
+func appendEscapedJSONString(buf []byte, s string) []byte {
+	char := func(b byte) { buf = append(buf, b) }
+	str := func(s string) { buf = append(buf, s...) }
+
+	start := 0
+	for i := 0; i < len(s); {
+		if b := s[i]; b < utf8.RuneSelf {
+			if safeSet[b] {
+				i++
+				continue
+			}
+			if start < i {
+				str(s[start:i])
+			}
+			char('\\')
+			switch b {
+			case '\\', '"':
+				char(b)
+			case '\n':
+				char('n')
+			case '\r':
+				char('r')
+			case '\t':
+				char('t')
+			default:
+				// This encodes bytes < 0x20 except for \t, \n and \r.
+				str(`u00`)
+				char(hex[b>>4])
+				char(hex[b&0xF])
+			}
+			i++
+			start = i
+			continue
+		}
+		c, size := utf8.DecodeRuneInString(s[i:])
+		if c == utf8.RuneError && size == 1 {
+			if start < i {
+				str(s[start:i])
+			}
+			str(`\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 {
+				str(s[start:i])
+			}
+			str(`\u202`)
+			char(hex[c&0xF])
+			i += size
+			start = i
+			continue
+		}
+		i += size
+	}
+	if start < len(s) {
+		str(s[start:])
+	}
+	return buf
+}
+
+var hex = "0123456789abcdef"
+
+// Copied from encoding/json/tables.go.
+//
+// safeSet holds the value true if the ASCII character with the given array
+// position can be represented inside a JSON string without any further
+// escaping.
+//
+// All values are true except for the ASCII control characters (0-31), the
+// double quote ("), and the backslash character ("\").
+var safeSet = [utf8.RuneSelf]bool{
+	' ':      true,
+	'!':      true,
+	'"':      false,
+	'#':      true,
+	'$':      true,
+	'%':      true,
+	'&':      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,
+	':':      true,
+	';':      true,
+	'<':      true,
+	'=':      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,
+	'\\':     false,
+	']':      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,
+	'}':      true,
+	'~':      true,
+	'\u007f': true,
+}
diff --git a/src/log/slog/json_handler_test.go b/src/log/slog/json_handler_test.go
new file mode 100644
index 0000000..65130f2
--- /dev/null
+++ b/src/log/slog/json_handler_test.go
@@ -0,0 +1,284 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package slog
+
+import (
+	"bytes"
+	"context"
+	"encoding/json"
+	"errors"
+	"fmt"
+	"io"
+	"log/slog/internal/buffer"
+	"math"
+	"os"
+	"path/filepath"
+	"strings"
+	"testing"
+	"time"
+)
+
+func TestJSONHandler(t *testing.T) {
+	for _, test := range []struct {
+		name string
+		opts HandlerOptions
+		want string
+	}{
+		{
+			"none",
+			HandlerOptions{},
+			`{"time":"2000-01-02T03:04:05Z","level":"INFO","msg":"m","a":1,"m":{"b":2}}`,
+		},
+		{
+			"replace",
+			HandlerOptions{ReplaceAttr: upperCaseKey},
+			`{"TIME":"2000-01-02T03:04:05Z","LEVEL":"INFO","MSG":"m","A":1,"M":{"b":2}}`,
+		},
+	} {
+		t.Run(test.name, func(t *testing.T) {
+			var buf bytes.Buffer
+			h := NewJSONHandler(&buf, &test.opts)
+			r := NewRecord(testTime, LevelInfo, "m", 0)
+			r.AddAttrs(Int("a", 1), Any("m", map[string]int{"b": 2}))
+			if err := h.Handle(context.Background(), r); err != nil {
+				t.Fatal(err)
+			}
+			got := strings.TrimSuffix(buf.String(), "\n")
+			if got != test.want {
+				t.Errorf("\ngot  %s\nwant %s", got, test.want)
+			}
+		})
+	}
+}
+
+// for testing json.Marshaler
+type jsonMarshaler struct {
+	s string
+}
+
+func (j jsonMarshaler) String() string { return j.s } // should be ignored
+
+func (j jsonMarshaler) MarshalJSON() ([]byte, error) {
+	if j.s == "" {
+		return nil, errors.New("json: empty string")
+	}
+	return []byte(fmt.Sprintf(`[%q]`, j.s)), nil
+}
+
+type jsonMarshalerError struct {
+	jsonMarshaler
+}
+
+func (jsonMarshalerError) Error() string { return "oops" }
+
+func TestAppendJSONValue(t *testing.T) {
+	// jsonAppendAttrValue should always agree with json.Marshal.
+	for _, value := range []any{
+		"hello\r\n\t\a",
+		`"[{escape}]"`,
+		"<escapeHTML&>",
+		// \u2028\u2029 is an edge case in JavaScript vs JSON.
+		// \xF6 is an incomplete encoding.
+		"\u03B8\u2028\u2029\uFFFF\xF6",
+		`-123`,
+		int64(-9_200_123_456_789_123_456),
+		uint64(9_200_123_456_789_123_456),
+		-12.75,
+		1.23e-9,
+		false,
+		time.Minute,
+		testTime,
+		jsonMarshaler{"xyz"},
+		jsonMarshalerError{jsonMarshaler{"pqr"}},
+		LevelWarn,
+	} {
+		got := jsonValueString(AnyValue(value))
+		want, err := marshalJSON(value)
+		if err != nil {
+			t.Fatal(err)
+		}
+		if got != want {
+			t.Errorf("%v: got %s, want %s", value, got, want)
+		}
+	}
+}
+
+func marshalJSON(x any) (string, error) {
+	var buf bytes.Buffer
+	enc := json.NewEncoder(&buf)
+	enc.SetEscapeHTML(false)
+	if err := enc.Encode(x); err != nil {
+		return "", err
+	}
+	return strings.TrimSpace(buf.String()), nil
+}
+
+func TestJSONAppendAttrValueSpecial(t *testing.T) {
+	// Attr values that render differently from json.Marshal.
+	for _, test := range []struct {
+		value any
+		want  string
+	}{
+		{math.NaN(), `"!ERROR:json: unsupported value: NaN"`},
+		{math.Inf(+1), `"!ERROR:json: unsupported value: +Inf"`},
+		{math.Inf(-1), `"!ERROR:json: unsupported value: -Inf"`},
+		{io.EOF, `"EOF"`},
+	} {
+		got := jsonValueString(AnyValue(test.value))
+		if got != test.want {
+			t.Errorf("%v: got %s, want %s", test.value, got, test.want)
+		}
+	}
+}
+
+func jsonValueString(v Value) string {
+	var buf []byte
+	s := &handleState{h: &commonHandler{json: true}, buf: (*buffer.Buffer)(&buf)}
+	if err := appendJSONValue(s, v); err != nil {
+		s.appendError(err)
+	}
+	return string(buf)
+}
+
+func BenchmarkJSONHandler(b *testing.B) {
+	for _, bench := range []struct {
+		name string
+		opts HandlerOptions
+	}{
+		{"defaults", HandlerOptions{}},
+		{"time format", HandlerOptions{
+			ReplaceAttr: func(_ []string, a Attr) Attr {
+				v := a.Value
+				if v.Kind() == KindTime {
+					return String(a.Key, v.Time().Format(rfc3339Millis))
+				}
+				if a.Key == "level" {
+					return Attr{"severity", a.Value}
+				}
+				return a
+			},
+		}},
+		{"time unix", HandlerOptions{
+			ReplaceAttr: func(_ []string, a Attr) Attr {
+				v := a.Value
+				if v.Kind() == KindTime {
+					return Int64(a.Key, v.Time().UnixNano())
+				}
+				if a.Key == "level" {
+					return Attr{"severity", a.Value}
+				}
+				return a
+			},
+		}},
+	} {
+		b.Run(bench.name, func(b *testing.B) {
+			ctx := context.Background()
+			l := New(NewJSONHandler(io.Discard, &bench.opts)).With(
+				String("program", "my-test-program"),
+				String("package", "log/slog"),
+				String("traceID", "2039232309232309"),
+				String("URL", "https://pkg.go.dev/golang.org/x/log/slog"))
+			b.ReportAllocs()
+			b.ResetTimer()
+			for i := 0; i < b.N; i++ {
+				l.LogAttrs(ctx, LevelInfo, "this is a typical log message",
+					String("module", "github.com/google/go-cmp"),
+					String("version", "v1.23.4"),
+					Int("count", 23),
+					Int("number", 123456),
+				)
+			}
+		})
+	}
+}
+
+func BenchmarkPreformatting(b *testing.B) {
+	type req struct {
+		Method  string
+		URL     string
+		TraceID string
+		Addr    string
+	}
+
+	structAttrs := []any{
+		String("program", "my-test-program"),
+		String("package", "log/slog"),
+		Any("request", &req{
+			Method:  "GET",
+			URL:     "https://pkg.go.dev/golang.org/x/log/slog",
+			TraceID: "2039232309232309",
+			Addr:    "127.0.0.1:8080",
+		}),
+	}
+
+	outFile, err := os.Create(filepath.Join(b.TempDir(), "bench.log"))
+	if err != nil {
+		b.Fatal(err)
+	}
+	defer func() {
+		if err := outFile.Close(); err != nil {
+			b.Fatal(err)
+		}
+	}()
+
+	for _, bench := range []struct {
+		name  string
+		wc    io.Writer
+		attrs []any
+	}{
+		{"separate", io.Discard, []any{
+			String("program", "my-test-program"),
+			String("package", "log/slog"),
+			String("method", "GET"),
+			String("URL", "https://pkg.go.dev/golang.org/x/log/slog"),
+			String("traceID", "2039232309232309"),
+			String("addr", "127.0.0.1:8080"),
+		}},
+		{"struct", io.Discard, structAttrs},
+		{"struct file", outFile, structAttrs},
+	} {
+		ctx := context.Background()
+		b.Run(bench.name, func(b *testing.B) {
+			l := New(NewJSONHandler(bench.wc, nil)).With(bench.attrs...)
+			b.ReportAllocs()
+			b.ResetTimer()
+			for i := 0; i < b.N; i++ {
+				l.LogAttrs(ctx, LevelInfo, "this is a typical log message",
+					String("module", "github.com/google/go-cmp"),
+					String("version", "v1.23.4"),
+					Int("count", 23),
+					Int("number", 123456),
+				)
+			}
+		})
+	}
+}
+
+func BenchmarkJSONEncoding(b *testing.B) {
+	value := 3.14
+	buf := buffer.New()
+	defer buf.Free()
+	b.Run("json.Marshal", func(b *testing.B) {
+		b.ReportAllocs()
+		for i := 0; i < b.N; i++ {
+			by, err := json.Marshal(value)
+			if err != nil {
+				b.Fatal(err)
+			}
+			buf.Write(by)
+			*buf = (*buf)[:0]
+		}
+	})
+	b.Run("Encoder.Encode", func(b *testing.B) {
+		b.ReportAllocs()
+		for i := 0; i < b.N; i++ {
+			if err := json.NewEncoder(buf).Encode(value); err != nil {
+				b.Fatal(err)
+			}
+			*buf = (*buf)[:0]
+		}
+	})
+	_ = buf
+}
diff --git a/src/log/slog/level.go b/src/log/slog/level.go
new file mode 100644
index 0000000..cd1213a
--- /dev/null
+++ b/src/log/slog/level.go
@@ -0,0 +1,200 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package slog
+
+import (
+	"errors"
+	"fmt"
+	"strconv"
+	"strings"
+	"sync/atomic"
+)
+
+// A Level is the importance or severity of a log event.
+// The higher the level, the more important or severe the event.
+type Level int
+
+// Level numbers are inherently arbitrary,
+// but we picked them to satisfy three constraints.
+// Any system can map them to another numbering scheme if it wishes.
+//
+// First, we wanted the default level to be Info, Since Levels are ints, Info is
+// the default value for int, zero.
+//
+// Second, we wanted to make it easy to use levels to specify logger verbosity.
+// Since a larger level means a more severe event, a logger that accepts events
+// with smaller (or more negative) level means a more verbose logger. Logger
+// verbosity is thus the negation of event severity, and the default verbosity
+// of 0 accepts all events at least as severe as INFO.
+//
+// Third, we wanted some room between levels to accommodate schemes with named
+// levels between ours. For example, Google Cloud Logging defines a Notice level
+// between Info and Warn. Since there are only a few of these intermediate
+// levels, the gap between the numbers need not be large. Our gap of 4 matches
+// OpenTelemetry's mapping. Subtracting 9 from an OpenTelemetry level in the
+// DEBUG, INFO, WARN and ERROR ranges converts it to the corresponding slog
+// Level range. OpenTelemetry also has the names TRACE and FATAL, which slog
+// does not. But those OpenTelemetry levels can still be represented as slog
+// Levels by using the appropriate integers.
+//
+// Names for common levels.
+const (
+	LevelDebug Level = -4
+	LevelInfo  Level = 0
+	LevelWarn  Level = 4
+	LevelError Level = 8
+)
+
+// String returns a name for the level.
+// If the level has a name, then that name
+// in uppercase is returned.
+// If the level is between named values, then
+// an integer is appended to the uppercased name.
+// Examples:
+//
+//	LevelWarn.String() => "WARN"
+//	(LevelInfo+2).String() => "INFO+2"
+func (l Level) String() string {
+	str := func(base string, val Level) string {
+		if val == 0 {
+			return base
+		}
+		return fmt.Sprintf("%s%+d", base, val)
+	}
+
+	switch {
+	case l < LevelInfo:
+		return str("DEBUG", l-LevelDebug)
+	case l < LevelWarn:
+		return str("INFO", l-LevelInfo)
+	case l < LevelError:
+		return str("WARN", l-LevelWarn)
+	default:
+		return str("ERROR", l-LevelError)
+	}
+}
+
+// MarshalJSON implements [encoding/json.Marshaler]
+// by quoting the output of [Level.String].
+func (l Level) MarshalJSON() ([]byte, error) {
+	// AppendQuote is sufficient for JSON-encoding all Level strings.
+	// They don't contain any runes that would produce invalid JSON
+	// when escaped.
+	return strconv.AppendQuote(nil, l.String()), nil
+}
+
+// UnmarshalJSON implements [encoding/json.Unmarshaler]
+// It accepts any string produced by [Level.MarshalJSON],
+// ignoring case.
+// It also accepts numeric offsets that would result in a different string on
+// output. For example, "Error-8" would marshal as "INFO".
+func (l *Level) UnmarshalJSON(data []byte) error {
+	s, err := strconv.Unquote(string(data))
+	if err != nil {
+		return err
+	}
+	return l.parse(s)
+}
+
+// MarshalText implements [encoding.TextMarshaler]
+// by calling [Level.String].
+func (l Level) MarshalText() ([]byte, error) {
+	return []byte(l.String()), nil
+}
+
+// UnmarshalText implements [encoding.TextUnmarshaler].
+// It accepts any string produced by [Level.MarshalText],
+// ignoring case.
+// It also accepts numeric offsets that would result in a different string on
+// output. For example, "Error-8" would marshal as "INFO".
+func (l *Level) UnmarshalText(data []byte) error {
+	return l.parse(string(data))
+}
+
+func (l *Level) parse(s string) (err error) {
+	defer func() {
+		if err != nil {
+			err = fmt.Errorf("slog: level string %q: %w", s, err)
+		}
+	}()
+
+	name := s
+	offset := 0
+	if i := strings.IndexAny(s, "+-"); i >= 0 {
+		name = s[:i]
+		offset, err = strconv.Atoi(s[i:])
+		if err != nil {
+			return err
+		}
+	}
+	switch strings.ToUpper(name) {
+	case "DEBUG":
+		*l = LevelDebug
+	case "INFO":
+		*l = LevelInfo
+	case "WARN":
+		*l = LevelWarn
+	case "ERROR":
+		*l = LevelError
+	default:
+		return errors.New("unknown name")
+	}
+	*l += Level(offset)
+	return nil
+}
+
+// Level returns the receiver.
+// It implements Leveler.
+func (l Level) Level() Level { return l }
+
+// A LevelVar is a Level variable, to allow a Handler level to change
+// dynamically.
+// It implements Leveler as well as a Set method,
+// and it is safe for use by multiple goroutines.
+// The zero LevelVar corresponds to LevelInfo.
+type LevelVar struct {
+	val atomic.Int64
+}
+
+// Level returns v's level.
+func (v *LevelVar) Level() Level {
+	return Level(int(v.val.Load()))
+}
+
+// Set sets v's level to l.
+func (v *LevelVar) Set(l Level) {
+	v.val.Store(int64(l))
+}
+
+func (v *LevelVar) String() string {
+	return fmt.Sprintf("LevelVar(%s)", v.Level())
+}
+
+// MarshalText implements [encoding.TextMarshaler]
+// by calling [Level.MarshalText].
+func (v *LevelVar) MarshalText() ([]byte, error) {
+	return v.Level().MarshalText()
+}
+
+// UnmarshalText implements [encoding.TextUnmarshaler]
+// by calling [Level.UnmarshalText].
+func (v *LevelVar) UnmarshalText(data []byte) error {
+	var l Level
+	if err := l.UnmarshalText(data); err != nil {
+		return err
+	}
+	v.Set(l)
+	return nil
+}
+
+// A Leveler provides a Level value.
+//
+// As Level itself implements Leveler, clients typically supply
+// a Level value wherever a Leveler is needed, such as in HandlerOptions.
+// Clients who need to vary the level dynamically can provide a more complex
+// Leveler implementation such as *LevelVar.
+type Leveler interface {
+	Level() Level
+}
diff --git a/src/log/slog/level_test.go b/src/log/slog/level_test.go
new file mode 100644
index 0000000..0b28e71
--- /dev/null
+++ b/src/log/slog/level_test.go
@@ -0,0 +1,178 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package slog
+
+import (
+	"flag"
+	"strings"
+	"testing"
+)
+
+func TestLevelString(t *testing.T) {
+	for _, test := range []struct {
+		in   Level
+		want string
+	}{
+		{0, "INFO"},
+		{LevelError, "ERROR"},
+		{LevelError + 2, "ERROR+2"},
+		{LevelError - 2, "WARN+2"},
+		{LevelWarn, "WARN"},
+		{LevelWarn - 1, "INFO+3"},
+		{LevelInfo, "INFO"},
+		{LevelInfo + 1, "INFO+1"},
+		{LevelInfo - 3, "DEBUG+1"},
+		{LevelDebug, "DEBUG"},
+		{LevelDebug - 2, "DEBUG-2"},
+	} {
+		got := test.in.String()
+		if got != test.want {
+			t.Errorf("%d: got %s, want %s", test.in, got, test.want)
+		}
+	}
+}
+
+func TestLevelVar(t *testing.T) {
+	var al LevelVar
+	if got, want := al.Level(), LevelInfo; got != want {
+		t.Errorf("got %v, want %v", got, want)
+	}
+	al.Set(LevelWarn)
+	if got, want := al.Level(), LevelWarn; got != want {
+		t.Errorf("got %v, want %v", got, want)
+	}
+	al.Set(LevelInfo)
+	if got, want := al.Level(), LevelInfo; got != want {
+		t.Errorf("got %v, want %v", got, want)
+	}
+
+}
+
+func TestMarshalJSON(t *testing.T) {
+	want := LevelWarn - 3
+	data, err := want.MarshalJSON()
+	if err != nil {
+		t.Fatal(err)
+	}
+	var got Level
+	if err := got.UnmarshalJSON(data); err != nil {
+		t.Fatal(err)
+	}
+	if got != want {
+		t.Errorf("got %s, want %s", got, want)
+	}
+}
+
+func TestLevelMarshalText(t *testing.T) {
+	want := LevelWarn - 3
+	data, err := want.MarshalText()
+	if err != nil {
+		t.Fatal(err)
+	}
+	var got Level
+	if err := got.UnmarshalText(data); err != nil {
+		t.Fatal(err)
+	}
+	if got != want {
+		t.Errorf("got %s, want %s", got, want)
+	}
+}
+
+func TestLevelParse(t *testing.T) {
+	for _, test := range []struct {
+		in   string
+		want Level
+	}{
+		{"DEBUG", LevelDebug},
+		{"INFO", LevelInfo},
+		{"WARN", LevelWarn},
+		{"ERROR", LevelError},
+		{"debug", LevelDebug},
+		{"iNfo", LevelInfo},
+		{"INFO+87", LevelInfo + 87},
+		{"Error-18", LevelError - 18},
+		{"Error-8", LevelInfo},
+	} {
+		var got Level
+		if err := got.parse(test.in); err != nil {
+			t.Fatalf("%q: %v", test.in, err)
+		}
+		if got != test.want {
+			t.Errorf("%q: got %s, want %s", test.in, got, test.want)
+		}
+	}
+}
+
+func TestLevelParseError(t *testing.T) {
+	for _, test := range []struct {
+		in   string
+		want string // error string should contain this
+	}{
+		{"", "unknown name"},
+		{"dbg", "unknown name"},
+		{"INFO+", "invalid syntax"},
+		{"INFO-", "invalid syntax"},
+		{"ERROR+23x", "invalid syntax"},
+	} {
+		var l Level
+		err := l.parse(test.in)
+		if err == nil || !strings.Contains(err.Error(), test.want) {
+			t.Errorf("%q: got %v, want string containing %q", test.in, err, test.want)
+		}
+	}
+}
+
+func TestLevelFlag(t *testing.T) {
+	fs := flag.NewFlagSet("test", flag.ContinueOnError)
+	lf := LevelInfo
+	fs.TextVar(&lf, "level", lf, "set level")
+	err := fs.Parse([]string{"-level", "WARN+3"})
+	if err != nil {
+		t.Fatal(err)
+	}
+	if g, w := lf, LevelWarn+3; g != w {
+		t.Errorf("got %v, want %v", g, w)
+	}
+}
+
+func TestLevelVarMarshalText(t *testing.T) {
+	var v LevelVar
+	v.Set(LevelWarn)
+	data, err := v.MarshalText()
+	if err != nil {
+		t.Fatal(err)
+	}
+	var v2 LevelVar
+	if err := v2.UnmarshalText(data); err != nil {
+		t.Fatal(err)
+	}
+	if g, w := v2.Level(), LevelWarn; g != w {
+		t.Errorf("got %s, want %s", g, w)
+	}
+}
+
+func TestLevelVarFlag(t *testing.T) {
+	fs := flag.NewFlagSet("test", flag.ContinueOnError)
+	v := &LevelVar{}
+	v.Set(LevelWarn + 3)
+	fs.TextVar(v, "level", v, "set level")
+	err := fs.Parse([]string{"-level", "WARN+3"})
+	if err != nil {
+		t.Fatal(err)
+	}
+	if g, w := v.Level(), LevelWarn+3; g != w {
+		t.Errorf("got %v, want %v", g, w)
+	}
+}
+
+func TestLevelVarString(t *testing.T) {
+	var v LevelVar
+	v.Set(LevelError)
+	got := v.String()
+	want := "LevelVar(ERROR)"
+	if got != want {
+		t.Errorf("got %q, want %q", got, want)
+	}
+}
diff --git a/src/log/slog/logger.go b/src/log/slog/logger.go
new file mode 100644
index 0000000..a068085
--- /dev/null
+++ b/src/log/slog/logger.go
@@ -0,0 +1,296 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package slog
+
+import (
+	"context"
+	"log"
+	loginternal "log/internal"
+	"log/slog/internal"
+	"runtime"
+	"sync/atomic"
+	"time"
+)
+
+var defaultLogger atomic.Value
+
+func init() {
+	defaultLogger.Store(New(newDefaultHandler(loginternal.DefaultOutput)))
+}
+
+// Default returns the default Logger.
+func Default() *Logger { return defaultLogger.Load().(*Logger) }
+
+// SetDefault makes l the default Logger.
+// After this call, output from the log package's default Logger
+// (as with [log.Print], etc.) will be logged at LevelInfo using l's Handler.
+func SetDefault(l *Logger) {
+	defaultLogger.Store(l)
+	// If the default's handler is a defaultHandler, then don't use a handleWriter,
+	// or we'll deadlock as they both try to acquire the log default mutex.
+	// The defaultHandler will use whatever the log default writer is currently
+	// set to, which is correct.
+	// This can occur with SetDefault(Default()).
+	// See TestSetDefault.
+	if _, ok := l.Handler().(*defaultHandler); !ok {
+		capturePC := log.Flags()&(log.Lshortfile|log.Llongfile) != 0
+		log.SetOutput(&handlerWriter{l.Handler(), LevelInfo, capturePC})
+		log.SetFlags(0) // we want just the log message, no time or location
+	}
+}
+
+// handlerWriter is an io.Writer that calls a Handler.
+// It is used to link the default log.Logger to the default slog.Logger.
+type handlerWriter struct {
+	h         Handler
+	level     Level
+	capturePC bool
+}
+
+func (w *handlerWriter) Write(buf []byte) (int, error) {
+	if !w.h.Enabled(context.Background(), w.level) {
+		return 0, nil
+	}
+	var pc uintptr
+	if !internal.IgnorePC && w.capturePC {
+		// skip [runtime.Callers, w.Write, Logger.Output, log.Print]
+		var pcs [1]uintptr
+		runtime.Callers(4, pcs[:])
+		pc = pcs[0]
+	}
+
+	// Remove final newline.
+	origLen := len(buf) // Report that the entire buf was written.
+	if len(buf) > 0 && buf[len(buf)-1] == '\n' {
+		buf = buf[:len(buf)-1]
+	}
+	r := NewRecord(time.Now(), w.level, string(buf), pc)
+	return origLen, w.h.Handle(context.Background(), r)
+}
+
+// A Logger records structured information about each call to its
+// Log, Debug, Info, Warn, and Error methods.
+// For each call, it creates a Record and passes it to a Handler.
+//
+// To create a new Logger, call [New] or a Logger method
+// that begins "With".
+type Logger struct {
+	handler Handler // for structured logging
+}
+
+func (l *Logger) clone() *Logger {
+	c := *l
+	return &c
+}
+
+// Handler returns l's Handler.
+func (l *Logger) Handler() Handler { return l.handler }
+
+// With returns a Logger that includes the given attributes
+// in each output operation. Arguments are converted to
+// attributes as if by [Logger.Log].
+func (l *Logger) With(args ...any) *Logger {
+	if len(args) == 0 {
+		return l
+	}
+	c := l.clone()
+	c.handler = l.handler.WithAttrs(argsToAttrSlice(args))
+	return c
+}
+
+// WithGroup returns a Logger that starts a group, if name is non-empty.
+// The keys of all attributes added to the Logger will be qualified by the given
+// name. (How that qualification happens depends on the [Handler.WithGroup]
+// method of the Logger's Handler.)
+//
+// If name is empty, WithGroup returns the receiver.
+func (l *Logger) WithGroup(name string) *Logger {
+	if name == "" {
+		return l
+	}
+	c := l.clone()
+	c.handler = l.handler.WithGroup(name)
+	return c
+
+}
+
+// New creates a new Logger with the given non-nil Handler.
+func New(h Handler) *Logger {
+	if h == nil {
+		panic("nil Handler")
+	}
+	return &Logger{handler: h}
+}
+
+// With calls Logger.With on the default logger.
+func With(args ...any) *Logger {
+	return Default().With(args...)
+}
+
+// Enabled reports whether l emits log records at the given context and level.
+func (l *Logger) Enabled(ctx context.Context, level Level) bool {
+	if ctx == nil {
+		ctx = context.Background()
+	}
+	return l.Handler().Enabled(ctx, level)
+}
+
+// NewLogLogger returns a new log.Logger such that each call to its Output method
+// dispatches a Record to the specified handler. The logger acts as a bridge from
+// the older log API to newer structured logging handlers.
+func NewLogLogger(h Handler, level Level) *log.Logger {
+	return log.New(&handlerWriter{h, level, true}, "", 0)
+}
+
+// Log emits a log record with the current time and the given level and message.
+// The Record's Attrs consist of the Logger's attributes followed by
+// the Attrs specified by args.
+//
+// The attribute arguments are processed as follows:
+//   - If an argument is an Attr, it is used as is.
+//   - If an argument is a string and this is not the last argument,
+//     the following argument is treated as the value and the two are combined
+//     into an Attr.
+//   - Otherwise, the argument is treated as a value with key "!BADKEY".
+func (l *Logger) Log(ctx context.Context, level Level, msg string, args ...any) {
+	l.log(ctx, level, msg, args...)
+}
+
+// LogAttrs is a more efficient version of [Logger.Log] that accepts only Attrs.
+func (l *Logger) LogAttrs(ctx context.Context, level Level, msg string, attrs ...Attr) {
+	l.logAttrs(ctx, level, msg, attrs...)
+}
+
+// Debug logs at LevelDebug.
+func (l *Logger) Debug(msg string, args ...any) {
+	l.log(context.Background(), LevelDebug, msg, args...)
+}
+
+// DebugContext logs at LevelDebug with the given context.
+func (l *Logger) DebugContext(ctx context.Context, msg string, args ...any) {
+	l.log(ctx, LevelDebug, msg, args...)
+}
+
+// Info logs at LevelInfo.
+func (l *Logger) Info(msg string, args ...any) {
+	l.log(context.Background(), LevelInfo, msg, args...)
+}
+
+// InfoContext logs at LevelInfo with the given context.
+func (l *Logger) InfoContext(ctx context.Context, msg string, args ...any) {
+	l.log(ctx, LevelInfo, msg, args...)
+}
+
+// Warn logs at LevelWarn.
+func (l *Logger) Warn(msg string, args ...any) {
+	l.log(context.Background(), LevelWarn, msg, args...)
+}
+
+// WarnContext logs at LevelWarn with the given context.
+func (l *Logger) WarnContext(ctx context.Context, msg string, args ...any) {
+	l.log(ctx, LevelWarn, msg, args...)
+}
+
+// Error logs at LevelError.
+func (l *Logger) Error(msg string, args ...any) {
+	l.log(context.Background(), LevelError, msg, args...)
+}
+
+// ErrorContext logs at LevelError with the given context.
+func (l *Logger) ErrorContext(ctx context.Context, msg string, args ...any) {
+	l.log(ctx, LevelError, msg, args...)
+}
+
+// log is the low-level logging method for methods that take ...any.
+// It must always be called directly by an exported logging method
+// or function, because it uses a fixed call depth to obtain the pc.
+func (l *Logger) log(ctx context.Context, level Level, msg string, args ...any) {
+	if !l.Enabled(ctx, level) {
+		return
+	}
+	var pc uintptr
+	if !internal.IgnorePC {
+		var pcs [1]uintptr
+		// skip [runtime.Callers, this function, this function's caller]
+		runtime.Callers(3, pcs[:])
+		pc = pcs[0]
+	}
+	r := NewRecord(time.Now(), level, msg, pc)
+	r.Add(args...)
+	if ctx == nil {
+		ctx = context.Background()
+	}
+	_ = l.Handler().Handle(ctx, r)
+}
+
+// logAttrs is like [Logger.log], but for methods that take ...Attr.
+func (l *Logger) logAttrs(ctx context.Context, level Level, msg string, attrs ...Attr) {
+	if !l.Enabled(ctx, level) {
+		return
+	}
+	var pc uintptr
+	if !internal.IgnorePC {
+		var pcs [1]uintptr
+		// skip [runtime.Callers, this function, this function's caller]
+		runtime.Callers(3, pcs[:])
+		pc = pcs[0]
+	}
+	r := NewRecord(time.Now(), level, msg, pc)
+	r.AddAttrs(attrs...)
+	if ctx == nil {
+		ctx = context.Background()
+	}
+	_ = l.Handler().Handle(ctx, r)
+}
+
+// Debug calls Logger.Debug on the default logger.
+func Debug(msg string, args ...any) {
+	Default().log(context.Background(), LevelDebug, msg, args...)
+}
+
+// DebugContext calls Logger.DebugContext on the default logger.
+func DebugContext(ctx context.Context, msg string, args ...any) {
+	Default().log(ctx, LevelDebug, msg, args...)
+}
+
+// Info calls Logger.Info on the default logger.
+func Info(msg string, args ...any) {
+	Default().log(context.Background(), LevelInfo, msg, args...)
+}
+
+// InfoContext calls Logger.InfoContext on the default logger.
+func InfoContext(ctx context.Context, msg string, args ...any) {
+	Default().log(ctx, LevelInfo, msg, args...)
+}
+
+// Warn calls Logger.Warn on the default logger.
+func Warn(msg string, args ...any) {
+	Default().log(context.Background(), LevelWarn, msg, args...)
+}
+
+// WarnContext calls Logger.WarnContext on the default logger.
+func WarnContext(ctx context.Context, msg string, args ...any) {
+	Default().log(ctx, LevelWarn, msg, args...)
+}
+
+// Error calls Logger.Error on the default logger.
+func Error(msg string, args ...any) {
+	Default().log(context.Background(), LevelError, msg, args...)
+}
+
+// ErrorContext calls Logger.ErrorContext on the default logger.
+func ErrorContext(ctx context.Context, msg string, args ...any) {
+	Default().log(ctx, LevelError, msg, args...)
+}
+
+// Log calls Logger.Log on the default logger.
+func Log(ctx context.Context, level Level, msg string, args ...any) {
+	Default().log(ctx, level, msg, args...)
+}
+
+// LogAttrs calls Logger.LogAttrs on the default logger.
+func LogAttrs(ctx context.Context, level Level, msg string, attrs ...Attr) {
+	Default().logAttrs(ctx, level, msg, attrs...)
+}
diff --git a/src/log/slog/logger_test.go b/src/log/slog/logger_test.go
new file mode 100644
index 0000000..2f5b319
--- /dev/null
+++ b/src/log/slog/logger_test.go
@@ -0,0 +1,573 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package slog
+
+import (
+	"bytes"
+	"context"
+	"internal/race"
+	"internal/testenv"
+	"io"
+	"log"
+	loginternal "log/internal"
+	"path/filepath"
+	"regexp"
+	"runtime"
+	"slices"
+	"strings"
+	"sync"
+	"testing"
+	"time"
+)
+
+const timeRE = `\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}(Z|[+-]\d{2}:\d{2})`
+
+func TestLogTextHandler(t *testing.T) {
+	ctx := context.Background()
+	var buf bytes.Buffer
+
+	l := New(NewTextHandler(&buf, nil))
+
+	check := func(want string) {
+		t.Helper()
+		if want != "" {
+			want = "time=" + timeRE + " " + want
+		}
+		checkLogOutput(t, buf.String(), want)
+		buf.Reset()
+	}
+
+	l.Info("msg", "a", 1, "b", 2)
+	check(`level=INFO msg=msg a=1 b=2`)
+
+	// By default, debug messages are not printed.
+	l.Debug("bg", Int("a", 1), "b", 2)
+	check("")
+
+	l.Warn("w", Duration("dur", 3*time.Second))
+	check(`level=WARN msg=w dur=3s`)
+
+	l.Error("bad", "a", 1)
+	check(`level=ERROR msg=bad a=1`)
+
+	l.Log(ctx, LevelWarn+1, "w", Int("a", 1), String("b", "two"))
+	check(`level=WARN\+1 msg=w a=1 b=two`)
+
+	l.LogAttrs(ctx, LevelInfo+1, "a b c", Int("a", 1), String("b", "two"))
+	check(`level=INFO\+1 msg="a b c" a=1 b=two`)
+
+	l.Info("info", "a", []Attr{Int("i", 1)})
+	check(`level=INFO msg=info a.i=1`)
+
+	l.Info("info", "a", GroupValue(Int("i", 1)))
+	check(`level=INFO msg=info a.i=1`)
+}
+
+func TestConnections(t *testing.T) {
+	var logbuf, slogbuf bytes.Buffer
+
+	// Revert any changes to the default logger. This is important because other
+	// tests might change the default logger using SetDefault. Also ensure we
+	// restore the default logger at the end of the test.
+	currentLogger := Default()
+	SetDefault(New(newDefaultHandler(loginternal.DefaultOutput)))
+	t.Cleanup(func() {
+		SetDefault(currentLogger)
+	})
+
+	// The default slog.Logger's handler uses the log package's default output.
+	log.SetOutput(&logbuf)
+	log.SetFlags(log.Lshortfile &^ log.LstdFlags)
+	Info("msg", "a", 1)
+	checkLogOutput(t, logbuf.String(), `logger_test.go:\d+: INFO msg a=1`)
+	logbuf.Reset()
+	Warn("msg", "b", 2)
+	checkLogOutput(t, logbuf.String(), `logger_test.go:\d+: WARN msg b=2`)
+	logbuf.Reset()
+	Error("msg", "err", io.EOF, "c", 3)
+	checkLogOutput(t, logbuf.String(), `logger_test.go:\d+: ERROR msg err=EOF c=3`)
+
+	// Levels below Info are not printed.
+	logbuf.Reset()
+	Debug("msg", "c", 3)
+	checkLogOutput(t, logbuf.String(), "")
+
+	t.Run("wrap default handler", func(t *testing.T) {
+		// It should be possible to wrap the default handler and get the right output.
+		// This works because the default handler uses the pc in the Record
+		// to get the source line, rather than a call depth.
+		logger := New(wrappingHandler{Default().Handler()})
+		logger.Info("msg", "d", 4)
+		checkLogOutput(t, logbuf.String(), `logger_test.go:\d+: INFO msg d=4`)
+	})
+
+	// Once slog.SetDefault is called, the direction is reversed: the default
+	// log.Logger's output goes through the handler.
+	SetDefault(New(NewTextHandler(&slogbuf, &HandlerOptions{AddSource: true})))
+	log.Print("msg2")
+	checkLogOutput(t, slogbuf.String(), "time="+timeRE+` level=INFO source=.*logger_test.go:\d{3}"? msg=msg2`)
+
+	// The default log.Logger always outputs at Info level.
+	slogbuf.Reset()
+	SetDefault(New(NewTextHandler(&slogbuf, &HandlerOptions{Level: LevelWarn})))
+	log.Print("should not appear")
+	if got := slogbuf.String(); got != "" {
+		t.Errorf("got %q, want empty", got)
+	}
+
+	// Setting log's output again breaks the connection.
+	logbuf.Reset()
+	slogbuf.Reset()
+	log.SetOutput(&logbuf)
+	log.SetFlags(log.Lshortfile &^ log.LstdFlags)
+	log.Print("msg3")
+	checkLogOutput(t, logbuf.String(), `logger_test.go:\d+: msg3`)
+	if got := slogbuf.String(); got != "" {
+		t.Errorf("got %q, want empty", got)
+	}
+}
+
+type wrappingHandler struct {
+	h Handler
+}
+
+func (h wrappingHandler) Enabled(ctx context.Context, level Level) bool {
+	return h.h.Enabled(ctx, level)
+}
+func (h wrappingHandler) WithGroup(name string) Handler              { return h.h.WithGroup(name) }
+func (h wrappingHandler) WithAttrs(as []Attr) Handler                { return h.h.WithAttrs(as) }
+func (h wrappingHandler) Handle(ctx context.Context, r Record) error { return h.h.Handle(ctx, r) }
+
+func TestAttrs(t *testing.T) {
+	check := func(got []Attr, want ...Attr) {
+		t.Helper()
+		if !attrsEqual(got, want) {
+			t.Errorf("got %v, want %v", got, want)
+		}
+	}
+
+	l1 := New(&captureHandler{}).With("a", 1)
+	l2 := New(l1.Handler()).With("b", 2)
+	l2.Info("m", "c", 3)
+	h := l2.Handler().(*captureHandler)
+	check(h.attrs, Int("a", 1), Int("b", 2))
+	check(attrsSlice(h.r), Int("c", 3))
+}
+
+func TestCallDepth(t *testing.T) {
+	ctx := context.Background()
+	h := &captureHandler{}
+	var startLine int
+
+	check := func(count int) {
+		t.Helper()
+		const wantFunc = "log/slog.TestCallDepth"
+		const wantFile = "logger_test.go"
+		wantLine := startLine + count*2
+		got := h.r.source()
+		gotFile := filepath.Base(got.File)
+		if got.Function != wantFunc || gotFile != wantFile || got.Line != wantLine {
+			t.Errorf("got (%s, %s, %d), want (%s, %s, %d)",
+				got.Function, gotFile, got.Line, wantFunc, wantFile, wantLine)
+		}
+	}
+
+	logger := New(h)
+	SetDefault(logger)
+
+	// Calls to check must be one line apart.
+	// Determine line where calls start.
+	f, _ := runtime.CallersFrames([]uintptr{callerPC(2)}).Next()
+	startLine = f.Line + 4
+	// Do not change the number of lines between here and the call to check(0).
+
+	logger.Log(ctx, LevelInfo, "")
+	check(0)
+	logger.LogAttrs(ctx, LevelInfo, "")
+	check(1)
+	logger.Debug("")
+	check(2)
+	logger.Info("")
+	check(3)
+	logger.Warn("")
+	check(4)
+	logger.Error("")
+	check(5)
+	Debug("")
+	check(6)
+	Info("")
+	check(7)
+	Warn("")
+	check(8)
+	Error("")
+	check(9)
+	Log(ctx, LevelInfo, "")
+	check(10)
+	LogAttrs(ctx, LevelInfo, "")
+	check(11)
+}
+
+func TestAlloc(t *testing.T) {
+	ctx := context.Background()
+	dl := New(discardHandler{})
+	defer SetDefault(Default()) // restore
+	SetDefault(dl)
+
+	t.Run("Info", func(t *testing.T) {
+		wantAllocs(t, 0, func() { Info("hello") })
+	})
+	t.Run("Error", func(t *testing.T) {
+		wantAllocs(t, 0, func() { Error("hello") })
+	})
+	t.Run("logger.Info", func(t *testing.T) {
+		wantAllocs(t, 0, func() { dl.Info("hello") })
+	})
+	t.Run("logger.Log", func(t *testing.T) {
+		wantAllocs(t, 0, func() { dl.Log(ctx, LevelDebug, "hello") })
+	})
+	t.Run("2 pairs", func(t *testing.T) {
+		s := "abc"
+		i := 2000
+		wantAllocs(t, 2, func() {
+			dl.Info("hello",
+				"n", i,
+				"s", s,
+			)
+		})
+	})
+	t.Run("2 pairs disabled inline", func(t *testing.T) {
+		l := New(discardHandler{disabled: true})
+		s := "abc"
+		i := 2000
+		wantAllocs(t, 2, func() {
+			l.Log(ctx, LevelInfo, "hello",
+				"n", i,
+				"s", s,
+			)
+		})
+	})
+	t.Run("2 pairs disabled", func(t *testing.T) {
+		l := New(discardHandler{disabled: true})
+		s := "abc"
+		i := 2000
+		wantAllocs(t, 0, func() {
+			if l.Enabled(ctx, LevelInfo) {
+				l.Log(ctx, LevelInfo, "hello",
+					"n", i,
+					"s", s,
+				)
+			}
+		})
+	})
+	t.Run("9 kvs", func(t *testing.T) {
+		s := "abc"
+		i := 2000
+		d := time.Second
+		wantAllocs(t, 11, func() {
+			dl.Info("hello",
+				"n", i, "s", s, "d", d,
+				"n", i, "s", s, "d", d,
+				"n", i, "s", s, "d", d)
+		})
+	})
+	t.Run("pairs", func(t *testing.T) {
+		wantAllocs(t, 0, func() { dl.Info("", "error", io.EOF) })
+	})
+	t.Run("attrs1", func(t *testing.T) {
+		wantAllocs(t, 0, func() { dl.LogAttrs(ctx, LevelInfo, "", Int("a", 1)) })
+		wantAllocs(t, 0, func() { dl.LogAttrs(ctx, LevelInfo, "", Any("error", io.EOF)) })
+	})
+	t.Run("attrs3", func(t *testing.T) {
+		wantAllocs(t, 0, func() {
+			dl.LogAttrs(ctx, LevelInfo, "hello", Int("a", 1), String("b", "two"), Duration("c", time.Second))
+		})
+	})
+	t.Run("attrs3 disabled", func(t *testing.T) {
+		logger := New(discardHandler{disabled: true})
+		wantAllocs(t, 0, func() {
+			logger.LogAttrs(ctx, LevelInfo, "hello", Int("a", 1), String("b", "two"), Duration("c", time.Second))
+		})
+	})
+	t.Run("attrs6", func(t *testing.T) {
+		wantAllocs(t, 1, func() {
+			dl.LogAttrs(ctx, LevelInfo, "hello",
+				Int("a", 1), String("b", "two"), Duration("c", time.Second),
+				Int("d", 1), String("e", "two"), Duration("f", time.Second))
+		})
+	})
+	t.Run("attrs9", func(t *testing.T) {
+		wantAllocs(t, 1, func() {
+			dl.LogAttrs(ctx, LevelInfo, "hello",
+				Int("a", 1), String("b", "two"), Duration("c", time.Second),
+				Int("d", 1), String("e", "two"), Duration("f", time.Second),
+				Int("d", 1), String("e", "two"), Duration("f", time.Second))
+		})
+	})
+}
+
+func TestSetAttrs(t *testing.T) {
+	for _, test := range []struct {
+		args []any
+		want []Attr
+	}{
+		{nil, nil},
+		{[]any{"a", 1}, []Attr{Int("a", 1)}},
+		{[]any{"a", 1, "b", "two"}, []Attr{Int("a", 1), String("b", "two")}},
+		{[]any{"a"}, []Attr{String(badKey, "a")}},
+		{[]any{"a", 1, "b"}, []Attr{Int("a", 1), String(badKey, "b")}},
+		{[]any{"a", 1, 2, 3}, []Attr{Int("a", 1), Int(badKey, 2), Int(badKey, 3)}},
+	} {
+		r := NewRecord(time.Time{}, 0, "", 0)
+		r.Add(test.args...)
+		got := attrsSlice(r)
+		if !attrsEqual(got, test.want) {
+			t.Errorf("%v:\ngot  %v\nwant %v", test.args, got, test.want)
+		}
+	}
+}
+
+func TestSetDefault(t *testing.T) {
+	// Verify that setting the default to itself does not result in deadlock.
+	ctx, cancel := context.WithTimeout(context.Background(), time.Second)
+	defer cancel()
+	defer func(w io.Writer) { log.SetOutput(w) }(log.Writer())
+	log.SetOutput(io.Discard)
+	go func() {
+		Info("A")
+		SetDefault(Default())
+		Info("B")
+		cancel()
+	}()
+	<-ctx.Done()
+	if err := ctx.Err(); err != context.Canceled {
+		t.Errorf("wanted canceled, got %v", err)
+	}
+}
+
+func TestLoggerError(t *testing.T) {
+	var buf bytes.Buffer
+
+	removeTime := func(_ []string, a Attr) Attr {
+		if a.Key == TimeKey {
+			return Attr{}
+		}
+		return a
+	}
+	l := New(NewTextHandler(&buf, &HandlerOptions{ReplaceAttr: removeTime}))
+	l.Error("msg", "err", io.EOF, "a", 1)
+	checkLogOutput(t, buf.String(), `level=ERROR msg=msg err=EOF a=1`)
+	buf.Reset()
+	// use local var 'args' to defeat vet check
+	args := []any{"err", io.EOF, "a"}
+	l.Error("msg", args...)
+	checkLogOutput(t, buf.String(), `level=ERROR msg=msg err=EOF !BADKEY=a`)
+}
+
+func TestNewLogLogger(t *testing.T) {
+	var buf bytes.Buffer
+	h := NewTextHandler(&buf, nil)
+	ll := NewLogLogger(h, LevelWarn)
+	ll.Print("hello")
+	checkLogOutput(t, buf.String(), "time="+timeRE+` level=WARN msg=hello`)
+}
+
+func TestLoggerNoOps(t *testing.T) {
+	l := Default()
+	if l.With() != l {
+		t.Error("wanted receiver, didn't get it")
+	}
+	if With() != l {
+		t.Error("wanted receiver, didn't get it")
+	}
+	if l.WithGroup("") != l {
+		t.Error("wanted receiver, didn't get it")
+	}
+}
+
+func TestContext(t *testing.T) {
+	// Verify that the context argument to log output methods is passed to the handler.
+	// Also check the level.
+	h := &captureHandler{}
+	l := New(h)
+	defer SetDefault(Default()) // restore
+	SetDefault(l)
+
+	for _, test := range []struct {
+		f         func(context.Context, string, ...any)
+		wantLevel Level
+	}{
+		{l.DebugContext, LevelDebug},
+		{l.InfoContext, LevelInfo},
+		{l.WarnContext, LevelWarn},
+		{l.ErrorContext, LevelError},
+		{DebugContext, LevelDebug},
+		{InfoContext, LevelInfo},
+		{WarnContext, LevelWarn},
+		{ErrorContext, LevelError},
+	} {
+		h.clear()
+		ctx := context.WithValue(context.Background(), "L", test.wantLevel)
+
+		test.f(ctx, "msg")
+		if gv := h.ctx.Value("L"); gv != test.wantLevel || h.r.Level != test.wantLevel {
+			t.Errorf("got context value %v, level %s; want %s for both", gv, h.r.Level, test.wantLevel)
+		}
+	}
+}
+
+func checkLogOutput(t *testing.T, got, wantRegexp string) {
+	t.Helper()
+	got = clean(got)
+	wantRegexp = "^" + wantRegexp + "$"
+	matched, err := regexp.MatchString(wantRegexp, got)
+	if err != nil {
+		t.Fatal(err)
+	}
+	if !matched {
+		t.Errorf("\ngot  %s\nwant %s", got, wantRegexp)
+	}
+}
+
+// clean prepares log output for comparison.
+func clean(s string) string {
+	if len(s) > 0 && s[len(s)-1] == '\n' {
+		s = s[:len(s)-1]
+	}
+	return strings.ReplaceAll(s, "\n", "~")
+}
+
+type captureHandler struct {
+	mu     sync.Mutex
+	ctx    context.Context
+	r      Record
+	attrs  []Attr
+	groups []string
+}
+
+func (h *captureHandler) Handle(ctx context.Context, r Record) error {
+	h.mu.Lock()
+	defer h.mu.Unlock()
+	h.ctx = ctx
+	h.r = r
+	return nil
+}
+
+func (*captureHandler) Enabled(context.Context, Level) bool { return true }
+
+func (c *captureHandler) WithAttrs(as []Attr) Handler {
+	c.mu.Lock()
+	defer c.mu.Unlock()
+	var c2 captureHandler
+	c2.r = c.r
+	c2.groups = c.groups
+	c2.attrs = concat(c.attrs, as)
+	return &c2
+}
+
+func (c *captureHandler) WithGroup(name string) Handler {
+	c.mu.Lock()
+	defer c.mu.Unlock()
+	var c2 captureHandler
+	c2.r = c.r
+	c2.attrs = c.attrs
+	c2.groups = append(slices.Clip(c.groups), name)
+	return &c2
+}
+
+func (c *captureHandler) clear() {
+	c.mu.Lock()
+	defer c.mu.Unlock()
+	c.ctx = nil
+	c.r = Record{}
+}
+
+type discardHandler struct {
+	disabled bool
+	attrs    []Attr
+}
+
+func (d discardHandler) Enabled(context.Context, Level) bool { return !d.disabled }
+func (discardHandler) Handle(context.Context, Record) error  { return nil }
+func (d discardHandler) WithAttrs(as []Attr) Handler {
+	d.attrs = concat(d.attrs, as)
+	return d
+}
+func (h discardHandler) WithGroup(name string) Handler {
+	return h
+}
+
+// concat returns a new slice with the elements of s1 followed
+// by those of s2. The slice has no additional capacity.
+func concat[T any](s1, s2 []T) []T {
+	s := make([]T, len(s1)+len(s2))
+	copy(s, s1)
+	copy(s[len(s1):], s2)
+	return s
+}
+
+// This is a simple benchmark. See the benchmarks subdirectory for more extensive ones.
+func BenchmarkNopLog(b *testing.B) {
+	ctx := context.Background()
+	l := New(&captureHandler{})
+	b.Run("no attrs", func(b *testing.B) {
+		b.ReportAllocs()
+		for i := 0; i < b.N; i++ {
+			l.LogAttrs(ctx, LevelInfo, "msg")
+		}
+	})
+	b.Run("attrs", func(b *testing.B) {
+		b.ReportAllocs()
+		for i := 0; i < b.N; i++ {
+			l.LogAttrs(ctx, LevelInfo, "msg", Int("a", 1), String("b", "two"), Bool("c", true))
+		}
+	})
+	b.Run("attrs-parallel", func(b *testing.B) {
+		b.ReportAllocs()
+		b.RunParallel(func(pb *testing.PB) {
+			for pb.Next() {
+				l.LogAttrs(ctx, LevelInfo, "msg", Int("a", 1), String("b", "two"), Bool("c", true))
+			}
+		})
+	})
+	b.Run("keys-values", func(b *testing.B) {
+		b.ReportAllocs()
+		for i := 0; i < b.N; i++ {
+			l.Log(ctx, LevelInfo, "msg", "a", 1, "b", "two", "c", true)
+		}
+	})
+	b.Run("WithContext", func(b *testing.B) {
+		b.ReportAllocs()
+		for i := 0; i < b.N; i++ {
+			l.LogAttrs(ctx, LevelInfo, "msg2", Int("a", 1), String("b", "two"), Bool("c", true))
+		}
+	})
+	b.Run("WithContext-parallel", func(b *testing.B) {
+		b.ReportAllocs()
+		b.RunParallel(func(pb *testing.PB) {
+			for pb.Next() {
+				l.LogAttrs(ctx, LevelInfo, "msg", Int("a", 1), String("b", "two"), Bool("c", true))
+			}
+		})
+	})
+}
+
+// callerPC returns the program counter at the given stack depth.
+func callerPC(depth int) uintptr {
+	var pcs [1]uintptr
+	runtime.Callers(depth, pcs[:])
+	return pcs[0]
+}
+
+func wantAllocs(t *testing.T, want int, f func()) {
+	if race.Enabled {
+		t.Skip("skipping test in race mode")
+	}
+	testenv.SkipIfOptimizationOff(t)
+	t.Helper()
+	got := int(testing.AllocsPerRun(5, f))
+	if got != want {
+		t.Errorf("got %d allocs, want %d", got, want)
+	}
+}
diff --git a/src/log/slog/record.go b/src/log/slog/record.go
new file mode 100644
index 0000000..67b76f3
--- /dev/null
+++ b/src/log/slog/record.go
@@ -0,0 +1,225 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package slog
+
+import (
+	"runtime"
+	"slices"
+	"time"
+)
+
+const nAttrsInline = 5
+
+// A Record holds information about a log event.
+// Copies of a Record share state.
+// Do not modify a Record after handing out a copy to it.
+// Call [NewRecord] to create a new Record.
+// Use [Record.Clone] to create a copy with no shared state.
+type Record struct {
+	// The time at which the output method (Log, Info, etc.) was called.
+	Time time.Time
+
+	// The log message.
+	Message string
+
+	// The level of the event.
+	Level Level
+
+	// The program counter at the time the record was constructed, as determined
+	// by runtime.Callers. If zero, no program counter is available.
+	//
+	// The only valid use for this value is as an argument to
+	// [runtime.CallersFrames]. In particular, it must not be passed to
+	// [runtime.FuncForPC].
+	PC uintptr
+
+	// Allocation optimization: an inline array sized to hold
+	// the majority of log calls (based on examination of open-source
+	// code). It holds the start of the list of Attrs.
+	front [nAttrsInline]Attr
+
+	// The number of Attrs in front.
+	nFront int
+
+	// The list of Attrs except for those in front.
+	// Invariants:
+	//   - len(back) > 0 iff nFront == len(front)
+	//   - Unused array elements are zero. Used to detect mistakes.
+	back []Attr
+}
+
+// NewRecord creates a Record from the given arguments.
+// Use [Record.AddAttrs] to add attributes to the Record.
+//
+// NewRecord is intended for logging APIs that want to support a [Handler] as
+// a backend.
+func NewRecord(t time.Time, level Level, msg string, pc uintptr) Record {
+	return Record{
+		Time:    t,
+		Message: msg,
+		Level:   level,
+		PC:      pc,
+	}
+}
+
+// Clone returns a copy of the record with no shared state.
+// The original record and the clone can both be modified
+// without interfering with each other.
+func (r Record) Clone() Record {
+	r.back = slices.Clip(r.back) // prevent append from mutating shared array
+	return r
+}
+
+// NumAttrs returns the number of attributes in the Record.
+func (r Record) NumAttrs() int {
+	return r.nFront + len(r.back)
+}
+
+// Attrs calls f on each Attr in the Record.
+// Iteration stops if f returns false.
+func (r Record) Attrs(f func(Attr) bool) {
+	for i := 0; i < r.nFront; i++ {
+		if !f(r.front[i]) {
+			return
+		}
+	}
+	for _, a := range r.back {
+		if !f(a) {
+			return
+		}
+	}
+}
+
+// AddAttrs appends the given Attrs to the Record's list of Attrs.
+// It omits empty groups.
+func (r *Record) AddAttrs(attrs ...Attr) {
+	var i int
+	for i = 0; i < len(attrs) && r.nFront < len(r.front); i++ {
+		a := attrs[i]
+		if a.Value.isEmptyGroup() {
+			continue
+		}
+		r.front[r.nFront] = a
+		r.nFront++
+	}
+	// Check if a copy was modified by slicing past the end
+	// and seeing if the Attr there is non-zero.
+	if cap(r.back) > len(r.back) {
+		end := r.back[:len(r.back)+1][len(r.back)]
+		if !end.isEmpty() {
+			panic("copies of a slog.Record were both modified")
+		}
+	}
+	ne := countEmptyGroups(attrs[i:])
+	r.back = slices.Grow(r.back, len(attrs[i:])-ne)
+	for _, a := range attrs[i:] {
+		if !a.Value.isEmptyGroup() {
+			r.back = append(r.back, a)
+		}
+	}
+}
+
+// Add converts the args to Attrs as described in [Logger.Log],
+// then appends the Attrs to the Record's list of Attrs.
+// It omits empty groups.
+func (r *Record) Add(args ...any) {
+	var a Attr
+	for len(args) > 0 {
+		a, args = argsToAttr(args)
+		if a.Value.isEmptyGroup() {
+			continue
+		}
+		if r.nFront < len(r.front) {
+			r.front[r.nFront] = a
+			r.nFront++
+		} else {
+			if r.back == nil {
+				r.back = make([]Attr, 0, countAttrs(args))
+			}
+			r.back = append(r.back, a)
+		}
+	}
+
+}
+
+// countAttrs returns the number of Attrs that would be created from args.
+func countAttrs(args []any) int {
+	n := 0
+	for i := 0; i < len(args); i++ {
+		n++
+		if _, ok := args[i].(string); ok {
+			i++
+		}
+	}
+	return n
+}
+
+const badKey = "!BADKEY"
+
+// argsToAttr turns a prefix of the nonempty args slice into an Attr
+// and returns the unconsumed portion of the slice.
+// If args[0] is an Attr, it returns it.
+// If args[0] is a string, it treats the first two elements as
+// a key-value pair.
+// Otherwise, it treats args[0] as a value with a missing key.
+func argsToAttr(args []any) (Attr, []any) {
+	switch x := args[0].(type) {
+	case string:
+		if len(args) == 1 {
+			return String(badKey, x), nil
+		}
+		return Any(x, args[1]), args[2:]
+
+	case Attr:
+		return x, args[1:]
+
+	default:
+		return Any(badKey, x), args[1:]
+	}
+}
+
+// Source describes the location of a line of source code.
+type Source struct {
+	// Function is the package path-qualified function name containing the
+	// source line. If non-empty, this string uniquely identifies a single
+	// function in the program. This may be the empty string if not known.
+	Function string `json:"function"`
+	// File and Line are the file name and line number (1-based) of the source
+	// line. These may be the empty string and zero, respectively, if not known.
+	File string `json:"file"`
+	Line int    `json:"line"`
+}
+
+// attrs returns the non-zero fields of s as a slice of attrs.
+// It is similar to a LogValue method, but we don't want Source
+// to implement LogValuer because it would be resolved before
+// the ReplaceAttr function was called.
+func (s *Source) group() Value {
+	var as []Attr
+	if s.Function != "" {
+		as = append(as, String("function", s.Function))
+	}
+	if s.File != "" {
+		as = append(as, String("file", s.File))
+	}
+	if s.Line != 0 {
+		as = append(as, Int("line", s.Line))
+	}
+	return GroupValue(as...)
+}
+
+// source returns a Source for the log event.
+// If the Record was created without the necessary information,
+// or if the location is unavailable, it returns a non-nil *Source
+// with zero fields.
+func (r Record) source() *Source {
+	fs := runtime.CallersFrames([]uintptr{r.PC})
+	f, _ := fs.Next()
+	return &Source{
+		Function: f.Function,
+		File:     f.File,
+		Line:     f.Line,
+	}
+}
diff --git a/src/log/slog/record_test.go b/src/log/slog/record_test.go
new file mode 100644
index 0000000..15d9330
--- /dev/null
+++ b/src/log/slog/record_test.go
@@ -0,0 +1,156 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package slog
+
+import (
+	"slices"
+	"strconv"
+	"strings"
+	"testing"
+	"time"
+)
+
+func TestRecordAttrs(t *testing.T) {
+	as := []Attr{Int("k1", 1), String("k2", "foo"), Int("k3", 3),
+		Int64("k4", -1), Float64("f", 3.1), Uint64("u", 999)}
+	r := newRecordWithAttrs(as)
+	if g, w := r.NumAttrs(), len(as); g != w {
+		t.Errorf("NumAttrs: got %d, want %d", g, w)
+	}
+	if got := attrsSlice(r); !attrsEqual(got, as) {
+		t.Errorf("got %v, want %v", got, as)
+	}
+
+	// Early return.
+	// Hit both loops in Record.Attrs: front and back.
+	for _, stop := range []int{2, 6} {
+		var got []Attr
+		r.Attrs(func(a Attr) bool {
+			got = append(got, a)
+			return len(got) < stop
+		})
+		want := as[:stop]
+		if !attrsEqual(got, want) {
+			t.Errorf("got %v, want %v", got, want)
+		}
+	}
+}
+
+func TestRecordSource(t *testing.T) {
+	// Zero call depth => empty *Source.
+	for _, test := range []struct {
+		depth            int
+		wantFunction     string
+		wantFile         string
+		wantLinePositive bool
+	}{
+		{0, "", "", false},
+		{-16, "", "", false},
+		{1, "log/slog.TestRecordSource", "record_test.go", true}, // 1: caller of NewRecord
+		{2, "testing.tRunner", "testing.go", true},
+	} {
+		var pc uintptr
+		if test.depth > 0 {
+			pc = callerPC(test.depth + 1)
+		}
+		r := NewRecord(time.Time{}, 0, "", pc)
+		got := r.source()
+		if i := strings.LastIndexByte(got.File, '/'); i >= 0 {
+			got.File = got.File[i+1:]
+		}
+		if got.Function != test.wantFunction || got.File != test.wantFile || (got.Line > 0) != test.wantLinePositive {
+			t.Errorf("depth %d: got (%q, %q, %d), want (%q, %q, %t)",
+				test.depth,
+				got.Function, got.File, got.Line,
+				test.wantFunction, test.wantFile, test.wantLinePositive)
+		}
+	}
+}
+
+func TestAliasingAndClone(t *testing.T) {
+	intAttrs := func(from, to int) []Attr {
+		var as []Attr
+		for i := from; i < to; i++ {
+			as = append(as, Int("k", i))
+		}
+		return as
+	}
+
+	check := func(r Record, want []Attr) {
+		t.Helper()
+		got := attrsSlice(r)
+		if !attrsEqual(got, want) {
+			t.Errorf("got %v, want %v", got, want)
+		}
+	}
+
+	// Create a record whose Attrs overflow the inline array,
+	// creating a slice in r.back.
+	r1 := NewRecord(time.Time{}, 0, "", 0)
+	r1.AddAttrs(intAttrs(0, nAttrsInline+1)...)
+	// Ensure that r1.back's capacity exceeds its length.
+	b := make([]Attr, len(r1.back), len(r1.back)+1)
+	copy(b, r1.back)
+	r1.back = b
+	// Make a copy that shares state.
+	r2 := r1
+	// Adding to both should panic.
+	r1.AddAttrs(Int("p", 0))
+	if !panics(func() { r2.AddAttrs(Int("p", 1)) }) {
+		t.Error("expected panic")
+	}
+	r1Attrs := attrsSlice(r1)
+	// Adding to a clone is fine.
+	r2 = r1.Clone()
+	check(r2, r1Attrs)
+	r2.AddAttrs(Int("p", 2))
+	check(r1, r1Attrs) // r1 is unchanged
+	check(r2, append(slices.Clip(r1Attrs), Int("p", 2)))
+}
+
+func newRecordWithAttrs(as []Attr) Record {
+	r := NewRecord(time.Now(), LevelInfo, "", 0)
+	r.AddAttrs(as...)
+	return r
+}
+
+func attrsSlice(r Record) []Attr {
+	s := make([]Attr, 0, r.NumAttrs())
+	r.Attrs(func(a Attr) bool { s = append(s, a); return true })
+	return s
+}
+
+func attrsEqual(as1, as2 []Attr) bool {
+	return slices.EqualFunc(as1, as2, Attr.Equal)
+}
+
+// Currently, pc(2) takes over 400ns, which is too expensive
+// to call it for every log message.
+func BenchmarkPC(b *testing.B) {
+	for depth := 0; depth < 5; depth++ {
+		b.Run(strconv.Itoa(depth), func(b *testing.B) {
+			b.ReportAllocs()
+			var x uintptr
+			for i := 0; i < b.N; i++ {
+				x = callerPC(depth)
+			}
+			_ = x
+		})
+	}
+}
+
+func BenchmarkRecord(b *testing.B) {
+	const nAttrs = nAttrsInline * 10
+	var a Attr
+
+	for i := 0; i < b.N; i++ {
+		r := NewRecord(time.Time{}, LevelInfo, "", 0)
+		for j := 0; j < nAttrs; j++ {
+			r.AddAttrs(Int("k", j))
+		}
+		r.Attrs(func(b Attr) bool { a = b; return true })
+	}
+	_ = a
+}
diff --git a/src/log/slog/slogtest_test.go b/src/log/slog/slogtest_test.go
new file mode 100644
index 0000000..4887cc8
--- /dev/null
+++ b/src/log/slog/slogtest_test.go
@@ -0,0 +1,104 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package slog_test
+
+import (
+	"bytes"
+	"encoding/json"
+	"fmt"
+	"io"
+	"log/slog"
+	"strings"
+	"testing"
+	"testing/slogtest"
+)
+
+func TestSlogtest(t *testing.T) {
+	for _, test := range []struct {
+		name  string
+		new   func(io.Writer) slog.Handler
+		parse func([]byte) (map[string]any, error)
+	}{
+		{"JSON", func(w io.Writer) slog.Handler { return slog.NewJSONHandler(w, nil) }, parseJSON},
+		{"Text", func(w io.Writer) slog.Handler { return slog.NewTextHandler(w, nil) }, parseText},
+	} {
+		t.Run(test.name, func(t *testing.T) {
+			var buf bytes.Buffer
+			h := test.new(&buf)
+			results := func() []map[string]any {
+				ms, err := parseLines(buf.Bytes(), test.parse)
+				if err != nil {
+					t.Fatal(err)
+				}
+				return ms
+			}
+			if err := slogtest.TestHandler(h, results); err != nil {
+				t.Fatal(err)
+			}
+		})
+	}
+}
+
+func parseLines(src []byte, parse func([]byte) (map[string]any, error)) ([]map[string]any, error) {
+	var records []map[string]any
+	for _, line := range bytes.Split(src, []byte{'\n'}) {
+		if len(line) == 0 {
+			continue
+		}
+		m, err := parse(line)
+		if err != nil {
+			return nil, fmt.Errorf("%s: %w", string(line), err)
+		}
+		records = append(records, m)
+	}
+	return records, nil
+}
+
+func parseJSON(bs []byte) (map[string]any, error) {
+	var m map[string]any
+	if err := json.Unmarshal(bs, &m); err != nil {
+		return nil, err
+	}
+	return m, nil
+}
+
+// parseText parses the output of a single call to TextHandler.Handle.
+// It can parse the output of the tests in this package,
+// but it doesn't handle quoted keys or values.
+// It doesn't need to handle all cases, because slogtest deliberately
+// uses simple inputs so handler writers can focus on testing
+// handler behavior, not parsing.
+func parseText(bs []byte) (map[string]any, error) {
+	top := map[string]any{}
+	s := string(bytes.TrimSpace(bs))
+	for len(s) > 0 {
+		kv, rest, _ := strings.Cut(s, " ") // assumes exactly one space between attrs
+		k, value, found := strings.Cut(kv, "=")
+		if !found {
+			return nil, fmt.Errorf("no '=' in %q", kv)
+		}
+		keys := strings.Split(k, ".")
+		// Populate a tree of maps for a dotted path such as "a.b.c=x".
+		m := top
+		for _, key := range keys[:len(keys)-1] {
+			x, ok := m[key]
+			var m2 map[string]any
+			if !ok {
+				m2 = map[string]any{}
+				m[key] = m2
+			} else {
+				m2, ok = x.(map[string]any)
+				if !ok {
+					return nil, fmt.Errorf("value for %q in composite key %q is not map[string]any", key, k)
+
+				}
+			}
+			m = m2
+		}
+		m[keys[len(keys)-1]] = value
+		s = rest
+	}
+	return top, nil
+}
diff --git a/src/log/slog/text_handler.go b/src/log/slog/text_handler.go
new file mode 100644
index 0000000..58edb2f6
--- /dev/null
+++ b/src/log/slog/text_handler.go
@@ -0,0 +1,163 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package slog
+
+import (
+	"context"
+	"encoding"
+	"fmt"
+	"io"
+	"reflect"
+	"strconv"
+	"sync"
+	"unicode"
+	"unicode/utf8"
+)
+
+// TextHandler is a Handler that writes Records to an io.Writer as a
+// sequence of key=value pairs separated by spaces and followed by a newline.
+type TextHandler struct {
+	*commonHandler
+}
+
+// NewTextHandler creates a TextHandler that writes to w,
+// using the given options.
+// If opts is nil, the default options are used.
+func NewTextHandler(w io.Writer, opts *HandlerOptions) *TextHandler {
+	if opts == nil {
+		opts = &HandlerOptions{}
+	}
+	return &TextHandler{
+		&commonHandler{
+			json: false,
+			w:    w,
+			opts: *opts,
+			mu:   &sync.Mutex{},
+		},
+	}
+}
+
+// Enabled reports whether the handler handles records at the given level.
+// The handler ignores records whose level is lower.
+func (h *TextHandler) Enabled(_ context.Context, level Level) bool {
+	return h.commonHandler.enabled(level)
+}
+
+// WithAttrs returns a new TextHandler whose attributes consists
+// of h's attributes followed by attrs.
+func (h *TextHandler) WithAttrs(attrs []Attr) Handler {
+	return &TextHandler{commonHandler: h.commonHandler.withAttrs(attrs)}
+}
+
+func (h *TextHandler) WithGroup(name string) Handler {
+	return &TextHandler{commonHandler: h.commonHandler.withGroup(name)}
+}
+
+// Handle formats its argument Record as a single line of space-separated
+// key=value items.
+//
+// If the Record's time is zero, the time is omitted.
+// Otherwise, the key is "time"
+// and the value is output in RFC3339 format with millisecond precision.
+//
+// If the Record's level is zero, the level is omitted.
+// Otherwise, the key is "level"
+// and the value of [Level.String] is output.
+//
+// If the AddSource option is set and source information is available,
+// the key is "source" and the value is output as FILE:LINE.
+//
+// The message's key is "msg".
+//
+// To modify these or other attributes, or remove them from the output, use
+// [HandlerOptions.ReplaceAttr].
+//
+// If a value implements [encoding.TextMarshaler], the result of MarshalText is
+// written. Otherwise, the result of fmt.Sprint is written.
+//
+// Keys and values are quoted with [strconv.Quote] if they contain Unicode space
+// characters, non-printing characters, '"' or '='.
+//
+// Keys inside groups consist of components (keys or group names) separated by
+// dots. No further escaping is performed.
+// Thus there is no way to determine from the key "a.b.c" whether there
+// are two groups "a" and "b" and a key "c", or a single group "a.b" and a key "c",
+// or single group "a" and a key "b.c".
+// If it is necessary to reconstruct the group structure of a key
+// even in the presence of dots inside components, use
+// [HandlerOptions.ReplaceAttr] to encode that information in the key.
+//
+// Each call to Handle results in a single serialized call to
+// io.Writer.Write.
+func (h *TextHandler) Handle(_ context.Context, r Record) error {
+	return h.commonHandler.handle(r)
+}
+
+func appendTextValue(s *handleState, v Value) error {
+	switch v.Kind() {
+	case KindString:
+		s.appendString(v.str())
+	case KindTime:
+		s.appendTime(v.time())
+	case KindAny:
+		if tm, ok := v.any.(encoding.TextMarshaler); ok {
+			data, err := tm.MarshalText()
+			if err != nil {
+				return err
+			}
+			// TODO: avoid the conversion to string.
+			s.appendString(string(data))
+			return nil
+		}
+		if bs, ok := byteSlice(v.any); ok {
+			// As of Go 1.19, this only allocates for strings longer than 32 bytes.
+			s.buf.WriteString(strconv.Quote(string(bs)))
+			return nil
+		}
+		s.appendString(fmt.Sprintf("%+v", v.Any()))
+	default:
+		*s.buf = v.append(*s.buf)
+	}
+	return nil
+}
+
+// byteSlice returns its argument as a []byte if the argument's
+// underlying type is []byte, along with a second return value of true.
+// Otherwise it returns nil, false.
+func byteSlice(a any) ([]byte, bool) {
+	if bs, ok := a.([]byte); ok {
+		return bs, true
+	}
+	// Like Printf's %s, we allow both the slice type and the byte element type to be named.
+	t := reflect.TypeOf(a)
+	if t != nil && t.Kind() == reflect.Slice && t.Elem().Kind() == reflect.Uint8 {
+		return reflect.ValueOf(a).Bytes(), true
+	}
+	return nil, false
+}
+
+func needsQuoting(s string) bool {
+	if len(s) == 0 {
+		return true
+	}
+	for i := 0; i < len(s); {
+		b := s[i]
+		if b < utf8.RuneSelf {
+			// Quote anything except a backslash that would need quoting in a
+			// JSON string, as well as space and '='
+			if b != '\\' && (b == ' ' || b == '=' || !safeSet[b]) {
+				return true
+			}
+			i++
+			continue
+		}
+		r, size := utf8.DecodeRuneInString(s[i:])
+		if r == utf8.RuneError || unicode.IsSpace(r) || !unicode.IsPrint(r) {
+			return true
+		}
+		i += size
+	}
+	return false
+}
diff --git a/src/log/slog/text_handler_test.go b/src/log/slog/text_handler_test.go
new file mode 100644
index 0000000..591c243
--- /dev/null
+++ b/src/log/slog/text_handler_test.go
@@ -0,0 +1,176 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package slog
+
+import (
+	"bytes"
+	"context"
+	"errors"
+	"fmt"
+	"internal/testenv"
+	"io"
+	"strings"
+	"testing"
+	"time"
+)
+
+var testTime = time.Date(2000, 1, 2, 3, 4, 5, 0, time.UTC)
+
+func TestTextHandler(t *testing.T) {
+	for _, test := range []struct {
+		name             string
+		attr             Attr
+		wantKey, wantVal string
+	}{
+		{
+			"unquoted",
+			Int("a", 1),
+			"a", "1",
+		},
+		{
+			"quoted",
+			String("x = y", `qu"o`),
+			`"x = y"`, `"qu\"o"`,
+		},
+		{
+			"String method",
+			Any("name", name{"Ren", "Hoek"}),
+			`name`, `"Hoek, Ren"`,
+		},
+		{
+			"struct",
+			Any("x", &struct{ A, b int }{A: 1, b: 2}),
+			`x`, `"&{A:1 b:2}"`,
+		},
+		{
+			"TextMarshaler",
+			Any("t", text{"abc"}),
+			`t`, `"text{\"abc\"}"`,
+		},
+		{
+			"TextMarshaler error",
+			Any("t", text{""}),
+			`t`, `"!ERROR:text: empty string"`,
+		},
+		{
+			"nil value",
+			Any("a", nil),
+			`a`, `<nil>`,
+		},
+	} {
+		t.Run(test.name, func(t *testing.T) {
+			for _, opts := range []struct {
+				name       string
+				opts       HandlerOptions
+				wantPrefix string
+				modKey     func(string) string
+			}{
+				{
+					"none",
+					HandlerOptions{},
+					`time=2000-01-02T03:04:05.000Z level=INFO msg="a message"`,
+					func(s string) string { return s },
+				},
+				{
+					"replace",
+					HandlerOptions{ReplaceAttr: upperCaseKey},
+					`TIME=2000-01-02T03:04:05.000Z LEVEL=INFO MSG="a message"`,
+					strings.ToUpper,
+				},
+			} {
+				t.Run(opts.name, func(t *testing.T) {
+					var buf bytes.Buffer
+					h := NewTextHandler(&buf, &opts.opts)
+					r := NewRecord(testTime, LevelInfo, "a message", 0)
+					r.AddAttrs(test.attr)
+					if err := h.Handle(context.Background(), r); err != nil {
+						t.Fatal(err)
+					}
+					got := buf.String()
+					// Remove final newline.
+					got = got[:len(got)-1]
+					want := opts.wantPrefix + " " + opts.modKey(test.wantKey) + "=" + test.wantVal
+					if got != want {
+						t.Errorf("\ngot  %s\nwant %s", got, want)
+					}
+				})
+			}
+		})
+	}
+}
+
+// for testing fmt.Sprint
+type name struct {
+	First, Last string
+}
+
+func (n name) String() string { return n.Last + ", " + n.First }
+
+// for testing TextMarshaler
+type text struct {
+	s string
+}
+
+func (t text) String() string { return t.s } // should be ignored
+
+func (t text) MarshalText() ([]byte, error) {
+	if t.s == "" {
+		return nil, errors.New("text: empty string")
+	}
+	return []byte(fmt.Sprintf("text{%q}", t.s)), nil
+}
+
+func TestTextHandlerPreformatted(t *testing.T) {
+	var buf bytes.Buffer
+	var h Handler = NewTextHandler(&buf, nil)
+	h = h.WithAttrs([]Attr{Duration("dur", time.Minute), Bool("b", true)})
+	// Also test omitting time.
+	r := NewRecord(time.Time{}, 0 /* 0 Level is INFO */, "m", 0)
+	r.AddAttrs(Int("a", 1))
+	if err := h.Handle(context.Background(), r); err != nil {
+		t.Fatal(err)
+	}
+	got := strings.TrimSuffix(buf.String(), "\n")
+	want := `level=INFO msg=m dur=1m0s b=true a=1`
+	if got != want {
+		t.Errorf("got %s, want %s", got, want)
+	}
+}
+
+func TestTextHandlerAlloc(t *testing.T) {
+	testenv.SkipIfOptimizationOff(t)
+	r := NewRecord(time.Now(), LevelInfo, "msg", 0)
+	for i := 0; i < 10; i++ {
+		r.AddAttrs(Int("x = y", i))
+	}
+	var h Handler = NewTextHandler(io.Discard, nil)
+	wantAllocs(t, 0, func() { h.Handle(context.Background(), r) })
+
+	h = h.WithGroup("s")
+	r.AddAttrs(Group("g", Int("a", 1)))
+	wantAllocs(t, 0, func() { h.Handle(context.Background(), r) })
+}
+
+func TestNeedsQuoting(t *testing.T) {
+	for _, test := range []struct {
+		in   string
+		want bool
+	}{
+		{"", true},
+		{"ab", false},
+		{"a=b", true},
+		{`"ab"`, true},
+		{"\a\b", true},
+		{"a\tb", true},
+		{"µåπ", false},
+		{"a b", true},
+		{"badutf8\xF6", true},
+	} {
+		got := needsQuoting(test.in)
+		if got != test.want {
+			t.Errorf("%q: got %t, want %t", test.in, got, test.want)
+		}
+	}
+}
diff --git a/src/log/slog/value.go b/src/log/slog/value.go
new file mode 100644
index 0000000..224848f
--- /dev/null
+++ b/src/log/slog/value.go
@@ -0,0 +1,520 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package slog
+
+import (
+	"fmt"
+	"math"
+	"runtime"
+	"slices"
+	"strconv"
+	"strings"
+	"time"
+	"unsafe"
+)
+
+// A Value can represent any Go value, but unlike type any,
+// it can represent most small values without an allocation.
+// The zero Value corresponds to nil.
+type Value struct {
+	_ [0]func() // disallow ==
+	// num holds the value for Kinds Int64, Uint64, Float64, Bool and Duration,
+	// the string length for KindString, and nanoseconds since the epoch for KindTime.
+	num uint64
+	// If any is of type Kind, then the value is in num as described above.
+	// If any is of type *time.Location, then the Kind is Time and time.Time value
+	// can be constructed from the Unix nanos in num and the location (monotonic time
+	// is not preserved).
+	// If any is of type stringptr, then the Kind is String and the string value
+	// consists of the length in num and the pointer in any.
+	// Otherwise, the Kind is Any and any is the value.
+	// (This implies that Attrs cannot store values of type Kind, *time.Location
+	// or stringptr.)
+	any any
+}
+
+type (
+	stringptr *byte // used in Value.any when the Value is a string
+	groupptr  *Attr // used in Value.any when the Value is a []Attr
+)
+
+// Kind is the kind of a Value.
+type Kind int
+
+// The following list is sorted alphabetically, but it's also important that
+// KindAny is 0 so that a zero Value represents nil.
+
+const (
+	KindAny Kind = iota
+	KindBool
+	KindDuration
+	KindFloat64
+	KindInt64
+	KindString
+	KindTime
+	KindUint64
+	KindGroup
+	KindLogValuer
+)
+
+var kindStrings = []string{
+	"Any",
+	"Bool",
+	"Duration",
+	"Float64",
+	"Int64",
+	"String",
+	"Time",
+	"Uint64",
+	"Group",
+	"LogValuer",
+}
+
+func (k Kind) String() string {
+	if k >= 0 && int(k) < len(kindStrings) {
+		return kindStrings[k]
+	}
+	return "<unknown slog.Kind>"
+}
+
+// Unexported version of Kind, just so we can store Kinds in Values.
+// (No user-provided value has this type.)
+type kind Kind
+
+// Kind returns v's Kind.
+func (v Value) Kind() Kind {
+	switch x := v.any.(type) {
+	case Kind:
+		return x
+	case stringptr:
+		return KindString
+	case timeLocation:
+		return KindTime
+	case groupptr:
+		return KindGroup
+	case LogValuer:
+		return KindLogValuer
+	case kind: // a kind is just a wrapper for a Kind
+		return KindAny
+	default:
+		return KindAny
+	}
+}
+
+//////////////// Constructors
+
+// StringValue returns a new Value for a string.
+func StringValue(value string) Value {
+	return Value{num: uint64(len(value)), any: stringptr(unsafe.StringData(value))}
+}
+
+// IntValue returns a Value for an int.
+func IntValue(v int) Value {
+	return Int64Value(int64(v))
+}
+
+// Int64Value returns a Value for an int64.
+func Int64Value(v int64) Value {
+	return Value{num: uint64(v), any: KindInt64}
+}
+
+// Uint64Value returns a Value for a uint64.
+func Uint64Value(v uint64) Value {
+	return Value{num: v, any: KindUint64}
+}
+
+// Float64Value returns a Value for a floating-point number.
+func Float64Value(v float64) Value {
+	return Value{num: math.Float64bits(v), any: KindFloat64}
+}
+
+// BoolValue returns a Value for a bool.
+func BoolValue(v bool) Value {
+	u := uint64(0)
+	if v {
+		u = 1
+	}
+	return Value{num: u, any: KindBool}
+}
+
+// Unexported version of *time.Location, just so we can store *time.Locations in
+// Values. (No user-provided value has this type.)
+type timeLocation *time.Location
+
+// TimeValue returns a Value for a time.Time.
+// It discards the monotonic portion.
+func TimeValue(v time.Time) Value {
+	if v.IsZero() {
+		// UnixNano on the zero time is undefined, so represent the zero time
+		// with a nil *time.Location instead. time.Time.Location method never
+		// returns nil, so a Value with any == timeLocation(nil) cannot be
+		// mistaken for any other Value, time.Time or otherwise.
+		return Value{any: timeLocation(nil)}
+	}
+	return Value{num: uint64(v.UnixNano()), any: timeLocation(v.Location())}
+}
+
+// DurationValue returns a Value for a time.Duration.
+func DurationValue(v time.Duration) Value {
+	return Value{num: uint64(v.Nanoseconds()), any: KindDuration}
+}
+
+// GroupValue returns a new Value for a list of Attrs.
+// The caller must not subsequently mutate the argument slice.
+func GroupValue(as ...Attr) Value {
+	// Remove empty groups.
+	// It is simpler overall to do this at construction than
+	// to check each Group recursively for emptiness.
+	if n := countEmptyGroups(as); n > 0 {
+		as2 := make([]Attr, 0, len(as)-n)
+		for _, a := range as {
+			if !a.Value.isEmptyGroup() {
+				as2 = append(as2, a)
+			}
+		}
+		as = as2
+	}
+	return Value{num: uint64(len(as)), any: groupptr(unsafe.SliceData(as))}
+}
+
+// countEmptyGroups returns the number of empty group values in its argument.
+func countEmptyGroups(as []Attr) int {
+	n := 0
+	for _, a := range as {
+		if a.Value.isEmptyGroup() {
+			n++
+		}
+	}
+	return n
+}
+
+// AnyValue returns a Value for the supplied value.
+//
+// If the supplied value is of type Value, it is returned
+// unmodified.
+//
+// Given a value of one of Go's predeclared string, bool, or
+// (non-complex) numeric types, AnyValue returns a Value of kind
+// String, Bool, Uint64, Int64, or Float64. The width of the
+// original numeric type is not preserved.
+//
+// Given a time.Time or time.Duration value, AnyValue returns a Value of kind
+// KindTime or KindDuration. The monotonic time is not preserved.
+//
+// For nil, or values of all other types, including named types whose
+// underlying type is numeric, AnyValue returns a value of kind KindAny.
+func AnyValue(v any) Value {
+	switch v := v.(type) {
+	case string:
+		return StringValue(v)
+	case int:
+		return Int64Value(int64(v))
+	case uint:
+		return Uint64Value(uint64(v))
+	case int64:
+		return Int64Value(v)
+	case uint64:
+		return Uint64Value(v)
+	case bool:
+		return BoolValue(v)
+	case time.Duration:
+		return DurationValue(v)
+	case time.Time:
+		return TimeValue(v)
+	case uint8:
+		return Uint64Value(uint64(v))
+	case uint16:
+		return Uint64Value(uint64(v))
+	case uint32:
+		return Uint64Value(uint64(v))
+	case uintptr:
+		return Uint64Value(uint64(v))
+	case int8:
+		return Int64Value(int64(v))
+	case int16:
+		return Int64Value(int64(v))
+	case int32:
+		return Int64Value(int64(v))
+	case float64:
+		return Float64Value(v)
+	case float32:
+		return Float64Value(float64(v))
+	case []Attr:
+		return GroupValue(v...)
+	case Kind:
+		return Value{any: kind(v)}
+	case Value:
+		return v
+	default:
+		return Value{any: v}
+	}
+}
+
+//////////////// Accessors
+
+// Any returns v's value as an any.
+func (v Value) Any() any {
+	switch v.Kind() {
+	case KindAny:
+		if k, ok := v.any.(kind); ok {
+			return Kind(k)
+		}
+		return v.any
+	case KindLogValuer:
+		return v.any
+	case KindGroup:
+		return v.group()
+	case KindInt64:
+		return int64(v.num)
+	case KindUint64:
+		return v.num
+	case KindFloat64:
+		return v.float()
+	case KindString:
+		return v.str()
+	case KindBool:
+		return v.bool()
+	case KindDuration:
+		return v.duration()
+	case KindTime:
+		return v.time()
+	default:
+		panic(fmt.Sprintf("bad kind: %s", v.Kind()))
+	}
+}
+
+// String returns Value's value as a string, formatted like fmt.Sprint. Unlike
+// the methods Int64, Float64, and so on, which panic if v is of the
+// wrong kind, String never panics.
+func (v Value) String() string {
+	if sp, ok := v.any.(stringptr); ok {
+		return unsafe.String(sp, v.num)
+	}
+	var buf []byte
+	return string(v.append(buf))
+}
+
+func (v Value) str() string {
+	return unsafe.String(v.any.(stringptr), v.num)
+}
+
+// Int64 returns v's value as an int64. It panics
+// if v is not a signed integer.
+func (v Value) Int64() int64 {
+	if g, w := v.Kind(), KindInt64; g != w {
+		panic(fmt.Sprintf("Value kind is %s, not %s", g, w))
+	}
+	return int64(v.num)
+}
+
+// Uint64 returns v's value as a uint64. It panics
+// if v is not an unsigned integer.
+func (v Value) Uint64() uint64 {
+	if g, w := v.Kind(), KindUint64; g != w {
+		panic(fmt.Sprintf("Value kind is %s, not %s", g, w))
+	}
+	return v.num
+}
+
+// Bool returns v's value as a bool. It panics
+// if v is not a bool.
+func (v Value) Bool() bool {
+	if g, w := v.Kind(), KindBool; g != w {
+		panic(fmt.Sprintf("Value kind is %s, not %s", g, w))
+	}
+	return v.bool()
+}
+
+func (a Value) bool() bool {
+	return a.num == 1
+}
+
+// Duration returns v's value as a time.Duration. It panics
+// if v is not a time.Duration.
+func (a Value) Duration() time.Duration {
+	if g, w := a.Kind(), KindDuration; g != w {
+		panic(fmt.Sprintf("Value kind is %s, not %s", g, w))
+	}
+
+	return a.duration()
+}
+
+func (a Value) duration() time.Duration {
+	return time.Duration(int64(a.num))
+}
+
+// Float64 returns v's value as a float64. It panics
+// if v is not a float64.
+func (v Value) Float64() float64 {
+	if g, w := v.Kind(), KindFloat64; g != w {
+		panic(fmt.Sprintf("Value kind is %s, not %s", g, w))
+	}
+
+	return v.float()
+}
+
+func (a Value) float() float64 {
+	return math.Float64frombits(a.num)
+}
+
+// Time returns v's value as a time.Time. It panics
+// if v is not a time.Time.
+func (v Value) Time() time.Time {
+	if g, w := v.Kind(), KindTime; g != w {
+		panic(fmt.Sprintf("Value kind is %s, not %s", g, w))
+	}
+	return v.time()
+}
+
+func (v Value) time() time.Time {
+	loc := v.any.(timeLocation)
+	if loc == nil {
+		return time.Time{}
+	}
+	return time.Unix(0, int64(v.num)).In(loc)
+}
+
+// LogValuer returns v's value as a LogValuer. It panics
+// if v is not a LogValuer.
+func (v Value) LogValuer() LogValuer {
+	return v.any.(LogValuer)
+}
+
+// Group returns v's value as a []Attr.
+// It panics if v's Kind is not KindGroup.
+func (v Value) Group() []Attr {
+	if sp, ok := v.any.(groupptr); ok {
+		return unsafe.Slice((*Attr)(sp), v.num)
+	}
+	panic("Group: bad kind")
+}
+
+func (v Value) group() []Attr {
+	return unsafe.Slice((*Attr)(v.any.(groupptr)), v.num)
+}
+
+//////////////// Other
+
+// Equal reports whether v and w represent the same Go value.
+func (v Value) Equal(w Value) bool {
+	k1 := v.Kind()
+	k2 := w.Kind()
+	if k1 != k2 {
+		return false
+	}
+	switch k1 {
+	case KindInt64, KindUint64, KindBool, KindDuration:
+		return v.num == w.num
+	case KindString:
+		return v.str() == w.str()
+	case KindFloat64:
+		return v.float() == w.float()
+	case KindTime:
+		return v.time().Equal(w.time())
+	case KindAny, KindLogValuer:
+		return v.any == w.any // may panic if non-comparable
+	case KindGroup:
+		return slices.EqualFunc(v.group(), w.group(), Attr.Equal)
+	default:
+		panic(fmt.Sprintf("bad kind: %s", k1))
+	}
+}
+
+// isEmptyGroup reports whether v is a group that has no attributes.
+func (v Value) isEmptyGroup() bool {
+	if v.Kind() != KindGroup {
+		return false
+	}
+	// We do not need to recursively examine the group's Attrs for emptiness,
+	// because GroupValue removed them when the group was constructed, and
+	// groups are immutable.
+	return len(v.group()) == 0
+}
+
+// append appends a text representation of v to dst.
+// v is formatted as with fmt.Sprint.
+func (v Value) append(dst []byte) []byte {
+	switch v.Kind() {
+	case KindString:
+		return append(dst, v.str()...)
+	case KindInt64:
+		return strconv.AppendInt(dst, int64(v.num), 10)
+	case KindUint64:
+		return strconv.AppendUint(dst, v.num, 10)
+	case KindFloat64:
+		return strconv.AppendFloat(dst, v.float(), 'g', -1, 64)
+	case KindBool:
+		return strconv.AppendBool(dst, v.bool())
+	case KindDuration:
+		return append(dst, v.duration().String()...)
+	case KindTime:
+		return append(dst, v.time().String()...)
+	case KindGroup:
+		return fmt.Append(dst, v.group())
+	case KindAny, KindLogValuer:
+		return fmt.Append(dst, v.any)
+	default:
+		panic(fmt.Sprintf("bad kind: %s", v.Kind()))
+	}
+}
+
+// A LogValuer is any Go value that can convert itself into a Value for logging.
+//
+// This mechanism may be used to defer expensive operations until they are
+// needed, or to expand a single value into a sequence of components.
+type LogValuer interface {
+	LogValue() Value
+}
+
+const maxLogValues = 100
+
+// Resolve repeatedly calls LogValue on v while it implements LogValuer,
+// and returns the result.
+// If v resolves to a group, the group's attributes' values are not recursively
+// resolved.
+// If the number of LogValue calls exceeds a threshold, a Value containing an
+// error is returned.
+// Resolve's return value is guaranteed not to be of Kind KindLogValuer.
+func (v Value) Resolve() (rv Value) {
+	orig := v
+	defer func() {
+		if r := recover(); r != nil {
+			rv = AnyValue(fmt.Errorf("LogValue panicked\n%s", stack(3, 5)))
+		}
+	}()
+
+	for i := 0; i < maxLogValues; i++ {
+		if v.Kind() != KindLogValuer {
+			return v
+		}
+		v = v.LogValuer().LogValue()
+	}
+	err := fmt.Errorf("LogValue called too many times on Value of type %T", orig.Any())
+	return AnyValue(err)
+}
+
+func stack(skip, nFrames int) string {
+	pcs := make([]uintptr, nFrames+1)
+	n := runtime.Callers(skip+1, pcs)
+	if n == 0 {
+		return "(no stack)"
+	}
+	frames := runtime.CallersFrames(pcs[:n])
+	var b strings.Builder
+	i := 0
+	for {
+		frame, more := frames.Next()
+		fmt.Fprintf(&b, "called from %s (%s:%d)\n", frame.Function, frame.File, frame.Line)
+		if !more {
+			break
+		}
+		i++
+		if i >= nFrames {
+			fmt.Fprintf(&b, "(rest of stack elided)\n")
+			break
+		}
+	}
+	return b.String()
+}
diff --git a/src/log/slog/value_access_benchmark_test.go b/src/log/slog/value_access_benchmark_test.go
new file mode 100644
index 0000000..3bd7071
--- /dev/null
+++ b/src/log/slog/value_access_benchmark_test.go
@@ -0,0 +1,215 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Benchmark for accessing Value values.
+
+package slog
+
+import (
+	"testing"
+	"time"
+)
+
+// The "As" form is the slowest.
+// The switch-panic and visitor times are almost the same.
+// BenchmarkDispatch/switch-checked-8         	 8669427	       137.7 ns/op
+// BenchmarkDispatch/As-8                     	 8212087	       145.3 ns/op
+// BenchmarkDispatch/Visit-8                  	 8926146	       135.3 ns/op
+func BenchmarkDispatch(b *testing.B) {
+	vs := []Value{
+		Int64Value(32768),
+		Uint64Value(0xfacecafe),
+		StringValue("anything"),
+		BoolValue(true),
+		Float64Value(1.2345),
+		DurationValue(time.Second),
+		AnyValue(b),
+	}
+	var (
+		ii int64
+		s  string
+		bb bool
+		u  uint64
+		d  time.Duration
+		f  float64
+		a  any
+	)
+	b.Run("switch-checked", func(b *testing.B) {
+		for i := 0; i < b.N; i++ {
+			for _, v := range vs {
+				switch v.Kind() {
+				case KindString:
+					s = v.String()
+				case KindInt64:
+					ii = v.Int64()
+				case KindUint64:
+					u = v.Uint64()
+				case KindFloat64:
+					f = v.Float64()
+				case KindBool:
+					bb = v.Bool()
+				case KindDuration:
+					d = v.Duration()
+				case KindAny:
+					a = v.Any()
+				default:
+					panic("bad kind")
+				}
+			}
+		}
+		_ = ii
+		_ = s
+		_ = bb
+		_ = u
+		_ = d
+		_ = f
+		_ = a
+
+	})
+	b.Run("As", func(b *testing.B) {
+		for i := 0; i < b.N; i++ {
+			for _, kv := range vs {
+				if v, ok := kv.AsString(); ok {
+					s = v
+				} else if v, ok := kv.AsInt64(); ok {
+					ii = v
+				} else if v, ok := kv.AsUint64(); ok {
+					u = v
+				} else if v, ok := kv.AsFloat64(); ok {
+					f = v
+				} else if v, ok := kv.AsBool(); ok {
+					bb = v
+				} else if v, ok := kv.AsDuration(); ok {
+					d = v
+				} else if v, ok := kv.AsAny(); ok {
+					a = v
+				} else {
+					panic("bad kind")
+				}
+			}
+		}
+		_ = ii
+		_ = s
+		_ = bb
+		_ = u
+		_ = d
+		_ = f
+		_ = a
+	})
+
+	b.Run("Visit", func(b *testing.B) {
+		v := &setVisitor{}
+		b.ResetTimer()
+		for i := 0; i < b.N; i++ {
+			for _, kv := range vs {
+				kv.Visit(v)
+			}
+		}
+	})
+}
+
+type setVisitor struct {
+	i int64
+	s string
+	b bool
+	u uint64
+	d time.Duration
+	f float64
+	a any
+}
+
+func (v *setVisitor) String(s string)          { v.s = s }
+func (v *setVisitor) Int64(i int64)            { v.i = i }
+func (v *setVisitor) Uint64(x uint64)          { v.u = x }
+func (v *setVisitor) Float64(x float64)        { v.f = x }
+func (v *setVisitor) Bool(x bool)              { v.b = x }
+func (v *setVisitor) Duration(x time.Duration) { v.d = x }
+func (v *setVisitor) Any(x any)                { v.a = x }
+
+// When dispatching on all types, the "As" functions are slightly slower
+// than switching on the kind and then calling a function that checks
+// the kind again. See BenchmarkDispatch above.
+
+func (a Value) AsString() (string, bool) {
+	if a.Kind() == KindString {
+		return a.str(), true
+	}
+	return "", false
+}
+
+func (a Value) AsInt64() (int64, bool) {
+	if a.Kind() == KindInt64 {
+		return int64(a.num), true
+	}
+	return 0, false
+}
+
+func (a Value) AsUint64() (uint64, bool) {
+	if a.Kind() == KindUint64 {
+		return a.num, true
+	}
+	return 0, false
+}
+
+func (a Value) AsFloat64() (float64, bool) {
+	if a.Kind() == KindFloat64 {
+		return a.float(), true
+	}
+	return 0, false
+}
+
+func (a Value) AsBool() (bool, bool) {
+	if a.Kind() == KindBool {
+		return a.bool(), true
+	}
+	return false, false
+}
+
+func (a Value) AsDuration() (time.Duration, bool) {
+	if a.Kind() == KindDuration {
+		return a.duration(), true
+	}
+	return 0, false
+}
+
+func (a Value) AsAny() (any, bool) {
+	if a.Kind() == KindAny {
+		return a.any, true
+	}
+	return nil, false
+}
+
+// Problem: adding a type means adding a method, which is a breaking change.
+// Using an unexported method to force embedding will make programs compile,
+// But they will panic at runtime when we call the new method.
+type Visitor interface {
+	String(string)
+	Int64(int64)
+	Uint64(uint64)
+	Float64(float64)
+	Bool(bool)
+	Duration(time.Duration)
+	Any(any)
+}
+
+func (a Value) Visit(v Visitor) {
+	switch a.Kind() {
+	case KindString:
+		v.String(a.str())
+	case KindInt64:
+		v.Int64(int64(a.num))
+	case KindUint64:
+		v.Uint64(a.num)
+	case KindBool:
+		v.Bool(a.bool())
+	case KindFloat64:
+		v.Float64(a.float())
+	case KindDuration:
+		v.Duration(a.duration())
+	case KindAny:
+		v.Any(a.any)
+	default:
+		panic("bad kind")
+	}
+}
diff --git a/src/log/slog/value_test.go b/src/log/slog/value_test.go
new file mode 100644
index 0000000..923a4e0
--- /dev/null
+++ b/src/log/slog/value_test.go
@@ -0,0 +1,276 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package slog
+
+import (
+	"fmt"
+	"reflect"
+	"strings"
+	"testing"
+	"time"
+	"unsafe"
+)
+
+func TestKindString(t *testing.T) {
+	if got, want := KindGroup.String(), "Group"; got != want {
+		t.Errorf("got %q, want %q", got, want)
+	}
+}
+
+func TestValueEqual(t *testing.T) {
+	var x, y int
+	vals := []Value{
+		{},
+		Int64Value(1),
+		Int64Value(2),
+		Float64Value(3.5),
+		Float64Value(3.7),
+		BoolValue(true),
+		BoolValue(false),
+		TimeValue(testTime),
+		AnyValue(&x),
+		AnyValue(&y),
+		GroupValue(Bool("b", true), Int("i", 3)),
+	}
+	for i, v1 := range vals {
+		for j, v2 := range vals {
+			got := v1.Equal(v2)
+			want := i == j
+			if got != want {
+				t.Errorf("%v.Equal(%v): got %t, want %t", v1, v2, got, want)
+			}
+		}
+	}
+}
+
+func panics(f func()) (b bool) {
+	defer func() {
+		if x := recover(); x != nil {
+			b = true
+		}
+	}()
+	f()
+	return false
+}
+
+func TestValueString(t *testing.T) {
+	for _, test := range []struct {
+		v    Value
+		want string
+	}{
+		{Int64Value(-3), "-3"},
+		{Uint64Value(1), "1"},
+		{Float64Value(.15), "0.15"},
+		{BoolValue(true), "true"},
+		{StringValue("foo"), "foo"},
+		{TimeValue(testTime), "2000-01-02 03:04:05 +0000 UTC"},
+		{AnyValue(time.Duration(3 * time.Second)), "3s"},
+		{GroupValue(Int("a", 1), Bool("b", true)), "[a=1 b=true]"},
+	} {
+		if got := test.v.String(); got != test.want {
+			t.Errorf("%#v:\ngot  %q\nwant %q", test.v, got, test.want)
+		}
+	}
+}
+
+func TestValueNoAlloc(t *testing.T) {
+	// Assign values just to make sure the compiler doesn't optimize away the statements.
+	var (
+		i  int64
+		u  uint64
+		f  float64
+		b  bool
+		s  string
+		x  any
+		p  = &i
+		d  time.Duration
+		tm time.Time
+	)
+	a := int(testing.AllocsPerRun(5, func() {
+		i = Int64Value(1).Int64()
+		u = Uint64Value(1).Uint64()
+		f = Float64Value(1).Float64()
+		b = BoolValue(true).Bool()
+		s = StringValue("foo").String()
+		d = DurationValue(d).Duration()
+		tm = TimeValue(testTime).Time()
+		x = AnyValue(p).Any()
+	}))
+	if a != 0 {
+		t.Errorf("got %d allocs, want zero", a)
+	}
+	_ = u
+	_ = f
+	_ = b
+	_ = s
+	_ = x
+	_ = tm
+}
+
+func TestAnyLevelAlloc(t *testing.T) {
+	// Because typical Levels are small integers,
+	// they are zero-alloc.
+	var a Value
+	x := LevelDebug + 100
+	wantAllocs(t, 0, func() { a = AnyValue(x) })
+	_ = a
+}
+
+func TestAnyValue(t *testing.T) {
+	for _, test := range []struct {
+		in   any
+		want Value
+	}{
+		{1, IntValue(1)},
+		{1.5, Float64Value(1.5)},
+		{float32(2.5), Float64Value(2.5)},
+		{"s", StringValue("s")},
+		{true, BoolValue(true)},
+		{testTime, TimeValue(testTime)},
+		{time.Hour, DurationValue(time.Hour)},
+		{[]Attr{Int("i", 3)}, GroupValue(Int("i", 3))},
+		{IntValue(4), IntValue(4)},
+		{uint(2), Uint64Value(2)},
+		{uint8(3), Uint64Value(3)},
+		{uint16(4), Uint64Value(4)},
+		{uint32(5), Uint64Value(5)},
+		{uint64(6), Uint64Value(6)},
+		{uintptr(7), Uint64Value(7)},
+		{int8(8), Int64Value(8)},
+		{int16(9), Int64Value(9)},
+		{int32(10), Int64Value(10)},
+		{int64(11), Int64Value(11)},
+	} {
+		got := AnyValue(test.in)
+		if !got.Equal(test.want) {
+			t.Errorf("%v (%[1]T): got %v (kind %s), want %v (kind %s)",
+				test.in, got, got.Kind(), test.want, test.want.Kind())
+		}
+	}
+}
+
+func TestValueAny(t *testing.T) {
+	for _, want := range []any{
+		nil,
+		LevelDebug + 100,
+		time.UTC, // time.Locations treated specially...
+		KindBool, // ...as are Kinds
+		[]Attr{Int("a", 1)},
+		int64(2),
+		uint64(3),
+		true,
+		time.Minute,
+		time.Time{},
+		3.14,
+	} {
+		v := AnyValue(want)
+		got := v.Any()
+		if !reflect.DeepEqual(got, want) {
+			t.Errorf("got %v, want %v", got, want)
+		}
+	}
+}
+
+func TestLogValue(t *testing.T) {
+	want := "replaced"
+	r := &replace{StringValue(want)}
+	v := AnyValue(r)
+	if g, w := v.Kind(), KindLogValuer; g != w {
+		t.Errorf("got %s, want %s", g, w)
+	}
+	got := v.LogValuer().LogValue().Any()
+	if got != want {
+		t.Errorf("got %#v, want %#v", got, want)
+	}
+
+	// Test Resolve.
+	got = v.Resolve().Any()
+	if got != want {
+		t.Errorf("got %#v, want %#v", got, want)
+	}
+
+	// Test Resolve max iteration.
+	r.v = AnyValue(r) // create a cycle
+	got = AnyValue(r).Resolve().Any()
+	if _, ok := got.(error); !ok {
+		t.Errorf("expected error, got %T", got)
+	}
+
+	// Groups are not recursively resolved.
+	c := Any("c", &replace{StringValue("d")})
+	v = AnyValue(&replace{GroupValue(Int("a", 1), Group("b", c))})
+	got2 := v.Resolve().Any().([]Attr)
+	want2 := []Attr{Int("a", 1), Group("b", c)}
+	if !attrsEqual(got2, want2) {
+		t.Errorf("got %v, want %v", got2, want2)
+	}
+
+	// Verify that panics in Resolve are caught and turn into errors.
+	v = AnyValue(panickingLogValue{})
+	got = v.Resolve().Any()
+	gotErr, ok := got.(error)
+	if !ok {
+		t.Errorf("expected error, got %T", got)
+	}
+	// The error should provide some context information.
+	// We'll just check that this function name appears in it.
+	if got, want := gotErr.Error(), "TestLogValue"; !strings.Contains(got, want) {
+		t.Errorf("got %q, want substring %q", got, want)
+	}
+}
+
+func TestZeroTime(t *testing.T) {
+	z := time.Time{}
+	got := TimeValue(z).Time()
+	if !got.IsZero() {
+		t.Errorf("got %s (%#[1]v), not zero time (%#v)", got, z)
+	}
+}
+
+func TestEmptyGroup(t *testing.T) {
+	g := GroupValue(
+		Int("a", 1),
+		Group("g1", Group("g2")),
+		Group("g3", Group("g4", Int("b", 2))))
+	got := g.Group()
+	want := []Attr{Int("a", 1), Group("g3", Group("g4", Int("b", 2)))}
+	if !attrsEqual(got, want) {
+		t.Errorf("\ngot  %v\nwant %v", got, want)
+	}
+}
+
+type replace struct {
+	v Value
+}
+
+func (r *replace) LogValue() Value { return r.v }
+
+type panickingLogValue struct{}
+
+func (panickingLogValue) LogValue() Value { panic("bad") }
+
+// A Value with "unsafe" strings is significantly faster:
+// safe:  1785 ns/op, 0 allocs
+// unsafe: 690 ns/op, 0 allocs
+
+// Run this with and without -tags unsafe_kvs to compare.
+func BenchmarkUnsafeStrings(b *testing.B) {
+	b.ReportAllocs()
+	dst := make([]Value, 100)
+	src := make([]Value, len(dst))
+	b.Logf("Value size = %d", unsafe.Sizeof(Value{}))
+	for i := range src {
+		src[i] = StringValue(fmt.Sprintf("string#%d", i))
+	}
+	b.ResetTimer()
+	var d string
+	for i := 0; i < b.N; i++ {
+		copy(dst, src)
+		for _, a := range dst {
+			d = a.String()
+		}
+	}
+	_ = d
+}
diff --git a/src/log/syslog/syslog_test.go b/src/log/syslog/syslog_test.go
index de1681d..cec225f 100644
--- a/src/log/syslog/syslog_test.go
+++ b/src/log/syslog/syslog_test.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build !windows && !plan9 && !js
+//go:build !windows && !plan9 && !js && !wasip1
 
 package syslog
 
@@ -270,7 +270,7 @@
 func check(t *testing.T, in, out, transport string) {
 	hostname, err := os.Hostname()
 	if err != nil {
-		t.Error("Error retrieving hostname")
+		t.Errorf("Error retrieving hostname: %v", err)
 		return
 	}
 
@@ -290,9 +290,12 @@
 	var pid int
 	tmpl := fmt.Sprintf("<%d>%%s %%s syslog_test[%%d]: %s\n", LOG_USER+LOG_INFO, in)
 	n, err := fmt.Sscanf(out, tmpl, &timestamp, &parsedHostname, &pid)
-	if n != 3 || err != nil || hostname != parsedHostname {
+	if n != 3 || err != nil {
 		t.Errorf("Got %q, does not match template %q (%d %s)", out, tmpl, n, err)
 	}
+	if hostname != parsedHostname {
+		t.Errorf("Hostname got %q want %q in %q", parsedHostname, hostname, out)
+	}
 }
 
 func TestWrite(t *testing.T) {
diff --git a/src/make.bash b/src/make.bash
index c07f39b..755b3b0 100755
--- a/src/make.bash
+++ b/src/make.bash
@@ -162,16 +162,20 @@
 fi
 export GOROOT_BOOTSTRAP
 
+nogoenv() {
+	GO111MODULE=off GOENV=off GOOS= GOARCH= GOEXPERIMENT= GOFLAGS= "$@"
+}
+
 export GOROOT="$(cd .. && pwd)"
 IFS=$'\n'; for go_exe in $(type -ap go); do
 	if [ ! -x "$GOROOT_BOOTSTRAP/bin/go" ]; then
-		goroot=$(GOROOT='' GOOS='' GOARCH='' "$go_exe" env GOROOT)
+		goroot=$(GOROOT= nogoenv "$go_exe" env GOROOT)
 		if [ "$goroot" != "$GOROOT" ]; then
 			if [ "$goroot_bootstrap_set" = "true" ]; then
 				printf 'WARNING: %s does not exist, found %s from env\n' "$GOROOT_BOOTSTRAP/bin/go" "$go_exe" >&2
 				printf 'WARNING: set %s as GOROOT_BOOTSTRAP\n' "$goroot" >&2
 			fi
-			GOROOT_BOOTSTRAP=$goroot
+			GOROOT_BOOTSTRAP="$goroot"
 		fi
 	fi
 done; unset IFS
@@ -183,7 +187,7 @@
 # Get the exact bootstrap toolchain version to help with debugging.
 # We clear GOOS and GOARCH to avoid an ominous but harmless warning if
 # the bootstrap doesn't support them.
-GOROOT_BOOTSTRAP_VERSION=$(GOOS= GOARCH= GOEXPERIMENT= $GOROOT_BOOTSTRAP/bin/go version | sed 's/go version //')
+GOROOT_BOOTSTRAP_VERSION=$(nogoenv "$GOROOT_BOOTSTRAP/bin/go" version | sed 's/go version //')
 echo "Building Go cmd/dist using $GOROOT_BOOTSTRAP. ($GOROOT_BOOTSTRAP_VERSION)"
 if $verbose; then
 	echo cmd/dist
@@ -194,7 +198,7 @@
 	exit 1
 fi
 rm -f cmd/dist/dist
-GOROOT="$GOROOT_BOOTSTRAP" GOOS="" GOARCH="" GO111MODULE=off GOEXPERIMENT="" GOENV=off GOFLAGS="" "$GOROOT_BOOTSTRAP/bin/go" build -o cmd/dist/dist ./cmd/dist
+GOROOT="$GOROOT_BOOTSTRAP" nogoenv "$GOROOT_BOOTSTRAP/bin/go" build -o cmd/dist/dist ./cmd/dist
 
 # -e doesn't propagate out of eval, so check success by hand.
 eval $(./cmd/dist/dist env -p || echo FAIL=true)
diff --git a/src/make.bat b/src/make.bat
index 104fb48..3b861cb 100644
--- a/src/make.bat
+++ b/src/make.bat
@@ -39,6 +39,10 @@
 

 :: Keep environment variables within this script

 :: unless invoked with --no-local.

+if x%1==x-no-local goto nolocal

+if x%2==x-no-local goto nolocal

+if x%3==x-no-local goto nolocal

+if x%4==x-no-local goto nolocal

 if x%1==x--no-local goto nolocal

 if x%2==x--no-local goto nolocal

 if x%3==x--no-local goto nolocal

@@ -73,7 +77,7 @@
 if not "x%GOROOT_BOOTSTRAP%"=="x" goto bootstrapset

 for /f "tokens=*" %%g in ('where go 2^>nul') do (

 	if "x%GOROOT_BOOTSTRAP%"=="x" (

-		for /f "tokens=*" %%i in ('%%g env GOROOT 2^>nul') do (

+		for /f "tokens=*" %%i in ('"%%g" env GOROOT 2^>nul') do (

 			if /I not "%%i"=="%GOROOT_TEMP%" (

 				set GOROOT_BOOTSTRAP=%%i

 			)

@@ -113,20 +117,40 @@
 del env.bat

 if x%vflag==x-v echo.

 

+if x%1==x-dist-tool goto copydist

+if x%2==x-dist-tool goto copydist

+if x%3==x-dist-tool goto copydist

+if x%4==x-dist-tool goto copydist

 if x%1==x--dist-tool goto copydist

 if x%2==x--dist-tool goto copydist

 if x%3==x--dist-tool goto copydist

 if x%4==x--dist-tool goto copydist

 

 set bootstrapflags=

-if x%1==x--no-clean set bootstrapflags=--no-clean

-if x%2==x--no-clean set bootstrapflags=--no-clean

-if x%3==x--no-clean set bootstrapflags=--no-clean

-if x%4==x--no-clean set bootstrapflags=--no-clean

-if x%1==x--no-banner set bootstrapflags=%bootstrapflags% --no-banner

-if x%2==x--no-banner set bootstrapflags=%bootstrapflags% --no-banner

-if x%3==x--no-banner set bootstrapflags=%bootstrapflags% --no-banner

-if x%4==x--no-banner set bootstrapflags=%bootstrapflags% --no-banner

+if x%1==x-no-clean set bootstrapflags=-no-clean

+if x%2==x-no-clean set bootstrapflags=-no-clean

+if x%3==x-no-clean set bootstrapflags=-no-clean

+if x%4==x-no-clean set bootstrapflags=-no-clean

+if x%1==x--no-clean set bootstrapflags=-no-clean

+if x%2==x--no-clean set bootstrapflags=-no-clean

+if x%3==x--no-clean set bootstrapflags=-no-clean

+if x%4==x--no-clean set bootstrapflags=-no-clean

+if x%1==x-no-banner set bootstrapflags=%bootstrapflags% -no-banner

+if x%2==x-no-banner set bootstrapflags=%bootstrapflags% -no-banner

+if x%3==x-no-banner set bootstrapflags=%bootstrapflags% -no-banner

+if x%4==x-no-banner set bootstrapflags=%bootstrapflags% -no-banner

+if x%1==x--no-banner set bootstrapflags=%bootstrapflags% -no-banner

+if x%2==x--no-banner set bootstrapflags=%bootstrapflags% -no-banner

+if x%3==x--no-banner set bootstrapflags=%bootstrapflags% -no-banner

+if x%4==x--no-banner set bootstrapflags=%bootstrapflags% -no-banner

+if x%1==x-distpack set bootstrapflags=%bootstrapflags% -distpack

+if x%2==x-distpack set bootstrapflags=%bootstrapflags% -distpack

+if x%3==x-distpack set bootstrapflags=%bootstrapflags% -distpack

+if x%4==x-distpack set bootstrapflags=%bootstrapflags% -distpack

+if x%1==x--distpack set bootstrapflags=%bootstrapflags% -distpack

+if x%2==x--distpack set bootstrapflags=%bootstrapflags% -distpack

+if x%3==x--distpack set bootstrapflags=%bootstrapflags% -distpack

+if x%4==x--distpack set bootstrapflags=%bootstrapflags% -distpack

 

 :: Run dist bootstrap to complete make.bash.

 :: Bootstrap installs a proper cmd/dist, built with the new toolchain.

diff --git a/src/make.rc b/src/make.rc
index e17ee31..834c1f1 100755
--- a/src/make.rc
+++ b/src/make.rc
@@ -47,6 +47,10 @@
 	shift
 }
 
+fn nogoenv {
+	GO111MODULE=off GOENV=off GOOS=() GOARCH=() GOEXPERIMENT=() GOFLAGS=() $*
+}
+
 bootgo = 1.17.13
 GOROOT = `{cd .. && pwd}
 goroot_bootstrap_set = 'true'
@@ -60,7 +64,7 @@
 for(p in $path){
 	if(! test -x $GOROOT_BOOTSTRAP/bin/go){
 		if(go_exe = `{path=$p whatis go}){
-			goroot = `{GOROOT='' $go_exe env GOROOT}
+			goroot = `{GOROOT=() nogoenv $go_exe env GOROOT}
 			if(! ~ $goroot $GOROOT){
 				if(~ $goroot_bootstrap_set 'true'){
 					echo 'WARNING: '$GOROOT_BOOTSTRAP'/bin/go does not exist, found '$go_exe' from env' >[1=2]
@@ -85,11 +89,11 @@
 # Get the exact bootstrap toolchain version to help with debugging.
 # We clear GOOS and GOARCH to avoid an ominous but harmless warning if
 # the bootstrap doesn't support them.
-GOROOT_BOOTSTRAP_VERSION=`{GOOS='' GOARCH='' GOEXPERIMENT='' $GOROOT_BOOTSTRAP/bin/go version | sed 's/go version //'}
+GOROOT_BOOTSTRAP_VERSION=`{nogoenv $GOROOT_BOOTSTRAP/bin/go version | sed 's/go version //'}
 echo 'Building Go cmd/dist using '$GOROOT_BOOTSTRAP'. ('$"GOROOT_BOOTSTRAP_VERSION')'
 if(~ $#vflag 1)
 	echo cmd/dist
-GOROOT=$GOROOT_BOOTSTRAP GOOS='' GOARCH='' GOEXPERIMENT='' GO111MODULE=off GOENV=off GOFLAGS='' $GOROOT_BOOTSTRAP/bin/go build -o cmd/dist/dist ./cmd/dist
+GOROOT=$GOROOT_BOOTSTRAP nogoenv $GOROOT_BOOTSTRAP/bin/go build -o cmd/dist/dist ./cmd/dist
 
 eval `{./cmd/dist/dist env -9}
 if(~ $#vflag 1)
diff --git a/src/maps/example_test.go b/src/maps/example_test.go
new file mode 100644
index 0000000..779c66d
--- /dev/null
+++ b/src/maps/example_test.go
@@ -0,0 +1,45 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package maps_test
+
+import (
+	"fmt"
+	"maps"
+	"strings"
+)
+
+func ExampleDeleteFunc() {
+	m := map[string]int{
+		"one":   1,
+		"two":   2,
+		"three": 3,
+		"four":  4,
+	}
+	maps.DeleteFunc(m, func(k string, v int) bool {
+		return v%2 != 0 // delete odd values
+	})
+	fmt.Println(m)
+	// Output:
+	// map[four:4 two:2]
+}
+
+func ExampleEqualFunc() {
+	m1 := map[int]string{
+		1:    "one",
+		10:   "Ten",
+		1000: "THOUSAND",
+	}
+	m2 := map[int][]byte{
+		1:    []byte("One"),
+		10:   []byte("Ten"),
+		1000: []byte("Thousand"),
+	}
+	eq := maps.EqualFunc(m1, m2, func(v1 string, v2 []byte) bool {
+		return strings.ToLower(v1) == strings.ToLower(string(v2))
+	})
+	fmt.Println(eq)
+	// Output:
+	// true
+}
diff --git a/src/maps/maps.go b/src/maps/maps.go
new file mode 100644
index 0000000..befde18
--- /dev/null
+++ b/src/maps/maps.go
@@ -0,0 +1,66 @@
+// Copyright 2021 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package maps defines various functions useful with maps of any type.
+package maps
+
+// Equal reports whether two maps contain the same key/value pairs.
+// Values are compared using ==.
+func Equal[M1, M2 ~map[K]V, K, V comparable](m1 M1, m2 M2) bool {
+	if len(m1) != len(m2) {
+		return false
+	}
+	for k, v1 := range m1 {
+		if v2, ok := m2[k]; !ok || v1 != v2 {
+			return false
+		}
+	}
+	return true
+}
+
+// EqualFunc is like Equal, but compares values using eq.
+// Keys are still compared with ==.
+func EqualFunc[M1 ~map[K]V1, M2 ~map[K]V2, K comparable, V1, V2 any](m1 M1, m2 M2, eq func(V1, V2) bool) bool {
+	if len(m1) != len(m2) {
+		return false
+	}
+	for k, v1 := range m1 {
+		if v2, ok := m2[k]; !ok || !eq(v1, v2) {
+			return false
+		}
+	}
+	return true
+}
+
+// clone is implemented in the runtime package.
+func clone(m any) any
+
+// Clone returns a copy of m.  This is a shallow clone:
+// the new keys and values are set using ordinary assignment.
+func Clone[M ~map[K]V, K comparable, V any](m M) M {
+	// Preserve nil in case it matters.
+	if m == nil {
+		return nil
+	}
+	return clone(m).(M)
+}
+
+// Copy copies all key/value pairs in src adding them to dst.
+// When a key in src is already present in dst,
+// the value in dst will be overwritten by the value associated
+// with the key in src.
+func Copy[M1 ~map[K]V, M2 ~map[K]V, K comparable, V any](dst M1, src M2) {
+	for k, v := range src {
+		dst[k] = v
+	}
+}
+
+// DeleteFunc deletes any key/value pairs from m for which del returns true.
+func DeleteFunc[M ~map[K]V, K comparable, V any](m M, del func(K, V) bool) {
+	for k, v := range m {
+		if del(k, v) {
+			delete(m, k)
+		}
+	}
+}
diff --git a/src/maps/maps.s b/src/maps/maps.s
new file mode 100644
index 0000000..4e55778
--- /dev/null
+++ b/src/maps/maps.s
@@ -0,0 +1,5 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// need this empty asm file to enable linkname.
\ No newline at end of file
diff --git a/src/maps/maps_test.go b/src/maps/maps_test.go
new file mode 100644
index 0000000..5e3f9ca
--- /dev/null
+++ b/src/maps/maps_test.go
@@ -0,0 +1,184 @@
+// Copyright 2021 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package maps
+
+import (
+	"math"
+	"strconv"
+	"testing"
+)
+
+var m1 = map[int]int{1: 2, 2: 4, 4: 8, 8: 16}
+var m2 = map[int]string{1: "2", 2: "4", 4: "8", 8: "16"}
+
+func TestEqual(t *testing.T) {
+	if !Equal(m1, m1) {
+		t.Errorf("Equal(%v, %v) = false, want true", m1, m1)
+	}
+	if Equal(m1, (map[int]int)(nil)) {
+		t.Errorf("Equal(%v, nil) = true, want false", m1)
+	}
+	if Equal((map[int]int)(nil), m1) {
+		t.Errorf("Equal(nil, %v) = true, want false", m1)
+	}
+	if !Equal[map[int]int, map[int]int](nil, nil) {
+		t.Error("Equal(nil, nil) = false, want true")
+	}
+	if ms := map[int]int{1: 2}; Equal(m1, ms) {
+		t.Errorf("Equal(%v, %v) = true, want false", m1, ms)
+	}
+
+	// Comparing NaN for equality is expected to fail.
+	mf := map[int]float64{1: 0, 2: math.NaN()}
+	if Equal(mf, mf) {
+		t.Errorf("Equal(%v, %v) = true, want false", mf, mf)
+	}
+}
+
+// equal is simply ==.
+func equal[T comparable](v1, v2 T) bool {
+	return v1 == v2
+}
+
+// equalNaN is like == except that all NaNs are equal.
+func equalNaN[T comparable](v1, v2 T) bool {
+	isNaN := func(f T) bool { return f != f }
+	return v1 == v2 || (isNaN(v1) && isNaN(v2))
+}
+
+// equalStr compares ints and strings.
+func equalIntStr(v1 int, v2 string) bool {
+	return strconv.Itoa(v1) == v2
+}
+
+func TestEqualFunc(t *testing.T) {
+	if !EqualFunc(m1, m1, equal[int]) {
+		t.Errorf("EqualFunc(%v, %v, equal) = false, want true", m1, m1)
+	}
+	if EqualFunc(m1, (map[int]int)(nil), equal[int]) {
+		t.Errorf("EqualFunc(%v, nil, equal) = true, want false", m1)
+	}
+	if EqualFunc((map[int]int)(nil), m1, equal[int]) {
+		t.Errorf("EqualFunc(nil, %v, equal) = true, want false", m1)
+	}
+	if !EqualFunc[map[int]int, map[int]int](nil, nil, equal[int]) {
+		t.Error("EqualFunc(nil, nil, equal) = false, want true")
+	}
+	if ms := map[int]int{1: 2}; EqualFunc(m1, ms, equal[int]) {
+		t.Errorf("EqualFunc(%v, %v, equal) = true, want false", m1, ms)
+	}
+
+	// Comparing NaN for equality is expected to fail.
+	mf := map[int]float64{1: 0, 2: math.NaN()}
+	if EqualFunc(mf, mf, equal[float64]) {
+		t.Errorf("EqualFunc(%v, %v, equal) = true, want false", mf, mf)
+	}
+	// But it should succeed using equalNaN.
+	if !EqualFunc(mf, mf, equalNaN[float64]) {
+		t.Errorf("EqualFunc(%v, %v, equalNaN) = false, want true", mf, mf)
+	}
+
+	if !EqualFunc(m1, m2, equalIntStr) {
+		t.Errorf("EqualFunc(%v, %v, equalIntStr) = false, want true", m1, m2)
+	}
+}
+
+func TestClone(t *testing.T) {
+	mc := Clone(m1)
+	if !Equal(mc, m1) {
+		t.Errorf("Clone(%v) = %v, want %v", m1, mc, m1)
+	}
+	mc[16] = 32
+	if Equal(mc, m1) {
+		t.Errorf("Equal(%v, %v) = true, want false", mc, m1)
+	}
+}
+
+func TestCloneNil(t *testing.T) {
+	var m1 map[string]int
+	mc := Clone(m1)
+	if mc != nil {
+		t.Errorf("Clone(%v) = %v, want %v", m1, mc, m1)
+	}
+}
+
+func TestCopy(t *testing.T) {
+	mc := Clone(m1)
+	Copy(mc, mc)
+	if !Equal(mc, m1) {
+		t.Errorf("Copy(%v, %v) = %v, want %v", m1, m1, mc, m1)
+	}
+	Copy(mc, map[int]int{16: 32})
+	want := map[int]int{1: 2, 2: 4, 4: 8, 8: 16, 16: 32}
+	if !Equal(mc, want) {
+		t.Errorf("Copy result = %v, want %v", mc, want)
+	}
+
+	type M1 map[int]bool
+	type M2 map[int]bool
+	Copy(make(M1), make(M2))
+}
+
+func TestDeleteFunc(t *testing.T) {
+	mc := Clone(m1)
+	DeleteFunc(mc, func(int, int) bool { return false })
+	if !Equal(mc, m1) {
+		t.Errorf("DeleteFunc(%v, true) = %v, want %v", m1, mc, m1)
+	}
+	DeleteFunc(mc, func(k, v int) bool { return k > 3 })
+	want := map[int]int{1: 2, 2: 4}
+	if !Equal(mc, want) {
+		t.Errorf("DeleteFunc result = %v, want %v", mc, want)
+	}
+}
+
+var n map[int]int
+
+func BenchmarkMapClone(b *testing.B) {
+	var m = make(map[int]int)
+	for i := 0; i < 1000000; i++ {
+		m[i] = i
+	}
+	b.ResetTimer()
+	for i := 0; i < b.N; i++ {
+		n = Clone(m)
+	}
+}
+
+func TestCloneWithDelete(t *testing.T) {
+	var m = make(map[int]int)
+	for i := 0; i < 32; i++ {
+		m[i] = i
+	}
+	for i := 8; i < 32; i++ {
+		delete(m, i)
+	}
+	m2 := Clone(m)
+	if len(m2) != 8 {
+		t.Errorf("len2(m2) = %d, want %d", len(m2), 8)
+	}
+	for i := 0; i < 8; i++ {
+		if m2[i] != m[i] {
+			t.Errorf("m2[%d] = %d, want %d", i, m2[i], m[i])
+		}
+	}
+}
+
+func TestCloneWithMapAssign(t *testing.T) {
+	var m = make(map[int]int)
+	const N = 25
+	for i := 0; i < N; i++ {
+		m[i] = i
+	}
+	m2 := Clone(m)
+	if len(m2) != N {
+		t.Errorf("len2(m2) = %d, want %d", len(m2), N)
+	}
+	for i := 0; i < N; i++ {
+		if m2[i] != m[i] {
+			t.Errorf("m2[%d] = %d, want %d", i, m2[i], m[i])
+		}
+	}
+}
diff --git a/src/math/all_test.go b/src/math/all_test.go
index 8d5e0ad..af3c38c 100644
--- a/src/math/all_test.go
+++ b/src/math/all_test.go
@@ -1687,6 +1687,12 @@
 	{Nextafter(1, -2), float64(1 << 63)},
 	{Nextafter(-1, 2), float64(1 << 63)},
 	{Nextafter(-1, -2), float64(1 << 63)},
+
+	// Issue #57465
+	{Copysign(0, -1), 1e19},
+	{Copysign(0, -1), -1e19},
+	{Copysign(0, -1), 1<<53 - 1},
+	{Copysign(0, -1), -(1<<53 - 1)},
 }
 var powSC = []float64{
 	0,               // pow(-Inf, -Pi)
@@ -1762,6 +1768,12 @@
 	0,       // pow(Nextafter(1, -2), float64(1 << 63))
 	0,       // pow(Nextafter(-1, 2), float64(1 << 63))
 	Inf(1),  // pow(Nextafter(-1, -2), float64(1 << 63))
+
+	// Issue #57465
+	0,               // pow(-0, 1e19)
+	Inf(1),          // pow(-0, -1e19)
+	Copysign(0, -1), // pow(-0, 1<<53 -1)
+	Inf(-1),         // pow(-0, -(1<<53 -1))
 }
 
 var vfpow10SC = []int{
@@ -2047,6 +2059,9 @@
 
 	// Special
 	{0, 0, 0, 0},
+	{Copysign(0, -1), 0, 0, 0},
+	{0, 0, Copysign(0, -1), 0},
+	{Copysign(0, -1), 0, Copysign(0, -1), Copysign(0, -1)},
 	{-1.1754226043408471e-38, NaN(), Inf(0), NaN()},
 	{0, 0, 2.22507385643494e-308, 2.22507385643494e-308},
 	{-8.65697792e+09, NaN(), -7.516192799999999e+09, NaN()},
@@ -2065,6 +2080,10 @@
 	{4.612811918325842e+18, 1.4901161193847641e-08, 2.6077032311277997e-08, 6.873625395187494e+10},
 	{-9.094947033611148e-13, 4.450691014249257e-308, 2.086006742350485e-308, 2.086006742346437e-308},
 	{-7.751454006381804e-05, 5.588653777189071e-308, -2.2207280111272877e-308, -2.2211612130544025e-308},
+
+	// Issue #61130
+	{-1, 1, 1, 0},
+	{1, 1, -1, 0},
 }
 
 var sqrt32 = []float32{
@@ -3087,6 +3106,45 @@
 	}
 }
 
+//go:noinline
+func fmsub(x, y, z float64) float64 {
+	return FMA(x, y, -z)
+}
+
+//go:noinline
+func fnmsub(x, y, z float64) float64 {
+	return FMA(-x, y, z)
+}
+
+//go:noinline
+func fnmadd(x, y, z float64) float64 {
+	return FMA(-x, y, -z)
+}
+
+func TestFMANegativeArgs(t *testing.T) {
+	// Some architectures have instructions for fused multiply-subtract and
+	// also negated variants of fused multiply-add and subtract. This test
+	// aims to check that the optimizations that generate those instructions
+	// are applied correctly, if they exist.
+	for _, c := range fmaC {
+		want := PortableFMA(c.x, c.y, -c.z)
+		got := fmsub(c.x, c.y, c.z)
+		if !alike(got, want) {
+			t.Errorf("FMA(%g, %g, -(%g)) == %g, want %g", c.x, c.y, c.z, got, want)
+		}
+		want = PortableFMA(-c.x, c.y, c.z)
+		got = fnmsub(c.x, c.y, c.z)
+		if !alike(got, want) {
+			t.Errorf("FMA(-(%g), %g, %g) == %g, want %g", c.x, c.y, c.z, got, want)
+		}
+		want = PortableFMA(-c.x, c.y, -c.z)
+		got = fnmadd(c.x, c.y, c.z)
+		if !alike(got, want) {
+			t.Errorf("FMA(-(%g), %g, -(%g)) == %g, want %g", c.x, c.y, c.z, got, want)
+		}
+	}
+}
+
 // 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
diff --git a/src/math/asinh.go b/src/math/asinh.go
index 6f6e9e4..d913239 100644
--- a/src/math/asinh.go
+++ b/src/math/asinh.go
@@ -25,7 +25,7 @@
 //	        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(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)))
 //
diff --git a/src/math/atanh_s390x.s b/src/math/atanh_s390x.s
index c4ec2b2..ba0e926 100644
--- a/src/math/atanh_s390x.s
+++ b/src/math/atanh_s390x.s
@@ -62,113 +62,113 @@
 // with coefficients determined with a Remez exchange algorithm.
 
 TEXT    ·atanhAsm(SB), NOSPLIT, $0-16
-    FMOVD   x+0(FP), F0
-    MOVD    $·atanhrodataL10<>+0(SB), R5
-    LGDR    F0, R1
-    WORD    $0xC0393FEF //iilf  %r3,1072693247
-    BYTE    $0xFF
-    BYTE    $0xFF
-    SRAD    $32, R1
-    WORD    $0xB9170021 //llgtr %r2,%r1
-    MOVW    R2, R6
-    MOVW    R3, R7
-    CMPBGT  R6, R7, L2
-    WORD    $0xC0392FFF //iilf  %r3,805306367
-    BYTE    $0xFF
-    BYTE    $0xFF
-    MOVW    R2, R6
-    MOVW    R3, R7
-    CMPBGT  R6, R7, L9
+	FMOVD   x+0(FP), F0
+	MOVD    $·atanhrodataL10<>+0(SB), R5
+	LGDR    F0, R1
+	WORD    $0xC0393FEF //iilf  %r3,1072693247
+	BYTE    $0xFF
+	BYTE    $0xFF
+	SRAD    $32, R1
+	WORD    $0xB9170021 //llgtr %r2,%r1
+	MOVW    R2, R6
+	MOVW    R3, R7
+	CMPBGT  R6, R7, L2
+	WORD    $0xC0392FFF //iilf  %r3,805306367
+	BYTE    $0xFF
+	BYTE    $0xFF
+	MOVW    R2, R6
+	MOVW    R3, R7
+	CMPBGT  R6, R7, L9
 L3:
-    FMOVD   144(R5), F2
-    FMADD   F2, F0, F0
+	FMOVD   144(R5), F2
+	FMADD   F2, F0, F0
 L1:
-    FMOVD   F0, ret+8(FP)
-    RET
+	FMOVD   F0, ret+8(FP)
+	RET
 
 L2:
-    WORD    $0xED005088 //cdb   %f0,.L12-.L10(%r5)
-    BYTE    $0x00
-    BYTE    $0x19
-    BEQ L5
-    WORD    $0xED005080 //cdb   %f0,.L13-.L10(%r5)
-    BYTE    $0x00
-    BYTE    $0x19
-    BEQ L5
-    WFCEDBS V0, V0, V2
-    BVS L1
-    FMOVD   120(R5), F0
-    BR  L1
+	WORD    $0xED005088 //cdb   %f0,.L12-.L10(%r5)
+	BYTE    $0x00
+	BYTE    $0x19
+	BEQ L5
+	WORD    $0xED005080 //cdb   %f0,.L13-.L10(%r5)
+	BYTE    $0x00
+	BYTE    $0x19
+	BEQ L5
+	WFCEDBS V0, V0, V2
+	BVS L1
+	FMOVD   120(R5), F0
+	BR  L1
 L5:
-    WORD    $0xED005070 //ddb   %f0,.L15-.L10(%r5)
-    BYTE    $0x00
-    BYTE    $0x1D
-    FMOVD   F0, ret+8(FP)
-    RET
+	WORD    $0xED005070 //ddb   %f0,.L15-.L10(%r5)
+	BYTE    $0x00
+	BYTE    $0x1D
+	FMOVD   F0, ret+8(FP)
+	RET
 
 L9:
-    FMOVD   F0, F2
-    MOVD    $·atanhtabh2075<>+0(SB), R2
-    SRW $31, R1, R1
-    FMOVD   104(R5), F4
-    MOVW    R1, R1
-    SLD $3, R1, R1
-    WORD    $0x68012000 //ld    %f0,0(%r1,%r2)
-    WFMADB  V2, V4, V0, V4
-    VLEG    $0, 96(R5), V16
-    FDIV    F4, F2
-    WORD    $0xC0298006 //iilf  %r2,2147909631
-    BYTE    $0x7F
-    BYTE    $0xFF
-    FMOVD   88(R5), F6
-    FMOVD   80(R5), F1
-    FMOVD   72(R5), F7
-    FMOVD   64(R5), F5
-    FMOVD   F2, F4
-    WORD    $0xED405088 //adb   %f4,.L12-.L10(%r5)
-    BYTE    $0x00
-    BYTE    $0x1A
-    LGDR    F4, R4
-    SRAD    $32, R4
-    FMOVD   F4, F3
-    WORD    $0xED305088 //sdb   %f3,.L12-.L10(%r5)
-    BYTE    $0x00
-    BYTE    $0x1B
-    SUBW    R4, R2
-    WFSDB   V3, V2, V3
-    RISBGZ  $32, $47, $0, R2, R1
-    SLD $32, R1, R1
-    LDGR    R1, F2
-    WFMADB  V4, V2, V16, V4
-    SRAW    $8, R2, R1
-    WFMADB  V4, V5, V6, V5
-    WFMDB   V4, V4, V6
-    WFMADB  V4, V1, V7, V1
-    WFMADB  V2, V3, V4, V2
-    WFMADB  V1, V6, V5, V1
-    FMOVD   56(R5), F3
-    FMOVD   48(R5), F5
-    WFMADB  V4, V5, V3, V4
-    FMOVD   40(R5), F3
-    FMADD   F1, F6, F4
-    FMOVD   32(R5), F1
-    FMADD   F3, F2, F1
-    ANDW    $0xFFFFFF00, R1
-    WFMADB  V6, V4, V1, V6
-    FMOVD   24(R5), F3
-    ORW $0x45000000, R1
-    WFMADB  V2, V6, V3, V6
-    VLVGF   $0, R1, V4
-    LDEBR   F4, F4
-    RISBGZ  $57, $60, $51, R2, R2
-    MOVD    $·atanhtab2076<>+0(SB), R1
-    FMOVD   16(R5), F3
-    WORD    $0x68521000 //ld    %f5,0(%r2,%r1)
-    FMOVD   8(R5), F1
-    WFMADB  V2, V6, V5, V2
-    WFMADB  V4, V3, V1, V4
-    FMOVD   0(R5), F6
-    FMADD   F6, F4, F2
-    FMUL    F2, F0
-    FMOVD   F0, ret+8(FP)
-    RET
+	FMOVD   F0, F2
+	MOVD    $·atanhtabh2075<>+0(SB), R2
+	SRW $31, R1, R1
+	FMOVD   104(R5), F4
+	MOVW    R1, R1
+	SLD $3, R1, R1
+	WORD    $0x68012000 //ld    %f0,0(%r1,%r2)
+	WFMADB  V2, V4, V0, V4
+	VLEG    $0, 96(R5), V16
+	FDIV    F4, F2
+	WORD    $0xC0298006 //iilf  %r2,2147909631
+	BYTE    $0x7F
+	BYTE    $0xFF
+	FMOVD   88(R5), F6
+	FMOVD   80(R5), F1
+	FMOVD   72(R5), F7
+	FMOVD   64(R5), F5
+	FMOVD   F2, F4
+	WORD    $0xED405088 //adb   %f4,.L12-.L10(%r5)
+	BYTE    $0x00
+	BYTE    $0x1A
+	LGDR    F4, R4
+	SRAD    $32, R4
+	FMOVD   F4, F3
+	WORD    $0xED305088 //sdb   %f3,.L12-.L10(%r5)
+	BYTE    $0x00
+	BYTE    $0x1B
+	SUBW    R4, R2
+	WFSDB   V3, V2, V3
+	RISBGZ  $32, $47, $0, R2, R1
+	SLD $32, R1, R1
+	LDGR    R1, F2
+	WFMADB  V4, V2, V16, V4
+	SRAW    $8, R2, R1
+	WFMADB  V4, V5, V6, V5
+	WFMDB   V4, V4, V6
+	WFMADB  V4, V1, V7, V1
+	WFMADB  V2, V3, V4, V2
+	WFMADB  V1, V6, V5, V1
+	FMOVD   56(R5), F3
+	FMOVD   48(R5), F5
+	WFMADB  V4, V5, V3, V4
+	FMOVD   40(R5), F3
+	FMADD   F1, F6, F4
+	FMOVD   32(R5), F1
+	FMADD   F3, F2, F1
+	ANDW    $0xFFFFFF00, R1
+	WFMADB  V6, V4, V1, V6
+	FMOVD   24(R5), F3
+	ORW $0x45000000, R1
+	WFMADB  V2, V6, V3, V6
+	VLVGF   $0, R1, V4
+	LDEBR   F4, F4
+	RISBGZ  $57, $60, $51, R2, R2
+	MOVD    $·atanhtab2076<>+0(SB), R1
+	FMOVD   16(R5), F3
+	WORD    $0x68521000 //ld    %f5,0(%r2,%r1)
+	FMOVD   8(R5), F1
+	WFMADB  V2, V6, V5, V2
+	WFMADB  V4, V3, V1, V4
+	FMOVD   0(R5), F6
+	FMADD   F6, F4, F2
+	FMUL    F2, F0
+	FMOVD   F0, ret+8(FP)
+	RET
diff --git a/src/math/big/accuracy_string.go b/src/math/big/accuracy_string.go
index 1501ace..aae9238 100644
--- a/src/math/big/accuracy_string.go
+++ b/src/math/big/accuracy_string.go
@@ -4,6 +4,15 @@
 
 import "strconv"
 
+func _() {
+	// An "invalid array index" compiler error signifies that the constant values have changed.
+	// Re-run the stringer command to generate them again.
+	var x [1]struct{}
+	_ = x[Below - -1]
+	_ = x[Exact-0]
+	_ = x[Above-1]
+}
+
 const _Accuracy_name = "BelowExactAbove"
 
 var _Accuracy_index = [...]uint8{0, 5, 10, 15}
diff --git a/src/math/big/arith_ppc64x.s b/src/math/big/arith_ppc64x.s
index 5fdbf40..0613f5c 100644
--- a/src/math/big/arith_ppc64x.s
+++ b/src/math/big/arith_ppc64x.s
@@ -45,7 +45,7 @@
 	// gain significant performance as z_len increases (up to
 	// 1.45x).
 
-	PCALIGN $32
+	PCALIGN $16
 loop:
 	MOVD  8(R8), R11      // R11 = x[i]
 	MOVD  16(R8), R12     // R12 = x[i+1]
@@ -134,7 +134,7 @@
 	// gain significant performance as z_len increases (up to
 	// 1.45x).
 
-	PCALIGN $32
+	PCALIGN $16
 loop:
 	MOVD  8(R8), R11      // R11 = x[i]
 	MOVD  16(R8), R12     // R12 = x[i+1]
@@ -216,7 +216,7 @@
 	CMP   R0, R9
 	MOVD  R9, CTR		// Set up the loop counter
 	BEQ   tail		// If R9 = 0, we can't use the loop
-	PCALIGN $32
+	PCALIGN $16
 
 loop:
 	MOVD  8(R8), R20	// R20 = x[i]
@@ -294,7 +294,7 @@
 	// we don't need to capture CA every iteration because we've already
 	// done that above.
 
-	PCALIGN $32
+	PCALIGN $16
 loop:
 	MOVD  8(R8), R20
 	MOVD  16(R8), R21
@@ -365,7 +365,7 @@
 	CMP     R5, R0          // iterate from i=len(z)-1 to 0
 	BEQ     loopexit        // Already at end?
 	MOVD	0(R15),R10	// x[i]
-	PCALIGN $32
+	PCALIGN $16
 shloop:
 	SLD     R9, R10, R10    // x[i]<<s
 	MOVDU   -8(R15), R14
@@ -528,7 +528,7 @@
 	CMP     R0, R14
 	MOVD    R14, CTR          // Set up the loop counter
 	BEQ     tail              // If R9 = 0, we can't use the loop
-	PCALIGN $32
+	PCALIGN $16
 
 loop:
 	MOVD    8(R8), R20        // R20 = x[i]
@@ -611,7 +611,7 @@
 	MOVD R0, R4		// R4 = c = 0
 	MOVD R22, CTR		// Initialize loop counter
 	BEQ  done
-	PCALIGN $32
+	PCALIGN $16
 
 loop:
 	MOVD  (R8)(R3), R20	// Load x[i]
diff --git a/src/math/big/doc.go b/src/math/big/doc.go
index 65ed019..fee5a65 100644
--- a/src/math/big/doc.go
+++ b/src/math/big/doc.go
@@ -92,8 +92,7 @@
 but also provide SetString methods to initialize a value from a string in
 a variety of supported formats (see the respective SetString documentation).
 
-Finally, *Int, *Rat, and *Float satisfy the fmt package's Scanner interface
-for scanning and (except for *Rat) the Formatter interface for formatted
-printing.
+Finally, *Int, *Rat, and *Float satisfy [fmt.Scanner] for scanning
+and (except for *Rat) the Formatter interface for formatted printing.
 */
 package big
diff --git a/src/math/big/float.go b/src/math/big/float.go
index 84666d8..2f0635a 100644
--- a/src/math/big/float.go
+++ b/src/math/big/float.go
@@ -365,20 +365,27 @@
 		// avoid performance bugs
 		panic("validate called but debugFloat is not set")
 	}
+	if msg := x.validate0(); msg != "" {
+		panic(msg)
+	}
+}
+
+func (x *Float) validate0() string {
 	if x.form != finite {
-		return
+		return ""
 	}
 	m := len(x.mant)
 	if m == 0 {
-		panic("nonzero finite number with empty mantissa")
+		return "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)))
+		return 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")
+		return "zero precision finite number"
 	}
+	return ""
 }
 
 // round rounds z according to z.mode to z.prec bits and sets z.acc accordingly.
diff --git a/src/math/big/floatconv.go b/src/math/big/floatconv.go
index 3bb51c7..6501185 100644
--- a/src/math/big/floatconv.go
+++ b/src/math/big/floatconv.go
@@ -248,7 +248,7 @@
 // no prefix is accepted. The octal prefix "0" is not supported (a leading
 // "0" is simply considered a "0").
 //
-// A "p" or "P" exponent indicates a base 2 (rather then base 10) exponent;
+// A "p" or "P" exponent indicates a base 2 (rather than base 10) exponent;
 // for instance, "0x1.fffffffffffffp1023" (using base 0) represents the
 // maximum float64 value. For hexadecimal mantissae, the exponent character
 // must be one of 'p' or 'P', if present (an "e" or "E" exponent indicator
diff --git a/src/math/big/floatmarsh.go b/src/math/big/floatmarsh.go
index 990e085..2a78c69 100644
--- a/src/math/big/floatmarsh.go
+++ b/src/math/big/floatmarsh.go
@@ -99,6 +99,10 @@
 		z.SetPrec(uint(oldPrec))
 	}
 
+	if msg := z.validate0(); msg != "" {
+		return errors.New("Float.GobDecode: " + msg)
+	}
+
 	return nil
 }
 
diff --git a/src/math/big/floatmarsh_test.go b/src/math/big/floatmarsh_test.go
index 401f45a..20def68 100644
--- a/src/math/big/floatmarsh_test.go
+++ b/src/math/big/floatmarsh_test.go
@@ -9,6 +9,7 @@
 	"encoding/gob"
 	"encoding/json"
 	"io"
+	"strings"
 	"testing"
 )
 
@@ -149,3 +150,24 @@
 		}
 	}
 }
+
+func TestFloatGobDecodeInvalid(t *testing.T) {
+	for _, tc := range []struct {
+		buf []byte
+		msg string
+	}{
+		{
+			[]byte{0x1, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x0, 0x20, 0x20, 0x20, 0x0, 0x20, 0x20, 0x20, 0x20, 0x0, 0x0, 0x0, 0x0, 0xc},
+			"Float.GobDecode: msb not set in last word",
+		},
+		{
+			[]byte{1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+			"Float.GobDecode: nonzero finite number with empty mantissa",
+		},
+	} {
+		err := NewFloat(0).GobDecode(tc.buf)
+		if err == nil || !strings.HasPrefix(err.Error(), tc.msg) {
+			t.Errorf("expected GobDecode error prefix: %s, got: %v", tc.msg, err)
+		}
+	}
+}
diff --git a/src/math/big/int.go b/src/math/big/int.go
index 76d6eb9..2cc3d7b 100644
--- a/src/math/big/int.go
+++ b/src/math/big/int.go
@@ -22,6 +22,14 @@
 // an existing (or newly allocated) Int must be set to
 // a new value using the Int.Set method; shallow copies
 // of Ints are not supported and may lead to errors.
+//
+// Note that methods may leak the Int's value through timing side-channels.
+// Because of this and because of the scope and complexity of the
+// implementation, Int is not well-suited to implement cryptographic operations.
+// The standard library avoids exposing non-trivial Int methods to
+// attacker-controlled inputs and the determination of whether a bug in math/big
+// is considered a security vulnerability might depend on the impact on the
+// standard library.
 type Int struct {
 	neg bool // sign
 	abs nat  // absolute value of the integer
@@ -442,6 +450,26 @@
 	return !x.neg && len(x.abs) <= 64/_W
 }
 
+// Float64 returns the float64 value nearest x,
+// and an indication of any rounding that occurred.
+func (x *Int) Float64() (float64, Accuracy) {
+	n := x.abs.bitLen() // NB: still uses slow crypto impl!
+	if n == 0 {
+		return 0.0, Exact
+	}
+
+	// Fast path: no more than 53 significant bits.
+	if n <= 53 || n < 64 && n-int(x.abs.trailingZeroBits()) <= 53 {
+		f := float64(low64(x.abs))
+		if x.neg {
+			f = -f
+		}
+		return f, Exact
+	}
+
+	return new(Float).SetInt(x).Float64()
+}
+
 // SetString sets z to the value of s, interpreted in the given base,
 // and returns z and a boolean indicating success. The entire string
 // (not just a prefix) must be valid for success. If SetString fails,
@@ -974,7 +1002,7 @@
 	return z
 }
 
-// modSqrt5Mod8 uses Atkin's observation that 2 is not a square mod p
+// modSqrt5Mod8Prime uses Atkin's observation that 2 is not a square mod p
 //
 //	alpha ==  (2*a)^((p-5)/8)    mod p
 //	beta  ==  2*a*alpha^2        mod p  is a square root of -1
diff --git a/src/math/big/int_test.go b/src/math/big/int_test.go
index 53cd399..cb964a4 100644
--- a/src/math/big/int_test.go
+++ b/src/math/big/int_test.go
@@ -254,7 +254,7 @@
 
 func BenchmarkBinomial(b *testing.B) {
 	var z Int
-	for i := b.N - 1; i >= 0; i-- {
+	for i := 0; i < b.N; i++ {
 		z.Binomial(1000, 990)
 	}
 }
@@ -1425,7 +1425,6 @@
 	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)
 	}
@@ -1435,7 +1434,6 @@
 	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)
 	}
@@ -1445,7 +1443,6 @@
 	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)
 	}
@@ -1455,7 +1452,6 @@
 	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)
 	}
@@ -1955,3 +1951,52 @@
 		}
 	}
 }
+
+func TestFloat64(t *testing.T) {
+	for _, test := range []struct {
+		istr string
+		f    float64
+		acc  Accuracy
+	}{
+		{"-1000000000000000000000000000000000000000000000000000000", -1000000000000000078291540404596243842305360299886116864.000000, Below},
+		{"-9223372036854775809", math.MinInt64, Above},
+		{"-9223372036854775808", -9223372036854775808, Exact}, // -2^63
+		{"-9223372036854775807", -9223372036854775807, Below},
+		{"-18014398509481985", -18014398509481984.000000, Above},
+		{"-18014398509481984", -18014398509481984.000000, Exact}, // -2^54
+		{"-18014398509481983", -18014398509481984.000000, Below},
+		{"-9007199254740993", -9007199254740992.000000, Above},
+		{"-9007199254740992", -9007199254740992.000000, Exact}, // -2^53
+		{"-9007199254740991", -9007199254740991.000000, Exact},
+		{"-4503599627370497", -4503599627370497.000000, Exact},
+		{"-4503599627370496", -4503599627370496.000000, Exact}, // -2^52
+		{"-4503599627370495", -4503599627370495.000000, Exact},
+		{"-12345", -12345, Exact},
+		{"-1", -1, Exact},
+		{"0", 0, Exact},
+		{"1", 1, Exact},
+		{"12345", 12345, Exact},
+		{"0x1010000000000000", 0x1010000000000000, Exact}, // >2^53 but exact nonetheless
+		{"9223372036854775807", 9223372036854775808, Above},
+		{"9223372036854775808", 9223372036854775808, Exact}, // +2^63
+		{"1000000000000000000000000000000000000000000000000000000", 1000000000000000078291540404596243842305360299886116864.000000, Above},
+	} {
+		i, ok := new(Int).SetString(test.istr, 0)
+		if !ok {
+			t.Errorf("SetString(%s) failed", test.istr)
+			continue
+		}
+
+		// Test against expectation.
+		f, acc := i.Float64()
+		if f != test.f || acc != test.acc {
+			t.Errorf("%s: got %f (%s); want %f (%s)", test.istr, f, acc, test.f, test.acc)
+		}
+
+		// Cross-check the fast path against the big.Float implementation.
+		f2, acc2 := new(Float).SetInt(i).Float64()
+		if f != f2 || acc != acc2 {
+			t.Errorf("%s: got %f (%s); Float.Float64 gives %f (%s)", test.istr, f, acc, f2, acc2)
+		}
+	}
+}
diff --git a/src/math/big/roundingmode_string.go b/src/math/big/roundingmode_string.go
index c7629eb..e2f13a6 100644
--- a/src/math/big/roundingmode_string.go
+++ b/src/math/big/roundingmode_string.go
@@ -4,6 +4,18 @@
 
 import "strconv"
 
+func _() {
+	// An "invalid array index" compiler error signifies that the constant values have changed.
+	// Re-run the stringer command to generate them again.
+	var x [1]struct{}
+	_ = x[ToNearestEven-0]
+	_ = x[ToNearestAway-1]
+	_ = x[ToZero-2]
+	_ = x[AwayFromZero-3]
+	_ = x[ToNegativeInf-4]
+	_ = x[ToPositiveInf-5]
+}
+
 const _RoundingMode_name = "ToNearestEvenToNearestAwayToZeroAwayFromZeroToNegativeInfToPositiveInf"
 
 var _RoundingMode_index = [...]uint8{0, 13, 26, 32, 44, 57, 70}
diff --git a/src/math/dim.go b/src/math/dim.go
index 6a286cd..f369f70 100644
--- a/src/math/dim.go
+++ b/src/math/dim.go
@@ -34,6 +34,9 @@
 //	Max(x, NaN) = Max(NaN, x) = NaN
 //	Max(+0, ±0) = Max(±0, +0) = +0
 //	Max(-0, -0) = -0
+//
+// Note that this differs from the built-in function max when called
+// with NaN and +Inf.
 func Max(x, y float64) float64 {
 	if haveArchMax {
 		return archMax(x, y)
@@ -67,6 +70,9 @@
 //	Min(x, -Inf) = Min(-Inf, x) = -Inf
 //	Min(x, NaN) = Min(NaN, x) = NaN
 //	Min(-0, ±0) = Min(±0, -0) = -0
+//
+// Note that this differs from the built-in function min when called
+// with NaN and -Inf.
 func Min(x, y float64) float64 {
 	if haveArchMin {
 		return archMin(x, y)
diff --git a/src/math/fma.go b/src/math/fma.go
index ca0bf99..ba03fbe 100644
--- a/src/math/fma.go
+++ b/src/math/fma.go
@@ -132,6 +132,11 @@
 		ps, pe, pm1, pm2, zs, ze, zm1, zm2 = zs, ze, zm1, zm2, ps, pe, pm1, pm2
 	}
 
+	// Special case: if p == -z the result is always +0 since neither operand is zero.
+	if ps != zs && pe == ze && pm1 == zm1 && pm2 == zm2 {
+		return 0
+	}
+
 	// Align significands
 	zm1, zm2 = shrcompress(zm1, zm2, uint(pe-ze))
 
diff --git a/src/math/huge_test.go b/src/math/huge_test.go
index bc28c6f..568b0c8 100644
--- a/src/math/huge_test.go
+++ b/src/math/huge_test.go
@@ -81,6 +81,10 @@
 		if !close(f1, f2) {
 			t.Errorf("Cos(%g) = %g, want %g", trigHuge[i], f2, f1)
 		}
+		f3 := Cos(-trigHuge[i])
+		if !close(f1, f3) {
+			t.Errorf("Cos(%g) = %g, want %g", -trigHuge[i], f3, f1)
+		}
 	}
 }
 
@@ -91,6 +95,10 @@
 		if !close(f1, f2) {
 			t.Errorf("Sin(%g) = %g, want %g", trigHuge[i], f2, f1)
 		}
+		f3 := Sin(-trigHuge[i])
+		if !close(-f1, f3) {
+			t.Errorf("Sin(%g) = %g, want %g", -trigHuge[i], f3, -f1)
+		}
 	}
 }
 
@@ -101,6 +109,10 @@
 		if !close(f1, f2) || !close(g1, g2) {
 			t.Errorf("Sincos(%g) = %g, %g, want %g, %g", trigHuge[i], f2, g2, f1, g1)
 		}
+		f3, g3 := Sincos(-trigHuge[i])
+		if !close(-f1, f3) || !close(g1, g3) {
+			t.Errorf("Sincos(%g) = %g, %g, want %g, %g", -trigHuge[i], f3, g3, -f1, g1)
+		}
 	}
 }
 
@@ -111,5 +123,9 @@
 		if !close(f1, f2) {
 			t.Errorf("Tan(%g) = %g, want %g", trigHuge[i], f2, f1)
 		}
+		f3 := Tan(-trigHuge[i])
+		if !close(-f1, f3) {
+			t.Errorf("Tan(%g) = %g, want %g", -trigHuge[i], f3, -f1)
+		}
 	}
 }
diff --git a/src/math/log_amd64.s b/src/math/log_amd64.s
index d84091f..508df68 100644
--- a/src/math/log_amd64.s
+++ b/src/math/log_amd64.s
@@ -97,7 +97,7 @@
 	SUBSD   X2, X0 // x0= (hfsq-(s*(hfsq+R)+k*Ln2Lo))-f, x1= k
 	MULSD   $Ln2Hi, X1 // x0= (hfsq-(s*(hfsq+R)+k*Ln2Lo))-f, x1= k*Ln2Hi
 	SUBSD   X0, X1 // x1= k*Ln2Hi-((hfsq-(s*(hfsq+R)+k*Ln2Lo))-f)
-  	MOVSD   X1, ret+8(FP)
+	MOVSD   X1, ret+8(FP)
 	RET
 isInfOrNaN:
 	MOVQ    BX, ret+8(FP) // +Inf or NaN, return x
diff --git a/src/math/pow.go b/src/math/pow.go
index 3af8c8b..3f42945 100644
--- a/src/math/pow.go
+++ b/src/math/pow.go
@@ -5,6 +5,15 @@
 package math
 
 func isOddInt(x float64) bool {
+	if Abs(x) >= (1 << 53) {
+		// 1 << 53 is the largest exact integer in the float64 format.
+		// Any number outside this range will be truncated before the decimal point and therefore will always be
+		// an even integer.
+		// Without this check and if x overflows int64 the int64(xi) conversion below may produce incorrect results
+		// on some architectures (and does so on arm64). See issue #57465.
+		return false
+	}
+
 	xi, xf := Modf(x)
 	return xf == 0 && int64(xi)&1 == 1
 }
@@ -54,12 +63,12 @@
 	case x == 0:
 		switch {
 		case y < 0:
-			if isOddInt(y) {
-				return Copysign(Inf(1), x)
+			if Signbit(x) && isOddInt(y) {
+				return Inf(-1)
 			}
 			return Inf(1)
 		case y > 0:
-			if isOddInt(y) {
+			if Signbit(x) && isOddInt(y) {
 				return x
 			}
 			return 0
diff --git a/src/math/pow_s390x.s b/src/math/pow_s390x.s
index 9a0fff3..c8758fc 100644
--- a/src/math/pow_s390x.s
+++ b/src/math/pow_s390x.s
@@ -133,7 +133,7 @@
 DATA ·powtm<> + 184(SB)/8, $0xf00003d846c66
 GLOBL ·powtm<> + 0(SB), RODATA, $192
 
-// Table of indeces into multiplier tables
+// Table of indices into multiplier tables
 // Adjusted from asm to remove offset and convert
 DATA ·powtabi<> + 0(SB)/8, $0x1010101
 DATA ·powtabi<> + 8(SB)/8, $0x101020202020203
diff --git a/src/math/rand/default_test.go b/src/math/rand/default_test.go
new file mode 100644
index 0000000..19fd75d
--- /dev/null
+++ b/src/math/rand/default_test.go
@@ -0,0 +1,148 @@
+// Copyright 2023 The Go Authors. 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 (
+	"fmt"
+	"internal/race"
+	"internal/testenv"
+	. "math/rand"
+	"os"
+	"runtime"
+	"strconv"
+	"sync"
+	"testing"
+)
+
+// Test that racy access to the default functions behaves reasonably.
+func TestDefaultRace(t *testing.T) {
+	// Skip the test in short mode, but even in short mode run
+	// the test if we are using the race detector, because part
+	// of this is to see whether the race detector reports any problems.
+	if testing.Short() && !race.Enabled {
+		t.Skip("skipping starting another executable in short mode")
+	}
+
+	const env = "GO_RAND_TEST_HELPER_CODE"
+	if v := os.Getenv(env); v != "" {
+		doDefaultTest(t, v)
+		return
+	}
+
+	t.Parallel()
+
+	for i := 0; i < 6; i++ {
+		i := i
+		t.Run(strconv.Itoa(i), func(t *testing.T) {
+			t.Parallel()
+			exe, err := os.Executable()
+			if err != nil {
+				exe = os.Args[0]
+			}
+			cmd := testenv.Command(t, exe, "-test.run=TestDefaultRace")
+			cmd = testenv.CleanCmdEnv(cmd)
+			cmd.Env = append(cmd.Env, fmt.Sprintf("GO_RAND_TEST_HELPER_CODE=%d", i/2))
+			if i%2 != 0 {
+				cmd.Env = append(cmd.Env, "GODEBUG=randautoseed=0")
+			}
+			out, err := cmd.CombinedOutput()
+			if len(out) > 0 {
+				t.Logf("%s", out)
+			}
+			if err != nil {
+				t.Error(err)
+			}
+		})
+	}
+}
+
+// doDefaultTest should be run before there have been any calls to the
+// top-level math/rand functions. Make sure that we can make concurrent
+// calls to top-level functions and to Seed without any duplicate values.
+// This will also give the race detector a change to report any problems.
+func doDefaultTest(t *testing.T, v string) {
+	code, err := strconv.Atoi(v)
+	if err != nil {
+		t.Fatalf("internal error: unrecognized code %q", v)
+	}
+
+	goroutines := runtime.GOMAXPROCS(0)
+	if goroutines < 4 {
+		goroutines = 4
+	}
+
+	ch := make(chan uint64, goroutines*3)
+	var wg sync.WaitGroup
+
+	// The various tests below should not cause race detector reports
+	// and should not produce duplicate results.
+	//
+	// Note: these tests can theoretically fail when using fastrand64
+	// in that it is possible to coincidentally get the same random
+	// number twice. That could happen something like 1 / 2**64 times,
+	// which is rare enough that it may never happen. We don't worry
+	// about that case.
+
+	switch code {
+	case 0:
+		// Call Seed and Uint64 concurrently.
+		wg.Add(goroutines)
+		for i := 0; i < goroutines; i++ {
+			go func(s int64) {
+				defer wg.Done()
+				Seed(s)
+			}(int64(i) + 100)
+		}
+		wg.Add(goroutines)
+		for i := 0; i < goroutines; i++ {
+			go func() {
+				defer wg.Done()
+				ch <- Uint64()
+			}()
+		}
+	case 1:
+		// Call Uint64 concurrently with no Seed.
+		wg.Add(goroutines)
+		for i := 0; i < goroutines; i++ {
+			go func() {
+				defer wg.Done()
+				ch <- Uint64()
+			}()
+		}
+	case 2:
+		// Start with Uint64 to pick the fast source, then call
+		// Seed and Uint64 concurrently.
+		ch <- Uint64()
+		wg.Add(goroutines)
+		for i := 0; i < goroutines; i++ {
+			go func(s int64) {
+				defer wg.Done()
+				Seed(s)
+			}(int64(i) + 100)
+		}
+		wg.Add(goroutines)
+		for i := 0; i < goroutines; i++ {
+			go func() {
+				defer wg.Done()
+				ch <- Uint64()
+			}()
+		}
+	default:
+		t.Fatalf("internal error: unrecognized code %d", code)
+	}
+
+	go func() {
+		wg.Wait()
+		close(ch)
+	}()
+
+	m := make(map[uint64]bool)
+	for i := range ch {
+		if m[i] {
+			t.Errorf("saw %d twice", i)
+		}
+		m[i] = true
+	}
+}
diff --git a/src/math/rand/rand.go b/src/math/rand/rand.go
index 77d7e86..cc1f95c 100644
--- a/src/math/rand/rand.go
+++ b/src/math/rand/rand.go
@@ -2,8 +2,8 @@
 // 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 unsuitable for
-// security-sensitive work.
+// Package rand implements pseudo-random number generators suitable for tasks
+// such as simulation, but it should not be used for security-sensitive work.
 //
 // Random numbers are generated by a [Source], usually wrapped in a [Rand].
 // Both types should be used by a single goroutine at a time: sharing among
@@ -20,6 +20,7 @@
 import (
 	"internal/godebug"
 	"sync"
+	"sync/atomic"
 	_ "unsafe" // for go:linkname
 )
 
@@ -269,8 +270,11 @@
 // always returns len(p) and a nil error.
 // Read should not be called concurrently with any other Rand method.
 func (r *Rand) Read(p []byte) (n int, err error) {
-	if lk, ok := r.src.(*lockedSource); ok {
-		return lk.read(p, &r.readVal, &r.readPos)
+	switch src := r.src.(type) {
+	case *lockedSource:
+		return src.read(p, &r.readVal, &r.readPos)
+	case *fastSource:
+		return src.read(p, &r.readVal, &r.readPos)
 	}
 	return read(p, r.src, &r.readVal, &r.readPos)
 }
@@ -301,7 +305,75 @@
  * Top-level convenience functions
  */
 
-var globalRand = New(new(lockedSource))
+// globalRandGenerator is the source of random numbers for the top-level
+// convenience functions. When possible it uses the runtime fastrand64
+// function to avoid locking. This is not possible if the user called Seed,
+// either explicitly or implicitly via GODEBUG=randautoseed=0.
+var globalRandGenerator atomic.Pointer[Rand]
+
+var randautoseed = godebug.New("randautoseed")
+
+// globalRand returns the generator to use for the top-level convenience
+// functions.
+func globalRand() *Rand {
+	if r := globalRandGenerator.Load(); r != nil {
+		return r
+	}
+
+	// This is the first call. Initialize based on GODEBUG.
+	var r *Rand
+	if randautoseed.Value() == "0" {
+		randautoseed.IncNonDefault()
+		r = New(new(lockedSource))
+		r.Seed(1)
+	} else {
+		r = &Rand{
+			src: &fastSource{},
+			s64: &fastSource{},
+		}
+	}
+
+	if !globalRandGenerator.CompareAndSwap(nil, r) {
+		// Two different goroutines called some top-level
+		// function at the same time. While the results in
+		// that case are unpredictable, if we just use r here,
+		// and we are using a seed, we will most likely return
+		// the same value for both calls. That doesn't seem ideal.
+		// Just use the first one to get in.
+		return globalRandGenerator.Load()
+	}
+
+	return r
+}
+
+//go:linkname fastrand64
+func fastrand64() uint64
+
+// fastSource is an implementation of Source64 that uses the runtime
+// fastrand functions.
+type fastSource struct {
+	// The mutex is used to avoid race conditions in Read.
+	mu sync.Mutex
+}
+
+func (*fastSource) Int63() int64 {
+	return int64(fastrand64() & rngMask)
+}
+
+func (*fastSource) Seed(int64) {
+	panic("internal error: call to fastSource.Seed")
+}
+
+func (*fastSource) Uint64() uint64 {
+	return fastrand64()
+}
+
+func (fs *fastSource) read(p []byte, readVal *int64, readPos *int8) (n int, err error) {
+	fs.mu.Lock()
+	n, err = read(p, fs, readVal, readPos)
+	fs.mu.Unlock()
+	return
+}
 
 // Seed uses the provided seed value to initialize the default Source to a
 // deterministic state. Seed values that have the same remainder when
@@ -315,71 +387,94 @@
 // Alternately, set GODEBUG=randautoseed=0 in the environment
 // before making any calls to functions in this package.
 //
-// Deprecated: Programs that call Seed and then expect a specific sequence
-// of results from the global random source (using functions such as Int)
-// can be broken when a dependency changes how much it consumes
-// from the global random source. To avoid such breakages, programs
-// that need a specific result sequence should use NewRand(NewSource(seed))
-// to obtain a random generator that other packages cannot access.
-func Seed(seed int64) { globalRand.Seed(seed) }
+// Deprecated: As of Go 1.20 there is no reason to call Seed with
+// a random value. Programs that call Seed with a known value to get
+// a specific sequence of results should use New(NewSource(seed)) to
+// obtain a local random generator.
+func Seed(seed int64) {
+	orig := globalRandGenerator.Load()
+
+	// If we are already using a lockedSource, we can just re-seed it.
+	if orig != nil {
+		if _, ok := orig.src.(*lockedSource); ok {
+			orig.Seed(seed)
+			return
+		}
+	}
+
+	// Otherwise either
+	// 1) orig == nil, which is the normal case when Seed is the first
+	// top-level function to be called, or
+	// 2) orig is already a fastSource, in which case we need to change
+	// to a lockedSource.
+	// Either way we do the same thing.
+
+	r := New(new(lockedSource))
+	r.Seed(seed)
+
+	if !globalRandGenerator.CompareAndSwap(orig, r) {
+		// Something changed underfoot. Retry to be safe.
+		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() }
+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() }
+func Uint32() uint32 { return globalRand().Uint32() }
 
 // Uint64 returns a pseudo-random 64-bit value as a uint64
 // from the default Source.
-func Uint64() uint64 { return globalRand.Uint64() }
+func Uint64() uint64 { return globalRand().Uint64() }
 
 // Int31 returns a non-negative pseudo-random 31-bit integer as an int32
 // from the default Source.
-func Int31() int32 { return globalRand.Int31() }
+func Int31() int32 { return globalRand().Int31() }
 
 // Int returns a non-negative pseudo-random int from the default Source.
-func Int() int { return globalRand.Int() }
+func Int() int { return globalRand().Int() }
 
 // Int63n returns, as an int64, a non-negative pseudo-random number in the half-open interval [0,n)
 // from the default Source.
 // It panics if n <= 0.
-func Int63n(n int64) int64 { return globalRand.Int63n(n) }
+func Int63n(n int64) int64 { return globalRand().Int63n(n) }
 
 // Int31n returns, as an int32, a non-negative pseudo-random number in the half-open interval [0,n)
 // from the default Source.
 // It panics if n <= 0.
-func Int31n(n int32) int32 { return globalRand.Int31n(n) }
+func Int31n(n int32) int32 { return globalRand().Int31n(n) }
 
 // Intn returns, as an int, a non-negative pseudo-random number in the half-open interval [0,n)
 // from the default Source.
 // It panics if n <= 0.
-func Intn(n int) int { return globalRand.Intn(n) }
+func Intn(n int) int { return globalRand().Intn(n) }
 
 // Float64 returns, as a float64, a pseudo-random number in the half-open interval [0.0,1.0)
 // from the default Source.
-func Float64() float64 { return globalRand.Float64() }
+func Float64() float64 { return globalRand().Float64() }
 
 // Float32 returns, as a float32, a pseudo-random number in the half-open interval [0.0,1.0)
 // from the default Source.
-func Float32() float32 { return globalRand.Float32() }
+func Float32() float32 { return globalRand().Float32() }
 
 // Perm returns, as a slice of n ints, a pseudo-random permutation of the integers
 // in the half-open interval [0,n) from the default Source.
-func Perm(n int) []int { return globalRand.Perm(n) }
+func Perm(n int) []int { return globalRand().Perm(n) }
 
 // Shuffle pseudo-randomizes the order of elements using the default Source.
 // n is the number of elements. Shuffle panics if n < 0.
 // swap swaps the elements with indexes i and j.
-func Shuffle(n int, swap func(i, j int)) { globalRand.Shuffle(n, swap) }
+func Shuffle(n int, swap func(i, j int)) { globalRand().Shuffle(n, swap) }
 
 // Read generates len(p) random bytes from the default Source and
 // writes them into p. It always returns len(p) and a nil error.
 // Read, unlike the Rand.Read method, is safe for concurrent use.
 //
 // Deprecated: For almost all use cases, crypto/rand.Read is more appropriate.
-func Read(p []byte) (n int, err error) { return globalRand.Read(p) }
+func Read(p []byte) (n int, err error) { return globalRand().Read(p) }
 
 // NormFloat64 returns a normally distributed float64 in the range
 // [-math.MaxFloat64, +math.MaxFloat64] with
@@ -389,7 +484,7 @@
 // adjust the output using:
 //
 //	sample = NormFloat64() * desiredStdDev + desiredMean
-func NormFloat64() float64 { return globalRand.NormFloat64() }
+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
@@ -398,43 +493,23 @@
 // callers can adjust the output using:
 //
 //	sample = ExpFloat64() / desiredRateParameter
-func ExpFloat64() float64 { return globalRand.ExpFloat64() }
+func ExpFloat64() float64 { return globalRand().ExpFloat64() }
 
 type lockedSource struct {
 	lk sync.Mutex
-	s  *rngSource // nil if not yet allocated
-}
-
-//go:linkname fastrand64
-func fastrand64() uint64
-
-var randautoseed = godebug.New("randautoseed")
-
-// source returns r.s, allocating and seeding it if needed.
-// The caller must have locked r.
-func (r *lockedSource) source() *rngSource {
-	if r.s == nil {
-		var seed int64
-		if randautoseed.Value() == "0" {
-			seed = 1
-		} else {
-			seed = int64(fastrand64())
-		}
-		r.s = newSource(seed)
-	}
-	return r.s
+	s  *rngSource
 }
 
 func (r *lockedSource) Int63() (n int64) {
 	r.lk.Lock()
-	n = r.source().Int63()
+	n = r.s.Int63()
 	r.lk.Unlock()
 	return
 }
 
 func (r *lockedSource) Uint64() (n uint64) {
 	r.lk.Lock()
-	n = r.source().Uint64()
+	n = r.s.Uint64()
 	r.lk.Unlock()
 	return
 }
@@ -466,7 +541,7 @@
 // read implements Read for a lockedSource without a race condition.
 func (r *lockedSource) read(p []byte, readVal *int64, readPos *int8) (n int, err error) {
 	r.lk.Lock()
-	n, err = read(p, r.source(), readVal, readPos)
+	n, err = read(p, r.s, readVal, readPos)
 	r.lk.Unlock()
 	return
 }
diff --git a/src/math/rand/rand_test.go b/src/math/rand/rand_test.go
index 462de8b..7eba1dc 100644
--- a/src/math/rand/rand_test.go
+++ b/src/math/rand/rand_test.go
@@ -14,6 +14,7 @@
 	. "math/rand"
 	"os"
 	"runtime"
+	"sync"
 	"testing"
 	"testing/iotest"
 )
@@ -683,3 +684,18 @@
 		r.Read(buf)
 	}
 }
+
+func BenchmarkConcurrent(b *testing.B) {
+	const goroutines = 4
+	var wg sync.WaitGroup
+	wg.Add(goroutines)
+	for i := 0; i < goroutines; i++ {
+		go func() {
+			defer wg.Done()
+			for n := b.N; n > 0; n-- {
+				Int63()
+			}
+		}()
+	}
+	wg.Wait()
+}
diff --git a/src/math/rand/rng.go b/src/math/rand/rng.go
index f305df1..1e4a9e0 100644
--- a/src/math/rand/rng.go
+++ b/src/math/rand/rng.go
@@ -234,7 +234,7 @@
 	return int64(rng.Uint64() & rngMask)
 }
 
-// Uint64 returns a non-negative pseudo-random 64-bit integer as an uint64.
+// Uint64 returns a non-negative pseudo-random 64-bit integer as a uint64.
 func (rng *rngSource) Uint64() uint64 {
 	rng.tap--
 	if rng.tap < 0 {
diff --git a/src/mime/multipart/formdata.go b/src/mime/multipart/formdata.go
index 41bc886..85bad2a 100644
--- a/src/mime/multipart/formdata.go
+++ b/src/mime/multipart/formdata.go
@@ -12,6 +12,7 @@
 	"math"
 	"net/textproto"
 	"os"
+	"strconv"
 )
 
 // ErrMessageTooLarge is returned by ReadForm if the message form
@@ -32,7 +33,10 @@
 	return r.readForm(maxMemory)
 }
 
-var multipartFiles = godebug.New("multipartfiles")
+var (
+	multipartFiles    = godebug.New("#multipartfiles") // TODO: document and remove #
+	multipartMaxParts = godebug.New("multipartmaxparts")
+)
 
 func (r *Reader) readForm(maxMemory int64) (_ *Form, err error) {
 	form := &Form{make(map[string][]string), make(map[string][]*FileHeader)}
@@ -41,7 +45,20 @@
 		fileOff int64
 	)
 	numDiskFiles := 0
-	combineFiles := multipartFiles.Value() != "distinct"
+	combineFiles := true
+	if multipartFiles.Value() == "distinct" {
+		combineFiles = false
+		// multipartFiles.IncNonDefault() // TODO: uncomment after documenting
+	}
+	maxParts := 1000
+	if s := multipartMaxParts.Value(); s != "" {
+		if v, err := strconv.Atoi(s); err == nil && v >= 0 {
+			maxParts = v
+			multipartMaxParts.IncNonDefault()
+		}
+	}
+	maxHeaders := maxMIMEHeaders()
+
 	defer func() {
 		if file != nil {
 			if cerr := file.Close(); err == nil {
@@ -69,7 +86,7 @@
 	// since metadata is always stored in memory, not disk.
 	//
 	// maxMemoryBytes is the maximum bytes we will store in memory, including file content,
-	// non-file part values, metdata, and map entry overhead.
+	// non-file part values, metadata, and map entry overhead.
 	//
 	// We reserve an additional 10 MB in maxMemoryBytes for non-file data.
 	//
@@ -77,6 +94,9 @@
 	// unconfigurable 10 MB added on to maxMemory, is unfortunate but difficult to change
 	// within the constraints of the API as documented.
 	maxFileMemoryBytes := maxMemory
+	if maxFileMemoryBytes == math.MaxInt64 {
+		maxFileMemoryBytes--
+	}
 	maxMemoryBytes := maxMemory + int64(10<<20)
 	if maxMemoryBytes <= 0 {
 		if maxMemory < 0 {
@@ -85,14 +105,19 @@
 			maxMemoryBytes = math.MaxInt64
 		}
 	}
+	var copyBuf []byte
 	for {
-		p, err := r.nextPart(false, maxMemoryBytes)
+		p, err := r.nextPart(false, maxMemoryBytes, maxHeaders)
 		if err == io.EOF {
 			break
 		}
 		if err != nil {
 			return nil, err
 		}
+		if maxParts <= 0 {
+			return nil, ErrMessageTooLarge
+		}
+		maxParts--
 
 		name := p.FormName()
 		if name == "" {
@@ -103,8 +128,9 @@
 		// Multiple values for the same key (one map entry, longer slice) are cheaper
 		// than the same number of values for different keys (many map entries), but
 		// using a consistent per-value cost for overhead is simpler.
+		const mapEntryOverhead = 200
 		maxMemoryBytes -= int64(len(name))
-		maxMemoryBytes -= 100 // map overhead
+		maxMemoryBytes -= mapEntryOverhead
 		if maxMemoryBytes < 0 {
 			// We can't actually take this path, since nextPart would already have
 			// rejected the MIME headers for being too large. Check anyway.
@@ -128,10 +154,16 @@
 		}
 
 		// file, store in memory or on disk
+		const fileHeaderSize = 100
 		maxMemoryBytes -= mimeHeaderSize(p.Header)
+		maxMemoryBytes -= mapEntryOverhead
+		maxMemoryBytes -= fileHeaderSize
 		if maxMemoryBytes < 0 {
 			return nil, ErrMessageTooLarge
 		}
+		for _, v := range p.Header {
+			maxHeaders -= int64(len(v))
+		}
 		fh := &FileHeader{
 			Filename: filename,
 			Header:   p.Header,
@@ -148,14 +180,22 @@
 				}
 			}
 			numDiskFiles++
-			size, err := io.Copy(file, io.MultiReader(&b, p))
+			if _, err := file.Write(b.Bytes()); err != nil {
+				return nil, err
+			}
+			if copyBuf == nil {
+				copyBuf = make([]byte, 32*1024) // same buffer size as io.Copy uses
+			}
+			// os.File.ReadFrom will allocate its own copy buffer if we let io.Copy use it.
+			type writerOnly struct{ io.Writer }
+			remainingSize, err := io.CopyBuffer(writerOnly{file}, p, copyBuf)
 			if err != nil {
 				return nil, err
 			}
 			fh.tmpfile = file.Name()
-			fh.Size = size
+			fh.Size = int64(b.Len()) + remainingSize
 			fh.tmpoff = fileOff
-			fileOff += size
+			fileOff += fh.Size
 			if !combineFiles {
 				if err := file.Close(); err != nil {
 					return nil, err
@@ -175,9 +215,10 @@
 }
 
 func mimeHeaderSize(h textproto.MIMEHeader) (size int64) {
+	size = 400
 	for k, vs := range h {
 		size += int64(len(k))
-		size += 100 // map entry overhead
+		size += 200 // map entry overhead
 		for _, v := range vs {
 			size += int64(len(v))
 		}
diff --git a/src/mime/multipart/formdata_test.go b/src/mime/multipart/formdata_test.go
index 8a862be..d422729 100644
--- a/src/mime/multipart/formdata_test.go
+++ b/src/mime/multipart/formdata_test.go
@@ -55,6 +55,23 @@
 	}
 }
 
+// Issue 58384: Handle ReadForm(math.MaxInt64)
+func TestReadFormWitFileNameMaxMemoryOverflow(t *testing.T) {
+	b := strings.NewReader(strings.ReplaceAll(messageWithFileName, "\n", "\r\n"))
+	r := NewReader(b, boundary)
+	f, err := r.ReadForm(math.MaxInt64)
+	if err != nil {
+		t.Fatalf("ReadForm(MaxInt64): %v", err)
+	}
+	defer f.RemoveAll()
+
+	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()
+}
+
 // Issue 40430: Handle ReadForm(math.MaxInt64)
 func TestReadFormMaxMemoryOverflow(t *testing.T) {
 	b := strings.NewReader(strings.ReplaceAll(messageWithTextContentType, "\n", "\r\n"))
@@ -66,6 +83,11 @@
 	if f == nil {
 		t.Fatal("ReadForm(MaxInt64): missing form")
 	}
+	defer f.RemoveAll()
+
+	if g, e := f.Value["texta"][0], textaValue; g != e {
+		t.Errorf("texta value = %q, want %q", g, e)
+	}
 }
 
 func TestReadFormWithTextContentType(t *testing.T) {
@@ -122,6 +144,15 @@
 --MyBoundary--
 `
 
+const messageWithFileName = `
+--MyBoundary
+Content-Disposition: form-data; name="filea"; filename="filea.txt"
+Content-Type: text/plain
+
+` + fileaContents + `
+--MyBoundary--
+`
+
 const messageWithTextContentType = `
 --MyBoundary
 Content-Disposition: form-data; name="texta"
@@ -192,10 +223,10 @@
 // TestReadForm_NonFileMaxMemory asserts that the ReadForm maxMemory limit is applied
 // while processing non-file form data as well as file form data.
 func TestReadForm_NonFileMaxMemory(t *testing.T) {
-	n := 10<<20 + 25
 	if testing.Short() {
-		n = 10<<10 + 25
+		t.Skip("skipping in -short mode")
 	}
+	n := 10 << 20
 	largeTextValue := strings.Repeat("1", n)
 	message := `--MyBoundary
 Content-Disposition: form-data; name="largetext"
@@ -203,38 +234,29 @@
 ` + largeTextValue + `
 --MyBoundary--
 `
-
 	testBody := strings.ReplaceAll(message, "\n", "\r\n")
-	testCases := []struct {
-		name      string
-		maxMemory int64
-		err       error
-	}{
-		{"smaller", 50 + int64(len("largetext")) + 100, nil},
-		{"exact-fit", 25 + int64(len("largetext")) + 100, nil},
-		{"too-large", 0, ErrMessageTooLarge},
+	// Try parsing the form with increasing maxMemory values.
+	// Changes in how we account for non-file form data may cause the exact point
+	// where we change from rejecting the form as too large to accepting it to vary,
+	// but we should see both successes and failures.
+	const failWhenMaxMemoryLessThan = 128
+	for maxMemory := int64(0); maxMemory < failWhenMaxMemoryLessThan*2; maxMemory += 16 {
+		b := strings.NewReader(testBody)
+		r := NewReader(b, boundary)
+		f, err := r.ReadForm(maxMemory)
+		if err != nil {
+			continue
+		}
+		if g := f.Value["largetext"][0]; g != largeTextValue {
+			t.Errorf("largetext mismatch: got size: %v, expected size: %v", len(g), len(largeTextValue))
+		}
+		f.RemoveAll()
+		if maxMemory < failWhenMaxMemoryLessThan {
+			t.Errorf("ReadForm(%v): no error, expect to hit memory limit when maxMemory < %v", maxMemory, failWhenMaxMemoryLessThan)
+		}
+		return
 	}
-	for _, tc := range testCases {
-		t.Run(tc.name, func(t *testing.T) {
-			if tc.maxMemory == 0 && testing.Short() {
-				t.Skip("skipping in -short mode")
-			}
-			b := strings.NewReader(testBody)
-			r := NewReader(b, boundary)
-			f, err := r.ReadForm(tc.maxMemory)
-			if err == nil {
-				defer f.RemoveAll()
-			}
-			if tc.err != err {
-				t.Fatalf("ReadForm error - got: %v; expected: %v", err, tc.err)
-			}
-			if err == nil {
-				if g := f.Value["largetext"][0]; g != largeTextValue {
-					t.Errorf("largetext mismatch: got size: %v, expected size: %v", len(g), len(largeTextValue))
-				}
-			}
-		})
-	}
+	t.Errorf("ReadForm(x) failed for x < 1024, expect success")
 }
 
 // TestReadForm_MetadataTooLarge verifies that we account for the size of field names,
@@ -368,3 +390,113 @@
 		t.Fatalf("temp dir contains %v files; want 0", len(names))
 	}
 }
+
+func TestReadFormLimits(t *testing.T) {
+	for _, test := range []struct {
+		values           int
+		files            int
+		extraKeysPerFile int
+		wantErr          error
+		godebug          string
+	}{
+		{values: 1000},
+		{values: 1001, wantErr: ErrMessageTooLarge},
+		{values: 500, files: 500},
+		{values: 501, files: 500, wantErr: ErrMessageTooLarge},
+		{files: 1000},
+		{files: 1001, wantErr: ErrMessageTooLarge},
+		{files: 1, extraKeysPerFile: 9998}, // plus Content-Disposition and Content-Type
+		{files: 1, extraKeysPerFile: 10000, wantErr: ErrMessageTooLarge},
+		{godebug: "multipartmaxparts=100", values: 100},
+		{godebug: "multipartmaxparts=100", values: 101, wantErr: ErrMessageTooLarge},
+		{godebug: "multipartmaxheaders=100", files: 2, extraKeysPerFile: 48},
+		{godebug: "multipartmaxheaders=100", files: 2, extraKeysPerFile: 50, wantErr: ErrMessageTooLarge},
+	} {
+		name := fmt.Sprintf("values=%v/files=%v/extraKeysPerFile=%v", test.values, test.files, test.extraKeysPerFile)
+		if test.godebug != "" {
+			name += fmt.Sprintf("/godebug=%v", test.godebug)
+		}
+		t.Run(name, func(t *testing.T) {
+			if test.godebug != "" {
+				t.Setenv("GODEBUG", test.godebug)
+			}
+			var buf bytes.Buffer
+			fw := NewWriter(&buf)
+			for i := 0; i < test.values; i++ {
+				w, _ := fw.CreateFormField(fmt.Sprintf("field%v", i))
+				fmt.Fprintf(w, "value %v", i)
+			}
+			for i := 0; i < test.files; i++ {
+				h := make(textproto.MIMEHeader)
+				h.Set("Content-Disposition",
+					fmt.Sprintf(`form-data; name="file%v"; filename="file%v"`, i, i))
+				h.Set("Content-Type", "application/octet-stream")
+				for j := 0; j < test.extraKeysPerFile; j++ {
+					h.Set(fmt.Sprintf("k%v", j), "v")
+				}
+				w, _ := fw.CreatePart(h)
+				fmt.Fprintf(w, "value %v", i)
+			}
+			if err := fw.Close(); err != nil {
+				t.Fatal(err)
+			}
+			fr := NewReader(bytes.NewReader(buf.Bytes()), fw.Boundary())
+			form, err := fr.ReadForm(1 << 10)
+			if err == nil {
+				defer form.RemoveAll()
+			}
+			if err != test.wantErr {
+				t.Errorf("ReadForm = %v, want %v", err, test.wantErr)
+			}
+		})
+	}
+}
+
+func BenchmarkReadForm(b *testing.B) {
+	for _, test := range []struct {
+		name string
+		form func(fw *Writer, count int)
+	}{{
+		name: "fields",
+		form: func(fw *Writer, count int) {
+			for i := 0; i < count; i++ {
+				w, _ := fw.CreateFormField(fmt.Sprintf("field%v", i))
+				fmt.Fprintf(w, "value %v", i)
+			}
+		},
+	}, {
+		name: "files",
+		form: func(fw *Writer, count int) {
+			for i := 0; i < count; i++ {
+				w, _ := fw.CreateFormFile(fmt.Sprintf("field%v", i), fmt.Sprintf("file%v", i))
+				fmt.Fprintf(w, "value %v", i)
+			}
+		},
+	}} {
+		b.Run(test.name, func(b *testing.B) {
+			for _, maxMemory := range []int64{
+				0,
+				1 << 20,
+			} {
+				var buf bytes.Buffer
+				fw := NewWriter(&buf)
+				test.form(fw, 10)
+				if err := fw.Close(); err != nil {
+					b.Fatal(err)
+				}
+				b.Run(fmt.Sprintf("maxMemory=%v", maxMemory), func(b *testing.B) {
+					b.ReportAllocs()
+					for i := 0; i < b.N; i++ {
+						fr := NewReader(bytes.NewReader(buf.Bytes()), fw.Boundary())
+						form, err := fr.ReadForm(maxMemory)
+						if err != nil {
+							b.Fatal(err)
+						}
+						form.RemoveAll()
+					}
+
+				})
+			}
+		})
+	}
+}
diff --git a/src/mime/multipart/multipart.go b/src/mime/multipart/multipart.go
index 86ea926..da1f458 100644
--- a/src/mime/multipart/multipart.go
+++ b/src/mime/multipart/multipart.go
@@ -9,6 +9,21 @@
 
 The implementation is sufficient for HTTP (RFC 2388) and the multipart
 bodies generated by popular browsers.
+
+# Limits
+
+To protect against malicious inputs, this package sets limits on the size
+of the MIME data it processes.
+
+Reader.NextPart and Reader.NextRawPart limit the number of headers in a
+part to 10000 and Reader.ReadForm limits the total number of headers in all
+FileHeaders to 10000.
+These limits may be adjusted with the GODEBUG=multipartmaxheaders=<values>
+setting.
+
+Reader.ReadForm further limits the number of parts in a form to 1000.
+This limit may be adjusted with the GODEBUG=multipartmaxparts=<value>
+setting.
 */
 package multipart
 
@@ -16,11 +31,13 @@
 	"bufio"
 	"bytes"
 	"fmt"
+	"internal/godebug"
 	"io"
 	"mime"
 	"mime/quotedprintable"
 	"net/textproto"
 	"path/filepath"
+	"strconv"
 	"strings"
 )
 
@@ -128,12 +145,12 @@
 	return n, r.err
 }
 
-func newPart(mr *Reader, rawPart bool, maxMIMEHeaderSize int64) (*Part, error) {
+func newPart(mr *Reader, rawPart bool, maxMIMEHeaderSize, maxMIMEHeaders int64) (*Part, error) {
 	bp := &Part{
 		Header: make(map[string][]string),
 		mr:     mr,
 	}
-	if err := bp.populateHeaders(maxMIMEHeaderSize); err != nil {
+	if err := bp.populateHeaders(maxMIMEHeaderSize, maxMIMEHeaders); err != nil {
 		return nil, err
 	}
 	bp.r = partReader{bp}
@@ -149,9 +166,9 @@
 	return bp, nil
 }
 
-func (p *Part) populateHeaders(maxMIMEHeaderSize int64) error {
+func (p *Part) populateHeaders(maxMIMEHeaderSize, maxMIMEHeaders int64) error {
 	r := textproto.NewReader(p.mr.bufReader)
-	header, err := readMIMEHeader(r, maxMIMEHeaderSize)
+	header, err := readMIMEHeader(r, maxMIMEHeaderSize, maxMIMEHeaders)
 	if err == nil {
 		p.Header = header
 	}
@@ -330,6 +347,21 @@
 // including header keys, values, and map overhead.
 const maxMIMEHeaderSize = 10 << 20
 
+// multipartMaxHeaders is the maximum number of header entries NextPart will return,
+// as well as the maximum combined total of header entries Reader.ReadForm will return
+// in FileHeaders.
+var multipartMaxHeaders = godebug.New("multipartmaxheaders")
+
+func maxMIMEHeaders() int64 {
+	if s := multipartMaxHeaders.Value(); s != "" {
+		if v, err := strconv.ParseInt(s, 10, 64); err == nil && v >= 0 {
+			multipartMaxHeaders.IncNonDefault()
+			return v
+		}
+	}
+	return 10000
+}
+
 // NextPart returns the next part in the multipart or an error.
 // When there are no more parts, the error io.EOF is returned.
 //
@@ -337,7 +369,7 @@
 // has a value of "quoted-printable", that header is instead
 // hidden and the body is transparently decoded during Read calls.
 func (r *Reader) NextPart() (*Part, error) {
-	return r.nextPart(false, maxMIMEHeaderSize)
+	return r.nextPart(false, maxMIMEHeaderSize, maxMIMEHeaders())
 }
 
 // NextRawPart returns the next part in the multipart or an error.
@@ -346,10 +378,10 @@
 // Unlike NextPart, it does not have special handling for
 // "Content-Transfer-Encoding: quoted-printable".
 func (r *Reader) NextRawPart() (*Part, error) {
-	return r.nextPart(true, maxMIMEHeaderSize)
+	return r.nextPart(true, maxMIMEHeaderSize, maxMIMEHeaders())
 }
 
-func (r *Reader) nextPart(rawPart bool, maxMIMEHeaderSize int64) (*Part, error) {
+func (r *Reader) nextPart(rawPart bool, maxMIMEHeaderSize, maxMIMEHeaders int64) (*Part, error) {
 	if r.currentPart != nil {
 		r.currentPart.Close()
 	}
@@ -374,7 +406,7 @@
 
 		if r.isBoundaryDelimiterLine(line) {
 			r.partsRead++
-			bp, err := newPart(r, rawPart, maxMIMEHeaderSize)
+			bp, err := newPart(r, rawPart, maxMIMEHeaderSize, maxMIMEHeaders)
 			if err != nil {
 				return nil, err
 			}
diff --git a/src/mime/multipart/readmimeheader.go b/src/mime/multipart/readmimeheader.go
index 6836928..25aa6e2 100644
--- a/src/mime/multipart/readmimeheader.go
+++ b/src/mime/multipart/readmimeheader.go
@@ -11,4 +11,4 @@
 // readMIMEHeader is defined in package net/textproto.
 //
 //go:linkname readMIMEHeader net/textproto.readMIMEHeader
-func readMIMEHeader(r *textproto.Reader, lim int64) (textproto.MIMEHeader, error)
+func readMIMEHeader(r *textproto.Reader, maxMemory, maxHeaders int64) (textproto.MIMEHeader, error)
diff --git a/src/mime/type_unix.go b/src/mime/type_unix.go
index 649d900..90414c1 100644
--- a/src/mime/type_unix.go
+++ b/src/mime/type_unix.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build unix || (js && wasm)
+//go:build unix || (js && wasm) || wasip1
 
 package mime
 
diff --git a/src/net/cgo_stub.go b/src/net/cgo_stub.go
index c901d4b..b26b11a 100644
--- a/src/net/cgo_stub.go
+++ b/src/net/cgo_stub.go
@@ -2,34 +2,39 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build (!cgo && !darwin) || netgo
+// This file holds stub versions of the cgo functions called on Unix systems.
+// We build this file:
+// - if using the netgo build tag on a Unix system
+// - on a Unix system without the cgo resolver functions
+//   (Darwin always provides the cgo functions, in cgo_unix_syscall.go)
+// - on wasip1, where cgo is never available
+
+//go:build (netgo && unix) || (unix && !cgo && !darwin) || wasip1
 
 package net
 
 import "context"
 
-type addrinfoErrno int
+// cgoAvailable set to false to indicate that the cgo resolver
+// is not available on this system.
+const cgoAvailable = false
 
-func (eai addrinfoErrno) Error() string   { return "<nil>" }
-func (eai addrinfoErrno) Temporary() bool { return false }
-func (eai addrinfoErrno) Timeout() bool   { return false }
-
-func cgoLookupHost(ctx context.Context, name string) (addrs []string, err error, completed bool) {
-	return nil, nil, false
+func cgoLookupHost(ctx context.Context, name string) (addrs []string, err error) {
+	panic("cgo stub: cgo not available")
 }
 
-func cgoLookupPort(ctx context.Context, network, service string) (port int, err error, completed bool) {
-	return 0, nil, false
+func cgoLookupPort(ctx context.Context, network, service string) (port int, err error) {
+	panic("cgo stub: cgo not available")
 }
 
-func cgoLookupIP(ctx context.Context, network, name string) (addrs []IPAddr, err error, completed bool) {
-	return nil, nil, false
+func cgoLookupIP(ctx context.Context, network, name string) (addrs []IPAddr, err error) {
+	panic("cgo stub: cgo not available")
 }
 
 func cgoLookupCNAME(ctx context.Context, name string) (cname string, err error, completed bool) {
-	return "", nil, false
+	panic("cgo stub: cgo not available")
 }
 
-func cgoLookupPTR(ctx context.Context, addr string) (ptrs []string, err error, completed bool) {
-	return nil, nil, false
+func cgoLookupPTR(ctx context.Context, addr string) (ptrs []string, err error) {
+	panic("cgo stub: cgo not available")
 }
diff --git a/src/net/cgo_unix.go b/src/net/cgo_unix.go
index 6a2c369..f10f3ea 100644
--- a/src/net/cgo_unix.go
+++ b/src/net/cgo_unix.go
@@ -14,12 +14,17 @@
 import (
 	"context"
 	"errors"
+	"net/netip"
 	"syscall"
 	"unsafe"
 
 	"golang.org/x/net/dns/dnsmessage"
 )
 
+// cgoAvailable set to true to indicate that the cgo resolver
+// is available on this system.
+const cgoAvailable = true
+
 // An addrinfoErrno represents a getaddrinfo, getnameinfo-specific
 // error number. It's a signed number and a zero value is a non-error
 // by convention.
@@ -29,31 +34,50 @@
 func (eai addrinfoErrno) Temporary() bool { return eai == _C_EAI_AGAIN }
 func (eai addrinfoErrno) Timeout() bool   { return false }
 
-type portLookupResult struct {
-	port int
-	err  error
+// isAddrinfoErrno is just for testing purposes.
+func (eai addrinfoErrno) isAddrinfoErrno() {}
+
+// doBlockingWithCtx executes a blocking function in a separate goroutine when the provided
+// context is cancellable. It is intended for use with calls that don't support context
+// cancellation (cgo, syscalls). blocking func may still be running after this function finishes.
+func doBlockingWithCtx[T any](ctx context.Context, blocking func() (T, error)) (T, error) {
+	if ctx.Done() == nil {
+		return blocking()
+	}
+
+	type result struct {
+		res T
+		err error
+	}
+
+	res := make(chan result, 1)
+	go func() {
+		var r result
+		r.res, r.err = blocking()
+		res <- r
+	}()
+
+	select {
+	case r := <-res:
+		return r.res, r.err
+	case <-ctx.Done():
+		var zero T
+		return zero, mapErr(ctx.Err())
+	}
 }
 
-type ipLookupResult struct {
-	addrs []IPAddr
-	cname string
-	err   error
-}
-
-type reverseLookupResult struct {
-	names []string
-	err   error
-}
-
-func cgoLookupHost(ctx context.Context, name string) (hosts []string, err error, completed bool) {
-	addrs, err, completed := cgoLookupIP(ctx, "ip", name)
+func cgoLookupHost(ctx context.Context, name string) (hosts []string, err error) {
+	addrs, err := cgoLookupIP(ctx, "ip", name)
+	if err != nil {
+		return nil, err
+	}
 	for _, addr := range addrs {
 		hosts = append(hosts, addr.String())
 	}
-	return
+	return hosts, nil
 }
 
-func cgoLookupPort(ctx context.Context, network, service string) (port int, err error, completed bool) {
+func cgoLookupPort(ctx context.Context, network, service string) (port int, err error) {
 	var hints _C_struct_addrinfo
 	switch network {
 	case "": // no hints
@@ -64,7 +88,7 @@
 		*_C_ai_socktype(&hints) = _C_SOCK_DGRAM
 		*_C_ai_protocol(&hints) = _C_IPPROTO_UDP
 	default:
-		return 0, &DNSError{Err: "unknown network", Name: network + "/" + service}, true
+		return 0, &DNSError{Err: "unknown network", Name: network + "/" + service}
 	}
 	switch ipVersion(network) {
 	case '4':
@@ -72,25 +96,17 @@
 	case '6':
 		*_C_ai_family(&hints) = _C_AF_INET6
 	}
-	if ctx.Done() == nil {
-		port, err := cgoLookupServicePort(&hints, network, service)
-		return port, err, true
-	}
-	result := make(chan portLookupResult, 1)
-	go cgoPortLookup(result, &hints, network, service)
-	select {
-	case r := <-result:
-		return r.port, r.err, true
-	case <-ctx.Done():
-		// Since there isn't a portable way to cancel the lookup,
-		// we just let it finish and write to the buffered channel.
-		return 0, mapErr(ctx.Err()), false
-	}
+
+	return doBlockingWithCtx(ctx, func() (int, error) {
+		return cgoLookupServicePort(&hints, network, service)
+	})
 }
 
 func cgoLookupServicePort(hints *_C_struct_addrinfo, network, service string) (port int, err error) {
-	cservice := make([]byte, len(service)+1)
-	copy(cservice, service)
+	cservice, err := syscall.ByteSliceFromString(service)
+	if err != nil {
+		return 0, &DNSError{Err: err.Error(), Name: network + "/" + service}
+	}
 	// Lowercase the C service name.
 	for i, b := range cservice[:len(service)] {
 		cservice[i] = lowerASCII(b)
@@ -127,12 +143,7 @@
 	return 0, &DNSError{Err: "unknown port", Name: network + "/" + service}
 }
 
-func cgoPortLookup(result chan<- portLookupResult, hints *_C_struct_addrinfo, network, service string) {
-	port, err := cgoLookupServicePort(hints, network, service)
-	result <- portLookupResult{port, err}
-}
-
-func cgoLookupIPCNAME(network, name string) (addrs []IPAddr, cname string, err error) {
+func cgoLookupHostIP(network, name string) (addrs []IPAddr, err error) {
 	acquireThread()
 	defer releaseThread()
 
@@ -147,10 +158,12 @@
 		*_C_ai_family(&hints) = _C_AF_INET6
 	}
 
-	h := make([]byte, len(name)+1)
-	copy(h, name)
+	h, err := syscall.BytePtrFromString(name)
+	if err != nil {
+		return nil, &DNSError{Err: err.Error(), Name: name}
+	}
 	var res *_C_struct_addrinfo
-	gerrno, err := _C_getaddrinfo((*_C_char)(unsafe.Pointer(&h[0])), nil, &hints, &res)
+	gerrno, err := _C_getaddrinfo((*_C_char)(unsafe.Pointer(h)), nil, &hints, &res)
 	if gerrno != 0 {
 		isErrorNoSuchHost := false
 		isTemporary := false
@@ -166,7 +179,7 @@
 				// comes up again. golang.org/issue/6232.
 				err = syscall.EMFILE
 			}
-		case _C_EAI_NONAME:
+		case _C_EAI_NONAME, _C_EAI_NODATA:
 			err = errNoSuchHost
 			isErrorNoSuchHost = true
 		default:
@@ -174,19 +187,10 @@
 			isTemporary = addrinfoErrno(gerrno).Temporary()
 		}
 
-		return nil, "", &DNSError{Err: err.Error(), Name: name, IsNotFound: isErrorNoSuchHost, IsTemporary: isTemporary}
+		return nil, &DNSError{Err: err.Error(), Name: name, IsNotFound: isErrorNoSuchHost, IsTemporary: isTemporary}
 	}
 	defer _C_freeaddrinfo(res)
 
-	if res != nil {
-		cname = _C_GoString(*_C_ai_canonname(res))
-		if cname == "" {
-			cname = name
-		}
-		if len(cname) > 0 && cname[len(cname)-1] != '.' {
-			cname += "."
-		}
-	}
 	for r := res; r != nil; r = *_C_ai_next(r) {
 		// We only asked for SOCK_STREAM, but check anyhow.
 		if *_C_ai_socktype(r) != _C_SOCK_STREAM {
@@ -203,27 +207,13 @@
 			addrs = append(addrs, addr)
 		}
 	}
-	return addrs, cname, nil
+	return addrs, nil
 }
 
-func cgoIPLookup(result chan<- ipLookupResult, network, name string) {
-	addrs, cname, err := cgoLookupIPCNAME(network, name)
-	result <- ipLookupResult{addrs, cname, err}
-}
-
-func cgoLookupIP(ctx context.Context, network, name string) (addrs []IPAddr, err error, completed bool) {
-	if ctx.Done() == nil {
-		addrs, _, err = cgoLookupIPCNAME(network, name)
-		return addrs, err, true
-	}
-	result := make(chan ipLookupResult, 1)
-	go cgoIPLookup(result, network, name)
-	select {
-	case r := <-result:
-		return r.addrs, r.err, true
-	case <-ctx.Done():
-		return nil, mapErr(ctx.Err()), false
-	}
+func cgoLookupIP(ctx context.Context, network, name string) (addrs []IPAddr, err error) {
+	return doBlockingWithCtx(ctx, func() ([]IPAddr, error) {
+		return cgoLookupHostIP(network, name)
+	})
 }
 
 // These are roughly enough for the following:
@@ -239,31 +229,19 @@
 	maxNameinfoLen = 4096
 )
 
-func cgoLookupPTR(ctx context.Context, addr string) (names []string, err error, completed bool) {
-	var zone string
-	ip := parseIPv4(addr)
-	if ip == nil {
-		ip, zone = parseIPv6Zone(addr)
+func cgoLookupPTR(ctx context.Context, addr string) (names []string, err error) {
+	ip, err := netip.ParseAddr(addr)
+	if err != nil {
+		return nil, &DNSError{Err: "invalid address", Name: addr}
 	}
-	if ip == nil {
-		return nil, &DNSError{Err: "invalid address", Name: addr}, true
-	}
-	sa, salen := cgoSockaddr(ip, zone)
+	sa, salen := cgoSockaddr(IP(ip.AsSlice()), ip.Zone())
 	if sa == nil {
-		return nil, &DNSError{Err: "invalid address " + ip.String(), Name: addr}, true
+		return nil, &DNSError{Err: "invalid address " + ip.String(), Name: addr}
 	}
-	if ctx.Done() == nil {
-		names, err := cgoLookupAddrPTR(addr, sa, salen)
-		return names, err, true
-	}
-	result := make(chan reverseLookupResult, 1)
-	go cgoReverseLookup(result, addr, sa, salen)
-	select {
-	case r := <-result:
-		return r.names, r.err, true
-	case <-ctx.Done():
-		return nil, mapErr(ctx.Err()), false
-	}
+
+	return doBlockingWithCtx(ctx, func() ([]string, error) {
+		return cgoLookupAddrPTR(addr, sa, salen)
+	})
 }
 
 func cgoLookupAddrPTR(addr string, sa *_C_struct_sockaddr, salen _C_socklen_t) (names []string, err error) {
@@ -280,17 +258,21 @@
 		}
 	}
 	if gerrno != 0 {
+		isErrorNoSuchHost := false
 		isTemporary := false
 		switch gerrno {
 		case _C_EAI_SYSTEM:
 			if err == nil { // see golang.org/issue/6232
 				err = syscall.EMFILE
 			}
+		case _C_EAI_NONAME:
+			err = errNoSuchHost
+			isErrorNoSuchHost = true
 		default:
 			err = addrinfoErrno(gerrno)
 			isTemporary = addrinfoErrno(gerrno).Temporary()
 		}
-		return nil, &DNSError{Err: err.Error(), Name: addr, IsTemporary: isTemporary}
+		return nil, &DNSError{Err: err.Error(), Name: addr, IsTemporary: isTemporary, IsNotFound: isErrorNoSuchHost}
 	}
 	for i := 0; i < len(b); i++ {
 		if b[i] == 0 {
@@ -301,11 +283,6 @@
 	return []string{absDomainName(string(b))}, nil
 }
 
-func cgoReverseLookup(result chan<- reverseLookupResult, addr string, sa *_C_struct_sockaddr, salen _C_socklen_t) {
-	names, err := cgoLookupAddrPTR(addr, sa, salen)
-	result <- reverseLookupResult{names, err}
-}
-
 func cgoSockaddr(ip IP, zone string) (*_C_struct_sockaddr, _C_socklen_t) {
 	if ip4 := ip.To4(); ip4 != nil {
 		return cgoSockaddrInet4(ip4), _C_socklen_t(syscall.SizeofSockaddrInet4)
@@ -331,30 +308,9 @@
 // resSearch will make a call to the 'res_nsearch' routine in the C library
 // and parse the output as a slice of DNS resources.
 func resSearch(ctx context.Context, hostname string, rtype, class int) ([]dnsmessage.Resource, error) {
-	if ctx.Done() == nil {
+	return doBlockingWithCtx(ctx, func() ([]dnsmessage.Resource, error) {
 		return cgoResSearch(hostname, rtype, class)
-	}
-
-	type result struct {
-		res []dnsmessage.Resource
-		err error
-	}
-
-	res := make(chan result, 1)
-	go func() {
-		r, err := cgoResSearch(hostname, rtype, class)
-		res <- result{
-			res: r,
-			err: err,
-		}
-	}()
-
-	select {
-	case res := <-res:
-		return res.res, res.err
-	case <-ctx.Done():
-		return nil, mapErr(ctx.Err())
-	}
+	})
 }
 
 func cgoResSearch(hostname string, rtype, class int) ([]dnsmessage.Resource, error) {
@@ -380,12 +336,14 @@
 	buf := (*_C_uchar)(_C_malloc(uintptr(bufSize)))
 	defer _C_free(unsafe.Pointer(buf))
 
-	s := _C_CString(hostname)
-	defer _C_FreeCString(s)
+	s, err := syscall.BytePtrFromString(hostname)
+	if err != nil {
+		return nil, err
+	}
 
 	var size int
 	for {
-		size, _ = _C_res_nsearch(state, s, class, rtype, buf, bufSize)
+		size, _ = _C_res_nsearch(state, (*_C_char)(unsafe.Pointer(s)), class, rtype, buf, bufSize)
 		if size <= 0 || size > 0xffff {
 			return nil, errors.New("res_nsearch failure")
 		}
diff --git a/src/net/cgo_unix_cgo.go b/src/net/cgo_unix_cgo.go
index 97427e6..d11f3e3 100644
--- a/src/net/cgo_unix_cgo.go
+++ b/src/net/cgo_unix_cgo.go
@@ -7,6 +7,8 @@
 package net
 
 /*
+#define _GNU_SOURCE
+
 #cgo CFLAGS: -fno-stack-protector
 #include <sys/types.h>
 #include <sys/socket.h>
@@ -16,6 +18,10 @@
 #include <string.h>
 #include <stdlib.h>
 
+#ifndef EAI_NODATA
+#define EAI_NODATA -5
+#endif
+
 // If nothing else defined EAI_OVERFLOW, make sure it has a value.
 #ifndef EAI_OVERFLOW
 #define EAI_OVERFLOW -12
@@ -29,6 +35,7 @@
 	_C_AF_INET6     = C.AF_INET6
 	_C_AF_UNSPEC    = C.AF_UNSPEC
 	_C_EAI_AGAIN    = C.EAI_AGAIN
+	_C_EAI_NODATA   = C.EAI_NODATA
 	_C_EAI_NONAME   = C.EAI_NONAME
 	_C_EAI_OVERFLOW = C.EAI_OVERFLOW
 	_C_EAI_SYSTEM   = C.EAI_SYSTEM
@@ -49,13 +56,10 @@
 )
 
 func _C_GoString(p *_C_char) string      { return C.GoString(p) }
-func _C_CString(s string) *_C_char       { return C.CString(s) }
-func _C_FreeCString(p *_C_char)          { C.free(unsafe.Pointer(p)) }
 func _C_malloc(n uintptr) unsafe.Pointer { return C.malloc(C.size_t(n)) }
 func _C_free(p unsafe.Pointer)           { C.free(p) }
 
 func _C_ai_addr(ai *_C_struct_addrinfo) **_C_struct_sockaddr { return &ai.ai_addr }
-func _C_ai_canonname(ai *_C_struct_addrinfo) **_C_char       { return &ai.ai_canonname }
 func _C_ai_family(ai *_C_struct_addrinfo) *_C_int            { return &ai.ai_family }
 func _C_ai_flags(ai *_C_struct_addrinfo) *_C_int             { return &ai.ai_flags }
 func _C_ai_next(ai *_C_struct_addrinfo) **_C_struct_addrinfo { return &ai.ai_next }
diff --git a/src/net/cgo_unix_cgo_darwin.go b/src/net/cgo_unix_cgo_darwin.go
new file mode 100644
index 0000000..40d5e42
--- /dev/null
+++ b/src/net/cgo_unix_cgo_darwin.go
@@ -0,0 +1,21 @@
+// Copyright 2023 The Go 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:build !netgo && cgo && darwin
+
+package net
+
+/*
+#include <resolv.h>
+*/
+import "C"
+
+import (
+	"internal/syscall/unix"
+	"unsafe"
+)
+
+// This will cause a compile error when the size of
+// unix.ResState is too small.
+type _ [unsafe.Sizeof(unix.ResState{}) - unsafe.Sizeof(C.struct___res_state{})]byte
diff --git a/src/net/cgo_unix_syscall.go b/src/net/cgo_unix_syscall.go
index 0d20a52..2eb8df1 100644
--- a/src/net/cgo_unix_syscall.go
+++ b/src/net/cgo_unix_syscall.go
@@ -19,6 +19,7 @@
 	_C_AF_UNSPEC    = syscall.AF_UNSPEC
 	_C_EAI_AGAIN    = unix.EAI_AGAIN
 	_C_EAI_NONAME   = unix.EAI_NONAME
+	_C_EAI_NODATA   = unix.EAI_NODATA
 	_C_EAI_OVERFLOW = unix.EAI_OVERFLOW
 	_C_EAI_SYSTEM   = unix.EAI_SYSTEM
 	_C_IPPROTO_TCP  = syscall.IPPROTO_TCP
@@ -42,14 +43,7 @@
 	return unix.GoString(p)
 }
 
-func _C_CString(s string) *_C_char {
-	p := make([]byte, len(s)+1)
-	copy(p, s)
-	return &p[0]
-}
-
-func _C_FreeCString(p *_C_char) { _C_free(unsafe.Pointer(p)) }
-func _C_free(p unsafe.Pointer)  { runtime.KeepAlive(p) }
+func _C_free(p unsafe.Pointer) { runtime.KeepAlive(p) }
 
 func _C_malloc(n uintptr) unsafe.Pointer {
 	if n <= 0 {
@@ -59,7 +53,6 @@
 }
 
 func _C_ai_addr(ai *_C_struct_addrinfo) **_C_struct_sockaddr { return &ai.Addr }
-func _C_ai_canonname(ai *_C_struct_addrinfo) **_C_char       { return &ai.Canonname }
 func _C_ai_family(ai *_C_struct_addrinfo) *_C_int            { return &ai.Family }
 func _C_ai_flags(ai *_C_struct_addrinfo) *_C_int             { return &ai.Flags }
 func _C_ai_next(ai *_C_struct_addrinfo) **_C_struct_addrinfo { return &ai.Next }
diff --git a/src/net/cgo_unix_test.go b/src/net/cgo_unix_test.go
index 86726dd..d8233df 100644
--- a/src/net/cgo_unix_test.go
+++ b/src/net/cgo_unix_test.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build (cgo || darwin) && !netgo && unix
+//go:build !netgo && ((cgo && unix) || darwin)
 
 package net
 
@@ -14,10 +14,7 @@
 func TestCgoLookupIP(t *testing.T) {
 	defer dnsWaitGroup.Wait()
 	ctx := context.Background()
-	_, err, ok := cgoLookupIP(ctx, "ip", "localhost")
-	if !ok {
-		t.Errorf("cgoLookupIP must not be a placeholder")
-	}
+	_, err := cgoLookupIP(ctx, "ip", "localhost")
 	if err != nil {
 		t.Error(err)
 	}
@@ -27,10 +24,7 @@
 	defer dnsWaitGroup.Wait()
 	ctx, cancel := context.WithCancel(context.Background())
 	defer cancel()
-	_, err, ok := cgoLookupIP(ctx, "ip", "localhost")
-	if !ok {
-		t.Errorf("cgoLookupIP must not be a placeholder")
-	}
+	_, err := cgoLookupIP(ctx, "ip", "localhost")
 	if err != nil {
 		t.Error(err)
 	}
@@ -39,10 +33,7 @@
 func TestCgoLookupPort(t *testing.T) {
 	defer dnsWaitGroup.Wait()
 	ctx := context.Background()
-	_, err, ok := cgoLookupPort(ctx, "tcp", "smtp")
-	if !ok {
-		t.Errorf("cgoLookupPort must not be a placeholder")
-	}
+	_, err := cgoLookupPort(ctx, "tcp", "smtp")
 	if err != nil {
 		t.Error(err)
 	}
@@ -52,10 +43,7 @@
 	defer dnsWaitGroup.Wait()
 	ctx, cancel := context.WithCancel(context.Background())
 	defer cancel()
-	_, err, ok := cgoLookupPort(ctx, "tcp", "smtp")
-	if !ok {
-		t.Errorf("cgoLookupPort must not be a placeholder")
-	}
+	_, err := cgoLookupPort(ctx, "tcp", "smtp")
 	if err != nil {
 		t.Error(err)
 	}
@@ -64,10 +52,7 @@
 func TestCgoLookupPTR(t *testing.T) {
 	defer dnsWaitGroup.Wait()
 	ctx := context.Background()
-	_, err, ok := cgoLookupPTR(ctx, "127.0.0.1")
-	if !ok {
-		t.Errorf("cgoLookupPTR must not be a placeholder")
-	}
+	_, err := cgoLookupPTR(ctx, "127.0.0.1")
 	if err != nil {
 		t.Error(err)
 	}
@@ -77,10 +62,7 @@
 	defer dnsWaitGroup.Wait()
 	ctx, cancel := context.WithCancel(context.Background())
 	defer cancel()
-	_, err, ok := cgoLookupPTR(ctx, "127.0.0.1")
-	if !ok {
-		t.Errorf("cgoLookupPTR must not be a placeholder")
-	}
+	_, err := cgoLookupPTR(ctx, "127.0.0.1")
 	if err != nil {
 		t.Error(err)
 	}
diff --git a/src/net/cgo_windows.go b/src/net/cgo_windows.go
deleted file mode 100644
index 6bb6cbb..0000000
--- a/src/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.
-
-//go: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/src/net/conf.go b/src/net/conf.go
index 4119604..77cc635 100644
--- a/src/net/conf.go
+++ b/src/net/conf.go
@@ -7,29 +7,70 @@
 package net
 
 import (
+	"errors"
 	"internal/bytealg"
 	"internal/godebug"
+	"io/fs"
 	"os"
 	"runtime"
 	"sync"
 	"syscall"
 )
 
-// conf represents a system's network configuration.
+// The net package's name resolution is rather complicated.
+// There are two main approaches, go and cgo.
+// The cgo resolver uses C functions like getaddrinfo.
+// The go resolver reads system files directly and
+// sends DNS packets directly to servers.
+//
+// The netgo build tag prefers the go resolver.
+// The netcgo build tag prefers the cgo resolver.
+//
+// The netgo build tag also prohibits the use of the cgo tool.
+// However, on Darwin, Plan 9, and Windows the cgo resolver is still available.
+// On those systems the cgo resolver does not require the cgo tool.
+// (The term "cgo resolver" was locked in by GODEBUG settings
+// at a time when the cgo resolver did require the cgo tool.)
+//
+// Adding netdns=go to GODEBUG will prefer the go resolver.
+// Adding netdns=cgo to GODEBUG will prefer the cgo resolver.
+//
+// The Resolver struct has a PreferGo field that user code
+// may set to prefer the go resolver. It is documented as being
+// equivalent to adding netdns=go to GODEBUG.
+//
+// When deciding which resolver to use, we first check the PreferGo field.
+// If that is not set, we check the GODEBUG setting.
+// If that is not set, we check the netgo or netcgo build tag.
+// If none of those are set, we normally prefer the go resolver by default.
+// However, if the cgo resolver is available,
+// there is a complex set of conditions for which we prefer the cgo resolver.
+//
+// Other files define the netGoBuildTag, netCgoBuildTag, and cgoAvailable
+// constants.
+
+// conf is used to determine name resolution configuration.
 type conf struct {
-	// forceCgoLookupHost forces CGO to always be used, if available.
-	forceCgoLookupHost bool
+	netGo  bool // prefer go approach, based on build tag and GODEBUG
+	netCgo bool // prefer cgo approach, based on build tag and GODEBUG
 
-	netGo  bool // go DNS resolution forced
-	netCgo bool // non-go DNS resolution forced (cgo, or win32)
+	dnsDebugLevel int // from GODEBUG
 
-	// machine has an /etc/mdns.allow file
-	hasMDNSAllow bool
+	preferCgo bool // if no explicit preference, use cgo
 
-	goos          string // the runtime.GOOS, to ease testing
-	dnsDebugLevel int
+	goos     string   // copy of runtime.GOOS, used for testing
+	mdnsTest mdnsTest // assume /etc/mdns.allow exists, for testing
 }
 
+// mdnsTest is for testing only.
+type mdnsTest int
+
+const (
+	mdnsFromSystem mdnsTest = iota
+	mdnsAssumeExists
+	mdnsAssumeDoesNotExist
+)
+
 var (
 	confOnce sync.Once // guards init of confVal via initConfVal
 	confVal  = &conf{goos: runtime.GOOS}
@@ -41,22 +82,13 @@
 	return confVal
 }
 
+// initConfVal initializes confVal based on the environment
+// that will not change during program execution.
 func initConfVal() {
 	dnsMode, debugLevel := goDebugNetDNS()
+	confVal.netGo = netGoBuildTag || dnsMode == "go"
+	confVal.netCgo = netCgoBuildTag || dnsMode == "cgo"
 	confVal.dnsDebugLevel = debugLevel
-	confVal.netGo = netGo || dnsMode == "go"
-	confVal.netCgo = netCgo || dnsMode == "cgo"
-	if !confVal.netGo && !confVal.netCgo && (runtime.GOOS == "windows" || runtime.GOOS == "plan9") {
-		// Neither of these platforms actually use cgo.
-		//
-		// The meaning of "cgo" mode in the net package is
-		// really "the native OS way", which for libc meant
-		// cgo on the original platforms that motivated
-		// PreferGo support before Windows and Plan9 got support,
-		// at which time the GODEBUG=netdns=go and GODEBUG=netdns=cgo
-		// names were already kinda locked in.
-		confVal.netCgo = true
-	}
 
 	if confVal.dnsDebugLevel > 0 {
 		defer func() {
@@ -65,12 +97,14 @@
 			}
 			switch {
 			case confVal.netGo:
-				if netGo {
+				if netGoBuildTag {
 					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:
+			case !cgoAvailable:
+				println("go package net: cgo resolver not supported; using Go's DNS resolver")
+			case confVal.netCgo || confVal.preferCgo:
 				println("go package net: using cgo DNS resolver")
 			default:
 				println("go package net: dynamic selection of DNS resolver")
@@ -78,60 +112,115 @@
 		}()
 	}
 
-	// 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" || runtime.GOOS == "ios" {
-		confVal.forceCgoLookupHost = true
+	// The remainder of this function sets preferCgo based on
+	// conditions that will not change during program execution.
+
+	// By default, prefer the go resolver.
+	confVal.preferCgo = false
+
+	// If the cgo resolver is not available, we can't prefer it.
+	if !cgoAvailable {
 		return
 	}
 
-	if runtime.GOOS == "windows" || runtime.GOOS == "plan9" {
+	// Some operating systems always prefer the cgo resolver.
+	if goosPrefersCgo() {
+		confVal.preferCgo = true
+		return
+	}
+
+	// The remaining checks are specific to Unix systems.
+	switch runtime.GOOS {
+	case "plan9", "windows", "js", "wasip1":
 		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.
+	// prefer the cgo resolver.
+	// 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
+	if localDomainDefined || os.Getenv("RES_OPTIONS") != "" || os.Getenv("HOSTALIASES") != "" {
+		confVal.preferCgo = 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
+		confVal.preferCgo = true
 		return
 	}
-
-	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 {
-	ret, _ := c.hostLookupOrder(nil, "")
-	return ret == hostLookupCgo
+// goosPreferCgo reports whether the GOOS value passed in prefers
+// the cgo resolver.
+func goosPrefersCgo() bool {
+	switch runtime.GOOS {
+	// Historically on Windows and Plan 9 we prefer the
+	// cgo resolver (which doesn't use the cgo tool) rather than
+	// the go resolver. This is because originally these
+	// systems did not support the go resolver.
+	// Keep it this way for better compatibility.
+	// Perhaps we can revisit this some day.
+	case "windows", "plan9":
+		return true
+
+	// Darwin pops up annoying dialog boxes if programs try to
+	// do their own DNS requests, so prefer cgo.
+	case "darwin", "ios":
+		return true
+
+	// DNS requests don't work on Android, so prefer the cgo resolver.
+	// Issue #10714.
+	case "android":
+		return true
+
+	default:
+		return false
+	}
+}
+
+// mustUseGoResolver reports whether a DNS lookup of any sort is
+// required to use the go resolver. The provided Resolver is optional.
+// This will report true if the cgo resolver is not available.
+func (c *conf) mustUseGoResolver(r *Resolver) bool {
+	return c.netGo || r.preferGo() || !cgoAvailable
+}
+
+// addrLookupOrder determines which strategy to use to resolve addresses.
+// The provided Resolver is optional. nil means to not consider its options.
+// It also returns dnsConfig when it was used to determine the lookup order.
+func (c *conf) addrLookupOrder(r *Resolver, addr string) (ret hostLookupOrder, dnsConf *dnsConfig) {
+	if c.dnsDebugLevel > 1 {
+		defer func() {
+			print("go package net: addrLookupOrder(", addr, ") = ", ret.String(), "\n")
+		}()
+	}
+	return c.lookupOrder(r, "")
 }
 
 // hostLookupOrder determines which strategy to use to resolve hostname.
 // The provided Resolver is optional. nil means to not consider its options.
 // It also returns dnsConfig when it was used to determine the lookup order.
-func (c *conf) hostLookupOrder(r *Resolver, hostname string) (ret hostLookupOrder, dnsConfig *dnsConfig) {
+func (c *conf) hostLookupOrder(r *Resolver, hostname string) (ret hostLookupOrder, dnsConf *dnsConfig) {
 	if c.dnsDebugLevel > 1 {
 		defer func() {
 			print("go package net: hostLookupOrder(", hostname, ") = ", ret.String(), "\n")
 		}()
 	}
-	fallbackOrder := hostLookupCgo
-	if c.netGo || r.preferGo() {
+	return c.lookupOrder(r, hostname)
+}
+
+func (c *conf) lookupOrder(r *Resolver, hostname string) (ret hostLookupOrder, dnsConf *dnsConfig) {
+	// fallbackOrder is the order we return if we can't figure it out.
+	var fallbackOrder hostLookupOrder
+
+	var canUseCgo bool
+	if c.mustUseGoResolver(r) {
+		// Go resolver was explicitly requested
+		// or cgo resolver is not available.
+		// Figure out the order below.
 		switch c.goos {
 		case "windows":
 			// TODO(bradfitz): implement files-based
@@ -142,123 +231,151 @@
 		default:
 			fallbackOrder = hostLookupFilesDNS
 		}
+		canUseCgo = false
+	} else if c.netCgo {
+		// Cgo resolver was explicitly requested.
+		return hostLookupCgo, nil
+	} else if c.preferCgo {
+		// Given a choice, we prefer the cgo resolver.
+		return hostLookupCgo, nil
+	} else {
+		// Neither resolver was explicitly requested
+		// and we have no preference.
+
+		if bytealg.IndexByteString(hostname, '\\') != -1 || bytealg.IndexByteString(hostname, '%') != -1 {
+			// Don't deal with special form hostnames
+			// with backslashes or '%'.
+			return hostLookupCgo, nil
+		}
+
+		// If something is unrecognized, use cgo.
+		fallbackOrder = hostLookupCgo
+		canUseCgo = true
 	}
-	if c.forceCgoLookupHost || c.goos == "android" || c.goos == "windows" || c.goos == "plan9" {
-		return fallbackOrder, nil
-	}
-	if bytealg.IndexByteString(hostname, '\\') != -1 || bytealg.IndexByteString(hostname, '%') != -1 {
-		// Don't deal with special form hostnames with backslashes
-		// or '%'.
+
+	// On systems that don't use /etc/resolv.conf or /etc/nsswitch.conf, we are done.
+	switch c.goos {
+	case "windows", "plan9", "android", "ios":
 		return fallbackOrder, nil
 	}
 
-	conf := getSystemDNSConfig()
-	if conf.err != nil && !os.IsNotExist(conf.err) && !os.IsPermission(conf.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.
-		return fallbackOrder, conf
+	// Try to figure out the order to use for searches.
+	// If we don't recognize something, use fallbackOrder.
+	// That will use cgo unless the Go resolver was explicitly requested.
+	// If we do figure out the order, return something other
+	// than fallbackOrder to use the Go resolver with that order.
+
+	dnsConf = getSystemDNSConfig()
+
+	if canUseCgo && dnsConf.err != nil && !errors.Is(dnsConf.err, fs.ErrNotExist) && !errors.Is(dnsConf.err, fs.ErrPermission) {
+		// We can't read the resolv.conf file, so use cgo if we can.
+		return hostLookupCgo, dnsConf
 	}
 
-	if conf.unknownOpt {
-		return fallbackOrder, conf
+	if canUseCgo && dnsConf.unknownOpt {
+		// We didn't recognize something in resolv.conf,
+		// so use cgo if we can.
+		return hostLookupCgo, dnsConf
 	}
 
 	// 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(conf.err) {
-			return hostLookupFiles, conf
+		// OpenBSD's resolv.conf manpage says that a
+		// non-existent resolv.conf means "lookup" defaults
+		// to only "files", without DNS lookups.
+		if errors.Is(dnsConf.err, fs.ErrNotExist) {
+			return hostLookupFiles, dnsConf
 		}
 
-		lookup := conf.lookup
+		lookup := dnsConf.lookup
 		if len(lookup) == 0 {
 			// https://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, conf
+			return hostLookupDNSFiles, dnsConf
 		}
 		if len(lookup) < 1 || len(lookup) > 2 {
-			return fallbackOrder, conf
+			// We don't recognize this format.
+			return fallbackOrder, dnsConf
 		}
 		switch lookup[0] {
 		case "bind":
 			if len(lookup) == 2 {
 				if lookup[1] == "file" {
-					return hostLookupDNSFiles, conf
+					return hostLookupDNSFiles, dnsConf
 				}
-				return fallbackOrder, conf
+				// Unrecognized.
+				return fallbackOrder, dnsConf
 			}
-			return hostLookupDNS, conf
+			return hostLookupDNS, dnsConf
 		case "file":
 			if len(lookup) == 2 {
 				if lookup[1] == "bind" {
-					return hostLookupFilesDNS, conf
+					return hostLookupFilesDNS, dnsConf
 				}
-				return fallbackOrder, conf
+				// Unrecognized.
+				return fallbackOrder, dnsConf
 			}
-			return hostLookupFiles, conf
+			return hostLookupFiles, dnsConf
 		default:
-			return fallbackOrder, conf
+			// Unrecognized.
+			return fallbackOrder, dnsConf
 		}
+
+		// We always return before this point.
+		// The code below is for non-OpenBSD.
 	}
 
 	// Canonicalize the hostname by removing any trailing dot.
 	if stringsHasSuffix(hostname, ".") {
 		hostname = hostname[:len(hostname)-1]
 	}
-	if stringsHasSuffixFold(hostname, ".local") {
+	if canUseCgo && 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 fallbackOrder, conf
+		return hostLookupCgo, dnsConf
 	}
 
 	nss := getSystemNSS()
 	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 fallbackOrder, conf
+	if errors.Is(nss.err, fs.ErrNotExist) || (nss.err == nil && len(srcs) == 0) {
+		if canUseCgo && c.goos == "solaris" {
+			// illumos defaults to
+			// "nis [NOTFOUND=return] files",
+			// which the go resolver doesn't support.
+			return hostLookupCgo, dnsConf
 		}
 
-		return hostLookupFilesDNS, conf
+		return hostLookupFilesDNS, dnsConf
 	}
 	if nss.err != nil {
 		// We failed to parse or open nsswitch.conf, so
-		// conservatively assume we should use cgo if it's
-		// available.
-		return fallbackOrder, conf
+		// we have nothing to base an order on.
+		return fallbackOrder, dnsConf
 	}
 
-	var mdnsSource, filesSource, dnsSource bool
+	var hasDNSSource bool
+	var hasDNSSourceChecked bool
+
+	var filesSource, dnsSource bool
 	var first string
-	for _, src := range srcs {
-		if src.source == "myhostname" {
-			if isLocalhost(hostname) || isGateway(hostname) || isOutbound(hostname) {
-				return fallbackOrder, conf
-			}
-			hn, err := getHostname()
-			if err != nil || stringsEqualFold(hostname, hn) {
-				return fallbackOrder, conf
-			}
-			continue
-		}
+	for i, src := range srcs {
 		if src.source == "files" || src.source == "dns" {
-			if !src.standardCriteria() {
-				return fallbackOrder, conf // non-standard; let libc deal with it.
+			if canUseCgo && !src.standardCriteria() {
+				// non-standard; let libc deal with it.
+				return hostLookupCgo, dnsConf
 			}
 			if src.source == "files" {
 				filesSource = true
-			} else if src.source == "dns" {
+			} else {
+				hasDNSSource = true
+				hasDNSSourceChecked = true
 				dnsSource = true
 			}
 			if first == "" {
@@ -266,41 +383,90 @@
 			}
 			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
+
+		if canUseCgo {
+			switch {
+			case hostname != "" && src.source == "myhostname":
+				// Let the cgo resolver handle myhostname
+				// if we are looking up the local hostname.
+				if isLocalhost(hostname) || isGateway(hostname) || isOutbound(hostname) {
+					return hostLookupCgo, dnsConf
+				}
+				hn, err := getHostname()
+				if err != nil || stringsEqualFold(hostname, hn) {
+					return hostLookupCgo, dnsConf
+				}
+				continue
+			case hostname != "" && 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.
+
+				// 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.
+				var haveMDNSAllow bool
+				switch c.mdnsTest {
+				case mdnsFromSystem:
+					_, err := os.Stat("/etc/mdns.allow")
+					if err != nil && !errors.Is(err, fs.ErrNotExist) {
+						// Let libc figure out what is going on.
+						return hostLookupCgo, dnsConf
+					}
+					haveMDNSAllow = err == nil
+				case mdnsAssumeExists:
+					haveMDNSAllow = true
+				case mdnsAssumeDoesNotExist:
+					haveMDNSAllow = false
+				}
+				if haveMDNSAllow {
+					return hostLookupCgo, dnsConf
+				}
+				continue
+			default:
+				// Some source we don't know how to deal with.
+				return hostLookupCgo, dnsConf
+			}
 		}
-		// Some source we don't know how to deal with.
-		return fallbackOrder, conf
+
+		if !hasDNSSourceChecked {
+			hasDNSSourceChecked = true
+			for _, v := range srcs[i+1:] {
+				if v.source == "dns" {
+					hasDNSSource = true
+					break
+				}
+			}
+		}
+
+		// If we saw a source we don't recognize, which can only
+		// happen if we can't use the cgo resolver, treat it as DNS,
+		// but only when there is no dns in all other sources.
+		if !hasDNSSource {
+			dnsSource = true
+			if first == "" {
+				first = "dns"
+			}
+		}
 	}
 
-	// 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 fallbackOrder, conf
-	}
-
-	// Cases where Go can handle it without cgo and C thread
-	// overhead.
+	// Cases where Go can handle it without cgo and C thread overhead,
+	// or where the Go resolver has been forced.
 	switch {
 	case filesSource && dnsSource:
 		if first == "files" {
-			return hostLookupFilesDNS, conf
+			return hostLookupFilesDNS, dnsConf
 		} else {
-			return hostLookupDNSFiles, conf
+			return hostLookupDNSFiles, dnsConf
 		}
 	case filesSource:
-		return hostLookupFiles, conf
+		return hostLookupFiles, dnsConf
 	case dnsSource:
-		return hostLookupDNS, conf
+		return hostLookupDNS, dnsConf
 	}
 
-	// Something weird. Let libc deal with it.
-	return fallbackOrder, conf
+	// Something weird. Fallback to the default.
+	return fallbackOrder, dnsConf
 }
 
 var netdns = godebug.New("netdns")
diff --git a/src/net/conf_netcgo.go b/src/net/conf_netcgo.go
deleted file mode 100644
index 82d1bb6..0000000
--- a/src/net/conf_netcgo.go
+++ /dev/null
@@ -1,18 +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:build netcgo
-
-package net
-
-/*
-
-// Fail if cgo isn't available.
-
-*/
-import "C"
-
-// The build tag "netcgo" forces use of the cgo DNS resolver.
-// It is the opposite of "netgo".
-func init() { netCgo = true }
diff --git a/src/net/conf_test.go b/src/net/conf_test.go
index 3736709..0f324b2 100644
--- a/src/net/conf_test.go
+++ b/src/net/conf_test.go
@@ -43,6 +43,15 @@
 }
 
 func TestConfHostLookupOrder(t *testing.T) {
+	// These tests are written for a system with cgo available,
+	// without using the netgo tag.
+	if netGoBuildTag {
+		t.Skip("skipping test because net package built with netgo tag")
+	}
+	if !cgoAvailable {
+		t.Skip("skipping test because cgo resolver not available")
+	}
+
 	tests := []struct {
 		name      string
 		c         *conf
@@ -54,7 +63,8 @@
 		{
 			name: "force",
 			c: &conf{
-				forceCgoLookupHost: true,
+				preferCgo: true,
+				netCgo:    true,
 			},
 			resolv: defaultResolvConf,
 			nss:    nssStr(t, "foo: bar"),
@@ -82,12 +92,14 @@
 			resolv: defaultResolvConf,
 			nss:    nssStr(t, "hosts: dns files something_custom"),
 			hostTests: []nssHostTest{
-				{"x.com", "myhostname", hostLookupFilesDNS},
+				{"x.com", "myhostname", hostLookupDNSFiles},
 			},
 		},
 		{
-			name:   "ubuntu_trusty_avahi",
-			c:      &conf{},
+			name: "ubuntu_trusty_avahi",
+			c: &conf{
+				mdnsTest: mdnsAssumeDoesNotExist,
+			},
 			resolv: defaultResolvConf,
 			nss:    nssStr(t, "hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4"),
 			hostTests: []nssHostTest{
@@ -203,8 +215,10 @@
 			hostTests: []nssHostTest{{"google.com", "myhostname", hostLookupFilesDNS}},
 		},
 		{
-			name:   "files_mdns_dns",
-			c:      &conf{},
+			name: "files_mdns_dns",
+			c: &conf{
+				mdnsTest: mdnsAssumeDoesNotExist,
+			},
 			resolv: defaultResolvConf,
 			nss:    nssStr(t, "hosts: files mdns dns"),
 			hostTests: []nssHostTest{
@@ -226,7 +240,7 @@
 		{
 			name: "mdns_allow",
 			c: &conf{
-				hasMDNSAllow: true,
+				mdnsTest: mdnsAssumeExists,
 			},
 			resolv: defaultResolvConf,
 			nss:    nssStr(t, "hosts: files mdns dns"),
@@ -290,12 +304,13 @@
 				{"anything.localhost.localdomain", "myhostname", hostLookupCgo},
 				{"Anything.Localhost.Localdomain", "myhostname", hostLookupCgo},
 				{"somehostname", "myhostname", hostLookupFilesDNS},
-				{"", "myhostname", hostLookupFilesDNS}, // Issue 13623
 			},
 		},
 		{
-			name:   "ubuntu14.04.02",
-			c:      &conf{},
+			name: "ubuntu14.04.02",
+			c: &conf{
+				mdnsTest: mdnsAssumeDoesNotExist,
+			},
 			resolv: defaultResolvConf,
 			nss:    nssStr(t, "hosts: files myhostname mdns4_minimal [NOTFOUND=return] dns mdns4"),
 			hostTests: []nssHostTest{
@@ -325,26 +340,13 @@
 			nss:       nssStr(t, "foo: bar"),
 			hostTests: []nssHostTest{{"google.com", "myhostname", hostLookupCgo}},
 		},
-		// Android should always use cgo.
-		{
-			name: "android",
-			c: &conf{
-				goos: "android",
-			},
-			resolv: defaultResolvConf,
-			nss:    nssStr(t, ""),
-			hostTests: []nssHostTest{
-				{"x.com", "myhostname", hostLookupCgo},
-			},
-		},
 		// Issue 24393: make sure "Resolver.PreferGo = true" acts like netgo.
 		{
 			name:     "resolver-prefergo",
 			resolver: &Resolver{PreferGo: true},
 			c: &conf{
-				goos:               "darwin",
-				forceCgoLookupHost: true, // always true for darwin
-				netCgo:             true,
+				preferCgo: true,
+				netCgo:    true,
 			},
 			resolv: defaultResolvConf,
 			nss:    nssStr(t, ""),
@@ -352,6 +354,36 @@
 				{"localhost", "myhostname", hostLookupFilesDNS},
 			},
 		},
+		{
+			name:     "unknown-source",
+			resolver: &Resolver{PreferGo: true},
+			c:        &conf{},
+			resolv:   defaultResolvConf,
+			nss:      nssStr(t, "hosts: resolve files"),
+			hostTests: []nssHostTest{
+				{"x.com", "myhostname", hostLookupDNSFiles},
+			},
+		},
+		{
+			name:     "dns-among-unknown-sources",
+			resolver: &Resolver{PreferGo: true},
+			c:        &conf{},
+			resolv:   defaultResolvConf,
+			nss:      nssStr(t, "hosts: mymachines files dns"),
+			hostTests: []nssHostTest{
+				{"x.com", "myhostname", hostLookupFilesDNS},
+			},
+		},
+		{
+			name:     "dns-among-unknown-sources-2",
+			resolver: &Resolver{PreferGo: true},
+			c:        &conf{},
+			resolv:   defaultResolvConf,
+			nss:      nssStr(t, "hosts: dns mymachines files"),
+			hostTests: []nssHostTest{
+				{"x.com", "myhostname", hostLookupDNSFiles},
+			},
+		},
 	}
 
 	origGetHostname := getHostname
@@ -379,6 +411,42 @@
 	}
 }
 
+func TestAddrLookupOrder(t *testing.T) {
+	// This test is written for a system with cgo available,
+	// without using the netgo tag.
+	if netGoBuildTag {
+		t.Skip("skipping test because net package built with netgo tag")
+	}
+	if !cgoAvailable {
+		t.Skip("skipping test because cgo resolver not available")
+	}
+
+	defer setSystemNSS(getSystemNSS(), 0)
+	c, err := newResolvConfTest()
+	if err != nil {
+		t.Fatal(err)
+	}
+	defer c.teardown()
+
+	if !c.forceUpdateConf(defaultResolvConf, time.Now().Add(time.Hour)) {
+		t.Fatal("failed to change resolv config")
+	}
+
+	setSystemNSS(nssStr(t, "hosts: files myhostname dns"), time.Hour)
+	cnf := &conf{}
+	order, _ := cnf.addrLookupOrder(nil, "192.0.2.1")
+	if order != hostLookupCgo {
+		t.Errorf("addrLookupOrder returned: %v, want cgo", order)
+	}
+
+	setSystemNSS(nssStr(t, "hosts: files mdns4 dns"), time.Hour)
+	order, _ = cnf.addrLookupOrder(nil, "192.0.2.1")
+	if order != hostLookupCgo {
+		t.Errorf("addrLookupOrder returned: %v, want cgo", order)
+	}
+
+}
+
 func setSystemNSS(nss *nssConf, addDur time.Duration) {
 	nssConfig.mu.Lock()
 	nssConfig.nssConf = nss
diff --git a/src/net/conn_test.go b/src/net/conn_test.go
index d168dda..4f391b0 100644
--- a/src/net/conn_test.go
+++ b/src/net/conn_test.go
@@ -5,7 +5,7 @@
 // This file implements API tests across platforms and will never have a build
 // tag.
 
-//go:build !js
+//go:build !js && !wasip1
 
 package net
 
diff --git a/src/net/dial.go b/src/net/dial.go
index 85ec557..79bc495 100644
--- a/src/net/dial.go
+++ b/src/net/dial.go
@@ -6,17 +6,60 @@
 
 import (
 	"context"
+	"internal/godebug"
 	"internal/nettrace"
 	"syscall"
 	"time"
 )
 
-// defaultTCPKeepAlive is a default constant value for TCPKeepAlive times
-// See golang.org/issue/31510
 const (
+	// defaultTCPKeepAlive is a default constant value for TCPKeepAlive times
+	// See go.dev/issue/31510
 	defaultTCPKeepAlive = 15 * time.Second
+
+	// For the moment, MultiPath TCP is not used by default
+	// See go.dev/issue/56539
+	defaultMPTCPEnabled = false
 )
 
+var multipathtcp = godebug.New("multipathtcp")
+
+// mptcpStatus is a tristate for Multipath TCP, see go.dev/issue/56539
+type mptcpStatus uint8
+
+const (
+	// The value 0 is the system default, linked to defaultMPTCPEnabled
+	mptcpUseDefault mptcpStatus = iota
+	mptcpEnabled
+	mptcpDisabled
+)
+
+func (m *mptcpStatus) get() bool {
+	switch *m {
+	case mptcpEnabled:
+		return true
+	case mptcpDisabled:
+		return false
+	}
+
+	// If MPTCP is forced via GODEBUG=multipathtcp=1
+	if multipathtcp.Value() == "1" {
+		multipathtcp.IncNonDefault()
+
+		return true
+	}
+
+	return defaultMPTCPEnabled
+}
+
+func (m *mptcpStatus) set(use bool) {
+	if use {
+		*m = mptcpEnabled
+	} else {
+		*m = mptcpDisabled
+	}
+}
+
 // A Dialer contains options for connecting to an address.
 //
 // The zero value for each field is equivalent to dialing
@@ -92,7 +135,7 @@
 	// If Control is not nil, it is called after creating the network
 	// connection but before actually dialing.
 	//
-	// Network and address parameters passed to Control method are not
+	// Network and address parameters passed to Control function are not
 	// necessarily the ones passed to Dial. For example, passing "tcp" to Dial
 	// will cause the Control function to be called with "tcp4" or "tcp6".
 	//
@@ -102,12 +145,17 @@
 	// If ControlContext is not nil, it is called after creating the network
 	// connection but before actually dialing.
 	//
-	// Network and address parameters passed to Control method are not
+	// Network and address parameters passed to ControlContext function are not
 	// necessarily the ones passed to Dial. For example, passing "tcp" to Dial
-	// will cause the Control function to be called with "tcp4" or "tcp6".
+	// will cause the ControlContext function to be called with "tcp4" or "tcp6".
 	//
 	// If ControlContext is not nil, Control is ignored.
 	ControlContext func(ctx context.Context, network, address string, c syscall.RawConn) error
+
+	// If mptcpStatus is set to a value allowing Multipath TCP (MPTCP) to be
+	// used, any call to Dial with "tcp(4|6)" as network will use MPTCP if
+	// supported by the operating system.
+	mptcpStatus mptcpStatus
 }
 
 func (d *Dialer) dualStack() bool { return d.FallbackDelay >= 0 }
@@ -281,6 +329,24 @@
 	return naddrs, nil
 }
 
+// MultipathTCP reports whether MPTCP will be used.
+//
+// This method doesn't check if MPTCP is supported by the operating
+// system or not.
+func (d *Dialer) MultipathTCP() bool {
+	return d.mptcpStatus.get()
+}
+
+// SetMultipathTCP directs the Dial methods to use, or not use, MPTCP,
+// if supported by the operating system. This method overrides the
+// system default and the GODEBUG=multipathtcp=... setting if any.
+//
+// If MPTCP is not available on the host or not supported by the server,
+// the Dial methods will fall back to TCP.
+func (d *Dialer) SetMultipathTCP(use bool) {
+	d.mptcpStatus.set(use)
+}
+
 // Dial connects to the address on the named network.
 //
 // Known networks are "tcp", "tcp4" (IPv4-only), "tcp6" (IPv6-only),
@@ -577,7 +643,11 @@
 	switch ra := ra.(type) {
 	case *TCPAddr:
 		la, _ := la.(*TCPAddr)
-		c, err = sd.dialTCP(ctx, la, ra)
+		if sd.MultipathTCP() {
+			c, err = sd.dialMPTCP(ctx, la, ra)
+		} else {
+			c, err = sd.dialTCP(ctx, la, ra)
+		}
 	case *UDPAddr:
 		la, _ := la.(*UDPAddr)
 		c, err = sd.dialUDP(ctx, la, ra)
@@ -613,6 +683,29 @@
 	// that do not support keep-alives ignore this field.
 	// If negative, keep-alives are disabled.
 	KeepAlive time.Duration
+
+	// If mptcpStatus is set to a value allowing Multipath TCP (MPTCP) to be
+	// used, any call to Listen with "tcp(4|6)" as network will use MPTCP if
+	// supported by the operating system.
+	mptcpStatus mptcpStatus
+}
+
+// MultipathTCP reports whether MPTCP will be used.
+//
+// This method doesn't check if MPTCP is supported by the operating
+// system or not.
+func (lc *ListenConfig) MultipathTCP() bool {
+	return lc.mptcpStatus.get()
+}
+
+// SetMultipathTCP directs the Listen method to use, or not use, MPTCP,
+// if supported by the operating system. This method overrides the
+// system default and the GODEBUG=multipathtcp=... setting if any.
+//
+// If MPTCP is not available on the host or not supported by the client,
+// the Listen method will fall back to TCP.
+func (lc *ListenConfig) SetMultipathTCP(use bool) {
+	lc.mptcpStatus.set(use)
 }
 
 // Listen announces on the local network address.
@@ -633,7 +726,11 @@
 	la := addrs.first(isIPv4)
 	switch la := la.(type) {
 	case *TCPAddr:
-		l, err = sl.listenTCP(ctx, la)
+		if sl.MultipathTCP() {
+			l, err = sl.listenMPTCP(ctx, la)
+		} else {
+			l, err = sl.listenTCP(ctx, la)
+		}
 	case *UnixAddr:
 		l, err = sl.listenUnix(ctx, la)
 	default:
diff --git a/src/net/dial_test.go b/src/net/dial_test.go
index b04607e..ca9f0da 100644
--- a/src/net/dial_test.go
+++ b/src/net/dial_test.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build !js
+//go:build !js && !wasip1
 
 package net
 
@@ -736,12 +736,6 @@
 func TestDialCancel(t *testing.T) {
 	mustHaveExternalNetwork(t)
 
-	if strings.HasPrefix(testenv.Builder(), "darwin-arm64") {
-		// The darwin-arm64 machines run in an environment that's not
-		// compatible with this test.
-		t.Skipf("builder %q gives no route to host for 198.18.0.0", testenv.Builder())
-	}
-
 	blackholeIPPort := JoinHostPort(slowDst4, "1234")
 	if !supportsIPv4() {
 		blackholeIPPort = JoinHostPort(slowDst6, "1234")
@@ -786,9 +780,18 @@
 			if ticks < cancelTick {
 				// Using strings.Contains is ugly but
 				// may work on plan9 and windows.
-				if strings.Contains(err.Error(), "connection refused") {
-					t.Skipf("connection to %v failed fast with %v", blackholeIPPort, err)
+				ignorable := []string{
+					"connection refused",
+					"unreachable",
+					"no route to host",
 				}
+				e := err.Error()
+				for _, ignore := range ignorable {
+					if strings.Contains(e, ignore) {
+						t.Skipf("connection to %v failed fast with %v", blackholeIPPort, err)
+					}
+				}
+
 				t.Fatalf("dial error after %d ticks (%d before cancel sent): %v",
 					ticks, cancelTick-ticks, err)
 			}
@@ -878,23 +881,101 @@
 	}
 }
 
+func TestDialClosedPortFailFast(t *testing.T) {
+	if runtime.GOOS != "windows" {
+		// Reported by go.dev/issues/23366.
+		t.Skip("skipping windows only test")
+	}
+	for _, network := range []string{"tcp", "tcp4", "tcp6"} {
+		t.Run(network, func(t *testing.T) {
+			if !testableNetwork(network) {
+				t.Skipf("skipping: can't listen on %s", network)
+			}
+			// Reserve a local port till the end of the
+			// test by opening a listener and connecting to
+			// it using Dial.
+			ln := newLocalListener(t, network)
+			addr := ln.Addr().String()
+			conn1, err := Dial(network, addr)
+			if err != nil {
+				ln.Close()
+				t.Fatal(err)
+			}
+			defer conn1.Close()
+			// Now close the listener so the next Dial fails
+			// keeping conn1 alive so the port is not made
+			// available.
+			ln.Close()
+
+			maxElapsed := time.Second
+			// The host can be heavy-loaded and take
+			// longer than configured. Retry until
+			// Dial takes less than maxElapsed or
+			// the test times out.
+			for {
+				startTime := time.Now()
+				conn2, err := Dial(network, addr)
+				if err == nil {
+					conn2.Close()
+					t.Fatal("error expected")
+				}
+				elapsed := time.Since(startTime)
+				if elapsed < maxElapsed {
+					break
+				}
+				t.Logf("got %v; want < %v", elapsed, maxElapsed)
+			}
+		})
+	}
+}
+
 // Issue 18806: it should always be possible to net.Dial a
 // net.Listener().Addr().String when the listen address was ":n", even
 // if the machine has halfway configured IPv6 such that it can bind on
 // "::" not connect back to that same address.
 func TestDialListenerAddr(t *testing.T) {
-	mustHaveExternalNetwork(t)
-	ln, err := Listen("tcp", ":0")
+	if !testableNetwork("tcp4") {
+		t.Skipf("skipping: can't listen on tcp4")
+	}
+
+	// The original issue report was for listening on just ":0" on a system that
+	// supports both tcp4 and tcp6 for external traffic but only tcp4 for loopback
+	// traffic. However, the port opened by ":0" is externally-accessible, and may
+	// trigger firewall alerts or otherwise be mistaken for malicious activity
+	// (see https://go.dev/issue/59497). Moreover, it often does not reproduce
+	// the scenario in the issue, in which the port *cannot* be dialed as tcp6.
+	//
+	// To address both of those problems, we open a tcp4-only localhost port, but
+	// then dial the address string that the listener would have reported for a
+	// dual-stack port.
+	ln, err := Listen("tcp4", "localhost:0")
 	if err != nil {
 		t.Fatal(err)
 	}
 	defer ln.Close()
-	addr := ln.Addr().String()
-	c, err := Dial("tcp", addr)
+
+	t.Logf("listening on %q", ln.Addr())
+	_, port, err := SplitHostPort(ln.Addr().String())
 	if err != nil {
-		t.Fatalf("for addr %q, dial error: %v", addr, err)
+		t.Fatal(err)
+	}
+
+	// If we had opened a dual-stack port without an explicit "localhost" address,
+	// the Listener would arbitrarily report an empty tcp6 address in its Addr
+	// string.
+	//
+	// The documentation for Dial says ‘if the host is empty or a literal
+	// unspecified IP address, as in ":80", "0.0.0.0:80" or "[::]:80" for TCP and
+	// UDP, "", "0.0.0.0" or "::" for IP, the local system is assumed.’
+	// In #18806, it was decided that that should include the local tcp4 host
+	// even if the string is in the tcp6 format.
+	dialAddr := "[::]:" + port
+	c, err := Dial("tcp4", dialAddr)
+	if err != nil {
+		t.Fatalf(`Dial("tcp4", %q): %v`, dialAddr, err)
 	}
 	c.Close()
+	t.Logf(`Dial("tcp4", %q) succeeded`, dialAddr)
 }
 
 func TestDialerControl(t *testing.T) {
diff --git a/src/net/dnsclient_unix.go b/src/net/dnsclient_unix.go
index 20da8f1..dab5144 100644
--- a/src/net/dnsclient_unix.go
+++ b/src/net/dnsclient_unix.go
@@ -810,21 +810,33 @@
 }
 
 // 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 (r *Resolver) goLookupPTR(ctx context.Context, addr string, conf *dnsConfig) ([]string, error) {
-	names := lookupStaticAddr(addr)
-	if len(names) > 0 {
-		return names, nil
+func (r *Resolver) goLookupPTR(ctx context.Context, addr string, order hostLookupOrder, conf *dnsConfig) ([]string, error) {
+	if order == hostLookupFiles || order == hostLookupFilesDNS {
+		names := lookupStaticAddr(addr)
+		if len(names) > 0 {
+			return names, nil
+		}
+
+		if order == hostLookupFiles {
+			return nil, &DNSError{Err: errNoSuchHost.Error(), Name: addr, IsNotFound: true}
+		}
 	}
+
 	arpa, err := reverseaddr(addr)
 	if err != nil {
 		return nil, err
 	}
 	p, server, err := r.lookup(ctx, arpa, dnsmessage.TypePTR, conf)
 	if err != nil {
+		var dnsErr *DNSError
+		if errors.As(err, &dnsErr) && dnsErr.IsNotFound {
+			if order == hostLookupDNSFiles {
+				names := lookupStaticAddr(addr)
+				if len(names) > 0 {
+					return names, nil
+				}
+			}
+		}
 		return nil, err
 	}
 	var ptrs []string
@@ -862,5 +874,6 @@
 		ptrs = append(ptrs, ptr.PTR.String())
 
 	}
+
 	return ptrs, nil
 }
diff --git a/src/net/dnsclient_unix_test.go b/src/net/dnsclient_unix_test.go
index 3ba19eb..8d435a5 100644
--- a/src/net/dnsclient_unix_test.go
+++ b/src/net/dnsclient_unix_test.go
@@ -10,6 +10,7 @@
 	"context"
 	"errors"
 	"fmt"
+	"internal/testenv"
 	"os"
 	"path"
 	"path/filepath"
@@ -1442,7 +1443,7 @@
 func lookupWithFake(fake fakeDNSServer, name string, typ dnsmessage.Type) error {
 	r := Resolver{PreferGo: true, Dial: fake.DialContext}
 
-	conf := resolvConf.dnsConfig.Load()
+	conf := getSystemDNSConfig()
 
 	ctx, cancel := context.WithCancel(context.Background())
 	defer cancel()
@@ -1604,7 +1605,7 @@
 	ctx := context.Background()
 	_, _, err := r.exchange(ctx, "0.0.0.0", mustQuestion("com.", dnsmessage.TypeALL, dnsmessage.ClassINET), time.Second, useUDPOrTCP, false)
 	if err != nil {
-		t.Fatal("exhange failed:", err)
+		t.Fatal("exchange failed:", err)
 	}
 }
 
@@ -2199,6 +2200,9 @@
 }
 
 func TestGoLookupIPCNAMEOrderHostsAliasesDNSFilesMode(t *testing.T) {
+	if testenv.Builder() == "" {
+		t.Skip("Makes assumptions about local networks and (re)naming that aren't always true")
+	}
 	defer func(orig string) { testHookHostsPath = orig }(testHookHostsPath)
 	testHookHostsPath = "testdata/aliases"
 	mode := hostLookupDNSFiles
diff --git a/src/net/dnsconfig_unix.go b/src/net/dnsconfig_unix.go
index 8f6ae34..69b3004 100644
--- a/src/net/dnsconfig_unix.go
+++ b/src/net/dnsconfig_unix.go
@@ -10,6 +10,7 @@
 
 import (
 	"internal/bytealg"
+	"net/netip"
 	"time"
 )
 
@@ -51,9 +52,7 @@
 				// 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, JoinHostPort(f[1], "53"))
-				} else if ip, _ := parseIPv6Zone(f[1]); ip != nil {
+				if _, err := netip.ParseAddr(f[1]); err == nil {
 					conf.servers = append(conf.servers, JoinHostPort(f[1], "53"))
 				}
 			}
diff --git a/src/net/dnsconfig_windows.go b/src/net/dnsconfig_windows.go
index 5d640da..f3d2423 100644
--- a/src/net/dnsconfig_windows.go
+++ b/src/net/dnsconfig_windows.go
@@ -5,6 +5,7 @@
 package net
 
 import (
+	"internal/syscall/windows"
 	"syscall"
 	"time"
 )
@@ -30,6 +31,10 @@
 	// In practice, however, it mostly works.
 	for _, aa := range aas {
 		for dns := aa.FirstDnsServerAddress; dns != nil; dns = dns.Next {
+			// Only take interfaces whose OperStatus is IfOperStatusUp(0x01) into DNS configs.
+			if aa.OperStatus != windows.IfOperStatusUp {
+				continue
+			}
 			sa, err := dns.Address.Sockaddr.Sockaddr()
 			if err != nil {
 				continue
diff --git a/src/net/dnsname_test.go b/src/net/dnsname_test.go
index 28b7c68..4a5f01a 100644
--- a/src/net/dnsname_test.go
+++ b/src/net/dnsname_test.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build !js
+//go:build !js && !wasip1
 
 package net
 
diff --git a/src/net/error_posix.go b/src/net/error_posix.go
index 8fc7d0b..c8dc069 100644
--- a/src/net/error_posix.go
+++ b/src/net/error_posix.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build unix || (js && wasm) || windows
+//go:build unix || (js && wasm) || wasip1 || windows
 
 package net
 
@@ -12,7 +12,7 @@
 )
 
 // wrapSyscallError takes an error and a syscall name. If the error is
-// a syscall.Errno, it wraps it in a os.SyscallError using the syscall name.
+// a syscall.Errno, it wraps it in an os.SyscallError using the syscall name.
 func wrapSyscallError(name string, err error) error {
 	if _, ok := err.(syscall.Errno); ok {
 		err = os.NewSyscallError(name, err)
diff --git a/src/net/error_test.go b/src/net/error_test.go
index 4467dc1..4538765 100644
--- a/src/net/error_test.go
+++ b/src/net/error_test.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build !js
+//go:build !js && !wasip1
 
 package net
 
@@ -92,7 +92,9 @@
 		return nil
 	}
 	switch err := nestedErr.(type) {
-	case *AddrError, addrinfoErrno, *timeoutError, *DNSError, InvalidAddrError, *ParseError, *poll.DeadlineExceededError, UnknownNetworkError:
+	case *AddrError, *timeoutError, *DNSError, InvalidAddrError, *ParseError, *poll.DeadlineExceededError, UnknownNetworkError:
+		return nil
+	case interface{ isAddrinfoErrno() }:
 		return nil
 	case *os.SyscallError:
 		nestedErr = err.Err
@@ -472,7 +474,9 @@
 		return nil
 	}
 	switch err := nestedErr.(type) {
-	case *AddrError, addrinfoErrno, *timeoutError, *DNSError, InvalidAddrError, *ParseError, *poll.DeadlineExceededError, UnknownNetworkError:
+	case *AddrError, *timeoutError, *DNSError, InvalidAddrError, *ParseError, *poll.DeadlineExceededError, UnknownNetworkError:
+		return nil
+	case interface{ isAddrinfoErrno() }:
 		return nil
 	case *os.SyscallError:
 		nestedErr = err.Err
diff --git a/src/net/error_unix.go b/src/net/error_unix.go
index 1f9b6eb..d694867 100644
--- a/src/net/error_unix.go
+++ b/src/net/error_unix.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build unix || js
+//go:build unix || js || wasip1
 
 package net
 
diff --git a/src/net/external_test.go b/src/net/external_test.go
index 3a97011..0709b9d 100644
--- a/src/net/external_test.go
+++ b/src/net/external_test.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build !js
+//go:build !js && !wasip1
 
 package net
 
diff --git a/src/net/fcntl_libc_test.go b/src/net/fcntl_libc_test.go
deleted file mode 100644
index 5858865..0000000
--- a/src/net/fcntl_libc_test.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2021 The Go 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:build aix || darwin || (openbsd && !mips64) || solaris
-
-package net
-
-import _ "unsafe" // for go:linkname
-
-// Implemented in the syscall package.
-//
-//go:linkname fcntl syscall.fcntl
-func fcntl(fd int, cmd int, arg int) (int, error)
diff --git a/src/net/fcntl_syscall_test.go b/src/net/fcntl_syscall_test.go
deleted file mode 100644
index b9ac1d3..0000000
--- a/src/net/fcntl_syscall_test.go
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2021 The Go 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:build dragonfly || freebsd || linux || netbsd || (openbsd && mips64)
-
-package net
-
-import (
-	"internal/syscall/unix"
-	"syscall"
-)
-
-func fcntl(fd int, cmd int, arg int) (int, error) {
-	r, _, e := syscall.Syscall(unix.FcntlSyscall, uintptr(fd), uintptr(cmd), uintptr(arg))
-	if e != 0 {
-		return int(r), syscall.Errno(e)
-	}
-	return int(r), nil
-}
diff --git a/src/net/fd_unix.go b/src/net/fd_unix.go
index a400c60..a8d3a25 100644
--- a/src/net/fd_unix.go
+++ b/src/net/fd_unix.go
@@ -190,6 +190,9 @@
 	return netfd, nil
 }
 
+// Defined in os package.
+func newUnixFile(fd int, name string) *os.File
+
 func (fd *netFD) dup() (f *os.File, err error) {
 	ns, call, err := fd.pfd.Dup()
 	if err != nil {
@@ -199,5 +202,5 @@
 		return nil, err
 	}
 
-	return os.NewFile(uintptr(ns), fd.name()), nil
+	return newUnixFile(ns, fd.name()), nil
 }
diff --git a/src/net/fd_wasip1.go b/src/net/fd_wasip1.go
new file mode 100644
index 0000000..74d0b0b
--- /dev/null
+++ b/src/net/fd_wasip1.go
@@ -0,0 +1,184 @@
+// Copyright 2023 The Go 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:build wasip1
+
+package net
+
+import (
+	"internal/poll"
+	"runtime"
+	"syscall"
+	"time"
+)
+
+const (
+	readSyscallName  = "fd_read"
+	writeSyscallName = "fd_write"
+)
+
+// Network file descriptor.
+type netFD struct {
+	pfd poll.FD
+
+	// immutable until Close
+	family      int
+	sotype      int
+	isConnected bool // handshake completed or use of association with peer
+	net         string
+	laddr       Addr
+	raddr       Addr
+
+	// The only networking available in WASI preview 1 is the ability to
+	// sock_accept on an pre-opened socket, and then fd_read, fd_write,
+	// fd_close, and sock_shutdown on the resulting connection. We
+	// intercept applicable netFD calls on this instance, and then pass
+	// the remainder of the netFD calls to fakeNetFD.
+	*fakeNetFD
+}
+
+func newFD(net string, sysfd int) *netFD {
+	return newPollFD(net, poll.FD{
+		Sysfd:         sysfd,
+		IsStream:      true,
+		ZeroReadIsEOF: true,
+	})
+}
+
+func newPollFD(net string, pfd poll.FD) *netFD {
+	var laddr Addr
+	var raddr Addr
+	// WASI preview 1 does not have functions like getsockname/getpeername,
+	// so we cannot get access to the underlying IP address used by connections.
+	//
+	// However, listeners created by FileListener are of type *TCPListener,
+	// which can be asserted by a Go program. The (*TCPListener).Addr method
+	// documents that the returned value will be of type *TCPAddr, we satisfy
+	// the documented behavior by creating addresses of the expected type here.
+	switch net {
+	case "tcp":
+		laddr = new(TCPAddr)
+		raddr = new(TCPAddr)
+	case "udp":
+		laddr = new(UDPAddr)
+		raddr = new(UDPAddr)
+	default:
+		laddr = unknownAddr{}
+		raddr = unknownAddr{}
+	}
+	return &netFD{
+		pfd:   pfd,
+		net:   net,
+		laddr: laddr,
+		raddr: raddr,
+	}
+}
+
+func (fd *netFD) init() error {
+	return fd.pfd.Init(fd.net, true)
+}
+
+func (fd *netFD) name() string {
+	return "unknown"
+}
+
+func (fd *netFD) accept() (netfd *netFD, err error) {
+	if fd.fakeNetFD != nil {
+		return fd.fakeNetFD.accept()
+	}
+	d, _, errcall, err := fd.pfd.Accept()
+	if err != nil {
+		if errcall != "" {
+			err = wrapSyscallError(errcall, err)
+		}
+		return nil, err
+	}
+	netfd = newFD("tcp", d)
+	if err = netfd.init(); err != nil {
+		netfd.Close()
+		return nil, err
+	}
+	return netfd, nil
+}
+
+func (fd *netFD) setAddr(laddr, raddr Addr) {
+	fd.laddr = laddr
+	fd.raddr = raddr
+	runtime.SetFinalizer(fd, (*netFD).Close)
+}
+
+func (fd *netFD) Close() error {
+	if fd.fakeNetFD != nil {
+		return fd.fakeNetFD.Close()
+	}
+	runtime.SetFinalizer(fd, nil)
+	return fd.pfd.Close()
+}
+
+func (fd *netFD) shutdown(how int) error {
+	if fd.fakeNetFD != nil {
+		return nil
+	}
+	err := fd.pfd.Shutdown(how)
+	runtime.KeepAlive(fd)
+	return wrapSyscallError("shutdown", err)
+}
+
+func (fd *netFD) closeRead() error {
+	if fd.fakeNetFD != nil {
+		return fd.fakeNetFD.closeRead()
+	}
+	return fd.shutdown(syscall.SHUT_RD)
+}
+
+func (fd *netFD) closeWrite() error {
+	if fd.fakeNetFD != nil {
+		return fd.fakeNetFD.closeWrite()
+	}
+	return fd.shutdown(syscall.SHUT_WR)
+}
+
+func (fd *netFD) Read(p []byte) (n int, err error) {
+	if fd.fakeNetFD != nil {
+		return fd.fakeNetFD.Read(p)
+	}
+	n, err = fd.pfd.Read(p)
+	runtime.KeepAlive(fd)
+	return n, wrapSyscallError(readSyscallName, err)
+}
+
+func (fd *netFD) Write(p []byte) (nn int, err error) {
+	if fd.fakeNetFD != nil {
+		return fd.fakeNetFD.Write(p)
+	}
+	nn, err = fd.pfd.Write(p)
+	runtime.KeepAlive(fd)
+	return nn, wrapSyscallError(writeSyscallName, err)
+}
+
+func (fd *netFD) SetDeadline(t time.Time) error {
+	if fd.fakeNetFD != nil {
+		return fd.fakeNetFD.SetDeadline(t)
+	}
+	return fd.pfd.SetDeadline(t)
+}
+
+func (fd *netFD) SetReadDeadline(t time.Time) error {
+	if fd.fakeNetFD != nil {
+		return fd.fakeNetFD.SetReadDeadline(t)
+	}
+	return fd.pfd.SetReadDeadline(t)
+}
+
+func (fd *netFD) SetWriteDeadline(t time.Time) error {
+	if fd.fakeNetFD != nil {
+		return fd.fakeNetFD.SetWriteDeadline(t)
+	}
+	return fd.pfd.SetWriteDeadline(t)
+}
+
+type unknownAddr struct{}
+
+func (unknownAddr) Network() string { return "unknown" }
+func (unknownAddr) String() string  { return "unknown" }
diff --git a/src/net/fd_windows.go b/src/net/fd_windows.go
index 030b6a1..eeb994df 100644
--- a/src/net/fd_windows.go
+++ b/src/net/fd_windows.go
@@ -7,6 +7,7 @@
 import (
 	"context"
 	"internal/poll"
+	"internal/syscall/windows"
 	"os"
 	"runtime"
 	"syscall"
@@ -86,6 +87,32 @@
 		}
 	}
 
+	var isloopback bool
+	switch ra := ra.(type) {
+	case *syscall.SockaddrInet4:
+		isloopback = ra.Addr[0] == 127
+	case *syscall.SockaddrInet6:
+		isloopback = ra.Addr == [16]byte(IPv6loopback)
+	default:
+		panic("unexpected type in connect")
+	}
+	if isloopback {
+		// This makes ConnectEx() fails faster if the target port on the localhost
+		// is not reachable, instead of waiting for 2s.
+		params := windows.TCP_INITIAL_RTO_PARAMETERS{
+			Rtt:                   windows.TCP_INITIAL_RTO_UNSPECIFIED_RTT, // use the default or overridden by the Administrator
+			MaxSynRetransmissions: 1,                                       // minimum possible value before Windows 10.0.16299
+		}
+		if windows.Support_TCP_INITIAL_RTO_NO_SYN_RETRANSMISSIONS() {
+			// In Windows 10.0.16299 TCP_INITIAL_RTO_NO_SYN_RETRANSMISSIONS makes ConnectEx() fails instantly.
+			params.MaxSynRetransmissions = windows.TCP_INITIAL_RTO_NO_SYN_RETRANSMISSIONS
+		}
+		var out uint32
+		// Don't abort the connection if WSAIoctl fails, as it is only an optimization.
+		// If it fails reliably, we expect TestDialClosedPortFailFast to detect it.
+		_ = fd.pfd.WSAIoctl(windows.SIO_TCP_INITIAL_RTO, (*byte)(unsafe.Pointer(&params)), uint32(unsafe.Sizeof(params)), nil, 0, &out, nil, 0)
+	}
+
 	// Wait for the goroutine converting context.Done into a write timeout
 	// to exist, otherwise our caller might cancel the context and
 	// cause fd.setWriteDeadline(aLongTimeAgo) to cancel a successful dial.
diff --git a/src/net/file_test.go b/src/net/file_test.go
index ea2a218..53cd3c1 100644
--- a/src/net/file_test.go
+++ b/src/net/file_test.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build !js
+//go:build !js && !wasip1
 
 package net
 
diff --git a/src/net/file_unix_test.go b/src/net/file_unix_test.go
new file mode 100644
index 0000000..0499a02
--- /dev/null
+++ b/src/net/file_unix_test.go
@@ -0,0 +1,101 @@
+// Copyright 2023 The Go 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:build unix
+
+package net
+
+import (
+	"internal/syscall/unix"
+	"testing"
+)
+
+// For backward compatibility, opening a net.Conn, turning it into an os.File,
+// and calling the Fd method should return a blocking descriptor.
+func TestFileFdBlocks(t *testing.T) {
+	if !testableNetwork("unix") {
+		t.Skipf("skipping: unix sockets not supported")
+	}
+
+	ls := newLocalServer(t, "unix")
+	defer ls.teardown()
+
+	errc := make(chan error, 1)
+	done := make(chan bool)
+	handler := func(ls *localServer, ln Listener) {
+		server, err := ln.Accept()
+		errc <- err
+		if err != nil {
+			return
+		}
+		defer server.Close()
+		<-done
+	}
+	if err := ls.buildup(handler); err != nil {
+		t.Fatal(err)
+	}
+	defer close(done)
+
+	client, err := Dial(ls.Listener.Addr().Network(), ls.Listener.Addr().String())
+	if err != nil {
+		t.Fatal(err)
+	}
+	defer client.Close()
+
+	if err := <-errc; err != nil {
+		t.Fatalf("server error: %v", err)
+	}
+
+	// The socket should be non-blocking.
+	rawconn, err := client.(*UnixConn).SyscallConn()
+	if err != nil {
+		t.Fatal(err)
+	}
+	err = rawconn.Control(func(fd uintptr) {
+		nonblock, err := unix.IsNonblock(int(fd))
+		if err != nil {
+			t.Fatal(err)
+		}
+		if !nonblock {
+			t.Fatal("unix socket is in blocking mode")
+		}
+	})
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	file, err := client.(*UnixConn).File()
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	// At this point the descriptor should still be non-blocking.
+	rawconn, err = file.SyscallConn()
+	if err != nil {
+		t.Fatal(err)
+	}
+	err = rawconn.Control(func(fd uintptr) {
+		nonblock, err := unix.IsNonblock(int(fd))
+		if err != nil {
+			t.Fatal(err)
+		}
+		if !nonblock {
+			t.Fatal("unix socket as os.File is in blocking mode")
+		}
+	})
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	fd := file.Fd()
+
+	// Calling Fd should have put the descriptor into blocking mode.
+	nonblock, err := unix.IsNonblock(int(fd))
+	if err != nil {
+		t.Fatal(err)
+	}
+	if nonblock {
+		t.Error("unix socket through os.File.Fd is non-blocking")
+	}
+}
diff --git a/src/net/file_wasip1.go b/src/net/file_wasip1.go
new file mode 100644
index 0000000..a3624ef
--- /dev/null
+++ b/src/net/file_wasip1.go
@@ -0,0 +1,102 @@
+// Copyright 2023 The Go 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:build wasip1
+
+package net
+
+import (
+	"os"
+	"syscall"
+	_ "unsafe" // for go:linkname
+)
+
+func fileListener(f *os.File) (Listener, error) {
+	filetype, err := fd_fdstat_get_type(f.PollFD().Sysfd)
+	if err != nil {
+		return nil, err
+	}
+	net, err := fileListenNet(filetype)
+	if err != nil {
+		return nil, err
+	}
+	pfd := f.PollFD().Copy()
+	fd := newPollFD(net, pfd)
+	if err := fd.init(); err != nil {
+		pfd.Close()
+		return nil, err
+	}
+	return newFileListener(fd), nil
+}
+
+func fileConn(f *os.File) (Conn, error) {
+	filetype, err := fd_fdstat_get_type(f.PollFD().Sysfd)
+	if err != nil {
+		return nil, err
+	}
+	net, err := fileConnNet(filetype)
+	if err != nil {
+		return nil, err
+	}
+	pfd := f.PollFD().Copy()
+	fd := newPollFD(net, pfd)
+	if err := fd.init(); err != nil {
+		pfd.Close()
+		return nil, err
+	}
+	return newFileConn(fd), nil
+}
+
+func filePacketConn(f *os.File) (PacketConn, error) {
+	return nil, syscall.ENOPROTOOPT
+}
+
+func fileListenNet(filetype syscall.Filetype) (string, error) {
+	switch filetype {
+	case syscall.FILETYPE_SOCKET_STREAM:
+		return "tcp", nil
+	case syscall.FILETYPE_SOCKET_DGRAM:
+		return "", syscall.EOPNOTSUPP
+	default:
+		return "", syscall.ENOTSOCK
+	}
+}
+
+func fileConnNet(filetype syscall.Filetype) (string, error) {
+	switch filetype {
+	case syscall.FILETYPE_SOCKET_STREAM:
+		return "tcp", nil
+	case syscall.FILETYPE_SOCKET_DGRAM:
+		return "udp", nil
+	default:
+		return "", syscall.ENOTSOCK
+	}
+}
+
+func newFileListener(fd *netFD) Listener {
+	switch fd.net {
+	case "tcp":
+		return &TCPListener{fd: fd}
+	default:
+		panic("unsupported network for file listener: " + fd.net)
+	}
+}
+
+func newFileConn(fd *netFD) Conn {
+	switch fd.net {
+	case "tcp":
+		return &TCPConn{conn{fd: fd}}
+	case "udp":
+		return &UDPConn{conn{fd: fd}}
+	default:
+		panic("unsupported network for file connection: " + fd.net)
+	}
+}
+
+// This helper is implemented in the syscall package. It means we don't have
+// to redefine the fd_fdstat_get host import or the fdstat struct it
+// populates.
+//
+//go:linkname fd_fdstat_get_type syscall.fd_fdstat_get_type
+func fd_fdstat_get_type(fd int) (uint8, error)
diff --git a/src/net/file_wasip1_test.go b/src/net/file_wasip1_test.go
new file mode 100644
index 0000000..4f42590
--- /dev/null
+++ b/src/net/file_wasip1_test.go
@@ -0,0 +1,112 @@
+// Copyright 2023 The Go 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:build wasip1
+
+package net
+
+import (
+	"syscall"
+	"testing"
+)
+
+// The tests in this file intend to validate the ability for net.FileConn and
+// net.FileListener to handle both TCP and UDP sockets. Ideally we would test
+// the public interface by constructing an *os.File from a file descriptor
+// opened on a socket, but the WASI preview 1 specification is too limited to
+// support this approach for UDP sockets. Instead, we test the internals that
+// make it possible for WASI host runtimes and guest programs to integrate
+// socket extensions with the net package using net.FileConn/net.FileListener.
+//
+// Note that the creation of net.Conn and net.Listener values for TCP sockets
+// has an end-to-end test in src/runtime/internal/wasitest, here we are only
+// verifying the code paths specific to UDP, and error handling for invalid use
+// of the functions.
+
+func TestWasip1FileConnNet(t *testing.T) {
+	tests := []struct {
+		filetype syscall.Filetype
+		network  string
+		error    error
+	}{
+		{syscall.FILETYPE_SOCKET_STREAM, "tcp", nil},
+		{syscall.FILETYPE_SOCKET_DGRAM, "udp", nil},
+		{syscall.FILETYPE_BLOCK_DEVICE, "", syscall.ENOTSOCK},
+		{syscall.FILETYPE_CHARACTER_DEVICE, "", syscall.ENOTSOCK},
+		{syscall.FILETYPE_DIRECTORY, "", syscall.ENOTSOCK},
+		{syscall.FILETYPE_REGULAR_FILE, "", syscall.ENOTSOCK},
+		{syscall.FILETYPE_SYMBOLIC_LINK, "", syscall.ENOTSOCK},
+		{syscall.FILETYPE_UNKNOWN, "", syscall.ENOTSOCK},
+	}
+	for _, test := range tests {
+		net, err := fileConnNet(test.filetype)
+		if net != test.network {
+			t.Errorf("fileConnNet: network mismatch: want=%q got=%q", test.network, net)
+		}
+		if err != test.error {
+			t.Errorf("fileConnNet: error mismatch: want=%v got=%v", test.error, err)
+		}
+	}
+}
+
+func TestWasip1FileListenNet(t *testing.T) {
+	tests := []struct {
+		filetype syscall.Filetype
+		network  string
+		error    error
+	}{
+		{syscall.FILETYPE_SOCKET_STREAM, "tcp", nil},
+		{syscall.FILETYPE_SOCKET_DGRAM, "", syscall.EOPNOTSUPP},
+		{syscall.FILETYPE_BLOCK_DEVICE, "", syscall.ENOTSOCK},
+		{syscall.FILETYPE_CHARACTER_DEVICE, "", syscall.ENOTSOCK},
+		{syscall.FILETYPE_DIRECTORY, "", syscall.ENOTSOCK},
+		{syscall.FILETYPE_REGULAR_FILE, "", syscall.ENOTSOCK},
+		{syscall.FILETYPE_SYMBOLIC_LINK, "", syscall.ENOTSOCK},
+		{syscall.FILETYPE_UNKNOWN, "", syscall.ENOTSOCK},
+	}
+	for _, test := range tests {
+		net, err := fileListenNet(test.filetype)
+		if net != test.network {
+			t.Errorf("fileListenNet: network mismatch: want=%q got=%q", test.network, net)
+		}
+		if err != test.error {
+			t.Errorf("fileListenNet: error mismatch: want=%v got=%v", test.error, err)
+		}
+	}
+}
+
+func TestWasip1NewFileListener(t *testing.T) {
+	if l, ok := newFileListener(newFD("tcp", -1)).(*TCPListener); !ok {
+		t.Errorf("newFileListener: tcp listener type mismatch: %T", l)
+	} else {
+		testIsTCPAddr(t, "Addr", l.Addr())
+	}
+}
+
+func TestWasip1NewFileConn(t *testing.T) {
+	if c, ok := newFileConn(newFD("tcp", -1)).(*TCPConn); !ok {
+		t.Errorf("newFileConn: tcp conn type mismatch: %T", c)
+	} else {
+		testIsTCPAddr(t, "LocalAddr", c.LocalAddr())
+		testIsTCPAddr(t, "RemoteAddr", c.RemoteAddr())
+	}
+	if c, ok := newFileConn(newFD("udp", -1)).(*UDPConn); !ok {
+		t.Errorf("newFileConn: udp conn type mismatch: %T", c)
+	} else {
+		testIsUDPAddr(t, "LocalAddr", c.LocalAddr())
+		testIsUDPAddr(t, "RemoteAddr", c.RemoteAddr())
+	}
+}
+
+func testIsTCPAddr(t *testing.T, method string, addr Addr) {
+	if _, ok := addr.(*TCPAddr); !ok {
+		t.Errorf("%s: returned address is not a *TCPAddr: %T", method, addr)
+	}
+}
+
+func testIsUDPAddr(t *testing.T, method string, addr Addr) {
+	if _, ok := addr.(*UDPAddr); !ok {
+		t.Errorf("%s: returned address is not a *UDPAddr: %T", method, addr)
+	}
+}
diff --git a/src/net/hook_unix.go b/src/net/hook_unix.go
index fa82c7e..4e20f59 100644
--- a/src/net/hook_unix.go
+++ b/src/net/hook_unix.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build unix || (js && wasm)
+//go:build unix || (js && wasm) || wasip1
 
 package net
 
diff --git a/src/net/hosts.go b/src/net/hosts.go
index dbf8fea..56e6674 100644
--- a/src/net/hosts.go
+++ b/src/net/hosts.go
@@ -5,7 +5,10 @@
 package net
 
 import (
+	"errors"
 	"internal/bytealg"
+	"io/fs"
+	"net/netip"
 	"sync"
 	"time"
 )
@@ -13,19 +16,11 @@
 const cacheMaxAge = 5 * time.Second
 
 func parseLiteralIP(addr string) string {
-	var ip IP
-	var zone string
-	ip = parseIPv4(addr)
-	if ip == nil {
-		ip, zone = parseIPv6Zone(addr)
-	}
-	if ip == nil {
+	ip, err := netip.ParseAddr(addr)
+	if err != nil {
 		return ""
 	}
-	if zone == "" {
-		return ip.String()
-	}
-	return ip.String() + "%" + zone
+	return ip.String()
 }
 
 type byName struct {
@@ -70,48 +65,54 @@
 	hs := make(map[string]byName)
 	is := make(map[string][]string)
 
-	var file *file
-	if file, _ = open(hp); file == nil {
-		return
+	file, err := open(hp)
+	if err != nil {
+		if !errors.Is(err, fs.ErrNotExist) && !errors.Is(err, fs.ErrPermission) {
+			return
+		}
 	}
-	for line, ok := file.readLine(); ok; line, ok = file.readLine() {
-		if i := bytealg.IndexByteString(line, '#'); i >= 0 {
-			// Discard comments.
-			line = line[0:i]
-		}
-		f := getFields(line)
-		if len(f) < 2 {
-			continue
-		}
-		addr := parseLiteralIP(f[0])
-		if addr == "" {
-			continue
-		}
 
-		var canonical string
-		for i := 1; i < len(f); i++ {
-			name := absDomainName(f[i])
-			h := []byte(f[i])
-			lowerASCIIBytes(h)
-			key := absDomainName(string(h))
-
-			if i == 1 {
-				canonical = key
+	if file != nil {
+		defer file.close()
+		for line, ok := file.readLine(); ok; line, ok = file.readLine() {
+			if i := bytealg.IndexByteString(line, '#'); i >= 0 {
+				// Discard comments.
+				line = line[0:i]
 			}
-
-			is[addr] = append(is[addr], name)
-
-			if v, ok := hs[key]; ok {
-				hs[key] = byName{
-					addrs:         append(v.addrs, addr),
-					canonicalName: v.canonicalName,
-				}
+			f := getFields(line)
+			if len(f) < 2 {
+				continue
+			}
+			addr := parseLiteralIP(f[0])
+			if addr == "" {
 				continue
 			}
 
-			hs[key] = byName{
-				addrs:         []string{addr},
-				canonicalName: canonical,
+			var canonical string
+			for i := 1; i < len(f); i++ {
+				name := absDomainName(f[i])
+				h := []byte(f[i])
+				lowerASCIIBytes(h)
+				key := absDomainName(string(h))
+
+				if i == 1 {
+					canonical = key
+				}
+
+				is[addr] = append(is[addr], name)
+
+				if v, ok := hs[key]; ok {
+					hs[key] = byName{
+						addrs:         append(v.addrs, addr),
+						canonicalName: v.canonicalName,
+					}
+					continue
+				}
+
+				hs[key] = byName{
+					addrs:         []string{addr},
+					canonicalName: canonical,
+				}
 			}
 		}
 	}
@@ -122,7 +123,6 @@
 	hosts.byAddr = is
 	hosts.mtime = mtime
 	hosts.size = size
-	file.close()
 }
 
 // lookupStaticHost looks up the addresses and the canonical name for the given host from /etc/hosts.
diff --git a/src/net/http/cgi/host.go b/src/net/http/cgi/host.go
index 349dda1..073952a 100644
--- a/src/net/http/cgi/host.go
+++ b/src/net/http/cgi/host.go
@@ -39,7 +39,7 @@
 	switch runtime.GOOS {
 	case "darwin", "ios":
 		return []string{"DYLD_LIBRARY_PATH"}
-	case "linux", "freebsd", "netbsd", "openbsd":
+	case "android", "linux", "freebsd", "netbsd", "openbsd":
 		return []string{"LD_LIBRARY_PATH"}
 	case "hpux":
 		return []string{"LD_LIBRARY_PATH", "SHLIB_PATH"}
diff --git a/src/net/http/client.go b/src/net/http/client.go
index 122e8d0..2cab53a 100644
--- a/src/net/http/client.go
+++ b/src/net/http/client.go
@@ -144,7 +144,8 @@
 
 // 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 {
+// If the referer was explicitly set, then it will continue to be used.
+func refererForURL(lastReq, newReq *url.URL, explicitRef string) 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
@@ -152,6 +153,10 @@
 	if lastReq.Scheme == "https" && newReq.Scheme == "http" {
 		return ""
 	}
+	if explicitRef != "" {
+		return explicitRef
+	}
+
 	referer := lastReq.String()
 	if lastReq.User != nil {
 		// This is not very efficient, but is the best we can
@@ -199,6 +204,9 @@
 	return DefaultTransport
 }
 
+// ErrSchemeMismatch is returned when a server returns an HTTP response to an HTTPS client.
+var ErrSchemeMismatch = errors.New("http: server gave HTTP response to HTTPS client")
+
 // send issues an HTTP request.
 // Caller should close resp.Body when done reading from it.
 func send(ireq *Request, rt RoundTripper, deadline time.Time) (resp *Response, didTimeout func() bool, err error) {
@@ -260,7 +268,7 @@
 			// response looks like HTTP and give a more helpful error.
 			// See golang.org/issue/11111.
 			if string(tlsErr.RecordHeader[:]) == "HTTP/" {
-				err = errors.New("http: server gave HTTP response to HTTPS client")
+				err = ErrSchemeMismatch
 			}
 		}
 		return nil, didTimeout, err
@@ -676,7 +684,7 @@
 
 			// Add the Referer header from the most recent
 			// request URL to the new one, if it's not https->http:
-			if ref := refererForURL(reqs[len(reqs)-1].URL, req.URL); ref != "" {
+			if ref := refererForURL(reqs[len(reqs)-1].URL, req.URL, req.Header.Get("Referer")); ref != "" {
 				req.Header.Set("Referer", ref)
 			}
 			err = c.checkRedirect(req, reqs)
@@ -990,8 +998,8 @@
 		// directly, we don't know their scope, so we assume
 		// it's for *.domain.com.
 
-		ihost := canonicalAddr(initial)
-		dhost := canonicalAddr(dest)
+		ihost := idnaASCIIFromURL(initial)
+		dhost := idnaASCIIFromURL(dest)
 		return isDomainOrSubdomain(dhost, ihost)
 	}
 	// All other headers are copied:
diff --git a/src/net/http/client_test.go b/src/net/http/client_test.go
index 8b53c41..0fe555a 100644
--- a/src/net/http/client_test.go
+++ b/src/net/http/client_test.go
@@ -1207,7 +1207,7 @@
 	}))
 
 	// Try to trigger a timeout after reading part of the response body.
-	// The initial timeout is emprically usually long enough on a decently fast
+	// The initial timeout is empirically usually long enough on a decently fast
 	// machine, but if we undershoot we'll retry with exponentially longer
 	// timeouts until the test either passes or times out completely.
 	// This keeps the test reasonably fast in the typical case but allows it to
@@ -1411,24 +1411,32 @@
 
 func TestReferer(t *testing.T) {
 	tests := []struct {
-		lastReq, newReq string // from -> to URLs
-		want            string
+		lastReq, newReq, explicitRef string // from -> to URLs, explicitly set Referer value
+		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"},
+		{lastReq: "http://gopher@test.com", newReq: "http://link.com", want: "http://test.com"},
+		{lastReq: "https://gopher@test.com", newReq: "https://link.com", want: "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"},
+		{lastReq: "http://gopher:go@test.com", newReq: "http://link.com", want: "http://test.com"},
+		{lastReq: "https://gopher:go@test.com", newReq: "https://link.com", want: "https://test.com"},
 
 		// nothing to do:
-		{"http://test.com", "http://link.com", "http://test.com"},
-		{"https://test.com", "https://link.com", "https://test.com"},
+		{lastReq: "http://test.com", newReq: "http://link.com", want: "http://test.com"},
+		{lastReq: "https://test.com", newReq: "https://link.com", want: "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", ""},
+		{lastReq: "https://test.com", newReq: "http://link.com", want: ""},
+		{lastReq: "https://gopher:go@test.com", newReq: "http://link.com", want: ""},
+
+		// https to http should remove an existing referer:
+		{lastReq: "https://test.com", newReq: "http://link.com", explicitRef: "https://foo.com", want: ""},
+		{lastReq: "https://gopher:go@test.com", newReq: "http://link.com", explicitRef: "https://foo.com", want: ""},
+
+		// don't override an existing referer:
+		{lastReq: "https://test.com", newReq: "https://link.com", explicitRef: "https://foo.com", want: "https://foo.com"},
+		{lastReq: "https://gopher:go@test.com", newReq: "https://link.com", explicitRef: "https://foo.com", want: "https://foo.com"},
 	}
 	for _, tt := range tests {
 		l, err := url.Parse(tt.lastReq)
@@ -1439,7 +1447,7 @@
 		if err != nil {
 			t.Fatal(err)
 		}
-		r := ExportRefererForURL(l, n)
+		r := ExportRefererForURL(l, n, tt.explicitRef)
 		if r != tt.want {
 			t.Errorf("refererForURL(%q, %q) = %q; want %q", tt.lastReq, tt.newReq, r, tt.want)
 		}
@@ -1470,6 +1478,9 @@
 }
 
 // Issue 4800: copy (some) headers when Client follows a redirect.
+// Issue 35104: Since both URLs have the same host (localhost)
+// but different ports, sensitive headers like Cookie and Authorization
+// are preserved.
 func TestClientCopyHeadersOnRedirect(t *testing.T) { run(t, testClientCopyHeadersOnRedirect) }
 func testClientCopyHeadersOnRedirect(t *testing.T, mode testMode) {
 	const (
@@ -1483,6 +1494,8 @@
 			"X-Foo":           []string{xfoo},
 			"Referer":         []string{ts2URL},
 			"Accept-Encoding": []string{"gzip"},
+			"Cookie":          []string{"foo=bar"},
+			"Authorization":   []string{"secretpassword"},
 		}
 		if !reflect.DeepEqual(r.Header, want) {
 			t.Errorf("Request.Header = %#v; want %#v", r.Header, want)
@@ -1501,9 +1514,11 @@
 	c := ts1.Client()
 	c.CheckRedirect = func(r *Request, via []*Request) error {
 		want := Header{
-			"User-Agent": []string{ua},
-			"X-Foo":      []string{xfoo},
-			"Referer":    []string{ts2URL},
+			"User-Agent":    []string{ua},
+			"X-Foo":         []string{xfoo},
+			"Referer":       []string{ts2URL},
+			"Cookie":        []string{"foo=bar"},
+			"Authorization": []string{"secretpassword"},
 		}
 		if !reflect.DeepEqual(r.Header, want) {
 			t.Errorf("CheckRedirect Request.Header = %#v; want %#v", r.Header, want)
@@ -1707,18 +1722,30 @@
 		{"cookie", "http://foo.com/", "http://bar.com/", false},
 		{"cookie2", "http://foo.com/", "http://bar.com/", false},
 		{"authorization", "http://foo.com/", "http://bar.com/", false},
+		{"authorization", "http://foo.com/", "https://foo.com/", true},
+		{"authorization", "http://foo.com:1234/", "http://foo.com:4321/", true},
 		{"www-authenticate", "http://foo.com/", "http://bar.com/", false},
 
 		// But subdomains should work:
 		{"www-authenticate", "http://foo.com/", "http://foo.com/", true},
 		{"www-authenticate", "http://foo.com/", "http://sub.foo.com/", true},
 		{"www-authenticate", "http://foo.com/", "http://notfoo.com/", false},
-		{"www-authenticate", "http://foo.com/", "https://foo.com/", false},
+		{"www-authenticate", "http://foo.com/", "https://foo.com/", true},
 		{"www-authenticate", "http://foo.com:80/", "http://foo.com/", true},
 		{"www-authenticate", "http://foo.com:80/", "http://sub.foo.com/", true},
 		{"www-authenticate", "http://foo.com:443/", "https://foo.com/", true},
 		{"www-authenticate", "http://foo.com:443/", "https://sub.foo.com/", true},
-		{"www-authenticate", "http://foo.com:1234/", "http://foo.com/", false},
+		{"www-authenticate", "http://foo.com:1234/", "http://foo.com/", true},
+
+		{"authorization", "http://foo.com/", "http://foo.com/", true},
+		{"authorization", "http://foo.com/", "http://sub.foo.com/", true},
+		{"authorization", "http://foo.com/", "http://notfoo.com/", false},
+		{"authorization", "http://foo.com/", "https://foo.com/", true},
+		{"authorization", "http://foo.com:80/", "http://foo.com/", true},
+		{"authorization", "http://foo.com:80/", "http://sub.foo.com/", true},
+		{"authorization", "http://foo.com:443/", "https://foo.com/", true},
+		{"authorization", "http://foo.com:443/", "https://sub.foo.com/", true},
+		{"authorization", "http://foo.com:1234/", "http://foo.com/", true},
 	}
 	for i, tt := range tests {
 		u0, err := url.Parse(tt.initialURL)
diff --git a/src/net/http/clientserver_test.go b/src/net/http/clientserver_test.go
index da5671d..5832153 100644
--- a/src/net/http/clientserver_test.go
+++ b/src/net/http/clientserver_test.go
@@ -1239,9 +1239,9 @@
 func TestInterruptWithPanic(t *testing.T) {
 	run(t, func(t *testing.T, mode testMode) {
 		t.Run("boom", func(t *testing.T) { testInterruptWithPanic(t, mode, "boom") })
-		t.Run("nil", func(t *testing.T) { testInterruptWithPanic(t, mode, nil) })
+		t.Run("nil", func(t *testing.T) { t.Setenv("GODEBUG", "panicnil=1"); testInterruptWithPanic(t, mode, nil) })
 		t.Run("ErrAbortHandler", func(t *testing.T) { testInterruptWithPanic(t, mode, ErrAbortHandler) })
-	})
+	}, testNotParallel)
 }
 func testInterruptWithPanic(t *testing.T, mode testMode, panicValue any) {
 	const msg = "hello"
@@ -1283,24 +1283,28 @@
 	}
 	wantStackLogged := panicValue != nil && panicValue != ErrAbortHandler
 
-	if err := waitErrCondition(5*time.Second, 10*time.Millisecond, func() error {
+	waitCondition(t, 10*time.Millisecond, func(d time.Duration) bool {
 		gotLog := logOutput()
 		if !wantStackLogged {
 			if gotLog == "" {
-				return nil
+				return true
 			}
-			return fmt.Errorf("want no log output; got: %s", gotLog)
+			t.Fatalf("want no log output; got: %s", gotLog)
 		}
 		if gotLog == "" {
-			return fmt.Errorf("wanted a stack trace logged; got nothing")
+			if d > 0 {
+				t.Logf("wanted a stack trace logged; got nothing after %v", d)
+			}
+			return false
 		}
 		if !strings.Contains(gotLog, "created by ") && strings.Count(gotLog, "\n") < 6 {
-			return fmt.Errorf("output doesn't look like a panic stack trace. Got: %s", gotLog)
+			if d > 0 {
+				t.Logf("output doesn't look like a panic stack trace after %v. Got: %s", d, gotLog)
+			}
+			return false
 		}
-		return nil
-	}); err != nil {
-		t.Fatal(err)
-	}
+		return true
+	})
 }
 
 type lockedBytesBuffer struct {
diff --git a/src/net/http/cookiejar/jar.go b/src/net/http/cookiejar/jar.go
index 3d0ad19..273b54c 100644
--- a/src/net/http/cookiejar/jar.go
+++ b/src/net/http/cookiejar/jar.go
@@ -365,7 +365,7 @@
 	return net.ParseIP(host) != nil
 }
 
-// defaultPath returns the directory part of an URL's path according to
+// defaultPath returns the directory part of a URL's path according to
 // RFC 6265 section 5.1.4.
 func defaultPath(path string) string {
 	if len(path) == 0 || path[0] != '/' {
@@ -379,7 +379,7 @@
 	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
+// newEntry creates an entry from an 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.
 //
@@ -465,14 +465,14 @@
 		// dot in the domain-attribute before processing the cookie.
 		//
 		// Most browsers don't do that for IP addresses, only curl
-		// version 7.54) and IE (version 11) do not reject a
+		// (version 7.54) and IE (version 11) do not reject a
 		//     Set-Cookie: a=1; domain=.127.0.0.1
 		// This leading dot is optional and serves only as hint for
 		// humans to indicate that a cookie with "domain=.bbc.co.uk"
 		// would be sent to every subdomain of bbc.co.uk.
 		// It just doesn't make sense on IP addresses.
 		// The other processing and validation steps in RFC 6265 just
-		// collaps to:
+		// collapse to:
 		if host != domain {
 			return "", false, errIllegalDomain
 		}
diff --git a/src/net/http/cookiejar/jar_test.go b/src/net/http/cookiejar/jar_test.go
index 13d994a..56d0695 100644
--- a/src/net/http/cookiejar/jar_test.go
+++ b/src/net/http/cookiejar/jar_test.go
@@ -349,7 +349,7 @@
 	return "expires=" + t.Format(time.RFC1123)
 }
 
-// mustParseURL parses s to an URL and panics on error.
+// mustParseURL parses s to a URL and panics on error.
 func mustParseURL(s string) *url.URL {
 	u, err := url.Parse(s)
 	if err != nil || u.Scheme == "" || u.Host == "" {
@@ -670,7 +670,7 @@
 		},
 	},
 	{
-		"Clear Secure flag from a http.",
+		"Clear Secure flag from an http.",
 		"http://www.host.test/",
 		[]string{
 			"b=xx",
diff --git a/src/net/http/doc.go b/src/net/http/doc.go
index 67c4246..d9e6aaf 100644
--- a/src/net/http/doc.go
+++ b/src/net/http/doc.go
@@ -14,7 +14,7 @@
 	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:
+The caller must close the response body when finished with it:
 
 	resp, err := http.Get("http://example.com/")
 	if err != nil {
@@ -24,6 +24,8 @@
 	body, err := io.ReadAll(resp.Body)
 	// ...
 
+# Clients and Transports
+
 For control over HTTP client headers, redirect policy, and other
 settings, create a Client:
 
@@ -54,6 +56,8 @@
 Clients and Transports are safe for concurrent use by multiple
 goroutines and for efficiency should only be created once and re-used.
 
+# Servers
+
 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:
@@ -78,11 +82,13 @@
 	}
 	log.Fatal(s.ListenAndServe())
 
+# HTTP/2
+
 Starting with Go 1.6, the http package has transparent support for the
 HTTP/2 protocol when using HTTPS. Programs that must disable HTTP/2
 can do so by setting Transport.TLSNextProto (for clients) or
 Server.TLSNextProto (for servers) to a non-nil, empty
-map. Alternatively, the following GODEBUG environment variables are
+map. Alternatively, the following GODEBUG settings are
 currently supported:
 
 	GODEBUG=http2client=0  # disable HTTP/2 client support
@@ -90,9 +96,7 @@
 	GODEBUG=http2debug=1   # enable verbose HTTP/2 debug logs
 	GODEBUG=http2debug=2   # ... even more verbose, with frame dumps
 
-The GODEBUG variables are not covered by Go's API compatibility
-promise. Please report any issues before disabling HTTP/2
-support: https://golang.org/s/http2bug
+Please report any issues before disabling HTTP/2 support: https://golang.org/s/http2bug
 
 The http package's Transport and Server both automatically enable
 HTTP/2 support for simple configurations. To enable HTTP/2 for more
diff --git a/src/net/http/export_test.go b/src/net/http/export_test.go
index fb5ab93..5d198f3 100644
--- a/src/net/http/export_test.go
+++ b/src/net/http/export_test.go
@@ -36,7 +36,7 @@
 	Export_is408Message               = is408Message
 )
 
-const MaxWriteWaitBeforeConnReuse = maxWriteWaitBeforeConnReuse
+var MaxWriteWaitBeforeConnReuse = &maxWriteWaitBeforeConnReuse
 
 func init() {
 	// We only want to pay for this cost during testing.
@@ -142,9 +142,11 @@
 	pool.mu.Lock()
 	defer pool.mu.Unlock()
 
-	for k, cc := range pool.conns {
-		for range cc {
-			ret = append(ret, k)
+	for k, ccs := range pool.conns {
+		for _, cc := range ccs {
+			if cc.idleState().canTakeNewRequest {
+				ret = append(ret, k)
+			}
 		}
 	}
 
diff --git a/src/net/http/fcgi/fcgi.go b/src/net/http/fcgi/fcgi.go
index fb822f8..56f7d40 100644
--- a/src/net/http/fcgi/fcgi.go
+++ b/src/net/http/fcgi/fcgi.go
@@ -99,8 +99,10 @@
 
 // conn sends records over rwc
 type conn struct {
-	mutex sync.Mutex
-	rwc   io.ReadWriteCloser
+	mutex    sync.Mutex
+	rwc      io.ReadWriteCloser
+	closeErr error
+	closed   bool
 
 	// to avoid allocations
 	buf bytes.Buffer
@@ -111,10 +113,15 @@
 	return &conn{rwc: rwc}
 }
 
+// Close closes the conn if it is not already closed.
 func (c *conn) Close() error {
 	c.mutex.Lock()
 	defer c.mutex.Unlock()
-	return c.rwc.Close()
+	if !c.closed {
+		c.closeErr = c.rwc.Close()
+		c.closed = true
+	}
+	return c.closeErr
 }
 
 type record struct {
diff --git a/src/net/http/fcgi/fcgi_test.go b/src/net/http/fcgi/fcgi_test.go
index 7a344ff..03c4224 100644
--- a/src/net/http/fcgi/fcgi_test.go
+++ b/src/net/http/fcgi/fcgi_test.go
@@ -241,7 +241,7 @@
 		input := make([]byte, len(tt.input))
 		copy(input, tt.input)
 		rc := nopWriteCloser{bytes.NewReader(input)}
-		done := make(chan bool)
+		done := make(chan struct{})
 		c := newChild(rc, http.HandlerFunc(func(
 			w http.ResponseWriter,
 			r *http.Request,
@@ -252,9 +252,9 @@
 				t.Errorf("Expected %#v, got %#v", tt.err, err)
 			}
 			// not reached if body of request isn't closed
-			done <- true
+			close(done)
 		}))
-		go c.serve()
+		c.serve()
 		// wait for body of request to be closed or all goroutines to block
 		<-done
 	}
@@ -331,7 +331,7 @@
 		input := make([]byte, len(tt.input))
 		copy(input, tt.input)
 		rc := nopWriteCloser{bytes.NewReader(input)}
-		done := make(chan bool)
+		done := make(chan struct{})
 		c := newChild(rc, http.HandlerFunc(func(
 			w http.ResponseWriter,
 			r *http.Request,
@@ -343,9 +343,9 @@
 			} else if env[tt.envVar] != tt.expectedVal {
 				t.Errorf("Expected %s, got %s", tt.expectedVal, env[tt.envVar])
 			}
-			done <- true
+			close(done)
 		}))
-		go c.serve()
+		c.serve()
 		<-done
 	}
 }
@@ -381,7 +381,7 @@
 			input := make([]byte, len(streamFullRequestStdin))
 			copy(input, streamFullRequestStdin)
 			rc := nopWriteCloser{bytes.NewReader(input)}
-			done := make(chan bool)
+			done := make(chan struct{})
 			var resp *response
 			c := newChild(rc, http.HandlerFunc(func(
 				w http.ResponseWriter,
@@ -389,10 +389,9 @@
 			) {
 				io.WriteString(w, tt.body)
 				resp = w.(*response)
-				done <- true
+				close(done)
 			}))
-			defer c.cleanUp()
-			go c.serve()
+			c.serve()
 			<-done
 			if got := resp.Header().Get("Content-Type"); got != tt.wantCT {
 				t.Errorf("got a Content-Type of %q; expected it to start with %q", got, tt.wantCT)
@@ -401,25 +400,27 @@
 	}
 }
 
-type signalingNopCloser struct {
-	io.Reader
+type signalingNopWriteCloser struct {
+	io.ReadCloser
 	closed chan bool
 }
 
-func (*signalingNopCloser) Write(buf []byte) (int, error) {
+func (*signalingNopWriteCloser) Write(buf []byte) (int, error) {
 	return len(buf), nil
 }
 
-func (rc *signalingNopCloser) Close() error {
+func (rc *signalingNopWriteCloser) Close() error {
 	close(rc.closed)
-	return nil
+	return rc.ReadCloser.Close()
 }
 
 // Test whether server properly closes connection when processing slow
 // requests
 func TestSlowRequest(t *testing.T) {
 	pr, pw := io.Pipe()
-	go func(w io.Writer) {
+
+	writerDone := make(chan struct{})
+	go func() {
 		for _, buf := range [][]byte{
 			streamBeginTypeStdin,
 			makeRecord(typeStdin, 1, nil),
@@ -427,9 +428,14 @@
 			pw.Write(buf)
 			time.Sleep(100 * time.Millisecond)
 		}
-	}(pw)
+		close(writerDone)
+	}()
+	defer func() {
+		<-writerDone
+		pw.Close()
+	}()
 
-	rc := &signalingNopCloser{pr, make(chan bool)}
+	rc := &signalingNopWriteCloser{pr, make(chan bool)}
 	handlerDone := make(chan bool)
 
 	c := newChild(rc, http.HandlerFunc(func(
@@ -439,16 +445,9 @@
 		w.WriteHeader(200)
 		close(handlerDone)
 	}))
-	go c.serve()
-	defer c.cleanUp()
-
-	timeout := time.After(2 * time.Second)
+	c.serve()
 
 	<-handlerDone
-	select {
-	case <-rc.closed:
-		t.Log("FastCGI child closed connection")
-	case <-timeout:
-		t.Error("FastCGI child did not close socket after handling request")
-	}
+	<-rc.closed
+	t.Log("FastCGI child closed connection")
 }
diff --git a/src/net/http/fs.go b/src/net/http/fs.go
index 8345904..41e0b43 100644
--- a/src/net/http/fs.go
+++ b/src/net/http/fs.go
@@ -858,22 +858,12 @@
 }
 
 func (f *fileHandler) ServeHTTP(w ResponseWriter, r *Request) {
-	const options = MethodOptions + ", " + MethodGet + ", " + MethodHead
-
-	switch r.Method {
-	case MethodGet, MethodHead:
-		if !strings.HasPrefix(r.URL.Path, "/") {
-			r.URL.Path = "/" + r.URL.Path
-		}
-		serveFile(w, r, f.root, path.Clean(r.URL.Path), true)
-
-	case MethodOptions:
-		w.Header().Set("Allow", options)
-
-	default:
-		w.Header().Set("Allow", options)
-		Error(w, "read-only", StatusMethodNotAllowed)
+	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.
diff --git a/src/net/http/fs_test.go b/src/net/http/fs_test.go
index 74f7a80..3fb9e01 100644
--- a/src/net/http/fs_test.go
+++ b/src/net/http/fs_test.go
@@ -24,7 +24,6 @@
 	"reflect"
 	"regexp"
 	"runtime"
-	"sort"
 	"strings"
 	"testing"
 	"time"
@@ -88,15 +87,39 @@
 	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, c)
-	if !bytes.Equal(body, file) {
-		t.Fatalf("body mismatch: got %q, want %q", body, file)
+	// Get contents via various methods.
+	//
+	// See https://go.dev/issue/59471 for a proposal to limit the set of methods handled.
+	// For now, test the historical behavior.
+	for _, method := range []string{
+		MethodGet,
+		MethodPost,
+		MethodPut,
+		MethodPatch,
+		MethodDelete,
+		MethodOptions,
+		MethodTrace,
+	} {
+		req.Method = method
+		_, body := getBody(t, method, req, c)
+		if !bytes.Equal(body, file) {
+			t.Fatalf("body mismatch for %v request: got %q, want %q", method, body, file)
+		}
+	}
+
+	// HEAD request.
+	req.Method = MethodHead
+	resp, body := getBody(t, "HEAD", req, c)
+	if len(body) != 0 {
+		t.Fatalf("body mismatch for HEAD request: got %q, want empty", body)
+	}
+	if got, want := resp.Header.Get("Content-Length"), fmt.Sprint(len(file)); got != want {
+		t.Fatalf("Content-Length mismatch for HEAD request: got %v, want %v", got, want)
 	}
 
 	// Range tests
+	req.Method = MethodGet
 Cases:
 	for _, rt := range ServeFileRangeTests {
 		if rt.r != "" {
@@ -420,46 +443,6 @@
 	}
 }
 
-func TestFileServerMethodOptions(t *testing.T) { run(t, testFileServerMethodOptions) }
-func testFileServerMethodOptions(t *testing.T, mode testMode) {
-	const want = "GET, HEAD, OPTIONS"
-	ts := newClientServerTest(t, mode, FileServer(Dir("."))).ts
-
-	tests := []struct {
-		method     string
-		wantStatus int
-	}{
-		{MethodOptions, StatusOK},
-
-		{MethodDelete, StatusMethodNotAllowed},
-		{MethodPut, StatusMethodNotAllowed},
-		{MethodPost, StatusMethodNotAllowed},
-	}
-
-	for _, test := range tests {
-		req, err := NewRequest(test.method, ts.URL, nil)
-		if err != nil {
-			t.Fatal(err)
-		}
-		res, err := ts.Client().Do(req)
-		if err != nil {
-			t.Fatal(err)
-		}
-		defer res.Body.Close()
-
-		if res.StatusCode != test.wantStatus {
-			t.Errorf("%s got status %q, want code %d", test.method, res.Status, test.wantStatus)
-		}
-
-		a := strings.Split(res.Header.Get("Allow"), ", ")
-		sort.Strings(a)
-		got := strings.Join(a, ", ")
-		if got != want {
-			t.Errorf("%s got Allow header %q, want %q", test.method, got, want)
-		}
-	}
-}
-
 func TestDirJoin(t *testing.T) {
 	if runtime.GOOS == "windows" {
 		t.Skip("skipping test on windows")
@@ -785,6 +768,10 @@
 	return 0644
 }
 
+func (f *fakeFileInfo) String() string {
+	return fs.FormatFileInfo(f)
+}
+
 type fakeFile struct {
 	io.ReadSeeker
 	fi     *fakeFileInfo
@@ -1523,3 +1510,52 @@
 		})
 	}
 }
+
+func TestFileServerMethods(t *testing.T) {
+	run(t, testFileServerMethods)
+}
+func testFileServerMethods(t *testing.T, mode testMode) {
+	ts := newClientServerTest(t, mode, FileServer(Dir("testdata"))).ts
+
+	file, err := os.ReadFile(testFile)
+	if err != nil {
+		t.Fatal("reading file:", err)
+	}
+
+	// Get contents via various methods.
+	//
+	// See https://go.dev/issue/59471 for a proposal to limit the set of methods handled.
+	// For now, test the historical behavior.
+	for _, method := range []string{
+		MethodGet,
+		MethodHead,
+		MethodPost,
+		MethodPut,
+		MethodPatch,
+		MethodDelete,
+		MethodOptions,
+		MethodTrace,
+	} {
+		req, _ := NewRequest(method, ts.URL+"/file", nil)
+		t.Log(req.URL)
+		res, err := ts.Client().Do(req)
+		if err != nil {
+			t.Fatal(err)
+		}
+		body, err := io.ReadAll(res.Body)
+		res.Body.Close()
+		if err != nil {
+			t.Fatal(err)
+		}
+		wantBody := file
+		if method == MethodHead {
+			wantBody = nil
+		}
+		if !bytes.Equal(body, wantBody) {
+			t.Fatalf("%v: got body %q, want %q", method, body, wantBody)
+		}
+		if got, want := res.Header.Get("Content-Length"), fmt.Sprint(len(file)); got != want {
+			t.Fatalf("%v: got Content-Length %q, want %q", method, got, want)
+		}
+	}
+}
diff --git a/src/net/http/h2_bundle.go b/src/net/http/h2_bundle.go
index 1e0b83d..dd59e1f 100644
--- a/src/net/http/h2_bundle.go
+++ b/src/net/http/h2_bundle.go
@@ -1303,23 +1303,91 @@
 	http2errPseudoAfterRegular   = errors.New("pseudo header field after regular")
 )
 
-// flow is the flow control window's size.
-type http2flow struct {
+// inflowMinRefresh is the minimum number of bytes we'll send for a
+// flow control window update.
+const http2inflowMinRefresh = 4 << 10
+
+// inflow accounts for an inbound flow control window.
+// It tracks both the latest window sent to the peer (used for enforcement)
+// and the accumulated unsent window.
+type http2inflow struct {
+	avail  int32
+	unsent int32
+}
+
+// init sets the initial window.
+func (f *http2inflow) init(n int32) {
+	f.avail = n
+}
+
+// add adds n bytes to the window, with a maximum window size of max,
+// indicating that the peer can now send us more data.
+// For example, the user read from a {Request,Response} body and consumed
+// some of the buffered data, so the peer can now send more.
+// It returns the number of bytes to send in a WINDOW_UPDATE frame to the peer.
+// Window updates are accumulated and sent when the unsent capacity
+// is at least inflowMinRefresh or will at least double the peer's available window.
+func (f *http2inflow) add(n int) (connAdd int32) {
+	if n < 0 {
+		panic("negative update")
+	}
+	unsent := int64(f.unsent) + int64(n)
+	// "A sender MUST NOT allow a flow-control window to exceed 2^31-1 octets."
+	// RFC 7540 Section 6.9.1.
+	const maxWindow = 1<<31 - 1
+	if unsent+int64(f.avail) > maxWindow {
+		panic("flow control update exceeds maximum window size")
+	}
+	f.unsent = int32(unsent)
+	if f.unsent < http2inflowMinRefresh && f.unsent < f.avail {
+		// If there aren't at least inflowMinRefresh bytes of window to send,
+		// and this update won't at least double the window, buffer the update for later.
+		return 0
+	}
+	f.avail += f.unsent
+	f.unsent = 0
+	return int32(unsent)
+}
+
+// take attempts to take n bytes from the peer's flow control window.
+// It reports whether the window has available capacity.
+func (f *http2inflow) take(n uint32) bool {
+	if n > uint32(f.avail) {
+		return false
+	}
+	f.avail -= int32(n)
+	return true
+}
+
+// takeInflows attempts to take n bytes from two inflows,
+// typically connection-level and stream-level flows.
+// It reports whether both windows have available capacity.
+func http2takeInflows(f1, f2 *http2inflow, n uint32) bool {
+	if n > uint32(f1.avail) || n > uint32(f2.avail) {
+		return false
+	}
+	f1.avail -= int32(n)
+	f2.avail -= int32(n)
+	return true
+}
+
+// outflow is the outbound flow control window's size.
+type http2outflow struct {
 	_ http2incomparable
 
 	// n is the number of DATA bytes we're allowed to send.
-	// A flow is kept both on a conn and a per-stream.
+	// An outflow is kept both on a conn and a per-stream.
 	n int32
 
-	// conn points to the shared connection-level flow that is
-	// shared by all streams on that conn. It is nil for the flow
+	// conn points to the shared connection-level outflow that is
+	// shared by all streams on that conn. It is nil for the outflow
 	// that's on the conn directly.
-	conn *http2flow
+	conn *http2outflow
 }
 
-func (f *http2flow) setConnFlow(cf *http2flow) { f.conn = cf }
+func (f *http2outflow) setConnFlow(cf *http2outflow) { f.conn = cf }
 
-func (f *http2flow) available() int32 {
+func (f *http2outflow) available() int32 {
 	n := f.n
 	if f.conn != nil && f.conn.n < n {
 		n = f.conn.n
@@ -1327,7 +1395,7 @@
 	return n
 }
 
-func (f *http2flow) take(n int32) {
+func (f *http2outflow) take(n int32) {
 	if n > f.available() {
 		panic("internal error: took too much")
 	}
@@ -1339,7 +1407,7 @@
 
 // add adds n bytes (positive or negative) to the flow control window.
 // It returns false if the sum would exceed 2^31-1.
-func (f *http2flow) add(n int32) bool {
+func (f *http2outflow) add(n int32) bool {
 	sum := f.n + n
 	if (sum > n) == (f.n > 0) {
 		f.n = sum
@@ -1995,6 +2063,15 @@
 // It is the caller's responsibility not to violate the maximum frame size
 // and to not call other Write methods concurrently.
 func (f *http2Framer) WriteDataPadded(streamID uint32, endStream bool, data, pad []byte) error {
+	if err := f.startWriteDataPadded(streamID, endStream, data, pad); err != nil {
+		return err
+	}
+	return f.endWrite()
+}
+
+// startWriteDataPadded is WriteDataPadded, but only writes the frame to the Framer's internal buffer.
+// The caller should call endWrite to flush the frame to the underlying writer.
+func (f *http2Framer) startWriteDataPadded(streamID uint32, endStream bool, data, pad []byte) error {
 	if !http2validStreamID(streamID) && !f.AllowIllegalWrites {
 		return http2errStreamID
 	}
@@ -2024,7 +2101,7 @@
 	}
 	f.wbuf = append(f.wbuf, data...)
 	f.wbuf = append(f.wbuf, pad...)
-	return f.endWrite()
+	return nil
 }
 
 // A SettingsFrame conveys configuration parameters that affect how
@@ -3700,13 +3777,9 @@
 		p.c.L = &p.mu
 	}
 	defer p.c.Signal()
-	if p.err != nil {
+	if p.err != nil || p.breakErr != nil {
 		return 0, http2errClosedPipeWrite
 	}
-	if p.breakErr != nil {
-		p.unread += len(d)
-		return len(d), nil // discard when there is no reader
-	}
 	return p.b.Write(d)
 }
 
@@ -4180,14 +4253,14 @@
 	if s.NewWriteScheduler != nil {
 		sc.writeSched = s.NewWriteScheduler()
 	} else {
-		sc.writeSched = http2NewPriorityWriteScheduler(nil)
+		sc.writeSched = http2newRoundRobinWriteScheduler()
 	}
 
 	// These start at the RFC-specified defaults. If there is a higher
 	// configured value for inflow, that will be updated when we send a
 	// WINDOW_UPDATE shortly after sending SETTINGS.
 	sc.flow.add(http2initialWindowSize)
-	sc.inflow.add(http2initialWindowSize)
+	sc.inflow.init(http2initialWindowSize)
 	sc.hpackEncoder = hpack.NewEncoder(&sc.headerWriteBuf)
 	sc.hpackEncoder.SetMaxDynamicTableSizeLimit(s.maxEncoderHeaderTableSize())
 
@@ -4302,8 +4375,8 @@
 	wroteFrameCh     chan http2frameWriteResult  // from writeFrameAsync -> serve, tickles more frame writes
 	bodyReadCh       chan http2bodyReadMsg       // from handlers -> serve
 	serveMsgCh       chan interface{}            // misc messages & code to send to / run on the serve loop
-	flow             http2flow                   // conn-wide (not stream-specific) outbound flow control
-	inflow           http2flow                   // conn-wide inbound flow control
+	flow             http2outflow                // conn-wide (not stream-specific) outbound flow control
+	inflow           http2inflow                 // conn-wide inbound flow control
 	tlsState         *tls.ConnectionState        // shared by all handlers, like net/http
 	remoteAddrStr    string
 	writeSched       http2WriteScheduler
@@ -4320,9 +4393,11 @@
 	advMaxStreams               uint32 // our SETTINGS_MAX_CONCURRENT_STREAMS advertised the client
 	curClientStreams            uint32 // number of open streams initiated by the client
 	curPushedStreams            uint32 // number of open streams initiated by server push
+	curHandlers                 uint32 // number of running handler goroutines
 	maxClientStreamID           uint32 // max ever seen from client (odd), or 0 if there have been no client requests
 	maxPushPromiseID            uint32 // ID of the last push promise (even), or 0 if there have been no pushes
 	streams                     map[uint32]*http2stream
+	unstartedHandlers           []http2unstartedHandler
 	initialStreamSendWindowSize int32
 	maxFrameSize                int32
 	peerMaxHeaderListSize       uint32            // zero means unknown (default)
@@ -4380,10 +4455,10 @@
 	cancelCtx func()
 
 	// owned by serverConn's serve loop:
-	bodyBytes        int64     // body bytes seen so far
-	declBodyBytes    int64     // or -1 if undeclared
-	flow             http2flow // limits writing from Handler to client
-	inflow           http2flow // what the client is allowed to POST/etc to us
+	bodyBytes        int64        // body bytes seen so far
+	declBodyBytes    int64        // or -1 if undeclared
+	flow             http2outflow // limits writing from Handler to client
+	inflow           http2inflow  // what the client is allowed to POST/etc to us
 	state            http2streamState
 	resetQueued      bool        // RST_STREAM queued for write; set by sc.resetStream
 	gotTrailerHeader bool        // HEADER frame for trailers was seen
@@ -4585,8 +4660,13 @@
 // and then reports when it's done.
 // At most one goroutine can be running writeFrameAsync at a time per
 // serverConn.
-func (sc *http2serverConn) writeFrameAsync(wr http2FrameWriteRequest) {
-	err := wr.write.writeFrame(sc)
+func (sc *http2serverConn) writeFrameAsync(wr http2FrameWriteRequest, wd *http2writeData) {
+	var err error
+	if wd == nil {
+		err = wr.write.writeFrame(sc)
+	} else {
+		err = sc.framer.endWrite()
+	}
 	sc.wroteFrameCh <- http2frameWriteResult{wr: wr, err: err}
 }
 
@@ -4718,6 +4798,8 @@
 					return
 				case http2gracefulShutdownMsg:
 					sc.startGracefulShutdownInternal()
+				case http2handlerDoneMsg:
+					sc.handlerDone()
 				default:
 					panic("unknown timer")
 				}
@@ -4765,6 +4847,7 @@
 	http2idleTimerMsg        = new(http2serverMessage)
 	http2shutdownTimerMsg    = new(http2serverMessage)
 	http2gracefulShutdownMsg = new(http2serverMessage)
+	http2handlerDoneMsg      = new(http2serverMessage)
 )
 
 func (sc *http2serverConn) onSettingsTimer() { sc.sendServeMsg(http2settingsTimerMsg) }
@@ -4995,9 +5078,16 @@
 		sc.writingFrameAsync = false
 		err := wr.write.writeFrame(sc)
 		sc.wroteFrame(http2frameWriteResult{wr: wr, err: err})
+	} else if wd, ok := wr.write.(*http2writeData); ok {
+		// Encode the frame in the serve goroutine, to ensure we don't have
+		// any lingering asynchronous references to data passed to Write.
+		// See https://go.dev/issue/58446.
+		sc.framer.startWriteDataPadded(wd.streamID, wd.endStream, wd.p, nil)
+		sc.writingFrameAsync = true
+		go sc.writeFrameAsync(wr, wd)
 	} else {
 		sc.writingFrameAsync = true
-		go sc.writeFrameAsync(wr)
+		go sc.writeFrameAsync(wr, nil)
 	}
 }
 
@@ -5247,7 +5337,7 @@
 	if sc.inGoAway && (sc.goAwayCode != http2ErrCodeNo || f.Header().StreamID > sc.maxClientStreamID) {
 
 		if f, ok := f.(*http2DataFrame); ok {
-			if sc.inflow.available() < int32(f.Length) {
+			if !sc.inflow.take(f.Length) {
 				return sc.countError("data_flow", http2streamError(f.Header().StreamID, http2ErrCodeFlowControl))
 			}
 			sc.sendWindowUpdate(nil, int(f.Length)) // conn-level
@@ -5519,14 +5609,9 @@
 		// But still enforce their connection-level flow control,
 		// and return any flow control bytes since we're not going
 		// to consume them.
-		if sc.inflow.available() < int32(f.Length) {
+		if !sc.inflow.take(f.Length) {
 			return sc.countError("data_flow", http2streamError(id, http2ErrCodeFlowControl))
 		}
-		// Deduct the flow control from inflow, since we're
-		// going to immediately add it back in
-		// sendWindowUpdate, which also schedules sending the
-		// frames.
-		sc.inflow.take(int32(f.Length))
 		sc.sendWindowUpdate(nil, int(f.Length)) // conn-level
 
 		if st != nil && st.resetQueued {
@@ -5541,10 +5626,9 @@
 
 	// Sender sending more than they'd declared?
 	if st.declBodyBytes != -1 && st.bodyBytes+int64(len(data)) > st.declBodyBytes {
-		if sc.inflow.available() < int32(f.Length) {
+		if !sc.inflow.take(f.Length) {
 			return sc.countError("data_flow", http2streamError(id, http2ErrCodeFlowControl))
 		}
-		sc.inflow.take(int32(f.Length))
 		sc.sendWindowUpdate(nil, int(f.Length)) // conn-level
 
 		st.body.CloseWithError(fmt.Errorf("sender tried to send more than declared Content-Length of %d bytes", st.declBodyBytes))
@@ -5555,29 +5639,33 @@
 	}
 	if f.Length > 0 {
 		// Check whether the client has flow control quota.
-		if st.inflow.available() < int32(f.Length) {
+		if !http2takeInflows(&sc.inflow, &st.inflow, f.Length) {
 			return sc.countError("flow_on_data_length", http2streamError(id, http2ErrCodeFlowControl))
 		}
-		st.inflow.take(int32(f.Length))
 
 		if len(data) > 0 {
+			st.bodyBytes += int64(len(data))
 			wrote, err := st.body.Write(data)
 			if err != nil {
+				// The handler has closed the request body.
+				// Return the connection-level flow control for the discarded data,
+				// but not the stream-level flow control.
 				sc.sendWindowUpdate(nil, int(f.Length)-wrote)
-				return sc.countError("body_write_err", http2streamError(id, http2ErrCodeStreamClosed))
+				return nil
 			}
 			if wrote != len(data) {
 				panic("internal error: bad Writer")
 			}
-			st.bodyBytes += int64(len(data))
 		}
 
 		// Return any padded flow control now, since we won't
 		// refund it later on body reads.
-		if pad := int32(f.Length) - int32(len(data)); pad > 0 {
-			sc.sendWindowUpdate32(nil, pad)
-			sc.sendWindowUpdate32(st, pad)
-		}
+		// Call sendWindowUpdate even if there is no padding,
+		// to return buffered flow control credit if the sent
+		// window has shrunk.
+		pad := int32(f.Length) - int32(len(data))
+		sc.sendWindowUpdate32(nil, pad)
+		sc.sendWindowUpdate32(st, pad)
 	}
 	if f.StreamEnded() {
 		st.endStream()
@@ -5759,8 +5847,7 @@
 		}
 	}
 
-	go sc.runHandler(rw, req, handler)
-	return nil
+	return sc.scheduleHandler(id, rw, req, handler)
 }
 
 func (sc *http2serverConn) upgradeRequest(req *Request) {
@@ -5780,6 +5867,10 @@
 		sc.conn.SetReadDeadline(time.Time{})
 	}
 
+	// This is the first request on the connection,
+	// so start the handler directly rather than going
+	// through scheduleHandler.
+	sc.curHandlers++
 	go sc.runHandler(rw, req, sc.handler.ServeHTTP)
 }
 
@@ -5849,8 +5940,7 @@
 	st.cw.Init()
 	st.flow.conn = &sc.flow // link to conn-level counter
 	st.flow.add(sc.initialStreamSendWindowSize)
-	st.inflow.conn = &sc.inflow // link to conn-level counter
-	st.inflow.add(sc.srv.initialStreamRecvWindowSize())
+	st.inflow.init(sc.srv.initialStreamRecvWindowSize())
 	if sc.hs.WriteTimeout != 0 {
 		st.writeDeadline = time.AfterFunc(sc.hs.WriteTimeout, st.onWriteTimeout)
 	}
@@ -5942,7 +6032,7 @@
 		tlsState = sc.tlsState
 	}
 
-	needsContinue := rp.header.Get("Expect") == "100-continue"
+	needsContinue := httpguts.HeaderValuesContainsToken(rp.header["Expect"], "100-continue")
 	if needsContinue {
 		rp.header.Del("Expect")
 	}
@@ -6021,8 +6111,62 @@
 	return &http2responseWriter{rws: rws}
 }
 
+type http2unstartedHandler struct {
+	streamID uint32
+	rw       *http2responseWriter
+	req      *Request
+	handler  func(ResponseWriter, *Request)
+}
+
+// scheduleHandler starts a handler goroutine,
+// or schedules one to start as soon as an existing handler finishes.
+func (sc *http2serverConn) scheduleHandler(streamID uint32, rw *http2responseWriter, req *Request, handler func(ResponseWriter, *Request)) error {
+	sc.serveG.check()
+	maxHandlers := sc.advMaxStreams
+	if sc.curHandlers < maxHandlers {
+		sc.curHandlers++
+		go sc.runHandler(rw, req, handler)
+		return nil
+	}
+	if len(sc.unstartedHandlers) > int(4*sc.advMaxStreams) {
+		return sc.countError("too_many_early_resets", http2ConnectionError(http2ErrCodeEnhanceYourCalm))
+	}
+	sc.unstartedHandlers = append(sc.unstartedHandlers, http2unstartedHandler{
+		streamID: streamID,
+		rw:       rw,
+		req:      req,
+		handler:  handler,
+	})
+	return nil
+}
+
+func (sc *http2serverConn) handlerDone() {
+	sc.serveG.check()
+	sc.curHandlers--
+	i := 0
+	maxHandlers := sc.advMaxStreams
+	for ; i < len(sc.unstartedHandlers); i++ {
+		u := sc.unstartedHandlers[i]
+		if sc.streams[u.streamID] == nil {
+			// This stream was reset before its goroutine had a chance to start.
+			continue
+		}
+		if sc.curHandlers >= maxHandlers {
+			break
+		}
+		sc.curHandlers++
+		go sc.runHandler(u.rw, u.req, u.handler)
+		sc.unstartedHandlers[i] = http2unstartedHandler{} // don't retain references
+	}
+	sc.unstartedHandlers = sc.unstartedHandlers[i:]
+	if len(sc.unstartedHandlers) == 0 {
+		sc.unstartedHandlers = nil
+	}
+}
+
 // Run on its own goroutine.
 func (sc *http2serverConn) runHandler(rw *http2responseWriter, req *Request, handler func(ResponseWriter, *Request)) {
+	defer sc.sendServeMsg(http2handlerDoneMsg)
 	didPanic := true
 	defer func() {
 		rw.rws.stream.cancelCtx()
@@ -6132,47 +6276,28 @@
 }
 
 // st may be nil for conn-level
-func (sc *http2serverConn) sendWindowUpdate(st *http2stream, n int) {
-	sc.serveG.check()
-	// "The legal range for the increment to the flow control
-	// window is 1 to 2^31-1 (2,147,483,647) octets."
-	// A Go Read call on 64-bit machines could in theory read
-	// a larger Read than this. Very unlikely, but we handle it here
-	// rather than elsewhere for now.
-	const maxUint31 = 1<<31 - 1
-	for n > maxUint31 {
-		sc.sendWindowUpdate32(st, maxUint31)
-		n -= maxUint31
-	}
-	sc.sendWindowUpdate32(st, int32(n))
+func (sc *http2serverConn) sendWindowUpdate32(st *http2stream, n int32) {
+	sc.sendWindowUpdate(st, int(n))
 }
 
 // st may be nil for conn-level
-func (sc *http2serverConn) sendWindowUpdate32(st *http2stream, n int32) {
+func (sc *http2serverConn) sendWindowUpdate(st *http2stream, n int) {
 	sc.serveG.check()
-	if n == 0 {
+	var streamID uint32
+	var send int32
+	if st == nil {
+		send = sc.inflow.add(n)
+	} else {
+		streamID = st.id
+		send = st.inflow.add(n)
+	}
+	if send == 0 {
 		return
 	}
-	if n < 0 {
-		panic("negative update")
-	}
-	var streamID uint32
-	if st != nil {
-		streamID = st.id
-	}
 	sc.writeFrame(http2FrameWriteRequest{
-		write:  http2writeWindowUpdate{streamID: streamID, n: uint32(n)},
+		write:  http2writeWindowUpdate{streamID: streamID, n: uint32(send)},
 		stream: st,
 	})
-	var ok bool
-	if st == nil {
-		ok = sc.inflow.add(n)
-	} else {
-		ok = st.inflow.add(n)
-	}
-	if !ok {
-		panic("internal error; sent too many window updates without decrements?")
-	}
 }
 
 // requestBody is the Handler's Request.Body type.
@@ -6183,7 +6308,7 @@
 	conn          *http2serverConn
 	closeOnce     sync.Once  // for use by Close only
 	sawEOF        bool       // for use by Read only
-	pipe          *http2pipe // non-nil if we have a HTTP entity message body
+	pipe          *http2pipe // non-nil if we have an HTTP entity message body
 	needsContinue bool       // need to send a 100-continue
 }
 
@@ -6323,7 +6448,8 @@
 				clen = ""
 			}
 		}
-		if clen == "" && rws.handlerDone && http2bodyAllowedForStatus(rws.status) && (len(p) > 0 || !isHeadResp) {
+		_, hasContentLength := rws.snapHeader["Content-Length"]
+		if !hasContentLength && clen == "" && rws.handlerDone && http2bodyAllowedForStatus(rws.status) && (len(p) > 0 || !isHeadResp) {
 			clen = strconv.Itoa(len(p))
 		}
 		_, hasContentType := rws.snapHeader["Content-Type"]
@@ -6528,7 +6654,7 @@
 		err = rws.bw.Flush()
 	} else {
 		// The bufio.Writer won't call chunkWriter.Write
-		// (writeChunk with zero bytes, so we have to do it
+		// (writeChunk with zero bytes), so we have to do it
 		// ourselves to force the HTTP response header and/or
 		// final DATA frame (with END_STREAM) to be sent.
 		_, err = http2chunkWriter{rws}.Write(nil)
@@ -6886,6 +7012,7 @@
 			panic(fmt.Sprintf("newWriterAndRequestNoBody(%+v): %v", msg.url, err))
 		}
 
+		sc.curHandlers++
 		go sc.runHandler(rw, req, sc.handler.ServeHTTP)
 		return promisedID, nil
 	}
@@ -7004,10 +7131,6 @@
 	// we buffer per stream.
 	http2transportDefaultStreamFlow = 4 << 20
 
-	// transportDefaultStreamMinRefresh is the minimum number of bytes we'll send
-	// a stream-level WINDOW_UPDATE for at a time.
-	http2transportDefaultStreamMinRefresh = 4 << 10
-
 	http2defaultUserAgent = "Go-http-client/2.0"
 
 	// initialMaxConcurrentStreams is a connections maxConcurrentStreams until
@@ -7265,11 +7388,11 @@
 	idleTimeout time.Duration // or 0 for never
 	idleTimer   *time.Timer
 
-	mu              sync.Mutex // guards following
-	cond            *sync.Cond // hold mu; broadcast on flow/closed changes
-	flow            http2flow  // our conn-level flow control quota (cs.flow is per stream)
-	inflow          http2flow  // peer's conn-level flow control
-	doNotReuse      bool       // whether conn is marked to not be reused for any future requests
+	mu              sync.Mutex   // guards following
+	cond            *sync.Cond   // hold mu; broadcast on flow/closed changes
+	flow            http2outflow // our conn-level flow control quota (cs.outflow is per stream)
+	inflow          http2inflow  // peer's conn-level flow control
+	doNotReuse      bool         // whether conn is marked to not be reused for any future requests
 	closing         bool
 	closed          bool
 	seenSettings    bool                          // true if we've seen a settings frame, false otherwise
@@ -7333,10 +7456,10 @@
 	respHeaderRecv chan struct{} // closed when headers are received
 	res            *Response     // set if respHeaderRecv is closed
 
-	flow        http2flow // guarded by cc.mu
-	inflow      http2flow // guarded by cc.mu
-	bytesRemain int64     // -1 means unknown; owned by transportResponseBody.Read
-	readErr     error     // sticky read error; owned by transportResponseBody.Read
+	flow        http2outflow // guarded by cc.mu
+	inflow      http2inflow  // guarded by cc.mu
+	bytesRemain int64        // -1 means unknown; owned by transportResponseBody.Read
+	readErr     error        // sticky read error; owned by transportResponseBody.Read
 
 	reqBody              io.ReadCloser
 	reqBodyContentLength int64         // -1 means unknown
@@ -7480,11 +7603,14 @@
 func http2authorityAddr(scheme string, authority string) (addr string) {
 	host, port, err := net.SplitHostPort(authority)
 	if err != nil { // authority didn't have a port
+		host = authority
+		port = ""
+	}
+	if port == "" { // authority's port was empty
 		port = "443"
 		if scheme == "http" {
 			port = "80"
 		}
-		host = authority
 	}
 	if a, err := idna.ToASCII(host); err == nil {
 		host = a
@@ -7522,10 +7648,11 @@
 		http2traceGotConn(req, cc, reused)
 		res, err := cc.RoundTrip(req)
 		if err != nil && retry <= 6 {
+			roundTripErr := err
 			if req, err = http2shouldRetryRequest(req, err); err == nil {
 				// After the first retry, do exponential backoff with 10% jitter.
 				if retry == 0 {
-					t.vlogf("RoundTrip retrying after failure: %v", err)
+					t.vlogf("RoundTrip retrying after failure: %v", roundTripErr)
 					continue
 				}
 				backoff := float64(uint(1) << (uint(retry) - 1))
@@ -7534,7 +7661,7 @@
 				timer := http2backoffNewTimer(d)
 				select {
 				case <-timer.C:
-					t.vlogf("RoundTrip retrying after failure: %v", err)
+					t.vlogf("RoundTrip retrying after failure: %v", roundTripErr)
 					continue
 				case <-req.Context().Done():
 					timer.Stop()
@@ -7769,7 +7896,7 @@
 	cc.bw.Write(http2clientPreface)
 	cc.fr.WriteSettings(initialSettings...)
 	cc.fr.WriteWindowUpdate(0, http2transportDefaultConnFlow)
-	cc.inflow.add(http2transportDefaultConnFlow + http2initialWindowSize)
+	cc.inflow.init(http2transportDefaultConnFlow + http2initialWindowSize)
 	cc.bw.Flush()
 	if cc.werr != nil {
 		cc.Close()
@@ -8227,6 +8354,29 @@
 		return res, nil
 	}
 
+	cancelRequest := func(cs *http2clientStream, err error) error {
+		cs.cc.mu.Lock()
+		bodyClosed := cs.reqBodyClosed
+		cs.cc.mu.Unlock()
+		// Wait for the request body to be closed.
+		//
+		// If nothing closed the body before now, abortStreamLocked
+		// will have started a goroutine to close it.
+		//
+		// Closing the body before returning avoids a race condition
+		// with net/http checking its readTrackingBody to see if the
+		// body was read from or closed. See golang/go#60041.
+		//
+		// The body is closed in a separate goroutine without the
+		// connection mutex held, but dropping the mutex before waiting
+		// will keep us from holding it indefinitely if the body
+		// close is slow for some reason.
+		if bodyClosed != nil {
+			<-bodyClosed
+		}
+		return err
+	}
+
 	for {
 		select {
 		case <-cs.respHeaderRecv:
@@ -8246,10 +8396,10 @@
 		case <-ctx.Done():
 			err := ctx.Err()
 			cs.abortStream(err)
-			return nil, err
+			return nil, cancelRequest(cs, err)
 		case <-cs.reqCancel:
 			cs.abortStream(http2errRequestCanceled)
-			return nil, http2errRequestCanceled
+			return nil, cancelRequest(cs, http2errRequestCanceled)
 		}
 	}
 }
@@ -8531,7 +8681,7 @@
 	close(cs.donec)
 }
 
-// awaitOpenSlotForStream waits until len(streams) < maxConcurrentStreams.
+// awaitOpenSlotForStreamLocked waits until len(streams) < maxConcurrentStreams.
 // Must hold cc.mu.
 func (cc *http2ClientConn) awaitOpenSlotForStreamLocked(cs *http2clientStream) error {
 	for {
@@ -8806,6 +8956,9 @@
 	if err != nil {
 		return nil, err
 	}
+	if !httpguts.ValidHostHeader(host) {
+		return nil, errors.New("http2: invalid Host header")
+	}
 
 	var path string
 	if req.Method != "CONNECT" {
@@ -8842,7 +8995,7 @@
 		// 8.1.2.3 Request Pseudo-Header Fields
 		// The :path pseudo-header field includes the path and query parts of the
 		// target URI (the path-absolute production and optionally a '?' character
-		// followed by the query production (see Sections 3.3 and 3.4 of
+		// followed by the query production, see Sections 3.3 and 3.4 of
 		// [RFC3986]).
 		f(":authority", host)
 		m := req.Method
@@ -9031,8 +9184,7 @@
 func (cc *http2ClientConn) addStreamLocked(cs *http2clientStream) {
 	cs.flow.add(int32(cc.initialWindowSize))
 	cs.flow.setConnFlow(&cc.flow)
-	cs.inflow.add(http2transportDefaultStreamFlow)
-	cs.inflow.setConnFlow(&cc.inflow)
+	cs.inflow.init(http2transportDefaultStreamFlow)
 	cs.ID = cc.nextStreamID
 	cc.nextStreamID += 2
 	cc.streams[cs.ID] = cs
@@ -9491,21 +9643,10 @@
 	}
 
 	cc.mu.Lock()
-	var connAdd, streamAdd int32
-	// Check the conn-level first, before the stream-level.
-	if v := cc.inflow.available(); v < http2transportDefaultConnFlow/2 {
-		connAdd = http2transportDefaultConnFlow - v
-		cc.inflow.add(connAdd)
-	}
+	connAdd := cc.inflow.add(n)
+	var streamAdd int32
 	if err == nil { // No need to refresh if the stream is over or failed.
-		// Consider any buffered body data (read from the conn but not
-		// consumed by the client) when computing flow control for this
-		// stream.
-		v := int(cs.inflow.available()) + cs.bufPipe.Len()
-		if v < http2transportDefaultStreamFlow-http2transportDefaultStreamMinRefresh {
-			streamAdd = int32(http2transportDefaultStreamFlow - v)
-			cs.inflow.add(streamAdd)
-		}
+		streamAdd = cs.inflow.add(n)
 	}
 	cc.mu.Unlock()
 
@@ -9529,29 +9670,27 @@
 	cs := b.cs
 	cc := cs.cc
 
+	cs.bufPipe.BreakWithError(http2errClosedResponseBody)
+	cs.abortStream(http2errClosedResponseBody)
+
 	unread := cs.bufPipe.Len()
 	if unread > 0 {
 		cc.mu.Lock()
 		// Return connection-level flow control.
-		if unread > 0 {
-			cc.inflow.add(int32(unread))
-		}
+		connAdd := cc.inflow.add(unread)
 		cc.mu.Unlock()
 
 		// TODO(dneil): Acquiring this mutex can block indefinitely.
 		// Move flow control return to a goroutine?
 		cc.wmu.Lock()
 		// Return connection-level flow control.
-		if unread > 0 {
-			cc.fr.WriteWindowUpdate(0, uint32(unread))
+		if connAdd > 0 {
+			cc.fr.WriteWindowUpdate(0, uint32(connAdd))
 		}
 		cc.bw.Flush()
 		cc.wmu.Unlock()
 	}
 
-	cs.bufPipe.BreakWithError(http2errClosedResponseBody)
-	cs.abortStream(http2errClosedResponseBody)
-
 	select {
 	case <-cs.donec:
 	case <-cs.ctx.Done():
@@ -9586,13 +9725,18 @@
 		// But at least return their flow control:
 		if f.Length > 0 {
 			cc.mu.Lock()
-			cc.inflow.add(int32(f.Length))
+			ok := cc.inflow.take(f.Length)
+			connAdd := cc.inflow.add(int(f.Length))
 			cc.mu.Unlock()
-
-			cc.wmu.Lock()
-			cc.fr.WriteWindowUpdate(0, uint32(f.Length))
-			cc.bw.Flush()
-			cc.wmu.Unlock()
+			if !ok {
+				return http2ConnectionError(http2ErrCodeFlowControl)
+			}
+			if connAdd > 0 {
+				cc.wmu.Lock()
+				cc.fr.WriteWindowUpdate(0, uint32(connAdd))
+				cc.bw.Flush()
+				cc.wmu.Unlock()
+			}
 		}
 		return nil
 	}
@@ -9623,9 +9767,7 @@
 		}
 		// Check connection-level flow control.
 		cc.mu.Lock()
-		if cs.inflow.available() >= int32(f.Length) {
-			cs.inflow.take(int32(f.Length))
-		} else {
+		if !http2takeInflows(&cc.inflow, &cs.inflow, f.Length) {
 			cc.mu.Unlock()
 			return http2ConnectionError(http2ErrCodeFlowControl)
 		}
@@ -9647,19 +9789,20 @@
 			}
 		}
 
-		if refund > 0 {
-			cc.inflow.add(int32(refund))
-			if !didReset {
-				cs.inflow.add(int32(refund))
-			}
+		sendConn := cc.inflow.add(refund)
+		var sendStream int32
+		if !didReset {
+			sendStream = cs.inflow.add(refund)
 		}
 		cc.mu.Unlock()
 
-		if refund > 0 {
+		if sendConn > 0 || sendStream > 0 {
 			cc.wmu.Lock()
-			cc.fr.WriteWindowUpdate(0, uint32(refund))
-			if !didReset {
-				cc.fr.WriteWindowUpdate(cs.ID, uint32(refund))
+			if sendConn > 0 {
+				cc.fr.WriteWindowUpdate(0, uint32(sendConn))
+			}
+			if sendStream > 0 {
+				cc.fr.WriteWindowUpdate(cs.ID, uint32(sendStream))
 			}
 			cc.bw.Flush()
 			cc.wmu.Unlock()
@@ -10660,7 +10803,8 @@
 
 // writeQueue is used by implementations of WriteScheduler.
 type http2writeQueue struct {
-	s []http2FrameWriteRequest
+	s          []http2FrameWriteRequest
+	prev, next *http2writeQueue
 }
 
 func (q *http2writeQueue) empty() bool { return len(q.s) == 0 }
@@ -11238,3 +11382,112 @@
 	}
 	return http2FrameWriteRequest{}, false
 }
+
+type http2roundRobinWriteScheduler struct {
+	// control contains control frames (SETTINGS, PING, etc.).
+	control http2writeQueue
+
+	// streams maps stream ID to a queue.
+	streams map[uint32]*http2writeQueue
+
+	// stream queues are stored in a circular linked list.
+	// head is the next stream to write, or nil if there are no streams open.
+	head *http2writeQueue
+
+	// pool of empty queues for reuse.
+	queuePool http2writeQueuePool
+}
+
+// newRoundRobinWriteScheduler constructs a new write scheduler.
+// The round robin scheduler priorizes control frames
+// like SETTINGS and PING over DATA frames.
+// When there are no control frames to send, it performs a round-robin
+// selection from the ready streams.
+func http2newRoundRobinWriteScheduler() http2WriteScheduler {
+	ws := &http2roundRobinWriteScheduler{
+		streams: make(map[uint32]*http2writeQueue),
+	}
+	return ws
+}
+
+func (ws *http2roundRobinWriteScheduler) OpenStream(streamID uint32, options http2OpenStreamOptions) {
+	if ws.streams[streamID] != nil {
+		panic(fmt.Errorf("stream %d already opened", streamID))
+	}
+	q := ws.queuePool.get()
+	ws.streams[streamID] = q
+	if ws.head == nil {
+		ws.head = q
+		q.next = q
+		q.prev = q
+	} else {
+		// Queues are stored in a ring.
+		// Insert the new stream before ws.head, putting it at the end of the list.
+		q.prev = ws.head.prev
+		q.next = ws.head
+		q.prev.next = q
+		q.next.prev = q
+	}
+}
+
+func (ws *http2roundRobinWriteScheduler) CloseStream(streamID uint32) {
+	q := ws.streams[streamID]
+	if q == nil {
+		return
+	}
+	if q.next == q {
+		// This was the only open stream.
+		ws.head = nil
+	} else {
+		q.prev.next = q.next
+		q.next.prev = q.prev
+		if ws.head == q {
+			ws.head = q.next
+		}
+	}
+	delete(ws.streams, streamID)
+	ws.queuePool.put(q)
+}
+
+func (ws *http2roundRobinWriteScheduler) AdjustStream(streamID uint32, priority http2PriorityParam) {}
+
+func (ws *http2roundRobinWriteScheduler) Push(wr http2FrameWriteRequest) {
+	if wr.isControl() {
+		ws.control.push(wr)
+		return
+	}
+	q := ws.streams[wr.StreamID()]
+	if q == nil {
+		// This is a closed stream.
+		// wr should not be a HEADERS or DATA frame.
+		// We push the request onto the control queue.
+		if wr.DataSize() > 0 {
+			panic("add DATA on non-open stream")
+		}
+		ws.control.push(wr)
+		return
+	}
+	q.push(wr)
+}
+
+func (ws *http2roundRobinWriteScheduler) Pop() (http2FrameWriteRequest, bool) {
+	// Control and RST_STREAM frames first.
+	if !ws.control.empty() {
+		return ws.control.shift(), true
+	}
+	if ws.head == nil {
+		return http2FrameWriteRequest{}, false
+	}
+	q := ws.head
+	for {
+		if wr, ok := q.consume(math.MaxInt32); ok {
+			ws.head = q.next
+			return wr, true
+		}
+		q = q.next
+		if q == ws.head {
+			break
+		}
+	}
+	return http2FrameWriteRequest{}, false
+}
diff --git a/src/net/http/http.go b/src/net/http/http.go
index 101799f..9b81654 100644
--- a/src/net/http/http.go
+++ b/src/net/http/http.go
@@ -86,14 +86,20 @@
 		return s
 	}
 	b := make([]byte, 0, newLen)
+	var pos int
 	for i := 0; i < len(s); i++ {
 		if s[i] >= utf8.RuneSelf {
+			if pos < i {
+				b = append(b, s[pos:i]...)
+			}
 			b = append(b, '%')
 			b = strconv.AppendInt(b, int64(s[i]), 16)
-		} else {
-			b = append(b, s[i])
+			pos = i + 1
 		}
 	}
+	if pos < len(s) {
+		b = append(b, s[pos:]...)
+	}
 	return string(b)
 }
 
diff --git a/src/net/http/http_test.go b/src/net/http/http_test.go
index 0d92fe5..91bb1b2 100644
--- a/src/net/http/http_test.go
+++ b/src/net/http/http_test.go
@@ -48,35 +48,6 @@
 	}
 }
 
-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", ""},
-		{"[1::6]:8080", "[1::6]:8080"},
-
-		// Punycode:
-		{"гофер.рф/foo", "xn--c1ae0ajs.xn--p1ai"},
-		{"bücher.de", "xn--bcher-kva.de"},
-		{"bücher.de:8080", "xn--bcher-kva.de:8080"},
-		// Verify we convert to lowercase before punycode:
-		{"BÜCHER.de", "xn--bcher-kva.de"},
-		{"BÜCHER.de:8080", "xn--bcher-kva.de:8080"},
-		// Verify we normalize to NFC before punycode:
-		{"gophér.nfc", "xn--gophr-esa.nfc"},            // NFC input; no work needed
-		{"goph\u0065\u0301r.nfd", "xn--gophr-esa.nfd"}, // NFD input
-	}
-	for _, tt := range tests {
-		got := cleanHost(tt.in)
-		if tt.want != got {
-			t.Errorf("cleanHost(%q) = %q, want %q", tt.in, got, tt.want)
-		}
-	}
-}
-
 // Test that cmd/go doesn't link in the HTTP server.
 //
 // This catches accidental dependencies between the HTTP transport and
@@ -218,3 +189,13 @@
 		t.Fatal(err)
 	}
 }
+
+const redirectURL = "/thisaredirect细雪withasciilettersのけぶabcdefghijk.html"
+
+func BenchmarkHexEscapeNonASCII(b *testing.B) {
+	b.ReportAllocs()
+
+	for i := 0; i < b.N; i++ {
+		hexEscapeNonASCII(redirectURL)
+	}
+}
diff --git a/src/net/http/httputil/reverseproxy.go b/src/net/http/httputil/reverseproxy.go
index 58064a5..2a76b0b 100644
--- a/src/net/http/httputil/reverseproxy.go
+++ b/src/net/http/httputil/reverseproxy.go
@@ -257,7 +257,7 @@
 //		Rewrite: func(r *ProxyRequest) {
 //			r.SetURL(target)
 //			r.Out.Host = r.In.Host // if desired
-//		}
+//		},
 //	}
 func NewSingleHostReverseProxy(target *url.URL) *ReverseProxy {
 	director := func(req *http.Request) {
@@ -524,9 +524,7 @@
 		// 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()
-		}
+		http.NewResponseController(rw).Flush()
 	}
 
 	if len(res.Trailer) == announcedTrailers {
@@ -601,21 +599,22 @@
 	return p.FlushInterval
 }
 
-func (p *ReverseProxy) copyResponse(dst io.Writer, src io.Reader, flushInterval time.Duration) error {
+func (p *ReverseProxy) copyResponse(dst http.ResponseWriter, src io.Reader, flushInterval time.Duration) error {
+	var w io.Writer = dst
+
 	if flushInterval != 0 {
-		if wf, ok := dst.(writeFlusher); ok {
-			mlw := &maxLatencyWriter{
-				dst:     wf,
-				latency: flushInterval,
-			}
-			defer mlw.stop()
-
-			// set up initial timer so headers get flushed even if body writes are delayed
-			mlw.flushPending = true
-			mlw.t = time.AfterFunc(flushInterval, mlw.delayedFlush)
-
-			dst = mlw
+		mlw := &maxLatencyWriter{
+			dst:     dst,
+			flush:   http.NewResponseController(dst).Flush,
+			latency: flushInterval,
 		}
+		defer mlw.stop()
+
+		// set up initial timer so headers get flushed even if body writes are delayed
+		mlw.flushPending = true
+		mlw.t = time.AfterFunc(flushInterval, mlw.delayedFlush)
+
+		w = mlw
 	}
 
 	var buf []byte
@@ -623,7 +622,7 @@
 		buf = p.BufferPool.Get()
 		defer p.BufferPool.Put(buf)
 	}
-	_, err := p.copyBuffer(dst, src, buf)
+	_, err := p.copyBuffer(w, src, buf)
 	return err
 }
 
@@ -668,13 +667,9 @@
 	}
 }
 
-type writeFlusher interface {
-	io.Writer
-	http.Flusher
-}
-
 type maxLatencyWriter struct {
-	dst     writeFlusher
+	dst     io.Writer
+	flush   func() error
 	latency time.Duration // non-zero; negative means to flush immediately
 
 	mu           sync.Mutex // protects t, flushPending, and dst.Flush
@@ -687,7 +682,7 @@
 	defer m.mu.Unlock()
 	n, err = m.dst.Write(p)
 	if m.latency < 0 {
-		m.dst.Flush()
+		m.flush()
 		return
 	}
 	if m.flushPending {
@@ -708,7 +703,7 @@
 	if !m.flushPending { // if stop was called but AfterFunc already started this goroutine
 		return
 	}
-	m.dst.Flush()
+	m.flush()
 	m.flushPending = false
 }
 
@@ -739,17 +734,19 @@
 		return
 	}
 
-	hj, ok := rw.(http.Hijacker)
-	if !ok {
-		p.getErrorHandler()(rw, req, fmt.Errorf("can't switch protocols using non-Hijacker ResponseWriter type %T", rw))
-		return
-	}
 	backConn, ok := res.Body.(io.ReadWriteCloser)
 	if !ok {
 		p.getErrorHandler()(rw, req, fmt.Errorf("internal error: 101 switching protocols response with non-writable body"))
 		return
 	}
 
+	rc := http.NewResponseController(rw)
+	conn, brw, hijackErr := rc.Hijack()
+	if errors.Is(hijackErr, http.ErrNotSupported) {
+		p.getErrorHandler()(rw, req, fmt.Errorf("can't switch protocols using non-Hijacker ResponseWriter type %T", rw))
+		return
+	}
+
 	backConnCloseCh := make(chan bool)
 	go func() {
 		// Ensure that the cancellation of a request closes the backend.
@@ -760,12 +757,10 @@
 		}
 		backConn.Close()
 	}()
-
 	defer close(backConnCloseCh)
 
-	conn, brw, err := hj.Hijack()
-	if err != nil {
-		p.getErrorHandler()(rw, req, fmt.Errorf("Hijack failed on protocol switch: %v", err))
+	if hijackErr != nil {
+		p.getErrorHandler()(rw, req, fmt.Errorf("Hijack failed on protocol switch: %v", hijackErr))
 		return
 	}
 	defer conn.Close()
diff --git a/src/net/http/httputil/reverseproxy_test.go b/src/net/http/httputil/reverseproxy_test.go
index d5b0fb4..dd3330b 100644
--- a/src/net/http/httputil/reverseproxy_test.go
+++ b/src/net/http/httputil/reverseproxy_test.go
@@ -478,6 +478,62 @@
 	}
 }
 
+type mockFlusher struct {
+	http.ResponseWriter
+	flushed bool
+}
+
+func (m *mockFlusher) Flush() {
+	m.flushed = true
+}
+
+type wrappedRW struct {
+	http.ResponseWriter
+}
+
+func (w *wrappedRW) Unwrap() http.ResponseWriter {
+	return w.ResponseWriter
+}
+
+func TestReverseProxyResponseControllerFlushInterval(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)
+	}
+
+	mf := &mockFlusher{}
+	proxyHandler := NewSingleHostReverseProxy(backendURL)
+	proxyHandler.FlushInterval = -1 // flush immediately
+	proxyWithMiddleware := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+		mf.ResponseWriter = w
+		w = &wrappedRW{mf}
+		proxyHandler.ServeHTTP(w, r)
+	})
+
+	frontend := httptest.NewServer(proxyWithMiddleware)
+	defer frontend.Close()
+
+	req, _ := http.NewRequest("GET", frontend.URL, nil)
+	req.Close = true
+	res, err := frontend.Client().Do(req)
+	if err != nil {
+		t.Fatalf("Get: %v", err)
+	}
+	defer res.Body.Close()
+	if bodyBytes, _ := io.ReadAll(res.Body); string(bodyBytes) != expected {
+		t.Errorf("got body %q; expected %q", bodyBytes, expected)
+	}
+	if !mf.flushed {
+		t.Errorf("response writer was not flushed")
+	}
+}
+
 func TestReverseProxyFlushIntervalHeaders(t *testing.T) {
 	const expected = "hi"
 	stopCh := make(chan struct{})
diff --git a/src/net/http/main_test.go b/src/net/http/main_test.go
index 27872b4..ff56ef8 100644
--- a/src/net/http/main_test.go
+++ b/src/net/http/main_test.go
@@ -20,6 +20,7 @@
 var quietLog = log.New(io.Discard, "", 0)
 
 func TestMain(m *testing.M) {
+	*http.MaxWriteWaitBeforeConnReuse = 60 * time.Minute
 	v := m.Run()
 	if v == 0 && goroutineLeaked() {
 		os.Exit(1)
@@ -107,11 +108,30 @@
 	return false
 }
 
+var leakReported bool
+
 func afterTest(t testing.TB) {
 	http.DefaultTransport.(*http.Transport).CloseIdleConnections()
 	if testing.Short() {
 		return
 	}
+	if leakReported {
+		// To avoid confusion, only report the first leak of each test run.
+		// After the first leak has been reported, we can't tell whether the leaked
+		// goroutines are a new leak from a subsequent test or just the same
+		// goroutines from the first leak still hanging around, and we may add a lot
+		// of latency waiting for them to exit at the end of each test.
+		return
+	}
+
+	// We shouldn't be running the leak check for parallel tests, because we might
+	// report the goroutines from a test that is still running as a leak from a
+	// completely separate test that has just finished. So we use non-atomic loads
+	// and stores for the leakReported variable, and store every time we start a
+	// leak check so that the race detector will flag concurrent leak checks as a
+	// race even if we don't detect any leaks.
+	leakReported = true
+
 	var bad string
 	badSubstring := map[string]string{
 		").readLoop(":  "a Transport",
@@ -131,6 +151,7 @@
 			}
 		}
 		if bad == "" {
+			leakReported = false
 			return
 		}
 		// Bad stuff found, but goroutines might just still be
@@ -140,29 +161,15 @@
 	t.Errorf("Test appears to have leaked %s:\n%s", bad, stacks)
 }
 
-// waitCondition reports whether fn eventually returned true,
-// checking immediately and then every checkEvery amount,
-// until waitFor has elapsed, at which point it returns false.
-func waitCondition(waitFor, checkEvery time.Duration, fn func() bool) bool {
-	deadline := time.Now().Add(waitFor)
-	for time.Now().Before(deadline) {
-		if fn() {
-			return true
-		}
-		time.Sleep(checkEvery)
+// waitCondition waits for fn to return true,
+// checking immediately and then at exponentially increasing intervals.
+func waitCondition(t testing.TB, delay time.Duration, fn func(time.Duration) bool) {
+	t.Helper()
+	start := time.Now()
+	var since time.Duration
+	for !fn(since) {
+		time.Sleep(delay)
+		delay = 2*delay - (delay / 2) // 1.5x, rounded up
+		since = time.Since(start)
 	}
-	return false
-}
-
-// waitErrCondition is like waitCondition but with errors instead of bools.
-func waitErrCondition(waitFor, checkEvery time.Duration, fn func() error) error {
-	deadline := time.Now().Add(waitFor)
-	var err error
-	for time.Now().Before(deadline) {
-		if err = fn(); err == nil {
-			return nil
-		}
-		time.Sleep(checkEvery)
-	}
-	return err
 }
diff --git a/src/net/http/omithttp2.go b/src/net/http/omithttp2.go
index 3316f55..ca08ddf 100644
--- a/src/net/http/omithttp2.go
+++ b/src/net/http/omithttp2.go
@@ -42,9 +42,17 @@
 
 type http2clientConnPool struct {
 	mu    *sync.Mutex
-	conns map[string][]struct{}
+	conns map[string][]*http2clientConn
 }
 
+type http2clientConn struct{}
+
+type http2clientConnIdleState struct {
+	canTakeNewRequest bool
+}
+
+func (cc *http2clientConn) idleState() http2clientConnIdleState { return http2clientConnIdleState{} }
+
 func http2configureTransports(*Transport) (*http2Transport, error) { panic(noHTTP2) }
 
 func http2isNoCachedConnError(err error) bool {
diff --git a/src/net/http/pprof/pprof.go b/src/net/http/pprof/pprof.go
index db03af1..bc3225d 100644
--- a/src/net/http/pprof/pprof.go
+++ b/src/net/http/pprof/pprof.go
@@ -27,6 +27,15 @@
 // If you are not using DefaultServeMux, you will have to register handlers
 // with the mux you are using.
 //
+// # Parameters
+//
+// Parameters can be passed via GET query params:
+//
+//   - debug=N (all profiles): response format: N = 0: binary (default), N > 0: plaintext
+//   - gc=N (heap profile): N > 0: run a garbage collection cycle before profiling
+//   - seconds=N (allocs, block, goroutine, heap, mutex, threadcreate profiles): return a delta profile
+//   - seconds=N (cpu (profile), trace profiles): profile for the given duration
+//
 // # Usage examples
 //
 // Use the pprof tool to look at the heap profile:
@@ -57,8 +66,7 @@
 // in your browser.
 //
 // For a study of the facility in action, visit
-//
-//	https://blog.golang.org/2011/06/profiling-go-programs.html
+// https://blog.golang.org/2011/06/profiling-go-programs.html.
 package pprof
 
 import (
diff --git a/src/net/http/request.go b/src/net/http/request.go
index a45c9e3..81f79566 100644
--- a/src/net/http/request.go
+++ b/src/net/http/request.go
@@ -17,7 +17,6 @@
 	"io"
 	"mime"
 	"mime/multipart"
-	"net"
 	"net/http/httptrace"
 	"net/http/internal/ascii"
 	"net/textproto"
@@ -27,6 +26,7 @@
 	"strings"
 	"sync"
 
+	"golang.org/x/net/http/httpguts"
 	"golang.org/x/net/idna"
 )
 
@@ -48,6 +48,11 @@
 
 func (pe *ProtocolError) Error() string { return pe.ErrorString }
 
+// Is lets http.ErrNotSupported match errors.ErrUnsupported.
+func (pe *ProtocolError) Is(err error) bool {
+	return pe == ErrNotSupported && err == errors.ErrUnsupported
+}
+
 var (
 	// ErrNotSupported indicates that a feature is not supported.
 	//
@@ -575,12 +580,40 @@
 	// is not given, use the host from the request URL.
 	//
 	// Clean the host, in case it arrives with unexpected stuff in it.
-	host := cleanHost(r.Host)
+	host := r.Host
 	if host == "" {
 		if r.URL == nil {
 			return errMissingHost
 		}
-		host = cleanHost(r.URL.Host)
+		host = r.URL.Host
+	}
+	host, err = httpguts.PunycodeHostPort(host)
+	if err != nil {
+		return err
+	}
+	// Validate that the Host header is a valid header in general,
+	// but don't validate the host itself. This is sufficient to avoid
+	// header or request smuggling via the Host field.
+	// The server can (and will, if it's a net/http server) reject
+	// the request if it doesn't consider the host valid.
+	if !httpguts.ValidHostHeader(host) {
+		// Historically, we would truncate the Host header after '/' or ' '.
+		// Some users have relied on this truncation to convert a network
+		// address such as Unix domain socket path into a valid, ignored
+		// Host header (see https://go.dev/issue/61431).
+		//
+		// We don't preserve the truncation, because sending an altered
+		// header field opens a smuggling vector. Instead, zero out the
+		// Host header entirely if it isn't valid. (An empty Host is valid;
+		// see RFC 9112 Section 3.2.)
+		//
+		// Return an error if we're sending to a proxy, since the proxy
+		// probably can't do anything useful with an empty Host header.
+		if !usingProxy {
+			host = ""
+		} else {
+			return errors.New("http: invalid Host header")
+		}
 	}
 
 	// According to RFC 6874, an HTTP client, proxy, or other
@@ -737,40 +770,6 @@
 	return idna.Lookup.ToASCII(v)
 }
 
-// cleanHost cleans up the host sent in request's Host header.
-//
-// It both strips anything after '/' or ' ', and puts the value
-// into Punycode form, if necessary.
-//
-// 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 {
-		in = in[:i]
-	}
-	host, port, err := net.SplitHostPort(in)
-	if err != nil { // input was just a host
-		a, err := idnaASCII(in)
-		if err != nil {
-			return in // garbage in, garbage out
-		}
-		return a
-	}
-	a, err := idnaASCII(host)
-	if err != nil {
-		return in // garbage in, garbage out
-	}
-	return net.JoinHostPort(a, port)
-}
-
 // removeZone removes IPv6 zone identifier from host.
 // E.g., "[fe80::1%en0]:8080" to "[fe80::1]:8080"
 func removeZone(host string) string {
diff --git a/src/net/http/request_test.go b/src/net/http/request_test.go
index 23e49d6..a32b583 100644
--- a/src/net/http/request_test.go
+++ b/src/net/http/request_test.go
@@ -10,6 +10,7 @@
 	"context"
 	"crypto/rand"
 	"encoding/base64"
+	"errors"
 	"fmt"
 	"io"
 	"math"
@@ -31,7 +32,7 @@
 	}
 }
 
-// Issue #25192: Test that ParseForm fails but still parses the form when an URL
+// Issue #25192: Test that ParseForm fails but still parses the form when a URL
 // containing a semicolon is provided.
 func TestParseFormSemicolonSeparator(t *testing.T) {
 	for _, method := range []string{"POST", "PATCH", "PUT", "GET"} {
@@ -379,7 +380,7 @@
 }
 
 // Issue #25192: Test that ParseMultipartForm fails but still parses the
-// multi-part form when an URL containing a semicolon is provided.
+// multi-part form when a URL containing a semicolon is provided.
 func TestParseMultipartFormSemicolonSeparator(t *testing.T) {
 	req := newTestMultipartRequest(t)
 	req.URL = &url.URL{RawQuery: "q=foo;q=bar"}
@@ -766,18 +767,18 @@
 	}
 }
 
-func TestRequestBadHost(t *testing.T) {
+func TestRequestBadHostHeader(t *testing.T) {
 	got := []string{}
 	req, err := NewRequest("GET", "http://foo/after", nil)
 	if err != nil {
 		t.Fatal(err)
 	}
-	req.Host = "foo.com with spaces"
-	req.URL.Host = "foo.com with spaces"
+	req.Host = "foo.com\nnewline"
+	req.URL.Host = "foo.com\nnewline"
 	req.Write(logWrites{t, &got})
 	want := []string{
 		"GET /after HTTP/1.1\r\n",
-		"Host: foo.com\r\n",
+		"Host: \r\n",
 		"User-Agent: " + DefaultUserAgent + "\r\n",
 		"\r\n",
 	}
@@ -1388,3 +1389,9 @@
 		b.SetBytes(n)
 	}
 }
+
+func TestErrNotSupported(t *testing.T) {
+	if !errors.Is(ErrNotSupported, errors.ErrUnsupported) {
+		t.Error("errors.Is(ErrNotSupported, errors.ErrUnsupported) failed")
+	}
+}
diff --git a/src/net/http/responsecontroller.go b/src/net/http/responsecontroller.go
index 018bdc0..92276ff 100644
--- a/src/net/http/responsecontroller.go
+++ b/src/net/http/responsecontroller.go
@@ -31,6 +31,7 @@
 //	Hijack() (net.Conn, *bufio.ReadWriter, error)
 //	SetReadDeadline(deadline time.Time) error
 //	SetWriteDeadline(deadline time.Time) error
+//	EnableFullDuplex() error
 //
 // If the ResponseWriter does not support a method, ResponseController returns
 // an error matching ErrNotSupported.
@@ -115,6 +116,30 @@
 	}
 }
 
+// EnableFullDuplex indicates that the request handler will interleave reads from Request.Body
+// with writes to the ResponseWriter.
+//
+// For HTTP/1 requests, the Go HTTP server by default consumes any unread portion of
+// the request body before beginning to write the response, preventing handlers from
+// concurrently reading from the request and writing the response.
+// Calling EnableFullDuplex disables this behavior and permits handlers to continue to read
+// from the request while concurrently writing the response.
+//
+// For HTTP/2 requests, the Go HTTP server always permits concurrent reads and responses.
+func (c *ResponseController) EnableFullDuplex() error {
+	rw := c.rw
+	for {
+		switch t := rw.(type) {
+		case interface{ EnableFullDuplex() error }:
+			return t.EnableFullDuplex()
+		case rwUnwrapper:
+			rw = t.Unwrap()
+		default:
+			return errNotSupported()
+		}
+	}
+}
+
 // errNotSupported returns an error that Is ErrNotSupported,
 // but is not == to it.
 func errNotSupported() error {
diff --git a/src/net/http/responsecontroller_test.go b/src/net/http/responsecontroller_test.go
index 0dca733..5828f37 100644
--- a/src/net/http/responsecontroller_test.go
+++ b/src/net/http/responsecontroller_test.go
@@ -156,7 +156,9 @@
 }
 func testResponseControllerSetPastReadDeadline(t *testing.T, mode testMode) {
 	readc := make(chan struct{})
+	donec := make(chan struct{})
 	cst := newClientServerTest(t, mode, HandlerFunc(func(w ResponseWriter, r *Request) {
+		defer close(donec)
 		ctl := NewResponseController(w)
 		b := make([]byte, 3)
 		n, err := io.ReadFull(r.Body, b)
@@ -192,10 +194,19 @@
 	wg.Add(1)
 	go func() {
 		defer wg.Done()
+		defer pw.Close()
 		pw.Write([]byte("one"))
-		<-readc
+		select {
+		case <-readc:
+		case <-donec:
+			select {
+			case <-readc:
+			default:
+				t.Errorf("server handler unexpectedly exited without closing readc")
+				return
+			}
+		}
 		pw.Write([]byte("two"))
-		pw.Close()
 	}()
 	defer wg.Wait()
 	res, err := cst.c.Post(cst.ts.URL, "text/foo", pr)
@@ -263,3 +274,51 @@
 	io.Copy(io.Discard, res.Body)
 	defer res.Body.Close()
 }
+
+func TestResponseControllerEnableFullDuplex(t *testing.T) {
+	run(t, testResponseControllerEnableFullDuplex)
+}
+func testResponseControllerEnableFullDuplex(t *testing.T, mode testMode) {
+	cst := newClientServerTest(t, mode, HandlerFunc(func(w ResponseWriter, req *Request) {
+		ctl := NewResponseController(w)
+		if err := ctl.EnableFullDuplex(); err != nil {
+			// TODO: Drop test for HTTP/2 when x/net is updated to support
+			// EnableFullDuplex. Since HTTP/2 supports full duplex by default,
+			// the rest of the test is fine; it's just the EnableFullDuplex call
+			// that fails.
+			if mode != http2Mode {
+				t.Errorf("ctl.EnableFullDuplex() = %v, want nil", err)
+			}
+		}
+		w.WriteHeader(200)
+		ctl.Flush()
+		for {
+			var buf [1]byte
+			n, err := req.Body.Read(buf[:])
+			if n != 1 || err != nil {
+				break
+			}
+			w.Write(buf[:])
+			ctl.Flush()
+		}
+	}))
+	pr, pw := io.Pipe()
+	res, err := cst.c.Post(cst.ts.URL, "text/apocryphal", pr)
+	if err != nil {
+		t.Fatal(err)
+	}
+	defer res.Body.Close()
+	for i := byte(0); i < 10; i++ {
+		if _, err := pw.Write([]byte{i}); err != nil {
+			t.Fatalf("Write: %v", err)
+		}
+		var buf [1]byte
+		if n, err := res.Body.Read(buf[:]); n != 1 || err != nil {
+			t.Fatalf("Read: %v, %v", n, err)
+		}
+		if buf[0] != i {
+			t.Fatalf("read byte %v, want %v", buf[0], i)
+		}
+	}
+	pw.Close()
+}
diff --git a/src/net/http/roundtrip.go b/src/net/http/roundtrip.go
index c4c5d3b..49ea1a7 100644
--- a/src/net/http/roundtrip.go
+++ b/src/net/http/roundtrip.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build !js || !wasm
+//go:build !js
 
 package http
 
diff --git a/src/net/http/roundtrip_js.go b/src/net/http/roundtrip_js.go
index 01c0600..9f9f0cb 100644
--- a/src/net/http/roundtrip_js.go
+++ b/src/net/http/roundtrip_js.go
@@ -11,6 +11,7 @@
 	"fmt"
 	"io"
 	"strconv"
+	"strings"
 	"syscall/js"
 )
 
@@ -44,6 +45,16 @@
 // the browser globals.
 var jsFetchMissing = js.Global().Get("fetch").IsUndefined()
 
+// jsFetchDisabled controls whether the use of Fetch API is disabled.
+// It's set to true when we detect we're running in Node.js, so that
+// RoundTrip ends up talking over the same fake network the HTTP servers
+// currently use in various tests and examples. See go.dev/issue/57613.
+//
+// TODO(go.dev/issue/60810): See if it's viable to test the Fetch API
+// code path.
+var jsFetchDisabled = js.Global().Get("process").Type() == js.TypeObject &&
+	strings.HasPrefix(js.Global().Get("process").Get("argv0").String(), "node")
+
 // RoundTrip implements the RoundTripper interface using the WHATWG Fetch API.
 func (t *Transport) RoundTrip(req *Request) (*Response, error) {
 	// The Transport has a documented contract that states that if the DialContext or
@@ -52,7 +63,7 @@
 	// though they are deprecated. Therefore, if any of these are set, we should obey
 	// the contract and dial using the regular round-trip instead. Otherwise, we'll try
 	// to fall back on the Fetch API, unless it's not available.
-	if t.Dial != nil || t.DialContext != nil || t.DialTLS != nil || t.DialTLSContext != nil || jsFetchMissing {
+	if t.Dial != nil || t.DialContext != nil || t.DialTLS != nil || t.DialTLSContext != nil || jsFetchMissing || jsFetchDisabled {
 		return t.roundTrip(req)
 	}
 
@@ -99,6 +110,8 @@
 		// See https://github.com/web-platform-tests/wpt/issues/7693 for WHATWG tests issue.
 		// See https://developer.mozilla.org/en-US/docs/Web/API/Streams_API for more details on the Streams API
 		// and browser support.
+		// NOTE(haruyama480): Ensure HTTP/1 fallback exists.
+		// See https://go.dev/issue/61889 for discussion.
 		body, err := io.ReadAll(req.Body)
 		if err != nil {
 			req.Body.Close() // RoundTrip must always close the body, including on errors.
@@ -185,7 +198,23 @@
 	failure = js.FuncOf(func(this js.Value, args []js.Value) any {
 		success.Release()
 		failure.Release()
-		errCh <- fmt.Errorf("net/http: fetch() failed: %s", args[0].Get("message").String())
+
+		err := args[0]
+		// The error is a JS Error type
+		// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error
+		// We can use the toString() method to get a string representation of the error.
+		errMsg := err.Call("toString").String()
+		// Errors can optionally contain a cause.
+		if cause := err.Get("cause"); !cause.IsUndefined() {
+			// The exact type of the cause is not defined,
+			// but if it's another error, we can call toString() on it too.
+			if !cause.Get("toString").IsUndefined() {
+				errMsg += ": " + cause.Call("toString").String()
+			} else if cause.Type() == js.TypeString {
+				errMsg += ": " + cause.String()
+			}
+		}
+		errCh <- fmt.Errorf("net/http: fetch() failed: %s", errMsg)
 		return nil
 	})
 
diff --git a/src/net/http/serve_test.go b/src/net/http/serve_test.go
index eac527b..bb380cf 100644
--- a/src/net/http/serve_test.go
+++ b/src/net/http/serve_test.go
@@ -35,7 +35,6 @@
 	"reflect"
 	"regexp"
 	"runtime"
-	"runtime/debug"
 	"strconv"
 	"strings"
 	"sync"
@@ -827,15 +826,7 @@
 			t.Fatal(err)
 		}
 
-		// fail test if no response after 1 second
-		ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second)
-		defer cancel()
-		req = req.WithContext(ctx)
-
 		r, err := c.Do(req)
-		if ctx.Err() == context.DeadlineExceeded {
-			t.Fatalf("http2 Get #%d response timed out", i)
-		}
 		if err != nil {
 			t.Fatalf("http2 Get #%d: %v", i, err)
 		}
@@ -988,25 +979,19 @@
 
 	c := ts.Client()
 
-	errc := make(chan error, 1)
-	go func() {
+	err := func() error {
 		res, err := c.Get(ts.URL)
 		if err != nil {
-			errc <- err
-			return
+			return err
 		}
 		_, err = io.Copy(io.Discard, res.Body)
 		res.Body.Close()
-		errc <- err
+		return err
 	}()
-	select {
-	case err := <-errc:
-		if err == nil {
-			t.Errorf("expected an error from Get request")
-		}
-	case <-time.After(10 * time.Second):
-		t.Fatal("timeout waiting for Get error")
+	if err == nil {
+		t.Errorf("expected an error copying body from Get request")
 	}
+
 	if err := <-afterTimeoutErrc; err == nil {
 		t.Error("expected write error after timeout")
 	}
@@ -1133,21 +1118,10 @@
 		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 = io.ReadAll(r)
 	if err != nil {
 		t.Fatal("read error:", err)
 	}
-	didReadAll <- true
 
 	if !res.Close {
 		t.Errorf("Response.Close = false; want true")
@@ -1323,7 +1297,6 @@
 	}).ts
 
 	c := ts.Client()
-	c.Timeout = time.Second
 	// Force separate connection for each:
 	c.Transport.(*Transport).DisableKeepAlives = true
 
@@ -1354,13 +1327,7 @@
 	// Start another request and grab its connection
 	response2c := make(chan string, 1)
 	go fetch(2, response2c)
-	var conn2 net.Conn
-
-	select {
-	case conn2 = <-conns:
-	case <-time.After(time.Second):
-		t.Fatal("Second Accept didn't happen")
-	}
+	conn2 := <-conns
 
 	// Send a response on connection 2.
 	conn2.(*blockingRemoteAddrConn).addrs <- &net.TCPAddr{
@@ -1444,13 +1411,9 @@
 		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")
+	v := <-errc
+	if !strings.Contains(v, "timeout") && !strings.Contains(v, "TLS handshake") {
+		t.Errorf("expected a TLS handshake timeout error; got %q", v)
 	}
 }
 
@@ -1536,8 +1499,6 @@
 	case err := <-errc:
 		t.Fatalf("ServeTLS: %v", err)
 	case <-serving:
-	case <-time.After(5 * time.Second):
-		t.Fatal("timeout")
 	}
 
 	c, err := tls.Dial("tcp", ln.Addr().String(), &tls.Config{
@@ -1783,7 +1744,13 @@
 		// that doesn't send 100-continue expectations.
 		writeBody := test.contentLength != 0 && strings.ToLower(test.expectation) != "100-continue"
 
+		wg := sync.WaitGroup{}
+		wg.Add(1)
+		defer wg.Wait()
+
 		go func() {
+			defer wg.Done()
+
 			contentLen := fmt.Sprintf("Content-Length: %d", test.contentLength)
 			if test.chunked {
 				contentLen = "Transfer-Encoding: chunked"
@@ -2830,18 +2797,7 @@
 		return
 	}
 
-	var delay time.Duration
-	if deadline, ok := t.Deadline(); ok {
-		delay = time.Until(deadline)
-	} else {
-		delay = 5 * time.Second
-	}
-	select {
-	case <-done:
-		return
-	case <-time.After(delay):
-		t.Fatal("expected server handler to log an error")
-	}
+	<-done
 }
 
 type terrorWriter struct{ t *testing.T }
@@ -2881,11 +2837,7 @@
 		t.Fatal(err)
 	}
 	res.Body.Close()
-	select {
-	case <-done:
-	case <-time.After(5 * time.Second):
-		t.Fatal("timeout")
-	}
+	<-done
 }
 
 func TestServerNoDate(t *testing.T) {
@@ -3060,7 +3012,10 @@
 	//
 	// But that's okay, since what we're really testing is that
 	// the remote side hung up on us before we wrote too much.
-	_, _ = cst.c.Do(req)
+	resp, err := cst.c.Do(req)
+	if err == nil {
+		resp.Body.Close()
+	}
 
 	if atomic.LoadInt64(nWritten) > limit*100 {
 		t.Errorf("handler restricted the request body to %d bytes, but client managed to write %d",
@@ -3248,8 +3203,6 @@
 			diec <- true
 		case <-sawClose:
 			break For
-		case <-time.After(5 * time.Second):
-			t.Fatal("timeout")
 		}
 	}
 	ts.Close()
@@ -3305,9 +3258,6 @@
 			if closes > 1 {
 				return
 			}
-		case <-time.After(5 * time.Second):
-			ts.CloseClientConnections()
-			t.Fatal("timeout")
 		}
 	}
 }
@@ -3418,12 +3368,8 @@
 			return
 		}
 		bodyOkay <- true
-		select {
-		case <-gone:
-			gotCloseNotify <- true
-		case <-time.After(5 * time.Second):
-			gotCloseNotify <- false
-		}
+		<-gone
+		gotCloseNotify <- true
 	})).ts
 
 	conn, err := net.Dial("tcp", ts.Listener.Addr().String())
@@ -3439,9 +3385,7 @@
 		return
 	}
 	conn.Close()
-	if !<-gotCloseNotify {
-		t.Error("timeout waiting for CloseNotify")
-	}
+	<-gotCloseNotify
 }
 
 func TestOptions(t *testing.T) { run(t, testOptions, []testMode{http1Mode}) }
@@ -3517,13 +3461,8 @@
 		t.Fatal(err)
 	}
 
-	select {
-	case got := <-rc:
-		if got.Method != "OPTIONS" || got.RequestURI != "*" {
-			t.Errorf("Expected OPTIONS * request, got %v", got)
-		}
-	case <-time.After(5 * time.Second):
-		t.Error("timeout")
+	if got := <-rc; got.Method != "OPTIONS" || got.RequestURI != "*" {
+		t.Errorf("Expected OPTIONS * request, got %v", got)
 	}
 }
 
@@ -3995,8 +3934,6 @@
 		}
 		<-unblockBackend
 	}))
-	var quitTimer *time.Timer
-	defer func() { quitTimer.Stop() }()
 	defer backend.close()
 
 	backendRespc := make(chan *Response, 1)
@@ -4029,20 +3966,6 @@
 		rw.Write([]byte("OK"))
 	}))
 	defer proxy.close()
-	defer func() {
-		// Before we shut down our two httptest.Servers, start a timer.
-		// We choose 7 seconds because httptest.Server starts logging
-		// warnings to stderr at 5 seconds. If we don't disarm this bomb
-		// in 7 seconds (after the two httptest.Server.Close calls above),
-		// then we explode with stacks.
-		quitTimer = time.AfterFunc(7*time.Second, func() {
-			debug.SetTraceback("ALL")
-			stacks := make([]byte, 1<<20)
-			stacks = stacks[:runtime.Stack(stacks, true)]
-			fmt.Fprintf(os.Stderr, "%s", stacks)
-			log.Fatalf("Timeout.")
-		})
-	}()
 
 	defer close(unblockBackend)
 	req, _ := NewRequest("POST", proxy.ts.URL, io.LimitReader(neverEnding('a'), bodySize))
@@ -4108,8 +4031,6 @@
 		}
 	case err := <-errCh:
 		t.Error(err)
-	case <-time.After(5 * time.Second):
-		t.Error("timeout")
 	}
 }
 
@@ -4186,22 +4107,7 @@
 
 		doRequests()
 
-		stateDelay := 5 * time.Second
-		if deadline, ok := t.Deadline(); ok {
-			// Allow an arbitrarily long delay.
-			// This test was observed to be flaky on the darwin-arm64-corellium builder,
-			// so we're increasing the deadline to see if it starts passing.
-			// See https://golang.org/issue/37322.
-			const arbitraryCleanupMargin = 1 * time.Second
-			stateDelay = time.Until(deadline) - arbitraryCleanupMargin
-		}
-		timer := time.NewTimer(stateDelay)
-		select {
-		case <-timer.C:
-			t.Errorf("Timed out after %v waiting for connection to change state.", stateDelay)
-		case <-complete:
-			timer.Stop()
-		}
+		<-complete
 		sl := <-activeLog
 		if !reflect.DeepEqual(sl.got, sl.want) {
 			t.Errorf("Request(s) produced unexpected state sequence.\nGot:  %v\nWant: %v", sl.got, sl.want)
@@ -4490,8 +4396,6 @@
 		}
 	}()
 
-	timeout := time.NewTimer(numReq * 2 * time.Second) // 4x overkill
-	defer timeout.Stop()
 	addrSeen := map[string]bool{}
 	numOkay := 0
 	for {
@@ -4511,8 +4415,6 @@
 			if err == nil {
 				numOkay++
 			}
-		case <-timeout.C:
-			t.Fatal("timeout waiting for requests to complete")
 		}
 	}
 }
@@ -4946,15 +4848,11 @@
 	}
 
 	host := cst.ts.Listener.Addr().String()
-	select {
-	case got := <-ch:
-		if addr, ok := got.(net.Addr); !ok {
-			t.Errorf("local addr value = %T; want net.Addr", got)
-		} else if fmt.Sprint(addr) != host {
-			t.Errorf("local addr = %v; want %v", addr, host)
-		}
-	case <-time.After(5 * time.Second):
-		t.Error("timed out")
+	got := <-ch
+	if addr, ok := got.(net.Addr); !ok {
+		t.Errorf("local addr value = %T; want net.Addr", got)
+	} else if fmt.Sprint(addr) != host {
+		t.Errorf("local addr = %v; want %v", addr, host)
 	}
 }
 
@@ -5161,8 +5059,9 @@
 	}
 
 	// Start server process.
-	cmd := exec.Command(os.Args[0], "-test.run=XXXX", "-test.bench=BenchmarkClient$")
-	cmd.Env = append(os.Environ(), "TEST_BENCH_SERVER=yes")
+	ctx, cancel := context.WithCancel(context.Background())
+	cmd := testenv.CommandContext(b, ctx, os.Args[0], "-test.run=XXXX", "-test.bench=BenchmarkClient$")
+	cmd.Env = append(cmd.Environ(), "TEST_BENCH_SERVER=yes")
 	cmd.Stderr = os.Stderr
 	stdout, err := cmd.StdoutPipe()
 	if err != nil {
@@ -5171,35 +5070,28 @@
 	if err := cmd.Start(); err != nil {
 		b.Fatalf("subprocess failed to start: %v", err)
 	}
-	defer cmd.Process.Kill()
+
+	done := make(chan error, 1)
+	go func() {
+		done <- cmd.Wait()
+		close(done)
+	}()
+	defer func() {
+		cancel()
+		<-done
+	}()
 
 	// Wait for the server in the child process to respond and tell us
 	// its listening address, once it's started listening:
-	timer := time.AfterFunc(10*time.Second, func() {
-		cmd.Process.Kill()
-	})
-	defer timer.Stop()
 	bs := bufio.NewScanner(stdout)
 	if !bs.Scan() {
 		b.Fatalf("failed to read listening URL from child: %v", bs.Err())
 	}
 	url := "http://" + strings.TrimSpace(bs.Text()) + "/"
-	timer.Stop()
 	if _, err := getNoBody(url); err != nil {
 		b.Fatalf("initial probe of child process failed: %v", err)
 	}
 
-	done := make(chan error)
-	stop := make(chan struct{})
-	defer close(stop)
-	go func() {
-		select {
-		case <-stop:
-			return
-		case done <- cmd.Wait():
-		}
-	}()
-
 	// Do b.N requests to the server.
 	b.StartTimer()
 	for i := 0; i < b.N; i++ {
@@ -5220,13 +5112,8 @@
 
 	// 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")
+	if err := <-done; err != nil {
+		b.Fatalf("subprocess failed: %v", err)
 	}
 }
 
@@ -5436,8 +5323,6 @@
 		<-rw.(CloseNotifier).CloseNotify()
 		sawClose <- true
 	})).ts
-	tot := time.NewTimer(5 * time.Second)
-	defer tot.Stop()
 	b.StartTimer()
 	for i := 0; i < b.N; i++ {
 		conn, err := net.Dial("tcp", ts.Listener.Addr().String())
@@ -5449,12 +5334,7 @@
 			b.Fatal(err)
 		}
 		conn.Close()
-		tot.Reset(5 * time.Second)
-		select {
-		case <-sawClose:
-		case <-tot.C:
-			b.Fatal("timeout")
-		}
+		<-sawClose
 	}
 	b.StopTimer()
 }
@@ -5550,84 +5430,97 @@
 	get := func() string { return get(t, c, ts.URL) }
 
 	a1, a2 := get(), get()
-	if a1 != a2 {
-		t.Fatal("expected first two requests on same connection")
+	if a1 == a2 {
+		t.Logf("made two requests from a single conn %q (as expected)", a1)
+	} else {
+		t.Errorf("server reported requests from %q and %q; expected same connection", a1, a2)
 	}
-	addr := strings.TrimPrefix(ts.URL, "http://")
 
 	// The two requests should have used the same connection,
 	// and there should not have been a second connection that
 	// was created by racing dial against reuse.
 	// (The first get was completed when the second get started.)
-	n := tr.IdleConnCountForTesting("http", addr)
-	if n != 1 {
-		t.Fatalf("idle count for %q after 2 gets = %d, want 1", addr, n)
+	if conns := tr.IdleConnStrsForTesting(); len(conns) != 1 {
+		t.Errorf("found %d idle conns (%q); want 1", len(conns), conns)
 	}
 
 	// SetKeepAlivesEnabled should discard idle conns.
 	ts.Config.SetKeepAlivesEnabled(false)
 
-	var idle1 int
-	if !waitCondition(2*time.Second, 10*time.Millisecond, func() bool {
-		idle1 = tr.IdleConnCountForTesting("http", addr)
-		return idle1 == 0
-	}) {
-		t.Fatalf("idle count after SetKeepAlivesEnabled called = %v; want 0", idle1)
-	}
+	waitCondition(t, 10*time.Millisecond, func(d time.Duration) bool {
+		if conns := tr.IdleConnStrsForTesting(); len(conns) > 0 {
+			if d > 0 {
+				t.Logf("idle conns %v after SetKeepAlivesEnabled called = %q; waiting for empty", d, conns)
+			}
+			return false
+		}
+		return true
+	})
 
-	a3 := get()
-	if a3 == a2 {
-		t.Fatal("expected third request on new connection")
-	}
+	// If we make a third request it should use a new connection, but in general
+	// we have no way to verify that: the new connection could happen to reuse the
+	// exact same ports from the previous connection.
 }
 
 func TestServerShutdown(t *testing.T) { run(t, testServerShutdown) }
 func testServerShutdown(t *testing.T, mode testMode) {
-	var doShutdown func() // set later
-	var doStateCount func()
-	var shutdownRes = make(chan error, 1)
-	var statesRes = make(chan map[ConnState]int, 1)
-	var gotOnShutdown = make(chan struct{}, 1)
+	var cst *clientServerTest
+
+	var once sync.Once
+	statesRes := make(chan map[ConnState]int, 1)
+	shutdownRes := make(chan error, 1)
+	gotOnShutdown := make(chan struct{})
 	handler := HandlerFunc(func(w ResponseWriter, r *Request) {
-		doStateCount()
-		go doShutdown()
-		// Shutdown is graceful, so it should not interrupt
-		// this in-flight response. Add a tiny sleep here to
-		// increase the odds of a failure if shutdown has
-		// bugs.
-		time.Sleep(20 * time.Millisecond)
+		first := false
+		once.Do(func() {
+			statesRes <- cst.ts.Config.ExportAllConnsByState()
+			go func() {
+				shutdownRes <- cst.ts.Config.Shutdown(context.Background())
+			}()
+			first = true
+		})
+
+		if first {
+			// Shutdown is graceful, so it should not interrupt this in-flight response
+			// but should reject new requests. (Since this request is still in flight,
+			// the server's port should not be reused for another server yet.)
+			<-gotOnShutdown
+			// TODO(#59038): The HTTP/2 server empirically does not always reject new
+			// requests. As a workaround, loop until we see a failure.
+			for !t.Failed() {
+				res, err := cst.c.Get(cst.ts.URL)
+				if err != nil {
+					break
+				}
+				out, _ := io.ReadAll(res.Body)
+				res.Body.Close()
+				if mode == http2Mode {
+					t.Logf("%v: unexpected success (%q). Listener should be closed before OnShutdown is called.", cst.ts.URL, out)
+					t.Logf("Retrying to work around https://go.dev/issue/59038.")
+					continue
+				}
+				t.Errorf("%v: unexpected success (%q). Listener should be closed before OnShutdown is called.", cst.ts.URL, out)
+			}
+		}
+
 		io.WriteString(w, r.RemoteAddr)
 	})
-	cst := newClientServerTest(t, mode, handler, func(srv *httptest.Server) {
-		srv.Config.RegisterOnShutdown(func() { gotOnShutdown <- struct{}{} })
+
+	cst = newClientServerTest(t, mode, handler, func(srv *httptest.Server) {
+		srv.Config.RegisterOnShutdown(func() { close(gotOnShutdown) })
 	})
 
-	doShutdown = func() {
-		shutdownRes <- cst.ts.Config.Shutdown(context.Background())
-	}
-	doStateCount = func() {
-		statesRes <- cst.ts.Config.ExportAllConnsByState()
-	}
-	get(t, cst.c, cst.ts.URL) // calls t.Fail on failure
+	out := get(t, cst.c, cst.ts.URL) // calls t.Fail on failure
+	t.Logf("%v: %q", cst.ts.URL, out)
 
 	if err := <-shutdownRes; err != nil {
 		t.Fatalf("Shutdown: %v", err)
 	}
-	select {
-	case <-gotOnShutdown:
-	case <-time.After(5 * time.Second):
-		t.Errorf("onShutdown callback not called, RegisterOnShutdown broken?")
-	}
+	<-gotOnShutdown // Will hang if RegisterOnShutdown is broken.
 
 	if states := <-statesRes; states[StateActive] != 1 {
 		t.Errorf("connection in wrong state, %v", states)
 	}
-
-	res, err := cst.c.Get(cst.ts.URL)
-	if err == nil {
-		res.Body.Close()
-		t.Fatal("second request should fail. server should be shut down")
-	}
 }
 
 func TestServerShutdownStateNew(t *testing.T) { run(t, testServerShutdownStateNew) }
@@ -5671,7 +5564,11 @@
 		readRes <- err
 	}()
 
+	// TODO(#59037): This timeout is hard-coded in closeIdleConnections.
+	// It is undocumented, and some users may find it surprising.
+	// Either document it, or switch to a less surprising behavior.
 	const expectTimeout = 5 * time.Second
+
 	t0 := time.Now()
 	select {
 	case got := <-shutdownRes:
@@ -5688,13 +5585,8 @@
 
 	// Wait for c.Read to unblock; should be already done at this point,
 	// or within a few milliseconds.
-	select {
-	case err := <-readRes:
-		if err == nil {
-			t.Error("expected error from Read")
-		}
-	case <-time.After(2 * time.Second):
-		t.Errorf("timeout waiting for Read to unblock")
+	if err := <-readRes; err == nil {
+		t.Error("expected error from Read")
 	}
 }
 
@@ -5719,9 +5611,15 @@
 	srv := cst.ts.Config
 	srv.SetKeepAlivesEnabled(false)
 	for try := 0; try < 2; try++ {
-		if !waitCondition(2*time.Second, 10*time.Millisecond, srv.ExportAllConnsIdle) {
-			t.Fatalf("request %v: test server has active conns", try)
-		}
+		waitCondition(t, 10*time.Millisecond, func(d time.Duration) bool {
+			if !srv.ExportAllConnsIdle() {
+				if d > 0 {
+					t.Logf("test server still has active conns after %v", d)
+				}
+				return false
+			}
+			return true
+		})
 		conns := 0
 		var info httptrace.GotConnInfo
 		ctx := httptrace.WithClientTrace(context.Background(), &httptrace.ClientTrace{
@@ -5964,11 +5862,7 @@
 	if err := cn.(*net.TCPConn).CloseWrite(); err != nil {
 		t.Fatal(err)
 	}
-	select {
-	case <-done:
-	case <-time.After(2 * time.Second):
-		t.Error("timeout")
-	}
+	<-done
 }
 
 // Like TestServerHijackGetsBackgroundByte above but sending a
@@ -6540,6 +6434,75 @@
 	}
 }
 
+type tlogWriter struct{ t *testing.T }
+
+func (w tlogWriter) Write(p []byte) (int, error) {
+	w.t.Log(string(p))
+	return len(p), nil
+}
+
+func TestWriteHeaderSwitchingProtocols(t *testing.T) {
+	run(t, testWriteHeaderSwitchingProtocols, []testMode{http1Mode})
+}
+func testWriteHeaderSwitchingProtocols(t *testing.T, mode testMode) {
+	const wantBody = "want"
+	const wantUpgrade = "someProto"
+	ts := newClientServerTest(t, mode, HandlerFunc(func(w ResponseWriter, r *Request) {
+		w.Header().Set("Connection", "Upgrade")
+		w.Header().Set("Upgrade", wantUpgrade)
+		w.WriteHeader(StatusSwitchingProtocols)
+		NewResponseController(w).Flush()
+
+		// Writing headers or the body after sending a 101 header should fail.
+		w.WriteHeader(200)
+		if _, err := w.Write([]byte("x")); err == nil {
+			t.Errorf("Write to body after 101 Switching Protocols unexpectedly succeeded")
+		}
+
+		c, _, err := NewResponseController(w).Hijack()
+		if err != nil {
+			t.Errorf("Hijack: %v", err)
+			return
+		}
+		defer c.Close()
+		if _, err := c.Write([]byte(wantBody)); err != nil {
+			t.Errorf("Write to hijacked body: %v", err)
+		}
+	}), func(ts *httptest.Server) {
+		// Don't spam log with warning about superfluous WriteHeader call.
+		ts.Config.ErrorLog = log.New(tlogWriter{t}, "log: ", 0)
+	}).ts
+
+	conn, err := net.Dial("tcp", ts.Listener.Addr().String())
+	if err != nil {
+		t.Fatalf("net.Dial: %v", err)
+	}
+	_, err = conn.Write([]byte("GET / HTTP/1.1\r\nHost: foo\r\n\r\n"))
+	if err != nil {
+		t.Fatalf("conn.Write: %v", err)
+	}
+	defer conn.Close()
+
+	r := bufio.NewReader(conn)
+	res, err := ReadResponse(r, &Request{Method: "GET"})
+	if err != nil {
+		t.Fatal("ReadResponse error:", err)
+	}
+	if res.StatusCode != StatusSwitchingProtocols {
+		t.Errorf("Response StatusCode=%v, want 101", res.StatusCode)
+	}
+	if got := res.Header.Get("Upgrade"); got != wantUpgrade {
+		t.Errorf("Response Upgrade header = %q, want %q", got, wantUpgrade)
+	}
+	body, err := io.ReadAll(r)
+	if err != nil {
+		t.Error(err)
+	}
+	if string(body) != wantBody {
+		t.Errorf("Response body = %q, want %q", string(body), wantBody)
+	}
+}
+
 func TestMuxRedirectRelative(t *testing.T) {
 	setParallel(t)
 	req, err := ReadRequest(bufio.NewReader(strings.NewReader("GET http://example.com HTTP/1.1\r\nHost: test\r\n\r\n")))
@@ -6562,10 +6525,10 @@
 	t.Cleanup(func() { afterTest(t) })
 
 	tests := []struct {
-		query           string
-		xNoSemicolons   string
-		xWithSemicolons string
-		warning         bool
+		query              string
+		xNoSemicolons      string
+		xWithSemicolons    string
+		expectParseFormErr bool
 	}{
 		{"?a=1;x=bad&x=good", "good", "bad", true},
 		{"?a=1;b=bad&x=good", "good", "good", true},
@@ -6577,20 +6540,20 @@
 		for _, tt := range tests {
 			t.Run(tt.query+"/allow=false", func(t *testing.T) {
 				allowSemicolons := false
-				testQuerySemicolon(t, mode, tt.query, tt.xNoSemicolons, allowSemicolons, tt.warning)
+				testQuerySemicolon(t, mode, tt.query, tt.xNoSemicolons, allowSemicolons, tt.expectParseFormErr)
 			})
 			t.Run(tt.query+"/allow=true", func(t *testing.T) {
-				allowSemicolons, expectWarning := true, false
-				testQuerySemicolon(t, mode, tt.query, tt.xWithSemicolons, allowSemicolons, expectWarning)
+				allowSemicolons, expectParseFormErr := true, false
+				testQuerySemicolon(t, mode, tt.query, tt.xWithSemicolons, allowSemicolons, expectParseFormErr)
 			})
 		}
 	})
 }
 
-func testQuerySemicolon(t *testing.T, mode testMode, query string, wantX string, allowSemicolons, expectWarning bool) {
+func testQuerySemicolon(t *testing.T, mode testMode, query string, wantX string, allowSemicolons, expectParseFormErr bool) {
 	writeBackX := func(w ResponseWriter, r *Request) {
 		x := r.URL.Query().Get("x")
-		if expectWarning {
+		if expectParseFormErr {
 			if err := r.ParseForm(); err == nil || !strings.Contains(err.Error(), "semicolon") {
 				t.Errorf("expected error mentioning semicolons from ParseForm, got %v", err)
 			}
@@ -6628,16 +6591,6 @@
 	if got, want := string(slurp), wantX; got != want {
 		t.Errorf("Body = %q; want = %q", got, want)
 	}
-
-	if expectWarning {
-		if !strings.Contains(logBuf.String(), "semicolon") {
-			t.Errorf("got %q from ErrorLog, expected a mention of semicolons", logBuf.String())
-		}
-	} else {
-		if strings.Contains(logBuf.String(), "semicolon") {
-			t.Errorf("got %q from ErrorLog, expected no mention of semicolons", logBuf.String())
-		}
-	}
 }
 
 func TestMaxBytesHandler(t *testing.T) {
@@ -6671,9 +6624,30 @@
 	defer ts.Close()
 
 	c := ts.Client()
+
+	body := strings.Repeat("a", int(requestSize))
+	var wg sync.WaitGroup
+	defer wg.Wait()
+	getBody := func() (io.ReadCloser, error) {
+		wg.Add(1)
+		body := &wgReadCloser{
+			Reader: strings.NewReader(body),
+			wg:     &wg,
+		}
+		return body, nil
+	}
+	reqBody, _ := getBody()
+	req, err := NewRequest("POST", ts.URL, reqBody)
+	if err != nil {
+		reqBody.Close()
+		t.Fatal(err)
+	}
+	req.ContentLength = int64(len(body))
+	req.GetBody = getBody
+	req.Header.Set("Content-Type", "text/plain")
+
 	var buf strings.Builder
-	body := strings.NewReader(strings.Repeat("a", int(requestSize)))
-	res, err := c.Post(ts.URL, "text/plain", body)
+	res, err := c.Do(req)
 	if err != nil {
 		t.Errorf("unexpected connection error: %v", err)
 	} else {
@@ -6854,3 +6828,43 @@
 		}
 	}
 }
+
+// TestDisableContentLength verifies that the Content-Length is set by default
+// or disabled when the header is set to nil.
+func TestDisableContentLength(t *testing.T) { run(t, testDisableContentLength) }
+func testDisableContentLength(t *testing.T, mode testMode) {
+	if mode == http2Mode {
+		t.Skip("skipping until h2_bundle.go is updated; see https://go-review.googlesource.com/c/net/+/471535")
+	}
+
+	noCL := newClientServerTest(t, mode, HandlerFunc(func(w ResponseWriter, r *Request) {
+		w.Header()["Content-Length"] = nil // disable the default Content-Length response
+		fmt.Fprintf(w, "OK")
+	}))
+
+	res, err := noCL.c.Get(noCL.ts.URL)
+	if err != nil {
+		t.Fatal(err)
+	}
+	if got, haveCL := res.Header["Content-Length"]; haveCL {
+		t.Errorf("Unexpected Content-Length: %q", got)
+	}
+	if err := res.Body.Close(); err != nil {
+		t.Fatal(err)
+	}
+
+	withCL := newClientServerTest(t, mode, HandlerFunc(func(w ResponseWriter, r *Request) {
+		fmt.Fprintf(w, "OK")
+	}))
+
+	res, err = withCL.c.Get(withCL.ts.URL)
+	if err != nil {
+		t.Fatal(err)
+	}
+	if got := res.Header.Get("Content-Length"); got != "2" {
+		t.Errorf("Content-Length: %q; want 2", got)
+	}
+	if err := res.Body.Close(); err != nil {
+		t.Fatal(err)
+	}
+}
diff --git a/src/net/http/server.go b/src/net/http/server.go
index c3c3f91..8f63a90 100644
--- a/src/net/http/server.go
+++ b/src/net/http/server.go
@@ -460,6 +460,10 @@
 	// Content-Length.
 	closeAfterReply bool
 
+	// When fullDuplex is false (the default), we consume any remaining
+	// request body before starting to write a response.
+	fullDuplex 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
@@ -497,6 +501,11 @@
 	return c.conn.rwc.SetWriteDeadline(deadline)
 }
 
+func (c *response) EnableFullDuplex() error {
+	c.fullDuplex = true
+	return nil
+}
+
 // TrailerPrefix is a magic prefix for ResponseWriter.Header map keys
 // that, if present, signals that the map entry is actually for
 // the response trailers, and not the response headers. The prefix
@@ -1145,8 +1154,11 @@
 	}
 	checkWriteHeaderCode(code)
 
-	// Handle informational headers
-	if code >= 100 && code <= 199 {
+	// Handle informational headers.
+	//
+	// We shouldn't send any further headers after 101 Switching Protocols,
+	// so it takes the non-informational path.
+	if code >= 100 && code <= 199 && code != StatusSwitchingProtocols {
 		// Prevent a potential race with an automatically-sent 100 Continue triggered by Request.Body.Read()
 		if code == 100 && w.canWriteContinue.Load() {
 			w.writeContinueMu.Lock()
@@ -1308,7 +1320,7 @@
 	// 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.Load() && !trailers && !hasTE && bodyAllowedForStatus(w.status) && header.get("Content-Length") == "" && (!isHEAD || len(p) > 0) {
+	if w.handlerDone.Load() && !trailers && !hasTE && bodyAllowedForStatus(w.status) && !header.has("Content-Length") && (!isHEAD || len(p) > 0) {
 		w.contentLength = int64(len(p))
 		setHeader.contentLength = strconv.AppendInt(cw.res.clenBuf[:0], int64(len(p)), 10)
 	}
@@ -1354,14 +1366,14 @@
 		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.
-	// TODO(bradfitz): where does RFC 2616 say that? See Issue 15527
-	// about HTTP/1.x Handlers concurrently reading and writing, like
-	// HTTP/2 handlers can do. Maybe this code should be relaxed?
-	if w.req.ContentLength != 0 && !w.closeAfterReply {
+	// We do this by default because there are a number of clients that
+	// send a full request before starting to read the response, and they
+	// can deadlock if we start writing the response with unconsumed body
+	// remaining. See Issue 15527 for some history.
+	//
+	// If full duplex mode has been enabled with ResponseController.EnableFullDuplex,
+	// then leave the request body alone.
+	if w.req.ContentLength != 0 && !w.closeAfterReply && !w.fullDuplex {
 		var discard, tooBig bool
 
 		switch bdy := w.req.Body.(type) {
@@ -1749,7 +1761,7 @@
 
 var _ closeWriter = (*net.TCPConn)(nil)
 
-// closeWrite flushes any outstanding data and sends a FIN packet (if
+// closeWriteAndWait flushes any outstanding data and sends a FIN packet (if
 // client is connected via TCP), signaling that we're done. We then
 // pause for a bit, hoping the client processes it before any
 // subsequent RST.
@@ -1844,7 +1856,9 @@
 
 // Serve a new connection.
 func (c *conn) serve(ctx context.Context) {
-	c.remoteAddr = c.rwc.RemoteAddr().String()
+	if ra := c.rwc.RemoteAddr(); ra != nil {
+		c.remoteAddr = ra.String()
+	}
 	ctx = context.WithValue(ctx, LocalAddrContextKey, c.rwc.LocalAddr())
 	var inFlightResponse *response
 	defer func() {
@@ -2278,7 +2292,7 @@
 // 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
+// called for paths beginning with "/images/thumbnails/" and the
 // former will receive requests for any other paths in the
 // "/images/" subtree.
 //
@@ -2921,23 +2935,9 @@
 		handler = globalOptionsHandler{}
 	}
 
-	if req.URL != nil && strings.Contains(req.URL.RawQuery, ";") {
-		var allowQuerySemicolonsInUse atomic.Bool
-		req = req.WithContext(context.WithValue(req.Context(), silenceSemWarnContextKey, func() {
-			allowQuerySemicolonsInUse.Store(true)
-		}))
-		defer func() {
-			if !allowQuerySemicolonsInUse.Load() {
-				sh.srv.logf("http: URL query contains semicolon, which is no longer a supported separator; parts of the query may be stripped when parsed; see golang.org/issue/25192")
-			}
-		}()
-	}
-
 	handler.ServeHTTP(rw, req)
 }
 
-var silenceSemWarnContextKey = &contextKey{"silence-semicolons"}
-
 // AllowQuerySemicolons returns a handler that serves requests by converting any
 // unescaped semicolons in the URL query to ampersands, and invoking the handler h.
 //
@@ -2949,9 +2949,6 @@
 // AllowQuerySemicolons should be invoked before Request.ParseForm is called.
 func AllowQuerySemicolons(h Handler) Handler {
 	return HandlerFunc(func(w ResponseWriter, r *Request) {
-		if silenceSemicolonsWarning, ok := r.Context().Value(silenceSemWarnContextKey).(func()); ok {
-			silenceSemicolonsWarning()
-		}
 		if strings.Contains(r.URL.RawQuery, ";") {
 			r2 := new(Request)
 			*r2 = *r
@@ -2990,7 +2987,7 @@
 
 var testHookServerServe func(*Server, net.Listener) // used if non-nil
 
-// shouldDoServeHTTP2 reports whether Server.Serve should configure
+// shouldConfigureHTTP2ForServe reports whether Server.Serve should configure
 // automatic HTTP/2. (which sets up the srv.TLSNextProto map)
 func (srv *Server) shouldConfigureHTTP2ForServe() bool {
 	if srv.TLSConfig == nil {
@@ -3319,7 +3316,11 @@
 // configured otherwise. (by setting srv.TLSNextProto non-nil)
 // It must only be called via srv.nextProtoOnce (use srv.setupHTTP2_*).
 func (srv *Server) onceSetNextProtoDefaults() {
-	if omitBundledHTTP2 || http2server.Value() == "0" {
+	if omitBundledHTTP2 {
+		return
+	}
+	if http2server.Value() == "0" {
+		http2server.IncNonDefault()
 		return
 	}
 	// Enable HTTP/2 by default if the user hasn't otherwise
diff --git a/src/net/http/socks_bundle.go b/src/net/http/socks_bundle.go
index e446669..776b03d 100644
--- a/src/net/http/socks_bundle.go
+++ b/src/net/http/socks_bundle.go
@@ -445,7 +445,7 @@
 	case socksAuthMethodNotRequired:
 		return nil
 	case socksAuthMethodUsernamePassword:
-		if len(up.Username) == 0 || len(up.Username) > 255 || len(up.Password) == 0 || len(up.Password) > 255 {
+		if len(up.Username) == 0 || len(up.Username) > 255 || len(up.Password) > 255 {
 			return errors.New("invalid username/password")
 		}
 		b := []byte{socksauthUsernamePasswordVersion}
diff --git a/src/net/http/transfer.go b/src/net/http/transfer.go
index 7c7afd7..d6f26a7 100644
--- a/src/net/http/transfer.go
+++ b/src/net/http/transfer.go
@@ -416,7 +416,7 @@
 	return
 }
 
-// unwrapBodyReader unwraps the body's inner reader if it's a
+// unwrapBody unwraps the body's inner reader if it's a
 // nopCloser. This is to ensure that body writes sourced from local
 // files (*os.File types) are properly optimized.
 //
diff --git a/src/net/http/transport.go b/src/net/http/transport.go
index ddcb648..c07352b 100644
--- a/src/net/http/transport.go
+++ b/src/net/http/transport.go
@@ -85,13 +85,13 @@
 // ClientTrace.Got1xxResponse.
 //
 // Transport only retries a request upon encountering a network error
-// if the request is idempotent and either has no body or has its
-// Request.GetBody defined. HTTP requests are considered idempotent if
-// they have HTTP methods GET, HEAD, OPTIONS, or TRACE; or if their
-// Header map contains an "Idempotency-Key" or "X-Idempotency-Key"
-// entry. If the idempotency key value is a zero-length slice, the
-// request is treated as idempotent but the header is not sent on the
-// wire.
+// if the connection has been already been used successfully and if the
+// request is idempotent and either has no body or has its Request.GetBody
+// defined. HTTP requests are considered idempotent if they have HTTP methods
+// GET, HEAD, OPTIONS, or TRACE; or if their Header map contains an
+// "Idempotency-Key" or "X-Idempotency-Key" entry. If the idempotency key
+// value is a zero-length slice, the request is treated as idempotent but the
+// header is not sent on the wire.
 type Transport struct {
 	idleMu       sync.Mutex
 	closeIdle    bool                                // user has requested to close all idle conns
@@ -173,7 +173,7 @@
 	// If non-nil, HTTP/2 support may not be enabled by default.
 	TLSClientConfig *tls.Config
 
-	// TLSHandshakeTimeout specifies the maximum amount of time waiting to
+	// TLSHandshakeTimeout specifies the maximum amount of time to
 	// wait for a TLS handshake. Zero means no timeout.
 	TLSHandshakeTimeout time.Duration
 
@@ -369,6 +369,7 @@
 func (t *Transport) onceSetNextProtoDefaults() {
 	t.tlsNextProtoWasNil = (t.TLSNextProto == nil)
 	if http2client.Value() == "0" {
+		http2client.IncNonDefault()
 		return
 	}
 
@@ -621,6 +622,12 @@
 			if e, ok := err.(transportReadFromServerError); ok {
 				err = e.err
 			}
+			if b, ok := req.Body.(*readTrackingBody); ok && !b.didClose {
+				// Issue 49621: Close the request body if pconn.roundTrip
+				// didn't do so already. This can happen if the pconn
+				// write loop exits without reading the write request.
+				req.closeBody()
+			}
 			return nil, err
 		}
 		testHookRoundTripRetried()
@@ -1173,7 +1180,11 @@
 
 func (t *Transport) dial(ctx context.Context, network, addr string) (net.Conn, error) {
 	if t.DialContext != nil {
-		return t.DialContext(ctx, network, addr)
+		c, err := t.DialContext(ctx, network, addr)
+		if c == nil && err == nil {
+			err = errors.New("net/http: Transport.DialContext hook returned (nil, nil)")
+		}
+		return c, err
 	}
 	if t.Dial != nil {
 		c, err := t.Dial(network, addr)
@@ -2445,7 +2456,10 @@
 // maxWriteWaitBeforeConnReuse is how long the a Transport RoundTrip
 // will wait to see the Request's Body.Write result after getting a
 // response from the server. See comments in (*persistConn).wroteRequest.
-const maxWriteWaitBeforeConnReuse = 50 * time.Millisecond
+//
+// In tests, we set this to a large value to avoid flakiness from inconsistent
+// recycling of connections.
+var maxWriteWaitBeforeConnReuse = 50 * time.Millisecond
 
 // wroteRequest is a check before recycling a connection that the previous write
 // (from writeLoop above) happened and was successful.
@@ -2743,17 +2757,21 @@
 	"socks5": "1080",
 }
 
-// canonicalAddr returns url.Host but always with a ":port" suffix.
-func canonicalAddr(url *url.URL) string {
+func idnaASCIIFromURL(url *url.URL) string {
 	addr := url.Hostname()
 	if v, err := idnaASCII(addr); err == nil {
 		addr = v
 	}
+	return addr
+}
+
+// canonicalAddr returns url.Host but always with a ":port" suffix.
+func canonicalAddr(url *url.URL) string {
 	port := url.Port()
 	if port == "" {
 		port = portMap[url.Scheme]
 	}
-	return net.JoinHostPort(addr, port)
+	return net.JoinHostPort(idnaASCIIFromURL(url), port)
 }
 
 // bodyEOFSignal is used by the HTTP/1 transport when reading response
diff --git a/src/net/http/transport_default_js.go b/src/net/http/transport_default_js.go
deleted file mode 100644
index c07d35e..0000000
--- a/src/net/http/transport_default_js.go
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2021 The Go 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:build js && wasm
-// +build js,wasm
-
-package http
-
-import (
-	"context"
-	"net"
-)
-
-func defaultTransportDialContext(dialer *net.Dialer) func(context.Context, string, string) (net.Conn, error) {
-	return nil
-}
diff --git a/src/net/http/transport_default_other.go b/src/net/http/transport_default_other.go
index 8a2f1cc..4f6c5c1 100644
--- a/src/net/http/transport_default_other.go
+++ b/src/net/http/transport_default_other.go
@@ -2,8 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build !(js && wasm)
-// +build !js !wasm
+//go:build !wasm
 
 package http
 
diff --git a/src/net/http/transport_default_wasm.go b/src/net/http/transport_default_wasm.go
new file mode 100644
index 0000000..3946812
--- /dev/null
+++ b/src/net/http/transport_default_wasm.go
@@ -0,0 +1,16 @@
+// Copyright 2021 The Go 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:build (js && wasm) || wasip1
+
+package http
+
+import (
+	"context"
+	"net"
+)
+
+func defaultTransportDialContext(dialer *net.Dialer) func(context.Context, string, string) (net.Conn, error) {
+	return nil
+}
diff --git a/src/net/http/transport_test.go b/src/net/http/transport_test.go
index 245f73b..028fecc 100644
--- a/src/net/http/transport_test.go
+++ b/src/net/http/transport_test.go
@@ -125,6 +125,8 @@
 				continue
 			}
 			if i != 0 {
+				// TODO(bcmills): What is the Sleep here doing, and why is this
+				// Unlock/Sleep/Lock cycle needed at all?
 				tcs.mu.Unlock()
 				time.Sleep(50 * time.Millisecond)
 				tcs.mu.Lock()
@@ -249,7 +251,7 @@
 // an underlying TCP connection after making an http.Request with Request.Close set.
 //
 // It tests the behavior by making an HTTP request to a server which
-// describes the source source connection it got (remote port number +
+// describes the source connection it got (remote port number +
 // address of its net.Conn).
 func TestTransportConnectionCloseOnRequest(t *testing.T) {
 	run(t, testTransportConnectionCloseOnRequest, []testMode{http1Mode})
@@ -739,7 +741,7 @@
 	c := ts.Client()
 	tr := c.Transport.(*Transport)
 
-	doReq := func(name string) string {
+	doReq := func(name string) {
 		// Do a POST instead of a GET to prevent the Transport's
 		// idempotent request retry logic from kicking in...
 		res, err := c.Post(ts.URL, "", nil)
@@ -754,26 +756,27 @@
 		if err != nil {
 			t.Fatalf("%s: %v", name, err)
 		}
-		return string(slurp)
+		t.Logf("%s: ok (%q)", name, slurp)
 	}
 
-	first := doReq("first")
+	doReq("first")
 	keys1 := tr.IdleConnKeysForTesting()
 
 	ts.CloseClientConnections()
 
 	var keys2 []string
-	if !waitCondition(3*time.Second, 50*time.Millisecond, func() bool {
+	waitCondition(t, 10*time.Millisecond, func(d time.Duration) bool {
 		keys2 = tr.IdleConnKeysForTesting()
-		return len(keys2) == 0
-	}) {
-		t.Fatalf("Transport didn't notice idle connection's death.\nbefore: %q\n after: %q\n", keys1, keys2)
-	}
+		if len(keys2) != 0 {
+			if d > 0 {
+				t.Logf("Transport hasn't noticed idle connection's death in %v.\nbefore: %q\n after: %q\n", d, keys1, keys2)
+			}
+			return false
+		}
+		return true
+	})
 
-	second := doReq("second")
-	if first == second {
-		t.Errorf("expected a different connection between requests. got %q both times", first)
-	}
+	doReq("second")
 }
 
 // Test that the Transport notices when a server hangs up on its
@@ -863,7 +866,8 @@
 		numClients    = 20
 		reqsPerClient = 25
 	)
-	activityc := make(chan bool)
+	var wg sync.WaitGroup
+	wg.Add(numClients * reqsPerClient)
 	for i := 0; i < numClients; i++ {
 		go func() {
 			for i := 0; i < reqsPerClient; i++ {
@@ -877,22 +881,13 @@
 					// where we won the race.
 					res.Body.Close()
 				}
-				if !<-activityc { // Receives false when close(activityc) is executed
-					return
-				}
+				wg.Done()
 			}
 		}()
 	}
 
 	// Make sure all the request come back, one way or another.
-	for i := 0; i < numClients*reqsPerClient; i++ {
-		select {
-		case activityc <- true:
-		case <-time.After(5 * time.Second):
-			close(activityc)
-			t.Fatalf("presumed deadlock; no HTTP client activity seen in awhile")
-		}
-	}
+	wg.Wait()
 }
 
 // TestTransportHeadResponses verifies that we deal with Content-Lengths
@@ -1324,12 +1319,7 @@
 			if r.Header.Get(sentinelHeader) != sentinelValue {
 				t.Errorf("Failed to retrieve sentinel value")
 			}
-			var got string
-			select {
-			case got = <-ch:
-			case <-time.After(5 * time.Second):
-				t.Fatal("timeout connecting to socks5 proxy")
-			}
+			got := <-ch
 			ts.Close()
 			tsu, err := url.Parse(ts.URL)
 			if err != nil {
@@ -1420,12 +1410,7 @@
 			if _, err := c.Head(ts.URL); err != nil {
 				t.Error(err)
 			}
-			var got *Request
-			select {
-			case got = <-proxyCh:
-			case <-time.After(5 * time.Second):
-				t.Fatal("timeout connecting to http proxy")
-			}
+			got := <-proxyCh
 			c.Transport.(*Transport).CloseIdleConnections()
 			ts.Close()
 			proxy.Close()
@@ -2329,67 +2314,81 @@
 	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 := newClientServerTest(t, mode, mux).ts
 
-	c := ts.Client()
-	c.Transport.(*Transport).ResponseHeaderTimeout = 500 * time.Millisecond
+	timeout := 2 * time.Millisecond
+	retry := true
+	for retry && !t.Failed() {
+		var srvWG sync.WaitGroup
+		inHandler := make(chan bool, 1)
+		mux := NewServeMux()
+		mux.HandleFunc("/fast", func(w ResponseWriter, r *Request) {
+			inHandler <- true
+			srvWG.Done()
+		})
+		mux.HandleFunc("/slow", func(w ResponseWriter, r *Request) {
+			inHandler <- true
+			<-r.Context().Done()
+			srvWG.Done()
+		})
+		ts := newClientServerTest(t, mode, mux).ts
 
-	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 {
-		req, _ := NewRequest("GET", ts.URL+tt.path, nil)
-		req = req.WithT(t)
-		res, err := c.Do(req)
-		select {
-		case <-inHandler:
-		case <-time.After(5 * time.Second):
-			t.Errorf("never entered handler for test index %d, %s", i, tt.path)
-			continue
+		c := ts.Client()
+		c.Transport.(*Transport).ResponseHeaderTimeout = timeout
+
+		retry = false
+		srvWG.Add(3)
+		tests := []struct {
+			path        string
+			wantTimeout bool
+		}{
+			{path: "/fast"},
+			{path: "/slow", wantTimeout: true},
+			{path: "/fast"},
 		}
-		if err != nil {
-			uerr, ok := err.(*url.Error)
-			if !ok {
-				t.Errorf("error is not an url.Error; got: %#v", err)
+		for i, tt := range tests {
+			req, _ := NewRequest("GET", ts.URL+tt.path, nil)
+			req = req.WithT(t)
+			res, err := c.Do(req)
+			<-inHandler
+			if err != nil {
+				uerr, ok := err.(*url.Error)
+				if !ok {
+					t.Errorf("error is not a 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 !tt.wantTimeout {
+					if !retry {
+						// The timeout may be set too short. Retry with a longer one.
+						t.Logf("unexpected timeout for path %q after %v; retrying with longer timeout", tt.path, timeout)
+						timeout *= 2
+						retry = true
+					}
+				}
+				if !strings.Contains(err.Error(), "timeout awaiting response headers") {
+					t.Errorf("%d. unexpected error: %v", i, err)
+				}
 				continue
 			}
-			nerr, ok := uerr.Err.(net.Error)
-			if !ok {
-				t.Errorf("error does not satisfy net.Error interface; got: %#v", err)
+			if tt.wantTimeout {
+				t.Errorf(`no error for path %q; expected "timeout awaiting response headers"`, tt.path)
 				continue
 			}
-			if !nerr.Timeout() {
-				t.Errorf("want timeout error; got: %q", nerr)
-				continue
+			if res.StatusCode != 200 {
+				t.Errorf("%d for path %q status = %d; want 200", i, tt.path, res.StatusCode)
 			}
-			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)
-		}
+
+		srvWG.Wait()
+		ts.Close()
 	}
 }
 
@@ -2400,9 +2399,11 @@
 	if testing.Short() {
 		t.Skip("skipping test in -short mode")
 	}
+
+	const msg = "Hello"
 	unblockc := make(chan bool)
 	ts := newClientServerTest(t, mode, HandlerFunc(func(w ResponseWriter, r *Request) {
-		fmt.Fprintf(w, "Hello")
+		io.WriteString(w, msg)
 		w.(Flusher).Flush() // send headers and some body
 		<-unblockc
 	})).ts
@@ -2416,35 +2417,32 @@
 	if err != nil {
 		t.Fatal(err)
 	}
-	go func() {
-		time.Sleep(1 * time.Second)
-		tr.CancelRequest(req)
-	}()
-	t0 := time.Now()
-	body, err := io.ReadAll(res.Body)
-	d := time.Since(t0)
+	body := make([]byte, len(msg))
+	n, _ := io.ReadFull(res.Body, body)
+	if n != len(body) || !bytes.Equal(body, []byte(msg)) {
+		t.Errorf("Body = %q; want %q", body[:n], msg)
+	}
+	tr.CancelRequest(req)
 
+	tail, err := io.ReadAll(res.Body)
+	res.Body.Close()
 	if err != ExportErrRequestCanceled {
 		t.Errorf("Body.Read error = %v; want errRequestCanceled", err)
+	} else if len(tail) > 0 {
+		t.Errorf("Spurious bytes from Body.Read: %q", tail)
 	}
-	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-- {
+	waitCondition(t, 10*time.Millisecond, func(d time.Duration) bool {
 		n := tr.NumPendingRequestsForTesting()
-		if n == 0 {
-			break
+		if n > 0 {
+			if d > 0 {
+				t.Logf("pending requests = %d after %v (want 0)", n, d)
+			}
 		}
-		time.Sleep(100 * time.Millisecond)
-		if tries == 1 {
-			t.Errorf("pending requests = %d; want 0", n)
-		}
-	}
+		return true
+	})
 }
 
 func testTransportCancelRequestInDo(t *testing.T, mode testMode, body io.Reader) {
@@ -2466,18 +2464,20 @@
 		defer close(donec)
 		c.Do(req)
 	}()
-	start := time.Now()
-	timeout := 10 * time.Second
-	for time.Since(start) < timeout {
-		time.Sleep(100 * time.Millisecond)
+
+	unblockc <- true
+	waitCondition(t, 10*time.Millisecond, func(d time.Duration) bool {
 		tr.CancelRequest(req)
 		select {
 		case <-donec:
-			return
+			return true
 		default:
+			if d > 0 {
+				t.Logf("Do of canceled request has not returned after %v", d)
+			}
+			return false
 		}
-	}
-	t.Errorf("Do of canceled request has not returned after %v", timeout)
+	})
 }
 
 func TestTransportCancelRequestInDo(t *testing.T) {
@@ -2523,22 +2523,22 @@
 		gotres <- true
 	}()
 
-	select {
-	case inDial <- true:
-	case <-time.After(5 * time.Second):
-		close(inDial)
-		t.Fatal("timeout; never saw blocking dial")
-	}
+	inDial <- true
 
 	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())
+	if d, ok := t.Deadline(); ok {
+		// When the test's deadline is about to expire, log the pending events for
+		// better debugging.
+		timeout := time.Until(d) * 19 / 20 // Allow 5% for cleanup.
+		timer := time.AfterFunc(timeout, func() {
+			panic(fmt.Sprintf("hang in %s. events are: %s", t.Name(), logbuf.String()))
+		})
+		defer timer.Stop()
 	}
+	<-gotres
 
 	got := logbuf.String()
 	want := `dial: blocking
@@ -2555,9 +2555,11 @@
 	if testing.Short() {
 		t.Skip("skipping test in -short mode")
 	}
-	unblockc := make(chan bool)
+
+	const msg = "Hello"
+	unblockc := make(chan struct{})
 	ts := newClientServerTest(t, mode, HandlerFunc(func(w ResponseWriter, r *Request) {
-		fmt.Fprintf(w, "Hello")
+		io.WriteString(w, msg)
 		w.(Flusher).Flush() // send headers and some body
 		<-unblockc
 	})).ts
@@ -2567,42 +2569,39 @@
 	tr := c.Transport.(*Transport)
 
 	req, _ := NewRequest("GET", ts.URL, nil)
-	ch := make(chan struct{})
-	req.Cancel = ch
+	cancel := make(chan struct{})
+	req.Cancel = cancel
 
 	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 := io.ReadAll(res.Body)
-	d := time.Since(t0)
+	body := make([]byte, len(msg))
+	n, _ := io.ReadFull(res.Body, body)
+	if n != len(body) || !bytes.Equal(body, []byte(msg)) {
+		t.Errorf("Body = %q; want %q", body[:n], msg)
+	}
+	close(cancel)
 
+	tail, err := io.ReadAll(res.Body)
+	res.Body.Close()
 	if err != ExportErrRequestCanceled {
 		t.Errorf("Body.Read error = %v; want errRequestCanceled", err)
+	} else if len(tail) > 0 {
+		t.Errorf("Spurious bytes from Body.Read: %q", tail)
 	}
-	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-- {
+	waitCondition(t, 10*time.Millisecond, func(d time.Duration) bool {
 		n := tr.NumPendingRequestsForTesting()
-		if n == 0 {
-			break
+		if n > 0 {
+			if d > 0 {
+				t.Logf("pending requests = %d after %v (want 0)", n, d)
+			}
 		}
-		time.Sleep(100 * time.Millisecond)
-		if tries == 1 {
-			t.Errorf("pending requests = %d; want 0", n)
-		}
-	}
+		return true
+	})
 }
 
 func TestCancelRequestWithChannelBeforeDo_Cancel(t *testing.T) {
@@ -2731,25 +2730,13 @@
 	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")
+
+	if err := res.Body.Close(); err != nil {
+		t.Errorf("Close = %v", err)
 	}
-	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")
+
+	if err := <-writeErr; err == nil {
+		t.Errorf("expected non-nil write error")
 	}
 }
 
@@ -2827,13 +2814,21 @@
 	ts := newClientServerTest(t, mode, mux).ts
 
 	dialGate := make(chan bool, 1)
+	dialing := make(chan bool)
 	c := ts.Client()
 	c.Transport.(*Transport).Dial = func(n, addr string) (net.Conn, error) {
-		if <-dialGate {
-			return net.Dial(n, addr)
+		for {
+			select {
+			case ok := <-dialGate:
+				if !ok {
+					return nil, errors.New("manually closed")
+				}
+				return net.Dial(n, addr)
+			case dialing <- true:
+			}
 		}
-		return nil, errors.New("manually closed")
 	}
+	defer close(dialGate)
 
 	dialGate <- true // only allow one dial
 	fooRes, err := c.Get(ts.URL + "/foo")
@@ -2844,13 +2839,34 @@
 	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
+
+	fooDone := make(chan struct{})
+	go func() {
+		// We know that the foo Dial completed and reached the handler because we
+		// read its header. Wait for the bar request to block in Dial, then
+		// let the foo response finish so we can use its connection for /bar.
+
+		if mode == http2Mode {
+			// In HTTP/2 mode, the second Dial won't happen because the protocol
+			// multiplexes the streams by default. Just sleep for an arbitrary time;
+			// the test should pass regardless of how far the bar request gets by this
+			// point.
+			select {
+			case <-dialing:
+				t.Errorf("unexpected second Dial in HTTP/2 mode")
+			case <-time.After(10 * time.Millisecond):
+			}
+		} else {
+			<-dialing
+		}
 		fooGate <- true
 		io.Copy(io.Discard, fooRes.Body)
 		fooRes.Body.Close()
-	})
+		close(fooDone)
+	}()
+	defer func() {
+		<-fooDone
+	}()
 
 	barRes, err := c.Get(ts.URL + "/bar")
 	if err != nil {
@@ -2861,7 +2877,6 @@
 		t.Fatalf("/foo came from conn %q; /bar came from %q instead", fooAddr, barAddr)
 	}
 	barRes.Body.Close()
-	dialGate <- false
 }
 
 // Issue 2184
@@ -3271,42 +3286,33 @@
 		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?")
+	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)
 	}
 }
 
@@ -3396,9 +3402,13 @@
 // questionable state.
 // golang.org/issue/7569
 func TestTransportNoReuseAfterEarlyResponse(t *testing.T) {
-	run(t, testTransportNoReuseAfterEarlyResponse, []testMode{http1Mode})
+	run(t, testTransportNoReuseAfterEarlyResponse, []testMode{http1Mode}, testNotParallel)
 }
 func testTransportNoReuseAfterEarlyResponse(t *testing.T, mode testMode) {
+	defer func(d time.Duration) {
+		*MaxWriteWaitBeforeConnReuse = d
+	}(*MaxWriteWaitBeforeConnReuse)
+	*MaxWriteWaitBeforeConnReuse = 10 * time.Millisecond
 	var sconn struct {
 		sync.Mutex
 		c net.Conn
@@ -3439,24 +3449,15 @@
 	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 = c.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")
+
+	res, err = c.Get(ts.URL)
+	if err := wantBody(res, err, "bar"); err != nil {
+		t.Errorf("GET response: %v", err)
+		return
 	}
+	getOkay = true  // suppress test noise
+	finalBit <- 'x' // unblock the writeloop of the first Post
+	close(finalBit)
 }
 
 // Tests that we don't leak Transport persistConn.readLoop goroutines
@@ -3634,13 +3635,13 @@
 				req := tc.req()
 				res, err := c.Do(req)
 				if err != nil {
-					if time.Since(t0) < MaxWriteWaitBeforeConnReuse/2 {
+					if time.Since(t0) < *MaxWriteWaitBeforeConnReuse/2 {
 						mu.Lock()
 						got := logbuf.String()
 						mu.Unlock()
 						t.Fatalf("i=%d: Do = %v; log:\n%s", i, err, got)
 					}
-					t.Skipf("connection likely wasn't recycled within %d, interfering with actual test; skipping", MaxWriteWaitBeforeConnReuse)
+					t.Skipf("connection likely wasn't recycled within %d, interfering with actual test; skipping", *MaxWriteWaitBeforeConnReuse)
 				}
 				res.Body.Close()
 				if res.Request != req {
@@ -3700,13 +3701,8 @@
 	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")
+	if err := <-readBody; err == nil {
+		t.Errorf("Unexpected success reading request body from handler; want 'unexpected EOF reading trailer'")
 	}
 	select {
 	case <-didClose:
@@ -3893,7 +3889,7 @@
 }
 
 // Test for issue 34282
-// Ensure that getConn doesn't call the GotConn trace hook on a HTTP/2 idle conn
+// Ensure that getConn doesn't call the GotConn trace hook on an HTTP/2 idle conn
 func TestTransportTraceGotConnH2IdleConns(t *testing.T) {
 	tr := &Transport{}
 	wantIdle := func(when string, n int) bool {
@@ -3932,35 +3928,45 @@
 		t.Skip("skipping in short mode")
 	}
 
-	trFunc := func(tr *Transport) {
-		tr.MaxConnsPerHost = 1
-		tr.MaxIdleConnsPerHost = 1
-		tr.IdleConnTimeout = 10 * time.Millisecond
-	}
-	cst := newClientServerTest(t, mode, HandlerFunc(func(w ResponseWriter, r *Request) {}), trFunc)
-
-	if _, err := cst.c.Get(cst.ts.URL); err != nil {
-		t.Fatalf("got error: %s", err)
-	}
-
-	time.Sleep(100 * time.Millisecond)
-	got := make(chan error)
-	go func() {
-		if _, err := cst.c.Get(cst.ts.URL); err != nil {
-			got <- err
+	timeout := 1 * time.Millisecond
+	retry := true
+	for retry {
+		trFunc := func(tr *Transport) {
+			tr.MaxConnsPerHost = 1
+			tr.MaxIdleConnsPerHost = 1
+			tr.IdleConnTimeout = timeout
 		}
-		close(got)
-	}()
+		cst := newClientServerTest(t, mode, HandlerFunc(func(w ResponseWriter, r *Request) {}), trFunc)
 
-	timeout := time.NewTimer(5 * time.Second)
-	defer timeout.Stop()
-	select {
-	case err := <-got:
-		if err != nil {
+		retry = false
+		tooShort := func(err error) bool {
+			if err == nil || !strings.Contains(err.Error(), "use of closed network connection") {
+				return false
+			}
+			if !retry {
+				t.Helper()
+				t.Logf("idle conn timeout %v may be too short; retrying with longer", timeout)
+				timeout *= 2
+				retry = true
+				cst.close()
+			}
+			return true
+		}
+
+		if _, err := cst.c.Get(cst.ts.URL); err != nil {
+			if tooShort(err) {
+				continue
+			}
 			t.Fatalf("got error: %s", err)
 		}
-	case <-timeout.C:
-		t.Fatal("request never completed")
+
+		time.Sleep(10 * timeout)
+		if _, err := cst.c.Get(cst.ts.URL); err != nil {
+			if tooShort(err) {
+				continue
+			}
+			t.Fatalf("got error: %s", err)
+		}
 	}
 }
 
@@ -3970,9 +3976,13 @@
 // golang.org/issue/8923
 func TestTransportRangeAndGzip(t *testing.T) { run(t, testTransportRangeAndGzip) }
 func testTransportRangeAndGzip(t *testing.T, mode testMode) {
-	reqc := make(chan *Request, 1)
 	ts := newClientServerTest(t, mode, HandlerFunc(func(w ResponseWriter, r *Request) {
-		reqc <- r
+		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")
+		}
 	})).ts
 	c := ts.Client()
 
@@ -3982,18 +3992,6 @@
 	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()
 }
 
@@ -4092,6 +4090,45 @@
 	}
 }
 
+// https://go.dev/issue/49621
+func TestConnClosedBeforeRequestIsWritten(t *testing.T) {
+	run(t, testConnClosedBeforeRequestIsWritten, testNotParallel, []testMode{http1Mode})
+}
+func testConnClosedBeforeRequestIsWritten(t *testing.T, mode testMode) {
+	ts := newClientServerTest(t, mode, HandlerFunc(func(w ResponseWriter, r *Request) {}),
+		func(tr *Transport) {
+			tr.DialContext = func(_ context.Context, network, addr string) (net.Conn, error) {
+				// Connection immediately returns errors.
+				return &funcConn{
+					read: func([]byte) (int, error) {
+						return 0, errors.New("error")
+					},
+					write: func([]byte) (int, error) {
+						return 0, errors.New("error")
+					},
+				}, nil
+			}
+		},
+	).ts
+	// Set a short delay in RoundTrip to give the persistConn time to notice
+	// the connection is broken. We want to exercise the path where writeLoop exits
+	// before it reads the request to send. If this delay is too short, we may instead
+	// exercise the path where writeLoop accepts the request and then fails to write it.
+	// That's fine, so long as we get the desired path often enough.
+	SetEnterRoundTripHook(func() {
+		time.Sleep(1 * time.Millisecond)
+	})
+	defer SetEnterRoundTripHook(nil)
+	var closes int
+	_, err := ts.Client().Post(ts.URL, "text/plain", countCloseReader{&closes, strings.NewReader("hello")})
+	if err == nil {
+		t.Fatalf("expected request to fail, but it did not")
+	}
+	if closes != 1 {
+		t.Errorf("after RoundTrip, request body was closed %v times; want 1", closes)
+	}
+}
+
 // 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.
@@ -4208,15 +4245,26 @@
 		res.Body.Close()
 	}()
 
-	select {
-	case <-gotReq:
-		pw.Close()
-	case <-time.After(5 * time.Second):
-		t.Fatal("timeout waiting for handler to get request")
-	}
+	<-gotReq
+	pw.Close()
 	<-gotRes
 }
 
+type wgReadCloser struct {
+	io.Reader
+	wg     *sync.WaitGroup
+	closed bool
+}
+
+func (c *wgReadCloser) Close() error {
+	if c.closed {
+		return net.ErrClosed
+	}
+	c.closed = true
+	c.wg.Done()
+	return nil
+}
+
 // Issue 11745.
 func TestTransportPrefersResponseOverWriteError(t *testing.T) {
 	run(t, testTransportPrefersResponseOverWriteError)
@@ -4238,12 +4286,29 @@
 
 	fail := 0
 	count := 100
+
 	bigBody := strings.Repeat("a", contentLengthLimit*2)
+	var wg sync.WaitGroup
+	defer wg.Wait()
+	getBody := func() (io.ReadCloser, error) {
+		wg.Add(1)
+		body := &wgReadCloser{
+			Reader: strings.NewReader(bigBody),
+			wg:     &wg,
+		}
+		return body, nil
+	}
+
 	for i := 0; i < count; i++ {
-		req, err := NewRequest("PUT", ts.URL, strings.NewReader(bigBody))
+		reqBody, _ := getBody()
+		req, err := NewRequest("PUT", ts.URL, reqBody)
 		if err != nil {
+			reqBody.Close()
 			t.Fatal(err)
 		}
+		req.ContentLength = int64(len(bigBody))
+		req.GetBody = getBody
+
 		resp, err := c.Do(req)
 		if err != nil {
 			fail++
@@ -4566,11 +4631,7 @@
 			t.Error(err)
 		}
 		if !noHooks {
-			select {
-			case <-gotWroteReqEvent:
-			case <-time.After(5 * time.Second):
-				t.Error("timeout waiting for WroteRequest event")
-			}
+			<-gotWroteReqEvent
 		}
 		io.WriteString(w, resBody)
 	}), func(tr *Transport) {
@@ -4891,7 +4952,7 @@
 	}
 }
 
-// Test the httptrace.TLSHandshake{Start,Done} hooks with a https http1
+// Test the httptrace.TLSHandshake{Start,Done} hooks with an https http1
 // connections. The http2 test is done in TestTransportEventTrace_h2
 func TestTLSHandshakeTrace(t *testing.T) {
 	run(t, testTLSHandshakeTrace, []testMode{https1Mode, http2Mode})
@@ -4935,7 +4996,7 @@
 		t.Fatal("Expected TLSHandshakeStart to be called, but wasn't")
 	}
 	if !done {
-		t.Fatal("Expected TLSHandshakeDone to be called, but wasnt't")
+		t.Fatal("Expected TLSHandshakeDone to be called, but wasn't")
 	}
 }
 
@@ -4999,57 +5060,80 @@
 		t.Skip("skipping in short mode")
 	}
 
-	const timeout = 1 * time.Second
-
-	cst := newClientServerTest(t, mode, HandlerFunc(func(w ResponseWriter, r *Request) {
-		// No body for convenience.
-	}))
-	tr := cst.tr
-	tr.IdleConnTimeout = timeout
-	defer tr.CloseIdleConnections()
-	c := &Client{Transport: tr}
-
-	idleConns := func() []string {
-		if mode == http2Mode {
-			return tr.IdleConnStrsForTesting_h2()
-		} else {
-			return tr.IdleConnStrsForTesting()
-		}
-	}
-
-	var conn string
-	doReq := func(n int) {
-		req, _ := NewRequest("GET", cst.ts.URL, nil)
-		req = req.WithContext(httptrace.WithClientTrace(context.Background(), &httptrace.ClientTrace{
-			PutIdleConn: func(err error) {
-				if err != nil {
-					t.Errorf("failed to keep idle conn: %v", err)
-				}
-			},
+	timeout := 1 * time.Millisecond
+timeoutLoop:
+	for {
+		cst := newClientServerTest(t, mode, HandlerFunc(func(w ResponseWriter, r *Request) {
+			// No body for convenience.
 		}))
-		res, err := c.Do(req)
-		if err != nil {
-			t.Fatal(err)
+		tr := cst.tr
+		tr.IdleConnTimeout = timeout
+		defer tr.CloseIdleConnections()
+		c := &Client{Transport: tr}
+
+		idleConns := func() []string {
+			if mode == http2Mode {
+				return tr.IdleConnStrsForTesting_h2()
+			} else {
+				return tr.IdleConnStrsForTesting()
+			}
 		}
-		res.Body.Close()
-		conns := idleConns()
-		if len(conns) != 1 {
-			t.Fatalf("req %v: unexpected number of idle conns: %q", n, conns)
+
+		var conn string
+		doReq := func(n int) (timeoutOk bool) {
+			req, _ := NewRequest("GET", cst.ts.URL, nil)
+			req = req.WithContext(httptrace.WithClientTrace(context.Background(), &httptrace.ClientTrace{
+				PutIdleConn: func(err error) {
+					if err != nil {
+						t.Errorf("failed to keep idle conn: %v", err)
+					}
+				},
+			}))
+			res, err := c.Do(req)
+			if err != nil {
+				if strings.Contains(err.Error(), "use of closed network connection") {
+					t.Logf("req %v: connection closed prematurely", n)
+					return false
+				}
+			}
+			res.Body.Close()
+			conns := idleConns()
+			if len(conns) != 1 {
+				if len(conns) == 0 {
+					t.Logf("req %v: no idle conns", n)
+					return false
+				}
+				t.Fatalf("req %v: unexpected number of idle conns: %q", n, conns)
+			}
+			if conn == "" {
+				conn = conns[0]
+			}
+			if conn != conns[0] {
+				t.Logf("req %v: cached connection changed; expected the same one throughout the test", n)
+				return false
+			}
+			return true
 		}
-		if conn == "" {
-			conn = conns[0]
+		for i := 0; i < 3; i++ {
+			if !doReq(i) {
+				t.Logf("idle conn timeout %v appears to be too short; retrying with longer", timeout)
+				timeout *= 2
+				cst.close()
+				continue timeoutLoop
+			}
+			time.Sleep(timeout / 2)
 		}
-		if conn != conns[0] {
-			t.Fatalf("req %v: cached connection changed; expected the same one throughout the test", n)
-		}
-	}
-	for i := 0; i < 3; i++ {
-		doReq(i)
-		time.Sleep(timeout / 2)
-	}
-	time.Sleep(timeout * 3 / 2)
-	if got := idleConns(); len(got) != 0 {
-		t.Errorf("idle conns = %q; want none", got)
+
+		waitCondition(t, timeout/2, func(d time.Duration) bool {
+			if got := idleConns(); len(got) != 0 {
+				if d >= timeout*3/2 {
+					t.Logf("after %v, idle conns = %q", d, got)
+				}
+				return false
+			}
+			return true
+		})
+		break
 	}
 }
 
@@ -5095,13 +5179,9 @@
 
 		cancel()
 
-		failTimer := time.NewTimer(5 * time.Second)
-		defer failTimer.Stop()
 		select {
 		case <-sawDoErr:
 		case <-testDone:
-		case <-failTimer.C:
-			t.Error("timeout in DialTLS, waiting too long for cst.c.Do to fail")
 		}
 		return c, nil
 	}
@@ -5261,16 +5341,13 @@
 		res.Body.Close()
 		t.Errorf("unexpected success")
 	}
-	select {
-	case <-time.After(3 * time.Second):
-		t.Fatal("timeout")
-	case r := <-reqc:
-		if got, want := r.Header.Get("User-Agent"), "foo"; got != want {
-			t.Errorf("CONNECT request User-Agent = %q; want %q", got, want)
-		}
-		if got, want := r.Header.Get("Other"), "bar"; got != want {
-			t.Errorf("CONNECT request Other = %q; want %q", got, want)
-		}
+
+	r := <-reqc
+	if got, want := r.Header.Get("User-Agent"), "foo"; got != want {
+		t.Errorf("CONNECT request User-Agent = %q; want %q", got, want)
+	}
+	if got, want := r.Header.Get("Other"), "bar"; got != want {
+		t.Errorf("CONNECT request Other = %q; want %q", got, want)
 	}
 }
 
@@ -5313,16 +5390,13 @@
 		res.Body.Close()
 		t.Errorf("unexpected success")
 	}
-	select {
-	case <-time.After(3 * time.Second):
-		t.Fatal("timeout")
-	case r := <-reqc:
-		if got, want := r.Header.Get("User-Agent"), "foo2"; got != want {
-			t.Errorf("CONNECT request User-Agent = %q; want %q", got, want)
-		}
-		if got, want := r.Header.Get("Other"), "bar2"; got != want {
-			t.Errorf("CONNECT request Other = %q; want %q", got, want)
-		}
+
+	r := <-reqc
+	if got, want := r.Header.Get("User-Agent"), "foo2"; got != want {
+		t.Errorf("CONNECT request User-Agent = %q; want %q", got, want)
+	}
+	if got, want := r.Header.Get("Other"), "bar2"; got != want {
+		t.Errorf("CONNECT request Other = %q; want %q", got, want)
 	}
 }
 
@@ -5541,46 +5615,58 @@
 	run(t, testClientTimeoutKillsConn_BeforeHeaders, []testMode{http1Mode})
 }
 func testClientTimeoutKillsConn_BeforeHeaders(t *testing.T, mode testMode) {
-	inHandler := make(chan net.Conn, 1)
-	handlerReadReturned := make(chan bool, 1)
-	cst := newClientServerTest(t, mode, HandlerFunc(func(w ResponseWriter, r *Request) {
-		conn, _, err := w.(Hijacker).Hijack()
-		if err != nil {
-			t.Error(err)
-			return
+	timeout := 1 * time.Millisecond
+	for {
+		inHandler := make(chan bool)
+		cancelHandler := make(chan struct{})
+		handlerDone := make(chan bool)
+		cst := newClientServerTest(t, mode, HandlerFunc(func(w ResponseWriter, r *Request) {
+			<-r.Context().Done()
+
+			select {
+			case <-cancelHandler:
+				return
+			case inHandler <- true:
+			}
+			defer func() { handlerDone <- true }()
+
+			// Read from the conn until EOF to verify that it was correctly closed.
+			conn, _, err := w.(Hijacker).Hijack()
+			if err != nil {
+				t.Error(err)
+				return
+			}
+			n, err := conn.Read([]byte{0})
+			if n != 0 || err != io.EOF {
+				t.Errorf("unexpected Read result: %v, %v", n, err)
+			}
+			conn.Close()
+		}))
+
+		cst.c.Timeout = timeout
+
+		_, err := cst.c.Get(cst.ts.URL)
+		if err == nil {
+			close(cancelHandler)
+			t.Fatal("unexpected Get success")
 		}
-		inHandler <- conn
-		n, err := conn.Read([]byte{0})
-		if n != 0 || err != io.EOF {
-			t.Errorf("unexpected Read result: %v, %v", n, err)
-		}
-		handlerReadReturned <- true
-	}))
 
-	const timeout = 50 * time.Millisecond
-	cst.c.Timeout = timeout
-
-	_, err := cst.c.Get(cst.ts.URL)
-	if err == nil {
-		t.Fatal("unexpected Get succeess")
-	}
-
-	select {
-	case c := <-inHandler:
+		tooSlow := time.NewTimer(timeout * 10)
 		select {
-		case <-handlerReadReturned:
-			// Success.
-			return
-		case <-time.After(5 * time.Second):
-			t.Error("Handler's conn.Read seems to be stuck in Read")
-			c.Close() // close it to unblock Handler
+		case <-tooSlow.C:
+			// If we didn't get into the Handler, that probably means the builder was
+			// just slow and the Get failed in that time but never made it to the
+			// server. That's fine; we'll try again with a longer timeout.
+			t.Logf("no handler seen in %v; retrying with longer timeout", timeout)
+			close(cancelHandler)
+			cst.close()
+			timeout *= 2
+			continue
+		case <-inHandler:
+			tooSlow.Stop()
+			<-handlerDone
 		}
-	case <-time.After(timeout * 10):
-		// If we didn't get into the Handler in 50ms, that probably means
-		// the builder was just slow and the Get failed in that time
-		// but never made it to the server. That's fine. We'll usually
-		// test the part above on faster machines.
-		t.Skip("skipping test on slow builder")
+		break
 	}
 }
 
@@ -5593,18 +5679,27 @@
 	run(t, testClientTimeoutKillsConn_AfterHeaders, []testMode{http1Mode})
 }
 func testClientTimeoutKillsConn_AfterHeaders(t *testing.T, mode testMode) {
-	inHandler := make(chan net.Conn, 1)
-	handlerResult := make(chan error, 1)
+	inHandler := make(chan bool)
+	cancelHandler := make(chan struct{})
+	handlerDone := make(chan bool)
 	cst := newClientServerTest(t, mode, HandlerFunc(func(w ResponseWriter, r *Request) {
 		w.Header().Set("Content-Length", "100")
 		w.(Flusher).Flush()
+
+		select {
+		case <-cancelHandler:
+			return
+		case inHandler <- true:
+		}
+		defer func() { handlerDone <- true }()
+
 		conn, _, err := w.(Hijacker).Hijack()
 		if err != nil {
 			t.Error(err)
 			return
 		}
 		conn.Write([]byte("foo"))
-		inHandler <- conn
+
 		n, err := conn.Read([]byte{0})
 		// The error should be io.EOF or "read tcp
 		// 127.0.0.1:35827->127.0.0.1:40290: read: connection
@@ -5612,53 +5707,38 @@
 		// care that it returns at all. But if it returns with
 		// data, that's weird.
 		if n != 0 || err == nil {
-			handlerResult <- fmt.Errorf("unexpected Read result: %v, %v", n, err)
-			return
+			t.Errorf("unexpected Read result: %v, %v", n, err)
 		}
-		handlerResult <- nil
+		conn.Close()
 	}))
 
 	// Set Timeout to something very long but non-zero to exercise
 	// the codepaths that check for it. But rather than wait for it to fire
 	// (which would make the test slow), we send on the req.Cancel channel instead,
 	// which happens to exercise the same code paths.
-	cst.c.Timeout = time.Minute // just to be non-zero, not to hit it.
+	cst.c.Timeout = 24 * time.Hour // just to be non-zero, not to hit it.
 	req, _ := NewRequest("GET", cst.ts.URL, nil)
-	cancel := make(chan struct{})
-	req.Cancel = cancel
+	cancelReq := make(chan struct{})
+	req.Cancel = cancelReq
 
 	res, err := cst.c.Do(req)
 	if err != nil {
-		select {
-		case <-inHandler:
-			t.Fatalf("Get error: %v", err)
-		default:
-			// Failed before entering handler. Ignore result.
-			t.Skip("skipping test on slow builder")
-		}
+		close(cancelHandler)
+		t.Fatalf("Get error: %v", err)
 	}
 
-	close(cancel)
+	// Cancel the request while the handler is still blocked on sending to the
+	// inHandler channel. Then read it until it fails, to verify that the
+	// connection is broken before the handler itself closes it.
+	close(cancelReq)
 	got, err := io.ReadAll(res.Body)
 	if err == nil {
-		t.Fatalf("unexpected success; read %q, nil", got)
+		t.Errorf("unexpected success; read %q, nil", got)
 	}
 
-	select {
-	case c := <-inHandler:
-		select {
-		case err := <-handlerResult:
-			if err != nil {
-				t.Errorf("handler: %v", err)
-			}
-			return
-		case <-time.After(5 * time.Second):
-			t.Error("Handler's conn.Read seems to be stuck in Read")
-			c.Close() // close it to unblock Handler
-		}
-	case <-time.After(5 * time.Second):
-		t.Fatal("timeout")
-	}
+	// Now unblock the handler and wait for it to complete.
+	<-inHandler
+	<-handlerDone
 }
 
 func TestTransportResponseBodyWritableOnProtocolSwitch(t *testing.T) {
@@ -6093,17 +6173,18 @@
 		t.Fatalf("got %q; want ok", slurp)
 	}
 
-	t0 := time.Now()
-	for i := 0; i < 50; i++ {
-		time.Sleep(time.Duration(i) * 5 * time.Millisecond)
-		if cst.tr.IdleConnKeyCountForTesting() == 0 {
-			if got := logout.String(); got != "" {
-				t.Fatalf("expected no log output; got: %s", got)
+	waitCondition(t, 1*time.Millisecond, func(d time.Duration) bool {
+		if n := cst.tr.IdleConnKeyCountForTesting(); n != 0 {
+			if d > 0 {
+				t.Logf("%v idle conns still present after %v", n, d)
 			}
-			return
+			return false
 		}
+		return true
+	})
+	if got := logout.String(); got != "" {
+		t.Fatalf("expected no log output; got: %s", got)
 	}
-	t.Fatalf("timeout after %v waiting for Transport connections to die off", time.Since(t0))
 }
 
 func TestInvalidHeaderResponse(t *testing.T) {
@@ -6376,26 +6457,22 @@
 		Transport: tr,
 		Timeout:   time.Millisecond,
 	}
-	tr.RegisterProtocol("timeout", timeoutProto{})
-	_, err := c.Get("timeout://bar.com/path")
+	tr.RegisterProtocol("cancel", cancelProto{})
+	_, err := c.Get("cancel://bar.com/path")
 	if err == nil {
 		t.Error("request unexpectedly succeeded")
-	} else if !strings.Contains(err.Error(), timeoutProtoErr.Error()) {
-		t.Errorf("got error %q, does not contain expected string %q", err, timeoutProtoErr)
+	} else if !strings.Contains(err.Error(), errCancelProto.Error()) {
+		t.Errorf("got error %q, does not contain expected string %q", err, errCancelProto)
 	}
 }
 
-var timeoutProtoErr = errors.New("canceled as expected")
+var errCancelProto = errors.New("canceled as expected")
 
-type timeoutProto struct{}
+type cancelProto struct{}
 
-func (timeoutProto) RoundTrip(req *Request) (*Response, error) {
-	select {
-	case <-req.Cancel:
-		return nil, timeoutProtoErr
-	case <-time.After(5 * time.Second):
-		return nil, errors.New("request was not canceled")
-	}
+func (cancelProto) RoundTrip(req *Request) (*Response, error) {
+	<-req.Cancel
+	return nil, errCancelProto
 }
 
 type roundTripFunc func(r *Request) (*Response, error)
@@ -6654,3 +6731,22 @@
 	}
 	wg.Wait()
 }
+
+func TestRequestSanitization(t *testing.T) { run(t, testRequestSanitization) }
+func testRequestSanitization(t *testing.T, mode testMode) {
+	if mode == http2Mode {
+		// Remove this after updating x/net.
+		t.Skip("https://go.dev/issue/60374 test fails when run with HTTP/2")
+	}
+	ts := newClientServerTest(t, mode, HandlerFunc(func(rw ResponseWriter, req *Request) {
+		if h, ok := req.Header["X-Evil"]; ok {
+			t.Errorf("request has X-Evil header: %q", h)
+		}
+	})).ts
+	req, _ := NewRequest("GET", ts.URL, nil)
+	req.Host = "go.dev\r\nX-Evil:evil"
+	resp, _ := ts.Client().Do(req)
+	if resp != nil {
+		resp.Body.Close()
+	}
+}
diff --git a/src/net/http/triv.go b/src/net/http/triv.go
index 32edbbb..f614922 100644
--- a/src/net/http/triv.go
+++ b/src/net/http/triv.go
@@ -39,7 +39,7 @@
 func (ctr *Counter) String() string {
 	ctr.mu.Lock()
 	defer ctr.mu.Unlock()
-	return fmt.Sprintf("%d", ctr.n)
+	return strconv.Itoa(ctr.n)
 }
 
 func (ctr *Counter) ServeHTTP(w http.ResponseWriter, req *http.Request) {
diff --git a/src/net/interface_stub.go b/src/net/interface_stub.go
index 2d4475f..829dbc6 100644
--- a/src/net/interface_stub.go
+++ b/src/net/interface_stub.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build js && wasm
+//go:build (js && wasm) || wasip1
 
 package net
 
diff --git a/src/net/interface_test.go b/src/net/interface_test.go
index f6c9868..5590b06 100644
--- a/src/net/interface_test.go
+++ b/src/net/interface_test.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build !js
+//go:build !js && !wasip1
 
 package net
 
@@ -300,6 +300,7 @@
 }
 
 func BenchmarkInterfaces(b *testing.B) {
+	b.ReportAllocs()
 	testHookUninstaller.Do(uninstallTestHooks)
 
 	for i := 0; i < b.N; i++ {
@@ -310,6 +311,7 @@
 }
 
 func BenchmarkInterfaceByIndex(b *testing.B) {
+	b.ReportAllocs()
 	testHookUninstaller.Do(uninstallTestHooks)
 
 	ifi := loopbackInterface()
@@ -324,6 +326,7 @@
 }
 
 func BenchmarkInterfaceByName(b *testing.B) {
+	b.ReportAllocs()
 	testHookUninstaller.Do(uninstallTestHooks)
 
 	ifi := loopbackInterface()
@@ -338,6 +341,7 @@
 }
 
 func BenchmarkInterfaceAddrs(b *testing.B) {
+	b.ReportAllocs()
 	testHookUninstaller.Do(uninstallTestHooks)
 
 	for i := 0; i < b.N; i++ {
@@ -348,6 +352,7 @@
 }
 
 func BenchmarkInterfacesAndAddrs(b *testing.B) {
+	b.ReportAllocs()
 	testHookUninstaller.Do(uninstallTestHooks)
 
 	ifi := loopbackInterface()
@@ -362,6 +367,7 @@
 }
 
 func BenchmarkInterfacesAndMulticastAddrs(b *testing.B) {
+	b.ReportAllocs()
 	testHookUninstaller.Do(uninstallTestHooks)
 
 	ifi := loopbackInterface()
diff --git a/src/net/interface_unix_test.go b/src/net/interface_unix_test.go
index 92ec13a..b0a9bcf 100644
--- a/src/net/interface_unix_test.go
+++ b/src/net/interface_unix_test.go
@@ -193,6 +193,9 @@
 		t.Skipf("test requires external command: %v", err)
 	}
 	if err := ti.setup(); err != nil {
+		if e := err.Error(); strings.Contains(e, "Permission denied") {
+			t.Skipf("permission denied, skipping test: %v", e)
+		}
 		t.Fatal(err)
 	}
 	defer ti.teardown()
diff --git a/src/net/internal/socktest/main_test.go b/src/net/internal/socktest/main_test.go
index c7c8d16..0197feb 100644
--- a/src/net/internal/socktest/main_test.go
+++ b/src/net/internal/socktest/main_test.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build !js && !plan9
+//go:build !js && !plan9 && !wasip1
 
 package socktest_test
 
diff --git a/src/net/internal/socktest/main_unix_test.go b/src/net/internal/socktest/main_unix_test.go
index 7d21f6f..19ffb28 100644
--- a/src/net/internal/socktest/main_unix_test.go
+++ b/src/net/internal/socktest/main_unix_test.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build !js && !plan9 && !windows
+//go:build !js && !plan9 && !wasip1 && !windows
 
 package socktest_test
 
diff --git a/src/net/internal/socktest/switch_unix.go b/src/net/internal/socktest/switch_unix.go
index f2e95d6..ff92877 100644
--- a/src/net/internal/socktest/switch_unix.go
+++ b/src/net/internal/socktest/switch_unix.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build unix || (js && wasm)
+//go:build unix || (js && wasm) || wasip1
 
 package socktest
 
diff --git a/src/net/internal/socktest/sys_unix.go b/src/net/internal/socktest/sys_unix.go
index e1040d3..712462a 100644
--- a/src/net/internal/socktest/sys_unix.go
+++ b/src/net/internal/socktest/sys_unix.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build unix || (js && wasm)
+//go:build unix || (js && wasm) || wasip1
 
 package socktest
 
diff --git a/src/net/ip.go b/src/net/ip.go
index d9f3da7..d51ba10 100644
--- a/src/net/ip.go
+++ b/src/net/ip.go
@@ -15,6 +15,7 @@
 import (
 	"internal/bytealg"
 	"internal/itoa"
+	"net/netip"
 )
 
 // IP address lengths (bytes).
@@ -285,25 +286,6 @@
 	return out
 }
 
-// ubtoa encodes the string form of the integer v to dst[start:] and
-// returns the number of bytes written to dst. The caller must ensure
-// that dst has sufficient length.
-func ubtoa(dst []byte, start int, v byte) int {
-	if v < 10 {
-		dst[start] = v + '0'
-		return 1
-	} else if v < 100 {
-		dst[start+1] = v%10 + '0'
-		dst[start] = v/10 + '0'
-		return 2
-	}
-
-	dst[start+2] = v%10 + '0'
-	dst[start+1] = (v/10)%10 + '0'
-	dst[start] = v/100 + '0'
-	return 3
-}
-
 // String returns the string form of the IP address ip.
 // It returns one of 4 forms:
 //   - "<nil>", if ip has length 0
@@ -311,73 +293,18 @@
 //   - IPv6 conforming to RFC 5952 ("2001:db8::1"), if ip is a valid IPv6 address
 //   - the hexadecimal form of ip, without punctuation, if no other cases apply
 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 {
-		const maxIPv4StringLen = len("255.255.255.255")
-		b := make([]byte, maxIPv4StringLen)
-
-		n := ubtoa(b, 0, p4[0])
-		b[n] = '.'
-		n++
-
-		n += ubtoa(b, n, p4[1])
-		b[n] = '.'
-		n++
-
-		n += ubtoa(b, n, p4[2])
-		b[n] = '.'
-		n++
-
-		n += ubtoa(b, n, p4[3])
-		return string(b[:n])
-	}
-	if len(p) != IPv6len {
+	if len(ip) != IPv4len && len(ip) != IPv6len {
 		return "?" + hexString(ip)
 	}
-
-	// 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
-		}
+	// If IPv4, use dotted notation.
+	if p4 := ip.To4(); len(p4) == IPv4len {
+		return netip.AddrFrom4([4]byte(p4)).String()
 	}
-	// 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)
+	return netip.AddrFrom16([16]byte(ip)).String()
 }
 
 func hexString(b []byte) string {
@@ -559,175 +486,24 @@
 	return nn.String() + "/" + itoa.Uitoa(uint(l))
 }
 
-// Parse IPv4 address (d.d.d.d).
-func parseIPv4(s string) IP {
-	var p [IPv4len]byte
-	for i := 0; i < IPv4len; i++ {
-		if len(s) == 0 {
-			// Missing octets.
-			return nil
-		}
-		if i > 0 {
-			if s[0] != '.' {
-				return nil
-			}
-			s = s[1:]
-		}
-		n, c, ok := dtoi(s)
-		if !ok || n > 0xFF {
-			return nil
-		}
-		if c > 1 && s[0] == '0' {
-			// Reject non-zero components with leading zeroes.
-			return nil
-		}
-		s = s[c:]
-		p[i] = byte(n)
-	}
-	if len(s) != 0 {
-		return nil
-	}
-	return IPv4(p[0], p[1], p[2], p[3])
-}
-
-// parseIPv6Zone parses s as a literal IPv6 address and its associated zone
-// identifier which is described in RFC 4007.
-func parseIPv6Zone(s string) (IP, string) {
-	s, zone := splitHostZone(s)
-	return parseIPv6(s), zone
-}
-
-// parseIPv6 parses s as a literal IPv6 address described in RFC 4291
-// and RFC 5952.
-func parseIPv6(s string) (ip IP) {
-	ip = make(IP, IPv6len)
-	ellipsis := -1 // position of ellipsis in ip
-
-	// Might have leading ellipsis
-	if len(s) >= 2 && s[0] == ':' && s[1] == ':' {
-		ellipsis = 0
-		s = s[2:]
-		// Might be only ellipsis
-		if len(s) == 0 {
-			return ip
-		}
-	}
-
-	// Loop, parsing hex numbers followed by colon.
-	i := 0
-	for i < IPv6len {
-		// Hex number.
-		n, c, ok := xtoi(s)
-		if !ok || n > 0xFFFF {
-			return nil
-		}
-
-		// If followed by dot, might be in trailing IPv4.
-		if c < len(s) && s[c] == '.' {
-			if ellipsis < 0 && i != IPv6len-IPv4len {
-				// Not the right place.
-				return nil
-			}
-			if i+IPv4len > IPv6len {
-				// Not enough room.
-				return nil
-			}
-			ip4 := parseIPv4(s)
-			if ip4 == nil {
-				return nil
-			}
-			ip[i] = ip4[12]
-			ip[i+1] = ip4[13]
-			ip[i+2] = ip4[14]
-			ip[i+3] = ip4[15]
-			s = ""
-			i += IPv4len
-			break
-		}
-
-		// Save this 16-bit chunk.
-		ip[i] = byte(n >> 8)
-		ip[i+1] = byte(n)
-		i += 2
-
-		// Stop at end of string.
-		s = s[c:]
-		if len(s) == 0 {
-			break
-		}
-
-		// Otherwise must be followed by colon and more.
-		if s[0] != ':' || len(s) == 1 {
-			return nil
-		}
-		s = s[1:]
-
-		// Look for ellipsis.
-		if s[0] == ':' {
-			if ellipsis >= 0 { // already have one
-				return nil
-			}
-			ellipsis = i
-			s = s[1:]
-			if len(s) == 0 { // can be at end
-				break
-			}
-		}
-	}
-
-	// Must have used entire string.
-	if len(s) != 0 {
-		return nil
-	}
-
-	// If didn't parse enough, expand ellipsis.
-	if i < IPv6len {
-		if ellipsis < 0 {
-			return nil
-		}
-		n := IPv6len - i
-		for j := i - 1; j >= ellipsis; j-- {
-			ip[j+n] = ip[j]
-		}
-		for j := ellipsis + n - 1; j >= ellipsis; j-- {
-			ip[j] = 0
-		}
-	} else if ellipsis >= 0 {
-		// Ellipsis must represent at least one 0 group.
-		return nil
-	}
-	return ip
-}
-
 // ParseIP parses s as an IP address, returning the result.
 // The string s can be in IPv4 dotted decimal ("192.0.2.1"), IPv6
 // ("2001:db8::68"), or IPv4-mapped IPv6 ("::ffff:192.0.2.1") 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 ':':
-			return parseIPv6(s)
-		}
+	if addr, valid := parseIP(s); valid {
+		return IP(addr[:])
 	}
 	return nil
 }
 
-// parseIPZone parses s as an IP address, return it and its associated zone
-// identifier (IPv6 only).
-func parseIPZone(s string) (IP, string) {
-	for i := 0; i < len(s); i++ {
-		switch s[i] {
-		case '.':
-			return parseIPv4(s), ""
-		case ':':
-			return parseIPv6Zone(s)
-		}
+func parseIP(s string) ([16]byte, bool) {
+	ip, err := netip.ParseAddr(s)
+	if err != nil || ip.Zone() != "" {
+		return [16]byte{}, false
 	}
-	return nil, ""
+	return ip.As16(), true
 }
 
 // ParseCIDR parses s as a CIDR notation IP address and prefix length,
@@ -744,18 +520,19 @@
 		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)
-	}
-	n, i, ok := dtoi(mask)
-	if ip == nil || !ok || i != len(mask) || n < 0 || n > 8*iplen {
+
+	ipAddr, err := netip.ParseAddr(addr)
+	if err != nil || ipAddr.Zone() != "" {
 		return nil, nil, &ParseError{Type: "CIDR address", Text: s}
 	}
-	m := CIDRMask(n, 8*iplen)
-	return ip, &IPNet{IP: ip.Mask(m), Mask: m}, nil
+
+	n, i, ok := dtoi(mask)
+	if !ok || i != len(mask) || n < 0 || n > ipAddr.BitLen() {
+		return nil, nil, &ParseError{Type: "CIDR address", Text: s}
+	}
+	m := CIDRMask(n, ipAddr.BitLen())
+	addr16 := ipAddr.As16()
+	return IP(addr16[:]), &IPNet{IP: IP(addr16[:]).Mask(m), Mask: m}, nil
 }
 
 func copyIP(x IP) IP {
diff --git a/src/net/ip_test.go b/src/net/ip_test.go
index 8f1590c..1373059 100644
--- a/src/net/ip_test.go
+++ b/src/net/ip_test.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build !js
+//go:build !js && !wasip1
 
 package net
 
@@ -116,6 +116,22 @@
 	}
 }
 
+func BenchmarkParseIPValidIPv4(b *testing.B) {
+	testHookUninstaller.Do(uninstallTestHooks)
+
+	for i := 0; i < b.N; i++ {
+		ParseIP("192.0.2.1")
+	}
+}
+
+func BenchmarkParseIPValidIPv6(b *testing.B) {
+	testHookUninstaller.Do(uninstallTestHooks)
+
+	for i := 0; i < b.N; i++ {
+		ParseIP("2001:DB8::1")
+	}
+}
+
 // Issue 6339
 func TestMarshalEmptyIP(t *testing.T) {
 	for _, in := range [][]byte{nil, []byte("")} {
diff --git a/src/net/iprawsock_posix.go b/src/net/iprawsock_posix.go
index 7b4d239..59967eb 100644
--- a/src/net/iprawsock_posix.go
+++ b/src/net/iprawsock_posix.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build unix || (js && wasm) || windows
+//go:build unix || (js && wasm) || wasip1 || windows
 
 package net
 
diff --git a/src/net/iprawsock_test.go b/src/net/iprawsock_test.go
index ca5ab48..14c03a1 100644
--- a/src/net/iprawsock_test.go
+++ b/src/net/iprawsock_test.go
@@ -2,11 +2,12 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build !js
+//go:build !js && !wasip1
 
 package net
 
 import (
+	"internal/testenv"
 	"reflect"
 	"testing"
 )
@@ -94,7 +95,11 @@
 			continue
 		}
 		c, err := ListenIP(tt.net, tt.laddr)
-		if err != nil {
+		if testenv.SyscallIsNotSupported(err) {
+			// May be inside a container that disallows creating a socket.
+			t.Logf("skipping %s test: %v", tt.net, err)
+			continue
+		} else if err != nil {
 			t.Fatal(err)
 		}
 		defer c.Close()
@@ -105,13 +110,17 @@
 }
 
 func TestIPConnRemoteName(t *testing.T) {
-	if !testableNetwork("ip:tcp") {
-		t.Skip("ip:tcp test")
+	network := "ip:tcp"
+	if !testableNetwork(network) {
+		t.Skipf("skipping %s test", network)
 	}
 
 	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 {
+	c, err := DialIP(network, &IPAddr{IP: IPv4(127, 0, 0, 1)}, raddr)
+	if testenv.SyscallIsNotSupported(err) {
+		// May be inside a container that disallows creating a socket.
+		t.Skipf("skipping %s test: %v", network, err)
+	} else if err != nil {
 		t.Fatal(err)
 	}
 	defer c.Close()
diff --git a/src/net/ipsock_posix.go b/src/net/ipsock_posix.go
index 7fd676b..b0a00a6 100644
--- a/src/net/ipsock_posix.go
+++ b/src/net/ipsock_posix.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build unix || (js && wasm) || windows
+//go:build unix || (js && wasm) || wasip1 || windows
 
 package net
 
diff --git a/src/net/listen_test.go b/src/net/listen_test.go
index df3cadf..f0a8861 100644
--- a/src/net/listen_test.go
+++ b/src/net/listen_test.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build !js && !plan9
+//go:build !js && !plan9 && !wasip1
 
 package net
 
diff --git a/src/net/lookup.go b/src/net/lookup.go
index 0fd5d2b..a7133b5 100644
--- a/src/net/lookup.go
+++ b/src/net/lookup.go
@@ -181,11 +181,10 @@
 // It returns a slice of that host's addresses.
 func (r *Resolver) LookupHost(ctx context.Context, 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, IsNotFound: true}
 	}
-	if ip, _ := parseIPZone(host); ip != nil {
+	if _, err := netip.ParseAddr(host); err == nil {
 		return []string{host}, nil
 	}
 	return r.lookupHost(ctx, host)
@@ -294,12 +293,11 @@
 // It returns a slice of that host's IPv4 and IPv6 addresses.
 func (r *Resolver) lookupIPAddr(ctx context.Context, network, host string) ([]IPAddr, error) {
 	// Make sure that no matter what we do later, host=="" is rejected.
-	// parseIPZone, for example, does accept empty strings.
 	if host == "" {
 		return nil, &DNSError{Err: errNoSuchHost.Error(), Name: host, IsNotFound: true}
 	}
-	if ip, zone := parseIPZone(host); ip != nil {
-		return []IPAddr{{IP: ip, Zone: zone}}, nil
+	if ip, err := netip.ParseAddr(host); err == nil {
+		return []IPAddr{{IP: IP(ip.AsSlice()).To16(), Zone: ip.Zone()}}, nil
 	}
 	trace, _ := ctx.Value(nettrace.TraceKey{}).(*nettrace.Trace)
 	if trace != nil && trace.DNSStart != nil {
diff --git a/src/net/lookup_plan9.go b/src/net/lookup_plan9.go
index 1995742..5404b99 100644
--- a/src/net/lookup_plan9.go
+++ b/src/net/lookup_plan9.go
@@ -13,6 +13,11 @@
 	"os"
 )
 
+// cgoAvailable set to true to indicate that the cgo resolver
+// is available on Plan 9. Note that on Plan 9 the cgo resolver
+// does not actually use cgo.
+const cgoAvailable = true
+
 func query(ctx context.Context, filename, query string, bufSize int) (addrs []string, err error) {
 	queryAddrs := func() (addrs []string, err error) {
 		file, err := os.OpenFile(filename, os.O_RDWR, 0)
@@ -356,8 +361,8 @@
 }
 
 func (r *Resolver) lookupAddr(ctx context.Context, addr string) (name []string, err error) {
-	if _, conf, preferGo := r.preferGoOverPlan9WithOrderAndConf(); preferGo {
-		return r.goLookupPTR(ctx, addr, conf)
+	if order, conf, preferGo := r.preferGoOverPlan9WithOrderAndConf(); preferGo {
+		return r.goLookupPTR(ctx, addr, order, conf)
 	}
 	arpa, err := reverseaddr(addr)
 	if err != nil {
diff --git a/src/net/lookup_test.go b/src/net/lookup_test.go
index fa1a706..0689c19 100644
--- a/src/net/lookup_test.go
+++ b/src/net/lookup_test.go
@@ -2,12 +2,13 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build !js
+//go:build !js && !wasip1
 
 package net
 
 import (
 	"context"
+	"errors"
 	"fmt"
 	"internal/testenv"
 	"net/netip"
@@ -74,7 +75,7 @@
 	t.Parallel()
 	mustHaveExternalNetwork(t)
 
-	if iOS() {
+	if runtime.GOOS == "ios" {
 		t.Skip("no resolv.conf on iOS")
 	}
 
@@ -123,7 +124,7 @@
 	t.Parallel()
 	mustHaveExternalNetwork(t)
 
-	if iOS() {
+	if runtime.GOOS == "ios" {
 		t.Skip("no resolv.conf on iOS")
 	}
 
@@ -169,7 +170,7 @@
 	t.Parallel()
 	mustHaveExternalNetwork(t)
 
-	if iOS() {
+	if runtime.GOOS == "ios" {
 		t.Skip("no resolv.conf on iOS")
 	}
 
@@ -218,7 +219,7 @@
 	t.Parallel()
 	mustHaveExternalNetwork(t)
 
-	if iOS() {
+	if runtime.GOOS == "ios" {
 		t.Skip("no resolv.conf on iOS")
 	}
 
@@ -643,7 +644,7 @@
 		t.Skip("IPv4 is required")
 	}
 
-	if iOS() {
+	if runtime.GOOS == "ios" {
 		t.Skip("no resolv.conf on iOS")
 	}
 
@@ -791,7 +792,7 @@
 
 	switch runtime.GOOS {
 	case "android":
-		if netGo {
+		if netGoBuildTag {
 			t.Skipf("not supported on %s without cgo; see golang.org/issues/14576", runtime.GOOS)
 		}
 	default:
@@ -1028,10 +1029,10 @@
 // TestConcurrentPreferGoResolversDial tests that multiple resolvers with the
 // PreferGo option used concurrently are all dialed properly.
 func TestConcurrentPreferGoResolversDial(t *testing.T) {
-	// The windows and plan9 implementation of the resolver does not use
-	// the Dial function.
 	switch runtime.GOOS {
-	case "windows", "plan9":
+	case "plan9":
+		// TODO: plan9 implementation of the resolver uses the Dial function since
+		// https://go.dev/cl/409234, this test could probably be reenabled.
 		t.Skipf("skip on %v", runtime.GOOS)
 	}
 
@@ -1398,3 +1399,66 @@
 	checkErr(err2)
 	cancel()
 }
+
+func TestLookupNoData(t *testing.T) {
+	if runtime.GOOS == "plan9" {
+		t.Skip("not supported on plan9")
+	}
+
+	mustHaveExternalNetwork(t)
+
+	testLookupNoData(t, "default resolver")
+
+	func() {
+		defer forceGoDNS()()
+		testLookupNoData(t, "forced go resolver")
+	}()
+
+	func() {
+		defer forceCgoDNS()()
+		testLookupNoData(t, "forced cgo resolver")
+	}()
+}
+
+func testLookupNoData(t *testing.T, prefix string) {
+	attempts := 0
+	for {
+		// Domain that doesn't have any A/AAAA RRs, but has different one (in this case a TXT),
+		// so that it returns an empty response without any error codes (NXDOMAIN).
+		_, err := LookupHost("golang.rsc.io.")
+		if err == nil {
+			t.Errorf("%v: unexpected success", prefix)
+			return
+		}
+
+		var dnsErr *DNSError
+		if errors.As(err, &dnsErr) {
+			succeeded := true
+			if !dnsErr.IsNotFound {
+				succeeded = false
+				t.Logf("%v: IsNotFound is set to false", prefix)
+			}
+
+			if dnsErr.Err != errNoSuchHost.Error() {
+				succeeded = false
+				t.Logf("%v: error message is not equal to: %v", prefix, errNoSuchHost.Error())
+			}
+
+			if succeeded {
+				return
+			}
+		}
+
+		testenv.SkipFlakyNet(t)
+		if attempts < len(backoffDuration) {
+			dur := backoffDuration[attempts]
+			t.Logf("%v: backoff %v after failure %v\n", prefix, dur, err)
+			time.Sleep(dur)
+			attempts++
+			continue
+		}
+
+		t.Errorf("%v: unexpected error: %v", prefix, err)
+		return
+	}
+}
diff --git a/src/net/lookup_unix.go b/src/net/lookup_unix.go
index 600e694..56ae11e 100644
--- a/src/net/lookup_unix.go
+++ b/src/net/lookup_unix.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build unix
+//go:build unix || wasip1
 
 package net
 
@@ -55,12 +55,8 @@
 
 func (r *Resolver) lookupHost(ctx context.Context, host string) (addrs []string, err error) {
 	order, conf := systemConf().hostLookupOrder(r, host)
-	if !r.preferGo() && order == hostLookupCgo {
-		if addrs, err, ok := cgoLookupHost(ctx, host); ok {
-			return addrs, err
-		}
-		// cgo not available (or netgo); fall back to Go's DNS resolver
-		order = hostLookupFilesDNS
+	if order == hostLookupCgo {
+		return cgoLookupHost(ctx, host)
 	}
 	return r.goLookupHostOrder(ctx, host, order, conf)
 }
@@ -71,35 +67,32 @@
 	}
 	order, conf := systemConf().hostLookupOrder(r, host)
 	if order == hostLookupCgo {
-		if addrs, err, ok := cgoLookupIP(ctx, network, host); ok {
-			return addrs, err
-		}
-		// cgo not available (or netgo); fall back to Go's DNS resolver
-		order = hostLookupFilesDNS
+		return cgoLookupIP(ctx, network, host)
 	}
 	ips, _, err := r.goLookupIPCNAMEOrder(ctx, network, host, order, conf)
 	return ips, err
 }
 
 func (r *Resolver) lookupPort(ctx context.Context, network, service string) (int, error) {
-	if !r.preferGo() && systemConf().canUseCgo() {
-		if port, err, ok := cgoLookupPort(ctx, network, service); ok {
-			if err != nil {
-				// Issue 18213: if cgo fails, first check to see whether we
-				// have the answer baked-in to the net package.
-				if port, err := goLookupPort(network, service); err == nil {
-					return port, nil
-				}
+	// Port lookup is not a DNS operation.
+	// Prefer the cgo resolver if possible.
+	if !systemConf().mustUseGoResolver(r) {
+		port, err := cgoLookupPort(ctx, network, service)
+		if err != nil {
+			// Issue 18213: if cgo fails, first check to see whether we
+			// have the answer baked-in to the net package.
+			if port, err := goLookupPort(network, service); err == nil {
+				return port, nil
 			}
-			return port, err
 		}
+		return port, err
 	}
 	return goLookupPort(network, service)
 }
 
 func (r *Resolver) lookupCNAME(ctx context.Context, name string) (string, error) {
 	order, conf := systemConf().hostLookupOrder(r, name)
-	if !r.preferGo() && order == hostLookupCgo {
+	if order == hostLookupCgo {
 		if cname, err, ok := cgoLookupCNAME(ctx, name); ok {
 			return cname, err
 		}
@@ -124,13 +117,11 @@
 }
 
 func (r *Resolver) lookupAddr(ctx context.Context, addr string) ([]string, error) {
-	order, conf := systemConf().hostLookupOrder(r, "")
-	if !r.preferGo() && order == hostLookupCgo {
-		if ptrs, err, ok := cgoLookupPTR(ctx, addr); ok {
-			return ptrs, err
-		}
+	order, conf := systemConf().addrLookupOrder(r, addr)
+	if order == hostLookupCgo {
+		return cgoLookupPTR(ctx, addr)
 	}
-	return r.goLookupPTR(ctx, addr, conf)
+	return r.goLookupPTR(ctx, addr, order, conf)
 }
 
 // concurrentThreadsLimit returns the number of threads we permit to
@@ -148,11 +139,11 @@
 	if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &rlim); err != nil {
 		return 500
 	}
-	r := int(rlim.Cur)
+	r := rlim.Cur
 	if r > 500 {
 		r = 500
 	} else if r > 30 {
 		r -= 30
 	}
-	return r
+	return int(r)
 }
diff --git a/src/net/lookup_windows.go b/src/net/lookup_windows.go
index 4ee7281..33d5ac5 100644
--- a/src/net/lookup_windows.go
+++ b/src/net/lookup_windows.go
@@ -10,10 +10,19 @@
 	"os"
 	"runtime"
 	"syscall"
+	"time"
 	"unsafe"
 )
 
-const _WSAHOST_NOT_FOUND = syscall.Errno(11001)
+// cgoAvailable set to true to indicate that the cgo resolver
+// is available on Windows. Note that on Windows the cgo resolver
+// does not actually use cgo.
+const cgoAvailable = true
+
+const (
+	_WSAHOST_NOT_FOUND = syscall.Errno(11001)
+	_WSATRY_AGAIN      = syscall.Errno(11002)
+)
 
 func winError(call string, err error) error {
 	switch err {
@@ -118,7 +127,17 @@
 		if err != nil {
 			return nil, &DNSError{Name: name, Err: err.Error()}
 		}
-		e := syscall.GetAddrInfoW(name16p, nil, &hints, &result)
+
+		dnsConf := getSystemDNSConfig()
+		start := time.Now()
+
+		var e error
+		for i := 0; i < dnsConf.attempts; i++ {
+			e = syscall.GetAddrInfoW(name16p, nil, &hints, &result)
+			if e == nil || e != _WSATRY_AGAIN || time.Since(start) > dnsConf.timeout {
+				break
+			}
+		}
 		if e != nil {
 			err := winError("getaddrinfow", e)
 			dnsError := &DNSError{Err: err.Error(), Name: name}
@@ -355,8 +374,8 @@
 }
 
 func (r *Resolver) lookupAddr(ctx context.Context, addr string) ([]string, error) {
-	if r.preferGoOverWindows() {
-		return r.goLookupPTR(ctx, addr, nil)
+	if order, conf := systemConf().hostLookupOrder(r, ""); order != hostLookupCgo {
+		return r.goLookupPTR(ctx, addr, order, conf)
 	}
 
 	// TODO(bradfitz): finish ctx plumbing. Nothing currently depends on this.
diff --git a/src/net/mail/message.go b/src/net/mail/message.go
index 6268c08..af516fc 100644
--- a/src/net/mail/message.go
+++ b/src/net/mail/message.go
@@ -14,6 +14,7 @@
     such as breaking addresses across lines.
   - No unicode normalization is performed.
   - The special characters ()[]:;@\, are allowed to appear unquoted in names.
+  - A leading From line is permitted, as in mbox format (RFC 4155).
 */
 package mail
 
@@ -53,8 +54,8 @@
 func ReadMessage(r io.Reader) (msg *Message, err error) {
 	tp := textproto.NewReader(bufio.NewReader(r))
 
-	hdr, err := tp.ReadMIMEHeader()
-	if err != nil {
+	hdr, err := readHeader(tp)
+	if err != nil && (err != io.EOF || len(hdr) == 0) {
 		return nil, err
 	}
 
@@ -64,6 +65,54 @@
 	}, nil
 }
 
+// readHeader reads the message headers from r.
+// This is like textproto.ReadMIMEHeader, but doesn't validate.
+// The fix for issue #53188 tightened up net/textproto to enforce
+// restrictions of RFC 7230.
+// This package implements RFC 5322, which does not have those restrictions.
+// This function copies the relevant code from net/textproto,
+// simplified for RFC 5322.
+func readHeader(r *textproto.Reader) (map[string][]string, error) {
+	m := make(map[string][]string)
+
+	// The first line cannot start with a leading space.
+	if buf, err := r.R.Peek(1); err == nil && (buf[0] == ' ' || buf[0] == '\t') {
+		line, err := r.ReadLine()
+		if err != nil {
+			return m, err
+		}
+		return m, errors.New("malformed initial line: " + line)
+	}
+
+	for {
+		kv, err := r.ReadContinuedLine()
+		if kv == "" {
+			return m, err
+		}
+
+		// Key ends at first colon.
+		k, v, ok := strings.Cut(kv, ":")
+		if !ok {
+			return m, errors.New("malformed header line: " + kv)
+		}
+		key := textproto.CanonicalMIMEHeaderKey(k)
+
+		// Permit empty key, because that is what we did in the past.
+		if key == "" {
+			continue
+		}
+
+		// Skip initial spaces in value.
+		value := strings.TrimLeft(v, " \t")
+
+		m[key] = append(m[key], value)
+
+		if err != nil {
+			return m, err
+		}
+	}
+}
+
 // Layouts suitable for passing to time.Parse.
 // These are tried in order.
 var (
diff --git a/src/net/mail/message_test.go b/src/net/mail/message_test.go
index 61e50cc..1e1bb40 100644
--- a/src/net/mail/message_test.go
+++ b/src/net/mail/message_test.go
@@ -39,6 +39,47 @@
 		},
 		body: "This is a message just to say hello.\nSo, \"Hello\".\n",
 	},
+	{
+		// RFC 5965, Appendix B.1, a part of the multipart message (a header-only sub message)
+		in: `Feedback-Type: abuse
+User-Agent: SomeGenerator/1.0
+Version: 1
+`,
+		header: Header{
+			"Feedback-Type": []string{"abuse"},
+			"User-Agent":    []string{"SomeGenerator/1.0"},
+			"Version":       []string{"1"},
+		},
+		body: "",
+	},
+	{
+		// RFC 5322 permits any printable ASCII character,
+		// except colon, in a header key. Issue #58862.
+		in: `From: iant@golang.org
+Custom/Header: v
+
+Body
+`,
+		header: Header{
+			"From":          []string{"iant@golang.org"},
+			"Custom/Header": []string{"v"},
+		},
+		body: "Body\n",
+	},
+	{
+		// RFC 4155 mbox format. We've historically permitted this,
+		// so we continue to permit it. Issue #60332.
+		in: `From iant@golang.org Mon Jun 19 00:00:00 2023
+From: iant@golang.org
+
+Hello, gophers!
+`,
+		header: Header{
+			"From":                               []string{"iant@golang.org"},
+			"From iant@golang.org Mon Jun 19 00": []string{"00:00 2023"},
+		},
+		body: "Hello, gophers!\n",
+	},
 }
 
 func TestParsing(t *testing.T) {
diff --git a/src/net/main_conf_test.go b/src/net/main_conf_test.go
index 41b78ed..28a1cb8 100644
--- a/src/net/main_conf_test.go
+++ b/src/net/main_conf_test.go
@@ -2,10 +2,12 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build !js && !plan9 && !windows
+//go:build !js && !plan9 && !wasip1
 
 package net
 
+import "testing"
+
 // forceGoDNS forces the resolver configuration to use the pure Go resolver
 // and returns a fixup function to restore the old settings.
 func forceGoDNS() func() {
@@ -36,3 +38,22 @@
 	c.netCgo = true
 	return fixup
 }
+
+func TestForceCgoDNS(t *testing.T) {
+	if !cgoAvailable {
+		t.Skip("cgo resolver not available")
+	}
+	defer forceCgoDNS()()
+	order, _ := systemConf().hostLookupOrder(nil, "go.dev")
+	if order != hostLookupCgo {
+		t.Fatalf("hostLookupOrder returned: %v, want cgo", order)
+	}
+}
+
+func TestForceGoDNS(t *testing.T) {
+	defer forceGoDNS()()
+	order, _ := systemConf().hostLookupOrder(nil, "go.dev")
+	if order == hostLookupCgo {
+		t.Fatalf("hostLookupOrder returned: %v, want go resolver order", order)
+	}
+}
diff --git a/src/net/main_noconf_test.go b/src/net/main_noconf_test.go
index ab050fa..077a36e 100644
--- a/src/net/main_noconf_test.go
+++ b/src/net/main_noconf_test.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build (js && wasm) || plan9 || windows
+//go:build (js && wasm) || plan9 || wasip1
 
 package net
 
@@ -11,7 +11,7 @@
 // See main_conf_test.go for what these (don't) do.
 func forceGoDNS() func() {
 	switch runtime.GOOS {
-	case "plan9", "windows":
+	case "plan9":
 		return func() {}
 	default:
 		return nil
diff --git a/src/net/main_posix_test.go b/src/net/main_posix_test.go
index 8899aa9..a7942ee 100644
--- a/src/net/main_posix_test.go
+++ b/src/net/main_posix_test.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build !js && !plan9
+//go:build !js && !plan9 && !wasip1
 
 package net
 
diff --git a/src/net/main_test.go b/src/net/main_test.go
index 1ee8c2e..9fd5c88 100644
--- a/src/net/main_test.go
+++ b/src/net/main_test.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build !js
+//go:build !js && !wasip1
 
 package net
 
diff --git a/src/net/mockserver_test.go b/src/net/mockserver_test.go
index 61c1753..f86dd66 100644
--- a/src/net/mockserver_test.go
+++ b/src/net/mockserver_test.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build !js
+//go:build !js && !wasip1
 
 package net
 
diff --git a/src/net/mptcpsock_linux.go b/src/net/mptcpsock_linux.go
new file mode 100644
index 0000000..b2ac3ee
--- /dev/null
+++ b/src/net/mptcpsock_linux.go
@@ -0,0 +1,127 @@
+// Copyright 2023 The Go Authors. 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 (
+	"context"
+	"errors"
+	"internal/poll"
+	"internal/syscall/unix"
+	"sync"
+	"syscall"
+)
+
+var (
+	mptcpOnce      sync.Once
+	mptcpAvailable bool
+	hasSOLMPTCP    bool
+)
+
+// These constants aren't in the syscall package, which is frozen
+const (
+	_IPPROTO_MPTCP = 0x106
+	_SOL_MPTCP     = 0x11c
+	_MPTCP_INFO    = 0x1
+)
+
+func supportsMultipathTCP() bool {
+	mptcpOnce.Do(initMPTCPavailable)
+	return mptcpAvailable
+}
+
+// Check that MPTCP is supported by attempting to create an MPTCP socket and by
+// looking at the returned error if any.
+func initMPTCPavailable() {
+	s, err := sysSocket(syscall.AF_INET, syscall.SOCK_STREAM, _IPPROTO_MPTCP)
+	switch {
+	case errors.Is(err, syscall.EPROTONOSUPPORT): // Not supported: >= v5.6
+	case errors.Is(err, syscall.EINVAL): // Not supported: < v5.6
+	case err == nil: // Supported and no error
+		poll.CloseFunc(s)
+		fallthrough
+	default:
+		// another error: MPTCP was not available but it might be later
+		mptcpAvailable = true
+	}
+
+	major, minor := unix.KernelVersion()
+	// SOL_MPTCP only supported from kernel 5.16
+	hasSOLMPTCP = major > 5 || (major == 5 && minor >= 16)
+}
+
+func (sd *sysDialer) dialMPTCP(ctx context.Context, laddr, raddr *TCPAddr) (*TCPConn, error) {
+	if supportsMultipathTCP() {
+		if conn, err := sd.doDialTCPProto(ctx, laddr, raddr, _IPPROTO_MPTCP); err == nil {
+			return conn, nil
+		}
+	}
+
+	// Fallback to dialTCP if Multipath TCP isn't supported on this operating
+	// system. But also fallback in case of any error with MPTCP.
+	//
+	// Possible MPTCP specific error: ENOPROTOOPT (sysctl net.mptcp.enabled=0)
+	// But just in case MPTCP is blocked differently (SELinux, etc.), just
+	// retry with "plain" TCP.
+	return sd.dialTCP(ctx, laddr, raddr)
+}
+
+func (sl *sysListener) listenMPTCP(ctx context.Context, laddr *TCPAddr) (*TCPListener, error) {
+	if supportsMultipathTCP() {
+		if dial, err := sl.listenTCPProto(ctx, laddr, _IPPROTO_MPTCP); err == nil {
+			return dial, nil
+		}
+	}
+
+	// Fallback to listenTCP if Multipath TCP isn't supported on this operating
+	// system. But also fallback in case of any error with MPTCP.
+	//
+	// Possible MPTCP specific error: ENOPROTOOPT (sysctl net.mptcp.enabled=0)
+	// But just in case MPTCP is blocked differently (SELinux, etc.), just
+	// retry with "plain" TCP.
+	return sl.listenTCP(ctx, laddr)
+}
+
+// hasFallenBack reports whether the MPTCP connection has fallen back to "plain"
+// TCP.
+//
+// A connection can fallback to TCP for different reasons, e.g. the other peer
+// doesn't support it, a middle box "accidentally" drops the option, etc.
+//
+// If the MPTCP protocol has not been requested when creating the socket, this
+// method will return true: MPTCP is not being used.
+//
+// Kernel >= 5.16 returns EOPNOTSUPP/ENOPROTOOPT in case of fallback.
+// Older kernels will always return them even if MPTCP is used: not usable.
+func hasFallenBack(fd *netFD) bool {
+	_, err := fd.pfd.GetsockoptInt(_SOL_MPTCP, _MPTCP_INFO)
+
+	// 2 expected errors in case of fallback depending on the address family
+	//   - AF_INET:  EOPNOTSUPP
+	//   - AF_INET6: ENOPROTOOPT
+	return err == syscall.EOPNOTSUPP || err == syscall.ENOPROTOOPT
+}
+
+// isUsingMPTCPProto reports whether the socket protocol is MPTCP.
+//
+// Compared to hasFallenBack method, here only the socket protocol being used is
+// checked: it can be MPTCP but it doesn't mean MPTCP is used on the wire, maybe
+// a fallback to TCP has been done.
+func isUsingMPTCPProto(fd *netFD) bool {
+	proto, _ := fd.pfd.GetsockoptInt(syscall.SOL_SOCKET, syscall.SO_PROTOCOL)
+
+	return proto == _IPPROTO_MPTCP
+}
+
+// isUsingMultipathTCP reports whether MPTCP is still being used.
+//
+// Please look at the description of hasFallenBack (kernel >=5.16) and
+// isUsingMPTCPProto methods for more details about what is being checked here.
+func isUsingMultipathTCP(fd *netFD) bool {
+	if hasSOLMPTCP {
+		return !hasFallenBack(fd)
+	}
+
+	return isUsingMPTCPProto(fd)
+}
diff --git a/src/net/mptcpsock_linux_test.go b/src/net/mptcpsock_linux_test.go
new file mode 100644
index 0000000..5134aba
--- /dev/null
+++ b/src/net/mptcpsock_linux_test.go
@@ -0,0 +1,192 @@
+// Copyright 2023 The Go Authors. 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"
+	"context"
+	"errors"
+	"syscall"
+	"testing"
+)
+
+func newLocalListenerMPTCP(t *testing.T, envVar bool) Listener {
+	lc := &ListenConfig{}
+
+	if envVar {
+		if !lc.MultipathTCP() {
+			t.Fatal("MultipathTCP Listen is not on despite GODEBUG=multipathtcp=1")
+		}
+	} else {
+		if lc.MultipathTCP() {
+			t.Error("MultipathTCP should be off by default")
+		}
+
+		lc.SetMultipathTCP(true)
+		if !lc.MultipathTCP() {
+			t.Fatal("MultipathTCP is not on after having been forced to on")
+		}
+	}
+
+	ln, err := lc.Listen(context.Background(), "tcp", "127.0.0.1:0")
+	if err != nil {
+		t.Fatal(err)
+	}
+	return ln
+}
+
+func postAcceptMPTCP(ls *localServer, ch chan<- error) {
+	defer close(ch)
+
+	if len(ls.cl) == 0 {
+		ch <- errors.New("no accepted stream")
+		return
+	}
+
+	c := ls.cl[0]
+
+	tcp, ok := c.(*TCPConn)
+	if !ok {
+		ch <- errors.New("struct is not a TCPConn")
+		return
+	}
+
+	mptcp, err := tcp.MultipathTCP()
+	if err != nil {
+		ch <- err
+		return
+	}
+
+	if !mptcp {
+		ch <- errors.New("incoming connection is not with MPTCP")
+		return
+	}
+
+	// Also check the method for the older kernels if not tested before
+	if hasSOLMPTCP && !isUsingMPTCPProto(tcp.fd) {
+		ch <- errors.New("incoming connection is not an MPTCP proto")
+		return
+	}
+}
+
+func dialerMPTCP(t *testing.T, addr string, envVar bool) {
+	d := &Dialer{}
+
+	if envVar {
+		if !d.MultipathTCP() {
+			t.Fatal("MultipathTCP Dialer is not on despite GODEBUG=multipathtcp=1")
+		}
+	} else {
+		if d.MultipathTCP() {
+			t.Error("MultipathTCP should be off by default")
+		}
+
+		d.SetMultipathTCP(true)
+		if !d.MultipathTCP() {
+			t.Fatal("MultipathTCP is not on after having been forced to on")
+		}
+	}
+
+	c, err := d.Dial("tcp", addr)
+	if err != nil {
+		t.Fatal(err)
+	}
+	defer c.Close()
+
+	tcp, ok := c.(*TCPConn)
+	if !ok {
+		t.Fatal("struct is not a TCPConn")
+	}
+
+	// Transfer a bit of data to make sure everything is still OK
+	snt := []byte("MPTCP TEST")
+	if _, err := c.Write(snt); err != nil {
+		t.Fatal(err)
+	}
+	b := make([]byte, len(snt))
+	if _, err := c.Read(b); err != nil {
+		t.Fatal(err)
+	}
+	if !bytes.Equal(snt, b) {
+		t.Errorf("sent bytes (%s) are different from received ones (%s)", snt, b)
+	}
+
+	mptcp, err := tcp.MultipathTCP()
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	t.Logf("outgoing connection from %s with mptcp: %t", addr, mptcp)
+
+	if !mptcp {
+		t.Error("outgoing connection is not with MPTCP")
+	}
+
+	// Also check the method for the older kernels if not tested before
+	if hasSOLMPTCP && !isUsingMPTCPProto(tcp.fd) {
+		t.Error("outgoing connection is not an MPTCP proto")
+	}
+}
+
+func canCreateMPTCPSocket() bool {
+	// We want to know if we can create an MPTCP socket, not just if it is
+	// available (mptcpAvailable()): it could be blocked by the admin
+	fd, err := syscall.Socket(syscall.AF_INET, syscall.SOCK_STREAM, _IPPROTO_MPTCP)
+	if err != nil {
+		return false
+	}
+
+	syscall.Close(fd)
+	return true
+}
+
+func testMultiPathTCP(t *testing.T, envVar bool) {
+	if envVar {
+		t.Log("Test with GODEBUG=multipathtcp=1")
+		t.Setenv("GODEBUG", "multipathtcp=1")
+	} else {
+		t.Log("Test with GODEBUG=multipathtcp=0")
+		t.Setenv("GODEBUG", "multipathtcp=0")
+	}
+
+	ln := newLocalListenerMPTCP(t, envVar)
+
+	// similar to tcpsock_test:TestIPv6LinkLocalUnicastTCP
+	ls := (&streamListener{Listener: ln}).newLocalServer()
+	defer ls.teardown()
+
+	if g, w := ls.Listener.Addr().Network(), "tcp"; g != w {
+		t.Fatalf("Network type mismatch: got %q, want %q", g, w)
+	}
+
+	genericCh := make(chan error)
+	mptcpCh := make(chan error)
+	handler := func(ls *localServer, ln Listener) {
+		ls.transponder(ln, genericCh)
+		postAcceptMPTCP(ls, mptcpCh)
+	}
+	if err := ls.buildup(handler); err != nil {
+		t.Fatal(err)
+	}
+
+	dialerMPTCP(t, ln.Addr().String(), envVar)
+
+	if err := <-genericCh; err != nil {
+		t.Error(err)
+	}
+	if err := <-mptcpCh; err != nil {
+		t.Error(err)
+	}
+}
+
+func TestMultiPathTCP(t *testing.T) {
+	if !canCreateMPTCPSocket() {
+		t.Skip("Cannot create MPTCP sockets")
+	}
+
+	for _, envVar := range []bool{false, true} {
+		testMultiPathTCP(t, envVar)
+	}
+}
diff --git a/src/net/mptcpsock_stub.go b/src/net/mptcpsock_stub.go
new file mode 100644
index 0000000..458c153
--- /dev/null
+++ b/src/net/mptcpsock_stub.go
@@ -0,0 +1,23 @@
+// Copyright 2023 The Go 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:build !linux
+
+package net
+
+import (
+	"context"
+)
+
+func (sd *sysDialer) dialMPTCP(ctx context.Context, laddr, raddr *TCPAddr) (*TCPConn, error) {
+	return sd.dialTCP(ctx, laddr, raddr)
+}
+
+func (sl *sysListener) listenMPTCP(ctx context.Context, laddr *TCPAddr) (*TCPListener, error) {
+	return sl.listenTCP(ctx, laddr)
+}
+
+func isUsingMultipathTCP(fd *netFD) bool {
+	return false
+}
diff --git a/src/net/net.go b/src/net/net.go
index 0a4f747..5cfc25f 100644
--- a/src/net/net.go
+++ b/src/net/net.go
@@ -71,6 +71,10 @@
 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 macOS, if Go code that uses the net package is built with
+-buildmode=c-archive, linking the resulting archive into a C program
+requires passing -lresolv when linking the C code.
+
 On Plan 9, the resolver always accesses /net/cs and /net/dns.
 
 On Windows, in Go 1.18.x and earlier, the resolver always used C
@@ -89,14 +93,6 @@
 	"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"
-)
-
 // Addr represents a network end point address.
 //
 // The two methods Network and String conventionally return strings
diff --git a/src/net/net_fake.go b/src/net/net_fake.go
index 2ecc1fa..908767a 100644
--- a/src/net/net_fake.go
+++ b/src/net/net_fake.go
@@ -2,26 +2,23 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// Fake networking for js/wasm. It is intended to allow tests of other package to pass.
+// Fake networking for js/wasm and wasip1/wasm. It is intended to allow tests of other package to pass.
 
-//go:build js && wasm
+//go:build (js && wasm) || wasip1
 
 package net
 
 import (
 	"context"
-	"internal/poll"
 	"io"
 	"os"
 	"sync"
 	"syscall"
 	"time"
-
-	"golang.org/x/net/dns/dnsmessage"
 )
 
 var listenersMu sync.Mutex
-var listeners = make(map[string]*netFD)
+var listeners = make(map[fakeNetAddr]*netFD)
 
 var portCounterMu sync.Mutex
 var portCounter = 0
@@ -33,82 +30,169 @@
 	return portCounter
 }
 
-// Network file descriptor.
-type netFD struct {
+type fakeNetAddr struct {
+	network string
+	address string
+}
+
+type fakeNetFD struct {
+	listener fakeNetAddr
 	r        *bufferedPipe
 	w        *bufferedPipe
 	incoming chan *netFD
-
 	closedMu sync.Mutex
 	closed   bool
-
-	// immutable until Close
-	listener bool
-	family   int
-	sotype   int
-	net      string
-	laddr    Addr
-	raddr    Addr
-
-	// unused
-	pfd         poll.FD
-	isConnected bool // handshake completed or use of association with peer
 }
 
 // socket returns a network file descriptor that is ready for
 // asynchronous I/O using the network poller.
 func socket(ctx context.Context, net string, family, sotype, proto int, ipv6only bool, laddr, raddr sockaddr, ctrlCtxFn func(context.Context, string, string, syscall.RawConn) error) (*netFD, error) {
 	fd := &netFD{family: family, sotype: sotype, net: net}
+	if laddr != nil && raddr == nil {
+		return fakelistener(fd, laddr)
+	}
+	fd2 := &netFD{family: family, sotype: sotype, net: net}
+	return fakeconn(fd, fd2, laddr, raddr)
+}
 
-	if laddr != nil && raddr == nil { // listener
-		l := laddr.(*TCPAddr)
-		fd.laddr = &TCPAddr{
-			IP:   l.IP,
-			Port: nextPort(),
-			Zone: l.Zone,
+func fakeIPAndPort(ip IP, port int) (IP, int) {
+	if ip == nil {
+		ip = IPv4(127, 0, 0, 1)
+	}
+	if port == 0 {
+		port = nextPort()
+	}
+	return ip, port
+}
+
+func fakeTCPAddr(addr *TCPAddr) *TCPAddr {
+	var ip IP
+	var port int
+	var zone string
+	if addr != nil {
+		ip, port, zone = addr.IP, addr.Port, addr.Zone
+	}
+	ip, port = fakeIPAndPort(ip, port)
+	return &TCPAddr{IP: ip, Port: port, Zone: zone}
+}
+
+func fakeUDPAddr(addr *UDPAddr) *UDPAddr {
+	var ip IP
+	var port int
+	var zone string
+	if addr != nil {
+		ip, port, zone = addr.IP, addr.Port, addr.Zone
+	}
+	ip, port = fakeIPAndPort(ip, port)
+	return &UDPAddr{IP: ip, Port: port, Zone: zone}
+}
+
+func fakeUnixAddr(sotype int, addr *UnixAddr) *UnixAddr {
+	var net, name string
+	if addr != nil {
+		name = addr.Name
+	}
+	switch sotype {
+	case syscall.SOCK_DGRAM:
+		net = "unixgram"
+	case syscall.SOCK_SEQPACKET:
+		net = "unixpacket"
+	default:
+		net = "unix"
+	}
+	return &UnixAddr{Net: net, Name: name}
+}
+
+func fakelistener(fd *netFD, laddr sockaddr) (*netFD, error) {
+	switch l := laddr.(type) {
+	case *TCPAddr:
+		laddr = fakeTCPAddr(l)
+	case *UDPAddr:
+		laddr = fakeUDPAddr(l)
+	case *UnixAddr:
+		if l.Name == "" {
+			return nil, syscall.ENOENT
 		}
-		fd.listener = true
-		fd.incoming = make(chan *netFD, 1024)
-		listenersMu.Lock()
-		listeners[fd.laddr.(*TCPAddr).String()] = fd
-		listenersMu.Unlock()
-		return fd, nil
+		laddr = fakeUnixAddr(fd.sotype, l)
+	default:
+		return nil, syscall.EOPNOTSUPP
 	}
 
-	fd.laddr = &TCPAddr{
-		IP:   IPv4(127, 0, 0, 1),
-		Port: nextPort(),
+	listener := fakeNetAddr{
+		network: laddr.Network(),
+		address: laddr.String(),
 	}
-	fd.raddr = raddr
-	fd.r = newBufferedPipe(65536)
-	fd.w = newBufferedPipe(65536)
 
-	fd2 := &netFD{family: fd.family, sotype: sotype, net: net}
-	fd2.laddr = fd.raddr
-	fd2.raddr = fd.laddr
-	fd2.r = fd.w
-	fd2.w = fd.r
+	fd.fakeNetFD = &fakeNetFD{
+		listener: listener,
+		incoming: make(chan *netFD, 1024),
+	}
+
+	fd.laddr = laddr
 	listenersMu.Lock()
-	l, ok := listeners[fd.raddr.(*TCPAddr).String()]
-	if !ok {
-		listenersMu.Unlock()
-		return nil, syscall.ECONNREFUSED
+	defer listenersMu.Unlock()
+	if _, exists := listeners[listener]; exists {
+		return nil, syscall.EADDRINUSE
 	}
-	l.incoming <- fd2
-	listenersMu.Unlock()
-
+	listeners[listener] = fd
 	return fd, nil
 }
 
-func (fd *netFD) Read(p []byte) (n int, err error) {
+func fakeconn(fd *netFD, fd2 *netFD, laddr, raddr sockaddr) (*netFD, error) {
+	switch r := raddr.(type) {
+	case *TCPAddr:
+		r = fakeTCPAddr(r)
+		raddr = r
+		laddr = fakeTCPAddr(laddr.(*TCPAddr))
+	case *UDPAddr:
+		r = fakeUDPAddr(r)
+		raddr = r
+		laddr = fakeUDPAddr(laddr.(*UDPAddr))
+	case *UnixAddr:
+		r = fakeUnixAddr(fd.sotype, r)
+		raddr = r
+		laddr = &UnixAddr{Net: r.Net, Name: r.Name}
+	default:
+		return nil, syscall.EAFNOSUPPORT
+	}
+	fd.laddr = laddr
+	fd.raddr = raddr
+
+	fd.fakeNetFD = &fakeNetFD{
+		r: newBufferedPipe(65536),
+		w: newBufferedPipe(65536),
+	}
+	fd2.fakeNetFD = &fakeNetFD{
+		r: fd.fakeNetFD.w,
+		w: fd.fakeNetFD.r,
+	}
+
+	fd2.laddr = fd.raddr
+	fd2.raddr = fd.laddr
+
+	listener := fakeNetAddr{
+		network: fd.raddr.Network(),
+		address: fd.raddr.String(),
+	}
+	listenersMu.Lock()
+	defer listenersMu.Unlock()
+	l, ok := listeners[listener]
+	if !ok {
+		return nil, syscall.ECONNREFUSED
+	}
+	l.incoming <- fd2
+	return fd, nil
+}
+
+func (fd *fakeNetFD) Read(p []byte) (n int, err error) {
 	return fd.r.Read(p)
 }
 
-func (fd *netFD) Write(p []byte) (nn int, err error) {
+func (fd *fakeNetFD) Write(p []byte) (nn int, err error) {
 	return fd.w.Write(p)
 }
 
-func (fd *netFD) Close() error {
+func (fd *fakeNetFD) Close() error {
 	fd.closedMu.Lock()
 	if fd.closed {
 		fd.closedMu.Unlock()
@@ -117,11 +201,11 @@
 	fd.closed = true
 	fd.closedMu.Unlock()
 
-	if fd.listener {
+	if fd.listener != (fakeNetAddr{}) {
 		listenersMu.Lock()
-		delete(listeners, fd.laddr.String())
+		delete(listeners, fd.listener)
 		close(fd.incoming)
-		fd.listener = false
+		fd.listener = fakeNetAddr{}
 		listenersMu.Unlock()
 		return nil
 	}
@@ -131,17 +215,17 @@
 	return nil
 }
 
-func (fd *netFD) closeRead() error {
+func (fd *fakeNetFD) closeRead() error {
 	fd.r.Close()
 	return nil
 }
 
-func (fd *netFD) closeWrite() error {
+func (fd *fakeNetFD) closeWrite() error {
 	fd.w.Close()
 	return nil
 }
 
-func (fd *netFD) accept() (*netFD, error) {
+func (fd *fakeNetFD) accept() (*netFD, error) {
 	c, ok := <-fd.incoming
 	if !ok {
 		return nil, syscall.EINVAL
@@ -149,18 +233,18 @@
 	return c, nil
 }
 
-func (fd *netFD) SetDeadline(t time.Time) error {
+func (fd *fakeNetFD) SetDeadline(t time.Time) error {
 	fd.r.SetReadDeadline(t)
 	fd.w.SetWriteDeadline(t)
 	return nil
 }
 
-func (fd *netFD) SetReadDeadline(t time.Time) error {
+func (fd *fakeNetFD) SetReadDeadline(t time.Time) error {
 	fd.r.SetReadDeadline(t)
 	return nil
 }
 
-func (fd *netFD) SetWriteDeadline(t time.Time) error {
+func (fd *fakeNetFD) SetWriteDeadline(t time.Time) error {
 	fd.w.SetWriteDeadline(t)
 	return nil
 }
@@ -265,58 +349,58 @@
 	return 0, syscall.ENOSYS
 }
 
-func (fd *netFD) readFrom(p []byte) (n int, sa syscall.Sockaddr, err error) {
-	return 0, nil, syscall.ENOSYS
-
-}
-func (fd *netFD) readFromInet4(p []byte, sa *syscall.SockaddrInet4) (n int, err error) {
-	return 0, syscall.ENOSYS
-}
-
-func (fd *netFD) readFromInet6(p []byte, sa *syscall.SockaddrInet6) (n int, err error) {
-	return 0, syscall.ENOSYS
-}
-
-func (fd *netFD) readMsg(p []byte, oob []byte, flags int) (n, oobn, retflags int, sa syscall.Sockaddr, err error) {
-	return 0, 0, 0, nil, syscall.ENOSYS
-}
-
-func (fd *netFD) readMsgInet4(p []byte, oob []byte, flags int, sa *syscall.SockaddrInet4) (n, oobn, retflags int, err error) {
-	return 0, 0, 0, syscall.ENOSYS
-}
-
-func (fd *netFD) readMsgInet6(p []byte, oob []byte, flags int, sa *syscall.SockaddrInet6) (n, oobn, retflags int, err error) {
-	return 0, 0, 0, syscall.ENOSYS
-}
-
-func (fd *netFD) writeMsgInet4(p []byte, oob []byte, sa *syscall.SockaddrInet4) (n int, oobn int, err error) {
-	return 0, 0, syscall.ENOSYS
-}
-
-func (fd *netFD) writeMsgInet6(p []byte, oob []byte, sa *syscall.SockaddrInet6) (n int, oobn int, err error) {
-	return 0, 0, syscall.ENOSYS
-}
-
-func (fd *netFD) writeTo(p []byte, sa syscall.Sockaddr) (n int, err error) {
-	return 0, syscall.ENOSYS
-}
-
-func (fd *netFD) writeToInet4(p []byte, sa *syscall.SockaddrInet4) (n int, err error) {
-	return 0, syscall.ENOSYS
-}
-
-func (fd *netFD) writeToInet6(p []byte, sa *syscall.SockaddrInet6) (n int, err error) {
-	return 0, syscall.ENOSYS
-}
-
-func (fd *netFD) writeMsg(p []byte, oob []byte, sa syscall.Sockaddr) (n int, oobn int, err error) {
-	return 0, 0, syscall.ENOSYS
-}
-
-func (fd *netFD) dup() (f *os.File, err error) {
+func (fd *fakeNetFD) connect(ctx context.Context, la, ra syscall.Sockaddr) (syscall.Sockaddr, error) {
 	return nil, syscall.ENOSYS
 }
 
-func (r *Resolver) lookup(ctx context.Context, name string, qtype dnsmessage.Type, conf *dnsConfig) (dnsmessage.Parser, string, error) {
-	panic("unreachable")
+func (fd *fakeNetFD) readFrom(p []byte) (n int, sa syscall.Sockaddr, err error) {
+	return 0, nil, syscall.ENOSYS
+
+}
+func (fd *fakeNetFD) readFromInet4(p []byte, sa *syscall.SockaddrInet4) (n int, err error) {
+	return 0, syscall.ENOSYS
+}
+
+func (fd *fakeNetFD) readFromInet6(p []byte, sa *syscall.SockaddrInet6) (n int, err error) {
+	return 0, syscall.ENOSYS
+}
+
+func (fd *fakeNetFD) readMsg(p []byte, oob []byte, flags int) (n, oobn, retflags int, sa syscall.Sockaddr, err error) {
+	return 0, 0, 0, nil, syscall.ENOSYS
+}
+
+func (fd *fakeNetFD) readMsgInet4(p []byte, oob []byte, flags int, sa *syscall.SockaddrInet4) (n, oobn, retflags int, err error) {
+	return 0, 0, 0, syscall.ENOSYS
+}
+
+func (fd *fakeNetFD) readMsgInet6(p []byte, oob []byte, flags int, sa *syscall.SockaddrInet6) (n, oobn, retflags int, err error) {
+	return 0, 0, 0, syscall.ENOSYS
+}
+
+func (fd *fakeNetFD) writeMsgInet4(p []byte, oob []byte, sa *syscall.SockaddrInet4) (n int, oobn int, err error) {
+	return 0, 0, syscall.ENOSYS
+}
+
+func (fd *fakeNetFD) writeMsgInet6(p []byte, oob []byte, sa *syscall.SockaddrInet6) (n int, oobn int, err error) {
+	return 0, 0, syscall.ENOSYS
+}
+
+func (fd *fakeNetFD) writeTo(p []byte, sa syscall.Sockaddr) (n int, err error) {
+	return 0, syscall.ENOSYS
+}
+
+func (fd *fakeNetFD) writeToInet4(p []byte, sa *syscall.SockaddrInet4) (n int, err error) {
+	return 0, syscall.ENOSYS
+}
+
+func (fd *fakeNetFD) writeToInet6(p []byte, sa *syscall.SockaddrInet6) (n int, err error) {
+	return 0, syscall.ENOSYS
+}
+
+func (fd *fakeNetFD) writeMsg(p []byte, oob []byte, sa syscall.Sockaddr) (n int, oobn int, err error) {
+	return 0, 0, syscall.ENOSYS
+}
+
+func (fd *fakeNetFD) dup() (f *os.File, err error) {
+	return nil, syscall.ENOSYS
 }
diff --git a/src/net/net_fake_js.go b/src/net/net_fake_js.go
new file mode 100644
index 0000000..7ba108b
--- /dev/null
+++ b/src/net/net_fake_js.go
@@ -0,0 +1,36 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Fake networking for js/wasm. It is intended to allow tests of other package to pass.
+
+//go:build js && wasm
+
+package net
+
+import (
+	"context"
+	"internal/poll"
+
+	"golang.org/x/net/dns/dnsmessage"
+)
+
+// Network file descriptor.
+type netFD struct {
+	*fakeNetFD
+
+	// immutable until Close
+	family int
+	sotype int
+	net    string
+	laddr  Addr
+	raddr  Addr
+
+	// unused
+	pfd         poll.FD
+	isConnected bool // handshake completed or use of association with peer
+}
+
+func (r *Resolver) lookup(ctx context.Context, name string, qtype dnsmessage.Type, conf *dnsConfig) (dnsmessage.Parser, string, error) {
+	panic("unreachable")
+}
diff --git a/src/net/net_fake_test.go b/src/net/net_fake_test.go
new file mode 100644
index 0000000..783304d
--- /dev/null
+++ b/src/net/net_fake_test.go
@@ -0,0 +1,203 @@
+// Copyright 2023 The Go 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:build js || wasip1
+
+package net
+
+// GOOS=js and GOOS=wasip1 do not have typical socket networking capabilities
+// found on other platforms. To help run test suites of the stdlib packages,
+// an in-memory "fake network" facility is implemented.
+//
+// The tests in this files are intended to validate the behavior of the fake
+// network stack on these platforms.
+
+import "testing"
+
+func TestFakeConn(t *testing.T) {
+	tests := []struct {
+		name   string
+		listen func() (Listener, error)
+		dial   func(Addr) (Conn, error)
+		addr   func(*testing.T, Addr)
+	}{
+		{
+			name: "Listener:tcp",
+			listen: func() (Listener, error) {
+				return Listen("tcp", ":0")
+			},
+			dial: func(addr Addr) (Conn, error) {
+				return Dial(addr.Network(), addr.String())
+			},
+			addr: testFakeTCPAddr,
+		},
+
+		{
+			name: "ListenTCP:tcp",
+			listen: func() (Listener, error) {
+				// Creating a listening TCP connection with a nil address must
+				// select an IP address on localhost with a random port.
+				// This test verifies that the fake network facility does that.
+				return ListenTCP("tcp", nil)
+			},
+			dial: func(addr Addr) (Conn, error) {
+				// Connecting a listening TCP connection will select a local
+				// address on the local network and connects to the destination
+				// address.
+				return DialTCP("tcp", nil, addr.(*TCPAddr))
+			},
+			addr: testFakeTCPAddr,
+		},
+
+		{
+			name: "ListenUnix:unix",
+			listen: func() (Listener, error) {
+				return ListenUnix("unix", &UnixAddr{Name: "test"})
+			},
+			dial: func(addr Addr) (Conn, error) {
+				return DialUnix("unix", nil, addr.(*UnixAddr))
+			},
+			addr: testFakeUnixAddr("unix", "test"),
+		},
+
+		{
+			name: "ListenUnix:unixpacket",
+			listen: func() (Listener, error) {
+				return ListenUnix("unixpacket", &UnixAddr{Name: "test"})
+			},
+			dial: func(addr Addr) (Conn, error) {
+				return DialUnix("unixpacket", nil, addr.(*UnixAddr))
+			},
+			addr: testFakeUnixAddr("unixpacket", "test"),
+		},
+	}
+
+	for _, test := range tests {
+		t.Run(test.name, func(t *testing.T) {
+			l, err := test.listen()
+			if err != nil {
+				t.Fatal(err)
+			}
+			defer l.Close()
+			test.addr(t, l.Addr())
+
+			c, err := test.dial(l.Addr())
+			if err != nil {
+				t.Fatal(err)
+			}
+			defer c.Close()
+			test.addr(t, c.LocalAddr())
+			test.addr(t, c.RemoteAddr())
+		})
+	}
+}
+
+func TestFakePacketConn(t *testing.T) {
+	tests := []struct {
+		name   string
+		listen func() (PacketConn, error)
+		dial   func(Addr) (Conn, error)
+		addr   func(*testing.T, Addr)
+	}{
+		{
+			name: "ListenPacket:udp",
+			listen: func() (PacketConn, error) {
+				return ListenPacket("udp", ":0")
+			},
+			dial: func(addr Addr) (Conn, error) {
+				return Dial(addr.Network(), addr.String())
+			},
+			addr: testFakeUDPAddr,
+		},
+
+		{
+			name: "ListenUDP:udp",
+			listen: func() (PacketConn, error) {
+				// Creating a listening UDP connection with a nil address must
+				// select an IP address on localhost with a random port.
+				// This test verifies that the fake network facility does that.
+				return ListenUDP("udp", nil)
+			},
+			dial: func(addr Addr) (Conn, error) {
+				// Connecting a listening UDP connection will select a local
+				// address on the local network and connects to the destination
+				// address.
+				return DialUDP("udp", nil, addr.(*UDPAddr))
+			},
+			addr: testFakeUDPAddr,
+		},
+
+		{
+			name: "ListenUnixgram:unixgram",
+			listen: func() (PacketConn, error) {
+				return ListenUnixgram("unixgram", &UnixAddr{Name: "test"})
+			},
+			dial: func(addr Addr) (Conn, error) {
+				return DialUnix("unixgram", nil, addr.(*UnixAddr))
+			},
+			addr: testFakeUnixAddr("unixgram", "test"),
+		},
+	}
+
+	for _, test := range tests {
+		t.Run(test.name, func(t *testing.T) {
+			l, err := test.listen()
+			if err != nil {
+				t.Fatal(err)
+			}
+			defer l.Close()
+			test.addr(t, l.LocalAddr())
+
+			c, err := test.dial(l.LocalAddr())
+			if err != nil {
+				t.Fatal(err)
+			}
+			defer c.Close()
+			test.addr(t, c.LocalAddr())
+			test.addr(t, c.RemoteAddr())
+		})
+	}
+}
+
+func testFakeTCPAddr(t *testing.T, addr Addr) {
+	t.Helper()
+	if a, ok := addr.(*TCPAddr); !ok {
+		t.Errorf("Addr is not *TCPAddr: %T", addr)
+	} else {
+		testFakeNetAddr(t, a.IP, a.Port)
+	}
+}
+
+func testFakeUDPAddr(t *testing.T, addr Addr) {
+	t.Helper()
+	if a, ok := addr.(*UDPAddr); !ok {
+		t.Errorf("Addr is not *UDPAddr: %T", addr)
+	} else {
+		testFakeNetAddr(t, a.IP, a.Port)
+	}
+}
+
+func testFakeNetAddr(t *testing.T, ip IP, port int) {
+	t.Helper()
+	if port == 0 {
+		t.Error("network address is missing port")
+	} else if len(ip) == 0 {
+		t.Error("network address is missing IP")
+	} else if !ip.Equal(IPv4(127, 0, 0, 1)) {
+		t.Errorf("network address has wrong IP: %s", ip)
+	}
+}
+
+func testFakeUnixAddr(net, name string) func(*testing.T, Addr) {
+	return func(t *testing.T, addr Addr) {
+		t.Helper()
+		if a, ok := addr.(*UnixAddr); !ok {
+			t.Errorf("Addr is not *UnixAddr: %T", addr)
+		} else if a.Net != net {
+			t.Errorf("unix address has wrong net: want=%q got=%q", net, a.Net)
+		} else if a.Name != name {
+			t.Errorf("unix address has wrong name: want=%q got=%q", name, a.Name)
+		}
+	}
+}
diff --git a/src/net/net_test.go b/src/net/net_test.go
index 05c058a..a0ac85f 100644
--- a/src/net/net_test.go
+++ b/src/net/net_test.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build !js
+//go:build !js && !wasip1
 
 package net
 
diff --git a/src/net/netcgo_off.go b/src/net/netcgo_off.go
new file mode 100644
index 0000000..54677dc
--- /dev/null
+++ b/src/net/netcgo_off.go
@@ -0,0 +1,9 @@
+// Copyright 2023 The Go 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:build !netcgo
+
+package net
+
+const netCgoBuildTag = false
diff --git a/src/net/netcgo_on.go b/src/net/netcgo_on.go
new file mode 100644
index 0000000..25d4bdc
--- /dev/null
+++ b/src/net/netcgo_on.go
@@ -0,0 +1,9 @@
+// Copyright 2023 The Go 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:build netcgo
+
+package net
+
+const netCgoBuildTag = true
diff --git a/src/net/netgo.go b/src/net/netgo.go
deleted file mode 100644
index e478c88..0000000
--- a/src/net/netgo.go
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2022 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Default netGo to true if the netgo build tag is being used, or the
-// C library DNS routines are not available. Note that the C library
-// routines are always available on Darwin and Windows.
-
-//go:build netgo || (!cgo && !darwin && !windows)
-
-package net
-
-func init() { netGo = true }
diff --git a/src/net/netgo_netcgo.go b/src/net/netgo_netcgo.go
new file mode 100644
index 0000000..7f3a5fd
--- /dev/null
+++ b/src/net/netgo_netcgo.go
@@ -0,0 +1,14 @@
+// Copyright 2023 The Go 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:build netgo && netcgo
+
+package net
+
+func init() {
+	// This will give a compile time error about the unused constant.
+	// The advantage of this approach is that the gc compiler
+	// actually prints the constant, making the problem obvious.
+	"Do not use both netgo and netcgo build tags."
+}
diff --git a/src/net/netgo_off.go b/src/net/netgo_off.go
new file mode 100644
index 0000000..e6bc2d7
--- /dev/null
+++ b/src/net/netgo_off.go
@@ -0,0 +1,9 @@
+// Copyright 2023 The Go 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:build !netgo
+
+package net
+
+const netGoBuildTag = false
diff --git a/src/net/netgo_on.go b/src/net/netgo_on.go
new file mode 100644
index 0000000..4f088de
--- /dev/null
+++ b/src/net/netgo_on.go
@@ -0,0 +1,9 @@
+// Copyright 2023 The Go 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:build netgo
+
+package net
+
+const netGoBuildTag = true
diff --git a/src/net/netgo_unix_test.go b/src/net/netgo_unix_test.go
deleted file mode 100644
index 5ddebab..0000000
--- a/src/net/netgo_unix_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.
-
-//go:build (!cgo || netgo) && (dragonfly || freebsd || linux || netbsd || openbsd || solaris)
-
-package net
-
-import (
-	"context"
-	"testing"
-)
-
-func TestGoLookupIP(t *testing.T) {
-	defer dnsWaitGroup.Wait()
-	host := "localhost"
-	ctx := context.Background()
-	_, err, ok := cgoLookupIP(ctx, "ip", host)
-	if ok {
-		t.Errorf("cgoLookupIP must be a placeholder")
-	}
-	if err != nil {
-		t.Error(err)
-	}
-	if _, err := DefaultResolver.goLookupIP(ctx, "ip", host); err != nil {
-		t.Error(err)
-	}
-}
diff --git a/src/net/netip/netip.go b/src/net/netip/netip.go
index ec9266d..a44b094 100644
--- a/src/net/netip/netip.go
+++ b/src/net/netip/netip.go
@@ -3,13 +3,12 @@
 // license that can be found in the LICENSE file.
 
 // Package netip defines an IP address type that's a small value type.
-// Building on that Addr type, the package also defines AddrPort (an
-// IP address and a port), and Prefix (an IP address and a bit length
+// Building on that [Addr] type, the package also defines [AddrPort] (an
+// IP address and a port) and [Prefix] (an IP address and a bit length
 // prefix).
 //
-// Compared to the net.IP type, this package's Addr type takes less
-// memory, is immutable, and is comparable (supports == and being a
-// map key).
+// Compared to the [net.IP] type, [Addr] type takes less memory, is immutable,
+// and is comparable (supports == and being a map key).
 package netip
 
 import (
@@ -28,9 +27,9 @@
 //   netip.Addr: 24 bytes (zone is per-name singleton, shared across all users)
 
 // Addr represents an IPv4 or IPv6 address (with or without a scoped
-// addressing zone), similar to net.IP or net.IPAddr.
+// addressing zone), similar to [net.IP] or [net.IPAddr].
 //
-// Unlike net.IP or net.IPAddr, Addr is a comparable value
+// Unlike [net.IP] or [net.IPAddr], Addr is a comparable value
 // type (it supports == and can be a map key) and is immutable.
 //
 // The zero Addr is not a valid IP address.
@@ -1225,20 +1224,11 @@
 type Prefix struct {
 	ip Addr
 
-	// bits is logically a uint8 (storing [0,128]) but also
-	// encodes an "invalid" bit, currently represented by the
-	// invalidPrefixBits sentinel value. It could be packed into
-	// the uint8 more with more complicated expressions in the
-	// accessors, but the extra byte (in padding anyway) doesn't
-	// hurt and simplifies code below.
-	bits int16
+	// bitsPlusOne stores the prefix bit length plus one.
+	// A Prefix is valid if and only if bitsPlusOne is non-zero.
+	bitsPlusOne uint8
 }
 
-// invalidPrefixBits is the Prefix.bits value used when PrefixFrom is
-// outside the range of a uint8. It's returned as the int -1 in the
-// public API.
-const invalidPrefixBits = -1
-
 // PrefixFrom returns a Prefix with the provided IP address and bit
 // prefix length.
 //
@@ -1248,13 +1238,13 @@
 // If bits is less than zero or greater than ip.BitLen, Prefix.Bits
 // will return an invalid value -1.
 func PrefixFrom(ip Addr, bits int) Prefix {
-	if bits < 0 || bits > ip.BitLen() {
-		bits = invalidPrefixBits
+	var bitsPlusOne uint8
+	if !ip.isZero() && bits >= 0 && bits <= ip.BitLen() {
+		bitsPlusOne = uint8(bits) + 1
 	}
-	b16 := int16(bits)
 	return Prefix{
-		ip:   ip.withoutZone(),
-		bits: b16,
+		ip:          ip.withoutZone(),
+		bitsPlusOne: bitsPlusOne,
 	}
 }
 
@@ -1264,17 +1254,17 @@
 // Bits returns p's prefix length.
 //
 // It reports -1 if invalid.
-func (p Prefix) Bits() int { return int(p.bits) }
+func (p Prefix) Bits() int { return int(p.bitsPlusOne) - 1 }
 
 // IsValid reports whether p.Bits() has a valid range for p.Addr().
 // If p.Addr() is the zero Addr, IsValid returns false.
 // Note that if p is the zero Prefix, then p.IsValid() == false.
-func (p Prefix) IsValid() bool { return !p.ip.isZero() && p.bits >= 0 && int(p.bits) <= p.ip.BitLen() }
+func (p Prefix) IsValid() bool { return p.bitsPlusOne > 0 }
 
 func (p Prefix) isZero() bool { return p == Prefix{} }
 
 // IsSingleIP reports whether p contains exactly one IP.
-func (p Prefix) IsSingleIP() bool { return p.bits != 0 && int(p.bits) == p.ip.BitLen() }
+func (p Prefix) IsSingleIP() bool { return p.IsValid() && p.Bits() == p.ip.BitLen() }
 
 // ParsePrefix parses s as an IP address prefix.
 // The string can be in the form "192.168.1.0/24" or "2001:db8::/32",
@@ -1327,10 +1317,8 @@
 //
 // If p is zero or otherwise invalid, Masked returns the zero Prefix.
 func (p Prefix) Masked() Prefix {
-	if m, err := p.ip.Prefix(int(p.bits)); err == nil {
-		return m
-	}
-	return Prefix{}
+	m, _ := p.ip.Prefix(p.Bits())
+	return m
 }
 
 // Contains reports whether the network p includes ip.
@@ -1356,12 +1344,12 @@
 		// the compiler doesn't know that, so mask with 63 to help it.
 		// Now truncate to 32 bits, because this is IPv4.
 		// If all the bits we care about are equal, the result will be zero.
-		return uint32((ip.addr.lo^p.ip.addr.lo)>>((32-p.bits)&63)) == 0
+		return uint32((ip.addr.lo^p.ip.addr.lo)>>((32-p.Bits())&63)) == 0
 	} else {
 		// xor the IP addresses together.
 		// Mask away the bits we don't care about.
 		// If all the bits we care about are equal, the result will be zero.
-		return ip.addr.xor(p.ip.addr).and(mask6(int(p.bits))).isZero()
+		return ip.addr.xor(p.ip.addr).and(mask6(p.Bits())).isZero()
 	}
 }
 
@@ -1380,11 +1368,11 @@
 	if p.ip.Is4() != o.ip.Is4() {
 		return false
 	}
-	var minBits int16
-	if p.bits < o.bits {
-		minBits = p.bits
+	var minBits int
+	if pb, ob := p.Bits(), o.Bits(); pb < ob {
+		minBits = pb
 	} else {
-		minBits = o.bits
+		minBits = ob
 	}
 	if minBits == 0 {
 		return true
@@ -1394,10 +1382,10 @@
 	// so the Prefix call on the one that's already minBits serves to zero
 	// out any remaining bits in IP.
 	var err error
-	if p, err = p.ip.Prefix(int(minBits)); err != nil {
+	if p, err = p.ip.Prefix(minBits); err != nil {
 		return false
 	}
-	if o, err = o.ip.Prefix(int(minBits)); err != nil {
+	if o, err = o.ip.Prefix(minBits); err != nil {
 		return false
 	}
 	return p.ip == o.ip
@@ -1427,7 +1415,7 @@
 	}
 
 	b = append(b, '/')
-	b = appendDecimal(b, uint8(p.bits))
+	b = appendDecimal(b, uint8(p.Bits()))
 	return b
 }
 
@@ -1490,5 +1478,5 @@
 	if !p.IsValid() {
 		return "invalid Prefix"
 	}
-	return p.ip.String() + "/" + itoa.Itoa(int(p.bits))
+	return p.ip.String() + "/" + itoa.Itoa(p.Bits())
 }
diff --git a/src/net/netip/netip_pkg_test.go b/src/net/netip/netip_pkg_test.go
index 677f523..2c9a2e6 100644
--- a/src/net/netip/netip_pkg_test.go
+++ b/src/net/netip/netip_pkg_test.go
@@ -24,30 +24,36 @@
 		ipp  Prefix
 		want bool
 	}{
-		{Prefix{v4, -2}, false},
-		{Prefix{v4, -1}, false},
-		{Prefix{v4, 0}, true},
-		{Prefix{v4, 32}, true},
-		{Prefix{v4, 33}, false},
+		{PrefixFrom(v4, -2), false},
+		{PrefixFrom(v4, -1), false},
+		{PrefixFrom(v4, 0), true},
+		{PrefixFrom(v4, 32), true},
+		{PrefixFrom(v4, 33), false},
 
-		{Prefix{v6, -2}, false},
-		{Prefix{v6, -1}, false},
-		{Prefix{v6, 0}, true},
-		{Prefix{v6, 32}, true},
-		{Prefix{v6, 128}, true},
-		{Prefix{v6, 129}, false},
+		{PrefixFrom(v6, -2), false},
+		{PrefixFrom(v6, -1), false},
+		{PrefixFrom(v6, 0), true},
+		{PrefixFrom(v6, 32), true},
+		{PrefixFrom(v6, 128), true},
+		{PrefixFrom(v6, 129), false},
 
-		{Prefix{Addr{}, -2}, false},
-		{Prefix{Addr{}, -1}, false},
-		{Prefix{Addr{}, 0}, false},
-		{Prefix{Addr{}, 32}, false},
-		{Prefix{Addr{}, 128}, false},
+		{PrefixFrom(Addr{}, -2), false},
+		{PrefixFrom(Addr{}, -1), false},
+		{PrefixFrom(Addr{}, 0), false},
+		{PrefixFrom(Addr{}, 32), false},
+		{PrefixFrom(Addr{}, 128), false},
 	}
 	for _, tt := range tests {
 		got := tt.ipp.IsValid()
 		if got != tt.want {
 			t.Errorf("(%v).IsValid() = %v want %v", tt.ipp, got, tt.want)
 		}
+
+		// Test that there is only one invalid Prefix representation per Addr.
+		invalid := PrefixFrom(tt.ipp.Addr(), -1)
+		if !got && tt.ipp != invalid {
+			t.Errorf("(%v == %v) = false, want true", tt.ipp, invalid)
+		}
 	}
 }
 
@@ -167,11 +173,11 @@
 		{mustPrefix("::1/0"), Addr{}, false},
 		{mustPrefix("1.2.3.4/0"), Addr{}, false},
 		// invalid Prefix
-		{Prefix{mustIP("::1"), 129}, mustIP("::1"), false},
-		{Prefix{mustIP("1.2.3.4"), 33}, mustIP("1.2.3.4"), false},
-		{Prefix{Addr{}, 0}, mustIP("1.2.3.4"), false},
-		{Prefix{Addr{}, 32}, mustIP("1.2.3.4"), false},
-		{Prefix{Addr{}, 128}, mustIP("::1"), false},
+		{PrefixFrom(mustIP("::1"), 129), mustIP("::1"), false},
+		{PrefixFrom(mustIP("1.2.3.4"), 33), mustIP("1.2.3.4"), false},
+		{PrefixFrom(Addr{}, 0), mustIP("1.2.3.4"), false},
+		{PrefixFrom(Addr{}, 32), mustIP("1.2.3.4"), false},
+		{PrefixFrom(Addr{}, 128), mustIP("::1"), false},
 		// wrong IP family
 		{mustPrefix("::1/0"), mustIP("1.2.3.4"), false},
 		{mustPrefix("1.2.3.4/0"), mustIP("::1"), false},
diff --git a/src/net/netip/netip_test.go b/src/net/netip/netip_test.go
index b915b24..0f80bb0 100644
--- a/src/net/netip/netip_test.go
+++ b/src/net/netip/netip_test.go
@@ -585,7 +585,6 @@
 		lluZone6 = mustIP("fe80::1%eth0")
 
 		loopback4 = mustIP("127.0.0.1")
-		loopback6 = mustIP("::1")
 
 		ilm6     = mustIP("ff01::1")
 		ilmZone6 = mustIP("ff01::1%eth0")
@@ -677,7 +676,7 @@
 		},
 		{
 			name:     "loopback v6Addr",
-			ip:       loopback6,
+			ip:       IPv6Loopback(),
 			loopback: true,
 		},
 		{
@@ -1869,7 +1868,7 @@
 		})
 	}
 
-	// IP constructors
+	// Addr constructors
 	test("IPv4", func() { sinkIP = IPv4(1, 2, 3, 4) })
 	test("AddrFrom4", func() { sinkIP = AddrFrom4([4]byte{1, 2, 3, 4}) })
 	test("AddrFrom16", func() { sinkIP = AddrFrom16([16]byte{}) })
@@ -1881,41 +1880,41 @@
 	test("IPv6Loopback", func() { sinkIP = IPv6Loopback() })
 	test("IPv6Unspecified", func() { sinkIP = IPv6Unspecified() })
 
-	// IP methods
-	test("IP.IsZero", func() { sinkBool = MustParseAddr("1.2.3.4").IsZero() })
-	test("IP.BitLen", func() { sinkBool = MustParseAddr("1.2.3.4").BitLen() == 8 })
-	test("IP.Zone/4", func() { sinkBool = MustParseAddr("1.2.3.4").Zone() == "" })
-	test("IP.Zone/6", func() { sinkBool = MustParseAddr("fe80::1").Zone() == "" })
-	test("IP.Zone/6zone", func() { sinkBool = MustParseAddr("fe80::1%zone").Zone() == "" })
-	test("IP.Compare", func() {
+	// Addr methods
+	test("Addr.IsZero", func() { sinkBool = MustParseAddr("1.2.3.4").IsZero() })
+	test("Addr.BitLen", func() { sinkBool = MustParseAddr("1.2.3.4").BitLen() == 8 })
+	test("Addr.Zone/4", func() { sinkBool = MustParseAddr("1.2.3.4").Zone() == "" })
+	test("Addr.Zone/6", func() { sinkBool = MustParseAddr("fe80::1").Zone() == "" })
+	test("Addr.Zone/6zone", func() { sinkBool = MustParseAddr("fe80::1%zone").Zone() == "" })
+	test("Addr.Compare", func() {
 		a := MustParseAddr("1.2.3.4")
 		b := MustParseAddr("2.3.4.5")
 		sinkBool = a.Compare(b) == 0
 	})
-	test("IP.Less", func() {
+	test("Addr.Less", func() {
 		a := MustParseAddr("1.2.3.4")
 		b := MustParseAddr("2.3.4.5")
 		sinkBool = a.Less(b)
 	})
-	test("IP.Is4", func() { sinkBool = MustParseAddr("1.2.3.4").Is4() })
-	test("IP.Is6", func() { sinkBool = MustParseAddr("fe80::1").Is6() })
-	test("IP.Is4In6", func() { sinkBool = MustParseAddr("fe80::1").Is4In6() })
-	test("IP.Unmap", func() { sinkIP = MustParseAddr("ffff::2.3.4.5").Unmap() })
-	test("IP.WithZone", func() { sinkIP = MustParseAddr("fe80::1").WithZone("") })
-	test("IP.IsGlobalUnicast", func() { sinkBool = MustParseAddr("2001:db8::1").IsGlobalUnicast() })
-	test("IP.IsInterfaceLocalMulticast", func() { sinkBool = MustParseAddr("fe80::1").IsInterfaceLocalMulticast() })
-	test("IP.IsLinkLocalMulticast", func() { sinkBool = MustParseAddr("fe80::1").IsLinkLocalMulticast() })
-	test("IP.IsLinkLocalUnicast", func() { sinkBool = MustParseAddr("fe80::1").IsLinkLocalUnicast() })
-	test("IP.IsLoopback", func() { sinkBool = MustParseAddr("fe80::1").IsLoopback() })
-	test("IP.IsMulticast", func() { sinkBool = MustParseAddr("fe80::1").IsMulticast() })
-	test("IP.IsPrivate", func() { sinkBool = MustParseAddr("fd00::1").IsPrivate() })
-	test("IP.IsUnspecified", func() { sinkBool = IPv6Unspecified().IsUnspecified() })
-	test("IP.Prefix/4", func() { sinkPrefix = panicPfx(MustParseAddr("1.2.3.4").Prefix(20)) })
-	test("IP.Prefix/6", func() { sinkPrefix = panicPfx(MustParseAddr("fe80::1").Prefix(64)) })
-	test("IP.As16", func() { sinkIP16 = MustParseAddr("1.2.3.4").As16() })
-	test("IP.As4", func() { sinkIP4 = MustParseAddr("1.2.3.4").As4() })
-	test("IP.Next", func() { sinkIP = MustParseAddr("1.2.3.4").Next() })
-	test("IP.Prev", func() { sinkIP = MustParseAddr("1.2.3.4").Prev() })
+	test("Addr.Is4", func() { sinkBool = MustParseAddr("1.2.3.4").Is4() })
+	test("Addr.Is6", func() { sinkBool = MustParseAddr("fe80::1").Is6() })
+	test("Addr.Is4In6", func() { sinkBool = MustParseAddr("fe80::1").Is4In6() })
+	test("Addr.Unmap", func() { sinkIP = MustParseAddr("ffff::2.3.4.5").Unmap() })
+	test("Addr.WithZone", func() { sinkIP = MustParseAddr("fe80::1").WithZone("") })
+	test("Addr.IsGlobalUnicast", func() { sinkBool = MustParseAddr("2001:db8::1").IsGlobalUnicast() })
+	test("Addr.IsInterfaceLocalMulticast", func() { sinkBool = MustParseAddr("fe80::1").IsInterfaceLocalMulticast() })
+	test("Addr.IsLinkLocalMulticast", func() { sinkBool = MustParseAddr("fe80::1").IsLinkLocalMulticast() })
+	test("Addr.IsLinkLocalUnicast", func() { sinkBool = MustParseAddr("fe80::1").IsLinkLocalUnicast() })
+	test("Addr.IsLoopback", func() { sinkBool = MustParseAddr("fe80::1").IsLoopback() })
+	test("Addr.IsMulticast", func() { sinkBool = MustParseAddr("fe80::1").IsMulticast() })
+	test("Addr.IsPrivate", func() { sinkBool = MustParseAddr("fd00::1").IsPrivate() })
+	test("Addr.IsUnspecified", func() { sinkBool = IPv6Unspecified().IsUnspecified() })
+	test("Addr.Prefix/4", func() { sinkPrefix = panicPfx(MustParseAddr("1.2.3.4").Prefix(20)) })
+	test("Addr.Prefix/6", func() { sinkPrefix = panicPfx(MustParseAddr("fe80::1").Prefix(64)) })
+	test("Addr.As16", func() { sinkIP16 = MustParseAddr("1.2.3.4").As16() })
+	test("Addr.As4", func() { sinkIP4 = MustParseAddr("1.2.3.4").As4() })
+	test("Addr.Next", func() { sinkIP = MustParseAddr("1.2.3.4").Next() })
+	test("Addr.Prev", func() { sinkIP = MustParseAddr("1.2.3.4").Prev() })
 
 	// AddrPort constructors
 	test("AddrPortFrom", func() { sinkAddrPort = AddrPortFrom(IPv4(1, 2, 3, 4), 22) })
@@ -1936,7 +1935,7 @@
 	})
 	test("Prefix.IsZero", func() { sinkBool = MustParsePrefix("1.2.0.0/16").IsZero() })
 	test("Prefix.IsSingleIP", func() { sinkBool = MustParsePrefix("1.2.3.4/32").IsSingleIP() })
-	test("IPPRefix.Masked", func() { sinkPrefix = MustParsePrefix("1.2.3.4/16").Masked() })
+	test("Prefix.Masked", func() { sinkPrefix = MustParsePrefix("1.2.3.4/16").Masked() })
 }
 
 func TestAddrStringAllocs(t *testing.T) {
diff --git a/src/net/packetconn_test.go b/src/net/packetconn_test.go
index fa160df..dc0c14b 100644
--- a/src/net/packetconn_test.go
+++ b/src/net/packetconn_test.go
@@ -5,7 +5,7 @@
 // This file implements API tests across platforms and will never have a build
 // tag.
 
-//go:build !js
+//go:build !js && !wasip1
 
 package net
 
diff --git a/src/net/parse_test.go b/src/net/parse_test.go
index 97716d7..7c509a9 100644
--- a/src/net/parse_test.go
+++ b/src/net/parse_test.go
@@ -12,9 +12,10 @@
 )
 
 func TestReadLine(t *testing.T) {
-	// /etc/services file does not exist on android, plan9, windows.
+	// /etc/services file does not exist on android, plan9, windows, or wasip1
+	// where it would be required to be mounted from the host file system.
 	switch runtime.GOOS {
-	case "android", "plan9", "windows":
+	case "android", "plan9", "windows", "wasip1":
 		t.Skipf("not supported on %s", runtime.GOOS)
 	}
 	filename := "/etc/services" // a nice big file
diff --git a/src/net/platform_test.go b/src/net/platform_test.go
index c522ba2..71e9082 100644
--- a/src/net/platform_test.go
+++ b/src/net/platform_test.go
@@ -48,24 +48,15 @@
 		}
 	case "unix", "unixgram":
 		switch runtime.GOOS {
-		case "android", "plan9", "windows":
+		case "android", "ios", "plan9", "windows":
 			return false
 		case "aix":
 			return unixEnabledOnAIX
 		}
-		// iOS does not support unix, unixgram.
-		if iOS() {
-			return false
-		}
 	case "unixpacket":
 		switch runtime.GOOS {
 		case "aix", "android", "darwin", "ios", "plan9", "windows":
 			return false
-		case "netbsd":
-			// It passes on amd64 at least. 386 fails (Issue 22927). arm is unknown.
-			if runtime.GOARCH == "386" {
-				return false
-			}
 		}
 	}
 	switch net {
@@ -81,10 +72,6 @@
 	return true
 }
 
-func iOS() bool {
-	return runtime.GOOS == "ios"
-}
-
 // testableAddress reports whether address of network is testable on
 // the current platform configuration.
 func testableAddress(network, address string) bool {
diff --git a/src/net/port_unix.go b/src/net/port_unix.go
index b05b588..0b2ea3e 100644
--- a/src/net/port_unix.go
+++ b/src/net/port_unix.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build unix || (js && wasm)
+//go:build unix || (js && wasm) || wasip1
 
 // Read system port mappings from /etc/services
 
diff --git a/src/net/protoconn_test.go b/src/net/protoconn_test.go
index e4198a3..c566807 100644
--- a/src/net/protoconn_test.go
+++ b/src/net/protoconn_test.go
@@ -5,11 +5,12 @@
 // This file implements API tests across platforms and will never have a build
 // tag.
 
-//go:build !js
+//go:build !js && !wasip1
 
 package net
 
 import (
+	"internal/testenv"
 	"os"
 	"runtime"
 	"testing"
@@ -161,16 +162,16 @@
 }
 
 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 {
+	if testenv.SyscallIsNotSupported(err) {
+		// May be inside a container that disallows creating a socket or
+		// not running as root.
+		t.Skipf("skipping: %v", err)
+	} else if err != nil {
 		t.Fatal(err)
 	}
 	defer c.Close()
diff --git a/src/net/rawconn.go b/src/net/rawconn.go
index c786354..974320c 100644
--- a/src/net/rawconn.go
+++ b/src/net/rawconn.go
@@ -5,6 +5,7 @@
 package net
 
 import (
+	"internal/poll"
 	"runtime"
 	"syscall"
 )
@@ -60,6 +61,20 @@
 	return err
 }
 
+// PollFD returns the poll.FD of the underlying connection.
+//
+// Other packages in std that also import internal/poll (such as os)
+// can use a type assertion to access this extension method so that
+// they can pass the *poll.FD to functions like poll.Splice.
+//
+// PollFD is not intended for use outside the standard library.
+func (c *rawConn) PollFD() *poll.FD {
+	if !c.ok() {
+		return nil
+	}
+	return &c.fd.pfd
+}
+
 func newRawConn(fd *netFD) (*rawConn, error) {
 	return &rawConn{fd: fd}, nil
 }
diff --git a/src/net/rawconn_stub_test.go b/src/net/rawconn_stub_test.go
index ff3d829..c8ad80c 100644
--- a/src/net/rawconn_stub_test.go
+++ b/src/net/rawconn_stub_test.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build (js && wasm) || plan9
+//go:build (js && wasm) || plan9 || wasip1
 
 package net
 
diff --git a/src/net/rawconn_test.go b/src/net/rawconn_test.go
index d1ef79d..06d5856 100644
--- a/src/net/rawconn_test.go
+++ b/src/net/rawconn_test.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build !js
+//go:build !js && !wasip1
 
 package net
 
diff --git a/src/net/resolverdialfunc_test.go b/src/net/resolverdialfunc_test.go
index 1fb02b1..1de0402 100644
--- a/src/net/resolverdialfunc_test.go
+++ b/src/net/resolverdialfunc_test.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build !js
+//go:build !js && !wasip1
 
 // Test that Resolver.Dial can be a func returning an in-memory net.Conn
 // speaking DNS.
diff --git a/src/net/rpc/server.go b/src/net/rpc/server.go
index 109ebba..5cea2cc 100644
--- a/src/net/rpc/server.go
+++ b/src/net/rpc/server.go
@@ -86,9 +86,9 @@
 	arith := new(Arith)
 	rpc.Register(arith)
 	rpc.HandleHTTP()
-	l, e := net.Listen("tcp", ":1234")
-	if e != nil {
-		log.Fatal("listen error:", e)
+	l, err := net.Listen("tcp", ":1234")
+	if err != nil {
+		log.Fatal("listen error:", err)
 	}
 	go http.Serve(l, nil)
 
diff --git a/src/net/rpc/server_test.go b/src/net/rpc/server_test.go
index dc5f5de..6a94d6e 100644
--- a/src/net/rpc/server_test.go
+++ b/src/net/rpc/server_test.go
@@ -110,9 +110,9 @@
 }
 
 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)
+	l, err := net.Listen("tcp", "127.0.0.1:0") // any available address
+	if err != nil {
+		log.Fatalf("net.Listen tcp :0: %v", err)
 	}
 	return l, l.Addr().String()
 }
diff --git a/src/net/sendfile_linux.go b/src/net/sendfile_linux.go
index 0299fdc..9a7d005 100644
--- a/src/net/sendfile_linux.go
+++ b/src/net/sendfile_linux.go
@@ -18,7 +18,7 @@
 //
 // 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
+	var remain int64 = 1<<63 - 1 // by default, copy until EOF
 
 	lr, ok := r.(*io.LimitedReader)
 	if ok {
diff --git a/src/net/sendfile_stub.go b/src/net/sendfile_stub.go
index 7428da3..c7a2e6a 100644
--- a/src/net/sendfile_stub.go
+++ b/src/net/sendfile_stub.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build aix || (js && wasm) || netbsd || openbsd || ios
+//go:build aix || (js && wasm) || netbsd || openbsd || ios || wasip1
 
 package net
 
diff --git a/src/net/sendfile_test.go b/src/net/sendfile_test.go
index 969c022..44a87a1 100644
--- a/src/net/sendfile_test.go
+++ b/src/net/sendfile_test.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build !js
+//go:build !js && !wasip1
 
 package net
 
diff --git a/src/net/server_test.go b/src/net/server_test.go
index 6796d79..2ff0689 100644
--- a/src/net/server_test.go
+++ b/src/net/server_test.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build !js
+//go:build !js && !wasip1
 
 package net
 
diff --git a/src/net/smtp/smtp_test.go b/src/net/smtp/smtp_test.go
index dba0744..259b10b 100644
--- a/src/net/smtp/smtp_test.go
+++ b/src/net/smtp/smtp_test.go
@@ -948,7 +948,7 @@
 `
 
 func TestTLSClient(t *testing.T) {
-	if runtime.GOOS == "freebsd" || runtime.GOOS == "js" {
+	if runtime.GOOS == "freebsd" || runtime.GOOS == "js" || runtime.GOOS == "wasip1" {
 		testenv.SkipFlaky(t, 19229)
 	}
 	ln := newLocalListener(t)
diff --git a/src/net/sock_cloexec.go b/src/net/sock_cloexec.go
index 3f1cc98..9eeb897 100644
--- a/src/net/sock_cloexec.go
+++ b/src/net/sock_cloexec.go
@@ -10,6 +10,7 @@
 package net
 
 import (
+	"internal/poll"
 	"os"
 	"syscall"
 )
@@ -18,8 +19,30 @@
 // 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)
+	// TODO: We can remove the fallback on Linux and *BSD,
+	// as currently supported versions all support accept4
+	// with SOCK_CLOEXEC, but Solaris does not. See issue #59359.
+	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 {
+		poll.CloseFunc(s)
+		return -1, os.NewSyscallError("setnonblock", err)
+	}
 	return s, nil
 }
diff --git a/src/net/sock_stub.go b/src/net/sock_stub.go
index 4b73e57..e163755 100644
--- a/src/net/sock_stub.go
+++ b/src/net/sock_stub.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build aix || (js && wasm) || solaris
+//go:build aix || (js && wasm) || solaris || wasip1
 
 package net
 
diff --git a/src/net/sockaddr_posix.go b/src/net/sockaddr_posix.go
index 76c3233..e44fc76 100644
--- a/src/net/sockaddr_posix.go
+++ b/src/net/sockaddr_posix.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build unix || (js && wasm) || windows
+//go:build unix || (js && wasm) || wasip1 || windows
 
 package net
 
diff --git a/src/net/sockopt_stub.go b/src/net/sockopt_stub.go
index 98e2371..186d891 100644
--- a/src/net/sockopt_stub.go
+++ b/src/net/sockopt_stub.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build js && wasm
+//go:build (js && wasm) || wasip1
 
 package net
 
diff --git a/src/net/sockoptip_stub.go b/src/net/sockoptip_stub.go
index 2c993eb..a37c312 100644
--- a/src/net/sockoptip_stub.go
+++ b/src/net/sockoptip_stub.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build js && wasm
+//go:build (js && wasm) || wasip1
 
 package net
 
diff --git a/src/net/splice_linux.go b/src/net/splice_linux.go
index 69c3f65..ab2ab70 100644
--- a/src/net/splice_linux.go
+++ b/src/net/splice_linux.go
@@ -15,7 +15,7 @@
 //
 // If splice returns handled == false, it has performed no work.
 func splice(c *netFD, r io.Reader) (written int64, err error, handled bool) {
-	var remain int64 = 1 << 62 // by default, copy until EOF
+	var remain int64 = 1<<63 - 1 // by default, copy until EOF
 	lr, ok := r.(*io.LimitedReader)
 	if ok {
 		remain, r = lr.N, lr.R
diff --git a/src/net/splice_test.go b/src/net/splice_test.go
index fa14c95..75a8f27 100644
--- a/src/net/splice_test.go
+++ b/src/net/splice_test.go
@@ -23,10 +23,21 @@
 		t.Skip("skipping unix-to-tcp tests")
 	}
 	t.Run("unix-to-tcp", func(t *testing.T) { testSplice(t, "unix", "tcp") })
+	t.Run("tcp-to-file", func(t *testing.T) { testSpliceToFile(t, "tcp", "file") })
+	t.Run("unix-to-file", func(t *testing.T) { testSpliceToFile(t, "unix", "file") })
 	t.Run("no-unixpacket", testSpliceNoUnixpacket)
 	t.Run("no-unixgram", testSpliceNoUnixgram)
 }
 
+func testSpliceToFile(t *testing.T, upNet, downNet string) {
+	t.Run("simple", spliceTestCase{upNet, downNet, 128, 128, 0}.testFile)
+	t.Run("multipleWrite", spliceTestCase{upNet, downNet, 4096, 1 << 20, 0}.testFile)
+	t.Run("big", spliceTestCase{upNet, downNet, 5 << 20, 1 << 30, 0}.testFile)
+	t.Run("honorsLimitedReader", spliceTestCase{upNet, downNet, 4096, 1 << 20, 1 << 10}.testFile)
+	t.Run("updatesLimitedReaderN", spliceTestCase{upNet, downNet, 1024, 4096, 4096 + 100}.testFile)
+	t.Run("limitedReaderAtLimit", spliceTestCase{upNet, downNet, 32, 128, 128}.testFile)
+}
+
 func testSplice(t *testing.T, upNet, downNet string) {
 	t.Run("simple", spliceTestCase{upNet, downNet, 128, 128, 0}.test)
 	t.Run("multipleWrite", spliceTestCase{upNet, downNet, 4096, 1 << 20, 0}.test)
@@ -96,6 +107,57 @@
 	}
 }
 
+func (tc spliceTestCase) testFile(t *testing.T) {
+	f, err := os.OpenFile(os.DevNull, os.O_WRONLY, 0)
+	if err != nil {
+		t.Fatal(err)
+	}
+	defer f.Close()
+
+	client, server := spliceTestSocketPair(t, tc.upNet)
+	defer server.Close()
+
+	cleanup, err := startSpliceClient(client, "w", tc.chunkSize, tc.totalSize)
+	if err != nil {
+		client.Close()
+		t.Fatal("failed to start splice client:", err)
+	}
+	defer cleanup()
+
+	var (
+		r          io.Reader = server
+		actualSize           = tc.totalSize
+	)
+	if tc.limitReadSize > 0 {
+		if tc.limitReadSize < actualSize {
+			actualSize = tc.limitReadSize
+		}
+
+		r = &io.LimitedReader{
+			N: int64(tc.limitReadSize),
+			R: r,
+		}
+	}
+
+	got, err := io.Copy(f, r)
+	if err != nil {
+		t.Fatalf("failed to ReadFrom with error: %v", err)
+	}
+	if want := int64(actualSize); got != want {
+		t.Errorf("got %d bytes, want %d", got, want)
+	}
+	if tc.limitReadSize > 0 {
+		wantN := 0
+		if tc.limitReadSize > actualSize {
+			wantN = tc.limitReadSize - actualSize
+		}
+
+		if gotN := r.(*io.LimitedReader).N; gotN != int64(wantN) {
+			t.Errorf("r.N = %d, want %d", gotN, wantN)
+		}
+	}
+}
+
 func testSpliceReaderAtEOF(t *testing.T, upNet, downNet string) {
 	clientUp, serverUp := spliceTestSocketPair(t, upNet)
 	defer clientUp.Close()
@@ -415,3 +477,56 @@
 		}
 	}
 }
+
+func BenchmarkSpliceFile(b *testing.B) {
+	b.Run("tcp-to-file", func(b *testing.B) { benchmarkSpliceFile(b, "tcp") })
+	b.Run("unix-to-file", func(b *testing.B) { benchmarkSpliceFile(b, "unix") })
+}
+
+func benchmarkSpliceFile(b *testing.B, proto string) {
+	for i := 0; i <= 10; i++ {
+		size := 1 << (i + 10)
+		bench := spliceFileBench{
+			proto:     proto,
+			chunkSize: size,
+		}
+		b.Run(strconv.Itoa(size), bench.benchSpliceFile)
+	}
+}
+
+type spliceFileBench struct {
+	proto     string
+	chunkSize int
+}
+
+func (bench spliceFileBench) benchSpliceFile(b *testing.B) {
+	f, err := os.OpenFile(os.DevNull, os.O_WRONLY, 0)
+	if err != nil {
+		b.Fatal(err)
+	}
+	defer f.Close()
+
+	totalSize := b.N * bench.chunkSize
+
+	client, server := spliceTestSocketPair(b, bench.proto)
+	defer server.Close()
+
+	cleanup, err := startSpliceClient(client, "w", bench.chunkSize, totalSize)
+	if err != nil {
+		client.Close()
+		b.Fatalf("failed to start splice client: %v", err)
+	}
+	defer cleanup()
+
+	b.ReportAllocs()
+	b.SetBytes(int64(bench.chunkSize))
+	b.ResetTimer()
+
+	got, err := io.Copy(f, server)
+	if err != nil {
+		b.Fatalf("failed to ReadFrom with error: %v", err)
+	}
+	if want := int64(totalSize); got != want {
+		b.Errorf("bytes sent mismatch, got: %d, want: %d", got, want)
+	}
+}
diff --git a/src/net/tcpsock.go b/src/net/tcpsock.go
index 672170e..358e487 100644
--- a/src/net/tcpsock.go
+++ b/src/net/tcpsock.go
@@ -167,8 +167,10 @@
 // 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
+// If sec > 0, the data is sent in the background as with sec < 0.
+// On some operating systems including Linux, this may cause Close to block
+// until all data has been sent or discarded.
+// 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() {
@@ -217,6 +219,22 @@
 	return nil
 }
 
+// MultipathTCP reports whether the ongoing connection is using MPTCP.
+//
+// If Multipath TCP is not supported by the host, by the other peer or
+// intentionally / accidentally filtered out by a device in between, a
+// fallback to TCP will be done. This method does its best to check if
+// MPTCP is still being used or not.
+//
+// On Linux, more conditions are verified on kernels >= v5.16, improving
+// the results.
+func (c *TCPConn) MultipathTCP() (bool, error) {
+	if !c.ok() {
+		return false, syscall.EINVAL
+	}
+	return isUsingMultipathTCP(c.fd), nil
+}
+
 func newTCPConn(fd *netFD, keepAlive time.Duration, keepAliveHook func(time.Duration)) *TCPConn {
 	setNoDelay(fd, true)
 	if keepAlive == 0 {
diff --git a/src/net/tcpsock_posix.go b/src/net/tcpsock_posix.go
index 0b3fa1a..e6f425b 100644
--- a/src/net/tcpsock_posix.go
+++ b/src/net/tcpsock_posix.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build unix || (js && wasm) || windows
+//go:build unix || (js && wasm) || wasip1 || windows
 
 package net
 
@@ -65,13 +65,17 @@
 }
 
 func (sd *sysDialer) doDialTCP(ctx context.Context, laddr, raddr *TCPAddr) (*TCPConn, error) {
+	return sd.doDialTCPProto(ctx, laddr, raddr, 0)
+}
+
+func (sd *sysDialer) doDialTCPProto(ctx context.Context, laddr, raddr *TCPAddr, proto int) (*TCPConn, error) {
 	ctrlCtxFn := sd.Dialer.ControlContext
 	if ctrlCtxFn == nil && sd.Dialer.Control != nil {
 		ctrlCtxFn = func(cxt context.Context, network, address string, c syscall.RawConn) error {
 			return sd.Dialer.Control(network, address, c)
 		}
 	}
-	fd, err := internetSocket(ctx, sd.network, laddr, raddr, syscall.SOCK_STREAM, 0, "dial", ctrlCtxFn)
+	fd, err := internetSocket(ctx, sd.network, laddr, raddr, syscall.SOCK_STREAM, proto, "dial", ctrlCtxFn)
 
 	// TCP has a rarely used mechanism called a 'simultaneous connection' in
 	// which Dial("tcp", addr1, addr2) run on the machine at addr1 can
@@ -101,7 +105,7 @@
 		if err == nil {
 			fd.Close()
 		}
-		fd, err = internetSocket(ctx, sd.network, laddr, raddr, syscall.SOCK_STREAM, 0, "dial", ctrlCtxFn)
+		fd, err = internetSocket(ctx, sd.network, laddr, raddr, syscall.SOCK_STREAM, proto, "dial", ctrlCtxFn)
 	}
 
 	if err != nil {
@@ -165,13 +169,17 @@
 }
 
 func (sl *sysListener) listenTCP(ctx context.Context, laddr *TCPAddr) (*TCPListener, error) {
+	return sl.listenTCPProto(ctx, laddr, 0)
+}
+
+func (sl *sysListener) listenTCPProto(ctx context.Context, laddr *TCPAddr, proto int) (*TCPListener, error) {
 	var ctrlCtxFn func(cxt context.Context, network, address string, c syscall.RawConn) error
 	if sl.ListenConfig.Control != nil {
 		ctrlCtxFn = func(cxt context.Context, network, address string, c syscall.RawConn) error {
 			return sl.ListenConfig.Control(network, address, c)
 		}
 	}
-	fd, err := internetSocket(ctx, sl.network, laddr, nil, syscall.SOCK_STREAM, 0, "listen", ctrlCtxFn)
+	fd, err := internetSocket(ctx, sl.network, laddr, nil, syscall.SOCK_STREAM, proto, "listen", ctrlCtxFn)
 	if err != nil {
 		return nil, err
 	}
diff --git a/src/net/tcpsock_test.go b/src/net/tcpsock_test.go
index 35a93d1..f720a22 100644
--- a/src/net/tcpsock_test.go
+++ b/src/net/tcpsock_test.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build !js
+//go:build !js && !wasip1
 
 package net
 
diff --git a/src/net/tcpsock_unix_test.go b/src/net/tcpsock_unix_test.go
index b14670b..35fd937 100644
--- a/src/net/tcpsock_unix_test.go
+++ b/src/net/tcpsock_unix_test.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build !js && !plan9 && !windows
+//go:build !js && !plan9 && !wasip1 && !windows
 
 package net
 
diff --git a/src/net/tcpsockopt_stub.go b/src/net/tcpsockopt_stub.go
index 0fe9182..f778143 100644
--- a/src/net/tcpsockopt_stub.go
+++ b/src/net/tcpsockopt_stub.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build js && wasm
+//go:build (js && wasm) || wasip1
 
 package net
 
diff --git a/src/net/textproto/reader.go b/src/net/textproto/reader.go
index 8e80008..fc2590b 100644
--- a/src/net/textproto/reader.go
+++ b/src/net/textproto/reader.go
@@ -479,23 +479,32 @@
 //		"Long-Key": {"Even Longer Value"},
 //	}
 func (r *Reader) ReadMIMEHeader() (MIMEHeader, error) {
-	return readMIMEHeader(r, math.MaxInt64)
+	return readMIMEHeader(r, math.MaxInt64, math.MaxInt64)
 }
 
 // readMIMEHeader is a version of ReadMIMEHeader which takes a limit on the header size.
 // It is called by the mime/multipart package.
-func readMIMEHeader(r *Reader, lim int64) (MIMEHeader, error) {
+func readMIMEHeader(r *Reader, maxMemory, maxHeaders int64) (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()
+	hint := r.upcomingHeaderKeys()
 	if hint > 0 {
+		if hint > 1000 {
+			hint = 1000 // set a cap to avoid overallocation
+		}
 		strs = make([]string, hint)
 	}
 
 	m := make(MIMEHeader, hint)
 
+	// Account for 400 bytes of overhead for the MIMEHeader, plus 200 bytes per entry.
+	// Benchmarking map creation as of go1.20, a one-entry MIMEHeader is 416 bytes and large
+	// MIMEHeaders average about 200 bytes per entry.
+	maxMemory -= 400
+	const mapEntryOverhead = 200
+
 	// The first line cannot start with a leading space.
 	if buf, err := r.R.Peek(1); err == nil && (buf[0] == ' ' || buf[0] == '\t') {
 		line, err := r.readLineSlice()
@@ -533,16 +542,21 @@
 			continue
 		}
 
+		maxHeaders--
+		if maxHeaders < 0 {
+			return nil, errors.New("message too large")
+		}
+
 		// Skip initial spaces in value.
 		value := string(bytes.TrimLeft(v, " \t"))
 
 		vv := m[key]
 		if vv == nil {
-			lim -= int64(len(key))
-			lim -= 100 // map entry overhead
+			maxMemory -= int64(len(key))
+			maxMemory -= mapEntryOverhead
 		}
-		lim -= int64(len(value))
-		if lim < 0 {
+		maxMemory -= int64(len(value))
+		if maxMemory < 0 {
 			// TODO: This should be a distinguishable error (ErrMessageTooLarge)
 			// to allow mime/multipart to detect it.
 			return m, errors.New("message too large")
@@ -581,9 +595,9 @@
 
 var nl = []byte("\n")
 
-// upcomingHeaderNewlines returns an approximation of the number of newlines
+// upcomingHeaderKeys returns an approximation of the number of keys
 // that will be in this header. If it gets confused, it returns 0.
-func (r *Reader) upcomingHeaderNewlines() (n int) {
+func (r *Reader) upcomingHeaderKeys() (n int) {
 	// Try to determine the 'hint' size.
 	r.R.Peek(1) // force a buffer load if empty
 	s := r.R.Buffered()
@@ -591,7 +605,20 @@
 		return
 	}
 	peek, _ := r.R.Peek(s)
-	return bytes.Count(peek, nl)
+	for len(peek) > 0 && n < 1000 {
+		var line []byte
+		line, peek, _ = bytes.Cut(peek, nl)
+		if len(line) == 0 || (len(line) == 1 && line[0] == '\r') {
+			// Blank line separating headers from the body.
+			break
+		}
+		if line[0] == ' ' || line[0] == '\t' {
+			// Folded continuation of the previous line.
+			continue
+		}
+		n++
+	}
+	return n
 }
 
 // CanonicalMIMEHeaderKey returns the canonical format of the
diff --git a/src/net/textproto/reader_test.go b/src/net/textproto/reader_test.go
index 9618b87..696ae40 100644
--- a/src/net/textproto/reader_test.go
+++ b/src/net/textproto/reader_test.go
@@ -10,6 +10,7 @@
 	"io"
 	"net"
 	"reflect"
+	"runtime"
 	"strings"
 	"sync"
 	"testing"
@@ -129,6 +130,42 @@
 	}
 }
 
+// TestReaderUpcomingHeaderKeys is testing an internal function, but it's very
+// difficult to test well via the external API.
+func TestReaderUpcomingHeaderKeys(t *testing.T) {
+	for _, test := range []struct {
+		input string
+		want  int
+	}{{
+		input: "",
+		want:  0,
+	}, {
+		input: "A: v",
+		want:  1,
+	}, {
+		input: "A: v\r\nB: v\r\n",
+		want:  2,
+	}, {
+		input: "A: v\nB: v\n",
+		want:  2,
+	}, {
+		input: "A: v\r\n  continued\r\n  still continued\r\nB: v\r\n\r\n",
+		want:  2,
+	}, {
+		input: "A: v\r\n\r\nB: v\r\nC: v\r\n",
+		want:  1,
+	}, {
+		input: "A: v" + strings.Repeat("\n", 1000),
+		want:  1,
+	}} {
+		r := reader(test.input)
+		got := r.upcomingHeaderKeys()
+		if test.want != got {
+			t.Fatalf("upcomingHeaderKeys(%q): %v; want %v", test.input, got, test.want)
+		}
+	}
+}
+
 func TestReadMIMEHeaderNoKey(t *testing.T) {
 	r := reader(": bar\ntest-1: 1\n\n")
 	m, err := r.ReadMIMEHeader()
@@ -271,6 +308,28 @@
 	}
 }
 
+// Test that reading a header doesn't overallocate. Issue 58975.
+func TestReadMIMEHeaderAllocations(t *testing.T) {
+	var totalAlloc uint64
+	const count = 200
+	for i := 0; i < count; i++ {
+		r := reader("A: b\r\n\r\n" + strings.Repeat("\n", 4096))
+		var m1, m2 runtime.MemStats
+		runtime.ReadMemStats(&m1)
+		_, err := r.ReadMIMEHeader()
+		if err != nil {
+			t.Fatalf("ReadMIMEHeader: %v", err)
+		}
+		runtime.ReadMemStats(&m2)
+		totalAlloc += m2.TotalAlloc - m1.TotalAlloc
+	}
+	// 32k is large and we actually allocate substantially less,
+	// but prior to the fix for #58975 we allocated ~400k in this case.
+	if got, want := totalAlloc/count, uint64(32768); got > want {
+		t.Fatalf("ReadMIMEHeader allocated %v bytes, want < %v", got, want)
+	}
+}
+
 type readResponseTest struct {
 	in       string
 	inCode   int
diff --git a/src/net/timeout_test.go b/src/net/timeout_test.go
index 832f40f..c0bce57 100644
--- a/src/net/timeout_test.go
+++ b/src/net/timeout_test.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build !js
+//go:build !js && !wasip1
 
 package net
 
@@ -24,18 +24,17 @@
 	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
-	{-1 << 63, 0, time.Second, 100 * time.Millisecond},
-	{0, -1 << 63, time.Second, 100 * time.Millisecond},
+	{-5 * time.Second, 0, -5 * time.Second},
+	{0, -5 * time.Second, -5 * time.Second},
+	{-5 * time.Second, 5 * time.Second, -5 * time.Second}, // timeout over deadline
+	{-1 << 63, 0, time.Second},
+	{0, -1 << 63, time.Second},
 
-	{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
+	{50 * time.Millisecond, 0, 100 * time.Millisecond},
+	{0, 50 * time.Millisecond, 100 * time.Millisecond},
+	{50 * time.Millisecond, 5 * time.Second, 100 * time.Millisecond}, // timeout over deadline
 }
 
 func TestDialTimeout(t *testing.T) {
@@ -59,35 +58,25 @@
 			})
 		}
 
-		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)
-			}
+		// 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()
+		}
+
+		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)
 		}
 	}
 }
@@ -646,7 +635,7 @@
 	minDynamicTimeout = 1 * time.Millisecond
 
 	// maxDynamicTimeout is the maximum timeout to attempt for
-	// tests that automatically increase timeouts until succeess.
+	// tests that automatically increase timeouts until success.
 	//
 	// This should be a strict upper bound on the latency required to hit a
 	// timeout accurately, even on a slow or heavily-loaded machine. If a test
@@ -823,10 +812,11 @@
 		t.Logf("SetWriteDeadline(+%v)", d)
 		t0 := time.Now()
 		deadline := t0.Add(d)
-		if err = c.SetWriteDeadline(deadline); err != nil {
+		if err := c.SetWriteDeadline(deadline); err != nil {
 			t.Fatalf("SetWriteDeadline(%v): %v", deadline, err)
 		}
 		var n int64
+		var err error
 		for {
 			var dn int
 			dn, err = c.Write([]byte("TIMEOUT TRANSMITTER"))
@@ -836,8 +826,8 @@
 			}
 		}
 		t1 := time.Now()
-
-		if err == nil || !err.(Error).Timeout() {
+		// Inv: err != nil
+		if !err.(Error).Timeout() {
 			t.Fatalf("Write did not return (any, timeout): (%d, %v)", n, err)
 		}
 		if perr := parseWriteError(err); perr != nil {
@@ -909,10 +899,6 @@
 }
 
 func testVariousDeadlines(t *testing.T) {
-	if runtime.GOOS == "plan9" {
-		t.Skip("skipping test on plan9; see golang.org/issue/26945")
-	}
-
 	handler := func(ls *localServer, ln Listener) {
 		for {
 			c, err := ln.Accept()
diff --git a/src/net/udpsock_posix.go b/src/net/udpsock_posix.go
index ffeec81..f3dbcfe 100644
--- a/src/net/udpsock_posix.go
+++ b/src/net/udpsock_posix.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build unix || (js && wasm) || windows
+//go:build unix || (js && wasm) || wasip1 || windows
 
 package net
 
diff --git a/src/net/udpsock_test.go b/src/net/udpsock_test.go
index 0ed2ff9..2afd4ac 100644
--- a/src/net/udpsock_test.go
+++ b/src/net/udpsock_test.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build !js
+//go:build !js && !wasip1
 
 package net
 
diff --git a/src/net/unixsock.go b/src/net/unixsock.go
index b38438c..14fbac0 100644
--- a/src/net/unixsock.go
+++ b/src/net/unixsock.go
@@ -12,7 +12,7 @@
 	"time"
 )
 
-// BUG(mikio): On JS and Plan 9, methods and functions related
+// BUG(mikio): On JS, WASIP1 and Plan 9, methods and functions related
 // to UnixConn and UnixListener are not implemented.
 
 // BUG(mikio): On Windows, methods and functions related to UnixConn
diff --git a/src/net/unixsock_posix.go b/src/net/unixsock_posix.go
index c16b483..c501b49 100644
--- a/src/net/unixsock_posix.go
+++ b/src/net/unixsock_posix.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build unix || (js && wasm) || windows
+//go:build unix || (js && wasm) || wasip1 || windows
 
 package net
 
diff --git a/src/net/unixsock_readmsg_other.go b/src/net/unixsock_readmsg_other.go
index b3d19fe..0899a6d 100644
--- a/src/net/unixsock_readmsg_other.go
+++ b/src/net/unixsock_readmsg_other.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build (js && wasm) || windows
+//go:build (js && wasm) || wasip1 || windows
 
 package net
 
diff --git a/src/net/unixsock_readmsg_test.go b/src/net/unixsock_readmsg_test.go
index 414f626..2d89dc4 100644
--- a/src/net/unixsock_readmsg_test.go
+++ b/src/net/unixsock_readmsg_test.go
@@ -7,6 +7,7 @@
 package net
 
 import (
+	"internal/syscall/unix"
 	"os"
 	"syscall"
 	"testing"
@@ -94,7 +95,7 @@
 		}
 	}()
 
-	flags, err := fcntl(gotFDs[0], syscall.F_GETFD, 0)
+	flags, err := unix.Fcntl(gotFDs[0], syscall.F_GETFD, 0)
 	if err != nil {
 		t.Fatalf("Can't get flags of fd:%#v, with err:%v", gotFDs[0], err)
 	}
diff --git a/src/net/unixsock_test.go b/src/net/unixsock_test.go
index 2fc9580..8402519 100644
--- a/src/net/unixsock_test.go
+++ b/src/net/unixsock_test.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build !js && !plan9 && !windows
+//go:build !js && !plan9 && !wasip1 && !windows
 
 package net
 
diff --git a/src/net/url/url.go b/src/net/url/url.go
index d530a50..501b263 100644
--- a/src/net/url/url.go
+++ b/src/net/url/url.go
@@ -859,7 +859,7 @@
 }
 
 // Redacted is like String but replaces any password with "xxxxx".
-// Only the password in u.URL is redacted.
+// Only the password in u.User is redacted.
 func (u *URL) Redacted() string {
 	if u == nil {
 		return ""
@@ -883,9 +883,6 @@
 // the empty string. To access multiple values, use the map
 // directly.
 func (v Values) Get(key string) string {
-	if v == nil {
-		return ""
-	}
 	vs := v[key]
 	if len(vs) == 0 {
 		return ""
diff --git a/src/net/url/url_test.go b/src/net/url/url_test.go
index 577cf63..23c5c58 100644
--- a/src/net/url/url_test.go
+++ b/src/net/url/url_test.go
@@ -1116,7 +1116,6 @@
 }
 
 func BenchmarkResolvePath(b *testing.B) {
-	b.ResetTimer()
 	b.ReportAllocs()
 	for i := 0; i < b.N; i++ {
 		resolvePath("a/b/c", ".././d")
diff --git a/src/net/writev_test.go b/src/net/writev_test.go
index c4efe9d..8722c0f 100644
--- a/src/net/writev_test.go
+++ b/src/net/writev_test.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build !js
+//go:build !js && !wasip1
 
 package net
 
diff --git a/src/os/dir_darwin.go b/src/os/dir_darwin.go
index deba3eb..e6d5bda 100644
--- a/src/os/dir_darwin.go
+++ b/src/os/dir_darwin.go
@@ -54,6 +54,15 @@
 		if entptr == nil { // EOF
 			break
 		}
+		// Darwin may return a zero inode when a directory entry has been
+		// deleted but not yet removed from the directory. The man page for
+		// getdirentries(2) states that programs are responsible for skipping
+		// those entries:
+		//
+		//   Users of getdirentries() should skip entries with d_fileno = 0,
+		//   as such entries represent files which have been deleted but not
+		//   yet removed from the directory entry.
+		//
 		if dirent.Ino == 0 {
 			continue
 		}
diff --git a/src/os/dir_plan9.go b/src/os/dir_plan9.go
index 8f6b0d6..6ea5940 100644
--- a/src/os/dir_plan9.go
+++ b/src/os/dir_plan9.go
@@ -6,6 +6,7 @@
 
 import (
 	"io"
+	"io/fs"
 	"syscall"
 )
 
@@ -79,3 +80,7 @@
 func (de dirEntry) IsDir() bool             { return de.fs.IsDir() }
 func (de dirEntry) Type() FileMode          { return de.fs.Mode().Type() }
 func (de dirEntry) Info() (FileInfo, error) { return de.fs, nil }
+
+func (de dirEntry) String() string {
+	return fs.FormatDirEntry(de)
+}
diff --git a/src/os/dir_unix.go b/src/os/dir_unix.go
index 9b3871a..266a78a 100644
--- a/src/os/dir_unix.go
+++ b/src/os/dir_unix.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build aix || dragonfly || freebsd || (js && wasm) || linux || netbsd || openbsd || solaris
+//go:build aix || dragonfly || freebsd || (js && wasm) || wasip1 || linux || netbsd || openbsd || solaris
 
 package os
 
@@ -89,7 +89,11 @@
 		if !ok {
 			break
 		}
-		if ino == 0 {
+		// When building to wasip1, the host runtime might be running on Windows
+		// or might expose a remote file system which does not have the concept
+		// of inodes. Therefore, we cannot make the assumption that it is safe
+		// to skip entries with zero inodes.
+		if ino == 0 && runtime.GOOS != "wasip1" {
 			continue
 		}
 		const namoff = uint64(unsafe.Offsetof(syscall.Dirent{}.Name))
diff --git a/src/os/dir_windows.go b/src/os/dir_windows.go
index 445e4f7..9dc2cd7 100644
--- a/src/os/dir_windows.go
+++ b/src/os/dir_windows.go
@@ -6,6 +6,7 @@
 
 import (
 	"io"
+	"io/fs"
 	"runtime"
 	"syscall"
 )
@@ -73,3 +74,7 @@
 func (de dirEntry) IsDir() bool             { return de.fs.IsDir() }
 func (de dirEntry) Type() FileMode          { return de.fs.Mode().Type() }
 func (de dirEntry) Info() (FileInfo, error) { return de.fs, nil }
+
+func (de dirEntry) String() string {
+	return fs.FormatDirEntry(de)
+}
diff --git a/src/os/dirent_wasip1.go b/src/os/dirent_wasip1.go
new file mode 100644
index 0000000..d3f10b2
--- /dev/null
+++ b/src/os/dirent_wasip1.go
@@ -0,0 +1,52 @@
+// Copyright 2023 The Go 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:build wasip1
+
+package os
+
+import (
+	"syscall"
+	"unsafe"
+)
+
+// https://github.com/WebAssembly/WASI/blob/main/legacy/preview1/docs.md#-dirent-record
+const sizeOfDirent = 24
+
+func direntIno(buf []byte) (uint64, bool) {
+	return readInt(buf, unsafe.Offsetof(syscall.Dirent{}.Ino), unsafe.Sizeof(syscall.Dirent{}.Ino))
+}
+
+func direntReclen(buf []byte) (uint64, bool) {
+	namelen, ok := direntNamlen(buf)
+	return sizeOfDirent + namelen, ok
+}
+
+func direntNamlen(buf []byte) (uint64, bool) {
+	return readInt(buf, unsafe.Offsetof(syscall.Dirent{}.Namlen), unsafe.Sizeof(syscall.Dirent{}.Namlen))
+}
+
+func direntType(buf []byte) FileMode {
+	off := unsafe.Offsetof(syscall.Dirent{}.Type)
+	if off >= uintptr(len(buf)) {
+		return ^FileMode(0) // unknown
+	}
+	switch syscall.Filetype(buf[off]) {
+	case syscall.FILETYPE_BLOCK_DEVICE:
+		return ModeDevice
+	case syscall.FILETYPE_CHARACTER_DEVICE:
+		return ModeDevice | ModeCharDevice
+	case syscall.FILETYPE_DIRECTORY:
+		return ModeDir
+	case syscall.FILETYPE_REGULAR_FILE:
+		return 0
+	case syscall.FILETYPE_SOCKET_DGRAM:
+		return ModeSocket
+	case syscall.FILETYPE_SOCKET_STREAM:
+		return ModeSocket
+	case syscall.FILETYPE_SYMBOLIC_LINK:
+		return ModeSymlink
+	}
+	return ^FileMode(0) // unknown
+}
diff --git a/src/os/env_test.go b/src/os/env_test.go
index f8d56ef..5809f4b 100644
--- a/src/os/env_test.go
+++ b/src/os/env_test.go
@@ -130,7 +130,7 @@
 	defer func(origEnv []string) {
 		for _, pair := range origEnv {
 			// Environment variables on Windows can begin with =
-			// https://blogs.msdn.com/b/oldnewthing/archive/2010/05/06/10008132.aspx
+			// https://devblogs.microsoft.com/oldnewthing/20100506-00/?p=14133
 			i := strings.Index(pair[1:], "=") + 1
 			if err := Setenv(pair[:i], pair[i+1:]); err != nil {
 				t.Errorf("Setenv(%q, %q) failed during reset: %v", pair[:i], pair[i+1:], err)
@@ -171,6 +171,8 @@
 // Check that they are properly reported by LookupEnv and can be set by SetEnv.
 // See https://golang.org/issue/49886.
 func TestEnvironConsistency(t *testing.T) {
+	t.Parallel()
+
 	for _, kv := range Environ() {
 		i := strings.Index(kv, "=")
 		if i == 0 {
diff --git a/src/os/error.go b/src/os/error.go
index 9827446..62ede9d 100644
--- a/src/os/error.go
+++ b/src/os/error.go
@@ -31,7 +31,7 @@
 
 // errDeadlineExceeded returns the value for os.ErrDeadlineExceeded.
 // This error comes from the internal/poll package, which is also
-// used by package net. Doing this this way ensures that the net
+// used by package net. Doing it this way ensures that the net
 // package will return os.ErrDeadlineExceeded for an exceeded deadline,
 // as documented by net.Conn.SetDeadline, without requiring any extra
 // work in the net package and without requiring the internal/poll
diff --git a/src/os/error_posix.go b/src/os/error_posix.go
index 5ca2e60..b159c03 100644
--- a/src/os/error_posix.go
+++ b/src/os/error_posix.go
@@ -2,14 +2,14 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build unix || (js && wasm) || windows
+//go:build unix || (js && wasm) || wasip1 || windows
 
 package os
 
 import "syscall"
 
 // wrapSyscallError takes an error and a syscall name. If the error is
-// a syscall.Errno, it wraps it in a os.SyscallError using the syscall name.
+// a syscall.Errno, it wraps it in an os.SyscallError using the syscall name.
 func wrapSyscallError(name string, err error) error {
 	if _, ok := err.(syscall.Errno); ok {
 		err = NewSyscallError(name, err)
diff --git a/src/os/error_test.go b/src/os/error_test.go
index 4ab6246..8f82ae6 100644
--- a/src/os/error_test.go
+++ b/src/os/error_test.go
@@ -14,6 +14,8 @@
 )
 
 func TestErrIsExist(t *testing.T) {
+	t.Parallel()
+
 	f, err := os.CreateTemp("", "_Go_ErrIsExist")
 	if err != nil {
 		t.Fatalf("open ErrIsExist tempfile: %s", err)
@@ -25,11 +27,9 @@
 	if err == nil {
 		f2.Close()
 		t.Fatal("Open should have failed")
-		return
 	}
 	if s := checkErrorPredicate("os.IsExist", os.IsExist, err, fs.ErrExist); s != "" {
 		t.Fatal(s)
-		return
 	}
 }
 
@@ -66,13 +66,11 @@
 	name := filepath.Join(tmpDir, "NotExists")
 	if s := testErrNotExist(t, name); s != "" {
 		t.Fatal(s)
-		return
 	}
 
 	name = filepath.Join(name, "NotExists2")
 	if s := testErrNotExist(t, name); s != "" {
 		t.Fatal(s)
-		return
 	}
 }
 
@@ -148,6 +146,8 @@
 }
 
 func TestErrPathNUL(t *testing.T) {
+	t.Parallel()
+
 	f, err := os.CreateTemp("", "_Go_ErrPathNUL\x00")
 	if err == nil {
 		f.Close()
diff --git a/src/os/error_unix_test.go b/src/os/error_unix_test.go
index 1c694fe..07a3286 100644
--- a/src/os/error_unix_test.go
+++ b/src/os/error_unix_test.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build unix || (js && wasm)
+//go:build unix || (js && wasm) || wasip1
 
 package os_test
 
diff --git a/src/os/example_test.go b/src/os/example_test.go
index 53e3c52..5c7c6ea 100644
--- a/src/os/example_test.go
+++ b/src/os/example_test.go
@@ -255,7 +255,7 @@
 
 func ExampleMkdirAll() {
 	err := os.MkdirAll("test/subdir", 0750)
-	if err != nil && !os.IsExist(err) {
+	if err != nil {
 		log.Fatal(err)
 	}
 	err = os.WriteFile("test/subdir/testfile.txt", []byte("Hello, Gophers!"), 0660)
diff --git a/src/os/exec.go b/src/os/exec.go
index d01ca59..ed5a75c 100644
--- a/src/os/exec.go
+++ b/src/os/exec.go
@@ -86,7 +86,9 @@
 // about the underlying operating system process.
 //
 // On Unix systems, FindProcess always succeeds and returns a Process
-// for the given pid, regardless of whether the process exists.
+// for the given pid, regardless of whether the process exists. To test whether
+// the process actually exists, see whether p.Signal(syscall.Signal(0)) reports
+// an error.
 func FindProcess(pid int) (*Process, error) {
 	return findProcess(pid)
 }
diff --git a/src/os/exec/exec.go b/src/os/exec/exec.go
index 2f4bdff..138be29 100644
--- a/src/os/exec/exec.go
+++ b/src/os/exec/exec.go
@@ -348,7 +348,7 @@
 	timer *time.Timer
 }
 
-var execwait = godebug.New("execwait")
+var execwait = godebug.New("#execwait")
 var execerrdot = godebug.New("execerrdot")
 
 // Command returns the Cmd struct to execute the named program with
diff --git a/src/os/exec/exec_test.go b/src/os/exec/exec_test.go
index 67e2d25..473f92b 100644
--- a/src/os/exec/exec_test.go
+++ b/src/os/exec/exec_test.go
@@ -694,7 +694,7 @@
 
 	// This test runs with cgo disabled. External linking needs cgo, so
 	// it doesn't work if external linking is required.
-	testenv.MustInternalLink(t)
+	testenv.MustInternalLink(t, false)
 
 	if runtime.GOOS == "windows" {
 		t.Skipf("skipping test on %q", runtime.GOOS)
@@ -752,7 +752,7 @@
 	tempdir := t.TempDir()
 	exe := filepath.Join(tempdir, "read3.exe")
 
-	c := exec.Command(testenv.GoToolPath(t), "build", "-o", exe, "read3.go")
+	c := testenv.Command(t, testenv.GoToolPath(t), "build", "-o", exe, "read3.go")
 	// Build the test without cgo, so that C library functions don't
 	// open descriptors unexpectedly. See issue 25628.
 	c.Env = append(os.Environ(), "CGO_ENABLED=0")
@@ -1039,7 +1039,7 @@
 
 func TestEnvNULCharacter(t *testing.T) {
 	if runtime.GOOS == "plan9" {
-		t.Skip("plan9 explicitly allows NUL in the enviroment")
+		t.Skip("plan9 explicitly allows NUL in the environment")
 	}
 	cmd := helperCommand(t, "echoenv", "FOO", "BAR")
 	cmd.Env = append(cmd.Environ(), "FOO=foo\x00BAR=bar")
@@ -1708,3 +1708,77 @@
 		}
 	})
 }
+
+// TestConcurrentExec is a regression test for https://go.dev/issue/61080.
+//
+// Forking multiple child processes concurrently would sometimes hang on darwin.
+// (This test hung on a gomote with -count=100 after only a few iterations.)
+func TestConcurrentExec(t *testing.T) {
+	ctx, cancel := context.WithCancel(context.Background())
+
+	// This test will spawn nHangs subprocesses that hang reading from stdin,
+	// and nExits subprocesses that exit immediately.
+	//
+	// When issue #61080 was present, a long-lived "hang" subprocess would
+	// occasionally inherit the fork/exec status pipe from an "exit" subprocess,
+	// causing the parent process (which expects to see an EOF on that pipe almost
+	// immediately) to unexpectedly block on reading from the pipe.
+	var (
+		nHangs       = runtime.GOMAXPROCS(0)
+		nExits       = runtime.GOMAXPROCS(0)
+		hangs, exits sync.WaitGroup
+	)
+	hangs.Add(nHangs)
+	exits.Add(nExits)
+
+	// ready is done when the goroutines have done as much work as possible to
+	// prepare to create subprocesses. It isn't strictly necessary for the test,
+	// but helps to increase the repro rate by making it more likely that calls to
+	// syscall.StartProcess for the "hang" and "exit" goroutines overlap.
+	var ready sync.WaitGroup
+	ready.Add(nHangs + nExits)
+
+	for i := 0; i < nHangs; i++ {
+		go func() {
+			defer hangs.Done()
+
+			cmd := helperCommandContext(t, ctx, "pipetest")
+			stdin, err := cmd.StdinPipe()
+			if err != nil {
+				ready.Done()
+				t.Error(err)
+				return
+			}
+			cmd.Cancel = stdin.Close
+			ready.Done()
+
+			ready.Wait()
+			if err := cmd.Start(); err != nil {
+				if !errors.Is(err, context.Canceled) {
+					t.Error(err)
+				}
+				return
+			}
+
+			cmd.Wait()
+		}()
+	}
+
+	for i := 0; i < nExits; i++ {
+		go func() {
+			defer exits.Done()
+
+			cmd := helperCommandContext(t, ctx, "exit", "0")
+			ready.Done()
+
+			ready.Wait()
+			if err := cmd.Run(); err != nil {
+				t.Error(err)
+			}
+		}()
+	}
+
+	exits.Wait()
+	cancel()
+	hangs.Wait()
+}
diff --git a/src/os/exec/exec_windows_test.go b/src/os/exec/exec_windows_test.go
index b39790d..efd3710 100644
--- a/src/os/exec/exec_windows_test.go
+++ b/src/os/exec/exec_windows_test.go
@@ -8,6 +8,7 @@
 
 import (
 	"fmt"
+	"internal/testenv"
 	"io"
 	"os"
 	"os/exec"
@@ -69,7 +70,7 @@
 func TestNoInheritHandles(t *testing.T) {
 	t.Parallel()
 
-	cmd := exec.Command("cmd", "/c exit 88")
+	cmd := testenv.Command(t, "cmd", "/c exit 88")
 	cmd.SysProcAttr = &syscall.SysProcAttr{NoInheritHandles: true}
 	err := cmd.Run()
 	exitError, ok := err.(*exec.ExitError)
diff --git a/src/os/exec/internal/fdtest/exists_js.go b/src/os/exec/internal/fdtest/exists_js.go
deleted file mode 100644
index a7ce33c..0000000
--- a/src/os/exec/internal/fdtest/exists_js.go
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2021 The Go 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:build js
-
-package fdtest
-
-import (
-	"syscall"
-)
-
-// Exists returns true if fd is a valid file descriptor.
-func Exists(fd uintptr) bool {
-	var s syscall.Stat_t
-	err := syscall.Fstat(int(fd), &s)
-	return err != syscall.EBADF
-}
diff --git a/src/os/exec/internal/fdtest/exists_unix.go b/src/os/exec/internal/fdtest/exists_unix.go
index 265cb69..472a802 100644
--- a/src/os/exec/internal/fdtest/exists_unix.go
+++ b/src/os/exec/internal/fdtest/exists_unix.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build unix
+//go:build unix || wasm
 
 // Package fdtest provides test helpers for working with file descriptors across exec.
 package fdtest
diff --git a/src/os/exec/lp_js.go b/src/os/exec/lp_js.go
deleted file mode 100644
index 54ddc4d..0000000
--- a/src/os/exec/lp_js.go
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2018 The Go 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:build js && wasm
-
-package exec
-
-import (
-	"errors"
-)
-
-// 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")
-
-// LookPath searches for an executable 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) {
-	// Wasm can not execute processes, so act as if there are no executables at all.
-	return "", &Error{file, ErrNotFound}
-}
diff --git a/src/os/exec/lp_linux_test.go b/src/os/exec/lp_linux_test.go
index 845573f..60cb13e 100644
--- a/src/os/exec/lp_linux_test.go
+++ b/src/os/exec/lp_linux_test.go
@@ -2,12 +2,14 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-package exec
+package exec_test
 
 import (
 	"errors"
 	"internal/syscall/unix"
+	"internal/testenv"
 	"os"
+	"os/exec"
 	"path/filepath"
 	"syscall"
 	"testing"
@@ -25,10 +27,12 @@
 
 	// Create a tmpfs mount.
 	err := syscall.Mount("tmpfs", tmp, "tmpfs", 0, "")
-	if err != nil {
+	if testenv.SyscallIsNotSupported(err) {
 		// Usually this means lack of CAP_SYS_ADMIN, but there might be
 		// other reasons, especially in restricted test environments.
 		t.Skipf("requires ability to mount tmpfs (%v)", err)
+	} else if err != nil {
+		t.Fatalf("mount %s failed: %v", tmp, err)
 	}
 	t.Cleanup(func() {
 		if err := syscall.Unmount(tmp, 0); err != nil {
@@ -44,13 +48,13 @@
 	}
 
 	// Check that it works as expected.
-	err = findExecutable(path)
+	_, err = exec.LookPath(path)
 	if err != nil {
 		t.Fatalf("findExecutable: got %v, want nil", err)
 	}
 
 	for {
-		err = Command(path).Run()
+		err = exec.Command(path).Run()
 		if err == nil {
 			break
 		}
@@ -67,16 +71,18 @@
 
 	// Remount with noexec flag.
 	err = syscall.Mount("", tmp, "", syscall.MS_REMOUNT|syscall.MS_NOEXEC, "")
-	if err != nil {
+	if testenv.SyscallIsNotSupported(err) {
+		t.Skipf("requires ability to re-mount tmpfs (%v)", err)
+	} else if err != nil {
 		t.Fatalf("remount %s with noexec failed: %v", tmp, err)
 	}
 
-	if err := Command(path).Run(); err == nil {
+	if err := exec.Command(path).Run(); err == nil {
 		t.Fatal("exec on noexec filesystem: got nil, want error")
 	}
 
-	err = findExecutable(path)
+	_, err = exec.LookPath(path)
 	if err == nil {
-		t.Fatalf("findExecutable: got nil, want error")
+		t.Fatalf("LookPath: got nil, want error")
 	}
 }
diff --git a/src/os/exec/lp_plan9.go b/src/os/exec/lp_plan9.go
index 59538d9..9344b14 100644
--- a/src/os/exec/lp_plan9.go
+++ b/src/os/exec/lp_plan9.go
@@ -53,8 +53,11 @@
 	for _, dir := range filepath.SplitList(path) {
 		path := filepath.Join(dir, file)
 		if err := findExecutable(path); err == nil {
-			if !filepath.IsAbs(path) && execerrdot.Value() != "0" {
-				return path, &Error{file, ErrDot}
+			if !filepath.IsAbs(path) {
+				if execerrdot.Value() != "0" {
+					return path, &Error{file, ErrDot}
+				}
+				execerrdot.IncNonDefault()
 			}
 			return path, nil
 		}
diff --git a/src/os/exec/lp_unix.go b/src/os/exec/lp_unix.go
index 2af9b01..fd2c6ef 100644
--- a/src/os/exec/lp_unix.go
+++ b/src/os/exec/lp_unix.go
@@ -69,8 +69,11 @@
 		}
 		path := filepath.Join(dir, file)
 		if err := findExecutable(path); err == nil {
-			if !filepath.IsAbs(path) && execerrdot.Value() != "0" {
-				return path, &Error{file, ErrDot}
+			if !filepath.IsAbs(path) {
+				if execerrdot.Value() != "0" {
+					return path, &Error{file, ErrDot}
+				}
+				execerrdot.IncNonDefault()
 			}
 			return path, nil
 		}
diff --git a/src/os/exec/lp_wasm.go b/src/os/exec/lp_wasm.go
new file mode 100644
index 0000000..f2c8e9c
--- /dev/null
+++ b/src/os/exec/lp_wasm.go
@@ -0,0 +1,23 @@
+// Copyright 2018 The Go 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:build wasm
+
+package exec
+
+import (
+	"errors"
+)
+
+// 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")
+
+// LookPath searches for an executable 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) {
+	// Wasm can not execute processes, so act as if there are no executables at all.
+	return "", &Error{file, ErrNotFound}
+}
diff --git a/src/os/exec/lp_windows.go b/src/os/exec/lp_windows.go
index 97bfa58..066d38d 100644
--- a/src/os/exec/lp_windows.go
+++ b/src/os/exec/lp_windows.go
@@ -103,6 +103,7 @@
 	if _, found := syscall.Getenv("NoDefaultCurrentDirectoryInExePath"); !found {
 		if f, err := findExecutable(filepath.Join(".", file), exts); err == nil {
 			if execerrdot.Value() == "0" {
+				execerrdot.IncNonDefault()
 				return f, nil
 			}
 			dotf, dotErr = f, &Error{file, ErrDot}
@@ -127,8 +128,11 @@
 				}
 			}
 
-			if !filepath.IsAbs(f) && execerrdot.Value() != "0" {
-				return f, &Error{file, ErrDot}
+			if !filepath.IsAbs(f) {
+				if execerrdot.Value() != "0" {
+					return f, &Error{file, ErrDot}
+				}
+				execerrdot.IncNonDefault()
 			}
 			return f, nil
 		}
diff --git a/src/os/exec/lp_windows_test.go b/src/os/exec/lp_windows_test.go
index d797b6c..4d85a5f 100644
--- a/src/os/exec/lp_windows_test.go
+++ b/src/os/exec/lp_windows_test.go
@@ -164,7 +164,7 @@
 	// Run "cmd.exe /c test.searchFor" with new environment and
 	// work directory set. All candidates are copies of printpath.exe.
 	// These will output their program paths when run.
-	should, errCmd := test.runProg(t, env, exec.Command("cmd", "/c", test.searchFor))
+	should, errCmd := test.runProg(t, env, testenv.Command(t, "cmd", "/c", test.searchFor))
 	// Run the lookpath program with new environment and work directory set.
 	have, errLP := test.runProg(t, env, helperCommand(t, "lookpath", test.searchFor))
 	// Compare results.
@@ -572,7 +572,7 @@
 		t.Fatalf("failed to execute template: %v", err)
 	}
 	outname := name + ".exe"
-	cmd := exec.Command(testenv.GoToolPath(t), "build", "-o", outname, srcname)
+	cmd := testenv.Command(t, testenv.GoToolPath(t), "build", "-o", outname, srcname)
 	cmd.Dir = dir
 	out, err := cmd.CombinedOutput()
 	if err != nil {
@@ -587,7 +587,6 @@
 import (
 	"os"
 	"syscall"
-	"unicode/utf16"
 	"unsafe"
 )
 
@@ -599,7 +598,7 @@
 	if n == 0 {
 		return "", err
 	}
-	return string(utf16.Decode(b[0:n])), nil
+	return syscall.UTF16ToString(b[0:n]), nil
 }
 
 func main() {
diff --git a/src/os/exec_posix.go b/src/os/exec_posix.go
index e1e7d53..a512d51 100644
--- a/src/os/exec_posix.go
+++ b/src/os/exec_posix.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build unix || (js && wasm) || windows
+//go:build unix || (js && wasm) || wasip1 || windows
 
 package os
 
diff --git a/src/os/exec_unix.go b/src/os/exec_unix.go
index 90a4a61..f9063b4 100644
--- a/src/os/exec_unix.go
+++ b/src/os/exec_unix.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build unix || (js && wasm)
+//go:build unix || (js && wasm) || wasip1
 
 package os
 
diff --git a/src/os/exec_unix_test.go b/src/os/exec_unix_test.go
index 332ffe9..2604519 100644
--- a/src/os/exec_unix_test.go
+++ b/src/os/exec_unix_test.go
@@ -9,16 +9,15 @@
 import (
 	"internal/testenv"
 	. "os"
+	"syscall"
 	"testing"
 )
 
 func TestErrProcessDone(t *testing.T) {
 	testenv.MustHaveGoBuild(t)
-	path, err := testenv.GoTool()
-	if err != nil {
-		t.Errorf("finding go tool: %v", err)
-	}
-	p, err := StartProcess(path, []string{"go"}, &ProcAttr{})
+	t.Parallel()
+
+	p, err := StartProcess(testenv.GoToolPath(t), []string{"go"}, &ProcAttr{})
 	if err != nil {
 		t.Errorf("starting test process: %v", err)
 	}
@@ -27,3 +26,20 @@
 		t.Errorf("got %v want %v", got, ErrProcessDone)
 	}
 }
+
+func TestUNIXProcessAlive(t *testing.T) {
+	testenv.MustHaveGoBuild(t)
+	t.Parallel()
+
+	p, err := StartProcess(testenv.GoToolPath(t), []string{"sleep", "1"}, &ProcAttr{})
+	if err != nil {
+		t.Skipf("starting test process: %v", err)
+	}
+	defer p.Kill()
+
+	proc, _ := FindProcess(p.Pid)
+	err = proc.Signal(syscall.Signal(0))
+	if err != nil {
+		t.Errorf("OS reported error for running process: %v", err)
+	}
+}
diff --git a/src/os/executable_procfs.go b/src/os/executable_procfs.go
index 18348ea..94e674e 100644
--- a/src/os/executable_procfs.go
+++ b/src/os/executable_procfs.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build linux || netbsd || (js && wasm)
+//go:build linux || netbsd
 
 package os
 
diff --git a/src/os/executable_test.go b/src/os/executable_test.go
index b69fe41..c835bb4 100644
--- a/src/os/executable_test.go
+++ b/src/os/executable_test.go
@@ -8,7 +8,6 @@
 	"fmt"
 	"internal/testenv"
 	"os"
-	osexec "os/exec"
 	"path/filepath"
 	"runtime"
 	"testing"
@@ -18,6 +17,8 @@
 
 func TestExecutable(t *testing.T) {
 	testenv.MustHaveExec(t)
+	t.Parallel()
+
 	ep, err := os.Executable()
 	if err != nil {
 		t.Fatalf("Executable failed: %v", err)
@@ -29,18 +30,18 @@
 		t.Fatalf("filepath.Rel: %v", err)
 	}
 
-	cmd := &osexec.Cmd{}
+	cmd := testenv.Command(t, fn, "-test.run=XXXX")
 	// make child start with a relative program path
 	cmd.Dir = dir
 	cmd.Path = fn
-	// forge argv[0] for child, so that we can verify we could correctly
-	// get real path of the executable without influenced by argv[0].
-	cmd.Args = []string{"-", "-test.run=XXXX"}
 	if runtime.GOOS == "openbsd" || runtime.GOOS == "aix" {
 		// OpenBSD and AIX rely on argv[0]
-		cmd.Args[0] = fn
+	} else {
+		// forge argv[0] for child, so that we can verify we could correctly
+		// get real path of the executable without influenced by argv[0].
+		cmd.Args[0] = "-"
 	}
-	cmd.Env = append(os.Environ(), fmt.Sprintf("%s=1", executable_EnvVar))
+	cmd.Env = append(cmd.Environ(), fmt.Sprintf("%s=1", executable_EnvVar))
 	out, err := cmd.CombinedOutput()
 	if err != nil {
 		t.Fatalf("exec(self) failed: %v", err)
@@ -88,13 +89,14 @@
 }
 
 func TestExecutableDeleted(t *testing.T) {
-	testenv.MustHaveExec(t)
+	testenv.MustHaveGoBuild(t)
 	switch runtime.GOOS {
 	case "windows", "plan9":
 		t.Skipf("%v does not support deleting running binary", runtime.GOOS)
 	case "openbsd", "freebsd", "aix":
 		t.Skipf("%v does not support reading deleted binary name", runtime.GOOS)
 	}
+	t.Parallel()
 
 	dir := t.TempDir()
 
diff --git a/src/os/executable_wasm.go b/src/os/executable_wasm.go
new file mode 100644
index 0000000..a88360c
--- /dev/null
+++ b/src/os/executable_wasm.go
@@ -0,0 +1,16 @@
+// Copyright 2023 The Go 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:build wasm
+
+package os
+
+import (
+	"errors"
+	"runtime"
+)
+
+func executable() (string, error) {
+	return "", errors.New("Executable not implemented for " + runtime.GOOS)
+}
diff --git a/src/os/export_linux_test.go b/src/os/export_linux_test.go
index d947d05..3fd5e61 100644
--- a/src/os/export_linux_test.go
+++ b/src/os/export_linux_test.go
@@ -4,4 +4,8 @@
 
 package os
 
-var PollCopyFileRangeP = &pollCopyFileRange
+var (
+	PollCopyFileRangeP = &pollCopyFileRange
+	PollSpliceFile     = &pollSplice
+	GetPollFDForTest   = getPollFD
+)
diff --git a/src/os/export_test.go b/src/os/export_test.go
index f3cb1a2..dc7caae 100644
--- a/src/os/export_test.go
+++ b/src/os/export_test.go
@@ -11,3 +11,7 @@
 var ErrWriteAtInAppendMode = errWriteAtInAppendMode
 var TestingForceReadDirLstat = &testingForceReadDirLstat
 var ErrPatternHasSeparator = errPatternHasSeparator
+
+func init() {
+	checkWrapErr = true
+}
diff --git a/src/os/export_unix_test.go b/src/os/export_unix_test.go
index 49c8dae..b8dcca0 100644
--- a/src/os/export_unix_test.go
+++ b/src/os/export_unix_test.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build unix || (js && wasm)
+//go:build unix || (js && wasm) || wasip1
 
 package os
 
diff --git a/src/os/fifo_test.go b/src/os/fifo_test.go
index de70927..df4b2ee 100644
--- a/src/os/fifo_test.go
+++ b/src/os/fifo_test.go
@@ -2,30 +2,25 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build darwin || dragonfly || freebsd || linux || netbsd || openbsd
+//go:build darwin || dragonfly || freebsd || (linux && !android) || netbsd || openbsd
 
 package os_test
 
 import (
-	"bufio"
-	"bytes"
-	"fmt"
-	"io"
+	"errors"
+	"internal/syscall/unix"
+	"internal/testenv"
+	"io/fs"
 	"os"
 	"path/filepath"
-	"runtime"
+	"strconv"
 	"sync"
 	"syscall"
 	"testing"
-	"time"
 )
 
-// Issue 24164.
 func TestFifoEOF(t *testing.T) {
-	switch runtime.GOOS {
-	case "android":
-		t.Skip("skipping on Android; mkfifo syscall not available")
-	}
+	t.Parallel()
 
 	dir := t.TempDir()
 	fifoName := filepath.Join(dir, "fifo")
@@ -33,71 +28,180 @@
 		t.Fatal(err)
 	}
 
-	var wg sync.WaitGroup
-	wg.Add(1)
-	go func() {
-		defer wg.Done()
+	// Per https://pubs.opengroup.org/onlinepubs/9699919799/functions/open.html#tag_16_357_03:
+	//
+	// - “If O_NONBLOCK is clear, an open() for reading-only shall block the
+	//   calling thread until a thread opens the file for writing. An open() for
+	//   writing-only shall block the calling thread until a thread opens the file
+	//   for reading.”
+	//
+	// In order to unblock both open calls, we open the two ends of the FIFO
+	// simultaneously in separate goroutines.
 
-		w, err := os.OpenFile(fifoName, os.O_WRONLY, 0)
+	rc := make(chan *os.File, 1)
+	go func() {
+		r, err := os.Open(fifoName)
 		if err != nil {
 			t.Error(err)
-			return
 		}
-
-		defer func() {
-			if err := w.Close(); err != nil {
-				t.Errorf("error closing writer: %v", err)
-			}
-		}()
-
-		for i := 0; i < 3; i++ {
-			time.Sleep(10 * time.Millisecond)
-			_, err := fmt.Fprintf(w, "line %d\n", i)
-			if err != nil {
-				t.Errorf("error writing to fifo: %v", err)
-				return
-			}
-		}
-		time.Sleep(10 * time.Millisecond)
+		rc <- r
 	}()
 
-	defer wg.Wait()
-
-	r, err := os.Open(fifoName)
+	w, err := os.OpenFile(fifoName, os.O_WRONLY, 0)
 	if err != nil {
-		t.Fatal(err)
+		t.Error(err)
 	}
 
-	done := make(chan bool)
+	r := <-rc
+	if t.Failed() {
+		if r != nil {
+			r.Close()
+		}
+		if w != nil {
+			w.Close()
+		}
+		return
+	}
+
+	testPipeEOF(t, r, w)
+}
+
+// Issue #59545.
+func TestNonPollable(t *testing.T) {
+	if testing.Short() {
+		t.Skip("skipping test with tight loops in short mode")
+	}
+
+	// We need to open a non-pollable file.
+	// This is almost certainly Linux-specific,
+	// but if other systems have non-pollable files,
+	// we can add them here.
+	const nonPollable = "/dev/net/tun"
+
+	f, err := os.OpenFile(nonPollable, os.O_RDWR, 0)
+	if err != nil {
+		if errors.Is(err, fs.ErrNotExist) || errors.Is(err, fs.ErrPermission) || testenv.SyscallIsNotSupported(err) {
+			t.Skipf("can't open %q: %v", nonPollable, err)
+		}
+		t.Fatal(err)
+	}
+	f.Close()
+
+	// On a Linux laptop, before the problem was fixed,
+	// this test failed about 50% of the time with this
+	// number of iterations.
+	// It takes about 1/2 second when it passes.
+	const attempts = 20000
+
+	start := make(chan bool)
+	var wg sync.WaitGroup
+	wg.Add(1)
+	defer wg.Wait()
 	go func() {
-		defer close(done)
-
-		defer func() {
-			if err := r.Close(); err != nil {
-				t.Errorf("error closing reader: %v", err)
-			}
-		}()
-
-		rbuf := bufio.NewReader(r)
-		for {
-			b, err := rbuf.ReadBytes('\n')
-			if err == io.EOF {
-				break
-			}
+		defer wg.Done()
+		close(start)
+		for i := 0; i < attempts; i++ {
+			f, err := os.OpenFile(nonPollable, os.O_RDWR, 0)
 			if err != nil {
 				t.Error(err)
 				return
 			}
-			t.Logf("%s\n", bytes.TrimSpace(b))
+			if err := f.Close(); err != nil {
+				t.Error(err)
+				return
+			}
 		}
 	}()
 
-	select {
-	case <-done:
-		// Test succeeded.
-	case <-time.After(time.Second):
-		t.Error("timed out waiting for read")
-		// Close the reader to force the read to complete.
-		r.Close()
+	dir := t.TempDir()
+	<-start
+	for i := 0; i < attempts; i++ {
+		name := filepath.Join(dir, strconv.Itoa(i))
+		if err := syscall.Mkfifo(name, 0o600); err != nil {
+			t.Fatal(err)
+		}
+		// The problem only occurs if we use O_NONBLOCK here.
+		rd, err := os.OpenFile(name, os.O_RDONLY|syscall.O_NONBLOCK, 0o600)
+		if err != nil {
+			t.Fatal(err)
+		}
+		wr, err := os.OpenFile(name, os.O_WRONLY|syscall.O_NONBLOCK, 0o600)
+		if err != nil {
+			t.Fatal(err)
+		}
+		const msg = "message"
+		if _, err := wr.Write([]byte(msg)); err != nil {
+			if errors.Is(err, syscall.EAGAIN) || errors.Is(err, syscall.ENOBUFS) {
+				t.Logf("ignoring write error %v", err)
+				rd.Close()
+				wr.Close()
+				continue
+			}
+			t.Fatalf("write to fifo %d failed: %v", i, err)
+		}
+		if _, err := rd.Read(make([]byte, len(msg))); err != nil {
+			if errors.Is(err, syscall.EAGAIN) || errors.Is(err, syscall.ENOBUFS) {
+				t.Logf("ignoring read error %v", err)
+				rd.Close()
+				wr.Close()
+				continue
+			}
+			t.Fatalf("read from fifo %d failed; %v", i, err)
+		}
+		if err := rd.Close(); err != nil {
+			t.Fatal(err)
+		}
+		if err := wr.Close(); err != nil {
+			t.Fatal(err)
+		}
+	}
+}
+
+// Issue 60211.
+func TestOpenFileNonBlocking(t *testing.T) {
+	exe, err := os.Executable()
+	if err != nil {
+		t.Skipf("can't find executable: %v", err)
+	}
+	f, err := os.OpenFile(exe, os.O_RDONLY|syscall.O_NONBLOCK, 0666)
+	if err != nil {
+		t.Fatal(err)
+	}
+	defer f.Close()
+	nonblock, err := unix.IsNonblock(int(f.Fd()))
+	if err != nil {
+		t.Fatal(err)
+	}
+	if !nonblock {
+		t.Errorf("file opened with O_NONBLOCK but in blocking mode")
+	}
+}
+
+func TestNewFileNonBlocking(t *testing.T) {
+	var p [2]int
+	if err := syscall.Pipe(p[:]); err != nil {
+		t.Fatal(err)
+	}
+	if err := syscall.SetNonblock(p[0], true); err != nil {
+		t.Fatal(err)
+	}
+	f := os.NewFile(uintptr(p[0]), "pipe")
+	nonblock, err := unix.IsNonblock(p[0])
+	if err != nil {
+		t.Fatal(err)
+	}
+	if !nonblock {
+		t.Error("pipe blocking after NewFile")
+	}
+	fd := f.Fd()
+	if fd != uintptr(p[0]) {
+		t.Errorf("Fd returned %d, want %d", fd, p[0])
+	}
+	nonblock, err = unix.IsNonblock(p[0])
+	if err != nil {
+		t.Fatal(err)
+	}
+	if !nonblock {
+		t.Error("pipe blocking after Fd")
 	}
 }
diff --git a/src/os/file.go b/src/os/file.go
index 3d71ac0..7fd2f5d 100644
--- a/src/os/file.go
+++ b/src/os/file.go
@@ -158,11 +158,19 @@
 }
 
 func genericReadFrom(f *File, r io.Reader) (int64, error) {
-	return io.Copy(onlyWriter{f}, r)
+	return io.Copy(fileWithoutReadFrom{f}, r)
 }
 
-type onlyWriter struct {
-	io.Writer
+// fileWithoutReadFrom implements all the methods of *File other
+// than ReadFrom. This is used to permit ReadFrom to call io.Copy
+// without leading to a recursive call to ReadFrom.
+type fileWithoutReadFrom struct {
+	*File
+}
+
+// This ReadFrom method hides the *File ReadFrom method.
+func (fileWithoutReadFrom) ReadFrom(fileWithoutReadFrom) {
+	panic("unreachable")
 }
 
 // Write writes len(b) bytes from b to the File.
@@ -353,6 +361,10 @@
 	return n, err
 }
 
+// checkWrapErr is the test hook to enable checking unexpected wrapped errors of poll.ErrFileClosing.
+// It is set to true in the export_test.go for tests (including fuzz tests).
+var checkWrapErr = false
+
 // wrapErr wraps an error that occurred during an operation on an open file.
 // It passes io.EOF through unchanged, otherwise converts
 // poll.ErrFileClosing to ErrClosed and wraps the error in a PathError.
@@ -362,6 +374,8 @@
 	}
 	if err == poll.ErrFileClosing {
 		err = ErrClosed
+	} else if checkWrapErr && errors.Is(err, poll.ErrFileClosing) {
+		panic("unexpected error wrapping poll.ErrFileClosing: " + err.Error())
 	}
 	return &PathError{Op: op, Path: f.name, Err: err}
 }
@@ -486,6 +500,9 @@
 // On Unix, including macOS, it returns the $HOME environment variable.
 // On Windows, it returns %USERPROFILE%.
 // On Plan 9, it returns the $home environment variable.
+//
+// If the expected variable is not set in the environment, UserHomeDir
+// returns either a platform-specific default value or a non-nil error.
 func UserHomeDir() (string, error) {
 	env, enverr := "HOME", "$HOME"
 	switch runtime.GOOS {
@@ -599,7 +616,8 @@
 //
 // The directory dir must not be "".
 //
-// The result implements fs.StatFS.
+// The result implements [io/fs.StatFS], [io/fs.ReadFileFS] and
+// [io/fs.ReadDirFS].
 func DirFS(dir string) fs.FS {
 	return dirFS(dir)
 }
@@ -635,6 +653,28 @@
 	return f, nil
 }
 
+// The ReadFile method calls the [ReadFile] function for the file
+// with the given name in the directory. The function provides
+// robust handling for small files and special file systems.
+// Through this method, dirFS implements [io/fs.ReadFileFS].
+func (dir dirFS) ReadFile(name string) ([]byte, error) {
+	fullname, err := dir.join(name)
+	if err != nil {
+		return nil, &PathError{Op: "readfile", Path: name, Err: err}
+	}
+	return ReadFile(fullname)
+}
+
+// ReadDir reads the named directory, returning all its directory entries sorted
+// by filename. Through this method, dirFS implements [io/fs.ReadDirFS].
+func (dir dirFS) ReadDir(name string) ([]DirEntry, error) {
+	fullname, err := dir.join(name)
+	if err != nil {
+		return nil, &PathError{Op: "readdir", Path: name, Err: err}
+	}
+	return ReadDir(fullname)
+}
+
 func (dir dirFS) Stat(name string) (fs.FileInfo, error) {
 	fullname, err := dir.join(name)
 	if err != nil {
@@ -715,7 +755,7 @@
 // WriteFile writes data to the named file, creating it if necessary.
 // If the file does not exist, WriteFile creates it with permissions perm (before umask);
 // otherwise WriteFile truncates it before writing, without changing permissions.
-// Since Writefile requires multiple system calls to complete, a failure mid-operation
+// Since WriteFile requires multiple system calls to complete, a failure mid-operation
 // can leave the file in a partially written state.
 func WriteFile(name string, data []byte, perm FileMode) error {
 	f, err := OpenFile(name, O_WRONLY|O_CREATE|O_TRUNC, perm)
diff --git a/src/os/file_open_unix.go b/src/os/file_open_unix.go
new file mode 100644
index 0000000..a3336ea
--- /dev/null
+++ b/src/os/file_open_unix.go
@@ -0,0 +1,17 @@
+// Copyright 2023 The Go 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:build unix || (js && wasm)
+
+package os
+
+import (
+	"internal/poll"
+	"syscall"
+)
+
+func open(path string, flag int, perm uint32) (int, poll.SysFile, error) {
+	fd, err := syscall.Open(path, flag, perm)
+	return fd, poll.SysFile{}, err
+}
diff --git a/src/os/file_open_wasip1.go b/src/os/file_open_wasip1.go
new file mode 100644
index 0000000..f3ef165
--- /dev/null
+++ b/src/os/file_open_wasip1.go
@@ -0,0 +1,31 @@
+// Copyright 2023 The Go 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:build wasip1
+
+package os
+
+import (
+	"internal/poll"
+	"syscall"
+)
+
+func open(filePath string, flag int, perm uint32) (int, poll.SysFile, error) {
+	if filePath == "" {
+		return -1, poll.SysFile{}, syscall.EINVAL
+	}
+	absPath := filePath
+	// os.(*File).Chdir is emulated by setting the working directory to the
+	// absolute path that this file was opened at, which is why we have to
+	// resolve and capture it here.
+	if filePath[0] != '/' {
+		wd, err := syscall.Getwd()
+		if err != nil {
+			return -1, poll.SysFile{}, err
+		}
+		absPath = joinPath(wd, filePath)
+	}
+	fd, err := syscall.Open(absPath, flag, perm)
+	return fd, poll.SysFile{Path: absPath}, err
+}
diff --git a/src/os/file_plan9.go b/src/os/file_plan9.go
index 6e05df1..8336487 100644
--- a/src/os/file_plan9.go
+++ b/src/os/file_plan9.go
@@ -447,6 +447,7 @@
 
 // Chtimes changes the access and modification times of the named
 // file, similar to the Unix utime() or utimes() functions.
+// A zero time.Time value will leave the corresponding file time unchanged.
 //
 // The underlying filesystem may truncate or round the values to a
 // less precise time unit.
@@ -457,6 +458,12 @@
 	d.Null()
 	d.Atime = uint32(atime.Unix())
 	d.Mtime = uint32(mtime.Unix())
+	if atime.IsZero() {
+		d.Atime = 0xFFFFFFFF
+	}
+	if mtime.IsZero() {
+		d.Mtime = 0xFFFFFFFF
+	}
 
 	var buf [syscall.STATFIXLEN]byte
 	n, err := d.Marshal(buf[:])
diff --git a/src/os/file_posix.go b/src/os/file_posix.go
index c6d18ff..5692657 100644
--- a/src/os/file_posix.go
+++ b/src/os/file_posix.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build unix || (js && wasm) || windows
+//go:build unix || (js && wasm) || wasip1 || windows
 
 package os
 
@@ -12,8 +12,6 @@
 	"time"
 )
 
-func sigpipe() // implemented in package runtime
-
 // Close closes the File, rendering it unusable for I/O.
 // On files that support SetDeadline, any pending I/O operations will
 // be canceled and return immediately with an ErrClosed error.
@@ -173,14 +171,22 @@
 
 // Chtimes changes the access and modification times of the named
 // file, similar to the Unix utime() or utimes() functions.
+// A zero time.Time value will leave the corresponding file time unchanged.
 //
 // 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())
+	set := func(i int, t time.Time) {
+		if t.IsZero() {
+			utimes[i] = syscall.Timespec{Sec: _UTIME_OMIT, Nsec: _UTIME_OMIT}
+		} else {
+			utimes[i] = syscall.NsecToTimespec(t.UnixNano())
+		}
+	}
+	set(0, atime)
+	set(1, mtime)
 	if e := syscall.UtimesNano(fixLongPath(name), utimes[0:]); e != nil {
 		return &PathError{Op: "chtimes", Path: name, Err: e}
 	}
diff --git a/src/os/file_unix.go b/src/os/file_unix.go
index 1833c26..533a484 100644
--- a/src/os/file_unix.go
+++ b/src/os/file_unix.go
@@ -2,17 +2,21 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build unix || (js && wasm)
+//go:build unix || (js && wasm) || wasip1
 
 package os
 
 import (
 	"internal/poll"
 	"internal/syscall/unix"
+	"io/fs"
 	"runtime"
 	"syscall"
+	_ "unsafe" // for go:linkname
 )
 
+const _UTIME_OMIT = unix.UTIME_OMIT
+
 // fixLongPath is a noop on non-Windows platforms.
 func fixLongPath(path string) string {
 	return path
@@ -99,39 +103,76 @@
 // conditions described in the comments of the Fd method, and the same
 // constraints apply.
 func NewFile(fd uintptr, name string) *File {
-	kind := kindNewFile
-	if nb, err := unix.IsNonblock(int(fd)); err == nil && nb {
-		kind = kindNonBlock
+	fdi := int(fd)
+	if fdi < 0 {
+		return nil
 	}
-	return newFile(fd, name, kind)
+
+	kind := kindNewFile
+	appendMode := false
+	if flags, err := unix.Fcntl(fdi, syscall.F_GETFL, 0); err == nil {
+		if unix.HasNonblockFlag(flags) {
+			kind = kindNonBlock
+		}
+		appendMode = flags&syscall.O_APPEND != 0
+	}
+	f := newFile(fdi, name, kind)
+	f.appendMode = appendMode
+	return f
+}
+
+// net_newUnixFile is a hidden entry point called by net.conn.File.
+// This is used so that a nonblocking network connection will become
+// blocking if code calls the Fd method. We don't want that for direct
+// calls to NewFile: passing a nonblocking descriptor to NewFile should
+// remain nonblocking if you get it back using Fd. But for net.conn.File
+// the call to NewFile is hidden from the user. Historically in that case
+// the Fd method has returned a blocking descriptor, and we want to
+// retain that behavior because existing code expects it and depends on it.
+//
+//go:linkname net_newUnixFile net.newUnixFile
+func net_newUnixFile(fd int, name string) *File {
+	if fd < 0 {
+		panic("invalid FD")
+	}
+
+	f := newFile(fd, name, kindNonBlock)
+	f.nonblock = true // tell Fd to return blocking descriptor
+	return f
 }
 
 // newFileKind describes the kind of file to newFile.
 type newFileKind int
 
 const (
+	// kindNewFile means that the descriptor was passed to us via NewFile.
 	kindNewFile newFileKind = iota
+	// kindOpenFile means that the descriptor was opened using
+	// Open, Create, or OpenFile (without O_NONBLOCK).
 	kindOpenFile
+	// kindPipe means that the descriptor was opened using Pipe.
 	kindPipe
+	// kindNonBlock means that the descriptor is already in
+	// non-blocking mode.
 	kindNonBlock
+	// kindNoPoll means that we should not put the descriptor into
+	// non-blocking mode, because we know it is not a pipe or FIFO.
+	// Used by openFdAt for directories.
+	kindNoPoll
 )
 
 // newFile is like NewFile, but if called from OpenFile or Pipe
 // (as passed in the kind parameter) it tries to add the file to
 // the runtime poller.
-func newFile(fd uintptr, name string, kind newFileKind) *File {
-	fdi := int(fd)
-	if fdi < 0 {
-		return nil
-	}
+func newFile(fd int, name string, kind newFileKind) *File {
 	f := &File{&file{
 		pfd: poll.FD{
-			Sysfd:         fdi,
+			Sysfd:         fd,
 			IsStream:      true,
 			ZeroReadIsEOF: true,
 		},
 		name:        name,
-		stdoutOrErr: fdi == 1 || fdi == 2,
+		stdoutOrErr: fd == 1 || fd == 2,
 	}}
 
 	pollable := kind == kindOpenFile || kind == kindPipe || kind == kindNonBlock
@@ -144,7 +185,7 @@
 		case "darwin", "ios", "dragonfly", "freebsd", "netbsd", "openbsd":
 			var st syscall.Stat_t
 			err := ignoringEINTR(func() error {
-				return syscall.Fstat(fdi, &st)
+				return syscall.Fstat(fd, &st)
 			})
 			typ := st.Mode & syscall.S_IFMT
 			// Don't try to use kqueue with regular files on *BSDs.
@@ -171,8 +212,10 @@
 	clearNonBlock := false
 	if pollable {
 		if kind == kindNonBlock {
-			f.nonblock = true
-		} else if err := syscall.SetNonblock(fdi, true); err == nil {
+			// The descriptor is already in non-blocking mode.
+			// We only set f.nonblock if we put the file into
+			// non-blocking mode.
+		} else if err := syscall.SetNonblock(fd, true); err == nil {
 			f.nonblock = true
 			clearNonBlock = true
 		} else {
@@ -188,7 +231,7 @@
 	// will show up in later I/O.
 	// We do restore the blocking behavior if it was set by us.
 	if pollErr := f.pfd.Init("file", pollable); pollErr != nil && clearNonBlock {
-		if err := syscall.SetNonblock(fdi, false); err == nil {
+		if err := syscall.SetNonblock(fd, false); err == nil {
 			f.nonblock = false
 		}
 	}
@@ -197,6 +240,8 @@
 	return f
 }
 
+func sigpipe() // implemented in package runtime
+
 // epipecheck raises SIGPIPE if we get an EPIPE error on standard
 // output or standard error. See the SIGPIPE docs in os/signal, and
 // issue 11845.
@@ -221,9 +266,10 @@
 	}
 
 	var r int
+	var s poll.SysFile
 	for {
 		var e error
-		r, e = syscall.Open(name, flag|syscall.O_CLOEXEC, syscallMode(perm))
+		r, s, e = open(name, flag|syscall.O_CLOEXEC, syscallMode(perm))
 		if e == nil {
 			break
 		}
@@ -247,7 +293,14 @@
 		syscall.CloseOnExec(r)
 	}
 
-	return newFile(uintptr(r), name, kindOpenFile), nil
+	kind := kindOpenFile
+	if unix.HasNonblockFlag(flag) {
+		kind = kindNonBlock
+	}
+
+	f := newFile(r, name, kind)
+	f.pfd.SysFile = s
+	return f, nil
 }
 
 func (file *file) close() error {
@@ -389,7 +442,7 @@
 			}
 		}
 		// buffer too small
-		if runtime.GOOS == "aix" && e == syscall.ERANGE {
+		if (runtime.GOOS == "aix" || runtime.GOOS == "wasip1") && e == syscall.ERANGE {
 			continue
 		}
 		if e != nil {
@@ -419,6 +472,10 @@
 	return lstat(d.parent + "/" + d.name)
 }
 
+func (d *unixDirent) String() string {
+	return fs.FormatDirEntry(d)
+}
+
 func newUnixDirent(parent, name string, typ FileMode) (DirEntry, error) {
 	ude := &unixDirent{
 		parent: parent,
diff --git a/src/os/file_wasip1.go b/src/os/file_wasip1.go
new file mode 100644
index 0000000..c9b05b3
--- /dev/null
+++ b/src/os/file_wasip1.go
@@ -0,0 +1,22 @@
+// Copyright 2023 The Go 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:build wasip1
+
+package os
+
+import "internal/poll"
+
+// PollFD returns the poll.FD of the file.
+//
+// Other packages in std that also import internal/poll (such as net)
+// can use a type assertion to access this extension method so that
+// they can pass the *poll.FD to functions like poll.Splice.
+//
+// There is an equivalent function in net.rawConn.
+//
+// PollFD is not intended for use outside the standard library.
+func (f *file) PollFD() *poll.FD {
+	return &f.pfd
+}
diff --git a/src/os/file_windows.go b/src/os/file_windows.go
index d94b78f..8d77a63 100644
--- a/src/os/file_windows.go
+++ b/src/os/file_windows.go
@@ -9,11 +9,14 @@
 	"internal/poll"
 	"internal/syscall/windows"
 	"runtime"
+	"sync"
 	"syscall"
-	"unicode/utf16"
 	"unsafe"
 )
 
+// This matches the value in syscall/syscall_windows.go.
+const _UTIME_OMIT = -1
+
 // 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
@@ -228,7 +231,7 @@
 // Truncate changes the size of the named file.
 // If the file is a symbolic link, it changes the size of the link's target.
 func Truncate(name string, size int64) error {
-	f, e := OpenFile(name, O_WRONLY|O_CREATE, 0666)
+	f, e := OpenFile(name, O_WRONLY, 0666)
 	if e != nil {
 		return e
 	}
@@ -299,11 +302,23 @@
 	return newFile(p[0], "|0", "pipe"), newFile(p[1], "|1", "pipe"), nil
 }
 
+var (
+	useGetTempPath2Once sync.Once
+	useGetTempPath2     bool
+)
+
 func tempDir() string {
+	useGetTempPath2Once.Do(func() {
+		useGetTempPath2 = (windows.ErrorLoadingGetTempPath2() == nil)
+	})
+	getTempPath := syscall.GetTempPath
+	if useGetTempPath2 {
+		getTempPath = windows.GetTempPath2
+	}
 	n := uint32(syscall.MAX_PATH)
 	for {
 		b := make([]uint16, n)
-		n, _ = syscall.GetTempPath(uint32(len(b)), &b[0])
+		n, _ = getTempPath(uint32(len(b)), &b[0])
 		if n > uint32(len(b)) {
 			continue
 		}
@@ -313,7 +328,7 @@
 			// Otherwise remove terminating \.
 			n--
 		}
-		return string(utf16.Decode(b[:n]))
+		return syscall.UTF16ToString(b[:n])
 	}
 }
 
diff --git a/src/os/os_test.go b/src/os/os_test.go
index 277b245..94c3ad0 100644
--- a/src/os/os_test.go
+++ b/src/os/os_test.go
@@ -11,9 +11,8 @@
 	"internal/testenv"
 	"io"
 	"io/fs"
-	"os"
 	. "os"
-	osexec "os/exec"
+	"os/exec"
 	"path/filepath"
 	"reflect"
 	"runtime"
@@ -29,8 +28,8 @@
 
 func TestMain(m *testing.M) {
 	if Getenv("GO_OS_TEST_DRAIN_STDIN") == "1" {
-		os.Stdout.Close()
-		io.Copy(io.Discard, os.Stdin)
+		Stdout.Close()
+		io.Copy(io.Discard, Stdin)
 		Exit(0)
 	}
 
@@ -105,6 +104,18 @@
 				"local",
 			},
 		}
+	case "wasip1":
+		// wasmtime has issues resolving symbolic links that are often present
+		// in directories like /etc/group below (e.g. private/etc/group on OSX).
+		// For this reason we use files in the Go source tree instead.
+		return &sysDir{
+			runtime.GOROOT(),
+			[]string{
+				"go.env",
+				"LICENSE",
+				"CONTRIBUTING.md",
+			},
+		}
 	}
 	return &sysDir{
 		"/etc",
@@ -153,7 +164,7 @@
 }
 
 func newFile(testName string, t *testing.T) (f *File) {
-	f, err := os.CreateTemp(localTmp(), "_Go_"+testName)
+	f, err := CreateTemp(localTmp(), "_Go_"+testName)
 	if err != nil {
 		t.Fatalf("TempFile %s: %s", testName, err)
 	}
@@ -161,7 +172,7 @@
 }
 
 func newDir(testName string, t *testing.T) (name string) {
-	name, err := os.MkdirTemp(localTmp(), "_Go_"+testName)
+	name, err := MkdirTemp(localTmp(), "_Go_"+testName)
 	if err != nil {
 		t.Fatalf("TempDir %s: %s", testName, err)
 	}
@@ -172,6 +183,8 @@
 var sfname = sysdir.files[0]
 
 func TestStat(t *testing.T) {
+	t.Parallel()
+
 	path := sfdir + "/" + sfname
 	dir, err := Stat(path)
 	if err != nil {
@@ -227,25 +240,27 @@
 
 	defer chtmpdir(t)()
 
-	err := os.Symlink("x", "y")
+	err := Symlink("x", "y")
 	if err != nil {
 		t.Fatal(err)
 	}
-	defer os.Remove("y")
+	defer Remove("y")
 
-	err = os.Symlink("y", "x")
+	err = Symlink("y", "x")
 	if err != nil {
 		t.Fatal(err)
 	}
-	defer os.Remove("x")
+	defer Remove("x")
 
-	_, err = os.Stat("x")
+	_, err = Stat("x")
 	if _, ok := err.(*fs.PathError); !ok {
 		t.Errorf("expected *PathError, got %T: %v\n", err, err)
 	}
 }
 
 func TestFstat(t *testing.T) {
+	t.Parallel()
+
 	path := sfdir + "/" + sfname
 	file, err1 := Open(path)
 	if err1 != nil {
@@ -266,6 +281,8 @@
 }
 
 func TestLstat(t *testing.T) {
+	t.Parallel()
+
 	path := sfdir + "/" + sfname
 	dir, err := Lstat(path)
 	if err != nil {
@@ -284,6 +301,8 @@
 
 // Read with length 0 should not return EOF.
 func TestRead0(t *testing.T) {
+	t.Parallel()
+
 	path := sfdir + "/" + sfname
 	f, err := Open(path)
 	if err != nil {
@@ -305,6 +324,8 @@
 
 // Reading a closed file should return ErrClosed error
 func TestReadClosed(t *testing.T) {
+	t.Parallel()
+
 	path := sfdir + "/" + sfname
 	file, err := Open(path)
 	if err != nil {
@@ -321,139 +342,157 @@
 	}
 }
 
-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 %q in directory", n)
-			}
-			if !equal(m, n) {
-				continue
-			}
-			if found {
-				t.Error("present twice:", m)
-			}
-			found = true
+func testReaddirnames(dir string, contents []string) func(*testing.T) {
+	return func(t *testing.T) {
+		t.Parallel()
+
+		file, err := Open(dir)
+		if err != nil {
+			t.Fatalf("open %q failed: %v", dir, err)
 		}
-		if !found {
-			t.Error("could not find", m)
+		defer file.Close()
+		s, err2 := file.Readdirnames(-1)
+		if err2 != nil {
+			t.Fatalf("Readdirnames %q failed: %v", dir, err2)
 		}
-	}
-	if s == nil {
-		t.Error("Readdirnames returned nil instead of empty slice")
+		for _, m := range contents {
+			found := false
+			for _, n := range s {
+				if n == "." || n == ".." {
+					t.Errorf("got %q in directory", n)
+				}
+				if !equal(m, n) {
+					continue
+				}
+				if found {
+					t.Error("present twice:", m)
+				}
+				found = true
+			}
+			if !found {
+				t.Error("could not find", m)
+			}
+		}
+		if s == nil {
+			t.Error("Readdirnames returned nil instead of empty slice")
+		}
 	}
 }
 
-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 n.Name() == "." || n.Name() == ".." {
-				t.Errorf("got %q in directory", n.Name())
-			}
-			if !equal(m, n.Name()) {
-				continue
-			}
-			if found {
-				t.Error("present twice:", m)
-			}
-			found = true
+func testReaddir(dir string, contents []string) func(*testing.T) {
+	return func(t *testing.T) {
+		t.Parallel()
+
+		file, err := Open(dir)
+		if err != nil {
+			t.Fatalf("open %q failed: %v", dir, err)
 		}
-		if !found {
-			t.Error("could not find", m)
+		defer file.Close()
+		s, err2 := file.Readdir(-1)
+		if err2 != nil {
+			t.Fatalf("Readdir %q failed: %v", dir, err2)
 		}
-	}
-	if s == nil {
-		t.Error("Readdir returned nil instead of empty slice")
+		for _, m := range contents {
+			found := false
+			for _, n := range s {
+				if n.Name() == "." || n.Name() == ".." {
+					t.Errorf("got %q in directory", n.Name())
+				}
+				if !equal(m, n.Name()) {
+					continue
+				}
+				if found {
+					t.Error("present twice:", m)
+				}
+				found = true
+			}
+			if !found {
+				t.Error("could not find", m)
+			}
+		}
+		if s == nil {
+			t.Error("Readdir returned nil instead of empty slice")
+		}
 	}
 }
 
-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 n.Name() == "." || n.Name() == ".." {
-				t.Errorf("got %q in directory", n)
+func testReadDir(dir string, contents []string) func(*testing.T) {
+	return func(t *testing.T) {
+		t.Parallel()
+
+		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 n.Name() == "." || n.Name() == ".." {
+					t.Errorf("got %q in directory", n)
+				}
+				if !equal(m, n.Name()) {
+					continue
+				}
+				if found {
+					t.Error("present twice:", m)
+				}
+				found = true
+				lstat, err := Lstat(dir + "/" + m)
+				if err != nil {
+					t.Fatal(err)
+				}
+				if n.IsDir() != lstat.IsDir() {
+					t.Errorf("%s: IsDir=%v, want %v", m, n.IsDir(), lstat.IsDir())
+				}
+				if n.Type() != lstat.Mode().Type() {
+					t.Errorf("%s: IsDir=%v, want %v", m, n.Type(), lstat.Mode().Type())
+				}
+				info, err := n.Info()
+				if err != nil {
+					t.Errorf("%s: Info: %v", m, err)
+					continue
+				}
+				if !SameFile(info, lstat) {
+					t.Errorf("%s: Info: SameFile(info, lstat) = false", m)
+				}
 			}
-			if !equal(m, n.Name()) {
-				continue
-			}
-			if found {
-				t.Error("present twice:", m)
-			}
-			found = true
-			lstat, err := Lstat(dir + "/" + m)
-			if err != nil {
-				t.Fatal(err)
-			}
-			if n.IsDir() != lstat.IsDir() {
-				t.Errorf("%s: IsDir=%v, want %v", m, n.IsDir(), lstat.IsDir())
-			}
-			if n.Type() != lstat.Mode().Type() {
-				t.Errorf("%s: IsDir=%v, want %v", m, n.Type(), lstat.Mode().Type())
-			}
-			info, err := n.Info()
-			if err != nil {
-				t.Errorf("%s: Info: %v", m, err)
-				continue
-			}
-			if !SameFile(info, lstat) {
-				t.Errorf("%s: Info: SameFile(info, lstat) = false", m)
+			if !found {
+				t.Error("could not find", m)
 			}
 		}
-		if !found {
-			t.Error("could not find", m)
+		if s == nil {
+			t.Error("ReadDir returned nil instead of empty slice")
 		}
 	}
-	if s == nil {
-		t.Error("ReadDir returned nil instead of empty slice")
-	}
 }
 
 func TestFileReaddirnames(t *testing.T) {
-	testReaddirnames(".", dot, t)
-	testReaddirnames(sysdir.name, sysdir.files, t)
-	testReaddirnames(t.TempDir(), nil, t)
+	t.Parallel()
+
+	t.Run(".", testReaddirnames(".", dot))
+	t.Run("sysdir", testReaddirnames(sysdir.name, sysdir.files))
+	t.Run("TempDir", testReaddirnames(t.TempDir(), nil))
 }
 
 func TestFileReaddir(t *testing.T) {
-	testReaddir(".", dot, t)
-	testReaddir(sysdir.name, sysdir.files, t)
-	testReaddir(t.TempDir(), nil, t)
+	t.Parallel()
+
+	t.Run(".", testReaddir(".", dot))
+	t.Run("sysdir", testReaddir(sysdir.name, sysdir.files))
+	t.Run("TempDir", testReaddir(t.TempDir(), nil))
 }
 
 func TestFileReadDir(t *testing.T) {
-	testReadDir(".", dot, t)
-	testReadDir(sysdir.name, sysdir.files, t)
-	testReadDir(t.TempDir(), nil, t)
+	t.Parallel()
+
+	t.Run(".", testReadDir(".", dot))
+	t.Run("sysdir", testReadDir(sysdir.name, sysdir.files))
+	t.Run("TempDir", testReadDir(t.TempDir(), nil))
 }
 
 func benchmarkReaddirname(path string, b *testing.B) {
@@ -587,12 +626,14 @@
 // 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) {
+	t.Parallel()
+
 	// big directory that doesn't change often.
 	dir := "/usr/bin"
 	switch runtime.GOOS {
 	case "android":
 		dir = "/system/bin"
-	case "ios":
+	case "ios", "wasip1":
 		wd, err := Getwd()
 		if err != nil {
 			t.Fatal(err)
@@ -632,6 +673,8 @@
 	if testing.Short() {
 		t.Skip("test.short; skipping")
 	}
+	t.Parallel()
+
 	dir := t.TempDir()
 	for i := 1; i <= 105; i++ {
 		f, err := Create(filepath.Join(dir, fmt.Sprintf("%d", i)))
@@ -727,13 +770,7 @@
 		// testing it wouldn't work.
 		t.Skipf("skipping test on %v", runtime.GOOS)
 	}
-	dir := t.TempDir()
-	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") {
@@ -741,6 +778,12 @@
 		}
 		return Lstat(path)
 	}
+	defer func() { *LstatP = Lstat }()
+
+	dir := t.TempDir()
+	touch(t, filepath.Join(dir, "good1"))
+	touch(t, filepath.Join(dir, "x")) // will disappear or have an error
+	touch(t, filepath.Join(dir, "good2"))
 	readDir := func() ([]FileInfo, error) {
 		d, err := Open(dir)
 		if err != nil {
@@ -784,11 +827,12 @@
 
 // Readdir on a regular file should fail.
 func TestReaddirOfFile(t *testing.T) {
-	f, err := os.CreateTemp("", "_Go_ReaddirOfFile")
+	t.Parallel()
+
+	f, err := CreateTemp(t.TempDir(), "_Go_ReaddirOfFile")
 	if err != nil {
 		t.Fatal(err)
 	}
-	defer Remove(f.Name())
 	f.Write([]byte("foo"))
 	f.Close()
 	reg, err := Open(f.Name())
@@ -875,7 +919,7 @@
 	if err != nil {
 		t.Fatalf("chtmpdir: %v", err)
 	}
-	d, err := os.MkdirTemp("", "test")
+	d, err := MkdirTemp("", "test")
 	if err != nil {
 		t.Fatalf("chtmpdir: %v", err)
 	}
@@ -1000,12 +1044,12 @@
 	toData := []byte("to")
 	fromData := []byte("from")
 
-	err := os.WriteFile(to, toData, 0777)
+	err := WriteFile(to, toData, 0777)
 	if err != nil {
 		t.Fatalf("write file %q failed: %v", to, err)
 	}
 
-	err = os.WriteFile(from, fromData, 0777)
+	err = WriteFile(from, fromData, 0777)
 	if err != nil {
 		t.Fatalf("write file %q failed: %v", from, err)
 	}
@@ -1151,34 +1195,39 @@
 	}
 }
 
-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()
+func testStartProcess(dir, cmd string, args []string, expect string) func(t *testing.T) {
+	return func(t *testing.T) {
+		t.Parallel()
 
-	var b strings.Builder
-	io.Copy(&b, r)
-	output := b.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()
 
-	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)
+		var b strings.Builder
+		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()
 	}
-	p.Wait()
 }
 
 func TestStartProcess(t *testing.T) {
 	testenv.MustHaveExec(t)
+	t.Parallel()
 
 	var dir, cmd string
 	var args []string
@@ -1191,7 +1240,7 @@
 		args = []string{"/c", "cd"}
 	default:
 		var err error
-		cmd, err = osexec.LookPath("pwd")
+		cmd, err = exec.LookPath("pwd")
 		if err != nil {
 			t.Fatalf("Can't find pwd: %v", err)
 		}
@@ -1201,10 +1250,8 @@
 	}
 	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)
+	t.Run("absolute", testStartProcess(dir, cmd, args, dir))
+	t.Run("relative", testStartProcess(cmddir, cmdbase, args, cmddir))
 }
 
 func checkMode(t *testing.T, path string, mode FileMode) {
@@ -1218,6 +1265,12 @@
 }
 
 func TestChmod(t *testing.T) {
+	// Chmod is not supported on wasip1.
+	if runtime.GOOS == "wasip1" {
+		t.Skip("Chmod is not supported on " + runtime.GOOS)
+	}
+	t.Parallel()
+
 	f := newFile("TestChmod", t)
 	defer Remove(f.Name())
 	defer f.Close()
@@ -1254,6 +1307,8 @@
 }
 
 func TestFTruncate(t *testing.T) {
+	t.Parallel()
+
 	f := newFile("TestFTruncate", t)
 	defer Remove(f.Name())
 	defer f.Close()
@@ -1274,6 +1329,8 @@
 }
 
 func TestTruncate(t *testing.T) {
+	t.Parallel()
+
 	f := newFile("TestTruncate", t)
 	defer Remove(f.Name())
 	defer f.Close()
@@ -1293,11 +1350,33 @@
 	}
 }
 
+func TestTruncateNonexistentFile(t *testing.T) {
+	t.Parallel()
+
+	assertPathError := func(t testing.TB, path string, err error) {
+		t.Helper()
+		if pe, ok := err.(*PathError); !ok || !IsNotExist(err) || pe.Path != path {
+			t.Errorf("got error: %v\nwant an ErrNotExist PathError with path %q", err, path)
+		}
+	}
+
+	path := filepath.Join(t.TempDir(), "nonexistent")
+
+	err := Truncate(path, 1)
+	assertPathError(t, path, err)
+
+	// Truncate shouldn't create any new file.
+	_, err = Stat(path)
+	assertPathError(t, path, err)
+}
+
 // 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) {
+	t.Parallel()
+
 	f := newFile("TestChtimes", t)
 	defer Remove(f.Name())
 
@@ -1307,11 +1386,135 @@
 	testChtimes(t, f.Name())
 }
 
+func TestChtimesWithZeroTimes(t *testing.T) {
+	file := newFile("chtimes-with-zero", t)
+	_, err := file.Write([]byte("hello, world\n"))
+	if err != nil {
+		t.Fatalf("Write: %s", err)
+	}
+	fName := file.Name()
+	defer Remove(file.Name())
+	err = file.Close()
+	if err != nil {
+		t.Errorf("%v", err)
+	}
+	fs, err := Stat(fName)
+	if err != nil {
+		t.Fatal(err)
+	}
+	startAtime := Atime(fs)
+	startMtime := fs.ModTime()
+	switch runtime.GOOS {
+	case "js":
+		startAtime = startAtime.Truncate(time.Second)
+		startMtime = startMtime.Truncate(time.Second)
+	}
+	at0 := startAtime
+	mt0 := startMtime
+	t0 := startMtime.Truncate(time.Second).Add(1 * time.Hour)
+
+	tests := []struct {
+		aTime     time.Time
+		mTime     time.Time
+		wantATime time.Time
+		wantMTime time.Time
+	}{
+		{
+			aTime:     time.Time{},
+			mTime:     time.Time{},
+			wantATime: startAtime,
+			wantMTime: startMtime,
+		},
+		{
+			aTime:     t0.Add(200 * time.Second),
+			mTime:     time.Time{},
+			wantATime: t0.Add(200 * time.Second),
+			wantMTime: startMtime,
+		},
+		{
+			aTime:     time.Time{},
+			mTime:     t0.Add(100 * time.Second),
+			wantATime: t0.Add(200 * time.Second),
+			wantMTime: t0.Add(100 * time.Second),
+		},
+		{
+			aTime:     t0.Add(300 * time.Second),
+			mTime:     t0.Add(100 * time.Second),
+			wantATime: t0.Add(300 * time.Second),
+			wantMTime: t0.Add(100 * time.Second),
+		},
+	}
+
+	for _, tt := range tests {
+		// Now change the times accordingly.
+		if err := Chtimes(fName, tt.aTime, tt.mTime); err != nil {
+			t.Error(err)
+		}
+
+		// Finally verify the expectations.
+		fs, err = Stat(fName)
+		if err != nil {
+			t.Error(err)
+		}
+		at0 = Atime(fs)
+		mt0 = fs.ModTime()
+
+		if got, want := at0, tt.wantATime; !got.Equal(want) {
+			errormsg := fmt.Sprintf("AccessTime mismatch with values ATime:%q-MTime:%q\ngot:  %q\nwant: %q", tt.aTime, tt.mTime, got, want)
+			switch runtime.GOOS {
+			case "plan9":
+				// 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.
+			case "windows":
+				t.Error(errormsg)
+			default: // unix's
+				if got, want := at0, tt.wantATime; !got.Equal(want) {
+					mounts, err := ReadFile("/bin/mounts")
+					if err != nil {
+						mounts, err = ReadFile("/etc/mtab")
+					}
+					if strings.Contains(string(mounts), "noatime") {
+						t.Log(errormsg)
+						t.Log("A filesystem is mounted with noatime; ignoring.")
+					} else {
+						switch runtime.GOOS {
+						case "netbsd", "dragonfly":
+							// On a 64-bit implementation, birth time is generally supported and cannot be changed.
+							// When supported, atime update is restricted and depends on the file system and on the
+							// OS configuration.
+							if strings.Contains(runtime.GOARCH, "64") {
+								t.Log(errormsg)
+								t.Log("Filesystem might not support atime changes; ignoring.")
+							}
+						default:
+							t.Error(errormsg)
+						}
+					}
+				}
+			}
+		}
+		if got, want := mt0, tt.wantMTime; !got.Equal(want) {
+			errormsg := fmt.Sprintf("ModTime mismatch with values ATime:%q-MTime:%q\ngot:  %q\nwant: %q", tt.aTime, tt.mTime, got, want)
+			switch runtime.GOOS {
+			case "dragonfly":
+				t.Log(errormsg)
+				t.Log("Mtime is always updated; ignoring.")
+			default:
+				t.Error(errormsg)
+			}
+		}
+	}
+}
+
 // 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) {
+	t.Parallel()
+
 	name := newDir("TestChtimes", t)
 	defer RemoveAll(name)
 
@@ -1349,7 +1552,7 @@
 			// the contents are accessed; also, it is set
 			// whenever mtime is set.
 		case "netbsd":
-			mounts, _ := os.ReadFile("/proc/mounts")
+			mounts, _ := ReadFile("/proc/mounts")
 			if strings.Contains(string(mounts), "noatime") {
 				t.Logf("AccessTime didn't go backwards, but see a filesystem mounted noatime; ignoring. Issue 19293.")
 			} else {
@@ -1365,12 +1568,33 @@
 	}
 }
 
-func TestFileChdir(t *testing.T) {
-	// TODO(brainman): file.Chdir() is not implemented on windows.
-	if runtime.GOOS == "windows" {
-		return
+func TestChtimesToUnixZero(t *testing.T) {
+	file := newFile("chtimes-to-unix-zero", t)
+	fn := file.Name()
+	defer Remove(fn)
+	if _, err := file.Write([]byte("hi")); err != nil {
+		t.Fatal(err)
+	}
+	if err := file.Close(); err != nil {
+		t.Fatal(err)
 	}
 
+	unixZero := time.Unix(0, 0)
+	if err := Chtimes(fn, unixZero, unixZero); err != nil {
+		t.Fatalf("Chtimes failed: %v", err)
+	}
+
+	st, err := Stat(fn)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	if mt := st.ModTime(); mt != unixZero {
+		t.Errorf("mtime is %v, want %v", mt, unixZero)
+	}
+}
+
+func TestFileChdir(t *testing.T) {
 	wd, err := Getwd()
 	if err != nil {
 		t.Fatalf("Getwd: %s", err)
@@ -1395,16 +1619,12 @@
 	if err != nil {
 		t.Fatalf("Getwd: %s", err)
 	}
-	if wdNew != wd {
+	if !equal(wdNew, wd) {
 		t.Fatalf("fd.Chdir failed, got %s, want %s", wdNew, wd)
 	}
 }
 
 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)
@@ -1418,13 +1638,9 @@
 		dirs = []string{"/system/bin"}
 	case "plan9":
 		dirs = []string{"/", "/usr"}
-	case "ios":
+	case "ios", "windows", "wasip1":
 		dirs = nil
-		for _, d := range []string{"d1", "d2"} {
-			dir, err := os.MkdirTemp("", d)
-			if err != nil {
-				t.Fatalf("TempDir: %v", err)
-			}
+		for _, dir := range []string{t.TempDir(), t.TempDir()} {
 			// Expand symlinks so path equality tests work.
 			dir, err = filepath.EvalSymlinks(dir)
 			if err != nil {
@@ -1468,7 +1684,7 @@
 				fd.Close()
 				t.Fatalf("Getwd in %s: %s", d, err1)
 			}
-			if pwd != d {
+			if !equal(pwd, d) {
 				fd.Close()
 				t.Fatalf("Getwd returned %q want %q", pwd, d)
 			}
@@ -1480,11 +1696,35 @@
 // Test that Chdir+Getwd is program-wide.
 func TestProgWideChdir(t *testing.T) {
 	const N = 10
-	const ErrPwd = "Error!"
-	c := make(chan bool)
-	cpwd := make(chan string, N)
+	var wg sync.WaitGroup
+	hold := make(chan struct{})
+	done := make(chan struct{})
+
+	d := t.TempDir()
+	oldwd, err := Getwd()
+	if err != nil {
+		t.Fatalf("Getwd: %v", err)
+	}
+	defer func() {
+		if err := Chdir(oldwd); err != nil {
+			// It's not safe to continue with tests if we can't get back to
+			// the original working directory.
+			panic(err)
+		}
+	}()
+
+	// Note the deferred Wait must be called after the deferred close(done),
+	// to ensure the N goroutines have been released even if the main goroutine
+	// calls Fatalf. It must be called before the Chdir back to the original
+	// directory, and before the deferred deletion implied by TempDir,
+	// so as not to interfere while the N goroutines are still running.
+	defer wg.Wait()
+	defer close(done)
+
 	for i := 0; i < N; i++ {
+		wg.Add(1)
 		go func(i int) {
+			defer wg.Done()
 			// Lock half the goroutines in their own operating system
 			// thread to exercise more scheduler possibilities.
 			if i%2 == 1 {
@@ -1495,60 +1735,53 @@
 				// See issue 9428.
 				runtime.LockOSThread()
 			}
-			hasErr, closed := <-c
-			if !closed && hasErr {
-				cpwd <- ErrPwd
+			select {
+			case <-done:
+				return
+			case <-hold:
+			}
+			// Getwd might be wrong
+			f0, err := Stat(".")
+			if err != nil {
+				t.Error(err)
 				return
 			}
 			pwd, err := Getwd()
 			if err != nil {
-				t.Errorf("Getwd on goroutine %d: %v", i, err)
-				cpwd <- ErrPwd
+				t.Errorf("Getwd: %v", err)
 				return
 			}
-			cpwd <- pwd
+			if pwd != d {
+				t.Errorf("Getwd() = %q, want %q", pwd, d)
+				return
+			}
+			f1, err := Stat(pwd)
+			if err != nil {
+				t.Error(err)
+				return
+			}
+			if !SameFile(f0, f1) {
+				t.Errorf(`Samefile(Stat("."), Getwd()) reports false (%s != %s)`, f0.Name(), f1.Name())
+				return
+			}
 		}(i)
 	}
-	oldwd, err := Getwd()
-	if err != nil {
-		c <- true
-		t.Fatalf("Getwd: %v", err)
-	}
-	d, err := os.MkdirTemp("", "test")
-	if err != nil {
-		c <- true
-		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 {
-		c <- true
+	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 {
-		c <- true
 		t.Fatalf("Getwd: %v", err)
 	}
-	close(c)
-	for i := 0; i < N; i++ {
-		pwd := <-cpwd
-		if pwd == ErrPwd {
-			t.FailNow()
-		}
-		if pwd != d {
-			t.Errorf("Getwd returned %q; want %q", pwd, d)
-		}
-	}
+	close(hold)
+	wg.Wait()
 }
 
 func TestSeek(t *testing.T) {
+	t.Parallel()
+
 	f := newFile("TestSeek", t)
 	defer Remove(f.Name())
 	defer f.Close()
@@ -1581,7 +1814,7 @@
 		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 && runtime.GOOS == "linux" {
-				mounts, _ := os.ReadFile("/proc/mounts")
+				mounts, _ := ReadFile("/proc/mounts")
 				if strings.Contains(string(mounts), "reiserfs") {
 					// Reiserfs rejects the big seeks.
 					t.Skipf("skipping test known to fail on reiserfs; https://golang.org/issue/91")
@@ -1594,9 +1827,10 @@
 
 func TestSeekError(t *testing.T) {
 	switch runtime.GOOS {
-	case "js", "plan9":
+	case "js", "plan9", "wasip1":
 		t.Skipf("skipping test on %v", runtime.GOOS)
 	}
+	t.Parallel()
 
 	r, w, err := Pipe()
 	if err != nil {
@@ -1643,6 +1877,8 @@
 }
 
 func TestOpenError(t *testing.T) {
+	t.Parallel()
+
 	for _, tt := range openErrorTests {
 		f, err := OpenFile(tt.path, tt.mode, 0)
 		if err == nil {
@@ -1697,9 +1933,9 @@
 	}
 	defer r.Close()
 
-	path, err := osexec.LookPath("hostname")
+	path, err := exec.LookPath("hostname")
 	if err != nil {
-		if errors.Is(err, osexec.ErrNotFound) {
+		if errors.Is(err, exec.ErrNotFound) {
 			t.Skip("skipping test; test requires hostname but it does not exist")
 		}
 		t.Fatal(err)
@@ -1749,6 +1985,8 @@
 }
 
 func TestHostname(t *testing.T) {
+	t.Parallel()
+
 	hostname, err := Hostname()
 	if err != nil {
 		t.Fatal(err)
@@ -1786,6 +2024,8 @@
 }
 
 func TestReadAt(t *testing.T) {
+	t.Parallel()
+
 	f := newFile("TestReadAt", t)
 	defer Remove(f.Name())
 	defer f.Close()
@@ -1808,6 +2048,8 @@
 // the pread syscall, where the channel offset was erroneously updated after
 // calling pread on a file.
 func TestReadAtOffset(t *testing.T) {
+	t.Parallel()
+
 	f := newFile("TestReadAtOffset", t)
 	defer Remove(f.Name())
 	defer f.Close()
@@ -1837,6 +2079,8 @@
 
 // Verify that ReadAt doesn't allow negative offset.
 func TestReadAtNegativeOffset(t *testing.T) {
+	t.Parallel()
+
 	f := newFile("TestReadAtNegativeOffset", t)
 	defer Remove(f.Name())
 	defer f.Close()
@@ -1856,6 +2100,8 @@
 }
 
 func TestWriteAt(t *testing.T) {
+	t.Parallel()
+
 	f := newFile("TestWriteAt", t)
 	defer Remove(f.Name())
 	defer f.Close()
@@ -1868,7 +2114,7 @@
 		t.Fatalf("WriteAt 7: %d, %v", n, err)
 	}
 
-	b, err := os.ReadFile(f.Name())
+	b, err := ReadFile(f.Name())
 	if err != nil {
 		t.Fatalf("ReadFile %s: %v", f.Name(), err)
 	}
@@ -1879,6 +2125,8 @@
 
 // Verify that WriteAt doesn't allow negative offset.
 func TestWriteAtNegativeOffset(t *testing.T) {
+	t.Parallel()
+
 	f := newFile("TestWriteAtNegativeOffset", t)
 	defer Remove(f.Name())
 	defer f.Close()
@@ -1916,7 +2164,7 @@
 		t.Fatalf("WriteString: %d, %v", n, err)
 	}
 	f.Close()
-	data, err := os.ReadFile(fname)
+	data, err := ReadFile(fname)
 	if err != nil {
 		t.Fatalf("ReadFile: %v", err)
 	}
@@ -1957,6 +2205,8 @@
 }
 
 func TestStatDirWithTrailingSlash(t *testing.T) {
+	t.Parallel()
+
 	// Create new temporary directory and arrange to clean it up.
 	path := t.TempDir()
 
@@ -2051,6 +2301,8 @@
 }
 
 func TestDevNullFile(t *testing.T) {
+	t.Parallel()
+
 	testDevNullFile(t, DevNull)
 	if runtime.GOOS == "windows" {
 		testDevNullFile(t, "./nul")
@@ -2086,6 +2338,11 @@
 }
 
 func TestStatDirModeExec(t *testing.T) {
+	if runtime.GOOS == "wasip1" {
+		t.Skip("Chmod is not supported on " + runtime.GOOS)
+	}
+	t.Parallel()
+
 	const mode = 0111
 
 	path := t.TempDir()
@@ -2108,8 +2365,6 @@
 		t.Skipf("%s doesn't have /bin/sh", runtime.GOOS)
 	}
 
-	testenv.MustHaveExec(t)
-
 	if Getenv("GO_WANT_HELPER_PROCESS") == "1" {
 		st, err := Stdin.Stat()
 		if err != nil {
@@ -2119,6 +2374,9 @@
 		Exit(0)
 	}
 
+	testenv.MustHaveExec(t)
+	t.Parallel()
+
 	fi, err := Stdin.Stat()
 	if err != nil {
 		t.Fatal(err)
@@ -2130,7 +2388,7 @@
 		t.Fatalf("unexpected Stdin mode (%v), want ModeCharDevice or ModeNamedPipe", mode)
 	}
 
-	var cmd *osexec.Cmd
+	var cmd *exec.Cmd
 	if runtime.GOOS == "windows" {
 		cmd = testenv.Command(t, "cmd", "/c", "echo output | "+Args[0]+" -test.run=TestStatStdin")
 	} else {
@@ -2151,6 +2409,7 @@
 
 func TestStatRelativeSymlink(t *testing.T) {
 	testenv.MustHaveSymlink(t)
+	t.Parallel()
 
 	tmpdir := t.TempDir()
 	target := filepath.Join(tmpdir, "target")
@@ -2199,6 +2458,8 @@
 }
 
 func TestReadAtEOF(t *testing.T) {
+	t.Parallel()
+
 	f := newFile("TestReadAtEOF", t)
 	defer Remove(f.Name())
 	defer f.Close()
@@ -2215,6 +2476,8 @@
 }
 
 func TestLongPath(t *testing.T) {
+	t.Parallel()
+
 	tmpdir := newDir("TestLongPath", t)
 	defer func(d string) {
 		if err := RemoveAll(d); err != nil {
@@ -2237,7 +2500,7 @@
 				t.Fatalf("MkdirAll failed: %v", err)
 			}
 			data := []byte("hello world\n")
-			if err := os.WriteFile(sizedTempDir+"/foo.txt", data, 0644); err != nil {
+			if err := WriteFile(sizedTempDir+"/foo.txt", data, 0644); err != nil {
 				t.Fatalf("os.WriteFile() failed: %v", err)
 			}
 			if err := Rename(sizedTempDir+"/foo.txt", sizedTempDir+"/bar.txt"); err != nil {
@@ -2271,9 +2534,11 @@
 					if dir.Size() != filesize || filesize != wantSize {
 						t.Errorf("Size(%q) is %d, len(ReadFile()) is %d, want %d", path, dir.Size(), filesize, wantSize)
 					}
-					err = Chmod(path, dir.Mode())
-					if err != nil {
-						t.Fatalf("Chmod(%q) failed: %v", path, err)
+					if runtime.GOOS != "wasip1" { // Chmod is not supported on wasip1
+						err = Chmod(path, dir.Mode())
+						if err != nil {
+							t.Fatalf("Chmod(%q) failed: %v", path, err)
+						}
 					}
 				}
 				if err := Truncate(sizedTempDir+"/bar.txt", 0); err != nil {
@@ -2290,7 +2555,7 @@
 
 	// Re-exec the test binary to start a process that hangs until stdin is closed.
 	cmd := testenv.Command(t, Args[0])
-	cmd.Env = append(os.Environ(), "GO_OS_TEST_DRAIN_STDIN=1")
+	cmd.Env = append(cmd.Environ(), "GO_OS_TEST_DRAIN_STDIN=1")
 	stdout, err := cmd.StdoutPipe()
 	if err != nil {
 		t.Fatal(err)
@@ -2333,13 +2598,14 @@
 		t.Skipf("skipping test on plan9; see issue 8206")
 	}
 
-	testenv.MustHaveExec(t)
-
 	if Getenv("GO_WANT_HELPER_PROCESS") == "1" {
 		fmt.Print(Getppid())
 		Exit(0)
 	}
 
+	testenv.MustHaveExec(t)
+	t.Parallel()
+
 	cmd := testenv.Command(t, Args[0], "-test.run=TestGetppid")
 	cmd.Env = append(Environ(), "GO_WANT_HELPER_PROCESS=1")
 
@@ -2392,6 +2658,8 @@
 
 // Test that all File methods give ErrInvalid if the receiver is nil.
 func TestNilFileMethods(t *testing.T) {
+	t.Parallel()
+
 	for _, tt := range nilFileMethodTests {
 		var file *File
 		got := tt.f(file)
@@ -2431,7 +2699,7 @@
 
 	n := runtime.GOMAXPROCS(16)
 	defer runtime.GOMAXPROCS(n)
-	root, err := os.MkdirTemp("", "issue")
+	root, err := MkdirTemp("", "issue")
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -2464,6 +2732,8 @@
 		t.Skip("skipping on Plan 9; does not support runtime poller")
 	case "js":
 		t.Skip("skipping on js; no support for os.Pipe")
+	case "wasip1":
+		t.Skip("skipping on wasip1; no support for os.Pipe")
 	}
 
 	threads := 100
@@ -2524,40 +2794,57 @@
 	}
 }
 
-func testDoubleCloseError(t *testing.T, path string) {
-	file, err := Open(path)
-	if err != nil {
-		t.Fatal(err)
-	}
-	if err := file.Close(); err != nil {
-		t.Fatalf("unexpected error from Close: %v", err)
-	}
-	if err := file.Close(); err == nil {
-		t.Error("second Close did not fail")
-	} else if pe, ok := err.(*PathError); !ok {
-		t.Errorf("second Close: got %T, want %T", err, pe)
-	} else if pe.Err != ErrClosed {
-		t.Errorf("second Close: got %q, want %q", pe.Err, ErrClosed)
-	} else {
-		t.Logf("second close returned expected error %q", err)
+func testDoubleCloseError(path string) func(*testing.T) {
+	return func(t *testing.T) {
+		t.Parallel()
+
+		file, err := Open(path)
+		if err != nil {
+			t.Fatal(err)
+		}
+		if err := file.Close(); err != nil {
+			t.Fatalf("unexpected error from Close: %v", err)
+		}
+		if err := file.Close(); err == nil {
+			t.Error("second Close did not fail")
+		} else if pe, ok := err.(*PathError); !ok {
+			t.Errorf("second Close: got %T, want %T", err, pe)
+		} else if pe.Err != ErrClosed {
+			t.Errorf("second Close: got %q, want %q", pe.Err, ErrClosed)
+		} else {
+			t.Logf("second close returned expected error %q", err)
+		}
 	}
 }
 
 func TestDoubleCloseError(t *testing.T) {
-	testDoubleCloseError(t, filepath.Join(sfdir, sfname))
-	testDoubleCloseError(t, sfdir)
+	t.Parallel()
+	t.Run("file", testDoubleCloseError(filepath.Join(sfdir, sfname)))
+	t.Run("dir", testDoubleCloseError(sfdir))
 }
 
 func TestUserHomeDir(t *testing.T) {
+	t.Parallel()
+
 	dir, err := UserHomeDir()
 	if dir == "" && err == nil {
 		t.Fatal("UserHomeDir returned an empty string but no error")
 	}
 	if err != nil {
-		t.Skipf("UserHomeDir failed: %v", err)
+		// UserHomeDir may return a non-nil error if the environment variable
+		// for the home directory is empty or unset in the environment.
+		t.Skipf("skipping: %v", err)
 	}
+
 	fi, err := Stat(dir)
 	if err != nil {
+		if IsNotExist(err) {
+			// The user's home directory has a well-defined location, but does not
+			// exist. (Maybe nothing has written to it yet? That could happen, for
+			// example, on minimal VM images used for CI testing.)
+			t.Log(err)
+			return
+		}
 		t.Fatal(err)
 	}
 	if !fi.IsDir() {
@@ -2566,6 +2853,8 @@
 }
 
 func TestDirSeek(t *testing.T) {
+	t.Parallel()
+
 	wd, err := Getwd()
 	if err != nil {
 		t.Fatal(err)
@@ -2590,7 +2879,6 @@
 	dirnames2, err := f.Readdirnames(0)
 	if err != nil {
 		t.Fatal(err)
-		return
 	}
 
 	if len(dirnames1) != len(dirnames2) {
@@ -2608,6 +2896,8 @@
 	// See issue 37161. Read only one entry from a directory,
 	// seek to the beginning, and read again. We should not see
 	// duplicate entries.
+	t.Parallel()
+
 	wd, err := Getwd()
 	if err != nil {
 		t.Fatal(err)
@@ -2632,7 +2922,7 @@
 	}
 }
 
-// isDeadlineExceeded reports whether err is or wraps os.ErrDeadlineExceeded.
+// isDeadlineExceeded reports whether err is or wraps ErrDeadlineExceeded.
 // We also check that the error has a Timeout method that returns true.
 func isDeadlineExceeded(err error) bool {
 	if !IsTimeout(err) {
@@ -2647,6 +2937,7 @@
 // Test that opening a file does not change its permissions.  Issue 38225.
 func TestOpenFileKeepsPermissions(t *testing.T) {
 	t.Parallel()
+
 	dir := t.TempDir()
 	name := filepath.Join(dir, "x")
 	f, err := Create(name)
@@ -2676,6 +2967,8 @@
 }
 
 func TestDirFS(t *testing.T) {
+	t.Parallel()
+
 	// On Windows, we force the MFT to update by reading the actual metadata from GetFileInformationByHandle and then
 	// explicitly setting that. Otherwise it might get out of sync with FindFirstFile. See golang.org/issues/42637.
 	if runtime.GOOS == "windows" {
@@ -2702,15 +2995,23 @@
 			t.Fatal(err)
 		}
 	}
-	fs := DirFS("./testdata/dirfs")
-	if err := fstest.TestFS(fs, "a", "b", "dir/x"); err != nil {
+	fsys := DirFS("./testdata/dirfs")
+	if err := fstest.TestFS(fsys, "a", "b", "dir/x"); err != nil {
 		t.Fatal(err)
 	}
 
+	rdfs, ok := fsys.(fs.ReadDirFS)
+	if !ok {
+		t.Error("expected DirFS result to implement fs.ReadDirFS")
+	}
+	if _, err := rdfs.ReadDir("nonexistent"); err == nil {
+		t.Error("fs.ReadDir of nonexistent directory succeeded")
+	}
+
 	// Test that the error message does not contain a backslash,
 	// and does not contain the DirFS argument.
 	const nonesuch = "dir/nonesuch"
-	_, err := fs.Open(nonesuch)
+	_, err := fsys.Open(nonesuch)
 	if err == nil {
 		t.Error("fs.Open of nonexistent file succeeded")
 	} else {
@@ -2737,7 +3038,9 @@
 }
 
 func TestDirFSRootDir(t *testing.T) {
-	cwd, err := os.Getwd()
+	t.Parallel()
+
+	cwd, err := Getwd()
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -2755,8 +3058,10 @@
 }
 
 func TestDirFSEmptyDir(t *testing.T) {
+	t.Parallel()
+
 	d := DirFS("")
-	cwd, _ := os.Getwd()
+	cwd, _ := Getwd()
 	for _, path := range []string{
 		"testdata/dirfs/a",                          // not DirFS(".")
 		filepath.ToSlash(cwd) + "/testdata/dirfs/a", // not DirFS("/")
@@ -2772,16 +3077,17 @@
 	if runtime.GOOS == "windows" {
 		t.Skipf("skipping on Windows")
 	}
+	t.Parallel()
 
 	d := t.TempDir()
-	if err := os.WriteFile(filepath.Join(d, "control.txt"), []byte(string("Hello, world!")), 0644); err != nil {
+	if err := WriteFile(filepath.Join(d, "control.txt"), []byte(string("Hello, world!")), 0644); err != nil {
 		t.Fatal(err)
 	}
-	if err := os.WriteFile(filepath.Join(d, `e:xperi\ment.txt`), []byte(string("Hello, colon and backslash!")), 0644); err != nil {
+	if err := WriteFile(filepath.Join(d, `e:xperi\ment.txt`), []byte(string("Hello, colon and backslash!")), 0644); err != nil {
 		t.Fatal(err)
 	}
 
-	fsys := os.DirFS(d)
+	fsys := DirFS(d)
 	err := fs.WalkDir(fsys, ".", func(path string, e fs.DirEntry, err error) error {
 		if fs.ValidPath(e.Name()) {
 			t.Logf("%q ok", e.Name())
@@ -2796,6 +3102,8 @@
 }
 
 func TestReadFileProc(t *testing.T) {
+	t.Parallel()
+
 	// Linux files in /proc report 0 size,
 	// but then if ReadFile reads just a single byte at offset 0,
 	// the read at offset 1 returns EOF instead of more data.
@@ -2814,6 +3122,23 @@
 	}
 }
 
+func TestDirFSReadFileProc(t *testing.T) {
+	t.Parallel()
+
+	fsys := DirFS("/")
+	name := "proc/sys/fs/pipe-max-size"
+	if _, err := fs.Stat(fsys, name); err != nil {
+		t.Skip()
+	}
+	data, err := fs.ReadFile(fsys, name)
+	if err != nil {
+		t.Fatal(err)
+	}
+	if len(data) == 0 || data[len(data)-1] != '\n' {
+		t.Fatalf("read %s: not newline-terminated: %q", name, data)
+	}
+}
+
 func TestWriteStringAlloc(t *testing.T) {
 	if runtime.GOOS == "js" {
 		t.Skip("js allocates a lot during File.WriteString")
@@ -2835,9 +3160,10 @@
 // Test that it's OK to have parallel I/O and Close on a pipe.
 func TestPipeIOCloseRace(t *testing.T) {
 	// Skip on wasm, which doesn't have pipes.
-	if runtime.GOOS == "js" {
-		t.Skip("skipping on js: no pipes")
+	if runtime.GOOS == "js" || runtime.GOOS == "wasip1" {
+		t.Skipf("skipping on %s: no pipes", runtime.GOOS)
 	}
+	t.Parallel()
 
 	r, w, err := Pipe()
 	if err != nil {
@@ -2912,9 +3238,10 @@
 // Test that it's OK to call Close concurrently on a pipe.
 func TestPipeCloseRace(t *testing.T) {
 	// Skip on wasm, which doesn't have pipes.
-	if runtime.GOOS == "js" {
-		t.Skip("skipping on js: no pipes")
+	if runtime.GOOS == "js" || runtime.GOOS == "wasip1" {
+		t.Skipf("skipping on %s: no pipes", runtime.GOOS)
 	}
+	t.Parallel()
 
 	r, w, err := Pipe()
 	if err != nil {
diff --git a/src/os/os_unix_test.go b/src/os/os_unix_test.go
index c3c703f..98e7afd 100644
--- a/src/os/os_unix_test.go
+++ b/src/os/os_unix_test.go
@@ -2,13 +2,13 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build unix || (js && wasm)
+//go:build unix || (js && wasm) || wasip1
 
 package os_test
 
 import (
+	"internal/testenv"
 	"io"
-	"os"
 	. "os"
 	"path/filepath"
 	"runtime"
@@ -40,6 +40,11 @@
 }
 
 func TestChown(t *testing.T) {
+	if runtime.GOOS == "wasip1" {
+		t.Skip("file ownership not supported on " + runtime.GOOS)
+	}
+	t.Parallel()
+
 	// 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
@@ -83,6 +88,11 @@
 }
 
 func TestFileChown(t *testing.T) {
+	if runtime.GOOS == "wasip1" {
+		t.Skip("file ownership not supported on " + runtime.GOOS)
+	}
+	t.Parallel()
+
 	// 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
@@ -126,6 +136,9 @@
 }
 
 func TestLchown(t *testing.T) {
+	testenv.MustHaveSymlink(t)
+	t.Parallel()
+
 	// 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
@@ -190,7 +203,7 @@
 	}
 	dir := newDir("TestReaddirRemoveRace", t)
 	defer RemoveAll(dir)
-	if err := os.WriteFile(filepath.Join(dir, "some-file"), []byte("hello"), 0644); err != nil {
+	if err := WriteFile(filepath.Join(dir, "some-file"), []byte("hello"), 0644); err != nil {
 		t.Fatal(err)
 	}
 	d, err := Open(dir)
@@ -214,6 +227,11 @@
 
 // Issue 23120: respect umask when doing Mkdir with the sticky bit
 func TestMkdirStickyUmask(t *testing.T) {
+	if runtime.GOOS == "wasip1" {
+		t.Skip("file permissions not supported on " + runtime.GOOS)
+	}
+	t.Parallel()
+
 	const umask = 0077
 	dir := newDir("TestMkdirStickyUmask", t)
 	defer RemoveAll(dir)
@@ -234,7 +252,7 @@
 
 // See also issues: 22939, 24331
 func newFileTest(t *testing.T, blocking bool) {
-	if runtime.GOOS == "js" {
+	if runtime.GOOS == "js" || runtime.GOOS == "wasip1" {
 		t.Skipf("syscall.Pipe is not available on %s.", runtime.GOOS)
 	}
 
@@ -296,6 +314,14 @@
 	newFileTest(t, false)
 }
 
+func TestNewFileInvalid(t *testing.T) {
+	t.Parallel()
+	const negOne = ^uintptr(0)
+	if f := NewFile(negOne, "invalid"); f != nil {
+		t.Errorf("NewFile(-1) got %v want nil", f)
+	}
+}
+
 func TestSplitPath(t *testing.T) {
 	t.Parallel()
 	for _, tt := range []struct{ path, wantDir, wantBase string }{
diff --git a/src/os/os_windows_test.go b/src/os/os_windows_test.go
index b9fad71..d6aab18 100644
--- a/src/os/os_windows_test.go
+++ b/src/os/os_windows_test.go
@@ -14,10 +14,11 @@
 	"io"
 	"io/fs"
 	"os"
-	osexec "os/exec"
+	"os/exec"
 	"path/filepath"
 	"reflect"
 	"runtime"
+	"slices"
 	"sort"
 	"strings"
 	"syscall"
@@ -49,11 +50,7 @@
 }
 
 func TestSameWindowsFile(t *testing.T) {
-	temp, err := os.MkdirTemp("", "TestSameWindowsFile")
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer os.RemoveAll(temp)
+	temp := t.TempDir()
 	chdir(t, temp)
 
 	f, err := os.Create("a")
@@ -99,15 +96,11 @@
 }
 
 func testDirLinks(t *testing.T, tests []dirLinkTest) {
-	tmpdir, err := os.MkdirTemp("", "testDirLinks")
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer os.RemoveAll(tmpdir)
+	tmpdir := t.TempDir()
 	chdir(t, tmpdir)
 
 	dir := filepath.Join(tmpdir, "dir")
-	err = os.Mkdir(dir, 0777)
+	err := os.Mkdir(dir, 0777)
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -298,14 +291,14 @@
 			},
 		},
 	}
-	output, _ := osexec.Command("cmd", "/c", "mklink", "/?").Output()
+	output, _ := testenv.Command(t, "cmd", "/c", "mklink", "/?").Output()
 	mklinkSupportsJunctionLinks := strings.Contains(string(output), " /J ")
 	if mklinkSupportsJunctionLinks {
 		tests = append(tests,
 			dirLinkTest{
 				name: "use_mklink_cmd",
 				mklink: func(link, target string) error {
-					output, err := osexec.Command("cmd", "/c", "mklink", "/J", link, target).CombinedOutput()
+					output, err := testenv.Command(t, "cmd", "/c", "mklink", "/J", link, target).CombinedOutput()
 					if err != nil {
 						t.Errorf("failed to run mklink %v %v: %v %q", link, target, err, output)
 					}
@@ -371,14 +364,14 @@
 
 func TestDirectorySymbolicLink(t *testing.T) {
 	var tests []dirLinkTest
-	output, _ := osexec.Command("cmd", "/c", "mklink", "/?").Output()
+	output, _ := testenv.Command(t, "cmd", "/c", "mklink", "/?").Output()
 	mklinkSupportsDirectorySymbolicLinks := strings.Contains(string(output), " /D ")
 	if mklinkSupportsDirectorySymbolicLinks {
 		tests = append(tests,
 			dirLinkTest{
 				name: "use_mklink_cmd",
 				mklink: func(link, target string) error {
-					output, err := osexec.Command("cmd", "/c", "mklink", "/D", link, target).CombinedOutput()
+					output, err := testenv.Command(t, "cmd", "/c", "mklink", "/D", link, target).CombinedOutput()
 					if err != nil {
 						t.Errorf("failed to run mklink %v %v: %v %q", link, target, err, output)
 					}
@@ -439,19 +432,14 @@
 
 	const _NERR_ServerNotStarted = syscall.Errno(2114)
 
-	dir, err := os.MkdirTemp("", "TestNetworkSymbolicLink")
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer os.RemoveAll(dir)
-
+	dir := t.TempDir()
 	chdir(t, dir)
 
 	shareName := "GoSymbolicLinkTestShare" // hope no conflictions
 	sharePath := filepath.Join(dir, shareName)
 	testDir := "TestDir"
 
-	err = os.MkdirAll(filepath.Join(sharePath, testDir), 0777)
+	err := os.MkdirAll(filepath.Join(sharePath, testDir), 0777)
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -534,6 +522,8 @@
 }
 
 func TestStartProcessAttr(t *testing.T) {
+	t.Parallel()
+
 	p, err := os.StartProcess(os.Getenv("COMSPEC"), []string{"/c", "cd"}, new(os.ProcAttr))
 	if err != nil {
 		return
@@ -546,6 +536,8 @@
 	if testing.Short() {
 		t.Skip("slow test that uses network; skipping")
 	}
+	t.Parallel()
+
 	_, err := os.Stat(`\\no_such_server\no_such_share\no_such_file`)
 	if err == nil {
 		t.Fatal("stat succeeded, but expected to fail")
@@ -592,11 +584,7 @@
 }
 
 func TestOpenVolumeName(t *testing.T) {
-	tmpdir, err := os.MkdirTemp("", "TestOpenVolumeName")
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer os.RemoveAll(tmpdir)
+	tmpdir := t.TempDir()
 	chdir(t, tmpdir)
 
 	want := []string{"file1", "file2", "file3", "gopher.txt"}
@@ -626,6 +614,8 @@
 }
 
 func TestDeleteReadOnly(t *testing.T) {
+	t.Parallel()
+
 	tmpdir := t.TempDir()
 	p := filepath.Join(tmpdir, "a")
 	// This sets FILE_ATTRIBUTE_READONLY.
@@ -723,11 +713,15 @@
 }
 
 func TestStatPagefile(t *testing.T) {
-	fi, err := os.Stat(`c:\pagefile.sys`)
+	t.Parallel()
+
+	const path = `c:\pagefile.sys`
+	fi, err := os.Stat(path)
 	if err == nil {
 		if fi.Name() == "" {
-			t.Fatal(`FileInfo of c:\pagefile.sys has empty name`)
+			t.Fatalf("Stat(%q).Name() is empty", path)
 		}
+		t.Logf("Stat(%q).Size() = %v", path, fi.Size())
 		return
 	}
 	if os.IsNotExist(err) {
@@ -769,6 +763,11 @@
 }
 
 func TestCmdArgs(t *testing.T) {
+	if testing.Short() {
+		t.Skipf("in short mode; skipping test that builds a binary")
+	}
+	t.Parallel()
+
 	tmpdir := t.TempDir()
 
 	const prog = `
@@ -789,7 +788,7 @@
 	}
 
 	exe := filepath.Join(tmpdir, "main.exe")
-	cmd := osexec.Command(testenv.GoToolPath(t), "build", "-o", exe, src)
+	cmd := testenv.Command(t, testenv.GoToolPath(t), "build", "-o", exe, src)
 	cmd.Dir = tmpdir
 	out, err := cmd.CombinedOutput()
 	if err != nil {
@@ -854,7 +853,7 @@
 
 		// test both syscall.EscapeArg and os.commandLineToArgv
 		args := os.CommandLineToArgv(exe + cmd)
-		out, err := osexec.Command(args[0], args[1:]...).CombinedOutput()
+		out, err := testenv.Command(t, args[0], args[1:]...).CombinedOutput()
 		if err != nil {
 			t.Fatalf("running %q failed: %v\n%v", args, err, string(out))
 		}
@@ -874,15 +873,26 @@
 	}
 	defer k.Close()
 
-	path, _, err := k.GetStringValue("UserFolder")
+	path, valtype, err := k.GetStringValue("UserFolder")
 	if err != nil {
 		return "", fmt.Errorf("reading UserFolder failed: %v", err)
 	}
+
+	if valtype == registry.EXPAND_SZ {
+		expanded, err := registry.ExpandString(path)
+		if err != nil {
+			return "", fmt.Errorf("expanding UserFolder failed: %v", err)
+		}
+		path = expanded
+	}
+
 	return path, nil
 }
 
 // TestOneDrive verifies that OneDrive folder is a directory and not a symlink.
 func TestOneDrive(t *testing.T) {
+	t.Parallel()
+
 	dir, err := findOneDriveDir()
 	if err != nil {
 		t.Skipf("Skipping, because we did not find OneDrive directory: %v", err)
@@ -891,6 +901,8 @@
 }
 
 func TestWindowsDevNullFile(t *testing.T) {
+	t.Parallel()
+
 	f1, err := os.Open("NUL")
 	if err != nil {
 		t.Fatal(err)
@@ -919,6 +931,8 @@
 }
 
 func TestFileStatNUL(t *testing.T) {
+	t.Parallel()
+
 	f, err := os.Open("NUL")
 	if err != nil {
 		t.Fatal(err)
@@ -933,6 +947,8 @@
 }
 
 func TestStatNUL(t *testing.T) {
+	t.Parallel()
+
 	fi, err := os.Stat("NUL")
 	if err != nil {
 		t.Fatal(err)
@@ -1098,6 +1114,8 @@
 
 // TestStatOfInvalidName is regression test for issue #24999.
 func TestStatOfInvalidName(t *testing.T) {
+	t.Parallel()
+
 	_, err := os.Stat("*.go")
 	if err == nil {
 		t.Fatal(`os.Stat("*.go") unexpectedly succeeded`)
@@ -1121,20 +1139,26 @@
 }
 
 func TestRootDirAsTemp(t *testing.T) {
-	testenv.MustHaveExec(t)
-
 	if os.Getenv("GO_WANT_HELPER_PROCESS") == "1" {
 		fmt.Print(os.TempDir())
 		os.Exit(0)
 	}
 
-	newtmp, err := findUnusedDriveLetter()
+	testenv.MustHaveExec(t)
+	t.Parallel()
+
+	exe, err := os.Executable()
 	if err != nil {
 		t.Fatal(err)
 	}
 
-	cmd := osexec.Command(os.Args[0], "-test.run=TestRootDirAsTemp")
-	cmd.Env = os.Environ()
+	newtmp, err := findUnusedDriveLetter()
+	if err != nil {
+		t.Skip(err)
+	}
+
+	cmd := testenv.Command(t, exe, "-test.run=TestRootDirAsTemp")
+	cmd.Env = cmd.Environ()
 	cmd.Env = append(cmd.Env, "GO_WANT_HELPER_PROCESS=1")
 	cmd.Env = append(cmd.Env, "TMP="+newtmp)
 	cmd.Env = append(cmd.Env, "TEMP="+newtmp)
@@ -1159,21 +1183,21 @@
 }
 
 func mklink(t *testing.T, link, target string) {
-	output, err := osexec.Command("cmd", "/c", "mklink", link, target).CombinedOutput()
+	output, err := testenv.Command(t, "cmd", "/c", "mklink", link, target).CombinedOutput()
 	if err != nil {
 		t.Fatalf("failed to run mklink %v %v: %v %q", link, target, err, output)
 	}
 }
 
 func mklinkj(t *testing.T, link, target string) {
-	output, err := osexec.Command("cmd", "/c", "mklink", "/J", link, target).CombinedOutput()
+	output, err := testenv.Command(t, "cmd", "/c", "mklink", "/J", link, target).CombinedOutput()
 	if err != nil {
 		t.Fatalf("failed to run mklink %v %v: %v %q", link, target, err, output)
 	}
 }
 
 func mklinkd(t *testing.T, link, target string) {
-	output, err := osexec.Command("cmd", "/c", "mklink", "/D", link, target).CombinedOutput()
+	output, err := testenv.Command(t, "cmd", "/c", "mklink", "/D", link, target).CombinedOutput()
 	if err != nil {
 		t.Fatalf("failed to run mklink %v %v: %v %q", link, target, err, output)
 	}
@@ -1194,7 +1218,7 @@
 	chdir(t, tmpdir)
 
 	vol := filepath.VolumeName(tmpdir)
-	output, err := osexec.Command("cmd", "/c", "mountvol", vol, "/L").CombinedOutput()
+	output, err := testenv.Command(t, "cmd", "/c", "mountvol", vol, "/L").CombinedOutput()
 	if err != nil {
 		t.Fatalf("failed to run mountvol %v /L: %v %q", vol, err, output)
 	}
@@ -1254,6 +1278,8 @@
 }
 
 func TestOpenDirTOCTOU(t *testing.T) {
+	t.Parallel()
+
 	// Check opened directories can't be renamed until the handle is closed.
 	// See issue 52747.
 	tmpdir := t.TempDir()
@@ -1277,3 +1303,165 @@
 		t.Error(err)
 	}
 }
+
+func TestAppExecLinkStat(t *testing.T) {
+	// We expect executables installed to %LOCALAPPDATA%\Microsoft\WindowsApps to
+	// be reparse points with tag IO_REPARSE_TAG_APPEXECLINK. Here we check that
+	// such reparse points are treated as irregular (but executable) files, not
+	// broken symlinks.
+	appdata := os.Getenv("LOCALAPPDATA")
+	if appdata == "" {
+		t.Skipf("skipping: LOCALAPPDATA not set")
+	}
+
+	pythonExeName := "python3.exe"
+	pythonPath := filepath.Join(appdata, `Microsoft\WindowsApps`, pythonExeName)
+
+	lfi, err := os.Lstat(pythonPath)
+	if err != nil {
+		t.Skip("skipping test, because Python 3 is not installed via the Windows App Store on this system; see https://golang.org/issue/42919")
+	}
+
+	// An APPEXECLINK reparse point is not a symlink, so os.Readlink should return
+	// a non-nil error for it, and Stat should return results identical to Lstat.
+	linkName, err := os.Readlink(pythonPath)
+	if err == nil {
+		t.Errorf("os.Readlink(%q) = %q, but expected an error\n(should be an APPEXECLINK reparse point, not a symlink)", pythonPath, linkName)
+	}
+
+	sfi, err := os.Stat(pythonPath)
+	if err != nil {
+		t.Fatalf("Stat %s: %v", pythonPath, err)
+	}
+
+	if lfi.Name() != sfi.Name() {
+		t.Logf("os.Lstat(%q) = %+v", pythonPath, lfi)
+		t.Logf("os.Stat(%q)  = %+v", pythonPath, sfi)
+		t.Errorf("files should be same")
+	}
+
+	if lfi.Name() != pythonExeName {
+		t.Errorf("Stat %s: got %q, but wanted %q", pythonPath, lfi.Name(), pythonExeName)
+	}
+	if m := lfi.Mode(); m&fs.ModeSymlink != 0 {
+		t.Errorf("%q should be a file, not a link (mode=0x%x)", pythonPath, uint32(m))
+	}
+	if m := lfi.Mode(); m&fs.ModeDir != 0 {
+		t.Errorf("%q should be a file, not a directory (mode=0x%x)", pythonPath, uint32(m))
+	}
+	if m := lfi.Mode(); m&fs.ModeIrregular == 0 {
+		// A reparse point is not a regular file, but we don't have a more appropriate
+		// ModeType bit for it, so it should be marked as irregular.
+		t.Errorf("%q should not be a regular file (mode=0x%x)", pythonPath, uint32(m))
+	}
+
+	if sfi.Name() != pythonExeName {
+		t.Errorf("Stat %s: got %q, but wanted %q", pythonPath, sfi.Name(), pythonExeName)
+	}
+	if m := sfi.Mode(); m&fs.ModeSymlink != 0 {
+		t.Errorf("%q should be a file, not a link (mode=0x%x)", pythonPath, uint32(m))
+	}
+	if m := sfi.Mode(); m&fs.ModeDir != 0 {
+		t.Errorf("%q should be a file, not a directory (mode=0x%x)", pythonPath, uint32(m))
+	}
+	if m := sfi.Mode(); m&fs.ModeIrregular == 0 {
+		// A reparse point is not a regular file, but we don't have a more appropriate
+		// ModeType bit for it, so it should be marked as irregular.
+		t.Errorf("%q should not be a regular file (mode=0x%x)", pythonPath, uint32(m))
+	}
+
+	p, err := exec.LookPath(pythonPath)
+	if err != nil {
+		t.Errorf("exec.LookPath(%q): %v", pythonPath, err)
+	}
+	if p != pythonPath {
+		t.Errorf("exec.LookPath(%q) = %q; want %q", pythonPath, p, pythonPath)
+	}
+}
+
+func TestIllformedUTF16FileName(t *testing.T) {
+	dir := t.TempDir()
+	const sep = string(os.PathSeparator)
+	if !strings.HasSuffix(dir, sep) {
+		dir += sep
+	}
+
+	// This UTF-16 file name is ill-formed as it contains low surrogates that are not preceded by high surrogates ([1:5]).
+	namew := []uint16{0x2e, 0xdc6d, 0xdc73, 0xdc79, 0xdc73, 0x30, 0x30, 0x30, 0x31, 0}
+
+	// Create a file whose name contains unpaired surrogates.
+	// Use syscall.CreateFile instead of os.Create to simulate a file that is created by
+	// a non-Go program so the file name hasn't gone through syscall.UTF16FromString.
+	dirw := utf16.Encode([]rune(dir))
+	pathw := append(dirw, namew...)
+	fd, err := syscall.CreateFile(&pathw[0], syscall.GENERIC_ALL, 0, nil, syscall.CREATE_NEW, 0, 0)
+	if err != nil {
+		t.Fatal(err)
+	}
+	syscall.CloseHandle(fd)
+
+	name := syscall.UTF16ToString(namew)
+	path := filepath.Join(dir, name)
+	// Verify that os.Lstat can query the file.
+	fi, err := os.Lstat(path)
+	if err != nil {
+		t.Fatal(err)
+	}
+	if got := fi.Name(); got != name {
+		t.Errorf("got %q, want %q", got, name)
+	}
+	// Verify that File.Readdirnames lists the file.
+	f, err := os.Open(dir)
+	if err != nil {
+		t.Fatal(err)
+	}
+	files, err := f.Readdirnames(0)
+	f.Close()
+	if err != nil {
+		t.Fatal(err)
+	}
+	if !slices.Contains(files, name) {
+		t.Error("file not listed")
+	}
+	// Verify that os.RemoveAll can remove the directory
+	// and that it doesn't hang.
+	err = os.RemoveAll(dir)
+	if err != nil {
+		t.Error(err)
+	}
+}
+
+func TestUTF16Alloc(t *testing.T) {
+	allowsPerRun := func(want int, f func()) {
+		t.Helper()
+		got := int(testing.AllocsPerRun(5, f))
+		if got != want {
+			t.Errorf("got %d allocs, want %d", got, want)
+		}
+	}
+	allowsPerRun(1, func() {
+		syscall.UTF16ToString([]uint16{'a', 'b', 'c'})
+	})
+	allowsPerRun(1, func() {
+		syscall.UTF16FromString("abc")
+	})
+}
+
+func TestNewFileInvalid(t *testing.T) {
+	t.Parallel()
+	if f := os.NewFile(uintptr(syscall.InvalidHandle), "invalid"); f != nil {
+		t.Errorf("NewFile(InvalidHandle) got %v want nil", f)
+	}
+}
+
+func TestReadDirPipe(t *testing.T) {
+	dir := `\\.\pipe\`
+	fi, err := os.Stat(dir)
+	if err != nil || !fi.IsDir() {
+		t.Skipf("%s is not a directory", dir)
+	}
+	_, err = os.ReadDir(dir)
+	if err != nil {
+		t.Errorf("ReadDir(%q) = %v", dir, err)
+	}
+}
diff --git a/src/os/path_test.go b/src/os/path_test.go
index 59f7283..2a4e956 100644
--- a/src/os/path_test.go
+++ b/src/os/path_test.go
@@ -16,6 +16,8 @@
 var isReadonlyError = func(error) bool { return false }
 
 func TestMkdirAll(t *testing.T) {
+	t.Parallel()
+
 	tmpDir := TempDir()
 	path := tmpDir + "/_TestMkdirAll_/dir/./dir2"
 	err := MkdirAll(path, 0777)
@@ -76,6 +78,7 @@
 
 func TestMkdirAllWithSymlink(t *testing.T) {
 	testenv.MustHaveSymlink(t)
+	t.Parallel()
 
 	tmpDir := t.TempDir()
 	dir := tmpDir + "/dir"
@@ -99,6 +102,10 @@
 	case "android", "ios", "plan9", "windows":
 		t.Skipf("skipping on %s", runtime.GOOS)
 	}
+	if testenv.Builder() == "" {
+		t.Skipf("skipping non-hermetic test outside of Go builders")
+	}
+
 	RemoveAll("/_go_os_test")
 	const dir = "/_go_os_test/dir"
 	err := MkdirAll(dir, 0777)
diff --git a/src/os/path_unix.go b/src/os/path_unix.go
index 3c6310a..c975cdb 100644
--- a/src/os/path_unix.go
+++ b/src/os/path_unix.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build unix || (js && wasm)
+//go:build unix || (js && wasm) || wasip1
 
 package os
 
diff --git a/src/os/path_windows_test.go b/src/os/path_windows_test.go
index e960bcb..2506b4f 100644
--- a/src/os/path_windows_test.go
+++ b/src/os/path_windows_test.go
@@ -15,6 +15,8 @@
 	if os.CanUseLongPaths {
 		return
 	}
+	t.Parallel()
+
 	// 248 is long enough to trigger the longer-than-248 checks in
 	// fixLongPath, but short enough not to make a path component
 	// longer than 255, which is illegal on Windows. (which
@@ -50,6 +52,8 @@
 }
 
 func TestMkdirAllLongPath(t *testing.T) {
+	t.Parallel()
+
 	tmpDir := t.TempDir()
 	path := tmpDir
 	for i := 0; i < 100; i++ {
@@ -64,6 +68,7 @@
 }
 
 func TestMkdirAllExtendedLength(t *testing.T) {
+	t.Parallel()
 	tmpDir := t.TempDir()
 
 	const prefix = `\\?\`
@@ -86,6 +91,8 @@
 }
 
 func TestOpenRootSlash(t *testing.T) {
+	t.Parallel()
+
 	tests := []string{
 		`/`,
 		`\`,
diff --git a/src/os/pipe2_unix.go b/src/os/pipe2_unix.go
index 1e2e8cc..2d293fd 100644
--- a/src/os/pipe2_unix.go
+++ b/src/os/pipe2_unix.go
@@ -18,5 +18,5 @@
 		return nil, nil, NewSyscallError("pipe2", e)
 	}
 
-	return newFile(uintptr(p[0]), "|0", kindPipe), newFile(uintptr(p[1]), "|1", kindPipe), nil
+	return newFile(p[0], "|0", kindPipe), newFile(p[1], "|1", kindPipe), nil
 }
diff --git a/src/os/pipe_test.go b/src/os/pipe_test.go
index 2656585..6f01d30 100644
--- a/src/os/pipe_test.go
+++ b/src/os/pipe_test.go
@@ -4,7 +4,7 @@
 
 // Test broken pipes on Unix systems.
 //
-//go:build !plan9 && !js
+//go:build !plan9 && !js && !wasip1
 
 package os_test
 
@@ -16,7 +16,7 @@
 	"io"
 	"io/fs"
 	"os"
-	osexec "os/exec"
+	"os/exec"
 	"os/signal"
 	"runtime"
 	"strconv"
@@ -28,6 +28,16 @@
 )
 
 func TestEPIPE(t *testing.T) {
+	// This test cannot be run in parallel because of a race similar
+	// to the one reported in https://go.dev/issue/22315.
+	//
+	// Even though the pipe is opened with O_CLOEXEC, if another test forks in
+	// between the call to os.Pipe and the call to r.Close, that child process can
+	// retain an open copy of r's file descriptor until it execs. If one of our
+	// Write calls occurs during that interval it can spuriously succeed,
+	// buffering the write to the child's copy of the pipe (even though the child
+	// will not actually read the buffered bytes).
+
 	r, w, err := os.Pipe()
 	if err != nil {
 		t.Fatal(err)
@@ -64,7 +74,35 @@
 	case "windows":
 		t.Skip("Windows doesn't support SIGPIPE")
 	}
+
+	if os.Getenv("GO_TEST_STD_PIPE_HELPER") != "" {
+		if os.Getenv("GO_TEST_STD_PIPE_HELPER_SIGNAL") != "" {
+			signal.Notify(make(chan os.Signal, 1), syscall.SIGPIPE)
+		}
+		switch os.Getenv("GO_TEST_STD_PIPE_HELPER") {
+		case "1":
+			os.Stdout.Write([]byte("stdout"))
+		case "2":
+			os.Stderr.Write([]byte("stderr"))
+		case "3":
+			if _, err := os.NewFile(3, "3").Write([]byte("3")); err == nil {
+				os.Exit(3)
+			}
+		default:
+			panic("unrecognized value for GO_TEST_STD_PIPE_HELPER")
+		}
+		// For stdout/stderr, we should have crashed with a broken pipe error.
+		// The caller will be looking for that exit status,
+		// so just exit normally here to cause a failure in the caller.
+		// For descriptor 3, a normal exit is expected.
+		os.Exit(0)
+	}
+
 	testenv.MustHaveExec(t)
+	// This test cannot be run in parallel due to the same race as for TestEPIPE.
+	// (We expect a write to a closed pipe can fail, but a concurrent fork of a
+	// child process can cause the pipe to unexpectedly remain open.)
+
 	r, w, err := os.Pipe()
 	if err != nil {
 		t.Fatal(err)
@@ -80,7 +118,7 @@
 	// all writes should fail with EPIPE and then exit 0.
 	for _, sig := range []bool{false, true} {
 		for dest := 1; dest < 4; dest++ {
-			cmd := osexec.Command(os.Args[0], "-test.run", "TestStdPipeHelper")
+			cmd := testenv.Command(t, os.Args[0], "-test.run", "TestStdPipe")
 			cmd.Stdout = w
 			cmd.Stderr = w
 			cmd.ExtraFiles = []*os.File{w}
@@ -92,7 +130,7 @@
 				if !sig && dest < 3 {
 					t.Errorf("unexpected success of write to closed pipe %d sig %t in child", dest, sig)
 				}
-			} else if ee, ok := err.(*osexec.ExitError); !ok {
+			} else if ee, ok := err.(*exec.ExitError); !ok {
 				t.Errorf("unexpected exec error type %T: %v", err, err)
 			} else if ws, ok := ee.Sys().(syscall.WaitStatus); !ok {
 				t.Errorf("unexpected wait status type %T: %v", ee.Sys(), ee.Sys())
@@ -107,14 +145,14 @@
 	}
 
 	// Test redirecting stdout but not stderr.  Issue 40076.
-	cmd := osexec.Command(os.Args[0], "-test.run", "TestStdPipeHelper")
+	cmd := testenv.Command(t, os.Args[0], "-test.run", "TestStdPipe")
 	cmd.Stdout = w
 	var stderr bytes.Buffer
 	cmd.Stderr = &stderr
-	cmd.Env = append(os.Environ(), "GO_TEST_STD_PIPE_HELPER=1")
+	cmd.Env = append(cmd.Environ(), "GO_TEST_STD_PIPE_HELPER=1")
 	if err := cmd.Run(); err == nil {
 		t.Errorf("unexpected success of write to closed stdout")
-	} else if ee, ok := err.(*osexec.ExitError); !ok {
+	} else if ee, ok := err.(*exec.ExitError); !ok {
 		t.Errorf("unexpected exec error type %T: %v", err, err)
 	} else if ws, ok := ee.Sys().(syscall.WaitStatus); !ok {
 		t.Errorf("unexpected wait status type %T: %v", ee.Sys(), ee.Sys())
@@ -126,31 +164,11 @@
 	}
 }
 
-// This is a helper for TestStdPipe. It's not a test in itself.
-func TestStdPipeHelper(t *testing.T) {
-	if os.Getenv("GO_TEST_STD_PIPE_HELPER_SIGNAL") != "" {
-		signal.Notify(make(chan os.Signal, 1), syscall.SIGPIPE)
-	}
-	switch os.Getenv("GO_TEST_STD_PIPE_HELPER") {
-	case "1":
-		os.Stdout.Write([]byte("stdout"))
-	case "2":
-		os.Stderr.Write([]byte("stderr"))
-	case "3":
-		if _, err := os.NewFile(3, "3").Write([]byte("3")); err == nil {
-			os.Exit(3)
-		}
-	default:
-		t.Skip("skipping test helper")
-	}
-	// For stdout/stderr, we should have crashed with a broken pipe error.
-	// The caller will be looking for that exit status,
-	// so just exit normally here to cause a failure in the caller.
-	// For descriptor 3, a normal exit is expected.
-	os.Exit(0)
-}
-
 func testClosedPipeRace(t *testing.T, read bool) {
+	// This test cannot be run in parallel due to the same race as for TestEPIPE.
+	// (We expect a write to a closed pipe can fail, but a concurrent fork of a
+	// child process can cause the pipe to unexpectedly remain open.)
+
 	limit := 1
 	if !read {
 		// Get the amount we have to write to overload a pipe
@@ -237,14 +255,16 @@
 	}
 
 	testenv.MustHaveExec(t)
+	t.Parallel()
+
 	r, w, err := os.Pipe()
 	if err != nil {
 		t.Fatal(err)
 	}
 	defer r.Close()
 	defer w.Close()
-	cmd := osexec.Command(os.Args[0], "-test.run="+t.Name())
-	cmd.Env = append(os.Environ(), "GO_WANT_READ_NONBLOCKING_FD=1")
+	cmd := testenv.Command(t, os.Args[0], "-test.run="+t.Name())
+	cmd.Env = append(cmd.Environ(), "GO_WANT_READ_NONBLOCKING_FD=1")
 	cmd.Stdin = r
 	output, err := cmd.CombinedOutput()
 	t.Logf("%s", output)
@@ -254,6 +274,8 @@
 }
 
 func TestCloseWithBlockingReadByNewFile(t *testing.T) {
+	t.Parallel()
+
 	var p [2]syscallDescriptor
 	err := syscall.Pipe(p[:])
 	if err != nil {
@@ -264,6 +286,8 @@
 }
 
 func TestCloseWithBlockingReadByFd(t *testing.T) {
+	t.Parallel()
+
 	r, w, err := os.Pipe()
 	if err != nil {
 		t.Fatal(err)
@@ -275,137 +299,118 @@
 
 // Test that we don't let a blocking read prevent a close.
 func testCloseWithBlockingRead(t *testing.T, r, w *os.File) {
-	defer r.Close()
-	defer w.Close()
-
-	c1, c2 := make(chan bool), make(chan bool)
-	var wg sync.WaitGroup
-
-	wg.Add(1)
-	go func(c chan bool) {
-		defer wg.Done()
-		// Give the other goroutine a chance to enter the Read
-		// or Write call. This is sloppy but the test will
-		// pass even if we close before the read/write.
-		time.Sleep(20 * time.Millisecond)
-
-		if err := r.Close(); err != nil {
-			t.Error(err)
-		}
-		close(c)
-	}(c1)
-
-	wg.Add(1)
-	go func(c chan bool) {
-		defer wg.Done()
+	var (
+		enteringRead = make(chan struct{})
+		done         = make(chan struct{})
+	)
+	go func() {
 		var b [1]byte
+		close(enteringRead)
 		_, err := r.Read(b[:])
-		close(c)
 		if err == nil {
 			t.Error("I/O on closed pipe unexpectedly succeeded")
 		}
+
 		if pe, ok := err.(*fs.PathError); ok {
 			err = pe.Err
 		}
 		if err != io.EOF && err != fs.ErrClosed {
 			t.Errorf("got %v, expected EOF or closed", err)
 		}
-	}(c2)
+		close(done)
+	}()
 
-	for c1 != nil || c2 != nil {
-		select {
-		case <-c1:
-			c1 = nil
-			// r.Close has completed, but the blocking Read
-			// is hanging. Close the writer to unblock it.
-			w.Close()
-		case <-c2:
-			c2 = nil
-		case <-time.After(1 * time.Second):
-			switch {
-			case c1 != nil && c2 != nil:
-				t.Error("timed out waiting for Read and Close")
-				w.Close()
-			case c1 != nil:
-				t.Error("timed out waiting for Close")
-			case c2 != nil:
-				t.Error("timed out waiting for Read")
-			default:
-				t.Error("impossible case")
-			}
-		}
+	// Give the goroutine a chance to enter the Read
+	// or Write call. This is sloppy but the test will
+	// pass even if we close before the read/write.
+	<-enteringRead
+	time.Sleep(20 * time.Millisecond)
+
+	if err := r.Close(); err != nil {
+		t.Error(err)
 	}
-
-	wg.Wait()
+	// r.Close has completed, but since we assume r is in blocking mode that
+	// probably didn't unblock the call to r.Read. Close w to unblock it.
+	w.Close()
+	<-done
 }
 
-// Issue 24164, for pipes.
 func TestPipeEOF(t *testing.T) {
+	t.Parallel()
+
 	r, w, err := os.Pipe()
 	if err != nil {
 		t.Fatal(err)
 	}
 
-	var wg sync.WaitGroup
-	wg.Add(1)
+	testPipeEOF(t, r, w)
+}
+
+// testPipeEOF tests that when the write side of a pipe or FIFO is closed,
+// a blocked Read call on the reader side returns io.EOF.
+//
+// This scenario previously failed to unblock the Read call on darwin.
+// (See https://go.dev/issue/24164.)
+func testPipeEOF(t *testing.T, r io.ReadCloser, w io.WriteCloser) {
+	// parkDelay is an arbitrary delay we wait for a pipe-reader goroutine to park
+	// before issuing the corresponding write. The test should pass no matter what
+	// delay we use, but with a longer delay is has a higher chance of detecting
+	// poller bugs.
+	parkDelay := 10 * time.Millisecond
+	if testing.Short() {
+		parkDelay = 100 * time.Microsecond
+	}
+	writerDone := make(chan struct{})
+	defer func() {
+		if err := r.Close(); err != nil {
+			t.Errorf("error closing reader: %v", err)
+		}
+		<-writerDone
+	}()
+
+	write := make(chan int, 1)
 	go func() {
-		defer wg.Done()
+		defer close(writerDone)
 
-		defer func() {
-			if err := w.Close(); err != nil {
-				t.Errorf("error closing writer: %v", err)
-			}
-		}()
-
-		for i := 0; i < 3; i++ {
-			time.Sleep(10 * time.Millisecond)
+		for i := range write {
+			time.Sleep(parkDelay)
 			_, err := fmt.Fprintf(w, "line %d\n", i)
 			if err != nil {
 				t.Errorf("error writing to fifo: %v", err)
 				return
 			}
 		}
-		time.Sleep(10 * time.Millisecond)
-	}()
 
-	defer wg.Wait()
-
-	done := make(chan bool)
-	go func() {
-		defer close(done)
-
-		defer func() {
-			if err := r.Close(); err != nil {
-				t.Errorf("error closing reader: %v", err)
-			}
-		}()
-
-		rbuf := bufio.NewReader(r)
-		for {
-			b, err := rbuf.ReadBytes('\n')
-			if err == io.EOF {
-				break
-			}
-			if err != nil {
-				t.Error(err)
-				return
-			}
-			t.Logf("%s\n", bytes.TrimSpace(b))
+		time.Sleep(parkDelay)
+		if err := w.Close(); err != nil {
+			t.Errorf("error closing writer: %v", err)
 		}
 	}()
 
-	select {
-	case <-done:
-		// Test succeeded.
-	case <-time.After(time.Second):
-		t.Error("timed out waiting for read")
-		// Close the reader to force the read to complete.
-		r.Close()
+	rbuf := bufio.NewReader(r)
+	for i := 0; i < 3; i++ {
+		write <- i
+		b, err := rbuf.ReadBytes('\n')
+		if err != nil {
+			t.Fatal(err)
+		}
+		t.Logf("%s\n", bytes.TrimSpace(b))
+	}
+
+	close(write)
+	b, err := rbuf.ReadBytes('\n')
+	if err != io.EOF || len(b) != 0 {
+		t.Errorf(`ReadBytes: %q, %v; want "", io.EOF`, b, err)
 	}
 }
 
 // Issue 24481.
 func TestFdRace(t *testing.T) {
+	// This test starts 100 simultaneous goroutines, which could bury a more
+	// interesting stack if this or some other test happens to panic. It is also
+	// nearly instantaneous, so any latency benefit from running it in parallel
+	// would be minimal.
+
 	r, w, err := os.Pipe()
 	if err != nil {
 		t.Fatal(err)
diff --git a/src/os/pipe_unix.go b/src/os/pipe_unix.go
index 710f776..2eb11a0 100644
--- a/src/os/pipe_unix.go
+++ b/src/os/pipe_unix.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build aix || darwin || (js && wasm)
+//go:build aix || darwin
 
 package os
 
@@ -24,5 +24,5 @@
 	syscall.CloseOnExec(p[1])
 	syscall.ForkLock.RUnlock()
 
-	return newFile(uintptr(p[0]), "|0", kindPipe), newFile(uintptr(p[1]), "|1", kindPipe), nil
+	return newFile(p[0], "|0", kindPipe), newFile(p[1], "|1", kindPipe), nil
 }
diff --git a/src/os/pipe_wasm.go b/src/os/pipe_wasm.go
new file mode 100644
index 0000000..87a29b1
--- /dev/null
+++ b/src/os/pipe_wasm.go
@@ -0,0 +1,16 @@
+// Copyright 2023 The Go 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:build wasm
+
+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) {
+	// Neither GOOS=js nor GOOS=wasip1 have pipes.
+	return nil, nil, NewSyscallError("pipe", syscall.ENOSYS)
+}
diff --git a/src/os/rawconn_test.go b/src/os/rawconn_test.go
index 62b99f8..8aae7ae 100644
--- a/src/os/rawconn_test.go
+++ b/src/os/rawconn_test.go
@@ -4,7 +4,7 @@
 
 // Test use of raw connections.
 //
-//go:build !plan9 && !js
+//go:build !plan9 && !js && !wasip1
 
 package os_test
 
diff --git a/src/os/read_test.go b/src/os/read_test.go
index 5c58d7d..18f7d54 100644
--- a/src/os/read_test.go
+++ b/src/os/read_test.go
@@ -8,6 +8,7 @@
 	"bytes"
 	. "os"
 	"path/filepath"
+	"runtime"
 	"testing"
 )
 
@@ -22,6 +23,8 @@
 }
 
 func TestReadFile(t *testing.T) {
+	t.Parallel()
+
 	filename := "rumpelstilzchen"
 	contents, err := ReadFile(filename)
 	if err == nil {
@@ -38,6 +41,8 @@
 }
 
 func TestWriteFile(t *testing.T) {
+	t.Parallel()
+
 	f, err := CreateTemp("", "ioutil-test")
 	if err != nil {
 		t.Fatal(err)
@@ -67,6 +72,10 @@
 	if Getuid() == 0 {
 		t.Skipf("Root can write to read-only files anyway, so skip the read-only test.")
 	}
+	if runtime.GOOS == "wasip1" {
+		t.Skip("no support for file permissions on " + runtime.GOOS)
+	}
+	t.Parallel()
 
 	// We don't want to use CreateTemp directly, since that opens a file for us as 0600.
 	tempDir, err := MkdirTemp("", t.Name())
@@ -96,6 +105,8 @@
 }
 
 func TestReadDir(t *testing.T) {
+	t.Parallel()
+
 	dirname := "rumpelstilzchen"
 	_, err := ReadDir(dirname)
 	if err == nil {
diff --git a/src/os/readfrom_linux.go b/src/os/readfrom_linux.go
index 63ea45c..7e80240 100644
--- a/src/os/readfrom_linux.go
+++ b/src/os/readfrom_linux.go
@@ -7,25 +7,88 @@
 import (
 	"internal/poll"
 	"io"
+	"syscall"
 )
 
-var pollCopyFileRange = poll.CopyFileRange
+var (
+	pollCopyFileRange = poll.CopyFileRange
+	pollSplice        = poll.Splice
+)
 
 func (f *File) readFrom(r io.Reader) (written int64, handled bool, err error) {
-	// copy_file_range(2) does not support destinations opened with
-	// O_APPEND, so don't even try.
+	// Neither copy_file_range(2) nor splice(2) supports destinations opened with
+	// O_APPEND, so don't bother to try zero-copy with these system calls.
+	//
+	// Visit https://man7.org/linux/man-pages/man2/copy_file_range.2.html#ERRORS and
+	// https://man7.org/linux/man-pages/man2/splice.2.html#ERRORS for details.
 	if f.appendMode {
 		return 0, false, nil
 	}
 
-	remain := int64(1 << 62)
+	written, handled, err = f.copyFileRange(r)
+	if handled {
+		return
+	}
+	return f.spliceToFile(r)
+}
 
-	lr, ok := r.(*io.LimitedReader)
-	if ok {
-		remain, r = lr.N, lr.R
-		if remain <= 0 {
-			return 0, true, nil
-		}
+func (f *File) spliceToFile(r io.Reader) (written int64, handled bool, err error) {
+	var (
+		remain int64
+		lr     *io.LimitedReader
+	)
+	if lr, r, remain = tryLimitedReader(r); remain <= 0 {
+		return 0, true, nil
+	}
+
+	pfd := getPollFD(r)
+	// TODO(panjf2000): run some tests to see if we should unlock the non-streams for splice.
+	// Streams benefit the most from the splice(2), non-streams are not even supported in old kernels
+	// where splice(2) will just return EINVAL; newer kernels support non-streams like UDP, but I really
+	// doubt that splice(2) could help non-streams, cuz they usually send small frames respectively
+	// and one splice call would result in one frame.
+	// splice(2) is suitable for large data but the generation of fragments defeats its edge here.
+	// Therefore, don't bother to try splice if the r is not a streaming descriptor.
+	if pfd == nil || !pfd.IsStream {
+		return
+	}
+
+	var syscallName string
+	written, handled, syscallName, err = pollSplice(&f.pfd, pfd, remain)
+
+	if lr != nil {
+		lr.N = remain - written
+	}
+
+	return written, handled, wrapSyscallError(syscallName, err)
+}
+
+// getPollFD tries to get the poll.FD from the given io.Reader by expecting
+// the underlying type of r to be the implementation of syscall.Conn that contains
+// a *net.rawConn.
+func getPollFD(r io.Reader) *poll.FD {
+	sc, ok := r.(syscall.Conn)
+	if !ok {
+		return nil
+	}
+	rc, err := sc.SyscallConn()
+	if err != nil {
+		return nil
+	}
+	ipfd, ok := rc.(interface{ PollFD() *poll.FD })
+	if !ok {
+		return nil
+	}
+	return ipfd.PollFD()
+}
+
+func (f *File) copyFileRange(r io.Reader) (written int64, handled bool, err error) {
+	var (
+		remain int64
+		lr     *io.LimitedReader
+	)
+	if lr, r, remain = tryLimitedReader(r); remain <= 0 {
+		return 0, true, nil
 	}
 
 	src, ok := r.(*File)
@@ -42,5 +105,20 @@
 	if lr != nil {
 		lr.N -= written
 	}
-	return written, handled, NewSyscallError("copy_file_range", err)
+	return written, handled, wrapSyscallError("copy_file_range", err)
+}
+
+// tryLimitedReader tries to assert the io.Reader to io.LimitedReader, it returns the io.LimitedReader,
+// the underlying io.Reader and the remaining amount of bytes if the assertion succeeds,
+// otherwise it just returns the original io.Reader and the theoretical unlimited remaining amount of bytes.
+func tryLimitedReader(r io.Reader) (*io.LimitedReader, io.Reader, int64) {
+	var remain int64 = 1<<63 - 1 // by default, copy until EOF
+
+	lr, ok := r.(*io.LimitedReader)
+	if !ok {
+		return nil, r, remain
+	}
+
+	remain = lr.N
+	return lr, lr.R, remain
 }
diff --git a/src/os/readfrom_linux_test.go b/src/os/readfrom_linux_test.go
index 982a2b6..4f98be4 100644
--- a/src/os/readfrom_linux_test.go
+++ b/src/os/readfrom_linux_test.go
@@ -6,17 +6,23 @@
 
 import (
 	"bytes"
+	"errors"
 	"internal/poll"
+	"internal/testpty"
 	"io"
 	"math/rand"
-	"os"
+	"net"
 	. "os"
 	"path/filepath"
+	"runtime"
 	"strconv"
 	"strings"
+	"sync"
 	"syscall"
 	"testing"
 	"time"
+
+	"golang.org/x/net/nettest"
 )
 
 func TestCopyFileRange(t *testing.T) {
@@ -78,13 +84,13 @@
 	t.Run("CopyFileItself", func(t *testing.T) {
 		hook := hookCopyFileRange(t)
 
-		f, err := os.CreateTemp("", "file-readfrom-itself-test")
+		f, err := CreateTemp("", "file-readfrom-itself-test")
 		if err != nil {
 			t.Fatalf("failed to create tmp file: %v", err)
 		}
 		t.Cleanup(func() {
 			f.Close()
-			os.Remove(f.Name())
+			Remove(f.Name())
 		})
 
 		data := []byte("hello world!")
@@ -224,7 +230,7 @@
 	})
 	t.Run("Nil", func(t *testing.T) {
 		var nilFile *File
-		anyFile, err := os.CreateTemp("", "")
+		anyFile, err := CreateTemp("", "")
 		if err != nil {
 			t.Fatal(err)
 		}
@@ -253,6 +259,226 @@
 	})
 }
 
+func TestSpliceFile(t *testing.T) {
+	sizes := []int{
+		1,
+		42,
+		1025,
+		syscall.Getpagesize() + 1,
+		32769,
+	}
+	t.Run("Basic-TCP", func(t *testing.T) {
+		for _, size := range sizes {
+			t.Run(strconv.Itoa(size), func(t *testing.T) {
+				testSpliceFile(t, "tcp", int64(size), -1)
+			})
+		}
+	})
+	t.Run("Basic-Unix", func(t *testing.T) {
+		for _, size := range sizes {
+			t.Run(strconv.Itoa(size), func(t *testing.T) {
+				testSpliceFile(t, "unix", int64(size), -1)
+			})
+		}
+	})
+	t.Run("TCP-To-TTY", func(t *testing.T) {
+		testSpliceToTTY(t, "tcp", 32768)
+	})
+	t.Run("Unix-To-TTY", func(t *testing.T) {
+		testSpliceToTTY(t, "unix", 32768)
+	})
+	t.Run("Limited", func(t *testing.T) {
+		t.Run("OneLess-TCP", func(t *testing.T) {
+			for _, size := range sizes {
+				t.Run(strconv.Itoa(size), func(t *testing.T) {
+					testSpliceFile(t, "tcp", int64(size), int64(size)-1)
+				})
+			}
+		})
+		t.Run("OneLess-Unix", func(t *testing.T) {
+			for _, size := range sizes {
+				t.Run(strconv.Itoa(size), func(t *testing.T) {
+					testSpliceFile(t, "unix", int64(size), int64(size)-1)
+				})
+			}
+		})
+		t.Run("Half-TCP", func(t *testing.T) {
+			for _, size := range sizes {
+				t.Run(strconv.Itoa(size), func(t *testing.T) {
+					testSpliceFile(t, "tcp", int64(size), int64(size)/2)
+				})
+			}
+		})
+		t.Run("Half-Unix", func(t *testing.T) {
+			for _, size := range sizes {
+				t.Run(strconv.Itoa(size), func(t *testing.T) {
+					testSpliceFile(t, "unix", int64(size), int64(size)/2)
+				})
+			}
+		})
+		t.Run("More-TCP", func(t *testing.T) {
+			for _, size := range sizes {
+				t.Run(strconv.Itoa(size), func(t *testing.T) {
+					testSpliceFile(t, "tcp", int64(size), int64(size)+1)
+				})
+			}
+		})
+		t.Run("More-Unix", func(t *testing.T) {
+			for _, size := range sizes {
+				t.Run(strconv.Itoa(size), func(t *testing.T) {
+					testSpliceFile(t, "unix", int64(size), int64(size)+1)
+				})
+			}
+		})
+	})
+}
+
+func testSpliceFile(t *testing.T, proto string, size, limit int64) {
+	dst, src, data, hook, cleanup := newSpliceFileTest(t, proto, size)
+	defer cleanup()
+
+	// If we have a limit, wrap the reader.
+	var (
+		r  io.Reader
+		lr *io.LimitedReader
+	)
+	if limit >= 0 {
+		lr = &io.LimitedReader{N: limit, R: src}
+		r = lr
+		if limit < int64(len(data)) {
+			data = data[:limit]
+		}
+	} else {
+		r = src
+	}
+	// Now call ReadFrom (through io.Copy), which will hopefully call poll.Splice
+	n, err := io.Copy(dst, r)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	// We should have called poll.Splice with the right file descriptor arguments.
+	if n > 0 && !hook.called {
+		t.Fatal("expected to called poll.Splice")
+	}
+	if hook.called && hook.dstfd != int(dst.Fd()) {
+		t.Fatalf("wrong destination file descriptor: got %d, want %d", hook.dstfd, dst.Fd())
+	}
+	sc, ok := src.(syscall.Conn)
+	if !ok {
+		t.Fatalf("server Conn is not a syscall.Conn")
+	}
+	rc, err := sc.SyscallConn()
+	if err != nil {
+		t.Fatalf("server Conn SyscallConn error: %v", err)
+	}
+	if err = rc.Control(func(fd uintptr) {
+		if hook.called && hook.srcfd != int(fd) {
+			t.Fatalf("wrong source file descriptor: got %d, want %d", hook.srcfd, int(fd))
+		}
+	}); err != nil {
+		t.Fatalf("server Conn Control error: %v", err)
+	}
+
+	// Check that the offsets after the transfer make sense, that the size
+	// of the transfer was reported correctly, and that the destination
+	// file contains exactly the bytes we expect it to contain.
+	dstoff, err := dst.Seek(0, io.SeekCurrent)
+	if err != nil {
+		t.Fatal(err)
+	}
+	if dstoff != int64(len(data)) {
+		t.Errorf("dstoff = %d, want %d", dstoff, len(data))
+	}
+	if n != int64(len(data)) {
+		t.Errorf("short ReadFrom: wrote %d bytes, want %d", n, len(data))
+	}
+	mustSeekStart(t, dst)
+	mustContainData(t, dst, data)
+
+	// If we had a limit, check that it was updated.
+	if lr != nil {
+		if want := limit - n; lr.N != want {
+			t.Fatalf("didn't update limit correctly: got %d, want %d", lr.N, want)
+		}
+	}
+}
+
+// Issue #59041.
+func testSpliceToTTY(t *testing.T, proto string, size int64) {
+	var wg sync.WaitGroup
+
+	// Call wg.Wait as the final deferred function,
+	// because the goroutines may block until some of
+	// the deferred Close calls.
+	defer wg.Wait()
+
+	pty, ttyName, err := testpty.Open()
+	if err != nil {
+		t.Skipf("skipping test because pty open failed: %v", err)
+	}
+	defer pty.Close()
+
+	// Open the tty directly, rather than via OpenFile.
+	// This bypasses the non-blocking support and is required
+	// to recreate the problem in the issue (#59041).
+	ttyFD, err := syscall.Open(ttyName, syscall.O_RDWR, 0)
+	if err != nil {
+		t.Skipf("skipping test becaused failed to open tty: %v", err)
+	}
+	defer syscall.Close(ttyFD)
+
+	tty := NewFile(uintptr(ttyFD), "tty")
+	defer tty.Close()
+
+	client, server := createSocketPair(t, proto)
+
+	data := bytes.Repeat([]byte{'a'}, int(size))
+
+	wg.Add(1)
+	go func() {
+		defer wg.Done()
+		// The problem (issue #59041) occurs when writing
+		// a series of blocks of data. It does not occur
+		// when all the data is written at once.
+		for i := 0; i < len(data); i += 1024 {
+			if _, err := client.Write(data[i : i+1024]); err != nil {
+				// If we get here because the client was
+				// closed, skip the error.
+				if !errors.Is(err, net.ErrClosed) {
+					t.Errorf("error writing to socket: %v", err)
+				}
+				return
+			}
+		}
+		client.Close()
+	}()
+
+	wg.Add(1)
+	go func() {
+		defer wg.Done()
+		buf := make([]byte, 32)
+		for {
+			if _, err := pty.Read(buf); err != nil {
+				if err != io.EOF && !errors.Is(err, ErrClosed) {
+					// An error here doesn't matter for
+					// our test.
+					t.Logf("error reading from pty: %v", err)
+				}
+				return
+			}
+		}
+	}()
+
+	// Close Client to wake up the writing goroutine if necessary.
+	defer client.Close()
+
+	_, err = io.Copy(tty, server)
+	if err != nil {
+		t.Fatal(err)
+	}
+}
+
 func testCopyFileRange(t *testing.T, size int64, limit int64) {
 	dst, src, data, hook := newCopyFileRangeTest(t, size)
 
@@ -359,6 +585,40 @@
 	return dst, src, data, hook
 }
 
+// newSpliceFileTest initializes a new test for splice.
+//
+// It creates source sockets and destination file, and populates the source sockets
+// with random data of the specified size. It also hooks package os' call
+// to poll.Splice and returns the hook so it can be inspected.
+func newSpliceFileTest(t *testing.T, proto string, size int64) (*File, net.Conn, []byte, *spliceFileHook, func()) {
+	t.Helper()
+
+	hook := hookSpliceFile(t)
+
+	client, server := createSocketPair(t, proto)
+
+	dst, err := CreateTemp(t.TempDir(), "dst-splice-file-test")
+	if err != nil {
+		t.Fatal(err)
+	}
+	t.Cleanup(func() { dst.Close() })
+
+	randSeed := time.Now().Unix()
+	t.Logf("random data seed: %d\n", randSeed)
+	prng := rand.New(rand.NewSource(randSeed))
+	data := make([]byte, size)
+	prng.Read(data)
+
+	done := make(chan struct{})
+	go func() {
+		client.Write(data)
+		client.Close()
+		close(done)
+	}()
+
+	return dst, server, data, hook, func() { <-done }
+}
+
 // mustContainData ensures that the specified file contains exactly the
 // specified data.
 func mustContainData(t *testing.T, f *File, data []byte) {
@@ -418,20 +678,59 @@
 	*PollCopyFileRangeP = h.original
 }
 
+func hookSpliceFile(t *testing.T) *spliceFileHook {
+	h := new(spliceFileHook)
+	h.install()
+	t.Cleanup(h.uninstall)
+	return h
+}
+
+type spliceFileHook struct {
+	called bool
+	dstfd  int
+	srcfd  int
+	remain int64
+
+	written int64
+	handled bool
+	sc      string
+	err     error
+
+	original func(dst, src *poll.FD, remain int64) (int64, bool, string, error)
+}
+
+func (h *spliceFileHook) install() {
+	h.original = *PollSpliceFile
+	*PollSpliceFile = func(dst, src *poll.FD, remain int64) (int64, bool, string, error) {
+		h.called = true
+		h.dstfd = dst.Sysfd
+		h.srcfd = src.Sysfd
+		h.remain = remain
+		h.written, h.handled, h.sc, h.err = h.original(dst, src, remain)
+		return h.written, h.handled, h.sc, h.err
+	}
+}
+
+func (h *spliceFileHook) uninstall() {
+	*PollSpliceFile = h.original
+}
+
 // On some kernels copy_file_range fails on files in /proc.
 func TestProcCopy(t *testing.T) {
+	t.Parallel()
+
 	const cmdlineFile = "/proc/self/cmdline"
-	cmdline, err := os.ReadFile(cmdlineFile)
+	cmdline, err := ReadFile(cmdlineFile)
 	if err != nil {
 		t.Skipf("can't read /proc file: %v", err)
 	}
-	in, err := os.Open(cmdlineFile)
+	in, err := Open(cmdlineFile)
 	if err != nil {
 		t.Fatal(err)
 	}
 	defer in.Close()
 	outFile := filepath.Join(t.TempDir(), "cmdline")
-	out, err := os.Create(outFile)
+	out, err := Create(outFile)
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -441,7 +740,7 @@
 	if err := out.Close(); err != nil {
 		t.Fatal(err)
 	}
-	copy, err := os.ReadFile(outFile)
+	copy, err := ReadFile(outFile)
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -449,3 +748,75 @@
 		t.Errorf("copy of %q got %q want %q\n", cmdlineFile, copy, cmdline)
 	}
 }
+
+func TestGetPollFDFromReader(t *testing.T) {
+	t.Run("tcp", func(t *testing.T) { testGetPollFromReader(t, "tcp") })
+	t.Run("unix", func(t *testing.T) { testGetPollFromReader(t, "unix") })
+}
+
+func testGetPollFromReader(t *testing.T, proto string) {
+	_, server := createSocketPair(t, proto)
+	sc, ok := server.(syscall.Conn)
+	if !ok {
+		t.Fatalf("server Conn is not a syscall.Conn")
+	}
+	rc, err := sc.SyscallConn()
+	if err != nil {
+		t.Fatalf("server SyscallConn error: %v", err)
+	}
+	if err = rc.Control(func(fd uintptr) {
+		pfd := GetPollFDForTest(server)
+		if pfd == nil {
+			t.Fatalf("GetPollFDForTest didn't return poll.FD")
+		}
+		if pfd.Sysfd != int(fd) {
+			t.Fatalf("GetPollFDForTest returned wrong poll.FD, got: %d, want: %d", pfd.Sysfd, int(fd))
+		}
+		if !pfd.IsStream {
+			t.Fatalf("expected IsStream to be true")
+		}
+		if err = pfd.Init(proto, true); err == nil {
+			t.Fatalf("Init should have failed with the initialized poll.FD and return EEXIST error")
+		}
+	}); err != nil {
+		t.Fatalf("server Control error: %v", err)
+	}
+}
+
+func createSocketPair(t *testing.T, proto string) (client, server net.Conn) {
+	t.Helper()
+	if !nettest.TestableNetwork(proto) {
+		t.Skipf("%s does not support %q", runtime.GOOS, proto)
+	}
+
+	ln, err := nettest.NewLocalListener(proto)
+	if err != nil {
+		t.Fatalf("NewLocalListener error: %v", err)
+	}
+	t.Cleanup(func() {
+		if ln != nil {
+			ln.Close()
+		}
+		if client != nil {
+			client.Close()
+		}
+		if server != nil {
+			server.Close()
+		}
+	})
+	ch := make(chan struct{})
+	go func() {
+		var err error
+		server, err = ln.Accept()
+		if err != nil {
+			t.Errorf("Accept new connection error: %v", err)
+		}
+		ch <- struct{}{}
+	}()
+	client, err = net.Dial(proto, ln.Addr().String())
+	<-ch
+	if err != nil {
+		t.Fatalf("Dial new connection error: %v", err)
+	}
+	return client, server
+}
diff --git a/src/os/removeall_at.go b/src/os/removeall_at.go
index 8b46152..8ea5df4 100644
--- a/src/os/removeall_at.go
+++ b/src/os/removeall_at.go
@@ -58,7 +58,9 @@
 func removeAllFrom(parent *File, base string) error {
 	parentFd := int(parent.Fd())
 	// Simple case: if Unlink (aka remove) works, we're done.
-	err := unix.Unlinkat(parentFd, base, 0)
+	err := ignoringEINTR(func() error {
+		return unix.Unlinkat(parentFd, base, 0)
+	})
 	if err == nil || IsNotExist(err) {
 		return nil
 	}
@@ -75,7 +77,9 @@
 
 	// Is this a directory we need to recurse into?
 	var statInfo syscall.Stat_t
-	statErr := unix.Fstatat(parentFd, base, &statInfo, unix.AT_SYMLINK_NOFOLLOW)
+	statErr := ignoringEINTR(func() error {
+		return unix.Fstatat(parentFd, base, &statInfo, unix.AT_SYMLINK_NOFOLLOW)
+	})
 	if statErr != nil {
 		if IsNotExist(statErr) {
 			return nil
@@ -151,7 +155,9 @@
 	}
 
 	// Remove the directory itself.
-	unlinkError := unix.Unlinkat(parentFd, base, unix.AT_REMOVEDIR)
+	unlinkError := ignoringEINTR(func() error {
+		return unix.Unlinkat(parentFd, base, unix.AT_REMOVEDIR)
+	})
 	if unlinkError == nil || IsNotExist(unlinkError) {
 		return nil
 	}
@@ -188,5 +194,6 @@
 		syscall.CloseOnExec(r)
 	}
 
-	return newFile(uintptr(r), name, kindOpenFile), nil
+	// We use kindNoPoll because we know that this is a directory.
+	return newFile(r, name, kindNoPoll), nil
 }
diff --git a/src/os/removeall_test.go b/src/os/removeall_test.go
index 08dfdd8..2f7938b 100644
--- a/src/os/removeall_test.go
+++ b/src/os/removeall_test.go
@@ -5,16 +5,20 @@
 package os_test
 
 import (
+	"bytes"
 	"fmt"
-	"os"
+	"internal/testenv"
 	. "os"
 	"path/filepath"
 	"runtime"
+	"strconv"
 	"strings"
 	"testing"
 )
 
 func TestRemoveAll(t *testing.T) {
+	t.Parallel()
+
 	tmpDir := t.TempDir()
 	if err := RemoveAll(""); err != nil {
 		t.Errorf("RemoveAll(\"\"): %v; want nil", err)
@@ -75,8 +79,8 @@
 		t.Fatalf("Lstat %q succeeded after RemoveAll (third)", path)
 	}
 
-	// Chmod is not supported under Windows and test fails as root.
-	if runtime.GOOS != "windows" && Getuid() != 0 {
+	// Chmod is not supported under Windows or wasip1 and test fails as root.
+	if runtime.GOOS != "windows" && runtime.GOOS != "wasip1" && Getuid() != 0 {
 		// Make directory with file and subdirectory and trigger error.
 		if err = MkdirAll(dpath, 0777); err != nil {
 			t.Fatalf("MkdirAll %q: %s", dpath, err)
@@ -122,6 +126,7 @@
 	if testing.Short() {
 		t.Skip("skipping in short mode")
 	}
+	t.Parallel()
 
 	tmpDir := t.TempDir()
 	path := filepath.Join(tmpDir, "_TestRemoveAllLarge_")
@@ -159,7 +164,7 @@
 		t.Fatalf("Could not get wd: %s", err)
 	}
 
-	startPath, err := os.MkdirTemp("", "TestRemoveAllLongPath-")
+	startPath, err := MkdirTemp("", "TestRemoveAllLongPath-")
 	if err != nil {
 		t.Fatalf("Could not create TempDir: %s", err)
 	}
@@ -201,7 +206,7 @@
 	if err != nil {
 		t.Fatalf("Could not get wd: %s", err)
 	}
-	tempDir, err := os.MkdirTemp("", "TestRemoveAllDot-")
+	tempDir, err := MkdirTemp("", "TestRemoveAllDot-")
 	if err != nil {
 		t.Fatalf("Could not create TempDir: %s", err)
 	}
@@ -268,7 +273,7 @@
 // Issue #29983.
 func TestRemoveAllButReadOnlyAndPathError(t *testing.T) {
 	switch runtime.GOOS {
-	case "js", "windows":
+	case "js", "wasip1", "windows":
 		t.Skipf("skipping test on %s", runtime.GOOS)
 	}
 
@@ -382,6 +387,7 @@
 	if testing.Short() {
 		t.Skip("skipping in short mode")
 	}
+	t.Parallel()
 
 	tmpDir := t.TempDir()
 	path := filepath.Join(tmpDir, "_TestRemoveAllWithMoreErrorThanReqSize_")
@@ -400,7 +406,7 @@
 	}
 
 	// Make the parent directory read-only. On some platforms, this is what
-	// prevents os.Remove from removing the files within that directory.
+	// prevents Remove from removing the files within that directory.
 	if err := Chmod(path, 0555); err != nil {
 		t.Fatal(err)
 	}
@@ -415,9 +421,12 @@
 		return
 	}
 	if err == nil {
-		if runtime.GOOS == "windows" {
+		if runtime.GOOS == "windows" || runtime.GOOS == "wasip1" {
 			// Marking a directory as read-only in Windows does not prevent the RemoveAll
 			// from creating or removing files within it.
+			//
+			// For wasip1, there is no support for file permissions so we cannot prevent
+			// RemoveAll from removing the files.
 			return
 		}
 		t.Fatal("RemoveAll(<read-only directory>) = nil; want error")
@@ -434,3 +443,64 @@
 		t.Fatalf("RemoveAll(<read-only directory>) unexpectedly removed %d read-only files from that directory", 1025-len(names))
 	}
 }
+
+func TestRemoveAllNoFcntl(t *testing.T) {
+	if testing.Short() {
+		t.Skip("skipping in short mode")
+	}
+
+	const env = "GO_TEST_REMOVE_ALL_NO_FCNTL"
+	if dir := Getenv(env); dir != "" {
+		if err := RemoveAll(dir); err != nil {
+			t.Fatal(err)
+		}
+		return
+	}
+
+	// Only test on Linux so that we can assume we have strace.
+	// The code is OS-independent so if it passes on Linux
+	// it should pass on other Unix systems.
+	if runtime.GOOS != "linux" {
+		t.Skipf("skipping test on %s", runtime.GOOS)
+	}
+	if _, err := Stat("/bin/strace"); err != nil {
+		t.Skipf("skipping test because /bin/strace not found: %v", err)
+	}
+	me, err := Executable()
+	if err != nil {
+		t.Skipf("skipping because Executable failed: %v", err)
+	}
+
+	// Create 100 directories.
+	// The test is that we can remove them without calling fcntl
+	// on each one.
+	tmpdir := t.TempDir()
+	subdir := filepath.Join(tmpdir, "subdir")
+	if err := Mkdir(subdir, 0o755); err != nil {
+		t.Fatal(err)
+	}
+	for i := 0; i < 100; i++ {
+		subsubdir := filepath.Join(subdir, strconv.Itoa(i))
+		if err := Mkdir(filepath.Join(subdir, strconv.Itoa(i)), 0o755); err != nil {
+			t.Fatal(err)
+		}
+		if err := WriteFile(filepath.Join(subsubdir, "file"), nil, 0o644); err != nil {
+			t.Fatal(err)
+		}
+	}
+
+	cmd := testenv.Command(t, "/bin/strace", "-f", "-e", "fcntl", me, "-test.run=TestRemoveAllNoFcntl")
+	cmd = testenv.CleanCmdEnv(cmd)
+	cmd.Env = append(cmd.Env, env+"="+subdir)
+	out, err := cmd.CombinedOutput()
+	if len(out) > 0 {
+		t.Logf("%s", out)
+	}
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	if got := bytes.Count(out, []byte("fcntl")); got >= 100 {
+		t.Errorf("found %d fcntl calls, want < 100", got)
+	}
+}
diff --git a/src/os/rlimit.go b/src/os/rlimit.go
deleted file mode 100644
index e0d0ef9..0000000
--- a/src/os/rlimit.go
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2022 The Go 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:build unix
-
-package os
-
-import "syscall"
-
-// Some systems set an artificially low soft limit on open file count, for compatibility
-// with code that uses select and its hard-coded maximum file descriptor
-// (limited by the size of fd_set).
-//
-// Go does not use select, so it should not be subject to these limits.
-// On some systems the limit is 256, which is very easy to run into,
-// even in simple programs like gofmt when they parallelize walking
-// a file tree.
-//
-// After a long discussion on go.dev/issue/46279, we decided the
-// best approach was for Go to raise the limit unconditionally for itself,
-// and then leave old software to set the limit back as needed.
-// Code that really wants Go to leave the limit alone can set the hard limit,
-// which Go of course has no choice but to respect.
-func init() {
-	var lim syscall.Rlimit
-	if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &lim); err == nil && lim.Cur != lim.Max {
-		lim.Cur = lim.Max
-		adjustFileLimit(&lim)
-		syscall.Setrlimit(syscall.RLIMIT_NOFILE, &lim)
-	}
-}
diff --git a/src/os/rlimit_darwin.go b/src/os/rlimit_darwin.go
deleted file mode 100644
index b28982a..0000000
--- a/src/os/rlimit_darwin.go
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2022 The Go 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:build darwin
-
-package os
-
-import "syscall"
-
-// adjustFileLimit adds per-OS limitations on the Rlimit used for RLIMIT_NOFILE. See rlimit.go.
-func adjustFileLimit(lim *syscall.Rlimit) {
-	// On older macOS, setrlimit(RLIMIT_NOFILE, lim) with lim.Cur = infinity fails.
-	// Set to the value of kern.maxfilesperproc instead.
-	n, err := syscall.SysctlUint32("kern.maxfilesperproc")
-	if err != nil {
-		return
-	}
-	if lim.Cur > uint64(n) {
-		lim.Cur = uint64(n)
-	}
-}
diff --git a/src/os/rlimit_stub.go b/src/os/rlimit_stub.go
deleted file mode 100644
index cbe2840..0000000
--- a/src/os/rlimit_stub.go
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2022 The Go 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:build aix || dragonfly || freebsd || linux || netbsd || openbsd || solaris
-
-package os
-
-import "syscall"
-
-// adjustFileLimit adds per-OS limitations on the Rlimit used for RLIMIT_NOFILE. See rlimit.go.
-func adjustFileLimit(lim *syscall.Rlimit) {}
diff --git a/src/os/rlimit_test.go b/src/os/rlimit_test.go
deleted file mode 100644
index c02e36f..0000000
--- a/src/os/rlimit_test.go
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2022 The Go Authors. 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"
-	"runtime"
-	"testing"
-)
-
-func TestOpenFileLimit(t *testing.T) {
-	// For open file count,
-	// macOS sets the default soft limit to 256 and no hard limit.
-	// CentOS and Fedora set the default soft limit to 1024,
-	// with hard limits of 4096 and 524288, respectively.
-	// Check that we can open 1200 files, which proves
-	// that the rlimit is being raised appropriately on those systems.
-	fileCount := 1200
-
-	// OpenBSD has a default soft limit of 512 and hard limit of 1024.
-	if runtime.GOOS == "openbsd" {
-		fileCount = 768
-	}
-
-	var files []*File
-	for i := 0; i < fileCount; i++ {
-		f, err := Open("rlimit.go")
-		if err != nil {
-			t.Error(err)
-			break
-		}
-		files = append(files, f)
-	}
-
-	for _, f := range files {
-		f.Close()
-	}
-}
diff --git a/src/os/signal/doc.go b/src/os/signal/doc.go
index 1b9f40d..a2a7525 100644
--- a/src/os/signal/doc.go
+++ b/src/os/signal/doc.go
@@ -16,7 +16,7 @@
 Synchronous signals are signals triggered by errors in program
 execution: SIGBUS, SIGFPE, and SIGSEGV. These are only considered
 synchronous when caused by program execution, not when sent using
-os.Process.Kill or the kill program or some similar mechanism. In
+[os.Process.Kill] or the kill program or some similar mechanism. In
 general, except as discussed below, Go programs will convert a
 synchronous signal into a run-time panic.
 
@@ -52,7 +52,7 @@
 the synchronous signals, SIGILL, SIGTRAP, SIGSTKFLT, SIGCHLD, SIGPROF,
 and, on Linux, signals 32 (SIGCANCEL) and 33 (SIGSETXID)
 (SIGCANCEL and SIGSETXID are used internally by glibc). Subprocesses
-started by os.Exec, or by the os/exec package, will inherit the
+started by [os.Exec], or by [os/exec], will inherit the
 modified signal mask.
 
 # Changing the behavior of signals in Go programs
@@ -210,8 +210,8 @@
 # Windows
 
 On Windows a ^C (Control-C) or ^BREAK (Control-Break) normally cause
-the program to exit. If Notify is called for os.Interrupt, ^C or ^BREAK
-will cause os.Interrupt to be sent on the channel, and the program will
+the program to exit. If Notify is called for [os.Interrupt], ^C or ^BREAK
+will cause [os.Interrupt] to be sent on the channel, and the program will
 not exit. If Reset is called, or Stop is called on all channels passed
 to Notify, then the default behavior will be restored.
 
diff --git a/src/os/signal/signal_test.go b/src/os/signal/signal_test.go
index fec6db7..ddbd458 100644
--- a/src/os/signal/signal_test.go
+++ b/src/os/signal/signal_test.go
@@ -304,7 +304,7 @@
 		// We have no intention of reading from c.
 		c := make(chan os.Signal, 1)
 		Notify(c, syscall.SIGHUP)
-		if out, err := exec.Command(os.Args[0], "-test.run=TestDetectNohup", "-check_sighup_ignored").CombinedOutput(); err == nil {
+		if out, err := testenv.Command(t, os.Args[0], "-test.run=TestDetectNohup", "-check_sighup_ignored").CombinedOutput(); err == nil {
 			t.Errorf("ran test with -check_sighup_ignored and it succeeded: expected failure.\nOutput:\n%s", out)
 		}
 		Stop(c)
@@ -315,7 +315,7 @@
 		}
 		Ignore(syscall.SIGHUP)
 		os.Remove("nohup.out")
-		out, err := exec.Command("/usr/bin/nohup", os.Args[0], "-test.run=TestDetectNohup", "-check_sighup_ignored").CombinedOutput()
+		out, err := testenv.Command(t, "/usr/bin/nohup", os.Args[0], "-test.run=TestDetectNohup", "-check_sighup_ignored").CombinedOutput()
 
 		data, _ := os.ReadFile("nohup.out")
 		os.Remove("nohup.out")
@@ -447,7 +447,7 @@
 			if subTimeout != 0 {
 				args = append(args, fmt.Sprintf("-test.timeout=%v", subTimeout))
 			}
-			out, err := exec.Command(os.Args[0], args...).CombinedOutput()
+			out, err := testenv.Command(t, os.Args[0], args...).CombinedOutput()
 
 			if err == nil {
 				t.Errorf("ran test with -send_uncaught_sighup=%d and it succeeded: expected failure.\nOutput:\n%s", i, out)
@@ -497,7 +497,7 @@
 			if subTimeout != 0 {
 				args = append(args, fmt.Sprintf("-test.timeout=%v", subTimeout))
 			}
-			out, err := exec.Command("nohup", args...).CombinedOutput()
+			out, err := testenv.Command(t, "nohup", args...).CombinedOutput()
 
 			if err != nil {
 				t.Errorf("ran test with -send_uncaught_sighup=%d under nohup and it failed: expected success.\nError: %v\nOutput:\n%s", i, err, out)
@@ -546,7 +546,7 @@
 		if deadline, ok := t.Deadline(); ok {
 			timeout = time.Until(deadline).String()
 		}
-		cmd := exec.Command(os.Args[0], "-test.run=TestAtomicStop", "-test.timeout="+timeout)
+		cmd := testenv.Command(t, os.Args[0], "-test.run=TestAtomicStop", "-test.timeout="+timeout)
 		cmd.Env = append(os.Environ(), "GO_TEST_ATOMIC_STOP=1")
 		out, err := cmd.CombinedOutput()
 		if err == nil {
@@ -749,7 +749,7 @@
 			if subTimeout != 0 {
 				args = append(args, fmt.Sprintf("-test.timeout=%v", subTimeout))
 			}
-			out, err := exec.Command(os.Args[0], args...).CombinedOutput()
+			out, err := testenv.Command(t, os.Args[0], args...).CombinedOutput()
 			if err != nil {
 				t.Errorf("ran test with -check_notify_ctx_notification and it failed with %v.\nOutput:\n%s", err, out)
 			}
diff --git a/src/os/signal/signal_unix.go b/src/os/signal/signal_unix.go
index 772175a..21dfa41 100644
--- a/src/os/signal/signal_unix.go
+++ b/src/os/signal/signal_unix.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build unix || (js && wasm) || windows
+//go:build unix || (js && wasm) || wasip1 || windows
 
 package signal
 
diff --git a/src/os/signal/signal_windows_test.go b/src/os/signal/signal_windows_test.go
index 02803e5..145a805 100644
--- a/src/os/signal/signal_windows_test.go
+++ b/src/os/signal/signal_windows_test.go
@@ -7,7 +7,6 @@
 import (
 	"internal/testenv"
 	"os"
-	"os/exec"
 	"path/filepath"
 	"strings"
 	"syscall"
@@ -71,13 +70,13 @@
 	// compile it
 	exe := name + ".exe"
 	defer os.Remove(exe)
-	o, err := exec.Command(testenv.GoToolPath(t), "build", "-o", exe, src).CombinedOutput()
+	o, err := testenv.Command(t, testenv.GoToolPath(t), "build", "-o", exe, src).CombinedOutput()
 	if err != nil {
 		t.Fatalf("Failed to compile: %v\n%v", err, string(o))
 	}
 
 	// run it
-	cmd := exec.Command(exe)
+	cmd := testenv.Command(t, exe)
 	var buf strings.Builder
 	cmd.Stdout = &buf
 	cmd.Stderr = &buf
diff --git a/src/os/stat_test.go b/src/os/stat_test.go
index 8d99f64..9601969 100644
--- a/src/os/stat_test.go
+++ b/src/os/stat_test.go
@@ -9,7 +9,6 @@
 	"io/fs"
 	"os"
 	"path/filepath"
-	"runtime"
 	"testing"
 )
 
@@ -182,8 +181,34 @@
 	}
 }
 
+func testSymlinkSameFileOpen(t *testing.T, link string) {
+	f, err := os.Open(link)
+	if err != nil {
+		t.Error(err)
+		return
+	}
+	defer f.Close()
+
+	fi, err := f.Stat()
+	if err != nil {
+		t.Error(err)
+		return
+	}
+
+	fi2, err := os.Stat(link)
+	if err != nil {
+		t.Error(err)
+		return
+	}
+
+	if !os.SameFile(fi, fi2) {
+		t.Errorf("os.Open(%q).Stat() and os.Stat(%q) are not the same file", link, link)
+	}
+}
+
 func TestDirAndSymlinkStats(t *testing.T) {
 	testenv.MustHaveSymlink(t)
+	t.Parallel()
 
 	tmpdir := t.TempDir()
 	dir := filepath.Join(tmpdir, "dir")
@@ -198,6 +223,7 @@
 	}
 	testSymlinkStats(t, dirlink, true)
 	testSymlinkSameFile(t, dir, dirlink)
+	testSymlinkSameFileOpen(t, dirlink)
 
 	linklink := filepath.Join(tmpdir, "linklink")
 	if err := os.Symlink(dirlink, linklink); err != nil {
@@ -205,10 +231,12 @@
 	}
 	testSymlinkStats(t, linklink, true)
 	testSymlinkSameFile(t, dir, linklink)
+	testSymlinkSameFileOpen(t, linklink)
 }
 
 func TestFileAndSymlinkStats(t *testing.T) {
 	testenv.MustHaveSymlink(t)
+	t.Parallel()
 
 	tmpdir := t.TempDir()
 	file := filepath.Join(tmpdir, "file")
@@ -223,6 +251,7 @@
 	}
 	testSymlinkStats(t, filelink, false)
 	testSymlinkSameFile(t, file, filelink)
+	testSymlinkSameFileOpen(t, filelink)
 
 	linklink := filepath.Join(tmpdir, "linklink")
 	if err := os.Symlink(filelink, linklink); err != nil {
@@ -230,11 +259,13 @@
 	}
 	testSymlinkStats(t, linklink, false)
 	testSymlinkSameFile(t, file, linklink)
+	testSymlinkSameFileOpen(t, linklink)
 }
 
 // see issue 27225 for details
 func TestSymlinkWithTrailingSlash(t *testing.T) {
 	testenv.MustHaveSymlink(t)
+	t.Parallel()
 
 	tmpdir := t.TempDir()
 	dir := filepath.Join(tmpdir, "dir")
@@ -247,11 +278,7 @@
 	}
 	dirlinkWithSlash := dirlink + string(os.PathSeparator)
 
-	if runtime.GOOS == "windows" {
-		testSymlinkStats(t, dirlinkWithSlash, true)
-	} else {
-		testDirStats(t, dirlinkWithSlash)
-	}
+	testDirStats(t, dirlinkWithSlash)
 
 	fi1, err := os.Stat(dir)
 	if err != nil {
diff --git a/src/os/stat_unix.go b/src/os/stat_unix.go
index 437afc0..431df33 100644
--- a/src/os/stat_unix.go
+++ b/src/os/stat_unix.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build unix || (js && wasm)
+//go:build unix || (js && wasm) || wasip1
 
 package os
 
diff --git a/src/os/stat_wasip1.go b/src/os/stat_wasip1.go
new file mode 100644
index 0000000..a4f0a20
--- /dev/null
+++ b/src/os/stat_wasip1.go
@@ -0,0 +1,40 @@
+// Copyright 2023 The Go 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:build wasip1
+
+package os
+
+import (
+	"syscall"
+	"time"
+)
+
+func fillFileStatFromSys(fs *fileStat, name string) {
+	fs.name = basename(name)
+	fs.size = int64(fs.sys.Size)
+	fs.mode = FileMode(fs.sys.Mode)
+	fs.modTime = time.Unix(0, int64(fs.sys.Mtime))
+
+	switch fs.sys.Filetype {
+	case syscall.FILETYPE_BLOCK_DEVICE:
+		fs.mode |= ModeDevice
+	case syscall.FILETYPE_CHARACTER_DEVICE:
+		fs.mode |= ModeDevice | ModeCharDevice
+	case syscall.FILETYPE_DIRECTORY:
+		fs.mode |= ModeDir
+	case syscall.FILETYPE_SOCKET_DGRAM:
+		fs.mode |= ModeSocket
+	case syscall.FILETYPE_SOCKET_STREAM:
+		fs.mode |= ModeSocket
+	case syscall.FILETYPE_SYMBOLIC_LINK:
+		fs.mode |= ModeSymlink
+	}
+}
+
+// For testing.
+func atime(fi FileInfo) time.Time {
+	st := fi.Sys().(*syscall.Stat_t)
+	return time.Unix(0, int64(st.Atime))
+}
diff --git a/src/os/stat_windows.go b/src/os/stat_windows.go
index 8747c19..033c3b9 100644
--- a/src/os/stat_windows.go
+++ b/src/os/stat_windows.go
@@ -20,7 +20,7 @@
 }
 
 // stat implements both Stat and Lstat of a file.
-func stat(funcname, name string, createFileAttrs uint32) (FileInfo, error) {
+func stat(funcname, name string, followSymlinks bool) (FileInfo, error) {
 	if len(name) == 0 {
 		return nil, &PathError{Op: funcname, Path: name, Err: syscall.Errno(syscall.ERROR_PATH_NOT_FOUND)}
 	}
@@ -33,8 +33,29 @@
 	// See https://golang.org/issues/19922#issuecomment-300031421 for details.
 	var fa syscall.Win32FileAttributeData
 	err = syscall.GetFileAttributesEx(namep, syscall.GetFileExInfoStandard, (*byte)(unsafe.Pointer(&fa)))
+
+	// GetFileAttributesEx fails with ERROR_SHARING_VIOLATION error for
+	// files like c:\pagefile.sys. Use FindFirstFile for such files.
+	if err == windows.ERROR_SHARING_VIOLATION {
+		var fd syscall.Win32finddata
+		sh, err := syscall.FindFirstFile(namep, &fd)
+		if err != nil {
+			return nil, &PathError{Op: "FindFirstFile", Path: name, Err: err}
+		}
+		syscall.FindClose(sh)
+		if fd.FileAttributes&syscall.FILE_ATTRIBUTE_REPARSE_POINT == 0 {
+			// Not a symlink or mount point. FindFirstFile is good enough.
+			fs := newFileStatFromWin32finddata(&fd)
+			if err := fs.saveInfoFromPath(name); err != nil {
+				return nil, err
+			}
+			return fs, nil
+		}
+	}
+
 	if err == nil && fa.FileAttributes&syscall.FILE_ATTRIBUTE_REPARSE_POINT == 0 {
-		// Not a symlink.
+		// The file is definitely not a symlink, because it isn't any kind of reparse point.
+		// The information we got from GetFileAttributesEx is good enough for now.
 		fs := &fileStat{
 			FileAttributes: fa.FileAttributes,
 			CreationTime:   fa.CreationTime,
@@ -48,30 +69,34 @@
 		}
 		return fs, nil
 	}
-	// GetFileAttributesEx fails with ERROR_SHARING_VIOLATION error for
-	// files, like c:\pagefile.sys. Use FindFirstFile for such files.
-	if err == windows.ERROR_SHARING_VIOLATION {
-		var fd syscall.Win32finddata
-		sh, err := syscall.FindFirstFile(namep, &fd)
-		if err != nil {
-			return nil, &PathError{Op: "FindFirstFile", Path: name, Err: err}
-		}
-		syscall.FindClose(sh)
-		fs := newFileStatFromWin32finddata(&fd)
-		if err := fs.saveInfoFromPath(name); err != nil {
-			return nil, err
-		}
-		return fs, nil
-	}
 
-	// Finally use CreateFile.
-	h, err := syscall.CreateFile(namep, 0, 0, nil,
-		syscall.OPEN_EXISTING, createFileAttrs, 0)
+	// Use CreateFile to determine whether the file is a symlink and, if so,
+	// save information about the link target.
+	// Set FILE_FLAG_BACKUP_SEMANTICS so that CreateFile will create the handle
+	// even if name refers to a directory.
+	h, err := syscall.CreateFile(namep, 0, 0, nil, syscall.OPEN_EXISTING, syscall.FILE_FLAG_BACKUP_SEMANTICS|syscall.FILE_FLAG_OPEN_REPARSE_POINT, 0)
 	if err != nil {
+		// Since CreateFile failed, we can't determine whether name refers to a
+		// symlink, or some other kind of reparse point. Since we can't return a
+		// FileInfo with a known-accurate Mode, we must return an error.
 		return nil, &PathError{Op: "CreateFile", Path: name, Err: err}
 	}
-	defer syscall.CloseHandle(h)
-	return statHandle(name, h)
+
+	fi, err := statHandle(name, h)
+	syscall.CloseHandle(h)
+	if err == nil && followSymlinks && fi.(*fileStat).isSymlink() {
+		// To obtain information about the link target, we reopen the file without
+		// FILE_FLAG_OPEN_REPARSE_POINT and examine the resulting handle.
+		// (See https://devblogs.microsoft.com/oldnewthing/20100212-00/?p=14963.)
+		h, err = syscall.CreateFile(namep, 0, 0, nil, syscall.OPEN_EXISTING, syscall.FILE_FLAG_BACKUP_SEMANTICS, 0)
+		if err != nil {
+			// name refers to a symlink, but we couldn't resolve the symlink target.
+			return nil, &PathError{Op: "CreateFile", Path: name, Err: err}
+		}
+		defer syscall.CloseHandle(h)
+		return statHandle(name, h)
+	}
+	return fi, err
 }
 
 func statHandle(name string, h syscall.Handle) (FileInfo, error) {
@@ -93,14 +118,19 @@
 
 // statNolog implements Stat for Windows.
 func statNolog(name string) (FileInfo, error) {
-	return stat("Stat", name, syscall.FILE_FLAG_BACKUP_SEMANTICS)
+	return stat("Stat", name, true)
 }
 
 // lstatNolog implements Lstat for Windows.
 func lstatNolog(name string) (FileInfo, error) {
-	attrs := uint32(syscall.FILE_FLAG_BACKUP_SEMANTICS)
-	// Use FILE_FLAG_OPEN_REPARSE_POINT, otherwise CreateFile will follow symlink.
-	// See https://docs.microsoft.com/en-us/windows/desktop/FileIO/symbolic-link-effects-on-file-systems-functions#createfile-and-createfiletransacted
-	attrs |= syscall.FILE_FLAG_OPEN_REPARSE_POINT
-	return stat("Lstat", name, attrs)
+	followSymlinks := false
+	if name != "" && IsPathSeparator(name[len(name)-1]) {
+		// We try to implement POSIX semantics for Lstat path resolution
+		// (per https://pubs.opengroup.org/onlinepubs/9699919799.2013edition/basedefs/V1_chap04.html#tag_04_12):
+		// symlinks before the last separator in the path must be resolved. Since
+		// the last separator in this case follows the last path element, we should
+		// follow symlinks in the last path element.
+		followSymlinks = true
+	}
+	return stat("Lstat", name, followSymlinks)
 }
diff --git a/src/os/sticky_bsd.go b/src/os/sticky_bsd.go
index e71daf7..a6d9339 100644
--- a/src/os/sticky_bsd.go
+++ b/src/os/sticky_bsd.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build aix || darwin || dragonfly || freebsd || (js && wasm) || netbsd || openbsd || solaris
+//go:build aix || darwin || dragonfly || freebsd || (js && wasm) || netbsd || openbsd || solaris || wasip1
 
 package os
 
diff --git a/src/os/sticky_notbsd.go b/src/os/sticky_notbsd.go
index 9a87fbd..1d289b0 100644
--- a/src/os/sticky_notbsd.go
+++ b/src/os/sticky_notbsd.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build !aix && !darwin && !dragonfly && !freebsd && (!js || !wasm) && !netbsd && !openbsd && !solaris
+//go:build !aix && !darwin && !dragonfly && !freebsd && !js && !netbsd && !openbsd && !solaris && !wasip1
 
 package os
 
diff --git a/src/os/sys_bsd.go b/src/os/sys_bsd.go
index e272c24..63120fb 100644
--- a/src/os/sys_bsd.go
+++ b/src/os/sys_bsd.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build darwin || dragonfly || freebsd || (js && wasm) || netbsd || openbsd
+//go:build darwin || dragonfly || freebsd || (js && wasm) || netbsd || openbsd || wasip1
 
 package os
 
diff --git a/src/os/sys_wasip1.go b/src/os/sys_wasip1.go
new file mode 100644
index 0000000..5a29aa5
--- /dev/null
+++ b/src/os/sys_wasip1.go
@@ -0,0 +1,11 @@
+// Copyright 2023 The Go 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:build wasip1
+
+package os
+
+// supportsCloseOnExec reports whether the platform supports the
+// O_CLOEXEC flag.
+const supportsCloseOnExec = false
diff --git a/src/os/tempfile.go b/src/os/tempfile.go
index 3be3d13..99f65c6 100644
--- a/src/os/tempfile.go
+++ b/src/os/tempfile.go
@@ -117,7 +117,7 @@
 	return dir + string(PathSeparator) + name
 }
 
-// LastIndexByte from the strings package.
+// lastIndex from the strings package.
 func lastIndex(s string, sep byte) int {
 	for i := len(s) - 1; i >= 0; i-- {
 		if s[i] == sep {
diff --git a/src/os/tempfile_test.go b/src/os/tempfile_test.go
index e5b74bc..82f0aab 100644
--- a/src/os/tempfile_test.go
+++ b/src/os/tempfile_test.go
@@ -15,6 +15,8 @@
 )
 
 func TestCreateTemp(t *testing.T) {
+	t.Parallel()
+
 	dir, err := MkdirTemp("", "TestCreateTempBadDir")
 	if err != nil {
 		t.Fatal(err)
@@ -29,6 +31,8 @@
 }
 
 func TestCreateTempPattern(t *testing.T) {
+	t.Parallel()
+
 	tests := []struct{ pattern, prefix, suffix string }{
 		{"tempfile_test", "tempfile_test", ""},
 		{"tempfile_test*", "tempfile_test", ""},
@@ -51,6 +55,8 @@
 }
 
 func TestCreateTempBadPattern(t *testing.T) {
+	t.Parallel()
+
 	tmpDir, err := MkdirTemp("", t.Name())
 	if err != nil {
 		t.Fatal(err)
@@ -91,6 +97,8 @@
 }
 
 func TestMkdirTemp(t *testing.T) {
+	t.Parallel()
+
 	name, err := MkdirTemp("/_not_exists_", "foo")
 	if name != "" || err == nil {
 		t.Errorf("MkdirTemp(`/_not_exists_`, `foo`) = %v, %v", name, err)
@@ -142,6 +150,8 @@
 // test that we return a nice error message if the dir argument to TempDir doesn't
 // exist (or that it's empty and TempDir doesn't exist)
 func TestMkdirTempBadDir(t *testing.T) {
+	t.Parallel()
+
 	dir, err := MkdirTemp("", "MkdirTempBadDir")
 	if err != nil {
 		t.Fatal(err)
@@ -156,6 +166,8 @@
 }
 
 func TestMkdirTempBadPattern(t *testing.T) {
+	t.Parallel()
+
 	tmpDir, err := MkdirTemp("", t.Name())
 	if err != nil {
 		t.Fatal(err)
diff --git a/src/os/timeout_test.go b/src/os/timeout_test.go
index ff0d77a..e0d2328 100644
--- a/src/os/timeout_test.go
+++ b/src/os/timeout_test.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build !js && !plan9 && !windows
+//go:build !js && !plan9 && !wasip1 && !windows
 
 package os_test
 
@@ -25,6 +25,7 @@
 	if runtime.GOOS != "linux" {
 		t.Skipf("skipping on %s", runtime.GOOS)
 	}
+	t.Parallel()
 
 	f, err := os.CreateTemp("", "ostest")
 	if err != nil {
@@ -244,7 +245,7 @@
 	minDynamicTimeout = 1 * time.Millisecond
 
 	// maxDynamicTimeout is the maximum timeout to attempt for
-	// tests that automatically increase timeouts until succeess.
+	// tests that automatically increase timeouts until success.
 	//
 	// This should be a strict upper bound on the latency required to hit a
 	// timeout accurately, even on a slow or heavily-loaded machine. If a test
@@ -354,10 +355,11 @@
 		t.Logf("SetWriteDeadline(+%v)", d)
 		t0 := time.Now()
 		deadline := t0.Add(d)
-		if err = w.SetWriteDeadline(deadline); err != nil {
+		if err := w.SetWriteDeadline(deadline); err != nil {
 			t.Fatalf("SetWriteDeadline(%v): %v", deadline, err)
 		}
 		var n int64
+		var err error
 		for {
 			var dn int
 			dn, err = w.Write([]byte("TIMEOUT TRANSMITTER"))
@@ -367,8 +369,8 @@
 			}
 		}
 		t1 := time.Now()
-
-		if err == nil || !isDeadlineExceeded(err) {
+		// Inv: err != nil
+		if !isDeadlineExceeded(err) {
 			t.Fatalf("Write did not return (any, timeout): (%d, %v)", n, err)
 		}
 
diff --git a/src/os/types_windows.go b/src/os/types_windows.go
index d444e8b..9a3d508 100644
--- a/src/os/types_windows.go
+++ b/src/os/types_windows.go
@@ -25,7 +25,7 @@
 	FileSizeLow    uint32
 
 	// from Win32finddata
-	Reserved0 uint32
+	ReparseTag uint32
 
 	// what syscall.GetFileType returns
 	filetype uint32
@@ -73,7 +73,7 @@
 		vol:            d.VolumeSerialNumber,
 		idxhi:          d.FileIndexHigh,
 		idxlo:          d.FileIndexLow,
-		Reserved0:      ti.ReparseTag,
+		ReparseTag:     ti.ReparseTag,
 		// fileStat.path is used by os.SameFile to decide if it needs
 		// to fetch vol, idxhi and idxlo. But these are already set,
 		// so set fileStat.path to "" to prevent os.SameFile doing it again.
@@ -83,26 +83,39 @@
 // newFileStatFromWin32finddata copies all required information
 // from syscall.Win32finddata d into the newly created fileStat.
 func newFileStatFromWin32finddata(d *syscall.Win32finddata) *fileStat {
-	return &fileStat{
+	fs := &fileStat{
 		FileAttributes: d.FileAttributes,
 		CreationTime:   d.CreationTime,
 		LastAccessTime: d.LastAccessTime,
 		LastWriteTime:  d.LastWriteTime,
 		FileSizeHigh:   d.FileSizeHigh,
 		FileSizeLow:    d.FileSizeLow,
-		Reserved0:      d.Reserved0,
 	}
+	if d.FileAttributes&syscall.FILE_ATTRIBUTE_REPARSE_POINT != 0 {
+		// Per https://learn.microsoft.com/en-us/windows/win32/api/minwinbase/ns-minwinbase-win32_find_dataw:
+		// “If the dwFileAttributes member includes the FILE_ATTRIBUTE_REPARSE_POINT
+		// attribute, this member specifies the reparse point tag. Otherwise, this
+		// value is undefined and should not be used.”
+		fs.ReparseTag = d.Reserved0
+	}
+	return fs
 }
 
 func (fs *fileStat) isSymlink() bool {
-	// Use instructions described at
-	// https://blogs.msdn.microsoft.com/oldnewthing/20100212-00/?p=14963/
-	// to recognize whether it's a symlink.
-	if fs.FileAttributes&syscall.FILE_ATTRIBUTE_REPARSE_POINT == 0 {
-		return false
-	}
-	return fs.Reserved0 == syscall.IO_REPARSE_TAG_SYMLINK ||
-		fs.Reserved0 == windows.IO_REPARSE_TAG_MOUNT_POINT
+	// As of https://go.dev/cl/86556, we treat MOUNT_POINT reparse points as
+	// symlinks because otherwise certain directory junction tests in the
+	// path/filepath package would fail.
+	//
+	// However,
+	// https://learn.microsoft.com/en-us/windows/win32/fileio/hard-links-and-junctions
+	// seems to suggest that directory junctions should be treated like hard
+	// links, not symlinks.
+	//
+	// TODO(bcmills): Get more input from Microsoft on what the behavior ought to
+	// be for MOUNT_POINT reparse points.
+
+	return fs.ReparseTag == syscall.IO_REPARSE_TAG_SYMLINK ||
+		fs.ReparseTag == windows.IO_REPARSE_TAG_MOUNT_POINT
 }
 
 func (fs *fileStat) Size() int64 {
@@ -127,6 +140,9 @@
 	case syscall.FILE_TYPE_CHAR:
 		m |= ModeDevice | ModeCharDevice
 	}
+	if fs.FileAttributes&syscall.FILE_ATTRIBUTE_REPARSE_POINT != 0 && m&ModeType == 0 {
+		m |= ModeIrregular
+	}
 	return m
 }
 
@@ -163,12 +179,23 @@
 	if err != nil {
 		return err
 	}
-	attrs := uint32(syscall.FILE_FLAG_BACKUP_SEMANTICS)
-	if fs.isSymlink() {
-		// Use FILE_FLAG_OPEN_REPARSE_POINT, otherwise CreateFile will follow symlink.
-		// See https://docs.microsoft.com/en-us/windows/desktop/FileIO/symbolic-link-effects-on-file-systems-functions#createfile-and-createfiletransacted
-		attrs |= syscall.FILE_FLAG_OPEN_REPARSE_POINT
-	}
+
+	// Per https://learn.microsoft.com/en-us/windows/win32/fileio/reparse-points-and-file-operations,
+	// “Applications that use the CreateFile function should specify the
+	// FILE_FLAG_OPEN_REPARSE_POINT flag when opening the file if it is a reparse
+	// point.”
+	//
+	// And per https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createfilew,
+	// “If the file is not a reparse point, then this flag is ignored.”
+	//
+	// So we set FILE_FLAG_OPEN_REPARSE_POINT unconditionally, since we want
+	// information about the reparse point itself.
+	//
+	// If the file is a symlink, the symlink target should have already been
+	// resolved when the fileStat was created, so we don't need to worry about
+	// resolving symlink reparse points again here.
+	attrs := uint32(syscall.FILE_FLAG_BACKUP_SEMANTICS | syscall.FILE_FLAG_OPEN_REPARSE_POINT)
+
 	h, err := syscall.CreateFile(pathp, 0, 0, nil, syscall.OPEN_EXISTING, attrs, 0)
 	if err != nil {
 		return err
diff --git a/src/os/user/cgo_user_test.go b/src/os/user/cgo_user_test.go
new file mode 100644
index 0000000..0458495
--- /dev/null
+++ b/src/os/user/cgo_user_test.go
@@ -0,0 +1,11 @@
+// Copyright 2023 The Go 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:build cgo && !osusergo
+
+package user
+
+func init() {
+	hasCgo = true
+}
diff --git a/src/os/user/listgroups_stub.go b/src/os/user/listgroups_stub.go
index 4cf808b..aa7df93 100644
--- a/src/os/user/listgroups_stub.go
+++ b/src/os/user/listgroups_stub.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build android || (js && !wasm)
+//go:build android
 
 package user
 
diff --git a/src/os/user/listgroups_unix.go b/src/os/user/listgroups_unix.go
index ef366fa..67bd8a7 100644
--- a/src/os/user/listgroups_unix.go
+++ b/src/os/user/listgroups_unix.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build ((darwin || dragonfly || freebsd || (js && wasm) || (!android && linux) || netbsd || openbsd || solaris) && ((!cgo && !darwin) || osusergo)) || aix || illumos
+//go:build ((darwin || dragonfly || freebsd || (js && wasm) || wasip1 || (!android && linux) || netbsd || openbsd || solaris) && ((!cgo && !darwin) || osusergo)) || aix || illumos
 
 package user
 
diff --git a/src/os/user/listgroups_unix_test.go b/src/os/user/listgroups_unix_test.go
index 4fa8b1f..ae50319 100644
--- a/src/os/user/listgroups_unix_test.go
+++ b/src/os/user/listgroups_unix_test.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build ((darwin || dragonfly || freebsd || (js && wasm) || (!android && linux) || netbsd || openbsd || solaris) && ((!cgo && !darwin) || osusergo)) || aix || illumos
+//go:build ((darwin || dragonfly || freebsd || (js && wasm) || wasip1 || (!android && linux) || netbsd || openbsd || solaris) && ((!cgo && !darwin) || osusergo)) || aix || illumos
 
 package user
 
diff --git a/src/os/user/lookup_unix.go b/src/os/user/lookup_unix.go
index 608d9b2..a430826 100644
--- a/src/os/user/lookup_unix.go
+++ b/src/os/user/lookup_unix.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build ((unix && !android) || (js && wasm)) && ((!cgo && !darwin) || osusergo)
+//go:build ((unix && !android) || (js && wasm) || wasip1) && ((!cgo && !darwin) || osusergo)
 
 package user
 
diff --git a/src/os/user/user_test.go b/src/os/user/user_test.go
index 0fa963d..fa597b7 100644
--- a/src/os/user/user_test.go
+++ b/src/os/user/user_test.go
@@ -5,9 +5,16 @@
 package user
 
 import (
+	"os"
 	"testing"
 )
 
+var (
+	hasCgo  = false
+	hasUSER = os.Getenv("USER") != ""
+	hasHOME = os.Getenv("HOME") != ""
+)
+
 func checkUser(t *testing.T) {
 	t.Helper()
 	if !userImplemented {
@@ -23,7 +30,11 @@
 	userBuffer = 1 // force use of retry code
 	u, err := Current()
 	if err != nil {
-		t.Fatalf("Current: %v (got %#v)", err, u)
+		if hasCgo || (hasUSER && hasHOME) {
+			t.Fatalf("Current: %v (got %#v)", err, u)
+		} else {
+			t.Skipf("skipping: %v", err)
+		}
 	}
 	if u.HomeDir == "" {
 		t.Errorf("didn't get a HomeDir")
@@ -62,8 +73,13 @@
 
 	want, err := Current()
 	if err != nil {
-		t.Fatalf("Current: %v", err)
+		if hasCgo || (hasUSER && hasHOME) {
+			t.Fatalf("Current: %v", err)
+		} else {
+			t.Skipf("skipping: %v", err)
+		}
 	}
+
 	// TODO: Lookup() has a fast path that calls Current() and returns if the
 	// usernames match, so this test does not exercise very much. It would be
 	// good to try and test finding a different user than the current user.
@@ -79,8 +95,13 @@
 
 	want, err := Current()
 	if err != nil {
-		t.Fatalf("Current: %v", err)
+		if hasCgo || (hasUSER && hasHOME) {
+			t.Fatalf("Current: %v", err)
+		} else {
+			t.Skipf("skipping: %v", err)
+		}
 	}
+
 	got, err := LookupId(want.Uid)
 	if err != nil {
 		t.Fatalf("LookupId: %v", err)
@@ -102,9 +123,14 @@
 	}()
 	groupBuffer = 1 // force use of retry code
 	checkGroup(t)
+
 	user, err := Current()
 	if err != nil {
-		t.Fatalf("Current(): %v", err)
+		if hasCgo || (hasUSER && hasHOME) {
+			t.Fatalf("Current: %v", err)
+		} else {
+			t.Skipf("skipping: %v", err)
+		}
 	}
 
 	g1, err := LookupGroupId(user.Gid)
@@ -137,10 +163,16 @@
 
 func TestGroupIds(t *testing.T) {
 	checkGroupList(t)
+
 	user, err := Current()
 	if err != nil {
-		t.Fatalf("Current(): %v", err)
+		if hasCgo || (hasUSER && hasHOME) {
+			t.Fatalf("Current: %v", err)
+		} else {
+			t.Skipf("skipping: %v", err)
+		}
 	}
+
 	gids, err := user.GroupIds()
 	if err != nil {
 		t.Fatalf("%+v.GroupIds(): %v", user, err)
diff --git a/src/os/wait_unimp.go b/src/os/wait_unimp.go
index bc93e44..810e35d 100644
--- a/src/os/wait_unimp.go
+++ b/src/os/wait_unimp.go
@@ -2,11 +2,10 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// aix, darwin, js/wasm, openbsd and solaris don't implement
-// waitid/wait6. netbsd implements wait6, but that is causing test
-// failures, see issue #48789.
+// aix, darwin, js/wasm, openbsd, solaris and wasip1/wasm don't implement
+// waitid/wait6.
 
-//go:build aix || darwin || (js && wasm) || openbsd || solaris
+//go:build aix || darwin || (js && wasm) || openbsd || solaris || wasip1
 
 package os
 
diff --git a/src/path/filepath/path.go b/src/path/filepath/path.go
index 32dd887..3bf3ff6 100644
--- a/src/path/filepath/path.go
+++ b/src/path/filepath/path.go
@@ -8,14 +8,13 @@
 // The filepath package uses either forward slashes or backslashes,
 // depending on the operating system. To process paths such as URLs
 // that always use forward slashes regardless of the operating
-// system, see the path package.
+// system, see the [path] package.
 package filepath
 
 import (
 	"errors"
 	"io/fs"
 	"os"
-	"runtime"
 	"sort"
 	"strings"
 )
@@ -52,6 +51,11 @@
 	b.w++
 }
 
+func (b *lazybuf) prepend(prefix ...byte) {
+	b.buf = append(prefix, b.buf...)
+	b.w += len(prefix)
+}
+
 func (b *lazybuf) string() string {
 	if b.buf == nil {
 		return b.volAndPath[:b.volLen+b.w]
@@ -84,6 +88,10 @@
 // If the result of this process is an empty string, Clean
 // returns the string ".".
 //
+// On Windows, Clean does not modify the volume name other than to replace
+// occurrences of "/" with `\`.
+// For example, Clean("//host/share/../x") returns `\\host\share\x`.
+//
 // See also Rob Pike, “Lexical File Names in Plan 9 or
 // Getting Dot-Dot Right,”
 // https://9p.io/sys/doc/lexnames.html
@@ -146,18 +154,6 @@
 			if rooted && out.w != 1 || !rooted && out.w != 0 {
 				out.append(Separator)
 			}
-			// If a ':' appears in the path element at the start of a Windows path,
-			// insert a .\ at the beginning to avoid converting relative paths
-			// like a/../c: into c:.
-			if runtime.GOOS == "windows" && out.w == 0 && out.volLen == 0 && r != 0 {
-				for i := r; i < n && !os.IsPathSeparator(path[i]); i++ {
-					if path[i] == ':' {
-						out.append('.')
-						out.append(Separator)
-						break
-					}
-				}
-			}
 			// copy element
 			for ; r < n && !os.IsPathSeparator(path[r]); r++ {
 				out.append(path[r])
@@ -170,6 +166,7 @@
 		out.append('.')
 	}
 
+	postClean(&out) // avoid creating absolute paths on Windows
 	return FromSlash(out.string())
 }
 
@@ -549,6 +546,10 @@
 func (d *statDirEntry) Type() fs.FileMode          { return d.info.Mode().Type() }
 func (d *statDirEntry) Info() (fs.FileInfo, error) { return d.info, nil }
 
+func (d *statDirEntry) String() string {
+	return fs.FormatDirEntry(d)
+}
+
 // Walk walks the file tree rooted at root, calling fn for each file or
 // directory in the tree, including root.
 //
diff --git a/src/path/filepath/path_nonwindows.go b/src/path/filepath/path_nonwindows.go
new file mode 100644
index 0000000..db69f02
--- /dev/null
+++ b/src/path/filepath/path_nonwindows.go
@@ -0,0 +1,9 @@
+// Copyright 2023 The Go 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:build !windows
+
+package filepath
+
+func postClean(out *lazybuf) {}
diff --git a/src/path/filepath/path_test.go b/src/path/filepath/path_test.go
index 697bcc6..a646618 100644
--- a/src/path/filepath/path_test.go
+++ b/src/path/filepath/path_test.go
@@ -13,6 +13,7 @@
 	"path/filepath"
 	"reflect"
 	"runtime"
+	"slices"
 	"sort"
 	"strings"
 	"syscall"
@@ -66,6 +67,7 @@
 	{"/abc/def/../../..", "/"},
 	{"abc/def/../../../ghi/jkl/../../../mno", "../../mno"},
 	{"/../abc", "/abc"},
+	{"a/../b:/../../c", `../c`},
 
 	// Combinations
 	{"abc/./../def", "def"},
@@ -88,6 +90,7 @@
 	{`c:\abc\def\..\..`, `c:\`},
 	{`c:\..\abc`, `c:\abc`},
 	{`c:..\abc`, `c:..\abc`},
+	{`c:\b:\..\..\..\d`, `c:\d`},
 	{`\`, `\`},
 	{`/`, `\`},
 	{`\\i\..\c$`, `\\i\..\c$`},
@@ -113,6 +116,9 @@
 	{`a/../c:/a`, `.\c:\a`},
 	{`a/../../c:`, `..\c:`},
 	{`foo:bar`, `foo:bar`},
+
+	// Don't allow cleaning to create a Root Local Device path like \??\a.
+	{`/a/../??/a`, `\.\??\a`},
 }
 
 func TestClean(t *testing.T) {
@@ -168,13 +174,34 @@
 	{"a/", true},
 	{"a/.", true},
 	{"a/./b/./c", true},
+	{`a/../b:/../../c`, false},
 }
 
 var winislocaltests = []IsLocalTest{
 	{"NUL", false},
 	{"nul", false},
+	{"nul ", false},
 	{"nul.", false},
+	{"a/nul:", false},
+	{"a/nul : a", false},
+	{"com0", true},
 	{"com1", false},
+	{"com2", false},
+	{"com3", false},
+	{"com4", false},
+	{"com5", false},
+	{"com6", false},
+	{"com7", false},
+	{"com8", false},
+	{"com9", false},
+	{"com¹", false},
+	{"com²", false},
+	{"com³", false},
+	{"com¹ : a", false},
+	{"cOm1", false},
+	{"lpt1", false},
+	{"LPT1", false},
+	{"lpt³", false},
 	{"./nul", false},
 	{`\`, false},
 	{`\a`, false},
@@ -379,6 +406,8 @@
 	{[]string{`\\a`, `b`, `c`}, `\\a\b\c`},
 	{[]string{`\\a\`, `b`, `c`}, `\\a\b\c`},
 	{[]string{`//`, `a`}, `\\a`},
+	{[]string{`a:\b\c`, `x\..\y:\..\..\z`}, `a:\b\z`},
+	{[]string{`\`, `??\a`}, `\.\??\a`},
 }
 
 func TestJoin(t *testing.T) {
@@ -570,6 +599,10 @@
 func (d *statDirEntry) Type() fs.FileMode          { return d.info.Mode().Type() }
 func (d *statDirEntry) Info() (fs.FileInfo, error) { return d.info, nil }
 
+func (d *statDirEntry) String() string {
+	return fs.FormatDirEntry(d)
+}
+
 func TestWalkDir(t *testing.T) {
 	testWalk(t, filepath.WalkDir, 2)
 }
@@ -612,8 +645,9 @@
 		// 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 runtime.GOOS == "windows" {
-			t.Skip("skipping on Windows")
+		// Chmod is not supported on wasip1.
+		if runtime.GOOS == "windows" || runtime.GOOS == "wasip1" {
+			t.Skip("skipping on " + runtime.GOOS)
 		}
 		if os.Getuid() == 0 {
 			t.Skip("skipping as root")
@@ -826,6 +860,107 @@
 	}
 }
 
+func TestWalkSymlinkRoot(t *testing.T) {
+	testenv.MustHaveSymlink(t)
+
+	td := t.TempDir()
+	dir := filepath.Join(td, "dir")
+	if err := os.MkdirAll(filepath.Join(td, "dir"), 0755); err != nil {
+		t.Fatal(err)
+	}
+	touch(t, filepath.Join(dir, "foo"))
+
+	link := filepath.Join(td, "link")
+	if err := os.Symlink("dir", link); err != nil {
+		t.Fatal(err)
+	}
+
+	abslink := filepath.Join(td, "abslink")
+	if err := os.Symlink(dir, abslink); err != nil {
+		t.Fatal(err)
+	}
+
+	linklink := filepath.Join(td, "linklink")
+	if err := os.Symlink("link", linklink); err != nil {
+		t.Fatal(err)
+	}
+
+	// Per https://pubs.opengroup.org/onlinepubs/9699919799.2013edition/basedefs/V1_chap04.html#tag_04_12:
+	// “A pathname that contains at least one non- <slash> character and that ends
+	// with one or more trailing <slash> characters shall not be resolved
+	// successfully unless the last pathname component before the trailing <slash>
+	// characters names an existing directory [...].”
+	//
+	// Since Walk does not traverse symlinks itself, its behavior should depend on
+	// whether the path passed to Walk ends in a slash: if it does not end in a slash,
+	// Walk should report the symlink itself (since it is the last pathname component);
+	// but if it does end in a slash, Walk should walk the directory to which the symlink
+	// refers (since it must be fully resolved before walking).
+	for _, tt := range []struct {
+		desc      string
+		root      string
+		want      []string
+		buggyGOOS []string
+	}{
+		{
+			desc: "no slash",
+			root: link,
+			want: []string{link},
+		},
+		{
+			desc: "slash",
+			root: link + string(filepath.Separator),
+			want: []string{link, filepath.Join(link, "foo")},
+		},
+		{
+			desc: "abs no slash",
+			root: abslink,
+			want: []string{abslink},
+		},
+		{
+			desc: "abs with slash",
+			root: abslink + string(filepath.Separator),
+			want: []string{abslink, filepath.Join(abslink, "foo")},
+		},
+		{
+			desc: "double link no slash",
+			root: linklink,
+			want: []string{linklink},
+		},
+		{
+			desc:      "double link with slash",
+			root:      linklink + string(filepath.Separator),
+			want:      []string{linklink, filepath.Join(linklink, "foo")},
+			buggyGOOS: []string{"darwin", "ios"}, // https://go.dev/issue/59586
+		},
+	} {
+		tt := tt
+		t.Run(tt.desc, func(t *testing.T) {
+			var walked []string
+			err := filepath.Walk(tt.root, func(path string, info fs.FileInfo, err error) error {
+				if err != nil {
+					return err
+				}
+				t.Logf("%#q: %v", path, info.Mode())
+				walked = append(walked, filepath.Clean(path))
+				return nil
+			})
+			if err != nil {
+				t.Fatal(err)
+			}
+
+			if !reflect.DeepEqual(walked, tt.want) {
+				t.Logf("Walk(%#q) visited %#q; want %#q", tt.root, walked, tt.want)
+				if slices.Contains(tt.buggyGOOS, runtime.GOOS) {
+					t.Logf("(ignoring known bug on %v)", runtime.GOOS)
+				} else {
+					t.Fail()
+				}
+			}
+		})
+	}
+}
+
 var basetests = []PathTest{
 	{"", "."},
 	{".", "."},
@@ -949,6 +1084,8 @@
 	{`\\host\share\`, true},
 	{`\\host\share\foo`, true},
 	{`//host/share/foo/bar`, true},
+	{`\\?\a\b\c`, true},
+	{`\??\a\b\c`, true},
 }
 
 func TestIsAbs(t *testing.T) {
@@ -1201,6 +1338,37 @@
 	}
 }
 
+// Issue 57905.
+func TestRelativeSymlinkToAbsolute(t *testing.T) {
+	testenv.MustHaveSymlink(t)
+	// Not parallel: uses os.Chdir.
+
+	tmpDir := t.TempDir()
+	chdir(t, tmpDir)
+
+	// Create "link" in the current working directory as a symlink to an arbitrary
+	// absolute path. On macOS, this path is likely to begin with a symlink
+	// itself: generally either in /var (symlinked to "private/var") or /tmp
+	// (symlinked to "private/tmp").
+	if err := os.Symlink(tmpDir, "link"); err != nil {
+		t.Fatal(err)
+	}
+	t.Logf(`os.Symlink(%q, "link")`, tmpDir)
+
+	p, err := filepath.EvalSymlinks("link")
+	if err != nil {
+		t.Fatalf(`EvalSymlinks("link"): %v`, err)
+	}
+	want, err := filepath.EvalSymlinks(tmpDir)
+	if err != nil {
+		t.Fatalf(`EvalSymlinks(%q): %v`, tmpDir, err)
+	}
+	if p != want {
+		t.Errorf(`EvalSymlinks("link") = %q; want %q`, p, want)
+	}
+	t.Logf(`EvalSymlinks("link") = %q`, p)
+}
+
 // Test directories relative to temporary directory.
 // The tests are run in absTestDirs[0].
 var absTestDirs = []string{
@@ -1418,7 +1586,8 @@
 var volumenametests = []VolumeNameTest{
 	{`c:/foo/bar`, `c:`},
 	{`c:`, `c:`},
-	{`2:`, ``},
+	{`c:\`, `c:`},
+	{`2:`, `2:`},
 	{``, ``},
 	{`\\\host`, `\\\host`},
 	{`\\\host\`, `\\\host`},
@@ -1438,12 +1607,23 @@
 	{`//host/share//foo///bar////baz`, `\\host\share`},
 	{`\\host\share\foo\..\bar`, `\\host\share`},
 	{`//host/share/foo/../bar`, `\\host\share`},
+	{`//.`, `\\.`},
+	{`//./`, `\\.\`},
 	{`//./NUL`, `\\.\NUL`},
-	{`//?/NUL`, `\\?\NUL`},
+	{`//?/`, `\\?`},
+	{`//./a/b`, `\\.\a`},
+	{`//?/`, `\\?`},
+	{`//?/`, `\\?`},
 	{`//./C:`, `\\.\C:`},
+	{`//./C:/`, `\\.\C:`},
 	{`//./C:/a/b/c`, `\\.\C:`},
 	{`//./UNC/host/share/a/b/c`, `\\.\UNC\host\share`},
 	{`//./UNC/host`, `\\.\UNC\host`},
+	{`//./UNC/host\`, `\\.\UNC\host\`},
+	{`//./UNC`, `\\.\UNC`},
+	{`//./UNC/`, `\\.\UNC\`},
+	{`\\?\x`, `\\?`},
+	{`\??\x`, `\??`},
 }
 
 func TestVolumeName(t *testing.T) {
@@ -1484,36 +1664,33 @@
 	if runtime.GOOS == "ios" {
 		t.Skipf("skipping on %s/%s", runtime.GOOS, runtime.GOARCH)
 	}
-	root, err := filepath.EvalSymlinks(testenv.GOROOT(t) + "/test")
-	if err != nil {
-		t.Fatal(err)
-	}
-	bugs := filepath.Join(root, "fixedbugs")
-	ken := filepath.Join(root, "ken")
-	seenBugs := false
-	seenKen := false
-	err = filepath.Walk(root, func(pth string, info fs.FileInfo, err error) error {
+	root := filepath.Join(testenv.GOROOT(t), "src", "unicode")
+	utf16 := filepath.Join(root, "utf16")
+	utf8 := filepath.Join(root, "utf8")
+	seenUTF16 := false
+	seenUTF8 := false
+	err := filepath.Walk(root, func(pth string, info fs.FileInfo, err error) error {
 		if err != nil {
 			t.Fatal(err)
 		}
 
 		switch pth {
-		case bugs:
-			seenBugs = true
+		case utf16:
+			seenUTF16 = true
 			return filepath.SkipDir
-		case ken:
-			if !seenBugs {
-				t.Fatal("filepath.Walk out of order - ken before fixedbugs")
+		case utf8:
+			if !seenUTF16 {
+				t.Fatal("filepath.Walk out of order - utf8 before utf16")
 			}
-			seenKen = true
+			seenUTF8 = true
 		}
 		return nil
 	})
 	if err != nil {
 		t.Fatal(err)
 	}
-	if !seenKen {
-		t.Fatalf("%q not seen", ken)
+	if !seenUTF8 {
+		t.Fatalf("%q not seen", utf8)
 	}
 }
 
@@ -1716,3 +1893,28 @@
 		t.Errorf("got directories %v, want %v", saw, want)
 	}
 }
+
+func TestEscaping(t *testing.T) {
+	dir1 := t.TempDir()
+	dir2 := t.TempDir()
+	chdir(t, dir1)
+
+	for _, p := range []string{
+		filepath.Join(dir2, "x"),
+	} {
+		if !filepath.IsLocal(p) {
+			continue
+		}
+		f, err := os.Create(p)
+		if err != nil {
+			f.Close()
+		}
+		ents, err := os.ReadDir(dir2)
+		if err != nil {
+			t.Fatal(err)
+		}
+		for _, e := range ents {
+			t.Fatalf("found: %v", e.Name())
+		}
+	}
+}
diff --git a/src/path/filepath/path_unix.go b/src/path/filepath/path_unix.go
index ab1d08d..57e6217 100644
--- a/src/path/filepath/path_unix.go
+++ b/src/path/filepath/path_unix.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build unix || (js && wasm)
+//go:build unix || (js && wasm) || wasip1
 
 package filepath
 
diff --git a/src/path/filepath/path_windows.go b/src/path/filepath/path_windows.go
index 4dca9e0..c490424 100644
--- a/src/path/filepath/path_windows.go
+++ b/src/path/filepath/path_windows.go
@@ -5,6 +5,8 @@
 package filepath
 
 import (
+	"internal/safefilepath"
+	"os"
 	"strings"
 	"syscall"
 )
@@ -20,34 +22,6 @@
 	return c
 }
 
-// isReservedName reports if name is a Windows reserved device name or a console handle.
-// It does not detect names with an extension, which are also reserved on some Windows versions.
-//
-// For details, search for PRN in
-// https://docs.microsoft.com/en-us/windows/desktop/fileio/naming-a-file.
-func isReservedName(name string) bool {
-	if 3 <= len(name) && len(name) <= 4 {
-		switch string([]byte{toUpper(name[0]), toUpper(name[1]), toUpper(name[2])}) {
-		case "CON", "PRN", "AUX", "NUL":
-			return len(name) == 3
-		case "COM", "LPT":
-			return len(name) == 4 && '1' <= name[3] && name[3] <= '9'
-		}
-	}
-	// Passing CONIN$ or CONOUT$ to CreateFile opens a console handle.
-	// https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createfilea#consoles
-	//
-	// While CONIN$ and CONOUT$ aren't documented as being files,
-	// they behave the same as CON. For example, ./CONIN$ also opens the console input.
-	if len(name) == 6 && name[5] == '$' && strings.EqualFold(name, "CONIN$") {
-		return true
-	}
-	if len(name) == 7 && name[6] == '$' && strings.EqualFold(name, "CONOUT$") {
-		return true
-	}
-	return false
-}
-
 func isLocal(path string) bool {
 	if path == "" {
 		return false
@@ -68,25 +42,8 @@
 		if part == "." || part == ".." {
 			hasDots = true
 		}
-		// Trim the extension and look for a reserved name.
-		base, _, hasExt := strings.Cut(part, ".")
-		if isReservedName(base) {
-			if !hasExt {
-				return false
-			}
-			// The path element is a reserved name with an extension. Some Windows
-			// versions consider this a reserved name, while others do not. Use
-			// FullPath to see if the name is reserved.
-			//
-			// FullPath will convert references to reserved device names to their
-			// canonical form: \\.\${DEVICE_NAME}
-			//
-			// FullPath does not perform this conversion for paths which contain
-			// a reserved device name anywhere other than in the last element,
-			// so check the part rather than the full path.
-			if p, _ := syscall.FullPath(part); len(p) >= 4 && p[:4] == `\\.\` {
-				return false
-			}
+		if safefilepath.IsReservedName(part) {
+			return false
 		}
 	}
 	if hasDots {
@@ -118,40 +75,99 @@
 // volumeNameLen returns length of the leading volume name on Windows.
 // It returns 0 elsewhere.
 //
-// See: https://learn.microsoft.com/en-us/dotnet/standard/io/file-path-formats
+// See:
+// https://learn.microsoft.com/en-us/dotnet/standard/io/file-path-formats
+// https://googleprojectzero.blogspot.com/2016/02/the-definitive-guide-on-win32-to-nt.html
 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') {
+	switch {
+	case len(path) >= 2 && path[1] == ':':
+		// Path starts with a drive letter.
+		//
+		// Not all Windows functions necessarily enforce the requirement that
+		// drive letters be in the set A-Z, and we don't try to here.
+		//
+		// We don't handle the case of a path starting with a non-ASCII character,
+		// in which case the "drive letter" might be multiple bytes long.
 		return 2
-	}
-	// UNC and DOS device paths start with two slashes.
-	if !isSlash(path[0]) || !isSlash(path[1]) {
+
+	case len(path) == 0 || !isSlash(path[0]):
+		// Path does not have a volume component.
 		return 0
-	}
-	rest := path[2:]
-	p1, rest, _ := cutPath(rest)
-	p2, rest, ok := cutPath(rest)
-	if !ok {
-		return len(path)
-	}
-	if p1 != "." && p1 != "?" {
-		// This is a UNC path: \\${HOST}\${SHARE}\
-		return len(path) - len(rest) - 1
-	}
-	// This is a DOS device path.
-	if len(p2) == 3 && toUpper(p2[0]) == 'U' && toUpper(p2[1]) == 'N' && toUpper(p2[2]) == 'C' {
-		// This is a DOS device path that links to a UNC: \\.\UNC\${HOST}\${SHARE}\
-		_, rest, _ = cutPath(rest)  // host
-		_, rest, ok = cutPath(rest) // share
+
+	case pathHasPrefixFold(path, `\\.\UNC`):
+		// We're going to treat the UNC host and share as part of the volume
+		// prefix for historical reasons, but this isn't really principled;
+		// Windows's own GetFullPathName will happily remove the first
+		// component of the path in this space, converting
+		// \\.\unc\a\b\..\c into \\.\unc\a\c.
+		return uncLen(path, len(`\\.\UNC\`))
+
+	case pathHasPrefixFold(path, `\\.`):
+		// Path starts with \\., and is a Local Device path.
+		//
+		// We currently treat the next component after the \\.\ prefix
+		// as part of the volume name, although there doesn't seem to be
+		// a principled reason to do this.
+		if len(path) == 3 {
+			return 3 // exactly \\.
+		}
+		_, rest, ok := cutPath(path[4:])
 		if !ok {
 			return len(path)
 		}
+		return len(path) - len(rest) - 1
+
+	case pathHasPrefixFold(path, `\\?`) || pathHasPrefixFold(path, `\??`):
+		// Path starts with \\?\ or \??\, and is a Root Local Device path.
+		//
+		// While Windows usually treats / and \ as equivalent,
+		// /??/ does not seem to be recognized as a Root Local Device path.
+		// We treat it as one anyway here to be safe.
+		return 3
+
+	case len(path) >= 2 && isSlash(path[1]):
+		// Path starts with \\, and is a UNC path.
+		return uncLen(path, 2)
 	}
-	return len(path) - len(rest) - 1
+	return 0
+}
+
+// pathHasPrefixFold tests whether the path s begins with prefix,
+// ignoring case and treating all path separators as equivalent.
+// If s is longer than prefix, then s[len(prefix)] must be a path separator.
+func pathHasPrefixFold(s, prefix string) bool {
+	if len(s) < len(prefix) {
+		return false
+	}
+	for i := 0; i < len(prefix); i++ {
+		if isSlash(prefix[i]) {
+			if !isSlash(s[i]) {
+				return false
+			}
+		} else if toUpper(prefix[i]) != toUpper(s[i]) {
+			return false
+		}
+	}
+	if len(s) > len(prefix) && !isSlash(s[len(prefix)]) {
+		return false
+	}
+	return true
+}
+
+// uncLen returns the length of the volume prefix of a UNC path.
+// prefixLen is the prefix prior to the start of the UNC host;
+// for example, for "//host/share", the prefixLen is len("//")==2.
+func uncLen(path string, prefixLen int) int {
+	count := 0
+	for i := prefixLen; i < len(path); i++ {
+		if isSlash(path[i]) {
+			count++
+			if count == 2 {
+				return i
+			}
+		}
+	}
+	return len(path)
 }
 
 // cutPath slices path around the first path separator.
@@ -238,6 +254,12 @@
 			for len(e) > 0 && isSlash(e[0]) {
 				e = e[1:]
 			}
+			// If the path is \ and the next path element is ??,
+			// add an extra .\ to create \.\?? rather than \??\
+			// (a Root Local Device path).
+			if b.Len() == 1 && pathHasPrefixFold(e, "??") {
+				b.WriteString(`.\`)
+			}
 		case lastChar == ':':
 			// If the path ends in a colon, keep the path relative to the current directory
 			// on a drive and don't add a separator. Preserve leading slashes in the next
@@ -304,3 +326,29 @@
 func sameWord(a, b string) bool {
 	return strings.EqualFold(a, b)
 }
+
+// postClean adjusts the results of Clean to avoid turning a relative path
+// into an absolute or rooted one.
+func postClean(out *lazybuf) {
+	if out.volLen != 0 || out.buf == nil {
+		return
+	}
+	// If a ':' appears in the path element at the start of a path,
+	// insert a .\ at the beginning to avoid converting relative paths
+	// like a/../c: into c:.
+	for _, c := range out.buf {
+		if os.IsPathSeparator(c) {
+			break
+		}
+		if c == ':' {
+			out.prepend('.', Separator)
+			return
+		}
+	}
+	// If a path begins with \??\, insert a \. at the beginning
+	// to avoid converting paths like \a\..\??\c:\x into \??\c:\x
+	// (equivalent to c:\x).
+	if len(out.buf) >= 3 && os.IsPathSeparator(out.buf[0]) && out.buf[1] == '?' && out.buf[2] == '?' {
+		out.prepend(Separator, '.')
+	}
+}
diff --git a/src/path/filepath/path_windows_test.go b/src/path/filepath/path_windows_test.go
index c8c7eef..42aeb4f 100644
--- a/src/path/filepath/path_windows_test.go
+++ b/src/path/filepath/path_windows_test.go
@@ -347,7 +347,11 @@
 	}
 
 	for _, test := range tests {
-		got, err := filepath.ToNorm(test.arg, stubBase)
+		var path string
+		if test.arg != "" {
+			path = filepath.Clean(test.arg)
+		}
+		got, err := filepath.ToNorm(path, stubBase)
 		if err != nil {
 			t.Errorf("toNorm(%s) failed: %v\n", test.arg, err)
 		} else if got != test.want {
@@ -439,7 +443,9 @@
 				continue
 			}
 		}
-
+		if arg != "" {
+			arg = filepath.Clean(arg)
+		}
 		got, err := filepath.ToNorm(arg, filepath.NormBase)
 		if err != nil {
 			t.Errorf("toNorm(%s) failed: %v (wd=%s)\n", arg, err, wd)
diff --git a/src/path/filepath/symlink.go b/src/path/filepath/symlink.go
index 6fefd15..f9435e0 100644
--- a/src/path/filepath/symlink.go
+++ b/src/path/filepath/symlink.go
@@ -126,6 +126,8 @@
 			// Symlink to absolute path.
 			dest = link[:1]
 			end = 1
+			vol = link[:1]
+			volLen = 1
 		} else {
 			// Symlink to relative path; replace last
 			// path component in dest.
diff --git a/src/path/filepath/symlink_windows.go b/src/path/filepath/symlink_windows.go
index 9a436d5..8047ff8 100644
--- a/src/path/filepath/symlink_windows.go
+++ b/src/path/filepath/symlink_windows.go
@@ -63,8 +63,6 @@
 		return path, nil
 	}
 
-	path = Clean(path)
-
 	volume := normVolumeName(path)
 	path = path[len(volume):]
 
diff --git a/src/plugin/plugin.go b/src/plugin/plugin.go
index a5489e6..187d127 100644
--- a/src/plugin/plugin.go
+++ b/src/plugin/plugin.go
@@ -39,7 +39,7 @@
 //     some packages may not be initialized until long after the
 //     application has started running.
 //
-//   - Bugs in applications that load plugins could be exploited by an
+//   - Bugs in applications that load plugins could be exploited by
 //     an attacker to load dangerous or untrusted libraries.
 //
 //   - Runtime crashes are likely to occur unless all parts of the
diff --git a/src/plugin/plugin_dlopen.go b/src/plugin/plugin_dlopen.go
index b4c4e40..f6ae219 100644
--- a/src/plugin/plugin_dlopen.go
+++ b/src/plugin/plugin_dlopen.go
@@ -74,7 +74,7 @@
 	if plugins == nil {
 		plugins = make(map[string]*Plugin)
 	}
-	pluginpath, syms, errstr := lastmoduleinit()
+	pluginpath, syms, initTasks, errstr := lastmoduleinit()
 	if errstr != "" {
 		plugins[filepath] = &Plugin{
 			pluginpath: pluginpath,
@@ -92,14 +92,7 @@
 	plugins[filepath] = p
 	pluginsMu.Unlock()
 
-	initStr := make([]byte, len(pluginpath)+len("..inittask")+1) // +1 for terminating NUL
-	copy(initStr, pluginpath)
-	copy(initStr[len(pluginpath):], "..inittask")
-
-	initTask := C.pluginLookup(h, (*C.char)(unsafe.Pointer(&initStr[0])), &cErr)
-	if initTask != nil {
-		doInit(initTask)
-	}
+	doInit(initTasks)
 
 	// Fill out the value of each plugin symbol.
 	updatedSyms := map[string]any{}
@@ -147,9 +140,14 @@
 )
 
 // lastmoduleinit is defined in package runtime.
-func lastmoduleinit() (pluginpath string, syms map[string]any, errstr string)
+func lastmoduleinit() (pluginpath string, syms map[string]any, inittasks []*initTask, errstr string)
 
 // doInit is defined in package runtime.
 //
 //go:linkname doInit runtime.doInit
-func doInit(t unsafe.Pointer) // t should be a *runtime.initTask
+func doInit(t []*initTask)
+
+type initTask struct {
+	// fields defined in runtime.initTask. We only handle pointers to an initTask
+	// in this package, so the contents are irrelevant.
+}
diff --git a/src/reflect/abi.go b/src/reflect/abi.go
index 32cb314..2b5f405 100644
--- a/src/reflect/abi.go
+++ b/src/reflect/abi.go
@@ -121,11 +121,11 @@
 //
 // If the value was stack-assigned, returns the single
 // abiStep describing that translation, and nil otherwise.
-func (a *abiSeq) addArg(t *rtype) *abiStep {
+func (a *abiSeq) addArg(t *abi.Type) *abiStep {
 	// We'll always be adding a new value, so do that first.
 	pStart := len(a.steps)
 	a.valueStart = append(a.valueStart, pStart)
-	if t.size == 0 {
+	if t.Size() == 0 {
 		// If the size of the argument type is zero, then
 		// in order to degrade gracefully into ABI0, we need
 		// to stack-assign this type. The reason is that
@@ -140,7 +140,7 @@
 		// non-zero-sized struct do not cause it to be
 		// stack-assigned. So we need a special case here
 		// at the top.
-		a.stackBytes = align(a.stackBytes, uintptr(t.align))
+		a.stackBytes = align(a.stackBytes, uintptr(t.Align()))
 		return nil
 	}
 	// Hold a copy of "a" so that we can roll back if
@@ -150,7 +150,7 @@
 		// Register assignment failed. Roll back any changes
 		// and stack-assign.
 		*a = aOld
-		a.stackAssign(t.size, uintptr(t.align))
+		a.stackAssign(t.Size(), uintptr(t.Align()))
 		return &a.steps[len(a.steps)-1]
 	}
 	return nil
@@ -162,11 +162,11 @@
 // If the receiver was stack-assigned, returns the single
 // abiStep describing that translation, and nil otherwise.
 // Returns true if the receiver is a pointer.
-func (a *abiSeq) addRcvr(rcvr *rtype) (*abiStep, bool) {
+func (a *abiSeq) addRcvr(rcvr *abi.Type) (*abiStep, bool) {
 	// The receiver is always one word.
 	a.valueStart = append(a.valueStart, len(a.steps))
 	var ok, ptr bool
-	if ifaceIndir(rcvr) || rcvr.pointers() {
+	if ifaceIndir(rcvr) || rcvr.Pointers() {
 		ok = a.assignIntN(0, goarch.PtrSize, 1, 0b1)
 		ptr = true
 	} else {
@@ -195,12 +195,12 @@
 //
 // This method along with the assign* methods represent the
 // complete register-assignment algorithm for the Go ABI.
-func (a *abiSeq) regAssign(t *rtype, offset uintptr) bool {
-	switch t.Kind() {
+func (a *abiSeq) regAssign(t *abi.Type, offset uintptr) bool {
+	switch Kind(t.Kind()) {
 	case UnsafePointer, Pointer, Chan, Map, Func:
-		return a.assignIntN(offset, t.size, 1, 0b1)
+		return a.assignIntN(offset, t.Size(), 1, 0b1)
 	case Bool, Int, Uint, Int8, Uint8, Int16, Uint16, Int32, Uint32, Uintptr:
-		return a.assignIntN(offset, t.size, 1, 0b0)
+		return a.assignIntN(offset, t.Size(), 1, 0b0)
 	case Int64, Uint64:
 		switch goarch.PtrSize {
 		case 4:
@@ -209,7 +209,7 @@
 			return a.assignIntN(offset, 8, 1, 0b0)
 		}
 	case Float32, Float64:
-		return a.assignFloatN(offset, t.size, 1)
+		return a.assignFloatN(offset, t.Size(), 1)
 	case Complex64:
 		return a.assignFloatN(offset, 4, 2)
 	case Complex128:
@@ -222,22 +222,22 @@
 		return a.assignIntN(offset, goarch.PtrSize, 3, 0b001)
 	case Array:
 		tt := (*arrayType)(unsafe.Pointer(t))
-		switch tt.len {
+		switch tt.Len {
 		case 0:
 			// There's nothing to assign, so don't modify
 			// a.steps but succeed so the caller doesn't
 			// try to stack-assign this value.
 			return true
 		case 1:
-			return a.regAssign(tt.elem, offset)
+			return a.regAssign(tt.Elem, offset)
 		default:
 			return false
 		}
 	case Struct:
 		st := (*structType)(unsafe.Pointer(t))
-		for i := range st.fields {
-			f := &st.fields[i]
-			if !a.regAssign(f.typ, offset+f.offset) {
+		for i := range st.Fields {
+			f := &st.Fields[i]
+			if !a.regAssign(f.Typ, offset+f.Offset) {
 				return false
 			}
 		}
@@ -384,7 +384,7 @@
 	}
 }
 
-func newAbiDesc(t *funcType, rcvr *rtype) abiDesc {
+func newAbiDesc(t *funcType, rcvr *abi.Type) abiDesc {
 	// We need to add space for this argument to
 	// the frame so that it can spill args into it.
 	//
@@ -416,13 +416,13 @@
 			spill += goarch.PtrSize
 		}
 	}
-	for i, arg := range t.in() {
+	for i, arg := range t.InSlice() {
 		stkStep := in.addArg(arg)
 		if stkStep != nil {
 			addTypeBits(stackPtrs, stkStep.stkOff, arg)
 		} else {
-			spill = align(spill, uintptr(arg.align))
-			spill += arg.size
+			spill = align(spill, uintptr(arg.Align()))
+			spill += arg.Size()
 			for _, st := range in.stepsForValue(i) {
 				if st.kind == abiStepPointer {
 					inRegPtrs.Set(st.ireg)
@@ -449,7 +449,7 @@
 	// Fake it by artificially extending stackBytes by
 	// the return offset.
 	out.stackBytes = retOffset
-	for i, res := range t.out() {
+	for i, res := range t.OutSlice() {
 		stkStep := out.addArg(res)
 		if stkStep != nil {
 			addTypeBits(stackPtrs, stkStep.stkOff, res)
diff --git a/src/reflect/all_test.go b/src/reflect/all_test.go
index 28a7640..31f6416 100644
--- a/src/reflect/all_test.go
+++ b/src/reflect/all_test.go
@@ -10,6 +10,7 @@
 	"flag"
 	"fmt"
 	"go/token"
+	"internal/abi"
 	"internal/goarch"
 	"internal/testenv"
 	"io"
@@ -31,6 +32,8 @@
 	"unsafe"
 )
 
+const bucketCount = abi.MapBucketCount
+
 var sink any
 
 func TestBool(t *testing.T) {
@@ -3278,14 +3281,16 @@
 	f() (int32, int8)
 }
 
-var unexpi unexpI = new(unexp)
-
 func TestUnexportedMethods(t *testing.T) {
-	typ := TypeOf(unexpi)
-
+	typ := TypeOf(new(unexp))
 	if got := typ.NumMethod(); got != 0 {
 		t.Errorf("NumMethod=%d, want 0 satisfied methods", got)
 	}
+
+	typ = TypeOf((*unexpI)(nil))
+	if got := typ.Elem().NumMethod(); got != 1 {
+		t.Errorf("NumMethod=%d, want 1 satisfied methods", got)
+	}
 }
 
 type InnerInt struct {
@@ -7162,7 +7167,7 @@
 	verifyGCBits(t, TypeOf(([][10000]Xscalar)(nil)), lit(1))
 	verifyGCBits(t, SliceOf(ArrayOf(10000, Tscalar)), lit(1))
 
-	hdr := make([]byte, 8/goarch.PtrSize)
+	hdr := make([]byte, bucketCount/goarch.PtrSize)
 
 	verifyMapBucket := func(t *testing.T, k, e Type, m any, want []byte) {
 		verifyGCBits(t, MapBucketOf(k, e), want)
@@ -7171,14 +7176,14 @@
 	verifyMapBucket(t,
 		Tscalar, Tptr,
 		map[Xscalar]Xptr(nil),
-		join(hdr, rep(8, lit(0)), rep(8, lit(1)), lit(1)))
+		join(hdr, rep(bucketCount, lit(0)), rep(bucketCount, 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)))
+		join(hdr, rep(bucketCount, lit(0, 1)), rep(bucketCount, lit(1)), lit(1)))
 	verifyMapBucket(t, Tint64, Tptr,
 		map[int64]Xptr(nil),
-		join(hdr, rep(8, rep(8/goarch.PtrSize, lit(0))), rep(8, lit(1)), lit(1)))
+		join(hdr, rep(bucketCount, rep(8/goarch.PtrSize, lit(0))), rep(bucketCount, lit(1)), lit(1)))
 	verifyMapBucket(t,
 		Tscalar, Tscalar,
 		map[Xscalar]Xscalar(nil),
@@ -7186,23 +7191,23 @@
 	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)))
+		join(hdr, rep(bucketCount*2, lit(0, 1)), rep(bucketCount*3, lit(1, 0)), lit(1)))
 	verifyMapBucket(t,
 		ArrayOf(64/goarch.PtrSize, Tscalarptr), ArrayOf(64/goarch.PtrSize, Tptrscalar),
 		map[[64 / goarch.PtrSize]Xscalarptr][64 / goarch.PtrSize]Xptrscalar(nil),
-		join(hdr, rep(8*64/goarch.PtrSize, lit(0, 1)), rep(8*64/goarch.PtrSize, lit(1, 0)), lit(1)))
+		join(hdr, rep(bucketCount*64/goarch.PtrSize, lit(0, 1)), rep(bucketCount*64/goarch.PtrSize, lit(1, 0)), lit(1)))
 	verifyMapBucket(t,
 		ArrayOf(64/goarch.PtrSize+1, Tscalarptr), ArrayOf(64/goarch.PtrSize, Tptrscalar),
 		map[[64/goarch.PtrSize + 1]Xscalarptr][64 / goarch.PtrSize]Xptrscalar(nil),
-		join(hdr, rep(8, lit(1)), rep(8*64/goarch.PtrSize, lit(1, 0)), lit(1)))
+		join(hdr, rep(bucketCount, lit(1)), rep(bucketCount*64/goarch.PtrSize, lit(1, 0)), lit(1)))
 	verifyMapBucket(t,
 		ArrayOf(64/goarch.PtrSize, Tscalarptr), ArrayOf(64/goarch.PtrSize+1, Tptrscalar),
 		map[[64 / goarch.PtrSize]Xscalarptr][64/goarch.PtrSize + 1]Xptrscalar(nil),
-		join(hdr, rep(8*64/goarch.PtrSize, lit(0, 1)), rep(8, lit(1)), lit(1)))
+		join(hdr, rep(bucketCount*64/goarch.PtrSize, lit(0, 1)), rep(bucketCount, lit(1)), lit(1)))
 	verifyMapBucket(t,
 		ArrayOf(64/goarch.PtrSize+1, Tscalarptr), ArrayOf(64/goarch.PtrSize+1, Tptrscalar),
 		map[[64/goarch.PtrSize + 1]Xscalarptr][64/goarch.PtrSize + 1]Xptrscalar(nil),
-		join(hdr, rep(8, lit(1)), rep(8, lit(1)), lit(1)))
+		join(hdr, rep(bucketCount, lit(1)), rep(bucketCount, lit(1)), lit(1)))
 }
 
 func rep(n int, b []byte) []byte { return bytes.Repeat(b, n) }
@@ -8360,3 +8365,48 @@
 	}
 	wg.Wait()
 }
+
+func TestClear(t *testing.T) {
+	m := make(map[string]any, len(valueTests))
+	for _, tt := range valueTests {
+		m[tt.s] = tt.i
+	}
+	mapTestFn := func(v Value) bool { v.Clear(); return v.Len() == 0 }
+
+	s := make([]*pair, len(valueTests))
+	for i := range s {
+		s[i] = &valueTests[i]
+	}
+	sliceTestFn := func(v Value) bool {
+		v.Clear()
+		for i := 0; i < v.Len(); i++ {
+			if !v.Index(i).IsZero() {
+				return false
+			}
+		}
+		return true
+	}
+
+	panicTestFn := func(v Value) bool { shouldPanic("reflect.Value.Clear", func() { v.Clear() }); return true }
+
+	tests := []struct {
+		name     string
+		value    Value
+		testFunc func(v Value) bool
+	}{
+		{"map", ValueOf(m), mapTestFn},
+		{"slice no pointer", ValueOf([]int{1, 2, 3, 4, 5}), sliceTestFn},
+		{"slice has pointer", ValueOf(s), sliceTestFn},
+		{"non-map/slice", ValueOf(1), panicTestFn},
+	}
+
+	for _, tc := range tests {
+		tc := tc
+		t.Run(tc.name, func(t *testing.T) {
+			t.Parallel()
+			if !tc.testFunc(tc.value) {
+				t.Errorf("unexpected result for value.Clear(): %value", tc.value)
+			}
+		})
+	}
+}
diff --git a/src/reflect/arena.go b/src/reflect/arena.go
index 694a3a1..cac1a1d 100644
--- a/src/reflect/arena.go
+++ b/src/reflect/arena.go
@@ -12,7 +12,7 @@
 // specified type, allocating storage for it in the provided arena. That is,
 // the returned Value's Type is PointerTo(typ).
 func ArenaNew(a *arena.Arena, typ Type) Value {
-	return ValueOf(arena_New(a, typ))
+	return ValueOf(arena_New(a, PointerTo(typ)))
 }
 
 func arena_New(a *arena.Arena, typ any) any
diff --git a/src/reflect/benchmark_test.go b/src/reflect/benchmark_test.go
index 51634ab..9241c2c 100644
--- a/src/reflect/benchmark_test.go
+++ b/src/reflect/benchmark_test.go
@@ -247,9 +247,10 @@
 	// Construct a type with a zero ptrToThis.
 	type T struct{ int }
 	t := SliceOf(TypeOf(T{}))
-	ptrToThis := ValueOf(t).Elem().FieldByName("ptrToThis")
+	ptrToThis := ValueOf(t).Elem().FieldByName("PtrToThis")
 	if !ptrToThis.IsValid() {
-		b.Fatalf("%v has no ptrToThis field; was it removed from rtype?", t)
+		b.Skipf("%v has no ptrToThis field; was it removed from rtype?", t) // TODO fix this at top of refactoring
+		// b.Fatalf("%v has no ptrToThis field; was it removed from rtype?", t)
 	}
 	if ptrToThis.Int() != 0 {
 		b.Fatalf("%v.ptrToThis unexpectedly nonzero", t)
diff --git a/src/reflect/deepequal.go b/src/reflect/deepequal.go
index c898bc8..579781e 100644
--- a/src/reflect/deepequal.go
+++ b/src/reflect/deepequal.go
@@ -39,7 +39,7 @@
 	hard := func(v1, v2 Value) bool {
 		switch v1.Kind() {
 		case Pointer:
-			if v1.typ.ptrdata == 0 {
+			if v1.typ().PtrBytes == 0 {
 				// not-in-heap pointers can't be cyclic.
 				// At least, all of our current uses of runtime/internal/sys.NotInHeap
 				// have that property. The runtime ones aren't cyclic (and we don't use
diff --git a/src/reflect/export_test.go b/src/reflect/export_test.go
index f7d2cc3..2496c8d 100644
--- a/src/reflect/export_test.go
+++ b/src/reflect/export_test.go
@@ -5,6 +5,7 @@
 package reflect
 
 import (
+	"internal/abi"
 	"internal/goarch"
 	"sync"
 	"unsafe"
@@ -29,17 +30,17 @@
 // takes up one byte, so that writing out test cases is a little clearer.
 // If ptrs is false, gc will be nil.
 func FuncLayout(t Type, rcvr Type) (frametype Type, argSize, retOffset uintptr, stack, gc, inReg, outReg []byte, ptrs bool) {
-	var ft *rtype
+	var ft *abi.Type
 	var abid abiDesc
 	if rcvr != nil {
-		ft, _, abid = funcLayout((*funcType)(unsafe.Pointer(t.(*rtype))), rcvr.(*rtype))
+		ft, _, abid = funcLayout((*funcType)(unsafe.Pointer(t.common())), rcvr.common())
 	} else {
 		ft, _, abid = funcLayout((*funcType)(unsafe.Pointer(t.(*rtype))), nil)
 	}
 	// Extract size information.
 	argSize = abid.stackCallArgsSize
 	retOffset = abid.retOffset
-	frametype = ft
+	frametype = toType(ft)
 
 	// Expand stack pointer bitmap into byte-map.
 	for i := uint32(0); i < abid.stackPtrs.n; i++ {
@@ -57,15 +58,15 @@
 		inReg = append(inReg, bool2byte(abid.inRegPtrs.Get(i)))
 		outReg = append(outReg, bool2byte(abid.outRegPtrs.Get(i)))
 	}
-	if ft.kind&kindGCProg != 0 {
+	if ft.Kind_&kindGCProg != 0 {
 		panic("can't handle gc programs")
 	}
 
 	// Expand frame type's GC bitmap into byte-map.
-	ptrs = ft.ptrdata != 0
+	ptrs = ft.PtrBytes != 0
 	if ptrs {
-		nptrs := ft.ptrdata / goarch.PtrSize
-		gcdata := ft.gcSlice(0, (nptrs+7)/8)
+		nptrs := ft.PtrBytes / goarch.PtrSize
+		gcdata := ft.GcSlice(0, (nptrs+7)/8)
 		for i := uintptr(0); i < nptrs; i++ {
 			gc = append(gc, gcdata[i/8]>>(i%8)&1)
 		}
@@ -91,16 +92,16 @@
 func gcbits(any) []byte // provided by runtime
 
 func MapBucketOf(x, y Type) Type {
-	return bucketOf(x.(*rtype), y.(*rtype))
+	return toType(bucketOf(x.common(), y.common()))
 }
 
 func CachedBucketOf(m Type) Type {
 	t := m.(*rtype)
-	if Kind(t.kind&kindMask) != Map {
+	if Kind(t.t.Kind_&kindMask) != Map {
 		panic("not map")
 	}
 	tt := (*mapType)(unsafe.Pointer(t))
-	return tt.bucket
+	return toType(tt.Bucket)
 }
 
 type EmbedWithUnexpMeth struct{}
@@ -120,12 +121,12 @@
 	if ut == nil {
 		panic("type has no methods")
 	}
-	m := ut.methods()[0]
-	mname := t.(*rtype).nameOff(m.name)
-	if *mname.data(0, "name flag field")&(1<<2) == 0 {
+	m := ut.Methods()[0]
+	mname := t.(*rtype).nameOff(m.Name)
+	if *mname.DataChecked(0, "name flag field")&(1<<2) == 0 {
 		panic("method name does not have pkgPath *string")
 	}
-	return mname.bytes
+	return mname.Bytes
 }
 
 type OtherPkgFields struct {
@@ -135,8 +136,8 @@
 
 func IsExported(t Type) bool {
 	typ := t.(*rtype)
-	n := typ.nameOff(typ.str)
-	return n.isExported()
+	n := typ.nameOff(typ.t.Str)
+	return n.IsExported()
 }
 
 func ResolveReflectName(s string) {
diff --git a/src/reflect/makefunc.go b/src/reflect/makefunc.go
index ee07299..2ed7f38 100644
--- a/src/reflect/makefunc.go
+++ b/src/reflect/makefunc.go
@@ -100,8 +100,8 @@
 
 	// 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}
+	fl |= flag(v.typ().Kind())
+	rcvr := Value{v.typ(), v.ptr, fl}
 
 	// v.Type returns the actual type of the method value.
 	ftyp := (*funcType)(unsafe.Pointer(v.Type().(*rtype)))
@@ -126,7 +126,7 @@
 	// but we want Interface() and other operations to fail early.
 	methodReceiver(op, fv.rcvr, fv.method)
 
-	return Value{&ftyp.rtype, unsafe.Pointer(fv), v.flag&flagRO | flag(Func)}
+	return Value{ftyp.Common(), unsafe.Pointer(fv), v.flag&flagRO | flag(Func)}
 }
 
 func methodValueCallCodePtr() uintptr {
diff --git a/src/reflect/swapper.go b/src/reflect/swapper.go
index 745c7b9..1e8f4ed 100644
--- a/src/reflect/swapper.go
+++ b/src/reflect/swapper.go
@@ -5,6 +5,7 @@
 package reflect
 
 import (
+	"internal/abi"
 	"internal/goarch"
 	"internal/unsafeheader"
 	"unsafe"
@@ -31,9 +32,9 @@
 		}
 	}
 
-	typ := v.Type().Elem().(*rtype)
+	typ := v.Type().Elem().common()
 	size := typ.Size()
-	hasPtr := typ.ptrdata != 0
+	hasPtr := typ.PtrBytes != 0
 
 	// Some common & small cases, without using memmove:
 	if hasPtr {
@@ -41,7 +42,7 @@
 			ps := *(*[]unsafe.Pointer)(v.ptr)
 			return func(i, j int) { ps[i], ps[j] = ps[j], ps[i] }
 		}
-		if typ.Kind() == String {
+		if typ.Kind() == abi.String {
 			ss := *(*[]string)(v.ptr)
 			return func(i, j int) { ss[i], ss[j] = ss[j], ss[i] }
 		}
diff --git a/src/reflect/type.go b/src/reflect/type.go
index 01d1456..9fd242e 100644
--- a/src/reflect/type.go
+++ b/src/reflect/type.go
@@ -16,6 +16,7 @@
 package reflect
 
 import (
+	"internal/abi"
 	"internal/goarch"
 	"strconv"
 	"sync"
@@ -217,7 +218,7 @@
 	// It panics if i is not in the range [0, NumOut()).
 	Out(i int) Type
 
-	common() *rtype
+	common() *abi.Type
 	uncommon() *uncommonType
 }
 
@@ -272,84 +273,35 @@
 // Ptr is the old name for the Pointer kind.
 const Ptr = Pointer
 
-// tflag is used by an rtype to signal what extra type information is
-// available in the memory directly following the rtype value.
-//
-// tflag values must be kept in sync with copies in:
-//
-//	cmd/compile/internal/reflectdata/reflect.go
-//	cmd/link/internal/ld/decodesym.go
-//	runtime/type.go
-type tflag uint8
-
-const (
-	// tflagUncommon means that there is a pointer, *uncommonType,
-	// just beyond the outer type structure.
-	//
-	// For example, if t.Kind() == Struct and t.tflag&tflagUncommon != 0,
-	// then t has uncommonType data and it can be accessed as:
-	//
-	//	type tUncommon struct {
-	//		structType
-	//		u uncommonType
-	//	}
-	//	u := &(*tUncommon)(unsafe.Pointer(t)).u
-	tflagUncommon tflag = 1 << 0
-
-	// tflagExtraStar means the name in the str field has an
-	// extraneous '*' prefix. This is because for most types T in
-	// a program, the type *T also exists and reusing the str data
-	// saves binary size.
-	tflagExtraStar tflag = 1 << 1
-
-	// tflagNamed means the type has a name.
-	tflagNamed tflag = 1 << 2
-
-	// tflagRegularMemory means that equal and hash functions can treat
-	// this type as a single region of t.size bytes.
-	tflagRegularMemory tflag = 1 << 3
-)
-
-// rtype is the common implementation of most values.
-// It is embedded in other struct types.
-//
-// rtype must be kept in sync with ../runtime/type.go:/^type._type.
-type rtype struct {
-	size       uintptr
-	ptrdata    uintptr // number of bytes in the type that can contain pointers
-	hash       uint32  // hash of type; avoids computation in hash tables
-	tflag      tflag   // extra type information flags
-	align      uint8   // alignment of variable with this type
-	fieldAlign uint8   // alignment of struct field with this type
-	kind       uint8   // enumeration for C
-	// function for comparing objects of this type
-	// (ptr to object A, ptr to object B) -> ==?
-	equal     func(unsafe.Pointer, unsafe.Pointer) bool
-	gcdata    *byte   // garbage collection data
-	str       nameOff // string form
-	ptrToThis typeOff // type for pointer to this type, may be zero
-}
-
-// Method on non-interface type
-type method struct {
-	name nameOff // name of method
-	mtyp typeOff // method type (without receiver)
-	ifn  textOff // fn used in interface call (one-word receiver)
-	tfn  textOff // fn used for normal method call
-}
-
 // uncommonType is present only for defined types or types with methods
 // (if T is a defined type, the uncommonTypes for T and *T have methods).
 // Using a pointer to this struct reduces the overall size required
 // to describe a non-defined type with no methods.
-type uncommonType struct {
-	pkgPath nameOff // import path; empty for built-in types like int, string
-	mcount  uint16  // number of methods
-	xcount  uint16  // number of exported methods
-	moff    uint32  // offset from this uncommontype to [mcount]method
-	_       uint32  // unused
+type uncommonType = abi.UncommonType
+
+// Embed this type to get common/uncommon
+type common struct {
+	abi.Type
 }
 
+// rtype is the common implementation of most values.
+// It is embedded in other struct types.
+type rtype struct {
+	t abi.Type
+}
+
+func (t *rtype) common() *abi.Type {
+	return &t.t
+}
+
+func (t *rtype) uncommon() *abi.UncommonType {
+	return t.t.Uncommon()
+}
+
+type aNameOff = abi.NameOff
+type aTypeOff = abi.TypeOff
+type aTextOff = abi.TextOff
+
 // ChanDir represents a channel type's direction.
 type ChanDir int
 
@@ -360,19 +312,10 @@
 )
 
 // arrayType represents a fixed array type.
-type arrayType struct {
-	rtype
-	elem  *rtype // array element type
-	slice *rtype // slice type
-	len   uintptr
-}
+type arrayType = abi.ArrayType
 
 // chanType represents a channel type.
-type chanType struct {
-	rtype
-	elem *rtype  // channel element type
-	dir  uintptr // channel direction (ChanDir)
-}
+type chanType = abi.ChanType
 
 // funcType represents a function type.
 //
@@ -385,216 +328,80 @@
 //		uncommonType
 //		[2]*rtype    // [0] is in, [1] is out
 //	}
-type funcType struct {
-	rtype
-	inCount  uint16
-	outCount uint16 // top bit is set if last input parameter is ...
-}
-
-// imethod represents a method on an interface type
-type imethod struct {
-	name nameOff // name of method
-	typ  typeOff // .(*FuncType) underneath
-}
+type funcType = abi.FuncType
 
 // interfaceType represents an interface type.
 type interfaceType struct {
-	rtype
-	pkgPath name      // import path
-	methods []imethod // sorted by hash
+	abi.InterfaceType // can embed directly because not a public type.
+}
+
+func (t *interfaceType) nameOff(off aNameOff) abi.Name {
+	return toRType(&t.Type).nameOff(off)
+}
+
+func nameOffFor(t *abi.Type, off aNameOff) abi.Name {
+	return toRType(t).nameOff(off)
+}
+
+func typeOffFor(t *abi.Type, off aTypeOff) *abi.Type {
+	return toRType(t).typeOff(off)
+}
+
+func (t *interfaceType) typeOff(off aTypeOff) *abi.Type {
+	return toRType(&t.Type).typeOff(off)
+}
+
+func (t *interfaceType) common() *abi.Type {
+	return &t.Type
+}
+
+func (t *interfaceType) uncommon() *abi.UncommonType {
+	return t.Uncommon()
 }
 
 // mapType represents a map type.
 type mapType struct {
-	rtype
-	key    *rtype // map key type
-	elem   *rtype // map element (value) type
-	bucket *rtype // internal bucket structure
-	// function for hashing keys (ptr to key, seed) -> hash
-	hasher     func(unsafe.Pointer, uintptr) uintptr
-	keysize    uint8  // size of key slot
-	valuesize  uint8  // size of value slot
-	bucketsize uint16 // size of bucket
-	flags      uint32
+	abi.MapType
 }
 
 // ptrType represents a pointer type.
 type ptrType struct {
-	rtype
-	elem *rtype // pointer element (pointed at) type
+	abi.PtrType
 }
 
 // sliceType represents a slice type.
 type sliceType struct {
-	rtype
-	elem *rtype // slice element type
+	abi.SliceType
 }
 
 // Struct field
-type structField struct {
-	name   name    // name is always non-empty
-	typ    *rtype  // type of field
-	offset uintptr // byte offset of field
-}
-
-func (f *structField) embedded() bool {
-	return f.name.embedded()
-}
+type structField = abi.StructField
 
 // structType represents a struct type.
 type structType struct {
-	rtype
-	pkgPath name
-	fields  []structField // sorted by offset
+	abi.StructType
 }
 
-// name is an encoded type name with optional extra data.
-//
-// The first byte is a bit field containing:
-//
-//	1<<0 the name is exported
-//	1<<1 tag data follows the name
-//	1<<2 pkgPath nameOff follows the name and tag
-//	1<<3 the name is of an embedded (a.k.a. anonymous) field
-//
-// Following that, there is a varint-encoded length of the name,
-// followed by the name itself.
-//
-// If tag data is present, it also has a varint-encoded length
-// followed by the tag itself.
-//
-// If the import path follows, then 4 bytes at the end of
-// the data form a nameOff. The import path is only set for concrete
-// methods that are defined in a different package than their type.
-//
-// If a name starts with "*", then the exported bit represents
-// whether the pointed to type is exported.
-//
-// Note: this encoding must match here and in:
-//   cmd/compile/internal/reflectdata/reflect.go
-//   runtime/type.go
-//   internal/reflectlite/type.go
-//   cmd/link/internal/ld/decodesym.go
-
-type name struct {
-	bytes *byte
-}
-
-func (n name) data(off int, whySafe string) *byte {
-	return (*byte)(add(unsafe.Pointer(n.bytes), uintptr(off), whySafe))
-}
-
-func (n name) isExported() bool {
-	return (*n.bytes)&(1<<0) != 0
-}
-
-func (n name) hasTag() bool {
-	return (*n.bytes)&(1<<1) != 0
-}
-
-func (n name) embedded() bool {
-	return (*n.bytes)&(1<<3) != 0
-}
-
-// readVarint parses a varint as encoded by encoding/binary.
-// It returns the number of encoded bytes and the encoded value.
-func (n name) readVarint(off int) (int, int) {
-	v := 0
-	for i := 0; ; i++ {
-		x := *n.data(off+i, "read varint")
-		v += int(x&0x7f) << (7 * i)
-		if x&0x80 == 0 {
-			return i + 1, v
-		}
-	}
-}
-
-// writeVarint writes n to buf in varint form. Returns the
-// number of bytes written. n must be nonnegative.
-// Writes at most 10 bytes.
-func writeVarint(buf []byte, n int) int {
-	for i := 0; ; i++ {
-		b := byte(n & 0x7f)
-		n >>= 7
-		if n == 0 {
-			buf[i] = b
-			return i + 1
-		}
-		buf[i] = b | 0x80
-	}
-}
-
-func (n name) name() string {
-	if n.bytes == nil {
+func pkgPath(n abi.Name) string {
+	if n.Bytes == nil || *n.DataChecked(0, "name flag field")&(1<<2) == 0 {
 		return ""
 	}
-	i, l := n.readVarint(1)
-	return unsafe.String(n.data(1+i, "non-empty string"), l)
-}
-
-func (n name) tag() string {
-	if !n.hasTag() {
-		return ""
-	}
-	i, l := n.readVarint(1)
-	i2, l2 := n.readVarint(1 + i + l)
-	return unsafe.String(n.data(1+i+l+i2, "non-empty string"), l2)
-}
-
-func (n name) pkgPath() string {
-	if n.bytes == nil || *n.data(0, "name flag field")&(1<<2) == 0 {
-		return ""
-	}
-	i, l := n.readVarint(1)
+	i, l := n.ReadVarint(1)
 	off := 1 + i + l
-	if n.hasTag() {
-		i2, l2 := n.readVarint(off)
+	if n.HasTag() {
+		i2, l2 := n.ReadVarint(off)
 		off += i2 + l2
 	}
 	var nameOff int32
 	// Note that this field may not be aligned in memory,
 	// so we cannot use a direct int32 assignment here.
-	copy((*[4]byte)(unsafe.Pointer(&nameOff))[:], (*[4]byte)(unsafe.Pointer(n.data(off, "name offset field")))[:])
-	pkgPathName := name{(*byte)(resolveTypeOff(unsafe.Pointer(n.bytes), nameOff))}
-	return pkgPathName.name()
+	copy((*[4]byte)(unsafe.Pointer(&nameOff))[:], (*[4]byte)(unsafe.Pointer(n.DataChecked(off, "name offset field")))[:])
+	pkgPathName := abi.Name{Bytes: (*byte)(resolveTypeOff(unsafe.Pointer(n.Bytes), nameOff))}
+	return pkgPathName.Name()
 }
 
-func newName(n, tag string, exported, embedded bool) name {
-	if len(n) >= 1<<29 {
-		panic("reflect.nameFrom: name too long: " + n[:1024] + "...")
-	}
-	if len(tag) >= 1<<29 {
-		panic("reflect.nameFrom: tag too long: " + tag[:1024] + "...")
-	}
-	var nameLen [10]byte
-	var tagLen [10]byte
-	nameLenLen := writeVarint(nameLen[:], len(n))
-	tagLenLen := writeVarint(tagLen[:], len(tag))
-
-	var bits byte
-	l := 1 + nameLenLen + len(n)
-	if exported {
-		bits |= 1 << 0
-	}
-	if len(tag) > 0 {
-		l += tagLenLen + len(tag)
-		bits |= 1 << 1
-	}
-	if embedded {
-		bits |= 1 << 3
-	}
-
-	b := make([]byte, l)
-	b[0] = bits
-	copy(b[1:], nameLen[:nameLenLen])
-	copy(b[1+nameLenLen:], n)
-	if len(tag) > 0 {
-		tb := b[1+nameLenLen+len(n):]
-		copy(tb, tagLen[:tagLenLen])
-		copy(tb[tagLenLen:], tag)
-	}
-
-	return name{bytes: &b[0]}
+func newName(n, tag string, exported, embedded bool) abi.Name {
+	return abi.NewName(n, tag, exported, embedded)
 }
 
 /*
@@ -668,142 +475,78 @@
 	UnsafePointer: "unsafe.Pointer",
 }
 
-func (t *uncommonType) methods() []method {
-	if t.mcount == 0 {
-		return nil
-	}
-	return (*[1 << 16]method)(add(unsafe.Pointer(t), uintptr(t.moff), "t.mcount > 0"))[:t.mcount:t.mcount]
-}
-
-func (t *uncommonType) exportedMethods() []method {
-	if t.xcount == 0 {
-		return nil
-	}
-	return (*[1 << 16]method)(add(unsafe.Pointer(t), uintptr(t.moff), "t.xcount > 0"))[:t.xcount:t.xcount]
-}
-
 // resolveNameOff resolves a name offset from a base pointer.
 // The (*rtype).nameOff method is a convenience wrapper for this function.
 // Implemented in the runtime package.
+//
+//go:noescape
 func resolveNameOff(ptrInModule unsafe.Pointer, off int32) unsafe.Pointer
 
 // resolveTypeOff resolves an *rtype offset from a base type.
 // The (*rtype).typeOff method is a convenience wrapper for this function.
 // Implemented in the runtime package.
+//
+//go:noescape
 func resolveTypeOff(rtype unsafe.Pointer, off int32) unsafe.Pointer
 
 // resolveTextOff resolves a function pointer offset from a base type.
 // The (*rtype).textOff method is a convenience wrapper for this function.
 // Implemented in the runtime package.
+//
+//go:noescape
 func resolveTextOff(rtype unsafe.Pointer, off int32) unsafe.Pointer
 
 // addReflectOff adds a pointer to the reflection lookup map in the runtime.
 // It returns a new ID that can be used as a typeOff or textOff, and will
 // be resolved correctly. Implemented in the runtime package.
+//
+//go:noescape
 func addReflectOff(ptr unsafe.Pointer) int32
 
 // resolveReflectName adds a name to the reflection lookup map in the runtime.
 // It returns a new nameOff that can be used to refer to the pointer.
-func resolveReflectName(n name) nameOff {
-	return nameOff(addReflectOff(unsafe.Pointer(n.bytes)))
+func resolveReflectName(n abi.Name) aNameOff {
+	return aNameOff(addReflectOff(unsafe.Pointer(n.Bytes)))
 }
 
 // resolveReflectType adds a *rtype to the reflection lookup map in the runtime.
 // It returns a new typeOff that can be used to refer to the pointer.
-func resolveReflectType(t *rtype) typeOff {
-	return typeOff(addReflectOff(unsafe.Pointer(t)))
+func resolveReflectType(t *abi.Type) aTypeOff {
+	return aTypeOff(addReflectOff(unsafe.Pointer(t)))
 }
 
 // resolveReflectText adds a function pointer to the reflection lookup map in
 // the runtime. It returns a new textOff that can be used to refer to the
 // pointer.
-func resolveReflectText(ptr unsafe.Pointer) textOff {
-	return textOff(addReflectOff(ptr))
+func resolveReflectText(ptr unsafe.Pointer) aTextOff {
+	return aTextOff(addReflectOff(ptr))
 }
 
-type nameOff int32 // offset to a name
-type typeOff int32 // offset to an *rtype
-type textOff int32 // offset from top of text section
-
-func (t *rtype) nameOff(off nameOff) name {
-	return name{(*byte)(resolveNameOff(unsafe.Pointer(t), int32(off)))}
+func (t *rtype) nameOff(off aNameOff) abi.Name {
+	return abi.Name{Bytes: (*byte)(resolveNameOff(unsafe.Pointer(t), int32(off)))}
 }
 
-func (t *rtype) typeOff(off typeOff) *rtype {
-	return (*rtype)(resolveTypeOff(unsafe.Pointer(t), int32(off)))
+func (t *rtype) typeOff(off aTypeOff) *abi.Type {
+	return (*abi.Type)(resolveTypeOff(unsafe.Pointer(t), int32(off)))
 }
 
-func (t *rtype) textOff(off textOff) unsafe.Pointer {
+func (t *rtype) textOff(off aTextOff) unsafe.Pointer {
 	return resolveTextOff(unsafe.Pointer(t), int32(off))
 }
 
-func (t *rtype) uncommon() *uncommonType {
-	if t.tflag&tflagUncommon == 0 {
-		return nil
-	}
-	switch t.Kind() {
-	case Struct:
-		return &(*structTypeUncommon)(unsafe.Pointer(t)).u
-	case Pointer:
-		type u struct {
-			ptrType
-			u uncommonType
-		}
-		return &(*u)(unsafe.Pointer(t)).u
-	case Func:
-		type u struct {
-			funcType
-			u uncommonType
-		}
-		return &(*u)(unsafe.Pointer(t)).u
-	case Slice:
-		type u struct {
-			sliceType
-			u uncommonType
-		}
-		return &(*u)(unsafe.Pointer(t)).u
-	case Array:
-		type u struct {
-			arrayType
-			u uncommonType
-		}
-		return &(*u)(unsafe.Pointer(t)).u
-	case Chan:
-		type u struct {
-			chanType
-			u uncommonType
-		}
-		return &(*u)(unsafe.Pointer(t)).u
-	case Map:
-		type u struct {
-			mapType
-			u uncommonType
-		}
-		return &(*u)(unsafe.Pointer(t)).u
-	case Interface:
-		type u struct {
-			interfaceType
-			u uncommonType
-		}
-		return &(*u)(unsafe.Pointer(t)).u
-	default:
-		type u struct {
-			rtype
-			u uncommonType
-		}
-		return &(*u)(unsafe.Pointer(t)).u
-	}
+func textOffFor(t *abi.Type, off aTextOff) unsafe.Pointer {
+	return toRType(t).textOff(off)
 }
 
 func (t *rtype) String() string {
-	s := t.nameOff(t.str).name()
-	if t.tflag&tflagExtraStar != 0 {
+	s := t.nameOff(t.t.Str).Name()
+	if t.t.TFlag&abi.TFlagExtraStar != 0 {
 		return s[1:]
 	}
 	return s
 }
 
-func (t *rtype) Size() uintptr { return t.size }
+func (t *rtype) Size() uintptr { return t.t.Size() }
 
 func (t *rtype) Bits() int {
 	if t == nil {
@@ -813,25 +556,21 @@
 	if k < Int || k > Complex128 {
 		panic("reflect: Bits of non-arithmetic Type " + t.String())
 	}
-	return int(t.size) * 8
+	return int(t.t.Size_) * 8
 }
 
-func (t *rtype) Align() int { return int(t.align) }
+func (t *rtype) Align() int { return t.t.Align() }
 
-func (t *rtype) FieldAlign() int { return int(t.fieldAlign) }
+func (t *rtype) FieldAlign() int { return t.t.FieldAlign() }
 
-func (t *rtype) Kind() Kind { return Kind(t.kind & kindMask) }
+func (t *rtype) Kind() Kind { return Kind(t.t.Kind()) }
 
-func (t *rtype) pointers() bool { return t.ptrdata != 0 }
-
-func (t *rtype) common() *rtype { return t }
-
-func (t *rtype) exportedMethods() []method {
+func (t *rtype) exportedMethods() []abi.Method {
 	ut := t.uncommon()
 	if ut == nil {
 		return nil
 	}
-	return ut.exportedMethods()
+	return ut.ExportedMethods()
 }
 
 func (t *rtype) NumMethod() int {
@@ -852,25 +591,25 @@
 		panic("reflect: Method index out of range")
 	}
 	p := methods[i]
-	pname := t.nameOff(p.name)
-	m.Name = pname.name()
+	pname := t.nameOff(p.Name)
+	m.Name = pname.Name()
 	fl := flag(Func)
-	mtyp := t.typeOff(p.mtyp)
+	mtyp := t.typeOff(p.Mtyp)
 	ft := (*funcType)(unsafe.Pointer(mtyp))
-	in := make([]Type, 0, 1+len(ft.in()))
+	in := make([]Type, 0, 1+ft.NumIn())
 	in = append(in, t)
-	for _, arg := range ft.in() {
-		in = append(in, arg)
+	for _, arg := range ft.InSlice() {
+		in = append(in, toRType(arg))
 	}
-	out := make([]Type, 0, len(ft.out()))
-	for _, ret := range ft.out() {
-		out = append(out, ret)
+	out := make([]Type, 0, ft.NumOut())
+	for _, ret := range ft.OutSlice() {
+		out = append(out, toRType(ret))
 	}
 	mt := FuncOf(in, out, ft.IsVariadic())
 	m.Type = mt
-	tfn := t.textOff(p.tfn)
+	tfn := t.textOff(p.Tfn)
 	fn := unsafe.Pointer(&tfn)
-	m.Func = Value{mt.(*rtype), fn, fl}
+	m.Func = Value{&mt.(*rtype).t, fn, fl}
 
 	m.Index = i
 	return m
@@ -886,7 +625,7 @@
 		return Method{}, false
 	}
 
-	methods := ut.exportedMethods()
+	methods := ut.ExportedMethods()
 
 	// We are looking for the first index i where the string becomes >= s.
 	// This is a copy of sort.Search, with f(h) replaced by (t.nameOff(methods[h].name).name() >= name).
@@ -894,14 +633,14 @@
 	for i < j {
 		h := int(uint(i+j) >> 1) // avoid overflow when computing h
 		// i ≤ h < j
-		if !(t.nameOff(methods[h].name).name() >= name) {
+		if !(t.nameOff(methods[h].Name).Name() >= name) {
 			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.
-	if i < len(methods) && name == t.nameOff(methods[i].name).name() {
+	if i < len(methods) && name == t.nameOff(methods[i].Name).Name() {
 		return t.Method(i), true
 	}
 
@@ -909,22 +648,22 @@
 }
 
 func (t *rtype) PkgPath() string {
-	if t.tflag&tflagNamed == 0 {
+	if t.t.TFlag&abi.TFlagNamed == 0 {
 		return ""
 	}
 	ut := t.uncommon()
 	if ut == nil {
 		return ""
 	}
-	return t.nameOff(ut.pkgPath).name()
+	return t.nameOff(ut.PkgPath).Name()
 }
 
-func (t *rtype) hasName() bool {
-	return t.tflag&tflagNamed != 0
+func pkgPathFor(t *abi.Type) string {
+	return toRType(t).PkgPath()
 }
 
 func (t *rtype) Name() string {
-	if !t.hasName() {
+	if !t.t.HasName() {
 		return ""
 	}
 	s := t.String()
@@ -942,41 +681,32 @@
 	return s[i+1:]
 }
 
+func nameFor(t *abi.Type) string {
+	return toRType(t).Name()
+}
+
 func (t *rtype) ChanDir() ChanDir {
 	if t.Kind() != Chan {
 		panic("reflect: ChanDir of non-chan type " + t.String())
 	}
-	tt := (*chanType)(unsafe.Pointer(t))
-	return ChanDir(tt.dir)
+	tt := (*abi.ChanType)(unsafe.Pointer(t))
+	return ChanDir(tt.Dir)
 }
 
-func (t *rtype) IsVariadic() bool {
-	if t.Kind() != Func {
-		panic("reflect: IsVariadic of non-func type " + t.String())
+func toRType(t *abi.Type) *rtype {
+	return (*rtype)(unsafe.Pointer(t))
+}
+
+func elem(t *abi.Type) *abi.Type {
+	et := t.Elem()
+	if et != nil {
+		return et
 	}
-	tt := (*funcType)(unsafe.Pointer(t))
-	return tt.outCount&(1<<15) != 0
+	panic("reflect: Elem of invalid type " + stringFor(t))
 }
 
 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 Pointer:
-		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 " + t.String())
+	return toType(elem(t.common()))
 }
 
 func (t *rtype) Field(i int) StructField {
@@ -1011,20 +741,12 @@
 	return tt.FieldByNameFunc(match)
 }
 
-func (t *rtype) In(i int) Type {
-	if t.Kind() != Func {
-		panic("reflect: In of non-func type " + t.String())
-	}
-	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 " + t.String())
 	}
 	tt := (*mapType)(unsafe.Pointer(t))
-	return toType(tt.key)
+	return toType(tt.Key)
 }
 
 func (t *rtype) Len() int {
@@ -1032,7 +754,7 @@
 		panic("reflect: Len of non-array type " + t.String())
 	}
 	tt := (*arrayType)(unsafe.Pointer(t))
-	return int(tt.len)
+	return int(tt.Len)
 }
 
 func (t *rtype) NumField() int {
@@ -1040,54 +762,47 @@
 		panic("reflect: NumField of non-struct type " + t.String())
 	}
 	tt := (*structType)(unsafe.Pointer(t))
-	return len(tt.fields)
+	return len(tt.Fields)
+}
+
+func (t *rtype) In(i int) Type {
+	if t.Kind() != Func {
+		panic("reflect: In of non-func type " + t.String())
+	}
+	tt := (*abi.FuncType)(unsafe.Pointer(t))
+	return toType(tt.InSlice()[i])
 }
 
 func (t *rtype) NumIn() int {
 	if t.Kind() != Func {
 		panic("reflect: NumIn of non-func type " + t.String())
 	}
-	tt := (*funcType)(unsafe.Pointer(t))
-	return int(tt.inCount)
+	tt := (*abi.FuncType)(unsafe.Pointer(t))
+	return tt.NumIn()
 }
 
 func (t *rtype) NumOut() int {
 	if t.Kind() != Func {
 		panic("reflect: NumOut of non-func type " + t.String())
 	}
-	tt := (*funcType)(unsafe.Pointer(t))
-	return len(tt.out())
+	tt := (*abi.FuncType)(unsafe.Pointer(t))
+	return tt.NumOut()
 }
 
 func (t *rtype) Out(i int) Type {
 	if t.Kind() != Func {
 		panic("reflect: Out of non-func type " + t.String())
 	}
-	tt := (*funcType)(unsafe.Pointer(t))
-	return toType(tt.out()[i])
+	tt := (*abi.FuncType)(unsafe.Pointer(t))
+	return toType(tt.OutSlice()[i])
 }
 
-func (t *funcType) in() []*rtype {
-	uadd := unsafe.Sizeof(*t)
-	if t.tflag&tflagUncommon != 0 {
-		uadd += unsafe.Sizeof(uncommonType{})
+func (t *rtype) IsVariadic() bool {
+	if t.Kind() != Func {
+		panic("reflect: IsVariadic of non-func type " + t.String())
 	}
-	if t.inCount == 0 {
-		return nil
-	}
-	return (*[1 << 20]*rtype)(add(unsafe.Pointer(t), uadd, "t.inCount > 0"))[:t.inCount:t.inCount]
-}
-
-func (t *funcType) out() []*rtype {
-	uadd := unsafe.Sizeof(*t)
-	if t.tflag&tflagUncommon != 0 {
-		uadd += unsafe.Sizeof(uncommonType{})
-	}
-	outCount := t.outCount & (1<<15 - 1)
-	if outCount == 0 {
-		return nil
-	}
-	return (*[1 << 20]*rtype)(add(unsafe.Pointer(t), uadd, "outCount > 0"))[t.inCount : t.inCount+outCount : t.inCount+outCount]
+	tt := (*abi.FuncType)(unsafe.Pointer(t))
+	return tt.IsVariadic()
 }
 
 // add returns p+x.
@@ -1115,35 +830,35 @@
 
 // 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) {
+	if i < 0 || i >= len(t.Methods) {
 		return
 	}
-	p := &t.methods[i]
-	pname := t.nameOff(p.name)
-	m.Name = pname.name()
-	if !pname.isExported() {
-		m.PkgPath = pname.pkgPath()
+	p := &t.Methods[i]
+	pname := t.nameOff(p.Name)
+	m.Name = pname.Name()
+	if !pname.IsExported() {
+		m.PkgPath = pkgPath(pname)
 		if m.PkgPath == "" {
-			m.PkgPath = t.pkgPath.name()
+			m.PkgPath = t.PkgPath.Name()
 		}
 	}
-	m.Type = toType(t.typeOff(p.typ))
+	m.Type = toType(t.typeOff(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) }
+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 t.nameOff(p.name).name() == name {
+	var p *abi.Imethod
+	for i := range t.Methods {
+		p = &t.Methods[i]
+		if t.nameOff(p.Name).Name() == name {
 			return t.Method(i), true
 		}
 	}
@@ -1254,20 +969,20 @@
 
 // Field returns the i'th struct field.
 func (t *structType) Field(i int) (f StructField) {
-	if i < 0 || i >= len(t.fields) {
+	if i < 0 || i >= len(t.Fields) {
 		panic("reflect: Field index out of bounds")
 	}
-	p := &t.fields[i]
-	f.Type = toType(p.typ)
-	f.Name = p.name.name()
-	f.Anonymous = p.embedded()
-	if !p.name.isExported() {
-		f.PkgPath = t.pkgPath.name()
+	p := &t.Fields[i]
+	f.Type = toType(p.Typ)
+	f.Name = p.Name.Name()
+	f.Anonymous = p.Embedded()
+	if !p.Name.IsExported() {
+		f.PkgPath = t.PkgPath.Name()
 	}
-	if tag := p.name.tag(); tag != "" {
+	if tag := p.Name.Tag(); tag != "" {
 		f.Tag = StructTag(tag)
 	}
-	f.Offset = p.offset
+	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,
@@ -1285,7 +1000,7 @@
 
 // FieldByIndex returns the nested field corresponding to index.
 func (t *structType) FieldByIndex(index []int) (f StructField) {
-	f.Type = toType(&t.rtype)
+	f.Type = toType(&t.Type)
 	for i, x := range index {
 		if i > 0 {
 			ft := f.Type
@@ -1352,16 +1067,16 @@
 				continue
 			}
 			visited[t] = true
-			for i := range t.fields {
-				f := &t.fields[i]
+			for i := range t.Fields {
+				f := &t.Fields[i]
 				// Find name and (for embedded field) type for field f.
-				fname := f.name.name()
-				var ntyp *rtype
-				if f.embedded() {
+				fname := f.Name.Name()
+				var ntyp *abi.Type
+				if f.Embedded() {
 					// Embedded field of type T or *T.
-					ntyp = f.typ
-					if ntyp.Kind() == Pointer {
-						ntyp = ntyp.Elem().common()
+					ntyp = f.Typ
+					if ntyp.Kind() == abi.Pointer {
+						ntyp = ntyp.Elem()
 					}
 				}
 
@@ -1383,7 +1098,7 @@
 				// 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 {
+				if ok || ntyp == nil || ntyp.Kind() != abi.Struct {
 					continue
 				}
 				styp := (*structType)(unsafe.Pointer(ntyp))
@@ -1417,12 +1132,12 @@
 	// Quick check for top-level name, or struct without embedded fields.
 	hasEmbeds := false
 	if name != "" {
-		for i := range t.fields {
-			tf := &t.fields[i]
-			if tf.name.name() == name {
+		for i := range t.Fields {
+			tf := &t.Fields[i]
+			if tf.Name.Name() == name {
 				return t.Field(i), true
 			}
-			if tf.embedded() {
+			if tf.Embedded() {
 				hasEmbeds = true
 			}
 		}
@@ -1437,11 +1152,13 @@
 // If i is a nil interface value, TypeOf returns nil.
 func TypeOf(i any) Type {
 	eface := *(*emptyInterface)(unsafe.Pointer(&i))
-	return toType(eface.typ)
+	// Noescape so this doesn't make i to escape. See the comment
+	// at Value.typ for why this is safe.
+	return toType((*abi.Type)(noescape(unsafe.Pointer(eface.typ))))
 }
 
 // rtypeOf directly extracts the *rtype of the provided value.
-func rtypeOf(i any) *rtype {
+func rtypeOf(i any) *abi.Type {
 	eface := *(*emptyInterface)(unsafe.Pointer(&i))
 	return eface.typ
 }
@@ -1459,28 +1176,29 @@
 // PointerTo returns the pointer type with element t.
 // For example, if t represents type Foo, PointerTo(t) represents *Foo.
 func PointerTo(t Type) Type {
-	return t.(*rtype).ptrTo()
+	return toRType(t.(*rtype).ptrTo())
 }
 
-func (t *rtype) ptrTo() *rtype {
-	if t.ptrToThis != 0 {
-		return t.typeOff(t.ptrToThis)
+func (t *rtype) ptrTo() *abi.Type {
+	at := &t.t
+	if at.PtrToThis != 0 {
+		return t.typeOff(at.PtrToThis)
 	}
 
 	// Check the cache.
 	if pi, ok := ptrMap.Load(t); ok {
-		return &pi.(*ptrType).rtype
+		return &pi.(*ptrType).Type
 	}
 
 	// Look in known types.
 	s := "*" + t.String()
 	for _, tt := range typesByString(s) {
 		p := (*ptrType)(unsafe.Pointer(tt))
-		if p.elem != t {
+		if p.Elem != &t.t {
 			continue
 		}
 		pi, _ := ptrMap.LoadOrStore(t, p)
-		return &pi.(*ptrType).rtype
+		return &pi.(*ptrType).Type
 	}
 
 	// Create a new ptrType starting with the description
@@ -1489,20 +1207,24 @@
 	prototype := *(**ptrType)(unsafe.Pointer(&iptr))
 	pp := *prototype
 
-	pp.str = resolveReflectName(newName(s, "", false, false))
-	pp.ptrToThis = 0
+	pp.Str = resolveReflectName(newName(s, "", false, false))
+	pp.PtrToThis = 0
 
 	// 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 "*".
-	pp.hash = fnv1(t.hash, '*')
+	pp.Hash = fnv1(t.t.Hash, '*')
 
-	pp.elem = t
+	pp.Elem = at
 
 	pi, _ := ptrMap.LoadOrStore(t, &pp)
-	return &pi.(*ptrType).rtype
+	return &pi.(*ptrType).Type
+}
+
+func ptrTo(t *abi.Type) *abi.Type {
+	return toRType(t).ptrTo()
 }
 
 // fnv1 incorporates the list of bytes into the hash x using the FNV-1 hash function.
@@ -1520,36 +1242,35 @@
 	if u.Kind() != Interface {
 		panic("reflect: non-interface type passed to Type.Implements")
 	}
-	return implements(u.(*rtype), t)
+	return implements(u.common(), t.common())
 }
 
 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)
+	uu := u.common()
+	return directlyAssignable(uu, t.common()) || implements(uu, t.common())
 }
 
 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
+	return convertOp(u.common(), t.common()) != nil
 }
 
 func (t *rtype) Comparable() bool {
-	return t.equal != nil
+	return t.t.Equal != nil
 }
 
 // implements reports whether the type V implements the interface type T.
-func implements(T, V *rtype) bool {
-	if T.Kind() != Interface {
+func implements(T, V *abi.Type) bool {
+	if T.Kind() != abi.Interface {
 		return false
 	}
 	t := (*interfaceType)(unsafe.Pointer(T))
-	if len(t.methods) == 0 {
+	if len(t.Methods) == 0 {
 		return true
 	}
 
@@ -1565,29 +1286,29 @@
 	// 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 {
+	if V.Kind() == abi.Interface {
 		v := (*interfaceType)(unsafe.Pointer(V))
 		i := 0
-		for j := 0; j < len(v.methods); j++ {
-			tm := &t.methods[i]
-			tmName := t.nameOff(tm.name)
-			vm := &v.methods[j]
-			vmName := V.nameOff(vm.name)
-			if vmName.name() == tmName.name() && V.typeOff(vm.typ) == t.typeOff(tm.typ) {
-				if !tmName.isExported() {
-					tmPkgPath := tmName.pkgPath()
+		for j := 0; j < len(v.Methods); j++ {
+			tm := &t.Methods[i]
+			tmName := t.nameOff(tm.Name)
+			vm := &v.Methods[j]
+			vmName := nameOffFor(V, vm.Name)
+			if vmName.Name() == tmName.Name() && typeOffFor(V, vm.Typ) == t.typeOff(tm.Typ) {
+				if !tmName.IsExported() {
+					tmPkgPath := pkgPath(tmName)
 					if tmPkgPath == "" {
-						tmPkgPath = t.pkgPath.name()
+						tmPkgPath = t.PkgPath.Name()
 					}
-					vmPkgPath := vmName.pkgPath()
+					vmPkgPath := pkgPath(vmName)
 					if vmPkgPath == "" {
-						vmPkgPath = v.pkgPath.name()
+						vmPkgPath = v.PkgPath.Name()
 					}
 					if tmPkgPath != vmPkgPath {
 						continue
 					}
 				}
-				if i++; i >= len(t.methods) {
+				if i++; i >= len(t.Methods) {
 					return true
 				}
 			}
@@ -1595,32 +1316,32 @@
 		return false
 	}
 
-	v := V.uncommon()
+	v := V.Uncommon()
 	if v == nil {
 		return false
 	}
 	i := 0
-	vmethods := v.methods()
-	for j := 0; j < int(v.mcount); j++ {
-		tm := &t.methods[i]
-		tmName := t.nameOff(tm.name)
+	vmethods := v.Methods()
+	for j := 0; j < int(v.Mcount); j++ {
+		tm := &t.Methods[i]
+		tmName := t.nameOff(tm.Name)
 		vm := vmethods[j]
-		vmName := V.nameOff(vm.name)
-		if vmName.name() == tmName.name() && V.typeOff(vm.mtyp) == t.typeOff(tm.typ) {
-			if !tmName.isExported() {
-				tmPkgPath := tmName.pkgPath()
+		vmName := nameOffFor(V, vm.Name)
+		if vmName.Name() == tmName.Name() && typeOffFor(V, vm.Mtyp) == t.typeOff(tm.Typ) {
+			if !tmName.IsExported() {
+				tmPkgPath := pkgPath(tmName)
 				if tmPkgPath == "" {
-					tmPkgPath = t.pkgPath.name()
+					tmPkgPath = t.PkgPath.Name()
 				}
-				vmPkgPath := vmName.pkgPath()
+				vmPkgPath := pkgPath(vmName)
 				if vmPkgPath == "" {
-					vmPkgPath = V.nameOff(v.pkgPath).name()
+					vmPkgPath = nameOffFor(V, v.PkgPath).Name()
 				}
 				if tmPkgPath != vmPkgPath {
 					continue
 				}
 			}
-			if i++; i >= len(t.methods) {
+			if i++; i >= len(t.Methods) {
 				return true
 			}
 		}
@@ -1632,12 +1353,12 @@
 // can be directly assigned (using memmove) to another channel type T.
 // https://golang.org/doc/go_spec.html#Assignability
 // T and V must be both of Chan kind.
-func specialChannelAssignability(T, V *rtype) bool {
+func specialChannelAssignability(T, V *abi.Type) bool {
 	// Special case:
 	// 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 defined type.
-	return V.ChanDir() == BothDir && (T.Name() == "" || V.Name() == "") && haveIdenticalType(T.Elem(), V.Elem(), true)
+	return V.ChanDir() == abi.BothDir && (nameFor(T) == "" || nameFor(V) == "") && haveIdenticalType(T.Elem(), V.Elem(), true)
 }
 
 // directlyAssignable reports whether a value x of type V can be directly
@@ -1645,7 +1366,7 @@
 // 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 {
+func directlyAssignable(T, V *abi.Type) bool {
 	// x's type V is identical to T?
 	if T == V {
 		return true
@@ -1653,11 +1374,11 @@
 
 	// Otherwise at least one of T and V must not be defined
 	// and they must have the same kind.
-	if T.hasName() && V.hasName() || T.Kind() != V.Kind() {
+	if T.HasName() && V.HasName() || T.Kind() != V.Kind() {
 		return false
 	}
 
-	if T.Kind() == Chan && specialChannelAssignability(T, V) {
+	if T.Kind() == abi.Chan && specialChannelAssignability(T, V) {
 		return true
 	}
 
@@ -1665,25 +1386,25 @@
 	return haveIdenticalUnderlyingType(T, V, true)
 }
 
-func haveIdenticalType(T, V Type, cmpTags bool) bool {
+func haveIdenticalType(T, V *abi.Type, cmpTags bool) bool {
 	if cmpTags {
 		return T == V
 	}
 
-	if T.Name() != V.Name() || T.Kind() != V.Kind() || T.PkgPath() != V.PkgPath() {
+	if nameFor(T) != nameFor(V) || T.Kind() != V.Kind() || pkgPathFor(T) != pkgPathFor(V) {
 		return false
 	}
 
-	return haveIdenticalUnderlyingType(T.common(), V.common(), false)
+	return haveIdenticalUnderlyingType(T, V, false)
 }
 
-func haveIdenticalUnderlyingType(T, V *rtype, cmpTags bool) bool {
+func haveIdenticalUnderlyingType(T, V *abi.Type, cmpTags bool) bool {
 	if T == V {
 		return true
 	}
 
-	kind := T.Kind()
-	if kind != V.Kind() {
+	kind := Kind(T.Kind())
+	if kind != Kind(V.Kind()) {
 		return false
 	}
 
@@ -1704,7 +1425,7 @@
 	case Func:
 		t := (*funcType)(unsafe.Pointer(T))
 		v := (*funcType)(unsafe.Pointer(V))
-		if t.outCount != v.outCount || t.inCount != v.inCount {
+		if t.OutCount != v.OutCount || t.InCount != v.InCount {
 			return false
 		}
 		for i := 0; i < t.NumIn(); i++ {
@@ -1722,7 +1443,7 @@
 	case Interface:
 		t := (*interfaceType)(unsafe.Pointer(T))
 		v := (*interfaceType)(unsafe.Pointer(V))
-		if len(t.methods) == 0 && len(v.methods) == 0 {
+		if len(t.Methods) == 0 && len(v.Methods) == 0 {
 			return true
 		}
 		// Might have the same methods but still
@@ -1738,28 +1459,28 @@
 	case Struct:
 		t := (*structType)(unsafe.Pointer(T))
 		v := (*structType)(unsafe.Pointer(V))
-		if len(t.fields) != len(v.fields) {
+		if len(t.Fields) != len(v.Fields) {
 			return false
 		}
-		if t.pkgPath.name() != v.pkgPath.name() {
+		if t.PkgPath.Name() != v.PkgPath.Name() {
 			return false
 		}
-		for i := range t.fields {
-			tf := &t.fields[i]
-			vf := &v.fields[i]
-			if tf.name.name() != vf.name.name() {
+		for i := range t.Fields {
+			tf := &t.Fields[i]
+			vf := &v.Fields[i]
+			if tf.Name.Name() != vf.Name.Name() {
 				return false
 			}
-			if !haveIdenticalType(tf.typ, vf.typ, cmpTags) {
+			if !haveIdenticalType(tf.Typ, vf.Typ, cmpTags) {
 				return false
 			}
-			if cmpTags && tf.name.tag() != vf.name.tag() {
+			if cmpTags && tf.Name.Tag() != vf.Name.Tag() {
 				return false
 			}
-			if tf.offset != vf.offset {
+			if tf.Offset != vf.Offset {
 				return false
 			}
-			if tf.embedded() != vf.embedded() {
+			if tf.Embedded() != vf.Embedded() {
 				return false
 			}
 		}
@@ -1790,17 +1511,17 @@
 // pointers, channels, maps, slices, and arrays.
 func typelinks() (sections []unsafe.Pointer, offset [][]int32)
 
-func rtypeOff(section unsafe.Pointer, off int32) *rtype {
-	return (*rtype)(add(section, uintptr(off), "sizeof(rtype) > 0"))
+func rtypeOff(section unsafe.Pointer, off int32) *abi.Type {
+	return (*abi.Type)(add(section, uintptr(off), "sizeof(rtype) > 0"))
 }
 
 // typesByString returns the subslice of typelinks() whose elements have
 // the given string representation.
 // It may be empty (no known types with that string) or may have
 // multiple elements (multiple types with that string).
-func typesByString(s string) []*rtype {
+func typesByString(s string) []*abi.Type {
 	sections, offset := typelinks()
-	var ret []*rtype
+	var ret []*abi.Type
 
 	for offsI, offs := range offset {
 		section := sections[offsI]
@@ -1811,7 +1532,7 @@
 		for i < j {
 			h := i + (j-i)>>1 // avoid overflow when computing h
 			// i ≤ h < j
-			if !(rtypeOff(section, offs[h]).String() >= s) {
+			if !(stringFor(rtypeOff(section, offs[h])) >= s) {
 				i = h + 1 // preserves f(i-1) == false
 			} else {
 				j = h // preserves f(j) == true
@@ -1824,7 +1545,7 @@
 		// to do a linear scan anyway.
 		for j := i; j < len(offs); j++ {
 			typ := rtypeOff(section, offs[j])
-			if typ.String() != s {
+			if stringFor(typ) != s {
 				break
 			}
 			ret = append(ret, typ)
@@ -1841,8 +1562,8 @@
 // type kind, one or two subtypes, and an extra integer.
 type cacheKey struct {
 	kind  Kind
-	t1    *rtype
-	t2    *rtype
+	t1    *abi.Type
+	t2    *abi.Type
 	extra uintptr
 }
 
@@ -1863,7 +1584,7 @@
 // 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)
+	typ := t.common()
 
 	// Look in cache.
 	ckey := cacheKey{Chan, typ, nil, uintptr(dir)}
@@ -1872,7 +1593,7 @@
 	}
 
 	// This restriction is imposed by the gc compiler and the runtime.
-	if typ.size >= 1<<16 {
+	if typ.Size_ >= 1<<16 {
 		panic("reflect.ChanOf: element size too large")
 	}
 
@@ -1882,11 +1603,11 @@
 	default:
 		panic("reflect.ChanOf: invalid dir")
 	case SendDir:
-		s = "chan<- " + typ.String()
+		s = "chan<- " + stringFor(typ)
 	case RecvDir:
-		s = "<-chan " + typ.String()
+		s = "<-chan " + stringFor(typ)
 	case BothDir:
-		typeStr := typ.String()
+		typeStr := stringFor(typ)
 		if typeStr[0] == '<' {
 			// typ is recv chan, need parentheses as "<-" associates with leftmost
 			// chan possible, see:
@@ -1899,8 +1620,8 @@
 	}
 	for _, tt := range typesByString(s) {
 		ch := (*chanType)(unsafe.Pointer(tt))
-		if ch.elem == typ && ch.dir == uintptr(dir) {
-			ti, _ := lookupCache.LoadOrStore(ckey, tt)
+		if ch.Elem == typ && ch.Dir == abi.ChanDir(dir) {
+			ti, _ := lookupCache.LoadOrStore(ckey, toRType(tt))
 			return ti.(Type)
 		}
 	}
@@ -1909,13 +1630,13 @@
 	var ichan any = (chan unsafe.Pointer)(nil)
 	prototype := *(**chanType)(unsafe.Pointer(&ichan))
 	ch := *prototype
-	ch.tflag = tflagRegularMemory
-	ch.dir = uintptr(dir)
-	ch.str = resolveReflectName(newName(s, "", false, false))
-	ch.hash = fnv1(typ.hash, 'c', byte(dir))
-	ch.elem = typ
+	ch.TFlag = abi.TFlagRegularMemory
+	ch.Dir = abi.ChanDir(dir)
+	ch.Str = resolveReflectName(newName(s, "", false, false))
+	ch.Hash = fnv1(typ.Hash, 'c', byte(dir))
+	ch.Elem = typ
 
-	ti, _ := lookupCache.LoadOrStore(ckey, &ch.rtype)
+	ti, _ := lookupCache.LoadOrStore(ckey, toRType(&ch.Type))
 	return ti.(Type)
 }
 
@@ -1926,11 +1647,11 @@
 // 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)
+	ktyp := key.common()
+	etyp := elem.common()
 
-	if ktyp.equal == nil {
-		panic("reflect.MapOf: invalid key type " + ktyp.String())
+	if ktyp.Equal == nil {
+		panic("reflect.MapOf: invalid key type " + stringFor(ktyp))
 	}
 
 	// Look in cache.
@@ -1940,11 +1661,11 @@
 	}
 
 	// Look in known types.
-	s := "map[" + ktyp.String() + "]" + etyp.String()
+	s := "map[" + stringFor(ktyp) + "]" + stringFor(etyp)
 	for _, tt := range typesByString(s) {
 		mt := (*mapType)(unsafe.Pointer(tt))
-		if mt.key == ktyp && mt.elem == etyp {
-			ti, _ := lookupCache.LoadOrStore(ckey, tt)
+		if mt.Key == ktyp && mt.Elem == etyp {
+			ti, _ := lookupCache.LoadOrStore(ckey, toRType(tt))
 			return ti.(Type)
 		}
 	}
@@ -1954,41 +1675,41 @@
 	// in ../cmd/compile/internal/reflectdata/reflect.go:writeType.
 	var imap any = (map[unsafe.Pointer]unsafe.Pointer)(nil)
 	mt := **(**mapType)(unsafe.Pointer(&imap))
-	mt.str = resolveReflectName(newName(s, "", false, false))
-	mt.tflag = 0
-	mt.hash = fnv1(etyp.hash, 'm', byte(ktyp.hash>>24), byte(ktyp.hash>>16), byte(ktyp.hash>>8), byte(ktyp.hash))
-	mt.key = ktyp
-	mt.elem = etyp
-	mt.bucket = bucketOf(ktyp, etyp)
-	mt.hasher = func(p unsafe.Pointer, seed uintptr) uintptr {
+	mt.Str = resolveReflectName(newName(s, "", false, false))
+	mt.TFlag = 0
+	mt.Hash = fnv1(etyp.Hash, 'm', byte(ktyp.Hash>>24), byte(ktyp.Hash>>16), byte(ktyp.Hash>>8), byte(ktyp.Hash))
+	mt.Key = ktyp
+	mt.Elem = etyp
+	mt.Bucket = bucketOf(ktyp, etyp)
+	mt.Hasher = func(p unsafe.Pointer, seed uintptr) uintptr {
 		return typehash(ktyp, p, seed)
 	}
-	mt.flags = 0
-	if ktyp.size > maxKeySize {
-		mt.keysize = uint8(goarch.PtrSize)
-		mt.flags |= 1 // indirect key
+	mt.Flags = 0
+	if ktyp.Size_ > maxKeySize {
+		mt.KeySize = uint8(goarch.PtrSize)
+		mt.Flags |= 1 // indirect key
 	} else {
-		mt.keysize = uint8(ktyp.size)
+		mt.KeySize = uint8(ktyp.Size_)
 	}
-	if etyp.size > maxValSize {
-		mt.valuesize = uint8(goarch.PtrSize)
-		mt.flags |= 2 // indirect value
+	if etyp.Size_ > maxValSize {
+		mt.ValueSize = uint8(goarch.PtrSize)
+		mt.Flags |= 2 // indirect value
 	} else {
-		mt.valuesize = uint8(etyp.size)
+		mt.MapType.ValueSize = uint8(etyp.Size_)
 	}
-	mt.bucketsize = uint16(mt.bucket.size)
+	mt.MapType.BucketSize = uint16(mt.Bucket.Size_)
 	if isReflexive(ktyp) {
-		mt.flags |= 4
+		mt.Flags |= 4
 	}
 	if needKeyUpdate(ktyp) {
-		mt.flags |= 8
+		mt.Flags |= 8
 	}
 	if hashMightPanic(ktyp) {
-		mt.flags |= 16
+		mt.Flags |= 16
 	}
-	mt.ptrToThis = 0
+	mt.PtrToThis = 0
 
-	ti, _ := lookupCache.LoadOrStore(ckey, &mt.rtype)
+	ti, _ := lookupCache.LoadOrStore(ckey, toRType(&mt.Type))
 	return ti.(Type)
 }
 
@@ -2051,7 +1772,7 @@
 	for _, in := range in {
 		t := in.(*rtype)
 		args = append(args, t)
-		hash = fnv1(hash, byte(t.hash>>24), byte(t.hash>>16), byte(t.hash>>8), byte(t.hash))
+		hash = fnv1(hash, byte(t.t.Hash>>24), byte(t.t.Hash>>16), byte(t.t.Hash>>8), byte(t.t.Hash))
 	}
 	if variadic {
 		hash = fnv1(hash, 'v')
@@ -2060,22 +1781,22 @@
 	for _, out := range out {
 		t := out.(*rtype)
 		args = append(args, t)
-		hash = fnv1(hash, byte(t.hash>>24), byte(t.hash>>16), byte(t.hash>>8), byte(t.hash))
+		hash = fnv1(hash, byte(t.t.Hash>>24), byte(t.t.Hash>>16), byte(t.t.Hash>>8), byte(t.t.Hash))
 	}
 
-	ft.tflag = 0
-	ft.hash = hash
-	ft.inCount = uint16(len(in))
-	ft.outCount = uint16(len(out))
+	ft.TFlag = 0
+	ft.Hash = hash
+	ft.InCount = uint16(len(in))
+	ft.OutCount = uint16(len(out))
 	if variadic {
-		ft.outCount |= 1 << 15
+		ft.OutCount |= 1 << 15
 	}
 
 	// Look in cache.
 	if ts, ok := funcLookupCache.m.Load(hash); ok {
-		for _, t := range ts.([]*rtype) {
-			if haveIdenticalUnderlyingType(&ft.rtype, t, true) {
-				return t
+		for _, t := range ts.([]*abi.Type) {
+			if haveIdenticalUnderlyingType(&ft.Type, t, true) {
+				return toRType(t)
 			}
 		}
 	}
@@ -2084,53 +1805,56 @@
 	funcLookupCache.Lock()
 	defer funcLookupCache.Unlock()
 	if ts, ok := funcLookupCache.m.Load(hash); ok {
-		for _, t := range ts.([]*rtype) {
-			if haveIdenticalUnderlyingType(&ft.rtype, t, true) {
-				return t
+		for _, t := range ts.([]*abi.Type) {
+			if haveIdenticalUnderlyingType(&ft.Type, t, true) {
+				return toRType(t)
 			}
 		}
 	}
 
-	addToCache := func(tt *rtype) Type {
-		var rts []*rtype
+	addToCache := func(tt *abi.Type) Type {
+		var rts []*abi.Type
 		if rti, ok := funcLookupCache.m.Load(hash); ok {
-			rts = rti.([]*rtype)
+			rts = rti.([]*abi.Type)
 		}
 		funcLookupCache.m.Store(hash, append(rts, tt))
-		return tt
+		return toType(tt)
 	}
 
 	// Look in known types for the same string representation.
 	str := funcStr(ft)
 	for _, tt := range typesByString(str) {
-		if haveIdenticalUnderlyingType(&ft.rtype, tt, true) {
+		if haveIdenticalUnderlyingType(&ft.Type, tt, true) {
 			return addToCache(tt)
 		}
 	}
 
 	// Populate the remaining fields of ft and store in cache.
-	ft.str = resolveReflectName(newName(str, "", false, false))
-	ft.ptrToThis = 0
-	return addToCache(&ft.rtype)
+	ft.Str = resolveReflectName(newName(str, "", false, false))
+	ft.PtrToThis = 0
+	return addToCache(&ft.Type)
+}
+func stringFor(t *abi.Type) string {
+	return toRType(t).String()
 }
 
 // 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() {
+	for i, t := range ft.InSlice() {
 		if i > 0 {
 			repr = append(repr, ", "...)
 		}
-		if ft.IsVariadic() && i == int(ft.inCount)-1 {
+		if ft.IsVariadic() && i == int(ft.InCount)-1 {
 			repr = append(repr, "..."...)
-			repr = append(repr, (*sliceType)(unsafe.Pointer(t)).elem.String()...)
+			repr = append(repr, stringFor((*sliceType)(unsafe.Pointer(t)).Elem)...)
 		} else {
-			repr = append(repr, t.String()...)
+			repr = append(repr, stringFor(t)...)
 		}
 	}
 	repr = append(repr, ')')
-	out := ft.out()
+	out := ft.OutSlice()
 	if len(out) == 1 {
 		repr = append(repr, ' ')
 	} else if len(out) > 1 {
@@ -2140,7 +1864,7 @@
 		if i > 0 {
 			repr = append(repr, ", "...)
 		}
-		repr = append(repr, t.String()...)
+		repr = append(repr, stringFor(t)...)
 	}
 	if len(out) > 1 {
 		repr = append(repr, ')')
@@ -2150,32 +1874,32 @@
 
 // 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() {
+func isReflexive(t *abi.Type) bool {
+	switch Kind(t.Kind()) {
 	case Bool, Int, Int8, Int16, Int32, Int64, Uint, Uint8, Uint16, Uint32, Uint64, Uintptr, Chan, Pointer, String, UnsafePointer:
 		return true
 	case Float32, Float64, Complex64, Complex128, Interface:
 		return false
 	case Array:
 		tt := (*arrayType)(unsafe.Pointer(t))
-		return isReflexive(tt.elem)
+		return isReflexive(tt.Elem)
 	case Struct:
 		tt := (*structType)(unsafe.Pointer(t))
-		for _, f := range tt.fields {
-			if !isReflexive(f.typ) {
+		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())
+		panic("isReflexive called on non-key type " + stringFor(t))
 	}
 }
 
 // needKeyUpdate reports whether map overwrites require the key to be copied.
-func needKeyUpdate(t *rtype) bool {
-	switch t.Kind() {
+func needKeyUpdate(t *abi.Type) bool {
+	switch Kind(t.Kind()) {
 	case Bool, Int, Int8, Int16, Int32, Int64, Uint, Uint8, Uint16, Uint32, Uint64, Uintptr, Chan, Pointer, UnsafePointer:
 		return false
 	case Float32, Float64, Complex64, Complex128, Interface, String:
@@ -2185,33 +1909,33 @@
 		return true
 	case Array:
 		tt := (*arrayType)(unsafe.Pointer(t))
-		return needKeyUpdate(tt.elem)
+		return needKeyUpdate(tt.Elem)
 	case Struct:
 		tt := (*structType)(unsafe.Pointer(t))
-		for _, f := range tt.fields {
-			if needKeyUpdate(f.typ) {
+		for _, f := range tt.Fields {
+			if needKeyUpdate(f.Typ) {
 				return true
 			}
 		}
 		return false
 	default:
 		// Func, Map, Slice, Invalid
-		panic("needKeyUpdate called on non-key type " + t.String())
+		panic("needKeyUpdate called on non-key type " + stringFor(t))
 	}
 }
 
 // hashMightPanic reports whether the hash of a map key of type t might panic.
-func hashMightPanic(t *rtype) bool {
-	switch t.Kind() {
+func hashMightPanic(t *abi.Type) bool {
+	switch Kind(t.Kind()) {
 	case Interface:
 		return true
 	case Array:
 		tt := (*arrayType)(unsafe.Pointer(t))
-		return hashMightPanic(tt.elem)
+		return hashMightPanic(tt.Elem)
 	case Struct:
 		tt := (*structType)(unsafe.Pointer(t))
-		for _, f := range tt.fields {
-			if hashMightPanic(f.typ) {
+		for _, f := range tt.Fields {
+			if hashMightPanic(f.Typ) {
 				return true
 			}
 		}
@@ -2226,17 +1950,17 @@
 // 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
+	bucketSize uintptr = abi.MapBucketCount
+	maxKeySize uintptr = abi.MapMaxKeyBytes
+	maxValSize uintptr = abi.MapMaxElemBytes
 )
 
-func bucketOf(ktyp, etyp *rtype) *rtype {
-	if ktyp.size > maxKeySize {
-		ktyp = PointerTo(ktyp).(*rtype)
+func bucketOf(ktyp, etyp *abi.Type) *abi.Type {
+	if ktyp.Size_ > maxKeySize {
+		ktyp = ptrTo(ktyp)
 	}
-	if etyp.size > maxValSize {
-		etyp = PointerTo(etyp).(*rtype)
+	if etyp.Size_ > maxValSize {
+		etyp = ptrTo(etyp)
 	}
 
 	// Prepare GC data if any.
@@ -2247,28 +1971,29 @@
 	var gcdata *byte
 	var ptrdata uintptr
 
-	size := bucketSize*(1+ktyp.size+etyp.size) + goarch.PtrSize
-	if size&uintptr(ktyp.align-1) != 0 || size&uintptr(etyp.align-1) != 0 {
+	size := bucketSize*(1+ktyp.Size_+etyp.Size_) + goarch.PtrSize
+	if size&uintptr(ktyp.Align_-1) != 0 || size&uintptr(etyp.Align_-1) != 0 {
 		panic("reflect: bad size computation in MapOf")
 	}
 
-	if ktyp.ptrdata != 0 || etyp.ptrdata != 0 {
-		nptr := (bucketSize*(1+ktyp.size+etyp.size) + goarch.PtrSize) / goarch.PtrSize
+	if ktyp.PtrBytes != 0 || etyp.PtrBytes != 0 {
+		nptr := (bucketSize*(1+ktyp.Size_+etyp.Size_) + goarch.PtrSize) / goarch.PtrSize
 		n := (nptr + 7) / 8
+
 		// Runtime needs pointer masks to be a multiple of uintptr in size.
 		n = (n + goarch.PtrSize - 1) &^ (goarch.PtrSize - 1)
 		mask := make([]byte, n)
 		base := bucketSize / goarch.PtrSize
 
-		if ktyp.ptrdata != 0 {
+		if ktyp.PtrBytes != 0 {
 			emitGCMask(mask, base, ktyp, bucketSize)
 		}
-		base += bucketSize * ktyp.size / goarch.PtrSize
+		base += bucketSize * ktyp.Size_ / goarch.PtrSize
 
-		if etyp.ptrdata != 0 {
+		if etyp.PtrBytes != 0 {
 			emitGCMask(mask, base, etyp, bucketSize)
 		}
-		base += bucketSize * etyp.size / goarch.PtrSize
+		base += bucketSize * etyp.Size_ / goarch.PtrSize
 
 		word := base
 		mask[word/8] |= 1 << (word % 8)
@@ -2281,31 +2006,31 @@
 		}
 	}
 
-	b := &rtype{
-		align:   goarch.PtrSize,
-		size:    size,
-		kind:    uint8(Struct),
-		ptrdata: ptrdata,
-		gcdata:  gcdata,
+	b := &abi.Type{
+		Align_:   goarch.PtrSize,
+		Size_:    size,
+		Kind_:    uint8(Struct),
+		PtrBytes: ptrdata,
+		GCData:   gcdata,
 	}
-	s := "bucket(" + ktyp.String() + "," + etyp.String() + ")"
-	b.str = resolveReflectName(newName(s, "", false, false))
+	s := "bucket(" + stringFor(ktyp) + "," + stringFor(etyp) + ")"
+	b.Str = resolveReflectName(newName(s, "", false, false))
 	return b
 }
 
 func (t *rtype) gcSlice(begin, end uintptr) []byte {
-	return (*[1 << 30]byte)(unsafe.Pointer(t.gcdata))[begin:end:end]
+	return (*[1 << 30]byte)(unsafe.Pointer(t.t.GCData))[begin:end:end]
 }
 
 // emitGCMask writes the GC mask for [n]typ into out, starting at bit
 // offset base.
-func emitGCMask(out []byte, base uintptr, typ *rtype, n uintptr) {
-	if typ.kind&kindGCProg != 0 {
+func emitGCMask(out []byte, base uintptr, typ *abi.Type, n uintptr) {
+	if typ.Kind_&kindGCProg != 0 {
 		panic("reflect: unexpected GC program")
 	}
-	ptrs := typ.ptrdata / goarch.PtrSize
-	words := typ.size / goarch.PtrSize
-	mask := typ.gcSlice(0, (ptrs+7)/8)
+	ptrs := typ.PtrBytes / goarch.PtrSize
+	words := typ.Size_ / goarch.PtrSize
+	mask := typ.GcSlice(0, (ptrs+7)/8)
 	for j := uintptr(0); j < ptrs; j++ {
 		if (mask[j/8]>>(j%8))&1 != 0 {
 			for i := uintptr(0); i < n; i++ {
@@ -2318,17 +2043,17 @@
 
 // appendGCProg appends the GC program for the first ptrdata bytes of
 // typ to dst and returns the extended slice.
-func appendGCProg(dst []byte, typ *rtype) []byte {
-	if typ.kind&kindGCProg != 0 {
+func appendGCProg(dst []byte, typ *abi.Type) []byte {
+	if typ.Kind_&kindGCProg != 0 {
 		// Element has GC program; emit one element.
-		n := uintptr(*(*uint32)(unsafe.Pointer(typ.gcdata)))
-		prog := typ.gcSlice(4, 4+n-1)
+		n := uintptr(*(*uint32)(unsafe.Pointer(typ.GCData)))
+		prog := typ.GcSlice(4, 4+n-1)
 		return append(dst, prog...)
 	}
 
 	// Element is small with pointer mask; use as literal bits.
-	ptrs := typ.ptrdata / goarch.PtrSize
-	mask := typ.gcSlice(0, (ptrs+7)/8)
+	ptrs := typ.PtrBytes / goarch.PtrSize
+	mask := typ.GcSlice(0, (ptrs+7)/8)
 
 	// Emit 120-bit chunks of full bytes (max is 127 but we avoid using partial bytes).
 	for ; ptrs > 120; ptrs -= 120 {
@@ -2345,7 +2070,7 @@
 // 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)
+	typ := t.common()
 
 	// Look in cache.
 	ckey := cacheKey{Slice, typ, nil, 0}
@@ -2354,11 +2079,11 @@
 	}
 
 	// Look in known types.
-	s := "[]" + typ.String()
+	s := "[]" + stringFor(typ)
 	for _, tt := range typesByString(s) {
 		slice := (*sliceType)(unsafe.Pointer(tt))
-		if slice.elem == typ {
-			ti, _ := lookupCache.LoadOrStore(ckey, tt)
+		if slice.Elem == typ {
+			ti, _ := lookupCache.LoadOrStore(ckey, toRType(tt))
 			return ti.(Type)
 		}
 	}
@@ -2367,13 +2092,13 @@
 	var islice any = ([]unsafe.Pointer)(nil)
 	prototype := *(**sliceType)(unsafe.Pointer(&islice))
 	slice := *prototype
-	slice.tflag = 0
-	slice.str = resolveReflectName(newName(s, "", false, false))
-	slice.hash = fnv1(typ.hash, '[')
-	slice.elem = typ
-	slice.ptrToThis = 0
+	slice.TFlag = 0
+	slice.Str = resolveReflectName(newName(s, "", false, false))
+	slice.Hash = fnv1(typ.Hash, '[')
+	slice.Elem = typ
+	slice.PtrToThis = 0
 
-	ti, _ := lookupCache.LoadOrStore(ckey, &slice.rtype)
+	ti, _ := lookupCache.LoadOrStore(ckey, toRType(&slice.Type))
 	return ti.(Type)
 }
 
@@ -2431,7 +2156,7 @@
 		size       uintptr
 		typalign   uint8
 		comparable = true
-		methods    []method
+		methods    []abi.Method
 
 		fs   = make([]structField, len(fields))
 		repr = make([]byte, 0, 64)
@@ -2454,8 +2179,8 @@
 			panic("reflect.StructOf: field " + strconv.Itoa(i) + " has no type")
 		}
 		f, fpkgpath := runtimeStructField(field)
-		ft := f.typ
-		if ft.kind&kindGCProg != 0 {
+		ft := f.Typ
+		if ft.Kind_&kindGCProg != 0 {
 			hasGCProg = true
 		}
 		if fpkgpath != "" {
@@ -2467,38 +2192,38 @@
 		}
 
 		// Update string and hash
-		name := f.name.name()
+		name := f.Name.Name()
 		hash = fnv1(hash, []byte(name)...)
 		repr = append(repr, (" " + name)...)
-		if f.embedded() {
+		if f.Embedded() {
 			// Embedded field
-			if f.typ.Kind() == Pointer {
+			if f.Typ.Kind() == abi.Pointer {
 				// Embedded ** and *interface{} are illegal
 				elem := ft.Elem()
-				if k := elem.Kind(); k == Pointer || k == Interface {
-					panic("reflect.StructOf: illegal embedded field type " + ft.String())
+				if k := elem.Kind(); k == abi.Pointer || k == abi.Interface {
+					panic("reflect.StructOf: illegal embedded field type " + stringFor(ft))
 				}
 			}
 
-			switch f.typ.Kind() {
+			switch Kind(f.Typ.Kind()) {
 			case Interface:
 				ift := (*interfaceType)(unsafe.Pointer(ft))
-				for im, m := range ift.methods {
-					if ift.nameOff(m.name).pkgPath() != "" {
+				for im, m := range ift.Methods {
+					if pkgPath(ift.nameOff(m.Name)) != "" {
 						// TODO(sbinet).  Issue 15924.
 						panic("reflect: embedded interface with unexported method(s) not implemented")
 					}
 
 					var (
-						mtyp    = ift.typeOff(m.typ)
+						mtyp    = ift.typeOff(m.Typ)
 						ifield  = i
 						imethod = im
 						ifn     Value
 						tfn     Value
 					)
 
-					if ft.kind&kindDirectIface != 0 {
-						tfn = MakeFunc(mtyp, func(in []Value) []Value {
+					if ft.Kind_&kindDirectIface != 0 {
+						tfn = MakeFunc(toRType(mtyp), func(in []Value) []Value {
 							var args []Value
 							var recv = in[0]
 							if len(in) > 1 {
@@ -2506,7 +2231,7 @@
 							}
 							return recv.Field(ifield).Method(imethod).Call(args)
 						})
-						ifn = MakeFunc(mtyp, func(in []Value) []Value {
+						ifn = MakeFunc(toRType(mtyp), func(in []Value) []Value {
 							var args []Value
 							var recv = in[0]
 							if len(in) > 1 {
@@ -2515,7 +2240,7 @@
 							return recv.Field(ifield).Method(imethod).Call(args)
 						})
 					} else {
-						tfn = MakeFunc(mtyp, func(in []Value) []Value {
+						tfn = MakeFunc(toRType(mtyp), func(in []Value) []Value {
 							var args []Value
 							var recv = in[0]
 							if len(in) > 1 {
@@ -2523,7 +2248,7 @@
 							}
 							return recv.Field(ifield).Method(imethod).Call(args)
 						})
-						ifn = MakeFunc(mtyp, func(in []Value) []Value {
+						ifn = MakeFunc(toRType(mtyp), func(in []Value) []Value {
 							var args []Value
 							var recv = Indirect(in[0])
 							if len(in) > 1 {
@@ -2533,75 +2258,75 @@
 						})
 					}
 
-					methods = append(methods, method{
-						name: resolveReflectName(ift.nameOff(m.name)),
-						mtyp: resolveReflectType(mtyp),
-						ifn:  resolveReflectText(unsafe.Pointer(&ifn)),
-						tfn:  resolveReflectText(unsafe.Pointer(&tfn)),
+					methods = append(methods, abi.Method{
+						Name: resolveReflectName(ift.nameOff(m.Name)),
+						Mtyp: resolveReflectType(mtyp),
+						Ifn:  resolveReflectText(unsafe.Pointer(&ifn)),
+						Tfn:  resolveReflectText(unsafe.Pointer(&tfn)),
 					})
 				}
 			case Pointer:
 				ptr := (*ptrType)(unsafe.Pointer(ft))
-				if unt := ptr.uncommon(); unt != nil {
-					if i > 0 && unt.mcount > 0 {
+				if unt := ptr.Uncommon(); unt != nil {
+					if i > 0 && unt.Mcount > 0 {
 						// Issue 15924.
 						panic("reflect: embedded type with methods not implemented if type is not first field")
 					}
 					if len(fields) > 1 {
 						panic("reflect: embedded type with methods not implemented if there is more than one field")
 					}
-					for _, m := range unt.methods() {
-						mname := ptr.nameOff(m.name)
-						if mname.pkgPath() != "" {
+					for _, m := range unt.Methods() {
+						mname := nameOffFor(ft, m.Name)
+						if pkgPath(mname) != "" {
 							// TODO(sbinet).
 							// Issue 15924.
 							panic("reflect: embedded interface with unexported method(s) not implemented")
 						}
-						methods = append(methods, method{
-							name: resolveReflectName(mname),
-							mtyp: resolveReflectType(ptr.typeOff(m.mtyp)),
-							ifn:  resolveReflectText(ptr.textOff(m.ifn)),
-							tfn:  resolveReflectText(ptr.textOff(m.tfn)),
+						methods = append(methods, abi.Method{
+							Name: resolveReflectName(mname),
+							Mtyp: resolveReflectType(typeOffFor(ft, m.Mtyp)),
+							Ifn:  resolveReflectText(textOffFor(ft, m.Ifn)),
+							Tfn:  resolveReflectText(textOffFor(ft, m.Tfn)),
 						})
 					}
 				}
-				if unt := ptr.elem.uncommon(); unt != nil {
-					for _, m := range unt.methods() {
-						mname := ptr.nameOff(m.name)
-						if mname.pkgPath() != "" {
+				if unt := ptr.Elem.Uncommon(); unt != nil {
+					for _, m := range unt.Methods() {
+						mname := nameOffFor(ft, m.Name)
+						if pkgPath(mname) != "" {
 							// TODO(sbinet)
 							// Issue 15924.
 							panic("reflect: embedded interface with unexported method(s) not implemented")
 						}
-						methods = append(methods, method{
-							name: resolveReflectName(mname),
-							mtyp: resolveReflectType(ptr.elem.typeOff(m.mtyp)),
-							ifn:  resolveReflectText(ptr.elem.textOff(m.ifn)),
-							tfn:  resolveReflectText(ptr.elem.textOff(m.tfn)),
+						methods = append(methods, abi.Method{
+							Name: resolveReflectName(mname),
+							Mtyp: resolveReflectType(typeOffFor(ptr.Elem, m.Mtyp)),
+							Ifn:  resolveReflectText(textOffFor(ptr.Elem, m.Ifn)),
+							Tfn:  resolveReflectText(textOffFor(ptr.Elem, m.Tfn)),
 						})
 					}
 				}
 			default:
-				if unt := ft.uncommon(); unt != nil {
-					if i > 0 && unt.mcount > 0 {
+				if unt := ft.Uncommon(); unt != nil {
+					if i > 0 && unt.Mcount > 0 {
 						// Issue 15924.
 						panic("reflect: embedded type with methods not implemented if type is not first field")
 					}
-					if len(fields) > 1 && ft.kind&kindDirectIface != 0 {
+					if len(fields) > 1 && ft.Kind_&kindDirectIface != 0 {
 						panic("reflect: embedded type with methods not implemented for non-pointer type")
 					}
-					for _, m := range unt.methods() {
-						mname := ft.nameOff(m.name)
-						if mname.pkgPath() != "" {
+					for _, m := range unt.Methods() {
+						mname := nameOffFor(ft, m.Name)
+						if pkgPath(mname) != "" {
 							// TODO(sbinet)
 							// Issue 15924.
 							panic("reflect: embedded interface with unexported method(s) not implemented")
 						}
-						methods = append(methods, method{
-							name: resolveReflectName(mname),
-							mtyp: resolveReflectType(ft.typeOff(m.mtyp)),
-							ifn:  resolveReflectText(ft.textOff(m.ifn)),
-							tfn:  resolveReflectText(ft.textOff(m.tfn)),
+						methods = append(methods, abi.Method{
+							Name: resolveReflectName(mname),
+							Mtyp: resolveReflectType(typeOffFor(ft, m.Mtyp)),
+							Ifn:  resolveReflectText(textOffFor(ft, m.Ifn)),
+							Tfn:  resolveReflectText(textOffFor(ft, m.Tfn)),
 						})
 
 					}
@@ -2613,33 +2338,33 @@
 		}
 		fset[name] = struct{}{}
 
-		hash = fnv1(hash, byte(ft.hash>>24), byte(ft.hash>>16), byte(ft.hash>>8), byte(ft.hash))
+		hash = fnv1(hash, byte(ft.Hash>>24), byte(ft.Hash>>16), byte(ft.Hash>>8), byte(ft.Hash))
 
-		repr = append(repr, (" " + ft.String())...)
-		if f.name.hasTag() {
-			hash = fnv1(hash, []byte(f.name.tag())...)
-			repr = append(repr, (" " + strconv.Quote(f.name.tag()))...)
+		repr = append(repr, (" " + stringFor(ft))...)
+		if f.Name.HasTag() {
+			hash = fnv1(hash, []byte(f.Name.Tag())...)
+			repr = append(repr, (" " + strconv.Quote(f.Name.Tag()))...)
 		}
 		if i < len(fields)-1 {
 			repr = append(repr, ';')
 		}
 
-		comparable = comparable && (ft.equal != nil)
+		comparable = comparable && (ft.Equal != nil)
 
-		offset := align(size, uintptr(ft.align))
+		offset := align(size, uintptr(ft.Align_))
 		if offset < size {
 			panic("reflect.StructOf: struct size would exceed virtual address space")
 		}
-		if ft.align > typalign {
-			typalign = ft.align
+		if ft.Align_ > typalign {
+			typalign = ft.Align_
 		}
-		size = offset + ft.size
+		size = offset + ft.Size_
 		if size < offset {
 			panic("reflect.StructOf: struct size would exceed virtual address space")
 		}
-		f.offset = offset
+		f.Offset = offset
 
-		if ft.size == 0 {
+		if ft.Size_ == 0 {
 			lastzero = size
 		}
 
@@ -2680,15 +2405,15 @@
 		typ = (*structType)(tt.Elem().Field(0).Addr().UnsafePointer())
 		ut = (*uncommonType)(tt.Elem().Field(1).Addr().UnsafePointer())
 
-		copy(tt.Elem().Field(2).Slice(0, len(methods)).Interface().([]method), methods)
+		copy(tt.Elem().Field(2).Slice(0, len(methods)).Interface().([]abi.Method), methods)
 	}
 	// TODO(sbinet): Once we allow embedding multiple types,
 	// methods will need to be sorted like the compiler does.
 	// TODO(sbinet): Once we allow non-exported methods, we will
 	// need to compute xcount as the number of exported methods.
-	ut.mcount = uint16(len(methods))
-	ut.xcount = ut.mcount
-	ut.moff = uint32(unsafe.Sizeof(uncommonType{}))
+	ut.Mcount = uint16(len(methods))
+	ut.Xcount = ut.Mcount
+	ut.Moff = uint32(unsafe.Sizeof(uncommonType{}))
 
 	if len(fs) > 0 {
 		repr = append(repr, ' ')
@@ -2708,17 +2433,17 @@
 	var istruct any = struct{}{}
 	prototype := *(**structType)(unsafe.Pointer(&istruct))
 	*typ = *prototype
-	typ.fields = fs
+	typ.Fields = fs
 	if pkgpath != "" {
-		typ.pkgPath = newName(pkgpath, "", false, false)
+		typ.PkgPath = newName(pkgpath, "", false, false)
 	}
 
 	// Look in cache.
 	if ts, ok := structLookupCache.m.Load(hash); ok {
 		for _, st := range ts.([]Type) {
 			t := st.common()
-			if haveIdenticalUnderlyingType(&typ.rtype, t, true) {
-				return t
+			if haveIdenticalUnderlyingType(&typ.Type, t, true) {
+				return toType(t)
 			}
 		}
 	}
@@ -2729,8 +2454,8 @@
 	if ts, ok := structLookupCache.m.Load(hash); ok {
 		for _, st := range ts.([]Type) {
 			t := st.common()
-			if haveIdenticalUnderlyingType(&typ.rtype, t, true) {
-				return t
+			if haveIdenticalUnderlyingType(&typ.Type, t, true) {
+				return toType(t)
 			}
 		}
 	}
@@ -2746,30 +2471,30 @@
 
 	// Look in known types.
 	for _, t := range typesByString(str) {
-		if haveIdenticalUnderlyingType(&typ.rtype, t, true) {
+		if haveIdenticalUnderlyingType(&typ.Type, t, true) {
 			// even if 't' wasn't a structType with methods, we should be ok
 			// as the 'u uncommonType' field won't be accessed except when
-			// tflag&tflagUncommon is set.
-			return addToCache(t)
+			// tflag&abi.TFlagUncommon is set.
+			return addToCache(toType(t))
 		}
 	}
 
-	typ.str = resolveReflectName(newName(str, "", false, false))
-	typ.tflag = 0 // TODO: set tflagRegularMemory
-	typ.hash = hash
-	typ.size = size
-	typ.ptrdata = typeptrdata(typ.common())
-	typ.align = typalign
-	typ.fieldAlign = typalign
-	typ.ptrToThis = 0
+	typ.Str = resolveReflectName(newName(str, "", false, false))
+	typ.TFlag = 0 // TODO: set tflagRegularMemory
+	typ.Hash = hash
+	typ.Size_ = size
+	typ.PtrBytes = typeptrdata(&typ.Type)
+	typ.Align_ = typalign
+	typ.FieldAlign_ = typalign
+	typ.PtrToThis = 0
 	if len(methods) > 0 {
-		typ.tflag |= tflagUncommon
+		typ.TFlag |= abi.TFlagUncommon
 	}
 
 	if hasGCProg {
 		lastPtrField := 0
 		for i, ft := range fs {
-			if ft.typ.pointers() {
+			if ft.Typ.Pointers() {
 				lastPtrField = i
 			}
 		}
@@ -2781,43 +2506,43 @@
 				// the last field that contains pointer data
 				break
 			}
-			if !ft.typ.pointers() {
+			if !ft.Typ.Pointers() {
 				// Ignore pointerless fields.
 				continue
 			}
 			// Pad to start of this field with zeros.
-			if ft.offset > off {
-				n := (ft.offset - off) / goarch.PtrSize
+			if ft.Offset > off {
+				n := (ft.Offset - off) / goarch.PtrSize
 				prog = append(prog, 0x01, 0x00) // emit a 0 bit
 				if n > 1 {
 					prog = append(prog, 0x81)      // repeat previous bit
 					prog = appendVarint(prog, n-1) // n-1 times
 				}
-				off = ft.offset
+				off = ft.Offset
 			}
 
-			prog = appendGCProg(prog, ft.typ)
-			off += ft.typ.ptrdata
+			prog = appendGCProg(prog, ft.Typ)
+			off += ft.Typ.PtrBytes
 		}
 		prog = append(prog, 0)
 		*(*uint32)(unsafe.Pointer(&prog[0])) = uint32(len(prog) - 4)
-		typ.kind |= kindGCProg
-		typ.gcdata = &prog[0]
+		typ.Kind_ |= kindGCProg
+		typ.GCData = &prog[0]
 	} else {
-		typ.kind &^= kindGCProg
+		typ.Kind_ &^= kindGCProg
 		bv := new(bitVector)
-		addTypeBits(bv, 0, typ.common())
+		addTypeBits(bv, 0, &typ.Type)
 		if len(bv.data) > 0 {
-			typ.gcdata = &bv.data[0]
+			typ.GCData = &bv.data[0]
 		}
 	}
-	typ.equal = nil
+	typ.Equal = nil
 	if comparable {
-		typ.equal = func(p, q unsafe.Pointer) bool {
-			for _, ft := range typ.fields {
-				pi := add(p, ft.offset, "&x.field safe")
-				qi := add(q, ft.offset, "&x.field safe")
-				if !ft.typ.equal(pi, qi) {
+		typ.Equal = func(p, q unsafe.Pointer) bool {
+			for _, ft := range typ.Fields {
+				pi := add(p, ft.Offset, "&x.field safe")
+				qi := add(q, ft.Offset, "&x.field safe")
+				if !ft.Typ.Equal(pi, qi) {
 					return false
 				}
 			}
@@ -2826,14 +2551,14 @@
 	}
 
 	switch {
-	case len(fs) == 1 && !ifaceIndir(fs[0].typ):
+	case len(fs) == 1 && !ifaceIndir(fs[0].Typ):
 		// structs of 1 direct iface type can be direct
-		typ.kind |= kindDirectIface
+		typ.Kind_ |= kindDirectIface
 	default:
-		typ.kind &^= kindDirectIface
+		typ.Kind_ &^= kindDirectIface
 	}
 
-	return addToCache(&typ.rtype)
+	return addToCache(toType(&typ.Type))
 }
 
 // runtimeStructField takes a StructField value passed to StructOf and
@@ -2855,9 +2580,9 @@
 
 	resolveReflectType(field.Type.common()) // install in runtime
 	f := structField{
-		name:   newName(field.Name, string(field.Tag), field.IsExported(), field.Anonymous),
-		typ:    field.Type.common(),
-		offset: 0,
+		Name:   newName(field.Name, string(field.Tag), field.IsExported(), field.Anonymous),
+		Typ:    field.Type.common(),
+		Offset: 0,
 	}
 	return f, field.PkgPath
 }
@@ -2865,26 +2590,26 @@
 // typeptrdata returns the length in bytes of the prefix of t
 // containing pointer data. Anything after this offset is scalar data.
 // keep in sync with ../cmd/compile/internal/reflectdata/reflect.go
-func typeptrdata(t *rtype) uintptr {
+func typeptrdata(t *abi.Type) uintptr {
 	switch t.Kind() {
-	case Struct:
+	case abi.Struct:
 		st := (*structType)(unsafe.Pointer(t))
 		// find the last field that has pointers.
 		field := -1
-		for i := range st.fields {
-			ft := st.fields[i].typ
-			if ft.pointers() {
+		for i := range st.Fields {
+			ft := st.Fields[i].Typ
+			if ft.Pointers() {
 				field = i
 			}
 		}
 		if field == -1 {
 			return 0
 		}
-		f := st.fields[field]
-		return f.offset + f.typ.ptrdata
+		f := st.Fields[field]
+		return f.Offset + f.Typ.PtrBytes
 
 	default:
-		panic("reflect.typeptrdata: unexpected type, " + t.String())
+		panic("reflect.typeptrdata: unexpected type, " + stringFor(t))
 	}
 }
 
@@ -2901,7 +2626,7 @@
 		panic("reflect: negative length passed to ArrayOf")
 	}
 
-	typ := elem.(*rtype)
+	typ := elem.common()
 
 	// Look in cache.
 	ckey := cacheKey{Array, typ, nil, uintptr(length)}
@@ -2910,11 +2635,11 @@
 	}
 
 	// Look in known types.
-	s := "[" + strconv.Itoa(length) + "]" + typ.String()
+	s := "[" + strconv.Itoa(length) + "]" + stringFor(typ)
 	for _, tt := range typesByString(s) {
 		array := (*arrayType)(unsafe.Pointer(tt))
-		if array.elem == typ {
-			ti, _ := lookupCache.LoadOrStore(ckey, tt)
+		if array.Elem == typ {
+			ti, _ := lookupCache.LoadOrStore(ckey, toRType(tt))
 			return ti.(Type)
 		}
 	}
@@ -2923,52 +2648,52 @@
 	var iarray any = [1]unsafe.Pointer{}
 	prototype := *(**arrayType)(unsafe.Pointer(&iarray))
 	array := *prototype
-	array.tflag = typ.tflag & tflagRegularMemory
-	array.str = resolveReflectName(newName(s, "", false, false))
-	array.hash = fnv1(typ.hash, '[')
+	array.TFlag = typ.TFlag & abi.TFlagRegularMemory
+	array.Str = resolveReflectName(newName(s, "", false, false))
+	array.Hash = fnv1(typ.Hash, '[')
 	for n := uint32(length); n > 0; n >>= 8 {
-		array.hash = fnv1(array.hash, byte(n))
+		array.Hash = fnv1(array.Hash, byte(n))
 	}
-	array.hash = fnv1(array.hash, ']')
-	array.elem = typ
-	array.ptrToThis = 0
-	if typ.size > 0 {
-		max := ^uintptr(0) / typ.size
+	array.Hash = fnv1(array.Hash, ']')
+	array.Elem = typ
+	array.PtrToThis = 0
+	if typ.Size_ > 0 {
+		max := ^uintptr(0) / typ.Size_
 		if uintptr(length) > max {
 			panic("reflect.ArrayOf: array size would exceed virtual address space")
 		}
 	}
-	array.size = typ.size * uintptr(length)
-	if length > 0 && typ.ptrdata != 0 {
-		array.ptrdata = typ.size*uintptr(length-1) + typ.ptrdata
+	array.Size_ = typ.Size_ * uintptr(length)
+	if length > 0 && typ.PtrBytes != 0 {
+		array.PtrBytes = typ.Size_*uintptr(length-1) + typ.PtrBytes
 	}
-	array.align = typ.align
-	array.fieldAlign = typ.fieldAlign
-	array.len = uintptr(length)
-	array.slice = SliceOf(elem).(*rtype)
+	array.Align_ = typ.Align_
+	array.FieldAlign_ = typ.FieldAlign_
+	array.Len = uintptr(length)
+	array.Slice = &(SliceOf(elem).(*rtype).t)
 
 	switch {
-	case typ.ptrdata == 0 || array.size == 0:
+	case typ.PtrBytes == 0 || array.Size_ == 0:
 		// No pointers.
-		array.gcdata = nil
-		array.ptrdata = 0
+		array.GCData = nil
+		array.PtrBytes = 0
 
 	case length == 1:
 		// In memory, 1-element array looks just like the element.
-		array.kind |= typ.kind & kindGCProg
-		array.gcdata = typ.gcdata
-		array.ptrdata = typ.ptrdata
+		array.Kind_ |= typ.Kind_ & kindGCProg
+		array.GCData = typ.GCData
+		array.PtrBytes = typ.PtrBytes
 
-	case typ.kind&kindGCProg == 0 && array.size <= maxPtrmaskBytes*8*goarch.PtrSize:
+	case typ.Kind_&kindGCProg == 0 && array.Size_ <= maxPtrmaskBytes*8*goarch.PtrSize:
 		// Element is small with pointer mask; array is still small.
 		// Create direct pointer mask by turning each 1 bit in elem
 		// into length 1 bits in larger mask.
-		n := (array.ptrdata/goarch.PtrSize + 7) / 8
+		n := (array.PtrBytes/goarch.PtrSize + 7) / 8
 		// Runtime needs pointer masks to be a multiple of uintptr in size.
 		n = (n + goarch.PtrSize - 1) &^ (goarch.PtrSize - 1)
 		mask := make([]byte, n)
-		emitGCMask(mask, 0, typ, array.len)
-		array.gcdata = &mask[0]
+		emitGCMask(mask, 0, typ, array.Len)
+		array.GCData = &mask[0]
 
 	default:
 		// Create program that emits one element
@@ -2976,8 +2701,8 @@
 		prog := []byte{0, 0, 0, 0} // will be length of prog
 		prog = appendGCProg(prog, typ)
 		// Pad from ptrdata to size.
-		elemPtrs := typ.ptrdata / goarch.PtrSize
-		elemWords := typ.size / goarch.PtrSize
+		elemPtrs := typ.PtrBytes / goarch.PtrSize
+		elemWords := typ.Size_ / goarch.PtrSize
 		if elemPtrs < elemWords {
 			// Emit literal 0 bit, then repeat as needed.
 			prog = append(prog, 0x01, 0x00)
@@ -2996,17 +2721,17 @@
 		prog = appendVarint(prog, uintptr(length)-1)
 		prog = append(prog, 0)
 		*(*uint32)(unsafe.Pointer(&prog[0])) = uint32(len(prog) - 4)
-		array.kind |= kindGCProg
-		array.gcdata = &prog[0]
-		array.ptrdata = array.size // overestimate but ok; must match program
+		array.Kind_ |= kindGCProg
+		array.GCData = &prog[0]
+		array.PtrBytes = array.Size_ // overestimate but ok; must match program
 	}
 
-	etyp := typ.common()
+	etyp := typ
 	esize := etyp.Size()
 
-	array.equal = nil
-	if eequal := etyp.equal; eequal != nil {
-		array.equal = func(p, q unsafe.Pointer) bool {
+	array.Equal = nil
+	if eequal := etyp.Equal; eequal != nil {
+		array.Equal = func(p, q unsafe.Pointer) bool {
 			for i := 0; i < length; i++ {
 				pi := arrayAt(p, i, esize, "i < length")
 				qi := arrayAt(q, i, esize, "i < length")
@@ -3022,12 +2747,12 @@
 	switch {
 	case length == 1 && !ifaceIndir(typ):
 		// array of 1 direct iface type can be direct
-		array.kind |= kindDirectIface
+		array.Kind_ |= kindDirectIface
 	default:
-		array.kind &^= kindDirectIface
+		array.Kind_ &^= kindDirectIface
 	}
 
-	ti, _ := lookupCache.LoadOrStore(ckey, &array.rtype)
+	ti, _ := lookupCache.LoadOrStore(ckey, toRType(&array.Type))
 	return ti.(Type)
 }
 
@@ -3044,20 +2769,20 @@
 // 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.
-func toType(t *rtype) Type {
+func toType(t *abi.Type) Type {
 	if t == nil {
 		return nil
 	}
-	return t
+	return toRType(t)
 }
 
 type layoutKey struct {
 	ftyp *funcType // function signature
-	rcvr *rtype    // receiver type, or nil if none
+	rcvr *abi.Type // receiver type, or nil if none
 }
 
 type layoutType struct {
-	t         *rtype
+	t         *abi.Type
 	framePool *sync.Pool
 	abid      abiDesc
 }
@@ -3071,12 +2796,12 @@
 // The returned type exists only for GC, so we only fill out GC relevant info.
 // Currently, that's just size and the GC program. We also fill in
 // the name for possible debugging use.
-func funcLayout(t *funcType, rcvr *rtype) (frametype *rtype, framePool *sync.Pool, abid abiDesc) {
-	if t.Kind() != Func {
-		panic("reflect: funcLayout of non-func type " + t.String())
+func funcLayout(t *funcType, rcvr *abi.Type) (frametype *abi.Type, framePool *sync.Pool, abid abiDesc) {
+	if t.Kind() != abi.Func {
+		panic("reflect: funcLayout of non-func type " + stringFor(&t.Type))
 	}
-	if rcvr != nil && rcvr.Kind() == Interface {
-		panic("reflect: funcLayout with interface receiver " + rcvr.String())
+	if rcvr != nil && rcvr.Kind() == abi.Interface {
+		panic("reflect: funcLayout with interface receiver " + stringFor(rcvr))
 	}
 	k := layoutKey{t, rcvr}
 	if lti, ok := layoutCache.Load(k); ok {
@@ -3088,26 +2813,26 @@
 	abid = newAbiDesc(t, rcvr)
 
 	// build dummy rtype holding gc program
-	x := &rtype{
-		align: goarch.PtrSize,
+	x := &abi.Type{
+		Align_: goarch.PtrSize,
 		// Don't add spill space here; it's only necessary in
 		// reflectcall's frame, not in the allocated frame.
 		// TODO(mknyszek): Remove this comment when register
 		// spill space in the frame is no longer required.
-		size:    align(abid.retOffset+abid.ret.stackBytes, goarch.PtrSize),
-		ptrdata: uintptr(abid.stackPtrs.n) * goarch.PtrSize,
+		Size_:    align(abid.retOffset+abid.ret.stackBytes, goarch.PtrSize),
+		PtrBytes: uintptr(abid.stackPtrs.n) * goarch.PtrSize,
 	}
 	if abid.stackPtrs.n > 0 {
-		x.gcdata = &abid.stackPtrs.data[0]
+		x.GCData = &abid.stackPtrs.data[0]
 	}
 
 	var s string
 	if rcvr != nil {
-		s = "methodargs(" + rcvr.String() + ")(" + t.String() + ")"
+		s = "methodargs(" + stringFor(rcvr) + ")(" + stringFor(&t.Type) + ")"
 	} else {
-		s = "funcargs(" + t.String() + ")"
+		s = "funcargs(" + stringFor(&t.Type) + ")"
 	}
-	x.str = resolveReflectName(newName(s, "", false, false))
+	x.Str = resolveReflectName(newName(s, "", false, false))
 
 	// cache result for future callers
 	framePool = &sync.Pool{New: func() any {
@@ -3123,8 +2848,8 @@
 }
 
 // ifaceIndir reports whether t is stored indirectly in an interface value.
-func ifaceIndir(t *rtype) bool {
-	return t.kind&kindDirectIface == 0
+func ifaceIndir(t *abi.Type) bool {
+	return t.Kind_&kindDirectIface == 0
 }
 
 // Note: this type must agree with runtime.bitvector.
@@ -3147,12 +2872,12 @@
 	bv.n++
 }
 
-func addTypeBits(bv *bitVector, offset uintptr, t *rtype) {
-	if t.ptrdata == 0 {
+func addTypeBits(bv *bitVector, offset uintptr, t *abi.Type) {
+	if t.PtrBytes == 0 {
 		return
 	}
 
-	switch Kind(t.kind & kindMask) {
+	switch Kind(t.Kind_ & kindMask) {
 	case Chan, Func, Map, Pointer, Slice, String, UnsafePointer:
 		// 1 pointer at start of representation
 		for bv.n < uint32(offset/uintptr(goarch.PtrSize)) {
@@ -3171,16 +2896,16 @@
 	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)
+		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)
+		for i := range tt.Fields {
+			f := &tt.Fields[i]
+			addTypeBits(bv, offset+f.Offset, f.Typ)
 		}
 	}
 }
diff --git a/src/reflect/value.go b/src/reflect/value.go
index 42bb5ea..616da6a 100644
--- a/src/reflect/value.go
+++ b/src/reflect/value.go
@@ -37,8 +37,9 @@
 // Using == on two Values does not compare the underlying values
 // they represent.
 type Value struct {
-	// typ holds the type of the value represented by a Value.
-	typ *rtype
+	// typ_ holds the type of the value represented by a Value.
+	// Access using the typ method to avoid escape of v.
+	typ_ *abi.Type
 
 	// Pointer-valued data or, if flagIndir is set, pointer to data.
 	// Valid when either flagIndir is set or typ.pointers() is true.
@@ -92,11 +93,20 @@
 	return 0
 }
 
+func (v Value) typ() *abi.Type {
+	// Types are either static (for compiler-created types) or
+	// heap-allocated but always reachable (for reflection-created
+	// types, held in the central map). So there is no need to
+	// escape types. noescape here help avoid unnecessary escape
+	// of v.
+	return (*abi.Type)(noescape(unsafe.Pointer(v.typ_)))
+}
+
 // pointer returns the underlying pointer represented by v.
 // v.Kind() must be Pointer, Map, Chan, Func, or UnsafePointer
 // if v.Kind() == Pointer, the base type must not be not-in-heap.
 func (v Value) pointer() unsafe.Pointer {
-	if v.typ.size != goarch.PtrSize || !v.typ.pointers() {
+	if v.typ().Size() != goarch.PtrSize || !v.typ().Pointers() {
 		panic("can't call pointer on a non-pointer Value")
 	}
 	if v.flag&flagIndir != 0 {
@@ -107,12 +117,12 @@
 
 // packEface converts v to the empty interface.
 func packEface(v Value) any {
-	t := v.typ
+	t := v.typ()
 	var i any
 	e := (*emptyInterface)(unsafe.Pointer(&i))
 	// First, fill in the data portion of the interface.
 	switch {
-	case ifaceIndir(t):
+	case t.IfaceIndir():
 		if v.flag&flagIndir == 0 {
 			panic("bad indir")
 		}
@@ -151,7 +161,7 @@
 		return Value{}
 	}
 	f := flag(t.Kind())
-	if ifaceIndir(t) {
+	if t.IfaceIndir() {
 		f |= flagIndir
 	}
 	return Value{t, e.word, f}
@@ -194,7 +204,7 @@
 
 // emptyInterface is the header for an interface{} value.
 type emptyInterface struct {
-	typ  *rtype
+	typ  *abi.Type
 	word unsafe.Pointer
 }
 
@@ -202,9 +212,9 @@
 type nonEmptyInterface struct {
 	// see ../runtime/iface.go:/Itab
 	itab *struct {
-		ityp *rtype // static interface type
-		typ  *rtype // dynamic concrete type
-		hash uint32 // copy of typ.hash
+		ityp *abi.Type // static interface type
+		typ  *abi.Type // dynamic concrete type
+		hash uint32    // copy of typ.hash
 		_    [4]byte
 		fun  [100000]unsafe.Pointer // method table
 	}
@@ -275,7 +285,7 @@
 	// Preserve flagRO instead of using v.flag.ro() so that
 	// v.Addr().Elem() is equivalent to v (#32772)
 	fl := v.flag & flagRO
-	return Value{v.typ.ptrTo(), v.ptr, fl | flag(Pointer)}
+	return Value{ptrTo(v.typ()), v.ptr, fl | flag(Pointer)}
 }
 
 // Bool returns v's underlying value.
@@ -299,7 +309,7 @@
 // an addressable array of bytes.
 func (v Value) Bytes() []byte {
 	// bytesSlow is split out to keep Bytes inlineable for unnamed []byte.
-	if v.typ == bytesType {
+	if v.typ_ == bytesType { // ok to use v.typ_ directly as comparison doesn't cause escape
 		return *(*[]byte)(v.ptr)
 	}
 	return v.bytesSlow()
@@ -308,20 +318,20 @@
 func (v Value) bytesSlow() []byte {
 	switch v.kind() {
 	case Slice:
-		if v.typ.Elem().Kind() != Uint8 {
+		if v.typ().Elem().Kind() != abi.Uint8 {
 			panic("reflect.Value.Bytes of non-byte slice")
 		}
 		// Slice is always bigger than a word; assume flagIndir.
 		return *(*[]byte)(v.ptr)
 	case Array:
-		if v.typ.Elem().Kind() != Uint8 {
+		if v.typ().Elem().Kind() != abi.Uint8 {
 			panic("reflect.Value.Bytes of non-byte array")
 		}
 		if !v.CanAddr() {
 			panic("reflect.Value.Bytes of unaddressable byte array")
 		}
 		p := (*byte)(v.ptr)
-		n := int((*arrayType)(unsafe.Pointer(v.typ)).len)
+		n := int((*arrayType)(unsafe.Pointer(v.typ())).Len)
 		return unsafe.Slice(p, n)
 	}
 	panic(&ValueError{"reflect.Value.Bytes", v.kind()})
@@ -331,7 +341,7 @@
 // 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 {
+	if v.typ().Elem().Kind() != abi.Int32 {
 		panic("reflect.Value.Bytes of non-rune slice")
 	}
 	// Slice is always bigger than a word; assume flagIndir.
@@ -389,11 +399,11 @@
 
 func (v Value) call(op string, in []Value) []Value {
 	// Get function pointer, type.
-	t := (*funcType)(unsafe.Pointer(v.typ))
+	t := (*funcType)(unsafe.Pointer(v.typ()))
 	var (
 		fn       unsafe.Pointer
 		rcvr     Value
-		rcvrtype *rtype
+		rcvrtype *abi.Type
 	)
 	if v.flag&flagMethod != 0 {
 		rcvr = v
@@ -438,15 +448,15 @@
 		}
 	}
 	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 xt, targ := in[i].Type(), t.In(i); !xt.AssignableTo(toRType(targ)) {
+			panic("reflect: " + op + " using " + xt.String() + " as type " + stringFor(targ))
 		}
 	}
 	if !isSlice && isVariadic {
 		// prepare slice for remaining values
 		m := len(in) - n
-		slice := MakeSlice(t.In(n), m, m)
-		elem := t.In(n).Elem()
+		slice := MakeSlice(toRType(t.In(n)), m, m)
+		elem := toRType(t.In(n)).Elem() // FIXME cast to slice type and Elem()
 		for i := 0; i < m; i++ {
 			x := in[n+i]
 			if xt := x.Type(); !xt.AssignableTo(elem) {
@@ -474,7 +484,7 @@
 
 	// Allocate a chunk of memory for frame if needed.
 	var stackArgs unsafe.Pointer
-	if frametype.size != 0 {
+	if frametype.Size() != 0 {
 		if nout == 0 {
 			stackArgs = framePool.Get().(unsafe.Pointer)
 		} else {
@@ -483,10 +493,10 @@
 			stackArgs = unsafe_New(frametype)
 		}
 	}
-	frameSize := frametype.size
+	frameSize := frametype.Size()
 
 	if debugReflectCall {
-		println("reflect.call", t.String())
+		println("reflect.call", stringFor(&t.Type))
 		abid.dump()
 	}
 
@@ -517,11 +527,11 @@
 	// Handle arguments.
 	for i, v := range in {
 		v.mustBeExported()
-		targ := t.In(i).(*rtype)
+		targ := toRType(t.In(i))
 		// TODO(mknyszek): Figure out if it's possible to get some
 		// scratch space for this assignment check. Previously, it
 		// was possible to use space in the argument frame.
-		v = v.assignTo("reflect.Value.Call", targ, nil)
+		v = v.assignTo("reflect.Value.Call", &targ.t, nil)
 	stepsLoop:
 		for _, st := range abid.call.stepsForValue(i + inStart) {
 			switch st.kind {
@@ -529,7 +539,7 @@
 				// Copy values to the "stack."
 				addr := add(stackArgs, st.stkOff, "precomputed stack arg offset")
 				if v.flag&flagIndir != 0 {
-					typedmemmove(targ, addr, v.ptr)
+					typedmemmove(&targ.t, addr, v.ptr)
 				} else {
 					*(*unsafe.Pointer)(addr) = v.ptr
 				}
@@ -583,7 +593,7 @@
 	}
 
 	// Call.
-	call(frametype, fn, stackArgs, uint32(frametype.size), uint32(abid.retOffset), uint32(frameSize), &regArgs)
+	call(frametype, fn, stackArgs, uint32(frametype.Size()), uint32(abid.retOffset), uint32(frameSize), &regArgs)
 
 	// For testing; see TestCallMethodJump.
 	if callGC {
@@ -611,7 +621,7 @@
 			if tv.Size() == 0 {
 				// For zero-sized return value, args+off may point to the next object.
 				// In this case, return the zero value instead.
-				ret[i] = Zero(tv)
+				ret[i] = Zero(toRType(tv))
 				continue
 			}
 			steps := abid.ret.stepsForValue(i)
@@ -620,7 +630,7 @@
 				// allocated, the entire value is according to the ABI. So
 				// just make an indirection into the allocated frame.
 				fl := flagIndir | flag(tv.Kind())
-				ret[i] = Value{tv.common(), add(stackArgs, st.stkOff, "tv.Size() != 0"), fl}
+				ret[i] = Value{tv, add(stackArgs, st.stkOff, "tv.Size() != 0"), fl}
 				// Note: this does introduce false sharing between results -
 				// if any result is live, they are all live.
 				// (And the space for the args is live as well, but as we've
@@ -629,14 +639,14 @@
 			}
 
 			// Handle pointers passed in registers.
-			if !ifaceIndir(tv.common()) {
+			if !ifaceIndir(tv) {
 				// Pointer-valued data gets put directly
 				// into v.ptr.
 				if steps[0].kind != abiStepPointer {
-					print("kind=", steps[0].kind, ", type=", tv.String(), "\n")
+					print("kind=", steps[0].kind, ", type=", stringFor(tv), "\n")
 					panic("mismatch between ABI description and types")
 				}
-				ret[i] = Value{tv.common(), regArgs.Ptrs[steps[0].ireg], flag(tv.Kind())}
+				ret[i] = Value{tv, regArgs.Ptrs[steps[0].ireg], flag(tv.Kind())}
 				continue
 			}
 
@@ -649,7 +659,7 @@
 			// additional space to the allocated stack frame and storing the
 			// register-allocated return values into the allocated stack frame and
 			// referring there in the resulting Value.
-			s := unsafe_New(tv.common())
+			s := unsafe_New(tv)
 			for _, st := range steps {
 				switch st.kind {
 				case abiStepIntReg:
@@ -667,7 +677,7 @@
 					panic("unknown ABI part kind")
 				}
 			}
-			ret[i] = Value{tv.common(), s, flagIndir | flag(tv.Kind())}
+			ret[i] = Value{tv, s, flagIndir | flag(tv.Kind())}
 		}
 	}
 
@@ -710,10 +720,10 @@
 
 	// Copy arguments into Values.
 	ptr := frame
-	in := make([]Value, 0, int(ftyp.inCount))
-	for i, typ := range ftyp.in() {
+	in := make([]Value, 0, int(ftyp.InCount))
+	for i, typ := range ftyp.InSlice() {
 		if typ.Size() == 0 {
-			in = append(in, Zero(typ))
+			in = append(in, Zero(toRType(typ)))
 			continue
 		}
 		v := Value{typ, nil, flag(typ.Kind())}
@@ -725,7 +735,7 @@
 				// and we cannot let f keep a reference to the stack frame
 				// after this function returns, not even a read-only reference.
 				v.ptr = unsafe_New(typ)
-				if typ.size > 0 {
+				if typ.Size() > 0 {
 					typedmemmove(typ, v.ptr, add(ptr, st.stkOff, "typ.size > 0"))
 				}
 				v.flag |= flagIndir
@@ -759,7 +769,7 @@
 				// Pointer-valued data gets put directly
 				// into v.ptr.
 				if steps[0].kind != abiStepPointer {
-					print("kind=", steps[0].kind, ", type=", typ.String(), "\n")
+					print("kind=", steps[0].kind, ", type=", stringFor(typ), "\n")
 					panic("mismatch between ABI description and types")
 				}
 				v.ptr = regs.Ptrs[steps[0].ireg]
@@ -777,9 +787,9 @@
 
 	// Copy results back into argument frame and register space.
 	if numOut > 0 {
-		for i, typ := range ftyp.out() {
+		for i, typ := range ftyp.OutSlice() {
 			v := out[i]
-			if v.typ == nil {
+			if v.typ() == nil {
 				panic("reflect: function created by MakeFunc using " + funcName(f) +
 					" returned zero Value")
 			}
@@ -787,7 +797,7 @@
 				panic("reflect: function created by MakeFunc using " + funcName(f) +
 					" returned value obtained from unexported field")
 			}
-			if typ.size == 0 {
+			if typ.Size() == 0 {
 				continue
 			}
 
@@ -874,15 +884,15 @@
 // 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 *rtype, t *funcType, fn unsafe.Pointer) {
+func methodReceiver(op string, v Value, methodIndex int) (rcvrtype *abi.Type, t *funcType, fn unsafe.Pointer) {
 	i := methodIndex
-	if v.typ.Kind() == Interface {
-		tt := (*interfaceType)(unsafe.Pointer(v.typ))
-		if uint(i) >= uint(len(tt.methods)) {
+	if v.typ().Kind() == abi.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 !tt.nameOff(m.name).isExported() {
+		m := &tt.Methods[i]
+		if !tt.nameOff(m.Name).IsExported() {
 			panic("reflect: " + op + " of unexported method")
 		}
 		iface := (*nonEmptyInterface)(v.ptr)
@@ -891,20 +901,20 @@
 		}
 		rcvrtype = iface.itab.typ
 		fn = unsafe.Pointer(&iface.itab.fun[i])
-		t = (*funcType)(unsafe.Pointer(tt.typeOff(m.typ)))
+		t = (*funcType)(unsafe.Pointer(tt.typeOff(m.Typ)))
 	} else {
-		rcvrtype = v.typ
-		ms := v.typ.exportedMethods()
+		rcvrtype = v.typ()
+		ms := v.typ().ExportedMethods()
 		if uint(i) >= uint(len(ms)) {
 			panic("reflect: internal error: invalid method index")
 		}
 		m := ms[i]
-		if !v.typ.nameOff(m.name).isExported() {
+		if !nameOffFor(v.typ(), m.Name).IsExported() {
 			panic("reflect: " + op + " of unexported method")
 		}
-		ifn := v.typ.textOff(m.ifn)
+		ifn := textOffFor(v.typ(), m.Ifn)
 		fn = unsafe.Pointer(&ifn)
-		t = (*funcType)(unsafe.Pointer(v.typ.typeOff(m.mtyp)))
+		t = (*funcType)(unsafe.Pointer(typeOffFor(v.typ(), m.Mtyp)))
 	}
 	return
 }
@@ -914,8 +924,8 @@
 // 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 {
+	t := v.typ()
+	if t.Kind() == abi.Interface {
 		// the interface data word becomes the receiver word
 		iface := (*nonEmptyInterface)(v.ptr)
 		*(*unsafe.Pointer)(p) = iface.word
@@ -991,7 +1001,7 @@
 	}
 
 	// Translate the rest of the arguments.
-	for i, t := range valueFuncType.in() {
+	for i, t := range valueFuncType.InSlice() {
 		valueSteps := valueABI.call.stepsForValue(i)
 		methodSteps := methodABI.call.stepsForValue(i + 1)
 
@@ -1088,7 +1098,7 @@
 		}
 	}
 
-	methodFrameSize := methodFrameType.size
+	methodFrameSize := methodFrameType.Size()
 	// TODO(mknyszek): Remove this when we no longer have
 	// caller reserved spill space.
 	methodFrameSize = align(methodFrameSize, goarch.PtrSize)
@@ -1100,7 +1110,7 @@
 	// Call.
 	// Call copies the arguments from scratch to the stack, calls fn,
 	// and then copies the results back into scratch.
-	call(methodFrameType, methodFn, methodFrame, uint32(methodFrameType.size), uint32(methodABI.retOffset), uint32(methodFrameSize), &methodRegs)
+	call(methodFrameType, methodFn, methodFrame, uint32(methodFrameType.Size()), uint32(methodABI.retOffset), uint32(methodFrameSize), &methodRegs)
 
 	// Copy return values.
 	//
@@ -1114,7 +1124,7 @@
 	if valueRegs != nil {
 		*valueRegs = methodRegs
 	}
-	if retSize := methodFrameType.size - methodABI.retOffset; retSize > 0 {
+	if retSize := methodFrameType.Size() - methodABI.retOffset; retSize > 0 {
 		valueRet := add(valueFrame, valueABI.retOffset, "valueFrame's size > retOffset")
 		methodRet := add(methodFrame, methodABI.retOffset, "methodFrame's size > retOffset")
 		// This copies to the stack. Write barriers are not needed.
@@ -1164,12 +1174,12 @@
 	k := v.kind()
 	switch k {
 	case Array:
-		return v.typ.Len()
+		return v.typ().Len()
 	case Chan:
 		return chancap(v.pointer())
 	case Ptr:
-		if v.typ.Elem().Kind() == Array {
-			return v.typ.Elem().Len()
+		if v.typ().Elem().Kind() == abi.Array {
+			return v.typ().Elem().Len()
 		}
 		panic("reflect: call of reflect.Value.Cap on ptr to non-array Value")
 	}
@@ -1216,7 +1226,7 @@
 	switch k {
 	case Interface:
 		var eface any
-		if v.typ.NumMethod() == 0 {
+		if v.typ().NumMethod() == 0 {
 			eface = *(*any)(v.ptr)
 		} else {
 			eface = (any)(*(*interface {
@@ -1231,7 +1241,7 @@
 	case Pointer:
 		ptr := v.ptr
 		if v.flag&flagIndir != 0 {
-			if ifaceIndir(v.typ) {
+			if ifaceIndir(v.typ()) {
 				// This is a pointer to a not-in-heap object. ptr points to a uintptr
 				// in the heap. That uintptr is the address of a not-in-heap object.
 				// In general, pointers to not-in-heap objects can be total junk.
@@ -1252,8 +1262,8 @@
 		if ptr == nil {
 			return Value{}
 		}
-		tt := (*ptrType)(unsafe.Pointer(v.typ))
-		typ := tt.elem
+		tt := (*ptrType)(unsafe.Pointer(v.typ()))
+		typ := tt.Elem
 		fl := v.flag&flagRO | flagIndir | flagAddr
 		fl |= flag(typ.Kind())
 		return Value{typ, ptr, fl}
@@ -1267,18 +1277,18 @@
 	if v.kind() != Struct {
 		panic(&ValueError{"reflect.Value.Field", v.kind()})
 	}
-	tt := (*structType)(unsafe.Pointer(v.typ))
-	if uint(i) >= uint(len(tt.fields)) {
+	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
+	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.name.isExported() {
-		if field.embedded() {
+	if !field.Name.IsExported() {
+		if field.Embedded() {
 			fl |= flagEmbedRO
 		} else {
 			fl |= flagStickyRO
@@ -1289,7 +1299,7 @@
 	// 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 the correct address.
-	ptr := add(v.ptr, field.offset, "same as non-reflect &v.field")
+	ptr := add(v.ptr, field.Offset, "same as non-reflect &v.field")
 	return Value{typ, ptr, fl}
 }
 
@@ -1303,7 +1313,7 @@
 	v.mustBe(Struct)
 	for i, x := range index {
 		if i > 0 {
-			if v.Kind() == Pointer && v.typ.Elem().Kind() == Struct {
+			if v.Kind() == Pointer && v.typ().Elem().Kind() == abi.Struct {
 				if v.IsNil() {
 					panic("reflect: indirection through nil pointer to embedded struct")
 				}
@@ -1326,9 +1336,9 @@
 	v.mustBe(Struct)
 	for i, x := range index {
 		if i > 0 {
-			if v.Kind() == Ptr && v.typ.Elem().Kind() == Struct {
+			if v.Kind() == Ptr && v.typ().Elem().Kind() == abi.Struct {
 				if v.IsNil() {
-					return Value{}, errors.New("reflect: indirection through nil pointer to embedded struct field " + v.typ.Elem().Name())
+					return Value{}, errors.New("reflect: indirection through nil pointer to embedded struct field " + nameFor(v.typ().Elem()))
 				}
 				v = v.Elem()
 			}
@@ -1343,7 +1353,7 @@
 // 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 {
+	if f, ok := toRType(v.typ()).FieldByName(name); ok {
 		return v.FieldByIndex(f.Index)
 	}
 	return Value{}
@@ -1354,7 +1364,7 @@
 // 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 {
+	if f, ok := toRType(v.typ()).FieldByNameFunc(match); ok {
 		return v.FieldByIndex(f.Index)
 	}
 	return Value{}
@@ -1390,12 +1400,12 @@
 func (v Value) Index(i int) Value {
 	switch v.kind() {
 	case Array:
-		tt := (*arrayType)(unsafe.Pointer(v.typ))
-		if uint(i) >= uint(tt.len) {
+		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
+		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.
@@ -1413,9 +1423,9 @@
 		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, "i < s.Len")
+		tt := (*sliceType)(unsafe.Pointer(v.typ()))
+		typ := tt.Elem
+		val := arrayAt(s.Data, i, typ.Size(), "i < s.Len")
 		fl := flagAddr | flagIndir | v.flag.ro() | flag(typ.Kind())
 		return Value{typ, val, fl}
 
@@ -1521,6 +1531,8 @@
 // compatible with InterfaceData.
 func (v Value) InterfaceData() [2]uintptr {
 	v.mustBe(Interface)
+	// The compiler loses track as it converts to uintptr. Force escape.
+	escapes(v.ptr)
 	// 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
@@ -1582,11 +1594,14 @@
 		return math.Float64bits(real(c)) == 0 && math.Float64bits(imag(c)) == 0
 	case Array:
 		// If the type is comparable, then compare directly with zero.
-		if v.typ.equal != nil && v.typ.size <= maxZero {
+		if v.typ().Equal != nil && v.typ().Size() <= maxZero {
 			if v.flag&flagIndir == 0 {
 				return v.ptr == nil
 			}
-			return v.typ.equal(v.ptr, unsafe.Pointer(&zeroVal[0]))
+			// v.ptr doesn't escape, as Equal functions are compiler generated
+			// and never escape. The escape analysis doesn't know, as it is a
+			// function pointer call.
+			return v.typ().Equal(noescape(v.ptr), unsafe.Pointer(&zeroVal[0]))
 		}
 
 		n := v.Len()
@@ -1602,11 +1617,12 @@
 		return v.Len() == 0
 	case Struct:
 		// If the type is comparable, then compare directly with zero.
-		if v.typ.equal != nil && v.typ.size <= maxZero {
+		if v.typ().Equal != nil && v.typ().Size() <= maxZero {
 			if v.flag&flagIndir == 0 {
 				return v.ptr == nil
 			}
-			return v.typ.equal(v.ptr, unsafe.Pointer(&zeroVal[0]))
+			// See noescape justification above.
+			return v.typ().Equal(noescape(v.ptr), unsafe.Pointer(&zeroVal[0]))
 		}
 
 		n := v.NumField()
@@ -1669,7 +1685,7 @@
 	case Chan, Func, Map, Pointer, UnsafePointer:
 		*(*unsafe.Pointer)(v.ptr) = nil
 	case Array, Struct:
-		typedmemclr(v.typ, v.ptr)
+		typedmemclr(v.typ(), v.ptr)
 	default:
 		// This should never happen, but will act as a safeguard for later,
 		// as a default value doesn't makes sense here.
@@ -1696,8 +1712,8 @@
 func (v Value) lenNonSlice() int {
 	switch k := v.kind(); k {
 	case Array:
-		tt := (*arrayType)(unsafe.Pointer(v.typ))
-		return int(tt.len)
+		tt := (*arrayType)(unsafe.Pointer(v.typ()))
+		return int(tt.Len)
 	case Chan:
 		return chanlen(v.pointer())
 	case Map:
@@ -1706,8 +1722,8 @@
 		// String is bigger than a word; assume flagIndir.
 		return (*unsafeheader.String)(v.ptr).Len
 	case Ptr:
-		if v.typ.Elem().Kind() == Array {
-			return v.typ.Elem().Len()
+		if v.typ().Elem().Kind() == abi.Array {
+			return v.typ().Elem().Len()
 		}
 		panic("reflect: call of reflect.Value.Len on ptr to non-array Value")
 	}
@@ -1722,7 +1738,7 @@
 // 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))
+	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
@@ -1733,23 +1749,23 @@
 	// of unexported fields.
 
 	var e unsafe.Pointer
-	if (tt.key == stringType || key.kind() == String) && tt.key == key.typ && tt.elem.size <= maxValSize {
+	if (tt.Key == stringType || key.kind() == String) && tt.Key == key.typ() && tt.Elem.Size() <= maxValSize {
 		k := *(*string)(key.ptr)
-		e = mapaccess_faststr(v.typ, v.pointer(), k)
+		e = mapaccess_faststr(v.typ(), v.pointer(), k)
 	} else {
-		key = key.assignTo("reflect.Value.MapIndex", tt.key, nil)
+		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)
+		e = mapaccess(v.typ(), v.pointer(), k)
 	}
 	if e == nil {
 		return Value{}
 	}
-	typ := tt.elem
+	typ := tt.Elem
 	fl := (v.flag | key.flag).ro()
 	fl |= flag(typ.Kind())
 	return copyVal(typ, fl, e)
@@ -1761,8 +1777,8 @@
 // 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
+	tt := (*mapType)(unsafe.Pointer(v.typ()))
+	keyType := tt.Key
 
 	fl := v.flag.ro() | flag(keyType.Kind())
 
@@ -1772,7 +1788,7 @@
 		mlen = maplen(m)
 	}
 	var it hiter
-	mapiterinit(v.typ, m, &it)
+	mapiterinit(v.typ(), m, &it)
 	a := make([]Value, mlen)
 	var i int
 	for i = 0; i < len(a); i++ {
@@ -1832,8 +1848,8 @@
 		panic("MapIter.Key called on exhausted iterator")
 	}
 
-	t := (*mapType)(unsafe.Pointer(iter.m.typ))
-	ktype := t.key
+	t := (*mapType)(unsafe.Pointer(iter.m.typ()))
+	ktype := t.Key
 	return copyVal(ktype, iter.m.flag.ro()|flag(ktype.Kind()), iterkey)
 }
 
@@ -1856,13 +1872,13 @@
 		target = v.ptr
 	}
 
-	t := (*mapType)(unsafe.Pointer(iter.m.typ))
-	ktype := t.key
+	t := (*mapType)(unsafe.Pointer(iter.m.typ()))
+	ktype := t.Key
 
 	iter.m.mustBeExported() // do not let unexported m leak
 	key := Value{ktype, iterkey, iter.m.flag | flag(ktype.Kind()) | flagIndir}
-	key = key.assignTo("reflect.MapIter.SetKey", v.typ, target)
-	typedmemmove(v.typ, v.ptr, key.ptr)
+	key = key.assignTo("reflect.MapIter.SetKey", v.typ(), target)
+	typedmemmove(v.typ(), v.ptr, key.ptr)
 }
 
 // Value returns the value of iter's current map entry.
@@ -1875,8 +1891,8 @@
 		panic("MapIter.Value called on exhausted iterator")
 	}
 
-	t := (*mapType)(unsafe.Pointer(iter.m.typ))
-	vtype := t.elem
+	t := (*mapType)(unsafe.Pointer(iter.m.typ()))
+	vtype := t.Elem
 	return copyVal(vtype, iter.m.flag.ro()|flag(vtype.Kind()), iterelem)
 }
 
@@ -1899,13 +1915,13 @@
 		target = v.ptr
 	}
 
-	t := (*mapType)(unsafe.Pointer(iter.m.typ))
-	vtype := t.elem
+	t := (*mapType)(unsafe.Pointer(iter.m.typ()))
+	vtype := t.Elem
 
 	iter.m.mustBeExported() // do not let unexported m leak
 	elem := Value{vtype, iterelem, iter.m.flag | flag(vtype.Kind()) | flagIndir}
-	elem = elem.assignTo("reflect.MapIter.SetValue", v.typ, target)
-	typedmemmove(v.typ, v.ptr, elem.ptr)
+	elem = elem.assignTo("reflect.MapIter.SetValue", v.typ(), target)
+	typedmemmove(v.typ(), v.ptr, elem.ptr)
 }
 
 // Next advances the map iterator and reports whether there is another
@@ -1916,7 +1932,7 @@
 		panic("MapIter.Next called on an iterator that does not have an associated map Value")
 	}
 	if !iter.hiter.initialized() {
-		mapiterinit(iter.m.typ, iter.m.pointer(), &iter.hiter)
+		mapiterinit(iter.m.typ(), iter.m.pointer(), &iter.hiter)
 	} else {
 		if mapiterkey(&iter.hiter) == nil {
 			panic("MapIter.Next called on exhausted iterator")
@@ -1964,14 +1980,19 @@
 	return &MapIter{m: v}
 }
 
+// Force slow panicking path not inlined, so it won't add to the
+// inlining budget of the caller.
+// TODO: undo when the inliner is no longer bottom-up only.
+//
+//go:noinline
 func (f flag) panicNotMap() {
 	f.mustBe(Map)
 }
 
 // copyVal returns a Value containing the map key or value at ptr,
 // allocating a new variable as needed.
-func copyVal(typ *rtype, fl flag, ptr unsafe.Pointer) Value {
-	if ifaceIndir(typ) {
+func copyVal(typ *abi.Type, fl flag, ptr unsafe.Pointer) Value {
+	if typ.IfaceIndir() {
 		// Copy result so future changes to the map
 		// won't change the underlying value.
 		c := unsafe_New(typ)
@@ -1986,19 +2007,19 @@
 // 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 {
+	if v.typ() == nil {
 		panic(&ValueError{"reflect.Value.Method", Invalid})
 	}
-	if v.flag&flagMethod != 0 || uint(i) >= uint(v.typ.NumMethod()) {
+	if v.flag&flagMethod != 0 || uint(i) >= uint(toRType(v.typ()).NumMethod()) {
 		panic("reflect: Method index out of range")
 	}
-	if v.typ.Kind() == Interface && v.IsNil() {
+	if v.typ().Kind() == abi.Interface && v.IsNil() {
 		panic("reflect: Method on nil interface value")
 	}
 	fl := v.flag.ro() | (v.flag & flagIndir)
 	fl |= flag(Func)
 	fl |= flag(i)<<flagMethodShift | flagMethod
-	return Value{v.typ, v.ptr, fl}
+	return Value{v.typ(), v.ptr, fl}
 }
 
 // NumMethod returns the number of methods in the value's method set.
@@ -2007,13 +2028,13 @@
 //
 // For an interface type, it returns the number of exported and unexported methods.
 func (v Value) NumMethod() int {
-	if v.typ == nil {
+	if v.typ() == nil {
 		panic(&ValueError{"reflect.Value.NumMethod", Invalid})
 	}
 	if v.flag&flagMethod != 0 {
 		return 0
 	}
-	return v.typ.NumMethod()
+	return toRType(v.typ()).NumMethod()
 }
 
 // MethodByName returns a function value corresponding to the method
@@ -2022,13 +2043,13 @@
 // 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 {
+	if v.typ() == nil {
 		panic(&ValueError{"reflect.Value.MethodByName", Invalid})
 	}
 	if v.flag&flagMethod != 0 {
 		return Value{}
 	}
-	m, ok := v.typ.MethodByName(name)
+	m, ok := toRType(v.typ()).MethodByName(name)
 	if !ok {
 		return Value{}
 	}
@@ -2039,8 +2060,8 @@
 // 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)
+	tt := (*structType)(unsafe.Pointer(v.typ()))
+	return len(tt.Fields)
 }
 
 // OverflowComplex reports whether the complex128 x cannot be represented by v's type.
@@ -2082,7 +2103,7 @@
 	k := v.kind()
 	switch k {
 	case Int, Int8, Int16, Int32, Int64:
-		bitSize := v.typ.size * 8
+		bitSize := v.typ().Size() * 8
 		trunc := (x << (64 - bitSize)) >> (64 - bitSize)
 		return x != trunc
 	}
@@ -2095,7 +2116,7 @@
 	k := v.kind()
 	switch k {
 	case Uint, Uintptr, Uint8, Uint16, Uint32, Uint64:
-		bitSize := v.typ.size * 8
+		bitSize := v.typ_.Size() * 8 // ok to use v.typ_ directly as Size doesn't escape
 		trunc := (x << (64 - bitSize)) >> (64 - bitSize)
 		return x != trunc
 	}
@@ -2121,10 +2142,13 @@
 //
 // It's preferred to use uintptr(Value.UnsafePointer()) to get the equivalent result.
 func (v Value) Pointer() uintptr {
+	// The compiler loses track as it converts to uintptr. Force escape.
+	escapes(v.ptr)
+
 	k := v.kind()
 	switch k {
 	case Pointer:
-		if v.typ.ptrdata == 0 {
+		if v.typ().PtrBytes == 0 {
 			val := *(*uintptr)(v.ptr)
 			// Since it is a not-in-heap pointer, all pointers to the heap are
 			// forbidden! See comment in Value.Elem and issue #48399.
@@ -2174,11 +2198,11 @@
 // 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 {
+	tt := (*chanType)(unsafe.Pointer(v.typ()))
+	if ChanDir(tt.Dir)&RecvDir == 0 {
 		panic("reflect: recv on send-only channel")
 	}
-	t := tt.elem
+	t := tt.Elem
 	val = Value{t, nil, flag(t.Kind())}
 	var p unsafe.Pointer
 	if ifaceIndir(t) {
@@ -2207,12 +2231,12 @@
 // 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 {
+	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)
+	x = x.assignTo("reflect.Value.Send", tt.Elem, nil)
 	var p unsafe.Pointer
 	if x.flag&flagIndir != 0 {
 		p = x.ptr
@@ -2233,12 +2257,12 @@
 	if v.kind() == Interface {
 		target = v.ptr
 	}
-	x = x.assignTo("reflect.Set", v.typ, target)
+	x = x.assignTo("reflect.Set", v.typ(), target)
 	if x.flag&flagIndir != 0 {
 		if x.ptr == unsafe.Pointer(&zeroVal[0]) {
-			typedmemclr(v.typ, v.ptr)
+			typedmemclr(v.typ(), v.ptr)
 		} else {
-			typedmemmove(v.typ, v.ptr, x.ptr)
+			typedmemmove(v.typ(), v.ptr, x.ptr)
 		}
 	} else {
 		*(*unsafe.Pointer)(v.ptr) = x.ptr
@@ -2258,7 +2282,7 @@
 func (v Value) SetBytes(x []byte) {
 	v.mustBeAssignable()
 	v.mustBe(Slice)
-	if v.typ.Elem().Kind() != Uint8 {
+	if toRType(v.typ()).Elem().Kind() != Uint8 { // TODO add Elem method, fix mustBe(Slice) to return slice.
 		panic("reflect.Value.SetBytes of non-byte slice")
 	}
 	*(*[]byte)(v.ptr) = x
@@ -2269,7 +2293,7 @@
 func (v Value) setRunes(x []rune) {
 	v.mustBeAssignable()
 	v.mustBe(Slice)
-	if v.typ.Elem().Kind() != Int32 {
+	if v.typ().Elem().Kind() != abi.Int32 {
 		panic("reflect.Value.setRunes of non-rune slice")
 	}
 	*(*[]rune)(v.ptr) = x
@@ -2359,46 +2383,46 @@
 	v.mustBe(Map)
 	v.mustBeExported()
 	key.mustBeExported()
-	tt := (*mapType)(unsafe.Pointer(v.typ))
+	tt := (*mapType)(unsafe.Pointer(v.typ()))
 
-	if (tt.key == stringType || key.kind() == String) && tt.key == key.typ && tt.elem.size <= maxValSize {
+	if (tt.Key == stringType || key.kind() == String) && tt.Key == key.typ() && tt.Elem.Size() <= maxValSize {
 		k := *(*string)(key.ptr)
-		if elem.typ == nil {
-			mapdelete_faststr(v.typ, v.pointer(), k)
+		if elem.typ() == nil {
+			mapdelete_faststr(v.typ(), v.pointer(), k)
 			return
 		}
 		elem.mustBeExported()
-		elem = elem.assignTo("reflect.Value.SetMapIndex", tt.elem, nil)
+		elem = elem.assignTo("reflect.Value.SetMapIndex", tt.Elem, nil)
 		var e unsafe.Pointer
 		if elem.flag&flagIndir != 0 {
 			e = elem.ptr
 		} else {
 			e = unsafe.Pointer(&elem.ptr)
 		}
-		mapassign_faststr(v.typ, v.pointer(), k, e)
+		mapassign_faststr(v.typ(), v.pointer(), k, e)
 		return
 	}
 
-	key = key.assignTo("reflect.Value.SetMapIndex", tt.key, nil)
+	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 elem.typ == nil {
-		mapdelete(v.typ, v.pointer(), k)
+	if elem.typ() == nil {
+		mapdelete(v.typ(), v.pointer(), k)
 		return
 	}
 	elem.mustBeExported()
-	elem = elem.assignTo("reflect.Value.SetMapIndex", tt.elem, nil)
+	elem = elem.assignTo("reflect.Value.SetMapIndex", tt.Elem, nil)
 	var e unsafe.Pointer
 	if elem.flag&flagIndir != 0 {
 		e = elem.ptr
 	} else {
 		e = unsafe.Pointer(&elem.ptr)
 	}
-	mapassign(v.typ, v.pointer(), k, e)
+	mapassign(v.typ(), v.pointer(), k, e)
 }
 
 // SetUint sets v's underlying value to x.
@@ -2456,13 +2480,13 @@
 		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))
+		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))
+		typ = (*sliceType)(unsafe.Pointer(v.typ()))
 		s := (*unsafeheader.Slice)(v.ptr)
 		base = s.Data
 		cap = s.Cap
@@ -2476,7 +2500,7 @@
 		if i < s.Len {
 			t = unsafeheader.String{Data: arrayAt(s.Data, i, 1, "i < s.Len"), Len: j - i}
 		}
-		return Value{v.typ, unsafe.Pointer(&t), v.flag}
+		return Value{v.typ(), unsafe.Pointer(&t), v.flag}
 	}
 
 	if i < 0 || j < i || j > cap {
@@ -2491,14 +2515,14 @@
 	s.Len = j - i
 	s.Cap = cap - i
 	if cap-i > 0 {
-		s.Data = arrayAt(base, i, typ.elem.Size(), "i < cap")
+		s.Data = arrayAt(base, i, typ.Elem.Size(), "i < cap")
 	} else {
 		// do not advance pointer, to avoid pointing beyond end of slice
 		s.Data = base
 	}
 
 	fl := v.flag.ro() | flagIndir | flag(Slice)
-	return Value{typ.common(), unsafe.Pointer(&x), fl}
+	return Value{typ.Common(), unsafe.Pointer(&x), fl}
 }
 
 // Slice3 is the 3-index form of the slice operation: it returns v[i:j:k].
@@ -2518,13 +2542,13 @@
 		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))
+		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))
+		typ = (*sliceType)(unsafe.Pointer(v.typ()))
 		s := (*unsafeheader.Slice)(v.ptr)
 		base = s.Data
 		cap = s.Cap
@@ -2543,14 +2567,14 @@
 	s.Len = j - i
 	s.Cap = k - i
 	if k-i > 0 {
-		s.Data = arrayAt(base, i, typ.elem.Size(), "i < k <= cap")
+		s.Data = arrayAt(base, i, typ.Elem.Size(), "i < k <= cap")
 	} else {
 		// do not advance pointer, to avoid pointing beyond end of slice
 		s.Data = base
 	}
 
 	fl := v.flag.ro() | flagIndir | flag(Slice)
-	return Value{typ.common(), unsafe.Pointer(&x), fl}
+	return Value{typ.Common(), unsafe.Pointer(&x), fl}
 }
 
 // String returns the string v's underlying value, as a string.
@@ -2600,7 +2624,7 @@
 // Type returns v's type.
 func (v Value) Type() Type {
 	if v.flag != 0 && v.flag&flagMethod == 0 {
-		return v.typ
+		return (*rtype)(noescape(unsafe.Pointer(v.typ_))) // inline of toRType(v.typ()), for own inlining in inline test
 	}
 	return v.typeSlow()
 }
@@ -2609,29 +2633,31 @@
 	if v.flag == 0 {
 		panic(&ValueError{"reflect.Value.Type", Invalid})
 	}
+
+	typ := v.typ()
 	if v.flag&flagMethod == 0 {
-		return v.typ
+		return toRType(v.typ())
 	}
 
 	// Method value.
 	// v.typ describes the receiver, not the method type.
 	i := int(v.flag) >> flagMethodShift
-	if v.typ.Kind() == Interface {
+	if v.typ().Kind() == abi.Interface {
 		// Method on interface.
-		tt := (*interfaceType)(unsafe.Pointer(v.typ))
-		if uint(i) >= uint(len(tt.methods)) {
+		tt := (*interfaceType)(unsafe.Pointer(typ))
+		if uint(i) >= uint(len(tt.Methods)) {
 			panic("reflect: internal error: invalid method index")
 		}
-		m := &tt.methods[i]
-		return v.typ.typeOff(m.typ)
+		m := &tt.Methods[i]
+		return toRType(typeOffFor(typ, m.Typ))
 	}
 	// Method on concrete type.
-	ms := v.typ.exportedMethods()
+	ms := typ.ExportedMethods()
 	if uint(i) >= uint(len(ms)) {
 		panic("reflect: internal error: invalid method index")
 	}
 	m := ms[i]
-	return v.typ.typeOff(m.mtyp)
+	return toRType(typeOffFor(typ, m.Mtyp))
 }
 
 // CanUint reports whether Uint can be used without panicking.
@@ -2676,12 +2702,14 @@
 //
 // It's preferred to use uintptr(Value.Addr().UnsafePointer()) to get the equivalent result.
 func (v Value) UnsafeAddr() uintptr {
-	if v.typ == nil {
+	if v.typ() == nil {
 		panic(&ValueError{"reflect.Value.UnsafeAddr", Invalid})
 	}
 	if v.flag&flagAddr == 0 {
 		panic("reflect.Value.UnsafeAddr of unaddressable value")
 	}
+	// The compiler loses track as it converts to uintptr. Force escape.
+	escapes(v.ptr)
 	return uintptr(v.ptr)
 }
 
@@ -2700,7 +2728,7 @@
 	k := v.kind()
 	switch k {
 	case Pointer:
-		if v.typ.ptrdata == 0 {
+		if v.typ().PtrBytes == 0 {
 			// Since it is a not-in-heap pointer, all pointers to the heap are
 			// forbidden! See comment in Value.Elem and issue #48399.
 			if !verifyNotInHeapPtr(*(*uintptr)(v.ptr)) {
@@ -2743,7 +2771,7 @@
 // it references will not be garbage collected, so programs must keep
 // a separate, correctly typed pointer to the underlying data.
 //
-// In new code, use unsafe.String or unsafe.StringData instead.
+// Deprecated: Use unsafe.String or unsafe.StringData instead.
 type StringHeader struct {
 	Data uintptr
 	Len  int
@@ -2756,7 +2784,7 @@
 // it references will not be garbage collected, so programs must keep
 // a separate, correctly typed pointer to the underlying data.
 //
-// In new code, use unsafe.Slice or unsafe.SliceData instead.
+// Deprecated: Use unsafe.Slice or unsafe.SliceData instead.
 type SliceHeader struct {
 	Data uintptr
 	Len  int
@@ -2801,7 +2829,7 @@
 	case p.Len+n < 0:
 		panic("reflect.Value.Grow: slice overflow")
 	case p.Len+n > p.Cap:
-		t := v.typ.Elem().(*rtype)
+		t := v.typ().Elem()
 		*p = growslice(t, *p, n)
 	}
 }
@@ -2827,6 +2855,22 @@
 	return v
 }
 
+// Clear clears the contents of a map or zeros the contents of a slice.
+//
+// It panics if v's Kind is not Map or Slice.
+func (v Value) Clear() {
+	switch v.Kind() {
+	case Slice:
+		sh := *(*unsafeheader.Slice)(v.ptr)
+		st := (*sliceType)(unsafe.Pointer(v.typ()))
+		typedarrayclear(st.Elem, sh.Data, sh.Len)
+	case Map:
+		mapclear(v.typ(), v.pointer())
+	default:
+		panic(&ValueError{"reflect.Value.Clear", v.Kind()})
+	}
+}
+
 // 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 {
@@ -2872,17 +2916,17 @@
 	sk := src.kind()
 	var stringCopy bool
 	if sk != Array && sk != Slice {
-		stringCopy = sk == String && dst.typ.Elem().Kind() == Uint8
+		stringCopy = sk == String && dst.typ().Elem().Kind() == abi.Uint8
 		if !stringCopy {
 			panic(&ValueError{"reflect.Copy", sk})
 		}
 	}
 	src.mustBeExported()
 
-	de := dst.typ.Elem()
+	de := dst.typ().Elem()
 	if !stringCopy {
-		se := src.typ.Elem()
-		typesMustMatch("reflect.Copy", de, se)
+		se := src.typ().Elem()
+		typesMustMatch("reflect.Copy", toType(de), toType(se))
 	}
 
 	var ds, ss unsafeheader.Slice
@@ -2906,7 +2950,7 @@
 		ss.Cap = sh.Len
 	}
 
-	return typedslicecopy(de.common(), ds, ss)
+	return typedslicecopy(de.Common(), ds, ss)
 }
 
 // A runtimeSelect is a single case passed to rselect.
@@ -2923,6 +2967,11 @@
 // The conventional OK bool indicates whether the receive corresponds
 // to a sent value.
 //
+// rselect generally doesn't escape the runtimeSelect slice, except
+// that for the send case the value to send needs to escape. We don't
+// have a way to represent that in the function signature. So we handle
+// that with a forced escape in function Select.
+//
 //go:noescape
 func rselect([]runtimeSelect) (chosen int, recvOK bool)
 
@@ -3011,23 +3060,26 @@
 			}
 			ch.mustBe(Chan)
 			ch.mustBeExported()
-			tt := (*chanType)(unsafe.Pointer(ch.typ))
-			if ChanDir(tt.dir)&SendDir == 0 {
+			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
+			rc.typ = toRType(&tt.Type)
 			v := c.Send
 			if !v.IsValid() {
 				panic("reflect.Select: SendDir case missing Send value")
 			}
 			v.mustBeExported()
-			v = v.assignTo("reflect.Select", tt.elem, nil)
+			v = v.assignTo("reflect.Select", tt.Elem, nil)
 			if v.flag&flagIndir != 0 {
 				rc.val = v.ptr
 			} else {
 				rc.val = unsafe.Pointer(&v.ptr)
 			}
+			// The value to send needs to escape. See the comment at rselect for
+			// why we need forced escape.
+			escapes(rc.val)
 
 		case SelectRecv:
 			if c.Send.IsValid() {
@@ -3039,23 +3091,23 @@
 			}
 			ch.mustBe(Chan)
 			ch.mustBeExported()
-			tt := (*chanType)(unsafe.Pointer(ch.typ))
-			if ChanDir(tt.dir)&RecvDir == 0 {
+			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)
+			rc.typ = toRType(&tt.Type)
+			rc.val = unsafe_New(tt.Elem)
 		}
 	}
 
 	chosen, recvOK = rselect(runcases)
 	if runcases[chosen].dir == SelectRecv {
 		tt := (*chanType)(unsafe.Pointer(runcases[chosen].typ))
-		t := tt.elem
+		t := tt.Elem
 		p := runcases[chosen].val
 		fl := flag(t.Kind())
-		if ifaceIndir(t) {
+		if t.IfaceIndir() {
 			recv = Value{t, p, fl | flagIndir}
 		} else {
 			recv = Value{t, *(*unsafe.Pointer)(p), fl}
@@ -3069,8 +3121,12 @@
  */
 
 // implemented in package runtime
-func unsafe_New(*rtype) unsafe.Pointer
-func unsafe_NewArray(*rtype, int) unsafe.Pointer
+
+//go:noescape
+func unsafe_New(*abi.Type) unsafe.Pointer
+
+//go:noescape
+func unsafe_NewArray(*abi.Type, int) unsafe.Pointer
 
 // MakeSlice creates a new zero-initialized slice value
 // for the specified slice type, length, and capacity.
@@ -3088,8 +3144,8 @@
 		panic("reflect.MakeSlice: len > cap")
 	}
 
-	s := unsafeheader.Slice{Data: unsafe_NewArray(typ.Elem().(*rtype), cap), Len: len, Cap: cap}
-	return Value{typ.(*rtype), unsafe.Pointer(&s), flagIndir | flag(Slice)}
+	s := unsafeheader.Slice{Data: unsafe_NewArray(&(typ.Elem().(*rtype).t), cap), Len: len, Cap: cap}
+	return Value{&typ.(*rtype).t, unsafe.Pointer(&s), flagIndir | flag(Slice)}
 }
 
 // MakeChan creates a new channel with the specified type and buffer size.
@@ -3103,7 +3159,7 @@
 	if typ.ChanDir() != BothDir {
 		panic("reflect.MakeChan: unidirectional channel type")
 	}
-	t := typ.(*rtype)
+	t := typ.common()
 	ch := makechan(t, buffer)
 	return Value{t, ch, flag(Chan)}
 }
@@ -3119,7 +3175,7 @@
 	if typ.Kind() != Map {
 		panic("reflect.MakeMapWithSize of non-map type")
 	}
-	t := typ.(*rtype)
+	t := typ.common()
 	m := makemap(t, n)
 	return Value{t, m, flag(Map)}
 }
@@ -3134,6 +3190,14 @@
 	return v.Elem()
 }
 
+// Before Go 1.21, ValueOf always escapes and a Value's content
+// is always heap allocated.
+// Set go121noForceValueEscape to true to avoid the forced escape,
+// allowing Value content to be on the stack.
+// Set go121noForceValueEscape to false for the legacy behavior
+// (for debugging).
+const go121noForceValueEscape = true
+
 // ValueOf returns a new Value initialized to the concrete value
 // stored in the interface i. ValueOf(nil) returns the zero Value.
 func ValueOf(i any) Value {
@@ -3141,11 +3205,9 @@
 		return Value{}
 	}
 
-	// TODO: Maybe allow contents of a Value to live on the stack.
-	// For now we make the contents always escape to the heap. It
-	// makes life easier in a few places (see chanrecv/mapassign
-	// comment below).
-	escapes(i)
+	if !go121noForceValueEscape {
+		escapes(i)
+	}
 
 	return unpackEface(i)
 }
@@ -3159,11 +3221,11 @@
 	if typ == nil {
 		panic("reflect: Zero(nil)")
 	}
-	t := typ.(*rtype)
+	t := &typ.(*rtype).t
 	fl := flag(t.Kind())
-	if ifaceIndir(t) {
+	if t.IfaceIndir() {
 		var p unsafe.Pointer
-		if t.size <= maxZero {
+		if t.Size() <= maxZero {
 			p = unsafe.Pointer(&zeroVal[0])
 		} else {
 			p = unsafe_New(t)
@@ -3185,8 +3247,8 @@
 	if typ == nil {
 		panic("reflect: New(nil)")
 	}
-	t := typ.(*rtype)
-	pt := t.ptrTo()
+	t := &typ.(*rtype).t
+	pt := ptrTo(t)
 	if ifaceIndir(pt) {
 		// This is a pointer to a not-in-heap type.
 		panic("reflect: New of type that may not be allocated in heap (possibly undefined cgo C type)")
@@ -3209,20 +3271,20 @@
 // For a conversion to an interface type, target, if not nil,
 // is a suggested scratch space to use.
 // target must be initialized memory (or nil).
-func (v Value) assignTo(context string, dst *rtype, target unsafe.Pointer) Value {
+func (v Value) assignTo(context string, dst *abi.Type, target unsafe.Pointer) Value {
 	if v.flag&flagMethod != 0 {
 		v = makeMethodValue(context, v)
 	}
 
 	switch {
-	case directlyAssignable(dst, v.typ):
+	case directlyAssignable(dst, v.typ()):
 		// Overwrite type so that they match.
 		// Same memory layout, so no harm done.
 		fl := v.flag&(flagAddr|flagIndir) | v.flag.ro()
 		fl |= flag(dst.Kind())
 		return Value{dst, v.ptr, fl}
 
-	case implements(dst, v.typ):
+	case implements(dst, v.typ()):
 		if v.Kind() == Interface && v.IsNil() {
 			// A nil ReadWriter passed to nil Reader is OK,
 			// but using ifaceE2I below will panic.
@@ -3242,7 +3304,7 @@
 	}
 
 	// Failed.
-	panic(context + ": value of type " + v.typ.String() + " is not assignable to type " + dst.String())
+	panic(context + ": value of type " + stringFor(v.typ()) + " is not assignable to type " + stringFor(dst))
 }
 
 // Convert returns the value v converted to type t.
@@ -3252,9 +3314,9 @@
 	if v.flag&flagMethod != 0 {
 		v = makeMethodValue("Convert", v)
 	}
-	op := convertOp(t.common(), v.typ)
+	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())
+		panic("reflect.Value.Convert: value of type " + stringFor(v.typ()) + " cannot be converted to type " + t.String())
 	}
 	return op(v, t)
 }
@@ -3396,10 +3458,10 @@
 
 // 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() {
+func convertOp(dst, src *abi.Type) func(Value, Type) Value {
+	switch Kind(src.Kind()) {
 	case Int, Int8, Int16, Int32, Int64:
-		switch dst.Kind() {
+		switch Kind(dst.Kind()) {
 		case Int, Int8, Int16, Int32, Int64, Uint, Uint8, Uint16, Uint32, Uint64, Uintptr:
 			return cvtInt
 		case Float32, Float64:
@@ -3409,7 +3471,7 @@
 		}
 
 	case Uint, Uint8, Uint16, Uint32, Uint64, Uintptr:
-		switch dst.Kind() {
+		switch Kind(dst.Kind()) {
 		case Int, Int8, Int16, Int32, Int64, Uint, Uint8, Uint16, Uint32, Uint64, Uintptr:
 			return cvtUint
 		case Float32, Float64:
@@ -3419,7 +3481,7 @@
 		}
 
 	case Float32, Float64:
-		switch dst.Kind() {
+		switch Kind(dst.Kind()) {
 		case Int, Int8, Int16, Int32, Int64:
 			return cvtFloatInt
 		case Uint, Uint8, Uint16, Uint32, Uint64, Uintptr:
@@ -3429,14 +3491,14 @@
 		}
 
 	case Complex64, Complex128:
-		switch dst.Kind() {
+		switch Kind(dst.Kind()) {
 		case Complex64, Complex128:
 			return cvtComplex
 		}
 
 	case String:
-		if dst.Kind() == Slice && dst.Elem().PkgPath() == "" {
-			switch dst.Elem().Kind() {
+		if dst.Kind() == abi.Slice && pkgPathFor(dst.Elem()) == "" {
+			switch Kind(dst.Elem().Kind()) {
 			case Uint8:
 				return cvtStringBytes
 			case Int32:
@@ -3445,8 +3507,8 @@
 		}
 
 	case Slice:
-		if dst.Kind() == String && src.Elem().PkgPath() == "" {
-			switch src.Elem().Kind() {
+		if dst.Kind() == abi.String && pkgPathFor(src.Elem()) == "" {
+			switch Kind(src.Elem().Kind()) {
 			case Uint8:
 				return cvtBytesString
 			case Int32:
@@ -3455,17 +3517,17 @@
 		}
 		// "x is a slice, T is a pointer-to-array type,
 		// and the slice and array types have identical element types."
-		if dst.Kind() == Pointer && dst.Elem().Kind() == Array && src.Elem() == dst.Elem().Elem() {
+		if dst.Kind() == abi.Pointer && dst.Elem().Kind() == abi.Array && src.Elem() == dst.Elem().Elem() {
 			return cvtSliceArrayPtr
 		}
-		// "x is a slice, T is a array type,
+		// "x is a slice, T is an array type,
 		// and the slice and array types have identical element types."
-		if dst.Kind() == Array && src.Elem() == dst.Elem() {
+		if dst.Kind() == abi.Array && src.Elem() == dst.Elem() {
 			return cvtSliceArray
 		}
 
 	case Chan:
-		if dst.Kind() == Chan && specialChannelAssignability(dst, src) {
+		if dst.Kind() == abi.Chan && specialChannelAssignability(dst, src) {
 			return cvtDirect
 		}
 	}
@@ -3476,14 +3538,14 @@
 	}
 
 	// dst and src are non-defined pointer types with same underlying base type.
-	if dst.Kind() == Pointer && dst.Name() == "" &&
-		src.Kind() == Pointer && src.Name() == "" &&
-		haveIdenticalUnderlyingType(dst.Elem().common(), src.Elem().common(), false) {
+	if dst.Kind() == abi.Pointer && nameFor(dst) == "" &&
+		src.Kind() == abi.Pointer && nameFor(src) == "" &&
+		haveIdenticalUnderlyingType(elem(dst), elem(src), false) {
 		return cvtDirect
 	}
 
 	if implements(dst, src) {
-		if src.Kind() == Interface {
+		if src.Kind() == abi.Interface {
 			return cvtI2I
 		}
 		return cvtT2I
@@ -3497,7 +3559,7 @@
 func makeInt(f flag, bits uint64, t Type) Value {
 	typ := t.common()
 	ptr := unsafe_New(typ)
-	switch typ.size {
+	switch typ.Size() {
 	case 1:
 		*(*uint8)(ptr) = uint8(bits)
 	case 2:
@@ -3515,7 +3577,7 @@
 func makeFloat(f flag, v float64, t Type) Value {
 	typ := t.common()
 	ptr := unsafe_New(typ)
-	switch typ.size {
+	switch typ.Size() {
 	case 4:
 		*(*float32)(ptr) = float32(v)
 	case 8:
@@ -3537,7 +3599,7 @@
 func makeComplex(f flag, v complex128, t Type) Value {
 	typ := t.common()
 	ptr := unsafe_New(typ)
-	switch typ.size {
+	switch typ.Size() {
 	case 8:
 		*(*complex64)(ptr) = complex64(v)
 	case 16:
@@ -3704,7 +3766,7 @@
 	if typ.NumMethod() == 0 {
 		*(*any)(target) = x
 	} else {
-		ifaceE2I(typ.(*rtype), x, target)
+		ifaceE2I(typ.common(), x, target)
 	}
 	return Value{typ.common(), target, v.flag.ro() | flagIndir | flag(Interface)}
 }
@@ -3720,47 +3782,69 @@
 }
 
 // implemented in ../runtime
+//
+//go:noescape
 func chancap(ch unsafe.Pointer) int
+
+//go:noescape
 func chanclose(ch unsafe.Pointer)
+
+//go:noescape
 func chanlen(ch unsafe.Pointer) int
 
 // Note: some of the noescape annotations below are technically a lie,
-// but safe in the context of this package. Functions like chansend
-// and mapassign don't escape the referent, but may escape anything
+// but safe in the context of this package. Functions like chansend0
+// and mapassign0 don't escape the referent, but may escape anything
 // the referent points to (they do shallow copies of the referent).
-// It is safe in this package because the referent may only point
-// to something a Value may point to, and that is always in the heap
-// (due to the escapes() call in ValueOf).
+// We add a 0 to their names and wrap them in functions with the
+// proper escape behavior.
 
 //go:noescape
 func chanrecv(ch unsafe.Pointer, nb bool, val unsafe.Pointer) (selected, received bool)
 
 //go:noescape
-func chansend(ch unsafe.Pointer, val unsafe.Pointer, nb bool) bool
+func chansend0(ch unsafe.Pointer, val unsafe.Pointer, nb bool) bool
 
-func makechan(typ *rtype, size int) (ch unsafe.Pointer)
-func makemap(t *rtype, cap int) (m unsafe.Pointer)
+func chansend(ch unsafe.Pointer, val unsafe.Pointer, nb bool) bool {
+	contentEscapes(val)
+	return chansend0(ch, val, nb)
+}
+
+func makechan(typ *abi.Type, size int) (ch unsafe.Pointer)
+func makemap(t *abi.Type, cap int) (m unsafe.Pointer)
 
 //go:noescape
-func mapaccess(t *rtype, m unsafe.Pointer, key unsafe.Pointer) (val unsafe.Pointer)
+func mapaccess(t *abi.Type, m unsafe.Pointer, key unsafe.Pointer) (val unsafe.Pointer)
 
 //go:noescape
-func mapaccess_faststr(t *rtype, m unsafe.Pointer, key string) (val unsafe.Pointer)
+func mapaccess_faststr(t *abi.Type, m unsafe.Pointer, key string) (val unsafe.Pointer)
 
 //go:noescape
-func mapassign(t *rtype, m unsafe.Pointer, key, val unsafe.Pointer)
+func mapassign0(t *abi.Type, m unsafe.Pointer, key, val unsafe.Pointer)
+
+func mapassign(t *abi.Type, m unsafe.Pointer, key, val unsafe.Pointer) {
+	contentEscapes(key)
+	contentEscapes(val)
+	mapassign0(t, m, key, val)
+}
 
 //go:noescape
-func mapassign_faststr(t *rtype, m unsafe.Pointer, key string, val unsafe.Pointer)
+func mapassign_faststr0(t *abi.Type, m unsafe.Pointer, key string, val unsafe.Pointer)
+
+func mapassign_faststr(t *abi.Type, m unsafe.Pointer, key string, val unsafe.Pointer) {
+	contentEscapes((*unsafeheader.String)(unsafe.Pointer(&key)).Data)
+	contentEscapes(val)
+	mapassign_faststr0(t, m, key, val)
+}
 
 //go:noescape
-func mapdelete(t *rtype, m unsafe.Pointer, key unsafe.Pointer)
+func mapdelete(t *abi.Type, m unsafe.Pointer, key unsafe.Pointer)
 
 //go:noescape
-func mapdelete_faststr(t *rtype, m unsafe.Pointer, key string)
+func mapdelete_faststr(t *abi.Type, m unsafe.Pointer, key string)
 
 //go:noescape
-func mapiterinit(t *rtype, m unsafe.Pointer, it *hiter)
+func mapiterinit(t *abi.Type, m unsafe.Pointer, it *hiter)
 
 //go:noescape
 func mapiterkey(it *hiter) (key unsafe.Pointer)
@@ -3774,6 +3858,8 @@
 //go:noescape
 func maplen(m unsafe.Pointer) int
 
+func mapclear(t *abi.Type, m unsafe.Pointer)
+
 // call calls fn with "stackArgsSize" bytes of stack arguments laid out
 // at stackArgs and register arguments laid out in regArgs. frameSize is
 // the total amount of stack space that will be reserved by call, so this
@@ -3800,9 +3886,9 @@
 //
 //go:noescape
 //go:linkname call runtime.reflectcall
-func call(stackArgsType *rtype, f, stackArgs unsafe.Pointer, stackArgsSize, stackRetOffset, frameSize uint32, regArgs *abi.RegArgs)
+func call(stackArgsType *abi.Type, f, stackArgs unsafe.Pointer, stackArgsSize, stackRetOffset, frameSize uint32, regArgs *abi.RegArgs)
 
-func ifaceE2I(t *rtype, src any, dst unsafe.Pointer)
+func ifaceE2I(t *abi.Type, src any, dst unsafe.Pointer)
 
 // memmove copies size bytes to dst from src. No write barriers are used.
 //
@@ -3812,38 +3898,38 @@
 // typedmemmove copies a value of type t to dst from src.
 //
 //go:noescape
-func typedmemmove(t *rtype, dst, src unsafe.Pointer)
-
-// typedmemmovepartial is like typedmemmove but assumes that
-// dst and src point off bytes into the value and only copies size bytes.
-//
-//go:noescape
-func typedmemmovepartial(t *rtype, dst, src unsafe.Pointer, off, size uintptr)
+func typedmemmove(t *abi.Type, dst, src unsafe.Pointer)
 
 // typedmemclr zeros the value at ptr of type t.
 //
 //go:noescape
-func typedmemclr(t *rtype, ptr unsafe.Pointer)
+func typedmemclr(t *abi.Type, ptr unsafe.Pointer)
 
 // typedmemclrpartial is like typedmemclr but assumes that
 // dst points off bytes into the value and only clears size bytes.
 //
 //go:noescape
-func typedmemclrpartial(t *rtype, ptr unsafe.Pointer, off, size uintptr)
+func typedmemclrpartial(t *abi.Type, ptr unsafe.Pointer, off, size uintptr)
 
 // 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 unsafeheader.Slice) int
+func typedslicecopy(t *abi.Type, dst, src unsafeheader.Slice) int
+
+// typedarrayclear zeroes the value at ptr of an array of elemType,
+// only clears len elem.
+//
+//go:noescape
+func typedarrayclear(elemType *abi.Type, ptr unsafe.Pointer, len int)
 
 //go:noescape
-func typehash(t *rtype, p unsafe.Pointer, h uintptr) uintptr
+func typehash(t *abi.Type, p unsafe.Pointer, h uintptr) uintptr
 
 func verifyNotInHeapPtr(p uintptr) bool
 
 //go:noescape
-func growslice(t *rtype, old unsafeheader.Slice, num int) unsafeheader.Slice
+func growslice(t *abi.Type, old unsafeheader.Slice, num int) unsafeheader.Slice
 
 // Dummy annotation marking that the value x escapes,
 // for use in cases where the reflect code is so clever that
@@ -3858,3 +3944,19 @@
 	b bool
 	x any
 }
+
+// Dummy annotation marking that the content of value x
+// escapes (i.e. modeling roughly heap=*x),
+// for use in cases where the reflect code is so clever that
+// the compiler cannot follow.
+func contentEscapes(x unsafe.Pointer) {
+	if dummy.b {
+		escapes(*(*any)(x)) // the dereference may not always be safe, but never executed
+	}
+}
+
+//go:nosplit
+func noescape(p unsafe.Pointer) unsafe.Pointer {
+	x := uintptr(p)
+	return unsafe.Pointer(x ^ 0)
+}
diff --git a/src/regexp/all_test.go b/src/regexp/all_test.go
index 52de3fe..124313d 100644
--- a/src/regexp/all_test.go
+++ b/src/regexp/all_test.go
@@ -947,3 +947,29 @@
 		}
 	}
 }
+
+func TestUnmarshalText(t *testing.T) {
+	unmarshaled := new(Regexp)
+	for i := range goodRe {
+		re := compileTest(t, goodRe[i], "")
+		marshaled, err := re.MarshalText()
+		if err != nil {
+			t.Errorf("regexp %#q failed to marshal: %s", re, err)
+			continue
+		}
+		if err := unmarshaled.UnmarshalText(marshaled); err != nil {
+			t.Errorf("regexp %#q failed to unmarshal: %s", re, err)
+			continue
+		}
+		if unmarshaled.String() != goodRe[i] {
+			t.Errorf("UnmarshalText returned unexpected value: %s", unmarshaled.String())
+		}
+	}
+	t.Run("invalid pattern", func(t *testing.T) {
+		re := new(Regexp)
+		err := re.UnmarshalText([]byte(`\`))
+		if err == nil {
+			t.Error("unexpected success")
+		}
+	})
+}
diff --git a/src/regexp/regexp.go b/src/regexp/regexp.go
index 990c06e..1c9b2fd 100644
--- a/src/regexp/regexp.go
+++ b/src/regexp/regexp.go
@@ -1283,3 +1283,24 @@
 
 	return strings
 }
+
+// MarshalText implements [encoding.TextMarshaler]. The output
+// matches that of calling the [Regexp.String] method.
+//
+// Note that the output is lossy in some cases: This method does not indicate
+// POSIX regular expressions (i.e. those compiled by calling [CompilePOSIX]), or
+// those for which the [Regexp.Longest] method has been called.
+func (re *Regexp) MarshalText() ([]byte, error) {
+	return []byte(re.String()), nil
+}
+
+// UnmarshalText implements [encoding.TextUnmarshaler] by calling
+// [Compile] on the encoded value.
+func (re *Regexp) UnmarshalText(text []byte) error {
+	newRE, err := Compile(string(text))
+	if err != nil {
+		return err
+	}
+	*re = *newRE
+	return nil
+}
diff --git a/src/regexp/syntax/op_string.go b/src/regexp/syntax/op_string.go
index 3952b2b..1368f5b 100644
--- a/src/regexp/syntax/op_string.go
+++ b/src/regexp/syntax/op_string.go
@@ -4,6 +4,32 @@
 
 import "strconv"
 
+func _() {
+	// An "invalid array index" compiler error signifies that the constant values have changed.
+	// Re-run the stringer command to generate them again.
+	var x [1]struct{}
+	_ = x[OpNoMatch-1]
+	_ = x[OpEmptyMatch-2]
+	_ = x[OpLiteral-3]
+	_ = x[OpCharClass-4]
+	_ = x[OpAnyCharNotNL-5]
+	_ = x[OpAnyChar-6]
+	_ = x[OpBeginLine-7]
+	_ = x[OpEndLine-8]
+	_ = x[OpBeginText-9]
+	_ = x[OpEndText-10]
+	_ = x[OpWordBoundary-11]
+	_ = x[OpNoWordBoundary-12]
+	_ = x[OpCapture-13]
+	_ = x[OpStar-14]
+	_ = x[OpPlus-15]
+	_ = x[OpQuest-16]
+	_ = x[OpRepeat-17]
+	_ = x[OpConcat-18]
+	_ = x[OpAlternate-19]
+	_ = x[opPseudo-128]
+}
+
 const (
 	_Op_name_0 = "NoMatchEmptyMatchLiteralCharClassAnyCharNotNLAnyCharBeginLineEndLineBeginTextEndTextWordBoundaryNoWordBoundaryCaptureStarPlusQuestRepeatConcatAlternate"
 	_Op_name_1 = "opPseudo"
diff --git a/src/regexp/syntax/prog.go b/src/regexp/syntax/prog.go
index 896cdc4..66995e2 100644
--- a/src/regexp/syntax/prog.go
+++ b/src/regexp/syntax/prog.go
@@ -106,7 +106,9 @@
 // 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 == '_'
+	// Test for lowercase letters first, as these occur more
+	// frequently than uppercase letters in common cases.
+	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.
diff --git a/src/regexp/syntax/prog_test.go b/src/regexp/syntax/prog_test.go
index 5603aea..54dd1dd 100644
--- a/src/regexp/syntax/prog_test.go
+++ b/src/regexp/syntax/prog_test.go
@@ -127,3 +127,18 @@
 		EmptyOpContext(r1, -1)
 	}
 }
+
+var sink any
+
+func BenchmarkIsWordChar(b *testing.B) {
+	const chars = "Don't communicate by sharing memory, share memory by communicating."
+	for i := 0; i < b.N; i++ {
+		for _, r := range chars {
+			sink = IsWordChar(r)
+		}
+	}
+	if sink == nil {
+		b.Fatal("Benchmark did not run")
+	}
+	sink = nil
+}
diff --git a/src/run.bash b/src/run.bash
index 35fa8f6..badb8c6 100755
--- a/src/run.bash
+++ b/src/run.bash
@@ -20,8 +20,7 @@
 # and will be removed if it stops being needed. See go.dev/issue/12508.
 #
 # GO_TEST_TIMEOUT_SCALE: a non-negative integer factor to scale test timeout by.
-# Defaults to 1, or as a special case for the purpose of the Go build system (x/build),
-# defaults to 2 when GOARCH is arm, and to 4 when GOARCH is mips, mipsle, mips64, or mips64le.
+# Defaults to 1.
 
 set -e
 
@@ -32,7 +31,6 @@
 
 export GOENV=off
 eval $(../bin/go tool dist env)
-export GOROOT   # The api test requires GOROOT to be set, so set it to match ../bin/go.
 
 unset CDPATH	# in case user has it set
 
diff --git a/src/runtime/alg.go b/src/runtime/alg.go
index 2a413ee..a1f683f 100644
--- a/src/runtime/alg.go
+++ b/src/runtime/alg.go
@@ -5,6 +5,7 @@
 package runtime
 
 import (
+	"internal/abi"
 	"internal/cpu"
 	"internal/goarch"
 	"unsafe"
@@ -100,12 +101,12 @@
 		return h
 	}
 	t := tab._type
-	if t.equal == nil {
+	if t.Equal == nil {
 		// Check hashability here. We could do this check inside
 		// typehash, but we want to report the topmost type in
 		// the error text (e.g. in a struct with a field of slice type
 		// we want to report the struct, not the slice).
-		panic(errorString("hash of unhashable type " + t.string()))
+		panic(errorString("hash of unhashable type " + toRType(t).string()))
 	}
 	if isDirectIface(t) {
 		return c1 * typehash(t, unsafe.Pointer(&a.data), h^c0)
@@ -120,9 +121,9 @@
 	if t == nil {
 		return h
 	}
-	if t.equal == nil {
+	if t.Equal == nil {
 		// See comment in interhash above.
-		panic(errorString("hash of unhashable type " + t.string()))
+		panic(errorString("hash of unhashable type " + toRType(t).string()))
 	}
 	if isDirectIface(t) {
 		return c1 * typehash(t, unsafe.Pointer(&a.data), h^c0)
@@ -142,18 +143,18 @@
 // Note: this function must match the compiler generated
 // functions exactly. See issue 37716.
 func typehash(t *_type, p unsafe.Pointer, h uintptr) uintptr {
-	if t.tflag&tflagRegularMemory != 0 {
+	if t.TFlag&abi.TFlagRegularMemory != 0 {
 		// Handle ptr sizes specially, see issue 37086.
-		switch t.size {
+		switch t.Size_ {
 		case 4:
 			return memhash32(p, h)
 		case 8:
 			return memhash64(p, h)
 		default:
-			return memhash(p, h, t.size)
+			return memhash(p, h, t.Size_)
 		}
 	}
-	switch t.kind & kindMask {
+	switch t.Kind_ & kindMask {
 	case kindFloat32:
 		return f32hash(p, h)
 	case kindFloat64:
@@ -166,29 +167,29 @@
 		return strhash(p, h)
 	case kindInterface:
 		i := (*interfacetype)(unsafe.Pointer(t))
-		if len(i.mhdr) == 0 {
+		if len(i.Methods) == 0 {
 			return nilinterhash(p, h)
 		}
 		return interhash(p, h)
 	case kindArray:
 		a := (*arraytype)(unsafe.Pointer(t))
-		for i := uintptr(0); i < a.len; i++ {
-			h = typehash(a.elem, add(p, i*a.elem.size), h)
+		for i := uintptr(0); i < a.Len; i++ {
+			h = typehash(a.Elem, add(p, i*a.Elem.Size_), h)
 		}
 		return h
 	case kindStruct:
 		s := (*structtype)(unsafe.Pointer(t))
-		for _, f := range s.fields {
-			if f.name.isBlank() {
+		for _, f := range s.Fields {
+			if f.Name.IsBlank() {
 				continue
 			}
-			h = typehash(f.typ, add(p, f.offset), h)
+			h = typehash(f.Typ, add(p, f.Offset), h)
 		}
 		return h
 	default:
 		// Should never happen, as typehash should only be called
 		// with comparable types.
-		panic(errorString("hash of unhashable type " + t.string()))
+		panic(errorString("hash of unhashable type " + toRType(t).string()))
 	}
 }
 
@@ -244,9 +245,9 @@
 	if t == nil {
 		return true
 	}
-	eq := t.equal
+	eq := t.Equal
 	if eq == nil {
-		panic(errorString("comparing uncomparable type " + t.string()))
+		panic(errorString("comparing uncomparable type " + toRType(t).string()))
 	}
 	if isDirectIface(t) {
 		// Direct interface types are ptr, chan, map, func, and single-element structs/arrays thereof.
@@ -261,9 +262,9 @@
 		return true
 	}
 	t := tab._type
-	eq := t.equal
+	eq := t.Equal
 	if eq == nil {
-		panic(errorString("comparing uncomparable type " + t.string()))
+		panic(errorString("comparing uncomparable type " + toRType(t).string()))
 	}
 	if isDirectIface(t) {
 		// See comment in efaceeq.
diff --git a/src/runtime/align_test.go b/src/runtime/align_test.go
index 5f225d6..2bad5b1 100644
--- a/src/runtime/align_test.go
+++ b/src/runtime/align_test.go
@@ -47,7 +47,7 @@
 		varDesc[i] = v[1]
 	}
 
-	// Check all of our alignemnts. This is the actual core of the test.
+	// Check all of our alignments. This is the actual core of the test.
 	for i, d := range runtime.AtomicFields {
 		if d%8 != 0 {
 			t.Errorf("field alignment of %s failed: offset is %d", fieldDesc[i], d)
diff --git a/src/runtime/arena.go b/src/runtime/arena.go
index c338d30..f9806c5 100644
--- a/src/runtime/arena.go
+++ b/src/runtime/arena.go
@@ -26,7 +26,7 @@
 // The implementation works in layers. At the bottom, arenas are managed in chunks.
 // Each chunk must be a multiple of the heap arena size, or the heap arena size must
 // be divisible by the arena chunks. The address space for each chunk, and each
-// corresponding heapArena for that addres space, are eternelly reserved for use as
+// corresponding heapArena for that address space, are eternally reserved for use as
 // arena chunks. That is, they can never be used for the general heap. Each chunk
 // is also represented by a single mspan, and is modeled as a single large heap
 // allocation. It must be, because each chunk contains ordinary Go values that may
@@ -109,10 +109,10 @@
 //go:linkname arena_arena_New arena.runtime_arena_arena_New
 func arena_arena_New(arena unsafe.Pointer, typ any) any {
 	t := (*_type)(efaceOf(&typ).data)
-	if t.kind&kindMask != kindPtr {
+	if t.Kind_&kindMask != kindPtr {
 		throw("arena_New: non-pointer type")
 	}
-	te := (*ptrtype)(unsafe.Pointer(t)).elem
+	te := (*ptrtype)(unsafe.Pointer(t)).Elem
 	x := ((*userArena)(arena)).new(te)
 	var result any
 	e := efaceOf(&result)
@@ -143,7 +143,7 @@
 	var v unsafe.Pointer
 	e := efaceOf(&s)
 	t := e._type
-	switch t.kind & kindMask {
+	switch t.Kind_ & kindMask {
 	case kindString:
 		v = stringStructOf((*string)(e.data)).str
 	case kindSlice:
@@ -160,7 +160,7 @@
 	}
 	// Heap-allocate storage for a copy.
 	var x any
-	switch t.kind & kindMask {
+	switch t.Kind_ & kindMask {
 	case kindString:
 		s1 := s.(string)
 		s2, b := rawstring(len(s1))
@@ -168,14 +168,14 @@
 		x = s2
 	case kindSlice:
 		len := (*slice)(e.data).len
-		et := (*slicetype)(unsafe.Pointer(t)).elem
+		et := (*slicetype)(unsafe.Pointer(t)).Elem
 		sl := new(slice)
 		*sl = slice{makeslicecopy(et, len, len, (*slice)(e.data).array), len, len}
 		xe := efaceOf(&x)
 		xe._type = t
 		xe.data = unsafe.Pointer(sl)
 	case kindPtr:
-		et := (*ptrtype)(unsafe.Pointer(t)).elem
+		et := (*ptrtype)(unsafe.Pointer(t)).Elem
 		e2 := newobject(et)
 		typedmemmove(et, e2, e.data)
 		xe := efaceOf(&x)
@@ -202,10 +202,10 @@
 
 func init() {
 	if userArenaChunkPages*pageSize != userArenaChunkBytes {
-		throw("user arena chunk size is not a mutliple of the page size")
+		throw("user arena chunk size is not a multiple of the page size")
 	}
 	if userArenaChunkBytes%physPageSize != 0 {
-		throw("user arena chunk size is not a mutliple of the physical page size")
+		throw("user arena chunk size is not a multiple of the physical page size")
 	}
 	if userArenaChunkBytes < heapArenaBytes {
 		if heapArenaBytes%userArenaChunkBytes != 0 {
@@ -281,14 +281,14 @@
 	}
 	i := efaceOf(&sl)
 	typ := i._type
-	if typ.kind&kindMask != kindPtr {
+	if typ.Kind_&kindMask != kindPtr {
 		panic("slice result of non-ptr type")
 	}
-	typ = (*ptrtype)(unsafe.Pointer(typ)).elem
-	if typ.kind&kindMask != kindSlice {
+	typ = (*ptrtype)(unsafe.Pointer(typ)).Elem
+	if typ.Kind_&kindMask != kindSlice {
 		panic("slice of non-ptr-to-slice type")
 	}
-	typ = (*slicetype)(unsafe.Pointer(typ)).elem
+	typ = (*slicetype)(unsafe.Pointer(typ)).Elem
 	// t is now the element type of the slice we want to allocate.
 
 	*((*slice)(i.data)) = slice{a.alloc(typ, cap), cap, cap}
@@ -435,7 +435,7 @@
 // userArenaNextFree reserves space in the user arena for an item of the specified
 // type. If cap is not -1, this is for an array of cap elements of type t.
 func (s *mspan) userArenaNextFree(typ *_type, cap int) unsafe.Pointer {
-	size := typ.size
+	size := typ.Size_
 	if cap > 0 {
 		if size > ^uintptr(0)/uintptr(cap) {
 			// Overflow.
@@ -468,14 +468,14 @@
 	mp.mallocing = 1
 
 	var ptr unsafe.Pointer
-	if typ.ptrdata == 0 {
+	if typ.PtrBytes == 0 {
 		// Allocate pointer-less objects from the tail end of the chunk.
-		v, ok := s.userArenaChunkFree.takeFromBack(size, typ.align)
+		v, ok := s.userArenaChunkFree.takeFromBack(size, typ.Align_)
 		if ok {
 			ptr = unsafe.Pointer(v)
 		}
 	} else {
-		v, ok := s.userArenaChunkFree.takeFromFront(size, typ.align)
+		v, ok := s.userArenaChunkFree.takeFromFront(size, typ.Align_)
 		if ok {
 			ptr = unsafe.Pointer(v)
 		}
@@ -490,7 +490,7 @@
 		throw("arena chunk needs zeroing, but should already be zeroed")
 	}
 	// Set up heap bitmap and do extra accounting.
-	if typ.ptrdata != 0 {
+	if typ.PtrBytes != 0 {
 		if cap >= 0 {
 			userArenaHeapBitsSetSliceType(typ, cap, ptr, s.base())
 		} else {
@@ -501,9 +501,9 @@
 			throw("mallocgc called without a P or outside bootstrapping")
 		}
 		if cap > 0 {
-			c.scanAlloc += size - (typ.size - typ.ptrdata)
+			c.scanAlloc += size - (typ.Size_ - typ.PtrBytes)
 		} else {
-			c.scanAlloc += typ.ptrdata
+			c.scanAlloc += typ.PtrBytes
 		}
 	}
 
@@ -556,14 +556,14 @@
 		h = h.write(b, 1)
 	}
 
-	p := typ.gcdata // start of 1-bit pointer mask (or GC program)
+	p := typ.GCData // start of 1-bit pointer mask (or GC program)
 	var gcProgBits uintptr
-	if typ.kind&kindGCProg != 0 {
+	if typ.Kind_&kindGCProg != 0 {
 		// Expand gc program, using the object itself for storage.
 		gcProgBits = runGCProg(addb(p, 4), (*byte)(ptr))
 		p = (*byte)(ptr)
 	}
-	nb := typ.ptrdata / goarch.PtrSize
+	nb := typ.PtrBytes / goarch.PtrSize
 
 	for i := uintptr(0); i < nb; i += ptrBits {
 		k := nb - i
@@ -578,10 +578,10 @@
 	// to clear. We don't need to do this to clear stale noMorePtrs
 	// markers from previous uses because arena chunk pointer bitmaps
 	// are always fully cleared when reused.
-	h = h.pad(typ.size - typ.ptrdata)
-	h.flush(uintptr(ptr), typ.size)
+	h = h.pad(typ.Size_ - typ.PtrBytes)
+	h.flush(uintptr(ptr), typ.Size_)
 
-	if typ.kind&kindGCProg != 0 {
+	if typ.Kind_&kindGCProg != 0 {
 		// Zero out temporary ptrmask buffer inside object.
 		memclrNoHeapPointers(ptr, (gcProgBits+7)/8)
 	}
@@ -591,16 +591,16 @@
 	// Derived from heapBitsSetType.
 	const doubleCheck = false
 	if doubleCheck {
-		size := typ.size
+		size := typ.Size_
 		x := uintptr(ptr)
 		h := heapBitsForAddr(x, size)
 		for i := uintptr(0); i < size; i += goarch.PtrSize {
 			// Compute the pointer bit we want at offset i.
 			want := false
-			off := i % typ.size
-			if off < typ.ptrdata {
+			off := i % typ.Size_
+			if off < typ.PtrBytes {
 				j := off / goarch.PtrSize
-				want = *addb(typ.gcdata, j/8)>>(j%8)&1 != 0
+				want = *addb(typ.GCData, j/8)>>(j%8)&1 != 0
 			}
 			if want {
 				var addr uintptr
@@ -620,12 +620,12 @@
 // Go slice backing store values allocated in a user arena chunk. It sets up the
 // heap bitmap for n consecutive values with type typ allocated at address ptr.
 func userArenaHeapBitsSetSliceType(typ *_type, n int, ptr unsafe.Pointer, base uintptr) {
-	mem, overflow := math.MulUintptr(typ.size, uintptr(n))
+	mem, overflow := math.MulUintptr(typ.Size_, uintptr(n))
 	if overflow || n < 0 || mem > maxAlloc {
 		panic(plainError("runtime: allocation size out of range"))
 	}
 	for i := 0; i < n; i++ {
-		userArenaHeapBitsSetType(typ, add(ptr, uintptr(i)*typ.size), base)
+		userArenaHeapBitsSetType(typ, add(ptr, uintptr(i)*typ.Size_), base)
 	}
 }
 
diff --git a/src/runtime/asan_amd64.s b/src/runtime/asan_amd64.s
index 0489aa8..bf847f2 100644
--- a/src/runtime/asan_amd64.s
+++ b/src/runtime/asan_amd64.s
@@ -24,7 +24,7 @@
 #define RARG3 CX
 #endif
 
-// Called from intrumented code.
+// Called from instrumented code.
 // func runtime·doasanread(addr unsafe.Pointer, sz, sp, pc uintptr)
 TEXT	runtime·doasanread(SB), NOSPLIT, $0-32
 	MOVQ	addr+0(FP), RARG0
diff --git a/src/runtime/asm.s b/src/runtime/asm.s
index 84d56de..f7bc5d4 100644
--- a/src/runtime/asm.s
+++ b/src/runtime/asm.s
@@ -8,3 +8,7 @@
 TEXT ·sigpanic0(SB),NOSPLIT,$0-0
 	JMP	·sigpanic<ABIInternal>(SB)
 #endif
+
+// See map.go comment on the need for this routine.
+TEXT ·mapinitnoop<ABIInternal>(SB),NOSPLIT,$0-0
+	RET
diff --git a/src/runtime/asm_386.s b/src/runtime/asm_386.s
index e16880c..67ffc24 100644
--- a/src/runtime/asm_386.s
+++ b/src/runtime/asm_386.s
@@ -171,8 +171,12 @@
 	MOVL	$runtime·tls_g(SB), 8(SP)	// arg 3: &tls_g
 #else
 	MOVL	$0, BX
-	MOVL	BX, 12(SP)	// arg 3,4: not used when using platform's TLS
-	MOVL	BX, 8(SP)
+	MOVL	BX, 12(SP)	// arg 4: not used when using platform's TLS
+#ifdef GOOS_windows
+	MOVL	$runtime·tls_g(SB), 8(SP)	// arg 3: &tls_g
+#else
+	MOVL	BX, 8(SP)	// arg 3: not used when using platform's TLS
+#endif
 #endif
 	MOVL	$setg_gcc<>(SB), BX
 	MOVL	BX, 4(SP)	// arg 2: setg_gcc
@@ -182,7 +186,7 @@
 	// update stackguard after _cgo_init
 	MOVL	$runtime·g0(SB), CX
 	MOVL	(g_stack+stack_lo)(CX), AX
-	ADDL	$const__StackGuard, AX
+	ADDL	$const_stackGuard, AX
 	MOVL	AX, g_stackguard0(CX)
 	MOVL	AX, g_stackguard1(CX)
 
@@ -685,7 +689,20 @@
 TEXT ·cgocallback(SB),NOSPLIT,$12-12  // Frame size must match commented places below
 	NO_LOCAL_POINTERS
 
-	// If g is nil, Go did not create the current thread.
+	// Skip cgocallbackg, just dropm when fn is nil, and frame is the saved g.
+	// It is used to dropm while thread is exiting.
+	MOVL	fn+0(FP), AX
+	CMPL	AX, $0
+	JNE	loadg
+	// Restore the g from frame.
+	get_tls(CX)
+	MOVL	frame+4(FP), BX
+	MOVL	BX, g(CX)
+	JMP	dropm
+
+loadg:
+	// If g is nil, Go did not create the current thread,
+	// or if this thread never called into Go on pthread platforms.
 	// Call needm to obtain one for temporary use.
 	// In this case, we're running on the thread stack, so there's
 	// lots of space, but the linker doesn't know. Hide the call from
@@ -703,9 +720,9 @@
 	MOVL	BP, savedm-4(SP) // saved copy of oldm
 	JMP	havem
 needm:
-	MOVL	$runtime·needm(SB), AX
+	MOVL	$runtime·needAndBindM(SB), AX
 	CALL	AX
-	MOVL	$0, savedm-4(SP) // dropm on return
+	MOVL	$0, savedm-4(SP)
 	get_tls(CX)
 	MOVL	g(CX), BP
 	MOVL	g_m(BP), BP
@@ -780,13 +797,29 @@
 	MOVL	0(SP), AX
 	MOVL	AX, (g_sched+gobuf_sp)(SI)
 
-	// If the m on entry was nil, we called needm above to borrow an m
-	// for the duration of the call. Since the call is over, return it with dropm.
+	// If the m on entry was nil, we called needm above to borrow an m,
+	// 1. for the duration of the call on non-pthread platforms,
+	// 2. or the duration of the C thread alive on pthread platforms.
+	// If the m on entry wasn't nil,
+	// 1. the thread might be a Go thread,
+	// 2. or it wasn't the first call from a C thread on pthread platforms,
+	//    since then we skip dropm to reuse the m in the first call.
 	MOVL	savedm-4(SP), DX
 	CMPL	DX, $0
-	JNE 3(PC)
+	JNE	droppedm
+
+	// Skip dropm to reuse it in the next call, when a pthread key has been created.
+	MOVL	_cgo_pthread_key_created(SB), DX
+	// It means cgo is disabled when _cgo_pthread_key_created is a nil pointer, need dropm.
+	CMPL	DX, $0
+	JEQ	dropm
+	CMPL	(DX), $0
+	JNE	droppedm
+
+dropm:
 	MOVL	$runtime·dropm(SB), AX
 	CALL	AX
+droppedm:
 
 	// Done!
 	RET
@@ -795,14 +828,15 @@
 TEXT runtime·setg(SB), NOSPLIT, $0-4
 	MOVL	gg+0(FP), BX
 #ifdef GOOS_windows
+	MOVL	runtime·tls_g(SB), CX
 	CMPL	BX, $0
 	JNE	settls
-	MOVL	$0, 0x14(FS)
+	MOVL	$0, 0(CX)(FS)
 	RET
 settls:
 	MOVL	g_m(BX), AX
 	LEAL	m_tls(AX), AX
-	MOVL	AX, 0x14(FS)
+	MOVL	AX, 0(CX)(FS)
 #endif
 	get_tls(CX)
 	MOVL	BX, g(CX)
@@ -867,6 +901,9 @@
 	JMP done
 
 TEXT ldt0setup<>(SB),NOSPLIT,$16-0
+#ifdef GOOS_windows
+	CALL	runtime·wintls(SB)
+#endif
 	// set up ldt 7 to point at m0.tls
 	// ldt 1 would be fine on Linux, but on OS X, 7 is as low as we can go.
 	// the entry number is just a hint.  setldt will set up GS with what it used.
@@ -1357,47 +1394,57 @@
 	MOVL	AX, ret+8(FP)
 	RET
 
-// gcWriteBarrier performs a heap pointer write and informs the GC.
+// gcWriteBarrier informs the GC about heap pointer writes.
 //
-// gcWriteBarrier does NOT follow the Go ABI. It takes two arguments:
-// - DI is the destination of the write
-// - AX is the value being written at DI
+// gcWriteBarrier returns space in a write barrier buffer which
+// should be filled in by the caller.
+// gcWriteBarrier does NOT follow the Go ABI. It accepts the
+// number of bytes of buffer needed in DI, and returns a pointer
+// to the buffer space in DI.
 // It clobbers FLAGS. It does not clobber any general-purpose registers,
 // but may clobber others (e.g., SSE registers).
-TEXT runtime·gcWriteBarrier(SB),NOSPLIT,$28
+// Typical use would be, when doing *(CX+88) = AX
+//     CMPL    $0, runtime.writeBarrier(SB)
+//     JEQ     dowrite
+//     CALL    runtime.gcBatchBarrier2(SB)
+//     MOVL    AX, (DI)
+//     MOVL    88(CX), DX
+//     MOVL    DX, 4(DI)
+// dowrite:
+//     MOVL    AX, 88(CX)
+TEXT gcWriteBarrier<>(SB),NOSPLIT,$28
 	// Save the registers clobbered by the fast path. This is slightly
 	// faster than having the caller spill these.
 	MOVL	CX, 20(SP)
 	MOVL	BX, 24(SP)
+retry:
 	// TODO: Consider passing g.m.p in as an argument so they can be shared
 	// across a sequence of write barriers.
 	get_tls(BX)
 	MOVL	g(BX), BX
 	MOVL	g_m(BX), BX
 	MOVL	m_p(BX), BX
-	MOVL	(p_wbBuf+wbBuf_next)(BX), CX
-	// Increment wbBuf.next position.
-	LEAL	8(CX), CX
-	MOVL	CX, (p_wbBuf+wbBuf_next)(BX)
+	// Get current buffer write position.
+	MOVL	(p_wbBuf+wbBuf_next)(BX), CX	// original next position
+	ADDL	DI, CX				// new next position
+	// Is the buffer full?
 	CMPL	CX, (p_wbBuf+wbBuf_end)(BX)
-	// Record the write.
-	MOVL	AX, -8(CX)	// Record value
-	MOVL	(DI), BX	// TODO: This turns bad writes into bad reads.
-	MOVL	BX, -4(CX)	// Record *slot
-	// Is the buffer full? (flags set in CMPL above)
-	JEQ	flush
-ret:
+	JA	flush
+	// Commit to the larger buffer.
+	MOVL	CX, (p_wbBuf+wbBuf_next)(BX)
+	// Make return value (the original next position)
+	SUBL	DI, CX
+	MOVL	CX, DI
+	// Restore registers.
 	MOVL	20(SP), CX
 	MOVL	24(SP), BX
-	// Do the write.
-	MOVL	AX, (DI)
 	RET
 
 flush:
 	// Save all general purpose registers since these could be
 	// clobbered by wbBufFlush and were not saved by the caller.
-	MOVL	DI, 0(SP)	// Also first argument to wbBufFlush
-	MOVL	AX, 4(SP)	// Also second argument to wbBufFlush
+	MOVL	DI, 0(SP)
+	MOVL	AX, 4(SP)
 	// BX already saved
 	// CX already saved
 	MOVL	DX, 8(SP)
@@ -1405,7 +1452,6 @@
 	MOVL	SI, 16(SP)
 	// DI already saved
 
-	// This takes arguments DI and AX
 	CALL	runtime·wbBufFlush(SB)
 
 	MOVL	0(SP), DI
@@ -1413,7 +1459,32 @@
 	MOVL	8(SP), DX
 	MOVL	12(SP), BP
 	MOVL	16(SP), SI
-	JMP	ret
+	JMP	retry
+
+TEXT runtime·gcWriteBarrier1<ABIInternal>(SB),NOSPLIT,$0
+	MOVL	$4, DI
+	JMP	gcWriteBarrier<>(SB)
+TEXT runtime·gcWriteBarrier2<ABIInternal>(SB),NOSPLIT,$0
+	MOVL	$8, DI
+	JMP	gcWriteBarrier<>(SB)
+TEXT runtime·gcWriteBarrier3<ABIInternal>(SB),NOSPLIT,$0
+	MOVL	$12, DI
+	JMP	gcWriteBarrier<>(SB)
+TEXT runtime·gcWriteBarrier4<ABIInternal>(SB),NOSPLIT,$0
+	MOVL	$16, DI
+	JMP	gcWriteBarrier<>(SB)
+TEXT runtime·gcWriteBarrier5<ABIInternal>(SB),NOSPLIT,$0
+	MOVL	$20, DI
+	JMP	gcWriteBarrier<>(SB)
+TEXT runtime·gcWriteBarrier6<ABIInternal>(SB),NOSPLIT,$0
+	MOVL	$24, DI
+	JMP	gcWriteBarrier<>(SB)
+TEXT runtime·gcWriteBarrier7<ABIInternal>(SB),NOSPLIT,$0
+	MOVL	$28, DI
+	JMP	gcWriteBarrier<>(SB)
+TEXT runtime·gcWriteBarrier8<ABIInternal>(SB),NOSPLIT,$0
+	MOVL	$32, DI
+	JMP	gcWriteBarrier<>(SB)
 
 // Note: these functions use a special calling convention to save generated code space.
 // Arguments are passed in registers, but the space for those arguments are allocated
@@ -1577,3 +1648,6 @@
 DATA runtime·tls_g+0(SB)/4, $8
 GLOBL runtime·tls_g+0(SB), NOPTR, $4
 #endif
+#ifdef GOOS_windows
+GLOBL runtime·tls_g+0(SB), NOPTR, $4
+#endif
diff --git a/src/runtime/asm_amd64.s b/src/runtime/asm_amd64.s
index 13c8de4..edf0909 100644
--- a/src/runtime/asm_amd64.s
+++ b/src/runtime/asm_amd64.s
@@ -29,7 +29,7 @@
 // c-archive) or when the shared library is loaded (for c-shared).
 // We expect argc and argv to be passed in the usual C ABI registers
 // DI and SI.
-TEXT _rt0_amd64_lib(SB),NOSPLIT,$0
+TEXT _rt0_amd64_lib(SB),NOSPLIT|NOFRAME,$0
 	// Transition from C ABI to Go ABI.
 	PUSH_REGS_HOST_TO_ABI0()
 
@@ -156,7 +156,7 @@
 
 #endif
 
-TEXT runtime·rt0_go(SB),NOSPLIT|TOPFRAME,$0
+TEXT runtime·rt0_go(SB),NOSPLIT|NOFRAME|TOPFRAME,$0
 	// copy arguments forward on an even stack
 	MOVQ	DI, AX		// argc
 	MOVQ	SI, BX		// argv
@@ -168,7 +168,7 @@
 	// create istack out of the given (operating system) stack.
 	// _cgo_init may update stackguard.
 	MOVQ	$runtime·g0(SB), DI
-	LEAQ	(-64*1024+104)(SP), BX
+	LEAQ	(-64*1024)(SP), BX
 	MOVQ	BX, g_stackguard0(DI)
 	MOVQ	BX, g_stackguard1(DI)
 	MOVQ	BX, (g_stack+stack_lo)(DI)
@@ -222,7 +222,7 @@
 	// update stackguard after _cgo_init
 	MOVQ	$runtime·g0(SB), CX
 	MOVQ	(g_stack+stack_lo)(CX), AX
-	ADDQ	$const__StackGuard, AX
+	ADDQ	$const_stackGuard, AX
 	MOVQ	AX, g_stackguard0(CX)
 	MOVQ	AX, g_stackguard1(CX)
 
@@ -279,7 +279,7 @@
 
 	CLD				// convention is D is always left cleared
 
-	// Check GOAMD64 reqirements
+	// Check GOAMD64 requirements
 	// We need to do this after setting up TLS, so that
 	// we can report an error if there is a failure. See issue 49586.
 #ifdef NEED_FEATURES_CX
@@ -390,7 +390,7 @@
 	// No per-thread init.
 	RET
 
-TEXT runtime·mstart(SB),NOSPLIT|TOPFRAME,$0
+TEXT runtime·mstart(SB),NOSPLIT|TOPFRAME|NOFRAME,$0
 	CALL	runtime·mstart0(SB)
 	RET // not reached
 
@@ -428,12 +428,18 @@
 TEXT runtime·mcall<ABIInternal>(SB), NOSPLIT, $0-8
 	MOVQ	AX, DX	// DX = fn
 
-	// save state in g->sched
-	MOVQ	0(SP), BX	// caller's PC
+	// Save state in g->sched. The caller's SP and PC are restored by gogo to
+	// resume execution in the caller's frame (implicit return). The caller's BP
+	// is also restored to support frame pointer unwinding.
+	MOVQ	SP, BX	// hide (SP) reads from vet
+	MOVQ	8(BX), BX	// caller's PC
 	MOVQ	BX, (g_sched+gobuf_pc)(R14)
 	LEAQ	fn+0(FP), BX	// caller's SP
 	MOVQ	BX, (g_sched+gobuf_sp)(R14)
-	MOVQ	BP, (g_sched+gobuf_bp)(R14)
+	// Get the caller's frame pointer by dereferencing BP. Storing BP as it is
+	// can cause a frame pointer cycle, see CL 476235.
+	MOVQ	(BP), BX // caller's BP
+	MOVQ	BX, (g_sched+gobuf_bp)(R14)
 
 	// switch to m->g0 & its stack, call fn
 	MOVQ	g_m(R14), BX
@@ -459,7 +465,13 @@
 // lives at the bottom of the G stack from the one that lives
 // at the top of the system stack because the one at the top of
 // the system stack terminates the stack walk (see topofstack()).
+// The frame layout needs to match systemstack
+// so that it can pretend to be systemstack_switch.
 TEXT runtime·systemstack_switch(SB), NOSPLIT, $0-0
+	UNDEF
+	// Make sure this function is not leaf,
+	// so the frame is saved.
+	CALL	runtime·abort(SB)
 	RET
 
 // func systemstack(fn func())
@@ -479,16 +491,17 @@
 	CMPQ	AX, m_curg(BX)
 	JNE	bad
 
-	// switch stacks
-	// save our state in g->sched. Pretend to
+	// Switch stacks.
+	// The original frame pointer is stored in BP,
+	// which is useful for stack unwinding.
+	// Save our state in g->sched. Pretend to
 	// be systemstack_switch if the G stack is scanned.
 	CALL	gosave_systemstack_switch<>(SB)
 
 	// switch to g0
 	MOVQ	DX, g(CX)
 	MOVQ	DX, R14 // set the g register
-	MOVQ	(g_sched+gobuf_sp)(DX), BX
-	MOVQ	BX, SP
+	MOVQ	(g_sched+gobuf_sp)(DX), SP
 
 	// call target function
 	MOVQ	DI, DX
@@ -502,7 +515,9 @@
 	MOVQ	m_curg(BX), AX
 	MOVQ	AX, g(CX)
 	MOVQ	(g_sched+gobuf_sp)(AX), SP
+	MOVQ	(g_sched+gobuf_bp)(AX), BP
 	MOVQ	$0, (g_sched+gobuf_sp)(AX)
+	MOVQ	$0, (g_sched+gobuf_bp)(AX)
 	RET
 
 noswitch:
@@ -511,6 +526,9 @@
 	// at an intermediate systemstack.
 	MOVQ	DI, DX
 	MOVQ	0(DI), DI
+	// The function epilogue is not called on a tail call.
+	// Pop BP from the stack to simulate it.
+	POPQ	BP
 	JMP	DI
 
 bad:
@@ -530,7 +548,7 @@
 // the top of a stack (for example, morestack calling newstack
 // calling the scheduler calling newm calling gc), so we must
 // record an argument size. For that purpose, it has no arguments.
-TEXT runtime·morestack(SB),NOSPLIT,$0-0
+TEXT runtime·morestack(SB),NOSPLIT|NOFRAME,$0-0
 	// Cannot grow scheduler stack (m->g0).
 	get_tls(CX)
 	MOVQ	g(CX), BX
@@ -571,6 +589,7 @@
 	MOVQ	m_g0(BX), BX
 	MOVQ	BX, g(CX)
 	MOVQ	(g_sched+gobuf_sp)(BX), SP
+	MOVQ	(g_sched+gobuf_bp)(BX), BP
 	CALL	runtime·newstack(SB)
 	CALL	runtime·abort(SB)	// crash if newstack returns
 	RET
@@ -762,18 +781,22 @@
 	RET
 
 
-TEXT ·publicationBarrier(SB),NOSPLIT,$0-0
+TEXT ·publicationBarrier<ABIInternal>(SB),NOSPLIT,$0-0
 	// Stores are already ordered on x86, so this is just a
 	// compile barrier.
 	RET
 
 // Save state of caller into g->sched,
 // but using fake PC from systemstack_switch.
-// Must only be called from functions with no locals ($0)
-// or else unwinding from systemstack_switch is incorrect.
+// Must only be called from functions with frame pointer
+// and without locals ($0) or else unwinding from
+// systemstack_switch is incorrect.
 // Smashes R9.
-TEXT gosave_systemstack_switch<>(SB),NOSPLIT,$0
-	MOVQ	$runtime·systemstack_switch(SB), R9
+TEXT gosave_systemstack_switch<>(SB),NOSPLIT|NOFRAME,$0
+	// Take systemstack_switch PC and add 8 bytes to skip
+	// the prologue. The final location does not matter
+	// as long as we are between the prologue and the epilogue.
+	MOVQ	$runtime·systemstack_switch+8(SB), R9
 	MOVQ	R9, (g_sched+gobuf_pc)(R14)
 	LEAQ	8(SP), R9
 	MOVQ	R9, (g_sched+gobuf_sp)(R14)
@@ -789,11 +812,10 @@
 // func asmcgocall_no_g(fn, arg unsafe.Pointer)
 // Call fn(arg) aligned appropriately for the gcc ABI.
 // Called on a system stack, and there may be no g yet (during needm).
-TEXT ·asmcgocall_no_g(SB),NOSPLIT,$0-16
+TEXT ·asmcgocall_no_g(SB),NOSPLIT,$32-16
 	MOVQ	fn+0(FP), AX
 	MOVQ	arg+8(FP), BX
 	MOVQ	SP, DX
-	SUBQ	$32, SP
 	ANDQ	$~15, SP	// alignment
 	MOVQ	DX, 8(SP)
 	MOVQ	BX, DI		// DI = first argument in AMD64 ABI
@@ -830,6 +852,8 @@
 	JEQ	nosave
 
 	// Switch to system stack.
+	// The original frame pointer is stored in BP,
+	// which is useful for stack unwinding.
 	CALL	gosave_systemstack_switch<>(SB)
 	MOVQ	SI, g(CX)
 	MOVQ	(g_sched+gobuf_sp)(SI), SP
@@ -894,7 +918,20 @@
 TEXT ·cgocallback(SB),NOSPLIT,$24-24
 	NO_LOCAL_POINTERS
 
-	// If g is nil, Go did not create the current thread.
+	// Skip cgocallbackg, just dropm when fn is nil, and frame is the saved g.
+	// It is used to dropm while thread is exiting.
+	MOVQ	fn+0(FP), AX
+	CMPQ	AX, $0
+	JNE	loadg
+	// Restore the g from frame.
+	get_tls(CX)
+	MOVQ	frame+8(FP), BX
+	MOVQ	BX, g(CX)
+	JMP	dropm
+
+loadg:
+	// If g is nil, Go did not create the current thread,
+	// or if this thread never called into Go on pthread platforms.
 	// Call needm to obtain one m for temporary use.
 	// In this case, we're running on the thread stack, so there's
 	// lots of space, but the linker doesn't know. Hide the call from
@@ -932,9 +969,9 @@
 	// a bad value in there, in case needm tries to use it.
 	XORPS	X15, X15
 	XORQ    R14, R14
-	MOVQ	$runtime·needm<ABIInternal>(SB), AX
+	MOVQ	$runtime·needAndBindM<ABIInternal>(SB), AX
 	CALL	AX
-	MOVQ	$0, savedm-8(SP) // dropm on return
+	MOVQ	$0, savedm-8(SP)
 	get_tls(CX)
 	MOVQ	g(CX), BX
 	MOVQ	g_m(BX), BX
@@ -1023,11 +1060,26 @@
 	MOVQ	0(SP), AX
 	MOVQ	AX, (g_sched+gobuf_sp)(SI)
 
-	// If the m on entry was nil, we called needm above to borrow an m
-	// for the duration of the call. Since the call is over, return it with dropm.
+	// If the m on entry was nil, we called needm above to borrow an m,
+	// 1. for the duration of the call on non-pthread platforms,
+	// 2. or the duration of the C thread alive on pthread platforms.
+	// If the m on entry wasn't nil,
+	// 1. the thread might be a Go thread,
+	// 2. or it wasn't the first call from a C thread on pthread platforms,
+	//    since then we skip dropm to reuse the m in the first call.
 	MOVQ	savedm-8(SP), BX
 	CMPQ	BX, $0
 	JNE	done
+
+	// Skip dropm to reuse it in the next call, when a pthread key has been created.
+	MOVQ	_cgo_pthread_key_created(SB), AX
+	// It means cgo is disabled when _cgo_pthread_key_created is a nil pointer, need dropm.
+	CMPQ	AX, $0
+	JEQ	dropm
+	CMPQ	(AX), $0
+	JNE	done
+
+dropm:
 	MOVQ	$runtime·dropm(SB), AX
 	CALL	AX
 #ifdef GOOS_windows
@@ -1063,7 +1115,7 @@
 	JMP	loop
 
 // check that SP is in range [g->stack.lo, g->stack.hi)
-TEXT runtime·stackcheck(SB), NOSPLIT, $0-0
+TEXT runtime·stackcheck(SB), NOSPLIT|NOFRAME, $0-0
 	get_tls(CX)
 	MOVQ	g(CX), AX
 	CMPQ	(g_stack+stack_hi)(AX), SP
@@ -1594,7 +1646,7 @@
 
 // The top-most function running on a goroutine
 // returns to goexit+PCQuantum.
-TEXT runtime·goexit(SB),NOSPLIT|TOPFRAME,$0-0
+TEXT runtime·goexit(SB),NOSPLIT|TOPFRAME|NOFRAME,$0-0
 	BYTE	$0x90	// NOP
 	CALL	runtime·goexit1(SB)	// does not return
 	// traceback from goexit1 must hit code range of goexit
@@ -1621,45 +1673,48 @@
 #endif
 	JMP	·sigpanic<ABIInternal>(SB)
 
-// gcWriteBarrier performs a heap pointer write and informs the GC.
+// gcWriteBarrier informs the GC about heap pointer writes.
 //
-// gcWriteBarrier does NOT follow the Go ABI. It takes two arguments:
-// - DI is the destination of the write
-// - AX is the value being written at DI
+// gcWriteBarrier returns space in a write barrier buffer which
+// should be filled in by the caller.
+// gcWriteBarrier does NOT follow the Go ABI. It accepts the
+// number of bytes of buffer needed in R11, and returns a pointer
+// to the buffer space in R11.
 // It clobbers FLAGS. It does not clobber any general-purpose registers,
 // but may clobber others (e.g., SSE registers).
-// Defined as ABIInternal since it does not use the stack-based Go ABI.
-TEXT runtime·gcWriteBarrier<ABIInternal>(SB),NOSPLIT,$112
+// Typical use would be, when doing *(CX+88) = AX
+//     CMPL    $0, runtime.writeBarrier(SB)
+//     JEQ     dowrite
+//     CALL    runtime.gcBatchBarrier2(SB)
+//     MOVQ    AX, (R11)
+//     MOVQ    88(CX), DX
+//     MOVQ    DX, 8(R11)
+// dowrite:
+//     MOVQ    AX, 88(CX)
+TEXT gcWriteBarrier<>(SB),NOSPLIT,$112
 	// Save the registers clobbered by the fast path. This is slightly
 	// faster than having the caller spill these.
 	MOVQ	R12, 96(SP)
 	MOVQ	R13, 104(SP)
+retry:
 	// TODO: Consider passing g.m.p in as an argument so they can be shared
 	// across a sequence of write barriers.
 	MOVQ	g_m(R14), R13
 	MOVQ	m_p(R13), R13
-	MOVQ	(p_wbBuf+wbBuf_next)(R13), R12
-	// Increment wbBuf.next position.
-	LEAQ	16(R12), R12
-	MOVQ	R12, (p_wbBuf+wbBuf_next)(R13)
+	// Get current buffer write position.
+	MOVQ	(p_wbBuf+wbBuf_next)(R13), R12	// original next position
+	ADDQ	R11, R12			// new next position
+	// Is the buffer full?
 	CMPQ	R12, (p_wbBuf+wbBuf_end)(R13)
-	// Record the write.
-	MOVQ	AX, -16(R12)	// Record value
-	// Note: This turns bad pointer writes into bad
-	// pointer reads, which could be confusing. We could avoid
-	// reading from obviously bad pointers, which would
-	// take care of the vast majority of these. We could
-	// patch this up in the signal handler, or use XCHG to
-	// combine the read and the write.
-	MOVQ	(DI), R13
-	MOVQ	R13, -8(R12)	// Record *slot
-	// Is the buffer full? (flags set in CMPQ above)
-	JEQ	flush
-ret:
+	JA	flush
+	// Commit to the larger buffer.
+	MOVQ	R12, (p_wbBuf+wbBuf_next)(R13)
+	// Make return value (the original next position)
+	SUBQ	R11, R12
+	MOVQ	R12, R11
+	// Restore registers.
 	MOVQ	96(SP), R12
 	MOVQ	104(SP), R13
-	// Do the write.
-	MOVQ	AX, (DI)
 	RET
 
 flush:
@@ -1675,8 +1730,8 @@
 	//
 	// TODO: We could strike a different balance; e.g., saving X0
 	// and not saving GP registers that are less likely to be used.
-	MOVQ	DI, 0(SP)	// Also first argument to wbBufFlush
-	MOVQ	AX, 8(SP)	// Also second argument to wbBufFlush
+	MOVQ	DI, 0(SP)
+	MOVQ	AX, 8(SP)
 	MOVQ	BX, 16(SP)
 	MOVQ	CX, 24(SP)
 	MOVQ	DX, 32(SP)
@@ -1692,7 +1747,6 @@
 	// R14 is g
 	MOVQ	R15, 88(SP)
 
-	// This takes arguments DI and AX
 	CALL	runtime·wbBufFlush(SB)
 
 	MOVQ	0(SP), DI
@@ -1707,63 +1761,32 @@
 	MOVQ	72(SP), R10
 	MOVQ	80(SP), R11
 	MOVQ	88(SP), R15
-	JMP	ret
+	JMP	retry
 
-// gcWriteBarrierCX is gcWriteBarrier, but with args in DI and CX.
-// Defined as ABIInternal since it does not use the stable Go ABI.
-TEXT runtime·gcWriteBarrierCX<ABIInternal>(SB),NOSPLIT,$0
-	XCHGQ CX, AX
-	CALL runtime·gcWriteBarrier<ABIInternal>(SB)
-	XCHGQ CX, AX
-	RET
-
-// gcWriteBarrierDX is gcWriteBarrier, but with args in DI and DX.
-// Defined as ABIInternal since it does not use the stable Go ABI.
-TEXT runtime·gcWriteBarrierDX<ABIInternal>(SB),NOSPLIT,$0
-	XCHGQ DX, AX
-	CALL runtime·gcWriteBarrier<ABIInternal>(SB)
-	XCHGQ DX, AX
-	RET
-
-// gcWriteBarrierBX is gcWriteBarrier, but with args in DI and BX.
-// Defined as ABIInternal since it does not use the stable Go ABI.
-TEXT runtime·gcWriteBarrierBX<ABIInternal>(SB),NOSPLIT,$0
-	XCHGQ BX, AX
-	CALL runtime·gcWriteBarrier<ABIInternal>(SB)
-	XCHGQ BX, AX
-	RET
-
-// gcWriteBarrierBP is gcWriteBarrier, but with args in DI and BP.
-// Defined as ABIInternal since it does not use the stable Go ABI.
-TEXT runtime·gcWriteBarrierBP<ABIInternal>(SB),NOSPLIT,$0
-	XCHGQ BP, AX
-	CALL runtime·gcWriteBarrier<ABIInternal>(SB)
-	XCHGQ BP, AX
-	RET
-
-// gcWriteBarrierSI is gcWriteBarrier, but with args in DI and SI.
-// Defined as ABIInternal since it does not use the stable Go ABI.
-TEXT runtime·gcWriteBarrierSI<ABIInternal>(SB),NOSPLIT,$0
-	XCHGQ SI, AX
-	CALL runtime·gcWriteBarrier<ABIInternal>(SB)
-	XCHGQ SI, AX
-	RET
-
-// gcWriteBarrierR8 is gcWriteBarrier, but with args in DI and R8.
-// Defined as ABIInternal since it does not use the stable Go ABI.
-TEXT runtime·gcWriteBarrierR8<ABIInternal>(SB),NOSPLIT,$0
-	XCHGQ R8, AX
-	CALL runtime·gcWriteBarrier<ABIInternal>(SB)
-	XCHGQ R8, AX
-	RET
-
-// gcWriteBarrierR9 is gcWriteBarrier, but with args in DI and R9.
-// Defined as ABIInternal since it does not use the stable Go ABI.
-TEXT runtime·gcWriteBarrierR9<ABIInternal>(SB),NOSPLIT,$0
-	XCHGQ R9, AX
-	CALL runtime·gcWriteBarrier<ABIInternal>(SB)
-	XCHGQ R9, AX
-	RET
+TEXT runtime·gcWriteBarrier1<ABIInternal>(SB),NOSPLIT|NOFRAME,$0
+	MOVL   $8, R11
+	JMP     gcWriteBarrier<>(SB)
+TEXT runtime·gcWriteBarrier2<ABIInternal>(SB),NOSPLIT|NOFRAME,$0
+	MOVL   $16, R11
+	JMP     gcWriteBarrier<>(SB)
+TEXT runtime·gcWriteBarrier3<ABIInternal>(SB),NOSPLIT|NOFRAME,$0
+	MOVL   $24, R11
+	JMP     gcWriteBarrier<>(SB)
+TEXT runtime·gcWriteBarrier4<ABIInternal>(SB),NOSPLIT|NOFRAME,$0
+	MOVL   $32, R11
+	JMP     gcWriteBarrier<>(SB)
+TEXT runtime·gcWriteBarrier5<ABIInternal>(SB),NOSPLIT|NOFRAME,$0
+	MOVL   $40, R11
+	JMP     gcWriteBarrier<>(SB)
+TEXT runtime·gcWriteBarrier6<ABIInternal>(SB),NOSPLIT|NOFRAME,$0
+	MOVL   $48, R11
+	JMP     gcWriteBarrier<>(SB)
+TEXT runtime·gcWriteBarrier7<ABIInternal>(SB),NOSPLIT|NOFRAME,$0
+	MOVL   $56, R11
+	JMP     gcWriteBarrier<>(SB)
+TEXT runtime·gcWriteBarrier8<ABIInternal>(SB),NOSPLIT|NOFRAME,$0
+	MOVL   $64, R11
+	JMP     gcWriteBarrier<>(SB)
 
 DATA	debugCallFrameTooLarge<>+0x00(SB)/20, $"call frame too large"
 GLOBL	debugCallFrameTooLarge<>(SB), RODATA, $20	// Size duplicated below
@@ -2048,19 +2071,23 @@
 	                        BYTE $0x04|((reg&7)<<3); BYTE $0x24;			\
 	/*   RET */             BYTE $0xC3
 
-TEXT runtime·retpolineAX(SB),NOSPLIT,$0; RETPOLINE(0)
-TEXT runtime·retpolineCX(SB),NOSPLIT,$0; RETPOLINE(1)
-TEXT runtime·retpolineDX(SB),NOSPLIT,$0; RETPOLINE(2)
-TEXT runtime·retpolineBX(SB),NOSPLIT,$0; RETPOLINE(3)
+TEXT runtime·retpolineAX(SB),NOSPLIT|NOFRAME,$0; RETPOLINE(0)
+TEXT runtime·retpolineCX(SB),NOSPLIT|NOFRAME,$0; RETPOLINE(1)
+TEXT runtime·retpolineDX(SB),NOSPLIT|NOFRAME,$0; RETPOLINE(2)
+TEXT runtime·retpolineBX(SB),NOSPLIT|NOFRAME,$0; RETPOLINE(3)
 /* SP is 4, can't happen / magic encodings */
-TEXT runtime·retpolineBP(SB),NOSPLIT,$0; RETPOLINE(5)
-TEXT runtime·retpolineSI(SB),NOSPLIT,$0; RETPOLINE(6)
-TEXT runtime·retpolineDI(SB),NOSPLIT,$0; RETPOLINE(7)
-TEXT runtime·retpolineR8(SB),NOSPLIT,$0; RETPOLINE(8)
-TEXT runtime·retpolineR9(SB),NOSPLIT,$0; RETPOLINE(9)
-TEXT runtime·retpolineR10(SB),NOSPLIT,$0; RETPOLINE(10)
-TEXT runtime·retpolineR11(SB),NOSPLIT,$0; RETPOLINE(11)
-TEXT runtime·retpolineR12(SB),NOSPLIT,$0; RETPOLINE(12)
-TEXT runtime·retpolineR13(SB),NOSPLIT,$0; RETPOLINE(13)
-TEXT runtime·retpolineR14(SB),NOSPLIT,$0; RETPOLINE(14)
-TEXT runtime·retpolineR15(SB),NOSPLIT,$0; RETPOLINE(15)
+TEXT runtime·retpolineBP(SB),NOSPLIT|NOFRAME,$0; RETPOLINE(5)
+TEXT runtime·retpolineSI(SB),NOSPLIT|NOFRAME,$0; RETPOLINE(6)
+TEXT runtime·retpolineDI(SB),NOSPLIT|NOFRAME,$0; RETPOLINE(7)
+TEXT runtime·retpolineR8(SB),NOSPLIT|NOFRAME,$0; RETPOLINE(8)
+TEXT runtime·retpolineR9(SB),NOSPLIT|NOFRAME,$0; RETPOLINE(9)
+TEXT runtime·retpolineR10(SB),NOSPLIT|NOFRAME,$0; RETPOLINE(10)
+TEXT runtime·retpolineR11(SB),NOSPLIT|NOFRAME,$0; RETPOLINE(11)
+TEXT runtime·retpolineR12(SB),NOSPLIT|NOFRAME,$0; RETPOLINE(12)
+TEXT runtime·retpolineR13(SB),NOSPLIT|NOFRAME,$0; RETPOLINE(13)
+TEXT runtime·retpolineR14(SB),NOSPLIT|NOFRAME,$0; RETPOLINE(14)
+TEXT runtime·retpolineR15(SB),NOSPLIT|NOFRAME,$0; RETPOLINE(15)
+
+TEXT ·getfp<ABIInternal>(SB),NOSPLIT|NOFRAME,$0
+	MOVQ BP, AX
+	RET
diff --git a/src/runtime/asm_arm.s b/src/runtime/asm_arm.s
index 591ef2a..e3206a1 100644
--- a/src/runtime/asm_arm.s
+++ b/src/runtime/asm_arm.s
@@ -151,7 +151,7 @@
 
 	// update stackguard after _cgo_init
 	MOVW	(g_stack+stack_lo)(g), R0
-	ADD	$const__StackGuard, R0
+	ADD	$const_stackGuard, R0
 	MOVW	R0, g_stackguard0(g)
 	MOVW	R0, g_stackguard1(g)
 
@@ -630,6 +630,16 @@
 TEXT	·cgocallback(SB),NOSPLIT,$12-12
 	NO_LOCAL_POINTERS
 
+	// Skip cgocallbackg, just dropm when fn is nil, and frame is the saved g.
+	// It is used to dropm while thread is exiting.
+	MOVW	fn+0(FP), R1
+	CMP	$0, R1
+	B.NE	loadg
+	// Restore the g from frame.
+	MOVW	frame+4(FP), g
+	B	dropm
+
+loadg:
 	// Load m and g from thread-local storage.
 #ifdef GOOS_openbsd
 	BL	runtime·load_g(SB)
@@ -639,7 +649,8 @@
 	BL.NE	runtime·load_g(SB)
 #endif
 
-	// If g is nil, Go did not create the current thread.
+	// If g is nil, Go did not create the current thread,
+	// or if this thread never called into Go on pthread platforms.
 	// Call needm to obtain one for temporary use.
 	// In this case, we're running on the thread stack, so there's
 	// lots of space, but the linker doesn't know. Hide the call from
@@ -653,7 +664,7 @@
 
 needm:
 	MOVW	g, savedm-4(SP) // g is zero, so is m.
-	MOVW	$runtime·needm(SB), R0
+	MOVW	$runtime·needAndBindM(SB), R0
 	BL	(R0)
 
 	// Set m->g0->sched.sp = SP, so that if a panic happens
@@ -724,14 +735,31 @@
 	MOVW	savedsp-12(SP), R4	// must match frame size
 	MOVW	R4, (g_sched+gobuf_sp)(g)
 
-	// If the m on entry was nil, we called needm above to borrow an m
-	// for the duration of the call. Since the call is over, return it with dropm.
+	// If the m on entry was nil, we called needm above to borrow an m,
+	// 1. for the duration of the call on non-pthread platforms,
+	// 2. or the duration of the C thread alive on pthread platforms.
+	// If the m on entry wasn't nil,
+	// 1. the thread might be a Go thread,
+	// 2. or it wasn't the first call from a C thread on pthread platforms,
+	//    since then we skip dropm to reuse the m in the first call.
 	MOVW	savedm-4(SP), R6
 	CMP	$0, R6
-	B.NE	3(PC)
+	B.NE	done
+
+	// Skip dropm to reuse it in the next call, when a pthread key has been created.
+	MOVW	_cgo_pthread_key_created(SB), R6
+	// It means cgo is disabled when _cgo_pthread_key_created is a nil pointer, need dropm.
+	CMP	$0, R6
+	B.EQ	dropm
+	MOVW	(R6), R6
+	CMP	$0, R6
+	B.NE	done
+
+dropm:
 	MOVW	$runtime·dropm(SB), R0
 	BL	(R0)
 
+done:
 	// Done!
 	RET
 
@@ -870,36 +898,34 @@
 	MOVB	R3, ret+0(FP)
 	RET
 
-// gcWriteBarrier performs a heap pointer write and informs the GC.
+// gcWriteBarrier informs the GC about heap pointer writes.
 //
-// gcWriteBarrier does NOT follow the Go ABI. It takes two arguments:
-// - R2 is the destination of the write
-// - R3 is the value being written at R2
+// gcWriteBarrier does NOT follow the Go ABI. It accepts the
+// number of bytes of buffer needed in R8, and returns a pointer
+// to the buffer space in R8.
 // It clobbers condition codes.
 // It does not clobber any other general-purpose registers,
 // but may clobber others (e.g., floating point registers).
 // The act of CALLing gcWriteBarrier will clobber R14 (LR).
-TEXT runtime·gcWriteBarrier(SB),NOSPLIT|NOFRAME,$0
+TEXT gcWriteBarrier<>(SB),NOSPLIT|NOFRAME,$0
 	// Save the registers clobbered by the fast path.
 	MOVM.DB.W	[R0,R1], (R13)
+retry:
 	MOVW	g_m(g), R0
 	MOVW	m_p(R0), R0
 	MOVW	(p_wbBuf+wbBuf_next)(R0), R1
+	MOVW	(p_wbBuf+wbBuf_end)(R0), R11
 	// Increment wbBuf.next position.
-	ADD	$8, R1
+	ADD	R8, R1
+	// Is the buffer full?
+	CMP	R11, R1
+	BHI	flush
+	// Commit to the larger buffer.
 	MOVW	R1, (p_wbBuf+wbBuf_next)(R0)
-	MOVW	(p_wbBuf+wbBuf_end)(R0), R0
-	CMP	R1, R0
-	// Record the write.
-	MOVW	R3, -8(R1)	// Record value
-	MOVW	(R2), R0	// TODO: This turns bad writes into bad reads.
-	MOVW	R0, -4(R1)	// Record *slot
-	// Is the buffer full? (flags set in CMP above)
-	B.EQ	flush
-ret:
+	// Make return value (the original next position)
+	SUB	R8, R1, R8
+	// Restore registers.
 	MOVM.IA.W	(R13), [R0,R1]
-	// Do the write.
-	MOVW	R3, (R2)
 	RET
 
 flush:
@@ -911,20 +937,41 @@
 	// R11 is linker temp, so no need to save.
 	// R13 is stack pointer.
 	// R15 is PC.
-	//
-	// This also sets up R2 and R3 as the arguments to wbBufFlush.
 	MOVM.DB.W	[R2-R9,R12], (R13)
 	// Save R14 (LR) because the fast path above doesn't save it,
-	// but needs it to RET. This is after the MOVM so it appears below
-	// the arguments in the stack frame.
+	// but needs it to RET.
 	MOVM.DB.W	[R14], (R13)
 
-	// This takes arguments R2 and R3.
 	CALL	runtime·wbBufFlush(SB)
 
 	MOVM.IA.W	(R13), [R14]
 	MOVM.IA.W	(R13), [R2-R9,R12]
-	JMP	ret
+	JMP	retry
+
+TEXT runtime·gcWriteBarrier1<ABIInternal>(SB),NOSPLIT,$0
+	MOVW	$4, R8
+	JMP	gcWriteBarrier<>(SB)
+TEXT runtime·gcWriteBarrier2<ABIInternal>(SB),NOSPLIT,$0
+	MOVW	$8, R8
+	JMP	gcWriteBarrier<>(SB)
+TEXT runtime·gcWriteBarrier3<ABIInternal>(SB),NOSPLIT,$0
+	MOVW	$12, R8
+	JMP	gcWriteBarrier<>(SB)
+TEXT runtime·gcWriteBarrier4<ABIInternal>(SB),NOSPLIT,$0
+	MOVW	$16, R8
+	JMP	gcWriteBarrier<>(SB)
+TEXT runtime·gcWriteBarrier5<ABIInternal>(SB),NOSPLIT,$0
+	MOVW	$20, R8
+	JMP	gcWriteBarrier<>(SB)
+TEXT runtime·gcWriteBarrier6<ABIInternal>(SB),NOSPLIT,$0
+	MOVW	$24, R8
+	JMP	gcWriteBarrier<>(SB)
+TEXT runtime·gcWriteBarrier7<ABIInternal>(SB),NOSPLIT,$0
+	MOVW	$28, R8
+	JMP	gcWriteBarrier<>(SB)
+TEXT runtime·gcWriteBarrier8<ABIInternal>(SB),NOSPLIT,$0
+	MOVW	$32, R8
+	JMP	gcWriteBarrier<>(SB)
 
 // Note: these functions use a special calling convention to save generated code space.
 // Arguments are passed in registers, but the space for those arguments are allocated
diff --git a/src/runtime/asm_arm64.s b/src/runtime/asm_arm64.s
index 7eb5bcf..7866e35 100644
--- a/src/runtime/asm_arm64.s
+++ b/src/runtime/asm_arm64.s
@@ -59,7 +59,7 @@
 	BL	runtime·save_g(SB)
 	// update stackguard after _cgo_init
 	MOVD	(g_stack+stack_lo)(g), R0
-	ADD	$const__StackGuard, R0
+	ADD	$const_stackGuard, R0
 	MOVD	R0, g_stackguard0(g)
 	MOVD	R0, g_stackguard1(g)
 
@@ -611,6 +611,7 @@
 	AESE	V0.B16, V2.B16
 	AESMC	V2.B16, V2.B16
 	AESE	V0.B16, V2.B16
+	AESMC	V2.B16, V2.B16
 
 	VMOV	V2.D[0], R0
 	RET
@@ -1014,10 +1015,20 @@
 TEXT ·cgocallback(SB),NOSPLIT,$24-24
 	NO_LOCAL_POINTERS
 
+	// Skip cgocallbackg, just dropm when fn is nil, and frame is the saved g.
+	// It is used to dropm while thread is exiting.
+	MOVD	fn+0(FP), R1
+	CBNZ	R1, loadg
+	// Restore the g from frame.
+	MOVD	frame+8(FP), g
+	B	dropm
+
+loadg:
 	// Load g from thread-local storage.
 	BL	runtime·load_g(SB)
 
-	// If g is nil, Go did not create the current thread.
+	// If g is nil, Go did not create the current thread,
+	// or if this thread never called into Go on pthread platforms.
 	// Call needm to obtain one for temporary use.
 	// In this case, we're running on the thread stack, so there's
 	// lots of space, but the linker doesn't know. Hide the call from
@@ -1030,7 +1041,7 @@
 
 needm:
 	MOVD	g, savedm-8(SP) // g is zero, so is m.
-	MOVD	$runtime·needm(SB), R0
+	MOVD	$runtime·needAndBindM(SB), R0
 	BL	(R0)
 
 	// Set m->g0->sched.sp = SP, so that if a panic happens
@@ -1111,10 +1122,24 @@
 	MOVD	savedsp-16(SP), R4
 	MOVD	R4, (g_sched+gobuf_sp)(g)
 
-	// If the m on entry was nil, we called needm above to borrow an m
-	// for the duration of the call. Since the call is over, return it with dropm.
+	// If the m on entry was nil, we called needm above to borrow an m,
+	// 1. for the duration of the call on non-pthread platforms,
+	// 2. or the duration of the C thread alive on pthread platforms.
+	// If the m on entry wasn't nil,
+	// 1. the thread might be a Go thread,
+	// 2. or it wasn't the first call from a C thread on pthread platforms,
+	//    since then we skip dropm to reuse the m in the first call.
 	MOVD	savedm-8(SP), R6
 	CBNZ	R6, droppedm
+
+	// Skip dropm to reuse it in the next call, when a pthread key has been created.
+	MOVD	_cgo_pthread_key_created(SB), R6
+	// It means cgo is disabled when _cgo_pthread_key_created is a nil pointer, need dropm.
+	CBZ	R6, dropm
+	MOVD	(R6), R6
+	CBNZ	R6, droppedm
+
+dropm:
 	MOVD	$runtime·dropm(SB), R0
 	BL	(R0)
 droppedm:
@@ -1188,46 +1213,41 @@
 	MOVB	R3, ret+0(FP)
 	RET
 
-// gcWriteBarrier performs a heap pointer write and informs the GC.
+// gcWriteBarrier informs the GC about heap pointer writes.
 //
-// gcWriteBarrier does NOT follow the Go ABI. It takes two arguments:
-// - R2 is the destination of the write
-// - R3 is the value being written at R2
+// gcWriteBarrier does NOT follow the Go ABI. It accepts the
+// number of bytes of buffer needed in R25, and returns a pointer
+// to the buffer space in R25.
 // It clobbers condition codes.
-// It does not clobber any general-purpose registers,
+// It does not clobber any general-purpose registers except R27,
 // but may clobber others (e.g., floating point registers)
 // The act of CALLing gcWriteBarrier will clobber R30 (LR).
-//
-// Defined as ABIInternal since the compiler generates ABIInternal
-// calls to it directly and it does not use the stack-based Go ABI.
-TEXT runtime·gcWriteBarrier<ABIInternal>(SB),NOSPLIT,$200
+TEXT gcWriteBarrier<>(SB),NOSPLIT,$200
 	// Save the registers clobbered by the fast path.
 	STP	(R0, R1), 184(RSP)
+retry:
 	MOVD	g_m(g), R0
 	MOVD	m_p(R0), R0
 	MOVD	(p_wbBuf+wbBuf_next)(R0), R1
+	MOVD	(p_wbBuf+wbBuf_end)(R0), R27
 	// Increment wbBuf.next position.
-	ADD	$16, R1
+	ADD	R25, R1
+	// Is the buffer full?
+	CMP	R27, R1
+	BHI	flush
+	// Commit to the larger buffer.
 	MOVD	R1, (p_wbBuf+wbBuf_next)(R0)
-	MOVD	(p_wbBuf+wbBuf_end)(R0), R0
-	CMP	R1, R0
-	// Record the write.
-	MOVD	R3, -16(R1)	// Record value
-	MOVD	(R2), R0	// TODO: This turns bad writes into bad reads.
-	MOVD	R0, -8(R1)	// Record *slot
-	// Is the buffer full? (flags set in CMP above)
-	BEQ	flush
-ret:
+	// Make return value (the original next position)
+	SUB	R25, R1, R25
+	// Restore registers.
 	LDP	184(RSP), (R0, R1)
-	// Do the write.
-	MOVD	R3, (R2)
 	RET
 
 flush:
 	// Save all general purpose registers since these could be
 	// clobbered by wbBufFlush and were not saved by the caller.
 	// R0 and R1 already saved
-	STP	(R2, R3), 1*8(RSP)	// Also first and second arguments to wbBufFlush
+	STP	(R2, R3), 1*8(RSP)
 	STP	(R4, R5), 3*8(RSP)
 	STP	(R6, R7), 5*8(RSP)
 	STP	(R8, R9), 7*8(RSP)
@@ -1246,7 +1266,6 @@
 	// R30 is LR, which was saved by the prologue.
 	// R31 is SP.
 
-	// This takes arguments R2 and R3.
 	CALL	runtime·wbBufFlush(SB)
 	LDP	1*8(RSP), (R2, R3)
 	LDP	3*8(RSP), (R4, R5)
@@ -1259,7 +1278,32 @@
 	LDP	17*8(RSP), (R21, R22)
 	LDP	19*8(RSP), (R23, R24)
 	LDP	21*8(RSP), (R25, R26)
-	JMP	ret
+	JMP	retry
+
+TEXT runtime·gcWriteBarrier1<ABIInternal>(SB),NOSPLIT,$0
+	MOVD	$8, R25
+	JMP	gcWriteBarrier<>(SB)
+TEXT runtime·gcWriteBarrier2<ABIInternal>(SB),NOSPLIT,$0
+	MOVD	$16, R25
+	JMP	gcWriteBarrier<>(SB)
+TEXT runtime·gcWriteBarrier3<ABIInternal>(SB),NOSPLIT,$0
+	MOVD	$24, R25
+	JMP	gcWriteBarrier<>(SB)
+TEXT runtime·gcWriteBarrier4<ABIInternal>(SB),NOSPLIT,$0
+	MOVD	$32, R25
+	JMP	gcWriteBarrier<>(SB)
+TEXT runtime·gcWriteBarrier5<ABIInternal>(SB),NOSPLIT,$0
+	MOVD	$40, R25
+	JMP	gcWriteBarrier<>(SB)
+TEXT runtime·gcWriteBarrier6<ABIInternal>(SB),NOSPLIT,$0
+	MOVD	$48, R25
+	JMP	gcWriteBarrier<>(SB)
+TEXT runtime·gcWriteBarrier7<ABIInternal>(SB),NOSPLIT,$0
+	MOVD	$56, R25
+	JMP	gcWriteBarrier<>(SB)
+TEXT runtime·gcWriteBarrier8<ABIInternal>(SB),NOSPLIT,$0
+	MOVD	$64, R25
+	JMP	gcWriteBarrier<>(SB)
 
 DATA	debugCallFrameTooLarge<>+0x00(SB)/20, $"call frame too large"
 GLOBL	debugCallFrameTooLarge<>(SB), RODATA, $20	// Size duplicated below
@@ -1523,3 +1567,7 @@
 	MOVD	R2, R0
 	MOVD	R3, R1
 	JMP	runtime·goPanicSliceConvert<ABIInternal>(SB)
+
+TEXT ·getfp<ABIInternal>(SB),NOSPLIT|NOFRAME,$0
+	MOVD R29, R0
+	RET
diff --git a/src/runtime/asm_loong64.s b/src/runtime/asm_loong64.s
index a6ccd19..6ffa139 100644
--- a/src/runtime/asm_loong64.s
+++ b/src/runtime/asm_loong64.s
@@ -39,7 +39,7 @@
 nocgo:
 	// update stackguard after _cgo_init
 	MOVV	(g_stack+stack_lo)(g), R19
-	ADDV	$const__StackGuard, R19
+	ADDV	$const_stackGuard, R19
 	MOVV	R19, g_stackguard0(g)
 	MOVV	R19, g_stackguard1(g)
 
@@ -83,8 +83,14 @@
 	RET
 
 TEXT runtime·mstart(SB),NOSPLIT|TOPFRAME,$0
-        JAL     runtime·mstart0(SB)
-        RET // not reached
+	JAL     runtime·mstart0(SB)
+	RET // not reached
+
+// func cputicks() int64
+TEXT runtime·cputicks(SB),NOSPLIT,$0-8
+	RDTIMED	R0, R4
+	MOVV	R4, ret+0(FP)
+	RET
 
 /*
  *  go-routine
@@ -122,7 +128,6 @@
 	MOVV	R3, (g_sched+gobuf_sp)(g)
 	MOVV	R1, (g_sched+gobuf_pc)(g)
 	MOVV	R0, (g_sched+gobuf_lr)(g)
-	MOVV	g, (g_sched+gobuf_g)(g)
 
 	// Switch to m->g0 & its stack, call fn.
 	MOVV	g, R19
@@ -180,10 +185,6 @@
 	MOVV	R5, g
 	JAL	runtime·save_g(SB)
 	MOVV	(g_sched+gobuf_sp)(g), R19
-	// make it look like mstart called systemstack on g0, to stop traceback
-	ADDV	$-8, R19
-	MOVV	$runtime·mstart(SB), R6
-	MOVV	R6, 0(R19)
 	MOVV	R19, R3
 
 	// call target function
@@ -260,6 +261,13 @@
 	UNDEF
 
 TEXT runtime·morestack_noctxt(SB),NOSPLIT|NOFRAME,$0-0
+	// Force SPWRITE. This function doesn't actually write SP,
+	// but it is called with a special calling convention where
+	// the caller doesn't save LR on stack but passes it as a
+	// register (R5), and the unwinder currently doesn't understand.
+	// Make it SPWRITE to stop unwinding. (See issue 54332)
+	MOVV    R3, R3
+
 	MOVV	R0, REGCTXT
 	JMP	runtime·morestack(SB)
 
@@ -452,13 +460,23 @@
 TEXT ·cgocallback(SB),NOSPLIT,$24-24
 	NO_LOCAL_POINTERS
 
+	// Skip cgocallbackg, just dropm when fn is nil, and frame is the saved g.
+	// It is used to dropm while thread is exiting.
+	MOVV    fn+0(FP), R5
+	BNE	R5, loadg
+	// Restore the g from frame.
+	MOVV    frame+8(FP), g
+	JMP	dropm
+
+loadg:
 	// Load m and g from thread-local storage.
 	MOVB	runtime·iscgo(SB), R19
 	BEQ	R19, nocgo
 	JAL	runtime·load_g(SB)
 nocgo:
 
-	// If g is nil, Go did not create the current thread.
+	// If g is nil, Go did not create the current thread,
+	// or if this thread never called into Go on pthread platforms.
 	// Call needm to obtain one for temporary use.
 	// In this case, we're running on the thread stack, so there's
 	// lots of space, but the linker doesn't know. Hide the call from
@@ -471,7 +489,7 @@
 
 needm:
 	MOVV	g, savedm-8(SP) // g is zero, so is m.
-	MOVV	$runtime·needm(SB), R4
+	MOVV	$runtime·needAndBindM(SB), R4
 	JAL	(R4)
 
 	// Set m->sched.sp = SP, so that if a panic happens
@@ -543,10 +561,24 @@
 	MOVV	savedsp-24(SP), R13 // must match frame size
 	MOVV	R13, (g_sched+gobuf_sp)(g)
 
-	// If the m on entry was nil, we called needm above to borrow an m
-	// for the duration of the call. Since the call is over, return it with dropm.
+	// If the m on entry was nil, we called needm above to borrow an m,
+	// 1. for the duration of the call on non-pthread platforms,
+	// 2. or the duration of the C thread alive on pthread platforms.
+	// If the m on entry wasn't nil,
+	// 1. the thread might be a Go thread,
+	// 2. or it wasn't the first call from a C thread on pthread platforms,
+	//    since then we skip dropm to reuse the m in the first call.
 	MOVV	savedm-8(SP), R12
 	BNE	R12, droppedm
+
+	// Skip dropm to reuse it in the next call, when a pthread key has been created.
+	MOVV	_cgo_pthread_key_created(SB), R12
+	// It means cgo is disabled when _cgo_pthread_key_created is a nil pointer, need dropm.
+	BEQ	R12, dropm
+	MOVV    (R12), R12
+	BNE	R12, droppedm
+
+dropm:
 	MOVV	$runtime·dropm(SB), R4
 	JAL	(R4)
 droppedm:
@@ -605,55 +637,52 @@
 // The top-most function running on a goroutine
 // returns to goexit+PCQuantum.
 TEXT runtime·goexit(SB),NOSPLIT|NOFRAME|TOPFRAME,$0-0
-	NOR	R0, R0	// NOP
+	NOOP
 	JAL	runtime·goexit1(SB)	// does not return
 	// traceback from goexit1 must hit code range of goexit
-	NOR	R0, R0	// NOP
+	NOOP
 
 TEXT ·checkASM(SB),NOSPLIT,$0-1
 	MOVW	$1, R19
 	MOVB	R19, ret+0(FP)
 	RET
 
-// gcWriteBarrier performs a heap pointer write and informs the GC.
+// gcWriteBarrier informs the GC about heap pointer writes.
 //
-// gcWriteBarrier does NOT follow the Go ABI. It takes two arguments:
-// - R27 is the destination of the write
-// - R28 is the value being written at R27.
+// gcWriteBarrier does NOT follow the Go ABI. It accepts the
+// number of bytes of buffer needed in R29, and returns a pointer
+// to the buffer space in R29.
 // It clobbers R30 (the linker temp register).
 // The act of CALLing gcWriteBarrier will clobber R1 (LR).
 // It does not clobber any other general-purpose registers,
 // but may clobber others (e.g., floating point registers).
-TEXT runtime·gcWriteBarrier(SB),NOSPLIT,$216
+TEXT gcWriteBarrier<>(SB),NOSPLIT,$216
 	// Save the registers clobbered by the fast path.
 	MOVV	R19, 208(R3)
 	MOVV	R13, 216(R3)
+retry:
 	MOVV	g_m(g), R19
 	MOVV	m_p(R19), R19
 	MOVV	(p_wbBuf+wbBuf_next)(R19), R13
+	MOVV	(p_wbBuf+wbBuf_end)(R19), R30 // R30 is linker temp register
 	// Increment wbBuf.next position.
-	ADDV	$16, R13
-	MOVV	R13, (p_wbBuf+wbBuf_next)(R19)
-	MOVV	(p_wbBuf+wbBuf_end)(R19), R19
-	MOVV	R19, R30		// R30 is linker temp register
-	// Record the write.
-	MOVV	R28, -16(R13)	// Record value
-	MOVV	(R27), R19	// TODO: This turns bad writes into bad reads.
-	MOVV	R19, -8(R13)	// Record *slot
+	ADDV	R29, R13
 	// Is the buffer full?
-	BEQ	R13, R30, flush
-ret:
+	BLTU	R30, R13, flush
+	// Commit to the larger buffer.
+	MOVV	R13, (p_wbBuf+wbBuf_next)(R19)
+	// Make return value (the original next position)
+	SUBV	R29, R13, R29
+	// Restore registers.
 	MOVV	208(R3), R19
 	MOVV	216(R3), R13
-	// Do the write.
-	MOVV	R28, (R27)
 	RET
 
 flush:
 	// Save all general purpose registers since these could be
 	// clobbered by wbBufFlush and were not saved by the caller.
-	MOVV	R27, 8(R3)	// Also first argument to wbBufFlush
-	MOVV	R28, 16(R3)	// Also second argument to wbBufFlush
+	MOVV	R27, 8(R3)
+	MOVV	R28, 16(R3)
 	// R1 is LR, which was saved by the prologue.
 	MOVV	R2, 24(R3)
 	// R3 is SP.
@@ -686,8 +715,6 @@
 	// R30 is tmp register.
 	MOVV	R31, 200(R3)
 
-
-	// This takes arguments R27 and R28.
 	CALL	runtime·wbBufFlush(SB)
 
 	MOVV	8(R3), R27
@@ -715,7 +742,32 @@
 	MOVV	184(R3), R26
 	MOVV	192(R3), R29
 	MOVV	200(R3), R31
-	JMP	ret
+	JMP	retry
+
+TEXT runtime·gcWriteBarrier1<ABIInternal>(SB),NOSPLIT,$0
+	MOVV	$8, R29
+	JMP	gcWriteBarrier<>(SB)
+TEXT runtime·gcWriteBarrier2<ABIInternal>(SB),NOSPLIT,$0
+	MOVV	$16, R29
+	JMP	gcWriteBarrier<>(SB)
+TEXT runtime·gcWriteBarrier3<ABIInternal>(SB),NOSPLIT,$0
+	MOVV	$24, R29
+	JMP	gcWriteBarrier<>(SB)
+TEXT runtime·gcWriteBarrier4<ABIInternal>(SB),NOSPLIT,$0
+	MOVV	$32, R29
+	JMP	gcWriteBarrier<>(SB)
+TEXT runtime·gcWriteBarrier5<ABIInternal>(SB),NOSPLIT,$0
+	MOVV	$40, R29
+	JMP	gcWriteBarrier<>(SB)
+TEXT runtime·gcWriteBarrier6<ABIInternal>(SB),NOSPLIT,$0
+	MOVV	$48, R29
+	JMP	gcWriteBarrier<>(SB)
+TEXT runtime·gcWriteBarrier7<ABIInternal>(SB),NOSPLIT,$0
+	MOVV	$56, R29
+	JMP	gcWriteBarrier<>(SB)
+TEXT runtime·gcWriteBarrier8<ABIInternal>(SB),NOSPLIT,$0
+	MOVV	$64, R29
+	JMP	gcWriteBarrier<>(SB)
 
 // Note: these functions use a special calling convention to save generated code space.
 // Arguments are passed in registers, but the space for those arguments are allocated
diff --git a/src/runtime/asm_mips64x.s b/src/runtime/asm_mips64x.s
index 1abadb9..19592b5 100644
--- a/src/runtime/asm_mips64x.s
+++ b/src/runtime/asm_mips64x.s
@@ -41,7 +41,7 @@
 nocgo:
 	// update stackguard after _cgo_init
 	MOVV	(g_stack+stack_lo)(g), R1
-	ADDV	$const__StackGuard, R1
+	ADDV	$const_stackGuard, R1
 	MOVV	R1, g_stackguard0(g)
 	MOVV	R1, g_stackguard1(g)
 
@@ -469,13 +469,23 @@
 TEXT ·cgocallback(SB),NOSPLIT,$24-24
 	NO_LOCAL_POINTERS
 
+	// Skip cgocallbackg, just dropm when fn is nil, and frame is the saved g.
+	// It is used to dropm while thread is exiting.
+	MOVV	fn+0(FP), R5
+	BNE	R5, loadg
+	// Restore the g from frame.
+	MOVV	frame+8(FP), g
+	JMP	dropm
+
+loadg:
 	// Load m and g from thread-local storage.
 	MOVB	runtime·iscgo(SB), R1
 	BEQ	R1, nocgo
 	JAL	runtime·load_g(SB)
 nocgo:
 
-	// If g is nil, Go did not create the current thread.
+	// If g is nil, Go did not create the current thread,
+	// or if this thread never called into Go on pthread platforms.
 	// Call needm to obtain one for temporary use.
 	// In this case, we're running on the thread stack, so there's
 	// lots of space, but the linker doesn't know. Hide the call from
@@ -488,7 +498,7 @@
 
 needm:
 	MOVV	g, savedm-8(SP) // g is zero, so is m.
-	MOVV	$runtime·needm(SB), R4
+	MOVV	$runtime·needAndBindM(SB), R4
 	JAL	(R4)
 
 	// Set m->sched.sp = SP, so that if a panic happens
@@ -559,10 +569,24 @@
 	MOVV	savedsp-24(SP), R2	// must match frame size
 	MOVV	R2, (g_sched+gobuf_sp)(g)
 
-	// If the m on entry was nil, we called needm above to borrow an m
-	// for the duration of the call. Since the call is over, return it with dropm.
+	// If the m on entry was nil, we called needm above to borrow an m,
+	// 1. for the duration of the call on non-pthread platforms,
+	// 2. or the duration of the C thread alive on pthread platforms.
+	// If the m on entry wasn't nil,
+	// 1. the thread might be a Go thread,
+	// 2. or it wasn't the first call from a C thread on pthread platforms,
+	//    since then we skip dropm to reuse the m in the first call.
 	MOVV	savedm-8(SP), R3
 	BNE	R3, droppedm
+
+	// Skip dropm to reuse it in the next call, when a pthread key has been created.
+	MOVV	_cgo_pthread_key_created(SB), R3
+	// It means cgo is disabled when _cgo_pthread_key_created is a nil pointer, need dropm.
+	BEQ	R3, dropm
+	MOVV	(R3), R3
+	BNE	R3, droppedm
+
+dropm:
 	MOVV	$runtime·dropm(SB), R4
 	JAL	(R4)
 droppedm:
@@ -631,45 +655,43 @@
 	MOVB	R1, ret+0(FP)
 	RET
 
-// gcWriteBarrier performs a heap pointer write and informs the GC.
+// gcWriteBarrier informs the GC about heap pointer writes.
 //
-// gcWriteBarrier does NOT follow the Go ABI. It takes two arguments:
-// - R20 is the destination of the write
-// - R21 is the value being written at R20.
+// gcWriteBarrier does NOT follow the Go ABI. It accepts the
+// number of bytes of buffer needed in R25, and returns a pointer
+// to the buffer space in R25.
 // It clobbers R23 (the linker temp register).
 // The act of CALLing gcWriteBarrier will clobber R31 (LR).
 // It does not clobber any other general-purpose registers,
 // but may clobber others (e.g., floating point registers).
-TEXT runtime·gcWriteBarrier(SB),NOSPLIT,$192
+TEXT gcWriteBarrier<>(SB),NOSPLIT,$192
 	// Save the registers clobbered by the fast path.
 	MOVV	R1, 184(R29)
 	MOVV	R2, 192(R29)
+retry:
 	MOVV	g_m(g), R1
 	MOVV	m_p(R1), R1
 	MOVV	(p_wbBuf+wbBuf_next)(R1), R2
+	MOVV	(p_wbBuf+wbBuf_end)(R1), R23 // R23 is linker temp register
 	// Increment wbBuf.next position.
-	ADDV	$16, R2
-	MOVV	R2, (p_wbBuf+wbBuf_next)(R1)
-	MOVV	(p_wbBuf+wbBuf_end)(R1), R1
-	MOVV	R1, R23		// R23 is linker temp register
-	// Record the write.
-	MOVV	R21, -16(R2)	// Record value
-	MOVV	(R20), R1	// TODO: This turns bad writes into bad reads.
-	MOVV	R1, -8(R2)	// Record *slot
+	ADDV	R25, R2
 	// Is the buffer full?
-	BEQ	R2, R23, flush
-ret:
+	SGTU	R2, R23, R23
+	BNE	R23, flush
+	// Commit to the larger buffer.
+	MOVV	R2, (p_wbBuf+wbBuf_next)(R1)
+	// Make return value (the original next position)
+	SUBV	R25, R2, R25
+	// Restore registers.
 	MOVV	184(R29), R1
 	MOVV	192(R29), R2
-	// Do the write.
-	MOVV	R21, (R20)
 	RET
 
 flush:
 	// Save all general purpose registers since these could be
 	// clobbered by wbBufFlush and were not saved by the caller.
-	MOVV	R20, 8(R29)	// Also first argument to wbBufFlush
-	MOVV	R21, 16(R29)	// Also second argument to wbBufFlush
+	MOVV	R20, 8(R29)
+	MOVV	R21, 16(R29)
 	// R1 already saved
 	// R2 already saved
 	MOVV	R3, 24(R29)
@@ -702,7 +724,6 @@
 	// R30 is g.
 	// R31 is LR, which was saved by the prologue.
 
-	// This takes arguments R20 and R21.
 	CALL	runtime·wbBufFlush(SB)
 
 	MOVV	8(R29), R20
@@ -727,7 +748,32 @@
 	MOVV	160(R29), R22
 	MOVV	168(R29), R24
 	MOVV	176(R29), R25
-	JMP	ret
+	JMP	retry
+
+TEXT runtime·gcWriteBarrier1<ABIInternal>(SB),NOSPLIT,$0
+	MOVV	$8, R25
+	JMP	gcWriteBarrier<>(SB)
+TEXT runtime·gcWriteBarrier2<ABIInternal>(SB),NOSPLIT,$0
+	MOVV	$16, R25
+	JMP	gcWriteBarrier<>(SB)
+TEXT runtime·gcWriteBarrier3<ABIInternal>(SB),NOSPLIT,$0
+	MOVV	$24, R25
+	JMP	gcWriteBarrier<>(SB)
+TEXT runtime·gcWriteBarrier4<ABIInternal>(SB),NOSPLIT,$0
+	MOVV	$32, R25
+	JMP	gcWriteBarrier<>(SB)
+TEXT runtime·gcWriteBarrier5<ABIInternal>(SB),NOSPLIT,$0
+	MOVV	$40, R25
+	JMP	gcWriteBarrier<>(SB)
+TEXT runtime·gcWriteBarrier6<ABIInternal>(SB),NOSPLIT,$0
+	MOVV	$48, R25
+	JMP	gcWriteBarrier<>(SB)
+TEXT runtime·gcWriteBarrier7<ABIInternal>(SB),NOSPLIT,$0
+	MOVV	$56, R25
+	JMP	gcWriteBarrier<>(SB)
+TEXT runtime·gcWriteBarrier8<ABIInternal>(SB),NOSPLIT,$0
+	MOVV	$64, R25
+	JMP	gcWriteBarrier<>(SB)
 
 // Note: these functions use a special calling convention to save generated code space.
 // Arguments are passed in registers, but the space for those arguments are allocated
diff --git a/src/runtime/asm_mipsx.s b/src/runtime/asm_mipsx.s
index 877c1bb..eed4a05 100644
--- a/src/runtime/asm_mipsx.s
+++ b/src/runtime/asm_mipsx.s
@@ -42,7 +42,7 @@
 nocgo:
 	// update stackguard after _cgo_init
 	MOVW	(g_stack+stack_lo)(g), R1
-	ADD	$const__StackGuard, R1
+	ADD	$const_stackGuard, R1
 	MOVW	R1, g_stackguard0(g)
 	MOVW	R1, g_stackguard1(g)
 
@@ -459,13 +459,23 @@
 TEXT ·cgocallback(SB),NOSPLIT,$12-12
 	NO_LOCAL_POINTERS
 
+	// Skip cgocallbackg, just dropm when fn is nil, and frame is the saved g.
+	// It is used to dropm while thread is exiting.
+	MOVW	fn+0(FP), R5
+	BNE	R5, loadg
+	// Restore the g from frame.
+	MOVW	frame+4(FP), g
+	JMP	dropm
+
+loadg:
 	// Load m and g from thread-local storage.
 	MOVB	runtime·iscgo(SB), R1
 	BEQ	R1, nocgo
 	JAL	runtime·load_g(SB)
 nocgo:
 
-	// If g is nil, Go did not create the current thread.
+	// If g is nil, Go did not create the current thread,
+	// or if this thread never called into Go on pthread platforms.
 	// Call needm to obtain one for temporary use.
 	// In this case, we're running on the thread stack, so there's
 	// lots of space, but the linker doesn't know. Hide the call from
@@ -478,7 +488,7 @@
 
 needm:
 	MOVW	g, savedm-4(SP) // g is zero, so is m.
-	MOVW	$runtime·needm(SB), R4
+	MOVW	$runtime·needAndBindM(SB), R4
 	JAL	(R4)
 
 	// Set m->sched.sp = SP, so that if a panic happens
@@ -549,10 +559,24 @@
 	MOVW	savedsp-12(SP), R2	// must match frame size
 	MOVW	R2, (g_sched+gobuf_sp)(g)
 
-	// If the m on entry was nil, we called needm above to borrow an m
-	// for the duration of the call. Since the call is over, return it with dropm.
+	// If the m on entry was nil, we called needm above to borrow an m,
+	// 1. for the duration of the call on non-pthread platforms,
+	// 2. or the duration of the C thread alive on pthread platforms.
+	// If the m on entry wasn't nil,
+	// 1. the thread might be a Go thread,
+	// 2. or it wasn't the first call from a C thread on pthread platforms,
+	//    since then we skip dropm to reuse the m in the first call.
 	MOVW	savedm-4(SP), R3
 	BNE	R3, droppedm
+
+	// Skip dropm to reuse it in the next call, when a pthread key has been created.
+	MOVW	_cgo_pthread_key_created(SB), R3
+	// It means cgo is disabled when _cgo_pthread_key_created is a nil pointer, need dropm.
+	BEQ	R3, dropm
+	MOVW	(R3), R3
+	BNE	R3, droppedm
+
+dropm:
 	MOVW	$runtime·dropm(SB), R4
 	JAL	(R4)
 droppedm:
@@ -624,45 +648,43 @@
 	MOVB	R1, ret+0(FP)
 	RET
 
-// gcWriteBarrier performs a heap pointer write and informs the GC.
+// gcWriteBarrier informs the GC about heap pointer writes.
 //
-// gcWriteBarrier does NOT follow the Go ABI. It takes two arguments:
-// - R20 is the destination of the write
-// - R21 is the value being written at R20.
+// gcWriteBarrier does NOT follow the Go ABI. It accepts the
+// number of bytes of buffer needed in R25, and returns a pointer
+// to the buffer space in R25.
 // It clobbers R23 (the linker temp register).
 // The act of CALLing gcWriteBarrier will clobber R31 (LR).
 // It does not clobber any other general-purpose registers,
 // but may clobber others (e.g., floating point registers).
-TEXT runtime·gcWriteBarrier(SB),NOSPLIT,$104
+TEXT gcWriteBarrier<>(SB),NOSPLIT,$104
 	// Save the registers clobbered by the fast path.
 	MOVW	R1, 100(R29)
 	MOVW	R2, 104(R29)
+retry:
 	MOVW	g_m(g), R1
 	MOVW	m_p(R1), R1
 	MOVW	(p_wbBuf+wbBuf_next)(R1), R2
+	MOVW	(p_wbBuf+wbBuf_end)(R1), R23 // R23 is linker temp register
 	// Increment wbBuf.next position.
-	ADD	$8, R2
-	MOVW	R2, (p_wbBuf+wbBuf_next)(R1)
-	MOVW	(p_wbBuf+wbBuf_end)(R1), R1
-	MOVW	R1, R23		// R23 is linker temp register
-	// Record the write.
-	MOVW	R21, -8(R2)	// Record value
-	MOVW	(R20), R1	// TODO: This turns bad writes into bad reads.
-	MOVW	R1, -4(R2)	// Record *slot
+	ADD	R25, R2
 	// Is the buffer full?
-	BEQ	R2, R23, flush
-ret:
+	SGTU	R2, R23, R23
+	BNE	R23, flush
+	// Commit to the larger buffer.
+	MOVW	R2, (p_wbBuf+wbBuf_next)(R1)
+	// Make return value (the original next position)
+	SUB	R25, R2, R25
+	// Restore registers.
 	MOVW	100(R29), R1
 	MOVW	104(R29), R2
-	// Do the write.
-	MOVW	R21, (R20)
 	RET
 
 flush:
 	// Save all general purpose registers since these could be
 	// clobbered by wbBufFlush and were not saved by the caller.
-	MOVW	R20, 4(R29)	// Also first argument to wbBufFlush
-	MOVW	R21, 8(R29)	// Also second argument to wbBufFlush
+	MOVW	R20, 4(R29)
+	MOVW	R21, 8(R29)
 	// R1 already saved
 	// R2 already saved
 	MOVW	R3, 12(R29)
@@ -696,7 +718,6 @@
 	// R30 is g.
 	// R31 is LR, which was saved by the prologue.
 
-	// This takes arguments R20 and R21.
 	CALL	runtime·wbBufFlush(SB)
 
 	MOVW	4(R29), R20
@@ -723,7 +744,32 @@
 	MOVW	88(R29), R24
 	MOVW	92(R29), R25
 	MOVW	96(R29), R28
-	JMP	ret
+	JMP	retry
+
+TEXT runtime·gcWriteBarrier1<ABIInternal>(SB),NOSPLIT,$0
+	MOVW	$4, R25
+	JMP	gcWriteBarrier<>(SB)
+TEXT runtime·gcWriteBarrier2<ABIInternal>(SB),NOSPLIT,$0
+	MOVW	$8, R25
+	JMP	gcWriteBarrier<>(SB)
+TEXT runtime·gcWriteBarrier3<ABIInternal>(SB),NOSPLIT,$0
+	MOVW	$12, R25
+	JMP	gcWriteBarrier<>(SB)
+TEXT runtime·gcWriteBarrier4<ABIInternal>(SB),NOSPLIT,$0
+	MOVW	$16, R25
+	JMP	gcWriteBarrier<>(SB)
+TEXT runtime·gcWriteBarrier5<ABIInternal>(SB),NOSPLIT,$0
+	MOVW	$20, R25
+	JMP	gcWriteBarrier<>(SB)
+TEXT runtime·gcWriteBarrier6<ABIInternal>(SB),NOSPLIT,$0
+	MOVW	$24, R25
+	JMP	gcWriteBarrier<>(SB)
+TEXT runtime·gcWriteBarrier7<ABIInternal>(SB),NOSPLIT,$0
+	MOVW	$28, R25
+	JMP	gcWriteBarrier<>(SB)
+TEXT runtime·gcWriteBarrier8<ABIInternal>(SB),NOSPLIT,$0
+	MOVW	$32, R25
+	JMP	gcWriteBarrier<>(SB)
 
 // Note: these functions use a special calling convention to save generated code space.
 // Arguments are passed in registers, but the space for those arguments are allocated
diff --git a/src/runtime/asm_ppc64x.h b/src/runtime/asm_ppc64x.h
index 5e55055..65870fe 100644
--- a/src/runtime/asm_ppc64x.h
+++ b/src/runtime/asm_ppc64x.h
@@ -23,3 +23,33 @@
 // and currently always use that much, PIC on ppc64 would need to use 48).
 
 #define FIXED_FRAME 32
+
+// aix/ppc64 uses XCOFF which uses function descriptors.
+// AIX cannot perform the TOC relocation in a text section.
+// Therefore, these descriptors must live in a data section.
+#ifdef GOOS_aix
+#ifdef GOARCH_ppc64
+#define GO_PPC64X_HAS_FUNCDESC
+#define DEFINE_PPC64X_FUNCDESC(funcname, localfuncname)	\
+	DATA	funcname+0(SB)/8, $localfuncname(SB) 	\
+	DATA	funcname+8(SB)/8, $TOC(SB)		\
+	DATA	funcname+16(SB)/8, $0			\
+	GLOBL	funcname(SB), NOPTR, $24
+#endif
+#endif
+
+// linux/ppc64 uses ELFv1 which uses function descriptors.
+// These must also look like ABI0 functions on linux/ppc64
+// to work with abi.FuncPCABI0(sigtramp) in os_linux.go.
+// Only static codegen is supported on linux/ppc64, so TOC
+// is not needed.
+#ifdef GOOS_linux
+#ifdef GOARCH_ppc64
+#define GO_PPC64X_HAS_FUNCDESC
+#define DEFINE_PPC64X_FUNCDESC(funcname, localfuncname)	\
+	TEXT	funcname(SB),NOSPLIT|NOFRAME,$0		\
+		DWORD	$localfuncname(SB)		\
+		DWORD	$0				\
+		DWORD	$0
+#endif
+#endif
diff --git a/src/runtime/asm_ppc64x.s b/src/runtime/asm_ppc64x.s
index 61ff17a..66d0447 100644
--- a/src/runtime/asm_ppc64x.s
+++ b/src/runtime/asm_ppc64x.s
@@ -38,13 +38,13 @@
 	MOVD	R3, (g_stack+stack_lo)(g)
 	MOVD	R1, (g_stack+stack_hi)(g)
 
-	// if there is a _cgo_init, call it using the gcc ABI.
+	// If there is a _cgo_init, call it using the gcc ABI.
 	MOVD	_cgo_init(SB), R12
 	CMP	R0, R12
 	BEQ	nocgo
-#ifdef GOARCH_ppc64
-	// ppc64 use elf ABI v1. we must get the real entry address from
-	// first slot of the function descriptor before call.
+
+#ifdef GO_PPC64X_HAS_FUNCDESC
+	// Load the real entry address from the first slot of the function descriptor.
 	MOVD	8(R12), R2
 	MOVD	(R12), R12
 #endif
@@ -67,7 +67,7 @@
 nocgo:
 	// update stackguard after _cgo_init
 	MOVD	(g_stack+stack_lo)(g), R3
-	ADD	$const__StackGuard, R3
+	ADD	$const_stackGuard, R3
 	MOVD	R3, g_stackguard0(g)
 	MOVD	R3, g_stackguard1(g)
 
@@ -597,10 +597,8 @@
 	// This is a "global call", so put the global entry point in r12
 	MOVD	R3, R12
 
-#ifdef GOARCH_ppc64
-	// ppc64 use elf ABI v1. we must get the real entry address from
-	// first slot of the function descriptor before call.
-	// Same for AIX.
+#ifdef GO_PPC64X_HAS_FUNCDESC
+	// Load the real entry address from the first slot of the function descriptor.
 	MOVD	8(R12), R2
 	MOVD	(R12), R12
 #endif
@@ -630,6 +628,16 @@
 TEXT ·cgocallback(SB),NOSPLIT,$24-24
 	NO_LOCAL_POINTERS
 
+	// Skip cgocallbackg, just dropm when fn is nil, and frame is the saved g.
+	// It is used to dropm while thread is exiting.
+	MOVD	fn+0(FP), R5
+	CMP	R5, $0
+	BNE	loadg
+	// Restore the g from frame.
+	MOVD	frame+8(FP), g
+	BR	dropm
+
+loadg:
 	// Load m and g from thread-local storage.
 	MOVBZ	runtime·iscgo(SB), R3
 	CMP	R3, $0
@@ -637,7 +645,8 @@
 	BL	runtime·load_g(SB)
 nocgo:
 
-	// If g is nil, Go did not create the current thread.
+	// If g is nil, Go did not create the current thread,
+	// or if this thread never called into Go on pthread platforms.
 	// Call needm to obtain one for temporary use.
 	// In this case, we're running on the thread stack, so there's
 	// lots of space, but the linker doesn't know. Hide the call from
@@ -651,7 +660,7 @@
 
 needm:
 	MOVD	g, savedm-8(SP) // g is zero, so is m.
-	MOVD	$runtime·needm(SB), R12
+	MOVD	$runtime·needAndBindM(SB), R12
 	MOVD	R12, CTR
 	BL	(CTR)
 
@@ -726,11 +735,27 @@
 	MOVD	savedsp-24(SP), R4      // must match frame size
 	MOVD	R4, (g_sched+gobuf_sp)(g)
 
-	// If the m on entry was nil, we called needm above to borrow an m
-	// for the duration of the call. Since the call is over, return it with dropm.
+	// If the m on entry was nil, we called needm above to borrow an m,
+	// 1. for the duration of the call on non-pthread platforms,
+	// 2. or the duration of the C thread alive on pthread platforms.
+	// If the m on entry wasn't nil,
+	// 1. the thread might be a Go thread,
+	// 2. or it wasn't the first call from a C thread on pthread platforms,
+	//    since then we skip dropm to reuse the m in the first call.
 	MOVD	savedm-8(SP), R6
 	CMP	R6, $0
 	BNE	droppedm
+
+	// Skip dropm to reuse it in the next call, when a pthread key has been created.
+	MOVD	_cgo_pthread_key_created(SB), R6
+	// It means cgo is disabled when _cgo_pthread_key_created is a nil pointer, need dropm.
+	CMP	R6, $0
+	BEQ	dropm
+	MOVD	(R6), R6
+	CMP	R6, $0
+	BNE	droppedm
+
+dropm:
 	MOVD	$runtime·dropm(SB), R12
 	MOVD	R12, CTR
 	BL	(CTR)
@@ -746,26 +771,11 @@
 	BL	runtime·save_g(SB)
 	RET
 
-#ifdef GOARCH_ppc64
-#ifdef GOOS_aix
-DATA    setg_gcc<>+0(SB)/8, $_setg_gcc<>(SB)
-DATA    setg_gcc<>+8(SB)/8, $TOC(SB)
-DATA    setg_gcc<>+16(SB)/8, $0
-GLOBL   setg_gcc<>(SB), NOPTR, $24
-#else
-TEXT setg_gcc<>(SB),NOSPLIT|NOFRAME,$0-0
-	DWORD	$_setg_gcc<>(SB)
-	DWORD	$0
-	DWORD	$0
-#endif
-#endif
-
-// void setg_gcc(G*); set g in C TLS.
-// Must obey the gcc calling convention.
-#ifdef GOARCH_ppc64le
-TEXT setg_gcc<>(SB),NOSPLIT|NOFRAME,$0-0
-#else
+#ifdef GO_PPC64X_HAS_FUNCDESC
+DEFINE_PPC64X_FUNCDESC(setg_gcc<>, _setg_gcc<>)
 TEXT _setg_gcc<>(SB),NOSPLIT|NOFRAME,$0-0
+#else
+TEXT setg_gcc<>(SB),NOSPLIT|NOFRAME,$0-0
 #endif
 	// The standard prologue clobbers R31, which is callee-save in
 	// the C ABI, so we have to use $-8-0 and save LR ourselves.
@@ -928,41 +938,38 @@
 	MOVB	R3, ret+0(FP)
 	RET
 
-// gcWriteBarrier performs a heap pointer write and informs the GC.
+// gcWriteBarrier informs the GC about heap pointer writes.
 //
-// gcWriteBarrier does NOT follow the Go ABI. It takes two arguments:
-// - R20 is the destination of the write
-// - R21 is the value being written at R20.
+// gcWriteBarrier does NOT follow the Go ABI. It accepts the
+// number of bytes of buffer needed in R29, and returns a pointer
+// to the buffer space in R29.
 // It clobbers condition codes.
 // It does not clobber R0 through R17 (except special registers),
 // but may clobber any other register, *including* R31.
-TEXT runtime·gcWriteBarrier<ABIInternal>(SB),NOSPLIT,$112
+TEXT gcWriteBarrier<>(SB),NOSPLIT,$120
 	// The standard prologue clobbers R31.
-	// We use R18 and R19 as scratch registers.
+	// We use R18, R19, and R31 as scratch registers.
+retry:
 	MOVD	g_m(g), R18
 	MOVD	m_p(R18), R18
 	MOVD	(p_wbBuf+wbBuf_next)(R18), R19
+	MOVD	(p_wbBuf+wbBuf_end)(R18), R31
 	// Increment wbBuf.next position.
-	ADD	$16, R19
+	ADD	R29, R19
+	// Is the buffer full?
+	CMPU	R31, R19
+	BLT	flush
+	// Commit to the larger buffer.
 	MOVD	R19, (p_wbBuf+wbBuf_next)(R18)
-	MOVD	(p_wbBuf+wbBuf_end)(R18), R18
-	CMP	R18, R19
-	// Record the write.
-	MOVD	R21, -16(R19)	// Record value
-	MOVD	(R20), R18	// TODO: This turns bad writes into bad reads.
-	MOVD	R18, -8(R19)	// Record *slot
-	// Is the buffer full? (flags set in CMP above)
-	BEQ	flush
-ret:
-	// Do the write.
-	MOVD	R21, (R20)
+	// Make return value (the original next position)
+	SUB	R29, R19, R29
 	RET
 
 flush:
 	// Save registers R0 through R15 since these were not saved by the caller.
 	// We don't save all registers on ppc64 because it takes too much space.
-	MOVD	R20, (FIXED_FRAME+0)(R1)	// Also first argument to wbBufFlush
-	MOVD	R21, (FIXED_FRAME+8)(R1)	// Also second argument to wbBufFlush
+	MOVD	R20, (FIXED_FRAME+0)(R1)
+	MOVD	R21, (FIXED_FRAME+8)(R1)
 	// R0 is always 0, so no need to spill.
 	// R1 is SP.
 	// R2 is SB.
@@ -980,8 +987,8 @@
 	MOVD	R15, (FIXED_FRAME+88)(R1)
 	MOVD	R16, (FIXED_FRAME+96)(R1)
 	MOVD	R17, (FIXED_FRAME+104)(R1)
+	MOVD	R29, (FIXED_FRAME+112)(R1)
 
-	// This takes arguments R20 and R21.
 	CALL	runtime·wbBufFlush(SB)
 
 	MOVD	(FIXED_FRAME+0)(R1), R20
@@ -998,7 +1005,33 @@
 	MOVD	(FIXED_FRAME+88)(R1), R15
 	MOVD	(FIXED_FRAME+96)(R1), R16
 	MOVD	(FIXED_FRAME+104)(R1), R17
-	JMP	ret
+	MOVD	(FIXED_FRAME+112)(R1), R29
+	JMP	retry
+
+TEXT runtime·gcWriteBarrier1<ABIInternal>(SB),NOSPLIT,$0
+	MOVD	$8, R29
+	JMP	gcWriteBarrier<>(SB)
+TEXT runtime·gcWriteBarrier2<ABIInternal>(SB),NOSPLIT,$0
+	MOVD	$16, R29
+	JMP	gcWriteBarrier<>(SB)
+TEXT runtime·gcWriteBarrier3<ABIInternal>(SB),NOSPLIT,$0
+	MOVD	$24, R29
+	JMP	gcWriteBarrier<>(SB)
+TEXT runtime·gcWriteBarrier4<ABIInternal>(SB),NOSPLIT,$0
+	MOVD	$32, R29
+	JMP	gcWriteBarrier<>(SB)
+TEXT runtime·gcWriteBarrier5<ABIInternal>(SB),NOSPLIT,$0
+	MOVD	$40, R29
+	JMP	gcWriteBarrier<>(SB)
+TEXT runtime·gcWriteBarrier6<ABIInternal>(SB),NOSPLIT,$0
+	MOVD	$48, R29
+	JMP	gcWriteBarrier<>(SB)
+TEXT runtime·gcWriteBarrier7<ABIInternal>(SB),NOSPLIT,$0
+	MOVD	$56, R29
+	JMP	gcWriteBarrier<>(SB)
+TEXT runtime·gcWriteBarrier8<ABIInternal>(SB),NOSPLIT,$0
+	MOVD	$64, R29
+	JMP	gcWriteBarrier<>(SB)
 
 // Note: these functions use a special calling convention to save generated code space.
 // Arguments are passed in registers, but the space for those arguments are allocated
diff --git a/src/runtime/asm_riscv64.s b/src/runtime/asm_riscv64.s
index 31b81ae..eb53cbb 100644
--- a/src/runtime/asm_riscv64.s
+++ b/src/runtime/asm_riscv64.s
@@ -36,7 +36,7 @@
 nocgo:
 	// update stackguard after _cgo_init
 	MOV	(g_stack+stack_lo)(g), T0
-	ADD	$const__StackGuard, T0
+	ADD	$const_stackGuard, T0
 	MOV	T0, g_stackguard0(g)
 	MOV	T0, g_stackguard1(g)
 
@@ -519,13 +519,23 @@
 TEXT ·cgocallback(SB),NOSPLIT,$24-24
 	NO_LOCAL_POINTERS
 
+	// Skip cgocallbackg, just dropm when fn is nil, and frame is the saved g.
+	// It is used to dropm while thread is exiting.
+	MOV	fn+0(FP), X7
+	BNE	ZERO, X7, loadg
+	// Restore the g from frame.
+	MOV	frame+8(FP), g
+	JMP	dropm
+
+loadg:
 	// Load m and g from thread-local storage.
 	MOVBU	runtime·iscgo(SB), X5
 	BEQ	ZERO, X5, nocgo
 	CALL	runtime·load_g(SB)
 nocgo:
 
-	// If g is nil, Go did not create the current thread.
+	// If g is nil, Go did not create the current thread,
+	// or if this thread never called into Go on pthread platforms.
 	// Call needm to obtain one for temporary use.
 	// In this case, we're running on the thread stack, so there's
 	// lots of space, but the linker doesn't know. Hide the call from
@@ -538,7 +548,7 @@
 
 needm:
 	MOV	g, savedm-8(SP) // g is zero, so is m.
-	MOV	$runtime·needm(SB), X6
+	MOV	$runtime·needAndBindM(SB), X6
 	JALR	RA, X6
 
 	// Set m->sched.sp = SP, so that if a panic happens
@@ -609,10 +619,24 @@
 	MOV	savedsp-24(SP), X6	// must match frame size
 	MOV	X6, (g_sched+gobuf_sp)(g)
 
-	// If the m on entry was nil, we called needm above to borrow an m
-	// for the duration of the call. Since the call is over, return it with dropm.
+	// If the m on entry was nil, we called needm above to borrow an m,
+	// 1. for the duration of the call on non-pthread platforms,
+	// 2. or the duration of the C thread alive on pthread platforms.
+	// If the m on entry wasn't nil,
+	// 1. the thread might be a Go thread,
+	// 2. or it wasn't the first call from a C thread on pthread platforms,
+	//    since then we skip dropm to reuse the m in the first call.
 	MOV	savedm-8(SP), X5
 	BNE	ZERO, X5, droppedm
+
+	// Skip dropm to reuse it in the next call, when a pthread key has been created.
+	MOV	_cgo_pthread_key_created(SB), X5
+	// It means cgo is disabled when _cgo_pthread_key_created is a nil pointer, need dropm.
+	BEQ	ZERO, X5, dropm
+	MOV	(X5), X5
+	BNE	ZERO, X5, droppedm
+
+dropm:
 	MOV	$runtime·dropm(SB), X6
 	JALR	RA, X6
 droppedm:
@@ -712,52 +736,47 @@
 	MOVD	(31*8)(X25), F23
 	RET
 
-// gcWriteBarrier performs a heap pointer write and informs the GC.
+// gcWriteBarrier informs the GC about heap pointer writes.
 //
-// gcWriteBarrier does NOT follow the Go ABI. It takes two arguments:
-// - T0 is the destination of the write
-// - T1 is the value being written at T0.
-// It clobbers R30 (the linker temp register - REG_TMP).
+// gcWriteBarrier does NOT follow the Go ABI. It accepts the
+// number of bytes of buffer needed in X24, and returns a pointer
+// to the buffer space in X24.
+// It clobbers X31 aka T6 (the linker temp register - REG_TMP).
 // The act of CALLing gcWriteBarrier will clobber RA (LR).
 // It does not clobber any other general-purpose registers,
 // but may clobber others (e.g., floating point registers).
-TEXT runtime·gcWriteBarrier<ABIInternal>(SB),NOSPLIT,$208
+TEXT gcWriteBarrier<>(SB),NOSPLIT,$208
 	// Save the registers clobbered by the fast path.
 	MOV	A0, 24*8(X2)
 	MOV	A1, 25*8(X2)
+retry:
 	MOV	g_m(g), A0
 	MOV	m_p(A0), A0
 	MOV	(p_wbBuf+wbBuf_next)(A0), A1
+	MOV	(p_wbBuf+wbBuf_end)(A0), T6 // T6 is linker temp register (REG_TMP)
 	// Increment wbBuf.next position.
-	ADD	$16, A1
-	MOV	A1, (p_wbBuf+wbBuf_next)(A0)
-	MOV	(p_wbBuf+wbBuf_end)(A0), A0
-	MOV	A0, T6		// T6 is linker temp register (REG_TMP)
-	// Record the write.
-	MOV	T1, -16(A1)	// Record value
-	MOV	(T0), A0	// TODO: This turns bad writes into bad reads.
-	MOV	A0, -8(A1)	// Record *slot
+	ADD	X24, A1
 	// Is the buffer full?
-	BEQ	A1, T6, flush
-ret:
+	BLTU	T6, A1, flush
+	// Commit to the larger buffer.
+	MOV	A1, (p_wbBuf+wbBuf_next)(A0)
+	// Make the return value (the original next position)
+	SUB	X24, A1, X24
+	// Restore registers.
 	MOV	24*8(X2), A0
 	MOV	25*8(X2), A1
-	// Do the write.
-	MOV	T1, (T0)
 	RET
 
 flush:
 	// Save all general purpose registers since these could be
 	// clobbered by wbBufFlush and were not saved by the caller.
-	MOV	T0, 1*8(X2)	// Also first argument to wbBufFlush
-	MOV	T1, 2*8(X2)	// Also second argument to wbBufFlush
+	MOV	T0, 1*8(X2)
+	MOV	T1, 2*8(X2)
 	// X0 is zero register
 	// X1 is LR, saved by prologue
 	// X2 is SP
 	// X3 is GP
 	// X4 is TP
-	// X5 is first arg to wbBufFlush (T0)
-	// X6 is second arg to wbBufFlush (T1)
 	MOV	X7, 3*8(X2)
 	MOV	X8, 4*8(X2)
 	MOV	X9, 5*8(X2)
@@ -784,7 +803,6 @@
 	MOV	X30, 23*8(X2)
 	// X31 is tmp register.
 
-	// This takes arguments T0 and T1.
 	CALL	runtime·wbBufFlush(SB)
 
 	MOV	1*8(X2), T0
@@ -811,7 +829,32 @@
 	MOV	22*8(X2), X29
 	MOV	23*8(X2), X30
 
-	JMP	ret
+	JMP	retry
+
+TEXT runtime·gcWriteBarrier1<ABIInternal>(SB),NOSPLIT,$0
+	MOV	$8, X24
+	JMP	gcWriteBarrier<>(SB)
+TEXT runtime·gcWriteBarrier2<ABIInternal>(SB),NOSPLIT,$0
+	MOV	$16, X24
+	JMP	gcWriteBarrier<>(SB)
+TEXT runtime·gcWriteBarrier3<ABIInternal>(SB),NOSPLIT,$0
+	MOV	$24, X24
+	JMP	gcWriteBarrier<>(SB)
+TEXT runtime·gcWriteBarrier4<ABIInternal>(SB),NOSPLIT,$0
+	MOV	$32, X24
+	JMP	gcWriteBarrier<>(SB)
+TEXT runtime·gcWriteBarrier5<ABIInternal>(SB),NOSPLIT,$0
+	MOV	$40, X24
+	JMP	gcWriteBarrier<>(SB)
+TEXT runtime·gcWriteBarrier6<ABIInternal>(SB),NOSPLIT,$0
+	MOV	$48, X24
+	JMP	gcWriteBarrier<>(SB)
+TEXT runtime·gcWriteBarrier7<ABIInternal>(SB),NOSPLIT,$0
+	MOV	$56, X24
+	JMP	gcWriteBarrier<>(SB)
+TEXT runtime·gcWriteBarrier8<ABIInternal>(SB),NOSPLIT,$0
+	MOV	$64, X24
+	JMP	gcWriteBarrier<>(SB)
 
 // Note: these functions use a special calling convention to save generated code space.
 // Arguments are passed in registers (ssa/gen/RISCV64Ops.go), but the space for those
diff --git a/src/runtime/asm_s390x.s b/src/runtime/asm_s390x.s
index 334e1aa..a7f414e 100644
--- a/src/runtime/asm_s390x.s
+++ b/src/runtime/asm_s390x.s
@@ -126,7 +126,7 @@
 nocgo:
 	// update stackguard after _cgo_init
 	MOVD	(g_stack+stack_lo)(g), R2
-	ADD	$const__StackGuard, R2
+	ADD	$const_stackGuard, R2
 	MOVD	R2, g_stackguard0(g)
 	MOVD	R2, g_stackguard1(g)
 
@@ -163,7 +163,7 @@
 GLOBL	runtime·mainPC(SB),RODATA,$8
 
 TEXT runtime·breakpoint(SB),NOSPLIT|NOFRAME,$0-0
-	MOVD	$0, 2(R0)
+	BRRK
 	RET
 
 TEXT runtime·asminit(SB),NOSPLIT|NOFRAME,$0-0
@@ -564,13 +564,23 @@
 TEXT ·cgocallback(SB),NOSPLIT,$24-24
 	NO_LOCAL_POINTERS
 
+	// Skip cgocallbackg, just dropm when fn is nil, and frame is the saved g.
+	// It is used to dropm while thread is exiting.
+	MOVD	fn+0(FP), R1
+	CMPBNE	R1, $0, loadg
+	// Restore the g from frame.
+	MOVD	frame+8(FP), g
+	BR	dropm
+
+loadg:
 	// Load m and g from thread-local storage.
 	MOVB	runtime·iscgo(SB), R3
 	CMPBEQ	R3, $0, nocgo
 	BL	runtime·load_g(SB)
 
 nocgo:
-	// If g is nil, Go did not create the current thread.
+	// If g is nil, Go did not create the current thread,
+	// or if this thread never called into Go on pthread platforms.
 	// Call needm to obtain one for temporary use.
 	// In this case, we're running on the thread stack, so there's
 	// lots of space, but the linker doesn't know. Hide the call from
@@ -583,7 +593,7 @@
 
 needm:
 	MOVD	g, savedm-8(SP) // g is zero, so is m.
-	MOVD	$runtime·needm(SB), R3
+	MOVD	$runtime·needAndBindM(SB), R3
 	BL	(R3)
 
 	// Set m->sched.sp = SP, so that if a panic happens
@@ -654,10 +664,24 @@
 	MOVD	savedsp-24(SP), R4	// must match frame size
 	MOVD	R4, (g_sched+gobuf_sp)(g)
 
-	// If the m on entry was nil, we called needm above to borrow an m
-	// for the duration of the call. Since the call is over, return it with dropm.
+	// If the m on entry was nil, we called needm above to borrow an m,
+	// 1. for the duration of the call on non-pthread platforms,
+	// 2. or the duration of the C thread alive on pthread platforms.
+	// If the m on entry wasn't nil,
+	// 1. the thread might be a Go thread,
+	// 2. or it wasn't the first call from a C thread on pthread platforms,
+	//    since then we skip dropm to reuse the m in the first call.
 	MOVD	savedm-8(SP), R6
 	CMPBNE	R6, $0, droppedm
+
+	// Skip dropm to reuse it in the next call, when a pthread key has been created.
+	MOVD	_cgo_pthread_key_created(SB), R6
+	// It means cgo is disabled when _cgo_pthread_key_created is a nil pointer, need dropm.
+	CMPBEQ	R6, $0, dropm
+	MOVD	(R6), R6
+	CMPBNE	R6, $0, droppedm
+
+dropm:
 	MOVD	$runtime·dropm(SB), R3
 	BL	(R3)
 droppedm:
@@ -779,40 +803,38 @@
 	MOVB	$1, ret+0(FP)
 	RET
 
-// gcWriteBarrier performs a heap pointer write and informs the GC.
+// gcWriteBarrier informs the GC about heap pointer writes.
 //
-// gcWriteBarrier does NOT follow the Go ABI. It takes two arguments:
-// - R2 is the destination of the write
-// - R3 is the value being written at R2.
+// gcWriteBarrier does NOT follow the Go ABI. It accepts the
+// number of bytes of buffer needed in R9, and returns a pointer
+// to the buffer space in R9.
 // It clobbers R10 (the temp register) and R1 (used by PLT stub).
 // It does not clobber any other general-purpose registers,
 // but may clobber others (e.g., floating point registers).
-TEXT runtime·gcWriteBarrier(SB),NOSPLIT,$96
+TEXT gcWriteBarrier<>(SB),NOSPLIT,$96
 	// Save the registers clobbered by the fast path.
 	MOVD	R4, 96(R15)
+retry:
 	MOVD	g_m(g), R1
 	MOVD	m_p(R1), R1
 	// Increment wbBuf.next position.
-	MOVD	$16, R4
+	MOVD	R9, R4
 	ADD	(p_wbBuf+wbBuf_next)(R1), R4
-	MOVD	R4, (p_wbBuf+wbBuf_next)(R1)
-	MOVD	(p_wbBuf+wbBuf_end)(R1), R1
-	// Record the write.
-	MOVD	R3, -16(R4) // Record value
-	MOVD	(R2), R10   // TODO: This turns bad writes into bad reads.
-	MOVD	R10, -8(R4) // Record *slot
 	// Is the buffer full?
-	CMPBEQ	R4, R1, flush
-ret:
+	MOVD	(p_wbBuf+wbBuf_end)(R1), R10
+	CMPUBGT	R4, R10, flush
+	// Commit to the larger buffer.
+	MOVD	R4, (p_wbBuf+wbBuf_next)(R1)
+	// Make return value (the original next position)
+	SUB	R9, R4, R9
+	// Restore registers.
 	MOVD	96(R15), R4
-	// Do the write.
-	MOVD	R3, (R2)
 	RET
 
 flush:
 	// Save all general purpose registers since these could be
 	// clobbered by wbBufFlush and were not saved by the caller.
-	STMG	R2, R3, 8(R15)   // set R2 and R3 as arguments for wbBufFlush
+	STMG	R2, R3, 8(R15)
 	MOVD	R0, 24(R15)
 	// R1 already saved.
 	// R4 already saved.
@@ -821,13 +843,37 @@
 	// R14 is LR.
 	// R15 is SP.
 
-	// This takes arguments R2 and R3.
 	CALL	runtime·wbBufFlush(SB)
 
 	LMG	8(R15), R2, R3   // restore R2 - R3
 	MOVD	24(R15), R0      // restore R0
 	LMG	32(R15), R5, R12 // restore R5 - R12
-	JMP	ret
+	JMP	retry
+
+TEXT runtime·gcWriteBarrier1<ABIInternal>(SB),NOSPLIT,$0
+	MOVD	$8, R9
+	JMP	gcWriteBarrier<>(SB)
+TEXT runtime·gcWriteBarrier2<ABIInternal>(SB),NOSPLIT,$0
+	MOVD	$16, R9
+	JMP	gcWriteBarrier<>(SB)
+TEXT runtime·gcWriteBarrier3<ABIInternal>(SB),NOSPLIT,$0
+	MOVD	$24, R9
+	JMP	gcWriteBarrier<>(SB)
+TEXT runtime·gcWriteBarrier4<ABIInternal>(SB),NOSPLIT,$0
+	MOVD	$32, R9
+	JMP	gcWriteBarrier<>(SB)
+TEXT runtime·gcWriteBarrier5<ABIInternal>(SB),NOSPLIT,$0
+	MOVD	$40, R9
+	JMP	gcWriteBarrier<>(SB)
+TEXT runtime·gcWriteBarrier6<ABIInternal>(SB),NOSPLIT,$0
+	MOVD	$48, R9
+	JMP	gcWriteBarrier<>(SB)
+TEXT runtime·gcWriteBarrier7<ABIInternal>(SB),NOSPLIT,$0
+	MOVD	$56, R9
+	JMP	gcWriteBarrier<>(SB)
+TEXT runtime·gcWriteBarrier8<ABIInternal>(SB),NOSPLIT,$0
+	MOVD	$64, R9
+	JMP	gcWriteBarrier<>(SB)
 
 // Note: these functions use a special calling convention to save generated code space.
 // Arguments are passed in registers, but the space for those arguments are allocated
diff --git a/src/runtime/asm_wasm.s b/src/runtime/asm_wasm.s
index e075c72..9cd8b5a 100644
--- a/src/runtime/asm_wasm.s
+++ b/src/runtime/asm_wasm.s
@@ -15,7 +15,9 @@
 	// set g to g0
 	MOVD $runtime·g0(SB), g
 	CALLNORESUME runtime·check(SB)
+#ifdef GOOS_js
 	CALLNORESUME runtime·args(SB)
+#endif
 	CALLNORESUME runtime·osinit(SB)
 	CALLNORESUME runtime·schedinit(SB)
 	MOVD $runtime·mainPC(SB), 0(SP)
@@ -404,42 +406,120 @@
 TEXT runtime·cgocallback(SB), NOSPLIT, $0-24
 	UNDEF
 
-// gcWriteBarrier performs a heap pointer write and informs the GC.
+// gcWriteBarrier informs the GC about heap pointer writes.
 //
-// gcWriteBarrier does NOT follow the Go ABI. It has two WebAssembly parameters:
-// R0: the destination of the write (i64)
-// R1: the value being written (i64)
-TEXT runtime·gcWriteBarrier(SB), NOSPLIT, $16
-	// R3 = g.m
-	MOVD g_m(g), R3
-	// R4 = p
-	MOVD m_p(R3), R4
-	// R5 = wbBuf.next
-	MOVD p_wbBuf+wbBuf_next(R4), R5
+// gcWriteBarrier does NOT follow the Go ABI. It accepts the
+// number of bytes of buffer needed as a wasm argument
+// (put on the TOS by the caller, lives in local R0 in this body)
+// and returns a pointer to the buffer space as a wasm result
+// (left on the TOS in this body, appears on the wasm stack
+// in the caller).
+TEXT gcWriteBarrier<>(SB), NOSPLIT, $0
+	Loop
+		// R3 = g.m
+		MOVD g_m(g), R3
+		// R4 = p
+		MOVD m_p(R3), R4
+		// R5 = wbBuf.next
+		MOVD p_wbBuf+wbBuf_next(R4), R5
 
-	// Record value
-	MOVD R1, 0(R5)
-	// Record *slot
-	MOVD (R0), 8(R5)
+		// Increment wbBuf.next
+		Get R5
+		Get R0
+		I64Add
+		Set R5
 
-	// Increment wbBuf.next
-	Get R5
-	I64Const $16
-	I64Add
-	Set R5
-	MOVD R5, p_wbBuf+wbBuf_next(R4)
+		// Is the buffer full?
+		Get R5
+		I64Load (p_wbBuf+wbBuf_end)(R4)
+		I64LeU
+		If
+			// Commit to the larger buffer.
+			MOVD R5, p_wbBuf+wbBuf_next(R4)
 
-	Get R5
-	I64Load (p_wbBuf+wbBuf_end)(R4)
-	I64Eq
-	If
+			// Make return value (the original next position)
+			Get R5
+			Get R0
+			I64Sub
+
+			Return
+		End
+
 		// Flush
-		MOVD R0, 0(SP)
-		MOVD R1, 8(SP)
 		CALLNORESUME runtime·wbBufFlush(SB)
+
+		// Retry
+		Br $0
 	End
 
-	// Do the write
-	MOVD R1, (R0)
+TEXT runtime·gcWriteBarrier1<ABIInternal>(SB),NOSPLIT,$0
+	I64Const $8
+	Call	gcWriteBarrier<>(SB)
+	Return
+TEXT runtime·gcWriteBarrier2<ABIInternal>(SB),NOSPLIT,$0
+	I64Const $16
+	Call	gcWriteBarrier<>(SB)
+	Return
+TEXT runtime·gcWriteBarrier3<ABIInternal>(SB),NOSPLIT,$0
+	I64Const $24
+	Call	gcWriteBarrier<>(SB)
+	Return
+TEXT runtime·gcWriteBarrier4<ABIInternal>(SB),NOSPLIT,$0
+	I64Const $32
+	Call	gcWriteBarrier<>(SB)
+	Return
+TEXT runtime·gcWriteBarrier5<ABIInternal>(SB),NOSPLIT,$0
+	I64Const $40
+	Call	gcWriteBarrier<>(SB)
+	Return
+TEXT runtime·gcWriteBarrier6<ABIInternal>(SB),NOSPLIT,$0
+	I64Const $48
+	Call	gcWriteBarrier<>(SB)
+	Return
+TEXT runtime·gcWriteBarrier7<ABIInternal>(SB),NOSPLIT,$0
+	I64Const $56
+	Call	gcWriteBarrier<>(SB)
+	Return
+TEXT runtime·gcWriteBarrier8<ABIInternal>(SB),NOSPLIT,$0
+	I64Const $64
+	Call	gcWriteBarrier<>(SB)
+	Return
 
-	RET
+TEXT wasm_pc_f_loop(SB),NOSPLIT,$0
+// Call the function for the current PC_F. Repeat until PAUSE != 0 indicates pause or exit.
+// The WebAssembly stack may unwind, e.g. when switching goroutines.
+// The Go stack on the linear memory is then used to jump to the correct functions
+// with this loop, without having to restore the full WebAssembly stack.
+// It is expected to have a pending call before entering the loop, so check PAUSE first.
+	Get PAUSE
+	I32Eqz
+	If
+	loop:
+		Loop
+			// Get PC_B & PC_F from -8(SP)
+			Get SP
+			I32Const $8
+			I32Sub
+			I32Load16U $0 // PC_B
+
+			Get SP
+			I32Const $8
+			I32Sub
+			I32Load16U $2 // PC_F
+
+			CallIndirect $0
+			Drop
+
+			Get PAUSE
+			I32Eqz
+			BrIf loop
+		End
+	End
+
+	I32Const $0
+	Set PAUSE
+
+	Return
+
+TEXT wasm_export_lib(SB),NOSPLIT,$0
+	UNDEF
diff --git a/src/runtime/atomic_pointer.go b/src/runtime/atomic_pointer.go
index 25e0e65..b61bf0b 100644
--- a/src/runtime/atomic_pointer.go
+++ b/src/runtime/atomic_pointer.go
@@ -5,6 +5,7 @@
 package runtime
 
 import (
+	"internal/goexperiment"
 	"runtime/internal/atomic"
 	"unsafe"
 )
@@ -20,9 +21,9 @@
 //go:nosplit
 func atomicwb(ptr *unsafe.Pointer, new unsafe.Pointer) {
 	slot := (*uintptr)(unsafe.Pointer(ptr))
-	if !getg().m.p.ptr().wbBuf.putFast(*slot, uintptr(new)) {
-		wbBufFlush(slot, uintptr(new))
-	}
+	buf := getg().m.p.ptr().wbBuf.get2()
+	buf[0] = *slot
+	buf[1] = uintptr(new)
 }
 
 // atomicstorep performs *ptr = new atomically and invokes a write barrier.
@@ -32,6 +33,9 @@
 	if writeBarrier.enabled {
 		atomicwb((*unsafe.Pointer)(ptr), new)
 	}
+	if goexperiment.CgoCheck2 {
+		cgoCheckPtrWrite((*unsafe.Pointer)(ptr), new)
+	}
 	atomic.StorepNoWB(noescape(ptr), new)
 }
 
@@ -53,6 +57,9 @@
 	if writeBarrier.enabled {
 		atomicwb(ptr, new)
 	}
+	if goexperiment.CgoCheck2 {
+		cgoCheckPtrWrite(ptr, new)
+	}
 	return atomic.Casp1(ptr, old, new)
 }
 
@@ -69,6 +76,9 @@
 	if writeBarrier.enabled {
 		atomicwb(ptr, new)
 	}
+	if goexperiment.CgoCheck2 {
+		cgoCheckPtrWrite(ptr, new)
+	}
 	sync_atomic_StoreUintptr((*uintptr)(unsafe.Pointer(ptr)), uintptr(new))
 }
 
@@ -81,6 +91,9 @@
 	if writeBarrier.enabled {
 		atomicwb(ptr, new)
 	}
+	if goexperiment.CgoCheck2 {
+		cgoCheckPtrWrite(ptr, new)
+	}
 	old := unsafe.Pointer(sync_atomic_SwapUintptr((*uintptr)(noescape(unsafe.Pointer(ptr))), uintptr(new)))
 	return old
 }
@@ -94,5 +107,8 @@
 	if writeBarrier.enabled {
 		atomicwb(ptr, new)
 	}
+	if goexperiment.CgoCheck2 {
+		cgoCheckPtrWrite(ptr, new)
+	}
 	return sync_atomic_CompareAndSwapUintptr((*uintptr)(noescape(unsafe.Pointer(ptr))), uintptr(old), uintptr(new))
 }
diff --git a/src/runtime/callers_test.go b/src/runtime/callers_test.go
index d245cbd..d316ee9 100644
--- a/src/runtime/callers_test.go
+++ b/src/runtime/callers_test.go
@@ -339,3 +339,186 @@
 	}
 	return line
 }
+
+func BenchmarkCallers(b *testing.B) {
+	b.Run("cached", func(b *testing.B) {
+		// Very pcvalueCache-friendly, no inlining.
+		callersCached(b, 100)
+	})
+	b.Run("inlined", func(b *testing.B) {
+		// Some inlining, still pretty cache-friendly.
+		callersInlined(b, 100)
+	})
+	b.Run("no-cache", func(b *testing.B) {
+		// Cache-hostile
+		callersNoCache(b, 100)
+	})
+}
+
+func callersCached(b *testing.B, n int) int {
+	if n <= 0 {
+		pcs := make([]uintptr, 32)
+		b.ResetTimer()
+		for i := 0; i < b.N; i++ {
+			runtime.Callers(0, pcs)
+		}
+		b.StopTimer()
+		return 0
+	}
+	return 1 + callersCached(b, n-1)
+}
+
+func callersInlined(b *testing.B, n int) int {
+	if n <= 0 {
+		pcs := make([]uintptr, 32)
+		b.ResetTimer()
+		for i := 0; i < b.N; i++ {
+			runtime.Callers(0, pcs)
+		}
+		b.StopTimer()
+		return 0
+	}
+	return 1 + callersInlined1(b, n-1)
+}
+func callersInlined1(b *testing.B, n int) int { return callersInlined2(b, n) }
+func callersInlined2(b *testing.B, n int) int { return callersInlined3(b, n) }
+func callersInlined3(b *testing.B, n int) int { return callersInlined4(b, n) }
+func callersInlined4(b *testing.B, n int) int { return callersInlined(b, n) }
+
+func callersNoCache(b *testing.B, n int) int {
+	if n <= 0 {
+		pcs := make([]uintptr, 32)
+		b.ResetTimer()
+		for i := 0; i < b.N; i++ {
+			runtime.Callers(0, pcs)
+		}
+		b.StopTimer()
+		return 0
+	}
+	switch n % 16 {
+	case 0:
+		return 1 + callersNoCache(b, n-1)
+	case 1:
+		return 1 + callersNoCache(b, n-1)
+	case 2:
+		return 1 + callersNoCache(b, n-1)
+	case 3:
+		return 1 + callersNoCache(b, n-1)
+	case 4:
+		return 1 + callersNoCache(b, n-1)
+	case 5:
+		return 1 + callersNoCache(b, n-1)
+	case 6:
+		return 1 + callersNoCache(b, n-1)
+	case 7:
+		return 1 + callersNoCache(b, n-1)
+	case 8:
+		return 1 + callersNoCache(b, n-1)
+	case 9:
+		return 1 + callersNoCache(b, n-1)
+	case 10:
+		return 1 + callersNoCache(b, n-1)
+	case 11:
+		return 1 + callersNoCache(b, n-1)
+	case 12:
+		return 1 + callersNoCache(b, n-1)
+	case 13:
+		return 1 + callersNoCache(b, n-1)
+	case 14:
+		return 1 + callersNoCache(b, n-1)
+	default:
+		return 1 + callersNoCache(b, n-1)
+	}
+}
+
+func BenchmarkFPCallers(b *testing.B) {
+	b.Run("cached", func(b *testing.B) {
+		// Very pcvalueCache-friendly, no inlining.
+		fpCallersCached(b, 100)
+	})
+}
+
+func fpCallersCached(b *testing.B, n int) int {
+	if n <= 0 {
+		pcs := make([]uintptr, 32)
+		b.ResetTimer()
+		for i := 0; i < b.N; i++ {
+			runtime.FPCallers(pcs)
+		}
+		b.StopTimer()
+		return 0
+	}
+	return 1 + fpCallersCached(b, n-1)
+}
+
+func TestFPUnwindAfterRecovery(t *testing.T) {
+	if !runtime.FramePointerEnabled {
+		t.Skip("frame pointers not supported for this architecture")
+	}
+	func() {
+		// Make sure that frame pointer unwinding succeeds from a deferred
+		// function run after recovering from a panic. It can fail if the
+		// recovery does not properly restore the caller's frame pointer before
+		// running the remaining deferred functions.
+		//
+		// Wrap this all in an extra function since the unwinding is most likely
+		// to fail trying to unwind *after* the frame we're currently in (since
+		// *that* bp will fail to be restored). Below we'll try to induce a crash,
+		// but if for some reason we can't, let's make sure the stack trace looks
+		// right.
+		want := []string{
+			"runtime_test.TestFPUnwindAfterRecovery.func1.1",
+			"runtime_test.TestFPUnwindAfterRecovery.func1",
+			"runtime_test.TestFPUnwindAfterRecovery",
+		}
+		defer func() {
+			pcs := make([]uintptr, 32)
+			for i := range pcs {
+				// If runtime.recovery doesn't properly restore the
+				// frame pointer before returning control to this
+				// function, it will point somewhere lower in the stack
+				// from one of the frames of runtime.gopanic() or one of
+				// it's callees prior to recovery.  So, we put some
+				// non-zero values on the stack to try and get frame
+				// pointer unwinding to crash if it sees the old,
+				// invalid frame pointer.
+				pcs[i] = 10
+			}
+			runtime.FPCallers(pcs)
+			// If it didn't crash, let's symbolize. Something is going
+			// to look wrong if the bp restoration just happened to
+			// reference a valid frame. Look for
+			var got []string
+			frames := runtime.CallersFrames(pcs)
+			for {
+				frame, more := frames.Next()
+				if !more {
+					break
+				}
+				got = append(got, frame.Function)
+			}
+			// Check that we see the frames in want and in that order.
+			// This is a bit roundabout because FPCallers doesn't do
+			// filtering of runtime internals like Callers.
+			i := 0
+			for _, f := range got {
+				if f != want[i] {
+					continue
+				}
+				i++
+				if i == len(want) {
+					break
+				}
+			}
+			if i != len(want) {
+				t.Fatalf("bad unwind: got %v, want %v in that order", got, want)
+			}
+		}()
+		defer func() {
+			if recover() == nil {
+				t.Fatal("did not recover from panic")
+			}
+		}()
+		panic(1)
+	}()
+}
diff --git a/src/runtime/cgo.go b/src/runtime/cgo.go
index d904682..3953035 100644
--- a/src/runtime/cgo.go
+++ b/src/runtime/cgo.go
@@ -17,6 +17,9 @@
 //go:linkname _cgo_callers _cgo_callers
 //go:linkname _cgo_set_context_function _cgo_set_context_function
 //go:linkname _cgo_yield _cgo_yield
+//go:linkname _cgo_pthread_key_created _cgo_pthread_key_created
+//go:linkname _cgo_bindm _cgo_bindm
+//go:linkname _cgo_getstackbound _cgo_getstackbound
 
 var (
 	_cgo_init                     unsafe.Pointer
@@ -26,11 +29,17 @@
 	_cgo_callers                  unsafe.Pointer
 	_cgo_set_context_function     unsafe.Pointer
 	_cgo_yield                    unsafe.Pointer
+	_cgo_pthread_key_created      unsafe.Pointer
+	_cgo_bindm                    unsafe.Pointer
+	_cgo_getstackbound            unsafe.Pointer
 )
 
 // iscgo is set to true by the runtime/cgo package
 var iscgo bool
 
+// set_crosscall2 is set by the runtime/cgo package
+var set_crosscall2 func()
+
 // 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.
 var cgoHasExtraM bool
diff --git a/src/runtime/cgo/abi_loong64.h b/src/runtime/cgo/abi_loong64.h
new file mode 100644
index 0000000..b10d837
--- /dev/null
+++ b/src/runtime/cgo/abi_loong64.h
@@ -0,0 +1,60 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Macros for transitioning from the host ABI to Go ABI0.
+//
+// These macros save and restore the callee-saved registers
+// from the stack, but they don't adjust stack pointer, so
+// the user should prepare stack space in advance.
+// SAVE_R22_TO_R31(offset) saves R22 ~ R31 to the stack space
+// of ((offset)+0*8)(R3) ~ ((offset)+9*8)(R3).
+//
+// SAVE_F24_TO_F31(offset) saves F24 ~ F31 to the stack space
+// of ((offset)+0*8)(R3) ~ ((offset)+7*8)(R3).
+//
+// Note: g is R22
+
+#define SAVE_R22_TO_R31(offset)	\
+	MOVV	g,   ((offset)+(0*8))(R3)	\
+	MOVV	R23, ((offset)+(1*8))(R3)	\
+	MOVV	R24, ((offset)+(2*8))(R3)	\
+	MOVV	R25, ((offset)+(3*8))(R3)	\
+	MOVV	R26, ((offset)+(4*8))(R3)	\
+	MOVV	R27, ((offset)+(5*8))(R3)	\
+	MOVV	R28, ((offset)+(6*8))(R3)	\
+	MOVV	R29, ((offset)+(7*8))(R3)	\
+	MOVV	R30, ((offset)+(8*8))(R3)	\
+	MOVV	R31, ((offset)+(9*8))(R3)
+
+#define SAVE_F24_TO_F31(offset)	\
+	MOVD	F24, ((offset)+(0*8))(R3)	\
+	MOVD	F25, ((offset)+(1*8))(R3)	\
+	MOVD	F26, ((offset)+(2*8))(R3)	\
+	MOVD	F27, ((offset)+(3*8))(R3)	\
+	MOVD	F28, ((offset)+(4*8))(R3)	\
+	MOVD	F29, ((offset)+(5*8))(R3)	\
+	MOVD	F30, ((offset)+(6*8))(R3)	\
+	MOVD	F31, ((offset)+(7*8))(R3)
+
+#define RESTORE_R22_TO_R31(offset)	\
+	MOVV	((offset)+(0*8))(R3),  g	\
+	MOVV	((offset)+(1*8))(R3), R23	\
+	MOVV	((offset)+(2*8))(R3), R24	\
+	MOVV	((offset)+(3*8))(R3), R25	\
+	MOVV	((offset)+(4*8))(R3), R26	\
+	MOVV	((offset)+(5*8))(R3), R27	\
+	MOVV	((offset)+(6*8))(R3), R28	\
+	MOVV	((offset)+(7*8))(R3), R29	\
+	MOVV	((offset)+(8*8))(R3), R30	\
+	MOVV	((offset)+(9*8))(R3), R31
+
+#define RESTORE_F24_TO_F31(offset)	\
+	MOVD	((offset)+(0*8))(R3), F24	\
+	MOVD	((offset)+(1*8))(R3), F25	\
+	MOVD	((offset)+(2*8))(R3), F26	\
+	MOVD	((offset)+(3*8))(R3), F27	\
+	MOVD	((offset)+(4*8))(R3), F28	\
+	MOVD	((offset)+(5*8))(R3), F29	\
+	MOVD	((offset)+(6*8))(R3), F30	\
+	MOVD	((offset)+(7*8))(R3), F31
diff --git a/src/runtime/cgo/abi_ppc64x.h b/src/runtime/cgo/abi_ppc64x.h
new file mode 100644
index 0000000..245a526
--- /dev/null
+++ b/src/runtime/cgo/abi_ppc64x.h
@@ -0,0 +1,195 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Macros for transitioning from the host ABI to Go ABI
+//
+// On PPC64/ELFv2 targets, the following registers are callee
+// saved when called from C. They must be preserved before
+// calling into Go which does not preserve any of them.
+//
+//	R14-R31
+//	CR2-4
+//	VR20-31
+//	F14-F31
+//
+// xcoff(aix) and ELFv1 are similar, but may only require a
+// subset of these.
+//
+// These macros assume a 16 byte aligned stack pointer. This
+// is required by ELFv1, ELFv2, and AIX PPC64.
+
+#define SAVE_GPR_SIZE (18*8)
+#define SAVE_GPR(offset)               \
+	MOVD	R14, (offset+8*0)(R1)  \
+	MOVD	R15, (offset+8*1)(R1)  \
+	MOVD	R16, (offset+8*2)(R1)  \
+	MOVD	R17, (offset+8*3)(R1)  \
+	MOVD	R18, (offset+8*4)(R1)  \
+	MOVD	R19, (offset+8*5)(R1)  \
+	MOVD	R20, (offset+8*6)(R1)  \
+	MOVD	R21, (offset+8*7)(R1)  \
+	MOVD	R22, (offset+8*8)(R1)  \
+	MOVD	R23, (offset+8*9)(R1)  \
+	MOVD	R24, (offset+8*10)(R1) \
+	MOVD	R25, (offset+8*11)(R1) \
+	MOVD	R26, (offset+8*12)(R1) \
+	MOVD	R27, (offset+8*13)(R1) \
+	MOVD	R28, (offset+8*14)(R1) \
+	MOVD	R29, (offset+8*15)(R1) \
+	MOVD	g,   (offset+8*16)(R1) \
+	MOVD	R31, (offset+8*17)(R1)
+
+#define RESTORE_GPR(offset)            \
+	MOVD	(offset+8*0)(R1), R14  \
+	MOVD	(offset+8*1)(R1), R15  \
+	MOVD	(offset+8*2)(R1), R16  \
+	MOVD	(offset+8*3)(R1), R17  \
+	MOVD	(offset+8*4)(R1), R18  \
+	MOVD	(offset+8*5)(R1), R19  \
+	MOVD	(offset+8*6)(R1), R20  \
+	MOVD	(offset+8*7)(R1), R21  \
+	MOVD	(offset+8*8)(R1), R22  \
+	MOVD	(offset+8*9)(R1), R23  \
+	MOVD	(offset+8*10)(R1), R24 \
+	MOVD	(offset+8*11)(R1), R25 \
+	MOVD	(offset+8*12)(R1), R26 \
+	MOVD	(offset+8*13)(R1), R27 \
+	MOVD	(offset+8*14)(R1), R28 \
+	MOVD	(offset+8*15)(R1), R29 \
+	MOVD	(offset+8*16)(R1), g   \
+	MOVD	(offset+8*17)(R1), R31
+
+#define SAVE_FPR_SIZE (18*8)
+#define SAVE_FPR(offset)               \
+	FMOVD	F14, (offset+8*0)(R1)  \
+	FMOVD	F15, (offset+8*1)(R1)  \
+	FMOVD	F16, (offset+8*2)(R1)  \
+	FMOVD	F17, (offset+8*3)(R1)  \
+	FMOVD	F18, (offset+8*4)(R1)  \
+	FMOVD	F19, (offset+8*5)(R1)  \
+	FMOVD	F20, (offset+8*6)(R1)  \
+	FMOVD	F21, (offset+8*7)(R1)  \
+	FMOVD	F22, (offset+8*8)(R1)  \
+	FMOVD	F23, (offset+8*9)(R1)  \
+	FMOVD	F24, (offset+8*10)(R1) \
+	FMOVD	F25, (offset+8*11)(R1) \
+	FMOVD	F26, (offset+8*12)(R1) \
+	FMOVD	F27, (offset+8*13)(R1) \
+	FMOVD	F28, (offset+8*14)(R1) \
+	FMOVD	F29, (offset+8*15)(R1) \
+	FMOVD	F30, (offset+8*16)(R1) \
+	FMOVD	F31, (offset+8*17)(R1)
+
+#define RESTORE_FPR(offset)            \
+	FMOVD	(offset+8*0)(R1), F14  \
+	FMOVD	(offset+8*1)(R1), F15  \
+	FMOVD	(offset+8*2)(R1), F16  \
+	FMOVD	(offset+8*3)(R1), F17  \
+	FMOVD	(offset+8*4)(R1), F18  \
+	FMOVD	(offset+8*5)(R1), F19  \
+	FMOVD	(offset+8*6)(R1), F20  \
+	FMOVD	(offset+8*7)(R1), F21  \
+	FMOVD	(offset+8*8)(R1), F22  \
+	FMOVD	(offset+8*9)(R1), F23  \
+	FMOVD	(offset+8*10)(R1), F24 \
+	FMOVD	(offset+8*11)(R1), F25 \
+	FMOVD	(offset+8*12)(R1), F26 \
+	FMOVD	(offset+8*13)(R1), F27 \
+	FMOVD	(offset+8*14)(R1), F28 \
+	FMOVD	(offset+8*15)(R1), F29 \
+	FMOVD	(offset+8*16)(R1), F30 \
+	FMOVD	(offset+8*17)(R1), F31
+
+// Save and restore VR20-31 (aka VSR56-63). These
+// macros must point to a 16B aligned offset.
+#define SAVE_VR_SIZE (12*16)
+#define SAVE_VR(offset, rtmp)         \
+	MOVD	$(offset+16*0), rtmp  \
+	STVX	V20, (rtmp)(R1)       \
+	MOVD	$(offset+16*1), rtmp  \
+	STVX	V21, (rtmp)(R1)       \
+	MOVD	$(offset+16*2), rtmp  \
+	STVX	V22, (rtmp)(R1)       \
+	MOVD	$(offset+16*3), rtmp  \
+	STVX	V23, (rtmp)(R1)       \
+	MOVD	$(offset+16*4), rtmp  \
+	STVX	V24, (rtmp)(R1)       \
+	MOVD	$(offset+16*5), rtmp  \
+	STVX	V25, (rtmp)(R1)       \
+	MOVD	$(offset+16*6), rtmp  \
+	STVX	V26, (rtmp)(R1)       \
+	MOVD	$(offset+16*7), rtmp  \
+	STVX	V27, (rtmp)(R1)       \
+	MOVD	$(offset+16*8), rtmp  \
+	STVX	V28, (rtmp)(R1)       \
+	MOVD	$(offset+16*9), rtmp  \
+	STVX	V29, (rtmp)(R1)       \
+	MOVD	$(offset+16*10), rtmp \
+	STVX	V30, (rtmp)(R1)       \
+	MOVD	$(offset+16*11), rtmp \
+	STVX	V31, (rtmp)(R1)
+
+#define RESTORE_VR(offset, rtmp)      \
+	MOVD	$(offset+16*0), rtmp  \
+	LVX	(rtmp)(R1), V20       \
+	MOVD	$(offset+16*1), rtmp  \
+	LVX	(rtmp)(R1), V21       \
+	MOVD	$(offset+16*2), rtmp  \
+	LVX	(rtmp)(R1), V22       \
+	MOVD	$(offset+16*3), rtmp  \
+	LVX	(rtmp)(R1), V23       \
+	MOVD	$(offset+16*4), rtmp  \
+	LVX	(rtmp)(R1), V24       \
+	MOVD	$(offset+16*5), rtmp  \
+	LVX	(rtmp)(R1), V25       \
+	MOVD	$(offset+16*6), rtmp  \
+	LVX	(rtmp)(R1), V26       \
+	MOVD	$(offset+16*7), rtmp  \
+	LVX	(rtmp)(R1), V27       \
+	MOVD	$(offset+16*8), rtmp  \
+	LVX	(rtmp)(R1), V28       \
+	MOVD	$(offset+16*9), rtmp  \
+	LVX	(rtmp)(R1), V29       \
+	MOVD	$(offset+16*10), rtmp \
+	LVX	(rtmp)(R1), V30       \
+	MOVD	$(offset+16*11), rtmp \
+	LVX	(rtmp)(R1), V31
+
+// LR and CR are saved in the caller's frame. The callee must
+// make space for all other callee-save registers.
+#define SAVE_ALL_REG_SIZE (SAVE_GPR_SIZE+SAVE_FPR_SIZE+SAVE_VR_SIZE)
+
+// Stack a frame and save all callee-save registers following the
+// host OS's ABI. Fortunately, this is identical for AIX, ELFv1, and
+// ELFv2. All host ABIs require the stack pointer to maintain 16 byte
+// alignment, and save the callee-save registers in the same places.
+//
+// To restate, R1 is assumed to be aligned when this macro is used.
+// This assumes the caller's frame is compliant with the host ABI.
+// CR and LR are saved into the caller's frame per the host ABI.
+// R0 is initialized to $0 as expected by Go.
+#define STACK_AND_SAVE_HOST_TO_GO_ABI(extra)                       \
+	MOVD	LR, R0                                             \
+	MOVD	R0, 16(R1)                                         \
+	MOVW	CR, R0                                             \
+	MOVD	R0, 8(R1)                                          \
+	MOVDU	R1, -(extra)-FIXED_FRAME-SAVE_ALL_REG_SIZE(R1)     \
+	SAVE_GPR(extra+FIXED_FRAME)                                \
+	SAVE_FPR(extra+FIXED_FRAME+SAVE_GPR_SIZE)                  \
+	SAVE_VR(extra+FIXED_FRAME+SAVE_GPR_SIZE+SAVE_FPR_SIZE, R0) \
+	MOVD	$0, R0
+
+// This unstacks the frame, restoring all callee-save registers
+// as saved by STACK_AND_SAVE_HOST_TO_GO_ABI.
+//
+// R0 is not guaranteed to contain $0 after this macro.
+#define UNSTACK_AND_RESTORE_GO_TO_HOST_ABI(extra)                     \
+	RESTORE_GPR(extra+FIXED_FRAME)                                \
+	RESTORE_FPR(extra+FIXED_FRAME+SAVE_GPR_SIZE)                  \
+	RESTORE_VR(extra+FIXED_FRAME+SAVE_GPR_SIZE+SAVE_FPR_SIZE, R0) \
+	ADD 	$(extra+FIXED_FRAME+SAVE_ALL_REG_SIZE), R1            \
+	MOVD	16(R1), R0                                            \
+	MOVD	R0, LR                                                \
+	MOVD	8(R1), R0                                             \
+	MOVW	R0, CR
diff --git a/src/runtime/cgo/asm_386.s b/src/runtime/cgo/asm_386.s
index 2e7e951..f9a662a 100644
--- a/src/runtime/cgo/asm_386.s
+++ b/src/runtime/cgo/asm_386.s
@@ -4,6 +4,19 @@
 
 #include "textflag.h"
 
+// Set the x_crosscall2_ptr C function pointer variable point to crosscall2.
+// It's such a pointer chain: _crosscall2_ptr -> x_crosscall2_ptr -> crosscall2
+// Use a local trampoline, to avoid taking the address of a dynamically exported
+// function.
+TEXT ·set_crosscall2(SB),NOSPLIT,$0-0
+	MOVL	_crosscall2_ptr(SB), AX
+	MOVL	$crosscall2_trampoline<>(SB), BX
+	MOVL	BX, (AX)
+	RET
+
+TEXT crosscall2_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	crosscall2(SB)
+
 // Called by C code generated by cmd/cgo.
 // func crosscall2(fn, a unsafe.Pointer, n int32, ctxt uintptr)
 // Saves C callee-saved registers and calls cgocallback with three arguments.
diff --git a/src/runtime/cgo/asm_amd64.s b/src/runtime/cgo/asm_amd64.s
index 386299c..e319094 100644
--- a/src/runtime/cgo/asm_amd64.s
+++ b/src/runtime/cgo/asm_amd64.s
@@ -5,12 +5,25 @@
 #include "textflag.h"
 #include "abi_amd64.h"
 
+// Set the x_crosscall2_ptr C function pointer variable point to crosscall2.
+// It's such a pointer chain: _crosscall2_ptr -> x_crosscall2_ptr -> crosscall2
+// Use a local trampoline, to avoid taking the address of a dynamically exported
+// function.
+TEXT ·set_crosscall2(SB),NOSPLIT,$0-0
+	MOVQ	_crosscall2_ptr(SB), AX
+	MOVQ	$crosscall2_trampoline<>(SB), BX
+	MOVQ	BX, (AX)
+	RET
+
+TEXT crosscall2_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	crosscall2(SB)
+
 // Called by C code generated by cmd/cgo.
 // func crosscall2(fn, a unsafe.Pointer, n int32, ctxt uintptr)
 // Saves C callee-saved registers and calls cgocallback with three arguments.
 // fn is the PC of a func(a unsafe.Pointer) function.
 // This signature is known to SWIG, so we can't change it.
-TEXT crosscall2(SB),NOSPLIT,$0-0
+TEXT crosscall2(SB),NOSPLIT|NOFRAME,$0-0
 	PUSH_REGS_HOST_TO_ABI0()
 
 	// Make room for arguments to cgocallback.
diff --git a/src/runtime/cgo/asm_arm.s b/src/runtime/cgo/asm_arm.s
index ea55e17..095e9c0 100644
--- a/src/runtime/cgo/asm_arm.s
+++ b/src/runtime/cgo/asm_arm.s
@@ -4,6 +4,19 @@
 
 #include "textflag.h"
 
+// Set the x_crosscall2_ptr C function pointer variable point to crosscall2.
+// It's such a pointer chain: _crosscall2_ptr -> x_crosscall2_ptr -> crosscall2
+// Use a local trampoline, to avoid taking the address of a dynamically exported
+// function.
+TEXT ·set_crosscall2(SB),NOSPLIT,$0-0
+	MOVW	_crosscall2_ptr(SB), R1
+	MOVW	$crosscall2_trampoline<>(SB), R2
+	MOVW	R2, (R1)
+	RET
+
+TEXT crosscall2_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	crosscall2(SB)
+
 // Called by C code generated by cmd/cgo.
 // func crosscall2(fn, a unsafe.Pointer, n int32, ctxt uintptr)
 // Saves C callee-saved registers and calls cgocallback with three arguments.
diff --git a/src/runtime/cgo/asm_arm64.s b/src/runtime/cgo/asm_arm64.s
index e808ded..5492dc1 100644
--- a/src/runtime/cgo/asm_arm64.s
+++ b/src/runtime/cgo/asm_arm64.s
@@ -5,6 +5,19 @@
 #include "textflag.h"
 #include "abi_arm64.h"
 
+// Set the x_crosscall2_ptr C function pointer variable point to crosscall2.
+// It's such a pointer chain: _crosscall2_ptr -> x_crosscall2_ptr -> crosscall2
+// Use a local trampoline, to avoid taking the address of a dynamically exported
+// function.
+TEXT ·set_crosscall2(SB),NOSPLIT,$0-0
+	MOVD	_crosscall2_ptr(SB), R1
+	MOVD	$crosscall2_trampoline<>(SB), R2
+	MOVD	R2, (R1)
+	RET
+
+TEXT crosscall2_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	crosscall2(SB)
+
 // Called by C code generated by cmd/cgo.
 // func crosscall2(fn, a unsafe.Pointer, n int32, ctxt uintptr)
 // Saves C callee-saved registers and calls cgocallback with three arguments.
diff --git a/src/runtime/cgo/asm_loong64.s b/src/runtime/cgo/asm_loong64.s
index 961a3dd..19c8d74 100644
--- a/src/runtime/cgo/asm_loong64.s
+++ b/src/runtime/cgo/asm_loong64.s
@@ -3,6 +3,20 @@
 // license that can be found in the LICENSE file.
 
 #include "textflag.h"
+#include "abi_loong64.h"
+
+// Set the x_crosscall2_ptr C function pointer variable point to crosscall2.
+// It's such a pointer chain: _crosscall2_ptr -> x_crosscall2_ptr -> crosscall2
+// Use a local trampoline, to avoid taking the address of a dynamically exported
+// function.
+TEXT ·set_crosscall2(SB),NOSPLIT,$0-0
+	MOVV	_crosscall2_ptr(SB), R5
+	MOVV	$crosscall2_trampoline<>(SB), R6
+	MOVV	R6, (R5)
+	RET
+
+TEXT crosscall2_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	crosscall2(SB)
 
 // Called by C code generated by cmd/cgo.
 // func crosscall2(fn, a unsafe.Pointer, n int32, ctxt uintptr)
@@ -16,52 +30,24 @@
 	 *  first arg.
 	 */
 
-	ADDV	$(-8*22), R3
-	MOVV	R4, (8*1)(R3) // fn unsafe.Pointer
-	MOVV	R5, (8*2)(R3) // a unsafe.Pointer
-	MOVV	R7, (8*3)(R3) // ctxt uintptr
-	MOVV	R23, (8*4)(R3)
-	MOVV	R24, (8*5)(R3)
-	MOVV	R25, (8*6)(R3)
-	MOVV	R26, (8*7)(R3)
-	MOVV	R27, (8*8)(R3)
-	MOVV	R28, (8*9)(R3)
-	MOVV	R29, (8*10)(R3)
-	MOVV	R30, (8*11)(R3)
-	MOVV	g, (8*12)(R3)
-	MOVV	R1, (8*13)(R3)
-	MOVD	F24, (8*14)(R3)
-	MOVD	F25, (8*15)(R3)
-	MOVD	F26, (8*16)(R3)
-	MOVD	F27, (8*17)(R3)
-	MOVD	F28, (8*18)(R3)
-	MOVD	F29, (8*19)(R3)
-	MOVD	F30, (8*20)(R3)
-	MOVD	F31, (8*21)(R3)
+	ADDV	$(-23*8), R3
+	MOVV	R4, (1*8)(R3) // fn unsafe.Pointer
+	MOVV	R5, (2*8)(R3) // a unsafe.Pointer
+	MOVV	R7, (3*8)(R3) // ctxt uintptr
+
+	SAVE_R22_TO_R31((4*8))
+	SAVE_F24_TO_F31((14*8))
+	MOVV	R1, (22*8)(R3)
 
 	// Initialize Go ABI environment
 	JAL	runtime·load_g(SB)
 
 	JAL	runtime·cgocallback(SB)
 
-	MOVV	(8*4)(R3), R23
-	MOVV	(8*5)(R3), R24
-	MOVV	(8*6)(R3), R25
-	MOVV	(8*7)(R3), R26
-	MOVV	(8*8)(R3), R27
-	MOVV	(8*9)(R3), R28
-	MOVV	(8*10)(R3), R29
-	MOVV	(8*11)(R3), R30
-	MOVV	(8*12)(R3), g
-	MOVV	(8*13)(R3), R1
-	MOVD	(8*14)(R3), F24
-	MOVD	(8*15)(R3), F25
-	MOVD	(8*16)(R3), F26
-	MOVD	(8*17)(R3), F27
-	MOVD	(8*18)(R3), F28
-	MOVD	(8*19)(R3), F29
-	MOVD	(8*20)(R3), F30
-	MOVD	(8*21)(R3), F31
-	ADDV	$(8*22), R3
+	RESTORE_R22_TO_R31((4*8))
+	RESTORE_F24_TO_F31((14*8))
+	MOVV	(22*8)(R3), R1
+
+	ADDV	$(23*8), R3
 
 	RET
diff --git a/src/runtime/cgo/asm_mips64x.s b/src/runtime/cgo/asm_mips64x.s
index ba94807..af817d5 100644
--- a/src/runtime/cgo/asm_mips64x.s
+++ b/src/runtime/cgo/asm_mips64x.s
@@ -3,10 +3,22 @@
 // license that can be found in the LICENSE file.
 
 //go:build mips64 || mips64le
-// +build mips64 mips64le
 
 #include "textflag.h"
 
+// Set the x_crosscall2_ptr C function pointer variable point to crosscall2.
+// It's such a pointer chain: _crosscall2_ptr -> x_crosscall2_ptr -> crosscall2
+// Use a local trampoline, to avoid taking the address of a dynamically exported
+// function.
+TEXT ·set_crosscall2(SB),NOSPLIT,$0-0
+	MOVV	_crosscall2_ptr(SB), R5
+	MOVV	$crosscall2_trampoline<>(SB), R6
+	MOVV	R6, (R5)
+	RET
+
+TEXT crosscall2_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	crosscall2(SB)
+
 // Called by C code generated by cmd/cgo.
 // func crosscall2(fn, a unsafe.Pointer, n int32, ctxt uintptr)
 // Saves C callee-saved registers and calls cgocallback with three arguments.
diff --git a/src/runtime/cgo/asm_mipsx.s b/src/runtime/cgo/asm_mipsx.s
index fd5d78e..198c59a 100644
--- a/src/runtime/cgo/asm_mipsx.s
+++ b/src/runtime/cgo/asm_mipsx.s
@@ -3,10 +3,22 @@
 // license that can be found in the LICENSE file.
 
 //go:build mips || mipsle
-// +build mips mipsle
 
 #include "textflag.h"
 
+// Set the x_crosscall2_ptr C function pointer variable point to crosscall2.
+// It's such a pointer chain: _crosscall2_ptr -> x_crosscall2_ptr -> crosscall2
+// Use a local trampoline, to avoid taking the address of a dynamically exported
+// function.
+TEXT ·set_crosscall2(SB),NOSPLIT,$0-0
+	MOVW	_crosscall2_ptr(SB), R5
+	MOVW	$crosscall2_trampoline<>(SB), R6
+	MOVW	R6, (R5)
+	RET
+
+TEXT crosscall2_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	crosscall2(SB)
+
 // Called by C code generated by cmd/cgo.
 // func crosscall2(fn, a unsafe.Pointer, n int32, ctxt uintptr)
 // Saves C callee-saved registers and calls cgocallback with three arguments.
diff --git a/src/runtime/cgo/asm_ppc64x.s b/src/runtime/cgo/asm_ppc64x.s
index 187b2d4..a389745 100644
--- a/src/runtime/cgo/asm_ppc64x.s
+++ b/src/runtime/cgo/asm_ppc64x.s
@@ -3,10 +3,34 @@
 // license that can be found in the LICENSE file.
 
 //go:build ppc64 || ppc64le
-// +build ppc64 ppc64le
 
 #include "textflag.h"
 #include "asm_ppc64x.h"
+#include "abi_ppc64x.h"
+
+#ifdef GO_PPC64X_HAS_FUNCDESC
+// crosscall2 is marked with go:cgo_export_static. On AIX, this creates and exports
+// the symbol name and descriptor as the AIX linker expects, but does not work if
+// referenced from within Go. Create and use an aliased descriptor of crosscall2
+// to workaround this.
+DEFINE_PPC64X_FUNCDESC(_crosscall2<>, crosscall2)
+#define CROSSCALL2_FPTR $_crosscall2<>(SB)
+#else
+// Use a local trampoline, to avoid taking the address of a dynamically exported
+// function.
+#define CROSSCALL2_FPTR $crosscall2_trampoline<>(SB)
+#endif
+
+// Set the x_crosscall2_ptr C function pointer variable point to crosscall2.
+// It's such a pointer chain: _crosscall2_ptr -> x_crosscall2_ptr -> crosscall2
+TEXT ·set_crosscall2(SB),NOSPLIT,$0-0
+	MOVD	_crosscall2_ptr(SB), R5
+	MOVD	CROSSCALL2_FPTR, R6
+	MOVD	R6, (R5)
+	RET
+
+TEXT crosscall2_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	crosscall2(SB)
 
 // Called by C code generated by cmd/cgo.
 // func crosscall2(fn, a unsafe.Pointer, n int32, ctxt uintptr)
@@ -15,28 +39,24 @@
 // The value of R2 is saved on the new stack frame, and not
 // the caller's frame due to issue #43228.
 TEXT crosscall2(SB),NOSPLIT|NOFRAME,$0
-	// Start with standard C stack frame layout and linkage
-	MOVD	LR, R0
-	MOVD	R0, 16(R1)	// Save LR in caller's frame
-	MOVW	CR, R0		// Save CR in caller's frame
-	MOVW	R0, 8(R1)
-
-	BL	saveregs2<>(SB)
-
-	MOVDU	R1, (-288-3*8-FIXED_FRAME)(R1)
-	// Save the caller's R2
+	// Start with standard C stack frame layout and linkage, allocate
+	// 32 bytes of argument space, save callee-save regs, and set R0 to $0.
+	STACK_AND_SAVE_HOST_TO_GO_ABI(32)
+	// The above will not preserve R2 (TOC). Save it in case Go is
+	// compiled without a TOC pointer (e.g -buildmode=default).
 	MOVD	R2, 24(R1)
 
-	// Initialize Go ABI environment
-	BL	runtime·reginit(SB)
+	// Load the current g.
 	BL	runtime·load_g(SB)
 
-#ifdef GOARCH_ppc64
-	// ppc64 use elf ABI v1. we must get the real entry address from
-	// first slot of the function descriptor before call.
-	// Same for AIX.
+#ifdef GO_PPC64X_HAS_FUNCDESC
+	// Load the real entry address from the first slot of the function descriptor.
+	// The first argument fn might be null, that means dropm in pthread key destructor.
+	CMP	R3, $0
+	BEQ	nil_fn
 	MOVD	8(R3), R2
 	MOVD	(R3), R3
+nil_fn:
 #endif
 	MOVD	R3, FIXED_FRAME+0(R1)	// fn unsafe.Pointer
 	MOVD	R4, FIXED_FRAME+8(R1)	// a unsafe.Pointer
@@ -44,96 +64,7 @@
 	MOVD	R6, FIXED_FRAME+16(R1)	// ctxt uintptr
 	BL	runtime·cgocallback(SB)
 
-	// Restore the caller's R2
+	// Restore the old frame, and R2.
 	MOVD	24(R1), R2
-	ADD	$(288+3*8+FIXED_FRAME), R1
-
-	BL	restoreregs2<>(SB)
-
-	MOVW	8(R1), R0
-	MOVFL	R0, $0xff
-	MOVD	16(R1), R0
-	MOVD	R0, LR
-	RET
-
-TEXT saveregs2<>(SB),NOSPLIT|NOFRAME,$0
-	// O=-288; for R in R{14..31}; do echo "\tMOVD\t$R, $O(R1)"|sed s/R30/g/; ((O+=8)); done; for F in F{14..31}; do echo "\tFMOVD\t$F, $O(R1)"; ((O+=8)); done
-	MOVD	R14, -288(R1)
-	MOVD	R15, -280(R1)
-	MOVD	R16, -272(R1)
-	MOVD	R17, -264(R1)
-	MOVD	R18, -256(R1)
-	MOVD	R19, -248(R1)
-	MOVD	R20, -240(R1)
-	MOVD	R21, -232(R1)
-	MOVD	R22, -224(R1)
-	MOVD	R23, -216(R1)
-	MOVD	R24, -208(R1)
-	MOVD	R25, -200(R1)
-	MOVD	R26, -192(R1)
-	MOVD	R27, -184(R1)
-	MOVD	R28, -176(R1)
-	MOVD	R29, -168(R1)
-	MOVD	g, -160(R1)
-	MOVD	R31, -152(R1)
-	FMOVD	F14, -144(R1)
-	FMOVD	F15, -136(R1)
-	FMOVD	F16, -128(R1)
-	FMOVD	F17, -120(R1)
-	FMOVD	F18, -112(R1)
-	FMOVD	F19, -104(R1)
-	FMOVD	F20, -96(R1)
-	FMOVD	F21, -88(R1)
-	FMOVD	F22, -80(R1)
-	FMOVD	F23, -72(R1)
-	FMOVD	F24, -64(R1)
-	FMOVD	F25, -56(R1)
-	FMOVD	F26, -48(R1)
-	FMOVD	F27, -40(R1)
-	FMOVD	F28, -32(R1)
-	FMOVD	F29, -24(R1)
-	FMOVD	F30, -16(R1)
-	FMOVD	F31, -8(R1)
-
-	RET
-
-TEXT restoreregs2<>(SB),NOSPLIT|NOFRAME,$0
-	// O=-288; for R in R{14..31}; do echo "\tMOVD\t$O(R1), $R"|sed s/R30/g/; ((O+=8)); done; for F in F{14..31}; do echo "\tFMOVD\t$O(R1), $F"; ((O+=8)); done
-	MOVD	-288(R1), R14
-	MOVD	-280(R1), R15
-	MOVD	-272(R1), R16
-	MOVD	-264(R1), R17
-	MOVD	-256(R1), R18
-	MOVD	-248(R1), R19
-	MOVD	-240(R1), R20
-	MOVD	-232(R1), R21
-	MOVD	-224(R1), R22
-	MOVD	-216(R1), R23
-	MOVD	-208(R1), R24
-	MOVD	-200(R1), R25
-	MOVD	-192(R1), R26
-	MOVD	-184(R1), R27
-	MOVD	-176(R1), R28
-	MOVD	-168(R1), R29
-	MOVD	-160(R1), g
-	MOVD	-152(R1), R31
-	FMOVD	-144(R1), F14
-	FMOVD	-136(R1), F15
-	FMOVD	-128(R1), F16
-	FMOVD	-120(R1), F17
-	FMOVD	-112(R1), F18
-	FMOVD	-104(R1), F19
-	FMOVD	-96(R1), F20
-	FMOVD	-88(R1), F21
-	FMOVD	-80(R1), F22
-	FMOVD	-72(R1), F23
-	FMOVD	-64(R1), F24
-	FMOVD	-56(R1), F25
-	FMOVD	-48(R1), F26
-	FMOVD	-40(R1), F27
-	FMOVD	-32(R1), F28
-	FMOVD	-24(R1), F29
-	FMOVD	-16(R1), F30
-	FMOVD	-8(R1), F31
-
+	UNSTACK_AND_RESTORE_GO_TO_HOST_ABI(32)
 	RET
diff --git a/src/runtime/cgo/asm_riscv64.s b/src/runtime/cgo/asm_riscv64.s
index 45151bf..d75a543 100644
--- a/src/runtime/cgo/asm_riscv64.s
+++ b/src/runtime/cgo/asm_riscv64.s
@@ -4,6 +4,19 @@
 
 #include "textflag.h"
 
+// Set the x_crosscall2_ptr C function pointer variable point to crosscall2.
+// It's such a pointer chain: _crosscall2_ptr -> x_crosscall2_ptr -> crosscall2
+// Use a local trampoline, to avoid taking the address of a dynamically exported
+// function.
+TEXT ·set_crosscall2(SB),NOSPLIT,$0-0
+	MOV	_crosscall2_ptr(SB), X7
+	MOV	$crosscall2_trampoline<>(SB), X8
+	MOV	X8, (X7)
+	RET
+
+TEXT crosscall2_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	crosscall2(SB)
+
 // Called by C code generated by cmd/cgo.
 // func crosscall2(fn, a unsafe.Pointer, n int32, ctxt uintptr)
 // Saves C callee-saved registers and calls cgocallback with three arguments.
diff --git a/src/runtime/cgo/asm_s390x.s b/src/runtime/cgo/asm_s390x.s
index 8bf16e7..8f74fd5 100644
--- a/src/runtime/cgo/asm_s390x.s
+++ b/src/runtime/cgo/asm_s390x.s
@@ -4,6 +4,19 @@
 
 #include "textflag.h"
 
+// Set the x_crosscall2_ptr C function pointer variable point to crosscall2.
+// It's such a pointer chain: _crosscall2_ptr -> x_crosscall2_ptr -> crosscall2
+// Use a local trampoline, to avoid taking the address of a dynamically exported
+// function.
+TEXT ·set_crosscall2(SB),NOSPLIT,$0-0
+	MOVD	_crosscall2_ptr(SB), R1
+	MOVD	$crosscall2_trampoline<>(SB), R2
+	MOVD	R2, (R1)
+	RET
+
+TEXT crosscall2_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	crosscall2(SB)
+
 // Called by C code generated by cmd/cgo.
 // func crosscall2(fn, a unsafe.Pointer, n int32, ctxt uintptr)
 // Saves C callee-saved registers and calls cgocallback with three arguments.
diff --git a/src/runtime/cgo/asm_wasm.s b/src/runtime/cgo/asm_wasm.s
index cb140eb..e7f01bd 100644
--- a/src/runtime/cgo/asm_wasm.s
+++ b/src/runtime/cgo/asm_wasm.s
@@ -4,5 +4,8 @@
 
 #include "textflag.h"
 
+TEXT ·set_crosscall2(SB),NOSPLIT,$0-0
+	UNDEF
+
 TEXT crosscall2(SB), NOSPLIT, $0
 	UNDEF
diff --git a/src/runtime/cgo/callbacks.go b/src/runtime/cgo/callbacks.go
index e7c8ef3..3c246a8 100644
--- a/src/runtime/cgo/callbacks.go
+++ b/src/runtime/cgo/callbacks.go
@@ -71,6 +71,42 @@
 var x_cgo_sys_thread_create byte
 var _cgo_sys_thread_create = &x_cgo_sys_thread_create
 
+// Indicates whether a dummy thread key has been created or not.
+//
+// When calling go exported function from C, we register a destructor
+// callback, for a dummy thread key, by using pthread_key_create.
+
+//go:cgo_import_static x_cgo_pthread_key_created
+//go:linkname x_cgo_pthread_key_created x_cgo_pthread_key_created
+//go:linkname _cgo_pthread_key_created _cgo_pthread_key_created
+var x_cgo_pthread_key_created byte
+var _cgo_pthread_key_created = &x_cgo_pthread_key_created
+
+// Export crosscall2 to a c function pointer variable.
+// Used to dropm in pthread key destructor, while C thread is exiting.
+
+//go:cgo_import_static x_crosscall2_ptr
+//go:linkname x_crosscall2_ptr x_crosscall2_ptr
+//go:linkname _crosscall2_ptr _crosscall2_ptr
+var x_crosscall2_ptr byte
+var _crosscall2_ptr = &x_crosscall2_ptr
+
+// Set the x_crosscall2_ptr C function pointer variable point to crosscall2.
+// It's for the runtime package to call at init time.
+func set_crosscall2()
+
+//go:linkname _set_crosscall2 runtime.set_crosscall2
+var _set_crosscall2 = set_crosscall2
+
+// Store the g into the thread-specific value.
+// So that pthread_key_destructor will dropm when the thread is exiting.
+
+//go:cgo_import_static x_cgo_bindm
+//go:linkname x_cgo_bindm x_cgo_bindm
+//go:linkname _cgo_bindm _cgo_bindm
+var x_cgo_bindm byte
+var _cgo_bindm = &x_cgo_bindm
+
 // Notifies that the runtime has been initialized.
 //
 // We currently block at every CGO entry point (via _cgo_wait_runtime_init_done)
@@ -105,3 +141,12 @@
 
 //go:cgo_export_static _cgo_topofstack
 //go:cgo_export_dynamic _cgo_topofstack
+
+// x_cgo_getstackbound gets the thread's C stack size and
+// set the G's stack bound based on the stack size.
+
+//go:cgo_import_static x_cgo_getstackbound
+//go:linkname x_cgo_getstackbound x_cgo_getstackbound
+//go:linkname _cgo_getstackbound _cgo_getstackbound
+var x_cgo_getstackbound byte
+var _cgo_getstackbound = &x_cgo_getstackbound
diff --git a/src/runtime/cgo/cgo.go b/src/runtime/cgo/cgo.go
index b8473e5..1e3a502 100644
--- a/src/runtime/cgo/cgo.go
+++ b/src/runtime/cgo/cgo.go
@@ -23,8 +23,8 @@
 #cgo solaris LDFLAGS: -lxnet
 #cgo solaris LDFLAGS: -lsocket
 
-// We use -fno-stack-protector because internal linking won't find
-// the support functions. See issues #52919 and #54313.
+// Use -fno-stack-protector to avoid problems locating the
+// proper support functions. See issues #52919, #54313, #58385.
 #cgo CFLAGS: -Wall -Werror -fno-stack-protector
 
 #cgo solaris CPPFLAGS: -D_POSIX_PTHREAD_SEMANTICS
diff --git a/src/runtime/cgo/gcc_386.S b/src/runtime/cgo/gcc_386.S
index 5e6d715..5bd677f 100644
--- a/src/runtime/cgo/gcc_386.S
+++ b/src/runtime/cgo/gcc_386.S
@@ -5,9 +5,9 @@
 .file "gcc_386.S"
 
 /*
- * Apple still insists on underscore prefixes for C function names.
+ * Windows still insists on underscore prefixes for C function names.
  */
-#if defined(__APPLE__) || defined(_WIN32)
+#if defined(_WIN32)
 #define EXT(s) _##s
 #else
 #define EXT(s) s
diff --git a/src/runtime/cgo/gcc_aix_ppc64.S b/src/runtime/cgo/gcc_aix_ppc64.S
index a77363e..6f465f0 100644
--- a/src/runtime/cgo/gcc_aix_ppc64.S
+++ b/src/runtime/cgo/gcc_aix_ppc64.S
@@ -2,9 +2,6 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// +build ppc64
-// +build aix
-
 .file "gcc_aix_ppc64.S"
 
 /*
diff --git a/src/runtime/cgo/gcc_aix_ppc64.c b/src/runtime/cgo/gcc_aix_ppc64.c
index f4f50b8..9dd9524 100644
--- a/src/runtime/cgo/gcc_aix_ppc64.c
+++ b/src/runtime/cgo/gcc_aix_ppc64.c
@@ -2,9 +2,6 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// +build aix
-// +build ppc64 ppc64le
-
 /*
  * On AIX, call to _cgo_topofstack and Go main are forced to be a longcall.
  * Without it, ld might add trampolines in the middle of .text section
diff --git a/src/runtime/cgo/gcc_arm.S b/src/runtime/cgo/gcc_arm.S
index 6e8c14a..474fc23 100644
--- a/src/runtime/cgo/gcc_arm.S
+++ b/src/runtime/cgo/gcc_arm.S
@@ -5,27 +5,14 @@
 .file "gcc_arm.S"
 
 /*
- * Apple still insists on underscore prefixes for C function names.
- */
-#if defined(__APPLE__)
-#define EXT(s) _##s
-#else
-#define EXT(s) s
-#endif
-
-// Apple's ld64 wants 4-byte alignment for ARM code sections.
-// .align in both Apple as and GNU as treat n as aligning to 2**n bytes.
-.align	2
-
-/*
  * void crosscall_arm1(void (*fn)(void), void (*setg_gcc)(void *g), void *g)
  *
  * Calling into the 5c tool chain, where all registers are caller save.
  * Called from standard ARM EABI, where r4-r11 are callee-save, so they
  * must be saved explicitly.
  */
-.globl EXT(crosscall_arm1)
-EXT(crosscall_arm1):
+.globl crosscall_arm1
+crosscall_arm1:
 	push {r4, r5, r6, r7, r8, r9, r10, r11, ip, lr}
 	mov r4, r0
 	mov r5, r1
diff --git a/src/runtime/cgo/gcc_context.c b/src/runtime/cgo/gcc_context.c
index 5fc0abb..ad58692 100644
--- a/src/runtime/cgo/gcc_context.c
+++ b/src/runtime/cgo/gcc_context.c
@@ -2,8 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// +build cgo
-// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris windows
+//go:build unix || windows
 
 #include "libcgo.h"
 
diff --git a/src/runtime/cgo/gcc_fatalf.c b/src/runtime/cgo/gcc_fatalf.c
index 597e750..9493dbb 100644
--- a/src/runtime/cgo/gcc_fatalf.c
+++ b/src/runtime/cgo/gcc_fatalf.c
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// +build aix !android,linux freebsd
+//go:build aix || (!android && linux) || freebsd
 
 #include <stdarg.h>
 #include <stdio.h>
diff --git a/src/runtime/cgo/gcc_freebsd_sigaction.c b/src/runtime/cgo/gcc_freebsd_sigaction.c
index 98b122d..b324983 100644
--- a/src/runtime/cgo/gcc_freebsd_sigaction.c
+++ b/src/runtime/cgo/gcc_freebsd_sigaction.c
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// +build freebsd,amd64
+//go:build freebsd && amd64
 
 #include <errno.h>
 #include <stddef.h>
diff --git a/src/runtime/cgo/gcc_libinit.c b/src/runtime/cgo/gcc_libinit.c
index 3304d95..9676593 100644
--- a/src/runtime/cgo/gcc_libinit.c
+++ b/src/runtime/cgo/gcc_libinit.c
@@ -2,8 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// +build cgo
-// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris
+//go:build unix
 
 #include <pthread.h>
 #include <errno.h>
@@ -18,6 +17,14 @@
 static pthread_mutex_t runtime_init_mu = PTHREAD_MUTEX_INITIALIZER;
 static int runtime_init_done;
 
+// pthread_g is a pthread specific key, for storing the g that binded to the C thread.
+// The registered pthread_key_destructor will dropm, when the pthread-specified value g is not NULL,
+// while a C thread is exiting.
+static pthread_key_t pthread_g;
+static void pthread_key_destructor(void* g);
+uintptr_t x_cgo_pthread_key_created;
+void (*x_crosscall2_ptr)(void (*fn)(void *), void *, int, size_t);
+
 // The context function, used when tracing back C calls into Go.
 static void (*cgo_context_function)(struct context_arg*);
 
@@ -40,6 +47,12 @@
 		pthread_cond_wait(&runtime_init_cond, &runtime_init_mu);
 	}
 
+	// The key and x_cgo_pthread_key_created are for the whole program,
+	// whereas the specific and destructor is per thread.
+	if (x_cgo_pthread_key_created == 0 && pthread_key_create(&pthread_g, pthread_key_destructor) == 0) {
+		x_cgo_pthread_key_created = 1;
+	}
+
 	// TODO(iant): For the case of a new C thread calling into Go, such
 	// as when using -buildmode=c-archive, we know that Go runtime
 	// initialization is complete but we do not know that all Go init
@@ -62,6 +75,16 @@
 	return 0;
 }
 
+// Store the g into a thread-specific value associated with the pthread key pthread_g.
+// And pthread_key_destructor will dropm when the thread is exiting.
+void x_cgo_bindm(void* g) {
+	// We assume this will always succeed, otherwise, there might be extra M leaking,
+	// when a C thread exits after a cgo call.
+	// We only invoke this function once per thread in runtime.needAndBindM,
+	// and the next calls just reuse the bound m.
+	pthread_setspecific(pthread_g, g);
+}
+
 void
 x_cgo_notify_runtime_init_done(void* dummy __attribute__ ((unused))) {
 	pthread_mutex_lock(&runtime_init_mu);
@@ -111,3 +134,14 @@
 	}
 	return EAGAIN;
 }
+
+static void
+pthread_key_destructor(void* g) {
+	if (x_crosscall2_ptr != NULL) {
+		// fn == NULL means dropm.
+		// We restore g by using the stored g, before dropm in runtime.cgocallback,
+		// since the g stored in the TLS by Go might be cleared in some platforms,
+		// before this destructor invoked.
+		x_crosscall2_ptr(NULL, g, 0, 0);
+	}
+}
diff --git a/src/runtime/cgo/gcc_libinit_windows.c b/src/runtime/cgo/gcc_libinit_windows.c
index 2b5896b..9a8c65e 100644
--- a/src/runtime/cgo/gcc_libinit_windows.c
+++ b/src/runtime/cgo/gcc_libinit_windows.c
@@ -2,8 +2,6 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// +build cgo
-
 #define WIN32_LEAN_AND_MEAN
 #include <windows.h>
 #include <process.h>
@@ -32,6 +30,9 @@
 static HANDLE runtime_init_wait;
 static int runtime_init_done;
 
+uintptr_t x_cgo_pthread_key_created;
+void (*x_crosscall2_ptr)(void (*fn)(void *), void *, int, size_t);
+
 // Pre-initialize the runtime synchronization objects
 void
 _cgo_preinit_init() {
@@ -93,6 +94,12 @@
 	return 0;
 }
 
+// Should not be used since x_cgo_pthread_key_created will always be zero.
+void x_cgo_bindm(void* dummy) {
+	fprintf(stderr, "unexpected cgo_bindm on Windows\n");
+	abort();
+}
+
 void
 x_cgo_notify_runtime_init_done(void* dummy) {
 	 _cgo_maybe_run_preinit();
diff --git a/src/runtime/cgo/gcc_linux_mips64x.c b/src/runtime/cgo/gcc_linux_mips64x.c
index 3ea29b0..c059fd1 100644
--- a/src/runtime/cgo/gcc_linux_mips64x.c
+++ b/src/runtime/cgo/gcc_linux_mips64x.c
@@ -2,9 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// +build cgo
-// +build linux
-// +build mips64 mips64le
+//go:build linux && (mips64 || mips64le)
 
 #include <pthread.h>
 #include <string.h>
diff --git a/src/runtime/cgo/gcc_linux_mipsx.c b/src/runtime/cgo/gcc_linux_mipsx.c
index 3b60a0e..218b8fd 100644
--- a/src/runtime/cgo/gcc_linux_mipsx.c
+++ b/src/runtime/cgo/gcc_linux_mipsx.c
@@ -2,9 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// +build cgo
-// +build linux
-// +build mips mipsle
+//go:build linux && (mips || mipsle)
 
 #include <pthread.h>
 #include <string.h>
diff --git a/src/runtime/cgo/gcc_linux_ppc64x.S b/src/runtime/cgo/gcc_linux_ppc64x.S
index 957ef3a..745d232 100644
--- a/src/runtime/cgo/gcc_linux_ppc64x.S
+++ b/src/runtime/cgo/gcc_linux_ppc64x.S
@@ -2,19 +2,40 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// +build ppc64 ppc64le
-// +build linux
+//go:build linux && (ppc64 || ppc64le)
 
 .file "gcc_linux_ppc64x.S"
 
-/*
- * Apple still insists on underscore prefixes for C function names.
- */
-#if defined(__APPLE__)
-#define EXT(s) _##s
-#else
-#define EXT(s) s
-#endif
+// Define a frame which has no argument space, but is compatible with
+// a call into a Go ABI. We allocate 32B to match FIXED_FRAME with
+// similar semantics, except we store the backchain pointer, not the
+// LR at offset 0. R2 is stored in the Go TOC save slot (offset 24).
+.set GPR_OFFSET, 32
+.set FPR_OFFSET, GPR_OFFSET + 18*8
+.set VR_OFFSET, FPR_OFFSET + 18*8
+.set FRAME_SIZE, VR_OFFSET + 12*16
+
+.macro FOR_EACH_GPR opcode r=14
+.ifge 31 - \r
+	\opcode \r, GPR_OFFSET + 8*(\r-14)(1)
+	FOR_EACH_GPR \opcode "(\r+1)"
+.endif
+.endm
+
+.macro FOR_EACH_FPR opcode fr=14
+.ifge 31 - \fr
+	\opcode \fr, FPR_OFFSET + 8*(\fr-14)(1)
+	FOR_EACH_FPR \opcode "(\fr+1)"
+.endif
+.endm
+
+.macro FOR_EACH_VR opcode vr=20
+.ifge 31 - \vr
+	li 0, VR_OFFSET + 16*(\vr-20)
+	\opcode \vr, 1, 0
+	FOR_EACH_VR \opcode "(\vr+1)"
+.endif
+.endm
 
 /*
  * void crosscall_ppc64(void (*fn)(void), void *g)
@@ -23,18 +44,22 @@
  * Called from standard ppc64 C ABI, where r2, r14-r31, f14-f31 are
  * callee-save, so they must be saved explicitly.
  */
-.globl EXT(crosscall_ppc64)
-EXT(crosscall_ppc64):
+.globl crosscall_ppc64
+crosscall_ppc64:
 	// Start with standard C stack frame layout and linkage
 	mflr	%r0
 	std	%r0, 16(%r1)	// Save LR in caller's frame
-	std	%r2, 24(%r1)	// Save TOC in caller's frame
-	bl	saveregs
-	stdu	%r1, -296(%r1)
+	mfcr	%r0
+	std	%r0, 8(%r1)	// Save CR in caller's frame
+	stdu	%r1, -FRAME_SIZE(%r1)
+	std	%r2, 24(%r1)
+
+	FOR_EACH_GPR std
+	FOR_EACH_FPR stfd
+	FOR_EACH_VR stvx
 
 	// Set up Go ABI constant registers
-	bl	_cgo_reginit
-	nop
+	li	%r0, 0
 
 	// Restore g pointer (r30 in Go ABI, which may have been clobbered by C)
 	mr	%r30, %r4
@@ -44,97 +69,18 @@
 	mtctr	%r3
 	bctrl
 
-	addi	%r1, %r1, 296
-	bl	restoreregs
+	FOR_EACH_GPR ld
+	FOR_EACH_FPR lfd
+	FOR_EACH_VR lvx
+
 	ld	%r2, 24(%r1)
+	addi	%r1, %r1, FRAME_SIZE
 	ld	%r0, 16(%r1)
 	mtlr	%r0
+	ld	%r0, 8(%r1)
+	mtcr	%r0
 	blr
 
-saveregs:
-	// Save callee-save registers
-	// O=-288; for R in %r{14..31}; do echo "\tstd\t$R, $O(%r1)"; ((O+=8)); done; for F in f{14..31}; do echo "\tstfd\t$F, $O(%r1)"; ((O+=8)); done
-	std	%r14, -288(%r1)
-	std	%r15, -280(%r1)
-	std	%r16, -272(%r1)
-	std	%r17, -264(%r1)
-	std	%r18, -256(%r1)
-	std	%r19, -248(%r1)
-	std	%r20, -240(%r1)
-	std	%r21, -232(%r1)
-	std	%r22, -224(%r1)
-	std	%r23, -216(%r1)
-	std	%r24, -208(%r1)
-	std	%r25, -200(%r1)
-	std	%r26, -192(%r1)
-	std	%r27, -184(%r1)
-	std	%r28, -176(%r1)
-	std	%r29, -168(%r1)
-	std	%r30, -160(%r1)
-	std	%r31, -152(%r1)
-	stfd	%f14, -144(%r1)
-	stfd	%f15, -136(%r1)
-	stfd	%f16, -128(%r1)
-	stfd	%f17, -120(%r1)
-	stfd	%f18, -112(%r1)
-	stfd	%f19, -104(%r1)
-	stfd	%f20, -96(%r1)
-	stfd	%f21, -88(%r1)
-	stfd	%f22, -80(%r1)
-	stfd	%f23, -72(%r1)
-	stfd	%f24, -64(%r1)
-	stfd	%f25, -56(%r1)
-	stfd	%f26, -48(%r1)
-	stfd	%f27, -40(%r1)
-	stfd	%f28, -32(%r1)
-	stfd	%f29, -24(%r1)
-	stfd	%f30, -16(%r1)
-	stfd	%f31, -8(%r1)
-
-	blr
-
-restoreregs:
-	// O=-288; for R in %r{14..31}; do echo "\tld\t$R, $O(%r1)"; ((O+=8)); done; for F in %f{14..31}; do echo "\tlfd\t$F, $O(%r1)"; ((O+=8)); done
-	ld	%r14, -288(%r1)
-	ld	%r15, -280(%r1)
-	ld	%r16, -272(%r1)
-	ld	%r17, -264(%r1)
-	ld	%r18, -256(%r1)
-	ld	%r19, -248(%r1)
-	ld	%r20, -240(%r1)
-	ld	%r21, -232(%r1)
-	ld	%r22, -224(%r1)
-	ld	%r23, -216(%r1)
-	ld	%r24, -208(%r1)
-	ld	%r25, -200(%r1)
-	ld	%r26, -192(%r1)
-	ld	%r27, -184(%r1)
-	ld	%r28, -176(%r1)
-	ld	%r29, -168(%r1)
-	ld	%r30, -160(%r1)
-	ld	%r31, -152(%r1)
-	lfd	%f14, -144(%r1)
-	lfd	%f15, -136(%r1)
-	lfd	%f16, -128(%r1)
-	lfd	%f17, -120(%r1)
-	lfd	%f18, -112(%r1)
-	lfd	%f19, -104(%r1)
-	lfd	%f20, -96(%r1)
-	lfd	%f21, -88(%r1)
-	lfd	%f22, -80(%r1)
-	lfd	%f23, -72(%r1)
-	lfd	%f24, -64(%r1)
-	lfd	%f25, -56(%r1)
-	lfd	%f26, -48(%r1)
-	lfd	%f27, -40(%r1)
-	lfd	%f28, -32(%r1)
-	lfd	%f29, -24(%r1)
-	lfd	%f30, -16(%r1)
-	lfd	%f31, -8(%r1)
-
-	blr
-
-
 #ifdef __ELF__
 .section .note.GNU-stack,"",%progbits
 #endif
diff --git a/src/runtime/cgo/gcc_mips64x.S b/src/runtime/cgo/gcc_mips64x.S
index ec24d71..1629e47 100644
--- a/src/runtime/cgo/gcc_mips64x.S
+++ b/src/runtime/cgo/gcc_mips64x.S
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// +build mips64 mips64le
+//go:build mips64 || mips64le
 
 .file "gcc_mips64x.S"
 
diff --git a/src/runtime/cgo/gcc_mipsx.S b/src/runtime/cgo/gcc_mipsx.S
index 2867f6a..fb19c11 100644
--- a/src/runtime/cgo/gcc_mipsx.S
+++ b/src/runtime/cgo/gcc_mipsx.S
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// +build mips mipsle
+//go:build mips || mipsle
 
 .file "gcc_mipsx.S"
 
diff --git a/src/runtime/cgo/gcc_mmap.c b/src/runtime/cgo/gcc_mmap.c
index 83d857f..1fbd5e8 100644
--- a/src/runtime/cgo/gcc_mmap.c
+++ b/src/runtime/cgo/gcc_mmap.c
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// +build linux,amd64 linux,arm64 linux,ppc64le freebsd,amd64
+//go:build (linux && (amd64 || arm64 || ppc64le)) || (freebsd && amd64)
 
 #include <errno.h>
 #include <stdint.h>
diff --git a/src/runtime/cgo/gcc_ppc64x.c b/src/runtime/cgo/gcc_ppc64x.c
index 9cb6e0c..bfdcf65 100644
--- a/src/runtime/cgo/gcc_ppc64x.c
+++ b/src/runtime/cgo/gcc_ppc64x.c
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// +build ppc64 ppc64le
+//go:build ppc64 || ppc64le
 
 #include <pthread.h>
 #include <string.h>
@@ -61,7 +61,9 @@
 	ThreadStart ts;
 
 	ts = *(ThreadStart*)v;
+	_cgo_tsan_acquire();
 	free(v);
+	_cgo_tsan_release();
 
 	// Save g for this thread in C TLS
 	setg_gcc((void*)ts.g);
diff --git a/src/runtime/cgo/gcc_setenv.c b/src/runtime/cgo/gcc_setenv.c
index d4f7983..47caa4b 100644
--- a/src/runtime/cgo/gcc_setenv.c
+++ b/src/runtime/cgo/gcc_setenv.c
@@ -2,8 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// +build cgo
-// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris
+//go:build unix
 
 #include "libcgo.h"
 
diff --git a/src/runtime/cgo/gcc_sigaction.c b/src/runtime/cgo/gcc_sigaction.c
index fcf1e50..374909b 100644
--- a/src/runtime/cgo/gcc_sigaction.c
+++ b/src/runtime/cgo/gcc_sigaction.c
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// +build linux,amd64 linux,arm64 linux,ppc64le
+//go:build linux && (amd64 || arm64 || ppc64le)
 
 #include <errno.h>
 #include <stddef.h>
diff --git a/src/runtime/cgo/gcc_signal2_ios_arm64.c b/src/runtime/cgo/gcc_signal2_ios_arm64.c
index 5b8a18f..f8cef54 100644
--- a/src/runtime/cgo/gcc_signal2_ios_arm64.c
+++ b/src/runtime/cgo/gcc_signal2_ios_arm64.c
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// +build lldb
+//go:build lldb
 
 // Used by gcc_signal_darwin_arm64.c when doing the test build during cgo.
 // We hope that for real binaries the definition provided by Go will take precedence
diff --git a/src/runtime/cgo/gcc_signal_ios_arm64.c b/src/runtime/cgo/gcc_signal_ios_arm64.c
index 6519edd..87055e9 100644
--- a/src/runtime/cgo/gcc_signal_ios_arm64.c
+++ b/src/runtime/cgo/gcc_signal_ios_arm64.c
@@ -17,7 +17,7 @@
 //
 // The dist tool enables this by build flag when testing.
 
-// +build lldb
+//go:build lldb
 
 #include <limits.h>
 #include <pthread.h>
diff --git a/src/runtime/cgo/gcc_signal_ios_nolldb.c b/src/runtime/cgo/gcc_signal_ios_nolldb.c
index cfa4025..9ddc37a 100644
--- a/src/runtime/cgo/gcc_signal_ios_nolldb.c
+++ b/src/runtime/cgo/gcc_signal_ios_nolldb.c
@@ -2,9 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// +build !lldb
-// +build ios
-// +build arm64
+//go:build !lldb && ios && arm64
 
 #include <stdint.h>
 
diff --git a/src/runtime/cgo/gcc_stack_darwin.c b/src/runtime/cgo/gcc_stack_darwin.c
new file mode 100644
index 0000000..0a9038e
--- /dev/null
+++ b/src/runtime/cgo/gcc_stack_darwin.c
@@ -0,0 +1,20 @@
+// Copyright 2023 The Go 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 <pthread.h>
+#include "libcgo.h"
+
+void
+x_cgo_getstackbound(uintptr bounds[2])
+{
+	void* addr;
+	size_t size;
+	pthread_t p;
+
+	p = pthread_self();
+	addr = pthread_get_stackaddr_np(p); // high address (!)
+	size = pthread_get_stacksize_np(p);
+	bounds[0] = (uintptr)addr - size;
+	bounds[1] = (uintptr)addr;
+}
diff --git a/src/runtime/cgo/gcc_stack_unix.c b/src/runtime/cgo/gcc_stack_unix.c
new file mode 100644
index 0000000..f3fead9
--- /dev/null
+++ b/src/runtime/cgo/gcc_stack_unix.c
@@ -0,0 +1,40 @@
+// Copyright 2023 The Go 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:build unix && !darwin
+
+#ifndef _GNU_SOURCE // pthread_getattr_np
+#define _GNU_SOURCE
+#endif
+
+#include <pthread.h>
+#include "libcgo.h"
+
+void
+x_cgo_getstackbound(uintptr bounds[2])
+{
+	pthread_attr_t attr;
+	void *addr;
+	size_t size;
+
+#if defined(__GLIBC__) || (defined(__sun) && !defined(__illumos__))
+	// pthread_getattr_np is a GNU extension supported in glibc.
+	// Solaris is not glibc but does support pthread_getattr_np
+	// (and the fallback doesn't work...). Illumos does not.
+	pthread_getattr_np(pthread_self(), &attr);  // GNU extension
+	pthread_attr_getstack(&attr, &addr, &size); // low address
+#elif defined(__illumos__)
+	pthread_attr_init(&attr);
+	pthread_attr_get_np(pthread_self(), &attr);
+	pthread_attr_getstack(&attr, &addr, &size); // low address
+#else
+	pthread_attr_init(&attr);
+	pthread_attr_getstacksize(&attr, &size);
+	addr = __builtin_frame_address(0) + 4096 - size;
+#endif
+	pthread_attr_destroy(&attr);
+
+	bounds[0] = (uintptr)addr;
+	bounds[1] = (uintptr)addr + size;
+}
diff --git a/src/runtime/cgo/gcc_stack_windows.c b/src/runtime/cgo/gcc_stack_windows.c
new file mode 100644
index 0000000..d798cc7
--- /dev/null
+++ b/src/runtime/cgo/gcc_stack_windows.c
@@ -0,0 +1,7 @@
+// Copyright 2023 The Go 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 "libcgo.h"
+
+void x_cgo_getstackbound(uintptr bounds[2]) {} // no-op for now
diff --git a/src/runtime/cgo/gcc_traceback.c b/src/runtime/cgo/gcc_traceback.c
index 6e9470c..c6643a1 100644
--- a/src/runtime/cgo/gcc_traceback.c
+++ b/src/runtime/cgo/gcc_traceback.c
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// +build cgo,darwin cgo,linux
+//go:build darwin || linux
 
 #include <stdint.h>
 #include "libcgo.h"
@@ -39,6 +39,8 @@
         __msan_unpoison(&arg, sizeof arg);
 #endif
 
+	_cgo_tsan_acquire();
 	(*cgoTraceback)(&arg);
+	_cgo_tsan_release();
 	sigtramp(sig, info, context);
 }
diff --git a/src/runtime/cgo/gcc_windows_386.c b/src/runtime/cgo/gcc_windows_386.c
index 56fbaac..0f4f01c 100644
--- a/src/runtime/cgo/gcc_windows_386.c
+++ b/src/runtime/cgo/gcc_windows_386.c
@@ -12,10 +12,12 @@
 #include "libcgo_windows.h"
 
 static void threadentry(void*);
+static DWORD *tls_g;
 
 void
-x_cgo_init(G *g)
+x_cgo_init(G *g, void (*setg)(void*), void **tlsg, void **tlsbase)
 {
+	tls_g = (DWORD *)tlsg;
 }
 
 
@@ -39,10 +41,10 @@
 	 * Set specific keys in thread local storage.
 	 */
 	asm volatile (
-		"movl %0, %%fs:0x14\n"	// MOVL tls0, 0x14(FS)
-		"movl %%fs:0x14, %%eax\n"	// MOVL 0x14(FS), tmp
-		"movl %1, 0(%%eax)\n"	// MOVL g, 0(FS)
-		:: "r"(ts.tls), "r"(ts.g) : "%eax"
+		"movl %0, %%fs:0(%1)\n"	// MOVL tls0, 0(tls_g)(FS)
+		"movl %%fs:0(%1), %%eax\n"	// MOVL 0(tls_g)(FS), tmp
+		"movl %2, 0(%%eax)\n"	// MOVL g, 0(AX)
+		:: "r"(ts.tls), "r"(*tls_g), "r"(ts.g) : "%eax"
 	);
 
 	crosscall_386(ts.fn);
diff --git a/src/runtime/cgo/handle.go b/src/runtime/cgo/handle.go
index d711900..061dfb0 100644
--- a/src/runtime/cgo/handle.go
+++ b/src/runtime/cgo/handle.go
@@ -106,7 +106,7 @@
 // The intended use is to pass the returned handle to C code, which
 // passes it back to Go, which calls Value.
 func NewHandle(v any) Handle {
-	h := atomic.AddUintptr(&handleIdx, 1)
+	h := handleIdx.Add(1)
 	if h == 0 {
 		panic("runtime/cgo: ran out of handle space")
 	}
@@ -140,5 +140,5 @@
 
 var (
 	handles   = sync.Map{} // map[Handle]interface{}
-	handleIdx uintptr      // atomic
+	handleIdx atomic.Uintptr
 )
diff --git a/src/runtime/cgo/libcgo.h b/src/runtime/cgo/libcgo.h
index af4960e..04755f0 100644
--- a/src/runtime/cgo/libcgo.h
+++ b/src/runtime/cgo/libcgo.h
@@ -52,6 +52,11 @@
 extern void (*_cgo_sys_thread_create)(void* (*func)(void*), void* arg);
 
 /*
+ * Indicates whether a dummy pthread per-thread variable is allocated.
+ */
+extern uintptr_t *_cgo_pthread_key_created;
+
+/*
  * Creates the new operating system thread (OS, arch dependent).
  */
 void _cgo_sys_thread_start(ThreadStart *ts);
diff --git a/src/runtime/cgo/linux_syscall.c b/src/runtime/cgo/linux_syscall.c
index 59761c8..0ea2da7 100644
--- a/src/runtime/cgo/linux_syscall.c
+++ b/src/runtime/cgo/linux_syscall.c
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// +build linux
+//go:build linux
 
 #ifndef _GNU_SOURCE // setres[ug]id() API.
 #define _GNU_SOURCE
diff --git a/src/runtime/cgocall.go b/src/runtime/cgocall.go
index 9c75280..1da7249 100644
--- a/src/runtime/cgocall.go
+++ b/src/runtime/cgocall.go
@@ -86,6 +86,7 @@
 
 import (
 	"internal/goarch"
+	"internal/goexperiment"
 	"runtime/internal/sys"
 	"unsafe"
 )
@@ -135,7 +136,6 @@
 
 	mp := getg().m
 	mp.ncgocall++
-	mp.ncgo++
 
 	// Reset traceback.
 	mp.cgoCallers[0] = 0
@@ -164,6 +164,14 @@
 	osPreemptExtEnter(mp)
 
 	mp.incgo = true
+	// We use ncgo as a check during execution tracing for whether there is
+	// any C on the call stack, which there will be after this point. If
+	// there isn't, we can use frame pointer unwinding to collect call
+	// stacks efficiently. This will be the case for the first Go-to-C call
+	// on a stack, so it's prefereable to update it here, after we emit a
+	// trace event in entersyscall above.
+	mp.ncgo++
+
 	errno := asmcgocall(fn, arg)
 
 	// Update accounting before exitsyscall because exitsyscall may
@@ -228,6 +236,9 @@
 	savedpc := gp.syscallpc
 	exitsyscall() // coming out of cgo call
 	gp.m.incgo = false
+	if gp.m.isextra {
+		gp.m.isExtraInC = false
+	}
 
 	osPreemptExtExit(gp.m)
 
@@ -238,6 +249,9 @@
 	// This is enforced by checking incgo in the schedule function.
 
 	gp.m.incgo = true
+	if gp.m.isextra {
+		gp.m.isExtraInC = true
+	}
 
 	if gp.m != checkm {
 		throw("m changed unexpectedly in cgocallbackg")
@@ -362,12 +376,12 @@
 
 // We want to detect all cases where a program that does not use
 // unsafe makes a cgo call passing a Go pointer to memory that
-// contains a Go pointer. Here a Go pointer is defined as a pointer
-// to memory allocated by the Go runtime. Programs that use unsafe
-// can evade this restriction easily, so we don't try to catch them.
-// The cgo program will rewrite all possibly bad pointer arguments to
-// call cgoCheckPointer, where we can catch cases of a Go pointer
-// pointing to a Go pointer.
+// contains an unpinned Go pointer. Here a Go pointer is defined as a
+// pointer to memory allocated by the Go runtime. Programs that use
+// unsafe can evade this restriction easily, so we don't try to catch
+// them. The cgo program will rewrite all possibly bad pointer
+// arguments to call cgoCheckPointer, where we can catch cases of a Go
+// pointer pointing to an unpinned Go pointer.
 
 // Complicating matters, taking the address of a slice or array
 // element permits the C program to access all elements of the slice
@@ -389,9 +403,9 @@
 // pointers.)
 
 // cgoCheckPointer checks if the argument contains a Go pointer that
-// points to a Go pointer, and panics if it does.
+// points to an unpinned Go pointer, and panics if it does.
 func cgoCheckPointer(ptr any, arg any) {
-	if debug.cgocheck == 0 {
+	if !goexperiment.CgoCheck2 && debug.cgocheck == 0 {
 		return
 	}
 
@@ -399,23 +413,23 @@
 	t := ep._type
 
 	top := true
-	if arg != nil && (t.kind&kindMask == kindPtr || t.kind&kindMask == kindUnsafePointer) {
+	if arg != nil && (t.Kind_&kindMask == kindPtr || t.Kind_&kindMask == kindUnsafePointer) {
 		p := ep.data
-		if t.kind&kindDirectIface == 0 {
+		if t.Kind_&kindDirectIface == 0 {
 			p = *(*unsafe.Pointer)(p)
 		}
 		if p == nil || !cgoIsGoPointer(p) {
 			return
 		}
 		aep := efaceOf(&arg)
-		switch aep._type.kind & kindMask {
+		switch aep._type.Kind_ & kindMask {
 		case kindBool:
-			if t.kind&kindMask == kindUnsafePointer {
+			if t.Kind_&kindMask == kindUnsafePointer {
 				// We don't know the type of the element.
 				break
 			}
 			pt := (*ptrtype)(unsafe.Pointer(t))
-			cgoCheckArg(pt.elem, p, true, false, cgoCheckPointerFail)
+			cgoCheckArg(pt.Elem, p, true, false, cgoCheckPointerFail)
 			return
 		case kindSlice:
 			// Check the slice rather than the pointer.
@@ -433,37 +447,38 @@
 		}
 	}
 
-	cgoCheckArg(t, ep.data, t.kind&kindDirectIface == 0, top, cgoCheckPointerFail)
+	cgoCheckArg(t, ep.data, t.Kind_&kindDirectIface == 0, top, cgoCheckPointerFail)
 }
 
-const cgoCheckPointerFail = "cgo argument has Go pointer to Go pointer"
+const cgoCheckPointerFail = "cgo argument has Go pointer to unpinned Go pointer"
 const cgoResultFail = "cgo result has Go pointer"
 
 // cgoCheckArg is the real work of cgoCheckPointer. The argument p
 // is either a pointer to the value (of type t), or the value itself,
 // depending on indir. The top parameter is whether we are at the top
-// level, where Go pointers are allowed.
+// level, where Go pointers are allowed. Go pointers to pinned objects are
+// always allowed.
 func cgoCheckArg(t *_type, p unsafe.Pointer, indir, top bool, msg string) {
-	if t.ptrdata == 0 || p == nil {
+	if t.PtrBytes == 0 || p == nil {
 		// If the type has no pointers there is nothing to do.
 		return
 	}
 
-	switch t.kind & kindMask {
+	switch t.Kind_ & kindMask {
 	default:
 		throw("can't happen")
 	case kindArray:
 		at := (*arraytype)(unsafe.Pointer(t))
 		if !indir {
-			if at.len != 1 {
+			if at.Len != 1 {
 				throw("can't happen")
 			}
-			cgoCheckArg(at.elem, p, at.elem.kind&kindDirectIface == 0, top, msg)
+			cgoCheckArg(at.Elem, p, at.Elem.Kind_&kindDirectIface == 0, top, msg)
 			return
 		}
-		for i := uintptr(0); i < at.len; i++ {
-			cgoCheckArg(at.elem, p, true, top, msg)
-			p = add(p, at.elem.size)
+		for i := uintptr(0); i < at.Len; i++ {
+			cgoCheckArg(at.Elem, p, true, top, msg)
+			p = add(p, at.Elem.Size_)
 		}
 	case kindChan, kindMap:
 		// These types contain internal pointers that will
@@ -493,10 +508,10 @@
 		if !cgoIsGoPointer(p) {
 			return
 		}
-		if !top {
+		if !top && !isPinned(p) {
 			panic(errorString(msg))
 		}
-		cgoCheckArg(it, p, it.kind&kindDirectIface == 0, false, msg)
+		cgoCheckArg(it, p, it.Kind_&kindDirectIface == 0, false, msg)
 	case kindSlice:
 		st := (*slicetype)(unsafe.Pointer(t))
 		s := (*slice)(p)
@@ -504,38 +519,38 @@
 		if p == nil || !cgoIsGoPointer(p) {
 			return
 		}
-		if !top {
+		if !top && !isPinned(p) {
 			panic(errorString(msg))
 		}
-		if st.elem.ptrdata == 0 {
+		if st.Elem.PtrBytes == 0 {
 			return
 		}
 		for i := 0; i < s.cap; i++ {
-			cgoCheckArg(st.elem, p, true, false, msg)
-			p = add(p, st.elem.size)
+			cgoCheckArg(st.Elem, p, true, false, msg)
+			p = add(p, st.Elem.Size_)
 		}
 	case kindString:
 		ss := (*stringStruct)(p)
 		if !cgoIsGoPointer(ss.str) {
 			return
 		}
-		if !top {
+		if !top && !isPinned(ss.str) {
 			panic(errorString(msg))
 		}
 	case kindStruct:
 		st := (*structtype)(unsafe.Pointer(t))
 		if !indir {
-			if len(st.fields) != 1 {
+			if len(st.Fields) != 1 {
 				throw("can't happen")
 			}
-			cgoCheckArg(st.fields[0].typ, p, st.fields[0].typ.kind&kindDirectIface == 0, top, msg)
+			cgoCheckArg(st.Fields[0].Typ, p, st.Fields[0].Typ.Kind_&kindDirectIface == 0, top, msg)
 			return
 		}
-		for _, f := range st.fields {
-			if f.typ.ptrdata == 0 {
+		for _, f := range st.Fields {
+			if f.Typ.PtrBytes == 0 {
 				continue
 			}
-			cgoCheckArg(f.typ, add(p, f.offset), true, top, msg)
+			cgoCheckArg(f.Typ, add(p, f.Offset), true, top, msg)
 		}
 	case kindPtr, kindUnsafePointer:
 		if indir {
@@ -548,7 +563,7 @@
 		if !cgoIsGoPointer(p) {
 			return
 		}
-		if !top {
+		if !top && !isPinned(p) {
 			panic(errorString(msg))
 		}
 
@@ -558,7 +573,7 @@
 
 // cgoCheckUnknownPointer is called for an arbitrary pointer into Go
 // memory. It checks whether that Go memory contains any other
-// pointer into Go memory. If it does, we panic.
+// pointer into unpinned Go memory. If it does, we panic.
 // The return values are unused but useful to see in panic tracebacks.
 func cgoCheckUnknownPointer(p unsafe.Pointer, msg string) (base, i uintptr) {
 	if inheap(uintptr(p)) {
@@ -574,7 +589,8 @@
 			if hbits, addr = hbits.next(); addr == 0 {
 				break
 			}
-			if cgoIsGoPointer(*(*unsafe.Pointer)(unsafe.Pointer(addr))) {
+			pp := *(*unsafe.Pointer)(unsafe.Pointer(addr))
+			if cgoIsGoPointer(pp) && !isPinned(pp) {
 				panic(errorString(msg))
 			}
 		}
@@ -631,11 +647,11 @@
 // exported Go function. It panics if the result is or contains a Go
 // pointer.
 func cgoCheckResult(val any) {
-	if debug.cgocheck == 0 {
+	if !goexperiment.CgoCheck2 && debug.cgocheck == 0 {
 		return
 	}
 
 	ep := efaceOf(&val)
 	t := ep._type
-	cgoCheckArg(t, ep.data, t.kind&kindDirectIface == 0, false, cgoResultFail)
+	cgoCheckArg(t, ep.data, t.Kind_&kindDirectIface == 0, false, cgoResultFail)
 }
diff --git a/src/runtime/cgocheck.go b/src/runtime/cgocheck.go
index 84e7516..ec5734a 100644
--- a/src/runtime/cgocheck.go
+++ b/src/runtime/cgocheck.go
@@ -3,7 +3,7 @@
 // license that can be found in the LICENSE file.
 
 // Code to check that pointer writes follow the cgo rules.
-// These functions are invoked via the write barrier when debug.cgocheck > 1.
+// These functions are invoked when GOEXPERIMENT=cgocheck2 is enabled.
 
 package runtime
 
@@ -12,18 +12,24 @@
 	"unsafe"
 )
 
-const cgoWriteBarrierFail = "Go pointer stored into non-Go memory"
+const cgoWriteBarrierFail = "unpinned Go pointer stored into non-Go memory"
 
-// cgoCheckWriteBarrier is called whenever a pointer is stored into memory.
-// It throws if the program is storing a Go pointer into non-Go memory.
+// cgoCheckPtrWrite is called whenever a pointer is stored into memory.
+// It throws if the program is storing an unpinned Go pointer into non-Go
+// memory.
 //
-// This is called from the write barrier, so its entire call tree must
-// be nosplit.
+// This is called from generated code when GOEXPERIMENT=cgocheck2 is enabled.
 //
 //go:nosplit
 //go:nowritebarrier
-func cgoCheckWriteBarrier(dst *uintptr, src uintptr) {
-	if !cgoIsGoPointer(unsafe.Pointer(src)) {
+func cgoCheckPtrWrite(dst *unsafe.Pointer, src unsafe.Pointer) {
+	if !mainStarted {
+		// Something early in startup hates this function.
+		// Don't start doing any actual checking until the
+		// runtime has set itself up.
+		return
+	}
+	if !cgoIsGoPointer(src) {
 		return
 	}
 	if cgoIsGoPointer(unsafe.Pointer(dst)) {
@@ -43,6 +49,12 @@
 		return
 	}
 
+	// If the object is pinned, it's safe to store it in C memory. The GC
+	// ensures it will not be moved or freed.
+	if isPinned(src) {
+		return
+	}
+
 	// It's OK if writing to memory allocated by persistentalloc.
 	// Do this check last because it is more expensive and rarely true.
 	// If it is false the expense doesn't matter since we are crashing.
@@ -51,21 +63,33 @@
 	}
 
 	systemstack(func() {
-		println("write of Go pointer", hex(src), "to non-Go memory", hex(uintptr(unsafe.Pointer(dst))))
+		println("write of unpinned Go pointer", hex(uintptr(src)), "to non-Go memory", hex(uintptr(unsafe.Pointer(dst))))
 		throw(cgoWriteBarrierFail)
 	})
 }
 
 // cgoCheckMemmove is called when moving a block of memory.
-// dst and src point off bytes into the value to copy.
-// size is the number of bytes to copy.
-// It throws if the program is copying a block that contains a Go pointer
-// into non-Go memory.
+// It throws if the program is copying a block that contains an unpinned Go
+// pointer into non-Go memory.
+//
+// This is called from generated code when GOEXPERIMENT=cgocheck2 is enabled.
 //
 //go:nosplit
 //go:nowritebarrier
-func cgoCheckMemmove(typ *_type, dst, src unsafe.Pointer, off, size uintptr) {
-	if typ.ptrdata == 0 {
+func cgoCheckMemmove(typ *_type, dst, src unsafe.Pointer) {
+	cgoCheckMemmove2(typ, dst, src, 0, typ.Size_)
+}
+
+// cgoCheckMemmove2 is called when moving a block of memory.
+// dst and src point off bytes into the value to copy.
+// size is the number of bytes to copy.
+// It throws if the program is copying a block that contains an unpinned Go
+// pointer into non-Go memory.
+//
+//go:nosplit
+//go:nowritebarrier
+func cgoCheckMemmove2(typ *_type, dst, src unsafe.Pointer, off, size uintptr) {
+	if typ.PtrBytes == 0 {
 		return
 	}
 	if !cgoIsGoPointer(src) {
@@ -80,13 +104,13 @@
 // cgoCheckSliceCopy is called when copying n elements of a slice.
 // src and dst are pointers to the first element of the slice.
 // typ is the element type of the slice.
-// It throws if the program is copying slice elements that contain Go pointers
-// into non-Go memory.
+// It throws if the program is copying slice elements that contain unpinned Go
+// pointers into non-Go memory.
 //
 //go:nosplit
 //go:nowritebarrier
 func cgoCheckSliceCopy(typ *_type, dst, src unsafe.Pointer, n int) {
-	if typ.ptrdata == 0 {
+	if typ.PtrBytes == 0 {
 		return
 	}
 	if !cgoIsGoPointer(src) {
@@ -97,28 +121,28 @@
 	}
 	p := src
 	for i := 0; i < n; i++ {
-		cgoCheckTypedBlock(typ, p, 0, typ.size)
-		p = add(p, typ.size)
+		cgoCheckTypedBlock(typ, p, 0, typ.Size_)
+		p = add(p, typ.Size_)
 	}
 }
 
 // cgoCheckTypedBlock checks the block of memory at src, for up to size bytes,
-// and throws if it finds a Go pointer. The type of the memory is typ,
+// and throws if it finds an unpinned Go pointer. The type of the memory is typ,
 // and src is off bytes into that type.
 //
 //go:nosplit
 //go:nowritebarrier
 func cgoCheckTypedBlock(typ *_type, src unsafe.Pointer, off, size uintptr) {
-	// Anything past typ.ptrdata is not a pointer.
-	if typ.ptrdata <= off {
+	// Anything past typ.PtrBytes is not a pointer.
+	if typ.PtrBytes <= off {
 		return
 	}
-	if ptrdataSize := typ.ptrdata - off; size > ptrdataSize {
+	if ptrdataSize := typ.PtrBytes - off; size > ptrdataSize {
 		size = ptrdataSize
 	}
 
-	if typ.kind&kindGCProg == 0 {
-		cgoCheckBits(src, typ.gcdata, off, size)
+	if typ.Kind_&kindGCProg == 0 {
+		cgoCheckBits(src, typ.GCData, off, size)
 		return
 	}
 
@@ -160,14 +184,14 @@
 			break
 		}
 		v := *(*unsafe.Pointer)(unsafe.Pointer(addr))
-		if cgoIsGoPointer(v) {
+		if cgoIsGoPointer(v) && !isPinned(v) {
 			throw(cgoWriteBarrierFail)
 		}
 	}
 }
 
 // cgoCheckBits checks the block of memory at src, for up to size
-// bytes, and throws if it finds a Go pointer. The gcbits mark each
+// bytes, and throws if it finds an unpinned Go pointer. The gcbits mark each
 // pointer value. The src pointer is off bytes into the gcbits.
 //
 //go:nosplit
@@ -192,7 +216,7 @@
 		} else {
 			if bits&1 != 0 {
 				v := *(*unsafe.Pointer)(add(src, i))
-				if cgoIsGoPointer(v) {
+				if cgoIsGoPointer(v) && !isPinned(v) {
 					throw(cgoWriteBarrierFail)
 				}
 			}
@@ -209,37 +233,37 @@
 //go:nowritebarrier
 //go:systemstack
 func cgoCheckUsingType(typ *_type, src unsafe.Pointer, off, size uintptr) {
-	if typ.ptrdata == 0 {
+	if typ.PtrBytes == 0 {
 		return
 	}
 
-	// Anything past typ.ptrdata is not a pointer.
-	if typ.ptrdata <= off {
+	// Anything past typ.PtrBytes is not a pointer.
+	if typ.PtrBytes <= off {
 		return
 	}
-	if ptrdataSize := typ.ptrdata - off; size > ptrdataSize {
+	if ptrdataSize := typ.PtrBytes - off; size > ptrdataSize {
 		size = ptrdataSize
 	}
 
-	if typ.kind&kindGCProg == 0 {
-		cgoCheckBits(src, typ.gcdata, off, size)
+	if typ.Kind_&kindGCProg == 0 {
+		cgoCheckBits(src, typ.GCData, off, size)
 		return
 	}
-	switch typ.kind & kindMask {
+	switch typ.Kind_ & kindMask {
 	default:
 		throw("can't happen")
 	case kindArray:
 		at := (*arraytype)(unsafe.Pointer(typ))
-		for i := uintptr(0); i < at.len; i++ {
-			if off < at.elem.size {
-				cgoCheckUsingType(at.elem, src, off, size)
+		for i := uintptr(0); i < at.Len; i++ {
+			if off < at.Elem.Size_ {
+				cgoCheckUsingType(at.Elem, src, off, size)
 			}
-			src = add(src, at.elem.size)
+			src = add(src, at.Elem.Size_)
 			skipped := off
-			if skipped > at.elem.size {
-				skipped = at.elem.size
+			if skipped > at.Elem.Size_ {
+				skipped = at.Elem.Size_
 			}
-			checked := at.elem.size - skipped
+			checked := at.Elem.Size_ - skipped
 			off -= skipped
 			if size <= checked {
 				return
@@ -248,16 +272,16 @@
 		}
 	case kindStruct:
 		st := (*structtype)(unsafe.Pointer(typ))
-		for _, f := range st.fields {
-			if off < f.typ.size {
-				cgoCheckUsingType(f.typ, src, off, size)
+		for _, f := range st.Fields {
+			if off < f.Typ.Size_ {
+				cgoCheckUsingType(f.Typ, src, off, size)
 			}
-			src = add(src, f.typ.size)
+			src = add(src, f.Typ.Size_)
 			skipped := off
-			if skipped > f.typ.size {
-				skipped = f.typ.size
+			if skipped > f.Typ.Size_ {
+				skipped = f.Typ.Size_
 			}
-			checked := f.typ.size - skipped
+			checked := f.Typ.Size_ - skipped
 			off -= skipped
 			if size <= checked {
 				return
diff --git a/src/runtime/chan.go b/src/runtime/chan.go
index 6a0ad35..ff9e2a9 100644
--- a/src/runtime/chan.go
+++ b/src/runtime/chan.go
@@ -70,17 +70,17 @@
 }
 
 func makechan(t *chantype, size int) *hchan {
-	elem := t.elem
+	elem := t.Elem
 
 	// compiler checks this but be safe.
-	if elem.size >= 1<<16 {
+	if elem.Size_ >= 1<<16 {
 		throw("makechan: invalid channel element type")
 	}
-	if hchanSize%maxAlign != 0 || elem.align > maxAlign {
+	if hchanSize%maxAlign != 0 || elem.Align_ > maxAlign {
 		throw("makechan: bad alignment")
 	}
 
-	mem, overflow := math.MulUintptr(elem.size, uintptr(size))
+	mem, overflow := math.MulUintptr(elem.Size_, uintptr(size))
 	if overflow || mem > maxAlloc-hchanSize || size < 0 {
 		panic(plainError("makechan: size out of range"))
 	}
@@ -96,7 +96,7 @@
 		c = (*hchan)(mallocgc(hchanSize, nil, true))
 		// Race detector uses this location for synchronization.
 		c.buf = c.raceaddr()
-	case elem.ptrdata == 0:
+	case elem.PtrBytes == 0:
 		// Elements do not contain pointers.
 		// Allocate hchan and buf in one call.
 		c = (*hchan)(mallocgc(hchanSize+mem, nil, true))
@@ -107,13 +107,13 @@
 		c.buf = mallocgc(mem, elem, true)
 	}
 
-	c.elemsize = uint16(elem.size)
+	c.elemsize = uint16(elem.Size_)
 	c.elemtype = elem
 	c.dataqsiz = uint(size)
 	lockInit(&c.lock, lockRankHchan)
 
 	if debugChan {
-		print("makechan: chan=", c, "; elemsize=", elem.size, "; dataqsiz=", size, "\n")
+		print("makechan: chan=", c, "; elemsize=", elem.Size_, "; dataqsiz=", size, "\n")
 	}
 	return c
 }
@@ -162,7 +162,7 @@
 		if !block {
 			return false
 		}
-		gopark(nil, nil, waitReasonChanSendNilChan, traceEvGoStop, 2)
+		gopark(nil, nil, waitReasonChanSendNilChan, traceBlockForever, 2)
 		throw("unreachable")
 	}
 
@@ -256,7 +256,7 @@
 	// changes and when we set gp.activeStackChans is not safe for
 	// stack shrinking.
 	gp.parkingOnChan.Store(true)
-	gopark(chanparkcommit, unsafe.Pointer(&c.lock), waitReasonChanSend, traceEvGoBlockSend, 2)
+	gopark(chanparkcommit, unsafe.Pointer(&c.lock), waitReasonChanSend, traceBlockChanSend, 2)
 	// Ensure the value being sent is kept alive until the
 	// receiver copies it out. The sudog has a pointer to the
 	// stack object, but sudogs aren't considered as roots of the
@@ -339,10 +339,10 @@
 	// be updated if the destination's stack gets copied (shrunk).
 	// So make sure that no preemption points can happen between read & use.
 	dst := sg.elem
-	typeBitsBulkBarrier(t, uintptr(dst), uintptr(src), t.size)
+	typeBitsBulkBarrier(t, uintptr(dst), uintptr(src), t.Size_)
 	// No need for cgo write barrier checks because dst is always
 	// Go memory.
-	memmove(dst, src, t.size)
+	memmove(dst, src, t.Size_)
 }
 
 func recvDirect(t *_type, sg *sudog, dst unsafe.Pointer) {
@@ -350,8 +350,8 @@
 	// The channel is locked, so src will not move during this
 	// operation.
 	src := sg.elem
-	typeBitsBulkBarrier(t, uintptr(dst), uintptr(src), t.size)
-	memmove(dst, src, t.size)
+	typeBitsBulkBarrier(t, uintptr(dst), uintptr(src), t.Size_)
+	memmove(dst, src, t.Size_)
 }
 
 func closechan(c *hchan) {
@@ -466,7 +466,7 @@
 		if !block {
 			return
 		}
-		gopark(nil, nil, waitReasonChanReceiveNilChan, traceEvGoStop, 2)
+		gopark(nil, nil, waitReasonChanReceiveNilChan, traceBlockForever, 2)
 		throw("unreachable")
 	}
 
@@ -580,7 +580,7 @@
 	// changes and when we set gp.activeStackChans is not safe for
 	// stack shrinking.
 	gp.parkingOnChan.Store(true)
-	gopark(chanparkcommit, unsafe.Pointer(&c.lock), waitReasonChanReceive, traceEvGoBlockRecv, 2)
+	gopark(chanparkcommit, unsafe.Pointer(&c.lock), waitReasonChanReceive, traceBlockChanRecv, 2)
 
 	// someone woke us up
 	if mysg != gp.waiting {
@@ -714,7 +714,7 @@
 	return chanrecv(c, elem, false)
 }
 
-//go:linkname reflect_chansend reflect.chansend
+//go:linkname reflect_chansend reflect.chansend0
 func reflect_chansend(c *hchan, elem unsafe.Pointer, nb bool) (selected bool) {
 	return chansend(c, elem, !nb, getcallerpc())
 }
diff --git a/src/runtime/checkptr.go b/src/runtime/checkptr.go
index 2d4afd5..3c49645 100644
--- a/src/runtime/checkptr.go
+++ b/src/runtime/checkptr.go
@@ -16,13 +16,13 @@
 	// Note that we allow unaligned pointers if the types they point to contain
 	// no pointers themselves. See issue 37298.
 	// TODO(mdempsky): What about fieldAlign?
-	if elem.ptrdata != 0 && uintptr(p)&(uintptr(elem.align)-1) != 0 {
+	if elem.PtrBytes != 0 && uintptr(p)&(uintptr(elem.Align_)-1) != 0 {
 		throw("checkptr: misaligned pointer conversion")
 	}
 
 	// Check that (*[n]elem)(p) doesn't straddle multiple heap objects.
 	// TODO(mdempsky): Fix #46938 so we don't need to worry about overflow here.
-	if checkptrStraddles(p, n*elem.size) {
+	if checkptrStraddles(p, n*elem.Size_) {
 		throw("checkptr: converted pointer straddles multiple allocations")
 	}
 }
diff --git a/src/runtime/coverage/apis.go b/src/runtime/coverage/apis.go
index 7d851f9..05da345 100644
--- a/src/runtime/coverage/apis.go
+++ b/src/runtime/coverage/apis.go
@@ -27,7 +27,7 @@
 
 // WriteMeta writes the meta-data content (the payload that would
 // normally be emitted to a meta-data file) for the currently running
-// program to the the writer 'w'. An error will be returned if the
+// program to the writer 'w'. An error will be returned if the
 // operation can't be completed successfully (for example, if the
 // currently running program was not built with "-cover", or if a
 // write fails).
@@ -50,11 +50,14 @@
 // counter data written will be a snapshot taken at the point of the
 // call.
 func WriteCountersDir(dir string) error {
+	if cmode != coverage.CtrModeAtomic {
+		return fmt.Errorf("WriteCountersDir invoked for program built with -covermode=%s (please use -covermode=atomic)", cmode.String())
+	}
 	return emitCounterDataToDirectory(dir)
 }
 
-// WriteCounters writes coverage counter-data content for
-// the currently running program to the writer 'w'. An error will be
+// WriteCounters writes coverage counter-data content for the
+// currently running program to the writer 'w'. An error will be
 // returned if the operation can't be completed successfully (for
 // example, if the currently running program was not built with
 // "-cover", or if a write fails). The counter data written will be a
@@ -63,6 +66,9 @@
 	if w == nil {
 		return fmt.Errorf("error: nil writer in WriteCounters")
 	}
+	if cmode != coverage.CtrModeAtomic {
+		return fmt.Errorf("WriteCounters invoked for program built with -covermode=%s (please use -covermode=atomic)", cmode.String())
+	}
 	// Ask the runtime for the list of coverage counter symbols.
 	cl := getCovCounterList()
 	if len(cl) == 0 {
@@ -92,7 +98,7 @@
 		return fmt.Errorf("program not built with -cover")
 	}
 	if cmode != coverage.CtrModeAtomic {
-		return fmt.Errorf("ClearCounters invoked for program build with -covermode=%s (please use -covermode=atomic)", cmode.String())
+		return fmt.Errorf("ClearCounters invoked for program built with -covermode=%s (please use -covermode=atomic)", cmode.String())
 	}
 
 	// Implementation note: this function would be faster and simpler
diff --git a/src/runtime/coverage/emit.go b/src/runtime/coverage/emit.go
index 2aed99c..bb0c6fb 100644
--- a/src/runtime/coverage/emit.go
+++ b/src/runtime/coverage/emit.go
@@ -16,6 +16,7 @@
 	"path/filepath"
 	"reflect"
 	"runtime"
+	"strconv"
 	"sync/atomic"
 	"time"
 	"unsafe"
@@ -241,7 +242,7 @@
 	return ml, nil
 }
 
-// emitMetaData emits the meta-data output file to the specified
+// emitMetaDataToDirectory emits the meta-data output file to the specified
 // directory, returning an error if something went wrong.
 func emitMetaDataToDirectory(outdir string, ml []rtcov.CovMetaBlob) error {
 	ml, err := prepareForMetaEmit()
@@ -289,7 +290,7 @@
 	}
 }
 
-// emitMetaData emits the counter-data output file for this coverage run.
+// emitCounterDataToDirectory emits the counter-data output file for this coverage run.
 func emitCounterDataToDirectory(outdir string) error {
 	// Ask the runtime for the list of coverage counter symbols.
 	cl := getCovCounterList()
@@ -336,7 +337,7 @@
 	return nil
 }
 
-// emitMetaData emits counter data for this coverage run to an io.Writer.
+// emitCounterDataToWriter emits counter data for this coverage run to an io.Writer.
 func (s *emitState) emitCounterDataToWriter(w io.Writer) error {
 	if err := s.emitCounterDataFile(finalHash, w); err != nil {
 		return err
@@ -357,7 +358,7 @@
 	fi, err := os.Stat(s.mfname)
 	if err != nil || fi.Size() != int64(metaLen) {
 		// We need a new meta-file.
-		tname := "tmp." + fn + fmt.Sprintf("%d", time.Now().UnixNano())
+		tname := "tmp." + fn + strconv.FormatInt(time.Now().UnixNano(), 10)
 		s.mftmp = filepath.Join(s.outdir, tname)
 		s.mf, err = os.Create(s.mftmp)
 		if err != nil {
@@ -462,52 +463,6 @@
 	return mfw.Write(finalHash, blobs, cmode, gran)
 }
 
-func (s *emitState) NumFuncs() (int, error) {
-	var sd []atomic.Uint32
-	bufHdr := (*reflect.SliceHeader)(unsafe.Pointer(&sd))
-
-	totalFuncs := 0
-	for _, c := range s.counterlist {
-		bufHdr.Data = uintptr(unsafe.Pointer(c.Counters))
-		bufHdr.Len = int(c.Len)
-		bufHdr.Cap = int(c.Len)
-		for i := 0; i < len(sd); i++ {
-			// Skip ahead until the next non-zero value.
-			sdi := sd[i].Load()
-			if sdi == 0 {
-				continue
-			}
-
-			// We found a function that was executed.
-			nCtrs := sdi
-
-			// Check to make sure that we have at least one live
-			// counter. See the implementation note in ClearCoverageCounters
-			// for a description of why this is needed.
-			isLive := false
-			st := i + coverage.FirstCtrOffset
-			counters := sd[st : st+int(nCtrs)]
-			for i := 0; i < len(counters); i++ {
-				if counters[i].Load() != 0 {
-					isLive = true
-					break
-				}
-			}
-			if !isLive {
-				// Skip this function.
-				i += coverage.FirstCtrOffset + int(nCtrs) - 1
-				continue
-			}
-
-			totalFuncs++
-
-			// Move to the next function.
-			i += coverage.FirstCtrOffset + int(nCtrs) - 1
-		}
-	}
-	return totalFuncs, nil
-}
-
 func (s *emitState) VisitFuncs(f encodecounter.CounterVisitorFn) error {
 	var sd []atomic.Uint32
 	var tcounters []uint32
@@ -613,7 +568,7 @@
 // is also used to capture GOOS + GOARCH values as well.
 func captureOsArgs() map[string]string {
 	m := make(map[string]string)
-	m["argc"] = fmt.Sprintf("%d", len(os.Args))
+	m["argc"] = strconv.Itoa(len(os.Args))
 	for k, a := range os.Args {
 		m[fmt.Sprintf("argv%d", k)] = a
 	}
diff --git a/src/runtime/coverage/emitdata_test.go b/src/runtime/coverage/emitdata_test.go
index 3839e44..3558dd2 100644
--- a/src/runtime/coverage/emitdata_test.go
+++ b/src/runtime/coverage/emitdata_test.go
@@ -36,43 +36,60 @@
 		mkdir(t, dir)
 	}
 
-	// Build harness.
-	bdir := mkdir(t, filepath.Join(dir, "build"))
-	hargs := []string{"-cover", "-coverpkg=all"}
-	if testing.CoverMode() != "" {
-		hargs = append(hargs, "-covermode="+testing.CoverMode())
+	// Build harness. We need two copies of the harness, one built
+	// with -covermode=atomic and one built non-atomic.
+	bdir1 := mkdir(t, filepath.Join(dir, "build1"))
+	hargs1 := []string{"-covermode=atomic", "-coverpkg=all"}
+	atomicHarnessPath := buildHarness(t, bdir1, hargs1)
+	nonAtomicMode := testing.CoverMode()
+	if testing.CoverMode() == "atomic" {
+		nonAtomicMode = "set"
 	}
-	harnessPath := buildHarness(t, bdir, hargs)
+	bdir2 := mkdir(t, filepath.Join(dir, "build2"))
+	hargs2 := []string{"-coverpkg=all", "-covermode=" + nonAtomicMode}
+	nonAtomicHarnessPath := buildHarness(t, bdir2, hargs2)
 
-	t.Logf("harness path is %s", harnessPath)
+	t.Logf("atomic harness path is %s", atomicHarnessPath)
+	t.Logf("non-atomic harness path is %s", nonAtomicHarnessPath)
 
 	// Sub-tests for each API we want to inspect, plus
 	// extras for error testing.
 	t.Run("emitToDir", func(t *testing.T) {
 		t.Parallel()
-		testEmitToDir(t, harnessPath, dir)
+		testEmitToDir(t, atomicHarnessPath, dir)
 	})
 	t.Run("emitToWriter", func(t *testing.T) {
 		t.Parallel()
-		testEmitToWriter(t, harnessPath, dir)
+		testEmitToWriter(t, atomicHarnessPath, dir)
 	})
 	t.Run("emitToNonexistentDir", func(t *testing.T) {
 		t.Parallel()
-		testEmitToNonexistentDir(t, harnessPath, dir)
+		testEmitToNonexistentDir(t, atomicHarnessPath, dir)
 	})
 	t.Run("emitToNilWriter", func(t *testing.T) {
 		t.Parallel()
-		testEmitToNilWriter(t, harnessPath, dir)
+		testEmitToNilWriter(t, atomicHarnessPath, dir)
 	})
 	t.Run("emitToFailingWriter", func(t *testing.T) {
 		t.Parallel()
-		testEmitToFailingWriter(t, harnessPath, dir)
+		testEmitToFailingWriter(t, atomicHarnessPath, dir)
 	})
 	t.Run("emitWithCounterClear", func(t *testing.T) {
 		t.Parallel()
-		testEmitWithCounterClear(t, harnessPath, dir)
+		testEmitWithCounterClear(t, atomicHarnessPath, dir)
 	})
-
+	t.Run("emitToDirNonAtomic", func(t *testing.T) {
+		t.Parallel()
+		testEmitToDirNonAtomic(t, nonAtomicHarnessPath, nonAtomicMode, dir)
+	})
+	t.Run("emitToWriterNonAtomic", func(t *testing.T) {
+		t.Parallel()
+		testEmitToWriterNonAtomic(t, nonAtomicHarnessPath, nonAtomicMode, dir)
+	})
+	t.Run("emitWithCounterClearNonAtomic", func(t *testing.T) {
+		t.Parallel()
+		testEmitWithCounterClearNonAtomic(t, nonAtomicHarnessPath, nonAtomicMode, dir)
+	})
 }
 
 // upmergeCoverData helps improve coverage data for this package
@@ -82,8 +99,8 @@
 // run from the "harness.exe" runs we've just done. We can accomplish
 // this by doing a merge from the harness gocoverdir's to the test
 // gocoverdir.
-func upmergeCoverData(t *testing.T, gocoverdir string) {
-	if testing.CoverMode() == "" {
+func upmergeCoverData(t *testing.T, gocoverdir string, mode string) {
+	if testing.CoverMode() != mode {
 		return
 	}
 	testGoCoverDir := os.Getenv("GOCOVERDIR")
@@ -243,8 +260,8 @@
 		if cdc != wantcf {
 			t.Errorf("EmitToDir: want %d counter-data files, got %d\n", wantcf, cdc)
 		}
-		upmergeCoverData(t, edir)
-		upmergeCoverData(t, rdir)
+		upmergeCoverData(t, edir, "atomic")
+		upmergeCoverData(t, rdir, "atomic")
 	})
 }
 
@@ -262,8 +279,8 @@
 		if msg := testForSpecificFunctions(t, edir, want, avoid); msg != "" {
 			t.Errorf("coverage data from %q output match failed: %s", tp, msg)
 		}
-		upmergeCoverData(t, edir)
-		upmergeCoverData(t, rdir)
+		upmergeCoverData(t, edir, "atomic")
+		upmergeCoverData(t, rdir, "atomic")
 	})
 }
 
@@ -276,8 +293,8 @@
 			t.Logf("%s", output)
 			t.Fatalf("running 'harness -tp %s': %v", tp, err)
 		}
-		upmergeCoverData(t, edir)
-		upmergeCoverData(t, rdir)
+		upmergeCoverData(t, edir, "atomic")
+		upmergeCoverData(t, rdir, "atomic")
 	})
 }
 
@@ -298,8 +315,8 @@
 			t.Logf("%s", output)
 			t.Fatalf("running 'harness -tp %s': %v", tp, err)
 		}
-		upmergeCoverData(t, edir)
-		upmergeCoverData(t, rdir)
+		upmergeCoverData(t, edir, "atomic")
+		upmergeCoverData(t, rdir, "atomic")
 	})
 }
 
@@ -312,8 +329,8 @@
 			t.Logf("%s", output)
 			t.Fatalf("running 'harness -tp %s': %v", tp, err)
 		}
-		upmergeCoverData(t, edir)
-		upmergeCoverData(t, rdir)
+		upmergeCoverData(t, edir, "atomic")
+		upmergeCoverData(t, rdir, "atomic")
 	})
 }
 
@@ -326,73 +343,103 @@
 			t.Logf("%s", output)
 			t.Fatalf("running 'harness -tp %s': %v", tp, err)
 		}
-		upmergeCoverData(t, edir)
-		upmergeCoverData(t, rdir)
+		upmergeCoverData(t, edir, "atomic")
+		upmergeCoverData(t, rdir, "atomic")
 	})
 }
 
 func testEmitWithCounterClear(t *testing.T, harnessPath string, dir string) {
-	// Ensure that we have two versions of the harness: one built with
-	// -covermode=atomic and one built with -covermode=set (we need
-	// both modes to test all of the functionality).
-	var nonatomicHarnessPath, atomicHarnessPath string
-	if testing.CoverMode() != "atomic" {
-		nonatomicHarnessPath = harnessPath
-		bdir2 := mkdir(t, filepath.Join(dir, "build2"))
-		hargs := []string{"-covermode=atomic", "-coverpkg=all"}
-		atomicHarnessPath = buildHarness(t, bdir2, hargs)
-	} else {
-		atomicHarnessPath = harnessPath
-		mode := "set"
-		if testing.CoverMode() != "" && testing.CoverMode() != "atomic" {
-			mode = testing.CoverMode()
-		}
-		// Build a special nonatomic covermode version of the harness
-		// (we need both modes to test all of the functionality).
-		bdir2 := mkdir(t, filepath.Join(dir, "build2"))
-		hargs := []string{"-covermode=" + mode, "-coverpkg=all"}
-		nonatomicHarnessPath = buildHarness(t, bdir2, hargs)
-	}
-
 	withAndWithoutRunner(func(setGoCoverDir bool, tag string) {
-		// First a run with the nonatomic harness path, which we
-		// expect to fail.
 		tp := "emitWithCounterClear"
-		rdir1, edir1 := mktestdirs(t, tag, tp+"1", dir)
-		output, err := runHarness(t, nonatomicHarnessPath, tp,
-			setGoCoverDir, rdir1, edir1)
-		if err == nil {
-			t.Logf("%s", output)
-			t.Fatalf("running '%s -tp %s': unexpected success",
-				nonatomicHarnessPath, tp)
-		}
-
-		// Next a run with the atomic harness path, which we
-		// expect to succeed.
-		rdir2, edir2 := mktestdirs(t, tag, tp+"2", dir)
-		output, err = runHarness(t, atomicHarnessPath, tp,
-			setGoCoverDir, rdir2, edir2)
+		rdir, edir := mktestdirs(t, tag, tp, dir)
+		output, err := runHarness(t, harnessPath, tp,
+			setGoCoverDir, rdir, edir)
 		if err != nil {
 			t.Logf("%s", output)
 			t.Fatalf("running 'harness -tp %s': %v", tp, err)
 		}
 		want := []string{tp, "postClear"}
 		avoid := []string{"preClear", "main", "final"}
-		if msg := testForSpecificFunctions(t, edir2, want, avoid); msg != "" {
+		if msg := testForSpecificFunctions(t, edir, want, avoid); msg != "" {
 			t.Logf("%s", output)
 			t.Errorf("coverage data from %q output match failed: %s", tp, msg)
 		}
-
-		if testing.CoverMode() == "atomic" {
-			upmergeCoverData(t, edir2)
-			upmergeCoverData(t, rdir2)
-		} else {
-			upmergeCoverData(t, edir1)
-			upmergeCoverData(t, rdir1)
-		}
+		upmergeCoverData(t, edir, "atomic")
+		upmergeCoverData(t, rdir, "atomic")
 	})
 }
 
+func testEmitToDirNonAtomic(t *testing.T, harnessPath string, naMode string, dir string) {
+	tp := "emitToDir"
+	tag := "nonatomdir"
+	rdir, edir := mktestdirs(t, tag, tp, dir)
+	output, err := runHarness(t, harnessPath, tp,
+		true, rdir, edir)
+
+	// We expect an error here.
+	if err == nil {
+		t.Logf("%s", output)
+		t.Fatalf("running 'harness -tp %s': did not get expected error", tp)
+	}
+
+	got := strings.TrimSpace(string(output))
+	want := "WriteCountersDir invoked for program built"
+	if !strings.Contains(got, want) {
+		t.Errorf("running 'harness -tp %s': got:\n%s\nwant: %s",
+			tp, got, want)
+	}
+	upmergeCoverData(t, edir, naMode)
+	upmergeCoverData(t, rdir, naMode)
+}
+
+func testEmitToWriterNonAtomic(t *testing.T, harnessPath string, naMode string, dir string) {
+	tp := "emitToWriter"
+	tag := "nonatomw"
+	rdir, edir := mktestdirs(t, tag, tp, dir)
+	output, err := runHarness(t, harnessPath, tp,
+		true, rdir, edir)
+
+	// We expect an error here.
+	if err == nil {
+		t.Logf("%s", output)
+		t.Fatalf("running 'harness -tp %s': did not get expected error", tp)
+	}
+
+	got := strings.TrimSpace(string(output))
+	want := "WriteCounters invoked for program built"
+	if !strings.Contains(got, want) {
+		t.Errorf("running 'harness -tp %s': got:\n%s\nwant: %s",
+			tp, got, want)
+	}
+
+	upmergeCoverData(t, edir, naMode)
+	upmergeCoverData(t, rdir, naMode)
+}
+
+func testEmitWithCounterClearNonAtomic(t *testing.T, harnessPath string, naMode string, dir string) {
+	tp := "emitWithCounterClear"
+	tag := "cclear"
+	rdir, edir := mktestdirs(t, tag, tp, dir)
+	output, err := runHarness(t, harnessPath, tp,
+		true, rdir, edir)
+
+	// We expect an error here.
+	if err == nil {
+		t.Logf("%s", output)
+		t.Fatalf("running 'harness -tp %s' nonatomic: did not get expected error", tp)
+	}
+
+	got := strings.TrimSpace(string(output))
+	want := "ClearCounters invoked for program built"
+	if !strings.Contains(got, want) {
+		t.Errorf("running 'harness -tp %s': got:\n%s\nwant: %s",
+			tp, got, want)
+	}
+
+	upmergeCoverData(t, edir, naMode)
+	upmergeCoverData(t, rdir, naMode)
+}
+
 func TestApisOnNocoverBinary(t *testing.T) {
 	if testing.Short() {
 		t.Skipf("skipping test: too long for short mode")
@@ -449,3 +496,55 @@
 		}
 	}
 }
+
+func TestIssue59563TruncatedCoverPkgAll(t *testing.T) {
+	if testing.Short() {
+		t.Skipf("skipping test: too long for short mode")
+	}
+	testenv.MustHaveGoRun(t)
+
+	tmpdir := t.TempDir()
+	ppath := filepath.Join(tmpdir, "foo.cov")
+
+	cmd := exec.Command(testenv.GoToolPath(t), "test", "-coverpkg=all", "-coverprofile="+ppath)
+	cmd.Dir = filepath.Join("testdata", "issue59563")
+	b, err := cmd.CombinedOutput()
+	if err != nil {
+		t.Fatalf("go test -cover failed: %v", err)
+	}
+
+	cmd = exec.Command(testenv.GoToolPath(t), "tool", "cover", "-func="+ppath)
+	b, err = cmd.CombinedOutput()
+	if err != nil {
+		t.Fatalf("go tool cover -func failed: %v", err)
+	}
+
+	lines := strings.Split(string(b), "\n")
+	nfound := 0
+	bad := false
+	for _, line := range lines {
+		f := strings.Fields(line)
+		if len(f) == 0 {
+			continue
+		}
+		// We're only interested in the specific function "large" for
+		// the testcase being built. See the #59563 for details on why
+		// size matters.
+		if !(strings.HasPrefix(f[0], "runtime/coverage/testdata/issue59563/repro.go") && strings.Contains(line, "large")) {
+			continue
+		}
+		nfound++
+		want := "100.0%"
+		if f[len(f)-1] != want {
+			t.Errorf("wanted %s got: %q\n", want, line)
+			bad = true
+		}
+	}
+	if nfound != 1 {
+		t.Errorf("wanted 1 found, got %d\n", nfound)
+		bad = true
+	}
+	if bad {
+		t.Logf("func output:\n%s\n", string(b))
+	}
+}
diff --git a/src/runtime/coverage/testdata/issue59563/repro.go b/src/runtime/coverage/testdata/issue59563/repro.go
new file mode 100644
index 0000000..d054567
--- /dev/null
+++ b/src/runtime/coverage/testdata/issue59563/repro.go
@@ -0,0 +1,823 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package repro
+
+import (
+	"fmt"
+	"net/http"
+)
+
+func small() {
+	go func() {
+		fmt.Println(http.ListenAndServe("localhost:7070", nil))
+	}()
+}
+
+func large(x int) int {
+	if x == 0 {
+		x += 0
+	} else if x == 1 {
+		x += 1
+	} else if x == 2 {
+		x += 2
+	} else if x == 3 {
+		x += 3
+	} else if x == 4 {
+		x += 4
+	} else if x == 5 {
+		x += 5
+	} else if x == 6 {
+		x += 6
+	} else if x == 7 {
+		x += 7
+	} else if x == 8 {
+		x += 8
+	} else if x == 9 {
+		x += 9
+	} else if x == 10 {
+		x += 10
+	} else if x == 11 {
+		x += 11
+	} else if x == 12 {
+		x += 12
+	} else if x == 13 {
+		x += 13
+	} else if x == 14 {
+		x += 14
+	} else if x == 15 {
+		x += 15
+	} else if x == 16 {
+		x += 16
+	} else if x == 17 {
+		x += 17
+	} else if x == 18 {
+		x += 18
+	} else if x == 19 {
+		x += 19
+	} else if x == 20 {
+		x += 20
+	} else if x == 21 {
+		x += 21
+	} else if x == 22 {
+		x += 22
+	} else if x == 23 {
+		x += 23
+	} else if x == 24 {
+		x += 24
+	} else if x == 25 {
+		x += 25
+	} else if x == 26 {
+		x += 26
+	} else if x == 27 {
+		x += 27
+	} else if x == 28 {
+		x += 28
+	} else if x == 29 {
+		x += 29
+	} else if x == 30 {
+		x += 30
+	} else if x == 31 {
+		x += 31
+	} else if x == 32 {
+		x += 32
+	} else if x == 33 {
+		x += 33
+	} else if x == 34 {
+		x += 34
+	} else if x == 35 {
+		x += 35
+	} else if x == 36 {
+		x += 36
+	} else if x == 37 {
+		x += 37
+	} else if x == 38 {
+		x += 38
+	} else if x == 39 {
+		x += 39
+	} else if x == 40 {
+		x += 40
+	} else if x == 41 {
+		x += 41
+	} else if x == 42 {
+		x += 42
+	} else if x == 43 {
+		x += 43
+	} else if x == 44 {
+		x += 44
+	} else if x == 45 {
+		x += 45
+	} else if x == 46 {
+		x += 46
+	} else if x == 47 {
+		x += 47
+	} else if x == 48 {
+		x += 48
+	} else if x == 49 {
+		x += 49
+	} else if x == 50 {
+		x += 50
+	} else if x == 51 {
+		x += 51
+	} else if x == 52 {
+		x += 52
+	} else if x == 53 {
+		x += 53
+	} else if x == 54 {
+		x += 54
+	} else if x == 55 {
+		x += 55
+	} else if x == 56 {
+		x += 56
+	} else if x == 57 {
+		x += 57
+	} else if x == 58 {
+		x += 58
+	} else if x == 59 {
+		x += 59
+	} else if x == 60 {
+		x += 60
+	} else if x == 61 {
+		x += 61
+	} else if x == 62 {
+		x += 62
+	} else if x == 63 {
+		x += 63
+	} else if x == 64 {
+		x += 64
+	} else if x == 65 {
+		x += 65
+	} else if x == 66 {
+		x += 66
+	} else if x == 67 {
+		x += 67
+	} else if x == 68 {
+		x += 68
+	} else if x == 69 {
+		x += 69
+	} else if x == 70 {
+		x += 70
+	} else if x == 71 {
+		x += 71
+	} else if x == 72 {
+		x += 72
+	} else if x == 73 {
+		x += 73
+	} else if x == 74 {
+		x += 74
+	} else if x == 75 {
+		x += 75
+	} else if x == 76 {
+		x += 76
+	} else if x == 77 {
+		x += 77
+	} else if x == 78 {
+		x += 78
+	} else if x == 79 {
+		x += 79
+	} else if x == 80 {
+		x += 80
+	} else if x == 81 {
+		x += 81
+	} else if x == 82 {
+		x += 82
+	} else if x == 83 {
+		x += 83
+	} else if x == 84 {
+		x += 84
+	} else if x == 85 {
+		x += 85
+	} else if x == 86 {
+		x += 86
+	} else if x == 87 {
+		x += 87
+	} else if x == 88 {
+		x += 88
+	} else if x == 89 {
+		x += 89
+	} else if x == 90 {
+		x += 90
+	} else if x == 91 {
+		x += 91
+	} else if x == 92 {
+		x += 92
+	} else if x == 93 {
+		x += 93
+	} else if x == 94 {
+		x += 94
+	} else if x == 95 {
+		x += 95
+	} else if x == 96 {
+		x += 96
+	} else if x == 97 {
+		x += 97
+	} else if x == 98 {
+		x += 98
+	} else if x == 99 {
+		x += 99
+	} else if x == 100 {
+		x += 100
+	} else if x == 101 {
+		x += 101
+	} else if x == 102 {
+		x += 102
+	} else if x == 103 {
+		x += 103
+	} else if x == 104 {
+		x += 104
+	} else if x == 105 {
+		x += 105
+	} else if x == 106 {
+		x += 106
+	} else if x == 107 {
+		x += 107
+	} else if x == 108 {
+		x += 108
+	} else if x == 109 {
+		x += 109
+	} else if x == 110 {
+		x += 110
+	} else if x == 111 {
+		x += 111
+	} else if x == 112 {
+		x += 112
+	} else if x == 113 {
+		x += 113
+	} else if x == 114 {
+		x += 114
+	} else if x == 115 {
+		x += 115
+	} else if x == 116 {
+		x += 116
+	} else if x == 117 {
+		x += 117
+	} else if x == 118 {
+		x += 118
+	} else if x == 119 {
+		x += 119
+	} else if x == 120 {
+		x += 120
+	} else if x == 121 {
+		x += 121
+	} else if x == 122 {
+		x += 122
+	} else if x == 123 {
+		x += 123
+	} else if x == 124 {
+		x += 124
+	} else if x == 125 {
+		x += 125
+	} else if x == 126 {
+		x += 126
+	} else if x == 127 {
+		x += 127
+	} else if x == 128 {
+		x += 128
+	} else if x == 129 {
+		x += 129
+	} else if x == 130 {
+		x += 130
+	} else if x == 131 {
+		x += 131
+	} else if x == 132 {
+		x += 132
+	} else if x == 133 {
+		x += 133
+	} else if x == 134 {
+		x += 134
+	} else if x == 135 {
+		x += 135
+	} else if x == 136 {
+		x += 136
+	} else if x == 137 {
+		x += 137
+	} else if x == 138 {
+		x += 138
+	} else if x == 139 {
+		x += 139
+	} else if x == 140 {
+		x += 140
+	} else if x == 141 {
+		x += 141
+	} else if x == 142 {
+		x += 142
+	} else if x == 143 {
+		x += 143
+	} else if x == 144 {
+		x += 144
+	} else if x == 145 {
+		x += 145
+	} else if x == 146 {
+		x += 146
+	} else if x == 147 {
+		x += 147
+	} else if x == 148 {
+		x += 148
+	} else if x == 149 {
+		x += 149
+	} else if x == 150 {
+		x += 150
+	} else if x == 151 {
+		x += 151
+	} else if x == 152 {
+		x += 152
+	} else if x == 153 {
+		x += 153
+	} else if x == 154 {
+		x += 154
+	} else if x == 155 {
+		x += 155
+	} else if x == 156 {
+		x += 156
+	} else if x == 157 {
+		x += 157
+	} else if x == 158 {
+		x += 158
+	} else if x == 159 {
+		x += 159
+	} else if x == 160 {
+		x += 160
+	} else if x == 161 {
+		x += 161
+	} else if x == 162 {
+		x += 162
+	} else if x == 163 {
+		x += 163
+	} else if x == 164 {
+		x += 164
+	} else if x == 165 {
+		x += 165
+	} else if x == 166 {
+		x += 166
+	} else if x == 167 {
+		x += 167
+	} else if x == 168 {
+		x += 168
+	} else if x == 169 {
+		x += 169
+	} else if x == 170 {
+		x += 170
+	} else if x == 171 {
+		x += 171
+	} else if x == 172 {
+		x += 172
+	} else if x == 173 {
+		x += 173
+	} else if x == 174 {
+		x += 174
+	} else if x == 175 {
+		x += 175
+	} else if x == 176 {
+		x += 176
+	} else if x == 177 {
+		x += 177
+	} else if x == 178 {
+		x += 178
+	} else if x == 179 {
+		x += 179
+	} else if x == 180 {
+		x += 180
+	} else if x == 181 {
+		x += 181
+	} else if x == 182 {
+		x += 182
+	} else if x == 183 {
+		x += 183
+	} else if x == 184 {
+		x += 184
+	} else if x == 185 {
+		x += 185
+	} else if x == 186 {
+		x += 186
+	} else if x == 187 {
+		x += 187
+	} else if x == 188 {
+		x += 188
+	} else if x == 189 {
+		x += 189
+	} else if x == 190 {
+		x += 190
+	} else if x == 191 {
+		x += 191
+	} else if x == 192 {
+		x += 192
+	} else if x == 193 {
+		x += 193
+	} else if x == 194 {
+		x += 194
+	} else if x == 195 {
+		x += 195
+	} else if x == 196 {
+		x += 196
+	} else if x == 197 {
+		x += 197
+	} else if x == 198 {
+		x += 198
+	} else if x == 199 {
+		x += 199
+	} else if x == 200 {
+		x += 200
+	} else if x == 201 {
+		x += 201
+	} else if x == 202 {
+		x += 202
+	} else if x == 203 {
+		x += 203
+	} else if x == 204 {
+		x += 204
+	} else if x == 205 {
+		x += 205
+	} else if x == 206 {
+		x += 206
+	} else if x == 207 {
+		x += 207
+	} else if x == 208 {
+		x += 208
+	} else if x == 209 {
+		x += 209
+	} else if x == 210 {
+		x += 210
+	} else if x == 211 {
+		x += 211
+	} else if x == 212 {
+		x += 212
+	} else if x == 213 {
+		x += 213
+	} else if x == 214 {
+		x += 214
+	} else if x == 215 {
+		x += 215
+	} else if x == 216 {
+		x += 216
+	} else if x == 217 {
+		x += 217
+	} else if x == 218 {
+		x += 218
+	} else if x == 219 {
+		x += 219
+	} else if x == 220 {
+		x += 220
+	} else if x == 221 {
+		x += 221
+	} else if x == 222 {
+		x += 222
+	} else if x == 223 {
+		x += 223
+	} else if x == 224 {
+		x += 224
+	} else if x == 225 {
+		x += 225
+	} else if x == 226 {
+		x += 226
+	} else if x == 227 {
+		x += 227
+	} else if x == 228 {
+		x += 228
+	} else if x == 229 {
+		x += 229
+	} else if x == 230 {
+		x += 230
+	} else if x == 231 {
+		x += 231
+	} else if x == 232 {
+		x += 232
+	} else if x == 233 {
+		x += 233
+	} else if x == 234 {
+		x += 234
+	} else if x == 235 {
+		x += 235
+	} else if x == 236 {
+		x += 236
+	} else if x == 237 {
+		x += 237
+	} else if x == 238 {
+		x += 238
+	} else if x == 239 {
+		x += 239
+	} else if x == 240 {
+		x += 240
+	} else if x == 241 {
+		x += 241
+	} else if x == 242 {
+		x += 242
+	} else if x == 243 {
+		x += 243
+	} else if x == 244 {
+		x += 244
+	} else if x == 245 {
+		x += 245
+	} else if x == 246 {
+		x += 246
+	} else if x == 247 {
+		x += 247
+	} else if x == 248 {
+		x += 248
+	} else if x == 249 {
+		x += 249
+	} else if x == 250 {
+		x += 250
+	} else if x == 251 {
+		x += 251
+	} else if x == 252 {
+		x += 252
+	} else if x == 253 {
+		x += 253
+	} else if x == 254 {
+		x += 254
+	} else if x == 255 {
+		x += 255
+	} else if x == 256 {
+		x += 256
+	} else if x == 257 {
+		x += 257
+	} else if x == 258 {
+		x += 258
+	} else if x == 259 {
+		x += 259
+	} else if x == 260 {
+		x += 260
+	} else if x == 261 {
+		x += 261
+	} else if x == 262 {
+		x += 262
+	} else if x == 263 {
+		x += 263
+	} else if x == 264 {
+		x += 264
+	} else if x == 265 {
+		x += 265
+	} else if x == 266 {
+		x += 266
+	} else if x == 267 {
+		x += 267
+	} else if x == 268 {
+		x += 268
+	} else if x == 269 {
+		x += 269
+	} else if x == 270 {
+		x += 270
+	} else if x == 271 {
+		x += 271
+	} else if x == 272 {
+		x += 272
+	} else if x == 273 {
+		x += 273
+	} else if x == 274 {
+		x += 274
+	} else if x == 275 {
+		x += 275
+	} else if x == 276 {
+		x += 276
+	} else if x == 277 {
+		x += 277
+	} else if x == 278 {
+		x += 278
+	} else if x == 279 {
+		x += 279
+	} else if x == 280 {
+		x += 280
+	} else if x == 281 {
+		x += 281
+	} else if x == 282 {
+		x += 282
+	} else if x == 283 {
+		x += 283
+	} else if x == 284 {
+		x += 284
+	} else if x == 285 {
+		x += 285
+	} else if x == 286 {
+		x += 286
+	} else if x == 287 {
+		x += 287
+	} else if x == 288 {
+		x += 288
+	} else if x == 289 {
+		x += 289
+	} else if x == 290 {
+		x += 290
+	} else if x == 291 {
+		x += 291
+	} else if x == 292 {
+		x += 292
+	} else if x == 293 {
+		x += 293
+	} else if x == 294 {
+		x += 294
+	} else if x == 295 {
+		x += 295
+	} else if x == 296 {
+		x += 296
+	} else if x == 297 {
+		x += 297
+	} else if x == 298 {
+		x += 298
+	} else if x == 299 {
+		x += 299
+	} else if x == 300 {
+		x += 300
+	} else if x == 301 {
+		x += 301
+	} else if x == 302 {
+		x += 302
+	} else if x == 303 {
+		x += 303
+	} else if x == 304 {
+		x += 304
+	} else if x == 305 {
+		x += 305
+	} else if x == 306 {
+		x += 306
+	} else if x == 307 {
+		x += 307
+	} else if x == 308 {
+		x += 308
+	} else if x == 309 {
+		x += 309
+	} else if x == 310 {
+		x += 310
+	} else if x == 311 {
+		x += 311
+	} else if x == 312 {
+		x += 312
+	} else if x == 313 {
+		x += 313
+	} else if x == 314 {
+		x += 314
+	} else if x == 315 {
+		x += 315
+	} else if x == 316 {
+		x += 316
+	} else if x == 317 {
+		x += 317
+	} else if x == 318 {
+		x += 318
+	} else if x == 319 {
+		x += 319
+	} else if x == 320 {
+		x += 320
+	} else if x == 321 {
+		x += 321
+	} else if x == 322 {
+		x += 322
+	} else if x == 323 {
+		x += 323
+	} else if x == 324 {
+		x += 324
+	} else if x == 325 {
+		x += 325
+	} else if x == 326 {
+		x += 326
+	} else if x == 327 {
+		x += 327
+	} else if x == 328 {
+		x += 328
+	} else if x == 329 {
+		x += 329
+	} else if x == 330 {
+		x += 330
+	} else if x == 331 {
+		x += 331
+	} else if x == 332 {
+		x += 332
+	} else if x == 333 {
+		x += 333
+	} else if x == 334 {
+		x += 334
+	} else if x == 335 {
+		x += 335
+	} else if x == 336 {
+		x += 336
+	} else if x == 337 {
+		x += 337
+	} else if x == 338 {
+		x += 338
+	} else if x == 339 {
+		x += 339
+	} else if x == 340 {
+		x += 340
+	} else if x == 341 {
+		x += 341
+	} else if x == 342 {
+		x += 342
+	} else if x == 343 {
+		x += 343
+	} else if x == 344 {
+		x += 344
+	} else if x == 345 {
+		x += 345
+	} else if x == 346 {
+		x += 346
+	} else if x == 347 {
+		x += 347
+	} else if x == 348 {
+		x += 348
+	} else if x == 349 {
+		x += 349
+	} else if x == 350 {
+		x += 350
+	} else if x == 351 {
+		x += 351
+	} else if x == 352 {
+		x += 352
+	} else if x == 353 {
+		x += 353
+	} else if x == 354 {
+		x += 354
+	} else if x == 355 {
+		x += 355
+	} else if x == 356 {
+		x += 356
+	} else if x == 357 {
+		x += 357
+	} else if x == 358 {
+		x += 358
+	} else if x == 359 {
+		x += 359
+	} else if x == 360 {
+		x += 360
+	} else if x == 361 {
+		x += 361
+	} else if x == 362 {
+		x += 362
+	} else if x == 363 {
+		x += 363
+	} else if x == 364 {
+		x += 364
+	} else if x == 365 {
+		x += 365
+	} else if x == 366 {
+		x += 366
+	} else if x == 367 {
+		x += 367
+	} else if x == 368 {
+		x += 368
+	} else if x == 369 {
+		x += 369
+	} else if x == 370 {
+		x += 370
+	} else if x == 371 {
+		x += 371
+	} else if x == 372 {
+		x += 372
+	} else if x == 373 {
+		x += 373
+	} else if x == 374 {
+		x += 374
+	} else if x == 375 {
+		x += 375
+	} else if x == 376 {
+		x += 376
+	} else if x == 377 {
+		x += 377
+	} else if x == 378 {
+		x += 378
+	} else if x == 379 {
+		x += 379
+	} else if x == 380 {
+		x += 380
+	} else if x == 381 {
+		x += 381
+	} else if x == 382 {
+		x += 382
+	} else if x == 383 {
+		x += 383
+	} else if x == 384 {
+		x += 384
+	} else if x == 385 {
+		x += 385
+	} else if x == 386 {
+		x += 386
+	} else if x == 387 {
+		x += 387
+	} else if x == 388 {
+		x += 388
+	} else if x == 389 {
+		x += 389
+	} else if x == 390 {
+		x += 390
+	} else if x == 391 {
+		x += 391
+	} else if x == 392 {
+		x += 392
+	} else if x == 393 {
+		x += 393
+	} else if x == 394 {
+		x += 394
+	} else if x == 395 {
+		x += 395
+	} else if x == 396 {
+		x += 396
+	} else if x == 397 {
+		x += 397
+	} else if x == 398 {
+		x += 398
+	} else if x == 399 {
+		x += 399
+	} else if x == 400 {
+		x += 400
+	}
+	return x * x
+}
diff --git a/src/runtime/coverage/testdata/issue59563/repro_test.go b/src/runtime/coverage/testdata/issue59563/repro_test.go
new file mode 100644
index 0000000..15c8e01
--- /dev/null
+++ b/src/runtime/coverage/testdata/issue59563/repro_test.go
@@ -0,0 +1,14 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package repro
+
+import "testing"
+
+func TestSomething(t *testing.T) {
+	small()
+	for i := 0; i < 1001; i++ {
+		large(i)
+	}
+}
diff --git a/src/runtime/coverage/testsupport.go b/src/runtime/coverage/testsupport.go
index a481bbb..f169580 100644
--- a/src/runtime/coverage/testsupport.go
+++ b/src/runtime/coverage/testsupport.go
@@ -5,6 +5,7 @@
 package coverage
 
 import (
+	"encoding/json"
 	"fmt"
 	"internal/coverage"
 	"internal/coverage/calloc"
@@ -15,7 +16,10 @@
 	"internal/coverage/pods"
 	"io"
 	"os"
+	"path/filepath"
+	"runtime/internal/atomic"
 	"strings"
+	"unsafe"
 )
 
 // processCoverTestDir is called (via a linknamed reference) from
@@ -86,17 +90,25 @@
 	// hash (just in case there are multiple instrumented executables
 	// in play). See issue #57924 for more on this.
 	hashstring := fmt.Sprintf("%x", finalHash)
+	importpaths := make(map[string]struct{})
 	for _, p := range podlist {
 		if !strings.Contains(p.MetaFile, hashstring) {
 			continue
 		}
-		if err := ts.processPod(p); err != nil {
+		if err := ts.processPod(p, importpaths); err != nil {
+			return err
+		}
+	}
+
+	metafilespath := filepath.Join(dir, coverage.MetaFilesFileName)
+	if _, err := os.Stat(metafilespath); err == nil {
+		if err := ts.readAuxMetaFiles(metafilespath, importpaths); err != nil {
 			return err
 		}
 	}
 
 	// Emit percent.
-	if err := ts.cf.EmitPercent(w, cpkg, true); err != nil {
+	if err := ts.cf.EmitPercent(w, cpkg, true, true); err != nil {
 		return err
 	}
 
@@ -122,7 +134,7 @@
 }
 
 // processPod reads coverage counter data for a specific pod.
-func (ts *tstate) processPod(p pods.Pod) error {
+func (ts *tstate) processPod(p pods.Pod, importpaths map[string]struct{}) error {
 	// Open meta-data file
 	f, err := os.Open(p.MetaFile)
 	if err != nil {
@@ -202,6 +214,7 @@
 			return fmt.Errorf("reading pkg %d from meta-file %s: %s", pkIdx, p.MetaFile, err)
 		}
 		ts.cf.SetPackage(pd.PackagePath())
+		importpaths[pd.PackagePath()] = struct{}{}
 		var fd coverage.FuncDesc
 		nf := pd.NumFuncs()
 		for fnIdx := uint32(0); fnIdx < nf; fnIdx++ {
@@ -232,3 +245,79 @@
 type pkfunc struct {
 	pk, fcn uint32
 }
+
+func (ts *tstate) readAuxMetaFiles(metafiles string, importpaths map[string]struct{}) error {
+	// Unmarshall the information on available aux metafiles into
+	// a MetaFileCollection struct.
+	var mfc coverage.MetaFileCollection
+	data, err := os.ReadFile(metafiles)
+	if err != nil {
+		return fmt.Errorf("error reading auxmetafiles file %q: %v", metafiles, err)
+	}
+	if err := json.Unmarshal(data, &mfc); err != nil {
+		return fmt.Errorf("error reading auxmetafiles file %q: %v", metafiles, err)
+	}
+
+	// Walk through each available aux meta-file. If we've already
+	// seen the package path in question during the walk of the
+	// "regular" meta-data file, then we can skip the package,
+	// otherwise construct a dummy pod with the single meta-data file
+	// (no counters) and invoke processPod on it.
+	for i := range mfc.ImportPaths {
+		p := mfc.ImportPaths[i]
+		if _, ok := importpaths[p]; ok {
+			continue
+		}
+		var pod pods.Pod
+		pod.MetaFile = mfc.MetaFileFragments[i]
+		if err := ts.processPod(pod, importpaths); err != nil {
+			return err
+		}
+	}
+	return nil
+}
+
+// snapshot returns a snapshot of coverage percentage at a moment of
+// time within a running test, so as to support the testing.Coverage()
+// function. This version doesn't examine coverage meta-data, so the
+// result it returns will be less accurate (more "slop") due to the
+// fact that we don't look at the meta data to see how many statements
+// are associated with each counter.
+func snapshot() float64 {
+	cl := getCovCounterList()
+	if len(cl) == 0 {
+		// no work to do here.
+		return 0.0
+	}
+
+	tot := uint64(0)
+	totExec := uint64(0)
+	for _, c := range cl {
+		sd := unsafe.Slice((*atomic.Uint32)(unsafe.Pointer(c.Counters)), c.Len)
+		tot += uint64(len(sd))
+		for i := 0; i < len(sd); i++ {
+			// Skip ahead until the next non-zero value.
+			if sd[i].Load() == 0 {
+				continue
+			}
+			// We found a function that was executed.
+			nCtrs := sd[i+coverage.NumCtrsOffset].Load()
+			cst := i + coverage.FirstCtrOffset
+
+			if cst+int(nCtrs) > len(sd) {
+				break
+			}
+			counters := sd[cst : cst+int(nCtrs)]
+			for i := range counters {
+				if counters[i].Load() != 0 {
+					totExec++
+				}
+			}
+			i += coverage.FirstCtrOffset + int(nCtrs) - 1
+		}
+	}
+	if tot == 0 {
+		return 0.0
+	}
+	return float64(totExec) / float64(tot)
+}
diff --git a/src/runtime/coverage/ts_test.go b/src/runtime/coverage/ts_test.go
index b826058..b4c6e97 100644
--- a/src/runtime/coverage/ts_test.go
+++ b/src/runtime/coverage/ts_test.go
@@ -5,8 +5,12 @@
 package coverage
 
 import (
+	"encoding/json"
+	"internal/coverage"
 	"internal/goexperiment"
+	"internal/testenv"
 	"os"
+	"os/exec"
 	"path/filepath"
 	"strings"
 	"testing"
@@ -16,6 +20,14 @@
 //go:linkname testing_testGoCoverDir testing.testGoCoverDir
 func testing_testGoCoverDir() string
 
+func testGoCoverDir(t *testing.T) string {
+	tgcd := testing_testGoCoverDir()
+	if tgcd != "" {
+		return tgcd
+	}
+	return t.TempDir()
+}
+
 // TestTestSupport does a basic verification of the functionality in
 // runtime/coverage.processCoverTestDir (doing this here as opposed to
 // relying on other test paths will provide a better signal when
@@ -27,12 +39,13 @@
 	if testing.CoverMode() == "" {
 		return
 	}
+	tgcd := testGoCoverDir(t)
 	t.Logf("testing.testGoCoverDir() returns %s mode=%s\n",
-		testing_testGoCoverDir(), testing.CoverMode())
+		tgcd, testing.CoverMode())
 
 	textfile := filepath.Join(t.TempDir(), "file.txt")
 	var sb strings.Builder
-	err := processCoverTestDirInternal(testing_testGoCoverDir(), textfile,
+	err := processCoverTestDirInternal(tgcd, textfile,
 		testing.CoverMode(), "", &sb)
 	if err != nil {
 		t.Fatalf("bad: %v", err)
@@ -47,12 +60,148 @@
 
 	// Check for percent output with expected tokens.
 	strout := sb.String()
-	want1 := "runtime/coverage"
-	want2 := "of statements"
-	if !strings.Contains(strout, want1) ||
-		!strings.Contains(strout, want2) {
+	want := "of statements"
+	if !strings.Contains(strout, want) {
 		t.Logf("output from run: %s\n", strout)
-		t.Fatalf("percent output missing key tokens: %q and %q",
-			want1, want2)
+		t.Fatalf("percent output missing token: %q", want)
+	}
+}
+
+var funcInvoked bool
+
+//go:noinline
+func thisFunctionOnlyCalledFromSnapshotTest(n int) int {
+	if funcInvoked {
+		panic("bad")
+	}
+	funcInvoked = true
+
+	// Contents here not especially important, just so long as we
+	// have some statements.
+	t := 0
+	for i := 0; i < n; i++ {
+		for j := 0; j < i; j++ {
+			t += i ^ j
+		}
+	}
+	return t
+}
+
+// Tests runtime/coverage.snapshot() directly. Note that if
+// coverage is not enabled, the hook is designed to just return
+// zero.
+func TestCoverageSnapshot(t *testing.T) {
+	C1 := snapshot()
+	thisFunctionOnlyCalledFromSnapshotTest(15)
+	C2 := snapshot()
+	cond := "C1 > C2"
+	val := C1 > C2
+	if testing.CoverMode() != "" {
+		cond = "C1 >= C2"
+		val = C1 >= C2
+	}
+	t.Logf("%f %f\n", C1, C2)
+	if val {
+		t.Errorf("erroneous snapshots, %s = true C1=%f C2=%f",
+			cond, C1, C2)
+	}
+}
+
+const hellogo = `
+package main
+
+func main() {
+  println("hello")
+}
+`
+
+// Returns a pair F,T where F is a meta-data file generated from
+// "hello.go" above, and T is a token to look for that should be
+// present in the coverage report from F.
+func genAuxMeta(t *testing.T, dstdir string) (string, string) {
+	// Do a GOCOVERDIR=<tmp> go run hello.go
+	src := filepath.Join(dstdir, "hello.go")
+	if err := os.WriteFile(src, []byte(hellogo), 0777); err != nil {
+		t.Fatalf("write failed: %v", err)
+	}
+	args := []string{"run", "-covermode=" + testing.CoverMode(), src}
+	cmd := exec.Command(testenv.GoToolPath(t), args...)
+	cmd.Env = updateGoCoverDir(os.Environ(), dstdir, true)
+	if b, err := cmd.CombinedOutput(); err != nil {
+		t.Fatalf("go run failed (%v): %s", err, b)
+	}
+
+	// Pick out the generated meta-data file.
+	files, err := os.ReadDir(dstdir)
+	if err != nil {
+		t.Fatalf("reading %s: %v", dstdir, err)
+	}
+	for _, f := range files {
+		if strings.HasPrefix(f.Name(), "covmeta") {
+			return filepath.Join(dstdir, f.Name()), "hello.go:"
+		}
+	}
+	t.Fatalf("could not locate generated meta-data file")
+	return "", ""
+}
+
+func TestAuxMetaDataFiles(t *testing.T) {
+	if !goexperiment.CoverageRedesign {
+		return
+	}
+	if testing.CoverMode() == "" {
+		return
+	}
+	testenv.MustHaveGoRun(t)
+	tgcd := testGoCoverDir(t)
+	t.Logf("testing.testGoCoverDir() returns %s mode=%s\n",
+		tgcd, testing.CoverMode())
+
+	td := t.TempDir()
+
+	// Manufacture a new, separate meta-data file not related to this
+	// test. Contents are not important, just so long as the
+	// packages/paths are different.
+	othermetadir := filepath.Join(td, "othermeta")
+	if err := os.Mkdir(othermetadir, 0777); err != nil {
+		t.Fatalf("mkdir failed: %v", err)
+	}
+	mfile, token := genAuxMeta(t, othermetadir)
+
+	// Write a metafiles file.
+	metafiles := filepath.Join(tgcd, coverage.MetaFilesFileName)
+	mfc := coverage.MetaFileCollection{
+		ImportPaths:       []string{"command-line-arguments"},
+		MetaFileFragments: []string{mfile},
+	}
+	jdata, err := json.Marshal(mfc)
+	if err != nil {
+		t.Fatalf("marshal MetaFileCollection: %v", err)
+	}
+	if err := os.WriteFile(metafiles, jdata, 0666); err != nil {
+		t.Fatalf("write failed: %v", err)
+	}
+
+	// Kick off guts of test.
+	var sb strings.Builder
+	textfile := filepath.Join(td, "file2.txt")
+	err = processCoverTestDirInternal(tgcd, textfile,
+		testing.CoverMode(), "", &sb)
+	if err != nil {
+		t.Fatalf("bad: %v", err)
+	}
+	if err = os.Remove(metafiles); err != nil {
+		t.Fatalf("removing metafiles file: %v", err)
+	}
+
+	// Look for the expected things in the coverage profile.
+	contents, err := os.ReadFile(textfile)
+	strc := string(contents)
+	if err != nil {
+		t.Fatalf("problems reading text file %s: %v", textfile, err)
+	}
+	if !strings.Contains(strc, token) {
+		t.Logf("content: %s\n", string(contents))
+		t.Fatalf("cov profile does not contain aux meta content %q", token)
 	}
 }
diff --git a/src/runtime/cpuflags_arm64.go b/src/runtime/cpuflags_arm64.go
index a0f1d11..2ed1811 100644
--- a/src/runtime/cpuflags_arm64.go
+++ b/src/runtime/cpuflags_arm64.go
@@ -11,7 +11,7 @@
 var arm64UseAlignedLoads bool
 
 func init() {
-	if cpu.ARM64.IsNeoverseN1 || cpu.ARM64.IsNeoverseV1 {
+	if cpu.ARM64.IsNeoverse {
 		arm64UseAlignedLoads = true
 	}
 }
diff --git a/src/runtime/cpuprof.go b/src/runtime/cpuprof.go
index 6ef374e..0d7eeac 100644
--- a/src/runtime/cpuprof.go
+++ b/src/runtime/cpuprof.go
@@ -227,7 +227,11 @@
 	lock(&cpuprof.lock)
 	log := cpuprof.log
 	unlock(&cpuprof.lock)
-	data, tags, eof := log.read(profBufBlocking)
+	readMode := profBufBlocking
+	if GOOS == "darwin" || GOOS == "ios" {
+		readMode = profBufNonBlocking // For #61768; on Darwin notes are not async-signal-safe.  See sigNoteSetup in os_darwin.go.
+	}
+	data, tags, eof := log.read(readMode)
 	if len(data) == 0 && eof {
 		lock(&cpuprof.lock)
 		cpuprof.log = nil
diff --git a/src/runtime/cputicks.go b/src/runtime/cputicks.go
index 9127061..2cf3240 100644
--- a/src/runtime/cputicks.go
+++ b/src/runtime/cputicks.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build !arm && !arm64 && !loong64 && !mips64 && !mips64le && !mips && !mipsle && !wasm
+//go:build !arm && !arm64 && !mips64 && !mips64le && !mips && !mipsle && !wasm
 
 package runtime
 
diff --git a/src/runtime/crash_cgo_test.go b/src/runtime/crash_cgo_test.go
index 51d7bb5..e185180 100644
--- a/src/runtime/crash_cgo_test.go
+++ b/src/runtime/crash_cgo_test.go
@@ -9,6 +9,7 @@
 import (
 	"fmt"
 	"internal/goos"
+	"internal/platform"
 	"internal/testenv"
 	"os"
 	"os/exec"
@@ -111,6 +112,9 @@
 
 	got := runTestProg(t, "testprogcgo", "CgoExternalThreadSignal")
 	if want := "OK\n"; got != want {
+		if runtime.GOOS == "ios" && strings.Contains(got, "C signal did not crash as expected") {
+			testenv.SkipFlaky(t, 59913)
+		}
 		t.Fatalf("expected %q, but got:\n%s", want, got)
 	}
 }
@@ -367,8 +371,12 @@
 }
 
 func TestRaceProf(t *testing.T) {
-	if (runtime.GOOS != "linux" && runtime.GOOS != "freebsd") || runtime.GOARCH != "amd64" {
-		t.Skipf("not yet supported on %s/%s", runtime.GOOS, runtime.GOARCH)
+	if !platform.RaceDetectorSupported(runtime.GOOS, runtime.GOARCH) {
+		t.Skipf("skipping on %s/%s because race detector not supported", runtime.GOOS, runtime.GOARCH)
+	}
+	if runtime.GOOS == "windows" {
+		t.Skipf("skipping: test requires pthread support")
+		// TODO: Can this test be rewritten to use the C11 thread API instead?
 	}
 
 	testenv.MustHaveGoRun(t)
@@ -395,10 +403,18 @@
 }
 
 func TestRaceSignal(t *testing.T) {
-	t.Parallel()
-	if (runtime.GOOS != "linux" && runtime.GOOS != "freebsd") || runtime.GOARCH != "amd64" {
-		t.Skipf("not yet supported on %s/%s", runtime.GOOS, runtime.GOARCH)
+	if !platform.RaceDetectorSupported(runtime.GOOS, runtime.GOARCH) {
+		t.Skipf("skipping on %s/%s because race detector not supported", runtime.GOOS, runtime.GOARCH)
 	}
+	if runtime.GOOS == "windows" {
+		t.Skipf("skipping: test requires pthread support")
+		// TODO: Can this test be rewritten to use the C11 thread API instead?
+	}
+	if runtime.GOOS == "darwin" || runtime.GOOS == "ios" {
+		testenv.SkipFlaky(t, 60316)
+	}
+
+	t.Parallel()
 
 	testenv.MustHaveGoRun(t)
 
@@ -413,7 +429,7 @@
 		t.Fatal(err)
 	}
 
-	got, err := testenv.CleanCmdEnv(exec.Command(exe, "CgoRaceSignal")).CombinedOutput()
+	got, err := testenv.CleanCmdEnv(testenv.Command(t, exe, "CgoRaceSignal")).CombinedOutput()
 	if err != nil {
 		t.Logf("%s\n", got)
 		t.Fatal(err)
@@ -515,15 +531,27 @@
 		// than injecting a sigpanic.
 		t.Skip("no sigpanic in C on windows")
 	}
+	if runtime.GOOS == "ios" {
+		testenv.SkipFlaky(t, 59912)
+	}
 	t.Parallel()
 	got := runTestProg(t, "testprogcgo", "TracebackSigpanic")
 	t.Log(got)
-	want := "runtime.sigpanic"
+	// We should see the function that calls the C function.
+	want := "main.TracebackSigpanic"
 	if !strings.Contains(got, want) {
+		if runtime.GOOS == "android" && (runtime.GOARCH == "arm" || runtime.GOARCH == "arm64") {
+			testenv.SkipFlaky(t, 58794)
+		}
 		t.Errorf("did not see %q in output", want)
 	}
+	// We shouldn't inject a sigpanic call. (see issue 57698)
+	nowant := "runtime.sigpanic"
+	if strings.Contains(got, nowant) {
+		t.Errorf("unexpectedly saw %q in output", nowant)
+	}
 	// No runtime errors like "runtime: unexpected return pc".
-	nowant := "runtime: "
+	nowant = "runtime: "
 	if strings.Contains(got, nowant) {
 		t.Errorf("unexpectedly saw %q in output", nowant)
 	}
@@ -615,8 +643,16 @@
 		}
 
 		t.Run(test, func(t *testing.T) {
+			if test == "SegvInCgo" && runtime.GOOS == "ios" {
+				testenv.SkipFlaky(t, 59947) // Don't even try, in case it times out.
+			}
+
 			t.Parallel()
-			got := runTestProg(t, "testprogcgo", test)
+			prog := "testprog"
+			if strings.HasSuffix(test, "InCgo") {
+				prog = "testprogcgo"
+			}
+			got := runTestProg(t, prog, test)
 			t.Log(got)
 			want := "SIGSEGV"
 			if !strings.Contains(got, want) {
@@ -628,7 +664,7 @@
 
 			// No runtime errors like "runtime: unknown pc".
 			switch runtime.GOOS {
-			case "darwin", "illumos", "solaris":
+			case "darwin", "ios", "illumos", "solaris":
 				// Runtime sometimes throws when generating the traceback.
 				testenv.SkipFlaky(t, 49182)
 			case "linux":
@@ -768,3 +804,52 @@
 		t.Fatalf("expected %q, but got:\n%s", want, got)
 	}
 }
+
+func TestDestructorCallback(t *testing.T) {
+	t.Parallel()
+	got := runTestProg(t, "testprogcgo", "DestructorCallback")
+	if want := "OK\n"; got != want {
+		t.Errorf("expected %q, but got:\n%s", want, got)
+	}
+}
+
+func TestDestructorCallbackRace(t *testing.T) {
+	// This test requires building with -race,
+	// so it's somewhat slow.
+	if testing.Short() {
+		t.Skip("skipping test in -short mode")
+	}
+
+	if !platform.RaceDetectorSupported(runtime.GOOS, runtime.GOARCH) {
+		t.Skipf("skipping on %s/%s because race detector not supported", runtime.GOOS, runtime.GOARCH)
+	}
+
+	t.Parallel()
+
+	exe, err := buildTestProg(t, "testprogcgo", "-race")
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	got, err := testenv.CleanCmdEnv(exec.Command(exe, "DestructorCallback")).CombinedOutput()
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	if want := "OK\n"; string(got) != want {
+		t.Errorf("expected %q, but got:\n%s", want, got)
+	}
+}
+
+func TestEnsureBindM(t *testing.T) {
+	t.Parallel()
+	switch runtime.GOOS {
+	case "windows", "plan9":
+		t.Skipf("skipping bindm test on %s", runtime.GOOS)
+	}
+	got := runTestProg(t, "testprogcgo", "EnsureBindM")
+	want := "OK\n"
+	if got != want {
+		t.Errorf("expected %q, got %v", want, got)
+	}
+}
diff --git a/src/runtime/crash_test.go b/src/runtime/crash_test.go
index 309777d..8f11333 100644
--- a/src/runtime/crash_test.go
+++ b/src/runtime/crash_test.go
@@ -49,6 +49,7 @@
 	}
 
 	testenv.MustHaveGoBuild(t)
+	t.Helper()
 
 	exe, err := buildTestProg(t, binary)
 	if err != nil {
@@ -135,13 +136,15 @@
 
 		exe := filepath.Join(dir, name+".exe")
 
-		t.Logf("running go build -o %s %s", exe, strings.Join(flags, " "))
+		start := time.Now()
 		cmd := exec.Command(testenv.GoToolPath(t), append([]string{"build", "-o", exe}, flags...)...)
+		t.Logf("running %v", cmd)
 		cmd.Dir = "testdata/" + binary
 		out, err := testenv.CleanCmdEnv(cmd).CombinedOutput()
 		if err != nil {
 			target.err = fmt.Errorf("building %s %v: %v\n%s", binary, flags, err, out)
 		} else {
+			t.Logf("built %v in %v", name, time.Since(start))
 			target.exe = exe
 			target.err = nil
 		}
@@ -181,7 +184,7 @@
 
 func testDeadlock(t *testing.T, name string) {
 	// External linking brings in cgo, causing deadlock detection not working.
-	testenv.MustInternalLink(t)
+	testenv.MustInternalLink(t, false)
 
 	output := runTestProg(t, "testprog", name)
 	want := "fatal error: all goroutines are asleep - deadlock!\n"
@@ -208,7 +211,7 @@
 
 func TestGoexitDeadlock(t *testing.T) {
 	// External linking brings in cgo, causing deadlock detection not working.
-	testenv.MustInternalLink(t)
+	testenv.MustInternalLink(t, false)
 
 	output := runTestProg(t, "testprog", "GoexitDeadlock")
 	want := "no goroutines (main called runtime.Goexit) - deadlock!"
@@ -308,7 +311,7 @@
 
 func TestGoexitCrash(t *testing.T) {
 	// External linking brings in cgo, causing deadlock detection not working.
-	testenv.MustInternalLink(t)
+	testenv.MustInternalLink(t, false)
 
 	output := runTestProg(t, "testprog", "GoexitExit")
 	want := "no goroutines (main called runtime.Goexit) - deadlock!"
@@ -369,7 +372,7 @@
 
 func TestGoexitInPanic(t *testing.T) {
 	// External linking brings in cgo, causing deadlock detection not working.
-	testenv.MustInternalLink(t)
+	testenv.MustInternalLink(t, false)
 
 	// see issue 8774: this code used to trigger an infinite recursion
 	output := runTestProg(t, "testprog", "GoexitInPanic")
@@ -436,7 +439,7 @@
 
 func TestRecoveredPanicAfterGoexit(t *testing.T) {
 	// External linking brings in cgo, causing deadlock detection not working.
-	testenv.MustInternalLink(t)
+	testenv.MustInternalLink(t, false)
 
 	output := runTestProg(t, "testprog", "RecoveredPanicAfterGoexit")
 	want := "fatal error: no goroutines (main called runtime.Goexit) - deadlock!"
@@ -447,7 +450,7 @@
 
 func TestRecoverBeforePanicAfterGoexit(t *testing.T) {
 	// External linking brings in cgo, causing deadlock detection not working.
-	testenv.MustInternalLink(t)
+	testenv.MustInternalLink(t, false)
 
 	t.Parallel()
 	output := runTestProg(t, "testprog", "RecoverBeforePanicAfterGoexit")
@@ -459,7 +462,7 @@
 
 func TestRecoverBeforePanicAfterGoexit2(t *testing.T) {
 	// External linking brings in cgo, causing deadlock detection not working.
-	testenv.MustInternalLink(t)
+	testenv.MustInternalLink(t, false)
 
 	t.Parallel()
 	output := runTestProg(t, "testprog", "RecoverBeforePanicAfterGoexit2")
@@ -531,7 +534,7 @@
 
 	got, err := testenv.CleanCmdEnv(exec.Command(exe, "MemProf")).CombinedOutput()
 	if err != nil {
-		t.Fatal(err)
+		t.Fatalf("testprog failed: %s, output:\n%s", err, got)
 	}
 	fn := strings.TrimSpace(string(got))
 	defer os.Remove(fn)
@@ -779,7 +782,7 @@
 	testenv.MustHaveExec(t)
 
 	switch runtime.GOOS {
-	case "darwin", "dragonfly", "freebsd", "linux", "netbsd", "openbsd", "android":
+	case "android", "darwin", "dragonfly", "freebsd", "ios", "linux", "netbsd", "openbsd":
 		t.Skipf("g0 stack is wrong on pthread platforms (see golang.org/issue/26061)")
 	}
 
diff --git a/src/runtime/crash_unix_test.go b/src/runtime/crash_unix_test.go
index 29d9c47..6bca2ac 100644
--- a/src/runtime/crash_unix_test.go
+++ b/src/runtime/crash_unix_test.go
@@ -14,6 +14,7 @@
 	"os/exec"
 	"runtime"
 	"runtime/debug"
+	"strings"
 	"sync"
 	"syscall"
 	"testing"
@@ -75,12 +76,20 @@
 
 	testenv.MustHaveGoBuild(t)
 
+	if strings.Contains(os.Getenv("GOFLAGS"), "mayMoreStackPreempt") {
+		// This test occasionally times out in this debug mode. This is probably
+		// revealing a real bug in the scheduler, but since it seems to only
+		// affect this test and this is itself a test of a debug mode, it's not
+		// a high priority.
+		testenv.SkipFlaky(t, 55160)
+	}
+
 	exe, err := buildTestProg(t, "testprog")
 	if err != nil {
 		t.Fatal(err)
 	}
 
-	cmd := exec.Command(exe, "CrashDumpsAllThreads")
+	cmd := testenv.Command(t, exe, "CrashDumpsAllThreads")
 	cmd = testenv.CleanCmdEnv(cmd)
 	cmd.Env = append(cmd.Env,
 		"GOTRACEBACK=crash",
@@ -198,10 +207,12 @@
 
 	// Traceback should have two testPanicSystemstackInternal's
 	// and two blockOnSystemStackInternal's.
-	if bytes.Count(tb, []byte("testPanicSystemstackInternal")) != 2 {
-		t.Fatal("traceback missing user stack:\n", string(tb))
-	} else if bytes.Count(tb, []byte("blockOnSystemStackInternal")) != 2 {
-		t.Fatal("traceback missing system stack:\n", string(tb))
+	userFunc := "testPanicSystemstackInternal"
+	sysFunc := "blockOnSystemStackInternal"
+	nUser := bytes.Count(tb, []byte(userFunc))
+	nSys := bytes.Count(tb, []byte(sysFunc))
+	if nUser != 2 || nSys != 2 {
+		t.Fatalf("want %d user stack frames in %s and %d system stack frames in %s, got %d and %d:\n%s", 2, userFunc, 2, sysFunc, nUser, nSys, string(tb))
 	}
 }
 
diff --git a/src/runtime/debug.go b/src/runtime/debug.go
index 669c36f..9a92b45 100644
--- a/src/runtime/debug.go
+++ b/src/runtime/debug.go
@@ -25,7 +25,7 @@
 		return ret
 	}
 
-	stopTheWorldGC("GOMAXPROCS")
+	stopTheWorldGC(stwGOMAXPROCS)
 
 	// newprocs will be processed by startTheWorld
 	newprocs = int32(n)
diff --git a/src/runtime/debug/garbage_test.go b/src/runtime/debug/garbage_test.go
index 7213bbe..cd91782 100644
--- a/src/runtime/debug/garbage_test.go
+++ b/src/runtime/debug/garbage_test.go
@@ -146,7 +146,7 @@
 		return
 	}
 	if after.HeapReleased-before.HeapReleased < bigBytes-slack {
-		t.Fatalf("less than %d released: %d -> %d", bigBytes, before.HeapReleased, after.HeapReleased)
+		t.Fatalf("less than %d released: %d -> %d", bigBytes-slack, before.HeapReleased, after.HeapReleased)
 	}
 }
 
diff --git a/src/runtime/debug/mod.go b/src/runtime/debug/mod.go
index 8b7a423..7f85174 100644
--- a/src/runtime/debug/mod.go
+++ b/src/runtime/debug/mod.go
@@ -78,7 +78,7 @@
 //   - CGO_CXXFLAGS:  the effective CGO_CPPFLAGS environment variable
 //   - CGO_LDFLAGS: the effective CGO_CPPFLAGS environment variable
 //   - GOARCH: the architecture target
-//   - GOAMD64/GOARM64/GO386/etc: the architecture feature level for GOARCH
+//   - GOAMD64/GOARM/GO386/etc: the architecture feature level for GOARCH
 //   - GOOS: the operating system target
 //   - vcs: the version control system for the source tree where the build ran
 //   - vcs.revision: the revision identifier for the current commit or checkout
diff --git a/src/runtime/debug/testdata/fuzz/FuzzParseBuildInfoRoundTrip/5501685e611fa764 b/src/runtime/debug/testdata/fuzz/FuzzParseBuildInfoRoundTrip/5501685e611fa764
new file mode 100644
index 0000000..4ab5d92
--- /dev/null
+++ b/src/runtime/debug/testdata/fuzz/FuzzParseBuildInfoRoundTrip/5501685e611fa764
@@ -0,0 +1,2 @@
+go test fuzz v1
+string("mod\t\t0\n")
diff --git a/src/runtime/debug/testdata/fuzz/FuzzParseBuildInfoRoundTrip/71634114e78567cf b/src/runtime/debug/testdata/fuzz/FuzzParseBuildInfoRoundTrip/71634114e78567cf
new file mode 100644
index 0000000..741c4df
--- /dev/null
+++ b/src/runtime/debug/testdata/fuzz/FuzzParseBuildInfoRoundTrip/71634114e78567cf
@@ -0,0 +1,2 @@
+go test fuzz v1
+string("mod\t0\t\n")
diff --git a/src/runtime/debug/testdata/fuzz/FuzzParseBuildInfoRoundTrip/c73dce23c1f2494c b/src/runtime/debug/testdata/fuzz/FuzzParseBuildInfoRoundTrip/c73dce23c1f2494c
new file mode 100644
index 0000000..60f9338
--- /dev/null
+++ b/src/runtime/debug/testdata/fuzz/FuzzParseBuildInfoRoundTrip/c73dce23c1f2494c
@@ -0,0 +1,2 @@
+go test fuzz v1
+string("build\t0=\" 0\"\n")
diff --git a/src/runtime/debugcall.go b/src/runtime/debugcall.go
index a4393b1..e793545 100644
--- a/src/runtime/debugcall.go
+++ b/src/runtime/debugcall.go
@@ -6,7 +6,10 @@
 
 package runtime
 
-import "unsafe"
+import (
+	"internal/abi"
+	"unsafe"
+)
 
 const (
 	debugCallSystemStack = "executing on Go runtime stack"
@@ -80,8 +83,8 @@
 		if pc != f.entry() {
 			pc--
 		}
-		up := pcdatavalue(f, _PCDATA_UnsafePoint, pc, nil)
-		if up != _PCDATA_UnsafePointSafe {
+		up := pcdatavalue(f, abi.PCDATA_UnsafePoint, pc, nil)
+		if up != abi.UnsafePointSafe {
 			// Not at a safe point.
 			ret = debugCallUnsafePoint
 		}
@@ -99,11 +102,18 @@
 //
 //go:nosplit
 func debugCallWrap(dispatch uintptr) {
-	var lockedm bool
 	var lockedExt uint32
 	callerpc := getcallerpc()
 	gp := getg()
 
+	// Lock ourselves to the OS thread.
+	//
+	// Debuggers rely on us running on the same thread until we get to
+	// dispatch the function they asked as to.
+	//
+	// We're going to transfer this to the new G we just created.
+	lockOSThread()
+
 	// Create a new goroutine to execute the call on. Run this on
 	// the system stack to avoid growing our stack.
 	systemstack(func() {
@@ -118,27 +128,22 @@
 		}
 		newg.param = unsafe.Pointer(args)
 
-		// If the current G is locked, then transfer that
-		// locked-ness to the new goroutine.
-		if gp.lockedm != 0 {
-			// Save lock state to restore later.
-			mp := gp.m
-			if mp != gp.lockedm.ptr() {
-				throw("inconsistent lockedm")
-			}
-
-			lockedm = true
-			lockedExt = mp.lockedExt
-
-			// Transfer external lock count to internal so
-			// it can't be unlocked from the debug call.
-			mp.lockedInt++
-			mp.lockedExt = 0
-
-			mp.lockedg.set(newg)
-			newg.lockedm.set(mp)
-			gp.lockedm = 0
+		// Transfer locked-ness to the new goroutine.
+		// Save lock state to restore later.
+		mp := gp.m
+		if mp != gp.lockedm.ptr() {
+			throw("inconsistent lockedm")
 		}
+		// Save the external lock count and clear it so
+		// that it can't be unlocked from the debug call.
+		// Note: we already locked internally to the thread,
+		// so if we were locked before we're still locked now.
+		lockedExt = mp.lockedExt
+		mp.lockedExt = 0
+
+		mp.lockedg.set(newg)
+		newg.lockedm.set(mp)
+		gp.lockedm = 0
 
 		// Mark the calling goroutine as being at an async
 		// safe-point, since it has a few conservative frames
@@ -158,8 +163,8 @@
 		gp.schedlink = 0
 
 		// Park the calling goroutine.
-		if trace.enabled {
-			traceGoPark(traceEvGoBlock, 1)
+		if traceEnabled() {
+			traceGoPark(traceBlockDebugCall, 1)
 		}
 		casGToWaiting(gp, _Grunning, waitReasonDebugCall)
 		dropg()
@@ -174,13 +179,13 @@
 	// We'll resume here when the call returns.
 
 	// Restore locked state.
-	if lockedm {
-		mp := gp.m
-		mp.lockedExt = lockedExt
-		mp.lockedInt--
-		mp.lockedg.set(gp)
-		gp.lockedm.set(mp)
-	}
+	mp := gp.m
+	mp.lockedExt = lockedExt
+	mp.lockedg.set(gp)
+	gp.lockedm.set(mp)
+
+	// Undo the lockOSThread we did earlier.
+	unlockOSThread()
 
 	gp.asyncSafePoint = false
 }
@@ -217,7 +222,7 @@
 		// Switch back to the calling goroutine. At some point
 		// the scheduler will schedule us again and we'll
 		// finish exiting.
-		if trace.enabled {
+		if traceEnabled() {
 			traceGoSched()
 		}
 		casgstatus(gp, _Grunning, _Grunnable)
@@ -226,7 +231,7 @@
 		globrunqput(gp)
 		unlock(&sched.lock)
 
-		if trace.enabled {
+		if traceEnabled() {
 			traceGoUnpark(callingG, 0)
 		}
 		casgstatus(callingG, _Gwaiting, _Grunnable)
diff --git a/src/runtime/debuglog.go b/src/runtime/debuglog.go
index b18774e..873f1b4 100644
--- a/src/runtime/debuglog.go
+++ b/src/runtime/debuglog.go
@@ -277,7 +277,7 @@
 		l.w.uvarint(0)
 	} else {
 		v := efaceOf(&x)
-		switch v._type.kind & kindMask {
+		switch v._type.Kind_ & kindMask {
 		case kindChan, kindFunc, kindMap, kindPtr, kindUnsafePointer:
 			l.w.uvarint(uint64(uintptr(v.data)))
 		default:
diff --git a/src/runtime/defs1_solaris_amd64.go b/src/runtime/defs1_solaris_amd64.go
index bb53c22..9ebe5bb 100644
--- a/src/runtime/defs1_solaris_amd64.go
+++ b/src/runtime/defs1_solaris_amd64.go
@@ -96,10 +96,6 @@
 	_O_TRUNC    = 0x200
 	_O_CREAT    = 0x100
 	_O_CLOEXEC  = 0x800000
-	_FD_CLOEXEC = 0x1
-	_F_GETFL    = 0x3
-	_F_SETFL    = 0x4
-	_F_SETFD    = 0x2
 
 	_POLLIN  = 0x1
 	_POLLOUT = 0x4
diff --git a/src/runtime/defs_aix.go b/src/runtime/defs_aix.go
index 3895989..2f28e53 100644
--- a/src/runtime/defs_aix.go
+++ b/src/runtime/defs_aix.go
@@ -144,11 +144,9 @@
 	__SC_PAGE_SIZE        = C._SC_PAGE_SIZE
 	__SC_NPROCESSORS_ONLN = C._SC_NPROCESSORS_ONLN
 
-	_F_SETFD    = C.F_SETFD
-	_F_SETFL    = C.F_SETFL
-	_F_GETFD    = C.F_GETFD
-	_F_GETFL    = C.F_GETFL
-	_FD_CLOEXEC = C.FD_CLOEXEC
+	_F_SETFL = C.F_SETFL
+	_F_GETFD = C.F_GETFD
+	_F_GETFL = C.F_GETFL
 )
 
 type sigset C.sigset_t
diff --git a/src/runtime/defs_aix_ppc64.go b/src/runtime/defs_aix_ppc64.go
index 2d25b7c..8e85096 100644
--- a/src/runtime/defs_aix_ppc64.go
+++ b/src/runtime/defs_aix_ppc64.go
@@ -101,11 +101,9 @@
 	__SC_PAGE_SIZE        = 0x30
 	__SC_NPROCESSORS_ONLN = 0x48
 
-	_F_SETFD    = 0x2
-	_F_SETFL    = 0x4
-	_F_GETFD    = 0x1
-	_F_GETFL    = 0x3
-	_FD_CLOEXEC = 0x1
+	_F_SETFL = 0x4
+	_F_GETFD = 0x1
+	_F_GETFL = 0x3
 )
 
 type sigset [4]uint64
diff --git a/src/runtime/defs_darwin.go b/src/runtime/defs_darwin.go
index 89e4253..9c6eeee 100644
--- a/src/runtime/defs_darwin.go
+++ b/src/runtime/defs_darwin.go
@@ -115,10 +115,8 @@
 
 	PTHREAD_CREATE_DETACHED = C.PTHREAD_CREATE_DETACHED
 
-	F_SETFD    = C.F_SETFD
-	F_GETFL    = C.F_GETFL
-	F_SETFL    = C.F_SETFL
-	FD_CLOEXEC = C.FD_CLOEXEC
+	F_GETFL = C.F_GETFL
+	F_SETFL = C.F_SETFL
 
 	O_WRONLY   = C.O_WRONLY
 	O_NONBLOCK = C.O_NONBLOCK
diff --git a/src/runtime/defs_darwin_amd64.go b/src/runtime/defs_darwin_amd64.go
index 84e6f37..fc7de33 100644
--- a/src/runtime/defs_darwin_amd64.go
+++ b/src/runtime/defs_darwin_amd64.go
@@ -94,10 +94,8 @@
 
 	_PTHREAD_CREATE_DETACHED = 0x2
 
-	_F_SETFD    = 0x2
-	_F_GETFL    = 0x3
-	_F_SETFL    = 0x4
-	_FD_CLOEXEC = 0x1
+	_F_GETFL = 0x3
+	_F_SETFL = 0x4
 
 	_O_WRONLY   = 0x1
 	_O_NONBLOCK = 0x4
diff --git a/src/runtime/defs_darwin_arm64.go b/src/runtime/defs_darwin_arm64.go
index 30d7443..e26df02 100644
--- a/src/runtime/defs_darwin_arm64.go
+++ b/src/runtime/defs_darwin_arm64.go
@@ -96,10 +96,8 @@
 
 	_PTHREAD_KEYS_MAX = 512
 
-	_F_SETFD    = 0x2
-	_F_GETFL    = 0x3
-	_F_SETFL    = 0x4
-	_FD_CLOEXEC = 0x1
+	_F_GETFL = 0x3
+	_F_SETFL = 0x4
 
 	_O_WRONLY   = 0x1
 	_O_NONBLOCK = 0x4
diff --git a/src/runtime/defs_linux_386.go b/src/runtime/defs_linux_386.go
index 72339f4..5fef556 100644
--- a/src/runtime/defs_linux_386.go
+++ b/src/runtime/defs_linux_386.go
@@ -23,6 +23,7 @@
 	_MADV_FREE       = 0x8
 	_MADV_HUGEPAGE   = 0xe
 	_MADV_NOHUGEPAGE = 0xf
+	_MADV_COLLAPSE   = 0x19
 
 	_SA_RESTART  = 0x10000000
 	_SA_ONSTACK  = 0x8000000
diff --git a/src/runtime/defs_linux_amd64.go b/src/runtime/defs_linux_amd64.go
index 298f3eb..dce7799 100644
--- a/src/runtime/defs_linux_amd64.go
+++ b/src/runtime/defs_linux_amd64.go
@@ -23,6 +23,7 @@
 	_MADV_FREE       = 0x8
 	_MADV_HUGEPAGE   = 0xe
 	_MADV_NOHUGEPAGE = 0xf
+	_MADV_COLLAPSE   = 0x19
 
 	_SA_RESTART  = 0x10000000
 	_SA_ONSTACK  = 0x8000000
diff --git a/src/runtime/defs_linux_arm.go b/src/runtime/defs_linux_arm.go
index 6fee57d..71cf8c6 100644
--- a/src/runtime/defs_linux_arm.go
+++ b/src/runtime/defs_linux_arm.go
@@ -25,6 +25,7 @@
 	_MADV_FREE       = 0x8
 	_MADV_HUGEPAGE   = 0xe
 	_MADV_NOHUGEPAGE = 0xf
+	_MADV_COLLAPSE   = 0x19
 
 	_SA_RESTART     = 0x10000000
 	_SA_ONSTACK     = 0x8000000
diff --git a/src/runtime/defs_linux_arm64.go b/src/runtime/defs_linux_arm64.go
index 0216096..606cd70 100644
--- a/src/runtime/defs_linux_arm64.go
+++ b/src/runtime/defs_linux_arm64.go
@@ -23,6 +23,7 @@
 	_MADV_FREE       = 0x8
 	_MADV_HUGEPAGE   = 0xe
 	_MADV_NOHUGEPAGE = 0xf
+	_MADV_COLLAPSE   = 0x19
 
 	_SA_RESTART  = 0x10000000
 	_SA_ONSTACK  = 0x8000000
diff --git a/src/runtime/defs_linux_loong64.go b/src/runtime/defs_linux_loong64.go
index 6eca18b..692d8c7 100644
--- a/src/runtime/defs_linux_loong64.go
+++ b/src/runtime/defs_linux_loong64.go
@@ -24,6 +24,7 @@
 	_MADV_FREE       = 0x8
 	_MADV_HUGEPAGE   = 0xe
 	_MADV_NOHUGEPAGE = 0xf
+	_MADV_COLLAPSE   = 0x19
 
 	_SA_RESTART  = 0x10000000
 	_SA_ONSTACK  = 0x8000000
diff --git a/src/runtime/defs_linux_mips64x.go b/src/runtime/defs_linux_mips64x.go
index 2e8c405..8a0af41 100644
--- a/src/runtime/defs_linux_mips64x.go
+++ b/src/runtime/defs_linux_mips64x.go
@@ -26,6 +26,7 @@
 	_MADV_FREE       = 0x8
 	_MADV_HUGEPAGE   = 0xe
 	_MADV_NOHUGEPAGE = 0xf
+	_MADV_COLLAPSE   = 0x19
 
 	_SA_RESTART = 0x10000000
 	_SA_ONSTACK = 0x8000000
diff --git a/src/runtime/defs_linux_mipsx.go b/src/runtime/defs_linux_mipsx.go
index 7593600..8322bea 100644
--- a/src/runtime/defs_linux_mipsx.go
+++ b/src/runtime/defs_linux_mipsx.go
@@ -26,6 +26,7 @@
 	_MADV_FREE       = 0x8
 	_MADV_HUGEPAGE   = 0xe
 	_MADV_NOHUGEPAGE = 0xf
+	_MADV_COLLAPSE   = 0x19
 
 	_SA_RESTART = 0x10000000
 	_SA_ONSTACK = 0x8000000
diff --git a/src/runtime/defs_linux_ppc64.go b/src/runtime/defs_linux_ppc64.go
index bb3ac01..f87924a 100644
--- a/src/runtime/defs_linux_ppc64.go
+++ b/src/runtime/defs_linux_ppc64.go
@@ -23,6 +23,7 @@
 	_MADV_FREE       = 0x8
 	_MADV_HUGEPAGE   = 0xe
 	_MADV_NOHUGEPAGE = 0xf
+	_MADV_COLLAPSE   = 0x19
 
 	_SA_RESTART = 0x10000000
 	_SA_ONSTACK = 0x8000000
diff --git a/src/runtime/defs_linux_ppc64le.go b/src/runtime/defs_linux_ppc64le.go
index bb3ac01..f87924a 100644
--- a/src/runtime/defs_linux_ppc64le.go
+++ b/src/runtime/defs_linux_ppc64le.go
@@ -23,6 +23,7 @@
 	_MADV_FREE       = 0x8
 	_MADV_HUGEPAGE   = 0xe
 	_MADV_NOHUGEPAGE = 0xf
+	_MADV_COLLAPSE   = 0x19
 
 	_SA_RESTART = 0x10000000
 	_SA_ONSTACK = 0x8000000
diff --git a/src/runtime/defs_linux_riscv64.go b/src/runtime/defs_linux_riscv64.go
index ce4a7f3..29b1ef2 100644
--- a/src/runtime/defs_linux_riscv64.go
+++ b/src/runtime/defs_linux_riscv64.go
@@ -24,6 +24,7 @@
 	_MADV_FREE       = 0x8
 	_MADV_HUGEPAGE   = 0xe
 	_MADV_NOHUGEPAGE = 0xf
+	_MADV_COLLAPSE   = 0x19
 
 	_SA_RESTART  = 0x10000000
 	_SA_ONSTACK  = 0x8000000
diff --git a/src/runtime/defs_linux_s390x.go b/src/runtime/defs_linux_s390x.go
index 36497dd..b028021 100644
--- a/src/runtime/defs_linux_s390x.go
+++ b/src/runtime/defs_linux_s390x.go
@@ -24,6 +24,7 @@
 	_MADV_FREE       = 0x8
 	_MADV_HUGEPAGE   = 0xe
 	_MADV_NOHUGEPAGE = 0xf
+	_MADV_COLLAPSE   = 0x19
 
 	_SA_RESTART = 0x10000000
 	_SA_ONSTACK = 0x8000000
diff --git a/src/runtime/defs_openbsd.go b/src/runtime/defs_openbsd.go
index 4161e21..2ca6a88 100644
--- a/src/runtime/defs_openbsd.go
+++ b/src/runtime/defs_openbsd.go
@@ -57,10 +57,8 @@
 
 	PTHREAD_CREATE_DETACHED = C.PTHREAD_CREATE_DETACHED
 
-	F_SETFD    = C.F_SETFD
-	F_GETFL    = C.F_GETFL
-	F_SETFL    = C.F_SETFL
-	FD_CLOEXEC = C.FD_CLOEXEC
+	F_GETFL = C.F_GETFL
+	F_SETFL = C.F_SETFL
 
 	SIGHUP    = C.SIGHUP
 	SIGINT    = C.SIGINT
diff --git a/src/runtime/defs_openbsd_386.go b/src/runtime/defs_openbsd_386.go
index 25524c5..fde8af5 100644
--- a/src/runtime/defs_openbsd_386.go
+++ b/src/runtime/defs_openbsd_386.go
@@ -35,11 +35,6 @@
 
 	_PTHREAD_CREATE_DETACHED = 0x1
 
-	_F_SETFD    = 0x2
-	_F_GETFL    = 0x3
-	_F_SETFL    = 0x4
-	_FD_CLOEXEC = 0x1
-
 	_SIGHUP    = 0x1
 	_SIGINT    = 0x2
 	_SIGQUIT   = 0x3
diff --git a/src/runtime/defs_openbsd_amd64.go b/src/runtime/defs_openbsd_amd64.go
index a31d03b..0f29d0c 100644
--- a/src/runtime/defs_openbsd_amd64.go
+++ b/src/runtime/defs_openbsd_amd64.go
@@ -35,11 +35,6 @@
 
 	_PTHREAD_CREATE_DETACHED = 0x1
 
-	_F_SETFD    = 0x2
-	_F_GETFL    = 0x3
-	_F_SETFL    = 0x4
-	_FD_CLOEXEC = 0x1
-
 	_SIGHUP    = 0x1
 	_SIGINT    = 0x2
 	_SIGQUIT   = 0x3
diff --git a/src/runtime/defs_openbsd_arm.go b/src/runtime/defs_openbsd_arm.go
index 1d1767b..b56f3b4 100644
--- a/src/runtime/defs_openbsd_arm.go
+++ b/src/runtime/defs_openbsd_arm.go
@@ -35,11 +35,6 @@
 
 	_PTHREAD_CREATE_DETACHED = 0x1
 
-	_F_SETFD    = 0x2
-	_F_GETFL    = 0x3
-	_F_SETFL    = 0x4
-	_FD_CLOEXEC = 0x1
-
 	_SIGHUP    = 0x1
 	_SIGINT    = 0x2
 	_SIGQUIT   = 0x3
diff --git a/src/runtime/defs_openbsd_arm64.go b/src/runtime/defs_openbsd_arm64.go
index 745d0d3..0a9acc0 100644
--- a/src/runtime/defs_openbsd_arm64.go
+++ b/src/runtime/defs_openbsd_arm64.go
@@ -36,11 +36,6 @@
 
 	_PTHREAD_CREATE_DETACHED = 0x1
 
-	_F_SETFD    = 0x2
-	_F_GETFL    = 0x3
-	_F_SETFL    = 0x4
-	_FD_CLOEXEC = 0x1
-
 	_SIGHUP    = 0x1
 	_SIGINT    = 0x2
 	_SIGQUIT   = 0x3
diff --git a/src/runtime/defs_solaris.go b/src/runtime/defs_solaris.go
index 406304d..11708ee 100644
--- a/src/runtime/defs_solaris.go
+++ b/src/runtime/defs_solaris.go
@@ -125,10 +125,8 @@
 	O_CREAT    = C.O_CREAT
 	O_TRUNC    = C.O_TRUNC
 	O_CLOEXEC  = C.O_CLOEXEC
-	FD_CLOEXEC = C.FD_CLOEXEC
 	F_GETFL    = C.F_GETFL
 	F_SETFL    = C.F_SETFL
-	F_SETFD    = C.F_SETFD
 
 	POLLIN  = C.POLLIN
 	POLLOUT = C.POLLOUT
diff --git a/src/runtime/defs_windows.go b/src/runtime/defs_windows.go
index 8d4e381..56698fa 100644
--- a/src/runtime/defs_windows.go
+++ b/src/runtime/defs_windows.go
@@ -27,6 +27,7 @@
 	_CTRL_SHUTDOWN_EVENT = 0x6
 
 	_EXCEPTION_ACCESS_VIOLATION     = 0xc0000005
+	_EXCEPTION_IN_PAGE_ERROR        = 0xc0000006
 	_EXCEPTION_BREAKPOINT           = 0x80000003
 	_EXCEPTION_ILLEGAL_INSTRUCTION  = 0xc000001d
 	_EXCEPTION_FLT_DENORMAL_OPERAND = 0xc000008d
@@ -57,11 +58,16 @@
 	wprocessorrevision          uint16
 }
 
+type exceptionpointers struct {
+	record  *exceptionrecord
+	context *context
+}
+
 type exceptionrecord struct {
 	exceptioncode        uint32
 	exceptionflags       uint32
 	exceptionrecord      *exceptionrecord
-	exceptionaddress     *byte
+	exceptionaddress     uintptr
 	numberparameters     uint32
 	exceptioninformation [15]uintptr
 }
diff --git a/src/runtime/defs_windows_386.go b/src/runtime/defs_windows_386.go
index 37fe74c..b11b155 100644
--- a/src/runtime/defs_windows_386.go
+++ b/src/runtime/defs_windows_386.go
@@ -56,6 +56,14 @@
 func (c *context) set_ip(x uintptr) { c.eip = uint32(x) }
 func (c *context) set_sp(x uintptr) { c.esp = uint32(x) }
 
+// 386 does not have frame pointer register.
+func (c *context) set_fp(x uintptr) {}
+
+func prepareContextForSigResume(c *context) {
+	c.edx = c.esp
+	c.ecx = c.eip
+}
+
 func dumpregs(r *context) {
 	print("eax     ", hex(r.eax), "\n")
 	print("ebx     ", hex(r.ebx), "\n")
diff --git a/src/runtime/defs_windows_amd64.go b/src/runtime/defs_windows_amd64.go
index ac636a6..20c9c4d 100644
--- a/src/runtime/defs_windows_amd64.go
+++ b/src/runtime/defs_windows_amd64.go
@@ -69,6 +69,12 @@
 
 func (c *context) set_ip(x uintptr) { c.rip = uint64(x) }
 func (c *context) set_sp(x uintptr) { c.rsp = uint64(x) }
+func (c *context) set_fp(x uintptr) { c.rbp = uint64(x) }
+
+func prepareContextForSigResume(c *context) {
+	c.r8 = c.rsp
+	c.r9 = c.rip
+}
 
 func dumpregs(r *context) {
 	print("rax     ", hex(r.rax), "\n")
diff --git a/src/runtime/defs_windows_arm.go b/src/runtime/defs_windows_arm.go
index 370470e..7a18c95 100644
--- a/src/runtime/defs_windows_arm.go
+++ b/src/runtime/defs_windows_arm.go
@@ -58,6 +58,14 @@
 func (c *context) set_sp(x uintptr) { c.spr = uint32(x) }
 func (c *context) set_lr(x uintptr) { c.lrr = uint32(x) }
 
+// arm does not have frame pointer register.
+func (c *context) set_fp(x uintptr) {}
+
+func prepareContextForSigResume(c *context) {
+	c.r0 = c.spr
+	c.r1 = c.pc
+}
+
 func dumpregs(r *context) {
 	print("r0   ", hex(r.r0), "\n")
 	print("r1   ", hex(r.r1), "\n")
diff --git a/src/runtime/defs_windows_arm64.go b/src/runtime/defs_windows_arm64.go
index 9ccce46..ef2efb1 100644
--- a/src/runtime/defs_windows_arm64.go
+++ b/src/runtime/defs_windows_arm64.go
@@ -40,6 +40,12 @@
 func (c *context) set_ip(x uintptr) { c.pc = uint64(x) }
 func (c *context) set_sp(x uintptr) { c.xsp = uint64(x) }
 func (c *context) set_lr(x uintptr) { c.x[30] = uint64(x) }
+func (c *context) set_fp(x uintptr) { c.x[29] = uint64(x) }
+
+func prepareContextForSigResume(c *context) {
+	c.x[0] = c.xsp
+	c.x[1] = c.pc
+}
 
 func dumpregs(r *context) {
 	print("r0   ", hex(r.x[0]), "\n")
diff --git a/src/runtime/duff_amd64.s b/src/runtime/duff_amd64.s
index df010f5..69e9980 100644
--- a/src/runtime/duff_amd64.s
+++ b/src/runtime/duff_amd64.s
@@ -4,7 +4,7 @@
 
 #include "textflag.h"
 
-TEXT runtime·duffzero<ABIInternal>(SB), NOSPLIT, $0-0
+TEXT runtime·duffzero<ABIInternal>(SB), NOSPLIT|NOFRAME, $0-0
 	MOVUPS	X15,(DI)
 	MOVUPS	X15,16(DI)
 	MOVUPS	X15,32(DI)
@@ -103,7 +103,7 @@
 
 	RET
 
-TEXT runtime·duffcopy<ABIInternal>(SB), NOSPLIT, $0-0
+TEXT runtime·duffcopy<ABIInternal>(SB), NOSPLIT|NOFRAME, $0-0
 	MOVUPS	(SI), X0
 	ADDQ	$16, SI
 	MOVUPS	X0, (DI)
diff --git a/src/runtime/error.go b/src/runtime/error.go
index a211fbf..3590ccd 100644
--- a/src/runtime/error.go
+++ b/src/runtime/error.go
@@ -30,18 +30,18 @@
 func (e *TypeAssertionError) Error() string {
 	inter := "interface"
 	if e._interface != nil {
-		inter = e._interface.string()
+		inter = toRType(e._interface).string()
 	}
-	as := e.asserted.string()
+	as := toRType(e.asserted).string()
 	if e.concrete == nil {
 		return "interface conversion: " + inter + " is nil, not " + as
 	}
-	cs := e.concrete.string()
+	cs := toRType(e.concrete).string()
 	if e.missingMethod == "" {
 		msg := "interface conversion: " + inter + " is " + cs + ", not " + as
 		if cs == as {
 			// provide slightly clearer error message
-			if e.concrete.pkgpath() != e.asserted.pkgpath() {
+			if toRType(e.concrete).pkgpath() != toRType(e.asserted).pkgpath() {
 				msg += " (types from different packages)"
 			} else {
 				msg += " (types from different scopes)"
@@ -256,9 +256,9 @@
 
 func printanycustomtype(i any) {
 	eface := efaceOf(&i)
-	typestring := eface._type.string()
+	typestring := toRType(eface._type).string()
 
-	switch eface._type.kind {
+	switch eface._type.Kind_ {
 	case kindString:
 		print(typestring, `("`, *(*string)(eface.data), `")`)
 	case kindBool:
@@ -304,7 +304,7 @@
 // It is called from the generated wrapper code.
 func panicwrap() {
 	pc := getcallerpc()
-	name := funcname(findfunc(pc))
+	name := funcNameForPrint(funcname(findfunc(pc)))
 	// name is something like "main.(*T).F".
 	// We want to extract pkg ("main"), typ ("T"), and meth ("F").
 	// Do it by finding the parens.
diff --git a/src/runtime/exithook.go b/src/runtime/exithook.go
index bb29a94..65b426b 100644
--- a/src/runtime/exithook.go
+++ b/src/runtime/exithook.go
@@ -37,7 +37,7 @@
 // runExitHooks runs any registered exit hook functions (funcs
 // previously registered using runtime.addExitHook). Here 'exitCode'
 // is the status code being passed to os.Exit, or zero if the program
-// is terminating normally without calling os.Exit).
+// is terminating normally without calling os.Exit.
 func runExitHooks(exitCode int) {
 	if exitHooks.runningExitHooks {
 		throw("internal error: exit hook invoked exit")
diff --git a/src/runtime/export_aix_test.go b/src/runtime/export_aix_test.go
index 51df951..4845533 100644
--- a/src/runtime/export_aix_test.go
+++ b/src/runtime/export_aix_test.go
@@ -4,5 +4,4 @@
 
 package runtime
 
-var Fcntl = syscall_fcntl1
 var SetNonblock = setNonblock
diff --git a/src/runtime/export_darwin_test.go b/src/runtime/export_darwin_test.go
index 66e2c02..4845533 100644
--- a/src/runtime/export_darwin_test.go
+++ b/src/runtime/export_darwin_test.go
@@ -4,12 +4,4 @@
 
 package runtime
 
-func Fcntl(fd, cmd, arg uintptr) (uintptr, uintptr) {
-	r := fcntl(int32(fd), int32(cmd), int32(arg))
-	if r < 0 {
-		return ^uintptr(0), uintptr(-r)
-	}
-	return uintptr(r), 0
-}
-
 var SetNonblock = setNonblock
diff --git a/src/runtime/export_debug_test.go b/src/runtime/export_debug_test.go
index 2d8a133..76dc206 100644
--- a/src/runtime/export_debug_test.go
+++ b/src/runtime/export_debug_test.go
@@ -32,19 +32,19 @@
 	}
 
 	f := efaceOf(&fn)
-	if f._type == nil || f._type.kind&kindMask != kindFunc {
+	if f._type == nil || f._type.Kind_&kindMask != kindFunc {
 		return nil, plainError("fn must be a function")
 	}
 	fv := (*funcval)(f.data)
 
 	a := efaceOf(&stackArgs)
-	if a._type != nil && a._type.kind&kindMask != kindPtr {
+	if a._type != nil && a._type.Kind_&kindMask != kindPtr {
 		return nil, plainError("args must be a pointer or nil")
 	}
 	argp := a.data
 	var argSize uintptr
 	if argp != nil {
-		argSize = (*ptrtype)(unsafe.Pointer(a._type)).elem.size
+		argSize = (*ptrtype)(unsafe.Pointer(a._type)).Elem.Size_
 	}
 
 	h := new(debugCallHandler)
diff --git a/src/runtime/export_debuglog_test.go b/src/runtime/export_debuglog_test.go
index c9dfdcb..f12aab0 100644
--- a/src/runtime/export_debuglog_test.go
+++ b/src/runtime/export_debuglog_test.go
@@ -35,7 +35,7 @@
 }
 
 func ResetDebugLog() {
-	stopTheWorld("ResetDebugLog")
+	stopTheWorld(stwForTestResetDebugLog)
 	for l := allDloggers; l != nil; l = l.allLink {
 		l.w.write = 0
 		l.w.tick, l.w.nano = 0, 0
diff --git a/src/runtime/export_linux_test.go b/src/runtime/export_linux_test.go
index a441c0e..426fd1e 100644
--- a/src/runtime/export_linux_test.go
+++ b/src/runtime/export_linux_test.go
@@ -6,14 +6,9 @@
 
 package runtime
 
-import (
-	"runtime/internal/syscall"
-)
-
 const SiginfoMaxSize = _si_max_size
 const SigeventMaxSize = _sigev_max_size
 
-var Closeonexec = syscall.CloseOnExec
 var NewOSProc0 = newosproc0
 var Mincore = mincore
 var Add = add
diff --git a/src/runtime/export_openbsd_test.go b/src/runtime/export_openbsd_test.go
deleted file mode 100644
index ef680dc..0000000
--- a/src/runtime/export_openbsd_test.go
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright 2022 The Go 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:build openbsd && !mips64
-
-package runtime
-
-func Fcntl(fd, cmd, arg uintptr) (uintptr, uintptr) {
-	r := fcntl(int32(fd), int32(cmd), int32(arg))
-	if r < 0 {
-		return ^uintptr(0), uintptr(-r)
-	}
-	return uintptr(r), 0
-}
diff --git a/src/runtime/export_solaris_test.go b/src/runtime/export_solaris_test.go
deleted file mode 100644
index e865c77..0000000
--- a/src/runtime/export_solaris_test.go
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright 2019 The Go Authors. 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
-
-func Fcntl(fd, cmd, arg uintptr) (uintptr, uintptr) {
-	return sysvicall3Err(&libc_fcntl, fd, cmd, arg)
-}
diff --git a/src/runtime/export_test.go b/src/runtime/export_test.go
index e7476e6..f7ce503 100644
--- a/src/runtime/export_test.go
+++ b/src/runtime/export_test.go
@@ -47,6 +47,11 @@
 var Memmove = memmove
 var MemclrNoHeapPointers = memclrNoHeapPointers
 
+var CgoCheckPointer = cgoCheckPointer
+
+const TracebackInnerFrames = tracebackInnerFrames
+const TracebackOuterFrames = tracebackOuterFrames
+
 var LockPartialOrder = lockPartialOrder
 
 type LockRank lockRank
@@ -225,31 +230,126 @@
 
 // For benchmarking.
 
-func BenchSetType(n int, x any) {
-	e := *efaceOf(&x)
+// blockWrapper is a wrapper type that ensures a T is placed within a
+// large object. This is necessary for safely benchmarking things
+// that manipulate the heap bitmap, like heapBitsSetType.
+//
+// More specifically, allocating threads assume they're the sole writers
+// to their span's heap bits, which allows those writes to be non-atomic.
+// The heap bitmap is written byte-wise, so if one tried to call heapBitsSetType
+// on an existing object in a small object span, we might corrupt that
+// span's bitmap with a concurrent byte write to the heap bitmap. Large
+// object spans contain exactly one object, so we can be sure no other P
+// is going to be allocating from it concurrently, hence this wrapper type
+// which ensures we have a T in a large object span.
+type blockWrapper[T any] struct {
+	value T
+	_     [_MaxSmallSize]byte // Ensure we're a large object.
+}
+
+func BenchSetType[T any](n int, resetTimer func()) {
+	x := new(blockWrapper[T])
+
+	// Escape x to ensure it is allocated on the heap, as we are
+	// working on the heap bits here.
+	Escape(x)
+
+	// Grab the type.
+	var i any = *new(T)
+	e := *efaceOf(&i)
 	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
+
+	// Benchmark setting the type bits for just the internal T of the block.
+	benchSetType(n, resetTimer, 1, unsafe.Pointer(&x.value), t)
+}
+
+const maxArrayBlockWrapperLen = 32
+
+// arrayBlockWrapper is like blockWrapper, but the interior value is intended
+// to be used as a backing store for a slice.
+type arrayBlockWrapper[T any] struct {
+	value [maxArrayBlockWrapperLen]T
+	_     [_MaxSmallSize]byte // Ensure we're a large object.
+}
+
+// arrayLargeBlockWrapper is like arrayBlockWrapper, but the interior array
+// accommodates many more elements.
+type arrayLargeBlockWrapper[T any] struct {
+	value [1024]T
+	_     [_MaxSmallSize]byte // Ensure we're a large object.
+}
+
+func BenchSetTypeSlice[T any](n int, resetTimer func(), len int) {
+	// We have two separate cases here because we want to avoid
+	// tests on big types but relatively small slices to avoid generating
+	// an allocation that's really big. This will likely force a GC which will
+	// skew the test results.
+	var y unsafe.Pointer
+	if len <= maxArrayBlockWrapperLen {
+		x := new(arrayBlockWrapper[T])
+		// Escape x to ensure it is allocated on the heap, as we are
+		// working on the heap bits here.
+		Escape(x)
+		y = unsafe.Pointer(&x.value[0])
+	} else {
+		x := new(arrayLargeBlockWrapper[T])
+		Escape(x)
+		y = unsafe.Pointer(&x.value[0])
 	}
+
+	// Grab the type.
+	var i any = *new(T)
+	e := *efaceOf(&i)
+	t := e._type
+
+	// Benchmark setting the type for a slice created from the array
+	// of T within the arrayBlock.
+	benchSetType(n, resetTimer, len, y, t)
+}
+
+// benchSetType is the implementation of the BenchSetType* functions.
+// x must be len consecutive Ts allocated within a large object span (to
+// avoid a race on the heap bitmap).
+//
+// Note: this function cannot be generic. It would get its type from one of
+// its callers (BenchSetType or BenchSetTypeSlice) whose type parameters are
+// set by a call in the runtime_test package. That means this function and its
+// callers will get instantiated in the package that provides the type argument,
+// i.e. runtime_test. However, we call a function on the system stack. In race
+// mode the runtime package is usually left uninstrumented because e.g. g0 has
+// no valid racectx, but if we're instantiated in the runtime_test package,
+// we might accidentally cause runtime code to be incorrectly instrumented.
+func benchSetType(n int, resetTimer func(), len int, x unsafe.Pointer, t *_type) {
+	// Compute the input sizes.
+	size := t.Size() * uintptr(len)
+
+	// Validate this function's invariant.
+	s := spanOfHeap(uintptr(x))
+	if s == nil {
+		panic("no heap span for input")
+	}
+	if s.spanclass.sizeclass() != 0 {
+		panic("span is not a large object span")
+	}
+
+	// Round up the size to the size class to make the benchmark a little more
+	// realistic. However, validate it, to make sure this is safe.
 	allocSize := roundupsize(size)
+	if s.npages*pageSize < allocSize {
+		panic("backing span not large enough for benchmark")
+	}
+
+	// Benchmark heapBitsSetType by calling it in a loop. This is safe because
+	// x is in a large object span.
+	resetTimer()
 	systemstack(func() {
 		for i := 0; i < n; i++ {
-			heapBitsSetType(uintptr(p), allocSize, size, t)
+			heapBitsSetType(uintptr(x), allocSize, size, t)
 		}
 	})
+
+	// Make sure x doesn't get freed, since we're taking a uintptr.
+	KeepAlive(x)
 }
 
 const PtrSize = goarch.PtrSize
@@ -268,7 +368,7 @@
 var ReadUnaligned64 = readUnaligned64
 
 func CountPagesInUse() (pagesInUse, counted uintptr) {
-	stopTheWorld("CountPagesInUse")
+	stopTheWorld(stwForTestCountPagesInUse)
 
 	pagesInUse = uintptr(mheap_.pagesInUse.Load())
 
@@ -311,7 +411,7 @@
 }
 
 func ReadMetricsSlow(memStats *MemStats, samplesp unsafe.Pointer, len, cap int) {
-	stopTheWorld("ReadMetricsSlow")
+	stopTheWorld(stwForTestReadMetricsSlow)
 
 	// Initialize the metrics beforehand because this could
 	// allocate and skew the stats.
@@ -339,7 +439,7 @@
 // ReadMemStatsSlow returns both the runtime-computed MemStats and
 // MemStats accumulated by scanning the heap.
 func ReadMemStatsSlow() (base, slow MemStats) {
-	stopTheWorld("ReadMemStatsSlow")
+	stopTheWorld(stwForTestReadMemStatsSlow)
 
 	// Run on the system stack to avoid stack growth allocation.
 	systemstack(func() {
@@ -420,6 +520,23 @@
 	return
 }
 
+// ShrinkStackAndVerifyFramePointers attempts to shrink the stack of the current goroutine
+// and verifies that unwinding the new stack doesn't crash, even if the old
+// stack has been freed or reused (simulated via poisoning).
+func ShrinkStackAndVerifyFramePointers() {
+	before := stackPoisonCopy
+	defer func() { stackPoisonCopy = before }()
+	stackPoisonCopy = 1
+
+	gp := getg()
+	systemstack(func() {
+		shrinkstack(gp)
+	})
+	// If our new stack contains frame pointers into the old stack, this will
+	// crash because the old stack has been poisoned.
+	FPCallers(make([]uintptr, 1024))
+}
+
 // BlockOnSystemStack switches to the system stack, prints "x\n" to
 // stderr, and blocks in a stack containing
 // "runtime.blockOnSystemStackInternal".
@@ -483,7 +600,9 @@
 func TracebackSystemstack(stk []uintptr, i int) int {
 	if i == 0 {
 		pc, sp := getcallerpc(), getcallersp()
-		return gentraceback(pc, sp, 0, getg(), 0, &stk[0], len(stk), nil, nil, _TraceJumpStack)
+		var u unwinder
+		u.initAt(pc, sp, 0, getg(), unwindJumpStack) // Don't ignore errors, for testing
+		return tracebackPCs(&u, 0, stk)
 	}
 	n := 0
 	systemstack(func() {
@@ -540,6 +659,10 @@
 	return getg()
 }
 
+func Goid() uint64 {
+	return getg().goid
+}
+
 func GIsWaitingOnMutex(gp *G) bool {
 	return readgstatus(gp) == _Gwaiting && gp.waitreason.isMutexWait()
 }
@@ -576,7 +699,7 @@
 	t := *(**maptype)(unsafe.Pointer(&i))
 
 	for x := 0; x < 1<<h.B; x++ {
-		b0 := (*bmap)(add(h.buckets, uintptr(x)*uintptr(t.bucketsize)))
+		b0 := (*bmap)(add(h.buckets, uintptr(x)*uintptr(t.BucketSize)))
 		n := 0
 		for b := b0; b != nil; b = b.overflow(t) {
 			for i := 0; i < bucketCnt; i++ {
@@ -822,7 +945,7 @@
 		// None of the tests need any higher-level locking, so we just
 		// take the lock internally.
 		lock(pp.mheapLock)
-		pp.free(base, npages, true)
+		pp.free(base, npages)
 		unlock(pp.mheapLock)
 	})
 }
@@ -832,7 +955,7 @@
 func (p *PageAlloc) Scavenge(nbytes uintptr) (r uintptr) {
 	pp := (*pageAlloc)(p)
 	systemstack(func() {
-		r = pp.scavenge(nbytes, nil)
+		r = pp.scavenge(nbytes, nil, true)
 	})
 	return
 }
@@ -986,9 +1109,8 @@
 	p := new(pageAlloc)
 
 	// We've got an entry, so initialize the pageAlloc.
-	p.init(new(mutex), testSysStat)
+	p.init(new(mutex), testSysStat, true)
 	lockInit(p.mheapLock, lockRankMheap)
-	p.test = true
 	for i, init := range chunks {
 		addr := chunkBase(chunkIdx(i))
 
@@ -1000,11 +1122,18 @@
 		})
 
 		// Initialize the bitmap and update pageAlloc metadata.
-		chunk := p.chunkOf(chunkIndex(addr))
+		ci := chunkIndex(addr)
+		chunk := p.chunkOf(ci)
 
 		// Clear all the scavenged bits which grow set.
 		chunk.scavenged.clearRange(0, pallocChunkPages)
 
+		// Simulate the allocation and subsequent free of all pages in
+		// the chunk for the scavenge index. This sets the state equivalent
+		// with all pages within the index being free.
+		p.scav.index.alloc(ci, pallocChunkPages)
+		p.scav.index.free(ci, 0, pallocChunkPages)
+
 		// Apply scavenge state if applicable.
 		if scav != nil {
 			if scvg, ok := scav[i]; ok {
@@ -1024,19 +1153,10 @@
 			// it and it's a no-op anyway.
 			if s.N != 0 {
 				chunk.allocRange(s.I, s.N)
-			}
-		}
 
-		// Make sure the scavenge index is updated.
-		//
-		// This is an inefficient way to do it, but it's also the simplest way.
-		minPages := physPageSize / pageSize
-		if minPages < 1 {
-			minPages = 1
-		}
-		_, npages := chunk.findScavengeCandidate(pallocChunkPages-1, minPages, minPages)
-		if npages != 0 {
-			p.scav.index.mark(addr, addr+pallocChunkBytes)
+				// Make sure the scavenge index is updated.
+				p.scav.index.alloc(ci, s.N)
+			}
 		}
 
 		// Update heap metadata for the allocRange calls above.
@@ -1061,8 +1181,6 @@
 		for l := 0; l < summaryLevels; l++ {
 			sysFreeOS(unsafe.Pointer(&p.summary[l][0]), uintptr(cap(p.summary[l]))*pallocSumBytes)
 		}
-		// Only necessary on 64-bit. This is a global on 32-bit.
-		sysFreeOS(unsafe.Pointer(&p.scav.index.chunks[0]), uintptr(cap(p.scav.index.chunks)))
 	} else {
 		resSize := uintptr(0)
 		for _, s := range p.summary {
@@ -1071,6 +1189,9 @@
 		sysFreeOS(unsafe.Pointer(&p.summary[0][0]), alignUp(resSize, physPageSize))
 	}
 
+	// Free extra data structures.
+	sysFreeOS(unsafe.Pointer(&p.scav.index.chunks[0]), uintptr(cap(p.scav.index.chunks))*unsafe.Sizeof(atomicScavChunkData{}))
+
 	// Subtract back out whatever we mapped for the summaries.
 	// sysUsed adds to p.sysStat and memstats.mappedReady no matter what
 	// (and in anger should actually be accounted for), and there's no other
@@ -1164,7 +1285,7 @@
 }
 
 func PageCachePagesLeaked() (leaked uintptr) {
-	stopTheWorld("PageCachePagesLeaked")
+	stopTheWorld(stwForTestPageCachePagesLeaked)
 
 	// Walk over destroyed Ps and look for unflushed caches.
 	deadp := allp[len(allp):cap(allp)]
@@ -1318,10 +1439,11 @@
 const Raceenabled = raceenabled
 
 const (
-	GCBackgroundUtilization     = gcBackgroundUtilization
-	GCGoalUtilization           = gcGoalUtilization
-	DefaultHeapMinimum          = defaultHeapMinimum
-	MemoryLimitHeapGoalHeadroom = memoryLimitHeapGoalHeadroom
+	GCBackgroundUtilization            = gcBackgroundUtilization
+	GCGoalUtilization                  = gcGoalUtilization
+	DefaultHeapMinimum                 = defaultHeapMinimum
+	MemoryLimitHeapGoalHeadroomPercent = memoryLimitHeapGoalHeadroomPercent
+	MemoryLimitMinHeapGoalHeadroom     = memoryLimitMinHeapGoalHeadroom
 )
 
 type GCController struct {
@@ -1620,23 +1742,97 @@
 
 func NewScavengeIndex(min, max ChunkIdx) *ScavengeIndex {
 	s := new(ScavengeIndex)
-	s.i.chunks = make([]atomic.Uint8, uintptr(1<<heapAddrBits/pallocChunkBytes/8))
-	s.i.min.Store(int32(min / 8))
-	s.i.max.Store(int32(max / 8))
+	// This is a bit lazy but we easily guarantee we'll be able
+	// to reference all the relevant chunks. The worst-case
+	// memory usage here is 512 MiB, but tests generally use
+	// small offsets from BaseChunkIdx, which results in ~100s
+	// of KiB in memory use.
+	//
+	// This may still be worth making better, at least by sharing
+	// this fairly large array across calls with a sync.Pool or
+	// something. Currently, when the tests are run serially,
+	// it takes around 0.5s. Not all that much, but if we have
+	// a lot of tests like this it could add up.
+	s.i.chunks = make([]atomicScavChunkData, max)
+	s.i.min.Store(uintptr(min))
+	s.i.max.Store(uintptr(max))
+	s.i.minHeapIdx.Store(uintptr(min))
+	s.i.test = true
 	return s
 }
 
-func (s *ScavengeIndex) Find() (ChunkIdx, uint) {
-	ci, off := s.i.find()
+func (s *ScavengeIndex) Find(force bool) (ChunkIdx, uint) {
+	ci, off := s.i.find(force)
 	return ChunkIdx(ci), off
 }
 
-func (s *ScavengeIndex) Mark(base, limit uintptr) {
-	s.i.mark(base, limit)
+func (s *ScavengeIndex) AllocRange(base, limit uintptr) {
+	sc, ec := chunkIndex(base), chunkIndex(limit-1)
+	si, ei := chunkPageIndex(base), chunkPageIndex(limit-1)
+
+	if sc == ec {
+		// The range doesn't cross any chunk boundaries.
+		s.i.alloc(sc, ei+1-si)
+	} else {
+		// The range crosses at least one chunk boundary.
+		s.i.alloc(sc, pallocChunkPages-si)
+		for c := sc + 1; c < ec; c++ {
+			s.i.alloc(c, pallocChunkPages)
+		}
+		s.i.alloc(ec, ei+1)
+	}
 }
 
-func (s *ScavengeIndex) Clear(ci ChunkIdx) {
-	s.i.clear(chunkIdx(ci))
+func (s *ScavengeIndex) FreeRange(base, limit uintptr) {
+	sc, ec := chunkIndex(base), chunkIndex(limit-1)
+	si, ei := chunkPageIndex(base), chunkPageIndex(limit-1)
+
+	if sc == ec {
+		// The range doesn't cross any chunk boundaries.
+		s.i.free(sc, si, ei+1-si)
+	} else {
+		// The range crosses at least one chunk boundary.
+		s.i.free(sc, si, pallocChunkPages-si)
+		for c := sc + 1; c < ec; c++ {
+			s.i.free(c, 0, pallocChunkPages)
+		}
+		s.i.free(ec, 0, ei+1)
+	}
+}
+
+func (s *ScavengeIndex) ResetSearchAddrs() {
+	for _, a := range []*atomicOffAddr{&s.i.searchAddrBg, &s.i.searchAddrForce} {
+		addr, marked := a.Load()
+		if marked {
+			a.StoreUnmark(addr, addr)
+		}
+		a.Clear()
+	}
+	s.i.freeHWM = minOffAddr
+}
+
+func (s *ScavengeIndex) NextGen() {
+	s.i.nextGen()
+}
+
+func (s *ScavengeIndex) SetEmpty(ci ChunkIdx) {
+	s.i.setEmpty(chunkIdx(ci))
+}
+
+func (s *ScavengeIndex) SetNoHugePage(ci ChunkIdx) {
+	s.i.setNoHugePage(chunkIdx(ci))
+}
+
+func CheckPackScavChunkData(gen uint32, inUse, lastInUse uint16, flags uint8) bool {
+	sc0 := scavChunkData{
+		gen:            gen,
+		inUse:          inUse,
+		lastInUse:      lastInUse,
+		scavChunkFlags: scavChunkFlags(flags),
+	}
+	scp := sc0.pack()
+	sc1 := unpackScavChunkData(scp)
+	return sc0 == sc1
 }
 
 const GTrackingPeriod = gTrackingPeriod
@@ -1656,10 +1852,10 @@
 func (a *UserArena) New(out *any) {
 	i := efaceOf(out)
 	typ := i._type
-	if typ.kind&kindMask != kindPtr {
+	if typ.Kind_&kindMask != kindPtr {
 		panic("new result of non-ptr type")
 	}
-	typ = (*ptrtype)(unsafe.Pointer(typ)).elem
+	typ = (*ptrtype)(unsafe.Pointer(typ)).Elem
 	i.data = a.arena.new(typ)
 }
 
@@ -1718,3 +1914,23 @@
 func PersistentAlloc(n uintptr) unsafe.Pointer {
 	return persistentalloc(n, 0, &memstats.other_sys)
 }
+
+// FPCallers works like Callers and uses frame pointer unwinding to populate
+// pcBuf with the return addresses of the physical frames on the stack.
+func FPCallers(pcBuf []uintptr) int {
+	return fpTracebackPCs(unsafe.Pointer(getfp()), pcBuf)
+}
+
+const FramePointerEnabled = framepointer_enabled
+
+var (
+	IsPinned      = isPinned
+	GetPinCounter = pinnerGetPinCounter
+)
+
+func SetPinnerLeakPanic(f func()) {
+	pinnerLeakPanic = f
+}
+func GetPinnerLeakPanic() func() {
+	return pinnerLeakPanic
+}
diff --git a/src/runtime/export_unix2_test.go b/src/runtime/export_unix2_test.go
deleted file mode 100644
index 360565f..0000000
--- a/src/runtime/export_unix2_test.go
+++ /dev/null
@@ -1,10 +0,0 @@
-// Copyright 2022 The Go 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:build unix && !linux
-
-package runtime
-
-// for linux close-on-exec implemented in runtime/internal/syscall
-var Closeonexec = closeonexec
diff --git a/src/runtime/export_unix_test.go b/src/runtime/export_unix_test.go
index 71a55d8..56ff771 100644
--- a/src/runtime/export_unix_test.go
+++ b/src/runtime/export_unix_test.go
@@ -9,6 +9,8 @@
 import "unsafe"
 
 var NonblockingPipe = nonblockingPipe
+var Fcntl = fcntl
+var Closeonexec = closeonexec
 
 func sigismember(mask *sigset, i int) bool {
 	clear := *mask
diff --git a/src/runtime/export_windows_test.go b/src/runtime/export_windows_test.go
index d9cf753..cf0db57 100644
--- a/src/runtime/export_windows_test.go
+++ b/src/runtime/export_windows_test.go
@@ -11,7 +11,6 @@
 const MaxArgs = maxArgs
 
 var (
-	TestingWER              = &testingWER
 	OsYield                 = osyield
 	TimeBeginPeriodRetValue = &timeBeginPeriodRetValue
 )
@@ -22,6 +21,23 @@
 	return int32(info.dwnumberofprocessors)
 }
 
-func LoadLibraryExStatus() (useEx, haveEx, haveFlags bool) {
-	return useLoadLibraryEx, _LoadLibraryExW != nil, _AddDllDirectory != nil
+type ContextStub struct {
+	context
+}
+
+func (c ContextStub) GetPC() uintptr {
+	return c.ip()
+}
+
+func NewContextStub() *ContextStub {
+	var ctx context
+	ctx.set_ip(getcallerpc())
+	ctx.set_sp(getcallersp())
+	fp := getfp()
+	// getfp is not implemented on windows/386 and windows/arm,
+	// in which case it returns 0.
+	if fp != 0 {
+		ctx.set_fp(*(*uintptr)(unsafe.Pointer(fp)))
+	}
+	return &ContextStub{ctx}
 }
diff --git a/src/runtime/extern.go b/src/runtime/extern.go
index 6c41c62..26dcf0b 100644
--- a/src/runtime/extern.go
+++ b/src/runtime/extern.go
@@ -51,9 +51,19 @@
 	cgocheck: setting cgocheck=0 disables all checks for packages
 	using cgo to incorrectly pass Go pointers to non-Go code.
 	Setting cgocheck=1 (the default) enables relatively cheap
-	checks that may miss some errors.  Setting cgocheck=2 enables
-	expensive checks that should not miss any errors, but will
-	cause your program to run slower.
+	checks that may miss some errors. A more complete, but slow,
+	cgocheck mode can be enabled using GOEXPERIMENT (which
+	requires a rebuild), see https://pkg.go.dev/internal/goexperiment for details.
+
+	dontfreezetheworld: by default, the start of a fatal panic or throw
+	"freezes the world", preempting all threads to stop all running
+	goroutines, which makes it possible to traceback all goroutines, and
+	keeps their state close to the point of panic. Setting
+	dontfreezetheworld=1 disables this preemption, allowing goroutines to
+	continue executing during panic processing. Note that goroutines that
+	naturally enter the scheduler will still stop. This can be useful when
+	debugging the runtime scheduler, as freezetheworld perturbs scheduler
+	state and thus may hide problems.
 
 	efence: setting efence=1 causes the allocator to run in a mode
 	where each object is allocated on a unique page and addresses are
@@ -77,7 +87,8 @@
 
 	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. The format of this line is subject to change.
+	length of the pause. The format of this line is subject to change. Included in
+	the explanation below is also the relevant runtime/metrics metric for each field.
 	Currently, it is:
 		gc # @#s #%: #+#+# ms clock, #+#/#/#+# ms cpu, #->#-># MB, # MB goal, # MB stacks, #MB globals, # P
 	where the fields are as follows:
@@ -85,11 +96,11 @@
 		@#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
-		# MB stacks  estimated scannable stack size
-		# MB globals scannable global size
-		# P          number of processors used
+		#->#-># MB   heap size at GC start, at GC end, and live heap, or /gc/scan/heap:bytes
+		# MB goal    goal heap size, or /gc/heap/goal:bytes
+		# MB stacks  estimated scannable stack size, or /gc/scan/stack:bytes
+		# MB globals scannable global size, or /gc/scan/globals:bytes
+		# P          number of processors used, or /sched/gomaxprocs:threads
 	The phases are stop-the-world (STW) sweep termination, concurrent
 	mark and scan, and STW mark termination. The CPU times
 	for mark/scan are broken down in to assist time (GC performed in
@@ -149,11 +160,13 @@
 	scavenger as well as the total amount of memory returned to the operating system
 	and an estimate of physical memory utilization. The format of this line is subject
 	to change, but currently it is:
-		scav # KiB work, # KiB total, #% util
+		scav # KiB work (bg), # KiB work (eager), # KiB total, #% util
 	where the fields are as follows:
-		# KiB work   the amount of memory returned to the OS since the last line
-		# KiB total  the total amount of memory returned to the OS
-		#% util      the fraction of all unscavenged memory which is in-use
+		# KiB work (bg)    the amount of memory returned to the OS in the background since
+		                   the last line
+		# KiB work (eager) the amount of memory returned to the OS eagerly since the last line
+		# KiB now          the amount of address space currently returned to the OS
+		#% util            the fraction of all unscavenged heap memory which is in-use
 	If the line ends with "(forced)", then scavenging was forced by a
 	debug.FreeOSMemory() call.
 
@@ -170,6 +183,11 @@
 	IDs will refer to the ID of the goroutine at the time of creation; it's possible for this
 	ID to be reused for another goroutine. Setting N to 0 will report no ancestry information.
 
+	tracefpunwindoff: setting tracefpunwindoff=1 forces the execution tracer to
+	use the runtime's default stack unwinder instead of frame pointer unwinding.
+	This increases tracer overhead, but could be helpful as a workaround or for
+	debugging unexpected regressions caused by frame pointer unwinding.
+
 	asyncpreemptoff: asyncpreemptoff=1 disables signal-based
 	asynchronous goroutine preemption. This makes some loops
 	non-preemptible for long periods, which may delay GC and
@@ -203,6 +221,7 @@
 GOTRACEBACK=crash is like “system” but crashes in an operating system-specific
 manner instead of exiting. For example, on Unix systems, the crash raises
 SIGABRT to trigger a core dump.
+GOTRACEBACK=wer is like “crash” but doesn't disable Windows Error Reporting (WER).
 For historical reasons, the GOTRACEBACK settings 0, 1, and 2 are synonyms for
 none, all, and system, respectively.
 The runtime/debug package's SetTraceback function allows increasing the
@@ -216,6 +235,25 @@
 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.
+
+# Security
+
+On Unix platforms, Go's runtime system behaves slightly differently when a
+binary is setuid/setgid or executed with setuid/setgid-like properties, in order
+to prevent dangerous behaviors. On Linux this is determined by checking for the
+AT_SECURE flag in the auxiliary vector, on the BSDs and Solaris/Illumos it is
+determined by checking the issetugid syscall, and on AIX it is determined by
+checking if the uid/gid match the effective uid/gid.
+
+When the runtime determines the binary is setuid/setgid-like, it does three main
+things:
+  - The standard input/output file descriptors (0, 1, 2) are checked to be open.
+    If any of them are closed, they are opened pointing at /dev/null.
+  - The value of the GOTRACEBACK environment variable is set to 'none'.
+  - When a signal is received that terminates the program, or the program
+    encounters an unrecoverable panic that would otherwise override the value
+    of GOTRACEBACK, the goroutine stack, registers, and other memory related
+    information are omitted.
 */
 package runtime
 
diff --git a/src/runtime/funcdata.h b/src/runtime/funcdata.h
index 2e2bb30..edc0316 100644
--- a/src/runtime/funcdata.h
+++ b/src/runtime/funcdata.h
@@ -6,7 +6,7 @@
 // in Go binaries. It is included by assembly sources, so it must
 // be written using #defines.
 //
-// These must agree with symtab.go and ../cmd/internal/objabi/funcdata.go.
+// These must agree with internal/abi/symtab.go.
 
 #define PCDATA_UnsafePoint 0
 #define PCDATA_StackMapIndex 1
diff --git a/src/runtime/gc_test.go b/src/runtime/gc_test.go
index 0b2c972..bd01e36 100644
--- a/src/runtime/gc_test.go
+++ b/src/runtime/gc_test.go
@@ -308,35 +308,35 @@
 }
 
 func BenchmarkSetTypePtr(b *testing.B) {
-	benchSetType(b, new(*byte))
+	benchSetType[*byte](b)
 }
 
 func BenchmarkSetTypePtr8(b *testing.B) {
-	benchSetType(b, new([8]*byte))
+	benchSetType[[8]*byte](b)
 }
 
 func BenchmarkSetTypePtr16(b *testing.B) {
-	benchSetType(b, new([16]*byte))
+	benchSetType[[16]*byte](b)
 }
 
 func BenchmarkSetTypePtr32(b *testing.B) {
-	benchSetType(b, new([32]*byte))
+	benchSetType[[32]*byte](b)
 }
 
 func BenchmarkSetTypePtr64(b *testing.B) {
-	benchSetType(b, new([64]*byte))
+	benchSetType[[64]*byte](b)
 }
 
 func BenchmarkSetTypePtr126(b *testing.B) {
-	benchSetType(b, new([126]*byte))
+	benchSetType[[126]*byte](b)
 }
 
 func BenchmarkSetTypePtr128(b *testing.B) {
-	benchSetType(b, new([128]*byte))
+	benchSetType[[128]*byte](b)
 }
 
 func BenchmarkSetTypePtrSlice(b *testing.B) {
-	benchSetType(b, make([]*byte, 1<<10))
+	benchSetTypeSlice[*byte](b, 1<<10)
 }
 
 type Node1 struct {
@@ -345,11 +345,11 @@
 }
 
 func BenchmarkSetTypeNode1(b *testing.B) {
-	benchSetType(b, new(Node1))
+	benchSetType[Node1](b)
 }
 
 func BenchmarkSetTypeNode1Slice(b *testing.B) {
-	benchSetType(b, make([]Node1, 32))
+	benchSetTypeSlice[Node1](b, 32)
 }
 
 type Node8 struct {
@@ -358,11 +358,11 @@
 }
 
 func BenchmarkSetTypeNode8(b *testing.B) {
-	benchSetType(b, new(Node8))
+	benchSetType[Node8](b)
 }
 
 func BenchmarkSetTypeNode8Slice(b *testing.B) {
-	benchSetType(b, make([]Node8, 32))
+	benchSetTypeSlice[Node8](b, 32)
 }
 
 type Node64 struct {
@@ -371,11 +371,11 @@
 }
 
 func BenchmarkSetTypeNode64(b *testing.B) {
-	benchSetType(b, new(Node64))
+	benchSetType[Node64](b)
 }
 
 func BenchmarkSetTypeNode64Slice(b *testing.B) {
-	benchSetType(b, make([]Node64, 32))
+	benchSetTypeSlice[Node64](b, 32)
 }
 
 type Node64Dead struct {
@@ -384,11 +384,11 @@
 }
 
 func BenchmarkSetTypeNode64Dead(b *testing.B) {
-	benchSetType(b, new(Node64Dead))
+	benchSetType[Node64Dead](b)
 }
 
 func BenchmarkSetTypeNode64DeadSlice(b *testing.B) {
-	benchSetType(b, make([]Node64Dead, 32))
+	benchSetTypeSlice[Node64Dead](b, 32)
 }
 
 type Node124 struct {
@@ -397,11 +397,11 @@
 }
 
 func BenchmarkSetTypeNode124(b *testing.B) {
-	benchSetType(b, new(Node124))
+	benchSetType[Node124](b)
 }
 
 func BenchmarkSetTypeNode124Slice(b *testing.B) {
-	benchSetType(b, make([]Node124, 32))
+	benchSetTypeSlice[Node124](b, 32)
 }
 
 type Node126 struct {
@@ -410,11 +410,11 @@
 }
 
 func BenchmarkSetTypeNode126(b *testing.B) {
-	benchSetType(b, new(Node126))
+	benchSetType[Node126](b)
 }
 
 func BenchmarkSetTypeNode126Slice(b *testing.B) {
-	benchSetType(b, make([]Node126, 32))
+	benchSetTypeSlice[Node126](b, 32)
 }
 
 type Node128 struct {
@@ -423,11 +423,11 @@
 }
 
 func BenchmarkSetTypeNode128(b *testing.B) {
-	benchSetType(b, new(Node128))
+	benchSetType[Node128](b)
 }
 
 func BenchmarkSetTypeNode128Slice(b *testing.B) {
-	benchSetType(b, make([]Node128, 32))
+	benchSetTypeSlice[Node128](b, 32)
 }
 
 type Node130 struct {
@@ -436,11 +436,11 @@
 }
 
 func BenchmarkSetTypeNode130(b *testing.B) {
-	benchSetType(b, new(Node130))
+	benchSetType[Node130](b)
 }
 
 func BenchmarkSetTypeNode130Slice(b *testing.B) {
-	benchSetType(b, make([]Node130, 32))
+	benchSetTypeSlice[Node130](b, 32)
 }
 
 type Node1024 struct {
@@ -449,24 +449,21 @@
 }
 
 func BenchmarkSetTypeNode1024(b *testing.B) {
-	benchSetType(b, new(Node1024))
+	benchSetType[Node1024](b)
 }
 
 func BenchmarkSetTypeNode1024Slice(b *testing.B) {
-	benchSetType(b, make([]Node1024, 32))
+	benchSetTypeSlice[Node1024](b, 32)
 }
 
-func benchSetType(b *testing.B, x any) {
-	v := reflect.ValueOf(x)
-	t := v.Type()
-	switch t.Kind() {
-	case reflect.Pointer:
-		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 benchSetType[T any](b *testing.B) {
+	b.SetBytes(int64(unsafe.Sizeof(*new(T))))
+	runtime.BenchSetType[T](b.N, b.ResetTimer)
+}
+
+func benchSetTypeSlice[T any](b *testing.B, len int) {
+	b.SetBytes(int64(unsafe.Sizeof(*new(T)) * uintptr(len)))
+	runtime.BenchSetTypeSlice[T](b.N, b.ResetTimer, len)
 }
 
 func BenchmarkAllocation(b *testing.B) {
diff --git a/src/runtime/hash_test.go b/src/runtime/hash_test.go
index d4a2b3f..6562829 100644
--- a/src/runtime/hash_test.go
+++ b/src/runtime/hash_test.go
@@ -513,7 +513,7 @@
 	// find c such that Prob(mean-c*stddev < x < mean+c*stddev)^N > .9999
 	for c = 0.0; math.Pow(math.Erf(c/math.Sqrt(2)), float64(N)) < .9999; c += .1 {
 	}
-	c *= 4.0 // allowed slack - we don't need to be perfectly random
+	c *= 8.0 // allowed slack - we don't need to be perfectly random
 	mean := .5 * REP
 	stddev := .5 * math.Sqrt(REP)
 	low := int(mean - c*stddev)
@@ -775,8 +775,11 @@
 				a[j] = byte(n >> 8)
 				m[uint16(BytesHash(a[:], 0))] = struct{}{}
 			}
-			if len(m) <= 1<<15 {
-				t.Errorf("too many collisions i=%d j=%d outputs=%d out of 65536\n", i, j, len(m))
+			// N balls in N bins, for N=65536
+			avg := 41427
+			stdDev := 123
+			if len(m) < avg-40*stdDev || len(m) > avg+40*stdDev {
+				t.Errorf("bad number of collisions i=%d j=%d outputs=%d out of 65536\n", i, j, len(m))
 			}
 		}
 	}
diff --git a/src/runtime/heap_test.go b/src/runtime/heap_test.go
new file mode 100644
index 0000000..4b73ab5
--- /dev/null
+++ b/src/runtime/heap_test.go
@@ -0,0 +1,21 @@
+// Copyright 2023 The Go Authors. 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"
+	_ "unsafe"
+)
+
+//go:linkname heapObjectsCanMove runtime.heapObjectsCanMove
+func heapObjectsCanMove() bool
+
+func TestHeapObjectsCanMove(t *testing.T) {
+	if heapObjectsCanMove() {
+		// If this happens (or this test stops building),
+		// it will break go4.org/unsafe/assume-no-moving-gc.
+		t.Fatalf("heap objects can move!")
+	}
+}
diff --git a/src/runtime/heapdump.go b/src/runtime/heapdump.go
index f57a1a1..8ddec8b 100644
--- a/src/runtime/heapdump.go
+++ b/src/runtime/heapdump.go
@@ -12,13 +12,14 @@
 package runtime
 
 import (
+	"internal/abi"
 	"internal/goarch"
 	"unsafe"
 )
 
 //go:linkname runtime_debug_WriteHeapDump runtime/debug.WriteHeapDump
 func runtime_debug_WriteHeapDump(fd uintptr) {
-	stopTheWorld("write heap dump")
+	stopTheWorld(stwWriteHeapDump)
 
 	// Keep m on this G's stack instead of the system stack.
 	// Both readmemstats_m and writeheapdump_m have pretty large
@@ -167,7 +168,7 @@
 
 	// If we've definitely serialized the type before,
 	// no need to do it again.
-	b := &typecache[t.hash&(typeCacheBuckets-1)]
+	b := &typecache[t.Hash&(typeCacheBuckets-1)]
 	if t == b.t[0] {
 		return
 	}
@@ -192,18 +193,19 @@
 	// dump the type
 	dumpint(tagType)
 	dumpint(uint64(uintptr(unsafe.Pointer(t))))
-	dumpint(uint64(t.size))
-	if x := t.uncommon(); x == nil || t.nameOff(x.pkgpath).name() == "" {
-		dumpstr(t.string())
+	dumpint(uint64(t.Size_))
+	rt := toRType(t)
+	if x := t.Uncommon(); x == nil || rt.nameOff(x.PkgPath).Name() == "" {
+		dumpstr(rt.string())
 	} else {
-		pkgpath := t.nameOff(x.pkgpath).name()
-		name := t.name()
+		pkgpath := rt.nameOff(x.PkgPath).Name()
+		name := rt.name()
 		dumpint(uint64(uintptr(len(pkgpath)) + 1 + uintptr(len(name))))
 		dwrite(unsafe.Pointer(unsafe.StringData(pkgpath)), uintptr(len(pkgpath)))
 		dwritebyte('.')
 		dwrite(unsafe.Pointer(unsafe.StringData(name)), uintptr(len(name)))
 	}
-	dumpbool(t.kind&kindDirectIface == 0 || t.ptrdata != 0)
+	dumpbool(t.Kind_&kindDirectIface == 0 || t.PtrBytes != 0)
 }
 
 // dump an object.
@@ -249,8 +251,7 @@
 	}
 }
 
-func dumpframe(s *stkframe, arg unsafe.Pointer) bool {
-	child := (*childInfo)(arg)
+func dumpframe(s *stkframe, child *childInfo) {
 	f := s.fn
 
 	// Figure out what we can about our stack map
@@ -258,7 +259,7 @@
 	pcdata := int32(-1) // Use the entry map at function entry
 	if pc != f.entry() {
 		pc--
-		pcdata = pcdatavalue(f, _PCDATA_StackMapIndex, pc, nil)
+		pcdata = pcdatavalue(f, abi.PCDATA_StackMapIndex, pc, nil)
 	}
 	if pcdata == -1 {
 		// We do not have a valid pcdata value but there might be a
@@ -266,7 +267,7 @@
 		// at the function prologue, assume so and hope for the best.
 		pcdata = 0
 	}
-	stkmap := (*stackmap)(funcdata(f, _FUNCDATA_LocalsPointerMaps))
+	stkmap := (*stackmap)(funcdata(f, abi.FUNCDATA_LocalsPointerMaps))
 
 	var bv bitvector
 	if stkmap != nil && stkmap.n > 0 {
@@ -327,13 +328,13 @@
 	child.arglen = s.argBytes()
 	child.sp = (*uint8)(unsafe.Pointer(s.sp))
 	child.depth++
-	stkmap = (*stackmap)(funcdata(f, _FUNCDATA_ArgsPointerMaps))
+	stkmap = (*stackmap)(funcdata(f, abi.FUNCDATA_ArgsPointerMaps))
 	if stkmap != nil {
 		child.args = stackmapdata(stkmap, pcdata)
 	} else {
 		child.args.n = -1
 	}
-	return true
+	return
 }
 
 func dumpgoroutine(gp *g) {
@@ -369,7 +370,10 @@
 	child.arglen = 0
 	child.sp = nil
 	child.depth = 0
-	gentraceback(pc, sp, lr, gp, 0, nil, 0x7fffffff, dumpframe, noescape(unsafe.Pointer(&child)), 0)
+	var u unwinder
+	for u.initAt(pc, sp, lr, gp, 0); u.valid(); u.next() {
+		dumpframe(&u.frame, &child)
+	}
 
 	// dump defer & panic records
 	for d := gp._defer; d != nil; d = d.link {
diff --git a/src/runtime/iface.go b/src/runtime/iface.go
index a4d56dd..87f7c20 100644
--- a/src/runtime/iface.go
+++ b/src/runtime/iface.go
@@ -28,21 +28,21 @@
 
 func itabHashFunc(inter *interfacetype, typ *_type) uintptr {
 	// compiler has provided some good hash codes for us.
-	return uintptr(inter.typ.hash ^ typ.hash)
+	return uintptr(inter.Type.Hash ^ typ.Hash)
 }
 
 func getitab(inter *interfacetype, typ *_type, canfail bool) *itab {
-	if len(inter.mhdr) == 0 {
+	if len(inter.Methods) == 0 {
 		throw("internal error - misuse of itab")
 	}
 
 	// easy case
-	if typ.tflag&tflagUncommon == 0 {
+	if typ.TFlag&abi.TFlagUncommon == 0 {
 		if canfail {
 			return nil
 		}
-		name := inter.typ.nameOff(inter.mhdr[0].name)
-		panic(&TypeAssertionError{nil, typ, &inter.typ, name.name()})
+		name := toRType(&inter.Type).nameOff(inter.Methods[0].Name)
+		panic(&TypeAssertionError{nil, typ, &inter.Type, name.Name()})
 	}
 
 	var m *itab
@@ -64,7 +64,7 @@
 	}
 
 	// Entry doesn't exist yet. Make a new entry & add it.
-	m = (*itab)(persistentalloc(unsafe.Sizeof(itab{})+uintptr(len(inter.mhdr)-1)*goarch.PtrSize, 0, &memstats.other_sys))
+	m = (*itab)(persistentalloc(unsafe.Sizeof(itab{})+uintptr(len(inter.Methods)-1)*goarch.PtrSize, 0, &memstats.other_sys))
 	m.inter = inter
 	m._type = typ
 	// The hash is used in type switches. However, compiler statically generates itab's
@@ -89,7 +89,7 @@
 	// The cached result doesn't record which
 	// interface function was missing, so initialize
 	// the itab again to get the missing function name.
-	panic(&TypeAssertionError{concrete: typ, asserted: &inter.typ, missingMethod: m.init()})
+	panic(&TypeAssertionError{concrete: typ, asserted: &inter.Type, missingMethod: m.init()})
 }
 
 // find finds the given interface/type pair in t.
@@ -121,7 +121,7 @@
 // itabLock must be held.
 func itabAdd(m *itab) {
 	// Bugs can lead to calling this while mallocing is set,
-	// typically because this is called while panicing.
+	// typically because this is called while panicking.
 	// Crash reliably, rather than only when we need to grow
 	// the hash table.
 	if getg().m.mallocing != 0 {
@@ -192,39 +192,40 @@
 func (m *itab) init() string {
 	inter := m.inter
 	typ := m._type
-	x := typ.uncommon()
+	x := typ.Uncommon()
 
 	// both inter and typ have method sorted by name,
 	// and interface names are unique,
 	// so can iterate over both in lock step;
 	// the loop is O(ni+nt) not O(ni*nt).
-	ni := len(inter.mhdr)
-	nt := int(x.mcount)
-	xmhdr := (*[1 << 16]method)(add(unsafe.Pointer(x), uintptr(x.moff)))[:nt:nt]
+	ni := len(inter.Methods)
+	nt := int(x.Mcount)
+	xmhdr := (*[1 << 16]abi.Method)(add(unsafe.Pointer(x), uintptr(x.Moff)))[:nt:nt]
 	j := 0
 	methods := (*[1 << 16]unsafe.Pointer)(unsafe.Pointer(&m.fun[0]))[:ni:ni]
 	var fun0 unsafe.Pointer
 imethods:
 	for k := 0; k < ni; k++ {
-		i := &inter.mhdr[k]
-		itype := inter.typ.typeOff(i.ityp)
-		name := inter.typ.nameOff(i.name)
-		iname := name.name()
-		ipkg := name.pkgPath()
+		i := &inter.Methods[k]
+		itype := toRType(&inter.Type).typeOff(i.Typ)
+		name := toRType(&inter.Type).nameOff(i.Name)
+		iname := name.Name()
+		ipkg := pkgPath(name)
 		if ipkg == "" {
-			ipkg = inter.pkgpath.name()
+			ipkg = inter.PkgPath.Name()
 		}
 		for ; j < nt; j++ {
 			t := &xmhdr[j]
-			tname := typ.nameOff(t.name)
-			if typ.typeOff(t.mtyp) == itype && tname.name() == iname {
-				pkgPath := tname.pkgPath()
+			rtyp := toRType(typ)
+			tname := rtyp.nameOff(t.Name)
+			if rtyp.typeOff(t.Mtyp) == itype && tname.Name() == iname {
+				pkgPath := pkgPath(tname)
 				if pkgPath == "" {
-					pkgPath = typ.nameOff(x.pkgpath).name()
+					pkgPath = rtyp.nameOff(x.PkgPath).Name()
 				}
-				if tname.isExported() || pkgPath == ipkg {
+				if tname.IsExported() || pkgPath == ipkg {
 					if m != nil {
-						ifn := typ.textOff(t.ifn)
+						ifn := rtyp.textOff(t.Ifn)
 						if k == 0 {
 							fun0 = ifn // we'll set m.fun[0] at the end
 						} else {
@@ -272,7 +273,7 @@
 	panicdottypeE(t, want, iface)
 }
 
-// panicnildottype is called when doing a i.(T) conversion and the interface i is nil.
+// panicnildottype is called when doing an i.(T) conversion and the interface i is nil.
 // want = the static type we're trying to convert to.
 func panicnildottype(want *_type) {
 	panic(&TypeAssertionError{nil, nil, want, ""})
@@ -323,12 +324,12 @@
 		raceReadObjectPC(t, v, getcallerpc(), abi.FuncPCABIInternal(convT))
 	}
 	if msanenabled {
-		msanread(v, t.size)
+		msanread(v, t.Size_)
 	}
 	if asanenabled {
-		asanread(v, t.size)
+		asanread(v, t.Size_)
 	}
-	x := mallocgc(t.size, t, true)
+	x := mallocgc(t.Size_, t, true)
 	typedmemmove(t, x, v)
 	return x
 }
@@ -338,14 +339,14 @@
 		raceReadObjectPC(t, v, getcallerpc(), abi.FuncPCABIInternal(convTnoptr))
 	}
 	if msanenabled {
-		msanread(v, t.size)
+		msanread(v, t.Size_)
 	}
 	if asanenabled {
-		asanread(v, t.size)
+		asanread(v, t.Size_)
 	}
 
-	x := mallocgc(t.size, t, false)
-	memmove(x, v, t.size)
+	x := mallocgc(t.Size_, t, false)
+	memmove(x, v, t.Size_)
 	return x
 }
 
@@ -421,7 +422,7 @@
 func assertI2I(inter *interfacetype, tab *itab) *itab {
 	if tab == nil {
 		// explicit conversions require non-nil interface value.
-		panic(&TypeAssertionError{nil, nil, &inter.typ, ""})
+		panic(&TypeAssertionError{nil, nil, &inter.Type, ""})
 	}
 	if tab.inter == inter {
 		return tab
@@ -448,7 +449,7 @@
 func assertE2I(inter *interfacetype, t *_type) *itab {
 	if t == nil {
 		// explicit conversions require non-nil interface value.
-		panic(&TypeAssertionError{nil, nil, &inter.typ, ""})
+		panic(&TypeAssertionError{nil, nil, &inter.Type, ""})
 	}
 	return getitab(inter, t, false)
 }
diff --git a/src/runtime/import_test.go b/src/runtime/import_test.go
new file mode 100644
index 0000000..2bf80aa
--- /dev/null
+++ b/src/runtime/import_test.go
@@ -0,0 +1,45 @@
+// Copyright 2023 The Go 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 and importx_test.go make it possible to write tests in the runtime
+// package, which is generally more convenient for testing runtime internals.
+// For tests that mostly touch public APIs, it's generally easier to write them
+// in the runtime_test package and export any runtime internals via
+// export_test.go.
+//
+// There are a few limitations on runtime package tests that this bridges:
+//
+// 1. Tests use the signature "XTest<name>(t TestingT)". Since runtime can't import
+// testing, test functions can't use testing.T, so instead we have the T
+// interface, which *testing.T satisfies. And we start names with "XTest"
+// because otherwise go test will complain about Test functions with the wrong
+// signature. To actually expose these as test functions, this file contains
+// trivial wrappers.
+//
+// 2. Runtime package tests can't directly import other std packages, so we
+// inject any necessary functions from std.
+
+// TODO: Generate this
+
+package runtime_test
+
+import (
+	"fmt"
+	"internal/testenv"
+	"runtime"
+	"testing"
+)
+
+func init() {
+	runtime.FmtSprintf = fmt.Sprintf
+	runtime.TestenvOptimizationOff = testenv.OptimizationOff
+}
+
+func TestInlineUnwinder(t *testing.T) {
+	runtime.XTestInlineUnwinder(t)
+}
+
+func TestSPWrite(t *testing.T) {
+	runtime.XTestSPWrite(t)
+}
diff --git a/src/runtime/importx_test.go b/src/runtime/importx_test.go
new file mode 100644
index 0000000..4574af7
--- /dev/null
+++ b/src/runtime/importx_test.go
@@ -0,0 +1,33 @@
+// Copyright 2023 The Go 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 import_test.go. This is the half that lives in the runtime package.
+
+// TODO: Generate this
+
+package runtime
+
+type TestingT interface {
+	Cleanup(func())
+	Error(args ...any)
+	Errorf(format string, args ...any)
+	Fail()
+	FailNow()
+	Failed() bool
+	Fatal(args ...any)
+	Fatalf(format string, args ...any)
+	Helper()
+	Log(args ...any)
+	Logf(format string, args ...any)
+	Name() string
+	Setenv(key, value string)
+	Skip(args ...any)
+	SkipNow()
+	Skipf(format string, args ...any)
+	Skipped() bool
+	TempDir() string
+}
+
+var FmtSprintf func(format string, a ...any) string
+var TestenvOptimizationOff func() bool
diff --git a/src/runtime/internal/atomic/atomic_loong64.s b/src/runtime/internal/atomic/atomic_loong64.s
index 3d802be..34193ad 100644
--- a/src/runtime/internal/atomic/atomic_loong64.s
+++ b/src/runtime/internal/atomic/atomic_loong64.s
@@ -89,7 +89,7 @@
 //	} else
 //		return 0;
 TEXT ·Casp1(SB), NOSPLIT, $0-25
-	JMP runtime∕internal∕atomic·Cas64(SB)
+	JMP	·Cas64(SB)
 
 // uint32 xadd(uint32 volatile *ptr, int32 delta)
 // Atomically:
@@ -294,13 +294,13 @@
 
 // uint32 runtime∕internal∕atomic·LoadAcq(uint32 volatile* ptr)
 TEXT ·LoadAcq(SB),NOSPLIT|NOFRAME,$0-12
-	JMP	atomic·Load(SB)
+	JMP	·Load(SB)
 
 // uint64 ·LoadAcq64(uint64 volatile* ptr)
 TEXT ·LoadAcq64(SB),NOSPLIT|NOFRAME,$0-16
-	JMP	atomic·Load64(SB)
+	JMP	·Load64(SB)
 
 // uintptr ·LoadAcquintptr(uintptr volatile* ptr)
 TEXT ·LoadAcquintptr(SB),NOSPLIT|NOFRAME,$0-16
-	JMP     atomic·Load64(SB)
+	JMP	·Load64(SB)
 
diff --git a/src/runtime/internal/atomic/types.go b/src/runtime/internal/atomic/types.go
index 0d75226..287742f 100644
--- a/src/runtime/internal/atomic/types.go
+++ b/src/runtime/internal/atomic/types.go
@@ -485,6 +485,7 @@
 }
 
 // provided by runtime
+//
 //go:linkname storePointer
 func storePointer(ptr *unsafe.Pointer, new unsafe.Pointer)
 
@@ -539,6 +540,7 @@
 }
 
 // Store updates the value atomically.
+//
 //go:nosplit
 func (p *Pointer[T]) Store(value *T) {
 	p.u.Store(unsafe.Pointer(value))
diff --git a/src/runtime/internal/sys/intrinsics.go b/src/runtime/internal/sys/intrinsics.go
index 902d893..e6a3758 100644
--- a/src/runtime/internal/sys/intrinsics.go
+++ b/src/runtime/internal/sys/intrinsics.go
@@ -2,10 +2,6 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build !386
-
-// TODO finish intrinsifying 386, deadcode the assembly, remove build tags, merge w/ intrinsics_common
-
 package sys
 
 // Copied from math/bits to avoid dependence.
@@ -77,6 +73,93 @@
 	return int(ntz8tab[x])
 }
 
+const len8tab = "" +
+	"\x00\x01\x02\x02\x03\x03\x03\x03\x04\x04\x04\x04\x04\x04\x04\x04" +
+	"\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05" +
+	"\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06" +
+	"\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06" +
+	"\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07" +
+	"\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07" +
+	"\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07" +
+	"\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07" +
+	"\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08" +
+	"\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08" +
+	"\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08" +
+	"\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08" +
+	"\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08" +
+	"\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08" +
+	"\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08" +
+	"\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08"
+
+// Len64 returns the minimum number of bits required to represent x; the result is 0 for x == 0.
+//
+// nosplit because this is used in src/runtime/histogram.go, which make run in sensitive contexts.
+//
+//go:nosplit
+func Len64(x uint64) (n int) {
+	if x >= 1<<32 {
+		x >>= 32
+		n = 32
+	}
+	if x >= 1<<16 {
+		x >>= 16
+		n += 16
+	}
+	if x >= 1<<8 {
+		x >>= 8
+		n += 8
+	}
+	return n + int(len8tab[x])
+}
+
+// --- OnesCount ---
+
+const m0 = 0x5555555555555555 // 01010101 ...
+const m1 = 0x3333333333333333 // 00110011 ...
+const m2 = 0x0f0f0f0f0f0f0f0f // 00001111 ...
+
+// OnesCount64 returns the number of one bits ("population count") in x.
+func OnesCount64(x uint64) int {
+	// Implementation: Parallel summing of adjacent bits.
+	// See "Hacker's Delight", Chap. 5: Counting Bits.
+	// The following pattern shows the general approach:
+	//
+	//   x = x>>1&(m0&m) + x&(m0&m)
+	//   x = x>>2&(m1&m) + x&(m1&m)
+	//   x = x>>4&(m2&m) + x&(m2&m)
+	//   x = x>>8&(m3&m) + x&(m3&m)
+	//   x = x>>16&(m4&m) + x&(m4&m)
+	//   x = x>>32&(m5&m) + x&(m5&m)
+	//   return int(x)
+	//
+	// Masking (& operations) can be left away when there's no
+	// danger that a field's sum will carry over into the next
+	// field: Since the result cannot be > 64, 8 bits is enough
+	// and we can ignore the masks for the shifts by 8 and up.
+	// Per "Hacker's Delight", the first line can be simplified
+	// more, but it saves at best one instruction, so we leave
+	// it alone for clarity.
+	const m = 1<<64 - 1
+	x = x>>1&(m0&m) + x&(m0&m)
+	x = x>>2&(m1&m) + x&(m1&m)
+	x = (x>>4 + x) & (m2 & m)
+	x += x >> 8
+	x += x >> 16
+	x += x >> 32
+	return int(x) & (1<<7 - 1)
+}
+
+// LeadingZeros64 returns the number of leading zero bits in x; the result is 64 for x == 0.
+func LeadingZeros64(x uint64) int { return 64 - Len64(x) }
+
+// LeadingZeros8 returns the number of leading zero bits in x; the result is 8 for x == 0.
+func LeadingZeros8(x uint8) int { return 8 - Len8(x) }
+
+// Len8 returns the minimum number of bits required to represent x; the result is 0 for x == 0.
+func Len8(x uint8) int {
+	return int(len8tab[x])
+}
+
 // Bswap64 returns its input with byte order reversed
 // 0x0102030405060708 -> 0x0807060504030201
 func Bswap64(x uint64) uint64 {
@@ -108,3 +191,18 @@
 	x = a | b
 	return x
 }
+
+// Prefetch prefetches data from memory addr to cache
+//
+// AMD64: Produce PREFETCHT0 instruction
+//
+// ARM64: Produce PRFM instruction with PLDL1KEEP option
+func Prefetch(addr uintptr) {}
+
+// PrefetchStreamed prefetches data from memory addr, with a hint that this data is being streamed.
+// That is, it is likely to be accessed very soon, but only once. If possible, this will avoid polluting the cache.
+//
+// AMD64: Produce PREFETCHNTA instruction
+//
+// ARM64: Produce PRFM instruction with PLDL1STRM option
+func PrefetchStreamed(addr uintptr) {}
diff --git a/src/runtime/internal/sys/intrinsics_386.s b/src/runtime/internal/sys/intrinsics_386.s
deleted file mode 100644
index f33ade0..0000000
--- a/src/runtime/internal/sys/intrinsics_386.s
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright 2016 The Go 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 "textflag.h"
-
-TEXT runtime∕internal∕sys·TrailingZeros64(SB), NOSPLIT, $0-12
-	// Try low 32 bits.
-	MOVL	x_lo+0(FP), AX
-	BSFL	AX, AX
-	JZ	tryhigh
-	MOVL	AX, ret+8(FP)
-	RET
-
-tryhigh:
-	// Try high 32 bits.
-	MOVL	x_hi+4(FP), AX
-	BSFL	AX, AX
-	JZ	none
-	ADDL	$32, AX
-	MOVL	AX, ret+8(FP)
-	RET
-
-none:
-	// No bits are set.
-	MOVL	$64, ret+8(FP)
-	RET
-
-TEXT runtime∕internal∕sys·TrailingZeros32(SB), NOSPLIT, $0-8
-	MOVL	x+0(FP), AX
-	BSFL	AX, AX
-	JNZ	2(PC)
-	MOVL	$32, AX
-	MOVL	AX, ret+4(FP)
-	RET
-
-TEXT runtime∕internal∕sys·TrailingZeros8(SB), NOSPLIT, $0-8
-	MOVBLZX	x+0(FP), AX
-	BSFL	AX, AX
-	JNZ	2(PC)
-	MOVL	$8, AX
-	MOVL	AX, ret+4(FP)
-	RET
-
-TEXT runtime∕internal∕sys·Bswap64(SB), NOSPLIT, $0-16
-	MOVL	x_lo+0(FP), AX
-	MOVL	x_hi+4(FP), BX
-	BSWAPL	AX
-	BSWAPL	BX
-	MOVL	BX, ret_lo+8(FP)
-	MOVL	AX, ret_hi+12(FP)
-	RET
-
-TEXT runtime∕internal∕sys·Bswap32(SB), NOSPLIT, $0-8
-	MOVL	x+0(FP), AX
-	BSWAPL	AX
-	MOVL	AX, ret+4(FP)
-	RET
diff --git a/src/runtime/internal/sys/intrinsics_common.go b/src/runtime/internal/sys/intrinsics_common.go
deleted file mode 100644
index 1461551..0000000
--- a/src/runtime/internal/sys/intrinsics_common.go
+++ /dev/null
@@ -1,109 +0,0 @@
-// Copyright 2019 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package sys
-
-// Copied from math/bits to avoid dependence.
-
-const len8tab = "" +
-	"\x00\x01\x02\x02\x03\x03\x03\x03\x04\x04\x04\x04\x04\x04\x04\x04" +
-	"\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05" +
-	"\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06" +
-	"\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06" +
-	"\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07" +
-	"\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07" +
-	"\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07" +
-	"\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07" +
-	"\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08" +
-	"\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08" +
-	"\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08" +
-	"\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08" +
-	"\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08" +
-	"\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08" +
-	"\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08" +
-	"\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08"
-
-// Len64 returns the minimum number of bits required to represent x; the result is 0 for x == 0.
-//
-// nosplit because this is used in src/runtime/histogram.go, which make run in sensitive contexts.
-//
-//go:nosplit
-func Len64(x uint64) (n int) {
-	if x >= 1<<32 {
-		x >>= 32
-		n = 32
-	}
-	if x >= 1<<16 {
-		x >>= 16
-		n += 16
-	}
-	if x >= 1<<8 {
-		x >>= 8
-		n += 8
-	}
-	return n + int(len8tab[x])
-}
-
-// --- OnesCount ---
-
-const m0 = 0x5555555555555555 // 01010101 ...
-const m1 = 0x3333333333333333 // 00110011 ...
-const m2 = 0x0f0f0f0f0f0f0f0f // 00001111 ...
-
-// OnesCount64 returns the number of one bits ("population count") in x.
-func OnesCount64(x uint64) int {
-	// Implementation: Parallel summing of adjacent bits.
-	// See "Hacker's Delight", Chap. 5: Counting Bits.
-	// The following pattern shows the general approach:
-	//
-	//   x = x>>1&(m0&m) + x&(m0&m)
-	//   x = x>>2&(m1&m) + x&(m1&m)
-	//   x = x>>4&(m2&m) + x&(m2&m)
-	//   x = x>>8&(m3&m) + x&(m3&m)
-	//   x = x>>16&(m4&m) + x&(m4&m)
-	//   x = x>>32&(m5&m) + x&(m5&m)
-	//   return int(x)
-	//
-	// Masking (& operations) can be left away when there's no
-	// danger that a field's sum will carry over into the next
-	// field: Since the result cannot be > 64, 8 bits is enough
-	// and we can ignore the masks for the shifts by 8 and up.
-	// Per "Hacker's Delight", the first line can be simplified
-	// more, but it saves at best one instruction, so we leave
-	// it alone for clarity.
-	const m = 1<<64 - 1
-	x = x>>1&(m0&m) + x&(m0&m)
-	x = x>>2&(m1&m) + x&(m1&m)
-	x = (x>>4 + x) & (m2 & m)
-	x += x >> 8
-	x += x >> 16
-	x += x >> 32
-	return int(x) & (1<<7 - 1)
-}
-
-// LeadingZeros64 returns the number of leading zero bits in x; the result is 64 for x == 0.
-func LeadingZeros64(x uint64) int { return 64 - Len64(x) }
-
-// LeadingZeros8 returns the number of leading zero bits in x; the result is 8 for x == 0.
-func LeadingZeros8(x uint8) int { return 8 - Len8(x) }
-
-// Len8 returns the minimum number of bits required to represent x; the result is 0 for x == 0.
-func Len8(x uint8) int {
-	return int(len8tab[x])
-}
-
-// Prefetch prefetches data from memory addr to cache
-//
-// AMD64: Produce PREFETCHT0 instruction
-//
-// ARM64: Produce PRFM instruction with PLDL1KEEP option
-func Prefetch(addr uintptr) {}
-
-// PrefetchStreamed prefetches data from memory addr, with a hint that this data is being streamed.
-// That is, it is likely to be accessed very soon, but only once. If possible, this will avoid polluting the cache.
-//
-// AMD64: Produce PREFETCHNTA instruction
-//
-// ARM64: Produce PRFM instruction with PLDL1STRM option
-func PrefetchStreamed(addr uintptr) {}
diff --git a/src/runtime/internal/sys/intrinsics_stubs.go b/src/runtime/internal/sys/intrinsics_stubs.go
deleted file mode 100644
index 66cfcde..0000000
--- a/src/runtime/internal/sys/intrinsics_stubs.go
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2016 The Go 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:build 386
-
-package sys
-
-func TrailingZeros64(x uint64) int
-func TrailingZeros32(x uint32) int
-func TrailingZeros8(x uint8) int
-func Bswap64(x uint64) uint64
-func Bswap32(x uint32) uint32
diff --git a/src/runtime/internal/syscall/defs_linux.go b/src/runtime/internal/syscall/defs_linux.go
deleted file mode 100644
index 71f1fa1..0000000
--- a/src/runtime/internal/syscall/defs_linux.go
+++ /dev/null
@@ -1,10 +0,0 @@
-// Copyright 2022 The Go Authors. 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 (
-	F_SETFD    = 2
-	FD_CLOEXEC = 1
-)
diff --git a/src/runtime/internal/syscall/syscall_linux.go b/src/runtime/internal/syscall/syscall_linux.go
index a103d31..7209634 100644
--- a/src/runtime/internal/syscall/syscall_linux.go
+++ b/src/runtime/internal/syscall/syscall_linux.go
@@ -60,7 +60,3 @@
 	_, _, e := Syscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0)
 	return e
 }
-
-func CloseOnExec(fd int32) {
-	Syscall6(SYS_FCNTL, uintptr(fd), F_SETFD, FD_CLOEXEC, 0, 0, 0)
-}
diff --git a/src/runtime/internal/wasitest/host_test.go b/src/runtime/internal/wasitest/host_test.go
new file mode 100644
index 0000000..ca4ef8f
--- /dev/null
+++ b/src/runtime/internal/wasitest/host_test.go
@@ -0,0 +1,14 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package wasi_test
+
+import "flag"
+
+var target string
+
+func init() {
+	// The dist test runner passes -target when running this as a host test.
+	flag.StringVar(&target, "target", "", "")
+}
diff --git a/src/runtime/internal/wasitest/nonblock_test.go b/src/runtime/internal/wasitest/nonblock_test.go
new file mode 100644
index 0000000..3072b96
--- /dev/null
+++ b/src/runtime/internal/wasitest/nonblock_test.go
@@ -0,0 +1,101 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Not all systems have syscall.Mkfifo.
+//go:build !aix && !plan9 && !solaris && !wasm && !windows
+
+package wasi_test
+
+import (
+	"bufio"
+	"fmt"
+	"io"
+	"math/rand"
+	"os"
+	"os/exec"
+	"path/filepath"
+	"syscall"
+	"testing"
+)
+
+// This test creates a set of FIFOs and writes to them in reverse order. It
+// checks that the output order matches the write order. The test binary opens
+// the FIFOs in their original order and spawns a goroutine for each that reads
+// from the FIFO and writes the result to stderr. If I/O was blocking, all
+// goroutines would be blocked waiting for one read call to return, and the
+// output order wouldn't match.
+
+type fifo struct {
+	file *os.File
+	path string
+}
+
+func TestNonblock(t *testing.T) {
+	if target != "wasip1/wasm" {
+		t.Skip()
+	}
+
+	switch os.Getenv("GOWASIRUNTIME") {
+	case "wasmer":
+		t.Skip("wasmer does not support non-blocking I/O")
+	}
+
+	for _, mode := range []string{"os.OpenFile", "os.NewFile"} {
+		t.Run(mode, func(t *testing.T) {
+			args := []string{"run", "./testdata/nonblock.go", mode}
+
+			fifos := make([]*fifo, 8)
+			for i := range fifos {
+				path := filepath.Join(t.TempDir(), fmt.Sprintf("wasip1-nonblock-fifo-%d-%d", rand.Uint32(), i))
+				if err := syscall.Mkfifo(path, 0666); err != nil {
+					t.Fatal(err)
+				}
+
+				file, err := os.OpenFile(path, os.O_RDWR, 0)
+				if err != nil {
+					t.Fatal(err)
+				}
+				defer file.Close()
+
+				args = append(args, path)
+				fifos[len(fifos)-i-1] = &fifo{file, path}
+			}
+
+			subProcess := exec.Command("go", args...)
+
+			subProcess.Env = append(os.Environ(), "GOOS=wasip1", "GOARCH=wasm")
+
+			pr, pw := io.Pipe()
+			defer pw.Close()
+
+			subProcess.Stderr = pw
+
+			if err := subProcess.Start(); err != nil {
+				t.Fatal(err)
+			}
+
+			scanner := bufio.NewScanner(pr)
+			if !scanner.Scan() {
+				t.Fatal("expected line:", scanner.Err())
+			} else if scanner.Text() != "waiting" {
+				t.Fatal("unexpected output:", scanner.Text())
+			}
+
+			for _, fifo := range fifos {
+				if _, err := fifo.file.WriteString(fifo.path + "\n"); err != nil {
+					t.Fatal(err)
+				}
+				if !scanner.Scan() {
+					t.Fatal("expected line:", scanner.Err())
+				} else if scanner.Text() != fifo.path {
+					t.Fatal("unexpected line:", scanner.Text())
+				}
+			}
+
+			if err := subProcess.Wait(); err != nil {
+				t.Fatal(err)
+			}
+		})
+	}
+}
diff --git a/src/runtime/internal/wasitest/tcpecho_test.go b/src/runtime/internal/wasitest/tcpecho_test.go
new file mode 100644
index 0000000..1137395
--- /dev/null
+++ b/src/runtime/internal/wasitest/tcpecho_test.go
@@ -0,0 +1,99 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package wasi_test
+
+import (
+	"bytes"
+	"fmt"
+	"math/rand"
+	"net"
+	"os"
+	"os/exec"
+	"testing"
+	"time"
+)
+
+func TestTCPEcho(t *testing.T) {
+	if target != "wasip1/wasm" {
+		t.Skip()
+	}
+
+	// We're unable to use port 0 here (let the OS choose a spare port).
+	// Although the WASM runtime accepts port 0, and the WASM module listens
+	// successfully, there's no way for this test to query the selected port
+	// so that it can connect to the WASM module. The WASM module itself
+	// cannot access any information about the socket due to limitations
+	// with WASI preview 1 networking, and the WASM runtimes do not log the
+	// port when you pre-open a socket. So, we probe for a free port here.
+	// Given there's an unavoidable race condition, the test is disabled by
+	// default.
+	if os.Getenv("GOWASIENABLERACYTEST") != "1" {
+		t.Skip("skipping WASI test with unavoidable race condition")
+	}
+	var host string
+	port := rand.Intn(10000) + 40000
+	for attempts := 0; attempts < 10; attempts++ {
+		host = fmt.Sprintf("127.0.0.1:%d", port)
+		l, err := net.Listen("tcp", host)
+		if err == nil {
+			l.Close()
+			break
+		}
+		port++
+	}
+
+	subProcess := exec.Command("go", "run", "./testdata/tcpecho.go")
+
+	subProcess.Env = append(os.Environ(), "GOOS=wasip1", "GOARCH=wasm")
+
+	switch os.Getenv("GOWASIRUNTIME") {
+	case "wazero":
+		subProcess.Env = append(subProcess.Env, "GOWASIRUNTIMEARGS=--listen="+host)
+	case "wasmtime", "":
+		subProcess.Env = append(subProcess.Env, "GOWASIRUNTIMEARGS=--tcplisten="+host)
+	default:
+		t.Skip("WASI runtime does not support sockets")
+	}
+
+	var b bytes.Buffer
+	subProcess.Stdout = &b
+	subProcess.Stderr = &b
+
+	if err := subProcess.Start(); err != nil {
+		t.Log(b.String())
+		t.Fatal(err)
+	}
+	defer subProcess.Process.Kill()
+
+	var conn net.Conn
+	var err error
+	for {
+		conn, err = net.Dial("tcp", host)
+		if err == nil {
+			break
+		}
+		time.Sleep(500 * time.Millisecond)
+	}
+	if err != nil {
+		t.Log(b.String())
+		t.Fatal(err)
+	}
+	defer conn.Close()
+
+	payload := []byte("foobar")
+	if _, err := conn.Write(payload); err != nil {
+		t.Fatal(err)
+	}
+	var buf [256]byte
+	n, err := conn.Read(buf[:])
+	if err != nil {
+		t.Fatal(err)
+	}
+	if string(buf[:n]) != string(payload) {
+		t.Error("unexpected payload")
+		t.Logf("expect: %d bytes (%v)", len(payload), payload)
+		t.Logf("actual: %d bytes (%v)", n, buf[:n])
+	}
+}
diff --git a/src/runtime/internal/wasitest/testdata/nonblock.go b/src/runtime/internal/wasitest/testdata/nonblock.go
new file mode 100644
index 0000000..8cbf21b
--- /dev/null
+++ b/src/runtime/internal/wasitest/testdata/nonblock.go
@@ -0,0 +1,65 @@
+// Copyright 2023 The Go Authors. 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"
+	"sync"
+	"syscall"
+)
+
+func main() {
+	if len(os.Args) < 2 {
+		panic("usage: nonblock <MODE> [PATH...]")
+	}
+	mode := os.Args[1]
+
+	ready := make(chan struct{})
+
+	var wg sync.WaitGroup
+	for _, path := range os.Args[2:] {
+		f, err := os.Open(path)
+		if err != nil {
+			panic(err)
+		}
+		switch mode {
+		case "os.OpenFile":
+		case "os.NewFile":
+			fd := f.Fd()
+			if err := syscall.SetNonblock(int(fd), true); err != nil {
+				panic(err)
+			}
+			f = os.NewFile(fd, path)
+		default:
+			panic("invalid test mode")
+		}
+
+		spawnWait := make(chan struct{})
+
+		wg.Add(1)
+		go func(f *os.File) {
+			defer f.Close()
+			defer wg.Done()
+
+			close(spawnWait)
+
+			<-ready
+
+			var buf [256]byte
+			n, err := f.Read(buf[:])
+			if err != nil {
+				panic(err)
+			}
+			os.Stderr.Write(buf[:n])
+		}(f)
+
+		// Spawn one goroutine at a time.
+		<-spawnWait
+	}
+
+	println("waiting")
+	close(ready)
+	wg.Wait()
+}
diff --git a/src/runtime/internal/wasitest/testdata/tcpecho.go b/src/runtime/internal/wasitest/testdata/tcpecho.go
new file mode 100644
index 0000000..819e352
--- /dev/null
+++ b/src/runtime/internal/wasitest/testdata/tcpecho.go
@@ -0,0 +1,74 @@
+// Copyright 2023 The Go Authors. 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 (
+	"errors"
+	"net"
+	"os"
+	"syscall"
+)
+
+func main() {
+	if err := run(); err != nil {
+		println(err)
+		os.Exit(1)
+	}
+}
+
+func run() error {
+	l, err := findListener()
+	if err != nil {
+		return err
+	}
+	if l == nil {
+		return errors.New("no pre-opened sockets available")
+	}
+	defer l.Close()
+
+	c, err := l.Accept()
+	if err != nil {
+		return err
+	}
+	return handleConn(c)
+}
+
+func handleConn(c net.Conn) error {
+	defer c.Close()
+
+	var buf [128]byte
+	n, err := c.Read(buf[:])
+	if err != nil {
+		return err
+	}
+	if _, err := c.Write(buf[:n]); err != nil {
+		return err
+	}
+	if err := c.(*net.TCPConn).CloseWrite(); err != nil {
+		return err
+	}
+	return c.Close()
+}
+
+func findListener() (net.Listener, error) {
+	// We start looking for pre-opened sockets at fd=3 because 0, 1, and 2
+	// are reserved for stdio. Pre-opened directors also start at fd=3, so
+	// we skip fds that aren't sockets. Once we reach EBADF we know there
+	// are no more pre-opens.
+	for preopenFd := uintptr(3); ; preopenFd++ {
+		f := os.NewFile(preopenFd, "")
+		l, err := net.FileListener(f)
+		f.Close()
+
+		var se syscall.Errno
+		switch errors.As(err, &se); se {
+		case syscall.ENOTSOCK:
+			continue
+		case syscall.EBADF:
+			err = nil
+		}
+		return l, err
+	}
+}
diff --git a/src/runtime/lfstack.go b/src/runtime/lfstack.go
index 306a8e8..a91ae64 100644
--- a/src/runtime/lfstack.go
+++ b/src/runtime/lfstack.go
@@ -67,3 +67,11 @@
 		throw("bad lfnode address")
 	}
 }
+
+func lfstackPack(node *lfnode, cnt uintptr) uint64 {
+	return uint64(taggedPointerPack(unsafe.Pointer(node), cnt))
+}
+
+func lfstackUnpack(val uint64) *lfnode {
+	return (*lfnode)(taggedPointer(val).pointer())
+}
diff --git a/src/runtime/lfstack_32bit.go b/src/runtime/lfstack_32bit.go
deleted file mode 100644
index 405923c..0000000
--- a/src/runtime/lfstack_32bit.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.
-
-//go:build 386 || arm || mips || mipsle
-
-package runtime
-
-import "unsafe"
-
-// On 32-bit systems, the stored uint64 has a 32-bit pointer and 32-bit count.
-
-func lfstackPack(node *lfnode, cnt uintptr) uint64 {
-	return uint64(uintptr(unsafe.Pointer(node)))<<32 | uint64(cnt)
-}
-
-func lfstackUnpack(val uint64) *lfnode {
-	return (*lfnode)(unsafe.Pointer(uintptr(val >> 32)))
-}
diff --git a/src/runtime/lfstack_64bit.go b/src/runtime/lfstack_64bit.go
deleted file mode 100644
index 88cbd3b..0000000
--- a/src/runtime/lfstack_64bit.go
+++ /dev/null
@@ -1,70 +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:build amd64 || arm64 || loong64 || mips64 || mips64le || ppc64 || ppc64le || riscv64 || s390x || wasm
-
-package runtime
-
-import "unsafe"
-
-const (
-	// addrBits is the number of bits needed to represent a virtual address.
-	//
-	// See heapAddrBits for a table of address space sizes on
-	// various architectures. 48 bits is enough for all
-	// architectures except s390x.
-	//
-	// On AMD64, virtual addresses are 48-bit (or 57-bit) numbers sign extended to 64.
-	// We shift the address left 16 to eliminate the sign extended part and make
-	// room in the bottom for the count.
-	//
-	// On s390x, virtual addresses are 64-bit. There's not much we
-	// can do about this, so we just hope that the kernel doesn't
-	// get to really high addresses and panic if it does.
-	addrBits = 48
-
-	// In addition to the 16 bits taken from the top, we can take 3 from the
-	// bottom, because node must be pointer-aligned, giving a total of 19 bits
-	// of count.
-	cntBits = 64 - addrBits + 3
-
-	// On AIX, 64-bit addresses are split into 36-bit segment number and 28-bit
-	// offset in segment.  Segment numbers in the range 0x0A0000000-0x0AFFFFFFF(LSA)
-	// are available for mmap.
-	// We assume all lfnode addresses are from memory allocated with mmap.
-	// We use one bit to distinguish between the two ranges.
-	aixAddrBits = 57
-	aixCntBits  = 64 - aixAddrBits + 3
-
-	// riscv64 SV57 mode gives 56 bits of userspace VA.
-	// lfstack code supports it, but broader support for SV57 mode is incomplete,
-	// and there may be other issues (see #54104).
-	riscv64AddrBits = 56
-	riscv64CntBits  = 64 - riscv64AddrBits + 3
-)
-
-func lfstackPack(node *lfnode, cnt uintptr) uint64 {
-	if GOARCH == "ppc64" && GOOS == "aix" {
-		return uint64(uintptr(unsafe.Pointer(node)))<<(64-aixAddrBits) | uint64(cnt&(1<<aixCntBits-1))
-	}
-	if GOARCH == "riscv64" {
-		return uint64(uintptr(unsafe.Pointer(node)))<<(64-riscv64AddrBits) | uint64(cnt&(1<<riscv64CntBits-1))
-	}
-	return uint64(uintptr(unsafe.Pointer(node)))<<(64-addrBits) | uint64(cnt&(1<<cntBits-1))
-}
-
-func lfstackUnpack(val uint64) *lfnode {
-	if GOARCH == "amd64" {
-		// amd64 systems can place the stack above the VA hole, so we need to sign extend
-		// val before unpacking.
-		return (*lfnode)(unsafe.Pointer(uintptr(int64(val) >> cntBits << 3)))
-	}
-	if GOARCH == "ppc64" && GOOS == "aix" {
-		return (*lfnode)(unsafe.Pointer(uintptr((val >> aixCntBits << 3) | 0xa<<56)))
-	}
-	if GOARCH == "riscv64" {
-		return (*lfnode)(unsafe.Pointer(uintptr(val >> riscv64CntBits << 3)))
-	}
-	return (*lfnode)(unsafe.Pointer(uintptr(val >> cntBits << 3)))
-}
diff --git a/src/runtime/libfuzzer_amd64.s b/src/runtime/libfuzzer_amd64.s
index 4355369..e30b768 100644
--- a/src/runtime/libfuzzer_amd64.s
+++ b/src/runtime/libfuzzer_amd64.s
@@ -93,6 +93,7 @@
 	MOVQ	(g_sched+gobuf_sp)(R10), SP
 call:
 	ANDQ	$~15, SP	// alignment for gcc ABI
+	SUBQ	$8, SP
 	// Load the address of the end of the function and push it into the stack.
 	// This address will be jumped to after executing the return instruction
 	// from the return sled. There we reset the stack pointer and return.
@@ -100,7 +101,7 @@
 	PUSHQ   BX
 	// Load the starting address of the return sled into BX.
 	MOVQ    $ret_sled<>(SB), BX
-	// Load the address of the i'th return instruction fron the return sled.
+	// Load the address of the i'th return instruction from the return sled.
 	// The index is given in the fakePC argument.
 	ADDQ    R8, BX
 	PUSHQ   BX
@@ -108,7 +109,7 @@
 	// Function arguments arg0 and arg1 are passed in the registers specified
 	// by the x64 calling convention.
 	JMP     AX
-// This code will not be executed and is only there to statisfy assembler
+// This code will not be executed and is only there to satisfy assembler
 // check of a balanced stack.
 not_reachable:
 	POPQ    BX
diff --git a/src/runtime/lock_js.go b/src/runtime/lock_js.go
index f71e7a2..91ad7be 100644
--- a/src/runtime/lock_js.go
+++ b/src/runtime/lock_js.go
@@ -6,9 +6,7 @@
 
 package runtime
 
-import (
-	_ "unsafe"
-)
+import _ "unsafe" // for go:linkname
 
 // js/wasm has no support for threads yet. There is no preemption.
 
@@ -116,10 +114,9 @@
 		notesWithTimeout[n] = noteWithTimeout{gp: gp, deadline: deadline}
 		releasem(mp)
 
-		gopark(nil, nil, waitReasonSleep, traceEvNone, 1)
+		gopark(nil, nil, waitReasonSleep, traceBlockSleep, 1)
 
 		clearTimeoutEvent(id) // note might have woken early, clear timeout
-		clearIdleID()
 
 		mp = acquirem()
 		delete(notes, n)
@@ -134,7 +131,7 @@
 		notes[n] = gp
 		releasem(mp)
 
-		gopark(nil, nil, waitReasonZero, traceEvNone, 1)
+		gopark(nil, nil, waitReasonZero, traceBlockGeneric, 1)
 
 		mp = acquirem()
 		delete(notes, n)
@@ -171,8 +168,36 @@
 	returned bool
 }
 
+type timeoutEvent struct {
+	id int32
+	// The time when this timeout will be triggered.
+	time int64
+}
+
+// diff calculates the difference of the event's trigger time and x.
+func (e *timeoutEvent) diff(x int64) int64 {
+	if e == nil {
+		return 0
+	}
+
+	diff := x - idleTimeout.time
+	if diff < 0 {
+		diff = -diff
+	}
+	return diff
+}
+
+// clear cancels this timeout event.
+func (e *timeoutEvent) clear() {
+	if e == nil {
+		return
+	}
+
+	clearTimeoutEvent(e.id)
+}
+
 // The timeout event started by beforeIdle.
-var idleID int32
+var idleTimeout *timeoutEvent
 
 // beforeIdle gets called by the scheduler if no goroutine is awake.
 // If we are not already handling an event, then we pause for an async event.
@@ -185,21 +210,23 @@
 func beforeIdle(now, pollUntil int64) (gp *g, otherReady bool) {
 	delay := int64(-1)
 	if pollUntil != 0 {
-		delay = pollUntil - now
-	}
-
-	if delay > 0 {
-		clearIdleID()
-		if delay < 1e6 {
-			delay = 1
-		} else if delay < 1e15 {
-			delay = delay / 1e6
-		} else {
+		// round up to prevent setTimeout being called early
+		delay = (pollUntil-now-1)/1e6 + 1
+		if delay > 1e9 {
 			// An arbitrary cap on how long to wait for a timer.
 			// 1e9 ms == ~11.5 days.
 			delay = 1e9
 		}
-		idleID = scheduleTimeoutEvent(delay)
+	}
+
+	if delay > 0 && (idleTimeout == nil || idleTimeout.diff(pollUntil) > 1e6) {
+		// If the difference is larger than 1 ms, we should reschedule the timeout.
+		idleTimeout.clear()
+
+		idleTimeout = &timeoutEvent{
+			id:   scheduleTimeoutEvent(delay),
+			time: pollUntil,
+		}
 	}
 
 	if len(events) == 0 {
@@ -215,16 +242,17 @@
 	return nil, false
 }
 
+var idleStart int64
+
 func handleAsyncEvent() {
+	idleStart = nanotime()
 	pause(getcallersp() - 16)
 }
 
-// clearIdleID clears our record of the timeout started by beforeIdle.
-func clearIdleID() {
-	if idleID != 0 {
-		clearTimeoutEvent(idleID)
-		idleID = 0
-	}
+// clearIdleTimeout clears our record of the timeout started by beforeIdle.
+func clearIdleTimeout() {
+	idleTimeout.clear()
+	idleTimeout = nil
 }
 
 // pause sets SP to newsp and pauses the execution of Go's WebAssembly code until an event is triggered.
@@ -232,9 +260,13 @@
 
 // scheduleTimeoutEvent tells the WebAssembly environment to trigger an event after ms milliseconds.
 // It returns a timer id that can be used with clearTimeoutEvent.
+//
+//go:wasmimport gojs runtime.scheduleTimeoutEvent
 func scheduleTimeoutEvent(ms int64) int32
 
 // clearTimeoutEvent clears a timeout event scheduled by scheduleTimeoutEvent.
+//
+//go:wasmimport gojs runtime.clearTimeoutEvent
 func clearTimeoutEvent(id int32)
 
 // handleEvent gets invoked on a call from JavaScript into Go. It calls the event handler of the syscall/js package
@@ -242,30 +274,36 @@
 // When no other goroutine is awake any more, beforeIdle resumes the handler goroutine. Now that the same goroutine
 // is running as was running when the call came in from JavaScript, execution can be safely passed back to JavaScript.
 func handleEvent() {
+	sched.idleTime.Add(nanotime() - idleStart)
+
 	e := &event{
 		gp:       getg(),
 		returned: false,
 	}
 	events = append(events, e)
 
-	eventHandler()
-
-	clearIdleID()
+	if !eventHandler() {
+		// If we did not handle a window event, the idle timeout was triggered, so we can clear it.
+		clearIdleTimeout()
+	}
 
 	// wait until all goroutines are idle
 	e.returned = true
-	gopark(nil, nil, waitReasonZero, traceEvNone, 1)
+	gopark(nil, nil, waitReasonZero, traceBlockGeneric, 1)
 
 	events[len(events)-1] = nil
 	events = events[:len(events)-1]
 
 	// return execution to JavaScript
+	idleStart = nanotime()
 	pause(getcallersp() - 16)
 }
 
-var eventHandler func()
+// eventHandler retrieves and executes handlers for pending JavaScript events.
+// It returns true if an event was handled.
+var eventHandler func() bool
 
 //go:linkname setEventHandler syscall/js.setEventHandler
-func setEventHandler(fn func()) {
+func setEventHandler(fn func() bool) {
 	eventHandler = fn
 }
diff --git a/src/runtime/lock_wasip1.go b/src/runtime/lock_wasip1.go
new file mode 100644
index 0000000..c4fc59f
--- /dev/null
+++ b/src/runtime/lock_wasip1.go
@@ -0,0 +1,107 @@
+// Copyright 2023 The Go 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:build wasip1
+
+package runtime
+
+// wasm has no support for threads yet. There is no preemption.
+// See proposal: https://github.com/WebAssembly/threads
+// Waiting for a mutex or timeout is implemented as a busy loop
+// while allowing other goroutines to run.
+
+const (
+	mutex_unlocked = 0
+	mutex_locked   = 1
+
+	active_spin     = 4
+	active_spin_cnt = 30
+)
+
+func lock(l *mutex) {
+	lockWithRank(l, getLockRank(l))
+}
+
+func lock2(l *mutex) {
+	if l.key == mutex_locked {
+		// wasm is single-threaded so we should never
+		// observe this.
+		throw("self deadlock")
+	}
+	gp := getg()
+	if gp.m.locks < 0 {
+		throw("lock count")
+	}
+	gp.m.locks++
+	l.key = mutex_locked
+}
+
+func unlock(l *mutex) {
+	unlockWithRank(l)
+}
+
+func unlock2(l *mutex) {
+	if l.key == mutex_unlocked {
+		throw("unlock of unlocked lock")
+	}
+	gp := getg()
+	gp.m.locks--
+	if gp.m.locks < 0 {
+		throw("lock count")
+	}
+	l.key = mutex_unlocked
+}
+
+// One-time notifications.
+func noteclear(n *note) {
+	n.key = 0
+}
+
+func notewakeup(n *note) {
+	if n.key != 0 {
+		print("notewakeup - double wakeup (", n.key, ")\n")
+		throw("notewakeup - double wakeup")
+	}
+	n.key = 1
+}
+
+func notesleep(n *note) {
+	throw("notesleep not supported by wasi")
+}
+
+func notetsleep(n *note, ns int64) bool {
+	throw("notetsleep not supported by wasi")
+	return false
+}
+
+// same as runtime·notetsleep, but called on user g (not g0)
+func notetsleepg(n *note, ns int64) bool {
+	gp := getg()
+	if gp == gp.m.g0 {
+		throw("notetsleepg on g0")
+	}
+
+	deadline := nanotime() + ns
+	for {
+		if n.key != 0 {
+			return true
+		}
+		if sched_yield() != 0 {
+			throw("sched_yield failed")
+		}
+		Gosched()
+		if ns >= 0 && nanotime() >= deadline {
+			return false
+		}
+	}
+}
+
+func beforeIdle(int64, int64) (*g, bool) {
+	return nil, false
+}
+
+func checkTimeouts() {}
+
+//go:wasmimport wasi_snapshot_preview1 sched_yield
+func sched_yield() errno
diff --git a/src/runtime/lockrank.go b/src/runtime/lockrank.go
index 284a61e..4d661e9 100644
--- a/src/runtime/lockrank.go
+++ b/src/runtime/lockrank.go
@@ -39,11 +39,10 @@
 	lockRankTraceStrings
 	// MALLOC
 	lockRankFin
-	lockRankGcBitsArenas
-	lockRankMheapSpecial
-	lockRankMspanSpecial
 	lockRankSpanSetSpine
+	lockRankMspanSpecial
 	// MPROF
+	lockRankGcBitsArenas
 	lockRankProfInsert
 	lockRankProfBlock
 	lockRankProfMemActive
@@ -56,12 +55,14 @@
 	// WB
 	lockRankWbufSpans
 	lockRankMheap
+	lockRankMheapSpecial
 	lockRankGlobalAlloc
 	// TRACE
 	lockRankTrace
 	lockRankTraceStackTab
 	lockRankPanic
 	lockRankDeadlock
+	lockRankRaceFini
 )
 
 // lockRankLeafRank is the rank of lock that does not have a declared rank,
@@ -96,10 +97,9 @@
 	lockRankTraceBuf:       "traceBuf",
 	lockRankTraceStrings:   "traceStrings",
 	lockRankFin:            "fin",
-	lockRankGcBitsArenas:   "gcBitsArenas",
-	lockRankMheapSpecial:   "mheapSpecial",
-	lockRankMspanSpecial:   "mspanSpecial",
 	lockRankSpanSetSpine:   "spanSetSpine",
+	lockRankMspanSpecial:   "mspanSpecial",
+	lockRankGcBitsArenas:   "gcBitsArenas",
 	lockRankProfInsert:     "profInsert",
 	lockRankProfBlock:      "profBlock",
 	lockRankProfMemActive:  "profMemActive",
@@ -110,11 +110,13 @@
 	lockRankHchanLeaf:      "hchanLeaf",
 	lockRankWbufSpans:      "wbufSpans",
 	lockRankMheap:          "mheap",
+	lockRankMheapSpecial:   "mheapSpecial",
 	lockRankGlobalAlloc:    "globalAlloc",
 	lockRankTrace:          "trace",
 	lockRankTraceStackTab:  "traceStackTab",
 	lockRankPanic:          "panic",
 	lockRankDeadlock:       "deadlock",
+	lockRankRaceFini:       "raceFini",
 }
 
 func (rank lockRank) String() string {
@@ -162,23 +164,24 @@
 	lockRankTraceBuf:       {lockRankSysmon, lockRankScavenge},
 	lockRankTraceStrings:   {lockRankSysmon, lockRankScavenge, lockRankTraceBuf},
 	lockRankFin:            {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankSweepWaiters, lockRankAssistQueue, lockRankSweep, lockRankPollDesc, lockRankCpuprof, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankHchan, lockRankNotifyList, lockRankItab, lockRankReflectOffs, lockRankUserArenaState, lockRankTraceBuf, lockRankTraceStrings},
-	lockRankGcBitsArenas:   {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankSweepWaiters, lockRankAssistQueue, lockRankSweep, lockRankPollDesc, lockRankCpuprof, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankHchan, lockRankNotifyList, lockRankItab, lockRankReflectOffs, lockRankUserArenaState, lockRankTraceBuf, lockRankTraceStrings},
-	lockRankMheapSpecial:   {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankSweepWaiters, lockRankAssistQueue, lockRankSweep, lockRankPollDesc, lockRankCpuprof, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankHchan, lockRankNotifyList, lockRankItab, lockRankReflectOffs, lockRankUserArenaState, lockRankTraceBuf, lockRankTraceStrings},
-	lockRankMspanSpecial:   {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankSweepWaiters, lockRankAssistQueue, lockRankSweep, lockRankPollDesc, lockRankCpuprof, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankHchan, lockRankNotifyList, lockRankItab, lockRankReflectOffs, lockRankUserArenaState, lockRankTraceBuf, lockRankTraceStrings},
 	lockRankSpanSetSpine:   {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankSweepWaiters, lockRankAssistQueue, lockRankSweep, lockRankPollDesc, lockRankCpuprof, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankHchan, lockRankNotifyList, lockRankItab, lockRankReflectOffs, lockRankUserArenaState, lockRankTraceBuf, lockRankTraceStrings},
+	lockRankMspanSpecial:   {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankSweepWaiters, lockRankAssistQueue, lockRankSweep, lockRankPollDesc, lockRankCpuprof, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankHchan, lockRankNotifyList, lockRankItab, lockRankReflectOffs, lockRankUserArenaState, lockRankTraceBuf, lockRankTraceStrings},
+	lockRankGcBitsArenas:   {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankSweepWaiters, lockRankAssistQueue, lockRankSweep, lockRankPollDesc, lockRankCpuprof, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankHchan, lockRankNotifyList, lockRankItab, lockRankReflectOffs, lockRankUserArenaState, lockRankTraceBuf, lockRankTraceStrings, lockRankMspanSpecial},
 	lockRankProfInsert:     {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankSweepWaiters, lockRankAssistQueue, lockRankSweep, lockRankPollDesc, lockRankCpuprof, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankHchan, lockRankNotifyList, lockRankItab, lockRankReflectOffs, lockRankUserArenaState, lockRankTraceBuf, lockRankTraceStrings},
 	lockRankProfBlock:      {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankSweepWaiters, lockRankAssistQueue, lockRankSweep, lockRankPollDesc, lockRankCpuprof, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankHchan, lockRankNotifyList, lockRankItab, lockRankReflectOffs, lockRankUserArenaState, lockRankTraceBuf, lockRankTraceStrings},
 	lockRankProfMemActive:  {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankSweepWaiters, lockRankAssistQueue, lockRankSweep, lockRankPollDesc, lockRankCpuprof, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankHchan, lockRankNotifyList, lockRankItab, lockRankReflectOffs, lockRankUserArenaState, lockRankTraceBuf, lockRankTraceStrings},
 	lockRankProfMemFuture:  {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankSweepWaiters, lockRankAssistQueue, lockRankSweep, lockRankPollDesc, lockRankCpuprof, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankHchan, lockRankNotifyList, lockRankItab, lockRankReflectOffs, lockRankUserArenaState, lockRankTraceBuf, lockRankTraceStrings, lockRankProfMemActive},
-	lockRankGscan:          {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankSweepWaiters, lockRankAssistQueue, lockRankSweep, lockRankPollDesc, lockRankCpuprof, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankNetpollInit, lockRankHchan, lockRankNotifyList, lockRankRoot, lockRankItab, lockRankReflectOffs, lockRankUserArenaState, lockRankTraceBuf, lockRankTraceStrings, lockRankFin, lockRankGcBitsArenas, lockRankSpanSetSpine, lockRankProfInsert, lockRankProfBlock, lockRankProfMemActive, lockRankProfMemFuture},
-	lockRankStackpool:      {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankSweepWaiters, lockRankAssistQueue, lockRankSweep, lockRankPollDesc, lockRankCpuprof, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankNetpollInit, lockRankHchan, lockRankNotifyList, lockRankRwmutexW, lockRankRwmutexR, lockRankRoot, lockRankItab, lockRankReflectOffs, lockRankUserArenaState, lockRankTraceBuf, lockRankTraceStrings, lockRankFin, lockRankGcBitsArenas, lockRankSpanSetSpine, lockRankProfInsert, lockRankProfBlock, lockRankProfMemActive, lockRankProfMemFuture, lockRankGscan},
-	lockRankStackLarge:     {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankSweepWaiters, lockRankAssistQueue, lockRankSweep, lockRankPollDesc, lockRankCpuprof, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankNetpollInit, lockRankHchan, lockRankNotifyList, lockRankRoot, lockRankItab, lockRankReflectOffs, lockRankUserArenaState, lockRankTraceBuf, lockRankTraceStrings, lockRankFin, lockRankGcBitsArenas, lockRankSpanSetSpine, lockRankProfInsert, lockRankProfBlock, lockRankProfMemActive, lockRankProfMemFuture, lockRankGscan},
-	lockRankHchanLeaf:      {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankSweepWaiters, lockRankAssistQueue, lockRankSweep, lockRankPollDesc, lockRankCpuprof, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankNetpollInit, lockRankHchan, lockRankNotifyList, lockRankRoot, lockRankItab, lockRankReflectOffs, lockRankUserArenaState, lockRankTraceBuf, lockRankTraceStrings, lockRankFin, lockRankGcBitsArenas, lockRankSpanSetSpine, lockRankProfInsert, lockRankProfBlock, lockRankProfMemActive, lockRankProfMemFuture, lockRankGscan, lockRankHchanLeaf},
-	lockRankWbufSpans:      {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankDefer, lockRankSweepWaiters, lockRankAssistQueue, lockRankSweep, lockRankPollDesc, lockRankCpuprof, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankNetpollInit, lockRankHchan, lockRankNotifyList, lockRankSudog, lockRankRoot, lockRankItab, lockRankReflectOffs, lockRankUserArenaState, lockRankTraceBuf, lockRankTraceStrings, lockRankFin, lockRankGcBitsArenas, lockRankMspanSpecial, lockRankSpanSetSpine, lockRankProfInsert, lockRankProfBlock, lockRankProfMemActive, lockRankProfMemFuture, lockRankGscan},
-	lockRankMheap:          {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankDefer, lockRankSweepWaiters, lockRankAssistQueue, lockRankSweep, lockRankPollDesc, lockRankCpuprof, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankNetpollInit, lockRankHchan, lockRankNotifyList, lockRankSudog, lockRankRwmutexW, lockRankRwmutexR, lockRankRoot, lockRankItab, lockRankReflectOffs, lockRankUserArenaState, lockRankTraceBuf, lockRankTraceStrings, lockRankFin, lockRankGcBitsArenas, lockRankMspanSpecial, lockRankSpanSetSpine, lockRankProfInsert, lockRankProfBlock, lockRankProfMemActive, lockRankProfMemFuture, lockRankGscan, lockRankStackpool, lockRankStackLarge, lockRankWbufSpans},
-	lockRankGlobalAlloc:    {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankDefer, lockRankSweepWaiters, lockRankAssistQueue, lockRankSweep, lockRankPollDesc, lockRankCpuprof, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankNetpollInit, lockRankHchan, lockRankNotifyList, lockRankSudog, lockRankRwmutexW, lockRankRwmutexR, lockRankRoot, lockRankItab, lockRankReflectOffs, lockRankUserArenaState, lockRankTraceBuf, lockRankTraceStrings, lockRankFin, lockRankGcBitsArenas, lockRankMheapSpecial, lockRankMspanSpecial, lockRankSpanSetSpine, lockRankProfInsert, lockRankProfBlock, lockRankProfMemActive, lockRankProfMemFuture, lockRankGscan, lockRankStackpool, lockRankStackLarge, lockRankWbufSpans, lockRankMheap},
-	lockRankTrace:          {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankDefer, lockRankSweepWaiters, lockRankAssistQueue, lockRankSweep, lockRankPollDesc, lockRankCpuprof, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankNetpollInit, lockRankHchan, lockRankNotifyList, lockRankSudog, lockRankRwmutexW, lockRankRwmutexR, lockRankRoot, lockRankItab, lockRankReflectOffs, lockRankUserArenaState, lockRankTraceBuf, lockRankTraceStrings, lockRankFin, lockRankGcBitsArenas, lockRankMspanSpecial, lockRankSpanSetSpine, lockRankProfInsert, lockRankProfBlock, lockRankProfMemActive, lockRankProfMemFuture, lockRankGscan, lockRankStackpool, lockRankStackLarge, lockRankWbufSpans, lockRankMheap},
-	lockRankTraceStackTab:  {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankDefer, lockRankSweepWaiters, lockRankAssistQueue, lockRankSweep, lockRankPollDesc, lockRankCpuprof, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankNetpollInit, lockRankHchan, lockRankNotifyList, lockRankSudog, lockRankRwmutexW, lockRankRwmutexR, lockRankRoot, lockRankItab, lockRankReflectOffs, lockRankUserArenaState, lockRankTraceBuf, lockRankTraceStrings, lockRankFin, lockRankGcBitsArenas, lockRankMspanSpecial, lockRankSpanSetSpine, lockRankProfInsert, lockRankProfBlock, lockRankProfMemActive, lockRankProfMemFuture, lockRankGscan, lockRankStackpool, lockRankStackLarge, lockRankWbufSpans, lockRankMheap, lockRankTrace},
+	lockRankGscan:          {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankSweepWaiters, lockRankAssistQueue, lockRankSweep, lockRankPollDesc, lockRankCpuprof, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankNetpollInit, lockRankHchan, lockRankNotifyList, lockRankRoot, lockRankItab, lockRankReflectOffs, lockRankUserArenaState, lockRankTraceBuf, lockRankTraceStrings, lockRankFin, lockRankSpanSetSpine, lockRankMspanSpecial, lockRankGcBitsArenas, lockRankProfInsert, lockRankProfBlock, lockRankProfMemActive, lockRankProfMemFuture},
+	lockRankStackpool:      {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankSweepWaiters, lockRankAssistQueue, lockRankSweep, lockRankPollDesc, lockRankCpuprof, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankNetpollInit, lockRankHchan, lockRankNotifyList, lockRankRwmutexW, lockRankRwmutexR, lockRankRoot, lockRankItab, lockRankReflectOffs, lockRankUserArenaState, lockRankTraceBuf, lockRankTraceStrings, lockRankFin, lockRankSpanSetSpine, lockRankMspanSpecial, lockRankGcBitsArenas, lockRankProfInsert, lockRankProfBlock, lockRankProfMemActive, lockRankProfMemFuture, lockRankGscan},
+	lockRankStackLarge:     {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankSweepWaiters, lockRankAssistQueue, lockRankSweep, lockRankPollDesc, lockRankCpuprof, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankNetpollInit, lockRankHchan, lockRankNotifyList, lockRankRoot, lockRankItab, lockRankReflectOffs, lockRankUserArenaState, lockRankTraceBuf, lockRankTraceStrings, lockRankFin, lockRankSpanSetSpine, lockRankMspanSpecial, lockRankGcBitsArenas, lockRankProfInsert, lockRankProfBlock, lockRankProfMemActive, lockRankProfMemFuture, lockRankGscan},
+	lockRankHchanLeaf:      {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankSweepWaiters, lockRankAssistQueue, lockRankSweep, lockRankPollDesc, lockRankCpuprof, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankNetpollInit, lockRankHchan, lockRankNotifyList, lockRankRoot, lockRankItab, lockRankReflectOffs, lockRankUserArenaState, lockRankTraceBuf, lockRankTraceStrings, lockRankFin, lockRankSpanSetSpine, lockRankMspanSpecial, lockRankGcBitsArenas, lockRankProfInsert, lockRankProfBlock, lockRankProfMemActive, lockRankProfMemFuture, lockRankGscan, lockRankHchanLeaf},
+	lockRankWbufSpans:      {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankDefer, lockRankSweepWaiters, lockRankAssistQueue, lockRankSweep, lockRankPollDesc, lockRankCpuprof, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankNetpollInit, lockRankHchan, lockRankNotifyList, lockRankSudog, lockRankRoot, lockRankItab, lockRankReflectOffs, lockRankUserArenaState, lockRankTraceBuf, lockRankTraceStrings, lockRankFin, lockRankSpanSetSpine, lockRankMspanSpecial, lockRankGcBitsArenas, lockRankProfInsert, lockRankProfBlock, lockRankProfMemActive, lockRankProfMemFuture, lockRankGscan},
+	lockRankMheap:          {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankDefer, lockRankSweepWaiters, lockRankAssistQueue, lockRankSweep, lockRankPollDesc, lockRankCpuprof, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankNetpollInit, lockRankHchan, lockRankNotifyList, lockRankSudog, lockRankRwmutexW, lockRankRwmutexR, lockRankRoot, lockRankItab, lockRankReflectOffs, lockRankUserArenaState, lockRankTraceBuf, lockRankTraceStrings, lockRankFin, lockRankSpanSetSpine, lockRankMspanSpecial, lockRankGcBitsArenas, lockRankProfInsert, lockRankProfBlock, lockRankProfMemActive, lockRankProfMemFuture, lockRankGscan, lockRankStackpool, lockRankStackLarge, lockRankWbufSpans},
+	lockRankMheapSpecial:   {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankDefer, lockRankSweepWaiters, lockRankAssistQueue, lockRankSweep, lockRankPollDesc, lockRankCpuprof, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankNetpollInit, lockRankHchan, lockRankNotifyList, lockRankSudog, lockRankRwmutexW, lockRankRwmutexR, lockRankRoot, lockRankItab, lockRankReflectOffs, lockRankUserArenaState, lockRankTraceBuf, lockRankTraceStrings, lockRankFin, lockRankSpanSetSpine, lockRankMspanSpecial, lockRankGcBitsArenas, lockRankProfInsert, lockRankProfBlock, lockRankProfMemActive, lockRankProfMemFuture, lockRankGscan, lockRankStackpool, lockRankStackLarge, lockRankWbufSpans, lockRankMheap},
+	lockRankGlobalAlloc:    {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankDefer, lockRankSweepWaiters, lockRankAssistQueue, lockRankSweep, lockRankPollDesc, lockRankCpuprof, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankNetpollInit, lockRankHchan, lockRankNotifyList, lockRankSudog, lockRankRwmutexW, lockRankRwmutexR, lockRankRoot, lockRankItab, lockRankReflectOffs, lockRankUserArenaState, lockRankTraceBuf, lockRankTraceStrings, lockRankFin, lockRankSpanSetSpine, lockRankMspanSpecial, lockRankGcBitsArenas, lockRankProfInsert, lockRankProfBlock, lockRankProfMemActive, lockRankProfMemFuture, lockRankGscan, lockRankStackpool, lockRankStackLarge, lockRankWbufSpans, lockRankMheap, lockRankMheapSpecial},
+	lockRankTrace:          {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankDefer, lockRankSweepWaiters, lockRankAssistQueue, lockRankSweep, lockRankPollDesc, lockRankCpuprof, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankNetpollInit, lockRankHchan, lockRankNotifyList, lockRankSudog, lockRankRwmutexW, lockRankRwmutexR, lockRankRoot, lockRankItab, lockRankReflectOffs, lockRankUserArenaState, lockRankTraceBuf, lockRankTraceStrings, lockRankFin, lockRankSpanSetSpine, lockRankMspanSpecial, lockRankGcBitsArenas, lockRankProfInsert, lockRankProfBlock, lockRankProfMemActive, lockRankProfMemFuture, lockRankGscan, lockRankStackpool, lockRankStackLarge, lockRankWbufSpans, lockRankMheap},
+	lockRankTraceStackTab:  {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankDefer, lockRankSweepWaiters, lockRankAssistQueue, lockRankSweep, lockRankPollDesc, lockRankCpuprof, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankNetpollInit, lockRankHchan, lockRankNotifyList, lockRankSudog, lockRankRwmutexW, lockRankRwmutexR, lockRankRoot, lockRankItab, lockRankReflectOffs, lockRankUserArenaState, lockRankTraceBuf, lockRankTraceStrings, lockRankFin, lockRankSpanSetSpine, lockRankMspanSpecial, lockRankGcBitsArenas, lockRankProfInsert, lockRankProfBlock, lockRankProfMemActive, lockRankProfMemFuture, lockRankGscan, lockRankStackpool, lockRankStackLarge, lockRankWbufSpans, lockRankMheap, lockRankTrace},
 	lockRankPanic:          {},
 	lockRankDeadlock:       {lockRankPanic, lockRankDeadlock},
+	lockRankRaceFini:       {lockRankPanic},
 }
diff --git a/src/runtime/lockrank_off.go b/src/runtime/lockrank_off.go
index bf046a1..c86726f 100644
--- a/src/runtime/lockrank_off.go
+++ b/src/runtime/lockrank_off.go
@@ -6,6 +6,8 @@
 
 package runtime
 
+const staticLockRanking = false
+
 // // lockRankStruct is embedded in mutex, but is empty when staticklockranking is
 // disabled (the default)
 type lockRankStruct struct {
diff --git a/src/runtime/lockrank_on.go b/src/runtime/lockrank_on.go
index 5dcc79b..bf530ee 100644
--- a/src/runtime/lockrank_on.go
+++ b/src/runtime/lockrank_on.go
@@ -11,6 +11,8 @@
 	"unsafe"
 )
 
+const staticLockRanking = true
+
 // worldIsStopped is accessed atomically to track world-stops. 1 == world
 // stopped.
 var worldIsStopped atomic.Uint32
@@ -49,7 +51,7 @@
 // split on entry to lock2() would record stack split locks as taken after l,
 // even though l is not actually locked yet.
 func lockWithRank(l *mutex, rank lockRank) {
-	if l == &debuglock || l == &paniclk {
+	if l == &debuglock || l == &paniclk || l == &raceFiniLock {
 		// debuglock is only used for println/printlock(). Don't do lock
 		// rank recording for it, since print/println are used when
 		// printing out a lock ordering problem below.
@@ -59,6 +61,10 @@
 		// lock ordering problem. Additionally, paniclk may be taken
 		// after effectively any lock (anywhere we might panic), which
 		// the partial order doesn't cover.
+		//
+		// raceFiniLock is held while exiting when running
+		// the race detector. Don't do lock rank recording for it,
+		// since we are exiting.
 		lock2(l)
 		return
 	}
@@ -159,7 +165,7 @@
 
 // See comment on lockWithRank regarding stack splitting.
 func unlockWithRank(l *mutex) {
-	if l == &debuglock || l == &paniclk {
+	if l == &debuglock || l == &paniclk || l == &raceFiniLock {
 		// See comment at beginning of lockWithRank.
 		unlock2(l)
 		return
diff --git a/src/runtime/malloc.go b/src/runtime/malloc.go
index 7ff2190..44479cc 100644
--- a/src/runtime/malloc.go
+++ b/src/runtime/malloc.go
@@ -323,6 +323,28 @@
 	//
 	// This should agree with minZeroPage in the compiler.
 	minLegalPointer uintptr = 4096
+
+	// minHeapForMetadataHugePages sets a threshold on when certain kinds of
+	// heap metadata, currently the arenas map L2 entries and page alloc bitmap
+	// mappings, are allowed to be backed by huge pages. If the heap goal ever
+	// exceeds this threshold, then huge pages are enabled.
+	//
+	// These numbers are chosen with the assumption that huge pages are on the
+	// order of a few MiB in size.
+	//
+	// The kind of metadata this applies to has a very low overhead when compared
+	// to address space used, but their constant overheads for small heaps would
+	// be very high if they were to be backed by huge pages (e.g. a few MiB makes
+	// a huge difference for an 8 MiB heap, but barely any difference for a 1 GiB
+	// heap). The benefit of huge pages is also not worth it for small heaps,
+	// because only a very, very small part of the metadata is used for small heaps.
+	//
+	// N.B. If the heap goal exceeds the threshold then shrinks to a very small size
+	// again, then huge pages will still be enabled for this mapping. The reason is that
+	// there's no point unless we're also returning the physical memory for these
+	// metadata mappings back to the OS. That would be quite complex to do in general
+	// as the heap is likely fragmented after a reduction in heap size.
+	minHeapForMetadataHugePages = 1 << 30
 )
 
 // physPageSize is the size in bytes of the OS's physical pages.
@@ -405,6 +427,10 @@
 		throw("bad pagesPerReclaimerChunk")
 	}
 
+	if minTagBits > taggedPointerBits {
+		throw("taggedPointerbits too small")
+	}
+
 	// Initialize the heap.
 	mheap_.init()
 	mcache0 = allocmcache()
@@ -571,6 +597,9 @@
 		userArenaHint.addr = p
 		userArenaHint.next, mheap_.userArena.arenaHints = mheap_.userArena.arenaHints, userArenaHint
 	}
+	// Initialize the memory limit here because the allocator is going to look at it
+	// but we haven't called gcinit yet and we're definitely going to allocate memory before then.
+	gcController.memoryLimit.Store(maxInt64)
 }
 
 // sysAlloc allocates heap arena space for at least n bytes. The
@@ -711,6 +740,11 @@
 			if l2 == nil {
 				throw("out of memory allocating heap arena map")
 			}
+			if h.arenasHugePages {
+				sysHugePage(unsafe.Pointer(l2), unsafe.Sizeof(*l2))
+			} else {
+				sysNoHugePage(unsafe.Pointer(l2), unsafe.Sizeof(*l2))
+			}
 			atomic.StorepNoWB(unsafe.Pointer(&h.arenas[ri.l1()]), unsafe.Pointer(l2))
 		}
 
@@ -810,6 +844,42 @@
 	}
 }
 
+// enableMetadataHugePages enables huge pages for various sources of heap metadata.
+//
+// A note on latency: for sufficiently small heaps (<10s of GiB) this function will take constant
+// time, but may take time proportional to the size of the mapped heap beyond that.
+//
+// This function is idempotent.
+//
+// The heap lock must not be held over this operation, since it will briefly acquire
+// the heap lock.
+func (h *mheap) enableMetadataHugePages() {
+	// Enable huge pages for page structure.
+	h.pages.enableChunkHugePages()
+
+	// Grab the lock and set arenasHugePages if it's not.
+	//
+	// Once arenasHugePages is set, all new L2 entries will be eligible for
+	// huge pages. We'll set all the old entries after we release the lock.
+	lock(&h.lock)
+	if h.arenasHugePages {
+		unlock(&h.lock)
+		return
+	}
+	h.arenasHugePages = true
+	unlock(&h.lock)
+
+	// N.B. The arenas L1 map is quite small on all platforms, so it's fine to
+	// just iterate over the whole thing.
+	for i := range h.arenas {
+		l2 := (*[1 << arenaL2Bits]*heapArena)(atomic.Loadp(unsafe.Pointer(&h.arenas[i])))
+		if l2 == nil {
+			continue
+		}
+		sysHugePage(unsafe.Pointer(l2), unsafe.Sizeof(*l2))
+	}
+}
+
 // base address for all 0-byte allocations
 var zerobase uintptr
 
@@ -949,7 +1019,7 @@
 	}
 	var span *mspan
 	var x unsafe.Pointer
-	noscan := typ == nil || typ.ptrdata == 0
+	noscan := typ == nil || typ.PtrBytes == 0
 	// In some cases block zeroing can profitably (for latency reduction purposes)
 	// be delayed till preemption is possible; delayedZeroing tracks that state.
 	delayedZeroing := false
@@ -1072,15 +1142,15 @@
 	if !noscan {
 		var scanSize uintptr
 		heapBitsSetType(uintptr(x), size, dataSize, typ)
-		if dataSize > typ.size {
+		if dataSize > typ.Size_ {
 			// Array allocation. If there are any
 			// pointers, GC has to scan to the last
 			// element.
-			if typ.ptrdata != 0 {
-				scanSize = dataSize - typ.size + typ.ptrdata
+			if typ.PtrBytes != 0 {
+				scanSize = dataSize - typ.Size_ + typ.PtrBytes
 			}
 		} else {
-			scanSize = typ.ptrdata
+			scanSize = typ.PtrBytes
 		}
 		c.scanAlloc += scanSize
 	}
@@ -1094,7 +1164,7 @@
 	publicationBarrier()
 	// As x and the heap bits are initialized, update
 	// freeIndexForScan now so x is seen by the GC
-	// (including convervative scan) as an allocated object.
+	// (including conservative scan) as an allocated object.
 	// While this pointer can't escape into user code as a
 	// _live_ pointer until we return, conservative scanning
 	// may find a dead pointer that happens to point into this
@@ -1251,25 +1321,25 @@
 // compiler (both frontend and SSA backend) knows the signature
 // of this function.
 func newobject(typ *_type) unsafe.Pointer {
-	return mallocgc(typ.size, typ, true)
+	return mallocgc(typ.Size_, typ, true)
 }
 
 //go:linkname reflect_unsafe_New reflect.unsafe_New
 func reflect_unsafe_New(typ *_type) unsafe.Pointer {
-	return mallocgc(typ.size, typ, true)
+	return mallocgc(typ.Size_, typ, true)
 }
 
 //go:linkname reflectlite_unsafe_New internal/reflectlite.unsafe_New
 func reflectlite_unsafe_New(typ *_type) unsafe.Pointer {
-	return mallocgc(typ.size, typ, true)
+	return mallocgc(typ.Size_, typ, true)
 }
 
 // newarray allocates an array of n elements of type typ.
 func newarray(typ *_type, n int) unsafe.Pointer {
 	if n == 1 {
-		return mallocgc(typ.size, typ, true)
+		return mallocgc(typ.Size_, typ, true)
 	}
-	mem, overflow := math.MulUintptr(typ.size, uintptr(n))
+	mem, overflow := math.MulUintptr(typ.Size_, uintptr(n))
 	if overflow || mem > maxAlloc || n < 0 {
 		panic(plainError("runtime: allocation size out of range"))
 	}
diff --git a/src/runtime/map.go b/src/runtime/map.go
index f546ce8..6b85681 100644
--- a/src/runtime/map.go
+++ b/src/runtime/map.go
@@ -63,20 +63,21 @@
 
 const (
 	// Maximum number of key/elem pairs a bucket can hold.
-	bucketCntBits = 3
-	bucketCnt     = 1 << bucketCntBits
+	bucketCntBits = abi.MapBucketCountBits
+	bucketCnt     = abi.MapBucketCount
 
-	// Maximum average load of a bucket that triggers growth is 6.5.
+	// Maximum average load of a bucket that triggers growth is bucketCnt*13/16 (about 80% full)
+	// Because of minimum alignment rules, bucketCnt is known to be at least 8.
 	// Represent as loadFactorNum/loadFactorDen, to allow integer math.
-	loadFactorNum = 13
 	loadFactorDen = 2
+	loadFactorNum = (bucketCnt * 13 / 16) * loadFactorDen
 
 	// Maximum key or elem size to keep inline (instead of mallocing per element).
 	// Must fit in a uint8.
 	// Fast versions cannot handle big elems - the cutoff size for
 	// fast versions in cmd/compile/internal/gc/walk.go must be at most this elem.
-	maxKeySize  = 128
-	maxElemSize = 128
+	maxKeySize  = abi.MapMaxKeyBytes
+	maxElemSize = abi.MapMaxElemBytes
 
 	// data offset should be the size of the bmap struct, but needs to be
 	// aligned correctly. For amd64p32 this means 64-bit alignment
@@ -206,11 +207,11 @@
 }
 
 func (b *bmap) overflow(t *maptype) *bmap {
-	return *(**bmap)(add(unsafe.Pointer(b), uintptr(t.bucketsize)-goarch.PtrSize))
+	return *(**bmap)(add(unsafe.Pointer(b), uintptr(t.BucketSize)-goarch.PtrSize))
 }
 
 func (b *bmap) setoverflow(t *maptype, ovf *bmap) {
-	*(**bmap)(add(unsafe.Pointer(b), uintptr(t.bucketsize)-goarch.PtrSize)) = ovf
+	*(**bmap)(add(unsafe.Pointer(b), uintptr(t.BucketSize)-goarch.PtrSize)) = ovf
 }
 
 func (b *bmap) keys() unsafe.Pointer {
@@ -251,7 +252,7 @@
 		ovf = h.extra.nextOverflow
 		if ovf.overflow(t) == nil {
 			// We're not at the end of the preallocated overflow buckets. Bump the pointer.
-			h.extra.nextOverflow = (*bmap)(add(unsafe.Pointer(ovf), uintptr(t.bucketsize)))
+			h.extra.nextOverflow = (*bmap)(add(unsafe.Pointer(ovf), uintptr(t.BucketSize)))
 		} else {
 			// This is the last preallocated overflow bucket.
 			// Reset the overflow pointer on this bucket,
@@ -260,10 +261,10 @@
 			h.extra.nextOverflow = nil
 		}
 	} else {
-		ovf = (*bmap)(newobject(t.bucket))
+		ovf = (*bmap)(newobject(t.Bucket))
 	}
 	h.incrnoverflow()
-	if t.bucket.ptrdata == 0 {
+	if t.Bucket.PtrBytes == 0 {
 		h.createOverflow()
 		*h.extra.overflow = append(*h.extra.overflow, ovf)
 	}
@@ -302,7 +303,7 @@
 // If h != nil, the map can be created directly in h.
 // If h.buckets != nil, bucket pointed to can be used as the first bucket.
 func makemap(t *maptype, hint int, h *hmap) *hmap {
-	mem, overflow := math.MulUintptr(uintptr(hint), t.bucket.size)
+	mem, overflow := math.MulUintptr(uintptr(hint), t.Bucket.Size_)
 	if overflow || mem > maxAlloc {
 		hint = 0
 	}
@@ -352,22 +353,22 @@
 		// required to insert the median number of elements
 		// used with this value of b.
 		nbuckets += bucketShift(b - 4)
-		sz := t.bucket.size * nbuckets
+		sz := t.Bucket.Size_ * nbuckets
 		up := roundupsize(sz)
 		if up != sz {
-			nbuckets = up / t.bucket.size
+			nbuckets = up / t.Bucket.Size_
 		}
 	}
 
 	if dirtyalloc == nil {
-		buckets = newarray(t.bucket, int(nbuckets))
+		buckets = newarray(t.Bucket, int(nbuckets))
 	} else {
 		// dirtyalloc was previously generated by
-		// the above newarray(t.bucket, int(nbuckets))
+		// the above newarray(t.Bucket, int(nbuckets))
 		// but may not be empty.
 		buckets = dirtyalloc
-		size := t.bucket.size * nbuckets
-		if t.bucket.ptrdata != 0 {
+		size := t.Bucket.Size_ * nbuckets
+		if t.Bucket.PtrBytes != 0 {
 			memclrHasPointers(buckets, size)
 		} else {
 			memclrNoHeapPointers(buckets, size)
@@ -380,8 +381,8 @@
 		// we use the convention that if a preallocated overflow bucket's overflow
 		// pointer is nil, then there are more available by bumping the pointer.
 		// We need a safe non-nil pointer for the last overflow bucket; just use buckets.
-		nextOverflow = (*bmap)(add(buckets, base*uintptr(t.bucketsize)))
-		last := (*bmap)(add(buckets, (nbuckets-1)*uintptr(t.bucketsize)))
+		nextOverflow = (*bmap)(add(buckets, base*uintptr(t.BucketSize)))
+		last := (*bmap)(add(buckets, (nbuckets-1)*uintptr(t.BucketSize)))
 		last.setoverflow(t, (*bmap)(buckets))
 	}
 	return buckets, nextOverflow
@@ -397,32 +398,32 @@
 		callerpc := getcallerpc()
 		pc := abi.FuncPCABIInternal(mapaccess1)
 		racereadpc(unsafe.Pointer(h), callerpc, pc)
-		raceReadObjectPC(t.key, key, callerpc, pc)
+		raceReadObjectPC(t.Key, key, callerpc, pc)
 	}
 	if msanenabled && h != nil {
-		msanread(key, t.key.size)
+		msanread(key, t.Key.Size_)
 	}
 	if asanenabled && h != nil {
-		asanread(key, t.key.size)
+		asanread(key, t.Key.Size_)
 	}
 	if h == nil || h.count == 0 {
-		if t.hashMightPanic() {
-			t.hasher(key, 0) // see issue 23734
+		if t.HashMightPanic() {
+			t.Hasher(key, 0) // see issue 23734
 		}
 		return unsafe.Pointer(&zeroVal[0])
 	}
 	if h.flags&hashWriting != 0 {
 		fatal("concurrent map read and map write")
 	}
-	hash := t.hasher(key, uintptr(h.hash0))
+	hash := t.Hasher(key, uintptr(h.hash0))
 	m := bucketMask(h.B)
-	b := (*bmap)(add(h.buckets, (hash&m)*uintptr(t.bucketsize)))
+	b := (*bmap)(add(h.buckets, (hash&m)*uintptr(t.BucketSize)))
 	if c := h.oldbuckets; c != nil {
 		if !h.sameSizeGrow() {
 			// There used to be half as many buckets; mask down one more power of two.
 			m >>= 1
 		}
-		oldb := (*bmap)(add(c, (hash&m)*uintptr(t.bucketsize)))
+		oldb := (*bmap)(add(c, (hash&m)*uintptr(t.BucketSize)))
 		if !evacuated(oldb) {
 			b = oldb
 		}
@@ -437,13 +438,13 @@
 				}
 				continue
 			}
-			k := add(unsafe.Pointer(b), dataOffset+i*uintptr(t.keysize))
-			if t.indirectkey() {
+			k := add(unsafe.Pointer(b), dataOffset+i*uintptr(t.KeySize))
+			if t.IndirectKey() {
 				k = *((*unsafe.Pointer)(k))
 			}
-			if t.key.equal(key, k) {
-				e := add(unsafe.Pointer(b), dataOffset+bucketCnt*uintptr(t.keysize)+i*uintptr(t.elemsize))
-				if t.indirectelem() {
+			if t.Key.Equal(key, k) {
+				e := add(unsafe.Pointer(b), dataOffset+bucketCnt*uintptr(t.KeySize)+i*uintptr(t.ValueSize))
+				if t.IndirectElem() {
 					e = *((*unsafe.Pointer)(e))
 				}
 				return e
@@ -458,32 +459,32 @@
 		callerpc := getcallerpc()
 		pc := abi.FuncPCABIInternal(mapaccess2)
 		racereadpc(unsafe.Pointer(h), callerpc, pc)
-		raceReadObjectPC(t.key, key, callerpc, pc)
+		raceReadObjectPC(t.Key, key, callerpc, pc)
 	}
 	if msanenabled && h != nil {
-		msanread(key, t.key.size)
+		msanread(key, t.Key.Size_)
 	}
 	if asanenabled && h != nil {
-		asanread(key, t.key.size)
+		asanread(key, t.Key.Size_)
 	}
 	if h == nil || h.count == 0 {
-		if t.hashMightPanic() {
-			t.hasher(key, 0) // see issue 23734
+		if t.HashMightPanic() {
+			t.Hasher(key, 0) // see issue 23734
 		}
 		return unsafe.Pointer(&zeroVal[0]), false
 	}
 	if h.flags&hashWriting != 0 {
 		fatal("concurrent map read and map write")
 	}
-	hash := t.hasher(key, uintptr(h.hash0))
+	hash := t.Hasher(key, uintptr(h.hash0))
 	m := bucketMask(h.B)
-	b := (*bmap)(add(h.buckets, (hash&m)*uintptr(t.bucketsize)))
+	b := (*bmap)(add(h.buckets, (hash&m)*uintptr(t.BucketSize)))
 	if c := h.oldbuckets; c != nil {
 		if !h.sameSizeGrow() {
 			// There used to be half as many buckets; mask down one more power of two.
 			m >>= 1
 		}
-		oldb := (*bmap)(add(c, (hash&m)*uintptr(t.bucketsize)))
+		oldb := (*bmap)(add(c, (hash&m)*uintptr(t.BucketSize)))
 		if !evacuated(oldb) {
 			b = oldb
 		}
@@ -498,13 +499,13 @@
 				}
 				continue
 			}
-			k := add(unsafe.Pointer(b), dataOffset+i*uintptr(t.keysize))
-			if t.indirectkey() {
+			k := add(unsafe.Pointer(b), dataOffset+i*uintptr(t.KeySize))
+			if t.IndirectKey() {
 				k = *((*unsafe.Pointer)(k))
 			}
-			if t.key.equal(key, k) {
-				e := add(unsafe.Pointer(b), dataOffset+bucketCnt*uintptr(t.keysize)+i*uintptr(t.elemsize))
-				if t.indirectelem() {
+			if t.Key.Equal(key, k) {
+				e := add(unsafe.Pointer(b), dataOffset+bucketCnt*uintptr(t.KeySize)+i*uintptr(t.ValueSize))
+				if t.IndirectElem() {
 					e = *((*unsafe.Pointer)(e))
 				}
 				return e, true
@@ -519,15 +520,15 @@
 	if h == nil || h.count == 0 {
 		return nil, nil
 	}
-	hash := t.hasher(key, uintptr(h.hash0))
+	hash := t.Hasher(key, uintptr(h.hash0))
 	m := bucketMask(h.B)
-	b := (*bmap)(add(h.buckets, (hash&m)*uintptr(t.bucketsize)))
+	b := (*bmap)(add(h.buckets, (hash&m)*uintptr(t.BucketSize)))
 	if c := h.oldbuckets; c != nil {
 		if !h.sameSizeGrow() {
 			// There used to be half as many buckets; mask down one more power of two.
 			m >>= 1
 		}
-		oldb := (*bmap)(add(c, (hash&m)*uintptr(t.bucketsize)))
+		oldb := (*bmap)(add(c, (hash&m)*uintptr(t.BucketSize)))
 		if !evacuated(oldb) {
 			b = oldb
 		}
@@ -542,13 +543,13 @@
 				}
 				continue
 			}
-			k := add(unsafe.Pointer(b), dataOffset+i*uintptr(t.keysize))
-			if t.indirectkey() {
+			k := add(unsafe.Pointer(b), dataOffset+i*uintptr(t.KeySize))
+			if t.IndirectKey() {
 				k = *((*unsafe.Pointer)(k))
 			}
-			if t.key.equal(key, k) {
-				e := add(unsafe.Pointer(b), dataOffset+bucketCnt*uintptr(t.keysize)+i*uintptr(t.elemsize))
-				if t.indirectelem() {
+			if t.Key.Equal(key, k) {
+				e := add(unsafe.Pointer(b), dataOffset+bucketCnt*uintptr(t.KeySize)+i*uintptr(t.ValueSize))
+				if t.IndirectElem() {
 					e = *((*unsafe.Pointer)(e))
 				}
 				return k, e
@@ -583,25 +584,25 @@
 		callerpc := getcallerpc()
 		pc := abi.FuncPCABIInternal(mapassign)
 		racewritepc(unsafe.Pointer(h), callerpc, pc)
-		raceReadObjectPC(t.key, key, callerpc, pc)
+		raceReadObjectPC(t.Key, key, callerpc, pc)
 	}
 	if msanenabled {
-		msanread(key, t.key.size)
+		msanread(key, t.Key.Size_)
 	}
 	if asanenabled {
-		asanread(key, t.key.size)
+		asanread(key, t.Key.Size_)
 	}
 	if h.flags&hashWriting != 0 {
 		fatal("concurrent map writes")
 	}
-	hash := t.hasher(key, uintptr(h.hash0))
+	hash := t.Hasher(key, uintptr(h.hash0))
 
 	// Set hashWriting after calling t.hasher, since t.hasher may panic,
 	// in which case we have not actually done a write.
 	h.flags ^= hashWriting
 
 	if h.buckets == nil {
-		h.buckets = newobject(t.bucket) // newarray(t.bucket, 1)
+		h.buckets = newobject(t.Bucket) // newarray(t.Bucket, 1)
 	}
 
 again:
@@ -609,7 +610,7 @@
 	if h.growing() {
 		growWork(t, h, bucket)
 	}
-	b := (*bmap)(add(h.buckets, bucket*uintptr(t.bucketsize)))
+	b := (*bmap)(add(h.buckets, bucket*uintptr(t.BucketSize)))
 	top := tophash(hash)
 
 	var inserti *uint8
@@ -621,26 +622,26 @@
 			if b.tophash[i] != top {
 				if isEmpty(b.tophash[i]) && inserti == nil {
 					inserti = &b.tophash[i]
-					insertk = add(unsafe.Pointer(b), dataOffset+i*uintptr(t.keysize))
-					elem = add(unsafe.Pointer(b), dataOffset+bucketCnt*uintptr(t.keysize)+i*uintptr(t.elemsize))
+					insertk = add(unsafe.Pointer(b), dataOffset+i*uintptr(t.KeySize))
+					elem = add(unsafe.Pointer(b), dataOffset+bucketCnt*uintptr(t.KeySize)+i*uintptr(t.ValueSize))
 				}
 				if b.tophash[i] == emptyRest {
 					break bucketloop
 				}
 				continue
 			}
-			k := add(unsafe.Pointer(b), dataOffset+i*uintptr(t.keysize))
-			if t.indirectkey() {
+			k := add(unsafe.Pointer(b), dataOffset+i*uintptr(t.KeySize))
+			if t.IndirectKey() {
 				k = *((*unsafe.Pointer)(k))
 			}
-			if !t.key.equal(key, k) {
+			if !t.Key.Equal(key, k) {
 				continue
 			}
 			// already have a mapping for key. Update it.
-			if t.needkeyupdate() {
-				typedmemmove(t.key, k, key)
+			if t.NeedKeyUpdate() {
+				typedmemmove(t.Key, k, key)
 			}
-			elem = add(unsafe.Pointer(b), dataOffset+bucketCnt*uintptr(t.keysize)+i*uintptr(t.elemsize))
+			elem = add(unsafe.Pointer(b), dataOffset+bucketCnt*uintptr(t.KeySize)+i*uintptr(t.ValueSize))
 			goto done
 		}
 		ovf := b.overflow(t)
@@ -664,20 +665,20 @@
 		newb := h.newoverflow(t, b)
 		inserti = &newb.tophash[0]
 		insertk = add(unsafe.Pointer(newb), dataOffset)
-		elem = add(insertk, bucketCnt*uintptr(t.keysize))
+		elem = add(insertk, bucketCnt*uintptr(t.KeySize))
 	}
 
 	// store new key/elem at insert position
-	if t.indirectkey() {
-		kmem := newobject(t.key)
+	if t.IndirectKey() {
+		kmem := newobject(t.Key)
 		*(*unsafe.Pointer)(insertk) = kmem
 		insertk = kmem
 	}
-	if t.indirectelem() {
-		vmem := newobject(t.elem)
+	if t.IndirectElem() {
+		vmem := newobject(t.Elem)
 		*(*unsafe.Pointer)(elem) = vmem
 	}
-	typedmemmove(t.key, insertk, key)
+	typedmemmove(t.Key, insertk, key)
 	*inserti = top
 	h.count++
 
@@ -686,7 +687,7 @@
 		fatal("concurrent map writes")
 	}
 	h.flags &^= hashWriting
-	if t.indirectelem() {
+	if t.IndirectElem() {
 		elem = *((*unsafe.Pointer)(elem))
 	}
 	return elem
@@ -697,17 +698,17 @@
 		callerpc := getcallerpc()
 		pc := abi.FuncPCABIInternal(mapdelete)
 		racewritepc(unsafe.Pointer(h), callerpc, pc)
-		raceReadObjectPC(t.key, key, callerpc, pc)
+		raceReadObjectPC(t.Key, key, callerpc, pc)
 	}
 	if msanenabled && h != nil {
-		msanread(key, t.key.size)
+		msanread(key, t.Key.Size_)
 	}
 	if asanenabled && h != nil {
-		asanread(key, t.key.size)
+		asanread(key, t.Key.Size_)
 	}
 	if h == nil || h.count == 0 {
-		if t.hashMightPanic() {
-			t.hasher(key, 0) // see issue 23734
+		if t.HashMightPanic() {
+			t.Hasher(key, 0) // see issue 23734
 		}
 		return
 	}
@@ -715,7 +716,7 @@
 		fatal("concurrent map writes")
 	}
 
-	hash := t.hasher(key, uintptr(h.hash0))
+	hash := t.Hasher(key, uintptr(h.hash0))
 
 	// Set hashWriting after calling t.hasher, since t.hasher may panic,
 	// in which case we have not actually done a write (delete).
@@ -725,7 +726,7 @@
 	if h.growing() {
 		growWork(t, h, bucket)
 	}
-	b := (*bmap)(add(h.buckets, bucket*uintptr(t.bucketsize)))
+	b := (*bmap)(add(h.buckets, bucket*uintptr(t.BucketSize)))
 	bOrig := b
 	top := tophash(hash)
 search:
@@ -737,27 +738,27 @@
 				}
 				continue
 			}
-			k := add(unsafe.Pointer(b), dataOffset+i*uintptr(t.keysize))
+			k := add(unsafe.Pointer(b), dataOffset+i*uintptr(t.KeySize))
 			k2 := k
-			if t.indirectkey() {
+			if t.IndirectKey() {
 				k2 = *((*unsafe.Pointer)(k2))
 			}
-			if !t.key.equal(key, k2) {
+			if !t.Key.Equal(key, k2) {
 				continue
 			}
 			// Only clear key if there are pointers in it.
-			if t.indirectkey() {
+			if t.IndirectKey() {
 				*(*unsafe.Pointer)(k) = nil
-			} else if t.key.ptrdata != 0 {
-				memclrHasPointers(k, t.key.size)
+			} else if t.Key.PtrBytes != 0 {
+				memclrHasPointers(k, t.Key.Size_)
 			}
-			e := add(unsafe.Pointer(b), dataOffset+bucketCnt*uintptr(t.keysize)+i*uintptr(t.elemsize))
-			if t.indirectelem() {
+			e := add(unsafe.Pointer(b), dataOffset+bucketCnt*uintptr(t.KeySize)+i*uintptr(t.ValueSize))
+			if t.IndirectElem() {
 				*(*unsafe.Pointer)(e) = nil
-			} else if t.elem.ptrdata != 0 {
-				memclrHasPointers(e, t.elem.size)
+			} else if t.Elem.PtrBytes != 0 {
+				memclrHasPointers(e, t.Elem.Size_)
 			} else {
-				memclrNoHeapPointers(e, t.elem.size)
+				memclrNoHeapPointers(e, t.Elem.Size_)
 			}
 			b.tophash[i] = emptyOne
 			// If the bucket now ends in a bunch of emptyOne states,
@@ -831,7 +832,7 @@
 	// grab snapshot of bucket state
 	it.B = h.B
 	it.buckets = h.buckets
-	if t.bucket.ptrdata == 0 {
+	if t.Bucket.PtrBytes == 0 {
 		// Allocate the current slice and remember pointers to both current and old.
 		// This preserves all relevant overflow buckets alive even if
 		// the table grows and/or overflow buckets are added to the table
@@ -892,15 +893,15 @@
 			// bucket hasn't been evacuated) then we need to iterate through the old
 			// bucket and only return the ones that will be migrated to this bucket.
 			oldbucket := bucket & it.h.oldbucketmask()
-			b = (*bmap)(add(h.oldbuckets, oldbucket*uintptr(t.bucketsize)))
+			b = (*bmap)(add(h.oldbuckets, oldbucket*uintptr(t.BucketSize)))
 			if !evacuated(b) {
 				checkBucket = bucket
 			} else {
-				b = (*bmap)(add(it.buckets, bucket*uintptr(t.bucketsize)))
+				b = (*bmap)(add(it.buckets, bucket*uintptr(t.BucketSize)))
 				checkBucket = noCheck
 			}
 		} else {
-			b = (*bmap)(add(it.buckets, bucket*uintptr(t.bucketsize)))
+			b = (*bmap)(add(it.buckets, bucket*uintptr(t.BucketSize)))
 			checkBucket = noCheck
 		}
 		bucket++
@@ -917,11 +918,11 @@
 			// in the middle of a bucket. It's feasible, just tricky.
 			continue
 		}
-		k := add(unsafe.Pointer(b), dataOffset+uintptr(offi)*uintptr(t.keysize))
-		if t.indirectkey() {
+		k := add(unsafe.Pointer(b), dataOffset+uintptr(offi)*uintptr(t.KeySize))
+		if t.IndirectKey() {
 			k = *((*unsafe.Pointer)(k))
 		}
-		e := add(unsafe.Pointer(b), dataOffset+bucketCnt*uintptr(t.keysize)+uintptr(offi)*uintptr(t.elemsize))
+		e := add(unsafe.Pointer(b), dataOffset+bucketCnt*uintptr(t.KeySize)+uintptr(offi)*uintptr(t.ValueSize))
 		if checkBucket != noCheck && !h.sameSizeGrow() {
 			// Special case: iterator was started during a grow to a larger size
 			// and the grow is not done yet. We're working on a bucket whose
@@ -930,10 +931,10 @@
 			// through the oldbucket, skipping any keys that will go
 			// to the other new bucket (each oldbucket expands to two
 			// buckets during a grow).
-			if t.reflexivekey() || t.key.equal(k, k) {
+			if t.ReflexiveKey() || t.Key.Equal(k, k) {
 				// If the item in the oldbucket is not destined for
 				// the current new bucket in the iteration, skip it.
-				hash := t.hasher(k, uintptr(h.hash0))
+				hash := t.Hasher(k, uintptr(h.hash0))
 				if hash&bucketMask(it.B) != checkBucket {
 					continue
 				}
@@ -951,13 +952,13 @@
 			}
 		}
 		if (b.tophash[offi] != evacuatedX && b.tophash[offi] != evacuatedY) ||
-			!(t.reflexivekey() || t.key.equal(k, k)) {
+			!(t.ReflexiveKey() || t.Key.Equal(k, k)) {
 			// This is the golden data, we can return it.
 			// OR
 			// key!=key, so the entry can't be deleted or updated, so we can just return it.
 			// That's lucky for us because when key!=key we can't look it up successfully.
 			it.key = k
-			if t.indirectelem() {
+			if t.IndirectElem() {
 				e = *((*unsafe.Pointer)(e))
 			}
 			it.elem = e
@@ -1007,6 +1008,22 @@
 
 	h.flags ^= hashWriting
 
+	// Mark buckets empty, so existing iterators can be terminated, see issue #59411.
+	markBucketsEmpty := func(bucket unsafe.Pointer, mask uintptr) {
+		for i := uintptr(0); i <= mask; i++ {
+			b := (*bmap)(add(bucket, i*uintptr(t.BucketSize)))
+			for ; b != nil; b = b.overflow(t) {
+				for i := uintptr(0); i < bucketCnt; i++ {
+					b.tophash[i] = emptyRest
+				}
+			}
+		}
+	}
+	markBucketsEmpty(h.buckets, bucketMask(h.B))
+	if oldBuckets := h.oldbuckets; oldBuckets != nil {
+		markBucketsEmpty(oldBuckets, h.oldbucketmask())
+	}
+
 	h.flags &^= sameSizeGrow
 	h.oldbuckets = nil
 	h.nevacuate = 0
@@ -1137,7 +1154,7 @@
 }
 
 func bucketEvacuated(t *maptype, h *hmap, bucket uintptr) bool {
-	b := (*bmap)(add(h.oldbuckets, bucket*uintptr(t.bucketsize)))
+	b := (*bmap)(add(h.oldbuckets, bucket*uintptr(t.BucketSize)))
 	return evacuated(b)
 }
 
@@ -1150,7 +1167,7 @@
 }
 
 func evacuate(t *maptype, h *hmap, oldbucket uintptr) {
-	b := (*bmap)(add(h.oldbuckets, oldbucket*uintptr(t.bucketsize)))
+	b := (*bmap)(add(h.oldbuckets, oldbucket*uintptr(t.BucketSize)))
 	newbit := h.noldbuckets()
 	if !evacuated(b) {
 		// TODO: reuse overflow buckets instead of using new ones, if there
@@ -1159,23 +1176,23 @@
 		// xy contains the x and y (low and high) evacuation destinations.
 		var xy [2]evacDst
 		x := &xy[0]
-		x.b = (*bmap)(add(h.buckets, oldbucket*uintptr(t.bucketsize)))
+		x.b = (*bmap)(add(h.buckets, oldbucket*uintptr(t.BucketSize)))
 		x.k = add(unsafe.Pointer(x.b), dataOffset)
-		x.e = add(x.k, bucketCnt*uintptr(t.keysize))
+		x.e = add(x.k, bucketCnt*uintptr(t.KeySize))
 
 		if !h.sameSizeGrow() {
 			// Only calculate y pointers if we're growing bigger.
 			// Otherwise GC can see bad pointers.
 			y := &xy[1]
-			y.b = (*bmap)(add(h.buckets, (oldbucket+newbit)*uintptr(t.bucketsize)))
+			y.b = (*bmap)(add(h.buckets, (oldbucket+newbit)*uintptr(t.BucketSize)))
 			y.k = add(unsafe.Pointer(y.b), dataOffset)
-			y.e = add(y.k, bucketCnt*uintptr(t.keysize))
+			y.e = add(y.k, bucketCnt*uintptr(t.KeySize))
 		}
 
 		for ; b != nil; b = b.overflow(t) {
 			k := add(unsafe.Pointer(b), dataOffset)
-			e := add(k, bucketCnt*uintptr(t.keysize))
-			for i := 0; i < bucketCnt; i, k, e = i+1, add(k, uintptr(t.keysize)), add(e, uintptr(t.elemsize)) {
+			e := add(k, bucketCnt*uintptr(t.KeySize))
+			for i := 0; i < bucketCnt; i, k, e = i+1, add(k, uintptr(t.KeySize)), add(e, uintptr(t.ValueSize)) {
 				top := b.tophash[i]
 				if isEmpty(top) {
 					b.tophash[i] = evacuatedEmpty
@@ -1185,15 +1202,15 @@
 					throw("bad map state")
 				}
 				k2 := k
-				if t.indirectkey() {
+				if t.IndirectKey() {
 					k2 = *((*unsafe.Pointer)(k2))
 				}
 				var useY uint8
 				if !h.sameSizeGrow() {
 					// Compute hash to make our evacuation decision (whether we need
 					// to send this key/elem to bucket x or bucket y).
-					hash := t.hasher(k2, uintptr(h.hash0))
-					if h.flags&iterator != 0 && !t.reflexivekey() && !t.key.equal(k2, k2) {
+					hash := t.Hasher(k2, uintptr(h.hash0))
+					if h.flags&iterator != 0 && !t.ReflexiveKey() && !t.Key.Equal(k2, k2) {
 						// If key != key (NaNs), then the hash could be (and probably
 						// will be) entirely different from the old hash. Moreover,
 						// it isn't reproducible. Reproducibility is required in the
@@ -1225,35 +1242,35 @@
 					dst.b = h.newoverflow(t, dst.b)
 					dst.i = 0
 					dst.k = add(unsafe.Pointer(dst.b), dataOffset)
-					dst.e = add(dst.k, bucketCnt*uintptr(t.keysize))
+					dst.e = add(dst.k, bucketCnt*uintptr(t.KeySize))
 				}
 				dst.b.tophash[dst.i&(bucketCnt-1)] = top // mask dst.i as an optimization, to avoid a bounds check
-				if t.indirectkey() {
+				if t.IndirectKey() {
 					*(*unsafe.Pointer)(dst.k) = k2 // copy pointer
 				} else {
-					typedmemmove(t.key, dst.k, k) // copy elem
+					typedmemmove(t.Key, dst.k, k) // copy elem
 				}
-				if t.indirectelem() {
+				if t.IndirectElem() {
 					*(*unsafe.Pointer)(dst.e) = *(*unsafe.Pointer)(e)
 				} else {
-					typedmemmove(t.elem, dst.e, e)
+					typedmemmove(t.Elem, dst.e, e)
 				}
 				dst.i++
 				// These updates might push these pointers past the end of the
 				// key or elem arrays.  That's ok, as we have the overflow pointer
 				// at the end of the bucket to protect against pointing past the
 				// end of the bucket.
-				dst.k = add(dst.k, uintptr(t.keysize))
-				dst.e = add(dst.e, uintptr(t.elemsize))
+				dst.k = add(dst.k, uintptr(t.KeySize))
+				dst.e = add(dst.e, uintptr(t.ValueSize))
 			}
 		}
 		// Unlink the overflow buckets & clear key/elem to help GC.
-		if h.flags&oldIterator == 0 && t.bucket.ptrdata != 0 {
-			b := add(h.oldbuckets, oldbucket*uintptr(t.bucketsize))
+		if h.flags&oldIterator == 0 && t.Bucket.PtrBytes != 0 {
+			b := add(h.oldbuckets, oldbucket*uintptr(t.BucketSize))
 			// Preserve b.tophash because the evacuation
 			// state is maintained there.
 			ptr := add(b, dataOffset)
-			n := uintptr(t.bucketsize) - dataOffset
+			n := uintptr(t.BucketSize) - dataOffset
 			memclrHasPointers(ptr, n)
 		}
 	}
@@ -1292,36 +1309,36 @@
 //go:linkname reflect_makemap reflect.makemap
 func reflect_makemap(t *maptype, cap int) *hmap {
 	// Check invariants and reflects math.
-	if t.key.equal == nil {
+	if t.Key.Equal == nil {
 		throw("runtime.reflect_makemap: unsupported map key type")
 	}
-	if t.key.size > maxKeySize && (!t.indirectkey() || t.keysize != uint8(goarch.PtrSize)) ||
-		t.key.size <= maxKeySize && (t.indirectkey() || t.keysize != uint8(t.key.size)) {
+	if t.Key.Size_ > maxKeySize && (!t.IndirectKey() || t.KeySize != uint8(goarch.PtrSize)) ||
+		t.Key.Size_ <= maxKeySize && (t.IndirectKey() || t.KeySize != uint8(t.Key.Size_)) {
 		throw("key size wrong")
 	}
-	if t.elem.size > maxElemSize && (!t.indirectelem() || t.elemsize != uint8(goarch.PtrSize)) ||
-		t.elem.size <= maxElemSize && (t.indirectelem() || t.elemsize != uint8(t.elem.size)) {
+	if t.Elem.Size_ > maxElemSize && (!t.IndirectElem() || t.ValueSize != uint8(goarch.PtrSize)) ||
+		t.Elem.Size_ <= maxElemSize && (t.IndirectElem() || t.ValueSize != uint8(t.Elem.Size_)) {
 		throw("elem size wrong")
 	}
-	if t.key.align > bucketCnt {
+	if t.Key.Align_ > bucketCnt {
 		throw("key align too big")
 	}
-	if t.elem.align > bucketCnt {
+	if t.Elem.Align_ > bucketCnt {
 		throw("elem align too big")
 	}
-	if t.key.size%uintptr(t.key.align) != 0 {
+	if t.Key.Size_%uintptr(t.Key.Align_) != 0 {
 		throw("key size not a multiple of key align")
 	}
-	if t.elem.size%uintptr(t.elem.align) != 0 {
+	if t.Elem.Size_%uintptr(t.Elem.Align_) != 0 {
 		throw("elem size not a multiple of elem align")
 	}
 	if bucketCnt < 8 {
 		throw("bucketsize too small for proper alignment")
 	}
-	if dataOffset%uintptr(t.key.align) != 0 {
+	if dataOffset%uintptr(t.Key.Align_) != 0 {
 		throw("need padding in bucket (key)")
 	}
-	if dataOffset%uintptr(t.elem.align) != 0 {
+	if dataOffset%uintptr(t.Elem.Align_) != 0 {
 		throw("need padding in bucket (elem)")
 	}
 
@@ -1348,16 +1365,16 @@
 	return elem
 }
 
-//go:linkname reflect_mapassign reflect.mapassign
+//go:linkname reflect_mapassign reflect.mapassign0
 func reflect_mapassign(t *maptype, h *hmap, key unsafe.Pointer, elem unsafe.Pointer) {
 	p := mapassign(t, h, key)
-	typedmemmove(t.elem, p, elem)
+	typedmemmove(t.Elem, p, elem)
 }
 
-//go:linkname reflect_mapassign_faststr reflect.mapassign_faststr
+//go:linkname reflect_mapassign_faststr reflect.mapassign_faststr0
 func reflect_mapassign_faststr(t *maptype, h *hmap, key string, elem unsafe.Pointer) {
 	p := mapassign_faststr(t, h, key)
-	typedmemmove(t.elem, p, elem)
+	typedmemmove(t.Elem, p, elem)
 }
 
 //go:linkname reflect_mapdelete reflect.mapdelete
@@ -1402,6 +1419,11 @@
 	return h.count
 }
 
+//go:linkname reflect_mapclear reflect.mapclear
+func reflect_mapclear(t *maptype, h *hmap) {
+	mapclear(t, h)
+}
+
 //go:linkname reflectlite_maplen internal/reflectlite.maplen
 func reflectlite_maplen(h *hmap) int {
 	if h == nil {
@@ -1416,3 +1438,287 @@
 
 const maxZero = 1024 // must match value in reflect/value.go:maxZero cmd/compile/internal/gc/walk.go:zeroValSize
 var zeroVal [maxZero]byte
+
+// mapinitnoop is a no-op function known the Go linker; if a given global
+// map (of the right size) is determined to be dead, the linker will
+// rewrite the relocation (from the package init func) from the outlined
+// map init function to this symbol. Defined in assembly so as to avoid
+// complications with instrumentation (coverage, etc).
+func mapinitnoop()
+
+// mapclone for implementing maps.Clone
+//
+//go:linkname mapclone maps.clone
+func mapclone(m any) any {
+	e := efaceOf(&m)
+	e.data = unsafe.Pointer(mapclone2((*maptype)(unsafe.Pointer(e._type)), (*hmap)(e.data)))
+	return m
+}
+
+// moveToBmap moves a bucket from src to dst. It returns the destination bucket or new destination bucket if it overflows
+// and the pos that the next key/value will be written, if pos == bucketCnt means needs to written in overflow bucket.
+func moveToBmap(t *maptype, h *hmap, dst *bmap, pos int, src *bmap) (*bmap, int) {
+	for i := 0; i < bucketCnt; i++ {
+		if isEmpty(src.tophash[i]) {
+			continue
+		}
+
+		for ; pos < bucketCnt; pos++ {
+			if isEmpty(dst.tophash[pos]) {
+				break
+			}
+		}
+
+		if pos == bucketCnt {
+			dst = h.newoverflow(t, dst)
+			pos = 0
+		}
+
+		srcK := add(unsafe.Pointer(src), dataOffset+uintptr(i)*uintptr(t.KeySize))
+		srcEle := add(unsafe.Pointer(src), dataOffset+bucketCnt*uintptr(t.KeySize)+uintptr(i)*uintptr(t.ValueSize))
+		dstK := add(unsafe.Pointer(dst), dataOffset+uintptr(pos)*uintptr(t.KeySize))
+		dstEle := add(unsafe.Pointer(dst), dataOffset+bucketCnt*uintptr(t.KeySize)+uintptr(pos)*uintptr(t.ValueSize))
+
+		dst.tophash[pos] = src.tophash[i]
+		if t.IndirectKey() {
+			*(*unsafe.Pointer)(dstK) = *(*unsafe.Pointer)(srcK)
+		} else {
+			typedmemmove(t.Key, dstK, srcK)
+		}
+		if t.IndirectElem() {
+			*(*unsafe.Pointer)(dstEle) = *(*unsafe.Pointer)(srcEle)
+		} else {
+			typedmemmove(t.Elem, dstEle, srcEle)
+		}
+		pos++
+		h.count++
+	}
+	return dst, pos
+}
+
+func mapclone2(t *maptype, src *hmap) *hmap {
+	dst := makemap(t, src.count, nil)
+	dst.hash0 = src.hash0
+	dst.nevacuate = 0
+	//flags do not need to be copied here, just like a new map has no flags.
+
+	if src.count == 0 {
+		return dst
+	}
+
+	if src.flags&hashWriting != 0 {
+		fatal("concurrent map clone and map write")
+	}
+
+	if src.B == 0 {
+		dst.buckets = newobject(t.Bucket)
+		dst.count = src.count
+		typedmemmove(t.Bucket, dst.buckets, src.buckets)
+		return dst
+	}
+
+	//src.B != 0
+	if dst.B == 0 {
+		dst.buckets = newobject(t.Bucket)
+	}
+	dstArraySize := int(bucketShift(dst.B))
+	srcArraySize := int(bucketShift(src.B))
+	for i := 0; i < dstArraySize; i++ {
+		dstBmap := (*bmap)(add(dst.buckets, uintptr(i*int(t.BucketSize))))
+		pos := 0
+		for j := 0; j < srcArraySize; j += dstArraySize {
+			srcBmap := (*bmap)(add(src.buckets, uintptr((i+j)*int(t.BucketSize))))
+			for srcBmap != nil {
+				dstBmap, pos = moveToBmap(t, dst, dstBmap, pos, srcBmap)
+				srcBmap = srcBmap.overflow(t)
+			}
+		}
+	}
+
+	if src.oldbuckets == nil {
+		return dst
+	}
+
+	oldB := src.B
+	srcOldbuckets := src.oldbuckets
+	if !src.sameSizeGrow() {
+		oldB--
+	}
+	oldSrcArraySize := int(bucketShift(oldB))
+
+	for i := 0; i < oldSrcArraySize; i++ {
+		srcBmap := (*bmap)(add(srcOldbuckets, uintptr(i*int(t.BucketSize))))
+		if evacuated(srcBmap) {
+			continue
+		}
+
+		if oldB >= dst.B { // main bucket bits in dst is less than oldB bits in src
+			dstBmap := (*bmap)(add(dst.buckets, (uintptr(i)&bucketMask(dst.B))*uintptr(t.BucketSize)))
+			for dstBmap.overflow(t) != nil {
+				dstBmap = dstBmap.overflow(t)
+			}
+			pos := 0
+			for srcBmap != nil {
+				dstBmap, pos = moveToBmap(t, dst, dstBmap, pos, srcBmap)
+				srcBmap = srcBmap.overflow(t)
+			}
+			continue
+		}
+
+		for srcBmap != nil {
+			// move from oldBlucket to new bucket
+			for i := uintptr(0); i < bucketCnt; i++ {
+				if isEmpty(srcBmap.tophash[i]) {
+					continue
+				}
+
+				if src.flags&hashWriting != 0 {
+					fatal("concurrent map clone and map write")
+				}
+
+				srcK := add(unsafe.Pointer(srcBmap), dataOffset+i*uintptr(t.KeySize))
+				if t.IndirectKey() {
+					srcK = *((*unsafe.Pointer)(srcK))
+				}
+
+				srcEle := add(unsafe.Pointer(srcBmap), dataOffset+bucketCnt*uintptr(t.KeySize)+i*uintptr(t.ValueSize))
+				if t.IndirectElem() {
+					srcEle = *((*unsafe.Pointer)(srcEle))
+				}
+				dstEle := mapassign(t, dst, srcK)
+				typedmemmove(t.Elem, dstEle, srcEle)
+			}
+			srcBmap = srcBmap.overflow(t)
+		}
+	}
+	return dst
+}
+
+// keys for implementing maps.keys
+//
+//go:linkname keys maps.keys
+func keys(m any, p unsafe.Pointer) {
+	e := efaceOf(&m)
+	t := (*maptype)(unsafe.Pointer(e._type))
+	h := (*hmap)(e.data)
+
+	if h == nil || h.count == 0 {
+		return
+	}
+	s := (*slice)(p)
+	r := int(fastrand())
+	offset := uint8(r >> h.B & (bucketCnt - 1))
+	if h.B == 0 {
+		copyKeys(t, h, (*bmap)(h.buckets), s, offset)
+		return
+	}
+	arraySize := int(bucketShift(h.B))
+	buckets := h.buckets
+	for i := 0; i < arraySize; i++ {
+		bucket := (i + r) & (arraySize - 1)
+		b := (*bmap)(add(buckets, uintptr(bucket)*uintptr(t.BucketSize)))
+		copyKeys(t, h, b, s, offset)
+	}
+
+	if h.growing() {
+		oldArraySize := int(h.noldbuckets())
+		for i := 0; i < oldArraySize; i++ {
+			bucket := (i + r) & (oldArraySize - 1)
+			b := (*bmap)(add(h.oldbuckets, uintptr(bucket)*uintptr(t.BucketSize)))
+			if evacuated(b) {
+				continue
+			}
+			copyKeys(t, h, b, s, offset)
+		}
+	}
+	return
+}
+
+func copyKeys(t *maptype, h *hmap, b *bmap, s *slice, offset uint8) {
+	for b != nil {
+		for i := uintptr(0); i < bucketCnt; i++ {
+			offi := (i + uintptr(offset)) & (bucketCnt - 1)
+			if isEmpty(b.tophash[offi]) {
+				continue
+			}
+			if h.flags&hashWriting != 0 {
+				fatal("concurrent map read and map write")
+			}
+			k := add(unsafe.Pointer(b), dataOffset+offi*uintptr(t.KeySize))
+			if t.IndirectKey() {
+				k = *((*unsafe.Pointer)(k))
+			}
+			if s.len >= s.cap {
+				fatal("concurrent map read and map write")
+			}
+			typedmemmove(t.Key, add(s.array, uintptr(s.len)*uintptr(t.KeySize)), k)
+			s.len++
+		}
+		b = b.overflow(t)
+	}
+}
+
+// values for implementing maps.values
+//
+//go:linkname values maps.values
+func values(m any, p unsafe.Pointer) {
+	e := efaceOf(&m)
+	t := (*maptype)(unsafe.Pointer(e._type))
+	h := (*hmap)(e.data)
+	if h == nil || h.count == 0 {
+		return
+	}
+	s := (*slice)(p)
+	r := int(fastrand())
+	offset := uint8(r >> h.B & (bucketCnt - 1))
+	if h.B == 0 {
+		copyValues(t, h, (*bmap)(h.buckets), s, offset)
+		return
+	}
+	arraySize := int(bucketShift(h.B))
+	buckets := h.buckets
+	for i := 0; i < arraySize; i++ {
+		bucket := (i + r) & (arraySize - 1)
+		b := (*bmap)(add(buckets, uintptr(bucket)*uintptr(t.BucketSize)))
+		copyValues(t, h, b, s, offset)
+	}
+
+	if h.growing() {
+		oldArraySize := int(h.noldbuckets())
+		for i := 0; i < oldArraySize; i++ {
+			bucket := (i + r) & (oldArraySize - 1)
+			b := (*bmap)(add(h.oldbuckets, uintptr(bucket)*uintptr(t.BucketSize)))
+			if evacuated(b) {
+				continue
+			}
+			copyValues(t, h, b, s, offset)
+		}
+	}
+	return
+}
+
+func copyValues(t *maptype, h *hmap, b *bmap, s *slice, offset uint8) {
+	for b != nil {
+		for i := uintptr(0); i < bucketCnt; i++ {
+			offi := (i + uintptr(offset)) & (bucketCnt - 1)
+			if isEmpty(b.tophash[offi]) {
+				continue
+			}
+
+			if h.flags&hashWriting != 0 {
+				fatal("concurrent map read and map write")
+			}
+
+			ele := add(unsafe.Pointer(b), dataOffset+bucketCnt*uintptr(t.KeySize)+offi*uintptr(t.ValueSize))
+			if t.IndirectElem() {
+				ele = *((*unsafe.Pointer)(ele))
+			}
+			if s.len >= s.cap {
+				fatal("concurrent map read and map write")
+			}
+			typedmemmove(t.Elem, add(s.array, uintptr(s.len)*uintptr(t.ValueSize)), ele)
+			s.len++
+		}
+		b = b.overflow(t)
+	}
+}
diff --git a/src/runtime/map_fast32.go b/src/runtime/map_fast32.go
index 01ea330..d10dca3 100644
--- a/src/runtime/map_fast32.go
+++ b/src/runtime/map_fast32.go
@@ -26,15 +26,15 @@
 		// One-bucket table. No need to hash.
 		b = (*bmap)(h.buckets)
 	} else {
-		hash := t.hasher(noescape(unsafe.Pointer(&key)), uintptr(h.hash0))
+		hash := t.Hasher(noescape(unsafe.Pointer(&key)), uintptr(h.hash0))
 		m := bucketMask(h.B)
-		b = (*bmap)(add(h.buckets, (hash&m)*uintptr(t.bucketsize)))
+		b = (*bmap)(add(h.buckets, (hash&m)*uintptr(t.BucketSize)))
 		if c := h.oldbuckets; c != nil {
 			if !h.sameSizeGrow() {
 				// There used to be half as many buckets; mask down one more power of two.
 				m >>= 1
 			}
-			oldb := (*bmap)(add(c, (hash&m)*uintptr(t.bucketsize)))
+			oldb := (*bmap)(add(c, (hash&m)*uintptr(t.BucketSize)))
 			if !evacuated(oldb) {
 				b = oldb
 			}
@@ -43,7 +43,7 @@
 	for ; b != nil; b = b.overflow(t) {
 		for i, k := uintptr(0), b.keys(); i < bucketCnt; i, k = i+1, add(k, 4) {
 			if *(*uint32)(k) == key && !isEmpty(b.tophash[i]) {
-				return add(unsafe.Pointer(b), dataOffset+bucketCnt*4+i*uintptr(t.elemsize))
+				return add(unsafe.Pointer(b), dataOffset+bucketCnt*4+i*uintptr(t.ValueSize))
 			}
 		}
 	}
@@ -66,15 +66,15 @@
 		// One-bucket table. No need to hash.
 		b = (*bmap)(h.buckets)
 	} else {
-		hash := t.hasher(noescape(unsafe.Pointer(&key)), uintptr(h.hash0))
+		hash := t.Hasher(noescape(unsafe.Pointer(&key)), uintptr(h.hash0))
 		m := bucketMask(h.B)
-		b = (*bmap)(add(h.buckets, (hash&m)*uintptr(t.bucketsize)))
+		b = (*bmap)(add(h.buckets, (hash&m)*uintptr(t.BucketSize)))
 		if c := h.oldbuckets; c != nil {
 			if !h.sameSizeGrow() {
 				// There used to be half as many buckets; mask down one more power of two.
 				m >>= 1
 			}
-			oldb := (*bmap)(add(c, (hash&m)*uintptr(t.bucketsize)))
+			oldb := (*bmap)(add(c, (hash&m)*uintptr(t.BucketSize)))
 			if !evacuated(oldb) {
 				b = oldb
 			}
@@ -83,7 +83,7 @@
 	for ; b != nil; b = b.overflow(t) {
 		for i, k := uintptr(0), b.keys(); i < bucketCnt; i, k = i+1, add(k, 4) {
 			if *(*uint32)(k) == key && !isEmpty(b.tophash[i]) {
-				return add(unsafe.Pointer(b), dataOffset+bucketCnt*4+i*uintptr(t.elemsize)), true
+				return add(unsafe.Pointer(b), dataOffset+bucketCnt*4+i*uintptr(t.ValueSize)), true
 			}
 		}
 	}
@@ -101,13 +101,13 @@
 	if h.flags&hashWriting != 0 {
 		fatal("concurrent map writes")
 	}
-	hash := t.hasher(noescape(unsafe.Pointer(&key)), uintptr(h.hash0))
+	hash := t.Hasher(noescape(unsafe.Pointer(&key)), uintptr(h.hash0))
 
 	// Set hashWriting after calling t.hasher for consistency with mapassign.
 	h.flags ^= hashWriting
 
 	if h.buckets == nil {
-		h.buckets = newobject(t.bucket) // newarray(t.bucket, 1)
+		h.buckets = newobject(t.Bucket) // newarray(t.bucket, 1)
 	}
 
 again:
@@ -115,7 +115,7 @@
 	if h.growing() {
 		growWork_fast32(t, h, bucket)
 	}
-	b := (*bmap)(add(h.buckets, bucket*uintptr(t.bucketsize)))
+	b := (*bmap)(add(h.buckets, bucket*uintptr(t.BucketSize)))
 
 	var insertb *bmap
 	var inserti uintptr
@@ -172,7 +172,7 @@
 	h.count++
 
 done:
-	elem := add(unsafe.Pointer(insertb), dataOffset+bucketCnt*4+inserti*uintptr(t.elemsize))
+	elem := add(unsafe.Pointer(insertb), dataOffset+bucketCnt*4+inserti*uintptr(t.ValueSize))
 	if h.flags&hashWriting == 0 {
 		fatal("concurrent map writes")
 	}
@@ -191,13 +191,13 @@
 	if h.flags&hashWriting != 0 {
 		fatal("concurrent map writes")
 	}
-	hash := t.hasher(noescape(unsafe.Pointer(&key)), uintptr(h.hash0))
+	hash := t.Hasher(noescape(unsafe.Pointer(&key)), uintptr(h.hash0))
 
 	// Set hashWriting after calling t.hasher for consistency with mapassign.
 	h.flags ^= hashWriting
 
 	if h.buckets == nil {
-		h.buckets = newobject(t.bucket) // newarray(t.bucket, 1)
+		h.buckets = newobject(t.Bucket) // newarray(t.bucket, 1)
 	}
 
 again:
@@ -205,7 +205,7 @@
 	if h.growing() {
 		growWork_fast32(t, h, bucket)
 	}
-	b := (*bmap)(add(h.buckets, bucket*uintptr(t.bucketsize)))
+	b := (*bmap)(add(h.buckets, bucket*uintptr(t.BucketSize)))
 
 	var insertb *bmap
 	var inserti uintptr
@@ -262,7 +262,7 @@
 	h.count++
 
 done:
-	elem := add(unsafe.Pointer(insertb), dataOffset+bucketCnt*4+inserti*uintptr(t.elemsize))
+	elem := add(unsafe.Pointer(insertb), dataOffset+bucketCnt*4+inserti*uintptr(t.ValueSize))
 	if h.flags&hashWriting == 0 {
 		fatal("concurrent map writes")
 	}
@@ -282,7 +282,7 @@
 		fatal("concurrent map writes")
 	}
 
-	hash := t.hasher(noescape(unsafe.Pointer(&key)), uintptr(h.hash0))
+	hash := t.Hasher(noescape(unsafe.Pointer(&key)), uintptr(h.hash0))
 
 	// Set hashWriting after calling t.hasher for consistency with mapdelete
 	h.flags ^= hashWriting
@@ -291,7 +291,7 @@
 	if h.growing() {
 		growWork_fast32(t, h, bucket)
 	}
-	b := (*bmap)(add(h.buckets, bucket*uintptr(t.bucketsize)))
+	b := (*bmap)(add(h.buckets, bucket*uintptr(t.BucketSize)))
 	bOrig := b
 search:
 	for ; b != nil; b = b.overflow(t) {
@@ -302,16 +302,16 @@
 			// Only clear key if there are pointers in it.
 			// This can only happen if pointers are 32 bit
 			// wide as 64 bit pointers do not fit into a 32 bit key.
-			if goarch.PtrSize == 4 && t.key.ptrdata != 0 {
+			if goarch.PtrSize == 4 && t.Key.PtrBytes != 0 {
 				// The key must be a pointer as we checked pointers are
 				// 32 bits wide and the key is 32 bits wide also.
 				*(*unsafe.Pointer)(k) = nil
 			}
-			e := add(unsafe.Pointer(b), dataOffset+bucketCnt*4+i*uintptr(t.elemsize))
-			if t.elem.ptrdata != 0 {
-				memclrHasPointers(e, t.elem.size)
+			e := add(unsafe.Pointer(b), dataOffset+bucketCnt*4+i*uintptr(t.ValueSize))
+			if t.Elem.PtrBytes != 0 {
+				memclrHasPointers(e, t.Elem.Size_)
 			} else {
-				memclrNoHeapPointers(e, t.elem.size)
+				memclrNoHeapPointers(e, t.Elem.Size_)
 			}
 			b.tophash[i] = emptyOne
 			// If the bucket now ends in a bunch of emptyOne states,
@@ -372,7 +372,7 @@
 }
 
 func evacuate_fast32(t *maptype, h *hmap, oldbucket uintptr) {
-	b := (*bmap)(add(h.oldbuckets, oldbucket*uintptr(t.bucketsize)))
+	b := (*bmap)(add(h.oldbuckets, oldbucket*uintptr(t.BucketSize)))
 	newbit := h.noldbuckets()
 	if !evacuated(b) {
 		// TODO: reuse overflow buckets instead of using new ones, if there
@@ -381,7 +381,7 @@
 		// xy contains the x and y (low and high) evacuation destinations.
 		var xy [2]evacDst
 		x := &xy[0]
-		x.b = (*bmap)(add(h.buckets, oldbucket*uintptr(t.bucketsize)))
+		x.b = (*bmap)(add(h.buckets, oldbucket*uintptr(t.BucketSize)))
 		x.k = add(unsafe.Pointer(x.b), dataOffset)
 		x.e = add(x.k, bucketCnt*4)
 
@@ -389,7 +389,7 @@
 			// Only calculate y pointers if we're growing bigger.
 			// Otherwise GC can see bad pointers.
 			y := &xy[1]
-			y.b = (*bmap)(add(h.buckets, (oldbucket+newbit)*uintptr(t.bucketsize)))
+			y.b = (*bmap)(add(h.buckets, (oldbucket+newbit)*uintptr(t.BucketSize)))
 			y.k = add(unsafe.Pointer(y.b), dataOffset)
 			y.e = add(y.k, bucketCnt*4)
 		}
@@ -397,7 +397,7 @@
 		for ; b != nil; b = b.overflow(t) {
 			k := add(unsafe.Pointer(b), dataOffset)
 			e := add(k, bucketCnt*4)
-			for i := 0; i < bucketCnt; i, k, e = i+1, add(k, 4), add(e, uintptr(t.elemsize)) {
+			for i := 0; i < bucketCnt; i, k, e = i+1, add(k, 4), add(e, uintptr(t.ValueSize)) {
 				top := b.tophash[i]
 				if isEmpty(top) {
 					b.tophash[i] = evacuatedEmpty
@@ -410,7 +410,7 @@
 				if !h.sameSizeGrow() {
 					// Compute hash to make our evacuation decision (whether we need
 					// to send this key/elem to bucket x or bucket y).
-					hash := t.hasher(k, uintptr(h.hash0))
+					hash := t.Hasher(k, uintptr(h.hash0))
 					if hash&newbit != 0 {
 						useY = 1
 					}
@@ -428,30 +428,30 @@
 				dst.b.tophash[dst.i&(bucketCnt-1)] = top // mask dst.i as an optimization, to avoid a bounds check
 
 				// Copy key.
-				if goarch.PtrSize == 4 && t.key.ptrdata != 0 && writeBarrier.enabled {
+				if goarch.PtrSize == 4 && t.Key.PtrBytes != 0 && writeBarrier.enabled {
 					// Write with a write barrier.
 					*(*unsafe.Pointer)(dst.k) = *(*unsafe.Pointer)(k)
 				} else {
 					*(*uint32)(dst.k) = *(*uint32)(k)
 				}
 
-				typedmemmove(t.elem, dst.e, e)
+				typedmemmove(t.Elem, dst.e, e)
 				dst.i++
 				// These updates might push these pointers past the end of the
 				// key or elem arrays.  That's ok, as we have the overflow pointer
 				// at the end of the bucket to protect against pointing past the
 				// end of the bucket.
 				dst.k = add(dst.k, 4)
-				dst.e = add(dst.e, uintptr(t.elemsize))
+				dst.e = add(dst.e, uintptr(t.ValueSize))
 			}
 		}
 		// Unlink the overflow buckets & clear key/elem to help GC.
-		if h.flags&oldIterator == 0 && t.bucket.ptrdata != 0 {
-			b := add(h.oldbuckets, oldbucket*uintptr(t.bucketsize))
+		if h.flags&oldIterator == 0 && t.Bucket.PtrBytes != 0 {
+			b := add(h.oldbuckets, oldbucket*uintptr(t.BucketSize))
 			// Preserve b.tophash because the evacuation
 			// state is maintained there.
 			ptr := add(b, dataOffset)
-			n := uintptr(t.bucketsize) - dataOffset
+			n := uintptr(t.BucketSize) - dataOffset
 			memclrHasPointers(ptr, n)
 		}
 	}
diff --git a/src/runtime/map_fast64.go b/src/runtime/map_fast64.go
index 2967360..d771e0b 100644
--- a/src/runtime/map_fast64.go
+++ b/src/runtime/map_fast64.go
@@ -26,15 +26,15 @@
 		// One-bucket table. No need to hash.
 		b = (*bmap)(h.buckets)
 	} else {
-		hash := t.hasher(noescape(unsafe.Pointer(&key)), uintptr(h.hash0))
+		hash := t.Hasher(noescape(unsafe.Pointer(&key)), uintptr(h.hash0))
 		m := bucketMask(h.B)
-		b = (*bmap)(add(h.buckets, (hash&m)*uintptr(t.bucketsize)))
+		b = (*bmap)(add(h.buckets, (hash&m)*uintptr(t.BucketSize)))
 		if c := h.oldbuckets; c != nil {
 			if !h.sameSizeGrow() {
 				// There used to be half as many buckets; mask down one more power of two.
 				m >>= 1
 			}
-			oldb := (*bmap)(add(c, (hash&m)*uintptr(t.bucketsize)))
+			oldb := (*bmap)(add(c, (hash&m)*uintptr(t.BucketSize)))
 			if !evacuated(oldb) {
 				b = oldb
 			}
@@ -43,7 +43,7 @@
 	for ; b != nil; b = b.overflow(t) {
 		for i, k := uintptr(0), b.keys(); i < bucketCnt; i, k = i+1, add(k, 8) {
 			if *(*uint64)(k) == key && !isEmpty(b.tophash[i]) {
-				return add(unsafe.Pointer(b), dataOffset+bucketCnt*8+i*uintptr(t.elemsize))
+				return add(unsafe.Pointer(b), dataOffset+bucketCnt*8+i*uintptr(t.ValueSize))
 			}
 		}
 	}
@@ -66,15 +66,15 @@
 		// One-bucket table. No need to hash.
 		b = (*bmap)(h.buckets)
 	} else {
-		hash := t.hasher(noescape(unsafe.Pointer(&key)), uintptr(h.hash0))
+		hash := t.Hasher(noescape(unsafe.Pointer(&key)), uintptr(h.hash0))
 		m := bucketMask(h.B)
-		b = (*bmap)(add(h.buckets, (hash&m)*uintptr(t.bucketsize)))
+		b = (*bmap)(add(h.buckets, (hash&m)*uintptr(t.BucketSize)))
 		if c := h.oldbuckets; c != nil {
 			if !h.sameSizeGrow() {
 				// There used to be half as many buckets; mask down one more power of two.
 				m >>= 1
 			}
-			oldb := (*bmap)(add(c, (hash&m)*uintptr(t.bucketsize)))
+			oldb := (*bmap)(add(c, (hash&m)*uintptr(t.BucketSize)))
 			if !evacuated(oldb) {
 				b = oldb
 			}
@@ -83,7 +83,7 @@
 	for ; b != nil; b = b.overflow(t) {
 		for i, k := uintptr(0), b.keys(); i < bucketCnt; i, k = i+1, add(k, 8) {
 			if *(*uint64)(k) == key && !isEmpty(b.tophash[i]) {
-				return add(unsafe.Pointer(b), dataOffset+bucketCnt*8+i*uintptr(t.elemsize)), true
+				return add(unsafe.Pointer(b), dataOffset+bucketCnt*8+i*uintptr(t.ValueSize)), true
 			}
 		}
 	}
@@ -101,13 +101,13 @@
 	if h.flags&hashWriting != 0 {
 		fatal("concurrent map writes")
 	}
-	hash := t.hasher(noescape(unsafe.Pointer(&key)), uintptr(h.hash0))
+	hash := t.Hasher(noescape(unsafe.Pointer(&key)), uintptr(h.hash0))
 
 	// Set hashWriting after calling t.hasher for consistency with mapassign.
 	h.flags ^= hashWriting
 
 	if h.buckets == nil {
-		h.buckets = newobject(t.bucket) // newarray(t.bucket, 1)
+		h.buckets = newobject(t.Bucket) // newarray(t.bucket, 1)
 	}
 
 again:
@@ -115,7 +115,7 @@
 	if h.growing() {
 		growWork_fast64(t, h, bucket)
 	}
-	b := (*bmap)(add(h.buckets, bucket*uintptr(t.bucketsize)))
+	b := (*bmap)(add(h.buckets, bucket*uintptr(t.BucketSize)))
 
 	var insertb *bmap
 	var inserti uintptr
@@ -172,7 +172,7 @@
 	h.count++
 
 done:
-	elem := add(unsafe.Pointer(insertb), dataOffset+bucketCnt*8+inserti*uintptr(t.elemsize))
+	elem := add(unsafe.Pointer(insertb), dataOffset+bucketCnt*8+inserti*uintptr(t.ValueSize))
 	if h.flags&hashWriting == 0 {
 		fatal("concurrent map writes")
 	}
@@ -191,13 +191,13 @@
 	if h.flags&hashWriting != 0 {
 		fatal("concurrent map writes")
 	}
-	hash := t.hasher(noescape(unsafe.Pointer(&key)), uintptr(h.hash0))
+	hash := t.Hasher(noescape(unsafe.Pointer(&key)), uintptr(h.hash0))
 
 	// Set hashWriting after calling t.hasher for consistency with mapassign.
 	h.flags ^= hashWriting
 
 	if h.buckets == nil {
-		h.buckets = newobject(t.bucket) // newarray(t.bucket, 1)
+		h.buckets = newobject(t.Bucket) // newarray(t.bucket, 1)
 	}
 
 again:
@@ -205,7 +205,7 @@
 	if h.growing() {
 		growWork_fast64(t, h, bucket)
 	}
-	b := (*bmap)(add(h.buckets, bucket*uintptr(t.bucketsize)))
+	b := (*bmap)(add(h.buckets, bucket*uintptr(t.BucketSize)))
 
 	var insertb *bmap
 	var inserti uintptr
@@ -262,7 +262,7 @@
 	h.count++
 
 done:
-	elem := add(unsafe.Pointer(insertb), dataOffset+bucketCnt*8+inserti*uintptr(t.elemsize))
+	elem := add(unsafe.Pointer(insertb), dataOffset+bucketCnt*8+inserti*uintptr(t.ValueSize))
 	if h.flags&hashWriting == 0 {
 		fatal("concurrent map writes")
 	}
@@ -282,7 +282,7 @@
 		fatal("concurrent map writes")
 	}
 
-	hash := t.hasher(noescape(unsafe.Pointer(&key)), uintptr(h.hash0))
+	hash := t.Hasher(noescape(unsafe.Pointer(&key)), uintptr(h.hash0))
 
 	// Set hashWriting after calling t.hasher for consistency with mapdelete
 	h.flags ^= hashWriting
@@ -291,7 +291,7 @@
 	if h.growing() {
 		growWork_fast64(t, h, bucket)
 	}
-	b := (*bmap)(add(h.buckets, bucket*uintptr(t.bucketsize)))
+	b := (*bmap)(add(h.buckets, bucket*uintptr(t.BucketSize)))
 	bOrig := b
 search:
 	for ; b != nil; b = b.overflow(t) {
@@ -300,20 +300,20 @@
 				continue
 			}
 			// Only clear key if there are pointers in it.
-			if t.key.ptrdata != 0 {
+			if t.Key.PtrBytes != 0 {
 				if goarch.PtrSize == 8 {
 					*(*unsafe.Pointer)(k) = nil
 				} else {
-					// There are three ways to squeeze at one ore more 32 bit pointers into 64 bits.
+					// There are three ways to squeeze at one or more 32 bit pointers into 64 bits.
 					// Just call memclrHasPointers instead of trying to handle all cases here.
 					memclrHasPointers(k, 8)
 				}
 			}
-			e := add(unsafe.Pointer(b), dataOffset+bucketCnt*8+i*uintptr(t.elemsize))
-			if t.elem.ptrdata != 0 {
-				memclrHasPointers(e, t.elem.size)
+			e := add(unsafe.Pointer(b), dataOffset+bucketCnt*8+i*uintptr(t.ValueSize))
+			if t.Elem.PtrBytes != 0 {
+				memclrHasPointers(e, t.Elem.Size_)
 			} else {
-				memclrNoHeapPointers(e, t.elem.size)
+				memclrNoHeapPointers(e, t.Elem.Size_)
 			}
 			b.tophash[i] = emptyOne
 			// If the bucket now ends in a bunch of emptyOne states,
@@ -374,7 +374,7 @@
 }
 
 func evacuate_fast64(t *maptype, h *hmap, oldbucket uintptr) {
-	b := (*bmap)(add(h.oldbuckets, oldbucket*uintptr(t.bucketsize)))
+	b := (*bmap)(add(h.oldbuckets, oldbucket*uintptr(t.BucketSize)))
 	newbit := h.noldbuckets()
 	if !evacuated(b) {
 		// TODO: reuse overflow buckets instead of using new ones, if there
@@ -383,7 +383,7 @@
 		// xy contains the x and y (low and high) evacuation destinations.
 		var xy [2]evacDst
 		x := &xy[0]
-		x.b = (*bmap)(add(h.buckets, oldbucket*uintptr(t.bucketsize)))
+		x.b = (*bmap)(add(h.buckets, oldbucket*uintptr(t.BucketSize)))
 		x.k = add(unsafe.Pointer(x.b), dataOffset)
 		x.e = add(x.k, bucketCnt*8)
 
@@ -391,7 +391,7 @@
 			// Only calculate y pointers if we're growing bigger.
 			// Otherwise GC can see bad pointers.
 			y := &xy[1]
-			y.b = (*bmap)(add(h.buckets, (oldbucket+newbit)*uintptr(t.bucketsize)))
+			y.b = (*bmap)(add(h.buckets, (oldbucket+newbit)*uintptr(t.BucketSize)))
 			y.k = add(unsafe.Pointer(y.b), dataOffset)
 			y.e = add(y.k, bucketCnt*8)
 		}
@@ -399,7 +399,7 @@
 		for ; b != nil; b = b.overflow(t) {
 			k := add(unsafe.Pointer(b), dataOffset)
 			e := add(k, bucketCnt*8)
-			for i := 0; i < bucketCnt; i, k, e = i+1, add(k, 8), add(e, uintptr(t.elemsize)) {
+			for i := 0; i < bucketCnt; i, k, e = i+1, add(k, 8), add(e, uintptr(t.ValueSize)) {
 				top := b.tophash[i]
 				if isEmpty(top) {
 					b.tophash[i] = evacuatedEmpty
@@ -412,7 +412,7 @@
 				if !h.sameSizeGrow() {
 					// Compute hash to make our evacuation decision (whether we need
 					// to send this key/elem to bucket x or bucket y).
-					hash := t.hasher(k, uintptr(h.hash0))
+					hash := t.Hasher(k, uintptr(h.hash0))
 					if hash&newbit != 0 {
 						useY = 1
 					}
@@ -430,36 +430,36 @@
 				dst.b.tophash[dst.i&(bucketCnt-1)] = top // mask dst.i as an optimization, to avoid a bounds check
 
 				// Copy key.
-				if t.key.ptrdata != 0 && writeBarrier.enabled {
+				if t.Key.PtrBytes != 0 && writeBarrier.enabled {
 					if goarch.PtrSize == 8 {
 						// Write with a write barrier.
 						*(*unsafe.Pointer)(dst.k) = *(*unsafe.Pointer)(k)
 					} else {
 						// There are three ways to squeeze at least one 32 bit pointer into 64 bits.
 						// Give up and call typedmemmove.
-						typedmemmove(t.key, dst.k, k)
+						typedmemmove(t.Key, dst.k, k)
 					}
 				} else {
 					*(*uint64)(dst.k) = *(*uint64)(k)
 				}
 
-				typedmemmove(t.elem, dst.e, e)
+				typedmemmove(t.Elem, dst.e, e)
 				dst.i++
 				// These updates might push these pointers past the end of the
 				// key or elem arrays.  That's ok, as we have the overflow pointer
 				// at the end of the bucket to protect against pointing past the
 				// end of the bucket.
 				dst.k = add(dst.k, 8)
-				dst.e = add(dst.e, uintptr(t.elemsize))
+				dst.e = add(dst.e, uintptr(t.ValueSize))
 			}
 		}
 		// Unlink the overflow buckets & clear key/elem to help GC.
-		if h.flags&oldIterator == 0 && t.bucket.ptrdata != 0 {
-			b := add(h.oldbuckets, oldbucket*uintptr(t.bucketsize))
+		if h.flags&oldIterator == 0 && t.Bucket.PtrBytes != 0 {
+			b := add(h.oldbuckets, oldbucket*uintptr(t.BucketSize))
 			// Preserve b.tophash because the evacuation
 			// state is maintained there.
 			ptr := add(b, dataOffset)
-			n := uintptr(t.bucketsize) - dataOffset
+			n := uintptr(t.BucketSize) - dataOffset
 			memclrHasPointers(ptr, n)
 		}
 	}
diff --git a/src/runtime/map_faststr.go b/src/runtime/map_faststr.go
index 006c24c..ef71da8 100644
--- a/src/runtime/map_faststr.go
+++ b/src/runtime/map_faststr.go
@@ -36,7 +36,7 @@
 					continue
 				}
 				if k.str == key.str || memequal(k.str, key.str, uintptr(key.len)) {
-					return add(unsafe.Pointer(b), dataOffset+bucketCnt*2*goarch.PtrSize+i*uintptr(t.elemsize))
+					return add(unsafe.Pointer(b), dataOffset+bucketCnt*2*goarch.PtrSize+i*uintptr(t.ValueSize))
 				}
 			}
 			return unsafe.Pointer(&zeroVal[0])
@@ -52,7 +52,7 @@
 				continue
 			}
 			if k.str == key.str {
-				return add(unsafe.Pointer(b), dataOffset+bucketCnt*2*goarch.PtrSize+i*uintptr(t.elemsize))
+				return add(unsafe.Pointer(b), dataOffset+bucketCnt*2*goarch.PtrSize+i*uintptr(t.ValueSize))
 			}
 			// check first 4 bytes
 			if *((*[4]byte)(key.str)) != *((*[4]byte)(k.str)) {
@@ -71,21 +71,21 @@
 		if keymaybe != bucketCnt {
 			k := (*stringStruct)(add(unsafe.Pointer(b), dataOffset+keymaybe*2*goarch.PtrSize))
 			if memequal(k.str, key.str, uintptr(key.len)) {
-				return add(unsafe.Pointer(b), dataOffset+bucketCnt*2*goarch.PtrSize+keymaybe*uintptr(t.elemsize))
+				return add(unsafe.Pointer(b), dataOffset+bucketCnt*2*goarch.PtrSize+keymaybe*uintptr(t.ValueSize))
 			}
 		}
 		return unsafe.Pointer(&zeroVal[0])
 	}
 dohash:
-	hash := t.hasher(noescape(unsafe.Pointer(&ky)), uintptr(h.hash0))
+	hash := t.Hasher(noescape(unsafe.Pointer(&ky)), uintptr(h.hash0))
 	m := bucketMask(h.B)
-	b := (*bmap)(add(h.buckets, (hash&m)*uintptr(t.bucketsize)))
+	b := (*bmap)(add(h.buckets, (hash&m)*uintptr(t.BucketSize)))
 	if c := h.oldbuckets; c != nil {
 		if !h.sameSizeGrow() {
 			// There used to be half as many buckets; mask down one more power of two.
 			m >>= 1
 		}
-		oldb := (*bmap)(add(c, (hash&m)*uintptr(t.bucketsize)))
+		oldb := (*bmap)(add(c, (hash&m)*uintptr(t.BucketSize)))
 		if !evacuated(oldb) {
 			b = oldb
 		}
@@ -98,7 +98,7 @@
 				continue
 			}
 			if k.str == key.str || memequal(k.str, key.str, uintptr(key.len)) {
-				return add(unsafe.Pointer(b), dataOffset+bucketCnt*2*goarch.PtrSize+i*uintptr(t.elemsize))
+				return add(unsafe.Pointer(b), dataOffset+bucketCnt*2*goarch.PtrSize+i*uintptr(t.ValueSize))
 			}
 		}
 	}
@@ -131,7 +131,7 @@
 					continue
 				}
 				if k.str == key.str || memequal(k.str, key.str, uintptr(key.len)) {
-					return add(unsafe.Pointer(b), dataOffset+bucketCnt*2*goarch.PtrSize+i*uintptr(t.elemsize)), true
+					return add(unsafe.Pointer(b), dataOffset+bucketCnt*2*goarch.PtrSize+i*uintptr(t.ValueSize)), true
 				}
 			}
 			return unsafe.Pointer(&zeroVal[0]), false
@@ -147,7 +147,7 @@
 				continue
 			}
 			if k.str == key.str {
-				return add(unsafe.Pointer(b), dataOffset+bucketCnt*2*goarch.PtrSize+i*uintptr(t.elemsize)), true
+				return add(unsafe.Pointer(b), dataOffset+bucketCnt*2*goarch.PtrSize+i*uintptr(t.ValueSize)), true
 			}
 			// check first 4 bytes
 			if *((*[4]byte)(key.str)) != *((*[4]byte)(k.str)) {
@@ -166,21 +166,21 @@
 		if keymaybe != bucketCnt {
 			k := (*stringStruct)(add(unsafe.Pointer(b), dataOffset+keymaybe*2*goarch.PtrSize))
 			if memequal(k.str, key.str, uintptr(key.len)) {
-				return add(unsafe.Pointer(b), dataOffset+bucketCnt*2*goarch.PtrSize+keymaybe*uintptr(t.elemsize)), true
+				return add(unsafe.Pointer(b), dataOffset+bucketCnt*2*goarch.PtrSize+keymaybe*uintptr(t.ValueSize)), true
 			}
 		}
 		return unsafe.Pointer(&zeroVal[0]), false
 	}
 dohash:
-	hash := t.hasher(noescape(unsafe.Pointer(&ky)), uintptr(h.hash0))
+	hash := t.Hasher(noescape(unsafe.Pointer(&ky)), uintptr(h.hash0))
 	m := bucketMask(h.B)
-	b := (*bmap)(add(h.buckets, (hash&m)*uintptr(t.bucketsize)))
+	b := (*bmap)(add(h.buckets, (hash&m)*uintptr(t.BucketSize)))
 	if c := h.oldbuckets; c != nil {
 		if !h.sameSizeGrow() {
 			// There used to be half as many buckets; mask down one more power of two.
 			m >>= 1
 		}
-		oldb := (*bmap)(add(c, (hash&m)*uintptr(t.bucketsize)))
+		oldb := (*bmap)(add(c, (hash&m)*uintptr(t.BucketSize)))
 		if !evacuated(oldb) {
 			b = oldb
 		}
@@ -193,7 +193,7 @@
 				continue
 			}
 			if k.str == key.str || memequal(k.str, key.str, uintptr(key.len)) {
-				return add(unsafe.Pointer(b), dataOffset+bucketCnt*2*goarch.PtrSize+i*uintptr(t.elemsize)), true
+				return add(unsafe.Pointer(b), dataOffset+bucketCnt*2*goarch.PtrSize+i*uintptr(t.ValueSize)), true
 			}
 		}
 	}
@@ -212,13 +212,13 @@
 		fatal("concurrent map writes")
 	}
 	key := stringStructOf(&s)
-	hash := t.hasher(noescape(unsafe.Pointer(&s)), uintptr(h.hash0))
+	hash := t.Hasher(noescape(unsafe.Pointer(&s)), uintptr(h.hash0))
 
 	// Set hashWriting after calling t.hasher for consistency with mapassign.
 	h.flags ^= hashWriting
 
 	if h.buckets == nil {
-		h.buckets = newobject(t.bucket) // newarray(t.bucket, 1)
+		h.buckets = newobject(t.Bucket) // newarray(t.bucket, 1)
 	}
 
 again:
@@ -226,7 +226,7 @@
 	if h.growing() {
 		growWork_faststr(t, h, bucket)
 	}
-	b := (*bmap)(add(h.buckets, bucket*uintptr(t.bucketsize)))
+	b := (*bmap)(add(h.buckets, bucket*uintptr(t.BucketSize)))
 	top := tophash(hash)
 
 	var insertb *bmap
@@ -290,7 +290,7 @@
 	h.count++
 
 done:
-	elem := add(unsafe.Pointer(insertb), dataOffset+bucketCnt*2*goarch.PtrSize+inserti*uintptr(t.elemsize))
+	elem := add(unsafe.Pointer(insertb), dataOffset+bucketCnt*2*goarch.PtrSize+inserti*uintptr(t.ValueSize))
 	if h.flags&hashWriting == 0 {
 		fatal("concurrent map writes")
 	}
@@ -311,7 +311,7 @@
 	}
 
 	key := stringStructOf(&ky)
-	hash := t.hasher(noescape(unsafe.Pointer(&ky)), uintptr(h.hash0))
+	hash := t.Hasher(noescape(unsafe.Pointer(&ky)), uintptr(h.hash0))
 
 	// Set hashWriting after calling t.hasher for consistency with mapdelete
 	h.flags ^= hashWriting
@@ -320,7 +320,7 @@
 	if h.growing() {
 		growWork_faststr(t, h, bucket)
 	}
-	b := (*bmap)(add(h.buckets, bucket*uintptr(t.bucketsize)))
+	b := (*bmap)(add(h.buckets, bucket*uintptr(t.BucketSize)))
 	bOrig := b
 	top := tophash(hash)
 search:
@@ -335,11 +335,11 @@
 			}
 			// Clear key's pointer.
 			k.str = nil
-			e := add(unsafe.Pointer(b), dataOffset+bucketCnt*2*goarch.PtrSize+i*uintptr(t.elemsize))
-			if t.elem.ptrdata != 0 {
-				memclrHasPointers(e, t.elem.size)
+			e := add(unsafe.Pointer(b), dataOffset+bucketCnt*2*goarch.PtrSize+i*uintptr(t.ValueSize))
+			if t.Elem.PtrBytes != 0 {
+				memclrHasPointers(e, t.Elem.Size_)
 			} else {
-				memclrNoHeapPointers(e, t.elem.size)
+				memclrNoHeapPointers(e, t.Elem.Size_)
 			}
 			b.tophash[i] = emptyOne
 			// If the bucket now ends in a bunch of emptyOne states,
@@ -400,7 +400,7 @@
 }
 
 func evacuate_faststr(t *maptype, h *hmap, oldbucket uintptr) {
-	b := (*bmap)(add(h.oldbuckets, oldbucket*uintptr(t.bucketsize)))
+	b := (*bmap)(add(h.oldbuckets, oldbucket*uintptr(t.BucketSize)))
 	newbit := h.noldbuckets()
 	if !evacuated(b) {
 		// TODO: reuse overflow buckets instead of using new ones, if there
@@ -409,7 +409,7 @@
 		// xy contains the x and y (low and high) evacuation destinations.
 		var xy [2]evacDst
 		x := &xy[0]
-		x.b = (*bmap)(add(h.buckets, oldbucket*uintptr(t.bucketsize)))
+		x.b = (*bmap)(add(h.buckets, oldbucket*uintptr(t.BucketSize)))
 		x.k = add(unsafe.Pointer(x.b), dataOffset)
 		x.e = add(x.k, bucketCnt*2*goarch.PtrSize)
 
@@ -417,7 +417,7 @@
 			// Only calculate y pointers if we're growing bigger.
 			// Otherwise GC can see bad pointers.
 			y := &xy[1]
-			y.b = (*bmap)(add(h.buckets, (oldbucket+newbit)*uintptr(t.bucketsize)))
+			y.b = (*bmap)(add(h.buckets, (oldbucket+newbit)*uintptr(t.BucketSize)))
 			y.k = add(unsafe.Pointer(y.b), dataOffset)
 			y.e = add(y.k, bucketCnt*2*goarch.PtrSize)
 		}
@@ -425,7 +425,7 @@
 		for ; b != nil; b = b.overflow(t) {
 			k := add(unsafe.Pointer(b), dataOffset)
 			e := add(k, bucketCnt*2*goarch.PtrSize)
-			for i := 0; i < bucketCnt; i, k, e = i+1, add(k, 2*goarch.PtrSize), add(e, uintptr(t.elemsize)) {
+			for i := 0; i < bucketCnt; i, k, e = i+1, add(k, 2*goarch.PtrSize), add(e, uintptr(t.ValueSize)) {
 				top := b.tophash[i]
 				if isEmpty(top) {
 					b.tophash[i] = evacuatedEmpty
@@ -438,7 +438,7 @@
 				if !h.sameSizeGrow() {
 					// Compute hash to make our evacuation decision (whether we need
 					// to send this key/elem to bucket x or bucket y).
-					hash := t.hasher(k, uintptr(h.hash0))
+					hash := t.Hasher(k, uintptr(h.hash0))
 					if hash&newbit != 0 {
 						useY = 1
 					}
@@ -458,23 +458,23 @@
 				// Copy key.
 				*(*string)(dst.k) = *(*string)(k)
 
-				typedmemmove(t.elem, dst.e, e)
+				typedmemmove(t.Elem, dst.e, e)
 				dst.i++
 				// These updates might push these pointers past the end of the
 				// key or elem arrays.  That's ok, as we have the overflow pointer
 				// at the end of the bucket to protect against pointing past the
 				// end of the bucket.
 				dst.k = add(dst.k, 2*goarch.PtrSize)
-				dst.e = add(dst.e, uintptr(t.elemsize))
+				dst.e = add(dst.e, uintptr(t.ValueSize))
 			}
 		}
 		// Unlink the overflow buckets & clear key/elem to help GC.
-		if h.flags&oldIterator == 0 && t.bucket.ptrdata != 0 {
-			b := add(h.oldbuckets, oldbucket*uintptr(t.bucketsize))
+		if h.flags&oldIterator == 0 && t.Bucket.PtrBytes != 0 {
+			b := add(h.oldbuckets, oldbucket*uintptr(t.BucketSize))
 			// Preserve b.tophash because the evacuation
 			// state is maintained there.
 			ptr := add(b, dataOffset)
-			n := uintptr(t.bucketsize) - dataOffset
+			n := uintptr(t.BucketSize) - dataOffset
 			memclrHasPointers(ptr, n)
 		}
 	}
diff --git a/src/runtime/map_test.go b/src/runtime/map_test.go
index 4afbae6..3675106 100644
--- a/src/runtime/map_test.go
+++ b/src/runtime/map_test.go
@@ -6,6 +6,7 @@
 
 import (
 	"fmt"
+	"internal/abi"
 	"internal/goarch"
 	"math"
 	"reflect"
@@ -506,7 +507,12 @@
 }
 
 func TestMapIterOrder(t *testing.T) {
-	for _, n := range [...]int{3, 7, 9, 15} {
+	sizes := []int{3, 7, 9, 15}
+	if abi.MapBucketCountBits >= 5 {
+		// it gets flaky (often only one iteration order) at size 3 when abi.MapBucketCountBits >=5.
+		t.Fatalf("This test becomes flaky if abi.MapBucketCountBits(=%d) is 5 or larger", abi.MapBucketCountBits)
+	}
+	for _, n := range sizes {
 		for i := 0; i < 1000; i++ {
 			// Make m be {0: true, 1: true, ..., n-1: true}.
 			m := make(map[int]bool)
@@ -673,6 +679,17 @@
 	}
 }
 
+const bs = abi.MapBucketCount
+
+// belowOverflow should be a pretty-full pair of buckets;
+// atOverflow is 1/8 bs larger = 13/8 buckets or two buckets
+// that are 13/16 full each, which is the overflow boundary.
+// Adding one to that should ensure overflow to the next higher size.
+const (
+	belowOverflow = bs * 3 / 2           // 1.5 bs = 2 buckets @ 75%
+	atOverflow    = belowOverflow + bs/8 // 2 buckets at 13/16 fill.
+)
+
 var mapBucketTests = [...]struct {
 	n        int // n is the number of map elements
 	noescape int // number of expected buckets for non-escaping map
@@ -682,11 +699,16 @@
 	{-1, 1, 1},
 	{0, 1, 1},
 	{1, 1, 1},
-	{8, 1, 1},
-	{9, 2, 2},
-	{13, 2, 2},
-	{14, 4, 4},
-	{26, 4, 4},
+	{bs, 1, 1},
+	{bs + 1, 2, 2},
+	{belowOverflow, 2, 2},  // 1.5 bs = 2 buckets @ 75%
+	{atOverflow + 1, 4, 4}, // 13/8 bs + 1 == overflow to 4
+
+	{2 * belowOverflow, 4, 4}, // 3 bs = 4 buckets @75%
+	{2*atOverflow + 1, 8, 8},  // 13/4 bs + 1 = overflow to 8
+
+	{4 * belowOverflow, 8, 8},  // 6 bs = 8 buckets @ 75%
+	{4*atOverflow + 1, 16, 16}, // 13/2 bs + 1 = overflow to 16
 }
 
 func TestMapBuckets(t *testing.T) {
diff --git a/src/runtime/mbarrier.go b/src/runtime/mbarrier.go
index 46ef42f..159a298 100644
--- a/src/runtime/mbarrier.go
+++ b/src/runtime/mbarrier.go
@@ -16,6 +16,7 @@
 import (
 	"internal/abi"
 	"internal/goarch"
+	"internal/goexperiment"
 	"unsafe"
 )
 
@@ -111,12 +112,6 @@
 // compiler will generate a write barrier for writes through that
 // pointer (because it doesn't know it's not a heap pointer).
 //
-// One might be tempted to ignore the write barrier if slot points
-// into to the stack. Don't do it! Mark termination only re-scans
-// frames that have potentially been active since the concurrent scan,
-// so it depends on write barriers to track changes to pointers in
-// stack frames that have not been active.
-//
 //
 // Global writes:
 //
@@ -154,12 +149,12 @@
 // anywhere in the bulk barrier or memmove.
 //
 //go:nosplit
-func typedmemmove(typ *_type, dst, src unsafe.Pointer) {
+func typedmemmove(typ *abi.Type, dst, src unsafe.Pointer) {
 	if dst == src {
 		return
 	}
-	if writeBarrier.needed && typ.ptrdata != 0 {
-		bulkBarrierPreWrite(uintptr(dst), uintptr(src), typ.ptrdata)
+	if writeBarrier.needed && typ.PtrBytes != 0 {
+		bulkBarrierPreWrite(uintptr(dst), uintptr(src), typ.PtrBytes)
 	}
 	// There's a race here: if some other goroutine can write to
 	// src, it may change some pointer in src after we've
@@ -168,12 +163,32 @@
 	// other goroutine must also be accompanied by a write
 	// barrier, so at worst we've unnecessarily greyed the old
 	// pointer that was in src.
-	memmove(dst, src, typ.size)
-	if writeBarrier.cgo {
-		cgoCheckMemmove(typ, dst, src, 0, typ.size)
+	memmove(dst, src, typ.Size_)
+	if goexperiment.CgoCheck2 {
+		cgoCheckMemmove2(typ, dst, src, 0, typ.Size_)
 	}
 }
 
+// wbZero performs the write barrier operations necessary before
+// zeroing a region of memory at address dst of type typ.
+// Does not actually do the zeroing.
+//
+//go:nowritebarrierrec
+//go:nosplit
+func wbZero(typ *_type, dst unsafe.Pointer) {
+	bulkBarrierPreWrite(uintptr(dst), 0, typ.PtrBytes)
+}
+
+// wbMove performs the write barrier operations necessary before
+// copying a region of memory from src to dst of type typ.
+// Does not actually do the copying.
+//
+//go:nowritebarrierrec
+//go:nosplit
+func wbMove(typ *_type, dst, src unsafe.Pointer) {
+	bulkBarrierPreWrite(uintptr(dst), uintptr(src), typ.PtrBytes)
+}
+
 //go:linkname reflect_typedmemmove reflect.typedmemmove
 func reflect_typedmemmove(typ *_type, dst, src unsafe.Pointer) {
 	if raceenabled {
@@ -181,12 +196,12 @@
 		raceReadObjectPC(typ, src, getcallerpc(), abi.FuncPCABIInternal(reflect_typedmemmove))
 	}
 	if msanenabled {
-		msanwrite(dst, typ.size)
-		msanread(src, typ.size)
+		msanwrite(dst, typ.Size_)
+		msanread(src, typ.Size_)
 	}
 	if asanenabled {
-		asanwrite(dst, typ.size)
-		asanread(src, typ.size)
+		asanwrite(dst, typ.Size_)
+		asanread(src, typ.Size_)
 	}
 	typedmemmove(typ, dst, src)
 }
@@ -196,29 +211,6 @@
 	reflect_typedmemmove(typ, dst, src)
 }
 
-// reflect_typedmemmovepartial is like typedmemmove but assumes that
-// dst and src point off bytes into the value and only copies size bytes.
-// off must be a multiple of goarch.PtrSize.
-//
-//go:linkname reflect_typedmemmovepartial reflect.typedmemmovepartial
-func reflect_typedmemmovepartial(typ *_type, dst, src unsafe.Pointer, off, size uintptr) {
-	if writeBarrier.needed && typ.ptrdata > off && size >= goarch.PtrSize {
-		if off&(goarch.PtrSize-1) != 0 {
-			panic("reflect: internal error: misaligned offset")
-		}
-		pwsize := alignDown(size, goarch.PtrSize)
-		if poff := typ.ptrdata - off; pwsize > poff {
-			pwsize = poff
-		}
-		bulkBarrierPreWrite(uintptr(dst), uintptr(src), pwsize)
-	}
-
-	memmove(dst, src, size)
-	if writeBarrier.cgo {
-		cgoCheckMemmove(typ, dst, src, off, size)
-	}
-}
-
 // reflectcallmove is invoked by reflectcall to copy the return values
 // out of the stack and into the heap, invoking the necessary write
 // barriers. dst, src, and size describe the return value area to
@@ -230,7 +222,7 @@
 //
 //go:nosplit
 func reflectcallmove(typ *_type, dst, src unsafe.Pointer, size uintptr, regs *abi.RegArgs) {
-	if writeBarrier.needed && typ != nil && typ.ptrdata != 0 && size >= goarch.PtrSize {
+	if writeBarrier.needed && typ != nil && typ.PtrBytes != 0 && size >= goarch.PtrSize {
 		bulkBarrierPreWrite(uintptr(dst), uintptr(src), size)
 	}
 	memmove(dst, src, size)
@@ -260,19 +252,19 @@
 	if raceenabled {
 		callerpc := getcallerpc()
 		pc := abi.FuncPCABIInternal(slicecopy)
-		racewriterangepc(dstPtr, uintptr(n)*typ.size, callerpc, pc)
-		racereadrangepc(srcPtr, uintptr(n)*typ.size, callerpc, pc)
+		racewriterangepc(dstPtr, uintptr(n)*typ.Size_, callerpc, pc)
+		racereadrangepc(srcPtr, uintptr(n)*typ.Size_, callerpc, pc)
 	}
 	if msanenabled {
-		msanwrite(dstPtr, uintptr(n)*typ.size)
-		msanread(srcPtr, uintptr(n)*typ.size)
+		msanwrite(dstPtr, uintptr(n)*typ.Size_)
+		msanread(srcPtr, uintptr(n)*typ.Size_)
 	}
 	if asanenabled {
-		asanwrite(dstPtr, uintptr(n)*typ.size)
-		asanread(srcPtr, uintptr(n)*typ.size)
+		asanwrite(dstPtr, uintptr(n)*typ.Size_)
+		asanread(srcPtr, uintptr(n)*typ.Size_)
 	}
 
-	if writeBarrier.cgo {
+	if goexperiment.CgoCheck2 {
 		cgoCheckSliceCopy(typ, dstPtr, srcPtr, n)
 	}
 
@@ -280,13 +272,13 @@
 		return n
 	}
 
-	// Note: No point in checking typ.ptrdata here:
+	// Note: No point in checking typ.PtrBytes here:
 	// compiler only emits calls to typedslicecopy for types with pointers,
 	// and growslice and reflect_typedslicecopy check for pointers
 	// before calling typedslicecopy.
-	size := uintptr(n) * typ.size
+	size := uintptr(n) * typ.Size_
 	if writeBarrier.needed {
-		pwsize := size - typ.size + typ.ptrdata
+		pwsize := size - typ.Size_ + typ.PtrBytes
 		bulkBarrierPreWrite(uintptr(dstPtr), uintptr(srcPtr), pwsize)
 	}
 	// See typedmemmove for a discussion of the race between the
@@ -297,8 +289,8 @@
 
 //go:linkname reflect_typedslicecopy reflect.typedslicecopy
 func reflect_typedslicecopy(elemType *_type, dst, src slice) int {
-	if elemType.ptrdata == 0 {
-		return slicecopy(dst.array, dst.len, src.array, src.len, elemType.size)
+	if elemType.PtrBytes == 0 {
+		return slicecopy(dst.array, dst.len, src.array, src.len, elemType.Size_)
 	}
 	return typedslicecopy(elemType, dst.array, dst.len, src.array, src.len)
 }
@@ -315,10 +307,10 @@
 //
 //go:nosplit
 func typedmemclr(typ *_type, ptr unsafe.Pointer) {
-	if writeBarrier.needed && typ.ptrdata != 0 {
-		bulkBarrierPreWrite(uintptr(ptr), 0, typ.ptrdata)
+	if writeBarrier.needed && typ.PtrBytes != 0 {
+		bulkBarrierPreWrite(uintptr(ptr), 0, typ.PtrBytes)
 	}
-	memclrNoHeapPointers(ptr, typ.size)
+	memclrNoHeapPointers(ptr, typ.Size_)
 }
 
 //go:linkname reflect_typedmemclr reflect.typedmemclr
@@ -328,7 +320,16 @@
 
 //go:linkname reflect_typedmemclrpartial reflect.typedmemclrpartial
 func reflect_typedmemclrpartial(typ *_type, ptr unsafe.Pointer, off, size uintptr) {
-	if writeBarrier.needed && typ.ptrdata != 0 {
+	if writeBarrier.needed && typ.PtrBytes != 0 {
+		bulkBarrierPreWrite(uintptr(ptr), 0, size)
+	}
+	memclrNoHeapPointers(ptr, size)
+}
+
+//go:linkname reflect_typedarrayclear reflect.typedarrayclear
+func reflect_typedarrayclear(typ *_type, ptr unsafe.Pointer, len int) {
+	size := typ.Size_ * uintptr(len)
+	if writeBarrier.needed && typ.PtrBytes != 0 {
 		bulkBarrierPreWrite(uintptr(ptr), 0, size)
 	}
 	memclrNoHeapPointers(ptr, size)
@@ -336,7 +337,7 @@
 
 // memclrHasPointers clears n bytes of typed memory starting at ptr.
 // The caller must ensure that the type of the object at ptr has
-// pointers, usually by checking typ.ptrdata. However, ptr
+// pointers, usually by checking typ.PtrBytes. However, ptr
 // does not have to point to the start of the allocation.
 //
 //go:nosplit
diff --git a/src/runtime/mbitmap.go b/src/runtime/mbitmap.go
index 088b566..a242872 100644
--- a/src/runtime/mbitmap.go
+++ b/src/runtime/mbitmap.go
@@ -202,6 +202,10 @@
 // n must be within [0, s.npages*_PageSize),
 // or may be exactly s.npages*_PageSize
 // if s.elemsize is from sizeclasses.go.
+//
+// nosplit, because it is called by objIndex, which is nosplit
+//
+//go:nosplit
 func (s *mspan) divideByElemSize(n uintptr) uintptr {
 	const doubleCheck = false
 
@@ -215,6 +219,9 @@
 	return q
 }
 
+// nosplit, because it is called by other nosplit code like findObject
+//
+//go:nosplit
 func (s *mspan) objIndex(p uintptr) uintptr {
 	return s.divideByElemSize(p - s.base())
 }
@@ -526,9 +533,9 @@
 // The pointer bitmap is not maintained for allocations containing
 // no pointers at all; any caller of bulkBarrierPreWrite must first
 // make sure the underlying allocation contains pointers, usually
-// by checking typ.ptrdata.
+// by checking typ.PtrBytes.
 //
-// Callers must perform cgo checks if writeBarrier.cgo.
+// Callers must perform cgo checks if goexperiment.CgoCheck2.
 //
 //go:nosplit
 func bulkBarrierPreWrite(dst, src, size uintptr) {
@@ -573,9 +580,8 @@
 				break
 			}
 			dstx := (*uintptr)(unsafe.Pointer(addr))
-			if !buf.putFast(*dstx, 0) {
-				wbBufFlush(nil, 0)
-			}
+			p := buf.get1()
+			p[0] = *dstx
 		}
 	} else {
 		for {
@@ -585,9 +591,9 @@
 			}
 			dstx := (*uintptr)(unsafe.Pointer(addr))
 			srcx := (*uintptr)(unsafe.Pointer(src + (addr - dst)))
-			if !buf.putFast(*dstx, *srcx) {
-				wbBufFlush(nil, 0)
-			}
+			p := buf.get2()
+			p[0] = *dstx
+			p[1] = *srcx
 		}
 	}
 }
@@ -617,9 +623,8 @@
 			break
 		}
 		srcx := (*uintptr)(unsafe.Pointer(addr - dst + src))
-		if !buf.putFast(0, *srcx) {
-			wbBufFlush(nil, 0)
-		}
+		p := buf.get1()
+		p[0] = *srcx
 	}
 }
 
@@ -650,14 +655,13 @@
 		if *bits&mask != 0 {
 			dstx := (*uintptr)(unsafe.Pointer(dst + i))
 			if src == 0 {
-				if !buf.putFast(*dstx, 0) {
-					wbBufFlush(nil, 0)
-				}
+				p := buf.get1()
+				p[0] = *dstx
 			} else {
 				srcx := (*uintptr)(unsafe.Pointer(src + i))
-				if !buf.putFast(*dstx, *srcx) {
-					wbBufFlush(nil, 0)
-				}
+				p := buf.get2()
+				p[0] = *dstx
+				p[1] = *srcx
 			}
 		}
 		mask <<= 1
@@ -678,28 +682,28 @@
 // Must not be preempted because it typically runs right before memmove,
 // and the GC must observe them as an atomic action.
 //
-// Callers must perform cgo checks if writeBarrier.cgo.
+// Callers must perform cgo checks if goexperiment.CgoCheck2.
 //
 //go:nosplit
 func typeBitsBulkBarrier(typ *_type, dst, src, size uintptr) {
 	if typ == nil {
 		throw("runtime: typeBitsBulkBarrier without type")
 	}
-	if typ.size != size {
-		println("runtime: typeBitsBulkBarrier with type ", typ.string(), " of size ", typ.size, " but memory size", size)
+	if typ.Size_ != size {
+		println("runtime: typeBitsBulkBarrier with type ", toRType(typ).string(), " of size ", typ.Size_, " but memory size", size)
 		throw("runtime: invalid typeBitsBulkBarrier")
 	}
-	if typ.kind&kindGCProg != 0 {
-		println("runtime: typeBitsBulkBarrier with type ", typ.string(), " with GC prog")
+	if typ.Kind_&kindGCProg != 0 {
+		println("runtime: typeBitsBulkBarrier with type ", toRType(typ).string(), " with GC prog")
 		throw("runtime: invalid typeBitsBulkBarrier")
 	}
 	if !writeBarrier.needed {
 		return
 	}
-	ptrmask := typ.gcdata
+	ptrmask := typ.GCData
 	buf := &getg().m.p.ptr().wbBuf
 	var bits uint32
-	for i := uintptr(0); i < typ.ptrdata; i += goarch.PtrSize {
+	for i := uintptr(0); i < typ.PtrBytes; i += goarch.PtrSize {
 		if i&(goarch.PtrSize*8-1) == 0 {
 			bits = uint32(*ptrmask)
 			ptrmask = addb(ptrmask, 1)
@@ -709,9 +713,9 @@
 		if bits&1 != 0 {
 			dstx := (*uintptr)(unsafe.Pointer(dst + i))
 			srcx := (*uintptr)(unsafe.Pointer(src + i))
-			if !buf.putFast(*dstx, *srcx) {
-				wbBufFlush(nil, 0)
-			}
+			p := buf.get2()
+			p[0] = *dstx
+			p[1] = *srcx
 		}
 	}
 }
@@ -918,7 +922,7 @@
 
 // heapBitsSetType records that the new allocation [x, x+size)
 // holds in [x, x+dataSize) one or more values of type typ.
-// (The number of values is given by dataSize / typ.size.)
+// (The number of values is given by dataSize / typ.Size.)
 // If dataSize < size, the fragment [x+dataSize, x+size) is
 // recorded as non-pointer data.
 // It is known that the type has pointers somewhere;
@@ -942,8 +946,8 @@
 func heapBitsSetType(x, size, dataSize uintptr, typ *_type) {
 	const doubleCheck = false // slow but helpful; enable to test modifications to this code
 
-	if doubleCheck && dataSize%typ.size != 0 {
-		throw("heapBitsSetType: dataSize not a multiple of typ.size")
+	if doubleCheck && dataSize%typ.Size_ != 0 {
+		throw("heapBitsSetType: dataSize not a multiple of typ.Size")
 	}
 
 	if goarch.PtrSize == 8 && size == goarch.PtrSize {
@@ -968,12 +972,12 @@
 	h := writeHeapBitsForAddr(x)
 
 	// Handle GC program.
-	if typ.kind&kindGCProg != 0 {
+	if typ.Kind_&kindGCProg != 0 {
 		// Expand the gc program into the storage we're going to use for the actual object.
 		obj := (*uint8)(unsafe.Pointer(x))
-		n := runGCProg(addb(typ.gcdata, 4), obj)
+		n := runGCProg(addb(typ.GCData, 4), obj)
 		// Use the expanded program to set the heap bits.
-		for i := uintptr(0); true; i += typ.size {
+		for i := uintptr(0); true; i += typ.Size_ {
 			// Copy expanded program to heap bitmap.
 			p := obj
 			j := n
@@ -984,12 +988,12 @@
 			}
 			h = h.write(uintptr(*p), j)
 
-			if i+typ.size == dataSize {
+			if i+typ.Size_ == dataSize {
 				break // no padding after last element
 			}
 
 			// Pad with zeros to the start of the next element.
-			h = h.pad(typ.size - n*goarch.PtrSize)
+			h = h.pad(typ.Size_ - n*goarch.PtrSize)
 		}
 
 		h.flush(x, size)
@@ -1001,16 +1005,16 @@
 
 	// Note about sizes:
 	//
-	// typ.size is the number of words in the object,
-	// and typ.ptrdata is the number of words in the prefix
+	// typ.Size is the number of words in the object,
+	// and typ.PtrBytes is the number of words in the prefix
 	// of the object that contains pointers. That is, the final
-	// typ.size - typ.ptrdata words contain no pointers.
+	// typ.Size - typ.PtrBytes words contain no pointers.
 	// This allows optimization of a common pattern where
 	// an object has a small header followed by a large scalar
 	// buffer. If we know the pointers are over, we don't have
 	// to scan the buffer's heap bitmap at all.
 	// The 1-bit ptrmasks are sized to contain only bits for
-	// the typ.ptrdata prefix, zero padded out to a full byte
+	// the typ.PtrBytes prefix, zero padded out to a full byte
 	// of bitmap. If there is more room in the allocated object,
 	// that space is pointerless. The noMorePtrs bitmap will prevent
 	// scanning large pointerless tails of an object.
@@ -1019,13 +1023,13 @@
 	// objects with scalar tails, all but the last tail does have to
 	// be initialized, because there is no way to say "skip forward".
 
-	ptrs := typ.ptrdata / goarch.PtrSize
-	if typ.size == dataSize { // Single element
+	ptrs := typ.PtrBytes / goarch.PtrSize
+	if typ.Size_ == dataSize { // Single element
 		if ptrs <= ptrBits { // Single small element
-			m := readUintptr(typ.gcdata)
+			m := readUintptr(typ.GCData)
 			h = h.write(m, ptrs)
 		} else { // Single large element
-			p := typ.gcdata
+			p := typ.GCData
 			for {
 				h = h.write(readUintptr(p), ptrBits)
 				p = addb(p, ptrBits/8)
@@ -1038,10 +1042,10 @@
 			h = h.write(m, ptrs)
 		}
 	} else { // Repeated element
-		words := typ.size / goarch.PtrSize // total words, including scalar tail
-		if words <= ptrBits {              // Repeated small element
-			n := dataSize / typ.size
-			m := readUintptr(typ.gcdata)
+		words := typ.Size_ / goarch.PtrSize // total words, including scalar tail
+		if words <= ptrBits {               // Repeated small element
+			n := dataSize / typ.Size_
+			m := readUintptr(typ.GCData)
 			// Make larger unit to repeat
 			for words <= ptrBits/2 {
 				if n&1 != 0 {
@@ -1061,8 +1065,8 @@
 			}
 			h = h.write(m, ptrs)
 		} else { // Repeated large element
-			for i := uintptr(0); true; i += typ.size {
-				p := typ.gcdata
+			for i := uintptr(0); true; i += typ.Size_ {
+				p := typ.GCData
 				j := ptrs
 				for j > ptrBits {
 					h = h.write(readUintptr(p), ptrBits)
@@ -1071,11 +1075,11 @@
 				}
 				m := readUintptr(p)
 				h = h.write(m, j)
-				if i+typ.size == dataSize {
+				if i+typ.Size_ == dataSize {
 					break // don't need the trailing nonptr bits on the last element.
 				}
 				// Pad with zeros to the start of the next element.
-				h = h.pad(typ.size - typ.ptrdata)
+				h = h.pad(typ.Size_ - typ.PtrBytes)
 			}
 		}
 	}
@@ -1087,10 +1091,10 @@
 			// Compute the pointer bit we want at offset i.
 			want := false
 			if i < dataSize {
-				off := i % typ.size
-				if off < typ.ptrdata {
+				off := i % typ.Size_
+				if off < typ.PtrBytes {
 					j := off / goarch.PtrSize
-					want = *addb(typ.gcdata, j/8)>>(j%8)&1 != 0
+					want = *addb(typ.GCData, j/8)>>(j%8)&1 != 0
 				}
 			}
 			if want {
@@ -1400,15 +1404,6 @@
 
 // Testing.
 
-func getgcmaskcb(frame *stkframe, ctxt unsafe.Pointer) bool {
-	target := (*stkframe)(ctxt)
-	if frame.sp <= target.sp && target.sp < frame.varp {
-		*target = *frame
-		return false
-	}
-	return true
-}
-
 // reflect_gcbits returns the GC type info for x, for testing.
 // The result is the bitmap entries (0 or 1), one entry per byte.
 //
@@ -1429,7 +1424,7 @@
 		// data
 		if datap.data <= uintptr(p) && uintptr(p) < datap.edata {
 			bitmap := datap.gcdatamask.bytedata
-			n := (*ptrtype)(unsafe.Pointer(t)).elem.size
+			n := (*ptrtype)(unsafe.Pointer(t)).Elem.Size_
 			mask = make([]byte, n/goarch.PtrSize)
 			for i := uintptr(0); i < n; i += goarch.PtrSize {
 				off := (uintptr(p) + i - datap.data) / goarch.PtrSize
@@ -1441,7 +1436,7 @@
 		// bss
 		if datap.bss <= uintptr(p) && uintptr(p) < datap.ebss {
 			bitmap := datap.gcbssmask.bytedata
-			n := (*ptrtype)(unsafe.Pointer(t)).elem.size
+			n := (*ptrtype)(unsafe.Pointer(t)).Elem.Size_
 			mask = make([]byte, n/goarch.PtrSize)
 			for i := uintptr(0); i < n; i += goarch.PtrSize {
 				off := (uintptr(p) + i - datap.bss) / goarch.PtrSize
@@ -1475,19 +1470,24 @@
 
 	// stack
 	if gp := getg(); gp.m.curg.stack.lo <= uintptr(p) && uintptr(p) < gp.m.curg.stack.hi {
-		var frame stkframe
-		frame.sp = uintptr(p)
-		gentraceback(gp.m.curg.sched.pc, gp.m.curg.sched.sp, 0, gp.m.curg, 0, nil, 1000, getgcmaskcb, noescape(unsafe.Pointer(&frame)), 0)
-		if frame.fn.valid() {
-			locals, _, _ := frame.getStackMap(nil, false)
+		found := false
+		var u unwinder
+		for u.initAt(gp.m.curg.sched.pc, gp.m.curg.sched.sp, 0, gp.m.curg, 0); u.valid(); u.next() {
+			if u.frame.sp <= uintptr(p) && uintptr(p) < u.frame.varp {
+				found = true
+				break
+			}
+		}
+		if found {
+			locals, _, _ := u.frame.getStackMap(nil, false)
 			if locals.n == 0 {
 				return
 			}
 			size := uintptr(locals.n) * goarch.PtrSize
-			n := (*ptrtype)(unsafe.Pointer(t)).elem.size
+			n := (*ptrtype)(unsafe.Pointer(t)).Elem.Size_
 			mask = make([]byte, n/goarch.PtrSize)
 			for i := uintptr(0); i < n; i += goarch.PtrSize {
-				off := (uintptr(p) + i - frame.varp + size) / goarch.PtrSize
+				off := (uintptr(p) + i - u.frame.varp + size) / goarch.PtrSize
 				mask[i/goarch.PtrSize] = locals.ptrbit(off)
 			}
 		}
diff --git a/src/runtime/mcentral.go b/src/runtime/mcentral.go
index 3382c54..7861199 100644
--- a/src/runtime/mcentral.go
+++ b/src/runtime/mcentral.go
@@ -84,7 +84,7 @@
 	deductSweepCredit(spanBytes, 0)
 
 	traceDone := false
-	if trace.enabled {
+	if traceEnabled() {
 		traceGCSweepStart()
 	}
 
@@ -157,7 +157,7 @@
 		}
 		sweep.active.end(sl)
 	}
-	if trace.enabled {
+	if traceEnabled() {
 		traceGCSweepDone()
 		traceDone = true
 	}
@@ -170,7 +170,7 @@
 
 	// At this point s is a span that should have free slots.
 havespan:
-	if trace.enabled && !traceDone {
+	if traceEnabled() && !traceDone {
 		traceGCSweepDone()
 	}
 	n := int(s.nelems) - int(s.allocCount)
diff --git a/src/runtime/mem.go b/src/runtime/mem.go
index 0ca933b..22688d5 100644
--- a/src/runtime/mem.go
+++ b/src/runtime/mem.go
@@ -84,6 +84,19 @@
 	sysHugePageOS(v, n)
 }
 
+// sysNoHugePage does not transition memory regions, but instead provides a
+// hint to the OS that it would be less efficient to back this memory region
+// with pages of a larger size transparently.
+func sysNoHugePage(v unsafe.Pointer, n uintptr) {
+	sysNoHugePageOS(v, n)
+}
+
+// sysHugePageCollapse attempts to immediately back the provided memory region
+// with huge pages. It is best-effort and may fail silently.
+func sysHugePageCollapse(v unsafe.Pointer, n uintptr) {
+	sysHugePageCollapseOS(v, n)
+}
+
 // sysFree transitions a memory region from any state to None. Therefore, it
 // returns memory unconditionally. It is used if an out-of-memory error has been
 // detected midway through an allocation or to carve out an aligned section of
diff --git a/src/runtime/mem_aix.go b/src/runtime/mem_aix.go
index 21726b5..dff2756 100644
--- a/src/runtime/mem_aix.go
+++ b/src/runtime/mem_aix.go
@@ -38,6 +38,12 @@
 func sysHugePageOS(v unsafe.Pointer, n uintptr) {
 }
 
+func sysNoHugePageOS(v unsafe.Pointer, n uintptr) {
+}
+
+func sysHugePageCollapseOS(v unsafe.Pointer, n uintptr) {
+}
+
 // Don't split the stack as this function may be invoked without a valid G,
 // which prevents us from allocating more stack.
 //
diff --git a/src/runtime/mem_bsd.go b/src/runtime/mem_bsd.go
index 6c5edb1..78128ae 100644
--- a/src/runtime/mem_bsd.go
+++ b/src/runtime/mem_bsd.go
@@ -36,6 +36,12 @@
 func sysHugePageOS(v unsafe.Pointer, n uintptr) {
 }
 
+func sysNoHugePageOS(v unsafe.Pointer, n uintptr) {
+}
+
+func sysHugePageCollapseOS(v unsafe.Pointer, n uintptr) {
+}
+
 // Don't split the stack as this function may be invoked without a valid G,
 // which prevents us from allocating more stack.
 //
diff --git a/src/runtime/mem_darwin.go b/src/runtime/mem_darwin.go
index 25862cf..ae84871 100644
--- a/src/runtime/mem_darwin.go
+++ b/src/runtime/mem_darwin.go
@@ -36,6 +36,12 @@
 func sysHugePageOS(v unsafe.Pointer, n uintptr) {
 }
 
+func sysNoHugePageOS(v unsafe.Pointer, n uintptr) {
+}
+
+func sysHugePageCollapseOS(v unsafe.Pointer, n uintptr) {
+}
+
 // Don't split the stack as this function may be invoked without a valid G,
 // which prevents us from allocating more stack.
 //
diff --git a/src/runtime/mem_js.go b/src/runtime/mem_js.go
index e87c5f2..080b1ab 100644
--- a/src/runtime/mem_js.go
+++ b/src/runtime/mem_js.go
@@ -2,84 +2,12 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build js && wasm
+//go:build js
 
 package runtime
 
-import (
-	"unsafe"
-)
-
-// Don't split the stack as this function may be invoked without a valid G,
-// which prevents us from allocating more stack.
-//
-//go:nosplit
-func sysAllocOS(n uintptr) unsafe.Pointer {
-	p := sysReserveOS(nil, n)
-	sysMapOS(p, n)
-	return p
-}
-
-func sysUnusedOS(v unsafe.Pointer, n uintptr) {
-}
-
-func sysUsedOS(v unsafe.Pointer, n uintptr) {
-}
-
-func sysHugePageOS(v unsafe.Pointer, n uintptr) {
-}
-
-// Don't split the stack as this function may be invoked without a valid G,
-// which prevents us from allocating more stack.
-//
-//go:nosplit
-func sysFreeOS(v unsafe.Pointer, n uintptr) {
-}
-
-func sysFaultOS(v unsafe.Pointer, n uintptr) {
-}
-
-var reserveEnd uintptr
-
-func sysReserveOS(v unsafe.Pointer, n uintptr) unsafe.Pointer {
-	// TODO(neelance): maybe unify with mem_plan9.go, depending on how https://github.com/WebAssembly/design/blob/master/FutureFeatures.md#finer-grained-control-over-memory turns out
-
-	if v != nil {
-		// The address space of WebAssembly's linear memory is contiguous,
-		// so requesting specific addresses is not supported. We could use
-		// a different address, but then mheap.sysAlloc discards the result
-		// right away and we don't reuse chunks passed to sysFree.
-		return nil
-	}
-
-	// Round up the initial reserveEnd to 64 KiB so that
-	// reservations are always aligned to the page size.
-	initReserveEnd := alignUp(lastmoduledatap.end, physPageSize)
-	if reserveEnd < initReserveEnd {
-		reserveEnd = initReserveEnd
-	}
-	v = unsafe.Pointer(reserveEnd)
-	reserveEnd += alignUp(n, physPageSize)
-
-	current := currentMemory()
-	// reserveEnd is always at a page boundary.
-	needed := int32(reserveEnd / physPageSize)
-	if current < needed {
-		if growMemory(needed-current) == -1 {
-			return nil
-		}
-		resetMemoryDataView()
-	}
-
-	return v
-}
-
-func currentMemory() int32
-func growMemory(pages int32) int32
-
 // resetMemoryDataView signals the JS front-end that WebAssembly's memory.grow instruction has been used.
 // This allows the front-end to replace the old DataView object with a new one.
+//
+//go:wasmimport gojs runtime.resetMemoryDataView
 func resetMemoryDataView()
-
-func sysMapOS(v unsafe.Pointer, n uintptr) {
-}
diff --git a/src/runtime/mem_linux.go b/src/runtime/mem_linux.go
index 1630664..c9823d3 100644
--- a/src/runtime/mem_linux.go
+++ b/src/runtime/mem_linux.go
@@ -36,65 +36,9 @@
 
 var adviseUnused = uint32(_MADV_FREE)
 
+const madviseUnsupported = 0
+
 func sysUnusedOS(v unsafe.Pointer, n uintptr) {
-	// By default, Linux's "transparent huge page" support will
-	// merge pages into a huge page if there's even a single
-	// present regular page, undoing the effects of madvise(adviseUnused)
-	// below. On amd64, that means khugepaged can turn a single
-	// 4KB page to 2MB, bloating the process's RSS by as much as
-	// 512X. (See issue #8832 and Linux kernel bug
-	// https://bugzilla.kernel.org/show_bug.cgi?id=93111)
-	//
-	// To work around this, we explicitly disable transparent huge
-	// pages when we release pages of the heap. However, we have
-	// to do this carefully because changing this flag tends to
-	// split the VMA (memory mapping) containing v in to three
-	// VMAs in order to track the different values of the
-	// MADV_NOHUGEPAGE flag in the different regions. There's a
-	// default limit of 65530 VMAs per address space (sysctl
-	// vm.max_map_count), so we must be careful not to create too
-	// many VMAs (see issue #12233).
-	//
-	// Since huge pages are huge, there's little use in adjusting
-	// the MADV_NOHUGEPAGE flag on a fine granularity, so we avoid
-	// exploding the number of VMAs by only adjusting the
-	// MADV_NOHUGEPAGE flag on a large granularity. This still
-	// gets most of the benefit of huge pages while keeping the
-	// number of VMAs under control. With hugePageSize = 2MB, even
-	// a pessimal heap can reach 128GB before running out of VMAs.
-	if physHugePageSize != 0 {
-		// If it's a large allocation, we want to leave huge
-		// pages enabled. Hence, we only adjust the huge page
-		// flag on the huge pages containing v and v+n-1, and
-		// only if those aren't aligned.
-		var head, tail uintptr
-		if uintptr(v)&(physHugePageSize-1) != 0 {
-			// Compute huge page containing v.
-			head = alignDown(uintptr(v), physHugePageSize)
-		}
-		if (uintptr(v)+n)&(physHugePageSize-1) != 0 {
-			// Compute huge page containing v+n-1.
-			tail = alignDown(uintptr(v)+n-1, physHugePageSize)
-		}
-
-		// Note that madvise will return EINVAL if the flag is
-		// already set, which is quite likely. We ignore
-		// errors.
-		if head != 0 && head+physHugePageSize == tail {
-			// head and tail are different but adjacent,
-			// so do this in one call.
-			madvise(unsafe.Pointer(head), 2*physHugePageSize, _MADV_NOHUGEPAGE)
-		} else {
-			// Advise the huge pages containing v and v+n-1.
-			if head != 0 {
-				madvise(unsafe.Pointer(head), physHugePageSize, _MADV_NOHUGEPAGE)
-			}
-			if tail != 0 && tail != head {
-				madvise(unsafe.Pointer(tail), physHugePageSize, _MADV_NOHUGEPAGE)
-			}
-		}
-	}
-
 	if uintptr(v)&(physPageSize-1) != 0 || n&(physPageSize-1) != 0 {
 		// madvise will round this to any physical page
 		// *covered* by this range, so an unaligned madvise
@@ -102,17 +46,31 @@
 		throw("unaligned sysUnused")
 	}
 
-	var advise uint32
-	if debug.madvdontneed != 0 {
+	advise := atomic.Load(&adviseUnused)
+	if debug.madvdontneed != 0 && advise != madviseUnsupported {
 		advise = _MADV_DONTNEED
-	} else {
-		advise = atomic.Load(&adviseUnused)
 	}
-	if errno := madvise(v, n, int32(advise)); advise == _MADV_FREE && errno != 0 {
-		// MADV_FREE was added in Linux 4.5. Fall back to MADV_DONTNEED if it is
-		// not supported.
+	switch advise {
+	case _MADV_FREE:
+		if madvise(v, n, _MADV_FREE) == 0 {
+			break
+		}
 		atomic.Store(&adviseUnused, _MADV_DONTNEED)
-		madvise(v, n, _MADV_DONTNEED)
+		fallthrough
+	case _MADV_DONTNEED:
+		// MADV_FREE was added in Linux 4.5. Fall back on MADV_DONTNEED if it's
+		// not supported.
+		if madvise(v, n, _MADV_DONTNEED) == 0 {
+			break
+		}
+		atomic.Store(&adviseUnused, madviseUnsupported)
+		fallthrough
+	case madviseUnsupported:
+		// Since Linux 3.18, support for madvise is optional.
+		// Fall back on mmap if it's not supported.
+		// _MAP_ANON|_MAP_FIXED|_MAP_PRIVATE will unmap all the
+		// pages in the old mapping, and remap the memory region.
+		mmap(v, n, _PROT_READ|_PROT_WRITE, _MAP_ANON|_MAP_FIXED|_MAP_PRIVATE, -1, 0)
 	}
 
 	if debug.harddecommit > 0 {
@@ -133,19 +91,7 @@
 			throw("runtime: cannot remap pages in address space")
 		}
 		return
-
-		// Don't do the sysHugePage optimization in hard decommit mode.
-		// We're breaking up pages everywhere, there's no point.
 	}
-	// Partially undo the NOHUGEPAGE marks from sysUnused
-	// for whole huge pages between v and v+n. This may
-	// leave huge pages off at the end points v and v+n
-	// even though allocations may cover these entire huge
-	// pages. We could detect this and undo NOHUGEPAGE on
-	// the end points as well, but it's probably not worth
-	// the cost because when neighboring allocations are
-	// freed sysUnused will just set NOHUGEPAGE again.
-	sysHugePageOS(v, n)
 }
 
 func sysHugePageOS(v unsafe.Pointer, n uintptr) {
@@ -161,6 +107,40 @@
 	}
 }
 
+func sysNoHugePageOS(v unsafe.Pointer, n uintptr) {
+	if uintptr(v)&(physPageSize-1) != 0 {
+		// The Linux implementation requires that the address
+		// addr be page-aligned, and allows length to be zero.
+		throw("unaligned sysNoHugePageOS")
+	}
+	madvise(v, n, _MADV_NOHUGEPAGE)
+}
+
+func sysHugePageCollapseOS(v unsafe.Pointer, n uintptr) {
+	if uintptr(v)&(physPageSize-1) != 0 {
+		// The Linux implementation requires that the address
+		// addr be page-aligned, and allows length to be zero.
+		throw("unaligned sysHugePageCollapseOS")
+	}
+	if physHugePageSize == 0 {
+		return
+	}
+	// N.B. If you find yourself debugging this code, note that
+	// this call can fail with EAGAIN because it's best-effort.
+	// Also, when it returns an error, it's only for the last
+	// huge page in the region requested.
+	//
+	// It can also sometimes return EINVAL if the corresponding
+	// region hasn't been backed by physical memory. This is
+	// difficult to guarantee in general, and it also means
+	// there's no way to distinguish whether this syscall is
+	// actually available. Oops.
+	//
+	// Anyway, that's why this call just doesn't bother checking
+	// any errors.
+	madvise(v, n, _MADV_COLLAPSE)
+}
+
 // Don't split the stack as this function may be invoked without a valid G,
 // which prevents us from allocating more stack.
 //
diff --git a/src/runtime/mem_plan9.go b/src/runtime/mem_plan9.go
index 88e7d92..9b18a29 100644
--- a/src/runtime/mem_plan9.go
+++ b/src/runtime/mem_plan9.go
@@ -6,126 +6,6 @@
 
 import "unsafe"
 
-const memDebug = false
-
-var bloc uintptr
-var blocMax uintptr
-var memlock mutex
-
-type memHdr struct {
-	next memHdrPtr
-	size uintptr
-}
-
-var memFreelist memHdrPtr // sorted in ascending order
-
-type memHdrPtr uintptr
-
-func (p memHdrPtr) ptr() *memHdr   { return (*memHdr)(unsafe.Pointer(p)) }
-func (p *memHdrPtr) set(x *memHdr) { *p = memHdrPtr(unsafe.Pointer(x)) }
-
-func memAlloc(n uintptr) unsafe.Pointer {
-	n = memRound(n)
-	var prevp *memHdr
-	for p := memFreelist.ptr(); p != nil; p = p.next.ptr() {
-		if p.size >= n {
-			if p.size == n {
-				if prevp != nil {
-					prevp.next = p.next
-				} else {
-					memFreelist = p.next
-				}
-			} else {
-				p.size -= n
-				p = (*memHdr)(add(unsafe.Pointer(p), p.size))
-			}
-			*p = memHdr{}
-			return unsafe.Pointer(p)
-		}
-		prevp = p
-	}
-	return sbrk(n)
-}
-
-func memFree(ap unsafe.Pointer, n uintptr) {
-	n = memRound(n)
-	memclrNoHeapPointers(ap, n)
-	bp := (*memHdr)(ap)
-	bp.size = n
-	bpn := uintptr(ap)
-	if memFreelist == 0 {
-		bp.next = 0
-		memFreelist.set(bp)
-		return
-	}
-	p := memFreelist.ptr()
-	if bpn < uintptr(unsafe.Pointer(p)) {
-		memFreelist.set(bp)
-		if bpn+bp.size == uintptr(unsafe.Pointer(p)) {
-			bp.size += p.size
-			bp.next = p.next
-			*p = memHdr{}
-		} else {
-			bp.next.set(p)
-		}
-		return
-	}
-	for ; p.next != 0; p = p.next.ptr() {
-		if bpn > uintptr(unsafe.Pointer(p)) && bpn < uintptr(unsafe.Pointer(p.next)) {
-			break
-		}
-	}
-	if bpn+bp.size == uintptr(unsafe.Pointer(p.next)) {
-		bp.size += p.next.ptr().size
-		bp.next = p.next.ptr().next
-		*p.next.ptr() = memHdr{}
-	} else {
-		bp.next = p.next
-	}
-	if uintptr(unsafe.Pointer(p))+p.size == bpn {
-		p.size += bp.size
-		p.next = bp.next
-		*bp = memHdr{}
-	} else {
-		p.next.set(bp)
-	}
-}
-
-func memCheck() {
-	if !memDebug {
-		return
-	}
-	for p := memFreelist.ptr(); p != nil && p.next != 0; p = p.next.ptr() {
-		if uintptr(unsafe.Pointer(p)) == uintptr(unsafe.Pointer(p.next)) {
-			print("runtime: ", unsafe.Pointer(p), " == ", unsafe.Pointer(p.next), "\n")
-			throw("mem: infinite loop")
-		}
-		if uintptr(unsafe.Pointer(p)) > uintptr(unsafe.Pointer(p.next)) {
-			print("runtime: ", unsafe.Pointer(p), " > ", unsafe.Pointer(p.next), "\n")
-			throw("mem: unordered list")
-		}
-		if uintptr(unsafe.Pointer(p))+p.size > uintptr(unsafe.Pointer(p.next)) {
-			print("runtime: ", unsafe.Pointer(p), "+", p.size, " > ", unsafe.Pointer(p.next), "\n")
-			throw("mem: overlapping blocks")
-		}
-		for b := add(unsafe.Pointer(p), unsafe.Sizeof(memHdr{})); uintptr(b) < uintptr(unsafe.Pointer(p))+p.size; b = add(b, 1) {
-			if *(*byte)(b) != 0 {
-				print("runtime: value at addr ", b, " with offset ", uintptr(b)-uintptr(unsafe.Pointer(p)), " in block ", p, " of size ", p.size, " is not zero\n")
-				throw("mem: uninitialised memory")
-			}
-		}
-	}
-}
-
-func memRound(p uintptr) uintptr {
-	return (p + _PAGESIZE - 1) &^ (_PAGESIZE - 1)
-}
-
-func initBloc() {
-	bloc = memRound(firstmoduledata.end)
-	blocMax = bloc
-}
-
 func sbrk(n uintptr) unsafe.Pointer {
 	// Plan 9 sbrk from /sys/src/libc/9sys/sbrk.c
 	bl := bloc
@@ -139,57 +19,3 @@
 	bloc += n
 	return unsafe.Pointer(bl)
 }
-
-func sysAllocOS(n uintptr) unsafe.Pointer {
-	lock(&memlock)
-	p := memAlloc(n)
-	memCheck()
-	unlock(&memlock)
-	return p
-}
-
-func sysFreeOS(v unsafe.Pointer, n uintptr) {
-	lock(&memlock)
-	if uintptr(v)+n == bloc {
-		// Address range being freed is at the end of memory,
-		// so record a new lower value for end of memory.
-		// Can't actually shrink address space because segment is shared.
-		memclrNoHeapPointers(v, n)
-		bloc -= n
-	} else {
-		memFree(v, n)
-		memCheck()
-	}
-	unlock(&memlock)
-}
-
-func sysUnusedOS(v unsafe.Pointer, n uintptr) {
-}
-
-func sysUsedOS(v unsafe.Pointer, n uintptr) {
-}
-
-func sysHugePageOS(v unsafe.Pointer, n uintptr) {
-}
-
-func sysMapOS(v unsafe.Pointer, n uintptr) {
-}
-
-func sysFaultOS(v unsafe.Pointer, n uintptr) {
-}
-
-func sysReserveOS(v unsafe.Pointer, n uintptr) unsafe.Pointer {
-	lock(&memlock)
-	var p unsafe.Pointer
-	if uintptr(v) == bloc {
-		// Address hint is the current end of memory,
-		// so try to extend the address space.
-		p = sbrk(n)
-	}
-	if p == nil && v == nil {
-		p = memAlloc(n)
-		memCheck()
-	}
-	unlock(&memlock)
-	return p
-}
diff --git a/src/runtime/mem_sbrk.go b/src/runtime/mem_sbrk.go
new file mode 100644
index 0000000..dc0a764
--- /dev/null
+++ b/src/runtime/mem_sbrk.go
@@ -0,0 +1,189 @@
+// Copyright 2023 The Go 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:build plan9 || wasm
+
+package runtime
+
+import "unsafe"
+
+const memDebug = false
+
+var bloc uintptr
+var blocMax uintptr
+var memlock mutex
+
+type memHdr struct {
+	next memHdrPtr
+	size uintptr
+}
+
+var memFreelist memHdrPtr // sorted in ascending order
+
+type memHdrPtr uintptr
+
+func (p memHdrPtr) ptr() *memHdr   { return (*memHdr)(unsafe.Pointer(p)) }
+func (p *memHdrPtr) set(x *memHdr) { *p = memHdrPtr(unsafe.Pointer(x)) }
+
+func memAlloc(n uintptr) unsafe.Pointer {
+	n = memRound(n)
+	var prevp *memHdr
+	for p := memFreelist.ptr(); p != nil; p = p.next.ptr() {
+		if p.size >= n {
+			if p.size == n {
+				if prevp != nil {
+					prevp.next = p.next
+				} else {
+					memFreelist = p.next
+				}
+			} else {
+				p.size -= n
+				p = (*memHdr)(add(unsafe.Pointer(p), p.size))
+			}
+			*p = memHdr{}
+			return unsafe.Pointer(p)
+		}
+		prevp = p
+	}
+	return sbrk(n)
+}
+
+func memFree(ap unsafe.Pointer, n uintptr) {
+	n = memRound(n)
+	memclrNoHeapPointers(ap, n)
+	bp := (*memHdr)(ap)
+	bp.size = n
+	bpn := uintptr(ap)
+	if memFreelist == 0 {
+		bp.next = 0
+		memFreelist.set(bp)
+		return
+	}
+	p := memFreelist.ptr()
+	if bpn < uintptr(unsafe.Pointer(p)) {
+		memFreelist.set(bp)
+		if bpn+bp.size == uintptr(unsafe.Pointer(p)) {
+			bp.size += p.size
+			bp.next = p.next
+			*p = memHdr{}
+		} else {
+			bp.next.set(p)
+		}
+		return
+	}
+	for ; p.next != 0; p = p.next.ptr() {
+		if bpn > uintptr(unsafe.Pointer(p)) && bpn < uintptr(unsafe.Pointer(p.next)) {
+			break
+		}
+	}
+	if bpn+bp.size == uintptr(unsafe.Pointer(p.next)) {
+		bp.size += p.next.ptr().size
+		bp.next = p.next.ptr().next
+		*p.next.ptr() = memHdr{}
+	} else {
+		bp.next = p.next
+	}
+	if uintptr(unsafe.Pointer(p))+p.size == bpn {
+		p.size += bp.size
+		p.next = bp.next
+		*bp = memHdr{}
+	} else {
+		p.next.set(bp)
+	}
+}
+
+func memCheck() {
+	if !memDebug {
+		return
+	}
+	for p := memFreelist.ptr(); p != nil && p.next != 0; p = p.next.ptr() {
+		if uintptr(unsafe.Pointer(p)) == uintptr(unsafe.Pointer(p.next)) {
+			print("runtime: ", unsafe.Pointer(p), " == ", unsafe.Pointer(p.next), "\n")
+			throw("mem: infinite loop")
+		}
+		if uintptr(unsafe.Pointer(p)) > uintptr(unsafe.Pointer(p.next)) {
+			print("runtime: ", unsafe.Pointer(p), " > ", unsafe.Pointer(p.next), "\n")
+			throw("mem: unordered list")
+		}
+		if uintptr(unsafe.Pointer(p))+p.size > uintptr(unsafe.Pointer(p.next)) {
+			print("runtime: ", unsafe.Pointer(p), "+", p.size, " > ", unsafe.Pointer(p.next), "\n")
+			throw("mem: overlapping blocks")
+		}
+		for b := add(unsafe.Pointer(p), unsafe.Sizeof(memHdr{})); uintptr(b) < uintptr(unsafe.Pointer(p))+p.size; b = add(b, 1) {
+			if *(*byte)(b) != 0 {
+				print("runtime: value at addr ", b, " with offset ", uintptr(b)-uintptr(unsafe.Pointer(p)), " in block ", p, " of size ", p.size, " is not zero\n")
+				throw("mem: uninitialised memory")
+			}
+		}
+	}
+}
+
+func memRound(p uintptr) uintptr {
+	return alignUp(p, physPageSize)
+}
+
+func initBloc() {
+	bloc = memRound(firstmoduledata.end)
+	blocMax = bloc
+}
+
+func sysAllocOS(n uintptr) unsafe.Pointer {
+	lock(&memlock)
+	p := memAlloc(n)
+	memCheck()
+	unlock(&memlock)
+	return p
+}
+
+func sysFreeOS(v unsafe.Pointer, n uintptr) {
+	lock(&memlock)
+	if uintptr(v)+n == bloc {
+		// Address range being freed is at the end of memory,
+		// so record a new lower value for end of memory.
+		// Can't actually shrink address space because segment is shared.
+		memclrNoHeapPointers(v, n)
+		bloc -= n
+	} else {
+		memFree(v, n)
+		memCheck()
+	}
+	unlock(&memlock)
+}
+
+func sysUnusedOS(v unsafe.Pointer, n uintptr) {
+}
+
+func sysUsedOS(v unsafe.Pointer, n uintptr) {
+}
+
+func sysHugePageOS(v unsafe.Pointer, n uintptr) {
+}
+
+func sysNoHugePageOS(v unsafe.Pointer, n uintptr) {
+}
+
+func sysHugePageCollapseOS(v unsafe.Pointer, n uintptr) {
+}
+
+func sysMapOS(v unsafe.Pointer, n uintptr) {
+}
+
+func sysFaultOS(v unsafe.Pointer, n uintptr) {
+}
+
+func sysReserveOS(v unsafe.Pointer, n uintptr) unsafe.Pointer {
+	lock(&memlock)
+	var p unsafe.Pointer
+	if uintptr(v) == bloc {
+		// Address hint is the current end of memory,
+		// so try to extend the address space.
+		p = sbrk(n)
+	}
+	if p == nil && v == nil {
+		p = memAlloc(n)
+		memCheck()
+	}
+	unlock(&memlock)
+	return p
+}
diff --git a/src/runtime/mem_wasip1.go b/src/runtime/mem_wasip1.go
new file mode 100644
index 0000000..41ffa0d
--- /dev/null
+++ b/src/runtime/mem_wasip1.go
@@ -0,0 +1,13 @@
+// Copyright 2023 The Go 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:build wasip1
+
+package runtime
+
+func resetMemoryDataView() {
+	// This function is a no-op on WASI, it is only used to notify the browser
+	// that its view of the WASM memory needs to be updated when compiling for
+	// GOOS=js.
+}
diff --git a/src/runtime/mem_wasm.go b/src/runtime/mem_wasm.go
new file mode 100644
index 0000000..d9d3270
--- /dev/null
+++ b/src/runtime/mem_wasm.go
@@ -0,0 +1,20 @@
+// Copyright 2023 The Go Authors. 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"
+
+func sbrk(n uintptr) unsafe.Pointer {
+	grow := divRoundUp(n, physPageSize)
+	size := growMemory(int32(grow))
+	if size < 0 {
+		return nil
+	}
+	resetMemoryDataView()
+	return unsafe.Pointer(uintptr(size) * physPageSize)
+}
+
+// Implemented in src/runtime/sys_wasm.s
+func growMemory(pages int32) int32
diff --git a/src/runtime/mem_windows.go b/src/runtime/mem_windows.go
index b1292fc..477d898 100644
--- a/src/runtime/mem_windows.go
+++ b/src/runtime/mem_windows.go
@@ -94,6 +94,12 @@
 func sysHugePageOS(v unsafe.Pointer, n uintptr) {
 }
 
+func sysNoHugePageOS(v unsafe.Pointer, n uintptr) {
+}
+
+func sysHugePageCollapseOS(v unsafe.Pointer, n uintptr) {
+}
+
 // Don't split the stack as this function may be invoked without a valid G,
 // which prevents us from allocating more stack.
 //
diff --git a/src/runtime/memclr_loong64.s b/src/runtime/memclr_loong64.s
index e4f2058..7bb6f3d 100644
--- a/src/runtime/memclr_loong64.s
+++ b/src/runtime/memclr_loong64.s
@@ -26,6 +26,7 @@
 	// do 8 bytes at a time if there is room
 	ADDV	$-7, R4, R7
 
+	PCALIGN	$16
 	SGTU	R7, R6, R8
 	BEQ	R8, out
 	MOVV	R0, (R6)
diff --git a/src/runtime/memclr_ppc64x.s b/src/runtime/memclr_ppc64x.s
index 3543255..bc4b3fc 100644
--- a/src/runtime/memclr_ppc64x.s
+++ b/src/runtime/memclr_ppc64x.s
@@ -91,24 +91,43 @@
 	ADD	$16, R3
 	ADD	$-16, R4
 lt16gt8:
+#ifdef GOPPC64_power10
+	SLD	$56, R4, R7
+	STXVL   V0, R3, R7
+	RET
+#else
 	CMP	R4, $8
 	BLT	nozerolarge
 	MOVD	R0, 0(R3)
 	ADD	$8, R3
 	ADD	$-8, R4
-
+#endif
 nozerolarge:
 	ANDCC $7, R4, R5 // any remaining bytes
 	BC    4, 1, LR   // ble lr
-
-zerotail:
-	MOVD R5, CTR // set up to clear tail bytes
-
-zerotailloop:
-	MOVB R0, 0(R3)           // clear single bytes
-	ADD  $1, R3
-	BDNZ zerotailloop // dec ctr, br zerotailloop if ctr not 0
+#ifdef GOPPC64_power10
+	XXLXOR  VS32, VS32, VS32 // clear VS32 (V0)
+	SLD	$56, R5, R7
+	STXVL   V0, R3, R7
 	RET
+#else
+	CMP   R5, $4
+	BLT   next2
+	MOVW  R0, 0(R3)
+	ADD   $4, R3
+	ADD   $-4, R5
+next2:
+	CMP   R5, $2
+	BLT   next1
+	MOVH  R0, 0(R3)
+	ADD   $2, R3
+	ADD   $-2, R5
+next1:
+	CMP   R5, $0
+	BC    12, 2, LR      // beqlr
+	MOVB  R0, 0(R3)
+	RET
+#endif
 
 zero512xsetup:  // 512 chunk with extra needed
 	ANDCC $8, R3, R11    // 8 byte alignment?
@@ -123,8 +142,6 @@
 	MOVD  $128, R15
 	SUB   R14, R15, R14 // find increment to 128 alignment
 	SRD   $4, R14, R15  // number of 16 byte chunks
-
-zero512presetup:
 	MOVD   R15, CTR         // loop counter of 16 bytes
 	XXLXOR VS32, VS32, VS32 // clear VS32 (V0)
 
@@ -142,8 +159,7 @@
 	MOVD $128, R9   // index regs for 128 bytes
 	MOVD $256, R10
 	MOVD $384, R11
-	PCALIGN	$32
-
+	PCALIGN $16
 zero512:
 	DCBZ (R3+R0)        // clear first chunk
 	DCBZ (R3+R9)        // clear second chunk
diff --git a/src/runtime/memclr_riscv64.s b/src/runtime/memclr_riscv64.s
index d12b545..1c1e6ab 100644
--- a/src/runtime/memclr_riscv64.s
+++ b/src/runtime/memclr_riscv64.s
@@ -16,10 +16,11 @@
 	BLT	X11, X9, check4
 
 	// Check alignment
-	AND	$3, X10, X5
+	AND	$7, X10, X5
 	BEQZ	X5, aligned
 
 	// Zero one byte at a time until we reach 8 byte alignment.
+	SUB	X5, X9, X5
 	SUB	X5, X11, X11
 align:
 	ADD	$-1, X5
@@ -28,7 +29,7 @@
 	BNEZ	X5, align
 
 aligned:
-	MOV	$8, X9
+	// X9 already contains $8
 	BLT	X11, X9, check4
 	MOV	$16, X9
 	BLT	X11, X9, zero8
diff --git a/src/runtime/memmove_loong64.s b/src/runtime/memmove_loong64.s
index b7b9c56..0f139bc 100644
--- a/src/runtime/memmove_loong64.s
+++ b/src/runtime/memmove_loong64.s
@@ -42,6 +42,7 @@
 	// do 8 bytes at a time if there is room
 	ADDV	$-7, R9, R6 // R6 is end pointer-7
 
+	PCALIGN	$16
 	SGTU	R6, R4, R8
 	BEQ	R8, out
 	MOVV	(R5), R7
@@ -86,6 +87,7 @@
 	// do 8 bytes at a time if there is room
 	ADDV	$7, R4, R6 // R6 is start pointer+7
 
+	PCALIGN	$16
 	SGTU	R9, R6, R8
 	BEQ	R8, out1
 	ADDV	$-8, R5
diff --git a/src/runtime/memmove_ppc64x.s b/src/runtime/memmove_ppc64x.s
index 5fa51c0..18b9c85 100644
--- a/src/runtime/memmove_ppc64x.s
+++ b/src/runtime/memmove_ppc64x.s
@@ -39,6 +39,15 @@
 	// Determine if there are doublewords to
 	// copy so a more efficient move can be done
 check:
+#ifdef GOPPC64_power10
+	CMP	LEN, $16
+	BGT	mcopy
+	SLD	$56, LEN, TMP
+	LXVL	SRC, TMP, V0
+	STXVL	V0, TGT, TMP
+	RET
+#endif
+mcopy:
 	ANDCC	$7, LEN, BYTES	// R7: bytes to copy
 	SRD	$3, LEN, DWORDS	// R6: double words to copy
 	MOVFL	CR0, CR3	// save CR from ANDCC
@@ -68,7 +77,7 @@
 	MOVD	OCTWORDS, CTR		// Number of 64 byte chunks
 	MOVD	$32, IDX32
 	MOVD	$48, IDX48
-	PCALIGN	$32
+	PCALIGN	$16
 
 forward64:
 	LXVD2X	(R0)(SRC), VS32		// load 64 bytes
@@ -97,7 +106,7 @@
 	ADD	$32, TGT
 
 lt32gt8:
-        // At this point >= 8 and < 32
+	// At this point >= 8 and < 32
 	// Move 16 bytes if possible
 	CMP     DWORDS, $2
 	BLT     lt16
@@ -110,12 +119,26 @@
 lt16:	// Move 8 bytes if possible
 	CMP     DWORDS, $1
 	BLT     checkbytes
+#ifdef GOPPC64_power10
+	ADD	$8, BYTES
+	SLD	$56, BYTES, TMP
+	LXVL	SRC, TMP, V0
+	STXVL	V0, TGT, TMP
+	RET
+#endif
+
 	MOVD    0(SRC), TMP
 	ADD	$8, SRC
 	MOVD    TMP, 0(TGT)
 	ADD     $8, TGT
 checkbytes:
 	BC	12, 14, LR		// BEQ lr
+#ifdef GOPPC64_power10
+	SLD	$56, BYTES, TMP
+	LXVL	SRC, TMP, V0
+	STXVL	V0, TGT, TMP
+	RET
+#endif
 lt8:	// Move word if possible
 	CMP BYTES, $4
 	BLT lt4
@@ -183,6 +206,7 @@
 	ANDCC   $3,DWORDS		// Compute remaining DWORDS and compare to 0
 	MOVD	QWORDS, CTR		// set up loop ctr
 	MOVD	$16, IDX16		// 32 bytes at a time
+	PCALIGN	$16
 
 backward32loop:
 	SUB	$32, TGT
diff --git a/src/runtime/memmove_riscv64.s b/src/runtime/memmove_riscv64.s
index ea622ed..f5db865 100644
--- a/src/runtime/memmove_riscv64.s
+++ b/src/runtime/memmove_riscv64.s
@@ -23,12 +23,13 @@
 	BLT	X12, X9, f_loop4_check
 
 	// Check alignment - if alignment differs we have to do one byte at a time.
-	AND	$3, X10, X5
-	AND	$3, X11, X6
+	AND	$7, X10, X5
+	AND	$7, X11, X6
 	BNE	X5, X6, f_loop8_unaligned_check
 	BEQZ	X5, f_loop_check
 
 	// Move one byte at a time until we reach 8 byte alignment.
+	SUB	X5, X9, X5
 	SUB	X5, X12, X12
 f_align:
 	ADD	$-1, X5
@@ -173,8 +174,8 @@
 	BLT	X12, X9, b_loop4_check
 
 	// Check alignment - if alignment differs we have to do one byte at a time.
-	AND	$3, X10, X5
-	AND	$3, X11, X6
+	AND	$7, X10, X5
+	AND	$7, X11, X6
 	BNE	X5, X6, b_loop8_unaligned_check
 	BEQZ	X5, b_loop_check
 
diff --git a/src/runtime/memmove_test.go b/src/runtime/memmove_test.go
index f1247f6..21236d1 100644
--- a/src/runtime/memmove_test.go
+++ b/src/runtime/memmove_test.go
@@ -338,6 +338,29 @@
 	})
 }
 
+func BenchmarkMemmoveUnalignedSrcDst(b *testing.B) {
+	for _, n := range []int{16, 64, 256, 4096, 65536} {
+		buf := make([]byte, (n+8)*2)
+		x := buf[:len(buf)/2]
+		y := buf[len(buf)/2:]
+		for _, off := range []int{0, 1, 4, 7} {
+			b.Run(fmt.Sprint("f_", n, off), func(b *testing.B) {
+				b.SetBytes(int64(n))
+				for i := 0; i < b.N; i++ {
+					copy(x[off:n+off], y[off:n+off])
+				}
+			})
+
+			b.Run(fmt.Sprint("b_", n, off), func(b *testing.B) {
+				b.SetBytes(int64(n))
+				for i := 0; i < b.N; i++ {
+					copy(y[off:n+off], x[off:n+off])
+				}
+			})
+		}
+	}
+}
+
 func BenchmarkMemmoveUnalignedSrcOverlap(b *testing.B) {
 	benchmarkSizes(b, bufSizesOverlap, func(b *testing.B, n int) {
 		x := make([]byte, n+1)
@@ -400,6 +423,32 @@
 	}
 }
 
+func BenchmarkMemclrUnaligned(b *testing.B) {
+	for _, off := range []int{0, 1, 4, 7} {
+		for _, n := range []int{5, 16, 64, 256, 4096, 65536} {
+			x := make([]byte, n+off)
+			b.Run(fmt.Sprint(off, n), func(b *testing.B) {
+				b.SetBytes(int64(n))
+				for i := 0; i < b.N; i++ {
+					MemclrBytes(x[off:])
+				}
+			})
+		}
+	}
+
+	for _, off := range []int{0, 1, 4, 7} {
+		for _, m := range []int{1, 4, 8, 16, 64} {
+			x := make([]byte, (m<<20)+off)
+			b.Run(fmt.Sprint(off, m, "M"), func(b *testing.B) {
+				b.SetBytes(int64(m << 20))
+				for i := 0; i < b.N; i++ {
+					MemclrBytes(x[off:])
+				}
+			})
+		}
+	}
+}
+
 func BenchmarkGoMemclr(b *testing.B) {
 	benchmarkSizes(b, []int{5, 16, 64, 256}, func(b *testing.B, n int) {
 		x := make([]byte, n)
@@ -874,3 +923,202 @@
 		})
 	}
 }
+
+var memclrSink []int8
+
+func BenchmarkMemclrKnownSize1(b *testing.B) {
+	var x [1]int8
+
+	b.SetBytes(1)
+	for i := 0; i < b.N; i++ {
+		for a := range x {
+			x[a] = 0
+		}
+	}
+
+	memclrSink = x[:]
+}
+func BenchmarkMemclrKnownSize2(b *testing.B) {
+	var x [2]int8
+
+	b.SetBytes(2)
+	for i := 0; i < b.N; i++ {
+		for a := range x {
+			x[a] = 0
+		}
+	}
+
+	memclrSink = x[:]
+}
+func BenchmarkMemclrKnownSize4(b *testing.B) {
+	var x [4]int8
+
+	b.SetBytes(4)
+	for i := 0; i < b.N; i++ {
+		for a := range x {
+			x[a] = 0
+		}
+	}
+
+	memclrSink = x[:]
+}
+func BenchmarkMemclrKnownSize8(b *testing.B) {
+	var x [8]int8
+
+	b.SetBytes(8)
+	for i := 0; i < b.N; i++ {
+		for a := range x {
+			x[a] = 0
+		}
+	}
+
+	memclrSink = x[:]
+}
+func BenchmarkMemclrKnownSize16(b *testing.B) {
+	var x [16]int8
+
+	b.SetBytes(16)
+	for i := 0; i < b.N; i++ {
+		for a := range x {
+			x[a] = 0
+		}
+	}
+
+	memclrSink = x[:]
+}
+func BenchmarkMemclrKnownSize32(b *testing.B) {
+	var x [32]int8
+
+	b.SetBytes(32)
+	for i := 0; i < b.N; i++ {
+		for a := range x {
+			x[a] = 0
+		}
+	}
+
+	memclrSink = x[:]
+}
+func BenchmarkMemclrKnownSize64(b *testing.B) {
+	var x [64]int8
+
+	b.SetBytes(64)
+	for i := 0; i < b.N; i++ {
+		for a := range x {
+			x[a] = 0
+		}
+	}
+
+	memclrSink = x[:]
+}
+func BenchmarkMemclrKnownSize112(b *testing.B) {
+	var x [112]int8
+
+	b.SetBytes(112)
+	for i := 0; i < b.N; i++ {
+		for a := range x {
+			x[a] = 0
+		}
+	}
+
+	memclrSink = x[:]
+}
+
+func BenchmarkMemclrKnownSize128(b *testing.B) {
+	var x [128]int8
+
+	b.SetBytes(128)
+	for i := 0; i < b.N; i++ {
+		for a := range x {
+			x[a] = 0
+		}
+	}
+
+	memclrSink = x[:]
+}
+
+func BenchmarkMemclrKnownSize192(b *testing.B) {
+	var x [192]int8
+
+	b.SetBytes(192)
+	for i := 0; i < b.N; i++ {
+		for a := range x {
+			x[a] = 0
+		}
+	}
+
+	memclrSink = x[:]
+}
+
+func BenchmarkMemclrKnownSize248(b *testing.B) {
+	var x [248]int8
+
+	b.SetBytes(248)
+	for i := 0; i < b.N; i++ {
+		for a := range x {
+			x[a] = 0
+		}
+	}
+
+	memclrSink = x[:]
+}
+
+func BenchmarkMemclrKnownSize256(b *testing.B) {
+	var x [256]int8
+
+	b.SetBytes(256)
+	for i := 0; i < b.N; i++ {
+		for a := range x {
+			x[a] = 0
+		}
+	}
+
+	memclrSink = x[:]
+}
+func BenchmarkMemclrKnownSize512(b *testing.B) {
+	var x [512]int8
+
+	b.SetBytes(512)
+	for i := 0; i < b.N; i++ {
+		for a := range x {
+			x[a] = 0
+		}
+	}
+
+	memclrSink = x[:]
+}
+func BenchmarkMemclrKnownSize1024(b *testing.B) {
+	var x [1024]int8
+
+	b.SetBytes(1024)
+	for i := 0; i < b.N; i++ {
+		for a := range x {
+			x[a] = 0
+		}
+	}
+
+	memclrSink = x[:]
+}
+func BenchmarkMemclrKnownSize4096(b *testing.B) {
+	var x [4096]int8
+
+	b.SetBytes(4096)
+	for i := 0; i < b.N; i++ {
+		for a := range x {
+			x[a] = 0
+		}
+	}
+
+	memclrSink = x[:]
+}
+func BenchmarkMemclrKnownSize512KiB(b *testing.B) {
+	var x [524288]int8
+
+	b.SetBytes(524288)
+	for i := 0; i < b.N; i++ {
+		for a := range x {
+			x[a] = 0
+		}
+	}
+
+	memclrSink = x[:]
+}
diff --git a/src/runtime/metrics.go b/src/runtime/metrics.go
index 2061dc0..3d0f174 100644
--- a/src/runtime/metrics.go
+++ b/src/runtime/metrics.go
@@ -7,6 +7,7 @@
 // Metrics implementation exported to runtime/metrics.
 
 import (
+	"internal/godebugs"
 	"unsafe"
 )
 
@@ -71,7 +72,7 @@
 		// and exclusive lower bound (e.g. 48-byte size class is
 		// (32, 48]) whereas we want and inclusive lower-bound
 		// and exclusive upper-bound (e.g. 48-byte size class is
-		// [33, 49). We can achieve this by shifting all bucket
+		// [33, 49)). We can achieve this by shifting all bucket
 		// boundaries up by 1.
 		//
 		// Also, a float64 can precisely represent integers with
@@ -188,6 +189,34 @@
 				out.scalar = in.sysStats.gcCyclesDone
 			},
 		},
+		"/gc/scan/globals:bytes": {
+			deps: makeStatDepSet(gcStatsDep),
+			compute: func(in *statAggregate, out *metricValue) {
+				out.kind = metricKindUint64
+				out.scalar = in.gcStats.globalsScan
+			},
+		},
+		"/gc/scan/heap:bytes": {
+			deps: makeStatDepSet(gcStatsDep),
+			compute: func(in *statAggregate, out *metricValue) {
+				out.kind = metricKindUint64
+				out.scalar = in.gcStats.heapScan
+			},
+		},
+		"/gc/scan/stack:bytes": {
+			deps: makeStatDepSet(gcStatsDep),
+			compute: func(in *statAggregate, out *metricValue) {
+				out.kind = metricKindUint64
+				out.scalar = in.gcStats.stackScan
+			},
+		},
+		"/gc/scan/total:bytes": {
+			deps: makeStatDepSet(gcStatsDep),
+			compute: func(in *statAggregate, out *metricValue) {
+				out.kind = metricKindUint64
+				out.scalar = in.gcStats.totalScan
+			},
+		},
 		"/gc/heap/allocs-by-size:bytes": {
 			deps: makeStatDepSet(heapStatsDep),
 			compute: func(in *statAggregate, out *metricValue) {
@@ -247,6 +276,25 @@
 				out.scalar = in.sysStats.heapGoal
 			},
 		},
+		"/gc/gomemlimit:bytes": {
+			compute: func(in *statAggregate, out *metricValue) {
+				out.kind = metricKindUint64
+				out.scalar = uint64(gcController.memoryLimit.Load())
+			},
+		},
+		"/gc/gogc:percent": {
+			compute: func(in *statAggregate, out *metricValue) {
+				out.kind = metricKindUint64
+				out.scalar = uint64(gcController.gcPercent.Load())
+			},
+		},
+		"/gc/heap/live:bytes": {
+			deps: makeStatDepSet(heapStatsDep),
+			compute: func(in *statAggregate, out *metricValue) {
+				out.kind = metricKindUint64
+				out.scalar = gcController.heapMarked
+			},
+		},
 		"/gc/heap/objects:objects": {
 			deps: makeStatDepSet(heapStatsDep),
 			compute: func(in *statAggregate, out *metricValue) {
@@ -418,9 +466,41 @@
 			},
 		},
 	}
+
+	for _, info := range godebugs.All {
+		if !info.Opaque {
+			metrics["/godebug/non-default-behavior/"+info.Name+":events"] = metricData{compute: compute0}
+		}
+	}
+
 	metricsInit = true
 }
 
+func compute0(_ *statAggregate, out *metricValue) {
+	out.kind = metricKindUint64
+	out.scalar = 0
+}
+
+type metricReader func() uint64
+
+func (f metricReader) compute(_ *statAggregate, out *metricValue) {
+	out.kind = metricKindUint64
+	out.scalar = f()
+}
+
+//go:linkname godebug_registerMetric internal/godebug.registerMetric
+func godebug_registerMetric(name string, read func() uint64) {
+	metricsLock()
+	initMetrics()
+	d, ok := metrics[name]
+	if !ok {
+		throw("runtime: unexpected metric registration for " + name)
+	}
+	d.compute = metricReader(read).compute
+	metrics[name] = d
+	metricsUnlock()
+}
+
 // statDep is a dependency on a group of statistics
 // that a metric might have.
 type statDep uint
@@ -429,6 +509,7 @@
 	heapStatsDep statDep = iota // corresponds to heapStatsAggregate
 	sysStatsDep                 // corresponds to sysStatsAggregate
 	cpuStatsDep                 // corresponds to cpuStatsAggregate
+	gcStatsDep                  // corresponds to gcStatsAggregate
 	numStatsDeps
 )
 
@@ -446,7 +527,7 @@
 	return s
 }
 
-// differennce returns set difference of s from b as a new set.
+// difference returns set difference of s from b as a new set.
 func (s statDepSet) difference(b statDepSet) statDepSet {
 	var c statDepSet
 	for i := range s {
@@ -583,6 +664,28 @@
 // compute populates the cpuStatsAggregate with values from the runtime.
 func (a *cpuStatsAggregate) compute() {
 	a.cpuStats = work.cpuStats
+	// TODO(mknyszek): Update the CPU stats again so that we're not
+	// just relying on the STW snapshot. The issue here is that currently
+	// this will cause non-monotonicity in the "user" CPU time metric.
+	//
+	// a.cpuStats.accumulate(nanotime(), gcphase == _GCmark)
+}
+
+// gcStatsAggregate represents various GC stats obtained from the runtime
+// acquired together to avoid skew and inconsistencies.
+type gcStatsAggregate struct {
+	heapScan    uint64
+	stackScan   uint64
+	globalsScan uint64
+	totalScan   uint64
+}
+
+// compute populates the gcStatsAggregate with values from the runtime.
+func (a *gcStatsAggregate) compute() {
+	a.heapScan = gcController.heapScan.Load()
+	a.stackScan = uint64(gcController.lastStackScan.Load())
+	a.globalsScan = gcController.globalsScan.Load()
+	a.totalScan = a.heapScan + a.stackScan + a.globalsScan
 }
 
 // nsToSec takes a duration in nanoseconds and converts it to seconds as
@@ -594,13 +697,14 @@
 // statAggregate is the main driver of the metrics implementation.
 //
 // It contains multiple aggregates of runtime statistics, as well
-// as a set of these aggregates that it has populated. The aggergates
+// as a set of these aggregates that it has populated. The aggregates
 // are populated lazily by its ensure method.
 type statAggregate struct {
 	ensured   statDepSet
 	heapStats heapStatsAggregate
 	sysStats  sysStatsAggregate
 	cpuStats  cpuStatsAggregate
+	gcStats   gcStatsAggregate
 }
 
 // ensure populates statistics aggregates determined by deps if they
@@ -621,6 +725,8 @@
 			a.sysStats.compute()
 		case cpuStatsDep:
 			a.cpuStats.compute()
+		case gcStatsDep:
+			a.gcStats.compute()
 		}
 	}
 	a.ensured = a.ensured.union(missing)
@@ -687,6 +793,32 @@
 // like to avoid it escaping to the heap.
 var agg statAggregate
 
+type metricName struct {
+	name string
+	kind metricKind
+}
+
+// readMetricNames is the implementation of runtime/metrics.readMetricNames,
+// used by the runtime/metrics test and otherwise unreferenced.
+//
+//go:linkname readMetricNames runtime/metrics_test.runtime_readMetricNames
+func readMetricNames() []string {
+	metricsLock()
+	initMetrics()
+	n := len(metrics)
+	metricsUnlock()
+
+	list := make([]string, 0, n)
+
+	metricsLock()
+	for name := range metrics {
+		list = append(list, name)
+	}
+	metricsUnlock()
+
+	return list
+}
+
 // readMetrics is the implementation of runtime/metrics.Read.
 //
 //go:linkname readMetrics runtime/metrics.runtime_readMetrics
diff --git a/src/runtime/metrics/description.go b/src/runtime/metrics/description.go
index dcfe01e..745691b 100644
--- a/src/runtime/metrics/description.go
+++ b/src/runtime/metrics/description.go
@@ -4,6 +4,8 @@
 
 package metrics
 
+import "internal/godebugs"
+
 // Description describes a runtime metric.
 type Description struct {
 	// Name is the full name of the metric which includes the unit.
@@ -49,7 +51,7 @@
 }
 
 // The English language descriptions below must be kept in sync with the
-// descriptions of each metric in doc.go.
+// descriptions of each metric in doc.go by running 'go generate'.
 var allDesc = []Description{
 	{
 		Name:        "/cgo/go-to-c-calls:calls",
@@ -71,7 +73,6 @@
 		Name: "/cpu/classes/gc/mark/dedicated:cpu-seconds",
 		Description: "Estimated total CPU time spent performing GC tasks on " +
 			"processors (as defined by GOMAXPROCS) dedicated to those tasks. " +
-			"This includes time spent with the world stopped due to the GC. " +
 			"This metric is an overestimate, and not directly comparable to " +
 			"system CPU time measurements. Compare only with other /cpu/classes " +
 			"metrics.",
@@ -192,8 +193,23 @@
 		Cumulative:  true,
 	},
 	{
+		Name: "/gc/gogc:percent",
+		Description: "Heap size target percentage configured by the user, otherwise 100. This " +
+			"value is set by the GOGC environment variable, and the runtime/debug.SetGCPercent " +
+			"function.",
+		Kind: KindUint64,
+	},
+	{
+		Name: "/gc/gomemlimit:bytes",
+		Description: "Go runtime memory limit configured by the user, otherwise " +
+			"math.MaxInt64. This value is set by the GOMEMLIMIT environment variable, and " +
+			"the runtime/debug.SetMemoryLimit function.",
+		Kind: KindUint64,
+	},
+	{
 		Name: "/gc/heap/allocs-by-size:bytes",
 		Description: "Distribution of heap allocations by approximate size. " +
+			"Bucket counts increase monotonically. " +
 			"Note that this does not include tiny objects as defined by " +
 			"/gc/heap/tiny/allocs:objects, only tiny blocks.",
 		Kind:       KindFloat64Histogram,
@@ -216,6 +232,7 @@
 	{
 		Name: "/gc/heap/frees-by-size:bytes",
 		Description: "Distribution of freed heap allocations by approximate size. " +
+			"Bucket counts increase monotonically. " +
 			"Note that this does not include tiny objects as defined by " +
 			"/gc/heap/tiny/allocs:objects, only tiny blocks.",
 		Kind:       KindFloat64Histogram,
@@ -242,6 +259,11 @@
 		Kind:        KindUint64,
 	},
 	{
+		Name:        "/gc/heap/live:bytes",
+		Description: "Heap memory occupied by live objects that were marked by the previous GC.",
+		Kind:        KindUint64,
+	},
+	{
 		Name:        "/gc/heap/objects:objects",
 		Description: "Number of objects, live or unswept, occupying heap memory.",
 		Kind:        KindUint64,
@@ -267,11 +289,31 @@
 	},
 	{
 		Name:        "/gc/pauses:seconds",
-		Description: "Distribution individual GC-related stop-the-world pause latencies.",
+		Description: "Distribution of individual GC-related stop-the-world pause latencies. Bucket counts increase monotonically.",
 		Kind:        KindFloat64Histogram,
 		Cumulative:  true,
 	},
 	{
+		Name:        "/gc/scan/globals:bytes",
+		Description: "The total amount of global variable space that is scannable.",
+		Kind:        KindUint64,
+	},
+	{
+		Name:        "/gc/scan/heap:bytes",
+		Description: "The total amount of heap space that is scannable.",
+		Kind:        KindUint64,
+	},
+	{
+		Name:        "/gc/scan/stack:bytes",
+		Description: "The number of bytes of stack that were scanned last GC cycle.",
+		Kind:        KindUint64,
+	},
+	{
+		Name:        "/gc/scan/total:bytes",
+		Description: "The total amount space that is scannable. Sum of all metrics in /gc/scan.",
+		Kind:        KindUint64,
+	},
+	{
 		Name:        "/gc/stack/starting-size:bytes",
 		Description: "The stack size of new goroutines.",
 		Kind:        KindUint64,
@@ -297,9 +339,11 @@
 		Kind: KindUint64,
 	},
 	{
-		Name:        "/memory/classes/heap/stacks:bytes",
-		Description: "Memory allocated from the heap that is reserved for stack space, whether or not it is currently in-use.",
-		Kind:        KindUint64,
+		Name: "/memory/classes/heap/stacks:bytes",
+		Description: "Memory allocated from the heap that is reserved for stack space, whether or not it is currently in-use. " +
+			"Currently, this represents all stack memory for goroutines. It also includes all OS thread stacks in non-cgo programs. " +
+			"Note that stacks may be allocated differently in the future, and this may change.",
+		Kind: KindUint64,
 	},
 	{
 		Name:        "/memory/classes/heap/unused:bytes",
@@ -332,9 +376,13 @@
 		Kind:        KindUint64,
 	},
 	{
-		Name:        "/memory/classes/os-stacks:bytes",
-		Description: "Stack memory allocated by the underlying operating system.",
-		Kind:        KindUint64,
+		Name: "/memory/classes/os-stacks:bytes",
+		Description: "Stack memory allocated by the underlying operating system. " +
+			"In non-cgo programs this metric is currently zero. This may change in the future." +
+			"In cgo programs this metric includes OS thread stacks allocated directly from the OS. " +
+			"Currently, this only accounts for one stack in c-shared and c-archive build modes, " +
+			"and other sources of stacks from the OS are not measured. This too may change in the future.",
+		Kind: KindUint64,
 	},
 	{
 		Name:        "/memory/classes/other:bytes",
@@ -363,8 +411,9 @@
 	},
 	{
 		Name:        "/sched/latencies:seconds",
-		Description: "Distribution of the time goroutines have spent in the scheduler in a runnable state before actually running.",
+		Description: "Distribution of the time goroutines have spent in the scheduler in a runnable state before actually running. Bucket counts increase monotonically.",
 		Kind:        KindFloat64Histogram,
+		Cumulative:  true,
 	},
 	{
 		Name:        "/sync/mutex/wait/total:seconds",
@@ -374,6 +423,30 @@
 	},
 }
 
+func init() {
+	// Insert all the non-default-reporting GODEBUGs into the table,
+	// preserving the overall sort order.
+	i := 0
+	for i < len(allDesc) && allDesc[i].Name < "/godebug/" {
+		i++
+	}
+	more := make([]Description, i, len(allDesc)+len(godebugs.All))
+	copy(more, allDesc)
+	for _, info := range godebugs.All {
+		if !info.Opaque {
+			more = append(more, Description{
+				Name: "/godebug/non-default-behavior/" + info.Name + ":events",
+				Description: "The number of non-default behaviors executed by the " +
+					info.Package + " package " + "due to a non-default " +
+					"GODEBUG=" + info.Name + "=... setting.",
+				Kind:       KindUint64,
+				Cumulative: true,
+			})
+		}
+	}
+	allDesc = append(more, allDesc[i:]...)
+}
+
 // All returns a slice of containing metric descriptions for all supported metrics.
 func All() []Description {
 	return allDesc
diff --git a/src/runtime/metrics/description_test.go b/src/runtime/metrics/description_test.go
index 192c1f2..4fc6523 100644
--- a/src/runtime/metrics/description_test.go
+++ b/src/runtime/metrics/description_test.go
@@ -5,111 +5,154 @@
 package metrics_test
 
 import (
-	"bufio"
+	"bytes"
+	"flag"
+	"fmt"
+	"go/ast"
+	"go/doc"
+	"go/doc/comment"
+	"go/format"
+	"go/parser"
+	"go/token"
+	"internal/diff"
 	"os"
 	"regexp"
 	"runtime/metrics"
+	"sort"
 	"strings"
 	"testing"
+	_ "unsafe"
 )
 
-func TestDescriptionNameFormat(t *testing.T) {
+// Implemented in the runtime.
+//
+//go:linkname runtime_readMetricNames
+func runtime_readMetricNames() []string
+
+func TestNames(t *testing.T) {
+	// Note that this regexp is promised in the package docs for Description. Do not change.
 	r := regexp.MustCompile("^(?P<name>/[^:]+):(?P<unit>[^:*/]+(?:[*/][^:*/]+)*)$")
-	descriptions := metrics.All()
-	for _, desc := range descriptions {
-		if !r.MatchString(desc.Name) {
-			t.Errorf("metrics %q does not match regexp %s", desc.Name, r)
+	all := metrics.All()
+	for i, d := range all {
+		if !r.MatchString(d.Name) {
+			t.Errorf("name %q does not match regexp %#q", d.Name, r)
 		}
+		if i > 0 && all[i-1].Name >= all[i].Name {
+			t.Fatalf("allDesc not sorted: %s ≥ %s", all[i-1].Name, all[i].Name)
+		}
+	}
+
+	names := runtime_readMetricNames()
+	sort.Strings(names)
+	samples := make([]metrics.Sample, len(names))
+	for i, name := range names {
+		samples[i].Name = name
+	}
+	metrics.Read(samples)
+
+	for _, d := range all {
+		for len(samples) > 0 && samples[0].Name < d.Name {
+			t.Errorf("%s: reported by runtime but not listed in All", samples[0].Name)
+			samples = samples[1:]
+		}
+		if len(samples) == 0 || d.Name < samples[0].Name {
+			t.Errorf("%s: listed in All but not reported by runtime", d.Name)
+			continue
+		}
+		if samples[0].Value.Kind() != d.Kind {
+			t.Errorf("%s: runtime reports %v but All reports %v", d.Name, samples[0].Value.Kind(), d.Kind)
+		}
+		samples = samples[1:]
 	}
 }
 
-func extractMetricDocs(t *testing.T) map[string]string {
-	f, err := os.Open("doc.go")
+func wrap(prefix, text string, width int) string {
+	doc := &comment.Doc{Content: []comment.Block{&comment.Paragraph{Text: []comment.Text{comment.Plain(text)}}}}
+	pr := &comment.Printer{TextPrefix: prefix, TextWidth: width}
+	return string(pr.Text(doc))
+}
+
+func formatDesc(t *testing.T) string {
+	var b strings.Builder
+	for i, d := range metrics.All() {
+		if i > 0 {
+			fmt.Fprintf(&b, "\n")
+		}
+		fmt.Fprintf(&b, "%s\n", d.Name)
+		fmt.Fprintf(&b, "%s", wrap("\t", d.Description, 80-2*8))
+	}
+	return b.String()
+}
+
+var generate = flag.Bool("generate", false, "update doc.go for go generate")
+
+func TestDocs(t *testing.T) {
+	want := formatDesc(t)
+
+	src, err := os.ReadFile("doc.go")
 	if err != nil {
-		t.Fatalf("failed to open doc.go in runtime/metrics package: %v", err)
+		t.Fatal(err)
 	}
-	const (
-		stateSearch          = iota // look for list of metrics
-		stateNextMetric             // look for next metric
-		stateNextDescription        // build description
-	)
-	state := stateSearch
-	s := bufio.NewScanner(f)
-	result := make(map[string]string)
-	var metric string
-	var prevMetric string
-	var desc strings.Builder
-	for s.Scan() {
-		line := strings.TrimSpace(s.Text())
-		switch state {
-		case stateSearch:
-			if line == "Below is the full list of supported metrics, ordered lexicographically." {
-				state = stateNextMetric
+	fset := token.NewFileSet()
+	f, err := parser.ParseFile(fset, "doc.go", src, parser.ParseComments)
+	if err != nil {
+		t.Fatal(err)
+	}
+	fdoc := f.Doc
+	if fdoc == nil {
+		t.Fatal("no doc comment in doc.go")
+	}
+	pkg, err := doc.NewFromFiles(fset, []*ast.File{f}, "runtime/metrics")
+	if err != nil {
+		t.Fatal(err)
+	}
+	if pkg.Doc == "" {
+		t.Fatal("doc.NewFromFiles lost doc comment")
+	}
+	doc := new(comment.Parser).Parse(pkg.Doc)
+	expectCode := false
+	foundCode := false
+	updated := false
+	for _, block := range doc.Content {
+		switch b := block.(type) {
+		case *comment.Heading:
+			expectCode = false
+			if b.Text[0] == comment.Plain("Supported metrics") {
+				expectCode = true
 			}
-		case stateNextMetric:
-			// Ignore empty lines until we find a non-empty
-			// one. This will be our metric name.
-			if len(line) != 0 {
-				prevMetric = metric
-				metric = line
-				if prevMetric > metric {
-					t.Errorf("metrics %s and %s are out of lexicographical order", prevMetric, metric)
+		case *comment.Code:
+			if expectCode {
+				foundCode = true
+				if b.Text != want {
+					if !*generate {
+						t.Fatalf("doc comment out of date; use go generate to rebuild\n%s", diff.Diff("old", []byte(b.Text), "want", []byte(want)))
+					}
+					b.Text = want
+					updated = true
 				}
-				state = stateNextDescription
-			}
-		case stateNextDescription:
-			if len(line) == 0 || line == `*/` {
-				// An empty line means we're done.
-				// Write down the description and look
-				// for a new metric.
-				result[metric] = desc.String()
-				desc.Reset()
-				state = stateNextMetric
-			} else {
-				// As long as we're seeing data, assume that's
-				// part of the description and append it.
-				if desc.Len() != 0 {
-					// Turn previous newlines into spaces.
-					desc.WriteString(" ")
-				}
-				desc.WriteString(line)
 			}
 		}
-		if line == `*/` {
-			break
-		}
 	}
-	if state == stateSearch {
-		t.Fatalf("failed to find supported metrics docs in %s", f.Name())
-	}
-	return result
-}
 
-func TestDescriptionDocs(t *testing.T) {
-	docs := extractMetricDocs(t)
-	descriptions := metrics.All()
-	for _, d := range descriptions {
-		want := d.Description
-		got, ok := docs[d.Name]
-		if !ok {
-			t.Errorf("no docs found for metric %s", d.Name)
-			continue
-		}
-		if got != want {
-			t.Errorf("mismatched description and docs for metric %s", d.Name)
-			t.Errorf("want: %q, got %q", want, got)
-			continue
-		}
+	if !foundCode {
+		t.Fatalf("did not find Supported metrics list in doc.go")
 	}
-	if len(docs) > len(descriptions) {
-	docsLoop:
-		for name := range docs {
-			for _, d := range descriptions {
-				if name == d.Name {
-					continue docsLoop
-				}
-			}
-			t.Errorf("stale documentation for non-existent metric: %s", name)
+	if updated {
+		fmt.Fprintf(os.Stderr, "go test -generate: writing new doc.go\n")
+		var buf bytes.Buffer
+		buf.Write(src[:fdoc.Pos()-f.FileStart])
+		buf.WriteString("/*\n")
+		buf.Write(new(comment.Printer).Comment(doc))
+		buf.WriteString("*/")
+		buf.Write(src[fdoc.End()-f.FileStart:])
+		src, err := format.Source(buf.Bytes())
+		if err != nil {
+			t.Fatal(err)
 		}
+		if err := os.WriteFile("doc.go", src, 0666); err != nil {
+			t.Fatal(err)
+		}
+	} else if *generate {
+		fmt.Fprintf(os.Stderr, "go test -generate: doc.go already up-to-date\n")
 	}
 }
diff --git a/src/runtime/metrics/doc.go b/src/runtime/metrics/doc.go
index b593d8d..55d1f65 100644
--- a/src/runtime/metrics/doc.go
+++ b/src/runtime/metrics/doc.go
@@ -2,10 +2,13 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
+// Note: run 'go generate' (which will run 'go test -generate') to update the "Supported metrics" list.
+//go:generate go test -run=Docs -generate
+
 /*
 Package metrics provides a stable interface to access implementation-defined
 metrics exported by the Go runtime. This package is similar to existing functions
-like runtime.ReadMemStats and debug.ReadGCStats, but significantly more general.
+like [runtime.ReadMemStats] and [debug.ReadGCStats], but significantly more general.
 
 The set of metrics defined by this package may evolve as the runtime itself
 evolves, and also enables variation across Go implementations, whose relevant
@@ -55,88 +58,83 @@
 		Count of calls made from Go to C by the current process.
 
 	/cpu/classes/gc/mark/assist:cpu-seconds
-		Estimated total CPU time goroutines spent performing GC tasks
-		to assist the GC and prevent it from falling behind the application.
-		This metric is an overestimate, and not directly comparable to
-		system CPU time measurements. Compare only with other /cpu/classes
-		metrics.
+		Estimated total CPU time goroutines spent performing GC
+		tasks to assist the GC and prevent it from falling behind the
+		application. This metric is an overestimate, and not directly
+		comparable to system CPU time measurements. Compare only with
+		other /cpu/classes metrics.
 
 	/cpu/classes/gc/mark/dedicated:cpu-seconds
-		Estimated total CPU time spent performing GC tasks on
-		processors (as defined by GOMAXPROCS) dedicated to those tasks.
-		This includes time spent with the world stopped due to the GC.
-		This metric is an overestimate, and not directly comparable to
-		system CPU time measurements. Compare only with other /cpu/classes
-		metrics.
+		Estimated total CPU time spent performing GC tasks on processors
+		(as defined by GOMAXPROCS) dedicated to those tasks. This metric
+		is an overestimate, and not directly comparable to system CPU
+		time measurements. Compare only with other /cpu/classes metrics.
 
 	/cpu/classes/gc/mark/idle:cpu-seconds
-		Estimated total CPU time spent performing GC tasks on
-		spare CPU resources that the Go scheduler could not otherwise find
-		a use for. This should be subtracted from the total GC CPU time to
-		obtain a measure of compulsory GC CPU time.
-		This metric is an overestimate, and not directly comparable to
-		system CPU time measurements. Compare only with other /cpu/classes
-		metrics.
+		Estimated total CPU time spent performing GC tasks on spare CPU
+		resources that the Go scheduler could not otherwise find a use
+		for. This should be subtracted from the total GC CPU time to
+		obtain a measure of compulsory GC CPU time. This metric is an
+		overestimate, and not directly comparable to system CPU time
+		measurements. Compare only with other /cpu/classes metrics.
 
 	/cpu/classes/gc/pause:cpu-seconds
 		Estimated total CPU time spent with the application paused by
-		the GC. Even if only one thread is running during the pause, this is
-		computed as GOMAXPROCS times the pause latency because nothing else
-		can be executing. This is the exact sum of samples in /gc/pause:seconds
-		if each sample is multiplied by GOMAXPROCS at the time it is taken.
-		This metric is an overestimate, and not directly comparable to
-		system CPU time measurements. Compare only with other /cpu/classes
-		metrics.
+		the GC. Even if only one thread is running during the pause,
+		this is computed as GOMAXPROCS times the pause latency because
+		nothing else can be executing. This is the exact sum of samples
+		in /gc/pause:seconds if each sample is multiplied by GOMAXPROCS
+		at the time it is taken. This metric is an overestimate,
+		and not directly comparable to system CPU time measurements.
+		Compare only with other /cpu/classes metrics.
 
 	/cpu/classes/gc/total:cpu-seconds
-		Estimated total CPU time spent performing GC tasks.
-		This metric is an overestimate, and not directly comparable to
-		system CPU time measurements. Compare only with other /cpu/classes
-		metrics. Sum of all metrics in /cpu/classes/gc.
+		Estimated total CPU time spent performing GC tasks. This metric
+		is an overestimate, and not directly comparable to system CPU
+		time measurements. Compare only with other /cpu/classes metrics.
+		Sum of all metrics in /cpu/classes/gc.
 
 	/cpu/classes/idle:cpu-seconds
-		Estimated total available CPU time not spent executing any Go or Go
-		runtime code. In other words, the part of /cpu/classes/total:cpu-seconds
-		that was unused.
-		This metric is an overestimate, and not directly comparable to
-		system CPU time measurements. Compare only with other /cpu/classes
-		metrics.
+		Estimated total available CPU time not spent executing
+		any Go or Go runtime code. In other words, the part of
+		/cpu/classes/total:cpu-seconds that was unused. This metric is
+		an overestimate, and not directly comparable to system CPU time
+		measurements. Compare only with other /cpu/classes metrics.
 
 	/cpu/classes/scavenge/assist:cpu-seconds
 		Estimated total CPU time spent returning unused memory to the
-		underlying platform in response eagerly in response to memory pressure.
-		This metric is an overestimate, and not directly comparable to
-		system CPU time measurements. Compare only with other /cpu/classes
-		metrics.
+		underlying platform in response eagerly in response to memory
+		pressure. This metric is an overestimate, and not directly
+		comparable to system CPU time measurements. Compare only with
+		other /cpu/classes metrics.
 
 	/cpu/classes/scavenge/background:cpu-seconds
-		Estimated total CPU time spent performing background tasks
-		to return unused memory to the underlying platform.
-		This metric is an overestimate, and not directly comparable to
-		system CPU time measurements. Compare only with other /cpu/classes
-		metrics.
+		Estimated total CPU time spent performing background tasks to
+		return unused memory to the underlying platform. This metric is
+		an overestimate, and not directly comparable to system CPU time
+		measurements. Compare only with other /cpu/classes metrics.
 
 	/cpu/classes/scavenge/total:cpu-seconds
 		Estimated total CPU time spent performing tasks that return
-		unused memory to the underlying platform.
-		This metric is an overestimate, and not directly comparable to
-		system CPU time measurements. Compare only with other /cpu/classes
-		metrics. Sum of all metrics in /cpu/classes/scavenge.
+		unused memory to the underlying platform. This metric is an
+		overestimate, and not directly comparable to system CPU time
+		measurements. Compare only with other /cpu/classes metrics.
+		Sum of all metrics in /cpu/classes/scavenge.
 
 	/cpu/classes/total:cpu-seconds
-		Estimated total available CPU time for user Go code or the Go runtime, as
-		defined by GOMAXPROCS. In other words, GOMAXPROCS integrated over the
-		wall-clock duration this process has been executing for.
-		This metric is an overestimate, and not directly comparable to
-		system CPU time measurements. Compare only with other /cpu/classes
-		metrics. Sum of all metrics in /cpu/classes.
+		Estimated total available CPU time for user Go code or the Go
+		runtime, as defined by GOMAXPROCS. In other words, GOMAXPROCS
+		integrated over the wall-clock duration this process has been
+		executing for. This metric is an overestimate, and not directly
+		comparable to system CPU time measurements. Compare only with
+		other /cpu/classes metrics. Sum of all metrics in /cpu/classes.
 
 	/cpu/classes/user:cpu-seconds
 		Estimated total CPU time spent running user Go code. This may
 		also include some small amount of time spent in the Go runtime.
-		This metric is an overestimate, and not directly comparable to
-		system CPU time measurements. Compare only with other /cpu/classes
-		metrics.
+		This metric is an overestimate, and not directly comparable
+		to system CPU time measurements. Compare only with other
+		/cpu/classes metrics.
 
 	/gc/cycles/automatic:gc-cycles
 		Count of completed GC cycles generated by the Go runtime.
@@ -147,58 +145,169 @@
 	/gc/cycles/total:gc-cycles
 		Count of all completed GC cycles.
 
+	/gc/gogc:percent
+		Heap size target percentage configured by the user, otherwise
+		100. This value is set by the GOGC environment variable, and the
+		runtime/debug.SetGCPercent function.
+
+	/gc/gomemlimit:bytes
+		Go runtime memory limit configured by the user, otherwise
+		math.MaxInt64. This value is set by the GOMEMLIMIT environment
+		variable, and the runtime/debug.SetMemoryLimit function.
+
 	/gc/heap/allocs-by-size:bytes
 		Distribution of heap allocations by approximate size.
-		Note that this does not include tiny objects as defined by /gc/heap/tiny/allocs:objects,
+		Bucket counts increase monotonically. Note that this does not
+		include tiny objects as defined by /gc/heap/tiny/allocs:objects,
 		only tiny blocks.
 
 	/gc/heap/allocs:bytes
-		Cumulative sum of memory allocated to the heap by the application.
+		Cumulative sum of memory allocated to the heap by the
+		application.
 
 	/gc/heap/allocs:objects
-		Cumulative count of heap allocations triggered by the application.
-		Note that this does not include tiny objects as defined by /gc/heap/tiny/allocs:objects,
-		only tiny blocks.
+		Cumulative count of heap allocations triggered by the
+		application. Note that this does not include tiny objects as
+		defined by /gc/heap/tiny/allocs:objects, only tiny blocks.
 
 	/gc/heap/frees-by-size:bytes
 		Distribution of freed heap allocations by approximate size.
-		Note that this does not include tiny objects as defined by /gc/heap/tiny/allocs:objects,
+		Bucket counts increase monotonically. Note that this does not
+		include tiny objects as defined by /gc/heap/tiny/allocs:objects,
 		only tiny blocks.
 
 	/gc/heap/frees:bytes
 		Cumulative sum of heap memory freed by the garbage collector.
 
 	/gc/heap/frees:objects
-		Cumulative count of heap allocations whose storage was freed by the garbage collector.
-		Note that this does not include tiny objects as defined by /gc/heap/tiny/allocs:objects,
-		only tiny blocks.
+		Cumulative count of heap allocations whose storage was freed
+		by the garbage collector. Note that this does not include tiny
+		objects as defined by /gc/heap/tiny/allocs:objects, only tiny
+		blocks.
 
 	/gc/heap/goal:bytes
 		Heap size target for the end of the GC cycle.
 
+	/gc/heap/live:bytes
+		Heap memory occupied by live objects that were marked by the
+		previous GC.
+
 	/gc/heap/objects:objects
 		Number of objects, live or unswept, occupying heap memory.
 
 	/gc/heap/tiny/allocs:objects
 		Count of small allocations that are packed together into blocks.
 		These allocations are counted separately from other allocations
-		because each individual allocation is not tracked by the runtime,
-		only their block. Each block is already accounted for in
-		allocs-by-size and frees-by-size.
+		because each individual allocation is not tracked by the
+		runtime, only their block. Each block is already accounted for
+		in allocs-by-size and frees-by-size.
 
 	/gc/limiter/last-enabled:gc-cycle
 		GC cycle the last time the GC CPU limiter was enabled.
-		This metric is useful for diagnosing the root cause of an out-of-memory
-		error, because the limiter trades memory for CPU time when the GC's CPU
-		time gets too high. This is most likely to occur with use of SetMemoryLimit.
-		The first GC cycle is cycle 1, so a value of 0 indicates that it was never enabled.
+		This metric is useful for diagnosing the root cause of an
+		out-of-memory error, because the limiter trades memory for CPU
+		time when the GC's CPU time gets too high. This is most likely
+		to occur with use of SetMemoryLimit. The first GC cycle is cycle
+		1, so a value of 0 indicates that it was never enabled.
 
 	/gc/pauses:seconds
-		Distribution individual GC-related stop-the-world pause latencies.
+		Distribution of individual GC-related stop-the-world pause
+		latencies. Bucket counts increase monotonically.
+
+	/gc/scan/globals:bytes
+		The total amount of global variable space that is scannable.
+
+	/gc/scan/heap:bytes
+		The total amount of heap space that is scannable.
+
+	/gc/scan/stack:bytes
+		The number of bytes of stack that were scanned last GC cycle.
+
+	/gc/scan/total:bytes
+		The total amount space that is scannable. Sum of all metrics in
+		/gc/scan.
 
 	/gc/stack/starting-size:bytes
 		The stack size of new goroutines.
 
+	/godebug/non-default-behavior/execerrdot:events
+		The number of non-default behaviors executed by the os/exec
+		package due to a non-default GODEBUG=execerrdot=... setting.
+
+	/godebug/non-default-behavior/gocachehash:events
+		The number of non-default behaviors executed by the cmd/go
+		package due to a non-default GODEBUG=gocachehash=... setting.
+
+	/godebug/non-default-behavior/gocachetest:events
+		The number of non-default behaviors executed by the cmd/go
+		package due to a non-default GODEBUG=gocachetest=... setting.
+
+	/godebug/non-default-behavior/gocacheverify:events
+		The number of non-default behaviors executed by the cmd/go
+		package due to a non-default GODEBUG=gocacheverify=... setting.
+
+	/godebug/non-default-behavior/http2client:events
+		The number of non-default behaviors executed by the net/http
+		package due to a non-default GODEBUG=http2client=... setting.
+
+	/godebug/non-default-behavior/http2server:events
+		The number of non-default behaviors executed by the net/http
+		package due to a non-default GODEBUG=http2server=... setting.
+
+	/godebug/non-default-behavior/installgoroot:events
+		The number of non-default behaviors executed by the go/build
+		package due to a non-default GODEBUG=installgoroot=... setting.
+
+	/godebug/non-default-behavior/jstmpllitinterp:events
+		The number of non-default behaviors executed by
+		the html/template package due to a non-default
+		GODEBUG=jstmpllitinterp=... setting.
+
+	/godebug/non-default-behavior/multipartmaxheaders:events
+		The number of non-default behaviors executed by
+		the mime/multipart package due to a non-default
+		GODEBUG=multipartmaxheaders=... setting.
+
+	/godebug/non-default-behavior/multipartmaxparts:events
+		The number of non-default behaviors executed by
+		the mime/multipart package due to a non-default
+		GODEBUG=multipartmaxparts=... setting.
+
+	/godebug/non-default-behavior/multipathtcp:events
+		The number of non-default behaviors executed by the net package
+		due to a non-default GODEBUG=multipathtcp=... setting.
+
+	/godebug/non-default-behavior/panicnil:events
+		The number of non-default behaviors executed by the runtime
+		package due to a non-default GODEBUG=panicnil=... setting.
+
+	/godebug/non-default-behavior/randautoseed:events
+		The number of non-default behaviors executed by the math/rand
+		package due to a non-default GODEBUG=randautoseed=... setting.
+
+	/godebug/non-default-behavior/tarinsecurepath:events
+		The number of non-default behaviors executed by the archive/tar
+		package due to a non-default GODEBUG=tarinsecurepath=...
+		setting.
+
+	/godebug/non-default-behavior/tlsmaxrsasize:events
+		The number of non-default behaviors executed by the crypto/tls
+		package due to a non-default GODEBUG=tlsmaxrsasize=... setting.
+
+	/godebug/non-default-behavior/x509sha1:events
+		The number of non-default behaviors executed by the crypto/x509
+		package due to a non-default GODEBUG=x509sha1=... setting.
+
+	/godebug/non-default-behavior/x509usefallbackroots:events
+		The number of non-default behaviors executed by the crypto/x509
+		package due to a non-default GODEBUG=x509usefallbackroots=...
+		setting.
+
+	/godebug/non-default-behavior/zipinsecurepath:events
+		The number of non-default behaviors executed by the archive/zip
+		package due to a non-default GODEBUG=zipinsecurepath=...
+		setting.
+
 	/memory/classes/heap/free:bytes
 		Memory that is completely free and eligible to be returned to
 		the underlying system, but has not been. This metric is the
@@ -206,50 +315,57 @@
 		physical memory.
 
 	/memory/classes/heap/objects:bytes
-		Memory occupied by live objects and dead objects that have
-		not yet been marked free by the garbage collector.
+		Memory occupied by live objects and dead objects that have not
+		yet been marked free by the garbage collector.
 
 	/memory/classes/heap/released:bytes
-		Memory that is completely free and has been returned to
-		the underlying system. This metric is the runtime's estimate of
-		free address space that is still mapped into the process, but
-		is not backed by physical memory.
+		Memory that is completely free and has been returned to the
+		underlying system. This metric is the runtime's estimate of free
+		address space that is still mapped into the process, but is not
+		backed by physical memory.
 
 	/memory/classes/heap/stacks:bytes
-		Memory allocated from the heap that is reserved for stack
-		space, whether or not it is currently in-use.
+		Memory allocated from the heap that is reserved for stack space,
+		whether or not it is currently in-use. Currently, this
+		represents all stack memory for goroutines. It also includes all
+		OS thread stacks in non-cgo programs. Note that stacks may be
+		allocated differently in the future, and this may change.
 
 	/memory/classes/heap/unused:bytes
 		Memory that is reserved for heap objects but is not currently
 		used to hold heap objects.
 
 	/memory/classes/metadata/mcache/free:bytes
-		Memory that is reserved for runtime mcache structures, but
-		not in-use.
+		Memory that is reserved for runtime mcache structures, but not
+		in-use.
 
 	/memory/classes/metadata/mcache/inuse:bytes
-		Memory that is occupied by runtime mcache structures that
-		are currently being used.
+		Memory that is occupied by runtime mcache structures that are
+		currently being used.
 
 	/memory/classes/metadata/mspan/free:bytes
-		Memory that is reserved for runtime mspan structures, but
-		not in-use.
+		Memory that is reserved for runtime mspan structures, but not
+		in-use.
 
 	/memory/classes/metadata/mspan/inuse:bytes
 		Memory that is occupied by runtime mspan structures that are
 		currently being used.
 
 	/memory/classes/metadata/other:bytes
-		Memory that is reserved for or used to hold runtime
-		metadata.
+		Memory that is reserved for or used to hold runtime metadata.
 
 	/memory/classes/os-stacks:bytes
 		Stack memory allocated by the underlying operating system.
+		In non-cgo programs this metric is currently zero. This may
+		change in the future.In cgo programs this metric includes
+		OS thread stacks allocated directly from the OS. Currently,
+		this only accounts for one stack in c-shared and c-archive build
+		modes, and other sources of stacks from the OS are not measured.
+		This too may change in the future.
 
 	/memory/classes/other:bytes
-		Memory used by execution trace buffers, structures for
-		debugging the runtime, finalizer and profiler specials, and
-		more.
+		Memory used by execution trace buffers, structures for debugging
+		the runtime, finalizer and profiler specials, and more.
 
 	/memory/classes/profiling/buckets:bytes
 		Memory that is used by the stack trace hash map used for
@@ -258,8 +374,8 @@
 	/memory/classes/total:bytes
 		All memory mapped by the Go runtime into the current process
 		as read-write. Note that this does not include memory mapped
-		by code called via cgo or via the syscall package.
-		Sum of all metrics in /memory/classes.
+		by code called via cgo or via the syscall package. Sum of all
+		metrics in /memory/classes.
 
 	/sched/gomaxprocs:threads
 		The current runtime.GOMAXPROCS setting, or the number of
@@ -271,13 +387,14 @@
 
 	/sched/latencies:seconds
 		Distribution of the time goroutines have spent in the scheduler
-		in a runnable state before actually running.
+		in a runnable state before actually running. Bucket counts
+		increase monotonically.
 
 	/sync/mutex/wait/total:seconds
-		Approximate cumulative time goroutines have spent blocked on a
-		sync.Mutex or sync.RWMutex. This metric is useful for identifying
-		global changes in lock contention. Collect a mutex or block
-		profile using the runtime/pprof package for more detailed
-		contention data.
+		Approximate cumulative time goroutines have spent blocked
+		on a sync.Mutex or sync.RWMutex. This metric is useful for
+		identifying global changes in lock contention. Collect a mutex
+		or block profile using the runtime/pprof package for more
+		detailed contention data.
 */
 package metrics
diff --git a/src/runtime/metrics_test.go b/src/runtime/metrics_test.go
index d981c8e..cfb09a3 100644
--- a/src/runtime/metrics_test.go
+++ b/src/runtime/metrics_test.go
@@ -7,6 +7,7 @@
 import (
 	"reflect"
 	"runtime"
+	"runtime/debug"
 	"runtime/metrics"
 	"sort"
 	"strings"
@@ -28,6 +29,19 @@
 }
 
 func TestReadMetrics(t *testing.T) {
+	// Run a GC cycle to get some of the stats to be non-zero.
+	runtime.GC()
+
+	// Set an arbitrary memory limit to check the metric for it
+	limit := int64(512 * 1024 * 1024)
+	oldLimit := debug.SetMemoryLimit(limit)
+	defer debug.SetMemoryLimit(oldLimit)
+
+	// Set an GC percent to check the metric for it
+	gcPercent := 99
+	oldGCPercent := debug.SetGCPercent(gcPercent)
+	defer debug.SetGCPercent(oldGCPercent)
+
 	// Tests whether readMetrics produces values aligning
 	// with ReadMemStats while the world is stopped.
 	var mstats runtime.MemStats
@@ -128,10 +142,29 @@
 			mallocs = samples[i].Value.Uint64()
 		case "/gc/heap/frees:objects":
 			frees = samples[i].Value.Uint64()
+		case "/gc/heap/live:bytes":
+			// Check for "obviously wrong" values. We can't check a stronger invariant,
+			// such as live <= HeapAlloc, because live is not 100% accurate. It's computed
+			// under racy conditions, and some objects may be double-counted (this is
+			// intentional and necessary for GC performance).
+			//
+			// Instead, check against a much more reasonable upper-bound: the amount of
+			// mapped heap memory. We can't possibly overcount to the point of exceeding
+			// total mapped heap memory, except if there's an accounting bug.
+			if live := samples[i].Value.Uint64(); live > mstats.HeapSys {
+				t.Errorf("live bytes: %d > heap sys: %d", live, mstats.HeapSys)
+			} else if live == 0 {
+				// Might happen if we don't call runtime.GC() above.
+				t.Error("live bytes is 0")
+			}
+		case "/gc/gomemlimit:bytes":
+			checkUint64(t, name, samples[i].Value.Uint64(), uint64(limit))
 		case "/gc/heap/objects:objects":
 			checkUint64(t, name, samples[i].Value.Uint64(), mstats.HeapObjects)
 		case "/gc/heap/goal:bytes":
 			checkUint64(t, name, samples[i].Value.Uint64(), mstats.NextGC)
+		case "/gc/gogc:percent":
+			checkUint64(t, name, samples[i].Value.Uint64(), uint64(gcPercent))
 		case "/gc/cycles/automatic:gc-cycles":
 			checkUint64(t, name, samples[i].Value.Uint64(), uint64(mstats.NumGC-mstats.NumForcedGC))
 		case "/gc/cycles/forced:gc-cycles":
@@ -188,6 +221,9 @@
 		numGC  uint64
 		pauses uint64
 	}
+	var totalScan struct {
+		got, want uint64
+	}
 	var cpu struct {
 		gcAssist    float64
 		gcDedicated float64
@@ -270,6 +306,14 @@
 			for i := range h.Counts {
 				gc.pauses += h.Counts[i]
 			}
+		case "/gc/scan/heap:bytes":
+			totalScan.want += samples[i].Value.Uint64()
+		case "/gc/scan/globals:bytes":
+			totalScan.want += samples[i].Value.Uint64()
+		case "/gc/scan/stack:bytes":
+			totalScan.want += samples[i].Value.Uint64()
+		case "/gc/scan/total:bytes":
+			totalScan.got = samples[i].Value.Uint64()
 		case "/sched/gomaxprocs:threads":
 			if got, want := samples[i].Value.Uint64(), uint64(runtime.GOMAXPROCS(-1)); got != want {
 				t.Errorf("gomaxprocs doesn't match runtime.GOMAXPROCS: got %d, want %d", got, want)
@@ -361,6 +405,12 @@
 	if gc.pauses < gc.numGC*2 {
 		t.Errorf("fewer pauses than expected: got %d, want at least %d", gc.pauses, gc.numGC*2)
 	}
+	if totalScan.got <= 0 {
+		t.Errorf("scannable GC space is empty: %d", totalScan.got)
+	}
+	if totalScan.got != totalScan.want {
+		t.Errorf("/gc/scan/total:bytes doesn't line up with sum of /gc/scan*: total %d vs. sum %d", totalScan.got, totalScan.want)
+	}
 }
 
 func BenchmarkReadMetricsLatency(b *testing.B) {
@@ -611,3 +661,103 @@
 	*runtime.CasGStatusAlwaysTrack = false
 	return blockTime
 }
+
+// See issue #60276.
+func TestCPUMetricsSleep(t *testing.T) {
+	if runtime.GOOS == "wasip1" {
+		// Since wasip1 busy-waits in the scheduler, there's no meaningful idle
+		// time. This is accurately reflected in the metrics, but it means this
+		// test is basically meaningless on this platform.
+		t.Skip("wasip1 currently busy-waits in idle time; test not applicable")
+	}
+
+	names := []string{
+		"/cpu/classes/idle:cpu-seconds",
+
+		"/cpu/classes/gc/mark/assist:cpu-seconds",
+		"/cpu/classes/gc/mark/dedicated:cpu-seconds",
+		"/cpu/classes/gc/mark/idle:cpu-seconds",
+		"/cpu/classes/gc/pause:cpu-seconds",
+		"/cpu/classes/gc/total:cpu-seconds",
+		"/cpu/classes/scavenge/assist:cpu-seconds",
+		"/cpu/classes/scavenge/background:cpu-seconds",
+		"/cpu/classes/scavenge/total:cpu-seconds",
+		"/cpu/classes/total:cpu-seconds",
+		"/cpu/classes/user:cpu-seconds",
+	}
+	prep := func() []metrics.Sample {
+		mm := make([]metrics.Sample, len(names))
+		for i := range names {
+			mm[i].Name = names[i]
+		}
+		return mm
+	}
+	m1, m2 := prep(), prep()
+
+	const (
+		// Expected time spent idle.
+		dur = 100 * time.Millisecond
+
+		// maxFailures is the number of consecutive failures requires to cause the test to fail.
+		maxFailures = 10
+	)
+
+	failureIdleTimes := make([]float64, 0, maxFailures)
+
+	// If the bug we expect is happening, then the Sleep CPU time will be accounted for
+	// as user time rather than idle time. In an ideal world we'd expect the whole application
+	// to go instantly idle the moment this goroutine goes to sleep, and stay asleep for that
+	// duration. However, the Go runtime can easily eat into idle time while this goroutine is
+	// blocked in a sleep. For example, slow platforms might spend more time expected in the
+	// scheduler. Another example is that a Go runtime background goroutine could run while
+	// everything else is idle. Lastly, if a running goroutine is descheduled by the OS, enough
+	// time may pass such that the goroutine is ready to wake, even though the runtime couldn't
+	// observe itself as idle with nanotime.
+	//
+	// To deal with all this, we give a half-proc's worth of leniency.
+	//
+	// We also retry multiple times to deal with the fact that the OS might deschedule us before
+	// we yield and go idle. That has a rare enough chance that retries should resolve it.
+	// If the issue we expect is happening, it should be persistent.
+	minIdleCPUSeconds := dur.Seconds() * (float64(runtime.GOMAXPROCS(-1)) - 0.5)
+
+	// Let's make sure there's no background scavenge work to do.
+	//
+	// The runtime.GC calls below ensure the background sweeper
+	// will not run during the idle period.
+	debug.FreeOSMemory()
+
+	for retries := 0; retries < maxFailures; retries++ {
+		// Read 1.
+		runtime.GC() // Update /cpu/classes metrics.
+		metrics.Read(m1)
+
+		// Sleep.
+		time.Sleep(dur)
+
+		// Read 2.
+		runtime.GC() // Update /cpu/classes metrics.
+		metrics.Read(m2)
+
+		dt := m2[0].Value.Float64() - m1[0].Value.Float64()
+		if dt >= minIdleCPUSeconds {
+			// All is well. Test passed.
+			return
+		}
+		failureIdleTimes = append(failureIdleTimes, dt)
+		// Try again.
+	}
+
+	// We couldn't observe the expected idle time even once.
+	for i, dt := range failureIdleTimes {
+		t.Logf("try %2d: idle time = %.5fs\n", i+1, dt)
+	}
+	t.Logf("try %d breakdown:\n", len(failureIdleTimes))
+	for i := range names {
+		if m1[i].Value.Kind() == metrics.KindBad {
+			continue
+		}
+		t.Logf("\t%s %0.3f\n", names[i], m2[i].Value.Float64()-m1[i].Value.Float64())
+	}
+	t.Errorf(`time.Sleep did not contribute enough to "idle" class: minimum idle time = %.5fs`, minIdleCPUSeconds)
+}
diff --git a/src/runtime/mfinal.go b/src/runtime/mfinal.go
index d4d4f1f..650db18 100644
--- a/src/runtime/mfinal.go
+++ b/src/runtime/mfinal.go
@@ -190,7 +190,7 @@
 		fb := finq
 		finq = nil
 		if fb == nil {
-			gopark(finalizercommit, unsafe.Pointer(&finlock), waitReasonFinalizerWait, traceEvGoBlock, 1)
+			gopark(finalizercommit, unsafe.Pointer(&finlock), waitReasonFinalizerWait, traceBlockSystemGoroutine, 1)
 			continue
 		}
 		argRegs = intArgRegs
@@ -234,16 +234,16 @@
 					// confusing the write barrier.
 					*(*[2]uintptr)(frame) = [2]uintptr{}
 				}
-				switch f.fint.kind & kindMask {
+				switch f.fint.Kind_ & kindMask {
 				case kindPtr:
 					// direct use of pointer
 					*(*unsafe.Pointer)(r) = f.arg
 				case kindInterface:
 					ityp := (*interfacetype)(unsafe.Pointer(f.fint))
 					// set up with empty interface
-					(*eface)(r)._type = &f.ot.typ
+					(*eface)(r)._type = &f.ot.Type
 					(*eface)(r).data = f.arg
-					if len(ityp.mhdr) != 0 {
+					if len(ityp.Methods) != 0 {
 						// convert to interface with methods
 						// this conversion is guaranteed to succeed - we checked in SetFinalizer
 						(*iface)(r).tab = assertE2I(ityp, (*eface)(r)._type)
@@ -274,6 +274,31 @@
 	}
 }
 
+func isGoPointerWithoutSpan(p unsafe.Pointer) bool {
+	// 0-length objects are okay.
+	if p == unsafe.Pointer(&zerobase) {
+		return true
+	}
+
+	// Global initializers might be linker-allocated.
+	//	var Foo = &Object{}
+	//	func main() {
+	//		runtime.SetFinalizer(Foo, nil)
+	//	}
+	// The relevant segments are: noptrdata, data, bss, noptrbss.
+	// We cannot assume they are in any order or even contiguous,
+	// due to external linking.
+	for datap := &firstmoduledata; datap != nil; datap = datap.next {
+		if datap.noptrdata <= uintptr(p) && uintptr(p) < datap.enoptrdata ||
+			datap.data <= uintptr(p) && uintptr(p) < datap.edata ||
+			datap.bss <= uintptr(p) && uintptr(p) < datap.ebss ||
+			datap.noptrbss <= uintptr(p) && uintptr(p) < datap.enoptrbss {
+			return true
+		}
+	}
+	return false
+}
+
 // SetFinalizer sets the finalizer associated with obj to the provided
 // finalizer function. When the garbage collector finds an unreachable block
 // with an associated finalizer, it clears the association and runs
@@ -371,11 +396,11 @@
 	if etyp == nil {
 		throw("runtime.SetFinalizer: first argument is nil")
 	}
-	if etyp.kind&kindMask != kindPtr {
-		throw("runtime.SetFinalizer: first argument is " + etyp.string() + ", not pointer")
+	if etyp.Kind_&kindMask != kindPtr {
+		throw("runtime.SetFinalizer: first argument is " + toRType(etyp).string() + ", not pointer")
 	}
 	ot := (*ptrtype)(unsafe.Pointer(etyp))
-	if ot.elem == nil {
+	if ot.Elem == nil {
 		throw("nil elem type!")
 	}
 
@@ -388,34 +413,16 @@
 	base, _, _ := findObject(uintptr(e.data), 0, 0)
 
 	if base == 0 {
-		// 0-length objects are okay.
-		if e.data == unsafe.Pointer(&zerobase) {
+		if isGoPointerWithoutSpan(e.data) {
 			return
 		}
-
-		// Global initializers might be linker-allocated.
-		//	var Foo = &Object{}
-		//	func main() {
-		//		runtime.SetFinalizer(Foo, nil)
-		//	}
-		// The relevant segments are: noptrdata, data, bss, noptrbss.
-		// We cannot assume they are in any order or even contiguous,
-		// due to external linking.
-		for datap := &firstmoduledata; datap != nil; datap = datap.next {
-			if datap.noptrdata <= uintptr(e.data) && uintptr(e.data) < datap.enoptrdata ||
-				datap.data <= uintptr(e.data) && uintptr(e.data) < datap.edata ||
-				datap.bss <= uintptr(e.data) && uintptr(e.data) < datap.ebss ||
-				datap.noptrbss <= uintptr(e.data) && uintptr(e.data) < datap.enoptrbss {
-				return
-			}
-		}
 		throw("runtime.SetFinalizer: pointer not in allocated block")
 	}
 
 	if uintptr(e.data) != 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.elem == nil || ot.elem.ptrdata != 0 || ot.elem.size >= maxTinySize {
+		if ot.Elem == nil || ot.Elem.PtrBytes != 0 || ot.Elem.Size_ >= maxTinySize {
 			throw("runtime.SetFinalizer: pointer not at beginning of allocated block")
 		}
 	}
@@ -430,30 +437,30 @@
 		return
 	}
 
-	if ftyp.kind&kindMask != kindFunc {
-		throw("runtime.SetFinalizer: second argument is " + ftyp.string() + ", not a function")
+	if ftyp.Kind_&kindMask != kindFunc {
+		throw("runtime.SetFinalizer: second argument is " + toRType(ftyp).string() + ", not a function")
 	}
 	ft := (*functype)(unsafe.Pointer(ftyp))
-	if ft.dotdotdot() {
-		throw("runtime.SetFinalizer: cannot pass " + etyp.string() + " to finalizer " + ftyp.string() + " because dotdotdot")
+	if ft.IsVariadic() {
+		throw("runtime.SetFinalizer: cannot pass " + toRType(etyp).string() + " to finalizer " + toRType(ftyp).string() + " because dotdotdot")
 	}
-	if ft.inCount != 1 {
-		throw("runtime.SetFinalizer: cannot pass " + etyp.string() + " to finalizer " + ftyp.string())
+	if ft.InCount != 1 {
+		throw("runtime.SetFinalizer: cannot pass " + toRType(etyp).string() + " to finalizer " + toRType(ftyp).string())
 	}
-	fint := ft.in()[0]
+	fint := ft.InSlice()[0]
 	switch {
 	case fint == etyp:
 		// ok - same type
 		goto okarg
-	case fint.kind&kindMask == kindPtr:
-		if (fint.uncommon() == nil || etyp.uncommon() == nil) && (*ptrtype)(unsafe.Pointer(fint)).elem == ot.elem {
+	case fint.Kind_&kindMask == kindPtr:
+		if (fint.Uncommon() == nil || etyp.Uncommon() == nil) && (*ptrtype)(unsafe.Pointer(fint)).Elem == ot.Elem {
 			// ok - not same type, but both pointers,
 			// one or the other is unnamed, and same element type, so assignable.
 			goto okarg
 		}
-	case fint.kind&kindMask == kindInterface:
+	case fint.Kind_&kindMask == kindInterface:
 		ityp := (*interfacetype)(unsafe.Pointer(fint))
-		if len(ityp.mhdr) == 0 {
+		if len(ityp.Methods) == 0 {
 			// ok - satisfies empty interface
 			goto okarg
 		}
@@ -461,12 +468,12 @@
 			goto okarg
 		}
 	}
-	throw("runtime.SetFinalizer: cannot pass " + etyp.string() + " to finalizer " + ftyp.string())
+	throw("runtime.SetFinalizer: cannot pass " + toRType(etyp).string() + " to finalizer " + toRType(ftyp).string())
 okarg:
 	// compute size needed for return parameters
 	nret := uintptr(0)
-	for _, t := range ft.out() {
-		nret = alignUp(nret, uintptr(t.align)) + uintptr(t.size)
+	for _, t := range ft.OutSlice() {
+		nret = alignUp(nret, uintptr(t.Align_)) + uintptr(t.Size_)
 	}
 	nret = alignUp(nret, goarch.PtrSize)
 
diff --git a/src/runtime/mfinal_test.go b/src/runtime/mfinal_test.go
index 61d625a..87d31c4 100644
--- a/src/runtime/mfinal_test.go
+++ b/src/runtime/mfinal_test.go
@@ -21,10 +21,6 @@
 }
 
 func TestFinalizerType(t *testing.T) {
-	if runtime.GOARCH != "amd64" {
-		t.Skipf("Skipping on non-amd64 machine")
-	}
-
 	ch := make(chan bool, 10)
 	finalize := func(x *int) {
 		if *x != 97531 {
@@ -82,9 +78,6 @@
 }
 
 func TestFinalizerInterfaceBig(t *testing.T) {
-	if runtime.GOARCH != "amd64" {
-		t.Skipf("Skipping on non-amd64 machine")
-	}
 	ch := make(chan bool)
 	done := make(chan bool, 1)
 	go func() {
diff --git a/src/runtime/mfixalloc.go b/src/runtime/mfixalloc.go
index 8788d95..1a249e5 100644
--- a/src/runtime/mfixalloc.go
+++ b/src/runtime/mfixalloc.go
@@ -13,7 +13,7 @@
 	"unsafe"
 )
 
-// FixAlloc is a simple free-list allocator for fixed size objects.
+// fixalloc is a simple free-list allocator for fixed size objects.
 // Malloc uses a FixAlloc wrapped around sysAlloc to manage its
 // mcache and mspan objects.
 //
diff --git a/src/runtime/mgc.go b/src/runtime/mgc.go
index 1b05707..de5ae0a 100644
--- a/src/runtime/mgc.go
+++ b/src/runtime/mgc.go
@@ -149,6 +149,28 @@
 	sweepMinHeapDistance = 1024 * 1024
 )
 
+// heapObjectsCanMove always returns false in the current garbage collector.
+// It exists for go4.org/unsafe/assume-no-moving-gc, which is an
+// unfortunate idea that had an even more unfortunate implementation.
+// Every time a new Go release happened, the package stopped building,
+// and the authors had to add a new file with a new //go:build line, and
+// then the entire ecosystem of packages with that as a dependency had to
+// explicitly update to the new version. Many packages depend on
+// assume-no-moving-gc transitively, through paths like
+// inet.af/netaddr -> go4.org/intern -> assume-no-moving-gc.
+// This was causing a significant amount of friction around each new
+// release, so we added this bool for the package to //go:linkname
+// instead. The bool is still unfortunate, but it's not as bad as
+// breaking the ecosystem on every new release.
+//
+// If the Go garbage collector ever does move heap objects, we can set
+// this to true to break all the programs using assume-no-moving-gc.
+//
+//go:linkname heapObjectsCanMove
+func heapObjectsCanMove() bool {
+	return false
+}
+
 func gcinit() {
 	if unsafe.Sizeof(workbuf{}) != _WorkbufSize {
 		throw("size of Workbuf is suboptimal")
@@ -193,8 +215,7 @@
 var writeBarrier struct {
 	enabled bool    // compiler emits a check of this before calling write barrier
 	pad     [3]byte // compiler uses 32-bit load for "enabled" field
-	needed  bool    // whether we need a write barrier for current GC phase
-	cgo     bool    // whether we need a write barrier for a cgo check
+	needed  bool    // identical to enabled, for now (TODO: dedup)
 	alignme uint64  // guarantee alignment so that compiler can use a 32 or 64-bit load
 }
 
@@ -213,7 +234,7 @@
 func setGCPhase(x uint32) {
 	atomic.Store(&gcphase, x)
 	writeBarrier.needed = gcphase == _GCmark || gcphase == _GCmarktermination
-	writeBarrier.enabled = writeBarrier.needed || writeBarrier.cgo
+	writeBarrier.enabled = writeBarrier.needed
 }
 
 // gcMarkWorkerMode represents the mode that a concurrent mark worker
@@ -283,8 +304,9 @@
 
 type workType struct {
 	full  lfstack          // lock-free list of full blocks workbuf
+	_     cpu.CacheLinePad // prevents false-sharing between full and empty
 	empty lfstack          // lock-free list of empty blocks workbuf
-	pad0  cpu.CacheLinePad // prevents false-sharing between full/empty and nproc/nwait
+	_     cpu.CacheLinePad // prevents false-sharing between empty and nproc/nwait
 
 	wbufSpans struct {
 		lock mutex
@@ -501,7 +523,7 @@
 		// Wait until sweep termination, mark, and mark
 		// termination of cycle N complete.
 		work.sweepWaiters.list.push(getg())
-		goparkunlock(&work.sweepWaiters.lock, waitReasonWaitForGCCycle, traceEvGoBlock, 1)
+		goparkunlock(&work.sweepWaiters.lock, waitReasonWaitForGCCycle, traceBlockUntilGCEnds, 1)
 	}
 }
 
@@ -630,7 +652,7 @@
 	// Update it under gcsema to avoid gctrace getting wrong values.
 	work.userForced = trigger.kind == gcTriggerCycle
 
-	if trace.enabled {
+	if traceEnabled() {
 		traceGCStart()
 	}
 
@@ -659,10 +681,7 @@
 	now := nanotime()
 	work.tSweepTerm = now
 	work.pauseStart = now
-	if trace.enabled {
-		traceGCSTWStart(1)
-	}
-	systemstack(stopTheWorldWithSema)
+	systemstack(func() { stopTheWorldWithSema(stwGCSweepTerm) })
 	// Finish sweep before we start concurrent scan.
 	systemstack(func() {
 		finishsweep_m()
@@ -727,11 +746,15 @@
 
 	// Concurrent mark.
 	systemstack(func() {
-		now = startTheWorldWithSema(trace.enabled)
+		now = startTheWorldWithSema()
 		work.pauseNS += now - work.pauseStart
 		work.tMark = now
 		memstats.gcPauseDist.record(now - work.pauseStart)
 
+		sweepTermCpu := int64(work.stwprocs) * (work.tMark - work.tSweepTerm)
+		work.cpuStats.gcPauseTime += sweepTermCpu
+		work.cpuStats.gcTotalTime += sweepTermCpu
+
 		// Release the CPU limiter.
 		gcCPULimiter.finishGCTransition(now)
 	})
@@ -849,10 +872,7 @@
 	work.tMarkTerm = now
 	work.pauseStart = now
 	getg().m.preemptoff = "gcing"
-	if trace.enabled {
-		traceGCSTWStart(0)
-	}
-	systemstack(stopTheWorldWithSema)
+	systemstack(func() { stopTheWorldWithSema(stwGCMarkTerm) })
 	// The gcphase is _GCmark, it will transition to _GCmarktermination
 	// below. The important thing is that the wb remains active until
 	// all marking is complete. This includes writes made by the GC.
@@ -879,7 +899,7 @@
 	if restart {
 		getg().m.preemptoff = ""
 		systemstack(func() {
-			now := startTheWorldWithSema(trace.enabled)
+			now := startTheWorldWithSema()
 			work.pauseNS += now - work.pauseStart
 			memstats.gcPauseDist.record(now - work.pauseStart)
 		})
@@ -973,7 +993,7 @@
 	mp.traceback = 0
 	casgstatus(curgp, _Gwaiting, _Grunning)
 
-	if trace.enabled {
+	if traceEnabled() {
 		traceGCDone()
 	}
 
@@ -1004,43 +1024,14 @@
 	memstats.pause_end[memstats.numgc%uint32(len(memstats.pause_end))] = uint64(unixNow)
 	memstats.pause_total_ns += uint64(work.pauseNS)
 
-	sweepTermCpu := int64(work.stwprocs) * (work.tMark - work.tSweepTerm)
-	// We report idle marking time below, but omit it from the
-	// overall utilization here since it's "free".
-	markAssistCpu := gcController.assistTime.Load()
-	markDedicatedCpu := gcController.dedicatedMarkTime.Load()
-	markFractionalCpu := gcController.fractionalMarkTime.Load()
-	markIdleCpu := gcController.idleMarkTime.Load()
 	markTermCpu := int64(work.stwprocs) * (work.tEnd - work.tMarkTerm)
-	scavAssistCpu := scavenge.assistTime.Load()
-	scavBgCpu := scavenge.backgroundTime.Load()
+	work.cpuStats.gcPauseTime += markTermCpu
+	work.cpuStats.gcTotalTime += markTermCpu
 
-	// Update cumulative GC CPU stats.
-	work.cpuStats.gcAssistTime += markAssistCpu
-	work.cpuStats.gcDedicatedTime += markDedicatedCpu + markFractionalCpu
-	work.cpuStats.gcIdleTime += markIdleCpu
-	work.cpuStats.gcPauseTime += sweepTermCpu + markTermCpu
-	work.cpuStats.gcTotalTime += sweepTermCpu + markAssistCpu + markDedicatedCpu + markFractionalCpu + markIdleCpu + markTermCpu
-
-	// Update cumulative scavenge CPU stats.
-	work.cpuStats.scavengeAssistTime += scavAssistCpu
-	work.cpuStats.scavengeBgTime += scavBgCpu
-	work.cpuStats.scavengeTotalTime += scavAssistCpu + scavBgCpu
-
-	// Update total CPU.
-	work.cpuStats.totalTime = sched.totaltime + (now-sched.procresizetime)*int64(gomaxprocs)
-	work.cpuStats.idleTime += sched.idleTime.Load()
-
-	// Compute userTime. We compute this indirectly as everything that's not the above.
+	// Accumulate CPU stats.
 	//
-	// Since time spent in _Pgcstop is covered by gcPauseTime, and time spent in _Pidle
-	// is covered by idleTime, what we're left with is time spent in _Prunning and _Psyscall,
-	// the latter of which is fine because the P will either go idle or get used for something
-	// else via sysmon. Meanwhile if we subtract GC time from whatever's left, we get non-GC
-	// _Prunning time. Note that this still leaves time spent in sweeping and in the scheduler,
-	// but that's fine. The overwhelming majority of this time will be actual user time.
-	work.cpuStats.userTime = work.cpuStats.totalTime - (work.cpuStats.gcTotalTime +
-		work.cpuStats.scavengeTotalTime + work.cpuStats.idleTime)
+	// Pass gcMarkPhase=true so we can get all the latest GC CPU stats in there too.
+	work.cpuStats.accumulate(now, true)
 
 	// Compute overall GC CPU utilization.
 	// Omit idle marking time from the overall utilization here since it's "free".
@@ -1070,6 +1061,12 @@
 	injectglist(&work.sweepWaiters.list)
 	unlock(&work.sweepWaiters.lock)
 
+	// Increment the scavenge generation now.
+	//
+	// This moment represents peak heap in use because we're
+	// about to start sweeping.
+	mheap_.pages.scav.index.nextGen()
+
 	// Release the CPU limiter.
 	gcCPULimiter.finishGCTransition(now)
 
@@ -1087,7 +1084,7 @@
 		throw("failed to set sweep barrier")
 	}
 
-	systemstack(func() { startTheWorldWithSema(trace.enabled) })
+	systemstack(func() { startTheWorldWithSema() })
 
 	// Flush the heap profile so we can start a new cycle next GC.
 	// This is relatively expensive, so we don't do it with the
@@ -1105,9 +1102,25 @@
 	// mcache before allocating, but idle Ps may not. Since this
 	// is necessary to sweep all spans, we need to ensure all
 	// mcaches are flushed before we start the next GC cycle.
+	//
+	// While we're here, flush the page cache for idle Ps to avoid
+	// having pages get stuck on them. These pages are hidden from
+	// the scavenger, so in small idle heaps a significant amount
+	// of additional memory might be held onto.
+	//
+	// Also, flush the pinner cache, to avoid leaking that memory
+	// indefinitely.
 	systemstack(func() {
 		forEachP(func(pp *p) {
 			pp.mcache.prepareForSweep()
+			if pp.status == _Pidle {
+				systemstack(func() {
+					lock(&mheap_.lock)
+					pp.pcache.flush(&mheap_.pages)
+					unlock(&mheap_.lock)
+				})
+			}
+			pp.pinnerCache = nil
 		})
 	})
 	// Now that we've swept stale spans in mcaches, they don't
@@ -1135,7 +1148,7 @@
 		}
 		print(" ms clock, ")
 		for i, ns := range []int64{
-			sweepTermCpu,
+			int64(work.stwprocs) * (work.tMark - work.tSweepTerm),
 			gcController.assistTime.Load(),
 			gcController.dedicatedMarkTime.Load() + gcController.fractionalMarkTime.Load(),
 			gcController.idleMarkTime.Load(),
@@ -1171,6 +1184,11 @@
 		lc.mspan.setUserArenaChunkToFault()
 	}
 
+	// Enable huge pages on some metadata if we cross a heap threshold.
+	if gcController.heapGoal() > minHeapForMetadataHugePages {
+		mheap_.enableMetadataHugePages()
+	}
+
 	semrelease(&worldsema)
 	semrelease(&gcsema)
 	// Careful: another GC cycle may start now.
@@ -1299,7 +1317,7 @@
 			// Note that at this point, the G may immediately be
 			// rescheduled and may be running.
 			return true
-		}, unsafe.Pointer(node), waitReasonGCWorkerIdle, traceEvGoBlock, 0)
+		}, unsafe.Pointer(node), waitReasonGCWorkerIdle, traceBlockSystemGoroutine, 0)
 
 		// Preemption must not occur here, or another G might see
 		// p.gcMarkWorkerMode.
@@ -1449,9 +1467,6 @@
 		// Gs, so only do it if checkmark is also enabled.
 		gcMarkRootCheck()
 	}
-	if work.full != 0 {
-		throw("work.full != 0")
-	}
 
 	// Drop allg snapshot. allgs may have grown, in which case
 	// this is the only reference to the old backing store and
diff --git a/src/runtime/mgclimit.go b/src/runtime/mgclimit.go
index bcbe7f8..ef3cc08 100644
--- a/src/runtime/mgclimit.go
+++ b/src/runtime/mgclimit.go
@@ -174,7 +174,7 @@
 	l.unlock()
 }
 
-// updatedLocked is the implementation of update. l.lock must be held.
+// updateLocked is the implementation of update. l.lock must be held.
 func (l *gcCPULimiterState) updateLocked(now int64) {
 	lastUpdate := l.lastUpdate.Load()
 	if now < lastUpdate {
@@ -212,6 +212,7 @@
 				fallthrough
 			case limiterEventIdle:
 				idleTime += duration
+				sched.idleTime.Add(duration)
 			case limiterEventMarkAssist:
 				fallthrough
 			case limiterEventScavengeAssist:
diff --git a/src/runtime/mgcmark.go b/src/runtime/mgcmark.go
index cfda706..2ed411a 100644
--- a/src/runtime/mgcmark.go
+++ b/src/runtime/mgcmark.go
@@ -7,6 +7,7 @@
 package runtime
 
 import (
+	"internal/abi"
 	"internal/goarch"
 	"runtime/internal/atomic"
 	"runtime/internal/sys"
@@ -414,7 +415,7 @@
 
 	traced := false
 retry:
-	if go119MemoryLimitSupport && gcCPULimiter.limiting() {
+	if gcCPULimiter.limiting() {
 		// If the CPU limiter is enabled, intentionally don't
 		// assist to reduce the amount of CPU time spent in the GC.
 		if traced {
@@ -465,7 +466,7 @@
 		}
 	}
 
-	if trace.enabled && !traced {
+	if traceEnabled() && !traced {
 		traced = true
 		traceGCMarkAssistStart()
 	}
@@ -648,7 +649,7 @@
 		return false
 	}
 	// Park.
-	goparkunlock(&work.assistQueue.lock, waitReasonGCAssistWait, traceEvGoBlockGC, 2)
+	goparkunlock(&work.assistQueue.lock, waitReasonGCAssistWait, traceBlockGCMarkAssist, 2)
 	return true
 }
 
@@ -797,11 +798,10 @@
 	}
 
 	// Scan the stack. Accumulate a list of stack objects.
-	scanframe := func(frame *stkframe, unused unsafe.Pointer) bool {
-		scanframeworker(frame, &state, gcw)
-		return true
+	var u unwinder
+	for u.init(gp, 0); u.valid(); u.next() {
+		scanframeworker(&u.frame, &state, gcw)
 	}
-	gentraceback(^uintptr(0), ^uintptr(0), 0, gp, 0, nil, 0x7fffffff, scanframe, nil, 0)
 
 	// Find additional pointers that point into the stack from the heap.
 	// Currently this includes defers and panics. See also function copystack.
@@ -920,8 +920,8 @@
 		print("scanframe ", funcname(frame.fn), "\n")
 	}
 
-	isAsyncPreempt := frame.fn.valid() && frame.fn.funcID == funcID_asyncPreempt
-	isDebugCall := frame.fn.valid() && frame.fn.funcID == funcID_debugCallV2
+	isAsyncPreempt := frame.fn.valid() && frame.fn.funcID == abi.FuncID_asyncPreempt
+	isDebugCall := frame.fn.valid() && frame.fn.funcID == abi.FuncID_debugCallV2
 	if state.conservative || isAsyncPreempt || isDebugCall {
 		if debugScanConservative {
 			println("conservatively scanning function", funcname(frame.fn), "at PC", hex(frame.continpc))
@@ -1092,7 +1092,7 @@
 				// Flush the write barrier
 				// buffer; this may create
 				// more work.
-				wbBufFlush(nil, 0)
+				wbBufFlush()
 				b = gcw.tryGet()
 			}
 		}
@@ -1171,7 +1171,7 @@
 			if b == 0 {
 				// Flush the write barrier buffer;
 				// this may create more work.
-				wbBufFlush(nil, 0)
+				wbBufFlush()
 				b = gcw.tryGet()
 			}
 		}
diff --git a/src/runtime/mgcpacer.go b/src/runtime/mgcpacer.go
index 9d9840e..32e19f9 100644
--- a/src/runtime/mgcpacer.go
+++ b/src/runtime/mgcpacer.go
@@ -11,12 +11,6 @@
 	_ "unsafe" // for go:linkname
 )
 
-// go119MemoryLimitSupport is a feature flag for a number of changes
-// related to the memory limit feature (#48409). Disabling this flag
-// disables those features, as well as the memory limit mechanism,
-// which becomes a no-op.
-const go119MemoryLimitSupport = true
-
 const (
 	// gcGoalUtilization is the goal CPU utilization for
 	// marking as a fraction of GOMAXPROCS.
@@ -67,11 +61,16 @@
 	// that can accumulate on a P before updating gcController.stackSize.
 	maxStackScanSlack = 8 << 10
 
-	// memoryLimitHeapGoalHeadroom is the amount of headroom the pacer gives to
-	// the heap goal when operating in the memory-limited regime. That is,
-	// it'll reduce the heap goal by this many extra bytes off of the base
-	// calculation.
-	memoryLimitHeapGoalHeadroom = 1 << 20
+	// memoryLimitMinHeapGoalHeadroom is the minimum amount of headroom the
+	// pacer gives to the heap goal when operating in the memory-limited regime.
+	// That is, it'll reduce the heap goal by this many extra bytes off of the
+	// base calculation, at minimum.
+	memoryLimitMinHeapGoalHeadroom = 1 << 20
+
+	// memoryLimitHeapGoalHeadroomPercent is how headroom the memory-limit-based
+	// heap goal should have as a percent of the maximum possible heap goal allowed
+	// to maintain the memory limit.
+	memoryLimitHeapGoalHeadroomPercent = 3
 )
 
 // gcController implements the GC pacing controller that determines
@@ -136,10 +135,10 @@
 	// Updated at the end of each GC cycle, in endCycle.
 	consMark float64
 
-	// lastConsMark is the computed cons/mark value for the previous GC
-	// cycle. Note that this is *not* the last value of cons/mark, but the
-	// actual computed value. See endCycle for details.
-	lastConsMark float64
+	// lastConsMark is the computed cons/mark value for the previous 4 GC
+	// cycles. Note that this is *not* the last value of consMark, but the
+	// measured cons/mark value in endCycle.
+	lastConsMark [4]float64
 
 	// gcPercentHeapGoal is the goal heapLive for when next GC ends derived
 	// from gcPercent.
@@ -651,19 +650,26 @@
 	//
 	// So this calculation is really:
 	//     (heapLive-trigger) / (assistDuration * procs * (1-utilization)) /
-	//         (scanWork) / (assistDuration * procs * (utilization+idleUtilization)
+	//         (scanWork) / (assistDuration * procs * (utilization+idleUtilization))
 	//
 	// Note that because we only care about the ratio, assistDuration and procs cancel out.
 	scanWork := c.heapScanWork.Load() + c.stackScanWork.Load() + c.globalsScanWork.Load()
 	currentConsMark := (float64(c.heapLive.Load()-c.triggered) * (utilization + idleUtilization)) /
 		(float64(scanWork) * (1 - utilization))
 
-	// Update our cons/mark estimate. This is the raw value above, but averaged over 2 GC cycles
-	// because it tends to be jittery, even in the steady-state. The smoothing helps the GC to
-	// maintain much more stable cycle-by-cycle behavior.
+	// Update our cons/mark estimate. This is the maximum of the value we just computed and the last
+	// 4 cons/mark values we measured. The reason we take the maximum here is to bias a noisy
+	// cons/mark measurement toward fewer assists at the expense of additional GC cycles (starting
+	// earlier).
 	oldConsMark := c.consMark
-	c.consMark = (currentConsMark + c.lastConsMark) / 2
-	c.lastConsMark = currentConsMark
+	c.consMark = currentConsMark
+	for i := range c.lastConsMark {
+		if c.lastConsMark[i] > c.consMark {
+			c.consMark = c.lastConsMark[i]
+		}
+	}
+	copy(c.lastConsMark[:], c.lastConsMark[1:])
+	c.lastConsMark[len(c.lastConsMark)-1] = currentConsMark
 
 	if debug.gcpacertrace > 0 {
 		printlock()
@@ -802,7 +808,7 @@
 	// Run the background mark worker.
 	gp := node.gp.ptr()
 	casgstatus(gp, _Gwaiting, _Grunnable)
-	if trace.enabled {
+	if traceEnabled() {
 		traceGoUnpark(gp, 0)
 	}
 	return gp, now
@@ -822,7 +828,7 @@
 	c.triggered = ^uint64(0) // Reset triggered.
 
 	// heapLive was updated, so emit a trace event.
-	if trace.enabled {
+	if traceEnabled() {
 		traceHeapAlloc(bytesMarked)
 	}
 }
@@ -851,7 +857,7 @@
 func (c *gcControllerState) update(dHeapLive, dHeapScan int64) {
 	if dHeapLive != 0 {
 		live := gcController.heapLive.Add(dHeapLive)
-		if trace.enabled {
+		if traceEnabled() {
 			// gcController.heapLive changed.
 			traceHeapAlloc(live)
 		}
@@ -899,7 +905,7 @@
 	goal = c.gcPercentHeapGoal.Load()
 
 	// Check if the memory-limit-based goal is smaller, and if so, pick that.
-	if newGoal := c.memoryLimitHeapGoal(); go119MemoryLimitSupport && newGoal < goal {
+	if newGoal := c.memoryLimitHeapGoal(); newGoal < goal {
 		goal = newGoal
 	} else {
 		// We're not limited by the memory limit goal, so perform a series of
@@ -967,8 +973,10 @@
 	//
 	// In practice this computation looks like the following:
 	//
-	//    memoryLimit - ((mappedReady - heapFree - heapAlloc) + max(mappedReady - memoryLimit, 0)) - memoryLimitHeapGoalHeadroom
-	//                    ^1                                    ^2                                   ^3
+	//    goal := memoryLimit - ((mappedReady - heapFree - heapAlloc) + max(mappedReady - memoryLimit, 0))
+	//                    ^1                                    ^2
+	//    goal -= goal / 100 * memoryLimitHeapGoalHeadroomPercent
+	//    ^3
 	//
 	// Let's break this down.
 	//
@@ -1000,11 +1008,14 @@
 	// terms of heap objects, but it takes more than X bytes (e.g. due to fragmentation) to store
 	// X bytes worth of objects.
 	//
-	// The third term (marker 3) subtracts an additional memoryLimitHeapGoalHeadroom bytes from the
-	// heap goal. As the name implies, this is to provide additional headroom in the face of pacing
-	// inaccuracies. This is a fixed number of bytes because these inaccuracies disproportionately
-	// affect small heaps: as heaps get smaller, the pacer's inputs get fuzzier. Shorter GC cycles
-	// and less GC work means noisy external factors like the OS scheduler have a greater impact.
+	// The final adjustment (marker 3) reduces the maximum possible memory limit heap goal by
+	// memoryLimitHeapGoalPercent. As the name implies, this is to provide additional headroom in
+	// the face of pacing inaccuracies, and also to leave a buffer of unscavenged memory so the
+	// allocator isn't constantly scavenging. The reduction amount also has a fixed minimum
+	// (memoryLimitMinHeapGoalHeadroom, not pictured) because the aforementioned pacing inaccuracies
+	// disproportionately affect small heaps: as heaps get smaller, the pacer's inputs get fuzzier.
+	// Shorter GC cycles and less GC work means noisy external factors like the OS scheduler have a
+	// greater impact.
 
 	memoryLimit := uint64(c.memoryLimit.Load())
 
@@ -1028,12 +1039,19 @@
 	// Compute the goal.
 	goal := memoryLimit - (nonHeapMemory + overage)
 
-	// Apply some headroom to the goal to account for pacing inaccuracies.
-	// Be careful about small limits.
-	if goal < memoryLimitHeapGoalHeadroom || goal-memoryLimitHeapGoalHeadroom < memoryLimitHeapGoalHeadroom {
-		goal = memoryLimitHeapGoalHeadroom
+	// Apply some headroom to the goal to account for pacing inaccuracies and to reduce
+	// the impact of scavenging at allocation time in response to a high allocation rate
+	// when GOGC=off. See issue #57069. Also, be careful about small limits.
+	headroom := goal / 100 * memoryLimitHeapGoalHeadroomPercent
+	if headroom < memoryLimitMinHeapGoalHeadroom {
+		// Set a fixed minimum to deal with the particularly large effect pacing inaccuracies
+		// have for smaller heaps.
+		headroom = memoryLimitMinHeapGoalHeadroom
+	}
+	if goal < headroom || goal-headroom < headroom {
+		goal = headroom
 	} else {
-		goal = goal - memoryLimitHeapGoalHeadroom
+		goal = goal - headroom
 	}
 	// Don't let us go below the live heap. A heap goal below the live heap doesn't make sense.
 	if goal < c.heapMarked {
@@ -1416,7 +1434,7 @@
 
 	// TODO(mknyszek): This isn't really accurate any longer because the heap
 	// goal is computed dynamically. Still useful to snapshot, but not as useful.
-	if trace.enabled {
+	if traceEnabled() {
 		traceHeapGoal()
 	}
 
diff --git a/src/runtime/mgcpacer_test.go b/src/runtime/mgcpacer_test.go
index e373e32..ef1483d 100644
--- a/src/runtime/mgcpacer_test.go
+++ b/src/runtime/mgcpacer_test.go
@@ -255,8 +255,8 @@
 					// After the 12th GC, the heap will stop growing. Now, just make sure that:
 					// 1. Utilization isn't varying _too_ much, and
 					// 2. The pacer is mostly keeping up with the goal.
-					assertInRange(t, "goal ratio", c[n-1].goalRatio(), 0.95, 1.05)
-					assertInRange(t, "GC utilization", c[n-1].gcUtilization, 0.25, 0.3)
+					assertInRange(t, "goal ratio", c[n-1].goalRatio(), 0.95, 1.025)
+					assertInRange(t, "GC utilization", c[n-1].gcUtilization, 0.25, 0.275)
 				}
 			},
 		},
@@ -417,7 +417,7 @@
 			length:        50,
 			checker: func(t *testing.T, c []gcCycleResult) {
 				n := len(c)
-				if peak := c[n-1].heapPeak; peak >= (512<<20)-MemoryLimitHeapGoalHeadroom {
+				if peak := c[n-1].heapPeak; peak >= applyMemoryLimitHeapGoalHeadroom(512<<20) {
 					t.Errorf("peak heap size reaches heap limit: %d", peak)
 				}
 				if n >= 25 {
@@ -446,7 +446,7 @@
 			length:        50,
 			checker: func(t *testing.T, c []gcCycleResult) {
 				n := len(c)
-				if goal := c[n-1].heapGoal; goal != (512<<20)-MemoryLimitHeapGoalHeadroom {
+				if goal := c[n-1].heapGoal; goal != applyMemoryLimitHeapGoalHeadroom(512<<20) {
 					t.Errorf("heap goal is not the heap limit: %d", goal)
 				}
 				if n >= 25 {
@@ -510,7 +510,7 @@
 			checker: func(t *testing.T, c []gcCycleResult) {
 				n := len(c)
 				if n < 10 {
-					if goal := c[n-1].heapGoal; goal != (512<<20)-MemoryLimitHeapGoalHeadroom {
+					if goal := c[n-1].heapGoal; goal != applyMemoryLimitHeapGoalHeadroom(512<<20) {
 						t.Errorf("heap goal is not the heap limit: %d", goal)
 					}
 				}
@@ -550,7 +550,7 @@
 				n := len(c)
 				if n > 12 {
 					// We're trying to saturate the memory limit.
-					if goal := c[n-1].heapGoal; goal != (512<<20)-MemoryLimitHeapGoalHeadroom {
+					if goal := c[n-1].heapGoal; goal != applyMemoryLimitHeapGoalHeadroom(512<<20) {
 						t.Errorf("heap goal is not the heap limit: %d", goal)
 					}
 				}
@@ -581,7 +581,7 @@
 			length:        50,
 			checker: func(t *testing.T, c []gcCycleResult) {
 				n := len(c)
-				if goal := c[n-1].heapGoal; goal != (512<<20)-MemoryLimitHeapGoalHeadroom {
+				if goal := c[n-1].heapGoal; goal != applyMemoryLimitHeapGoalHeadroom(512<<20) {
 					t.Errorf("heap goal is not the heap limit: %d", goal)
 				}
 				if n >= 25 {
@@ -1019,6 +1019,19 @@
 	}
 }
 
+func applyMemoryLimitHeapGoalHeadroom(goal uint64) uint64 {
+	headroom := goal / 100 * MemoryLimitHeapGoalHeadroomPercent
+	if headroom < MemoryLimitMinHeapGoalHeadroom {
+		headroom = MemoryLimitMinHeapGoalHeadroom
+	}
+	if goal < headroom || goal-headroom < headroom {
+		goal = headroom
+	} else {
+		goal -= headroom
+	}
+	return goal
+}
+
 func TestIdleMarkWorkerCount(t *testing.T) {
 	const workers = 10
 	c := NewGCController(100, math.MaxInt64)
diff --git a/src/runtime/mgcscavenge.go b/src/runtime/mgcscavenge.go
index e59340e..659ca8d 100644
--- a/src/runtime/mgcscavenge.go
+++ b/src/runtime/mgcscavenge.go
@@ -9,12 +9,14 @@
 // fragmentation and reduce the RSS of Go applications.
 //
 // Scavenging in Go happens on two fronts: there's the background
-// (asynchronous) scavenger and the heap-growth (synchronous) scavenger.
+// (asynchronous) scavenger and the allocation-time (synchronous) scavenger.
 //
 // The former happens on a goroutine much like the background sweeper which is
 // soft-capped at using scavengePercent of the mutator's time, based on
-// order-of-magnitude estimates of the costs of scavenging. The background
-// scavenger's primary goal is to bring the estimated heap RSS of the
+// order-of-magnitude estimates of the costs of scavenging. The latter happens
+// when allocating pages from the heap.
+//
+// The scavenger's primary goal is to bring the estimated heap RSS of the
 // application down to a goal.
 //
 // Before we consider what this looks like, we need to split the world into two
@@ -61,11 +63,30 @@
 //
 // The goals are updated after each GC.
 //
-// The synchronous heap-growth scavenging happens whenever the heap grows in
-// size, for some definition of heap-growth. The intuition behind this is that
-// the application had to grow the heap because existing fragments were
-// not sufficiently large to satisfy a page-level memory allocation, so we
-// scavenge those fragments eagerly to offset the growth in RSS that results.
+// Synchronous scavenging happens for one of two reasons: if an allocation would
+// exceed the memory limit or whenever the heap grows in size, for some
+// definition of heap-growth. The intuition behind this second reason is that the
+// application had to grow the heap because existing fragments were not sufficiently
+// large to satisfy a page-level memory allocation, so we scavenge those fragments
+// eagerly to offset the growth in RSS that results.
+//
+// Lastly, not all pages are available for scavenging at all times and in all cases.
+// The background scavenger and heap-growth scavenger only release memory in chunks
+// that have not been densely-allocated for at least 1 full GC cycle. The reason
+// behind this is likelihood of reuse: the Go heap is allocated in a first-fit order
+// and by the end of the GC mark phase, the heap tends to be densely packed. Releasing
+// memory in these densely packed chunks while they're being packed is counter-productive,
+// and worse, it breaks up huge pages on systems that support them. The scavenger (invoked
+// during memory allocation) further ensures that chunks it identifies as "dense" are
+// immediately eligible for being backed by huge pages. Note that for the most part these
+// density heuristics are best-effort heuristics. It's totally possible (but unlikely)
+// that a chunk that just became dense is scavenged in the case of a race between memory
+// allocation and scavenging.
+//
+// When synchronously scavenging for the memory limit or for debug.FreeOSMemory, these
+// "dense" packing heuristics are ignored (in other words, scavenging is "forced") because
+// in these scenarios returning memory to the OS is more important than keeping CPU
+// overheads low.
 
 package runtime
 
@@ -118,6 +139,11 @@
 	// This ratio is used as part of multiplicative factor to help the scavenger account
 	// for the additional costs of using scavenged memory in its pacing.
 	scavengeCostRatio = 0.7 * (goos.IsDarwin + goos.IsIos)
+
+	// scavChunkHiOcFrac indicates the fraction of pages that need to be allocated
+	// in the chunk in a single GC cycle for it to be considered high density.
+	scavChunkHiOccFrac  = 0.96875
+	scavChunkHiOccPages = uint16(scavChunkHiOccFrac * pallocChunkPages)
 )
 
 // heapRetained returns an estimate of the current heap RSS.
@@ -366,7 +392,7 @@
 	if s.scavenge == nil {
 		s.scavenge = func(n uintptr) (uintptr, int64) {
 			start := nanotime()
-			r := mheap_.pages.scavenge(n, nil)
+			r := mheap_.pages.scavenge(n, nil, false)
 			end := nanotime()
 			if start >= end {
 				return r, 0
@@ -379,8 +405,7 @@
 		s.shouldStop = func() bool {
 			// If background scavenging is disabled or if there's no work to do just stop.
 			return heapRetained() <= scavenge.gcPercentGoal.Load() &&
-				(!go119MemoryLimitSupport ||
-					gcController.mappedReady.Load() <= scavenge.memoryLimitGoal.Load())
+				gcController.mappedReady.Load() <= scavenge.memoryLimitGoal.Load()
 		}
 	}
 	if s.gomaxprocs == nil {
@@ -397,7 +422,7 @@
 		throw("tried to park scavenger from another goroutine")
 	}
 	s.parked = true
-	goparkunlock(&s.lock, waitReasonGCScavengeWait, traceEvGoBlock, 2)
+	goparkunlock(&s.lock, waitReasonGCScavengeWait, traceBlockSystemGoroutine, 2)
 }
 
 // ready signals to sysmon that the scavenger should be awoken.
@@ -476,7 +501,7 @@
 
 		// Mark ourselves as asleep and go to sleep.
 		s.parked = true
-		goparkunlock(&s.lock, waitReasonSleep, traceEvGoSleep, 2)
+		goparkunlock(&s.lock, waitReasonSleep, traceBlockSleep, 2)
 
 		// How long we actually slept for.
 		slept = nanotime() - start
@@ -633,24 +658,24 @@
 			scavenger.park()
 			continue
 		}
-		atomic.Xadduintptr(&mheap_.pages.scav.released, released)
+		mheap_.pages.scav.releasedBg.Add(released)
 		scavenger.sleep(workTime)
 	}
 }
 
 // scavenge scavenges nbytes worth of free pages, starting with the
 // highest address first. Successive calls continue from where it left
-// off until the heap is exhausted. Call scavengeStartGen to bring it
-// back to the top of the heap.
+// off until the heap is exhausted. force makes all memory available to
+// scavenge, ignoring huge page heuristics.
 //
 // Returns the amount of memory scavenged in bytes.
 //
 // scavenge always tries to scavenge nbytes worth of memory, and will
 // only fail to do so if the heap is exhausted for now.
-func (p *pageAlloc) scavenge(nbytes uintptr, shouldStop func() bool) uintptr {
+func (p *pageAlloc) scavenge(nbytes uintptr, shouldStop func() bool, force bool) uintptr {
 	released := uintptr(0)
 	for released < nbytes {
-		ci, pageIdx := p.scav.index.find()
+		ci, pageIdx := p.scav.index.find(force)
 		if ci == 0 {
 			break
 		}
@@ -671,13 +696,14 @@
 // application.
 //
 // scavenger.lock must be held.
-func printScavTrace(released uintptr, forced bool) {
+func printScavTrace(releasedBg, releasedEager uintptr, forced bool) {
 	assertLockHeld(&scavenger.lock)
 
 	printlock()
 	print("scav ",
-		released>>10, " KiB work, ",
-		gcController.heapReleased.load()>>10, " KiB total, ",
+		releasedBg>>10, " KiB work (bg), ",
+		releasedEager>>10, " KiB work (eager), ",
+		gcController.heapReleased.load()>>10, " KiB now, ",
 		(gcController.heapInUse.load()*100)/heapRetained(), "% util",
 	)
 	if forced {
@@ -738,10 +764,14 @@
 
 			// Mark the range we're about to scavenge as allocated, because
 			// we don't want any allocating goroutines to grab it while
-			// the scavenging is in progress.
-			if scav := p.allocRange(addr, uintptr(npages)); scav != 0 {
-				throw("double scavenge")
-			}
+			// the scavenging is in progress. Be careful here -- just do the
+			// bare minimum to avoid stepping on our own scavenging stats.
+			p.chunkOf(ci).allocRange(base, npages)
+			p.update(addr, uintptr(npages), true, true)
+
+			// Grab whether the chunk is hugepage backed and if it is,
+			// clear it. We're about to break up this huge page.
+			p.scav.index.setNoHugePage(ci)
 
 			// With that done, it's safe to unlock.
 			unlock(p.mheapLock)
@@ -749,13 +779,13 @@
 			if !p.test {
 				pageTraceScav(getg().m.p.ptr(), 0, addr, uintptr(npages))
 
-				// Only perform the actual scavenging if we're not in a test.
+				// Only perform sys* operations if we're not in a test.
 				// It's dangerous to do so otherwise.
 				sysUnused(unsafe.Pointer(addr), uintptr(npages)*pageSize)
 
 				// Update global accounting only when not in test, otherwise
 				// the runtime's accounting will be wrong.
-				nbytes := int64(npages) * pageSize
+				nbytes := int64(npages * pageSize)
 				gcController.heapReleased.add(nbytes)
 				gcController.heapFree.add(-nbytes)
 
@@ -768,7 +798,11 @@
 			// Relock the heap, because now we need to make these pages
 			// available allocation. Free them back to the page allocator.
 			lock(p.mheapLock)
-			p.free(addr, uintptr(npages), true)
+			if b := (offAddr{addr}); b.lessThan(p.searchAddr) {
+				p.searchAddr = b
+			}
+			p.chunkOf(ci).free(base, npages)
+			p.update(addr, uintptr(npages), true, false)
 
 			// Mark the range as scavenged.
 			p.chunkOf(ci).scavenged.setRange(base, npages)
@@ -778,7 +812,7 @@
 		}
 	}
 	// Mark this chunk as having no free pages.
-	p.scav.index.clear(ci)
+	p.scav.index.setEmpty(ci)
 	unlock(p.mheapLock)
 
 	return 0
@@ -847,7 +881,7 @@
 // segment which represents a contiguous region of free and unscavenged memory.
 //
 // searchIdx indicates the page index within this chunk to start the search, but
-// note that findScavengeCandidate searches backwards through the pallocData. As a
+// note that findScavengeCandidate searches backwards through the pallocData. As
 // a result, it will return the highest scavenge candidate in address order.
 //
 // min indicates a hard minimum size and alignment for runs of pages. That is,
@@ -966,27 +1000,38 @@
 // scavengeIndex is a structure for efficiently managing which pageAlloc chunks have
 // memory available to scavenge.
 type scavengeIndex struct {
-	// chunks is a bitmap representing the entire address space. Each bit represents
-	// a single chunk, and a 1 value indicates the presence of pages available for
-	// scavenging. Updates to the bitmap are serialized by the pageAlloc lock.
+	// chunks is a scavChunkData-per-chunk structure that indicates the presence of pages
+	// available for scavenging. Updates to the index are serialized by the pageAlloc lock.
 	//
-	// The underlying storage of chunks is platform dependent and may not even be
-	// totally mapped read/write. min and max reflect the extent that is safe to access.
-	// min is inclusive, max is exclusive.
+	// It tracks chunk occupancy and a generation counter per chunk. If a chunk's occupancy
+	// never exceeds pallocChunkDensePages over the course of a single GC cycle, the chunk
+	// becomes eligible for scavenging on the next cycle. If a chunk ever hits this density
+	// threshold it immediately becomes unavailable for scavenging in the current cycle as
+	// well as the next.
 	//
-	// searchAddr is the maximum address (in the offset address space, so we have a linear
+	// [min, max) represents the range of chunks that is safe to access (i.e. will not cause
+	// a fault). As an optimization minHeapIdx represents the true minimum chunk that has been
+	// mapped, since min is likely rounded down to include the system page containing minHeapIdx.
+	//
+	// For a chunk size of 4 MiB this structure will only use 2 MiB for a 1 TiB contiguous heap.
+	chunks     []atomicScavChunkData
+	min, max   atomic.Uintptr
+	minHeapIdx atomic.Uintptr
+
+	// searchAddr* is the maximum address (in the offset address space, so we have a linear
 	// view of the address space; see mranges.go:offAddr) containing memory available to
 	// scavenge. It is a hint to the find operation to avoid O(n^2) behavior in repeated lookups.
 	//
-	// searchAddr is always inclusive and should be the base address of the highest runtime
+	// searchAddr* is always inclusive and should be the base address of the highest runtime
 	// page available for scavenging.
 	//
-	// searchAddr is managed by both find and mark.
+	// searchAddrForce is managed by find and free.
+	// searchAddrBg is managed by find and nextGen.
 	//
-	// Normally, find monotonically decreases searchAddr as it finds no more free pages to
+	// Normally, find monotonically decreases searchAddr* as it finds no more free pages to
 	// scavenge. However, mark, when marking a new chunk at an index greater than the current
 	// searchAddr, sets searchAddr to the *negative* index into chunks of that page. The trick here
-	// is that concurrent calls to find will fail to monotonically decrease searchAddr, and so they
+	// is that concurrent calls to find will fail to monotonically decrease searchAddr*, and so they
 	// won't barge over new memory becoming available to scavenge. Furthermore, this ensures
 	// that some future caller of find *must* observe the new high index. That caller
 	// (or any other racing with it), then makes searchAddr positive before continuing, bringing
@@ -995,47 +1040,77 @@
 	// A pageAlloc lock serializes updates between min, max, and searchAddr, so abs(searchAddr)
 	// is always guaranteed to be >= min and < max (converted to heap addresses).
 	//
-	// TODO(mknyszek): Ideally we would use something bigger than a uint8 for faster
-	// iteration like uint32, but we lack the bit twiddling intrinsics. We'd need to either
-	// copy them from math/bits or fix the fact that we can't import math/bits' code from
-	// the runtime due to compiler instrumentation.
-	searchAddr atomicOffAddr
-	chunks     []atomic.Uint8
-	minHeapIdx atomic.Int32
-	min, max   atomic.Int32
+	// searchAddrBg is increased only on each new generation and is mainly used by the
+	// background scavenger and heap-growth scavenging. searchAddrForce is increased continuously
+	// as memory gets freed and is mainly used by eager memory reclaim such as debug.FreeOSMemory
+	// and scavenging to maintain the memory limit.
+	searchAddrBg    atomicOffAddr
+	searchAddrForce atomicOffAddr
+
+	// freeHWM is the highest address (in offset address space) that was freed
+	// this generation.
+	freeHWM offAddr
+
+	// Generation counter. Updated by nextGen at the end of each mark phase.
+	gen uint32
+
+	// test indicates whether or not we're in a test.
+	test bool
+}
+
+// init initializes the scavengeIndex.
+//
+// Returns the amount added to sysStat.
+func (s *scavengeIndex) init(test bool, sysStat *sysMemStat) uintptr {
+	s.searchAddrBg.Clear()
+	s.searchAddrForce.Clear()
+	s.freeHWM = minOffAddr
+	s.test = test
+	return s.sysInit(test, sysStat)
+}
+
+// sysGrow updates the index's backing store in response to a heap growth.
+//
+// Returns the amount of memory added to sysStat.
+func (s *scavengeIndex) grow(base, limit uintptr, sysStat *sysMemStat) uintptr {
+	// Update minHeapIdx. Note that even if there's no mapping work to do,
+	// we may still have a new, lower minimum heap address.
+	minHeapIdx := s.minHeapIdx.Load()
+	if baseIdx := uintptr(chunkIndex(base)); minHeapIdx == 0 || baseIdx < minHeapIdx {
+		s.minHeapIdx.Store(baseIdx)
+	}
+	return s.sysGrow(base, limit, sysStat)
 }
 
 // find returns the highest chunk index that may contain pages available to scavenge.
 // It also returns an offset to start searching in the highest chunk.
-func (s *scavengeIndex) find() (chunkIdx, uint) {
-	searchAddr, marked := s.searchAddr.Load()
+func (s *scavengeIndex) find(force bool) (chunkIdx, uint) {
+	cursor := &s.searchAddrBg
+	if force {
+		cursor = &s.searchAddrForce
+	}
+	searchAddr, marked := cursor.Load()
 	if searchAddr == minOffAddr.addr() {
 		// We got a cleared search addr.
 		return 0, 0
 	}
 
-	// Starting from searchAddr's chunk, and moving down to minHeapIdx,
-	// iterate until we find a chunk with pages to scavenge.
-	min := s.minHeapIdx.Load()
-	searchChunk := chunkIndex(uintptr(searchAddr))
-	start := int32(searchChunk / 8)
+	// Starting from searchAddr's chunk, iterate until we find a chunk with pages to scavenge.
+	gen := s.gen
+	min := chunkIdx(s.minHeapIdx.Load())
+	start := chunkIndex(uintptr(searchAddr))
+	// N.B. We'll never map the 0'th chunk, so minHeapIdx ensures this loop overflow.
 	for i := start; i >= min; i-- {
-		// Skip over irrelevant address space.
-		chunks := s.chunks[i].Load()
-		if chunks == 0 {
+		// Skip over chunks.
+		if !s.chunks[i].load().shouldScavenge(gen, force) {
 			continue
 		}
-		// Note that we can't have 8 leading zeroes here because
-		// we necessarily skipped that case. So, what's left is
-		// an index. If there are no zeroes, we want the 7th
-		// index, if 1 zero, the 6th, and so on.
-		n := 7 - sys.LeadingZeros8(chunks)
-		ci := chunkIdx(uint(i)*8 + uint(n))
-		if searchChunk == ci {
-			return ci, chunkPageIndex(uintptr(searchAddr))
+		// We're still scavenging this chunk.
+		if i == start {
+			return i, chunkPageIndex(uintptr(searchAddr))
 		}
 		// Try to reduce searchAddr to newSearchAddr.
-		newSearchAddr := chunkBase(ci) + pallocChunkBytes - pageSize
+		newSearchAddr := chunkBase(i) + pallocChunkBytes - pageSize
 		if marked {
 			// Attempt to be the first one to decrease the searchAddr
 			// after an increase. If we fail, that means there was another
@@ -1043,78 +1118,280 @@
 			// it doesn't matter. We may lose some performance having an
 			// incorrect search address, but it's far more important that
 			// we don't miss updates.
-			s.searchAddr.StoreUnmark(searchAddr, newSearchAddr)
+			cursor.StoreUnmark(searchAddr, newSearchAddr)
 		} else {
 			// Decrease searchAddr.
-			s.searchAddr.StoreMin(newSearchAddr)
+			cursor.StoreMin(newSearchAddr)
 		}
-		return ci, pallocChunkPages - 1
+		return i, pallocChunkPages - 1
 	}
 	// Clear searchAddr, because we've exhausted the heap.
-	s.searchAddr.Clear()
+	cursor.Clear()
 	return 0, 0
 }
 
-// mark sets the inclusive range of chunks between indices start and end as
-// containing pages available to scavenge.
+// alloc updates metadata for chunk at index ci with the fact that
+// an allocation of npages occurred. It also eagerly attempts to collapse
+// the chunk's memory into hugepage if the chunk has become sufficiently
+// dense and we're not allocating the whole chunk at once (which suggests
+// the allocation is part of a bigger one and it's probably not worth
+// eagerly collapsing).
 //
-// Must be serialized with other mark, markRange, and clear calls.
-func (s *scavengeIndex) mark(base, limit uintptr) {
-	start, end := chunkIndex(base), chunkIndex(limit-pageSize)
-	if start == end {
-		// Within a chunk.
-		mask := uint8(1 << (start % 8))
-		s.chunks[start/8].Or(mask)
-	} else if start/8 == end/8 {
-		// Within the same byte in the index.
-		mask := uint8(uint16(1<<(end-start+1))-1) << (start % 8)
-		s.chunks[start/8].Or(mask)
-	} else {
-		// Crosses multiple bytes in the index.
-		startAligned := chunkIdx(alignUp(uintptr(start), 8))
-		endAligned := chunkIdx(alignDown(uintptr(end), 8))
+// alloc may only run concurrently with find.
+func (s *scavengeIndex) alloc(ci chunkIdx, npages uint) {
+	sc := s.chunks[ci].load()
+	sc.alloc(npages, s.gen)
+	if !sc.isHugePage() && sc.inUse > scavChunkHiOccPages {
+		// Mark that we're considering this chunk as backed by huge pages.
+		sc.setHugePage()
 
-		// Do the end of the first byte first.
-		if width := startAligned - start; width > 0 {
-			mask := uint8(uint16(1<<width)-1) << (start % 8)
-			s.chunks[start/8].Or(mask)
-		}
-		// Do the middle aligned sections that take up a whole
-		// byte.
-		for ci := startAligned; ci < endAligned; ci += 8 {
-			s.chunks[ci/8].Store(^uint8(0))
-		}
-		// Do the end of the last byte.
-		//
-		// This width check doesn't match the one above
-		// for start because aligning down into the endAligned
-		// block means we always have at least one chunk in this
-		// block (note that end is *inclusive*). This also means
-		// that if end == endAligned+n, then what we really want
-		// is to fill n+1 chunks, i.e. width n+1. By induction,
-		// this is true for all n.
-		if width := end - endAligned + 1; width > 0 {
-			mask := uint8(uint16(1<<width) - 1)
-			s.chunks[end/8].Or(mask)
-		}
+		// TODO(mknyszek): Consider eagerly backing memory with huge pages
+		// here. In the past we've attempted to use sysHugePageCollapse
+		// (which uses MADV_COLLAPSE on Linux, and is unsupported elswhere)
+		// for this purpose, but that caused performance issues in production
+		// environments.
 	}
-	newSearchAddr := limit - pageSize
-	searchAddr, _ := s.searchAddr.Load()
-	// N.B. Because mark is serialized, it's not necessary to do a
-	// full CAS here. mark only ever increases searchAddr, while
+	s.chunks[ci].store(sc)
+}
+
+// free updates metadata for chunk at index ci with the fact that
+// a free of npages occurred.
+//
+// free may only run concurrently with find.
+func (s *scavengeIndex) free(ci chunkIdx, page, npages uint) {
+	sc := s.chunks[ci].load()
+	sc.free(npages, s.gen)
+	s.chunks[ci].store(sc)
+
+	// Update scavenge search addresses.
+	addr := chunkBase(ci) + uintptr(page+npages-1)*pageSize
+	if s.freeHWM.lessThan(offAddr{addr}) {
+		s.freeHWM = offAddr{addr}
+	}
+	// N.B. Because free is serialized, it's not necessary to do a
+	// full CAS here. free only ever increases searchAddr, while
 	// find only ever decreases it. Since we only ever race with
 	// decreases, even if the value we loaded is stale, the actual
 	// value will never be larger.
-	if (offAddr{searchAddr}).lessThan(offAddr{newSearchAddr}) {
-		s.searchAddr.StoreMarked(newSearchAddr)
+	searchAddr, _ := s.searchAddrForce.Load()
+	if (offAddr{searchAddr}).lessThan(offAddr{addr}) {
+		s.searchAddrForce.StoreMarked(addr)
 	}
 }
 
-// clear sets the chunk at index ci as not containing pages available to scavenge.
+// nextGen moves the scavenger forward one generation. Must be called
+// once per GC cycle, but may be called more often to force more memory
+// to be released.
 //
-// Must be serialized with other mark, markRange, and clear calls.
-func (s *scavengeIndex) clear(ci chunkIdx) {
-	s.chunks[ci/8].And(^uint8(1 << (ci % 8)))
+// nextGen may only run concurrently with find.
+func (s *scavengeIndex) nextGen() {
+	s.gen++
+	searchAddr, _ := s.searchAddrBg.Load()
+	if (offAddr{searchAddr}).lessThan(s.freeHWM) {
+		s.searchAddrBg.StoreMarked(s.freeHWM.addr())
+	}
+	s.freeHWM = minOffAddr
+}
+
+// setEmpty marks that the scavenger has finished looking at ci
+// for now to prevent the scavenger from getting stuck looking
+// at the same chunk.
+//
+// setEmpty may only run concurrently with find.
+func (s *scavengeIndex) setEmpty(ci chunkIdx) {
+	val := s.chunks[ci].load()
+	val.setEmpty()
+	s.chunks[ci].store(val)
+}
+
+// setNoHugePage updates the backed-by-hugepages status of a particular chunk.
+// Returns true if the set was successful (not already backed by huge pages).
+//
+// setNoHugePage may only run concurrently with find.
+func (s *scavengeIndex) setNoHugePage(ci chunkIdx) {
+	val := s.chunks[ci].load()
+	if !val.isHugePage() {
+		return
+	}
+	val.setNoHugePage()
+	s.chunks[ci].store(val)
+}
+
+// atomicScavChunkData is an atomic wrapper around a scavChunkData
+// that stores it in its packed form.
+type atomicScavChunkData struct {
+	value atomic.Uint64
+}
+
+// load loads and unpacks a scavChunkData.
+func (sc *atomicScavChunkData) load() scavChunkData {
+	return unpackScavChunkData(sc.value.Load())
+}
+
+// store packs and writes a new scavChunkData. store must be serialized
+// with other calls to store.
+func (sc *atomicScavChunkData) store(ssc scavChunkData) {
+	sc.value.Store(ssc.pack())
+}
+
+// scavChunkData tracks information about a palloc chunk for
+// scavenging. It packs well into 64 bits.
+//
+// The zero value always represents a valid newly-grown chunk.
+type scavChunkData struct {
+	// inUse indicates how many pages in this chunk are currently
+	// allocated.
+	//
+	// Only the first 10 bits are used.
+	inUse uint16
+
+	// lastInUse indicates how many pages in this chunk were allocated
+	// when we transitioned from gen-1 to gen.
+	//
+	// Only the first 10 bits are used.
+	lastInUse uint16
+
+	// gen is the generation counter from a scavengeIndex from the
+	// last time this scavChunkData was updated.
+	gen uint32
+
+	// scavChunkFlags represents additional flags
+	//
+	// Note: only 6 bits are available.
+	scavChunkFlags
+}
+
+// unpackScavChunkData unpacks a scavChunkData from a uint64.
+func unpackScavChunkData(sc uint64) scavChunkData {
+	return scavChunkData{
+		inUse:          uint16(sc),
+		lastInUse:      uint16(sc>>16) & scavChunkInUseMask,
+		gen:            uint32(sc >> 32),
+		scavChunkFlags: scavChunkFlags(uint8(sc>>(16+logScavChunkInUseMax)) & scavChunkFlagsMask),
+	}
+}
+
+// pack returns sc packed into a uint64.
+func (sc scavChunkData) pack() uint64 {
+	return uint64(sc.inUse) |
+		(uint64(sc.lastInUse) << 16) |
+		(uint64(sc.scavChunkFlags) << (16 + logScavChunkInUseMax)) |
+		(uint64(sc.gen) << 32)
+}
+
+const (
+	// scavChunkHasFree indicates whether the chunk has anything left to
+	// scavenge. This is the opposite of "empty," used elsewhere in this
+	// file. The reason we say "HasFree" here is so the zero value is
+	// correct for a newly-grown chunk. (New memory is scavenged.)
+	scavChunkHasFree scavChunkFlags = 1 << iota
+	// scavChunkNoHugePage indicates whether this chunk has had any huge
+	// pages broken by the scavenger.
+	//.
+	// The negative here is unfortunate, but necessary to make it so that
+	// the zero value of scavChunkData accurately represents the state of
+	// a newly-grown chunk. (New memory is marked as backed by huge pages.)
+	scavChunkNoHugePage
+
+	// scavChunkMaxFlags is the maximum number of flags we can have, given how
+	// a scavChunkData is packed into 8 bytes.
+	scavChunkMaxFlags  = 6
+	scavChunkFlagsMask = (1 << scavChunkMaxFlags) - 1
+
+	// logScavChunkInUseMax is the number of bits needed to represent the number
+	// of pages allocated in a single chunk. This is 1 more than log2 of the
+	// number of pages in the chunk because we need to represent a fully-allocated
+	// chunk.
+	logScavChunkInUseMax = logPallocChunkPages + 1
+	scavChunkInUseMask   = (1 << logScavChunkInUseMax) - 1
+)
+
+// scavChunkFlags is a set of bit-flags for the scavenger for each palloc chunk.
+type scavChunkFlags uint8
+
+// isEmpty returns true if the hasFree flag is unset.
+func (sc *scavChunkFlags) isEmpty() bool {
+	return (*sc)&scavChunkHasFree == 0
+}
+
+// setEmpty clears the hasFree flag.
+func (sc *scavChunkFlags) setEmpty() {
+	*sc &^= scavChunkHasFree
+}
+
+// setNonEmpty sets the hasFree flag.
+func (sc *scavChunkFlags) setNonEmpty() {
+	*sc |= scavChunkHasFree
+}
+
+// isHugePage returns false if the noHugePage flag is set.
+func (sc *scavChunkFlags) isHugePage() bool {
+	return (*sc)&scavChunkNoHugePage == 0
+}
+
+// setHugePage clears the noHugePage flag.
+func (sc *scavChunkFlags) setHugePage() {
+	*sc &^= scavChunkNoHugePage
+}
+
+// setNoHugePage sets the noHugePage flag.
+func (sc *scavChunkFlags) setNoHugePage() {
+	*sc |= scavChunkNoHugePage
+}
+
+// shouldScavenge returns true if the corresponding chunk should be interrogated
+// by the scavenger.
+func (sc scavChunkData) shouldScavenge(currGen uint32, force bool) bool {
+	if sc.isEmpty() {
+		// Nothing to scavenge.
+		return false
+	}
+	if force {
+		// We're forcing the memory to be scavenged.
+		return true
+	}
+	if sc.gen == currGen {
+		// In the current generation, if either the current or last generation
+		// is dense, then skip scavenging. Inverting that, we should scavenge
+		// if both the current and last generation were not dense.
+		return sc.inUse < scavChunkHiOccPages && sc.lastInUse < scavChunkHiOccPages
+	}
+	// If we're one or more generations ahead, we know inUse represents the current
+	// state of the chunk, since otherwise it would've been updated already.
+	return sc.inUse < scavChunkHiOccPages
+}
+
+// alloc updates sc given that npages were allocated in the corresponding chunk.
+func (sc *scavChunkData) alloc(npages uint, newGen uint32) {
+	if uint(sc.inUse)+npages > pallocChunkPages {
+		print("runtime: inUse=", sc.inUse, " npages=", npages, "\n")
+		throw("too many pages allocated in chunk?")
+	}
+	if sc.gen != newGen {
+		sc.lastInUse = sc.inUse
+		sc.gen = newGen
+	}
+	sc.inUse += uint16(npages)
+	if sc.inUse == pallocChunkPages {
+		// There's nothing for the scavenger to take from here.
+		sc.setEmpty()
+	}
+}
+
+// free updates sc given that npages was freed in the corresponding chunk.
+func (sc *scavChunkData) free(npages uint, newGen uint32) {
+	if uint(sc.inUse) < npages {
+		print("runtime: inUse=", sc.inUse, " npages=", npages, "\n")
+		throw("allocated pages below zero?")
+	}
+	if sc.gen != newGen {
+		sc.lastInUse = sc.inUse
+		sc.gen = newGen
+	}
+	sc.inUse -= uint16(npages)
+	// The scavenger can no longer be done with this chunk now that
+	// new memory has been freed into it.
+	sc.setNonEmpty()
 }
 
 type piController struct {
diff --git a/src/runtime/mgcscavenge_test.go b/src/runtime/mgcscavenge_test.go
index c436ff0..d7624d6 100644
--- a/src/runtime/mgcscavenge_test.go
+++ b/src/runtime/mgcscavenge_test.go
@@ -564,149 +564,278 @@
 }
 
 func TestScavengeIndex(t *testing.T) {
-	setup := func(t *testing.T) (func(ChunkIdx, uint), func(uintptr, uintptr)) {
+	// This test suite tests the scavengeIndex data structure.
+
+	// markFunc is a function that makes the address range [base, limit)
+	// available for scavenging in a test index.
+	type markFunc func(base, limit uintptr)
+
+	// findFunc is a function that searches for the next available page
+	// to scavenge in the index. It asserts that the page is found in
+	// chunk "ci" at page "offset."
+	type findFunc func(ci ChunkIdx, offset uint)
+
+	// The structure of the tests below is as follows:
+	//
+	// setup creates a fake scavengeIndex that can be mutated and queried by
+	// the functions it returns. Those functions capture the testing.T that
+	// setup is called with, so they're bound to the subtest they're created in.
+	//
+	// Tests are then organized into test cases which mark some pages as
+	// scavenge-able then try to find them. Tests expect that the initial
+	// state of the scavengeIndex has all of the chunks as dense in the last
+	// generation and empty to the scavenger.
+	//
+	// There are a few additional tests that interleave mark and find operations,
+	// so they're defined separately, but use the same infrastructure.
+	setup := func(t *testing.T, force bool) (mark markFunc, find findFunc, nextGen func()) {
 		t.Helper()
 
 		// Pick some reasonable bounds. We don't need a huge range just to test.
 		si := NewScavengeIndex(BaseChunkIdx, BaseChunkIdx+64)
-		find := func(want ChunkIdx, wantOffset uint) {
+
+		// Initialize all the chunks as dense and empty.
+		//
+		// Also, reset search addresses so that we can get page offsets.
+		si.AllocRange(PageBase(BaseChunkIdx, 0), PageBase(BaseChunkIdx+64, 0))
+		si.NextGen()
+		si.FreeRange(PageBase(BaseChunkIdx, 0), PageBase(BaseChunkIdx+64, 0))
+		for ci := BaseChunkIdx; ci < BaseChunkIdx+64; ci++ {
+			si.SetEmpty(ci)
+		}
+		si.ResetSearchAddrs()
+
+		// Create and return test functions.
+		mark = func(base, limit uintptr) {
 			t.Helper()
 
-			got, gotOffset := si.Find()
+			si.AllocRange(base, limit)
+			si.FreeRange(base, limit)
+		}
+		find = func(want ChunkIdx, wantOffset uint) {
+			t.Helper()
+
+			got, gotOffset := si.Find(force)
 			if want != got {
 				t.Errorf("find: wanted chunk index %d, got %d", want, got)
 			}
-			if want != got {
+			if wantOffset != gotOffset {
 				t.Errorf("find: wanted page offset %d, got %d", wantOffset, gotOffset)
 			}
 			if t.Failed() {
 				t.FailNow()
 			}
-			si.Clear(got)
+			si.SetEmpty(got)
 		}
-		mark := func(base, limit uintptr) {
+		nextGen = func() {
 			t.Helper()
 
-			si.Mark(base, limit)
+			si.NextGen()
 		}
-		return find, mark
+		return
 	}
-	t.Run("Uninitialized", func(t *testing.T) {
-		find, _ := setup(t)
-		find(0, 0)
-	})
-	t.Run("OnePage", func(t *testing.T) {
-		find, mark := setup(t)
-		mark(PageBase(BaseChunkIdx, 3), PageBase(BaseChunkIdx, 4))
-		find(BaseChunkIdx, 3)
-		find(0, 0)
-	})
-	t.Run("FirstPage", func(t *testing.T) {
-		find, mark := setup(t)
-		mark(PageBase(BaseChunkIdx, 0), PageBase(BaseChunkIdx, 1))
-		find(BaseChunkIdx, 0)
-		find(0, 0)
-	})
-	t.Run("SeveralPages", func(t *testing.T) {
-		find, mark := setup(t)
-		mark(PageBase(BaseChunkIdx, 9), PageBase(BaseChunkIdx, 14))
-		find(BaseChunkIdx, 13)
-		find(0, 0)
-	})
-	t.Run("WholeChunk", func(t *testing.T) {
-		find, mark := setup(t)
-		mark(PageBase(BaseChunkIdx, 0), PageBase(BaseChunkIdx+1, 0))
-		find(BaseChunkIdx, PallocChunkPages-1)
-		find(0, 0)
-	})
-	t.Run("LastPage", func(t *testing.T) {
-		find, mark := setup(t)
-		mark(PageBase(BaseChunkIdx, PallocChunkPages-1), PageBase(BaseChunkIdx+1, 0))
-		find(BaseChunkIdx, PallocChunkPages-1)
-		find(0, 0)
-	})
-	t.Run("TwoChunks", func(t *testing.T) {
-		find, mark := setup(t)
-		mark(PageBase(BaseChunkIdx, 128), PageBase(BaseChunkIdx+1, 128))
-		find(BaseChunkIdx+1, 127)
-		find(BaseChunkIdx, PallocChunkPages-1)
-		find(0, 0)
-	})
-	t.Run("TwoChunksOffset", func(t *testing.T) {
-		find, mark := setup(t)
-		mark(PageBase(BaseChunkIdx+7, 128), PageBase(BaseChunkIdx+8, 129))
-		find(BaseChunkIdx+8, 128)
-		find(BaseChunkIdx+7, PallocChunkPages-1)
-		find(0, 0)
-	})
-	t.Run("SevenChunksOffset", func(t *testing.T) {
-		find, mark := setup(t)
-		mark(PageBase(BaseChunkIdx+6, 11), PageBase(BaseChunkIdx+13, 15))
-		find(BaseChunkIdx+13, 14)
-		for i := BaseChunkIdx + 12; i >= BaseChunkIdx+6; i-- {
-			find(i, PallocChunkPages-1)
-		}
-		find(0, 0)
-	})
-	t.Run("ThirtyTwoChunks", func(t *testing.T) {
-		find, mark := setup(t)
-		mark(PageBase(BaseChunkIdx, 0), PageBase(BaseChunkIdx+32, 0))
-		for i := BaseChunkIdx + 31; i >= BaseChunkIdx; i-- {
-			find(i, PallocChunkPages-1)
-		}
-		find(0, 0)
-	})
-	t.Run("ThirtyTwoChunksOffset", func(t *testing.T) {
-		find, mark := setup(t)
-		mark(PageBase(BaseChunkIdx+3, 0), PageBase(BaseChunkIdx+35, 0))
-		for i := BaseChunkIdx + 34; i >= BaseChunkIdx+3; i-- {
-			find(i, PallocChunkPages-1)
-		}
-		find(0, 0)
-	})
-	t.Run("Mark", func(t *testing.T) {
-		find, mark := setup(t)
+
+	// Each of these test cases calls mark and then find once.
+	type testCase struct {
+		name string
+		mark func(markFunc)
+		find func(findFunc)
+	}
+	for _, test := range []testCase{
+		{
+			name: "Uninitialized",
+			mark: func(_ markFunc) {},
+			find: func(_ findFunc) {},
+		},
+		{
+			name: "OnePage",
+			mark: func(mark markFunc) {
+				mark(PageBase(BaseChunkIdx, 3), PageBase(BaseChunkIdx, 4))
+			},
+			find: func(find findFunc) {
+				find(BaseChunkIdx, 3)
+			},
+		},
+		{
+			name: "FirstPage",
+			mark: func(mark markFunc) {
+				mark(PageBase(BaseChunkIdx, 0), PageBase(BaseChunkIdx, 1))
+			},
+			find: func(find findFunc) {
+				find(BaseChunkIdx, 0)
+			},
+		},
+		{
+			name: "SeveralPages",
+			mark: func(mark markFunc) {
+				mark(PageBase(BaseChunkIdx, 9), PageBase(BaseChunkIdx, 14))
+			},
+			find: func(find findFunc) {
+				find(BaseChunkIdx, 13)
+			},
+		},
+		{
+			name: "WholeChunk",
+			mark: func(mark markFunc) {
+				mark(PageBase(BaseChunkIdx, 0), PageBase(BaseChunkIdx+1, 0))
+			},
+			find: func(find findFunc) {
+				find(BaseChunkIdx, PallocChunkPages-1)
+			},
+		},
+		{
+			name: "LastPage",
+			mark: func(mark markFunc) {
+				mark(PageBase(BaseChunkIdx, PallocChunkPages-1), PageBase(BaseChunkIdx+1, 0))
+			},
+			find: func(find findFunc) {
+				find(BaseChunkIdx, PallocChunkPages-1)
+			},
+		},
+		{
+			name: "TwoChunks",
+			mark: func(mark markFunc) {
+				mark(PageBase(BaseChunkIdx, 128), PageBase(BaseChunkIdx+1, 128))
+			},
+			find: func(find findFunc) {
+				find(BaseChunkIdx+1, 127)
+				find(BaseChunkIdx, PallocChunkPages-1)
+			},
+		},
+		{
+			name: "TwoChunksOffset",
+			mark: func(mark markFunc) {
+				mark(PageBase(BaseChunkIdx+7, 128), PageBase(BaseChunkIdx+8, 129))
+			},
+			find: func(find findFunc) {
+				find(BaseChunkIdx+8, 128)
+				find(BaseChunkIdx+7, PallocChunkPages-1)
+			},
+		},
+		{
+			name: "SevenChunksOffset",
+			mark: func(mark markFunc) {
+				mark(PageBase(BaseChunkIdx+6, 11), PageBase(BaseChunkIdx+13, 15))
+			},
+			find: func(find findFunc) {
+				find(BaseChunkIdx+13, 14)
+				for i := BaseChunkIdx + 12; i >= BaseChunkIdx+6; i-- {
+					find(i, PallocChunkPages-1)
+				}
+			},
+		},
+		{
+			name: "ThirtyTwoChunks",
+			mark: func(mark markFunc) {
+				mark(PageBase(BaseChunkIdx, 0), PageBase(BaseChunkIdx+32, 0))
+			},
+			find: func(find findFunc) {
+				for i := BaseChunkIdx + 31; i >= BaseChunkIdx; i-- {
+					find(i, PallocChunkPages-1)
+				}
+			},
+		},
+		{
+			name: "ThirtyTwoChunksOffset",
+			mark: func(mark markFunc) {
+				mark(PageBase(BaseChunkIdx+3, 0), PageBase(BaseChunkIdx+35, 0))
+			},
+			find: func(find findFunc) {
+				for i := BaseChunkIdx + 34; i >= BaseChunkIdx+3; i-- {
+					find(i, PallocChunkPages-1)
+				}
+			},
+		},
+		{
+			name: "Mark",
+			mark: func(mark markFunc) {
+				for i := BaseChunkIdx; i < BaseChunkIdx+32; i++ {
+					mark(PageBase(i, 0), PageBase(i+1, 0))
+				}
+			},
+			find: func(find findFunc) {
+				for i := BaseChunkIdx + 31; i >= BaseChunkIdx; i-- {
+					find(i, PallocChunkPages-1)
+				}
+			},
+		},
+		{
+			name: "MarkIdempotentOneChunk",
+			mark: func(mark markFunc) {
+				mark(PageBase(BaseChunkIdx, 0), PageBase(BaseChunkIdx+1, 0))
+				mark(PageBase(BaseChunkIdx, 0), PageBase(BaseChunkIdx+1, 0))
+			},
+			find: func(find findFunc) {
+				find(BaseChunkIdx, PallocChunkPages-1)
+			},
+		},
+		{
+			name: "MarkIdempotentThirtyTwoChunks",
+			mark: func(mark markFunc) {
+				mark(PageBase(BaseChunkIdx, 0), PageBase(BaseChunkIdx+32, 0))
+				mark(PageBase(BaseChunkIdx, 0), PageBase(BaseChunkIdx+32, 0))
+			},
+			find: func(find findFunc) {
+				for i := BaseChunkIdx + 31; i >= BaseChunkIdx; i-- {
+					find(i, PallocChunkPages-1)
+				}
+			},
+		},
+		{
+			name: "MarkIdempotentThirtyTwoChunksOffset",
+			mark: func(mark markFunc) {
+				mark(PageBase(BaseChunkIdx+4, 0), PageBase(BaseChunkIdx+31, 0))
+				mark(PageBase(BaseChunkIdx+5, 0), PageBase(BaseChunkIdx+36, 0))
+			},
+			find: func(find findFunc) {
+				for i := BaseChunkIdx + 35; i >= BaseChunkIdx+4; i-- {
+					find(i, PallocChunkPages-1)
+				}
+			},
+		},
+	} {
+		test := test
+		t.Run("Bg/"+test.name, func(t *testing.T) {
+			mark, find, nextGen := setup(t, false)
+			test.mark(mark)
+			find(0, 0)      // Make sure we find nothing at this point.
+			nextGen()       // Move to the next generation.
+			test.find(find) // Now we should be able to find things.
+			find(0, 0)      // The test should always fully exhaust the index.
+		})
+		t.Run("Force/"+test.name, func(t *testing.T) {
+			mark, find, _ := setup(t, true)
+			test.mark(mark)
+			test.find(find) // Finding should always work when forced.
+			find(0, 0)      // The test should always fully exhaust the index.
+		})
+	}
+	t.Run("Bg/MarkInterleaved", func(t *testing.T) {
+		mark, find, nextGen := setup(t, false)
 		for i := BaseChunkIdx; i < BaseChunkIdx+32; i++ {
 			mark(PageBase(i, 0), PageBase(i+1, 0))
-		}
-		for i := BaseChunkIdx + 31; i >= BaseChunkIdx; i-- {
+			nextGen()
 			find(i, PallocChunkPages-1)
 		}
 		find(0, 0)
 	})
-	t.Run("MarkInterleaved", func(t *testing.T) {
-		find, mark := setup(t)
+	t.Run("Force/MarkInterleaved", func(t *testing.T) {
+		mark, find, _ := setup(t, true)
 		for i := BaseChunkIdx; i < BaseChunkIdx+32; i++ {
 			mark(PageBase(i, 0), PageBase(i+1, 0))
 			find(i, PallocChunkPages-1)
 		}
 		find(0, 0)
 	})
-	t.Run("MarkIdempotentOneChunk", func(t *testing.T) {
-		find, mark := setup(t)
-		mark(PageBase(BaseChunkIdx, 0), PageBase(BaseChunkIdx+1, 0))
-		mark(PageBase(BaseChunkIdx, 0), PageBase(BaseChunkIdx+1, 0))
-		find(BaseChunkIdx, PallocChunkPages-1)
-		find(0, 0)
-	})
-	t.Run("MarkIdempotentThirtyTwoChunks", func(t *testing.T) {
-		find, mark := setup(t)
-		mark(PageBase(BaseChunkIdx, 0), PageBase(BaseChunkIdx+32, 0))
-		mark(PageBase(BaseChunkIdx, 0), PageBase(BaseChunkIdx+32, 0))
-		for i := BaseChunkIdx + 31; i >= BaseChunkIdx; i-- {
-			find(i, PallocChunkPages-1)
-		}
-		find(0, 0)
-	})
-	t.Run("MarkIdempotentThirtyTwoChunksOffset", func(t *testing.T) {
-		find, mark := setup(t)
-		mark(PageBase(BaseChunkIdx+4, 0), PageBase(BaseChunkIdx+31, 0))
-		mark(PageBase(BaseChunkIdx+5, 0), PageBase(BaseChunkIdx+36, 0))
-		for i := BaseChunkIdx + 35; i >= BaseChunkIdx+4; i-- {
-			find(i, PallocChunkPages-1)
-		}
-		find(0, 0)
-	})
+}
+
+func TestScavChunkDataPack(t *testing.T) {
+	if !CheckPackScavChunkData(1918237402, 512, 512, 0b11) {
+		t.Error("failed pack/unpack check for scavChunkData 1")
+	}
+	if !CheckPackScavChunkData(^uint32(0), 12, 0, 0b00) {
+		t.Error("failed pack/unpack check for scavChunkData 2")
+	}
 }
 
 func FuzzPIController(f *testing.F) {
diff --git a/src/runtime/mgcsweep.go b/src/runtime/mgcsweep.go
index 6ccf090..68f1aae 100644
--- a/src/runtime/mgcsweep.go
+++ b/src/runtime/mgcsweep.go
@@ -260,9 +260,11 @@
 		c.fullUnswept(sg).reset()
 	}
 
-	// Sweeping is done, so if the scavenger isn't already awake,
-	// wake it up. There's definitely work for it to do at this
-	// point.
+	// Sweeping is done, so there won't be any new memory to
+	// scavenge for a bit.
+	//
+	// If the scavenger isn't already awake, wake it up. There's
+	// definitely work for it to do at this point.
 	scavenger.wake()
 
 	nextMarkBitArenaEpoch()
@@ -275,7 +277,7 @@
 	lock(&sweep.lock)
 	sweep.parked = true
 	c <- 1
-	goparkunlock(&sweep.lock, waitReasonGCSweepWait, traceEvGoBlock, 1)
+	goparkunlock(&sweep.lock, waitReasonGCSweepWait, traceBlockGCSweep, 1)
 
 	for {
 		// bgsweep attempts to be a "low priority" goroutine by intentionally
@@ -316,7 +318,7 @@
 			continue
 		}
 		sweep.parked = true
-		goparkunlock(&sweep.lock, waitReasonGCSweepWait, traceEvGoBlock, 1)
+		goparkunlock(&sweep.lock, waitReasonGCSweepWait, traceBlockGCSweep, 1)
 	}
 }
 
@@ -423,9 +425,17 @@
 		if debug.scavtrace > 0 {
 			systemstack(func() {
 				lock(&mheap_.lock)
-				released := atomic.Loaduintptr(&mheap_.pages.scav.released)
-				printScavTrace(released, false)
-				atomic.Storeuintptr(&mheap_.pages.scav.released, 0)
+
+				// Get released stats.
+				releasedBg := mheap_.pages.scav.releasedBg.Load()
+				releasedEager := mheap_.pages.scav.releasedEager.Load()
+
+				// Print the line.
+				printScavTrace(releasedBg, releasedEager, false)
+
+				// Update the stats.
+				mheap_.pages.scav.releasedBg.Add(-releasedBg)
+				mheap_.pages.scav.releasedEager.Add(-releasedEager)
 				unlock(&mheap_.lock)
 			})
 		}
@@ -484,7 +494,7 @@
 	}
 }
 
-// Sweep frees or collects finalizers for blocks not marked in the mark phase.
+// 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.
 // If preserve=true, don't return it to heap nor relink in mcentral lists;
@@ -510,7 +520,7 @@
 		throw("mspan.sweep: bad span state")
 	}
 
-	if trace.enabled {
+	if traceEnabled() {
 		traceGCSweepSpan(s.npages * _PageSize)
 	}
 
@@ -649,8 +659,8 @@
 	s.allocCount = nalloc
 	s.freeindex = 0 // reset allocation index to start of span.
 	s.freeIndexForScan = 0
-	if trace.enabled {
-		getg().m.p.ptr().traceReclaimed += uintptr(nfreed) * s.elemsize
+	if traceEnabled() {
+		getg().m.p.ptr().trace.reclaimed += uintptr(nfreed) * s.elemsize
 	}
 
 	// gcmarkBits becomes the allocBits.
@@ -658,6 +668,11 @@
 	s.allocBits = s.gcmarkBits
 	s.gcmarkBits = newMarkBits(s.nelems)
 
+	// refresh pinnerBits if they exists
+	if s.pinnerBits != nil {
+		s.refreshPinnerBits()
+	}
+
 	// Initialize alloc bits cache.
 	s.refillAllocCache(0)
 
@@ -869,7 +884,7 @@
 		return
 	}
 
-	if trace.enabled {
+	if traceEnabled() {
 		traceGCSweepStart()
 	}
 
@@ -909,7 +924,7 @@
 		}
 	}
 
-	if trace.enabled {
+	if traceEnabled() {
 		traceGCSweepDone()
 	}
 }
diff --git a/src/runtime/mheap.go b/src/runtime/mheap.go
index 1401e92..f836d91 100644
--- a/src/runtime/mheap.go
+++ b/src/runtime/mheap.go
@@ -144,6 +144,10 @@
 	// will never be nil.
 	arenas [1 << arenaL1Bits]*[1 << arenaL2Bits]*heapArena
 
+	// arenasHugePages indicates whether arenas' L2 entries are eligible
+	// to be backed by huge pages.
+	arenasHugePages bool
+
 	// heapArenaAlloc is pre-reserved space for allocating heapArena
 	// objects. This is only used on 32-bit, where we pre-reserve
 	// this space to avoid interleaving it with the heap itself.
@@ -195,13 +199,14 @@
 		pad      [(cpu.CacheLinePadSize - unsafe.Sizeof(mcentral{})%cpu.CacheLinePadSize) % cpu.CacheLinePadSize]byte
 	}
 
-	spanalloc             fixalloc // allocator for span*
-	cachealloc            fixalloc // allocator for mcache*
-	specialfinalizeralloc fixalloc // allocator for specialfinalizer*
-	specialprofilealloc   fixalloc // allocator for specialprofile*
-	specialReachableAlloc fixalloc // allocator for specialReachable
-	speciallock           mutex    // lock for special record allocators.
-	arenaHintAlloc        fixalloc // allocator for arenaHints
+	spanalloc              fixalloc // allocator for span*
+	cachealloc             fixalloc // allocator for mcache*
+	specialfinalizeralloc  fixalloc // allocator for specialfinalizer*
+	specialprofilealloc    fixalloc // allocator for specialprofile*
+	specialReachableAlloc  fixalloc // allocator for specialReachable
+	specialPinCounterAlloc fixalloc // allocator for specialPinCounter
+	speciallock            mutex    // lock for special record allocators.
+	arenaHintAlloc         fixalloc // allocator for arenaHints
 
 	// User arena state.
 	//
@@ -465,6 +470,7 @@
 	// out memory.
 	allocBits  *gcBits
 	gcmarkBits *gcBits
+	pinnerBits *gcBits // bitmap for pinned objects; accessed atomically
 
 	// sweep generation:
 	// if sweepgen == h->sweepgen - 2, the span needs sweeping
@@ -484,7 +490,7 @@
 	allocCountBeforeCache uint16        // a copy of allocCount that is stored just before this span is cached
 	elemsize              uintptr       // computed from sizeclass or from npages
 	limit                 uintptr       // end of data in span
-	speciallock           mutex         // guards specials list
+	speciallock           mutex         // guards specials list and changes to pinnerBits
 	specials              *special      // linked list of special records sorted by offset.
 	userArenaChunkFree    addrRange     // interval for managing chunk allocation
 
@@ -752,6 +758,7 @@
 	h.specialfinalizeralloc.init(unsafe.Sizeof(specialfinalizer{}), nil, nil, &memstats.other_sys)
 	h.specialprofilealloc.init(unsafe.Sizeof(specialprofile{}), nil, nil, &memstats.other_sys)
 	h.specialReachableAlloc.init(unsafe.Sizeof(specialReachable{}), nil, nil, &memstats.other_sys)
+	h.specialPinCounterAlloc.init(unsafe.Sizeof(specialPinCounter{}), nil, nil, &memstats.other_sys)
 	h.arenaHintAlloc.init(unsafe.Sizeof(arenaHint{}), nil, nil, &memstats.other_sys)
 
 	// Don't zero mspan allocations. Background sweeping can
@@ -769,7 +776,7 @@
 		h.central[i].mcentral.init(spanClass(i))
 	}
 
-	h.pages.init(&h.lock, &memstats.gcMiscSys)
+	h.pages.init(&h.lock, &memstats.gcMiscSys, false)
 }
 
 // reclaim sweeps and reclaims at least npage pages into the heap.
@@ -794,7 +801,7 @@
 	// traceGCSweepStart/Done pair on the P.
 	mp := acquirem()
 
-	if trace.enabled {
+	if traceEnabled() {
 		traceGCSweepStart()
 	}
 
@@ -842,7 +849,7 @@
 		unlock(&h.lock)
 	}
 
-	if trace.enabled {
+	if traceEnabled() {
 		traceGCSweepDone()
 	}
 	releasem(mp)
@@ -914,7 +921,7 @@
 		n -= uintptr(len(inUse) * 8)
 	}
 	sweep.active.end(sl)
-	if trace.enabled {
+	if traceEnabled() {
 		unlock(&h.lock)
 		// Account for pages scanned but not reclaimed.
 		traceGCSweepSpan((n0 - nFreed) * pageSize)
@@ -1270,7 +1277,8 @@
 	// pages not to get touched until we return. Simultaneously, it's important
 	// to do this before calling sysUsed because that may commit address space.
 	bytesToScavenge := uintptr(0)
-	if limit := gcController.memoryLimit.Load(); go119MemoryLimitSupport && !gcCPULimiter.limiting() {
+	forceScavenge := false
+	if limit := gcController.memoryLimit.Load(); !gcCPULimiter.limiting() {
 		// Assist with scavenging to maintain the memory limit by the amount
 		// that we expect to page in.
 		inuse := gcController.mappedReady.Load()
@@ -1278,6 +1286,7 @@
 		// someone can set a really big memory limit that isn't maxInt64.
 		if uint64(scav)+inuse > uint64(limit) {
 			bytesToScavenge = uintptr(uint64(scav) + inuse - uint64(limit))
+			forceScavenge = true
 		}
 	}
 	if goal := scavenge.gcPercentGoal.Load(); goal != ^uint64(0) && growth > 0 {
@@ -1303,7 +1312,7 @@
 			}
 		}
 	}
-	// There are a few very limited cirumstances where we won't have a P here.
+	// There are a few very limited circumstances where we won't have a P here.
 	// It's OK to simply skip scavenging in these cases. Something else will notice
 	// and pick up the tab.
 	var now int64
@@ -1317,9 +1326,11 @@
 		track := pp.limiterEvent.start(limiterEventScavengeAssist, start)
 
 		// Scavenge, but back out if the limiter turns on.
-		h.pages.scavenge(bytesToScavenge, func() bool {
+		released := h.pages.scavenge(bytesToScavenge, func() bool {
 			return gcCPULimiter.limiting()
-		})
+		}, forceScavenge)
+
+		mheap_.pages.scav.releasedEager.Add(released)
 
 		// Finish up accounting.
 		now = nanotime()
@@ -1625,7 +1636,7 @@
 	memstats.heapStats.release()
 
 	// Mark the space as free.
-	h.pages.free(s.base(), s.npages, false)
+	h.pages.free(s.base(), s.npages)
 
 	// Free the span structure. We no longer have a use for it.
 	s.state.set(mSpanDead)
@@ -1635,6 +1646,10 @@
 // scavengeAll acquires the heap lock (blocking any additional
 // manipulation of the page allocator) and iterates over the whole
 // heap, scavenging every free page available.
+//
+// Must run on the system stack because it acquires the heap lock.
+//
+//go:systemstack
 func (h *mheap) scavengeAll() {
 	// Disallow malloc or panic while holding the heap lock. We do
 	// this here because this is a non-mallocgc entry-point to
@@ -1642,12 +1657,13 @@
 	gp := getg()
 	gp.m.mallocing++
 
-	released := h.pages.scavenge(^uintptr(0), nil)
+	// Force scavenge everything.
+	released := h.pages.scavenge(^uintptr(0), nil, true)
 
 	gp.m.mallocing--
 
 	if debug.scavtrace > 0 {
-		printScavTrace(released, true)
+		printScavTrace(0, released, true)
 	}
 }
 
@@ -1675,6 +1691,7 @@
 	span.freeIndexForScan = 0
 	span.allocBits = nil
 	span.gcmarkBits = nil
+	span.pinnerBits = nil
 	span.state.set(mSpanDead)
 	lockInit(&span.speciallock, lockRankMspanSpecial)
 }
@@ -1780,6 +1797,9 @@
 	// _KindSpecialReachable is a special used for tracking
 	// reachability during testing.
 	_KindSpecialReachable = 3
+	// _KindSpecialPinCounter is a special used for objects that are pinned
+	// multiple times
+	_KindSpecialPinCounter = 4
 	// 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
@@ -1833,32 +1853,18 @@
 	lock(&span.speciallock)
 
 	// Find splice point, check for existing record.
-	t := &span.specials
-	for {
-		x := *t
-		if x == nil {
-			break
-		}
-		if offset == uintptr(x.offset) && kind == x.kind {
-			unlock(&span.speciallock)
-			releasem(mp)
-			return false // already exists
-		}
-		if offset < uintptr(x.offset) || (offset == uintptr(x.offset) && kind < x.kind) {
-			break
-		}
-		t = &x.next
+	iter, exists := span.specialFindSplicePoint(offset, kind)
+	if !exists {
+		// Splice in record, fill in offset.
+		s.offset = uint16(offset)
+		s.next = *iter
+		*iter = s
+		spanHasSpecials(span)
 	}
 
-	// Splice in record, fill in offset.
-	s.offset = uint16(offset)
-	s.next = *t
-	*t = s
-	spanHasSpecials(span)
 	unlock(&span.speciallock)
 	releasem(mp)
-
-	return true
+	return !exists // already exists
 }
 
 // Removes the Special record of the given kind for the object p.
@@ -1880,20 +1886,12 @@
 
 	var result *special
 	lock(&span.speciallock)
-	t := &span.specials
-	for {
-		s := *t
-		if s == nil {
-			break
-		}
-		// 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 == uintptr(s.offset) && kind == s.kind {
-			*t = s.next
-			result = s
-			break
-		}
-		t = &s.next
+
+	iter, exists := span.specialFindSplicePoint(offset, kind)
+	if exists {
+		s := *iter
+		*iter = s.next
+		result = s
 	}
 	if span.specials == nil {
 		spanHasNoSpecials(span)
@@ -1903,6 +1901,30 @@
 	return result
 }
 
+// Find a splice point in the sorted list and check for an already existing
+// record. Returns a pointer to the next-reference in the list predecessor.
+// Returns true, if the referenced item is an exact match.
+func (span *mspan) specialFindSplicePoint(offset uintptr, kind byte) (**special, bool) {
+	// Find splice point, check for existing record.
+	iter := &span.specials
+	found := false
+	for {
+		s := *iter
+		if s == nil {
+			break
+		}
+		if offset == uintptr(s.offset) && kind == s.kind {
+			found = true
+			break
+		}
+		if offset < uintptr(s.offset) || (offset == uintptr(s.offset) && kind < s.kind) {
+			break
+		}
+		iter = &s.next
+	}
+	return iter, found
+}
+
 // The described object has a finalizer set for it.
 //
 // specialfinalizer is allocated from non-GC'd memory, so any heap
@@ -1993,6 +2015,12 @@
 	reachable bool
 }
 
+// specialPinCounter tracks whether an object is pinned multiple times.
+type specialPinCounter struct {
+	special special
+	counter uintptr
+}
+
 // specialsIter helps iterate over specials lists.
 type specialsIter struct {
 	pprev **special
@@ -2041,6 +2069,10 @@
 		sp := (*specialReachable)(unsafe.Pointer(s))
 		sp.done = true
 		// The creator frees these.
+	case _KindSpecialPinCounter:
+		lock(&mheap_.speciallock)
+		mheap_.specialPinCounterAlloc.free(unsafe.Pointer(s))
+		unlock(&mheap_.speciallock)
 	default:
 		throw("bad special kind")
 		panic("not reached")
diff --git a/src/runtime/minmax.go b/src/runtime/minmax.go
new file mode 100644
index 0000000..e5efc65
--- /dev/null
+++ b/src/runtime/minmax.go
@@ -0,0 +1,72 @@
+// Copyright 2023 The Go Authors. 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"
+
+func strmin(x, y string) string {
+	if y < x {
+		return y
+	}
+	return x
+}
+
+func strmax(x, y string) string {
+	if y > x {
+		return y
+	}
+	return x
+}
+
+func fmin32(x, y float32) float32 { return fmin(x, y) }
+func fmin64(x, y float64) float64 { return fmin(x, y) }
+func fmax32(x, y float32) float32 { return fmax(x, y) }
+func fmax64(x, y float64) float64 { return fmax(x, y) }
+
+type floaty interface{ ~float32 | ~float64 }
+
+func fmin[F floaty](x, y F) F {
+	if y != y || y < x {
+		return y
+	}
+	if x != x || x < y || x != 0 {
+		return x
+	}
+	// x and y are both ±0
+	// if either is -0, return -0; else return +0
+	return forbits(x, y)
+}
+
+func fmax[F floaty](x, y F) F {
+	if y != y || y > x {
+		return y
+	}
+	if x != x || x > y || x != 0 {
+		return x
+	}
+	// x and y are both ±0
+	// if both are -0, return -0; else return +0
+	return fandbits(x, y)
+}
+
+func forbits[F floaty](x, y F) F {
+	switch unsafe.Sizeof(x) {
+	case 4:
+		*(*uint32)(unsafe.Pointer(&x)) |= *(*uint32)(unsafe.Pointer(&y))
+	case 8:
+		*(*uint64)(unsafe.Pointer(&x)) |= *(*uint64)(unsafe.Pointer(&y))
+	}
+	return x
+}
+
+func fandbits[F floaty](x, y F) F {
+	switch unsafe.Sizeof(x) {
+	case 4:
+		*(*uint32)(unsafe.Pointer(&x)) &= *(*uint32)(unsafe.Pointer(&y))
+	case 8:
+		*(*uint64)(unsafe.Pointer(&x)) &= *(*uint64)(unsafe.Pointer(&y))
+	}
+	return x
+}
diff --git a/src/runtime/minmax_test.go b/src/runtime/minmax_test.go
new file mode 100644
index 0000000..e0bc28f
--- /dev/null
+++ b/src/runtime/minmax_test.go
@@ -0,0 +1,129 @@
+// Copyright 2023 The Go Authors. 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"
+	"strings"
+	"testing"
+	"unsafe"
+)
+
+var (
+	zero    = math.Copysign(0, +1)
+	negZero = math.Copysign(0, -1)
+	inf     = math.Inf(+1)
+	negInf  = math.Inf(-1)
+	nan     = math.NaN()
+)
+
+var tests = []struct{ min, max float64 }{
+	{1, 2},
+	{-2, 1},
+	{negZero, zero},
+	{zero, inf},
+	{negInf, zero},
+	{negInf, inf},
+	{1, inf},
+	{negInf, 1},
+}
+
+var all = []float64{1, 2, -1, -2, zero, negZero, inf, negInf, nan}
+
+func eq(x, y float64) bool {
+	return x == y && math.Signbit(x) == math.Signbit(y)
+}
+
+func TestMinFloat(t *testing.T) {
+	for _, tt := range tests {
+		if z := min(tt.min, tt.max); !eq(z, tt.min) {
+			t.Errorf("min(%v, %v) = %v, want %v", tt.min, tt.max, z, tt.min)
+		}
+		if z := min(tt.max, tt.min); !eq(z, tt.min) {
+			t.Errorf("min(%v, %v) = %v, want %v", tt.max, tt.min, z, tt.min)
+		}
+	}
+	for _, x := range all {
+		if z := min(nan, x); !math.IsNaN(z) {
+			t.Errorf("min(%v, %v) = %v, want %v", nan, x, z, nan)
+		}
+		if z := min(x, nan); !math.IsNaN(z) {
+			t.Errorf("min(%v, %v) = %v, want %v", nan, x, z, nan)
+		}
+	}
+}
+
+func TestMaxFloat(t *testing.T) {
+	for _, tt := range tests {
+		if z := max(tt.min, tt.max); !eq(z, tt.max) {
+			t.Errorf("max(%v, %v) = %v, want %v", tt.min, tt.max, z, tt.max)
+		}
+		if z := max(tt.max, tt.min); !eq(z, tt.max) {
+			t.Errorf("max(%v, %v) = %v, want %v", tt.max, tt.min, z, tt.max)
+		}
+	}
+	for _, x := range all {
+		if z := max(nan, x); !math.IsNaN(z) {
+			t.Errorf("min(%v, %v) = %v, want %v", nan, x, z, nan)
+		}
+		if z := max(x, nan); !math.IsNaN(z) {
+			t.Errorf("min(%v, %v) = %v, want %v", nan, x, z, nan)
+		}
+	}
+}
+
+// testMinMax tests that min/max behave correctly on every pair of
+// values in vals.
+//
+// vals should be a sequence of values in strictly ascending order.
+func testMinMax[T int | uint8 | string](t *testing.T, vals ...T) {
+	for i, x := range vals {
+		for _, y := range vals[i+1:] {
+			if !(x < y) {
+				t.Fatalf("values out of order: !(%v < %v)", x, y)
+			}
+
+			if z := min(x, y); z != x {
+				t.Errorf("min(%v, %v) = %v, want %v", x, y, z, x)
+			}
+			if z := min(y, x); z != x {
+				t.Errorf("min(%v, %v) = %v, want %v", y, x, z, x)
+			}
+
+			if z := max(x, y); z != y {
+				t.Errorf("max(%v, %v) = %v, want %v", x, y, z, y)
+			}
+			if z := max(y, x); z != y {
+				t.Errorf("max(%v, %v) = %v, want %v", y, x, z, y)
+			}
+		}
+	}
+}
+
+func TestMinMaxInt(t *testing.T)    { testMinMax[int](t, -7, 0, 9) }
+func TestMinMaxUint8(t *testing.T)  { testMinMax[uint8](t, 0, 1, 2, 4, 7) }
+func TestMinMaxString(t *testing.T) { testMinMax[string](t, "a", "b", "c") }
+
+// TestMinMaxStringTies ensures that min(a, b) returns a when a == b.
+func TestMinMaxStringTies(t *testing.T) {
+	s := "xxx"
+	x := strings.Split(s, "")
+
+	test := func(i, j, k int) {
+		if z := min(x[i], x[j], x[k]); unsafe.StringData(z) != unsafe.StringData(x[i]) {
+			t.Errorf("min(x[%v], x[%v], x[%v]) = %p, want %p", i, j, k, unsafe.StringData(z), unsafe.StringData(x[i]))
+		}
+		if z := max(x[i], x[j], x[k]); unsafe.StringData(z) != unsafe.StringData(x[i]) {
+			t.Errorf("max(x[%v], x[%v], x[%v]) = %p, want %p", i, j, k, unsafe.StringData(z), unsafe.StringData(x[i]))
+		}
+	}
+
+	test(0, 1, 2)
+	test(0, 2, 1)
+	test(1, 0, 2)
+	test(1, 2, 0)
+	test(2, 0, 1)
+	test(2, 1, 0)
+}
diff --git a/src/runtime/mkduff.go b/src/runtime/mkduff.go
index 6b42b85..cc58558 100644
--- a/src/runtime/mkduff.go
+++ b/src/runtime/mkduff.go
@@ -66,7 +66,7 @@
 	// X15: zero
 	// DI: ptr to memory to be zeroed
 	// DI is updated as a side effect.
-	fmt.Fprintln(w, "TEXT runtime·duffzero<ABIInternal>(SB), NOSPLIT, $0-0")
+	fmt.Fprintln(w, "TEXT runtime·duffzero<ABIInternal>(SB), NOSPLIT|NOFRAME, $0-0")
 	for i := 0; i < 16; i++ {
 		fmt.Fprintln(w, "\tMOVUPS\tX15,(DI)")
 		fmt.Fprintln(w, "\tMOVUPS\tX15,16(DI)")
@@ -85,7 +85,7 @@
 	//
 	// This is equivalent to a sequence of MOVSQ but
 	// for some reason that is 3.5x slower than this code.
-	fmt.Fprintln(w, "TEXT runtime·duffcopy<ABIInternal>(SB), NOSPLIT, $0-0")
+	fmt.Fprintln(w, "TEXT runtime·duffcopy<ABIInternal>(SB), NOSPLIT|NOFRAME, $0-0")
 	for i := 0; i < 64; i++ {
 		fmt.Fprintln(w, "\tMOVUPS\t(SI), X0")
 		fmt.Fprintln(w, "\tADDQ\t$16, SI")
diff --git a/src/runtime/mklockrank.go b/src/runtime/mklockrank.go
index bc15e57..c0d5a02 100644
--- a/src/runtime/mklockrank.go
+++ b/src/runtime/mklockrank.go
@@ -109,12 +109,14 @@
 < MALLOC
 # Below MALLOC is the malloc implementation.
 < fin,
-  gcBitsArenas,
-  mheapSpecial,
-  mspanSpecial,
   spanSetSpine,
+  mspanSpecial,
   MPROF;
 
+# We can acquire gcBitsArenas for pinner bits, and
+# it's guarded by mspanSpecial.
+MALLOC, mspanSpecial < gcBitsArenas;
+
 # Memory profiling
 MPROF < profInsert, profBlock, profMemActive;
 profMemActive < profMemFuture;
@@ -159,6 +161,11 @@
 # Above mheap is anything that can call the span allocator.
 < mheap;
 # Below mheap is the span allocator implementation.
+#
+# Specials: we're allowed to allocate a special while holding
+# an mspanSpecial lock, and they're part of the malloc implementation.
+# Pinner bits might be freed by the span allocator.
+mheap, mspanSpecial < mheapSpecial;
 mheap, mheapSpecial < globalAlloc;
 
 # Execution tracer events (with a P)
@@ -179,6 +186,8 @@
 # deadlock is not acquired while holding panic, but it also needs to be
 # below all other locks.
 panic < deadlock;
+# raceFini is only held while exiting.
+panic < raceFini;
 `
 
 // cyclicRanks lists lock ranks that allow multiple locks of the same
diff --git a/src/runtime/mkpreempt.go b/src/runtime/mkpreempt.go
index 61d2d02..0bfbd37 100644
--- a/src/runtime/mkpreempt.go
+++ b/src/runtime/mkpreempt.go
@@ -462,20 +462,18 @@
 	movf := "MOVD"
 	add := "ADDV"
 	sub := "SUBV"
-	r31 := "RSB"
 	regsize := 8
 
 	// Add integer registers r4-r21 r23-r29 r31
 	// R0 (zero), R30 (REGTMP), R2 (tp), R3 (SP), R22 (g), R1 (LR) are special,
 	var l = layout{sp: "R3", stack: regsize} // add slot to save PC of interrupted instruction (in LR)
-	for i := 4; i <= 29; i++ {
-		if i == 22 {
-			continue // R3 is REGSP  R22 is g
+	for i := 4; i <= 31; i++ {
+		if i == 22 || i == 30 {
+			continue
 		}
 		reg := fmt.Sprintf("R%d", i)
 		l.add(mov, reg, regsize)
 	}
-	l.add(mov, r31, regsize)
 
 	// Add floating point registers F0-F31.
 	for i := 0; i <= 31; i++ {
@@ -483,6 +481,12 @@
 		l.add(movf, reg, regsize)
 	}
 
+	// save/restore FCC0
+	l.addSpecial(
+		mov+" FCC0, R4\n"+mov+" R4, %d(R3)",
+		mov+" %d(R3), R4\n"+mov+" R4, FCC0",
+		regsize)
+
 	// allocate frame, save PC of interrupted instruction (in LR)
 	p(mov+" R1, -%d(R3)", l.stack)
 	p(sub+" $%d, R3", l.stack)
diff --git a/src/runtime/mksizeclasses.go b/src/runtime/mksizeclasses.go
index 64ed844..156e613 100644
--- a/src/runtime/mksizeclasses.go
+++ b/src/runtime/mksizeclasses.go
@@ -277,6 +277,17 @@
 	fmt.Fprintf(w, "\n")
 }
 
+func maxObjsPerSpan(classes []class) int {
+	max := 0
+	for _, c := range classes[1:] {
+		n := c.npages * pageSize / c.size
+		if n > max {
+			max = n
+		}
+	}
+	return max
+}
+
 func printClasses(w io.Writer, classes []class) {
 	fmt.Fprintln(w, "const (")
 	fmt.Fprintf(w, "_MaxSmallSize = %d\n", maxSmallSize)
@@ -285,6 +296,7 @@
 	fmt.Fprintf(w, "largeSizeDiv = %d\n", largeSizeDiv)
 	fmt.Fprintf(w, "_NumSizeClasses = %d\n", len(classes))
 	fmt.Fprintf(w, "_PageShift = %d\n", pageShift)
+	fmt.Fprintf(w, "maxObjsPerSpan = %d\n", maxObjsPerSpan(classes))
 	fmt.Fprintln(w, ")")
 
 	fmt.Fprint(w, "var class_to_size = [_NumSizeClasses]uint16 {")
diff --git a/src/runtime/mpagealloc.go b/src/runtime/mpagealloc.go
index 35b2a01..3e789ab 100644
--- a/src/runtime/mpagealloc.go
+++ b/src/runtime/mpagealloc.go
@@ -48,6 +48,7 @@
 package runtime
 
 import (
+	"runtime/internal/atomic"
 	"unsafe"
 )
 
@@ -257,11 +258,9 @@
 	// known by the page allocator to be currently in-use (passed
 	// to grow).
 	//
-	// This field is currently unused on 32-bit architectures but
-	// is harmless to track. We care much more about having a
-	// contiguous heap in these cases and take additional measures
-	// to ensure that, so in nearly all cases this should have just
-	// 1 element.
+	// We care much more about having a contiguous heap in these cases
+	// and take additional measures to ensure that, so in nearly all
+	// cases this should have just 1 element.
 	//
 	// All access is protected by the mheapLock.
 	inUse addrRanges
@@ -272,14 +271,17 @@
 		// scavenge.
 		index scavengeIndex
 
-		// released is the amount of memory released this scavenge cycle.
-		//
-		// Updated atomically.
-		released uintptr
+		// releasedBg is the amount of memory released in the background this
+		// scavenge cycle.
+		releasedBg atomic.Uintptr
+
+		// releasedEager is the amount of memory released eagerly this scavenge
+		// cycle.
+		releasedEager atomic.Uintptr
 	}
 
 	// mheap_.lock. This level of indirection makes it possible
-	// to test pageAlloc indepedently of the runtime allocator.
+	// to test pageAlloc independently of the runtime allocator.
 	mheapLock *mutex
 
 	// sysStat is the runtime memstat to update when new system
@@ -292,11 +294,15 @@
 	// Protected by mheapLock.
 	summaryMappedReady uintptr
 
+	// chunkHugePages indicates whether page bitmap chunks should be backed
+	// by huge pages.
+	chunkHugePages bool
+
 	// Whether or not this struct is being used in tests.
 	test bool
 }
 
-func (p *pageAlloc) init(mheapLock *mutex, sysStat *sysMemStat) {
+func (p *pageAlloc) init(mheapLock *mutex, sysStat *sysMemStat, test bool) {
 	if levelLogPages[0] > logMaxPackedValue {
 		// We can't represent 1<<levelLogPages[0] pages, the maximum number
 		// of pages we need to represent at the root level, in a summary, which
@@ -311,13 +317,19 @@
 	p.inUse.init(sysStat)
 
 	// System-dependent initialization.
-	p.sysInit()
+	p.sysInit(test)
 
 	// Start with the searchAddr in a state indicating there's no free memory.
 	p.searchAddr = maxSearchAddr()
 
 	// Set the mheapLock.
 	p.mheapLock = mheapLock
+
+	// Initialize the scavenge index.
+	p.summaryMappedReady += p.scav.index.init(test, sysStat)
+
+	// Set if we're in a test.
+	p.test = test
 }
 
 // tryChunkOf returns the bitmap data for the given chunk.
@@ -354,6 +366,9 @@
 	// We just update a bunch of additional metadata here.
 	p.sysGrow(base, limit)
 
+	// Grow the scavenge index.
+	p.summaryMappedReady += p.scav.index.grow(base, limit, p.sysStat)
+
 	// Update p.start and p.end.
 	// If no growth happened yet, start == 0. This is generally
 	// safe since the zero page is unmapped.
@@ -385,10 +400,21 @@
 	for c := chunkIndex(base); c < chunkIndex(limit); c++ {
 		if p.chunks[c.l1()] == nil {
 			// Create the necessary l2 entry.
-			r := sysAlloc(unsafe.Sizeof(*p.chunks[0]), p.sysStat)
+			const l2Size = unsafe.Sizeof(*p.chunks[0])
+			r := sysAlloc(l2Size, p.sysStat)
 			if r == nil {
 				throw("pageAlloc: out of memory")
 			}
+			if !p.test {
+				// Make the chunk mapping eligible or ineligible
+				// for huge pages, depending on what our current
+				// state is.
+				if p.chunkHugePages {
+					sysHugePage(r, l2Size)
+				} else {
+					sysNoHugePage(r, l2Size)
+				}
+			}
 			// Store the new chunk block but avoid a write barrier.
 			// grow is used in call chains that disallow write barriers.
 			*(*uintptr)(unsafe.Pointer(&p.chunks[c.l1()])) = uintptr(r)
@@ -402,6 +428,48 @@
 	p.update(base, size/pageSize, true, false)
 }
 
+// enableChunkHugePages enables huge pages for the chunk bitmap mappings (disabled by default).
+//
+// This function is idempotent.
+//
+// A note on latency: for sufficiently small heaps (<10s of GiB) this function will take constant
+// time, but may take time proportional to the size of the mapped heap beyond that.
+//
+// The heap lock must not be held over this operation, since it will briefly acquire
+// the heap lock.
+func (p *pageAlloc) enableChunkHugePages() {
+	// Grab the heap lock to turn on huge pages for new chunks and clone the current
+	// heap address space ranges.
+	//
+	// After the lock is released, we can be sure that bitmaps for any new chunks may
+	// be backed with huge pages, and we have the address space for the rest of the
+	// chunks. At the end of this function, all chunk metadata should be backed by huge
+	// pages.
+	lock(&mheap_.lock)
+	if p.chunkHugePages {
+		unlock(&mheap_.lock)
+		return
+	}
+	p.chunkHugePages = true
+	var inUse addrRanges
+	inUse.sysStat = p.sysStat
+	p.inUse.cloneInto(&inUse)
+	unlock(&mheap_.lock)
+
+	// This might seem like a lot of work, but all these loops are for generality.
+	//
+	// For a 1 GiB contiguous heap, a 48-bit address space, 13 L1 bits, a palloc chunk size
+	// of 4 MiB, and adherence to the default set of heap address hints, this will result in
+	// exactly 1 call to sysHugePage.
+	for _, r := range p.inUse.ranges {
+		for i := chunkIndex(r.base.addr()).l1(); i < chunkIndex(r.limit.addr()-1).l1(); i++ {
+			// N.B. We can assume that p.chunks[i] is non-nil and in a mapped part of p.chunks
+			// because it's derived from inUse, which never shrinks.
+			sysHugePage(unsafe.Pointer(p.chunks[i]), unsafe.Sizeof(*p.chunks[0]))
+		}
+	}
+}
+
 // update updates heap metadata. It must be called each time the bitmap
 // is updated.
 //
@@ -511,19 +579,23 @@
 		chunk := p.chunkOf(sc)
 		scav += chunk.scavenged.popcntRange(si, ei+1-si)
 		chunk.allocRange(si, ei+1-si)
+		p.scav.index.alloc(sc, ei+1-si)
 	} else {
 		// The range crosses at least one chunk boundary.
 		chunk := p.chunkOf(sc)
 		scav += chunk.scavenged.popcntRange(si, pallocChunkPages-si)
 		chunk.allocRange(si, pallocChunkPages-si)
+		p.scav.index.alloc(sc, pallocChunkPages-si)
 		for c := sc + 1; c < ec; c++ {
 			chunk := p.chunkOf(c)
 			scav += chunk.scavenged.popcntRange(0, pallocChunkPages)
 			chunk.allocAll()
+			p.scav.index.alloc(c, pallocChunkPages)
 		}
 		chunk = p.chunkOf(ec)
 		scav += chunk.scavenged.popcntRange(0, ei+1)
 		chunk.allocRange(0, ei+1)
+		p.scav.index.alloc(ec, ei+1)
 	}
 	p.update(base, npages, true, true)
 	return uintptr(scav) * pageSize
@@ -857,7 +929,7 @@
 // Must run on the system stack because p.mheapLock must be held.
 //
 //go:systemstack
-func (p *pageAlloc) free(base, npages uintptr, scavenged bool) {
+func (p *pageAlloc) free(base, npages uintptr) {
 	assertLockHeld(p.mheapLock)
 
 	// If we're freeing pages below the p.searchAddr, update searchAddr.
@@ -865,14 +937,13 @@
 		p.searchAddr = b
 	}
 	limit := base + npages*pageSize - 1
-	if !scavenged {
-		p.scav.index.mark(base, limit+1)
-	}
 	if npages == 1 {
 		// Fast path: we're clearing a single bit, and we know exactly
 		// where it is, so mark it directly.
 		i := chunkIndex(base)
-		p.chunkOf(i).free1(chunkPageIndex(base))
+		pi := chunkPageIndex(base)
+		p.chunkOf(i).free1(pi)
+		p.scav.index.free(i, pi, 1)
 	} else {
 		// Slow path: we're clearing more bits so we may need to iterate.
 		sc, ec := chunkIndex(base), chunkIndex(limit)
@@ -881,13 +952,17 @@
 		if sc == ec {
 			// The range doesn't cross any chunk boundaries.
 			p.chunkOf(sc).free(si, ei+1-si)
+			p.scav.index.free(sc, si, ei+1-si)
 		} else {
 			// The range crosses at least one chunk boundary.
 			p.chunkOf(sc).free(si, pallocChunkPages-si)
+			p.scav.index.free(sc, si, pallocChunkPages-si)
 			for c := sc + 1; c < ec; c++ {
 				p.chunkOf(c).freeAll()
+				p.scav.index.free(c, 0, pallocChunkPages)
 			}
 			p.chunkOf(ec).free(0, ei+1)
+			p.scav.index.free(ec, 0, ei+1)
 		}
 	}
 	p.update(base, npages, true, false)
diff --git a/src/runtime/mpagealloc_32bit.go b/src/runtime/mpagealloc_32bit.go
index 859c61d..900146e 100644
--- a/src/runtime/mpagealloc_32bit.go
+++ b/src/runtime/mpagealloc_32bit.go
@@ -12,7 +12,6 @@
 package runtime
 
 import (
-	"runtime/internal/atomic"
 	"unsafe"
 )
 
@@ -58,10 +57,10 @@
 
 // scavengeIndexArray is the backing store for p.scav.index.chunks.
 // On 32-bit platforms, it's small enough to just be a global.
-var scavengeIndexArray [((1 << heapAddrBits) / pallocChunkBytes) / 8]atomic.Uint8
+var scavengeIndexArray [(1 << heapAddrBits) / pallocChunkBytes]atomicScavChunkData
 
 // See mpagealloc_64bit.go for details.
-func (p *pageAlloc) sysInit() {
+func (p *pageAlloc) sysInit(test bool) {
 	// Calculate how much memory all our entries will take up.
 	//
 	// This should be around 12 KiB or less.
@@ -94,9 +93,6 @@
 
 		reservation = add(reservation, uintptr(entries)*pallocSumBytes)
 	}
-
-	// Set up the scavenge index.
-	p.scav.index.chunks = scavengeIndexArray[:]
 }
 
 // See mpagealloc_64bit.go for details.
@@ -119,3 +115,26 @@
 		}
 	}
 }
+
+// sysInit initializes the scavengeIndex' chunks array.
+//
+// Returns the amount of memory added to sysStat.
+func (s *scavengeIndex) sysInit(test bool, sysStat *sysMemStat) (mappedReady uintptr) {
+	if test {
+		// Set up the scavenge index via sysAlloc so the test can free it later.
+		scavIndexSize := uintptr(len(scavengeIndexArray)) * unsafe.Sizeof(atomicScavChunkData{})
+		s.chunks = ((*[(1 << heapAddrBits) / pallocChunkBytes]atomicScavChunkData)(sysAlloc(scavIndexSize, sysStat)))[:]
+		mappedReady = scavIndexSize
+	} else {
+		// Set up the scavenge index.
+		s.chunks = scavengeIndexArray[:]
+	}
+	s.min.Store(1) // The 0th chunk is never going to be mapped for the heap.
+	s.max.Store(uintptr(len(s.chunks)))
+	return
+}
+
+// sysGrow is a no-op on 32-bit platforms.
+func (s *scavengeIndex) sysGrow(base, limit uintptr, sysStat *sysMemStat) uintptr {
+	return 0
+}
diff --git a/src/runtime/mpagealloc_64bit.go b/src/runtime/mpagealloc_64bit.go
index 371c1fb..1418831 100644
--- a/src/runtime/mpagealloc_64bit.go
+++ b/src/runtime/mpagealloc_64bit.go
@@ -7,7 +7,6 @@
 package runtime
 
 import (
-	"runtime/internal/atomic"
 	"unsafe"
 )
 
@@ -69,7 +68,7 @@
 // sysInit performs architecture-dependent initialization of fields
 // in pageAlloc. pageAlloc should be uninitialized except for sysStat
 // if any runtime statistic should be updated.
-func (p *pageAlloc) sysInit() {
+func (p *pageAlloc) sysInit(test bool) {
 	// Reserve memory for each level. This will get mapped in
 	// as R/W by setArenas.
 	for l, shift := range levelShift {
@@ -86,18 +85,12 @@
 		sl := notInHeapSlice{(*notInHeap)(r), 0, entries}
 		p.summary[l] = *(*[]pallocSum)(unsafe.Pointer(&sl))
 	}
-
-	// Set up the scavenge index.
-	nbytes := uintptr(1<<heapAddrBits) / pallocChunkBytes / 8
-	r := sysReserve(nil, nbytes)
-	sl := notInHeapSlice{(*notInHeap)(r), int(nbytes), int(nbytes)}
-	p.scav.index.chunks = *(*[]atomic.Uint8)(unsafe.Pointer(&sl))
 }
 
 // sysGrow performs architecture-dependent operations on heap
 // growth for the page allocator, such as mapping in new memory
 // for summaries. It also updates the length of the slices in
-// [.summary.
+// p.summary.
 //
 // base is the base of the newly-added heap memory and limit is
 // the first address past the end of the newly-added heap memory.
@@ -131,7 +124,7 @@
 		}
 	}
 
-	// addrRangeToSumAddrRange is a convienience function that converts
+	// addrRangeToSumAddrRange is a convenience function that converts
 	// an address range r to the address range of the given summary level
 	// that stores the summaries for r.
 	addrRangeToSumAddrRange := func(level int, r addrRange) addrRange {
@@ -168,8 +161,9 @@
 
 		// Prune need down to what needs to be newly mapped. Some parts of it may
 		// already be mapped by what inUse describes due to page alignment requirements
-		// for mapping. prune's invariants are guaranteed by the fact that this
-		// function will never be asked to remap the same memory twice.
+		// for mapping. Because this function will never be asked to remap the same
+		// memory twice, it should never be possible to prune in such a way that causes
+		// need to be split.
 		if inUseIndex > 0 {
 			need = need.subtract(addrRangeToSumAddrRange(l, p.inUse.ranges[inUseIndex-1]))
 		}
@@ -188,17 +182,18 @@
 	}
 
 	// Update the scavenge index.
-	p.summaryMappedReady += p.scav.index.grow(base, limit, p.sysStat)
+	p.summaryMappedReady += p.scav.index.sysGrow(base, limit, p.sysStat)
 }
 
-// grow increases the index's backing store in response to a heap growth.
+// sysGrow increases the index's backing store in response to a heap growth.
 //
 // Returns the amount of memory added to sysStat.
-func (s *scavengeIndex) grow(base, limit uintptr, sysStat *sysMemStat) uintptr {
+func (s *scavengeIndex) sysGrow(base, limit uintptr, sysStat *sysMemStat) uintptr {
 	if base%pallocChunkBytes != 0 || limit%pallocChunkBytes != 0 {
 		print("runtime: base = ", hex(base), ", limit = ", hex(limit), "\n")
 		throw("sysGrow bounds not aligned to pallocChunkBytes")
 	}
+	scSize := unsafe.Sizeof(atomicScavChunkData{})
 	// Map and commit the pieces of chunks that we need.
 	//
 	// We always map the full range of the minimum heap address to the
@@ -212,24 +207,24 @@
 	// index.
 	haveMin := s.min.Load()
 	haveMax := s.max.Load()
-	needMin := int32(alignDown(uintptr(chunkIndex(base)/8), physPageSize))
-	needMax := int32(alignUp(uintptr((chunkIndex(limit)+7)/8), physPageSize))
+	needMin := alignDown(uintptr(chunkIndex(base)), physPageSize/scSize)
+	needMax := alignUp(uintptr(chunkIndex(limit)), physPageSize/scSize)
 	// Extend the range down to what we have, if there's no overlap.
 	if needMax < haveMin {
 		needMax = haveMin
 	}
-	if needMin > haveMax {
+	if haveMax != 0 && needMin > haveMax {
 		needMin = haveMax
 	}
 	have := makeAddrRange(
 		// Avoid a panic from indexing one past the last element.
-		uintptr(unsafe.Pointer(&s.chunks[0]))+uintptr(haveMin),
-		uintptr(unsafe.Pointer(&s.chunks[0]))+uintptr(haveMax),
+		uintptr(unsafe.Pointer(&s.chunks[0]))+haveMin*scSize,
+		uintptr(unsafe.Pointer(&s.chunks[0]))+haveMax*scSize,
 	)
 	need := makeAddrRange(
 		// Avoid a panic from indexing one past the last element.
-		uintptr(unsafe.Pointer(&s.chunks[0]))+uintptr(needMin),
-		uintptr(unsafe.Pointer(&s.chunks[0]))+uintptr(needMax),
+		uintptr(unsafe.Pointer(&s.chunks[0]))+needMin*scSize,
+		uintptr(unsafe.Pointer(&s.chunks[0]))+needMax*scSize,
 	)
 	// Subtract any overlap from rounding. We can't re-map memory because
 	// it'll be zeroed.
@@ -247,11 +242,17 @@
 			s.max.Store(needMax)
 		}
 	}
-	// Update minHeapIdx. Note that even if there's no mapping work to do,
-	// we may still have a new, lower minimum heap address.
-	minHeapIdx := s.minHeapIdx.Load()
-	if baseIdx := int32(chunkIndex(base) / 8); minHeapIdx == 0 || baseIdx < minHeapIdx {
-		s.minHeapIdx.Store(baseIdx)
-	}
 	return need.size()
 }
+
+// sysInit initializes the scavengeIndex' chunks array.
+//
+// Returns the amount of memory added to sysStat.
+func (s *scavengeIndex) sysInit(test bool, sysStat *sysMemStat) uintptr {
+	n := uintptr(1<<heapAddrBits) / pallocChunkBytes
+	nbytes := n * unsafe.Sizeof(atomicScavChunkData{})
+	r := sysReserve(nil, nbytes)
+	sl := notInHeapSlice{(*notInHeap)(r), int(n), int(n)}
+	s.chunks = *(*[]atomicScavChunkData)(unsafe.Pointer(&sl))
+	return 0 // All memory above is mapped Reserved.
+}
diff --git a/src/runtime/mpagecache.go b/src/runtime/mpagecache.go
index 5bc9c84..245b0cb 100644
--- a/src/runtime/mpagecache.go
+++ b/src/runtime/mpagecache.go
@@ -89,11 +89,15 @@
 	for i := uint(0); i < 64; i++ {
 		if c.cache&(1<<i) != 0 {
 			p.chunkOf(ci).free1(pi + i)
+
+			// Update density statistics.
+			p.scav.index.free(ci, pi+i, 1)
 		}
 		if c.scav&(1<<i) != 0 {
 			p.chunkOf(ci).scavenged.setRange(pi+i, 1)
 		}
 	}
+
 	// Since this is a lot like a free, we need to make sure
 	// we update the searchAddr just like free does.
 	if b := (offAddr{c.base}); b.lessThan(p.searchAddr) {
@@ -145,7 +149,7 @@
 			p.searchAddr = maxSearchAddr()
 			return pageCache{}
 		}
-		ci := chunkIndex(addr)
+		ci = chunkIndex(addr)
 		chunk = p.chunkOf(ci)
 		c = pageCache{
 			base:  alignDown(addr, 64*pageSize),
@@ -163,6 +167,9 @@
 	// Update as an allocation, but note that it's not contiguous.
 	p.update(c.base, pageCachePages, false, true)
 
+	// Update density statistics.
+	p.scav.index.alloc(ci, uint(sys.OnesCount64(c.cache)))
+
 	// Set the search address to the last page represented by the cache.
 	// Since all of the pages in this block are going to the cache, and we
 	// searched for the first free page, we can confidently start at the
diff --git a/src/runtime/mpallocbits.go b/src/runtime/mpallocbits.go
index f63164b..2f35ce0 100644
--- a/src/runtime/mpallocbits.go
+++ b/src/runtime/mpallocbits.go
@@ -187,7 +187,7 @@
 		}
 
 		// Strategy: shrink all runs of zeros by max. If any runs of zero
-		// remain, then we've identified a larger maxiumum zero run.
+		// remain, then we've identified a larger maximum zero run.
 		p := max     // number of zeros we still need to shrink by.
 		k := uint(1) // current minimum length of runs of ones in x.
 		for {
diff --git a/src/runtime/mprof.go b/src/runtime/mprof.go
index 24f8889..308ebae 100644
--- a/src/runtime/mprof.go
+++ b/src/runtime/mprof.go
@@ -844,18 +844,13 @@
 	return goroutineProfileWithLabels(p, labels)
 }
 
-const go119ConcurrentGoroutineProfile = true
-
 // labels may be nil. If labels is non-nil, it must have the same length as p.
 func goroutineProfileWithLabels(p []StackRecord, labels []unsafe.Pointer) (n int, ok bool) {
 	if labels != nil && len(labels) != len(p) {
 		labels = nil
 	}
 
-	if go119ConcurrentGoroutineProfile {
-		return goroutineProfileWithLabelsConcurrent(p, labels)
-	}
-	return goroutineProfileWithLabelsSync(p, labels)
+	return goroutineProfileWithLabelsConcurrent(p, labels)
 }
 
 var goroutineProfile = struct {
@@ -906,7 +901,7 @@
 
 	ourg := getg()
 
-	stopTheWorld("profile")
+	stopTheWorld(stwGoroutineProfile)
 	// Using gcount while the world is stopped should give us a consistent view
 	// of the number of live goroutines, minus the number of goroutines that are
 	// alive and permanently marked as "system". But to make this count agree
@@ -971,7 +966,7 @@
 		tryRecordGoroutineProfile(gp1, Gosched)
 	})
 
-	stopTheWorld("profile cleanup")
+	stopTheWorld(stwGoroutineProfileCleanup)
 	endOffset := goroutineProfile.offset.Swap(0)
 	goroutineProfile.active = false
 	goroutineProfile.records = nil
@@ -1106,7 +1101,7 @@
 		return gp1 != gp && readgstatus(gp1) != _Gdead && !isSystemGoroutine(gp1, false)
 	}
 
-	stopTheWorld("profile")
+	stopTheWorld(stwGoroutineProfile)
 
 	// World is stopped, no locking required.
 	n = 1
@@ -1178,7 +1173,9 @@
 }
 
 func saveg(pc, sp uintptr, gp *g, r *StackRecord) {
-	n := gentraceback(pc, sp, 0, gp, 0, &r.Stack0[0], len(r.Stack0), nil, nil, 0)
+	var u unwinder
+	u.initAt(pc, sp, 0, gp, unwindSilentErrors)
+	n := tracebackPCs(&u, 0, r.Stack0[:])
 	if n < len(r.Stack0) {
 		r.Stack0[n] = 0
 	}
@@ -1190,7 +1187,7 @@
 // into buf after the trace for the current goroutine.
 func Stack(buf []byte, all bool) int {
 	if all {
-		stopTheWorld("stack trace")
+		stopTheWorld(stwAllGoroutinesStack)
 	}
 
 	n := 0
@@ -1233,7 +1230,7 @@
 	if typ == nil {
 		print("tracealloc(", p, ", ", hex(size), ")\n")
 	} else {
-		print("tracealloc(", p, ", ", hex(size), ", ", typ.string(), ")\n")
+		print("tracealloc(", p, ", ", hex(size), ", ", toRType(typ).string(), ")\n")
 	}
 	if gp.m.curg == nil || gp == gp.m.curg {
 		goroutineheader(gp)
diff --git a/src/runtime/mspanset.go b/src/runtime/mspanset.go
index abbd450..5520d6c 100644
--- a/src/runtime/mspanset.go
+++ b/src/runtime/mspanset.go
@@ -322,7 +322,7 @@
 	p.stack.push(&block.lfnode)
 }
 
-// haidTailIndex represents a combined 32-bit head and 32-bit tail
+// headTailIndex represents a combined 32-bit head and 32-bit tail
 // of a queue into a single 64-bit value.
 type headTailIndex uint64
 
diff --git a/src/runtime/mstats.go b/src/runtime/mstats.go
index 3a5273f..9cdc565 100644
--- a/src/runtime/mstats.go
+++ b/src/runtime/mstats.go
@@ -199,7 +199,17 @@
 	// StackSys is bytes of stack memory obtained from the OS.
 	//
 	// StackSys is StackInuse, plus any memory obtained directly
-	// from the OS for OS thread stacks (which should be minimal).
+	// from the OS for OS thread stacks.
+	//
+	// In non-cgo programs this metric is currently equal to StackInuse
+	// (but this should not be relied upon, and the value may change in
+	// the future).
+	//
+	// In cgo programs this metric includes OS thread stacks allocated
+	// directly from the OS. Currently, this only accounts for one stack in
+	// c-shared and c-archive build modes and other sources of stacks from
+	// the OS (notably, any allocated by C code) are not currently measured.
+	// Note this too may change in the future.
 	StackSys uint64
 
 	// Off-heap memory statistics.
@@ -347,7 +357,8 @@
 // which is a snapshot as of the most recently completed garbage
 // collection cycle.
 func ReadMemStats(m *MemStats) {
-	stopTheWorld("read mem stats")
+	_ = m.Alloc // nil check test before we switch stacks, see issue 61158
+	stopTheWorld(stwReadMemStats)
 
 	systemstack(func() {
 		readmemstats_m(m)
@@ -901,3 +912,58 @@
 
 	totalTime int64 // GOMAXPROCS * (monotonic wall clock time elapsed)
 }
+
+// accumulate takes a cpuStats and adds in the current state of all GC CPU
+// counters.
+//
+// gcMarkPhase indicates that we're in the mark phase and that certain counter
+// values should be used.
+func (s *cpuStats) accumulate(now int64, gcMarkPhase bool) {
+	// N.B. Mark termination and sweep termination pauses are
+	// accumulated in work.cpuStats at the end of their respective pauses.
+	var (
+		markAssistCpu     int64
+		markDedicatedCpu  int64
+		markFractionalCpu int64
+		markIdleCpu       int64
+	)
+	if gcMarkPhase {
+		// N.B. These stats may have stale values if the GC is not
+		// currently in the mark phase.
+		markAssistCpu = gcController.assistTime.Load()
+		markDedicatedCpu = gcController.dedicatedMarkTime.Load()
+		markFractionalCpu = gcController.fractionalMarkTime.Load()
+		markIdleCpu = gcController.idleMarkTime.Load()
+	}
+
+	// The rest of the stats below are either derived from the above or
+	// are reset on each mark termination.
+
+	scavAssistCpu := scavenge.assistTime.Load()
+	scavBgCpu := scavenge.backgroundTime.Load()
+
+	// Update cumulative GC CPU stats.
+	s.gcAssistTime += markAssistCpu
+	s.gcDedicatedTime += markDedicatedCpu + markFractionalCpu
+	s.gcIdleTime += markIdleCpu
+	s.gcTotalTime += markAssistCpu + markDedicatedCpu + markFractionalCpu + markIdleCpu
+
+	// Update cumulative scavenge CPU stats.
+	s.scavengeAssistTime += scavAssistCpu
+	s.scavengeBgTime += scavBgCpu
+	s.scavengeTotalTime += scavAssistCpu + scavBgCpu
+
+	// Update total CPU.
+	s.totalTime = sched.totaltime + (now-sched.procresizetime)*int64(gomaxprocs)
+	s.idleTime += sched.idleTime.Load()
+
+	// Compute userTime. We compute this indirectly as everything that's not the above.
+	//
+	// Since time spent in _Pgcstop is covered by gcPauseTime, and time spent in _Pidle
+	// is covered by idleTime, what we're left with is time spent in _Prunning and _Psyscall,
+	// the latter of which is fine because the P will either go idle or get used for something
+	// else via sysmon. Meanwhile if we subtract GC time from whatever's left, we get non-GC
+	// _Prunning time. Note that this still leaves time spent in sweeping and in the scheduler,
+	// but that's fine. The overwhelming majority of this time will be actual user time.
+	s.userTime = s.totalTime - (s.gcTotalTime + s.scavengeTotalTime + s.idleTime)
+}
diff --git a/src/runtime/mwbbuf.go b/src/runtime/mwbbuf.go
index 3b7cbf8..7419bd2 100644
--- a/src/runtime/mwbbuf.go
+++ b/src/runtime/mwbbuf.go
@@ -53,15 +53,13 @@
 	// be updated without write barriers.
 	end uintptr
 
-	// buf stores a series of pointers to execute write barriers
-	// on. This must be a multiple of wbBufEntryPointers because
-	// the write barrier only checks for overflow once per entry.
-	buf [wbBufEntryPointers * wbBufEntries]uintptr
+	// buf stores a series of pointers to execute write barriers on.
+	buf [wbBufEntries]uintptr
 }
 
 const (
-	// wbBufEntries is the number of write barriers between
-	// flushes of the write barrier buffer.
+	// wbBufEntries is the maximum number of pointers that can be
+	// stored in the write barrier buffer.
 	//
 	// This trades latency for throughput amortization. Higher
 	// values amortize flushing overhead more, but increase the
@@ -69,32 +67,27 @@
 	// footprint of the buffer.
 	//
 	// TODO: What is the latency cost of this? Tune this value.
-	wbBufEntries = 256
+	wbBufEntries = 512
 
-	// wbBufEntryPointers is the number of pointers added to the
-	// buffer by each write barrier.
-	wbBufEntryPointers = 2
+	// Maximum number of entries that we need to ask from the
+	// buffer in a single call.
+	wbMaxEntriesPerCall = 8
 )
 
 // reset empties b by resetting its next and end pointers.
 func (b *wbBuf) reset() {
 	start := uintptr(unsafe.Pointer(&b.buf[0]))
 	b.next = start
-	if writeBarrier.cgo {
-		// Effectively disable the buffer by forcing a flush
-		// on every barrier.
-		b.end = uintptr(unsafe.Pointer(&b.buf[wbBufEntryPointers]))
-	} else if testSmallBuf {
-		// For testing, allow two barriers in the buffer. If
-		// we only did one, then barriers of non-heap pointers
-		// would be no-ops. This lets us combine a buffered
-		// barrier with a flush at a later time.
-		b.end = uintptr(unsafe.Pointer(&b.buf[2*wbBufEntryPointers]))
+	if testSmallBuf {
+		// For testing, make the buffer smaller but more than
+		// 1 write barrier's worth, so it tests both the
+		// immediate flush and delayed flush cases.
+		b.end = uintptr(unsafe.Pointer(&b.buf[wbMaxEntriesPerCall+1]))
 	} else {
 		b.end = start + uintptr(len(b.buf))*unsafe.Sizeof(b.buf[0])
 	}
 
-	if (b.end-b.next)%(wbBufEntryPointers*unsafe.Sizeof(b.buf[0])) != 0 {
+	if (b.end-b.next)%unsafe.Sizeof(b.buf[0]) != 0 {
 		throw("bad write barrier buffer bounds")
 	}
 }
@@ -113,20 +106,14 @@
 	return b.next == uintptr(unsafe.Pointer(&b.buf[0]))
 }
 
-// putFast adds old and new to the write barrier buffer and returns
-// false if a flush is necessary. Callers should use this as:
+// getX returns space in the write barrier buffer to store X pointers.
+// getX will flush the buffer if necessary. Callers should use this as:
 //
 //	buf := &getg().m.p.ptr().wbBuf
-//	if !buf.putFast(old, new) {
-//	    wbBufFlush(...)
-//	}
+//	p := buf.get2()
+//	p[0], p[1] = old, new
 //	... actual memory write ...
 //
-// The arguments to wbBufFlush depend on whether the caller is doing
-// its own cgo pointer checks. If it is, then this can be
-// wbBufFlush(nil, 0). Otherwise, it must pass the slot address and
-// new.
-//
 // The caller must ensure there are no preemption points during the
 // above sequence. There must be no preemption points while buf is in
 // use because it is a per-P resource. There must be no preemption
@@ -134,24 +121,35 @@
 // could allow a GC phase change, which could result in missed write
 // barriers.
 //
-// putFast must be nowritebarrierrec to because write barriers here would
+// getX must be nowritebarrierrec to because write barriers here would
 // corrupt the write barrier buffer. It (and everything it calls, if
 // it called anything) has to be nosplit to avoid scheduling on to a
 // different P and a different buffer.
 //
 //go:nowritebarrierrec
 //go:nosplit
-func (b *wbBuf) putFast(old, new uintptr) bool {
+func (b *wbBuf) get1() *[1]uintptr {
+	if b.next+goarch.PtrSize > b.end {
+		wbBufFlush()
+	}
+	p := (*[1]uintptr)(unsafe.Pointer(b.next))
+	b.next += goarch.PtrSize
+	return p
+}
+
+//go:nowritebarrierrec
+//go:nosplit
+func (b *wbBuf) get2() *[2]uintptr {
+	if b.next+2*goarch.PtrSize > b.end {
+		wbBufFlush()
+	}
 	p := (*[2]uintptr)(unsafe.Pointer(b.next))
-	p[0] = old
-	p[1] = new
 	b.next += 2 * goarch.PtrSize
-	return b.next != b.end
+	return p
 }
 
 // wbBufFlush flushes the current P's write barrier buffer to the GC
-// workbufs. It is passed the slot and value of the write barrier that
-// caused the flush so that it can implement cgocheck.
+// workbufs.
 //
 // This must not have write barriers because it is part of the write
 // barrier implementation.
@@ -165,17 +163,10 @@
 //
 //go:nowritebarrierrec
 //go:nosplit
-func wbBufFlush(dst *uintptr, src uintptr) {
+func wbBufFlush() {
 	// Note: Every possible return from this function must reset
 	// the buffer's next pointer to prevent buffer overflow.
 
-	// This *must not* modify its arguments because this
-	// function's argument slots do double duty in gcWriteBarrier
-	// as register spill slots. Currently, not modifying the
-	// arguments is sufficient to keep the spill slots unmodified
-	// (which seems unlikely to change since it costs little and
-	// helps with debugging).
-
 	if getg().m.dying > 0 {
 		// We're going down. Not much point in write barriers
 		// and this way we can allow write barriers in the
@@ -184,19 +175,8 @@
 		return
 	}
 
-	if writeBarrier.cgo && dst != nil {
-		// This must be called from the stack that did the
-		// write. It's nosplit all the way down.
-		cgoCheckWriteBarrier(dst, src)
-		if !writeBarrier.needed {
-			// We were only called for cgocheck.
-			getg().m.p.ptr().wbBuf.discard()
-			return
-		}
-	}
-
 	// Switch to the system stack so we don't have to worry about
-	// the untyped stack slots or safe points.
+	// safe points.
 	systemstack(func() {
 		wbBufFlush1(getg().m.p.ptr())
 	})
diff --git a/src/runtime/nbpipe_fcntl_libc_test.go b/src/runtime/nbpipe_fcntl_libc_test.go
deleted file mode 100644
index 170245d..0000000
--- a/src/runtime/nbpipe_fcntl_libc_test.go
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2019 The Go 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:build aix || darwin || (openbsd && !mips64) || solaris
-
-package runtime_test
-
-import (
-	"runtime"
-	"syscall"
-)
-
-// Call fcntl libc function rather than calling syscall.
-func fcntl(fd uintptr, cmd int, arg uintptr) (uintptr, syscall.Errno) {
-	res, errno := runtime.Fcntl(fd, uintptr(cmd), arg)
-	return res, syscall.Errno(errno)
-}
diff --git a/src/runtime/nbpipe_fcntl_unix_test.go b/src/runtime/nbpipe_fcntl_unix_test.go
deleted file mode 100644
index b7252ea..0000000
--- a/src/runtime/nbpipe_fcntl_unix_test.go
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2019 The Go 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:build dragonfly || freebsd || linux || netbsd || (openbsd && mips64)
-
-package runtime_test
-
-import (
-	"internal/syscall/unix"
-	"syscall"
-)
-
-func fcntl(fd uintptr, cmd int, arg uintptr) (uintptr, syscall.Errno) {
-	res, _, err := syscall.Syscall(unix.FcntlSyscall, fd, uintptr(cmd), arg)
-	return res, err
-}
diff --git a/src/runtime/nbpipe_test.go b/src/runtime/nbpipe_test.go
index 0b0f64d..337b8e5 100644
--- a/src/runtime/nbpipe_test.go
+++ b/src/runtime/nbpipe_test.go
@@ -14,23 +14,29 @@
 )
 
 func TestNonblockingPipe(t *testing.T) {
-	t.Parallel()
-
 	// NonblockingPipe is the test name for nonblockingPipe.
 	r, w, errno := runtime.NonblockingPipe()
 	if errno != 0 {
 		t.Fatal(syscall.Errno(errno))
 	}
-	defer func() {
-		runtime.Close(r)
-		runtime.Close(w)
-	}()
+	defer runtime.Close(w)
 
 	checkIsPipe(t, r, w)
 	checkNonblocking(t, r, "reader")
 	checkCloseonexec(t, r, "reader")
 	checkNonblocking(t, w, "writer")
 	checkCloseonexec(t, w, "writer")
+
+	// Test that fcntl returns an error as expected.
+	if runtime.Close(r) != 0 {
+		t.Fatalf("Close(%d) failed", r)
+	}
+	val, errno := runtime.Fcntl(r, syscall.F_GETFD, 0)
+	if val != -1 {
+		t.Errorf("Fcntl succeeded unexpectedly")
+	} else if syscall.Errno(errno) != syscall.EBADF {
+		t.Errorf("Fcntl failed with error %v, expected %v", syscall.Errno(errno), syscall.EBADF)
+	}
 }
 
 func checkIsPipe(t *testing.T, r, w int32) {
@@ -49,8 +55,8 @@
 
 func checkNonblocking(t *testing.T, fd int32, name string) {
 	t.Helper()
-	flags, errno := fcntl(uintptr(fd), syscall.F_GETFL, 0)
-	if errno != 0 {
+	flags, errno := runtime.Fcntl(fd, syscall.F_GETFL, 0)
+	if flags == -1 {
 		t.Errorf("fcntl(%s, F_GETFL) failed: %v", name, syscall.Errno(errno))
 	} else if flags&syscall.O_NONBLOCK == 0 {
 		t.Errorf("O_NONBLOCK not set in %s flags %#x", name, flags)
@@ -59,8 +65,8 @@
 
 func checkCloseonexec(t *testing.T, fd int32, name string) {
 	t.Helper()
-	flags, errno := fcntl(uintptr(fd), syscall.F_GETFD, 0)
-	if errno != 0 {
+	flags, errno := runtime.Fcntl(fd, syscall.F_GETFD, 0)
+	if flags == -1 {
 		t.Errorf("fcntl(%s, F_GETFD) failed: %v", name, syscall.Errno(errno))
 	} else if flags&syscall.FD_CLOEXEC == 0 {
 		t.Errorf("FD_CLOEXEC not set in %s flags %#x", name, flags)
diff --git a/src/runtime/netpoll.go b/src/runtime/netpoll.go
index 5ac1f37..9b54e8e 100644
--- a/src/runtime/netpoll.go
+++ b/src/runtime/netpoll.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build unix || (js && wasm) || windows
+//go:build unix || (js && wasm) || wasip1 || windows
 
 package runtime
 
@@ -71,9 +71,10 @@
 //
 // No heap pointers.
 type pollDesc struct {
-	_    sys.NotInHeap
-	link *pollDesc // in pollcache, protected by pollcache.lock
-	fd   uintptr   // constant for pollDesc usage lifetime
+	_     sys.NotInHeap
+	link  *pollDesc      // in pollcache, protected by pollcache.lock
+	fd    uintptr        // constant for pollDesc usage lifetime
+	fdseq atomic.Uintptr // protects against stale pollDesc
 
 	// atomicInfo holds bits from closing, rd, and wd,
 	// which are only ever written while holding the lock,
@@ -120,6 +121,12 @@
 	pollEventErr
 	pollExpiredReadDeadline
 	pollExpiredWriteDeadline
+	pollFDSeq // 20 bit field, low 20 bits of fdseq field
+)
+
+const (
+	pollFDSeqBits = 20                   // number of bits in pollFDSeq
+	pollFDSeqMask = 1<<pollFDSeqBits - 1 // mask for pollFDSeq
 )
 
 func (i pollInfo) closing() bool              { return i&pollClosing != 0 }
@@ -150,6 +157,7 @@
 	if pd.wd < 0 {
 		info |= pollExpiredWriteDeadline
 	}
+	info |= uint32(pd.fdseq.Load()&pollFDSeqMask) << pollFDSeq
 
 	// Set all of x except the pollEventErr bit.
 	x := pd.atomicInfo.Load()
@@ -159,10 +167,21 @@
 }
 
 // setEventErr sets the result of pd.info().eventErr() to b.
-func (pd *pollDesc) setEventErr(b bool) {
+// We only change the error bit if seq == 0 or if seq matches pollFDSeq
+// (issue #59545).
+func (pd *pollDesc) setEventErr(b bool, seq uintptr) {
+	mSeq := uint32(seq & pollFDSeqMask)
 	x := pd.atomicInfo.Load()
+	xSeq := (x >> pollFDSeq) & pollFDSeqMask
+	if seq != 0 && xSeq != mSeq {
+		return
+	}
 	for (x&pollEventErr != 0) != b && !pd.atomicInfo.CompareAndSwap(x, x^pollEventErr) {
 		x = pd.atomicInfo.Load()
+		xSeq := (x >> pollFDSeq) & pollFDSeqMask
+		if seq != 0 && xSeq != mSeq {
+			return
+		}
 	}
 }
 
@@ -226,8 +245,12 @@
 		throw("runtime: blocked read on free polldesc")
 	}
 	pd.fd = fd
+	if pd.fdseq.Load() == 0 {
+		// The value 0 is special in setEventErr, so don't use it.
+		pd.fdseq.Store(1)
+	}
 	pd.closing = false
-	pd.setEventErr(false)
+	pd.setEventErr(false, 0)
 	pd.rseq++
 	pd.rg.Store(pdNil)
 	pd.rd = 0
@@ -264,6 +287,20 @@
 }
 
 func (c *pollCache) free(pd *pollDesc) {
+	// pd can't be shared here, but lock anyhow because
+	// that's what publishInfo documents.
+	lock(&pd.lock)
+
+	// Increment the fdseq field, so that any currently
+	// running netpoll calls will not mark pd as ready.
+	fdseq := pd.fdseq.Load()
+	fdseq = (fdseq + 1) & (1<<taggedPointerBits - 1)
+	pd.fdseq.Store(fdseq)
+
+	pd.publishInfo()
+
+	unlock(&pd.lock)
+
 	lock(&c.lock)
 	pd.link = c.first
 	c.first = pd
@@ -299,8 +336,8 @@
 	if errcode != pollNoError {
 		return errcode
 	}
-	// As for now only Solaris, illumos, and AIX use level-triggered IO.
-	if GOOS == "solaris" || GOOS == "illumos" || GOOS == "aix" {
+	// As for now only Solaris, illumos, AIX and wasip1 use level-triggered IO.
+	if GOOS == "solaris" || GOOS == "illumos" || GOOS == "aix" || GOOS == "wasip1" {
 		netpollarm(pd, mode)
 	}
 	for !netpollblock(pd, int32(mode), false) {
@@ -524,7 +561,7 @@
 	// this is necessary because runtime_pollUnblock/runtime_pollSetDeadline/deadlineimpl
 	// do the opposite: store to closing/rd/wd, publishInfo, load of rg/wg
 	if waitio || netpollcheckerr(pd, mode) == pollNoError {
-		gopark(netpollblockcommit, unsafe.Pointer(gpp), waitReasonIOWait, traceEvGoBlockNet, 5)
+		gopark(netpollblockcommit, unsafe.Pointer(gpp), waitReasonIOWait, traceBlockNet, 5)
 	}
 	// be careful to not lose concurrent pdReady notification
 	old := gpp.Swap(pdNil)
diff --git a/src/runtime/netpoll_aix.go b/src/runtime/netpoll_aix.go
index 5184aad..fad976b 100644
--- a/src/runtime/netpoll_aix.go
+++ b/src/runtime/netpoll_aix.go
@@ -88,6 +88,9 @@
 	lock(&mtxset)
 	unlock(&mtxpoll)
 
+	// We don't worry about pd.fdseq here,
+	// as mtxset protects us from stale pollDescs.
+
 	pd.user = uint32(len(pfds))
 	pfds = append(pfds, pollfd{fd: int32(fd)})
 	pds = append(pds, pd)
@@ -216,7 +219,7 @@
 			pfd.events &= ^_POLLOUT
 		}
 		if mode != 0 {
-			pds[i].setEventErr(pfd.revents == _POLLERR)
+			pds[i].setEventErr(pfd.revents == _POLLERR, 0)
 			netpollready(&toRun, pds[i], mode)
 			n--
 		}
diff --git a/src/runtime/netpoll_epoll.go b/src/runtime/netpoll_epoll.go
index 7164a59..e29b64d 100644
--- a/src/runtime/netpoll_epoll.go
+++ b/src/runtime/netpoll_epoll.go
@@ -52,7 +52,8 @@
 func netpollopen(fd uintptr, pd *pollDesc) uintptr {
 	var ev syscall.EpollEvent
 	ev.Events = syscall.EPOLLIN | syscall.EPOLLOUT | syscall.EPOLLRDHUP | syscall.EPOLLET
-	*(**pollDesc)(unsafe.Pointer(&ev.Data)) = pd
+	tp := taggedPointerPack(unsafe.Pointer(pd), pd.fdseq.Load())
+	*(*taggedPointer)(unsafe.Pointer(&ev.Data)) = tp
 	return syscall.EpollCtl(epfd, syscall.EPOLL_CTL_ADD, int32(fd), &ev)
 }
 
@@ -158,9 +159,13 @@
 			mode += 'w'
 		}
 		if mode != 0 {
-			pd := *(**pollDesc)(unsafe.Pointer(&ev.Data))
-			pd.setEventErr(ev.Events == syscall.EPOLLERR)
-			netpollready(&toRun, pd, mode)
+			tp := *(*taggedPointer)(unsafe.Pointer(&ev.Data))
+			pd := (*pollDesc)(tp.pointer())
+			tag := tp.tag()
+			if pd.fdseq.Load() == tag {
+				pd.setEventErr(ev.Events == syscall.EPOLLERR, tag)
+				netpollready(&toRun, pd, mode)
+			}
 		}
 	}
 	return toRun
diff --git a/src/runtime/netpoll_fake.go b/src/runtime/netpoll_fake.go
index de1dcae..5319561 100644
--- a/src/runtime/netpoll_fake.go
+++ b/src/runtime/netpoll_fake.go
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// Fake network poller for wasm/js.
-// Should never be used, because wasm/js network connections do not honor "SetNonblock".
+// Fake network poller for js/wasm.
+// Should never be used, because js/wasm network connections do not honor "SetNonblock".
 
 //go:build js && wasm
 
diff --git a/src/runtime/netpoll_kqueue.go b/src/runtime/netpoll_kqueue.go
index 5ae77b5..3af45e6 100644
--- a/src/runtime/netpoll_kqueue.go
+++ b/src/runtime/netpoll_kqueue.go
@@ -9,6 +9,7 @@
 // Integrated network poller (kqueue-based implementation).
 
 import (
+	"internal/goarch"
 	"runtime/internal/atomic"
 	"unsafe"
 )
@@ -61,7 +62,17 @@
 	ev[0].flags = _EV_ADD | _EV_CLEAR
 	ev[0].fflags = 0
 	ev[0].data = 0
-	ev[0].udata = (*byte)(unsafe.Pointer(pd))
+
+	if goarch.PtrSize == 4 {
+		// We only have a pointer-sized field to store into,
+		// so on a 32-bit system we get no sequence protection.
+		// TODO(iant): If we notice any problems we could at least
+		// steal the low-order 2 bits for a tiny sequence number.
+		ev[0].udata = (*byte)(unsafe.Pointer(pd))
+	} else {
+		tp := taggedPointerPack(unsafe.Pointer(pd), pd.fdseq.Load())
+		ev[0].udata = (*byte)(unsafe.Pointer(uintptr(tp)))
+	}
 	ev[1] = ev[0]
 	ev[1].filter = _EVFILT_WRITE
 	n := kevent(kq, &ev[0], 2, nil, 0, nil)
@@ -181,8 +192,22 @@
 			mode += 'w'
 		}
 		if mode != 0 {
-			pd := (*pollDesc)(unsafe.Pointer(ev.udata))
-			pd.setEventErr(ev.flags == _EV_ERROR)
+			var pd *pollDesc
+			var tag uintptr
+			if goarch.PtrSize == 4 {
+				// No sequence protection on 32-bit systems.
+				// See netpollopen for details.
+				pd = (*pollDesc)(unsafe.Pointer(ev.udata))
+				tag = 0
+			} else {
+				tp := taggedPointer(uintptr(unsafe.Pointer(ev.udata)))
+				pd = (*pollDesc)(tp.pointer())
+				tag = tp.tag()
+				if pd.fdseq.Load() != tag {
+					continue
+				}
+			}
+			pd.setEventErr(ev.flags == _EV_ERROR, tag)
 			netpollready(&toRun, pd, mode)
 		}
 	}
diff --git a/src/runtime/netpoll_solaris.go b/src/runtime/netpoll_solaris.go
index d835cd9..13c7ffc 100644
--- a/src/runtime/netpoll_solaris.go
+++ b/src/runtime/netpoll_solaris.go
@@ -5,6 +5,7 @@
 package runtime
 
 import (
+	"internal/goarch"
 	"runtime/internal/atomic"
 	"unsafe"
 )
@@ -95,10 +96,6 @@
 	return *getg().m.perrno
 }
 
-func fcntl(fd, cmd, arg int32) int32 {
-	return int32(sysvicall3(&libc_fcntl, uintptr(fd), uintptr(cmd), uintptr(arg)))
-}
-
 func port_create() int32 {
 	return int32(sysvicall0(&libc_port_create))
 }
@@ -124,7 +121,7 @@
 func netpollinit() {
 	portfd = port_create()
 	if portfd >= 0 {
-		fcntl(portfd, _F_SETFD, _FD_CLOEXEC)
+		closeonexec(portfd)
 		return
 	}
 
@@ -145,7 +142,14 @@
 	// with the interested event set) will unblock port_getn right away
 	// because of the I/O readiness notification.
 	pd.user = 0
-	r := port_associate(portfd, _PORT_SOURCE_FD, fd, 0, uintptr(unsafe.Pointer(pd)))
+	tp := taggedPointerPack(unsafe.Pointer(pd), pd.fdseq.Load())
+	// Note that this won't work on a 32-bit system,
+	// as taggedPointer is always 64-bits but uintptr will be 32 bits.
+	// Fortunately we only support Solaris on amd64.
+	if goarch.PtrSize != 8 {
+		throw("runtime: netpollopen: unsupported pointer size")
+	}
+	r := port_associate(portfd, _PORT_SOURCE_FD, fd, 0, uintptr(tp))
 	unlock(&pd.lock)
 	return r
 }
@@ -168,7 +172,8 @@
 		return
 	}
 
-	if events != 0 && port_associate(portfd, _PORT_SOURCE_FD, pd.fd, events, uintptr(unsafe.Pointer(pd))) != 0 {
+	tp := taggedPointerPack(unsafe.Pointer(pd), pd.fdseq.Load())
+	if events != 0 && port_associate(portfd, _PORT_SOURCE_FD, pd.fd, events, uintptr(tp)) != 0 {
 		print("runtime: port_associate failed (errno=", errno(), ")\n")
 		throw("runtime: netpollupdate failed")
 	}
@@ -285,7 +290,12 @@
 		if ev.portev_events == 0 {
 			continue
 		}
-		pd := (*pollDesc)(unsafe.Pointer(ev.portev_user))
+
+		tp := taggedPointer(uintptr(unsafe.Pointer(ev.portev_user)))
+		pd := (*pollDesc)(tp.pointer())
+		if pd.fdseq.Load() != tp.tag() {
+			continue
+		}
 
 		var mode, clear int32
 		if (ev.portev_events & (_POLLIN | _POLLHUP | _POLLERR)) != 0 {
diff --git a/src/runtime/netpoll_wasip1.go b/src/runtime/netpoll_wasip1.go
new file mode 100644
index 0000000..677287b
--- /dev/null
+++ b/src/runtime/netpoll_wasip1.go
@@ -0,0 +1,254 @@
+// Copyright 2023 The Go 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:build wasip1
+
+package runtime
+
+import "unsafe"
+
+// WASI network poller.
+//
+// WASI preview 1 includes a poll_oneoff host function that behaves similarly
+// to poll(2) on Linux. Like poll(2), poll_oneoff is level triggered. It
+// accepts one or more subscriptions to FD read or write events.
+//
+// Major differences to poll(2):
+// - the events are not written to the input entries (like pollfd.revents), and
+//   instead are appended to a separate events buffer. poll_oneoff writes zero
+//   or more events to the buffer (at most one per input subscription) and
+//   returns the number of events written. Although the index of the
+//   subscriptions might not match the index of the associated event in the
+//   events buffer, both the subscription and event structs contain a userdata
+//   field and when a subscription yields an event the userdata fields will
+//   match.
+// - there's no explicit timeout parameter, although a time limit can be added
+//   by using "clock" subscriptions.
+// - each FD subscription can either be for a read or a write, but not both.
+//   This is in contrast to poll(2) which accepts a mask with POLLIN and
+//   POLLOUT bits, allowing for a subscription to either, neither, or both
+//   reads and writes.
+//
+// Since poll_oneoff is similar to poll(2), the implementation here was derived
+// from netpoll_aix.go.
+
+const _EINTR = 27
+
+var (
+	evts []event
+	subs []subscription
+	pds  []*pollDesc
+	mtx  mutex
+)
+
+func netpollinit() {
+	// Unlike poll(2), WASI's poll_oneoff doesn't accept a timeout directly. To
+	// prevent it from blocking indefinitely, a clock subscription with a
+	// timeout field needs to be submitted. Reserve a slot here for the clock
+	// subscription, and set fields that won't change between poll_oneoff calls.
+
+	subs = make([]subscription, 1, 128)
+	evts = make([]event, 0, 128)
+	pds = make([]*pollDesc, 0, 128)
+
+	timeout := &subs[0]
+	eventtype := timeout.u.eventtype()
+	*eventtype = eventtypeClock
+	clock := timeout.u.subscriptionClock()
+	clock.id = clockMonotonic
+	clock.precision = 1e3
+}
+
+func netpollIsPollDescriptor(fd uintptr) bool {
+	return false
+}
+
+func netpollopen(fd uintptr, pd *pollDesc) int32 {
+	lock(&mtx)
+
+	// We don't worry about pd.fdseq here,
+	// as mtx protects us from stale pollDescs.
+
+	pds = append(pds, pd)
+
+	// The 32-bit pd.user field holds the index of the read subscription in the
+	// upper 16 bits, and index of the write subscription in the lower bits.
+	// A disarmed=^uint16(0) sentinel is used to represent no subscription.
+	// There is thus a maximum of 65535 total subscriptions.
+	pd.user = uint32(disarmed)<<16 | uint32(disarmed)
+
+	unlock(&mtx)
+	return 0
+}
+
+const disarmed = 0xFFFF
+
+func netpollarm(pd *pollDesc, mode int) {
+	lock(&mtx)
+
+	var s subscription
+
+	s.userdata = userdata(uintptr(unsafe.Pointer(pd)))
+
+	fdReadwrite := s.u.subscriptionFdReadwrite()
+	fdReadwrite.fd = int32(pd.fd)
+
+	ridx := int(pd.user >> 16)
+	widx := int(pd.user & 0xFFFF)
+
+	if (mode == 'r' && ridx != disarmed) || (mode == 'w' && widx != disarmed) {
+		unlock(&mtx)
+		return
+	}
+
+	eventtype := s.u.eventtype()
+	switch mode {
+	case 'r':
+		*eventtype = eventtypeFdRead
+		ridx = len(subs)
+	case 'w':
+		*eventtype = eventtypeFdWrite
+		widx = len(subs)
+	}
+
+	if len(subs) == disarmed {
+		throw("overflow")
+	}
+
+	pd.user = uint32(ridx)<<16 | uint32(widx)
+
+	subs = append(subs, s)
+	evts = append(evts, event{})
+
+	unlock(&mtx)
+}
+
+func netpolldisarm(pd *pollDesc, mode int32) {
+	switch mode {
+	case 'r':
+		removesub(int(pd.user >> 16))
+	case 'w':
+		removesub(int(pd.user & 0xFFFF))
+	case 'r' + 'w':
+		removesub(int(pd.user >> 16))
+		removesub(int(pd.user & 0xFFFF))
+	}
+}
+
+func removesub(i int) {
+	if i == disarmed {
+		return
+	}
+	j := len(subs) - 1
+
+	pdi := (*pollDesc)(unsafe.Pointer(uintptr(subs[i].userdata)))
+	pdj := (*pollDesc)(unsafe.Pointer(uintptr(subs[j].userdata)))
+
+	swapsub(pdi, i, disarmed)
+	swapsub(pdj, j, i)
+
+	subs = subs[:j]
+}
+
+func swapsub(pd *pollDesc, from, to int) {
+	if from == to {
+		return
+	}
+	ridx := int(pd.user >> 16)
+	widx := int(pd.user & 0xFFFF)
+	if ridx == from {
+		ridx = to
+	} else if widx == from {
+		widx = to
+	}
+	pd.user = uint32(ridx)<<16 | uint32(widx)
+	if to != disarmed {
+		subs[to], subs[from] = subs[from], subs[to]
+	}
+}
+
+func netpollclose(fd uintptr) int32 {
+	lock(&mtx)
+	for i := 0; i < len(pds); i++ {
+		if pds[i].fd == fd {
+			netpolldisarm(pds[i], 'r'+'w')
+			pds[i] = pds[len(pds)-1]
+			pds = pds[:len(pds)-1]
+			break
+		}
+	}
+	unlock(&mtx)
+	return 0
+}
+
+func netpollBreak() {}
+
+func netpoll(delay int64) gList {
+	lock(&mtx)
+
+	// If delay >= 0, we include a subscription of type Clock that we use as
+	// a timeout. If delay < 0, we omit the subscription and allow poll_oneoff
+	// to block indefinitely.
+	pollsubs := subs
+	if delay >= 0 {
+		timeout := &subs[0]
+		clock := timeout.u.subscriptionClock()
+		clock.timeout = uint64(delay)
+	} else {
+		pollsubs = subs[1:]
+	}
+
+	if len(pollsubs) == 0 {
+		unlock(&mtx)
+		return gList{}
+	}
+
+	evts = evts[:len(pollsubs)]
+	for i := range evts {
+		evts[i] = event{}
+	}
+
+retry:
+	var nevents size
+	errno := poll_oneoff(unsafe.Pointer(&pollsubs[0]), unsafe.Pointer(&evts[0]), uint32(len(pollsubs)), unsafe.Pointer(&nevents))
+	if errno != 0 {
+		if errno != _EINTR {
+			println("errno=", errno, " len(pollsubs)=", len(pollsubs))
+			throw("poll_oneoff failed")
+		}
+		// If a timed sleep was interrupted, just return to
+		// recalculate how long we should sleep now.
+		if delay > 0 {
+			unlock(&mtx)
+			return gList{}
+		}
+		goto retry
+	}
+
+	var toRun gList
+	for i := 0; i < int(nevents); i++ {
+		e := &evts[i]
+		if e.typ == eventtypeClock {
+			continue
+		}
+
+		hangup := e.fdReadwrite.flags&fdReadwriteHangup != 0
+		var mode int32
+		if e.typ == eventtypeFdRead || e.error != 0 || hangup {
+			mode += 'r'
+		}
+		if e.typ == eventtypeFdWrite || e.error != 0 || hangup {
+			mode += 'w'
+		}
+		if mode != 0 {
+			pd := (*pollDesc)(unsafe.Pointer(uintptr(e.userdata)))
+			netpolldisarm(pd, mode)
+			pd.setEventErr(e.error != 0, 0)
+			netpollready(&toRun, pd, mode)
+		}
+	}
+
+	unlock(&mtx)
+	return toRun
+}
diff --git a/src/runtime/netpoll_windows.go b/src/runtime/netpoll_windows.go
index 796bf1d..bb77d8d 100644
--- a/src/runtime/netpoll_windows.go
+++ b/src/runtime/netpoll_windows.go
@@ -26,7 +26,7 @@
 }
 
 type overlappedEntry struct {
-	key      uintptr
+	key      *pollDesc
 	op       *net_op // In reality it's *overlapped, but we cast it to *net_op anyway.
 	internal uintptr
 	qty      uint32
@@ -51,7 +51,8 @@
 }
 
 func netpollopen(fd uintptr, pd *pollDesc) int32 {
-	if stdcall4(_CreateIoCompletionPort, fd, iocphandle, 0, 0) == 0 {
+	// TODO(iant): Consider using taggedPointer on 64-bit systems.
+	if stdcall4(_CreateIoCompletionPort, fd, iocphandle, uintptr(unsafe.Pointer(pd)), 0) == 0 {
 		return int32(getlasterror())
 	}
 	return 0
@@ -128,7 +129,7 @@
 	mp.blocked = false
 	for i = 0; i < n; i++ {
 		op = entries[i].op
-		if op != nil {
+		if op != nil && op.pd == entries[i].key {
 			errno = 0
 			qty = 0
 			if stdcall5(_WSAGetOverlappedResult, op.pd.fd, uintptr(unsafe.Pointer(op)), uintptr(unsafe.Pointer(&qty)), 0, uintptr(unsafe.Pointer(&flags))) == 0 {
diff --git a/src/runtime/nonwindows_stub.go b/src/runtime/nonwindows_stub.go
new file mode 100644
index 0000000..033f026
--- /dev/null
+++ b/src/runtime/nonwindows_stub.go
@@ -0,0 +1,21 @@
+// Copyright 2017 The Go 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:build !windows
+
+package runtime
+
+// osRelaxMinNS is the number of nanoseconds of idleness to tolerate
+// without performing an osRelax. Since osRelax may reduce the
+// precision of timers, this should be enough larger than the relaxed
+// timer precision to keep the timer error acceptable.
+const osRelaxMinNS = 0
+
+// osRelax is called by the scheduler when transitioning to and from
+// all Ps being idle.
+func osRelax(relax bool) {}
+
+// enableWER is called by setTraceback("wer").
+// Windows Error Reporting (WER) is only supported on Windows.
+func enableWER() {}
diff --git a/src/runtime/os2_aix.go b/src/runtime/os2_aix.go
index 2efc565..8af88d1 100644
--- a/src/runtime/os2_aix.go
+++ b/src/runtime/os2_aix.go
@@ -31,7 +31,7 @@
 //go:cgo_import_dynamic libc__Errno _Errno "libc.a/shr_64.o"
 //go:cgo_import_dynamic libc_clock_gettime clock_gettime "libc.a/shr_64.o"
 //go:cgo_import_dynamic libc_close close "libc.a/shr_64.o"
-//go:cgo_import_dynamic libc_exit exit "libc.a/shr_64.o"
+//go:cgo_import_dynamic libc_exit _exit "libc.a/shr_64.o"
 //go:cgo_import_dynamic libc_getpid getpid "libc.a/shr_64.o"
 //go:cgo_import_dynamic libc_getsystemcfg getsystemcfg "libc.a/shr_64.o"
 //go:cgo_import_dynamic libc_kill kill "libc.a/shr_64.o"
@@ -55,6 +55,10 @@
 //go:cgo_import_dynamic libc_sysconf sysconf "libc.a/shr_64.o"
 //go:cgo_import_dynamic libc_usleep usleep "libc.a/shr_64.o"
 //go:cgo_import_dynamic libc_write write "libc.a/shr_64.o"
+//go:cgo_import_dynamic libc_getuid getuid "libc.a/shr_64.o"
+//go:cgo_import_dynamic libc_geteuid geteuid "libc.a/shr_64.o"
+//go:cgo_import_dynamic libc_getgid getgid "libc.a/shr_64.o"
+//go:cgo_import_dynamic libc_getegid getegid "libc.a/shr_64.o"
 
 //go:cgo_import_dynamic libpthread___pth_init __pth_init "libpthread.a/shr_xpg5_64.o"
 //go:cgo_import_dynamic libpthread_attr_destroy pthread_attr_destroy "libpthread.a/shr_xpg5_64.o"
@@ -95,6 +99,10 @@
 //go:linkname libc_sysconf libc_sysconf
 //go:linkname libc_usleep libc_usleep
 //go:linkname libc_write libc_write
+//go:linkname libc_getuid libc_getuid
+//go:linkname libc_geteuid libc_geteuid
+//go:linkname libc_getgid libc_getgid
+//go:linkname libc_getegid libc_getegid
 
 //go:linkname libpthread___pth_init libpthread___pth_init
 //go:linkname libpthread_attr_destroy libpthread_attr_destroy
@@ -137,6 +145,10 @@
 	libc_sysconf,
 	libc_usleep,
 	libc_write,
+	libc_getuid,
+	libc_geteuid,
+	libc_getgid,
+	libc_getegid,
 	//libpthread
 	libpthread___pth_init,
 	libpthread_attr_destroy,
diff --git a/src/runtime/os3_solaris.go b/src/runtime/os3_solaris.go
index ffac4b6..046d173 100644
--- a/src/runtime/os3_solaris.go
+++ b/src/runtime/os3_solaris.go
@@ -17,7 +17,7 @@
 
 //go:cgo_import_dynamic libc____errno ___errno "libc.so"
 //go:cgo_import_dynamic libc_clock_gettime clock_gettime "libc.so"
-//go:cgo_import_dynamic libc_exit exit "libc.so"
+//go:cgo_import_dynamic libc_exit _exit "libc.so"
 //go:cgo_import_dynamic libc_getcontext getcontext "libc.so"
 //go:cgo_import_dynamic libc_kill kill "libc.so"
 //go:cgo_import_dynamic libc_madvise madvise "libc.so"
@@ -570,8 +570,9 @@
 }
 
 //go:nosplit
-func closeonexec(fd int32) {
-	fcntl(fd, _F_SETFD, _FD_CLOEXEC)
+func fcntl(fd, cmd, arg int32) (ret int32, errno int32) {
+	r1, err := sysvicall3Err(&libc_fcntl, uintptr(fd), uintptr(cmd), uintptr(arg))
+	return int32(r1), int32(err)
 }
 
 func osyield1()
@@ -601,8 +602,9 @@
 	n++
 
 	// now argv+n is auxv
-	auxv := (*[1 << 28]uintptr)(add(unsafe.Pointer(argv), uintptr(n)*goarch.PtrSize))
-	sysauxv(auxv[:])
+	auxvp := (*[1 << 28]uintptr)(add(unsafe.Pointer(argv), uintptr(n)*goarch.PtrSize))
+	pairs := sysauxv(auxvp[:])
+	auxv = auxvp[: pairs*2 : pairs*2]
 }
 
 const (
@@ -611,8 +613,9 @@
 	_AT_SUN_EXECNAME = 2014 // exec() path name
 )
 
-func sysauxv(auxv []uintptr) {
-	for i := 0; auxv[i] != _AT_NULL; i += 2 {
+func sysauxv(auxv []uintptr) (pairs int) {
+	var i int
+	for i = 0; auxv[i] != _AT_NULL; i += 2 {
 		tag, val := auxv[i], auxv[i+1]
 		switch tag {
 		case _AT_PAGESZ:
@@ -621,6 +624,7 @@
 			executablePath = gostringnocopy((*byte)(unsafe.Pointer(val)))
 		}
 	}
+	return i / 2
 }
 
 // sigPerThreadSyscall is only used on linux, so we assign a bogus signal
diff --git a/src/runtime/os_aix.go b/src/runtime/os_aix.go
index e07c7f1..0583e9a 100644
--- a/src/runtime/os_aix.go
+++ b/src/runtime/os_aix.go
@@ -352,20 +352,17 @@
 }
 
 //go:nosplit
-func fcntl(fd, cmd, arg int32) int32 {
-	r, _ := syscall3(&libc_fcntl, uintptr(fd), uintptr(cmd), uintptr(arg))
-	return int32(r)
-}
-
-//go:nosplit
-func closeonexec(fd int32) {
-	fcntl(fd, _F_SETFD, _FD_CLOEXEC)
+func fcntl(fd, cmd, arg int32) (int32, int32) {
+	r, errno := syscall3(&libc_fcntl, uintptr(fd), uintptr(cmd), uintptr(arg))
+	return int32(r), int32(errno)
 }
 
 //go:nosplit
 func setNonblock(fd int32) {
-	flags := fcntl(fd, _F_GETFL, 0)
-	fcntl(fd, _F_SETFL, flags|_O_NONBLOCK)
+	flags, _ := fcntl(fd, _F_GETFL, 0)
+	if flags != -1 {
+		fcntl(fd, _F_SETFL, flags|_O_NONBLOCK)
+	}
 }
 
 // sigPerThreadSyscall is only used on linux, so we assign a bogus signal
@@ -376,3 +373,43 @@
 func runPerThreadSyscall() {
 	throw("runPerThreadSyscall only valid on linux")
 }
+
+//go:nosplit
+func getuid() int32 {
+	r, errno := syscall0(&libc_getuid)
+	if errno != 0 {
+		print("getuid failed ", errno)
+		throw("getuid")
+	}
+	return int32(r)
+}
+
+//go:nosplit
+func geteuid() int32 {
+	r, errno := syscall0(&libc_geteuid)
+	if errno != 0 {
+		print("geteuid failed ", errno)
+		throw("geteuid")
+	}
+	return int32(r)
+}
+
+//go:nosplit
+func getgid() int32 {
+	r, errno := syscall0(&libc_getgid)
+	if errno != 0 {
+		print("getgid failed ", errno)
+		throw("getgid")
+	}
+	return int32(r)
+}
+
+//go:nosplit
+func getegid() int32 {
+	r, errno := syscall0(&libc_getegid)
+	if errno != 0 {
+		print("getegid failed ", errno)
+		throw("getegid")
+	}
+	return int32(r)
+}
diff --git a/src/runtime/os_darwin.go b/src/runtime/os_darwin.go
index c4f3bb6..105de47 100644
--- a/src/runtime/os_darwin.go
+++ b/src/runtime/os_darwin.go
@@ -81,7 +81,7 @@
 // The read and write file descriptors used by the sigNote functions.
 var sigNoteRead, sigNoteWrite int32
 
-// sigNoteSetup initializes an async-signal-safe note.
+// sigNoteSetup initializes a single, there-can-only-be-one, async-signal-safe note.
 //
 // The current implementation of notes on Darwin is not async-signal-safe,
 // because the functions pthread_mutex_lock, pthread_cond_signal, and
@@ -93,6 +93,7 @@
 // not support timed waits but is async-signal-safe.
 func sigNoteSetup(*note) {
 	if sigNoteRead != 0 || sigNoteWrite != 0 {
+		// Generalizing this would require avoiding the pipe-fork-closeonexec race, which entangles syscall.
 		throw("duplicate sigNoteSetup")
 	}
 	var errno int32
diff --git a/src/runtime/os_dragonfly.go b/src/runtime/os_dragonfly.go
index e467578..8268c7f 100644
--- a/src/runtime/os_dragonfly.go
+++ b/src/runtime/os_dragonfly.go
@@ -63,7 +63,9 @@
 func kevent(kq int32, ch *keventt, nch int32, ev *keventt, nev int32, ts *timespec) int32
 
 func pipe2(flags int32) (r, w int32, errno int32)
-func closeonexec(fd int32)
+func fcntl(fd, cmd, arg int32) (ret int32, errno int32)
+
+func issetugid() int32
 
 // From DragonFly's <sys/sysctl.h>
 const (
@@ -296,8 +298,9 @@
 	// skip NULL separator
 	n++
 
-	auxv := (*[1 << 28]uintptr)(add(unsafe.Pointer(argv), uintptr(n)*goarch.PtrSize))
-	sysauxv(auxv[:])
+	auxvp := (*[1 << 28]uintptr)(add(unsafe.Pointer(argv), uintptr(n)*goarch.PtrSize))
+	pairs := sysauxv(auxvp[:])
+	auxv = auxvp[: pairs*2 : pairs*2]
 }
 
 const (
@@ -305,14 +308,16 @@
 	_AT_PAGESZ = 6
 )
 
-func sysauxv(auxv []uintptr) {
-	for i := 0; auxv[i] != _AT_NULL; i += 2 {
+func sysauxv(auxv []uintptr) (pairs int) {
+	var i int
+	for i = 0; auxv[i] != _AT_NULL; i += 2 {
 		tag, val := auxv[i], auxv[i+1]
 		switch tag {
 		case _AT_PAGESZ:
 			physPageSize = val
 		}
 	}
+	return i / 2
 }
 
 // raise sends a signal to the calling thread.
diff --git a/src/runtime/os_freebsd.go b/src/runtime/os_freebsd.go
index f53cb11..3af234e 100644
--- a/src/runtime/os_freebsd.go
+++ b/src/runtime/os_freebsd.go
@@ -48,7 +48,9 @@
 func kevent(kq int32, ch *keventt, nch int32, ev *keventt, nev int32, ts *timespec) int32
 
 func pipe2(flags int32) (r, w int32, errno int32)
-func closeonexec(fd int32)
+func fcntl(fd, cmd, arg int32) (ret int32, errno int32)
+
+func issetugid() int32
 
 // From FreeBSD's <sys/sysctl.h>
 const (
@@ -409,8 +411,9 @@
 	n++
 
 	// now argv+n is auxv
-	auxv := (*[1 << 28]uintptr)(add(unsafe.Pointer(argv), uintptr(n)*goarch.PtrSize))
-	sysauxv(auxv[:])
+	auxvp := (*[1 << 28]uintptr)(add(unsafe.Pointer(argv), uintptr(n)*goarch.PtrSize))
+	pairs := sysauxv(auxvp[:])
+	auxv = auxvp[: pairs*2 : pairs*2]
 }
 
 const (
@@ -421,8 +424,9 @@
 	_AT_HWCAP2   = 26 // CPU feature flags 2
 )
 
-func sysauxv(auxv []uintptr) {
-	for i := 0; auxv[i] != _AT_NULL; i += 2 {
+func sysauxv(auxv []uintptr) (pairs int) {
+	var i int
+	for i = 0; auxv[i] != _AT_NULL; i += 2 {
 		tag, val := auxv[i], auxv[i+1]
 		switch tag {
 		// _AT_NCPUS from auxv shouldn't be used due to golang.org/issue/15206
@@ -434,6 +438,7 @@
 
 		archauxv(tag, val)
 	}
+	return i / 2
 }
 
 // sysSigaction calls the sigaction system call.
diff --git a/src/runtime/os_js.go b/src/runtime/os_js.go
index 7481fb9..65fb499 100644
--- a/src/runtime/os_js.go
+++ b/src/runtime/os_js.go
@@ -7,7 +7,6 @@
 package runtime
 
 import (
-	"runtime/internal/atomic"
 	"unsafe"
 )
 
@@ -21,147 +20,18 @@
 	return n
 }
 
-// Stubs so tests can link correctly. These should never be called.
-func open(name *byte, mode, perm int32) int32        { panic("not implemented") }
-func closefd(fd int32) int32                         { panic("not implemented") }
-func read(fd int32, p unsafe.Pointer, n int32) int32 { panic("not implemented") }
-
+//go:wasmimport gojs runtime.wasmWrite
 //go:noescape
 func wasmWrite(fd uintptr, p unsafe.Pointer, n int32)
 
-func usleep(usec uint32)
-
-//go:nosplit
-func usleep_no_g(usec uint32) {
-	usleep(usec)
+func usleep(usec uint32) {
+	// TODO(neelance): implement usleep
 }
 
-func exitThread(wait *atomic.Uint32)
-
-type mOS struct{}
-
-func osyield()
-
-//go:nosplit
-func osyield_no_g() {
-	osyield()
-}
-
-const _SIGSEGV = 0xb
-
-func sigpanic() {
-	gp := getg()
-	if !canpanic() {
-		throw("unexpected signal during runtime execution")
-	}
-
-	// js only invokes the exception handler for memory faults.
-	gp.sig = _SIGSEGV
-	panicmem()
-}
-
-type sigset struct{}
-
-// Called to initialize a new m (including the bootstrap m).
-// Called on the parent thread (main thread in case of bootstrap), can allocate memory.
-func mpreinit(mp *m) {
-	mp.gsignal = malg(32 * 1024)
-	mp.gsignal.m = mp
-}
-
-//go:nosplit
-func sigsave(p *sigset) {
-}
-
-//go:nosplit
-func msigrestore(sigmask sigset) {
-}
-
-//go:nosplit
-//go:nowritebarrierrec
-func clearSignalHandlers() {
-}
-
-//go:nosplit
-func sigblock(exiting bool) {
-}
-
-// Called to initialize a new m (including the bootstrap m).
-// Called on the new thread, cannot allocate memory.
-func minit() {
-}
-
-// Called from dropm to undo the effect of an minit.
-func unminit() {
-}
-
-// Called from exitm, but not from drop, to undo the effect of thread-owned
-// resources in minit, semacreate, or elsewhere. Do not take locks after calling this.
-func mdestroy(mp *m) {
-}
-
-func osinit() {
-	ncpu = 1
-	getg().m.procid = 2
-	physPageSize = 64 * 1024
-}
-
-// wasm has no signals
-const _NSIG = 0
-
-func signame(sig uint32) string {
-	return ""
-}
-
-func crash() {
-	*(*int32)(nil) = 0
-}
-
+//go:wasmimport gojs runtime.getRandomData
+//go:noescape
 func getRandomData(r []byte)
 
 func goenvs() {
 	goenvs_unix()
 }
-
-func initsig(preinit bool) {
-}
-
-// May run with m.p==nil, so write barriers are not allowed.
-//
-//go:nowritebarrier
-func newosproc(mp *m) {
-	throw("newosproc: not implemented")
-}
-
-func setProcessCPUProfiler(hz int32) {}
-func setThreadCPUProfiler(hz int32)  {}
-func sigdisable(uint32)              {}
-func sigenable(uint32)               {}
-func sigignore(uint32)               {}
-
-//go:linkname os_sigpipe os.sigpipe
-func os_sigpipe() {
-	throw("too many writes on closed pipe")
-}
-
-//go:nosplit
-func cputicks() int64 {
-	// Currently cputicks() is used in blocking profiler and to seed runtime·fastrand().
-	// runtime·nanotime() is a poor approximation of CPU ticks that is enough for the profiler.
-	return nanotime()
-}
-
-//go:linkname syscall_now syscall.now
-func syscall_now() (sec int64, nsec int32) {
-	sec, nsec, _ = time_now()
-	return
-}
-
-// gsignalStack is unused on js.
-type gsignalStack struct{}
-
-const preemptMSupported = false
-
-func preemptM(mp *m) {
-	// No threads, so nothing to do.
-}
diff --git a/src/runtime/os_linux.go b/src/runtime/os_linux.go
index 3ad1e3b..0b05610 100644
--- a/src/runtime/os_linux.go
+++ b/src/runtime/os_linux.go
@@ -216,6 +216,7 @@
 	_AT_NULL   = 0  // End of vector
 	_AT_PAGESZ = 6  // System physical page size
 	_AT_HWCAP  = 16 // hardware capability bit vector
+	_AT_SECURE = 23 // secure mode boolean
 	_AT_RANDOM = 25 // introduced in 2.6.29
 	_AT_HWCAP2 = 26 // hardware capability bit vector 2
 )
@@ -226,6 +227,8 @@
 
 func mincore(addr unsafe.Pointer, n uintptr, dst *byte) int32
 
+var auxvreadbuf [128]uintptr
+
 func sysargs(argc int32, argv **byte) {
 	n := argc + 1
 
@@ -238,8 +241,10 @@
 	n++
 
 	// now argv+n is auxv
-	auxv := (*[1 << 28]uintptr)(add(unsafe.Pointer(argv), uintptr(n)*goarch.PtrSize))
-	if sysauxv(auxv[:]) != 0 {
+	auxvp := (*[1 << 28]uintptr)(add(unsafe.Pointer(argv), uintptr(n)*goarch.PtrSize))
+
+	if pairs := sysauxv(auxvp[:]); pairs != 0 {
+		auxv = auxvp[: pairs*2 : pairs*2]
 		return
 	}
 	// In some situations we don't get a loader-provided
@@ -269,23 +274,27 @@
 		munmap(p, size)
 		return
 	}
-	var buf [128]uintptr
-	n = read(fd, noescape(unsafe.Pointer(&buf[0])), int32(unsafe.Sizeof(buf)))
+
+	n = read(fd, noescape(unsafe.Pointer(&auxvreadbuf[0])), int32(unsafe.Sizeof(auxvreadbuf)))
 	closefd(fd)
 	if n < 0 {
 		return
 	}
 	// Make sure buf is terminated, even if we didn't read
 	// the whole file.
-	buf[len(buf)-2] = _AT_NULL
-	sysauxv(buf[:])
+	auxvreadbuf[len(auxvreadbuf)-2] = _AT_NULL
+	pairs := sysauxv(auxvreadbuf[:])
+	auxv = auxvreadbuf[: pairs*2 : pairs*2]
 }
 
 // startupRandomData holds random bytes initialized at startup. These come from
 // the ELF AT_RANDOM auxiliary vector.
 var startupRandomData []byte
 
-func sysauxv(auxv []uintptr) int {
+// secureMode holds the value of AT_SECURE passed in the auxiliary vector.
+var secureMode bool
+
+func sysauxv(auxv []uintptr) (pairs int) {
 	var i int
 	for ; auxv[i] != _AT_NULL; i += 2 {
 		tag, val := auxv[i], auxv[i+1]
@@ -297,6 +306,9 @@
 
 		case _AT_PAGESZ:
 			physPageSize = val
+
+		case _AT_SECURE:
+			secureMode = val == 1
 		}
 
 		archauxv(tag, val)
@@ -419,7 +431,7 @@
 //#define sa_handler k_sa_handler
 //#endif
 
-func sigreturn()
+func sigreturn__sigaction()
 func sigtramp() // Called via C ABI
 func cgoSigtramp()
 
@@ -461,6 +473,12 @@
 
 func pipe2(flags int32) (r, w int32, errno int32)
 
+//go:nosplit
+func fcntl(fd, cmd, arg int32) (ret int32, errno int32) {
+	r, _, err := syscall.Syscall6(syscall.SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg), 0, 0, 0)
+	return int32(r), int32(err)
+}
+
 const (
 	_si_max_size    = 128
 	_sigev_max_size = 64
@@ -476,7 +494,7 @@
 	// should not be used". x86_64 kernel requires it. Only use it on
 	// x86.
 	if GOARCH == "386" || GOARCH == "amd64" {
-		sa.sa_restorer = abi.FuncPCABI0(sigreturn)
+		sa.sa_restorer = abi.FuncPCABI0(sigreturn__sigaction)
 	}
 	if fn == abi.FuncPCABIInternal(sighandler) { // abi.FuncPCABIInternal(sighandler) matches the callers in signal_unix.go
 		if iscgo {
@@ -558,9 +576,6 @@
 	tgkill(getpid(), int(mp.procid), sig)
 }
 
-// go118UseTimerCreateProfiler enables the per-thread CPU profiler.
-const go118UseTimerCreateProfiler = true
-
 // validSIGPROF compares this signal delivery's code against the signal sources
 // that the profiler uses, returning whether the delivery should be processed.
 // To be processed, a signal delivery from a known profiling mechanism should
@@ -619,10 +634,6 @@
 	mp := getg().m
 	mp.profilehz = hz
 
-	if !go118UseTimerCreateProfiler {
-		return
-	}
-
 	// destroy any active timer
 	if mp.profileTimerValid.Load() {
 		timerid := mp.profileTimer
@@ -731,7 +742,7 @@
 	// N.B. Internally, this function does not depend on STW to
 	// successfully change every thread. It is only needed for user
 	// expectations, per above.
-	stopTheWorld("doAllThreadsSyscall")
+	stopTheWorld(stwAllThreadsSyscall)
 
 	// This function depends on several properties:
 	//
diff --git a/src/runtime/os_linux_loong64.go b/src/runtime/os_linux_loong64.go
index 3d84e9a..61213da 100644
--- a/src/runtime/os_linux_loong64.go
+++ b/src/runtime/os_linux_loong64.go
@@ -9,10 +9,3 @@
 func archauxv(tag, val uintptr) {}
 
 func osArchInit() {}
-
-//go:nosplit
-func cputicks() int64 {
-	// Currently cputicks() is used in blocking profiler and to seed fastrand().
-	// nanotime() is a poor approximation of CPU ticks that is enough for the profiler.
-	return nanotime()
-}
diff --git a/src/runtime/os_netbsd.go b/src/runtime/os_netbsd.go
index ce59618..b50ed4b 100644
--- a/src/runtime/os_netbsd.go
+++ b/src/runtime/os_netbsd.go
@@ -79,7 +79,9 @@
 func kevent(kq int32, ch *keventt, nch int32, ev *keventt, nev int32, ts *timespec) int32
 
 func pipe2(flags int32) (r, w int32, errno int32)
-func closeonexec(fd int32)
+func fcntl(fd, cmd, arg int32) (ret int32, errno int32)
+
+func issetugid() int32
 
 const (
 	_ESRCH     = 3
@@ -246,7 +248,7 @@
 // It is written in assembly, uses ABI0, is marked TOPFRAME, and calls netbsdMstart0.
 func netbsdMstart()
 
-// netbsdMStart0 is the function call that starts executing a newly
+// netbsdMstart0 is the function call that starts executing a newly
 // created thread. On NetBSD, a new thread inherits the signal stack
 // of the creating thread. That confuses minit, so we remove that
 // signal stack here before calling the regular mstart. It's a bit
@@ -402,8 +404,9 @@
 	n++
 
 	// now argv+n is auxv
-	auxv := (*[1 << 28]uintptr)(add(unsafe.Pointer(argv), uintptr(n)*goarch.PtrSize))
-	sysauxv(auxv[:])
+	auxvp := (*[1 << 28]uintptr)(add(unsafe.Pointer(argv), uintptr(n)*goarch.PtrSize))
+	pairs := sysauxv(auxvp[:])
+	auxv = auxvp[: pairs*2 : pairs*2]
 }
 
 const (
@@ -411,14 +414,16 @@
 	_AT_PAGESZ = 6 // Page size in bytes
 )
 
-func sysauxv(auxv []uintptr) {
-	for i := 0; auxv[i] != _AT_NULL; i += 2 {
+func sysauxv(auxv []uintptr) (pairs int) {
+	var i int
+	for i = 0; auxv[i] != _AT_NULL; i += 2 {
 		tag, val := auxv[i], auxv[i+1]
 		switch tag {
 		case _AT_PAGESZ:
 			physPageSize = val
 		}
 	}
+	return i / 2
 }
 
 // raise sends signal to the calling thread.
diff --git a/src/runtime/os_openbsd_syscall2.go b/src/runtime/os_openbsd_syscall2.go
index ebf478b..0b796ad 100644
--- a/src/runtime/os_openbsd_syscall2.go
+++ b/src/runtime/os_openbsd_syscall2.go
@@ -95,6 +95,8 @@
 //go:noescape
 func sigaltstack(new, old *stackt)
 
-func closeonexec(fd int32)
+func fcntl(fd, cmd, arg int32) (ret int32, errno int32)
 
 func walltime() (sec int64, nsec int32)
+
+func issetugid() int32
diff --git a/src/runtime/os_plan9.go b/src/runtime/os_plan9.go
index 5e5a63d..f4ff4d5 100644
--- a/src/runtime/os_plan9.go
+++ b/src/runtime/os_plan9.go
@@ -69,11 +69,6 @@
 
 type _Plink uintptr
 
-//go:linkname os_sigpipe os.sigpipe
-func os_sigpipe() {
-	throw("too many writes on closed pipe")
-}
-
 func sigpanic() {
 	gp := getg()
 	if !canpanic() {
@@ -319,9 +314,9 @@
 }
 
 func osinit() {
+	physPageSize = getPageSize()
 	initBloc()
 	ncpu = getproccount()
-	physPageSize = getPageSize()
 	getg().m.procid = getpid()
 }
 
diff --git a/src/runtime/os_solaris.go b/src/runtime/os_solaris.go
index 8ac1b08..bc00698 100644
--- a/src/runtime/os_solaris.go
+++ b/src/runtime/os_solaris.go
@@ -67,10 +67,10 @@
 	return r1
 }
 
-//go:nosplit
-
 // sysvicall1Err returns both the system call result and the errno value.
 // This is used by sysvicall1 and pipe.
+//
+//go:nosplit
 func sysvicall1Err(fn *libcFunc, a1 uintptr) (r1, err uintptr) {
 	// Leave caller's PC/SP around for traceback.
 	gp := getg()
@@ -149,7 +149,7 @@
 //go:cgo_unsafe_args
 
 // sysvicall3Err returns both the system call result and the errno value.
-// This is used by sysicall3 and write1.
+// This is used by sysvicall3 and write1.
 func sysvicall3Err(fn *libcFunc, a1, a2, a3 uintptr) (r1, err uintptr) {
 	// Leave caller's PC/SP around for traceback.
 	gp := getg()
@@ -267,3 +267,7 @@
 	}
 	return libcall.r1
 }
+
+func issetugid() int32 {
+	return int32(sysvicall0(&libc_issetugid))
+}
diff --git a/src/runtime/os_unix.go b/src/runtime/os_unix.go
new file mode 100644
index 0000000..fdbeba7
--- /dev/null
+++ b/src/runtime/os_unix.go
@@ -0,0 +1,19 @@
+// Copyright 2023 The Go 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:build unix
+
+package runtime
+
+const (
+	// These values are the same on all known Unix systems.
+	// If we find a discrepancy some day, we can split them out.
+	_F_SETFD    = 2
+	_FD_CLOEXEC = 1
+)
+
+//go:nosplit
+func closeonexec(fd int32) {
+	fcntl(fd, _F_SETFD, _FD_CLOEXEC)
+}
diff --git a/src/runtime/os_wasip1.go b/src/runtime/os_wasip1.go
new file mode 100644
index 0000000..8811bb6
--- /dev/null
+++ b/src/runtime/os_wasip1.go
@@ -0,0 +1,259 @@
+// Copyright 2023 The Go 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:build wasip1
+
+package runtime
+
+import "unsafe"
+
+// GOARCH=wasm currently has 64 bits pointers, but the WebAssembly host expects
+// pointers to be 32 bits so we use this type alias to represent pointers in
+// structs and arrays passed as arguments to WASI functions.
+//
+// Note that the use of an integer type prevents the compiler from tracking
+// pointers passed to WASI functions, so we must use KeepAlive to explicitly
+// retain the objects that could otherwise be reclaimed by the GC.
+type uintptr32 = uint32
+
+// https://github.com/WebAssembly/WASI/blob/a2b96e81c0586125cc4dc79a5be0b78d9a059925/legacy/preview1/docs.md#-size-u32
+type size = uint32
+
+// https://github.com/WebAssembly/WASI/blob/a2b96e81c0586125cc4dc79a5be0b78d9a059925/legacy/preview1/docs.md#-errno-variant
+type errno = uint32
+
+// https://github.com/WebAssembly/WASI/blob/a2b96e81c0586125cc4dc79a5be0b78d9a059925/legacy/preview1/docs.md#-filesize-u64
+type filesize = uint64
+
+// https://github.com/WebAssembly/WASI/blob/a2b96e81c0586125cc4dc79a5be0b78d9a059925/legacy/preview1/docs.md#-timestamp-u64
+type timestamp = uint64
+
+// https://github.com/WebAssembly/WASI/blob/a2b96e81c0586125cc4dc79a5be0b78d9a059925/legacy/preview1/docs.md#-clockid-variant
+type clockid = uint32
+
+const (
+	clockRealtime  clockid = 0
+	clockMonotonic clockid = 1
+)
+
+// https://github.com/WebAssembly/WASI/blob/a2b96e81c0586125cc4dc79a5be0b78d9a059925/legacy/preview1/docs.md#-iovec-record
+type iovec struct {
+	buf    uintptr32
+	bufLen size
+}
+
+//go:wasmimport wasi_snapshot_preview1 proc_exit
+func exit(code int32)
+
+//go:wasmimport wasi_snapshot_preview1 args_get
+//go:noescape
+func args_get(argv, argvBuf unsafe.Pointer) errno
+
+//go:wasmimport wasi_snapshot_preview1 args_sizes_get
+//go:noescape
+func args_sizes_get(argc, argvBufLen unsafe.Pointer) errno
+
+//go:wasmimport wasi_snapshot_preview1 clock_time_get
+//go:noescape
+func clock_time_get(clock_id clockid, precision timestamp, time unsafe.Pointer) errno
+
+//go:wasmimport wasi_snapshot_preview1 environ_get
+//go:noescape
+func environ_get(environ, environBuf unsafe.Pointer) errno
+
+//go:wasmimport wasi_snapshot_preview1 environ_sizes_get
+//go:noescape
+func environ_sizes_get(environCount, environBufLen unsafe.Pointer) errno
+
+//go:wasmimport wasi_snapshot_preview1 fd_write
+//go:noescape
+func fd_write(fd int32, iovs unsafe.Pointer, iovsLen size, nwritten unsafe.Pointer) errno
+
+//go:wasmimport wasi_snapshot_preview1 random_get
+//go:noescape
+func random_get(buf unsafe.Pointer, bufLen size) errno
+
+type eventtype = uint8
+
+const (
+	eventtypeClock eventtype = iota
+	eventtypeFdRead
+	eventtypeFdWrite
+)
+
+type eventrwflags = uint16
+
+const (
+	fdReadwriteHangup eventrwflags = 1 << iota
+)
+
+type userdata = uint64
+
+// The go:wasmimport directive currently does not accept values of type uint16
+// in arguments or returns of the function signature. Most WASI imports return
+// an errno value, which we have to define as uint32 because of that limitation.
+// However, the WASI errno type is intended to be a 16 bits integer, and in the
+// event struct the error field should be of type errno. If we used the errno
+// type for the error field it would result in a mismatching field alignment and
+// struct size because errno is declared as a 32 bits type, so we declare the
+// error field as a plain uint16.
+type event struct {
+	userdata    userdata
+	error       uint16
+	typ         eventtype
+	fdReadwrite eventFdReadwrite
+}
+
+type eventFdReadwrite struct {
+	nbytes filesize
+	flags  eventrwflags
+}
+
+type subclockflags = uint16
+
+const (
+	subscriptionClockAbstime subclockflags = 1 << iota
+)
+
+type subscriptionClock struct {
+	id        clockid
+	timeout   timestamp
+	precision timestamp
+	flags     subclockflags
+}
+
+type subscriptionFdReadwrite struct {
+	fd int32
+}
+
+type subscription struct {
+	userdata userdata
+	u        subscriptionUnion
+}
+
+type subscriptionUnion [5]uint64
+
+func (u *subscriptionUnion) eventtype() *eventtype {
+	return (*eventtype)(unsafe.Pointer(&u[0]))
+}
+
+func (u *subscriptionUnion) subscriptionClock() *subscriptionClock {
+	return (*subscriptionClock)(unsafe.Pointer(&u[1]))
+}
+
+func (u *subscriptionUnion) subscriptionFdReadwrite() *subscriptionFdReadwrite {
+	return (*subscriptionFdReadwrite)(unsafe.Pointer(&u[1]))
+}
+
+//go:wasmimport wasi_snapshot_preview1 poll_oneoff
+//go:noescape
+func poll_oneoff(in, out unsafe.Pointer, nsubscriptions size, nevents unsafe.Pointer) errno
+
+func write1(fd uintptr, p unsafe.Pointer, n int32) int32 {
+	iov := iovec{
+		buf:    uintptr32(uintptr(p)),
+		bufLen: size(n),
+	}
+	var nwritten size
+	if fd_write(int32(fd), unsafe.Pointer(&iov), 1, unsafe.Pointer(&nwritten)) != 0 {
+		throw("fd_write failed")
+	}
+	return int32(nwritten)
+}
+
+func usleep(usec uint32) {
+	var in subscription
+	var out event
+	var nevents size
+
+	eventtype := in.u.eventtype()
+	*eventtype = eventtypeClock
+
+	subscription := in.u.subscriptionClock()
+	subscription.id = clockMonotonic
+	subscription.timeout = timestamp(usec) * 1e3
+	subscription.precision = 1e3
+
+	if poll_oneoff(unsafe.Pointer(&in), unsafe.Pointer(&out), 1, unsafe.Pointer(&nevents)) != 0 {
+		throw("wasi_snapshot_preview1.poll_oneoff")
+	}
+}
+
+func getRandomData(r []byte) {
+	if random_get(unsafe.Pointer(&r[0]), size(len(r))) != 0 {
+		throw("random_get failed")
+	}
+}
+
+func goenvs() {
+	// arguments
+	var argc size
+	var argvBufLen size
+	if args_sizes_get(unsafe.Pointer(&argc), unsafe.Pointer(&argvBufLen)) != 0 {
+		throw("args_sizes_get failed")
+	}
+
+	argslice = make([]string, argc)
+	if argc > 0 {
+		argv := make([]uintptr32, argc)
+		argvBuf := make([]byte, argvBufLen)
+		if args_get(unsafe.Pointer(&argv[0]), unsafe.Pointer(&argvBuf[0])) != 0 {
+			throw("args_get failed")
+		}
+
+		for i := range argslice {
+			start := argv[i] - uintptr32(uintptr(unsafe.Pointer(&argvBuf[0])))
+			end := start
+			for argvBuf[end] != 0 {
+				end++
+			}
+			argslice[i] = string(argvBuf[start:end])
+		}
+	}
+
+	// environment
+	var environCount size
+	var environBufLen size
+	if environ_sizes_get(unsafe.Pointer(&environCount), unsafe.Pointer(&environBufLen)) != 0 {
+		throw("environ_sizes_get failed")
+	}
+
+	envs = make([]string, environCount)
+	if environCount > 0 {
+		environ := make([]uintptr32, environCount)
+		environBuf := make([]byte, environBufLen)
+		if environ_get(unsafe.Pointer(&environ[0]), unsafe.Pointer(&environBuf[0])) != 0 {
+			throw("environ_get failed")
+		}
+
+		for i := range envs {
+			start := environ[i] - uintptr32(uintptr(unsafe.Pointer(&environBuf[0])))
+			end := start
+			for environBuf[end] != 0 {
+				end++
+			}
+			envs[i] = string(environBuf[start:end])
+		}
+	}
+}
+
+func walltime() (sec int64, nsec int32) {
+	return walltime1()
+}
+
+func walltime1() (sec int64, nsec int32) {
+	var time timestamp
+	if clock_time_get(clockRealtime, 0, unsafe.Pointer(&time)) != 0 {
+		throw("clock_time_get failed")
+	}
+	return int64(time / 1000000000), int32(time % 1000000000)
+}
+
+func nanotime1() int64 {
+	var time timestamp
+	if clock_time_get(clockMonotonic, 0, unsafe.Pointer(&time)) != 0 {
+		throw("clock_time_get failed")
+	}
+	return int64(time)
+}
diff --git a/src/runtime/os_wasm.go b/src/runtime/os_wasm.go
new file mode 100644
index 0000000..bf78dfb
--- /dev/null
+++ b/src/runtime/os_wasm.go
@@ -0,0 +1,153 @@
+// Copyright 2023 The Go Authors. 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 (
+	"runtime/internal/atomic"
+	"unsafe"
+)
+
+func osinit() {
+	// https://webassembly.github.io/spec/core/exec/runtime.html#memory-instances
+	physPageSize = 64 * 1024
+	initBloc()
+	ncpu = 1
+	getg().m.procid = 2
+}
+
+const _SIGSEGV = 0xb
+
+func sigpanic() {
+	gp := getg()
+	if !canpanic() {
+		throw("unexpected signal during runtime execution")
+	}
+
+	// js only invokes the exception handler for memory faults.
+	gp.sig = _SIGSEGV
+	panicmem()
+}
+
+// func exitThread(wait *uint32)
+// FIXME: wasm doesn't have atomic yet
+func exitThread(wait *atomic.Uint32)
+
+type mOS struct{}
+
+func osyield()
+
+//go:nosplit
+func osyield_no_g() {
+	osyield()
+}
+
+type sigset struct{}
+
+// Called to initialize a new m (including the bootstrap m).
+// Called on the parent thread (main thread in case of bootstrap), can allocate memory.
+func mpreinit(mp *m) {
+	mp.gsignal = malg(32 * 1024)
+	mp.gsignal.m = mp
+}
+
+//go:nosplit
+func usleep_no_g(usec uint32) {
+	usleep(usec)
+}
+
+//go:nosplit
+func sigsave(p *sigset) {
+}
+
+//go:nosplit
+func msigrestore(sigmask sigset) {
+}
+
+//go:nosplit
+//go:nowritebarrierrec
+func clearSignalHandlers() {
+}
+
+//go:nosplit
+func sigblock(exiting bool) {
+}
+
+// Called to initialize a new m (including the bootstrap m).
+// Called on the new thread, cannot allocate memory.
+func minit() {
+}
+
+// Called from dropm to undo the effect of an minit.
+func unminit() {
+}
+
+// Called from exitm, but not from drop, to undo the effect of thread-owned
+// resources in minit, semacreate, or elsewhere. Do not take locks after calling this.
+func mdestroy(mp *m) {
+}
+
+// wasm has no signals
+const _NSIG = 0
+
+func signame(sig uint32) string {
+	return ""
+}
+
+func crash() {
+	*(*int32)(nil) = 0
+}
+
+func initsig(preinit bool) {
+}
+
+// May run with m.p==nil, so write barriers are not allowed.
+//
+//go:nowritebarrier
+func newosproc(mp *m) {
+	throw("newosproc: not implemented")
+}
+
+//go:linkname os_sigpipe os.sigpipe
+func os_sigpipe() {
+	throw("too many writes on closed pipe")
+}
+
+//go:linkname syscall_now syscall.now
+func syscall_now() (sec int64, nsec int32) {
+	sec, nsec, _ = time_now()
+	return
+}
+
+//go:nosplit
+func cputicks() int64 {
+	// Currently cputicks() is used in blocking profiler and to seed runtime·fastrand().
+	// runtime·nanotime() is a poor approximation of CPU ticks that is enough for the profiler.
+	// TODO: need more entropy to better seed fastrand.
+	return nanotime()
+}
+
+// gsignalStack is unused on js.
+type gsignalStack struct{}
+
+const preemptMSupported = false
+
+func preemptM(mp *m) {
+	// No threads, so nothing to do.
+}
+
+// getfp returns the frame pointer register of its caller or 0 if not implemented.
+// TODO: Make this a compiler intrinsic
+func getfp() uintptr { return 0 }
+
+func setProcessCPUProfiler(hz int32) {}
+func setThreadCPUProfiler(hz int32)  {}
+func sigdisable(uint32)              {}
+func sigenable(uint32)               {}
+func sigignore(uint32)               {}
+
+// Stubs so tests can link correctly. These should never be called.
+func open(name *byte, mode, perm int32) int32        { panic("not implemented") }
+func closefd(fd int32) int32                         { panic("not implemented") }
+func read(fd int32, p unsafe.Pointer, n int32) int32 { panic("not implemented") }
diff --git a/src/runtime/os_windows.go b/src/runtime/os_windows.go
index 44718f1..f5c2429 100644
--- a/src/runtime/os_windows.go
+++ b/src/runtime/os_windows.go
@@ -28,7 +28,9 @@
 //go:cgo_import_dynamic runtime._ExitProcess ExitProcess%1 "kernel32.dll"
 //go:cgo_import_dynamic runtime._FreeEnvironmentStringsW FreeEnvironmentStringsW%1 "kernel32.dll"
 //go:cgo_import_dynamic runtime._GetConsoleMode GetConsoleMode%2 "kernel32.dll"
+//go:cgo_import_dynamic runtime._GetCurrentThreadId GetCurrentThreadId%0 "kernel32.dll"
 //go:cgo_import_dynamic runtime._GetEnvironmentStringsW GetEnvironmentStringsW%0 "kernel32.dll"
+//go:cgo_import_dynamic runtime._GetErrorMode GetErrorMode%0 "kernel32.dll"
 //go:cgo_import_dynamic runtime._GetProcAddress GetProcAddress%2 "kernel32.dll"
 //go:cgo_import_dynamic runtime._GetProcessAffinityMask GetProcessAffinityMask%3 "kernel32.dll"
 //go:cgo_import_dynamic runtime._GetQueuedCompletionStatusEx GetQueuedCompletionStatusEx%6 "kernel32.dll"
@@ -37,9 +39,10 @@
 //go:cgo_import_dynamic runtime._GetSystemInfo GetSystemInfo%1 "kernel32.dll"
 //go:cgo_import_dynamic runtime._GetThreadContext GetThreadContext%2 "kernel32.dll"
 //go:cgo_import_dynamic runtime._SetThreadContext SetThreadContext%2 "kernel32.dll"
+//go:cgo_import_dynamic runtime._LoadLibraryExW LoadLibraryExW%3 "kernel32.dll"
 //go:cgo_import_dynamic runtime._LoadLibraryW LoadLibraryW%1 "kernel32.dll"
-//go:cgo_import_dynamic runtime._LoadLibraryA LoadLibraryA%1 "kernel32.dll"
 //go:cgo_import_dynamic runtime._PostQueuedCompletionStatus PostQueuedCompletionStatus%4 "kernel32.dll"
+//go:cgo_import_dynamic runtime._RaiseFailFastException RaiseFailFastException%3 "kernel32.dll"
 //go:cgo_import_dynamic runtime._ResumeThread ResumeThread%1 "kernel32.dll"
 //go:cgo_import_dynamic runtime._SetConsoleCtrlHandler SetConsoleCtrlHandler%2 "kernel32.dll"
 //go:cgo_import_dynamic runtime._SetErrorMode SetErrorMode%1 "kernel32.dll"
@@ -48,7 +51,6 @@
 //go:cgo_import_dynamic runtime._SetThreadPriority SetThreadPriority%2 "kernel32.dll"
 //go:cgo_import_dynamic runtime._SetUnhandledExceptionFilter SetUnhandledExceptionFilter%1 "kernel32.dll"
 //go:cgo_import_dynamic runtime._SetWaitableTimer SetWaitableTimer%6 "kernel32.dll"
-//go:cgo_import_dynamic runtime._Sleep Sleep%1 "kernel32.dll"
 //go:cgo_import_dynamic runtime._SuspendThread SuspendThread%1 "kernel32.dll"
 //go:cgo_import_dynamic runtime._SwitchToThread SwitchToThread%0 "kernel32.dll"
 //go:cgo_import_dynamic runtime._TlsAlloc TlsAlloc%0 "kernel32.dll"
@@ -57,6 +59,8 @@
 //go:cgo_import_dynamic runtime._VirtualQuery VirtualQuery%3 "kernel32.dll"
 //go:cgo_import_dynamic runtime._WaitForSingleObject WaitForSingleObject%2 "kernel32.dll"
 //go:cgo_import_dynamic runtime._WaitForMultipleObjects WaitForMultipleObjects%4 "kernel32.dll"
+//go:cgo_import_dynamic runtime._WerGetFlags WerGetFlags%2 "kernel32.dll"
+//go:cgo_import_dynamic runtime._WerSetFlags WerSetFlags%1 "kernel32.dll"
 //go:cgo_import_dynamic runtime._WriteConsoleW WriteConsoleW%5 "kernel32.dll"
 //go:cgo_import_dynamic runtime._WriteFile WriteFile%5 "kernel32.dll"
 
@@ -78,7 +82,9 @@
 	_ExitProcess,
 	_FreeEnvironmentStringsW,
 	_GetConsoleMode,
+	_GetCurrentThreadId,
 	_GetEnvironmentStringsW,
+	_GetErrorMode,
 	_GetProcAddress,
 	_GetProcessAffinityMask,
 	_GetQueuedCompletionStatusEx,
@@ -88,11 +94,12 @@
 	_GetSystemTimeAsFileTime,
 	_GetThreadContext,
 	_SetThreadContext,
+	_LoadLibraryExW,
 	_LoadLibraryW,
-	_LoadLibraryA,
 	_PostQueuedCompletionStatus,
 	_QueryPerformanceCounter,
 	_QueryPerformanceFrequency,
+	_RaiseFailFastException,
 	_ResumeThread,
 	_SetConsoleCtrlHandler,
 	_SetErrorMode,
@@ -101,7 +108,6 @@
 	_SetThreadPriority,
 	_SetUnhandledExceptionFilter,
 	_SetWaitableTimer,
-	_Sleep,
 	_SuspendThread,
 	_SwitchToThread,
 	_TlsAlloc,
@@ -110,16 +116,15 @@
 	_VirtualQuery,
 	_WaitForSingleObject,
 	_WaitForMultipleObjects,
+	_WerGetFlags,
+	_WerSetFlags,
 	_WriteConsoleW,
 	_WriteFile,
 	_ stdFunction
 
 	// Following syscalls are only available on some Windows PCs.
 	// We will load syscalls, if available, before using them.
-	_AddDllDirectory,
 	_AddVectoredContinueHandler,
-	_LoadLibraryExA,
-	_LoadLibraryExW,
 	_ stdFunction
 
 	// Use RtlGenRandom to generate cryptographically random data.
@@ -146,6 +151,15 @@
 	_ stdFunction
 )
 
+var (
+	advapi32dll = [...]uint16{'a', 'd', 'v', 'a', 'p', 'i', '3', '2', '.', 'd', 'l', 'l', 0}
+	kernel32dll = [...]uint16{'k', 'e', 'r', 'n', 'e', 'l', '3', '2', '.', 'd', 'l', 'l', 0}
+	ntdlldll    = [...]uint16{'n', 't', 'd', 'l', 'l', '.', 'd', 'l', 'l', 0}
+	powrprofdll = [...]uint16{'p', 'o', 'w', 'r', 'p', 'r', 'o', 'f', '.', 'd', 'l', 'l', 0}
+	winmmdll    = [...]uint16{'w', 'i', 'n', 'm', 'm', '.', 'd', 'l', 'l', 0}
+	ws2_32dll   = [...]uint16{'w', 's', '2', '_', '3', '2', '.', 'd', 'l', 'l', 0}
+)
+
 // Function to be called by windows CreateThread
 // to start new os thread.
 func tstart_stdcall(newm *m)
@@ -186,11 +200,6 @@
 	preemptExtLock uint32
 }
 
-//go:linkname os_sigpipe os.sigpipe
-func os_sigpipe() {
-	throw("too many writes on closed pipe")
-}
-
 // Stubs so tests can link correctly. These should never be called.
 func open(name *byte, mode, perm int32) int32 {
 	throw("unimplemented")
@@ -225,46 +234,35 @@
 var sysDirectory [_MAX_PATH + 1]byte
 var sysDirectoryLen uintptr
 
-func windowsLoadSystemLib(name []byte) uintptr {
-	if sysDirectoryLen == 0 {
-		l := stdcall2(_GetSystemDirectoryA, uintptr(unsafe.Pointer(&sysDirectory[0])), uintptr(len(sysDirectory)-1))
-		if l == 0 || l > uintptr(len(sysDirectory)-1) {
-			throw("Unable to determine system directory")
-		}
-		sysDirectory[l] = '\\'
-		sysDirectoryLen = l + 1
+func initSysDirectory() {
+	l := stdcall2(_GetSystemDirectoryA, uintptr(unsafe.Pointer(&sysDirectory[0])), uintptr(len(sysDirectory)-1))
+	if l == 0 || l > uintptr(len(sysDirectory)-1) {
+		throw("Unable to determine system directory")
 	}
-	if useLoadLibraryEx {
-		return stdcall3(_LoadLibraryExA, uintptr(unsafe.Pointer(&name[0])), 0, _LOAD_LIBRARY_SEARCH_SYSTEM32)
-	} else {
-		absName := append(sysDirectory[:sysDirectoryLen], name...)
-		return stdcall1(_LoadLibraryA, uintptr(unsafe.Pointer(&absName[0])))
-	}
+	sysDirectory[l] = '\\'
+	sysDirectoryLen = l + 1
+}
+
+func windowsLoadSystemLib(name []uint16) uintptr {
+	return stdcall3(_LoadLibraryExW, uintptr(unsafe.Pointer(&name[0])), 0, _LOAD_LIBRARY_SEARCH_SYSTEM32)
 }
 
 const haveCputicksAsm = GOARCH == "386" || GOARCH == "amd64"
 
 func loadOptionalSyscalls() {
-	var kernel32dll = []byte("kernel32.dll\000")
-	k32 := stdcall1(_LoadLibraryA, uintptr(unsafe.Pointer(&kernel32dll[0])))
+	k32 := windowsLoadSystemLib(kernel32dll[:])
 	if k32 == 0 {
 		throw("kernel32.dll not found")
 	}
-	_AddDllDirectory = windowsFindfunc(k32, []byte("AddDllDirectory\000"))
 	_AddVectoredContinueHandler = windowsFindfunc(k32, []byte("AddVectoredContinueHandler\000"))
-	_LoadLibraryExA = windowsFindfunc(k32, []byte("LoadLibraryExA\000"))
-	_LoadLibraryExW = windowsFindfunc(k32, []byte("LoadLibraryExW\000"))
-	useLoadLibraryEx = (_LoadLibraryExW != nil && _LoadLibraryExA != nil && _AddDllDirectory != nil)
 
-	var advapi32dll = []byte("advapi32.dll\000")
-	a32 := windowsLoadSystemLib(advapi32dll)
+	a32 := windowsLoadSystemLib(advapi32dll[:])
 	if a32 == 0 {
 		throw("advapi32.dll not found")
 	}
 	_RtlGenRandom = windowsFindfunc(a32, []byte("SystemFunction036\000"))
 
-	var ntdll = []byte("ntdll.dll\000")
-	n32 := windowsLoadSystemLib(ntdll)
+	n32 := windowsLoadSystemLib(ntdlldll[:])
 	if n32 == 0 {
 		throw("ntdll.dll not found")
 	}
@@ -279,8 +277,7 @@
 		}
 	}
 
-	var winmmdll = []byte("winmm.dll\000")
-	m32 := windowsLoadSystemLib(winmmdll)
+	m32 := windowsLoadSystemLib(winmmdll[:])
 	if m32 == 0 {
 		throw("winmm.dll not found")
 	}
@@ -290,8 +287,7 @@
 		throw("timeBegin/EndPeriod not found")
 	}
 
-	var ws232dll = []byte("ws2_32.dll\000")
-	ws232 := windowsLoadSystemLib(ws232dll)
+	ws232 := windowsLoadSystemLib(ws2_32dll[:])
 	if ws232 == 0 {
 		throw("ws2_32.dll not found")
 	}
@@ -315,7 +311,7 @@
 		context  uintptr
 	}
 
-	powrprof := windowsLoadSystemLib([]byte("powrprof.dll\000"))
+	powrprof := windowsLoadSystemLib(powrprofdll[:])
 	if powrprof == 0 {
 		return // Running on Windows 7, where we don't need it anyway.
 	}
@@ -389,22 +385,6 @@
 // in sys_windows_386.s and sys_windows_amd64.s:
 func getlasterror() uint32
 
-// When loading DLLs, we prefer to use LoadLibraryEx with
-// LOAD_LIBRARY_SEARCH_* flags, if available. LoadLibraryEx is not
-// available on old Windows, though, and the LOAD_LIBRARY_SEARCH_*
-// flags are not available on some versions of Windows without a
-// security patch.
-//
-// https://msdn.microsoft.com/en-us/library/ms684179(v=vs.85).aspx says:
-// "Windows 7, Windows Server 2008 R2, Windows Vista, and Windows
-// Server 2008: The LOAD_LIBRARY_SEARCH_* flags are available on
-// systems that have KB2533623 installed. To determine whether the
-// flags are available, use GetProcAddress to get the address of the
-// AddDllDirectory, RemoveDllDirectory, or SetDefaultDllDirectories
-// function. If GetProcAddress succeeds, the LOAD_LIBRARY_SEARCH_*
-// flags can be used with LoadLibraryEx."
-var useLoadLibraryEx bool
-
 var timeBeginPeriodRetValue uint32
 
 // osRelaxMinNS indicates that sysmon shouldn't osRelax if the next
@@ -461,13 +441,7 @@
 		_SYNCHRONIZE|_TIMER_QUERY_STATE|_TIMER_MODIFY_STATE)
 }
 
-const highResTimerSupported = GOARCH == "386" || GOARCH == "amd64"
-
 func initHighResTimer() {
-	if !highResTimerSupported {
-		// TODO: Not yet implemented.
-		return
-	}
 	h := createHighResTimer()
 	if h != 0 {
 		haveHighResTimer = true
@@ -546,17 +520,16 @@
 func osinit() {
 	asmstdcallAddr = unsafe.Pointer(abi.FuncPCABI0(asmstdcall))
 
-	setBadSignalMsg()
-
 	loadOptionalSyscalls()
 
-	disableWER()
+	preventErrorDialogs()
 
 	initExceptionHandler()
 
 	initHighResTimer()
 	timeBeginPeriodRetValue = osRelax(false)
 
+	initSysDirectory()
 	initLongPathSupport()
 
 	ncpu = getproccount()
@@ -981,6 +954,7 @@
 	mp := getg().m
 	lock(&mp.threadLock)
 	mp.thread = thandle
+	mp.procid = uint64(stdcall0(_GetCurrentThreadId))
 
 	// Configure usleep timer, if possible.
 	if mp.highResTimer == 0 && haveHighResTimer {
@@ -1014,7 +988,7 @@
 		throw("bad g0 stack")
 	}
 	g0.stack.lo = base
-	g0.stackguard0 = g0.stack.lo + _StackGuard
+	g0.stackguard0 = g0.stack.lo + stackGuard
 	g0.stackguard1 = g0.stackguard0
 	// Sanity check the SP.
 	stackcheck()
@@ -1151,7 +1125,6 @@
 
 // These must run on the system stack only.
 func usleep2(dt int32)
-func usleep2HighRes(dt int32)
 func switchtothread()
 
 //go:nosplit
@@ -1173,13 +1146,15 @@
 //go:nosplit
 func usleep(us uint32) {
 	systemstack(func() {
-		dt := -10 * int32(us) // relative sleep (negative), 100ns units
+		dt := -10 * int64(us) // relative sleep (negative), 100ns units
 		// If the high-res timer is available and its handle has been allocated for this m, use it.
 		// Otherwise fall back to the low-res one, which doesn't need a handle.
 		if haveHighResTimer && getg().m.highResTimer != 0 {
-			usleep2HighRes(dt)
+			h := getg().m.highResTimer
+			stdcall6(_SetWaitableTimer, h, uintptr(unsafe.Pointer(&dt)), 0, 0, 0, 0)
+			stdcall3(_NtWaitForSingleObject, h, 0, 0)
 		} else {
-			usleep2(dt)
+			usleep2(int32(dt))
 		}
 	})
 }
diff --git a/src/runtime/panic.go b/src/runtime/panic.go
index 26618db..39c27a4 100644
--- a/src/runtime/panic.go
+++ b/src/runtime/panic.go
@@ -5,6 +5,7 @@
 package runtime
 
 import (
+	"internal/abi"
 	"internal/goarch"
 	"runtime/internal/atomic"
 	"runtime/internal/sys"
@@ -572,7 +573,7 @@
 		case string:
 			throw(text + ": " + r)
 		default:
-			throw(text + ": type " + efaceOf(&r)._type.string())
+			throw(text + ": type " + toRType(efaceOf(&r)._type).string())
 		}
 	}()
 	for p != nil {
@@ -642,77 +643,78 @@
 		sp = unsafe.Pointer(prevDefer.sp)
 	}
 	systemstack(func() {
-		gentraceback(pc, uintptr(sp), 0, gp, 0, nil, 0x7fffffff,
-			func(frame *stkframe, unused unsafe.Pointer) bool {
-				if prevDefer != nil && prevDefer.sp == frame.sp {
-					// Skip the frame for the previous defer that
-					// we just finished (and was used to set
-					// where we restarted the stack scan)
-					return true
+		var u unwinder
+	frames:
+		for u.initAt(pc, uintptr(sp), 0, gp, 0); u.valid(); u.next() {
+			frame := &u.frame
+			if prevDefer != nil && prevDefer.sp == frame.sp {
+				// Skip the frame for the previous defer that
+				// we just finished (and was used to set
+				// where we restarted the stack scan)
+				continue
+			}
+			f := frame.fn
+			fd := funcdata(f, abi.FUNCDATA_OpenCodedDeferInfo)
+			if fd == nil {
+				continue
+			}
+			// Insert the open defer record in the
+			// chain, in order sorted by sp.
+			d := gp._defer
+			var prev *_defer
+			for d != nil {
+				dsp := d.sp
+				if frame.sp < dsp {
+					break
 				}
-				f := frame.fn
-				fd := funcdata(f, _FUNCDATA_OpenCodedDeferInfo)
-				if fd == nil {
-					return true
-				}
-				// Insert the open defer record in the
-				// chain, in order sorted by sp.
-				d := gp._defer
-				var prev *_defer
-				for d != nil {
-					dsp := d.sp
-					if frame.sp < dsp {
-						break
+				if frame.sp == dsp {
+					if !d.openDefer {
+						throw("duplicated defer entry")
 					}
-					if frame.sp == dsp {
-						if !d.openDefer {
-							throw("duplicated defer entry")
-						}
-						// Don't add any record past an
-						// in-progress defer entry. We don't
-						// need it, and more importantly, we
-						// want to keep the invariant that
-						// there is no open defer entry
-						// passed an in-progress entry (see
-						// header comment).
-						if d.started {
-							return false
-						}
-						return true
+					// Don't add any record past an
+					// in-progress defer entry. We don't
+					// need it, and more importantly, we
+					// want to keep the invariant that
+					// there is no open defer entry
+					// passed an in-progress entry (see
+					// header comment).
+					if d.started {
+						break frames
 					}
-					prev = d
-					d = d.link
+					continue frames
 				}
-				if frame.fn.deferreturn == 0 {
-					throw("missing deferreturn")
-				}
+				prev = d
+				d = d.link
+			}
+			if frame.fn.deferreturn == 0 {
+				throw("missing deferreturn")
+			}
 
-				d1 := newdefer()
-				d1.openDefer = true
-				d1._panic = nil
-				// These are the pc/sp to set after we've
-				// run a defer in this frame that did a
-				// recover. We return to a special
-				// deferreturn that runs any remaining
-				// defers and then returns from the
-				// function.
-				d1.pc = frame.fn.entry() + uintptr(frame.fn.deferreturn)
-				d1.varp = frame.varp
-				d1.fd = fd
-				// Save the SP/PC associated with current frame,
-				// so we can continue stack trace later if needed.
-				d1.framepc = frame.pc
-				d1.sp = frame.sp
-				d1.link = d
-				if prev == nil {
-					gp._defer = d1
-				} else {
-					prev.link = d1
-				}
-				// Stop stack scanning after adding one open defer record
-				return false
-			},
-			nil, 0)
+			d1 := newdefer()
+			d1.openDefer = true
+			d1._panic = nil
+			// These are the pc/sp to set after we've
+			// run a defer in this frame that did a
+			// recover. We return to a special
+			// deferreturn that runs any remaining
+			// defers and then returns from the
+			// function.
+			d1.pc = frame.fn.entry() + uintptr(frame.fn.deferreturn)
+			d1.varp = frame.varp
+			d1.fd = fd
+			// Save the SP/PC associated with current frame,
+			// so we can continue stack trace later if needed.
+			d1.framepc = frame.pc
+			d1.sp = frame.sp
+			d1.link = d
+			if prev == nil {
+				gp._defer = d1
+			} else {
+				prev.link = d1
+			}
+			// Stop stack scanning after adding one open defer record
+			break
+		}
 	})
 }
 
@@ -800,8 +802,36 @@
 	}
 }
 
+// A PanicNilError happens when code calls panic(nil).
+//
+// Before Go 1.21, programs that called panic(nil) observed recover returning nil.
+// Starting in Go 1.21, programs that call panic(nil) observe recover returning a *PanicNilError.
+// Programs can change back to the old behavior by setting GODEBUG=panicnil=1.
+type PanicNilError struct {
+	// This field makes PanicNilError structurally different from
+	// any other struct in this package, and the _ makes it different
+	// from any struct in other packages too.
+	// This avoids any accidental conversions being possible
+	// between this struct and some other struct sharing the same fields,
+	// like happened in go.dev/issue/56603.
+	_ [0]*PanicNilError
+}
+
+func (*PanicNilError) Error() string { return "panic called with nil argument" }
+func (*PanicNilError) RuntimeError() {}
+
+var panicnil = &godebugInc{name: "panicnil"}
+
 // The implementation of the predeclared function panic.
 func gopanic(e any) {
+	if e == nil {
+		if debug.panicnil.Load() != 1 {
+			e = new(PanicNilError)
+		} else {
+			panicnil.IncNonDefault()
+		}
+	}
+
 	gp := getg()
 	if gp.m.curg != gp {
 		print("panic: ")
@@ -1097,6 +1127,19 @@
 	gp.sched.sp = sp
 	gp.sched.pc = pc
 	gp.sched.lr = 0
+	// Restore the bp on platforms that support frame pointers.
+	// N.B. It's fine to not set anything for platforms that don't
+	// support frame pointers, since nothing consumes them.
+	switch {
+	case goarch.IsAmd64 != 0:
+		// On x86, the architectural bp is stored 2 words below the
+		// stack pointer.
+		gp.sched.bp = *(*uintptr)(unsafe.Pointer(sp - 2*goarch.PtrSize))
+	case goarch.IsArm64 != 0:
+		// on arm64, the architectural bp points one word higher
+		// than the sp.
+		gp.sched.bp = sp - goarch.PtrSize
+	}
 	gp.sched.ret = 1
 	gogo(&gp.sched)
 }
@@ -1118,6 +1161,10 @@
 	// Switch to the system stack to avoid any stack growth, which may make
 	// things worse if the runtime is in a bad state.
 	systemstack(func() {
+		if isSecureMode() {
+			exit(2)
+		}
+
 		startpanic_m()
 
 		if dopanic_m(gp, pc, sp) {
@@ -1368,5 +1415,5 @@
 	if !f.valid() {
 		return false
 	}
-	return f.funcID == funcID_abort
+	return f.funcID == abi.FuncID_abort
 }
diff --git a/src/runtime/panicnil_test.go b/src/runtime/panicnil_test.go
new file mode 100644
index 0000000..7ed98e9
--- /dev/null
+++ b/src/runtime/panicnil_test.go
@@ -0,0 +1,54 @@
+// Copyright 2023 The Go Authors. 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 (
+	"reflect"
+	"runtime"
+	"runtime/metrics"
+	"testing"
+)
+
+func TestPanicNil(t *testing.T) {
+	t.Run("default", func(t *testing.T) {
+		checkPanicNil(t, new(runtime.PanicNilError))
+	})
+	t.Run("GODEBUG=panicnil=0", func(t *testing.T) {
+		t.Setenv("GODEBUG", "panicnil=0")
+		checkPanicNil(t, new(runtime.PanicNilError))
+	})
+	t.Run("GODEBUG=panicnil=1", func(t *testing.T) {
+		t.Setenv("GODEBUG", "panicnil=1")
+		checkPanicNil(t, nil)
+	})
+}
+
+func checkPanicNil(t *testing.T, want any) {
+	name := "/godebug/non-default-behavior/panicnil:events"
+	s := []metrics.Sample{{Name: name}}
+	metrics.Read(s)
+	v1 := s[0].Value.Uint64()
+
+	defer func() {
+		e := recover()
+		if reflect.TypeOf(e) != reflect.TypeOf(want) {
+			println(e, want)
+			t.Errorf("recover() = %v, want %v", e, want)
+			panic(e)
+		}
+		metrics.Read(s)
+		v2 := s[0].Value.Uint64()
+		if want == nil {
+			if v2 != v1+1 {
+				t.Errorf("recover() with panicnil=1 did not increment metric %s", name)
+			}
+		} else {
+			if v2 != v1 {
+				t.Errorf("recover() with panicnil=0 incremented metric %s: %d -> %d", name, v1, v2)
+			}
+		}
+	}()
+	panic(nil)
+}
diff --git a/src/runtime/pinner.go b/src/runtime/pinner.go
new file mode 100644
index 0000000..8bb351e
--- /dev/null
+++ b/src/runtime/pinner.go
@@ -0,0 +1,380 @@
+// Copyright 2023 The Go Authors. 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 (
+	"runtime/internal/atomic"
+	"unsafe"
+)
+
+// A Pinner is a set of pinned Go objects. An object can be pinned with
+// the Pin method and all pinned objects of a Pinner can be unpinned with the
+// Unpin method.
+type Pinner struct {
+	*pinner
+}
+
+// Pin pins a Go object, preventing it from being moved or freed by the garbage
+// collector until the Unpin method has been called.
+//
+// A pointer to a pinned
+// object can be directly stored in C memory or can be contained in Go memory
+// passed to C functions. If the pinned object itself contains pointers to Go
+// objects, these objects must be pinned separately if they are going to be
+// accessed from C code.
+//
+// The argument must be a pointer of any type or an
+// unsafe.Pointer. It must be the result of calling new,
+// taking the address of a composite literal, or taking the address of a
+// local variable. If one of these conditions is not met, Pin will panic.
+func (p *Pinner) Pin(pointer any) {
+	if p.pinner == nil {
+		// Check the pinner cache first.
+		mp := acquirem()
+		if pp := mp.p.ptr(); pp != nil {
+			p.pinner = pp.pinnerCache
+			pp.pinnerCache = nil
+		}
+		releasem(mp)
+
+		if p.pinner == nil {
+			// Didn't get anything from the pinner cache.
+			p.pinner = new(pinner)
+			p.refs = p.refStore[:0]
+
+			// We set this finalizer once and never clear it. Thus, if the
+			// pinner gets cached, we'll reuse it, along with its finalizer.
+			// This lets us avoid the relatively expensive SetFinalizer call
+			// when reusing from the cache. The finalizer however has to be
+			// resilient to an empty pinner being finalized, which is done
+			// by checking p.refs' length.
+			SetFinalizer(p.pinner, func(i *pinner) {
+				if len(i.refs) != 0 {
+					i.unpin() // only required to make the test idempotent
+					pinnerLeakPanic()
+				}
+			})
+		}
+	}
+	ptr := pinnerGetPtr(&pointer)
+	setPinned(ptr, true)
+	p.refs = append(p.refs, ptr)
+}
+
+// Unpin unpins all pinned objects of the Pinner.
+func (p *Pinner) Unpin() {
+	p.pinner.unpin()
+
+	mp := acquirem()
+	if pp := mp.p.ptr(); pp != nil && pp.pinnerCache == nil {
+		// Put the pinner back in the cache, but only if the
+		// cache is empty. If application code is reusing Pinners
+		// on its own, we want to leave the backing store in place
+		// so reuse is more efficient.
+		pp.pinnerCache = p.pinner
+		p.pinner = nil
+	}
+	releasem(mp)
+}
+
+const (
+	pinnerSize         = 64
+	pinnerRefStoreSize = (pinnerSize - unsafe.Sizeof([]unsafe.Pointer{})) / unsafe.Sizeof(unsafe.Pointer(nil))
+)
+
+type pinner struct {
+	refs     []unsafe.Pointer
+	refStore [pinnerRefStoreSize]unsafe.Pointer
+}
+
+func (p *pinner) unpin() {
+	if p == nil || p.refs == nil {
+		return
+	}
+	for i := range p.refs {
+		setPinned(p.refs[i], false)
+	}
+	// The following two lines make all pointers to references
+	// in p.refs unreachable, either by deleting them or dropping
+	// p.refs' backing store (if it was not backed by refStore).
+	p.refStore = [pinnerRefStoreSize]unsafe.Pointer{}
+	p.refs = p.refStore[:0]
+}
+
+func pinnerGetPtr(i *any) unsafe.Pointer {
+	e := efaceOf(i)
+	etyp := e._type
+	if etyp == nil {
+		panic(errorString("runtime.Pinner: argument is nil"))
+	}
+	if kind := etyp.Kind_ & kindMask; kind != kindPtr && kind != kindUnsafePointer {
+		panic(errorString("runtime.Pinner: argument is not a pointer: " + toRType(etyp).string()))
+	}
+	if inUserArenaChunk(uintptr(e.data)) {
+		// Arena-allocated objects are not eligible for pinning.
+		panic(errorString("runtime.Pinner: object was allocated into an arena"))
+	}
+	return e.data
+}
+
+// isPinned checks if a Go pointer is pinned.
+// nosplit, because it's called from nosplit code in cgocheck.
+//
+//go:nosplit
+func isPinned(ptr unsafe.Pointer) bool {
+	span := spanOfHeap(uintptr(ptr))
+	if span == nil {
+		// this code is only called for Go pointer, so this must be a
+		// linker-allocated global object.
+		return true
+	}
+	pinnerBits := span.getPinnerBits()
+	// these pinnerBits might get unlinked by a concurrently running sweep, but
+	// that's OK because gcBits don't get cleared until the following GC cycle
+	// (nextMarkBitArenaEpoch)
+	if pinnerBits == nil {
+		return false
+	}
+	objIndex := span.objIndex(uintptr(ptr))
+	pinState := pinnerBits.ofObject(objIndex)
+	KeepAlive(ptr) // make sure ptr is alive until we are done so the span can't be freed
+	return pinState.isPinned()
+}
+
+// setPinned marks or unmarks a Go pointer as pinned.
+func setPinned(ptr unsafe.Pointer, pin bool) {
+	span := spanOfHeap(uintptr(ptr))
+	if span == nil {
+		if isGoPointerWithoutSpan(ptr) {
+			// this is a linker-allocated or zero size object, nothing to do.
+			return
+		}
+		panic(errorString("runtime.Pinner.Pin: argument is not a Go pointer"))
+	}
+
+	// ensure that the span is swept, b/c sweeping accesses the specials list
+	// w/o locks.
+	mp := acquirem()
+	span.ensureSwept()
+	KeepAlive(ptr) // make sure ptr is still alive after span is swept
+
+	objIndex := span.objIndex(uintptr(ptr))
+
+	lock(&span.speciallock) // guard against concurrent calls of setPinned on same span
+
+	pinnerBits := span.getPinnerBits()
+	if pinnerBits == nil {
+		pinnerBits = span.newPinnerBits()
+		span.setPinnerBits(pinnerBits)
+	}
+	pinState := pinnerBits.ofObject(objIndex)
+	if pin {
+		if pinState.isPinned() {
+			// multiple pins on same object, set multipin bit
+			pinState.setMultiPinned(true)
+			// and increase the pin counter
+			// TODO(mknyszek): investigate if systemstack is necessary here
+			systemstack(func() {
+				offset := objIndex * span.elemsize
+				span.incPinCounter(offset)
+			})
+		} else {
+			// set pin bit
+			pinState.setPinned(true)
+		}
+	} else {
+		// unpin
+		if pinState.isPinned() {
+			if pinState.isMultiPinned() {
+				var exists bool
+				// TODO(mknyszek): investigate if systemstack is necessary here
+				systemstack(func() {
+					offset := objIndex * span.elemsize
+					exists = span.decPinCounter(offset)
+				})
+				if !exists {
+					// counter is 0, clear multipin bit
+					pinState.setMultiPinned(false)
+				}
+			} else {
+				// no multipins recorded. unpin object.
+				pinState.setPinned(false)
+			}
+		} else {
+			// unpinning unpinned object, bail out
+			throw("runtime.Pinner: object already unpinned")
+		}
+	}
+	unlock(&span.speciallock)
+	releasem(mp)
+	return
+}
+
+type pinState struct {
+	bytep   *uint8
+	byteVal uint8
+	mask    uint8
+}
+
+// nosplit, because it's called by isPinned, which is nosplit
+//
+//go:nosplit
+func (v *pinState) isPinned() bool {
+	return (v.byteVal & v.mask) != 0
+}
+
+func (v *pinState) isMultiPinned() bool {
+	return (v.byteVal & (v.mask << 1)) != 0
+}
+
+func (v *pinState) setPinned(val bool) {
+	v.set(val, false)
+}
+
+func (v *pinState) setMultiPinned(val bool) {
+	v.set(val, true)
+}
+
+// set sets the pin bit of the pinState to val. If multipin is true, it
+// sets/unsets the multipin bit instead.
+func (v *pinState) set(val bool, multipin bool) {
+	mask := v.mask
+	if multipin {
+		mask <<= 1
+	}
+	if val {
+		atomic.Or8(v.bytep, mask)
+	} else {
+		atomic.And8(v.bytep, ^mask)
+	}
+}
+
+// pinnerBits is the same type as gcBits but has different methods.
+type pinnerBits gcBits
+
+// ofObject returns the pinState of the n'th object.
+// nosplit, because it's called by isPinned, which is nosplit
+//
+//go:nosplit
+func (p *pinnerBits) ofObject(n uintptr) pinState {
+	bytep, mask := (*gcBits)(p).bitp(n * 2)
+	byteVal := atomic.Load8(bytep)
+	return pinState{bytep, byteVal, mask}
+}
+
+func (s *mspan) pinnerBitSize() uintptr {
+	return divRoundUp(s.nelems*2, 8)
+}
+
+// newPinnerBits returns a pointer to 8 byte aligned bytes to be used for this
+// span's pinner bits. newPinneBits is used to mark objects that are pinned.
+// They are copied when the span is swept.
+func (s *mspan) newPinnerBits() *pinnerBits {
+	return (*pinnerBits)(newMarkBits(s.nelems * 2))
+}
+
+// nosplit, because it's called by isPinned, which is nosplit
+//
+//go:nosplit
+func (s *mspan) getPinnerBits() *pinnerBits {
+	return (*pinnerBits)(atomic.Loadp(unsafe.Pointer(&s.pinnerBits)))
+}
+
+func (s *mspan) setPinnerBits(p *pinnerBits) {
+	atomicstorep(unsafe.Pointer(&s.pinnerBits), unsafe.Pointer(p))
+}
+
+// refreshPinnerBits replaces pinnerBits with a fresh copy in the arenas for the
+// next GC cycle. If it does not contain any pinned objects, pinnerBits of the
+// span is set to nil.
+func (s *mspan) refreshPinnerBits() {
+	p := s.getPinnerBits()
+	if p == nil {
+		return
+	}
+
+	hasPins := false
+	bytes := alignUp(s.pinnerBitSize(), 8)
+
+	// Iterate over each 8-byte chunk and check for pins. Note that
+	// newPinnerBits guarantees that pinnerBits will be 8-byte aligned, so we
+	// don't have to worry about edge cases, irrelevant bits will simply be
+	// zero.
+	for _, x := range unsafe.Slice((*uint64)(unsafe.Pointer(&p.x)), bytes/8) {
+		if x != 0 {
+			hasPins = true
+			break
+		}
+	}
+
+	if hasPins {
+		newPinnerBits := s.newPinnerBits()
+		memmove(unsafe.Pointer(&newPinnerBits.x), unsafe.Pointer(&p.x), bytes)
+		s.setPinnerBits(newPinnerBits)
+	} else {
+		s.setPinnerBits(nil)
+	}
+}
+
+// incPinCounter is only called for multiple pins of the same object and records
+// the _additional_ pins.
+func (span *mspan) incPinCounter(offset uintptr) {
+	var rec *specialPinCounter
+	ref, exists := span.specialFindSplicePoint(offset, _KindSpecialPinCounter)
+	if !exists {
+		lock(&mheap_.speciallock)
+		rec = (*specialPinCounter)(mheap_.specialPinCounterAlloc.alloc())
+		unlock(&mheap_.speciallock)
+		// splice in record, fill in offset.
+		rec.special.offset = uint16(offset)
+		rec.special.kind = _KindSpecialPinCounter
+		rec.special.next = *ref
+		*ref = (*special)(unsafe.Pointer(rec))
+		spanHasSpecials(span)
+	} else {
+		rec = (*specialPinCounter)(unsafe.Pointer(*ref))
+	}
+	rec.counter++
+}
+
+// decPinCounter decreases the counter. If the counter reaches 0, the counter
+// special is deleted and false is returned. Otherwise true is returned.
+func (span *mspan) decPinCounter(offset uintptr) bool {
+	ref, exists := span.specialFindSplicePoint(offset, _KindSpecialPinCounter)
+	if !exists {
+		throw("runtime.Pinner: decreased non-existing pin counter")
+	}
+	counter := (*specialPinCounter)(unsafe.Pointer(*ref))
+	counter.counter--
+	if counter.counter == 0 {
+		*ref = counter.special.next
+		if span.specials == nil {
+			spanHasNoSpecials(span)
+		}
+		lock(&mheap_.speciallock)
+		mheap_.specialPinCounterAlloc.free(unsafe.Pointer(counter))
+		unlock(&mheap_.speciallock)
+		return false
+	}
+	return true
+}
+
+// only for tests
+func pinnerGetPinCounter(addr unsafe.Pointer) *uintptr {
+	_, span, objIndex := findObject(uintptr(addr), 0, 0)
+	offset := objIndex * span.elemsize
+	t, exists := span.specialFindSplicePoint(offset, _KindSpecialPinCounter)
+	if !exists {
+		return nil
+	}
+	counter := (*specialPinCounter)(unsafe.Pointer(*t))
+	return &counter.counter
+}
+
+// to be able to test that the GC panics when a pinned pointer is leaking, this
+// panic function is a variable, that can be overwritten by a test.
+var pinnerLeakPanic = func() {
+	panic(errorString("runtime.Pinner: found leaking pinned pointer; forgot to call Unpin()?"))
+}
diff --git a/src/runtime/pinner_test.go b/src/runtime/pinner_test.go
new file mode 100644
index 0000000..88ead7c
--- /dev/null
+++ b/src/runtime/pinner_test.go
@@ -0,0 +1,524 @@
+// Copyright 2023 The Go Authors. 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 obj struct {
+	x int64
+	y int64
+	z int64
+}
+
+type objWith[T any] struct {
+	x int64
+	y int64
+	z int64
+	o T
+}
+
+var (
+	globalUintptr                uintptr
+	globalPtrToObj               = &obj{}
+	globalPtrToObjWithPtr        = &objWith[*uintptr]{}
+	globalPtrToRuntimeObj        = func() *obj { return &obj{} }()
+	globalPtrToRuntimeObjWithPtr = func() *objWith[*uintptr] { return &objWith[*uintptr]{} }()
+)
+
+func assertDidPanic(t *testing.T) {
+	if recover() == nil {
+		t.Fatal("did not panic")
+	}
+}
+
+func assertCgoCheckPanics(t *testing.T, p any) {
+	defer func() {
+		if recover() == nil {
+			t.Fatal("cgoCheckPointer() did not panic, make sure the tests run with cgocheck=1")
+		}
+	}()
+	runtime.CgoCheckPointer(p, true)
+}
+
+func TestPinnerSimple(t *testing.T) {
+	var pinner runtime.Pinner
+	p := new(obj)
+	addr := unsafe.Pointer(p)
+	if runtime.IsPinned(addr) {
+		t.Fatal("already marked as pinned")
+	}
+	pinner.Pin(p)
+	if !runtime.IsPinned(addr) {
+		t.Fatal("not marked as pinned")
+	}
+	if runtime.GetPinCounter(addr) != nil {
+		t.Fatal("pin counter should not exist")
+	}
+	pinner.Unpin()
+	if runtime.IsPinned(addr) {
+		t.Fatal("still marked as pinned")
+	}
+}
+
+func TestPinnerPinKeepsAliveAndReleases(t *testing.T) {
+	var pinner runtime.Pinner
+	p := new(obj)
+	done := make(chan struct{})
+	runtime.SetFinalizer(p, func(any) {
+		done <- struct{}{}
+	})
+	pinner.Pin(p)
+	p = nil
+	runtime.GC()
+	runtime.GC()
+	select {
+	case <-done:
+		t.Fatal("Pin() didn't keep object alive")
+	case <-time.After(time.Millisecond * 10):
+		break
+	}
+	pinner.Unpin()
+	runtime.GC()
+	runtime.GC()
+	select {
+	case <-done:
+		break
+	case <-time.After(time.Second):
+		t.Fatal("Unpin() didn't release object")
+	}
+}
+
+func TestPinnerMultiplePinsSame(t *testing.T) {
+	const N = 100
+	var pinner runtime.Pinner
+	p := new(obj)
+	addr := unsafe.Pointer(p)
+	if runtime.IsPinned(addr) {
+		t.Fatal("already marked as pinned")
+	}
+	for i := 0; i < N; i++ {
+		pinner.Pin(p)
+	}
+	if !runtime.IsPinned(addr) {
+		t.Fatal("not marked as pinned")
+	}
+	if cnt := runtime.GetPinCounter(addr); cnt == nil || *cnt != N-1 {
+		t.Fatalf("pin counter incorrect: %d", *cnt)
+	}
+	pinner.Unpin()
+	if runtime.IsPinned(addr) {
+		t.Fatal("still marked as pinned")
+	}
+	if runtime.GetPinCounter(addr) != nil {
+		t.Fatal("pin counter was not deleted")
+	}
+}
+
+func TestPinnerTwoPinner(t *testing.T) {
+	var pinner1, pinner2 runtime.Pinner
+	p := new(obj)
+	addr := unsafe.Pointer(p)
+	if runtime.IsPinned(addr) {
+		t.Fatal("already marked as pinned")
+	}
+	pinner1.Pin(p)
+	if !runtime.IsPinned(addr) {
+		t.Fatal("not marked as pinned")
+	}
+	if runtime.GetPinCounter(addr) != nil {
+		t.Fatal("pin counter should not exist")
+	}
+	pinner2.Pin(p)
+	if !runtime.IsPinned(addr) {
+		t.Fatal("not marked as pinned")
+	}
+	if cnt := runtime.GetPinCounter(addr); cnt == nil || *cnt != 1 {
+		t.Fatalf("pin counter incorrect: %d", *cnt)
+	}
+	pinner1.Unpin()
+	if !runtime.IsPinned(addr) {
+		t.Fatal("not marked as pinned")
+	}
+	if runtime.GetPinCounter(addr) != nil {
+		t.Fatal("pin counter should not exist")
+	}
+	pinner2.Unpin()
+	if runtime.IsPinned(addr) {
+		t.Fatal("still marked as pinned")
+	}
+	if runtime.GetPinCounter(addr) != nil {
+		t.Fatal("pin counter was not deleted")
+	}
+}
+
+func TestPinnerPinZerosizeObj(t *testing.T) {
+	var pinner runtime.Pinner
+	defer pinner.Unpin()
+	p := new(struct{})
+	pinner.Pin(p)
+	if !runtime.IsPinned(unsafe.Pointer(p)) {
+		t.Fatal("not marked as pinned")
+	}
+}
+
+func TestPinnerPinGlobalPtr(t *testing.T) {
+	var pinner runtime.Pinner
+	defer pinner.Unpin()
+	pinner.Pin(globalPtrToObj)
+	pinner.Pin(globalPtrToObjWithPtr)
+	pinner.Pin(globalPtrToRuntimeObj)
+	pinner.Pin(globalPtrToRuntimeObjWithPtr)
+}
+
+func TestPinnerPinTinyObj(t *testing.T) {
+	var pinner runtime.Pinner
+	const N = 64
+	var addr [N]unsafe.Pointer
+	for i := 0; i < N; i++ {
+		p := new(bool)
+		addr[i] = unsafe.Pointer(p)
+		pinner.Pin(p)
+		pinner.Pin(p)
+		if !runtime.IsPinned(addr[i]) {
+			t.Fatalf("not marked as pinned: %d", i)
+		}
+		if cnt := runtime.GetPinCounter(addr[i]); cnt == nil || *cnt == 0 {
+			t.Fatalf("pin counter incorrect: %d, %d", *cnt, i)
+		}
+	}
+	pinner.Unpin()
+	for i := 0; i < N; i++ {
+		if runtime.IsPinned(addr[i]) {
+			t.Fatal("still marked as pinned")
+		}
+		if runtime.GetPinCounter(addr[i]) != nil {
+			t.Fatal("pin counter should not exist")
+		}
+	}
+}
+
+func TestPinnerInterface(t *testing.T) {
+	var pinner runtime.Pinner
+	o := new(obj)
+	ifc := any(o)
+	pinner.Pin(&ifc)
+	if !runtime.IsPinned(unsafe.Pointer(&ifc)) {
+		t.Fatal("not marked as pinned")
+	}
+	if runtime.IsPinned(unsafe.Pointer(o)) {
+		t.Fatal("marked as pinned")
+	}
+	pinner.Unpin()
+	pinner.Pin(ifc)
+	if !runtime.IsPinned(unsafe.Pointer(o)) {
+		t.Fatal("not marked as pinned")
+	}
+	if runtime.IsPinned(unsafe.Pointer(&ifc)) {
+		t.Fatal("marked as pinned")
+	}
+	pinner.Unpin()
+}
+
+func TestPinnerPinNonPtrPanics(t *testing.T) {
+	var pinner runtime.Pinner
+	defer pinner.Unpin()
+	var i int
+	defer assertDidPanic(t)
+	pinner.Pin(i)
+}
+
+func TestPinnerReuse(t *testing.T) {
+	var pinner runtime.Pinner
+	p := new(obj)
+	p2 := &p
+	assertCgoCheckPanics(t, p2)
+	pinner.Pin(p)
+	runtime.CgoCheckPointer(p2, true)
+	pinner.Unpin()
+	assertCgoCheckPanics(t, p2)
+	pinner.Pin(p)
+	runtime.CgoCheckPointer(p2, true)
+	pinner.Unpin()
+}
+
+func TestPinnerEmptyUnpin(t *testing.T) {
+	var pinner runtime.Pinner
+	pinner.Unpin()
+	pinner.Unpin()
+}
+
+func TestPinnerLeakPanics(t *testing.T) {
+	old := runtime.GetPinnerLeakPanic()
+	func() {
+		defer assertDidPanic(t)
+		old()
+	}()
+	done := make(chan struct{})
+	runtime.SetPinnerLeakPanic(func() {
+		done <- struct{}{}
+	})
+	func() {
+		var pinner runtime.Pinner
+		p := new(obj)
+		pinner.Pin(p)
+	}()
+	runtime.GC()
+	runtime.GC()
+	select {
+	case <-done:
+		break
+	case <-time.After(time.Second):
+		t.Fatal("leak didn't make GC to panic")
+	}
+	runtime.SetPinnerLeakPanic(old)
+}
+
+func TestPinnerCgoCheckPtr2Ptr(t *testing.T) {
+	var pinner runtime.Pinner
+	defer pinner.Unpin()
+	p := new(obj)
+	p2 := &objWith[*obj]{o: p}
+	assertCgoCheckPanics(t, p2)
+	pinner.Pin(p)
+	runtime.CgoCheckPointer(p2, true)
+}
+
+func TestPinnerCgoCheckPtr2UnsafePtr(t *testing.T) {
+	var pinner runtime.Pinner
+	defer pinner.Unpin()
+	p := unsafe.Pointer(new(obj))
+	p2 := &objWith[unsafe.Pointer]{o: p}
+	assertCgoCheckPanics(t, p2)
+	pinner.Pin(p)
+	runtime.CgoCheckPointer(p2, true)
+}
+
+func TestPinnerCgoCheckPtr2UnknownPtr(t *testing.T) {
+	var pinner runtime.Pinner
+	defer pinner.Unpin()
+	p := unsafe.Pointer(new(obj))
+	p2 := &p
+	func() {
+		defer assertDidPanic(t)
+		runtime.CgoCheckPointer(p2, nil)
+	}()
+	pinner.Pin(p)
+	runtime.CgoCheckPointer(p2, nil)
+}
+
+func TestPinnerCgoCheckInterface(t *testing.T) {
+	var pinner runtime.Pinner
+	defer pinner.Unpin()
+	var ifc any
+	var o obj
+	ifc = &o
+	p := &ifc
+	assertCgoCheckPanics(t, p)
+	pinner.Pin(&o)
+	runtime.CgoCheckPointer(p, true)
+}
+
+func TestPinnerCgoCheckSlice(t *testing.T) {
+	var pinner runtime.Pinner
+	defer pinner.Unpin()
+	sl := []int{1, 2, 3}
+	assertCgoCheckPanics(t, &sl)
+	pinner.Pin(&sl[0])
+	runtime.CgoCheckPointer(&sl, true)
+}
+
+func TestPinnerCgoCheckString(t *testing.T) {
+	var pinner runtime.Pinner
+	defer pinner.Unpin()
+	b := []byte("foobar")
+	str := unsafe.String(&b[0], 6)
+	assertCgoCheckPanics(t, &str)
+	pinner.Pin(&b[0])
+	runtime.CgoCheckPointer(&str, true)
+}
+
+func TestPinnerCgoCheckPinned2UnpinnedPanics(t *testing.T) {
+	var pinner runtime.Pinner
+	defer pinner.Unpin()
+	p := new(obj)
+	p2 := &objWith[*obj]{o: p}
+	assertCgoCheckPanics(t, p2)
+	pinner.Pin(p2)
+	assertCgoCheckPanics(t, p2)
+}
+
+func TestPinnerCgoCheckPtr2Pinned2Unpinned(t *testing.T) {
+	var pinner runtime.Pinner
+	defer pinner.Unpin()
+	p := new(obj)
+	p2 := &objWith[*obj]{o: p}
+	p3 := &objWith[*objWith[*obj]]{o: p2}
+	assertCgoCheckPanics(t, p2)
+	assertCgoCheckPanics(t, p3)
+	pinner.Pin(p2)
+	assertCgoCheckPanics(t, p2)
+	assertCgoCheckPanics(t, p3)
+	pinner.Pin(p)
+	runtime.CgoCheckPointer(p2, true)
+	runtime.CgoCheckPointer(p3, true)
+}
+
+func BenchmarkPinnerPinUnpinBatch(b *testing.B) {
+	const Batch = 1000
+	var data [Batch]*obj
+	for i := 0; i < Batch; i++ {
+		data[i] = new(obj)
+	}
+	b.ResetTimer()
+	for n := 0; n < b.N; n++ {
+		var pinner runtime.Pinner
+		for i := 0; i < Batch; i++ {
+			pinner.Pin(data[i])
+		}
+		pinner.Unpin()
+	}
+}
+
+func BenchmarkPinnerPinUnpinBatchDouble(b *testing.B) {
+	const Batch = 1000
+	var data [Batch]*obj
+	for i := 0; i < Batch; i++ {
+		data[i] = new(obj)
+	}
+	b.ResetTimer()
+	for n := 0; n < b.N; n++ {
+		var pinner runtime.Pinner
+		for i := 0; i < Batch; i++ {
+			pinner.Pin(data[i])
+			pinner.Pin(data[i])
+		}
+		pinner.Unpin()
+	}
+}
+
+func BenchmarkPinnerPinUnpinBatchTiny(b *testing.B) {
+	const Batch = 1000
+	var data [Batch]*bool
+	for i := 0; i < Batch; i++ {
+		data[i] = new(bool)
+	}
+	b.ResetTimer()
+	for n := 0; n < b.N; n++ {
+		var pinner runtime.Pinner
+		for i := 0; i < Batch; i++ {
+			pinner.Pin(data[i])
+		}
+		pinner.Unpin()
+	}
+}
+
+func BenchmarkPinnerPinUnpin(b *testing.B) {
+	p := new(obj)
+	for n := 0; n < b.N; n++ {
+		var pinner runtime.Pinner
+		pinner.Pin(p)
+		pinner.Unpin()
+	}
+}
+
+func BenchmarkPinnerPinUnpinTiny(b *testing.B) {
+	p := new(bool)
+	for n := 0; n < b.N; n++ {
+		var pinner runtime.Pinner
+		pinner.Pin(p)
+		pinner.Unpin()
+	}
+}
+
+func BenchmarkPinnerPinUnpinDouble(b *testing.B) {
+	p := new(obj)
+	for n := 0; n < b.N; n++ {
+		var pinner runtime.Pinner
+		pinner.Pin(p)
+		pinner.Pin(p)
+		pinner.Unpin()
+	}
+}
+
+func BenchmarkPinnerPinUnpinParallel(b *testing.B) {
+	b.RunParallel(func(pb *testing.PB) {
+		p := new(obj)
+		for pb.Next() {
+			var pinner runtime.Pinner
+			pinner.Pin(p)
+			pinner.Unpin()
+		}
+	})
+}
+
+func BenchmarkPinnerPinUnpinParallelTiny(b *testing.B) {
+	b.RunParallel(func(pb *testing.PB) {
+		p := new(bool)
+		for pb.Next() {
+			var pinner runtime.Pinner
+			pinner.Pin(p)
+			pinner.Unpin()
+		}
+	})
+}
+
+func BenchmarkPinnerPinUnpinParallelDouble(b *testing.B) {
+	b.RunParallel(func(pb *testing.PB) {
+		p := new(obj)
+		for pb.Next() {
+			var pinner runtime.Pinner
+			pinner.Pin(p)
+			pinner.Pin(p)
+			pinner.Unpin()
+		}
+	})
+}
+
+func BenchmarkPinnerIsPinnedOnPinned(b *testing.B) {
+	var pinner runtime.Pinner
+	ptr := new(obj)
+	pinner.Pin(ptr)
+	b.ResetTimer()
+	for n := 0; n < b.N; n++ {
+		runtime.IsPinned(unsafe.Pointer(ptr))
+	}
+	pinner.Unpin()
+}
+
+func BenchmarkPinnerIsPinnedOnUnpinned(b *testing.B) {
+	ptr := new(obj)
+	b.ResetTimer()
+	for n := 0; n < b.N; n++ {
+		runtime.IsPinned(unsafe.Pointer(ptr))
+	}
+}
+
+func BenchmarkPinnerIsPinnedOnPinnedParallel(b *testing.B) {
+	var pinner runtime.Pinner
+	ptr := new(obj)
+	pinner.Pin(ptr)
+	b.ResetTimer()
+	b.RunParallel(func(pb *testing.PB) {
+		for pb.Next() {
+			runtime.IsPinned(unsafe.Pointer(ptr))
+		}
+	})
+	pinner.Unpin()
+}
+
+func BenchmarkPinnerIsPinnedOnUnpinnedParallel(b *testing.B) {
+	ptr := new(obj)
+	b.ResetTimer()
+	b.RunParallel(func(pb *testing.PB) {
+		for pb.Next() {
+			runtime.IsPinned(unsafe.Pointer(ptr))
+		}
+	})
+}
diff --git a/src/runtime/plugin.go b/src/runtime/plugin.go
index a61dcc3..40dfefd 100644
--- a/src/runtime/plugin.go
+++ b/src/runtime/plugin.go
@@ -7,7 +7,7 @@
 import "unsafe"
 
 //go:linkname plugin_lastmoduleinit plugin.lastmoduleinit
-func plugin_lastmoduleinit() (path string, syms map[string]any, errstr string) {
+func plugin_lastmoduleinit() (path string, syms map[string]any, initTasks []*initTask, errstr string) {
 	var md *moduledata
 	for pmd := firstmoduledata.next; pmd != nil; pmd = pmd.next {
 		if pmd.bad {
@@ -23,13 +23,13 @@
 		throw("runtime: plugin has empty pluginpath")
 	}
 	if md.typemap != nil {
-		return "", nil, "plugin already loaded"
+		return "", nil, nil, "plugin already loaded"
 	}
 
 	for _, pmd := range activeModules() {
 		if pmd.pluginpath == md.pluginpath {
 			md.bad = true
-			return "", nil, "plugin already loaded"
+			return "", nil, nil, "plugin already loaded"
 		}
 
 		if inRange(pmd.text, pmd.etext, md.text, md.etext) ||
@@ -51,7 +51,7 @@
 	for _, pkghash := range md.pkghashes {
 		if pkghash.linktimehash != *pkghash.runtimehash {
 			md.bad = true
-			return "", nil, "plugin was built with a different version of package " + pkghash.modulename
+			return "", nil, nil, "plugin was built with a different version of package " + pkghash.modulename
 		}
 	}
 
@@ -79,18 +79,18 @@
 	syms = make(map[string]any, len(md.ptab))
 	for _, ptab := range md.ptab {
 		symName := resolveNameOff(unsafe.Pointer(md.types), ptab.name)
-		t := (*_type)(unsafe.Pointer(md.types)).typeOff(ptab.typ)
+		t := toRType((*_type)(unsafe.Pointer(md.types))).typeOff(ptab.typ) // TODO can this stack of conversions be simpler?
 		var val any
 		valp := (*[2]unsafe.Pointer)(unsafe.Pointer(&val))
 		(*valp)[0] = unsafe.Pointer(t)
 
-		name := symName.name()
-		if t.kind&kindMask == kindFunc {
+		name := symName.Name()
+		if t.Kind_&kindMask == kindFunc {
 			name = "." + name
 		}
 		syms[name] = val
 	}
-	return md.pluginpath, syms, ""
+	return md.pluginpath, syms, md.inittasks, ""
 }
 
 func pluginftabverify(md *moduledata) {
diff --git a/src/runtime/pprof/pprof_test.go b/src/runtime/pprof/pprof_test.go
index 53688ad..56ba6d9 100644
--- a/src/runtime/pprof/pprof_test.go
+++ b/src/runtime/pprof/pprof_test.go
@@ -333,6 +333,23 @@
 	dumpCallers(pcs)
 }
 
+type inlineWrapperInterface interface {
+	dump(stack []uintptr)
+}
+
+type inlineWrapper struct {
+}
+
+func (h inlineWrapper) dump(pcs []uintptr) {
+	dumpCallers(pcs)
+}
+
+func inlinedWrapperCallerDump(pcs []uintptr) {
+	var h inlineWrapperInterface
+	h = &inlineWrapper{}
+	h.dump(pcs)
+}
+
 func TestCPUProfileRecursion(t *testing.T) {
 	matches := matchAndAvoidStacks(stackContains, []string{"runtime/pprof.inlinedCallee", "runtime/pprof.recursionCallee", "runtime/pprof.recursionCaller"}, avoidFunctions())
 	p := testCPUProfile(t, matches, func(dur time.Duration) {
@@ -431,6 +448,8 @@
 		t.Logf("uname -a: %v", vers)
 	case "plan9":
 		t.Skip("skipping on plan9")
+	case "wasip1":
+		t.Skip("skipping on wasip1")
 	}
 
 	broken := cpuProfilingBroken()
@@ -1440,6 +1459,8 @@
 }
 
 func TestGoroutineProfileConcurrency(t *testing.T) {
+	testenv.MustHaveParallelism(t)
+
 	goroutineProf := Lookup("goroutine")
 
 	profilerCalls := func(s string) int {
@@ -1768,6 +1789,7 @@
 }
 
 func TestLabelRace(t *testing.T) {
+	testenv.MustHaveParallelism(t)
 	// Test the race detector annotations for synchronization
 	// between setting labels and consuming them from the
 	// profile.
@@ -1792,6 +1814,7 @@
 }
 
 func TestGoroutineProfileLabelRace(t *testing.T) {
+	testenv.MustHaveParallelism(t)
 	// Test the race detector annotations for synchronization
 	// between setting labels and consuming them from the
 	// goroutine profile. See issue #50292.
@@ -2054,6 +2077,8 @@
 	for i := range pcs {
 		inlinedCallerStack[i] = uint64(pcs[i])
 	}
+	wrapperPCs := make([]uintptr, 1)
+	inlinedWrapperCallerDump(wrapperPCs)
 
 	if _, found := findInlinedCall(recursionChainBottom, 4<<10); !found {
 		t.Skip("Can't determine whether anything was inlined into recursionChainBottom.")
@@ -2226,6 +2251,17 @@
 			{Value: []int64{70, 70 * period}, Location: []*profile.Location{{ID: 1}}},
 			{Value: []int64{80, 80 * period}, Location: []*profile.Location{{ID: 2}, {ID: 1}}},
 		},
+	}, {
+		name: "expand_wrapper_function",
+		input: []uint64{
+			3, 0, 500, // hz = 500. Must match the period.
+			4, 0, 50, uint64(wrapperPCs[0]),
+		},
+		count:    2,
+		wantLocs: [][]string{{"runtime/pprof.inlineWrapper.dump"}},
+		wantSamples: []*profile.Sample{
+			{Value: []int64{50, 50 * period}, Location: []*profile.Location{{ID: 1}}},
+		},
 	}}
 
 	for _, tc := range testCases {
diff --git a/src/runtime/pprof/proto.go b/src/runtime/pprof/proto.go
index b68f30d..cdc4bd7 100644
--- a/src/runtime/pprof/proto.go
+++ b/src/runtime/pprof/proto.go
@@ -197,7 +197,7 @@
 	// TODO: we set HasFunctions if all symbols from samples were symbolized (hasFuncs).
 	// Decide what to do about HasInlineFrames and HasLineNumbers.
 	// Also, another approach to handle the mapping entry with
-	// incomplete symbolization results is to dupliace the mapping
+	// incomplete symbolization results is to duplicate the mapping
 	// entry (but with different Has* fields values) and use
 	// different entries for symbolized locations and unsymbolized locations.
 	if hasFuncs {
@@ -617,7 +617,7 @@
 			b.funcs[frame.Function] = int(funcID)
 			newFuncs = append(newFuncs, newFunc{
 				id:        funcID,
-				name:      frame.Function,
+				name:      runtime_FrameSymbolName(&frame),
 				file:      frame.File,
 				startLine: int64(runtime_FrameStartLine(&frame)),
 			})
diff --git a/src/runtime/pprof/proto_test.go b/src/runtime/pprof/proto_test.go
index 780b481..8ec9c91 100644
--- a/src/runtime/pprof/proto_test.go
+++ b/src/runtime/pprof/proto_test.go
@@ -38,7 +38,7 @@
 }
 
 // fmtJSON returns a pretty-printed JSON form for x.
-// It works reasonbly well for printing protocol-buffer
+// It works reasonably well for printing protocol-buffer
 // data structures like profile.Profile.
 func fmtJSON(x any) string {
 	js, _ := json.MarshalIndent(x, "", "\t")
@@ -131,7 +131,7 @@
 			BuildID:      peBuildID(exe),
 			HasFunctions: true,
 		}
-	case "js":
+	case "js", "wasip1":
 		addr1 = uint64(abi.FuncPCABIInternal(f1))
 		addr2 = uint64(abi.FuncPCABIInternal(f2))
 	default:
diff --git a/src/runtime/pprof/runtime.go b/src/runtime/pprof/runtime.go
index 57e9ca4..71f89ca 100644
--- a/src/runtime/pprof/runtime.go
+++ b/src/runtime/pprof/runtime.go
@@ -11,8 +11,15 @@
 )
 
 // runtime_FrameStartLine is defined in runtime/symtab.go.
+//
+//go:noescape
 func runtime_FrameStartLine(f *runtime.Frame) int
 
+// runtime_FrameSymbolName is defined in runtime/symtab.go.
+//
+//go:noescape
+func runtime_FrameSymbolName(f *runtime.Frame) string
+
 // runtime_expandFinalInlineFrame is defined in runtime/symtab.go.
 func runtime_expandFinalInlineFrame(stk []uintptr) []uintptr
 
diff --git a/src/runtime/preempt.go b/src/runtime/preempt.go
index 4f62fc6..76d8ba4 100644
--- a/src/runtime/preempt.go
+++ b/src/runtime/preempt.go
@@ -172,7 +172,7 @@
 			// _Gscan bit and thus own the stack.
 			gp.preemptStop = false
 			gp.preempt = false
-			gp.stackguard0 = gp.stack.lo + _StackGuard
+			gp.stackguard0 = gp.stack.lo + stackGuard
 
 			// The goroutine was already at a safe-point
 			// and we've now locked that in.
@@ -320,7 +320,7 @@
 	total += funcMaxSPDelta(f)
 	// Add some overhead for return PCs, etc.
 	asyncPreemptStack = uintptr(total) + 8*goarch.PtrSize
-	if asyncPreemptStack > _StackLimit {
+	if asyncPreemptStack > stackNosplit {
 		// We need more than the nosplit limit. This isn't
 		// unsafe, but it may limit asynchronous preemption.
 		//
@@ -396,14 +396,14 @@
 		// use the LR for unwinding, which will be bad.
 		return false, 0
 	}
-	up, startpc := pcdatavalue2(f, _PCDATA_UnsafePoint, pc)
-	if up == _PCDATA_UnsafePointUnsafe {
+	up, startpc := pcdatavalue2(f, abi.PCDATA_UnsafePoint, pc)
+	if up == abi.UnsafePointUnsafe {
 		// Unsafe-point marked by compiler. This includes
 		// atomic sequences (e.g., write barrier) and nosplit
 		// functions (except at calls).
 		return false, 0
 	}
-	if fd := funcdata(f, _FUNCDATA_LocalsPointerMaps); fd == nil || f.flag&funcFlag_ASM != 0 {
+	if fd := funcdata(f, abi.FUNCDATA_LocalsPointerMaps); fd == nil || f.flag&abi.FuncFlagAsm != 0 {
 		// This is assembly code. Don't assume it's well-formed.
 		// TODO: Empirically we still need the fd == nil check. Why?
 		//
@@ -413,14 +413,9 @@
 		// except the ones that have funcFlag_SPWRITE set in f.flag.
 		return false, 0
 	}
-	name := funcname(f)
-	if inldata := funcdata(f, _FUNCDATA_InlTree); inldata != nil {
-		inltree := (*[1 << 20]inlinedCall)(inldata)
-		ix := pcdatavalue(f, _PCDATA_InlTreeIndex, pc, nil)
-		if ix >= 0 {
-			name = funcnameFromNameOff(f, inltree[ix].nameOff)
-		}
-	}
+	// Check the inner-most name
+	u, uf := newInlineUnwinder(f, pc, nil)
+	name := u.srcFunc(uf).name()
 	if hasPrefix(name, "runtime.") ||
 		hasPrefix(name, "runtime/internal/") ||
 		hasPrefix(name, "reflect.") {
@@ -437,14 +432,14 @@
 		return false, 0
 	}
 	switch up {
-	case _PCDATA_Restart1, _PCDATA_Restart2:
+	case abi.UnsafePointRestart1, abi.UnsafePointRestart2:
 		// Restartable instruction sequence. Back off PC to
 		// the start PC.
 		if startpc == 0 || startpc > pc || pc-startpc > 20 {
 			throw("bad restart PC")
 		}
 		return true, startpc
-	case _PCDATA_RestartAtEntry:
+	case abi.UnsafePointRestartAtEntry:
 		// Restart from the function entry at resumption.
 		return true, f.entry()
 	}
diff --git a/src/runtime/preempt_loong64.s b/src/runtime/preempt_loong64.s
index ba59a07..bb9c948 100644
--- a/src/runtime/preempt_loong64.s
+++ b/src/runtime/preempt_loong64.s
@@ -4,8 +4,8 @@
 #include "textflag.h"
 
 TEXT ·asyncPreempt(SB),NOSPLIT|NOFRAME,$0-0
-	MOVV R1, -472(R3)
-	SUBV $472, R3
+	MOVV R1, -480(R3)
+	SUBV $480, R3
 	MOVV R4, 8(R3)
 	MOVV R5, 16(R3)
 	MOVV R6, 24(R3)
@@ -31,7 +31,7 @@
 	MOVV R27, 184(R3)
 	MOVV R28, 192(R3)
 	MOVV R29, 200(R3)
-	MOVV RSB, 208(R3)
+	MOVV R31, 208(R3)
 	MOVD F0, 216(R3)
 	MOVD F1, 224(R3)
 	MOVD F2, 232(R3)
@@ -64,7 +64,11 @@
 	MOVD F29, 448(R3)
 	MOVD F30, 456(R3)
 	MOVD F31, 464(R3)
+	MOVV FCC0, R4
+	MOVV R4, 472(R3)
 	CALL ·asyncPreempt2(SB)
+	MOVV 472(R3), R4
+	MOVV R4, FCC0
 	MOVD 464(R3), F31
 	MOVD 456(R3), F30
 	MOVD 448(R3), F29
@@ -97,7 +101,7 @@
 	MOVD 232(R3), F2
 	MOVD 224(R3), F1
 	MOVD 216(R3), F0
-	MOVV 208(R3), RSB
+	MOVV 208(R3), R31
 	MOVV 200(R3), R29
 	MOVV 192(R3), R28
 	MOVV 184(R3), R27
@@ -123,7 +127,7 @@
 	MOVV 24(R3), R6
 	MOVV 16(R3), R5
 	MOVV 8(R3), R4
-	MOVV 472(R3), R1
+	MOVV 480(R3), R1
 	MOVV (R3), R30
-	ADDV $480, R3
+	ADDV $488, R3
 	JMP (R30)
diff --git a/src/runtime/print.go b/src/runtime/print.go
index a1e0b8e..0b05aed 100644
--- a/src/runtime/print.go
+++ b/src/runtime/print.go
@@ -35,7 +35,7 @@
 //
 // The text written during a process crash (following "panic" or "fatal
 // error") is not saved, since the goroutine stacks will generally be readable
-// from the runtime datastructures in the core file.
+// from the runtime data structures in the core file.
 func recordForPanic(b []byte) {
 	printlock()
 
diff --git a/src/runtime/proc.go b/src/runtime/proc.go
index 554a60d..afb33c1 100644
--- a/src/runtime/proc.go
+++ b/src/runtime/proc.go
@@ -115,13 +115,12 @@
 	g0           g
 	mcache0      *mcache
 	raceprocctx0 uintptr
+	raceFiniLock mutex
 )
 
-//go:linkname runtime_inittask runtime..inittask
-var runtime_inittask initTask
-
-//go:linkname main_inittask main..inittask
-var main_inittask initTask
+// This slice records the initializing tasks that need to be
+// done to start up the runtime. It is built by the linker.
+var runtime_inittasks []*initTask
 
 // main_init_done is a signal used by cgocallbackg that initialization
 // has been completed. It is made before _cgo_notify_runtime_init_done,
@@ -196,7 +195,7 @@
 		inittrace.active = true
 	}
 
-	doInit(&runtime_inittask) // Must be before defer.
+	doInit(runtime_inittasks) // Must be before defer.
 
 	// Defer unlock so that runtime.Goexit during init does the unlock too.
 	needUnlock := true
@@ -210,6 +209,10 @@
 
 	main_init_done = make(chan bool)
 	if iscgo {
+		if _cgo_pthread_key_created == nil {
+			throw("_cgo_pthread_key_created missing")
+		}
+
 		if _cgo_thread_start == nil {
 			throw("_cgo_thread_start missing")
 		}
@@ -224,13 +227,27 @@
 		if _cgo_notify_runtime_init_done == nil {
 			throw("_cgo_notify_runtime_init_done missing")
 		}
+
+		// Set the x_crosscall2_ptr C function pointer variable point to crosscall2.
+		if set_crosscall2 == nil {
+			throw("set_crosscall2 missing")
+		}
+		set_crosscall2()
+
 		// Start the template thread in case we enter Go from
 		// a C-created thread and need to create a new thread.
 		startTemplateThread()
 		cgocall(_cgo_notify_runtime_init_done, nil)
 	}
 
-	doInit(&main_inittask)
+	// Run the initializing tasks. Depending on build mode this
+	// list can arrive a few different ways, but it will always
+	// contain the init tasks computed by the linker for all the
+	// packages in the program (excluding those added at runtime
+	// by package plugin).
+	for _, m := range activeModules() {
+		doInit(m.inittasks)
+	}
 
 	// Disable init tracing after main init done to avoid overhead
 	// of collecting statistics in malloc and newproc
@@ -267,7 +284,7 @@
 		}
 	}
 	if panicking.Load() != 0 {
-		gopark(nil, nil, waitReasonPanicWait, traceEvGoStop, 1)
+		gopark(nil, nil, waitReasonPanicWait, traceBlockForever, 1)
 	}
 	runExitHooks(0)
 
@@ -302,7 +319,7 @@
 			throw("forcegc: phase error")
 		}
 		forcegc.idle.Store(true)
-		goparkunlock(&forcegc.lock, waitReasonForceGCIdle, traceEvGoBlock, 1)
+		goparkunlock(&forcegc.lock, waitReasonForceGCIdle, traceBlockSystemGoroutine, 1)
 		// this goroutine is explicitly resumed by sysmon
 		if debug.gctrace > 0 {
 			println("GC forced")
@@ -312,10 +329,10 @@
 	}
 }
 
-//go:nosplit
-
 // Gosched yields the processor, allowing other goroutines to run. It does not
 // suspend the current goroutine, so execution resumes automatically.
+//
+//go:nosplit
 func Gosched() {
 	checkTimeouts()
 	mcall(gosched_m)
@@ -361,7 +378,7 @@
 // Reason explains why the goroutine has been parked. It is displayed in stack
 // traces and heap dumps. Reasons should be unique and descriptive. Do not
 // re-use reasons, add new ones.
-func gopark(unlockf func(*g, unsafe.Pointer) bool, lock unsafe.Pointer, reason waitReason, traceEv byte, traceskip int) {
+func gopark(unlockf func(*g, unsafe.Pointer) bool, lock unsafe.Pointer, reason waitReason, traceReason traceBlockReason, traceskip int) {
 	if reason != waitReasonSleep {
 		checkTimeouts() // timeouts may expire while two goroutines keep the scheduler busy
 	}
@@ -374,8 +391,8 @@
 	mp.waitlock = lock
 	mp.waitunlockf = unlockf
 	gp.waitreason = reason
-	mp.waittraceev = traceEv
-	mp.waittraceskip = traceskip
+	mp.waitTraceBlockReason = traceReason
+	mp.waitTraceSkip = traceskip
 	releasem(mp)
 	// can't do anything that might move the G between Ms here.
 	mcall(park_m)
@@ -383,8 +400,8 @@
 
 // Puts the current goroutine into a waiting state and unlocks the lock.
 // The goroutine can be made runnable again by calling goready(gp).
-func goparkunlock(lock *mutex, reason waitReason, traceEv byte, traceskip int) {
-	gopark(parkunlock_c, unsafe.Pointer(lock), reason, traceEv, traceskip)
+func goparkunlock(lock *mutex, reason waitReason, traceReason traceBlockReason, traceskip int) {
+	gopark(parkunlock_c, unsafe.Pointer(lock), reason, traceReason, traceskip)
 }
 
 func goready(gp *g, traceskip int) {
@@ -685,11 +702,8 @@
 	lockInit(&allpLock, lockRankAllp)
 	lockInit(&reflectOffs.lock, lockRankReflectOffs)
 	lockInit(&finlock, lockRankFin)
-	lockInit(&trace.bufLock, lockRankTraceBuf)
-	lockInit(&trace.stringsLock, lockRankTraceStrings)
-	lockInit(&trace.lock, lockRankTrace)
 	lockInit(&cpuprof.lock, lockRankCpuprof)
-	lockInit(&trace.stackTab.lock, lockRankTraceStackTab)
+	traceLockInit()
 	// Enforce that this lock is always a leaf lock.
 	// All of this lock's critical sections should be
 	// extremely short.
@@ -726,6 +740,7 @@
 
 	goargs()
 	goenvs()
+	secure()
 	parsedebugvars()
 	gcinit()
 
@@ -751,17 +766,6 @@
 	// World is effectively started now, as P's can run.
 	worldStarted()
 
-	// For cgocheck > 1, we turn on the write barrier at all times
-	// and check all pointer writes. We can't do this until after
-	// procresize because the write barrier needs a P.
-	if debug.cgocheck > 1 {
-		writeBarrier.cgo = true
-		writeBarrier.enabled = true
-		for _, pp := range allp {
-			pp.wbBuf.reset()
-		}
-	}
-
 	if buildVersion == "" {
 		// Condition should never trigger. This code just serves
 		// to ensure runtime·buildVersion is kept in the resulting binary.
@@ -784,7 +788,16 @@
 func checkmcount() {
 	assertLockHeld(&sched.lock)
 
-	if mcount() > sched.maxmcount {
+	// Exclude extra M's, which are used for cgocallback from threads
+	// created in C.
+	//
+	// The purpose of the SetMaxThreads limit is to avoid accidental fork
+	// bomb from something like millions of goroutines blocking on system
+	// calls, causing the runtime to create millions of threads. By
+	// definition, this isn't a problem for threads created in C, so we
+	// exclude them from the limit. See https://go.dev/issue/60004.
+	count := mcount() - int32(extraMInUse.Load()) - int32(extraMLength.Load())
+	if count > sched.maxmcount {
 		print("runtime: program exceeds ", sched.maxmcount, "-thread limit\n")
 		throw("thread exhaustion")
 	}
@@ -829,7 +842,7 @@
 		hi = 1
 	}
 	// Same behavior as for 1.17.
-	// TODO: Simplify ths.
+	// TODO: Simplify this.
 	if goarch.BigEndian {
 		mp.fastrand = uint64(lo)<<32 | uint64(hi)
 	} else {
@@ -838,7 +851,7 @@
 
 	mpreinit(mp)
 	if mp.gsignal != nil {
-		mp.gsignal.stackguard1 = mp.gsignal.stack.lo + _StackGuard
+		mp.gsignal.stackguard1 = mp.gsignal.stack.lo + stackGuard
 	}
 
 	// Add to allm so garbage collector doesn't free g->m
@@ -862,6 +875,10 @@
 	sched.needspinning.Store(0)
 }
 
+func (mp *m) hasCgoOnStack() bool {
+	return mp.ncgo > 0 || mp.isextra
+}
+
 var fastrandseed uintptr
 
 func fastrandinit() {
@@ -871,7 +888,7 @@
 
 // Mark gp ready to run.
 func ready(gp *g, traceskip int, next bool) {
-	if trace.enabled {
+	if traceEnabled() {
 		traceGoUnpark(gp, traceskip)
 	}
 
@@ -904,6 +921,35 @@
 // This function must not lock any mutexes.
 func freezetheworld() {
 	freezing.Store(true)
+	if debug.dontfreezetheworld > 0 {
+		// Don't prempt Ps to stop goroutines. That will perturb
+		// scheduler state, making debugging more difficult. Instead,
+		// allow goroutines to continue execution.
+		//
+		// fatalpanic will tracebackothers to trace all goroutines. It
+		// is unsafe to trace a running goroutine, so tracebackothers
+		// will skip running goroutines. That is OK and expected, we
+		// expect users of dontfreezetheworld to use core files anyway.
+		//
+		// However, allowing the scheduler to continue running free
+		// introduces a race: a goroutine may be stopped when
+		// tracebackothers checks its status, and then start running
+		// later when we are in the middle of traceback, potentially
+		// causing a crash.
+		//
+		// To mitigate this, when an M naturally enters the scheduler,
+		// schedule checks if freezing is set and if so stops
+		// execution. This guarantees that while Gs can transition from
+		// running to stopped, they can never transition from stopped
+		// to running.
+		//
+		// The sleep here allows racing Ms that missed freezing and are
+		// about to run a G to complete the transition to running
+		// before we start traceback.
+		usleep(1000)
+		return
+	}
+
 	// stopwait and preemption requests can be lost
 	// due to races with concurrently executing threads,
 	// so try several times
@@ -1141,6 +1187,59 @@
 	return gp.atomicstatus.CompareAndSwap(_Gpreempted, _Gwaiting)
 }
 
+// stwReason is an enumeration of reasons the world is stopping.
+type stwReason uint8
+
+// Reasons to stop-the-world.
+//
+// Avoid reusing reasons and add new ones instead.
+const (
+	stwUnknown                     stwReason = iota // "unknown"
+	stwGCMarkTerm                                   // "GC mark termination"
+	stwGCSweepTerm                                  // "GC sweep termination"
+	stwWriteHeapDump                                // "write heap dump"
+	stwGoroutineProfile                             // "goroutine profile"
+	stwGoroutineProfileCleanup                      // "goroutine profile cleanup"
+	stwAllGoroutinesStack                           // "all goroutines stack trace"
+	stwReadMemStats                                 // "read mem stats"
+	stwAllThreadsSyscall                            // "AllThreadsSyscall"
+	stwGOMAXPROCS                                   // "GOMAXPROCS"
+	stwStartTrace                                   // "start trace"
+	stwStopTrace                                    // "stop trace"
+	stwForTestCountPagesInUse                       // "CountPagesInUse (test)"
+	stwForTestReadMetricsSlow                       // "ReadMetricsSlow (test)"
+	stwForTestReadMemStatsSlow                      // "ReadMemStatsSlow (test)"
+	stwForTestPageCachePagesLeaked                  // "PageCachePagesLeaked (test)"
+	stwForTestResetDebugLog                         // "ResetDebugLog (test)"
+)
+
+func (r stwReason) String() string {
+	return stwReasonStrings[r]
+}
+
+// If you add to this list, also add it to src/internal/trace/parser.go.
+// If you change the values of any of the stw* constants, bump the trace
+// version number and make a copy of this.
+var stwReasonStrings = [...]string{
+	stwUnknown:                     "unknown",
+	stwGCMarkTerm:                  "GC mark termination",
+	stwGCSweepTerm:                 "GC sweep termination",
+	stwWriteHeapDump:               "write heap dump",
+	stwGoroutineProfile:            "goroutine profile",
+	stwGoroutineProfileCleanup:     "goroutine profile cleanup",
+	stwAllGoroutinesStack:          "all goroutines stack trace",
+	stwReadMemStats:                "read mem stats",
+	stwAllThreadsSyscall:           "AllThreadsSyscall",
+	stwGOMAXPROCS:                  "GOMAXPROCS",
+	stwStartTrace:                  "start trace",
+	stwStopTrace:                   "stop trace",
+	stwForTestCountPagesInUse:      "CountPagesInUse (test)",
+	stwForTestReadMetricsSlow:      "ReadMetricsSlow (test)",
+	stwForTestReadMemStatsSlow:     "ReadMemStatsSlow (test)",
+	stwForTestPageCachePagesLeaked: "PageCachePagesLeaked (test)",
+	stwForTestResetDebugLog:        "ResetDebugLog (test)",
+}
+
 // stopTheWorld stops all P's from executing goroutines, interrupting
 // all goroutines at GC safe points and records reason as the reason
 // for the stop. On return, only the current goroutine's P is running.
@@ -1155,10 +1254,10 @@
 // This is also used by routines that do stack dumps. If the system is
 // in panic or being exited, this may not reliably stop all
 // goroutines.
-func stopTheWorld(reason string) {
+func stopTheWorld(reason stwReason) {
 	semacquire(&worldsema)
 	gp := getg()
-	gp.m.preemptoff = reason
+	gp.m.preemptoff = reason.String()
 	systemstack(func() {
 		// Mark the goroutine which called stopTheWorld preemptible so its
 		// stack may be scanned.
@@ -1172,14 +1271,14 @@
 		// have already completed by the time we exit.
 		// Don't provide a wait reason because we're still executing.
 		casGToWaiting(gp, _Grunning, waitReasonStoppingTheWorld)
-		stopTheWorldWithSema()
+		stopTheWorldWithSema(reason)
 		casgstatus(gp, _Gwaiting, _Grunning)
 	})
 }
 
 // startTheWorld undoes the effects of stopTheWorld.
 func startTheWorld() {
-	systemstack(func() { startTheWorldWithSema(false) })
+	systemstack(func() { startTheWorldWithSema() })
 
 	// worldsema must be held over startTheWorldWithSema to ensure
 	// gomaxprocs cannot change while worldsema is held.
@@ -1205,7 +1304,7 @@
 // stopTheWorldGC has the same effect as stopTheWorld, but blocks
 // until the GC is not running. It also blocks a GC from starting
 // until startTheWorldGC is called.
-func stopTheWorldGC(reason string) {
+func stopTheWorldGC(reason stwReason) {
 	semacquire(&gcsema)
 	stopTheWorld(reason)
 }
@@ -1249,7 +1348,10 @@
 // startTheWorldWithSema and stopTheWorldWithSema.
 // Holding worldsema causes any other goroutines invoking
 // stopTheWorld to block.
-func stopTheWorldWithSema() {
+func stopTheWorldWithSema(reason stwReason) {
+	if traceEnabled() {
+		traceSTWStart(reason)
+	}
 	gp := getg()
 
 	// If we hold a lock, then we won't be able to stop another M
@@ -1269,7 +1371,7 @@
 	for _, pp := range allp {
 		s := pp.status
 		if s == _Psyscall && atomic.Cas(&pp.status, s, _Pgcstop) {
-			if trace.enabled {
+			if traceEnabled() {
 				traceGoSysBlock(pp)
 				traceProcStop(pp)
 			}
@@ -1328,7 +1430,7 @@
 	worldStopped()
 }
 
-func startTheWorldWithSema(emitTraceEvent bool) int64 {
+func startTheWorldWithSema() int64 {
 	assertWorldStopped()
 
 	mp := acquirem() // disable preemption because it can be holding p in a local var
@@ -1372,8 +1474,8 @@
 
 	// Capture start-the-world time before doing clean-up tasks.
 	startTime := nanotime()
-	if emitTraceEvent {
-		traceGCSTWDone()
+	if traceEnabled() {
+		traceSTWDone()
 	}
 
 	// Wakeup an additional proc in case we have excessive runnable goroutines
@@ -1441,14 +1543,14 @@
 		// but is somewhat arbitrary.
 		size := gp.stack.hi
 		if size == 0 {
-			size = 8192 * sys.StackGuardMultiplier
+			size = 16384 * sys.StackGuardMultiplier
 		}
 		gp.stack.hi = uintptr(noescape(unsafe.Pointer(&size)))
 		gp.stack.lo = gp.stack.hi - size + 1024
 	}
 	// Initialize stack guard so that we can start calling regular
 	// Go code.
-	gp.stackguard0 = gp.stack.lo + _StackGuard
+	gp.stackguard0 = gp.stack.lo + stackGuard
 	// This is the g0, so we can also call go:systemstack
 	// functions, which check stackguard1.
 	gp.stackguard1 = gp.stackguard0
@@ -1698,7 +1800,7 @@
 	for _, p2 := range allp {
 		s := p2.status
 		if s == _Psyscall && p2.runSafePointFn == 1 && atomic.Cas(&p2.status, s, _Pidle) {
-			if trace.enabled {
+			if traceEnabled() {
 				traceGoSysBlock(p2)
 				traceProcStop(p2)
 			}
@@ -1837,7 +1939,7 @@
 	if iscgo || mStackIsSystemAllocated() {
 		mp.g0 = malg(-1)
 	} else {
-		mp.g0 = malg(8192 * sys.StackGuardMultiplier)
+		mp.g0 = malg(16384 * sys.StackGuardMultiplier)
 	}
 	mp.g0.m = mp
 
@@ -1881,11 +1983,15 @@
 // 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.
+// It calls dropm to put the m back on the list,
+// 1. when the callback is done with the m in non-pthread platforms,
+// 2. or when the C thread exiting on pthread platforms.
+//
+// The signal argument indicates whether we're called from a signal
+// handler.
 //
 //go:nosplit
-func needm() {
+func needm(signal bool) {
 	if (iscgo || GOOS == "windows") && !cgoHasExtraM {
 		// Can happen if C/C++ code calls Go from a global ctor.
 		// Can also happen on Windows if a global ctor uses a
@@ -1909,11 +2015,10 @@
 	sigsave(&sigmask)
 	sigblock(false)
 
-	// Lock extra list, take head, unlock popped list.
-	// nilokay=false is safe here because of the invariant above,
+	// getExtraM 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)
+	mp, last := getExtraM()
 
 	// Set needextram when we've just emptied the list,
 	// so that the eventual call into cgocallbackg will
@@ -1922,9 +2027,7 @@
 	// 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 == 0
-	extraMCount--
-	unlockextra(mp.schedlink.ptr())
+	mp.needextram = last
 
 	// Store the original signal mask for use by minit.
 	mp.sigmask = sigmask
@@ -1934,15 +2037,35 @@
 	osSetupTLS(mp)
 
 	// Install g (= m->g0) and set the stack bounds
-	// to match the current stack. We don't actually know
+	// to match the current stack. If we don't actually know
 	// how big the stack is, like we don't know how big any
-	// scheduling stack is, but we assume there's at least 32 kB,
-	// which is more than enough for us.
+	// scheduling stack is, but we assume there's at least 32 kB.
+	// If we can get a more accurate stack bound from pthread,
+	// use that.
 	setg(mp.g0)
 	gp := getg()
 	gp.stack.hi = getcallersp() + 1024
 	gp.stack.lo = getcallersp() - 32*1024
-	gp.stackguard0 = gp.stack.lo + _StackGuard
+	if !signal && _cgo_getstackbound != nil {
+		// Don't adjust if called from the signal handler.
+		// We are on the signal stack, not the pthread stack.
+		// (We could get the stack bounds from sigaltstack, but
+		// we're getting out of the signal handler very soon
+		// anyway. Not worth it.)
+		var bounds [2]uintptr
+		asmcgocall(_cgo_getstackbound, unsafe.Pointer(&bounds))
+		// getstackbound is an unsupported no-op on Windows.
+		if bounds[0] != 0 {
+			gp.stack.lo = bounds[0]
+			gp.stack.hi = bounds[1]
+		}
+	}
+	gp.stackguard0 = gp.stack.lo + stackGuard
+
+	// Should mark we are already in Go now.
+	// Otherwise, we may call needm again when we get a signal, before cgocallbackg1,
+	// which means the extram list may be empty, that will cause a deadlock.
+	mp.isExtraInC = false
 
 	// Initialize this thread to use the m.
 	asminit()
@@ -1953,6 +2076,17 @@
 	sched.ngsys.Add(-1)
 }
 
+// Acquire an extra m and bind it to the C thread when a pthread key has been created.
+//
+//go:nosplit
+func needAndBindM() {
+	needm(false)
+
+	if _cgo_pthread_key_created != nil && *(*uintptr)(_cgo_pthread_key_created) != 0 {
+		cgoBindM()
+	}
+}
+
 // newextram allocates m's and puts them on the extra list.
 // It is called with a working local m, so that it can do things
 // like call schedlock and allocate.
@@ -1962,13 +2096,9 @@
 		for i := uint32(0); i < c; i++ {
 			oneNewExtraM()
 		}
-	} else {
+	} else if extraMLength.Load() == 0 {
 		// Make sure there is at least one extra M.
-		mp := lockextra(true)
-		unlockextra(mp)
-		if mp == nil {
-			oneNewExtraM()
-		}
+		oneNewExtraM()
 	}
 }
 
@@ -1997,21 +2127,17 @@
 	gp.m = mp
 	mp.curg = gp
 	mp.isextra = true
+	// mark we are in C by default.
+	mp.isExtraInC = true
 	mp.lockedInt++
 	mp.lockedg.set(gp)
 	gp.lockedm.set(mp)
 	gp.goid = sched.goidgen.Add(1)
-	gp.sysblocktraced = true
 	if raceenabled {
 		gp.racectx = racegostart(abi.FuncPCABIInternal(newextram) + sys.PCQuantum)
 	}
-	if trace.enabled {
-		// Trigger two trace events for the locked g in the extra m,
-		// since the next event of the g will be traceEvGoSysExit in exitsyscall,
-		// while calling from C thread to Go.
-		traceGoCreate(gp, 0) // no start pc
-		gp.traceseq++
-		traceEvent(traceEvGoInSyscall, -1, gp.goid)
+	if traceEnabled() {
+		traceOneNewExtraM(gp)
 	}
 	// put on allg for garbage collector
 	allgadd(gp)
@@ -2023,15 +2149,14 @@
 	sched.ngsys.Add(1)
 
 	// Add m to the extra list.
-	mnext := lockextra(true)
-	mp.schedlink.set(mnext)
-	extraMCount++
-	unlockextra(mp)
+	addExtraM(mp)
 }
 
+// dropm puts the current m back onto the extra list.
+//
+// 1. On systems without pthreads, like Windows
 // 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
@@ -2043,15 +2168,18 @@
 // 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.
+// 2. On systems with pthreads
+// dropm is called while a non-Go thread is exiting.
+// We allocate a pthread per-thread variable using pthread_key_create,
+// to register a thread-exit-time destructor.
+// And store the g into a thread-specific value associated with the pthread key,
+// when first return back to C.
+// So that the destructor would invoke dropm while the non-Go thread is exiting.
+// This is much faster since it avoids expensive signal-related syscalls.
+//
+// NOTE: this always runs without a P, so, nowritebarrierrec required.
+//
+//go:nowritebarrierrec
 func dropm() {
 	// Clear m and g, and return m to the extra list.
 	// After the call to setg we can only call nosplit functions
@@ -2071,26 +2199,67 @@
 	sigblock(false)
 	unminit()
 
-	mnext := lockextra(true)
-	extraMCount++
-	mp.schedlink.set(mnext)
-
 	setg(nil)
 
-	// Commit the release of mp.
-	unlockextra(mp)
+	putExtraM(mp)
 
 	msigrestore(sigmask)
 }
 
+// bindm store the g0 of the current m into a thread-specific value.
+//
+// We allocate a pthread per-thread variable using pthread_key_create,
+// to register a thread-exit-time destructor.
+// We are here setting the thread-specific value of the pthread key, to enable the destructor.
+// So that the pthread_key_destructor would dropm while the C thread is exiting.
+//
+// And the saved g will be used in pthread_key_destructor,
+// since the g stored in the TLS by Go might be cleared in some platforms,
+// before the destructor invoked, so, we restore g by the stored g, before dropm.
+//
+// We store g0 instead of m, to make the assembly code simpler,
+// since we need to restore g0 in runtime.cgocallback.
+//
+// On systems without pthreads, like Windows, bindm shouldn't be used.
+//
+// NOTE: this always runs without a P, so, nowritebarrierrec required.
+//
+//go:nosplit
+//go:nowritebarrierrec
+func cgoBindM() {
+	if GOOS == "windows" || GOOS == "plan9" {
+		fatal("bindm in unexpected GOOS")
+	}
+	g := getg()
+	if g.m.g0 != g {
+		fatal("the current g is not g0")
+	}
+	if _cgo_bindm != nil {
+		asmcgocall(_cgo_bindm, unsafe.Pointer(g))
+	}
+}
+
 // A helper function for EnsureDropM.
 func getm() uintptr {
 	return uintptr(unsafe.Pointer(getg().m))
 }
 
-var extram atomic.Uintptr
-var extraMCount uint32 // Protected by lockextra
-var extraMWaiters atomic.Uint32
+var (
+	// Locking linked list of extra M's, via mp.schedlink. Must be accessed
+	// only via lockextra/unlockextra.
+	//
+	// Can't be atomic.Pointer[m] because we use an invalid pointer as a
+	// "locked" sentinel value. M's on this list remain visible to the GC
+	// because their mp.curg is on allgs.
+	extraM atomic.Uintptr
+	// Number of M's in the extraM list.
+	extraMLength atomic.Uint32
+	// Number of waiters in lockextra.
+	extraMWaiters atomic.Uint32
+
+	// Number of extra M's in use by threads.
+	extraMInUse atomic.Uint32
+)
 
 // lockextra locks the extra list and returns the list head.
 // The caller must unlock the list by storing a new list head
@@ -2104,7 +2273,7 @@
 
 	incr := false
 	for {
-		old := extram.Load()
+		old := extraM.Load()
 		if old == locked {
 			osyield_no_g()
 			continue
@@ -2120,7 +2289,7 @@
 			usleep_no_g(1)
 			continue
 		}
-		if extram.CompareAndSwap(old, locked) {
+		if extraM.CompareAndSwap(old, locked) {
 			return (*m)(unsafe.Pointer(old))
 		}
 		osyield_no_g()
@@ -2129,8 +2298,41 @@
 }
 
 //go:nosplit
-func unlockextra(mp *m) {
-	extram.Store(uintptr(unsafe.Pointer(mp)))
+func unlockextra(mp *m, delta int32) {
+	extraMLength.Add(delta)
+	extraM.Store(uintptr(unsafe.Pointer(mp)))
+}
+
+// Return an M from the extra M list. Returns last == true if the list becomes
+// empty because of this call.
+//
+// Spins waiting for an extra M, so caller must ensure that the list always
+// contains or will soon contain at least one M.
+//
+//go:nosplit
+func getExtraM() (mp *m, last bool) {
+	mp = lockextra(false)
+	extraMInUse.Add(1)
+	unlockextra(mp.schedlink.ptr(), -1)
+	return mp, mp.schedlink.ptr() == nil
+}
+
+// Returns an extra M back to the list. mp must be from getExtraM. Newly
+// allocated M's should use addExtraM.
+//
+//go:nosplit
+func putExtraM(mp *m) {
+	extraMInUse.Add(-1)
+	addExtraM(mp)
+}
+
+// Adds a newly allocated M to the extra M list.
+//
+//go:nosplit
+func addExtraM(mp *m) {
+	mnext := lockextra(true)
+	mp.schedlink.set(mnext)
+	unlockextra(mp, 1)
 }
 
 var (
@@ -2350,10 +2552,15 @@
 // Callers passing a non-nil P must call from a non-preemptible context. See
 // comment on acquirem below.
 //
+// Argument lockheld indicates whether the caller already acquired the
+// scheduler lock. Callers holding the lock when making the call must pass
+// true. The lock might be temporarily dropped, but will be reacquired before
+// returning.
+//
 // Must not have write barriers because this may be called without a P.
 //
 //go:nowritebarrierrec
-func startm(pp *p, spinning bool) {
+func startm(pp *p, spinning, lockheld bool) {
 	// Disable preemption.
 	//
 	// Every owned P must have an owner that will eventually stop it in the
@@ -2371,7 +2578,9 @@
 	// startm. Callers passing a nil P may be preemptible, so we must
 	// disable preemption before acquiring a P from pidleget below.
 	mp := acquirem()
-	lock(&sched.lock)
+	if !lockheld {
+		lock(&sched.lock)
+	}
 	if pp == nil {
 		if spinning {
 			// TODO(prattmic): All remaining calls to this function
@@ -2381,7 +2590,9 @@
 		}
 		pp, _ = pidleget(0)
 		if pp == nil {
-			unlock(&sched.lock)
+			if !lockheld {
+				unlock(&sched.lock)
+			}
 			releasem(mp)
 			return
 		}
@@ -2395,6 +2606,8 @@
 		// could find no idle P while checkdead finds a runnable G but
 		// no running M's because this new M hasn't started yet, thus
 		// throwing in an apparent deadlock.
+		// This apparent deadlock is possible when startm is called
+		// from sysmon, which doesn't count as a running M.
 		//
 		// Avoid this situation by pre-allocating the ID for the new M,
 		// thus marking it as 'running' before we drop sched.lock. This
@@ -2409,12 +2622,18 @@
 			fn = mspinning
 		}
 		newm(fn, pp, id)
+
+		if lockheld {
+			lock(&sched.lock)
+		}
 		// Ownership transfer of pp committed by start in newm.
 		// Preemption is now safe.
 		releasem(mp)
 		return
 	}
-	unlock(&sched.lock)
+	if !lockheld {
+		unlock(&sched.lock)
+	}
 	if nmp.spinning {
 		throw("startm: m is spinning")
 	}
@@ -2443,24 +2662,24 @@
 
 	// if it has local work, start it straight away
 	if !runqempty(pp) || sched.runqsize != 0 {
-		startm(pp, false)
+		startm(pp, false, false)
 		return
 	}
 	// if there's trace work to do, start it straight away
-	if (trace.enabled || trace.shutdown) && traceReaderAvailable() != nil {
-		startm(pp, false)
+	if (traceEnabled() || traceShuttingDown()) && traceReaderAvailable() != nil {
+		startm(pp, false, false)
 		return
 	}
 	// if it has GC work, start it straight away
 	if gcBlackenEnabled != 0 && gcMarkWorkAvailable(pp) {
-		startm(pp, false)
+		startm(pp, false, false)
 		return
 	}
 	// no local work, check that there are no spinning/idle M's,
 	// otherwise our help is not required
 	if sched.nmspinning.Load()+sched.npidle.Load() == 0 && sched.nmspinning.CompareAndSwap(0, 1) { // TODO: fast atomic
 		sched.needspinning.Store(0)
-		startm(pp, true)
+		startm(pp, true, false)
 		return
 	}
 	lock(&sched.lock)
@@ -2482,14 +2701,14 @@
 	}
 	if sched.runqsize != 0 {
 		unlock(&sched.lock)
-		startm(pp, false)
+		startm(pp, false, false)
 		return
 	}
 	// If this is the last running P and nobody is polling network,
 	// need to wakeup another M to poll network.
 	if sched.npidle.Load() == gomaxprocs-1 && sched.lastpoll.Load() != 0 {
 		unlock(&sched.lock)
-		startm(pp, false)
+		startm(pp, false, false)
 		return
 	}
 
@@ -2538,7 +2757,7 @@
 	// see at least one running M (ours).
 	unlock(&sched.lock)
 
-	startm(pp, true)
+	startm(pp, true, false)
 
 	releasem(mp)
 }
@@ -2642,7 +2861,7 @@
 	casgstatus(gp, _Grunnable, _Grunning)
 	gp.waitsince = 0
 	gp.preempt = false
-	gp.stackguard0 = gp.stack.lo + _StackGuard
+	gp.stackguard0 = gp.stack.lo + stackGuard
 	if !inheritTime {
 		mp.p.ptr().schedtick++
 	}
@@ -2653,11 +2872,11 @@
 		setThreadCPUProfiler(hz)
 	}
 
-	if trace.enabled {
+	if traceEnabled() {
 		// GoSysExit has to happen when we have a P, but before GoStart.
 		// So we emit it here.
-		if gp.syscallsp != 0 && gp.sysblocktraced {
-			traceGoSysExit(gp.sysexitticks)
+		if gp.syscallsp != 0 {
+			traceGoSysExit()
 		}
 		traceGoStart()
 	}
@@ -2693,7 +2912,7 @@
 	now, pollUntil, _ := checkTimers(pp, 0)
 
 	// Try to schedule the trace reader.
-	if trace.enabled || trace.shutdown {
+	if traceEnabled() || traceShuttingDown() {
 		gp := traceReader()
 		if gp != nil {
 			casgstatus(gp, _Gwaiting, _Grunnable)
@@ -2760,7 +2979,7 @@
 			gp := list.pop()
 			injectglist(&list)
 			casgstatus(gp, _Gwaiting, _Grunnable)
-			if trace.enabled {
+			if traceEnabled() {
 				traceGoUnpark(gp, 0)
 			}
 			return gp, false, false
@@ -2805,7 +3024,7 @@
 			pp.gcMarkWorkerMode = gcMarkWorkerIdleMode
 			gp := node.gp.ptr()
 			casgstatus(gp, _Gwaiting, _Grunnable)
-			if trace.enabled {
+			if traceEnabled() {
 				traceGoUnpark(gp, 0)
 			}
 			return gp, false, false
@@ -2820,7 +3039,7 @@
 	gp, otherReady := beforeIdle(now, pollUntil)
 	if gp != nil {
 		casgstatus(gp, _Gwaiting, _Grunnable)
-		if trace.enabled {
+		if traceEnabled() {
 			traceGoUnpark(gp, 0)
 		}
 		return gp, false, false
@@ -2931,7 +3150,7 @@
 			// Run the idle worker.
 			pp.gcMarkWorkerMode = gcMarkWorkerIdleMode
 			casgstatus(gp, _Gwaiting, _Grunnable)
-			if trace.enabled {
+			if traceEnabled() {
 				traceGoUnpark(gp, 0)
 			}
 			return gp, false, false
@@ -2955,10 +3174,11 @@
 		if mp.spinning {
 			throw("findrunnable: netpoll with spinning")
 		}
-		// Refresh now.
-		now = nanotime()
 		delay := int64(-1)
 		if pollUntil != 0 {
+			if now == 0 {
+				now = nanotime()
+			}
 			delay = pollUntil - now
 			if delay < 0 {
 				delay = 0
@@ -2969,6 +3189,8 @@
 			delay = 0
 		}
 		list := netpoll(delay) // block until new work is available
+		// Refresh now again, after potentially blocking.
+		now = nanotime()
 		sched.pollUntil.Store(0)
 		sched.lastpoll.Store(now)
 		if faketime != 0 && list.empty() {
@@ -2988,7 +3210,7 @@
 				gp := list.pop()
 				injectglist(&list)
 				casgstatus(gp, _Gwaiting, _Grunnable)
-				if trace.enabled {
+				if traceEnabled() {
 					traceGoUnpark(gp, 0)
 				}
 				return gp, false, false
@@ -3256,7 +3478,7 @@
 	if glist.empty() {
 		return
 	}
-	if trace.enabled {
+	if traceEnabled() {
 		for gp := glist.head.ptr(); gp != nil; gp = gp.schedlink.ptr() {
 			traceGoUnpark(gp, 0)
 		}
@@ -3291,8 +3513,8 @@
 				break
 			}
 
+			startm(pp, false, true)
 			unlock(&sched.lock)
-			startm(pp, false)
 			releasem(mp)
 		}
 	}
@@ -3359,6 +3581,18 @@
 
 	gp, inheritTime, tryWakeP := findRunnable() // blocks until work is available
 
+	if debug.dontfreezetheworld > 0 && freezing.Load() {
+		// See comment in freezetheworld. We don't want to perturb
+		// scheduler state, so we didn't gcstopm in findRunnable, but
+		// also don't want to allow new goroutines to run.
+		//
+		// Deadlock here rather than in the findRunnable loop so if
+		// findRunnable is stuck in a loop we don't perturb that
+		// either.
+		lock(&deadlock)
+		lock(&deadlock)
+	}
+
 	// This thread is going to run a goroutine and is not spinning anymore,
 	// so if it was marked as spinning we need to reset it now and potentially
 	// start a new spinning M.
@@ -3487,8 +3721,8 @@
 func park_m(gp *g) {
 	mp := getg().m
 
-	if trace.enabled {
-		traceGoPark(mp.waittraceev, mp.waittraceskip)
+	if traceEnabled() {
+		traceGoPark(mp.waitTraceBlockReason, mp.waitTraceSkip)
 	}
 
 	// N.B. Not using casGToWaiting here because the waitreason is
@@ -3501,7 +3735,7 @@
 		mp.waitunlockf = nil
 		mp.waitlock = nil
 		if !ok {
-			if trace.enabled {
+			if traceEnabled() {
 				traceGoUnpark(gp, 2)
 			}
 			casgstatus(gp, _Gwaiting, _Grunnable)
@@ -3528,7 +3762,7 @@
 
 // Gosched continuation on g0.
 func gosched_m(gp *g) {
-	if trace.enabled {
+	if traceEnabled() {
 		traceGoSched()
 	}
 	goschedImpl(gp)
@@ -3541,14 +3775,14 @@
 		gogo(&gp.sched) // never return
 	}
 
-	if trace.enabled {
+	if traceEnabled() {
 		traceGoSched()
 	}
 	goschedImpl(gp)
 }
 
 func gopreempt_m(gp *g) {
-	if trace.enabled {
+	if traceEnabled() {
 		traceGoPreempt()
 	}
 	goschedImpl(gp)
@@ -3558,8 +3792,8 @@
 //
 //go:systemstack
 func preemptPark(gp *g) {
-	if trace.enabled {
-		traceGoPark(traceEvGoBlock, 0)
+	if traceEnabled() {
+		traceGoPark(traceBlockPreempted, 0)
 	}
 	status := readgstatus(gp)
 	if status&^_Gscan != _Grunning {
@@ -3575,7 +3809,7 @@
 		if !f.valid() {
 			throw("preempt at unknown pc")
 		}
-		if f.flag&funcFlag_SPWRITE != 0 {
+		if f.flag&abi.FuncFlagSPWrite != 0 {
 			println("runtime: unexpected SPWRITE function", funcname(f), "in async preempt")
 			throw("preempt SPWRITE")
 		}
@@ -3602,7 +3836,7 @@
 }
 
 func goyield_m(gp *g) {
-	if trace.enabled {
+	if traceEnabled() {
 		traceGoPreempt()
 	}
 	pp := gp.m.p.ptr()
@@ -3617,7 +3851,7 @@
 	if raceenabled {
 		racegoend()
 	}
-	if trace.enabled {
+	if traceEnabled() {
 		traceGoEnd()
 	}
 	mcall(goexit0)
@@ -3775,6 +4009,11 @@
 	gp.syscallsp = sp
 	gp.syscallpc = pc
 	casgstatus(gp, _Grunning, _Gsyscall)
+	if staticLockRanking {
+		// When doing static lock ranking casgstatus can call
+		// systemstack which clobbers g.sched.
+		save(pc, sp)
+	}
 	if gp.syscallsp < gp.stack.lo || gp.stack.hi < gp.syscallsp {
 		systemstack(func() {
 			print("entersyscall inconsistent ", hex(gp.syscallsp), " [", hex(gp.stack.lo), ",", hex(gp.stack.hi), "]\n")
@@ -3782,7 +4021,7 @@
 		})
 	}
 
-	if trace.enabled {
+	if traceEnabled() {
 		systemstack(traceGoSysCall)
 		// systemstack itself clobbers g.sched.{pc,sp} and we might
 		// need them later when the G is genuinely blocked in a
@@ -3802,7 +4041,6 @@
 	}
 
 	gp.m.syscalltick = gp.m.p.ptr().syscalltick
-	gp.sysblocktraced = true
 	pp := gp.m.p.ptr()
 	pp.m = 0
 	gp.m.oldp.set(pp)
@@ -3841,7 +4079,7 @@
 
 	lock(&sched.lock)
 	if sched.stopwait > 0 && atomic.Cas(&pp.status, _Psyscall, _Pgcstop) {
-		if trace.enabled {
+		if traceEnabled() {
 			traceGoSysBlock(pp)
 			traceProcStop(pp)
 		}
@@ -3863,7 +4101,6 @@
 	gp.throwsplit = true
 	gp.stackguard0 = stackPreempt // see comment in entersyscall
 	gp.m.syscalltick = gp.m.p.ptr().syscalltick
-	gp.sysblocktraced = true
 	gp.m.p.ptr().syscalltick++
 
 	// Leave SP around for GC and traceback.
@@ -3898,7 +4135,7 @@
 }
 
 func entersyscallblock_handoff() {
-	if trace.enabled {
+	if traceEnabled() {
 		traceGoSysCall()
 		traceGoSysBlock(getg().m.p.ptr())
 	}
@@ -3939,7 +4176,7 @@
 				tryRecordGoroutineProfileWB(gp)
 			})
 		}
-		if trace.enabled {
+		if traceEnabled() {
 			if oldp != gp.m.p.ptr() || gp.m.syscalltick != gp.m.p.ptr().syscalltick {
 				systemstack(traceGoStart)
 			}
@@ -3957,8 +4194,8 @@
 			// restore the preemption request in case we've cleared it in newstack
 			gp.stackguard0 = stackPreempt
 		} else {
-			// otherwise restore the real _StackGuard, we've spoiled it in entersyscall/entersyscallblock
-			gp.stackguard0 = gp.stack.lo + _StackGuard
+			// otherwise restore the real stackGuard, we've spoiled it in entersyscall/entersyscallblock
+			gp.stackguard0 = gp.stack.lo + stackGuard
 		}
 		gp.throwsplit = false
 
@@ -3970,8 +4207,7 @@
 		return
 	}
 
-	gp.sysexitticks = 0
-	if trace.enabled {
+	if traceEnabled() {
 		// Wait till traceGoSysBlock event is emitted.
 		// This ensures consistency of the trace (the goroutine is started after it is blocked).
 		for oldp != nil && oldp.syscalltick == gp.m.syscalltick {
@@ -3981,7 +4217,7 @@
 		// Tracing code can invoke write barriers that cannot run without a P.
 		// So instead we remember the syscall exit time and emit the event
 		// in execute when we have a P.
-		gp.sysexitticks = cputicks()
+		gp.trace.sysExitTime = traceClockNow()
 	}
 
 	gp.m.locks--
@@ -4022,7 +4258,7 @@
 		var ok bool
 		systemstack(func() {
 			ok = exitsyscallfast_pidle()
-			if ok && trace.enabled {
+			if ok && traceEnabled() {
 				if oldp != nil {
 					// Wait till traceGoSysBlock event is emitted.
 					// This ensures consistency of the trace (the goroutine is started after it is blocked).
@@ -4030,7 +4266,7 @@
 						osyield()
 					}
 				}
-				traceGoSysExit(0)
+				traceGoSysExit()
 			}
 		})
 		if ok {
@@ -4048,7 +4284,7 @@
 func exitsyscallfast_reacquired() {
 	gp := getg()
 	if gp.m.syscalltick != gp.m.p.ptr().syscalltick {
-		if trace.enabled {
+		if traceEnabled() {
 			// The p was retaken and then enter into syscall again (since gp.m.syscalltick has changed).
 			// traceGoSysBlock for this syscall was already emitted,
 			// but here we effectively retake the p from the new syscall running on the same p.
@@ -4056,7 +4292,7 @@
 				// Denote blocking of the new syscall.
 				traceGoSysBlock(gp.m.p.ptr())
 				// Denote completion of the current syscall.
-				traceGoSysExit(0)
+				traceGoSysExit()
 			})
 		}
 		gp.m.p.ptr().syscalltick++
@@ -4139,7 +4375,7 @@
 
 	// This function is called before fork in syscall package.
 	// Code between fork and exec must not allocate memory nor even try to grow stack.
-	// Here we spoil g->_StackGuard to reliably detect any attempts to grow stack.
+	// Here we spoil g.stackguard0 to reliably detect any attempts to grow stack.
 	// runtime_AfterFork will undo this in parent process, but not in child.
 	gp.stackguard0 = stackFork
 }
@@ -4152,7 +4388,7 @@
 	gp := getg().m.curg
 
 	// See the comments in beforefork.
-	gp.stackguard0 = gp.stack.lo + _StackGuard
+	gp.stackguard0 = gp.stack.lo + stackGuard
 
 	msigrestore(gp.m.sigmask)
 
@@ -4222,11 +4458,11 @@
 func malg(stacksize int32) *g {
 	newg := new(g)
 	if stacksize >= 0 {
-		stacksize = round2(_StackSystem + stacksize)
+		stacksize = round2(stackSystem + stacksize)
 		systemstack(func() {
 			newg.stack = stackalloc(uint32(stacksize))
 		})
-		newg.stackguard0 = newg.stack.lo + _StackGuard
+		newg.stackguard0 = newg.stack.lo + stackGuard
 		newg.stackguard1 = ^uintptr(0)
 		// Clear the bottom word of the stack. We record g
 		// there on gsignal stack during VDSO on ARM and ARM64.
@@ -4265,7 +4501,7 @@
 	pp := mp.p.ptr()
 	newg := gfget(pp)
 	if newg == nil {
-		newg = malg(_StackMin)
+		newg = malg(stackMin)
 		casgstatus(newg, _Gidle, _Gdead)
 		allgadd(newg) // publishes with a g->status of Gdead so GC scanner doesn't look at uninitialized stack.
 	}
@@ -4294,6 +4530,7 @@
 	newg.sched.pc = abi.FuncPCABI0(goexit) + sys.PCQuantum // +PCQuantum so that previous instruction is in same function
 	newg.sched.g = guintptr(unsafe.Pointer(newg))
 	gostartcallfn(&newg.sched, fn)
+	newg.parentGoid = callergp.goid
 	newg.gopc = callerpc
 	newg.ancestors = saveAncestors(callergp)
 	newg.startpc = fn.fn
@@ -4333,13 +4570,14 @@
 	pp.goidcache++
 	if raceenabled {
 		newg.racectx = racegostart(callerpc)
+		newg.raceignore = 0
 		if newg.labels != nil {
 			// See note in proflabel.go on labelSync's role in synchronizing
 			// with the reads in the signal handler.
 			racereleasemergeg(newg, unsafe.Pointer(&labelSync))
 		}
 	}
-	if trace.enabled {
+	if traceEnabled() {
 		traceGoCreate(newg, newg.startpc)
 	}
 	releasem(mp)
@@ -4348,7 +4586,7 @@
 }
 
 // saveAncestors copies previous ancestors of the given caller g and
-// includes infor for the current caller into a new set of tracebacks for
+// includes info for the current caller into a new set of tracebacks for
 // a g being created.
 func saveAncestors(callergp *g) *[]ancestorInfo {
 	// Copy all prior info, except for the root goroutine (goid 0).
@@ -4366,7 +4604,7 @@
 	ancestors := make([]ancestorInfo, n)
 	copy(ancestors[1:], callerAncestors)
 
-	var pcs [_TracebackMaxFrames]uintptr
+	var pcs [tracebackInnerFrames]uintptr
 	npcs := gcallers(callergp, 0, pcs[:])
 	ipcs := make([]uintptr, npcs)
 	copy(ipcs, pcs[:])
@@ -4468,7 +4706,7 @@
 		systemstack(func() {
 			gp.stack = stackalloc(startingStackSize)
 		})
-		gp.stackguard0 = gp.stack.lo + _StackGuard
+		gp.stackguard0 = gp.stack.lo + stackGuard
 	} else {
 		if raceenabled {
 			racemalloc(unsafe.Pointer(gp.stack.lo), gp.stack.hi-gp.stack.lo)
@@ -4526,8 +4764,6 @@
 	gp.lockedm.set(gp.m)
 }
 
-//go:nosplit
-
 // LockOSThread wires the calling goroutine to its current operating system thread.
 // The calling goroutine will always execute in that thread,
 // and no other goroutine will execute in it,
@@ -4542,6 +4778,8 @@
 //
 // A goroutine should call LockOSThread before calling OS services or
 // non-Go library functions that depend on per-thread state.
+//
+//go:nosplit
 func LockOSThread() {
 	if atomic.Load(&newmHandoff.haveTemplateThread) == 0 && GOOS != "plan9" {
 		// If we need to start a new thread from the locked
@@ -4581,8 +4819,6 @@
 	gp.lockedm = 0
 }
 
-//go:nosplit
-
 // UnlockOSThread undoes an earlier call to LockOSThread.
 // If this drops the number of active LockOSThread calls on the
 // calling goroutine to zero, it unwires the calling goroutine from
@@ -4595,6 +4831,8 @@
 // other goroutines, it should not call this function and thus leave
 // the goroutine locked to the OS thread until the goroutine (and
 // hence the thread) exits.
+//
+//go:nosplit
 func UnlockOSThread() {
 	gp := getg()
 	if gp.m.lockedExt == 0 {
@@ -4697,6 +4935,7 @@
 	// See golang.org/issue/17165.
 	getg().m.mallocing++
 
+	var u unwinder
 	var stk [maxCPUProfStack]uintptr
 	n := 0
 	if mp.ncgo > 0 && mp.curg != nil && mp.curg.syscallpc != 0 && mp.curg.syscallsp != 0 {
@@ -4710,26 +4949,24 @@
 			for cgoOff < len(mp.cgoCallers) && mp.cgoCallers[cgoOff] != 0 {
 				cgoOff++
 			}
-			copy(stk[:], mp.cgoCallers[:cgoOff])
+			n += copy(stk[:], mp.cgoCallers[:cgoOff])
 			mp.cgoCallers[0] = 0
 		}
 
 		// Collect Go stack that leads to the cgo call.
-		n = gentraceback(mp.curg.syscallpc, mp.curg.syscallsp, 0, mp.curg, 0, &stk[cgoOff], len(stk)-cgoOff, nil, nil, 0)
-		if n > 0 {
-			n += cgoOff
-		}
+		u.initAt(mp.curg.syscallpc, mp.curg.syscallsp, 0, mp.curg, unwindSilentErrors)
 	} else if usesLibcall() && mp.libcallg != 0 && mp.libcallpc != 0 && mp.libcallsp != 0 {
 		// Libcall, i.e. runtime syscall on windows.
 		// Collect Go stack that leads to the call.
-		n = gentraceback(mp.libcallpc, mp.libcallsp, 0, mp.libcallg.ptr(), 0, &stk[n], len(stk[n:]), nil, nil, 0)
+		u.initAt(mp.libcallpc, mp.libcallsp, 0, mp.libcallg.ptr(), unwindSilentErrors)
 	} else if mp != nil && mp.vdsoSP != 0 {
 		// VDSO call, e.g. nanotime1 on Linux.
 		// Collect Go stack that leads to the call.
-		n = gentraceback(mp.vdsoPC, mp.vdsoSP, 0, gp, 0, &stk[n], len(stk[n:]), nil, nil, _TraceJumpStack)
+		u.initAt(mp.vdsoPC, mp.vdsoSP, 0, gp, unwindSilentErrors|unwindJumpStack)
 	} else {
-		n = gentraceback(pc, sp, lr, gp, 0, &stk[0], len(stk), nil, nil, _TraceTrap|_TraceJumpStack)
+		u.initAt(pc, sp, lr, gp, unwindSilentErrors|unwindTrap|unwindJumpStack)
 	}
+	n += tracebackPCs(&u, 0, stk[n:])
 
 	if n <= 0 {
 		// Normal traceback is impossible or has failed.
@@ -4893,6 +5130,7 @@
 		pp.sudogbuf[i] = nil
 	}
 	pp.sudogcache = pp.sudogbuf[:0]
+	pp.pinnerCache = nil
 	for j := range pp.deferpoolbuf {
 		pp.deferpoolbuf[j] = nil
 	}
@@ -4950,7 +5188,7 @@
 	if old < 0 || nprocs <= 0 {
 		throw("procresize: invalid arg")
 	}
-	if trace.enabled {
+	if traceEnabled() {
 		traceGomaxprocs(nprocs)
 	}
 
@@ -5016,7 +5254,7 @@
 		// because p.destroy itself has write barriers, so we
 		// need to do that from a valid P.
 		if gp.m.p != 0 {
-			if trace.enabled {
+			if traceEnabled() {
 				// Pretend that we were descheduled
 				// and then scheduled again to keep
 				// the trace sane.
@@ -5030,7 +5268,7 @@
 		pp.m = 0
 		pp.status = _Pidle
 		acquirep(pp)
-		if trace.enabled {
+		if traceEnabled() {
 			traceGoStart()
 		}
 	}
@@ -5095,7 +5333,7 @@
 	// from a potentially stale mcache.
 	pp.mcache.prepareForSweep()
 
-	if trace.enabled {
+	if traceEnabled() {
 		traceProcStart()
 	}
 }
@@ -5137,7 +5375,7 @@
 		print("releasep: m=", gp.m, " m->p=", gp.m.p.ptr(), " p->m=", hex(pp.m), " p->status=", pp.status, "\n")
 		throw("releasep: invalid p state")
 	}
-	if trace.enabled {
+	if traceEnabled() {
 		traceProcStop(gp.m.p.ptr())
 	}
 	gp.m.p = 0
@@ -5181,13 +5419,8 @@
 	// accommodate callbacks created by syscall.NewCallback. See issue #6751
 	// for details.)
 	var run0 int32
-	if !iscgo && cgoHasExtraM {
-		mp := lockextra(true)
-		haveExtraM := extraMCount > 0
-		unlockextra(mp)
-		if haveExtraM {
-			run0 = 1
-		}
+	if !iscgo && cgoHasExtraM && extraMLength.Load() > 0 {
+		run0 = 1
 	}
 
 	run := mcount() - sched.nmidle - sched.nmidlelocked - sched.nmsys
@@ -5196,6 +5429,7 @@
 	}
 	if run < 0 {
 		print("runtime: checkdead: nmidle=", sched.nmidle, " nmidlelocked=", sched.nmidlelocked, " mcount=", mcount(), " nmsys=", sched.nmsys, "\n")
+		unlock(&sched.lock)
 		throw("checkdead: inconsistent counts")
 	}
 
@@ -5213,6 +5447,7 @@
 			_Grunning,
 			_Gsyscall:
 			print("runtime: checkdead: find g ", gp.goid, " in status ", s, "\n")
+			unlock(&sched.lock)
 			throw("checkdead: runnable g")
 		}
 	})
@@ -5231,12 +5466,14 @@
 			if pp == nil {
 				// There should always be a free P since
 				// nothing is running.
+				unlock(&sched.lock)
 				throw("checkdead: no p for timer")
 			}
 			mp := mget()
 			if mp == nil {
 				// There should always be a free M since
 				// nothing is running.
+				unlock(&sched.lock)
 				throw("checkdead: no m for timer")
 			}
 			// M must be spinning to steal. We set this to be
@@ -5390,7 +5627,7 @@
 			// See issue 42515 and
 			// https://gnats.netbsd.org/cgi-bin/query-pr-single.pl?number=50094.
 			if next := timeSleepUntil(); next < now {
-				startm(nil, false)
+				startm(nil, false, false)
 			}
 		}
 		if scavenger.sysmonWake.Load() != 0 {
@@ -5485,7 +5722,7 @@
 			// increment nmidle and report deadlock.
 			incidlelocked(-1)
 			if atomic.Cas(&pp.status, s, _Pidle) {
-				if trace.enabled {
+				if traceEnabled() {
 					traceGoSysBlock(pp)
 					traceProcStop(pp)
 				}
@@ -5662,7 +5899,7 @@
 		globrunqputbatch(&sched.disable.runnable, n)
 		unlock(&sched.lock)
 		for ; n != 0 && sched.npidle.Load() != 0; n-- {
-			startm(nil, false)
+			startm(nil, false, false)
 		}
 	} else {
 		unlock(&sched.lock)
@@ -6447,14 +6684,11 @@
 }
 
 // An initTask represents the set of initializations that need to be done for a package.
-// Keep in sync with ../../test/initempty.go:initTask
+// Keep in sync with ../../test/noinit.go:initTask
 type initTask struct {
-	// TODO: pack the first 3 fields more tightly?
-	state uintptr // 0 = uninitialized, 1 = in progress, 2 = done
-	ndeps uintptr
-	nfns  uintptr
-	// followed by ndeps instances of an *initTask, one per package depended on
-	// followed by nfns pcs, one per init function to run
+	state uint32 // 0 = uninitialized, 1 = in progress, 2 = done
+	nfns  uint32
+	// followed by nfns pcs, uintptr sized, one per init function to run
 }
 
 // inittrace stores statistics for init functions which are
@@ -6468,7 +6702,13 @@
 	bytes  uint64 // heap allocated bytes
 }
 
-func doInit(t *initTask) {
+func doInit(ts []*initTask) {
+	for _, t := range ts {
+		doInit1(t)
+	}
+}
+
+func doInit1(t *initTask) {
 	switch t.state {
 	case 2: // fully initialized
 		return
@@ -6477,17 +6717,6 @@
 	default: // not initialized yet
 		t.state = 1 // initialization in progress
 
-		for i := uintptr(0); i < t.ndeps; i++ {
-			p := add(unsafe.Pointer(t), (3+i)*goarch.PtrSize)
-			t2 := *(**initTask)(p)
-			doInit(t2)
-		}
-
-		if t.nfns == 0 {
-			t.state = 2 // initialization done
-			return
-		}
-
 		var (
 			start  int64
 			before tracestat
@@ -6499,9 +6728,14 @@
 			before = inittrace
 		}
 
-		firstFunc := add(unsafe.Pointer(t), (3+t.ndeps)*goarch.PtrSize)
-		for i := uintptr(0); i < t.nfns; i++ {
-			p := add(firstFunc, i*goarch.PtrSize)
+		if t.nfns == 0 {
+			// We should have pruned all of these in the linker.
+			throw("inittask with no functions")
+		}
+
+		firstFunc := add(unsafe.Pointer(t), 8)
+		for i := uint32(0); i < t.nfns; i++ {
+			p := add(firstFunc, uintptr(i)*goarch.PtrSize)
 			f := *(*func())(unsafe.Pointer(&p))
 			f()
 		}
diff --git a/src/runtime/proc_test.go b/src/runtime/proc_test.go
index f354fac..67eadea 100644
--- a/src/runtime/proc_test.go
+++ b/src/runtime/proc_test.go
@@ -415,7 +415,10 @@
 		n := runtime.NumGoroutine()
 		buf = buf[:runtime.Stack(buf, true)]
 
-		nstk := strings.Count(string(buf), "goroutine ")
+		// To avoid double-counting "goroutine" in "goroutine $m [running]:"
+		// and "created by $func in goroutine $n", remove the latter
+		output := strings.ReplaceAll(string(buf), "in goroutine", "")
+		nstk := strings.Count(output, "goroutine ")
 		if n == nstk {
 			break
 		}
@@ -1041,16 +1044,16 @@
 
 	defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(2))
 
-	interations := 10
+	iterations := 10
 	if testing.Short() {
-		interations = 1
+		iterations = 1
 	}
 	const (
 		maxDuration = 5 * time.Second
 		nroutines   = 8
 	)
 
-	for i := 0; i < interations; i++ {
+	for i := 0; i < iterations; i++ {
 		c := make(chan bool, nroutines)
 		stop := uint32(0)
 
diff --git a/src/runtime/profbuf.go b/src/runtime/profbuf.go
index c579f21..083b55a 100644
--- a/src/runtime/profbuf.go
+++ b/src/runtime/profbuf.go
@@ -491,6 +491,7 @@
 		// Nothing to read right now.
 		// Return or sleep according to mode.
 		if mode == profBufNonBlocking {
+			// Necessary on Darwin, notetsleepg below does not work in signal handler, root cause of #61768.
 			return nil, nil, false
 		}
 		if !b.w.cas(bw, bw|profReaderSleeping) {
diff --git a/src/runtime/race.go b/src/runtime/race.go
index f83a04d..e2767f0 100644
--- a/src/runtime/race.go
+++ b/src/runtime/race.go
@@ -24,8 +24,6 @@
 	return int(n)
 }
 
-//go:nosplit
-
 // RaceAcquire/RaceRelease/RaceReleaseMerge establish happens-before relations
 // between goroutines. These inform the race detector about actual synchronization
 // that it can't see for some reason (e.g. synchronization within RaceDisable/RaceEnable
@@ -34,38 +32,40 @@
 // RaceReleaseMerge on addr up to and including the last RaceRelease on addr.
 // In terms of the C memory model (C11 §5.1.2.4, §7.17.3),
 // RaceAcquire is equivalent to atomic_load(memory_order_acquire).
+//
+//go:nosplit
 func RaceAcquire(addr unsafe.Pointer) {
 	raceacquire(addr)
 }
 
-//go:nosplit
-
 // RaceRelease performs a release operation on addr that
 // can synchronize with a later RaceAcquire on addr.
 //
 // In terms of the C memory model, RaceRelease is equivalent to
 // atomic_store(memory_order_release).
+//
+//go:nosplit
 func RaceRelease(addr unsafe.Pointer) {
 	racerelease(addr)
 }
 
-//go:nosplit
-
 // RaceReleaseMerge is like RaceRelease, but also establishes a happens-before
 // relation with the preceding RaceRelease or RaceReleaseMerge on addr.
 //
 // In terms of the C memory model, RaceReleaseMerge is equivalent to
 // atomic_exchange(memory_order_release).
+//
+//go:nosplit
 func RaceReleaseMerge(addr unsafe.Pointer) {
 	racereleasemerge(addr)
 }
 
-//go:nosplit
-
 // RaceDisable disables handling of race synchronization events in the current goroutine.
 // Handling is re-enabled with RaceEnable. RaceDisable/RaceEnable can be nested.
 // Non-synchronization events (memory accesses, function entry/exit) still affect
 // the race detector.
+//
+//go:nosplit
 func RaceDisable() {
 	gp := getg()
 	if gp.raceignore == 0 {
@@ -74,9 +74,9 @@
 	gp.raceignore++
 }
 
-//go:nosplit
-
 // RaceEnable re-enables handling of race events in the current goroutine.
+//
+//go:nosplit
 func RaceEnable() {
 	gp := getg()
 	gp.raceignore--
@@ -93,11 +93,11 @@
 // callerpc is a return PC of the function that calls this function,
 // pc is start PC of the function that calls this function.
 func raceReadObjectPC(t *_type, addr unsafe.Pointer, callerpc, pc uintptr) {
-	kind := t.kind & kindMask
+	kind := t.Kind_ & kindMask
 	if kind == kindArray || kind == kindStruct {
 		// for composite objects we have to read every address
 		// because a write might happen to any subobject.
-		racereadrangepc(addr, t.size, callerpc, pc)
+		racereadrangepc(addr, t.Size_, callerpc, pc)
 	} else {
 		// for non-composite objects we can read just the start
 		// address, as any write must write the first byte.
@@ -106,11 +106,11 @@
 }
 
 func raceWriteObjectPC(t *_type, addr unsafe.Pointer, callerpc, pc uintptr) {
-	kind := t.kind & kindMask
+	kind := t.Kind_ & kindMask
 	if kind == kindArray || kind == kindStruct {
 		// for composite objects we have to write every address
 		// because a write might happen to any subobject.
-		racewriterangepc(addr, t.size, callerpc, pc)
+		racewriterangepc(addr, t.Size_, callerpc, pc)
 	} else {
 		// for non-composite objects we can write just the start
 		// address, as any write must write the first byte.
@@ -171,37 +171,35 @@
 func raceSymbolizeCode(ctx *symbolizeCodeContext) {
 	pc := ctx.pc
 	fi := findfunc(pc)
-	f := fi._Func()
-	if f != nil {
-		file, line := f.FileLine(pc)
-		if line != 0 {
-			if inldata := funcdata(fi, _FUNCDATA_InlTree); inldata != nil {
-				inltree := (*[1 << 20]inlinedCall)(inldata)
-				for {
-					ix := pcdatavalue(fi, _PCDATA_InlTreeIndex, pc, nil)
-					if ix >= 0 {
-						if inltree[ix].funcID == funcID_wrapper {
-							// ignore wrappers
-							// Back up to an instruction in the "caller".
-							pc = f.Entry() + uintptr(inltree[ix].parentPc)
-							continue
-						}
-						ctx.pc = f.Entry() + uintptr(inltree[ix].parentPc) // "caller" pc
-						ctx.fn = cfuncnameFromNameOff(fi, inltree[ix].nameOff)
-						ctx.line = uintptr(line)
-						ctx.file = &bytes(file)[0] // assume NUL-terminated
-						ctx.off = pc - f.Entry()
-						ctx.res = 1
-						return
-					}
-					break
-				}
+	if fi.valid() {
+		u, uf := newInlineUnwinder(fi, pc, nil)
+		for ; uf.valid(); uf = u.next(uf) {
+			sf := u.srcFunc(uf)
+			if sf.funcID == abi.FuncIDWrapper && u.isInlined(uf) {
+				// Ignore wrappers, unless we're at the outermost frame of u.
+				// A non-inlined wrapper frame always means we have a physical
+				// frame consisting entirely of wrappers, in which case we'll
+				// take a outermost wrapper over nothing.
+				continue
 			}
-			ctx.fn = cfuncname(fi)
+
+			name := sf.name()
+			file, line := u.fileLine(uf)
+			if line == 0 {
+				// Failure to symbolize
+				continue
+			}
+			ctx.fn = &bytes(name)[0] // assume NUL-terminated
 			ctx.line = uintptr(line)
 			ctx.file = &bytes(file)[0] // assume NUL-terminated
-			ctx.off = pc - f.Entry()
+			ctx.off = pc - fi.entry()
 			ctx.res = 1
+			if u.isInlined(uf) {
+				// Set ctx.pc to the "caller" so the race detector calls this again
+				// to further unwind.
+				uf = u.next(uf)
+				ctx.pc = uf.pc
+			}
 			return
 		}
 	}
@@ -360,6 +358,8 @@
 
 //go:nosplit
 func raceinit() (gctx, pctx uintptr) {
+	lockInit(&raceFiniLock, lockRankRaceFini)
+
 	// On most machines, cgo is required to initialize libc, which is used by race runtime.
 	if !iscgo && GOOS != "darwin" {
 		throw("raceinit: race build must use cgo")
@@ -402,8 +402,6 @@
 	return
 }
 
-var raceFiniLock mutex
-
 //go:nosplit
 func racefini() {
 	// racefini() can only be called once to avoid races.
@@ -412,9 +410,16 @@
 	// already held it's assumed that the first caller exits the program
 	// so other calls can hang forever without an issue.
 	lock(&raceFiniLock)
+
+	// __tsan_fini will run C atexit functions and C++ destructors,
+	// which can theoretically call back into Go.
+	// Tell the scheduler we entering external code.
+	entersyscall()
+
 	// We're entering external code that may call ExitProcess on
 	// Windows.
 	osPreemptExtEnter(getg().m)
+
 	racecall(&__tsan_fini, 0, 0, 0, 0)
 }
 
diff --git a/src/runtime/race/README b/src/runtime/race/README
index 596700a..acd8b84 100644
--- a/src/runtime/race/README
+++ b/src/runtime/race/README
@@ -8,7 +8,7 @@
 race_freebsd_amd64.syso built with LLVM 127e59048cd3d8dbb80c14b3036918c114089529 and Go 59ab6f351a370a27458755dc69f4a837e55a05a6.
 race_linux_ppc64le.syso built with LLVM 41cb504b7c4b18ac15830107431a0c1eec73a6b2 and Go 851ecea4cc99ab276109493477b2c7e30c253ea8.
 race_netbsd_amd64.syso built with LLVM 41cb504b7c4b18ac15830107431a0c1eec73a6b2 and Go 851ecea4cc99ab276109493477b2c7e30c253ea8.
-race_windows_amd64.syso built with LLVM 89f7ccea6f6488c443655880229c54db1f180153 and Go f62d3202bf9dbb3a00ad2a2c63ff4fa4188c5d3b.
+race_windows_amd64.syso built with LLVM b6374437af39af66896da74a1dc1b8a0ece26bee and Go 3e97294663d978bf8abb7acec7cc615ef2f1ea75.
 race_linux_arm64.syso built with LLVM 41cb504b7c4b18ac15830107431a0c1eec73a6b2 and Go 851ecea4cc99ab276109493477b2c7e30c253ea8.
 race_darwin_arm64.syso built with LLVM 41cb504b7c4b18ac15830107431a0c1eec73a6b2 and Go 851ecea4cc99ab276109493477b2c7e30c253ea8.
 race_openbsd_amd64.syso built with LLVM fcf6ae2f070eba73074b6ec8d8281e54d29dbeeb and Go 8f2db14cd35bbd674cb2988a508306de6655e425.
diff --git a/src/runtime/race/internal/amd64v1/race_windows.syso b/src/runtime/race/internal/amd64v1/race_windows.syso
index 9fbf9b4..777bd83 100644
--- a/src/runtime/race/internal/amd64v1/race_windows.syso
+++ b/src/runtime/race/internal/amd64v1/race_windows.syso
Binary files differ
diff --git a/src/runtime/race/output_test.go b/src/runtime/race/output_test.go
index 0dcdabe..4c2c339 100644
--- a/src/runtime/race/output_test.go
+++ b/src/runtime/race/output_test.go
@@ -439,4 +439,42 @@
   main\.main\(\)
       .*/main.go:[0-9]+ \+0x[0-9,a-f]+
 ==================`}},
+	// Test symbolizing wrappers. Both (*T).f and main.func1 are wrappers.
+	// go.dev/issue/60245
+	{"wrappersym", "run", "", "atexit_sleep_ms=0", `
+package main
+import "sync"
+var wg sync.WaitGroup
+var x int
+func main() {
+	f := (*T).f
+	wg.Add(2)
+	go f(new(T))
+	f(new(T))
+	wg.Wait()
+}
+type T struct{}
+func (t T) f() {
+	x = 42
+	wg.Done()
+}
+`, []string{`==================
+WARNING: DATA RACE
+Write at 0x[0-9,a-f]+ by goroutine [0-9]:
+  main\.T\.f\(\)
+      .*/main.go:15 \+0x[0-9,a-f]+
+  main\.\(\*T\)\.f\(\)
+      <autogenerated>:1 \+0x[0-9,a-f]+
+  main\.main\.func1\(\)
+      .*/main.go:9 \+0x[0-9,a-f]+
+
+Previous write at 0x[0-9,a-f]+ by main goroutine:
+  main\.T\.f\(\)
+      .*/main.go:15 \+0x[0-9,a-f]+
+  main\.\(\*T\)\.f\(\)
+      <autogenerated>:1 \+0x[0-9,a-f]+
+  main\.main\(\)
+      .*/main.go:10 \+0x[0-9,a-f]+
+
+`}},
 }
diff --git a/src/runtime/race/race_linux_test.go b/src/runtime/race/race_linux_test.go
index e8a2d0f..947ed7c 100644
--- a/src/runtime/race/race_linux_test.go
+++ b/src/runtime/race/race_linux_test.go
@@ -35,3 +35,31 @@
 		t.Fatalf("bad atomic value: %v, want 2", *a)
 	}
 }
+
+func TestAtomicPageBoundary(t *testing.T) {
+	// Test that atomic access near (but not cross) a page boundary
+	// doesn't fault. See issue 60825.
+
+	// Mmap two pages of memory, and make the second page inaccessible,
+	// so we have an address at the end of a page.
+	pagesize := syscall.Getpagesize()
+	b, err := syscall.Mmap(0, 0, 2*pagesize, syscall.PROT_READ|syscall.PROT_WRITE, syscall.MAP_ANON|syscall.MAP_PRIVATE)
+	if err != nil {
+		t.Fatalf("mmap failed %s", err)
+	}
+	defer syscall.Munmap(b)
+	err = syscall.Mprotect(b[pagesize:], syscall.PROT_NONE)
+	if err != nil {
+		t.Fatalf("mprotect high failed %s\n", err)
+	}
+
+	// This should not fault.
+	a := (*uint32)(unsafe.Pointer(&b[pagesize-4]))
+	atomic.StoreUint32(a, 1)
+	if x := atomic.LoadUint32(a); x != 1 {
+		t.Fatalf("bad atomic value: %v, want 1", x)
+	}
+	if x := atomic.AddUint32(a, 1); x != 2 {
+		t.Fatalf("bad atomic value: %v, want 2", x)
+	}
+}
diff --git a/src/runtime/race/testdata/mop_test.go b/src/runtime/race/testdata/mop_test.go
index 0d79091..6b1069f 100644
--- a/src/runtime/race/testdata/mop_test.go
+++ b/src/runtime/race/testdata/mop_test.go
@@ -331,7 +331,8 @@
 	var x, y int
 	_ = x + y
 	done := make(chan bool, N)
-	for i, v := range a {
+	var i, v int // declare here (not in for stmt) so that i and v are shared w/ or w/o loop variable sharing change
+	for i, v = range a {
 		go func(i int) {
 			// we don't want a write-vs-write race
 			// so there is no array b here
@@ -2092,3 +2093,40 @@
 		<-done
 	}
 }
+
+func TestNoRaceIssue60934(t *testing.T) {
+	// Test that runtime.RaceDisable state doesn't accidentally get applied to
+	// new goroutines.
+
+	// Create several goroutines that end after calling runtime.RaceDisable.
+	var wg sync.WaitGroup
+	ready := make(chan struct{})
+	wg.Add(32)
+	for i := 0; i < 32; i++ {
+		go func() {
+			<-ready // ensure we have multiple goroutines running at the same time
+			runtime.RaceDisable()
+			wg.Done()
+		}()
+	}
+	close(ready)
+	wg.Wait()
+
+	// Make sure race detector still works. If the runtime.RaceDisable state
+	// leaks, the happens-before edges here will be ignored and a race on x will
+	// be reported.
+	var x int
+	ch := make(chan struct{}, 0)
+	wg.Add(2)
+	go func() {
+		x = 1
+		ch <- struct{}{}
+		wg.Done()
+	}()
+	go func() {
+		<-ch
+		_ = x
+		wg.Done()
+	}()
+	wg.Wait()
+}
diff --git a/src/runtime/race_amd64.s b/src/runtime/race_amd64.s
index c679a87..4fa130e 100644
--- a/src/runtime/race_amd64.s
+++ b/src/runtime/race_amd64.s
@@ -174,7 +174,7 @@
 
 // Common code for racefuncenter
 // R11 = caller's return address
-TEXT	racefuncenter<>(SB), NOSPLIT, $0-0
+TEXT	racefuncenter<>(SB), NOSPLIT|NOFRAME, $0-0
 	MOVQ	DX, BX		// save function entry context (for closures)
 	MOVQ	g_racectx(R14), RARG0	// goroutine context
 	MOVQ	R11, RARG1
@@ -196,13 +196,13 @@
 // Atomic operations for sync/atomic package.
 
 // Load
-TEXT	sync∕atomic·LoadInt32(SB), NOSPLIT, $0-12
+TEXT	sync∕atomic·LoadInt32(SB), NOSPLIT|NOFRAME, $0-12
 	GO_ARGS
 	MOVQ	$__tsan_go_atomic32_load(SB), AX
 	CALL	racecallatomic<>(SB)
 	RET
 
-TEXT	sync∕atomic·LoadInt64(SB), NOSPLIT, $0-16
+TEXT	sync∕atomic·LoadInt64(SB), NOSPLIT|NOFRAME, $0-16
 	GO_ARGS
 	MOVQ	$__tsan_go_atomic64_load(SB), AX
 	CALL	racecallatomic<>(SB)
@@ -225,13 +225,13 @@
 	JMP	sync∕atomic·LoadInt64(SB)
 
 // Store
-TEXT	sync∕atomic·StoreInt32(SB), NOSPLIT, $0-12
+TEXT	sync∕atomic·StoreInt32(SB), NOSPLIT|NOFRAME, $0-12
 	GO_ARGS
 	MOVQ	$__tsan_go_atomic32_store(SB), AX
 	CALL	racecallatomic<>(SB)
 	RET
 
-TEXT	sync∕atomic·StoreInt64(SB), NOSPLIT, $0-16
+TEXT	sync∕atomic·StoreInt64(SB), NOSPLIT|NOFRAME, $0-16
 	GO_ARGS
 	MOVQ	$__tsan_go_atomic64_store(SB), AX
 	CALL	racecallatomic<>(SB)
@@ -250,13 +250,13 @@
 	JMP	sync∕atomic·StoreInt64(SB)
 
 // Swap
-TEXT	sync∕atomic·SwapInt32(SB), NOSPLIT, $0-20
+TEXT	sync∕atomic·SwapInt32(SB), NOSPLIT|NOFRAME, $0-20
 	GO_ARGS
 	MOVQ	$__tsan_go_atomic32_exchange(SB), AX
 	CALL	racecallatomic<>(SB)
 	RET
 
-TEXT	sync∕atomic·SwapInt64(SB), NOSPLIT, $0-24
+TEXT	sync∕atomic·SwapInt64(SB), NOSPLIT|NOFRAME, $0-24
 	GO_ARGS
 	MOVQ	$__tsan_go_atomic64_exchange(SB), AX
 	CALL	racecallatomic<>(SB)
@@ -275,7 +275,7 @@
 	JMP	sync∕atomic·SwapInt64(SB)
 
 // Add
-TEXT	sync∕atomic·AddInt32(SB), NOSPLIT, $0-20
+TEXT	sync∕atomic·AddInt32(SB), NOSPLIT|NOFRAME, $0-20
 	GO_ARGS
 	MOVQ	$__tsan_go_atomic32_fetch_add(SB), AX
 	CALL	racecallatomic<>(SB)
@@ -283,7 +283,7 @@
 	ADDL	AX, ret+16(FP)
 	RET
 
-TEXT	sync∕atomic·AddInt64(SB), NOSPLIT, $0-24
+TEXT	sync∕atomic·AddInt64(SB), NOSPLIT|NOFRAME, $0-24
 	GO_ARGS
 	MOVQ	$__tsan_go_atomic64_fetch_add(SB), AX
 	CALL	racecallatomic<>(SB)
@@ -304,13 +304,13 @@
 	JMP	sync∕atomic·AddInt64(SB)
 
 // CompareAndSwap
-TEXT	sync∕atomic·CompareAndSwapInt32(SB), NOSPLIT, $0-17
+TEXT	sync∕atomic·CompareAndSwapInt32(SB), NOSPLIT|NOFRAME, $0-17
 	GO_ARGS
 	MOVQ	$__tsan_go_atomic32_compare_exchange(SB), AX
 	CALL	racecallatomic<>(SB)
 	RET
 
-TEXT	sync∕atomic·CompareAndSwapInt64(SB), NOSPLIT, $0-25
+TEXT	sync∕atomic·CompareAndSwapInt64(SB), NOSPLIT|NOFRAME, $0-25
 	GO_ARGS
 	MOVQ	$__tsan_go_atomic64_compare_exchange(SB), AX
 	CALL	racecallatomic<>(SB)
@@ -330,10 +330,10 @@
 
 // Generic atomic operation implementation.
 // AX already contains target function.
-TEXT	racecallatomic<>(SB), NOSPLIT, $0-0
+TEXT	racecallatomic<>(SB), NOSPLIT|NOFRAME, $0-0
 	// Trigger SIGSEGV early.
 	MOVQ	16(SP), R12
-	MOVL	(R12), R13
+	MOVBLZX	(R12), R13
 	// Check that addr is within [arenastart, arenaend) or within [racedatastart, racedataend).
 	CMPQ	R12, runtime·racearenastart(SB)
 	JB	racecallatomic_data
@@ -383,7 +383,7 @@
 	JMP	racecall<>(SB)
 
 // Switches SP to g0 stack and calls (AX). Arguments already set.
-TEXT	racecall<>(SB), NOSPLIT, $0-0
+TEXT	racecall<>(SB), NOSPLIT|NOFRAME, $0-0
 	MOVQ	g_m(R14), R13
 	// Switch to g0 stack.
 	MOVQ	SP, R12		// callee-saved, preserved across the CALL
@@ -405,7 +405,7 @@
 // The overall effect of Go->C->Go call chain is similar to that of mcall.
 // RARG0 contains command code. RARG1 contains command-specific context.
 // See racecallback for command codes.
-TEXT	runtime·racecallbackthunk(SB), NOSPLIT, $0-0
+TEXT	runtime·racecallbackthunk(SB), NOSPLIT|NOFRAME, $0-0
 	// Handle command raceGetProcCmd (0) here.
 	// First, code below assumes that we are on curg, while raceGetProcCmd
 	// can be executed on g0. Second, it is called frequently, so will
diff --git a/src/runtime/race_arm64.s b/src/runtime/race_arm64.s
index edbb3b1..c818345 100644
--- a/src/runtime/race_arm64.s
+++ b/src/runtime/race_arm64.s
@@ -348,7 +348,7 @@
 
 	// Trigger SIGSEGV early.
 	MOVD	40(RSP), R3	// 1st arg is addr. after two times BL, get it at 40(RSP)
-	MOVD	(R3), R13	// segv here if addr is bad
+	MOVB	(R3), R13	// segv here if addr is bad
 	// Check that addr is within [arenastart, arenaend) or within [racedatastart, racedataend).
 	MOVD	runtime·racearenastart(SB), R10
 	CMP	R10, R3
diff --git a/src/runtime/race_ppc64le.s b/src/runtime/race_ppc64le.s
index ac335b1..39cfffc 100644
--- a/src/runtime/race_ppc64le.s
+++ b/src/runtime/race_ppc64le.s
@@ -9,6 +9,7 @@
 #include "funcdata.h"
 #include "textflag.h"
 #include "asm_ppc64x.h"
+#include "cgo/abi_ppc64x.h"
 
 // The following functions allow calling the clang-compiled race runtime directly
 // from Go code without going all the way through cgo.
@@ -362,7 +363,7 @@
 TEXT	racecallatomic<>(SB), NOSPLIT, $0-0
 	// Trigger SIGSEGV early if address passed to atomic function is bad.
 	MOVD	(R6), R7	// 1st arg is addr
-	MOVD	(R7), R9	// segv here if addr is bad
+	MOVB	(R7), R9	// segv here if addr is bad
 	// Check that addr is within [arenastart, arenaend) or within [racedatastart, racedataend).
 	MOVD	runtime·racearenastart(SB), R9
 	CMP	R7, R9
@@ -461,141 +462,44 @@
 // The overall effect of Go->C->Go call chain is similar to that of mcall.
 // RARG0 contains command code. RARG1 contains command-specific context.
 // See racecallback for command codes.
-TEXT	runtime·racecallbackthunk(SB), NOSPLIT, $-8
+TEXT	runtime·racecallbackthunk(SB), NOSPLIT|NOFRAME, $0
 	// Handle command raceGetProcCmd (0) here.
 	// First, code below assumes that we are on curg, while raceGetProcCmd
 	// can be executed on g0. Second, it is called frequently, so will
 	// benefit from this fast path.
-	XOR	R0, R0		// clear R0 since we came from C code
+	MOVD	$0, R0		// clear R0 since we came from C code
 	CMP	R3, $0
 	BNE	rest
-	// g0 TODO: Don't modify g here since R30 is nonvolatile
-	MOVD	g, R9
-	MOVD    runtime·tls_g(SB), R10
-	MOVD    0(R10), g
-	MOVD	g_m(g), R3
+	// Inline raceGetProdCmd without clobbering callee-save registers.
+	MOVD	runtime·tls_g(SB), R10
+	MOVD	0(R10), R11
+	MOVD	g_m(R11), R3
 	MOVD	m_p(R3), R3
 	MOVD	p_raceprocctx(R3), R3
 	MOVD	R3, (R4)
-	MOVD	R9, g		// restore R30 ??
 	RET
 
-	// This is all similar to what cgo does
-	// Save registers according to the ppc64 ABI
 rest:
-	MOVD	LR, R10	// save link register
-	MOVD	R10, 16(R1)
-	MOVW	CR, R10
-	MOVW	R10, 8(R1)
-	MOVDU   R1, -336(R1) // Allocate frame needed for outargs and register save area
+	// Save registers according to the host PPC64 ABI
+	// and reserve 16B for argument storage.
+	STACK_AND_SAVE_HOST_TO_GO_ABI(16)
 
-	MOVD    R14, 328(R1)
-	MOVD    R15, 48(R1)
-	MOVD    R16, 56(R1)
-	MOVD    R17, 64(R1)
-	MOVD    R18, 72(R1)
-	MOVD    R19, 80(R1)
-	MOVD    R20, 88(R1)
-	MOVD    R21, 96(R1)
-	MOVD    R22, 104(R1)
-	MOVD    R23, 112(R1)
-	MOVD    R24, 120(R1)
-	MOVD    R25, 128(R1)
-	MOVD    R26, 136(R1)
-	MOVD    R27, 144(R1)
-	MOVD    R28, 152(R1)
-	MOVD    R29, 160(R1)
-	MOVD    g, 168(R1) // R30
-	MOVD    R31, 176(R1)
-	FMOVD   F14, 184(R1)
-	FMOVD   F15, 192(R1)
-	FMOVD   F16, 200(R1)
-	FMOVD   F17, 208(R1)
-	FMOVD   F18, 216(R1)
-	FMOVD   F19, 224(R1)
-	FMOVD   F20, 232(R1)
-	FMOVD   F21, 240(R1)
-	FMOVD   F22, 248(R1)
-	FMOVD   F23, 256(R1)
-	FMOVD   F24, 264(R1)
-	FMOVD   F25, 272(R1)
-	FMOVD   F26, 280(R1)
-	FMOVD   F27, 288(R1)
-	FMOVD   F28, 296(R1)
-	FMOVD   F29, 304(R1)
-	FMOVD   F30, 312(R1)
-	FMOVD   F31, 320(R1)
-
-	MOVD	R3, FIXED_FRAME+0(R1)
-	MOVD	R4, FIXED_FRAME+8(R1)
-
-	MOVD    runtime·tls_g(SB), R10
-	MOVD    0(R10), g
+	// Load g, and switch to g0 if not already on it.
+	MOVD	runtime·tls_g(SB), R10
+	MOVD	0(R10), g
 
 	MOVD	g_m(g), R7
 	MOVD	m_g0(R7), R8
 	CMP	g, R8
 	BEQ	noswitch
 
-	MOVD	R8, g // set g = m-> g0
-
-	BL	runtime·racecallback(SB)
-
-	// All registers are clobbered after Go code, reload.
-	MOVD    runtime·tls_g(SB), R10
-	MOVD    0(R10), g
-
-	MOVD	g_m(g), R7
-	MOVD	m_curg(R7), g // restore g = m->curg
-
-ret:
-	MOVD    328(R1), R14
-	MOVD    48(R1), R15
-	MOVD    56(R1), R16
-	MOVD    64(R1), R17
-	MOVD    72(R1), R18
-	MOVD    80(R1), R19
-	MOVD    88(R1), R20
-	MOVD    96(R1), R21
-	MOVD    104(R1), R22
-	MOVD    112(R1), R23
-	MOVD    120(R1), R24
-	MOVD    128(R1), R25
-	MOVD    136(R1), R26
-	MOVD    144(R1), R27
-	MOVD    152(R1), R28
-	MOVD    160(R1), R29
-	MOVD    168(R1), g // R30
-	MOVD    176(R1), R31
-	FMOVD   184(R1), F14
-	FMOVD   192(R1), F15
-	FMOVD   200(R1), F16
-	FMOVD   208(R1), F17
-	FMOVD   216(R1), F18
-	FMOVD   224(R1), F19
-	FMOVD   232(R1), F20
-	FMOVD   240(R1), F21
-	FMOVD   248(R1), F22
-	FMOVD   256(R1), F23
-	FMOVD   264(R1), F24
-	FMOVD   272(R1), F25
-	FMOVD   280(R1), F26
-	FMOVD   288(R1), F27
-	FMOVD   296(R1), F28
-	FMOVD   304(R1), F29
-	FMOVD   312(R1), F30
-	FMOVD   320(R1), F31
-
-	ADD     $336, R1
-	MOVD    8(R1), R10
-	MOVFL   R10, $0xff // Restore of CR
-	MOVD    16(R1), R10	// needed?
-	MOVD    R10, LR
-	RET
+	MOVD	R8, g // set g = m->g0
 
 noswitch:
-	BL      runtime·racecallback(SB)
-	JMP     ret
+	BL	runtime·racecallback<ABIInternal>(SB)
+
+	UNSTACK_AND_RESTORE_GO_TO_HOST_ABI(16)
+	RET
 
 // tls_g, g value for each thread in TLS
 GLOBL runtime·tls_g+0(SB), TLSBSS+DUPOK, $8
diff --git a/src/runtime/relax_stub.go b/src/runtime/relax_stub.go
deleted file mode 100644
index e507702..0000000
--- a/src/runtime/relax_stub.go
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2017 The Go 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:build !windows
-
-package runtime
-
-// osRelaxMinNS is the number of nanoseconds of idleness to tolerate
-// without performing an osRelax. Since osRelax may reduce the
-// precision of timers, this should be enough larger than the relaxed
-// timer precision to keep the timer error acceptable.
-const osRelaxMinNS = 0
-
-// osRelax is called by the scheduler when transitioning to and from
-// all Ps being idle.
-func osRelax(relax bool) {}
diff --git a/src/runtime/rt0_aix_ppc64.s b/src/runtime/rt0_aix_ppc64.s
index e06caa1..1670a80 100644
--- a/src/runtime/rt0_aix_ppc64.s
+++ b/src/runtime/rt0_aix_ppc64.s
@@ -3,16 +3,14 @@
 // license that can be found in the LICENSE file.
 
 #include "textflag.h"
+#include "asm_ppc64x.h"
 
 // _rt0_ppc64_aix is a function descriptor of the entrypoint function
 // __start. This name is needed by cmd/link.
-DATA	_rt0_ppc64_aix+0(SB)/8, $__start<>(SB)
-DATA	_rt0_ppc64_aix+8(SB)/8, $TOC(SB)
-GLOBL	_rt0_ppc64_aix(SB), NOPTR, $16
-
+DEFINE_PPC64X_FUNCDESC(_rt0_ppc64_aix, __start<>)
 
 // The starting function must return in the loader to
-// initialise some librairies, especially libthread which
+// initialise some libraries, especially libthread which
 // creates the main thread and adds the TLS in R13
 // R19 contains a function descriptor to the loader function
 // which needs to be called.
@@ -37,11 +35,7 @@
 	BL _main(SB)
 
 
-DATA	main+0(SB)/8, $_main(SB)
-DATA	main+8(SB)/8, $TOC(SB)
-DATA	main+16(SB)/8, $0
-GLOBL	main(SB), NOPTR, $24
-
+DEFINE_PPC64X_FUNCDESC(main, _main)
 TEXT _main(SB),NOSPLIT,$-8
 	MOVD $runtime·rt0_go(SB), R12
 	MOVD R12, CTR
@@ -181,10 +175,7 @@
 	MOVD	R0, LR
 	RET
 
-DATA	_rt0_ppc64_aix_lib_go+0(SB)/8, $__rt0_ppc64_aix_lib_go(SB)
-DATA	_rt0_ppc64_aix_lib_go+8(SB)/8, $TOC(SB)
-DATA	_rt0_ppc64_aix_lib_go+16(SB)/8, $0
-GLOBL	_rt0_ppc64_aix_lib_go(SB), NOPTR, $24
+DEFINE_PPC64X_FUNCDESC(_rt0_ppc64_aix_lib_go, __rt0_ppc64_aix_lib_go)
 
 TEXT __rt0_ppc64_aix_lib_go(SB),NOSPLIT,$0
 	MOVD	_rt0_ppc64_aix_lib_argc<>(SB), R3
diff --git a/src/runtime/rt0_js_wasm.s b/src/runtime/rt0_js_wasm.s
index 714582a..34a6047 100644
--- a/src/runtime/rt0_js_wasm.s
+++ b/src/runtime/rt0_js_wasm.s
@@ -48,42 +48,6 @@
 
 	Return
 
-TEXT wasm_pc_f_loop(SB),NOSPLIT,$0
-// Call the function for the current PC_F. Repeat until PAUSE != 0 indicates pause or exit.
-// The WebAssembly stack may unwind, e.g. when switching goroutines.
-// The Go stack on the linear memory is then used to jump to the correct functions
-// with this loop, without having to restore the full WebAssembly stack.
-// It is expected to have a pending call before entering the loop, so check PAUSE first.
-	Get PAUSE
-	I32Eqz
-	If
-	loop:
-		Loop
-			// Get PC_B & PC_F from -8(SP)
-			Get SP
-			I32Const $8
-			I32Sub
-			I32Load16U $0 // PC_B
-
-			Get SP
-			I32Const $8
-			I32Sub
-			I32Load16U $2 // PC_F
-
-			CallIndirect $0
-			Drop
-
-			Get PAUSE
-			I32Eqz
-			BrIf loop
-		End
-	End
-
-	I32Const $0
-	Set PAUSE
-
-	Return
-
 // wasm_export_getsp gets called from JavaScript to retrieve the SP.
 TEXT wasm_export_getsp(SB),NOSPLIT,$0
 	Get SP
@@ -98,10 +62,6 @@
 TEXT runtime·exit(SB), NOSPLIT, $0-4
 	I32Const $0
 	Call runtime·wasmExit(SB)
-	Drop
 	I32Const $1
 	Set PAUSE
 	RETUNWIND
-
-TEXT wasm_export_lib(SB),NOSPLIT,$0
-	UNDEF
diff --git a/src/runtime/rt0_linux_loong64.s b/src/runtime/rt0_linux_loong64.s
index b23ae78..b52f7d5 100644
--- a/src/runtime/rt0_linux_loong64.s
+++ b/src/runtime/rt0_linux_loong64.s
@@ -3,19 +3,67 @@
 // license that can be found in the LICENSE file.
 
 #include "textflag.h"
+#include "cgo/abi_loong64.h"
 
-TEXT _rt0_loong64_linux(SB),NOSPLIT,$0
-	JMP	_main<>(SB)
-
-TEXT _main<>(SB),NOSPLIT|NOFRAME,$0
+TEXT _rt0_loong64_linux(SB),NOSPLIT|NOFRAME,$0
 	// In a statically linked binary, the stack contains argc,
 	// argv as argc string pointers followed by a NULL, envv as a
 	// sequence of string pointers followed by a NULL, and auxv.
 	// There is no TLS base pointer.
-	MOVW	0(R3), R4 // argc
-	ADDV	$8, R3, R5 // argv
+	MOVW	0(R3), R4	// argc
+	ADDV	$8, R3, R5	// argv
 	JMP	main(SB)
 
+// When building with -buildmode=c-shared, this symbol is called when the shared
+// library is loaded.
+TEXT _rt0_loong64_linux_lib(SB),NOSPLIT,$168
+	// Preserve callee-save registers.
+	SAVE_R22_TO_R31(3*8)
+	SAVE_F24_TO_F31(13*8)
+
+	// Initialize g as nil in case of using g later e.g. sigaction in cgo_sigaction.go
+	MOVV	R0, g
+
+	MOVV	R4, _rt0_loong64_linux_lib_argc<>(SB)
+	MOVV	R5, _rt0_loong64_linux_lib_argv<>(SB)
+
+	// Synchronous initialization.
+	MOVV	$runtime·libpreinit(SB), R19
+	JAL	(R19)
+
+	// Create a new thread to do the runtime initialization and return.
+	MOVV	_cgo_sys_thread_create(SB), R19
+	BEQ	R19, nocgo
+	MOVV	$_rt0_loong64_linux_lib_go(SB), R4
+	MOVV	$0, R5
+	JAL	(R19)
+	JMP	restore
+
+nocgo:
+	MOVV	$0x800000, R4                     // stacksize = 8192KB
+	MOVV	$_rt0_loong64_linux_lib_go(SB), R5
+	MOVV	R4, 8(R3)
+	MOVV	R5, 16(R3)
+	MOVV	$runtime·newosproc0(SB), R19
+	JAL	(R19)
+
+restore:
+	// Restore callee-save registers.
+	RESTORE_R22_TO_R31(3*8)
+	RESTORE_F24_TO_F31(13*8)
+	RET
+
+TEXT _rt0_loong64_linux_lib_go(SB),NOSPLIT,$0
+	MOVV	_rt0_loong64_linux_lib_argc<>(SB), R4
+	MOVV	_rt0_loong64_linux_lib_argv<>(SB), R5
+	MOVV	$runtime·rt0_go(SB),R19
+	JMP	(R19)
+
+DATA _rt0_loong64_linux_lib_argc<>(SB)/8, $0
+GLOBL _rt0_loong64_linux_lib_argc<>(SB),NOPTR, $8
+DATA _rt0_loong64_linux_lib_argv<>(SB)/8, $0
+GLOBL _rt0_loong64_linux_lib_argv<>(SB),NOPTR, $8
+
 TEXT main(SB),NOSPLIT|NOFRAME,$0
 	// in external linking, glibc jumps to main with argc in R4
 	// and argv in R5
diff --git a/src/runtime/rt0_linux_ppc64.s b/src/runtime/rt0_linux_ppc64.s
index c9300a9..f527170 100644
--- a/src/runtime/rt0_linux_ppc64.s
+++ b/src/runtime/rt0_linux_ppc64.s
@@ -3,17 +3,10 @@
 // license that can be found in the LICENSE file.
 
 #include "textflag.h"
+#include "asm_ppc64x.h"
 
-// actually a function descriptor for _main<>(SB)
-TEXT _rt0_ppc64_linux(SB),NOSPLIT,$0
-	DWORD $_main<>(SB)
-	DWORD $0
-	DWORD $0
-
-TEXT main(SB),NOSPLIT,$0
-	DWORD $_main<>(SB)
-	DWORD $0
-	DWORD $0
+DEFINE_PPC64X_FUNCDESC(_rt0_ppc64_linux, _main<>)
+DEFINE_PPC64X_FUNCDESC(main, _main<>)
 
 TEXT _main<>(SB),NOSPLIT,$-8
 	// In a statically linked binary, the stack contains argc,
diff --git a/src/runtime/rt0_linux_ppc64le.s b/src/runtime/rt0_linux_ppc64le.s
index 66f7e7b..417ada2 100644
--- a/src/runtime/rt0_linux_ppc64le.s
+++ b/src/runtime/rt0_linux_ppc64le.s
@@ -4,64 +4,22 @@
 
 #include "go_asm.h"
 #include "textflag.h"
+#include "asm_ppc64x.h"
+#include "cgo/abi_ppc64x.h"
 
 TEXT _rt0_ppc64le_linux(SB),NOSPLIT,$0
 	XOR R0, R0	  // Make sure R0 is zero before _main
 	BR _main<>(SB)
 
-TEXT _rt0_ppc64le_linux_lib(SB),NOSPLIT,$-8
-	// Start with standard C stack frame layout and linkage.
-	MOVD	LR, R0
-	MOVD	R0, 16(R1) // Save LR in caller's frame.
-	MOVW	CR, R0     // Save CR in caller's frame
-	MOVD	R0, 8(R1)
-	MOVDU	R1, -320(R1) // Allocate frame.
-
-	// Preserve callee-save registers.
-	MOVD	R14, 24(R1)
-	MOVD	R15, 32(R1)
-	MOVD	R16, 40(R1)
-	MOVD	R17, 48(R1)
-	MOVD	R18, 56(R1)
-	MOVD	R19, 64(R1)
-	MOVD	R20, 72(R1)
-	MOVD	R21, 80(R1)
-	MOVD	R22, 88(R1)
-	MOVD	R23, 96(R1)
-	MOVD	R24, 104(R1)
-	MOVD	R25, 112(R1)
-	MOVD	R26, 120(R1)
-	MOVD	R27, 128(R1)
-	MOVD	R28, 136(R1)
-	MOVD	R29, 144(R1)
-	MOVD	g, 152(R1) // R30
-	MOVD	R31, 160(R1)
-	FMOVD	F14, 168(R1)
-	FMOVD	F15, 176(R1)
-	FMOVD	F16, 184(R1)
-	FMOVD	F17, 192(R1)
-	FMOVD	F18, 200(R1)
-	FMOVD	F19, 208(R1)
-	FMOVD	F20, 216(R1)
-	FMOVD	F21, 224(R1)
-	FMOVD	F22, 232(R1)
-	FMOVD	F23, 240(R1)
-	FMOVD	F24, 248(R1)
-	FMOVD	F25, 256(R1)
-	FMOVD	F26, 264(R1)
-	FMOVD	F27, 272(R1)
-	FMOVD	F28, 280(R1)
-	FMOVD	F29, 288(R1)
-	FMOVD	F30, 296(R1)
-	FMOVD	F31, 304(R1)
+TEXT _rt0_ppc64le_linux_lib(SB),NOSPLIT|NOFRAME,$0
+	// This is called with ELFv2 calling conventions. Convert to Go.
+	// Allocate argument storage for call to newosproc0.
+	STACK_AND_SAVE_HOST_TO_GO_ABI(16)
 
 	MOVD	R3, _rt0_ppc64le_linux_lib_argc<>(SB)
 	MOVD	R4, _rt0_ppc64le_linux_lib_argv<>(SB)
 
 	// Synchronous initialization.
-	MOVD	$runtime·reginit(SB), R12
-	MOVD	R12, CTR
-	BL	(CTR)
 	MOVD	$runtime·libpreinit(SB), R12
 	MOVD	R12, CTR
 	BL	(CTR)
@@ -78,57 +36,16 @@
 
 nocgo:
 	MOVD	$0x800000, R12                     // stacksize = 8192KB
-	MOVD	R12, 8(R1)
+	MOVD	R12, 8+FIXED_FRAME(R1)
 	MOVD	$_rt0_ppc64le_linux_lib_go(SB), R12
-	MOVD	R12, 16(R1)
+	MOVD	R12, 16+FIXED_FRAME(R1)
 	MOVD	$runtime·newosproc0(SB),R12
 	MOVD	R12, CTR
 	BL	(CTR)
 
 done:
-	// Restore saved registers.
-	MOVD	24(R1), R14
-	MOVD	32(R1), R15
-	MOVD	40(R1), R16
-	MOVD	48(R1), R17
-	MOVD	56(R1), R18
-	MOVD	64(R1), R19
-	MOVD	72(R1), R20
-	MOVD	80(R1), R21
-	MOVD	88(R1), R22
-	MOVD	96(R1), R23
-	MOVD	104(R1), R24
-	MOVD	112(R1), R25
-	MOVD	120(R1), R26
-	MOVD	128(R1), R27
-	MOVD	136(R1), R28
-	MOVD	144(R1), R29
-	MOVD	152(R1), g // R30
-	MOVD	160(R1), R31
-	FMOVD	168(R1), F14
-	FMOVD	176(R1), F15
-	FMOVD	184(R1), F16
-	FMOVD	192(R1), F17
-	FMOVD	200(R1), F18
-	FMOVD	208(R1), F19
-	FMOVD	216(R1), F20
-	FMOVD	224(R1), F21
-	FMOVD	232(R1), F22
-	FMOVD	240(R1), F23
-	FMOVD	248(R1), F24
-	FMOVD	256(R1), F25
-	FMOVD	264(R1), F26
-	FMOVD	272(R1), F27
-	FMOVD	280(R1), F28
-	FMOVD	288(R1), F29
-	FMOVD	296(R1), F30
-	FMOVD	304(R1), F31
-
-	ADD	$320, R1
-	MOVD	8(R1), R0
-	MOVFL	R0, $0xff
-	MOVD	16(R1), R0
-	MOVD	R0, LR
+	// Restore and return to ELFv2 caller.
+	UNSTACK_AND_RESTORE_GO_TO_HOST_ABI(16)
 	RET
 
 TEXT _rt0_ppc64le_linux_lib_go(SB),NOSPLIT,$0
@@ -155,7 +72,7 @@
 	//
 	// When loading via glibc, the first doubleword on the stack points
 	// to NULL a value. (that is *(uintptr)(R1) == 0). This is used to
-	// differentiate static vs dynamicly linked binaries.
+	// differentiate static vs dynamically linked binaries.
 	//
 	// If loading with the musl loader, it doesn't follow the ELFv2 ABI. It
 	// passes argc/argv similar to the linux kernel, R13 (TLS) is
diff --git a/src/runtime/rt0_wasip1_wasm.s b/src/runtime/rt0_wasip1_wasm.s
new file mode 100644
index 0000000..6dc2393
--- /dev/null
+++ b/src/runtime/rt0_wasip1_wasm.s
@@ -0,0 +1,16 @@
+// Copyright 2023 The Go 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_asm.h"
+#include "textflag.h"
+
+TEXT _rt0_wasm_wasip1(SB),NOSPLIT,$0
+	MOVD $runtime·wasmStack+(m0Stack__size-16)(SB), SP
+
+	I32Const $0 // entry PC_B
+	Call runtime·rt0_go(SB)
+	Drop
+	Call wasm_pc_f_loop(SB)
+
+	Return
diff --git a/src/runtime/rt0_windows_amd64.s b/src/runtime/rt0_windows_amd64.s
index e60bf4c..bd18bdd 100644
--- a/src/runtime/rt0_windows_amd64.s
+++ b/src/runtime/rt0_windows_amd64.s
@@ -6,7 +6,7 @@
 #include "go_tls.h"
 #include "textflag.h"
 
-TEXT _rt0_amd64_windows(SB),NOSPLIT,$-8
+TEXT _rt0_amd64_windows(SB),NOSPLIT|NOFRAME,$-8
 	JMP	_rt0_amd64(SB)
 
 // When building with -buildmode=(c-shared or c-archive), this
@@ -16,15 +16,20 @@
 // phase.
 // Leave space for four pointers on the stack as required
 // by the Windows amd64 calling convention.
-TEXT _rt0_amd64_windows_lib(SB),NOSPLIT,$0x20
+TEXT _rt0_amd64_windows_lib(SB),NOSPLIT|NOFRAME,$40
 	// Create a new thread to do the runtime initialization and return.
+	MOVQ	BX, 32(SP) // callee-saved, preserved across the CALL
+	MOVQ	SP, BX
+	ANDQ	$~15, SP // alignment as per Windows requirement
 	MOVQ	_cgo_sys_thread_create(SB), AX
 	MOVQ	$_rt0_amd64_windows_lib_go(SB), CX
 	MOVQ	$0, DX
 	CALL	AX
+	MOVQ	BX, SP
+	MOVQ	32(SP), BX
 	RET
 
-TEXT _rt0_amd64_windows_lib_go(SB),NOSPLIT,$0
+TEXT _rt0_amd64_windows_lib_go(SB),NOSPLIT|NOFRAME,$0
 	MOVQ  $0, DI
 	MOVQ	$0, SI
 	MOVQ	$runtime·rt0_go(SB), AX
diff --git a/src/runtime/rt0_windows_arm64.s b/src/runtime/rt0_windows_arm64.s
index bad85c2..8802c2b 100644
--- a/src/runtime/rt0_windows_arm64.s
+++ b/src/runtime/rt0_windows_arm64.s
@@ -23,7 +23,7 @@
 	MOVD	$runtime·rt0_go(SB), R2
 	B	(R2)
 
-TEXT main(SB),NOSPLIT,$0
+TEXT main(SB),NOSPLIT|NOFRAME,$0
 	MOVD	$runtime·rt0_go(SB), R2
 	B	(R2)
 
diff --git a/src/runtime/runtime-gdb.py b/src/runtime/runtime-gdb.py
index c4462de..46f014f 100644
--- a/src/runtime/runtime-gdb.py
+++ b/src/runtime/runtime-gdb.py
@@ -160,6 +160,7 @@
 		return str(self.val.type)
 
 	def children(self):
+		MapBucketCount = 8 # see internal/abi.go:MapBucketCount
 		B = self.val['B']
 		buckets = self.val['buckets']
 		oldbuckets = self.val['oldbuckets']
@@ -178,7 +179,7 @@
 					bp = oldbp
 			while bp:
 				b = bp.dereference()
-				for i in xrange(8):
+				for i in xrange(MapBucketCount):
 					if b['tophash'][i] != 0:
 						k = b['keys'][i]
 						v = b['values'][i]
@@ -324,7 +325,7 @@
 		return
 
 	type_size = int(dynamic_go_type['size'])
-	uintptr_size = int(dynamic_go_type['size'].type.sizeof)	 # size is itself an uintptr
+	uintptr_size = int(dynamic_go_type['size'].type.sizeof)	 # size is itself a uintptr
 	if type_size > uintptr_size:
 			dynamic_gdb_type = dynamic_gdb_type.pointer()
 
diff --git a/src/runtime/runtime-gdb_test.go b/src/runtime/runtime-gdb_test.go
index 4e7c227..8c759bf 100644
--- a/src/runtime/runtime-gdb_test.go
+++ b/src/runtime/runtime-gdb_test.go
@@ -8,6 +8,7 @@
 	"bytes"
 	"flag"
 	"fmt"
+	"internal/abi"
 	"internal/testenv"
 	"os"
 	"os/exec"
@@ -33,8 +34,6 @@
 		t.Skip("gdb does not work on darwin")
 	case "netbsd":
 		t.Skip("gdb does not work with threads on NetBSD; see https://golang.org/issue/22893 and https://gnats.netbsd.org/52548")
-	case "windows":
-		t.Skip("gdb tests fail on Windows: https://golang.org/issue/22687")
 	case "linux":
 		if runtime.GOARCH == "ppc64" {
 			t.Skip("skipping gdb tests on linux/ppc64; see https://golang.org/issue/17366")
@@ -114,13 +113,16 @@
 	// TODO(mundaym): check for unknown frames (e.g. "??").
 }
 
-const helloSource = `
+// NOTE: the maps below are allocated larger than abi.MapBucketCount
+// to ensure that they are not "optimized out".
+
+var helloSource = `
 import "fmt"
 import "runtime"
 var gslice []string
 func main() {
-	mapvar := make(map[string]string, 13)
-	slicemap := make(map[string][]string,11)
+	mapvar := make(map[string]string, ` + strconv.FormatInt(abi.MapBucketCount+9, 10) + `)
+	slicemap := make(map[string][]string,` + strconv.FormatInt(abi.MapBucketCount+3, 10) + `)
     chanint := make(chan int, 10)
     chanstr := make(chan string, 10)
     chanint <- 99
@@ -468,15 +470,19 @@
 	got, err := cmd.CombinedOutput()
 	t.Logf("gdb output:\n%s", got)
 	if err != nil {
-		if bytes.Contains(got, []byte("internal-error: wait returned unexpected status 0x0")) {
+		switch {
+		case bytes.Contains(got, []byte("internal-error: wait returned unexpected status 0x0")):
 			// GDB bug: https://sourceware.org/bugzilla/show_bug.cgi?id=28551
 			testenv.SkipFlaky(t, 43068)
-		}
-		if bytes.Contains(got, []byte("Couldn't get registers: No such process.")) {
+		case bytes.Contains(got, []byte("Couldn't get registers: No such process.")),
+			bytes.Contains(got, []byte("Unable to fetch general registers.: No such process.")),
+			bytes.Contains(got, []byte("reading register pc (#64): No such process.")):
 			// GDB bug: https://sourceware.org/bugzilla/show_bug.cgi?id=9086
 			testenv.SkipFlaky(t, 50838)
-		}
-		if bytes.Contains(got, []byte(" exited normally]\n")) {
+		case bytes.Contains(got, []byte("waiting for new child: No child processes.")):
+			// GDB bug: Sometimes it fails to wait for a clone child.
+			testenv.SkipFlaky(t, 60553)
+		case bytes.Contains(got, []byte(" exited normally]\n")):
 			// GDB bug: Sometimes the inferior exits fine,
 			// but then GDB hangs.
 			testenv.SkipFlaky(t, 37405)
@@ -659,6 +665,10 @@
 	t.Parallel()
 	checkGdbVersion(t)
 
+	if runtime.GOOS == "windows" {
+		t.Skip("no signals on windows")
+	}
+
 	dir := t.TempDir()
 
 	// Build the source code.
diff --git a/src/runtime/runtime-gdb_unix_test.go b/src/runtime/runtime-gdb_unix_test.go
new file mode 100644
index 0000000..f9cc648
--- /dev/null
+++ b/src/runtime/runtime-gdb_unix_test.go
@@ -0,0 +1,212 @@
+// Copyright 2023 The Go 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:build unix
+
+package runtime_test
+
+import (
+	"bytes"
+	"internal/testenv"
+	"io"
+	"os"
+	"os/exec"
+	"path/filepath"
+	"regexp"
+	"runtime"
+	"syscall"
+	"testing"
+)
+
+const coreSignalSource = `
+package main
+
+import (
+	"flag"
+	"fmt"
+	"os"
+	"runtime/debug"
+	"syscall"
+)
+
+var pipeFD = flag.Int("pipe-fd", -1, "FD of write end of control pipe")
+
+func enableCore() {
+	debug.SetTraceback("crash")
+
+	var lim syscall.Rlimit
+	err := syscall.Getrlimit(syscall.RLIMIT_CORE, &lim)
+	if err != nil {
+		panic(fmt.Sprintf("error getting rlimit: %v", err))
+	}
+	lim.Cur = lim.Max
+	fmt.Fprintf(os.Stderr, "Setting RLIMIT_CORE = %+#v\n", lim)
+	err = syscall.Setrlimit(syscall.RLIMIT_CORE, &lim)
+	if err != nil {
+		panic(fmt.Sprintf("error setting rlimit: %v", err))
+	}
+}
+
+func main() {
+	flag.Parse()
+
+	enableCore()
+
+	// Ready to go. Notify parent.
+	if err := syscall.Close(*pipeFD); err != nil {
+		panic(fmt.Sprintf("error closing control pipe fd %d: %v", *pipeFD, err))
+	}
+
+	for {}
+}
+`
+
+// TestGdbCoreSignalBacktrace tests that gdb can unwind the stack correctly
+// through a signal handler in a core file
+func TestGdbCoreSignalBacktrace(t *testing.T) {
+	if runtime.GOOS != "linux" {
+		// N.B. This test isn't fundamentally Linux-only, but it needs
+		// to know how to enable/find core files on each OS.
+		t.Skip("Test only supported on Linux")
+	}
+	if runtime.GOARCH != "386" && runtime.GOARCH != "amd64" {
+		// TODO(go.dev/issue/25218): Other architectures use sigreturn
+		// via VDSO, which we somehow don't handle correctly.
+		t.Skip("Backtrace through signal handler only works on 386 and amd64")
+	}
+
+	checkGdbEnvironment(t)
+	t.Parallel()
+	checkGdbVersion(t)
+
+	// Ensure there is enough RLIMIT_CORE available to generate a full core.
+	var lim syscall.Rlimit
+	err := syscall.Getrlimit(syscall.RLIMIT_CORE, &lim)
+	if err != nil {
+		t.Fatalf("error getting rlimit: %v", err)
+	}
+	// Minimum RLIMIT_CORE max to allow. This is a conservative estimate.
+	// Most systems allow infinity.
+	const minRlimitCore = 100 << 20 // 100 MB
+	if lim.Max < minRlimitCore {
+		t.Skipf("RLIMIT_CORE max too low: %#+v", lim)
+	}
+
+	// Make sure core pattern will send core to the current directory.
+	b, err := os.ReadFile("/proc/sys/kernel/core_pattern")
+	if err != nil {
+		t.Fatalf("error reading core_pattern: %v", err)
+	}
+	if string(b) != "core\n" {
+		t.Skipf("Unexpected core pattern %q", string(b))
+	}
+
+	dir := t.TempDir()
+
+	// Build the source code.
+	src := filepath.Join(dir, "main.go")
+	err = os.WriteFile(src, []byte(coreSignalSource), 0644)
+	if err != nil {
+		t.Fatalf("failed to create file: %v", err)
+	}
+	cmd := exec.Command(testenv.GoToolPath(t), "build", "-o", "a.exe", "main.go")
+	cmd.Dir = dir
+	out, err := testenv.CleanCmdEnv(cmd).CombinedOutput()
+	if err != nil {
+		t.Fatalf("building source %v\n%s", err, out)
+	}
+
+	r, w, err := os.Pipe()
+	if err != nil {
+		t.Fatalf("error creating control pipe: %v", err)
+	}
+	defer r.Close()
+
+	// Start the test binary.
+	cmd = testenv.Command(t, "./a.exe", "-pipe-fd=3")
+	cmd.Dir = dir
+	cmd.ExtraFiles = []*os.File{w}
+	var output bytes.Buffer
+	cmd.Stdout = &output // for test logging
+	cmd.Stderr = &output
+
+	if err := cmd.Start(); err != nil {
+		t.Fatalf("error starting test binary: %v", err)
+	}
+	w.Close()
+
+	// Wait for child to be ready.
+	var buf [1]byte
+	if _, err := r.Read(buf[:]); err != io.EOF {
+		t.Fatalf("control pipe read get err %v want io.EOF", err)
+	}
+
+	// 💥
+	if err := cmd.Process.Signal(os.Signal(syscall.SIGABRT)); err != nil {
+		t.Fatalf("erroring signaling child: %v", err)
+	}
+
+	err = cmd.Wait()
+	t.Logf("child output:\n%s", output.String())
+	if err == nil {
+		t.Fatalf("Wait succeeded, want SIGABRT")
+	}
+	ee, ok := err.(*exec.ExitError)
+	if !ok {
+		t.Fatalf("Wait err got %T %v, want exec.ExitError", ee, ee)
+	}
+	ws, ok := ee.Sys().(syscall.WaitStatus)
+	if !ok {
+		t.Fatalf("Sys got %T %v, want syscall.WaitStatus", ee.Sys(), ee.Sys())
+	}
+	if ws.Signal() != syscall.SIGABRT {
+		t.Fatalf("Signal got %d want SIGABRT", ws.Signal())
+	}
+	if !ws.CoreDump() {
+		t.Fatalf("CoreDump got %v want true", ws.CoreDump())
+	}
+
+	// Execute gdb commands.
+	args := []string{"-nx", "-batch",
+		"-iex", "add-auto-load-safe-path " + filepath.Join(testenv.GOROOT(t), "src", "runtime"),
+		"-ex", "backtrace",
+		filepath.Join(dir, "a.exe"),
+		filepath.Join(dir, "core"),
+	}
+	cmd = testenv.Command(t, "gdb", args...)
+
+	got, err := cmd.CombinedOutput()
+	t.Logf("gdb output:\n%s", got)
+	if err != nil {
+		t.Fatalf("gdb exited with error: %v", err)
+	}
+
+	// We don't know which thread the fatal signal will land on, but we can still check for basics:
+	//
+	// 1. A frame in the signal handler: runtime.sigtramp
+	// 2. GDB detection of the signal handler: <signal handler called>
+	// 3. A frame before the signal handler: this could be foo, or somewhere in the scheduler
+
+	re := regexp.MustCompile(`#.* runtime\.sigtramp `)
+	if found := re.Find(got) != nil; !found {
+		t.Fatalf("could not find sigtramp in backtrace")
+	}
+
+	re = regexp.MustCompile("#.* <signal handler called>")
+	loc := re.FindIndex(got)
+	if loc == nil {
+		t.Fatalf("could not find signal handler marker in backtrace")
+	}
+	rest := got[loc[1]:]
+
+	// Look for any frames after the signal handler. We want to see
+	// symbolized frames, not garbage unknown frames.
+	//
+	// Since the signal might not be delivered to the main thread we can't
+	// look for main.main. Every thread should have a runtime frame though.
+	re = regexp.MustCompile(`#.* runtime\.`)
+	if found := re.Find(rest) != nil; !found {
+		t.Fatalf("could not find runtime symbol in backtrace after signal handler:\n%s", rest)
+	}
+}
diff --git a/src/runtime/runtime-seh_windows_test.go b/src/runtime/runtime-seh_windows_test.go
new file mode 100644
index 0000000..27e4f49
--- /dev/null
+++ b/src/runtime/runtime-seh_windows_test.go
@@ -0,0 +1,191 @@
+// Copyright 2023 The Go Authors. 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 (
+	"internal/abi"
+	"internal/syscall/windows"
+	"runtime"
+	"slices"
+	"testing"
+	"unsafe"
+)
+
+func sehf1() int {
+	return sehf1()
+}
+
+func sehf2() {}
+
+func TestSehLookupFunctionEntry(t *testing.T) {
+	if runtime.GOARCH != "amd64" {
+		t.Skip("skipping amd64-only test")
+	}
+	// This test checks that Win32 is able to retrieve
+	// function metadata stored in the .pdata section
+	// by the Go linker.
+	// Win32 unwinding will fail if this test fails,
+	// as RtlUnwindEx uses RtlLookupFunctionEntry internally.
+	// If that's the case, don't bother investigating further,
+	// first fix the .pdata generation.
+	sehf1pc := abi.FuncPCABIInternal(sehf1)
+	var fnwithframe func()
+	fnwithframe = func() {
+		fnwithframe()
+	}
+	fnwithoutframe := func() {}
+	tests := []struct {
+		name     string
+		pc       uintptr
+		hasframe bool
+	}{
+		{"no frame func", abi.FuncPCABIInternal(sehf2), false},
+		{"no func", sehf1pc - 1, false},
+		{"func at entry", sehf1pc, true},
+		{"func in prologue", sehf1pc + 1, true},
+		{"anonymous func with frame", abi.FuncPCABIInternal(fnwithframe), true},
+		{"anonymous func without frame", abi.FuncPCABIInternal(fnwithoutframe), false},
+		{"pc at func body", runtime.NewContextStub().GetPC(), true},
+	}
+	for _, tt := range tests {
+		var base uintptr
+		fn := windows.RtlLookupFunctionEntry(tt.pc, &base, nil)
+		if !tt.hasframe {
+			if fn != 0 {
+				t.Errorf("%s: unexpected frame", tt.name)
+			}
+			continue
+		}
+		if fn == 0 {
+			t.Errorf("%s: missing frame", tt.name)
+		}
+	}
+}
+
+func sehCallers() []uintptr {
+	// We don't need a real context,
+	// RtlVirtualUnwind just needs a context with
+	// valid a pc, sp and fp (aka bp).
+	ctx := runtime.NewContextStub()
+
+	pcs := make([]uintptr, 15)
+	var base, frame uintptr
+	var n int
+	for i := 0; i < len(pcs); i++ {
+		fn := windows.RtlLookupFunctionEntry(ctx.GetPC(), &base, nil)
+		if fn == 0 {
+			break
+		}
+		pcs[i] = ctx.GetPC()
+		n++
+		windows.RtlVirtualUnwind(0, base, ctx.GetPC(), fn, uintptr(unsafe.Pointer(ctx)), nil, &frame, nil)
+	}
+	return pcs[:n]
+}
+
+// SEH unwinding does not report inlined frames.
+//
+//go:noinline
+func sehf3(pan bool) []uintptr {
+	return sehf4(pan)
+}
+
+//go:noinline
+func sehf4(pan bool) []uintptr {
+	var pcs []uintptr
+	if pan {
+		panic("sehf4")
+	}
+	pcs = sehCallers()
+	return pcs
+}
+
+func testSehCallersEqual(t *testing.T, pcs []uintptr, want []string) {
+	t.Helper()
+	got := make([]string, 0, len(want))
+	for _, pc := range pcs {
+		fn := runtime.FuncForPC(pc)
+		if fn == nil || len(got) >= len(want) {
+			break
+		}
+		name := fn.Name()
+		switch name {
+		case "runtime.deferCallSave", "runtime.runOpenDeferFrame", "runtime.panicmem":
+			// These functions are skipped as they appear inconsistently depending
+			// whether inlining is on or off.
+			continue
+		}
+		got = append(got, name)
+	}
+	if !slices.Equal(want, got) {
+		t.Fatalf("wanted %v, got %v", want, got)
+	}
+}
+
+func TestSehUnwind(t *testing.T) {
+	if runtime.GOARCH != "amd64" {
+		t.Skip("skipping amd64-only test")
+	}
+	pcs := sehf3(false)
+	testSehCallersEqual(t, pcs, []string{"runtime_test.sehCallers", "runtime_test.sehf4",
+		"runtime_test.sehf3", "runtime_test.TestSehUnwind"})
+}
+
+func TestSehUnwindPanic(t *testing.T) {
+	if runtime.GOARCH != "amd64" {
+		t.Skip("skipping amd64-only test")
+	}
+	want := []string{"runtime_test.sehCallers", "runtime_test.TestSehUnwindPanic.func1", "runtime.gopanic",
+		"runtime_test.sehf4", "runtime_test.sehf3", "runtime_test.TestSehUnwindPanic"}
+	defer func() {
+		if r := recover(); r == nil {
+			t.Fatal("did not panic")
+		}
+		pcs := sehCallers()
+		testSehCallersEqual(t, pcs, want)
+	}()
+	sehf3(true)
+}
+
+func TestSehUnwindDoublePanic(t *testing.T) {
+	if runtime.GOARCH != "amd64" {
+		t.Skip("skipping amd64-only test")
+	}
+	want := []string{"runtime_test.sehCallers", "runtime_test.TestSehUnwindDoublePanic.func1.1", "runtime.gopanic",
+		"runtime_test.TestSehUnwindDoublePanic.func1", "runtime.gopanic", "runtime_test.TestSehUnwindDoublePanic"}
+	defer func() {
+		defer func() {
+			if recover() == nil {
+				t.Fatal("did not panic")
+			}
+			pcs := sehCallers()
+			testSehCallersEqual(t, pcs, want)
+		}()
+		if recover() == nil {
+			t.Fatal("did not panic")
+		}
+		panic(2)
+	}()
+	panic(1)
+}
+
+func TestSehUnwindNilPointerPanic(t *testing.T) {
+	if runtime.GOARCH != "amd64" {
+		t.Skip("skipping amd64-only test")
+	}
+	want := []string{"runtime_test.sehCallers", "runtime_test.TestSehUnwindNilPointerPanic.func1", "runtime.gopanic",
+		"runtime.sigpanic", "runtime_test.TestSehUnwindNilPointerPanic"}
+	defer func() {
+		if r := recover(); r == nil {
+			t.Fatal("did not panic")
+		}
+		pcs := sehCallers()
+		testSehCallersEqual(t, pcs, want)
+	}()
+	var p *int
+	if *p == 3 {
+		t.Fatal("did not see nil pointer panic")
+	}
+}
diff --git a/src/runtime/runtime.go b/src/runtime/runtime.go
index 9f68738..0822d0e 100644
--- a/src/runtime/runtime.go
+++ b/src/runtime/runtime.go
@@ -69,21 +69,58 @@
 var godebugDefault string
 var godebugUpdate atomic.Pointer[func(string, string)]
 var godebugEnv atomic.Pointer[string] // set by parsedebugvars
+var godebugNewIncNonDefault atomic.Pointer[func(string) func()]
 
 //go:linkname godebug_setUpdate internal/godebug.setUpdate
 func godebug_setUpdate(update func(string, string)) {
 	p := new(func(string, string))
 	*p = update
 	godebugUpdate.Store(p)
-	godebugNotify()
+	godebugNotify(false)
 }
 
-func godebugNotify() {
-	if update := godebugUpdate.Load(); update != nil {
-		var env string
-		if p := godebugEnv.Load(); p != nil {
-			env = *p
+//go:linkname godebug_setNewIncNonDefault internal/godebug.setNewIncNonDefault
+func godebug_setNewIncNonDefault(newIncNonDefault func(string) func()) {
+	p := new(func(string) func())
+	*p = newIncNonDefault
+	godebugNewIncNonDefault.Store(p)
+}
+
+// A godebugInc provides access to internal/godebug's IncNonDefault function
+// for a given GODEBUG setting.
+// Calls before internal/godebug registers itself are dropped on the floor.
+type godebugInc struct {
+	name string
+	inc  atomic.Pointer[func()]
+}
+
+func (g *godebugInc) IncNonDefault() {
+	inc := g.inc.Load()
+	if inc == nil {
+		newInc := godebugNewIncNonDefault.Load()
+		if newInc == nil {
+			return
 		}
+		// If other goroutines are racing here, no big deal. One will win,
+		// and all the inc functions will be using the same underlying
+		// *godebug.Setting.
+		inc = new(func())
+		*inc = (*newInc)(g.name)
+		g.inc.Store(inc)
+	}
+	(*inc)()
+}
+
+func godebugNotify(envChanged bool) {
+	update := godebugUpdate.Load()
+	var env string
+	if p := godebugEnv.Load(); p != nil {
+		env = *p
+	}
+	if envChanged {
+		reparsedebugvars(env)
+	}
+	if update != nil {
 		(*update)(godebugDefault, env)
 	}
 }
@@ -95,7 +132,7 @@
 		p := new(string)
 		*p = value
 		godebugEnv.Store(p)
-		godebugNotify()
+		godebugNotify(true)
 	}
 }
 
@@ -104,7 +141,7 @@
 	unsetenv_c(key)
 	if key == "GODEBUG" {
 		godebugEnv.Store(nil)
-		godebugNotify()
+		godebugNotify(true)
 	}
 }
 
@@ -114,3 +151,12 @@
 func writeErrStr(s string) {
 	write(2, unsafe.Pointer(unsafe.StringData(s)), int32(len(s)))
 }
+
+// auxv is populated on relevant platforms but defined here for all platforms
+// so x/sys/cpu can assume the getAuxv symbol exists without keeping its list
+// of auxv-using GOOS build tags in sync.
+//
+// It contains an even number of elements, (tag, value) pairs.
+var auxv []uintptr
+
+func getAuxv() []uintptr { return auxv } // accessed from x/sys/cpu; see issue 57336
diff --git a/src/runtime/runtime1.go b/src/runtime/runtime1.go
index 277f18a..92a7e02 100644
--- a/src/runtime/runtime1.go
+++ b/src/runtime/runtime1.go
@@ -286,7 +286,7 @@
 
 	testAtomic64()
 
-	if _FixedStack != round2(_FixedStack) {
+	if fixedStack != round2(fixedStack) {
 		throw("FixedStack is not power-of-2")
 	}
 
@@ -296,8 +296,10 @@
 }
 
 type dbgVar struct {
-	name  string
-	value *int32
+	name   string
+	value  *int32        // for variables that can only be set at startup
+	atomic *atomic.Int32 // for variables that can be changed during execution
+	def    int32         // default value (ideally zero)
 }
 
 // Holds variables parsed from GODEBUG env var,
@@ -307,6 +309,7 @@
 var debug struct {
 	cgocheck           int32
 	clobberfree        int32
+	dontfreezetheworld int32
 	efence             int32
 	gccheckmark        int32
 	gcpacertrace       int32
@@ -322,6 +325,7 @@
 	asyncpreemptoff    int32
 	harddecommit       int32
 	adaptivestackstart int32
+	tracefpunwindoff   int32
 
 	// debug.malloc is used as a combined debug check
 	// in the malloc function and should be set
@@ -330,38 +334,41 @@
 	allocfreetrace int32
 	inittrace      int32
 	sbrk           int32
+
+	panicnil atomic.Int32
 }
 
-var dbgvars = []dbgVar{
-	{"allocfreetrace", &debug.allocfreetrace},
-	{"clobberfree", &debug.clobberfree},
-	{"cgocheck", &debug.cgocheck},
-	{"efence", &debug.efence},
-	{"gccheckmark", &debug.gccheckmark},
-	{"gcpacertrace", &debug.gcpacertrace},
-	{"gcshrinkstackoff", &debug.gcshrinkstackoff},
-	{"gcstoptheworld", &debug.gcstoptheworld},
-	{"gctrace", &debug.gctrace},
-	{"invalidptr", &debug.invalidptr},
-	{"madvdontneed", &debug.madvdontneed},
-	{"sbrk", &debug.sbrk},
-	{"scavtrace", &debug.scavtrace},
-	{"scheddetail", &debug.scheddetail},
-	{"schedtrace", &debug.schedtrace},
-	{"tracebackancestors", &debug.tracebackancestors},
-	{"asyncpreemptoff", &debug.asyncpreemptoff},
-	{"inittrace", &debug.inittrace},
-	{"harddecommit", &debug.harddecommit},
-	{"adaptivestackstart", &debug.adaptivestackstart},
+var dbgvars = []*dbgVar{
+	{name: "allocfreetrace", value: &debug.allocfreetrace},
+	{name: "clobberfree", value: &debug.clobberfree},
+	{name: "cgocheck", value: &debug.cgocheck},
+	{name: "dontfreezetheworld", value: &debug.dontfreezetheworld},
+	{name: "efence", value: &debug.efence},
+	{name: "gccheckmark", value: &debug.gccheckmark},
+	{name: "gcpacertrace", value: &debug.gcpacertrace},
+	{name: "gcshrinkstackoff", value: &debug.gcshrinkstackoff},
+	{name: "gcstoptheworld", value: &debug.gcstoptheworld},
+	{name: "gctrace", value: &debug.gctrace},
+	{name: "invalidptr", value: &debug.invalidptr},
+	{name: "madvdontneed", value: &debug.madvdontneed},
+	{name: "sbrk", value: &debug.sbrk},
+	{name: "scavtrace", value: &debug.scavtrace},
+	{name: "scheddetail", value: &debug.scheddetail},
+	{name: "schedtrace", value: &debug.schedtrace},
+	{name: "tracebackancestors", value: &debug.tracebackancestors},
+	{name: "asyncpreemptoff", value: &debug.asyncpreemptoff},
+	{name: "inittrace", value: &debug.inittrace},
+	{name: "harddecommit", value: &debug.harddecommit},
+	{name: "adaptivestackstart", value: &debug.adaptivestackstart},
+	{name: "tracefpunwindoff", value: &debug.tracefpunwindoff},
+	{name: "panicnil", atomic: &debug.panicnil},
 }
 
-var globalGODEBUG string
-
 func parsedebugvars() {
 	// defaults
 	debug.cgocheck = 1
 	debug.invalidptr = 1
-	debug.adaptivestackstart = 1 // go119 - set this to 0 to turn larger initial goroutine stacks off
+	debug.adaptivestackstart = 1 // set this to 0 to turn larger initial goroutine stacks off
 	if GOOS == "linux" {
 		// On Linux, MADV_FREE is faster than MADV_DONTNEED,
 		// but doesn't affect many of the statistics that
@@ -374,26 +381,101 @@
 		debug.madvdontneed = 1
 	}
 
-	globalGODEBUG = gogetenv("GODEBUG")
-	godebugEnv.StoreNoWB(&globalGODEBUG)
-	for p := globalGODEBUG; p != ""; {
-		field := ""
-		i := bytealg.IndexByteString(p, ',')
-		if i < 0 {
-			field, p = p, ""
-		} else {
-			field, p = p[:i], p[i+1:]
+	godebug := gogetenv("GODEBUG")
+
+	p := new(string)
+	*p = godebug
+	godebugEnv.Store(p)
+
+	// apply runtime defaults, if any
+	for _, v := range dbgvars {
+		if v.def != 0 {
+			// Every var should have either v.value or v.atomic set.
+			if v.value != nil {
+				*v.value = v.def
+			} else if v.atomic != nil {
+				v.atomic.Store(v.def)
+			}
 		}
-		i = bytealg.IndexByteString(field, '=')
+	}
+
+	// apply compile-time GODEBUG settings
+	parsegodebug(godebugDefault, nil)
+
+	// apply environment settings
+	parsegodebug(godebug, nil)
+
+	debug.malloc = (debug.allocfreetrace | debug.inittrace | debug.sbrk) != 0
+
+	setTraceback(gogetenv("GOTRACEBACK"))
+	traceback_env = traceback_cache
+}
+
+// reparsedebugvars reparses the runtime's debug variables
+// because the environment variable has been changed to env.
+func reparsedebugvars(env string) {
+	seen := make(map[string]bool)
+	// apply environment settings
+	parsegodebug(env, seen)
+	// apply compile-time GODEBUG settings for as-yet-unseen variables
+	parsegodebug(godebugDefault, seen)
+	// apply defaults for as-yet-unseen variables
+	for _, v := range dbgvars {
+		if v.atomic != nil && !seen[v.name] {
+			v.atomic.Store(0)
+		}
+	}
+}
+
+// parsegodebug parses the godebug string, updating variables listed in dbgvars.
+// If seen == nil, this is startup time and we process the string left to right
+// overwriting older settings with newer ones.
+// If seen != nil, $GODEBUG has changed and we are doing an
+// incremental update. To avoid flapping in the case where a value is
+// set multiple times (perhaps in the default and the environment,
+// or perhaps twice in the environment), we process the string right-to-left
+// and only change values not already seen. After doing this for both
+// the environment and the default settings, the caller must also call
+// cleargodebug(seen) to reset any now-unset values back to their defaults.
+func parsegodebug(godebug string, seen map[string]bool) {
+	for p := godebug; p != ""; {
+		var field string
+		if seen == nil {
+			// startup: process left to right, overwriting older settings with newer
+			i := bytealg.IndexByteString(p, ',')
+			if i < 0 {
+				field, p = p, ""
+			} else {
+				field, p = p[:i], p[i+1:]
+			}
+		} else {
+			// incremental update: process right to left, updating and skipping seen
+			i := len(p) - 1
+			for i >= 0 && p[i] != ',' {
+				i--
+			}
+			if i < 0 {
+				p, field = "", p
+			} else {
+				p, field = p[:i], p[i+1:]
+			}
+		}
+		i := bytealg.IndexByteString(field, '=')
 		if i < 0 {
 			continue
 		}
 		key, value := field[:i], field[i+1:]
+		if seen[key] {
+			continue
+		}
+		if seen != nil {
+			seen[key] = true
+		}
 
 		// Update MemProfileRate directly here since it
 		// is int, not int32, and should only be updated
 		// if specified in GODEBUG.
-		if key == "memprofilerate" {
+		if seen == nil && key == "memprofilerate" {
 			if n, ok := atoi(value); ok {
 				MemProfileRate = n
 			}
@@ -401,17 +483,20 @@
 			for _, v := range dbgvars {
 				if v.name == key {
 					if n, ok := atoi32(value); ok {
-						*v.value = n
+						if seen == nil && v.value != nil {
+							*v.value = n
+						} else if v.atomic != nil {
+							v.atomic.Store(n)
+						}
 					}
 				}
 			}
 		}
 	}
 
-	debug.malloc = (debug.allocfreetrace | debug.inittrace | debug.sbrk) != 0
-
-	setTraceback(gogetenv("GOTRACEBACK"))
-	traceback_env = traceback_cache
+	if debug.cgocheck > 1 {
+		throw("cgocheck > 1 mode is no longer supported at runtime. Use GOEXPERIMENT=cgocheck2 at build time instead.")
+	}
 }
 
 //go:linkname setTraceback runtime/debug.SetTraceback
@@ -428,6 +513,13 @@
 		t = 2<<tracebackShift | tracebackAll
 	case "crash":
 		t = 2<<tracebackShift | tracebackAll | tracebackCrash
+	case "wer":
+		if GOOS == "windows" {
+			t = 2<<tracebackShift | tracebackAll | tracebackCrash
+			enableWER()
+			break
+		}
+		fallthrough
 	default:
 		t = tracebackAll
 		if n, ok := atoi(level); ok && n == int(uint32(n)) {
@@ -509,21 +601,21 @@
 //
 //go:linkname reflect_resolveNameOff reflect.resolveNameOff
 func reflect_resolveNameOff(ptrInModule unsafe.Pointer, off int32) unsafe.Pointer {
-	return unsafe.Pointer(resolveNameOff(ptrInModule, nameOff(off)).bytes)
+	return unsafe.Pointer(resolveNameOff(ptrInModule, nameOff(off)).Bytes)
 }
 
 // reflect_resolveTypeOff resolves an *rtype offset from a base type.
 //
 //go:linkname reflect_resolveTypeOff reflect.resolveTypeOff
 func reflect_resolveTypeOff(rtype unsafe.Pointer, off int32) unsafe.Pointer {
-	return unsafe.Pointer((*_type)(rtype).typeOff(typeOff(off)))
+	return unsafe.Pointer(toRType((*_type)(rtype)).typeOff(typeOff(off)))
 }
 
 // reflect_resolveTextOff resolves a function pointer offset from a base type.
 //
 //go:linkname reflect_resolveTextOff reflect.resolveTextOff
 func reflect_resolveTextOff(rtype unsafe.Pointer, off int32) unsafe.Pointer {
-	return (*_type)(rtype).textOff(textOff(off))
+	return toRType((*_type)(rtype)).textOff(textOff(off))
 
 }
 
@@ -531,14 +623,14 @@
 //
 //go:linkname reflectlite_resolveNameOff internal/reflectlite.resolveNameOff
 func reflectlite_resolveNameOff(ptrInModule unsafe.Pointer, off int32) unsafe.Pointer {
-	return unsafe.Pointer(resolveNameOff(ptrInModule, nameOff(off)).bytes)
+	return unsafe.Pointer(resolveNameOff(ptrInModule, nameOff(off)).Bytes)
 }
 
 // reflectlite_resolveTypeOff resolves an *rtype offset from a base type.
 //
 //go:linkname reflectlite_resolveTypeOff internal/reflectlite.resolveTypeOff
 func reflectlite_resolveTypeOff(rtype unsafe.Pointer, off int32) unsafe.Pointer {
-	return unsafe.Pointer((*_type)(rtype).typeOff(typeOff(off)))
+	return unsafe.Pointer(toRType((*_type)(rtype)).typeOff(typeOff(off)))
 }
 
 // reflect_addReflectOff adds a pointer to the reflection offset lookup map.
diff --git a/src/runtime/runtime2.go b/src/runtime/runtime2.go
index 9381d1e..f4c76ab 100644
--- a/src/runtime/runtime2.go
+++ b/src/runtime/runtime2.go
@@ -5,8 +5,10 @@
 package runtime
 
 import (
+	"internal/abi"
 	"internal/goarch"
 	"runtime/internal/atomic"
+	"runtime/internal/sys"
 	"unsafe"
 )
 
@@ -270,6 +272,11 @@
 	return atomic.Casuintptr((*uintptr)(unsafe.Pointer(gp)), uintptr(old), uintptr(new))
 }
 
+//go:nosplit
+func (gp *g) guintptr() guintptr {
+	return guintptr(unsafe.Pointer(gp))
+}
+
 // setGNoWB performs *gp = new without a write barrier.
 // For times when it's impractical to use a guintptr.
 //
@@ -464,35 +471,35 @@
 	// for stack shrinking.
 	parkingOnChan atomic.Bool
 
-	raceignore     int8     // ignore race detection events
-	sysblocktraced bool     // StartTrace has emitted EvGoInSyscall about this goroutine
-	tracking       bool     // whether we're tracking this G for sched latency statistics
-	trackingSeq    uint8    // used to decide whether to track this G
-	trackingStamp  int64    // timestamp of when the G last started being tracked
-	runnableTime   int64    // the amount of time spent runnable, cleared when running, only used when tracking
-	sysexitticks   int64    // cputicks when syscall has returned (for tracing)
-	traceseq       uint64   // trace event sequencer
-	tracelastp     puintptr // last P emitted an event for this goroutine
-	lockedm        muintptr
-	sig            uint32
-	writebuf       []byte
-	sigcode0       uintptr
-	sigcode1       uintptr
-	sigpc          uintptr
-	gopc           uintptr         // pc of go statement that created this goroutine
-	ancestors      *[]ancestorInfo // ancestor information goroutine(s) that created this goroutine (only used if debug.tracebackancestors)
-	startpc        uintptr         // pc of goroutine function
-	racectx        uintptr
-	waiting        *sudog         // sudog structures this g is waiting on (that have a valid elem ptr); in lock order
-	cgoCtxt        []uintptr      // cgo traceback context
-	labels         unsafe.Pointer // profiler labels
-	timer          *timer         // cached timer for time.Sleep
-	selectDone     atomic.Uint32  // are we participating in a select and did someone win the race?
+	raceignore    int8  // ignore race detection events
+	tracking      bool  // whether we're tracking this G for sched latency statistics
+	trackingSeq   uint8 // used to decide whether to track this G
+	trackingStamp int64 // timestamp of when the G last started being tracked
+	runnableTime  int64 // the amount of time spent runnable, cleared when running, only used when tracking
+	lockedm       muintptr
+	sig           uint32
+	writebuf      []byte
+	sigcode0      uintptr
+	sigcode1      uintptr
+	sigpc         uintptr
+	parentGoid    uint64          // goid of goroutine that created this goroutine
+	gopc          uintptr         // pc of go statement that created this goroutine
+	ancestors     *[]ancestorInfo // ancestor information goroutine(s) that created this goroutine (only used if debug.tracebackancestors)
+	startpc       uintptr         // pc of goroutine function
+	racectx       uintptr
+	waiting       *sudog         // sudog structures this g is waiting on (that have a valid elem ptr); in lock order
+	cgoCtxt       []uintptr      // cgo traceback context
+	labels        unsafe.Pointer // profiler labels
+	timer         *timer         // cached timer for time.Sleep
+	selectDone    atomic.Uint32  // are we participating in a select and did someone win the race?
 
 	// goroutineProfiled indicates the status of this goroutine's stack for the
 	// current in-progress goroutine profile
 	goroutineProfiled goroutineProfileStateHolder
 
+	// Per-G tracer state.
+	trace gTraceState
+
 	// Per-G GC state
 
 	// gcAssistBytes is this G's GC assist credit in terms of
@@ -554,6 +561,7 @@
 	printlock     int8
 	incgo         bool          // m is executing a cgo call
 	isextra       bool          // m is an extra m
+	isExtraInC    bool          // m is an extra m that is not executing Go code
 	freeWait      atomic.Uint32 // Whether it is safe to free g0 and delete m (one of freeMRef, freeMStack, freeMWait)
 	fastrand      uint64
 	needextram    bool
@@ -570,13 +578,17 @@
 	lockedExt     uint32      // tracking for external LockOSThread
 	lockedInt     uint32      // tracking for internal lockOSThread
 	nextwaitm     muintptr    // next m waiting for lock
-	waitunlockf   func(*g, unsafe.Pointer) bool
-	waitlock      unsafe.Pointer
-	waittraceev   byte
-	waittraceskip int
-	startingtrace bool
-	syscalltick   uint32
-	freelink      *m // on sched.freem
+
+	// wait* are used to carry arguments from gopark into park_m, because
+	// there's no stack to put them on. That is their sole purpose.
+	waitunlockf          func(*g, unsafe.Pointer) bool
+	waitlock             unsafe.Pointer
+	waitTraceBlockReason traceBlockReason
+	waitTraceSkip        int
+
+	syscalltick uint32
+	freelink    *m // on sched.freem
+	trace       mTraceState
 
 	// these are here because they are too large to be on the stack
 	// of low-level NOSPLIT functions.
@@ -657,21 +669,17 @@
 		// We need an explicit length here because this field is used
 		// in allocation codepaths where write barriers are not allowed,
 		// and eliminating the write barrier/keeping it eliminated from
-		// slice updates is tricky, moreso than just managing the length
+		// slice updates is tricky, more so than just managing the length
 		// ourselves.
 		len int
 		buf [128]*mspan
 	}
 
-	tracebuf traceBufPtr
+	// Cache of a single pinner object to reduce allocations from repeated
+	// pinner creation.
+	pinnerCache *pinner
 
-	// traceSweep indicates the sweep events should be traced.
-	// This is used to defer the sweep start event until a span
-	// has actually been swept.
-	traceSweep bool
-	// traceSwept and traceReclaimed track the number of bytes
-	// swept and reclaimed by sweeping in the current sweep loop.
-	traceSwept, traceReclaimed uintptr
+	trace pTraceState
 
 	palloc persistentAlloc // per-P to avoid mutex
 
@@ -880,6 +888,8 @@
 // Keep in sync with linker (../cmd/link/internal/ld/pcln.go:/pclntab)
 // and with package debug/gosym and with symtab.go in package runtime.
 type _func struct {
+	sys.NotInHeap // Only in static data
+
 	entryOff uint32 // start pc, as offset from moduledata.text/pcHeader.textStart
 	nameOff  int32  // function name, as index into moduledata.funcnametab.
 
@@ -890,10 +900,10 @@
 	pcfile    uint32
 	pcln      uint32
 	npcdata   uint32
-	cuOffset  uint32 // runtime.cutab offset of this function's CU
-	startLine int32  // line number of start of function (func keyword/TEXT directive)
-	funcID    funcID // set for certain special runtime functions
-	flag      funcFlag
+	cuOffset  uint32     // runtime.cutab offset of this function's CU
+	startLine int32      // line number of start of function (func keyword/TEXT directive)
+	funcID    abi.FuncID // set for certain special runtime functions
+	flag      abi.FuncFlag
 	_         [1]byte // pad
 	nfuncdata uint8   // must be last, must end on a uint32-aligned boundary
 
@@ -923,6 +933,8 @@
 // Pseudo-Func that is returned for PCs that occur in inlined code.
 // A *Func can be either a *_func or a *funcinl, and they are distinguished
 // by the first uintptr.
+//
+// TODO(austin): Can we merge this with inlinedCall?
 type funcinl struct {
 	ones      uint32  // set to ^0 to distinguish from _func
 	entry     uintptr // entry of the real (the "outermost") frame
@@ -1038,15 +1050,6 @@
 	gopc uintptr   // pc of go statement that created this goroutine
 }
 
-const (
-	_TraceRuntimeFrames = 1 << iota // include frames for internal runtime functions.
-	_TraceTrap                      // the initial PC, SP are from a trap, not a return PC from a call
-	_TraceJumpStack                 // if traceback is on a systemstack, resume trace at g that called into it
-)
-
-// The maximum number of frames we print for a traceback
-const _TracebackMaxFrames = 100
-
 // A waitReason explains why a goroutine has been stopped.
 // See gopark. Do not re-use waitReasons, add new ones.
 type waitReason uint8
diff --git a/src/runtime/runtime_test.go b/src/runtime/runtime_test.go
index 2faf06e..0839cd9 100644
--- a/src/runtime/runtime_test.go
+++ b/src/runtime/runtime_test.go
@@ -207,8 +207,8 @@
 //
 //go:nocheckptr
 func testSetPanicOnFault(t *testing.T, addr uintptr, nfault *int) {
-	if GOOS == "js" {
-		t.Skip("js does not support catching faults")
+	if GOOS == "js" || GOOS == "wasip1" {
+		t.Skip(GOOS + " does not support catching faults")
 	}
 
 	defer func() {
diff --git a/src/runtime/security_aix.go b/src/runtime/security_aix.go
new file mode 100644
index 0000000..c11b9c3
--- /dev/null
+++ b/src/runtime/security_aix.go
@@ -0,0 +1,17 @@
+// Copyright 2023 The Go Authors. 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
+
+// secureMode is only ever mutated in schedinit, so we don't need to worry about
+// synchronization primitives.
+var secureMode bool
+
+func initSecureMode() {
+	secureMode = !(getuid() == geteuid() && getgid() == getegid())
+}
+
+func isSecureMode() bool {
+	return secureMode
+}
diff --git a/src/runtime/security_issetugid.go b/src/runtime/security_issetugid.go
new file mode 100644
index 0000000..5048632
--- /dev/null
+++ b/src/runtime/security_issetugid.go
@@ -0,0 +1,19 @@
+// Copyright 2023 The Go 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:build darwin || dragonfly || freebsd || illumos || netbsd || openbsd || solaris
+
+package runtime
+
+// secureMode is only ever mutated in schedinit, so we don't need to worry about
+// synchronization primitives.
+var secureMode bool
+
+func initSecureMode() {
+	secureMode = issetugid() == 1
+}
+
+func isSecureMode() bool {
+	return secureMode
+}
diff --git a/src/runtime/security_linux.go b/src/runtime/security_linux.go
new file mode 100644
index 0000000..181f3a1
--- /dev/null
+++ b/src/runtime/security_linux.go
@@ -0,0 +1,15 @@
+// Copyright 2023 The Go Authors. 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"
+
+func initSecureMode() {
+	// We have already initialized the secureMode bool in sysauxv.
+}
+
+func isSecureMode() bool {
+	return secureMode
+}
diff --git a/src/runtime/security_nonunix.go b/src/runtime/security_nonunix.go
new file mode 100644
index 0000000..fc9571c
--- /dev/null
+++ b/src/runtime/security_nonunix.go
@@ -0,0 +1,13 @@
+// Copyright 2023 The Go 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:build !unix
+
+package runtime
+
+func isSecureMode() bool {
+	return false
+}
+
+func secure() {}
diff --git a/src/runtime/security_test.go b/src/runtime/security_test.go
new file mode 100644
index 0000000..5cd90f9
--- /dev/null
+++ b/src/runtime/security_test.go
@@ -0,0 +1,145 @@
+// Copyright 2023 The Go 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:build unix
+
+package runtime_test
+
+import (
+	"bytes"
+	"context"
+	"fmt"
+	"internal/testenv"
+	"io"
+	"os"
+	"os/exec"
+	"path/filepath"
+	"runtime"
+	"strings"
+	"testing"
+	"time"
+)
+
+func privesc(command string, args ...string) error {
+	ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
+	defer cancel()
+	var cmd *exec.Cmd
+	if runtime.GOOS == "darwin" {
+		cmd = exec.CommandContext(ctx, "sudo", append([]string{"-n", command}, args...)...)
+	} else if runtime.GOOS == "openbsd" {
+		cmd = exec.CommandContext(ctx, "doas", append([]string{"-n", command}, args...)...)
+	} else {
+		cmd = exec.CommandContext(ctx, "su", highPrivUser, "-c", fmt.Sprintf("%s %s", command, strings.Join(args, " ")))
+	}
+	_, err := cmd.CombinedOutput()
+	return err
+}
+
+const highPrivUser = "root"
+
+func setSetuid(t *testing.T, user, bin string) {
+	t.Helper()
+	// We escalate privileges here even if we are root, because for some reason on some builders
+	// (at least freebsd-amd64-13_0) the default PATH doesn't include /usr/sbin, which is where
+	// chown lives, but using 'su root -c' gives us the correct PATH.
+
+	// buildTestProg uses os.MkdirTemp which creates directories with 0700, which prevents
+	// setuid binaries from executing because of the missing g+rx, so we need to set the parent
+	// directory to better permissions before anything else. We created this directory, so we
+	// shouldn't need to do any privilege trickery.
+	if err := privesc("chmod", "0777", filepath.Dir(bin)); err != nil {
+		t.Skipf("unable to set permissions on %q, likely no passwordless sudo/su: %s", filepath.Dir(bin), err)
+	}
+
+	if err := privesc("chown", user, bin); err != nil {
+		t.Skipf("unable to set permissions on test binary, likely no passwordless sudo/su: %s", err)
+	}
+	if err := privesc("chmod", "u+s", bin); err != nil {
+		t.Skipf("unable to set permissions on test binary, likely no passwordless sudo/su: %s", err)
+	}
+}
+
+func TestSUID(t *testing.T) {
+	// This test is relatively simple, we build a test program which opens a
+	// file passed via the TEST_OUTPUT envvar, prints the value of the
+	// GOTRACEBACK envvar to stdout, and prints "hello" to stderr. We then chown
+	// the program to "nobody" and set u+s on it. We execute the program, only
+	// passing it two files, for stdin and stdout, and passing
+	// GOTRACEBACK=system in the env.
+	//
+	// We expect that the program will trigger the SUID protections, resetting
+	// the value of GOTRACEBACK, and opening the missing stderr descriptor, such
+	// that the program prints "GOTRACEBACK=none" to stdout, and nothing gets
+	// written to the file pointed at by TEST_OUTPUT.
+
+	if *flagQuick {
+		t.Skip("-quick")
+	}
+
+	testenv.MustHaveGoBuild(t)
+
+	helloBin, err := buildTestProg(t, "testsuid")
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	f, err := os.CreateTemp(t.TempDir(), "suid-output")
+	if err != nil {
+		t.Fatal(err)
+	}
+	tempfilePath := f.Name()
+	f.Close()
+
+	lowPrivUser := "nobody"
+	setSetuid(t, lowPrivUser, helloBin)
+
+	b := bytes.NewBuffer(nil)
+	pr, pw, err := os.Pipe()
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	proc, err := os.StartProcess(helloBin, []string{helloBin}, &os.ProcAttr{
+		Env:   []string{"GOTRACEBACK=system", "TEST_OUTPUT=" + tempfilePath},
+		Files: []*os.File{os.Stdin, pw},
+	})
+	if err != nil {
+		if os.IsPermission(err) {
+			t.Skip("don't have execute permission on setuid binary, possibly directory permission issue?")
+		}
+		t.Fatal(err)
+	}
+	done := make(chan bool, 1)
+	go func() {
+		io.Copy(b, pr)
+		pr.Close()
+		done <- true
+	}()
+	ps, err := proc.Wait()
+	if err != nil {
+		t.Fatal(err)
+	}
+	pw.Close()
+	<-done
+	output := b.String()
+
+	if ps.ExitCode() == 99 {
+		t.Skip("binary wasn't setuid (uid == euid), unable to effectively test")
+	}
+
+	expected := "GOTRACEBACK=none\n"
+	if output != expected {
+		t.Errorf("unexpected output, got: %q, want %q", output, expected)
+	}
+
+	fc, err := os.ReadFile(tempfilePath)
+	if err != nil {
+		t.Fatal(err)
+	}
+	if string(fc) != "" {
+		t.Errorf("unexpected file content, got: %q", string(fc))
+	}
+
+	// TODO: check the registers aren't leaked?
+}
diff --git a/src/runtime/security_unix.go b/src/runtime/security_unix.go
new file mode 100644
index 0000000..16fc87e
--- /dev/null
+++ b/src/runtime/security_unix.go
@@ -0,0 +1,72 @@
+// Copyright 2023 The Go 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:build unix
+
+package runtime
+
+func secure() {
+	initSecureMode()
+
+	if !isSecureMode() {
+		return
+	}
+
+	// When secure mode is enabled, we do two things:
+	//   1. ensure the file descriptors 0, 1, and 2 are open, and if not open them,
+	//      pointing at /dev/null (or fail)
+	//   2. enforce specific environment variable values (currently we only force
+	//		GOTRACEBACK=none)
+	//
+	// Other packages may also disable specific functionality when secure mode
+	// is enabled (determined by using linkname to call isSecureMode).
+	//
+	// NOTE: we may eventually want to enforce (1) regardless of whether secure
+	// mode is enabled or not.
+
+	secureFDs()
+	secureEnv()
+}
+
+func secureEnv() {
+	var hasTraceback bool
+	for i := 0; i < len(envs); i++ {
+		if hasPrefix(envs[i], "GOTRACEBACK=") {
+			hasTraceback = true
+			envs[i] = "GOTRACEBACK=none"
+		}
+	}
+	if !hasTraceback {
+		envs = append(envs, "GOTRACEBACK=none")
+	}
+}
+
+func secureFDs() {
+	const (
+		// F_GETFD and EBADF are standard across all unixes, define
+		// them here rather than in each of the OS specific files
+		F_GETFD = 0x01
+		EBADF   = 0x09
+	)
+
+	devNull := []byte("/dev/null\x00")
+	for i := 0; i < 3; i++ {
+		ret, errno := fcntl(int32(i), F_GETFD, 0)
+		if ret >= 0 {
+			continue
+		}
+		if errno != EBADF {
+			print("runtime: unexpected error while checking standard file descriptor ", i, ", errno=", errno, "\n")
+			throw("cannot secure fds")
+		}
+
+		if ret := open(&devNull[0], 2 /* O_RDWR */, 0); ret < 0 {
+			print("runtime: standard file descriptor ", i, " closed, unable to open /dev/null, errno=", errno, "\n")
+			throw("cannot secure fds")
+		} else if ret != int32(i) {
+			print("runtime: opened unexpected file descriptor ", ret, " when attempting to open ", i, "\n")
+			throw("cannot secure fds")
+		}
+	}
+}
diff --git a/src/runtime/select.go b/src/runtime/select.go
index 1072465..34c0637 100644
--- a/src/runtime/select.go
+++ b/src/runtime/select.go
@@ -100,7 +100,7 @@
 }
 
 func block() {
-	gopark(nil, nil, waitReasonSelectNoCases, traceEvGoStop, 1) // forever
+	gopark(nil, nil, waitReasonSelectNoCases, traceBlockForever, 1) // forever
 }
 
 // selectgo implements the select statement.
@@ -324,7 +324,7 @@
 	// changes and when we set gp.activeStackChans is not safe for
 	// stack shrinking.
 	gp.parkingOnChan.Store(true)
-	gopark(selparkcommit, nil, waitReasonSelect, traceEvGoBlockSelect, 1)
+	gopark(selparkcommit, nil, waitReasonSelect, traceBlockSelect, 1)
 	gp.activeStackChans = false
 
 	sellock(scases, lockorder)
@@ -400,16 +400,16 @@
 	}
 	if msanenabled {
 		if casi < nsends {
-			msanread(cas.elem, c.elemtype.size)
+			msanread(cas.elem, c.elemtype.Size_)
 		} else if cas.elem != nil {
-			msanwrite(cas.elem, c.elemtype.size)
+			msanwrite(cas.elem, c.elemtype.Size_)
 		}
 	}
 	if asanenabled {
 		if casi < nsends {
-			asanread(cas.elem, c.elemtype.size)
+			asanread(cas.elem, c.elemtype.Size_)
 		} else if cas.elem != nil {
-			asanwrite(cas.elem, c.elemtype.size)
+			asanwrite(cas.elem, c.elemtype.Size_)
 		}
 	}
 
@@ -425,10 +425,10 @@
 		racenotify(c, c.recvx, nil)
 	}
 	if msanenabled && cas.elem != nil {
-		msanwrite(cas.elem, c.elemtype.size)
+		msanwrite(cas.elem, c.elemtype.Size_)
 	}
 	if asanenabled && cas.elem != nil {
-		asanwrite(cas.elem, c.elemtype.size)
+		asanwrite(cas.elem, c.elemtype.Size_)
 	}
 	recvOK = true
 	qp = chanbuf(c, c.recvx)
@@ -451,10 +451,10 @@
 		raceReadObjectPC(c.elemtype, cas.elem, casePC(casi), chansendpc)
 	}
 	if msanenabled {
-		msanread(cas.elem, c.elemtype.size)
+		msanread(cas.elem, c.elemtype.Size_)
 	}
 	if asanenabled {
-		asanread(cas.elem, c.elemtype.size)
+		asanread(cas.elem, c.elemtype.Size_)
 	}
 	typedmemmove(c.elemtype, chanbuf(c, c.sendx), cas.elem)
 	c.sendx++
@@ -492,10 +492,10 @@
 		raceReadObjectPC(c.elemtype, cas.elem, casePC(casi), chansendpc)
 	}
 	if msanenabled {
-		msanread(cas.elem, c.elemtype.size)
+		msanread(cas.elem, c.elemtype.Size_)
 	}
 	if asanenabled {
-		asanread(cas.elem, c.elemtype.size)
+		asanread(cas.elem, c.elemtype.Size_)
 	}
 	send(c, sg, cas.elem, func() { selunlock(scases, lockorder) }, 2)
 	if debugSelect {
diff --git a/src/runtime/sema.go b/src/runtime/sema.go
index bc23a85..d0a8117 100644
--- a/src/runtime/sema.go
+++ b/src/runtime/sema.go
@@ -157,7 +157,7 @@
 		// Any semrelease after the cansemacquire knows we're waiting
 		// (we set nwait above), so go to sleep.
 		root.queue(addr, s, lifo)
-		goparkunlock(&root.lock, reason, traceEvGoBlockSync, 4+skipframes)
+		goparkunlock(&root.lock, reason, traceBlockSync, 4+skipframes)
 		if s.ticket != 0 || cansemacquire(addr) {
 			break
 		}
@@ -524,7 +524,7 @@
 		l.tail.next = s
 	}
 	l.tail = s
-	goparkunlock(&l.lock, waitReasonSyncCondWait, traceEvGoBlockCond, 3)
+	goparkunlock(&l.lock, waitReasonSyncCondWait, traceBlockCondWait, 3)
 	if t0 != 0 {
 		blockevent(s.releasetime-t0, 2)
 	}
diff --git a/src/runtime/semasleep_test.go b/src/runtime/semasleep_test.go
index 7262853..711d5df 100644
--- a/src/runtime/semasleep_test.go
+++ b/src/runtime/semasleep_test.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build !plan9 && !windows && !js
+//go:build !plan9 && !windows && !js && !wasip1
 
 package runtime_test
 
diff --git a/src/runtime/signal_arm64.go b/src/runtime/signal_arm64.go
index c8b8781..4a96b3c 100644
--- a/src/runtime/signal_arm64.go
+++ b/src/runtime/signal_arm64.go
@@ -8,6 +8,7 @@
 
 import (
 	"internal/abi"
+	"internal/goarch"
 	"runtime/internal/sys"
 	"unsafe"
 )
@@ -68,6 +69,12 @@
 	sp := c.sp() - sys.StackAlign // needs only sizeof uint64, but must align the stack
 	c.set_sp(sp)
 	*(*uint64)(unsafe.Pointer(uintptr(sp))) = c.lr()
+	// Make sure a valid frame pointer is saved on the stack so that the
+	// frame pointer checks in adjustframe are happy, if they're enabled.
+	// Frame pointer unwinding won't visit the sigpanic frame, since
+	// sigpanic will save the same frame pointer before calling into a panic
+	// function.
+	*(*uint64)(unsafe.Pointer(uintptr(sp - goarch.PtrSize))) = c.r29()
 
 	pc := gp.sigpc
 
@@ -89,6 +96,10 @@
 	sp := c.sp() - 16 // SP needs 16-byte alignment
 	c.set_sp(sp)
 	*(*uint64)(unsafe.Pointer(uintptr(sp))) = c.lr()
+	// Make sure a valid frame pointer is saved on the stack so that the
+	// frame pointer checks in adjustframe are happy, if they're enabled.
+	// This is not actually used for unwinding.
+	*(*uint64)(unsafe.Pointer(uintptr(sp - goarch.PtrSize))) = c.r29()
 	// Set up PC and LR to pretend the function being signaled
 	// calls targetPC at resumePC.
 	c.set_lr(uint64(resumePC))
diff --git a/src/runtime/signal_loong64.go b/src/runtime/signal_loong64.go
index 26717a6..ac842c0 100644
--- a/src/runtime/signal_loong64.go
+++ b/src/runtime/signal_loong64.go
@@ -77,10 +77,8 @@
 	}
 
 	// In case we are panicking from external C code
-	sigpanicPC := uint64(abi.FuncPCABIInternal(sigpanic))
-	c.set_r31(sigpanicPC >> 32 << 32) // RSB register
 	c.set_r22(uint64(uintptr(unsafe.Pointer(gp))))
-	c.set_pc(sigpanicPC)
+	c.set_pc(uint64(abi.FuncPCABIInternal(sigpanic)))
 }
 
 func (c *sigctxt) pushCall(targetPC, resumePC uintptr) {
diff --git a/src/runtime/signal_netbsd_amd64.go b/src/runtime/signal_netbsd_amd64.go
index 67fe437..2112efe 100644
--- a/src/runtime/signal_netbsd_amd64.go
+++ b/src/runtime/signal_netbsd_amd64.go
@@ -26,7 +26,7 @@
 func (c *sigctxt) rbp() uint64 { return c.regs().__gregs[_REG_RBP] }
 func (c *sigctxt) rsp() uint64 { return c.regs().__gregs[_REG_RSP] }
 func (c *sigctxt) r8() uint64  { return c.regs().__gregs[_REG_R8] }
-func (c *sigctxt) r9() uint64  { return c.regs().__gregs[_REG_R8] }
+func (c *sigctxt) r9() uint64  { return c.regs().__gregs[_REG_R9] }
 func (c *sigctxt) r10() uint64 { return c.regs().__gregs[_REG_R10] }
 func (c *sigctxt) r11() uint64 { return c.regs().__gregs[_REG_R11] }
 func (c *sigctxt) r12() uint64 { return c.regs().__gregs[_REG_R12] }
diff --git a/src/runtime/signal_unix.go b/src/runtime/signal_unix.go
index c401fc1..ae842e9 100644
--- a/src/runtime/signal_unix.go
+++ b/src/runtime/signal_unix.go
@@ -397,7 +397,7 @@
 //go:nosplit
 func sigFetchG(c *sigctxt) *g {
 	switch GOARCH {
-	case "arm", "arm64", "ppc64", "ppc64le", "riscv64", "s390x":
+	case "arm", "arm64", "loong64", "ppc64", "ppc64le", "riscv64", "s390x":
 		if !iscgo && inVDSOPage(c.sigpc()) {
 			// When using cgo, we save the g on TLS and load it from there
 			// in sigtramp. Just use that.
@@ -435,7 +435,7 @@
 	c := &sigctxt{info, ctx}
 	gp := sigFetchG(c)
 	setg(gp)
-	if gp == nil {
+	if gp == nil || (gp.m != nil && gp.m.isExtraInC) {
 		if sig == _SIGPROF {
 			// Some platforms (Linux) have per-thread timers, which we use in
 			// combination with the process-wide timer. Avoid double-counting.
@@ -458,7 +458,18 @@
 			return
 		}
 		c.fixsigcode(sig)
+		// Set g to nil here and badsignal will use g0 by needm.
+		// TODO: reuse the current m here by using the gsignal and adjustSignalStack,
+		// since the current g maybe a normal goroutine and actually running on the signal stack,
+		// it may hit stack split that is not expected here.
+		if gp != nil {
+			setg(nil)
+		}
 		badsignal(uintptr(sig), c)
+		// Restore g
+		if gp != nil {
+			setg(gp)
+		}
 		return
 	}
 
@@ -574,11 +585,11 @@
 
 	// sp is not within gsignal stack, g0 stack, or sigaltstack. Bad.
 	setg(nil)
-	needm()
+	needm(true)
 	if st.ss_flags&_SS_DISABLE != 0 {
 		noSignalStack(sig)
 	} else {
-		sigNotOnStack(sig)
+		sigNotOnStack(sig, sp, mp)
 	}
 	dropm()
 	return false
@@ -662,9 +673,13 @@
 	if sig < uint32(len(sigtable)) {
 		flags = sigtable[sig].flags
 	}
-	if !c.sigFromUser() && flags&_SigPanic != 0 && gp.throwsplit {
+	if !c.sigFromUser() && flags&_SigPanic != 0 && (gp.throwsplit || gp != mp.curg) {
 		// We can't safely sigpanic because it may grow the
 		// stack. Abort in the signal handler instead.
+		//
+		// Also don't inject a sigpanic if we are not on a
+		// user G stack. Either we're in the runtime, or we're
+		// running C code. Either way we cannot recover.
 		flags = _SigThrow
 	}
 	if isAbortPC(c.sigpc()) {
@@ -719,12 +734,59 @@
 		startpanic_m()
 	}
 
+	gp = fatalsignal(sig, c, gp, mp)
+
+	level, _, docrash := gotraceback()
+	if level > 0 {
+		goroutineheader(gp)
+		tracebacktrap(c.sigpc(), c.sigsp(), c.siglr(), gp)
+		if crashing > 0 && gp != mp.curg && mp.curg != nil && readgstatus(mp.curg)&^_Gscan == _Grunning {
+			// tracebackothers on original m skipped this one; trace it now.
+			goroutineheader(mp.curg)
+			traceback(^uintptr(0), ^uintptr(0), 0, mp.curg)
+		} else if crashing == 0 {
+			tracebackothers(gp)
+			print("\n")
+		}
+		dumpregs(c)
+	}
+
+	if docrash {
+		crashing++
+		if crashing < mcount()-int32(extraMLength.Load()) {
+			// There are other m's that need to dump their stacks.
+			// Relay SIGQUIT to the next m by sending it to the current process.
+			// All m's that have already received SIGQUIT have signal masks blocking
+			// receipt of any signals, so the SIGQUIT will go to an m that hasn't seen it yet.
+			// When the last m receives the SIGQUIT, it will fall through to the call to
+			// crash below. Just in case the relaying gets botched, each m involved in
+			// the relay sleeps for 5 seconds and then does the crash/exit itself.
+			// In expected operation, the last m has received the SIGQUIT and run
+			// crash/exit and the process is gone, all long before any of the
+			// 5-second sleeps have finished.
+			print("\n-----\n\n")
+			raiseproc(_SIGQUIT)
+			usleep(5 * 1000 * 1000)
+		}
+		crash()
+	}
+
+	printDebugLog()
+
+	exit(2)
+}
+
+func fatalsignal(sig uint32, c *sigctxt, gp *g, mp *m) *g {
 	if sig < uint32(len(sigtable)) {
 		print(sigtable[sig].name, "\n")
 	} else {
 		print("Signal ", sig, "\n")
 	}
 
+	if isSecureMode() {
+		exit(2)
+	}
+
 	print("PC=", hex(c.sigpc()), " m=", mp.id, " sigcode=", c.sigcode(), "\n")
 	if mp.incgo && gp == mp.g0 && mp.curg != nil {
 		print("signal arrived during cgo execution\n")
@@ -757,45 +819,7 @@
 		println()
 	}
 	print("\n")
-
-	level, _, docrash := gotraceback()
-	if level > 0 {
-		goroutineheader(gp)
-		tracebacktrap(c.sigpc(), c.sigsp(), c.siglr(), gp)
-		if crashing > 0 && gp != mp.curg && mp.curg != nil && readgstatus(mp.curg)&^_Gscan == _Grunning {
-			// tracebackothers on original m skipped this one; trace it now.
-			goroutineheader(mp.curg)
-			traceback(^uintptr(0), ^uintptr(0), 0, mp.curg)
-		} else if crashing == 0 {
-			tracebackothers(gp)
-			print("\n")
-		}
-		dumpregs(c)
-	}
-
-	if docrash {
-		crashing++
-		if crashing < mcount()-int32(extraMCount) {
-			// There are other m's that need to dump their stacks.
-			// Relay SIGQUIT to the next m by sending it to the current process.
-			// All m's that have already received SIGQUIT have signal masks blocking
-			// receipt of any signals, so the SIGQUIT will go to an m that hasn't seen it yet.
-			// When the last m receives the SIGQUIT, it will fall through to the call to
-			// crash below. Just in case the relaying gets botched, each m involved in
-			// the relay sleeps for 5 seconds and then does the crash/exit itself.
-			// In expected operation, the last m has received the SIGQUIT and run
-			// crash/exit and the process is gone, all long before any of the
-			// 5-second sleeps have finished.
-			print("\n-----\n\n")
-			raiseproc(_SIGQUIT)
-			usleep(5 * 1000 * 1000)
-		}
-		crash()
-	}
-
-	printDebugLog()
-
-	exit(2)
+	return gp
 }
 
 // sigpanic turns a synchronous signal into a run-time panic.
@@ -958,16 +982,6 @@
 
 //go:nosplit
 func crash() {
-	// 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 GOOS == "darwin" && GOARCH == "amd64" {
-		return
-	}
-
 	dieFromSignal(_SIGABRT)
 }
 
@@ -1024,8 +1038,10 @@
 // This is called if we receive a signal when there is a signal stack
 // but we are not on it. This can only happen if non-Go code called
 // sigaction without setting the SS_ONSTACK flag.
-func sigNotOnStack(sig uint32) {
+func sigNotOnStack(sig uint32, sp uintptr, mp *m) {
 	println("signal", sig, "received but handler not on signal stack")
+	print("mp.gsignal stack [", hex(mp.gsignal.stack.lo), " ", hex(mp.gsignal.stack.hi), "], ")
+	print("mp.g0 stack [", hex(mp.g0.stack.lo), " ", hex(mp.g0.stack.hi), "], sp=", hex(sp), "\n")
 	throw("non-Go code set up signal handler without SA_ONSTACK flag")
 }
 
@@ -1053,7 +1069,7 @@
 		exit(2)
 		*(*uintptr)(unsafe.Pointer(uintptr(123))) = 2
 	}
-	needm()
+	needm(true)
 	if !sigsend(uint32(sig)) {
 		// A foreign thread received the signal sig, and the
 		// Go code does not want to handle it.
@@ -1121,8 +1137,9 @@
 	//   (1) we weren't in VDSO page,
 	//   (2) we were in a goroutine (i.e., m.curg != nil), and
 	//   (3) we weren't in CGO.
+	//   (4) we weren't in dropped extra m.
 	gp := sigFetchG(c)
-	if gp != nil && gp.m != nil && gp.m.curg != nil && !gp.m.incgo {
+	if gp != nil && gp.m != nil && gp.m.curg != nil && !gp.m.isExtraInC && !gp.m.incgo {
 		return false
 	}
 
@@ -1313,8 +1330,8 @@
 	stsp := uintptr(unsafe.Pointer(st.ss_sp))
 	gp.m.gsignal.stack.lo = stsp
 	gp.m.gsignal.stack.hi = stsp + st.ss_size
-	gp.m.gsignal.stackguard0 = stsp + _StackGuard
-	gp.m.gsignal.stackguard1 = stsp + _StackGuard
+	gp.m.gsignal.stackguard0 = stsp + stackGuard
+	gp.m.gsignal.stackguard1 = stsp + stackGuard
 }
 
 // restoreGsignalStack restores the gsignal stack to the value it had
diff --git a/src/runtime/signal_windows.go b/src/runtime/signal_windows.go
index 37986cd..8e0e39c 100644
--- a/src/runtime/signal_windows.go
+++ b/src/runtime/signal_windows.go
@@ -10,22 +10,41 @@
 	"unsafe"
 )
 
-func disableWER() {
-	// do not display Windows Error Reporting dialogue
-	const (
-		SEM_FAILCRITICALERRORS     = 0x0001
-		SEM_NOGPFAULTERRORBOX      = 0x0002
-		SEM_NOALIGNMENTFAULTEXCEPT = 0x0004
-		SEM_NOOPENFILEERRORBOX     = 0x8000
-	)
-	errormode := uint32(stdcall1(_SetErrorMode, SEM_NOGPFAULTERRORBOX))
-	stdcall1(_SetErrorMode, uintptr(errormode)|SEM_FAILCRITICALERRORS|SEM_NOGPFAULTERRORBOX|SEM_NOOPENFILEERRORBOX)
+const (
+	_SEM_FAILCRITICALERRORS = 0x0001
+	_SEM_NOGPFAULTERRORBOX  = 0x0002
+	_SEM_NOOPENFILEERRORBOX = 0x8000
+
+	_WER_FAULT_REPORTING_NO_UI = 0x0020
+)
+
+func preventErrorDialogs() {
+	errormode := stdcall0(_GetErrorMode)
+	stdcall1(_SetErrorMode, errormode|_SEM_FAILCRITICALERRORS|_SEM_NOGPFAULTERRORBOX|_SEM_NOOPENFILEERRORBOX)
+
+	// Disable WER fault reporting UI.
+	// Do this even if WER is disabled as a whole,
+	// as WER might be enabled later with setTraceback("wer")
+	// and we still want the fault reporting UI to be disabled if this happens.
+	var werflags uintptr
+	stdcall2(_WerGetFlags, currentProcess, uintptr(unsafe.Pointer(&werflags)))
+	stdcall1(_WerSetFlags, werflags|_WER_FAULT_REPORTING_NO_UI)
 }
 
-// in sys_windows_386.s and sys_windows_amd64.s
+// enableWER re-enables Windows error reporting without fault reporting UI.
+func enableWER() {
+	// re-enable Windows Error Reporting
+	errormode := stdcall0(_GetErrorMode)
+	if errormode&_SEM_NOGPFAULTERRORBOX != 0 {
+		stdcall1(_SetErrorMode, errormode^_SEM_NOGPFAULTERRORBOX)
+	}
+}
+
+// in sys_windows_386.s, sys_windows_amd64.s, sys_windows_arm.s, and sys_windows_arm64.s
 func exceptiontramp()
 func firstcontinuetramp()
 func lastcontinuetramp()
+func sigresume()
 
 func initExceptionHandler() {
 	stdcall2(_AddVectoredExceptionHandler, 1, abi.FuncPCABI0(exceptiontramp))
@@ -75,6 +94,7 @@
 	default:
 		return false
 	case _EXCEPTION_ACCESS_VIOLATION:
+	case _EXCEPTION_IN_PAGE_ERROR:
 	case _EXCEPTION_INT_DIVIDE_BY_ZERO:
 	case _EXCEPTION_INT_OVERFLOW:
 	case _EXCEPTION_FLT_DENORMAL_OPERAND:
@@ -88,13 +108,105 @@
 	return true
 }
 
+const (
+	callbackVEH = iota
+	callbackFirstVCH
+	callbackLastVCH
+)
+
+// sigFetchGSafe is like getg() but without panicking
+// when TLS is not set.
+// Only implemented on windows/386, which is the only
+// arch that loads TLS when calling getg(). Others
+// use a dedicated register.
+func sigFetchGSafe() *g
+
+func sigFetchG() *g {
+	if GOARCH == "386" {
+		return sigFetchGSafe()
+	}
+	return getg()
+}
+
+// sigtrampgo is called from the exception handler function, sigtramp,
+// written in assembly code.
+// Return EXCEPTION_CONTINUE_EXECUTION if the exception is handled,
+// else return EXCEPTION_CONTINUE_SEARCH.
+//
+// It is nosplit for the same reason as exceptionhandler.
+//
+//go:nosplit
+func sigtrampgo(ep *exceptionpointers, kind int) int32 {
+	gp := sigFetchG()
+	if gp == nil {
+		return _EXCEPTION_CONTINUE_SEARCH
+	}
+
+	var fn func(info *exceptionrecord, r *context, gp *g) int32
+	switch kind {
+	case callbackVEH:
+		fn = exceptionhandler
+	case callbackFirstVCH:
+		fn = firstcontinuehandler
+	case callbackLastVCH:
+		fn = lastcontinuehandler
+	default:
+		throw("unknown sigtramp callback")
+	}
+
+	// Check if we are running on g0 stack, and if we are,
+	// call fn directly instead of creating the closure.
+	// for the systemstack argument.
+	//
+	// A closure can't be marked as nosplit, so it might
+	// call morestack if we are at the g0 stack limit.
+	// If that happens, the runtime will call abort
+	// and end up in sigtrampgo again.
+	// TODO: revisit this workaround if/when closures
+	// can be compiled as nosplit.
+	//
+	// Note that this scenario should only occur on
+	// TestG0StackOverflow. Any other occurrence should
+	// be treated as a bug.
+	var ret int32
+	if gp != gp.m.g0 {
+		systemstack(func() {
+			ret = fn(ep.record, ep.context, gp)
+		})
+	} else {
+		ret = fn(ep.record, ep.context, gp)
+	}
+	if ret == _EXCEPTION_CONTINUE_SEARCH {
+		return ret
+	}
+
+	// Check if we need to set up the control flow guard workaround.
+	// On Windows, the stack pointer in the context must lie within
+	// system stack limits when we resume from exception.
+	// Store the resume SP and PC in alternate registers
+	// and return to sigresume on the g0 stack.
+	// sigresume makes no use of the stack at all,
+	// loading SP from RX and jumping to RY, being RX and RY two scratch registers.
+	// Note that blindly smashing RX and RY is only safe because we know sigpanic
+	// will not actually return to the original frame, so the registers
+	// are effectively dead. But this does mean we can't use the
+	// same mechanism for async preemption.
+	if ep.context.ip() == abi.FuncPCABI0(sigresume) {
+		// sigresume has already been set up by a previous exception.
+		return ret
+	}
+	prepareContextForSigResume(ep.context)
+	ep.context.set_sp(gp.m.g0.sched.sp)
+	ep.context.set_ip(abi.FuncPCABI0(sigresume))
+	return ret
+}
+
 // Called by sigtramp from Windows VEH handler.
 // Return value signals whether the exception has been handled (EXCEPTION_CONTINUE_EXECUTION)
 // or should be made available to other handlers in the chain (EXCEPTION_CONTINUE_SEARCH).
 //
-// This is the first entry into Go code for exception handling. This
-// is nosplit to avoid growing the stack until we've checked for
-// _EXCEPTION_BREAKPOINT, which is raised if we overflow the g0 stack,
+// This is nosplit to avoid growing the stack until we've checked for
+// _EXCEPTION_BREAKPOINT, which is raised by abort() if we overflow the g0 stack.
 //
 //go:nosplit
 func exceptionhandler(info *exceptionrecord, r *context, gp *g) int32 {
@@ -165,8 +277,6 @@
 	return _EXCEPTION_CONTINUE_EXECUTION
 }
 
-var testingWER bool
-
 // lastcontinuehandler is reached, because runtime cannot handle
 // current exception. lastcontinuehandler will print crash info and exit.
 //
@@ -180,9 +290,6 @@
 		// should not take responsibility of crashing the process.
 		return _EXCEPTION_CONTINUE_SEARCH
 	}
-	if testingWER {
-		return _EXCEPTION_CONTINUE_SEARCH
-	}
 
 	// VEH is called before SEH, but arm64 MSVC DLLs use SEH to trap
 	// illegal instructions during runtime initialization to determine
@@ -214,7 +321,7 @@
 	// g0 stack bounds so we have room to print the traceback. If
 	// this somehow overflows the stack, the OS will trap it.
 	g0.stack.lo = 0
-	g0.stackguard0 = g0.stack.lo + _StackGuard
+	g0.stackguard0 = g0.stack.lo + stackGuard
 	g0.stackguard1 = g0.stackguard0
 
 	print("Exception ", hex(info.exceptioncode), " ", hex(info.exceptioninformation[0]), " ", hex(info.exceptioninformation[1]), " ", hex(r.ip()), "\n")
@@ -239,7 +346,7 @@
 	}
 
 	if docrash {
-		crash()
+		dieFromException(info, r)
 	}
 
 	exit(2)
@@ -252,7 +359,7 @@
 	}
 
 	switch gp.sig {
-	case _EXCEPTION_ACCESS_VIOLATION:
+	case _EXCEPTION_ACCESS_VIOLATION, _EXCEPTION_IN_PAGE_ERROR:
 		if gp.sigcode1 < 0x1000 {
 			panicmem()
 		}
@@ -282,19 +389,6 @@
 	throw("fault")
 }
 
-var (
-	badsignalmsg [100]byte
-	badsignallen int32
-)
-
-func setBadSignalMsg() {
-	const msg = "runtime: signal received on thread not created by Go.\n"
-	for i, c := range msg {
-		badsignalmsg[i] = byte(c)
-		badsignallen++
-	}
-}
-
 // Following are not implemented.
 
 func initsig(preinit bool) {
@@ -309,26 +403,42 @@
 func sigignore(sig uint32) {
 }
 
-func badsignal2()
-
-func raisebadsignal(sig uint32) {
-	badsignal2()
-}
-
 func signame(sig uint32) string {
 	return ""
 }
 
 //go:nosplit
 func crash() {
-	// TODO: This routine should do whatever is needed
-	// to make the Windows program abort/crash as it
-	// would if Go was not intercepting signals.
-	// On Unix the routine would remove the custom signal
-	// handler and then raise a signal (like SIGABRT).
-	// Something like that should happen here.
-	// It's okay to leave this empty for now: if crash returns
-	// the ordinary exit-after-panic happens.
+	dieFromException(nil, nil)
+}
+
+// dieFromException raises an exception that bypasses all exception handlers.
+// This provides the expected exit status for the shell.
+//
+//go:nosplit
+func dieFromException(info *exceptionrecord, r *context) {
+	if info == nil {
+		gp := getg()
+		if gp.sig != 0 {
+			// Try to reconstruct an exception record from
+			// the exception information stored in gp.
+			info = &exceptionrecord{
+				exceptionaddress: gp.sigpc,
+				exceptioncode:    gp.sig,
+				numberparameters: 2,
+			}
+			info.exceptioninformation[0] = gp.sigcode0
+			info.exceptioninformation[1] = gp.sigcode1
+		} else {
+			// By default, a failing Go application exits with exit code 2.
+			// Use this value when gp does not contain exception info.
+			info = &exceptionrecord{
+				exceptioncode: 2,
+			}
+		}
+	}
+	const FAIL_FAST_GENERATE_EXCEPTION_ADDRESS = 0x1
+	stdcall3(_RaiseFailFastException, uintptr(unsafe.Pointer(info)), uintptr(unsafe.Pointer(r)), FAIL_FAST_GENERATE_EXCEPTION_ADDRESS)
 }
 
 // gsignalStack is unused on Windows.
diff --git a/src/runtime/signal_windows_test.go b/src/runtime/signal_windows_test.go
index c9b8e90..431c372 100644
--- a/src/runtime/signal_windows_test.go
+++ b/src/runtime/signal_windows_test.go
@@ -79,8 +79,11 @@
 	if *flagQuick {
 		t.Skip("-quick")
 	}
-	if runtime.GOARCH != "amd64" {
-		t.Skip("this test can only run on windows/amd64")
+	if runtime.GOARCH == "arm" {
+		//TODO: remove this skip and update testwinlib/main.c
+		// once windows/arm supports c-shared buildmode.
+		// See go.dev/issues/43800.
+		t.Skip("this test can't run on windows/arm")
 	}
 	testenv.MustHaveGoBuild(t)
 	testenv.MustHaveCGO(t)
@@ -254,3 +257,59 @@
 		t.Fatalf("Program exited with error: %v\n%s", err, &stderr)
 	}
 }
+
+func TestIssue59213(t *testing.T) {
+	if runtime.GOOS != "windows" {
+		t.Skip("skipping windows only test")
+	}
+	if *flagQuick {
+		t.Skip("-quick")
+	}
+	testenv.MustHaveGoBuild(t)
+	testenv.MustHaveCGO(t)
+
+	goEnv := func(arg string) string {
+		cmd := testenv.Command(t, testenv.GoToolPath(t), "env", arg)
+		cmd.Stderr = new(bytes.Buffer)
+
+		line, err := cmd.Output()
+		if err != nil {
+			t.Fatalf("%v: %v\n%s", cmd, err, cmd.Stderr)
+		}
+		out := string(bytes.TrimSpace(line))
+		t.Logf("%v: %q", cmd, out)
+		return out
+	}
+
+	cc := goEnv("CC")
+	cgoCflags := goEnv("CGO_CFLAGS")
+
+	t.Parallel()
+
+	tmpdir := t.TempDir()
+	dllfile := filepath.Join(tmpdir, "test.dll")
+	exefile := filepath.Join(tmpdir, "gotest.exe")
+
+	// build go dll
+	cmd := testenv.Command(t, testenv.GoToolPath(t), "build", "-o", dllfile, "-buildmode", "c-shared", "testdata/testwintls/main.go")
+	out, err := testenv.CleanCmdEnv(cmd).CombinedOutput()
+	if err != nil {
+		t.Fatalf("failed to build go library: %s\n%s", err, out)
+	}
+
+	// build c program
+	cmd = testenv.Command(t, cc, "-o", exefile, "testdata/testwintls/main.c")
+	testenv.CleanCmdEnv(cmd)
+	cmd.Env = append(cmd.Env, "CGO_CFLAGS="+cgoCflags)
+	out, err = cmd.CombinedOutput()
+	if err != nil {
+		t.Fatalf("failed to build c exe: %s\n%s", err, out)
+	}
+
+	// run test program
+	cmd = testenv.Command(t, exefile, dllfile, "GoFunc")
+	out, err = testenv.CleanCmdEnv(cmd).CombinedOutput()
+	if err != nil {
+		t.Fatalf("failed: %s\n%s", err, out)
+	}
+}
diff --git a/src/runtime/sizeclasses.go b/src/runtime/sizeclasses.go
index 067871e..9314623 100644
--- a/src/runtime/sizeclasses.go
+++ b/src/runtime/sizeclasses.go
@@ -88,6 +88,7 @@
 	largeSizeDiv    = 128
 	_NumSizeClasses = 68
 	_PageShift      = 13
+	maxObjsPerSpan  = 1024
 )
 
 var class_to_size = [_NumSizeClasses]uint16{0, 8, 16, 24, 32, 48, 64, 80, 96, 112, 128, 144, 160, 176, 192, 208, 224, 240, 256, 288, 320, 352, 384, 416, 448, 480, 512, 576, 640, 704, 768, 896, 1024, 1152, 1280, 1408, 1536, 1792, 2048, 2304, 2688, 3072, 3200, 3456, 4096, 4864, 5376, 6144, 6528, 6784, 6912, 8192, 9472, 9728, 10240, 10880, 12288, 13568, 14336, 16384, 18432, 19072, 20480, 21760, 24576, 27264, 28672, 32768}
diff --git a/src/runtime/sizeof_test.go b/src/runtime/sizeof_test.go
index 9ce0a3a..fb91954 100644
--- a/src/runtime/sizeof_test.go
+++ b/src/runtime/sizeof_test.go
@@ -21,7 +21,7 @@
 		_32bit uintptr // size on 32bit platforms
 		_64bit uintptr // size on 64bit platforms
 	}{
-		{runtime.G{}, 240, 392},   // g, but exported for testing
+		{runtime.G{}, 252, 408},   // g, but exported for testing
 		{runtime.Sudog{}, 56, 88}, // sudog, but exported for testing
 	}
 
diff --git a/src/runtime/slice.go b/src/runtime/slice.go
index 459dc88..228697a 100644
--- a/src/runtime/slice.go
+++ b/src/runtime/slice.go
@@ -39,21 +39,21 @@
 	var tomem, copymem uintptr
 	if uintptr(tolen) > uintptr(fromlen) {
 		var overflow bool
-		tomem, overflow = math.MulUintptr(et.size, uintptr(tolen))
+		tomem, overflow = math.MulUintptr(et.Size_, uintptr(tolen))
 		if overflow || tomem > maxAlloc || tolen < 0 {
 			panicmakeslicelen()
 		}
-		copymem = et.size * uintptr(fromlen)
+		copymem = et.Size_ * uintptr(fromlen)
 	} else {
 		// fromlen is a known good length providing and equal or greater than tolen,
 		// thereby making tolen a good slice length too as from and to slices have the
 		// same element width.
-		tomem = et.size * uintptr(tolen)
+		tomem = et.Size_ * uintptr(tolen)
 		copymem = tomem
 	}
 
 	var to unsafe.Pointer
-	if et.ptrdata == 0 {
+	if et.PtrBytes == 0 {
 		to = mallocgc(tomem, nil, false)
 		if copymem < tomem {
 			memclrNoHeapPointers(add(to, copymem), tomem-copymem)
@@ -86,14 +86,14 @@
 }
 
 func makeslice(et *_type, len, cap int) unsafe.Pointer {
-	mem, overflow := math.MulUintptr(et.size, uintptr(cap))
+	mem, overflow := math.MulUintptr(et.Size_, uintptr(cap))
 	if overflow || mem > maxAlloc || len < 0 || len > cap {
 		// NOTE: Produce a 'len out of range' error instead of a
 		// 'cap out of range' error when someone does make([]T, bignumber).
 		// 'cap out of range' is true too, but since the cap is only being
 		// supplied implicitly, saying len is clearer.
 		// See golang.org/issue/4085.
-		mem, overflow := math.MulUintptr(et.size, uintptr(len))
+		mem, overflow := math.MulUintptr(et.Size_, uintptr(len))
 		if overflow || mem > maxAlloc || len < 0 {
 			panicmakeslicelen()
 		}
@@ -158,20 +158,20 @@
 	oldLen := newLen - num
 	if raceenabled {
 		callerpc := getcallerpc()
-		racereadrangepc(oldPtr, uintptr(oldLen*int(et.size)), callerpc, abi.FuncPCABIInternal(growslice))
+		racereadrangepc(oldPtr, uintptr(oldLen*int(et.Size_)), callerpc, abi.FuncPCABIInternal(growslice))
 	}
 	if msanenabled {
-		msanread(oldPtr, uintptr(oldLen*int(et.size)))
+		msanread(oldPtr, uintptr(oldLen*int(et.Size_)))
 	}
 	if asanenabled {
-		asanread(oldPtr, uintptr(oldLen*int(et.size)))
+		asanread(oldPtr, uintptr(oldLen*int(et.Size_)))
 	}
 
 	if newLen < 0 {
 		panic(errorString("growslice: len out of range"))
 	}
 
-	if et.size == 0 {
+	if et.Size_ == 0 {
 		// append should not create a slice with nil pointer but non-zero len.
 		// We assume that append doesn't need to preserve oldPtr in this case.
 		return slice{unsafe.Pointer(&zerobase), newLen, newLen}
@@ -204,30 +204,30 @@
 
 	var overflow bool
 	var lenmem, newlenmem, capmem uintptr
-	// Specialize for common values of et.size.
+	// Specialize for common values of et.Size.
 	// For 1 we don't need any division/multiplication.
 	// For goarch.PtrSize, compiler will optimize division/multiplication into a shift by a constant.
 	// For powers of 2, use a variable shift.
 	switch {
-	case et.size == 1:
+	case et.Size_ == 1:
 		lenmem = uintptr(oldLen)
 		newlenmem = uintptr(newLen)
 		capmem = roundupsize(uintptr(newcap))
 		overflow = uintptr(newcap) > maxAlloc
 		newcap = int(capmem)
-	case et.size == goarch.PtrSize:
+	case et.Size_ == goarch.PtrSize:
 		lenmem = uintptr(oldLen) * goarch.PtrSize
 		newlenmem = uintptr(newLen) * goarch.PtrSize
 		capmem = roundupsize(uintptr(newcap) * goarch.PtrSize)
 		overflow = uintptr(newcap) > maxAlloc/goarch.PtrSize
 		newcap = int(capmem / goarch.PtrSize)
-	case isPowerOfTwo(et.size):
+	case isPowerOfTwo(et.Size_):
 		var shift uintptr
 		if goarch.PtrSize == 8 {
 			// Mask shift for better code generation.
-			shift = uintptr(sys.TrailingZeros64(uint64(et.size))) & 63
+			shift = uintptr(sys.TrailingZeros64(uint64(et.Size_))) & 63
 		} else {
-			shift = uintptr(sys.TrailingZeros32(uint32(et.size))) & 31
+			shift = uintptr(sys.TrailingZeros32(uint32(et.Size_))) & 31
 		}
 		lenmem = uintptr(oldLen) << shift
 		newlenmem = uintptr(newLen) << shift
@@ -236,12 +236,12 @@
 		newcap = int(capmem >> shift)
 		capmem = uintptr(newcap) << shift
 	default:
-		lenmem = uintptr(oldLen) * et.size
-		newlenmem = uintptr(newLen) * et.size
-		capmem, overflow = math.MulUintptr(et.size, uintptr(newcap))
+		lenmem = uintptr(oldLen) * et.Size_
+		newlenmem = uintptr(newLen) * et.Size_
+		capmem, overflow = math.MulUintptr(et.Size_, uintptr(newcap))
 		capmem = roundupsize(capmem)
-		newcap = int(capmem / et.size)
-		capmem = uintptr(newcap) * et.size
+		newcap = int(capmem / et.Size_)
+		capmem = uintptr(newcap) * et.Size_
 	}
 
 	// The check of overflow in addition to capmem > maxAlloc is needed
@@ -262,7 +262,7 @@
 	}
 
 	var p unsafe.Pointer
-	if et.ptrdata == 0 {
+	if et.PtrBytes == 0 {
 		p = mallocgc(capmem, nil, false)
 		// The append() that calls growslice is going to overwrite from oldLen to newLen.
 		// Only clear the part that will not be overwritten.
@@ -275,7 +275,7 @@
 		if lenmem > 0 && writeBarrier.enabled {
 			// Only shade the pointers in oldPtr since we know the destination slice p
 			// only contains nil pointers because it has been cleared during alloc.
-			bulkBarrierPreWriteSrcOnly(uintptr(p), uintptr(oldPtr), lenmem-et.size+et.ptrdata)
+			bulkBarrierPreWriteSrcOnly(uintptr(p), uintptr(oldPtr), lenmem-et.Size_+et.PtrBytes)
 		}
 	}
 	memmove(p, oldPtr, lenmem)
@@ -293,9 +293,9 @@
 	// the memory will be overwritten by an append() that called growslice.
 	// Since the caller of reflect_growslice is not append(),
 	// zero out this region before returning the slice to the reflect package.
-	if et.ptrdata == 0 {
-		oldcapmem := uintptr(old.cap) * et.size
-		newlenmem := uintptr(new.len) * et.size
+	if et.PtrBytes == 0 {
+		oldcapmem := uintptr(old.cap) * et.Size_
+		newlenmem := uintptr(new.len) * et.Size_
 		memclrNoHeapPointers(add(new.array, oldcapmem), newlenmem-oldcapmem)
 	}
 	new.len = old.len // preserve the old length
@@ -345,3 +345,11 @@
 	}
 	return n
 }
+
+//go:linkname bytealg_MakeNoZero internal/bytealg.MakeNoZero
+func bytealg_MakeNoZero(len int) []byte {
+	if uintptr(len) > maxAlloc {
+		panicmakeslicelen()
+	}
+	return unsafe.Slice((*byte)(mallocgc(uintptr(len), nil, false)), len)
+}
diff --git a/src/runtime/stack.go b/src/runtime/stack.go
index d5e587a..45d66da 100644
--- a/src/runtime/stack.go
+++ b/src/runtime/stack.go
@@ -65,51 +65,38 @@
 */
 
 const (
-	// StackSystem is a number of additional bytes to add
+	// stackSystem is a number of additional bytes to add
 	// to each stack below the usual guard area for OS-specific
 	// purposes like signal handling. Used on Windows, Plan 9,
 	// and iOS because they do not use a separate stack.
-	_StackSystem = goos.IsWindows*512*goarch.PtrSize + goos.IsPlan9*512 + goos.IsIos*goarch.IsArm64*1024
+	stackSystem = goos.IsWindows*512*goarch.PtrSize + goos.IsPlan9*512 + goos.IsIos*goarch.IsArm64*1024
 
 	// The minimum size of stack used by Go code
-	_StackMin = 2048
+	stackMin = 2048
 
 	// The minimum stack size to allocate.
-	// The hackery here rounds FixedStack0 up to a power of 2.
-	_FixedStack0 = _StackMin + _StackSystem
-	_FixedStack1 = _FixedStack0 - 1
-	_FixedStack2 = _FixedStack1 | (_FixedStack1 >> 1)
-	_FixedStack3 = _FixedStack2 | (_FixedStack2 >> 2)
-	_FixedStack4 = _FixedStack3 | (_FixedStack3 >> 4)
-	_FixedStack5 = _FixedStack4 | (_FixedStack4 >> 8)
-	_FixedStack6 = _FixedStack5 | (_FixedStack5 >> 16)
-	_FixedStack  = _FixedStack6 + 1
+	// The hackery here rounds fixedStack0 up to a power of 2.
+	fixedStack0 = stackMin + stackSystem
+	fixedStack1 = fixedStack0 - 1
+	fixedStack2 = fixedStack1 | (fixedStack1 >> 1)
+	fixedStack3 = fixedStack2 | (fixedStack2 >> 2)
+	fixedStack4 = fixedStack3 | (fixedStack3 >> 4)
+	fixedStack5 = fixedStack4 | (fixedStack4 >> 8)
+	fixedStack6 = fixedStack5 | (fixedStack5 >> 16)
+	fixedStack  = fixedStack6 + 1
 
-	// Functions that need frames bigger than this use an extra
-	// instruction to do the stack split check, to avoid overflow
-	// in case SP - framesize wraps below zero.
-	// This value can be no bigger than the size of the unmapped
-	// space at zero.
-	_StackBig = 4096
+	// stackNosplit is the maximum number of bytes that a chain of NOSPLIT
+	// functions can use.
+	// This arithmetic must match that in cmd/internal/objabi/stack.go:StackNosplit.
+	stackNosplit = abi.StackNosplitBase * sys.StackGuardMultiplier
 
 	// The stack guard is a pointer this many bytes above the
 	// bottom of the stack.
 	//
-	// The guard leaves enough room for one _StackSmall frame plus
-	// a _StackLimit chain of NOSPLIT calls plus _StackSystem
-	// bytes for the OS.
+	// The guard leaves enough room for a stackNosplit chain of NOSPLIT calls
+	// plus one stackSmall frame plus stackSystem bytes for the OS.
 	// This arithmetic must match that in cmd/internal/objabi/stack.go:StackLimit.
-	_StackGuard = 928*sys.StackGuardMultiplier + _StackSystem
-
-	// After a stack split check the SP is allowed to be this
-	// many bytes below the stack guard. This saves an instruction
-	// in the checking sequence for tiny frames.
-	_StackSmall = 128
-
-	// The maximum number of bytes that a chain of NOSPLIT
-	// functions can use.
-	// This arithmetic must match that in cmd/internal/objabi/stack.go:StackLimit.
-	_StackLimit = _StackGuard - _StackSystem - _StackSmall
+	stackGuard = stackNosplit + stackSystem + abi.StackSmall
 )
 
 const (
@@ -121,13 +108,16 @@
 	stackDebug       = 0
 	stackFromSystem  = 0 // allocate stacks from system memory instead of the heap
 	stackFaultOnFree = 0 // old stacks are mapped noaccess to detect use after free
-	stackPoisonCopy  = 0 // fill stack that should not be accessed with garbage, to detect bad dereferences during copy
 	stackNoCache     = 0 // disable per-P small stack caches
 
 	// check the BP links during traceback.
 	debugCheckBP = false
 )
 
+var (
+	stackPoisonCopy = 0 // fill stack that should not be accessed with garbage, to detect bad dereferences during copy
+)
+
 const (
 	uintptrMask = 1<<(8*goarch.PtrSize) - 1
 
@@ -217,7 +207,7 @@
 			throw("bad manualFreeList")
 		}
 		osStackAlloc(s)
-		s.elemsize = _FixedStack << order
+		s.elemsize = fixedStack << order
 		for i := uintptr(0); i < _StackCacheSize; i += s.elemsize {
 			x := gclinkptr(s.base() + i)
 			x.ptr().next = s.manualFreeList
@@ -292,7 +282,7 @@
 		x := stackpoolalloc(order)
 		x.ptr().next = list
 		list = x
-		size += _FixedStack << order
+		size += fixedStack << order
 	}
 	unlock(&stackpool[order].item.mu)
 	c.stackcache[order].list = list
@@ -311,7 +301,7 @@
 		y := x.ptr().next
 		stackpoolfree(x, order)
 		x = y
-		size -= _FixedStack << order
+		size -= fixedStack << order
 	}
 	unlock(&stackpool[order].item.mu)
 	c.stackcache[order].list = x
@@ -371,10 +361,10 @@
 	// If we need a stack of a bigger size, we fall back on allocating
 	// a dedicated span.
 	var v unsafe.Pointer
-	if n < _FixedStack<<_NumStackOrders && n < _StackCacheSize {
+	if n < fixedStack<<_NumStackOrders && n < _StackCacheSize {
 		order := uint8(0)
 		n2 := n
-		for n2 > _FixedStack {
+		for n2 > fixedStack {
 			order++
 			n2 >>= 1
 		}
@@ -474,10 +464,10 @@
 	if asanenabled {
 		asanpoison(v, n)
 	}
-	if n < _FixedStack<<_NumStackOrders && n < _StackCacheSize {
+	if n < fixedStack<<_NumStackOrders && n < _StackCacheSize {
 		order := uint8(0)
 		n2 := n
-		for n2 > _FixedStack {
+		for n2 > fixedStack {
 			order++
 			n2 >>= 1
 		}
@@ -537,7 +527,7 @@
 // +------------------+ <- frame->argp
 // |  return address  |
 // +------------------+
-// |  caller's BP (*) | (*) if framepointer_enabled && varp < sp
+// |  caller's BP (*) | (*) if framepointer_enabled && varp > sp
 // +------------------+ <- frame->varp
 // |     locals       |
 // +------------------+
@@ -549,6 +539,8 @@
 // | args from caller |
 // +------------------+ <- frame->argp
 // | caller's retaddr |
+// +------------------+
+// |  caller's FP (*) | (*) on ARM64, if framepointer_enabled && varp > sp
 // +------------------+ <- frame->varp
 // |     locals       |
 // +------------------+
@@ -556,6 +548,9 @@
 // +------------------+
 // |  return address  |
 // +------------------+ <- frame->sp
+//
+// varp > sp means that the function has a frame;
+// varp == sp means frameless function.
 
 type adjustinfo struct {
 	old   stack
@@ -649,34 +644,18 @@
 }
 
 // Note: the argument/return area is adjusted by the callee.
-func adjustframe(frame *stkframe, arg unsafe.Pointer) bool {
-	adjinfo := (*adjustinfo)(arg)
+func adjustframe(frame *stkframe, adjinfo *adjustinfo) {
 	if frame.continpc == 0 {
 		// Frame is dead.
-		return true
+		return
 	}
 	f := frame.fn
 	if stackDebug >= 2 {
 		print("    adjusting ", funcname(f), " frame=[", hex(frame.sp), ",", hex(frame.fp), "] pc=", hex(frame.pc), " continpc=", hex(frame.continpc), "\n")
 	}
-	if f.funcID == funcID_systemstack_switch {
-		// A special routine at the bottom of stack of a goroutine that does a systemstack call.
-		// We will allow it to be copied even though we don't
-		// have full GC info for it (because it is written in asm).
-		return true
-	}
 
-	locals, args, objs := frame.getStackMap(&adjinfo.cache, true)
-
-	// Adjust local variables if stack frame has been allocated.
-	if locals.n > 0 {
-		size := uintptr(locals.n) * goarch.PtrSize
-		adjustpointers(unsafe.Pointer(frame.varp-size), &locals, adjinfo, f)
-	}
-
-	// Adjust saved base pointer if there is one.
-	// TODO what about arm64 frame pointer adjustment?
-	if goarch.ArchFamily == goarch.AMD64 && frame.argp-frame.varp == 2*goarch.PtrSize {
+	// Adjust saved frame pointer if there is one.
+	if (goarch.ArchFamily == goarch.AMD64 || goarch.ArchFamily == goarch.ARM64) && frame.argp-frame.varp == 2*goarch.PtrSize {
 		if stackDebug >= 3 {
 			print("      saved bp\n")
 		}
@@ -690,9 +669,21 @@
 				throw("bad frame pointer")
 			}
 		}
+		// On AMD64, this is the caller's frame pointer saved in the current
+		// frame.
+		// On ARM64, this is the frame pointer of the caller's caller saved
+		// by the caller in its frame (one word below its SP).
 		adjustpointer(adjinfo, unsafe.Pointer(frame.varp))
 	}
 
+	locals, args, objs := frame.getStackMap(&adjinfo.cache, true)
+
+	// Adjust local variables if stack frame has been allocated.
+	if locals.n > 0 {
+		size := uintptr(locals.n) * goarch.PtrSize
+		adjustpointers(unsafe.Pointer(frame.varp-size), &locals, adjinfo, f)
+	}
+
 	// Adjust arguments.
 	if args.n > 0 {
 		if stackDebug >= 3 {
@@ -736,8 +727,6 @@
 			}
 		}
 	}
-
-	return true
 }
 
 func adjustctxt(gp *g, adjinfo *adjustinfo) {
@@ -753,7 +742,17 @@
 			throw("bad top frame pointer")
 		}
 	}
+	oldfp := gp.sched.bp
 	adjustpointer(adjinfo, unsafe.Pointer(&gp.sched.bp))
+	if GOARCH == "arm64" {
+		// On ARM64, the frame pointer is saved one word *below* the SP,
+		// which is not copied or adjusted in any frame. Do it explicitly
+		// here.
+		if oldfp == gp.sched.sp-goarch.PtrSize {
+			memmove(unsafe.Pointer(gp.sched.bp), unsafe.Pointer(oldfp), goarch.PtrSize)
+			adjustpointer(adjinfo, unsafe.Pointer(gp.sched.bp))
+		}
+	}
 }
 
 func adjustdefers(gp *g, adjinfo *adjustinfo) {
@@ -926,12 +925,15 @@
 
 	// Swap out old stack for new one
 	gp.stack = new
-	gp.stackguard0 = new.lo + _StackGuard // NOTE: might clobber a preempt request
+	gp.stackguard0 = new.lo + stackGuard // NOTE: might clobber a preempt request
 	gp.sched.sp = new.hi - used
 	gp.stktopsp += adjinfo.delta
 
 	// Adjust pointers in the new stack.
-	gentraceback(^uintptr(0), ^uintptr(0), 0, gp, 0, nil, 0x7fffffff, adjustframe, noescape(unsafe.Pointer(&adjinfo)), 0)
+	var u unwinder
+	for u.init(gp, 0); u.valid(); u.next() {
+		adjustframe(&u.frame, &adjinfo)
+	}
 
 	// free old stack
 	if stackPoisonCopy != 0 {
@@ -1025,7 +1027,7 @@
 		if !canPreemptM(thisg.m) {
 			// Let the goroutine keep running for now.
 			// gp->preempt is set, so it will be preempted next time.
-			gp.stackguard0 = gp.stack.lo + _StackGuard
+			gp.stackguard0 = gp.stack.lo + stackGuard
 			gogo(&gp.sched) // never return
 		}
 	}
@@ -1081,7 +1083,7 @@
 	// recheck the bounds on return.)
 	if f := findfunc(gp.sched.pc); f.valid() {
 		max := uintptr(funcMaxSPDelta(f))
-		needed := max + _StackGuard
+		needed := max + stackGuard
 		used := gp.stack.hi - gp.sched.sp
 		for newsize-used < needed {
 			newsize *= 2
@@ -1186,7 +1188,7 @@
 		return
 	}
 	f := findfunc(gp.startpc)
-	if f.valid() && f.funcID == funcID_gcBgMarkWorker {
+	if f.valid() && f.funcID == abi.FuncID_gcBgMarkWorker {
 		// We're not allowed to shrink the gcBgMarkWorker
 		// stack (see gcBgMarkWorker for explanation).
 		return
@@ -1196,7 +1198,7 @@
 	newsize := oldsize / 2
 	// Don't shrink the allocation below the minimum-sized stack
 	// allocation.
-	if newsize < _FixedStack {
+	if newsize < fixedStack {
 		return
 	}
 	// Compute how much of the stack is currently in use and only
@@ -1205,7 +1207,7 @@
 	// down to the SP plus the stack guard space that ensures
 	// there's room for nosplit functions.
 	avail := gp.stack.hi - gp.stack.lo
-	if used := gp.stack.hi - gp.sched.sp + _StackLimit; used >= avail/4 {
+	if used := gp.stack.hi - gp.sched.sp + stackNosplit; used >= avail/4 {
 		return
 	}
 
@@ -1302,7 +1304,7 @@
 // It is a power of 2, and between _FixedStack and maxstacksize, inclusive.
 // startingStackSize is updated every GC by tracking the average size of
 // stacks scanned during the GC.
-var startingStackSize uint32 = _FixedStack
+var startingStackSize uint32 = fixedStack
 
 func gcComputeStartingStackSize() {
 	if debug.adaptivestackstart == 0 {
@@ -1328,17 +1330,17 @@
 		p.scannedStacks = 0
 	}
 	if scannedStacks == 0 {
-		startingStackSize = _FixedStack
+		startingStackSize = fixedStack
 		return
 	}
-	avg := scannedStackSize/scannedStacks + _StackGuard
-	// Note: we add _StackGuard to ensure that a goroutine that
+	avg := scannedStackSize/scannedStacks + stackGuard
+	// Note: we add stackGuard to ensure that a goroutine that
 	// uses the average space will not trigger a growth.
 	if avg > uint64(maxstacksize) {
 		avg = uint64(maxstacksize)
 	}
-	if avg < _FixedStack {
-		avg = _FixedStack
+	if avg < fixedStack {
+		avg = fixedStack
 	}
 	// Note: maxstacksize fits in 30 bits, so avg also does.
 	startingStackSize = uint32(round2(int32(avg)))
diff --git a/src/runtime/stack_test.go b/src/runtime/stack_test.go
index 92d5880..600e80d 100644
--- a/src/runtime/stack_test.go
+++ b/src/runtime/stack_test.go
@@ -6,6 +6,7 @@
 
 import (
 	"fmt"
+	"internal/testenv"
 	"reflect"
 	"regexp"
 	. "runtime"
@@ -80,8 +81,6 @@
 		t.Skip("-quick")
 	}
 
-	t.Parallel()
-
 	var wg sync.WaitGroup
 
 	// in a normal goroutine
@@ -336,7 +335,7 @@
 	}()
 	// Call a leaf function. We must set up the exact call stack:
 	//
-	//  defering function -> leaf function -> sigpanic
+	//  deferring function -> leaf function -> sigpanic
 	//
 	// On LR machines, the leaf function will have the same SP as
 	// the SP pushed for the defer frame.
@@ -652,6 +651,8 @@
 
 func (s structWithMethod) nop() {}
 
+func (s structWithMethod) inlinablePanic() { panic("panic") }
+
 func TestStackWrapperCaller(t *testing.T) {
 	var d structWithMethod
 	// Force the compiler to construct a wrapper method.
@@ -689,6 +690,33 @@
 	}
 }
 
+func TestStackWrapperStackInlinePanic(t *testing.T) {
+	// Test that inline unwinding correctly tracks the callee by creating a
+	// stack of the form wrapper -> inlined function -> panic. If we mess up
+	// callee tracking, it will look like the wrapper called panic and we'll see
+	// the wrapper in the stack trace.
+	var d structWithMethod
+	wrapper := (*structWithMethod).inlinablePanic
+	defer func() {
+		err := recover()
+		if err == nil {
+			t.Fatalf("expected panic")
+		}
+		buf := make([]byte, 4<<10)
+		stk := string(buf[:Stack(buf, false)])
+		if strings.Contains(stk, "<autogenerated>") {
+			t.Fatalf("<autogenerated> appears in stack trace:\n%s", stk)
+		}
+		// Self-check: make sure inlinablePanic got inlined.
+		if !testenv.OptimizationOff() {
+			if !strings.Contains(stk, "inlinablePanic(...)") {
+				t.Fatalf("inlinablePanic not inlined")
+			}
+		}
+	}()
+	wrapper(&d)
+}
+
 type I interface {
 	M()
 }
@@ -898,42 +926,33 @@
 // Pass a value to escapeMe to force it to escape.
 var escapeMe = func(x any) {}
 
-// Test that when F -> G is inlined and F is excluded from stack
-// traces, G still appears.
-func TestTracebackInlineExcluded(t *testing.T) {
-	defer func() {
-		recover()
-		buf := make([]byte, 4<<10)
-		stk := string(buf[:Stack(buf, false)])
-
-		t.Log(stk)
-
-		if not := "tracebackExcluded"; strings.Contains(stk, not) {
-			t.Errorf("found but did not expect %q", not)
-		}
-		if want := "tracebackNotExcluded"; !strings.Contains(stk, want) {
-			t.Errorf("expected %q in stack", want)
-		}
-	}()
-	tracebackExcluded()
+func TestFramePointerAdjust(t *testing.T) {
+	switch GOARCH {
+	case "amd64", "arm64":
+	default:
+		t.Skipf("frame pointer is not supported on %s", GOARCH)
+	}
+	output := runTestProg(t, "testprog", "FramePointerAdjust")
+	if output != "" {
+		t.Errorf("output:\n%s\n\nwant no output", output)
+	}
 }
 
-// tracebackExcluded should be excluded from tracebacks. There are
-// various ways this could come up. Linking it to a "runtime." name is
-// rather synthetic, but it's easy and reliable. See issue #42754 for
-// one way this happened in real code.
-//
-//go:linkname tracebackExcluded runtime.tracebackExcluded
-//go:noinline
-func tracebackExcluded() {
-	// Call an inlined function that should not itself be excluded
-	// from tracebacks.
-	tracebackNotExcluded()
+// TestSystemstackFramePointerAdjust is a regression test for issue 59692 that
+// ensures that the frame pointer of systemstack is correctly adjusted. See CL
+// 489015 for more details.
+func TestSystemstackFramePointerAdjust(t *testing.T) {
+	growAndShrinkStack(512, [1024]byte{})
 }
 
-// tracebackNotExcluded should be inlined into tracebackExcluded, but
-// should not itself be excluded from the traceback.
-func tracebackNotExcluded() {
-	var x *int
-	*x = 0
+// growAndShrinkStack grows the stack of the current goroutine in order to
+// shrink it again and verify that all frame pointers on the new stack have
+// been correctly adjusted. stackBallast is used to ensure we're not depending
+// on the current heuristics of stack shrinking too much.
+func growAndShrinkStack(n int, stackBallast [1024]byte) {
+	if n <= 0 {
+		return
+	}
+	growAndShrinkStack(n-1, stackBallast)
+	ShrinkStackAndVerifyFramePointers()
 }
diff --git a/src/runtime/start_line_test.go b/src/runtime/start_line_test.go
index 6c4faa8..0762351 100644
--- a/src/runtime/start_line_test.go
+++ b/src/runtime/start_line_test.go
@@ -71,7 +71,7 @@
 	// optimizations are disabled.
 	testenv.SkipIfOptimizationOff(t)
 
-	testCases := []struct{
+	testCases := []struct {
 		name string
 		fn   func() int
 		want int
diff --git a/src/runtime/stkframe.go b/src/runtime/stkframe.go
index 3ecf3a8..5caacba 100644
--- a/src/runtime/stkframe.go
+++ b/src/runtime/stkframe.go
@@ -70,7 +70,7 @@
 
 // argBytes returns the argument frame size for a call to frame.fn.
 func (frame *stkframe) argBytes() uintptr {
-	if frame.fn.args != _ArgsSizeUnknown {
+	if frame.fn.args != abi.ArgsSizeUnknown {
 		return uintptr(frame.fn.args)
 	}
 	// This is an uncommon and complicated case. Fall back to fully
@@ -93,7 +93,7 @@
 // function stack object, which the caller must synthesize.
 func (frame *stkframe) argMapInternal() (argMap bitvector, hasReflectStackObj bool) {
 	f := frame.fn
-	if f.args != _ArgsSizeUnknown {
+	if f.args != abi.ArgsSizeUnknown {
 		argMap.n = f.args / goarch.PtrSize
 		return
 	}
@@ -169,7 +169,7 @@
 		// the first instruction of the function changes the
 		// stack map.
 		targetpc--
-		pcdata = pcdatavalue(f, _PCDATA_StackMapIndex, targetpc, cache)
+		pcdata = pcdatavalue(f, abi.PCDATA_StackMapIndex, targetpc, cache)
 	}
 	if pcdata == -1 {
 		// We do not have a valid pcdata value but there might be a
@@ -189,7 +189,7 @@
 	}
 	if size > minsize {
 		stackid := pcdata
-		stkmap := (*stackmap)(funcdata(f, _FUNCDATA_LocalsPointerMaps))
+		stkmap := (*stackmap)(funcdata(f, abi.FUNCDATA_LocalsPointerMaps))
 		if stkmap == nil || stkmap.n <= 0 {
 			print("runtime: frame ", funcname(f), " untyped locals ", hex(frame.varp-size), "+", hex(size), "\n")
 			throw("missing stackmap")
@@ -216,7 +216,7 @@
 	if args.n > 0 && args.bytedata == nil {
 		// Non-empty argument frame, but not a special map.
 		// Fetch the argument map at pcdata.
-		stackmap := (*stackmap)(funcdata(f, _FUNCDATA_ArgsPointerMaps))
+		stackmap := (*stackmap)(funcdata(f, abi.FUNCDATA_ArgsPointerMaps))
 		if stackmap == nil || stackmap.n <= 0 {
 			print("runtime: frame ", funcname(f), " untyped args ", hex(frame.argp), "+", hex(args.n*goarch.PtrSize), "\n")
 			throw("missing stackmap")
@@ -242,7 +242,7 @@
 		// This offset matches the assembly code on amd64 and arm64.
 		objs = methodValueCallFrameObjs[:]
 	} else {
-		p := funcdata(f, _FUNCDATA_StackObjects)
+		p := funcdata(f, abi.FUNCDATA_StackObjects)
 		if p != nil {
 			n := *(*uintptr)(p)
 			p = add(p, goarch.PtrSize)
@@ -264,7 +264,7 @@
 func stkobjinit() {
 	var abiRegArgsEface any = abi.RegArgs{}
 	abiRegArgsType := efaceOf(&abiRegArgsEface)._type
-	if abiRegArgsType.kind&kindGCProg != 0 {
+	if abiRegArgsType.Kind_&kindGCProg != 0 {
 		throw("abiRegArgsType needs GC Prog, update methodValueCallFrameObjs")
 	}
 	// Set methodValueCallFrameObjs[0].gcdataoff so that
@@ -281,9 +281,9 @@
 		throw("methodValueCallFrameObjs is not in a module")
 	}
 	methodValueCallFrameObjs[0] = stackObjectRecord{
-		off:       -int32(alignUp(abiRegArgsType.size, 8)), // It's always the highest address local.
-		size:      int32(abiRegArgsType.size),
-		_ptrdata:  int32(abiRegArgsType.ptrdata),
-		gcdataoff: uint32(uintptr(unsafe.Pointer(abiRegArgsType.gcdata)) - mod.rodata),
+		off:       -int32(alignUp(abiRegArgsType.Size_, 8)), // It's always the highest address local.
+		size:      int32(abiRegArgsType.Size_),
+		_ptrdata:  int32(abiRegArgsType.PtrBytes),
+		gcdataoff: uint32(uintptr(unsafe.Pointer(abiRegArgsType.GCData)) - mod.rodata),
 	}
 }
diff --git a/src/runtime/string.go b/src/runtime/string.go
index a00976b..7ac3e66 100644
--- a/src/runtime/string.go
+++ b/src/runtime/string.go
@@ -345,6 +345,10 @@
 	return len(s) >= len(prefix) && s[:len(prefix)] == prefix
 }
 
+func hasSuffix(s, suffix string) bool {
+	return len(s) >= len(suffix) && s[len(s)-len(suffix):] == suffix
+}
+
 const (
 	maxUint64 = ^uint64(0)
 	maxInt64  = int64(maxUint64 >> 1)
diff --git a/src/runtime/stubs.go b/src/runtime/stubs.go
index 42c2612..65b7299 100644
--- a/src/runtime/stubs.go
+++ b/src/runtime/stubs.go
@@ -222,12 +222,24 @@
 	return unsafe.Pointer(x ^ 0)
 }
 
+// noEscapePtr hides a pointer from escape analysis. See noescape.
+// USE CAREFULLY!
+//
+//go:nosplit
+func noEscapePtr[T any](p *T) *T {
+	x := uintptr(unsafe.Pointer(p))
+	return (*T)(unsafe.Pointer(x ^ 0))
+}
+
 // Not all cgocallback frames are actually cgocallback,
 // so not all have these arguments. Mark them uintptr so that the GC
 // does not misinterpret memory when the arguments are not present.
 // cgocallback is not called from Go, only from crosscall2.
 // This in turn calls cgocallbackg, which is where we'll find
 // pointer-declared arguments.
+//
+// When fn is nil (frame is saved g), call dropm instead,
+// this is used when the C thread is exiting.
 func cgocallback(fn, frame, ctxt uintptr)
 
 func gogo(buf *gobuf)
@@ -445,7 +457,14 @@
 func abort()
 
 // Called from compiled code; declared for vet; do NOT call from Go.
-func gcWriteBarrier()
+func gcWriteBarrier1()
+func gcWriteBarrier2()
+func gcWriteBarrier3()
+func gcWriteBarrier4()
+func gcWriteBarrier5()
+func gcWriteBarrier6()
+func gcWriteBarrier7()
+func gcWriteBarrier8()
 func duffzero()
 func duffcopy()
 
diff --git a/src/runtime/stubs2.go b/src/runtime/stubs2.go
index 0d83deb..9637347 100644
--- a/src/runtime/stubs2.go
+++ b/src/runtime/stubs2.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build !aix && !darwin && !js && !openbsd && !plan9 && !solaris && !windows
+//go:build !aix && !darwin && !js && !openbsd && !plan9 && !solaris && !wasip1 && !windows
 
 package runtime
 
diff --git a/src/runtime/stubs3.go b/src/runtime/stubs3.go
index 891663b..c3749f3 100644
--- a/src/runtime/stubs3.go
+++ b/src/runtime/stubs3.go
@@ -2,8 +2,9 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build !aix && !darwin && !freebsd && !openbsd && !plan9 && !solaris
+//go:build !aix && !darwin && !freebsd && !openbsd && !plan9 && !solaris && !wasip1
 
 package runtime
 
+//go:wasmimport gojs runtime.nanotime1
 func nanotime1() int64
diff --git a/src/runtime/stubs_386.go b/src/runtime/stubs_386.go
index 300f167..a1dd023 100644
--- a/src/runtime/stubs_386.go
+++ b/src/runtime/stubs_386.go
@@ -18,3 +18,7 @@
 
 //go:noescape
 func asmcgocall_no_g(fn, arg unsafe.Pointer)
+
+// getfp returns the frame pointer register of its caller or 0 if not implemented.
+// TODO: Make this a compiler intrinsic
+func getfp() uintptr { return 0 }
diff --git a/src/runtime/stubs_amd64.go b/src/runtime/stubs_amd64.go
index 687a506..a86a496 100644
--- a/src/runtime/stubs_amd64.go
+++ b/src/runtime/stubs_amd64.go
@@ -47,3 +47,7 @@
 // respectively. Does not follow the Go ABI.
 func spillArgs()
 func unspillArgs()
+
+// getfp returns the frame pointer register of its caller or 0 if not implemented.
+// TODO: Make this a compiler intrinsic
+func getfp() uintptr
diff --git a/src/runtime/stubs_arm.go b/src/runtime/stubs_arm.go
index 52c3293..e19f1a8 100644
--- a/src/runtime/stubs_arm.go
+++ b/src/runtime/stubs_arm.go
@@ -23,3 +23,7 @@
 
 //go:noescape
 func asmcgocall_no_g(fn, arg unsafe.Pointer)
+
+// getfp returns the frame pointer register of its caller or 0 if not implemented.
+// TODO: Make this a compiler intrinsic
+func getfp() uintptr { return 0 }
diff --git a/src/runtime/stubs_arm64.go b/src/runtime/stubs_arm64.go
index bd0533d..df04e64 100644
--- a/src/runtime/stubs_arm64.go
+++ b/src/runtime/stubs_arm64.go
@@ -21,3 +21,7 @@
 // respectively. Does not follow the Go ABI.
 func spillArgs()
 func unspillArgs()
+
+// getfp returns the frame pointer register of its caller or 0 if not implemented.
+// TODO: Make this a compiler intrinsic
+func getfp() uintptr
diff --git a/src/runtime/stubs_loong64.go b/src/runtime/stubs_loong64.go
index 22366f5..556983c 100644
--- a/src/runtime/stubs_loong64.go
+++ b/src/runtime/stubs_loong64.go
@@ -9,3 +9,7 @@
 // Called from assembly only; declared for go vet.
 func load_g()
 func save_g()
+
+// getfp returns the frame pointer register of its caller or 0 if not implemented.
+// TODO: Make this a compiler intrinsic
+func getfp() uintptr { return 0 }
diff --git a/src/runtime/stubs_mips64x.go b/src/runtime/stubs_mips64x.go
index a9ddfc0..f0cf088 100644
--- a/src/runtime/stubs_mips64x.go
+++ b/src/runtime/stubs_mips64x.go
@@ -14,3 +14,7 @@
 
 //go:noescape
 func asmcgocall_no_g(fn, arg unsafe.Pointer)
+
+// getfp returns the frame pointer register of its caller or 0 if not implemented.
+// TODO: Make this a compiler intrinsic
+func getfp() uintptr { return 0 }
diff --git a/src/runtime/stubs_mipsx.go b/src/runtime/stubs_mipsx.go
index d48f9b8..84ba147 100644
--- a/src/runtime/stubs_mipsx.go
+++ b/src/runtime/stubs_mipsx.go
@@ -9,3 +9,7 @@
 // Called from assembly only; declared for go vet.
 func load_g()
 func save_g()
+
+// getfp returns the frame pointer register of its caller or 0 if not implemented.
+// TODO: Make this a compiler intrinsic
+func getfp() uintptr { return 0 }
diff --git a/src/runtime/stubs_ppc64x.go b/src/runtime/stubs_ppc64x.go
index 95e43a5..0b7771e 100644
--- a/src/runtime/stubs_ppc64x.go
+++ b/src/runtime/stubs_ppc64x.go
@@ -15,3 +15,7 @@
 // respectively. Does not follow the Go ABI.
 func spillArgs()
 func unspillArgs()
+
+// getfp returns the frame pointer register of its caller or 0 if not implemented.
+// TODO: Make this a compiler intrinsic
+func getfp() uintptr { return 0 }
diff --git a/src/runtime/stubs_riscv64.go b/src/runtime/stubs_riscv64.go
index f677117..b07d7f8 100644
--- a/src/runtime/stubs_riscv64.go
+++ b/src/runtime/stubs_riscv64.go
@@ -14,3 +14,7 @@
 // respectively. Does not follow the Go ABI.
 func spillArgs()
 func unspillArgs()
+
+// getfp returns the frame pointer register of its caller or 0 if not implemented.
+// TODO: Make this a compiler intrinsic
+func getfp() uintptr { return 0 }
diff --git a/src/runtime/stubs_s390x.go b/src/runtime/stubs_s390x.go
index 44c566e..a2b07ff 100644
--- a/src/runtime/stubs_s390x.go
+++ b/src/runtime/stubs_s390x.go
@@ -7,3 +7,7 @@
 // Called from assembly only; declared for go vet.
 func load_g()
 func save_g()
+
+// getfp returns the frame pointer register of its caller or 0 if not implemented.
+// TODO: Make this a compiler intrinsic
+func getfp() uintptr { return 0 }
diff --git a/src/runtime/symtab.go b/src/runtime/symtab.go
index dead27e..b47f2d8 100644
--- a/src/runtime/symtab.go
+++ b/src/runtime/symtab.go
@@ -5,6 +5,7 @@
 package runtime
 
 import (
+	"internal/abi"
 	"internal/goarch"
 	"runtime/internal/atomic"
 	"runtime/internal/sys"
@@ -116,28 +117,21 @@
 			// work correctly for entries in the result of runtime.Callers.
 			pc--
 		}
-		name := funcname(funcInfo)
-		startLine := f.startLine()
-		if inldata := funcdata(funcInfo, _FUNCDATA_InlTree); inldata != nil {
-			inltree := (*[1 << 20]inlinedCall)(inldata)
-			// Non-strict as cgoTraceback may have added bogus PCs
-			// with a valid funcInfo but invalid PCDATA.
-			ix := pcdatavalue1(funcInfo, _PCDATA_InlTreeIndex, pc, nil, false)
-			if ix >= 0 {
-				// Note: entry is not modified. It always refers to a real frame, not an inlined one.
-				f = nil
-				ic := inltree[ix]
-				name = funcnameFromNameOff(funcInfo, ic.nameOff)
-				startLine = ic.startLine
-				// File/line from funcline1 below are already correct.
-			}
+		// It's important that interpret pc non-strictly as cgoTraceback may
+		// have added bogus PCs with a valid funcInfo but invalid PCDATA.
+		u, uf := newInlineUnwinder(funcInfo, pc, nil)
+		sf := u.srcFunc(uf)
+		if u.isInlined(uf) {
+			// Note: entry is not modified. It always refers to a real frame, not an inlined one.
+			// File/line from funcline1 below are already correct.
+			f = nil
 		}
 		ci.frames = append(ci.frames, Frame{
 			PC:        pc,
 			Func:      f,
-			Function:  name,
+			Function:  funcNameForPrint(sf.name()),
 			Entry:     entry,
-			startLine: int(startLine),
+			startLine: int(sf.startLine),
 			funcInfo:  funcInfo,
 			// Note: File,Line set below
 		})
@@ -177,11 +171,27 @@
 	return f.startLine
 }
 
+// runtime_FrameSymbolName returns the full symbol name of the function in a Frame.
+// For generic functions this differs from f.Function in that this doesn't replace
+// the shape name to "...".
+//
+//go:linkname runtime_FrameSymbolName runtime/pprof.runtime_FrameSymbolName
+func runtime_FrameSymbolName(f *Frame) string {
+	if !f.funcInfo.valid() {
+		return f.Function
+	}
+	u, uf := newInlineUnwinder(f.funcInfo, f.PC, nil)
+	sf := u.srcFunc(uf)
+	return sf.name()
+}
+
 // runtime_expandFinalInlineFrame expands the final pc in stk to include all
 // "callers" if pc is inline.
 //
 //go:linkname runtime_expandFinalInlineFrame runtime/pprof.runtime_expandFinalInlineFrame
 func runtime_expandFinalInlineFrame(stk []uintptr) []uintptr {
+	// TODO: It would be more efficient to report only physical PCs to pprof and
+	// just expand the whole stack.
 	if len(stk) == 0 {
 		return stk
 	}
@@ -194,44 +204,31 @@
 		return stk
 	}
 
-	inldata := funcdata(f, _FUNCDATA_InlTree)
-	if inldata == nil {
-		// Nothing inline in f.
+	var cache pcvalueCache
+	u, uf := newInlineUnwinder(f, tracepc, &cache)
+	if !u.isInlined(uf) {
+		// Nothing inline at tracepc.
 		return stk
 	}
 
 	// Treat the previous func as normal. We haven't actually checked, but
 	// since this pc was included in the stack, we know it shouldn't be
 	// elided.
-	lastFuncID := funcID_normal
+	calleeID := abi.FuncIDNormal
 
 	// Remove pc from stk; we'll re-add it below.
 	stk = stk[:len(stk)-1]
 
-	// See inline expansion in gentraceback.
-	var cache pcvalueCache
-	inltree := (*[1 << 20]inlinedCall)(inldata)
-	for {
-		// Non-strict as cgoTraceback may have added bogus PCs
-		// with a valid funcInfo but invalid PCDATA.
-		ix := pcdatavalue1(f, _PCDATA_InlTreeIndex, tracepc, &cache, false)
-		if ix < 0 {
-			break
-		}
-		if inltree[ix].funcID == funcID_wrapper && elideWrapperCalling(lastFuncID) {
+	for ; uf.valid(); uf = u.next(uf) {
+		funcID := u.srcFunc(uf).funcID
+		if funcID == abi.FuncIDWrapper && elideWrapperCalling(calleeID) {
 			// ignore wrappers
 		} else {
-			stk = append(stk, pc)
+			stk = append(stk, uf.pc+1)
 		}
-		lastFuncID = inltree[ix].funcID
-		// Back up to an instruction in the "caller".
-		tracepc = f.entry() + uintptr(inltree[ix].parentPc)
-		pc = tracepc + 1
+		calleeID = funcID
 	}
 
-	// N.B. we want to keep the last parentPC which is not inline.
-	stk = append(stk, pc)
-
 	return stk
 }
 
@@ -313,103 +310,6 @@
 	return funcInfo{f, mod}
 }
 
-// PCDATA and FUNCDATA table indexes.
-//
-// See funcdata.h and ../cmd/internal/objabi/funcdata.go.
-const (
-	_PCDATA_UnsafePoint   = 0
-	_PCDATA_StackMapIndex = 1
-	_PCDATA_InlTreeIndex  = 2
-	_PCDATA_ArgLiveIndex  = 3
-
-	_FUNCDATA_ArgsPointerMaps    = 0
-	_FUNCDATA_LocalsPointerMaps  = 1
-	_FUNCDATA_StackObjects       = 2
-	_FUNCDATA_InlTree            = 3
-	_FUNCDATA_OpenCodedDeferInfo = 4
-	_FUNCDATA_ArgInfo            = 5
-	_FUNCDATA_ArgLiveInfo        = 6
-	_FUNCDATA_WrapInfo           = 7
-
-	_ArgsSizeUnknown = -0x80000000
-)
-
-const (
-	// PCDATA_UnsafePoint values.
-	_PCDATA_UnsafePointSafe   = -1 // Safe for async preemption
-	_PCDATA_UnsafePointUnsafe = -2 // Unsafe for async preemption
-
-	// _PCDATA_Restart1(2) apply on a sequence of instructions, within
-	// which if an async preemption happens, we should back off the PC
-	// to the start of the sequence when resume.
-	// We need two so we can distinguish the start/end of the sequence
-	// in case that two sequences are next to each other.
-	_PCDATA_Restart1 = -3
-	_PCDATA_Restart2 = -4
-
-	// Like _PCDATA_RestartAtEntry, but back to function entry if async
-	// preempted.
-	_PCDATA_RestartAtEntry = -5
-)
-
-// A FuncID identifies particular functions that need to be treated
-// specially by the runtime.
-// Note that in some situations involving plugins, there may be multiple
-// copies of a particular special runtime function.
-// Note: this list must match the list in cmd/internal/objabi/funcid.go.
-type funcID uint8
-
-const (
-	funcID_normal funcID = iota // not a special function
-	funcID_abort
-	funcID_asmcgocall
-	funcID_asyncPreempt
-	funcID_cgocallback
-	funcID_debugCallV2
-	funcID_gcBgMarkWorker
-	funcID_goexit
-	funcID_gogo
-	funcID_gopanic
-	funcID_handleAsyncEvent
-	funcID_mcall
-	funcID_morestack
-	funcID_mstart
-	funcID_panicwrap
-	funcID_rt0_go
-	funcID_runfinq
-	funcID_runtime_main
-	funcID_sigpanic
-	funcID_systemstack
-	funcID_systemstack_switch
-	funcID_wrapper // any autogenerated code (hash/eq algorithms, method wrappers, etc.)
-)
-
-// A FuncFlag holds bits about a function.
-// This list must match the list in cmd/internal/objabi/funcid.go.
-type funcFlag uint8
-
-const (
-	// TOPFRAME indicates a function that appears at the top of its stack.
-	// The traceback routine stop at such a function and consider that a
-	// successful, complete traversal of the stack.
-	// Examples of TOPFRAME functions include goexit, which appears
-	// at the top of a user goroutine stack, and mstart, which appears
-	// at the top of a system goroutine stack.
-	funcFlag_TOPFRAME funcFlag = 1 << iota
-
-	// SPWRITE indicates a function that writes an arbitrary value to SP
-	// (any write other than adding or subtracting a constant amount).
-	// The traceback routines cannot encode such changes into the
-	// pcsp tables, so the function traceback cannot safely unwind past
-	// SPWRITE functions. Stopping at an SPWRITE function is considered
-	// to be an incomplete unwinding of the stack. In certain contexts
-	// (in particular garbage collector stack scans) that is a fatal error.
-	funcFlag_SPWRITE
-
-	// ASM indicates that a function was implemented in assembly.
-	funcFlag_ASM
-)
-
 // pcHeader holds data used by the pclntab lookups.
 type pcHeader struct {
 	magic          uint32  // 0xFFFFFFF1
@@ -432,6 +332,8 @@
 // moduledata is stored in statically allocated non-pointer memory;
 // none of the pointers here are visible to the garbage collector.
 type moduledata struct {
+	sys.NotInHeap // Only in static data
+
 	pcHeader     *pcHeader
 	funcnametab  []byte
 	cutab        []uint32
@@ -462,6 +364,10 @@
 	pluginpath string
 	pkghashes  []modulehash
 
+	// This slice records the initializing tasks that need to be
+	// done to start up the program. It is built by the linker.
+	inittasks []*initTask
+
 	modulename   string
 	modulehashes []modulehash
 
@@ -729,6 +635,14 @@
 	return res, true
 }
 
+// funcName returns the string at nameOff in the function name table.
+func (md *moduledata) funcName(nameOff int32) string {
+	if nameOff == 0 {
+		return ""
+	}
+	return gostringnocopy(&md.funcnametab[nameOff])
+}
+
 // FuncForPC returns a *Func describing the function that contains the
 // given program counter address, or else nil.
 //
@@ -740,28 +654,25 @@
 	if !f.valid() {
 		return nil
 	}
-	if inldata := funcdata(f, _FUNCDATA_InlTree); inldata != nil {
-		// Note: strict=false so bad PCs (those between functions) don't crash the runtime.
-		// We just report the preceding function in that situation. See issue 29735.
-		// TODO: Perhaps we should report no function at all in that case.
-		// The runtime currently doesn't have function end info, alas.
-		if ix := pcdatavalue1(f, _PCDATA_InlTreeIndex, pc, nil, false); ix >= 0 {
-			inltree := (*[1 << 20]inlinedCall)(inldata)
-			ic := inltree[ix]
-			name := funcnameFromNameOff(f, ic.nameOff)
-			file, line := funcline(f, pc)
-			fi := &funcinl{
-				ones:      ^uint32(0),
-				entry:     f.entry(), // entry of the real (the outermost) function.
-				name:      name,
-				file:      file,
-				line:      line,
-				startLine: ic.startLine,
-			}
-			return (*Func)(unsafe.Pointer(fi))
-		}
+	// This must interpret PC non-strictly so bad PCs (those between functions) don't crash the runtime.
+	// We just report the preceding function in that situation. See issue 29735.
+	// TODO: Perhaps we should report no function at all in that case.
+	// The runtime currently doesn't have function end info, alas.
+	u, uf := newInlineUnwinder(f, pc, nil)
+	if !u.isInlined(uf) {
+		return f._Func()
 	}
-	return f._Func()
+	sf := u.srcFunc(uf)
+	file, line := u.fileLine(uf)
+	fi := &funcinl{
+		ones:      ^uint32(0),
+		entry:     f.entry(), // entry of the real (the outermost) function.
+		name:      sf.name(),
+		file:      file,
+		line:      int32(line),
+		startLine: sf.startLine,
+	}
+	return (*Func)(unsafe.Pointer(fi))
 }
 
 // Name returns the name of the function.
@@ -772,9 +683,9 @@
 	fn := f.raw()
 	if fn.isInlined() { // inlined version
 		fi := (*funcinl)(unsafe.Pointer(fn))
-		return fi.name
+		return funcNameForPrint(fi.name)
 	}
-	return funcname(f.funcInfo())
+	return funcNameForPrint(funcname(f.funcInfo()))
 }
 
 // Entry returns the entry address of the function.
@@ -886,6 +797,30 @@
 	return funcInfo{(*_func)(unsafe.Pointer(&datap.pclntable[funcoff])), datap}
 }
 
+// A srcFunc represents a logical function in the source code. This may
+// correspond to an actual symbol in the binary text, or it may correspond to a
+// source function that has been inlined.
+type srcFunc struct {
+	datap     *moduledata
+	nameOff   int32
+	startLine int32
+	funcID    abi.FuncID
+}
+
+func (f funcInfo) srcFunc() srcFunc {
+	if !f.valid() {
+		return srcFunc{}
+	}
+	return srcFunc{f.datap, f.nameOff, f.startLine, f.funcID}
+}
+
+func (s srcFunc) name() string {
+	if s.datap == nil {
+		return ""
+	}
+	return s.datap.funcName(s.nameOff)
+}
+
 type pcvalueCache struct {
 	entries [2][8]pcvalueCacheEnt
 }
@@ -1000,19 +935,15 @@
 	return -1, 0
 }
 
-func cfuncname(f funcInfo) *byte {
-	if !f.valid() || f.nameOff == 0 {
-		return nil
-	}
-	return &f.datap.funcnametab[f.nameOff]
-}
-
 func funcname(f funcInfo) string {
-	return gostringnocopy(cfuncname(f))
+	if !f.valid() {
+		return ""
+	}
+	return f.datap.funcName(f.nameOff)
 }
 
 func funcpkgpath(f funcInfo) string {
-	name := funcname(f)
+	name := funcNameForPrint(funcname(f))
 	i := len(name) - 1
 	for ; i > 0; i-- {
 		if name[i] == '/' {
@@ -1027,17 +958,6 @@
 	return name[:i]
 }
 
-func cfuncnameFromNameOff(f funcInfo, nameOff int32) *byte {
-	if !f.valid() {
-		return nil
-	}
-	return &f.datap.funcnametab[nameOff]
-}
-
-func funcnameFromNameOff(f funcInfo, nameOff int32) string {
-	return gostringnocopy(cfuncnameFromNameOff(f, nameOff))
-}
-
 func funcfile(f funcInfo, fileno int32) string {
 	datap := f.datap
 	if !f.valid() {
@@ -1203,12 +1123,3 @@
 	}
 	return bitvector{stkmap.nbit, addb(&stkmap.bytedata[0], uintptr(n*((stkmap.nbit+7)>>3)))}
 }
-
-// inlinedCall is the encoding of entries in the FUNCDATA_InlTree table.
-type inlinedCall struct {
-	funcID    funcID // type of the called function
-	_         [3]byte
-	nameOff   int32 // offset into pclntab for name of called function
-	parentPc  int32 // position of an instruction whose source position is the call site (offset from entry)
-	startLine int32 // line number of start of function (func keyword/TEXT directive)
-}
diff --git a/src/runtime/symtabinl.go b/src/runtime/symtabinl.go
new file mode 100644
index 0000000..2bb1c4b
--- /dev/null
+++ b/src/runtime/symtabinl.go
@@ -0,0 +1,116 @@
+// Copyright 2023 The Go Authors. 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 "internal/abi"
+
+// inlinedCall is the encoding of entries in the FUNCDATA_InlTree table.
+type inlinedCall struct {
+	funcID    abi.FuncID // type of the called function
+	_         [3]byte
+	nameOff   int32 // offset into pclntab for name of called function
+	parentPc  int32 // position of an instruction whose source position is the call site (offset from entry)
+	startLine int32 // line number of start of function (func keyword/TEXT directive)
+}
+
+// An inlineUnwinder iterates over the stack of inlined calls at a PC by
+// decoding the inline table. The last step of iteration is always the frame of
+// the physical function, so there's always at least one frame.
+//
+// This is typically used as:
+//
+//	for u, uf := newInlineUnwinder(...); uf.valid(); uf = u.next(uf) { ... }
+//
+// Implementation note: This is used in contexts that disallow write barriers.
+// Hence, the constructor returns this by value and pointer receiver methods
+// must not mutate pointer fields. Also, we keep the mutable state in a separate
+// struct mostly to keep both structs SSA-able, which generates much better
+// code.
+type inlineUnwinder struct {
+	f       funcInfo
+	cache   *pcvalueCache
+	inlTree *[1 << 20]inlinedCall
+}
+
+// An inlineFrame is a position in an inlineUnwinder.
+type inlineFrame struct {
+	// pc is the PC giving the file/line metadata of the current frame. This is
+	// always a "call PC" (not a "return PC"). This is 0 when the iterator is
+	// exhausted.
+	pc uintptr
+
+	// index is the index of the current record in inlTree, or -1 if we are in
+	// the outermost function.
+	index int32
+}
+
+// newInlineUnwinder creates an inlineUnwinder initially set to the inner-most
+// inlined frame at PC. PC should be a "call PC" (not a "return PC").
+//
+// This unwinder uses non-strict handling of PC because it's assumed this is
+// only ever used for symbolic debugging. If things go really wrong, it'll just
+// fall back to the outermost frame.
+func newInlineUnwinder(f funcInfo, pc uintptr, cache *pcvalueCache) (inlineUnwinder, inlineFrame) {
+	inldata := funcdata(f, abi.FUNCDATA_InlTree)
+	if inldata == nil {
+		return inlineUnwinder{f: f}, inlineFrame{pc: pc, index: -1}
+	}
+	inlTree := (*[1 << 20]inlinedCall)(inldata)
+	u := inlineUnwinder{f: f, cache: cache, inlTree: inlTree}
+	return u, u.resolveInternal(pc)
+}
+
+func (u *inlineUnwinder) resolveInternal(pc uintptr) inlineFrame {
+	return inlineFrame{
+		pc: pc,
+		// Conveniently, this returns -1 if there's an error, which is the same
+		// value we use for the outermost frame.
+		index: pcdatavalue1(u.f, abi.PCDATA_InlTreeIndex, pc, u.cache, false),
+	}
+}
+
+func (uf inlineFrame) valid() bool {
+	return uf.pc != 0
+}
+
+// next returns the frame representing uf's logical caller.
+func (u *inlineUnwinder) next(uf inlineFrame) inlineFrame {
+	if uf.index < 0 {
+		uf.pc = 0
+		return uf
+	}
+	parentPc := u.inlTree[uf.index].parentPc
+	return u.resolveInternal(u.f.entry() + uintptr(parentPc))
+}
+
+// isInlined returns whether uf is an inlined frame.
+func (u *inlineUnwinder) isInlined(uf inlineFrame) bool {
+	return uf.index >= 0
+}
+
+// srcFunc returns the srcFunc representing the given frame.
+func (u *inlineUnwinder) srcFunc(uf inlineFrame) srcFunc {
+	if uf.index < 0 {
+		return u.f.srcFunc()
+	}
+	t := &u.inlTree[uf.index]
+	return srcFunc{
+		u.f.datap,
+		t.nameOff,
+		t.startLine,
+		t.funcID,
+	}
+}
+
+// fileLine returns the file name and line number of the call within the given
+// frame. As a convenience, for the innermost frame, it returns the file and
+// line of the PC this unwinder was started at (often this is a call to another
+// physical function).
+//
+// It returns "?", 0 if something goes wrong.
+func (u *inlineUnwinder) fileLine(uf inlineFrame) (file string, line int) {
+	file, line32 := funcline1(u.f, uf.pc, false)
+	return file, int(line32)
+}
diff --git a/src/runtime/symtabinl_test.go b/src/runtime/symtabinl_test.go
new file mode 100644
index 0000000..9e75f79
--- /dev/null
+++ b/src/runtime/symtabinl_test.go
@@ -0,0 +1,122 @@
+// Copyright 2023 The Go Authors. 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 (
+	"internal/abi"
+	"runtime/internal/sys"
+)
+
+func XTestInlineUnwinder(t TestingT) {
+	if TestenvOptimizationOff() {
+		t.Skip("skipping test with inlining optimizations disabled")
+	}
+
+	pc1 := abi.FuncPCABIInternal(tiuTest)
+	f := findfunc(pc1)
+	if !f.valid() {
+		t.Fatalf("failed to resolve tiuTest at PC %#x", pc1)
+	}
+
+	want := map[string]int{
+		"tiuInlined1:3 tiuTest:10":               0,
+		"tiuInlined1:3 tiuInlined2:6 tiuTest:11": 0,
+		"tiuInlined2:7 tiuTest:11":               0,
+		"tiuTest:12":                             0,
+	}
+	wantStart := map[string]int{
+		"tiuInlined1": 2,
+		"tiuInlined2": 5,
+		"tiuTest":     9,
+	}
+
+	// Iterate over the PCs in tiuTest and walk the inline stack for each.
+	prevStack := "x"
+	var cache pcvalueCache
+	for pc := pc1; pc < pc1+1024 && findfunc(pc) == f; pc += sys.PCQuantum {
+		stack := ""
+		u, uf := newInlineUnwinder(f, pc, &cache)
+		if file, _ := u.fileLine(uf); file == "?" {
+			// We're probably in the trailing function padding, where findfunc
+			// still returns f but there's no symbolic information. Just keep
+			// going until we definitely hit the end. If we see a "?" in the
+			// middle of unwinding, that's a real problem.
+			//
+			// TODO: If we ever have function end information, use that to make
+			// this robust.
+			continue
+		}
+		for ; uf.valid(); uf = u.next(uf) {
+			file, line := u.fileLine(uf)
+			const wantFile = "symtabinl_test.go"
+			if !hasSuffix(file, wantFile) {
+				t.Errorf("tiuTest+%#x: want file ...%s, got %s", pc-pc1, wantFile, file)
+			}
+
+			sf := u.srcFunc(uf)
+
+			name := sf.name()
+			const namePrefix = "runtime."
+			if hasPrefix(name, namePrefix) {
+				name = name[len(namePrefix):]
+			}
+			if !hasPrefix(name, "tiu") {
+				t.Errorf("tiuTest+%#x: unexpected function %s", pc-pc1, name)
+			}
+
+			start := int(sf.startLine) - tiuStart
+			if start != wantStart[name] {
+				t.Errorf("tiuTest+%#x: want startLine %d, got %d", pc-pc1, wantStart[name], start)
+			}
+			if sf.funcID != abi.FuncIDNormal {
+				t.Errorf("tiuTest+%#x: bad funcID %v", pc-pc1, sf.funcID)
+			}
+
+			if len(stack) > 0 {
+				stack += " "
+			}
+			stack += FmtSprintf("%s:%d", name, line-tiuStart)
+		}
+
+		if stack != prevStack {
+			prevStack = stack
+
+			t.Logf("tiuTest+%#x: %s", pc-pc1, stack)
+
+			if _, ok := want[stack]; ok {
+				want[stack]++
+			}
+		}
+	}
+
+	// Check that we got all the stacks we wanted.
+	for stack, count := range want {
+		if count == 0 {
+			t.Errorf("missing stack %s", stack)
+		}
+	}
+}
+
+func lineNumber() int {
+	_, _, line, _ := Caller(1)
+	return line // return 0 for error
+}
+
+// Below here is the test data for XTestInlineUnwinder
+
+var tiuStart = lineNumber() // +0
+var tiu1, tiu2, tiu3 int    // +1
+func tiuInlined1() { // +2
+	tiu1++ // +3
+} // +4
+func tiuInlined2() { // +5
+	tiuInlined1() // +6
+	tiu2++        // +7
+} // +8
+func tiuTest() { // +9
+	tiuInlined1() // +10
+	tiuInlined2() // +11
+	tiu3++        // +12
+} // +13
diff --git a/src/runtime/sys_aix_ppc64.s b/src/runtime/sys_aix_ppc64.s
index ab18c5e..6608197 100644
--- a/src/runtime/sys_aix_ppc64.s
+++ b/src/runtime/sys_aix_ppc64.s
@@ -210,7 +210,7 @@
 	MOVD	R3, (g_stack+stack_hi)(g)
 	SUB	$(const_threadStackSize), R3		// stack size
 	MOVD	R3, (g_stack+stack_lo)(g)
-	ADD	$const__StackGuard, R3
+	ADD	$const_stackGuard, R3
 	MOVD	R3, g_stackguard0(g)
 	MOVD	R3, g_stackguard1(g)
 
diff --git a/src/runtime/sys_darwin.go b/src/runtime/sys_darwin.go
index 5ba697e..fa9a2fb 100644
--- a/src/runtime/sys_darwin.go
+++ b/src/runtime/sys_darwin.go
@@ -434,8 +434,13 @@
 
 //go:nosplit
 //go:cgo_unsafe_args
-func fcntl(fd, cmd, arg int32) int32 {
-	return libcCall(unsafe.Pointer(abi.FuncPCABI0(fcntl_trampoline)), unsafe.Pointer(&fd))
+func fcntl(fd, cmd, arg int32) (ret int32, errno int32) {
+	args := struct {
+		fd, cmd, arg int32
+		ret, errno   int32
+	}{fd, cmd, arg, 0, 0}
+	libcCall(unsafe.Pointer(abi.FuncPCABI0(fcntl_trampoline)), unsafe.Pointer(&args))
+	return args.ret, args.errno
 }
 func fcntl_trampoline()
 
@@ -532,15 +537,17 @@
 }
 
 //go:nosplit
-func closeonexec(fd int32) {
-	fcntl(fd, _F_SETFD, _FD_CLOEXEC)
+func setNonblock(fd int32) {
+	flags, _ := fcntl(fd, _F_GETFL, 0)
+	if flags != -1 {
+		fcntl(fd, _F_SETFL, flags|_O_NONBLOCK)
+	}
 }
 
-//go:nosplit
-func setNonblock(fd int32) {
-	flags := fcntl(fd, _F_GETFL, 0)
-	fcntl(fd, _F_SETFL, flags|_O_NONBLOCK)
+func issetugid() int32 {
+	return libcCall(unsafe.Pointer(abi.FuncPCABI0(issetugid_trampoline)), nil)
 }
+func issetugid_trampoline()
 
 // Tell the linker that the libc_* functions are to be found
 // in a system library, with the libc_ prefix missing.
@@ -592,3 +599,5 @@
 
 //go:cgo_import_dynamic libc_notify_is_valid_token notify_is_valid_token "/usr/lib/libSystem.B.dylib"
 //go:cgo_import_dynamic libc_xpc_date_create_from_current xpc_date_create_from_current "/usr/lib/libSystem.B.dylib"
+
+//go:cgo_import_dynamic libc_issetugid issetugid "/usr/lib/libSystem.B.dylib"
diff --git a/src/runtime/sys_darwin_amd64.s b/src/runtime/sys_darwin_amd64.s
index 6eaeeb9..8e8ad9c 100644
--- a/src/runtime/sys_darwin_amd64.s
+++ b/src/runtime/sys_darwin_amd64.s
@@ -15,36 +15,25 @@
 
 // Exit the entire program (like C exit)
 TEXT runtime·exit_trampoline(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
 	MOVL	0(DI), DI		// arg 1 exit status
 	CALL	libc_exit(SB)
 	MOVL	$0xf1, 0xf1  // crash
-	POPQ	BP
 	RET
 
 TEXT runtime·open_trampoline(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
 	MOVL	8(DI), SI		// arg 2 flags
 	MOVL	12(DI), DX		// arg 3 mode
 	MOVQ	0(DI), DI		// arg 1 pathname
 	XORL	AX, AX			// vararg: say "no float args"
 	CALL	libc_open(SB)
-	POPQ	BP
 	RET
 
 TEXT runtime·close_trampoline(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
 	MOVL	0(DI), DI		// arg 1 fd
 	CALL	libc_close(SB)
-	POPQ	BP
 	RET
 
 TEXT runtime·read_trampoline(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
 	MOVQ	8(DI), SI		// arg 2 buf
 	MOVL	16(DI), DX		// arg 3 count
 	MOVL	0(DI), DI		// arg 1 fd
@@ -55,12 +44,9 @@
 	MOVL	(AX), AX
 	NEGL	AX			// caller expects negative errno value
 noerr:
-	POPQ	BP
 	RET
 
 TEXT runtime·write_trampoline(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
 	MOVQ	8(DI), SI		// arg 2 buf
 	MOVL	16(DI), DX		// arg 3 count
 	MOVQ	0(DI), DI		// arg 1 fd
@@ -71,39 +57,29 @@
 	MOVL	(AX), AX
 	NEGL	AX			// caller expects negative errno value
 noerr:
-	POPQ	BP
 	RET
 
 TEXT runtime·pipe_trampoline(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
 	CALL	libc_pipe(SB)		// pointer already in DI
 	TESTL	AX, AX
 	JEQ	3(PC)
 	CALL	libc_error(SB)		// return negative errno value
 	NEGL	AX
-	POPQ	BP
 	RET
 
 TEXT runtime·setitimer_trampoline(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
 	MOVQ	8(DI), SI		// arg 2 new
 	MOVQ	16(DI), DX		// arg 3 old
 	MOVL	0(DI), DI		// arg 1 which
 	CALL	libc_setitimer(SB)
-	POPQ	BP
 	RET
 
 TEXT runtime·madvise_trampoline(SB), NOSPLIT, $0
-	PUSHQ	BP
-	MOVQ	SP, BP
 	MOVQ	8(DI), SI	// arg 2 len
 	MOVL	16(DI), DX	// arg 3 advice
 	MOVQ	0(DI), DI	// arg 1 addr
 	CALL	libc_madvise(SB)
 	// ignore failure - maybe pages are locked
-	POPQ	BP
 	RET
 
 TEXT runtime·mlock_trampoline(SB), NOSPLIT, $0
@@ -112,8 +88,6 @@
 GLOBL timebase<>(SB),NOPTR,$(machTimebaseInfo__size)
 
 TEXT runtime·nanotime_trampoline(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
 	MOVQ	DI, BX
 	CALL	libc_mach_absolute_time(SB)
 	MOVQ	AX, 0(BX)
@@ -136,22 +110,15 @@
 initialized:
 	MOVL	SI, 8(BX)
 	MOVL	DI, 12(BX)
-	MOVQ	BP, SP
-	POPQ	BP
 	RET
 
 TEXT runtime·walltime_trampoline(SB),NOSPLIT,$0
-	PUSHQ	BP			// make a frame; keep stack aligned
-	MOVQ	SP, BP
 	MOVQ	DI, SI			// arg 2 timespec
 	MOVL	$CLOCK_REALTIME, DI	// arg 1 clock_id
 	CALL	libc_clock_gettime(SB)
-	POPQ	BP
 	RET
 
 TEXT runtime·sigaction_trampoline(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
 	MOVQ	8(DI), SI		// arg 2 new
 	MOVQ	16(DI), DX		// arg 3 old
 	MOVL	0(DI), DI		// arg 1 sig
@@ -159,12 +126,9 @@
 	TESTL	AX, AX
 	JEQ	2(PC)
 	MOVL	$0xf1, 0xf1  // crash
-	POPQ	BP
 	RET
 
 TEXT runtime·sigprocmask_trampoline(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
 	MOVQ	8(DI), SI	// arg 2 new
 	MOVQ	16(DI), DX	// arg 3 old
 	MOVL	0(DI), DI	// arg 1 how
@@ -172,30 +136,23 @@
 	TESTL	AX, AX
 	JEQ	2(PC)
 	MOVL	$0xf1, 0xf1  // crash
-	POPQ	BP
 	RET
 
 TEXT runtime·sigaltstack_trampoline(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
 	MOVQ	8(DI), SI		// arg 2 old
 	MOVQ	0(DI), DI		// arg 1 new
 	CALL	libc_sigaltstack(SB)
 	TESTQ	AX, AX
 	JEQ	2(PC)
 	MOVL	$0xf1, 0xf1  // crash
-	POPQ	BP
 	RET
 
 TEXT runtime·raiseproc_trampoline(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
 	MOVL	0(DI), BX	// signal
 	CALL	libc_getpid(SB)
 	MOVL	AX, DI		// arg 1 pid
 	MOVL	BX, SI		// arg 2 signal
 	CALL	libc_kill(SB)
-	POPQ	BP
 	RET
 
 TEXT runtime·sigfwd(SB),NOSPLIT,$0-32
@@ -203,18 +160,16 @@
 	MOVL	sig+8(FP),   DI
 	MOVQ	info+16(FP), SI
 	MOVQ	ctx+24(FP),  DX
-	PUSHQ	BP
-	MOVQ	SP, BP
-	ANDQ	$~15, SP     // alignment for x86_64 ABI
+	MOVQ	SP, BX		// callee-saved
+	ANDQ	$~15, SP	// alignment for x86_64 ABI
 	CALL	AX
-	MOVQ	BP, SP
-	POPQ	BP
+	MOVQ	BX, SP
 	RET
 
 // This is the function registered during sigaction and is invoked when
 // a signal is received. It just redirects to the Go function sigtrampgo.
 // Called using C ABI.
-TEXT runtime·sigtramp(SB),NOSPLIT|TOPFRAME,$0
+TEXT runtime·sigtramp(SB),NOSPLIT|TOPFRAME|NOFRAME,$0
 	// Transition from C ABI to Go ABI.
 	PUSH_REGS_HOST_TO_ABI0()
 
@@ -239,7 +194,7 @@
 	RET
 
 // Called using C ABI.
-TEXT runtime·sigprofNonGoWrapper<>(SB),NOSPLIT,$0
+TEXT runtime·sigprofNonGoWrapper<>(SB),NOSPLIT|NOFRAME,$0
 	// Transition from C ABI to Go ABI.
 	PUSH_REGS_HOST_TO_ABI0()
 
@@ -332,8 +287,6 @@
 	JMP	AX
 
 TEXT runtime·mmap_trampoline(SB),NOSPLIT,$0
-	PUSHQ	BP			// make a frame; keep stack aligned
-	MOVQ	SP, BP
 	MOVQ	DI, BX
 	MOVQ	0(BX), DI		// arg 1 addr
 	MOVQ	8(BX), SI		// arg 2 len
@@ -351,27 +304,20 @@
 ok:
 	MOVQ	AX, 32(BX)
 	MOVQ	DX, 40(BX)
-	POPQ	BP
 	RET
 
 TEXT runtime·munmap_trampoline(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
 	MOVQ	8(DI), SI		// arg 2 len
 	MOVQ	0(DI), DI		// arg 1 addr
 	CALL	libc_munmap(SB)
 	TESTQ	AX, AX
 	JEQ	2(PC)
 	MOVL	$0xf1, 0xf1  // crash
-	POPQ	BP
 	RET
 
 TEXT runtime·usleep_trampoline(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
 	MOVL	0(DI), DI	// arg 1 usec
 	CALL	libc_usleep(SB)
-	POPQ	BP
 	RET
 
 TEXT runtime·settls(SB),NOSPLIT,$32
@@ -379,8 +325,6 @@
 	RET
 
 TEXT runtime·sysctl_trampoline(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
 	MOVL	8(DI), SI		// arg 2 miblen
 	MOVQ	16(DI), DX		// arg 3 oldp
 	MOVQ	24(DI), CX		// arg 4 oldlenp
@@ -388,31 +332,22 @@
 	MOVQ	40(DI), R9		// arg 6 newlen
 	MOVQ	0(DI), DI		// arg 1 mib
 	CALL	libc_sysctl(SB)
-	POPQ	BP
 	RET
 
 TEXT runtime·sysctlbyname_trampoline(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
 	MOVQ	8(DI), SI		// arg 2 oldp
 	MOVQ	16(DI), DX		// arg 3 oldlenp
 	MOVQ	24(DI), CX		// arg 4 newp
 	MOVQ	32(DI), R8		// arg 5 newlen
 	MOVQ	0(DI), DI		// arg 1 name
 	CALL	libc_sysctlbyname(SB)
-	POPQ	BP
 	RET
 
 TEXT runtime·kqueue_trampoline(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
 	CALL	libc_kqueue(SB)
-	POPQ	BP
 	RET
 
 TEXT runtime·kevent_trampoline(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
 	MOVQ	8(DI), SI		// arg 2 keventt
 	MOVL	16(DI), DX		// arg 3 nch
 	MOVQ	24(DI), CX		// arg 4 ev
@@ -426,24 +361,30 @@
 	MOVLQSX	(AX), AX		// errno
 	NEGQ	AX			// caller wants it as a negative error code
 ok:
-	POPQ	BP
 	RET
 
 TEXT runtime·fcntl_trampoline(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
-	MOVL	4(DI), SI		// arg 2 cmd
-	MOVL	8(DI), DX		// arg 3 arg
-	MOVL	0(DI), DI		// arg 1 fd
+	MOVQ	DI, BX
+	MOVL	0(BX), DI		// arg 1 fd
+	MOVL	4(BX), SI		// arg 2 cmd
+	MOVL	8(BX), DX		// arg 3 arg
 	XORL	AX, AX			// vararg: say "no float args"
 	CALL	libc_fcntl(SB)
-	POPQ	BP
+	XORL	DX, DX
+	CMPQ	AX, $-1
+	JNE	noerr
+	CALL	libc_error(SB)
+	MOVL	(AX), DX
+	MOVL	$-1, AX
+noerr:
+	MOVL	AX, 12(BX)
+	MOVL	DX, 16(BX)
 	RET
 
 // mstart_stub is the first function executed on a new thread started by pthread_create.
 // It just does some low-level setup and then calls mstart.
 // Note: called with the C calling convention.
-TEXT runtime·mstart_stub(SB),NOSPLIT,$0
+TEXT runtime·mstart_stub(SB),NOSPLIT|NOFRAME,$0
 	// DI points to the m.
 	// We are already on m's g0 stack.
 
@@ -472,138 +413,91 @@
 // A single int32 result is returned in AX.
 // (For more results, make an args/results structure.)
 TEXT runtime·pthread_attr_init_trampoline(SB),NOSPLIT,$0
-	PUSHQ	BP	// make frame, keep stack 16-byte aligned.
-	MOVQ	SP, BP
 	MOVQ	0(DI), DI // arg 1 attr
 	CALL	libc_pthread_attr_init(SB)
-	POPQ	BP
 	RET
 
 TEXT runtime·pthread_attr_getstacksize_trampoline(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
 	MOVQ	8(DI), SI	// arg 2 size
 	MOVQ	0(DI), DI	// arg 1 attr
 	CALL	libc_pthread_attr_getstacksize(SB)
-	POPQ	BP
 	RET
 
 TEXT runtime·pthread_attr_setdetachstate_trampoline(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
 	MOVQ	8(DI), SI	// arg 2 state
 	MOVQ	0(DI), DI	// arg 1 attr
 	CALL	libc_pthread_attr_setdetachstate(SB)
-	POPQ	BP
 	RET
 
-TEXT runtime·pthread_create_trampoline(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
-	SUBQ	$16, SP
+TEXT runtime·pthread_create_trampoline(SB),NOSPLIT,$16
 	MOVQ	0(DI), SI	// arg 2 attr
 	MOVQ	8(DI), DX	// arg 3 start
 	MOVQ	16(DI), CX	// arg 4 arg
 	MOVQ	SP, DI		// arg 1 &threadid (which we throw away)
 	CALL	libc_pthread_create(SB)
-	MOVQ	BP, SP
-	POPQ	BP
 	RET
 
 TEXT runtime·raise_trampoline(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
 	MOVL	0(DI), DI	// arg 1 signal
 	CALL	libc_raise(SB)
-	POPQ	BP
 	RET
 
 TEXT runtime·pthread_mutex_init_trampoline(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
 	MOVQ	8(DI), SI	// arg 2 attr
 	MOVQ	0(DI), DI	// arg 1 mutex
 	CALL	libc_pthread_mutex_init(SB)
-	POPQ	BP
 	RET
 
 TEXT runtime·pthread_mutex_lock_trampoline(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
 	MOVQ	0(DI), DI	// arg 1 mutex
 	CALL	libc_pthread_mutex_lock(SB)
-	POPQ	BP
 	RET
 
 TEXT runtime·pthread_mutex_unlock_trampoline(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
 	MOVQ	0(DI), DI	// arg 1 mutex
 	CALL	libc_pthread_mutex_unlock(SB)
-	POPQ	BP
 	RET
 
 TEXT runtime·pthread_cond_init_trampoline(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
 	MOVQ	8(DI), SI	// arg 2 attr
 	MOVQ	0(DI), DI	// arg 1 cond
 	CALL	libc_pthread_cond_init(SB)
-	POPQ	BP
 	RET
 
 TEXT runtime·pthread_cond_wait_trampoline(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
 	MOVQ	8(DI), SI	// arg 2 mutex
 	MOVQ	0(DI), DI	// arg 1 cond
 	CALL	libc_pthread_cond_wait(SB)
-	POPQ	BP
 	RET
 
 TEXT runtime·pthread_cond_timedwait_relative_np_trampoline(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
 	MOVQ	8(DI), SI	// arg 2 mutex
 	MOVQ	16(DI), DX	// arg 3 timeout
 	MOVQ	0(DI), DI	// arg 1 cond
 	CALL	libc_pthread_cond_timedwait_relative_np(SB)
-	POPQ	BP
 	RET
 
 TEXT runtime·pthread_cond_signal_trampoline(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
 	MOVQ	0(DI), DI	// arg 1 cond
 	CALL	libc_pthread_cond_signal(SB)
-	POPQ	BP
 	RET
 
 TEXT runtime·pthread_self_trampoline(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
 	MOVQ	DI, BX		// BX is caller-save
 	CALL	libc_pthread_self(SB)
 	MOVQ	AX, 0(BX)	// return value
-	POPQ	BP
 	RET
 
 TEXT runtime·pthread_kill_trampoline(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
 	MOVQ	8(DI), SI	// arg 2 sig
 	MOVQ	0(DI), DI	// arg 1 thread
 	CALL	libc_pthread_kill(SB)
-	POPQ	BP
 	RET
 
 TEXT runtime·osinit_hack_trampoline(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
 	MOVQ	$0, DI	// arg 1 val
 	CALL	libc_notify_is_valid_token(SB)
 	CALL	libc_xpc_date_create_from_current(SB)
-	POPQ	BP
 	RET
 
 // syscall calls a function in libc on behalf of the syscall package.
@@ -622,10 +516,7 @@
 //
 // syscall expects a 32-bit result and tests for 32-bit -1
 // to decide there was an error.
-TEXT runtime·syscall(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
-	SUBQ	$16, SP
+TEXT runtime·syscall(SB),NOSPLIT,$16
 	MOVQ	(0*8)(DI), CX // fn
 	MOVQ	(2*8)(DI), SI // a2
 	MOVQ	(3*8)(DI), DX // a3
@@ -652,8 +543,6 @@
 
 ok:
 	XORL	AX, AX        // no error (it's ignored anyway)
-	MOVQ	BP, SP
-	POPQ	BP
 	RET
 
 // syscallX calls a function in libc on behalf of the syscall package.
@@ -672,10 +561,7 @@
 //
 // syscallX is like syscall but expects a 64-bit result
 // and tests for 64-bit -1 to decide there was an error.
-TEXT runtime·syscallX(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
-	SUBQ	$16, SP
+TEXT runtime·syscallX(SB),NOSPLIT,$16
 	MOVQ	(0*8)(DI), CX // fn
 	MOVQ	(2*8)(DI), SI // a2
 	MOVQ	(3*8)(DI), DX // a3
@@ -702,16 +588,11 @@
 
 ok:
 	XORL	AX, AX        // no error (it's ignored anyway)
-	MOVQ	BP, SP
-	POPQ	BP
 	RET
 
 // syscallPtr is like syscallX except that the libc function reports an
 // error by returning NULL and setting errno.
-TEXT runtime·syscallPtr(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
-	SUBQ	$16, SP
+TEXT runtime·syscallPtr(SB),NOSPLIT,$16
 	MOVQ	(0*8)(DI), CX // fn
 	MOVQ	(2*8)(DI), SI // a2
 	MOVQ	(3*8)(DI), DX // a3
@@ -738,8 +619,6 @@
 
 ok:
 	XORL	AX, AX        // no error (it's ignored anyway)
-	MOVQ	BP, SP
-	POPQ	BP
 	RET
 
 // syscall6 calls a function in libc on behalf of the syscall package.
@@ -761,10 +640,7 @@
 //
 // syscall6 expects a 32-bit result and tests for 32-bit -1
 // to decide there was an error.
-TEXT runtime·syscall6(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
-	SUBQ	$16, SP
+TEXT runtime·syscall6(SB),NOSPLIT,$16
 	MOVQ	(0*8)(DI), R11// fn
 	MOVQ	(2*8)(DI), SI // a2
 	MOVQ	(3*8)(DI), DX // a3
@@ -791,8 +667,6 @@
 
 ok:
 	XORL	AX, AX        // no error (it's ignored anyway)
-	MOVQ	BP, SP
-	POPQ	BP
 	RET
 
 // syscall6X calls a function in libc on behalf of the syscall package.
@@ -814,10 +688,7 @@
 //
 // syscall6X is like syscall6 but expects a 64-bit result
 // and tests for 64-bit -1 to decide there was an error.
-TEXT runtime·syscall6X(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
-	SUBQ	$16, SP
+TEXT runtime·syscall6X(SB),NOSPLIT,$16
 	MOVQ	(0*8)(DI), R11// fn
 	MOVQ	(2*8)(DI), SI // a2
 	MOVQ	(3*8)(DI), DX // a3
@@ -844,8 +715,6 @@
 
 ok:
 	XORL	AX, AX        // no error (it's ignored anyway)
-	MOVQ	BP, SP
-	POPQ	BP
 	RET
 
 // syscall9 calls a function in libc on behalf of the syscall package.
@@ -870,10 +739,7 @@
 //
 // syscall9 expects a 32-bit result and tests for 32-bit -1
 // to decide there was an error.
-TEXT runtime·syscall9(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
-	SUBQ	$16, SP
+TEXT runtime·syscall9(SB),NOSPLIT,$16
 	MOVQ	(0*8)(DI), R13// fn
 	MOVQ	(2*8)(DI), SI // a2
 	MOVQ	(3*8)(DI), DX // a3
@@ -903,17 +769,12 @@
 
 ok:
 	XORL	AX, AX        // no error (it's ignored anyway)
-	MOVQ	BP, SP
-	POPQ	BP
 	RET
 
 // syscall_x509 is for crypto/x509. It is like syscall6 but does not check for errors,
 // takes 5 uintptrs and 1 float64, and only returns one value,
 // for use with standard C ABI functions.
-TEXT runtime·syscall_x509(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
-	SUBQ	$16, SP
+TEXT runtime·syscall_x509(SB),NOSPLIT,$16
 	MOVQ	(0*8)(DI), R11// fn
 	MOVQ	(2*8)(DI), SI // a2
 	MOVQ	(3*8)(DI), DX // a3
@@ -930,6 +791,8 @@
 	MOVQ	AX, (7*8)(DI) // r1
 
 	XORL	AX, AX        // no error (it's ignored anyway)
-	MOVQ	BP, SP
-	POPQ	BP
+	RET
+
+TEXT runtime·issetugid_trampoline(SB),NOSPLIT,$0
+	CALL	libc_issetugid(SB)
 	RET
diff --git a/src/runtime/sys_darwin_arm64.s b/src/runtime/sys_darwin_arm64.s
index 4a51fb3..dc6caf8 100644
--- a/src/runtime/sys_darwin_arm64.s
+++ b/src/runtime/sys_darwin_arm64.s
@@ -309,11 +309,22 @@
 
 TEXT runtime·fcntl_trampoline(SB),NOSPLIT,$0
 	SUB	$16, RSP
-	MOVW	4(R0), R1	// arg 2 cmd
-	MOVW	8(R0), R2	// arg 3 arg
+	MOVD	R0, R19
+	MOVW	0(R19), R0	// arg 1 fd
+	MOVW	4(R19), R1	// arg 2 cmd
+	MOVW	8(R19), R2	// arg 3 arg
 	MOVW	R2, (RSP)	// arg 3 is variadic, pass on stack
-	MOVW	0(R0), R0	// arg 1 fd
 	BL	libc_fcntl(SB)
+	MOVD	$0, R1
+	MOVD	$-1, R2
+	CMP	R0, R2
+	BNE	noerr
+	BL	libc_error(SB)
+	MOVW	(R0), R1
+	MOVW	$-1, R0
+noerr:
+	MOVW	R0, 12(R19)
+	MOVW	R1, 16(R19)
 	ADD	$16, RSP
 	RET
 
@@ -752,3 +763,7 @@
 	ADD	$16, RSP
 	MOVD	R0, 56(R2)	// save r1
 	RET
+
+TEXT runtime·issetugid_trampoline(SB),NOSPLIT,$0
+	BL	libc_issetugid(SB)
+	RET
diff --git a/src/runtime/sys_dragonfly_amd64.s b/src/runtime/sys_dragonfly_amd64.s
index 0cf9821..a223c2c 100644
--- a/src/runtime/sys_dragonfly_amd64.s
+++ b/src/runtime/sys_dragonfly_amd64.s
@@ -213,16 +213,14 @@
 	MOVL	sig+8(FP),   DI
 	MOVQ	info+16(FP), SI
 	MOVQ	ctx+24(FP),  DX
-	PUSHQ	BP
-	MOVQ	SP, BP
-	ANDQ	$~15, SP     // alignment for x86_64 ABI
+	MOVQ	SP, BX		// callee-saved
+	ANDQ	$~15, SP	// alignment for x86_64 ABI
 	CALL	AX
-	MOVQ	BP, SP
-	POPQ	BP
+	MOVQ	BX, SP
 	RET
 
 // Called using C ABI.
-TEXT runtime·sigtramp(SB),NOSPLIT|TOPFRAME,$0
+TEXT runtime·sigtramp(SB),NOSPLIT|TOPFRAME|NOFRAME,$0
 	// Transition from C ABI to Go ABI.
 	PUSH_REGS_HOST_TO_ABI0()
 
@@ -387,11 +385,28 @@
 	MOVL	AX, ret+48(FP)
 	RET
 
-// void runtime·closeonexec(int32 fd);
-TEXT runtime·closeonexec(SB),NOSPLIT,$0
+// func fcntl(fd, cmd, arg int32) (ret int32, errno int32)
+TEXT runtime·fcntl(SB),NOSPLIT,$0
 	MOVL	fd+0(FP), DI	// fd
-	MOVQ	$2, SI		// F_SETFD
-	MOVQ	$1, DX		// FD_CLOEXEC
+	MOVL	cmd+4(FP), SI	// cmd
+	MOVL	arg+8(FP), DX	// arg
 	MOVL	$92, AX		// fcntl
 	SYSCALL
+	JCC	noerr
+	MOVL	$-1, ret+16(FP)
+	MOVL	AX, errno+20(FP)
+	RET
+noerr:
+	MOVL	AX, ret+16(FP)
+	MOVL	$0, errno+20(FP)
+	RET
+
+// func issetugid() int32
+TEXT runtime·issetugid(SB),NOSPLIT,$0
+	MOVQ	$0, DI
+	MOVQ	$0, SI
+	MOVQ	$0, DX
+	MOVL	$253, AX
+	SYSCALL
+	MOVL	AX, ret+0(FP)
 	RET
diff --git a/src/runtime/sys_freebsd_386.s b/src/runtime/sys_freebsd_386.s
index 4e0bc9b..184cd14 100644
--- a/src/runtime/sys_freebsd_386.s
+++ b/src/runtime/sys_freebsd_386.s
@@ -12,8 +12,6 @@
 
 #define CLOCK_REALTIME		0
 #define CLOCK_MONOTONIC		4
-#define FD_CLOEXEC		1
-#define F_SETFD			2
 
 #define SYS_exit		1
 #define SYS_read		3
@@ -31,6 +29,7 @@
 #define SYS___sysctl		202
 #define SYS_clock_gettime	232
 #define SYS_nanosleep		240
+#define SYS_issetugid		253
 #define SYS_sched_yield		331
 #define SYS_sigprocmask		340
 #define SYS_kqueue		362
@@ -451,17 +450,17 @@
 	MOVL	AX, ret+24(FP)
 	RET
 
-// int32 runtime·closeonexec(int32 fd);
-TEXT runtime·closeonexec(SB),NOSPLIT,$32
+// func fcntl(fd, cmd, arg int32) (int32, int32)
+TEXT runtime·fcntl(SB),NOSPLIT,$-4
 	MOVL	$SYS_fcntl, AX
-	// 0(SP) is where the caller PC would be; kernel skips it
-	MOVL	fd+0(FP), BX
-	MOVL	BX, 4(SP)	// fd
-	MOVL	$F_SETFD, 8(SP)
-	MOVL	$FD_CLOEXEC, 12(SP)
 	INT	$0x80
-	JAE	2(PC)
-	NEGL	AX
+	JAE	noerr
+	MOVL	$-1, ret+12(FP)
+	MOVL	AX, errno+16(FP)
+	RET
+noerr:
+	MOVL	AX, ret+12(FP)
+	MOVL	$0, errno+16(FP)
 	RET
 
 // func cpuset_getaffinity(level int, which int, id int64, size int, mask *byte) int32
@@ -474,3 +473,10 @@
 	RET
 
 GLOBL runtime·tlsoffset(SB),NOPTR,$4
+
+// func issetugid() int32
+TEXT runtime·issetugid(SB),NOSPLIT,$0
+	MOVL	$SYS_issetugid, AX
+	INT	$0x80
+	MOVL	AX, ret+0(FP)
+	RET
diff --git a/src/runtime/sys_freebsd_amd64.s b/src/runtime/sys_freebsd_amd64.s
index 374e0ab..977ea09 100644
--- a/src/runtime/sys_freebsd_amd64.s
+++ b/src/runtime/sys_freebsd_amd64.s
@@ -13,8 +13,6 @@
 
 #define CLOCK_REALTIME		0
 #define CLOCK_MONOTONIC		4
-#define FD_CLOEXEC		1
-#define F_SETFD			2
 #define AMD64_SET_FSBASE	129
 
 #define SYS_exit		1
@@ -33,6 +31,7 @@
 #define SYS___sysctl		202
 #define SYS_clock_gettime	232
 #define SYS_nanosleep		240
+#define SYS_issetugid		253
 #define SYS_sched_yield		331
 #define SYS_sigprocmask		340
 #define SYS_kqueue		362
@@ -251,16 +250,14 @@
 	MOVL	sig+8(FP),   DI
 	MOVQ	info+16(FP), SI
 	MOVQ	ctx+24(FP),  DX
-	PUSHQ	BP
-	MOVQ	SP, BP
-	ANDQ	$~15, SP     // alignment for x86_64 ABI
+	MOVQ	SP, BX		// callee-saved
+	ANDQ	$~15, SP	// alignment for x86_64 ABI
 	CALL	AX
-	MOVQ	BP, SP
-	POPQ	BP
+	MOVQ	BX, SP
 	RET
 
 // Called using C ABI.
-TEXT runtime·sigtramp(SB),NOSPLIT|TOPFRAME,$0
+TEXT runtime·sigtramp(SB),NOSPLIT|TOPFRAME|NOFRAME,$0
 	// Transition from C ABI to Go ABI.
 	PUSH_REGS_HOST_TO_ABI0()
 
@@ -281,11 +278,11 @@
 
 	ADJSP	$-24
 
-        POP_REGS_HOST_TO_ABI0()
+	POP_REGS_HOST_TO_ABI0()
 	RET
 
 // Called using C ABI.
-TEXT runtime·sigprofNonGoWrapper<>(SB),NOSPLIT,$0
+TEXT runtime·sigprofNonGoWrapper<>(SB),NOSPLIT|NOFRAME,$0
 	// Transition from C ABI to Go ABI.
 	PUSH_REGS_HOST_TO_ABI0()
 
@@ -550,13 +547,20 @@
 	MOVL	AX, ret+48(FP)
 	RET
 
-// void runtime·closeonexec(int32 fd);
-TEXT runtime·closeonexec(SB),NOSPLIT,$0
+// func fcntl(fd, cmd, arg int32) (int32, int32)
+TEXT runtime·fcntl(SB),NOSPLIT,$0
 	MOVL	fd+0(FP), DI	// fd
-	MOVQ	$F_SETFD, SI
-	MOVQ	$FD_CLOEXEC, DX
+	MOVL	cmd+4(FP), SI	// cmd
+	MOVL	arg+8(FP), DX	// arg
 	MOVL	$SYS_fcntl, AX
 	SYSCALL
+	JCC	noerr
+	MOVL	$-1, ret+16(FP)
+	MOVL	AX, errno+20(FP)
+	RET
+noerr:
+	MOVL	AX, ret+16(FP)
+	MOVL	$0, errno+20(FP)
 	RET
 
 // func cpuset_getaffinity(level int, which int, id int64, size int, mask *byte) int32
@@ -572,3 +576,13 @@
 	NEGQ	AX
 	MOVL	AX, ret+40(FP)
 	RET
+
+// func issetugid() int32
+TEXT runtime·issetugid(SB),NOSPLIT,$0
+	MOVQ	$0, DI
+	MOVQ	$0, SI
+	MOVQ	$0, DX
+	MOVL	$SYS_issetugid, AX
+	SYSCALL
+	MOVL	AX, ret+0(FP)
+	RET
diff --git a/src/runtime/sys_freebsd_arm.s b/src/runtime/sys_freebsd_arm.s
index a3fee14..44430f5 100644
--- a/src/runtime/sys_freebsd_arm.s
+++ b/src/runtime/sys_freebsd_arm.s
@@ -27,6 +27,7 @@
 #define SYS_fcntl (SYS_BASE + 92)
 #define SYS___sysctl (SYS_BASE + 202)
 #define SYS_nanosleep (SYS_BASE + 240)
+#define SYS_issetugid (SYS_BASE + 253)
 #define SYS_clock_gettime (SYS_BASE + 232)
 #define SYS_sched_yield (SYS_BASE + 331)
 #define SYS_sigprocmask (SYS_BASE + 340)
@@ -387,13 +388,18 @@
 	MOVW	R0, ret+24(FP)
 	RET
 
-// void runtime·closeonexec(int32 fd)
-TEXT runtime·closeonexec(SB),NOSPLIT,$0
+// func fcntl(fd, cmd, arg int32) (int32, int32)
+TEXT runtime·fcntl(SB),NOSPLIT,$0
 	MOVW fd+0(FP), R0	// fd
-	MOVW $2, R1	// F_SETFD
-	MOVW $1, R2	// FD_CLOEXEC
+	MOVW cmd+4(FP), R1	// cmd
+	MOVW arg+8(FP), R2	// arg
 	MOVW $SYS_fcntl, R7
 	SWI $0
+	MOVW $0, R1
+	MOVW.CS R0, R1
+	MOVW.CS $-1, R0
+	MOVW R0, ret+12(FP)
+	MOVW R1, errno+16(FP)
 	RET
 
 // TODO: this is only valid for ARMv7+
@@ -441,3 +447,10 @@
 
 	MOVW	R0, ret+4(FP)
 	RET
+
+// func issetugid() int32
+TEXT runtime·issetugid(SB),NOSPLIT,$0
+	MOVW $SYS_issetugid, R7
+	SWI $0
+	MOVW	R0, ret+0(FP)
+	RET
diff --git a/src/runtime/sys_freebsd_arm64.s b/src/runtime/sys_freebsd_arm64.s
index 29866cb..8fb46f4 100644
--- a/src/runtime/sys_freebsd_arm64.s
+++ b/src/runtime/sys_freebsd_arm64.s
@@ -14,11 +14,6 @@
 
 #define CLOCK_REALTIME		0
 #define CLOCK_MONOTONIC		4
-#define FD_CLOEXEC		1
-#define F_SETFD			2
-#define F_GETFL			3
-#define F_SETFL			4
-#define O_NONBLOCK		4
 
 #define SYS_exit		1
 #define SYS_read		3
@@ -34,6 +29,7 @@
 #define SYS_fcntl		92
 #define SYS___sysctl		202
 #define SYS_nanosleep		240
+#define SYS_issetugid		253
 #define SYS_clock_gettime	232
 #define SYS_sched_yield		331
 #define SYS_sigprocmask		340
@@ -295,14 +291,9 @@
 	BEQ	2(PC)
 	BL	runtime·load_g(SB)
 
-#ifdef GOEXPERIMENT_regabiargs
 	// Restore signum to R0.
 	MOVW	8(RSP), R0
 	// R1 and R2 already contain info and ctx, respectively.
-#else
-	MOVD	R1, 16(RSP)
-	MOVD	R2, 24(RSP)
-#endif
 	MOVD	$runtime·sigtrampgo<ABIInternal>(SB), R3
 	BL	(R3)
 
@@ -444,13 +435,21 @@
 	MOVW	R0, ret+48(FP)
 	RET
 
-// func closeonexec(fd int32)
-TEXT runtime·closeonexec(SB),NOSPLIT|NOFRAME,$0
+// func fcntl(fd, cmd, arg int32) (int32, int32)
+TEXT runtime·fcntl(SB),NOSPLIT,$0
 	MOVW	fd+0(FP), R0
-	MOVD	$F_SETFD, R1
-	MOVD	$FD_CLOEXEC, R2
+	MOVW	cmd+4(FP), R1
+	MOVW	arg+8(FP), R2
 	MOVD	$SYS_fcntl, R8
 	SVC
+	BCC	noerr
+	MOVW	$-1, R1
+	MOVW	R1, ret+16(FP)
+	MOVW	R0, errno+20(FP)
+	RET
+noerr:
+	MOVW	R0, ret+16(FP)
+	MOVW	$0, errno+20(FP)
 	RET
 
 // func getCntxct(physical bool) uint32
@@ -468,3 +467,10 @@
 
 	MOVW	R0, ret+8(FP)
 	RET
+
+// func issetugid() int32
+TEXT runtime·issetugid(SB),NOSPLIT|NOFRAME,$0
+	MOVD $SYS_issetugid, R8
+	SVC
+	MOVW	R0, ret+0(FP)
+	RET
diff --git a/src/runtime/sys_freebsd_riscv64.s b/src/runtime/sys_freebsd_riscv64.s
index 30deed2..cbf920c 100644
--- a/src/runtime/sys_freebsd_riscv64.s
+++ b/src/runtime/sys_freebsd_riscv64.s
@@ -13,11 +13,6 @@
 
 #define CLOCK_REALTIME		0
 #define CLOCK_MONOTONIC		4
-#define FD_CLOEXEC		1
-#define F_SETFD			2
-#define F_GETFL			3
-#define F_SETFL			4
-#define O_NONBLOCK		4
 
 #define SYS_exit		1
 #define SYS_read		3
@@ -33,6 +28,7 @@
 #define SYS_fcntl		92
 #define SYS___sysctl		202
 #define SYS_nanosleep		240
+#define SYS_issetugid		253
 #define SYS_clock_gettime	232
 #define SYS_sched_yield		331
 #define SYS_sigprocmask		340
@@ -420,13 +416,21 @@
 	MOVW	A0, ret+48(FP)
 	RET
 
-// func closeonexec(fd int32)
-TEXT runtime·closeonexec(SB),NOSPLIT|NOFRAME,$0
+// func fcntl(fd, cmd, arg int32) (int32, int32)
+TEXT runtime·fcntl(SB),NOSPLIT,$0
 	MOVW	fd+0(FP), A0
-	MOV	$F_SETFD, A1
-	MOV	$FD_CLOEXEC, A2
+	MOVW	cmd+4(FP), A1
+	MOVW	arg+8(FP), A2
 	MOV	$SYS_fcntl, T0
 	ECALL
+	BEQ	T0, ZERO, noerr
+	MOV	$-1, A1
+	MOVW	A1, ret+16(FP)
+	MOVW	A0, errno+20(FP)
+	RET
+noerr:
+	MOVW	A0, ret+16(FP)
+	MOVW	ZERO, errno+20(FP)
 	RET
 
 // func getCntxct() uint32
@@ -434,3 +438,11 @@
 	RDTIME	A0
 	MOVW	A0, ret+0(FP)
 	RET
+
+// func issetugid() int32
+TEXT runtime·issetugid(SB),NOSPLIT|NOFRAME,$0
+	MOV $SYS_issetugid, T0
+	ECALL
+	MOVW	A0, ret+0(FP)
+	RET
+
diff --git a/src/runtime/sys_linux_386.s b/src/runtime/sys_linux_386.s
index 12a2941..d53be24 100644
--- a/src/runtime/sys_linux_386.s
+++ b/src/runtime/sys_linux_386.s
@@ -454,7 +454,17 @@
 TEXT runtime·cgoSigtramp(SB),NOSPLIT,$0
 	JMP	runtime·sigtramp(SB)
 
-TEXT runtime·sigreturn(SB),NOSPLIT,$0
+// For cgo unwinding to work, this function must look precisely like
+// the one in glibc. The glibc source code is:
+// https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/i386/libc_sigaction.c;h=0665b41bbcd0986f0b33bf19a7ecbcedf9961d0a#l59
+// The code that cares about the precise instructions used is:
+// https://gcc.gnu.org/git/?p=gcc.git;a=blob;f=libgcc/config/i386/linux-unwind.h;h=5486223d60272c73d5103b29ae592d2ee998e1cf#l136
+//
+// For gdb unwinding to work, this function must look precisely like the one in
+// glibc and must be named "__restore_rt" or contain the string "sigaction" in
+// the name. The gdb source code is:
+// https://sourceware.org/git/?p=binutils-gdb.git;a=blob;f=gdb/i386-linux-tdep.c;h=a6adeca1b97416f7194341151a8ce30723a786a3#l168
+TEXT runtime·sigreturn__sigaction(SB),NOSPLIT,$0
 	MOVL	$SYS_rt_sigreturn, AX
 	// Sigreturn expects same SP as signal handler,
 	// so cannot CALL 0x10(GS) here.
diff --git a/src/runtime/sys_linux_amd64.s b/src/runtime/sys_linux_amd64.s
index c7a89ba..b6c64dc 100644
--- a/src/runtime/sys_linux_amd64.s
+++ b/src/runtime/sys_linux_amd64.s
@@ -325,16 +325,14 @@
 	MOVL	sig+8(FP),   DI
 	MOVQ	info+16(FP), SI
 	MOVQ	ctx+24(FP),  DX
-	PUSHQ	BP
-	MOVQ	SP, BP
+	MOVQ	SP, BX		// callee-saved
 	ANDQ	$~15, SP     // alignment for x86_64 ABI
 	CALL	AX
-	MOVQ	BP, SP
-	POPQ	BP
+	MOVQ	BX, SP
 	RET
 
 // Called using C ABI.
-TEXT runtime·sigtramp(SB),NOSPLIT|TOPFRAME,$0
+TEXT runtime·sigtramp(SB),NOSPLIT|TOPFRAME|NOFRAME,$0
 	// Transition from C ABI to Go ABI.
 	PUSH_REGS_HOST_TO_ABI0()
 
@@ -355,11 +353,11 @@
 
 	ADJSP	$-24
 
-        POP_REGS_HOST_TO_ABI0()
+	POP_REGS_HOST_TO_ABI0()
 	RET
 
 // Called using C ABI.
-TEXT runtime·sigprofNonGoWrapper<>(SB),NOSPLIT,$0
+TEXT runtime·sigprofNonGoWrapper<>(SB),NOSPLIT|NOFRAME,$0
 	// Transition from C ABI to Go ABI.
 	PUSH_REGS_HOST_TO_ABI0()
 
@@ -460,11 +458,16 @@
 	JMP	AX
 
 // For cgo unwinding to work, this function must look precisely like
-// the one in glibc.  The glibc source code is:
-// https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/x86_64/sigaction.c
+// the one in glibc. The glibc source code is:
+// https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/x86_64/libc_sigaction.c;h=afdce87381228f0cf32fa9fa6c8c4efa5179065c#l80
 // The code that cares about the precise instructions used is:
-// https://gcc.gnu.org/viewcvs/gcc/trunk/libgcc/config/i386/linux-unwind.h?revision=219188&view=markup
-TEXT runtime·sigreturn(SB),NOSPLIT,$0
+// https://gcc.gnu.org/git/?p=gcc.git;a=blob;f=libgcc/config/i386/linux-unwind.h;h=5486223d60272c73d5103b29ae592d2ee998e1cf#l49
+//
+// For gdb unwinding to work, this function must look precisely like the one in
+// glibc and must be named "__restore_rt" or contain the string "sigaction" in
+// the name. The gdb source code is:
+// https://sourceware.org/git/?p=binutils-gdb.git;a=blob;f=gdb/amd64-linux-tdep.c;h=cbbac1a0c64e1deb8181b9d0ff6404e328e2979d#l178
+TEXT runtime·sigreturn__sigaction(SB),NOSPLIT,$0
 	MOVQ	$SYS_rt_sigreturn, AX
 	SYSCALL
 	INT $3	// not reached
@@ -556,7 +559,7 @@
 	RET
 
 // int32 clone(int32 flags, void *stk, M *mp, G *gp, void (*fn)(void));
-TEXT runtime·clone(SB),NOSPLIT,$0
+TEXT runtime·clone(SB),NOSPLIT|NOFRAME,$0
 	MOVL	flags+0(FP), DI
 	MOVQ	stk+8(FP), SI
 	MOVQ	$0, DX
@@ -620,7 +623,7 @@
 	SYSCALL
 	JMP	-3(PC)	// keep exiting
 
-TEXT runtime·sigaltstack(SB),NOSPLIT,$-8
+TEXT runtime·sigaltstack(SB),NOSPLIT,$0
 	MOVQ	new+0(FP), DI
 	MOVQ	old+8(FP), SI
 	MOVQ	$SYS_sigaltstack, AX
diff --git a/src/runtime/sys_linux_arm.s b/src/runtime/sys_linux_arm.s
index 7b8c4f0..992d32a 100644
--- a/src/runtime/sys_linux_arm.s
+++ b/src/runtime/sys_linux_arm.s
@@ -650,6 +650,3 @@
 	SWI	$0
 	MOVW	R0, ret+0(FP)
 	RET
-
-TEXT runtime·sigreturn(SB),NOSPLIT,$0-0
-	RET
diff --git a/src/runtime/sys_linux_arm64.s b/src/runtime/sys_linux_arm64.s
index 38ff6ac..51c87be 100644
--- a/src/runtime/sys_linux_arm64.s
+++ b/src/runtime/sys_linux_arm64.s
@@ -455,14 +455,9 @@
 	CBZ	R0, 2(PC)
 	BL	runtime·load_g(SB)
 
-#ifdef GOEXPERIMENT_regabiargs
 	// Restore signum to R0.
 	MOVW	8(RSP), R0
 	// R1 and R2 already contain info and ctx, respectively.
-#else
-	MOVD	R1, 16(RSP)
-	MOVD	R2, 24(RSP)
-#endif
 	MOVD	$runtime·sigtrampgo<ABIInternal>(SB), R3
 	BL	(R3)
 
@@ -478,13 +473,7 @@
 	SAVE_R19_TO_R28(8*4)
 	SAVE_F8_TO_F15(8*14)
 
-#ifdef GOEXPERIMENT_regabiargs
 	// R0, R1 and R2 already contain sig, info and ctx, respectively.
-#else
-	MOVW	R0, 8(RSP)	// sig
-	MOVD	R1, 16(RSP)	// info
-	MOVD	R2, 24(RSP)	// ctx
-#endif
 	CALL	runtime·sigprofNonGo<ABIInternal>(SB)
 
 	// Restore callee-save registers.
@@ -796,6 +785,3 @@
 	SVC
 	MOVD	R0, ret+0(FP)
 	RET
-
-TEXT runtime·sigreturn(SB),NOSPLIT,$0-0
-	RET
diff --git a/src/runtime/sys_linux_loong64.s b/src/runtime/sys_linux_loong64.s
index 9ce5e72..12e5455 100644
--- a/src/runtime/sys_linux_loong64.s
+++ b/src/runtime/sys_linux_loong64.s
@@ -9,8 +9,11 @@
 #include "go_asm.h"
 #include "go_tls.h"
 #include "textflag.h"
+#include "cgo/abi_loong64.h"
 
-#define AT_FDCWD -100
+#define AT_FDCWD	-100
+#define CLOCK_REALTIME	0
+#define CLOCK_MONOTONIC	1
 
 #define SYS_exit		93
 #define SYS_read		63
@@ -43,6 +46,7 @@
 #define SYS_timer_settime	110
 #define SYS_timer_delete	111
 
+// func exit(code int32)
 TEXT runtime·exit(SB),NOSPLIT|NOFRAME,$0-4
 	MOVW	code+0(FP), R4
 	MOVV	$SYS_exit_group, R11
@@ -62,6 +66,7 @@
 	SYSCALL
 	JMP	0(PC)
 
+// func open(name *byte, mode, perm int32) int32
 TEXT runtime·open(SB),NOSPLIT|NOFRAME,$0-20
 	MOVW	$AT_FDCWD, R4 // AT_FDCWD, so this acts like open
 	MOVV	name+0(FP), R5
@@ -75,6 +80,7 @@
 	MOVW	R4, ret+16(FP)
 	RET
 
+// func closefd(fd int32) int32
 TEXT runtime·closefd(SB),NOSPLIT|NOFRAME,$0-12
 	MOVW	fd+0(FP), R4
 	MOVV	$SYS_close, R11
@@ -85,6 +91,7 @@
 	MOVW	R4, ret+8(FP)
 	RET
 
+// func write1(fd uintptr, p unsafe.Pointer, n int32) int32
 TEXT runtime·write1(SB),NOSPLIT|NOFRAME,$0-28
 	MOVV	fd+0(FP), R4
 	MOVV	p+8(FP), R5
@@ -94,6 +101,7 @@
 	MOVW	R4, ret+24(FP)
 	RET
 
+// func read(fd int32, p unsafe.Pointer, n int32) int32
 TEXT runtime·read(SB),NOSPLIT|NOFRAME,$0-28
 	MOVW	fd+0(FP), R4
 	MOVV	p+8(FP), R5
@@ -112,30 +120,33 @@
 	MOVW	R4, errno+16(FP)
 	RET
 
+// func usleep(usec uint32)
 TEXT runtime·usleep(SB),NOSPLIT,$16-4
-	MOVWU	usec+0(FP), R6
-	MOVV	R6, R5
-	MOVW	$1000000, R4
-	DIVVU	R4, R6, R6
-	MOVV	R6, 8(R3)
-	MOVW	$1000, R4
-	MULVU	R6, R4, R4
-	SUBVU	R4, R5
-	MOVV	R5, 16(R3)
+	MOVWU	usec+0(FP), R7
+	MOVV	$1000, R6
+	MULVU	R6, R7, R7
+	MOVV	$1000000000, R6
+
+	DIVVU	R6, R7, R5	// ts->tv_sec
+	REMVU	R6, R7, R4	// ts->tv_nsec
+	MOVV	R5, 8(R3)
+	MOVV	R4, 16(R3)
 
 	// nanosleep(&ts, 0)
 	ADDV	$8, R3, R4
-	MOVW	$0, R5
+	MOVV	R0, R5
 	MOVV	$SYS_nanosleep, R11
 	SYSCALL
 	RET
 
+// func gettid() uint32
 TEXT runtime·gettid(SB),NOSPLIT,$0-4
 	MOVV	$SYS_gettid, R11
 	SYSCALL
 	MOVW	R4, ret+0(FP)
 	RET
 
+// func raise(sig uint32)
 TEXT runtime·raise(SB),NOSPLIT|NOFRAME,$0
 	MOVV	$SYS_getpid, R11
 	SYSCALL
@@ -149,6 +160,7 @@
 	SYSCALL
 	RET
 
+// func raiseproc(sig uint32)
 TEXT runtime·raiseproc(SB),NOSPLIT|NOFRAME,$0
 	MOVV	$SYS_getpid, R11
 	SYSCALL
@@ -158,12 +170,14 @@
 	SYSCALL
 	RET
 
+// func getpid() int
 TEXT ·getpid(SB),NOSPLIT|NOFRAME,$0-8
 	MOVV	$SYS_getpid, R11
 	SYSCALL
 	MOVV	R4, ret+0(FP)
 	RET
 
+// func tgkill(tgid, tid, sig int)
 TEXT ·tgkill(SB),NOSPLIT|NOFRAME,$0-24
 	MOVV	tgid+0(FP), R4
 	MOVV	tid+8(FP), R5
@@ -172,6 +186,7 @@
 	SYSCALL
 	RET
 
+// func setitimer(mode int32, new, old *itimerval)
 TEXT runtime·setitimer(SB),NOSPLIT|NOFRAME,$0-24
 	MOVW	mode+0(FP), R4
 	MOVV	new+8(FP), R5
@@ -180,6 +195,7 @@
 	SYSCALL
 	RET
 
+// func timer_create(clockid int32, sevp *sigevent, timerid *int32) int32
 TEXT runtime·timer_create(SB),NOSPLIT,$0-28
 	MOVW	clockid+0(FP), R4
 	MOVV	sevp+8(FP), R5
@@ -189,6 +205,7 @@
 	MOVW	R4, ret+24(FP)
 	RET
 
+// func timer_settime(timerid int32, flags int32, new, old *itimerspec) int32
 TEXT runtime·timer_settime(SB),NOSPLIT,$0-28
 	MOVW	timerid+0(FP), R4
 	MOVW	flags+4(FP), R5
@@ -199,6 +216,7 @@
 	MOVW	R4, ret+24(FP)
 	RET
 
+// func timer_delete(timerid int32) int32
 TEXT runtime·timer_delete(SB),NOSPLIT,$0-12
 	MOVW	timerid+0(FP), R4
 	MOVV	$SYS_timer_delete, R11
@@ -206,6 +224,7 @@
 	MOVW	R4, ret+8(FP)
 	RET
 
+// func mincore(addr unsafe.Pointer, n uintptr, dst *byte) int32
 TEXT runtime·mincore(SB),NOSPLIT|NOFRAME,$0-28
 	MOVV	addr+0(FP), R4
 	MOVV	n+8(FP), R5
@@ -216,7 +235,7 @@
 	RET
 
 // func walltime() (sec int64, nsec int32)
-TEXT runtime·walltime(SB),NOSPLIT,$16-12
+TEXT runtime·walltime(SB),NOSPLIT,$24-12
 	MOVV	R3, R23	// R23 is unchanged by C code
 	MOVV	R3, R25
 
@@ -246,12 +265,29 @@
 	AND	$~15, R25	// Align for C code
 	MOVV	R25, R3
 
-	MOVW	$0, R4 // CLOCK_REALTIME=0
+	MOVW	$CLOCK_REALTIME, R4
 	MOVV	$0(R3), R5
 
 	MOVV	runtime·vdsoClockgettimeSym(SB), R20
 	BEQ	R20, fallback
 
+	// Store g on gsignal's stack, see sys_linux_arm64.s for detail
+	MOVBU	runtime·iscgo(SB), R25
+	BNE	R25, nosaveg
+
+	MOVV	m_gsignal(R24), R25	// g.m.gsignal
+	BEQ	R25, nosaveg
+	BEQ	g, R25, nosaveg
+
+	MOVV	(g_stack+stack_lo)(R25), R25	// g.m.gsignal.stack.lo
+	MOVV	g, (R25)
+
+	JAL	(R20)
+
+	MOVV	R0, (R25)
+	JMP	finish
+
+nosaveg:
 	JAL	(R20)
 
 finish:
@@ -278,6 +314,7 @@
 	SYSCALL
 	JMP finish
 
+// func nanotime1() int64
 TEXT runtime·nanotime1(SB),NOSPLIT,$16-8
 	MOVV	R3, R23	// R23 is unchanged by C code
 	MOVV	R3, R25
@@ -308,12 +345,29 @@
 	AND	$~15, R25	// Align for C code
 	MOVV	R25, R3
 
-	MOVW	$1, R4 // CLOCK_MONOTONIC=1
+	MOVW	$CLOCK_MONOTONIC, R4
 	MOVV	$0(R3), R5
 
 	MOVV	runtime·vdsoClockgettimeSym(SB), R20
 	BEQ	R20, fallback
 
+	// Store g on gsignal's stack, see sys_linux_arm64.s for detail
+	MOVBU	runtime·iscgo(SB), R25
+	BNE	R25, nosaveg
+
+	MOVV	m_gsignal(R24), R25	// g.m.gsignal
+	BEQ	R25, nosaveg
+	BEQ	g, R25, nosaveg
+
+	MOVV	(g_stack+stack_lo)(R25), R25	// g.m.gsignal.stack.lo
+	MOVV	g, (R25)
+
+	JAL	(R20)
+
+	MOVV	R0, (R25)
+	JMP	finish
+
+nosaveg:
 	JAL	(R20)
 
 finish:
@@ -344,6 +398,7 @@
 	SYSCALL
 	JMP	finish
 
+// func rtsigprocmask(how int32, new, old *sigset, size int32)
 TEXT runtime·rtsigprocmask(SB),NOSPLIT|NOFRAME,$0-28
 	MOVW	how+0(FP), R4
 	MOVV	new+8(FP), R5
@@ -356,6 +411,7 @@
 	MOVV	R0, 0xf1(R0)	// crash
 	RET
 
+// func rt_sigaction(sig uintptr, new, old *sigactiont, size uintptr) int32
 TEXT runtime·rt_sigaction(SB),NOSPLIT|NOFRAME,$0-36
 	MOVV	sig+0(FP), R4
 	MOVV	new+8(FP), R5
@@ -366,6 +422,7 @@
 	MOVW	R4, ret+32(FP)
 	RET
 
+// func sigfwd(fn uintptr, sig uint32, info *siginfo, ctx unsafe.Pointer)
 TEXT runtime·sigfwd(SB),NOSPLIT,$0-32
 	MOVW	sig+8(FP), R4
 	MOVV	info+16(FP), R5
@@ -374,23 +431,37 @@
 	JAL	(R20)
 	RET
 
-TEXT runtime·sigtramp(SB),NOSPLIT|TOPFRAME,$64
+// func sigtramp(signo, ureg, ctxt unsafe.Pointer)
+TEXT runtime·sigtramp(SB),NOSPLIT|TOPFRAME,$168
+	MOVW	R4, (1*8)(R3)
+	MOVV	R5, (2*8)(R3)
+	MOVV	R6, (3*8)(R3)
+
+	// Save callee-save registers in the case of signal forwarding.
+	// Please refer to https://golang.org/issue/31827 .
+	SAVE_R22_TO_R31((4*8))
+	SAVE_F24_TO_F31((14*8))
+
 	// this might be called in external code context,
 	// where g is not set.
-	MOVB	runtime·iscgo(SB), R19
-	BEQ	R19, 2(PC)
+	MOVB	runtime·iscgo(SB), R4
+	BEQ	R4, 2(PC)
 	JAL	runtime·load_g(SB)
 
-	MOVW	R4, 8(R3)
-	MOVV	R5, 16(R3)
-	MOVV	R6, 24(R3)
-	MOVV	$runtime·sigtrampgo(SB), R19
-	JAL	(R19)
+	MOVV	$runtime·sigtrampgo(SB), R4
+	JAL	(R4)
+
+	// Restore callee-save registers.
+	RESTORE_R22_TO_R31((4*8))
+	RESTORE_F24_TO_F31((14*8))
+
 	RET
 
+// func cgoSigtramp()
 TEXT runtime·cgoSigtramp(SB),NOSPLIT,$0
 	JMP	runtime·sigtramp(SB)
 
+// func mmap(addr unsafe.Pointer, n uintptr, prot, flags, fd int32, off uint32) (p unsafe.Pointer, err int)
 TEXT runtime·mmap(SB),NOSPLIT|NOFRAME,$0
 	MOVV	addr+0(FP), R4
 	MOVV	n+8(FP), R5
@@ -412,6 +483,7 @@
 	MOVV	$0, err+40(FP)
 	RET
 
+// func munmap(addr unsafe.Pointer, n uintptr)
 TEXT runtime·munmap(SB),NOSPLIT|NOFRAME,$0
 	MOVV	addr+0(FP), R4
 	MOVV	n+8(FP), R5
@@ -422,6 +494,7 @@
 	MOVV	R0, 0xf3(R0)	// crash
 	RET
 
+// func madvise(addr unsafe.Pointer, n uintptr, flags int32)
 TEXT runtime·madvise(SB),NOSPLIT|NOFRAME,$0
 	MOVV	addr+0(FP), R4
 	MOVV	n+8(FP), R5
@@ -431,8 +504,7 @@
 	MOVW	R4, ret+24(FP)
 	RET
 
-// int64 futex(int32 *uaddr, int32 op, int32 val,
-//	struct timespec *timeout, int32 *uaddr2, int32 val2);
+// func futex(addr unsafe.Pointer, op int32, val uint32, ts, addr2 unsafe.Pointer, val3 uint32) int32
 TEXT runtime·futex(SB),NOSPLIT|NOFRAME,$0
 	MOVV	addr+0(FP), R4
 	MOVW	op+8(FP), R5
@@ -506,6 +578,7 @@
 	SYSCALL
 	JMP	-3(PC)	// keep exiting
 
+// func sigaltstack(new, old *stackt)
 TEXT runtime·sigaltstack(SB),NOSPLIT|NOFRAME,$0
 	MOVV	new+0(FP), R4
 	MOVV	old+8(FP), R5
@@ -516,11 +589,13 @@
 	MOVV	R0, 0xf1(R0)	// crash
 	RET
 
+// func osyield()
 TEXT runtime·osyield(SB),NOSPLIT|NOFRAME,$0
 	MOVV	$SYS_sched_yield, R11
 	SYSCALL
 	RET
 
+// func sched_getaffinity(pid, len uintptr, buf *uintptr) int32
 TEXT runtime·sched_getaffinity(SB),NOSPLIT|NOFRAME,$0
 	MOVV	pid+0(FP), R4
 	MOVV	len+8(FP), R5
diff --git a/src/runtime/sys_linux_ppc64x.s b/src/runtime/sys_linux_ppc64x.s
index d0427a4..d105585 100644
--- a/src/runtime/sys_linux_ppc64x.s
+++ b/src/runtime/sys_linux_ppc64x.s
@@ -12,6 +12,7 @@
 #include "go_tls.h"
 #include "textflag.h"
 #include "asm_ppc64x.h"
+#include "cgo/abi_ppc64x.h"
 
 #define SYS_exit		  1
 #define SYS_read		  3
@@ -446,104 +447,24 @@
 	MOVD	24(R1), R2
 	RET
 
-TEXT runtime·sigreturn(SB),NOSPLIT,$0-0
-	RET
-
-#ifdef GOARCH_ppc64le
+#ifdef GO_PPC64X_HAS_FUNCDESC
+DEFINE_PPC64X_FUNCDESC(runtime·sigtramp, sigtramp<>)
+// cgo isn't supported on ppc64, but we need to supply a cgoSigTramp function.
+DEFINE_PPC64X_FUNCDESC(runtime·cgoSigtramp, sigtramp<>)
+TEXT sigtramp<>(SB),NOSPLIT|NOFRAME|TOPFRAME,$0
+#else
 // ppc64le doesn't need function descriptors
 // Save callee-save registers in the case of signal forwarding.
 // Same as on ARM64 https://golang.org/issue/31827 .
+//
+// Note, it is assumed this is always called indirectly (e.g via
+// a function pointer) as R2 may not be preserved when calling this
+// function. In those cases, the caller preserves their R2.
 TEXT runtime·sigtramp(SB),NOSPLIT|NOFRAME,$0
-#else
-// function descriptor for the real sigtramp
-TEXT runtime·sigtramp(SB),NOSPLIT|NOFRAME,$0
-	DWORD	$sigtramp<>(SB)
-	DWORD	$0
-	DWORD	$0
-TEXT sigtramp<>(SB),NOSPLIT|NOFRAME|TOPFRAME,$0
 #endif
-	// Start with standard C stack frame layout and linkage.
-	MOVD    LR, R0
-	MOVD    R0, 16(R1) // Save LR in caller's frame.
-	MOVW    CR, R0     // Save CR in caller's frame
-	MOVD    R0, 8(R1)
-	// The stack must be acquired here and not
-	// in the automatic way based on stack size
-	// since that sequence clobbers R31 before it
-	// gets saved.
-	// We are being ultra safe here in saving the
-	// Vregs. The case where they might need to
-	// be saved is very unlikely.
-	MOVDU   R1, -544(R1)
-	MOVD    R14, 64(R1)
-	MOVD    R15, 72(R1)
-	MOVD    R16, 80(R1)
-	MOVD    R17, 88(R1)
-	MOVD    R18, 96(R1)
-	MOVD    R19, 104(R1)
-	MOVD    R20, 112(R1)
-	MOVD    R21, 120(R1)
-	MOVD    R22, 128(R1)
-	MOVD    R23, 136(R1)
-	MOVD    R24, 144(R1)
-	MOVD    R25, 152(R1)
-	MOVD    R26, 160(R1)
-	MOVD    R27, 168(R1)
-	MOVD    R28, 176(R1)
-	MOVD    R29, 184(R1)
-	MOVD    g, 192(R1) // R30
-	MOVD    R31, 200(R1)
-	FMOVD   F14, 208(R1)
-	FMOVD   F15, 216(R1)
-	FMOVD   F16, 224(R1)
-	FMOVD   F17, 232(R1)
-	FMOVD   F18, 240(R1)
-	FMOVD   F19, 248(R1)
-	FMOVD   F20, 256(R1)
-	FMOVD   F21, 264(R1)
-	FMOVD   F22, 272(R1)
-	FMOVD   F23, 280(R1)
-	FMOVD   F24, 288(R1)
-	FMOVD   F25, 296(R1)
-	FMOVD   F26, 304(R1)
-	FMOVD   F27, 312(R1)
-	FMOVD   F28, 320(R1)
-	FMOVD   F29, 328(R1)
-	FMOVD   F30, 336(R1)
-	FMOVD   F31, 344(R1)
-	// Save V regs
-	// STXVD2X and LXVD2X used since
-	// we aren't sure of alignment.
-	// Endianness doesn't matter
-	// if we are just loading and
-	// storing values.
-	MOVD	$352, R7 // V20
-	STXVD2X VS52, (R7)(R1)
-	ADD	$16, R7 // V21 368
-	STXVD2X VS53, (R7)(R1)
-	ADD	$16, R7 // V22 384
-	STXVD2X VS54, (R7)(R1)
-	ADD	$16, R7 // V23 400
-	STXVD2X VS55, (R7)(R1)
-	ADD	$16, R7 // V24 416
-	STXVD2X	VS56, (R7)(R1)
-	ADD	$16, R7 // V25 432
-	STXVD2X	VS57, (R7)(R1)
-	ADD	$16, R7 // V26 448
-	STXVD2X VS58, (R7)(R1)
-	ADD	$16, R7 // V27 464
-	STXVD2X VS59, (R7)(R1)
-	ADD	$16, R7 // V28 480
-	STXVD2X VS60, (R7)(R1)
-	ADD	$16, R7 // V29 496
-	STXVD2X VS61, (R7)(R1)
-	ADD	$16, R7 // V30 512
-	STXVD2X VS62, (R7)(R1)
-	ADD	$16, R7 // V31 528
-	STXVD2X VS63, (R7)(R1)
-
-	// initialize essential registers (just in case)
-	BL	runtime·reginit(SB)
+	// This is called with ELF calling conventions. Convert to Go.
+	// Allocate space for argument storage to call runtime.sigtrampgo.
+	STACK_AND_SAVE_HOST_TO_GO_ABI(32)
 
 	// this might be called in external code context,
 	// where g is not set.
@@ -552,92 +473,30 @@
 	BEQ	2(PC)
 	BL	runtime·load_g(SB)
 
-	MOVW	R3, FIXED_FRAME+0(R1)
-	MOVD	R4, FIXED_FRAME+8(R1)
-	MOVD	R5, FIXED_FRAME+16(R1)
-	MOVD	$runtime·sigtrampgo(SB), R12
+	// R3,R4,R5 already hold the arguments. Forward them on.
+	// TODO: Indirectly call runtime.sigtrampgo to avoid the linker's static NOSPLIT stack
+	// overflow detection. It thinks this might be called on a small Go stack, but this is only
+	// called from a larger pthread or sigaltstack stack. Can the checker be improved to not
+	// flag a direct call here?
+	MOVD	$runtime·sigtrampgo<ABIInternal>(SB), R12
 	MOVD	R12, CTR
 	BL	(CTR)
-	MOVD	24(R1), R2 // Should this be here? Where is it saved?
-	// Starts at 64; FIXED_FRAME is 32
-	MOVD    64(R1), R14
-	MOVD    72(R1), R15
-	MOVD    80(R1), R16
-	MOVD    88(R1), R17
-	MOVD    96(R1), R18
-	MOVD    104(R1), R19
-	MOVD    112(R1), R20
-	MOVD    120(R1), R21
-	MOVD    128(R1), R22
-	MOVD    136(R1), R23
-	MOVD    144(R1), R24
-	MOVD    152(R1), R25
-	MOVD    160(R1), R26
-	MOVD    168(R1), R27
-	MOVD    176(R1), R28
-	MOVD    184(R1), R29
-	MOVD    192(R1), g // R30
-	MOVD    200(R1), R31
-	FMOVD   208(R1), F14
-	FMOVD   216(R1), F15
-	FMOVD   224(R1), F16
-	FMOVD   232(R1), F17
-	FMOVD   240(R1), F18
-	FMOVD   248(R1), F19
-	FMOVD   256(R1), F20
-	FMOVD   264(R1), F21
-	FMOVD   272(R1), F22
-	FMOVD   280(R1), F23
-	FMOVD   288(R1), F24
-	FMOVD   292(R1), F25
-	FMOVD   300(R1), F26
-	FMOVD   308(R1), F27
-	FMOVD   316(R1), F28
-	FMOVD   328(R1), F29
-	FMOVD   336(R1), F30
-	FMOVD   344(R1), F31
-	MOVD	$352, R7
-	LXVD2X	(R7)(R1), VS52
-	ADD	$16, R7 // 368 V21
-	LXVD2X	(R7)(R1), VS53
-	ADD	$16, R7 // 384 V22
-	LXVD2X	(R7)(R1), VS54
-	ADD	$16, R7 // 400 V23
-	LXVD2X	(R7)(R1), VS55
-	ADD	$16, R7 // 416 V24
-	LXVD2X	(R7)(R1), VS56
-	ADD	$16, R7 // 432 V25
-	LXVD2X	(R7)(R1), VS57
-	ADD	$16, R7 // 448 V26
-	LXVD2X	(R7)(R1), VS58
-	ADD	$16, R8 // 464 V27
-	LXVD2X	(R7)(R1), VS59
-	ADD	$16, R7 // 480 V28
-	LXVD2X	(R7)(R1), VS60
-	ADD	$16, R7 // 496 V29
-	LXVD2X	(R7)(R1), VS61
-	ADD	$16, R7 // 512 V30
-	LXVD2X	(R7)(R1), VS62
-	ADD	$16, R7 // 528 V31
-	LXVD2X	(R7)(R1), VS63
-	ADD	$544, R1
-	MOVD	8(R1), R0
-	MOVFL	R0, $0xff
-	MOVD	16(R1), R0
-	MOVD	R0, LR
+	// Restore R2 (TOC pointer) in the event it might be used later in this function.
+	// If this was not compiled as shared code, R2 is undefined, reloading it is harmless.
+	MOVD	24(R1), R2
 
+	UNSTACK_AND_RESTORE_GO_TO_HOST_ABI(32)
 	RET
 
 #ifdef GOARCH_ppc64le
-// ppc64le doesn't need function descriptors
 TEXT runtime·cgoSigtramp(SB),NOSPLIT|NOFRAME,$0
 	// The stack unwinder, presumably written in C, may not be able to
 	// handle Go frame correctly. So, this function is NOFRAME, and we
-	// save/restore LR manually.
+	// save/restore LR manually, and obey ELFv2 calling conventions.
 	MOVD	LR, R10
 
-	// We're coming from C code, initialize essential registers.
-	CALL	runtime·reginit(SB)
+	// We're coming from C code, initialize R0
+	MOVD	$0, R0
 
 	// If no traceback function, do usual sigtramp.
 	MOVD	runtime·cgoTraceback(SB), R6
@@ -650,15 +509,18 @@
 	CMP	$0, R6
 	BEQ	sigtramp
 
-	// Set up g register.
-	CALL	runtime·load_g(SB)
+	// Inspect the g in TLS without clobbering R30/R31 via runtime.load_g.
+	MOVD	runtime·tls_g(SB), R9
+	MOVD	0(R9), R9
 
 	// Figure out if we are currently in a cgo call.
 	// If not, just do usual sigtramp.
 	// compared to ARM64 and others.
-	CMP	$0, g
+	CMP	$0, R9
 	BEQ	sigtrampnog // g == nil
-	MOVD	g_m(g), R6
+
+	// g is not nil. Check further.
+	MOVD	g_m(R9), R6
 	CMP	$0, R6
 	BEQ	sigtramp    // g.m == nil
 	MOVW	m_ncgo(R6), R7
@@ -721,23 +583,19 @@
 	MOVD	R12, CTR
 	MOVD	R10, LR // restore LR
 	JMP	(CTR)
-#else
-// function descriptor for the real sigtramp
-TEXT runtime·cgoSigtramp(SB),NOSPLIT|NOFRAME,$0
-	DWORD	$cgoSigtramp<>(SB)
-	DWORD	$0
-	DWORD	$0
-TEXT cgoSigtramp<>(SB),NOSPLIT,$0
-	JMP	sigtramp<>(SB)
 #endif
 
-TEXT runtime·sigprofNonGoWrapper<>(SB),NOSPLIT,$0
-	// We're coming from C code, set up essential register, then call sigprofNonGo.
-	CALL	runtime·reginit(SB)
-	MOVW	R3, FIXED_FRAME+0(R1)	// sig
-	MOVD	R4, FIXED_FRAME+8(R1)	// info
-	MOVD	R5, FIXED_FRAME+16(R1)	// ctx
-	CALL	runtime·sigprofNonGo(SB)
+// Used by cgoSigtramp to inspect without clobbering R30/R31 via runtime.load_g.
+GLOBL runtime·tls_g+0(SB), TLSBSS+DUPOK, $8
+
+TEXT runtime·sigprofNonGoWrapper<>(SB),NOSPLIT|NOFRAME,$0
+	// This is called from C code. Callee save registers must be saved.
+	// R3,R4,R5 hold arguments, and allocate argument space to call sigprofNonGo.
+	STACK_AND_SAVE_HOST_TO_GO_ABI(32)
+
+	CALL	runtime·sigprofNonGo<ABIInternal>(SB)
+
+	UNSTACK_AND_RESTORE_GO_TO_HOST_ABI(32)
 	RET
 
 TEXT runtime·mmap(SB),NOSPLIT|NOFRAME,$0
diff --git a/src/runtime/sys_linux_s390x.s b/src/runtime/sys_linux_s390x.s
index 1448670..adf5612 100644
--- a/src/runtime/sys_linux_s390x.s
+++ b/src/runtime/sys_linux_s390x.s
@@ -412,9 +412,6 @@
 	BL	R5
 	RET
 
-TEXT runtime·sigreturn(SB),NOSPLIT,$0-0
-	RET
-
 TEXT runtime·sigtramp(SB),NOSPLIT|TOPFRAME,$64
 	// initialize essential registers (just in case)
 	XOR	R0, R0
diff --git a/src/runtime/sys_netbsd_386.s b/src/runtime/sys_netbsd_386.s
index 7be18c6..f4875cd 100644
--- a/src/runtime/sys_netbsd_386.s
+++ b/src/runtime/sys_netbsd_386.s
@@ -12,8 +12,6 @@
 
 #define CLOCK_REALTIME		0
 #define CLOCK_MONOTONIC		3
-#define FD_CLOEXEC		1
-#define F_SETFD			2
 
 #define SYS_exit			1
 #define SYS_read			3
@@ -29,6 +27,7 @@
 #define SYS___sysctl			202
 #define SYS___sigaltstack14		281
 #define SYS___sigprocmask14		293
+#define SYS_issetugid			305
 #define SYS_getcontext			307
 #define SYS_setcontext			308
 #define SYS__lwp_create			309
@@ -457,15 +456,22 @@
 	MOVL	AX, ret+24(FP)
 	RET
 
-// int32 runtime·closeonexec(int32 fd)
-TEXT runtime·closeonexec(SB),NOSPLIT,$32
+// func fcntl(fd, cmd, arg int32) (int32, int32)
+TEXT runtime·fcntl(SB),NOSPLIT,$-4
 	MOVL	$SYS_fcntl, AX
-	// 0(SP) is where the caller PC would be; kernel skips it
-	MOVL	fd+0(FP), BX
-	MOVL	BX, 4(SP)	// fd
-	MOVL	$F_SETFD, 8(SP)
-	MOVL	$FD_CLOEXEC, 12(SP)
 	INT	$0x80
-	JAE	2(PC)
-	NEGL	AX
+	JAE	noerr
+	MOVL	$-1, ret+12(FP)
+	MOVL	AX, errno+16(FP)
+	RET
+noerr:
+	MOVL	AX, ret+12(FP)
+	MOVL	$0, errno+16(FP)
+	RET
+
+// func issetugid() int32
+TEXT runtime·issetugid(SB),NOSPLIT,$0
+	MOVL	$SYS_issetugid, AX
+	INT	$0x80
+	MOVL	AX, ret+0(FP)
 	RET
diff --git a/src/runtime/sys_netbsd_amd64.s b/src/runtime/sys_netbsd_amd64.s
index 30f3f38..2f1ddcd 100644
--- a/src/runtime/sys_netbsd_amd64.s
+++ b/src/runtime/sys_netbsd_amd64.s
@@ -13,8 +13,6 @@
 
 #define CLOCK_REALTIME		0
 #define CLOCK_MONOTONIC		3
-#define FD_CLOEXEC		1
-#define F_SETFD			2
 
 #define SYS_exit			1
 #define SYS_read			3
@@ -30,6 +28,7 @@
 #define SYS___sysctl			202
 #define SYS___sigaltstack14		281
 #define SYS___sigprocmask14		293
+#define SYS_issetugid			305
 #define SYS_getcontext			307
 #define SYS_setcontext			308
 #define SYS__lwp_create			309
@@ -296,16 +295,14 @@
 	MOVL	sig+8(FP),   DI
 	MOVQ	info+16(FP), SI
 	MOVQ	ctx+24(FP),  DX
-	PUSHQ	BP
-	MOVQ	SP, BP
-	ANDQ	$~15, SP     // alignment for x86_64 ABI
+	MOVQ	SP, BX		// callee-saved
+	ANDQ	$~15, SP	// alignment for x86_64 ABI
 	CALL	AX
-	MOVQ	BP, SP
-	POPQ	BP
+	MOVQ	BX, SP
 	RET
 
 // Called using C ABI.
-TEXT runtime·sigtramp(SB),NOSPLIT|TOPFRAME,$0
+TEXT runtime·sigtramp(SB),NOSPLIT|TOPFRAME|NOFRAME,$0
 	// Transition from C ABI to Go ABI.
 	PUSH_REGS_HOST_TO_ABI0()
 
@@ -326,7 +323,7 @@
 
 	ADJSP	$-24
 
-        POP_REGS_HOST_TO_ABI0()
+	POP_REGS_HOST_TO_ABI0()
 	RET
 
 TEXT runtime·mmap(SB),NOSPLIT,$0
@@ -434,11 +431,28 @@
 	MOVL	AX, ret+48(FP)
 	RET
 
-// void runtime·closeonexec(int32 fd)
-TEXT runtime·closeonexec(SB),NOSPLIT,$0
+// func fcntl(fd, cmd, arg int32) (int32, int32)
+TEXT runtime·fcntl(SB),NOSPLIT,$0
 	MOVL	fd+0(FP), DI	// fd
-	MOVQ	$F_SETFD, SI
-	MOVQ	$FD_CLOEXEC, DX
+	MOVL	cmd+4(FP), SI	// cmd
+	MOVL	arg+8(FP), DX	// arg
 	MOVL	$SYS_fcntl, AX
 	SYSCALL
+	JCC	noerr
+	MOVL	$-1, ret+16(FP)
+	MOVL	AX, errno+20(FP)
+	RET
+noerr:
+	MOVL	AX, ret+16(FP)
+	MOVL	$0, errno+20(FP)
+	RET
+
+// func issetugid() int32
+TEXT runtime·issetugid(SB),NOSPLIT,$0
+	MOVQ	$0, DI
+	MOVQ	$0, SI
+	MOVQ	$0, DX
+	MOVL	$SYS_issetugid, AX
+	SYSCALL
+	MOVL	AX, ret+0(FP)
 	RET
diff --git a/src/runtime/sys_netbsd_arm.s b/src/runtime/sys_netbsd_arm.s
index 62fa852..960c419 100644
--- a/src/runtime/sys_netbsd_arm.s
+++ b/src/runtime/sys_netbsd_arm.s
@@ -12,8 +12,6 @@
 
 #define CLOCK_REALTIME		0
 #define CLOCK_MONOTONIC		3
-#define FD_CLOEXEC		1
-#define F_SETFD			2
 
 #define SWI_OS_NETBSD			0xa00000
 #define SYS_exit			SWI_OS_NETBSD | 1
@@ -30,6 +28,7 @@
 #define SYS___sysctl			SWI_OS_NETBSD | 202
 #define SYS___sigaltstack14		SWI_OS_NETBSD | 281
 #define SYS___sigprocmask14		SWI_OS_NETBSD | 293
+#define SYS_issetugid			SWI_OS_NETBSD | 305
 #define SYS_getcontext			SWI_OS_NETBSD | 307
 #define SYS_setcontext			SWI_OS_NETBSD | 308
 #define SYS__lwp_create			SWI_OS_NETBSD | 309
@@ -398,12 +397,17 @@
 	MOVW	R0, ret+24(FP)
 	RET
 
-// void runtime·closeonexec(int32 fd)
-TEXT runtime·closeonexec(SB),NOSPLIT,$0
-	MOVW fd+0(FP), R0	// fd
-	MOVW $F_SETFD, R1	// F_SETFD
-	MOVW $FD_CLOEXEC, R2	// FD_CLOEXEC
+// func fcntl(fd, cmd, args int32) int32
+TEXT runtime·fcntl(SB),NOSPLIT,$0
+	MOVW fd+0(FP), R0
+	MOVW cmd+4(FP), R1
+	MOVW arg+8(FP), R2
 	SWI $SYS_fcntl
+	MOVW $0, R1
+	MOVW.CS R0, R1
+	MOVW.CS $-1, R0
+	MOVW R0, ret+12(FP)
+	MOVW R1, errno+16(FP)
 	RET
 
 // TODO: this is only valid for ARMv7+
@@ -415,3 +419,9 @@
 	SWI $SYS__lwp_getprivate
 	MOVM.IAW    (R13), [R1, R2, R3, R12]
 	RET
+
+// func issetugid() int32
+TEXT runtime·issetugid(SB),NOSPLIT,$0
+	SWI $SYS_issetugid
+	MOVW	R0, ret+0(FP)
+	RET
diff --git a/src/runtime/sys_netbsd_arm64.s b/src/runtime/sys_netbsd_arm64.s
index d57959f..23e7494 100644
--- a/src/runtime/sys_netbsd_arm64.s
+++ b/src/runtime/sys_netbsd_arm64.s
@@ -13,11 +13,6 @@
 
 #define CLOCK_REALTIME		0
 #define CLOCK_MONOTONIC		3
-#define FD_CLOEXEC		1
-#define F_SETFD			2
-#define F_GETFL			3
-#define F_SETFL			4
-#define O_NONBLOCK		4
 
 #define SYS_exit			1
 #define SYS_read			3
@@ -33,6 +28,7 @@
 #define SYS___sysctl			202
 #define SYS___sigaltstack14		281
 #define SYS___sigprocmask14		293
+#define SYS_issetugid			305
 #define SYS_getcontext			307
 #define SYS_setcontext			308
 #define SYS__lwp_create			309
@@ -317,14 +313,9 @@
 	BEQ	2(PC)
 	BL	runtime·load_g(SB)
 
-#ifdef GOEXPERIMENT_regabiargs
 	// Restore signum to R0.
 	MOVW	8(RSP), R0
 	// R1 and R2 already contain info and ctx, respectively.
-#else
-	MOVD	R1, 16(RSP)
-	MOVD	R2, 24(RSP)
-#endif
 	BL	runtime·sigtrampgo<ABIInternal>(SB)
 
 	// Restore callee-save registers.
@@ -421,10 +412,24 @@
 	MOVW	R0, ret+48(FP)
 	RET
 
-// void runtime·closeonexec(int32 fd)
-TEXT runtime·closeonexec(SB),NOSPLIT,$0
-	MOVW	fd+0(FP), R0		// arg 1 - fd
-	MOVW	$F_SETFD, R1
-	MOVW	$FD_CLOEXEC, R2
+// func fcntl(fd, cmd, arg int32) (int32, int32)
+TEXT runtime·fcntl(SB),NOSPLIT,$0
+	MOVW	fd+0(FP), R0	// fd
+	MOVW	cmd+4(FP), R1	// cmd
+	MOVW	arg+8(FP), R2	// arg
 	SVC	$SYS_fcntl
+	BCC	noerr
+	MOVW	$-1, R1
+	MOVW	R1, ret+16(FP)
+	MOVW	R0, errno+20(FP)
+	RET
+noerr:
+	MOVW	R0, ret+16(FP)
+	MOVW	$0, errno+20(FP)
+	RET
+
+// func issetugid() int32
+TEXT runtime·issetugid(SB),NOSPLIT|NOFRAME,$0
+	SVC $SYS_issetugid
+	MOVW	R0, ret+0(FP)
 	RET
diff --git a/src/runtime/sys_openbsd2.go b/src/runtime/sys_openbsd2.go
index 49bad8e..b38e49e 100644
--- a/src/runtime/sys_openbsd2.go
+++ b/src/runtime/sys_openbsd2.go
@@ -161,8 +161,13 @@
 
 //go:nosplit
 //go:cgo_unsafe_args
-func fcntl(fd, cmd, arg int32) int32 {
-	return libcCall(unsafe.Pointer(abi.FuncPCABI0(fcntl_trampoline)), unsafe.Pointer(&fd))
+func fcntl(fd, cmd, arg int32) (ret int32, errno int32) {
+	args := struct {
+		fd, cmd, arg int32
+		ret, errno   int32
+	}{fd, cmd, arg, 0, 0}
+	libcCall(unsafe.Pointer(abi.FuncPCABI0(fcntl_trampoline)), unsafe.Pointer(&args))
+	return args.ret, args.errno
 }
 func fcntl_trampoline()
 
@@ -254,9 +259,12 @@
 }
 
 //go:nosplit
-func closeonexec(fd int32) {
-	fcntl(fd, _F_SETFD, _FD_CLOEXEC)
+//go:cgo_unsafe_args
+func issetugid() (ret int32) {
+	libcCall(unsafe.Pointer(abi.FuncPCABI0(issetugid_trampoline)), unsafe.Pointer(&ret))
+	return
 }
+func issetugid_trampoline()
 
 // Tell the linker that the libc_* functions are to be found
 // in a system library, with the libc_ prefix missing.
@@ -290,4 +298,6 @@
 //go:cgo_import_dynamic libc_sigaction sigaction "libc.so"
 //go:cgo_import_dynamic libc_sigaltstack sigaltstack "libc.so"
 
+//go:cgo_import_dynamic libc_issetugid issetugid "libc.so"
+
 //go:cgo_import_dynamic _ _ "libc.so"
diff --git a/src/runtime/sys_openbsd_386.s b/src/runtime/sys_openbsd_386.s
index 963678a..6005c10 100644
--- a/src/runtime/sys_openbsd_386.s
+++ b/src/runtime/sys_openbsd_386.s
@@ -542,6 +542,16 @@
 	MOVL	CX, 8(SP)		// arg 3 - arg
 	MOVL	$0, 12(SP)		// vararg
 	CALL	libc_fcntl(SB)
+	MOVL	$0, BX
+	CMPL	AX, $-1
+	JNE	noerr
+	CALL	libc_errno(SB)
+	MOVL	(AX), BX
+	MOVL	$-1, AX
+noerr:
+	MOVL	24(SP), DX		// pointer to args
+	MOVL	AX, 12(DX)
+	MOVL	BX, 16(DX)
 	MOVL	BP, SP
 	POPL	BP
 	RET
@@ -969,3 +979,12 @@
 	MOVL	BP, SP
 	POPL	BP
 	RET
+
+TEXT runtime·issetugid_trampoline(SB),NOSPLIT,$0
+	PUSHL	BP
+	CALL	libc_issetugid(SB)
+	NOP	SP			// tell vet SP changed - stop checking offsets
+	MOVL	8(SP), DX		// pointer to return value
+	MOVL	AX, 0(DX)
+	POPL	BP
+	RET
diff --git a/src/runtime/sys_openbsd_amd64.s b/src/runtime/sys_openbsd_amd64.s
index 2c026c8..ff0bc24 100644
--- a/src/runtime/sys_openbsd_amd64.s
+++ b/src/runtime/sys_openbsd_amd64.s
@@ -49,16 +49,14 @@
 	MOVL	sig+8(FP),   DI
 	MOVQ	info+16(FP), SI
 	MOVQ	ctx+24(FP),  DX
-	PUSHQ	BP
-	MOVQ	SP, BP
-	ANDQ	$~15, SP     // alignment for x86_64 ABI
+	MOVQ	SP, BX		// callee-saved
+	ANDQ	$~15, SP	// alignment for x86_64 ABI
 	CALL	AX
-	MOVQ	BP, SP
-	POPQ	BP
+	MOVQ	BX, SP
 	RET
 
 // Called using C ABI.
-TEXT runtime·sigtramp(SB),NOSPLIT|TOPFRAME,$0
+TEXT runtime·sigtramp(SB),NOSPLIT|TOPFRAME|NOFRAME,$0
 	// Transition from C ABI to Go ABI.
 	PUSH_REGS_HOST_TO_ABI0()
 
@@ -89,122 +87,82 @@
 // A single int32 result is returned in AX.
 // (For more results, make an args/results structure.)
 TEXT runtime·pthread_attr_init_trampoline(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
 	MOVQ	0(DI), DI		// arg 1 - attr
 	CALL	libc_pthread_attr_init(SB)
-	POPQ	BP
 	RET
 
 TEXT runtime·pthread_attr_destroy_trampoline(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
 	MOVQ	0(DI), DI		// arg 1 - attr
 	CALL	libc_pthread_attr_destroy(SB)
-	POPQ	BP
 	RET
 
 TEXT runtime·pthread_attr_getstacksize_trampoline(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
 	MOVQ	8(DI), SI		// arg 2 - stacksize
 	MOVQ	0(DI), DI		// arg 1 - attr
 	CALL	libc_pthread_attr_getstacksize(SB)
-	POPQ	BP
 	RET
 
 TEXT runtime·pthread_attr_setdetachstate_trampoline(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
 	MOVQ	8(DI), SI		// arg 2 - detachstate
 	MOVQ	0(DI), DI		// arg 1 - attr
 	CALL	libc_pthread_attr_setdetachstate(SB)
-	POPQ	BP
 	RET
 
-TEXT runtime·pthread_create_trampoline(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
-	SUBQ	$16, SP
+TEXT runtime·pthread_create_trampoline(SB),NOSPLIT,$16
 	MOVQ	0(DI), SI		// arg 2 - attr
 	MOVQ	8(DI), DX		// arg 3 - start
 	MOVQ	16(DI), CX		// arg 4 - arg
 	MOVQ	SP, DI			// arg 1 - &thread (discarded)
 	CALL	libc_pthread_create(SB)
-	MOVQ	BP, SP
-	POPQ	BP
 	RET
 
 TEXT runtime·thrkill_trampoline(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
 	MOVL	8(DI), SI		// arg 2 - signal
 	MOVQ	$0, DX			// arg 3 - tcb
 	MOVL	0(DI), DI		// arg 1 - tid
 	CALL	libc_thrkill(SB)
-	POPQ	BP
 	RET
 
 TEXT runtime·thrsleep_trampoline(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
 	MOVL	8(DI), SI		// arg 2 - clock_id
 	MOVQ	16(DI), DX		// arg 3 - abstime
 	MOVQ	24(DI), CX		// arg 4 - lock
 	MOVQ	32(DI), R8		// arg 5 - abort
 	MOVQ	0(DI), DI		// arg 1 - id
 	CALL	libc_thrsleep(SB)
-	POPQ	BP
 	RET
 
 TEXT runtime·thrwakeup_trampoline(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
 	MOVL	8(DI), SI		// arg 2 - count
 	MOVQ	0(DI), DI		// arg 1 - id
 	CALL	libc_thrwakeup(SB)
-	POPQ	BP
 	RET
 
 TEXT runtime·exit_trampoline(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
 	MOVL	0(DI), DI		// arg 1 exit status
 	CALL	libc_exit(SB)
 	MOVL	$0xf1, 0xf1  // crash
-	POPQ	BP
 	RET
 
 TEXT runtime·getthrid_trampoline(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
 	MOVQ	DI, BX			// BX is caller-save
 	CALL	libc_getthrid(SB)
 	MOVL	AX, 0(BX)		// return value
-	POPQ	BP
 	RET
 
 TEXT runtime·raiseproc_trampoline(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
 	MOVL	0(DI), BX	// signal
 	CALL	libc_getpid(SB)
 	MOVL	AX, DI		// arg 1 pid
 	MOVL	BX, SI		// arg 2 signal
 	CALL	libc_kill(SB)
-	POPQ	BP
 	RET
 
 TEXT runtime·sched_yield_trampoline(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
 	CALL	libc_sched_yield(SB)
-	POPQ	BP
 	RET
 
 TEXT runtime·mmap_trampoline(SB),NOSPLIT,$0
-	PUSHQ	BP			// make a frame; keep stack aligned
-	MOVQ	SP, BP
 	MOVQ	DI, BX
 	MOVQ	0(BX), DI		// arg 1 addr
 	MOVQ	8(BX), SI		// arg 2 len
@@ -222,54 +180,39 @@
 ok:
 	MOVQ	AX, 32(BX)
 	MOVQ	DX, 40(BX)
-	POPQ	BP
 	RET
 
 TEXT runtime·munmap_trampoline(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
 	MOVQ	8(DI), SI		// arg 2 len
 	MOVQ	0(DI), DI		// arg 1 addr
 	CALL	libc_munmap(SB)
 	TESTQ	AX, AX
 	JEQ	2(PC)
 	MOVL	$0xf1, 0xf1  // crash
-	POPQ	BP
 	RET
 
 TEXT runtime·madvise_trampoline(SB), NOSPLIT, $0
-	PUSHQ	BP
-	MOVQ	SP, BP
 	MOVQ	8(DI), SI	// arg 2 len
 	MOVL	16(DI), DX	// arg 3 advice
 	MOVQ	0(DI), DI	// arg 1 addr
 	CALL	libc_madvise(SB)
 	// ignore failure - maybe pages are locked
-	POPQ	BP
 	RET
 
 TEXT runtime·open_trampoline(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
 	MOVL	8(DI), SI		// arg 2 - flags
 	MOVL	12(DI), DX		// arg 3 - mode
 	MOVQ	0(DI), DI		// arg 1 - path
 	XORL	AX, AX			// vararg: say "no float args"
 	CALL	libc_open(SB)
-	POPQ	BP
 	RET
 
 TEXT runtime·close_trampoline(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
 	MOVL	0(DI), DI		// arg 1 - fd
 	CALL	libc_close(SB)
-	POPQ	BP
 	RET
 
 TEXT runtime·read_trampoline(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
 	MOVQ	8(DI), SI		// arg 2 - buf
 	MOVL	16(DI), DX		// arg 3 - count
 	MOVL	0(DI), DI		// arg 1 - fd
@@ -280,12 +223,9 @@
 	MOVL	(AX), AX		// errno
 	NEGL	AX			// caller expects negative errno value
 noerr:
-	POPQ	BP
 	RET
 
 TEXT runtime·write_trampoline(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
 	MOVQ	8(DI), SI		// arg 2 buf
 	MOVL	16(DI), DX		// arg 3 count
 	MOVL	0(DI), DI		// arg 1 fd
@@ -296,12 +236,9 @@
 	MOVL	(AX), AX		// errno
 	NEGL	AX			// caller expects negative errno value
 noerr:
-	POPQ	BP
 	RET
 
 TEXT runtime·pipe2_trampoline(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
 	MOVL	8(DI), SI		// arg 2 flags
 	MOVQ	0(DI), DI		// arg 1 filedes
 	CALL	libc_pipe2(SB)
@@ -310,30 +247,21 @@
 	CALL	libc_errno(SB)
 	MOVL	(AX), AX		// errno
 	NEGL	AX			// caller expects negative errno value
-	POPQ	BP
 	RET
 
 TEXT runtime·setitimer_trampoline(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
 	MOVQ	8(DI), SI		// arg 2 new
 	MOVQ	16(DI), DX		// arg 3 old
 	MOVL	0(DI), DI		// arg 1 which
 	CALL	libc_setitimer(SB)
-	POPQ	BP
 	RET
 
 TEXT runtime·usleep_trampoline(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
 	MOVL	0(DI), DI		// arg 1 usec
 	CALL	libc_usleep(SB)
-	POPQ	BP
 	RET
 
 TEXT runtime·sysctl_trampoline(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
 	MOVL	8(DI), SI		// arg 2 miblen
 	MOVQ	16(DI), DX		// arg 3 out
 	MOVQ	24(DI), CX		// arg 4 size
@@ -341,19 +269,13 @@
 	MOVQ	40(DI), R9		// arg 6 ndst
 	MOVQ	0(DI), DI		// arg 1 mib
 	CALL	libc_sysctl(SB)
-	POPQ	BP
 	RET
 
 TEXT runtime·kqueue_trampoline(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
 	CALL	libc_kqueue(SB)
-	POPQ	BP
 	RET
 
 TEXT runtime·kevent_trampoline(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
 	MOVQ	8(DI), SI		// arg 2 keventt
 	MOVL	16(DI), DX		// arg 3 nch
 	MOVQ	24(DI), CX		// arg 4 ev
@@ -367,12 +289,9 @@
 	MOVL	(AX), AX		// errno
 	NEGL	AX			// caller expects negative errno value
 ok:
-	POPQ	BP
 	RET
 
 TEXT runtime·clock_gettime_trampoline(SB),NOSPLIT,$0
-	PUSHQ	BP			// make a frame; keep stack aligned
-	MOVQ	SP, BP
 	MOVQ	8(DI), SI		// arg 2 tp
 	MOVL	0(DI), DI		// arg 1 clock_id
 	CALL	libc_clock_gettime(SB)
@@ -382,23 +301,27 @@
 	MOVL	(AX), AX		// errno
 	NEGL	AX			// caller expects negative errno value
 noerr:
-	POPQ	BP
 	RET
 
 TEXT runtime·fcntl_trampoline(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
-	MOVL	4(DI), SI		// arg 2 cmd
-	MOVL	8(DI), DX		// arg 3 arg
-	MOVL	0(DI), DI		// arg 1 fd
+	MOVQ	DI, BX
+	MOVL	0(BX), DI		// arg 1 fd
+	MOVL	4(BX), SI		// arg 2 cmd
+	MOVL	8(BX), DX		// arg 3 arg
 	XORL	AX, AX			// vararg: say "no float args"
 	CALL	libc_fcntl(SB)
-	POPQ	BP
+	XORL	DX, DX
+	CMPL	AX, $-1
+	JNE	noerr
+	CALL	libc_errno(SB)
+	MOVL	(AX), DX
+	MOVL	$-1, AX
+noerr:
+	MOVL	AX, 12(BX)
+	MOVL	DX, 16(BX)
 	RET
 
 TEXT runtime·sigaction_trampoline(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
 	MOVQ	8(DI), SI		// arg 2 new
 	MOVQ	16(DI), DX		// arg 3 old
 	MOVL	0(DI), DI		// arg 1 sig
@@ -406,12 +329,9 @@
 	TESTL	AX, AX
 	JEQ	2(PC)
 	MOVL	$0xf1, 0xf1  // crash
-	POPQ	BP
 	RET
 
 TEXT runtime·sigprocmask_trampoline(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
 	MOVQ	8(DI), SI	// arg 2 new
 	MOVQ	16(DI), DX	// arg 3 old
 	MOVL	0(DI), DI	// arg 1 how
@@ -419,19 +339,15 @@
 	TESTL	AX, AX
 	JEQ	2(PC)
 	MOVL	$0xf1, 0xf1  // crash
-	POPQ	BP
 	RET
 
 TEXT runtime·sigaltstack_trampoline(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
 	MOVQ	8(DI), SI		// arg 2 old
 	MOVQ	0(DI), DI		// arg 1 new
 	CALL	libc_sigaltstack(SB)
 	TESTQ	AX, AX
 	JEQ	2(PC)
 	MOVL	$0xf1, 0xf1  // crash
-	POPQ	BP
 	RET
 
 // syscall calls a function in libc on behalf of the syscall package.
@@ -450,10 +366,7 @@
 //
 // syscall expects a 32-bit result and tests for 32-bit -1
 // to decide there was an error.
-TEXT runtime·syscall(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
-	SUBQ	$16, SP
+TEXT runtime·syscall(SB),NOSPLIT,$16
 	MOVQ	(0*8)(DI), CX // fn
 	MOVQ	(2*8)(DI), SI // a2
 	MOVQ	(3*8)(DI), DX // a3
@@ -480,8 +393,6 @@
 
 ok:
 	XORL	AX, AX        // no error (it's ignored anyway)
-	MOVQ	BP, SP
-	POPQ	BP
 	RET
 
 // syscallX calls a function in libc on behalf of the syscall package.
@@ -500,10 +411,7 @@
 //
 // syscallX is like syscall but expects a 64-bit result
 // and tests for 64-bit -1 to decide there was an error.
-TEXT runtime·syscallX(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
-	SUBQ	$16, SP
+TEXT runtime·syscallX(SB),NOSPLIT,$16
 	MOVQ	(0*8)(DI), CX // fn
 	MOVQ	(2*8)(DI), SI // a2
 	MOVQ	(3*8)(DI), DX // a3
@@ -530,8 +438,6 @@
 
 ok:
 	XORL	AX, AX        // no error (it's ignored anyway)
-	MOVQ	BP, SP
-	POPQ	BP
 	RET
 
 // syscall6 calls a function in libc on behalf of the syscall package.
@@ -553,10 +459,7 @@
 //
 // syscall6 expects a 32-bit result and tests for 32-bit -1
 // to decide there was an error.
-TEXT runtime·syscall6(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
-	SUBQ	$16, SP
+TEXT runtime·syscall6(SB),NOSPLIT,$16
 	MOVQ	(0*8)(DI), R11// fn
 	MOVQ	(2*8)(DI), SI // a2
 	MOVQ	(3*8)(DI), DX // a3
@@ -583,8 +486,6 @@
 
 ok:
 	XORL	AX, AX        // no error (it's ignored anyway)
-	MOVQ	BP, SP
-	POPQ	BP
 	RET
 
 // syscall6X calls a function in libc on behalf of the syscall package.
@@ -606,10 +507,7 @@
 //
 // syscall6X is like syscall6 but expects a 64-bit result
 // and tests for 64-bit -1 to decide there was an error.
-TEXT runtime·syscall6X(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
-	SUBQ	$16, SP
+TEXT runtime·syscall6X(SB),NOSPLIT,$16
 	MOVQ	(0*8)(DI), R11// fn
 	MOVQ	(2*8)(DI), SI // a2
 	MOVQ	(3*8)(DI), DX // a3
@@ -636,8 +534,6 @@
 
 ok:
 	XORL	AX, AX        // no error (it's ignored anyway)
-	MOVQ	BP, SP
-	POPQ	BP
 	RET
 
 // syscall10 calls a function in libc on behalf of the syscall package.
@@ -660,11 +556,7 @@
 // }
 // syscall10 must be called on the g0 stack with the
 // C calling convention (use libcCall).
-TEXT runtime·syscall10(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
-	SUBQ    $48, SP
-
+TEXT runtime·syscall10(SB),NOSPLIT,$48
 	// Arguments a1 to a6 get passed in registers, with a7 onwards being
 	// passed via the stack per the x86-64 System V ABI
 	// (https://github.com/hjl-tools/x86-psABI/wiki/x86-64-psABI-1.0.pdf).
@@ -702,8 +594,6 @@
 
 ok:
 	XORL	AX, AX        // no error (it's ignored anyway)
-	MOVQ	BP, SP
-	POPQ	BP
 	RET
 
 // syscall10X calls a function in libc on behalf of the syscall package.
@@ -729,11 +619,7 @@
 //
 // syscall10X is like syscall10 but expects a 64-bit result
 // and tests for 64-bit -1 to decide there was an error.
-TEXT runtime·syscall10X(SB),NOSPLIT,$0
-	PUSHQ	BP
-	MOVQ	SP, BP
-	SUBQ    $48, SP
-
+TEXT runtime·syscall10X(SB),NOSPLIT,$48
 	// Arguments a1 to a6 get passed in registers, with a7 onwards being
 	// passed via the stack per the x86-64 System V ABI
 	// (https://github.com/hjl-tools/x86-psABI/wiki/x86-64-psABI-1.0.pdf).
@@ -771,6 +657,10 @@
 
 ok:
 	XORL	AX, AX        // no error (it's ignored anyway)
-	MOVQ	BP, SP
-	POPQ	BP
+	RET
+
+TEXT runtime·issetugid_trampoline(SB),NOSPLIT,$0
+	MOVQ	DI, BX			// BX is caller-save
+	CALL	libc_issetugid(SB)
+	MOVL	AX, 0(BX)		// return value
 	RET
diff --git a/src/runtime/sys_openbsd_arm.s b/src/runtime/sys_openbsd_arm.s
index e03cfb5..61b901b 100644
--- a/src/runtime/sys_openbsd_arm.s
+++ b/src/runtime/sys_openbsd_arm.s
@@ -419,11 +419,21 @@
 	MOVW	R13, R9
 	SUB	$8, R13
 	BIC     $0x7, R13		// align for ELF ABI
-	MOVW	4(R0), R1		// arg 2 cmd
-	MOVW	8(R0), R2		// arg 3 arg (vararg, on stack)
+	MOVW	R0, R8
+	MOVW	0(R8), R0		// arg 1 fd
+	MOVW	4(R8), R1		// arg 2 cmd
+	MOVW	8(R8), R2		// arg 3 arg (vararg, on stack)
 	MOVW	R2, 0(R13)
-	MOVW	0(R0), R0		// arg 1 fd
 	BL	libc_fcntl(SB)
+	MOVW	$0, R1
+	CMP	$-1, R0
+	BNE	noerr
+	BL	libc_errno(SB)
+	MOVW	(R0), R1
+	MOVW	$-1, R0
+noerr:
+	MOVW	R0, 12(R8)
+	MOVW	R1, 16(R8)
 	MOVW	R9, R13
 	RET
 
@@ -806,3 +816,12 @@
 	MOVW	$0, R0		// no error (it's ignored anyway)
 	MOVW	R9, R13
 	RET
+
+TEXT runtime·issetugid_trampoline(SB),NOSPLIT,$0
+	MOVW	R13, R9
+	MOVW	R0, R8
+	BIC     $0x7, R13		// align for ELF ABI
+	BL	libc_issetugid(SB)
+	MOVW	R0, 0(R8)
+	MOVW	R9, R13
+	RET
diff --git a/src/runtime/sys_openbsd_arm64.s b/src/runtime/sys_openbsd_arm64.s
index db92326..6667dad 100644
--- a/src/runtime/sys_openbsd_arm64.s
+++ b/src/runtime/sys_openbsd_arm64.s
@@ -62,14 +62,9 @@
 	MOVW	R0, 8(RSP)		// signum
 	BL	runtime·load_g(SB)
 
-#ifdef GOEXPERIMENT_regabiargs
 	// Restore signum to R0.
 	MOVW	8(RSP), R0
 	// R1 and R2 already contain info and ctx, respectively.
-#else
-	MOVD	R1, 16(RSP)
-	MOVD	R2, 24(RSP)
-#endif
 	BL	runtime·sigtrampgo<ABIInternal>(SB)
 
 	// Restore callee-save registers.
@@ -306,11 +301,21 @@
 	RET
 
 TEXT runtime·fcntl_trampoline(SB),NOSPLIT,$0
-	MOVW	4(R0), R1		// arg 2 - cmd
-	MOVW	8(R0), R2		// arg 3 - arg
-	MOVW	0(R0), R0		// arg 1 - fd
+	MOVD	R0, R19
+	MOVW	0(R19), R0		// arg 1 - fd
+	MOVW	4(R19), R1		// arg 2 - cmd
+	MOVW	8(R19), R2		// arg 3 - arg
 	MOVD	$0, R3			// vararg
 	CALL	libc_fcntl(SB)
+	MOVD	$0, R1
+	CMP	$-1, R0
+	BNE	noerr
+	CALL	libc_errno(SB)
+	MOVW	(R0), R1
+	MOVW	$-1, R0
+noerr:
+	MOVW	R0, 12(R19)
+	MOVW	R1, 16(R19)
 	RET
 
 TEXT runtime·sigaction_trampoline(SB),NOSPLIT,$0
@@ -639,3 +644,9 @@
 
 ok:
 	RET
+
+TEXT runtime·issetugid_trampoline(SB),NOSPLIT,$0
+	MOVD	R0, R19			// pointer to args
+	CALL	libc_issetugid(SB)
+	MOVW	R0, 0(R19)		// return value
+	RET
diff --git a/src/runtime/sys_openbsd_mips64.s b/src/runtime/sys_openbsd_mips64.s
index affd586..7ac0db0 100644
--- a/src/runtime/sys_openbsd_mips64.s
+++ b/src/runtime/sys_openbsd_mips64.s
@@ -364,11 +364,25 @@
 	MOVW	R2, ret+48(FP)
 	RET
 
-// func closeonexec(fd int32)
-TEXT runtime·closeonexec(SB),NOSPLIT,$0
-	MOVW	fd+0(FP), R4		// arg 1 - fd
-	MOVV	$2, R5			// arg 2 - cmd (F_SETFD)
-	MOVV	$1, R6			// arg 3 - arg (FD_CLOEXEC)
-	MOVV	$92, R2			// sys_fcntl
+// func fcntl(fd, cmd, arg int32) (int32, int32)
+TEXT runtime·fcntl(SB),NOSPLIT,$0
+	MOVW	fd+0(FP), R4	// fd
+	MOVW	cmd+4(FP), R5	// cmd
+	MOVW	arg+8(FP), R6	// arg
+	MOVV	$92, R2		// sys_fcntl
 	SYSCALL
+	MOVV	$0, R4
+	BEQ	R7, noerr
+	MOVV	R2, R4
+	MOVW	$-1, R2
+noerr:
+	MOVW	R2, ret+16(FP)
+	MOVW	R4, errno+20(FP)
+	RET
+
+// func issetugid() int32
+TEXT runtime·issetugid(SB),NOSPLIT,$0
+	MOVV	$253, R2	// sys_issetugid
+	SYSCALL
+	MOVW	R2, ret+0(FP)
 	RET
diff --git a/src/runtime/sys_plan9_amd64.s b/src/runtime/sys_plan9_amd64.s
index 638300d..a53f920 100644
--- a/src/runtime/sys_plan9_amd64.s
+++ b/src/runtime/sys_plan9_amd64.s
@@ -166,7 +166,7 @@
 	RET
 
 // void sigtramp(void *ureg, int8 *note)
-TEXT runtime·sigtramp(SB),NOSPLIT,$0
+TEXT runtime·sigtramp(SB),NOSPLIT|NOFRAME,$0
 	get_tls(AX)
 
 	// check that g exists
diff --git a/src/runtime/sys_solaris_amd64.s b/src/runtime/sys_solaris_amd64.s
index 7376e06..7a80020 100644
--- a/src/runtime/sys_solaris_amd64.s
+++ b/src/runtime/sys_solaris_amd64.s
@@ -105,7 +105,7 @@
 	MOVQ	AX, (g_stack+stack_hi)(DX)
 	SUBQ	$(0x100000), AX		// stack size
 	MOVQ	AX, (g_stack+stack_lo)(DX)
-	ADDQ	$const__StackGuard, AX
+	ADDQ	$const_stackGuard, AX
 	MOVQ	AX, g_stackguard0(DX)
 	MOVQ	AX, g_stackguard1(DX)
 
@@ -121,29 +121,28 @@
 
 // Careful, this is called by __sighndlr, a libc function. We must preserve
 // registers as per AMD 64 ABI.
-TEXT runtime·sigtramp(SB),NOSPLIT|TOPFRAME,$0
+TEXT runtime·sigtramp(SB),NOSPLIT|TOPFRAME|NOFRAME,$0
 	// Note that we are executing on altsigstack here, so we have
 	// more stack available than NOSPLIT would have us believe.
 	// To defeat the linker, we make our own stack frame with
 	// more space:
-	SUBQ    $184, SP
-
+	SUBQ    $168, SP
 	// save registers
-	MOVQ    BX, 32(SP)
-	MOVQ    BP, 40(SP)
-	MOVQ	R12, 48(SP)
-	MOVQ	R13, 56(SP)
-	MOVQ	R14, 64(SP)
-	MOVQ	R15, 72(SP)
+	MOVQ    BX, 24(SP)
+	MOVQ    BP, 32(SP)
+	MOVQ	R12, 40(SP)
+	MOVQ	R13, 48(SP)
+	MOVQ	R14, 56(SP)
+	MOVQ	R15, 64(SP)
 
 	get_tls(BX)
 	// check that g exists
 	MOVQ	g(BX), R10
 	CMPQ	R10, $0
 	JNE	allgood
-	MOVQ	SI, 80(SP)
-	MOVQ	DX, 88(SP)
-	LEAQ	80(SP), AX
+	MOVQ	SI, 72(SP)
+	MOVQ	DX, 80(SP)
+	LEAQ	72(SP), AX
 	MOVQ	DI, 0(SP)
 	MOVQ	AX, 8(SP)
 	MOVQ	$runtime·badsignal(SB), AX
@@ -158,35 +157,35 @@
 	MOVQ	g_m(R10), BP
 	LEAQ	m_libcall(BP), R11
 	MOVQ	libcall_fn(R11), R10
-	MOVQ	R10, 88(SP)
+	MOVQ	R10, 72(SP)
 	MOVQ	libcall_args(R11), R10
-	MOVQ	R10, 96(SP)
+	MOVQ	R10, 80(SP)
 	MOVQ	libcall_n(R11), R10
-	MOVQ	R10, 104(SP)
+	MOVQ	R10, 88(SP)
 	MOVQ    libcall_r1(R11), R10
-	MOVQ    R10, 168(SP)
+	MOVQ    R10, 152(SP)
 	MOVQ    libcall_r2(R11), R10
-	MOVQ    R10, 176(SP)
+	MOVQ    R10, 160(SP)
 
 	// save m->scratch
 	LEAQ	(m_mOS+mOS_scratch)(BP), R11
 	MOVQ	0(R11), R10
-	MOVQ	R10, 112(SP)
+	MOVQ	R10, 96(SP)
 	MOVQ	8(R11), R10
-	MOVQ	R10, 120(SP)
+	MOVQ	R10, 104(SP)
 	MOVQ	16(R11), R10
-	MOVQ	R10, 128(SP)
+	MOVQ	R10, 112(SP)
 	MOVQ	24(R11), R10
-	MOVQ	R10, 136(SP)
+	MOVQ	R10, 120(SP)
 	MOVQ	32(R11), R10
-	MOVQ	R10, 144(SP)
+	MOVQ	R10, 128(SP)
 	MOVQ	40(R11), R10
-	MOVQ	R10, 152(SP)
+	MOVQ	R10, 136(SP)
 
 	// save errno, it might be EINTR; stuff we do here might reset it.
 	MOVQ	(m_mOS+mOS_perrno)(BP), R10
 	MOVL	0(R10), R10
-	MOVQ	R10, 160(SP)
+	MOVQ	R10, 144(SP)
 
 	// prepare call
 	MOVQ	DI, 0(SP)
@@ -199,47 +198,46 @@
 	MOVQ	g_m(BP), BP
 	// restore libcall
 	LEAQ	m_libcall(BP), R11
-	MOVQ	88(SP), R10
+	MOVQ	72(SP), R10
 	MOVQ	R10, libcall_fn(R11)
-	MOVQ	96(SP), R10
+	MOVQ	80(SP), R10
 	MOVQ	R10, libcall_args(R11)
-	MOVQ	104(SP), R10
+	MOVQ	88(SP), R10
 	MOVQ	R10, libcall_n(R11)
-	MOVQ    168(SP), R10
+	MOVQ    152(SP), R10
 	MOVQ    R10, libcall_r1(R11)
-	MOVQ    176(SP), R10
+	MOVQ    160(SP), R10
 	MOVQ    R10, libcall_r2(R11)
 
 	// restore scratch
 	LEAQ	(m_mOS+mOS_scratch)(BP), R11
-	MOVQ	112(SP), R10
+	MOVQ	96(SP), R10
 	MOVQ	R10, 0(R11)
-	MOVQ	120(SP), R10
+	MOVQ	104(SP), R10
 	MOVQ	R10, 8(R11)
-	MOVQ	128(SP), R10
+	MOVQ	112(SP), R10
 	MOVQ	R10, 16(R11)
-	MOVQ	136(SP), R10
+	MOVQ	120(SP), R10
 	MOVQ	R10, 24(R11)
-	MOVQ	144(SP), R10
+	MOVQ	128(SP), R10
 	MOVQ	R10, 32(R11)
-	MOVQ	152(SP), R10
+	MOVQ	136(SP), R10
 	MOVQ	R10, 40(R11)
 
 	// restore errno
 	MOVQ	(m_mOS+mOS_perrno)(BP), R11
-	MOVQ	160(SP), R10
+	MOVQ	144(SP), R10
 	MOVL	R10, 0(R11)
 
 exit:
 	// restore registers
-	MOVQ	32(SP), BX
-	MOVQ	40(SP), BP
-	MOVQ	48(SP), R12
-	MOVQ	56(SP), R13
-	MOVQ	64(SP), R14
-	MOVQ	72(SP), R15
-
-	ADDQ    $184, SP
+	MOVQ	24(SP), BX
+	MOVQ	32(SP), BP
+	MOVQ	40(SP), R12
+	MOVQ	48(SP), R13
+	MOVQ	56(SP), R14
+	MOVQ	64(SP), R15
+	ADDQ    $168, SP
 	RET
 
 TEXT runtime·sigfwd(SB),NOSPLIT,$0-32
@@ -247,12 +245,10 @@
 	MOVL	sig+8(FP),   DI
 	MOVQ	info+16(FP), SI
 	MOVQ	ctx+24(FP),  DX
-	PUSHQ	BP
-	MOVQ	SP, BP
-	ANDQ	$~15, SP     // alignment for x86_64 ABI
+	MOVQ	SP, BX		// callee-saved
+	ANDQ	$~15, SP	// alignment for x86_64 ABI
 	CALL	AX
-	MOVQ	BP, SP
-	POPQ	BP
+	MOVQ	BX, SP
 	RET
 
 // Called from runtime·usleep (Go). Can be called on Go stack, on OS stack,
diff --git a/src/runtime/sys_wasm.go b/src/runtime/sys_wasm.go
index bf57569..27f9432 100644
--- a/src/runtime/sys_wasm.go
+++ b/src/runtime/sys_wasm.go
@@ -21,6 +21,7 @@
 func wasmTruncS()
 func wasmTruncU()
 
+//go:wasmimport gojs runtime.wasmExit
 func wasmExit(code int32)
 
 // adjust Gobuf as it if executed a call to fn with context ctxt
diff --git a/src/runtime/sys_wasm.s b/src/runtime/sys_wasm.s
index f706e00..1e73ada 100644
--- a/src/runtime/sys_wasm.s
+++ b/src/runtime/sys_wasm.s
@@ -86,50 +86,9 @@
 TEXT runtime·osyield(SB), NOSPLIT, $0-0
 	UNDEF
 
-TEXT runtime·usleep(SB), NOSPLIT, $0-0
-	RET // TODO(neelance): implement usleep
-
-TEXT runtime·currentMemory(SB), NOSPLIT, $0
-	Get SP
-	CurrentMemory
-	I32Store ret+0(FP)
-	RET
-
 TEXT runtime·growMemory(SB), NOSPLIT, $0
 	Get SP
 	I32Load pages+0(FP)
 	GrowMemory
 	I32Store ret+8(FP)
 	RET
-
-TEXT ·resetMemoryDataView(SB), NOSPLIT, $0
-	CallImport
-	RET
-
-TEXT ·wasmExit(SB), NOSPLIT, $0
-	CallImport
-	RET
-
-TEXT ·wasmWrite(SB), NOSPLIT, $0
-	CallImport
-	RET
-
-TEXT ·nanotime1(SB), NOSPLIT, $0
-	CallImport
-	RET
-
-TEXT ·walltime(SB), NOSPLIT, $0
-	CallImport
-	RET
-
-TEXT ·scheduleTimeoutEvent(SB), NOSPLIT, $0
-	CallImport
-	RET
-
-TEXT ·clearTimeoutEvent(SB), NOSPLIT, $0
-	CallImport
-	RET
-
-TEXT ·getRandomData(SB), NOSPLIT, $0
-	CallImport
-	RET
diff --git a/src/runtime/sys_windows_386.s b/src/runtime/sys_windows_386.s
index cf3a439..41a6ee6 100644
--- a/src/runtime/sys_windows_386.s
+++ b/src/runtime/sys_windows_386.s
@@ -7,6 +7,10 @@
 #include "textflag.h"
 #include "time_windows.h"
 
+// Offsets into Thread Environment Block (pointer in FS)
+#define TEB_TlsSlots 0xE10
+#define TEB_ArbitraryPtr 0x14
+
 // void runtime·asmstdcall(void *c);
 TEXT runtime·asmstdcall(SB),NOSPLIT,$0
 	MOVL	fn+0(FP), BX
@@ -41,41 +45,26 @@
 
 	RET
 
-TEXT	runtime·badsignal2(SB),NOSPLIT,$24
-	// stderr
-	MOVL	$-12, 0(SP)
-	MOVL	SP, BP
-	CALL	*runtime·_GetStdHandle(SB)
-	MOVL	BP, SP
-
-	MOVL	AX, 0(SP)	// handle
-	MOVL	$runtime·badsignalmsg(SB), DX // pointer
-	MOVL	DX, 4(SP)
-	MOVL	runtime·badsignallen(SB), DX // count
-	MOVL	DX, 8(SP)
-	LEAL	20(SP), DX  // written count
-	MOVL	$0, 0(DX)
-	MOVL	DX, 12(SP)
-	MOVL	$0, 16(SP) // overlapped
-	CALL	*runtime·_WriteFile(SB)
-
-	// Does not return.
-	CALL	runtime·abort(SB)
-	RET
-
 // faster get/set last error
 TEXT runtime·getlasterror(SB),NOSPLIT,$0
 	MOVL	0x34(FS), AX
 	MOVL	AX, ret+0(FP)
 	RET
 
+TEXT runtime·sigFetchGSafe<ABIInternal>(SB),NOSPLIT,$0
+	get_tls(AX)
+	CMPL	AX, $0
+	JE	2(PC)
+	MOVL	g(AX), AX
+	MOVL	AX, ret+0(FP)
+	RET
+
 // Called by Windows as a Vectored Exception Handler (VEH).
-// First argument is pointer to struct containing
+// AX is pointer to struct containing
 // exception record and context pointers.
-// Handler function is stored in AX.
-// Return 0 for 'not handled', -1 for handled.
+// CX is the kind of sigtramp function.
+// Return value of sigtrampgo is stored in AX.
 TEXT sigtramp<>(SB),NOSPLIT,$0-0
-	MOVL	ptrs+0(FP), CX
 	SUBL	$40, SP
 
 	// save callee-saved registers
@@ -84,58 +73,11 @@
 	MOVL	SI, 20(SP)
 	MOVL	DI, 24(SP)
 
-	MOVL	AX, SI	// save handler address
-
-	// find g
-	get_tls(DX)
-	CMPL	DX, $0
-	JNE	3(PC)
-	MOVL	$0, AX // continue
-	JMP	done
-	MOVL	g(DX), DX
-	CMPL	DX, $0
-	JNE	2(PC)
-	CALL	runtime·badsignal2(SB)
-
-	// save g in case of stack switch
-	MOVL	DX, 32(SP)	// g
-	MOVL	SP, 36(SP)
-
-	// do we need to switch to the g0 stack?
-	MOVL	g_m(DX), BX
-	MOVL	m_g0(BX), BX
-	CMPL	DX, BX
-	JEQ	g0
-
-	// switch to the g0 stack
-	get_tls(BP)
-	MOVL	BX, g(BP)
-	MOVL	(g_sched+gobuf_sp)(BX), DI
-	// make room for sighandler arguments
-	// and re-save old SP for restoring later.
-	// (note that the 36(DI) here must match the 36(SP) above.)
-	SUBL	$40, DI
-	MOVL	SP, 36(DI)
-	MOVL	DI, SP
-
-g0:
-	MOVL	0(CX), BX // ExceptionRecord*
-	MOVL	4(CX), CX // Context*
-	MOVL	BX, 0(SP)
+	MOVL	AX, 0(SP)
 	MOVL	CX, 4(SP)
-	MOVL	DX, 8(SP)
-	CALL	SI	// call handler
-	// AX is set to report result back to Windows
-	MOVL	12(SP), AX
+	CALL	runtime·sigtrampgo(SB)
+	MOVL	8(SP), AX
 
-	// switch back to original stack and g
-	// no-op if we never left.
-	MOVL	36(SP), SP
-	MOVL	32(SP), DX	// note: different SP
-	get_tls(BP)
-	MOVL	DX, g(BP)
-
-done:
 	// restore callee-saved registers
 	MOVL	24(SP), DI
 	MOVL	20(SP), SI
@@ -147,8 +89,18 @@
 	BYTE $0xC2; WORD $4
 	RET // unreached; make assembler happy
 
+// Trampoline to resume execution from exception handler.
+// This is part of the control flow guard workaround.
+// It switches stacks and jumps to the continuation address.
+// DX and CX are set above at the end of sigtrampgo
+// in the context that starts executing at sigresume.
+TEXT runtime·sigresume(SB),NOSPLIT,$0
+	MOVL	DX, SP
+	JMP	CX
+
 TEXT runtime·exceptiontramp(SB),NOSPLIT,$0
-	MOVL	$runtime·exceptionhandler(SB), AX
+	MOVL	argframe+0(FP), AX
+	MOVL	$const_callbackVEH, CX
 	JMP	sigtramp<>(SB)
 
 TEXT runtime·firstcontinuetramp(SB),NOSPLIT,$0-0
@@ -156,13 +108,12 @@
 	INT	$3
 
 TEXT runtime·lastcontinuetramp(SB),NOSPLIT,$0-0
-	MOVL	$runtime·lastcontinuehandler(SB), AX
+	MOVL	argframe+0(FP), AX
+	MOVL	$const_callbackLastVCH, CX
 	JMP	sigtramp<>(SB)
 
-GLOBL runtime·cbctxts(SB), NOPTR, $4
-
 TEXT runtime·callbackasm1(SB),NOSPLIT,$0
-  	MOVL	0(SP), AX	// will use to find our callback context
+	MOVL	0(SP), AX	// will use to find our callback context
 
 	// remove return address from stack, we are not returning to callbackasm, but to its caller.
 	ADDL	$4, SP
@@ -222,7 +173,7 @@
 	RET
 
 // void tstart(M *newm);
-TEXT tstart<>(SB),NOSPLIT,$0
+TEXT tstart<>(SB),NOSPLIT,$8-4
 	MOVL	newm+0(FP), CX		// m
 	MOVL	m_g0(CX), DX		// g
 
@@ -231,15 +182,16 @@
 	MOVL	AX, (g_stack+stack_hi)(DX)
 	SUBL	$(64*1024), AX		// initial stack size (adjusted later)
 	MOVL	AX, (g_stack+stack_lo)(DX)
-	ADDL	$const__StackGuard, AX
+	ADDL	$const_stackGuard, AX
 	MOVL	AX, g_stackguard0(DX)
 	MOVL	AX, g_stackguard1(DX)
 
 	// Set up tls.
-	LEAL	m_tls(CX), SI
-	MOVL	SI, 0x14(FS)
+	LEAL	m_tls(CX), DI
 	MOVL	CX, g_m(DX)
-	MOVL	DX, g(SI)
+	MOVL	DX, g(DI)
+	MOVL	DI, 4(SP)
+	CALL	runtime·setldt(SB) // clobbers CX and DX
 
 	// Someday the convention will be D is always cleared.
 	CLD
@@ -266,10 +218,11 @@
 
 	RET
 
-// setldt(int entry, int address, int limit)
-TEXT runtime·setldt(SB),NOSPLIT,$0
-	MOVL	base+4(FP), CX
-	MOVL	CX, 0x14(FS)
+// setldt(int slot, int base, int size)
+TEXT runtime·setldt(SB),NOSPLIT,$0-12
+	MOVL	base+4(FP), DX
+	MOVL	runtime·tls_g(SB), CX
+	MOVL	DX, 0(CX)(FS)
 	RET
 
 // Runs on OS stack.
@@ -290,43 +243,6 @@
 	RET
 
 // Runs on OS stack.
-// duration (in -100ns units) is in dt+0(FP).
-// g is valid.
-TEXT runtime·usleep2HighRes(SB),NOSPLIT,$36-4
-	MOVL	dt+0(FP), BX
-	MOVL	$-1, hi-4(SP)
-	MOVL	BX, lo-8(SP)
-
-	get_tls(CX)
-	MOVL	g(CX), CX
-	MOVL	g_m(CX), CX
-	MOVL	(m_mOS+mOS_highResTimer)(CX), CX
-	MOVL	CX, saved_timer-12(SP)
-
-	MOVL	$0, fResume-16(SP)
-	MOVL	$0, lpArgToCompletionRoutine-20(SP)
-	MOVL	$0, pfnCompletionRoutine-24(SP)
-	MOVL	$0, lPeriod-28(SP)
-	LEAL	lo-8(SP), BX
-	MOVL	BX, lpDueTime-32(SP)
-	MOVL	CX, hTimer-36(SP)
-	MOVL	SP, BP
-	MOVL	runtime·_SetWaitableTimer(SB), AX
-	CALL	AX
-	MOVL	BP, SP
-
-	MOVL	$0, ptime-28(SP)
-	MOVL	$0, alertable-32(SP)
-	MOVL	saved_timer-12(SP), CX
-	MOVL	CX, handle-36(SP)
-	MOVL	SP, BP
-	MOVL	runtime·_NtWaitForSingleObject(SB), AX
-	CALL	AX
-	MOVL	BP, SP
-
-	RET
-
-// Runs on OS stack.
 TEXT runtime·switchtothread(SB),NOSPLIT,$0
 	MOVL	SP, BP
 	MOVL	runtime·_SwitchToThread(SB), AX
@@ -356,3 +272,32 @@
 useQPC:
 	JMP	runtime·nanotimeQPC(SB)
 	RET
+
+// This is called from rt0_go, which runs on the system stack
+// using the initial stack allocated by the OS.
+TEXT runtime·wintls(SB),NOSPLIT,$0
+	// Allocate a TLS slot to hold g across calls to external code
+	MOVL	SP, BP
+	MOVL	runtime·_TlsAlloc(SB), AX
+	CALL	AX
+	MOVL	BP, SP
+
+	MOVL	AX, CX	// TLS index
+
+	// Assert that slot is less than 64 so we can use _TEB->TlsSlots
+	CMPL	CX, $64
+	JB	ok
+	// Fallback to the TEB arbitrary pointer.
+	// TODO: don't use the arbitrary pointer (see go.dev/issue/59824)
+	MOVL	$TEB_ArbitraryPtr, CX
+	JMP	settls
+ok:
+	// Convert the TLS index at CX into
+	// an offset from TEB_TlsSlots.
+	SHLL	$2, CX
+
+	// Save offset from TLS into tls_g.
+	ADDL	$TEB_TlsSlots, CX
+settls:
+	MOVL	CX, runtime·tls_g(SB)
+	RET
diff --git a/src/runtime/sys_windows_amd64.s b/src/runtime/sys_windows_amd64.s
index 777726f..e66f444 100644
--- a/src/runtime/sys_windows_amd64.s
+++ b/src/runtime/sys_windows_amd64.s
@@ -10,11 +10,15 @@
 
 // Offsets into Thread Environment Block (pointer in GS)
 #define TEB_TlsSlots 0x1480
+#define TEB_ArbitraryPtr 0x28
 
 // void runtime·asmstdcall(void *c);
-TEXT runtime·asmstdcall(SB),NOSPLIT|NOFRAME,$0
-	// asmcgocall will put first argument into CX.
-	PUSHQ	CX			// save for later
+TEXT runtime·asmstdcall(SB),NOSPLIT,$16
+	MOVQ	SP, AX
+	ANDQ	$~15, SP	// alignment as per Windows requirement
+	MOVQ	AX, 8(SP)
+	MOVQ	CX, 0(SP)	// asmcgocall will put first argument into CX.
+
 	MOVQ	libcall_fn(CX), AX
 	MOVQ	libcall_args(CX), SI
 	MOVQ	libcall_n(CX), CX
@@ -61,7 +65,8 @@
 	ADDQ	$(const_maxArgs*8), SP
 
 	// Return result.
-	POPQ	CX
+	MOVQ	0(SP), CX
+	MOVQ	8(SP), SP
 	MOVQ	AX, libcall_r1(CX)
 	// Floating point return values are returned in XMM0. Setting r2 to this
 	// value in case this call returned a floating point value. For details,
@@ -75,30 +80,6 @@
 
 	RET
 
-TEXT runtime·badsignal2(SB),NOSPLIT|NOFRAME,$48
-	// stderr
-	MOVQ	$-12, CX // stderr
-	MOVQ	CX, 0(SP)
-	MOVQ	runtime·_GetStdHandle(SB), AX
-	CALL	AX
-
-	MOVQ	AX, CX	// handle
-	MOVQ	CX, 0(SP)
-	MOVQ	$runtime·badsignalmsg(SB), DX // pointer
-	MOVQ	DX, 8(SP)
-	MOVL	$runtime·badsignallen(SB), R8 // count
-	MOVQ	R8, 16(SP)
-	LEAQ	40(SP), R9  // written count
-	MOVQ	$0, 0(R9)
-	MOVQ	R9, 24(SP)
-	MOVQ	$0, 32(SP)	// overlapped
-	MOVQ	runtime·_WriteFile(SB), AX
-	CALL	AX
-
-	// Does not return.
-	CALL	runtime·abort(SB)
-	RET
-
 // faster get/set last error
 TEXT runtime·getlasterror(SB),NOSPLIT,$0
 	MOVQ	0x30(GS), AX
@@ -107,152 +88,79 @@
 	RET
 
 // Called by Windows as a Vectored Exception Handler (VEH).
-// First argument is pointer to struct containing
+// CX is pointer to struct containing
 // exception record and context pointers.
-// Handler function is stored in AX.
-// Return 0 for 'not handled', -1 for handled.
+// DX is the kind of sigtramp function.
+// Return value of sigtrampgo is stored in AX.
 TEXT sigtramp<>(SB),NOSPLIT|NOFRAME,$0-0
-	// CX: PEXCEPTION_POINTERS ExceptionInfo
-
 	// Switch from the host ABI to the Go ABI.
 	PUSH_REGS_HOST_TO_ABI0()
-	// Make stack space for the rest of the function.
-	ADJSP	$48
 
-	MOVQ	CX, R13	// save exception address
-	MOVQ	AX, R15	// save handler address
+	// Set up ABIInternal environment: cleared X15 and R14.
+	// R14 is cleared in case there's a non-zero value in there
+	// if called from a non-go thread.
+	XORPS	X15, X15
+	XORQ	R14, R14
 
-	// find g
-	get_tls(DX)
-	CMPQ	DX, $0
-	JNE	3(PC)
-	MOVQ	$0, AX // continue
-	JMP	done
-	MOVQ	g(DX), DX
-	CMPQ	DX, $0
-	JNE	2(PC)
-	CALL	runtime·badsignal2(SB)
-
-	// save g and SP in case of stack switch
-	MOVQ	DX, 32(SP) // g
-	MOVQ	SP, 40(SP)
-
-	// do we need to switch to the g0 stack?
-	MOVQ	g_m(DX), BX
-	MOVQ	m_g0(BX), BX
-	CMPQ	DX, BX
-	JEQ	g0
-
-	// switch to g0 stack
-	get_tls(BP)
-	MOVQ	BX, g(BP)
-	MOVQ	(g_sched+gobuf_sp)(BX), DI
-	// make room for sighandler arguments
-	// and re-save old SP for restoring later.
-	// Adjust g0 stack by the space we're using and
-	// save SP at the same place on the g0 stack.
-	// The 40(DI) here must match the 40(SP) above.
-	SUBQ	$(REGS_HOST_TO_ABI0_STACK + 48), DI
-	MOVQ	SP, 40(DI)
-	MOVQ	DI, SP
-
-g0:
-	MOVQ	0(R13), BX // ExceptionRecord*
-	MOVQ	8(R13), CX // Context*
-	MOVQ	BX, 0(SP)
-	MOVQ	CX, 8(SP)
-	MOVQ	DX, 16(SP)
-	CALL	R15	// call handler
-	// AX is set to report result back to Windows
-	MOVL	24(SP), AX
-
-	MOVQ	SP, DI // save g0 SP
-
-	// switch back to original stack and g
-	// no-op if we never left.
-	MOVQ	40(SP), SP
-	MOVQ	32(SP), DX
-	get_tls(BP)
-	MOVQ	DX, g(BP)
-
-	// if return value is CONTINUE_SEARCH, do not set up control
-	// flow guard workaround.
+	get_tls(AX)
 	CMPQ	AX, $0
-	JEQ	done
+	JE	2(PC)
+	// Exception from Go thread, set R14.
+	MOVQ	g(AX), R14
 
-	// Check if we need to set up the control flow guard workaround.
-	// On Windows, the stack pointer in the context must lie within
-	// system stack limits when we resume from exception.
-	// Store the resume SP and PC in alternate registers
-	// and return to sigresume on the g0 stack.
-	// sigresume makes no use of the stack at all,
-	// loading SP from R8 and jumping to R9.
-	// Note that smashing R8 and R9 is only safe because we know sigpanic
-	// will not actually return to the original frame, so the registers
-	// are effectively dead. But this does mean we can't use the
-	// same mechanism for async preemption.
-	MOVQ	8(R13), CX
-	MOVQ	$sigresume<>(SB), BX
-	CMPQ	BX, context_rip(CX)
-	JEQ	done			// do not clobber saved SP/PC
+	// Reserve space for spill slots.
+	ADJSP	$16
+	MOVQ	CX, AX
+	MOVQ	DX, BX
+	// Calling ABIInternal because TLS might be nil.
+	CALL	runtime·sigtrampgo<ABIInternal>(SB)
+	// Return value is already stored in AX.
 
-	// Save resume SP and PC into R8, R9.
-	MOVQ	context_rsp(CX), BX
-	MOVQ	BX, context_r8(CX)
-	MOVQ	context_rip(CX), BX
-	MOVQ	BX, context_r9(CX)
+	ADJSP	$-16
 
-	// Set up context record to return to sigresume on g0 stack
-	MOVD	DI, BX
-	MOVD	BX, context_rsp(CX)
-	MOVD	$sigresume<>(SB), BX
-	MOVD	BX, context_rip(CX)
-
-done:
-	ADJSP	$-48
 	POP_REGS_HOST_TO_ABI0()
-
 	RET
 
 // Trampoline to resume execution from exception handler.
 // This is part of the control flow guard workaround.
 // It switches stacks and jumps to the continuation address.
-// R8 and R9 are set above at the end of sigtramp<>
-// in the context that starts executing at sigresume<>.
-TEXT sigresume<>(SB),NOSPLIT|NOFRAME,$0
+// R8 and R9 are set above at the end of sigtrampgo
+// in the context that starts executing at sigresume.
+TEXT runtime·sigresume(SB),NOSPLIT|NOFRAME,$0
 	MOVQ	R8, SP
 	JMP	R9
 
 TEXT runtime·exceptiontramp(SB),NOSPLIT|NOFRAME,$0
-	MOVQ	$runtime·exceptionhandler(SB), AX
+	// PExceptionPointers already on CX
+	MOVQ	$const_callbackVEH, DX
 	JMP	sigtramp<>(SB)
 
 TEXT runtime·firstcontinuetramp(SB),NOSPLIT|NOFRAME,$0-0
-	MOVQ	$runtime·firstcontinuehandler(SB), AX
+	// PExceptionPointers already on CX
+	MOVQ	$const_callbackFirstVCH, DX
 	JMP	sigtramp<>(SB)
 
 TEXT runtime·lastcontinuetramp(SB),NOSPLIT|NOFRAME,$0-0
-	MOVQ	$runtime·lastcontinuehandler(SB), AX
+	// PExceptionPointers already on CX
+	MOVQ	$const_callbackLastVCH, DX
 	JMP	sigtramp<>(SB)
 
-GLOBL runtime·cbctxts(SB), NOPTR, $8
-
-TEXT runtime·callbackasm1(SB),NOSPLIT,$0
+TEXT runtime·callbackasm1(SB),NOSPLIT|NOFRAME,$0
 	// Construct args vector for cgocallback().
 	// By windows/amd64 calling convention first 4 args are in CX, DX, R8, R9
 	// args from the 5th on are on the stack.
 	// In any case, even if function has 0,1,2,3,4 args, there is reserved
 	// but uninitialized "shadow space" for the first 4 args.
 	// The values are in registers.
-  	MOVQ	CX, (16+0)(SP)
-  	MOVQ	DX, (16+8)(SP)
-  	MOVQ	R8, (16+16)(SP)
-  	MOVQ	R9, (16+24)(SP)
+	MOVQ	CX, (16+0)(SP)
+	MOVQ	DX, (16+8)(SP)
+	MOVQ	R8, (16+16)(SP)
+	MOVQ	R9, (16+24)(SP)
 	// R8 = address of args vector
 	LEAQ	(16+0)(SP), R8
 
 	// remove return address from stack, we are not returning to callbackasm, but to its caller.
-  	MOVQ	0(SP), AX
+	MOVQ	0(SP), AX
 	ADDQ	$8, SP
 
 	// determine index into runtime·cbs table
@@ -289,7 +197,7 @@
 	RET
 
 // uint32 tstart_stdcall(M *newm);
-TEXT runtime·tstart_stdcall(SB),NOSPLIT,$0
+TEXT runtime·tstart_stdcall(SB),NOSPLIT|NOFRAME,$0
 	// Switch from the host ABI to the Go ABI.
 	PUSH_REGS_HOST_TO_ABI0()
 
@@ -301,7 +209,7 @@
 	MOVQ	AX, (g_stack+stack_hi)(DX)
 	SUBQ	$(64*1024), AX		// initial stack size (adjusted later)
 	MOVQ	AX, (g_stack+stack_lo)(DX)
-	ADDQ	$const__StackGuard, AX
+	ADDQ	$const_stackGuard, AX
 	MOVQ	AX, g_stackguard0(DX)
 	MOVQ	AX, g_stackguard1(DX)
 
@@ -330,7 +238,7 @@
 // g may be nil.
 // The function leaves room for 4 syscall parameters
 // (as per windows amd64 calling convention).
-TEXT runtime·usleep2(SB),NOSPLIT|NOFRAME,$48-4
+TEXT runtime·usleep2(SB),NOSPLIT,$48-4
 	MOVLQSX	dt+0(FP), BX
 	MOVQ	SP, AX
 	ANDQ	$~15, SP	// alignment as per Windows requirement
@@ -344,41 +252,8 @@
 	MOVQ	40(SP), SP
 	RET
 
-// Runs on OS stack. duration (in -100ns units) is in dt+0(FP).
-// g is valid.
-TEXT runtime·usleep2HighRes(SB),NOSPLIT|NOFRAME,$72-4
-	MOVLQSX	dt+0(FP), BX
-	get_tls(CX)
-
-	MOVQ	SP, AX
-	ANDQ	$~15, SP	// alignment as per Windows requirement
-	MOVQ	AX, 64(SP)
-
-	MOVQ	g(CX), CX
-	MOVQ	g_m(CX), CX
-	MOVQ	(m_mOS+mOS_highResTimer)(CX), CX	// hTimer
-	MOVQ	CX, 48(SP)				// save hTimer for later
-	LEAQ	56(SP), DX				// lpDueTime
-	MOVQ	BX, (DX)
-	MOVQ	$0, R8					// lPeriod
-	MOVQ	$0, R9					// pfnCompletionRoutine
-	MOVQ	$0, AX
-	MOVQ	AX, 32(SP)				// lpArgToCompletionRoutine
-	MOVQ	AX, 40(SP)				// fResume
-	MOVQ	runtime·_SetWaitableTimer(SB), AX
-	CALL	AX
-
-	MOVQ	48(SP), CX				// handle
-	MOVQ	$0, DX					// alertable
-	MOVQ	$0, R8					// ptime
-	MOVQ	runtime·_NtWaitForSingleObject(SB), AX
-	CALL	AX
-
-	MOVQ	64(SP), SP
-	RET
-
 // Runs on OS stack.
-TEXT runtime·switchtothread(SB),NOSPLIT|NOFRAME,$0
+TEXT runtime·switchtothread(SB),NOSPLIT,$0
 	MOVQ	SP, AX
 	ANDQ	$~15, SP	// alignment as per Windows requirement
 	SUBQ	$(48), SP	// room for SP and 4 args as per Windows requirement
@@ -411,7 +286,7 @@
 
 // This is called from rt0_go, which runs on the system stack
 // using the initial stack allocated by the OS.
-TEXT runtime·wintls(SB),NOSPLIT|NOFRAME,$0
+TEXT runtime·wintls(SB),NOSPLIT,$0
 	// Allocate a TLS slot to hold g across calls to external code
 	MOVQ	SP, AX
 	ANDQ	$~15, SP	// alignment as per Windows requirement
@@ -427,7 +302,11 @@
 	// Assert that slot is less than 64 so we can use _TEB->TlsSlots
 	CMPQ	CX, $64
 	JB	ok
-	CALL	runtime·abort(SB)
+
+	// Fallback to the TEB arbitrary pointer.
+	// TODO: don't use the arbitrary pointer (see go.dev/issue/59824)
+	MOVQ	$TEB_ArbitraryPtr, CX
+	JMP	settls
 ok:
 	// Convert the TLS index at CX into
 	// an offset from TEB_TlsSlots.
@@ -435,5 +314,6 @@
 
 	// Save offset from TLS into tls_g.
 	ADDQ	$TEB_TlsSlots, CX
+settls:
 	MOVQ	CX, runtime·tls_g(SB)
 	RET
diff --git a/src/runtime/sys_windows_arm.s b/src/runtime/sys_windows_arm.s
index db6d8f1..67009df 100644
--- a/src/runtime/sys_windows_arm.s
+++ b/src/runtime/sys_windows_arm.s
@@ -76,30 +76,6 @@
 
 	MOVM.IA.W (R13), [R4, R5, R15]
 
-TEXT runtime·badsignal2(SB),NOSPLIT|NOFRAME,$0
-	MOVM.DB.W [R4, R14], (R13)	// push {r4, lr}
-	MOVW	R13, R4			// save original stack pointer
-	SUB	$8, R13			// space for 2 variables
-	BIC	$0x7, R13		// alignment for ABI
-
-	// stderr
-	MOVW	runtime·_GetStdHandle(SB), R1
-	MOVW	$-12, R0
-	BL	(R1)
-
-	MOVW	$runtime·badsignalmsg(SB), R1	// lpBuffer
-	MOVW	$runtime·badsignallen(SB), R2	// lpNumberOfBytesToWrite
-	MOVW	(R2), R2
-	ADD	$0x4, R13, R3		// lpNumberOfBytesWritten
-	MOVW	$0, R12			// lpOverlapped
-	MOVW	R12, (R13)
-
-	MOVW	runtime·_WriteFile(SB), R12
-	BL	(R12)
-
-	// Does not return.
-	B	runtime·abort(SB)
-
 TEXT runtime·getlasterror(SB),NOSPLIT,$0
 	MRC	15, 0, R0, C13, C0, 2
 	MOVW	0x34(R0), R0
@@ -107,121 +83,36 @@
 	RET
 
 // Called by Windows as a Vectored Exception Handler (VEH).
-// First argument is pointer to struct containing
+// R0 is pointer to struct containing
 // exception record and context pointers.
-// Handler function is stored in R1
-// Return 0 for 'not handled', -1 for handled.
-// int32_t sigtramp(
-//     PEXCEPTION_POINTERS ExceptionInfo,
-//     func *GoExceptionHandler);
+// R1 is the kind of sigtramp function.
+// Return value of sigtrampgo is stored in R0.
 TEXT sigtramp<>(SB),NOSPLIT|NOFRAME,$0
-	MOVM.DB.W [R0, R4-R11, R14], (R13)	// push {r0, r4-r11, lr} (SP-=40)
-	SUB	$(8+20), R13		// reserve space for g, sp, and
-					// parameters/retval to go call
+	MOVM.DB.W [R4-R11, R14], (R13)	// push {r4-r11, lr} (SP-=40)
+	SUB	$(16), R13		// reserve space for parameters/retval to go call
 
 	MOVW	R0, R6			// Save param0
 	MOVW	R1, R7			// Save param1
-
-	BL      runtime·load_g(SB)
-	CMP	$0,	g		// is there a current g?
-	BNE	g_ok
-	ADD	$(8+20), R13	// free locals
-	MOVM.IA.W (R13), [R3, R4-R11, R14]	// pop {r3, r4-r11, lr}
-	MOVW	$0, R0		// continue 
-	BEQ	return
-
-g_ok:
-
-	// save g and SP in case of stack switch
-	MOVW	R13, 24(R13)
-	MOVW	g, 20(R13)
-
-	// do we need to switch to the g0 stack?
-	MOVW	g, R5			// R5 = g
-	MOVW	g_m(R5), R2		// R2 = m
-	MOVW	m_g0(R2), R4		// R4 = g0
-	CMP	R5, R4			// if curg == g0
-	BEQ	g0
-
-	// switch to g0 stack
-	MOVW	R4, g				// g = g0
-	MOVW	(g_sched+gobuf_sp)(g), R3	// R3 = g->gobuf.sp
-	BL      runtime·save_g(SB)
-
-	// make room for sighandler arguments
-	// and re-save old SP for restoring later.
-	// (note that the 24(R3) here must match the 24(R13) above.)
-	SUB	$40, R3
-	MOVW	R13, 24(R3)		// save old stack pointer
-	MOVW	R3, R13			// switch stack
-
-g0:
-	MOVW	0(R6), R2	// R2 = ExceptionPointers->ExceptionRecord
-	MOVW	4(R6), R3	// R3 = ExceptionPointers->ContextRecord
+	BL	runtime·load_g(SB)	// Clobbers R0
 
 	MOVW	$0, R4
 	MOVW	R4, 0(R13)	// No saved link register.
-	MOVW	R2, 4(R13)	// Move arg0 (ExceptionRecord) into position
-	MOVW	R3, 8(R13)	// Move arg1 (ContextRecord) into position
-	MOVW	R5, 12(R13)	// Move arg2 (original g) into position
-	BL	(R7)		// Call the goroutine
-	MOVW	16(R13), R4	// Fetch return value from stack
+	MOVW	R6, 4(R13)	// Move arg0 into position
+	MOVW	R7, 8(R13)	// Move arg1 into position
+	BL	runtime·sigtrampgo(SB)
+	MOVW	12(R13), R0	// Fetch return value from stack
 
-	// Save system stack pointer for sigresume setup below.
-	// The exact value does not matter - nothing is read or written
-	// from this address. It just needs to be on the system stack.
-	MOVW	R13, R12
+	ADD	$(16), R13			// free locals
+	MOVM.IA.W (R13), [R4-R11, R14]	// pop {r4-r11, lr}
 
-	// switch back to original stack and g
-	MOVW	24(R13), R13
-	MOVW	20(R13), g
-	BL      runtime·save_g(SB)
-
-done:
-	MOVW	R4, R0				// move retval into position
-	ADD	$(8 + 20), R13			// free locals
-	MOVM.IA.W (R13), [R3, R4-R11, R14]	// pop {r3, r4-r11, lr}
-
-	// if return value is CONTINUE_SEARCH, do not set up control
-	// flow guard workaround
-	CMP	$0, R0
-	BEQ	return
-
-	// Check if we need to set up the control flow guard workaround.
-	// On Windows, the stack pointer in the context must lie within
-	// system stack limits when we resume from exception.
-	// Store the resume SP and PC on the g0 stack,
-	// and return to sigresume on the g0 stack. sigresume
-	// pops the saved PC and SP from the g0 stack, resuming execution
-	// at the desired location.
-	// If sigresume has already been set up by a previous exception
-	// handler, don't clobber the stored SP and PC on the stack.
-	MOVW	4(R3), R3			// PEXCEPTION_POINTERS->Context
-	MOVW	context_pc(R3), R2		// load PC from context record
-	MOVW	$sigresume<>(SB), R1
-	CMP	R1, R2
-	B.EQ	return				// do not clobber saved SP/PC
-
-	// Save resume SP and PC into R0, R1.
-	MOVW	context_spr(R3), R2
-	MOVW	R2, context_r0(R3)
-	MOVW	context_pc(R3), R2
-	MOVW	R2, context_r1(R3)
-
-	// Set up context record to return to sigresume on g0 stack
-	MOVW	R12, context_spr(R3)
-	MOVW	$sigresume<>(SB), R2
-	MOVW	R2, context_pc(R3)
-
-return:
 	B	(R14)				// return
 
 // Trampoline to resume execution from exception handler.
 // This is part of the control flow guard workaround.
 // It switches stacks and jumps to the continuation address.
-// R0 and R1 are set above at the end of sigtramp<>
-// in the context that starts executing at sigresume<>.
-TEXT sigresume<>(SB),NOSPLIT|NOFRAME,$0
+// R0 and R1 are set above at the end of sigtrampgo
+// in the context that starts executing at sigresume.
+TEXT runtime·sigresume(SB),NOSPLIT|NOFRAME,$0
 	// Important: do not smash LR,
 	// which is set to a live value when handling
 	// a signal by pushing a call to sigpanic onto the stack.
@@ -229,19 +120,17 @@
 	B	(R1)
 
 TEXT runtime·exceptiontramp(SB),NOSPLIT|NOFRAME,$0
-	MOVW	$runtime·exceptionhandler(SB), R1
+	MOVW	$const_callbackVEH, R1
 	B	sigtramp<>(SB)
 
 TEXT runtime·firstcontinuetramp(SB),NOSPLIT|NOFRAME,$0
-	MOVW	$runtime·firstcontinuehandler(SB), R1
+	MOVW	$const_callbackFirstVCH, R1
 	B	sigtramp<>(SB)
 
 TEXT runtime·lastcontinuetramp(SB),NOSPLIT|NOFRAME,$0
-	MOVW	$runtime·lastcontinuehandler(SB), R1
+	MOVW	$const_callbackLastVCH, R1
 	B	sigtramp<>(SB)
 
-GLOBL runtime·cbctxts(SB), NOPTR, $4
-
 TEXT runtime·callbackasm1(SB),NOSPLIT|NOFRAME,$0
 	// On entry, the trampoline in zcallback_windows_arm.s left
 	// the callback index in R12 (which is volatile in the C ABI).
@@ -323,13 +212,6 @@
 	MOVM.IA.W (R13), [R4, R15]	// pop {R4, pc}
 
 // Runs on OS stack.
-// duration (in -100ns units) is in dt+0(FP).
-// g is valid.
-// TODO: needs to be implemented properly.
-TEXT runtime·usleep2HighRes(SB),NOSPLIT|NOFRAME,$0-4
-	B	runtime·abort(SB)
-
-// Runs on OS stack.
 TEXT runtime·switchtothread(SB),NOSPLIT|NOFRAME,$0
 	MOVM.DB.W [R4, R14], (R13)  	// push {R4, lr}
 	MOVW    R13, R4
@@ -343,12 +225,12 @@
 	B	runtime·armPublicationBarrier(SB)
 
 // never called (this is a GOARM=7 platform)
-TEXT runtime·read_tls_fallback(SB),NOSPLIT|NOFRAME,$0
+TEXT runtime·read_tls_fallback(SB),NOSPLIT,$0
 	MOVW	$0xabcd, R0
 	MOVW	R0, (R0)
 	RET
 
-TEXT runtime·nanotime1(SB),NOSPLIT|NOFRAME,$0-8
+TEXT runtime·nanotime1(SB),NOSPLIT,$0-8
 	MOVW	$0, R0
 	MOVB	runtime·useQPCTime(SB), R0
 	CMP	$0, R0
@@ -373,7 +255,7 @@
 	MOVW	R4, ret_hi+4(FP)
 	RET
 useQPC:
-	B	runtime·nanotimeQPC(SB)		// tail call
+	RET	runtime·nanotimeQPC(SB)		// tail call
 
 // save_g saves the g register (R10) into thread local memory
 // so that we can call externally compiled
@@ -384,7 +266,7 @@
 // Save the value in the _TEB->TlsSlots array.
 // Effectively implements TlsSetValue().
 // tls_g stores the TLS slot allocated TlsAlloc().
-TEXT runtime·save_g(SB),NOSPLIT|NOFRAME,$0
+TEXT runtime·save_g(SB),NOSPLIT,$0
 	MRC	15, 0, R0, C13, C0, 2
 	ADD	$0xe10, R0
 	MOVW 	$runtime·tls_g(SB), R11
@@ -398,7 +280,7 @@
 // ARM code that overwrote those registers.
 // Get the value from the _TEB->TlsSlots array.
 // Effectively implements TlsGetValue().
-TEXT runtime·load_g(SB),NOSPLIT|NOFRAME,$0
+TEXT runtime·load_g(SB),NOSPLIT,$0
 	MRC	15, 0, R0, C13, C0, 2
 	ADD	$0xe10, R0
 	MOVW 	$runtime·tls_g(SB), g
diff --git a/src/runtime/sys_windows_arm64.s b/src/runtime/sys_windows_arm64.s
index 4702a4d..22bf1dd 100644
--- a/src/runtime/sys_windows_arm64.s
+++ b/src/runtime/sys_windows_arm64.s
@@ -12,6 +12,7 @@
 // Offsets into Thread Environment Block (pointer in R18)
 #define TEB_error 0x68
 #define TEB_TlsSlots 0x1480
+#define TEB_ArbitraryPtr 0x28
 
 // Note: R0-R7 are args, R8 is indirect return value address,
 // R9-R15 are caller-save, R19-R29 are callee-save.
@@ -19,8 +20,7 @@
 // load_g and save_g (in tls_arm64.s) clobber R27 (REGTMP) and R0.
 
 // void runtime·asmstdcall(void *c);
-TEXT runtime·asmstdcall(SB),NOSPLIT|NOFRAME,$0
-	STP.W	(R29, R30), -32(RSP)	// allocate C ABI stack frame
+TEXT runtime·asmstdcall(SB),NOSPLIT,$16
 	STP	(R19, R20), 16(RSP) // save old R19, R20
 	MOVD	R0, R19	// save libcall pointer
 	MOVD	RSP, R20	// save stack pointer
@@ -96,178 +96,46 @@
 
 	// Restore callee-saved registers.
 	LDP	16(RSP), (R19, R20)
-	LDP.P	32(RSP), (R29, R30)
 	RET
 
-TEXT runtime·badsignal2(SB),NOSPLIT,$16-0
-	NO_LOCAL_POINTERS
-
-	// stderr
-	MOVD	runtime·_GetStdHandle(SB), R1
-	MOVD	$-12, R0
-	SUB	$16, RSP	// skip over saved frame pointer below RSP
-	BL	(R1)
-	ADD	$16, RSP
-
-	// handle in R0 already
-	MOVD	$runtime·badsignalmsg(SB), R1	// lpBuffer
-	MOVD	$runtime·badsignallen(SB), R2	// lpNumberOfBytesToWrite
-	MOVD	(R2), R2
-	// point R3 to stack local that will receive number of bytes written
-	ADD	$16, RSP, R3		// lpNumberOfBytesWritten
-	MOVD	$0, R4			// lpOverlapped
-	MOVD	runtime·_WriteFile(SB), R12
-	SUB	$16, RSP	// skip over saved frame pointer below RSP
-	BL	(R12)
-
-	// Does not return.
-	B	runtime·abort(SB)
-
-	RET
-
-TEXT runtime·getlasterror(SB),NOSPLIT|NOFRAME,$0
+TEXT runtime·getlasterror(SB),NOSPLIT,$0
 	MOVD	TEB_error(R18_PLATFORM), R0
 	MOVD	R0, ret+0(FP)
 	RET
 
 // Called by Windows as a Vectored Exception Handler (VEH).
-// First argument is pointer to struct containing
+// R0 is pointer to struct containing
 // exception record and context pointers.
-// Handler function is stored in R1
-// Return 0 for 'not handled', -1 for handled.
-// int32_t sigtramp(
-//     PEXCEPTION_POINTERS ExceptionInfo,
-//     func *GoExceptionHandler);
-TEXT sigtramp<>(SB),NOSPLIT|NOFRAME,$0
-	// Save R0, R1 (args) as well as LR, R27, R28 (callee-save).
+// R1 is the kind of sigtramp function.
+// Return value of sigtrampgo is stored in R0.
+TEXT sigtramp<>(SB),NOSPLIT,$176
+	// Switch from the host ABI to the Go ABI, safe args and lr.
 	MOVD	R0, R5
 	MOVD	R1, R6
 	MOVD	LR, R7
-	MOVD	R27, R16		// saved R27 (callee-save)
-	MOVD	g, R17 			// saved R28 (callee-save from Windows, not really g)
+	SAVE_R19_TO_R28(8*4)
+	SAVE_F8_TO_F15(8*14)
 
-	BL      runtime·load_g(SB)	// smashes R0, R27, R28 (g)
-	CMP	$0,	g		// is there a current g?
-	BNE	g_ok
-	MOVD	R7, LR
-	MOVD	R16, R27	// restore R27
-	MOVD	R17, g		// restore R28
-	MOVD	$0, R0		// continue 
-	RET
+	BL	runtime·load_g(SB)	// Clobers R0, R27, R28 (g)
 
-g_ok:
-	// Do we need to switch to the g0 stack?
-	MOVD	g, R3			// R3 = oldg (for sigtramp_g0)
-	MOVD	g_m(g), R2		// R2 = m
-	MOVD	m_g0(R2), R2		// R2 = g0
-	CMP	g, R2			// if curg == g0
-	BNE	switch
-
-	// No: on g0 stack already, tail call to sigtramp_g0.
-	// Restore all the callee-saves so sigtramp_g0 can return to our caller.
-	// We also pass R2 = g0, R3 = oldg, both set above.
 	MOVD	R5, R0
 	MOVD	R6, R1
+	// Calling ABIInternal because TLS might be nil.
+	BL	runtime·sigtrampgo<ABIInternal>(SB)
+	// Return value is already stored in R0.
+
+	// Restore callee-save registers.
+	RESTORE_R19_TO_R28(8*4)
+	RESTORE_F8_TO_F15(8*14)
 	MOVD	R7, LR
-	MOVD	R16, R27		// restore R27
-	MOVD	R17, g 			// restore R28
-	B	sigtramp_g0<>(SB)
-
-switch:
-	// switch to g0 stack (but do not update g - that's sigtramp_g0's job)
-	MOVD	RSP, R8
-	MOVD	(g_sched+gobuf_sp)(R2), R4	// R4 = g->gobuf.sp
-	SUB	$(6*8), R4			// alloc space for saves - 2 words below SP for frame pointer, 3 for us to use, 1 for alignment
-	MOVD	R4, RSP				// switch to g0 stack
-
-	MOVD	$0, (0*8)(RSP)	// fake saved LR
-	MOVD	R7, (1*8)(RSP)	// saved LR
-	MOVD	R8, (2*8)(RSP)	// saved SP
-
-	MOVD	R5, R0		// original args
-	MOVD	R6, R1		// original args
-	MOVD	R16, R27
-	MOVD	R17, g 		// R28
-	BL	sigtramp_g0<>(SB)
-
-	// switch back to original stack; g already updated
-	MOVD	(1*8)(RSP), R7	// saved LR
-	MOVD	(2*8)(RSP), R8	// saved SP
-	MOVD	R7, LR
-	MOVD	R8, RSP
-	RET
-
-// sigtramp_g0 is running on the g0 stack, with R2 = g0, R3 = oldg.
-// But g itself is not set - that's R28, a callee-save register,
-// and it still holds the value from the Windows DLL caller.
-TEXT sigtramp_g0<>(SB),NOSPLIT,$128
-	NO_LOCAL_POINTERS
-
-	// Push C callee-save registers R19-R28. LR, FP already saved.
-	// These registers will occupy the upper 10 words of the frame.
-	SAVE_R19_TO_R28(8*7)
-
-	MOVD	0(R0), R5	// R5 = ExceptionPointers->ExceptionRecord
-	MOVD	8(R0), R6	// R6 = ExceptionPointers->ContextRecord
-	MOVD	R6, context-(11*8)(SP)
-
-	MOVD	R2, g 			// g0
-	BL      runtime·save_g(SB)	// smashes R0
-
-	MOVD	R5, (1*8)(RSP)	// arg0 (ExceptionRecord)
-	MOVD	R6, (2*8)(RSP)	// arg1 (ContextRecord)
-	MOVD	R3, (3*8)(RSP)	// arg2 (original g)
-	MOVD	R3, oldg-(12*8)(SP)
-	BL	(R1)
-	MOVD	oldg-(12*8)(SP), g
-	BL      runtime·save_g(SB)	// smashes R0
-	MOVW	(4*8)(RSP), R0	// return value (0 or -1)
-
-	// if return value is CONTINUE_SEARCH, do not set up control
-	// flow guard workaround
-	CMP	$0, R0
-	BEQ	return
-
-	// Check if we need to set up the control flow guard workaround.
-	// On Windows, the stack pointer in the context must lie within
-	// system stack limits when we resume from exception.
-	// Store the resume SP and PC in alternate registers
-	// and return to sigresume on the g0 stack.
-	// sigresume makes no use of the stack at all,
-	// loading SP from R0 and jumping to R1.
-	// Note that smashing R0 and R1 is only safe because we know sigpanic
-	// will not actually return to the original frame, so the registers
-	// are effectively dead. But this does mean we can't use the
-	// same mechanism for async preemption.
-	MOVD	context-(11*8)(SP), R6
-	MOVD	context_pc(R6), R2		// load PC from context record
-	MOVD	$sigresume<>(SB), R1
-
-	CMP	R1, R2
-	BEQ	return				// do not clobber saved SP/PC
-
-	// Save resume SP and PC into R0, R1.
-	MOVD	context_xsp(R6), R2
-	MOVD	R2, (context_x+0*8)(R6)
-	MOVD	context_pc(R6), R2
-	MOVD	R2, (context_x+1*8)(R6)
-
-	// Set up context record to return to sigresume on g0 stack
-	MOVD	RSP, R2
-	MOVD	R2, context_xsp(R6)
-	MOVD	$sigresume<>(SB), R2
-	MOVD	R2, context_pc(R6)
-
-return:
-	RESTORE_R19_TO_R28(8*7)		// smashes g
 	RET
 
 // Trampoline to resume execution from exception handler.
 // This is part of the control flow guard workaround.
 // It switches stacks and jumps to the continuation address.
-// R0 and R1 are set above at the end of sigtramp<>
-// in the context that starts executing at sigresume<>.
-TEXT sigresume<>(SB),NOSPLIT|NOFRAME,$0
+// R0 and R1 are set above at the end of sigtrampgo
+// in the context that starts executing at sigresume.
+TEXT runtime·sigresume(SB),NOSPLIT|NOFRAME,$0
 	// Important: do not smash LR,
 	// which is set to a live value when handling
 	// a signal by pushing a call to sigpanic onto the stack.
@@ -275,19 +143,17 @@
 	B	(R1)
 
 TEXT runtime·exceptiontramp(SB),NOSPLIT|NOFRAME,$0
-	MOVD	$runtime·exceptionhandler(SB), R1
+	MOVD	$const_callbackVEH, R1
 	B	sigtramp<>(SB)
 
 TEXT runtime·firstcontinuetramp(SB),NOSPLIT|NOFRAME,$0
-	MOVD	$runtime·firstcontinuehandler(SB), R1
+	MOVD	$const_callbackFirstVCH, R1
 	B	sigtramp<>(SB)
 
 TEXT runtime·lastcontinuetramp(SB),NOSPLIT|NOFRAME,$0
-	MOVD	$runtime·lastcontinuehandler(SB), R1
+	MOVD	$const_callbackLastVCH, R1
 	B	sigtramp<>(SB)
 
-GLOBL runtime·cbctxts(SB), NOPTR, $4
-
 TEXT runtime·callbackasm1(SB),NOSPLIT,$208-0
 	NO_LOCAL_POINTERS
 
@@ -375,13 +241,6 @@
 	RET
 
 // Runs on OS stack.
-// duration (in -100ns units) is in dt+0(FP).
-// g is valid.
-// TODO: needs to be implemented properly.
-TEXT runtime·usleep2HighRes(SB),NOSPLIT,$0-4
-	B	runtime·abort(SB)
-
-// Runs on OS stack.
 TEXT runtime·switchtothread(SB),NOSPLIT,$16-0
 	MOVD	runtime·_SwitchToThread(SB), R0
 	SUB	$16, RSP	// skip over saved frame pointer below RSP
@@ -389,7 +248,7 @@
 	ADD	$16, RSP
 	RET
 
-TEXT runtime·nanotime1(SB),NOSPLIT|NOFRAME,$0-8
+TEXT runtime·nanotime1(SB),NOSPLIT,$0-8
 	MOVB	runtime·useQPCTime(SB), R0
 	CMP	$0, R0
 	BNE	useQPC
@@ -400,7 +259,7 @@
 	MOVD	R0, ret+0(FP)
 	RET
 useQPC:
-	B	runtime·nanotimeQPC(SB)		// tail call
+	RET	runtime·nanotimeQPC(SB)		// tail call
 
 // This is called from rt0_go, which runs on the system stack
 // using the initial stack allocated by the OS.
@@ -415,12 +274,15 @@
 	// Assert that slot is less than 64 so we can use _TEB->TlsSlots
 	CMP	$64, R0
 	BLT	ok
-	MOVD	$runtime·abort(SB), R1
-	BL	(R1)
+	// Fallback to the TEB arbitrary pointer.
+	// TODO: don't use the arbitrary pointer (see go.dev/issue/59824)
+	MOVD	$TEB_ArbitraryPtr, R0
+	B	settls
 ok:
 
 	// Save offset from R18 into tls_g.
 	LSL	$3, R0
 	ADD	$TEB_TlsSlots, R0
+settls:
 	MOVD	R0, runtime·tls_g(SB)
 	RET
diff --git a/src/runtime/syscall2_solaris.go b/src/runtime/syscall2_solaris.go
index 3310489..10a4fa0 100644
--- a/src/runtime/syscall2_solaris.go
+++ b/src/runtime/syscall2_solaris.go
@@ -17,11 +17,13 @@
 //go:cgo_import_dynamic libc_ioctl ioctl "libc.so"
 //go:cgo_import_dynamic libc_setgid setgid "libc.so"
 //go:cgo_import_dynamic libc_setgroups setgroups "libc.so"
+//go:cgo_import_dynamic libc_setrlimit setrlimit "libc.so"
 //go:cgo_import_dynamic libc_setsid setsid "libc.so"
 //go:cgo_import_dynamic libc_setuid setuid "libc.so"
 //go:cgo_import_dynamic libc_setpgid setpgid "libc.so"
 //go:cgo_import_dynamic libc_syscall syscall "libc.so"
 //go:cgo_import_dynamic libc_wait4 wait4 "libc.so"
+//go:cgo_import_dynamic libc_issetugid issetugid "libc.so"
 
 //go:linkname libc_chdir libc_chdir
 //go:linkname libc_chroot libc_chroot
@@ -34,8 +36,10 @@
 //go:linkname libc_ioctl libc_ioctl
 //go:linkname libc_setgid libc_setgid
 //go:linkname libc_setgroups libc_setgroups
+//go:linkname libc_setrlimit libc_setrlimit
 //go:linkname libc_setsid libc_setsid
 //go:linkname libc_setuid libc_setuid
 //go:linkname libc_setpgid libc_setpgid
 //go:linkname libc_syscall libc_syscall
 //go:linkname libc_wait4 libc_wait4
+//go:linkname libc_issetugid libc_issetugid
diff --git a/src/runtime/syscall_aix.go b/src/runtime/syscall_aix.go
index cc9e912..e87d4d6 100644
--- a/src/runtime/syscall_aix.go
+++ b/src/runtime/syscall_aix.go
@@ -18,6 +18,7 @@
 //go:cgo_import_dynamic libc_ioctl ioctl "libc.a/shr_64.o"
 //go:cgo_import_dynamic libc_setgid setgid "libc.a/shr_64.o"
 //go:cgo_import_dynamic libc_setgroups setgroups "libc.a/shr_64.o"
+//go:cgo_import_dynamic libc_setrlimit setrlimit "libc.a/shr_64.o"
 //go:cgo_import_dynamic libc_setsid setsid "libc.a/shr_64.o"
 //go:cgo_import_dynamic libc_setuid setuid "libc.a/shr_64.o"
 //go:cgo_import_dynamic libc_setpgid setpgid "libc.a/shr_64.o"
@@ -31,6 +32,7 @@
 //go:linkname libc_ioctl libc_ioctl
 //go:linkname libc_setgid libc_setgid
 //go:linkname libc_setgroups libc_setgroups
+//go:linkname libc_setrlimit libc_setrlimit
 //go:linkname libc_setsid libc_setsid
 //go:linkname libc_setuid libc_setuid
 //go:linkname libc_setpgid libc_setpgid
@@ -45,6 +47,7 @@
 	libc_ioctl,
 	libc_setgid,
 	libc_setgroups,
+	libc_setrlimit,
 	libc_setsid,
 	libc_setuid,
 	libc_setpgid libFunc
@@ -199,6 +202,13 @@
 	return
 }
 
+//go:linkname syscall_setrlimit1 syscall.setrlimit1
+//go:nosplit
+func syscall_setrlimit1(which uintptr, lim unsafe.Pointer) (err uintptr) {
+	_, err = syscall2(&libc_setrlimit, which, uintptr(lim))
+	return
+}
+
 //go:linkname syscall_setsid syscall.setsid
 //go:nosplit
 func syscall_setsid() (pid, err uintptr) {
diff --git a/src/runtime/syscall_solaris.go b/src/runtime/syscall_solaris.go
index e7bab3b..11b9c2a 100644
--- a/src/runtime/syscall_solaris.go
+++ b/src/runtime/syscall_solaris.go
@@ -18,10 +18,12 @@
 	libc_ioctl,
 	libc_setgid,
 	libc_setgroups,
+	libc_setrlimit,
 	libc_setsid,
 	libc_setuid,
 	libc_setpgid,
 	libc_syscall,
+	libc_issetugid,
 	libc_wait4 libcFunc
 )
 
@@ -235,6 +237,19 @@
 }
 
 //go:nosplit
+//go:linkname syscall_setrlimit
+//go:cgo_unsafe_args
+func syscall_setrlimit(which uintptr, lim unsafe.Pointer) (err uintptr) {
+	call := libcall{
+		fn:   uintptr(unsafe.Pointer(&libc_setrlimit)),
+		n:    2,
+		args: uintptr(unsafe.Pointer(&which)),
+	}
+	asmcgocall(unsafe.Pointer(&asmsysvicall6x), unsafe.Pointer(&call))
+	return call.err
+}
+
+//go:nosplit
 //go:linkname syscall_setsid
 func syscall_setsid() (pid, err uintptr) {
 	call := libcall{
diff --git a/src/runtime/syscall_windows.go b/src/runtime/syscall_windows.go
index 76036ad..ba88e93 100644
--- a/src/runtime/syscall_windows.go
+++ b/src/runtime/syscall_windows.go
@@ -91,7 +91,7 @@
 }
 
 func (p *abiDesc) assignArg(t *_type) {
-	if t.size > goarch.PtrSize {
+	if t.Size_ > goarch.PtrSize {
 		// We don't support this right now. In
 		// stdcall/cdecl, 64-bit ints and doubles are
 		// passed as two words (little endian); and
@@ -103,7 +103,7 @@
 		// registers and the stack.
 		panic("compileCallback: argument size is larger than uintptr")
 	}
-	if k := t.kind & kindMask; GOARCH != "386" && (k == kindFloat32 || k == kindFloat64) {
+	if k := t.Kind_ & kindMask; GOARCH != "386" && (k == kindFloat32 || k == kindFloat64) {
 		// In fastcall, floating-point arguments in
 		// the first four positions are passed in
 		// floating-point registers, which we don't
@@ -114,9 +114,9 @@
 		panic("compileCallback: float arguments not supported")
 	}
 
-	if t.size == 0 {
+	if t.Size_ == 0 {
 		// The Go ABI aligns for zero-sized types.
-		p.dstStackSize = alignUp(p.dstStackSize, uintptr(t.align))
+		p.dstStackSize = alignUp(p.dstStackSize, uintptr(t.Align_))
 		return
 	}
 
@@ -134,15 +134,15 @@
 		//
 		// TODO(mknyszek): Remove this when we no longer have
 		// caller reserved spill space.
-		p.dstSpill = alignUp(p.dstSpill, uintptr(t.align))
-		p.dstSpill += t.size
+		p.dstSpill = alignUp(p.dstSpill, uintptr(t.Align_))
+		p.dstSpill += t.Size_
 	} else {
 		// Register assignment failed.
 		// Undo the work and stack assign.
 		p.parts = oldParts
 
 		// The Go ABI aligns arguments.
-		p.dstStackSize = alignUp(p.dstStackSize, uintptr(t.align))
+		p.dstStackSize = alignUp(p.dstStackSize, uintptr(t.Align_))
 
 		// Copy just the size of the argument. Note that this
 		// could be a small by-value struct, but C and Go
@@ -152,14 +152,14 @@
 			kind:           abiPartStack,
 			srcStackOffset: p.srcStackSize,
 			dstStackOffset: p.dstStackSize,
-			len:            t.size,
+			len:            t.Size_,
 		}
 		// Add this step to the adapter.
 		if len(p.parts) == 0 || !p.parts[len(p.parts)-1].tryMerge(part) {
 			p.parts = append(p.parts, part)
 		}
 		// The Go ABI packs arguments.
-		p.dstStackSize += t.size
+		p.dstStackSize += t.Size_
 	}
 
 	// cdecl, stdcall, fastcall, and arm pad arguments to word size.
@@ -174,25 +174,25 @@
 //
 // Returns whether the assignment succeeded.
 func (p *abiDesc) tryRegAssignArg(t *_type, offset uintptr) bool {
-	switch k := t.kind & kindMask; k {
+	switch k := t.Kind_ & kindMask; k {
 	case kindBool, kindInt, kindInt8, kindInt16, kindInt32, kindUint, kindUint8, kindUint16, kindUint32, kindUintptr, kindPtr, kindUnsafePointer:
 		// Assign a register for all these types.
-		return p.assignReg(t.size, offset)
+		return p.assignReg(t.Size_, offset)
 	case kindInt64, kindUint64:
 		// Only register-assign if the registers are big enough.
 		if goarch.PtrSize == 8 {
-			return p.assignReg(t.size, offset)
+			return p.assignReg(t.Size_, offset)
 		}
 	case kindArray:
 		at := (*arraytype)(unsafe.Pointer(t))
-		if at.len == 1 {
-			return p.tryRegAssignArg(at.elem, offset)
+		if at.Len == 1 {
+			return p.tryRegAssignArg(at.Elem, offset) // TODO fix when runtime is fully commoned up w/ abi.Type
 		}
 	case kindStruct:
 		st := (*structtype)(unsafe.Pointer(t))
-		for i := range st.fields {
-			f := &st.fields[i]
-			if !p.tryRegAssignArg(f.typ, offset+f.offset) {
+		for i := range st.Fields {
+			f := &st.Fields[i]
+			if !p.tryRegAssignArg(f.Typ, offset+f.Offset) {
 				return false
 			}
 		}
@@ -200,7 +200,7 @@
 	}
 	// Pointer-sized types such as maps and channels are currently
 	// not supported.
-	panic("compileCallabck: type " + t.string() + " is currently not supported for use in system callbacks")
+	panic("compileCallback: type " + toRType(t).string() + " is currently not supported for use in system callbacks")
 }
 
 // assignReg attempts to assign a single register for an
@@ -269,14 +269,14 @@
 		cdecl = false
 	}
 
-	if fn._type == nil || (fn._type.kind&kindMask) != kindFunc {
+	if fn._type == nil || (fn._type.Kind_&kindMask) != kindFunc {
 		panic("compileCallback: expected function with one uintptr-sized result")
 	}
 	ft := (*functype)(unsafe.Pointer(fn._type))
 
 	// Check arguments and construct ABI translation.
 	var abiMap abiDesc
-	for _, t := range ft.in() {
+	for _, t := range ft.InSlice() {
 		abiMap.assignArg(t)
 	}
 	// The Go ABI aligns the result to the word size. src is
@@ -284,13 +284,13 @@
 	abiMap.dstStackSize = alignUp(abiMap.dstStackSize, goarch.PtrSize)
 	abiMap.retOffset = abiMap.dstStackSize
 
-	if len(ft.out()) != 1 {
+	if len(ft.OutSlice()) != 1 {
 		panic("compileCallback: expected function with one uintptr-sized result")
 	}
-	if ft.out()[0].size != goarch.PtrSize {
+	if ft.OutSlice()[0].Size_ != goarch.PtrSize {
 		panic("compileCallback: expected function with one uintptr-sized result")
 	}
-	if k := ft.out()[0].kind & kindMask; k == kindFloat32 || k == kindFloat64 {
+	if k := ft.OutSlice()[0].Kind_ & kindMask; k == kindFloat32 || k == kindFloat64 {
 		// In cdecl and stdcall, float results are returned in
 		// ST(0). In fastcall, they're returned in XMM0.
 		// Either way, it's not AX.
@@ -413,36 +413,23 @@
 
 const _LOAD_LIBRARY_SEARCH_SYSTEM32 = 0x00000800
 
-// When available, this function will use LoadLibraryEx with the filename
-// parameter and the important SEARCH_SYSTEM32 argument. But on systems that
-// do not have that option, absoluteFilepath should contain a fallback
-// to the full path inside of system32 for use with vanilla LoadLibrary.
-//
 //go:linkname syscall_loadsystemlibrary syscall.loadsystemlibrary
 //go:nosplit
 //go:cgo_unsafe_args
-func syscall_loadsystemlibrary(filename *uint16, absoluteFilepath *uint16) (handle, err uintptr) {
+func syscall_loadsystemlibrary(filename *uint16) (handle, err uintptr) {
 	lockOSThread()
 	c := &getg().m.syscall
-
-	if useLoadLibraryEx {
-		c.fn = getLoadLibraryEx()
-		c.n = 3
-		args := struct {
-			lpFileName *uint16
-			hFile      uintptr // always 0
-			flags      uint32
-		}{filename, 0, _LOAD_LIBRARY_SEARCH_SYSTEM32}
-		c.args = uintptr(noescape(unsafe.Pointer(&args)))
-	} else {
-		c.fn = getLoadLibrary()
-		c.n = 1
-		c.args = uintptr(noescape(unsafe.Pointer(&absoluteFilepath)))
-	}
+	c.fn = getLoadLibraryEx()
+	c.n = 3
+	args := struct {
+		lpFileName *uint16
+		hFile      uintptr // always 0
+		flags      uint32
+	}{filename, 0, _LOAD_LIBRARY_SEARCH_SYSTEM32}
+	c.args = uintptr(noescape(unsafe.Pointer(&args)))
 
 	cgocall(asmstdcallAddr, unsafe.Pointer(c))
 	KeepAlive(filename)
-	KeepAlive(absoluteFilepath)
 	handle = c.r1
 	if handle == 0 {
 		err = c.err
diff --git a/src/runtime/syscall_windows_test.go b/src/runtime/syscall_windows_test.go
index abc2838..1770b83 100644
--- a/src/runtime/syscall_windows_test.go
+++ b/src/runtime/syscall_windows_test.go
@@ -648,21 +648,25 @@
 }
 
 func TestWERDialogue(t *testing.T) {
-	if os.Getenv("TESTING_WER_DIALOGUE") == "1" {
-		defer os.Exit(0)
-
-		*runtime.TestingWER = true
+	if os.Getenv("TEST_WER_DIALOGUE") == "1" {
 		const EXCEPTION_NONCONTINUABLE = 1
 		mod := syscall.MustLoadDLL("kernel32.dll")
 		proc := mod.MustFindProc("RaiseException")
 		proc.Call(0xbad, EXCEPTION_NONCONTINUABLE, 0, 0)
-		println("RaiseException should not return")
-		return
+		t.Fatal("RaiseException should not return")
 	}
-	cmd := exec.Command(os.Args[0], "-test.run=TestWERDialogue")
-	cmd.Env = []string{"TESTING_WER_DIALOGUE=1"}
+	exe, err := os.Executable()
+	if err != nil {
+		t.Fatal(err)
+	}
+	cmd := testenv.CleanCmdEnv(testenv.Command(t, exe, "-test.run=TestWERDialogue"))
+	cmd.Env = append(cmd.Env, "TEST_WER_DIALOGUE=1", "GOTRACEBACK=wer")
 	// Child process should not open WER dialogue, but return immediately instead.
-	cmd.CombinedOutput()
+	// The exit code can't be reliably tested here because Windows can change it.
+	_, err = cmd.CombinedOutput()
+	if err == nil {
+		t.Error("test program succeeded unexpectedly")
+	}
 }
 
 func TestWindowsStackMemory(t *testing.T) {
@@ -1164,10 +1168,7 @@
 	dll, err = syscall.LoadDLL(name)
 	if err == nil {
 		dll.Release()
-		if wantLoadLibraryEx() {
-			t.Fatalf("Bad: insecure load of DLL by base name %q before sysdll registration: %v", name, err)
-		}
-		t.Skip("insecure load of DLL, but expected")
+		t.Fatalf("Bad: insecure load of DLL by base name %q before sysdll registration: %v", name, err)
 	}
 }
 
@@ -1213,24 +1214,6 @@
 	}
 }
 
-// wantLoadLibraryEx reports whether we expect LoadLibraryEx to work for tests.
-func wantLoadLibraryEx() bool {
-	return testenv.Builder() != "" && (runtime.GOARCH == "amd64" || runtime.GOARCH == "386")
-}
-
-func TestLoadLibraryEx(t *testing.T) {
-	use, have, flags := runtime.LoadLibraryExStatus()
-	if use {
-		return // success.
-	}
-	if wantLoadLibraryEx() {
-		t.Fatalf("Expected LoadLibraryEx+flags to be available. (LoadLibraryEx=%v; flags=%v)",
-			have, flags)
-	}
-	t.Skipf("LoadLibraryEx not usable, but not expected. (LoadLibraryEx=%v; flags=%v)",
-		have, flags)
-}
-
 var (
 	modwinmm    = syscall.NewLazyDLL("winmm.dll")
 	modkernel32 = syscall.NewLazyDLL("kernel32.dll")
diff --git a/src/runtime/tagptr.go b/src/runtime/tagptr.go
new file mode 100644
index 0000000..0e17a15
--- /dev/null
+++ b/src/runtime/tagptr.go
@@ -0,0 +1,14 @@
+// Copyright 2023 The Go Authors. 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
+
+// taggedPointer is a pointer with a numeric tag.
+// The size of the numeric tag is GOARCH-dependent,
+// currently at least 10 bits.
+// This should only be used with pointers allocated outside the Go heap.
+type taggedPointer uint64
+
+// minTagBits is the minimum number of tag bits that we expect.
+const minTagBits = 10
diff --git a/src/runtime/tagptr_32bit.go b/src/runtime/tagptr_32bit.go
new file mode 100644
index 0000000..f79e182
--- /dev/null
+++ b/src/runtime/tagptr_32bit.go
@@ -0,0 +1,30 @@
+// 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:build 386 || arm || mips || mipsle
+
+package runtime
+
+import "unsafe"
+
+// The number of bits stored in the numeric tag of a taggedPointer
+const taggedPointerBits = 32
+
+// On 32-bit systems, taggedPointer has a 32-bit pointer and 32-bit count.
+
+// taggedPointerPack created a taggedPointer from a pointer and a tag.
+// Tag bits that don't fit in the result are discarded.
+func taggedPointerPack(ptr unsafe.Pointer, tag uintptr) taggedPointer {
+	return taggedPointer(uintptr(ptr))<<32 | taggedPointer(tag)
+}
+
+// Pointer returns the pointer from a taggedPointer.
+func (tp taggedPointer) pointer() unsafe.Pointer {
+	return unsafe.Pointer(uintptr(tp >> 32))
+}
+
+// Tag returns the tag from a taggedPointer.
+func (tp taggedPointer) tag() uintptr {
+	return uintptr(tp)
+}
diff --git a/src/runtime/tagptr_64bit.go b/src/runtime/tagptr_64bit.go
new file mode 100644
index 0000000..9ff11cc
--- /dev/null
+++ b/src/runtime/tagptr_64bit.go
@@ -0,0 +1,89 @@
+// 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:build amd64 || arm64 || loong64 || mips64 || mips64le || ppc64 || ppc64le || riscv64 || s390x || wasm
+
+package runtime
+
+import (
+	"internal/goarch"
+	"internal/goos"
+	"unsafe"
+)
+
+const (
+	// addrBits is the number of bits needed to represent a virtual address.
+	//
+	// See heapAddrBits for a table of address space sizes on
+	// various architectures. 48 bits is enough for all
+	// architectures except s390x.
+	//
+	// On AMD64, virtual addresses are 48-bit (or 57-bit) numbers sign extended to 64.
+	// We shift the address left 16 to eliminate the sign extended part and make
+	// room in the bottom for the count.
+	//
+	// On s390x, virtual addresses are 64-bit. There's not much we
+	// can do about this, so we just hope that the kernel doesn't
+	// get to really high addresses and panic if it does.
+	addrBits = 48
+
+	// In addition to the 16 bits taken from the top, we can take 3 from the
+	// bottom, because node must be pointer-aligned, giving a total of 19 bits
+	// of count.
+	tagBits = 64 - addrBits + 3
+
+	// On AIX, 64-bit addresses are split into 36-bit segment number and 28-bit
+	// offset in segment.  Segment numbers in the range 0x0A0000000-0x0AFFFFFFF(LSA)
+	// are available for mmap.
+	// We assume all tagged addresses are from memory allocated with mmap.
+	// We use one bit to distinguish between the two ranges.
+	aixAddrBits = 57
+	aixTagBits  = 64 - aixAddrBits + 3
+
+	// riscv64 SV57 mode gives 56 bits of userspace VA.
+	// tagged pointer code supports it,
+	// but broader support for SV57 mode is incomplete,
+	// and there may be other issues (see #54104).
+	riscv64AddrBits = 56
+	riscv64TagBits  = 64 - riscv64AddrBits + 3
+)
+
+// The number of bits stored in the numeric tag of a taggedPointer
+const taggedPointerBits = (goos.IsAix * aixTagBits) + (goarch.IsRiscv64 * riscv64TagBits) + ((1 - goos.IsAix) * (1 - goarch.IsRiscv64) * tagBits)
+
+// taggedPointerPack created a taggedPointer from a pointer and a tag.
+// Tag bits that don't fit in the result are discarded.
+func taggedPointerPack(ptr unsafe.Pointer, tag uintptr) taggedPointer {
+	if GOOS == "aix" {
+		if GOARCH != "ppc64" {
+			throw("check this code for aix on non-ppc64")
+		}
+		return taggedPointer(uint64(uintptr(ptr))<<(64-aixAddrBits) | uint64(tag&(1<<aixTagBits-1)))
+	}
+	if GOARCH == "riscv64" {
+		return taggedPointer(uint64(uintptr(ptr))<<(64-riscv64AddrBits) | uint64(tag&(1<<riscv64TagBits-1)))
+	}
+	return taggedPointer(uint64(uintptr(ptr))<<(64-addrBits) | uint64(tag&(1<<tagBits-1)))
+}
+
+// Pointer returns the pointer from a taggedPointer.
+func (tp taggedPointer) pointer() unsafe.Pointer {
+	if GOARCH == "amd64" {
+		// amd64 systems can place the stack above the VA hole, so we need to sign extend
+		// val before unpacking.
+		return unsafe.Pointer(uintptr(int64(tp) >> tagBits << 3))
+	}
+	if GOOS == "aix" {
+		return unsafe.Pointer(uintptr((tp >> aixTagBits << 3) | 0xa<<56))
+	}
+	if GOARCH == "riscv64" {
+		return unsafe.Pointer(uintptr(tp >> riscv64TagBits << 3))
+	}
+	return unsafe.Pointer(uintptr(tp >> tagBits << 3))
+}
+
+// Tag returns the tag from a taggedPointer.
+func (tp taggedPointer) tag() uintptr {
+	return uintptr(tp & (1<<taggedPointerBits - 1))
+}
diff --git a/src/runtime/test_amd64.go b/src/runtime/test_amd64.go
new file mode 100644
index 0000000..70c7a4f
--- /dev/null
+++ b/src/runtime/test_amd64.go
@@ -0,0 +1,7 @@
+// Copyright 2023 The Go Authors. 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
+
+func testSPWrite()
diff --git a/src/runtime/test_amd64.s b/src/runtime/test_amd64.s
new file mode 100644
index 0000000..80fa8c9
--- /dev/null
+++ b/src/runtime/test_amd64.s
@@ -0,0 +1,7 @@
+// Create a large frame to force stack growth. See #62326.
+TEXT ·testSPWrite(SB),0,$16384-0
+	// Write to SP
+	MOVQ SP, AX
+	ANDQ $~0xf, SP
+	MOVQ AX, SP
+	RET
diff --git a/src/runtime/test_stubs.go b/src/runtime/test_stubs.go
new file mode 100644
index 0000000..cefc324
--- /dev/null
+++ b/src/runtime/test_stubs.go
@@ -0,0 +1,9 @@
+// Copyright 2023 The Go 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:build !amd64
+
+package runtime
+
+func testSPWrite() {}
diff --git a/src/runtime/testdata/testprog/framepointer.go b/src/runtime/testdata/testprog/framepointer.go
new file mode 100644
index 0000000..cee6f7d
--- /dev/null
+++ b/src/runtime/testdata/testprog/framepointer.go
@@ -0,0 +1,44 @@
+// Copyright 2023 The Go 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:build amd64 || arm64
+
+package main
+
+import "unsafe"
+
+func init() {
+	register("FramePointerAdjust", FramePointerAdjust)
+}
+
+func FramePointerAdjust() { framePointerAdjust1(0) }
+
+//go:noinline
+func framePointerAdjust1(x int) {
+	argp := uintptr(unsafe.Pointer(&x))
+	fp := *getFP()
+	if !(argp-0x100 <= fp && fp <= argp+0x100) {
+		print("saved FP=", fp, " &x=", argp, "\n")
+		panic("FAIL")
+	}
+
+	// grow the stack
+	grow(10000)
+
+	// check again
+	argp = uintptr(unsafe.Pointer(&x))
+	fp = *getFP()
+	if !(argp-0x100 <= fp && fp <= argp+0x100) {
+		print("saved FP=", fp, " &x=", argp, "\n")
+		panic("FAIL")
+	}
+}
+
+func grow(n int) {
+	if n > 0 {
+		grow(n - 1)
+	}
+}
+
+func getFP() *uintptr
diff --git a/src/runtime/testdata/testprog/framepointer_amd64.s b/src/runtime/testdata/testprog/framepointer_amd64.s
new file mode 100644
index 0000000..2cd1299
--- /dev/null
+++ b/src/runtime/testdata/testprog/framepointer_amd64.s
@@ -0,0 +1,9 @@
+// Copyright 2023 The Go 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 "textflag.h"
+
+TEXT	·getFP(SB), NOSPLIT|NOFRAME, $0-8
+	MOVQ	BP, ret+0(FP)
+	RET
diff --git a/src/runtime/testdata/testprog/framepointer_arm64.s b/src/runtime/testdata/testprog/framepointer_arm64.s
new file mode 100644
index 0000000..cbaa286
--- /dev/null
+++ b/src/runtime/testdata/testprog/framepointer_arm64.s
@@ -0,0 +1,9 @@
+// Copyright 2023 The Go 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 "textflag.h"
+
+TEXT	·getFP(SB), NOSPLIT|NOFRAME, $0-8
+	MOVD	R29, ret+0(FP)
+	RET
diff --git a/src/runtime/testdata/testprog/lockosthread.go b/src/runtime/testdata/testprog/lockosthread.go
index e9d7fdb..90d98e4 100644
--- a/src/runtime/testdata/testprog/lockosthread.go
+++ b/src/runtime/testdata/testprog/lockosthread.go
@@ -155,7 +155,7 @@
 		}
 		// Chdir to somewhere else on this thread.
 		// On systems other than Linux, this is a no-op.
-		if err := chdir("/tmp"); err != nil {
+		if err := chdir(os.TempDir()); err != nil {
 			println("failed to chdir:", err.Error())
 			os.Exit(1)
 		}
diff --git a/src/runtime/testdata/testprog/segv.go b/src/runtime/testdata/testprog/segv.go
new file mode 100644
index 0000000..8547726
--- /dev/null
+++ b/src/runtime/testdata/testprog/segv.go
@@ -0,0 +1,32 @@
+// Copyright 2020 The Go 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:build unix
+
+package main
+
+import "syscall"
+
+func init() {
+	register("Segv", Segv)
+}
+
+var Sum int
+
+func Segv() {
+	c := make(chan bool)
+	go func() {
+		close(c)
+		for i := 0; ; i++ {
+			Sum += i
+		}
+	}()
+
+	<-c
+
+	syscall.Kill(syscall.Getpid(), syscall.SIGSEGV)
+
+	// Wait for the OS to deliver the signal.
+	select {}
+}
diff --git a/src/runtime/testdata/testprog/segv_linux.go b/src/runtime/testdata/testprog/segv_linux.go
new file mode 100644
index 0000000..aa386bb
--- /dev/null
+++ b/src/runtime/testdata/testprog/segv_linux.go
@@ -0,0 +1,29 @@
+// Copyright 2022 The Go Authors. 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 "syscall"
+
+func init() {
+	register("TgkillSegv", TgkillSegv)
+}
+
+func TgkillSegv() {
+	c := make(chan bool)
+	go func() {
+		close(c)
+		for i := 0; ; i++ {
+			// Sum defined in segv.go.
+			Sum += i
+		}
+	}()
+
+	<-c
+
+	syscall.Tgkill(syscall.Getpid(), syscall.Gettid(), syscall.SIGSEGV)
+
+	// Wait for the OS to deliver the signal.
+	select {}
+}
diff --git a/src/runtime/testdata/testprog/syscall_windows.go b/src/runtime/testdata/testprog/syscall_windows.go
index b4b6644..71bf384 100644
--- a/src/runtime/testdata/testprog/syscall_windows.go
+++ b/src/runtime/testdata/testprog/syscall_windows.go
@@ -66,5 +66,8 @@
 	if err != nil {
 		panic(err)
 	}
-	print((mem2 - mem1) / threadCount)
+	// assumes that this process creates 1 thread for each
+	// thread locked goroutine plus extra 5 threads
+	// like sysmon and others
+	print((mem2 - mem1) / (threadCount + 5))
 }
diff --git a/src/runtime/testdata/testprogcgo/bindm.c b/src/runtime/testdata/testprogcgo/bindm.c
new file mode 100644
index 0000000..815d8a7
--- /dev/null
+++ b/src/runtime/testdata/testprogcgo/bindm.c
@@ -0,0 +1,34 @@
+// Copyright 2023 The Go 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:build !plan9 && !windows
+
+#include <stdint.h>
+#include <pthread.h>
+#include <unistd.h>
+#include "_cgo_export.h"
+
+#define CTHREADS 2
+#define CHECKCALLS 100
+
+static void* checkBindMThread(void* thread) {
+	int i;
+	for (i = 0; i < CHECKCALLS; i++) {
+		GoCheckBindM((uintptr_t)thread);
+		usleep(1);
+	}
+	return NULL;
+}
+
+void CheckBindM() {
+	int i;
+	pthread_t s[CTHREADS];
+
+	for (i = 0; i < CTHREADS; i++) {
+		pthread_create(&s[i], NULL, checkBindMThread, &s[i]);
+	}
+	for (i = 0; i < CTHREADS; i++) {
+		pthread_join(s[i], NULL);
+	}
+}
diff --git a/src/runtime/testdata/testprogcgo/bindm.go b/src/runtime/testdata/testprogcgo/bindm.go
new file mode 100644
index 0000000..c2003c2
--- /dev/null
+++ b/src/runtime/testdata/testprogcgo/bindm.go
@@ -0,0 +1,61 @@
+// Copyright 2023 The Go 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:build !plan9 && !windows
+
+// Test that callbacks from C to Go in the same C-thread always get the same m.
+// Make sure the extra M bind to the C-thread.
+
+package main
+
+/*
+extern void CheckBindM();
+*/
+import "C"
+
+import (
+	"fmt"
+	"os"
+	"runtime"
+	"sync"
+	"sync/atomic"
+)
+
+var (
+	mutex      = sync.Mutex{}
+	cThreadToM = map[uintptr]uintptr{}
+	started    = atomic.Uint32{}
+)
+
+// same as CTHREADS in C, make sure all the C threads are actually started.
+const cThreadNum = 2
+
+func init() {
+	register("EnsureBindM", EnsureBindM)
+}
+
+//export GoCheckBindM
+func GoCheckBindM(thread uintptr) {
+	// Wait all threads start
+	if started.Load() != cThreadNum {
+		// Only once for each thread, since it will wait all threads start.
+		started.Add(1)
+		for started.Load() < cThreadNum {
+			runtime.Gosched()
+		}
+	}
+	m := runtime_getm_for_test()
+	mutex.Lock()
+	defer mutex.Unlock()
+	if savedM, ok := cThreadToM[thread]; ok && savedM != m {
+		fmt.Printf("m == %x want %x\n", m, savedM)
+		os.Exit(1)
+	}
+	cThreadToM[thread] = m
+}
+
+func EnsureBindM() {
+	C.CheckBindM()
+	fmt.Println("OK")
+}
diff --git a/src/runtime/testdata/testprogcgo/callback.go b/src/runtime/testdata/testprogcgo/callback.go
index 25f0715..319572f 100644
--- a/src/runtime/testdata/testprogcgo/callback.go
+++ b/src/runtime/testdata/testprogcgo/callback.go
@@ -32,6 +32,8 @@
 	"fmt"
 	"os"
 	"runtime"
+	"sync/atomic"
+	_ "unsafe" // for go:linkname
 )
 
 func init() {
@@ -40,6 +42,11 @@
 
 //export go_callback
 func go_callback() {
+	if e := extraMInUse.Load(); e == 0 {
+		fmt.Printf("in callback extraMInUse got %d want >0\n", e)
+		os.Exit(1)
+	}
+
 	runtime.GC()
 	grow()
 	runtime.GC()
@@ -69,6 +76,12 @@
 	if os.Getenv("RUNTIME_TEST_SHORT") != "" {
 		P = 10
 	}
+
+	if e := extraMInUse.Load(); e != 0 {
+		fmt.Printf("before testing extraMInUse got %d want 0\n", e)
+		os.Exit(1)
+	}
+
 	done := make(chan bool)
 	// allocate a bunch of stack frames and spray them with pointers
 	for i := 0; i < P; i++ {
@@ -90,5 +103,14 @@
 	for i := 0; i < P; i++ {
 		<-done
 	}
+
+	if e := extraMInUse.Load(); e != 0 {
+		fmt.Printf("after testing extraMInUse got %d want 0\n", e)
+		os.Exit(1)
+	}
+
 	fmt.Printf("OK\n")
 }
+
+//go:linkname extraMInUse runtime.extraMInUse
+var extraMInUse atomic.Uint32
diff --git a/src/runtime/testdata/testprogcgo/destructor.c b/src/runtime/testdata/testprogcgo/destructor.c
new file mode 100644
index 0000000..8604d81
--- /dev/null
+++ b/src/runtime/testdata/testprogcgo/destructor.c
@@ -0,0 +1,22 @@
+// Copyright 2023 The Go 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 "_cgo_export.h"
+
+static void callDestructorCallback() {
+	GoDestructorCallback();
+}
+
+static void (*destructorFn)(void);
+
+void registerDestructor() {
+	destructorFn = callDestructorCallback;
+}
+
+__attribute__((destructor))
+static void destructor() {
+	if (destructorFn) {
+		destructorFn();
+	}
+}
diff --git a/src/runtime/testdata/testprogcgo/destructor.go b/src/runtime/testdata/testprogcgo/destructor.go
new file mode 100644
index 0000000..49529f0
--- /dev/null
+++ b/src/runtime/testdata/testprogcgo/destructor.go
@@ -0,0 +1,23 @@
+// Copyright 2023 The Go Authors. 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
+
+// extern void registerDestructor();
+import "C"
+
+import "fmt"
+
+func init() {
+	register("DestructorCallback", DestructorCallback)
+}
+
+//export GoDestructorCallback
+func GoDestructorCallback() {
+}
+
+func DestructorCallback() {
+	C.registerDestructor()
+	fmt.Println("OK")
+}
diff --git a/src/runtime/testdata/testprogcgo/lockosthread.go b/src/runtime/testdata/testprogcgo/lockosthread.go
index 8fcea35..e6dce36 100644
--- a/src/runtime/testdata/testprogcgo/lockosthread.go
+++ b/src/runtime/testdata/testprogcgo/lockosthread.go
@@ -94,7 +94,7 @@
 		// Exit with the thread locked.
 	}()
 	<-ready
-	for i := 0; i < 100; i++ {
+	for {
 		time.Sleep(1 * time.Millisecond)
 		// Check that this goroutine is running on a different thread.
 		self := C.pthread_self()
@@ -107,6 +107,4 @@
 			return
 		}
 	}
-	println("sub thread still running")
-	os.Exit(1)
 }
diff --git a/src/runtime/testdata/testprogcgo/raceprof.go b/src/runtime/testdata/testprogcgo/raceprof.go
index c098e16..68cabd4 100644
--- a/src/runtime/testdata/testprogcgo/raceprof.go
+++ b/src/runtime/testdata/testprogcgo/raceprof.go
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build (linux && amd64) || (freebsd && amd64)
-// +build linux,amd64 freebsd,amd64
+//go:build unix
+// +build unix
 
 package main
 
diff --git a/src/runtime/testdata/testprogcgo/racesig.go b/src/runtime/testdata/testprogcgo/racesig.go
index 9352679..0667020 100644
--- a/src/runtime/testdata/testprogcgo/racesig.go
+++ b/src/runtime/testdata/testprogcgo/racesig.go
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build (linux && amd64) || (freebsd && amd64)
-// +build linux,amd64 freebsd,amd64
+//go:build unix
+// +build unix
 
 package main
 
@@ -81,8 +81,6 @@
 
 import (
 	"fmt"
-	"os"
-	"time"
 )
 
 func init() {
@@ -90,14 +88,6 @@
 }
 
 func CgoRaceSignal() {
-	// The failure symptom is that the program hangs because of a
-	// deadlock in malloc, so set an alarm.
-	go func() {
-		time.Sleep(5 * time.Second)
-		fmt.Println("Hung for 5 seconds")
-		os.Exit(1)
-	}()
-
 	C.runRaceSignalThread()
 	fmt.Println("OK")
 }
diff --git a/src/runtime/testdata/testprogcgo/segv.go b/src/runtime/testdata/testprogcgo/segv.go
index bf5aa31..c776fe6 100644
--- a/src/runtime/testdata/testprogcgo/segv.go
+++ b/src/runtime/testdata/testprogcgo/segv.go
@@ -3,7 +3,6 @@
 // license that can be found in the LICENSE file.
 
 //go:build unix
-// +build unix
 
 package main
 
@@ -14,29 +13,9 @@
 import "syscall"
 
 func init() {
-	register("Segv", Segv)
 	register("SegvInCgo", SegvInCgo)
 }
 
-var Sum int
-
-func Segv() {
-	c := make(chan bool)
-	go func() {
-		close(c)
-		for i := 0; ; i++ {
-			Sum += i
-		}
-	}()
-
-	<-c
-
-	syscall.Kill(syscall.Getpid(), syscall.SIGSEGV)
-
-	// Wait for the OS to deliver the signal.
-	C.pause()
-}
-
 func SegvInCgo() {
 	c := make(chan bool)
 	go func() {
diff --git a/src/runtime/testdata/testprogcgo/segv_linux.go b/src/runtime/testdata/testprogcgo/segv_linux.go
index fe93778..517ce72 100644
--- a/src/runtime/testdata/testprogcgo/segv_linux.go
+++ b/src/runtime/testdata/testprogcgo/segv_linux.go
@@ -11,28 +11,9 @@
 import "syscall"
 
 func init() {
-	register("TgkillSegv", TgkillSegv)
 	register("TgkillSegvInCgo", TgkillSegvInCgo)
 }
 
-func TgkillSegv() {
-	c := make(chan bool)
-	go func() {
-		close(c)
-		for i := 0; ; i++ {
-			// Sum defined in segv.go.
-			Sum += i
-		}
-	}()
-
-	<-c
-
-	syscall.Tgkill(syscall.Getpid(), syscall.Gettid(), syscall.SIGSEGV)
-
-	// Wait for the OS to deliver the signal.
-	C.pause()
-}
-
 func TgkillSegvInCgo() {
 	c := make(chan bool)
 	go func() {
diff --git a/src/runtime/testdata/testprogcgo/stack_windows.go b/src/runtime/testdata/testprogcgo/stack_windows.go
index 846297a..0be1126 100644
--- a/src/runtime/testdata/testprogcgo/stack_windows.go
+++ b/src/runtime/testdata/testprogcgo/stack_windows.go
@@ -50,5 +50,8 @@
 	if err != nil {
 		panic(err)
 	}
-	print((mem2 - mem1) / threadCount)
+	// assumes that this process creates 1 thread for each
+	// thread locked goroutine plus extra 5 threads
+	// like sysmon and others
+	print((mem2 - mem1) / (threadCount + 5))
 }
diff --git a/src/runtime/testdata/testprogcgo/trace.go b/src/runtime/testdata/testprogcgo/trace.go
new file mode 100644
index 0000000..875434b
--- /dev/null
+++ b/src/runtime/testdata/testprogcgo/trace.go
@@ -0,0 +1,60 @@
+// Copyright 2023 The Go Authors. 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
+
+/*
+// Defined in trace_*.c.
+void cCalledFromGo(void);
+*/
+import "C"
+import (
+	"context"
+	"fmt"
+	"log"
+	"os"
+	"runtime/trace"
+)
+
+func init() {
+	register("Trace", Trace)
+}
+
+// Trace is used by TestTraceUnwindCGO.
+func Trace() {
+	file, err := os.CreateTemp("", "testprogcgo_trace")
+	if err != nil {
+		log.Fatalf("failed to create temp file: %s", err)
+	}
+	defer file.Close()
+
+	if err := trace.Start(file); err != nil {
+		log.Fatal(err)
+	}
+	defer trace.Stop()
+
+	goCalledFromGo()
+	<-goCalledFromCThreadChan
+
+	fmt.Printf("trace path:%s", file.Name())
+}
+
+// goCalledFromGo calls cCalledFromGo which calls back into goCalledFromC and
+// goCalledFromCThread.
+func goCalledFromGo() {
+	C.cCalledFromGo()
+}
+
+//export goCalledFromC
+func goCalledFromC() {
+	trace.Log(context.Background(), "goCalledFromC", "")
+}
+
+var goCalledFromCThreadChan = make(chan struct{})
+
+//export goCalledFromCThread
+func goCalledFromCThread() {
+	trace.Log(context.Background(), "goCalledFromCThread", "")
+	close(goCalledFromCThreadChan)
+}
diff --git a/src/runtime/testdata/testprogcgo/trace_unix.c b/src/runtime/testdata/testprogcgo/trace_unix.c
new file mode 100644
index 0000000..0fa55c7
--- /dev/null
+++ b/src/runtime/testdata/testprogcgo/trace_unix.c
@@ -0,0 +1,27 @@
+// Copyright 2023 The Go 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:build unix
+
+// The unix C definitions for trace.go. That file uses //export so
+// it can't put function definitions in the "C" import comment.
+
+#include <pthread.h>
+#include <assert.h>
+
+extern void goCalledFromC(void);
+extern void goCalledFromCThread(void);
+
+static void* cCalledFromCThread(void *p) {
+	goCalledFromCThread();
+	return NULL;
+}
+
+void cCalledFromGo(void) {
+	goCalledFromC();
+
+	pthread_t thread;
+	assert(pthread_create(&thread, NULL, cCalledFromCThread, NULL) == 0);
+	assert(pthread_join(thread, NULL) == 0);
+}
diff --git a/src/runtime/testdata/testprogcgo/trace_windows.c b/src/runtime/testdata/testprogcgo/trace_windows.c
new file mode 100644
index 0000000..7758054
--- /dev/null
+++ b/src/runtime/testdata/testprogcgo/trace_windows.c
@@ -0,0 +1,29 @@
+// Copyright 2023 The Go 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 windows C definitions for trace.go. That file uses //export so
+// it can't put function definitions in the "C" import comment.
+
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#include <process.h>
+#include "_cgo_export.h"
+
+extern void goCalledFromC(void);
+extern void goCalledFromCThread(void);
+
+__stdcall
+static unsigned int cCalledFromCThread(void *p) {
+	goCalledFromCThread();
+	return 0;
+}
+
+void cCalledFromGo(void) {
+	goCalledFromC();
+
+	uintptr_t thread;
+	thread = _beginthreadex(NULL, 0, cCalledFromCThread, NULL, 0, NULL);
+	WaitForSingleObject((HANDLE)thread, INFINITE);
+	CloseHandle((HANDLE)thread);
+}
diff --git a/src/runtime/testdata/testsuid/main.go b/src/runtime/testdata/testsuid/main.go
new file mode 100644
index 0000000..1949d2d
--- /dev/null
+++ b/src/runtime/testdata/testsuid/main.go
@@ -0,0 +1,25 @@
+// Copyright 2023 The Go Authors. 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"
+	"log"
+	"os"
+)
+
+func main() {
+	if os.Geteuid() == os.Getuid() {
+		os.Exit(99)
+	}
+
+	fmt.Fprintf(os.Stdout, "GOTRACEBACK=%s\n", os.Getenv("GOTRACEBACK"))
+	f, err := os.OpenFile(os.Getenv("TEST_OUTPUT"), os.O_CREATE|os.O_RDWR, 0600)
+	if err != nil {
+		log.Fatalf("os.Open failed: %s", err)
+	}
+	defer f.Close()
+	fmt.Fprintf(os.Stderr, "hello\n")
+}
diff --git a/src/runtime/testdata/testwinlib/main.c b/src/runtime/testdata/testwinlib/main.c
index c3fe3cb..55ee657 100644
--- a/src/runtime/testdata/testwinlib/main.c
+++ b/src/runtime/testdata/testwinlib/main.c
@@ -11,8 +11,15 @@
         exceptionCount++;
         // prepare context to resume execution
         CONTEXT *c = ExceptionInfo->ContextRecord;
-        c->Rip = *(ULONG_PTR *)c->Rsp;
+#ifdef _AMD64_
+        c->Rip = *(DWORD64 *)c->Rsp;
         c->Rsp += 8;
+#elif defined(_X86_)
+        c->Eip = *(DWORD *)c->Esp;
+        c->Esp += 4;
+#else
+        c->Pc = c->Lr;
+#endif
         return EXCEPTION_CONTINUE_EXECUTION;
     }
     return EXCEPTION_CONTINUE_SEARCH;
diff --git a/src/runtime/testdata/testwintls/main.c b/src/runtime/testdata/testwintls/main.c
new file mode 100644
index 0000000..6061828
--- /dev/null
+++ b/src/runtime/testdata/testwintls/main.c
@@ -0,0 +1,29 @@
+// Copyright 2023 The Go 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 <windows.h>
+
+int main(int argc, char **argv) {
+    if (argc < 3) {
+        return 1;
+    }
+    // Allocate more than 64 TLS indices
+    // so the Go runtime doesn't find
+    // enough space in the TEB TLS slots.
+    for (int i = 0; i < 65; i++) {
+        TlsAlloc();
+    }
+    HMODULE hlib = LoadLibrary(argv[1]);
+    if (hlib == NULL) {
+        return 2;
+    }
+    FARPROC proc = GetProcAddress(hlib, argv[2]);
+    if (proc == NULL) {
+        return 3;
+    }
+    if (proc() != 42) {
+        return 4;
+    }
+    return 0;
+}
\ No newline at end of file
diff --git a/src/runtime/testdata/testwintls/main.go b/src/runtime/testdata/testwintls/main.go
new file mode 100644
index 0000000..1cf296c
--- /dev/null
+++ b/src/runtime/testdata/testwintls/main.go
@@ -0,0 +1,12 @@
+// Copyright 2023 The Go Authors. 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 "C"
+
+//export GoFunc
+func GoFunc() int { return 42 }
+
+func main() {}
diff --git a/src/runtime/textflag.h b/src/runtime/textflag.h
index 214075e..8930312 100644
--- a/src/runtime/textflag.h
+++ b/src/runtime/textflag.h
@@ -28,7 +28,6 @@
 #define TLSBSS	256
 // Do not insert instructions to allocate a stack frame for this function.
 // Only valid on functions that declare a frame size of 0.
-// TODO(mwhudson): only implemented for ppc64x at present.
 #define NOFRAME 512
 // Function can call reflect.Type.Method or reflect.Type.MethodByName.
 #define REFLECTMETHOD 1024
diff --git a/src/runtime/time.go b/src/runtime/time.go
index 6cd70b7..c05351c 100644
--- a/src/runtime/time.go
+++ b/src/runtime/time.go
@@ -192,7 +192,7 @@
 	if t.nextwhen < 0 { // check for overflow.
 		t.nextwhen = maxWhen
 	}
-	gopark(resetForSleep, unsafe.Pointer(t), waitReasonSleep, traceEvGoSleep, 1)
+	gopark(resetForSleep, unsafe.Pointer(t), waitReasonSleep, traceBlockSleep, 1)
 }
 
 // resetForSleep is called after the goroutine is parked for timeSleep.
@@ -1137,7 +1137,7 @@
 
 // badTimer is called if the timer data structures have been corrupted,
 // presumably due to racy use by the program. We panic here rather than
-// panicing due to invalid slice access while holding locks.
+// panicking due to invalid slice access while holding locks.
 // See issue #25686.
 func badTimer() {
 	throw("timer data corruption")
diff --git a/src/runtime/time_test.go b/src/runtime/time_test.go
index afd9af2..f086820 100644
--- a/src/runtime/time_test.go
+++ b/src/runtime/time_test.go
@@ -22,7 +22,7 @@
 
 	// Faketime is advanced in checkdead. External linking brings in cgo,
 	// causing checkdead not working.
-	testenv.MustInternalLink(t)
+	testenv.MustInternalLink(t, false)
 
 	t.Parallel()
 
diff --git a/src/runtime/time_windows_arm.s b/src/runtime/time_windows_arm.s
index 711af88..8d4469f 100644
--- a/src/runtime/time_windows_arm.s
+++ b/src/runtime/time_windows_arm.s
@@ -8,7 +8,7 @@
 #include "textflag.h"
 #include "time_windows.h"
 
-TEXT time·now(SB),NOSPLIT|NOFRAME,$0-20
+TEXT time·now(SB),NOSPLIT,$0-20
 	MOVW    $0, R0
 	MOVB    runtime·useQPCTime(SB), R0
 	CMP	$0, R0
@@ -86,5 +86,5 @@
 	MOVW	R1,nsec+8(FP)
 	RET
 useQPC:
-	B	runtime·nowQPC(SB)		// tail call
+	RET	runtime·nowQPC(SB)		// tail call
 
diff --git a/src/runtime/time_windows_arm64.s b/src/runtime/time_windows_arm64.s
index e0c7d28..7943d6b 100644
--- a/src/runtime/time_windows_arm64.s
+++ b/src/runtime/time_windows_arm64.s
@@ -8,7 +8,7 @@
 #include "textflag.h"
 #include "time_windows.h"
 
-TEXT time·now(SB),NOSPLIT|NOFRAME,$0-24
+TEXT time·now(SB),NOSPLIT,$0-24
 	MOVB    runtime·useQPCTime(SB), R0
 	CMP	$0, R0
 	BNE	useQPC
@@ -43,5 +43,5 @@
 	MOVW	R0, nsec+8(FP)
 	RET
 useQPC:
-	B	runtime·nowQPC(SB)		// tail call
+	RET	runtime·nowQPC(SB)		// tail call
 
diff --git a/src/runtime/timestub2.go b/src/runtime/timestub2.go
index b9a5cc6..49bfeb6 100644
--- a/src/runtime/timestub2.go
+++ b/src/runtime/timestub2.go
@@ -2,8 +2,9 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build !aix && !darwin && !freebsd && !openbsd && !solaris && !windows && !(linux && amd64)
+//go:build !aix && !darwin && !freebsd && !openbsd && !solaris && !wasip1 && !windows && !(linux && amd64)
 
 package runtime
 
+//go:wasmimport gojs runtime.walltime
 func walltime() (sec int64, nsec int32)
diff --git a/src/runtime/tls_mipsx.s b/src/runtime/tls_mipsx.s
index acc3eb5..71806f4 100644
--- a/src/runtime/tls_mipsx.s
+++ b/src/runtime/tls_mipsx.s
@@ -10,7 +10,7 @@
 #include "textflag.h"
 
 // If !iscgo, this is a no-op.
-// NOTE: gogo asumes load_g only clobers g (R30) and REGTMP (R23)
+// NOTE: gogo assumes load_g only clobers g (R30) and REGTMP (R23)
 TEXT runtime·save_g(SB),NOSPLIT|NOFRAME,$0-0
 	MOVB	runtime·iscgo(SB), R23
 	BEQ	R23, nocgo
diff --git a/src/runtime/trace.go b/src/runtime/trace.go
index e7dfab1..7d7987c 100644
--- a/src/runtime/trace.go
+++ b/src/runtime/trace.go
@@ -13,7 +13,9 @@
 package runtime
 
 import (
+	"internal/abi"
 	"internal/goarch"
+	"internal/goos"
 	"runtime/internal/atomic"
 	"runtime/internal/sys"
 	"unsafe"
@@ -30,8 +32,8 @@
 	traceEvProcStop          = 6  // stop of P [timestamp]
 	traceEvGCStart           = 7  // GC start [timestamp, seq, stack id]
 	traceEvGCDone            = 8  // GC done [timestamp]
-	traceEvGCSTWStart        = 9  // GC STW start [timestamp, kind]
-	traceEvGCSTWDone         = 10 // GC STW done [timestamp]
+	traceEvSTWStart          = 9  // STW start [timestamp, kind]
+	traceEvSTWDone           = 10 // STW done [timestamp]
 	traceEvGCSweepStart      = 11 // GC sweep start [timestamp, stack id]
 	traceEvGCSweepDone       = 12 // GC sweep done [timestamp, swept, reclaimed]
 	traceEvGoCreate          = 13 // goroutine creation [timestamp, new goroutine id, new stack id, stack id]
@@ -57,7 +59,7 @@
 	traceEvHeapAlloc         = 33 // gcController.heapLive change [timestamp, heap_alloc]
 	traceEvHeapGoal          = 34 // gcController.heapGoal() (formerly next_gc) change [timestamp, heap goal in bytes]
 	traceEvTimerGoroutine    = 35 // not currently used; previously denoted timer goroutine [timer goroutine id]
-	traceEvFutileWakeup      = 36 // denotes that the previous wakeup of this goroutine was futile [timestamp]
+	traceEvFutileWakeup      = 36 // not currently used; denotes that the previous wakeup of this goroutine was futile [timestamp]
 	traceEvString            = 37 // string dictionary entry [ID, length, string]
 	traceEvGoStartLocal      = 38 // goroutine starts running on the same P as the last event [timestamp, goroutine id]
 	traceEvGoUnblockLocal    = 39 // goroutine is unblocked on the same P as the last event [timestamp, goroutine id, stack]
@@ -66,17 +68,46 @@
 	traceEvGoBlockGC         = 42 // goroutine blocks on GC assist [timestamp, stack]
 	traceEvGCMarkAssistStart = 43 // GC mark assist start [timestamp, stack]
 	traceEvGCMarkAssistDone  = 44 // GC mark assist done [timestamp]
-	traceEvUserTaskCreate    = 45 // trace.NewContext [timestamp, internal task id, internal parent task id, stack, name string]
+	traceEvUserTaskCreate    = 45 // trace.NewTask [timestamp, internal task id, internal parent task id, name string, stack]
 	traceEvUserTaskEnd       = 46 // end of a task [timestamp, internal task id, stack]
-	traceEvUserRegion        = 47 // trace.WithRegion [timestamp, internal task id, mode(0:start, 1:end), stack, name string]
+	traceEvUserRegion        = 47 // trace.WithRegion [timestamp, internal task id, mode(0:start, 1:end), name string, stack]
 	traceEvUserLog           = 48 // trace.Log [timestamp, internal task id, key string id, stack, value string]
-	traceEvCPUSample         = 49 // CPU profiling sample [timestamp, stack, real timestamp, real P id (-1 when absent), goroutine id]
+	traceEvCPUSample         = 49 // CPU profiling sample [timestamp, real timestamp, real P id (-1 when absent), goroutine id, stack]
 	traceEvCount             = 50
 	// Byte is used but only 6 bits are available for event type.
 	// The remaining 2 bits are used to specify the number of arguments.
 	// That means, the max event type value is 63.
 )
 
+// traceBlockReason is an enumeration of reasons a goroutine might block.
+// This is the interface the rest of the runtime uses to tell the
+// tracer why a goroutine blocked. The tracer then propagates this information
+// into the trace however it sees fit.
+//
+// Note that traceBlockReasons should not be compared, since reasons that are
+// distinct by name may *not* be distinct by value.
+type traceBlockReason uint8
+
+// For maximal efficiency, just map the trace block reason directly to a trace
+// event.
+const (
+	traceBlockGeneric         traceBlockReason = traceEvGoBlock
+	traceBlockForever                          = traceEvGoStop
+	traceBlockNet                              = traceEvGoBlockNet
+	traceBlockSelect                           = traceEvGoBlockSelect
+	traceBlockCondWait                         = traceEvGoBlockCond
+	traceBlockSync                             = traceEvGoBlockSync
+	traceBlockChanSend                         = traceEvGoBlockSend
+	traceBlockChanRecv                         = traceEvGoBlockRecv
+	traceBlockGCMarkAssist                     = traceEvGoBlockGC
+	traceBlockGCSweep                          = traceEvGoBlock
+	traceBlockSystemGoroutine                  = traceEvGoBlock
+	traceBlockPreempted                        = traceEvGoBlock
+	traceBlockDebugCall                        = traceEvGoBlock
+	traceBlockUntilGCEnds                      = traceEvGoBlock
+	traceBlockSleep                            = traceEvGoSleep
+)
+
 const (
 	// Timestamps in trace are cputicks/traceTickDiv.
 	// This makes absolute values of timestamp diffs smaller,
@@ -85,9 +116,7 @@
 	// The suggested increment frequency for PowerPC's time base register is
 	// 512 MHz according to Power ISA v2.07 section 6.2, so we use 16 on ppc64
 	// and ppc64le.
-	// Tracing won't work reliably for architectures where cputicks is emulated
-	// by nanotime, so the value doesn't matter for those architectures.
-	traceTickDiv = 16 + 48*(goarch.Is386|goarch.IsAmd64)
+	traceTimeDiv = 16 + 48*(goarch.Is386|goarch.IsAmd64)
 	// Maximum number of PCs in a single stack trace.
 	// Since events contain only stack id rather than whole stack trace,
 	// we can allow quite large values here.
@@ -98,13 +127,6 @@
 	traceBytesPerNumber = 10
 	// Shift of the number of arguments in the first event byte.
 	traceArgCountShift = 6
-	// Flag passed to traceGoPark to denote that the previous wakeup of this
-	// goroutine was futile. 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.
-	traceFutileWakeup byte = 128
 )
 
 // trace is global tracing context.
@@ -112,17 +134,18 @@
 	// trace.lock must only be acquired on the system stack where
 	// stack splits cannot happen while it is held.
 	lock          mutex       // protects the following members
-	lockOwner     *g          // to avoid deadlocks during recursive lock locks
 	enabled       bool        // when set runtime traces events
 	shutdown      bool        // set when we are waiting for trace reader to finish after setting enabled to false
 	headerWritten bool        // whether ReadTrace has emitted trace header
 	footerWritten bool        // whether ReadTrace has emitted trace footer
 	shutdownSema  uint32      // used to wait for ReadTrace completion
 	seqStart      uint64      // sequence number when tracing was started
-	ticksStart    int64       // cputicks when tracing was started
-	ticksEnd      int64       // cputicks when tracing was stopped
-	timeStart     int64       // nanotime when tracing was started
-	timeEnd       int64       // nanotime when tracing was stopped
+	startTicks    int64       // cputicks when tracing was started
+	endTicks      int64       // cputicks when tracing was stopped
+	startNanotime int64       // nanotime when tracing was started
+	endNanotime   int64       // nanotime when tracing was stopped
+	startTime     traceTime   // traceClockNow when tracing started
+	endTime       traceTime   // traceClockNow when tracing stopped
 	seqGC         uint64      // GC start/done sequencer
 	reading       traceBufPtr // buffer currently handed off to user
 	empty         traceBufPtr // stack of empty buffers
@@ -167,12 +190,48 @@
 	buf     traceBufPtr // global trace buffer, used when running without a p
 }
 
+// gTraceState is per-G state for the tracer.
+type gTraceState struct {
+	sysExitTime        traceTime // timestamp when syscall has returned
+	tracedSyscallEnter bool      // syscall or cgo was entered while trace was enabled or StartTrace has emitted EvGoInSyscall about this goroutine
+	seq                uint64    // trace event sequencer
+	lastP              puintptr  // last P emitted an event for this goroutine
+}
+
+// mTraceState is per-M state for the tracer.
+type mTraceState struct {
+	startingTrace  bool // this M is in TraceStart, potentially before traceEnabled is true
+	tracedSTWStart bool // this M traced a STW start, so it should trace an end
+}
+
+// pTraceState is per-P state for the tracer.
+type pTraceState struct {
+	buf traceBufPtr
+
+	// inSweep indicates the sweep events should be traced.
+	// This is used to defer the sweep start event until a span
+	// has actually been swept.
+	inSweep bool
+
+	// swept and reclaimed track the number of bytes swept and reclaimed
+	// by sweeping in the current sweep loop (while inSweep was true).
+	swept, reclaimed uintptr
+}
+
+// traceLockInit initializes global trace locks.
+func traceLockInit() {
+	lockInit(&trace.bufLock, lockRankTraceBuf)
+	lockInit(&trace.stringsLock, lockRankTraceStrings)
+	lockInit(&trace.lock, lockRankTrace)
+	lockInit(&trace.stackTab.lock, lockRankTraceStackTab)
+}
+
 // traceBufHeader is per-P tracing buffer.
 type traceBufHeader struct {
-	link      traceBufPtr             // in trace.empty/full
-	lastTicks uint64                  // when we wrote the last event
-	pos       int                     // next write offset in arr
-	stk       [traceStackSize]uintptr // scratch buffer for traceback
+	link     traceBufPtr             // in trace.empty/full
+	lastTime traceTime               // when we wrote the last event
+	pos      int                     // next write offset in arr
+	stk      [traceStackSize]uintptr // scratch buffer for traceback
 }
 
 // traceBuf is per-P tracing buffer.
@@ -197,6 +256,20 @@
 	return traceBufPtr(unsafe.Pointer(b))
 }
 
+// traceEnabled returns true if the trace is currently enabled.
+//
+//go:nosplit
+func traceEnabled() bool {
+	return trace.enabled
+}
+
+// traceShuttingDown returns true if the trace is currently shutting down.
+//
+//go:nosplit
+func traceShuttingDown() bool {
+	return trace.shutdown
+}
+
 // StartTrace enables tracing for the current process.
 // While tracing, the data will be buffered and available via ReadTrace.
 // StartTrace returns an error if tracing is already enabled.
@@ -208,7 +281,7 @@
 	// Do not stop the world during GC so we ensure we always see
 	// a consistent view of GC-related events (e.g. a start is always
 	// paired with an end).
-	stopTheWorldGC("start tracing")
+	stopTheWorldGC(stwStartTrace)
 
 	// Prevent sysmon from running any code that could generate events.
 	lock(&sched.sysmonlock)
@@ -232,10 +305,10 @@
 	// That would lead to an inconsistent trace:
 	// - either GoSysExit appears before EvGoInSyscall,
 	// - or GoSysExit appears for a goroutine for which we don't emit EvGoInSyscall below.
-	// To instruct traceEvent that it must not ignore events below, we set startingtrace.
+	// To instruct traceEvent that it must not ignore events below, we set trace.startingTrace.
 	// trace.enabled is set afterwards once we have emitted all preliminary events.
 	mp := getg().m
-	mp.startingtrace = true
+	mp.trace.startingTrace = true
 
 	// Obtain current stack ID to use in all traceEvGoCreate events below.
 	stkBuf := make([]uintptr, traceStackSize)
@@ -257,43 +330,52 @@
 	forEachGRace(func(gp *g) {
 		status := readgstatus(gp)
 		if status != _Gdead {
-			gp.traceseq = 0
-			gp.tracelastp = getg().m.p
+			gp.trace.seq = 0
+			gp.trace.lastP = getg().m.p
 			// +PCQuantum because traceFrameForPC expects return PCs and subtracts PCQuantum.
-			id := trace.stackTab.put([]uintptr{startPCforTrace(gp.startpc) + sys.PCQuantum})
+			id := trace.stackTab.put([]uintptr{logicalStackSentinel, startPCforTrace(gp.startpc) + sys.PCQuantum})
 			traceEvent(traceEvGoCreate, -1, gp.goid, uint64(id), stackID)
 		}
 		if status == _Gwaiting {
 			// traceEvGoWaiting is implied to have seq=1.
-			gp.traceseq++
+			gp.trace.seq++
 			traceEvent(traceEvGoWaiting, -1, gp.goid)
 		}
 		if status == _Gsyscall {
-			gp.traceseq++
+			gp.trace.seq++
+			gp.trace.tracedSyscallEnter = true
 			traceEvent(traceEvGoInSyscall, -1, gp.goid)
 		} else if status == _Gdead && gp.m != nil && gp.m.isextra {
 			// Trigger two trace events for the dead g in the extra m,
 			// since the next event of the g will be traceEvGoSysExit in exitsyscall,
 			// while calling from C thread to Go.
-			gp.traceseq = 0
-			gp.tracelastp = getg().m.p
+			gp.trace.seq = 0
+			gp.trace.lastP = getg().m.p
 			// +PCQuantum because traceFrameForPC expects return PCs and subtracts PCQuantum.
-			id := trace.stackTab.put([]uintptr{startPCforTrace(0) + sys.PCQuantum}) // no start pc
+			id := trace.stackTab.put([]uintptr{logicalStackSentinel, startPCforTrace(0) + sys.PCQuantum}) // no start pc
 			traceEvent(traceEvGoCreate, -1, gp.goid, uint64(id), stackID)
-			gp.traceseq++
+			gp.trace.seq++
+			gp.trace.tracedSyscallEnter = true
 			traceEvent(traceEvGoInSyscall, -1, gp.goid)
 		} else {
-			gp.sysblocktraced = false
+			// We need to explicitly clear the flag. A previous trace might have ended with a goroutine
+			// not emitting a GoSysExit and clearing the flag, leaving it in a stale state. Clearing
+			// it here makes it unambiguous to any goroutine exiting a syscall racing with us that
+			// no EvGoInSyscall event was emitted for it. (It's not racy to set this flag here, because
+			// it'll only get checked when the goroutine runs again, which will be after the world starts
+			// again.)
+			gp.trace.tracedSyscallEnter = false
 		}
 	})
 	traceProcStart()
 	traceGoStart()
-	// Note: ticksStart needs to be set after we emit traceEvGoInSyscall events.
+	// Note: startTicks needs to be set after we emit traceEvGoInSyscall events.
 	// If we do it the other way around, it is possible that exitsyscall will
-	// query sysexitticks after ticksStart but before traceEvGoInSyscall timestamp.
+	// query sysExitTime after startTicks but before traceEvGoInSyscall timestamp.
 	// It will lead to a false conclusion that cputicks is broken.
-	trace.ticksStart = cputicks()
-	trace.timeStart = nanotime()
+	trace.startTime = traceClockNow()
+	trace.startTicks = cputicks()
+	trace.startNanotime = nanotime()
 	trace.headerWritten = false
 	trace.footerWritten = false
 
@@ -304,7 +386,7 @@
 	trace.strings = make(map[string]uint64)
 
 	trace.seqGC = 0
-	mp.startingtrace = false
+	mp.trace.startingTrace = false
 	trace.enabled = true
 
 	// Register runtime goroutine labels.
@@ -312,12 +394,15 @@
 	for i, label := range gcMarkWorkerModeStrings[:] {
 		trace.markWorkerLabels[i], bufp = traceString(bufp, pid, label)
 	}
-	traceReleaseBuffer(pid)
+	traceReleaseBuffer(mp, pid)
 
 	unlock(&trace.bufLock)
 
 	unlock(&sched.sysmonlock)
 
+	// Record the current state of HeapGoal to avoid information loss in trace.
+	traceHeapGoal()
+
 	startTheWorldGC()
 	return nil
 }
@@ -327,7 +412,7 @@
 func StopTrace() {
 	// Stop the world so that we can collect the trace buffers from all p's below,
 	// and also to avoid races with traceEvent.
-	stopTheWorldGC("stop tracing")
+	stopTheWorldGC(stwStopTrace)
 
 	// See the comment in StartTrace.
 	lock(&sched.sysmonlock)
@@ -351,10 +436,10 @@
 	// Loop over all allocated Ps because dead Ps may still have
 	// trace buffers.
 	for _, p := range allp[:cap(allp)] {
-		buf := p.tracebuf
+		buf := p.trace.buf
 		if buf != 0 {
 			traceFullQueue(buf)
-			p.tracebuf = 0
+			p.trace.buf = 0
 		}
 	}
 	if trace.buf != 0 {
@@ -372,11 +457,17 @@
 		}
 	}
 
+	// Wait for startNanotime != endNanotime. On Windows the default interval between
+	// system clock ticks is typically between 1 and 15 milliseconds, which may not
+	// have passed since the trace started. Without nanotime moving forward, trace
+	// tooling has no way of identifying how much real time each cputicks time deltas
+	// represent.
 	for {
-		trace.ticksEnd = cputicks()
-		trace.timeEnd = nanotime()
-		// Windows time can tick only every 15ms, wait for at least one tick.
-		if trace.timeEnd != trace.timeStart {
+		trace.endTime = traceClockNow()
+		trace.endTicks = cputicks()
+		trace.endNanotime = nanotime()
+
+		if trace.endNanotime != trace.startNanotime || faketime != 0 {
 			break
 		}
 		osyield()
@@ -401,7 +492,7 @@
 		// The lock protects us from races with StartTrace/StopTrace because they do stop-the-world.
 		lock(&trace.lock)
 		for _, p := range allp[:cap(allp)] {
-			if p.tracebuf != 0 {
+			if p.trace.buf != 0 {
 				throw("trace: non-empty trace buffer in proc")
 			}
 		}
@@ -458,7 +549,7 @@
 			}
 
 			return true
-		}, nil, waitReasonTraceReaderBlocked, traceEvGoBlock, 2)
+		}, nil, waitReasonTraceReaderBlocked, traceBlockSystemGoroutine, 2)
 		goto top
 	}
 
@@ -481,20 +572,23 @@
 		defer func() { getg().racectx = 0 }()
 	}
 
-	// This function may need to lock trace.lock recursively
-	// (goparkunlock -> traceGoPark -> traceEvent -> traceFlush).
-	// To allow this we use trace.lockOwner.
-	// Also this function must not allocate while holding trace.lock:
+	// Optimistically look for CPU profile samples. This may write new stack
+	// records, and may write new tracing buffers. This must be done with the
+	// trace lock not held. footerWritten and shutdown are safe to access
+	// here. They are only mutated by this goroutine or during a STW.
+	if !trace.footerWritten && !trace.shutdown {
+		traceReadCPU()
+	}
+
+	// This function must not allocate while holding trace.lock:
 	// allocation can call heap allocate, which will try to emit a trace
 	// event while holding heap lock.
 	lock(&trace.lock)
-	trace.lockOwner = getg().m.curg
 
 	if trace.reader.Load() != nil {
 		// More than one goroutine reads trace. This is bad.
 		// But we rather do not crash the program because of tracing,
 		// because tracing can be enabled at runtime on prod servers.
-		trace.lockOwner = nil
 		unlock(&trace.lock)
 		println("runtime: ReadTrace called from multiple goroutines simultaneously")
 		return nil, false
@@ -508,21 +602,14 @@
 	// Write trace header.
 	if !trace.headerWritten {
 		trace.headerWritten = true
-		trace.lockOwner = nil
 		unlock(&trace.lock)
-		return []byte("go 1.19 trace\x00\x00\x00"), false
-	}
-	// Optimistically look for CPU profile samples. This may write new stack
-	// records, and may write new tracing buffers.
-	if !trace.footerWritten && !trace.shutdown {
-		traceReadCPU()
+		return []byte("go 1.21 trace\x00\x00\x00"), false
 	}
 	// Wait for new data.
 	if trace.fullHead == 0 && !trace.shutdown {
 		// We don't simply use a note because the scheduler
 		// executes this goroutine directly when it wakes up
 		// (also a note would consume an M).
-		trace.lockOwner = nil
 		unlock(&trace.lock)
 		return nil, true
 	}
@@ -532,7 +619,6 @@
 	if trace.fullHead != 0 {
 		buf := traceFullDequeue()
 		trace.reading = buf
-		trace.lockOwner = nil
 		unlock(&trace.lock)
 		return buf.ptr().arr[:buf.ptr().pos], false
 	}
@@ -540,12 +626,10 @@
 	// Write footer with timer frequency.
 	if !trace.footerWritten {
 		trace.footerWritten = true
-		// Use float64 because (trace.ticksEnd - trace.ticksStart) * 1e9 can overflow int64.
-		freq := float64(trace.ticksEnd-trace.ticksStart) * 1e9 / float64(trace.timeEnd-trace.timeStart) / traceTickDiv
+		freq := (float64(trace.endTicks-trace.startTicks) / traceTimeDiv) / (float64(trace.endNanotime-trace.startNanotime) / 1e9)
 		if freq <= 0 {
 			throw("trace: ReadTrace got invalid frequency")
 		}
-		trace.lockOwner = nil
 		unlock(&trace.lock)
 
 		// Write frequency event.
@@ -566,7 +650,6 @@
 	}
 	// Done.
 	if trace.shutdown {
-		trace.lockOwner = nil
 		unlock(&trace.lock)
 		if raceenabled {
 			// Model synchronization on trace.shutdownSema, which race
@@ -579,7 +662,6 @@
 		return nil, false
 	}
 	// Also bad, but see the comment above.
-	trace.lockOwner = nil
 	unlock(&trace.lock)
 	println("runtime: spurious wakeup of trace reader")
 	return nil, false
@@ -622,8 +704,8 @@
 //
 //go:systemstack
 func traceProcFree(pp *p) {
-	buf := pp.tracebuf
-	pp.tracebuf = 0
+	buf := pp.trace.buf
+	pp.trace.buf = 0
 	if buf == 0 {
 		return
 	}
@@ -675,8 +757,8 @@
 	// during tracing in exitsyscall is resolved by locking trace.bufLock in traceLockBuffer.
 	//
 	// Note trace_userTaskCreate runs the same check.
-	if !trace.enabled && !mp.startingtrace {
-		traceReleaseBuffer(pid)
+	if !trace.enabled && !mp.trace.startingTrace {
+		traceReleaseBuffer(mp, pid)
 		return
 	}
 
@@ -686,7 +768,7 @@
 		}
 	}
 	traceEventLocked(0, mp, pid, bufp, ev, 0, skip, args...)
-	traceReleaseBuffer(pid)
+	traceReleaseBuffer(mp, pid)
 }
 
 // traceEventLocked writes a single event of type ev to the trace buffer bufp,
@@ -717,16 +799,12 @@
 		bufp.set(buf)
 	}
 
-	// NOTE: ticks might be same after tick division, although the real cputicks is
-	// linear growth.
-	ticks := uint64(cputicks()) / traceTickDiv
-	tickDiff := ticks - buf.lastTicks
-	if tickDiff == 0 {
-		ticks = buf.lastTicks + 1
-		tickDiff = 1
+	ts := traceClockNow()
+	if ts <= buf.lastTime {
+		ts = buf.lastTime + 1
 	}
-
-	buf.lastTicks = ticks
+	tsDiff := uint64(ts - buf.lastTime)
+	buf.lastTime = ts
 	narg := byte(len(args))
 	if stackID != 0 || skip >= 0 {
 		narg++
@@ -744,7 +822,7 @@
 		buf.varint(0)
 		lenp = &buf.arr[buf.pos-1]
 	}
-	buf.varint(tickDiff)
+	buf.varint(tsDiff)
 	for _, a := range args {
 		buf.varint(a)
 	}
@@ -776,7 +854,7 @@
 	}
 
 	// Match the clock used in traceEventLocked
-	now := cputicks()
+	now := traceClockNow()
 	// The "header" here is the ID of the P that was running the profiled code,
 	// followed by the ID of the goroutine. (For normal CPU profiling, it's
 	// usually the number of samples with the given stack.) Near syscalls, pp
@@ -803,7 +881,7 @@
 		// Note: we don't pass a tag pointer here (how should profiling tags
 		// interact with the execution tracer?), but if we did we'd need to be
 		// careful about write barriers. See the long comment in profBuf.write.
-		log.write(nil, now, hdr[:], stk)
+		log.write(nil, int64(now), hdr[:], stk)
 	}
 
 	trace.signalLock.Store(0)
@@ -859,27 +937,59 @@
 				})
 				buf = bufp.ptr()
 			}
-			for i := range stk {
-				if i >= len(buf.stk) {
-					break
-				}
-				buf.stk[i] = uintptr(stk[i])
+			nstk := 1
+			buf.stk[0] = logicalStackSentinel
+			for ; nstk < len(buf.stk) && nstk-1 < len(stk); nstk++ {
+				buf.stk[nstk] = uintptr(stk[nstk-1])
 			}
-			stackID := trace.stackTab.put(buf.stk[:len(stk)])
+			stackID := trace.stackTab.put(buf.stk[:nstk])
 
-			traceEventLocked(0, nil, 0, bufp, traceEvCPUSample, stackID, 1, timestamp/traceTickDiv, ppid, goid)
+			traceEventLocked(0, nil, 0, bufp, traceEvCPUSample, stackID, 1, uint64(timestamp), ppid, goid)
 		}
 	}
 }
 
-func traceStackID(mp *m, buf []uintptr, skip int) uint64 {
+// logicalStackSentinel is a sentinel value at pcBuf[0] signifying that
+// pcBuf[1:] holds a logical stack requiring no further processing. Any other
+// value at pcBuf[0] represents a skip value to apply to the physical stack in
+// pcBuf[1:] after inline expansion.
+const logicalStackSentinel = ^uintptr(0)
+
+// traceStackID captures a stack trace into pcBuf, registers it in the trace
+// stack table, and returns its unique ID. pcBuf should have a length equal to
+// traceStackSize. skip controls the number of leaf frames to omit in order to
+// hide tracer internals from stack traces, see CL 5523.
+func traceStackID(mp *m, pcBuf []uintptr, skip int) uint64 {
 	gp := getg()
 	curgp := mp.curg
-	var nstk int
-	if curgp == gp {
-		nstk = callers(skip+1, buf)
-	} else if curgp != nil {
-		nstk = gcallers(curgp, skip, buf)
+	nstk := 1
+	if tracefpunwindoff() || mp.hasCgoOnStack() {
+		// Slow path: Unwind using default unwinder. Used when frame pointer
+		// unwinding is unavailable or disabled (tracefpunwindoff), or might
+		// produce incomplete results or crashes (hasCgoOnStack). Note that no
+		// cgo callback related crashes have been observed yet. The main
+		// motivation is to take advantage of a potentially registered cgo
+		// symbolizer.
+		pcBuf[0] = logicalStackSentinel
+		if curgp == gp {
+			nstk += callers(skip+1, pcBuf[1:])
+		} else if curgp != nil {
+			nstk += gcallers(curgp, skip, pcBuf[1:])
+		}
+	} else {
+		// Fast path: Unwind using frame pointers.
+		pcBuf[0] = uintptr(skip)
+		if curgp == gp {
+			nstk += fpTracebackPCs(unsafe.Pointer(getfp()), pcBuf[1:])
+		} else if curgp != nil {
+			// We're called on the g0 stack through mcall(fn) or systemstack(fn). To
+			// behave like gcallers above, we start unwinding from sched.bp, which
+			// points to the caller frame of the leaf frame on g's stack. The return
+			// address of the leaf frame is stored in sched.pc, which we manually
+			// capture here.
+			pcBuf[1] = curgp.sched.pc
+			nstk += 1 + fpTracebackPCs(unsafe.Pointer(curgp.sched.bp), pcBuf[2:])
+		}
 	}
 	if nstk > 0 {
 		nstk-- // skip runtime.goexit
@@ -887,10 +997,31 @@
 	if nstk > 0 && curgp.goid == 1 {
 		nstk-- // skip runtime.main
 	}
-	id := trace.stackTab.put(buf[:nstk])
+	id := trace.stackTab.put(pcBuf[:nstk])
 	return uint64(id)
 }
 
+// tracefpunwindoff returns true if frame pointer unwinding for the tracer is
+// disabled via GODEBUG or not supported by the architecture.
+// TODO(#60254): support frame pointer unwinding on plan9/amd64.
+func tracefpunwindoff() bool {
+	return debug.tracefpunwindoff != 0 || (goarch.ArchFamily != goarch.AMD64 && goarch.ArchFamily != goarch.ARM64) || goos.IsPlan9 == 1
+}
+
+// fpTracebackPCs populates pcBuf with the return addresses for each frame and
+// returns the number of PCs written to pcBuf. The returned PCs correspond to
+// "physical frames" rather than "logical frames"; that is if A is inlined into
+// B, this will return a PC for only B.
+func fpTracebackPCs(fp unsafe.Pointer, pcBuf []uintptr) (i int) {
+	for i = 0; i < len(pcBuf) && fp != nil; i++ {
+		// return addr sits one word above the frame pointer
+		pcBuf[i] = *(*uintptr)(unsafe.Pointer(uintptr(fp) + goarch.PtrSize))
+		// follow the frame pointer to the next one
+		fp = unsafe.Pointer(*(*uintptr)(fp))
+	}
+	return i
+}
+
 // traceAcquireBuffer returns trace buffer to use and, if necessary, locks it.
 func traceAcquireBuffer() (mp *m, pid int32, bufp *traceBufPtr) {
 	// Any time we acquire a buffer, we may end up flushing it,
@@ -900,28 +1031,24 @@
 
 	mp = acquirem()
 	if p := mp.p.ptr(); p != nil {
-		return mp, p.id, &p.tracebuf
+		return mp, p.id, &p.trace.buf
 	}
 	lock(&trace.bufLock)
 	return mp, traceGlobProc, &trace.buf
 }
 
 // traceReleaseBuffer releases a buffer previously acquired with traceAcquireBuffer.
-func traceReleaseBuffer(pid int32) {
+func traceReleaseBuffer(mp *m, pid int32) {
 	if pid == traceGlobProc {
 		unlock(&trace.bufLock)
 	}
-	releasem(getg().m)
+	releasem(mp)
 }
 
 // lockRankMayTraceFlush records the lock ranking effects of a
 // potential call to traceFlush.
 func lockRankMayTraceFlush() {
-	owner := trace.lockOwner
-	dolock := owner == nil || owner != getg().m.curg
-	if dolock {
-		lockWithRankMayAcquire(&trace.lock, getLockRank(&trace.lock))
-	}
+	lockWithRankMayAcquire(&trace.lock, getLockRank(&trace.lock))
 }
 
 // traceFlush puts buf onto stack of full buffers and returns an empty buffer.
@@ -930,11 +1057,7 @@
 //
 //go:systemstack
 func traceFlush(buf traceBufPtr, pid int32) traceBufPtr {
-	owner := trace.lockOwner
-	dolock := owner == nil || owner != getg().m.curg
-	if dolock {
-		lock(&trace.lock)
-	}
+	lock(&trace.lock)
 	if buf != 0 {
 		traceFullQueue(buf)
 	}
@@ -952,18 +1075,16 @@
 	bufp.pos = 0
 
 	// initialize the buffer for a new batch
-	ticks := uint64(cputicks()) / traceTickDiv
-	if ticks == bufp.lastTicks {
-		ticks = bufp.lastTicks + 1
+	ts := traceClockNow()
+	if ts <= bufp.lastTime {
+		ts = bufp.lastTime + 1
 	}
-	bufp.lastTicks = ticks
+	bufp.lastTime = ts
 	bufp.byte(traceEvBatch | 1<<traceArgCountShift)
 	bufp.varint(uint64(pid))
-	bufp.varint(ticks)
+	bufp.varint(uint64(ts))
 
-	if dolock {
-		unlock(&trace.lock)
-	}
+	unlock(&trace.lock)
 	return buf
 }
 
@@ -1117,9 +1238,7 @@
 		id = stk.id
 		stk.n = len(pcs)
 		stkpc := stk.stack()
-		for i, pc := range pcs {
-			stkpc[i] = pc
-		}
+		copy(stkpc, pcs)
 		part := int(hash % uintptr(len(tab.tab)))
 		stk.link = tab.tab[part]
 		atomicstorep(unsafe.Pointer(&tab.tab[part]), unsafe.Pointer(stk))
@@ -1177,7 +1296,7 @@
 		stk := tab.tab[i].ptr()
 		for ; stk != nil; stk = stk.link.ptr() {
 			var frames []traceFrame
-			frames, bufp = traceFrames(bufp, stk.stack())
+			frames, bufp = traceFrames(bufp, fpunwindExpand(stk.stack()))
 
 			// Estimate the size of this record. This
 			// bound is pretty loose, but avoids counting
@@ -1217,6 +1336,62 @@
 	return bufp
 }
 
+// fpunwindExpand checks if pcBuf contains logical frames (which include inlined
+// frames) or physical frames (produced by frame pointer unwinding) using a
+// sentinel value in pcBuf[0]. Logical frames are simply returned without the
+// sentinel. Physical frames are turned into logical frames via inline unwinding
+// and by applying the skip value that's stored in pcBuf[0].
+func fpunwindExpand(pcBuf []uintptr) []uintptr {
+	if len(pcBuf) > 0 && pcBuf[0] == logicalStackSentinel {
+		// pcBuf contains logical rather than inlined frames, skip has already been
+		// applied, just return it without the sentinel value in pcBuf[0].
+		return pcBuf[1:]
+	}
+
+	var (
+		cache      pcvalueCache
+		lastFuncID = abi.FuncIDNormal
+		newPCBuf   = make([]uintptr, 0, traceStackSize)
+		skip       = pcBuf[0]
+		// skipOrAdd skips or appends retPC to newPCBuf and returns true if more
+		// pcs can be added.
+		skipOrAdd = func(retPC uintptr) bool {
+			if skip > 0 {
+				skip--
+			} else {
+				newPCBuf = append(newPCBuf, retPC)
+			}
+			return len(newPCBuf) < cap(newPCBuf)
+		}
+	)
+
+outer:
+	for _, retPC := range pcBuf[1:] {
+		callPC := retPC - 1
+		fi := findfunc(callPC)
+		if !fi.valid() {
+			// There is no funcInfo if callPC belongs to a C function. In this case
+			// we still keep the pc, but don't attempt to expand inlined frames.
+			if more := skipOrAdd(retPC); !more {
+				break outer
+			}
+			continue
+		}
+
+		u, uf := newInlineUnwinder(fi, callPC, &cache)
+		for ; uf.valid(); uf = u.next(uf) {
+			sf := u.srcFunc(uf)
+			if sf.funcID == abi.FuncIDWrapper && elideWrapperCalling(lastFuncID) {
+				// ignore wrappers
+			} else if more := skipOrAdd(uf.pc + 1); !more {
+				break outer
+			}
+			lastFuncID = sf.funcID
+		}
+	}
+	return newPCBuf
+}
+
 type traceFrame struct {
 	PC     uintptr
 	funcID uint64
@@ -1329,12 +1504,23 @@
 	traceEvent(traceEvGCDone, -1)
 }
 
-func traceGCSTWStart(kind int) {
-	traceEvent(traceEvGCSTWStart, -1, uint64(kind))
+func traceSTWStart(reason stwReason) {
+	// Don't trace if this STW is for trace start/stop, since traceEnabled
+	// switches during a STW.
+	if reason == stwStartTrace || reason == stwStopTrace {
+		return
+	}
+	getg().m.trace.tracedSTWStart = true
+	traceEvent(traceEvSTWStart, -1, uint64(reason))
 }
 
-func traceGCSTWDone() {
-	traceEvent(traceEvGCSTWDone, -1)
+func traceSTWDone() {
+	mp := getg().m
+	if !mp.trace.tracedSTWStart {
+		return
+	}
+	mp.trace.tracedSTWStart = false
+	traceEvent(traceEvSTWDone, -1)
 }
 
 // traceGCSweepStart prepares to trace a sweep loop. This does not
@@ -1346,10 +1532,10 @@
 	// Delay the actual GCSweepStart event until the first span
 	// sweep. If we don't sweep anything, don't emit any events.
 	pp := getg().m.p.ptr()
-	if pp.traceSweep {
+	if pp.trace.inSweep {
 		throw("double traceGCSweepStart")
 	}
-	pp.traceSweep, pp.traceSwept, pp.traceReclaimed = true, 0, 0
+	pp.trace.inSweep, pp.trace.swept, pp.trace.reclaimed = true, 0, 0
 }
 
 // traceGCSweepSpan traces the sweep of a single page.
@@ -1358,23 +1544,23 @@
 // pair; however, it will not emit any trace events in this case.
 func traceGCSweepSpan(bytesSwept uintptr) {
 	pp := getg().m.p.ptr()
-	if pp.traceSweep {
-		if pp.traceSwept == 0 {
+	if pp.trace.inSweep {
+		if pp.trace.swept == 0 {
 			traceEvent(traceEvGCSweepStart, 1)
 		}
-		pp.traceSwept += bytesSwept
+		pp.trace.swept += bytesSwept
 	}
 }
 
 func traceGCSweepDone() {
 	pp := getg().m.p.ptr()
-	if !pp.traceSweep {
+	if !pp.trace.inSweep {
 		throw("missing traceGCSweepStart")
 	}
-	if pp.traceSwept != 0 {
-		traceEvent(traceEvGCSweepDone, -1, uint64(pp.traceSwept), uint64(pp.traceReclaimed))
+	if pp.trace.swept != 0 {
+		traceEvent(traceEvGCSweepDone, -1, uint64(pp.trace.swept), uint64(pp.trace.reclaimed))
 	}
-	pp.traceSweep = false
+	pp.trace.inSweep = false
 }
 
 func traceGCMarkAssistStart() {
@@ -1386,24 +1572,24 @@
 }
 
 func traceGoCreate(newg *g, pc uintptr) {
-	newg.traceseq = 0
-	newg.tracelastp = getg().m.p
+	newg.trace.seq = 0
+	newg.trace.lastP = getg().m.p
 	// +PCQuantum because traceFrameForPC expects return PCs and subtracts PCQuantum.
-	id := trace.stackTab.put([]uintptr{startPCforTrace(pc) + sys.PCQuantum})
+	id := trace.stackTab.put([]uintptr{logicalStackSentinel, startPCforTrace(pc) + sys.PCQuantum})
 	traceEvent(traceEvGoCreate, 2, newg.goid, uint64(id))
 }
 
 func traceGoStart() {
 	gp := getg().m.curg
 	pp := gp.m.p
-	gp.traceseq++
+	gp.trace.seq++
 	if pp.ptr().gcMarkWorkerMode != gcMarkWorkerNotWorker {
-		traceEvent(traceEvGoStartLabel, -1, gp.goid, gp.traceseq, trace.markWorkerLabels[pp.ptr().gcMarkWorkerMode])
-	} else if gp.tracelastp == pp {
+		traceEvent(traceEvGoStartLabel, -1, gp.goid, gp.trace.seq, trace.markWorkerLabels[pp.ptr().gcMarkWorkerMode])
+	} else if gp.trace.lastP == pp {
 		traceEvent(traceEvGoStartLocal, -1, gp.goid)
 	} else {
-		gp.tracelastp = pp
-		traceEvent(traceEvGoStart, -1, gp.goid, gp.traceseq)
+		gp.trace.lastP = pp
+		traceEvent(traceEvGoStart, -1, gp.goid, gp.trace.seq)
 	}
 }
 
@@ -1413,44 +1599,68 @@
 
 func traceGoSched() {
 	gp := getg()
-	gp.tracelastp = gp.m.p
+	gp.trace.lastP = gp.m.p
 	traceEvent(traceEvGoSched, 1)
 }
 
 func traceGoPreempt() {
 	gp := getg()
-	gp.tracelastp = gp.m.p
+	gp.trace.lastP = gp.m.p
 	traceEvent(traceEvGoPreempt, 1)
 }
 
-func traceGoPark(traceEv byte, skip int) {
-	if traceEv&traceFutileWakeup != 0 {
-		traceEvent(traceEvFutileWakeup, -1)
-	}
-	traceEvent(traceEv & ^traceFutileWakeup, skip)
+func traceGoPark(reason traceBlockReason, skip int) {
+	// Convert the block reason directly to a trace event type.
+	// See traceBlockReason for more information.
+	traceEvent(byte(reason), skip)
 }
 
 func traceGoUnpark(gp *g, skip int) {
 	pp := getg().m.p
-	gp.traceseq++
-	if gp.tracelastp == pp {
+	gp.trace.seq++
+	if gp.trace.lastP == pp {
 		traceEvent(traceEvGoUnblockLocal, skip, gp.goid)
 	} else {
-		gp.tracelastp = pp
-		traceEvent(traceEvGoUnblock, skip, gp.goid, gp.traceseq)
+		gp.trace.lastP = pp
+		traceEvent(traceEvGoUnblock, skip, gp.goid, gp.trace.seq)
 	}
 }
 
 func traceGoSysCall() {
-	traceEvent(traceEvGoSysCall, 1)
+	var skip int
+	switch {
+	case tracefpunwindoff():
+		// Unwind by skipping 1 frame relative to gp.syscallsp which is captured 3
+		// frames above this frame. For frame pointer unwinding we produce the same
+		// results by hard coding the number of frames in between our caller and the
+		// actual syscall, see cases below.
+		// TODO(felixge): Implement gp.syscallbp to avoid this workaround?
+		skip = 1
+	case GOOS == "solaris" || GOOS == "illumos":
+		// These platforms don't use a libc_read_trampoline.
+		skip = 3
+	default:
+		// Skip the extra trampoline frame used on most systems.
+		skip = 4
+	}
+	getg().m.curg.trace.tracedSyscallEnter = true
+	traceEvent(traceEvGoSysCall, skip)
 }
 
-func traceGoSysExit(ts int64) {
-	if ts != 0 && ts < trace.ticksStart {
-		// There is a race between the code that initializes sysexitticks
+func traceGoSysExit() {
+	gp := getg().m.curg
+	if !gp.trace.tracedSyscallEnter {
+		// There was no syscall entry traced for us at all, so there's definitely
+		// no EvGoSysBlock or EvGoInSyscall before us, which EvGoSysExit requires.
+		return
+	}
+	gp.trace.tracedSyscallEnter = false
+	ts := gp.trace.sysExitTime
+	if ts != 0 && ts < trace.startTime {
+		// There is a race between the code that initializes sysExitTimes
 		// (in exitsyscall, which runs without a P, and therefore is not
 		// stopped with the rest of the world) and the code that initializes
-		// a new trace. The recorded sysexitticks must therefore be treated
+		// a new trace. The recorded sysExitTime must therefore be treated
 		// as "best effort". If they are valid for this trace, then great,
 		// use them for greater accuracy. But if they're not valid for this
 		// trace, assume that the trace was started after the actual syscall
@@ -1458,10 +1668,10 @@
 		// aka right now), and assign a fresh time stamp to keep the log consistent.
 		ts = 0
 	}
-	gp := getg().m.curg
-	gp.traceseq++
-	gp.tracelastp = gp.m.p
-	traceEvent(traceEvGoSysExit, -1, gp.goid, gp.traceseq, uint64(ts)/traceTickDiv)
+	gp.trace.sysExitTime = 0
+	gp.trace.seq++
+	gp.trace.lastP = gp.m.p
+	traceEvent(traceEvGoSysExit, -1, gp.goid, gp.trace.seq, uint64(ts))
 }
 
 func traceGoSysBlock(pp *p) {
@@ -1500,14 +1710,14 @@
 
 	// Same as in traceEvent.
 	mp, pid, bufp := traceAcquireBuffer()
-	if !trace.enabled && !mp.startingtrace {
-		traceReleaseBuffer(pid)
+	if !trace.enabled && !mp.trace.startingTrace {
+		traceReleaseBuffer(mp, pid)
 		return
 	}
 
 	typeStringID, bufp := traceString(bufp, pid, taskType)
 	traceEventLocked(0, mp, pid, bufp, traceEvUserTaskCreate, 0, 3, id, parentID, typeStringID)
-	traceReleaseBuffer(pid)
+	traceReleaseBuffer(mp, pid)
 }
 
 //go:linkname trace_userTaskEnd runtime/trace.userTaskEnd
@@ -1522,14 +1732,14 @@
 	}
 
 	mp, pid, bufp := traceAcquireBuffer()
-	if !trace.enabled && !mp.startingtrace {
-		traceReleaseBuffer(pid)
+	if !trace.enabled && !mp.trace.startingTrace {
+		traceReleaseBuffer(mp, pid)
 		return
 	}
 
 	nameStringID, bufp := traceString(bufp, pid, name)
 	traceEventLocked(0, mp, pid, bufp, traceEvUserRegion, 0, 3, id, mode, nameStringID)
-	traceReleaseBuffer(pid)
+	traceReleaseBuffer(mp, pid)
 }
 
 //go:linkname trace_userLog runtime/trace.userLog
@@ -1539,17 +1749,19 @@
 	}
 
 	mp, pid, bufp := traceAcquireBuffer()
-	if !trace.enabled && !mp.startingtrace {
-		traceReleaseBuffer(pid)
+	if !trace.enabled && !mp.trace.startingTrace {
+		traceReleaseBuffer(mp, pid)
 		return
 	}
 
 	categoryID, bufp := traceString(bufp, pid, category)
 
-	extraSpace := traceBytesPerNumber + len(message) // extraSpace for the value string
+	// The log message is recorded after all of the normal trace event
+	// arguments, including the task, category, and stack IDs. We must ask
+	// traceEventLocked to reserve extra space for the length of the message
+	// and the message itself.
+	extraSpace := traceBytesPerNumber + len(message)
 	traceEventLocked(extraSpace, mp, pid, bufp, traceEvUserLog, 0, 3, id, categoryID)
-	// traceEventLocked reserved extra space for val and len(val)
-	// in buf, so buf now has room for the following.
 	buf := bufp.ptr()
 
 	// double-check the message and its length can fit.
@@ -1561,7 +1773,7 @@
 	buf.varint(uint64(slen))
 	buf.pos += copy(buf.arr[buf.pos:], message[:slen])
 
-	traceReleaseBuffer(pid)
+	traceReleaseBuffer(mp, pid)
 }
 
 // the start PC of a goroutine for tracing purposes. If pc is a wrapper,
@@ -1571,9 +1783,36 @@
 	if !f.valid() {
 		return pc // may happen for locked g in extra M since its pc is 0.
 	}
-	w := funcdata(f, _FUNCDATA_WrapInfo)
+	w := funcdata(f, abi.FUNCDATA_WrapInfo)
 	if w == nil {
 		return pc // not a wrapper
 	}
 	return f.datap.textAddr(*(*uint32)(w))
 }
+
+// traceOneNewExtraM registers the fact that a new extra M was created with
+// the tracer. This matters if the M (which has an attached G) is used while
+// the trace is still active because if it is, we need the fact that it exists
+// to show up in the final trace.
+func traceOneNewExtraM(gp *g) {
+	// Trigger two trace events for the locked g in the extra m,
+	// since the next event of the g will be traceEvGoSysExit in exitsyscall,
+	// while calling from C thread to Go.
+	traceGoCreate(gp, 0) // no start pc
+	gp.trace.seq++
+	traceEvent(traceEvGoInSyscall, -1, gp.goid)
+}
+
+// traceTime represents a timestamp for the trace.
+type traceTime uint64
+
+// traceClockNow returns a monotonic timestamp. The clock this function gets
+// the timestamp from is specific to tracing, and shouldn't be mixed with other
+// clock sources.
+//
+// nosplit because it's called from exitsyscall, which is nosplit.
+//
+//go:nosplit
+func traceClockNow() traceTime {
+	return traceTime(cputicks() / traceTimeDiv)
+}
diff --git a/src/runtime/trace/annotation.go b/src/runtime/trace/annotation.go
index d47cb85..2666d14 100644
--- a/src/runtime/trace/annotation.go
+++ b/src/runtime/trace/annotation.go
@@ -21,11 +21,11 @@
 // like the Go execution tracer may assume there are only a bounded
 // number of unique task types in the system.
 //
-// The returned end function is used to mark the task's end.
+// The returned Task's [Task.End] method is used to mark the task's end.
 // The trace tool measures task latency as the time between task creation
-// and when the end function is called, and provides the latency
+// and when the End method is called, and provides the latency
 // distribution per task type.
-// If the end function is called multiple times, only the first
+// If the End method is called multiple times, only the first
 // call is used in the latency measurement.
 //
 //	ctx, task := trace.NewTask(ctx, "awesomeTask")
@@ -42,9 +42,9 @@
 	s := &Task{id: id}
 	return context.WithValue(pctx, traceContextKey{}, s), s
 
-	// We allocate a new task and the end function even when
-	// the tracing is disabled because the context and the detach
-	// function can be used across trace enable/disable boundaries,
+	// We allocate a new task even when
+	// the tracing is disabled because the context and task
+	// can be used across trace enable/disable boundaries,
 	// which complicates the problem.
 	//
 	// For example, consider the following scenario:
@@ -75,7 +75,7 @@
 	// TODO(hyangah): record parent id?
 }
 
-// End marks the end of the operation represented by the Task.
+// End marks the end of the operation represented by the [Task].
 func (t *Task) End() {
 	userTaskEnd(t.id)
 }
@@ -97,7 +97,7 @@
 	userLog(id, category, message)
 }
 
-// Logf is like Log, but the value is formatted using the specified format spec.
+// Logf is like [Log], but the value is formatted using the specified format spec.
 func Logf(ctx context.Context, category, format string, args ...any) {
 	if IsEnabled() {
 		// Ideally this should be just Log, but that will
@@ -141,8 +141,8 @@
 	fn()
 }
 
-// StartRegion starts a region and returns a function for marking the
-// end of the region. The returned Region's End function must be called
+// StartRegion starts a region and returns it.
+// The returned Region's [Region.End] method must be called
 // from the same goroutine where the region was started.
 // Within each goroutine, regions must nest. That is, regions started
 // after this region must be ended before this region can be ended.
diff --git a/src/runtime/trace/trace.go b/src/runtime/trace/trace.go
index 86c97e2..935d222 100644
--- a/src/runtime/trace/trace.go
+++ b/src/runtime/trace/trace.go
@@ -33,7 +33,7 @@
 //
 //	import _ "net/http/pprof"
 //
-// See the net/http/pprof package for more details about all of the
+// See the [net/http/pprof] package for more details about all of the
 // debug endpoints installed by this import.
 //
 // # User annotation
@@ -44,11 +44,11 @@
 // There are three types of user annotations: log messages, regions,
 // and tasks.
 //
-// Log emits a timestamped message to the execution trace along with
+// [Log] emits a timestamped message to the execution trace along with
 // additional information such as the category of the message and
-// which goroutine called Log. The execution tracer provides UIs to filter
+// which goroutine called [Log]. The execution tracer provides UIs to filter
 // and group goroutines using the log category and the message supplied
-// in Log.
+// in [Log].
 //
 // A region is for logging a time interval during a goroutine's execution.
 // By definition, a region starts and ends in the same goroutine.
@@ -72,10 +72,10 @@
 // operations such as an RPC request, an HTTP request, or an
 // interesting local operation which may require multiple goroutines
 // working together. Since tasks can involve multiple goroutines,
-// they are tracked via a context.Context object. NewTask creates
-// a new task and embeds it in the returned context.Context object.
+// they are tracked via a [context.Context] object. [NewTask] creates
+// a new task and embeds it in the returned [context.Context] object.
 // Log messages and regions are attached to the task, if any, in the
-// Context passed to Log and WithRegion.
+// Context passed to [Log] and [WithRegion].
 //
 // For example, assume that we decided to froth milk, extract coffee,
 // and mix milk and coffee in separate goroutines. With a task,
diff --git a/src/runtime/trace/trace_test.go b/src/runtime/trace/trace_test.go
index 19f7dbe..04a43a0 100644
--- a/src/runtime/trace/trace_test.go
+++ b/src/runtime/trace/trace_test.go
@@ -184,8 +184,9 @@
 }
 
 func TestTraceStress(t *testing.T) {
-	if runtime.GOOS == "js" {
-		t.Skip("no os.Pipe on js")
+	switch runtime.GOOS {
+	case "js", "wasip1":
+		t.Skip("no os.Pipe on " + runtime.GOOS)
 	}
 	if IsEnabled() {
 		t.Skip("skipping because -test.trace is set")
@@ -348,8 +349,9 @@
 // Do a bunch of various stuff (timers, GC, network, etc) in a separate goroutine.
 // And concurrently with all that start/stop trace 3 times.
 func TestTraceStressStartStop(t *testing.T) {
-	if runtime.GOOS == "js" {
-		t.Skip("no os.Pipe on js")
+	switch runtime.GOOS {
+	case "js", "wasip1":
+		t.Skip("no os.Pipe on " + runtime.GOOS)
 	}
 	if IsEnabled() {
 		t.Skip("skipping because -test.trace is set")
@@ -708,7 +710,7 @@
 	// of CPU samples, so we'll call that success.
 	overflowed := totalTraceSamples >= 1900
 	if traceSamples < pprofSamples {
-		t.Logf("exectution trace did not include all CPU profile samples; %d in profile, %d in trace", pprofSamples, traceSamples)
+		t.Logf("execution trace did not include all CPU profile samples; %d in profile, %d in trace", pprofSamples, traceSamples)
 		if !overflowed {
 			t.Fail()
 		}
diff --git a/src/runtime/trace_cgo_test.go b/src/runtime/trace_cgo_test.go
new file mode 100644
index 0000000..3f207aa
--- /dev/null
+++ b/src/runtime/trace_cgo_test.go
@@ -0,0 +1,105 @@
+// Copyright 2023 The Go 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:build cgo
+
+package runtime_test
+
+import (
+	"bytes"
+	"fmt"
+	"internal/testenv"
+	"internal/trace"
+	"io"
+	"os"
+	"runtime"
+	"strings"
+	"testing"
+)
+
+// TestTraceUnwindCGO verifies that trace events emitted in cgo callbacks
+// produce the same stack traces and don't cause any crashes regardless of
+// tracefpunwindoff being set to 0 or 1.
+func TestTraceUnwindCGO(t *testing.T) {
+	if *flagQuick {
+		t.Skip("-quick")
+	}
+	testenv.MustHaveGoBuild(t)
+	t.Parallel()
+
+	exe, err := buildTestProg(t, "testprogcgo")
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	logs := map[string]*trace.Event{
+		"goCalledFromC":       nil,
+		"goCalledFromCThread": nil,
+	}
+	for _, tracefpunwindoff := range []int{1, 0} {
+		env := fmt.Sprintf("GODEBUG=tracefpunwindoff=%d", tracefpunwindoff)
+		got := runBuiltTestProg(t, exe, "Trace", env)
+		prefix, tracePath, found := strings.Cut(got, ":")
+		if !found || prefix != "trace path" {
+			t.Fatalf("unexpected output:\n%s\n", got)
+		}
+		defer os.Remove(tracePath)
+
+		traceData, err := os.ReadFile(tracePath)
+		if err != nil {
+			t.Fatalf("failed to read trace: %s", err)
+		}
+		events := parseTrace(t, bytes.NewReader(traceData))
+
+		for category := range logs {
+			event := mustFindLog(t, events, category)
+			if wantEvent := logs[category]; wantEvent == nil {
+				logs[category] = event
+			} else if got, want := dumpStack(event), dumpStack(wantEvent); got != want {
+				t.Errorf("%q: got stack:\n%s\nwant stack:\n%s\n", category, got, want)
+			}
+		}
+	}
+}
+
+// mustFindLog returns the EvUserLog event with the given category in events. It
+// fails if no event or multiple events match the category.
+func mustFindLog(t *testing.T, events []*trace.Event, category string) *trace.Event {
+	t.Helper()
+	var candidates []*trace.Event
+	for _, e := range events {
+		if e.Type == trace.EvUserLog && len(e.SArgs) >= 1 && e.SArgs[0] == category {
+			candidates = append(candidates, e)
+		}
+	}
+	if len(candidates) == 0 {
+		t.Errorf("could not find log with category: %q", category)
+	} else if len(candidates) > 1 {
+		t.Errorf("found more than one log with category: %q", category)
+	}
+	return candidates[0]
+}
+
+// dumpStack returns e.Stk as a string.
+func dumpStack(e *trace.Event) string {
+	var buf bytes.Buffer
+	for _, f := range e.Stk {
+		file := strings.TrimPrefix(f.File, runtime.GOROOT())
+		fmt.Fprintf(&buf, "%s\n\t%s:%d\n", f.Fn, file, f.Line)
+	}
+	return buf.String()
+}
+
+// parseTrace parses the given trace or skips the test if the trace is broken
+// due to known issues. Partially copied from runtime/trace/trace_test.go.
+func parseTrace(t *testing.T, r io.Reader) []*trace.Event {
+	res, err := trace.Parse(r, "")
+	if err == trace.ErrTimeOrder {
+		t.Skipf("skipping trace: %v", err)
+	}
+	if err != nil {
+		t.Fatalf("failed to parse trace: %v", err)
+	}
+	return res.Events
+}
diff --git a/src/runtime/traceback.go b/src/runtime/traceback.go
index 37f35d5..72200d4 100644
--- a/src/runtime/traceback.go
+++ b/src/runtime/traceback.go
@@ -5,6 +5,7 @@
 package runtime
 
 import (
+	"internal/abi"
 	"internal/bytealg"
 	"internal/goarch"
 	"runtime/internal/sys"
@@ -21,37 +22,133 @@
 
 const usesLR = sys.MinFrameSize > 0
 
-// Generic traceback. Handles runtime stack prints (pcbuf == nil),
-// the runtime.Callers function (pcbuf != nil), as well as the garbage
-// collector (callback != nil).  A little clunky to merge these, but avoids
-// duplicating the code and all its subtlety.
-//
-// The skip argument is only valid with pcbuf != nil and counts the number
-// of logical frames to skip rather than physical frames (with inlining, a
-// PC in pcbuf can represent multiple calls).
-func gentraceback(pc0, sp0, lr0 uintptr, gp *g, skip int, pcbuf *uintptr, max int, callback func(*stkframe, unsafe.Pointer) bool, v unsafe.Pointer, flags uint) int {
-	if skip > 0 && callback != nil {
-		throw("gentraceback callback cannot be used with non-zero skip")
-	}
+const (
+	// tracebackInnerFrames is the number of innermost frames to print in a
+	// stack trace. The total maximum frames is tracebackInnerFrames +
+	// tracebackOuterFrames.
+	tracebackInnerFrames = 50
 
+	// tracebackOuterFrames is the number of outermost frames to print in a
+	// stack trace.
+	tracebackOuterFrames = 50
+)
+
+// unwindFlags control the behavior of various unwinders.
+type unwindFlags uint8
+
+const (
+	// unwindPrintErrors indicates that if unwinding encounters an error, it
+	// should print a message and stop without throwing. This is used for things
+	// like stack printing, where it's better to get incomplete information than
+	// to crash. This is also used in situations where everything may not be
+	// stopped nicely and the stack walk may not be able to complete, such as
+	// during profiling signals or during a crash.
+	//
+	// If neither unwindPrintErrors or unwindSilentErrors are set, unwinding
+	// performs extra consistency checks and throws on any error.
+	//
+	// Note that there are a small number of fatal situations that will throw
+	// regardless of unwindPrintErrors or unwindSilentErrors.
+	unwindPrintErrors unwindFlags = 1 << iota
+
+	// unwindSilentErrors silently ignores errors during unwinding.
+	unwindSilentErrors
+
+	// unwindTrap indicates that the initial PC and SP are from a trap, not a
+	// return PC from a call.
+	//
+	// The unwindTrap flag is updated during unwinding. If set, frame.pc is the
+	// address of a faulting instruction instead of the return address of a
+	// call. It also means the liveness at pc may not be known.
+	//
+	// TODO: Distinguish frame.continpc, which is really the stack map PC, from
+	// the actual continuation PC, which is computed differently depending on
+	// this flag and a few other things.
+	unwindTrap
+
+	// unwindJumpStack indicates that, if the traceback is on a system stack, it
+	// should resume tracing at the user stack when the system stack is
+	// exhausted.
+	unwindJumpStack
+)
+
+// An unwinder iterates the physical stack frames of a Go sack.
+//
+// Typical use of an unwinder looks like:
+//
+//	var u unwinder
+//	for u.init(gp, 0); u.valid(); u.next() {
+//		// ... use frame info in u ...
+//	}
+//
+// Implementation note: This is carefully structured to be pointer-free because
+// tracebacks happen in places that disallow write barriers (e.g., signals).
+// Even if this is stack-allocated, its pointer-receiver methods don't know that
+// their receiver is on the stack, so they still emit write barriers. Here we
+// address that by carefully avoiding any pointers in this type. Another
+// approach would be to split this into a mutable part that's passed by pointer
+// but contains no pointers itself and an immutable part that's passed and
+// returned by value and can contain pointers. We could potentially hide that
+// we're doing that in trivial methods that are inlined into the caller that has
+// the stack allocation, but that's fragile.
+type unwinder struct {
+	// frame is the current physical stack frame, or all 0s if
+	// there is no frame.
+	frame stkframe
+
+	// g is the G who's stack is being unwound. If the
+	// unwindJumpStack flag is set and the unwinder jumps stacks,
+	// this will be different from the initial G.
+	g guintptr
+
+	// cgoCtxt is the index into g.cgoCtxt of the next frame on the cgo stack.
+	// The cgo stack is unwound in tandem with the Go stack as we find marker frames.
+	cgoCtxt int
+
+	// calleeFuncID is the function ID of the caller of the current
+	// frame.
+	calleeFuncID abi.FuncID
+
+	// flags are the flags to this unwind. Some of these are updated as we
+	// unwind (see the flags documentation).
+	flags unwindFlags
+
+	// cache is used to cache pcvalue lookups.
+	cache pcvalueCache
+}
+
+// init initializes u to start unwinding gp's stack and positions the
+// iterator on gp's innermost frame. gp must not be the current G.
+//
+// A single unwinder can be reused for multiple unwinds.
+func (u *unwinder) init(gp *g, flags unwindFlags) {
+	// Implementation note: This starts the iterator on the first frame and we
+	// provide a "valid" method. Alternatively, this could start in a "before
+	// the first frame" state and "next" could return whether it was able to
+	// move to the next frame, but that's both more awkward to use in a "for"
+	// loop and is harder to implement because we have to do things differently
+	// for the first frame.
+	u.initAt(^uintptr(0), ^uintptr(0), ^uintptr(0), gp, flags)
+}
+
+func (u *unwinder) initAt(pc0, sp0, lr0 uintptr, gp *g, flags unwindFlags) {
 	// Don't call this "g"; it's too easy get "g" and "gp" confused.
 	if ourg := getg(); ourg == gp && ourg == ourg.m.curg {
 		// The starting sp has been passed in as a uintptr, and the caller may
 		// have other uintptr-typed stack references as well.
 		// If during one of the calls that got us here or during one of the
 		// callbacks below the stack must be grown, all these uintptr references
-		// to the stack will not be updated, and gentraceback will continue
+		// to the stack will not be updated, and traceback will continue
 		// to inspect the old stack memory, which may no longer be valid.
 		// Even if all the variables were updated correctly, it is not clear that
 		// we want to expose a traceback that begins on one stack and ends
 		// on another stack. That could confuse callers quite a bit.
-		// Instead, we require that gentraceback and any other function that
+		// Instead, we require that initAt and any other function that
 		// accepts an sp for the current goroutine (typically obtained by
 		// calling getcallersp) must not run on that goroutine's stack but
 		// instead on the g0 stack.
-		throw("gentraceback cannot trace user goroutine on its own stack")
+		throw("cannot trace user goroutine on its own stack")
 	}
-	level, _, _ := gotraceback()
 
 	if pc0 == ^uintptr(0) && sp0 == ^uintptr(0) { // Signal to fetch saved values from gp.
 		if gp.syscallsp != 0 {
@@ -69,17 +166,12 @@
 		}
 	}
 
-	nprint := 0
 	var frame stkframe
 	frame.pc = pc0
 	frame.sp = sp0
 	if usesLR {
 		frame.lr = lr0
 	}
-	waspanic := false
-	cgoCtxt := gp.cgoCtxt
-	stack := gp.stack
-	printing := pcbuf == nil && callback == nil
 
 	// If the PC is zero, it's likely a nil function call.
 	// Start in the caller's frame.
@@ -109,410 +201,329 @@
 
 	f := findfunc(frame.pc)
 	if !f.valid() {
-		if callback != nil || printing {
+		if flags&unwindSilentErrors == 0 {
 			print("runtime: g ", gp.goid, ": unknown pc ", hex(frame.pc), "\n")
-			tracebackHexdump(stack, &frame, 0)
+			tracebackHexdump(gp.stack, &frame, 0)
 		}
-		if callback != nil {
+		if flags&(unwindPrintErrors|unwindSilentErrors) == 0 {
 			throw("unknown pc")
 		}
-		return 0
+		*u = unwinder{}
+		return
 	}
 	frame.fn = f
 
-	var cache pcvalueCache
+	// Populate the unwinder.
+	*u = unwinder{
+		frame:        frame,
+		g:            gp.guintptr(),
+		cgoCtxt:      len(gp.cgoCtxt) - 1,
+		calleeFuncID: abi.FuncIDNormal,
+		flags:        flags,
+	}
 
-	lastFuncID := funcID_normal
-	n := 0
-	for n < max {
-		// Typically:
-		//	pc is the PC of the running function.
-		//	sp is the stack pointer at that program counter.
-		//	fp is the frame pointer (caller's stack pointer) at that program counter, or nil if unknown.
-		//	stk is the stack containing sp.
-		//	The caller's program counter is lr, unless lr is zero, in which case it is *(uintptr*)sp.
-		f = frame.fn
-		if f.pcsp == 0 {
-			// No frame information, must be external function, like race support.
-			// See golang.org/issue/13568.
-			break
-		}
+	isSyscall := frame.pc == pc0 && frame.sp == sp0 && pc0 == gp.syscallpc && sp0 == gp.syscallsp
+	u.resolveInternal(true, isSyscall)
+}
 
-		// Compute function info flags.
-		flag := f.flag
-		if f.funcID == funcID_cgocallback {
-			// cgocallback does write SP to switch from the g0 to the curg stack,
-			// but it carefully arranges that during the transition BOTH stacks
-			// have cgocallback frame valid for unwinding through.
-			// So we don't need to exclude it with the other SP-writing functions.
-			flag &^= funcFlag_SPWRITE
-		}
-		if frame.pc == pc0 && frame.sp == sp0 && pc0 == gp.syscallpc && sp0 == gp.syscallsp {
-			// Some Syscall functions write to SP, but they do so only after
-			// saving the entry PC/SP using entersyscall.
-			// Since we are using the entry PC/SP, the later SP write doesn't matter.
-			flag &^= funcFlag_SPWRITE
-		}
+func (u *unwinder) valid() bool {
+	return u.frame.pc != 0
+}
 
-		// Found an actual function.
-		// Derive frame pointer and link register.
-		if frame.fp == 0 {
-			// Jump over system stack transitions. If we're on g0 and there's a user
-			// goroutine, try to jump. Otherwise this is a regular call.
-			// We also defensively check that this won't switch M's on us,
-			// which could happen at critical points in the scheduler.
-			// This ensures gp.m doesn't change from a stack jump.
-			if flags&_TraceJumpStack != 0 && gp == gp.m.g0 && gp.m.curg != nil && gp.m.curg.m == gp.m {
-				switch f.funcID {
-				case funcID_morestack:
-					// morestack does not return normally -- newstack()
-					// gogo's to curg.sched. Match that.
-					// This keeps morestack() from showing up in the backtrace,
-					// but that makes some sense since it'll never be returned
-					// to.
-					gp = gp.m.curg
-					frame.pc = gp.sched.pc
-					frame.fn = findfunc(frame.pc)
-					f = frame.fn
-					flag = f.flag
-					frame.lr = gp.sched.lr
-					frame.sp = gp.sched.sp
-					stack = gp.stack
-					cgoCtxt = gp.cgoCtxt
-				case funcID_systemstack:
-					// systemstack returns normally, so just follow the
-					// stack transition.
-					if usesLR && funcspdelta(f, frame.pc, &cache) == 0 {
-						// We're at the function prologue and the stack
-						// switch hasn't happened, or epilogue where we're
-						// about to return. Just unwind normally.
-						// Do this only on LR machines because on x86
-						// systemstack doesn't have an SP delta (the CALL
-						// instruction opens the frame), therefore no way
-						// to check.
-						flag &^= funcFlag_SPWRITE
-						break
-					}
-					gp = gp.m.curg
-					frame.sp = gp.sched.sp
-					stack = gp.stack
-					cgoCtxt = gp.cgoCtxt
-					flag &^= funcFlag_SPWRITE
-				}
-			}
-			frame.fp = frame.sp + uintptr(funcspdelta(f, frame.pc, &cache))
-			if !usesLR {
-				// On x86, call instruction pushes return PC before entering new function.
-				frame.fp += goarch.PtrSize
-			}
-		}
-		var flr funcInfo
-		if flag&funcFlag_TOPFRAME != 0 {
-			// This function marks the top of the stack. Stop the traceback.
-			frame.lr = 0
-			flr = funcInfo{}
-		} else if flag&funcFlag_SPWRITE != 0 && (callback == nil || n > 0) {
-			// The function we are in does a write to SP that we don't know
-			// how to encode in the spdelta table. Examples include context
-			// switch routines like runtime.gogo but also any code that switches
-			// to the g0 stack to run host C code. Since we can't reliably unwind
-			// the SP (we might not even be on the stack we think we are),
-			// we stop the traceback here.
-			// This only applies for profiling signals (callback == nil).
-			//
-			// For a GC stack traversal (callback != nil), we should only see
-			// a function when it has voluntarily preempted itself on entry
-			// during the stack growth check. In that case, the function has
-			// not yet had a chance to do any writes to SP and is safe to unwind.
-			// isAsyncSafePoint does not allow assembly functions to be async preempted,
-			// and preemptPark double-checks that SPWRITE functions are not async preempted.
-			// So for GC stack traversal we leave things alone (this if body does not execute for n == 0)
-			// at the bottom frame of the stack. But farther up the stack we'd better not
-			// find any.
-			if callback != nil {
-				println("traceback: unexpected SPWRITE function", funcname(f))
-				throw("traceback")
-			}
-			frame.lr = 0
-			flr = funcInfo{}
-		} else {
-			var lrPtr uintptr
-			if usesLR {
-				if n == 0 && frame.sp < frame.fp || frame.lr == 0 {
-					lrPtr = frame.sp
-					frame.lr = *(*uintptr)(unsafe.Pointer(lrPtr))
-				}
-			} else {
-				if frame.lr == 0 {
-					lrPtr = frame.fp - goarch.PtrSize
-					frame.lr = uintptr(*(*uintptr)(unsafe.Pointer(lrPtr)))
-				}
-			}
-			flr = findfunc(frame.lr)
-			if !flr.valid() {
-				// This happens if you get a profiling interrupt at just the wrong time.
-				// In that context it is okay to stop early.
-				// But if callback is set, we're doing a garbage collection and must
-				// get everything, so crash loudly.
-				doPrint := printing
-				if doPrint && gp.m.incgo && f.funcID == funcID_sigpanic {
-					// We can inject sigpanic
-					// calls directly into C code,
-					// in which case we'll see a C
-					// return PC. Don't complain.
-					doPrint = false
-				}
-				if callback != nil || doPrint {
-					print("runtime: g ", gp.goid, ": unexpected return pc for ", funcname(f), " called from ", hex(frame.lr), "\n")
-					tracebackHexdump(stack, &frame, lrPtr)
-				}
-				if callback != nil {
-					throw("unknown caller pc")
-				}
-			}
-		}
+// resolveInternal fills in u.frame based on u.frame.fn, pc, and sp.
+//
+// innermost indicates that this is the first resolve on this stack. If
+// innermost is set, isSyscall indicates that the PC/SP was retrieved from
+// gp.syscall*; this is otherwise ignored.
+//
+// On entry, u.frame contains:
+//   - fn is the running function.
+//   - pc is the PC in the running function.
+//   - sp is the stack pointer at that program counter.
+//   - For the innermost frame on LR machines, lr is the program counter that called fn.
+//
+// On return, u.frame contains:
+//   - fp is the stack pointer of the caller.
+//   - lr is the program counter that called fn.
+//   - varp, argp, and continpc are populated for the current frame.
+//
+// If fn is a stack-jumping function, resolveInternal can change the entire
+// frame state to follow that stack jump.
+//
+// This is internal to unwinder.
+func (u *unwinder) resolveInternal(innermost, isSyscall bool) {
+	frame := &u.frame
+	gp := u.g.ptr()
 
-		frame.varp = frame.fp
+	f := frame.fn
+	if f.pcsp == 0 {
+		// No frame information, must be external function, like race support.
+		// See golang.org/issue/13568.
+		u.finishInternal()
+		return
+	}
+
+	// Compute function info flags.
+	flag := f.flag
+	if f.funcID == abi.FuncID_cgocallback {
+		// cgocallback does write SP to switch from the g0 to the curg stack,
+		// but it carefully arranges that during the transition BOTH stacks
+		// have cgocallback frame valid for unwinding through.
+		// So we don't need to exclude it with the other SP-writing functions.
+		flag &^= abi.FuncFlagSPWrite
+	}
+	if isSyscall {
+		// Some Syscall functions write to SP, but they do so only after
+		// saving the entry PC/SP using entersyscall.
+		// Since we are using the entry PC/SP, the later SP write doesn't matter.
+		flag &^= abi.FuncFlagSPWrite
+	}
+
+	// Found an actual function.
+	// Derive frame pointer.
+	if frame.fp == 0 {
+		// Jump over system stack transitions. If we're on g0 and there's a user
+		// goroutine, try to jump. Otherwise this is a regular call.
+		// We also defensively check that this won't switch M's on us,
+		// which could happen at critical points in the scheduler.
+		// This ensures gp.m doesn't change from a stack jump.
+		if u.flags&unwindJumpStack != 0 && gp == gp.m.g0 && gp.m.curg != nil && gp.m.curg.m == gp.m {
+			switch f.funcID {
+			case abi.FuncID_morestack:
+				// morestack does not return normally -- newstack()
+				// gogo's to curg.sched. Match that.
+				// This keeps morestack() from showing up in the backtrace,
+				// but that makes some sense since it'll never be returned
+				// to.
+				gp = gp.m.curg
+				u.g.set(gp)
+				frame.pc = gp.sched.pc
+				frame.fn = findfunc(frame.pc)
+				f = frame.fn
+				flag = f.flag
+				frame.lr = gp.sched.lr
+				frame.sp = gp.sched.sp
+				u.cgoCtxt = len(gp.cgoCtxt) - 1
+			case abi.FuncID_systemstack:
+				// systemstack returns normally, so just follow the
+				// stack transition.
+				if usesLR && funcspdelta(f, frame.pc, &u.cache) == 0 {
+					// We're at the function prologue and the stack
+					// switch hasn't happened, or epilogue where we're
+					// about to return. Just unwind normally.
+					// Do this only on LR machines because on x86
+					// systemstack doesn't have an SP delta (the CALL
+					// instruction opens the frame), therefore no way
+					// to check.
+					flag &^= abi.FuncFlagSPWrite
+					break
+				}
+				gp = gp.m.curg
+				u.g.set(gp)
+				frame.sp = gp.sched.sp
+				u.cgoCtxt = len(gp.cgoCtxt) - 1
+				flag &^= abi.FuncFlagSPWrite
+			}
+		}
+		frame.fp = frame.sp + uintptr(funcspdelta(f, frame.pc, &u.cache))
 		if !usesLR {
 			// On x86, call instruction pushes return PC before entering new function.
-			frame.varp -= goarch.PtrSize
+			frame.fp += goarch.PtrSize
 		}
+	}
 
-		// For architectures with frame pointers, if there's
-		// a frame, then there's a saved frame pointer here.
-		//
-		// NOTE: This code is not as general as it looks.
-		// On x86, the ABI is to save the frame pointer word at the
-		// top of the stack frame, so we have to back down over it.
-		// On arm64, the frame pointer should be at the bottom of
-		// the stack (with R29 (aka FP) = RSP), in which case we would
-		// not want to do the subtraction here. But we started out without
-		// any frame pointer, and when we wanted to add it, we didn't
-		// want to break all the assembly doing direct writes to 8(RSP)
-		// to set the first parameter to a called function.
-		// So we decided to write the FP link *below* the stack pointer
-		// (with R29 = RSP - 8 in Go functions).
-		// This is technically ABI-compatible but not standard.
-		// And it happens to end up mimicking the x86 layout.
-		// Other architectures may make different decisions.
-		if frame.varp > frame.sp && framepointer_enabled {
-			frame.varp -= goarch.PtrSize
-		}
-
-		frame.argp = frame.fp + sys.MinFrameSize
-
-		// Determine frame's 'continuation PC', where it can continue.
-		// Normally this is the return address on the stack, but if sigpanic
-		// is immediately below this function on the stack, then the frame
-		// stopped executing due to a trap, and frame.pc is probably not
-		// a safe point for looking up liveness information. In this panicking case,
-		// the function either doesn't return at all (if it has no defers or if the
-		// defers do not recover) or it returns from one of the calls to
-		// deferproc a second time (if the corresponding deferred func recovers).
-		// In the latter case, use a deferreturn call site as the continuation pc.
-		frame.continpc = frame.pc
-		if waspanic {
-			if frame.fn.deferreturn != 0 {
-				frame.continpc = frame.fn.entry() + uintptr(frame.fn.deferreturn) + 1
-				// Note: this may perhaps keep return variables alive longer than
-				// strictly necessary, as we are using "function has a defer statement"
-				// as a proxy for "function actually deferred something". It seems
-				// to be a minor drawback. (We used to actually look through the
-				// gp._defer for a defer corresponding to this function, but that
-				// is hard to do with defer records on the stack during a stack copy.)
-				// Note: the +1 is to offset the -1 that
-				// stack.go:getStackMap does to back up a return
-				// address make sure the pc is in the CALL instruction.
-			} else {
-				frame.continpc = 0
-			}
-		}
-
-		if callback != nil {
-			if !callback((*stkframe)(noescape(unsafe.Pointer(&frame))), v) {
-				return n
-			}
-		}
-
-		if pcbuf != nil {
-			pc := frame.pc
-			// backup to CALL instruction to read inlining info (same logic as below)
-			tracepc := pc
-			// Normally, pc is a return address. In that case, we want to look up
-			// file/line information using pc-1, because that is the pc of the
-			// call instruction (more precisely, the last byte of the call instruction).
-			// Callers expect the pc buffer to contain return addresses and do the
-			// same -1 themselves, so we keep pc unchanged.
-			// When the pc is from a signal (e.g. profiler or segv) then we want
-			// to look up file/line information using pc, and we store pc+1 in the
-			// pc buffer so callers can unconditionally subtract 1 before looking up.
-			// See issue 34123.
-			// The pc can be at function entry when the frame is initialized without
-			// actually running code, like runtime.mstart.
-			if (n == 0 && flags&_TraceTrap != 0) || waspanic || pc == f.entry() {
-				pc++
-			} else {
-				tracepc--
-			}
-
-			// If there is inlining info, record the inner frames.
-			if inldata := funcdata(f, _FUNCDATA_InlTree); inldata != nil {
-				inltree := (*[1 << 20]inlinedCall)(inldata)
-				for {
-					ix := pcdatavalue(f, _PCDATA_InlTreeIndex, tracepc, &cache)
-					if ix < 0 {
-						break
-					}
-					if inltree[ix].funcID == funcID_wrapper && elideWrapperCalling(lastFuncID) {
-						// ignore wrappers
-					} else if skip > 0 {
-						skip--
-					} else if n < max {
-						(*[1 << 20]uintptr)(unsafe.Pointer(pcbuf))[n] = pc
-						n++
-					}
-					lastFuncID = inltree[ix].funcID
-					// Back up to an instruction in the "caller".
-					tracepc = frame.fn.entry() + uintptr(inltree[ix].parentPc)
-					pc = tracepc + 1
-				}
-			}
-			// Record the main frame.
-			if f.funcID == funcID_wrapper && elideWrapperCalling(lastFuncID) {
-				// Ignore wrapper functions (except when they trigger panics).
-			} else if skip > 0 {
-				skip--
-			} else if n < max {
-				(*[1 << 20]uintptr)(unsafe.Pointer(pcbuf))[n] = pc
-				n++
-			}
-			lastFuncID = f.funcID
-			n-- // offset n++ below
-		}
-
-		if printing {
-			// assume skip=0 for printing.
-			//
-			// Never elide wrappers if we haven't printed
-			// any frames. And don't elide wrappers that
-			// called panic rather than the wrapped
-			// function. Otherwise, leave them out.
-
-			// backup to CALL instruction to read inlining info (same logic as below)
-			tracepc := frame.pc
-			if (n > 0 || flags&_TraceTrap == 0) && frame.pc > f.entry() && !waspanic {
-				tracepc--
-			}
-			// If there is inlining info, print the inner frames.
-			if inldata := funcdata(f, _FUNCDATA_InlTree); inldata != nil {
-				inltree := (*[1 << 20]inlinedCall)(inldata)
-				var inlFunc _func
-				inlFuncInfo := funcInfo{&inlFunc, f.datap}
-				for {
-					ix := pcdatavalue(f, _PCDATA_InlTreeIndex, tracepc, nil)
-					if ix < 0 {
-						break
-					}
-
-					// Create a fake _func for the
-					// inlined function.
-					inlFunc.nameOff = inltree[ix].nameOff
-					inlFunc.funcID = inltree[ix].funcID
-					inlFunc.startLine = inltree[ix].startLine
-
-					if (flags&_TraceRuntimeFrames) != 0 || showframe(inlFuncInfo, gp, nprint == 0, inlFuncInfo.funcID, lastFuncID) {
-						name := funcname(inlFuncInfo)
-						file, line := funcline(f, tracepc)
-						print(name, "(...)\n")
-						print("\t", file, ":", line, "\n")
-						nprint++
-					}
-					lastFuncID = inltree[ix].funcID
-					// Back up to an instruction in the "caller".
-					tracepc = frame.fn.entry() + uintptr(inltree[ix].parentPc)
-				}
-			}
-			if (flags&_TraceRuntimeFrames) != 0 || showframe(f, gp, nprint == 0, f.funcID, lastFuncID) {
-				// Print during crash.
-				//	main(0x1, 0x2, 0x3)
-				//		/home/rsc/go/src/runtime/x.go:23 +0xf
-				//
-				name := funcname(f)
-				file, line := funcline(f, tracepc)
-				if name == "runtime.gopanic" {
-					name = "panic"
-				}
-				print(name, "(")
-				argp := unsafe.Pointer(frame.argp)
-				printArgs(f, argp, tracepc)
-				print(")\n")
-				print("\t", file, ":", line)
-				if frame.pc > f.entry() {
-					print(" +", hex(frame.pc-f.entry()))
-				}
-				if gp.m != nil && gp.m.throwing >= throwTypeRuntime && gp == gp.m.curg || level >= 2 {
-					print(" fp=", hex(frame.fp), " sp=", hex(frame.sp), " pc=", hex(frame.pc))
-				}
-				print("\n")
-				nprint++
-			}
-			lastFuncID = f.funcID
-		}
-		n++
-
-		if f.funcID == funcID_cgocallback && len(cgoCtxt) > 0 {
-			ctxt := cgoCtxt[len(cgoCtxt)-1]
-			cgoCtxt = cgoCtxt[:len(cgoCtxt)-1]
-
-			// skip only applies to Go frames.
-			// callback != nil only used when we only care
-			// about Go frames.
-			if skip == 0 && callback == nil {
-				n = tracebackCgoContext(pcbuf, printing, ctxt, n, max)
-			}
-		}
-
-		waspanic = f.funcID == funcID_sigpanic
-		injectedCall := waspanic || f.funcID == funcID_asyncPreempt || f.funcID == funcID_debugCallV2
-
-		// Do not unwind past the bottom of the stack.
-		if !flr.valid() {
-			break
-		}
-
-		if frame.pc == frame.lr && frame.sp == frame.fp {
-			// If the next frame is identical to the current frame, we cannot make progress.
-			print("runtime: traceback stuck. pc=", hex(frame.pc), " sp=", hex(frame.sp), "\n")
-			tracebackHexdump(stack, &frame, frame.sp)
-			throw("traceback stuck")
-		}
-
-		// Unwind to next frame.
-		frame.fn = flr
-		frame.pc = frame.lr
+	// Derive link register.
+	if flag&abi.FuncFlagTopFrame != 0 {
+		// This function marks the top of the stack. Stop the traceback.
 		frame.lr = 0
-		frame.sp = frame.fp
-		frame.fp = 0
-
-		// On link register architectures, sighandler saves the LR on stack
-		// before faking a call.
-		if usesLR && injectedCall {
-			x := *(*uintptr)(unsafe.Pointer(frame.sp))
-			frame.sp += alignUp(sys.MinFrameSize, sys.StackAlign)
-			f = findfunc(frame.pc)
-			frame.fn = f
-			if !f.valid() {
-				frame.pc = x
-			} else if funcspdelta(f, frame.pc, &cache) == 0 {
-				frame.lr = x
+	} else if flag&abi.FuncFlagSPWrite != 0 && (!innermost || u.flags&(unwindPrintErrors|unwindSilentErrors) != 0) {
+		// The function we are in does a write to SP that we don't know
+		// how to encode in the spdelta table. Examples include context
+		// switch routines like runtime.gogo but also any code that switches
+		// to the g0 stack to run host C code.
+		// We can't reliably unwind the SP (we might not even be on
+		// the stack we think we are), so stop the traceback here.
+		//
+		// The one exception (encoded in the complex condition above) is that
+		// we assume if we're doing a precise traceback, and this is the
+		// innermost frame, that the SPWRITE function voluntarily preempted itself on entry
+		// during the stack growth check. In that case, the function has
+		// not yet had a chance to do any writes to SP and is safe to unwind.
+		// isAsyncSafePoint does not allow assembly functions to be async preempted,
+		// and preemptPark double-checks that SPWRITE functions are not async preempted.
+		// So for GC stack traversal, we can safely ignore SPWRITE for the innermost frame,
+		// but farther up the stack we'd better not find any.
+		// This is somewhat imprecise because we're just guessing that we're in the stack
+		// growth check. It would be better if SPWRITE were encoded in the spdelta
+		// table so we would know for sure that we were still in safe code.
+		//
+		// uSE uPE inn | action
+		//  T   _   _  | frame.lr = 0
+		//  F   T   F  | frame.lr = 0; print
+		//  F   T   T  | frame.lr = 0
+		//  F   F   F  | print; panic
+		//  F   F   T  | ignore SPWrite
+		if u.flags&unwindSilentErrors == 0 && !innermost {
+			println("traceback: unexpected SPWRITE function", funcname(f))
+			if u.flags&unwindPrintErrors == 0 {
+				throw("traceback")
+			}
+		}
+		frame.lr = 0
+	} else {
+		var lrPtr uintptr
+		if usesLR {
+			if innermost && frame.sp < frame.fp || frame.lr == 0 {
+				lrPtr = frame.sp
+				frame.lr = *(*uintptr)(unsafe.Pointer(lrPtr))
+			}
+		} else {
+			if frame.lr == 0 {
+				lrPtr = frame.fp - goarch.PtrSize
+				frame.lr = *(*uintptr)(unsafe.Pointer(lrPtr))
 			}
 		}
 	}
 
-	if printing {
-		n = nprint
+	frame.varp = frame.fp
+	if !usesLR {
+		// On x86, call instruction pushes return PC before entering new function.
+		frame.varp -= goarch.PtrSize
 	}
 
+	// For architectures with frame pointers, if there's
+	// a frame, then there's a saved frame pointer here.
+	//
+	// NOTE: This code is not as general as it looks.
+	// On x86, the ABI is to save the frame pointer word at the
+	// top of the stack frame, so we have to back down over it.
+	// On arm64, the frame pointer should be at the bottom of
+	// the stack (with R29 (aka FP) = RSP), in which case we would
+	// not want to do the subtraction here. But we started out without
+	// any frame pointer, and when we wanted to add it, we didn't
+	// want to break all the assembly doing direct writes to 8(RSP)
+	// to set the first parameter to a called function.
+	// So we decided to write the FP link *below* the stack pointer
+	// (with R29 = RSP - 8 in Go functions).
+	// This is technically ABI-compatible but not standard.
+	// And it happens to end up mimicking the x86 layout.
+	// Other architectures may make different decisions.
+	if frame.varp > frame.sp && framepointer_enabled {
+		frame.varp -= goarch.PtrSize
+	}
+
+	frame.argp = frame.fp + sys.MinFrameSize
+
+	// Determine frame's 'continuation PC', where it can continue.
+	// Normally this is the return address on the stack, but if sigpanic
+	// is immediately below this function on the stack, then the frame
+	// stopped executing due to a trap, and frame.pc is probably not
+	// a safe point for looking up liveness information. In this panicking case,
+	// the function either doesn't return at all (if it has no defers or if the
+	// defers do not recover) or it returns from one of the calls to
+	// deferproc a second time (if the corresponding deferred func recovers).
+	// In the latter case, use a deferreturn call site as the continuation pc.
+	frame.continpc = frame.pc
+	if u.calleeFuncID == abi.FuncID_sigpanic {
+		if frame.fn.deferreturn != 0 {
+			frame.continpc = frame.fn.entry() + uintptr(frame.fn.deferreturn) + 1
+			// Note: this may perhaps keep return variables alive longer than
+			// strictly necessary, as we are using "function has a defer statement"
+			// as a proxy for "function actually deferred something". It seems
+			// to be a minor drawback. (We used to actually look through the
+			// gp._defer for a defer corresponding to this function, but that
+			// is hard to do with defer records on the stack during a stack copy.)
+			// Note: the +1 is to offset the -1 that
+			// stack.go:getStackMap does to back up a return
+			// address make sure the pc is in the CALL instruction.
+		} else {
+			frame.continpc = 0
+		}
+	}
+}
+
+func (u *unwinder) next() {
+	frame := &u.frame
+	f := frame.fn
+	gp := u.g.ptr()
+
+	// Do not unwind past the bottom of the stack.
+	if frame.lr == 0 {
+		u.finishInternal()
+		return
+	}
+	flr := findfunc(frame.lr)
+	if !flr.valid() {
+		// This happens if you get a profiling interrupt at just the wrong time.
+		// In that context it is okay to stop early.
+		// But if no error flags are set, we're doing a garbage collection and must
+		// get everything, so crash loudly.
+		fail := u.flags&(unwindPrintErrors|unwindSilentErrors) == 0
+		doPrint := u.flags&unwindSilentErrors == 0
+		if doPrint && gp.m.incgo && f.funcID == abi.FuncID_sigpanic {
+			// We can inject sigpanic
+			// calls directly into C code,
+			// in which case we'll see a C
+			// return PC. Don't complain.
+			doPrint = false
+		}
+		if fail || doPrint {
+			print("runtime: g ", gp.goid, ": unexpected return pc for ", funcname(f), " called from ", hex(frame.lr), "\n")
+			tracebackHexdump(gp.stack, frame, 0)
+		}
+		if fail {
+			throw("unknown caller pc")
+		}
+		frame.lr = 0
+		u.finishInternal()
+		return
+	}
+
+	if frame.pc == frame.lr && frame.sp == frame.fp {
+		// If the next frame is identical to the current frame, we cannot make progress.
+		print("runtime: traceback stuck. pc=", hex(frame.pc), " sp=", hex(frame.sp), "\n")
+		tracebackHexdump(gp.stack, frame, frame.sp)
+		throw("traceback stuck")
+	}
+
+	injectedCall := f.funcID == abi.FuncID_sigpanic || f.funcID == abi.FuncID_asyncPreempt || f.funcID == abi.FuncID_debugCallV2
+	if injectedCall {
+		u.flags |= unwindTrap
+	} else {
+		u.flags &^= unwindTrap
+	}
+
+	// Unwind to next frame.
+	u.calleeFuncID = f.funcID
+	frame.fn = flr
+	frame.pc = frame.lr
+	frame.lr = 0
+	frame.sp = frame.fp
+	frame.fp = 0
+
+	// On link register architectures, sighandler saves the LR on stack
+	// before faking a call.
+	if usesLR && injectedCall {
+		x := *(*uintptr)(unsafe.Pointer(frame.sp))
+		frame.sp += alignUp(sys.MinFrameSize, sys.StackAlign)
+		f = findfunc(frame.pc)
+		frame.fn = f
+		if !f.valid() {
+			frame.pc = x
+		} else if funcspdelta(f, frame.pc, &u.cache) == 0 {
+			frame.lr = x
+		}
+	}
+
+	u.resolveInternal(false, false)
+}
+
+// finishInternal is an unwinder-internal helper called after the stack has been
+// exhausted. It sets the unwinder to an invalid state and checks that it
+// successfully unwound the entire stack.
+func (u *unwinder) finishInternal() {
+	u.frame.pc = 0
+
 	// Note that panic != nil is okay here: there can be leftover panics,
 	// because the defers on the panic stack do not nest in frame order as
 	// they do on the defer stack. If you have:
@@ -553,12 +564,93 @@
 	// At other times, such as when gathering a stack for a profiling signal
 	// or when printing a traceback during a crash, everything may not be
 	// stopped nicely, and the stack walk may not be able to complete.
-	if callback != nil && n < max && frame.sp != gp.stktopsp {
-		print("runtime: g", gp.goid, ": frame.sp=", hex(frame.sp), " top=", hex(gp.stktopsp), "\n")
-		print("\tstack=[", hex(gp.stack.lo), "-", hex(gp.stack.hi), "] n=", n, " max=", max, "\n")
+	gp := u.g.ptr()
+	if u.flags&(unwindPrintErrors|unwindSilentErrors) == 0 && u.frame.sp != gp.stktopsp {
+		print("runtime: g", gp.goid, ": frame.sp=", hex(u.frame.sp), " top=", hex(gp.stktopsp), "\n")
+		print("\tstack=[", hex(gp.stack.lo), "-", hex(gp.stack.hi), "\n")
 		throw("traceback did not unwind completely")
 	}
+}
 
+// symPC returns the PC that should be used for symbolizing the current frame.
+// Specifically, this is the PC of the last instruction executed in this frame.
+//
+// If this frame did a normal call, then frame.pc is a return PC, so this will
+// return frame.pc-1, which points into the CALL instruction. If the frame was
+// interrupted by a signal (e.g., profiler, segv, etc) then frame.pc is for the
+// trapped instruction, so this returns frame.pc. See issue #34123. Finally,
+// frame.pc can be at function entry when the frame is initialized without
+// actually running code, like in runtime.mstart, in which case this returns
+// frame.pc because that's the best we can do.
+func (u *unwinder) symPC() uintptr {
+	if u.flags&unwindTrap == 0 && u.frame.pc > u.frame.fn.entry() {
+		// Regular call.
+		return u.frame.pc - 1
+	}
+	// Trapping instruction or we're at the function entry point.
+	return u.frame.pc
+}
+
+// cgoCallers populates pcBuf with the cgo callers of the current frame using
+// the registered cgo unwinder. It returns the number of PCs written to pcBuf.
+// If the current frame is not a cgo frame or if there's no registered cgo
+// unwinder, it returns 0.
+func (u *unwinder) cgoCallers(pcBuf []uintptr) int {
+	if cgoTraceback == nil || u.frame.fn.funcID != abi.FuncID_cgocallback || u.cgoCtxt < 0 {
+		// We don't have a cgo unwinder (typical case), or we do but we're not
+		// in a cgo frame or we're out of cgo context.
+		return 0
+	}
+
+	ctxt := u.g.ptr().cgoCtxt[u.cgoCtxt]
+	u.cgoCtxt--
+	cgoContextPCs(ctxt, pcBuf)
+	for i, pc := range pcBuf {
+		if pc == 0 {
+			return i
+		}
+	}
+	return len(pcBuf)
+}
+
+// tracebackPCs populates pcBuf with the return addresses for each frame from u
+// and returns the number of PCs written to pcBuf. The returned PCs correspond
+// to "logical frames" rather than "physical frames"; that is if A is inlined
+// into B, this will still return a PCs for both A and B. This also includes PCs
+// generated by the cgo unwinder, if one is registered.
+//
+// If skip != 0, this skips this many logical frames.
+//
+// Callers should set the unwindSilentErrors flag on u.
+func tracebackPCs(u *unwinder, skip int, pcBuf []uintptr) int {
+	var cgoBuf [32]uintptr
+	n := 0
+	for ; n < len(pcBuf) && u.valid(); u.next() {
+		f := u.frame.fn
+		cgoN := u.cgoCallers(cgoBuf[:])
+
+		// TODO: Why does &u.cache cause u to escape? (Same in traceback2)
+		for iu, uf := newInlineUnwinder(f, u.symPC(), noEscapePtr(&u.cache)); n < len(pcBuf) && uf.valid(); uf = iu.next(uf) {
+			sf := iu.srcFunc(uf)
+			if sf.funcID == abi.FuncIDWrapper && elideWrapperCalling(u.calleeFuncID) {
+				// ignore wrappers
+			} else if skip > 0 {
+				skip--
+			} else {
+				// Callers expect the pc buffer to contain return addresses
+				// and do the -1 themselves, so we add 1 to the call PC to
+				// create a return PC.
+				pcBuf[n] = uf.pc + 1
+				n++
+			}
+			u.calleeFuncID = sf.funcID
+		}
+		// Add cgo frames (if we're done skipping over the requested number of
+		// Go frames).
+		if skip == 0 {
+			n += copy(pcBuf[n:], cgoBuf[:cgoN])
+		}
+	}
 	return n
 }
 
@@ -582,13 +674,13 @@
 		maxLen   = (maxDepth*3+2)*limit + 1 // max length of _FUNCDATA_ArgInfo (see the compiler side for reasoning)
 	)
 
-	p := (*[maxLen]uint8)(funcdata(f, _FUNCDATA_ArgInfo))
+	p := (*[maxLen]uint8)(funcdata(f, abi.FUNCDATA_ArgInfo))
 	if p == nil {
 		return
 	}
 
-	liveInfo := funcdata(f, _FUNCDATA_ArgLiveInfo)
-	liveIdx := pcdatavalue(f, _PCDATA_ArgLiveIndex, pc, nil)
+	liveInfo := funcdata(f, abi.FUNCDATA_ArgLiveInfo)
+	liveIdx := pcdatavalue(f, abi.PCDATA_ArgLiveIndex, pc, nil)
 	startOffset := uint8(0xff) // smallest offset that needs liveness info (slots with a lower offset is always live)
 	if liveInfo != nil {
 		startOffset = *(*uint8)(liveInfo)
@@ -663,50 +755,58 @@
 	}
 }
 
-// tracebackCgoContext handles tracing back a cgo context value, from
-// the context argument to setCgoTraceback, for the gentraceback
-// function. It returns the new value of n.
-func tracebackCgoContext(pcbuf *uintptr, printing bool, ctxt uintptr, n, max int) int {
-	var cgoPCs [32]uintptr
-	cgoContextPCs(ctxt, cgoPCs[:])
-	var arg cgoSymbolizerArg
-	anySymbolized := false
-	for _, pc := range cgoPCs {
-		if pc == 0 || n >= max {
-			break
-		}
-		if pcbuf != nil {
-			(*[1 << 20]uintptr)(unsafe.Pointer(pcbuf))[n] = pc
-		}
-		if printing {
-			if cgoSymbolizer == nil {
-				print("non-Go function at pc=", hex(pc), "\n")
-			} else {
-				c := printOneCgoTraceback(pc, max-n, &arg)
-				n += c - 1 // +1 a few lines down
-				anySymbolized = true
-			}
-		}
-		n++
+// funcNamePiecesForPrint returns the function name for printing to the user.
+// It returns three pieces so it doesn't need an allocation for string
+// concatenation.
+func funcNamePiecesForPrint(name string) (string, string, string) {
+	// Replace the shape name in generic function with "...".
+	i := bytealg.IndexByteString(name, '[')
+	if i < 0 {
+		return name, "", ""
 	}
-	if anySymbolized {
-		arg.pc = 0
-		callCgoSymbolizer(&arg)
+	j := len(name) - 1
+	for name[j] != ']' {
+		j--
 	}
-	return n
+	if j <= i {
+		return name, "", ""
+	}
+	return name[:i], "[...]", name[j+1:]
+}
+
+// funcNameForPrint returns the function name for printing to the user.
+func funcNameForPrint(name string) string {
+	a, b, c := funcNamePiecesForPrint(name)
+	return a + b + c
+}
+
+// printFuncName prints a function name. name is the function name in
+// the binary's func data table.
+func printFuncName(name string) {
+	if name == "runtime.gopanic" {
+		print("panic")
+		return
+	}
+	a, b, c := funcNamePiecesForPrint(name)
+	print(a, b, c)
 }
 
 func printcreatedby(gp *g) {
 	// Show what created goroutine, except main goroutine (goid 1).
 	pc := gp.gopc
 	f := findfunc(pc)
-	if f.valid() && showframe(f, gp, false, funcID_normal, funcID_normal) && gp.goid != 1 {
-		printcreatedby1(f, pc)
+	if f.valid() && showframe(f.srcFunc(), gp, false, abi.FuncIDNormal) && gp.goid != 1 {
+		printcreatedby1(f, pc, gp.parentGoid)
 	}
 }
 
-func printcreatedby1(f funcInfo, pc uintptr) {
-	print("created by ", funcname(f), "\n")
+func printcreatedby1(f funcInfo, pc uintptr, goid uint64) {
+	print("created by ")
+	printFuncName(funcname(f))
+	if goid != 0 {
+		print(" in goroutine ", goid)
+	}
+	print("\n")
 	tracepc := pc // back up to CALL instruction for funcline.
 	if pc > f.entry() {
 		tracepc -= sys.PCQuantum
@@ -737,10 +837,10 @@
 		traceback1(gp.m.libcallpc, gp.m.libcallsp, 0, gp.m.libcallg.ptr(), 0)
 		return
 	}
-	traceback1(pc, sp, lr, gp, _TraceTrap)
+	traceback1(pc, sp, lr, gp, unwindTrap)
 }
 
-func traceback1(pc, sp, lr uintptr, gp *g, flags uint) {
+func traceback1(pc, sp, lr uintptr, gp *g, flags unwindFlags) {
 	// If the goroutine is in cgo, and we have a cgo traceback, print that.
 	if iscgo && gp.m != nil && gp.m.ncgo > 0 && gp.syscallsp != 0 && gp.m.cgoCallers != nil && gp.m.cgoCallers[0] != 0 {
 		// Lock cgoCallers so that a signal handler won't
@@ -761,24 +861,90 @@
 		// Override registers if blocked in system call.
 		pc = gp.syscallpc
 		sp = gp.syscallsp
-		flags &^= _TraceTrap
+		flags &^= unwindTrap
 	}
 	if gp.m != nil && gp.m.vdsoSP != 0 {
 		// Override registers if running in VDSO. This comes after the
 		// _Gsyscall check to cover VDSO calls after entersyscall.
 		pc = gp.m.vdsoPC
 		sp = gp.m.vdsoSP
-		flags &^= _TraceTrap
+		flags &^= unwindTrap
 	}
 
-	// Print traceback. By default, omits runtime frames.
-	// If that means we print nothing at all, repeat forcing all frames printed.
-	n := gentraceback(pc, sp, lr, gp, 0, nil, _TracebackMaxFrames, nil, nil, flags)
-	if n == 0 && (flags&_TraceRuntimeFrames) == 0 {
-		n = gentraceback(pc, sp, lr, gp, 0, nil, _TracebackMaxFrames, nil, nil, flags|_TraceRuntimeFrames)
+	// Print traceback.
+	//
+	// We print the first tracebackInnerFrames frames, and the last
+	// tracebackOuterFrames frames. There are many possible approaches to this.
+	// There are various complications to this:
+	//
+	// - We'd prefer to walk the stack once because in really bad situations
+	//   traceback may crash (and we want as much output as possible) or the stack
+	//   may be changing.
+	//
+	// - Each physical frame can represent several logical frames, so we might
+	//   have to pause in the middle of a physical frame and pick up in the middle
+	//   of a physical frame.
+	//
+	// - The cgo symbolizer can expand a cgo PC to more than one logical frame,
+	//   and involves juggling state on the C side that we don't manage. Since its
+	//   expansion state is managed on the C side, we can't capture the expansion
+	//   state part way through, and because the output strings are managed on the
+	//   C side, we can't capture the output. Thus, our only choice is to replay a
+	//   whole expansion, potentially discarding some of it.
+	//
+	// Rejected approaches:
+	//
+	// - Do two passes where the first pass just counts and the second pass does
+	//   all the printing. This is undesirable if the stack is corrupted or changing
+	//   because we won't see a partial stack if we panic.
+	//
+	// - Keep a ring buffer of the last N logical frames and use this to print
+	//   the bottom frames once we reach the end of the stack. This works, but
+	//   requires keeping a surprising amount of state on the stack, and we have
+	//   to run the cgo symbolizer twice—once to count frames, and a second to
+	//   print them—since we can't retain the strings it returns.
+	//
+	// Instead, we print the outer frames, and if we reach that limit, we clone
+	// the unwinder, count the remaining frames, and then skip forward and
+	// finish printing from the clone. This makes two passes over the outer part
+	// of the stack, but the single pass over the inner part ensures that's
+	// printed immediately and not revisited. It keeps minimal state on the
+	// stack. And through a combination of skip counts and limits, we can do all
+	// of the steps we need with a single traceback printer implementation.
+	//
+	// We could be more lax about exactly how many frames we print, for example
+	// always stopping and resuming on physical frame boundaries, or at least
+	// cgo expansion boundaries. It's not clear that's much simpler.
+	flags |= unwindPrintErrors
+	var u unwinder
+	tracebackWithRuntime := func(showRuntime bool) int {
+		const maxInt int = 0x7fffffff
+		u.initAt(pc, sp, lr, gp, flags)
+		n, lastN := traceback2(&u, showRuntime, 0, tracebackInnerFrames)
+		if n < tracebackInnerFrames {
+			// We printed the whole stack.
+			return n
+		}
+		// Clone the unwinder and figure out how many frames are left. This
+		// count will include any logical frames already printed for u's current
+		// physical frame.
+		u2 := u
+		remaining, _ := traceback2(&u, showRuntime, maxInt, 0)
+		elide := remaining - lastN - tracebackOuterFrames
+		if elide > 0 {
+			print("...", elide, " frames elided...\n")
+			traceback2(&u2, showRuntime, lastN+elide, tracebackOuterFrames)
+		} else if elide <= 0 {
+			// There are tracebackOuterFrames or fewer frames left to print.
+			// Just print the rest of the stack.
+			traceback2(&u2, showRuntime, lastN, tracebackOuterFrames)
+		}
+		return n
 	}
-	if n == _TracebackMaxFrames {
-		print("...additional frames elided...\n")
+	// By default, omits runtime frames. If that means we print nothing at all,
+	// repeat forcing all frames printed.
+	if tracebackWithRuntime(false) == 0 {
+		tracebackWithRuntime(true)
 	}
 	printcreatedby(gp)
 
@@ -790,23 +956,130 @@
 	}
 }
 
+// traceback2 prints a stack trace starting at u. It skips the first "skip"
+// logical frames, after which it prints at most "max" logical frames. It
+// returns n, which is the number of logical frames skipped and printed, and
+// lastN, which is the number of logical frames skipped or printed just in the
+// physical frame that u references.
+func traceback2(u *unwinder, showRuntime bool, skip, max int) (n, lastN int) {
+	// commitFrame commits to a logical frame and returns whether this frame
+	// should be printed and whether iteration should stop.
+	commitFrame := func() (pr, stop bool) {
+		if skip == 0 && max == 0 {
+			// Stop
+			return false, true
+		}
+		n++
+		lastN++
+		if skip > 0 {
+			// Skip
+			skip--
+			return false, false
+		}
+		// Print
+		max--
+		return true, false
+	}
+
+	gp := u.g.ptr()
+	level, _, _ := gotraceback()
+	var cgoBuf [32]uintptr
+	for ; u.valid(); u.next() {
+		lastN = 0
+		f := u.frame.fn
+		for iu, uf := newInlineUnwinder(f, u.symPC(), noEscapePtr(&u.cache)); uf.valid(); uf = iu.next(uf) {
+			sf := iu.srcFunc(uf)
+			callee := u.calleeFuncID
+			u.calleeFuncID = sf.funcID
+			if !(showRuntime || showframe(sf, gp, n == 0, callee)) {
+				continue
+			}
+
+			if pr, stop := commitFrame(); stop {
+				return
+			} else if !pr {
+				continue
+			}
+
+			name := sf.name()
+			file, line := iu.fileLine(uf)
+			// Print during crash.
+			//	main(0x1, 0x2, 0x3)
+			//		/home/rsc/go/src/runtime/x.go:23 +0xf
+			//
+			printFuncName(name)
+			print("(")
+			if iu.isInlined(uf) {
+				print("...")
+			} else {
+				argp := unsafe.Pointer(u.frame.argp)
+				printArgs(f, argp, u.symPC())
+			}
+			print(")\n")
+			print("\t", file, ":", line)
+			if !iu.isInlined(uf) {
+				if u.frame.pc > f.entry() {
+					print(" +", hex(u.frame.pc-f.entry()))
+				}
+				if gp.m != nil && gp.m.throwing >= throwTypeRuntime && gp == gp.m.curg || level >= 2 {
+					print(" fp=", hex(u.frame.fp), " sp=", hex(u.frame.sp), " pc=", hex(u.frame.pc))
+				}
+			}
+			print("\n")
+		}
+
+		// Print cgo frames.
+		if cgoN := u.cgoCallers(cgoBuf[:]); cgoN > 0 {
+			var arg cgoSymbolizerArg
+			anySymbolized := false
+			stop := false
+			for _, pc := range cgoBuf[:cgoN] {
+				if cgoSymbolizer == nil {
+					if pr, stop := commitFrame(); stop {
+						break
+					} else if pr {
+						print("non-Go function at pc=", hex(pc), "\n")
+					}
+				} else {
+					stop = printOneCgoTraceback(pc, commitFrame, &arg)
+					anySymbolized = true
+					if stop {
+						break
+					}
+				}
+			}
+			if anySymbolized {
+				// Free symbolization state.
+				arg.pc = 0
+				callCgoSymbolizer(&arg)
+			}
+			if stop {
+				return
+			}
+		}
+	}
+	return n, 0
+}
+
 // printAncestorTraceback prints the traceback of the given ancestor.
 // TODO: Unify this with gentraceback and CallersFrames.
 func printAncestorTraceback(ancestor ancestorInfo) {
 	print("[originating from goroutine ", ancestor.goid, "]:\n")
 	for fidx, pc := range ancestor.pcs {
 		f := findfunc(pc) // f previously validated
-		if showfuncinfo(f, fidx == 0, funcID_normal, funcID_normal) {
+		if showfuncinfo(f.srcFunc(), fidx == 0, abi.FuncIDNormal) {
 			printAncestorTracebackFuncInfo(f, pc)
 		}
 	}
-	if len(ancestor.pcs) == _TracebackMaxFrames {
+	if len(ancestor.pcs) == tracebackInnerFrames {
 		print("...additional frames elided...\n")
 	}
 	// Show what created goroutine, except main goroutine (goid 1).
 	f := findfunc(ancestor.gopc)
-	if f.valid() && showfuncinfo(f, false, funcID_normal, funcID_normal) && ancestor.goid != 1 {
-		printcreatedby1(f, ancestor.gopc)
+	if f.valid() && showfuncinfo(f.srcFunc(), false, abi.FuncIDNormal) && ancestor.goid != 1 {
+		// In ancestor mode, we'll already print the goroutine ancestor.
+		// Pass 0 for the goid parameter so we don't print it again.
+		printcreatedby1(f, ancestor.gopc, 0)
 	}
 }
 
@@ -815,19 +1088,10 @@
 // due to only have access to the pcs at the time of the caller
 // goroutine being created.
 func printAncestorTracebackFuncInfo(f funcInfo, pc uintptr) {
-	name := funcname(f)
-	if inldata := funcdata(f, _FUNCDATA_InlTree); inldata != nil {
-		inltree := (*[1 << 20]inlinedCall)(inldata)
-		ix := pcdatavalue(f, _PCDATA_InlTreeIndex, pc, nil)
-		if ix >= 0 {
-			name = funcnameFromNameOff(f, inltree[ix].nameOff)
-		}
-	}
-	file, line := funcline(f, pc)
-	if name == "runtime.gopanic" {
-		name = "panic"
-	}
-	print(name, "(...)\n")
+	u, uf := newInlineUnwinder(f, pc, nil)
+	file, line := u.fileLine(uf)
+	printFuncName(u.srcFunc(uf).name())
+	print("(...)\n")
 	print("\t", file, ":", line)
 	if pc > f.entry() {
 		print(" +", hex(pc-f.entry()))
@@ -841,46 +1105,43 @@
 	gp := getg()
 	var n int
 	systemstack(func() {
-		n = gentraceback(pc, sp, 0, gp, skip, &pcbuf[0], len(pcbuf), nil, nil, 0)
+		var u unwinder
+		u.initAt(pc, sp, 0, gp, unwindSilentErrors)
+		n = tracebackPCs(&u, skip, pcbuf)
 	})
 	return n
 }
 
 func gcallers(gp *g, skip int, pcbuf []uintptr) int {
-	return gentraceback(^uintptr(0), ^uintptr(0), 0, gp, skip, &pcbuf[0], len(pcbuf), nil, nil, 0)
+	var u unwinder
+	u.init(gp, unwindSilentErrors)
+	return tracebackPCs(&u, skip, pcbuf)
 }
 
 // showframe reports whether the frame with the given characteristics should
 // be printed during a traceback.
-func showframe(f funcInfo, gp *g, firstFrame bool, funcID, childID funcID) bool {
+func showframe(sf srcFunc, gp *g, firstFrame bool, calleeID abi.FuncID) bool {
 	mp := getg().m
 	if mp.throwing >= throwTypeRuntime && gp != nil && (gp == mp.curg || gp == mp.caughtsig.ptr()) {
 		return true
 	}
-	return showfuncinfo(f, firstFrame, funcID, childID)
+	return showfuncinfo(sf, firstFrame, calleeID)
 }
 
 // showfuncinfo reports whether a function with the given characteristics should
 // be printed during a traceback.
-func showfuncinfo(f funcInfo, firstFrame bool, funcID, childID funcID) bool {
-	// Note that f may be a synthesized funcInfo for an inlined
-	// function, in which case only nameOff and funcID are set.
-
+func showfuncinfo(sf srcFunc, firstFrame bool, calleeID abi.FuncID) bool {
 	level, _, _ := gotraceback()
 	if level > 1 {
 		// Show all frames.
 		return true
 	}
 
-	if !f.valid() {
+	if sf.funcID == abi.FuncIDWrapper && elideWrapperCalling(calleeID) {
 		return false
 	}
 
-	if funcID == funcID_wrapper && elideWrapperCalling(childID) {
-		return false
-	}
-
-	name := funcname(f)
+	name := sf.name()
 
 	// Special case: always show runtime.gopanic frame
 	// in the middle of a stack trace, so that we can
@@ -896,6 +1157,7 @@
 
 // isExportedRuntime reports whether name is an exported runtime function.
 // It is only for runtime functions, so ASCII A-Z is fine.
+// TODO: this handles exported functions but not exported methods.
 func isExportedRuntime(name string) bool {
 	const n = len("runtime.")
 	return len(name) > n && name[:n] == "runtime." && 'A' <= name[n] && name[n] <= 'Z'
@@ -903,10 +1165,10 @@
 
 // elideWrapperCalling reports whether a wrapper function that called
 // function id should be elided from stack traces.
-func elideWrapperCalling(id funcID) bool {
+func elideWrapperCalling(id abi.FuncID) bool {
 	// If the wrapper called a panic function instead of the
 	// wrapped function, we want to include it in stacks.
-	return !(id == funcID_gopanic || id == funcID_sigpanic || id == funcID_panicwrap)
+	return !(id == abi.FuncID_gopanic || id == abi.FuncID_sigpanic || id == abi.FuncID_panicwrap)
 }
 
 var gStatusStrings = [...]string{
@@ -1055,10 +1317,10 @@
 	if !f.valid() {
 		return false
 	}
-	if f.funcID == funcID_runtime_main || f.funcID == funcID_handleAsyncEvent {
+	if f.funcID == abi.FuncID_runtime_main || f.funcID == abi.FuncID_handleAsyncEvent {
 		return false
 	}
-	if f.funcID == funcID_runfinq {
+	if f.funcID == abi.FuncID_runfinq {
 		// We include the finalizer goroutine if it's calling
 		// back into user code.
 		if fixed {
@@ -1294,12 +1556,13 @@
 		return
 	}
 
+	commitFrame := func() (pr, stop bool) { return true, false }
 	var arg cgoSymbolizerArg
 	for _, c := range callers {
 		if c == 0 {
 			break
 		}
-		printOneCgoTraceback(c, 0x7fffffff, &arg)
+		printOneCgoTraceback(c, commitFrame, &arg)
 	}
 	arg.pc = 0
 	callCgoSymbolizer(&arg)
@@ -1307,11 +1570,16 @@
 
 // printOneCgoTraceback prints the traceback of a single cgo caller.
 // This can print more than one line because of inlining.
-// Returns the number of frames printed.
-func printOneCgoTraceback(pc uintptr, max int, arg *cgoSymbolizerArg) int {
-	c := 0
+// It returns the "stop" result of commitFrame.
+func printOneCgoTraceback(pc uintptr, commitFrame func() (pr, stop bool), arg *cgoSymbolizerArg) bool {
 	arg.pc = pc
-	for c <= max {
+	for {
+		if pr, stop := commitFrame(); stop {
+			return true
+		} else if !pr {
+			continue
+		}
+
 		callCgoSymbolizer(arg)
 		if arg.funcName != nil {
 			// Note that we don't print any argument
@@ -1326,12 +1594,10 @@
 			print(gostringnocopy(arg.file), ":", arg.lineno, " ")
 		}
 		print("pc=", hex(pc), "\n")
-		c++
 		if arg.more == 0 {
-			break
+			return false
 		}
 	}
-	return c
 }
 
 // callCgoSymbolizer calls the cgoSymbolizer function.
diff --git a/src/runtime/traceback_test.go b/src/runtime/traceback_test.go
index 97eb921..1617612 100644
--- a/src/runtime/traceback_test.go
+++ b/src/runtime/traceback_test.go
@@ -6,14 +6,259 @@
 
 import (
 	"bytes"
+	"fmt"
 	"internal/abi"
 	"internal/testenv"
+	"regexp"
 	"runtime"
+	"runtime/debug"
+	"strconv"
+	"strings"
+	"sync"
 	"testing"
+	_ "unsafe"
 )
 
+// Test traceback printing of inlined frames.
+func TestTracebackInlined(t *testing.T) {
+	testenv.SkipIfOptimizationOff(t) // This test requires inlining
+	check := func(t *testing.T, r *ttiResult, funcs ...string) {
+		t.Helper()
+
+		// Check the printed traceback.
+		frames := parseTraceback1(t, r.printed).frames
+		t.Log(r.printed)
+		// Find ttiLeaf
+		for len(frames) > 0 && frames[0].funcName != "runtime_test.ttiLeaf" {
+			frames = frames[1:]
+		}
+		if len(frames) == 0 {
+			t.Errorf("missing runtime_test.ttiLeaf")
+			return
+		}
+		frames = frames[1:]
+		// Check the function sequence.
+		for i, want := range funcs {
+			got := "<end>"
+			if i < len(frames) {
+				got = frames[i].funcName
+				if strings.HasSuffix(want, ")") {
+					got += "(" + frames[i].args + ")"
+				}
+			}
+			if got != want {
+				t.Errorf("got %s, want %s", got, want)
+				return
+			}
+		}
+	}
+
+	t.Run("simple", func(t *testing.T) {
+		// Check a simple case of inlining
+		r := ttiSimple1()
+		check(t, r, "runtime_test.ttiSimple3(...)", "runtime_test.ttiSimple2(...)", "runtime_test.ttiSimple1()")
+	})
+
+	t.Run("sigpanic", func(t *testing.T) {
+		// Check that sigpanic from an inlined function prints correctly
+		r := ttiSigpanic1()
+		check(t, r, "runtime_test.ttiSigpanic1.func1()", "panic", "runtime_test.ttiSigpanic3(...)", "runtime_test.ttiSigpanic2(...)", "runtime_test.ttiSigpanic1()")
+	})
+
+	t.Run("wrapper", func(t *testing.T) {
+		// Check that a method inlined into a wrapper prints correctly
+		r := ttiWrapper1()
+		check(t, r, "runtime_test.ttiWrapper.m1(...)", "runtime_test.ttiWrapper1()")
+	})
+
+	t.Run("excluded", func(t *testing.T) {
+		// Check that when F -> G is inlined and F is excluded from stack
+		// traces, G still appears.
+		r := ttiExcluded1()
+		check(t, r, "runtime_test.ttiExcluded3(...)", "runtime_test.ttiExcluded1()")
+	})
+}
+
+type ttiResult struct {
+	printed string
+}
+
+//go:noinline
+func ttiLeaf() *ttiResult {
+	// Get a printed stack trace.
+	printed := string(debug.Stack())
+	return &ttiResult{printed}
+}
+
+//go:noinline
+func ttiSimple1() *ttiResult {
+	return ttiSimple2()
+}
+func ttiSimple2() *ttiResult {
+	return ttiSimple3()
+}
+func ttiSimple3() *ttiResult {
+	return ttiLeaf()
+}
+
+//go:noinline
+func ttiSigpanic1() (res *ttiResult) {
+	defer func() {
+		res = ttiLeaf()
+		recover()
+	}()
+	ttiSigpanic2()
+	panic("did not panic")
+}
+func ttiSigpanic2() {
+	ttiSigpanic3()
+}
+func ttiSigpanic3() {
+	var p *int
+	*p = 3
+}
+
+//go:noinline
+func ttiWrapper1() *ttiResult {
+	var w ttiWrapper
+	m := (*ttiWrapper).m1
+	return m(&w)
+}
+
+type ttiWrapper struct{}
+
+func (w ttiWrapper) m1() *ttiResult {
+	return ttiLeaf()
+}
+
+//go:noinline
+func ttiExcluded1() *ttiResult {
+	return ttiExcluded2()
+}
+
+// ttiExcluded2 should be excluded from tracebacks. There are
+// various ways this could come up. Linking it to a "runtime." name is
+// rather synthetic, but it's easy and reliable. See issue #42754 for
+// one way this happened in real code.
+//
+//go:linkname ttiExcluded2 runtime.ttiExcluded2
+//go:noinline
+func ttiExcluded2() *ttiResult {
+	return ttiExcluded3()
+}
+func ttiExcluded3() *ttiResult {
+	return ttiLeaf()
+}
+
 var testTracebackArgsBuf [1000]byte
 
+func TestTracebackElision(t *testing.T) {
+	// Test printing exactly the maximum number of frames to make sure we don't
+	// print any "elided" message, eliding exactly 1 so we have to pick back up
+	// in the paused physical frame, and eliding 10 so we have to advance the
+	// physical frame forward.
+	for _, elided := range []int{0, 1, 10} {
+		t.Run(fmt.Sprintf("elided=%d", elided), func(t *testing.T) {
+			n := elided + runtime.TracebackInnerFrames + runtime.TracebackOuterFrames
+
+			// Start a new goroutine so we have control over the whole stack.
+			stackChan := make(chan string)
+			go tteStack(n, stackChan)
+			stack := <-stackChan
+			tb := parseTraceback1(t, stack)
+
+			// Check the traceback.
+			i := 0
+			for i < n {
+				if len(tb.frames) == 0 {
+					t.Errorf("traceback ended early")
+					break
+				}
+				fr := tb.frames[0]
+				if i == runtime.TracebackInnerFrames && elided > 0 {
+					// This should be an "elided" frame.
+					if fr.elided != elided {
+						t.Errorf("want %d frames elided", elided)
+						break
+					}
+					i += fr.elided
+				} else {
+					want := fmt.Sprintf("runtime_test.tte%d", (i+1)%5)
+					if i == 0 {
+						want = "runtime/debug.Stack"
+					} else if i == n-1 {
+						want = "runtime_test.tteStack"
+					}
+					if fr.funcName != want {
+						t.Errorf("want %s, got %s", want, fr.funcName)
+						break
+					}
+					i++
+				}
+				tb.frames = tb.frames[1:]
+			}
+			if !t.Failed() && len(tb.frames) > 0 {
+				t.Errorf("got %d more frames than expected", len(tb.frames))
+			}
+			if t.Failed() {
+				t.Logf("traceback diverged at frame %d", i)
+				off := len(stack)
+				if len(tb.frames) > 0 {
+					off = tb.frames[0].off
+				}
+				t.Logf("traceback before error:\n%s", stack[:off])
+				t.Logf("traceback after error:\n%s", stack[off:])
+			}
+		})
+	}
+}
+
+// tteStack creates a stack of n logical frames and sends the traceback to
+// stack. It cycles through 5 logical frames per physical frame to make it
+// unlikely that any part of the traceback will end on a physical boundary.
+func tteStack(n int, stack chan<- string) {
+	n-- // Account for this frame
+	// This is basically a Duff's device for starting the inline stack in the
+	// right place so we wind up at tteN when n%5=N.
+	switch n % 5 {
+	case 0:
+		stack <- tte0(n)
+	case 1:
+		stack <- tte1(n)
+	case 2:
+		stack <- tte2(n)
+	case 3:
+		stack <- tte3(n)
+	case 4:
+		stack <- tte4(n)
+	default:
+		panic("unreachable")
+	}
+}
+func tte0(n int) string {
+	return tte4(n - 1)
+}
+func tte1(n int) string {
+	return tte0(n - 1)
+}
+func tte2(n int) string {
+	// tte2 opens n%5 == 2 frames. It's also the base case of the recursion,
+	// since we can open no fewer than two frames to call debug.Stack().
+	if n < 2 {
+		panic("bad n")
+	}
+	if n == 2 {
+		return string(debug.Stack())
+	}
+	return tte1(n - 1)
+}
+func tte3(n int) string {
+	return tte2(n - 1)
+}
+func tte4(n int) string {
+	return tte3(n - 1)
+}
+
 func TestTracebackArgs(t *testing.T) {
 	if *flagQuick {
 		t.Skip("-quick")
@@ -420,3 +665,174 @@
 func poisonStack() [20]int {
 	return [20]int{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}
 }
+
+func TestTracebackParentChildGoroutines(t *testing.T) {
+	parent := fmt.Sprintf("goroutine %d", runtime.Goid())
+	var wg sync.WaitGroup
+	wg.Add(1)
+	go func() {
+		defer wg.Done()
+		buf := make([]byte, 1<<10)
+		// We collect the stack only for this goroutine (by passing
+		// false to runtime.Stack). We expect to see the current
+		// goroutine ID, and the parent goroutine ID in a message like
+		// "created by ... in goroutine N".
+		stack := string(buf[:runtime.Stack(buf, false)])
+		child := fmt.Sprintf("goroutine %d", runtime.Goid())
+		if !strings.Contains(stack, parent) || !strings.Contains(stack, child) {
+			t.Errorf("did not see parent (%s) and child (%s) IDs in stack, got %s", parent, child, stack)
+		}
+	}()
+	wg.Wait()
+}
+
+type traceback struct {
+	frames    []*tbFrame
+	createdBy *tbFrame // no args
+}
+
+type tbFrame struct {
+	funcName string
+	args     string
+	inlined  bool
+
+	// elided is set to the number of frames elided, and the other fields are
+	// set to the zero value.
+	elided int
+
+	off int // byte offset in the traceback text of this frame
+}
+
+// parseTraceback parses a printed traceback to make it easier for tests to
+// check the result.
+func parseTraceback(t *testing.T, tb string) []*traceback {
+	//lines := strings.Split(tb, "\n")
+	//nLines := len(lines)
+	off := 0
+	lineNo := 0
+	fatal := func(f string, args ...any) {
+		msg := fmt.Sprintf(f, args...)
+		t.Fatalf("%s (line %d):\n%s", msg, lineNo, tb)
+	}
+	parseFrame := func(funcName, args string) *tbFrame {
+		// Consume file/line/etc
+		if !strings.HasPrefix(tb, "\t") {
+			fatal("missing source line")
+		}
+		_, tb, _ = strings.Cut(tb, "\n")
+		lineNo++
+		inlined := args == "..."
+		return &tbFrame{funcName: funcName, args: args, inlined: inlined, off: off}
+	}
+	var elidedRe = regexp.MustCompile(`^\.\.\.([0-9]+) frames elided\.\.\.$`)
+	var tbs []*traceback
+	var cur *traceback
+	tbLen := len(tb)
+	for len(tb) > 0 {
+		var line string
+		off = tbLen - len(tb)
+		line, tb, _ = strings.Cut(tb, "\n")
+		lineNo++
+		switch {
+		case strings.HasPrefix(line, "goroutine "):
+			cur = &traceback{}
+			tbs = append(tbs, cur)
+		case line == "":
+			// Separator between goroutines
+			cur = nil
+		case line[0] == '\t':
+			fatal("unexpected indent")
+		case strings.HasPrefix(line, "created by "):
+			funcName := line[len("created by "):]
+			cur.createdBy = parseFrame(funcName, "")
+		case strings.HasSuffix(line, ")"):
+			line = line[:len(line)-1] // Trim trailing ")"
+			funcName, args, found := strings.Cut(line, "(")
+			if !found {
+				fatal("missing (")
+			}
+			frame := parseFrame(funcName, args)
+			cur.frames = append(cur.frames, frame)
+		case elidedRe.MatchString(line):
+			// "...N frames elided..."
+			nStr := elidedRe.FindStringSubmatch(line)
+			n, _ := strconv.Atoi(nStr[1])
+			frame := &tbFrame{elided: n}
+			cur.frames = append(cur.frames, frame)
+		}
+	}
+	return tbs
+}
+
+// parseTraceback1 is like parseTraceback, but expects tb to contain exactly one
+// goroutine.
+func parseTraceback1(t *testing.T, tb string) *traceback {
+	tbs := parseTraceback(t, tb)
+	if len(tbs) != 1 {
+		t.Fatalf("want 1 goroutine, got %d:\n%s", len(tbs), tb)
+	}
+	return tbs[0]
+}
+
+//go:noinline
+func testTracebackGenericFn[T any](buf []byte) int {
+	return runtime.Stack(buf[:], false)
+}
+
+func testTracebackGenericFnInlined[T any](buf []byte) int {
+	return runtime.Stack(buf[:], false)
+}
+
+type testTracebackGenericTyp[P any] struct{ x P }
+
+//go:noinline
+func (t testTracebackGenericTyp[P]) M(buf []byte) int {
+	return runtime.Stack(buf[:], false)
+}
+
+func (t testTracebackGenericTyp[P]) Inlined(buf []byte) int {
+	return runtime.Stack(buf[:], false)
+}
+
+func TestTracebackGeneric(t *testing.T) {
+	if *flagQuick {
+		t.Skip("-quick")
+	}
+	var x testTracebackGenericTyp[int]
+	tests := []struct {
+		fn     func([]byte) int
+		expect string
+	}{
+		// function, not inlined
+		{
+			testTracebackGenericFn[int],
+			"testTracebackGenericFn[...](",
+		},
+		// function, inlined
+		{
+			func(buf []byte) int { return testTracebackGenericFnInlined[int](buf) },
+			"testTracebackGenericFnInlined[...](",
+		},
+		// method, not inlined
+		{
+			x.M,
+			"testTracebackGenericTyp[...].M(",
+		},
+		// method, inlined
+		{
+			func(buf []byte) int { return x.Inlined(buf) },
+			"testTracebackGenericTyp[...].Inlined(",
+		},
+	}
+	var buf [1000]byte
+	for _, test := range tests {
+		n := test.fn(buf[:])
+		got := buf[:n]
+		if !bytes.Contains(got, []byte(test.expect)) {
+			t.Errorf("traceback does not contain expected string: want %q, got\n%s", test.expect, got)
+		}
+		if bytes.Contains(got, []byte("shape")) { // should not contain shape name
+			t.Errorf("traceback contains shape name: got\n%s", got)
+		}
+	}
+}
diff --git a/src/runtime/tracebackx_test.go b/src/runtime/tracebackx_test.go
new file mode 100644
index 0000000..b318fa3
--- /dev/null
+++ b/src/runtime/tracebackx_test.go
@@ -0,0 +1,18 @@
+// Copyright 2023 The Go Authors. 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
+
+func XTestSPWrite(t TestingT) {
+	// Test that we can traceback from the stack check prologue of a function
+	// that writes to SP. See #62326.
+
+	// Start a goroutine to minimize the initial stack and ensure we grow the stack.
+	done := make(chan bool)
+	go func() {
+		testSPWrite() // Defined in assembly
+		done <- true
+	}()
+	<-done
+}
diff --git a/src/runtime/type.go b/src/runtime/type.go
index 1c6103e..1150a53 100644
--- a/src/runtime/type.go
+++ b/src/runtime/type.go
@@ -11,118 +11,31 @@
 	"unsafe"
 )
 
-// tflag is documented in reflect/type.go.
-//
-// tflag values must be kept in sync with copies in:
-//
-//	cmd/compile/internal/reflectdata/reflect.go
-//	cmd/link/internal/ld/decodesym.go
-//	reflect/type.go
-//	internal/reflectlite/type.go
-type tflag uint8
+type nameOff = abi.NameOff
+type typeOff = abi.TypeOff
+type textOff = abi.TextOff
 
-const (
-	tflagUncommon      tflag = 1 << 0
-	tflagExtraStar     tflag = 1 << 1
-	tflagNamed         tflag = 1 << 2
-	tflagRegularMemory tflag = 1 << 3 // equal and hash can treat values of this type as a single region of t.size bytes
-)
+type _type = abi.Type
 
-// Needs to be in sync with ../cmd/link/internal/ld/decodesym.go:/^func.commonsize,
-// ../cmd/compile/internal/reflectdata/reflect.go:/^func.dcommontype and
-// ../reflect/type.go:/^type.rtype.
-// ../internal/reflectlite/type.go:/^type.rtype.
-type _type struct {
-	size       uintptr
-	ptrdata    uintptr // size of memory prefix holding all pointers
-	hash       uint32
-	tflag      tflag
-	align      uint8
-	fieldAlign uint8
-	kind       uint8
-	// function for comparing objects of this type
-	// (ptr to object A, ptr to object B) -> ==?
-	equal func(unsafe.Pointer, unsafe.Pointer) bool
-	// gcdata stores the GC type data for the garbage collector.
-	// If the KindGCProg bit is set in kind, gcdata is a GC program.
-	// Otherwise it is a ptrmask bitmap. See mbitmap.go for details.
-	gcdata    *byte
-	str       nameOff
-	ptrToThis typeOff
+// rtype is a wrapper that allows us to define additional methods.
+type rtype struct {
+	*abi.Type // embedding is okay here (unlike reflect) because none of this is public
 }
 
-func (t *_type) string() string {
-	s := t.nameOff(t.str).name()
-	if t.tflag&tflagExtraStar != 0 {
+func (t rtype) string() string {
+	s := t.nameOff(t.Str).Name()
+	if t.TFlag&abi.TFlagExtraStar != 0 {
 		return s[1:]
 	}
 	return s
 }
 
-func (t *_type) uncommon() *uncommontype {
-	if t.tflag&tflagUncommon == 0 {
-		return nil
-	}
-	switch t.kind & kindMask {
-	case kindStruct:
-		type u struct {
-			structtype
-			u uncommontype
-		}
-		return &(*u)(unsafe.Pointer(t)).u
-	case kindPtr:
-		type u struct {
-			ptrtype
-			u uncommontype
-		}
-		return &(*u)(unsafe.Pointer(t)).u
-	case kindFunc:
-		type u struct {
-			functype
-			u uncommontype
-		}
-		return &(*u)(unsafe.Pointer(t)).u
-	case kindSlice:
-		type u struct {
-			slicetype
-			u uncommontype
-		}
-		return &(*u)(unsafe.Pointer(t)).u
-	case kindArray:
-		type u struct {
-			arraytype
-			u uncommontype
-		}
-		return &(*u)(unsafe.Pointer(t)).u
-	case kindChan:
-		type u struct {
-			chantype
-			u uncommontype
-		}
-		return &(*u)(unsafe.Pointer(t)).u
-	case kindMap:
-		type u struct {
-			maptype
-			u uncommontype
-		}
-		return &(*u)(unsafe.Pointer(t)).u
-	case kindInterface:
-		type u struct {
-			interfacetype
-			u uncommontype
-		}
-		return &(*u)(unsafe.Pointer(t)).u
-	default:
-		type u struct {
-			_type
-			u uncommontype
-		}
-		return &(*u)(unsafe.Pointer(t)).u
-	}
+func (t rtype) uncommon() *uncommontype {
+	return t.Uncommon()
 }
 
-func (t *_type) name() string {
-	if t.tflag&tflagNamed == 0 {
+func (t rtype) name() string {
+	if t.TFlag&abi.TFlagNamed == 0 {
 		return ""
 	}
 	s := t.string()
@@ -144,17 +57,17 @@
 // available. This is not the same as the reflect package's PkgPath
 // method, in that it returns the package path for struct and interface
 // types, not just named types.
-func (t *_type) pkgpath() string {
+func (t rtype) pkgpath() string {
 	if u := t.uncommon(); u != nil {
-		return t.nameOff(u.pkgpath).name()
+		return t.nameOff(u.PkgPath).Name()
 	}
-	switch t.kind & kindMask {
+	switch t.Kind_ & kindMask {
 	case kindStruct:
-		st := (*structtype)(unsafe.Pointer(t))
-		return st.pkgPath.name()
+		st := (*structtype)(unsafe.Pointer(t.Type))
+		return st.PkgPath.Name()
 	case kindInterface:
-		it := (*interfacetype)(unsafe.Pointer(t))
-		return it.pkgpath.name()
+		it := (*interfacetype)(unsafe.Pointer(t.Type))
+		return it.PkgPath.Name()
 	}
 	return ""
 }
@@ -205,7 +118,7 @@
 				println("runtime: nameOff", hex(off), "out of range", hex(md.types), "-", hex(md.etypes))
 				throw("runtime: name offset out of range")
 			}
-			return name{(*byte)(unsafe.Pointer(res))}
+			return name{Bytes: (*byte)(unsafe.Pointer(res))}
 		}
 	}
 
@@ -220,11 +133,11 @@
 		}
 		throw("runtime: name offset base pointer out of range")
 	}
-	return name{(*byte)(res)}
+	return name{Bytes: (*byte)(res)}
 }
 
-func (t *_type) nameOff(off nameOff) name {
-	return resolveNameOff(unsafe.Pointer(t), off)
+func (t rtype) nameOff(off nameOff) name {
+	return resolveNameOff(unsafe.Pointer(t.Type), off)
 }
 
 func resolveTypeOff(ptrInModule unsafe.Pointer, off typeOff) *_type {
@@ -265,17 +178,17 @@
 	return (*_type)(unsafe.Pointer(res))
 }
 
-func (t *_type) typeOff(off typeOff) *_type {
-	return resolveTypeOff(unsafe.Pointer(t), off)
+func (t rtype) typeOff(off typeOff) *_type {
+	return resolveTypeOff(unsafe.Pointer(t.Type), off)
 }
 
-func (t *_type) textOff(off textOff) unsafe.Pointer {
+func (t rtype) textOff(off textOff) unsafe.Pointer {
 	if off == -1 {
 		// -1 is the sentinel value for unreachable code.
 		// See cmd/link/internal/ld/data.go:relocsym.
 		return unsafe.Pointer(abi.FuncPCABIInternal(unreachableMethod))
 	}
-	base := uintptr(unsafe.Pointer(t))
+	base := uintptr(unsafe.Pointer(t.Type))
 	var md *moduledata
 	for next := &firstmoduledata; next != nil; next = next.next {
 		if base >= next.types && base < next.etypes {
@@ -300,202 +213,40 @@
 	return unsafe.Pointer(res)
 }
 
-func (t *functype) in() []*_type {
-	// See funcType in reflect/type.go for details on data layout.
-	uadd := uintptr(unsafe.Sizeof(functype{}))
-	if t.typ.tflag&tflagUncommon != 0 {
-		uadd += unsafe.Sizeof(uncommontype{})
-	}
-	return (*[1 << 20]*_type)(add(unsafe.Pointer(t), uadd))[:t.inCount]
-}
+type uncommontype = abi.UncommonType
 
-func (t *functype) out() []*_type {
-	// See funcType in reflect/type.go for details on data layout.
-	uadd := uintptr(unsafe.Sizeof(functype{}))
-	if t.typ.tflag&tflagUncommon != 0 {
-		uadd += unsafe.Sizeof(uncommontype{})
-	}
-	outCount := t.outCount & (1<<15 - 1)
-	return (*[1 << 20]*_type)(add(unsafe.Pointer(t), uadd))[t.inCount : t.inCount+outCount]
-}
+type interfacetype = abi.InterfaceType
 
-func (t *functype) dotdotdot() bool {
-	return t.outCount&(1<<15) != 0
-}
+type maptype = abi.MapType
 
-type nameOff int32
-type typeOff int32
-type textOff int32
+type arraytype = abi.ArrayType
 
-type method struct {
-	name nameOff
-	mtyp typeOff
-	ifn  textOff
-	tfn  textOff
-}
+type chantype = abi.ChanType
 
-type uncommontype struct {
-	pkgpath nameOff
-	mcount  uint16 // number of methods
-	xcount  uint16 // number of exported methods
-	moff    uint32 // offset from this uncommontype to [mcount]method
-	_       uint32 // unused
-}
+type slicetype = abi.SliceType
 
-type imethod struct {
-	name nameOff
-	ityp typeOff
-}
+type functype = abi.FuncType
 
-type interfacetype struct {
-	typ     _type
-	pkgpath name
-	mhdr    []imethod
-}
+type ptrtype = abi.PtrType
 
-type maptype struct {
-	typ    _type
-	key    *_type
-	elem   *_type
-	bucket *_type // internal type representing a hash bucket
-	// function for hashing keys (ptr to key, seed) -> hash
-	hasher     func(unsafe.Pointer, uintptr) uintptr
-	keysize    uint8  // size of key slot
-	elemsize   uint8  // size of elem slot
-	bucketsize uint16 // size of bucket
-	flags      uint32
-}
+type name = abi.Name
 
-// Note: flag values must match those used in the TMAP case
-// in ../cmd/compile/internal/reflectdata/reflect.go:writeType.
-func (mt *maptype) indirectkey() bool { // store ptr to key instead of key itself
-	return mt.flags&1 != 0
-}
-func (mt *maptype) indirectelem() bool { // store ptr to elem instead of elem itself
-	return mt.flags&2 != 0
-}
-func (mt *maptype) reflexivekey() bool { // true if k==k for all keys
-	return mt.flags&4 != 0
-}
-func (mt *maptype) needkeyupdate() bool { // true if we need to update key on an overwrite
-	return mt.flags&8 != 0
-}
-func (mt *maptype) hashMightPanic() bool { // true if hash function might panic
-	return mt.flags&16 != 0
-}
+type structtype = abi.StructType
 
-type arraytype struct {
-	typ   _type
-	elem  *_type
-	slice *_type
-	len   uintptr
-}
-
-type chantype struct {
-	typ  _type
-	elem *_type
-	dir  uintptr
-}
-
-type slicetype struct {
-	typ  _type
-	elem *_type
-}
-
-type functype struct {
-	typ      _type
-	inCount  uint16
-	outCount uint16
-}
-
-type ptrtype struct {
-	typ  _type
-	elem *_type
-}
-
-type structfield struct {
-	name   name
-	typ    *_type
-	offset uintptr
-}
-
-type structtype struct {
-	typ     _type
-	pkgPath name
-	fields  []structfield
-}
-
-// name is an encoded type name with optional extra data.
-// See reflect/type.go for details.
-type name struct {
-	bytes *byte
-}
-
-func (n name) data(off int) *byte {
-	return (*byte)(add(unsafe.Pointer(n.bytes), uintptr(off)))
-}
-
-func (n name) isExported() bool {
-	return (*n.bytes)&(1<<0) != 0
-}
-
-func (n name) isEmbedded() bool {
-	return (*n.bytes)&(1<<3) != 0
-}
-
-func (n name) readvarint(off int) (int, int) {
-	v := 0
-	for i := 0; ; i++ {
-		x := *n.data(off + i)
-		v += int(x&0x7f) << (7 * i)
-		if x&0x80 == 0 {
-			return i + 1, v
-		}
-	}
-}
-
-func (n name) name() string {
-	if n.bytes == nil {
+func pkgPath(n name) string {
+	if n.Bytes == nil || *n.Data(0)&(1<<2) == 0 {
 		return ""
 	}
-	i, l := n.readvarint(1)
-	if l == 0 {
-		return ""
-	}
-	return unsafe.String(n.data(1+i), l)
-}
-
-func (n name) tag() string {
-	if *n.data(0)&(1<<1) == 0 {
-		return ""
-	}
-	i, l := n.readvarint(1)
-	i2, l2 := n.readvarint(1 + i + l)
-	return unsafe.String(n.data(1+i+l+i2), l2)
-}
-
-func (n name) pkgPath() string {
-	if n.bytes == nil || *n.data(0)&(1<<2) == 0 {
-		return ""
-	}
-	i, l := n.readvarint(1)
+	i, l := n.ReadVarint(1)
 	off := 1 + i + l
-	if *n.data(0)&(1<<1) != 0 {
-		i2, l2 := n.readvarint(off)
+	if *n.Data(0)&(1<<1) != 0 {
+		i2, l2 := n.ReadVarint(off)
 		off += i2 + l2
 	}
 	var nameOff nameOff
-	copy((*[4]byte)(unsafe.Pointer(&nameOff))[:], (*[4]byte)(unsafe.Pointer(n.data(off)))[:])
-	pkgPathName := resolveNameOff(unsafe.Pointer(n.bytes), nameOff)
-	return pkgPathName.name()
-}
-
-func (n name) isBlank() bool {
-	if n.bytes == nil {
-		return false
-	}
-	_, l := n.readvarint(1)
-	return l == 1 && *n.data(2) == '_'
+	copy((*[4]byte)(unsafe.Pointer(&nameOff))[:], (*[4]byte)(unsafe.Pointer(n.Data(off)))[:])
+	pkgPathName := resolveNameOff(unsafe.Pointer(n.Bytes), nameOff)
+	return pkgPathName.Name()
 }
 
 // typelinksinit scans the types from extra modules and builds the
@@ -519,13 +270,13 @@
 				t = prev.typemap[typeOff(tl)]
 			}
 			// Add to typehash if not seen before.
-			tlist := typehash[t.hash]
+			tlist := typehash[t.Hash]
 			for _, tcur := range tlist {
 				if tcur == t {
 					continue collect
 				}
 			}
-			typehash[t.hash] = append(tlist, t)
+			typehash[t.Hash] = append(tlist, t)
 		}
 
 		if md.typemap == nil {
@@ -537,7 +288,7 @@
 			md.typemap = tm
 			for _, tl := range md.typelinks {
 				t := (*_type)(unsafe.Pointer(md.types + uintptr(tl)))
-				for _, candidate := range typehash[t.hash] {
+				for _, candidate := range typehash[t.Hash] {
 					seen := map[_typePair]struct{}{}
 					if typesEqual(t, candidate, seen) {
 						t = candidate
@@ -557,6 +308,10 @@
 	t2 *_type
 }
 
+func toRType(t *abi.Type) rtype {
+	return rtype{t}
+}
+
 // typesEqual reports whether two types are equal.
 //
 // Everywhere in the runtime and reflect packages, it is assumed that
@@ -583,21 +338,22 @@
 	if t == v {
 		return true
 	}
-	kind := t.kind & kindMask
-	if kind != v.kind&kindMask {
+	kind := t.Kind_ & kindMask
+	if kind != v.Kind_&kindMask {
 		return false
 	}
-	if t.string() != v.string() {
+	rt, rv := toRType(t), toRType(v)
+	if rt.string() != rv.string() {
 		return false
 	}
-	ut := t.uncommon()
-	uv := v.uncommon()
+	ut := t.Uncommon()
+	uv := v.Uncommon()
 	if ut != nil || uv != nil {
 		if ut == nil || uv == nil {
 			return false
 		}
-		pkgpatht := t.nameOff(ut.pkgpath).name()
-		pkgpathv := v.nameOff(uv.pkgpath).name()
+		pkgpatht := rt.nameOff(ut.PkgPath).Name()
+		pkgpathv := rv.nameOff(uv.PkgPath).Name()
 		if pkgpatht != pkgpathv {
 			return false
 		}
@@ -611,24 +367,24 @@
 	case kindArray:
 		at := (*arraytype)(unsafe.Pointer(t))
 		av := (*arraytype)(unsafe.Pointer(v))
-		return typesEqual(at.elem, av.elem, seen) && at.len == av.len
+		return typesEqual(at.Elem, av.Elem, seen) && at.Len == av.Len
 	case kindChan:
 		ct := (*chantype)(unsafe.Pointer(t))
 		cv := (*chantype)(unsafe.Pointer(v))
-		return ct.dir == cv.dir && typesEqual(ct.elem, cv.elem, seen)
+		return ct.Dir == cv.Dir && typesEqual(ct.Elem, cv.Elem, seen)
 	case kindFunc:
 		ft := (*functype)(unsafe.Pointer(t))
 		fv := (*functype)(unsafe.Pointer(v))
-		if ft.outCount != fv.outCount || ft.inCount != fv.inCount {
+		if ft.OutCount != fv.OutCount || ft.InCount != fv.InCount {
 			return false
 		}
-		tin, vin := ft.in(), fv.in()
+		tin, vin := ft.InSlice(), fv.InSlice()
 		for i := 0; i < len(tin); i++ {
 			if !typesEqual(tin[i], vin[i], seen) {
 				return false
 			}
 		}
-		tout, vout := ft.out(), fv.out()
+		tout, vout := ft.OutSlice(), fv.OutSlice()
 		for i := 0; i < len(tout); i++ {
 			if !typesEqual(tout[i], vout[i], seen) {
 				return false
@@ -638,27 +394,27 @@
 	case kindInterface:
 		it := (*interfacetype)(unsafe.Pointer(t))
 		iv := (*interfacetype)(unsafe.Pointer(v))
-		if it.pkgpath.name() != iv.pkgpath.name() {
+		if it.PkgPath.Name() != iv.PkgPath.Name() {
 			return false
 		}
-		if len(it.mhdr) != len(iv.mhdr) {
+		if len(it.Methods) != len(iv.Methods) {
 			return false
 		}
-		for i := range it.mhdr {
-			tm := &it.mhdr[i]
-			vm := &iv.mhdr[i]
+		for i := range it.Methods {
+			tm := &it.Methods[i]
+			vm := &iv.Methods[i]
 			// Note the mhdr array can be relocated from
 			// another module. See #17724.
-			tname := resolveNameOff(unsafe.Pointer(tm), tm.name)
-			vname := resolveNameOff(unsafe.Pointer(vm), vm.name)
-			if tname.name() != vname.name() {
+			tname := resolveNameOff(unsafe.Pointer(tm), tm.Name)
+			vname := resolveNameOff(unsafe.Pointer(vm), vm.Name)
+			if tname.Name() != vname.Name() {
 				return false
 			}
-			if tname.pkgPath() != vname.pkgPath() {
+			if pkgPath(tname) != pkgPath(vname) {
 				return false
 			}
-			tityp := resolveTypeOff(unsafe.Pointer(tm), tm.ityp)
-			vityp := resolveTypeOff(unsafe.Pointer(vm), vm.ityp)
+			tityp := resolveTypeOff(unsafe.Pointer(tm), tm.Typ)
+			vityp := resolveTypeOff(unsafe.Pointer(vm), vm.Typ)
 			if !typesEqual(tityp, vityp, seen) {
 				return false
 			}
@@ -667,40 +423,40 @@
 	case kindMap:
 		mt := (*maptype)(unsafe.Pointer(t))
 		mv := (*maptype)(unsafe.Pointer(v))
-		return typesEqual(mt.key, mv.key, seen) && typesEqual(mt.elem, mv.elem, seen)
+		return typesEqual(mt.Key, mv.Key, seen) && typesEqual(mt.Elem, mv.Elem, seen)
 	case kindPtr:
 		pt := (*ptrtype)(unsafe.Pointer(t))
 		pv := (*ptrtype)(unsafe.Pointer(v))
-		return typesEqual(pt.elem, pv.elem, seen)
+		return typesEqual(pt.Elem, pv.Elem, seen)
 	case kindSlice:
 		st := (*slicetype)(unsafe.Pointer(t))
 		sv := (*slicetype)(unsafe.Pointer(v))
-		return typesEqual(st.elem, sv.elem, seen)
+		return typesEqual(st.Elem, sv.Elem, seen)
 	case kindStruct:
 		st := (*structtype)(unsafe.Pointer(t))
 		sv := (*structtype)(unsafe.Pointer(v))
-		if len(st.fields) != len(sv.fields) {
+		if len(st.Fields) != len(sv.Fields) {
 			return false
 		}
-		if st.pkgPath.name() != sv.pkgPath.name() {
+		if st.PkgPath.Name() != sv.PkgPath.Name() {
 			return false
 		}
-		for i := range st.fields {
-			tf := &st.fields[i]
-			vf := &sv.fields[i]
-			if tf.name.name() != vf.name.name() {
+		for i := range st.Fields {
+			tf := &st.Fields[i]
+			vf := &sv.Fields[i]
+			if tf.Name.Name() != vf.Name.Name() {
 				return false
 			}
-			if !typesEqual(tf.typ, vf.typ, seen) {
+			if !typesEqual(tf.Typ, vf.Typ, seen) {
 				return false
 			}
-			if tf.name.tag() != vf.name.tag() {
+			if tf.Name.Tag() != vf.Name.Tag() {
 				return false
 			}
-			if tf.offset != vf.offset {
+			if tf.Offset != vf.Offset {
 				return false
 			}
-			if tf.name.isEmbedded() != vf.name.isEmbedded() {
+			if tf.Name.IsEmbedded() != vf.Name.IsEmbedded() {
 				return false
 			}
 		}
diff --git a/src/runtime/typekind.go b/src/runtime/typekind.go
index 7087a9b..bd2dec9 100644
--- a/src/runtime/typekind.go
+++ b/src/runtime/typekind.go
@@ -39,5 +39,5 @@
 
 // isDirectIface reports whether t is stored directly in an interface value.
 func isDirectIface(t *_type) bool {
-	return t.kind&kindDirectIface != 0
+	return t.Kind_&kindDirectIface != 0
 }
diff --git a/src/runtime/unsafe.go b/src/runtime/unsafe.go
index 54649e8..6675264 100644
--- a/src/runtime/unsafe.go
+++ b/src/runtime/unsafe.go
@@ -52,21 +52,21 @@
 // Keep this code in sync with cmd/compile/internal/walk/builtin.go:walkUnsafeSlice
 func unsafeslice(et *_type, ptr unsafe.Pointer, len int) {
 	if len < 0 {
-		panicunsafeslicelen()
+		panicunsafeslicelen1(getcallerpc())
 	}
 
-	if et.size == 0 {
+	if et.Size_ == 0 {
 		if ptr == nil && len > 0 {
-			panicunsafeslicenilptr()
+			panicunsafeslicenilptr1(getcallerpc())
 		}
 	}
 
-	mem, overflow := math.MulUintptr(et.size, uintptr(len))
+	mem, overflow := math.MulUintptr(et.Size_, uintptr(len))
 	if overflow || mem > -uintptr(ptr) {
 		if ptr == nil {
-			panicunsafeslicenilptr()
+			panicunsafeslicenilptr1(getcallerpc())
 		}
-		panicunsafeslicelen()
+		panicunsafeslicelen1(getcallerpc())
 	}
 }
 
@@ -74,7 +74,7 @@
 func unsafeslice64(et *_type, ptr unsafe.Pointer, len64 int64) {
 	len := int(len64)
 	if int64(len) != len64 {
-		panicunsafeslicelen()
+		panicunsafeslicelen1(getcallerpc())
 	}
 	unsafeslice(et, ptr, len)
 }
@@ -84,15 +84,31 @@
 
 	// Check that underlying array doesn't straddle multiple heap objects.
 	// unsafeslice64 has already checked for overflow.
-	if checkptrStraddles(ptr, uintptr(len64)*et.size) {
+	if checkptrStraddles(ptr, uintptr(len64)*et.Size_) {
 		throw("checkptr: unsafe.Slice result straddles multiple allocations")
 	}
 }
 
 func panicunsafeslicelen() {
+	// This is called only from compiler-generated code, so we can get the
+	// source of the panic.
+	panicunsafeslicelen1(getcallerpc())
+}
+
+//go:yeswritebarrierrec
+func panicunsafeslicelen1(pc uintptr) {
+	panicCheck1(pc, "unsafe.Slice: len out of range")
 	panic(errorString("unsafe.Slice: len out of range"))
 }
 
 func panicunsafeslicenilptr() {
+	// This is called only from compiler-generated code, so we can get the
+	// source of the panic.
+	panicunsafeslicenilptr1(getcallerpc())
+}
+
+//go:yeswritebarrierrec
+func panicunsafeslicenilptr1(pc uintptr) {
+	panicCheck1(pc, "unsafe.Slice: ptr is nil and len is not zero")
 	panic(errorString("unsafe.Slice: ptr is nil and len is not zero"))
 }
diff --git a/src/runtime/wincallback.go b/src/runtime/wincallback.go
index 9ec2027..14847db 100644
--- a/src/runtime/wincallback.go
+++ b/src/runtime/wincallback.go
@@ -23,6 +23,8 @@
 
 //go:build 386 || amd64
 
+#include "textflag.h"
+
 // runtime·callbackasm is called by external code to
 // execute Go implemented callback function. It is not
 // called from the start, instead runtime·compilecallback
@@ -31,7 +33,7 @@
 // CALL instruction in runtime·callbackasm. This determines
 // which Go callback function is executed later on.
 
-TEXT runtime·callbackasm(SB),7,$0
+TEXT runtime·callbackasm(SB),NOSPLIT|NOFRAME,$0
 `)
 	for i := 0; i < maxCallback; i++ {
 		buf.WriteString("\tCALL\truntime·callbackasm1(SB)\n")
diff --git a/src/runtime/zcallback_windows.s b/src/runtime/zcallback_windows.s
index bd23d71..86d70d6 100644
--- a/src/runtime/zcallback_windows.s
+++ b/src/runtime/zcallback_windows.s
@@ -2,6 +2,8 @@
 
 //go:build 386 || amd64
 
+#include "textflag.h"
+
 // runtime·callbackasm is called by external code to
 // execute Go implemented callback function. It is not
 // called from the start, instead runtime·compilecallback
@@ -10,7 +12,7 @@
 // CALL instruction in runtime·callbackasm. This determines
 // which Go callback function is executed later on.
 
-TEXT runtime·callbackasm(SB),7,$0
+TEXT runtime·callbackasm(SB),NOSPLIT|NOFRAME,$0
 	CALL	runtime·callbackasm1(SB)
 	CALL	runtime·callbackasm1(SB)
 	CALL	runtime·callbackasm1(SB)
diff --git a/src/slices/example_test.go b/src/slices/example_test.go
new file mode 100644
index 0000000..3e76907
--- /dev/null
+++ b/src/slices/example_test.go
@@ -0,0 +1,322 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package slices_test
+
+import (
+	"cmp"
+	"fmt"
+	"slices"
+	"strconv"
+	"strings"
+)
+
+func ExampleBinarySearch() {
+	names := []string{"Alice", "Bob", "Vera"}
+	n, found := slices.BinarySearch(names, "Vera")
+	fmt.Println("Vera:", n, found)
+	n, found = slices.BinarySearch(names, "Bill")
+	fmt.Println("Bill:", n, found)
+	// Output:
+	// Vera: 2 true
+	// Bill: 1 false
+}
+
+func ExampleBinarySearchFunc() {
+	type Person struct {
+		Name string
+		Age  int
+	}
+	people := []Person{
+		{"Alice", 55},
+		{"Bob", 24},
+		{"Gopher", 13},
+	}
+	n, found := slices.BinarySearchFunc(people, Person{"Bob", 0}, func(a, b Person) int {
+		return cmp.Compare(a.Name, b.Name)
+	})
+	fmt.Println("Bob:", n, found)
+	// Output:
+	// Bob: 1 true
+}
+
+func ExampleCompact() {
+	seq := []int{0, 1, 1, 2, 3, 5, 8}
+	seq = slices.Compact(seq)
+	fmt.Println(seq)
+	// Output:
+	// [0 1 2 3 5 8]
+}
+
+func ExampleCompactFunc() {
+	names := []string{"bob", "Bob", "alice", "Vera", "VERA"}
+	names = slices.CompactFunc(names, func(a, b string) bool {
+		return strings.ToLower(a) == strings.ToLower(b)
+	})
+	fmt.Println(names)
+	// Output:
+	// [bob alice Vera]
+}
+
+func ExampleCompare() {
+	names := []string{"Alice", "Bob", "Vera"}
+	fmt.Println("Equal:", slices.Compare(names, []string{"Alice", "Bob", "Vera"}))
+	fmt.Println("V < X:", slices.Compare(names, []string{"Alice", "Bob", "Xena"}))
+	fmt.Println("V > C:", slices.Compare(names, []string{"Alice", "Bob", "Cat"}))
+	fmt.Println("3 > 2:", slices.Compare(names, []string{"Alice", "Bob"}))
+	// Output:
+	// Equal: 0
+	// V < X: -1
+	// V > C: 1
+	// 3 > 2: 1
+}
+
+func ExampleCompareFunc() {
+	numbers := []int{0, 43, 8}
+	strings := []string{"0", "0", "8"}
+	result := slices.CompareFunc(numbers, strings, func(n int, s string) int {
+		sn, err := strconv.Atoi(s)
+		if err != nil {
+			return 1
+		}
+		return cmp.Compare(n, sn)
+	})
+	fmt.Println(result)
+	// Output:
+	// 1
+}
+
+func ExampleContainsFunc() {
+	numbers := []int{0, 42, -10, 8}
+	hasNegative := slices.ContainsFunc(numbers, func(n int) bool {
+		return n < 0
+	})
+	fmt.Println("Has a negative:", hasNegative)
+	hasOdd := slices.ContainsFunc(numbers, func(n int) bool {
+		return n%2 != 0
+	})
+	fmt.Println("Has an odd number:", hasOdd)
+	// Output:
+	// Has a negative: true
+	// Has an odd number: false
+}
+
+func ExampleDelete() {
+	letters := []string{"a", "b", "c", "d", "e"}
+	letters = slices.Delete(letters, 1, 4)
+	fmt.Println(letters)
+	// Output:
+	// [a e]
+}
+
+func ExampleDeleteFunc() {
+	seq := []int{0, 1, 1, 2, 3, 5, 8}
+	seq = slices.DeleteFunc(seq, func(n int) bool {
+		return n%2 != 0 // delete the odd numbers
+	})
+	fmt.Println(seq)
+	// Output:
+	// [0 2 8]
+}
+
+func ExampleEqual() {
+	numbers := []int{0, 42, 8}
+	fmt.Println(slices.Equal(numbers, []int{0, 42, 8}))
+	fmt.Println(slices.Equal(numbers, []int{10}))
+	// Output:
+	// true
+	// false
+}
+
+func ExampleEqualFunc() {
+	numbers := []int{0, 42, 8}
+	strings := []string{"000", "42", "0o10"}
+	equal := slices.EqualFunc(numbers, strings, func(n int, s string) bool {
+		sn, err := strconv.ParseInt(s, 0, 64)
+		if err != nil {
+			return false
+		}
+		return n == int(sn)
+	})
+	fmt.Println(equal)
+	// Output:
+	// true
+}
+
+func ExampleIndex() {
+	numbers := []int{0, 42, 8}
+	fmt.Println(slices.Index(numbers, 8))
+	fmt.Println(slices.Index(numbers, 7))
+	// Output:
+	// 2
+	// -1
+}
+
+func ExampleIndexFunc() {
+	numbers := []int{0, 42, -10, 8}
+	i := slices.IndexFunc(numbers, func(n int) bool {
+		return n < 0
+	})
+	fmt.Println("First negative at index", i)
+	// Output:
+	// First negative at index 2
+}
+
+func ExampleInsert() {
+	names := []string{"Alice", "Bob", "Vera"}
+	names = slices.Insert(names, 1, "Bill", "Billie")
+	names = slices.Insert(names, len(names), "Zac")
+	fmt.Println(names)
+	// Output:
+	// [Alice Bill Billie Bob Vera Zac]
+}
+
+func ExampleIsSorted() {
+	fmt.Println(slices.IsSorted([]string{"Alice", "Bob", "Vera"}))
+	fmt.Println(slices.IsSorted([]int{0, 2, 1}))
+	// Output:
+	// true
+	// false
+}
+
+func ExampleIsSortedFunc() {
+	names := []string{"alice", "Bob", "VERA"}
+	isSortedInsensitive := slices.IsSortedFunc(names, func(a, b string) int {
+		return cmp.Compare(strings.ToLower(a), strings.ToLower(b))
+	})
+	fmt.Println(isSortedInsensitive)
+	fmt.Println(slices.IsSorted(names))
+	// Output:
+	// true
+	// false
+}
+
+func ExampleMax() {
+	numbers := []int{0, 42, -10, 8}
+	fmt.Println(slices.Max(numbers))
+	// Output:
+	// 42
+}
+
+func ExampleMaxFunc() {
+	type Person struct {
+		Name string
+		Age  int
+	}
+	people := []Person{
+		{"Gopher", 13},
+		{"Alice", 55},
+		{"Vera", 24},
+		{"Bob", 55},
+	}
+	firstOldest := slices.MaxFunc(people, func(a, b Person) int {
+		return cmp.Compare(a.Age, b.Age)
+	})
+	fmt.Println(firstOldest.Name)
+	// Output:
+	// Alice
+}
+
+func ExampleMin() {
+	numbers := []int{0, 42, -10, 8}
+	fmt.Println(slices.Min(numbers))
+	// Output:
+	// -10
+}
+
+func ExampleMinFunc() {
+	type Person struct {
+		Name string
+		Age  int
+	}
+	people := []Person{
+		{"Gopher", 13},
+		{"Bob", 5},
+		{"Vera", 24},
+		{"Bill", 5},
+	}
+	firstYoungest := slices.MinFunc(people, func(a, b Person) int {
+		return cmp.Compare(a.Age, b.Age)
+	})
+	fmt.Println(firstYoungest.Name)
+	// Output:
+	// Bob
+}
+
+func ExampleReplace() {
+	names := []string{"Alice", "Bob", "Vera", "Zac"}
+	names = slices.Replace(names, 1, 3, "Bill", "Billie", "Cat")
+	fmt.Println(names)
+	// Output:
+	// [Alice Bill Billie Cat Zac]
+}
+
+func ExampleReverse() {
+	names := []string{"alice", "Bob", "VERA"}
+	slices.Reverse(names)
+	fmt.Println(names)
+	// Output:
+	// [VERA Bob alice]
+}
+
+func ExampleSort() {
+	smallInts := []int8{0, 42, -10, 8}
+	slices.Sort(smallInts)
+	fmt.Println(smallInts)
+	// Output:
+	// [-10 0 8 42]
+}
+
+func ExampleSortFunc_caseInsensitive() {
+	names := []string{"Bob", "alice", "VERA"}
+	slices.SortFunc(names, func(a, b string) int {
+		return cmp.Compare(strings.ToLower(a), strings.ToLower(b))
+	})
+	fmt.Println(names)
+	// Output:
+	// [alice Bob VERA]
+}
+
+func ExampleSortFunc_multiField() {
+	type Person struct {
+		Name string
+		Age  int
+	}
+	people := []Person{
+		{"Gopher", 13},
+		{"Alice", 55},
+		{"Bob", 24},
+		{"Alice", 20},
+	}
+	slices.SortFunc(people, func(a, b Person) int {
+		if n := cmp.Compare(a.Name, b.Name); n != 0 {
+			return n
+		}
+		// If names are equal, order by age
+		return cmp.Compare(a.Age, b.Age)
+	})
+	fmt.Println(people)
+	// Output:
+	// [{Alice 20} {Alice 55} {Bob 24} {Gopher 13}]
+}
+
+func ExampleSortStableFunc() {
+	type Person struct {
+		Name string
+		Age  int
+	}
+	people := []Person{
+		{"Gopher", 13},
+		{"Alice", 20},
+		{"Bob", 24},
+		{"Alice", 55},
+	}
+	// Stable sort by name, keeping age ordering of Alices intact
+	slices.SortStableFunc(people, func(a, b Person) int {
+		return cmp.Compare(a.Name, b.Name)
+	})
+	fmt.Println(people)
+	// Output:
+	// [{Alice 20} {Alice 55} {Bob 24} {Gopher 13}]
+}
diff --git a/src/slices/slices.go b/src/slices/slices.go
new file mode 100644
index 0000000..afeed0a
--- /dev/null
+++ b/src/slices/slices.go
@@ -0,0 +1,498 @@
+// Copyright 2021 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package slices defines various functions useful with slices of any type.
+package slices
+
+import (
+	"cmp"
+	"unsafe"
+)
+
+// Equal reports whether two slices are equal: the same length and all
+// elements equal. If the lengths are different, Equal returns false.
+// Otherwise, the elements are compared in increasing index order, and the
+// comparison stops at the first unequal pair.
+// Floating point NaNs are not considered equal.
+func Equal[S ~[]E, E comparable](s1, s2 S) bool {
+	if len(s1) != len(s2) {
+		return false
+	}
+	for i := range s1 {
+		if s1[i] != s2[i] {
+			return false
+		}
+	}
+	return true
+}
+
+// EqualFunc reports whether two slices are equal using an equality
+// function on each pair of elements. If the lengths are different,
+// EqualFunc returns false. Otherwise, the elements are compared in
+// increasing index order, and the comparison stops at the first index
+// for which eq returns false.
+func EqualFunc[S1 ~[]E1, S2 ~[]E2, E1, E2 any](s1 S1, s2 S2, eq func(E1, E2) bool) bool {
+	if len(s1) != len(s2) {
+		return false
+	}
+	for i, v1 := range s1 {
+		v2 := s2[i]
+		if !eq(v1, v2) {
+			return false
+		}
+	}
+	return true
+}
+
+// Compare compares the elements of s1 and s2, using [cmp.Compare] on each pair
+// of elements. The elements are compared sequentially, starting at index 0,
+// until one element is not equal to the other.
+// The result of comparing the first non-matching elements is returned.
+// If both slices are equal until one of them ends, the shorter slice is
+// considered less than the longer one.
+// The result is 0 if s1 == s2, -1 if s1 < s2, and +1 if s1 > s2.
+func Compare[S ~[]E, E cmp.Ordered](s1, s2 S) int {
+	for i, v1 := range s1 {
+		if i >= len(s2) {
+			return +1
+		}
+		v2 := s2[i]
+		if c := cmp.Compare(v1, v2); c != 0 {
+			return c
+		}
+	}
+	if len(s1) < len(s2) {
+		return -1
+	}
+	return 0
+}
+
+// CompareFunc is like [Compare] but uses a custom comparison function on each
+// pair of elements.
+// The result is the first non-zero result of cmp; if cmp always
+// returns 0 the result is 0 if len(s1) == len(s2), -1 if len(s1) < len(s2),
+// and +1 if len(s1) > len(s2).
+func CompareFunc[S1 ~[]E1, S2 ~[]E2, E1, E2 any](s1 S1, s2 S2, cmp func(E1, E2) int) int {
+	for i, v1 := range s1 {
+		if i >= len(s2) {
+			return +1
+		}
+		v2 := s2[i]
+		if c := cmp(v1, v2); c != 0 {
+			return c
+		}
+	}
+	if len(s1) < len(s2) {
+		return -1
+	}
+	return 0
+}
+
+// Index returns the index of the first occurrence of v in s,
+// or -1 if not present.
+func Index[S ~[]E, E comparable](s S, v E) int {
+	for i := range s {
+		if v == s[i] {
+			return i
+		}
+	}
+	return -1
+}
+
+// IndexFunc returns the first index i satisfying f(s[i]),
+// or -1 if none do.
+func IndexFunc[S ~[]E, E any](s S, f func(E) bool) int {
+	for i := range s {
+		if f(s[i]) {
+			return i
+		}
+	}
+	return -1
+}
+
+// Contains reports whether v is present in s.
+func Contains[S ~[]E, E comparable](s S, v E) bool {
+	return Index(s, v) >= 0
+}
+
+// ContainsFunc reports whether at least one
+// element e of s satisfies f(e).
+func ContainsFunc[S ~[]E, E any](s S, f func(E) bool) bool {
+	return IndexFunc(s, f) >= 0
+}
+
+// Insert inserts the values v... into s at index i,
+// returning the modified slice.
+// The elements at s[i:] are shifted up to make room.
+// In the returned slice r, r[i] == v[0],
+// and r[i+len(v)] == value originally at r[i].
+// Insert panics if i is out of range.
+// This function is O(len(s) + len(v)).
+func Insert[S ~[]E, E any](s S, i int, v ...E) S {
+	m := len(v)
+	if m == 0 {
+		return s
+	}
+	n := len(s)
+	if i == n {
+		return append(s, v...)
+	}
+	if n+m > cap(s) {
+		// Use append rather than make so that we bump the size of
+		// the slice up to the next storage class.
+		// This is what Grow does but we don't call Grow because
+		// that might copy the values twice.
+		s2 := append(s[:i], make(S, n+m-i)...)
+		copy(s2[i:], v)
+		copy(s2[i+m:], s[i:])
+		return s2
+	}
+	s = s[:n+m]
+
+	// before:
+	// s: aaaaaaaabbbbccccccccdddd
+	//            ^   ^       ^   ^
+	//            i  i+m      n  n+m
+	// after:
+	// s: aaaaaaaavvvvbbbbcccccccc
+	//            ^   ^       ^   ^
+	//            i  i+m      n  n+m
+	//
+	// a are the values that don't move in s.
+	// v are the values copied in from v.
+	// b and c are the values from s that are shifted up in index.
+	// d are the values that get overwritten, never to be seen again.
+
+	if !overlaps(v, s[i+m:]) {
+		// Easy case - v does not overlap either the c or d regions.
+		// (It might be in some of a or b, or elsewhere entirely.)
+		// The data we copy up doesn't write to v at all, so just do it.
+
+		copy(s[i+m:], s[i:])
+
+		// Now we have
+		// s: aaaaaaaabbbbbbbbcccccccc
+		//            ^   ^       ^   ^
+		//            i  i+m      n  n+m
+		// Note the b values are duplicated.
+
+		copy(s[i:], v)
+
+		// Now we have
+		// s: aaaaaaaavvvvbbbbcccccccc
+		//            ^   ^       ^   ^
+		//            i  i+m      n  n+m
+		// That's the result we want.
+		return s
+	}
+
+	// The hard case - v overlaps c or d. We can't just shift up
+	// the data because we'd move or clobber the values we're trying
+	// to insert.
+	// So instead, write v on top of d, then rotate.
+	copy(s[n:], v)
+
+	// Now we have
+	// s: aaaaaaaabbbbccccccccvvvv
+	//            ^   ^       ^   ^
+	//            i  i+m      n  n+m
+
+	rotateRight(s[i:], m)
+
+	// Now we have
+	// s: aaaaaaaavvvvbbbbcccccccc
+	//            ^   ^       ^   ^
+	//            i  i+m      n  n+m
+	// That's the result we want.
+	return s
+}
+
+// Delete removes the elements s[i:j] from s, returning the modified slice.
+// Delete panics if s[i:j] is not a valid slice of s.
+// Delete is O(len(s)-j), so if many items must be deleted, it is better to
+// make a single call deleting them all together than to delete one at a time.
+// Delete might not modify the elements s[len(s)-(j-i):len(s)]. If those
+// elements contain pointers you might consider zeroing those elements so that
+// objects they reference can be garbage collected.
+func Delete[S ~[]E, E any](s S, i, j int) S {
+	_ = s[i:j] // bounds check
+
+	return append(s[:i], s[j:]...)
+}
+
+// DeleteFunc removes any elements from s for which del returns true,
+// returning the modified slice.
+// When DeleteFunc removes m elements, it might not modify the elements
+// s[len(s)-m:len(s)]. If those elements contain pointers you might consider
+// zeroing those elements so that objects they reference can be garbage
+// collected.
+func DeleteFunc[S ~[]E, E any](s S, del func(E) bool) S {
+	// Don't start copying elements until we find one to delete.
+	for i, v := range s {
+		if del(v) {
+			j := i
+			for i++; i < len(s); i++ {
+				v = s[i]
+				if !del(v) {
+					s[j] = v
+					j++
+				}
+			}
+			return s[:j]
+		}
+	}
+	return s
+}
+
+// Replace replaces the elements s[i:j] by the given v, and returns the
+// modified slice. Replace panics if s[i:j] is not a valid slice of s.
+func Replace[S ~[]E, E any](s S, i, j int, v ...E) S {
+	_ = s[i:j] // verify that i:j is a valid subslice
+
+	if i == j {
+		return Insert(s, i, v...)
+	}
+	if j == len(s) {
+		return append(s[:i], v...)
+	}
+
+	tot := len(s[:i]) + len(v) + len(s[j:])
+	if tot > cap(s) {
+		// Too big to fit, allocate and copy over.
+		s2 := append(s[:i], make(S, tot-i)...) // See Insert
+		copy(s2[i:], v)
+		copy(s2[i+len(v):], s[j:])
+		return s2
+	}
+
+	r := s[:tot]
+
+	if i+len(v) <= j {
+		// Easy, as v fits in the deleted portion.
+		copy(r[i:], v)
+		if i+len(v) != j {
+			copy(r[i+len(v):], s[j:])
+		}
+		return r
+	}
+
+	// We are expanding (v is bigger than j-i).
+	// The situation is something like this:
+	// (example has i=4,j=8,len(s)=16,len(v)=6)
+	// s: aaaaxxxxbbbbbbbbyy
+	//        ^   ^       ^ ^
+	//        i   j  len(s) tot
+	// a: prefix of s
+	// x: deleted range
+	// b: more of s
+	// y: area to expand into
+
+	if !overlaps(r[i+len(v):], v) {
+		// Easy, as v is not clobbered by the first copy.
+		copy(r[i+len(v):], s[j:])
+		copy(r[i:], v)
+		return r
+	}
+
+	// This is a situation where we don't have a single place to which
+	// we can copy v. Parts of it need to go to two different places.
+	// We want to copy the prefix of v into y and the suffix into x, then
+	// rotate |y| spots to the right.
+	//
+	//        v[2:]      v[:2]
+	//         |           |
+	// s: aaaavvvvbbbbbbbbvv
+	//        ^   ^       ^ ^
+	//        i   j  len(s) tot
+	//
+	// If either of those two destinations don't alias v, then we're good.
+	y := len(v) - (j - i) // length of y portion
+
+	if !overlaps(r[i:j], v) {
+		copy(r[i:j], v[y:])
+		copy(r[len(s):], v[:y])
+		rotateRight(r[i:], y)
+		return r
+	}
+	if !overlaps(r[len(s):], v) {
+		copy(r[len(s):], v[:y])
+		copy(r[i:j], v[y:])
+		rotateRight(r[i:], y)
+		return r
+	}
+
+	// Now we know that v overlaps both x and y.
+	// That means that the entirety of b is *inside* v.
+	// So we don't need to preserve b at all; instead we
+	// can copy v first, then copy the b part of v out of
+	// v to the right destination.
+	k := startIdx(v, s[j:])
+	copy(r[i:], v)
+	copy(r[i+len(v):], r[i+k:])
+	return r
+}
+
+// Clone returns a copy of the slice.
+// The elements are copied using assignment, so this is a shallow clone.
+func Clone[S ~[]E, E any](s S) S {
+	// Preserve nil in case it matters.
+	if s == nil {
+		return nil
+	}
+	return append(S([]E{}), s...)
+}
+
+// Compact replaces consecutive runs of equal elements with a single copy.
+// This is like the uniq command found on Unix.
+// Compact modifies the contents of the slice s and returns the modified slice,
+// which may have a smaller length.
+// When Compact discards m elements in total, it might not modify the elements
+// s[len(s)-m:len(s)]. If those elements contain pointers you might consider
+// zeroing those elements so that objects they reference can be garbage collected.
+func Compact[S ~[]E, E comparable](s S) S {
+	if len(s) < 2 {
+		return s
+	}
+	i := 1
+	for k := 1; k < len(s); k++ {
+		if s[k] != s[k-1] {
+			if i != k {
+				s[i] = s[k]
+			}
+			i++
+		}
+	}
+	return s[:i]
+}
+
+// CompactFunc is like [Compact] but uses an equality function to compare elements.
+// For runs of elements that compare equal, CompactFunc keeps the first one.
+func CompactFunc[S ~[]E, E any](s S, eq func(E, E) bool) S {
+	if len(s) < 2 {
+		return s
+	}
+	i := 1
+	for k := 1; k < len(s); k++ {
+		if !eq(s[k], s[k-1]) {
+			if i != k {
+				s[i] = s[k]
+			}
+			i++
+		}
+	}
+	return s[:i]
+}
+
+// Grow increases the slice's capacity, if necessary, to guarantee space for
+// another n elements. After Grow(n), at least n elements can be appended
+// to the slice without another allocation. If n is negative or too large to
+// allocate the memory, Grow panics.
+func Grow[S ~[]E, E any](s S, n int) S {
+	if n < 0 {
+		panic("cannot be negative")
+	}
+	if n -= cap(s) - len(s); n > 0 {
+		s = append(s[:cap(s)], make([]E, n)...)[:len(s)]
+	}
+	return s
+}
+
+// Clip removes unused capacity from the slice, returning s[:len(s):len(s)].
+func Clip[S ~[]E, E any](s S) S {
+	return s[:len(s):len(s)]
+}
+
+// Rotation algorithm explanation:
+//
+// rotate left by 2
+// start with
+//   0123456789
+// split up like this
+//   01 234567 89
+// swap first 2 and last 2
+//   89 234567 01
+// join first parts
+//   89234567 01
+// recursively rotate first left part by 2
+//   23456789 01
+// join at the end
+//   2345678901
+//
+// rotate left by 8
+// start with
+//   0123456789
+// split up like this
+//   01 234567 89
+// swap first 2 and last 2
+//   89 234567 01
+// join last parts
+//   89 23456701
+// recursively rotate second part left by 6
+//   89 01234567
+// join at the end
+//   8901234567
+
+// TODO: There are other rotate algorithms.
+// This algorithm has the desirable property that it moves each element exactly twice.
+// The triple-reverse algorithm is simpler and more cache friendly, but takes more writes.
+// The follow-cycles algorithm can be 1-write but it is not very cache friendly.
+
+// rotateLeft rotates b left by n spaces.
+// s_final[i] = s_orig[i+r], wrapping around.
+func rotateLeft[E any](s []E, r int) {
+	for r != 0 && r != len(s) {
+		if r*2 <= len(s) {
+			swap(s[:r], s[len(s)-r:])
+			s = s[:len(s)-r]
+		} else {
+			swap(s[:len(s)-r], s[r:])
+			s, r = s[len(s)-r:], r*2-len(s)
+		}
+	}
+}
+func rotateRight[E any](s []E, r int) {
+	rotateLeft(s, len(s)-r)
+}
+
+// swap swaps the contents of x and y. x and y must be equal length and disjoint.
+func swap[E any](x, y []E) {
+	for i := 0; i < len(x); i++ {
+		x[i], y[i] = y[i], x[i]
+	}
+}
+
+// overlaps reports whether the memory ranges a[0:len(a)] and b[0:len(b)] overlap.
+func overlaps[E any](a, b []E) bool {
+	if len(a) == 0 || len(b) == 0 {
+		return false
+	}
+	elemSize := unsafe.Sizeof(a[0])
+	if elemSize == 0 {
+		return false
+	}
+	// TODO: use a runtime/unsafe facility once one becomes available. See issue 12445.
+	// Also see crypto/internal/alias/alias.go:AnyOverlap
+	return uintptr(unsafe.Pointer(&a[0])) <= uintptr(unsafe.Pointer(&b[len(b)-1]))+(elemSize-1) &&
+		uintptr(unsafe.Pointer(&b[0])) <= uintptr(unsafe.Pointer(&a[len(a)-1]))+(elemSize-1)
+}
+
+// startIdx returns the index in haystack where the needle starts.
+// prerequisite: the needle must be aliased entirely inside the haystack.
+func startIdx[E any](haystack, needle []E) int {
+	p := &needle[0]
+	for i := range haystack {
+		if p == &haystack[i] {
+			return i
+		}
+	}
+	// TODO: what if the overlap is by a non-integral number of Es?
+	panic("needle not found")
+}
+
+// Reverse reverses the elements of the slice in place.
+func Reverse[S ~[]E, E any](s S) {
+	for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 {
+		s[i], s[j] = s[j], s[i]
+	}
+}
diff --git a/src/slices/slices_test.go b/src/slices/slices_test.go
new file mode 100644
index 0000000..e6da3b0
--- /dev/null
+++ b/src/slices/slices_test.go
@@ -0,0 +1,1075 @@
+// Copyright 2021 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package slices
+
+import (
+	"cmp"
+	"internal/race"
+	"internal/testenv"
+	"math"
+	"strings"
+	"testing"
+)
+
+var equalIntTests = []struct {
+	s1, s2 []int
+	want   bool
+}{
+	{
+		[]int{1},
+		nil,
+		false,
+	},
+	{
+		[]int{},
+		nil,
+		true,
+	},
+	{
+		[]int{1, 2, 3},
+		[]int{1, 2, 3},
+		true,
+	},
+	{
+		[]int{1, 2, 3},
+		[]int{1, 2, 3, 4},
+		false,
+	},
+}
+
+var equalFloatTests = []struct {
+	s1, s2       []float64
+	wantEqual    bool
+	wantEqualNaN bool
+}{
+	{
+		[]float64{1, 2},
+		[]float64{1, 2},
+		true,
+		true,
+	},
+	{
+		[]float64{1, 2, math.NaN()},
+		[]float64{1, 2, math.NaN()},
+		false,
+		true,
+	},
+}
+
+func TestEqual(t *testing.T) {
+	for _, test := range equalIntTests {
+		if got := Equal(test.s1, test.s2); got != test.want {
+			t.Errorf("Equal(%v, %v) = %t, want %t", test.s1, test.s2, got, test.want)
+		}
+	}
+	for _, test := range equalFloatTests {
+		if got := Equal(test.s1, test.s2); got != test.wantEqual {
+			t.Errorf("Equal(%v, %v) = %t, want %t", test.s1, test.s2, got, test.wantEqual)
+		}
+	}
+}
+
+// equal is simply ==.
+func equal[T comparable](v1, v2 T) bool {
+	return v1 == v2
+}
+
+// equalNaN is like == except that all NaNs are equal.
+func equalNaN[T comparable](v1, v2 T) bool {
+	isNaN := func(f T) bool { return f != f }
+	return v1 == v2 || (isNaN(v1) && isNaN(v2))
+}
+
+// offByOne returns true if integers v1 and v2 differ by 1.
+func offByOne(v1, v2 int) bool {
+	return v1 == v2+1 || v1 == v2-1
+}
+
+func TestEqualFunc(t *testing.T) {
+	for _, test := range equalIntTests {
+		if got := EqualFunc(test.s1, test.s2, equal[int]); got != test.want {
+			t.Errorf("EqualFunc(%v, %v, equal[int]) = %t, want %t", test.s1, test.s2, got, test.want)
+		}
+	}
+	for _, test := range equalFloatTests {
+		if got := EqualFunc(test.s1, test.s2, equal[float64]); got != test.wantEqual {
+			t.Errorf("Equal(%v, %v, equal[float64]) = %t, want %t", test.s1, test.s2, got, test.wantEqual)
+		}
+		if got := EqualFunc(test.s1, test.s2, equalNaN[float64]); got != test.wantEqualNaN {
+			t.Errorf("Equal(%v, %v, equalNaN[float64]) = %t, want %t", test.s1, test.s2, got, test.wantEqualNaN)
+		}
+	}
+
+	s1 := []int{1, 2, 3}
+	s2 := []int{2, 3, 4}
+	if EqualFunc(s1, s1, offByOne) {
+		t.Errorf("EqualFunc(%v, %v, offByOne) = true, want false", s1, s1)
+	}
+	if !EqualFunc(s1, s2, offByOne) {
+		t.Errorf("EqualFunc(%v, %v, offByOne) = false, want true", s1, s2)
+	}
+
+	s3 := []string{"a", "b", "c"}
+	s4 := []string{"A", "B", "C"}
+	if !EqualFunc(s3, s4, strings.EqualFold) {
+		t.Errorf("EqualFunc(%v, %v, strings.EqualFold) = false, want true", s3, s4)
+	}
+
+	cmpIntString := func(v1 int, v2 string) bool {
+		return string(rune(v1)-1+'a') == v2
+	}
+	if !EqualFunc(s1, s3, cmpIntString) {
+		t.Errorf("EqualFunc(%v, %v, cmpIntString) = false, want true", s1, s3)
+	}
+}
+
+func BenchmarkEqualFunc_Large(b *testing.B) {
+	type Large [4 * 1024]byte
+
+	xs := make([]Large, 1024)
+	ys := make([]Large, 1024)
+	for i := 0; i < b.N; i++ {
+		_ = EqualFunc(xs, ys, func(x, y Large) bool { return x == y })
+	}
+}
+
+var compareIntTests = []struct {
+	s1, s2 []int
+	want   int
+}{
+	{
+		[]int{1},
+		[]int{1},
+		0,
+	},
+	{
+		[]int{1},
+		[]int{},
+		1,
+	},
+	{
+		[]int{},
+		[]int{1},
+		-1,
+	},
+	{
+		[]int{},
+		[]int{},
+		0,
+	},
+	{
+		[]int{1, 2, 3},
+		[]int{1, 2, 3},
+		0,
+	},
+	{
+		[]int{1, 2, 3},
+		[]int{1, 2, 3, 4},
+		-1,
+	},
+	{
+		[]int{1, 2, 3, 4},
+		[]int{1, 2, 3},
+		+1,
+	},
+	{
+		[]int{1, 2, 3},
+		[]int{1, 4, 3},
+		-1,
+	},
+	{
+		[]int{1, 4, 3},
+		[]int{1, 2, 3},
+		+1,
+	},
+	{
+		[]int{1, 4, 3},
+		[]int{1, 2, 3, 8, 9},
+		+1,
+	},
+}
+
+var compareFloatTests = []struct {
+	s1, s2 []float64
+	want   int
+}{
+	{
+		[]float64{},
+		[]float64{},
+		0,
+	},
+	{
+		[]float64{1},
+		[]float64{1},
+		0,
+	},
+	{
+		[]float64{math.NaN()},
+		[]float64{math.NaN()},
+		0,
+	},
+	{
+		[]float64{1, 2, math.NaN()},
+		[]float64{1, 2, math.NaN()},
+		0,
+	},
+	{
+		[]float64{1, math.NaN(), 3},
+		[]float64{1, math.NaN(), 4},
+		-1,
+	},
+	{
+		[]float64{1, math.NaN(), 3},
+		[]float64{1, 2, 4},
+		-1,
+	},
+	{
+		[]float64{1, math.NaN(), 3},
+		[]float64{1, 2, math.NaN()},
+		-1,
+	},
+	{
+		[]float64{1, 2, 3},
+		[]float64{1, 2, math.NaN()},
+		+1,
+	},
+	{
+		[]float64{1, 2, 3},
+		[]float64{1, math.NaN(), 3},
+		+1,
+	},
+	{
+		[]float64{1, math.NaN(), 3, 4},
+		[]float64{1, 2, math.NaN()},
+		-1,
+	},
+}
+
+func TestCompare(t *testing.T) {
+	intWant := func(want bool) string {
+		if want {
+			return "0"
+		}
+		return "!= 0"
+	}
+	for _, test := range equalIntTests {
+		if got := Compare(test.s1, test.s2); (got == 0) != test.want {
+			t.Errorf("Compare(%v, %v) = %d, want %s", test.s1, test.s2, got, intWant(test.want))
+		}
+	}
+	for _, test := range equalFloatTests {
+		if got := Compare(test.s1, test.s2); (got == 0) != test.wantEqualNaN {
+			t.Errorf("Compare(%v, %v) = %d, want %s", test.s1, test.s2, got, intWant(test.wantEqualNaN))
+		}
+	}
+
+	for _, test := range compareIntTests {
+		if got := Compare(test.s1, test.s2); got != test.want {
+			t.Errorf("Compare(%v, %v) = %d, want %d", test.s1, test.s2, got, test.want)
+		}
+	}
+	for _, test := range compareFloatTests {
+		if got := Compare(test.s1, test.s2); got != test.want {
+			t.Errorf("Compare(%v, %v) = %d, want %d", test.s1, test.s2, got, test.want)
+		}
+	}
+}
+
+func equalToCmp[T comparable](eq func(T, T) bool) func(T, T) int {
+	return func(v1, v2 T) int {
+		if eq(v1, v2) {
+			return 0
+		}
+		return 1
+	}
+}
+
+func TestCompareFunc(t *testing.T) {
+	intWant := func(want bool) string {
+		if want {
+			return "0"
+		}
+		return "!= 0"
+	}
+	for _, test := range equalIntTests {
+		if got := CompareFunc(test.s1, test.s2, equalToCmp(equal[int])); (got == 0) != test.want {
+			t.Errorf("CompareFunc(%v, %v, equalToCmp(equal[int])) = %d, want %s", test.s1, test.s2, got, intWant(test.want))
+		}
+	}
+	for _, test := range equalFloatTests {
+		if got := CompareFunc(test.s1, test.s2, equalToCmp(equal[float64])); (got == 0) != test.wantEqual {
+			t.Errorf("CompareFunc(%v, %v, equalToCmp(equal[float64])) = %d, want %s", test.s1, test.s2, got, intWant(test.wantEqual))
+		}
+	}
+
+	for _, test := range compareIntTests {
+		if got := CompareFunc(test.s1, test.s2, cmp.Compare[int]); got != test.want {
+			t.Errorf("CompareFunc(%v, %v, cmp[int]) = %d, want %d", test.s1, test.s2, got, test.want)
+		}
+	}
+	for _, test := range compareFloatTests {
+		if got := CompareFunc(test.s1, test.s2, cmp.Compare[float64]); got != test.want {
+			t.Errorf("CompareFunc(%v, %v, cmp[float64]) = %d, want %d", test.s1, test.s2, got, test.want)
+		}
+	}
+
+	s1 := []int{1, 2, 3}
+	s2 := []int{2, 3, 4}
+	if got := CompareFunc(s1, s2, equalToCmp(offByOne)); got != 0 {
+		t.Errorf("CompareFunc(%v, %v, offByOne) = %d, want 0", s1, s2, got)
+	}
+
+	s3 := []string{"a", "b", "c"}
+	s4 := []string{"A", "B", "C"}
+	if got := CompareFunc(s3, s4, strings.Compare); got != 1 {
+		t.Errorf("CompareFunc(%v, %v, strings.Compare) = %d, want 1", s3, s4, got)
+	}
+
+	compareLower := func(v1, v2 string) int {
+		return strings.Compare(strings.ToLower(v1), strings.ToLower(v2))
+	}
+	if got := CompareFunc(s3, s4, compareLower); got != 0 {
+		t.Errorf("CompareFunc(%v, %v, compareLower) = %d, want 0", s3, s4, got)
+	}
+
+	cmpIntString := func(v1 int, v2 string) int {
+		return strings.Compare(string(rune(v1)-1+'a'), v2)
+	}
+	if got := CompareFunc(s1, s3, cmpIntString); got != 0 {
+		t.Errorf("CompareFunc(%v, %v, cmpIntString) = %d, want 0", s1, s3, got)
+	}
+}
+
+var indexTests = []struct {
+	s    []int
+	v    int
+	want int
+}{
+	{
+		nil,
+		0,
+		-1,
+	},
+	{
+		[]int{},
+		0,
+		-1,
+	},
+	{
+		[]int{1, 2, 3},
+		2,
+		1,
+	},
+	{
+		[]int{1, 2, 2, 3},
+		2,
+		1,
+	},
+	{
+		[]int{1, 2, 3, 2},
+		2,
+		1,
+	},
+}
+
+func TestIndex(t *testing.T) {
+	for _, test := range indexTests {
+		if got := Index(test.s, test.v); got != test.want {
+			t.Errorf("Index(%v, %v) = %d, want %d", test.s, test.v, got, test.want)
+		}
+	}
+}
+
+func equalToIndex[T any](f func(T, T) bool, v1 T) func(T) bool {
+	return func(v2 T) bool {
+		return f(v1, v2)
+	}
+}
+
+func BenchmarkIndex_Large(b *testing.B) {
+	type Large [4 * 1024]byte
+
+	ss := make([]Large, 1024)
+	for i := 0; i < b.N; i++ {
+		_ = Index(ss, Large{1})
+	}
+}
+
+func TestIndexFunc(t *testing.T) {
+	for _, test := range indexTests {
+		if got := IndexFunc(test.s, equalToIndex(equal[int], test.v)); got != test.want {
+			t.Errorf("IndexFunc(%v, equalToIndex(equal[int], %v)) = %d, want %d", test.s, test.v, got, test.want)
+		}
+	}
+
+	s1 := []string{"hi", "HI"}
+	if got := IndexFunc(s1, equalToIndex(equal[string], "HI")); got != 1 {
+		t.Errorf("IndexFunc(%v, equalToIndex(equal[string], %q)) = %d, want %d", s1, "HI", got, 1)
+	}
+	if got := IndexFunc(s1, equalToIndex(strings.EqualFold, "HI")); got != 0 {
+		t.Errorf("IndexFunc(%v, equalToIndex(strings.EqualFold, %q)) = %d, want %d", s1, "HI", got, 0)
+	}
+}
+
+func BenchmarkIndexFunc_Large(b *testing.B) {
+	type Large [4 * 1024]byte
+
+	ss := make([]Large, 1024)
+	for i := 0; i < b.N; i++ {
+		_ = IndexFunc(ss, func(e Large) bool {
+			return e == Large{1}
+		})
+	}
+}
+
+func TestContains(t *testing.T) {
+	for _, test := range indexTests {
+		if got := Contains(test.s, test.v); got != (test.want != -1) {
+			t.Errorf("Contains(%v, %v) = %t, want %t", test.s, test.v, got, test.want != -1)
+		}
+	}
+}
+
+func TestContainsFunc(t *testing.T) {
+	for _, test := range indexTests {
+		if got := ContainsFunc(test.s, equalToIndex(equal[int], test.v)); got != (test.want != -1) {
+			t.Errorf("ContainsFunc(%v, equalToIndex(equal[int], %v)) = %t, want %t", test.s, test.v, got, test.want != -1)
+		}
+	}
+
+	s1 := []string{"hi", "HI"}
+	if got := ContainsFunc(s1, equalToIndex(equal[string], "HI")); got != true {
+		t.Errorf("ContainsFunc(%v, equalToContains(equal[string], %q)) = %t, want %t", s1, "HI", got, true)
+	}
+	if got := ContainsFunc(s1, equalToIndex(equal[string], "hI")); got != false {
+		t.Errorf("ContainsFunc(%v, equalToContains(strings.EqualFold, %q)) = %t, want %t", s1, "hI", got, false)
+	}
+	if got := ContainsFunc(s1, equalToIndex(strings.EqualFold, "hI")); got != true {
+		t.Errorf("ContainsFunc(%v, equalToContains(strings.EqualFold, %q)) = %t, want %t", s1, "hI", got, true)
+	}
+}
+
+var insertTests = []struct {
+	s    []int
+	i    int
+	add  []int
+	want []int
+}{
+	{
+		[]int{1, 2, 3},
+		0,
+		[]int{4},
+		[]int{4, 1, 2, 3},
+	},
+	{
+		[]int{1, 2, 3},
+		1,
+		[]int{4},
+		[]int{1, 4, 2, 3},
+	},
+	{
+		[]int{1, 2, 3},
+		3,
+		[]int{4},
+		[]int{1, 2, 3, 4},
+	},
+	{
+		[]int{1, 2, 3},
+		2,
+		[]int{4, 5},
+		[]int{1, 2, 4, 5, 3},
+	},
+}
+
+func TestInsert(t *testing.T) {
+	s := []int{1, 2, 3}
+	if got := Insert(s, 0); !Equal(got, s) {
+		t.Errorf("Insert(%v, 0) = %v, want %v", s, got, s)
+	}
+	for _, test := range insertTests {
+		copy := Clone(test.s)
+		if got := Insert(copy, test.i, test.add...); !Equal(got, test.want) {
+			t.Errorf("Insert(%v, %d, %v...) = %v, want %v", test.s, test.i, test.add, got, test.want)
+		}
+	}
+
+	if !testenv.OptimizationOff() && !race.Enabled {
+		// Allocations should be amortized.
+		const count = 50
+		n := testing.AllocsPerRun(10, func() {
+			s := []int{1, 2, 3}
+			for i := 0; i < count; i++ {
+				s = Insert(s, 0, 1)
+			}
+		})
+		if n > count/2 {
+			t.Errorf("too many allocations inserting %d elements: got %v, want less than %d", count, n, count/2)
+		}
+	}
+}
+
+func TestInsertOverlap(t *testing.T) {
+	const N = 10
+	a := make([]int, N)
+	want := make([]int, 2*N)
+	for n := 0; n <= N; n++ { // length
+		for i := 0; i <= n; i++ { // insertion point
+			for x := 0; x <= N; x++ { // start of inserted data
+				for y := x; y <= N; y++ { // end of inserted data
+					for k := 0; k < N; k++ {
+						a[k] = k
+					}
+					want = want[:0]
+					want = append(want, a[:i]...)
+					want = append(want, a[x:y]...)
+					want = append(want, a[i:n]...)
+					got := Insert(a[:n], i, a[x:y]...)
+					if !Equal(got, want) {
+						t.Errorf("Insert with overlap failed n=%d i=%d x=%d y=%d, got %v want %v", n, i, x, y, got, want)
+					}
+				}
+			}
+		}
+	}
+}
+
+var deleteTests = []struct {
+	s    []int
+	i, j int
+	want []int
+}{
+	{
+		[]int{1, 2, 3},
+		0,
+		0,
+		[]int{1, 2, 3},
+	},
+	{
+		[]int{1, 2, 3},
+		0,
+		1,
+		[]int{2, 3},
+	},
+	{
+		[]int{1, 2, 3},
+		3,
+		3,
+		[]int{1, 2, 3},
+	},
+	{
+		[]int{1, 2, 3},
+		0,
+		2,
+		[]int{3},
+	},
+	{
+		[]int{1, 2, 3},
+		0,
+		3,
+		[]int{},
+	},
+}
+
+func TestDelete(t *testing.T) {
+	for _, test := range deleteTests {
+		copy := Clone(test.s)
+		if got := Delete(copy, test.i, test.j); !Equal(got, test.want) {
+			t.Errorf("Delete(%v, %d, %d) = %v, want %v", test.s, test.i, test.j, got, test.want)
+		}
+	}
+}
+
+var deleteFuncTests = []struct {
+	s    []int
+	fn   func(int) bool
+	want []int
+}{
+	{
+		nil,
+		func(int) bool { return true },
+		nil,
+	},
+	{
+		[]int{1, 2, 3},
+		func(int) bool { return true },
+		nil,
+	},
+	{
+		[]int{1, 2, 3},
+		func(int) bool { return false },
+		[]int{1, 2, 3},
+	},
+	{
+		[]int{1, 2, 3},
+		func(i int) bool { return i > 2 },
+		[]int{1, 2},
+	},
+	{
+		[]int{1, 2, 3},
+		func(i int) bool { return i < 2 },
+		[]int{2, 3},
+	},
+	{
+		[]int{10, 2, 30},
+		func(i int) bool { return i >= 10 },
+		[]int{2},
+	},
+}
+
+func TestDeleteFunc(t *testing.T) {
+	for i, test := range deleteFuncTests {
+		copy := Clone(test.s)
+		if got := DeleteFunc(copy, test.fn); !Equal(got, test.want) {
+			t.Errorf("DeleteFunc case %d: got %v, want %v", i, got, test.want)
+		}
+	}
+}
+
+func panics(f func()) (b bool) {
+	defer func() {
+		if x := recover(); x != nil {
+			b = true
+		}
+	}()
+	f()
+	return false
+}
+
+func TestDeletePanics(t *testing.T) {
+	for _, test := range []struct {
+		name string
+		s    []int
+		i, j int
+	}{
+		{"with negative first index", []int{42}, -2, 1},
+		{"with negative second index", []int{42}, 1, -1},
+		{"with out-of-bounds first index", []int{42}, 2, 3},
+		{"with out-of-bounds second index", []int{42}, 0, 2},
+		{"with invalid i>j", []int{42}, 1, 0},
+	} {
+		if !panics(func() { Delete(test.s, test.i, test.j) }) {
+			t.Errorf("Delete %s: got no panic, want panic", test.name)
+		}
+	}
+}
+
+func TestClone(t *testing.T) {
+	s1 := []int{1, 2, 3}
+	s2 := Clone(s1)
+	if !Equal(s1, s2) {
+		t.Errorf("Clone(%v) = %v, want %v", s1, s2, s1)
+	}
+	s1[0] = 4
+	want := []int{1, 2, 3}
+	if !Equal(s2, want) {
+		t.Errorf("Clone(%v) changed unexpectedly to %v", want, s2)
+	}
+	if got := Clone([]int(nil)); got != nil {
+		t.Errorf("Clone(nil) = %#v, want nil", got)
+	}
+	if got := Clone(s1[:0]); got == nil || len(got) != 0 {
+		t.Errorf("Clone(%v) = %#v, want %#v", s1[:0], got, s1[:0])
+	}
+}
+
+var compactTests = []struct {
+	name string
+	s    []int
+	want []int
+}{
+	{
+		"nil",
+		nil,
+		nil,
+	},
+	{
+		"one",
+		[]int{1},
+		[]int{1},
+	},
+	{
+		"sorted",
+		[]int{1, 2, 3},
+		[]int{1, 2, 3},
+	},
+	{
+		"1 item",
+		[]int{1, 1, 2},
+		[]int{1, 2},
+	},
+	{
+		"unsorted",
+		[]int{1, 2, 1},
+		[]int{1, 2, 1},
+	},
+	{
+		"many",
+		[]int{1, 2, 2, 3, 3, 4},
+		[]int{1, 2, 3, 4},
+	},
+}
+
+func TestCompact(t *testing.T) {
+	for _, test := range compactTests {
+		copy := Clone(test.s)
+		if got := Compact(copy); !Equal(got, test.want) {
+			t.Errorf("Compact(%v) = %v, want %v", test.s, got, test.want)
+		}
+	}
+}
+
+func BenchmarkCompact(b *testing.B) {
+	for _, c := range compactTests {
+		b.Run(c.name, func(b *testing.B) {
+			ss := make([]int, 0, 64)
+			for k := 0; k < b.N; k++ {
+				ss = ss[:0]
+				ss = append(ss, c.s...)
+				_ = Compact(ss)
+			}
+		})
+	}
+}
+
+func BenchmarkCompact_Large(b *testing.B) {
+	type Large [4 * 1024]byte
+
+	ss := make([]Large, 1024)
+	for i := 0; i < b.N; i++ {
+		_ = Compact(ss)
+	}
+}
+
+func TestCompactFunc(t *testing.T) {
+	for _, test := range compactTests {
+		copy := Clone(test.s)
+		if got := CompactFunc(copy, equal[int]); !Equal(got, test.want) {
+			t.Errorf("CompactFunc(%v, equal[int]) = %v, want %v", test.s, got, test.want)
+		}
+	}
+
+	s1 := []string{"a", "a", "A", "B", "b"}
+	copy := Clone(s1)
+	want := []string{"a", "B"}
+	if got := CompactFunc(copy, strings.EqualFold); !Equal(got, want) {
+		t.Errorf("CompactFunc(%v, strings.EqualFold) = %v, want %v", s1, got, want)
+	}
+}
+
+func BenchmarkCompactFunc_Large(b *testing.B) {
+	type Large [4 * 1024]byte
+
+	ss := make([]Large, 1024)
+	for i := 0; i < b.N; i++ {
+		_ = CompactFunc(ss, func(a, b Large) bool { return a == b })
+	}
+}
+
+func TestGrow(t *testing.T) {
+	s1 := []int{1, 2, 3}
+
+	copy := Clone(s1)
+	s2 := Grow(copy, 1000)
+	if !Equal(s1, s2) {
+		t.Errorf("Grow(%v) = %v, want %v", s1, s2, s1)
+	}
+	if cap(s2) < 1000+len(s1) {
+		t.Errorf("after Grow(%v) cap = %d, want >= %d", s1, cap(s2), 1000+len(s1))
+	}
+
+	// Test mutation of elements between length and capacity.
+	copy = Clone(s1)
+	s3 := Grow(copy[:1], 2)[:3]
+	if !Equal(s1, s3) {
+		t.Errorf("Grow should not mutate elements between length and capacity")
+	}
+	s3 = Grow(copy[:1], 1000)[:3]
+	if !Equal(s1, s3) {
+		t.Errorf("Grow should not mutate elements between length and capacity")
+	}
+
+	// Test number of allocations.
+	if n := testing.AllocsPerRun(100, func() { Grow(s2, cap(s2)-len(s2)) }); n != 0 {
+		t.Errorf("Grow should not allocate when given sufficient capacity; allocated %v times", n)
+	}
+	if n := testing.AllocsPerRun(100, func() { Grow(s2, cap(s2)-len(s2)+1) }); n != 1 {
+		errorf := t.Errorf
+		if race.Enabled || testenv.OptimizationOff() {
+			errorf = t.Logf // this allocates multiple times in race detector mode
+		}
+		errorf("Grow should allocate once when given insufficient capacity; allocated %v times", n)
+	}
+
+	// Test for negative growth sizes.
+	var gotPanic bool
+	func() {
+		defer func() { gotPanic = recover() != nil }()
+		Grow(s1, -1)
+	}()
+	if !gotPanic {
+		t.Errorf("Grow(-1) did not panic; expected a panic")
+	}
+}
+
+func TestClip(t *testing.T) {
+	s1 := []int{1, 2, 3, 4, 5, 6}[:3]
+	orig := Clone(s1)
+	if len(s1) != 3 {
+		t.Errorf("len(%v) = %d, want 3", s1, len(s1))
+	}
+	if cap(s1) < 6 {
+		t.Errorf("cap(%v[:3]) = %d, want >= 6", orig, cap(s1))
+	}
+	s2 := Clip(s1)
+	if !Equal(s1, s2) {
+		t.Errorf("Clip(%v) = %v, want %v", s1, s2, s1)
+	}
+	if cap(s2) != 3 {
+		t.Errorf("cap(Clip(%v)) = %d, want 3", orig, cap(s2))
+	}
+}
+
+func TestReverse(t *testing.T) {
+	even := []int{3, 1, 4, 1, 5, 9} // len = 6
+	Reverse(even)
+	if want := []int{9, 5, 1, 4, 1, 3}; !Equal(even, want) {
+		t.Errorf("Reverse(even) = %v, want %v", even, want)
+	}
+
+	odd := []int{3, 1, 4, 1, 5, 9, 2} // len = 7
+	Reverse(odd)
+	if want := []int{2, 9, 5, 1, 4, 1, 3}; !Equal(odd, want) {
+		t.Errorf("Reverse(odd) = %v, want %v", odd, want)
+	}
+
+	words := strings.Fields("one two three")
+	Reverse(words)
+	if want := strings.Fields("three two one"); !Equal(words, want) {
+		t.Errorf("Reverse(words) = %v, want %v", words, want)
+	}
+
+	singleton := []string{"one"}
+	Reverse(singleton)
+	if want := []string{"one"}; !Equal(singleton, want) {
+		t.Errorf("Reverse(singeleton) = %v, want %v", singleton, want)
+	}
+
+	Reverse[[]string](nil)
+}
+
+// naiveReplace is a baseline implementation to the Replace function.
+func naiveReplace[S ~[]E, E any](s S, i, j int, v ...E) S {
+	s = Delete(s, i, j)
+	s = Insert(s, i, v...)
+	return s
+}
+
+func TestReplace(t *testing.T) {
+	for _, test := range []struct {
+		s, v []int
+		i, j int
+	}{
+		{}, // all zero value
+		{
+			s: []int{1, 2, 3, 4},
+			v: []int{5},
+			i: 1,
+			j: 2,
+		},
+		{
+			s: []int{1, 2, 3, 4},
+			v: []int{5, 6, 7, 8},
+			i: 1,
+			j: 2,
+		},
+		{
+			s: func() []int {
+				s := make([]int, 3, 20)
+				s[0] = 0
+				s[1] = 1
+				s[2] = 2
+				return s
+			}(),
+			v: []int{3, 4, 5, 6, 7},
+			i: 0,
+			j: 1,
+		},
+	} {
+		ss, vv := Clone(test.s), Clone(test.v)
+		want := naiveReplace(ss, test.i, test.j, vv...)
+		got := Replace(test.s, test.i, test.j, test.v...)
+		if !Equal(got, want) {
+			t.Errorf("Replace(%v, %v, %v, %v) = %v, want %v", test.s, test.i, test.j, test.v, got, want)
+		}
+	}
+}
+
+func TestReplacePanics(t *testing.T) {
+	for _, test := range []struct {
+		name string
+		s, v []int
+		i, j int
+	}{
+		{"indexes out of order", []int{1, 2}, []int{3}, 2, 1},
+		{"large index", []int{1, 2}, []int{3}, 1, 10},
+		{"negative index", []int{1, 2}, []int{3}, -1, 2},
+	} {
+		ss, vv := Clone(test.s), Clone(test.v)
+		if !panics(func() { Replace(ss, test.i, test.j, vv...) }) {
+			t.Errorf("Replace %s: should have panicked", test.name)
+		}
+	}
+}
+
+func TestReplaceOverlap(t *testing.T) {
+	const N = 10
+	a := make([]int, N)
+	want := make([]int, 2*N)
+	for n := 0; n <= N; n++ { // length
+		for i := 0; i <= n; i++ { // insertion point 1
+			for j := i; j <= n; j++ { // insertion point 2
+				for x := 0; x <= N; x++ { // start of inserted data
+					for y := x; y <= N; y++ { // end of inserted data
+						for k := 0; k < N; k++ {
+							a[k] = k
+						}
+						want = want[:0]
+						want = append(want, a[:i]...)
+						want = append(want, a[x:y]...)
+						want = append(want, a[j:n]...)
+						got := Replace(a[:n], i, j, a[x:y]...)
+						if !Equal(got, want) {
+							t.Errorf("Insert with overlap failed n=%d i=%d j=%d x=%d y=%d, got %v want %v", n, i, j, x, y, got, want)
+						}
+					}
+				}
+			}
+		}
+	}
+}
+
+func BenchmarkReplace(b *testing.B) {
+	cases := []struct {
+		name string
+		s, v func() []int
+		i, j int
+	}{
+		{
+			name: "fast",
+			s: func() []int {
+				return make([]int, 100)
+			},
+			v: func() []int {
+				return make([]int, 20)
+			},
+			i: 10,
+			j: 40,
+		},
+		{
+			name: "slow",
+			s: func() []int {
+				return make([]int, 100)
+			},
+			v: func() []int {
+				return make([]int, 20)
+			},
+			i: 0,
+			j: 2,
+		},
+	}
+
+	for _, c := range cases {
+		b.Run("naive-"+c.name, func(b *testing.B) {
+			for k := 0; k < b.N; k++ {
+				s := c.s()
+				v := c.v()
+				_ = naiveReplace(s, c.i, c.j, v...)
+			}
+		})
+		b.Run("optimized-"+c.name, func(b *testing.B) {
+			for k := 0; k < b.N; k++ {
+				s := c.s()
+				v := c.v()
+				_ = Replace(s, c.i, c.j, v...)
+			}
+		})
+	}
+
+}
+
+func TestRotate(t *testing.T) {
+	const N = 10
+	s := make([]int, 0, N)
+	for n := 0; n < N; n++ {
+		for r := 0; r < n; r++ {
+			s = s[:0]
+			for i := 0; i < n; i++ {
+				s = append(s, i)
+			}
+			rotateLeft(s, r)
+			for i := 0; i < n; i++ {
+				if s[i] != (i+r)%n {
+					t.Errorf("expected n=%d r=%d i:%d want:%d got:%d", n, r, i, (i+r)%n, s[i])
+				}
+			}
+		}
+	}
+}
+
+func TestInsertGrowthRate(t *testing.T) {
+	b := make([]byte, 1)
+	maxCap := cap(b)
+	nGrow := 0
+	const N = 1e6
+	for i := 0; i < N; i++ {
+		b = Insert(b, len(b)-1, 0)
+		if cap(b) > maxCap {
+			maxCap = cap(b)
+			nGrow++
+		}
+	}
+	want := int(math.Log(N) / math.Log(1.25)) // 1.25 == growth rate for large slices
+	if nGrow > want {
+		t.Errorf("too many grows. got:%d want:%d", nGrow, want)
+	}
+}
+
+func TestReplaceGrowthRate(t *testing.T) {
+	b := make([]byte, 2)
+	maxCap := cap(b)
+	nGrow := 0
+	const N = 1e6
+	for i := 0; i < N; i++ {
+		b = Replace(b, len(b)-2, len(b)-1, 0, 0)
+		if cap(b) > maxCap {
+			maxCap = cap(b)
+			nGrow++
+		}
+	}
+	want := int(math.Log(N) / math.Log(1.25)) // 1.25 == growth rate for large slices
+	if nGrow > want {
+		t.Errorf("too many grows. got:%d want:%d", nGrow, want)
+	}
+}
+
+func apply[T any](v T, f func(T)) {
+	f(v)
+}
+
+// Test type inference with a named slice type.
+func TestInference(t *testing.T) {
+	s1 := []int{1, 2, 3}
+	apply(s1, Reverse)
+	if want := []int{3, 2, 1}; !Equal(s1, want) {
+		t.Errorf("Reverse(%v) = %v, want %v", []int{1, 2, 3}, s1, want)
+	}
+
+	type S []int
+	s2 := S{4, 5, 6}
+	apply(s2, Reverse)
+	if want := (S{6, 5, 4}); !Equal(s2, want) {
+		t.Errorf("Reverse(%v) = %v, want %v", S{4, 5, 6}, s2, want)
+	}
+}
diff --git a/src/slices/sort.go b/src/slices/sort.go
new file mode 100644
index 0000000..822f2fc
--- /dev/null
+++ b/src/slices/sort.go
@@ -0,0 +1,192 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package slices
+
+import (
+	"cmp"
+	"math/bits"
+)
+
+// Sort sorts a slice of any ordered type in ascending order.
+// When sorting floating-point numbers, NaNs are ordered before other values.
+func Sort[S ~[]E, E cmp.Ordered](x S) {
+	n := len(x)
+	pdqsortOrdered(x, 0, n, bits.Len(uint(n)))
+}
+
+// SortFunc sorts the slice x in ascending order as determined by the cmp
+// function. This sort is not guaranteed to be stable.
+// cmp(a, b) should return a negative number when a < b, a positive number when
+// a > b and zero when a == b.
+//
+// SortFunc requires that cmp is a strict weak ordering.
+// See https://en.wikipedia.org/wiki/Weak_ordering#Strict_weak_orderings.
+func SortFunc[S ~[]E, E any](x S, cmp func(a, b E) int) {
+	n := len(x)
+	pdqsortCmpFunc(x, 0, n, bits.Len(uint(n)), cmp)
+}
+
+// SortStableFunc sorts the slice x while keeping the original order of equal
+// elements, using cmp to compare elements in the same way as [SortFunc].
+func SortStableFunc[S ~[]E, E any](x S, cmp func(a, b E) int) {
+	stableCmpFunc(x, len(x), cmp)
+}
+
+// IsSorted reports whether x is sorted in ascending order.
+func IsSorted[S ~[]E, E cmp.Ordered](x S) bool {
+	for i := len(x) - 1; i > 0; i-- {
+		if cmp.Less(x[i], x[i-1]) {
+			return false
+		}
+	}
+	return true
+}
+
+// IsSortedFunc reports whether x is sorted in ascending order, with cmp as the
+// comparison function as defined by [SortFunc].
+func IsSortedFunc[S ~[]E, E any](x S, cmp func(a, b E) int) bool {
+	for i := len(x) - 1; i > 0; i-- {
+		if cmp(x[i], x[i-1]) < 0 {
+			return false
+		}
+	}
+	return true
+}
+
+// Min returns the minimal value in x. It panics if x is empty.
+// For floating-point numbers, Min propagates NaNs (any NaN value in x
+// forces the output to be NaN).
+func Min[S ~[]E, E cmp.Ordered](x S) E {
+	if len(x) < 1 {
+		panic("slices.Min: empty list")
+	}
+	m := x[0]
+	for i := 1; i < len(x); i++ {
+		m = min(m, x[i])
+	}
+	return m
+}
+
+// MinFunc returns the minimal value in x, using cmp to compare elements.
+// It panics if x is empty. If there is more than one minimal element
+// according to the cmp function, MinFunc returns the first one.
+func MinFunc[S ~[]E, E any](x S, cmp func(a, b E) int) E {
+	if len(x) < 1 {
+		panic("slices.MinFunc: empty list")
+	}
+	m := x[0]
+	for i := 1; i < len(x); i++ {
+		if cmp(x[i], m) < 0 {
+			m = x[i]
+		}
+	}
+	return m
+}
+
+// Max returns the maximal value in x. It panics if x is empty.
+// For floating-point E, Max propagates NaNs (any NaN value in x
+// forces the output to be NaN).
+func Max[S ~[]E, E cmp.Ordered](x S) E {
+	if len(x) < 1 {
+		panic("slices.Max: empty list")
+	}
+	m := x[0]
+	for i := 1; i < len(x); i++ {
+		m = max(m, x[i])
+	}
+	return m
+}
+
+// MaxFunc returns the maximal value in x, using cmp to compare elements.
+// It panics if x is empty. If there is more than one maximal element
+// according to the cmp function, MaxFunc returns the first one.
+func MaxFunc[S ~[]E, E any](x S, cmp func(a, b E) int) E {
+	if len(x) < 1 {
+		panic("slices.MaxFunc: empty list")
+	}
+	m := x[0]
+	for i := 1; i < len(x); i++ {
+		if cmp(x[i], m) > 0 {
+			m = x[i]
+		}
+	}
+	return m
+}
+
+// BinarySearch searches for target in a sorted slice and returns the position
+// where target is found, or the position where target would appear in the
+// sort order; it also returns a bool saying whether the target is really found
+// in the slice. The slice must be sorted in increasing order.
+func BinarySearch[S ~[]E, E cmp.Ordered](x S, target E) (int, bool) {
+	// Inlining is faster than calling BinarySearchFunc with a lambda.
+	n := len(x)
+	// Define x[-1] < target and x[n] >= target.
+	// Invariant: x[i-1] < target, x[j] >= target.
+	i, j := 0, n
+	for i < j {
+		h := int(uint(i+j) >> 1) // avoid overflow when computing h
+		// i ≤ h < j
+		if cmp.Less(x[h], target) {
+			i = h + 1 // preserves x[i-1] < target
+		} else {
+			j = h // preserves x[j] >= target
+		}
+	}
+	// i == j, x[i-1] < target, and x[j] (= x[i]) >= target  =>  answer is i.
+	return i, i < n && (x[i] == target || (isNaN(x[i]) && isNaN(target)))
+}
+
+// BinarySearchFunc works like [BinarySearch], but uses a custom comparison
+// function. The slice must be sorted in increasing order, where "increasing"
+// is defined by cmp. cmp should return 0 if the slice element matches
+// the target, a negative number if the slice element precedes the target,
+// or a positive number if the slice element follows the target.
+// cmp must implement the same ordering as the slice, such that if
+// cmp(a, t) < 0 and cmp(b, t) >= 0, then a must precede b in the slice.
+func BinarySearchFunc[S ~[]E, E, T any](x S, target T, cmp func(E, T) int) (int, bool) {
+	n := len(x)
+	// Define cmp(x[-1], target) < 0 and cmp(x[n], target) >= 0 .
+	// Invariant: cmp(x[i - 1], target) < 0, cmp(x[j], target) >= 0.
+	i, j := 0, n
+	for i < j {
+		h := int(uint(i+j) >> 1) // avoid overflow when computing h
+		// i ≤ h < j
+		if cmp(x[h], target) < 0 {
+			i = h + 1 // preserves cmp(x[i - 1], target) < 0
+		} else {
+			j = h // preserves cmp(x[j], target) >= 0
+		}
+	}
+	// i == j, cmp(x[i-1], target) < 0, and cmp(x[j], target) (= cmp(x[i], target)) >= 0  =>  answer is i.
+	return i, i < n && cmp(x[i], target) == 0
+}
+
+type sortedHint int // hint for pdqsort when choosing the pivot
+
+const (
+	unknownHint sortedHint = iota
+	increasingHint
+	decreasingHint
+)
+
+// xorshift paper: https://www.jstatsoft.org/article/view/v008i14/xorshift.pdf
+type xorshift uint64
+
+func (r *xorshift) Next() uint64 {
+	*r ^= *r << 13
+	*r ^= *r >> 17
+	*r ^= *r << 5
+	return uint64(*r)
+}
+
+func nextPowerOfTwo(length int) uint {
+	return 1 << bits.Len(uint(length))
+}
+
+// isNaN reports whether x is a NaN without requiring the math package.
+// This will always return false if T is not floating-point.
+func isNaN[T cmp.Ordered](x T) bool {
+	return x != x
+}
diff --git a/src/slices/sort_benchmark_test.go b/src/slices/sort_benchmark_test.go
new file mode 100644
index 0000000..0f08842
--- /dev/null
+++ b/src/slices/sort_benchmark_test.go
@@ -0,0 +1,284 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package slices
+
+import (
+	"fmt"
+	"math/rand"
+	"sort"
+	"strconv"
+	"strings"
+	"testing"
+)
+
+// These benchmarks compare sorting a large slice of int with sort.Ints vs.
+// slices.Sort
+func makeRandomInts(n int) []int {
+	rand.Seed(42)
+	ints := make([]int, n)
+	for i := 0; i < n; i++ {
+		ints[i] = rand.Intn(n)
+	}
+	return ints
+}
+
+func makeSortedInts(n int) []int {
+	ints := make([]int, n)
+	for i := 0; i < n; i++ {
+		ints[i] = i
+	}
+	return ints
+}
+
+func makeReversedInts(n int) []int {
+	ints := make([]int, n)
+	for i := 0; i < n; i++ {
+		ints[i] = n - i
+	}
+	return ints
+}
+
+const N = 100_000
+
+func BenchmarkSortInts(b *testing.B) {
+	for i := 0; i < b.N; i++ {
+		b.StopTimer()
+		ints := makeRandomInts(N)
+		b.StartTimer()
+		sort.Ints(ints)
+	}
+}
+
+func makeSortedStrings(n int) []string {
+	x := make([]string, n)
+	for i := 0; i < n; i++ {
+		x[i] = strconv.Itoa(i)
+	}
+	Sort(x)
+	return x
+}
+
+func BenchmarkSlicesSortInts(b *testing.B) {
+	for i := 0; i < b.N; i++ {
+		b.StopTimer()
+		ints := makeRandomInts(N)
+		b.StartTimer()
+		Sort(ints)
+	}
+}
+
+func BenchmarkSlicesSortInts_Sorted(b *testing.B) {
+	for i := 0; i < b.N; i++ {
+		b.StopTimer()
+		ints := makeSortedInts(N)
+		b.StartTimer()
+		Sort(ints)
+	}
+}
+
+func BenchmarkSlicesSortInts_Reversed(b *testing.B) {
+	for i := 0; i < b.N; i++ {
+		b.StopTimer()
+		ints := makeReversedInts(N)
+		b.StartTimer()
+		Sort(ints)
+	}
+}
+
+func BenchmarkIntsAreSorted(b *testing.B) {
+	for i := 0; i < b.N; i++ {
+		b.StopTimer()
+		ints := makeSortedInts(N)
+		b.StartTimer()
+		sort.IntsAreSorted(ints)
+	}
+}
+
+func BenchmarkIsSorted(b *testing.B) {
+	for i := 0; i < b.N; i++ {
+		b.StopTimer()
+		ints := makeSortedInts(N)
+		b.StartTimer()
+		IsSorted(ints)
+	}
+}
+
+// Since we're benchmarking these sorts against each other, make sure that they
+// generate similar results.
+func TestIntSorts(t *testing.T) {
+	ints := makeRandomInts(200)
+	ints2 := Clone(ints)
+
+	sort.Ints(ints)
+	Sort(ints2)
+
+	for i := range ints {
+		if ints[i] != ints2[i] {
+			t.Fatalf("ints2 mismatch at %d; %d != %d", i, ints[i], ints2[i])
+		}
+	}
+}
+
+// The following is a benchmark for sorting strings.
+
+// makeRandomStrings generates n random strings with alphabetic runes of
+// varying lengths.
+func makeRandomStrings(n int) []string {
+	rand.Seed(42)
+	var letters = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
+	ss := make([]string, n)
+	for i := 0; i < n; i++ {
+		var sb strings.Builder
+		slen := 2 + rand.Intn(50)
+		for j := 0; j < slen; j++ {
+			sb.WriteRune(letters[rand.Intn(len(letters))])
+		}
+		ss[i] = sb.String()
+	}
+	return ss
+}
+
+func TestStringSorts(t *testing.T) {
+	ss := makeRandomStrings(200)
+	ss2 := Clone(ss)
+
+	sort.Strings(ss)
+	Sort(ss2)
+
+	for i := range ss {
+		if ss[i] != ss2[i] {
+			t.Fatalf("ss2 mismatch at %d; %s != %s", i, ss[i], ss2[i])
+		}
+	}
+}
+
+func BenchmarkSortStrings(b *testing.B) {
+	for i := 0; i < b.N; i++ {
+		b.StopTimer()
+		ss := makeRandomStrings(N)
+		b.StartTimer()
+		sort.Strings(ss)
+	}
+}
+
+func BenchmarkSortStrings_Sorted(b *testing.B) {
+	ss := makeSortedStrings(N)
+	b.ResetTimer()
+
+	for i := 0; i < b.N; i++ {
+		sort.Strings(ss)
+	}
+}
+
+func BenchmarkSlicesSortStrings(b *testing.B) {
+	for i := 0; i < b.N; i++ {
+		b.StopTimer()
+		ss := makeRandomStrings(N)
+		b.StartTimer()
+		Sort(ss)
+	}
+}
+
+func BenchmarkSlicesSortStrings_Sorted(b *testing.B) {
+	ss := makeSortedStrings(N)
+	b.ResetTimer()
+
+	for i := 0; i < b.N; i++ {
+		Sort(ss)
+	}
+}
+
+// These benchmarks compare sorting a slice of structs with sort.Sort vs.
+// slices.SortFunc.
+type myStruct struct {
+	a, b, c, d string
+	n          int
+}
+
+type myStructs []*myStruct
+
+func (s myStructs) Len() int           { return len(s) }
+func (s myStructs) Less(i, j int) bool { return s[i].n < s[j].n }
+func (s myStructs) Swap(i, j int)      { s[i], s[j] = s[j], s[i] }
+
+func makeRandomStructs(n int) myStructs {
+	rand.Seed(42)
+	structs := make([]*myStruct, n)
+	for i := 0; i < n; i++ {
+		structs[i] = &myStruct{n: rand.Intn(n)}
+	}
+	return structs
+}
+
+func TestStructSorts(t *testing.T) {
+	ss := makeRandomStructs(200)
+	ss2 := make([]*myStruct, len(ss))
+	for i := range ss {
+		ss2[i] = &myStruct{n: ss[i].n}
+	}
+
+	sort.Sort(ss)
+	SortFunc(ss2, func(a, b *myStruct) int { return a.n - b.n })
+
+	for i := range ss {
+		if *ss[i] != *ss2[i] {
+			t.Fatalf("ints2 mismatch at %d; %v != %v", i, *ss[i], *ss2[i])
+		}
+	}
+}
+
+func BenchmarkSortStructs(b *testing.B) {
+	for i := 0; i < b.N; i++ {
+		b.StopTimer()
+		ss := makeRandomStructs(N)
+		b.StartTimer()
+		sort.Sort(ss)
+	}
+}
+
+func BenchmarkSortFuncStructs(b *testing.B) {
+	cmpFunc := func(a, b *myStruct) int { return a.n - b.n }
+	for i := 0; i < b.N; i++ {
+		b.StopTimer()
+		ss := makeRandomStructs(N)
+		b.StartTimer()
+		SortFunc(ss, cmpFunc)
+	}
+}
+
+func BenchmarkBinarySearchFloats(b *testing.B) {
+	for _, size := range []int{16, 32, 64, 128, 512, 1024} {
+		b.Run(fmt.Sprintf("Size%d", size), func(b *testing.B) {
+			floats := make([]float64, size)
+			for i := range floats {
+				floats[i] = float64(i)
+			}
+			midpoint := len(floats) / 2
+			needle := (floats[midpoint] + floats[midpoint+1]) / 2
+			b.ResetTimer()
+			for i := 0; i < b.N; i++ {
+				BinarySearch(floats, needle)
+			}
+		})
+	}
+}
+
+func BenchmarkBinarySearchFuncStruct(b *testing.B) {
+	for _, size := range []int{16, 32, 64, 128, 512, 1024} {
+		b.Run(fmt.Sprintf("Size%d", size), func(b *testing.B) {
+			structs := make([]*myStruct, size)
+			for i := range structs {
+				structs[i] = &myStruct{n: i}
+			}
+			midpoint := len(structs) / 2
+			needle := &myStruct{n: (structs[midpoint].n + structs[midpoint+1].n) / 2}
+			lessFunc := func(a, b *myStruct) int { return a.n - b.n }
+			b.ResetTimer()
+			for i := 0; i < b.N; i++ {
+				BinarySearchFunc(structs, needle, lessFunc)
+			}
+		})
+	}
+}
diff --git a/src/slices/sort_test.go b/src/slices/sort_test.go
new file mode 100644
index 0000000..af05859
--- /dev/null
+++ b/src/slices/sort_test.go
@@ -0,0 +1,442 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package slices
+
+import (
+	"cmp"
+	"fmt"
+	"math"
+	"math/rand"
+	"sort"
+	"strconv"
+	"strings"
+	"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.Inf(-1), 9845.768, -959.7485, 905, 7.8, 7.8, 74.3, 59.0, math.Inf(1), 238.2, -784.0, 2.3}
+var float64sWithNaNs = [...]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 strs = [...]string{"", "Hello", "foo", "bar", "foo", "f00", "%*&^*&^&", "***"}
+
+func TestSortIntSlice(t *testing.T) {
+	data := Clone(ints[:])
+	Sort(data)
+	if !IsSorted(data) {
+		t.Errorf("sorted %v", ints)
+		t.Errorf("   got %v", data)
+	}
+}
+
+func TestSortFuncIntSlice(t *testing.T) {
+	data := Clone(ints[:])
+	SortFunc(data, func(a, b int) int { return a - b })
+	if !IsSorted(data) {
+		t.Errorf("sorted %v", ints)
+		t.Errorf("   got %v", data)
+	}
+}
+
+func TestSortFloat64Slice(t *testing.T) {
+	data := Clone(float64s[:])
+	Sort(data)
+	if !IsSorted(data) {
+		t.Errorf("sorted %v", float64s)
+		t.Errorf("   got %v", data)
+	}
+}
+
+func TestSortFloat64SliceWithNaNs(t *testing.T) {
+	data := float64sWithNaNs[:]
+	data2 := Clone(data)
+
+	Sort(data)
+	sort.Float64s(data2)
+
+	if !IsSorted(data) {
+		t.Error("IsSorted indicates data isn't sorted")
+	}
+
+	// Compare for equality using cmp.Compare, which considers NaNs equal.
+	if !EqualFunc(data, data2, func(a, b float64) bool { return cmp.Compare(a, b) == 0 }) {
+		t.Errorf("mismatch between Sort and sort.Float64: got %v, want %v", data, data2)
+	}
+}
+
+func TestSortStringSlice(t *testing.T) {
+	data := Clone(strs[:])
+	Sort(data)
+	if !IsSorted(data) {
+		t.Errorf("sorted %v", strs)
+		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 IsSorted(data) {
+		t.Fatalf("terrible rand.rand")
+	}
+	Sort(data)
+	if !IsSorted(data) {
+		t.Errorf("sort didn't sort - 1M ints")
+	}
+}
+
+type intPair struct {
+	a, b int
+}
+
+type intPairs []intPair
+
+// Pairs compare on a only.
+func intPairCmp(x, y intPair) int {
+	return x.a - y.a
+}
+
+// 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 IsSortedFunc(data, intPairCmp) {
+		t.Fatalf("terrible rand.rand")
+	}
+	data.initB()
+	SortStableFunc(data, intPairCmp)
+	if !IsSortedFunc(data, intPairCmp) {
+		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()
+	SortStableFunc(data, intPairCmp)
+	if !IsSortedFunc(data, intPairCmp) {
+		t.Errorf("Stable shuffled sorted %d ints (order)", n)
+	}
+	if !data.inOrder() {
+		t.Errorf("Stable shuffled sorted %d ints (stability)", n)
+	}
+
+	// sorted reversed
+	for i := 0; i < len(data); i++ {
+		data[i].a = len(data) - i
+	}
+	data.initB()
+	SortStableFunc(data, intPairCmp)
+	if !IsSortedFunc(data, intPairCmp) {
+		t.Errorf("Stable didn't sort %d ints", n)
+	}
+	if !data.inOrder() {
+		t.Errorf("Stable wasn't stable on %d ints", n)
+	}
+}
+
+type S struct {
+	a int
+	b string
+}
+
+func cmpS(s1, s2 S) int {
+	return cmp.Compare(s1.a, s2.a)
+}
+
+func TestMinMax(t *testing.T) {
+	intCmp := func(a, b int) int { return a - b }
+
+	tests := []struct {
+		data    []int
+		wantMin int
+		wantMax int
+	}{
+		{[]int{7}, 7, 7},
+		{[]int{1, 2}, 1, 2},
+		{[]int{2, 1}, 1, 2},
+		{[]int{1, 2, 3}, 1, 3},
+		{[]int{3, 2, 1}, 1, 3},
+		{[]int{2, 1, 3}, 1, 3},
+		{[]int{2, 2, 3}, 2, 3},
+		{[]int{3, 2, 3}, 2, 3},
+		{[]int{0, 2, -9}, -9, 2},
+	}
+	for _, tt := range tests {
+		t.Run(fmt.Sprintf("%v", tt.data), func(t *testing.T) {
+			gotMin := Min(tt.data)
+			if gotMin != tt.wantMin {
+				t.Errorf("Min got %v, want %v", gotMin, tt.wantMin)
+			}
+
+			gotMinFunc := MinFunc(tt.data, intCmp)
+			if gotMinFunc != tt.wantMin {
+				t.Errorf("MinFunc got %v, want %v", gotMinFunc, tt.wantMin)
+			}
+
+			gotMax := Max(tt.data)
+			if gotMax != tt.wantMax {
+				t.Errorf("Max got %v, want %v", gotMax, tt.wantMax)
+			}
+
+			gotMaxFunc := MaxFunc(tt.data, intCmp)
+			if gotMaxFunc != tt.wantMax {
+				t.Errorf("MaxFunc got %v, want %v", gotMaxFunc, tt.wantMax)
+			}
+		})
+	}
+
+	svals := []S{
+		{1, "a"},
+		{2, "a"},
+		{1, "b"},
+		{2, "b"},
+	}
+
+	gotMin := MinFunc(svals, cmpS)
+	wantMin := S{1, "a"}
+	if gotMin != wantMin {
+		t.Errorf("MinFunc(%v) = %v, want %v", svals, gotMin, wantMin)
+	}
+
+	gotMax := MaxFunc(svals, cmpS)
+	wantMax := S{2, "a"}
+	if gotMax != wantMax {
+		t.Errorf("MaxFunc(%v) = %v, want %v", svals, gotMax, wantMax)
+	}
+}
+
+func TestMinMaxNaNs(t *testing.T) {
+	fs := []float64{1.0, 999.9, 3.14, -400.4, -5.14}
+	if Min(fs) != -400.4 {
+		t.Errorf("got min %v, want -400.4", Min(fs))
+	}
+	if Max(fs) != 999.9 {
+		t.Errorf("got max %v, want 999.9", Max(fs))
+	}
+
+	// No matter which element of fs is replaced with a NaN, both Min and Max
+	// should propagate the NaN to their output.
+	for i := 0; i < len(fs); i++ {
+		testfs := Clone(fs)
+		testfs[i] = math.NaN()
+
+		fmin := Min(testfs)
+		if !math.IsNaN(fmin) {
+			t.Errorf("got min %v, want NaN", fmin)
+		}
+
+		fmax := Max(testfs)
+		if !math.IsNaN(fmax) {
+			t.Errorf("got max %v, want NaN", fmax)
+		}
+	}
+}
+
+func TestMinMaxPanics(t *testing.T) {
+	intCmp := func(a, b int) int { return a - b }
+	emptySlice := []int{}
+
+	if !panics(func() { Min(emptySlice) }) {
+		t.Errorf("Min([]): got no panic, want panic")
+	}
+
+	if !panics(func() { Max(emptySlice) }) {
+		t.Errorf("Max([]): got no panic, want panic")
+	}
+
+	if !panics(func() { MinFunc(emptySlice, intCmp) }) {
+		t.Errorf("MinFunc([]): got no panic, want panic")
+	}
+
+	if !panics(func() { MaxFunc(emptySlice, intCmp) }) {
+		t.Errorf("MaxFunc([]): got no panic, want panic")
+	}
+}
+
+func TestBinarySearch(t *testing.T) {
+	str1 := []string{"foo"}
+	str2 := []string{"ab", "ca"}
+	str3 := []string{"mo", "qo", "vo"}
+	str4 := []string{"ab", "ad", "ca", "xy"}
+
+	// slice with repeating elements
+	strRepeats := []string{"ba", "ca", "da", "da", "da", "ka", "ma", "ma", "ta"}
+
+	// slice with all element equal
+	strSame := []string{"xx", "xx", "xx"}
+
+	tests := []struct {
+		data      []string
+		target    string
+		wantPos   int
+		wantFound bool
+	}{
+		{[]string{}, "foo", 0, false},
+		{[]string{}, "", 0, false},
+
+		{str1, "foo", 0, true},
+		{str1, "bar", 0, false},
+		{str1, "zx", 1, false},
+
+		{str2, "aa", 0, false},
+		{str2, "ab", 0, true},
+		{str2, "ad", 1, false},
+		{str2, "ca", 1, true},
+		{str2, "ra", 2, false},
+
+		{str3, "bb", 0, false},
+		{str3, "mo", 0, true},
+		{str3, "nb", 1, false},
+		{str3, "qo", 1, true},
+		{str3, "tr", 2, false},
+		{str3, "vo", 2, true},
+		{str3, "xr", 3, false},
+
+		{str4, "aa", 0, false},
+		{str4, "ab", 0, true},
+		{str4, "ac", 1, false},
+		{str4, "ad", 1, true},
+		{str4, "ax", 2, false},
+		{str4, "ca", 2, true},
+		{str4, "cc", 3, false},
+		{str4, "dd", 3, false},
+		{str4, "xy", 3, true},
+		{str4, "zz", 4, false},
+
+		{strRepeats, "da", 2, true},
+		{strRepeats, "db", 5, false},
+		{strRepeats, "ma", 6, true},
+		{strRepeats, "mb", 8, false},
+
+		{strSame, "xx", 0, true},
+		{strSame, "ab", 0, false},
+		{strSame, "zz", 3, false},
+	}
+	for _, tt := range tests {
+		t.Run(tt.target, func(t *testing.T) {
+			{
+				pos, found := BinarySearch(tt.data, tt.target)
+				if pos != tt.wantPos || found != tt.wantFound {
+					t.Errorf("BinarySearch got (%v, %v), want (%v, %v)", pos, found, tt.wantPos, tt.wantFound)
+				}
+			}
+
+			{
+				pos, found := BinarySearchFunc(tt.data, tt.target, strings.Compare)
+				if pos != tt.wantPos || found != tt.wantFound {
+					t.Errorf("BinarySearchFunc got (%v, %v), want (%v, %v)", pos, found, tt.wantPos, tt.wantFound)
+				}
+			}
+		})
+	}
+}
+
+func TestBinarySearchInts(t *testing.T) {
+	data := []int{20, 30, 40, 50, 60, 70, 80, 90}
+	tests := []struct {
+		target    int
+		wantPos   int
+		wantFound bool
+	}{
+		{20, 0, true},
+		{23, 1, false},
+		{43, 3, false},
+		{80, 6, true},
+	}
+	for _, tt := range tests {
+		t.Run(strconv.Itoa(tt.target), func(t *testing.T) {
+			{
+				pos, found := BinarySearch(data, tt.target)
+				if pos != tt.wantPos || found != tt.wantFound {
+					t.Errorf("BinarySearch got (%v, %v), want (%v, %v)", pos, found, tt.wantPos, tt.wantFound)
+				}
+			}
+
+			{
+				cmp := func(a, b int) int {
+					return a - b
+				}
+				pos, found := BinarySearchFunc(data, tt.target, cmp)
+				if pos != tt.wantPos || found != tt.wantFound {
+					t.Errorf("BinarySearchFunc got (%v, %v), want (%v, %v)", pos, found, tt.wantPos, tt.wantFound)
+				}
+			}
+		})
+	}
+}
+
+func TestBinarySearchFloats(t *testing.T) {
+	data := []float64{math.NaN(), -0.25, 0.0, 1.4}
+	tests := []struct {
+		target    float64
+		wantPos   int
+		wantFound bool
+	}{
+		{math.NaN(), 0, true},
+		{math.Inf(-1), 1, false},
+		{-0.25, 1, true},
+		{0.0, 2, true},
+		{1.4, 3, true},
+		{1.5, 4, false},
+	}
+	for _, tt := range tests {
+		t.Run(fmt.Sprintf("%v", tt.target), func(t *testing.T) {
+			{
+				pos, found := BinarySearch(data, tt.target)
+				if pos != tt.wantPos || found != tt.wantFound {
+					t.Errorf("BinarySearch got (%v, %v), want (%v, %v)", pos, found, tt.wantPos, tt.wantFound)
+				}
+			}
+		})
+	}
+}
+
+func TestBinarySearchFunc(t *testing.T) {
+	data := []int{1, 10, 11, 2} // sorted lexicographically
+	cmp := func(a int, b string) int {
+		return strings.Compare(strconv.Itoa(a), b)
+	}
+	pos, found := BinarySearchFunc(data, "2", cmp)
+	if pos != 3 || !found {
+		t.Errorf("BinarySearchFunc(%v, %q, cmp) = %v, %v, want %v, %v", data, "2", pos, found, 3, true)
+	}
+}
diff --git a/src/slices/zsortanyfunc.go b/src/slices/zsortanyfunc.go
new file mode 100644
index 0000000..06f2c7a
--- /dev/null
+++ b/src/slices/zsortanyfunc.go
@@ -0,0 +1,479 @@
+// Code generated by gen_sort_variants.go; DO NOT EDIT.
+
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package slices
+
+// insertionSortCmpFunc sorts data[a:b] using insertion sort.
+func insertionSortCmpFunc[E any](data []E, a, b int, cmp func(a, b E) int) {
+	for i := a + 1; i < b; i++ {
+		for j := i; j > a && (cmp(data[j], data[j-1]) < 0); j-- {
+			data[j], data[j-1] = data[j-1], data[j]
+		}
+	}
+}
+
+// siftDownCmpFunc implements the heap property on data[lo:hi].
+// first is an offset into the array where the root of the heap lies.
+func siftDownCmpFunc[E any](data []E, lo, hi, first int, cmp func(a, b E) int) {
+	root := lo
+	for {
+		child := 2*root + 1
+		if child >= hi {
+			break
+		}
+		if child+1 < hi && (cmp(data[first+child], data[first+child+1]) < 0) {
+			child++
+		}
+		if !(cmp(data[first+root], data[first+child]) < 0) {
+			return
+		}
+		data[first+root], data[first+child] = data[first+child], data[first+root]
+		root = child
+	}
+}
+
+func heapSortCmpFunc[E any](data []E, a, b int, cmp func(a, b E) int) {
+	first := a
+	lo := 0
+	hi := b - a
+
+	// Build heap with greatest element at top.
+	for i := (hi - 1) / 2; i >= 0; i-- {
+		siftDownCmpFunc(data, i, hi, first, cmp)
+	}
+
+	// Pop elements, largest first, into end of data.
+	for i := hi - 1; i >= 0; i-- {
+		data[first], data[first+i] = data[first+i], data[first]
+		siftDownCmpFunc(data, lo, i, first, cmp)
+	}
+}
+
+// pdqsortCmpFunc sorts data[a:b].
+// The algorithm based on pattern-defeating quicksort(pdqsort), but without the optimizations from BlockQuicksort.
+// pdqsort paper: https://arxiv.org/pdf/2106.05123.pdf
+// C++ implementation: https://github.com/orlp/pdqsort
+// Rust implementation: https://docs.rs/pdqsort/latest/pdqsort/
+// limit is the number of allowed bad (very unbalanced) pivots before falling back to heapsort.
+func pdqsortCmpFunc[E any](data []E, a, b, limit int, cmp func(a, b E) int) {
+	const maxInsertion = 12
+
+	var (
+		wasBalanced    = true // whether the last partitioning was reasonably balanced
+		wasPartitioned = true // whether the slice was already partitioned
+	)
+
+	for {
+		length := b - a
+
+		if length <= maxInsertion {
+			insertionSortCmpFunc(data, a, b, cmp)
+			return
+		}
+
+		// Fall back to heapsort if too many bad choices were made.
+		if limit == 0 {
+			heapSortCmpFunc(data, a, b, cmp)
+			return
+		}
+
+		// If the last partitioning was imbalanced, we need to breaking patterns.
+		if !wasBalanced {
+			breakPatternsCmpFunc(data, a, b, cmp)
+			limit--
+		}
+
+		pivot, hint := choosePivotCmpFunc(data, a, b, cmp)
+		if hint == decreasingHint {
+			reverseRangeCmpFunc(data, a, b, cmp)
+			// The chosen pivot was pivot-a elements after the start of the array.
+			// After reversing it is pivot-a elements before the end of the array.
+			// The idea came from Rust's implementation.
+			pivot = (b - 1) - (pivot - a)
+			hint = increasingHint
+		}
+
+		// The slice is likely already sorted.
+		if wasBalanced && wasPartitioned && hint == increasingHint {
+			if partialInsertionSortCmpFunc(data, a, b, cmp) {
+				return
+			}
+		}
+
+		// Probably the slice contains many duplicate elements, partition the slice into
+		// elements equal to and elements greater than the pivot.
+		if a > 0 && !(cmp(data[a-1], data[pivot]) < 0) {
+			mid := partitionEqualCmpFunc(data, a, b, pivot, cmp)
+			a = mid
+			continue
+		}
+
+		mid, alreadyPartitioned := partitionCmpFunc(data, a, b, pivot, cmp)
+		wasPartitioned = alreadyPartitioned
+
+		leftLen, rightLen := mid-a, b-mid
+		balanceThreshold := length / 8
+		if leftLen < rightLen {
+			wasBalanced = leftLen >= balanceThreshold
+			pdqsortCmpFunc(data, a, mid, limit, cmp)
+			a = mid + 1
+		} else {
+			wasBalanced = rightLen >= balanceThreshold
+			pdqsortCmpFunc(data, mid+1, b, limit, cmp)
+			b = mid
+		}
+	}
+}
+
+// partitionCmpFunc does one quicksort partition.
+// Let p = data[pivot]
+// Moves elements in data[a:b] around, so that data[i]<p and data[j]>=p for i<newpivot and j>newpivot.
+// On return, data[newpivot] = p
+func partitionCmpFunc[E any](data []E, a, b, pivot int, cmp func(a, b E) int) (newpivot int, alreadyPartitioned bool) {
+	data[a], data[pivot] = data[pivot], data[a]
+	i, j := a+1, b-1 // i and j are inclusive of the elements remaining to be partitioned
+
+	for i <= j && (cmp(data[i], data[a]) < 0) {
+		i++
+	}
+	for i <= j && !(cmp(data[j], data[a]) < 0) {
+		j--
+	}
+	if i > j {
+		data[j], data[a] = data[a], data[j]
+		return j, true
+	}
+	data[i], data[j] = data[j], data[i]
+	i++
+	j--
+
+	for {
+		for i <= j && (cmp(data[i], data[a]) < 0) {
+			i++
+		}
+		for i <= j && !(cmp(data[j], data[a]) < 0) {
+			j--
+		}
+		if i > j {
+			break
+		}
+		data[i], data[j] = data[j], data[i]
+		i++
+		j--
+	}
+	data[j], data[a] = data[a], data[j]
+	return j, false
+}
+
+// partitionEqualCmpFunc partitions data[a:b] into elements equal to data[pivot] followed by elements greater than data[pivot].
+// It assumed that data[a:b] does not contain elements smaller than the data[pivot].
+func partitionEqualCmpFunc[E any](data []E, a, b, pivot int, cmp func(a, b E) int) (newpivot int) {
+	data[a], data[pivot] = data[pivot], data[a]
+	i, j := a+1, b-1 // i and j are inclusive of the elements remaining to be partitioned
+
+	for {
+		for i <= j && !(cmp(data[a], data[i]) < 0) {
+			i++
+		}
+		for i <= j && (cmp(data[a], data[j]) < 0) {
+			j--
+		}
+		if i > j {
+			break
+		}
+		data[i], data[j] = data[j], data[i]
+		i++
+		j--
+	}
+	return i
+}
+
+// partialInsertionSortCmpFunc partially sorts a slice, returns true if the slice is sorted at the end.
+func partialInsertionSortCmpFunc[E any](data []E, a, b int, cmp func(a, b E) int) bool {
+	const (
+		maxSteps         = 5  // maximum number of adjacent out-of-order pairs that will get shifted
+		shortestShifting = 50 // don't shift any elements on short arrays
+	)
+	i := a + 1
+	for j := 0; j < maxSteps; j++ {
+		for i < b && !(cmp(data[i], data[i-1]) < 0) {
+			i++
+		}
+
+		if i == b {
+			return true
+		}
+
+		if b-a < shortestShifting {
+			return false
+		}
+
+		data[i], data[i-1] = data[i-1], data[i]
+
+		// Shift the smaller one to the left.
+		if i-a >= 2 {
+			for j := i - 1; j >= 1; j-- {
+				if !(cmp(data[j], data[j-1]) < 0) {
+					break
+				}
+				data[j], data[j-1] = data[j-1], data[j]
+			}
+		}
+		// Shift the greater one to the right.
+		if b-i >= 2 {
+			for j := i + 1; j < b; j++ {
+				if !(cmp(data[j], data[j-1]) < 0) {
+					break
+				}
+				data[j], data[j-1] = data[j-1], data[j]
+			}
+		}
+	}
+	return false
+}
+
+// breakPatternsCmpFunc scatters some elements around in an attempt to break some patterns
+// that might cause imbalanced partitions in quicksort.
+func breakPatternsCmpFunc[E any](data []E, a, b int, cmp func(a, b E) int) {
+	length := b - a
+	if length >= 8 {
+		random := xorshift(length)
+		modulus := nextPowerOfTwo(length)
+
+		for idx := a + (length/4)*2 - 1; idx <= a+(length/4)*2+1; idx++ {
+			other := int(uint(random.Next()) & (modulus - 1))
+			if other >= length {
+				other -= length
+			}
+			data[idx], data[a+other] = data[a+other], data[idx]
+		}
+	}
+}
+
+// choosePivotCmpFunc chooses a pivot in data[a:b].
+//
+// [0,8): chooses a static pivot.
+// [8,shortestNinther): uses the simple median-of-three method.
+// [shortestNinther,∞): uses the Tukey ninther method.
+func choosePivotCmpFunc[E any](data []E, a, b int, cmp func(a, b E) int) (pivot int, hint sortedHint) {
+	const (
+		shortestNinther = 50
+		maxSwaps        = 4 * 3
+	)
+
+	l := b - a
+
+	var (
+		swaps int
+		i     = a + l/4*1
+		j     = a + l/4*2
+		k     = a + l/4*3
+	)
+
+	if l >= 8 {
+		if l >= shortestNinther {
+			// Tukey ninther method, the idea came from Rust's implementation.
+			i = medianAdjacentCmpFunc(data, i, &swaps, cmp)
+			j = medianAdjacentCmpFunc(data, j, &swaps, cmp)
+			k = medianAdjacentCmpFunc(data, k, &swaps, cmp)
+		}
+		// Find the median among i, j, k and stores it into j.
+		j = medianCmpFunc(data, i, j, k, &swaps, cmp)
+	}
+
+	switch swaps {
+	case 0:
+		return j, increasingHint
+	case maxSwaps:
+		return j, decreasingHint
+	default:
+		return j, unknownHint
+	}
+}
+
+// order2CmpFunc returns x,y where data[x] <= data[y], where x,y=a,b or x,y=b,a.
+func order2CmpFunc[E any](data []E, a, b int, swaps *int, cmp func(a, b E) int) (int, int) {
+	if cmp(data[b], data[a]) < 0 {
+		*swaps++
+		return b, a
+	}
+	return a, b
+}
+
+// medianCmpFunc returns x where data[x] is the median of data[a],data[b],data[c], where x is a, b, or c.
+func medianCmpFunc[E any](data []E, a, b, c int, swaps *int, cmp func(a, b E) int) int {
+	a, b = order2CmpFunc(data, a, b, swaps, cmp)
+	b, c = order2CmpFunc(data, b, c, swaps, cmp)
+	a, b = order2CmpFunc(data, a, b, swaps, cmp)
+	return b
+}
+
+// medianAdjacentCmpFunc finds the median of data[a - 1], data[a], data[a + 1] and stores the index into a.
+func medianAdjacentCmpFunc[E any](data []E, a int, swaps *int, cmp func(a, b E) int) int {
+	return medianCmpFunc(data, a-1, a, a+1, swaps, cmp)
+}
+
+func reverseRangeCmpFunc[E any](data []E, a, b int, cmp func(a, b E) int) {
+	i := a
+	j := b - 1
+	for i < j {
+		data[i], data[j] = data[j], data[i]
+		i++
+		j--
+	}
+}
+
+func swapRangeCmpFunc[E any](data []E, a, b, n int, cmp func(a, b E) int) {
+	for i := 0; i < n; i++ {
+		data[a+i], data[b+i] = data[b+i], data[a+i]
+	}
+}
+
+func stableCmpFunc[E any](data []E, n int, cmp func(a, b E) int) {
+	blockSize := 20 // must be > 0
+	a, b := 0, blockSize
+	for b <= n {
+		insertionSortCmpFunc(data, a, b, cmp)
+		a = b
+		b += blockSize
+	}
+	insertionSortCmpFunc(data, a, n, cmp)
+
+	for blockSize < n {
+		a, b = 0, 2*blockSize
+		for b <= n {
+			symMergeCmpFunc(data, a, a+blockSize, b, cmp)
+			a = b
+			b += 2 * blockSize
+		}
+		if m := a + blockSize; m < n {
+			symMergeCmpFunc(data, a, m, n, cmp)
+		}
+		blockSize *= 2
+	}
+}
+
+// symMergeCmpFunc 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 symMergeCmpFunc[E any](data []E, a, m, b int, cmp func(a, b E) 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 := int(uint(i+j) >> 1)
+			if cmp(data[h], data[a]) < 0 {
+				i = h + 1
+			} else {
+				j = h
+			}
+		}
+		// Swap values until data[a] reaches the position before i.
+		for k := a; k < i-1; k++ {
+			data[k], data[k+1] = data[k+1], data[k]
+		}
+		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 := int(uint(i+j) >> 1)
+			if !(cmp(data[m], data[h]) < 0) {
+				i = h + 1
+			} else {
+				j = h
+			}
+		}
+		// Swap values until data[m] reaches the position i.
+		for k := m; k > i; k-- {
+			data[k], data[k-1] = data[k-1], data[k]
+		}
+		return
+	}
+
+	mid := int(uint(a+b) >> 1)
+	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 := int(uint(start+r) >> 1)
+		if !(cmp(data[p-c], data[c]) < 0) {
+			start = c + 1
+		} else {
+			r = c
+		}
+	}
+
+	end := n - start
+	if start < m && m < end {
+		rotateCmpFunc(data, start, m, end, cmp)
+	}
+	if a < start && start < mid {
+		symMergeCmpFunc(data, a, start, mid, cmp)
+	}
+	if mid < end && end < b {
+		symMergeCmpFunc(data, mid, end, b, cmp)
+	}
+}
+
+// rotateCmpFunc rotates two consecutive 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,
+// and it assumes non-degenerate arguments: a < m && m < b.
+func rotateCmpFunc[E any](data []E, a, m, b int, cmp func(a, b E) int) {
+	i := m - a
+	j := b - m
+
+	for i != j {
+		if i > j {
+			swapRangeCmpFunc(data, m-i, m, j, cmp)
+			i -= j
+		} else {
+			swapRangeCmpFunc(data, m-i, m+j-i, i, cmp)
+			j -= i
+		}
+	}
+	// i == j
+	swapRangeCmpFunc(data, m-i, m, i, cmp)
+}
diff --git a/src/slices/zsortordered.go b/src/slices/zsortordered.go
new file mode 100644
index 0000000..0822dbc
--- /dev/null
+++ b/src/slices/zsortordered.go
@@ -0,0 +1,481 @@
+// Code generated by gen_sort_variants.go; DO NOT EDIT.
+
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package slices
+
+import "cmp"
+
+// insertionSortOrdered sorts data[a:b] using insertion sort.
+func insertionSortOrdered[E cmp.Ordered](data []E, a, b int) {
+	for i := a + 1; i < b; i++ {
+		for j := i; j > a && cmp.Less(data[j], data[j-1]); j-- {
+			data[j], data[j-1] = data[j-1], data[j]
+		}
+	}
+}
+
+// siftDownOrdered implements the heap property on data[lo:hi].
+// first is an offset into the array where the root of the heap lies.
+func siftDownOrdered[E cmp.Ordered](data []E, lo, hi, first int) {
+	root := lo
+	for {
+		child := 2*root + 1
+		if child >= hi {
+			break
+		}
+		if child+1 < hi && cmp.Less(data[first+child], data[first+child+1]) {
+			child++
+		}
+		if !cmp.Less(data[first+root], data[first+child]) {
+			return
+		}
+		data[first+root], data[first+child] = data[first+child], data[first+root]
+		root = child
+	}
+}
+
+func heapSortOrdered[E cmp.Ordered](data []E, 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-- {
+		siftDownOrdered(data, i, hi, first)
+	}
+
+	// Pop elements, largest first, into end of data.
+	for i := hi - 1; i >= 0; i-- {
+		data[first], data[first+i] = data[first+i], data[first]
+		siftDownOrdered(data, lo, i, first)
+	}
+}
+
+// pdqsortOrdered sorts data[a:b].
+// The algorithm based on pattern-defeating quicksort(pdqsort), but without the optimizations from BlockQuicksort.
+// pdqsort paper: https://arxiv.org/pdf/2106.05123.pdf
+// C++ implementation: https://github.com/orlp/pdqsort
+// Rust implementation: https://docs.rs/pdqsort/latest/pdqsort/
+// limit is the number of allowed bad (very unbalanced) pivots before falling back to heapsort.
+func pdqsortOrdered[E cmp.Ordered](data []E, a, b, limit int) {
+	const maxInsertion = 12
+
+	var (
+		wasBalanced    = true // whether the last partitioning was reasonably balanced
+		wasPartitioned = true // whether the slice was already partitioned
+	)
+
+	for {
+		length := b - a
+
+		if length <= maxInsertion {
+			insertionSortOrdered(data, a, b)
+			return
+		}
+
+		// Fall back to heapsort if too many bad choices were made.
+		if limit == 0 {
+			heapSortOrdered(data, a, b)
+			return
+		}
+
+		// If the last partitioning was imbalanced, we need to breaking patterns.
+		if !wasBalanced {
+			breakPatternsOrdered(data, a, b)
+			limit--
+		}
+
+		pivot, hint := choosePivotOrdered(data, a, b)
+		if hint == decreasingHint {
+			reverseRangeOrdered(data, a, b)
+			// The chosen pivot was pivot-a elements after the start of the array.
+			// After reversing it is pivot-a elements before the end of the array.
+			// The idea came from Rust's implementation.
+			pivot = (b - 1) - (pivot - a)
+			hint = increasingHint
+		}
+
+		// The slice is likely already sorted.
+		if wasBalanced && wasPartitioned && hint == increasingHint {
+			if partialInsertionSortOrdered(data, a, b) {
+				return
+			}
+		}
+
+		// Probably the slice contains many duplicate elements, partition the slice into
+		// elements equal to and elements greater than the pivot.
+		if a > 0 && !cmp.Less(data[a-1], data[pivot]) {
+			mid := partitionEqualOrdered(data, a, b, pivot)
+			a = mid
+			continue
+		}
+
+		mid, alreadyPartitioned := partitionOrdered(data, a, b, pivot)
+		wasPartitioned = alreadyPartitioned
+
+		leftLen, rightLen := mid-a, b-mid
+		balanceThreshold := length / 8
+		if leftLen < rightLen {
+			wasBalanced = leftLen >= balanceThreshold
+			pdqsortOrdered(data, a, mid, limit)
+			a = mid + 1
+		} else {
+			wasBalanced = rightLen >= balanceThreshold
+			pdqsortOrdered(data, mid+1, b, limit)
+			b = mid
+		}
+	}
+}
+
+// partitionOrdered does one quicksort partition.
+// Let p = data[pivot]
+// Moves elements in data[a:b] around, so that data[i]<p and data[j]>=p for i<newpivot and j>newpivot.
+// On return, data[newpivot] = p
+func partitionOrdered[E cmp.Ordered](data []E, a, b, pivot int) (newpivot int, alreadyPartitioned bool) {
+	data[a], data[pivot] = data[pivot], data[a]
+	i, j := a+1, b-1 // i and j are inclusive of the elements remaining to be partitioned
+
+	for i <= j && cmp.Less(data[i], data[a]) {
+		i++
+	}
+	for i <= j && !cmp.Less(data[j], data[a]) {
+		j--
+	}
+	if i > j {
+		data[j], data[a] = data[a], data[j]
+		return j, true
+	}
+	data[i], data[j] = data[j], data[i]
+	i++
+	j--
+
+	for {
+		for i <= j && cmp.Less(data[i], data[a]) {
+			i++
+		}
+		for i <= j && !cmp.Less(data[j], data[a]) {
+			j--
+		}
+		if i > j {
+			break
+		}
+		data[i], data[j] = data[j], data[i]
+		i++
+		j--
+	}
+	data[j], data[a] = data[a], data[j]
+	return j, false
+}
+
+// partitionEqualOrdered partitions data[a:b] into elements equal to data[pivot] followed by elements greater than data[pivot].
+// It assumed that data[a:b] does not contain elements smaller than the data[pivot].
+func partitionEqualOrdered[E cmp.Ordered](data []E, a, b, pivot int) (newpivot int) {
+	data[a], data[pivot] = data[pivot], data[a]
+	i, j := a+1, b-1 // i and j are inclusive of the elements remaining to be partitioned
+
+	for {
+		for i <= j && !cmp.Less(data[a], data[i]) {
+			i++
+		}
+		for i <= j && cmp.Less(data[a], data[j]) {
+			j--
+		}
+		if i > j {
+			break
+		}
+		data[i], data[j] = data[j], data[i]
+		i++
+		j--
+	}
+	return i
+}
+
+// partialInsertionSortOrdered partially sorts a slice, returns true if the slice is sorted at the end.
+func partialInsertionSortOrdered[E cmp.Ordered](data []E, a, b int) bool {
+	const (
+		maxSteps         = 5  // maximum number of adjacent out-of-order pairs that will get shifted
+		shortestShifting = 50 // don't shift any elements on short arrays
+	)
+	i := a + 1
+	for j := 0; j < maxSteps; j++ {
+		for i < b && !cmp.Less(data[i], data[i-1]) {
+			i++
+		}
+
+		if i == b {
+			return true
+		}
+
+		if b-a < shortestShifting {
+			return false
+		}
+
+		data[i], data[i-1] = data[i-1], data[i]
+
+		// Shift the smaller one to the left.
+		if i-a >= 2 {
+			for j := i - 1; j >= 1; j-- {
+				if !cmp.Less(data[j], data[j-1]) {
+					break
+				}
+				data[j], data[j-1] = data[j-1], data[j]
+			}
+		}
+		// Shift the greater one to the right.
+		if b-i >= 2 {
+			for j := i + 1; j < b; j++ {
+				if !cmp.Less(data[j], data[j-1]) {
+					break
+				}
+				data[j], data[j-1] = data[j-1], data[j]
+			}
+		}
+	}
+	return false
+}
+
+// breakPatternsOrdered scatters some elements around in an attempt to break some patterns
+// that might cause imbalanced partitions in quicksort.
+func breakPatternsOrdered[E cmp.Ordered](data []E, a, b int) {
+	length := b - a
+	if length >= 8 {
+		random := xorshift(length)
+		modulus := nextPowerOfTwo(length)
+
+		for idx := a + (length/4)*2 - 1; idx <= a+(length/4)*2+1; idx++ {
+			other := int(uint(random.Next()) & (modulus - 1))
+			if other >= length {
+				other -= length
+			}
+			data[idx], data[a+other] = data[a+other], data[idx]
+		}
+	}
+}
+
+// choosePivotOrdered chooses a pivot in data[a:b].
+//
+// [0,8): chooses a static pivot.
+// [8,shortestNinther): uses the simple median-of-three method.
+// [shortestNinther,∞): uses the Tukey ninther method.
+func choosePivotOrdered[E cmp.Ordered](data []E, a, b int) (pivot int, hint sortedHint) {
+	const (
+		shortestNinther = 50
+		maxSwaps        = 4 * 3
+	)
+
+	l := b - a
+
+	var (
+		swaps int
+		i     = a + l/4*1
+		j     = a + l/4*2
+		k     = a + l/4*3
+	)
+
+	if l >= 8 {
+		if l >= shortestNinther {
+			// Tukey ninther method, the idea came from Rust's implementation.
+			i = medianAdjacentOrdered(data, i, &swaps)
+			j = medianAdjacentOrdered(data, j, &swaps)
+			k = medianAdjacentOrdered(data, k, &swaps)
+		}
+		// Find the median among i, j, k and stores it into j.
+		j = medianOrdered(data, i, j, k, &swaps)
+	}
+
+	switch swaps {
+	case 0:
+		return j, increasingHint
+	case maxSwaps:
+		return j, decreasingHint
+	default:
+		return j, unknownHint
+	}
+}
+
+// order2Ordered returns x,y where data[x] <= data[y], where x,y=a,b or x,y=b,a.
+func order2Ordered[E cmp.Ordered](data []E, a, b int, swaps *int) (int, int) {
+	if cmp.Less(data[b], data[a]) {
+		*swaps++
+		return b, a
+	}
+	return a, b
+}
+
+// medianOrdered returns x where data[x] is the median of data[a],data[b],data[c], where x is a, b, or c.
+func medianOrdered[E cmp.Ordered](data []E, a, b, c int, swaps *int) int {
+	a, b = order2Ordered(data, a, b, swaps)
+	b, c = order2Ordered(data, b, c, swaps)
+	a, b = order2Ordered(data, a, b, swaps)
+	return b
+}
+
+// medianAdjacentOrdered finds the median of data[a - 1], data[a], data[a + 1] and stores the index into a.
+func medianAdjacentOrdered[E cmp.Ordered](data []E, a int, swaps *int) int {
+	return medianOrdered(data, a-1, a, a+1, swaps)
+}
+
+func reverseRangeOrdered[E cmp.Ordered](data []E, a, b int) {
+	i := a
+	j := b - 1
+	for i < j {
+		data[i], data[j] = data[j], data[i]
+		i++
+		j--
+	}
+}
+
+func swapRangeOrdered[E cmp.Ordered](data []E, a, b, n int) {
+	for i := 0; i < n; i++ {
+		data[a+i], data[b+i] = data[b+i], data[a+i]
+	}
+}
+
+func stableOrdered[E cmp.Ordered](data []E, n int) {
+	blockSize := 20 // must be > 0
+	a, b := 0, blockSize
+	for b <= n {
+		insertionSortOrdered(data, a, b)
+		a = b
+		b += blockSize
+	}
+	insertionSortOrdered(data, a, n)
+
+	for blockSize < n {
+		a, b = 0, 2*blockSize
+		for b <= n {
+			symMergeOrdered(data, a, a+blockSize, b)
+			a = b
+			b += 2 * blockSize
+		}
+		if m := a + blockSize; m < n {
+			symMergeOrdered(data, a, m, n)
+		}
+		blockSize *= 2
+	}
+}
+
+// symMergeOrdered 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 symMergeOrdered[E cmp.Ordered](data []E, 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 := int(uint(i+j) >> 1)
+			if cmp.Less(data[h], data[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[k], data[k+1] = data[k+1], data[k]
+		}
+		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 := int(uint(i+j) >> 1)
+			if !cmp.Less(data[m], data[h]) {
+				i = h + 1
+			} else {
+				j = h
+			}
+		}
+		// Swap values until data[m] reaches the position i.
+		for k := m; k > i; k-- {
+			data[k], data[k-1] = data[k-1], data[k]
+		}
+		return
+	}
+
+	mid := int(uint(a+b) >> 1)
+	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 := int(uint(start+r) >> 1)
+		if !cmp.Less(data[p-c], data[c]) {
+			start = c + 1
+		} else {
+			r = c
+		}
+	}
+
+	end := n - start
+	if start < m && m < end {
+		rotateOrdered(data, start, m, end)
+	}
+	if a < start && start < mid {
+		symMergeOrdered(data, a, start, mid)
+	}
+	if mid < end && end < b {
+		symMergeOrdered(data, mid, end, b)
+	}
+}
+
+// rotateOrdered rotates two consecutive 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,
+// and it assumes non-degenerate arguments: a < m && m < b.
+func rotateOrdered[E cmp.Ordered](data []E, a, m, b int) {
+	i := m - a
+	j := b - m
+
+	for i != j {
+		if i > j {
+			swapRangeOrdered(data, m-i, m, j)
+			i -= j
+		} else {
+			swapRangeOrdered(data, m-i, m+j-i, i)
+			j -= i
+		}
+	}
+	// i == j
+	swapRangeOrdered(data, m-i, m, i)
+}
diff --git a/src/sort/gen_sort_variants.go b/src/sort/gen_sort_variants.go
index d738cac..2c12b98 100644
--- a/src/sort/gen_sort_variants.go
+++ b/src/sort/gen_sort_variants.go
@@ -77,15 +77,15 @@
 			Name:       "generic_ordered",
 			Path:       "zsortordered.go",
 			Package:    "slices",
-			Imports:    "import \"constraints\"\n",
+			Imports:    "import \"cmp\"\n",
 			FuncSuffix: "Ordered",
-			TypeParam:  "[E constraints.Ordered]",
+			TypeParam:  "[E cmp.Ordered]",
 			ExtraParam: "",
 			ExtraArg:   "",
 			DataType:   "[]E",
 			Funcs: template.FuncMap{
 				"Less": func(name, i, j string) string {
-					return fmt.Sprintf("(%s[%s] < %s[%s])", name, i, name, j)
+					return fmt.Sprintf("cmp.Less(%s[%s], %s[%s])", name, i, name, j)
 				},
 				"Swap": func(name, i, j string) string {
 					return fmt.Sprintf("%s[%s], %s[%s] = %s[%s], %s[%s]", name, i, name, j, name, j, name, i)
@@ -97,14 +97,14 @@
 			Name:       "generic_func",
 			Path:       "zsortanyfunc.go",
 			Package:    "slices",
-			FuncSuffix: "LessFunc",
+			FuncSuffix: "CmpFunc",
 			TypeParam:  "[E any]",
-			ExtraParam: ", less func(a, b E) bool",
-			ExtraArg:   ", less",
+			ExtraParam: ", cmp func(a, b E) int",
+			ExtraArg:   ", cmp",
 			DataType:   "[]E",
 			Funcs: template.FuncMap{
 				"Less": func(name, i, j string) string {
-					return fmt.Sprintf("less(%s[%s], %s[%s])", name, i, name, j)
+					return fmt.Sprintf("(cmp(%s[%s], %s[%s]) < 0)", name, i, name, j)
 				},
 				"Swap": func(name, i, j string) string {
 					return fmt.Sprintf("%s[%s], %s[%s] = %s[%s], %s[%s]", name, i, name, j, name, j, name, i)
diff --git a/src/sort/sort.go b/src/sort/sort.go
index 68e2f0d..1760e12 100644
--- a/src/sort/sort.go
+++ b/src/sort/sort.go
@@ -39,6 +39,9 @@
 // Sort sorts data in ascending order as determined by the Less method.
 // 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.
+//
+// Note: in many situations, the newer slices.SortFunc function is more
+// ergonomic and runs faster.
 func Sort(data Interface) {
 	n := data.Len()
 	if n <= 1 {
@@ -96,6 +99,9 @@
 }
 
 // IsSorted reports whether data is sorted.
+//
+// Note: in many situations, the newer slices.IsSortedFunc function is more
+// ergonomic and runs faster.
 func IsSorted(data Interface) bool {
 	n := data.Len()
 	for i := n - 1; i > 0; i-- {
@@ -154,23 +160,35 @@
 // Convenience wrappers for common cases
 
 // Ints sorts a slice of ints in increasing order.
+//
+// Note: consider using the newer slices.Sort function, which runs faster.
 func Ints(x []int) { Sort(IntSlice(x)) }
 
 // Float64s sorts a slice of float64s in increasing order.
 // Not-a-number (NaN) values are ordered before other values.
+//
+// Note: consider using the newer slices.Sort function, which runs faster.
 func Float64s(x []float64) { Sort(Float64Slice(x)) }
 
 // Strings sorts a slice of strings in increasing order.
+//
+// Note: consider using the newer slices.Sort function, which runs faster.
 func Strings(x []string) { Sort(StringSlice(x)) }
 
 // IntsAreSorted reports whether the slice x is sorted in increasing order.
+//
+// Note: consider using the newer slices.IsSorted function, which runs faster.
 func IntsAreSorted(x []int) bool { return IsSorted(IntSlice(x)) }
 
 // Float64sAreSorted reports whether the slice x is sorted in increasing order,
 // with not-a-number (NaN) values before any other values.
+//
+// Note: consider using the newer slices.IsSorted function, which runs faster.
 func Float64sAreSorted(x []float64) bool { return IsSorted(Float64Slice(x)) }
 
 // StringsAreSorted reports whether the slice x is sorted in increasing order.
+//
+// Note: consider using the newer slices.IsSorted function, which runs faster.
 func StringsAreSorted(x []string) bool { return IsSorted(StringSlice(x)) }
 
 // Notes on stable sorting:
@@ -204,6 +222,9 @@
 //
 // 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.
+//
+// Note: in many situations, the newer slices.SortStableFunc function is more
+// ergonomic and runs faster.
 func Stable(data Interface) {
 	stable(data, data.Len())
 }
diff --git a/src/strconv/atoi_test.go b/src/strconv/atoi_test.go
index 867fa66..d7f8f25 100644
--- a/src/strconv/atoi_test.go
+++ b/src/strconv/atoi_test.go
@@ -164,6 +164,7 @@
 	{"_12345", 0, ErrSyntax},
 	{"1__2345", 0, ErrSyntax},
 	{"12345_", 0, ErrSyntax},
+	{"123%45", 0, ErrSyntax},
 }
 
 type parseInt64BaseTest struct {
@@ -302,6 +303,7 @@
 	{"_12345", 0, ErrSyntax},
 	{"1__2345", 0, ErrSyntax},
 	{"12345_", 0, ErrSyntax},
+	{"123%45", 0, ErrSyntax},
 }
 
 type numErrorTest struct {
diff --git a/src/strconv/doc.go b/src/strconv/doc.go
index 769ecd9..fa20f90 100644
--- a/src/strconv/doc.go
+++ b/src/strconv/doc.go
@@ -14,7 +14,7 @@
 //
 // These assume decimal and the Go int type.
 //
-// ParseBool, ParseFloat, ParseInt, and ParseUint convert strings to values:
+// [ParseBool], [ParseFloat], [ParseInt], and [ParseUint] convert strings to values:
 //
 //	b, err := strconv.ParseBool("true")
 //	f, err := strconv.ParseFloat("3.1415", 64)
@@ -30,27 +30,27 @@
 //	...
 //	i := int32(i64)
 //
-// FormatBool, FormatFloat, FormatInt, and FormatUint convert values to strings:
+// [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
+// [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.
+// [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 := strconv.Quote("Hello, 世界")
 //	q := strconv.QuoteToASCII("Hello, 世界")
 //
-// QuoteRune and QuoteRuneToASCII are similar but accept runes and
+// [QuoteRune] and [QuoteRuneToASCII] are similar but accept runes and
 // return quoted Go rune literals.
 //
-// Unquote and UnquoteChar unquote Go string and rune literals.
+// [Unquote] and [UnquoteChar] unquote Go string and rune literals.
 package strconv
diff --git a/src/strconv/example_test.go b/src/strconv/example_test.go
index 3b4cedb..b02392d 100644
--- a/src/strconv/example_test.go
+++ b/src/strconv/example_test.go
@@ -134,9 +134,14 @@
 	s64 := strconv.FormatFloat(v, 'E', -1, 64)
 	fmt.Printf("%T, %v\n", s64, s64)
 
+	// fmt.Println uses these arguments to print floats
+	fmt64 := strconv.FormatFloat(v, 'g', -1, 64)
+	fmt.Printf("%T, %v\n", fmt64, fmt64)
+
 	// Output:
 	// string, 3.1415927E+00
 	// string, 3.1415926535E+00
+	// string, 3.1415926535
 }
 
 func ExampleFormatInt() {
diff --git a/src/strconv/isprint.go b/src/strconv/isprint.go
index 994a8e4..baa14a6 100644
--- a/src/strconv/isprint.go
+++ b/src/strconv/isprint.go
@@ -6,7 +6,7 @@
 
 package strconv
 
-// (434+132+95)*2 + (468)*4 = 3194 bytes
+// (424+133+112)*2 + (508)*4 = 3370 bytes
 
 var isPrint16 = []uint16{
 	0x0020, 0x007e,
@@ -17,16 +17,15 @@
 	0x058d, 0x05c7,
 	0x05d0, 0x05ea,
 	0x05ef, 0x05f4,
-	0x0606, 0x061b,
-	0x061e, 0x070d,
+	0x0606, 0x070d,
 	0x0710, 0x074a,
 	0x074d, 0x07b1,
 	0x07c0, 0x07fa,
 	0x07fd, 0x082d,
 	0x0830, 0x085b,
 	0x085e, 0x086a,
-	0x08a0, 0x08c7,
-	0x08d3, 0x098c,
+	0x0870, 0x088e,
+	0x0898, 0x098c,
 	0x098f, 0x0990,
 	0x0993, 0x09b2,
 	0x09b6, 0x09b9,
@@ -71,15 +70,16 @@
 	0x0bd7, 0x0bd7,
 	0x0be6, 0x0bfa,
 	0x0c00, 0x0c39,
-	0x0c3d, 0x0c4d,
+	0x0c3c, 0x0c4d,
 	0x0c55, 0x0c5a,
+	0x0c5d, 0x0c5d,
 	0x0c60, 0x0c63,
 	0x0c66, 0x0c6f,
 	0x0c77, 0x0cb9,
 	0x0cbc, 0x0ccd,
 	0x0cd5, 0x0cd6,
-	0x0cde, 0x0ce3,
-	0x0ce6, 0x0cf2,
+	0x0cdd, 0x0ce3,
+	0x0ce6, 0x0cf3,
 	0x0d00, 0x0d4f,
 	0x0d54, 0x0d63,
 	0x0d66, 0x0d96,
@@ -92,8 +92,7 @@
 	0x0e01, 0x0e3a,
 	0x0e3f, 0x0e5b,
 	0x0e81, 0x0ebd,
-	0x0ec0, 0x0ecd,
-	0x0ed0, 0x0ed9,
+	0x0ec0, 0x0ed9,
 	0x0edc, 0x0edf,
 	0x0f00, 0x0f6c,
 	0x0f71, 0x0fda,
@@ -112,15 +111,14 @@
 	0x13f8, 0x13fd,
 	0x1400, 0x169c,
 	0x16a0, 0x16f8,
-	0x1700, 0x1714,
-	0x1720, 0x1736,
+	0x1700, 0x1715,
+	0x171f, 0x1736,
 	0x1740, 0x1753,
 	0x1760, 0x1773,
 	0x1780, 0x17dd,
 	0x17e0, 0x17e9,
 	0x17f0, 0x17f9,
-	0x1800, 0x180d,
-	0x1810, 0x1819,
+	0x1800, 0x1819,
 	0x1820, 0x1878,
 	0x1880, 0x18aa,
 	0x18b0, 0x18f5,
@@ -137,10 +135,9 @@
 	0x1a7f, 0x1a89,
 	0x1a90, 0x1a99,
 	0x1aa0, 0x1aad,
-	0x1ab0, 0x1ac0,
-	0x1b00, 0x1b4b,
-	0x1b50, 0x1b7c,
-	0x1b80, 0x1bf3,
+	0x1ab0, 0x1ace,
+	0x1b00, 0x1b4c,
+	0x1b50, 0x1bf3,
 	0x1bfc, 0x1c37,
 	0x1c3b, 0x1c49,
 	0x1c4d, 0x1c88,
@@ -159,7 +156,7 @@
 	0x2030, 0x205e,
 	0x2070, 0x2071,
 	0x2074, 0x209c,
-	0x20a0, 0x20bf,
+	0x20a0, 0x20c0,
 	0x20d0, 0x20f0,
 	0x2100, 0x218b,
 	0x2190, 0x2426,
@@ -171,21 +168,20 @@
 	0x2d30, 0x2d67,
 	0x2d6f, 0x2d70,
 	0x2d7f, 0x2d96,
-	0x2da0, 0x2e52,
+	0x2da0, 0x2e5d,
 	0x2e80, 0x2ef3,
 	0x2f00, 0x2fd5,
 	0x2ff0, 0x2ffb,
 	0x3001, 0x3096,
 	0x3099, 0x30ff,
 	0x3105, 0x31e3,
-	0x31f0, 0x9ffc,
-	0xa000, 0xa48c,
+	0x31f0, 0xa48c,
 	0xa490, 0xa4c6,
 	0xa4d0, 0xa62b,
 	0xa640, 0xa6f7,
-	0xa700, 0xa7bf,
-	0xa7c2, 0xa7ca,
-	0xa7f5, 0xa82c,
+	0xa700, 0xa7ca,
+	0xa7d0, 0xa7d9,
+	0xa7f2, 0xa82c,
 	0xa830, 0xa839,
 	0xa840, 0xa877,
 	0xa880, 0xa8c5,
@@ -211,12 +207,11 @@
 	0xfa70, 0xfad9,
 	0xfb00, 0xfb06,
 	0xfb13, 0xfb17,
-	0xfb1d, 0xfbc1,
-	0xfbd3, 0xfd3f,
-	0xfd50, 0xfd8f,
+	0xfb1d, 0xfbc2,
+	0xfbd3, 0xfd8f,
 	0xfd92, 0xfdc7,
-	0xfdf0, 0xfdfd,
-	0xfe00, 0xfe19,
+	0xfdcf, 0xfdcf,
+	0xfdf0, 0xfe19,
 	0xfe20, 0xfe6b,
 	0xfe70, 0xfefc,
 	0xff01, 0xffbe,
@@ -235,10 +230,10 @@
 	0x03a2,
 	0x0530,
 	0x0590,
+	0x061c,
 	0x06dd,
 	0x083f,
 	0x085f,
-	0x08b5,
 	0x08e2,
 	0x0984,
 	0x09a9,
@@ -301,6 +296,7 @@
 	0x0ea6,
 	0x0ec5,
 	0x0ec7,
+	0x0ecf,
 	0x0f48,
 	0x0f98,
 	0x0fbd,
@@ -316,12 +312,12 @@
 	0x12d7,
 	0x1311,
 	0x1680,
-	0x170d,
 	0x176d,
 	0x1771,
+	0x180e,
 	0x191f,
 	0x1a5f,
-	0x1dfa,
+	0x1b7f,
 	0x1f58,
 	0x1f5a,
 	0x1f5c,
@@ -332,8 +328,6 @@
 	0x1ff5,
 	0x208f,
 	0x2b96,
-	0x2c2f,
-	0x2c5f,
 	0x2d26,
 	0x2da7,
 	0x2daf,
@@ -348,6 +342,8 @@
 	0x3130,
 	0x318f,
 	0x321f,
+	0xa7d2,
+	0xa7d4,
 	0xa9ce,
 	0xa9ff,
 	0xab27,
@@ -386,10 +382,11 @@
 	0x0104d8, 0x0104fb,
 	0x010500, 0x010527,
 	0x010530, 0x010563,
-	0x01056f, 0x01056f,
+	0x01056f, 0x0105bc,
 	0x010600, 0x010736,
 	0x010740, 0x010755,
 	0x010760, 0x010767,
+	0x010780, 0x0107ba,
 	0x010800, 0x010805,
 	0x010808, 0x010838,
 	0x01083c, 0x01083c,
@@ -422,19 +419,20 @@
 	0x010d30, 0x010d39,
 	0x010e60, 0x010ead,
 	0x010eb0, 0x010eb1,
-	0x010f00, 0x010f27,
+	0x010efd, 0x010f27,
 	0x010f30, 0x010f59,
+	0x010f70, 0x010f89,
 	0x010fb0, 0x010fcb,
 	0x010fe0, 0x010ff6,
 	0x011000, 0x01104d,
-	0x011052, 0x01106f,
-	0x01107f, 0x0110c1,
+	0x011052, 0x011075,
+	0x01107f, 0x0110c2,
 	0x0110d0, 0x0110e8,
 	0x0110f0, 0x0110f9,
 	0x011100, 0x011147,
 	0x011150, 0x011176,
 	0x011180, 0x0111f4,
-	0x011200, 0x01123e,
+	0x011200, 0x011241,
 	0x011280, 0x0112a9,
 	0x0112b0, 0x0112ea,
 	0x0112f0, 0x0112f9,
@@ -456,11 +454,11 @@
 	0x011600, 0x011644,
 	0x011650, 0x011659,
 	0x011660, 0x01166c,
-	0x011680, 0x0116b8,
+	0x011680, 0x0116b9,
 	0x0116c0, 0x0116c9,
 	0x011700, 0x01171a,
 	0x01171d, 0x01172b,
-	0x011730, 0x01173f,
+	0x011730, 0x011746,
 	0x011800, 0x01183b,
 	0x0118a0, 0x0118f2,
 	0x0118ff, 0x011906,
@@ -473,7 +471,8 @@
 	0x0119da, 0x0119e4,
 	0x011a00, 0x011a47,
 	0x011a50, 0x011aa2,
-	0x011ac0, 0x011af8,
+	0x011ab0, 0x011af8,
+	0x011b00, 0x011b09,
 	0x011c00, 0x011c45,
 	0x011c50, 0x011c6c,
 	0x011c70, 0x011c8f,
@@ -484,16 +483,20 @@
 	0x011d60, 0x011d98,
 	0x011da0, 0x011da9,
 	0x011ee0, 0x011ef8,
+	0x011f00, 0x011f3a,
+	0x011f3e, 0x011f59,
 	0x011fb0, 0x011fb0,
 	0x011fc0, 0x011ff1,
 	0x011fff, 0x012399,
 	0x012400, 0x012474,
 	0x012480, 0x012543,
-	0x013000, 0x01342e,
+	0x012f90, 0x012ff2,
+	0x013000, 0x01342f,
+	0x013440, 0x013455,
 	0x014400, 0x014646,
 	0x016800, 0x016a38,
 	0x016a40, 0x016a69,
-	0x016a6e, 0x016a6f,
+	0x016a6e, 0x016ac9,
 	0x016ad0, 0x016aed,
 	0x016af0, 0x016af5,
 	0x016b00, 0x016b45,
@@ -508,8 +511,10 @@
 	0x017000, 0x0187f7,
 	0x018800, 0x018cd5,
 	0x018d00, 0x018d08,
-	0x01b000, 0x01b11e,
+	0x01aff0, 0x01b122,
+	0x01b132, 0x01b132,
 	0x01b150, 0x01b152,
+	0x01b155, 0x01b155,
 	0x01b164, 0x01b167,
 	0x01b170, 0x01b2fb,
 	0x01bc00, 0x01bc6a,
@@ -517,11 +522,15 @@
 	0x01bc80, 0x01bc88,
 	0x01bc90, 0x01bc99,
 	0x01bc9c, 0x01bc9f,
+	0x01cf00, 0x01cf2d,
+	0x01cf30, 0x01cf46,
+	0x01cf50, 0x01cfc3,
 	0x01d000, 0x01d0f5,
 	0x01d100, 0x01d126,
 	0x01d129, 0x01d172,
-	0x01d17b, 0x01d1e8,
+	0x01d17b, 0x01d1ea,
 	0x01d200, 0x01d245,
+	0x01d2c0, 0x01d2d3,
 	0x01d2e0, 0x01d2f3,
 	0x01d300, 0x01d356,
 	0x01d360, 0x01d378,
@@ -534,15 +543,21 @@
 	0x01d6a8, 0x01d7cb,
 	0x01d7ce, 0x01da8b,
 	0x01da9b, 0x01daaf,
+	0x01df00, 0x01df1e,
+	0x01df25, 0x01df2a,
 	0x01e000, 0x01e018,
 	0x01e01b, 0x01e02a,
+	0x01e030, 0x01e06d,
+	0x01e08f, 0x01e08f,
 	0x01e100, 0x01e12c,
 	0x01e130, 0x01e13d,
 	0x01e140, 0x01e149,
 	0x01e14e, 0x01e14f,
+	0x01e290, 0x01e2ae,
 	0x01e2c0, 0x01e2f9,
 	0x01e2ff, 0x01e2ff,
-	0x01e800, 0x01e8c4,
+	0x01e4d0, 0x01e4f9,
+	0x01e7e0, 0x01e8c4,
 	0x01e8c7, 0x01e8d6,
 	0x01e900, 0x01e94b,
 	0x01e950, 0x01e959,
@@ -568,11 +583,12 @@
 	0x01f250, 0x01f251,
 	0x01f260, 0x01f265,
 	0x01f300, 0x01f6d7,
-	0x01f6e0, 0x01f6ec,
+	0x01f6dc, 0x01f6ec,
 	0x01f6f0, 0x01f6fc,
-	0x01f700, 0x01f773,
-	0x01f780, 0x01f7d8,
+	0x01f700, 0x01f776,
+	0x01f77b, 0x01f7d9,
 	0x01f7e0, 0x01f7eb,
+	0x01f7f0, 0x01f7f0,
 	0x01f800, 0x01f80b,
 	0x01f810, 0x01f847,
 	0x01f850, 0x01f859,
@@ -581,22 +597,22 @@
 	0x01f8b0, 0x01f8b1,
 	0x01f900, 0x01fa53,
 	0x01fa60, 0x01fa6d,
-	0x01fa70, 0x01fa74,
-	0x01fa78, 0x01fa7a,
-	0x01fa80, 0x01fa86,
-	0x01fa90, 0x01faa8,
-	0x01fab0, 0x01fab6,
-	0x01fac0, 0x01fac2,
-	0x01fad0, 0x01fad6,
+	0x01fa70, 0x01fa7c,
+	0x01fa80, 0x01fa88,
+	0x01fa90, 0x01fac5,
+	0x01face, 0x01fadb,
+	0x01fae0, 0x01fae8,
+	0x01faf0, 0x01faf8,
 	0x01fb00, 0x01fbca,
 	0x01fbf0, 0x01fbf9,
-	0x020000, 0x02a6dd,
-	0x02a700, 0x02b734,
+	0x020000, 0x02a6df,
+	0x02a700, 0x02b739,
 	0x02b740, 0x02b81d,
 	0x02b820, 0x02cea1,
 	0x02ceb0, 0x02ebe0,
 	0x02f800, 0x02fa1d,
 	0x030000, 0x03134a,
+	0x031350, 0x0323af,
 	0x0e0100, 0x0e01ef,
 }
 
@@ -607,6 +623,15 @@
 	0x003e,
 	0x018f,
 	0x039e,
+	0x057b,
+	0x058b,
+	0x0593,
+	0x0596,
+	0x05a2,
+	0x05b2,
+	0x05ba,
+	0x0786,
+	0x07b1,
 	0x0809,
 	0x0836,
 	0x0856,
@@ -644,10 +669,15 @@
 	0x1d69,
 	0x1d8f,
 	0x1d92,
+	0x1f11,
 	0x246f,
 	0x6a5f,
+	0x6abf,
 	0x6b5a,
 	0x6b62,
+	0xaff4,
+	0xaffc,
+	0xafff,
 	0xd455,
 	0xd49d,
 	0xd4ad,
@@ -665,6 +695,10 @@
 	0xe007,
 	0xe022,
 	0xe025,
+	0xe7e7,
+	0xe7ec,
+	0xe7ef,
+	0xe7ff,
 	0xee04,
 	0xee20,
 	0xee23,
@@ -693,8 +727,7 @@
 	0xeeaa,
 	0xf0c0,
 	0xf0d0,
-	0xf979,
-	0xf9cc,
+	0xfabe,
 	0xfb93,
 }
 
diff --git a/src/strings/builder.go b/src/strings/builder.go
index 7710464..299ad51 100644
--- a/src/strings/builder.go
+++ b/src/strings/builder.go
@@ -5,6 +5,7 @@
 package strings
 
 import (
+	"internal/bytealg"
 	"unicode/utf8"
 	"unsafe"
 )
@@ -65,7 +66,7 @@
 // grow copies the buffer to a new, larger buffer so that there are at least n
 // bytes of capacity beyond len(b.buf).
 func (b *Builder) grow(n int) {
-	buf := make([]byte, len(b.buf), 2*cap(b.buf)+n)
+	buf := bytealg.MakeNoZero(2*cap(b.buf) + n)[:len(b.buf)]
 	copy(buf, b.buf)
 	b.buf = buf
 }
diff --git a/src/strings/example_test.go b/src/strings/example_test.go
index 2a59512..ab83e10 100644
--- a/src/strings/example_test.go
+++ b/src/strings/example_test.go
@@ -8,8 +8,19 @@
 	"fmt"
 	"strings"
 	"unicode"
+	"unsafe"
 )
 
+func ExampleClone() {
+	s := "abc"
+	clone := strings.Clone(s)
+	fmt.Println(s == clone)
+	fmt.Println(unsafe.StringData(s) == unsafe.StringData(clone))
+	// Output:
+	// true
+	// false
+}
+
 func ExampleBuilder() {
 	var b strings.Builder
 	for i := 3; i >= 1; i-- {
@@ -93,6 +104,30 @@
 	// Cut("Gopher", "Badger") = "Gopher", "", false
 }
 
+func ExampleCutPrefix() {
+	show := func(s, sep string) {
+		after, found := strings.CutPrefix(s, sep)
+		fmt.Printf("CutPrefix(%q, %q) = %q, %v\n", s, sep, after, found)
+	}
+	show("Gopher", "Go")
+	show("Gopher", "ph")
+	// Output:
+	// CutPrefix("Gopher", "Go") = "pher", true
+	// CutPrefix("Gopher", "ph") = "Gopher", false
+}
+
+func ExampleCutSuffix() {
+	show := func(s, sep string) {
+		before, found := strings.CutSuffix(s, sep)
+		fmt.Printf("CutSuffix(%q, %q) = %q, %v\n", s, sep, before, found)
+	}
+	show("Gopher", "Go")
+	show("Gopher", "er")
+	// Output:
+	// CutSuffix("Gopher", "Go") = "Gopher", false
+	// CutSuffix("Gopher", "er") = "Goph", true
+}
+
 func ExampleEqualFold() {
 	fmt.Println(strings.EqualFold("Go", "go"))
 	fmt.Println(strings.EqualFold("AB", "ab")) // true because comparison uses simple case-folding
@@ -402,3 +437,13 @@
 	}))
 	// Output: ¡¡¡Hello, Gophers
 }
+
+func ExampleToValidUTF8() {
+	fmt.Printf("%s\n", strings.ToValidUTF8("abc", "\uFFFD"))
+	fmt.Printf("%s\n", strings.ToValidUTF8("a\xffb\xC0\xAFc\xff", ""))
+	fmt.Printf("%s\n", strings.ToValidUTF8("\xed\xa0\x80", "abc"))
+	// Output:
+	// abc
+	// abc
+	// abc
+}
diff --git a/src/strings/reader.go b/src/strings/reader.go
index 6f069a6..04f31a1 100644
--- a/src/strings/reader.go
+++ b/src/strings/reader.go
@@ -156,5 +156,5 @@
 func (r *Reader) Reset(s string) { *r = Reader{s, 0, -1} }
 
 // NewReader returns a new Reader reading from s.
-// It is similar to bytes.NewBufferString but more efficient and read-only.
+// It is similar to bytes.NewBufferString but more efficient and non-writable.
 func NewReader(s string) *Reader { return &Reader{s, 0, -1} }
diff --git a/src/strings/strings.go b/src/strings/strings.go
index 646161f..2dd4321 100644
--- a/src/strings/strings.go
+++ b/src/strings/strings.go
@@ -13,6 +13,8 @@
 	"unicode/utf8"
 )
 
+const maxInt = int(^uint(0) >> 1)
+
 // explode splits s into a slice of UTF-8 strings,
 // one string per Unicode character up to a maximum of n (n < 0 means no limit).
 // Invalid UTF-8 bytes are sliced individually.
@@ -69,6 +71,11 @@
 	return IndexRune(s, r) >= 0
 }
 
+// ContainsFunc reports whether any Unicode code points r within s satisfy f(r).
+func ContainsFunc(s string, f func(rune) bool) bool {
+	return IndexFunc(s, f) >= 0
+}
+
 // LastIndex returns the index of the last instance of substr in s, or -1 if substr is not present in s.
 func LastIndex(s, substr string) int {
 	n := len(substr)
@@ -431,9 +438,19 @@
 	case 1:
 		return elems[0]
 	}
-	n := len(sep) * (len(elems) - 1)
-	for i := 0; i < len(elems); i++ {
-		n += len(elems[i])
+
+	var n int
+	if len(sep) > 0 {
+		if len(sep) >= maxInt/(len(elems)-1) {
+			panic("strings: Join output length overflow")
+		}
+		n += len(sep) * (len(elems) - 1)
+	}
+	for _, elem := range elems {
+		if len(elem) > maxInt-n {
+			panic("strings: Join output length overflow")
+		}
+		n += len(elem)
 	}
 
 	var b Builder
@@ -531,21 +548,20 @@
 	}
 
 	// Since we cannot return an error on overflow,
-	// we should panic if the repeat will generate
-	// an overflow.
+	// we should panic if the repeat will generate an overflow.
 	// See golang.org/issue/16237.
 	if count < 0 {
 		panic("strings: negative Repeat count")
-	} else if len(s)*count/count != len(s) {
-		panic("strings: Repeat count causes overflow")
 	}
+	if len(s) >= maxInt/count {
+		panic("strings: Repeat output length overflow")
+	}
+	n := len(s) * count
 
 	if len(s) == 0 {
 		return ""
 	}
 
-	n := len(s) * count
-
 	// Past a certain chunk size it is counterproductive to use
 	// larger chunks as the source of the write, as when the source
 	// is too large we are basically just thrashing the CPU D-cache.
diff --git a/src/strings/strings_test.go b/src/strings/strings_test.go
index 3991d12..f93cf68 100644
--- a/src/strings/strings_test.go
+++ b/src/strings/strings_test.go
@@ -1535,6 +1535,17 @@
 	}
 }
 
+func TestContainsFunc(t *testing.T) {
+	for _, ct := range ContainsRuneTests {
+		if ContainsFunc(ct.str, func(r rune) bool {
+			return ct.r == r
+		}) != ct.expected {
+			t.Errorf("ContainsFunc(%q, func(%q)) = %v, want %v",
+				ct.str, ct.r, !ct.expected, ct.expected)
+		}
+	}
+}
+
 var EqualFoldTests = []struct {
 	s, t string
 	out  bool
@@ -1668,7 +1679,7 @@
 
 var cutSuffixTests = []struct {
 	s, sep string
-	after  string
+	before string
 	found  bool
 }{
 	{"abc", "bc", "a", true},
@@ -1681,8 +1692,8 @@
 
 func TestCutSuffix(t *testing.T) {
 	for _, tt := range cutSuffixTests {
-		if after, found := CutSuffix(tt.s, tt.sep); after != tt.after || found != tt.found {
-			t.Errorf("CutSuffix(%q, %q) = %q, %v, want %q, %v", tt.s, tt.sep, after, found, tt.after, tt.found)
+		if before, found := CutSuffix(tt.s, tt.sep); before != tt.before || found != tt.found {
+			t.Errorf("CutSuffix(%q, %q) = %q, %v, want %q, %v", tt.s, tt.sep, before, found, tt.before, tt.found)
 		}
 	}
 }
diff --git a/src/sync/atomic/doc.go b/src/sync/atomic/doc.go
index 472ab9d..c22d115 100644
--- a/src/sync/atomic/doc.go
+++ b/src/sync/atomic/doc.go
@@ -7,7 +7,7 @@
 //
 // 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.
+// done with channels or the facilities of the [sync] package.
 // Share memory by communicating;
 // don't communicate by sharing memory.
 //
diff --git a/src/sync/atomic/type.go b/src/sync/atomic/type.go
index cc01683..179fa93 100644
--- a/src/sync/atomic/type.go
+++ b/src/sync/atomic/type.go
@@ -111,7 +111,7 @@
 // Add atomically adds delta to x and returns the new value.
 func (x *Int64) Add(delta int64) (new int64) { return AddInt64(&x.v, delta) }
 
-// An Uint32 is an atomic uint32. The zero value is zero.
+// A Uint32 is an atomic uint32. The zero value is zero.
 type Uint32 struct {
 	_ noCopy
 	v uint32
@@ -134,7 +134,7 @@
 // Add atomically adds delta to x and returns the new value.
 func (x *Uint32) Add(delta uint32) (new uint32) { return AddUint32(&x.v, delta) }
 
-// An Uint64 is an atomic uint64. The zero value is zero.
+// A Uint64 is an atomic uint64. The zero value is zero.
 type Uint64 struct {
 	_ noCopy
 	_ align64
@@ -158,7 +158,7 @@
 // Add atomically adds delta to x and returns the new value.
 func (x *Uint64) Add(delta uint64) (new uint64) { return AddUint64(&x.v, delta) }
 
-// An Uintptr is an atomic uintptr. The zero value is zero.
+// A Uintptr is an atomic uintptr. The zero value is zero.
 type Uintptr struct {
 	_ noCopy
 	v uintptr
diff --git a/src/sync/cond_test.go b/src/sync/cond_test.go
index 859cae5..aa134e3 100644
--- a/src/sync/cond_test.go
+++ b/src/sync/cond_test.go
@@ -9,7 +9,6 @@
 	"runtime"
 	. "sync"
 	"testing"
-	"time"
 )
 
 func TestCondSignal(t *testing.T) {
@@ -228,11 +227,7 @@
 		}()
 
 		// Check that the first waiter does get signaled.
-		select {
-		case <-ch:
-		case <-time.After(2 * time.Second):
-			t.Fatalf("First waiter didn't get broadcast.")
-		}
+		<-ch
 
 		// Release the second waiter in case it didn't get the
 		// broadcast.
diff --git a/src/sync/oncefunc.go b/src/sync/oncefunc.go
new file mode 100644
index 0000000..9ef8344
--- /dev/null
+++ b/src/sync/oncefunc.go
@@ -0,0 +1,97 @@
+// Copyright 2022 The Go Authors. 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
+
+// OnceFunc returns a function that invokes f only once. The returned function
+// may be called concurrently.
+//
+// If f panics, the returned function will panic with the same value on every call.
+func OnceFunc(f func()) func() {
+	var (
+		once  Once
+		valid bool
+		p     any
+	)
+	// Construct the inner closure just once to reduce costs on the fast path.
+	g := func() {
+		defer func() {
+			p = recover()
+			if !valid {
+				// Re-panic immediately so on the first call the user gets a
+				// complete stack trace into f.
+				panic(p)
+			}
+		}()
+		f()
+		valid = true // Set only if f does not panic
+	}
+	return func() {
+		once.Do(g)
+		if !valid {
+			panic(p)
+		}
+	}
+}
+
+// OnceValue returns a function that invokes f only once and returns the value
+// returned by f. The returned function may be called concurrently.
+//
+// If f panics, the returned function will panic with the same value on every call.
+func OnceValue[T any](f func() T) func() T {
+	var (
+		once   Once
+		valid  bool
+		p      any
+		result T
+	)
+	g := func() {
+		defer func() {
+			p = recover()
+			if !valid {
+				panic(p)
+			}
+		}()
+		result = f()
+		valid = true
+	}
+	return func() T {
+		once.Do(g)
+		if !valid {
+			panic(p)
+		}
+		return result
+	}
+}
+
+// OnceValues returns a function that invokes f only once and returns the values
+// returned by f. The returned function may be called concurrently.
+//
+// If f panics, the returned function will panic with the same value on every call.
+func OnceValues[T1, T2 any](f func() (T1, T2)) func() (T1, T2) {
+	var (
+		once  Once
+		valid bool
+		p     any
+		r1    T1
+		r2    T2
+	)
+	g := func() {
+		defer func() {
+			p = recover()
+			if !valid {
+				panic(p)
+			}
+		}()
+		r1, r2 = f()
+		valid = true
+	}
+	return func() (T1, T2) {
+		once.Do(g)
+		if !valid {
+			panic(p)
+		}
+		return r1, r2
+	}
+}
diff --git a/src/sync/oncefunc_test.go b/src/sync/oncefunc_test.go
new file mode 100644
index 0000000..3c523a5
--- /dev/null
+++ b/src/sync/oncefunc_test.go
@@ -0,0 +1,265 @@
+// Copyright 2022 The Go Authors. 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 (
+	"bytes"
+	"runtime"
+	"runtime/debug"
+	"sync"
+	"testing"
+)
+
+// We assume that the Once.Do tests have already covered parallelism.
+
+func TestOnceFunc(t *testing.T) {
+	calls := 0
+	f := sync.OnceFunc(func() { calls++ })
+	allocs := testing.AllocsPerRun(10, f)
+	if calls != 1 {
+		t.Errorf("want calls==1, got %d", calls)
+	}
+	if allocs != 0 {
+		t.Errorf("want 0 allocations per call, got %v", allocs)
+	}
+}
+
+func TestOnceValue(t *testing.T) {
+	calls := 0
+	f := sync.OnceValue(func() int {
+		calls++
+		return calls
+	})
+	allocs := testing.AllocsPerRun(10, func() { f() })
+	value := f()
+	if calls != 1 {
+		t.Errorf("want calls==1, got %d", calls)
+	}
+	if value != 1 {
+		t.Errorf("want value==1, got %d", value)
+	}
+	if allocs != 0 {
+		t.Errorf("want 0 allocations per call, got %v", allocs)
+	}
+}
+
+func TestOnceValues(t *testing.T) {
+	calls := 0
+	f := sync.OnceValues(func() (int, int) {
+		calls++
+		return calls, calls + 1
+	})
+	allocs := testing.AllocsPerRun(10, func() { f() })
+	v1, v2 := f()
+	if calls != 1 {
+		t.Errorf("want calls==1, got %d", calls)
+	}
+	if v1 != 1 || v2 != 2 {
+		t.Errorf("want v1==1 and v2==2, got %d and %d", v1, v2)
+	}
+	if allocs != 0 {
+		t.Errorf("want 0 allocations per call, got %v", allocs)
+	}
+}
+
+func testOncePanicX(t *testing.T, calls *int, f func()) {
+	testOncePanicWith(t, calls, f, func(label string, p any) {
+		if p != "x" {
+			t.Fatalf("%s: want panic %v, got %v", label, "x", p)
+		}
+	})
+}
+
+func testOncePanicWith(t *testing.T, calls *int, f func(), check func(label string, p any)) {
+	// Check that the each call to f panics with the same value, but the
+	// underlying function is only called once.
+	for _, label := range []string{"first time", "second time"} {
+		var p any
+		panicked := true
+		func() {
+			defer func() {
+				p = recover()
+			}()
+			f()
+			panicked = false
+		}()
+		if !panicked {
+			t.Fatalf("%s: f did not panic", label)
+		}
+		check(label, p)
+	}
+	if *calls != 1 {
+		t.Errorf("want calls==1, got %d", *calls)
+	}
+}
+
+func TestOnceFuncPanic(t *testing.T) {
+	calls := 0
+	f := sync.OnceFunc(func() {
+		calls++
+		panic("x")
+	})
+	testOncePanicX(t, &calls, f)
+}
+
+func TestOnceValuePanic(t *testing.T) {
+	calls := 0
+	f := sync.OnceValue(func() int {
+		calls++
+		panic("x")
+	})
+	testOncePanicX(t, &calls, func() { f() })
+}
+
+func TestOnceValuesPanic(t *testing.T) {
+	calls := 0
+	f := sync.OnceValues(func() (int, int) {
+		calls++
+		panic("x")
+	})
+	testOncePanicX(t, &calls, func() { f() })
+}
+
+func TestOnceFuncPanicNil(t *testing.T) {
+	calls := 0
+	f := sync.OnceFunc(func() {
+		calls++
+		panic(nil)
+	})
+	testOncePanicWith(t, &calls, f, func(label string, p any) {
+		switch p.(type) {
+		case nil, *runtime.PanicNilError:
+			return
+		}
+		t.Fatalf("%s: want nil panic, got %v", label, p)
+	})
+}
+
+func TestOnceFuncGoexit(t *testing.T) {
+	// If f calls Goexit, the results are unspecified. But check that f doesn't
+	// get called twice.
+	calls := 0
+	f := sync.OnceFunc(func() {
+		calls++
+		runtime.Goexit()
+	})
+	var wg sync.WaitGroup
+	for i := 0; i < 2; i++ {
+		wg.Add(1)
+		go func() {
+			defer wg.Done()
+			defer func() { recover() }()
+			f()
+		}()
+		wg.Wait()
+	}
+	if calls != 1 {
+		t.Errorf("want calls==1, got %d", calls)
+	}
+}
+
+func TestOnceFuncPanicTraceback(t *testing.T) {
+	// Test that on the first invocation of a OnceFunc, the stack trace goes all
+	// the way to the origin of the panic.
+	f := sync.OnceFunc(onceFuncPanic)
+
+	defer func() {
+		if p := recover(); p != "x" {
+			t.Fatalf("want panic %v, got %v", "x", p)
+		}
+		stack := debug.Stack()
+		want := "sync_test.onceFuncPanic"
+		if !bytes.Contains(stack, []byte(want)) {
+			t.Fatalf("want stack containing %v, got:\n%s", want, string(stack))
+		}
+	}()
+	f()
+}
+
+func onceFuncPanic() {
+	panic("x")
+}
+
+var (
+	onceFunc = sync.OnceFunc(func() {})
+
+	onceFuncOnce sync.Once
+)
+
+func doOnceFunc() {
+	onceFuncOnce.Do(func() {})
+}
+
+func BenchmarkOnceFunc(b *testing.B) {
+	b.Run("v=Once", func(b *testing.B) {
+		b.ReportAllocs()
+		for i := 0; i < b.N; i++ {
+			// The baseline is direct use of sync.Once.
+			doOnceFunc()
+		}
+	})
+	b.Run("v=Global", func(b *testing.B) {
+		b.ReportAllocs()
+		for i := 0; i < b.N; i++ {
+			// As of 3/2023, the compiler doesn't recognize that onceFunc is
+			// never mutated and is a closure that could be inlined.
+			// Too bad, because this is how OnceFunc will usually be used.
+			onceFunc()
+		}
+	})
+	b.Run("v=Local", func(b *testing.B) {
+		b.ReportAllocs()
+		// As of 3/2023, the compiler *does* recognize this local binding as an
+		// inlinable closure. This is the best case for OnceFunc, but probably
+		// not typical usage.
+		f := sync.OnceFunc(func() {})
+		for i := 0; i < b.N; i++ {
+			f()
+		}
+	})
+}
+
+var (
+	onceValue = sync.OnceValue(func() int { return 42 })
+
+	onceValueOnce  sync.Once
+	onceValueValue int
+)
+
+func doOnceValue() int {
+	onceValueOnce.Do(func() {
+		onceValueValue = 42
+	})
+	return onceValueValue
+}
+
+func BenchmarkOnceValue(b *testing.B) {
+	// See BenchmarkOnceFunc
+	b.Run("v=Once", func(b *testing.B) {
+		b.ReportAllocs()
+		for i := 0; i < b.N; i++ {
+			if want, got := 42, doOnceValue(); want != got {
+				b.Fatalf("want %d, got %d", want, got)
+			}
+		}
+	})
+	b.Run("v=Global", func(b *testing.B) {
+		b.ReportAllocs()
+		for i := 0; i < b.N; i++ {
+			if want, got := 42, onceValue(); want != got {
+				b.Fatalf("want %d, got %d", want, got)
+			}
+		}
+	})
+	b.Run("v=Local", func(b *testing.B) {
+		b.ReportAllocs()
+		onceValue := sync.OnceValue(func() int { return 42 })
+		for i := 0; i < b.N; i++ {
+			if want, got := 42, onceValue(); want != got {
+				b.Fatalf("want %d, got %d", want, got)
+			}
+		}
+	})
+}
diff --git a/src/sync/rwmutex.go b/src/sync/rwmutex.go
index ad52951..1317624 100644
--- a/src/sync/rwmutex.go
+++ b/src/sync/rwmutex.go
@@ -219,6 +219,19 @@
 	}
 }
 
+// syscall_hasWaitingReaders reports whether any goroutine is waiting
+// to acquire a read lock on rw. This exists because syscall.ForkLock
+// is an RWMutex, and we can't change that without breaking compatibility.
+// We don't need or want RWMutex semantics for ForkLock, and we use
+// this private API to avoid having to change the type of ForkLock.
+// For more details see the syscall package.
+//
+//go:linkname syscall_hasWaitingReaders syscall.hasWaitingReaders
+func syscall_hasWaitingReaders(rw *RWMutex) bool {
+	r := rw.readerCount.Load()
+	return r < 0 && r+rwmutexMaxReaders > 0
+}
+
 // RLocker returns a Locker interface that implements
 // the Lock and Unlock methods by calling rw.RLock and rw.RUnlock.
 func (rw *RWMutex) RLocker() Locker {
diff --git a/src/syscall/asm9_unix2_amd64.s b/src/syscall/asm9_unix2_amd64.s
index 5bf53a1..bb4e9db 100644
--- a/src/syscall/asm9_unix2_amd64.s
+++ b/src/syscall/asm9_unix2_amd64.s
@@ -2,17 +2,18 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build dragonfly || freebsd
+//go:build dragonfly || freebsd || netbsd
 
 #include "textflag.h"
 #include "funcdata.h"
 
 //
-// Syscall9 support for AMD64, DragonFly and FreeBSD
+// Syscall9 support for AMD64, DragonFly, FreeBSD and NetBSD
 //
 
 // func Syscall9(trap int64, a1, a2, a3, a4, a5, a6, a7, a8, a9 int64) (r1, r2, err int64);
-TEXT	·Syscall9(SB),NOSPLIT,$0-104
+TEXT	·Syscall9(SB),NOSPLIT,$32-104
+	NO_LOCAL_POINTERS
 	CALL	runtime·entersyscall<ABIInternal>(SB)
 	MOVQ	num+0(FP), AX	// syscall entry
 	MOVQ	a1+8(FP), DI
@@ -21,17 +22,15 @@
 	MOVQ	a4+32(FP), R10
 	MOVQ	a5+40(FP), R8
 	MOVQ	a6+48(FP), R9
+	MOVQ	a7+56(FP), R11
+	MOVQ	a8+64(FP), R12
+	MOVQ	a9+72(FP), R13
 
-	// shift around the last three arguments so they're at the
-	// top of the stack when the syscall is called.
-	// note that we are scribbling over the Go arguments now.
-	MOVQ	SP, CX	// hide (SP) writes from vet
-	MOVQ	a7+56(FP), R11 // arg 7
-	MOVQ	R11, 8(CX)
-	MOVQ	a8+64(FP), R11 // arg 8
-	MOVQ	R11, 16(CX)
-	MOVQ	a9+72(FP), R11 // arg 9
-	MOVQ	R11, 24(CX)
+	// only the first 6 arguments can be passed in registers,
+	// the last three should be placed at the top of the stack.
+	MOVQ	R11, 8(SP)	// arg 7
+	MOVQ	R12, 16(SP)	// arg 8
+	MOVQ	R13, 24(SP)	// arg 9
 
 	SYSCALL
 	JCC	ok9
diff --git a/src/syscall/asm_netbsd_amd64.s b/src/syscall/asm_netbsd_amd64.s
deleted file mode 100644
index 457e207..0000000
--- a/src/syscall/asm_netbsd_amd64.s
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2016 The Go 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 "textflag.h"
-#include "funcdata.h"
-
-//
-// Syscall9 support for AMD64, NetBSD
-//
-
-// func Syscall9(trap int64, a1, a2, a3, a4, a5, a6, a7, a8, a9 int64) (r1, r2, err int64);
-TEXT	·Syscall9(SB),NOSPLIT,$0-104
-	CALL	runtime·entersyscall<ABIInternal>(SB)
-	MOVQ	num+0(FP), AX	// syscall entry
-	MOVQ	a1+8(FP), DI
-	MOVQ	a2+16(FP), SI
-	MOVQ	a3+24(FP), DX
-	MOVQ	a4+32(FP), R10
-	MOVQ	a5+40(FP), R8
-	MOVQ	a6+48(FP), R9
-	MOVQ	a7+56(FP), R11
-	MOVQ	a8+64(FP), R12
-	MOVQ	a9+72(FP), R13
-	SUBQ    $32, SP
-	MOVQ	R11, 8(SP)	// arg 7
-	MOVQ	R12, 16(SP)	// arg 8
-	MOVQ	R13, 24(SP)	// arg 9
-	SYSCALL
-	JCC	ok9
-	ADDQ    $32, SP
-	MOVQ	$-1, 88(SP)	// r1
-	MOVQ	$0, 96(SP)	// r2
-	MOVQ	AX, 104(SP)	// errno
-	CALL	runtime·exitsyscall<ABIInternal>(SB)
-	RET
-ok9:
-	ADDQ    $32, SP
-	MOVQ	AX, 88(SP)	// r1
-	MOVQ	DX, 96(SP)	// r2
-	MOVQ	$0, 104(SP)	// errno
-	CALL	runtime·exitsyscall<ABIInternal>(SB)
-	RET
diff --git a/src/syscall/asm_solaris_amd64.s b/src/syscall/asm_solaris_amd64.s
index 6891e9c..6dee29a 100644
--- a/src/syscall/asm_solaris_amd64.s
+++ b/src/syscall/asm_solaris_amd64.s
@@ -60,6 +60,9 @@
 TEXT ·setgroups1(SB),NOSPLIT,$0
 	JMP	runtime·syscall_setgroups(SB)
 
+TEXT ·setrlimit1(SB),NOSPLIT,$0
+	JMP	runtime·syscall_setrlimit(SB)
+
 TEXT ·setsid(SB),NOSPLIT,$0
 	JMP	runtime·syscall_setsid(SB)
 
diff --git a/src/syscall/dirent.go b/src/syscall/dirent.go
index b10608a..1a0f1ee 100644
--- a/src/syscall/dirent.go
+++ b/src/syscall/dirent.go
@@ -2,11 +2,14 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build unix || (js && wasm)
+//go:build unix || (js && wasm) || wasip1
 
 package syscall
 
-import "unsafe"
+import (
+	"runtime"
+	"unsafe"
+)
 
 // readInt returns the size-bytes unsigned integer in native byte order at offset off.
 func readInt(b []byte, off, size uintptr) (u uint64, ok bool) {
@@ -75,7 +78,9 @@
 		if !ok {
 			break
 		}
-		if ino == 0 { // File absent in directory.
+		// See src/os/dir_unix.go for the reason why this condition is
+		// excluded on wasip1.
+		if ino == 0 && runtime.GOOS != "wasip1" { // File absent in directory.
 			continue
 		}
 		const namoff = uint64(unsafe.Offsetof(Dirent{}.Name))
diff --git a/src/syscall/dll_windows.go b/src/syscall/dll_windows.go
index 34b481d..5f62b55 100644
--- a/src/syscall/dll_windows.go
+++ b/src/syscall/dll_windows.go
@@ -44,7 +44,7 @@
 
 func SyscallN(trap uintptr, args ...uintptr) (r1, r2 uintptr, err Errno)
 func loadlibrary(filename *uint16) (handle uintptr, err Errno)
-func loadsystemlibrary(filename *uint16, absoluteFilepath *uint16) (handle uintptr, err Errno)
+func loadsystemlibrary(filename *uint16) (handle uintptr, err Errno)
 func getprocaddress(handle uintptr, procname *uint8) (proc uintptr, err Errno)
 
 // A DLL implements access to a single DLL.
@@ -53,26 +53,6 @@
 	Handle Handle
 }
 
-// We use this for computing the absolute path for system DLLs on systems
-// where SEARCH_SYSTEM32 is not available.
-var systemDirectoryPrefix string
-
-func init() {
-	n := uint32(MAX_PATH)
-	for {
-		b := make([]uint16, n)
-		l, e := getSystemDirectory(&b[0], n)
-		if e != nil {
-			panic("Unable to determine system directory: " + e.Error())
-		}
-		if l <= n {
-			systemDirectoryPrefix = UTF16ToString(b[:l]) + "\\"
-			break
-		}
-		n = l
-	}
-}
-
 // LoadDLL loads the named DLL file into memory.
 //
 // If name is not an absolute path and is not a known system DLL used by
@@ -89,11 +69,7 @@
 	var h uintptr
 	var e Errno
 	if sysdll.IsSystemDLL[name] {
-		absoluteFilepathp, err := UTF16PtrFromString(systemDirectoryPrefix + name)
-		if err != nil {
-			return nil, err
-		}
-		h, e = loadsystemlibrary(namep, absoluteFilepathp)
+		h, e = loadsystemlibrary(namep)
 	} else {
 		h, e = loadlibrary(namep)
 	}
@@ -170,8 +146,6 @@
 	return p.addr
 }
 
-//go:uintptrescapes
-
 // Call executes procedure p with arguments a.
 //
 // The returned error is always non-nil, constructed from the result of GetLastError.
@@ -186,6 +160,8 @@
 // values are returned in r2. The return value for C type "float" is
 // math.Float32frombits(uint32(r2)). For C type "double", it is
 // math.Float64frombits(uint64(r2)).
+//
+//go:uintptrescapes
 func (p *Proc) Call(a ...uintptr) (uintptr, uintptr, error) {
 	return SyscallN(p.Addr(), a...)
 }
@@ -301,10 +277,10 @@
 	return p.proc.Addr()
 }
 
-//go:uintptrescapes
-
 // Call executes procedure p with arguments a. See the documentation of
 // Proc.Call for more information.
+//
+//go:uintptrescapes
 func (p *LazyProc) Call(a ...uintptr) (r1, r2 uintptr, lastErr error) {
 	p.mustFind()
 	return p.proc.Call(a...)
diff --git a/src/syscall/env_unix.go b/src/syscall/env_unix.go
index 6d917da..8e87e01 100644
--- a/src/syscall/env_unix.go
+++ b/src/syscall/env_unix.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build unix || (js && wasm) || plan9
+//go:build unix || (js && wasm) || plan9 || wasip1
 
 // Unix environment variables.
 
diff --git a/src/syscall/env_windows.go b/src/syscall/env_windows.go
index 94364f9..220a005 100644
--- a/src/syscall/env_windows.go
+++ b/src/syscall/env_windows.go
@@ -7,7 +7,6 @@
 package syscall
 
 import (
-	"unicode/utf16"
 	"unsafe"
 )
 
@@ -24,7 +23,7 @@
 			return "", false
 		}
 		if n <= uint32(len(b)) {
-			return string(utf16.Decode(b[:n])), true
+			return UTF16ToString(b[:n]), true
 		}
 	}
 }
@@ -63,7 +62,7 @@
 	for _, s := range Environ() {
 		// Environment variables can begin with =
 		// so start looking for the separator = at j=1.
-		// https://blogs.msdn.com/b/oldnewthing/archive/2010/05/06/10008132.aspx
+		// https://devblogs.microsoft.com/oldnewthing/20100506-00/?p=14133
 		for j := 1; j < len(s); j++ {
 			if s[j] == '=' {
 				Unsetenv(s[0:j])
@@ -90,7 +89,7 @@
 		}
 
 		entry := unsafe.Slice(envp, (uintptr(end)-uintptr(unsafe.Pointer(envp)))/size)
-		r = append(r, string(utf16.Decode(entry)))
+		r = append(r, UTF16ToString(entry))
 		envp = (*uint16)(unsafe.Add(end, size))
 	}
 	return r
diff --git a/src/syscall/exec_aix_test.go b/src/syscall/exec_aix_test.go
index f2d54a4..e8eeae1 100644
--- a/src/syscall/exec_aix_test.go
+++ b/src/syscall/exec_aix_test.go
@@ -34,4 +34,4 @@
 	return
 }
 
-var Ioctl = ioctl
+var IoctlPtr = ioctlPtr
diff --git a/src/syscall/exec_bsd.go b/src/syscall/exec_bsd.go
index 32c3ebd..0b0cd24 100644
--- a/src/syscall/exec_bsd.go
+++ b/src/syscall/exec_bsd.go
@@ -55,12 +55,17 @@
 	// Declare all variables at top in case any
 	// declarations require heap allocation (e.g., err1).
 	var (
-		r1     uintptr
-		err1   Errno
-		nextfd int
-		i      int
+		r1              uintptr
+		err1            Errno
+		nextfd          int
+		i               int
+		pgrp            _C_int
+		cred            *Credential
+		ngroups, groups uintptr
 	)
 
+	rlim, rlimOK := origRlimitNofile.Load().(Rlimit)
+
 	// 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.
@@ -119,7 +124,7 @@
 	if sys.Foreground {
 		// This should really be pid_t, however _C_int (aka int32) is
 		// generally equivalent.
-		pgrp := _C_int(sys.Pgid)
+		pgrp = _C_int(sys.Pgid)
 		if pgrp == 0 {
 			r1, _, err1 = RawSyscall(SYS_GETPID, 0, 0, 0)
 			if err1 != 0 {
@@ -149,9 +154,9 @@
 	}
 
 	// User and groups
-	if cred := sys.Credential; cred != nil {
-		ngroups := uintptr(len(cred.Groups))
-		groups := uintptr(0)
+	if cred = sys.Credential; cred != nil {
+		ngroups = uintptr(len(cred.Groups))
+		groups = uintptr(0)
 		if ngroups > 0 {
 			groups = uintptr(unsafe.Pointer(&cred.Groups[0]))
 		}
@@ -270,6 +275,11 @@
 		}
 	}
 
+	// Restore original rlimit.
+	if rlimOK && rlim.Cur != 0 {
+		RawSyscall(SYS_SETRLIMIT, uintptr(RLIMIT_NOFILE), uintptr(unsafe.Pointer(&rlim)), 0)
+	}
+
 	// Time to exec.
 	_, _, err1 = RawSyscall(SYS_EXECVE,
 		uintptr(unsafe.Pointer(argv0)),
diff --git a/src/syscall/exec_freebsd.go b/src/syscall/exec_freebsd.go
index af5a415..bd198d0 100644
--- a/src/syscall/exec_freebsd.go
+++ b/src/syscall/exec_freebsd.go
@@ -32,6 +32,7 @@
 	Foreground bool
 	Pgid       int    // Child's process group ID if Setpgid.
 	Pdeathsig  Signal // Signal that the process will get when its parent dies (Linux and FreeBSD only)
+	Jail       int    // Jail to which the child process is attached (FreeBSD only).
 }
 
 const (
@@ -60,12 +61,18 @@
 	// Declare all variables at top in case any
 	// declarations require heap allocation (e.g., err1).
 	var (
-		r1     uintptr
-		err1   Errno
-		nextfd int
-		i      int
+		r1              uintptr
+		err1            Errno
+		nextfd          int
+		i               int
+		pgrp            _C_int
+		cred            *Credential
+		ngroups, groups uintptr
+		upid            uintptr
 	)
 
+	rlim, rlimOK := origRlimitNofile.Load().(Rlimit)
+
 	// Record parent PID so child can test if it has died.
 	ppid, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0)
 
@@ -99,6 +106,15 @@
 
 	// Fork succeeded, now in child.
 
+	// Attach to the given jail, if any. The system call also changes the
+	// process' root and working directories to the jail's path directory.
+	if sys.Jail > 0 {
+		_, _, err1 = RawSyscall(SYS_JAIL_ATTACH, uintptr(sys.Jail), 0, 0)
+		if err1 != 0 {
+			goto childerror
+		}
+	}
+
 	// Enable tracing if requested.
 	if sys.Ptrace {
 		_, _, err1 = RawSyscall(SYS_PTRACE, uintptr(PTRACE_TRACEME), 0, 0)
@@ -127,7 +143,7 @@
 	if sys.Foreground {
 		// This should really be pid_t, however _C_int (aka int32) is
 		// generally equivalent.
-		pgrp := _C_int(sys.Pgid)
+		pgrp = _C_int(sys.Pgid)
 		if pgrp == 0 {
 			r1, _, err1 = RawSyscall(SYS_GETPID, 0, 0, 0)
 			if err1 != 0 {
@@ -157,9 +173,9 @@
 	}
 
 	// User and groups
-	if cred := sys.Credential; cred != nil {
-		ngroups := uintptr(len(cred.Groups))
-		groups := uintptr(0)
+	if cred = sys.Credential; cred != nil {
+		ngroups = uintptr(len(cred.Groups))
+		groups = uintptr(0)
 		if ngroups > 0 {
 			groups = uintptr(unsafe.Pointer(&cred.Groups[0]))
 		}
@@ -204,8 +220,8 @@
 		// using SIGKILL.
 		r1, _, _ = RawSyscall(SYS_GETPPID, 0, 0, 0)
 		if r1 != ppid {
-			pid, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0)
-			_, _, err1 = RawSyscall(SYS_KILL, pid, uintptr(sys.Pdeathsig), 0)
+			upid, _, _ = RawSyscall(SYS_GETPID, 0, 0, 0)
+			_, _, err1 = RawSyscall(SYS_KILL, upid, uintptr(sys.Pdeathsig), 0)
 			if err1 != 0 {
 				goto childerror
 			}
@@ -283,6 +299,11 @@
 		}
 	}
 
+	// Restore original rlimit.
+	if rlimOK && rlim.Cur != 0 {
+		RawSyscall(SYS_SETRLIMIT, uintptr(RLIMIT_NOFILE), uintptr(unsafe.Pointer(&rlim)), 0)
+	}
+
 	// Time to exec.
 	_, _, err1 = RawSyscall(SYS_EXECVE,
 		uintptr(unsafe.Pointer(argv0)),
diff --git a/src/syscall/exec_freebsd_test.go b/src/syscall/exec_freebsd_test.go
new file mode 100644
index 0000000..2e9513f
--- /dev/null
+++ b/src/syscall/exec_freebsd_test.go
@@ -0,0 +1,98 @@
+// Copyright 2023 The Go 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:build freebsd
+
+package syscall_test
+
+import (
+	"fmt"
+	"internal/testenv"
+	"os"
+	"os/exec"
+	"path/filepath"
+	"syscall"
+	"testing"
+	"unsafe"
+)
+
+const (
+	flagJailCreate = uintptr(0x1)
+)
+
+func prepareJail(t *testing.T) (int, string) {
+	t.Helper()
+
+	root := t.TempDir()
+	paramPath := []byte("path\x00")
+	conf := make([]syscall.Iovec, 4)
+	conf[0].Base = &paramPath[0]
+	conf[0].SetLen(len(paramPath))
+	p, err := syscall.BytePtrFromString(root)
+	if err != nil {
+		t.Fatal(err)
+	}
+	conf[1].Base = p
+	conf[1].SetLen(len(root) + 1)
+
+	paramPersist := []byte("persist\x00")
+	conf[2].Base = &paramPersist[0]
+	conf[2].SetLen(len(paramPersist))
+	conf[3].Base = nil
+	conf[3].SetLen(0)
+
+	id, _, err1 := syscall.Syscall(syscall.SYS_JAIL_SET,
+		uintptr(unsafe.Pointer(&conf[0])), uintptr(len(conf)), flagJailCreate)
+	if err1 != 0 {
+		t.Fatalf("jail_set: %v", err1)
+	}
+	t.Cleanup(func() {
+		_, _, err1 := syscall.Syscall(syscall.SYS_JAIL_REMOVE, id, 0, 0)
+		if err1 != 0 {
+			t.Errorf("failed to cleanup jail: %v", err)
+		}
+	})
+
+	return int(id), root
+}
+
+func TestJailAttach(t *testing.T) {
+	if os.Getenv("GO_WANT_HELPER_PROCESS") == "1" {
+		jailed, err := syscall.SysctlUint32("security.jail.jailed")
+		if err != nil {
+			fmt.Fprintln(os.Stderr, err)
+			os.Exit(2)
+		}
+		if jailed != 1 {
+			t.Fatalf("jailed = %d, want 1", jailed)
+		}
+		return
+	}
+
+	testenv.MustHaveGoBuild(t)
+	// Make sure we are running as root, so we have permissions to create
+	// and remove jails.
+	if os.Getuid() != 0 {
+		t.Skip("kernel prohibits jail system calls in unprivileged process")
+	}
+
+	jid, root := prepareJail(t)
+
+	// Since jail attach does an implicit chroot to the jail's path,
+	// we need the binary there, and it must be statically linked.
+	x := filepath.Join(root, "syscall.test")
+	cmd := exec.Command(testenv.GoToolPath(t), "test", "-c", "-o", x, "syscall")
+	cmd.Env = append(os.Environ(), "CGO_ENABLED=0")
+	if o, err := cmd.CombinedOutput(); err != nil {
+		t.Fatalf("Build of syscall in jail root failed, output %v, err %v", o, err)
+	}
+
+	cmd = exec.Command("/syscall.test", "-test.run=TestJailAttach", "/")
+	cmd.Env = append(os.Environ(), "GO_WANT_HELPER_PROCESS=1")
+	cmd.SysProcAttr = &syscall.SysProcAttr{Jail: jid}
+	out, err := cmd.CombinedOutput()
+	if err != nil {
+		t.Fatalf("Cmd failed with err %v, output: %s", err, out)
+	}
+}
diff --git a/src/syscall/exec_libc.go b/src/syscall/exec_libc.go
index ef0c87e..4455786 100644
--- a/src/syscall/exec_libc.go
+++ b/src/syscall/exec_libc.go
@@ -53,6 +53,7 @@
 func ioctl(fd uintptr, req uintptr, arg uintptr) (err Errno)
 func setgid(gid uintptr) (err Errno)
 func setgroups1(ngid uintptr, gid uintptr) (err Errno)
+func setrlimit1(which uintptr, lim unsafe.Pointer) (err Errno)
 func setsid() (pid uintptr, err Errno)
 func setuid(uid uintptr) (err Errno)
 func setpgid(pid uintptr, pgid uintptr) (err Errno)
@@ -81,12 +82,17 @@
 	// Declare all variables at top in case any
 	// declarations require heap allocation (e.g., err1).
 	var (
-		r1     uintptr
-		err1   Errno
-		nextfd int
-		i      int
+		r1              uintptr
+		err1            Errno
+		nextfd          int
+		i               int
+		pgrp            _Pid_t
+		cred            *Credential
+		ngroups, groups uintptr
 	)
 
+	rlim, rlimOK := origRlimitNofile.Load().(Rlimit)
+
 	// 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.
@@ -135,7 +141,7 @@
 	}
 
 	if sys.Foreground {
-		pgrp := _Pid_t(sys.Pgid)
+		pgrp = _Pid_t(sys.Pgid)
 		if pgrp == 0 {
 			r1, err1 = getpid()
 			if err1 != 0 {
@@ -165,9 +171,9 @@
 	}
 
 	// User and groups
-	if cred := sys.Credential; cred != nil {
-		ngroups := uintptr(len(cred.Groups))
-		groups := uintptr(0)
+	if cred = sys.Credential; cred != nil {
+		ngroups = uintptr(len(cred.Groups))
+		groups = uintptr(0)
 		if ngroups > 0 {
 			groups = uintptr(unsafe.Pointer(&cred.Groups[0]))
 		}
@@ -289,6 +295,11 @@
 		}
 	}
 
+	// Restore original rlimit.
+	if rlimOK && rlim.Cur != 0 {
+		setrlimit1(RLIMIT_NOFILE, unsafe.Pointer(&rlim))
+	}
+
 	// Time to exec.
 	err1 = execve(
 		uintptr(unsafe.Pointer(argv0)),
@@ -302,3 +313,7 @@
 		exit(253)
 	}
 }
+
+func ioctlPtr(fd, req uintptr, arg unsafe.Pointer) (err Errno) {
+	return ioctl(fd, req, uintptr(arg))
+}
diff --git a/src/syscall/exec_libc2.go b/src/syscall/exec_libc2.go
index 41bc79a..4fca701 100644
--- a/src/syscall/exec_libc2.go
+++ b/src/syscall/exec_libc2.go
@@ -52,16 +52,21 @@
 // functions that do not grow the stack.
 //
 //go:norace
-func forkAndExecInChild(argv0 *byte, argv, envv []*byte, chroot, dir *byte, attr *ProcAttr, sys *SysProcAttr, pipe int) (pid int, err Errno) {
+func forkAndExecInChild(argv0 *byte, argv, envv []*byte, chroot, dir *byte, attr *ProcAttr, sys *SysProcAttr, pipe int) (pid int, err1 Errno) {
 	// Declare all variables at top in case any
 	// declarations require heap allocation (e.g., err1).
 	var (
-		r1     uintptr
-		err1   Errno
-		nextfd int
-		i      int
+		r1              uintptr
+		nextfd          int
+		i               int
+		err             error
+		pgrp            _C_int
+		cred            *Credential
+		ngroups, groups uintptr
 	)
 
+	rlim, rlimOK := origRlimitNofile.Load().(Rlimit)
+
 	// 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.
@@ -94,7 +99,7 @@
 
 	// Enable tracing if requested.
 	if sys.Ptrace {
-		if err := ptrace(PTRACE_TRACEME, 0, 0, 0); err != nil {
+		if err = ptrace(PTRACE_TRACEME, 0, 0, 0); err != nil {
 			err1 = err.(Errno)
 			goto childerror
 		}
@@ -120,7 +125,7 @@
 	if sys.Foreground {
 		// This should really be pid_t, however _C_int (aka int32) is
 		// generally equivalent.
-		pgrp := _C_int(sys.Pgid)
+		pgrp = _C_int(sys.Pgid)
 		if pgrp == 0 {
 			r1, _, err1 = rawSyscall(abi.FuncPCABI0(libc_getpid_trampoline), 0, 0, 0)
 			if err1 != 0 {
@@ -149,9 +154,9 @@
 	}
 
 	// User and groups
-	if cred := sys.Credential; cred != nil {
-		ngroups := uintptr(len(cred.Groups))
-		groups := uintptr(0)
+	if cred = sys.Credential; cred != nil {
+		ngroups = uintptr(len(cred.Groups))
+		groups = uintptr(0)
 		if ngroups > 0 {
 			groups = uintptr(unsafe.Pointer(&cred.Groups[0]))
 		}
@@ -266,6 +271,11 @@
 		}
 	}
 
+	// Restore original rlimit.
+	if rlimOK && rlim.Cur != 0 {
+		rawSyscall(abi.FuncPCABI0(libc_setrlimit_trampoline), uintptr(RLIMIT_NOFILE), uintptr(unsafe.Pointer(&rlim)), 0)
+	}
+
 	// Time to exec.
 	_, _, err1 = rawSyscall(abi.FuncPCABI0(libc_execve_trampoline),
 		uintptr(unsafe.Pointer(argv0)),
diff --git a/src/syscall/exec_linux.go b/src/syscall/exec_linux.go
index 7e0c3d2..dfbb38a 100644
--- a/src/syscall/exec_linux.go
+++ b/src/syscall/exec_linux.go
@@ -127,19 +127,19 @@
 func forkAndExecInChild(argv0 *byte, argv, envv []*byte, chroot, dir *byte, attr *ProcAttr, sys *SysProcAttr, pipe int) (pid int, err Errno) {
 	// Set up and fork. This returns immediately in the parent or
 	// if there's an error.
-	r1, err1, p, locked := forkAndExecInChild1(argv0, argv, envv, chroot, dir, attr, sys, pipe)
+	upid, err, mapPipe, locked := forkAndExecInChild1(argv0, argv, envv, chroot, dir, attr, sys, pipe)
 	if locked {
 		runtime_AfterFork()
 	}
-	if err1 != 0 {
-		return 0, err1
+	if err != 0 {
+		return 0, err
 	}
 
 	// parent; return PID
-	pid = int(r1)
+	pid = int(upid)
 
 	if sys.UidMappings != nil || sys.GidMappings != nil {
-		Close(p[0])
+		Close(mapPipe[0])
 		var err2 Errno
 		// uid/gid mappings will be written after fork and unshare(2) for user
 		// namespaces.
@@ -148,8 +148,8 @@
 				err2 = err.(Errno)
 			}
 		}
-		RawSyscall(SYS_WRITE, uintptr(p[1]), uintptr(unsafe.Pointer(&err2)), unsafe.Sizeof(err2))
-		Close(p[1])
+		RawSyscall(SYS_WRITE, uintptr(mapPipe[1]), uintptr(unsafe.Pointer(&err2)), unsafe.Sizeof(err2))
+		Close(mapPipe[1])
 	}
 
 	return pid, 0
@@ -203,7 +203,8 @@
 //
 //go:noinline
 //go:norace
-func forkAndExecInChild1(argv0 *byte, argv, envv []*byte, chroot, dir *byte, attr *ProcAttr, sys *SysProcAttr, pipe int) (r1 uintptr, err1 Errno, p [2]int, locked bool) {
+//go:nocheckptr
+func forkAndExecInChild1(argv0 *byte, argv, envv []*byte, chroot, dir *byte, attr *ProcAttr, sys *SysProcAttr, pipe int) (pid uintptr, err1 Errno, mapPipe [2]int, locked bool) {
 	// Defined in linux/prctl.h starting with Linux 4.3.
 	const (
 		PR_CAP_AMBIENT       = 0x2f
@@ -215,8 +216,15 @@
 	// processing in this stack frame and never returns, while the
 	// parent returns immediately from this frame and does all
 	// post-fork processing in the outer frame.
+	//
 	// Declare all variables at top in case any
-	// declarations require heap allocation (e.g., err1).
+	// declarations require heap allocation (e.g., err2).
+	// ":=" should not be used to declare any variable after
+	// the call to runtime_BeforeFork.
+	//
+	// NOTE(bcmills): The allocation behavior described in the above comment
+	// seems to lack a corresponding test, and it may be rendered invalid
+	// by an otherwise-correct change in the compiler.
 	var (
 		err2                      Errno
 		nextfd                    int
@@ -226,8 +234,15 @@
 		puid, psetgroups, pgid    []byte
 		uidmap, setgroups, gidmap []byte
 		clone3                    *cloneArgs
+		pgrp                      int32
+		dirfd                     int
+		cred                      *Credential
+		ngroups, groups           uintptr
+		c                         uintptr
 	)
 
+	rlim, rlimOK := origRlimitNofile.Load().(Rlimit)
+
 	if sys.UidMappings != nil {
 		puid = []byte("/proc/self/uid_map\000")
 		uidmap = formatIDMappings(sys.UidMappings)
@@ -264,7 +279,7 @@
 	// 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 {
+		if err := forkExecPipe(mapPipe[:]); err != nil {
 			err1 = err.(Errno)
 			return
 		}
@@ -281,6 +296,11 @@
 			exitSignal: uint64(SIGCHLD),
 			cgroup:     uint64(sys.CgroupFD),
 		}
+	} else if flags&CLONE_NEWTIME != 0 {
+		clone3 = &cloneArgs{
+			flags:      uint64(flags),
+			exitSignal: uint64(SIGCHLD),
+		}
 	}
 
 	// About to call fork.
@@ -288,17 +308,17 @@
 	runtime_BeforeFork()
 	locked = true
 	if clone3 != nil {
-		r1, err1 = rawVforkSyscall(_SYS_clone3, uintptr(unsafe.Pointer(clone3)), unsafe.Sizeof(*clone3))
+		pid, err1 = rawVforkSyscall(_SYS_clone3, uintptr(unsafe.Pointer(clone3)), unsafe.Sizeof(*clone3))
 	} else {
 		flags |= uintptr(SIGCHLD)
 		if runtime.GOARCH == "s390x" {
 			// On Linux/s390, the first two arguments of clone(2) are swapped.
-			r1, err1 = rawVforkSyscall(SYS_CLONE, 0, flags)
+			pid, err1 = rawVforkSyscall(SYS_CLONE, 0, flags)
 		} else {
-			r1, err1 = rawVforkSyscall(SYS_CLONE, flags, 0)
+			pid, err1 = rawVforkSyscall(SYS_CLONE, flags, 0)
 		}
 	}
-	if err1 != 0 || r1 != 0 {
+	if err1 != 0 || pid != 0 {
 		// If we're in the parent, we must return immediately
 		// so we're not in the same stack frame as the child.
 		// This can at most use the return PC, which the child
@@ -320,14 +340,14 @@
 
 	// 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 {
+		if _, _, err1 = RawSyscall(SYS_CLOSE, uintptr(mapPipe[1]), 0, 0); err1 != 0 {
 			goto childerror
 		}
-		r1, _, err1 = RawSyscall(SYS_READ, uintptr(p[0]), uintptr(unsafe.Pointer(&err2)), unsafe.Sizeof(err2))
+		pid, _, err1 = RawSyscall(SYS_READ, uintptr(mapPipe[0]), uintptr(unsafe.Pointer(&err2)), unsafe.Sizeof(err2))
 		if err1 != 0 {
 			goto childerror
 		}
-		if r1 != unsafe.Sizeof(err2) {
+		if pid != unsafe.Sizeof(err2) {
 			err1 = EINVAL
 			goto childerror
 		}
@@ -355,11 +375,11 @@
 	}
 
 	if sys.Foreground {
-		pgrp := int32(sys.Pgid)
+		pgrp = int32(sys.Pgid)
 		if pgrp == 0 {
-			r1, _ = rawSyscallNoError(SYS_GETPID, 0, 0, 0)
+			pid, _ = rawSyscallNoError(SYS_GETPID, 0, 0, 0)
 
-			pgrp = int32(r1)
+			pgrp = int32(pid)
 		}
 
 		// Place process group in foreground.
@@ -381,11 +401,11 @@
 		}
 
 		if sys.Unshareflags&CLONE_NEWUSER != 0 && sys.GidMappings != nil {
-			dirfd := int(_AT_FDCWD)
+			dirfd = int(_AT_FDCWD)
 			if fd1, _, err1 = RawSyscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(&psetgroups[0])), uintptr(O_WRONLY), 0, 0, 0); err1 != 0 {
 				goto childerror
 			}
-			r1, _, err1 = RawSyscall(SYS_WRITE, uintptr(fd1), uintptr(unsafe.Pointer(&setgroups[0])), uintptr(len(setgroups)))
+			pid, _, err1 = RawSyscall(SYS_WRITE, uintptr(fd1), uintptr(unsafe.Pointer(&setgroups[0])), uintptr(len(setgroups)))
 			if err1 != 0 {
 				goto childerror
 			}
@@ -396,7 +416,7 @@
 			if fd1, _, err1 = RawSyscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(&pgid[0])), uintptr(O_WRONLY), 0, 0, 0); err1 != 0 {
 				goto childerror
 			}
-			r1, _, err1 = RawSyscall(SYS_WRITE, uintptr(fd1), uintptr(unsafe.Pointer(&gidmap[0])), uintptr(len(gidmap)))
+			pid, _, err1 = RawSyscall(SYS_WRITE, uintptr(fd1), uintptr(unsafe.Pointer(&gidmap[0])), uintptr(len(gidmap)))
 			if err1 != 0 {
 				goto childerror
 			}
@@ -406,11 +426,11 @@
 		}
 
 		if sys.Unshareflags&CLONE_NEWUSER != 0 && sys.UidMappings != nil {
-			dirfd := int(_AT_FDCWD)
+			dirfd = int(_AT_FDCWD)
 			if fd1, _, err1 = RawSyscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(&puid[0])), uintptr(O_WRONLY), 0, 0, 0); err1 != 0 {
 				goto childerror
 			}
-			r1, _, err1 = RawSyscall(SYS_WRITE, uintptr(fd1), uintptr(unsafe.Pointer(&uidmap[0])), uintptr(len(uidmap)))
+			pid, _, err1 = RawSyscall(SYS_WRITE, uintptr(fd1), uintptr(unsafe.Pointer(&uidmap[0])), uintptr(len(uidmap)))
 			if err1 != 0 {
 				goto childerror
 			}
@@ -443,9 +463,9 @@
 	}
 
 	// User and groups
-	if cred := sys.Credential; cred != nil {
-		ngroups := uintptr(len(cred.Groups))
-		groups := uintptr(0)
+	if cred = sys.Credential; cred != nil {
+		ngroups = uintptr(len(cred.Groups))
+		groups = uintptr(0)
 		if ngroups > 0 {
 			groups = uintptr(unsafe.Pointer(&cred.Groups[0]))
 		}
@@ -474,7 +494,7 @@
 			goto childerror
 		}
 
-		for _, c := range sys.AmbientCaps {
+		for _, c = range sys.AmbientCaps {
 			// Add the c capability to the permitted and inheritable capability mask,
 			// otherwise we will not be able to add it to the ambient capability mask.
 			caps.data[capToIndex(c)].permitted |= capToMask(c)
@@ -485,7 +505,7 @@
 			goto childerror
 		}
 
-		for _, c := range sys.AmbientCaps {
+		for _, c = range sys.AmbientCaps {
 			_, _, err1 = RawSyscall6(SYS_PRCTL, PR_CAP_AMBIENT, uintptr(PR_CAP_AMBIENT_RAISE), c, 0, 0, 0)
 			if err1 != 0 {
 				goto childerror
@@ -511,9 +531,9 @@
 		// 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, _ = rawSyscallNoError(SYS_GETPPID, 0, 0, 0)
-		if r1 != ppid {
-			pid, _ := rawSyscallNoError(SYS_GETPID, 0, 0, 0)
+		pid, _ = rawSyscallNoError(SYS_GETPPID, 0, 0, 0)
+		if pid != ppid {
+			pid, _ = rawSyscallNoError(SYS_GETPID, 0, 0, 0)
 			_, _, err1 = RawSyscall(SYS_KILL, pid, uintptr(sys.Pdeathsig), 0)
 			if err1 != 0 {
 				goto childerror
@@ -592,6 +612,11 @@
 		}
 	}
 
+	// Restore original rlimit.
+	if rlimOK && rlim.Cur != 0 {
+		rawSetrlimit(RLIMIT_NOFILE, &rlim)
+	}
+
 	// Enable tracing if requested.
 	// Do this right before exec so that we don't unnecessarily trace the runtime
 	// setting up after the fork. See issue #21428.
@@ -616,11 +641,6 @@
 	}
 }
 
-// Try to open a pipe with O_CLOEXEC set on both file descriptors.
-func forkExecPipe(p []int) (err error) {
-	return Pipe2(p, O_CLOEXEC)
-}
-
 func formatIDMappings(idMap []SysProcIDMap) []byte {
 	var data []byte
 	for _, im := range idMap {
diff --git a/src/syscall/exec_linux_test.go b/src/syscall/exec_linux_test.go
index a6900f9..f4ff7bf 100644
--- a/src/syscall/exec_linux_test.go
+++ b/src/syscall/exec_linux_test.go
@@ -8,7 +8,6 @@
 
 import (
 	"bytes"
-	"errors"
 	"flag"
 	"fmt"
 	"internal/testenv"
@@ -26,102 +25,12 @@
 	"unsafe"
 )
 
-func isDocker() bool {
-	_, err := os.Stat("/.dockerenv")
-	return err == nil
-}
-
-func isLXC() bool {
-	return os.Getenv("container") == "lxc"
-}
-
-func skipInContainer(t *testing.T) {
-	// TODO: the callers of this func are using this func to skip
-	// tests when running as some sort of "fake root" that's uid 0
-	// but lacks certain Linux capabilities. Most of the Go builds
-	// run in privileged containers, though, where root is much
-	// closer (if not identical) to the real root. We should test
-	// for what we need exactly (which capabilities are active?),
-	// instead of just assuming "docker == bad". Then we'd get more test
-	// coverage on a bunch of builders too.
-	if isDocker() {
-		t.Skip("skip this test in Docker container")
-	}
-	if isLXC() {
-		t.Skip("skip this test in LXC container")
-	}
-}
-
-func skipNoUserNamespaces(t *testing.T) {
-	if _, err := os.Stat("/proc/self/ns/user"); err != nil {
-		if os.IsNotExist(err) {
-			t.Skip("kernel doesn't support user namespaces")
-		}
-		if os.IsPermission(err) {
-			t.Skip("unable to test user namespaces due to permissions")
-		}
-		t.Fatalf("Failed to stat /proc/self/ns/user: %v", err)
-	}
-}
-
-func skipUnprivilegedUserClone(t *testing.T) {
-	// Skip the test if the sysctl that prevents unprivileged user
-	// from creating user namespaces is enabled.
-	data, errRead := os.ReadFile("/proc/sys/kernel/unprivileged_userns_clone")
-	if os.IsNotExist(errRead) {
-		// This file is only available in some Debian/Ubuntu kernels.
-		return
-	}
-	if errRead != nil || len(data) < 1 || data[0] == '0' {
-		t.Skip("kernel prohibits user namespace in unprivileged process")
-	}
-}
-
-// Check if we are in a chroot by checking if the inode of / is
-// different from 2 (there is no better test available to non-root on
-// linux).
-func isChrooted(t *testing.T) bool {
-	root, err := os.Stat("/")
-	if err != nil {
-		t.Fatalf("cannot stat /: %v", err)
-	}
-	return root.Sys().(*syscall.Stat_t).Ino != 2
-}
-
-func checkUserNS(t *testing.T) {
-	skipInContainer(t)
-	skipNoUserNamespaces(t)
-	if isChrooted(t) {
-		// create_user_ns in the kernel (see
-		// https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/kernel/user_namespace.c)
-		// forbids the creation of user namespaces when chrooted.
-		t.Skip("cannot create user namespaces when chrooted")
-	}
-	// On some systems, there is a sysctl setting.
-	if os.Getuid() != 0 {
-		skipUnprivilegedUserClone(t)
-	}
-	// On Centos 7 make sure they set the kernel parameter user_namespace=1
-	// See issue 16283 and 20796.
-	if _, err := os.Stat("/sys/module/user_namespace/parameters/enable"); err == nil {
-		buf, _ := os.ReadFile("/sys/module/user_namespace/parameters/enabled")
-		if !strings.HasPrefix(string(buf), "Y") {
-			t.Skip("kernel doesn't support user namespaces")
-		}
-	}
-
-	// On Centos 7.5+, user namespaces are disabled if user.max_user_namespaces = 0
-	if _, err := os.Stat("/proc/sys/user/max_user_namespaces"); err == nil {
-		buf, errRead := os.ReadFile("/proc/sys/user/max_user_namespaces")
-		if errRead == nil && buf[0] == '0' {
-			t.Skip("kernel doesn't support user namespaces")
-		}
-	}
-}
-
-func whoamiCmd(t *testing.T, uid, gid int, setgroups bool) *exec.Cmd {
-	checkUserNS(t)
-	cmd := exec.Command("whoami")
+// whoamiNEWUSER returns a command that runs "whoami" with CLONE_NEWUSER,
+// mapping uid and gid 0 to the actual uid and gid of the test.
+func whoamiNEWUSER(t *testing.T, uid, gid int, setgroups bool) *exec.Cmd {
+	t.Helper()
+	testenv.MustHaveExecPath(t, "whoami")
+	cmd := testenv.Command(t, "whoami")
 	cmd.SysProcAttr = &syscall.SysProcAttr{
 		Cloneflags: syscall.CLONE_NEWUSER,
 		UidMappings: []syscall.SysProcIDMap{
@@ -135,70 +44,60 @@
 	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 {
-		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 TestCloneNEWUSERAndRemap(t *testing.T) {
+	for _, setgroups := range []bool{false, true} {
+		setgroups := setgroups
+		t.Run(fmt.Sprintf("setgroups=%v", setgroups), func(t *testing.T) {
+			uid := os.Getuid()
+			gid := os.Getgid()
 
-func TestCloneNEWUSERAndRemapRootDisableSetgroups(t *testing.T) {
-	if os.Getuid() != 0 {
-		t.Skip("skipping root only test")
-	}
-	testNEWUSERRemap(t, 0, 0, false)
-}
+			cmd := whoamiNEWUSER(t, uid, gid, setgroups)
+			out, err := cmd.CombinedOutput()
+			t.Logf("%v: %v", cmd, err)
 
-func TestCloneNEWUSERAndRemapRootEnableSetgroups(t *testing.T) {
-	if os.Getuid() != 0 {
-		t.Skip("skipping root only test")
-	}
-	testNEWUSERRemap(t, 0, 0, true)
-}
+			if uid != 0 && setgroups {
+				t.Logf("as non-root, expected permission error due to unprivileged gid_map")
+				if !os.IsPermission(err) {
+					if err == nil {
+						t.Skipf("unexpected success: probably old kernel without security fix?")
+					}
+					if testenv.SyscallIsNotSupported(err) {
+						t.Skipf("skipping: CLONE_NEWUSER appears to be unsupported")
+					}
+					t.Fatalf("got non-permission error") // Already logged above.
+				}
+				return
+			}
 
-func TestCloneNEWUSERAndRemapNoRootDisableSetgroups(t *testing.T) {
-	if os.Getuid() == 0 {
-		t.Skip("skipping unprivileged user only test")
-	}
-	testNEWUSERRemap(t, os.Getuid(), os.Getgid(), false)
-}
+			if err != nil {
+				if testenv.SyscallIsNotSupported(err) {
+					// May be inside a container that disallows CLONE_NEWUSER.
+					t.Skipf("skipping: CLONE_NEWUSER appears to be unsupported")
+				}
+				t.Fatalf("unexpected command failure; output:\n%s", out)
+			}
 
-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")
+			sout := strings.TrimSpace(string(out))
+			want := "root"
+			if sout != want {
+				t.Fatalf("whoami = %q; want %q", out, want)
+			}
+		})
 	}
 }
 
 func TestEmptyCredGroupsDisableSetgroups(t *testing.T) {
-	cmd := whoamiCmd(t, os.Getuid(), os.Getgid(), false)
+	cmd := whoamiNEWUSER(t, os.Getuid(), os.Getgid(), false)
 	cmd.SysProcAttr.Credential = &syscall.Credential{}
 	if err := cmd.Run(); err != nil {
+		if testenv.SyscallIsNotSupported(err) {
+			t.Skipf("skipping: %v: %v", cmd, err)
+		}
 		t.Fatal(err)
 	}
 }
 
 func TestUnshare(t *testing.T) {
-	skipInContainer(t)
-	// Make sure we are running as root so we have permissions to use unshare
-	// and create a network namespace.
-	if os.Getuid() != 0 {
-		t.Skip("kernel prohibits unshare in unprivileged process, unless using user namespace")
-	}
-
 	path := "/proc/net/dev"
 	if _, err := os.Stat(path); err != nil {
 		if os.IsNotExist(err) {
@@ -209,12 +108,6 @@
 		}
 		t.Fatal(err)
 	}
-	if _, err := os.Stat("/proc/self/ns/net"); err != nil {
-		if os.IsNotExist(err) {
-			t.Skip("kernel doesn't support net namespace")
-		}
-		t.Fatal(err)
-	}
 
 	orig, err := os.ReadFile(path)
 	if err != nil {
@@ -222,17 +115,15 @@
 	}
 	origLines := strings.Split(strings.TrimSpace(string(orig)), "\n")
 
-	cmd := exec.Command("cat", path)
+	cmd := testenv.Command(t, "cat", path)
 	cmd.SysProcAttr = &syscall.SysProcAttr{
 		Unshareflags: syscall.CLONE_NEWNET,
 	}
 	out, err := cmd.CombinedOutput()
 	if err != nil {
-		if strings.Contains(err.Error(), "operation not permitted") {
-			// Issue 17206: despite all the checks above,
-			// this still reportedly fails for some users.
-			// (older kernels?). Just skip.
-			t.Skip("skipping due to permission error")
+		if testenv.SyscallIsNotSupported(err) {
+			// CLONE_NEWNET does not appear to be supported.
+			t.Skipf("skipping due to permission error: %v", err)
 		}
 		t.Fatalf("Cmd failed with err %v, output: %s", err, out)
 	}
@@ -250,10 +141,8 @@
 }
 
 func TestGroupCleanup(t *testing.T) {
-	if os.Getuid() != 0 {
-		t.Skip("we need root for credential")
-	}
-	cmd := exec.Command("id")
+	testenv.MustHaveExecPath(t, "id")
+	cmd := testenv.Command(t, "id")
 	cmd.SysProcAttr = &syscall.SysProcAttr{
 		Credential: &syscall.Credential{
 			Uid: 0,
@@ -262,6 +151,9 @@
 	}
 	out, err := cmd.CombinedOutput()
 	if err != nil {
+		if testenv.SyscallIsNotSupported(err) {
+			t.Skipf("skipping: %v: %v", cmd, err)
+		}
 		t.Fatalf("Cmd failed with err %v, output: %s", err, out)
 	}
 	strOut := strings.TrimSpace(string(out))
@@ -277,11 +169,8 @@
 }
 
 func TestGroupCleanupUserNamespace(t *testing.T) {
-	if os.Getuid() != 0 {
-		t.Skip("we need root for credential")
-	}
-	checkUserNS(t)
-	cmd := exec.Command("id")
+	testenv.MustHaveExecPath(t, "id")
+	cmd := testenv.Command(t, "id")
 	uid, gid := os.Getuid(), os.Getgid()
 	cmd.SysProcAttr = &syscall.SysProcAttr{
 		Cloneflags: syscall.CLONE_NEWUSER,
@@ -298,6 +187,9 @@
 	}
 	out, err := cmd.CombinedOutput()
 	if err != nil {
+		if testenv.SyscallIsNotSupported(err) {
+			t.Skipf("skipping: %v: %v", cmd, err)
+		}
 		t.Fatalf("Cmd failed with err %v, output: %s", err, out)
 	}
 	strOut := strings.TrimSpace(string(out))
@@ -311,135 +203,131 @@
 	}
 }
 
-// TestUnshareHelperProcess isn't a real test. It's used as a helper process
-// for TestUnshareMountNameSpace.
-func TestUnshareMountNameSpaceHelper(*testing.T) {
-	if os.Getenv("GO_WANT_HELPER_PROCESS") != "1" {
-		return
-	}
-	defer os.Exit(0)
-	if err := syscall.Mount("none", flag.Args()[0], "proc", 0, ""); err != nil {
-		fmt.Fprintf(os.Stderr, "unshare: mount %v failed: %v", os.Args, err)
-		os.Exit(2)
-	}
-}
-
-// Test for Issue 38471: unshare fails because systemd has forced / to be shared
+// Test for https://go.dev/issue/19661: unshare fails because systemd
+// has forced / to be shared
 func TestUnshareMountNameSpace(t *testing.T) {
-	skipInContainer(t)
-	// Make sure we are running as root so we have permissions to use unshare
-	// and create a network namespace.
-	if os.Getuid() != 0 {
-		t.Skip("kernel prohibits unshare in unprivileged process, unless using user namespace")
+	testenv.MustHaveExec(t)
+
+	if os.Getenv("GO_WANT_HELPER_PROCESS") == "1" {
+		dir := flag.Args()[0]
+		err := syscall.Mount("none", dir, "proc", 0, "")
+		if err != nil {
+			fmt.Fprintf(os.Stderr, "unshare: mount %v failed: %#v", dir, err)
+			os.Exit(2)
+		}
+		os.Exit(0)
 	}
 
-	d, err := os.MkdirTemp("", "unshare")
+	exe, err := os.Executable()
 	if err != nil {
-		t.Fatalf("tempdir: %v", err)
+		t.Fatal(err)
 	}
 
-	cmd := exec.Command(os.Args[0], "-test.run=TestUnshareMountNameSpaceHelper", d)
-	cmd.Env = append(os.Environ(), "GO_WANT_HELPER_PROCESS=1")
+	d := t.TempDir()
+	t.Cleanup(func() {
+		// If the subprocess fails to unshare the parent directory, force-unmount it
+		// so that the test can clean it up.
+		if _, err := os.Stat(d); err == nil {
+			syscall.Unmount(d, syscall.MNT_FORCE)
+		}
+	})
+	cmd := testenv.Command(t, exe, "-test.run=TestUnshareMountNameSpace", d)
+	cmd.Env = append(cmd.Environ(), "GO_WANT_HELPER_PROCESS=1")
 	cmd.SysProcAttr = &syscall.SysProcAttr{Unshareflags: syscall.CLONE_NEWNS}
 
 	o, err := cmd.CombinedOutput()
 	if err != nil {
-		if strings.Contains(err.Error(), ": permission denied") {
-			t.Skipf("Skipping test (golang.org/issue/19698); unshare failed due to permissions: %s, %v", o, err)
+		if testenv.SyscallIsNotSupported(err) {
+			t.Skipf("skipping: could not start process with CLONE_NEWNS: %v", err)
 		}
-		t.Fatalf("unshare failed: %s, %v", o, err)
+		t.Fatalf("unshare failed: %v\n%s", err, o)
 	}
 
 	// How do we tell if the namespace was really unshared? It turns out
 	// to be simple: just try to remove the directory. If it's still mounted
-	// on the rm will fail with EBUSY. Then we have some cleanup to do:
-	// we must unmount it, then try to remove it again.
-
+	// on the rm will fail with EBUSY.
 	if err := os.Remove(d); err != nil {
 		t.Errorf("rmdir failed on %v: %v", d, err)
-		if err := syscall.Unmount(d, syscall.MNT_FORCE); err != nil {
-			t.Errorf("Can't unmount %v: %v", d, err)
-		}
-		if err := os.Remove(d); err != nil {
-			t.Errorf("rmdir after unmount failed on %v: %v", d, err)
-		}
 	}
 }
 
 // Test for Issue 20103: unshare fails when chroot is used
 func TestUnshareMountNameSpaceChroot(t *testing.T) {
-	skipInContainer(t)
-	// Make sure we are running as root so we have permissions to use unshare
-	// and create a network namespace.
-	if os.Getuid() != 0 {
-		t.Skip("kernel prohibits unshare in unprivileged process, unless using user namespace")
+	if os.Getenv("GO_WANT_HELPER_PROCESS") == "1" {
+		dir := flag.Args()[0]
+		err := syscall.Mount("none", dir, "proc", 0, "")
+		if err != nil {
+			fmt.Fprintf(os.Stderr, "unshare: mount %v failed: %#v", dir, err)
+			os.Exit(2)
+		}
+		os.Exit(0)
 	}
 
-	d, err := os.MkdirTemp("", "unshare")
-	if err != nil {
-		t.Fatalf("tempdir: %v", err)
-	}
+	d := t.TempDir()
 
 	// Since we are doing a chroot, we need the binary there,
 	// and it must be statically linked.
+	testenv.MustHaveGoBuild(t)
 	x := filepath.Join(d, "syscall.test")
-	cmd := exec.Command(testenv.GoToolPath(t), "test", "-c", "-o", x, "syscall")
-	cmd.Env = append(os.Environ(), "CGO_ENABLED=0")
+	t.Cleanup(func() {
+		// If the subprocess fails to unshare the parent directory, force-unmount it
+		// so that the test can clean it up.
+		if _, err := os.Stat(d); err == nil {
+			syscall.Unmount(d, syscall.MNT_FORCE)
+		}
+	})
+
+	cmd := testenv.Command(t, testenv.GoToolPath(t), "test", "-c", "-o", x, "syscall")
+	cmd.Env = append(cmd.Environ(), "CGO_ENABLED=0")
 	if o, err := cmd.CombinedOutput(); err != nil {
 		t.Fatalf("Build of syscall in chroot failed, output %v, err %v", o, err)
 	}
 
-	cmd = exec.Command("/syscall.test", "-test.run=TestUnshareMountNameSpaceHelper", "/")
-	cmd.Env = append(os.Environ(), "GO_WANT_HELPER_PROCESS=1")
+	cmd = testenv.Command(t, "/syscall.test", "-test.run=TestUnshareMountNameSpaceChroot", "/")
+	cmd.Env = append(cmd.Environ(), "GO_WANT_HELPER_PROCESS=1")
 	cmd.SysProcAttr = &syscall.SysProcAttr{Chroot: d, Unshareflags: syscall.CLONE_NEWNS}
 
 	o, err := cmd.CombinedOutput()
 	if err != nil {
-		if strings.Contains(err.Error(), ": permission denied") {
-			t.Skipf("Skipping test (golang.org/issue/19698); unshare failed due to permissions: %s, %v", o, err)
+		if testenv.SyscallIsNotSupported(err) {
+			t.Skipf("skipping: could not start process with CLONE_NEWNS and Chroot %q: %v", d, err)
 		}
-		t.Fatalf("unshare failed: %s, %v", o, err)
+		t.Fatalf("unshare failed: %v\n%s", err, o)
 	}
 
 	// How do we tell if the namespace was really unshared? It turns out
 	// to be simple: just try to remove the executable. If it's still mounted
-	// on, the rm will fail. Then we have some cleanup to do:
-	// we must force unmount it, then try to remove it again.
-
+	// on, the rm will fail.
 	if err := os.Remove(x); err != nil {
 		t.Errorf("rm failed on %v: %v", x, err)
-		if err := syscall.Unmount(d, syscall.MNT_FORCE); err != nil {
-			t.Fatalf("Can't unmount %v: %v", d, err)
-		}
-		if err := os.Remove(x); err != nil {
-			t.Fatalf("rm failed on %v: %v", x, err)
-		}
 	}
-
 	if err := os.Remove(d); err != nil {
 		t.Errorf("rmdir failed on %v: %v", d, err)
 	}
 }
 
-func TestUnshareUidGidMappingHelper(*testing.T) {
-	if os.Getenv("GO_WANT_HELPER_PROCESS") != "1" {
-		return
-	}
-	defer os.Exit(0)
-	if err := syscall.Chroot(os.TempDir()); err != nil {
-		fmt.Fprintln(os.Stderr, err)
-		os.Exit(2)
-	}
-}
-
 // Test for Issue 29789: unshare fails when uid/gid mapping is specified
 func TestUnshareUidGidMapping(t *testing.T) {
+	if os.Getenv("GO_WANT_HELPER_PROCESS") == "1" {
+		defer os.Exit(0)
+		if err := syscall.Chroot(os.TempDir()); err != nil {
+			fmt.Fprintln(os.Stderr, err)
+			os.Exit(2)
+		}
+	}
+
 	if os.Getuid() == 0 {
 		t.Skip("test exercises unprivileged user namespace, fails with privileges")
 	}
-	checkUserNS(t)
-	cmd := exec.Command(os.Args[0], "-test.run=TestUnshareUidGidMappingHelper")
-	cmd.Env = append(os.Environ(), "GO_WANT_HELPER_PROCESS=1")
+
+	testenv.MustHaveExec(t)
+	exe, err := os.Executable()
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	cmd := testenv.Command(t, exe, "-test.run=TestUnshareUidGidMapping")
+	cmd.Env = append(cmd.Environ(), "GO_WANT_HELPER_PROCESS=1")
 	cmd.SysProcAttr = &syscall.SysProcAttr{
 		Unshareflags:               syscall.CLONE_NEWNS | syscall.CLONE_NEWUSER,
 		GidMappingsEnableSetgroups: false,
@@ -460,6 +348,9 @@
 	}
 	out, err := cmd.CombinedOutput()
 	if err != nil {
+		if testenv.SyscallIsNotSupported(err) {
+			t.Skipf("skipping: could not start process with CLONE_NEWNS and CLONE_NEWUSER: %v", err)
+		}
 		t.Fatalf("Cmd failed with err %v, output: %s", err, out)
 	}
 }
@@ -497,8 +388,7 @@
 			CgroupFD:    -1,
 		},
 	})
-	// // EPERM can be returned if clone3 is not enabled by seccomp.
-	if err == syscall.ENOSYS || err == syscall.EPERM {
+	if testenv.SyscallIsNotSupported(err) {
 		t.Skipf("clone3 with CLONE_INTO_CGROUP not available: %v", err)
 	}
 
@@ -507,8 +397,8 @@
 	if err != nil {
 		// ErrPermission or EROFS (#57262) when running in an unprivileged container.
 		// ErrNotExist when cgroupfs is not mounted in chroot/schroot.
-		if os.IsNotExist(err) || os.IsPermission(err) || errors.Is(err, syscall.EROFS) {
-			t.Skip(err)
+		if os.IsNotExist(err) || testenv.SyscallIsNotSupported(err) {
+			t.Skipf("skipping: %v", err)
 		}
 		t.Fatal(err)
 	}
@@ -524,10 +414,16 @@
 }
 
 func TestUseCgroupFD(t *testing.T) {
+	testenv.MustHaveExec(t)
+	exe, err := os.Executable()
+	if err != nil {
+		t.Fatal(err)
+	}
+
 	fd, suffix := prepareCgroupFD(t)
 
-	cmd := exec.Command(os.Args[0], "-test.run=TestUseCgroupFDHelper")
-	cmd.Env = append(os.Environ(), "GO_WANT_HELPER_PROCESS=1")
+	cmd := testenv.Command(t, exe, "-test.run=TestUseCgroupFDHelper")
+	cmd.Env = append(cmd.Environ(), "GO_WANT_HELPER_PROCESS=1")
 	cmd.SysProcAttr = &syscall.SysProcAttr{
 		UseCgroupFD: true,
 		CgroupFD:    fd,
@@ -556,6 +452,52 @@
 	fmt.Print(string(selfCg))
 }
 
+func TestCloneTimeNamespace(t *testing.T) {
+	testenv.MustHaveExec(t)
+
+	if os.Getenv("GO_WANT_HELPER_PROCESS") == "1" {
+		timens, err := os.Readlink("/proc/self/ns/time")
+		if err != nil {
+			fmt.Fprintln(os.Stderr, err)
+			os.Exit(2)
+		}
+		fmt.Print(string(timens))
+		os.Exit(0)
+	}
+
+	exe, err := os.Executable()
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	cmd := testenv.Command(t, exe, "-test.run=TestCloneTimeNamespace")
+	cmd.Env = append(cmd.Environ(), "GO_WANT_HELPER_PROCESS=1")
+	cmd.SysProcAttr = &syscall.SysProcAttr{
+		Cloneflags: syscall.CLONE_NEWTIME,
+	}
+	out, err := cmd.CombinedOutput()
+	if err != nil {
+		if testenv.SyscallIsNotSupported(err) {
+			// CLONE_NEWTIME does not appear to be supported.
+			t.Skipf("skipping, CLONE_NEWTIME not supported: %v", err)
+		}
+		t.Fatalf("Cmd failed with err %v, output: %s", err, out)
+	}
+
+	// Inode number of the time namespaces should be different.
+	// Based on https://man7.org/linux/man-pages/man7/time_namespaces.7.html#EXAMPLES
+	timens, err := os.Readlink("/proc/self/ns/time")
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	parentTimeNS := string(timens)
+	childTimeNS := string(out)
+	if childTimeNS == parentTimeNS {
+		t.Fatalf("expected child time namespace to be different from parent time namespace: %s", parentTimeNS)
+	}
+}
+
 type capHeader struct {
 	version uint32
 	pid     int32
@@ -591,68 +533,31 @@
 	return c, nil
 }
 
-func mustSupportAmbientCaps(t *testing.T) {
-	var uname syscall.Utsname
-	if err := syscall.Uname(&uname); err != nil {
-		t.Fatalf("Uname: %v", err)
-	}
-	var buf [65]byte
-	for i, b := range uname.Release {
-		buf[i] = byte(b)
-	}
-	ver := string(buf[:])
-	ver, _, _ = strings.Cut(ver, "\x00")
-	if strings.HasPrefix(ver, "2.") ||
-		strings.HasPrefix(ver, "3.") ||
-		strings.HasPrefix(ver, "4.1.") ||
-		strings.HasPrefix(ver, "4.2.") {
-		t.Skipf("kernel version %q predates required 4.3; skipping test", ver)
-	}
-}
-
-// TestAmbientCapsHelper isn't a real test. It's used as a helper process for
-// TestAmbientCaps.
-func TestAmbientCapsHelper(*testing.T) {
-	if os.Getenv("GO_WANT_HELPER_PROCESS") != "1" {
-		return
-	}
-	defer os.Exit(0)
-
-	caps, err := getCaps()
-	if err != nil {
-		fmt.Fprintln(os.Stderr, err)
-		os.Exit(2)
-	}
-	if caps.data[0].effective&(1<<uint(CAP_SYS_TIME)) == 0 {
-		fmt.Fprintln(os.Stderr, "CAP_SYS_TIME unexpectedly not in the effective capability mask")
-		os.Exit(2)
-	}
-	if caps.data[1].effective&(1<<uint(CAP_SYSLOG&31)) == 0 {
-		fmt.Fprintln(os.Stderr, "CAP_SYSLOG unexpectedly not in the effective capability mask")
-		os.Exit(2)
-	}
-}
-
 func TestAmbientCaps(t *testing.T) {
-	// Make sure we are running as root so we have permissions to use unshare
-	// and create a network namespace.
-	if os.Getuid() != 0 {
-		t.Skip("kernel prohibits unshare in unprivileged process, unless using user namespace")
-	}
-
 	testAmbientCaps(t, false)
 }
 
 func TestAmbientCapsUserns(t *testing.T) {
-	checkUserNS(t)
 	testAmbientCaps(t, true)
 }
 
 func testAmbientCaps(t *testing.T, userns bool) {
-	skipInContainer(t)
-	mustSupportAmbientCaps(t)
-
-	skipUnprivilegedUserClone(t)
+	if os.Getenv("GO_WANT_HELPER_PROCESS") == "1" {
+		caps, err := getCaps()
+		if err != nil {
+			fmt.Fprintln(os.Stderr, err)
+			os.Exit(2)
+		}
+		if caps.data[0].effective&(1<<uint(CAP_SYS_TIME)) == 0 {
+			fmt.Fprintln(os.Stderr, "CAP_SYS_TIME unexpectedly not in the effective capability mask")
+			os.Exit(2)
+		}
+		if caps.data[1].effective&(1<<uint(CAP_SYSLOG&31)) == 0 {
+			fmt.Fprintln(os.Stderr, "CAP_SYSLOG unexpectedly not in the effective capability mask")
+			os.Exit(2)
+		}
+		os.Exit(0)
+	}
 
 	// skip on android, due to lack of lookup support
 	if runtime.GOOS == "android" {
@@ -677,9 +582,18 @@
 	if err != nil {
 		t.Fatal(err)
 	}
-	defer os.Remove(f.Name())
-	defer f.Close()
-	e, err := os.Open(os.Args[0])
+	t.Cleanup(func() {
+		f.Close()
+		os.Remove(f.Name())
+	})
+
+	testenv.MustHaveExec(t)
+	exe, err := os.Executable()
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	e, err := os.Open(exe)
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -694,8 +608,8 @@
 		t.Fatal(err)
 	}
 
-	cmd := exec.Command(f.Name(), "-test.run=TestAmbientCapsHelper")
-	cmd.Env = append(os.Environ(), "GO_WANT_HELPER_PROCESS=1")
+	cmd := testenv.Command(t, f.Name(), "-test.run="+t.Name())
+	cmd.Env = append(cmd.Environ(), "GO_WANT_HELPER_PROCESS=1")
 	cmd.Stdout = os.Stdout
 	cmd.Stderr = os.Stderr
 	cmd.SysProcAttr = &syscall.SysProcAttr{
@@ -728,6 +642,9 @@
 		}
 	}
 	if err := cmd.Run(); err != nil {
+		if testenv.SyscallIsNotSupported(err) {
+			t.Skipf("skipping: %v: %v", cmd, err)
+		}
 		t.Fatal(err.Error())
 	}
 }
diff --git a/src/syscall/exec_plan9.go b/src/syscall/exec_plan9.go
index 8f28b5a..8762237 100644
--- a/src/syscall/exec_plan9.go
+++ b/src/syscall/exec_plan9.go
@@ -135,6 +135,8 @@
 		errbuf   [ERRMAX]byte
 		statbuf  [STATMAX]byte
 		dupdevfd int
+		n        int
+		b        []byte
 	)
 
 	// Guard against side effects of shuffling fds below.
@@ -177,14 +179,14 @@
 dirloop:
 	for {
 		r1, _, _ = RawSyscall6(SYS_PREAD, uintptr(dupdevfd), uintptr(unsafe.Pointer(&statbuf[0])), uintptr(len(statbuf)), ^uintptr(0), ^uintptr(0), 0)
-		n := int(r1)
+		n = int(r1)
 		switch n {
 		case -1:
 			goto childerror
 		case 0:
 			break dirloop
 		}
-		for b := statbuf[:n]; len(b) > 0; {
+		for b = statbuf[:n]; len(b) > 0; {
 			var s []byte
 			s, b = gdirname(b)
 			if s == nil {
diff --git a/src/syscall/exec_solaris_test.go b/src/syscall/exec_solaris_test.go
index 90e5349..0c653f7 100644
--- a/src/syscall/exec_solaris_test.go
+++ b/src/syscall/exec_solaris_test.go
@@ -34,4 +34,4 @@
 	return
 }
 
-var Ioctl = ioctl
+var IoctlPtr = ioctlPtr
diff --git a/src/syscall/exec_unix.go b/src/syscall/exec_unix.go
index 286be45..9a5f2d3 100644
--- a/src/syscall/exec_unix.go
+++ b/src/syscall/exec_unix.go
@@ -16,7 +16,8 @@
 	"unsafe"
 )
 
-// Lock synchronizing creation of new file descriptors with fork.
+// ForkLock is used to synchronize 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
@@ -53,16 +54,14 @@
 // 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 (Linux).
-//             Otherwise, live with the race.
-// 5) Dup. Does not block. Use the ForkLock.
-//             On Linux, could use fcntl F_DUPFD_CLOEXEC
-//             instead of the ForkLock, but only for dup(fd, -1).
-
+//   - Pipe. Use pipe2 if available. Otherwise, does not block,
+//     so use ForkLock.
+//   - Socket. Use SOCK_CLOEXEC if available. Otherwise, does not
+//     block, so use ForkLock.
+//   - Open. Use O_CLOEXEC if available. Otherwise, may block,
+//     so live with the race.
+//   - Dup. Use F_DUPFD_CLOEXEC or dup3 if available. Otherwise,
+//     does not block, so use ForkLock.
 var ForkLock sync.RWMutex
 
 // StringSlicePtr converts a slice of strings to a slice of pointers
@@ -166,7 +165,7 @@
 		return 0, err
 	}
 
-	if (runtime.GOOS == "freebsd" || runtime.GOOS == "dragonfly") && len(argv[0]) > len(argv0) {
+	if (runtime.GOOS == "freebsd" || runtime.GOOS == "dragonfly") && len(argv) > 0 && len(argv[0]) > len(argv0) {
 		argvp[0] = argv0p
 	}
 
@@ -194,14 +193,11 @@
 		return 0, errorspkg.New("Setctty set but Ctty not valid in child")
 	}
 
-	// Acquire the fork lock so that no other threads
-	// create new fds that are not yet close-on-exec
-	// before we fork.
-	ForkLock.Lock()
+	acquireForkLock()
 
 	// Allocate child status pipe close on exec.
 	if err = forkExecPipe(p[:]); err != nil {
-		ForkLock.Unlock()
+		releaseForkLock()
 		return 0, err
 	}
 
@@ -210,10 +206,10 @@
 	if err1 != 0 {
 		Close(p[0])
 		Close(p[1])
-		ForkLock.Unlock()
+		releaseForkLock()
 		return 0, Errno(err1)
 	}
-	ForkLock.Unlock()
+	releaseForkLock()
 
 	// Read child error status from pipe.
 	Close(p[1])
@@ -282,6 +278,11 @@
 	}
 	runtime_BeforeExec()
 
+	rlim, rlimOK := origRlimitNofile.Load().(Rlimit)
+	if rlimOK && rlim.Cur != 0 {
+		Setrlimit(RLIMIT_NOFILE, &rlim)
+	}
+
 	var err1 error
 	if runtime.GOOS == "solaris" || runtime.GOOS == "illumos" || runtime.GOOS == "aix" {
 		// RawSyscall should never be used on Solaris, illumos, or AIX.
diff --git a/src/syscall/exec_unix_test.go b/src/syscall/exec_unix_test.go
index 4253cda..9627317 100644
--- a/src/syscall/exec_unix_test.go
+++ b/src/syscall/exec_unix_test.go
@@ -7,12 +7,15 @@
 package syscall_test
 
 import (
+	"bytes"
+	"fmt"
 	"internal/testenv"
 	"io"
 	"math/rand"
 	"os"
 	"os/exec"
 	"os/signal"
+	"strconv"
 	"syscall"
 	"testing"
 	"time"
@@ -177,7 +180,7 @@
 	// equivalent.
 	fpgrp := int32(0)
 
-	errno := syscall.Ioctl(tty.Fd(), syscall.TIOCGPGRP, uintptr(unsafe.Pointer(&fpgrp)))
+	errno := syscall.IoctlPtr(tty.Fd(), syscall.TIOCGPGRP, unsafe.Pointer(&fpgrp))
 	if errno != 0 {
 		t.Fatalf("TIOCGPGRP failed with error code: %s", errno)
 	}
@@ -214,7 +217,7 @@
 
 	// This call fails on darwin/arm64. The failure doesn't matter, though.
 	// This is just best effort.
-	syscall.Ioctl(tty.Fd(), syscall.TIOCSPGRP, uintptr(unsafe.Pointer(&fpgrp)))
+	syscall.IoctlPtr(tty.Fd(), syscall.TIOCSPGRP, unsafe.Pointer(&fpgrp))
 }
 
 func TestForegroundSignal(t *testing.T) {
@@ -228,7 +231,7 @@
 	// equivalent.
 	fpgrp := int32(0)
 
-	errno := syscall.Ioctl(tty.Fd(), syscall.TIOCGPGRP, uintptr(unsafe.Pointer(&fpgrp)))
+	errno := syscall.IoctlPtr(tty.Fd(), syscall.TIOCGPGRP, unsafe.Pointer(&fpgrp))
 	if errno != 0 {
 		t.Fatalf("TIOCGPGRP failed with error code: %s", errno)
 	}
@@ -239,7 +242,7 @@
 
 	defer func() {
 		signal.Ignore(syscall.SIGTTIN, syscall.SIGTTOU)
-		syscall.Ioctl(tty.Fd(), syscall.TIOCSPGRP, uintptr(unsafe.Pointer(&fpgrp)))
+		syscall.IoctlPtr(tty.Fd(), syscall.TIOCSPGRP, unsafe.Pointer(&fpgrp))
 		signal.Reset()
 	}()
 
@@ -345,3 +348,54 @@
 
 	t.Error("syscall.Exec returned")
 }
+
+// Test that rlimit values are restored by exec.
+func TestRlimitRestored(t *testing.T) {
+	if os.Getenv("GO_WANT_HELPER_PROCESS") != "" {
+		fmt.Println(syscall.OrigRlimitNofile().Cur)
+		os.Exit(0)
+	}
+
+	orig := syscall.OrigRlimitNofile()
+	if orig.Cur == 0 {
+		t.Skip("skipping test because rlimit not adjusted at startup")
+	}
+
+	executable, err := os.Executable()
+	if err != nil {
+		executable = os.Args[0]
+	}
+
+	cmd := testenv.Command(t, executable, "-test.run=TestRlimitRestored")
+	cmd = testenv.CleanCmdEnv(cmd)
+	cmd.Env = append(cmd.Env, "GO_WANT_HELPER_PROCESS=1")
+
+	out, err := cmd.CombinedOutput()
+	if len(out) > 0 {
+		t.Logf("%s", out)
+	}
+	if err != nil {
+		t.Fatalf("subprocess failed: %v", err)
+	}
+	s := string(bytes.TrimSpace(out))
+	v, err := strconv.ParseUint(s, 10, 64)
+	if err != nil {
+		t.Fatalf("could not parse %q as number: %v", s, v)
+	}
+
+	if v != uint64(orig.Cur) {
+		t.Errorf("exec rlimit = %d, want %d", v, orig)
+	}
+}
+
+func TestForkExecNilArgv(t *testing.T) {
+	defer func() {
+		if p := recover(); p != nil {
+			t.Fatal("forkExec panicked")
+		}
+	}()
+
+	// We don't really care what the result of forkExec is, just that it doesn't
+	// panic, so we choose something we know won't actually spawn a process (probably).
+	syscall.ForkExec("/dev/null", nil, nil)
+}
diff --git a/src/syscall/exec_windows.go b/src/syscall/exec_windows.go
index 45295de..0a93bc0 100644
--- a/src/syscall/exec_windows.go
+++ b/src/syscall/exec_windows.go
@@ -247,7 +247,7 @@
 	Token                      Token               // if set, runs new process in the security context represented by the token
 	ProcessAttributes          *SecurityAttributes // if set, applies these security attributes as the descriptor for the new process
 	ThreadAttributes           *SecurityAttributes // if set, applies these security attributes as the descriptor for the main thread of the new process
-	NoInheritHandles           bool                // if set, each inheritable handle in the calling process is not inherited by the new process
+	NoInheritHandles           bool                // if set, no handles are inherited by the new process, not even the standard handles, contained in ProcAttr.Files, nor the ones contained in AdditionalInheritedHandles
 	AdditionalInheritedHandles []Handle            // a list of additional handles, already marked as inheritable, that will be inherited by the new process
 	ParentProcess              Handle              // if non-zero, the new process regards the process given by this handle as its parent process, and AdditionalInheritedHandles, if set, should exist in this parent process
 }
diff --git a/src/syscall/export_darwin_test.go b/src/syscall/export_darwin_test.go
index 40d18f9..0cf992b 100644
--- a/src/syscall/export_darwin_test.go
+++ b/src/syscall/export_darwin_test.go
@@ -4,8 +4,10 @@
 
 package syscall
 
-func Ioctl(fd, req, arg uintptr) Errno {
-	err := ioctl(int(fd), int(req), int(arg))
+import "unsafe"
+
+func IoctlPtr(fd, req uintptr, arg unsafe.Pointer) Errno {
+	err := ioctlPtr(int(fd), uint(req), arg)
 	if err != nil {
 		return err.(Errno)
 	}
diff --git a/src/syscall/export_rlimit_test.go b/src/syscall/export_rlimit_test.go
new file mode 100644
index 0000000..320e331
--- /dev/null
+++ b/src/syscall/export_rlimit_test.go
@@ -0,0 +1,14 @@
+// Copyright 2023 The Go 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:build unix
+
+package syscall
+
+func OrigRlimitNofile() Rlimit {
+	if rlim, ok := origRlimitNofile.Load().(Rlimit); ok {
+		return rlim
+	}
+	return Rlimit{0, 0}
+}
diff --git a/src/syscall/export_unix_test.go b/src/syscall/export_unix_test.go
index 2f678d2..c7486af 100644
--- a/src/syscall/export_unix_test.go
+++ b/src/syscall/export_unix_test.go
@@ -6,7 +6,9 @@
 
 package syscall
 
-func Ioctl(fd, req, arg uintptr) (err Errno) {
-	_, _, err = Syscall(SYS_IOCTL, fd, req, arg)
+import "unsafe"
+
+func IoctlPtr(fd, req uintptr, arg unsafe.Pointer) (err Errno) {
+	_, _, err = Syscall(SYS_IOCTL, fd, req, uintptr(arg))
 	return err
 }
diff --git a/src/syscall/export_wasip1_test.go b/src/syscall/export_wasip1_test.go
new file mode 100644
index 0000000..aa53d26
--- /dev/null
+++ b/src/syscall/export_wasip1_test.go
@@ -0,0 +1,11 @@
+// Copyright 2023 The Go 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:build wasip1
+
+package syscall
+
+func JoinPath(dir, file string) string {
+	return joinPath(dir, file)
+}
diff --git a/src/syscall/export_windows_test.go b/src/syscall/export_windows_test.go
index a72a1ee..eccf1bc 100644
--- a/src/syscall/export_windows_test.go
+++ b/src/syscall/export_windows_test.go
@@ -9,3 +9,6 @@
 var DeleteProcThreadAttributeList = deleteProcThreadAttributeList
 
 const PROC_THREAD_ATTRIBUTE_HANDLE_LIST = _PROC_THREAD_ATTRIBUTE_HANDLE_LIST
+
+var EncodeWTF16 = encodeWTF16
+var DecodeWTF16 = decodeWTF16
diff --git a/src/syscall/forkpipe.go b/src/syscall/forkpipe.go
index 5082abc..1f4292f 100644
--- a/src/syscall/forkpipe.go
+++ b/src/syscall/forkpipe.go
@@ -6,7 +6,8 @@
 
 package syscall
 
-// Try to open a pipe with O_CLOEXEC set on both file descriptors.
+// forkExecPipe opens a pipe and non-atomically sets O_CLOEXEC on both file
+// descriptors.
 func forkExecPipe(p []int) error {
 	err := Pipe(p)
 	if err != nil {
@@ -19,3 +20,11 @@
 	_, err = fcntl(p[1], F_SETFD, FD_CLOEXEC)
 	return err
 }
+
+func acquireForkLock() {
+	ForkLock.Lock()
+}
+
+func releaseForkLock() {
+	ForkLock.Unlock()
+}
diff --git a/src/syscall/forkpipe2.go b/src/syscall/forkpipe2.go
index 6ab1391..bbecfda 100644
--- a/src/syscall/forkpipe2.go
+++ b/src/syscall/forkpipe2.go
@@ -2,10 +2,97 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build dragonfly || freebsd || netbsd || openbsd || solaris
+//go:build dragonfly || freebsd || linux || netbsd || openbsd || solaris
 
 package syscall
 
+import "sync"
+
+// forkExecPipe atomically opens a pipe with O_CLOEXEC set on both file
+// descriptors.
 func forkExecPipe(p []int) error {
 	return Pipe2(p, O_CLOEXEC)
 }
+
+var (
+	// Guard the forking variable.
+	forkingLock sync.Mutex
+	// Number of goroutines currently forking, and thus the
+	// number of goroutines holding a conceptual write lock
+	// on ForkLock.
+	forking int
+)
+
+// hasWaitingReaders reports whether any goroutine is waiting
+// to acquire a read lock on rw. It is defined in the sync package.
+func hasWaitingReaders(rw *sync.RWMutex) bool
+
+// acquireForkLock acquires a write lock on ForkLock.
+// ForkLock is exported and we've promised that during a fork
+// we will call ForkLock.Lock, so that no other threads create
+// new fds that are not yet close-on-exec before we fork.
+// But that forces all fork calls to be serialized, which is bad.
+// But we haven't promised that serialization, and it is essentially
+// undetectable by other users of ForkLock, which is good.
+// Avoid the serialization by ensuring that ForkLock is locked
+// at the first fork and unlocked when there are no more forks.
+func acquireForkLock() {
+	forkingLock.Lock()
+	defer forkingLock.Unlock()
+
+	if forking == 0 {
+		// There is no current write lock on ForkLock.
+		ForkLock.Lock()
+		forking++
+		return
+	}
+
+	// ForkLock is currently locked for writing.
+
+	if hasWaitingReaders(&ForkLock) {
+		// ForkLock is locked for writing, and at least one
+		// goroutine is waiting to read from it.
+		// To avoid lock starvation, allow readers to proceed.
+		// The simple way to do this is for us to acquire a
+		// read lock. That will block us until all current
+		// conceptual write locks are released.
+		//
+		// Note that this case is unusual on modern systems
+		// with O_CLOEXEC and SOCK_CLOEXEC. On those systems
+		// the standard library should never take a read
+		// lock on ForkLock.
+
+		forkingLock.Unlock()
+
+		ForkLock.RLock()
+		ForkLock.RUnlock()
+
+		forkingLock.Lock()
+
+		// Readers got a chance, so now take the write lock.
+
+		if forking == 0 {
+			ForkLock.Lock()
+		}
+	}
+
+	forking++
+}
+
+// releaseForkLock releases the conceptual write lock on ForkLock
+// acquired by acquireForkLock.
+func releaseForkLock() {
+	forkingLock.Lock()
+	defer forkingLock.Unlock()
+
+	if forking <= 0 {
+		panic("syscall.releaseForkLock: negative count")
+	}
+
+	forking--
+
+	if forking == 0 {
+		// No more conceptual write locks.
+		ForkLock.Unlock()
+	}
+}
diff --git a/src/syscall/fs_js.go b/src/syscall/fs_js.go
index ce0aa88..793b9a2 100644
--- a/src/syscall/fs_js.go
+++ b/src/syscall/fs_js.go
@@ -273,6 +273,8 @@
 }
 
 func UtimesNano(path string, ts []Timespec) error {
+	// UTIME_OMIT value must match internal/syscall/unix/at_js.go
+	const UTIME_OMIT = -0x2
 	if err := checkPath(path); err != nil {
 		return err
 	}
@@ -281,6 +283,18 @@
 	}
 	atime := ts[0].Sec
 	mtime := ts[1].Sec
+	if atime == UTIME_OMIT || mtime == UTIME_OMIT {
+		var st Stat_t
+		if err := Stat(path, &st); err != nil {
+			return err
+		}
+		if atime == UTIME_OMIT {
+			atime = st.Atime
+		}
+		if mtime == UTIME_OMIT {
+			mtime = st.Mtime
+		}
+	}
 	_, err := fsCall("utimes", path, atime, mtime)
 	return err
 }
diff --git a/src/syscall/fs_wasip1.go b/src/syscall/fs_wasip1.go
new file mode 100644
index 0000000..4ad3f96
--- /dev/null
+++ b/src/syscall/fs_wasip1.go
@@ -0,0 +1,933 @@
+// Copyright 2023 The Go 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:build wasip1
+
+package syscall
+
+import (
+	"runtime"
+	"unsafe"
+)
+
+func init() {
+	// Try to set stdio to non-blocking mode before the os package
+	// calls NewFile for each fd. NewFile queries the non-blocking flag
+	// but doesn't change it, even if the runtime supports non-blocking
+	// stdio. Since WebAssembly modules are single-threaded, blocking
+	// system calls temporarily halt execution of the module. If the
+	// runtime supports non-blocking stdio, the Go runtime is able to
+	// use the WASI net poller to poll for read/write readiness and is
+	// able to schedule goroutines while waiting.
+	SetNonblock(0, true)
+	SetNonblock(1, true)
+	SetNonblock(2, true)
+}
+
+type uintptr32 = uint32
+type size = uint32
+type fdflags = uint32
+type filesize = uint64
+type filetype = uint8
+type lookupflags = uint32
+type oflags = uint32
+type rights = uint64
+type timestamp = uint64
+type dircookie = uint64
+type filedelta = int64
+type fstflags = uint32
+
+type iovec struct {
+	buf    uintptr32
+	bufLen size
+}
+
+const (
+	LOOKUP_SYMLINK_FOLLOW = 0x00000001
+)
+
+const (
+	OFLAG_CREATE    = 0x0001
+	OFLAG_DIRECTORY = 0x0002
+	OFLAG_EXCL      = 0x0004
+	OFLAG_TRUNC     = 0x0008
+)
+
+const (
+	FDFLAG_APPEND   = 0x0001
+	FDFLAG_DSYNC    = 0x0002
+	FDFLAG_NONBLOCK = 0x0004
+	FDFLAG_RSYNC    = 0x0008
+	FDFLAG_SYNC     = 0x0010
+)
+
+const (
+	RIGHT_FD_DATASYNC = 1 << iota
+	RIGHT_FD_READ
+	RIGHT_FD_SEEK
+	RIGHT_FDSTAT_SET_FLAGS
+	RIGHT_FD_SYNC
+	RIGHT_FD_TELL
+	RIGHT_FD_WRITE
+	RIGHT_FD_ADVISE
+	RIGHT_FD_ALLOCATE
+	RIGHT_PATH_CREATE_DIRECTORY
+	RIGHT_PATH_CREATE_FILE
+	RIGHT_PATH_LINK_SOURCE
+	RIGHT_PATH_LINK_TARGET
+	RIGHT_PATH_OPEN
+	RIGHT_FD_READDIR
+	RIGHT_PATH_READLINK
+	RIGHT_PATH_RENAME_SOURCE
+	RIGHT_PATH_RENAME_TARGET
+	RIGHT_PATH_FILESTAT_GET
+	RIGHT_PATH_FILESTAT_SET_SIZE
+	RIGHT_PATH_FILESTAT_SET_TIMES
+	RIGHT_FD_FILESTAT_GET
+	RIGHT_FD_FILESTAT_SET_SIZE
+	RIGHT_FD_FILESTAT_SET_TIMES
+	RIGHT_PATH_SYMLINK
+	RIGHT_PATH_REMOVE_DIRECTORY
+	RIGHT_PATH_UNLINK_FILE
+	RIGHT_POLL_FD_READWRITE
+	RIGHT_SOCK_SHUTDOWN
+	RIGHT_SOCK_ACCEPT
+)
+
+const (
+	WHENCE_SET = 0
+	WHENCE_CUR = 1
+	WHENCE_END = 2
+)
+
+const (
+	FILESTAT_SET_ATIM     = 0x0001
+	FILESTAT_SET_ATIM_NOW = 0x0002
+	FILESTAT_SET_MTIM     = 0x0004
+	FILESTAT_SET_MTIM_NOW = 0x0008
+)
+
+const (
+	// Despite the rights being defined as a 64 bits integer in the spec,
+	// wasmtime crashes the program if we set any of the upper 32 bits.
+	fullRights  = rights(^uint32(0))
+	readRights  = rights(RIGHT_FD_READ | RIGHT_FD_READDIR)
+	writeRights = rights(RIGHT_FD_DATASYNC | RIGHT_FD_WRITE | RIGHT_FD_ALLOCATE | RIGHT_PATH_FILESTAT_SET_SIZE)
+
+	// Some runtimes have very strict expectations when it comes to which
+	// rights can be enabled on files opened by path_open. The fileRights
+	// constant is used as a mask to retain only bits for operations that
+	// are supported on files.
+	fileRights rights = RIGHT_FD_DATASYNC |
+		RIGHT_FD_READ |
+		RIGHT_FD_SEEK |
+		RIGHT_FDSTAT_SET_FLAGS |
+		RIGHT_FD_SYNC |
+		RIGHT_FD_TELL |
+		RIGHT_FD_WRITE |
+		RIGHT_FD_ADVISE |
+		RIGHT_FD_ALLOCATE |
+		RIGHT_PATH_CREATE_DIRECTORY |
+		RIGHT_PATH_CREATE_FILE |
+		RIGHT_PATH_LINK_SOURCE |
+		RIGHT_PATH_LINK_TARGET |
+		RIGHT_PATH_OPEN |
+		RIGHT_FD_READDIR |
+		RIGHT_PATH_READLINK |
+		RIGHT_PATH_RENAME_SOURCE |
+		RIGHT_PATH_RENAME_TARGET |
+		RIGHT_PATH_FILESTAT_GET |
+		RIGHT_PATH_FILESTAT_SET_SIZE |
+		RIGHT_PATH_FILESTAT_SET_TIMES |
+		RIGHT_FD_FILESTAT_GET |
+		RIGHT_FD_FILESTAT_SET_SIZE |
+		RIGHT_FD_FILESTAT_SET_TIMES |
+		RIGHT_PATH_SYMLINK |
+		RIGHT_PATH_REMOVE_DIRECTORY |
+		RIGHT_PATH_UNLINK_FILE |
+		RIGHT_POLL_FD_READWRITE
+
+	// Runtimes like wasmtime and wasmedge will refuse to open directories
+	// if the rights requested by the application exceed the operations that
+	// can be performed on a directory.
+	dirRights rights = RIGHT_FD_SEEK |
+		RIGHT_FDSTAT_SET_FLAGS |
+		RIGHT_FD_SYNC |
+		RIGHT_PATH_CREATE_DIRECTORY |
+		RIGHT_PATH_CREATE_FILE |
+		RIGHT_PATH_LINK_SOURCE |
+		RIGHT_PATH_LINK_TARGET |
+		RIGHT_PATH_OPEN |
+		RIGHT_FD_READDIR |
+		RIGHT_PATH_READLINK |
+		RIGHT_PATH_RENAME_SOURCE |
+		RIGHT_PATH_RENAME_TARGET |
+		RIGHT_PATH_FILESTAT_GET |
+		RIGHT_PATH_FILESTAT_SET_SIZE |
+		RIGHT_PATH_FILESTAT_SET_TIMES |
+		RIGHT_FD_FILESTAT_GET |
+		RIGHT_FD_FILESTAT_SET_TIMES |
+		RIGHT_PATH_SYMLINK |
+		RIGHT_PATH_REMOVE_DIRECTORY |
+		RIGHT_PATH_UNLINK_FILE
+)
+
+// https://github.com/WebAssembly/WASI/blob/a2b96e81c0586125cc4dc79a5be0b78d9a059925/legacy/preview1/docs.md#-fd_closefd-fd---result-errno
+//
+//go:wasmimport wasi_snapshot_preview1 fd_close
+//go:noescape
+func fd_close(fd int32) Errno
+
+// https://github.com/WebAssembly/WASI/blob/a2b96e81c0586125cc4dc79a5be0b78d9a059925/legacy/preview1/docs.md#-fd_filestat_set_sizefd-fd-size-filesize---result-errno
+//
+//go:wasmimport wasi_snapshot_preview1 fd_filestat_set_size
+//go:noescape
+func fd_filestat_set_size(fd int32, set_size filesize) Errno
+
+// https://github.com/WebAssembly/WASI/blob/a2b96e81c0586125cc4dc79a5be0b78d9a059925/legacy/preview1/docs.md#-fd_preadfd-fd-iovs-iovec_array-offset-filesize---resultsize-errno
+//
+//go:wasmimport wasi_snapshot_preview1 fd_pread
+//go:noescape
+func fd_pread(fd int32, iovs unsafe.Pointer, iovsLen size, offset filesize, nread unsafe.Pointer) Errno
+
+//go:wasmimport wasi_snapshot_preview1 fd_pwrite
+//go:noescape
+func fd_pwrite(fd int32, iovs unsafe.Pointer, iovsLen size, offset filesize, nwritten unsafe.Pointer) Errno
+
+//go:wasmimport wasi_snapshot_preview1 fd_read
+//go:noescape
+func fd_read(fd int32, iovs unsafe.Pointer, iovsLen size, nread unsafe.Pointer) Errno
+
+//go:wasmimport wasi_snapshot_preview1 fd_readdir
+//go:noescape
+func fd_readdir(fd int32, buf unsafe.Pointer, bufLen size, cookie dircookie, nwritten unsafe.Pointer) Errno
+
+//go:wasmimport wasi_snapshot_preview1 fd_seek
+//go:noescape
+func fd_seek(fd int32, offset filedelta, whence uint32, newoffset unsafe.Pointer) Errno
+
+// https://github.com/WebAssembly/WASI/blob/a2b96e81c0586125cc4dc79a5be0b78d9a059925/legacy/preview1/docs.md#-fd_fdstat_set_rightsfd-fd-fs_rights_base-rights-fs_rights_inheriting-rights---result-errno
+//
+//go:wasmimport wasi_snapshot_preview1 fd_fdstat_set_rights
+//go:noescape
+func fd_fdstat_set_rights(fd int32, rightsBase rights, rightsInheriting rights) Errno
+
+//go:wasmimport wasi_snapshot_preview1 fd_filestat_get
+//go:noescape
+func fd_filestat_get(fd int32, buf unsafe.Pointer) Errno
+
+//go:wasmimport wasi_snapshot_preview1 fd_write
+//go:noescape
+func fd_write(fd int32, iovs unsafe.Pointer, iovsLen size, nwritten unsafe.Pointer) Errno
+
+//go:wasmimport wasi_snapshot_preview1 fd_sync
+//go:noescape
+func fd_sync(fd int32) Errno
+
+//go:wasmimport wasi_snapshot_preview1 path_create_directory
+//go:noescape
+func path_create_directory(fd int32, path unsafe.Pointer, pathLen size) Errno
+
+//go:wasmimport wasi_snapshot_preview1 path_filestat_get
+//go:noescape
+func path_filestat_get(fd int32, flags lookupflags, path unsafe.Pointer, pathLen size, buf unsafe.Pointer) Errno
+
+//go:wasmimport wasi_snapshot_preview1 path_filestat_set_times
+//go:noescape
+func path_filestat_set_times(fd int32, flags lookupflags, path unsafe.Pointer, pathLen size, atim timestamp, mtim timestamp, fstflags fstflags) Errno
+
+//go:wasmimport wasi_snapshot_preview1 path_link
+//go:noescape
+func path_link(oldFd int32, oldFlags lookupflags, oldPath unsafe.Pointer, oldPathLen size, newFd int32, newPath unsafe.Pointer, newPathLen size) Errno
+
+//go:wasmimport wasi_snapshot_preview1 path_readlink
+//go:noescape
+func path_readlink(fd int32, path unsafe.Pointer, pathLen size, buf unsafe.Pointer, bufLen size, nwritten unsafe.Pointer) Errno
+
+//go:wasmimport wasi_snapshot_preview1 path_remove_directory
+//go:noescape
+func path_remove_directory(fd int32, path unsafe.Pointer, pathLen size) Errno
+
+//go:wasmimport wasi_snapshot_preview1 path_rename
+//go:noescape
+func path_rename(oldFd int32, oldPath unsafe.Pointer, oldPathLen size, newFd int32, newPath unsafe.Pointer, newPathLen size) Errno
+
+//go:wasmimport wasi_snapshot_preview1 path_symlink
+//go:noescape
+func path_symlink(oldPath unsafe.Pointer, oldPathLen size, fd int32, newPath unsafe.Pointer, newPathLen size) Errno
+
+//go:wasmimport wasi_snapshot_preview1 path_unlink_file
+//go:noescape
+func path_unlink_file(fd int32, path unsafe.Pointer, pathLen size) Errno
+
+//go:wasmimport wasi_snapshot_preview1 path_open
+//go:noescape
+func path_open(rootFD int32, dirflags lookupflags, path unsafe.Pointer, pathLen size, oflags oflags, fsRightsBase rights, fsRightsInheriting rights, fsFlags fdflags, fd unsafe.Pointer) Errno
+
+//go:wasmimport wasi_snapshot_preview1 random_get
+//go:noescape
+func random_get(buf unsafe.Pointer, bufLen size) Errno
+
+// https://github.com/WebAssembly/WASI/blob/a2b96e81c0586125cc4dc79a5be0b78d9a059925/legacy/preview1/docs.md#-fdstat-record
+// fdflags must be at offset 2, hence the uint16 type rather than the
+// fdflags (uint32) type.
+type fdstat struct {
+	filetype         filetype
+	fdflags          uint16
+	rightsBase       rights
+	rightsInheriting rights
+}
+
+//go:wasmimport wasi_snapshot_preview1 fd_fdstat_get
+//go:noescape
+func fd_fdstat_get(fd int32, buf unsafe.Pointer) Errno
+
+//go:wasmimport wasi_snapshot_preview1 fd_fdstat_set_flags
+//go:noescape
+func fd_fdstat_set_flags(fd int32, flags fdflags) Errno
+
+func fd_fdstat_get_flags(fd int) (uint32, error) {
+	var stat fdstat
+	errno := fd_fdstat_get(int32(fd), unsafe.Pointer(&stat))
+	return uint32(stat.fdflags), errnoErr(errno)
+}
+
+func fd_fdstat_get_type(fd int) (uint8, error) {
+	var stat fdstat
+	errno := fd_fdstat_get(int32(fd), unsafe.Pointer(&stat))
+	return stat.filetype, errnoErr(errno)
+}
+
+type preopentype = uint8
+
+const (
+	preopentypeDir preopentype = iota
+)
+
+type prestatDir struct {
+	prNameLen size
+}
+
+type prestat struct {
+	typ preopentype
+	dir prestatDir
+}
+
+//go:wasmimport wasi_snapshot_preview1 fd_prestat_get
+//go:noescape
+func fd_prestat_get(fd int32, prestat unsafe.Pointer) Errno
+
+//go:wasmimport wasi_snapshot_preview1 fd_prestat_dir_name
+//go:noescape
+func fd_prestat_dir_name(fd int32, path unsafe.Pointer, pathLen size) Errno
+
+type opendir struct {
+	fd   int32
+	name string
+}
+
+// List of preopen directories that were exposed by the runtime. The first one
+// is assumed to the be root directory of the file system, and others are seen
+// as mount points at sub paths of the root.
+var preopens []opendir
+
+// Current working directory. We maintain this as a string and resolve paths in
+// the code because wasmtime does not allow relative path lookups outside of the
+// scope of a directory; a previous approach we tried consisted in maintaining
+// open a file descriptor to the current directory so we could perform relative
+// path lookups from that location, but it resulted in breaking path resolution
+// from the current directory to its parent.
+var cwd string
+
+func init() {
+	dirNameBuf := make([]byte, 256)
+	// We start looking for preopens at fd=3 because 0, 1, and 2 are reserved
+	// for standard input and outputs.
+	for preopenFd := int32(3); ; preopenFd++ {
+		var prestat prestat
+
+		errno := fd_prestat_get(preopenFd, unsafe.Pointer(&prestat))
+		if errno == EBADF {
+			break
+		}
+		if errno == ENOTDIR || prestat.typ != preopentypeDir {
+			continue
+		}
+		if errno != 0 {
+			panic("fd_prestat: " + errno.Error())
+		}
+		if int(prestat.dir.prNameLen) > len(dirNameBuf) {
+			dirNameBuf = make([]byte, prestat.dir.prNameLen)
+		}
+
+		errno = fd_prestat_dir_name(preopenFd, unsafe.Pointer(&dirNameBuf[0]), prestat.dir.prNameLen)
+		if errno != 0 {
+			panic("fd_prestat_dir_name: " + errno.Error())
+		}
+
+		preopens = append(preopens, opendir{
+			fd:   preopenFd,
+			name: string(dirNameBuf[:prestat.dir.prNameLen]),
+		})
+	}
+
+	if cwd, _ = Getenv("PWD"); cwd != "" {
+		cwd = joinPath("/", cwd)
+	} else if len(preopens) > 0 {
+		cwd = preopens[0].name
+	}
+}
+
+// Provided by package runtime.
+func now() (sec int64, nsec int32)
+
+//go:nosplit
+func appendCleanPath(buf []byte, path string, lookupParent bool) ([]byte, bool) {
+	i := 0
+	for i < len(path) {
+		for i < len(path) && path[i] == '/' {
+			i++
+		}
+
+		j := i
+		for j < len(path) && path[j] != '/' {
+			j++
+		}
+
+		s := path[i:j]
+		i = j
+
+		switch s {
+		case "":
+			continue
+		case ".":
+			continue
+		case "..":
+			if !lookupParent {
+				k := len(buf)
+				for k > 0 && buf[k-1] != '/' {
+					k--
+				}
+				for k > 1 && buf[k-1] == '/' {
+					k--
+				}
+				buf = buf[:k]
+				if k == 0 {
+					lookupParent = true
+				} else {
+					s = ""
+					continue
+				}
+			}
+		default:
+			lookupParent = false
+		}
+
+		if len(buf) > 0 && buf[len(buf)-1] != '/' {
+			buf = append(buf, '/')
+		}
+		buf = append(buf, s...)
+	}
+	return buf, lookupParent
+}
+
+// joinPath concatenates dir and file paths, producing a cleaned path where
+// "." and ".." have been removed, unless dir is relative and the references
+// to parent directories in file represented a location relative to a parent
+// of dir.
+//
+// This function is used for path resolution of all wasi functions expecting
+// a path argument; the returned string is heap allocated, which we may want
+// to optimize in the future. Instead of returning a string, the function
+// could append the result to an output buffer that the functions in this
+// file can manage to have allocated on the stack (e.g. initializing to a
+// fixed capacity). Since it will significantly increase code complexity,
+// we prefer to optimize for readability and maintainability at this time.
+func joinPath(dir, file string) string {
+	buf := make([]byte, 0, len(dir)+len(file)+1)
+	if isAbs(dir) {
+		buf = append(buf, '/')
+	}
+	buf, lookupParent := appendCleanPath(buf, dir, false)
+	buf, _ = appendCleanPath(buf, file, lookupParent)
+	// The appendCleanPath function cleans the path so it does not inject
+	// references to the current directory. If both the dir and file args
+	// were ".", this results in the output buffer being empty so we handle
+	// this condition here.
+	if len(buf) == 0 {
+		buf = append(buf, '.')
+	}
+	// If the file ended with a '/' we make sure that the output also ends
+	// with a '/'. This is needed to ensure that programs have a mechanism
+	// to represent dereferencing symbolic links pointing to directories.
+	if buf[len(buf)-1] != '/' && isDir(file) {
+		buf = append(buf, '/')
+	}
+	return unsafe.String(&buf[0], len(buf))
+}
+
+func isAbs(path string) bool {
+	return hasPrefix(path, "/")
+}
+
+func isDir(path string) bool {
+	return hasSuffix(path, "/")
+}
+
+func hasPrefix(s, p string) bool {
+	return len(s) >= len(p) && s[:len(p)] == p
+}
+
+func hasSuffix(s, x string) bool {
+	return len(s) >= len(x) && s[len(s)-len(x):] == x
+}
+
+// preparePath returns the preopen file descriptor of the directory to perform
+// path resolution from, along with the pair of pointer and length for the
+// relative expression of path from the directory.
+//
+// If the path argument is not absolute, it is first appended to the current
+// working directory before resolution.
+func preparePath(path string) (int32, unsafe.Pointer, size) {
+	var dirFd = int32(-1)
+	var dirName string
+
+	dir := "/"
+	if !isAbs(path) {
+		dir = cwd
+	}
+	path = joinPath(dir, path)
+
+	for _, p := range preopens {
+		if len(p.name) > len(dirName) && hasPrefix(path, p.name) {
+			dirFd, dirName = p.fd, p.name
+		}
+	}
+
+	path = path[len(dirName):]
+	for isAbs(path) {
+		path = path[1:]
+	}
+	if len(path) == 0 {
+		path = "."
+	}
+
+	return dirFd, stringPointer(path), size(len(path))
+}
+
+func Open(path string, openmode int, perm uint32) (int, error) {
+	if path == "" {
+		return -1, EINVAL
+	}
+	dirFd, pathPtr, pathLen := preparePath(path)
+
+	var oflags oflags
+	if (openmode & O_CREATE) != 0 {
+		oflags |= OFLAG_CREATE
+	}
+	if (openmode & O_TRUNC) != 0 {
+		oflags |= OFLAG_TRUNC
+	}
+	if (openmode & O_EXCL) != 0 {
+		oflags |= OFLAG_EXCL
+	}
+
+	var rights rights
+	switch openmode & (O_RDONLY | O_WRONLY | O_RDWR) {
+	case O_RDONLY:
+		rights = fileRights & ^writeRights
+	case O_WRONLY:
+		rights = fileRights & ^readRights
+	case O_RDWR:
+		rights = fileRights
+	}
+
+	var fdflags fdflags
+	if (openmode & O_APPEND) != 0 {
+		fdflags |= FDFLAG_APPEND
+	}
+	if (openmode & O_SYNC) != 0 {
+		fdflags |= FDFLAG_SYNC
+	}
+
+	var fd int32
+	errno := path_open(
+		dirFd,
+		LOOKUP_SYMLINK_FOLLOW,
+		pathPtr,
+		pathLen,
+		oflags,
+		rights,
+		fileRights,
+		fdflags,
+		unsafe.Pointer(&fd),
+	)
+	if errno == EISDIR && oflags == 0 && fdflags == 0 && ((rights & writeRights) == 0) {
+		// wasmtime and wasmedge will error if attempting to open a directory
+		// because we are asking for too many rights. However, we cannot
+		// determine ahread of time if the path we are about to open is a
+		// directory, so instead we fallback to a second call to path_open with
+		// a more limited set of rights.
+		//
+		// This approach is subject to a race if the file system is modified
+		// concurrently, so we also inject OFLAG_DIRECTORY to ensure that we do
+		// not accidentally open a file which is not a directory.
+		errno = path_open(
+			dirFd,
+			LOOKUP_SYMLINK_FOLLOW,
+			pathPtr,
+			pathLen,
+			oflags|OFLAG_DIRECTORY,
+			rights&dirRights,
+			fileRights,
+			fdflags,
+			unsafe.Pointer(&fd),
+		)
+	}
+	return int(fd), errnoErr(errno)
+}
+
+func Close(fd int) error {
+	errno := fd_close(int32(fd))
+	return errnoErr(errno)
+}
+
+func CloseOnExec(fd int) {
+	// nothing to do - no exec
+}
+
+func Mkdir(path string, perm uint32) error {
+	if path == "" {
+		return EINVAL
+	}
+	dirFd, pathPtr, pathLen := preparePath(path)
+	errno := path_create_directory(dirFd, pathPtr, pathLen)
+	return errnoErr(errno)
+}
+
+func ReadDir(fd int, buf []byte, cookie dircookie) (int, error) {
+	var nwritten size
+	errno := fd_readdir(int32(fd), unsafe.Pointer(&buf[0]), size(len(buf)), cookie, unsafe.Pointer(&nwritten))
+	return int(nwritten), errnoErr(errno)
+}
+
+type Stat_t struct {
+	Dev      uint64
+	Ino      uint64
+	Filetype uint8
+	Nlink    uint64
+	Size     uint64
+	Atime    uint64
+	Mtime    uint64
+	Ctime    uint64
+
+	Mode int
+
+	// Uid and Gid are always zero on wasip1 platforms
+	Uid uint32
+	Gid uint32
+}
+
+func Stat(path string, st *Stat_t) error {
+	if path == "" {
+		return EINVAL
+	}
+	dirFd, pathPtr, pathLen := preparePath(path)
+	errno := path_filestat_get(dirFd, LOOKUP_SYMLINK_FOLLOW, pathPtr, pathLen, unsafe.Pointer(st))
+	setDefaultMode(st)
+	return errnoErr(errno)
+}
+
+func Lstat(path string, st *Stat_t) error {
+	if path == "" {
+		return EINVAL
+	}
+	dirFd, pathPtr, pathLen := preparePath(path)
+	errno := path_filestat_get(dirFd, 0, pathPtr, pathLen, unsafe.Pointer(st))
+	setDefaultMode(st)
+	return errnoErr(errno)
+}
+
+func Fstat(fd int, st *Stat_t) error {
+	errno := fd_filestat_get(int32(fd), unsafe.Pointer(st))
+	setDefaultMode(st)
+	return errnoErr(errno)
+}
+
+func setDefaultMode(st *Stat_t) {
+	// WASI does not support unix-like permissions, but Go programs are likely
+	// to expect the permission bits to not be zero so we set defaults to help
+	// avoid breaking applications that are migrating to WASM.
+	if st.Filetype == FILETYPE_DIRECTORY {
+		st.Mode = 0700
+	} else {
+		st.Mode = 0600
+	}
+}
+
+func Unlink(path string) error {
+	if path == "" {
+		return EINVAL
+	}
+	dirFd, pathPtr, pathLen := preparePath(path)
+	errno := path_unlink_file(dirFd, pathPtr, pathLen)
+	return errnoErr(errno)
+}
+
+func Rmdir(path string) error {
+	if path == "" {
+		return EINVAL
+	}
+	dirFd, pathPtr, pathLen := preparePath(path)
+	errno := path_remove_directory(dirFd, pathPtr, pathLen)
+	return errnoErr(errno)
+}
+
+func Chmod(path string, mode uint32) error {
+	var stat Stat_t
+	return Stat(path, &stat)
+}
+
+func Fchmod(fd int, mode uint32) error {
+	var stat Stat_t
+	return Fstat(fd, &stat)
+}
+
+func Chown(path string, uid, gid int) error {
+	return ENOSYS
+}
+
+func Fchown(fd int, uid, gid int) error {
+	return ENOSYS
+}
+
+func Lchown(path string, uid, gid int) error {
+	return ENOSYS
+}
+
+func UtimesNano(path string, ts []Timespec) error {
+	// UTIME_OMIT value must match internal/syscall/unix/at_wasip1.go
+	const UTIME_OMIT = -0x2
+	if path == "" {
+		return EINVAL
+	}
+	dirFd, pathPtr, pathLen := preparePath(path)
+	atime := TimespecToNsec(ts[0])
+	mtime := TimespecToNsec(ts[1])
+	if ts[0].Nsec == UTIME_OMIT || ts[1].Nsec == UTIME_OMIT {
+		var st Stat_t
+		if err := Stat(path, &st); err != nil {
+			return err
+		}
+		if ts[0].Nsec == UTIME_OMIT {
+			atime = int64(st.Atime)
+		}
+		if ts[1].Nsec == UTIME_OMIT {
+			mtime = int64(st.Mtime)
+		}
+	}
+	errno := path_filestat_set_times(
+		dirFd,
+		LOOKUP_SYMLINK_FOLLOW,
+		pathPtr,
+		pathLen,
+		timestamp(atime),
+		timestamp(mtime),
+		FILESTAT_SET_ATIM|FILESTAT_SET_MTIM,
+	)
+	return errnoErr(errno)
+}
+
+func Rename(from, to string) error {
+	if from == "" || to == "" {
+		return EINVAL
+	}
+	oldDirFd, oldPathPtr, oldPathLen := preparePath(from)
+	newDirFd, newPathPtr, newPathLen := preparePath(to)
+	errno := path_rename(
+		oldDirFd,
+		oldPathPtr,
+		oldPathLen,
+		newDirFd,
+		newPathPtr,
+		newPathLen,
+	)
+	return errnoErr(errno)
+}
+
+func Truncate(path string, length int64) error {
+	if path == "" {
+		return EINVAL
+	}
+	fd, err := Open(path, O_WRONLY, 0)
+	if err != nil {
+		return err
+	}
+	defer Close(fd)
+	return Ftruncate(fd, length)
+}
+
+func Ftruncate(fd int, length int64) error {
+	errno := fd_filestat_set_size(int32(fd), filesize(length))
+	return errnoErr(errno)
+}
+
+const ImplementsGetwd = true
+
+func Getwd() (string, error) {
+	return cwd, nil
+}
+
+func Chdir(path string) error {
+	if path == "" {
+		return EINVAL
+	}
+
+	dir := "/"
+	if !isAbs(path) {
+		dir = cwd
+	}
+	path = joinPath(dir, path)
+
+	var stat Stat_t
+	dirFd, pathPtr, pathLen := preparePath(path)
+	errno := path_filestat_get(dirFd, LOOKUP_SYMLINK_FOLLOW, pathPtr, pathLen, unsafe.Pointer(&stat))
+	if errno != 0 {
+		return errnoErr(errno)
+	}
+	if stat.Filetype != FILETYPE_DIRECTORY {
+		return ENOTDIR
+	}
+	cwd = path
+	return nil
+}
+
+func Readlink(path string, buf []byte) (n int, err error) {
+	if path == "" {
+		return 0, EINVAL
+	}
+	if len(buf) == 0 {
+		return 0, nil
+	}
+	dirFd, pathPtr, pathLen := preparePath(path)
+	var nwritten size
+	errno := path_readlink(
+		dirFd,
+		pathPtr,
+		pathLen,
+		unsafe.Pointer(&buf[0]),
+		size(len(buf)),
+		unsafe.Pointer(&nwritten),
+	)
+	// For some reason wasmtime returns ERANGE when the output buffer is
+	// shorter than the symbolic link value. os.Readlink expects a nil
+	// error and uses the fact that n is greater or equal to the buffer
+	// length to assume that it needs to try again with a larger size.
+	// This condition is handled in os.Readlink.
+	return int(nwritten), errnoErr(errno)
+}
+
+func Link(path, link string) error {
+	if path == "" || link == "" {
+		return EINVAL
+	}
+	oldDirFd, oldPathPtr, oldPathLen := preparePath(path)
+	newDirFd, newPathPtr, newPathLen := preparePath(link)
+	errno := path_link(
+		oldDirFd,
+		0,
+		oldPathPtr,
+		oldPathLen,
+		newDirFd,
+		newPathPtr,
+		newPathLen,
+	)
+	return errnoErr(errno)
+}
+
+func Symlink(path, link string) error {
+	if path == "" || link == "" {
+		return EINVAL
+	}
+	dirFd, pathPtr, pathlen := preparePath(link)
+	errno := path_symlink(
+		stringPointer(path),
+		size(len(path)),
+		dirFd,
+		pathPtr,
+		pathlen,
+	)
+	return errnoErr(errno)
+}
+
+func Fsync(fd int) error {
+	errno := fd_sync(int32(fd))
+	return errnoErr(errno)
+}
+
+func bytesPointer(b []byte) unsafe.Pointer {
+	return unsafe.Pointer(unsafe.SliceData(b))
+}
+
+func stringPointer(s string) unsafe.Pointer {
+	return unsafe.Pointer(unsafe.StringData(s))
+}
+
+func makeIOVec(b []byte) unsafe.Pointer {
+	return unsafe.Pointer(&iovec{
+		buf:    uintptr32(uintptr(bytesPointer(b))),
+		bufLen: size(len(b)),
+	})
+}
+
+func Read(fd int, b []byte) (int, error) {
+	var nread size
+	errno := fd_read(int32(fd), makeIOVec(b), 1, unsafe.Pointer(&nread))
+	runtime.KeepAlive(b)
+	return int(nread), errnoErr(errno)
+}
+
+func Write(fd int, b []byte) (int, error) {
+	var nwritten size
+	errno := fd_write(int32(fd), makeIOVec(b), 1, unsafe.Pointer(&nwritten))
+	runtime.KeepAlive(b)
+	return int(nwritten), errnoErr(errno)
+}
+
+func Pread(fd int, b []byte, offset int64) (int, error) {
+	var nread size
+	errno := fd_pread(int32(fd), makeIOVec(b), 1, filesize(offset), unsafe.Pointer(&nread))
+	runtime.KeepAlive(b)
+	return int(nread), errnoErr(errno)
+}
+
+func Pwrite(fd int, b []byte, offset int64) (int, error) {
+	var nwritten size
+	errno := fd_pwrite(int32(fd), makeIOVec(b), 1, filesize(offset), unsafe.Pointer(&nwritten))
+	runtime.KeepAlive(b)
+	return int(nwritten), errnoErr(errno)
+}
+
+func Seek(fd int, offset int64, whence int) (int64, error) {
+	var newoffset filesize
+	errno := fd_seek(int32(fd), filedelta(offset), uint32(whence), unsafe.Pointer(&newoffset))
+	return int64(newoffset), errnoErr(errno)
+}
+
+func Dup(fd int) (int, error) {
+	return 0, ENOSYS
+}
+
+func Dup2(fd, newfd int) error {
+	return ENOSYS
+}
+
+func Pipe(fd []int) error {
+	return ENOSYS
+}
+
+func RandomGet(b []byte) error {
+	errno := random_get(bytesPointer(b), size(len(b)))
+	return errnoErr(errno)
+}
diff --git a/src/syscall/fs_wasip1_test.go b/src/syscall/fs_wasip1_test.go
new file mode 100644
index 0000000..f27e6a8
--- /dev/null
+++ b/src/syscall/fs_wasip1_test.go
@@ -0,0 +1,76 @@
+// Copyright 2023 The Go 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:build wasip1
+
+package syscall_test
+
+import (
+	"syscall"
+	"testing"
+)
+
+var joinPathTests = [...]struct {
+	dir, file, path string
+}{
+	0:  {".", ".", "."},
+	1:  {"./", "./", "./"},
+	2:  {"././././", ".", "."},
+	3:  {".", "./././", "./"},
+	4:  {".", "a", "a"},
+	5:  {".", "a/b", "a/b"},
+	6:  {".", "..", ".."},
+	7:  {".", "../", "../"},
+	8:  {".", "../../", "../../"},
+	9:  {".", "../..", "../.."},
+	10: {".", "../..//..///", "../../../"},
+	11: {"/", "/", "/"},
+	12: {"/", "a", "/a"},
+	13: {"/", "a/b", "/a/b"},
+	14: {"/a", "b", "/a/b"},
+	15: {"/", ".", "/"},
+	16: {"/", "..", "/"},
+	17: {"/", "../../", "/"},
+	18: {"/", "/../a/b/c", "/a/b/c"},
+	19: {"/", "/../a/b/c", "/a/b/c"},
+	20: {"/", "./hello/world", "/hello/world"},
+	21: {"/a", "../", "/"},
+	22: {"/a/b/c", "..", "/a/b"},
+	23: {"/a/b/c", "..///..///", "/a/"},
+	24: {"/a/b/c", "..///..///..", "/"},
+	25: {"/a/b/c", "..///..///..///..", "/"},
+	26: {"/a/b/c", "..///..///..///..///..", "/"},
+	27: {"/a/b/c/", "/d/e/f/", "/a/b/c/d/e/f/"},
+	28: {"a/b/c/", ".", "a/b/c"},
+	29: {"a/b/c/", "./d", "a/b/c/d"},
+	30: {"a/b/c/", "./d/", "a/b/c/d/"},
+	31: {"a/b/", "./c/d/", "a/b/c/d/"},
+	32: {"../", "..", "../.."},
+	33: {"a/b/c/d", "e/../..", "a/b/c"},
+	34: {"a/b/c/d", "./e/../..", "a/b/c"},
+	35: {"a/b/c/d", "./e/..//../../f/g//", "a/b/f/g/"},
+	36: {"../../../", "a/../../b/c", "../../b/c"},
+	37: {"/a/b/c", "/.././/hey!", "/a/b/hey!"},
+}
+
+func TestJoinPath(t *testing.T) {
+	for _, test := range joinPathTests {
+		t.Run("", func(t *testing.T) {
+			path := syscall.JoinPath(test.dir, test.file)
+			if path != test.path {
+				t.Errorf("join(%q,%q): want=%q got=%q", test.dir, test.file, test.path, path)
+			}
+		})
+	}
+}
+
+func BenchmarkJoinPath(b *testing.B) {
+	for _, test := range joinPathTests {
+		b.Run("", func(b *testing.B) {
+			for i := 0; i < b.N; i++ {
+				syscall.JoinPath(test.dir, test.file)
+			}
+		})
+	}
+}
diff --git a/src/syscall/js/func.go b/src/syscall/js/func.go
index cc94972..53a4d79 100644
--- a/src/syscall/js/func.go
+++ b/src/syscall/js/func.go
@@ -60,16 +60,19 @@
 }
 
 // setEventHandler is defined in the runtime package.
-func setEventHandler(fn func())
+func setEventHandler(fn func() bool)
 
 func init() {
 	setEventHandler(handleEvent)
 }
 
-func handleEvent() {
+// handleEvent retrieves the pending event (window._pendingEvent) and calls the js.Func on it.
+// It returns true if an event was handled.
+func handleEvent() bool {
+	// Retrieve the event from js
 	cb := jsGo.Get("_pendingEvent")
 	if cb.IsNull() {
-		return
+		return false
 	}
 	jsGo.Set("_pendingEvent", Null())
 
@@ -77,14 +80,17 @@
 	if id == 0 { // zero indicates deadlock
 		select {}
 	}
+
+	// Retrieve the associated js.Func
 	funcsMu.Lock()
 	f, ok := funcs[id]
 	funcsMu.Unlock()
 	if !ok {
 		Global().Get("console").Call("error", "call to released function")
-		return
+		return true
 	}
 
+	// Call the js.Func with arguments
 	this := cb.Get("this")
 	argsObj := cb.Get("args")
 	args := make([]Value, argsObj.Length())
@@ -92,5 +98,8 @@
 		args[i] = argsObj.Index(i)
 	}
 	result := f(this, args)
+
+	// Return the result to js
 	cb.Set("result", result)
+	return true
 }
diff --git a/src/syscall/js/js.go b/src/syscall/js/js.go
index 2f4f5ad..2515b4f 100644
--- a/src/syscall/js/js.go
+++ b/src/syscall/js/js.go
@@ -58,6 +58,7 @@
 	return Value{ref: r, gcPtr: gcPtr}
 }
 
+//go:wasmimport gojs syscall/js.finalizeRef
 func finalizeRef(r ref)
 
 func predefValue(id uint32, typeFlag byte) Value {
@@ -209,6 +210,7 @@
 	}
 }
 
+//go:wasmimport gojs syscall/js.stringVal
 func stringVal(x string) ref
 
 // Type represents the JavaScript type of a Value.
@@ -292,6 +294,7 @@
 	return r
 }
 
+//go:wasmimport gojs syscall/js.valueGet
 func valueGet(v ref, p string) ref
 
 // Set sets the JavaScript property p of value v to ValueOf(x).
@@ -306,6 +309,7 @@
 	runtime.KeepAlive(xv)
 }
 
+//go:wasmimport gojs syscall/js.valueSet
 func valueSet(v ref, p string, x ref)
 
 // Delete deletes the JavaScript property p of value v.
@@ -318,6 +322,7 @@
 	runtime.KeepAlive(v)
 }
 
+//go:wasmimport gojs syscall/js.valueDelete
 func valueDelete(v ref, p string)
 
 // Index returns JavaScript index i of value v.
@@ -331,6 +336,7 @@
 	return r
 }
 
+//go:wasmimport gojs syscall/js.valueIndex
 func valueIndex(v ref, i int) ref
 
 // SetIndex sets the JavaScript index i of value v to ValueOf(x).
@@ -345,6 +351,7 @@
 	runtime.KeepAlive(xv)
 }
 
+//go:wasmimport gojs syscall/js.valueSetIndex
 func valueSetIndex(v ref, i int, x ref)
 
 func makeArgs(args []any) ([]Value, []ref) {
@@ -369,6 +376,7 @@
 	return r
 }
 
+//go:wasmimport gojs syscall/js.valueLength
 func valueLength(v ref) int
 
 // Call does a JavaScript call to the method m of value v with the given arguments.
@@ -391,6 +399,8 @@
 	return makeValue(res)
 }
 
+//go:wasmimport gojs syscall/js.valueCall
+//go:nosplit
 func valueCall(v ref, m string, args []ref) (ref, bool)
 
 // Invoke does a JavaScript call of the value v with the given arguments.
@@ -410,6 +420,7 @@
 	return makeValue(res)
 }
 
+//go:wasmimport gojs syscall/js.valueInvoke
 func valueInvoke(v ref, args []ref) (ref, bool)
 
 // New uses JavaScript's "new" operator with value v as constructor and the given arguments.
@@ -429,6 +440,7 @@
 	return makeValue(res)
 }
 
+//go:wasmimport gojs syscall/js.valueNew
 func valueNew(v ref, args []ref) (ref, bool)
 
 func (v Value) isNumber() bool {
@@ -528,8 +540,10 @@
 	return string(b)
 }
 
+//go:wasmimport gojs syscall/js.valuePrepareString
 func valuePrepareString(v ref) (ref, int)
 
+//go:wasmimport gojs syscall/js.valueLoadString
 func valueLoadString(v ref, b []byte)
 
 // InstanceOf reports whether v is an instance of type t according to JavaScript's instanceof operator.
@@ -540,6 +554,7 @@
 	return r
 }
 
+//go:wasmimport gojs syscall/js.valueInstanceOf
 func valueInstanceOf(v ref, t ref) bool
 
 // A ValueError occurs when a Value method is invoked on
@@ -555,7 +570,7 @@
 }
 
 // CopyBytesToGo copies bytes from src to dst.
-// It panics if src is not an Uint8Array or Uint8ClampedArray.
+// It panics if src is not a Uint8Array or Uint8ClampedArray.
 // It returns the number of bytes copied, which will be the minimum of the lengths of src and dst.
 func CopyBytesToGo(dst []byte, src Value) int {
 	n, ok := copyBytesToGo(dst, src.ref)
@@ -566,10 +581,11 @@
 	return n
 }
 
+//go:wasmimport gojs syscall/js.copyBytesToGo
 func copyBytesToGo(dst []byte, src ref) (int, bool)
 
 // CopyBytesToJS copies bytes from src to dst.
-// It panics if dst is not an Uint8Array or Uint8ClampedArray.
+// It panics if dst is not a Uint8Array or Uint8ClampedArray.
 // It returns the number of bytes copied, which will be the minimum of the lengths of src and dst.
 func CopyBytesToJS(dst Value, src []byte) int {
 	n, ok := copyBytesToJS(dst.ref, src)
@@ -580,4 +596,5 @@
 	return n
 }
 
+//go:wasmimport gojs syscall/js.copyBytesToJS
 func copyBytesToJS(dst ref, src []byte) (int, bool)
diff --git a/src/syscall/js/js_js.s b/src/syscall/js/js_js.s
index 47ad6b8..abdccc9 100644
--- a/src/syscall/js/js_js.s
+++ b/src/syscall/js/js_js.s
@@ -2,68 +2,6 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-#include "textflag.h"
-
-TEXT ·finalizeRef(SB), NOSPLIT, $0
-  CallImport
-  RET
-
-TEXT ·stringVal(SB), NOSPLIT, $0
-  CallImport
-  RET
-
-TEXT ·valueGet(SB), NOSPLIT, $0
-  CallImport
-  RET
-
-TEXT ·valueSet(SB), NOSPLIT, $0
-  CallImport
-  RET
-
-TEXT ·valueDelete(SB), NOSPLIT, $0
-  CallImport
-  RET
-
-TEXT ·valueIndex(SB), NOSPLIT, $0
-  CallImport
-  RET
-
-TEXT ·valueSetIndex(SB), NOSPLIT, $0
-  CallImport
-  RET
-
-TEXT ·valueCall(SB), NOSPLIT, $0
-  CallImport
-  RET
-
-TEXT ·valueInvoke(SB), NOSPLIT, $0
-  CallImport
-  RET
-
-TEXT ·valueNew(SB), NOSPLIT, $0
-  CallImport
-  RET
-
-TEXT ·valueLength(SB), NOSPLIT, $0
-  CallImport
-  RET
-
-TEXT ·valuePrepareString(SB), NOSPLIT, $0
-  CallImport
-  RET
-
-TEXT ·valueLoadString(SB), NOSPLIT, $0
-  CallImport
-  RET
-
-TEXT ·valueInstanceOf(SB), NOSPLIT, $0
-  CallImport
-  RET
-
-TEXT ·copyBytesToGo(SB), NOSPLIT, $0
-  CallImport
-  RET
-
-TEXT ·copyBytesToJS(SB), NOSPLIT, $0
-  CallImport
-  RET
+// The runtime package uses //go:linkname to push the setEventHandler to this
+// package.  To prevent the go tool from passing -complete to the compile tool,
+// this file must remain stubbed out.
diff --git a/src/syscall/js/js_test.go b/src/syscall/js/js_test.go
index f860a5b..8823421 100644
--- a/src/syscall/js/js_test.go
+++ b/src/syscall/js/js_test.go
@@ -44,6 +44,18 @@
 	objBooleanFalse: new Boolean(false),
 })`)
 
+//go:wasmimport _gotest add
+func testAdd(uint32, uint32) uint32
+
+func TestWasmImport(t *testing.T) {
+	a := uint32(3)
+	b := uint32(5)
+	want := a + b
+	if got := testAdd(a, b); got != want {
+		t.Errorf("got %v, want %v", got, want)
+	}
+}
+
 func TestBool(t *testing.T) {
 	want := true
 	o := dummys.Get("someBool")
diff --git a/src/syscall/mkpost.go b/src/syscall/mkpost.go
index 4f81b81..48d3511 100644
--- a/src/syscall/mkpost.go
+++ b/src/syscall/mkpost.go
@@ -40,15 +40,21 @@
 		re = regexp.MustCompile("Pad_cgo[A-Za-z0-9_]*")
 		s = re.ReplaceAllString(s, "_")
 
-		// We want to keep X__val in Fsid. Hide it and restore it later.
+		// We want to keep the X_ fields that are already consistently exported
+		// for the other linux GOARCH settings.
+		// Hide them and restore later.
 		s = strings.Replace(s, "X__val", "MKPOSTFSIDVAL", 1)
+		s = strings.Replace(s, "X__ifi_pad", "MKPOSTIFIPAD", 1)
+		s = strings.Replace(s, "X_f", "MKPOSTSYSINFOTF", 1)
 
 		// Replace other unwanted fields with blank identifiers.
 		re = regexp.MustCompile("X_[A-Za-z0-9_]*")
 		s = re.ReplaceAllString(s, "_")
 
-		// Restore X__val in Fsid.
+		// Restore preserved fields.
 		s = strings.Replace(s, "MKPOSTFSIDVAL", "X__val", 1)
+		s = strings.Replace(s, "MKPOSTIFIPAD", "X__ifi_pad", 1)
+		s = strings.Replace(s, "MKPOSTSYSINFOTF", "X_f", 1)
 
 		// Force the type of RawSockaddr.Data to [14]int8 to match
 		// the existing gccgo API.
diff --git a/src/syscall/mksyscall.pl b/src/syscall/mksyscall.pl
index 25ab911..075eb1f 100755
--- a/src/syscall/mksyscall.pl
+++ b/src/syscall/mksyscall.pl
@@ -137,7 +137,7 @@
 	# without reading the header.
 	$text .= "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n";
 
-	if (($darwin && $func eq "ptrace1") || (($openbsd && $libc) && $func eq "ptrace")) {
+	if (($darwin && $func =~ /^ptrace1(Ptr)?$/) || (($openbsd && $libc) && $func =~ /^ptrace(Ptr)?$/)) {
 		# The ptrace function is called from forkAndExecInChild where stack
 		# growth is forbidden.
 		$text .= "//go:nosplit\n"
diff --git a/src/syscall/mksyscall_libc.pl b/src/syscall/mksyscall_libc.pl
index 3731476..3746c1e 100755
--- a/src/syscall/mksyscall_libc.pl
+++ b/src/syscall/mksyscall_libc.pl
@@ -145,11 +145,13 @@
 	$sysname =~ y/A-Z/a-z/; # All libc functions are lowercase.
 
 	# Runtime import of function to allow cross-platform builds.
-	$dynimports .= "//go:cgo_import_dynamic ${sysvarname} ${sysname} \"$modname\"\n";
-	# Link symbol to proc address variable.
-	$linknames .= "//go:linkname ${sysvarname} ${sysvarname}\n";
-	# Library proc address variable.
-	push @vars, $sysvarname;
+	if($dynimports !~ /\s+${sysvarname}\s+/) {
+		$dynimports .= "//go:cgo_import_dynamic ${sysvarname} ${sysname} \"$modname\"\n";
+		# Link symbol to proc address variable.
+		$linknames .= "//go:linkname ${sysvarname} ${sysvarname}\n";
+		# Library proc address variable.
+		push @vars, $sysvarname;
+	}
 
 	# Go function header.
 	$out = join(', ', @out);
diff --git a/src/syscall/net_fake.go b/src/syscall/net_fake.go
new file mode 100644
index 0000000..689f6f8
--- /dev/null
+++ b/src/syscall/net_fake.go
@@ -0,0 +1,63 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Fake networking for js/wasm and wasip1/wasm.
+// This file only exists to make the compiler happy.
+
+//go:build (js && wasm) || wasip1
+
+package syscall
+
+const (
+	AF_UNSPEC = iota
+	AF_UNIX
+	AF_INET
+	AF_INET6
+)
+
+const (
+	SOCK_STREAM = 1 + iota
+	SOCK_DGRAM
+	SOCK_RAW
+	SOCK_SEQPACKET
+)
+
+const (
+	IPPROTO_IP   = 0
+	IPPROTO_IPV4 = 4
+	IPPROTO_IPV6 = 0x29
+	IPPROTO_TCP  = 6
+	IPPROTO_UDP  = 0x11
+)
+
+const (
+	_ = iota
+	IPV6_V6ONLY
+	SOMAXCONN
+	SO_ERROR
+)
+
+// Misc constants expected by package net but not supported.
+const (
+	_ = iota
+	F_DUPFD_CLOEXEC
+	SYS_FCNTL = 500 // unsupported
+)
+
+type Sockaddr any
+
+type SockaddrInet4 struct {
+	Port int
+	Addr [4]byte
+}
+
+type SockaddrInet6 struct {
+	Port   int
+	ZoneId uint32
+	Addr   [16]byte
+}
+
+type SockaddrUnix struct {
+	Name string
+}
diff --git a/src/syscall/net_js.go b/src/syscall/net_js.go
index 2ed4e19..cba33df 100644
--- a/src/syscall/net_js.go
+++ b/src/syscall/net_js.go
@@ -2,66 +2,10 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// js/wasm uses fake networking directly implemented in the net package.
-// This file only exists to make the compiler happy.
-
 //go:build js && wasm
 
 package syscall
 
-const (
-	AF_UNSPEC = iota
-	AF_UNIX
-	AF_INET
-	AF_INET6
-)
-
-const (
-	SOCK_STREAM = 1 + iota
-	SOCK_DGRAM
-	SOCK_RAW
-	SOCK_SEQPACKET
-)
-
-const (
-	IPPROTO_IP   = 0
-	IPPROTO_IPV4 = 4
-	IPPROTO_IPV6 = 0x29
-	IPPROTO_TCP  = 6
-	IPPROTO_UDP  = 0x11
-)
-
-const (
-	_ = iota
-	IPV6_V6ONLY
-	SOMAXCONN
-	SO_ERROR
-)
-
-// Misc constants expected by package net but not supported.
-const (
-	_ = iota
-	F_DUPFD_CLOEXEC
-	SYS_FCNTL = 500 // unsupported
-)
-
-type Sockaddr any
-
-type SockaddrInet4 struct {
-	Port int
-	Addr [4]byte
-}
-
-type SockaddrInet6 struct {
-	Port   int
-	ZoneId uint32
-	Addr   [16]byte
-}
-
-type SockaddrUnix struct {
-	Name string
-}
-
 func Socket(proto, sotype, unused int) (fd int, err error) {
 	return 0, ENOSYS
 }
diff --git a/src/syscall/net_wasip1.go b/src/syscall/net_wasip1.go
new file mode 100644
index 0000000..3918840
--- /dev/null
+++ b/src/syscall/net_wasip1.go
@@ -0,0 +1,88 @@
+// Copyright 2023 The Go 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:build wasip1
+
+package syscall
+
+import "unsafe"
+
+const (
+	SHUT_RD   = 0x1
+	SHUT_WR   = 0x2
+	SHUT_RDWR = SHUT_RD | SHUT_WR
+)
+
+type sdflags = uint32
+
+//go:wasmimport wasi_snapshot_preview1 sock_accept
+//go:noescape
+func sock_accept(fd int32, flags fdflags, newfd unsafe.Pointer) Errno
+
+//go:wasmimport wasi_snapshot_preview1 sock_shutdown
+//go:noescape
+func sock_shutdown(fd int32, flags sdflags) Errno
+
+func Socket(proto, sotype, unused int) (fd int, err error) {
+	return 0, ENOSYS
+}
+
+func Bind(fd int, sa Sockaddr) error {
+	return ENOSYS
+}
+
+func StopIO(fd int) error {
+	return ENOSYS
+}
+
+func Listen(fd int, backlog int) error {
+	return ENOSYS
+}
+
+func Accept(fd int) (int, Sockaddr, error) {
+	var newfd int32
+	errno := sock_accept(int32(fd), 0, unsafe.Pointer(&newfd))
+	return int(newfd), nil, errnoErr(errno)
+}
+
+func Connect(fd int, sa Sockaddr) error {
+	return ENOSYS
+}
+
+func Recvfrom(fd int, p []byte, flags int) (n int, from Sockaddr, err error) {
+	return 0, nil, ENOSYS
+}
+
+func Sendto(fd int, p []byte, flags int, to Sockaddr) error {
+	return ENOSYS
+}
+
+func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn, recvflags int, from Sockaddr, err error) {
+	return 0, 0, 0, nil, ENOSYS
+}
+
+func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) {
+	return 0, ENOSYS
+}
+
+func GetsockoptInt(fd, level, opt int) (value int, err error) {
+	return 0, ENOSYS
+}
+
+func SetsockoptInt(fd, level, opt int, value int) error {
+	return ENOSYS
+}
+
+func SetReadDeadline(fd int, t int64) error {
+	return ENOSYS
+}
+
+func SetWriteDeadline(fd int, t int64) error {
+	return ENOSYS
+}
+
+func Shutdown(fd int, how int) error {
+	errno := sock_shutdown(int32(fd), sdflags(how))
+	return errnoErr(errno)
+}
diff --git a/src/syscall/netlink_linux.go b/src/syscall/netlink_linux.go
index e976c70..a503a07 100644
--- a/src/syscall/netlink_linux.go
+++ b/src/syscall/netlink_linux.go
@@ -6,7 +6,10 @@
 
 package syscall
 
-import "unsafe"
+import (
+	"sync"
+	"unsafe"
+)
 
 // Round the length of a netlink message up to align it properly.
 func nlmAlignOf(msglen int) int {
@@ -47,6 +50,11 @@
 	return rr.toWireFormat()
 }
 
+var pageBufPool = &sync.Pool{New: func() any {
+	b := make([]byte, Getpagesize())
+	return &b
+}}
+
 // 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) {
@@ -72,10 +80,12 @@
 		return nil, EINVAL
 	}
 	var tab []byte
-	rbNew := make([]byte, Getpagesize())
+
+	rbNew := pageBufPool.Get().(*[]byte)
+	defer pageBufPool.Put(rbNew)
 done:
 	for {
-		rb := rbNew
+		rb := *rbNew
 		nr, _, err := Recvfrom(s, rb, 0)
 		if err != nil {
 			return nil, err
diff --git a/src/syscall/os_wasip1.go b/src/syscall/os_wasip1.go
new file mode 100644
index 0000000..01b46f7
--- /dev/null
+++ b/src/syscall/os_wasip1.go
@@ -0,0 +1,8 @@
+// Copyright 2023 The Go Authors. 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
+
+//go:wasmimport wasi_snapshot_preview1 proc_exit
+func ProcExit(code int32)
diff --git a/src/syscall/ptrace_darwin.go b/src/syscall/ptrace_darwin.go
index 519e451..466f813 100644
--- a/src/syscall/ptrace_darwin.go
+++ b/src/syscall/ptrace_darwin.go
@@ -6,9 +6,16 @@
 
 package syscall
 
+import "unsafe"
+
 // Nosplit because it is called from forkAndExecInChild.
 //
 //go:nosplit
 func ptrace(request int, pid int, addr uintptr, data uintptr) error {
 	return ptrace1(request, pid, addr, data)
 }
+
+//go:nosplit
+func ptracePtr(request int, pid int, addr unsafe.Pointer, data uintptr) error {
+	return ptrace1Ptr(request, pid, addr, data)
+}
diff --git a/src/syscall/ptrace_ios.go b/src/syscall/ptrace_ios.go
index fa8d000..a9b2918 100644
--- a/src/syscall/ptrace_ios.go
+++ b/src/syscall/ptrace_ios.go
@@ -6,9 +6,16 @@
 
 package syscall
 
+import "unsafe"
+
 // Nosplit because it is called from forkAndExecInChild.
 //
 //go:nosplit
 func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) {
 	panic("unimplemented")
 }
+
+//go:nosplit
+func ptracePtr(request int, pid int, addr unsafe.Pointer, data uintptr) (err error) {
+	panic("unimplemented")
+}
diff --git a/src/syscall/pwd_plan9.go b/src/syscall/pwd_plan9.go
index 1deeaa9..28e9956 100644
--- a/src/syscall/pwd_plan9.go
+++ b/src/syscall/pwd_plan9.go
@@ -11,7 +11,10 @@
 
 package syscall
 
-import "sync"
+import (
+	"runtime"
+	"sync"
+)
 
 var (
 	wdmu  sync.Mutex // guards following
@@ -19,6 +22,12 @@
 	wdStr string
 )
 
+// Ensure current working directory seen by this goroutine matches
+// the most recent Chdir called in any goroutine. It's called internally
+// before executing any syscall which uses a relative pathname. Must
+// be called with the goroutine locked to the OS thread, to prevent
+// rescheduling on a different thread (potentially with a different
+// working directory) before the syscall is executed.
 func Fixwd() {
 	wdmu.Lock()
 	defer wdmu.Unlock()
@@ -39,13 +48,17 @@
 	}
 }
 
-func fixwd(paths ...string) {
+// If any of the paths is relative, call Fixwd and return true
+// (locked to OS thread). Otherwise return false.
+func fixwd(paths ...string) bool {
 	for _, path := range paths {
 		if path != "" && path[0] != '/' && path[0] != '#' {
+			runtime.LockOSThread()
 			Fixwd()
-			return
+			return true
 		}
 	}
+	return false
 }
 
 // goroutine-specific getwd
@@ -75,10 +88,15 @@
 }
 
 func Chdir(path string) error {
-	fixwd(path)
+	// If Chdir is to a relative path, sync working dir first
+	if fixwd(path) {
+		defer runtime.UnlockOSThread()
+	}
 	wdmu.Lock()
 	defer wdmu.Unlock()
 
+	runtime.LockOSThread()
+	defer runtime.UnlockOSThread()
 	if err := chdir(path); err != nil {
 		return err
 	}
diff --git a/src/syscall/rlimit.go b/src/syscall/rlimit.go
new file mode 100644
index 0000000..cc7935d
--- /dev/null
+++ b/src/syscall/rlimit.go
@@ -0,0 +1,50 @@
+// Copyright 2022 The Go 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:build unix
+
+package syscall
+
+import (
+	"sync/atomic"
+)
+
+// origRlimitNofile, if not {0, 0}, is the original soft RLIMIT_NOFILE.
+// When we can assume that we are bootstrapping with Go 1.19,
+// this can be atomic.Pointer[Rlimit].
+var origRlimitNofile atomic.Value // of Rlimit
+
+// Some systems set an artificially low soft limit on open file count, for compatibility
+// with code that uses select and its hard-coded maximum file descriptor
+// (limited by the size of fd_set).
+//
+// Go does not use select, so it should not be subject to these limits.
+// On some systems the limit is 256, which is very easy to run into,
+// even in simple programs like gofmt when they parallelize walking
+// a file tree.
+//
+// After a long discussion on go.dev/issue/46279, we decided the
+// best approach was for Go to raise the limit unconditionally for itself,
+// and then leave old software to set the limit back as needed.
+// Code that really wants Go to leave the limit alone can set the hard limit,
+// which Go of course has no choice but to respect.
+func init() {
+	var lim Rlimit
+	if err := Getrlimit(RLIMIT_NOFILE, &lim); err == nil && lim.Cur != lim.Max {
+		origRlimitNofile.Store(lim)
+		lim.Cur = lim.Max
+		adjustFileLimit(&lim)
+		setrlimit(RLIMIT_NOFILE, &lim)
+	}
+}
+
+func Setrlimit(resource int, rlim *Rlimit) error {
+	err := setrlimit(resource, rlim)
+	if err == nil && resource == RLIMIT_NOFILE {
+		// Store zeroes in origRlimitNofile to tell StartProcess
+		// to not adjust the rlimit in the child process.
+		origRlimitNofile.Store(Rlimit{0, 0})
+	}
+	return err
+}
diff --git a/src/syscall/rlimit_darwin.go b/src/syscall/rlimit_darwin.go
new file mode 100644
index 0000000..73e4964
--- /dev/null
+++ b/src/syscall/rlimit_darwin.go
@@ -0,0 +1,20 @@
+// Copyright 2022 The Go 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:build darwin
+
+package syscall
+
+// adjustFileLimit adds per-OS limitations on the Rlimit used for RLIMIT_NOFILE. See rlimit.go.
+func adjustFileLimit(lim *Rlimit) {
+	// On older macOS, setrlimit(RLIMIT_NOFILE, lim) with lim.Cur = infinity fails.
+	// Set to the value of kern.maxfilesperproc instead.
+	n, err := SysctlUint32("kern.maxfilesperproc")
+	if err != nil {
+		return
+	}
+	if lim.Cur > uint64(n) {
+		lim.Cur = uint64(n)
+	}
+}
diff --git a/src/syscall/rlimit_stub.go b/src/syscall/rlimit_stub.go
new file mode 100644
index 0000000..e8f839d
--- /dev/null
+++ b/src/syscall/rlimit_stub.go
@@ -0,0 +1,10 @@
+// Copyright 2022 The Go 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:build aix || dragonfly || freebsd || linux || netbsd || openbsd || solaris
+
+package syscall
+
+// adjustFileLimit adds per-OS limitations on the Rlimit used for RLIMIT_NOFILE. See rlimit.go.
+func adjustFileLimit(lim *Rlimit) {}
diff --git a/src/syscall/rlimit_test.go b/src/syscall/rlimit_test.go
new file mode 100644
index 0000000..e48f45e
--- /dev/null
+++ b/src/syscall/rlimit_test.go
@@ -0,0 +1,40 @@
+// Copyright 2022 The Go Authors. 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 (
+	"os"
+	"runtime"
+	"testing"
+)
+
+func TestOpenFileLimit(t *testing.T) {
+	// For open file count,
+	// macOS sets the default soft limit to 256 and no hard limit.
+	// CentOS and Fedora set the default soft limit to 1024,
+	// with hard limits of 4096 and 524288, respectively.
+	// Check that we can open 1200 files, which proves
+	// that the rlimit is being raised appropriately on those systems.
+	fileCount := 1200
+
+	// OpenBSD has a default soft limit of 512 and hard limit of 1024.
+	if runtime.GOOS == "openbsd" {
+		fileCount = 768
+	}
+
+	var files []*os.File
+	for i := 0; i < fileCount; i++ {
+		f, err := os.Open("rlimit.go")
+		if err != nil {
+			t.Error(err)
+			break
+		}
+		files = append(files, f)
+	}
+
+	for _, f := range files {
+		f.Close()
+	}
+}
diff --git a/src/syscall/security_windows.go b/src/syscall/security_windows.go
index 67102b6..00dc920 100644
--- a/src/syscall/security_windows.go
+++ b/src/syscall/security_windows.go
@@ -290,7 +290,6 @@
 //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
-//sys	getSystemDirectory(dir *uint16, dirLen uint32) (len uint32, err error) = kernel32.GetSystemDirectoryW
 
 // An access token contains the security information for a logon session.
 // The system creates an access token when a user logs on, and every
diff --git a/src/syscall/syscall_aix.go b/src/syscall/syscall_aix.go
index 807990f..30e6887 100644
--- a/src/syscall/syscall_aix.go
+++ b/src/syscall/syscall_aix.go
@@ -428,8 +428,7 @@
 		if err != nil {
 			return nil, err
 		}
-		bytes := (*[len(pp.Path)]byte)(unsafe.Pointer(&pp.Path[0]))
-		sa.Name = string(bytes[0:n])
+		sa.Name = string(unsafe.Slice((*byte)(unsafe.Pointer(&pp.Path[0])), n))
 		return sa, nil
 
 	case AF_INET:
@@ -505,6 +504,7 @@
 
 //sys	Openat(dirfd int, path string, flags int, mode uint32) (fd int, err error)
 //sys	ptrace64(request int, id int64, addr int64, data int, buff uintptr) (err error)
+//sys	ptrace64Ptr(request int, id int64, addr int64, data int, buff unsafe.Pointer) (err error) = ptrace64
 
 func raw_ptrace(request int, pid int, addr *byte, data *byte) Errno {
 	if request == PTRACE_TRACEME {
@@ -525,7 +525,7 @@
 		if bsize > 1024 {
 			bsize = 1024
 		}
-		err = ptrace64(PT_READ_BLOCK, int64(pid), int64(addr), bsize, uintptr(unsafe.Pointer(&out[0])))
+		err = ptrace64Ptr(PT_READ_BLOCK, int64(pid), int64(addr), bsize, unsafe.Pointer(&out[0]))
 		if err != nil {
 			return 0, err
 		}
@@ -551,7 +551,7 @@
 		if bsize > 1024 {
 			bsize = 1024
 		}
-		err = ptrace64(PT_WRITE_BLOCK, int64(pid), int64(addr), bsize, uintptr(unsafe.Pointer(&data[0])))
+		err = ptrace64Ptr(PT_WRITE_BLOCK, int64(pid), int64(addr), bsize, unsafe.Pointer(&data[0]))
 		if err != nil {
 			return 0, err
 		}
@@ -633,7 +633,7 @@
 //sys	Setpriority(which int, who int, prio int) (err error)
 //sysnb	Setregid(rgid int, egid int) (err error)
 //sysnb	Setreuid(ruid int, euid int) (err error)
-//sysnb	Setrlimit(which int, lim *Rlimit) (err error)
+//sysnb	setrlimit(which int, lim *Rlimit) (err error)
 //sys	Stat(path string, stat *Stat_t) (err error)
 //sys	Statfs(path string, buf *Statfs_t) (err error)
 //sys	Symlink(path string, link string) (err error)
diff --git a/src/syscall/syscall_bsd.go b/src/syscall/syscall_bsd.go
index c7a7d78..0bb3cdf 100644
--- a/src/syscall/syscall_bsd.go
+++ b/src/syscall/syscall_bsd.go
@@ -249,8 +249,7 @@
 				break
 			}
 		}
-		bytes := (*[len(pp.Path)]byte)(unsafe.Pointer(&pp.Path[0]))[0:n]
-		sa.Name = string(bytes)
+		sa.Name = string(unsafe.Slice((*byte)(unsafe.Pointer(&pp.Path[0])), n))
 		return sa, nil
 
 	case AF_INET:
diff --git a/src/syscall/syscall_darwin.go b/src/syscall/syscall_darwin.go
index a39e99d..a9639e3 100644
--- a/src/syscall/syscall_darwin.go
+++ b/src/syscall/syscall_darwin.go
@@ -195,7 +195,7 @@
 //sys	Setprivexec(flag int) (err error)
 //sysnb	Setregid(rgid int, egid int) (err error)
 //sysnb	Setreuid(ruid int, euid int) (err error)
-//sysnb	Setrlimit(which int, lim *Rlimit) (err error)
+//sysnb	setrlimit(which int, lim *Rlimit) (err error)
 //sysnb	Setsid() (pid int, err error)
 //sysnb	Settimeofday(tp *Timeval) (err error)
 //sysnb	Setuid(uid int) (err error)
diff --git a/src/syscall/syscall_darwin_amd64.go b/src/syscall/syscall_darwin_amd64.go
index ef3c199..52ca3c8 100644
--- a/src/syscall/syscall_darwin_amd64.go
+++ b/src/syscall/syscall_darwin_amd64.go
@@ -25,6 +25,7 @@
 //sys	Statfs(path string, stat *Statfs_t) (err error) = SYS_statfs64
 //sys   fstatat(fd int, path string, stat *Stat_t, flags int) (err error) = SYS_fstatat64
 //sys   ptrace1(request int, pid int, addr uintptr, data uintptr) (err error) = SYS_ptrace
+//sys   ptrace1Ptr(request int, pid int, addr unsafe.Pointer, data uintptr) (err error) = SYS_ptrace
 
 func SetKevent(k *Kevent_t, fd, mode, flags int) {
 	k.Ident = uint64(fd)
diff --git a/src/syscall/syscall_darwin_arm64.go b/src/syscall/syscall_darwin_arm64.go
index cea4277..d5da988 100644
--- a/src/syscall/syscall_darwin_arm64.go
+++ b/src/syscall/syscall_darwin_arm64.go
@@ -25,6 +25,7 @@
 //sys	Statfs(path string, stat *Statfs_t) (err error)
 //sys	fstatat(fd int, path string, stat *Stat_t, flags int) (err error)
 //sys	ptrace1(request int, pid int, addr uintptr, data uintptr) (err error) = SYS_ptrace
+//sys	ptrace1Ptr(request int, pid int, addr unsafe.Pointer, data uintptr) (err error) = SYS_ptrace
 
 func SetKevent(k *Kevent_t, fd, mode, flags int) {
 	k.Ident = uint64(fd)
diff --git a/src/syscall/syscall_dragonfly.go b/src/syscall/syscall_dragonfly.go
index 1a1f1f6..6cb506b 100644
--- a/src/syscall/syscall_dragonfly.go
+++ b/src/syscall/syscall_dragonfly.go
@@ -240,7 +240,7 @@
 //sys	Setpriority(which int, who int, prio int) (err error)
 //sysnb	Setregid(rgid int, egid int) (err error)
 //sysnb	Setreuid(ruid int, euid int) (err error)
-//sysnb	Setrlimit(which int, lim *Rlimit) (err error)
+//sysnb	setrlimit(which int, lim *Rlimit) (err error)
 //sysnb	Setsid() (pid int, err error)
 //sysnb	Settimeofday(tp *Timeval) (err error)
 //sysnb	Setuid(uid int) (err error)
diff --git a/src/syscall/syscall_freebsd.go b/src/syscall/syscall_freebsd.go
index 0f39126..a0faa81 100644
--- a/src/syscall/syscall_freebsd.go
+++ b/src/syscall/syscall_freebsd.go
@@ -234,7 +234,7 @@
 //sys	Setpriority(which int, who int, prio int) (err error)
 //sysnb	Setregid(rgid int, egid int) (err error)
 //sysnb	Setreuid(ruid int, euid int) (err error)
-//sysnb	Setrlimit(which int, lim *Rlimit) (err error)
+//sysnb	setrlimit(which int, lim *Rlimit) (err error)
 //sysnb	Setsid() (pid int, err error)
 //sysnb	Settimeofday(tp *Timeval) (err error)
 //sysnb	Setuid(uid int) (err error)
diff --git a/src/syscall/syscall_js.go b/src/syscall/syscall_js.go
index c9c6522..c1b2894 100644
--- a/src/syscall/syscall_js.go
+++ b/src/syscall/syscall_js.go
@@ -7,6 +7,7 @@
 package syscall
 
 import (
+	errorspkg "errors"
 	"internal/itoa"
 	"internal/oserror"
 	"sync"
@@ -47,8 +48,8 @@
 //		err = errno
 //	}
 //
-// Errno values can be tested against error values from the os package
-// using errors.Is. For example:
+// Errno values can be tested against error values using errors.Is.
+// For example:
 //
 //	_, _, err := syscall.Syscall(...)
 //	if errors.Is(err, fs.ErrNotExist) ...
@@ -72,6 +73,8 @@
 		return e == EEXIST || e == ENOTEMPTY
 	case oserror.ErrNotExist:
 		return e == ENOENT
+	case errorspkg.ErrUnsupported:
+		return e == ENOSYS || e == ENOTSUP || e == EOPNOTSUPP
 	}
 	return false
 }
diff --git a/src/syscall/syscall_linux.go b/src/syscall/syscall_linux.go
index f337388..8b0a57b 100644
--- a/src/syscall/syscall_linux.go
+++ b/src/syscall/syscall_linux.go
@@ -243,7 +243,7 @@
 //sys	fchmodat(dirfd int, path string, mode uint32) (err error)
 
 func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) {
-	// Linux fchmodat doesn't support the flags parameter. Mimick glibc's behavior
+	// Linux fchmodat doesn't support the flags parameter. Mimic glibc's behavior
 	// and check the flags. Otherwise the mode would be applied to the symlink
 	// destination which is not what the user expects.
 	if flags&^_AT_SYMLINK_NOFOLLOW != 0 {
@@ -646,8 +646,7 @@
 		for n < len(pp.Path) && pp.Path[n] != 0 {
 			n++
 		}
-		bytes := (*[len(pp.Path)]byte)(unsafe.Pointer(&pp.Path[0]))[0:n]
-		sa.Name = string(bytes)
+		sa.Name = string(unsafe.Slice((*byte)(unsafe.Pointer(&pp.Path[0])), n))
 		return sa, nil
 
 	case AF_INET:
@@ -828,6 +827,7 @@
 }
 
 //sys	ptrace(request int, pid int, addr uintptr, data uintptr) (err error)
+//sys	ptracePtr(request int, pid int, addr uintptr, data unsafe.Pointer) (err error) = SYS_PTRACE
 
 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
@@ -845,7 +845,7 @@
 	// boundary.
 	n := 0
 	if addr%sizeofPtr != 0 {
-		err = ptrace(req, pid, addr-addr%sizeofPtr, uintptr(unsafe.Pointer(&buf[0])))
+		err = ptracePtr(req, pid, addr-addr%sizeofPtr, unsafe.Pointer(&buf[0]))
 		if err != nil {
 			return 0, err
 		}
@@ -857,7 +857,7 @@
 	for len(out) > 0 {
 		// We use an internal buffer to guarantee 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])))
+		err = ptracePtr(req, pid, addr+uintptr(n), unsafe.Pointer(&buf[0]))
 		if err != nil {
 			return n, err
 		}
@@ -885,7 +885,7 @@
 	n := 0
 	if addr%sizeofPtr != 0 {
 		var buf [sizeofPtr]byte
-		err = ptrace(peekReq, pid, addr-addr%sizeofPtr, uintptr(unsafe.Pointer(&buf[0])))
+		err = ptracePtr(peekReq, pid, addr-addr%sizeofPtr, unsafe.Pointer(&buf[0]))
 		if err != nil {
 			return 0, err
 		}
@@ -912,7 +912,7 @@
 	// Trailing edge.
 	if len(data) > 0 {
 		var buf [sizeofPtr]byte
-		err = ptrace(peekReq, pid, addr+uintptr(n), uintptr(unsafe.Pointer(&buf[0])))
+		err = ptracePtr(peekReq, pid, addr+uintptr(n), unsafe.Pointer(&buf[0]))
 		if err != nil {
 			return n, err
 		}
@@ -936,12 +936,22 @@
 	return ptracePoke(PTRACE_POKEDATA, PTRACE_PEEKDATA, pid, addr, data)
 }
 
+const (
+	_NT_PRSTATUS = 1
+)
+
 func PtraceGetRegs(pid int, regsout *PtraceRegs) (err error) {
-	return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout)))
+	var iov Iovec
+	iov.Base = (*byte)(unsafe.Pointer(regsout))
+	iov.SetLen(int(unsafe.Sizeof(*regsout)))
+	return ptracePtr(PTRACE_GETREGSET, pid, uintptr(_NT_PRSTATUS), unsafe.Pointer(&iov))
 }
 
 func PtraceSetRegs(pid int, regs *PtraceRegs) (err error) {
-	return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs)))
+	var iov Iovec
+	iov.Base = (*byte)(unsafe.Pointer(regs))
+	iov.SetLen(int(unsafe.Sizeof(*regs)))
+	return ptracePtr(PTRACE_SETREGSET, pid, uintptr(_NT_PRSTATUS), unsafe.Pointer(&iov))
 }
 
 func PtraceSetOptions(pid int, options int) (err error) {
@@ -950,7 +960,7 @@
 
 func PtraceGetEventMsg(pid int) (msg uint, err error) {
 	var data _C_long
-	err = ptrace(PTRACE_GETEVENTMSG, pid, 0, uintptr(unsafe.Pointer(&data)))
+	err = ptracePtr(PTRACE_GETEVENTMSG, pid, 0, unsafe.Pointer(&data))
 	msg = uint(data)
 	return
 }
@@ -1058,7 +1068,7 @@
 //sys	Mknodat(dirfd int, path string, mode uint32, dev int) (err error)
 //sys	Nanosleep(time *Timespec, leftover *Timespec) (err error)
 //sys	PivotRoot(newroot string, putold string) (err error) = SYS_PIVOT_ROOT
-//sysnb prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) = SYS_PRLIMIT64
+//sysnb prlimit1(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) = SYS_PRLIMIT64
 //sys	read(fd int, p []byte) (n int, err error)
 //sys	Removexattr(path string, attr string) (err error)
 //sys	Setdomainname(p []byte) (err error)
@@ -1261,3 +1271,14 @@
 //sys	Munlock(b []byte) (err error)
 //sys	Mlockall(flags int) (err error)
 //sys	Munlockall() (err error)
+
+// prlimit changes a resource limit. We use a single definition so that
+// we can tell StartProcess to not restore the original NOFILE limit.
+// This is unexported but can be called from x/sys/unix.
+func prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) {
+	err = prlimit1(pid, resource, newlimit, old)
+	if err == nil && newlimit != nil && resource == RLIMIT_NOFILE {
+		origRlimitNofile.Store(Rlimit{0, 0})
+	}
+	return err
+}
diff --git a/src/syscall/syscall_linux_386.go b/src/syscall/syscall_linux_386.go
index 0c9c6aa..9cbd9ac 100644
--- a/src/syscall/syscall_linux_386.go
+++ b/src/syscall/syscall_linux_386.go
@@ -107,9 +107,9 @@
 	return
 }
 
-//sysnb setrlimit(resource int, rlim *rlimit32) (err error) = SYS_SETRLIMIT
+//sysnb setrlimit1(resource int, rlim *rlimit32) (err error) = SYS_SETRLIMIT
 
-func Setrlimit(resource int, rlim *Rlimit) (err error) {
+func setrlimit(resource int, rlim *Rlimit) (err error) {
 	err = prlimit(0, resource, rlim, nil)
 	if err != ENOSYS {
 		return err
@@ -131,7 +131,34 @@
 		return EINVAL
 	}
 
-	return setrlimit(resource, &rl)
+	return setrlimit1(resource, &rl)
+}
+
+//go:nosplit
+func rawSetrlimit(resource int, rlim *Rlimit) Errno {
+	_, _, errno := RawSyscall6(SYS_PRLIMIT64, 0, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0, 0, 0)
+	if errno != ENOSYS {
+		return errno
+	}
+
+	rl := rlimit32{}
+	if rlim.Cur == rlimInf64 {
+		rl.Cur = rlimInf32
+	} else if rlim.Cur < uint64(rlimInf32) {
+		rl.Cur = uint32(rlim.Cur)
+	} else {
+		return EINVAL
+	}
+	if rlim.Max == rlimInf64 {
+		rl.Max = rlimInf32
+	} else if rlim.Max < uint64(rlimInf32) {
+		rl.Max = uint32(rlim.Max)
+	} else {
+		return EINVAL
+	}
+
+	_, _, errno = RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0)
+	return errno
 }
 
 // Underlying system call writes to newoffset via pointer.
diff --git a/src/syscall/syscall_linux_amd64.go b/src/syscall/syscall_linux_amd64.go
index 77e1393..aa85a52 100644
--- a/src/syscall/syscall_linux_amd64.go
+++ b/src/syscall/syscall_linux_amd64.go
@@ -4,6 +4,10 @@
 
 package syscall
 
+import (
+	"unsafe"
+)
+
 const (
 	_SYS_setgroups  = SYS_SETGROUPS
 	_SYS_clone3     = 435
@@ -33,7 +37,7 @@
 //sys	sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
 //sys	Setfsgid(gid int) (err error)
 //sys	Setfsuid(uid int) (err error)
-//sysnb	Setrlimit(resource int, rlim *Rlimit) (err error)
+//sysnb	setrlimit(resource int, rlim *Rlimit) (err error) = SYS_SETRLIMIT
 //sys	Shutdown(fd int, how int) (err error)
 //sys	Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error)
 //sys	Statfs(path string, buf *Statfs_t) (err error)
@@ -98,6 +102,12 @@
 //sys	Utime(path string, buf *Utimbuf) (err error)
 //sys	utimes(path string, times *[2]Timeval) (err error)
 
+//go:nosplit
+func rawSetrlimit(resource int, rlim *Rlimit) Errno {
+	_, _, errno := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0)
+	return errno
+}
+
 func setTimespec(sec, nsec int64) Timespec {
 	return Timespec{Sec: sec, Nsec: nsec}
 }
diff --git a/src/syscall/syscall_linux_arm.go b/src/syscall/syscall_linux_arm.go
index f4740af..600ec35 100644
--- a/src/syscall/syscall_linux_arm.go
+++ b/src/syscall/syscall_linux_arm.go
@@ -159,9 +159,9 @@
 	return
 }
 
-//sysnb setrlimit(resource int, rlim *rlimit32) (err error) = SYS_SETRLIMIT
+//sysnb setrlimit1(resource int, rlim *rlimit32) (err error) = SYS_SETRLIMIT
 
-func Setrlimit(resource int, rlim *Rlimit) (err error) {
+func setrlimit(resource int, rlim *Rlimit) (err error) {
 	err = prlimit(0, resource, rlim, nil)
 	if err != ENOSYS {
 		return err
@@ -183,7 +183,34 @@
 		return EINVAL
 	}
 
-	return setrlimit(resource, &rl)
+	return setrlimit1(resource, &rl)
+}
+
+//go:nosplit
+func rawSetrlimit(resource int, rlim *Rlimit) Errno {
+	_, _, errno := RawSyscall6(SYS_PRLIMIT64, 0, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0, 0, 0)
+	if errno != ENOSYS {
+		return errno
+	}
+
+	rl := rlimit32{}
+	if rlim.Cur == rlimInf64 {
+		rl.Cur = rlimInf32
+	} else if rlim.Cur < uint64(rlimInf32) {
+		rl.Cur = uint32(rlim.Cur)
+	} else {
+		return EINVAL
+	}
+	if rlim.Max == rlimInf64 {
+		rl.Max = rlimInf32
+	} else if rlim.Max < uint64(rlimInf32) {
+		rl.Max = uint32(rlim.Max)
+	} else {
+		return EINVAL
+	}
+
+	_, _, errno = RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0)
+	return errno
 }
 
 func (r *PtraceRegs) PC() uint64 { return uint64(r.Uregs[15]) }
diff --git a/src/syscall/syscall_linux_arm64.go b/src/syscall/syscall_linux_arm64.go
index f426862..42984ba 100644
--- a/src/syscall/syscall_linux_arm64.go
+++ b/src/syscall/syscall_linux_arm64.go
@@ -36,7 +36,7 @@
 //sys	sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
 //sys	Setfsgid(gid int) (err error)
 //sys	Setfsuid(uid int) (err error)
-//sysnb	setrlimit(resource int, rlim *Rlimit) (err error)
+//sysnb	setrlimit1(resource int, rlim *Rlimit) (err error)
 //sys	Shutdown(fd int, how int) (err error)
 //sys	Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error)
 
@@ -148,13 +148,23 @@
 	return getrlimit(resource, rlim)
 }
 
-// Setrlimit prefers the prlimit64 system call. See issue 38604.
-func Setrlimit(resource int, rlim *Rlimit) error {
+// setrlimit prefers the prlimit64 system call. See issue 38604.
+func setrlimit(resource int, rlim *Rlimit) error {
 	err := prlimit(0, resource, rlim, nil)
 	if err != ENOSYS {
 		return err
 	}
-	return setrlimit(resource, rlim)
+	return setrlimit1(resource, rlim)
+}
+
+//go:nosplit
+func rawSetrlimit(resource int, rlim *Rlimit) Errno {
+	_, _, errno := RawSyscall6(SYS_PRLIMIT64, 0, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0, 0, 0)
+	if errno != ENOSYS {
+		return errno
+	}
+	_, _, errno = RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0)
+	return errno
 }
 
 func (r *PtraceRegs) PC() uint64 { return r.Pc }
diff --git a/src/syscall/syscall_linux_loong64.go b/src/syscall/syscall_linux_loong64.go
index 5a0fa08..f8f01c2 100644
--- a/src/syscall/syscall_linux_loong64.go
+++ b/src/syscall/syscall_linux_loong64.go
@@ -187,11 +187,17 @@
 	return prlimit(0, resource, nil, rlim)
 }
 
-// Setrlimit prefers the prlimit64 system call.
-func Setrlimit(resource int, rlim *Rlimit) error {
+// setrlimit prefers the prlimit64 system call.
+func setrlimit(resource int, rlim *Rlimit) error {
 	return prlimit(0, resource, rlim, nil)
 }
 
+//go:nosplit
+func rawSetrlimit(resource int, rlim *Rlimit) Errno {
+	_, _, errno := RawSyscall6(SYS_PRLIMIT64, 0, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0, 0, 0)
+	return errno
+}
+
 func (r *PtraceRegs) GetEra() uint64 { return r.Era }
 
 func (r *PtraceRegs) SetEra(era uint64) { r.Era = era }
diff --git a/src/syscall/syscall_linux_mips64x.go b/src/syscall/syscall_linux_mips64x.go
index 8a0aa5c..47410d4 100644
--- a/src/syscall/syscall_linux_mips64x.go
+++ b/src/syscall/syscall_linux_mips64x.go
@@ -6,6 +6,10 @@
 
 package syscall
 
+import (
+	"unsafe"
+)
+
 const (
 	_SYS_setgroups  = SYS_SETGROUPS
 	_SYS_clone3     = 5435
@@ -33,7 +37,7 @@
 //sys	sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
 //sys	Setfsgid(gid int) (err error)
 //sys	Setfsuid(uid int) (err error)
-//sysnb	Setrlimit(resource int, rlim *Rlimit) (err error)
+//sysnb	setrlimit(resource int, rlim *Rlimit) (err error) = SYS_SETRLIMIT
 //sys	Shutdown(fd int, how int) (err error)
 //sys	Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error)
 //sys	Statfs(path string, buf *Statfs_t) (err error)
@@ -89,6 +93,12 @@
 //sys	Utime(path string, buf *Utimbuf) (err error)
 //sys	utimes(path string, times *[2]Timeval) (err error)
 
+//go:nosplit
+func rawSetrlimit(resource int, rlim *Rlimit) Errno {
+	_, _, errno := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0)
+	return errno
+}
+
 func setTimespec(sec, nsec int64) Timespec {
 	return Timespec{Sec: sec, Nsec: nsec}
 }
diff --git a/src/syscall/syscall_linux_mipsx.go b/src/syscall/syscall_linux_mipsx.go
index c8468fb..d8d5044 100644
--- a/src/syscall/syscall_linux_mipsx.go
+++ b/src/syscall/syscall_linux_mipsx.go
@@ -152,9 +152,9 @@
 	return
 }
 
-//sysnb setrlimit(resource int, rlim *rlimit32) (err error) = SYS_SETRLIMIT
+//sysnb setrlimit1(resource int, rlim *rlimit32) (err error) = SYS_SETRLIMIT
 
-func Setrlimit(resource int, rlim *Rlimit) (err error) {
+func setrlimit(resource int, rlim *Rlimit) (err error) {
 	err = prlimit(0, resource, rlim, nil)
 	if err != ENOSYS {
 		return err
@@ -176,7 +176,34 @@
 		return EINVAL
 	}
 
-	return setrlimit(resource, &rl)
+	return setrlimit1(resource, &rl)
+}
+
+//go:nosplit
+func rawSetrlimit(resource int, rlim *Rlimit) Errno {
+	_, _, errno := RawSyscall6(SYS_PRLIMIT64, 0, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0, 0, 0)
+	if errno != ENOSYS {
+		return errno
+	}
+
+	rl := rlimit32{}
+	if rlim.Cur == rlimInf64 {
+		rl.Cur = rlimInf32
+	} else if rlim.Cur < uint64(rlimInf32) {
+		rl.Cur = uint32(rlim.Cur)
+	} else {
+		return EINVAL
+	}
+	if rlim.Max == rlimInf64 {
+		rl.Max = rlimInf32
+	} else if rlim.Max < uint64(rlimInf32) {
+		rl.Max = uint32(rlim.Max)
+	} else {
+		return EINVAL
+	}
+
+	_, _, errno = RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0)
+	return errno
 }
 
 func (r *PtraceRegs) PC() uint64 { return uint64(r.Regs[64]) }
diff --git a/src/syscall/syscall_linux_ppc64x.go b/src/syscall/syscall_linux_ppc64x.go
index 5c076d8..36f7711 100644
--- a/src/syscall/syscall_linux_ppc64x.go
+++ b/src/syscall/syscall_linux_ppc64x.go
@@ -6,6 +6,10 @@
 
 package syscall
 
+import (
+	"unsafe"
+)
+
 const (
 	_SYS_setgroups  = SYS_SETGROUPS
 	_SYS_clone3     = 435
@@ -39,7 +43,7 @@
 //sys	sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
 //sys	Setfsgid(gid int) (err error)
 //sys	Setfsuid(uid int) (err error)
-//sysnb	Setrlimit(resource int, rlim *Rlimit) (err error)
+//sysnb	setrlimit(resource int, rlim *Rlimit) (err error) = SYS_SETRLIMIT
 //sys	Shutdown(fd int, how int) (err error)
 //sys	Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error)
 //sys	Stat(path string, stat *Stat_t) (err error)
@@ -68,6 +72,12 @@
 //sys	Utime(path string, buf *Utimbuf) (err error)
 //sys	utimes(path string, times *[2]Timeval) (err error)
 
+//go:nosplit
+func rawSetrlimit(resource int, rlim *Rlimit) Errno {
+	_, _, errno := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0)
+	return errno
+}
+
 func setTimespec(sec, nsec int64) Timespec {
 	return Timespec{Sec: sec, Nsec: nsec}
 }
diff --git a/src/syscall/syscall_linux_riscv64.go b/src/syscall/syscall_linux_riscv64.go
index 3bb5460..44ff1d7 100644
--- a/src/syscall/syscall_linux_riscv64.go
+++ b/src/syscall/syscall_linux_riscv64.go
@@ -36,7 +36,7 @@
 //sys	sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
 //sys	Setfsgid(gid int) (err error)
 //sys	Setfsuid(uid int) (err error)
-//sysnb	Setrlimit(resource int, rlim *Rlimit) (err error)
+//sysnb	setrlimit(resource int, rlim *Rlimit) (err error) = SYS_SETRLIMIT
 //sys	Shutdown(fd int, how int) (err error)
 //sys	Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error)
 
@@ -143,6 +143,12 @@
 	return utimensat(_AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0)
 }
 
+//go:nosplit
+func rawSetrlimit(resource int, rlim *Rlimit) Errno {
+	_, _, errno := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0)
+	return errno
+}
+
 func (r *PtraceRegs) PC() uint64 { return r.Pc }
 
 func (r *PtraceRegs) SetPC(pc uint64) { r.Pc = pc }
diff --git a/src/syscall/syscall_linux_s390x.go b/src/syscall/syscall_linux_s390x.go
index cb83697..44990f2 100644
--- a/src/syscall/syscall_linux_s390x.go
+++ b/src/syscall/syscall_linux_s390x.go
@@ -36,7 +36,7 @@
 //sys	sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
 //sys	Setfsgid(gid int) (err error)
 //sys	Setfsuid(uid int) (err error)
-//sysnb	Setrlimit(resource int, rlim *Rlimit) (err error)
+//sysnb	setrlimit(resource int, rlim *Rlimit) (err error) = SYS_SETRLIMIT
 //sys	Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error)
 //sys	Stat(path string, stat *Stat_t) (err error)
 //sys	Statfs(path string, buf *Statfs_t) (err error)
@@ -243,6 +243,12 @@
 	return
 }
 
+//go:nosplit
+func rawSetrlimit(resource int, rlim *Rlimit) Errno {
+	_, _, errno := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0)
+	return errno
+}
+
 func (r *PtraceRegs) PC() uint64 { return r.Psw.Addr }
 
 func (r *PtraceRegs) SetPC(pc uint64) { r.Psw.Addr = pc }
diff --git a/src/syscall/syscall_netbsd.go b/src/syscall/syscall_netbsd.go
index 7f7c5b1..333dd3a 100644
--- a/src/syscall/syscall_netbsd.go
+++ b/src/syscall/syscall_netbsd.go
@@ -224,7 +224,7 @@
 //sys	Setpriority(which int, who int, prio int) (err error)
 //sysnb	Setregid(rgid int, egid int) (err error)
 //sysnb	Setreuid(ruid int, euid int) (err error)
-//sysnb	Setrlimit(which int, lim *Rlimit) (err error)
+//sysnb	setrlimit(which int, lim *Rlimit) (err error)
 //sysnb	Setsid() (pid int, err error)
 //sysnb	Settimeofday(tp *Timeval) (err error)
 //sysnb	Setuid(uid int) (err error)
diff --git a/src/syscall/syscall_openbsd.go b/src/syscall/syscall_openbsd.go
index ba67ab1..5784d5c 100644
--- a/src/syscall/syscall_openbsd.go
+++ b/src/syscall/syscall_openbsd.go
@@ -196,7 +196,7 @@
 //sys	Setpriority(which int, who int, prio int) (err error)
 //sysnb	Setregid(rgid int, egid int) (err error)
 //sysnb	Setreuid(ruid int, euid int) (err error)
-//sysnb	Setrlimit(which int, lim *Rlimit) (err error)
+//sysnb	setrlimit(which int, lim *Rlimit) (err error)
 //sysnb	Setsid() (pid int, err error)
 //sysnb	Settimeofday(tp *Timeval) (err error)
 //sysnb	Setuid(uid int) (err error)
diff --git a/src/syscall/syscall_openbsd_libc.go b/src/syscall/syscall_openbsd_libc.go
index 516d029..de503cc 100644
--- a/src/syscall/syscall_openbsd_libc.go
+++ b/src/syscall/syscall_openbsd_libc.go
@@ -67,6 +67,7 @@
 //sysnb execve(path *byte, argv **byte, envp **byte) (err error)
 //sysnb exit(res int) (err error)
 //sys   ptrace(request int, pid int, addr uintptr, data uintptr) (err error)
+//sys   ptracePtr(request int, pid int, addr unsafe.Pointer, data uintptr) (err error) = SYS_ptrace
 //sysnb getentropy(p []byte) (err error)
 //sys   fstatat(fd int, path string, stat *Stat_t, flags int) (err error)
 //sys	fcntlPtr(fd int, cmd int, arg unsafe.Pointer) (val int, err error) = SYS_fcntl
diff --git a/src/syscall/syscall_plan9.go b/src/syscall/syscall_plan9.go
index ca286c8..7af10ba 100644
--- a/src/syscall/syscall_plan9.go
+++ b/src/syscall/syscall_plan9.go
@@ -12,7 +12,9 @@
 package syscall
 
 import (
+	"errors"
 	"internal/oserror"
+	"runtime"
 	"unsafe"
 )
 
@@ -21,8 +23,8 @@
 
 // ErrorString implements Error's String method by returning itself.
 //
-// ErrorString values can be tested against error values from the os package
-// using errors.Is. For example:
+// ErrorString values can be tested against error values using errors.Is.
+// For example:
 //
 //	_, _, err := syscall.Syscall(...)
 //	if errors.Is(err, fs.ErrNotExist) ...
@@ -42,6 +44,8 @@
 	case oserror.ErrNotExist:
 		return checkErrMessageContent(e, "does not exist", "not found",
 			"has been removed", "no parent")
+	case errors.ErrUnsupported:
+		return checkErrMessageContent(e, "not supported")
 	}
 	return false
 }
@@ -301,7 +305,9 @@
 }
 
 func Unmount(name, old string) (err error) {
-	fixwd(name, old)
+	if fixwd(name, old) {
+		defer runtime.UnlockOSThread()
+	}
 	oldp, err := BytePtrFromString(old)
 	if err != nil {
 		return err
@@ -384,49 +390,63 @@
 //sys	open(path string, mode int) (fd int, err error)
 
 func Open(path string, mode int) (fd int, err error) {
-	fixwd(path)
+	if fixwd(path) {
+		defer runtime.UnlockOSThread()
+	}
 	return open(path, mode)
 }
 
 //sys	create(path string, mode int, perm uint32) (fd int, err error)
 
 func Create(path string, mode int, perm uint32) (fd int, err error) {
-	fixwd(path)
+	if fixwd(path) {
+		defer runtime.UnlockOSThread()
+	}
 	return create(path, mode, perm)
 }
 
 //sys	remove(path string) (err error)
 
 func Remove(path string) error {
-	fixwd(path)
+	if fixwd(path) {
+		defer runtime.UnlockOSThread()
+	}
 	return remove(path)
 }
 
 //sys	stat(path string, edir []byte) (n int, err error)
 
 func Stat(path string, edir []byte) (n int, err error) {
-	fixwd(path)
+	if fixwd(path) {
+		defer runtime.UnlockOSThread()
+	}
 	return stat(path, edir)
 }
 
 //sys	bind(name string, old string, flag int) (err error)
 
 func Bind(name string, old string, flag int) (err error) {
-	fixwd(name, old)
+	if fixwd(name, old) {
+		defer runtime.UnlockOSThread()
+	}
 	return bind(name, old, flag)
 }
 
 //sys	mount(fd int, afd int, old string, flag int, aname string) (err error)
 
 func Mount(fd int, afd int, old string, flag int, aname string) (err error) {
-	fixwd(old)
+	if fixwd(old) {
+		defer runtime.UnlockOSThread()
+	}
 	return mount(fd, afd, old, flag, aname)
 }
 
 //sys	wstat(path string, edir []byte) (err error)
 
 func Wstat(path string, edir []byte) (err error) {
-	fixwd(path)
+	if fixwd(path) {
+		defer runtime.UnlockOSThread()
+	}
 	return wstat(path, edir)
 }
 
diff --git a/src/syscall/syscall_solaris.go b/src/syscall/syscall_solaris.go
index 2d042ac..523a2a8 100644
--- a/src/syscall/syscall_solaris.go
+++ b/src/syscall/syscall_solaris.go
@@ -321,8 +321,7 @@
 		for n < len(pp.Path) && pp.Path[n] != 0 {
 			n++
 		}
-		bytes := (*[len(pp.Path)]byte)(unsafe.Pointer(&pp.Path[0]))[0:n]
-		sa.Name = string(bytes)
+		sa.Name = string(unsafe.Slice((*byte)(unsafe.Pointer(&pp.Path[0])), n))
 		return sa, nil
 
 	case AF_INET:
@@ -474,7 +473,7 @@
 //sys	Setpriority(which int, who int, prio int) (err error)
 //sysnb	Setregid(rgid int, egid int) (err error)
 //sysnb	Setreuid(ruid int, euid int) (err error)
-//sysnb	Setrlimit(which int, lim *Rlimit) (err error)
+//sysnb	setrlimit(which int, lim *Rlimit) (err error)
 //sysnb	Setsid() (pid int, err error)
 //sysnb	Setuid(uid int) (err error)
 //sys	Shutdown(s int, how int) (err error) = libsocket.shutdown
diff --git a/src/syscall/syscall_unix.go b/src/syscall/syscall_unix.go
index c59d4fc..4c48f29 100644
--- a/src/syscall/syscall_unix.go
+++ b/src/syscall/syscall_unix.go
@@ -7,6 +7,7 @@
 package syscall
 
 import (
+	errorspkg "errors"
 	"internal/bytealg"
 	"internal/itoa"
 	"internal/oserror"
@@ -97,8 +98,8 @@
 //		err = errno
 //	}
 //
-// Errno values can be tested against error values from the os package
-// using errors.Is. For example:
+// Errno values can be tested against error values using errors.Is.
+// For example:
 //
 //	_, _, err := syscall.Syscall(...)
 //	if errors.Is(err, fs.ErrNotExist) ...
@@ -122,6 +123,8 @@
 		return e == EEXIST || e == ENOTEMPTY
 	case oserror.ErrNotExist:
 		return e == ENOENT
+	case errorspkg.ErrUnsupported:
+		return e == ENOSYS || e == ENOTSUP || e == EOPNOTSUPP
 	}
 	return false
 }
diff --git a/src/syscall/syscall_wasip1.go b/src/syscall/syscall_wasip1.go
new file mode 100644
index 0000000..e66afee
--- /dev/null
+++ b/src/syscall/syscall_wasip1.go
@@ -0,0 +1,493 @@
+// Copyright 2023 The Go 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:build wasip1
+
+package syscall
+
+import (
+	"errors"
+	"internal/itoa"
+	"internal/oserror"
+	"unsafe"
+)
+
+type Dircookie = uint64
+
+type Filetype = uint8
+
+const (
+	FILETYPE_UNKNOWN Filetype = iota
+	FILETYPE_BLOCK_DEVICE
+	FILETYPE_CHARACTER_DEVICE
+	FILETYPE_DIRECTORY
+	FILETYPE_REGULAR_FILE
+	FILETYPE_SOCKET_DGRAM
+	FILETYPE_SOCKET_STREAM
+	FILETYPE_SYMBOLIC_LINK
+)
+
+type Dirent struct {
+	// The offset of the next directory entry stored in this directory.
+	Next Dircookie
+	// The serial number of the file referred to by this directory entry.
+	Ino uint64
+	// The length of the name of the directory entry.
+	Namlen uint32
+	// The type of the file referred to by this directory entry.
+	Type Filetype
+	// Name of the directory entry.
+	Name *byte
+}
+
+func direntIno(buf []byte) (uint64, bool) {
+	return readInt(buf, unsafe.Offsetof(Dirent{}.Ino), unsafe.Sizeof(Dirent{}.Ino))
+}
+
+func direntReclen(buf []byte) (uint64, bool) {
+	namelen, ok := direntNamlen(buf)
+	return 24 + namelen, ok
+}
+
+func direntNamlen(buf []byte) (uint64, bool) {
+	return readInt(buf, unsafe.Offsetof(Dirent{}.Namlen), unsafe.Sizeof(Dirent{}.Namlen))
+}
+
+// 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:
+//
+//	var err = nil
+//	if errno != 0 {
+//		err = errno
+//	}
+type Errno uint32
+
+func (e Errno) Error() string {
+	if 0 <= int(e) && int(e) < len(errorstr) {
+		s := errorstr[e]
+		if s != "" {
+			return s
+		}
+	}
+	return "errno " + itoa.Itoa(int(e))
+}
+
+func (e Errno) Is(target error) bool {
+	switch target {
+	case oserror.ErrPermission:
+		return e == EACCES || e == EPERM
+	case oserror.ErrExist:
+		return e == EEXIST || e == ENOTEMPTY
+	case oserror.ErrNotExist:
+		return e == ENOENT
+	case errors.ErrUnsupported:
+		return e == ENOSYS
+	}
+	return false
+}
+
+func (e Errno) Temporary() bool {
+	return e == EINTR || e == EMFILE || e.Timeout()
+}
+
+func (e Errno) Timeout() bool {
+	return e == EAGAIN || e == ETIMEDOUT
+}
+
+// A Signal is a number describing a process signal.
+// It implements the os.Signal interface.
+type Signal uint8
+
+const (
+	SIGNONE Signal = iota
+	SIGHUP
+	SIGINT
+	SIGQUIT
+	SIGILL
+	SIGTRAP
+	SIGABRT
+	SIGBUS
+	SIGFPE
+	SIGKILL
+	SIGUSR1
+	SIGSEGV
+	SIGUSR2
+	SIGPIPE
+	SIGALRM
+	SIGTERM
+	SIGCHLD
+	SIGCONT
+	SIGSTOP
+	SIGTSTP
+	SIGTTIN
+	SIGTTOU
+	SIGURG
+	SIGXCPU
+	SIGXFSZ
+	SIGVTARLM
+	SIGPROF
+	SIGWINCH
+	SIGPOLL
+	SIGPWR
+	SIGSYS
+)
+
+func (s Signal) Signal() {}
+
+func (s Signal) String() string {
+	switch s {
+	case SIGNONE:
+		return "no signal"
+	case SIGHUP:
+		return "hangup"
+	case SIGINT:
+		return "interrupt"
+	case SIGQUIT:
+		return "quit"
+	case SIGILL:
+		return "illegal instruction"
+	case SIGTRAP:
+		return "trace/breakpoint trap"
+	case SIGABRT:
+		return "abort"
+	case SIGBUS:
+		return "bus error"
+	case SIGFPE:
+		return "floating point exception"
+	case SIGKILL:
+		return "killed"
+	case SIGUSR1:
+		return "user defined signal 1"
+	case SIGSEGV:
+		return "segmentation fault"
+	case SIGUSR2:
+		return "user defined signal 2"
+	case SIGPIPE:
+		return "broken pipe"
+	case SIGALRM:
+		return "alarm clock"
+	case SIGTERM:
+		return "terminated"
+	case SIGCHLD:
+		return "child exited"
+	case SIGCONT:
+		return "continued"
+	case SIGSTOP:
+		return "stopped (signal)"
+	case SIGTSTP:
+		return "stopped"
+	case SIGTTIN:
+		return "stopped (tty input)"
+	case SIGTTOU:
+		return "stopped (tty output)"
+	case SIGURG:
+		return "urgent I/O condition"
+	case SIGXCPU:
+		return "CPU time limit exceeded"
+	case SIGXFSZ:
+		return "file size limit exceeded"
+	case SIGVTARLM:
+		return "virtual timer expired"
+	case SIGPROF:
+		return "profiling timer expired"
+	case SIGWINCH:
+		return "window changed"
+	case SIGPOLL:
+		return "I/O possible"
+	case SIGPWR:
+		return "power failure"
+	case SIGSYS:
+		return "bad system call"
+	default:
+		return "signal " + itoa.Itoa(int(s))
+	}
+}
+
+const (
+	Stdin  = 0
+	Stdout = 1
+	Stderr = 2
+)
+
+const (
+	O_RDONLY = 0
+	O_WRONLY = 1
+	O_RDWR   = 2
+
+	O_CREAT  = 0100
+	O_CREATE = O_CREAT
+	O_TRUNC  = 01000
+	O_APPEND = 02000
+	O_EXCL   = 0200
+	O_SYNC   = 010000
+
+	O_CLOEXEC = 0
+)
+
+const (
+	F_DUPFD   = 0
+	F_GETFD   = 1
+	F_SETFD   = 2
+	F_GETFL   = 3
+	F_SETFL   = 4
+	F_GETOWN  = 5
+	F_SETOWN  = 6
+	F_GETLK   = 7
+	F_SETLK   = 8
+	F_SETLKW  = 9
+	F_RGETLK  = 10
+	F_RSETLK  = 11
+	F_CNVT    = 12
+	F_RSETLKW = 13
+
+	F_RDLCK   = 1
+	F_WRLCK   = 2
+	F_UNLCK   = 3
+	F_UNLKSYS = 4
+)
+
+const (
+	S_IFMT        = 0000370000
+	S_IFSHM_SYSV  = 0000300000
+	S_IFSEMA      = 0000270000
+	S_IFCOND      = 0000260000
+	S_IFMUTEX     = 0000250000
+	S_IFSHM       = 0000240000
+	S_IFBOUNDSOCK = 0000230000
+	S_IFSOCKADDR  = 0000220000
+	S_IFDSOCK     = 0000210000
+
+	S_IFSOCK = 0000140000
+	S_IFLNK  = 0000120000
+	S_IFREG  = 0000100000
+	S_IFBLK  = 0000060000
+	S_IFDIR  = 0000040000
+	S_IFCHR  = 0000020000
+	S_IFIFO  = 0000010000
+
+	S_UNSUP = 0000370000
+
+	S_ISUID = 0004000
+	S_ISGID = 0002000
+	S_ISVTX = 0001000
+
+	S_IREAD  = 0400
+	S_IWRITE = 0200
+	S_IEXEC  = 0100
+
+	S_IRWXU = 0700
+	S_IRUSR = 0400
+	S_IWUSR = 0200
+	S_IXUSR = 0100
+
+	S_IRWXG = 070
+	S_IRGRP = 040
+	S_IWGRP = 020
+	S_IXGRP = 010
+
+	S_IRWXO = 07
+	S_IROTH = 04
+	S_IWOTH = 02
+	S_IXOTH = 01
+)
+
+type WaitStatus uint32
+
+func (w WaitStatus) Exited() bool       { return false }
+func (w WaitStatus) ExitStatus() int    { return 0 }
+func (w WaitStatus) Signaled() bool     { return false }
+func (w WaitStatus) Signal() Signal     { return 0 }
+func (w WaitStatus) CoreDump() bool     { return false }
+func (w WaitStatus) Stopped() bool      { return false }
+func (w WaitStatus) Continued() bool    { return false }
+func (w WaitStatus) StopSignal() Signal { return 0 }
+func (w WaitStatus) TrapCause() int     { return 0 }
+
+// Rusage is a placeholder to allow compilation of the os/exec package
+// because we need Go programs to be portable across platforms. WASI does
+// not have a mechanism to to spawn processes so there is no reason for an
+// application to take a dependency on this type.
+type Rusage struct {
+	Utime Timeval
+	Stime Timeval
+}
+
+// ProcAttr is a placeholder to allow compilation of the os/exec package
+// because we need Go programs to be portable across platforms. WASI does
+// not have a mechanism to to spawn processes so there is no reason for an
+// application to take a dependency on this type.
+type ProcAttr struct {
+	Dir   string
+	Env   []string
+	Files []uintptr
+	Sys   *SysProcAttr
+}
+
+type SysProcAttr struct {
+}
+
+func Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) {
+	return 0, 0, ENOSYS
+}
+
+func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno) {
+	return 0, 0, ENOSYS
+}
+
+func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) {
+	return 0, 0, ENOSYS
+}
+
+func RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno) {
+	return 0, 0, ENOSYS
+}
+
+func Sysctl(key string) (string, error) {
+	if key == "kern.hostname" {
+		return "wasip1", nil
+	}
+	return "", ENOSYS
+}
+
+func Getuid() int {
+	return 1
+}
+
+func Getgid() int {
+	return 1
+}
+
+func Geteuid() int {
+	return 1
+}
+
+func Getegid() int {
+	return 1
+}
+
+func Getgroups() ([]int, error) {
+	return []int{1}, nil
+}
+
+func Getpid() int {
+	return 3
+}
+
+func Getppid() int {
+	return 2
+}
+
+func Gettimeofday(tv *Timeval) error {
+	var time timestamp
+	if errno := clock_time_get(clockRealtime, 1e3, unsafe.Pointer(&time)); errno != 0 {
+		return errno
+	}
+	tv.setTimestamp(time)
+	return nil
+}
+
+func Kill(pid int, signum Signal) error {
+	// WASI does not have the notion of processes nor signal handlers.
+	//
+	// Any signal that the application raises to the process itself will
+	// be interpreted as being cause for termination.
+	if pid > 0 && pid != Getpid() {
+		return ESRCH
+	}
+	ProcExit(128 + int32(signum))
+	return nil
+}
+
+func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {
+	return 0, ENOSYS
+}
+
+func StartProcess(argv0 string, argv []string, attr *ProcAttr) (pid int, handle uintptr, err error) {
+	return 0, 0, ENOSYS
+}
+
+func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, err error) {
+	return 0, ENOSYS
+}
+
+func Umask(mask int) int {
+	return 0
+}
+
+type Timespec struct {
+	Sec  int64
+	Nsec int64
+}
+
+func (ts *Timespec) timestamp() timestamp {
+	return timestamp(ts.Sec*1e9) + timestamp(ts.Nsec)
+}
+
+func (ts *Timespec) setTimestamp(t timestamp) {
+	ts.Sec = int64(t / 1e9)
+	ts.Nsec = int64(t % 1e9)
+}
+
+type Timeval struct {
+	Sec  int64
+	Usec int64
+}
+
+func (tv *Timeval) timestamp() timestamp {
+	return timestamp(tv.Sec*1e9) + timestamp(tv.Usec*1e3)
+}
+
+func (tv *Timeval) setTimestamp(t timestamp) {
+	tv.Sec = int64(t / 1e9)
+	tv.Usec = int64((t % 1e9) / 1e3)
+}
+
+func setTimespec(sec, nsec int64) Timespec {
+	return Timespec{Sec: sec, Nsec: nsec}
+}
+
+func setTimeval(sec, usec int64) Timeval {
+	return Timeval{Sec: sec, Usec: usec}
+}
+
+type clockid = uint32
+
+const (
+	clockRealtime clockid = iota
+	clockMonotonic
+	clockProcessCPUTimeID
+	clockThreadCPUTimeID
+)
+
+//go:wasmimport wasi_snapshot_preview1 clock_time_get
+//go:noescape
+func clock_time_get(id clockid, precision timestamp, time unsafe.Pointer) Errno
+
+func SetNonblock(fd int, nonblocking bool) error {
+	flags, err := fd_fdstat_get_flags(fd)
+	if err != nil {
+		return err
+	}
+	if nonblocking {
+		flags |= FDFLAG_NONBLOCK
+	} else {
+		flags &^= FDFLAG_NONBLOCK
+	}
+	errno := fd_fdstat_set_flags(int32(fd), flags)
+	return errnoErr(errno)
+}
+
+type Rlimit struct {
+	Cur uint64
+	Max uint64
+}
+
+const (
+	RLIMIT_NOFILE = iota
+)
+
+func Getrlimit(which int, lim *Rlimit) error {
+	return ENOSYS
+}
diff --git a/src/syscall/syscall_windows.go b/src/syscall/syscall_windows.go
index 4fbcdcd..e348905 100644
--- a/src/syscall/syscall_windows.go
+++ b/src/syscall/syscall_windows.go
@@ -14,7 +14,6 @@
 	"internal/race"
 	"runtime"
 	"sync"
-	"unicode/utf16"
 	"unsafe"
 )
 
@@ -37,30 +36,50 @@
 
 // UTF16FromString returns the UTF-16 encoding of the UTF-8 string
 // s, with a terminating NUL added. If s contains a NUL byte at any
-// location, it returns (nil, EINVAL).
+// location, it returns (nil, EINVAL). Unpaired surrogates
+// are encoded using WTF-8.
 func UTF16FromString(s string) ([]uint16, error) {
 	if bytealg.IndexByteString(s, 0) != -1 {
 		return nil, EINVAL
 	}
-	// In the worst case all characters require two uint16.
-	// Also account for the terminating NULL character.
-	buf := make([]uint16, 0, len(s)*2+1)
-	for _, r := range s {
-		buf = utf16.AppendRune(buf, r)
-	}
-	return utf16.AppendRune(buf, '\x00'), nil
+	// Valid UTF-8 characters between 1 and 3 bytes require one uint16.
+	// Valid UTF-8 characters of 4 bytes require two uint16.
+	// Bytes with invalid UTF-8 encoding require maximum one uint16 per byte.
+	// So the number of UTF-8 code units (len(s)) is always greater or
+	// equal than the number of UTF-16 code units.
+	// Also account for the terminating NUL character.
+	buf := make([]uint16, 0, len(s)+1)
+	buf = encodeWTF16(s, buf)
+	return append(buf, 0), nil
 }
 
 // UTF16ToString returns the UTF-8 encoding of the UTF-16 sequence s,
-// with a terminating NUL removed.
+// with a terminating NUL removed. Unpaired surrogates are decoded
+// using WTF-8 instead of UTF-8 encoding.
 func UTF16ToString(s []uint16) string {
+	maxLen := 0
 	for i, v := range s {
 		if v == 0 {
 			s = s[0:i]
 			break
 		}
+		switch {
+		case v <= rune1Max:
+			maxLen += 1
+		case v <= rune2Max:
+			maxLen += 2
+		default:
+			// r is a non-surrogate that decodes to 3 bytes,
+			// or is an unpaired surrogate (also 3 bytes in WTF-8),
+			// or is one half of a valid surrogate pair.
+			// If it is half of a pair, we will add 3 for the second surrogate
+			// (total of 6) and overestimate by 2 bytes for the pair,
+			// since the resulting rune only requires 4 bytes.
+			maxLen += 3
+		}
 	}
-	return string(utf16.Decode(s))
+	buf := decodeWTF16(s, make([]byte, 0, maxLen))
+	return unsafe.String(unsafe.SliceData(buf), len(buf))
 }
 
 // utf16PtrToString is like UTF16ToString, but takes *uint16
@@ -69,17 +88,13 @@
 	if p == nil {
 		return ""
 	}
-	// Find NUL terminator.
 	end := unsafe.Pointer(p)
 	n := 0
 	for *(*uint16)(end) != 0 {
 		end = unsafe.Pointer(uintptr(end) + unsafe.Sizeof(*p))
 		n++
 	}
-	// Turn *uint16 into []uint16.
-	s := unsafe.Slice(p, n)
-	// Decode []uint16 into string.
-	return string(utf16.Decode(s))
+	return UTF16ToString(unsafe.Slice(p, n))
 }
 
 // StringToUTF16Ptr returns pointer to the UTF-16 encoding of
@@ -93,6 +108,7 @@
 // UTF16PtrFromString returns pointer to the UTF-16 encoding of
 // the UTF-8 string s, with a terminating NUL added. If s
 // contains a NUL byte at any location, it returns (nil, EINVAL).
+// Unpaired surrogates are encoded using WTF-8.
 func UTF16PtrFromString(s string) (*uint16, error) {
 	a, err := UTF16FromString(s)
 	if err != nil {
@@ -103,8 +119,8 @@
 
 // Errno is the Windows error number.
 //
-// Errno values can be tested against error values from the os package
-// using errors.Is. For example:
+// Errno values can be tested against error values using errors.Is.
+// For example:
 //
 //	_, _, err := syscall.Syscall(...)
 //	if errors.Is(err, fs.ErrNotExist) ...
@@ -139,23 +155,40 @@
 	// trim terminating \r and \n
 	for ; n > 0 && (b[n-1] == '\n' || b[n-1] == '\r'); n-- {
 	}
-	return string(utf16.Decode(b[:n]))
+	return UTF16ToString(b[:n])
 }
 
-const _ERROR_BAD_NETPATH = Errno(53)
+const (
+	_ERROR_NOT_ENOUGH_MEMORY    = Errno(8)
+	_ERROR_NOT_SUPPORTED        = Errno(50)
+	_ERROR_BAD_NETPATH          = Errno(53)
+	_ERROR_CALL_NOT_IMPLEMENTED = Errno(120)
+)
 
 func (e Errno) Is(target error) bool {
 	switch target {
 	case oserror.ErrPermission:
-		return e == ERROR_ACCESS_DENIED
+		return e == ERROR_ACCESS_DENIED ||
+			e == EACCES ||
+			e == EPERM
 	case oserror.ErrExist:
 		return e == ERROR_ALREADY_EXISTS ||
 			e == ERROR_DIR_NOT_EMPTY ||
-			e == ERROR_FILE_EXISTS
+			e == ERROR_FILE_EXISTS ||
+			e == EEXIST ||
+			e == ENOTEMPTY
 	case oserror.ErrNotExist:
 		return e == ERROR_FILE_NOT_FOUND ||
 			e == _ERROR_BAD_NETPATH ||
-			e == ERROR_PATH_NOT_FOUND
+			e == ERROR_PATH_NOT_FOUND ||
+			e == ENOENT
+	case errorspkg.ErrUnsupported:
+		return e == _ERROR_NOT_SUPPORTED ||
+			e == _ERROR_CALL_NOT_IMPLEMENTED ||
+			e == ENOSYS ||
+			e == ENOTSUP ||
+			e == EOPNOTSUPP ||
+			e == EWINDOWS
 	}
 	return false
 }
@@ -295,6 +328,7 @@
 //sys	initializeProcThreadAttributeList(attrlist *_PROC_THREAD_ATTRIBUTE_LIST, attrcount uint32, flags uint32, size *uintptr) (err error) = InitializeProcThreadAttributeList
 //sys	deleteProcThreadAttributeList(attrlist *_PROC_THREAD_ATTRIBUTE_LIST) = DeleteProcThreadAttributeList
 //sys	updateProcThreadAttribute(attrlist *_PROC_THREAD_ATTRIBUTE_LIST, flags uint32, attr uintptr, value unsafe.Pointer, size uintptr, prevvalue unsafe.Pointer, returnedsize *uintptr) (err error) = UpdateProcThreadAttribute
+//sys	getFinalPathNameByHandle(file Handle, filePath *uint16, filePathSize uint32, flags uint32) (n uint32, err error) [n == 0 || n >= filePathSize] = kernel32.GetFinalPathNameByHandleW
 
 // syscall interface implementation for other packages
 
@@ -476,11 +510,6 @@
 	case 2:
 		w = FILE_END
 	}
-	// use GetFileType to check pipe, pipe can't do seek
-	ft, _ := GetFileType(fd)
-	if ft == FILE_TYPE_PIPE {
-		return 0, ESPIPE
-	}
 	err = setFilePointerEx(fd, offset, &newoffset, w)
 	return
 }
@@ -504,11 +533,21 @@
 
 func Getwd() (wd string, err error) {
 	b := make([]uint16, 300)
-	n, e := GetCurrentDirectory(uint32(len(b)), &b[0])
-	if e != nil {
-		return "", e
+	// The path of the current directory may not fit in the initial 300-word
+	// buffer when long path support is enabled. The current directory may also
+	// change between subsequent calls of GetCurrentDirectory. As a result, we
+	// need to retry the call in a loop until the current directory fits, each
+	// time with a bigger buffer.
+	for {
+		n, e := GetCurrentDirectory(uint32(len(b)), &b[0])
+		if e != nil {
+			return "", e
+		}
+		if int(n) <= len(b) {
+			return UTF16ToString(b[:n]), nil
+		}
+		b = make([]uint16, n)
 	}
-	return string(utf16.Decode(b[0:n])), nil
 }
 
 func Chdir(path string) (err error) {
@@ -562,7 +601,7 @@
 	if e != nil {
 		return "", e
 	}
-	return string(utf16.Decode(b[0:n])), nil
+	return UTF16ToString(b[:n]), nil
 }
 
 func Ftruncate(fd Handle, length int64) (err error) {
@@ -618,11 +657,20 @@
 		return e
 	}
 	defer Close(h)
-	a := NsecToFiletime(tv[0].Nanoseconds())
-	w := NsecToFiletime(tv[1].Nanoseconds())
+	a := Filetime{}
+	w := Filetime{}
+	if tv[0].Nanoseconds() != 0 {
+		a = NsecToFiletime(tv[0].Nanoseconds())
+	}
+	if tv[0].Nanoseconds() != 0 {
+		w = NsecToFiletime(tv[1].Nanoseconds())
+	}
 	return SetFileTime(h, nil, &a, &w)
 }
 
+// This matches the value in os/file_windows.go.
+const _UTIME_OMIT = -1
+
 func UtimesNano(path string, ts []Timespec) (err error) {
 	if len(ts) != 2 {
 		return EINVAL
@@ -638,8 +686,14 @@
 		return e
 	}
 	defer Close(h)
-	a := NsecToFiletime(TimespecToNsec(ts[0]))
-	w := NsecToFiletime(TimespecToNsec(ts[1]))
+	a := Filetime{}
+	w := Filetime{}
+	if ts[0].Nsec != _UTIME_OMIT {
+		a = NsecToFiletime(TimespecToNsec(ts[0]))
+	}
+	if ts[1].Nsec != _UTIME_OMIT {
+		w = NsecToFiletime(TimespecToNsec(ts[1]))
+	}
 	return SetFileTime(h, nil, &a, &w)
 }
 
@@ -840,8 +894,7 @@
 		for n < len(pp.Path) && pp.Path[n] != 0 {
 			n++
 		}
-		bytes := (*[len(pp.Path)]byte)(unsafe.Pointer(&pp.Path[0]))[0:n:n]
-		sa.Name = string(bytes)
+		sa.Name = string(unsafe.Slice((*byte)(unsafe.Pointer(&pp.Path[0])), n))
 		return sa, nil
 
 	case AF_INET:
@@ -1178,8 +1231,47 @@
 	return int(pe.ParentProcessID)
 }
 
+func fdpath(fd Handle, buf []uint16) ([]uint16, error) {
+	const (
+		FILE_NAME_NORMALIZED = 0
+		VOLUME_NAME_DOS      = 0
+	)
+	for {
+		n, err := getFinalPathNameByHandle(fd, &buf[0], uint32(len(buf)), FILE_NAME_NORMALIZED|VOLUME_NAME_DOS)
+		if err == nil {
+			buf = buf[:n]
+			break
+		}
+		if err != _ERROR_NOT_ENOUGH_MEMORY {
+			return nil, err
+		}
+		buf = append(buf, make([]uint16, n-uint32(len(buf)))...)
+	}
+	return buf, nil
+}
+
+func Fchdir(fd Handle) (err error) {
+	var buf [MAX_PATH + 1]uint16
+	path, err := fdpath(fd, buf[:])
+	if err != nil {
+		return err
+	}
+	// When using VOLUME_NAME_DOS, the path is always pefixed by "\\?\".
+	// That prefix tells the Windows APIs to disable all string parsing and to send
+	// the string that follows it straight to the file system.
+	// Although SetCurrentDirectory and GetCurrentDirectory do support the "\\?\" prefix,
+	// some other Windows APIs don't. If the prefix is not removed here, it will leak
+	// to Getwd, and we don't want such a general-purpose function to always return a
+	// path with the "\\?\" prefix after Fchdir is called.
+	// The downside is that APIs that do support it will parse the path and try to normalize it,
+	// when it's already normalized.
+	if len(path) >= 4 && path[0] == '\\' && path[1] == '\\' && path[2] == '?' && path[3] == '\\' {
+		path = path[4:]
+	}
+	return SetCurrentDirectory(&path[0])
+}
+
 // TODO(brainman): fix all needed for os
-func Fchdir(fd Handle) (err error)             { return EWINDOWS }
 func Link(oldpath, newpath string) (err error) { return EWINDOWS }
 func Symlink(path, link string) (err error)    { return EWINDOWS }
 
diff --git a/src/syscall/syscall_windows_test.go b/src/syscall/syscall_windows_test.go
index 3b56721..81285e9 100644
--- a/src/syscall/syscall_windows_test.go
+++ b/src/syscall/syscall_windows_test.go
@@ -37,6 +37,16 @@
 	}
 }
 
+func TestComputerName(t *testing.T) {
+	name, err := syscall.ComputerName()
+	if err != nil {
+		t.Fatalf("ComputerName failed: %v", err)
+	}
+	if len(name) == 0 {
+		t.Error("ComputerName returned empty string")
+	}
+}
+
 func TestWin32finddata(t *testing.T) {
 	dir := t.TempDir()
 
@@ -169,3 +179,55 @@
 		t.Fatalf("c program output is wrong: got %q, want %q", have, want)
 	}
 }
+
+func TestGetwd_DoesNotPanicWhenPathIsLong(t *testing.T) {
+	// Regression test for https://github.com/golang/go/issues/60051.
+
+	// The length of a filename is also limited, so we can't reproduce the
+	// crash by creating a single directory with a very long name; we need two
+	// layers.
+	a200 := strings.Repeat("a", 200)
+	dirname := filepath.Join(t.TempDir(), a200, a200)
+
+	err := os.MkdirAll(dirname, 0o700)
+	if err != nil {
+		t.Skipf("MkdirAll failed: %v", err)
+	}
+	err = os.Chdir(dirname)
+	if err != nil {
+		t.Skipf("Chdir failed: %v", err)
+	}
+	// Change out of the temporary directory so that we don't inhibit its
+	// removal during test cleanup.
+	defer os.Chdir(`\`)
+
+	syscall.Getwd()
+}
+
+func FuzzUTF16FromString(f *testing.F) {
+	f.Add("hi")           // ASCII
+	f.Add("â")            // latin1
+	f.Add("ねこ")           // plane 0
+	f.Add("😃")            // extra Plane 0
+	f.Add("\x90")         // invalid byte
+	f.Add("\xe3\x81")     // truncated
+	f.Add("\xe3\xc1\x81") // invalid middle byte
+
+	f.Fuzz(func(t *testing.T, tst string) {
+		res, err := syscall.UTF16FromString(tst)
+		if err != nil {
+			if strings.Contains(tst, "\x00") {
+				t.Skipf("input %q contains a NUL byte", tst)
+			}
+			t.Fatalf("UTF16FromString(%q): %v", tst, err)
+		}
+		t.Logf("UTF16FromString(%q) = %04x", tst, res)
+
+		if len(res) < 1 || res[len(res)-1] != 0 {
+			t.Fatalf("missing NUL terminator")
+		}
+		if len(res) > len(tst)+1 {
+			t.Fatalf("len(%04x) > len(%q)+1", res, tst)
+		}
+	})
+}
diff --git a/src/syscall/tables_wasip1.go b/src/syscall/tables_wasip1.go
new file mode 100644
index 0000000..973a56e
--- /dev/null
+++ b/src/syscall/tables_wasip1.go
@@ -0,0 +1,204 @@
+// Copyright 2023 The Go 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:build wasip1
+
+package syscall
+
+import "runtime"
+
+// TODO: Auto-generate some day. (Hard-coded in binaries so not likely to change.)
+const (
+	E2BIG           Errno = 1
+	EACCES          Errno = 2
+	EADDRINUSE      Errno = 3
+	EADDRNOTAVAIL   Errno = 4
+	EAFNOSUPPORT    Errno = 5
+	EAGAIN          Errno = 6
+	EALREADY        Errno = 7
+	EBADF           Errno = 8
+	EBADMSG         Errno = 9
+	EBUSY           Errno = 10
+	ECANCELED       Errno = 11
+	ECHILD          Errno = 12
+	ECONNABORTED    Errno = 13
+	ECONNREFUSED    Errno = 14
+	ECONNRESET      Errno = 15
+	EDEADLK         Errno = 16
+	EDESTADDRREQ    Errno = 17
+	EDOM            Errno = 18
+	EDQUOT          Errno = 19
+	EEXIST          Errno = 20
+	EFAULT          Errno = 21
+	EFBIG           Errno = 22
+	EHOSTUNREACH    Errno = 23
+	EIDRM           Errno = 24
+	EILSEQ          Errno = 25
+	EINPROGRESS     Errno = 26
+	EINTR           Errno = 27
+	EINVAL          Errno = 28
+	EIO             Errno = 29
+	EISCONN         Errno = 30
+	EISDIR          Errno = 31
+	ELOOP           Errno = 32
+	EMFILE          Errno = 33
+	EMLINK          Errno = 34
+	EMSGSIZE        Errno = 35
+	EMULTIHOP       Errno = 36
+	ENAMETOOLONG    Errno = 37
+	ENETDOWN        Errno = 38
+	ENETRESET       Errno = 39
+	ENETUNREACH     Errno = 40
+	ENFILE          Errno = 41
+	ENOBUFS         Errno = 42
+	ENODEV          Errno = 43
+	ENOENT          Errno = 44
+	ENOEXEC         Errno = 45
+	ENOLCK          Errno = 46
+	ENOLINK         Errno = 47
+	ENOMEM          Errno = 48
+	ENOMSG          Errno = 49
+	ENOPROTOOPT     Errno = 50
+	ENOSPC          Errno = 51
+	ENOSYS          Errno = 52
+	ENOTCONN        Errno = 53
+	ENOTDIR         Errno = 54
+	ENOTEMPTY       Errno = 55
+	ENOTRECOVERABLE Errno = 56
+	ENOTSOCK        Errno = 57
+	ENOTSUP         Errno = 58
+	ENOTTY          Errno = 59
+	ENXIO           Errno = 60
+	EOVERFLOW       Errno = 61
+	EOWNERDEAD      Errno = 62
+	EPERM           Errno = 63
+	EPIPE           Errno = 64
+	EPROTO          Errno = 65
+	EPROTONOSUPPORT Errno = 66
+	EPROTOTYPE      Errno = 67
+	ERANGE          Errno = 68
+	EROFS           Errno = 69
+	ESPIPE          Errno = 70
+	ESRCH           Errno = 71
+	ESTALE          Errno = 72
+	ETIMEDOUT       Errno = 73
+	ETXTBSY         Errno = 74
+	EXDEV           Errno = 75
+	ENOTCAPABLE     Errno = 76
+	// needed by src/net/error_unix_test.go
+	EOPNOTSUPP = ENOTSUP
+)
+
+// TODO: Auto-generate some day. (Hard-coded in binaries so not likely to change.)
+var errorstr = [...]string{
+	E2BIG:           "Argument list too long",
+	EACCES:          "Permission denied",
+	EADDRINUSE:      "Address already in use",
+	EADDRNOTAVAIL:   "Address not available",
+	EAFNOSUPPORT:    "Address family not supported by protocol family",
+	EAGAIN:          "Try again",
+	EALREADY:        "Socket already connected",
+	EBADF:           "Bad file number",
+	EBADMSG:         "Trying to read unreadable message",
+	EBUSY:           "Device or resource busy",
+	ECANCELED:       "Operation canceled.",
+	ECHILD:          "No child processes",
+	ECONNABORTED:    "Connection aborted",
+	ECONNREFUSED:    "Connection refused",
+	ECONNRESET:      "Connection reset by peer",
+	EDEADLK:         "Deadlock condition",
+	EDESTADDRREQ:    "Destination address required",
+	EDOM:            "Math arg out of domain of func",
+	EDQUOT:          "Quota exceeded",
+	EEXIST:          "File exists",
+	EFAULT:          "Bad address",
+	EFBIG:           "File too large",
+	EHOSTUNREACH:    "Host is unreachable",
+	EIDRM:           "Identifier removed",
+	EILSEQ:          "EILSEQ",
+	EINPROGRESS:     "Connection already in progress",
+	EINTR:           "Interrupted system call",
+	EINVAL:          "Invalid argument",
+	EIO:             "I/O error",
+	EISCONN:         "Socket is already connected",
+	EISDIR:          "Is a directory",
+	ELOOP:           "Too many symbolic links",
+	EMFILE:          "Too many open files",
+	EMLINK:          "Too many links",
+	EMSGSIZE:        "Message too long",
+	EMULTIHOP:       "Multihop attempted",
+	ENAMETOOLONG:    "File name too long",
+	ENETDOWN:        "Network interface is not configured",
+	ENETRESET:       "Network dropped connection on reset",
+	ENETUNREACH:     "Network is unreachable",
+	ENFILE:          "File table overflow",
+	ENOBUFS:         "No buffer space available",
+	ENODEV:          "No such device",
+	ENOENT:          "No such file or directory",
+	ENOEXEC:         "Exec format error",
+	ENOLCK:          "No record locks available",
+	ENOLINK:         "The link has been severed",
+	ENOMEM:          "Out of memory",
+	ENOMSG:          "No message of desired type",
+	ENOPROTOOPT:     "Protocol not available",
+	ENOSPC:          "No space left on device",
+	ENOSYS:          "Not implemented on " + runtime.GOOS,
+	ENOTCONN:        "Socket is not connected",
+	ENOTDIR:         "Not a directory",
+	ENOTEMPTY:       "Directory not empty",
+	ENOTRECOVERABLE: "State not recoverable",
+	ENOTSOCK:        "Socket operation on non-socket",
+	ENOTSUP:         "Not supported",
+	ENOTTY:          "Not a typewriter",
+	ENXIO:           "No such device or address",
+	EOVERFLOW:       "Value too large for defined data type",
+	EOWNERDEAD:      "Owner died",
+	EPERM:           "Operation not permitted",
+	EPIPE:           "Broken pipe",
+	EPROTO:          "Protocol error",
+	EPROTONOSUPPORT: "Unknown protocol",
+	EPROTOTYPE:      "Protocol wrong type for socket",
+	ERANGE:          "Math result not representable",
+	EROFS:           "Read-only file system",
+	ESPIPE:          "Illegal seek",
+	ESRCH:           "No such process",
+	ESTALE:          "Stale file handle",
+	ETIMEDOUT:       "Connection timed out",
+	ETXTBSY:         "Text file busy",
+	EXDEV:           "Cross-device link",
+	ENOTCAPABLE:     "Capabilities insufficient",
+}
+
+// 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.
+//
+// We set both noinline and nosplit to reduce code size, this function has many
+// call sites in the syscall package, inlining it causes a significant increase
+// of the compiled code; the function call ultimately does not make a difference
+// in the performance of syscall functions since the time is dominated by calls
+// to the imports and path resolution.
+//
+//go:noinline
+//go:nosplit
+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
+}
diff --git a/src/syscall/timestruct.go b/src/syscall/timestruct.go
index 8a03171..4fca63c 100644
--- a/src/syscall/timestruct.go
+++ b/src/syscall/timestruct.go
@@ -2,11 +2,11 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build unix || (js && wasm)
+//go:build unix || (js && wasm) || wasip1
 
 package syscall
 
-// TimespecToNSec returns the time stored in ts as nanoseconds.
+// TimespecToNsec returns the time stored in ts as nanoseconds.
 func TimespecToNsec(ts Timespec) int64 { return ts.Nano() }
 
 // NsecToTimespec converts a number of nanoseconds into a Timespec.
diff --git a/src/syscall/wtf8_windows.go b/src/syscall/wtf8_windows.go
new file mode 100644
index 0000000..f166021
--- /dev/null
+++ b/src/syscall/wtf8_windows.go
@@ -0,0 +1,92 @@
+// Copyright 2023 The Go 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 UTF-16 strings can contain unpaired surrogates, which can't be
+// decoded into a valid UTF-8 string. This file defines a set of functions
+// that can be used to encode and decode potentially ill-formed UTF-16 strings
+// by using the [the WTF-8 encoding](https://simonsapin.github.io/wtf-8/).
+//
+// WTF-8 is a strict superset of UTF-8, i.e. any string that is
+// well-formed in UTF-8 is also well-formed in WTF-8 and the content
+// is unchanged. Also, the conversion never fails and is lossless.
+//
+// The benefit of using WTF-8 instead of UTF-8 when decoding a UTF-16 string
+// is that the conversion is lossless even for ill-formed UTF-16 strings.
+// This property allows to read an ill-formed UTF-16 string, convert it
+// to a Go string, and convert it back to the same original UTF-16 string.
+//
+// See go.dev/issues/59971 for more info.
+
+package syscall
+
+import (
+	"unicode/utf16"
+	"unicode/utf8"
+)
+
+const (
+	surr1 = 0xd800
+	surr2 = 0xdc00
+	surr3 = 0xe000
+
+	tx    = 0b10000000
+	t3    = 0b11100000
+	maskx = 0b00111111
+	mask3 = 0b00001111
+
+	rune1Max = 1<<7 - 1
+	rune2Max = 1<<11 - 1
+)
+
+// encodeWTF16 returns the potentially ill-formed
+// UTF-16 encoding of s.
+func encodeWTF16(s string, buf []uint16) []uint16 {
+	for i := 0; i < len(s); {
+		// Cannot use 'for range s' because it expects valid
+		// UTF-8 runes.
+		r, size := utf8.DecodeRuneInString(s[i:])
+		if r == utf8.RuneError {
+			// Check if s[i:] contains a valid WTF-8 encoded surrogate.
+			if sc := s[i:]; len(sc) >= 3 && sc[0] == 0xED && 0xA0 <= sc[1] && sc[1] <= 0xBF && 0x80 <= sc[2] && sc[2] <= 0xBF {
+				r = rune(sc[0]&mask3)<<12 + rune(sc[1]&maskx)<<6 + rune(sc[2]&maskx)
+				buf = append(buf, uint16(r))
+				i += 3
+				continue
+			}
+		}
+		i += size
+		buf = utf16.AppendRune(buf, r)
+	}
+	return buf
+}
+
+// decodeWTF16 returns the WTF-8 encoding of
+// the potentially ill-formed UTF-16 s.
+func decodeWTF16(s []uint16, buf []byte) []byte {
+	for i := 0; i < len(s); i++ {
+		var ar rune
+		switch r := s[i]; {
+		case r < surr1, surr3 <= r:
+			// normal rune
+			ar = rune(r)
+		case surr1 <= r && r < surr2 && i+1 < len(s) &&
+			surr2 <= s[i+1] && s[i+1] < surr3:
+			// valid surrogate sequence
+			ar = utf16.DecodeRune(rune(r), rune(s[i+1]))
+			i++
+		default:
+			// WTF-8 fallback.
+			// This only handles the 3-byte case of utf8.AppendRune,
+			// as surrogates always fall in that case.
+			ar = rune(r)
+			if ar > utf8.MaxRune {
+				ar = utf8.RuneError
+			}
+			buf = append(buf, t3|byte(ar>>12), tx|byte(ar>>6)&maskx, tx|byte(ar)&maskx)
+			continue
+		}
+		buf = utf8.AppendRune(buf, ar)
+	}
+	return buf
+}
diff --git a/src/syscall/wtf8_windows_test.go b/src/syscall/wtf8_windows_test.go
new file mode 100644
index 0000000..077f718
--- /dev/null
+++ b/src/syscall/wtf8_windows_test.go
@@ -0,0 +1,200 @@
+// Copyright 2023 The Go Authors. 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"
+	"slices"
+	"syscall"
+	"testing"
+	"unicode/utf16"
+	"unicode/utf8"
+	"unsafe"
+)
+
+var wtf8tests = []struct {
+	str  string
+	wstr []uint16
+}{
+	{
+		str:  "\x00",
+		wstr: []uint16{0x00},
+	},
+	{
+		str:  "\x5C",
+		wstr: []uint16{0x5C},
+	},
+	{
+		str:  "\x7F",
+		wstr: []uint16{0x7F},
+	},
+
+	// 2-byte
+	{
+		str:  "\xC2\x80",
+		wstr: []uint16{0x80},
+	},
+	{
+		str:  "\xD7\x8A",
+		wstr: []uint16{0x05CA},
+	},
+	{
+		str:  "\xDF\xBF",
+		wstr: []uint16{0x07FF},
+	},
+
+	// 3-byte
+	{
+		str:  "\xE0\xA0\x80",
+		wstr: []uint16{0x0800},
+	},
+	{
+		str:  "\xE2\xB0\xBC",
+		wstr: []uint16{0x2C3C},
+	},
+	{
+		str:  "\xEF\xBF\xBF",
+		wstr: []uint16{0xFFFF},
+	},
+	// unmatched surrogate halves
+	// high surrogates: 0xD800 to 0xDBFF
+	{
+		str:  "\xED\xA0\x80",
+		wstr: []uint16{0xD800},
+	},
+	{
+		// "High surrogate followed by another high surrogate"
+		str:  "\xED\xA0\x80\xED\xA0\x80",
+		wstr: []uint16{0xD800, 0xD800},
+	},
+	{
+		// "High surrogate followed by a symbol that is not a surrogate"
+		str:  string([]byte{0xED, 0xA0, 0x80, 0xA}),
+		wstr: []uint16{0xD800, 0xA},
+	},
+	{
+		// "Unmatched high surrogate, followed by a surrogate pair, followed by an unmatched high surrogate"
+		str:  string([]byte{0xED, 0xA0, 0x80, 0xF0, 0x9D, 0x8C, 0x86, 0xED, 0xA0, 0x80}),
+		wstr: []uint16{0xD800, 0xD834, 0xDF06, 0xD800},
+	},
+	{
+		str:  "\xED\xA6\xAF",
+		wstr: []uint16{0xD9AF},
+	},
+	{
+		str:  "\xED\xAF\xBF",
+		wstr: []uint16{0xDBFF},
+	},
+	// low surrogates: 0xDC00 to 0xDFFF
+	{
+		str:  "\xED\xB0\x80",
+		wstr: []uint16{0xDC00},
+	},
+	{
+		// "Low surrogate followed by another low surrogate"
+		str:  "\xED\xB0\x80\xED\xB0\x80",
+		wstr: []uint16{0xDC00, 0xDC00},
+	},
+	{
+		// "Low surrogate followed by a symbol that is not a surrogate"
+		str:  string([]byte{0xED, 0xB0, 0x80, 0xA}),
+		wstr: []uint16{0xDC00, 0xA},
+	},
+	{
+		// "Unmatched low surrogate, followed by a surrogate pair, followed by an unmatched low surrogate"
+		str:  string([]byte{0xED, 0xB0, 0x80, 0xF0, 0x9D, 0x8C, 0x86, 0xED, 0xB0, 0x80}),
+		wstr: []uint16{0xDC00, 0xD834, 0xDF06, 0xDC00},
+	},
+	{
+		str:  "\xED\xBB\xAE",
+		wstr: []uint16{0xDEEE},
+	},
+	{
+		str:  "\xED\xBF\xBF",
+		wstr: []uint16{0xDFFF},
+	},
+
+	// 4-byte
+	{
+		str:  "\xF0\x90\x80\x80",
+		wstr: []uint16{0xD800, 0xDC00},
+	},
+	{
+		str:  "\xF0\x9D\x8C\x86",
+		wstr: []uint16{0xD834, 0xDF06},
+	},
+	{
+		str:  "\xF4\x8F\xBF\xBF",
+		wstr: []uint16{0xDBFF, 0xDFFF},
+	},
+}
+
+func TestWTF16Rountrip(t *testing.T) {
+	for _, tt := range wtf8tests {
+		t.Run(fmt.Sprintf("%X", tt.str), func(t *testing.T) {
+			got := syscall.EncodeWTF16(tt.str, nil)
+			got2 := string(syscall.DecodeWTF16(got, nil))
+			if got2 != tt.str {
+				t.Errorf("got:\n%s\nwant:\n%s", got2, tt.str)
+			}
+		})
+	}
+}
+
+func TestWTF16Golden(t *testing.T) {
+	for _, tt := range wtf8tests {
+		t.Run(fmt.Sprintf("%X", tt.str), func(t *testing.T) {
+			got := syscall.EncodeWTF16(tt.str, nil)
+			if !slices.Equal(got, tt.wstr) {
+				t.Errorf("got:\n%v\nwant:\n%v", got, tt.wstr)
+			}
+		})
+	}
+}
+
+func FuzzEncodeWTF16(f *testing.F) {
+	for _, tt := range wtf8tests {
+		f.Add(tt.str)
+	}
+	f.Fuzz(func(t *testing.T, b string) {
+		// test that there are no panics
+		got := syscall.EncodeWTF16(b, nil)
+		syscall.DecodeWTF16(got, nil)
+		if utf8.ValidString(b) {
+			// if the input is a valid UTF-8 string, then
+			// test that syscall.EncodeWTF16 behaves as
+			// utf16.Encode
+			want := utf16.Encode([]rune(b))
+			if !slices.Equal(got, want) {
+				t.Errorf("got:\n%v\nwant:\n%v", got, want)
+			}
+		}
+	})
+}
+
+func FuzzDecodeWTF16(f *testing.F) {
+	for _, tt := range wtf8tests {
+		b := unsafe.Slice((*uint8)(unsafe.Pointer(unsafe.SliceData(tt.wstr))), len(tt.wstr)*2)
+		f.Add(b)
+	}
+	f.Fuzz(func(t *testing.T, b []byte) {
+		u16 := unsafe.Slice((*uint16)(unsafe.Pointer(unsafe.SliceData(b))), len(b)/2)
+		got := syscall.DecodeWTF16(u16, nil)
+		if utf8.Valid(got) {
+			// if the input is a valid UTF-8 string, then
+			// test that syscall.DecodeWTF16 behaves as
+			// utf16.Decode
+			want := utf16.Decode(u16)
+			if string(got) != string(want) {
+				t.Errorf("got:\n%s\nwant:\n%s", string(got), string(want))
+			}
+		}
+		// WTF-8 should always roundtrip
+		got2 := syscall.EncodeWTF16(string(got), nil)
+		if !slices.Equal(got2, u16) {
+			t.Errorf("got:\n%v\nwant:\n%v", got2, u16)
+		}
+	})
+}
diff --git a/src/syscall/zsyscall_aix_ppc64.go b/src/syscall/zsyscall_aix_ppc64.go
index c9e2ede..fb36fd3 100644
--- a/src/syscall/zsyscall_aix_ppc64.go
+++ b/src/syscall/zsyscall_aix_ppc64.go
@@ -658,6 +658,16 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func ptrace64Ptr(request int, id int64, addr int64, data int, buff unsafe.Pointer) (err error) {
+	_, _, e1 := syscall6(uintptr(unsafe.Pointer(&libc_ptrace64)), 5, uintptr(request), uintptr(id), uintptr(addr), uintptr(data), uintptr(buff), 0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func Acct(path string) (err error) {
 	var _p0 *byte
 	_p0, err = BytePtrFromString(path)
@@ -1261,7 +1271,7 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Setrlimit(which int, lim *Rlimit) (err error) {
+func setrlimit(which int, lim *Rlimit) (err error) {
 	_, _, e1 := rawSyscall6(uintptr(unsafe.Pointer(&libc_Setrlimit)), 2, uintptr(which), uintptr(unsafe.Pointer(lim)), 0, 0, 0, 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
diff --git a/src/syscall/zsyscall_darwin_amd64.go b/src/syscall/zsyscall_darwin_amd64.go
index 6b3fff3..83680b3 100644
--- a/src/syscall/zsyscall_darwin_amd64.go
+++ b/src/syscall/zsyscall_darwin_amd64.go
@@ -1480,7 +1480,7 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Setrlimit(which int, lim *Rlimit) (err error) {
+func setrlimit(which int, lim *Rlimit) (err error) {
 	_, _, e1 := rawSyscall(abi.FuncPCABI0(libc_setrlimit_trampoline), uintptr(which), uintptr(unsafe.Pointer(lim)), 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
@@ -2022,3 +2022,14 @@
 func libc_ptrace_trampoline()
 
 //go:cgo_import_dynamic libc_ptrace ptrace "/usr/lib/libSystem.B.dylib"
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+//go:nosplit
+func ptrace1Ptr(request int, pid int, addr unsafe.Pointer, data uintptr) (err error) {
+	_, _, e1 := syscall6(abi.FuncPCABI0(libc_ptrace_trampoline), uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
diff --git a/src/syscall/zsyscall_darwin_arm64.go b/src/syscall/zsyscall_darwin_arm64.go
index 6160144..08da237 100644
--- a/src/syscall/zsyscall_darwin_arm64.go
+++ b/src/syscall/zsyscall_darwin_arm64.go
@@ -1480,7 +1480,7 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Setrlimit(which int, lim *Rlimit) (err error) {
+func setrlimit(which int, lim *Rlimit) (err error) {
 	_, _, e1 := rawSyscall(abi.FuncPCABI0(libc_setrlimit_trampoline), uintptr(which), uintptr(unsafe.Pointer(lim)), 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
@@ -2022,3 +2022,14 @@
 func libc_ptrace_trampoline()
 
 //go:cgo_import_dynamic libc_ptrace ptrace "/usr/lib/libSystem.B.dylib"
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+//go:nosplit
+func ptrace1Ptr(request int, pid int, addr unsafe.Pointer, data uintptr) (err error) {
+	_, _, e1 := syscall6(abi.FuncPCABI0(libc_ptrace_trampoline), uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
diff --git a/src/syscall/zsyscall_dragonfly_amd64.go b/src/syscall/zsyscall_dragonfly_amd64.go
index 5d5576d..a591682 100644
--- a/src/syscall/zsyscall_dragonfly_amd64.go
+++ b/src/syscall/zsyscall_dragonfly_amd64.go
@@ -1066,7 +1066,7 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Setrlimit(which int, lim *Rlimit) (err error) {
+func setrlimit(which int, lim *Rlimit) (err error) {
 	_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
diff --git a/src/syscall/zsyscall_freebsd_386.go b/src/syscall/zsyscall_freebsd_386.go
index 3839dd7..e729adc 100644
--- a/src/syscall/zsyscall_freebsd_386.go
+++ b/src/syscall/zsyscall_freebsd_386.go
@@ -1052,7 +1052,7 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Setrlimit(which int, lim *Rlimit) (err error) {
+func setrlimit(which int, lim *Rlimit) (err error) {
 	_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
diff --git a/src/syscall/zsyscall_freebsd_amd64.go b/src/syscall/zsyscall_freebsd_amd64.go
index 1092302..df0b817 100644
--- a/src/syscall/zsyscall_freebsd_amd64.go
+++ b/src/syscall/zsyscall_freebsd_amd64.go
@@ -1052,7 +1052,7 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Setrlimit(which int, lim *Rlimit) (err error) {
+func setrlimit(which int, lim *Rlimit) (err error) {
 	_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
diff --git a/src/syscall/zsyscall_freebsd_arm.go b/src/syscall/zsyscall_freebsd_arm.go
index 53e48d5..abd4bf1 100644
--- a/src/syscall/zsyscall_freebsd_arm.go
+++ b/src/syscall/zsyscall_freebsd_arm.go
@@ -1052,7 +1052,7 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Setrlimit(which int, lim *Rlimit) (err error) {
+func setrlimit(which int, lim *Rlimit) (err error) {
 	_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
diff --git a/src/syscall/zsyscall_freebsd_arm64.go b/src/syscall/zsyscall_freebsd_arm64.go
index 320ce1f..b86cfb5 100644
--- a/src/syscall/zsyscall_freebsd_arm64.go
+++ b/src/syscall/zsyscall_freebsd_arm64.go
@@ -1052,7 +1052,7 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Setrlimit(which int, lim *Rlimit) (err error) {
+func setrlimit(which int, lim *Rlimit) (err error) {
 	_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
diff --git a/src/syscall/zsyscall_freebsd_riscv64.go b/src/syscall/zsyscall_freebsd_riscv64.go
index a63eafb..ad195e8 100644
--- a/src/syscall/zsyscall_freebsd_riscv64.go
+++ b/src/syscall/zsyscall_freebsd_riscv64.go
@@ -1052,7 +1052,7 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Setrlimit(which int, lim *Rlimit) (err error) {
+func setrlimit(which int, lim *Rlimit) (err error) {
 	_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
diff --git a/src/syscall/zsyscall_linux_386.go b/src/syscall/zsyscall_linux_386.go
index 6a646fb..8e0de44 100644
--- a/src/syscall/zsyscall_linux_386.go
+++ b/src/syscall/zsyscall_linux_386.go
@@ -210,6 +210,16 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func ptracePtr(request int, pid int, addr uintptr, data unsafe.Pointer) (err error) {
+	_, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) {
 	var _p0 *byte
 	_p0, err = BytePtrFromString(arg)
@@ -691,7 +701,7 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) {
+func prlimit1(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) {
 	_, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
@@ -1391,7 +1401,7 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func setrlimit(resource int, rlim *rlimit32) (err error) {
+func setrlimit1(resource int, rlim *rlimit32) (err error) {
 	_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
diff --git a/src/syscall/zsyscall_linux_amd64.go b/src/syscall/zsyscall_linux_amd64.go
index d5b0099..c3ee372 100644
--- a/src/syscall/zsyscall_linux_amd64.go
+++ b/src/syscall/zsyscall_linux_amd64.go
@@ -210,6 +210,16 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func ptracePtr(request int, pid int, addr uintptr, data unsafe.Pointer) (err error) {
+	_, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) {
 	var _p0 *byte
 	_p0, err = BytePtrFromString(arg)
@@ -691,7 +701,7 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) {
+func prlimit1(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) {
 	_, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
@@ -1322,7 +1332,7 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Setrlimit(resource int, rlim *Rlimit) (err error) {
+func setrlimit(resource int, rlim *Rlimit) (err error) {
 	_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
diff --git a/src/syscall/zsyscall_linux_arm.go b/src/syscall/zsyscall_linux_arm.go
index 69f811a..a72355f 100644
--- a/src/syscall/zsyscall_linux_arm.go
+++ b/src/syscall/zsyscall_linux_arm.go
@@ -210,6 +210,16 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func ptracePtr(request int, pid int, addr uintptr, data unsafe.Pointer) (err error) {
+	_, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) {
 	var _p0 *byte
 	_p0, err = BytePtrFromString(arg)
@@ -691,7 +701,7 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) {
+func prlimit1(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) {
 	_, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
@@ -1594,7 +1604,7 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func setrlimit(resource int, rlim *rlimit32) (err error) {
+func setrlimit1(resource int, rlim *rlimit32) (err error) {
 	_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
diff --git a/src/syscall/zsyscall_linux_arm64.go b/src/syscall/zsyscall_linux_arm64.go
index 7655ccb..b7c7a38 100644
--- a/src/syscall/zsyscall_linux_arm64.go
+++ b/src/syscall/zsyscall_linux_arm64.go
@@ -210,6 +210,16 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func ptracePtr(request int, pid int, addr uintptr, data unsafe.Pointer) (err error) {
+	_, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) {
 	var _p0 *byte
 	_p0, err = BytePtrFromString(arg)
@@ -691,7 +701,7 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) {
+func prlimit1(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) {
 	_, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
@@ -1292,7 +1302,7 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func setrlimit(resource int, rlim *Rlimit) (err error) {
+func setrlimit1(resource int, rlim *Rlimit) (err error) {
 	_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
diff --git a/src/syscall/zsyscall_linux_loong64.go b/src/syscall/zsyscall_linux_loong64.go
index abbc19b..51ebfc0 100644
--- a/src/syscall/zsyscall_linux_loong64.go
+++ b/src/syscall/zsyscall_linux_loong64.go
@@ -210,6 +210,16 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func ptracePtr(request int, pid int, addr uintptr, data unsafe.Pointer) (err error) {
+	_, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) {
 	var _p0 *byte
 	_p0, err = BytePtrFromString(arg)
@@ -691,7 +701,7 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) {
+func prlimit1(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) {
 	_, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
diff --git a/src/syscall/zsyscall_linux_mips.go b/src/syscall/zsyscall_linux_mips.go
index 792668c..af75dc7 100644
--- a/src/syscall/zsyscall_linux_mips.go
+++ b/src/syscall/zsyscall_linux_mips.go
@@ -210,6 +210,16 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func ptracePtr(request int, pid int, addr uintptr, data unsafe.Pointer) (err error) {
+	_, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) {
 	var _p0 *byte
 	_p0, err = BytePtrFromString(arg)
@@ -691,7 +701,7 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) {
+func prlimit1(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) {
 	_, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
@@ -1669,7 +1679,7 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func setrlimit(resource int, rlim *rlimit32) (err error) {
+func setrlimit1(resource int, rlim *rlimit32) (err error) {
 	_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
diff --git a/src/syscall/zsyscall_linux_mips64.go b/src/syscall/zsyscall_linux_mips64.go
index 27dbcb8..c667300 100644
--- a/src/syscall/zsyscall_linux_mips64.go
+++ b/src/syscall/zsyscall_linux_mips64.go
@@ -210,6 +210,16 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func ptracePtr(request int, pid int, addr uintptr, data unsafe.Pointer) (err error) {
+	_, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) {
 	var _p0 *byte
 	_p0, err = BytePtrFromString(arg)
@@ -691,7 +701,7 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) {
+func prlimit1(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) {
 	_, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
@@ -1311,7 +1321,7 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Setrlimit(resource int, rlim *Rlimit) (err error) {
+func setrlimit(resource int, rlim *Rlimit) (err error) {
 	_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
diff --git a/src/syscall/zsyscall_linux_mips64le.go b/src/syscall/zsyscall_linux_mips64le.go
index 0362303..407bea7 100644
--- a/src/syscall/zsyscall_linux_mips64le.go
+++ b/src/syscall/zsyscall_linux_mips64le.go
@@ -210,6 +210,16 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func ptracePtr(request int, pid int, addr uintptr, data unsafe.Pointer) (err error) {
+	_, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) {
 	var _p0 *byte
 	_p0, err = BytePtrFromString(arg)
@@ -691,7 +701,7 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) {
+func prlimit1(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) {
 	_, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
@@ -1311,7 +1321,7 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Setrlimit(resource int, rlim *Rlimit) (err error) {
+func setrlimit(resource int, rlim *Rlimit) (err error) {
 	_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
diff --git a/src/syscall/zsyscall_linux_mipsle.go b/src/syscall/zsyscall_linux_mipsle.go
index 5320dfa..7c5ea99 100644
--- a/src/syscall/zsyscall_linux_mipsle.go
+++ b/src/syscall/zsyscall_linux_mipsle.go
@@ -210,6 +210,16 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func ptracePtr(request int, pid int, addr uintptr, data unsafe.Pointer) (err error) {
+	_, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) {
 	var _p0 *byte
 	_p0, err = BytePtrFromString(arg)
@@ -691,7 +701,7 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) {
+func prlimit1(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) {
 	_, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
@@ -1669,7 +1679,7 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func setrlimit(resource int, rlim *rlimit32) (err error) {
+func setrlimit1(resource int, rlim *rlimit32) (err error) {
 	_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
diff --git a/src/syscall/zsyscall_linux_ppc64.go b/src/syscall/zsyscall_linux_ppc64.go
index 61f3063..1e82f4b 100644
--- a/src/syscall/zsyscall_linux_ppc64.go
+++ b/src/syscall/zsyscall_linux_ppc64.go
@@ -210,6 +210,16 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func ptracePtr(request int, pid int, addr uintptr, data unsafe.Pointer) (err error) {
+	_, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) {
 	var _p0 *byte
 	_p0, err = BytePtrFromString(arg)
@@ -691,7 +701,7 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) {
+func prlimit1(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) {
 	_, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
@@ -1384,7 +1394,7 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Setrlimit(resource int, rlim *Rlimit) (err error) {
+func setrlimit(resource int, rlim *Rlimit) (err error) {
 	_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
diff --git a/src/syscall/zsyscall_linux_ppc64le.go b/src/syscall/zsyscall_linux_ppc64le.go
index 3e14ab3..ddc1c81 100644
--- a/src/syscall/zsyscall_linux_ppc64le.go
+++ b/src/syscall/zsyscall_linux_ppc64le.go
@@ -210,6 +210,16 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func ptracePtr(request int, pid int, addr uintptr, data unsafe.Pointer) (err error) {
+	_, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) {
 	var _p0 *byte
 	_p0, err = BytePtrFromString(arg)
@@ -691,7 +701,7 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) {
+func prlimit1(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) {
 	_, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
@@ -1384,7 +1394,7 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Setrlimit(resource int, rlim *Rlimit) (err error) {
+func setrlimit(resource int, rlim *Rlimit) (err error) {
 	_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
diff --git a/src/syscall/zsyscall_linux_riscv64.go b/src/syscall/zsyscall_linux_riscv64.go
index 4a3fa5d..c59cad0 100644
--- a/src/syscall/zsyscall_linux_riscv64.go
+++ b/src/syscall/zsyscall_linux_riscv64.go
@@ -210,6 +210,16 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func ptracePtr(request int, pid int, addr uintptr, data unsafe.Pointer) (err error) {
+	_, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) {
 	var _p0 *byte
 	_p0, err = BytePtrFromString(arg)
@@ -691,7 +701,7 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) {
+func prlimit1(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) {
 	_, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
@@ -1292,7 +1302,7 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Setrlimit(resource int, rlim *Rlimit) (err error) {
+func setrlimit(resource int, rlim *Rlimit) (err error) {
 	_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
diff --git a/src/syscall/zsyscall_linux_s390x.go b/src/syscall/zsyscall_linux_s390x.go
index 1fca71e..29be487 100644
--- a/src/syscall/zsyscall_linux_s390x.go
+++ b/src/syscall/zsyscall_linux_s390x.go
@@ -210,6 +210,16 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func ptracePtr(request int, pid int, addr uintptr, data unsafe.Pointer) (err error) {
+	_, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) {
 	var _p0 *byte
 	_p0, err = BytePtrFromString(arg)
@@ -691,7 +701,7 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) {
+func prlimit1(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) {
 	_, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
@@ -1354,7 +1364,7 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Setrlimit(resource int, rlim *Rlimit) (err error) {
+func setrlimit(resource int, rlim *Rlimit) (err error) {
 	_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
diff --git a/src/syscall/zsyscall_netbsd_386.go b/src/syscall/zsyscall_netbsd_386.go
index 9b92859..e401d02 100644
--- a/src/syscall/zsyscall_netbsd_386.go
+++ b/src/syscall/zsyscall_netbsd_386.go
@@ -1030,7 +1030,7 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Setrlimit(which int, lim *Rlimit) (err error) {
+func setrlimit(which int, lim *Rlimit) (err error) {
 	_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
diff --git a/src/syscall/zsyscall_netbsd_amd64.go b/src/syscall/zsyscall_netbsd_amd64.go
index ac34c00..a4f217b 100644
--- a/src/syscall/zsyscall_netbsd_amd64.go
+++ b/src/syscall/zsyscall_netbsd_amd64.go
@@ -1030,7 +1030,7 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Setrlimit(which int, lim *Rlimit) (err error) {
+func setrlimit(which int, lim *Rlimit) (err error) {
 	_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
diff --git a/src/syscall/zsyscall_netbsd_arm.go b/src/syscall/zsyscall_netbsd_arm.go
index 2be5e7b..1f55614 100644
--- a/src/syscall/zsyscall_netbsd_arm.go
+++ b/src/syscall/zsyscall_netbsd_arm.go
@@ -1030,7 +1030,7 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Setrlimit(which int, lim *Rlimit) (err error) {
+func setrlimit(which int, lim *Rlimit) (err error) {
 	_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
diff --git a/src/syscall/zsyscall_netbsd_arm64.go b/src/syscall/zsyscall_netbsd_arm64.go
index 02a652b..be33fcd 100644
--- a/src/syscall/zsyscall_netbsd_arm64.go
+++ b/src/syscall/zsyscall_netbsd_arm64.go
@@ -1030,7 +1030,7 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Setrlimit(which int, lim *Rlimit) (err error) {
+func setrlimit(which int, lim *Rlimit) (err error) {
 	_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
diff --git a/src/syscall/zsyscall_openbsd_386.go b/src/syscall/zsyscall_openbsd_386.go
index b60af17..714fa7e 100644
--- a/src/syscall/zsyscall_openbsd_386.go
+++ b/src/syscall/zsyscall_openbsd_386.go
@@ -1387,7 +1387,7 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Setrlimit(which int, lim *Rlimit) (err error) {
+func setrlimit(which int, lim *Rlimit) (err error) {
 	_, _, e1 := rawSyscall(abi.FuncPCABI0(libc_setrlimit_trampoline), uintptr(which), uintptr(unsafe.Pointer(lim)), 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
@@ -1844,6 +1844,17 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+//go:nosplit
+func ptracePtr(request int, pid int, addr unsafe.Pointer, data uintptr) (err error) {
+	_, _, e1 := syscall6(abi.FuncPCABI0(libc_ptrace_trampoline), uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func getentropy(p []byte) (err error) {
 	var _p0 unsafe.Pointer
 	if len(p) > 0 {
diff --git a/src/syscall/zsyscall_openbsd_amd64.go b/src/syscall/zsyscall_openbsd_amd64.go
index 8b3e81e..f948d64 100644
--- a/src/syscall/zsyscall_openbsd_amd64.go
+++ b/src/syscall/zsyscall_openbsd_amd64.go
@@ -1387,7 +1387,7 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Setrlimit(which int, lim *Rlimit) (err error) {
+func setrlimit(which int, lim *Rlimit) (err error) {
 	_, _, e1 := rawSyscall(abi.FuncPCABI0(libc_setrlimit_trampoline), uintptr(which), uintptr(unsafe.Pointer(lim)), 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
@@ -1844,6 +1844,17 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+//go:nosplit
+func ptracePtr(request int, pid int, addr unsafe.Pointer, data uintptr) (err error) {
+	_, _, e1 := syscall6(abi.FuncPCABI0(libc_ptrace_trampoline), uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func getentropy(p []byte) (err error) {
 	var _p0 unsafe.Pointer
 	if len(p) > 0 {
diff --git a/src/syscall/zsyscall_openbsd_arm.go b/src/syscall/zsyscall_openbsd_arm.go
index 42d5781..f56fcc4 100644
--- a/src/syscall/zsyscall_openbsd_arm.go
+++ b/src/syscall/zsyscall_openbsd_arm.go
@@ -1387,7 +1387,7 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Setrlimit(which int, lim *Rlimit) (err error) {
+func setrlimit(which int, lim *Rlimit) (err error) {
 	_, _, e1 := rawSyscall(abi.FuncPCABI0(libc_setrlimit_trampoline), uintptr(which), uintptr(unsafe.Pointer(lim)), 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
@@ -1844,6 +1844,17 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+//go:nosplit
+func ptracePtr(request int, pid int, addr unsafe.Pointer, data uintptr) (err error) {
+	_, _, e1 := syscall6(abi.FuncPCABI0(libc_ptrace_trampoline), uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func getentropy(p []byte) (err error) {
 	var _p0 unsafe.Pointer
 	if len(p) > 0 {
diff --git a/src/syscall/zsyscall_openbsd_arm64.go b/src/syscall/zsyscall_openbsd_arm64.go
index 7a5a2c0..c0d8f5c 100644
--- a/src/syscall/zsyscall_openbsd_arm64.go
+++ b/src/syscall/zsyscall_openbsd_arm64.go
@@ -1387,7 +1387,7 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Setrlimit(which int, lim *Rlimit) (err error) {
+func setrlimit(which int, lim *Rlimit) (err error) {
 	_, _, e1 := rawSyscall(abi.FuncPCABI0(libc_setrlimit_trampoline), uintptr(which), uintptr(unsafe.Pointer(lim)), 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
@@ -1844,6 +1844,17 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+//go:nosplit
+func ptracePtr(request int, pid int, addr unsafe.Pointer, data uintptr) (err error) {
+	_, _, e1 := syscall6(abi.FuncPCABI0(libc_ptrace_trampoline), uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func getentropy(p []byte) (err error) {
 	var _p0 unsafe.Pointer
 	if len(p) > 0 {
diff --git a/src/syscall/zsyscall_openbsd_mips64.go b/src/syscall/zsyscall_openbsd_mips64.go
index 2cf8465..2a91c36 100644
--- a/src/syscall/zsyscall_openbsd_mips64.go
+++ b/src/syscall/zsyscall_openbsd_mips64.go
@@ -1039,7 +1039,7 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Setrlimit(which int, lim *Rlimit) (err error) {
+func setrlimit(which int, lim *Rlimit) (err error) {
 	_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
diff --git a/src/syscall/zsyscall_solaris_amd64.go b/src/syscall/zsyscall_solaris_amd64.go
index 19e5ec1..e25db63 100644
--- a/src/syscall/zsyscall_solaris_amd64.go
+++ b/src/syscall/zsyscall_solaris_amd64.go
@@ -962,7 +962,7 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Setrlimit(which int, lim *Rlimit) (err error) {
+func setrlimit(which int, lim *Rlimit) (err error) {
 	_, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&libc_Setrlimit)), 2, uintptr(which), uintptr(unsafe.Pointer(lim)), 0, 0, 0, 0)
 	if e1 != 0 {
 		err = errnoErr(e1)
diff --git a/src/syscall/zsyscall_windows.go b/src/syscall/zsyscall_windows.go
index 61d89f1..68c29d8 100644
--- a/src/syscall/zsyscall_windows.go
+++ b/src/syscall/zsyscall_windows.go
@@ -119,6 +119,7 @@
 	procGetFileAttributesW                 = modkernel32.NewProc("GetFileAttributesW")
 	procGetFileInformationByHandle         = modkernel32.NewProc("GetFileInformationByHandle")
 	procGetFileType                        = modkernel32.NewProc("GetFileType")
+	procGetFinalPathNameByHandleW          = modkernel32.NewProc("GetFinalPathNameByHandleW")
 	procGetFullPathNameW                   = modkernel32.NewProc("GetFullPathNameW")
 	procGetLastError                       = modkernel32.NewProc("GetLastError")
 	procGetLongPathNameW                   = modkernel32.NewProc("GetLongPathNameW")
@@ -128,7 +129,6 @@
 	procGetShortPathNameW                  = modkernel32.NewProc("GetShortPathNameW")
 	procGetStartupInfoW                    = modkernel32.NewProc("GetStartupInfoW")
 	procGetStdHandle                       = modkernel32.NewProc("GetStdHandle")
-	procGetSystemDirectoryW                = modkernel32.NewProc("GetSystemDirectoryW")
 	procGetSystemTimeAsFileTime            = modkernel32.NewProc("GetSystemTimeAsFileTime")
 	procGetTempPathW                       = modkernel32.NewProc("GetTempPathW")
 	procGetTimeZoneInformation             = modkernel32.NewProc("GetTimeZoneInformation")
@@ -780,6 +780,15 @@
 	return
 }
 
+func getFinalPathNameByHandle(file Handle, filePath *uint16, filePathSize uint32, flags uint32) (n uint32, err error) {
+	r0, _, e1 := Syscall6(procGetFinalPathNameByHandleW.Addr(), 4, uintptr(file), uintptr(unsafe.Pointer(filePath)), uintptr(filePathSize), uintptr(flags), 0, 0)
+	n = uint32(r0)
+	if n == 0 || n >= filePathSize {
+		err = errnoErr(e1)
+	}
+	return
+}
+
 func GetFullPathName(path *uint16, buflen uint32, buf *uint16, fname **uint16) (n uint32, err error) {
 	r0, _, e1 := Syscall6(procGetFullPathNameW.Addr(), 4, uintptr(unsafe.Pointer(path)), uintptr(buflen), uintptr(unsafe.Pointer(buf)), uintptr(unsafe.Pointer(fname)), 0, 0)
 	n = uint32(r0)
@@ -866,15 +875,6 @@
 	return
 }
 
-func getSystemDirectory(dir *uint16, dirLen uint32) (len uint32, err error) {
-	r0, _, e1 := Syscall(procGetSystemDirectoryW.Addr(), 2, uintptr(unsafe.Pointer(dir)), uintptr(dirLen), 0)
-	len = uint32(r0)
-	if len == 0 {
-		err = errnoErr(e1)
-	}
-	return
-}
-
 func GetSystemTimeAsFileTime(time *Filetime) {
 	Syscall(procGetSystemTimeAsFileTime.Addr(), 1, uintptr(unsafe.Pointer(time)), 0, 0)
 	return
diff --git a/src/syscall/ztypes_linux_riscv64.go b/src/syscall/ztypes_linux_riscv64.go
index 6ee71eb..f6b9ced 100644
--- a/src/syscall/ztypes_linux_riscv64.go
+++ b/src/syscall/ztypes_linux_riscv64.go
@@ -566,7 +566,7 @@
 	Totalhigh uint64
 	Freehigh  uint64
 	Unit      uint32
-	_         [0]uint8
+	X_f       [0]uint8
 	_         [4]byte
 }
 
diff --git a/src/syscall/ztypes_linux_s390x.go b/src/syscall/ztypes_linux_s390x.go
index 91f5cef..b67877f 100644
--- a/src/syscall/ztypes_linux_s390x.go
+++ b/src/syscall/ztypes_linux_s390x.go
@@ -449,12 +449,12 @@
 }
 
 type IfInfomsg struct {
-	Family uint8
-	_      uint8
-	Type   uint16
-	Index  int32
-	Flags  uint32
-	Change uint32
+	Family     uint8
+	X__ifi_pad uint8
+	Type       uint16
+	Index      int32
+	Flags      uint32
+	Change     uint32
 }
 
 type IfAddrmsg struct {
@@ -564,7 +564,7 @@
 	Totalhigh uint64
 	Freehigh  uint64
 	Unit      uint32
-	_         [0]uint8
+	X_f       [0]uint8
 	_         [4]byte
 }
 
diff --git a/src/testing/cover.go b/src/testing/cover.go
index b52e53a..6ad43ab 100644
--- a/src/testing/cover.go
+++ b/src/testing/cover.go
@@ -47,6 +47,9 @@
 // It is not a replacement for the reports generated by 'go test -cover' and
 // 'go tool cover'.
 func Coverage() float64 {
+	if goexperiment.CoverageRedesign {
+		return coverage2()
+	}
 	var n, d int64
 	for _, counters := range cover.Counters {
 		for i := range counters {
diff --git a/src/testing/example.go b/src/testing/example.go
index f618b06..42ee555 100644
--- a/src/testing/example.go
+++ b/src/testing/example.go
@@ -93,8 +93,7 @@
 	if recovered != nil {
 		// Propagate the previously recovered result, by panicking.
 		panic(recovered)
-	}
-	if !finished && recovered == nil {
+	} else if !finished {
 		panic(errNilPanicOrGoexit)
 	}
 
diff --git a/src/testing/flag_test.go b/src/testing/flag_test.go
index 483ae65..416d8c9 100644
--- a/src/testing/flag_test.go
+++ b/src/testing/flag_test.go
@@ -39,7 +39,10 @@
 			cmd.Env = append(cmd.Environ(), flagTestEnv+"=1")
 			b, err := cmd.CombinedOutput()
 			if len(b) > 0 {
-				t.Logf("%s", b)
+				// When we set -test.v=test2json, we need to escape the ^V control
+				// character used for JSON framing so that the JSON parser doesn't
+				// misinterpret the subprocess output as output from the parent test.
+				t.Logf("%q", b)
 			}
 			if err != nil {
 				t.Error(err)
diff --git a/src/testing/fstest/mapfs.go b/src/testing/fstest/mapfs.go
index 4595b73..a0b1f65 100644
--- a/src/testing/fstest/mapfs.go
+++ b/src/testing/fstest/mapfs.go
@@ -159,6 +159,10 @@
 func (i *mapFileInfo) Sys() any                   { return i.f.Sys }
 func (i *mapFileInfo) Info() (fs.FileInfo, error) { return i, nil }
 
+func (i *mapFileInfo) String() string {
+	return fs.FormatFileInfo(i)
+}
+
 // An openMapFile is a regular (non-directory) fs.File open for reading.
 type openMapFile struct {
 	path string
diff --git a/src/testing/fstest/testfs.go b/src/testing/fstest/testfs.go
index ddb6080..78b0b82 100644
--- a/src/testing/fstest/testfs.go
+++ b/src/testing/fstest/testfs.go
@@ -270,7 +270,7 @@
 		}
 	}
 
-	t.checkGlob(dir, list)
+	t.checkGlob(dir, list2)
 }
 
 // formatEntry formats an fs.DirEntry into a string for error messages and comparison.
diff --git a/src/testing/fstest/testfs_test.go b/src/testing/fstest/testfs_test.go
index aefb4b3..a48c597 100644
--- a/src/testing/fstest/testfs_test.go
+++ b/src/testing/fstest/testfs_test.go
@@ -6,8 +6,10 @@
 
 import (
 	"internal/testenv"
+	"io/fs"
 	"os"
 	"path/filepath"
+	"sort"
 	"testing"
 )
 
@@ -38,3 +40,39 @@
 		t.Error(err)
 	}
 }
+
+type shuffledFS MapFS
+
+func (fsys shuffledFS) Open(name string) (fs.File, error) {
+	f, err := MapFS(fsys).Open(name)
+	if err != nil {
+		return nil, err
+	}
+	return &shuffledFile{File: f}, nil
+}
+
+type shuffledFile struct{ fs.File }
+
+func (f *shuffledFile) ReadDir(n int) ([]fs.DirEntry, error) {
+	dirents, err := f.File.(fs.ReadDirFile).ReadDir(n)
+	// Shuffle in a deterministic way, all we care about is making sure that the
+	// list of directory entries is not is the lexicographic order.
+	//
+	// We do this to make sure that the TestFS test suite is not affected by the
+	// order of directory entries.
+	sort.Slice(dirents, func(i, j int) bool {
+		return dirents[i].Name() > dirents[j].Name()
+	})
+	return dirents, err
+}
+
+func TestShuffledFS(t *testing.T) {
+	fsys := shuffledFS{
+		"tmp/one":   {Data: []byte("1")},
+		"tmp/two":   {Data: []byte("2")},
+		"tmp/three": {Data: []byte("3")},
+	}
+	if err := TestFS(fsys, "tmp/one", "tmp/two", "tmp/three"); err != nil {
+		t.Error(err)
+	}
+}
diff --git a/src/testing/newcover.go b/src/testing/newcover.go
index 1805f79..6199f3b 100644
--- a/src/testing/newcover.go
+++ b/src/testing/newcover.go
@@ -15,16 +15,18 @@
 // cover2 variable stores the current coverage mode and a
 // tear-down function to be called at the end of the testing run.
 var cover2 struct {
-	mode     string
-	tearDown func(coverprofile string, gocoverdir string) (string, error)
+	mode        string
+	tearDown    func(coverprofile string, gocoverdir string) (string, error)
+	snapshotcov func() float64
 }
 
 // registerCover2 is invoked during "go test -cover" runs by the test harness
 // code in _testmain.go; it is used to record a 'tear down' function
 // (to be called when the test is complete) and the coverage mode.
-func registerCover2(mode string, tearDown func(coverprofile string, gocoverdir string) (string, error)) {
+func registerCover2(mode string, tearDown func(coverprofile string, gocoverdir string) (string, error), snapcov func() float64) {
 	cover2.mode = mode
 	cover2.tearDown = tearDown
+	cover2.snapshotcov = snapcov
 }
 
 // coverReport2 invokes a callback in _testmain.go that will
@@ -46,3 +48,12 @@
 func testGoCoverDir() string {
 	return *gocoverdir
 }
+
+// coverage2 returns a rough "coverage percentage so far"
+// number to support the testing.Coverage() function.
+func coverage2() float64 {
+	if cover2.mode == "" {
+		return 0.0
+	}
+	return cover2.snapshotcov()
+}
diff --git a/src/testing/quick/quick.go b/src/testing/quick/quick.go
index 95a635b..d711742 100644
--- a/src/testing/quick/quick.go
+++ b/src/testing/quick/quick.go
@@ -115,7 +115,7 @@
 		}
 	case reflect.Pointer:
 		if rand.Intn(size) == 0 {
-			v.Set(reflect.Zero(concrete)) // Generate nil pointer.
+			v.SetZero() // Generate nil pointer.
 		} else {
 			elem, ok := sizedValue(concrete.Elem(), rand, size)
 			if !ok {
diff --git a/src/testing/run_example.go b/src/testing/run_example.go
index 776fbff..b2c5c3d 100644
--- a/src/testing/run_example.go
+++ b/src/testing/run_example.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build !js
+//go:build !js && !wasip1
 
 // TODO(@musiol, @odeke-em): re-unify this entire file back into
 // example.go when js/wasm gets an os.Pipe implementation
diff --git a/src/testing/run_example_js.go b/src/testing/run_example_js.go
deleted file mode 100644
index 572c6b3..0000000
--- a/src/testing/run_example_js.go
+++ /dev/null
@@ -1,76 +0,0 @@
-// Copyright 2019 The Go 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:build js
-
-package testing
-
-import (
-	"fmt"
-	"io"
-	"os"
-	"strings"
-	"time"
-)
-
-// TODO(@musiol, @odeke-em): unify this code back into
-// example.go when js/wasm gets an os.Pipe implementation.
-func runExample(eg InternalExample) (ok bool) {
-	if chatty.on {
-		fmt.Printf("%s=== RUN   %s\n", chatty.prefix(), eg.Name)
-	}
-
-	// Capture stdout to temporary file. We're not using
-	// os.Pipe because it is not supported on js/wasm.
-	stdout := os.Stdout
-	f := createTempFile(eg.Name)
-	os.Stdout = f
-	finished := false
-	start := time.Now()
-
-	// Clean up in a deferred call so we can recover if the example panics.
-	defer func() {
-		timeSpent := time.Since(start)
-
-		// Restore stdout, get output and remove temporary file.
-		os.Stdout = stdout
-		var buf strings.Builder
-		_, seekErr := f.Seek(0, io.SeekStart)
-		_, readErr := io.Copy(&buf, f)
-		out := buf.String()
-		f.Close()
-		os.Remove(f.Name())
-		if seekErr != nil {
-			fmt.Fprintf(os.Stderr, "testing: seek temp file: %v\n", seekErr)
-			os.Exit(1)
-		}
-		if readErr != nil {
-			fmt.Fprintf(os.Stderr, "testing: read temp file: %v\n", readErr)
-			os.Exit(1)
-		}
-
-		err := recover()
-		ok = eg.processRunResult(out, timeSpent, finished, err)
-	}()
-
-	// Run example.
-	eg.F()
-	finished = true
-	return
-}
-
-func createTempFile(exampleName string) *os.File {
-	for i := 0; ; i++ {
-		name := fmt.Sprintf("%s/go-example-stdout-%s-%d.txt", os.TempDir(), exampleName, i)
-		f, err := os.OpenFile(name, os.O_RDWR|os.O_CREATE|os.O_EXCL, 0600)
-		if err != nil {
-			if os.IsExist(err) {
-				continue
-			}
-			fmt.Fprintf(os.Stderr, "testing: open temp file: %v\n", err)
-			os.Exit(1)
-		}
-		return f
-	}
-}
diff --git a/src/testing/run_example_wasm.go b/src/testing/run_example_wasm.go
new file mode 100644
index 0000000..b815fcd
--- /dev/null
+++ b/src/testing/run_example_wasm.go
@@ -0,0 +1,76 @@
+// Copyright 2019 The Go 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:build js || wasip1
+
+package testing
+
+import (
+	"fmt"
+	"io"
+	"os"
+	"strings"
+	"time"
+)
+
+// TODO(@musiol, @odeke-em): unify this code back into
+// example.go when js/wasm gets an os.Pipe implementation.
+func runExample(eg InternalExample) (ok bool) {
+	if chatty.on {
+		fmt.Printf("%s=== RUN   %s\n", chatty.prefix(), eg.Name)
+	}
+
+	// Capture stdout to temporary file. We're not using
+	// os.Pipe because it is not supported on js/wasm.
+	stdout := os.Stdout
+	f := createTempFile(eg.Name)
+	os.Stdout = f
+	finished := false
+	start := time.Now()
+
+	// Clean up in a deferred call so we can recover if the example panics.
+	defer func() {
+		timeSpent := time.Since(start)
+
+		// Restore stdout, get output and remove temporary file.
+		os.Stdout = stdout
+		var buf strings.Builder
+		_, seekErr := f.Seek(0, io.SeekStart)
+		_, readErr := io.Copy(&buf, f)
+		out := buf.String()
+		f.Close()
+		os.Remove(f.Name())
+		if seekErr != nil {
+			fmt.Fprintf(os.Stderr, "testing: seek temp file: %v\n", seekErr)
+			os.Exit(1)
+		}
+		if readErr != nil {
+			fmt.Fprintf(os.Stderr, "testing: read temp file: %v\n", readErr)
+			os.Exit(1)
+		}
+
+		err := recover()
+		ok = eg.processRunResult(out, timeSpent, finished, err)
+	}()
+
+	// Run example.
+	eg.F()
+	finished = true
+	return
+}
+
+func createTempFile(exampleName string) *os.File {
+	for i := 0; ; i++ {
+		name := fmt.Sprintf("%s/go-example-stdout-%s-%d.txt", os.TempDir(), exampleName, i)
+		f, err := os.OpenFile(name, os.O_RDWR|os.O_CREATE|os.O_EXCL, 0600)
+		if err != nil {
+			if os.IsExist(err) {
+				continue
+			}
+			fmt.Fprintf(os.Stderr, "testing: open temp file: %v\n", err)
+			os.Exit(1)
+		}
+		return f
+	}
+}
diff --git a/src/testing/slogtest/example_test.go b/src/testing/slogtest/example_test.go
new file mode 100644
index 0000000..0517a4b
--- /dev/null
+++ b/src/testing/slogtest/example_test.go
@@ -0,0 +1,44 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package slogtest_test
+
+import (
+	"bytes"
+	"encoding/json"
+	"log"
+	"log/slog"
+	"testing/slogtest"
+)
+
+// This example demonstrates one technique for testing a handler with this
+// package. The handler is given a [bytes.Buffer] to write to, and each line
+// of the resulting output is parsed.
+// For JSON output, [encoding/json.Unmarshal] produces a result in the desired
+// format when given a pointer to a map[string]any.
+func Example_parsing() {
+	var buf bytes.Buffer
+	h := slog.NewJSONHandler(&buf, nil)
+
+	results := func() []map[string]any {
+		var ms []map[string]any
+		for _, line := range bytes.Split(buf.Bytes(), []byte{'\n'}) {
+			if len(line) == 0 {
+				continue
+			}
+			var m map[string]any
+			if err := json.Unmarshal(line, &m); err != nil {
+				panic(err) // In a real test, use t.Fatal.
+			}
+			ms = append(ms, m)
+		}
+		return ms
+	}
+	err := slogtest.TestHandler(h, results)
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	// Output:
+}
diff --git a/src/testing/slogtest/slogtest.go b/src/testing/slogtest/slogtest.go
new file mode 100644
index 0000000..b16d122
--- /dev/null
+++ b/src/testing/slogtest/slogtest.go
@@ -0,0 +1,322 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package slogtest implements support for testing implementations of log/slog.Handler.
+package slogtest
+
+import (
+	"context"
+	"errors"
+	"fmt"
+	"log/slog"
+	"reflect"
+	"runtime"
+	"time"
+)
+
+type testCase struct {
+	// If non-empty, explanation explains the violated constraint.
+	explanation string
+	// f executes a single log event using its argument logger.
+	// So that mkdescs.sh can generate the right description,
+	// the body of f must appear on a single line whose first
+	// non-whitespace characters are "l.".
+	f func(*slog.Logger)
+	// If mod is not nil, it is called to modify the Record
+	// generated by the Logger before it is passed to the Handler.
+	mod func(*slog.Record)
+	// checks is a list of checks to run on the result.
+	checks []check
+}
+
+// TestHandler tests a [slog.Handler].
+// If TestHandler finds any misbehaviors, it returns an error for each,
+// combined into a single error with errors.Join.
+//
+// TestHandler installs the given Handler in a [slog.Logger] and
+// makes several calls to the Logger's output methods.
+//
+// The results function is invoked after all such calls.
+// It should return a slice of map[string]any, one for each call to a Logger output method.
+// The keys and values of the map should correspond to the keys and values of the Handler's
+// output. Each group in the output should be represented as its own nested map[string]any.
+// The standard keys slog.TimeKey, slog.LevelKey and slog.MessageKey should be used.
+//
+// If the Handler outputs JSON, then calling [encoding/json.Unmarshal] with a `map[string]any`
+// will create the right data structure.
+//
+// If a Handler intentionally drops an attribute that is checked by a test,
+// then the results function should check for its absence and add it to the map it returns.
+func TestHandler(h slog.Handler, results func() []map[string]any) error {
+	cases := []testCase{
+		{
+			explanation: withSource("this test expects slog.TimeKey, slog.LevelKey and slog.MessageKey"),
+			f: func(l *slog.Logger) {
+				l.Info("message")
+			},
+			checks: []check{
+				hasKey(slog.TimeKey),
+				hasKey(slog.LevelKey),
+				hasAttr(slog.MessageKey, "message"),
+			},
+		},
+		{
+			explanation: withSource("a Handler should output attributes passed to the logging function"),
+			f: func(l *slog.Logger) {
+				l.Info("message", "k", "v")
+			},
+			checks: []check{
+				hasAttr("k", "v"),
+			},
+		},
+		{
+			explanation: withSource("a Handler should ignore an empty Attr"),
+			f: func(l *slog.Logger) {
+				l.Info("msg", "a", "b", "", nil, "c", "d")
+			},
+			checks: []check{
+				hasAttr("a", "b"),
+				missingKey(""),
+				hasAttr("c", "d"),
+			},
+		},
+		{
+			explanation: withSource("a Handler should ignore a zero Record.Time"),
+			f: func(l *slog.Logger) {
+				l.Info("msg", "k", "v")
+			},
+			mod: func(r *slog.Record) { r.Time = time.Time{} },
+			checks: []check{
+				missingKey(slog.TimeKey),
+			},
+		},
+		{
+			explanation: withSource("a Handler should include the attributes from the WithAttrs method"),
+			f: func(l *slog.Logger) {
+				l.With("a", "b").Info("msg", "k", "v")
+			},
+			checks: []check{
+				hasAttr("a", "b"),
+				hasAttr("k", "v"),
+			},
+		},
+		{
+			explanation: withSource("a Handler should handle Group attributes"),
+			f: func(l *slog.Logger) {
+				l.Info("msg", "a", "b", slog.Group("G", slog.String("c", "d")), "e", "f")
+			},
+			checks: []check{
+				hasAttr("a", "b"),
+				inGroup("G", hasAttr("c", "d")),
+				hasAttr("e", "f"),
+			},
+		},
+		{
+			explanation: withSource("a Handler should ignore an empty group"),
+			f: func(l *slog.Logger) {
+				l.Info("msg", "a", "b", slog.Group("G"), "e", "f")
+			},
+			checks: []check{
+				hasAttr("a", "b"),
+				missingKey("G"),
+				hasAttr("e", "f"),
+			},
+		},
+		{
+			explanation: withSource("a Handler should inline the Attrs of a group with an empty key"),
+			f: func(l *slog.Logger) {
+				l.Info("msg", "a", "b", slog.Group("", slog.String("c", "d")), "e", "f")
+
+			},
+			checks: []check{
+				hasAttr("a", "b"),
+				hasAttr("c", "d"),
+				hasAttr("e", "f"),
+			},
+		},
+		{
+			explanation: withSource("a Handler should handle the WithGroup method"),
+			f: func(l *slog.Logger) {
+				l.WithGroup("G").Info("msg", "a", "b")
+			},
+			checks: []check{
+				hasKey(slog.TimeKey),
+				hasKey(slog.LevelKey),
+				hasAttr(slog.MessageKey, "msg"),
+				missingKey("a"),
+				inGroup("G", hasAttr("a", "b")),
+			},
+		},
+		{
+			explanation: withSource("a Handler should handle multiple WithGroup and WithAttr calls"),
+			f: func(l *slog.Logger) {
+				l.With("a", "b").WithGroup("G").With("c", "d").WithGroup("H").Info("msg", "e", "f")
+			},
+			checks: []check{
+				hasKey(slog.TimeKey),
+				hasKey(slog.LevelKey),
+				hasAttr(slog.MessageKey, "msg"),
+				hasAttr("a", "b"),
+				inGroup("G", hasAttr("c", "d")),
+				inGroup("G", inGroup("H", hasAttr("e", "f"))),
+			},
+		},
+		{
+			explanation: withSource("a Handler should not output groups for an empty Record"),
+			f: func(l *slog.Logger) {
+				l.With("a", "b").WithGroup("G").With("c", "d").WithGroup("H").Info("msg")
+			},
+			checks: []check{
+				hasKey(slog.TimeKey),
+				hasKey(slog.LevelKey),
+				hasAttr(slog.MessageKey, "msg"),
+				hasAttr("a", "b"),
+				inGroup("G", hasAttr("c", "d")),
+				inGroup("G", missingKey("H")),
+			},
+		},
+		{
+			explanation: withSource("a Handler should call Resolve on attribute values"),
+			f: func(l *slog.Logger) {
+				l.Info("msg", "k", &replace{"replaced"})
+			},
+			checks: []check{hasAttr("k", "replaced")},
+		},
+		{
+			explanation: withSource("a Handler should call Resolve on attribute values in groups"),
+			f: func(l *slog.Logger) {
+				l.Info("msg",
+					slog.Group("G",
+						slog.String("a", "v1"),
+						slog.Any("b", &replace{"v2"})))
+			},
+			checks: []check{
+				inGroup("G", hasAttr("a", "v1")),
+				inGroup("G", hasAttr("b", "v2")),
+			},
+		},
+		{
+			explanation: withSource("a Handler should call Resolve on attribute values from WithAttrs"),
+			f: func(l *slog.Logger) {
+				l = l.With("k", &replace{"replaced"})
+				l.Info("msg")
+			},
+			checks: []check{hasAttr("k", "replaced")},
+		},
+		{
+			explanation: withSource("a Handler should call Resolve on attribute values in groups from WithAttrs"),
+			f: func(l *slog.Logger) {
+				l = l.With(slog.Group("G",
+					slog.String("a", "v1"),
+					slog.Any("b", &replace{"v2"})))
+				l.Info("msg")
+			},
+			checks: []check{
+				inGroup("G", hasAttr("a", "v1")),
+				inGroup("G", hasAttr("b", "v2")),
+			},
+		},
+	}
+
+	// Run the handler on the test cases.
+	for _, c := range cases {
+		ht := h
+		if c.mod != nil {
+			ht = &wrapper{h, c.mod}
+		}
+		l := slog.New(ht)
+		c.f(l)
+	}
+
+	// Collect and check the results.
+	var errs []error
+	res := results()
+	if g, w := len(res), len(cases); g != w {
+		return fmt.Errorf("got %d results, want %d", g, w)
+	}
+	for i, got := range results() {
+		c := cases[i]
+		for _, check := range c.checks {
+			if p := check(got); p != "" {
+				errs = append(errs, fmt.Errorf("%s: %s", p, c.explanation))
+			}
+		}
+	}
+	return errors.Join(errs...)
+}
+
+type check func(map[string]any) string
+
+func hasKey(key string) check {
+	return func(m map[string]any) string {
+		if _, ok := m[key]; !ok {
+			return fmt.Sprintf("missing key %q", key)
+		}
+		return ""
+	}
+}
+
+func missingKey(key string) check {
+	return func(m map[string]any) string {
+		if _, ok := m[key]; ok {
+			return fmt.Sprintf("unexpected key %q", key)
+		}
+		return ""
+	}
+}
+
+func hasAttr(key string, wantVal any) check {
+	return func(m map[string]any) string {
+		if s := hasKey(key)(m); s != "" {
+			return s
+		}
+		gotVal := m[key]
+		if !reflect.DeepEqual(gotVal, wantVal) {
+			return fmt.Sprintf("%q: got %#v, want %#v", key, gotVal, wantVal)
+		}
+		return ""
+	}
+}
+
+func inGroup(name string, c check) check {
+	return func(m map[string]any) string {
+		v, ok := m[name]
+		if !ok {
+			return fmt.Sprintf("missing group %q", name)
+		}
+		g, ok := v.(map[string]any)
+		if !ok {
+			return fmt.Sprintf("value for group %q is not map[string]any", name)
+		}
+		return c(g)
+	}
+}
+
+type wrapper struct {
+	slog.Handler
+	mod func(*slog.Record)
+}
+
+func (h *wrapper) Handle(ctx context.Context, r slog.Record) error {
+	h.mod(&r)
+	return h.Handler.Handle(ctx, r)
+}
+
+func withSource(s string) string {
+	_, file, line, ok := runtime.Caller(1)
+	if !ok {
+		panic("runtime.Caller failed")
+	}
+	return fmt.Sprintf("%s (%s:%d)", s, file, line)
+}
+
+type replace struct {
+	v any
+}
+
+func (r *replace) LogValue() slog.Value { return slog.AnyValue(r.v) }
+
+func (r *replace) String() string {
+	return fmt.Sprintf("<replace(%v)>", r.v)
+}
diff --git a/src/testing/testing.go b/src/testing/testing.go
index fc34cbf..fcf7048 100644
--- a/src/testing/testing.go
+++ b/src/testing/testing.go
@@ -441,6 +441,7 @@
 	parallel = flag.Int("test.parallel", runtime.GOMAXPROCS(0), "run at most `n` tests in parallel")
 	testlog = flag.String("test.testlogfile", "", "write test action log to `file` (for use only by cmd/go)")
 	shuffle = flag.String("test.shuffle", "off", "randomize the execution order of tests and benchmarks")
+	fullPath = flag.Bool("test.fullpath", false, "show full file names in error messages")
 
 	initBenchmarkFlags()
 	initFuzzFlags()
@@ -472,6 +473,7 @@
 	parallel             *int
 	shuffle              *string
 	testlog              *string
+	fullPath             *bool
 
 	haveExamples bool // are there examples?
 
@@ -642,6 +644,22 @@
 	return *short
 }
 
+// testBinary is set by cmd/go to "1" if this is a binary built by "go test".
+// The value is set to "1" by a -X option to cmd/link. We assume that
+// because this is possible, the compiler will not optimize testBinary
+// into a constant on the basis that it is an unexported package-scope
+// variable that is never changed. If the compiler ever starts implementing
+// such an optimization, we will need some technique to mark this variable
+// as "changed by a cmd/link -X option".
+var testBinary = "0"
+
+// Testing reports whether the current code is being run in a test.
+// This will report true in programs created by "go test",
+// false in programs created by "go build".
+func Testing() bool {
+	return testBinary == "1"
+}
+
 // CoverMode reports what the test coverage mode is set to. The
 // values are "set", "count", or "atomic". The return value will be
 // empty if test coverage is not enabled.
@@ -751,8 +769,9 @@
 	file := frame.File
 	line := frame.Line
 	if file != "" {
-		// Truncate file name at last file name separator.
-		if index := strings.LastIndex(file, "/"); index >= 0 {
+		if *fullPath {
+			// If relative path, truncate file name at last file name separator.
+		} else if index := strings.LastIndex(file, "/"); index >= 0 {
 			file = file[index+1:]
 		} else if index = strings.LastIndex(file, "\\"); index >= 0 {
 			file = file[index+1:]
@@ -1915,7 +1934,6 @@
 				// in which case every test will run nothing and succeed,
 				// with no obvious way to detect this problem (since no tests are running).
 				// So make 'no tests to run' a hard failure when testing package testing itself.
-				// The compile-only builders use -run=^$ to run no tests, so allow that.
 				fmt.Print(chatty.prefix(), "FAIL: package testing must run tests\n")
 				testOk = false
 			}
diff --git a/src/testing/testing_test.go b/src/testing/testing_test.go
index 3616f04..5e92687 100644
--- a/src/testing/testing_test.go
+++ b/src/testing/testing_test.go
@@ -5,6 +5,8 @@
 package testing_test
 
 import (
+	"bytes"
+	"internal/testenv"
 	"os"
 	"path/filepath"
 	"testing"
@@ -232,3 +234,62 @@
 		})
 	})
 }
+
+// testingTrueInInit is part of TestTesting.
+var testingTrueInInit = false
+
+// testingTrueInPackageVarInit is part of TestTesting.
+var testingTrueInPackageVarInit = testing.Testing()
+
+// init is part of TestTesting.
+func init() {
+	if testing.Testing() {
+		testingTrueInInit = true
+	}
+}
+
+var testingProg = `
+package main
+
+import (
+	"fmt"
+	"testing"
+)
+
+func main() {
+	fmt.Println(testing.Testing())
+}
+`
+
+func TestTesting(t *testing.T) {
+	if !testing.Testing() {
+		t.Errorf("testing.Testing() == %t, want %t", testing.Testing(), true)
+	}
+	if !testingTrueInInit {
+		t.Errorf("testing.Testing() called by init function == %t, want %t", testingTrueInInit, true)
+	}
+	if !testingTrueInPackageVarInit {
+		t.Errorf("testing.Testing() variable initialized as %t, want %t", testingTrueInPackageVarInit, true)
+	}
+
+	if testing.Short() {
+		t.Skip("skipping building a binary in short mode")
+	}
+	testenv.MustHaveGoRun(t)
+
+	fn := filepath.Join(t.TempDir(), "x.go")
+	if err := os.WriteFile(fn, []byte(testingProg), 0644); err != nil {
+		t.Fatal(err)
+	}
+
+	cmd := testenv.Command(t, testenv.GoToolPath(t), "run", fn)
+	out, err := cmd.CombinedOutput()
+	if err != nil {
+		t.Fatalf("%v failed: %v\n%s", cmd, err, out)
+	}
+
+	s := string(bytes.TrimSpace(out))
+	if s != "false" {
+		t.Errorf("in non-test testing.Test() returned %q, want %q", s, "false")
+	}
+}
diff --git a/src/text/template/doc.go b/src/text/template/doc.go
index 7817a17..4c01b05 100644
--- a/src/text/template/doc.go
+++ b/src/text/template/doc.go
@@ -5,7 +5,7 @@
 /*
 Package template implements data-driven templates for generating textual output.
 
-To generate HTML output, see package html/template, which has the same interface
+To generate HTML output, see [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
diff --git a/src/text/template/exec.go b/src/text/template/exec.go
index fb60c17..fd7db65 100644
--- a/src/text/template/exec.go
+++ b/src/text/template/exec.go
@@ -361,19 +361,27 @@
 	// 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 {
 			if r.Pipe.IsAssign {
-				s.setVar(r.Pipe.Decl[0].Ident[0], elem)
+				// With two variables, index comes first.
+				// With one, we use the element.
+				if len(r.Pipe.Decl) > 1 {
+					s.setVar(r.Pipe.Decl[0].Ident[0], index)
+				} else {
+					s.setVar(r.Pipe.Decl[0].Ident[0], elem)
+				}
 			} else {
+				// Set top var (lexically the second if there
+				// are two) to the element.
 				s.setTopVar(1, elem)
 			}
 		}
-		// Set next var (lexically the first if there are two) to the index.
 		if len(r.Pipe.Decl) > 1 {
 			if r.Pipe.IsAssign {
-				s.setVar(r.Pipe.Decl[1].Ident[0], index)
+				s.setVar(r.Pipe.Decl[1].Ident[0], elem)
 			} else {
+				// Set next var (lexically the first if there
+				// are two) to the index.
 				s.setTopVar(2, index)
 			}
 		}
diff --git a/src/text/template/exec_test.go b/src/text/template/exec_test.go
index 6b163f0..6eb0d41 100644
--- a/src/text/template/exec_test.go
+++ b/src/text/template/exec_test.go
@@ -694,6 +694,7 @@
 	{"bug18c", "{{eq . 'P'}}", "true", 'P', true},
 
 	{"issue56490", "{{$i := 0}}{{$x := 0}}{{range $i = .AI}}{{end}}{{$i}}", "5", tVal, true},
+	{"issue60801", "{{$k := 0}}{{$v := 0}}{{range $k, $v = .AI}}{{$k}}={{$v}} {{end}}", "0=3 1=4 2=5 ", tVal, true},
 }
 
 func zeroArgs() string {
@@ -949,7 +950,7 @@
 		{`'foo`, `\'foo`},
 		{`Go "jump" \`, `Go \"jump\" \\`},
 		{`Yukihiro says "今日は世界"`, `Yukihiro says \"今日は世界\"`},
-		{"unprintable \uFDFF", `unprintable \uFDFF`},
+		{"unprintable \uFFFE", `unprintable \uFFFE`},
 		{`<html>`, `\u003Chtml\u003E`},
 		{`no = in attributes`, `no \u003D in attributes`},
 		{`&#x27; does not become HTML entity`, `\u0026#x27; does not become HTML entity`},
diff --git a/src/text/template/funcs.go b/src/text/template/funcs.go
index dbea6e7..b5a8c9e 100644
--- a/src/text/template/funcs.go
+++ b/src/text/template/funcs.go
@@ -23,7 +23,7 @@
 // Execute returns that error.
 //
 // Errors returned by Execute wrap the underlying error; call errors.As to
-// uncover them.
+// unwrap them.
 //
 // When template execution invokes a function with an argument list, that list
 // must be assignable to the function's parameter types. Functions meant to
diff --git a/src/time/format.go b/src/time/format.go
index f94d68e..7fbeddb 100644
--- a/src/time/format.go
+++ b/src/time/format.go
@@ -446,7 +446,7 @@
 }
 
 // Never printed, just needs to be non-nil for return by atoi.
-var atoiError = errors.New("time: invalid number")
+var errAtoi = errors.New("time: invalid number")
 
 // Duplicates functionality in strconv, but avoids dependency.
 func atoi[bytes []byte | string](s bytes) (x int, err error) {
@@ -458,7 +458,7 @@
 	q, rem, err := leadingInt(s)
 	x = int(q)
 	if err != nil || len(rem) > 0 {
-		return 0, atoiError
+		return 0, errAtoi
 	}
 	if neg {
 		x = -x
diff --git a/src/time/genzabbrs.go b/src/time/genzabbrs.go
index a8651bf..7dbd22f 100644
--- a/src/time/genzabbrs.go
+++ b/src/time/genzabbrs.go
@@ -53,7 +53,7 @@
 	DSTime   string
 }
 
-const wzURL = "https://raw.githubusercontent.com/unicode-org/cldr/master/common/supplemental/windowsZones.xml"
+const wzURL = "https://raw.githubusercontent.com/unicode-org/cldr/main/common/supplemental/windowsZones.xml"
 
 type MapZone struct {
 	Other     string `xml:"other,attr"`
diff --git a/src/time/sleep_test.go b/src/time/sleep_test.go
index 8aac3b6..2f79124 100644
--- a/src/time/sleep_test.go
+++ b/src/time/sleep_test.go
@@ -418,22 +418,22 @@
 	// 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)
+	//
+	// (maxDuration is several orders of magnitude longer than we
+	// expect this test to actually take on a fast, unloaded machine.)
+	d := 1 * Millisecond
+	const maxDuration = 10 * Second
+	for {
+		err := testReset(d)
 		if err == nil {
-			t.Logf("passed using duration %v", d)
-			return
+			break
 		}
+		d *= 2
+		if d > maxDuration {
+			t.Error(err)
+		}
+		t.Logf("%v; trying duration %v", err, d)
 	}
-	t.Error(err)
 }
 
 // Test that sleeping (via Sleep or Timer) for an interval so large it
diff --git a/src/time/sys_unix.go b/src/time/sys_unix.go
index 0f06aa6..63634ac 100644
--- a/src/time/sys_unix.go
+++ b/src/time/sys_unix.go
@@ -2,18 +2,26 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build unix || (js && wasm)
+//go:build unix || (js && wasm) || wasip1
 
 package time
 
 import (
 	"errors"
+	"runtime"
 	"syscall"
 )
 
 // for testing: whatever interrupts a sleep
 func interrupt() {
-	syscall.Kill(syscall.Getpid(), syscall.SIGCHLD)
+	// There is no mechanism in wasi to interrupt the call to poll_oneoff
+	// used to implement runtime.usleep so this function does nothing, which
+	// somewhat defeats the purpose of TestSleep but we are still better off
+	// validating that time elapses when the process calls time.Sleep than
+	// skipping the test altogether.
+	if runtime.GOOS != "wasip1" {
+		syscall.Kill(syscall.Getpid(), syscall.SIGCHLD)
+	}
 }
 
 func open(name string) (uintptr, error) {
diff --git a/src/time/tick.go b/src/time/tick.go
index dcfeca8..9da16b5 100644
--- a/src/time/tick.go
+++ b/src/time/tick.go
@@ -4,8 +4,6 @@
 
 package time
 
-import "errors"
-
 // A Ticker holds a channel that delivers “ticks” of a clock
 // at intervals.
 type Ticker struct {
@@ -21,7 +19,7 @@
 // panic. Stop the ticker to release associated resources.
 func NewTicker(d Duration) *Ticker {
 	if d <= 0 {
-		panic(errors.New("non-positive interval for NewTicker"))
+		panic("non-positive interval for NewTicker")
 	}
 	// Give the channel a 1-element time buffer.
 	// If the client falls behind while reading, we drop ticks
diff --git a/src/time/time_test.go b/src/time/time_test.go
index 4221efe..3b30f80 100644
--- a/src/time/time_test.go
+++ b/src/time/time_test.go
@@ -1860,16 +1860,26 @@
 		5: {Date(1991, September, 14, 17, 0, 0, 0, loc), boundTwo, boundThree},
 		6: {Date(1991, September, 15, 0, 50, 0, 0, loc), boundTwo, boundThree},
 
+		// The ZoneBounds of a "Asia/Shanghai" after the last transition (Standard Time)
+		7:  {boundThree, boundThree, Time{}},
+		8:  {Date(1991, December, 15, 1, 50, 0, 0, loc), boundThree, Time{}},
+		9:  {Date(1992, April, 13, 17, 50, 0, 0, loc), boundThree, Time{}},
+		10: {Date(1992, April, 13, 18, 0, 0, 0, loc), boundThree, Time{}},
+		11: {Date(1992, April, 14, 1, 50, 0, 0, loc), boundThree, Time{}},
+		12: {Date(1992, September, 14, 16, 50, 0, 0, loc), boundThree, Time{}},
+		13: {Date(1992, September, 14, 17, 0, 0, 0, loc), boundThree, Time{}},
+		14: {Date(1992, September, 15, 0, 50, 0, 0, loc), boundThree, Time{}},
+
 		// The ZoneBounds of a local time would return two local Time.
 		// Note: We preloaded "America/Los_Angeles" as time.Local for testing
-		7:  {makeLocalTime(0), makeLocalTime(-5756400), makeLocalTime(9972000)},
-		8:  {makeLocalTime(1221681866), makeLocalTime(1205056800), makeLocalTime(1225616400)},
-		9:  {makeLocalTime(2152173599), makeLocalTime(2145916800), makeLocalTime(2152173600)},
-		10: {makeLocalTime(2152173600), makeLocalTime(2152173600), makeLocalTime(2172733200)},
-		11: {makeLocalTime(2152173601), makeLocalTime(2152173600), makeLocalTime(2172733200)},
-		12: {makeLocalTime(2159200800), makeLocalTime(2152173600), makeLocalTime(2172733200)},
-		13: {makeLocalTime(2172733199), makeLocalTime(2152173600), makeLocalTime(2172733200)},
-		14: {makeLocalTime(2172733200), makeLocalTime(2172733200), makeLocalTime(2177452800)},
+		15: {makeLocalTime(0), makeLocalTime(-5756400), makeLocalTime(9972000)},
+		16: {makeLocalTime(1221681866), makeLocalTime(1205056800), makeLocalTime(1225616400)},
+		17: {makeLocalTime(2152173599), makeLocalTime(2145916800), makeLocalTime(2152173600)},
+		18: {makeLocalTime(2152173600), makeLocalTime(2152173600), makeLocalTime(2172733200)},
+		19: {makeLocalTime(2152173601), makeLocalTime(2152173600), makeLocalTime(2172733200)},
+		20: {makeLocalTime(2159200800), makeLocalTime(2152173600), makeLocalTime(2172733200)},
+		21: {makeLocalTime(2172733199), makeLocalTime(2152173600), makeLocalTime(2172733200)},
+		22: {makeLocalTime(2172733200), makeLocalTime(2172733200), makeLocalTime(2177452800)},
 	}
 	for i, tt := range realTests {
 		start, end := tt.giveTime.ZoneBounds()
diff --git a/src/time/tzdata/generate_zipdata.go b/src/time/tzdata/generate_zipdata.go
deleted file mode 100644
index 653577c..0000000
--- a/src/time/tzdata/generate_zipdata.go
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright 2020 The Go 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:build ignore
-
-// This program generates zipdata.go from $GOROOT/lib/time/zoneinfo.zip.
-package main
-
-import (
-	"bufio"
-	"fmt"
-	"os"
-	"strconv"
-)
-
-// header is put at the start of the generated file.
-// The string addition avoids this file (generate_zipdata.go) from
-// matching the "generated file" regexp.
-const header = `// Copyright 2020 The Go 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 generated by generate_zipdata. DO NOT EDIT.
-
-// This file contains an embedded zip archive that contains time zone
-// files compiled using the code and data maintained as part of the
-// IANA Time Zone Database.
-// The IANA asserts that the data is in the public domain.
-
-// For more information, see
-// https://www.iana.org/time-zones
-// ftp://ftp.iana.org/tz/code/tz-link.html
-// https://datatracker.ietf.org/doc/html/rfc6557
-
-package tzdata
-
-const zipdata = `
-
-func main() {
-	// We should be run in the $GOROOT/src/time/tzdata directory.
-	data, err := os.ReadFile("../../../lib/time/zoneinfo.zip")
-	if err != nil {
-		die("cannot find zoneinfo.zip file: %v", err)
-	}
-
-	of, err := os.Create("zipdata.go")
-	if err != nil {
-		die("%v", err)
-	}
-
-	buf := bufio.NewWriter(of)
-	buf.WriteString(header)
-
-	ds := string(data)
-	i := 0
-	const chunk = 60
-	for ; i+chunk < len(data); i += chunk {
-		if i > 0 {
-			buf.WriteRune('\t')
-		}
-		fmt.Fprintf(buf, "%s +\n", strconv.Quote(ds[i:i+chunk]))
-	}
-	fmt.Fprintf(buf, "\t%s\n", strconv.Quote(ds[i:]))
-
-	if err := buf.Flush(); err != nil {
-		die("error writing to zipdata.go: %v", err)
-	}
-	if err := of.Close(); err != nil {
-		die("error closing zipdata.go: %v", err)
-	}
-}
-
-func die(format string, args ...any) {
-	fmt.Fprintf(os.Stderr, format+"\n", args...)
-	os.Exit(1)
-}
diff --git a/src/time/tzdata/tzdata.go b/src/time/tzdata/tzdata.go
index 324de5c..95c759b 100644
--- a/src/time/tzdata/tzdata.go
+++ b/src/time/tzdata/tzdata.go
@@ -2,8 +2,6 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:generate go run generate_zipdata.go
-
 // Package tzdata provides an embedded copy of the timezone database.
 // If this package is imported anywhere in the program, then if
 // the time package cannot find tzdata files on the system,
@@ -67,6 +65,8 @@
 		zheader     = 0x04034b50
 	)
 
+	// zipdata is provided by zzipdata.go,
+	// which is generated by cmd/dist during make.bash.
 	z := zipdata
 
 	idx := len(z) - ztailsize
diff --git a/src/time/tzdata/zipdata.go b/src/time/tzdata/zipdata.go
deleted file mode 100644
index d5785ad..0000000
--- a/src/time/tzdata/zipdata.go
+++ /dev/null
@@ -1,6643 +0,0 @@
-// Copyright 2020 The Go 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 generated by generate_zipdata. DO NOT EDIT.
-
-// This file contains an embedded zip archive that contains time zone
-// files compiled using the code and data maintained as part of the
-// IANA Time Zone Database.
-// The IANA asserts that the data is in the public domain.
-
-// For more information, see
-// https://www.iana.org/time-zones
-// ftp://ftp.iana.org/tz/code/tz-link.html
-// https://datatracker.ietf.org/doc/html/rfc6557
-
-package tzdata
-
-const zipdata = "PK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x0e\x00\x00\x00Africa/AbidjanTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\b\xff\xff\xff\xff\x92\xe6\x92H\x01\xff\xff\xfc8\x00\x00\x00\x00\x00\x00\x00\x04LMT\x00GMT\x00\nGMT0\nPK\x03\x04\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\f\x00\x00\x00Africa/AccraTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\b\xff\xff\xff\xff\x92\xe6\x92H\x01\xff\xff\xfc8\x00\x00\x00\x00\x00\x00\x00\x04LMT\x00GMT\x00\nGMT0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x12\x00\x00\x00Africa/Addis_AbabaTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x05\x00\x00\x00\x04\x00\x00\x00\x14\xff\xff\xff\xff\x8b\xff\xd1\xfc\xff\xff\xff\xff\xb1\xee\xdaX\xff\xff\xff\xff\xb4\xc7\xe0\xd0\xff\xff\xff\xff\xc1\xed\xadX\xff\xff\xff\xff\xcclz\xd4\x01\x02\x01\x03\x02\x00\x00\"\x84\x00\x00" +
-	"\x00\x00#(\x00\x04\x00\x00*0\x00\n\x00\x00&\xac\x00\x0eLMT\x00+0230\x00EAT\x00+0245\x00\nEAT-3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc3" +
-	"\x8a\x0e\xc0\xd6\x01\x00\x00\xd6\x01\x00\x00\x0e\x00\x00\x00Africa/AlgiersTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\"\x00\x00\x00\x06" +
-	"\x00\x00\x00\x1a\xff\xff\xff\xffkɛ$\xff\xff\xff\xff\x91`PO\xff\xff\xff\xff\x9bGx\xf0\xff\xff\xff\xff\x9b\xd7,p\xff\xff\xff\xff\x9c\xbc\x91p\xff\xff\xff\xff\x9d\xc0H\xf0\xff\xff\xff\xff\x9e\x89\xfep" +
-	"\xff\xff\xff\xff\x9f\xa0*\xf0\xff\xff\xff\xff\xa0`\xa5\xf0\xff\xff\xff\xff\xa1\x80\f\xf0\xff\xff\xff\xff\xa2.\x12\xf0\xff\xff\xff\xff\xa3zL\xf0\xff\xff\xff\xff\xa45\x81\xf0\xff\xff\xff\xff\xa4\xb8\x06p\xff\xff\xff\xff" +
-	"\xc6\xff\x06p\xff\xff\xff\xff\xc7X\xba\x80\xff\xff\xff\xff\xc7\xda\t\xa0\xff\xff\xff\xffϒ4\x10\xff\xff\xff\xffЊ\x00\x00\xff\xff\xff\xff\xd1r\x16\x10\xff\xff\xff\xff\xd2N$p\xff\xff\xff\xff\xd4K\ap" +
-	"\xff\xff\xff\xff\xe5\xce\xd3\x00\xff\xff\xff\xff\xf3\\\xb0\xf0\x00\x00\x00\x00\x02x\xc1\xf0\x00\x00\x00\x00\x03C\xc8\xf0\x00\x00\x00\x00\r\xcf\xd7\x00\x00\x00\x00\x00\x0e\xadD\xf0\x00\x00\x00\x00\x0fxZ\x00\x00\x00\x00\x00" +
-	"\x10hY\x10\x00\x00\x00\x00\x12vCp\x00\x00\x00\x00\x13fB\x80\x00\x00\x00\x00\x14_|\x10\x00\x00\x00\x00\x15O_\x00\x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x05\x04\x05\x04\x05\x03\x05\x03" +
-	"\x02\x03\x02\x05\x04\x05\x03\x02\x03\x05\x00\x00\x02\xdc\x00\x00\x00\x00\x021\x00\x04\x00\x00\x0e\x10\x01\b\x00\x00\x00\x00\x00\r\x00\x00\x1c \x01\x11\x00\x00\x0e\x10\x00\x16LMT\x00PMT\x00WEST\x00W" +
-	"ET\x00CEST\x00CET\x00\nCET-1\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\r\x00\x00\x00Africa/Asma" +
-	"raTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x04\x00\x00\x00\x14\xff\xff\xff\xff\x8b\xff\xd1\xfc\xff\xff\xff\xff\xb1\xee\xdaX\xff\xff\xff\xff\xb4\xc7\xe0" +
-	"\xd0\xff\xff\xff\xff\xc1\xed\xadX\xff\xff\xff\xff\xcclz\xd4\x01\x02\x01\x03\x02\x00\x00\"\x84\x00\x00\x00\x00#(\x00\x04\x00\x00*0\x00\n\x00\x00&\xac\x00\x0eLMT\x00+0230\x00EAT\x00" +
-	"+0245\x00\nEAT-3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\r\x00\x00\x00Africa/AsmeraTZif" +
-	"2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x04\x00\x00\x00\x14\xff\xff\xff\xff\x8b\xff\xd1\xfc\xff\xff\xff\xff\xb1\xee\xdaX\xff\xff\xff\xff\xb4\xc7\xe0\xd0\xff\xff\xff\xff\xc1" +
-	"\xed\xadX\xff\xff\xff\xff\xcclz\xd4\x01\x02\x01\x03\x02\x00\x00\"\x84\x00\x00\x00\x00#(\x00\x04\x00\x00*0\x00\n\x00\x00&\xac\x00\x0eLMT\x00+0230\x00EAT\x00+0245\x00" +
-	"\nEAT-3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\r\x00\x00\x00Africa/BamakoTZif2\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\b\xff\xff\xff\xff\x92\xe6\x92H\x01\xff\xff\xfc8\x00\x00\x00\x00\x00\x00\x00\x04LMT\x00GMT\x00\nGMT0\n" +
-	"PK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\r\x00\x00\x00Africa/BanguiTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x12\xff\xff\xff\xff\x86\xabp\xd1\xff\xff\xff\xff\x8cP`\x00\xff\xff\xff\xff\x96\xaaC\xd1\xff\xff\xff\xff\xa1Q\xefx\x01\x00\x02\x03\x00\x00\x03/\x00\x00" +
-	"\x00\x00\x00\x00\x00\x04\x00\x00\a\b\x00\b\x00\x00\x0e\x10\x00\x0eLMT\x00GMT\x00+0030\x00WAT\x00\nWAT-1\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\b{" +
-	"\x87\x82\x00\x00\x00\x82\x00\x00\x00\r\x00\x00\x00Africa/BanjulTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00" +
-	"\b\xff\xff\xff\xff\x92\xe6\x92H\x01\xff\xff\xfc8\x00\x00\x00\x00\x00\x00\x00\x04LMT\x00GMT\x00\nGMT0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xca>\xd5\xe0\x95\x00\x00\x00\x95\x00" +
-	"\x00\x00\r\x00\x00\x00Africa/BissauTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" +
-	"\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\f\xff\xff\xff\xff\x92\xe6" +
-	"\x9c\x90\x00\x00\x00\x00\tga\x10\x01\x02\xff\xff\xf1d\x00\x00\xff\xff\xf1\xf0\x00\x04\x00\x00\x00\x00\x00\bLMT\x00-01\x00GMT\x00\nGMT0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00 \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\x0f\x00\x00\x00Africa/BlantyreTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" +
-	"\x00\x00\x00\x02\x00\x00\x00\b\xff\xff\xff\xff\x82F\xc5\xf4\x01\x00\x00\x1e\x8c\x00\x00\x00\x00\x1c \x00\x04LMT\x00CAT\x00\nCAT-2\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa7\x1d" +
-	"\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\x12\x00\x00\x00Africa/BrazzavilleTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00" +
-	"\x00\x00\x04\x00\x00\x00\x12\xff\xff\xff\xff\x86\xabp\xd1\xff\xff\xff\xff\x8cP`\x00\xff\xff\xff\xff\x96\xaaC\xd1\xff\xff\xff\xff\xa1Q\xefx\x01\x00\x02\x03\x00\x00\x03/\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\a\b\x00" +
-	"\b\x00\x00\x0e\x10\x00\x0eLMT\x00GMT\x00+0030\x00WAT\x00\nWAT-1\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\x10\x00" +
-	"\x00\x00Africa/BujumburaTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" +
-	"\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\b\xff\xff\xff\xff\x82F\xc5" +
-	"\xf4\x01\x00\x00\x1e\x8c\x00\x00\x00\x00\x1c \x00\x04LMT\x00CAT\x00\nCAT-2\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12tnj\xfc\x04\x00\x00\xfc\x04\x00\x00\f\x00\x00\x00A" +
-	"frica/CairoTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00" +
-	"\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x03\x00\x00\x00\r\xff\xff\xff\xff}\xbdM\xab\xff\xff\xff\xffȓ" +
-	"\xb4\xe0\xff\xff\xff\xff\xc8\xfa{\xd0\xff\xff\xff\xff\xc9\xfc\xef\xe0\xff\xff\xff\xff\xca\xc7\xe8\xd0\xff\xff\xff\xff\xcbˮ`\xff\xff\xff\xff\xcc\xdf)\xd0\xff\xff\xff\xffͬ\xe1\xe0\xff\xff\xff\xff\xce\xc6\xf4\xd0\xff\xff" +
-	"\xff\xffϏf\xe0\xff\xff\xff\xffЩy\xd0\xff\xff\xff\xffф`\xe0\xff\xff\xff\xffҊ\xadP\xff\xff\xff\xff\xe86c`\xff\xff\xff\xff\xe8\xf4-P\xff\xff\xff\xff\xea\v\xb9`\xff\xff\xff\xff\xea\xd5" +
-	"`\xd0\xff\xff\xff\xff\xeb\xec\xfa\xf0\xff\xff\xff\xff\xec\xb5m\x00\xff\xff\xff\xff\xed\xcf\x7f\xf0\xff\xff\xff\xff\xee\x97\xf2\x00\xff\xff\xff\xffﰳp\xff\xff\xff\xff\xf0y%\x80\xff\xff\xff\xff\xf1\x91\xe6\xf0\xff\xff" +
-	"\xff\xff\xf2ZY\x00\xff\xff\xff\xff\xf3s\x1ap\xff\xff\xff\xff\xf4;\x8c\x80\xff\xff\xff\xff\xf5U\x9fp\xff\xff\xff\xff\xf6\x1e\x11\x80\xff\xff\xff\xff\xf76\xd2\xf0\xff\xff\xff\xff\xf7\xffE\x00\xff\xff\xff\xff\xf9\x18" +
-	"\x06p\xff\xff\xff\xff\xf9\xe1\xca\x00\xff\xff\xff\xff\xfa\xf99\xf0\xff\xff\xff\xff\xfb\xc2\xfd\x80\xff\xff\xff\xff\xfc۾\xf0\xff\xff\xff\xff\xfd\xa5\x82\x80\xff\xff\xff\xff\xfe\xbc\xf2p\xff\xff\xff\xff\xff\x86\xb6\x00\x00\x00" +
-	"\x00\x00\x00\x9e%\xf0\x00\x00\x00\x00\x01g\xe9\x80\x00\x00\x00\x00\x02\x7fYp\x00\x00\x00\x00\x03I\x1d\x00\x00\x00\x00\x00\x04a\xdep\x00\x00\x00\x00\x05+\xa2\x00\x00\x00\x00\x00\x06C\x11\xf0\x00\x00\x00\x00\a\f" +
-	"Հ\x00\x00\x00\x00\b$Ep\x00\x00\x00\x00\b\xee\t\x00\x00\x00\x00\x00\n\x05x\xf0\x00\x00\x00\x00\n\xcf<\x80\x00\x00\x00\x00\v\xe7\xfd\xf0\x00\x00\x00\x00\f\xb1\xc1\x80\x00\x00\x00\x00\r\xc91p\x00\x00" +
-	"\x00\x00\x0e\x92\xf5\x00\x00\x00\x00\x00\x0f\xaad\xf0\x00\x00\x00\x00\x10t(\x80\x00\x00\x00\x00\x11\x8b\x98p\x00\x00\x00\x00\x12U\\\x00\x00\x00\x00\x00\x13n\x1dp\x00\x00\x00\x00\x147\xe1\x00\x00\x00\x00\x00\x15O" +
-	"P\xf0\x00\x00\x00\x00\x16\x19\x14\x80\x00\x00\x00\x00\x17\xa0\x93\xf0\x00\x00\x00\x00\x17\xfaH\x00\x00\x00\x00\x00\x19p\xa3\xf0\x00\x00\x00\x00\x19\xdb{\x80\x00\x00\x00\x00\x1a\xf4<\xf0\x00\x00\x00\x00\x1b\xbe\x00\x80\x00\x00" +
-	"\x00\x00\x1c\xd5pp\x00\x00\x00\x00\x1d\x9f4\x00\x00\x00\x00\x00\x1e\xb6\xa3\xf0\x00\x00\x00\x00\x1f\x80g\x80\x00\x00\x00\x00 \x97\xd7p\x00\x00\x00\x00!a\x9b\x00\x00\x00\x00\x00\"z\\p\x00\x00\x00\x00#D" +
-	" \x00\x00\x00\x00\x00$b'p\x00\x00\x00\x00%%S\x80\x00\x00\x00\x00&<\xc3p\x00\x00\x00\x00'\x06\x87\x00\x00\x00\x00\x00(\x1d\xf6\xf0\x00\x00\x00\x00(纀\x00\x00\x00\x00*\x00{\xf0\x00\x00" +
-	"\x00\x00*\xca?\x80\x00\x00\x00\x00+\xe1\xafp\x00\x00\x00\x00,\xabs\x00\x00\x00\x00\x00-\xc2\xe2\xf0\x00\x00\x00\x00.\x8c\xa6\x80\x00\x00\x00\x00/\xa0\x13\xe0\x00\x00\x00\x000k\f\xd0\x00\x00\x00\x001\x7f" +
-	"\xf5\xe0\x00\x00\x00\x002J\xee\xd0\x00\x00\x00\x003_\xd7\xe0\x00\x00\x00\x004*\xd0\xd0\x00\x00\x00\x005?\xb9\xe0\x00\x00\x00\x006\n\xb2\xd0\x00\x00\x00\x007(\xd6`\x00\x00\x00\x007\xf3\xcfP\x00\x00" +
-	"\x00\x009\b\xb8`\x00\x00\x00\x009ӱP\x00\x00\x00\x00:\xe8\x9a`\x00\x00\x00\x00;\xb3\x93P\x00\x00\x00\x00<\xc8|`\x00\x00\x00\x00=\x93uP\x00\x00\x00\x00>\xa8^`\x00\x00\x00\x00?s" +
-	"WP\x00\x00\x00\x00@\x91z\xe0\x00\x00\x00\x00A\\s\xd0\x00\x00\x00\x00Bq\\\xe0\x00\x00\x00\x00C<U\xd0\x00\x00\x00\x00DQ>\xe0\x00\x00\x00\x00E\x12\xfdP\x00\x00\x00\x00F1 \xe0\x00\x00" +
-	"\x00\x00F\xe0jP\x00\x00\x00\x00H\x11\x02\xe0\x00\x00\x00\x00H\xb7\x11\xd0\x00\x00\x00\x00I\xf0\xe4\xe0\x00\x00\x00\x00J\x8d\xb9P\x00\x00\x00\x00K\xda\x01`\x00\x00\x00\x00La\xbd\xd0\x00\x00\x00\x00L\x89" +
-	"X\xe0\x00\x00\x00\x00L\xa4\xfaP\x00\x00\x00\x00Su8\xe0\x00\x00\x00\x00S\xac\x89\xd0\x00\x00\x00\x00Sڼ`\x00\x00\x00\x00T$\x82P\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x00\x00\x1dU\x00\x00\x00\x00*0\x01" +
-	"\x04\x00\x00\x1c \x00\tLMT\x00EEST\x00EET\x00\nEET-2\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00d\x01\x05\x89\x7f\a\x00\x00\x7f\a\x00\x00\x11\x00\x00\x00Afr" +
-	"ica/CasablancaTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00" +
-	"\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc5\x00\x00\x00\x05\x00\x00\x00\f\xff\xff\xff\xff\x96Q\xf9\x9c\xff\xff\xff" +
-	"\xff\xc6\xff\x14\x80\xff\xff\xff\xff\xc7X\xacp\xff\xff\xff\xff\xc7\xd9\xed\x80\xff\xff\xff\xffҡ2\xf0\xff\xff\xff\xff\xdb5\xa4\x00\xff\xff\xff\xff\xdb\xee'\xf0\xff\xff\xff\xff\xfb%r@\xff\xff\xff\xff\xfb\xc2\xef" +
-	"p\x00\x00\x00\x00\bk\x84\x80\x00\x00\x00\x00\b\xc6m\xf0\x00\x00\x00\x00\v\xe8\f\x00\x00\x00\x00\x00\faG\xf0\x00\x00\x00\x00\r\xc9?\x80\x00\x00\x00\x00\x0e\x8e\xf2p\x00\x00\x00\x00\x0f\xd3Q\x80\x00\x00\x00" +
-	"\x00\x10'\xa3p\x00\x00\x00\x00\x1a\xb7\xa6\x00\x00\x00\x00\x00\x1e\x18o\xf0\x00\x00\x00\x00HA\xe6\x80\x00\x00\x00\x00H\xbb\"p\x00\x00\x00\x00J#\x1a\x00\x00\x00\x00\x00J\x8d\xd5p\x00\x00\x00\x00K\xdc\xc0" +
-	"\x80\x00\x00\x00\x00L]\xe5p\x00\x00\x00\x00M\x97\xb8\x80\x00\x00\x00\x00N4\x8c\xf0\x00\x00\x00\x00O\x9c\xa0\xa0\x00\x00\x00\x00P\b\xbb\xa0\x00\x00\x00\x00P1\x9a \x00\x00\x00\x00Pg\xa7\xa0\x00\x00\x00" +
-	"\x00Q|\x82\xa0\x00\x00\x00\x00Q\xd8ˠ\x00\x00\x00\x00R\x05\x9e\xa0\x00\x00\x00\x00Rls\xa0\x00\x00\x00\x00S7z\xa0\x00\x00\x00\x00S\xae!\xa0\x00\x00\x00\x00S\xdcF \x00\x00\x00\x00TLU" +
-	"\xa0\x00\x00\x00\x00U\x17\\\xa0\x00\x00\x00\x00U|\xe0 \x00\x00\x00\x00U\xab\x04\xa0\x00\x00\x00\x00V,7\xa0\x00\x00\x00\x00V\xf7>\xa0\x00\x00\x00\x00WS\x87\xa0\x00\x00\x00\x00W\x81\xac \x00\x00\x00" +
-	"\x00X\x15T \x00\x00\x00\x00X\xd7 \xa0\x00\x00\x00\x00Y \xf4\xa0\x00\x00\x00\x00YXS\xa0\x00\x00\x00\x00Y\xf56 \x00\x00\x00\x00Z\xb7\x02\xa0\x00\x00\x00\x00Z\xf7\x9c \x00\x00\x00\x00[%\xc0" +
-	"\xa0\x00\x00\x00\x00[\xd5\x18 \x00\x00\x00\x00\\\xceC\xa0\x00\x00\x00\x00\\\xfch \x00\x00\x00\x00^\x9b\xb0\xa0\x00\x00\x00\x00^\xd3\x0f\xa0\x00\x00\x00\x00`rX \x00\x00\x00\x00`\xa0|\xa0\x00\x00\x00" +
-	"\x00b?\xc5 \x00\x00\x00\x00bw$ \x00\x00\x00\x00d\x16l\xa0\x00\x00\x00\x00dMˠ\x00\x00\x00\x00e\xed\x14 \x00\x00\x00\x00f\x1b8\xa0\x00\x00\x00\x00g\xba\x81 \x00\x00\x00\x00g\xf1\xe0" +
-	" \x00\x00\x00\x00i\x91(\xa0\x00\x00\x00\x00i\xbfM \x00\x00\x00\x00kg\xd0 \x00\x00\x00\x00k\x95\xf4\xa0\x00\x00\x00\x00m5= \x00\x00\x00\x00ml\x9c \x00\x00\x00\x00o\v\xe4\xa0\x00\x00\x00" +
-	"\x00o:\t \x00\x00\x00\x00p\xd9Q\xa0\x00\x00\x00\x00q\x10\xb0\xa0\x00\x00\x00\x00r\xaf\xf9 \x00\x00\x00\x00r\xe7X \x00\x00\x00\x00t\x86\xa0\xa0\x00\x00\x00\x00t\xb4\xc5 \x00\x00\x00\x00vT\r" +
-	"\xa0\x00\x00\x00\x00v\x8bl\xa0\x00\x00\x00\x00x*\xb5 \x00\x00\x00\x00xX٠\x00\x00\x00\x00y\xf8\" \x00\x00\x00\x00z/\x81 \x00\x00\x00\x00{\xceɠ\x00\x00\x00\x00|\x06(\xa0\x00\x00\x00" +
-	"\x00}\xa5q \x00\x00\x00\x00}ӕ\xa0\x00\x00\x00\x00\x7fr\xde \x00\x00\x00\x00\x7f\xaa= \x00\x00\x00\x00\x81I\x85\xa0\x00\x00\x00\x00\x81\x80\xe4\xa0\x00\x00\x00\x00\x83 - \x00\x00\x00\x00\x83NQ" +
-	"\xa0\x00\x00\x00\x00\x84\xed\x9a \x00\x00\x00\x00\x85$\xf9 \x00\x00\x00\x00\x86\xc4A\xa0\x00\x00\x00\x00\x86\xf2f \x00\x00\x00\x00\x88\x91\xae\xa0\x00\x00\x00\x00\x88\xc9\r\xa0\x00\x00\x00\x00\x8ahV \x00\x00\x00" +
-	"\x00\x8a\x9f\xb5 \x00\x00\x00\x00\x8c>\xfd\xa0\x00\x00\x00\x00\x8cm\" \x00\x00\x00\x00\x8e\fj\xa0\x00\x00\x00\x00\x8eCɠ\x00\x00\x00\x00\x8f\xe3\x12 \x00\x00\x00\x00\x90\x1aq \x00\x00\x00\x00\x91\xb9\xb9" +
-	"\xa0\x00\x00\x00\x00\x91\xe7\xde \x00\x00\x00\x00\x93\x87&\xa0\x00\x00\x00\x00\x93\xbe\x85\xa0\x00\x00\x00\x00\x95]\xce \x00\x00\x00\x00\x95\x8b\xf2\xa0\x00\x00\x00\x00\x97+; \x00\x00\x00\x00\x97b\x9a \x00\x00\x00" +
-	"\x00\x99\x01\xe2\xa0\x00\x00\x00\x00\x999A\xa0\x00\x00\x00\x00\x9a؊ \x00\x00\x00\x00\x9b\x06\xae\xa0\x00\x00\x00\x00\x9c\xa5\xf7 \x00\x00\x00\x00\x9c\xddV \x00\x00\x00\x00\x9e|\x9e\xa0\x00\x00\x00\x00\x9e\xb3\xfd" +
-	"\xa0\x00\x00\x00\x00\xa0SF \x00\x00\x00\x00\xa0\x81j\xa0\x00\x00\x00\x00\xa2 \xb3 \x00\x00\x00\x00\xa2X\x12 \x00\x00\x00\x00\xa3\xf7Z\xa0\x00\x00\x00\x00\xa4%\x7f \x00\x00\x00\x00\xa5\xc4Ǡ\x00\x00\x00" +
-	"\x00\xa5\xfc&\xa0\x00\x00\x00\x00\xa7\x9bo \x00\x00\x00\x00\xa7\xd2\xce \x00\x00\x00\x00\xa9r\x16\xa0\x00\x00\x00\x00\xa9\xa0; \x00\x00\x00\x00\xab?\x83\xa0\x00\x00\x00\x00\xabv\xe2\xa0\x00\x00\x00\x00\xad\x16+" +
-	" \x00\x00\x00\x00\xadM\x8a \x00\x00\x00\x00\xae\xecҠ\x00\x00\x00\x00\xaf\x1a\xf7 \x00\x00\x00\x00\xb0\xba?\xa0\x00\x00\x00\x00\xb0\xf1\x9e\xa0\x00\x00\x00\x00\xb2\x90\xe7 \x00\x00\x00\x00\xb2\xbf\v\xa0\x00\x00\x00" +
-	"\x00\xb4^T \x00\x00\x00\x00\xb4\x95\xb3 \x00\x00\x00\x00\xb64\xfb\xa0\x00\x00\x00\x00\xb6lZ\xa0\x00\x00\x00\x00\xb8\v\xa3 \x00\x00\x00\x00\xb89Ǡ\x00\x00\x00\x00\xb9\xd9\x10 \x00\x00\x00\x00\xba\x10o" +
-	" \x00\x00\x00\x00\xbb\xaf\xb7\xa0\x00\x00\x00\x00\xbb\xe7\x16\xa0\x00\x00\x00\x00\xbd\x86_ \x00\x00\x00\x00\xbd\xb4\x83\xa0\x00\x00\x00\x00\xbfS\xcc \x00\x00\x00\x00\xbf\x8b+ \x00\x00\x00\x00\xc1*s\xa0\x00\x00\x00" +
-	"\x00\xc1X\x98 \x00\x00\x00\x00\xc2\xf7\xe0\xa0\x00\x00\x00\x00\xc3/?\xa0\x00\x00\x00\x00\xc4Έ \x00\x00\x00\x00\xc5\x05\xe7 \x00\x00\x00\x00ƥ/\xa0\x00\x00\x00\x00\xc6\xd3T \x00\x00\x00\x00\xc8r\x9c" +
-	"\xa0\x00\x00\x00\x00ȩ\xfb\xa0\x00\x00\x00\x00\xcaID \x00\x00\x00\x00ʀ\xa3 \x00\x00\x00\x00\xcc\x1f\xeb\xa0\x00\x00\x00\x00\xccN\x10 \x00\x00\x00\x00\xcd\xedX\xa0\x00\x00\x00\x00\xce$\xb7\xa0\x00\x00\x00" +
-	"\x00\xcf\xc4\x00 \x00\x00\x00\x00\xcf\xf2$\xa0\x00\x00\x00\x00ёm \x00\x00\x00\x00\xd1\xc8\xcc \x00\x00\x00\x00\xd3h\x14\xa0\x00\x00\x00\x00ӟs\xa0\x00\x00\x00\x00\xd5>\xbc \x00\x00\x00\x00\xd5l\xe0" +
-	"\xa0\x00\x00\x00\x00\xd7\f) \x00\x00\x00\x00\xd7C\x88 \x00\x00\x00\x00\xd8\xe2Р\x00\x00\x00\x00\xd9\x1a/\xa0\x00\x00\x00\x00ڹx \x00\x00\x00\x00\xda眠\x00\x00\x00\x00܆\xe5 \x00\x00\x00" +
-	"\x00ܾD \x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x03\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x03" +
-	"\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03" +
-	"\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03" +
-	"\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\xff\xff\xf8\xe4\x00\x00\x00\x00\x0e\x10\x01\x04\x00\x00\x00\x00\x00\b\x00\x00\x0e\x10\x00\x04\x00\x00\x00\x00\x01\bLMT\x00+01\x00" +
-	"+00\x00\n<+01>-1\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9f\x1b\xeb\xdd2\x02\x00\x002\x02\x00\x00\f\x00\x00\x00Africa/CeutaTZif2" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00+\x00\x00\x00\x05\x00\x00\x00\x16\xff\xff\xff\xff~6\xb5\x00\xff\xff\xff\xff\x9e\xd6up\xff\xff\xff\xff\x9f\xa1n`\xff\xff\xff\xff\xaa\x05" +
-	"\xefp\xff\xff\xff\xff\xaa\xe7n\x00\xff\xff\xff\xff\xadɧ\xf0\xff\xff\xff\xff\xae\xa72\x00\xff\xff\xff\xff\xaf\xa0Op\xff\xff\xff\xff\xb0\x87\x14\x00\xff\xff\xff\xff\xb1\x89z\x00\xff\xff\xff\xff\xb2p0\x80\xff\xff" +
-	"\xff\xff\xfb%r@\xff\xff\xff\xff\xfb\xc2\xefp\x00\x00\x00\x00\bk\x84\x80\x00\x00\x00\x00\b\xc6m\xf0\x00\x00\x00\x00\v\xe8\f\x00\x00\x00\x00\x00\faG\xf0\x00\x00\x00\x00\r\xc9?\x80\x00\x00\x00\x00\x0e\x8e" +
-	"\xf2p\x00\x00\x00\x00\x0f\xd3Q\x80\x00\x00\x00\x00\x10'\xa3p\x00\x00\x00\x00\x1a\xb7\xa6\x00\x00\x00\x00\x00\x1e\x8c\x90\x10\x00\x00\x00\x00\x1f|\x81\x10\x00\x00\x00\x00 lr\x10\x00\x00\x00\x00!\\c\x10\x00\x00" +
-	"\x00\x00\"LT\x10\x00\x00\x00\x00#<E\x10\x00\x00\x00\x00$,6\x10\x00\x00\x00\x00%\x1c'\x10\x00\x00\x00\x00&\f\x18\x10\x00\x00\x00\x00'\x05C\x90\x00\x00\x00\x00'\xf54\x90\x00\x00\x00\x00(\xe5" +
-	"%\x90\x00\x00\x00\x00)\xd5\x16\x90\x00\x00\x00\x00*\xc5\a\x90\x00\x00\x00\x00+\xb4\xf8\x90\x00\x00\x00\x00,\xa4\xe9\x90\x00\x00\x00\x00-\x94ڐ\x00\x00\x00\x00.\x84ː\x00\x00\x00\x00/t\xbc\x90\x00\x00" +
-	"\x00\x000d\xad\x90\x00\x00\x00\x001]\xd9\x10\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\xff\xff\xfb" +
-	"\x04\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x0e\x10\x01\b\x00\x00\x0e\x10\x00\r\x00\x00\x1c \x01\x11LMT\x00WET\x00WEST\x00CET\x00CEST\x00\nCET-1CEST," +
-	"M3.5.0,M10.5.0/3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x0e\x00\x00\x00Africa/Conakr" +
-	"yTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\b\xff\xff\xff\xff\x92\xe6\x92H\x01\xff\xff\xfc8\x00\x00\x00\x00\x00\x00\x00\x04LMT" +
-	"\x00GMT\x00\nGMT0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\f\x00\x00\x00Africa/DakarTZif2\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\b\xff\xff\xff\xff\x92\xe6\x92H\x01\xff\xff\xfc8\x00\x00\x00\x00\x00\x00\x00\x04LMT\x00GMT\x00\nGM" +
-	"T0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x14\x00\x00\x00Africa/Dar_es_SalaamTZif2\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x04\x00\x00\x00\x14\xff\xff\xff\xff\x8b\xff\xd1\xfc\xff\xff\xff\xff\xb1\xee\xdaX\xff\xff\xff\xff\xb4\xc7\xe0\xd0\xff\xff\xff\xff\xc1\xed\xadX" +
-	"\xff\xff\xff\xff\xcclz\xd4\x01\x02\x01\x03\x02\x00\x00\"\x84\x00\x00\x00\x00#(\x00\x04\x00\x00*0\x00\n\x00\x00&\xac\x00\x0eLMT\x00+0230\x00EAT\x00+0245\x00\nEA" +
-	"T-3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x0f\x00\x00\x00Africa/DjiboutiTZif2\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x04\x00\x00\x00\x14\xff\xff\xff\xff\x8b\xff\xd1\xfc\xff\xff\xff\xff\xb1\xee\xdaX\xff\xff\xff\xff\xb4\xc7\xe0\xd0\xff\xff\xff\xff\xc1\xed\xadX\xff\xff\xff\xff" +
-	"\xcclz\xd4\x01\x02\x01\x03\x02\x00\x00\"\x84\x00\x00\x00\x00#(\x00\x04\x00\x00*0\x00\n\x00\x00&\xac\x00\x0eLMT\x00+0230\x00EAT\x00+0245\x00\nEAT-3\n" +
-	"PK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\r\x00\x00\x00Africa/DoualaTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x12\xff\xff\xff\xff\x86\xabp\xd1\xff\xff\xff\xff\x8cP`\x00\xff\xff\xff\xff\x96\xaaC\xd1\xff\xff\xff\xff\xa1Q\xefx\x01\x00\x02\x03\x00\x00\x03/\x00\x00" +
-	"\x00\x00\x00\x00\x00\x04\x00\x00\a\b\x00\b\x00\x00\x0e\x10\x00\x0eLMT\x00GMT\x00+0030\x00WAT\x00\nWAT-1\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00)\xae\x8e" +
-	"o&\a\x00\x00&\a\x00\x00\x0f\x00\x00\x00Africa/El_AaiunTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xba\x00\x00\x00\x06\x00" +
-	"\x00\x00\x10\xff\xff\xff\xff\xbcH\xf0\xe0\x00\x00\x00\x00\vѰ\x90\x00\x00\x00\x00\v\xe8\f\x00\x00\x00\x00\x00\faG\xf0\x00\x00\x00\x00\r\xc9?\x80\x00\x00\x00\x00\x0e\x8e\xf2p\x00\x00\x00\x00\x0f\xd3Q\x80\x00" +
-	"\x00\x00\x00\x10'\xa3p\x00\x00\x00\x00HA\xe6\x80\x00\x00\x00\x00H\xbb\"p\x00\x00\x00\x00J#\x1a\x00\x00\x00\x00\x00J\x8d\xd5p\x00\x00\x00\x00K\xdc\xc0\x80\x00\x00\x00\x00L]\xe5p\x00\x00\x00\x00M" +
-	"\x97\xb8\x80\x00\x00\x00\x00N4\x8c\xf0\x00\x00\x00\x00O\x9c\xa0\xa0\x00\x00\x00\x00P\b\xbb\xa0\x00\x00\x00\x00P1\x9a \x00\x00\x00\x00Pg\xa7\xa0\x00\x00\x00\x00Q|\x82\xa0\x00\x00\x00\x00Q\xd8ˠ\x00" +
-	"\x00\x00\x00R\x05\x9e\xa0\x00\x00\x00\x00Rls\xa0\x00\x00\x00\x00S7z\xa0\x00\x00\x00\x00S\xae!\xa0\x00\x00\x00\x00S\xdcF \x00\x00\x00\x00TLU\xa0\x00\x00\x00\x00U\x17\\\xa0\x00\x00\x00\x00U" +
-	"|\xe0 \x00\x00\x00\x00U\xab\x04\xa0\x00\x00\x00\x00V,7\xa0\x00\x00\x00\x00V\xf7>\xa0\x00\x00\x00\x00WS\x87\xa0\x00\x00\x00\x00W\x81\xac \x00\x00\x00\x00X\x15T \x00\x00\x00\x00X\xd7 \xa0\x00" +
-	"\x00\x00\x00Y \xf4\xa0\x00\x00\x00\x00YXS\xa0\x00\x00\x00\x00Y\xf56 \x00\x00\x00\x00Z\xb7\x02\xa0\x00\x00\x00\x00Z\xf7\x9c \x00\x00\x00\x00[%\xc0\xa0\x00\x00\x00\x00[\xd5\x18 \x00\x00\x00\x00\\" +
-	"\xceC\xa0\x00\x00\x00\x00\\\xfch \x00\x00\x00\x00^\x9b\xb0\xa0\x00\x00\x00\x00^\xd3\x0f\xa0\x00\x00\x00\x00`rX \x00\x00\x00\x00`\xa0|\xa0\x00\x00\x00\x00b?\xc5 \x00\x00\x00\x00bw$ \x00" +
-	"\x00\x00\x00d\x16l\xa0\x00\x00\x00\x00dMˠ\x00\x00\x00\x00e\xed\x14 \x00\x00\x00\x00f\x1b8\xa0\x00\x00\x00\x00g\xba\x81 \x00\x00\x00\x00g\xf1\xe0 \x00\x00\x00\x00i\x91(\xa0\x00\x00\x00\x00i" +
-	"\xbfM \x00\x00\x00\x00kg\xd0 \x00\x00\x00\x00k\x95\xf4\xa0\x00\x00\x00\x00m5= \x00\x00\x00\x00ml\x9c \x00\x00\x00\x00o\v\xe4\xa0\x00\x00\x00\x00o:\t \x00\x00\x00\x00p\xd9Q\xa0\x00" +
-	"\x00\x00\x00q\x10\xb0\xa0\x00\x00\x00\x00r\xaf\xf9 \x00\x00\x00\x00r\xe7X \x00\x00\x00\x00t\x86\xa0\xa0\x00\x00\x00\x00t\xb4\xc5 \x00\x00\x00\x00vT\r\xa0\x00\x00\x00\x00v\x8bl\xa0\x00\x00\x00\x00x" +
-	"*\xb5 \x00\x00\x00\x00xX٠\x00\x00\x00\x00y\xf8\" \x00\x00\x00\x00z/\x81 \x00\x00\x00\x00{\xceɠ\x00\x00\x00\x00|\x06(\xa0\x00\x00\x00\x00}\xa5q \x00\x00\x00\x00}ӕ\xa0\x00" +
-	"\x00\x00\x00\x7fr\xde \x00\x00\x00\x00\x7f\xaa= \x00\x00\x00\x00\x81I\x85\xa0\x00\x00\x00\x00\x81\x80\xe4\xa0\x00\x00\x00\x00\x83 - \x00\x00\x00\x00\x83NQ\xa0\x00\x00\x00\x00\x84\xed\x9a \x00\x00\x00\x00\x85" +
-	"$\xf9 \x00\x00\x00\x00\x86\xc4A\xa0\x00\x00\x00\x00\x86\xf2f \x00\x00\x00\x00\x88\x91\xae\xa0\x00\x00\x00\x00\x88\xc9\r\xa0\x00\x00\x00\x00\x8ahV \x00\x00\x00\x00\x8a\x9f\xb5 \x00\x00\x00\x00\x8c>\xfd\xa0\x00" +
-	"\x00\x00\x00\x8cm\" \x00\x00\x00\x00\x8e\fj\xa0\x00\x00\x00\x00\x8eCɠ\x00\x00\x00\x00\x8f\xe3\x12 \x00\x00\x00\x00\x90\x1aq \x00\x00\x00\x00\x91\xb9\xb9\xa0\x00\x00\x00\x00\x91\xe7\xde \x00\x00\x00\x00\x93" +
-	"\x87&\xa0\x00\x00\x00\x00\x93\xbe\x85\xa0\x00\x00\x00\x00\x95]\xce \x00\x00\x00\x00\x95\x8b\xf2\xa0\x00\x00\x00\x00\x97+; \x00\x00\x00\x00\x97b\x9a \x00\x00\x00\x00\x99\x01\xe2\xa0\x00\x00\x00\x00\x999A\xa0\x00" +
-	"\x00\x00\x00\x9a؊ \x00\x00\x00\x00\x9b\x06\xae\xa0\x00\x00\x00\x00\x9c\xa5\xf7 \x00\x00\x00\x00\x9c\xddV \x00\x00\x00\x00\x9e|\x9e\xa0\x00\x00\x00\x00\x9e\xb3\xfd\xa0\x00\x00\x00\x00\xa0SF \x00\x00\x00\x00\xa0" +
-	"\x81j\xa0\x00\x00\x00\x00\xa2 \xb3 \x00\x00\x00\x00\xa2X\x12 \x00\x00\x00\x00\xa3\xf7Z\xa0\x00\x00\x00\x00\xa4%\x7f \x00\x00\x00\x00\xa5\xc4Ǡ\x00\x00\x00\x00\xa5\xfc&\xa0\x00\x00\x00\x00\xa7\x9bo \x00" +
-	"\x00\x00\x00\xa7\xd2\xce \x00\x00\x00\x00\xa9r\x16\xa0\x00\x00\x00\x00\xa9\xa0; \x00\x00\x00\x00\xab?\x83\xa0\x00\x00\x00\x00\xabv\xe2\xa0\x00\x00\x00\x00\xad\x16+ \x00\x00\x00\x00\xadM\x8a \x00\x00\x00\x00\xae" +
-	"\xecҠ\x00\x00\x00\x00\xaf\x1a\xf7 \x00\x00\x00\x00\xb0\xba?\xa0\x00\x00\x00\x00\xb0\xf1\x9e\xa0\x00\x00\x00\x00\xb2\x90\xe7 \x00\x00\x00\x00\xb2\xbf\v\xa0\x00\x00\x00\x00\xb4^T \x00\x00\x00\x00\xb4\x95\xb3 \x00" +
-	"\x00\x00\x00\xb64\xfb\xa0\x00\x00\x00\x00\xb6lZ\xa0\x00\x00\x00\x00\xb8\v\xa3 \x00\x00\x00\x00\xb89Ǡ\x00\x00\x00\x00\xb9\xd9\x10 \x00\x00\x00\x00\xba\x10o \x00\x00\x00\x00\xbb\xaf\xb7\xa0\x00\x00\x00\x00\xbb" +
-	"\xe7\x16\xa0\x00\x00\x00\x00\xbd\x86_ \x00\x00\x00\x00\xbd\xb4\x83\xa0\x00\x00\x00\x00\xbfS\xcc \x00\x00\x00\x00\xbf\x8b+ \x00\x00\x00\x00\xc1*s\xa0\x00\x00\x00\x00\xc1X\x98 \x00\x00\x00\x00\xc2\xf7\xe0\xa0\x00" +
-	"\x00\x00\x00\xc3/?\xa0\x00\x00\x00\x00\xc4Έ \x00\x00\x00\x00\xc5\x05\xe7 \x00\x00\x00\x00ƥ/\xa0\x00\x00\x00\x00\xc6\xd3T \x00\x00\x00\x00\xc8r\x9c\xa0\x00\x00\x00\x00ȩ\xfb\xa0\x00\x00\x00\x00\xca" +
-	"ID \x00\x00\x00\x00ʀ\xa3 \x00\x00\x00\x00\xcc\x1f\xeb\xa0\x00\x00\x00\x00\xccN\x10 \x00\x00\x00\x00\xcd\xedX\xa0\x00\x00\x00\x00\xce$\xb7\xa0\x00\x00\x00\x00\xcf\xc4\x00 \x00\x00\x00\x00\xcf\xf2$\xa0\x00" +
-	"\x00\x00\x00ёm \x00\x00\x00\x00\xd1\xc8\xcc \x00\x00\x00\x00\xd3h\x14\xa0\x00\x00\x00\x00ӟs\xa0\x00\x00\x00\x00\xd5>\xbc \x00\x00\x00\x00\xd5l\xe0\xa0\x00\x00\x00\x00\xd7\f) \x00\x00\x00\x00\xd7" +
-	"C\x88 \x00\x00\x00\x00\xd8\xe2Р\x00\x00\x00\x00\xd9\x1a/\xa0\x00\x00\x00\x00ڹx \x00\x00\x00\x00\xda眠\x00\x00\x00\x00܆\xe5 \x00\x00\x00\x00ܾD \x01\x03\x02\x03\x02\x03\x02\x03\x02" +
-	"\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04" +
-	"\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04" +
-	"\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\xff\xff\xf3" +
-	"\xa0\x00\x00\xff\xff\xf1\xf0\x00\x04\x00\x00\x0e\x10\x01\b\x00\x00\x00\x00\x00\f\x00\x00\x00\x00\x01\f\x00\x00\x0e\x10\x00\bLMT\x00-01\x00+01\x00+00\x00\n<+01>-1\nPK" +
-	"\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x0f\x00\x00\x00Africa/FreetownTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\b\xff\xff\xff\xff\x92\xe6\x92H\x01\xff\xff\xfc8\x00\x00\x00\x00\x00\x00\x00\x04LMT\x00GMT\x00\nGMT0\nPK\x03\x04\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00 \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\x0f\x00\x00\x00Africa/GaboroneTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\b\xff\xff\xff\xff\x82F\xc5\xf4\x01\x00\x00\x1e\x8c\x00\x00\x00\x00\x1c \x00\x04LMT\x00CAT\x00\nCAT-2\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00 \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\r\x00\x00\x00Africa/HarareTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" +
-	"\x00\x00\x02\x00\x00\x00\b\xff\xff\xff\xff\x82F\xc5\xf4\x01\x00\x00\x1e\x8c\x00\x00\x00\x00\x1c \x00\x04LMT\x00CAT\x00\nCAT-2\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcc\fT" +
-	"ξ\x00\x00\x00\xbe\x00\x00\x00\x13\x00\x00\x00Africa/JohannesburgTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00" +
-	"\x00\x00\x04\x00\x00\x00\t\xff\xff\xff\xffm{A@\xff\xff\xff\xff\x82F\xcfh\xff\xff\xff\xff̮\x8c\x80\xff\xff\xff\xff͞op\xff\xff\xff\xffΎn\x80\xff\xff\xff\xff\xcf~Qp\x01\x03\x02\x03\x02" +
-	"\x03\x00\x00\x1a@\x00\x00\x00\x00\x15\x18\x00\x04\x00\x00*0\x01\x04\x00\x00\x1c \x00\x04LMT\x00SAST\x00\nSAST-2\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\xcf\x10n" +
-	"\xca\x01\x00\x00\xca\x01\x00\x00\v\x00\x00\x00Africa/JubaTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00#\x00\x00\x00\x04\x00\x00\x00\x11\xff\xff" +
-	"\xff\xff\xb6\xa3\xda\xdc\x00\x00\x00\x00\x00\x9e\x17\xe0\x00\x00\x00\x00\x01z4P\x00\x00\x00\x00\x02}\xf9\xe0\x00\x00\x00\x00\x03[g\xd0\x00\x00\x00\x00\x04`~\xe0\x00\x00\x00\x00\x05=\xec\xd0\x00\x00\x00\x00\x06@" +
-	"`\xe0\x00\x00\x00\x00\a\x1f P\x00\x00\x00\x00\b B\xe0\x00\x00\x00\x00\t\x00S\xd0\x00\x00\x00\x00\n\x00$\xe0\x00\x00\x00\x00\n\xe1\x87P\x00\x00\x00\x00\v\xe0\x06\xe0\x00\x00\x00\x00\f\xc4\fP\x00\x00" +
-	"\x00\x00\r\xbf\xe8\xe0\x00\x00\x00\x00\x0e\xa5?\xd0\x00\x00\x00\x00\x0f\xa9\x05`\x00\x00\x00\x00\x10\x86sP\x00\x00\x00\x00\x11\x88\xe7`\x00\x00\x00\x00\x12g\xa6\xd0\x00\x00\x00\x00\x13h\xc9`\x00\x00\x00\x00\x14J" +
-	"+\xd0\x00\x00\x00\x00\x15H\xab`\x00\x00\x00\x00\x16+_P\x00\x00\x00\x00\x17(\x8d`\x00\x00\x00\x00\x18\f\x92\xd0\x00\x00\x00\x00\x19\bo`\x00\x00\x00\x00\x19\xed\xc6P\x00\x00\x00\x00\x1a\xf1\x8b\xe0\x00\x00" +
-	"\x00\x00\x1b\xd0KP\x00\x00\x00\x00\x1c\xd1m\xe0\x00\x00\x00\x00\x1d\xb1~\xd0\x00\x00\x00\x008\x80E \x00\x00\x00\x00`\x17\x1aP\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x03\x02\x00\x00\x1d\xa4\x00\x00\x00\x00*0\x01\x04\x00\x00\x1c \x00\t\x00\x00*0\x00\rLMT\x00CAST\x00CAT\x00EAT\x00\nCAT-2" +
-	"\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x0e\x00\x00\x00Africa/KampalaTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x04\x00\x00\x00\x14\xff\xff\xff\xff\x8b\xff\xd1\xfc\xff\xff\xff\xff\xb1\xee\xdaX\xff\xff\xff\xff\xb4\xc7\xe0\xd0\xff\xff\xff\xff\xc1\xed\xadX\xff\xff\xff\xff\xcclz\xd4" +
-	"\x01\x02\x01\x03\x02\x00\x00\"\x84\x00\x00\x00\x00#(\x00\x04\x00\x00*0\x00\n\x00\x00&\xac\x00\x0eLMT\x00+0230\x00EAT\x00+0245\x00\nEAT-3\nPK\x03\x04" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00V\xadD\xef\xca\x01\x00\x00\xca\x01\x00\x00\x0f\x00\x00\x00Africa/KhartoumTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00#\x00\x00\x00\x04\x00\x00\x00\x11\xff\xff\xff\xff\xb6\xa3\xda\x00\x00\x00\x00\x00\x00\x9e\x17\xe0\x00\x00\x00\x00\x01z4P\x00\x00\x00\x00\x02}\xf9\xe0\x00\x00\x00\x00\x03[g\xd0\x00\x00\x00\x00" +
-	"\x04`~\xe0\x00\x00\x00\x00\x05=\xec\xd0\x00\x00\x00\x00\x06@`\xe0\x00\x00\x00\x00\a\x1f P\x00\x00\x00\x00\b B\xe0\x00\x00\x00\x00\t\x00S\xd0\x00\x00\x00\x00\n\x00$\xe0\x00\x00\x00\x00\n\xe1\x87P" +
-	"\x00\x00\x00\x00\v\xe0\x06\xe0\x00\x00\x00\x00\f\xc4\fP\x00\x00\x00\x00\r\xbf\xe8\xe0\x00\x00\x00\x00\x0e\xa5?\xd0\x00\x00\x00\x00\x0f\xa9\x05`\x00\x00\x00\x00\x10\x86sP\x00\x00\x00\x00\x11\x88\xe7`\x00\x00\x00\x00" +
-	"\x12g\xa6\xd0\x00\x00\x00\x00\x13h\xc9`\x00\x00\x00\x00\x14J+\xd0\x00\x00\x00\x00\x15H\xab`\x00\x00\x00\x00\x16+_P\x00\x00\x00\x00\x17(\x8d`\x00\x00\x00\x00\x18\f\x92\xd0\x00\x00\x00\x00\x19\bo`" +
-	"\x00\x00\x00\x00\x19\xed\xc6P\x00\x00\x00\x00\x1a\xf1\x8b\xe0\x00\x00\x00\x00\x1b\xd0KP\x00\x00\x00\x00\x1c\xd1m\xe0\x00\x00\x00\x00\x1d\xb1~\xd0\x00\x00\x00\x008\x80E \x00\x00\x00\x00Y\xf8\xe4P\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x03\x02\x00\x00\x1e\x80\x00\x00\x00\x00*0\x01\x04\x00\x00\x1c \x00\t\x00\x00*0\x00\rLMT\x00C" +
-	"AST\x00CAT\x00EAT\x00\nCAT-2\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\r\x00\x00\x00Africa/Kiga" +
-	"liTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\b\xff\xff\xff\xff\x82F\xc5\xf4\x01\x00\x00\x1e\x8c\x00\x00\x00\x00\x1c \x00\x04LM" +
-	"T\x00CAT\x00\nCAT-2\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\x0f\x00\x00\x00Africa/KinshasaTZ" +
-	"if2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x12\xff\xff\xff\xff\x86\xabp\xd1\xff\xff\xff\xff\x8cP`\x00\xff\xff\xff\xff\x96\xaaC\xd1\xff\xff\xff" +
-	"\xff\xa1Q\xefx\x01\x00\x02\x03\x00\x00\x03/\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\a\b\x00\b\x00\x00\x0e\x10\x00\x0eLMT\x00GMT\x00+0030\x00WAT\x00\nWAT-1\nPK" +
-	"\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\f\x00\x00\x00Africa/LagosTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x12\xff\xff\xff\xff\x86\xabp\xd1\xff\xff\xff\xff\x8cP`\x00\xff\xff\xff\xff\x96\xaaC\xd1\xff\xff\xff\xff\xa1Q\xefx\x01\x00\x02\x03\x00\x00\x03/\x00\x00\x00\x00\x00" +
-	"\x00\x00\x04\x00\x00\a\b\x00\b\x00\x00\x0e\x10\x00\x0eLMT\x00GMT\x00+0030\x00WAT\x00\nWAT-1\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa7\x1d\xb3c\xb4\x00" +
-	"\x00\x00\xb4\x00\x00\x00\x11\x00\x00\x00Africa/LibrevilleTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00" +
-	"\x00\x12\xff\xff\xff\xff\x86\xabp\xd1\xff\xff\xff\xff\x8cP`\x00\xff\xff\xff\xff\x96\xaaC\xd1\xff\xff\xff\xff\xa1Q\xefx\x01\x00\x02\x03\x00\x00\x03/\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\a\b\x00\b\x00\x00\x0e\x10" +
-	"\x00\x0eLMT\x00GMT\x00+0030\x00WAT\x00\nWAT-1\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\v\x00\x00\x00Afr" +
-	"ica/LomeTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00T" +
-	"Zif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\b\xff\xff\xff\xff\x92\xe6\x92H\x01\xff\xff\xfc8\x00\x00\x00\x00" +
-	"\x00\x00\x00\x04LMT\x00GMT\x00\nGMT0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\r\x00\x00\x00Africa/Luand" +
-	"aTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x12\xff\xff\xff\xff\x86\xabp\xd1\xff\xff\xff\xff\x8cP`\x00\xff\xff\xff\xff\x96\xaaC\xd1" +
-	"\xff\xff\xff\xff\xa1Q\xefx\x01\x00\x02\x03\x00\x00\x03/\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\a\b\x00\b\x00\x00\x0e\x10\x00\x0eLMT\x00GMT\x00+0030\x00WAT\x00\nWAT-1" +
-	"\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\x11\x00\x00\x00Africa/LubumbashiTZif2\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\b\xff\xff\xff\xff\x82F\xc5\xf4\x01\x00\x00\x1e\x8c\x00\x00\x00\x00\x1c \x00\x04LMT\x00CAT\x00\nCAT-2\nP" +
-	"K\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\r\x00\x00\x00Africa/LusakaTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\b\xff\xff\xff\xff\x82F\xc5\xf4\x01\x00\x00\x1e\x8c\x00\x00\x00\x00\x1c \x00\x04LMT\x00CAT\x00\nCAT-2\nPK\x03\x04\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\r\x00\x00\x00Africa/MalaboTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x12\xff\xff\xff\xff\x86\xabp\xd1\xff\xff\xff\xff\x8cP`\x00\xff\xff\xff\xff\x96\xaaC\xd1\xff\xff\xff\xff\xa1Q\xefx\x01\x00\x02\x03\x00\x00\x03/\x00\x00\x00\x00\x00\x00\x00\x04\x00" +
-	"\x00\a\b\x00\b\x00\x00\x0e\x10\x00\x0eLMT\x00GMT\x00+0030\x00WAT\x00\nWAT-1\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x1b\xb0_\x83\x00\x00\x00\x83\x00" +
-	"\x00\x00\r\x00\x00\x00Africa/MaputoTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" +
-	"\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\b\xff\xff\xff\xff\x82F" +
-	"\xc5\xf4\x01\x00\x00\x1e\x8c\x00\x00\x00\x00\x1c \x00\x04LMT\x00CAT\x00\nCAT-2\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcc\fTξ\x00\x00\x00\xbe\x00\x00\x00\r\x00\x00\x00" +
-	"Africa/MaseruTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00" +
-	"\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x04\x00\x00\x00\t\xff\xff\xff\xffm{A@\xff\xff\xff\xff" +
-	"\x82F\xcfh\xff\xff\xff\xff̮\x8c\x80\xff\xff\xff\xff͞op\xff\xff\xff\xffΎn\x80\xff\xff\xff\xff\xcf~Qp\x01\x03\x02\x03\x02\x03\x00\x00\x1a@\x00\x00\x00\x00\x15\x18\x00\x04\x00\x00*0\x01\x04" +
-	"\x00\x00\x1c \x00\x04LMT\x00SAST\x00\nSAST-2\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcc\fTξ\x00\x00\x00\xbe\x00\x00\x00\x0e\x00\x00\x00Africa/" +
-	"MbabaneTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZ" +
-	"if2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x04\x00\x00\x00\t\xff\xff\xff\xffm{A@\xff\xff\xff\xff\x82F\xcfh\xff\xff" +
-	"\xff\xff̮\x8c\x80\xff\xff\xff\xff͞op\xff\xff\xff\xffΎn\x80\xff\xff\xff\xff\xcf~Qp\x01\x03\x02\x03\x02\x03\x00\x00\x1a@\x00\x00\x00\x00\x15\x18\x00\x04\x00\x00*0\x01\x04\x00\x00\x1c \x00\x04" +
-	"LMT\x00SAST\x00\nSAST-2\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x10\x00\x00\x00Africa/Mogadi" +
-	"shuTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x04\x00\x00\x00\x14\xff\xff\xff\xff\x8b\xff\xd1\xfc\xff\xff\xff\xff\xb1\xee\xdaX\xff\xff\xff\xff\xb4\xc7" +
-	"\xe0\xd0\xff\xff\xff\xff\xc1\xed\xadX\xff\xff\xff\xff\xcclz\xd4\x01\x02\x01\x03\x02\x00\x00\"\x84\x00\x00\x00\x00#(\x00\x04\x00\x00*0\x00\n\x00\x00&\xac\x00\x0eLMT\x00+0230\x00EAT" +
-	"\x00+0245\x00\nEAT-3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x006\x99rU\xa4\x00\x00\x00\xa4\x00\x00\x00\x0f\x00\x00\x00Africa/MonroviaT" +
-	"Zif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\f\xff\xff\xff\xffZz\xa6\x9c\xff\xff\xff\xff\xa0_l\x9c\x00\x00\x00\x00\x03\xcaZn\x01\x02" +
-	"\x03\xff\xff\xf5\xe4\x00\x00\xff\xff\xf5\xe4\x00\x04\xff\xff\xf5\x92\x00\x04\x00\x00\x00\x00\x00\bLMT\x00MMT\x00GMT\x00\nGMT0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\x8d\x98" +
-	"ƿ\x00\x00\x00\xbf\x00\x00\x00\x0e\x00\x00\x00Africa/NairobiTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x04\x00\x00" +
-	"\x00\x14\xff\xff\xff\xff\x8b\xff\xd1\xfc\xff\xff\xff\xff\xb1\xee\xdaX\xff\xff\xff\xff\xb4\xc7\xe0\xd0\xff\xff\xff\xff\xc1\xed\xadX\xff\xff\xff\xff\xcclz\xd4\x01\x02\x01\x03\x02\x00\x00\"\x84\x00\x00\x00\x00#(\x00\x04\x00" +
-	"\x00*0\x00\n\x00\x00&\xac\x00\x0eLMT\x00+0230\x00EAT\x00+0245\x00\nEAT-3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaa\x81\t\x03\xa0\x00\x00\x00" +
-	"\xa0\x00\x00\x00\x0f\x00\x00\x00Africa/NdjamenaTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x03\x00\x00\x00\r\xff\xff" +
-	"\xff\xff\x92\xe6\x80d\x00\x00\x00\x00\x12fqp\x00\x00\x00\x00\x13&\xde`\x01\x02\x01\x00\x00\x0e\x1c\x00\x00\x00\x00\x0e\x10\x00\x04\x00\x00\x1c \x01\bLMT\x00WAT\x00WAST\x00\nWAT" +
-	"-1\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\r\x00\x00\x00Africa/NiameyTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x12\xff\xff\xff\xff\x86\xabp\xd1\xff\xff\xff\xff\x8cP`\x00\xff\xff\xff\xff\x96\xaaC\xd1\xff\xff\xff\xff\xa1Q\xefx\x01\x00\x02\x03\x00\x00\x03" +
-	"/\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\a\b\x00\b\x00\x00\x0e\x10\x00\x0eLMT\x00GMT\x00+0030\x00WAT\x00\nWAT-1\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x11\x00\x00\x00Africa/NouakchottTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" +
-	"\x00\x00\x00\x02\x00\x00\x00\b\xff\xff\xff\xff\x92\xe6\x92H\x01\xff\xff\xfc8\x00\x00\x00\x00\x00\x00\x00\x04LMT\x00GMT\x00\nGMT0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\b{" +
-	"\x87\x82\x00\x00\x00\x82\x00\x00\x00\x12\x00\x00\x00Africa/OuagadougouTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" +
-	"\x00\x02\x00\x00\x00\b\xff\xff\xff\xff\x92\xe6\x92H\x01\xff\xff\xfc8\x00\x00\x00\x00\x00\x00\x00\x04LMT\x00GMT\x00\nGMT0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa7\x1d\xb3c\xb4" +
-	"\x00\x00\x00\xb4\x00\x00\x00\x11\x00\x00\x00Africa/Porto-NovoTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x04\x00" +
-	"\x00\x00\x12\xff\xff\xff\xff\x86\xabp\xd1\xff\xff\xff\xff\x8cP`\x00\xff\xff\xff\xff\x96\xaaC\xd1\xff\xff\xff\xff\xa1Q\xefx\x01\x00\x02\x03\x00\x00\x03/\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\a\b\x00\b\x00\x00\x0e" +
-	"\x10\x00\x0eLMT\x00GMT\x00+0030\x00WAT\x00\nWAT-1\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc1\n\x8a\x84\xad\x00\x00\x00\xad\x00\x00\x00\x0f\x00\x00\x00Af" +
-	"rica/Sao_TomeTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00" +
-	"\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\f\xff\xff\xff\xff^<\xfd0\xff\xff\xff\xff" +
-	"\x92掀\x00\x00\x00\x00ZI\x88\x10\x00\x00\x00\x00\\*\xbb\x90\x01\x02\x03\x02\x00\x00\x06P\x00\x00\xff\xff\xf7c\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x0e\x10\x00\bLMT\x00GMT\x00WAT\x00" +
-	"\nGMT0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x0f\x00\x00\x00Africa/TimbuktuTZif2\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\b\xff\xff\xff\xff\x92\xe6\x92H\x01\xff\xff\xfc8\x00\x00\x00\x00\x00\x00\x00\x04LMT\x00GMT\x00\nGMT0" +
-	"\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00_\x7f2[\xaf\x01\x00\x00\xaf\x01\x00\x00\x0e\x00\x00\x00Africa/TripoliTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\x00\x00\x04\x00\x00\x00\x11\xff\xff\xff\xff\xa1\xf2\xc1$\xff\xff\xff\xffݻ\xb1\x10\xff\xff\xff\xff\xde#\xad`\xff\xff\xff\xff\xe1x\xd2\x10\xff\xff\xff\xff\xe1\xe7e\xe0" +
-	"\xff\xff\xff\xff\xe5/?p\xff\xff\xff\xff\xe5\xa9\xcc\xe0\xff\xff\xff\xff\xebN\xc6\xf0\x00\x00\x00\x00\x16\x92B`\x00\x00\x00\x00\x17\b\xf7p\x00\x00\x00\x00\x17\xfa+\xe0\x00\x00\x00\x00\x18\xea*\xf0\x00\x00\x00\x00" +
-	"\x19\xdb_`\x00\x00\x00\x00\x1a̯\xf0\x00\x00\x00\x00\x1b\xbd\xe4`\x00\x00\x00\x00\x1c\xb4z\xf0\x00\x00\x00\x00\x1d\x9f\x17\xe0\x00\x00\x00\x00\x1e\x93\vp\x00\x00\x00\x00\x1f\x82\xee`\x00\x00\x00\x00 pJp" +
-	"\x00\x00\x00\x00!a~\xe0\x00\x00\x00\x00\"R\xcfp\x00\x00\x00\x00#D\x03\xe0\x00\x00\x00\x00$4\x02\xf0\x00\x00\x00\x00%%7`\x00\x00\x00\x00&@\xb7\xf0\x00\x00\x00\x002N\xf1`\x00\x00\x00\x00" +
-	"3D6p\x00\x00\x00\x0045j\xe0\x00\x00\x00\x00P\x9d\x99\x00\x00\x00\x00\x00QTـ\x00\x00\x00\x00Ri\xb4\x80\x02\x01\x02\x01\x02\x01\x02\x03\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x03\x02\x01\x03\x02\x01\x03\x00\x00\f\\\x00\x00\x00\x00\x1c \x01\x04\x00\x00\x0e\x10\x00\t\x00\x00\x1c \x00\rLMT\x00CEST\x00CET\x00EET\x00\nEET-2\nPK\x03\x04" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x93\xf4\x94\v\xc1\x01\x00\x00\xc1\x01\x00\x00\f\x00\x00\x00Africa/TunisTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\"\x00\x00\x00\x04\x00\x00\x00\x11\xff\xff\xff\xffYF\x13\xf4\xff\xff\xff\xff\x91`PO\xff\xff\xff\xff\xc6:\x88\xe0\xff\xff\xff\xff\xc7X\x9e`\xff\xff\xff\xff\xc7\xdb\"\xe0\xff\xff\xff\xff\xca\xe2T" +
-	"\xe0\xff\xff\xff\xff˭i\xf0\xff\xff\xff\xff\xcc\xe7K\x10\xff\xff\xff\xffͩ\x17\x90\xff\xff\xff\xff\xcd\xc2\x16\x00\xff\xff\xff\xff\xcd̰\x10\xff\xff\xff\xff\u03a25\x00\xff\xff\xff\xffϒ4\x10\xff\xff\xff" +
-	"\xffЉ\xe3\xe0\xff\xff\xff\xff\xd1r\x16\x10\xff\xff\xff\xff\xd2N\x16`\x00\x00\x00\x00\r\xc7\xdf\xf0\x00\x00\x00\x00\x0e\x89\xacp\x00\x00\x00\x00\x0f\xaad\xf0\x00\x00\x00\x00\x10t\x1ap\x00\x00\x00\x00\"\xa3:" +
-	"\xf0\x00\x00\x00\x00#<(\xf0\x00\x00\x00\x00$,\x19\xf0\x00\x00\x00\x00%\x1c\n\xf0\x00\x00\x00\x00&<\xc3p\x00\x00\x00\x00'\x05'p\x00\x00\x00\x00Bt\r\xf0\x00\x00\x00\x00C<\x80\x00\x00\x00\x00" +
-	"\x00D%\xe7\x90\x00\x00\x00\x00EC\xfd\x10\x00\x00\x00\x00F\x05ɐ\x00\x00\x00\x00G#\xdf\x10\x00\x00\x00\x00G\xee\xe6\x10\x00\x00\x00\x00I\x03\xc1\x10\x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02" +
-	"\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x00\x00\t\x8c\x00\x00\x00\x00\x021\x00\x04\x00\x00\x1c \x01\b\x00\x00\x0e\x10\x00\rLMT\x00PMT\x00CEST\x00CET\x00" +
-	"\nCET-1\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00m)\xb8P~\x02\x00\x00~\x02\x00\x00\x0f\x00\x00\x00Africa/WindhoekTZif2\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x005\x00\x00\x00\x06\x00\x00\x00\x17\xff\xff\xff\xffm{Kx\xff\xff\xff\xff\x82F\xcfh\xff\xff\xff\xff̮\x8c\x80\xff\xff\xff\xff͞op\x00" +
-	"\x00\x00\x00&\x06\xa7\xe0\x00\x00\x00\x00-\x8c\xc7`\x00\x00\x00\x00.i\x1c\x10\x00\x00\x00\x00/}\xe9\x00\x00\x00\x00\x000H\xfe\x10\x00\x00\x00\x001g\x05\x80\x00\x00\x00\x002(\xe0\x10\x00\x00\x00\x003" +
-	"F\xe7\x80\x00\x00\x00\x004\x11\xfc\x90\x00\x00\x00\x005&ɀ\x00\x00\x00\x005\xf1ސ\x00\x00\x00\x007\x06\xab\x80\x00\x00\x00\x007\xd1\xc0\x90\x00\x00\x00\x008捀\x00\x00\x00\x009\xb1\xa2\x90\x00" +
-	"\x00\x00\x00:\xc6o\x80\x00\x00\x00\x00;\x91\x84\x90\x00\x00\x00\x00<\xaf\x8c\x00\x00\x00\x00\x00=qf\x90\x00\x00\x00\x00>\x8fn\x00\x00\x00\x00\x00?Z\x83\x10\x00\x00\x00\x00@oP\x00\x00\x00\x00\x00A" +
-	":e\x10\x00\x00\x00\x00BO2\x00\x00\x00\x00\x00C\x1aG\x10\x00\x00\x00\x00D/\x14\x00\x00\x00\x00\x00D\xfa)\x10\x00\x00\x00\x00F\x0e\xf6\x00\x00\x00\x00\x00F\xda\v\x10\x00\x00\x00\x00G\xf8\x12\x80\x00" +
-	"\x00\x00\x00H\xc3'\x90\x00\x00\x00\x00I\xd7\xf4\x80\x00\x00\x00\x00J\xa3\t\x90\x00\x00\x00\x00K\xb7ր\x00\x00\x00\x00L\x82\xeb\x90\x00\x00\x00\x00M\x97\xb8\x80\x00\x00\x00\x00Nb͐\x00\x00\x00\x00O" +
-	"w\x9a\x80\x00\x00\x00\x00PB\xaf\x90\x00\x00\x00\x00Q`\xb7\x00\x00\x00\x00\x00R\"\x91\x90\x00\x00\x00\x00S@\x99\x00\x00\x00\x00\x00T\v\xae\x10\x00\x00\x00\x00U {\x00\x00\x00\x00\x00U\xeb\x90\x10\x00" +
-	"\x00\x00\x00W\x00]\x00\x00\x00\x00\x00W\xcbr\x10\x00\x00\x00\x00X\xe0?\x00\x00\x00\x00\x00Y\xabT\x10\x01\x02\x03\x02\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05" +
-	"\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x00\x00\x10\b\x00\x00\x00\x00\x15\x18\x00\x04\x00\x00\x1c \x00\n\x00\x00*0\x01\n\x00\x00\x0e\x10\x01\x0f\x00\x00\x1c \x00\x13" +
-	"LMT\x00+0130\x00SAST\x00WAT\x00CAT\x00\nCAT-2\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xae,\xa44\xc9\x03\x00\x00\xc9\x03\x00\x00\f\x00\x00\x00" +
-	"America/AdakTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00" +
-	"\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00T\x00\x00\x00\n\x00\x00\x00!\xff\xff\xff\xff?\xc2\xfd\xd1\xff\xff\xff\xff}" +
-	"\x87Z^\xff\xff\xff\xffˉD\xd0\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2aP@\xff\xff\xff\xff\xfa\xd2U\xb0\xff\xff\xff\xff\xfe\xb8qP\xff\xff\xff\xff\xff\xa8T@\x00\x00\x00\x00\x00\x98SP\x00" +
-	"\x00\x00\x00\x01\x886@\x00\x00\x00\x00\x02x5P\x00\x00\x00\x00\x03qR\xc0\x00\x00\x00\x00\x04aQ\xd0\x00\x00\x00\x00\x05Q4\xc0\x00\x00\x00\x00\x06A3\xd0\x00\x00\x00\x00\a1\x16\xc0\x00\x00\x00\x00\a" +
-	"\x8dm\xd0\x00\x00\x00\x00\t\x10\xf8\xc0\x00\x00\x00\x00\t\xad\xe9P\x00\x00\x00\x00\n\xf0\xda\xc0\x00\x00\x00\x00\v\xe0\xd9\xd0\x00\x00\x00\x00\f\xd9\xf7@\x00\x00\x00\x00\r\xc0\xbb\xd0\x00\x00\x00\x00\x0e\xb9\xd9@\x00" +
-	"\x00\x00\x00\x0f\xa9\xd8P\x00\x00\x00\x00\x10\x99\xbb@\x00\x00\x00\x00\x11\x89\xbaP\x00\x00\x00\x00\x12y\x9d@\x00\x00\x00\x00\x13i\x9cP\x00\x00\x00\x00\x14Y\x7f@\x00\x00\x00\x00\x15I~P\x00\x00\x00\x00\x16" +
-	"9a@\x00\x00\x00\x00\x17)`P\x00\x00\x00\x00\x18\"}\xc0\x00\x00\x00\x00\x19\tBP\x00\x00\x00\x00\x1a\x02_\xc0\x00\x00\x00\x00\x1a+\" \x00\x00\x00\x00\x1a\xf2P\xc0\x00\x00\x00\x00\x1b\xe23\xb0\x00" +
-	"\x00\x00\x00\x1c\xd22\xc0\x00\x00\x00\x00\x1d\xc2\x15\xb0\x00\x00\x00\x00\x1e\xb2\x14\xc0\x00\x00\x00\x00\x1f\xa1\xf7\xb0\x00\x00\x00\x00 vG@\x00\x00\x00\x00!\x81ٰ\x00\x00\x00\x00\"V)@\x00\x00\x00\x00#" +
-	"j\xf60\x00\x00\x00\x00$6\v@\x00\x00\x00\x00%J\xd80\x00\x00\x00\x00&\x15\xed@\x00\x00\x00\x00'*\xba0\x00\x00\x00\x00'\xff\t\xc0\x00\x00\x00\x00)\n\x9c0\x00\x00\x00\x00)\xde\xeb\xc0\x00" +
-	"\x00\x00\x00*\xea~0\x00\x00\x00\x00+\xbe\xcd\xc0\x00\x00\x00\x00,Ӛ\xb0\x00\x00\x00\x00-\x9e\xaf\xc0\x00\x00\x00\x00.\xb3|\xb0\x00\x00\x00\x00/~\x91\xc0\x00\x00\x00\x000\x93^\xb0\x00\x00\x00\x001" +
-	"g\xae@\x00\x00\x00\x002s@\xb0\x00\x00\x00\x003G\x90@\x00\x00\x00\x004S\"\xb0\x00\x00\x00\x005'r@\x00\x00\x00\x0063\x04\xb0\x00\x00\x00\x007\aT@\x00\x00\x00\x008\x1c!0\x00" +
-	"\x00\x00\x008\xe76@\x00\x00\x00\x009\xfc\x030\x00\x00\x00\x00:\xc7\x18@\x00\x00\x00\x00;\xdb\xe50\x00\x00\x00\x00<\xb04\xc0\x00\x00\x00\x00=\xbb\xc70\x00\x00\x00\x00>\x90\x16\xc0\x00\x00\x00\x00?" +
-	"\x9b\xa90\x00\x00\x00\x00@o\xf8\xc0\x00\x00\x00\x00A\x84Ű\x00\x00\x00\x00BO\xda\xc0\x00\x00\x00\x00Cd\xa7\xb0\x00\x00\x00\x00D/\xbc\xc0\x00\x00\x00\x00ED\x89\xb0\x00\x00\x00\x00E\xf3\xef@\x01" +
-	"\x02\x03\x04\x02\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\a\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t" +
-	"\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\x00\x00\xab\xe2\x00\x00\xff\xffZb\x00\x00\xff\xffeP\x00\x04\xff\xffs`\x01\b\xff\xffs`\x01\f\xff\xffeP\x00\x10\xff" +
-	"\xffs`\x01\x14\xff\xffs`\x00\x18\xff\xff\x81p\x01\x1d\xff\xffs`\x00\x19LMT\x00NST\x00NWT\x00NPT\x00BST\x00BDT\x00AHST\x00HDT\x00\nHST" +
-	"10HDT,M3.2.0,M11.1.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x005\x11Q\x06\xd1\x03\x00\x00\xd1\x03\x00\x00\x11\x00\x00\x00America/A" +
-	"nchorageTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00T" +
-	"Zif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00T\x00\x00\x00\n\x00\x00\x00(\xff\xff\xff\xff?\xc2\xfd\xd1\xff\xff\xff\xff}\x87AH\xff" +
-	"\xff\xff\xffˉ6\xc0\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2aB0\xff\xff\xff\xff\xfa\xd2G\xa0\xff\xff\xff\xff\xfe\xb8c@\xff\xff\xff\xff\xff\xa8F0\x00\x00\x00\x00\x00\x98E@\x00\x00\x00\x00\x01" +
-	"\x88(0\x00\x00\x00\x00\x02x'@\x00\x00\x00\x00\x03qD\xb0\x00\x00\x00\x00\x04aC\xc0\x00\x00\x00\x00\x05Q&\xb0\x00\x00\x00\x00\x06A%\xc0\x00\x00\x00\x00\a1\b\xb0\x00\x00\x00\x00\a\x8d_\xc0\x00" +
-	"\x00\x00\x00\t\x10\xea\xb0\x00\x00\x00\x00\t\xad\xdb@\x00\x00\x00\x00\n\xf0̰\x00\x00\x00\x00\v\xe0\xcb\xc0\x00\x00\x00\x00\f\xd9\xe90\x00\x00\x00\x00\r\xc0\xad\xc0\x00\x00\x00\x00\x0e\xb9\xcb0\x00\x00\x00\x00\x0f" +
-	"\xa9\xca@\x00\x00\x00\x00\x10\x99\xad0\x00\x00\x00\x00\x11\x89\xac@\x00\x00\x00\x00\x12y\x8f0\x00\x00\x00\x00\x13i\x8e@\x00\x00\x00\x00\x14Yq0\x00\x00\x00\x00\x15Ip@\x00\x00\x00\x00\x169S0\x00" +
-	"\x00\x00\x00\x17)R@\x00\x00\x00\x00\x18\"o\xb0\x00\x00\x00\x00\x19\t4@\x00\x00\x00\x00\x1a\x02Q\xb0\x00\x00\x00\x00\x1a+\x14\x10\x00\x00\x00\x00\x1a\xf2B\xb0\x00\x00\x00\x00\x1b\xe2%\xa0\x00\x00\x00\x00\x1c" +
-	"\xd2$\xb0\x00\x00\x00\x00\x1d\xc2\a\xa0\x00\x00\x00\x00\x1e\xb2\x06\xb0\x00\x00\x00\x00\x1f\xa1\xe9\xa0\x00\x00\x00\x00 v90\x00\x00\x00\x00!\x81ˠ\x00\x00\x00\x00\"V\x1b0\x00\x00\x00\x00#j\xe8 \x00" +
-	"\x00\x00\x00$5\xfd0\x00\x00\x00\x00%J\xca \x00\x00\x00\x00&\x15\xdf0\x00\x00\x00\x00'*\xac \x00\x00\x00\x00'\xfe\xfb\xb0\x00\x00\x00\x00)\n\x8e \x00\x00\x00\x00)\xdeݰ\x00\x00\x00\x00*" +
-	"\xeap \x00\x00\x00\x00+\xbe\xbf\xb0\x00\x00\x00\x00,ӌ\xa0\x00\x00\x00\x00-\x9e\xa1\xb0\x00\x00\x00\x00.\xb3n\xa0\x00\x00\x00\x00/~\x83\xb0\x00\x00\x00\x000\x93P\xa0\x00\x00\x00\x001g\xa00\x00" +
-	"\x00\x00\x002s2\xa0\x00\x00\x00\x003G\x820\x00\x00\x00\x004S\x14\xa0\x00\x00\x00\x005'd0\x00\x00\x00\x0062\xf6\xa0\x00\x00\x00\x007\aF0\x00\x00\x00\x008\x1c\x13 \x00\x00\x00\x008" +
-	"\xe7(0\x00\x00\x00\x009\xfb\xf5 \x00\x00\x00\x00:\xc7\n0\x00\x00\x00\x00;\xdb\xd7 \x00\x00\x00\x00<\xb0&\xb0\x00\x00\x00\x00=\xbb\xb9 \x00\x00\x00\x00>\x90\b\xb0\x00\x00\x00\x00?\x9b\x9b \x00" +
-	"\x00\x00\x00@o\xea\xb0\x00\x00\x00\x00A\x84\xb7\xa0\x00\x00\x00\x00BO̰\x00\x00\x00\x00Cd\x99\xa0\x00\x00\x00\x00D/\xae\xb0\x00\x00\x00\x00ED{\xa0\x00\x00\x00\x00E\xf3\xe10\x01\x02\x03\x04\x02" +
-	"\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\a\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t" +
-	"\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\x00\x00\xc4\xf8\x00\x00\xff\xffsx\x00\x00\xff\xffs`\x00\x04\xff\xff\x81p\x01\b\xff\xff\x81p\x01\f\xff\xffs`\x00\x10\xff\xff\x81p\x01" +
-	"\x15\xff\xff\x81p\x00\x1a\xff\xff\x8f\x80\x01\x1e\xff\xff\x81p\x00#LMT\x00AST\x00AWT\x00APT\x00AHST\x00AHDT\x00YST\x00AKDT\x00AKST\x00\n" +
-	"AKST9AKDT,M3.2.0,M11.1.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00q\xc9*;\xb1\x00\x00\x00\xb1\x00\x00\x00\x10\x00\x00\x00Ameri" +
-	"ca/AnguillaTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00" +
-	"\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x10\xff\xff\xff\xffz敹\xff\xff\xff\xff\xcb\xf6" +
-	"2\xc0\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2`\xed\xd0\x01\x03\x02\x01\xff\xff\xc2\a\x00\x00\xff\xff\xc7\xc0\x00\x04\xff\xff\xd5\xd0\x01\b\xff\xff\xd5\xd0\x01\fLMT\x00AST\x00APT\x00AW" +
-	"T\x00\nAST4\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00q\xc9*;\xb1\x00\x00\x00\xb1\x00\x00\x00\x0f\x00\x00\x00America/AntiguaTZif2\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x10\xff\xff\xff\xffz敹\xff\xff\xff\xff\xcb\xf62\xc0\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2`\xed\xd0" +
-	"\x01\x03\x02\x01\xff\xff\xc2\a\x00\x00\xff\xff\xc7\xc0\x00\x04\xff\xff\xd5\xd0\x01\b\xff\xff\xd5\xd0\x01\fLMT\x00AST\x00APT\x00AWT\x00\nAST4\nPK\x03\x04\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00<\x01V\rP\x02\x00\x00P\x02\x00\x00\x11\x00\x00\x00America/AraguainaTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x003\x00\x00\x00\x03\x00\x00\x00\f\xff\xff\xff\xff\x96\xaat0\xff\xff\xff\xff\xb8\x0fI\xe0\xff\xff\xff\xff\xb8\xfd@\xa0\xff\xff\xff\xff\xb9\xf140\xff\xff\xff\xff\xba\xdet \xff\xff\xff\xff\xda8\xae0" +
-	"\xff\xff\xff\xff\xda\xeb\xfa0\xff\xff\xff\xff\xdc\x19\xe1\xb0\xff\xff\xff\xffܹY \xff\xff\xff\xff\xdd\xfb\x150\xff\xff\xff\xffޛ\xde \xff\xff\xff\xff\xdfݚ0\xff\xff\xff\xff\xe0T3 \xff\xff\xff\xff" +
-	"\xf4\x97\xff\xb0\xff\xff\xff\xff\xf5\x05^ \xff\xff\xff\xff\xf6\xc0d0\xff\xff\xff\xff\xf7\x0e\x1e\xa0\xff\xff\xff\xff\xf8Q,0\xff\xff\xff\xff\xf8\xc7\xc5 \xff\xff\xff\xff\xfa\nҰ\xff\xff\xff\xff\xfa\xa8\xf8\xa0" +
-	"\xff\xff\xff\xff\xfb\xec\x060\xff\xff\xff\xff\xfc\x8b}\xa0\x00\x00\x00\x00\x1dɎ0\x00\x00\x00\x00\x1exנ\x00\x00\x00\x00\x1f\xa05\xb0\x00\x00\x00\x00 3Ϡ\x00\x00\x00\x00!\x81i0\x00\x00\x00\x00" +
-	"\"\vȠ\x00\x00\x00\x00#X\x10\xb0\x00\x00\x00\x00#\xe2p \x00\x00\x00\x00%7\xf2\xb0\x00\x00\x00\x00%\xd4\xc7 \x00\x00\x00\x000\x80y0\x00\x00\x00\x001\x1dM\xa0\x00\x00\x00\x002W \xb0" +
-	"\x00\x00\x00\x003\x06j \x00\x00\x00\x0048T0\x00\x00\x00\x004\xf8\xc1 \x00\x00\x00\x006 \x1f0\x00\x00\x00\x006\xcfh\xa0\x00\x00\x00\x007\xf6ư\x00\x00\x00\x008\xb8\x85 \x00\x00\x00\x00" +
-	"9\xdf\xe30\x00\x00\x00\x00:\x8f,\xa0\x00\x00\x00\x00;\xc8\xff\xb0\x00\x00\x00\x00<o\x0e\xa0\x00\x00\x00\x00=đ0\x00\x00\x00\x00>N\xf0\xa0\x00\x00\x00\x00P\x83e0\x00\x00\x00\x00Q 9\xa0" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\xff\xff\xd2\xd0\x00\x00\xff\xff\xe3" +
-	"\xe0\x01\x04\xff\xff\xd5\xd0\x00\bLMT\x00-02\x00-03\x00\n<-03>3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\xbf\xf5\xe5\xc4\x02\x00\x00\xc4\x02\x00\x00\x1e\x00\x00\x00A" +
-	"merica/Argentina/Buenos_AiresTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00=\x00\x00\x00\x06" +
-	"\x00\x00\x00\x14\xff\xff\xff\xffr\x9c\xa8L\xff\xff\xff\xff\xa2\x92\x8f0\xff\xff\xff\xff\xb6{R@\xff\xff\xff\xff\xb7\x1aɰ\xff\xff\xff\xff\xb8\x1e\x8f@\xff\xff\xff\xff\xb8\xd4p0\xff\xff\xff\xff\xba\x17}\xc0" +
-	"\xff\xff\xff\xff\xba\xb5\xa3\xb0\xff\xff\xff\xff\xbb\xf8\xb1@\xff\xff\xff\xff\xbc\x96\xd70\xff\xff\xff\xff\xbd\xd9\xe4\xc0\xff\xff\xff\xff\xbex\n\xb0\xff\xff\xff\xff\xbf\xbb\x18@\xff\xff\xff\xff\xc0Z\x8f\xb0\xff\xff\xff\xff" +
-	"\xc1\x9d\x9d@\xff\xff\xff\xff\xc2;\xc30\xff\xff\xff\xff\xc3~\xd0\xc0\xff\xff\xff\xff\xc4\x1c\xf6\xb0\xff\xff\xff\xff\xc5`\x04@\xff\xff\xff\xff\xc5\xfe*0\xff\xff\xff\xff\xc7A7\xc0\xff\xff\xff\xff\xc7\xe0\xaf0" +
-	"\xff\xff\xff\xffȁ\x94@\xff\xff\xff\xff\xcaM\xa1\xb0\xff\xff\xff\xff\xca\xee\x86\xc0\xff\xff\xff\xff\xceM\xff0\xff\xff\xff\xffΰ\xed\xc0\xff\xff\xff\xff\xd3)5\xb0\xff\xff\xff\xff\xd4Cd\xc0\xff\xff\xff\xff" +
-	"\xf4=\b0\xff\xff\xff\xff\xf4\x9f\xf6\xc0\xff\xff\xff\xff\xf5\x05l0\xff\xff\xff\xff\xf62\x10@\xff\xff\xff\xff\xf6柰\xff\xff\xff\xff\xf8\x13C\xc0\xff\xff\xff\xff\xf8\xc7\xd30\xff\xff\xff\xff\xf9\xf4w@" +
-	"\xff\xff\xff\xff\xfa\xd36\xb0\xff\xff\xff\xff\xfb\xc35\xc0\xff\xff\xff\xff\xfc\xbcS0\xff\xff\xff\xff\xfd\xacR@\xff\xff\xff\xff\xfe\x9c50\xff\xff\xff\xff\xff\x8c4@\x00\x00\x00\x00\a\xa3J\xb0\x00\x00\x00\x00" +
-	"\b$o\xa0\x00\x00\x00\x00#\x94\xb5\xb0\x00\x00\x00\x00$\x10\x94\xa0\x00\x00\x00\x00%7\xf2\xb0\x00\x00\x00\x00%\xf0v\xa0\x00\x00\x00\x00'!\x0f0\x00\x00\x00\x00'\xd0X\xa0\x00\x00\x00\x00)\x00\xf10" +
-	"\x00\x00\x00\x00)\xb0:\xa0\x00\x00\x00\x00*\xe0\xd30\x00\x00\x00\x00+\x99W \x00\x00\x00\x007\xf6ư\x00\x00\x00\x008\xbf*\xb0\x00\x00\x00\x00Gw\t\xb0\x00\x00\x00\x00G\xdc\x7f \x00\x00\x00\x00" +
-	"H\xfa\xa2\xb0\x00\x00\x00\x00I\xbca \x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x05\x04\x05\x04\x05\x04" +
-	"\x05\x04\x05\x04\x05\x04\x05\x03\x05\x04\x05\x04\x05\xff\xff\xc94\x00\x00\xff\xff\xc3\xd0\x00\x04\xff\xff\xc7\xc0\x00\b\xff\xff\xd5\xd0\x01\f\xff\xff\xe3\xe0\x01\x10\xff\xff\xd5\xd0\x00\fLMT\x00CMT\x00-04" +
-	"\x00-03\x00-02\x00\n<-03>3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00R\xc8\xd9\xf6\xc4\x02\x00\x00\xc4\x02\x00\x00\x1b\x00\x00\x00America/Argen" +
-	"tina/CatamarcaTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00" +
-	"\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00=\x00\x00\x00\x06\x00\x00\x00\x14\xff\xff\xff\xffr\x9c\xaf,\xff\xff\xff" +
-	"\xff\xa2\x92\x8f0\xff\xff\xff\xff\xb6{R@\xff\xff\xff\xff\xb7\x1aɰ\xff\xff\xff\xff\xb8\x1e\x8f@\xff\xff\xff\xff\xb8\xd4p0\xff\xff\xff\xff\xba\x17}\xc0\xff\xff\xff\xff\xba\xb5\xa3\xb0\xff\xff\xff\xff\xbb\xf8\xb1" +
-	"@\xff\xff\xff\xff\xbc\x96\xd70\xff\xff\xff\xff\xbd\xd9\xe4\xc0\xff\xff\xff\xff\xbex\n\xb0\xff\xff\xff\xff\xbf\xbb\x18@\xff\xff\xff\xff\xc0Z\x8f\xb0\xff\xff\xff\xff\xc1\x9d\x9d@\xff\xff\xff\xff\xc2;\xc30\xff\xff\xff" +
-	"\xff\xc3~\xd0\xc0\xff\xff\xff\xff\xc4\x1c\xf6\xb0\xff\xff\xff\xff\xc5`\x04@\xff\xff\xff\xff\xc5\xfe*0\xff\xff\xff\xff\xc7A7\xc0\xff\xff\xff\xff\xc7\xe0\xaf0\xff\xff\xff\xffȁ\x94@\xff\xff\xff\xff\xcaM\xa1" +
-	"\xb0\xff\xff\xff\xff\xca\xee\x86\xc0\xff\xff\xff\xff\xceM\xff0\xff\xff\xff\xffΰ\xed\xc0\xff\xff\xff\xff\xd3)5\xb0\xff\xff\xff\xff\xd4Cd\xc0\xff\xff\xff\xff\xf4=\b0\xff\xff\xff\xff\xf4\x9f\xf6\xc0\xff\xff\xff" +
-	"\xff\xf5\x05l0\xff\xff\xff\xff\xf62\x10@\xff\xff\xff\xff\xf6柰\xff\xff\xff\xff\xf8\x13C\xc0\xff\xff\xff\xff\xf8\xc7\xd30\xff\xff\xff\xff\xf9\xf4w@\xff\xff\xff\xff\xfa\xd36\xb0\xff\xff\xff\xff\xfb\xc35" +
-	"\xc0\xff\xff\xff\xff\xfc\xbcS0\xff\xff\xff\xff\xfd\xacR@\xff\xff\xff\xff\xfe\x9c50\xff\xff\xff\xff\xff\x8c4@\x00\x00\x00\x00\a\xa3J\xb0\x00\x00\x00\x00\b$o\xa0\x00\x00\x00\x00#\x94\xb5\xb0\x00\x00\x00" +
-	"\x00$\x10\x94\xa0\x00\x00\x00\x00%7\xf2\xb0\x00\x00\x00\x00%\xf0v\xa0\x00\x00\x00\x00'!\x0f0\x00\x00\x00\x00'\xd0X\xa0\x00\x00\x00\x00)\x00\xff@\x00\x00\x00\x00)\xb0:\xa0\x00\x00\x00\x00*\xe0\xd3" +
-	"0\x00\x00\x00\x00+\x99W \x00\x00\x00\x007\xf6ư\x00\x00\x00\x008\xbf*\xb0\x00\x00\x00\x00@\xbb\xf10\x00\x00\x00\x00@\xd5\v\xc0\x00\x00\x00\x00Gw\t\xb0\x00\x00\x00\x00G\xdc\x7f \x01\x02\x03" +
-	"\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x05\x04\x05\x04\x05\x04\x05\x04\x02\x04\x05\x04\x05\x03\x05\x02\x05\x04\x05\xff\xff" +
-	"\xc2T\x00\x00\xff\xff\xc3\xd0\x00\x04\xff\xff\xc7\xc0\x00\b\xff\xff\xd5\xd0\x01\f\xff\xff\xe3\xe0\x01\x10\xff\xff\xd5\xd0\x00\fLMT\x00CMT\x00-04\x00-03\x00-02\x00\n<-03>" +
-	"3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00R\xc8\xd9\xf6\xc4\x02\x00\x00\xc4\x02\x00\x00 \x00\x00\x00America/Argentina/ComodRivad" +
-	"aviaTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00=\x00\x00\x00\x06\x00\x00\x00\x14\xff\xff\xff\xffr\x9c\xaf,\xff\xff\xff\xff\xa2\x92\x8f0\xff\xff\xff\xff\xb6" +
-	"{R@\xff\xff\xff\xff\xb7\x1aɰ\xff\xff\xff\xff\xb8\x1e\x8f@\xff\xff\xff\xff\xb8\xd4p0\xff\xff\xff\xff\xba\x17}\xc0\xff\xff\xff\xff\xba\xb5\xa3\xb0\xff\xff\xff\xff\xbb\xf8\xb1@\xff\xff\xff\xff\xbc\x96\xd70\xff" +
-	"\xff\xff\xff\xbd\xd9\xe4\xc0\xff\xff\xff\xff\xbex\n\xb0\xff\xff\xff\xff\xbf\xbb\x18@\xff\xff\xff\xff\xc0Z\x8f\xb0\xff\xff\xff\xff\xc1\x9d\x9d@\xff\xff\xff\xff\xc2;\xc30\xff\xff\xff\xff\xc3~\xd0\xc0\xff\xff\xff\xff\xc4" +
-	"\x1c\xf6\xb0\xff\xff\xff\xff\xc5`\x04@\xff\xff\xff\xff\xc5\xfe*0\xff\xff\xff\xff\xc7A7\xc0\xff\xff\xff\xff\xc7\xe0\xaf0\xff\xff\xff\xffȁ\x94@\xff\xff\xff\xff\xcaM\xa1\xb0\xff\xff\xff\xff\xca\xee\x86\xc0\xff" +
-	"\xff\xff\xff\xceM\xff0\xff\xff\xff\xffΰ\xed\xc0\xff\xff\xff\xff\xd3)5\xb0\xff\xff\xff\xff\xd4Cd\xc0\xff\xff\xff\xff\xf4=\b0\xff\xff\xff\xff\xf4\x9f\xf6\xc0\xff\xff\xff\xff\xf5\x05l0\xff\xff\xff\xff\xf6" +
-	"2\x10@\xff\xff\xff\xff\xf6柰\xff\xff\xff\xff\xf8\x13C\xc0\xff\xff\xff\xff\xf8\xc7\xd30\xff\xff\xff\xff\xf9\xf4w@\xff\xff\xff\xff\xfa\xd36\xb0\xff\xff\xff\xff\xfb\xc35\xc0\xff\xff\xff\xff\xfc\xbcS0\xff" +
-	"\xff\xff\xff\xfd\xacR@\xff\xff\xff\xff\xfe\x9c50\xff\xff\xff\xff\xff\x8c4@\x00\x00\x00\x00\a\xa3J\xb0\x00\x00\x00\x00\b$o\xa0\x00\x00\x00\x00#\x94\xb5\xb0\x00\x00\x00\x00$\x10\x94\xa0\x00\x00\x00\x00%" +
-	"7\xf2\xb0\x00\x00\x00\x00%\xf0v\xa0\x00\x00\x00\x00'!\x0f0\x00\x00\x00\x00'\xd0X\xa0\x00\x00\x00\x00)\x00\xff@\x00\x00\x00\x00)\xb0:\xa0\x00\x00\x00\x00*\xe0\xd30\x00\x00\x00\x00+\x99W \x00" +
-	"\x00\x00\x007\xf6ư\x00\x00\x00\x008\xbf*\xb0\x00\x00\x00\x00@\xbb\xf10\x00\x00\x00\x00@\xd5\v\xc0\x00\x00\x00\x00Gw\t\xb0\x00\x00\x00\x00G\xdc\x7f \x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03" +
-	"\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x05\x04\x05\x04\x05\x04\x05\x04\x02\x04\x05\x04\x05\x03\x05\x02\x05\x04\x05\xff\xff\xc2T\x00\x00\xff\xff\xc3\xd0\x00\x04" +
-	"\xff\xff\xc7\xc0\x00\b\xff\xff\xd5\xd0\x01\f\xff\xff\xe3\xe0\x01\x10\xff\xff\xd5\xd0\x00\fLMT\x00CMT\x00-04\x00-03\x00-02\x00\n<-03>3\nPK\x03\x04\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\xef\xf0R\x8a\xc4\x02\x00\x00\xc4\x02\x00\x00\x19\x00\x00\x00America/Argentina/CordobaTZif2\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00=\x00\x00\x00\x06\x00\x00\x00\x14\xff\xff\xff\xffr\x9c\xad\xb0\xff\xff\xff\xff\xa2\x92\x8f0\xff\xff\xff\xff\xb6{R@\xff\xff\xff\xff\xb7\x1aɰ\xff\xff\xff\xff\xb8\x1e" +
-	"\x8f@\xff\xff\xff\xff\xb8\xd4p0\xff\xff\xff\xff\xba\x17}\xc0\xff\xff\xff\xff\xba\xb5\xa3\xb0\xff\xff\xff\xff\xbb\xf8\xb1@\xff\xff\xff\xff\xbc\x96\xd70\xff\xff\xff\xff\xbd\xd9\xe4\xc0\xff\xff\xff\xff\xbex\n\xb0\xff\xff" +
-	"\xff\xff\xbf\xbb\x18@\xff\xff\xff\xff\xc0Z\x8f\xb0\xff\xff\xff\xff\xc1\x9d\x9d@\xff\xff\xff\xff\xc2;\xc30\xff\xff\xff\xff\xc3~\xd0\xc0\xff\xff\xff\xff\xc4\x1c\xf6\xb0\xff\xff\xff\xff\xc5`\x04@\xff\xff\xff\xff\xc5\xfe" +
-	"*0\xff\xff\xff\xff\xc7A7\xc0\xff\xff\xff\xff\xc7\xe0\xaf0\xff\xff\xff\xffȁ\x94@\xff\xff\xff\xff\xcaM\xa1\xb0\xff\xff\xff\xff\xca\xee\x86\xc0\xff\xff\xff\xff\xceM\xff0\xff\xff\xff\xffΰ\xed\xc0\xff\xff" +
-	"\xff\xff\xd3)5\xb0\xff\xff\xff\xff\xd4Cd\xc0\xff\xff\xff\xff\xf4=\b0\xff\xff\xff\xff\xf4\x9f\xf6\xc0\xff\xff\xff\xff\xf5\x05l0\xff\xff\xff\xff\xf62\x10@\xff\xff\xff\xff\xf6柰\xff\xff\xff\xff\xf8\x13" +
-	"C\xc0\xff\xff\xff\xff\xf8\xc7\xd30\xff\xff\xff\xff\xf9\xf4w@\xff\xff\xff\xff\xfa\xd36\xb0\xff\xff\xff\xff\xfb\xc35\xc0\xff\xff\xff\xff\xfc\xbcS0\xff\xff\xff\xff\xfd\xacR@\xff\xff\xff\xff\xfe\x9c50\xff\xff" +
-	"\xff\xff\xff\x8c4@\x00\x00\x00\x00\a\xa3J\xb0\x00\x00\x00\x00\b$o\xa0\x00\x00\x00\x00#\x94\xb5\xb0\x00\x00\x00\x00$\x10\x94\xa0\x00\x00\x00\x00%7\xf2\xb0\x00\x00\x00\x00%\xf0v\xa0\x00\x00\x00\x00'!" +
-	"\x0f0\x00\x00\x00\x00'\xd0X\xa0\x00\x00\x00\x00)\x00\xff@\x00\x00\x00\x00)\xb0:\xa0\x00\x00\x00\x00*\xe0\xd30\x00\x00\x00\x00+\x99W \x00\x00\x00\x007\xf6ư\x00\x00\x00\x008\xbf*\xb0\x00\x00" +
-	"\x00\x00Gw\t\xb0\x00\x00\x00\x00G\xdc\x7f \x00\x00\x00\x00H\xfa\xa2\xb0\x00\x00\x00\x00I\xbca \x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02" +
-	"\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x05\x04\x05\x04\x05\x04\x05\x04\x02\x04\x05\x04\x05\x03\x05\x04\x05\x04\x05\xff\xff\xc3\xd0\x00\x00\xff\xff\xc3\xd0\x00\x04\xff\xff\xc7\xc0\x00\b\xff\xff\xd5\xd0\x01\f\xff\xff\xe3\xe0\x01" +
-	"\x10\xff\xff\xd5\xd0\x00\fLMT\x00CMT\x00-04\x00-03\x00-02\x00\n<-03>3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00utZ\x1a\xb2\x02\x00\x00\xb2\x02\x00" +
-	"\x00\x17\x00\x00\x00America/Argentina/JujuyTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00;\x00\x00\x00\x06\x00" +
-	"\x00\x00\x14\xff\xff\xff\xffr\x9c\xae\xb8\xff\xff\xff\xff\xa2\x92\x8f0\xff\xff\xff\xff\xb6{R@\xff\xff\xff\xff\xb7\x1aɰ\xff\xff\xff\xff\xb8\x1e\x8f@\xff\xff\xff\xff\xb8\xd4p0\xff\xff\xff\xff\xba\x17}\xc0\xff" +
-	"\xff\xff\xff\xba\xb5\xa3\xb0\xff\xff\xff\xff\xbb\xf8\xb1@\xff\xff\xff\xff\xbc\x96\xd70\xff\xff\xff\xff\xbd\xd9\xe4\xc0\xff\xff\xff\xff\xbex\n\xb0\xff\xff\xff\xff\xbf\xbb\x18@\xff\xff\xff\xff\xc0Z\x8f\xb0\xff\xff\xff\xff\xc1" +
-	"\x9d\x9d@\xff\xff\xff\xff\xc2;\xc30\xff\xff\xff\xff\xc3~\xd0\xc0\xff\xff\xff\xff\xc4\x1c\xf6\xb0\xff\xff\xff\xff\xc5`\x04@\xff\xff\xff\xff\xc5\xfe*0\xff\xff\xff\xff\xc7A7\xc0\xff\xff\xff\xff\xc7\xe0\xaf0\xff" +
-	"\xff\xff\xffȁ\x94@\xff\xff\xff\xff\xcaM\xa1\xb0\xff\xff\xff\xff\xca\xee\x86\xc0\xff\xff\xff\xff\xceM\xff0\xff\xff\xff\xffΰ\xed\xc0\xff\xff\xff\xff\xd3)5\xb0\xff\xff\xff\xff\xd4Cd\xc0\xff\xff\xff\xff\xf4" +
-	"=\b0\xff\xff\xff\xff\xf4\x9f\xf6\xc0\xff\xff\xff\xff\xf5\x05l0\xff\xff\xff\xff\xf62\x10@\xff\xff\xff\xff\xf6柰\xff\xff\xff\xff\xf8\x13C\xc0\xff\xff\xff\xff\xf8\xc7\xd30\xff\xff\xff\xff\xf9\xf4w@\xff" +
-	"\xff\xff\xff\xfa\xd36\xb0\xff\xff\xff\xff\xfb\xc35\xc0\xff\xff\xff\xff\xfc\xbcS0\xff\xff\xff\xff\xfd\xacR@\xff\xff\xff\xff\xfe\x9c50\xff\xff\xff\xff\xff\x8c4@\x00\x00\x00\x00\a\xa3J\xb0\x00\x00\x00\x00\b" +
-	"$o\xa0\x00\x00\x00\x00#\x94\xb5\xb0\x00\x00\x00\x00$\x10\x94\xa0\x00\x00\x00\x00%7\xf2\xb0\x00\x00\x00\x00%\xf0v\xa0\x00\x00\x00\x00'*W\xc0\x00\x00\x00\x00'\xe2۰\x00\x00\x00\x00(\xee\x8a@\x00" +
-	"\x00\x00\x00)\xb0:\xa0\x00\x00\x00\x00*\xe0\xd30\x00\x00\x00\x00+\x99W \x00\x00\x00\x007\xf6ư\x00\x00\x00\x008\xbf*\xb0\x00\x00\x00\x00Gw\t\xb0\x00\x00\x00\x00G\xdc\x7f \x01\x02\x03\x02\x03" +
-	"\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x05\x04\x05\x04\x05\x04\x02\x03\x02\x04\x05\x04\x05\x03\x05\x04\x05\xff\xff\xc2\xc8\x00\x00" +
-	"\xff\xff\xc3\xd0\x00\x04\xff\xff\xc7\xc0\x00\b\xff\xff\xd5\xd0\x01\f\xff\xff\xe3\xe0\x01\x10\xff\xff\xd5\xd0\x00\fLMT\x00CMT\x00-04\x00-03\x00-02\x00\n<-03>3\nPK" +
-	"\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00m\aD\x0e\xcd\x02\x00\x00\xcd\x02\x00\x00\x1a\x00\x00\x00America/Argentina/La_RiojaTZif2\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00>\x00\x00\x00\x06\x00\x00\x00\x14\xff\xff\xff\xffr\x9c\xb0,\xff\xff\xff\xff\xa2\x92\x8f0\xff\xff\xff\xff\xb6{R@\xff\xff\xff\xff\xb7\x1a\xc9" +
-	"\xb0\xff\xff\xff\xff\xb8\x1e\x8f@\xff\xff\xff\xff\xb8\xd4p0\xff\xff\xff\xff\xba\x17}\xc0\xff\xff\xff\xff\xba\xb5\xa3\xb0\xff\xff\xff\xff\xbb\xf8\xb1@\xff\xff\xff\xff\xbc\x96\xd70\xff\xff\xff\xff\xbd\xd9\xe4\xc0\xff\xff\xff" +
-	"\xff\xbex\n\xb0\xff\xff\xff\xff\xbf\xbb\x18@\xff\xff\xff\xff\xc0Z\x8f\xb0\xff\xff\xff\xff\xc1\x9d\x9d@\xff\xff\xff\xff\xc2;\xc30\xff\xff\xff\xff\xc3~\xd0\xc0\xff\xff\xff\xff\xc4\x1c\xf6\xb0\xff\xff\xff\xff\xc5`\x04" +
-	"@\xff\xff\xff\xff\xc5\xfe*0\xff\xff\xff\xff\xc7A7\xc0\xff\xff\xff\xff\xc7\xe0\xaf0\xff\xff\xff\xffȁ\x94@\xff\xff\xff\xff\xcaM\xa1\xb0\xff\xff\xff\xff\xca\xee\x86\xc0\xff\xff\xff\xff\xceM\xff0\xff\xff\xff" +
-	"\xffΰ\xed\xc0\xff\xff\xff\xff\xd3)5\xb0\xff\xff\xff\xff\xd4Cd\xc0\xff\xff\xff\xff\xf4=\b0\xff\xff\xff\xff\xf4\x9f\xf6\xc0\xff\xff\xff\xff\xf5\x05l0\xff\xff\xff\xff\xf62\x10@\xff\xff\xff\xff\xf6\xe6\x9f" +
-	"\xb0\xff\xff\xff\xff\xf8\x13C\xc0\xff\xff\xff\xff\xf8\xc7\xd30\xff\xff\xff\xff\xf9\xf4w@\xff\xff\xff\xff\xfa\xd36\xb0\xff\xff\xff\xff\xfb\xc35\xc0\xff\xff\xff\xff\xfc\xbcS0\xff\xff\xff\xff\xfd\xacR@\xff\xff\xff" +
-	"\xff\xfe\x9c50\xff\xff\xff\xff\xff\x8c4@\x00\x00\x00\x00\a\xa3J\xb0\x00\x00\x00\x00\b$o\xa0\x00\x00\x00\x00#\x94\xb5\xb0\x00\x00\x00\x00$\x10\x94\xa0\x00\x00\x00\x00%7\xf2\xb0\x00\x00\x00\x00%\xf0v" +
-	"\xa0\x00\x00\x00\x00'!\x0f0\x00\x00\x00\x00'͵\xa0\x00\x00\x00\x00(&&@\x00\x00\x00\x00)\x00\xf10\x00\x00\x00\x00)\xb0:\xa0\x00\x00\x00\x00*\xe0\xd30\x00\x00\x00\x00+\x99W \x00\x00\x00" +
-	"\x007\xf6ư\x00\x00\x00\x008\xbf*\xb0\x00\x00\x00\x00@\xbb\xf10\x00\x00\x00\x00@\xd5\v\xc0\x00\x00\x00\x00Gw\t\xb0\x00\x00\x00\x00G\xdc\x7f \x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03" +
-	"\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x05\x04\x05\x04\x05\x04\x05\x04\x02\x05\x04\x05\x04\x05\x03\x05\x02\x05\x04\x05\xff\xff\xc1T\x00\x00\xff\xff\xc3\xd0\x00\x04\xff" +
-	"\xff\xc7\xc0\x00\b\xff\xff\xd5\xd0\x01\f\xff\xff\xe3\xe0\x01\x10\xff\xff\xd5\xd0\x00\fLMT\x00CMT\x00-04\x00-03\x00-02\x00\n<-03>3\nPK\x03\x04\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00ŒZ\x8c\xc4\x02\x00\x00\xc4\x02\x00\x00\x19\x00\x00\x00America/Argentina/MendozaTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00=\x00\x00\x00\x06\x00\x00\x00\x14\xff\xff\xff\xffr\x9c\xb2\x04\xff\xff\xff\xff\xa2\x92\x8f0\xff\xff\xff\xff\xb6{R@\xff\xff\xff\xff\xb7\x1aɰ\xff\xff\xff\xff\xb8\x1e\x8f" +
-	"@\xff\xff\xff\xff\xb8\xd4p0\xff\xff\xff\xff\xba\x17}\xc0\xff\xff\xff\xff\xba\xb5\xa3\xb0\xff\xff\xff\xff\xbb\xf8\xb1@\xff\xff\xff\xff\xbc\x96\xd70\xff\xff\xff\xff\xbd\xd9\xe4\xc0\xff\xff\xff\xff\xbex\n\xb0\xff\xff\xff" +
-	"\xff\xbf\xbb\x18@\xff\xff\xff\xff\xc0Z\x8f\xb0\xff\xff\xff\xff\xc1\x9d\x9d@\xff\xff\xff\xff\xc2;\xc30\xff\xff\xff\xff\xc3~\xd0\xc0\xff\xff\xff\xff\xc4\x1c\xf6\xb0\xff\xff\xff\xff\xc5`\x04@\xff\xff\xff\xff\xc5\xfe*" +
-	"0\xff\xff\xff\xff\xc7A7\xc0\xff\xff\xff\xff\xc7\xe0\xaf0\xff\xff\xff\xffȁ\x94@\xff\xff\xff\xff\xcaM\xa1\xb0\xff\xff\xff\xff\xca\xee\x86\xc0\xff\xff\xff\xff\xceM\xff0\xff\xff\xff\xffΰ\xed\xc0\xff\xff\xff" +
-	"\xff\xd3)5\xb0\xff\xff\xff\xff\xd4Cd\xc0\xff\xff\xff\xff\xf4=\b0\xff\xff\xff\xff\xf4\x9f\xf6\xc0\xff\xff\xff\xff\xf5\x05l0\xff\xff\xff\xff\xf62\x10@\xff\xff\xff\xff\xf6柰\xff\xff\xff\xff\xf8\x13C" +
-	"\xc0\xff\xff\xff\xff\xf8\xc7\xd30\xff\xff\xff\xff\xf9\xf4w@\xff\xff\xff\xff\xfa\xd36\xb0\xff\xff\xff\xff\xfb\xc35\xc0\xff\xff\xff\xff\xfc\xbcS0\xff\xff\xff\xff\xfd\xacR@\xff\xff\xff\xff\xfe\x9c50\xff\xff\xff" +
-	"\xff\xff\x8c4@\x00\x00\x00\x00\a\xa3J\xb0\x00\x00\x00\x00\b$o\xa0\x00\x00\x00\x00#\x94\xb5\xb0\x00\x00\x00\x00$\x10\x94\xa0\x00\x00\x00\x00%7\xf2\xb0\x00\x00\x00\x00%\xf0v\xa0\x00\x00\x00\x00'\x194" +
-	"@\x00\x00\x00\x00'\xcdð\x00\x00\x00\x00(\xfag\xc0\x00\x00\x00\x00)\xb0H\xb0\x00\x00\x00\x00*\xe0\xe1@\x00\x00\x00\x00+\x99W \x00\x00\x00\x007\xf6ư\x00\x00\x00\x008\xbf*\xb0\x00\x00\x00" +
-	"\x00@\xb0\x13\xb0\x00\x00\x00\x00AV>\xc0\x00\x00\x00\x00Gw\t\xb0\x00\x00\x00\x00G\xdc\x7f \x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03" +
-	"\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x05\x04\x05\x04\x05\x04\x02\x03\x02\x03\x02\x04\x05\x03\x05\x02\x05\x04\x05\xff\xff\xbf|\x00\x00\xff\xff\xc3\xd0\x00\x04\xff\xff\xc7\xc0\x00\b\xff\xff\xd5\xd0\x01\f\xff\xff\xe3\xe0\x01\x10" +
-	"\xff\xff\xd5\xd0\x00\fLMT\x00CMT\x00-04\x00-03\x00-02\x00\n<-03>3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8ep\xb4c\xc4\x02\x00\x00\xc4\x02\x00\x00" +
-	"\x1e\x00\x00\x00America/Argentina/Rio_GallegosTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"=\x00\x00\x00\x06\x00\x00\x00\x14\xff\xff\xff\xffr\x9c\xb2d\xff\xff\xff\xff\xa2\x92\x8f0\xff\xff\xff\xff\xb6{R@\xff\xff\xff\xff\xb7\x1aɰ\xff\xff\xff\xff\xb8\x1e\x8f@\xff\xff\xff\xff\xb8\xd4p0\xff\xff\xff" +
-	"\xff\xba\x17}\xc0\xff\xff\xff\xff\xba\xb5\xa3\xb0\xff\xff\xff\xff\xbb\xf8\xb1@\xff\xff\xff\xff\xbc\x96\xd70\xff\xff\xff\xff\xbd\xd9\xe4\xc0\xff\xff\xff\xff\xbex\n\xb0\xff\xff\xff\xff\xbf\xbb\x18@\xff\xff\xff\xff\xc0Z\x8f" +
-	"\xb0\xff\xff\xff\xff\xc1\x9d\x9d@\xff\xff\xff\xff\xc2;\xc30\xff\xff\xff\xff\xc3~\xd0\xc0\xff\xff\xff\xff\xc4\x1c\xf6\xb0\xff\xff\xff\xff\xc5`\x04@\xff\xff\xff\xff\xc5\xfe*0\xff\xff\xff\xff\xc7A7\xc0\xff\xff\xff" +
-	"\xff\xc7\xe0\xaf0\xff\xff\xff\xffȁ\x94@\xff\xff\xff\xff\xcaM\xa1\xb0\xff\xff\xff\xff\xca\xee\x86\xc0\xff\xff\xff\xff\xceM\xff0\xff\xff\xff\xffΰ\xed\xc0\xff\xff\xff\xff\xd3)5\xb0\xff\xff\xff\xff\xd4Cd" +
-	"\xc0\xff\xff\xff\xff\xf4=\b0\xff\xff\xff\xff\xf4\x9f\xf6\xc0\xff\xff\xff\xff\xf5\x05l0\xff\xff\xff\xff\xf62\x10@\xff\xff\xff\xff\xf6柰\xff\xff\xff\xff\xf8\x13C\xc0\xff\xff\xff\xff\xf8\xc7\xd30\xff\xff\xff" +
-	"\xff\xf9\xf4w@\xff\xff\xff\xff\xfa\xd36\xb0\xff\xff\xff\xff\xfb\xc35\xc0\xff\xff\xff\xff\xfc\xbcS0\xff\xff\xff\xff\xfd\xacR@\xff\xff\xff\xff\xfe\x9c50\xff\xff\xff\xff\xff\x8c4@\x00\x00\x00\x00\a\xa3J" +
-	"\xb0\x00\x00\x00\x00\b$o\xa0\x00\x00\x00\x00#\x94\xb5\xb0\x00\x00\x00\x00$\x10\x94\xa0\x00\x00\x00\x00%7\xf2\xb0\x00\x00\x00\x00%\xf0v\xa0\x00\x00\x00\x00'!\x0f0\x00\x00\x00\x00'\xd0X\xa0\x00\x00\x00" +
-	"\x00)\x00\xf10\x00\x00\x00\x00)\xb0:\xa0\x00\x00\x00\x00*\xe0\xd30\x00\x00\x00\x00+\x99W \x00\x00\x00\x007\xf6ư\x00\x00\x00\x008\xbf*\xb0\x00\x00\x00\x00@\xbb\xf10\x00\x00\x00\x00@\xd5\v" +
-	"\xc0\x00\x00\x00\x00Gw\t\xb0\x00\x00\x00\x00G\xdc\x7f \x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x05" +
-	"\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x03\x05\x02\x05\x04\x05\xff\xff\xbf\x1c\x00\x00\xff\xff\xc3\xd0\x00\x04\xff\xff\xc7\xc0\x00\b\xff\xff\xd5\xd0\x01\f\xff\xff\xe3\xe0\x01\x10\xff\xff\xd5\xd0\x00\fLMT\x00CM" +
-	"T\x00-04\x00-03\x00-02\x00\n<-03>3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00t*\x9b!\xb2\x02\x00\x00\xb2\x02\x00\x00\x17\x00\x00\x00America/" +
-	"Argentina/SaltaTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00" +
-	"\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00;\x00\x00\x00\x06\x00\x00\x00\x14\xff\xff\xff\xffr\x9c\xae\xd4\xff\xff" +
-	"\xff\xff\xa2\x92\x8f0\xff\xff\xff\xff\xb6{R@\xff\xff\xff\xff\xb7\x1aɰ\xff\xff\xff\xff\xb8\x1e\x8f@\xff\xff\xff\xff\xb8\xd4p0\xff\xff\xff\xff\xba\x17}\xc0\xff\xff\xff\xff\xba\xb5\xa3\xb0\xff\xff\xff\xff\xbb\xf8" +
-	"\xb1@\xff\xff\xff\xff\xbc\x96\xd70\xff\xff\xff\xff\xbd\xd9\xe4\xc0\xff\xff\xff\xff\xbex\n\xb0\xff\xff\xff\xff\xbf\xbb\x18@\xff\xff\xff\xff\xc0Z\x8f\xb0\xff\xff\xff\xff\xc1\x9d\x9d@\xff\xff\xff\xff\xc2;\xc30\xff\xff" +
-	"\xff\xff\xc3~\xd0\xc0\xff\xff\xff\xff\xc4\x1c\xf6\xb0\xff\xff\xff\xff\xc5`\x04@\xff\xff\xff\xff\xc5\xfe*0\xff\xff\xff\xff\xc7A7\xc0\xff\xff\xff\xff\xc7\xe0\xaf0\xff\xff\xff\xffȁ\x94@\xff\xff\xff\xff\xcaM" +
-	"\xa1\xb0\xff\xff\xff\xff\xca\xee\x86\xc0\xff\xff\xff\xff\xceM\xff0\xff\xff\xff\xffΰ\xed\xc0\xff\xff\xff\xff\xd3)5\xb0\xff\xff\xff\xff\xd4Cd\xc0\xff\xff\xff\xff\xf4=\b0\xff\xff\xff\xff\xf4\x9f\xf6\xc0\xff\xff" +
-	"\xff\xff\xf5\x05l0\xff\xff\xff\xff\xf62\x10@\xff\xff\xff\xff\xf6柰\xff\xff\xff\xff\xf8\x13C\xc0\xff\xff\xff\xff\xf8\xc7\xd30\xff\xff\xff\xff\xf9\xf4w@\xff\xff\xff\xff\xfa\xd36\xb0\xff\xff\xff\xff\xfb\xc3" +
-	"5\xc0\xff\xff\xff\xff\xfc\xbcS0\xff\xff\xff\xff\xfd\xacR@\xff\xff\xff\xff\xfe\x9c50\xff\xff\xff\xff\xff\x8c4@\x00\x00\x00\x00\a\xa3J\xb0\x00\x00\x00\x00\b$o\xa0\x00\x00\x00\x00#\x94\xb5\xb0\x00\x00" +
-	"\x00\x00$\x10\x94\xa0\x00\x00\x00\x00%7\xf2\xb0\x00\x00\x00\x00%\xf0v\xa0\x00\x00\x00\x00'!\x0f0\x00\x00\x00\x00'\xd0X\xa0\x00\x00\x00\x00)\x00\xff@\x00\x00\x00\x00)\xb0:\xa0\x00\x00\x00\x00*\xe0" +
-	"\xd30\x00\x00\x00\x00+\x99W \x00\x00\x00\x007\xf6ư\x00\x00\x00\x008\xbf*\xb0\x00\x00\x00\x00Gw\t\xb0\x00\x00\x00\x00G\xdc\x7f \x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02" +
-	"\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x05\x04\x05\x04\x05\x04\x05\x04\x02\x04\x05\x04\x05\x03\x05\x04\x05\xff\xff¬\x00\x00\xff\xff\xc3\xd0\x00\x04\xff\xff\xc7\xc0\x00\b\xff" +
-	"\xff\xd5\xd0\x01\f\xff\xff\xe3\xe0\x01\x10\xff\xff\xd5\xd0\x00\fLMT\x00CMT\x00-04\x00-03\x00-02\x00\n<-03>3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfc" +
-	"z=\xe1\xcd\x02\x00\x00\xcd\x02\x00\x00\x1a\x00\x00\x00America/Argentina/San_JuanTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00>\x00\x00\x00\x06\x00\x00\x00\x14\xff\xff\xff\xffr\x9c\xb1\xbc\xff\xff\xff\xff\xa2\x92\x8f0\xff\xff\xff\xff\xb6{R@\xff\xff\xff\xff\xb7\x1aɰ\xff\xff\xff\xff\xb8\x1e\x8f@\xff\xff\xff\xff" +
-	"\xb8\xd4p0\xff\xff\xff\xff\xba\x17}\xc0\xff\xff\xff\xff\xba\xb5\xa3\xb0\xff\xff\xff\xff\xbb\xf8\xb1@\xff\xff\xff\xff\xbc\x96\xd70\xff\xff\xff\xff\xbd\xd9\xe4\xc0\xff\xff\xff\xff\xbex\n\xb0\xff\xff\xff\xff\xbf\xbb\x18@" +
-	"\xff\xff\xff\xff\xc0Z\x8f\xb0\xff\xff\xff\xff\xc1\x9d\x9d@\xff\xff\xff\xff\xc2;\xc30\xff\xff\xff\xff\xc3~\xd0\xc0\xff\xff\xff\xff\xc4\x1c\xf6\xb0\xff\xff\xff\xff\xc5`\x04@\xff\xff\xff\xff\xc5\xfe*0\xff\xff\xff\xff" +
-	"\xc7A7\xc0\xff\xff\xff\xff\xc7\xe0\xaf0\xff\xff\xff\xffȁ\x94@\xff\xff\xff\xff\xcaM\xa1\xb0\xff\xff\xff\xff\xca\xee\x86\xc0\xff\xff\xff\xff\xceM\xff0\xff\xff\xff\xffΰ\xed\xc0\xff\xff\xff\xff\xd3)5\xb0" +
-	"\xff\xff\xff\xff\xd4Cd\xc0\xff\xff\xff\xff\xf4=\b0\xff\xff\xff\xff\xf4\x9f\xf6\xc0\xff\xff\xff\xff\xf5\x05l0\xff\xff\xff\xff\xf62\x10@\xff\xff\xff\xff\xf6柰\xff\xff\xff\xff\xf8\x13C\xc0\xff\xff\xff\xff" +
-	"\xf8\xc7\xd30\xff\xff\xff\xff\xf9\xf4w@\xff\xff\xff\xff\xfa\xd36\xb0\xff\xff\xff\xff\xfb\xc35\xc0\xff\xff\xff\xff\xfc\xbcS0\xff\xff\xff\xff\xfd\xacR@\xff\xff\xff\xff\xfe\x9c50\xff\xff\xff\xff\xff\x8c4@" +
-	"\x00\x00\x00\x00\a\xa3J\xb0\x00\x00\x00\x00\b$o\xa0\x00\x00\x00\x00#\x94\xb5\xb0\x00\x00\x00\x00$\x10\x94\xa0\x00\x00\x00\x00%7\xf2\xb0\x00\x00\x00\x00%\xf0v\xa0\x00\x00\x00\x00'!\x0f0\x00\x00\x00\x00" +
-	"'͵\xa0\x00\x00\x00\x00(&&@\x00\x00\x00\x00)\x00\xf10\x00\x00\x00\x00)\xb0:\xa0\x00\x00\x00\x00*\xe0\xd30\x00\x00\x00\x00+\x99W \x00\x00\x00\x007\xf6ư\x00\x00\x00\x008\xbf*\xb0" +
-	"\x00\x00\x00\x00@\xba\x9f\xb0\x00\x00\x00\x00A\x030@\x00\x00\x00\x00Gw\t\xb0\x00\x00\x00\x00G\xdc\x7f \x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02" +
-	"\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x05\x04\x05\x04\x05\x04\x05\x04\x02\x05\x04\x05\x04\x05\x03\x05\x02\x05\x04\x05\xff\xff\xbf\xc4\x00\x00\xff\xff\xc3\xd0\x00\x04\xff\xff\xc7\xc0\x00\b\xff\xff\xd5\xd0\x01\f\xff\xff" +
-	"\xe3\xe0\x01\x10\xff\xff\xd5\xd0\x00\fLMT\x00CMT\x00-04\x00-03\x00-02\x00\n<-03>3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x80\xb9\\\xcd\x02\x00\x00" +
-	"\xcd\x02\x00\x00\x1a\x00\x00\x00America/Argentina/San_LuisTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	">\x00\x00\x00\x06\x00\x00\x00\x14\xff\xff\xff\xffr\x9c\xaf\xb4\xff\xff\xff\xff\xa2\x92\x8f0\xff\xff\xff\xff\xb6{R@\xff\xff\xff\xff\xb7\x1aɰ\xff\xff\xff\xff\xb8\x1e\x8f@\xff\xff\xff\xff\xb8\xd4p0\xff\xff\xff" +
-	"\xff\xba\x17}\xc0\xff\xff\xff\xff\xba\xb5\xa3\xb0\xff\xff\xff\xff\xbb\xf8\xb1@\xff\xff\xff\xff\xbc\x96\xd70\xff\xff\xff\xff\xbd\xd9\xe4\xc0\xff\xff\xff\xff\xbex\n\xb0\xff\xff\xff\xff\xbf\xbb\x18@\xff\xff\xff\xff\xc0Z\x8f" +
-	"\xb0\xff\xff\xff\xff\xc1\x9d\x9d@\xff\xff\xff\xff\xc2;\xc30\xff\xff\xff\xff\xc3~\xd0\xc0\xff\xff\xff\xff\xc4\x1c\xf6\xb0\xff\xff\xff\xff\xc5`\x04@\xff\xff\xff\xff\xc5\xfe*0\xff\xff\xff\xff\xc7A7\xc0\xff\xff\xff" +
-	"\xff\xc7\xe0\xaf0\xff\xff\xff\xffȁ\x94@\xff\xff\xff\xff\xcaM\xa1\xb0\xff\xff\xff\xff\xca\xee\x86\xc0\xff\xff\xff\xff\xceM\xff0\xff\xff\xff\xffΰ\xed\xc0\xff\xff\xff\xff\xd3)5\xb0\xff\xff\xff\xff\xd4Cd" +
-	"\xc0\xff\xff\xff\xff\xf4=\b0\xff\xff\xff\xff\xf4\x9f\xf6\xc0\xff\xff\xff\xff\xf5\x05l0\xff\xff\xff\xff\xf62\x10@\xff\xff\xff\xff\xf6柰\xff\xff\xff\xff\xf8\x13C\xc0\xff\xff\xff\xff\xf8\xc7\xd30\xff\xff\xff" +
-	"\xff\xf9\xf4w@\xff\xff\xff\xff\xfa\xd36\xb0\xff\xff\xff\xff\xfb\xc35\xc0\xff\xff\xff\xff\xfc\xbcS0\xff\xff\xff\xff\xfd\xacR@\xff\xff\xff\xff\xfe\x9c50\xff\xff\xff\xff\xff\x8c4@\x00\x00\x00\x00\a\xa3J" +
-	"\xb0\x00\x00\x00\x00\b$o\xa0\x00\x00\x00\x00#\x94\xb5\xb0\x00\x00\x00\x00$\x10\x94\xa0\x00\x00\x00\x00%7\xf2\xb0\x00\x00\x00\x00%\xfd\xa5\xa0\x00\x00\x00\x00'\x194@\x00\x00\x00\x00'\xcdð\x00\x00\x00" +
-	"\x00(G\x1b\xc0\x00\x00\x00\x007\xf6ư\x00\x00\x00\x008\xbf*\xb0\x00\x00\x00\x00@\xba\x9f\xb0\x00\x00\x00\x00A\x030@\x00\x00\x00\x00Gw\t\xb0\x00\x00\x00\x00G\x93\xfc\xa0\x00\x00\x00\x00G\xd3R" +
-	"\xb0\x00\x00\x00\x00H\xf1v@\x00\x00\x00\x00I\xb34\xb0\x00\x00\x00\x00J\xd1X@\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03" +
-	"\x02\x03\x02\x03\x02\x03\x02\x05\x04\x05\x04\x05\x04\x02\x03\x02\x05\x03\x05\x02\x05\x04\x03\x02\x03\x02\x05\xff\xff\xc1\xcc\x00\x00\xff\xff\xc3\xd0\x00\x04\xff\xff\xc7\xc0\x00\b\xff\xff\xd5\xd0\x01\f\xff\xff\xe3\xe0\x01\x10\xff\xff\xd5" +
-	"\xd0\x00\fLMT\x00CMT\x00-04\x00-03\x00-02\x00\n<-03>3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Y\xd8֭\xd6\x02\x00\x00\xd6\x02\x00\x00\x19\x00\x00" +
-	"\x00America/Argentina/TucumanTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?\x00\x00\x00\x06\x00\x00\x00" +
-	"\x14\xff\xff\xff\xffr\x9c\xae\xa4\xff\xff\xff\xff\xa2\x92\x8f0\xff\xff\xff\xff\xb6{R@\xff\xff\xff\xff\xb7\x1aɰ\xff\xff\xff\xff\xb8\x1e\x8f@\xff\xff\xff\xff\xb8\xd4p0\xff\xff\xff\xff\xba\x17}\xc0\xff\xff\xff" +
-	"\xff\xba\xb5\xa3\xb0\xff\xff\xff\xff\xbb\xf8\xb1@\xff\xff\xff\xff\xbc\x96\xd70\xff\xff\xff\xff\xbd\xd9\xe4\xc0\xff\xff\xff\xff\xbex\n\xb0\xff\xff\xff\xff\xbf\xbb\x18@\xff\xff\xff\xff\xc0Z\x8f\xb0\xff\xff\xff\xff\xc1\x9d\x9d" +
-	"@\xff\xff\xff\xff\xc2;\xc30\xff\xff\xff\xff\xc3~\xd0\xc0\xff\xff\xff\xff\xc4\x1c\xf6\xb0\xff\xff\xff\xff\xc5`\x04@\xff\xff\xff\xff\xc5\xfe*0\xff\xff\xff\xff\xc7A7\xc0\xff\xff\xff\xff\xc7\xe0\xaf0\xff\xff\xff" +
-	"\xffȁ\x94@\xff\xff\xff\xff\xcaM\xa1\xb0\xff\xff\xff\xff\xca\xee\x86\xc0\xff\xff\xff\xff\xceM\xff0\xff\xff\xff\xffΰ\xed\xc0\xff\xff\xff\xff\xd3)5\xb0\xff\xff\xff\xff\xd4Cd\xc0\xff\xff\xff\xff\xf4=\b" +
-	"0\xff\xff\xff\xff\xf4\x9f\xf6\xc0\xff\xff\xff\xff\xf5\x05l0\xff\xff\xff\xff\xf62\x10@\xff\xff\xff\xff\xf6柰\xff\xff\xff\xff\xf8\x13C\xc0\xff\xff\xff\xff\xf8\xc7\xd30\xff\xff\xff\xff\xf9\xf4w@\xff\xff\xff" +
-	"\xff\xfa\xd36\xb0\xff\xff\xff\xff\xfb\xc35\xc0\xff\xff\xff\xff\xfc\xbcS0\xff\xff\xff\xff\xfd\xacR@\xff\xff\xff\xff\xfe\x9c50\xff\xff\xff\xff\xff\x8c4@\x00\x00\x00\x00\a\xa3J\xb0\x00\x00\x00\x00\b$o" +
-	"\xa0\x00\x00\x00\x00#\x94\xb5\xb0\x00\x00\x00\x00$\x10\x94\xa0\x00\x00\x00\x00%7\xf2\xb0\x00\x00\x00\x00%\xf0v\xa0\x00\x00\x00\x00'!\x0f0\x00\x00\x00\x00'\xd0X\xa0\x00\x00\x00\x00)\x00\xff@\x00\x00\x00" +
-	"\x00)\xb0:\xa0\x00\x00\x00\x00*\xe0\xd30\x00\x00\x00\x00+\x99W \x00\x00\x00\x007\xf6ư\x00\x00\x00\x008\xbf*\xb0\x00\x00\x00\x00@\xbb\xf10\x00\x00\x00\x00@\xcb\xd1@\x00\x00\x00\x00Gw\t" +
-	"\xb0\x00\x00\x00\x00G\xdc\x7f \x00\x00\x00\x00H\xfa\xa2\xb0\x00\x00\x00\x00I\xbca \x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03" +
-	"\x02\x03\x02\x03\x02\x03\x02\x05\x04\x05\x04\x05\x04\x05\x04\x02\x04\x05\x04\x05\x03\x05\x02\x05\x04\x05\x04\x05\xff\xff\xc2\xdc\x00\x00\xff\xff\xc3\xd0\x00\x04\xff\xff\xc7\xc0\x00\b\xff\xff\xd5\xd0\x01\f\xff\xff\xe3\xe0\x01\x10\xff\xff" +
-	"\xd5\xd0\x00\fLMT\x00CMT\x00-04\x00-03\x00-02\x00\n<-03>3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8b}\xb6\x1e\xc4\x02\x00\x00\xc4\x02\x00\x00\x19\x00" +
-	"\x00\x00America/Argentina/UshuaiaTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00=\x00\x00\x00\x06\x00\x00" +
-	"\x00\x14\xff\xff\xff\xffr\x9c\xb1\x88\xff\xff\xff\xff\xa2\x92\x8f0\xff\xff\xff\xff\xb6{R@\xff\xff\xff\xff\xb7\x1aɰ\xff\xff\xff\xff\xb8\x1e\x8f@\xff\xff\xff\xff\xb8\xd4p0\xff\xff\xff\xff\xba\x17}\xc0\xff\xff" +
-	"\xff\xff\xba\xb5\xa3\xb0\xff\xff\xff\xff\xbb\xf8\xb1@\xff\xff\xff\xff\xbc\x96\xd70\xff\xff\xff\xff\xbd\xd9\xe4\xc0\xff\xff\xff\xff\xbex\n\xb0\xff\xff\xff\xff\xbf\xbb\x18@\xff\xff\xff\xff\xc0Z\x8f\xb0\xff\xff\xff\xff\xc1\x9d" +
-	"\x9d@\xff\xff\xff\xff\xc2;\xc30\xff\xff\xff\xff\xc3~\xd0\xc0\xff\xff\xff\xff\xc4\x1c\xf6\xb0\xff\xff\xff\xff\xc5`\x04@\xff\xff\xff\xff\xc5\xfe*0\xff\xff\xff\xff\xc7A7\xc0\xff\xff\xff\xff\xc7\xe0\xaf0\xff\xff" +
-	"\xff\xffȁ\x94@\xff\xff\xff\xff\xcaM\xa1\xb0\xff\xff\xff\xff\xca\xee\x86\xc0\xff\xff\xff\xff\xceM\xff0\xff\xff\xff\xffΰ\xed\xc0\xff\xff\xff\xff\xd3)5\xb0\xff\xff\xff\xff\xd4Cd\xc0\xff\xff\xff\xff\xf4=" +
-	"\b0\xff\xff\xff\xff\xf4\x9f\xf6\xc0\xff\xff\xff\xff\xf5\x05l0\xff\xff\xff\xff\xf62\x10@\xff\xff\xff\xff\xf6柰\xff\xff\xff\xff\xf8\x13C\xc0\xff\xff\xff\xff\xf8\xc7\xd30\xff\xff\xff\xff\xf9\xf4w@\xff\xff" +
-	"\xff\xff\xfa\xd36\xb0\xff\xff\xff\xff\xfb\xc35\xc0\xff\xff\xff\xff\xfc\xbcS0\xff\xff\xff\xff\xfd\xacR@\xff\xff\xff\xff\xfe\x9c50\xff\xff\xff\xff\xff\x8c4@\x00\x00\x00\x00\a\xa3J\xb0\x00\x00\x00\x00\b$" +
-	"o\xa0\x00\x00\x00\x00#\x94\xb5\xb0\x00\x00\x00\x00$\x10\x94\xa0\x00\x00\x00\x00%7\xf2\xb0\x00\x00\x00\x00%\xf0v\xa0\x00\x00\x00\x00'!\x0f0\x00\x00\x00\x00'\xd0X\xa0\x00\x00\x00\x00)\x00\xf10\x00\x00" +
-	"\x00\x00)\xb0:\xa0\x00\x00\x00\x00*\xe0\xd30\x00\x00\x00\x00+\x99W \x00\x00\x00\x007\xf6ư\x00\x00\x00\x008\xbf*\xb0\x00\x00\x00\x00@\xb9N0\x00\x00\x00\x00@\xd5\v\xc0\x00\x00\x00\x00Gw" +
-	"\t\xb0\x00\x00\x00\x00G\xdc\x7f \x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x05\x04\x05\x04\x05\x04\x05\x04" +
-	"\x05\x04\x05\x04\x05\x03\x05\x02\x05\x04\x05\xff\xff\xbf\xf8\x00\x00\xff\xff\xc3\xd0\x00\x04\xff\xff\xc7\xc0\x00\b\xff\xff\xd5\xd0\x01\f\xff\xff\xe3\xe0\x01\x10\xff\xff\xd5\xd0\x00\fLMT\x00CMT\x00-04\x00-" +
-	"03\x00-02\x00\n<-03>3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00q\xc9*;\xb1\x00\x00\x00\xb1\x00\x00\x00\r\x00\x00\x00America/ArubaTZ" +
-	"if2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x10\xff\xff\xff\xffz敹\xff\xff\xff\xff\xcb\xf62\xc0\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff" +
-	"\xff\xd2`\xed\xd0\x01\x03\x02\x01\xff\xff\xc2\a\x00\x00\xff\xff\xc7\xc0\x00\x04\xff\xff\xd5\xd0\x01\b\xff\xff\xd5\xd0\x01\fLMT\x00AST\x00APT\x00AWT\x00\nAST4\nPK\x03\x04\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00d\xa9y\x9at\x03\x00\x00t\x03\x00\x00\x10\x00\x00\x00America/AsuncionTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00O\x00\x00\x00\x05\x00\x00\x00\x10\xff\xff\xff\xffi\x87\x11\x90\xff\xff\xff\xff\xb8\x17\xf5\x90\x00\x00\x00\x00\x05+\xda@\x00\x00\x00\x00\a\xfc\xf0\xb0\x00\x00\x00\x00\n\xcft\xc0\x00\x00\x00\x00" +
-	"\v\x97ʰ\x00\x00\x00\x00\f\xb1\xf9\xc0\x00\x00\x00\x00\rx\xfe0\x00\x00\x00\x00\x0e\x93-@\x00\x00\x00\x00\x0fZ1\xb0\x00\x00\x00\x00\x10t`\xc0\x00\x00\x00\x00\x11dC\xb0\x00\x00\x00\x00\x12U\x94@" +
-	"\x00\x00\x00\x00\x13FȰ\x00\x00\x00\x00\x148\x19@\x00\x00\x00\x00\x15'\xfc0\x00\x00\x00\x00\x16\x19L\xc0\x00\x00\x00\x00\x17\t/\xb0\x00\x00\x00\x00\x17\xfa\x80@\x00\x00\x00\x00\x18\xeac0\x00\x00\x00\x00" +
-	"\x19۳\xc0\x00\x00\x00\x00\x1a\xcc\xe80\x00\x00\x00\x00\x1b\xbe8\xc0\x00\x00\x00\x00\x1c\xae\x1b\xb0\x00\x00\x00\x00\x1d\x9fl@\x00\x00\x00\x00\x1e\x8fO0\x00\x00\x00\x00\x1f\x80\x9f\xc0\x00\x00\x00\x00 p\x82\xb0" +
-	"\x00\x00\x00\x00!a\xd3@\x00\x00\x00\x00\"S\a\xb0\x00\x00\x00\x00#DX@\x00\x00\x00\x00$4;0\x00\x00\x00\x00%A;@\x00\x00\x00\x00&\x15n\xb0\x00\x00\x00\x00'\x06\xbf@\x00\x00\x00\x00" +
-	"'\xf6\xa20\x00\x00\x00\x00(\xee\x8a@\x00\x00\x00\x00)\xb0H\xb0\x00\x00\x00\x00*Ͻ\xc0\x00\x00\x00\x00+\xb9\t0\x00\x00\x00\x00,\xab\xab@\x00\x00\x00\x00-p\f\xb0\x00\x00\x00\x00.\x8c\xde\xc0" +
-	"\x00\x00\x00\x00/O\xee\xb0\x00\x00\x00\x000n\x12@\x00\x00\x00\x0016h0\x00\x00\x00\x002W.\xc0\x00\x00\x00\x003\x0f\xb2\xb0\x00\x00\x00\x0047\x10\xc0\x00\x00\x00\x004\xf8\xcf0\x00\x00\x00\x00" +
-	"6\x16\xf2\xc0\x00\x00\x00\x006\xe1\xeb\xb0\x00\x00\x00\x007\xf6\xd4\xc0\x00\x00\x00\x008\xc1Ͱ\x00\x00\x00\x009ֶ\xc0\x00\x00\x00\x00:\xa1\xaf\xb0\x00\x00\x00\x00;\xbf\xd3@\x00\x00\x00\x00<\xaf\xb60" +
-	"\x00\x00\x00\x00=q\x90\xc0\x00\x00\x00\x00>\x8f\x980\x00\x00\x00\x00?Z\xad@\x00\x00\x00\x00@oz0\x00\x00\x00\x00Aq\xee@\x00\x00\x00\x00B3\xac\xb0\x00\x00\x00\x00CQ\xd0@\x00\x00\x00\x00" +
-	"D\x13\x8e\xb0\x00\x00\x00\x00E1\xb2@\x00\x00\x00\x00E\xf3p\xb0\x00\x00\x00\x00G\x1a\xce\xc0\x00\x00\x00\x00G\xd3R\xb0\x00\x00\x00\x00H\xfa\xb0\xc0\x00\x00\x00\x00I\xb34\xb0\x00\x00\x00\x00Jڒ\xc0" +
-	"\x00\x00\x00\x00K\xc1;0\x00\x00\x00\x00L\xa7\xff\xc0\x00\x00\x00\x00M\xa1\x1d0\x00\x00\x00\x00N\x87\xe1\xc0\x00\x00\x00\x00O\x80\xff0\x00\x00\x00\x00Pp\xfe@\x01\x02\x03\x02\x04\x02\x04\x02\x04\x02\x04\x02" +
-	"\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02" +
-	"\x04\x02\x04\x02\x04\x02\x04\xff\xff\xc9\xf0\x00\x00\xff\xff\xc9\xf0\x00\x04\xff\xff\xc7\xc0\x00\b\xff\xff\xd5\xd0\x00\f\xff\xff\xd5\xd0\x01\fLMT\x00AMT\x00-04\x00-03\x00\n<-04>4" +
-	"<-03>,M10.1.0/0,M3.4.0/0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Ծ\xe7#\x95\x00\x00\x00\x95\x00\x00\x00\x10\x00\x00\x00Ameri" +
-	"ca/AtikokanTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00" +
-	"\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\f\xff\xff\xff\xffi\x87&\x10\xff\xff\xff\xff\x8b\xf4" +
-	"a\xe8\x01\x02\xff\xff\xb5p\x00\x00\xff\xff\xb5\x18\x00\x04\xff\xff\xb9\xb0\x00\bLMT\x00CMT\x00EST\x00\nEST5\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xae,\xa44\xc9\x03" +
-	"\x00\x00\xc9\x03\x00\x00\f\x00\x00\x00America/AtkaTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00T\x00\x00\x00\n\x00\x00\x00!\xff\xff\xff" +
-	"\xff?\xc2\xfd\xd1\xff\xff\xff\xff}\x87Z^\xff\xff\xff\xffˉD\xd0\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2aP@\xff\xff\xff\xff\xfa\xd2U\xb0\xff\xff\xff\xff\xfe\xb8qP\xff\xff\xff\xff\xff\xa8T" +
-	"@\x00\x00\x00\x00\x00\x98SP\x00\x00\x00\x00\x01\x886@\x00\x00\x00\x00\x02x5P\x00\x00\x00\x00\x03qR\xc0\x00\x00\x00\x00\x04aQ\xd0\x00\x00\x00\x00\x05Q4\xc0\x00\x00\x00\x00\x06A3\xd0\x00\x00\x00" +
-	"\x00\a1\x16\xc0\x00\x00\x00\x00\a\x8dm\xd0\x00\x00\x00\x00\t\x10\xf8\xc0\x00\x00\x00\x00\t\xad\xe9P\x00\x00\x00\x00\n\xf0\xda\xc0\x00\x00\x00\x00\v\xe0\xd9\xd0\x00\x00\x00\x00\f\xd9\xf7@\x00\x00\x00\x00\r\xc0\xbb" +
-	"\xd0\x00\x00\x00\x00\x0e\xb9\xd9@\x00\x00\x00\x00\x0f\xa9\xd8P\x00\x00\x00\x00\x10\x99\xbb@\x00\x00\x00\x00\x11\x89\xbaP\x00\x00\x00\x00\x12y\x9d@\x00\x00\x00\x00\x13i\x9cP\x00\x00\x00\x00\x14Y\x7f@\x00\x00\x00" +
-	"\x00\x15I~P\x00\x00\x00\x00\x169a@\x00\x00\x00\x00\x17)`P\x00\x00\x00\x00\x18\"}\xc0\x00\x00\x00\x00\x19\tBP\x00\x00\x00\x00\x1a\x02_\xc0\x00\x00\x00\x00\x1a+\" \x00\x00\x00\x00\x1a\xf2P" +
-	"\xc0\x00\x00\x00\x00\x1b\xe23\xb0\x00\x00\x00\x00\x1c\xd22\xc0\x00\x00\x00\x00\x1d\xc2\x15\xb0\x00\x00\x00\x00\x1e\xb2\x14\xc0\x00\x00\x00\x00\x1f\xa1\xf7\xb0\x00\x00\x00\x00 vG@\x00\x00\x00\x00!\x81ٰ\x00\x00\x00" +
-	"\x00\"V)@\x00\x00\x00\x00#j\xf60\x00\x00\x00\x00$6\v@\x00\x00\x00\x00%J\xd80\x00\x00\x00\x00&\x15\xed@\x00\x00\x00\x00'*\xba0\x00\x00\x00\x00'\xff\t\xc0\x00\x00\x00\x00)\n\x9c" +
-	"0\x00\x00\x00\x00)\xde\xeb\xc0\x00\x00\x00\x00*\xea~0\x00\x00\x00\x00+\xbe\xcd\xc0\x00\x00\x00\x00,Ӛ\xb0\x00\x00\x00\x00-\x9e\xaf\xc0\x00\x00\x00\x00.\xb3|\xb0\x00\x00\x00\x00/~\x91\xc0\x00\x00\x00" +
-	"\x000\x93^\xb0\x00\x00\x00\x001g\xae@\x00\x00\x00\x002s@\xb0\x00\x00\x00\x003G\x90@\x00\x00\x00\x004S\"\xb0\x00\x00\x00\x005'r@\x00\x00\x00\x0063\x04\xb0\x00\x00\x00\x007\aT" +
-	"@\x00\x00\x00\x008\x1c!0\x00\x00\x00\x008\xe76@\x00\x00\x00\x009\xfc\x030\x00\x00\x00\x00:\xc7\x18@\x00\x00\x00\x00;\xdb\xe50\x00\x00\x00\x00<\xb04\xc0\x00\x00\x00\x00=\xbb\xc70\x00\x00\x00" +
-	"\x00>\x90\x16\xc0\x00\x00\x00\x00?\x9b\xa90\x00\x00\x00\x00@o\xf8\xc0\x00\x00\x00\x00A\x84Ű\x00\x00\x00\x00BO\xda\xc0\x00\x00\x00\x00Cd\xa7\xb0\x00\x00\x00\x00D/\xbc\xc0\x00\x00\x00\x00ED\x89" +
-	"\xb0\x00\x00\x00\x00E\xf3\xef@\x01\x02\x03\x04\x02\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\a\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t" +
-	"\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\x00\x00\xab\xe2\x00\x00\xff\xffZb\x00\x00\xff\xffeP\x00\x04\xff\xffs`\x01\b\xff\xffs" +
-	"`\x01\f\xff\xffeP\x00\x10\xff\xffs`\x01\x14\xff\xffs`\x00\x18\xff\xff\x81p\x01\x1d\xff\xffs`\x00\x19LMT\x00NST\x00NWT\x00NPT\x00BST\x00BDT\x00AHS" +
-	"T\x00HDT\x00\nHST10HDT,M3.2.0,M11.1.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00OKjǪ\x02\x00\x00\xaa\x02\x00\x00\r\x00\x00" +
-	"\x00America/BahiaTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00" +
-	"\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00=\x00\x00\x00\x03\x00\x00\x00\f\xff\xff\xff\xff\x96\xaak\x1c\xff\xff\xff" +
-	"\xff\xb8\x0fI\xe0\xff\xff\xff\xff\xb8\xfd@\xa0\xff\xff\xff\xff\xb9\xf140\xff\xff\xff\xff\xba\xdet \xff\xff\xff\xff\xda8\xae0\xff\xff\xff\xff\xda\xeb\xfa0\xff\xff\xff\xff\xdc\x19\xe1\xb0\xff\xff\xff\xffܹY" +
-	" \xff\xff\xff\xff\xdd\xfb\x150\xff\xff\xff\xffޛ\xde \xff\xff\xff\xff\xdfݚ0\xff\xff\xff\xff\xe0T3 \xff\xff\xff\xff\xf4\x97\xff\xb0\xff\xff\xff\xff\xf5\x05^ \xff\xff\xff\xff\xf6\xc0d0\xff\xff\xff" +
-	"\xff\xf7\x0e\x1e\xa0\xff\xff\xff\xff\xf8Q,0\xff\xff\xff\xff\xf8\xc7\xc5 \xff\xff\xff\xff\xfa\nҰ\xff\xff\xff\xff\xfa\xa8\xf8\xa0\xff\xff\xff\xff\xfb\xec\x060\xff\xff\xff\xff\xfc\x8b}\xa0\x00\x00\x00\x00\x1dɎ" +
-	"0\x00\x00\x00\x00\x1exנ\x00\x00\x00\x00\x1f\xa05\xb0\x00\x00\x00\x00 3Ϡ\x00\x00\x00\x00!\x81i0\x00\x00\x00\x00\"\vȠ\x00\x00\x00\x00#X\x10\xb0\x00\x00\x00\x00#\xe2p \x00\x00\x00" +
-	"\x00%7\xf2\xb0\x00\x00\x00\x00%\xd4\xc7 \x00\x00\x00\x00'!\x0f0\x00\x00\x00\x00'\xbd\xe3\xa0\x00\x00\x00\x00)\x00\xf10\x00\x00\x00\x00)\x94\x8b \x00\x00\x00\x00*\xea\r\xb0\x00\x00\x00\x00+k2" +
-	"\xa0\x00\x00\x00\x00,\xc0\xb50\x00\x00\x00\x00-f\xc4 \x00\x00\x00\x00.\xa0\x970\x00\x00\x00\x00/F\xa6 \x00\x00\x00\x000\x80y0\x00\x00\x00\x001\x1dM\xa0\x00\x00\x00\x002W \xb0\x00\x00\x00" +
-	"\x003\x06j \x00\x00\x00\x0048T0\x00\x00\x00\x004\xf8\xc1 \x00\x00\x00\x006 \x1f0\x00\x00\x00\x006\xcfh\xa0\x00\x00\x00\x007\xf6ư\x00\x00\x00\x008\xb8\x85 \x00\x00\x00\x009\xdf\xe3" +
-	"0\x00\x00\x00\x00:\x8f,\xa0\x00\x00\x00\x00;\xc8\xff\xb0\x00\x00\x00\x00<o\x0e\xa0\x00\x00\x00\x00=đ0\x00\x00\x00\x00>N\xf0\xa0\x00\x00\x00\x00N\x9aH\xb0\x00\x00\x00\x00OI\x92 \x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\xff\xff" +
-	"\xdb\xe4\x00\x00\xff\xff\xe3\xe0\x01\x04\xff\xff\xd5\xd0\x00\bLMT\x00-02\x00-03\x00\n<-03>3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00U\x0e\x01n\xd8\x02\x00\x00\xd8\x02" +
-	"\x00\x00\x16\x00\x00\x00America/Bahia_BanderasTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?\x00\x00\x00\x06\x00" +
-	"\x00\x00\x18\xff\xff\xff\xff\xa5\xb6\xe8p\xff\xff\xff\xff\xaf\xf2n\xe0\xff\xff\xff\xff\xb6fV`\xff\xff\xff\xff\xb7C\xd2`\xff\xff\xff\xff\xb8\f6`\xff\xff\xff\xff\xb8\xfd\x86\xf0\xff\xff\xff\xff\xcb\xeaq`\xff" +
-	"\xff\xff\xffؑ\xb4\xf0\x00\x00\x00\x00\x00\x00p\x80\x00\x00\x00\x001g\x84\x10\x00\x00\x00\x002s\x16\x80\x00\x00\x00\x003Gf\x10\x00\x00\x00\x004R\xf8\x80\x00\x00\x00\x005'H\x10\x00\x00\x00\x006" +
-	"2ڀ\x00\x00\x00\x007\a*\x10\x00\x00\x00\x008\x1b\xf7\x00\x00\x00\x00\x008\xe7\f\x10\x00\x00\x00\x009\xfb\xd9\x00\x00\x00\x00\x00:\xf5\x12\x90\x00\x00\x00\x00;\xb6\xd1\x00\x00\x00\x00\x00<\xb0\n\x90\x00" +
-	"\x00\x00\x00=\xbb\x9d\x00\x00\x00\x00\x00>\x8f\xec\x90\x00\x00\x00\x00?\x9b\x7f\x00\x00\x00\x00\x00@oΐ\x00\x00\x00\x00A\x84\x9b\x80\x00\x00\x00\x00BO\xb0\x90\x00\x00\x00\x00Cd}\x80\x00\x00\x00\x00D" +
-	"/\x92\x90\x00\x00\x00\x00ED_\x80\x00\x00\x00\x00F\x0ft\x90\x00\x00\x00\x00G$A\x80\x00\x00\x00\x00G\xf8\x91\x10\x00\x00\x00\x00I\x04#\x80\x00\x00\x00\x00I\xd8s\x10\x00\x00\x00\x00J\xe4\x05\x80\x00" +
-	"\x00\x00\x00K\xb8U\x10\x00\x00\x00\x00L\xcd\x13\xf0\x00\x00\x00\x00M\x98)\x00\x00\x00\x00\x00N\xac\xf5\xf0\x00\x00\x00\x00Ox\v\x00\x00\x00\x00\x00P\x8c\xd7\xf0\x00\x00\x00\x00Qa'\x80\x00\x00\x00\x00R" +
-	"l\xb9\xf0\x00\x00\x00\x00SA\t\x80\x00\x00\x00\x00TL\x9b\xf0\x00\x00\x00\x00U \xeb\x80\x00\x00\x00\x00V,}\xf0\x00\x00\x00\x00W\x00̀\x00\x00\x00\x00X\x15\x9ap\x00\x00\x00\x00Xீ\x00" +
-	"\x00\x00\x00Y\xf5|p\x00\x00\x00\x00Z\xc0\x91\x80\x00\x00\x00\x00[\xd5^p\x00\x00\x00\x00\\\xa9\xae\x00\x00\x00\x00\x00]\xb5@p\x00\x00\x00\x00^\x89\x90\x00\x00\x00\x00\x00_\x95\"p\x00\x00\x00\x00`" +
-	"ir\x00\x00\x00\x00\x00a~>\xf0\x00\x00\x00\x00bIT\x00\x00\x00\x00\x00c^ \xf0\x01\x02\x01\x03\x01\x02\x01\x04\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01" +
-	"\x03\x01\x03\x01\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\xff\xff\x9dT\x00\x00\xff\xff\x9d\x90\x00\x04\xff\xff\xab\xa0\x00\b\xff\xff\xab\xa0\x01\f\xff\xff\x8f\x80\x00\x10" +
-	"\xff\xff\xb9\xb0\x01\x14LMT\x00MST\x00CST\x00MDT\x00PST\x00CDT\x00\nCST6\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00l=\xad\xbe\x16\x01\x00\x00\x16\x01" +
-	"\x00\x00\x10\x00\x00\x00America/BarbadosTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x00\x00\x00\x04\x00\x00\x00\x12\xff\xff\xff" +
-	"\xff\x92@\xa9e\xff\xff\xff\xff\xcb\xe3\xcb\xd0\xff\xff\xff\xff̔\x82\xe0\xff\xff\xff\xff\xcd\xd6\"\xd0\xff\xff\xff\xff\xce|M\xe0\xff\xff\xff\xffϛ\xa6\xd0\xff\xff\xff\xff\xd0ej`\x00\x00\x00\x00\x0e\x00\xf2" +
-	"\xe0\x00\x00\x00\x00\x0e\x94\x8c\xd0\x00\x00\x00\x00\x0f\x97\x00\xe0\x00\x00\x00\x00\x10tn\xd0\x00\x00\x00\x00\x11v\xe2\xe0\x00\x00\x00\x00\x12TP\xd0\x00\x00\x00\x00\x13_\xff`\x00\x00\x00\x00\x140>P\x02\x01\x02" +
-	"\x01\x02\x03\x02\x01\x02\x01\x02\x01\x02\x01\x02\xff\xff\xc8\x1b\x00\x00\xff\xff\xd5\xd0\x01\x04\xff\xff\xc7\xc0\x00\b\xff\xff\xce\xc8\x01\fLMT\x00ADT\x00AST\x00-0330\x00\nAST4\n" +
-	"PK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85-\xb9\xf8\x8a\x01\x00\x00\x8a\x01\x00\x00\r\x00\x00\x00America/BelemTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1d\x00\x00\x00\x03\x00\x00\x00\f\xff\xff\xff\xff\x96\xaatt\xff\xff\xff\xff\xb8\x0fI\xe0\xff\xff\xff\xff\xb8\xfd@\xa0\xff\xff\xff\xff\xb9\xf140\xff\xff\xff\xff\xba\xdet \xff\xff" +
-	"\xff\xff\xda8\xae0\xff\xff\xff\xff\xda\xeb\xfa0\xff\xff\xff\xff\xdc\x19\xe1\xb0\xff\xff\xff\xffܹY \xff\xff\xff\xff\xdd\xfb\x150\xff\xff\xff\xffޛ\xde \xff\xff\xff\xff\xdfݚ0\xff\xff\xff\xff\xe0T" +
-	"3 \xff\xff\xff\xff\xf4\x97\xff\xb0\xff\xff\xff\xff\xf5\x05^ \xff\xff\xff\xff\xf6\xc0d0\xff\xff\xff\xff\xf7\x0e\x1e\xa0\xff\xff\xff\xff\xf8Q,0\xff\xff\xff\xff\xf8\xc7\xc5 \xff\xff\xff\xff\xfa\nҰ\xff\xff" +
-	"\xff\xff\xfa\xa8\xf8\xa0\xff\xff\xff\xff\xfb\xec\x060\xff\xff\xff\xff\xfc\x8b}\xa0\x00\x00\x00\x00\x1dɎ0\x00\x00\x00\x00\x1exנ\x00\x00\x00\x00\x1f\xa05\xb0\x00\x00\x00\x00 3Ϡ\x00\x00\x00\x00!\x81" +
-	"i0\x00\x00\x00\x00\"\vȠ\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\xff\xffҌ\x00\x00\xff\xff\xe3\xe0\x01\x04\xff\xff\xd5\xd0\x00\bLMT" +
-	"\x00-02\x00-03\x00\n<-03>3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x89غ\xee\x15\x04\x00\x00\x15\x04\x00\x00\x0e\x00\x00\x00America/Beliz" +
-	"eTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00b\x00\x00\x00\x06\x00\x00\x00\x1a\xff\xff\xff\xff\x93^ٰ\xff\xff\xff\xff\x9f\x9f;\xe0\xff\xff\xff\xff\xa0EQ\xd8" +
-	"\xff\xff\xff\xff\xa1\x7f\x1d\xe0\xff\xff\xff\xff\xa2.nX\xff\xff\xff\xff\xa3^\xff\xe0\xff\xff\xff\xff\xa4\x0ePX\xff\xff\xff\xff\xa5>\xe1\xe0\xff\xff\xff\xff\xa5\xee2X\xff\xff\xff\xff\xa7'\xfe`\xff\xff\xff\xff" +
-	"\xa7\xce\x14X\xff\xff\xff\xff\xa9\a\xe0`\xff\xff\xff\xff\xa9\xad\xf6X\xff\xff\xff\xff\xaa\xe7\xc2`\xff\xff\xff\xff\xab\x97\x12\xd8\xff\xff\xff\xff\xacǤ`\xff\xff\xff\xff\xadv\xf4\xd8\xff\xff\xff\xff\xae\xa7\x86`" +
-	"\xff\xff\xff\xff\xafV\xd6\xd8\xff\xff\xff\xff\xb0\x87h`\xff\xff\xff\xff\xb16\xb8\xd8\xff\xff\xff\xff\xb2p\x84\xe0\xff\xff\xff\xff\xb3\x16\x9a\xd8\xff\xff\xff\xff\xb4Pf\xe0\xff\xff\xff\xff\xb4\xf6|\xd8\xff\xff\xff\xff" +
-	"\xb60H\xe0\xff\xff\xff\xff\xb6ߙX\xff\xff\xff\xff\xb8\x10*\xe0\xff\xff\xff\xff\xb8\xbf{X\xff\xff\xff\xff\xb9\xf0\f\xe0\xff\xff\xff\xff\xba\x9f]X\xff\xff\xff\xff\xbb\xd9)`\xff\xff\xff\xff\xbc\x7f?X" +
-	"\xff\xff\xff\xff\xbd\xb9\v`\xff\xff\xff\xff\xbe_!X\xff\xff\xff\xff\xbf\x98\xed`\xff\xff\xff\xff\xc0?\x03X\xff\xff\xff\xff\xc1x\xcf`\xff\xff\xff\xff\xc2(\x1f\xd8\xff\xff\xff\xff\xc3X\xb1`\xff\xff\xff\xff" +
-	"\xc4\b\x01\xd8\xff\xff\xff\xff\xc58\x93`\xff\xff\xff\xff\xc5\xe7\xe3\xd8\xff\xff\xff\xff\xc7!\xaf\xe0\xff\xff\xff\xff\xc7\xc7\xc5\xd8\xff\xff\xff\xff\xc9\x01\x91\xe0\xff\xff\xff\xffɧ\xa7\xd8\xff\xff\xff\xff\xca\xe1s\xe0" +
-	"\xff\xff\xff\xffː\xc4X\xff\xff\xff\xff\xcc@\"\xe0\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2\xc6qP\xff\xff\xff\xff\xd6)\xfa`\xff\xff\xff\xff\xd6\xd9J\xd8\xff\xff\xff\xff\xd8\t\xdc`\xff\xff\xff\xff" +
-	"ع,\xd8\xff\xff\xff\xff\xd9\xe9\xbe`\xff\xff\xff\xffڙ\x0e\xd8\xff\xff\xff\xff\xdb\xd2\xda\xe0\xff\xff\xff\xff\xdcx\xf0\xd8\xff\xff\xff\xffݲ\xbc\xe0\xff\xff\xff\xff\xdeX\xd2\xd8\xff\xff\xff\xffߒ\x9e\xe0" +
-	"\xff\xff\xff\xff\xe0A\xefX\xff\xff\xff\xff\xe1r\x80\xe0\xff\xff\xff\xff\xe2!\xd1X\xff\xff\xff\xff\xe3Rb\xe0\xff\xff\xff\xff\xe4\x01\xb3X\xff\xff\xff\xff\xe52D\xe0\xff\xff\xff\xff\xe5\xe1\x95X\xff\xff\xff\xff" +
-	"\xe7\x1ba`\xff\xff\xff\xff\xe7\xc1wX\xff\xff\xff\xff\xe8\xfbC`\xff\xff\xff\xff\xe9\xa1YX\xff\xff\xff\xff\xea\xdb%`\xff\xff\xff\xff\xeb\x8au\xd8\xff\xff\xff\xff\xec\xbb\a`\xff\xff\xff\xff\xedjW\xd8" +
-	"\xff\xff\xff\xff\xee\x9a\xe9`\xff\xff\xff\xff\xefJ9\xd8\xff\xff\xff\xff\xf0\x84\x05\xe0\xff\xff\xff\xff\xf1*\x1b\xd8\xff\xff\xff\xff\xf2c\xe7\xe0\xff\xff\xff\xff\xf3\t\xfd\xd8\xff\xff\xff\xff\xf4C\xc9\xe0\xff\xff\xff\xff" +
-	"\xf4\xe9\xdf\xd8\xff\xff\xff\xff\xf6#\xab\xe0\xff\xff\xff\xff\xf6\xd2\xfcX\xff\xff\xff\xff\xf8\x03\x8d\xe0\xff\xff\xff\xff\xf8\xb2\xdeX\xff\xff\xff\xff\xf9\xe3o\xe0\xff\xff\xff\xff\xfa\x92\xc0X\xff\xff\xff\xff\xfb̌`" +
-	"\xff\xff\xff\xff\xfcr\xa2X\x00\x00\x00\x00\ab\xdb`\x00\x00\x00\x00\a\xb9\xd0P\x00\x00\x00\x00\x18aq`\x00\x00\x00\x00\x18\xab7P\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x03\x04\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x05\x02\x05\x02\xff\xff\xadP\x00\x00\xff\xff\xb2\xa8\x01\x04\xff\xff\xab\xa0\x00\n\xff\xff\xb9\xb0\x01\x0e\xff\xff\xb9\xb0\x01\x12\xff\xff\xb9\xb0\x01\x16LMT\x00-0" +
-	"530\x00CST\x00CWT\x00CPT\x00CDT\x00\nCST6\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00q\xc9*;\xb1\x00\x00\x00\xb1\x00\x00\x00\x14\x00\x00\x00Amer" +
-	"ica/Blanc-SablonTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01" +
-	"\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x10\xff\xff\xff\xffz敹\xff" +
-	"\xff\xff\xff\xcb\xf62\xc0\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2`\xed\xd0\x01\x03\x02\x01\xff\xff\xc2\a\x00\x00\xff\xff\xc7\xc0\x00\x04\xff\xff\xd5\xd0\x01\b\xff\xff\xd5\xd0\x01\fLMT\x00AST\x00A" +
-	"PT\x00AWT\x00\nAST4\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf8Dz\x97\xae\x01\x00\x00\xae\x01\x00\x00\x11\x00\x00\x00America/Boa_Vista" +
-	"TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00!\x00\x00\x00\x03\x00\x00\x00\f\xff\xff\xff\xff\x96\xaa\x7f\xe0\xff\xff\xff\xff\xb8\x0fW\xf0\xff\xff\xff\xff\xb8\xfdN\xb0\xff" +
-	"\xff\xff\xff\xb9\xf1B@\xff\xff\xff\xff\xbaނ0\xff\xff\xff\xff\xda8\xbc@\xff\xff\xff\xff\xda\xec\b@\xff\xff\xff\xff\xdc\x19\xef\xc0\xff\xff\xff\xffܹg0\xff\xff\xff\xff\xdd\xfb#@\xff\xff\xff\xff\xde" +
-	"\x9b\xec0\xff\xff\xff\xff\xdfݨ@\xff\xff\xff\xff\xe0TA0\xff\xff\xff\xff\xf4\x98\r\xc0\xff\xff\xff\xff\xf5\x05l0\xff\xff\xff\xff\xf6\xc0r@\xff\xff\xff\xff\xf7\x0e,\xb0\xff\xff\xff\xff\xf8Q:@\xff" +
-	"\xff\xff\xff\xf8\xc7\xd30\xff\xff\xff\xff\xfa\n\xe0\xc0\xff\xff\xff\xff\xfa\xa9\x06\xb0\xff\xff\xff\xff\xfb\xec\x14@\xff\xff\xff\xff\xfc\x8b\x8b\xb0\x00\x00\x00\x00\x1dɜ@\x00\x00\x00\x00\x1ex\xe5\xb0\x00\x00\x00\x00\x1f" +
-	"\xa0C\xc0\x00\x00\x00\x00 3ݰ\x00\x00\x00\x00!\x81w@\x00\x00\x00\x00\"\vְ\x00\x00\x00\x007\xf6\xd4\xc0\x00\x00\x00\x008\xb8\x930\x00\x00\x00\x009\xdf\xf1@\x00\x00\x00\x009\xe9\x1d\xb0\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\xff\xff\xc7 \x00\x00\xff\xff\xd5\xd0\x01\x04\xff\xff\xc7\xc0\x00\bLMT\x00-03\x00-0" +
-	"4\x00\n<-04>4\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00,g\xec\xec\xb3\x00\x00\x00\xb3\x00\x00\x00\x0e\x00\x00\x00America/BogotaTZif2\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x10\xff\xff\xff\xff^\x9c4\xf0\xff\xff\xff\xff\x98XUp\x00\x00\x00\x00*\x03sP\x00\x00\x00\x00+t\x89" +
-	"@\x01\x03\x02\x03\xff\xff\xba\x90\x00\x00\xff\xff\xba\x90\x00\x04\xff\xff\xc7\xc0\x01\b\xff\xff\xb9\xb0\x00\fLMT\x00BMT\x00-04\x00-05\x00\n<-05>5\nPK\x03\x04\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00.\xbe\x1a>\xe7\x03\x00\x00\xe7\x03\x00\x00\r\x00\x00\x00America/BoiseTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00Z\x00\x00\x00\a\x00\x00\x00\x1c\xff\xff\xff\xff^\x04\x1a\xc0\xff\xff\xff\xff\x9e\xa6H\xa0\xff\xff\xff\xff\x9f\xbb\x15\x90\xff\xff\xff\xff\xa0\x86*\xa0\xff\xff\xff\xff\xa1\x9a\xf7\x90\xff\xff\xff\xff\xa8FL \xff" +
-	"\xff\xff\xffˉ\f\x90\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2a\x18\x00\xff\xff\xff\xff\xfa\xf8u\x10\xff\xff\xff\xff\xfb\xe8X\x00\xff\xff\xff\xff\xfc\xd8W\x10\xff\xff\xff\xff\xfd\xc8:\x00\xff\xff\xff\xff\xfe" +
-	"\xb89\x10\xff\xff\xff\xff\xff\xa8\x1c\x00\x00\x00\x00\x00\x00\x98\x1b\x10\x00\x00\x00\x00\x01\x87\xfe\x00\x00\x00\x00\x00\x02w\xfd\x10\x00\x00\x00\x00\x03q\x1a\x80\x00\x00\x00\x00\x04a\x19\x90\x00\x00\x00\x00\x05P\xfc\x80\x00" +
-	"\x00\x00\x00\x06@\xfb\x90\x00\x00\x00\x00\a0ހ\x00\x00\x00\x00\a\xb2\x1f\x90\x00\x00\x00\x00\t\x10\xc0\x80\x00\x00\x00\x00\t\xad\xb1\x10\x00\x00\x00\x00\n\xf0\xa2\x80\x00\x00\x00\x00\vࡐ\x00\x00\x00\x00\f" +
-	"ٿ\x00\x00\x00\x00\x00\r\xc0\x83\x90\x00\x00\x00\x00\x0e\xb9\xa1\x00\x00\x00\x00\x00\x0f\xa9\xa0\x10\x00\x00\x00\x00\x10\x99\x83\x00\x00\x00\x00\x00\x11\x89\x82\x10\x00\x00\x00\x00\x12ye\x00\x00\x00\x00\x00\x13id\x10\x00" +
-	"\x00\x00\x00\x14YG\x00\x00\x00\x00\x00\x15IF\x10\x00\x00\x00\x00\x169)\x00\x00\x00\x00\x00\x17)(\x10\x00\x00\x00\x00\x18\"E\x80\x00\x00\x00\x00\x19\t\n\x10\x00\x00\x00\x00\x1a\x02'\x80\x00\x00\x00\x00\x1a" +
-	"\xf2&\x90\x00\x00\x00\x00\x1b\xe2\t\x80\x00\x00\x00\x00\x1c\xd2\b\x90\x00\x00\x00\x00\x1d\xc1\xeb\x80\x00\x00\x00\x00\x1e\xb1\xea\x90\x00\x00\x00\x00\x1f\xa1̀\x00\x00\x00\x00 v\x1d\x10\x00\x00\x00\x00!\x81\xaf\x80\x00" +
-	"\x00\x00\x00\"U\xff\x10\x00\x00\x00\x00#j\xcc\x00\x00\x00\x00\x00$5\xe1\x10\x00\x00\x00\x00%J\xae\x00\x00\x00\x00\x00&\x15\xc3\x10\x00\x00\x00\x00'*\x90\x00\x00\x00\x00\x00'\xfeߐ\x00\x00\x00\x00)" +
-	"\nr\x00\x00\x00\x00\x00)\xde\xc1\x90\x00\x00\x00\x00*\xeaT\x00\x00\x00\x00\x00+\xbe\xa3\x90\x00\x00\x00\x00,\xd3p\x80\x00\x00\x00\x00-\x9e\x85\x90\x00\x00\x00\x00.\xb3R\x80\x00\x00\x00\x00/~g\x90\x00" +
-	"\x00\x00\x000\x934\x80\x00\x00\x00\x001g\x84\x10\x00\x00\x00\x002s\x16\x80\x00\x00\x00\x003Gf\x10\x00\x00\x00\x004R\xf8\x80\x00\x00\x00\x005'H\x10\x00\x00\x00\x0062ڀ\x00\x00\x00\x007" +
-	"\a*\x10\x00\x00\x00\x008\x1b\xf7\x00\x00\x00\x00\x008\xe7\f\x10\x00\x00\x00\x009\xfb\xd9\x00\x00\x00\x00\x00:\xc6\xee\x10\x00\x00\x00\x00;ۻ\x00\x00\x00\x00\x00<\xb0\n\x90\x00\x00\x00\x00=\xbb\x9d\x00\x00" +
-	"\x00\x00\x00>\x8f\xec\x90\x00\x00\x00\x00?\x9b\x7f\x00\x00\x00\x00\x00@oΐ\x00\x00\x00\x00A\x84\x9b\x80\x00\x00\x00\x00BO\xb0\x90\x00\x00\x00\x00Cd}\x80\x00\x00\x00\x00D/\x92\x90\x00\x00\x00\x00E" +
-	"D_\x80\x00\x00\x00\x00E\xf3\xc5\x10\x02\x01\x02\x01\x02\x05\x03\x04\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05" +
-	"\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\xff\xff\x93\x0f\x00\x00\xff\xff\x9d\x90\x01\x04\xff\xff\x8f\x80\x00\b\xff" +
-	"\xff\xab\xa0\x01\f\xff\xff\xab\xa0\x01\x10\xff\xff\x9d\x90\x00\x14\xff\xff\xab\xa0\x01\x18LMT\x00PDT\x00PST\x00MWT\x00MPT\x00MST\x00MDT\x00\nMST7MDT," +
-	"M3.2.0,M11.1.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\xbf\xf5\xe5\xc4\x02\x00\x00\xc4\x02\x00\x00\x14\x00\x00\x00America/Buenos_" +
-	"AiresTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif" +
-	"2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00=\x00\x00\x00\x06\x00\x00\x00\x14\xff\xff\xff\xffr\x9c\xa8L\xff\xff\xff\xff\xa2\x92\x8f0\xff\xff\xff\xff" +
-	"\xb6{R@\xff\xff\xff\xff\xb7\x1aɰ\xff\xff\xff\xff\xb8\x1e\x8f@\xff\xff\xff\xff\xb8\xd4p0\xff\xff\xff\xff\xba\x17}\xc0\xff\xff\xff\xff\xba\xb5\xa3\xb0\xff\xff\xff\xff\xbb\xf8\xb1@\xff\xff\xff\xff\xbc\x96\xd70" +
-	"\xff\xff\xff\xff\xbd\xd9\xe4\xc0\xff\xff\xff\xff\xbex\n\xb0\xff\xff\xff\xff\xbf\xbb\x18@\xff\xff\xff\xff\xc0Z\x8f\xb0\xff\xff\xff\xff\xc1\x9d\x9d@\xff\xff\xff\xff\xc2;\xc30\xff\xff\xff\xff\xc3~\xd0\xc0\xff\xff\xff\xff" +
-	"\xc4\x1c\xf6\xb0\xff\xff\xff\xff\xc5`\x04@\xff\xff\xff\xff\xc5\xfe*0\xff\xff\xff\xff\xc7A7\xc0\xff\xff\xff\xff\xc7\xe0\xaf0\xff\xff\xff\xffȁ\x94@\xff\xff\xff\xff\xcaM\xa1\xb0\xff\xff\xff\xff\xca\xee\x86\xc0" +
-	"\xff\xff\xff\xff\xceM\xff0\xff\xff\xff\xffΰ\xed\xc0\xff\xff\xff\xff\xd3)5\xb0\xff\xff\xff\xff\xd4Cd\xc0\xff\xff\xff\xff\xf4=\b0\xff\xff\xff\xff\xf4\x9f\xf6\xc0\xff\xff\xff\xff\xf5\x05l0\xff\xff\xff\xff" +
-	"\xf62\x10@\xff\xff\xff\xff\xf6柰\xff\xff\xff\xff\xf8\x13C\xc0\xff\xff\xff\xff\xf8\xc7\xd30\xff\xff\xff\xff\xf9\xf4w@\xff\xff\xff\xff\xfa\xd36\xb0\xff\xff\xff\xff\xfb\xc35\xc0\xff\xff\xff\xff\xfc\xbcS0" +
-	"\xff\xff\xff\xff\xfd\xacR@\xff\xff\xff\xff\xfe\x9c50\xff\xff\xff\xff\xff\x8c4@\x00\x00\x00\x00\a\xa3J\xb0\x00\x00\x00\x00\b$o\xa0\x00\x00\x00\x00#\x94\xb5\xb0\x00\x00\x00\x00$\x10\x94\xa0\x00\x00\x00\x00" +
-	"%7\xf2\xb0\x00\x00\x00\x00%\xf0v\xa0\x00\x00\x00\x00'!\x0f0\x00\x00\x00\x00'\xd0X\xa0\x00\x00\x00\x00)\x00\xf10\x00\x00\x00\x00)\xb0:\xa0\x00\x00\x00\x00*\xe0\xd30\x00\x00\x00\x00+\x99W " +
-	"\x00\x00\x00\x007\xf6ư\x00\x00\x00\x008\xbf*\xb0\x00\x00\x00\x00Gw\t\xb0\x00\x00\x00\x00G\xdc\x7f \x00\x00\x00\x00H\xfa\xa2\xb0\x00\x00\x00\x00I\xbca \x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02" +
-	"\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x03\x05\x04\x05\x04\x05\xff\xff\xc94\x00\x00\xff\xff\xc3\xd0\x00" +
-	"\x04\xff\xff\xc7\xc0\x00\b\xff\xff\xd5\xd0\x01\f\xff\xff\xe3\xe0\x01\x10\xff\xff\xd5\xd0\x00\fLMT\x00CMT\x00-04\x00-03\x00-02\x00\n<-03>3\nPK\x03\x04\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x05\xba\xb2\x94s\x03\x00\x00s\x03\x00\x00\x15\x00\x00\x00America/Cambridge_BayTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00L\x00\x00\x00\b\x00\x00\x00 \xff\xff\xff\xff\xa1\xf2̀\xff\xff\xff\xffˉ\f\x90\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2a\x18\x00\x00\x00\x00\x00\x04a\x19\x90\x00" +
-	"\x00\x00\x00\x05P\xfc\x80\x00\x00\x00\x00\x06@\xfb\x90\x00\x00\x00\x00\a0ހ\x00\x00\x00\x00\b ݐ\x00\x00\x00\x00\t\x10\xc0\x80\x00\x00\x00\x00\n\x00\xbf\x90\x00\x00\x00\x00\n\xf0\xa2\x80\x00\x00\x00\x00\v" +
-	"ࡐ\x00\x00\x00\x00\fٿ\x00\x00\x00\x00\x00\r\xc0\x83\x90\x00\x00\x00\x00\x0e\xb9\xa1\x00\x00\x00\x00\x00\x0f\xa9\xa0\x10\x00\x00\x00\x00\x10\x99\x83\x00\x00\x00\x00\x00\x11\x89\x82\x10\x00\x00\x00\x00\x12ye\x00\x00" +
-	"\x00\x00\x00\x13id\x10\x00\x00\x00\x00\x14YG\x00\x00\x00\x00\x00\x15IF\x10\x00\x00\x00\x00\x169)\x00\x00\x00\x00\x00\x17)(\x10\x00\x00\x00\x00\x18\"E\x80\x00\x00\x00\x00\x19\t\n\x10\x00\x00\x00\x00\x1a" +
-	"\x02'\x80\x00\x00\x00\x00\x1a\xf2&\x90\x00\x00\x00\x00\x1b\xe2\t\x80\x00\x00\x00\x00\x1c\xd2\b\x90\x00\x00\x00\x00\x1d\xc1\xeb\x80\x00\x00\x00\x00\x1e\xb1\xea\x90\x00\x00\x00\x00\x1f\xa1̀\x00\x00\x00\x00 v\x1d\x10\x00" +
-	"\x00\x00\x00!\x81\xaf\x80\x00\x00\x00\x00\"U\xff\x10\x00\x00\x00\x00#j\xcc\x00\x00\x00\x00\x00$5\xe1\x10\x00\x00\x00\x00%J\xae\x00\x00\x00\x00\x00&\x15\xc3\x10\x00\x00\x00\x00'*\x90\x00\x00\x00\x00\x00'" +
-	"\xfeߐ\x00\x00\x00\x00)\nr\x00\x00\x00\x00\x00)\xde\xc1\x90\x00\x00\x00\x00*\xeaT\x00\x00\x00\x00\x00+\xbe\xa3\x90\x00\x00\x00\x00,\xd3p\x80\x00\x00\x00\x00-\x9e\x85\x90\x00\x00\x00\x00.\xb3R\x80\x00" +
-	"\x00\x00\x00/~g\x90\x00\x00\x00\x000\x934\x80\x00\x00\x00\x001g\x84\x10\x00\x00\x00\x002s\x16\x80\x00\x00\x00\x003Gf\x10\x00\x00\x00\x004R\xf8\x80\x00\x00\x00\x005'H\x10\x00\x00\x00\x006" +
-	"2ڀ\x00\x00\x00\x007\a*\x10\x00\x00\x00\x008\x1b\xf7\x00\x00\x00\x00\x008\xe6\xfe\x00\x00\x00\x00\x009\xfb\xca\xf0\x00\x00\x00\x00:\x04\xe9P\x00\x00\x00\x00:\xc6\xee\x10\x00\x00\x00\x00;ۻ\x00\x00" +
-	"\x00\x00\x00<\xb0\n\x90\x00\x00\x00\x00=\xbb\x9d\x00\x00\x00\x00\x00>\x8f\xec\x90\x00\x00\x00\x00?\x9b\x7f\x00\x00\x00\x00\x00@oΐ\x00\x00\x00\x00A\x84\x9b\x80\x00\x00\x00\x00BO\xb0\x90\x00\x00\x00\x00C" +
-	"d}\x80\x00\x00\x00\x00D/\x92\x90\x00\x00\x00\x00ED_\x80\x00\x00\x00\x00E\xf3\xc5\x10\x03\x01\x02\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04" +
-	"\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x06\x05\a\x06\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x00\x00\x00\x00\x00\x00\xff\xff\xab\xa0\x01\x04\xff\xff\xab\xa0\x01" +
-	"\b\xff\xff\x9d\x90\x00\f\xff\xff\xab\xa0\x01\x10\xff\xff\xb9\xb0\x01\x14\xff\xff\xab\xa0\x00\x18\xff\xff\xb9\xb0\x00\x1c-00\x00MWT\x00MPT\x00MST\x00MDT\x00CDT\x00CST\x00E" +
-	"ST\x00\nMST7MDT,M3.2.0,M11.1.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1e\xfbn۸\x03\x00\x00\xb8\x03\x00\x00\x14\x00\x00\x00Ame" +
-	"rica/Campo_GrandeTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" +
-	"\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00[\x00\x00\x00\x03\x00\x00\x00\f\xff\xff\xff\xff\x96\xaaz4" +
-	"\xff\xff\xff\xff\xb8\x0fW\xf0\xff\xff\xff\xff\xb8\xfdN\xb0\xff\xff\xff\xff\xb9\xf1B@\xff\xff\xff\xff\xbaނ0\xff\xff\xff\xff\xda8\xbc@\xff\xff\xff\xff\xda\xec\b@\xff\xff\xff\xff\xdc\x19\xef\xc0\xff\xff\xff\xff" +
-	"ܹg0\xff\xff\xff\xff\xdd\xfb#@\xff\xff\xff\xffޛ\xec0\xff\xff\xff\xff\xdfݨ@\xff\xff\xff\xff\xe0TA0\xff\xff\xff\xff\xf4\x98\r\xc0\xff\xff\xff\xff\xf5\x05l0\xff\xff\xff\xff\xf6\xc0r@" +
-	"\xff\xff\xff\xff\xf7\x0e,\xb0\xff\xff\xff\xff\xf8Q:@\xff\xff\xff\xff\xf8\xc7\xd30\xff\xff\xff\xff\xfa\n\xe0\xc0\xff\xff\xff\xff\xfa\xa9\x06\xb0\xff\xff\xff\xff\xfb\xec\x14@\xff\xff\xff\xff\xfc\x8b\x8b\xb0\x00\x00\x00\x00" +
-	"\x1dɜ@\x00\x00\x00\x00\x1ex\xe5\xb0\x00\x00\x00\x00\x1f\xa0C\xc0\x00\x00\x00\x00 3ݰ\x00\x00\x00\x00!\x81w@\x00\x00\x00\x00\"\vְ\x00\x00\x00\x00#X\x1e\xc0\x00\x00\x00\x00#\xe2~0" +
-	"\x00\x00\x00\x00%8\x00\xc0\x00\x00\x00\x00%\xd4\xd50\x00\x00\x00\x00'!\x1d@\x00\x00\x00\x00'\xbd\xf1\xb0\x00\x00\x00\x00)\x00\xff@\x00\x00\x00\x00)\x94\x990\x00\x00\x00\x00*\xea\x1b\xc0\x00\x00\x00\x00" +
-	"+k@\xb0\x00\x00\x00\x00,\xc0\xc3@\x00\x00\x00\x00-f\xd20\x00\x00\x00\x00.\xa0\xa5@\x00\x00\x00\x00/F\xb40\x00\x00\x00\x000\x80\x87@\x00\x00\x00\x001\x1d[\xb0\x00\x00\x00\x002W.\xc0" +
-	"\x00\x00\x00\x003\x06x0\x00\x00\x00\x0048b@\x00\x00\x00\x004\xf8\xcf0\x00\x00\x00\x006 -@\x00\x00\x00\x006\xcfv\xb0\x00\x00\x00\x007\xf6\xd4\xc0\x00\x00\x00\x008\xb8\x930\x00\x00\x00\x00" +
-	"9\xdf\xf1@\x00\x00\x00\x00:\x8f:\xb0\x00\x00\x00\x00;\xc9\r\xc0\x00\x00\x00\x00<o\x1c\xb0\x00\x00\x00\x00=ğ@\x00\x00\x00\x00>N\xfe\xb0\x00\x00\x00\x00?\x92\f@\x00\x00\x00\x00@.\xe0\xb0" +
-	"\x00\x00\x00\x00A\x87\x06@\x00\x00\x00\x00B\x17\xfd0\x00\x00\x00\x00CQ\xd0@\x00\x00\x00\x00C\xf7\xdf0\x00\x00\x00\x00EMa\xc0\x00\x00\x00\x00E\xe0\xfb\xb0\x00\x00\x00\x00G\x11\x94@\x00\x00\x00\x00" +
-	"G\xb7\xa30\x00\x00\x00\x00H\xfa\xb0\xc0\x00\x00\x00\x00I\x97\x850\x00\x00\x00\x00Jڒ\xc0\x00\x00\x00\x00K\x80\xa1\xb0\x00\x00\x00\x00L\xbat\xc0\x00\x00\x00\x00M`\x83\xb0\x00\x00\x00\x00N\x9aV\xc0" +
-	"\x00\x00\x00\x00OI\xa00\x00\x00\x00\x00P\x83s@\x00\x00\x00\x00Q G\xb0\x00\x00\x00\x00RcU@\x00\x00\x00\x00S\x00)\xb0\x00\x00\x00\x00TC7@\x00\x00\x00\x00T\xe9F0\x00\x00\x00\x00" +
-	"V#\x19@\x00\x00\x00\x00V\xc9(0\x00\x00\x00\x00X\x02\xfb@\x00\x00\x00\x00X\xa9\n0\x00\x00\x00\x00Y\xe2\xdd@\x00\x00\x00\x00Z\x88\xec0\x00\x00\x00\x00[\xden\xc0\x00\x00\x00\x00\\h\xce0" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\xff\xff\xcc\xcc\x00\x00\xff\xff\xd5\xd0\x01\x04\xff\xff\xc7\xc0\x00\bLMT\x00-03\x00-04" +
-	"\x00\n<-04>4\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf2\x04\xde\xdd\x11\x02\x00\x00\x11\x02\x00\x00\x0e\x00\x00\x00America/CancunTZif2\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00*\x00\x00\x00\x05\x00\x00\x00\x14\xff\xff\xff\xff\xa5\xb6\xda`\x00\x00\x00\x00\x16\x86\xd5`\x00\x00\x00\x001gg\xf0\x00\x00\x00\x002r\xfa`" +
-	"\x00\x00\x00\x003GI\xf0\x00\x00\x00\x004R\xdc`\x00\x00\x00\x005'+\xf0\x00\x00\x00\x005\xc4\x00`\x00\x00\x00\x0062\xccp\x00\x00\x00\x007\a\x1c\x00\x00\x00\x00\x008\x1b\xe8\xf0\x00\x00\x00\x00" +
-	"8\xe6\xfe\x00\x00\x00\x00\x009\xfb\xca\xf0\x00\x00\x00\x00:\xf5\x04\x80\x00\x00\x00\x00;\xb6\xc2\xf0\x00\x00\x00\x00<\xaf\xfc\x80\x00\x00\x00\x00=\xbb\x8e\xf0\x00\x00\x00\x00>\x8fހ\x00\x00\x00\x00?\x9bp\xf0" +
-	"\x00\x00\x00\x00@o\xc0\x80\x00\x00\x00\x00A\x84\x8dp\x00\x00\x00\x00BO\xa2\x80\x00\x00\x00\x00Cdop\x00\x00\x00\x00D/\x84\x80\x00\x00\x00\x00EDQp\x00\x00\x00\x00F\x0ff\x80\x00\x00\x00\x00" +
-	"G$3p\x00\x00\x00\x00G\xf8\x83\x00\x00\x00\x00\x00I\x04\x15p\x00\x00\x00\x00I\xd8e\x00\x00\x00\x00\x00J\xe3\xf7p\x00\x00\x00\x00K\xb8G\x00\x00\x00\x00\x00L\xcd\x13\xf0\x00\x00\x00\x00M\x98)\x00" +
-	"\x00\x00\x00\x00N\xac\xf5\xf0\x00\x00\x00\x00Ox\v\x00\x00\x00\x00\x00P\x8c\xd7\xf0\x00\x00\x00\x00Qa'\x80\x00\x00\x00\x00Rl\xb9\xf0\x00\x00\x00\x00SA\t\x80\x00\x00\x00\x00TL\x9b\xf0\x00\x00\x00\x00" +
-	"T\xcd\xdd\x00\x01\x03\x02\x03\x02\x03\x02\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x03\xff\xff\xae\xa8\x00\x00\xff\xff\xab\xa0\x00\x04\xff\xff" +
-	"\xc7\xc0\x01\b\xff\xff\xb9\xb0\x00\f\xff\xff\xb9\xb0\x01\x10LMT\x00CST\x00EDT\x00EST\x00CDT\x00\nEST5\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xac\x8e\xee\x13" +
-	"\xbe\x00\x00\x00\xbe\x00\x00\x00\x0f\x00\x00\x00America/CaracasTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x04\x00\x00" +
-	"\x00\x12\xff\xff\xff\xffi\x87\x1a@\xff\xff\xff\xff\x93\x1e,<\xff\xff\xff\xff\xf6\x98\xecH\x00\x00\x00\x00G[\x92p\x00\x00\x00\x00W%\xa9p\x01\x02\x03\x02\x03\xff\xff\xc1@\x00\x00\xff\xff\xc1D\x00\x04\xff" +
-	"\xff\xc0\xb8\x00\b\xff\xff\xc7\xc0\x00\x0eLMT\x00CMT\x00-0430\x00-04\x00\n<-04>4\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00R\xc8\xd9\xf6\xc4\x02\x00\x00\xc4" +
-	"\x02\x00\x00\x11\x00\x00\x00America/CatamarcaTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00=\x00\x00\x00\x06\x00\x00\x00\x14\xff" +
-	"\xff\xff\xffr\x9c\xaf,\xff\xff\xff\xff\xa2\x92\x8f0\xff\xff\xff\xff\xb6{R@\xff\xff\xff\xff\xb7\x1aɰ\xff\xff\xff\xff\xb8\x1e\x8f@\xff\xff\xff\xff\xb8\xd4p0\xff\xff\xff\xff\xba\x17}\xc0\xff\xff\xff\xff\xba" +
-	"\xb5\xa3\xb0\xff\xff\xff\xff\xbb\xf8\xb1@\xff\xff\xff\xff\xbc\x96\xd70\xff\xff\xff\xff\xbd\xd9\xe4\xc0\xff\xff\xff\xff\xbex\n\xb0\xff\xff\xff\xff\xbf\xbb\x18@\xff\xff\xff\xff\xc0Z\x8f\xb0\xff\xff\xff\xff\xc1\x9d\x9d@\xff" +
-	"\xff\xff\xff\xc2;\xc30\xff\xff\xff\xff\xc3~\xd0\xc0\xff\xff\xff\xff\xc4\x1c\xf6\xb0\xff\xff\xff\xff\xc5`\x04@\xff\xff\xff\xff\xc5\xfe*0\xff\xff\xff\xff\xc7A7\xc0\xff\xff\xff\xff\xc7\xe0\xaf0\xff\xff\xff\xff\xc8" +
-	"\x81\x94@\xff\xff\xff\xff\xcaM\xa1\xb0\xff\xff\xff\xff\xca\xee\x86\xc0\xff\xff\xff\xff\xceM\xff0\xff\xff\xff\xffΰ\xed\xc0\xff\xff\xff\xff\xd3)5\xb0\xff\xff\xff\xff\xd4Cd\xc0\xff\xff\xff\xff\xf4=\b0\xff" +
-	"\xff\xff\xff\xf4\x9f\xf6\xc0\xff\xff\xff\xff\xf5\x05l0\xff\xff\xff\xff\xf62\x10@\xff\xff\xff\xff\xf6柰\xff\xff\xff\xff\xf8\x13C\xc0\xff\xff\xff\xff\xf8\xc7\xd30\xff\xff\xff\xff\xf9\xf4w@\xff\xff\xff\xff\xfa" +
-	"\xd36\xb0\xff\xff\xff\xff\xfb\xc35\xc0\xff\xff\xff\xff\xfc\xbcS0\xff\xff\xff\xff\xfd\xacR@\xff\xff\xff\xff\xfe\x9c50\xff\xff\xff\xff\xff\x8c4@\x00\x00\x00\x00\a\xa3J\xb0\x00\x00\x00\x00\b$o\xa0\x00" +
-	"\x00\x00\x00#\x94\xb5\xb0\x00\x00\x00\x00$\x10\x94\xa0\x00\x00\x00\x00%7\xf2\xb0\x00\x00\x00\x00%\xf0v\xa0\x00\x00\x00\x00'!\x0f0\x00\x00\x00\x00'\xd0X\xa0\x00\x00\x00\x00)\x00\xff@\x00\x00\x00\x00)" +
-	"\xb0:\xa0\x00\x00\x00\x00*\xe0\xd30\x00\x00\x00\x00+\x99W \x00\x00\x00\x007\xf6ư\x00\x00\x00\x008\xbf*\xb0\x00\x00\x00\x00@\xbb\xf10\x00\x00\x00\x00@\xd5\v\xc0\x00\x00\x00\x00Gw\t\xb0\x00" +
-	"\x00\x00\x00G\xdc\x7f \x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x05\x04\x05\x04\x05\x04\x05\x04\x02\x04\x05" +
-	"\x04\x05\x03\x05\x02\x05\x04\x05\xff\xff\xc2T\x00\x00\xff\xff\xc3\xd0\x00\x04\xff\xff\xc7\xc0\x00\b\xff\xff\xd5\xd0\x01\f\xff\xff\xe3\xe0\x01\x10\xff\xff\xd5\xd0\x00\fLMT\x00CMT\x00-04\x00-03\x00" +
-	"-02\x00\n<-03>3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa1'\a\xbd\x97\x00\x00\x00\x97\x00\x00\x00\x0f\x00\x00\x00America/CayenneTZi" +
-	"f2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\f\xff\xff\xff\xff\x91\xf4+\x90\xff\xff\xff\xff\xfb\xc35\xc0\x01\x02\xff\xff\xce\xf0\x00\x00\xff\xff\xc7\xc0" +
-	"\x00\x04\xff\xff\xd5\xd0\x00\bLMT\x00-04\x00-03\x00\n<-03>3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Ծ\xe7#\x95\x00\x00\x00\x95\x00\x00\x00\x0e\x00\x00\x00Am" +
-	"erica/CaymanTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00" +
-	"\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\f\xff\xff\xff\xffi\x87&\x10\xff\xff\xff\xff\x8b" +
-	"\xf4a\xe8\x01\x02\xff\xff\xb5p\x00\x00\xff\xff\xb5\x18\x00\x04\xff\xff\xb9\xb0\x00\bLMT\x00CMT\x00EST\x00\nEST5\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9bܩ=\xda" +
-	"\x06\x00\x00\xda\x06\x00\x00\x0f\x00\x00\x00America/ChicagoTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaf\x00\x00\x00\x06\x00\x00\x00" +
-	"\x18\xff\xff\xff\xff^\x03\xfe\xa0\xff\xff\xff\xff\x9e\xa6,\x80\xff\xff\xff\xff\x9f\xba\xf9p\xff\xff\xff\xff\xa0\x86\x0e\x80\xff\xff\xff\xff\xa1\x9a\xdbp\xff\xff\xff\xff\xa2\xcbt\x00\xff\xff\xff\xff\xa3\x83\xf7\xf0\xff\xff\xff" +
-	"\xff\xa4EҀ\xff\xff\xff\xff\xa5c\xd9\xf0\xff\xff\xff\xff\xa6S\xd9\x00\xff\xff\xff\xff\xa7\x15\x97p\xff\xff\xff\xff\xa83\xbb\x00\xff\xff\xff\xff\xa8\xfe\xb3\xf0\xff\xff\xff\xff\xaa\x13\x9d\x00\xff\xff\xff\xff\xaaޕ" +
-	"\xf0\xff\xff\xff\xff\xab\xf3\x7f\x00\xff\xff\xff\xff\xac\xbew\xf0\xff\xff\xff\xff\xad\xd3a\x00\xff\xff\xff\xff\xae\x9eY\xf0\xff\xff\xff\xff\xaf\xb3C\x00\xff\xff\xff\xff\xb0~;\xf0\xff\xff\xff\xff\xb1\x9c_\x80\xff\xff\xff" +
-	"\xff\xb2gXp\xff\xff\xff\xff\xb3|A\x80\xff\xff\xff\xff\xb4G:p\xff\xff\xff\xff\xb5\\#\x80\xff\xff\xff\xff\xb6'\x1cp\xff\xff\xff\xff\xb7<\x05\x80\xff\xff\xff\xff\xb8\x06\xfep\xff\xff\xff\xff\xb9\x1b\xe7" +
-	"\x80\xff\xff\xff\xff\xb9\xe6\xe0p\xff\xff\xff\xff\xbb\x05\x04\x00\xff\xff\xff\xff\xbb\xc6\xc2p\xff\xff\xff\xff\xbc\xe4\xe6\x00\xff\xff\xff\xff\xbd\xaf\xde\xf0\xff\xff\xff\xff\xbe\xc4\xc8\x00\xff\xff\xff\xff\xbf\x8f\xc0\xf0\xff\xff\xff" +
-	"\xff\xc0Z\xd6\x00\xff\xff\xff\xff\xc1\xb0<p\xff\xff\xff\xff\u0084\x8c\x00\xff\xff\xff\xff\xc3O\x84\xf0\xff\xff\xff\xff\xc4dn\x00\xff\xff\xff\xff\xc5/f\xf0\xff\xff\xff\xff\xc6M\x8a\x80\xff\xff\xff\xff\xc7\x0fH" +
-	"\xf0\xff\xff\xff\xff\xc8-l\x80\xff\xff\xff\xff\xc8\xf8ep\xff\xff\xff\xff\xca\rN\x80\xff\xff\xff\xff\xca\xd8Gp\xff\xff\xff\xffˈ\xfe\x80\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2a\t\xf0\xff\xff\xff" +
-	"\xff\xd3u\xf3\x00\xff\xff\xff\xff\xd4@\xeb\xf0\xff\xff\xff\xff\xd5U\xd5\x00\xff\xff\xff\xff\xd6 \xcd\xf0\xff\xff\xff\xff\xd75\xb7\x00\xff\xff\xff\xff\xd8\x00\xaf\xf0\xff\xff\xff\xff\xd9\x15\x99\x00\xff\xff\xff\xff\xd9\xe0\x91" +
-	"\xf0\xff\xff\xff\xff\xda\xfe\xb5\x80\xff\xff\xff\xff\xdb\xc0s\xf0\xff\xff\xff\xff\xdcޗ\x80\xff\xff\xff\xffݩ\x90p\xff\xff\xff\xff\u07bey\x80\xff\xff\xff\xff߉rp\xff\xff\xff\xff\xe0\x9e[\x80\xff\xff\xff" +
-	"\xff\xe1iTp\xff\xff\xff\xff\xe2~=\x80\xff\xff\xff\xff\xe3I6p\xff\xff\xff\xff\xe4^\x1f\x80\xff\xff\xff\xff\xe5W<\xf0\xff\xff\xff\xff\xe6G<\x00\xff\xff\xff\xff\xe77\x1e\xf0\xff\xff\xff\xff\xe8'\x1e" +
-	"\x00\xff\xff\xff\xff\xe9\x17\x00\xf0\xff\xff\xff\xff\xea\a\x00\x00\xff\xff\xff\xff\xea\xf6\xe2\xf0\xff\xff\xff\xff\xeb\xe6\xe2\x00\xff\xff\xff\xff\xec\xd6\xc4\xf0\xff\xff\xff\xff\xed\xc6\xc4\x00\xff\xff\xff\xff\xee\xbf\xe1p\xff\xff\xff" +
-	"\xff\xef\xaf\xe0\x80\xff\xff\xff\xff\xf0\x9f\xc3p\xff\xff\xff\xff\xf1\x8f\u0080\xff\xff\xff\xff\xf2\x7f\xa5p\xff\xff\xff\xff\xf3o\xa4\x80\xff\xff\xff\xff\xf4_\x87p\xff\xff\xff\xff\xf5O\x86\x80\xff\xff\xff\xff\xf6?i" +
-	"p\xff\xff\xff\xff\xf7/h\x80\xff\xff\xff\xff\xf8(\x85\xf0\xff\xff\xff\xff\xf9\x0fJ\x80\xff\xff\xff\xff\xfa\bg\xf0\xff\xff\xff\xff\xfa\xf8g\x00\xff\xff\xff\xff\xfb\xe8I\xf0\xff\xff\xff\xff\xfc\xd8I\x00\xff\xff\xff" +
-	"\xff\xfd\xc8+\xf0\xff\xff\xff\xff\xfe\xb8+\x00\xff\xff\xff\xff\xff\xa8\r\xf0\x00\x00\x00\x00\x00\x98\r\x00\x00\x00\x00\x00\x01\x87\xef\xf0\x00\x00\x00\x00\x02w\xef\x00\x00\x00\x00\x00\x03q\fp\x00\x00\x00\x00\x04a\v" +
-	"\x80\x00\x00\x00\x00\x05P\xeep\x00\x00\x00\x00\x06@\xed\x80\x00\x00\x00\x00\a0\xd0p\x00\x00\x00\x00\a\x8d'\x80\x00\x00\x00\x00\t\x10\xb2p\x00\x00\x00\x00\t\xad\xa3\x00\x00\x00\x00\x00\n\xf0\x94p\x00\x00\x00" +
-	"\x00\v\xe0\x93\x80\x00\x00\x00\x00\fٰ\xf0\x00\x00\x00\x00\r\xc0u\x80\x00\x00\x00\x00\x0e\xb9\x92\xf0\x00\x00\x00\x00\x0f\xa9\x92\x00\x00\x00\x00\x00\x10\x99t\xf0\x00\x00\x00\x00\x11\x89t\x00\x00\x00\x00\x00\x12yV" +
-	"\xf0\x00\x00\x00\x00\x13iV\x00\x00\x00\x00\x00\x14Y8\xf0\x00\x00\x00\x00\x15I8\x00\x00\x00\x00\x00\x169\x1a\xf0\x00\x00\x00\x00\x17)\x1a\x00\x00\x00\x00\x00\x18\"7p\x00\x00\x00\x00\x19\b\xfc\x00\x00\x00\x00" +
-	"\x00\x1a\x02\x19p\x00\x00\x00\x00\x1a\xf2\x18\x80\x00\x00\x00\x00\x1b\xe1\xfbp\x00\x00\x00\x00\x1c\xd1\xfa\x80\x00\x00\x00\x00\x1d\xc1\xddp\x00\x00\x00\x00\x1e\xb1܀\x00\x00\x00\x00\x1f\xa1\xbfp\x00\x00\x00\x00 v\x0f" +
-	"\x00\x00\x00\x00\x00!\x81\xa1p\x00\x00\x00\x00\"U\xf1\x00\x00\x00\x00\x00#j\xbd\xf0\x00\x00\x00\x00$5\xd3\x00\x00\x00\x00\x00%J\x9f\xf0\x00\x00\x00\x00&\x15\xb5\x00\x00\x00\x00\x00'*\x81\xf0\x00\x00\x00" +
-	"\x00'\xfeр\x00\x00\x00\x00)\nc\xf0\x00\x00\x00\x00)\u07b3\x80\x00\x00\x00\x00*\xeaE\xf0\x00\x00\x00\x00+\xbe\x95\x80\x00\x00\x00\x00,\xd3bp\x00\x00\x00\x00-\x9ew\x80\x00\x00\x00\x00.\xb3D" +
-	"p\x00\x00\x00\x00/~Y\x80\x00\x00\x00\x000\x93&p\x00\x00\x00\x001gv\x00\x00\x00\x00\x002s\bp\x00\x00\x00\x003GX\x00\x00\x00\x00\x004R\xeap\x00\x00\x00\x005':\x00\x00\x00\x00" +
-	"\x0062\xccp\x00\x00\x00\x007\a\x1c\x00\x00\x00\x00\x008\x1b\xe8\xf0\x00\x00\x00\x008\xe6\xfe\x00\x00\x00\x00\x009\xfb\xca\xf0\x00\x00\x00\x00:\xc6\xe0\x00\x00\x00\x00\x00;۬\xf0\x00\x00\x00\x00<\xaf\xfc" +
-	"\x80\x00\x00\x00\x00=\xbb\x8e\xf0\x00\x00\x00\x00>\x8fހ\x00\x00\x00\x00?\x9bp\xf0\x00\x00\x00\x00@o\xc0\x80\x00\x00\x00\x00A\x84\x8dp\x00\x00\x00\x00BO\xa2\x80\x00\x00\x00\x00Cdop\x00\x00\x00" +
-	"\x00D/\x84\x80\x00\x00\x00\x00EDQp\x00\x00\x00\x00E\xf3\xb7\x00\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x03\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x04\x05\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\xff\xff\xad\xd4\x00\x00\xff\xff\xb9\xb0\x01\x04\xff\xff\xab\xa0\x00\b\xff\xff\xb9\xb0\x00\f\xff\xff\xb9\xb0\x01\x10\xff\xff\xb9\xb0\x01\x14LMT\x00CDT\x00" +
-	"CST\x00EST\x00CWT\x00CPT\x00\nCST6CDT,M3.2.0,M11.1.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x111\x04q\xb3\x02" +
-	"\x00\x00\xb3\x02\x00\x00\x11\x00\x00\x00America/ChihuahuaTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00<\x00\x00\x00\x05\x00\x00" +
-	"\x00\x14\xff\xff\xff\xff\xa5\xb6\xe8p\xff\xff\xff\xff\xaf\xf2n\xe0\xff\xff\xff\xff\xb6fV`\xff\xff\xff\xff\xb7C\xd2`\xff\xff\xff\xff\xb8\f6`\xff\xff\xff\xff\xb8\xfd\x86\xf0\x00\x00\x00\x001gv\x00\x00\x00" +
-	"\x00\x002s\bp\x00\x00\x00\x003GX\x00\x00\x00\x00\x004R\xeap\x00\x00\x00\x005'H\x10\x00\x00\x00\x0062ڀ\x00\x00\x00\x007\a*\x10\x00\x00\x00\x008\x1b\xf7\x00\x00\x00\x00\x008\xe7" +
-	"\f\x10\x00\x00\x00\x009\xfb\xd9\x00\x00\x00\x00\x00:\xf5\x12\x90\x00\x00\x00\x00;\xb6\xd1\x00\x00\x00\x00\x00<\xb0\n\x90\x00\x00\x00\x00=\xbb\x9d\x00\x00\x00\x00\x00>\x8f\xec\x90\x00\x00\x00\x00?\x9b\x7f\x00\x00\x00" +
-	"\x00\x00@oΐ\x00\x00\x00\x00A\x84\x9b\x80\x00\x00\x00\x00BO\xb0\x90\x00\x00\x00\x00Cd}\x80\x00\x00\x00\x00D/\x92\x90\x00\x00\x00\x00ED_\x80\x00\x00\x00\x00F\x0ft\x90\x00\x00\x00\x00G$" +
-	"A\x80\x00\x00\x00\x00G\xf8\x91\x10\x00\x00\x00\x00I\x04#\x80\x00\x00\x00\x00I\xd8s\x10\x00\x00\x00\x00J\xe4\x05\x80\x00\x00\x00\x00K\xb8U\x10\x00\x00\x00\x00L\xcd\"\x00\x00\x00\x00\x00M\x987\x10\x00\x00" +
-	"\x00\x00N\xad\x04\x00\x00\x00\x00\x00Ox\x19\x10\x00\x00\x00\x00P\x8c\xe6\x00\x00\x00\x00\x00Qa5\x90\x00\x00\x00\x00Rl\xc8\x00\x00\x00\x00\x00SA\x17\x90\x00\x00\x00\x00TL\xaa\x00\x00\x00\x00\x00U " +
-	"\xf9\x90\x00\x00\x00\x00V,\x8c\x00\x00\x00\x00\x00W\x00ې\x00\x00\x00\x00X\x15\xa8\x80\x00\x00\x00\x00Xཐ\x00\x00\x00\x00Y\xf5\x8a\x80\x00\x00\x00\x00Z\xc0\x9f\x90\x00\x00\x00\x00[\xd5l\x80\x00\x00" +
-	"\x00\x00\\\xa9\xbc\x10\x00\x00\x00\x00]\xb5N\x80\x00\x00\x00\x00^\x89\x9e\x10\x00\x00\x00\x00_\x950\x80\x00\x00\x00\x00`i\x80\x10\x00\x00\x00\x00a~M\x00\x00\x00\x00\x00bIb\x10\x00\x00\x00\x00c^" +
-	"/\x00\x01\x02\x01\x03\x01\x02\x04\x02\x04\x02\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01" +
-	"\x03\x02\xff\xff\x9c\x8c\x00\x00\xff\xff\x9d\x90\x00\x04\xff\xff\xab\xa0\x00\b\xff\xff\xab\xa0\x01\f\xff\xff\xb9\xb0\x01\x10LMT\x00MST\x00CST\x00MDT\x00CDT\x00\nCST6\nPK" +
-	"\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xad\xf2L\x06\xce\x02\x00\x00\xce\x02\x00\x00\x15\x00\x00\x00America/Ciudad_JuarezTZif2\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00=\x00\x00\x00\x05\x00\x00\x00\x14\xff\xff\xff\xff\xa5\xb6\xe8p\xff\xff\xff\xff\xaf\xf2n\xe0\xff\xff\xff\xff\xb6fV`\xff\xff\xff\xff\xb7C\xd2`\xff\xff\xff\xff" +
-	"\xb8\f6`\xff\xff\xff\xff\xb8\xfd\x86\xf0\x00\x00\x00\x001gv\x00\x00\x00\x00\x002s\bp\x00\x00\x00\x003GX\x00\x00\x00\x00\x004R\xeap\x00\x00\x00\x005'H\x10\x00\x00\x00\x0062ڀ" +
-	"\x00\x00\x00\x007\a*\x10\x00\x00\x00\x008\x1b\xf7\x00\x00\x00\x00\x008\xe7\f\x10\x00\x00\x00\x009\xfb\xd9\x00\x00\x00\x00\x00:\xf5\x12\x90\x00\x00\x00\x00;\xb6\xd1\x00\x00\x00\x00\x00<\xb0\n\x90\x00\x00\x00\x00" +
-	"=\xbb\x9d\x00\x00\x00\x00\x00>\x8f\xec\x90\x00\x00\x00\x00?\x9b\x7f\x00\x00\x00\x00\x00@oΐ\x00\x00\x00\x00A\x84\x9b\x80\x00\x00\x00\x00BO\xb0\x90\x00\x00\x00\x00Cd}\x80\x00\x00\x00\x00D/\x92\x90" +
-	"\x00\x00\x00\x00ED_\x80\x00\x00\x00\x00F\x0ft\x90\x00\x00\x00\x00G$A\x80\x00\x00\x00\x00G\xf8\x91\x10\x00\x00\x00\x00I\x04#\x80\x00\x00\x00\x00I\xd8s\x10\x00\x00\x00\x00J\xe4\x05\x80\x00\x00\x00\x00" +
-	"K\x9c\xa5\x90\x00\x00\x00\x00L\xd6\\\x80\x00\x00\x00\x00M|\x87\x90\x00\x00\x00\x00N\xb6>\x80\x00\x00\x00\x00O\\i\x90\x00\x00\x00\x00P\x96 \x80\x00\x00\x00\x00Q<K\x90\x00\x00\x00\x00Rv\x02\x80" +
-	"\x00\x00\x00\x00S\x1c-\x90\x00\x00\x00\x00TU\xe4\x80\x00\x00\x00\x00T\xfc\x0f\x90\x00\x00\x00\x00V5ƀ\x00\x00\x00\x00V\xe5,\x10\x00\x00\x00\x00X\x1e\xe3\x00\x00\x00\x00\x00X\xc5\x0e\x10\x00\x00\x00\x00" +
-	"Y\xfe\xc5\x00\x00\x00\x00\x00Z\xa4\xf0\x10\x00\x00\x00\x00[ާ\x00\x00\x00\x00\x00\\\x84\xd2\x10\x00\x00\x00\x00]\xbe\x89\x00\x00\x00\x00\x00^d\xb4\x10\x00\x00\x00\x00_\x9ek\x00\x00\x00\x00\x00`MА" +
-	"\x00\x00\x00\x00a\x87\x87\x80\x00\x00\x00\x00b-\xb2\x90\x00\x00\x00\x00c^/\x00\x00\x00\x00\x00c\x86\xf1`\x01\x02\x01\x03\x01\x02\x04\x02\x04\x02\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01" +
-	"\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x02\x01\xff\xff\x9c,\x00\x00\xff\xff\x9d\x90\x00\x04\xff\xff\xab\xa0\x00\b\xff\xff\xab\xa0\x01\f\xff\xff\xb9" +
-	"\xb0\x01\x10LMT\x00MST\x00CST\x00MDT\x00CDT\x00\nMST7MDT,M3.2.0,M11.1.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00Ծ\xe7#\x95\x00\x00\x00\x95\x00\x00\x00\x15\x00\x00\x00America/Coral_HarbourTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\f\xff\xff\xff\xffi\x87&\x10\xff\xff\xff\xff\x8b\xf4a\xe8\x01\x02\xff\xff\xb5p\x00\x00\xff\xff\xb5\x18\x00\x04\xff\xff\xb9\xb0\x00\bLMT\x00CMT\x00EST" +
-	"\x00\nEST5\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xef\xf0R\x8a\xc4\x02\x00\x00\xc4\x02\x00\x00\x0f\x00\x00\x00America/CordobaTZif2\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00=\x00\x00\x00\x06\x00\x00\x00\x14\xff\xff\xff\xffr\x9c\xad\xb0\xff\xff\xff\xff\xa2\x92\x8f0\xff\xff\xff\xff\xb6{R@\xff\xff\xff\xff\xb7\x1aɰ\xff" +
-	"\xff\xff\xff\xb8\x1e\x8f@\xff\xff\xff\xff\xb8\xd4p0\xff\xff\xff\xff\xba\x17}\xc0\xff\xff\xff\xff\xba\xb5\xa3\xb0\xff\xff\xff\xff\xbb\xf8\xb1@\xff\xff\xff\xff\xbc\x96\xd70\xff\xff\xff\xff\xbd\xd9\xe4\xc0\xff\xff\xff\xff\xbe" +
-	"x\n\xb0\xff\xff\xff\xff\xbf\xbb\x18@\xff\xff\xff\xff\xc0Z\x8f\xb0\xff\xff\xff\xff\xc1\x9d\x9d@\xff\xff\xff\xff\xc2;\xc30\xff\xff\xff\xff\xc3~\xd0\xc0\xff\xff\xff\xff\xc4\x1c\xf6\xb0\xff\xff\xff\xff\xc5`\x04@\xff" +
-	"\xff\xff\xff\xc5\xfe*0\xff\xff\xff\xff\xc7A7\xc0\xff\xff\xff\xff\xc7\xe0\xaf0\xff\xff\xff\xffȁ\x94@\xff\xff\xff\xff\xcaM\xa1\xb0\xff\xff\xff\xff\xca\xee\x86\xc0\xff\xff\xff\xff\xceM\xff0\xff\xff\xff\xff\xce" +
-	"\xb0\xed\xc0\xff\xff\xff\xff\xd3)5\xb0\xff\xff\xff\xff\xd4Cd\xc0\xff\xff\xff\xff\xf4=\b0\xff\xff\xff\xff\xf4\x9f\xf6\xc0\xff\xff\xff\xff\xf5\x05l0\xff\xff\xff\xff\xf62\x10@\xff\xff\xff\xff\xf6柰\xff" +
-	"\xff\xff\xff\xf8\x13C\xc0\xff\xff\xff\xff\xf8\xc7\xd30\xff\xff\xff\xff\xf9\xf4w@\xff\xff\xff\xff\xfa\xd36\xb0\xff\xff\xff\xff\xfb\xc35\xc0\xff\xff\xff\xff\xfc\xbcS0\xff\xff\xff\xff\xfd\xacR@\xff\xff\xff\xff\xfe" +
-	"\x9c50\xff\xff\xff\xff\xff\x8c4@\x00\x00\x00\x00\a\xa3J\xb0\x00\x00\x00\x00\b$o\xa0\x00\x00\x00\x00#\x94\xb5\xb0\x00\x00\x00\x00$\x10\x94\xa0\x00\x00\x00\x00%7\xf2\xb0\x00\x00\x00\x00%\xf0v\xa0\x00" +
-	"\x00\x00\x00'!\x0f0\x00\x00\x00\x00'\xd0X\xa0\x00\x00\x00\x00)\x00\xff@\x00\x00\x00\x00)\xb0:\xa0\x00\x00\x00\x00*\xe0\xd30\x00\x00\x00\x00+\x99W \x00\x00\x00\x007\xf6ư\x00\x00\x00\x008" +
-	"\xbf*\xb0\x00\x00\x00\x00Gw\t\xb0\x00\x00\x00\x00G\xdc\x7f \x00\x00\x00\x00H\xfa\xa2\xb0\x00\x00\x00\x00I\xbca \x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03" +
-	"\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x05\x04\x05\x04\x05\x04\x05\x04\x02\x04\x05\x04\x05\x03\x05\x04\x05\x04\x05\xff\xff\xc3\xd0\x00\x00\xff\xff\xc3\xd0\x00\x04\xff\xff\xc7\xc0\x00\b\xff\xff\xd5\xd0\x01\f" +
-	"\xff\xff\xe3\xe0\x01\x10\xff\xff\xd5\xd0\x00\fLMT\x00CMT\x00-04\x00-03\x00-02\x00\n<-03>3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1݂x\xe8\x00" +
-	"\x00\x00\xe8\x00\x00\x00\x12\x00\x00\x00America/Costa_RicaTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00\x00\x00\x04\x00" +
-	"\x00\x00\x11\xff\xff\xff\xffi\x87*M\xff\xff\xff\xff\xa3\xe8\x16M\x00\x00\x00\x00\x116I`\x00\x00\x00\x00\x11\xb7nP\x00\x00\x00\x00\x13\x16+`\x00\x00\x00\x00\x13\x97PP\x00\x00\x00\x00'\x97\xe0`\x00" +
-	"\x00\x00\x00(n\xb6\xd0\x00\x00\x00\x00)w\xc2`\x00\x00\x00\x00)\xc2\xd9\xd0\x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\xff\xff\xb13\x00\x00\xff\xff\xb13\x00\x04\xff\xff\xb9\xb0\x01\t\xff\xff\xab\xa0\x00\rLMT" +
-	"\x00SJMT\x00CDT\x00CST\x00\nCST6\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00ø\xab\x9b\xf0\x00\x00\x00\xf0\x00\x00\x00\x0f\x00\x00\x00America/Cr" +
-	"estonTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif" +
-	"2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\v\x00\x00\x00\x04\x00\x00\x00\x10\xff\xff\xff\xff^\x04\f\xb0\xff\xff\xff\xff\x9e\xa6:\x90\xff\xff\xff\xff" +
-	"\x9f\xbb\a\x80\xff\xff\xff\xff\xa0\x86\x1c\x90\xff\xff\xff\xff\xa1\x9a\xe9\x80\xff\xff\xff\xffˉ\f\x90\xff\xff\xff\xff\xcf\x17\xdf\x1c\xff\xff\xff\xffϏ\xe5\xac\xff\xff\xff\xffЁ\x1a\x1c\xff\xff\xff\xff\xfa\xf8u\x10" +
-	"\xff\xff\xff\xff\xfb\xe8X\x00\x02\x01\x02\x01\x02\x03\x02\x03\x02\x01\x02\xff\xff\x96\xee\x00\x00\xff\xff\xab\xa0\x01\x04\xff\xff\x9d\x90\x00\b\xff\xff\xab\xa0\x01\fLMT\x00MDT\x00MST\x00MWT\x00\n" +
-	"MST7\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f$*\xa0\xa6\x03\x00\x00\xa6\x03\x00\x00\x0e\x00\x00\x00America/CuiabaTZif2\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Y\x00\x00\x00\x03\x00\x00\x00\f\xff\xff\xff\xff\x96\xaa{\x94\xff\xff\xff\xff\xb8\x0fW\xf0\xff\xff\xff\xff\xb8\xfdN\xb0\xff\xff\xff\xff\xb9\xf1B@\xff\xff\xff\xff" +
-	"\xbaނ0\xff\xff\xff\xff\xda8\xbc@\xff\xff\xff\xff\xda\xec\b@\xff\xff\xff\xff\xdc\x19\xef\xc0\xff\xff\xff\xffܹg0\xff\xff\xff\xff\xdd\xfb#@\xff\xff\xff\xffޛ\xec0\xff\xff\xff\xff\xdfݨ@" +
-	"\xff\xff\xff\xff\xe0TA0\xff\xff\xff\xff\xf4\x98\r\xc0\xff\xff\xff\xff\xf5\x05l0\xff\xff\xff\xff\xf6\xc0r@\xff\xff\xff\xff\xf7\x0e,\xb0\xff\xff\xff\xff\xf8Q:@\xff\xff\xff\xff\xf8\xc7\xd30\xff\xff\xff\xff" +
-	"\xfa\n\xe0\xc0\xff\xff\xff\xff\xfa\xa9\x06\xb0\xff\xff\xff\xff\xfb\xec\x14@\xff\xff\xff\xff\xfc\x8b\x8b\xb0\x00\x00\x00\x00\x1dɜ@\x00\x00\x00\x00\x1ex\xe5\xb0\x00\x00\x00\x00\x1f\xa0C\xc0\x00\x00\x00\x00 3ݰ" +
-	"\x00\x00\x00\x00!\x81w@\x00\x00\x00\x00\"\vְ\x00\x00\x00\x00#X\x1e\xc0\x00\x00\x00\x00#\xe2~0\x00\x00\x00\x00%8\x00\xc0\x00\x00\x00\x00%\xd4\xd50\x00\x00\x00\x00'!\x1d@\x00\x00\x00\x00" +
-	"'\xbd\xf1\xb0\x00\x00\x00\x00)\x00\xff@\x00\x00\x00\x00)\x94\x990\x00\x00\x00\x00*\xea\x1b\xc0\x00\x00\x00\x00+k@\xb0\x00\x00\x00\x00,\xc0\xc3@\x00\x00\x00\x00-f\xd20\x00\x00\x00\x00.\xa0\xa5@" +
-	"\x00\x00\x00\x00/F\xb40\x00\x00\x00\x000\x80\x87@\x00\x00\x00\x001\x1d[\xb0\x00\x00\x00\x002W.\xc0\x00\x00\x00\x003\x06x0\x00\x00\x00\x0048b@\x00\x00\x00\x004\xf8\xcf0\x00\x00\x00\x00" +
-	"6 -@\x00\x00\x00\x006\xcfv\xb0\x00\x00\x00\x007\xf6\xd4\xc0\x00\x00\x00\x008\xb8\x930\x00\x00\x00\x009\xdf\xf1@\x00\x00\x00\x00:\x8f:\xb0\x00\x00\x00\x00;\xc9\r\xc0\x00\x00\x00\x00<o\x1c\xb0" +
-	"\x00\x00\x00\x00=ğ@\x00\x00\x00\x00>N\xfe\xb0\x00\x00\x00\x00A\x87\x06@\x00\x00\x00\x00B\x17\xfd0\x00\x00\x00\x00CQ\xd0@\x00\x00\x00\x00C\xf7\xdf0\x00\x00\x00\x00EMa\xc0\x00\x00\x00\x00" +
-	"E\xe0\xfb\xb0\x00\x00\x00\x00G\x11\x94@\x00\x00\x00\x00G\xb7\xa30\x00\x00\x00\x00H\xfa\xb0\xc0\x00\x00\x00\x00I\x97\x850\x00\x00\x00\x00Jڒ\xc0\x00\x00\x00\x00K\x80\xa1\xb0\x00\x00\x00\x00L\xbat\xc0" +
-	"\x00\x00\x00\x00M`\x83\xb0\x00\x00\x00\x00N\x9aV\xc0\x00\x00\x00\x00OI\xa00\x00\x00\x00\x00P\x83s@\x00\x00\x00\x00Q G\xb0\x00\x00\x00\x00RcU@\x00\x00\x00\x00S\x00)\xb0\x00\x00\x00\x00" +
-	"TC7@\x00\x00\x00\x00T\xe9F0\x00\x00\x00\x00V#\x19@\x00\x00\x00\x00V\xc9(0\x00\x00\x00\x00X\x02\xfb@\x00\x00\x00\x00X\xa9\n0\x00\x00\x00\x00Y\xe2\xdd@\x00\x00\x00\x00Z\x88\xec0" +
-	"\x00\x00\x00\x00[\xden\xc0\x00\x00\x00\x00\\h\xce0\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\xff\xff\xcbl\x00\x00\xff\xff\xd5\xd0\x01\x04\xff\xff\xc7" +
-	"\xc0\x00\bLMT\x00-03\x00-04\x00\n<-04>4\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00q\xc9*;\xb1\x00\x00\x00\xb1\x00\x00\x00\x0f\x00\x00\x00America" +
-	"/CuracaoTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00T" +
-	"Zif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x10\xff\xff\xff\xffz敹\xff\xff\xff\xff\xcb\xf62\xc0\xff" +
-	"\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2`\xed\xd0\x01\x03\x02\x01\xff\xff\xc2\a\x00\x00\xff\xff\xc7\xc0\x00\x04\xff\xff\xd5\xd0\x01\b\xff\xff\xd5\xd0\x01\fLMT\x00AST\x00APT\x00AWT\x00\n" +
-	"AST4\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00k\xc2\rx\xbf\x01\x00\x00\xbf\x01\x00\x00\x14\x00\x00\x00America/DanmarkshavnTZif2" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\"\x00\x00\x00\x04\x00\x00\x00\x10\xff\xff\xff\xff\x9b\x80I\x00\x00\x00\x00\x00\x13M|P\x00\x00\x00\x00\x143\xfa\x90\x00\x00\x00\x00\x15#" +
-	"\xeb\x90\x00\x00\x00\x00\x16\x13ܐ\x00\x00\x00\x00\x17\x03͐\x00\x00\x00\x00\x17\xf3\xbe\x90\x00\x00\x00\x00\x18㯐\x00\x00\x00\x00\x19Ӡ\x90\x00\x00\x00\x00\x1aÑ\x90\x00\x00\x00\x00\x1b\xbc\xbd\x10\x00\x00" +
-	"\x00\x00\x1c\xac\xae\x10\x00\x00\x00\x00\x1d\x9c\x9f\x10\x00\x00\x00\x00\x1e\x8c\x90\x10\x00\x00\x00\x00\x1f|\x81\x10\x00\x00\x00\x00 lr\x10\x00\x00\x00\x00!\\c\x10\x00\x00\x00\x00\"LT\x10\x00\x00\x00\x00#<" +
-	"E\x10\x00\x00\x00\x00$,6\x10\x00\x00\x00\x00%\x1c'\x10\x00\x00\x00\x00&\f\x18\x10\x00\x00\x00\x00'\x05C\x90\x00\x00\x00\x00'\xf54\x90\x00\x00\x00\x00(\xe5%\x90\x00\x00\x00\x00)\xd5\x16\x90\x00\x00" +
-	"\x00\x00*\xc5\a\x90\x00\x00\x00\x00+\xb4\xf8\x90\x00\x00\x00\x00,\xa4\xe9\x90\x00\x00\x00\x00-\x94ڐ\x00\x00\x00\x00.\x84ː\x00\x00\x00\x00/t\xbc\x90\x00\x00\x00\x000d\xad\x90\x00\x00\x00\x000\xe7" +
-	"N0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x03\xff\xff\xee\x80\x00\x00\xff\xff\xd5\xd0\x00\x04\xff\xff\xe3\xe0\x01\b\x00\x00\x00\x00\x00\f" +
-	"LMT\x00-03\x00-02\x00GMT\x00\nGMT0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\xe6\xf5J\x05\x04\x00\x00\x05\x04\x00\x00\x0e\x00\x00\x00America/" +
-	"DawsonTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZi" +
-	"f2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00]\x00\x00\x00\t\x00\x00\x00%\xff\xff\xff\xff}\x86\x8e\xb4\xff\xff\xff\xff\x9e\xb8˰\xff\xff\xff" +
-	"\xff\x9f\xbb#\xa0\xff\xff\xff\xff\xa0\xd0\f\xb0\xff\xff\xff\xff\xa1\xa2Ҁ\xff\xff\xff\xffˉ(\xb0\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2a4 \xff\xff\xff\xff\xf7/v\x90\xff\xff\xff\xff\xf8(\xa2" +
-	"\x10\x00\x00\x00\x00\a0\xec\x90\x00\x00\x00\x00\x13ir \x00\x00\x00\x00\x14YU\x10\x00\x00\x00\x00\x15IT \x00\x00\x00\x00\x1697\x10\x00\x00\x00\x00\x17)6 \x00\x00\x00\x00\x18\"S\x90\x00\x00\x00" +
-	"\x00\x19\t\x18 \x00\x00\x00\x00\x1a\x025\x90\x00\x00\x00\x00\x1a\xf24\xa0\x00\x00\x00\x00\x1b\xe2\x17\x90\x00\x00\x00\x00\x1c\xd2\x16\xa0\x00\x00\x00\x00\x1d\xc1\xf9\x90\x00\x00\x00\x00\x1e\xb1\xf8\xa0\x00\x00\x00\x00\x1f\xa1\xdb" +
-	"\x90\x00\x00\x00\x00 v+ \x00\x00\x00\x00!\x81\xbd\x90\x00\x00\x00\x00\"V\r \x00\x00\x00\x00#j\xda\x10\x00\x00\x00\x00$5\xef \x00\x00\x00\x00%J\xbc\x10\x00\x00\x00\x00&\x15\xd1 \x00\x00\x00" +
-	"\x00'*\x9e\x10\x00\x00\x00\x00'\xfe\xed\xa0\x00\x00\x00\x00)\n\x80\x10\x00\x00\x00\x00)\xdeϠ\x00\x00\x00\x00*\xeab\x10\x00\x00\x00\x00+\xbe\xb1\xa0\x00\x00\x00\x00,\xd3~\x90\x00\x00\x00\x00-\x9e\x93" +
-	"\xa0\x00\x00\x00\x00.\xb3`\x90\x00\x00\x00\x00/~u\xa0\x00\x00\x00\x000\x93B\x90\x00\x00\x00\x001g\x92 \x00\x00\x00\x002s$\x90\x00\x00\x00\x003Gt \x00\x00\x00\x004S\x06\x90\x00\x00\x00" +
-	"\x005'V \x00\x00\x00\x0062\xe8\x90\x00\x00\x00\x007\a8 \x00\x00\x00\x008\x1c\x05\x10\x00\x00\x00\x008\xe7\x1a \x00\x00\x00\x009\xfb\xe7\x10\x00\x00\x00\x00:\xc6\xfc \x00\x00\x00\x00;\xdb\xc9" +
-	"\x10\x00\x00\x00\x00<\xb0\x18\xa0\x00\x00\x00\x00=\xbb\xab\x10\x00\x00\x00\x00>\x8f\xfa\xa0\x00\x00\x00\x00?\x9b\x8d\x10\x00\x00\x00\x00@oܠ\x00\x00\x00\x00A\x84\xa9\x90\x00\x00\x00\x00BO\xbe\xa0\x00\x00\x00" +
-	"\x00Cd\x8b\x90\x00\x00\x00\x00D/\xa0\xa0\x00\x00\x00\x00EDm\x90\x00\x00\x00\x00E\xf3\xd3 \x00\x00\x00\x00G-\x8a\x10\x00\x00\x00\x00Gӵ \x00\x00\x00\x00I\rl\x10\x00\x00\x00\x00I\xb3\x97" +
-	" \x00\x00\x00\x00J\xedN\x10\x00\x00\x00\x00K\x9c\xb3\xa0\x00\x00\x00\x00L\xd6j\x90\x00\x00\x00\x00M|\x95\xa0\x00\x00\x00\x00N\xb6L\x90\x00\x00\x00\x00O\\w\xa0\x00\x00\x00\x00P\x96.\x90\x00\x00\x00" +
-	"\x00Q<Y\xa0\x00\x00\x00\x00Rv\x10\x90\x00\x00\x00\x00S\x1c;\xa0\x00\x00\x00\x00TU\xf2\x90\x00\x00\x00\x00T\xfc\x1d\xa0\x00\x00\x00\x00V5Ԑ\x00\x00\x00\x00V\xe5: \x00\x00\x00\x00X\x1e\xf1" +
-	"\x10\x00\x00\x00\x00X\xc5\x1c \x00\x00\x00\x00Y\xfe\xd3\x10\x00\x00\x00\x00Z\xa4\xfe \x00\x00\x00\x00[\u07b5\x10\x00\x00\x00\x00\\\x84\xe0 \x00\x00\x00\x00]\xbe\x97\x10\x00\x00\x00\x00^d\xc2 \x00\x00\x00" +
-	"\x00_\x9e\\\xf0\x02\x01\x02\x01\x02\x03\x04\x02\x05\x02\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06" +
-	"\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\b\xff\xff}L\x00\x00\xff\xff\x8f\x80\x01\x04\xff\xff\x81p\x00\b\xff\xff\x8f\x80" +
-	"\x01\f\xff\xff\x8f\x80\x01\x10\xff\xff\x9d\x90\x01\x14\xff\xff\x8f\x80\x00\x19\xff\xff\x9d\x90\x01\x1d\xff\xff\x9d\x90\x00!LMT\x00YDT\x00YST\x00YWT\x00YPT\x00YDDT\x00PST" +
-	"\x00PDT\x00MST\x00\nMST7\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00+\x10`ȫ\x02\x00\x00\xab\x02\x00\x00\x14\x00\x00\x00America/Dawson_" +
-	"CreekTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif" +
-	"2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00:\x00\x00\x00\x06\x00\x00\x00\x18\xff\xff\xff\xff^=t8\xff\xff\xff\xff\x9e\xb8\xbd\xa0\xff\xff\xff\xff" +
-	"\x9f\xbb\x15\x90\xff\xff\xff\xffˉ\x1a\xa0\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2a&\x10\xff\xff\xff\xff\xd5U\xf1 \xff\xff\xff\xff\xd6 \xea\x10\xff\xff\xff\xff\xd75\xd3 \xff\xff\xff\xff\xd8\x00\xcc\x10" +
-	"\xff\xff\xff\xff\xd9\x15\xb5 \xff\xff\xff\xff\xd9\xe0\xae\x10\xff\xff\xff\xff\xda\xfeѠ\xff\xff\xff\xff\xdb\xc0\x90\x10\xff\xff\xff\xff\xdc\u07b3\xa0\xff\xff\xff\xffݩ\xac\x90\xff\xff\xff\xff\u07be\x95\xa0\xff\xff\xff\xff" +
-	"߉\x8e\x90\xff\xff\xff\xff\xe0\x9ew\xa0\xff\xff\xff\xff\xe1ip\x90\xff\xff\xff\xff\xe2~Y\xa0\xff\xff\xff\xff\xe3IR\x90\xff\xff\xff\xff\xe4^;\xa0\xff\xff\xff\xff\xe5)4\x90\xff\xff\xff\xff\xe6GX " +
-	"\xff\xff\xff\xff\xe7\x12Q\x10\xff\xff\xff\xff\xe8': \xff\xff\xff\xff\xe8\xf23\x10\xff\xff\xff\xff\xea\a\x1c \xff\xff\xff\xff\xea\xd2\x15\x10\xff\xff\xff\xff\xeb\xe6\xfe \xff\xff\xff\xff\xec\xb1\xf7\x10\xff\xff\xff\xff" +
-	"\xed\xc6\xe0 \xff\xff\xff\xff\xee\x91\xd9\x10\xff\xff\xff\xff\xef\xaf\xfc\xa0\xff\xff\xff\xff\xf0q\xbb\x10\xff\xff\xff\xff\xf1\x8fޠ\xff\xff\xff\xff\xf2\x7f\xc1\x90\xff\xff\xff\xff\xf3o\xc0\xa0\xff\xff\xff\xff\xf4_\xa3\x90" +
-	"\xff\xff\xff\xff\xf5O\xa2\xa0\xff\xff\xff\xff\xf6?\x85\x90\xff\xff\xff\xff\xf7/\x84\xa0\xff\xff\xff\xff\xf8(\xa2\x10\xff\xff\xff\xff\xf9\x0ff\xa0\xff\xff\xff\xff\xfa\b\x84\x10\xff\xff\xff\xff\xfa\xf8\x83 \xff\xff\xff\xff" +
-	"\xfb\xe8f\x10\xff\xff\xff\xff\xfc\xd8e \xff\xff\xff\xff\xfd\xc8H\x10\xff\xff\xff\xff\xfe\xb8G \xff\xff\xff\xff\xff\xa8*\x10\x00\x00\x00\x00\x00\x98) \x00\x00\x00\x00\x01\x88\f\x10\x00\x00\x00\x00\x02x\v " +
-	"\x00\x00\x00\x00\x03q(\x90\x00\x00\x00\x00\x04a'\xa0\x00\x00\x00\x00\x05\x01\xf0\x90\x02\x01\x02\x03\x04\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x05\xff\xff\x8fH\x00\x00\xff\xff\x9d\x90\x01\x04\xff\xff\x8f\x80\x00\b\xff\xff\x9d\x90\x01\f\xff\xff\x9d\x90\x01\x10\xff\xff\x9d\x90\x00\x14LM" +
-	"T\x00PDT\x00PST\x00PWT\x00PPT\x00MST\x00\nMST7\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00V\x80\x94@\x12\x04\x00\x00\x12\x04\x00\x00\x0e\x00\x00\x00Am" +
-	"erica/DenverTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00" +
-	"\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00a\x00\x00\x00\x05\x00\x00\x00\x14\xff\xff\xff\xff^\x04\f\xb0\xff\xff\xff\xff\x9e" +
-	"\xa6:\x90\xff\xff\xff\xff\x9f\xbb\a\x80\xff\xff\xff\xff\xa0\x86\x1c\x90\xff\xff\xff\xff\xa1\x9a\xe9\x80\xff\xff\xff\xff\xa2e\xfe\x90\xff\xff\xff\xff\xa3\x84\x06\x00\xff\xff\xff\xff\xa4E\xe0\x90\xff\xff\xff\xff\xa4\x8f\xa6\x80\xff" +
-	"\xff\xff\xffˉ\f\x90\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2a\x18\x00\xff\xff\xff\xff\xf7/v\x90\xff\xff\xff\xff\xf8(\x94\x00\xff\xff\xff\xff\xf9\x0fX\x90\xff\xff\xff\xff\xfa\bv\x00\xff\xff\xff\xff\xfa" +
-	"\xf8u\x10\xff\xff\xff\xff\xfb\xe8X\x00\xff\xff\xff\xff\xfc\xd8W\x10\xff\xff\xff\xff\xfd\xc8:\x00\xff\xff\xff\xff\xfe\xb89\x10\xff\xff\xff\xff\xff\xa8\x1c\x00\x00\x00\x00\x00\x00\x98\x1b\x10\x00\x00\x00\x00\x01\x87\xfe\x00\x00" +
-	"\x00\x00\x00\x02w\xfd\x10\x00\x00\x00\x00\x03q\x1a\x80\x00\x00\x00\x00\x04a\x19\x90\x00\x00\x00\x00\x05P\xfc\x80\x00\x00\x00\x00\x06@\xfb\x90\x00\x00\x00\x00\a0ހ\x00\x00\x00\x00\a\x8d5\x90\x00\x00\x00\x00\t" +
-	"\x10\xc0\x80\x00\x00\x00\x00\t\xad\xb1\x10\x00\x00\x00\x00\n\xf0\xa2\x80\x00\x00\x00\x00\vࡐ\x00\x00\x00\x00\fٿ\x00\x00\x00\x00\x00\r\xc0\x83\x90\x00\x00\x00\x00\x0e\xb9\xa1\x00\x00\x00\x00\x00\x0f\xa9\xa0\x10\x00" +
-	"\x00\x00\x00\x10\x99\x83\x00\x00\x00\x00\x00\x11\x89\x82\x10\x00\x00\x00\x00\x12ye\x00\x00\x00\x00\x00\x13id\x10\x00\x00\x00\x00\x14YG\x00\x00\x00\x00\x00\x15IF\x10\x00\x00\x00\x00\x169)\x00\x00\x00\x00\x00\x17" +
-	")(\x10\x00\x00\x00\x00\x18\"E\x80\x00\x00\x00\x00\x19\t\n\x10\x00\x00\x00\x00\x1a\x02'\x80\x00\x00\x00\x00\x1a\xf2&\x90\x00\x00\x00\x00\x1b\xe2\t\x80\x00\x00\x00\x00\x1c\xd2\b\x90\x00\x00\x00\x00\x1d\xc1\xeb\x80\x00" +
-	"\x00\x00\x00\x1e\xb1\xea\x90\x00\x00\x00\x00\x1f\xa1̀\x00\x00\x00\x00 v\x1d\x10\x00\x00\x00\x00!\x81\xaf\x80\x00\x00\x00\x00\"U\xff\x10\x00\x00\x00\x00#j\xcc\x00\x00\x00\x00\x00$5\xe1\x10\x00\x00\x00\x00%" +
-	"J\xae\x00\x00\x00\x00\x00&\x15\xc3\x10\x00\x00\x00\x00'*\x90\x00\x00\x00\x00\x00'\xfeߐ\x00\x00\x00\x00)\nr\x00\x00\x00\x00\x00)\xde\xc1\x90\x00\x00\x00\x00*\xeaT\x00\x00\x00\x00\x00+\xbe\xa3\x90\x00" +
-	"\x00\x00\x00,\xd3p\x80\x00\x00\x00\x00-\x9e\x85\x90\x00\x00\x00\x00.\xb3R\x80\x00\x00\x00\x00/~g\x90\x00\x00\x00\x000\x934\x80\x00\x00\x00\x001g\x84\x10\x00\x00\x00\x002s\x16\x80\x00\x00\x00\x003" +
-	"Gf\x10\x00\x00\x00\x004R\xf8\x80\x00\x00\x00\x005'H\x10\x00\x00\x00\x0062ڀ\x00\x00\x00\x007\a*\x10\x00\x00\x00\x008\x1b\xf7\x00\x00\x00\x00\x008\xe7\f\x10\x00\x00\x00\x009\xfb\xd9\x00\x00" +
-	"\x00\x00\x00:\xc6\xee\x10\x00\x00\x00\x00;ۻ\x00\x00\x00\x00\x00<\xb0\n\x90\x00\x00\x00\x00=\xbb\x9d\x00\x00\x00\x00\x00>\x8f\xec\x90\x00\x00\x00\x00?\x9b\x7f\x00\x00\x00\x00\x00@oΐ\x00\x00\x00\x00A" +
-	"\x84\x9b\x80\x00\x00\x00\x00BO\xb0\x90\x00\x00\x00\x00Cd}\x80\x00\x00\x00\x00D/\x92\x90\x00\x00\x00\x00ED_\x80\x00\x00\x00\x00E\xf3\xc5\x10\x02\x01\x02\x01\x02\x01\x02\x01\x02\x03\x04\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\xff\xff\x9d\x94\x00\x00\xff\xff\xab\xa0\x01\x04\xff\xff\x9d\x90\x00\b\xff\xff\xab\xa0\x01\f\xff\xff\xab\xa0\x01\x10LMT\x00MDT\x00MS" +
-	"T\x00MWT\x00MPT\x00\nMST7MDT,M3.2.0,M11.1.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00>\x14\xe7\x03\x83\x03\x00\x00\x83\x03\x00\x00" +
-	"\x0f\x00\x00\x00America/DetroitTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" +
-	"\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00P\x00\x00\x00\x06\x00\x00\x00\x18\xff\xff\xff\xff\x85\xbd" +
-	"\"[\xff\xff\xff\xff\x99<\x94\x00\xff\xff\xff\xffˈ\xf0p\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2`\xfb\xe0\xff\xff\xff\xff\xd75\xa8\xf0\xff\xff\xff\xff\xd8\x00\xa1\xe0\xff\xff\xff\xff\xfb3\x90\x8c\xff\xff" +
-	"\xff\xff\xfb\xe8;\xe0\xff\xff\xff\xff\xfc\xd8:\xf0\xff\xff\xff\xff\xfd\xc8\x1d\xe0\x00\x00\x00\x00\x06@\xdfp\x00\x00\x00\x00\a0\xc2`\x00\x00\x00\x00\a\x8d\x19p\x00\x00\x00\x00\t\x10\xa4`\x00\x00\x00\x00\n\x00" +
-	"\xa3p\x00\x00\x00\x00\n\xf0\x86`\x00\x00\x00\x00\v\xe0\x85p\x00\x00\x00\x00\f٢\xe0\x00\x00\x00\x00\r\xc0gp\x00\x00\x00\x00\x0e\xb9\x84\xe0\x00\x00\x00\x00\x0f\xa9\x83\xf0\x00\x00\x00\x00\x10\x99f\xe0\x00\x00" +
-	"\x00\x00\x11\x89e\xf0\x00\x00\x00\x00\x12yH\xe0\x00\x00\x00\x00\x13iG\xf0\x00\x00\x00\x00\x14Y*\xe0\x00\x00\x00\x00\x15I)\xf0\x00\x00\x00\x00\x169\f\xe0\x00\x00\x00\x00\x17)\v\xf0\x00\x00\x00\x00\x18\"" +
-	")`\x00\x00\x00\x00\x19\b\xed\xf0\x00\x00\x00\x00\x1a\x02\v`\x00\x00\x00\x00\x1a\xf2\np\x00\x00\x00\x00\x1b\xe1\xed`\x00\x00\x00\x00\x1c\xd1\xecp\x00\x00\x00\x00\x1d\xc1\xcf`\x00\x00\x00\x00\x1e\xb1\xcep\x00\x00" +
-	"\x00\x00\x1f\xa1\xb1`\x00\x00\x00\x00 v\x00\xf0\x00\x00\x00\x00!\x81\x93`\x00\x00\x00\x00\"U\xe2\xf0\x00\x00\x00\x00#j\xaf\xe0\x00\x00\x00\x00$5\xc4\xf0\x00\x00\x00\x00%J\x91\xe0\x00\x00\x00\x00&\x15" +
-	"\xa6\xf0\x00\x00\x00\x00'*s\xe0\x00\x00\x00\x00'\xfe\xc3p\x00\x00\x00\x00)\nU\xe0\x00\x00\x00\x00)ޥp\x00\x00\x00\x00*\xea7\xe0\x00\x00\x00\x00+\xbe\x87p\x00\x00\x00\x00,\xd3T`\x00\x00" +
-	"\x00\x00-\x9eip\x00\x00\x00\x00.\xb36`\x00\x00\x00\x00/~Kp\x00\x00\x00\x000\x93\x18`\x00\x00\x00\x001gg\xf0\x00\x00\x00\x002r\xfa`\x00\x00\x00\x003GI\xf0\x00\x00\x00\x004R" +
-	"\xdc`\x00\x00\x00\x005'+\xf0\x00\x00\x00\x0062\xbe`\x00\x00\x00\x007\a\r\xf0\x00\x00\x00\x008\x1b\xda\xe0\x00\x00\x00\x008\xe6\xef\xf0\x00\x00\x00\x009\xfb\xbc\xe0\x00\x00\x00\x00:\xc6\xd1\xf0\x00\x00" +
-	"\x00\x00;۞\xe0\x00\x00\x00\x00<\xaf\xeep\x00\x00\x00\x00=\xbb\x80\xe0\x00\x00\x00\x00>\x8f\xd0p\x00\x00\x00\x00?\x9bb\xe0\x00\x00\x00\x00@o\xb2p\x00\x00\x00\x00A\x84\x7f`\x00\x00\x00\x00BO" +
-	"\x94p\x00\x00\x00\x00Cda`\x00\x00\x00\x00D/vp\x00\x00\x00\x00EDC`\x00\x00\x00\x00E\xf3\xa8\xf0\x01\x02\x03\x04\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05" +
-	"\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\xff\xff\xb2%\x00\x00" +
-	"\xff\xff\xab\xa0\x00\x04\xff\xff\xb9\xb0\x00\b\xff\xff\xc7\xc0\x01\f\xff\xff\xc7\xc0\x01\x10\xff\xff\xc7\xc0\x01\x14LMT\x00CST\x00EST\x00EWT\x00EPT\x00EDT\x00\nEST5E" +
-	"DT,M3.2.0,M11.1.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00q\xc9*;\xb1\x00\x00\x00\xb1\x00\x00\x00\x10\x00\x00\x00America/Domi" +
-	"nicaTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x10\xff\xff\xff\xffz敹\xff\xff\xff\xff\xcb\xf62\xc0\xff\xff\xff\xff\xd2" +
-	"#\xf4p\xff\xff\xff\xff\xd2`\xed\xd0\x01\x03\x02\x01\xff\xff\xc2\a\x00\x00\xff\xff\xc7\xc0\x00\x04\xff\xff\xd5\xd0\x01\b\xff\xff\xd5\xd0\x01\fLMT\x00AST\x00APT\x00AWT\x00\nAST4" +
-	"\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00{\a\a\xdc\xca\x03\x00\x00\xca\x03\x00\x00\x10\x00\x00\x00America/EdmontonTZif2\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Y\x00\x00\x00\x05\x00\x00\x00\x14\xff\xff\xff\xff\x88\xde\xce\xe0\xff\xff\xff\xff\x9e\xb8\xaf\x90\xff\xff\xff\xff\x9f\xbb\a\x80\xff\xff\xff\xff\xa0\x98\x91\x90\xff\xff\xff\xff\xa0\xd2" +
-	"\x85\x80\xff\xff\xff\xff\xa2\x8a\xe8\x90\xff\xff\xff\xff\xa3\x84\x06\x00\xff\xff\xff\xff\xa4jʐ\xff\xff\xff\xff\xa55À\xff\xff\xff\xff\xa6S\xe7\x10\xff\xff\xff\xff\xa7\x15\xa5\x80\xff\xff\xff\xff\xa83\xc9\x10\xff\xff" +
-	"\xff\xff\xa8\xfe\xc2\x00\xff\xff\xff\xffˉ\f\x90\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2a\x18\x00\xff\xff\xff\xff\xd5U\xe3\x10\xff\xff\xff\xff\xd6 \xdc\x00\x00\x00\x00\x00\x04a\x19\x90\x00\x00\x00\x00\x05P" +
-	"\xfc\x80\x00\x00\x00\x00\x06@\xfb\x90\x00\x00\x00\x00\a0ހ\x00\x00\x00\x00\b ݐ\x00\x00\x00\x00\t\x10\xc0\x80\x00\x00\x00\x00\n\x00\xbf\x90\x00\x00\x00\x00\n\xf0\xa2\x80\x00\x00\x00\x00\vࡐ\x00\x00" +
-	"\x00\x00\fٿ\x00\x00\x00\x00\x00\r\xc0\x83\x90\x00\x00\x00\x00\x0e\xb9\xa1\x00\x00\x00\x00\x00\x0f\xa9\xa0\x10\x00\x00\x00\x00\x10\x99\x83\x00\x00\x00\x00\x00\x11\x89\x82\x10\x00\x00\x00\x00\x12ye\x00\x00\x00\x00\x00\x13i" +
-	"d\x10\x00\x00\x00\x00\x14YG\x00\x00\x00\x00\x00\x15IF\x10\x00\x00\x00\x00\x169)\x00\x00\x00\x00\x00\x17)(\x10\x00\x00\x00\x00\x18\"E\x80\x00\x00\x00\x00\x19\t\n\x10\x00\x00\x00\x00\x1a\x02'\x80\x00\x00" +
-	"\x00\x00\x1a\xf2&\x90\x00\x00\x00\x00\x1b\xe2\t\x80\x00\x00\x00\x00\x1c\xd2\b\x90\x00\x00\x00\x00\x1d\xc1\xeb\x80\x00\x00\x00\x00\x1e\xb1\xea\x90\x00\x00\x00\x00\x1f\xa1̀\x00\x00\x00\x00 v\x1d\x10\x00\x00\x00\x00!\x81" +
-	"\xaf\x80\x00\x00\x00\x00\"U\xff\x10\x00\x00\x00\x00#j\xcc\x00\x00\x00\x00\x00$5\xe1\x10\x00\x00\x00\x00%J\xae\x00\x00\x00\x00\x00&\x15\xc3\x10\x00\x00\x00\x00'*\x90\x00\x00\x00\x00\x00'\xfeߐ\x00\x00" +
-	"\x00\x00)\nr\x00\x00\x00\x00\x00)\xde\xc1\x90\x00\x00\x00\x00*\xeaT\x00\x00\x00\x00\x00+\xbe\xa3\x90\x00\x00\x00\x00,\xd3p\x80\x00\x00\x00\x00-\x9e\x85\x90\x00\x00\x00\x00.\xb3R\x80\x00\x00\x00\x00/~" +
-	"g\x90\x00\x00\x00\x000\x934\x80\x00\x00\x00\x001g\x84\x10\x00\x00\x00\x002s\x16\x80\x00\x00\x00\x003Gf\x10\x00\x00\x00\x004R\xf8\x80\x00\x00\x00\x005'H\x10\x00\x00\x00\x0062ڀ\x00\x00" +
-	"\x00\x007\a*\x10\x00\x00\x00\x008\x1b\xf7\x00\x00\x00\x00\x008\xe7\f\x10\x00\x00\x00\x009\xfb\xd9\x00\x00\x00\x00\x00:\xc6\xee\x10\x00\x00\x00\x00;ۻ\x00\x00\x00\x00\x00<\xb0\n\x90\x00\x00\x00\x00=\xbb" +
-	"\x9d\x00\x00\x00\x00\x00>\x8f\xec\x90\x00\x00\x00\x00?\x9b\x7f\x00\x00\x00\x00\x00@oΐ\x00\x00\x00\x00A\x84\x9b\x80\x00\x00\x00\x00BO\xb0\x90\x00\x00\x00\x00Cd}\x80\x00\x00\x00\x00D/\x92\x90\x00\x00" +
-	"\x00\x00ED_\x80\x00\x00\x00\x00E\xf3\xc5\x10\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x03\x04\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\xff\xff\x95\xa0\x00\x00\xff\xff\xab\xa0\x01\x04\xff\xff\x9d\x90\x00" +
-	"\b\xff\xff\xab\xa0\x01\f\xff\xff\xab\xa0\x01\x10LMT\x00MDT\x00MST\x00MWT\x00MPT\x00\nMST7MDT,M3.2.0,M11.1.0\nPK\x03" +
-	"\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00s\xb0\xeau\xb4\x01\x00\x00\xb4\x01\x00\x00\x10\x00\x00\x00America/EirunepeTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00!\x00\x00\x00\x04\x00\x00\x00\f\xff\xff\xff\xff\x96\xaa\x88\x80\xff\xff\xff\xff\xb8\x0ff\x00\xff\xff\xff\xff\xb8\xfd\\\xc0\xff\xff\xff\xff\xb9\xf1PP\xff\xff\xff\xff\xbaސ@\xff\xff" +
-	"\xff\xff\xda8\xcaP\xff\xff\xff\xff\xda\xec\x16P\xff\xff\xff\xff\xdc\x19\xfd\xd0\xff\xff\xff\xffܹu@\xff\xff\xff\xff\xdd\xfb1P\xff\xff\xff\xffޛ\xfa@\xff\xff\xff\xff\xdfݶP\xff\xff\xff\xff\xe0T" +
-	"O@\xff\xff\xff\xff\xf4\x98\x1b\xd0\xff\xff\xff\xff\xf5\x05z@\xff\xff\xff\xff\xf6\xc0\x80P\xff\xff\xff\xff\xf7\x0e:\xc0\xff\xff\xff\xff\xf8QHP\xff\xff\xff\xff\xf8\xc7\xe1@\xff\xff\xff\xff\xfa\n\xee\xd0\xff\xff" +
-	"\xff\xff\xfa\xa9\x14\xc0\xff\xff\xff\xff\xfb\xec\"P\xff\xff\xff\xff\xfc\x8b\x99\xc0\x00\x00\x00\x00\x1dɪP\x00\x00\x00\x00\x1ex\xf3\xc0\x00\x00\x00\x00\x1f\xa0Q\xd0\x00\x00\x00\x00 3\xeb\xc0\x00\x00\x00\x00!\x81" +
-	"\x85P\x00\x00\x00\x00\"\v\xe4\xc0\x00\x00\x00\x00,\xc0\xd1P\x00\x00\x00\x00-f\xe0@\x00\x00\x00\x00H`\x7fP\x00\x00\x00\x00R\x7f\x04\xc0\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x03\x02\xff\xff\xbe\x80\x00\x00\xff\xff\xc7\xc0\x01\x04\xff\xff\xb9\xb0\x00\b\xff\xff\xc7\xc0\x00\x04LMT\x00-04\x00-05\x00\n<-05>5\nP" +
-	"K\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xea$\xc1\xbf\xb0\x00\x00\x00\xb0\x00\x00\x00\x13\x00\x00\x00America/El_SalvadorTZif2\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x03\x00\x00\x00\f\xff\xff\xff\xff\xa3զ \x00\x00\x00\x00 \x9a\xdc\xe0\x00\x00\x00\x00!\\\x9bP\x00\x00\x00\x00\"z\xbe\xe0\x00\x00\x00\x00#" +
-	"<}P\x02\x01\x02\x01\x02\xff\xff\xac`\x00\x00\xff\xff\xb9\xb0\x01\x04\xff\xff\xab\xa0\x00\bLMT\x00CDT\x00CST\x00\nCST6\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9B" +
-	"$\x90\x01\x04\x00\x00\x01\x04\x00\x00\x10\x00\x00\x00America/EnsenadaTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00^\x00\x00\x00" +
-	"\x06\x00\x00\x00\x18\xff\xff\xff\xff\xa5\xb6\xe8p\xff\xff\xff\xff\xa9yOp\xff\xff\xff\xff\xaf\xf2|\xf0\xff\xff\xff\xff\xb6fdp\xff\xff\xff\xff\xb7\x1b\x10\x00\xff\xff\xff\xff\xb8\n\xf2\xf0\xff\xff\xff\xff\xcb\xea\x8d" +
-	"\x80\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xffҙ\xbap\xff\xff\xff\xff\xd7\x1bY\x00\xff\xff\xff\xffؑ\xb4\xf0\xff\xff\xff\xff\xe2~K\x90\xff\xff\xff\xff\xe3IR\x90\xff\xff\xff\xff\xe4^-\x90\xff\xff\xff" +
-	"\xff\xe5)4\x90\xff\xff\xff\xff\xe6GJ\x10\xff\xff\xff\xff\xe7\x12Q\x10\xff\xff\xff\xff\xe8',\x10\xff\xff\xff\xff\xe8\xf23\x10\xff\xff\xff\xff\xea\a\x0e\x10\xff\xff\xff\xff\xea\xd2\x15\x10\xff\xff\xff\xff\xeb\xe6\xf0" +
-	"\x10\xff\xff\xff\xff\xec\xb1\xf7\x10\xff\xff\xff\xff\xed\xc6\xd2\x10\xff\xff\xff\xff\xee\x91\xd9\x10\x00\x00\x00\x00\v\u0be0\x00\x00\x00\x00\f\xd9\xcd\x10\x00\x00\x00\x00\r\xc0\x91\xa0\x00\x00\x00\x00\x0e\xb9\xaf\x10\x00\x00\x00" +
-	"\x00\x0f\xa9\xae \x00\x00\x00\x00\x10\x99\x91\x10\x00\x00\x00\x00\x11\x89\x90 \x00\x00\x00\x00\x12ys\x10\x00\x00\x00\x00\x13ir \x00\x00\x00\x00\x14YU\x10\x00\x00\x00\x00\x15IT \x00\x00\x00\x00\x1697" +
-	"\x10\x00\x00\x00\x00\x17)6 \x00\x00\x00\x00\x18\"S\x90\x00\x00\x00\x00\x19\t\x18 \x00\x00\x00\x00\x1a\x025\x90\x00\x00\x00\x00\x1a\xf24\xa0\x00\x00\x00\x00\x1b\xe2\x17\x90\x00\x00\x00\x00\x1c\xd2\x16\xa0\x00\x00\x00" +
-	"\x00\x1d\xc1\xf9\x90\x00\x00\x00\x00\x1e\xb1\xf8\xa0\x00\x00\x00\x00\x1f\xa1ې\x00\x00\x00\x00 v+ \x00\x00\x00\x00!\x81\xbd\x90\x00\x00\x00\x00\"V\r \x00\x00\x00\x00#j\xda\x10\x00\x00\x00\x00$5\xef" +
-	" \x00\x00\x00\x00%J\xbc\x10\x00\x00\x00\x00&\x15\xd1 \x00\x00\x00\x00'*\x9e\x10\x00\x00\x00\x00'\xfe\xed\xa0\x00\x00\x00\x00)\n\x80\x10\x00\x00\x00\x00)\xdeϠ\x00\x00\x00\x00*\xeab\x10\x00\x00\x00" +
-	"\x00+\xbe\xb1\xa0\x00\x00\x00\x00,\xd3~\x90\x00\x00\x00\x00-\x9e\x93\xa0\x00\x00\x00\x00.\xb3`\x90\x00\x00\x00\x00/~u\xa0\x00\x00\x00\x000\x93B\x90\x00\x00\x00\x001g\x92 \x00\x00\x00\x002s$" +
-	"\x90\x00\x00\x00\x003Gt \x00\x00\x00\x004S\x06\x90\x00\x00\x00\x005'V \x00\x00\x00\x0062\xe8\x90\x00\x00\x00\x007\a8 \x00\x00\x00\x008\x1c\x05\x10\x00\x00\x00\x008\xe7\x1a \x00\x00\x00" +
-	"\x009\xfb\xe7\x10\x00\x00\x00\x00:\xc6\xfc \x00\x00\x00\x00;\xdb\xc9\x10\x00\x00\x00\x00<\xb0\x18\xa0\x00\x00\x00\x00=\xbb\xab\x10\x00\x00\x00\x00>\x8f\xfa\xa0\x00\x00\x00\x00?\x9b\x8d\x10\x00\x00\x00\x00@o\xdc" +
-	"\xa0\x00\x00\x00\x00A\x84\xa9\x90\x00\x00\x00\x00BO\xbe\xa0\x00\x00\x00\x00Cd\x8b\x90\x00\x00\x00\x00D/\xa0\xa0\x00\x00\x00\x00EDm\x90\x00\x00\x00\x00F\x0f\x82\xa0\x00\x00\x00\x00G$O\x90\x00\x00\x00" +
-	"\x00G\xf8\x9f \x00\x00\x00\x00I\x041\x90\x00\x00\x00\x00I\u0601 \x00\x00\x00\x00J\xe4\x13\x90\x00\x00\x00\x00K\x9c\xb3\xa0\x01\x02\x01\x02\x03\x02\x04\x05\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02" +
-	"\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02" +
-	"\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\xff\xff\x92L\x00\x00\xff\xff\x9d\x90\x00\x04\xff\xff\x8f\x80\x00\b\xff\xff\x9d\x90\x01\f\xff\xff\x9d\x90\x01\x10\xff\xff\x9d\x90\x01\x14LMT\x00MST\x00PST\x00P" +
-	"DT\x00PWT\x00PPT\x00\nPST8PDT,M3.2.0,M11.1.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf6@\rm\xa8\x05\x00\x00\xa8\x05\x00" +
-	"\x00\x13\x00\x00\x00America/Fort_NelsonTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8f\x00\x00\x00\x06\x00\x00\x00\x18\xff" +
-	"\xff\xff\xff^=v\x87\xff\xff\xff\xff\x9e\xb8\xbd\xa0\xff\xff\xff\xff\x9f\xbb\x15\x90\xff\xff\xff\xffˉ\x1a\xa0\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2a&\x10\xff\xff\xff\xff\xd5U\xf1 \xff\xff\xff\xff\xd6" +
-	" \xea\x10\xff\xff\xff\xff\xd75\xd3 \xff\xff\xff\xff\xd8\x00\xcc\x10\xff\xff\xff\xff\xd9\x15\xb5 \xff\xff\xff\xff\xd9\xe0\xae\x10\xff\xff\xff\xff\xda\xfeѠ\xff\xff\xff\xff\xdb\xc0\x90\x10\xff\xff\xff\xff\xdc\u07b3\xa0\xff" +
-	"\xff\xff\xffݩ\xac\x90\xff\xff\xff\xff\u07be\x95\xa0\xff\xff\xff\xff߉\x8e\x90\xff\xff\xff\xff\xe0\x9ew\xa0\xff\xff\xff\xff\xe1ip\x90\xff\xff\xff\xff\xe2~Y\xa0\xff\xff\xff\xff\xe3IR\x90\xff\xff\xff\xff\xe4" +
-	"^;\xa0\xff\xff\xff\xff\xe5)4\x90\xff\xff\xff\xff\xe6GX \xff\xff\xff\xff\xe7\x12Q\x10\xff\xff\xff\xff\xe8': \xff\xff\xff\xff\xe8\xf23\x10\xff\xff\xff\xff\xea\a\x1c \xff\xff\xff\xff\xea\xd2\x15\x10\xff" +
-	"\xff\xff\xff\xeb\xe6\xfe \xff\xff\xff\xff\xec\xb1\xf7\x10\xff\xff\xff\xff\xed\xc6\xe0 \xff\xff\xff\xff\xee\x91\xd9\x10\xff\xff\xff\xff\xef\xaf\xfc\xa0\xff\xff\xff\xff\xf0q\xbb\x10\xff\xff\xff\xff\xf1\x8fޠ\xff\xff\xff\xff\xf2" +
-	"\x7f\xc1\x90\xff\xff\xff\xff\xf3o\xc0\xa0\xff\xff\xff\xff\xf4_\xa3\x90\xff\xff\xff\xff\xf5O\xa2\xa0\xff\xff\xff\xff\xf6?\x85\x90\xff\xff\xff\xff\xf7/\x84\xa0\xff\xff\xff\xff\xf8(\xa2\x10\xff\xff\xff\xff\xf9\x0ff\xa0\xff" +
-	"\xff\xff\xff\xfa\b\x84\x10\xff\xff\xff\xff\xfa\xf8\x83 \xff\xff\xff\xff\xfb\xe8f\x10\xff\xff\xff\xff\xfc\xd8e \xff\xff\xff\xff\xfd\xc8H\x10\xff\xff\xff\xff\xfe\xb8G \xff\xff\xff\xff\xff\xa8*\x10\x00\x00\x00\x00\x00" +
-	"\x98) \x00\x00\x00\x00\x01\x88\f\x10\x00\x00\x00\x00\x02x\v \x00\x00\x00\x00\x03q(\x90\x00\x00\x00\x00\x04a'\xa0\x00\x00\x00\x00\x05Q\n\x90\x00\x00\x00\x00\x06A\t\xa0\x00\x00\x00\x00\a0\xec\x90\x00" +
-	"\x00\x00\x00\b \xeb\xa0\x00\x00\x00\x00\t\x10ΐ\x00\x00\x00\x00\n\x00͠\x00\x00\x00\x00\n\xf0\xb0\x90\x00\x00\x00\x00\v\u0be0\x00\x00\x00\x00\f\xd9\xcd\x10\x00\x00\x00\x00\r\xc0\x91\xa0\x00\x00\x00\x00\x0e" +
-	"\xb9\xaf\x10\x00\x00\x00\x00\x0f\xa9\xae \x00\x00\x00\x00\x10\x99\x91\x10\x00\x00\x00\x00\x11\x89\x90 \x00\x00\x00\x00\x12ys\x10\x00\x00\x00\x00\x13ir \x00\x00\x00\x00\x14YU\x10\x00\x00\x00\x00\x15IT \x00" +
-	"\x00\x00\x00\x1697\x10\x00\x00\x00\x00\x17)6 \x00\x00\x00\x00\x18\"S\x90\x00\x00\x00\x00\x19\t\x18 \x00\x00\x00\x00\x1a\x025\x90\x00\x00\x00\x00\x1a\xf24\xa0\x00\x00\x00\x00\x1b\xe2\x17\x90\x00\x00\x00\x00\x1c" +
-	"\xd2\x16\xa0\x00\x00\x00\x00\x1d\xc1\xf9\x90\x00\x00\x00\x00\x1e\xb1\xf8\xa0\x00\x00\x00\x00\x1f\xa1ې\x00\x00\x00\x00 v+ \x00\x00\x00\x00!\x81\xbd\x90\x00\x00\x00\x00\"V\r \x00\x00\x00\x00#j\xda\x10\x00" +
-	"\x00\x00\x00$5\xef \x00\x00\x00\x00%J\xbc\x10\x00\x00\x00\x00&\x15\xd1 \x00\x00\x00\x00'*\x9e\x10\x00\x00\x00\x00'\xfe\xed\xa0\x00\x00\x00\x00)\n\x80\x10\x00\x00\x00\x00)\xdeϠ\x00\x00\x00\x00*" +
-	"\xeab\x10\x00\x00\x00\x00+\xbe\xb1\xa0\x00\x00\x00\x00,\xd3~\x90\x00\x00\x00\x00-\x9e\x93\xa0\x00\x00\x00\x00.\xb3`\x90\x00\x00\x00\x00/~u\xa0\x00\x00\x00\x000\x93B\x90\x00\x00\x00\x001g\x92 \x00" +
-	"\x00\x00\x002s$\x90\x00\x00\x00\x003Gt \x00\x00\x00\x004S\x06\x90\x00\x00\x00\x005'V \x00\x00\x00\x0062\xe8\x90\x00\x00\x00\x007\a8 \x00\x00\x00\x008\x1c\x05\x10\x00\x00\x00\x008" +
-	"\xe7\x1a \x00\x00\x00\x009\xfb\xe7\x10\x00\x00\x00\x00:\xc6\xfc \x00\x00\x00\x00;\xdb\xc9\x10\x00\x00\x00\x00<\xb0\x18\xa0\x00\x00\x00\x00=\xbb\xab\x10\x00\x00\x00\x00>\x8f\xfa\xa0\x00\x00\x00\x00?\x9b\x8d\x10\x00" +
-	"\x00\x00\x00@oܠ\x00\x00\x00\x00A\x84\xa9\x90\x00\x00\x00\x00BO\xbe\xa0\x00\x00\x00\x00Cd\x8b\x90\x00\x00\x00\x00D/\xa0\xa0\x00\x00\x00\x00EDm\x90\x00\x00\x00\x00E\xf3\xd3 \x00\x00\x00\x00G" +
-	"-\x8a\x10\x00\x00\x00\x00Gӵ \x00\x00\x00\x00I\rl\x10\x00\x00\x00\x00I\xb3\x97 \x00\x00\x00\x00J\xedN\x10\x00\x00\x00\x00K\x9c\xb3\xa0\x00\x00\x00\x00L\xd6j\x90\x00\x00\x00\x00M|\x95\xa0\x00" +
-	"\x00\x00\x00N\xb6L\x90\x00\x00\x00\x00O\\w\xa0\x00\x00\x00\x00P\x96.\x90\x00\x00\x00\x00Q<Y\xa0\x00\x00\x00\x00Rv\x10\x90\x00\x00\x00\x00S\x1c;\xa0\x00\x00\x00\x00TU\xf2\x90\x00\x00\x00\x00T" +
-	"\xfc\x1d\xa0\x02\x01\x02\x03\x04\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x05\xff\xff\x8c\xf9\x00\x00\xff\xff\x9d\x90\x01\x04\xff\xff\x8f\x80\x00\b\xff\xff\x9d\x90\x01\f\xff\xff\x9d\x90\x01\x10\xff\xff\x9d\x90" +
-	"\x00\x14LMT\x00PDT\x00PST\x00PWT\x00PPT\x00MST\x00\nMST7\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00p\xb6{\xc9\x13\x02\x00\x00\x13\x02\x00\x00\x12\x00" +
-	"\x00\x00America/Fort_WayneTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" +
-	"\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00&\x00\x00\x00\a\x00\x00\x00\x1c\xff\xff\xff\xff^" +
-	"\x03\xfe\xa0\xff\xff\xff\xff\x9e\xa6,\x80\xff\xff\xff\xff\x9f\xba\xf9p\xff\xff\xff\xff\xa0\x86\x0e\x80\xff\xff\xff\xff\xa1\x9a\xdbp\xff\xff\xff\xff\xcaW\"\x80\xff\xff\xff\xff\xca\xd8Gp\xff\xff\xff\xffˈ\xfe\x80\xff" +
-	"\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2a\t\xf0\xff\xff\xff\xff\xd3u\xf3\x00\xff\xff\xff\xff\xd4@\xeb\xf0\xff\xff\xff\xff\xd5U\xd5\x00\xff\xff\xff\xff\xd6 \xcd\xf0\xff\xff\xff\xff\xd75\xb7\x00\xff\xff\xff\xff\xd8" +
-	"\x00\xaf\xf0\xff\xff\xff\xff\xd9\x15\x99\x00\xff\xff\xff\xff\xd9\xe0\x91\xf0\xff\xff\xff\xff\xda\xfe\xb5\x80\xff\xff\xff\xff\xdb\xc0s\xf0\xff\xff\xff\xff\xdcޗ\x80\xff\xff\xff\xffݩ\x90p\xff\xff\xff\xff\u07bey\x80\xff" +
-	"\xff\xff\xff߉rp\xff\xff\xff\xff\xe0\x9e[\x80\xff\xff\xff\xff\xe1iTp\xff\xff\xff\xff\xe2~=\x80\xff\xff\xff\xff\xe3I6p\xff\xff\xff\xff\xe4^\x1f\x80\xff\xff\xff\xff\xe8\xf2\x16\xf0\xff\xff\xff\xff\xea" +
-	"\a\x00\x00\xff\xff\xff\xff\xfe\xb8\x1c\xf0\xff\xff\xff\xff\xff\xa7\xff\xe0\x00\x00\x00\x00\x00\x97\xfe\xf0\x00\x00\x00\x00\x01\x87\xe1\xe0\x00\x00\x00\x00D/vp\x00\x00\x00\x00EDC`\x00\x00\x00\x00E\xf3\xa8\xf0\x02" +
-	"\x01\x02\x01\x02\x01\x02\x03\x04\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x05\x02\x05\x06\x05\x06\x05\x06\x05\x06\xff\xff\xaf:\x00\x00\xff\xff\xb9\xb0\x01\x04\xff\xff\xab\xa0\x00\b\xff\xff\xb9\xb0\x01" +
-	"\f\xff\xff\xb9\xb0\x01\x10\xff\xff\xb9\xb0\x00\x14\xff\xff\xc7\xc0\x01\x18LMT\x00CDT\x00CST\x00CWT\x00CPT\x00EST\x00EDT\x00\nEST5EDT,M3.2" +
-	".0,M11.1.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\x11Z\xde\xe4\x01\x00\x00\xe4\x01\x00\x00\x11\x00\x00\x00America/FortalezaTZ" +
-	"if2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\x00\x00\x00\x03\x00\x00\x00\f\xff\xff\xff\xff\x96\xaak\x18\xff\xff\xff\xff\xb8\x0fI\xe0\xff\xff\xff\xff\xb8\xfd@\xa0\xff\xff\xff" +
-	"\xff\xb9\xf140\xff\xff\xff\xff\xba\xdet \xff\xff\xff\xff\xda8\xae0\xff\xff\xff\xff\xda\xeb\xfa0\xff\xff\xff\xff\xdc\x19\xe1\xb0\xff\xff\xff\xffܹY \xff\xff\xff\xff\xdd\xfb\x150\xff\xff\xff\xffޛ\xde" +
-	" \xff\xff\xff\xff\xdfݚ0\xff\xff\xff\xff\xe0T3 \xff\xff\xff\xff\xf4\x97\xff\xb0\xff\xff\xff\xff\xf5\x05^ \xff\xff\xff\xff\xf6\xc0d0\xff\xff\xff\xff\xf7\x0e\x1e\xa0\xff\xff\xff\xff\xf8Q,0\xff\xff\xff" +
-	"\xff\xf8\xc7\xc5 \xff\xff\xff\xff\xfa\nҰ\xff\xff\xff\xff\xfa\xa8\xf8\xa0\xff\xff\xff\xff\xfb\xec\x060\xff\xff\xff\xff\xfc\x8b}\xa0\x00\x00\x00\x00\x1dɎ0\x00\x00\x00\x00\x1exנ\x00\x00\x00\x00\x1f\xa05" +
-	"\xb0\x00\x00\x00\x00 3Ϡ\x00\x00\x00\x00!\x81i0\x00\x00\x00\x00\"\vȠ\x00\x00\x00\x00#X\x10\xb0\x00\x00\x00\x00#\xe2p \x00\x00\x00\x00%7\xf2\xb0\x00\x00\x00\x00%\xd4\xc7 \x00\x00\x00" +
-	"\x007\xf6ư\x00\x00\x00\x008\xb8\x85 \x00\x00\x00\x009\xdf\xe30\x00\x00\x00\x009\xf2J \x00\x00\x00\x00;\xc8\xff\xb0\x00\x00\x00\x00<o\x0e\xa0\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\xff\xff\xdb\xe8\x00\x00\xff\xff\xe3\xe0\x01\x04\xff\xff\xd5\xd0\x00\bLMT\x00-02\x00-03\x00\n<-03>" +
-	"3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00M\x94\xc7Kp\x03\x00\x00p\x03\x00\x00\x11\x00\x00\x00America/Glace_BayTZif2\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00O\x00\x00\x00\x05\x00\x00\x00\x14\xff\xff\xff\xff\x80\xf1\xa84\xff\xff\xff\xff\x9e\xb8\x85`\xff\xff\xff\xff\x9f\xba\xddP\xff\xff\xff\xffˈ\xe2`\xff\xff\xff\xff" +
-	"\xd2#\xf4p\xff\xff\xff\xff\xd2`\xed\xd0\xff\xff\xff\xff\xe0\x9e?`\xff\xff\xff\xff\xe1i8P\x00\x00\x00\x00\x04`\xef`\x00\x00\x00\x00\x05P\xd2P\x00\x00\x00\x00\x06@\xd1`\x00\x00\x00\x00\a0\xb4P" +
-	"\x00\x00\x00\x00\b \xb3`\x00\x00\x00\x00\t\x10\x96P\x00\x00\x00\x00\n\x00\x95`\x00\x00\x00\x00\n\xf0xP\x00\x00\x00\x00\v\xe0w`\x00\x00\x00\x00\fٔ\xd0\x00\x00\x00\x00\r\xc0Y`\x00\x00\x00\x00" +
-	"\x0e\xb9v\xd0\x00\x00\x00\x00\x0f\xa9u\xe0\x00\x00\x00\x00\x10\x99X\xd0\x00\x00\x00\x00\x11\x89W\xe0\x00\x00\x00\x00\x12y:\xd0\x00\x00\x00\x00\x13i9\xe0\x00\x00\x00\x00\x14Y\x1c\xd0\x00\x00\x00\x00\x15I\x1b\xe0" +
-	"\x00\x00\x00\x00\x168\xfe\xd0\x00\x00\x00\x00\x17(\xfd\xe0\x00\x00\x00\x00\x18\"\x1bP\x00\x00\x00\x00\x19\b\xdf\xe0\x00\x00\x00\x00\x1a\x01\xfdP\x00\x00\x00\x00\x1a\xf1\xfc`\x00\x00\x00\x00\x1b\xe1\xdfP\x00\x00\x00\x00" +
-	"\x1c\xd1\xde`\x00\x00\x00\x00\x1d\xc1\xc1P\x00\x00\x00\x00\x1e\xb1\xc0`\x00\x00\x00\x00\x1f\xa1\xa3P\x00\x00\x00\x00 u\xf2\xe0\x00\x00\x00\x00!\x81\x85P\x00\x00\x00\x00\"U\xd4\xe0\x00\x00\x00\x00#j\xa1\xd0" +
-	"\x00\x00\x00\x00$5\xb6\xe0\x00\x00\x00\x00%J\x83\xd0\x00\x00\x00\x00&\x15\x98\xe0\x00\x00\x00\x00'*e\xd0\x00\x00\x00\x00'\xfe\xb5`\x00\x00\x00\x00)\nG\xd0\x00\x00\x00\x00)ޗ`\x00\x00\x00\x00" +
-	"*\xea)\xd0\x00\x00\x00\x00+\xbey`\x00\x00\x00\x00,\xd3FP\x00\x00\x00\x00-\x9e[`\x00\x00\x00\x00.\xb3(P\x00\x00\x00\x00/~=`\x00\x00\x00\x000\x93\nP\x00\x00\x00\x001gY\xe0" +
-	"\x00\x00\x00\x002r\xecP\x00\x00\x00\x003G;\xe0\x00\x00\x00\x004R\xceP\x00\x00\x00\x005'\x1d\xe0\x00\x00\x00\x0062\xb0P\x00\x00\x00\x007\x06\xff\xe0\x00\x00\x00\x008\x1b\xcc\xd0\x00\x00\x00\x00" +
-	"8\xe6\xe1\xe0\x00\x00\x00\x009\xfb\xae\xd0\x00\x00\x00\x00:\xc6\xc3\xe0\x00\x00\x00\x00;ې\xd0\x00\x00\x00\x00<\xaf\xe0`\x00\x00\x00\x00=\xbbr\xd0\x00\x00\x00\x00>\x8f\xc2`\x00\x00\x00\x00?\x9bT\xd0" +
-	"\x00\x00\x00\x00@o\xa4`\x00\x00\x00\x00A\x84qP\x00\x00\x00\x00BO\x86`\x00\x00\x00\x00CdSP\x00\x00\x00\x00D/h`\x00\x00\x00\x00ED5P\x00\x00\x00\x00E\xf3\x9a\xe0\x02\x01\x02\x03" +
-	"\x04\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\xff\xff\xc7\xcc\x00\x00\xff\xff\xd5\xd0\x01\x04\xff\xff\xc7\xc0\x00\b\xff\xff\xd5\xd0\x01\f\xff\xff\xd5\xd0\x01\x10LMT\x00ADT\x00AST\x00AWT" +
-	"\x00APT\x00\nAST4ADT,M3.2.0,M11.1.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\xbc\xc9I\xa3\x03\x00\x00\xa3\x03\x00\x00\x0f\x00\x00\x00A" +
-	"merica/GodthabTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00" +
-	"\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00X\x00\x00\x00\x04\x00\x00\x00\f\xff\xff\xff\xff\x9b\x80h\x00\x00\x00\x00" +
-	"\x00\x13M|P\x00\x00\x00\x00\x143\xfa\x90\x00\x00\x00\x00\x15#\xeb\x90\x00\x00\x00\x00\x16\x13ܐ\x00\x00\x00\x00\x17\x03͐\x00\x00\x00\x00\x17\xf3\xbe\x90\x00\x00\x00\x00\x18㯐\x00\x00\x00\x00\x19Ӡ" +
-	"\x90\x00\x00\x00\x00\x1aÑ\x90\x00\x00\x00\x00\x1b\xbc\xbd\x10\x00\x00\x00\x00\x1c\xac\xae\x10\x00\x00\x00\x00\x1d\x9c\x9f\x10\x00\x00\x00\x00\x1e\x8c\x90\x10\x00\x00\x00\x00\x1f|\x81\x10\x00\x00\x00\x00 lr\x10\x00\x00\x00" +
-	"\x00!\\c\x10\x00\x00\x00\x00\"LT\x10\x00\x00\x00\x00#<E\x10\x00\x00\x00\x00$,6\x10\x00\x00\x00\x00%\x1c'\x10\x00\x00\x00\x00&\f\x18\x10\x00\x00\x00\x00'\x05C\x90\x00\x00\x00\x00'\xf54" +
-	"\x90\x00\x00\x00\x00(\xe5%\x90\x00\x00\x00\x00)\xd5\x16\x90\x00\x00\x00\x00*\xc5\a\x90\x00\x00\x00\x00+\xb4\xf8\x90\x00\x00\x00\x00,\xa4\xe9\x90\x00\x00\x00\x00-\x94ڐ\x00\x00\x00\x00.\x84ː\x00\x00\x00" +
-	"\x00/t\xbc\x90\x00\x00\x00\x000d\xad\x90\x00\x00\x00\x001]\xd9\x10\x00\x00\x00\x002r\xb4\x10\x00\x00\x00\x003=\xbb\x10\x00\x00\x00\x004R\x96\x10\x00\x00\x00\x005\x1d\x9d\x10\x00\x00\x00\x0062x" +
-	"\x10\x00\x00\x00\x006\xfd\x7f\x10\x00\x00\x00\x008\x1b\x94\x90\x00\x00\x00\x008\xdda\x10\x00\x00\x00\x009\xfbv\x90\x00\x00\x00\x00:\xbdC\x10\x00\x00\x00\x00;\xdbX\x90\x00\x00\x00\x00<\xa6_\x90\x00\x00\x00" +
-	"\x00=\xbb:\x90\x00\x00\x00\x00>\x86A\x90\x00\x00\x00\x00?\x9b\x1c\x90\x00\x00\x00\x00@f#\x90\x00\x00\x00\x00A\x849\x10\x00\x00\x00\x00BF\x05\x90\x00\x00\x00\x00Cd\x1b\x10\x00\x00\x00\x00D%\xe7" +
-	"\x90\x00\x00\x00\x00EC\xfd\x10\x00\x00\x00\x00F\x05ɐ\x00\x00\x00\x00G#\xdf\x10\x00\x00\x00\x00G\xee\xe6\x10\x00\x00\x00\x00I\x03\xc1\x10\x00\x00\x00\x00I\xce\xc8\x10\x00\x00\x00\x00J\xe3\xa3\x10\x00\x00\x00" +
-	"\x00K\xae\xaa\x10\x00\x00\x00\x00L̿\x90\x00\x00\x00\x00M\x8e\x8c\x10\x00\x00\x00\x00N\xac\xa1\x90\x00\x00\x00\x00Onn\x10\x00\x00\x00\x00P\x8c\x83\x90\x00\x00\x00\x00QW\x8a\x90\x00\x00\x00\x00Rle" +
-	"\x90\x00\x00\x00\x00S7l\x90\x00\x00\x00\x00TLG\x90\x00\x00\x00\x00U\x17N\x90\x00\x00\x00\x00V,)\x90\x00\x00\x00\x00V\xf70\x90\x00\x00\x00\x00X\x15F\x10\x00\x00\x00\x00X\xd7\x12\x90\x00\x00\x00" +
-	"\x00Y\xf5(\x10\x00\x00\x00\x00Z\xb6\xf4\x90\x00\x00\x00\x00[\xd5\n\x10\x00\x00\x00\x00\\\xa0\x11\x10\x00\x00\x00\x00]\xb4\xec\x10\x00\x00\x00\x00^\x7f\xf3\x10\x00\x00\x00\x00_\x94\xce\x10\x00\x00\x00\x00`_\xd5" +
-	"\x10\x00\x00\x00\x00a}\xea\x90\x00\x00\x00\x00b?\xb7\x10\x00\x00\x00\x00c]̐\x00\x00\x00\x00d\x1f\x99\x10\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x03\xff\xffπ\x00\x00\xff\xff\xd5\xd0\x00\x04\xff\xff\xe3\xe0\x01\b\xff\xff\xe3\xe0\x00\bLMT\x00-03\x00-02\x00\n<-02>2\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1d" +
-	"\xf7\a ,\x06\x00\x00,\x06\x00\x00\x11\x00\x00\x00America/Goose_BayTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x98\x00" +
-	"\x00\x00\n\x00\x00\x00!\xff\xff\xff\xff^=<$\xff\xff\xff\xff\x9e\xb8~\x8c\xff\xff\xff\xff\x9f\xba\xd6|\xff\xff\xff\xff\xbe\x9eMl\xff\xff\xff\xff\xc0\xb818\xff\xff\xff\xff\xc1y\xef\xa8\xff\xff\xff\xff\xc2" +
-	"\x98\x138\xff\xff\xff\xff\xc3YѨ\xff\xff\xff\xff\xc4w\xf58\xff\xff\xff\xff\xc59\xb3\xa8\xff\xff\xff\xff\xc6a\x11\xb8\xff\xff\xff\xff\xc7\x19\x95\xa8\xff\xff\xff\xff\xc8@\xf3\xb8\xff\xff\xff\xff\xc9\x02\xb2(\xff" +
-	"\xff\xff\xff\xca ո\xff\xff\xff\xff\xca\xe2\x94(\xff\xff\xff\xff\xcc\x00\xb7\xb8\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2`\xe6\xc8\xff\xff\xff\xffӈD\xd8\xff\xff\xff\xff\xd4J\x03H\xff\xff\xff\xff\xd5" +
-	"h&\xd8\xff\xff\xff\xff\xd6)\xe5H\xff\xff\xff\xff\xd7H\b\xd8\xff\xff\xff\xff\xd8\t\xc7H\xff\xff\xff\xff\xd9'\xea\xd8\xff\xff\xff\xff\xd9\xe9\xa9H\xff\xff\xff\xff\xdb\x11\aX\xff\xff\xff\xff\xdb\xd2\xc5\xc8\xff" +
-	"\xff\xff\xff\xdc\xdetX\xff\xff\xff\xffݩmH\xff\xff\xff\xff\u07beVX\xff\xff\xff\xff߉OH\xff\xff\xff\xff\xe0\x9e8X\xff\xff\xff\xff\xe1i1H\xff\xff\xff\xff\xe2~\x1aX\xff\xff\xff\xff\xe3" +
-	"I\x13H\xff\xff\xff\xff\xe4]\xfcX\xff\xff\xff\xff\xe5(\xf5H\xff\xff\xff\xff\xe6G\x18\xd8\xff\xff\xff\xff\xe7\x12\x11\xc8\xff\xff\xff\xff\xe8&\xfa\xd8\xff\xff\xff\xff\xe8\xf1\xf3\xc8\xff\xff\xff\xff\xea\x06\xdc\xd8\xff" +
-	"\xff\xff\xff\xea\xd1\xd5\xc8\xff\xff\xff\xff\xeb\xe6\xbe\xd8\xff\xff\xff\xff챷\xc8\xff\xff\xff\xff\xedƠ\xd8\xff\xff\xff\xff\ueffeH\xff\xff\xff\xffﯽX\xff\xff\xff\xff\xf0\x9f\xa0H\xff\xff\xff\xff\xf1" +
-	"\x8f\x9fX\xff\xff\xff\xff\xf2\x7f\x82H\xff\xff\xff\xff\xf3o\x81X\xff\xff\xff\xff\xf4_dH\xff\xff\xff\xff\xf5OcX\xff\xff\xff\xff\xf6?FH\xff\xff\xff\xff\xf7/EX\xff\xff\xff\xff\xf8(b\xc8\xff" +
-	"\xff\xff\xff\xf8\xdakX\xff\xff\xff\xff\xf9\x0f.`\xff\xff\xff\xff\xfa\bK\xd0\xff\xff\xff\xff\xfa\xf8J\xe0\xff\xff\xff\xff\xfb\xe8-\xd0\xff\xff\xff\xff\xfc\xd8,\xe0\xff\xff\xff\xff\xfd\xc8\x0f\xd0\xff\xff\xff\xff\xfe" +
-	"\xb8\x0e\xe0\xff\xff\xff\xff\xff\xa7\xf1\xd0\x00\x00\x00\x00\x00\x97\xf0\xe0\x00\x00\x00\x00\x01\x87\xd3\xd0\x00\x00\x00\x00\x02w\xd2\xe0\x00\x00\x00\x00\x03p\xf0P\x00\x00\x00\x00\x04`\xef`\x00\x00\x00\x00\x05P\xd2P\x00" +
-	"\x00\x00\x00\x06@\xd1`\x00\x00\x00\x00\a0\xb4P\x00\x00\x00\x00\b \xb3`\x00\x00\x00\x00\t\x10\x96P\x00\x00\x00\x00\n\x00\x95`\x00\x00\x00\x00\n\xf0xP\x00\x00\x00\x00\v\xe0w`\x00\x00\x00\x00\f" +
-	"ٔ\xd0\x00\x00\x00\x00\r\xc0Y`\x00\x00\x00\x00\x0e\xb9v\xd0\x00\x00\x00\x00\x0f\xa9u\xe0\x00\x00\x00\x00\x10\x99X\xd0\x00\x00\x00\x00\x11\x89W\xe0\x00\x00\x00\x00\x12y:\xd0\x00\x00\x00\x00\x13i9\xe0\x00" +
-	"\x00\x00\x00\x14Y\x1c\xd0\x00\x00\x00\x00\x15I\x1b\xe0\x00\x00\x00\x00\x168\xfe\xd0\x00\x00\x00\x00\x17(\xfd\xe0\x00\x00\x00\x00\x18\"\x1bP\x00\x00\x00\x00\x19\b\xdf\xe0\x00\x00\x00\x00\x1a\x01\xfdP\x00\x00\x00\x00\x1a" +
-	"\xf1\xfc`\x00\x00\x00\x00\x1b\xe1\xdfP\x00\x00\x00\x00\x1c\xd1\xde`\x00\x00\x00\x00\x1d\xc1\xc1P\x00\x00\x00\x00\x1e\xb1\xc0`\x00\x00\x00\x00\x1f\xa1\xa3P\x00\x00\x00\x00 u\xd6\xfc\x00\x00\x00\x00!\x81il\x00" +
-	"\x00\x00\x00\"U\xb8\xfc\x00\x00\x00\x00#jw\xdc\x00\x00\x00\x00$5\x9a\xfc\x00\x00\x00\x00%Jg\xec\x00\x00\x00\x00&\x15|\xfc\x00\x00\x00\x00'*I\xec\x00\x00\x00\x00'\xfe\x99|\x00\x00\x00\x00)" +
-	"\n+\xec\x00\x00\x00\x00)\xde{|\x00\x00\x00\x00*\xea\r\xec\x00\x00\x00\x00+\xbe]|\x00\x00\x00\x00,\xd3*l\x00\x00\x00\x00-\x9e?|\x00\x00\x00\x00.\xb3\fl\x00\x00\x00\x00/~!|\x00" +
-	"\x00\x00\x000\x92\xeel\x00\x00\x00\x001g=\xfc\x00\x00\x00\x002r\xd0l\x00\x00\x00\x003G\x1f\xfc\x00\x00\x00\x004R\xb2l\x00\x00\x00\x005'\x01\xfc\x00\x00\x00\x0062\x94l\x00\x00\x00\x007" +
-	"\x06\xe3\xfc\x00\x00\x00\x008\x1b\xb0\xec\x00\x00\x00\x008\xe6\xc5\xfc\x00\x00\x00\x009\xfb\x92\xec\x00\x00\x00\x00:Ƨ\xfc\x00\x00\x00\x00;\xdbt\xec\x00\x00\x00\x00<\xaf\xc4|\x00\x00\x00\x00=\xbbV\xec\x00" +
-	"\x00\x00\x00>\x8f\xa6|\x00\x00\x00\x00?\x9b8\xec\x00\x00\x00\x00@o\x88|\x00\x00\x00\x00A\x84Ul\x00\x00\x00\x00BOj|\x00\x00\x00\x00Cd7l\x00\x00\x00\x00D/L|\x00\x00\x00\x00E" +
-	"D\x19l\x00\x00\x00\x00E\xf3~\xfc\x00\x00\x00\x00G-5\xec\x00\x00\x00\x00G\xd3`\xfc\x00\x00\x00\x00I\r\x17\xec\x00\x00\x00\x00I\xb3B\xfc\x00\x00\x00\x00J\xec\xf9\xec\x00\x00\x00\x00K\x9c_|\x00" +
-	"\x00\x00\x00L\xd6\x16l\x00\x00\x00\x00M|A|\x00\x00\x00\x00N\xb6\x14P\x01\x02\x01\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x06\x05\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03" +
-	"\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\b\a\b\a\b\a\b\a\b\a\b\a\b\a\b\a\b\a\b\a\b\a\b\a\b\a\b\a\b\a\b\a\b\a\b\a\b\a" +
-	"\b\a\b\a\b\a\b\t\b\a\b\a\b\a\b\a\b\a\b\a\b\a\b\a\b\a\b\a\b\a\b\a\b\a\b\a\b\a\b\a\b\a\b\a\b\a\b\a\b\a\b\a\b\a\b\xff\xff\xc7\\\x00" +
-	"\x00\xff\xffΔ\x00\x04\xff\xffܤ\x01\b\xff\xff\xce\xc8\x00\x04\xff\xff\xdc\xd8\x01\b\xff\xff\xdc\xd8\x01\f\xff\xff\xdc\xd8\x01\x10\xff\xff\xd5\xd0\x01\x14\xff\xff\xc7\xc0\x00\x18\xff\xff\xe3\xe0\x01\x1cLMT\x00N" +
-	"ST\x00NDT\x00NPT\x00NWT\x00ADT\x00AST\x00ADDT\x00\nAST4ADT,M3.2.0,M11.1.0\nPK\x03\x04\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\xe3\xc9I\xd0U\x03\x00\x00U\x03\x00\x00\x12\x00\x00\x00America/Grand_TurkTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00L\x00\x00\x00\x05\x00\x00\x00\x14\xff\xff\xff\xffi\x87\x1e0\xff\xff\xff\xff\x93\x0f\xb4\xfe\x00\x00\x00\x00\x11\x89e\xf0\x00\x00\x00\x00\x12yH\xe0\x00\x00\x00\x00\x13iG\xf0\x00\x00\x00\x00\x14" +
-	"Y*\xe0\x00\x00\x00\x00\x15I)\xf0\x00\x00\x00\x00\x169\f\xe0\x00\x00\x00\x00\x17)\v\xf0\x00\x00\x00\x00\x18\")`\x00\x00\x00\x00\x19\b\xed\xf0\x00\x00\x00\x00\x1a\x02\v`\x00\x00\x00\x00\x1a\xf2\np\x00" +
-	"\x00\x00\x00\x1b\xe1\xed`\x00\x00\x00\x00\x1c\xd1\xecp\x00\x00\x00\x00\x1d\xc1\xcf`\x00\x00\x00\x00\x1e\xb1\xcep\x00\x00\x00\x00\x1f\xa1\xb1`\x00\x00\x00\x00 v\x00\xf0\x00\x00\x00\x00!\x81\x93`\x00\x00\x00\x00\"" +
-	"U\xe2\xf0\x00\x00\x00\x00#j\xaf\xe0\x00\x00\x00\x00$5\xc4\xf0\x00\x00\x00\x00%J\x91\xe0\x00\x00\x00\x00&\x15\xa6\xf0\x00\x00\x00\x00'*s\xe0\x00\x00\x00\x00'\xfe\xc3p\x00\x00\x00\x00)\nU\xe0\x00" +
-	"\x00\x00\x00)ޥp\x00\x00\x00\x00*\xea7\xe0\x00\x00\x00\x00+\xbe\x87p\x00\x00\x00\x00,\xd3T`\x00\x00\x00\x00-\x9eip\x00\x00\x00\x00.\xb36`\x00\x00\x00\x00/~Kp\x00\x00\x00\x000" +
-	"\x93\x18`\x00\x00\x00\x001gg\xf0\x00\x00\x00\x002r\xfa`\x00\x00\x00\x003GI\xf0\x00\x00\x00\x004R\xdc`\x00\x00\x00\x005'+\xf0\x00\x00\x00\x0062\xbe`\x00\x00\x00\x007\a\r\xf0\x00" +
-	"\x00\x00\x008\x1b\xda\xe0\x00\x00\x00\x008\xe6\xef\xf0\x00\x00\x00\x009\xfb\xbc\xe0\x00\x00\x00\x00:\xc6\xd1\xf0\x00\x00\x00\x00;۞\xe0\x00\x00\x00\x00<\xaf\xeep\x00\x00\x00\x00=\xbb\x80\xe0\x00\x00\x00\x00>" +
-	"\x8f\xd0p\x00\x00\x00\x00?\x9bb\xe0\x00\x00\x00\x00@o\xb2p\x00\x00\x00\x00A\x84\x7f`\x00\x00\x00\x00BO\x94p\x00\x00\x00\x00Cda`\x00\x00\x00\x00D/vp\x00\x00\x00\x00EDC`\x00" +
-	"\x00\x00\x00E\xf3\xa8\xf0\x00\x00\x00\x00G-_\xe0\x00\x00\x00\x00Gӊ\xf0\x00\x00\x00\x00I\rA\xe0\x00\x00\x00\x00I\xb3l\xf0\x00\x00\x00\x00J\xed#\xe0\x00\x00\x00\x00K\x9c\x89p\x00\x00\x00\x00L" +
-	"\xd6@`\x00\x00\x00\x00M|kp\x00\x00\x00\x00N\xb6\"`\x00\x00\x00\x00O\\Mp\x00\x00\x00\x00P\x96\x04`\x00\x00\x00\x00Q</p\x00\x00\x00\x00Ru\xe6`\x00\x00\x00\x00S\x1c\x11p\x00" +
-	"\x00\x00\x00TU\xc8`\x00\x00\x00\x00T\xfb\xf3p\x00\x00\x00\x00Z\xa4\xd3\xf0\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03" +
-	"\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x04\x03\xff\xff\xbdP\x00\x00\xff\xff\xb8\x02\x00\x04\xff\xff\xb9\xb0\x00\b\xff\xff\xc7" +
-	"\xc0\x01\f\xff\xff\xc7\xc0\x00\x10LMT\x00KMT\x00EST\x00EDT\x00AST\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00q\xc9*;\xb1\x00\x00\x00\xb1\x00\x00\x00\x0f\x00\x00\x00America/GrenadaTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x10\xff\xff\xff\xffz敹\xff\xff\xff\xff\xcb\xf62\xc0\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2`\xed\xd0\x01\x03\x02\x01\xff\xff\xc2\a\x00\x00\xff\xff\xc7\xc0\x00" +
-	"\x04\xff\xff\xd5\xd0\x01\b\xff\xff\xd5\xd0\x01\fLMT\x00AST\x00APT\x00AWT\x00\nAST4\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00q\xc9*;\xb1\x00\x00\x00\xb1\x00\x00" +
-	"\x00\x12\x00\x00\x00America/GuadeloupeTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x10\xff\xff" +
-	"\xff\xffz敹\xff\xff\xff\xff\xcb\xf62\xc0\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2`\xed\xd0\x01\x03\x02\x01\xff\xff\xc2\a\x00\x00\xff\xff\xc7\xc0\x00\x04\xff\xff\xd5\xd0\x01\b\xff\xff\xd5\xd0\x01\fLM" +
-	"T\x00AST\x00APT\x00AWT\x00\nAST4\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xac\x8a\x83S\xd4\x00\x00\x00\xd4\x00\x00\x00\x11\x00\x00\x00America/Gu" +
-	"atemalaTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZ" +
-	"if2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\t\x00\x00\x00\x03\x00\x00\x00\f\xff\xff\xff\xff\x9f\x9d\xea\xdc\x00\x00\x00\x00\aU\xac`\x00\x00" +
-	"\x00\x00\a͖\xd0\x00\x00\x00\x00\x19,x`\x00\x00\x00\x00\x19\xcf\xe4P\x00\x00\x00\x00'\xea\xee\xe0\x00\x00\x00\x00(\xc8\\\xd0\x00\x00\x00\x00DTR`\x00\x00\x00\x00E\x1fKP\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\xff\xff\xab$\x00\x00\xff\xff\xb9\xb0\x01\x04\xff\xff\xab\xa0\x00\bLMT\x00CDT\x00CST\x00\nCST6\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcd\xc3v\xe3\xb3\x00\x00" +
-	"\x00\xb3\x00\x00\x00\x11\x00\x00\x00America/GuayaquilTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00" +
-	"\x10\xff\xff\xff\xffi\x87&X\xff\xff\xff\xff\xb6\xa4B\x18\x00\x00\x00\x00+\x16\xfc\xd0\x00\x00\x00\x00+q\xe6@\x01\x03\x02\x03\xff\xff\xb5(\x00\x00\xff\xff\xb6h\x00\x04\xff\xff\xc7\xc0\x01\b\xff\xff\xb9\xb0\x00" +
-	"\fLMT\x00QMT\x00-04\x00-05\x00\n<-05>5\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x05\xf3\x89\xb5\x00\x00\x00\xb5\x00\x00\x00\x0e\x00\x00\x00Ameri" +
-	"ca/GuyanaTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00" +
-	"TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x12\xff\xff\xff\xff\x92\x1d\x0f\x87\xff\xff\xff\xff\x98\xd9{@" +
-	"\x00\x00\x00\x00\n\x7f\x05\xbc\x00\x00\x00\x00)\xd5@\xc0\x01\x02\x03\x01\xff\xff\xc9y\x00\x00\xff\xff\xc7\xc0\x00\x04\xff\xff\xcbD\x00\b\xff\xff\xd5\xd0\x00\x0eLMT\x00-04\x00-0345\x00-0" +
-	"3\x00\n<-04>4\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00):\x17-\x88\x06\x00\x00\x88\x06\x00\x00\x0f\x00\x00\x00America/HalifaxTZif2" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa7\x00\x00\x00\x05\x00\x00\x00\x14\xff\xff\xff\xff\x80\xf1\xab\xa0\xff\xff\xff\xff\x9a\xe4\xde\xc0\xff\xff\xff\xff\x9b\xd6\x130\xff\xff\xff\xff\x9e\xb8" +
-	"\x85`\xff\xff\xff\xff\x9f\xba\xddP\xff\xff\xff\xff\xa2\x9d\x17@\xff\xff\xff\xff\xa30\xb10\xff\xff\xff\xff\xa4zV@\xff\xff\xff\xff\xa5\x1b\x1f0\xff\xff\xff\xff\xa6S\xa0\xc0\xff\xff\xff\xff\xa6\xfcR\xb0\xff\xff" +
-	"\xff\xff\xa8<\xbd@\xff\xff\xff\xff\xa8\xdc4\xb0\xff\xff\xff\xff\xaa\x1c\x9f@\xff\xff\xff\xff\xaa\xcd:0\xff\xff\xff\xff\xab\xfc\x81@\xff\xff\xff\xff\xac\xbf\x910\xff\xff\xff\xff\xad\xee\xd8@\xff\xff\xff\xff\xae\x8c" +
-	"\xfe0\xff\xff\xff\xff\xaf\xbcE@\xff\xff\xff\xff\xb0\x7fU0\xff\xff\xff\xff\xb1\xae\x9c@\xff\xff\xff\xff\xb2Kp\xb0\xff\xff\xff\xff\xb3\x8e~@\xff\xff\xff\xff\xb4$\xbb0\xff\xff\xff\xff\xb5n`@\xff\xff" +
-	"\xff\xff\xb6\x15\xc0\xb0\xff\xff\xff\xff\xb7NB@\xff\xff\xff\xff\xb8\b\x17\xb0\xff\xff\xff\xff\xb9$\xe9\xc0\xff\xff\xff\xff\xb9\xe7\xf9\xb0\xff\xff\xff\xff\xbb\x04\xcb\xc0\xff\xff\xff\xff\xbb\xd1\x160\xff\xff\xff\xff\xbd\x00" +
-	"]@\xff\xff\xff\xff\xbd\x9d1\xb0\xff\xff\xff\xff\xbe\xf2\xb4@\xff\xff\xff\xff\xbf\x90\xda0\xff\xff\xff\xff\xc0\xd3\xe7\xc0\xff\xff\xff\xff\xc1^G0\xff\xff\xff\xff\u008d\x8e@\xff\xff\xff\xff\xc3P\x9e0\xff\xff" +
-	"\xff\xff\xc4mp@\xff\xff\xff\xff\xc50\x800\xff\xff\xff\xff\xc6r<@\xff\xff\xff\xff\xc7\x10b0\xff\xff\xff\xff\xc86n\xc0\xff\xff\xff\xff\xc8\xf9~\xb0\xff\xff\xff\xff\xca\x16P\xc0\xff\xff\xff\xff\xca\xd9" +
-	"`\xb0\xff\xff\xff\xffˈ\xe2`\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2`\xed\xd0\xff\xff\xff\xff\xd3u\xd6\xe0\xff\xff\xff\xff\xd4@\xcf\xd0\xff\xff\xff\xff\xd5U\xb8\xe0\xff\xff\xff\xff\xd6 \xb1\xd0\xff\xff" +
-	"\xff\xff\xd75\x9a\xe0\xff\xff\xff\xff\xd8\x00\x93\xd0\xff\xff\xff\xff\xd9\x15|\xe0\xff\xff\xff\xff\xd9\xe0u\xd0\xff\xff\xff\xff\xdc\xde{`\xff\xff\xff\xffݩtP\xff\xff\xff\xff\u07be]`\xff\xff\xff\xff߉" +
-	"VP\xff\xff\xff\xff\xe0\x9e?`\xff\xff\xff\xff\xe1i8P\xff\xff\xff\xff\xe2~!`\xff\xff\xff\xff\xe3I\x1aP\xff\xff\xff\xff\xe6G\x1f\xe0\xff\xff\xff\xff\xe7\x12\x18\xd0\xff\xff\xff\xff\xe8'\x01\xe0\xff\xff" +
-	"\xff\xff\xe8\xf1\xfa\xd0\xff\xff\xff\xff\xea\x06\xe3\xe0\xff\xff\xff\xff\xea\xd1\xdc\xd0\xff\xff\xff\xff\xeb\xe6\xc5\xe0\xff\xff\xff\xff챾\xd0\xff\xff\xff\xff\xf1\x8f\xa6`\xff\xff\xff\xff\xf2\x7f\x89P\xff\xff\xff\xff\xf3o" +
-	"\x88`\xff\xff\xff\xff\xf4_kP\xff\xff\xff\xff\xf5Oj`\xff\xff\xff\xff\xf6?MP\xff\xff\xff\xff\xf7/L`\xff\xff\xff\xff\xf8(i\xd0\xff\xff\xff\xff\xf9\x0f.`\xff\xff\xff\xff\xfa\bK\xd0\xff\xff" +
-	"\xff\xff\xfa\xf8J\xe0\xff\xff\xff\xff\xfb\xe8-\xd0\xff\xff\xff\xff\xfc\xd8,\xe0\xff\xff\xff\xff\xfd\xc8\x0f\xd0\xff\xff\xff\xff\xfe\xb8\x0e\xe0\xff\xff\xff\xff\xff\xa7\xf1\xd0\x00\x00\x00\x00\x00\x97\xf0\xe0\x00\x00\x00\x00\x01\x87" +
-	"\xd3\xd0\x00\x00\x00\x00\x02w\xd2\xe0\x00\x00\x00\x00\x03p\xf0P\x00\x00\x00\x00\x04`\xef`\x00\x00\x00\x00\x05P\xd2P\x00\x00\x00\x00\x06@\xd1`\x00\x00\x00\x00\a0\xb4P\x00\x00\x00\x00\b \xb3`\x00\x00" +
-	"\x00\x00\t\x10\x96P\x00\x00\x00\x00\n\x00\x95`\x00\x00\x00\x00\n\xf0xP\x00\x00\x00\x00\v\xe0w`\x00\x00\x00\x00\fٔ\xd0\x00\x00\x00\x00\r\xc0Y`\x00\x00\x00\x00\x0e\xb9v\xd0\x00\x00\x00\x00\x0f\xa9" +
-	"u\xe0\x00\x00\x00\x00\x10\x99X\xd0\x00\x00\x00\x00\x11\x89W\xe0\x00\x00\x00\x00\x12y:\xd0\x00\x00\x00\x00\x13i9\xe0\x00\x00\x00\x00\x14Y\x1c\xd0\x00\x00\x00\x00\x15I\x1b\xe0\x00\x00\x00\x00\x168\xfe\xd0\x00\x00" +
-	"\x00\x00\x17(\xfd\xe0\x00\x00\x00\x00\x18\"\x1bP\x00\x00\x00\x00\x19\b\xdf\xe0\x00\x00\x00\x00\x1a\x01\xfdP\x00\x00\x00\x00\x1a\xf1\xfc`\x00\x00\x00\x00\x1b\xe1\xdfP\x00\x00\x00\x00\x1c\xd1\xde`\x00\x00\x00\x00\x1d\xc1" +
-	"\xc1P\x00\x00\x00\x00\x1e\xb1\xc0`\x00\x00\x00\x00\x1f\xa1\xa3P\x00\x00\x00\x00 u\xf2\xe0\x00\x00\x00\x00!\x81\x85P\x00\x00\x00\x00\"U\xd4\xe0\x00\x00\x00\x00#j\xa1\xd0\x00\x00\x00\x00$5\xb6\xe0\x00\x00" +
-	"\x00\x00%J\x83\xd0\x00\x00\x00\x00&\x15\x98\xe0\x00\x00\x00\x00'*e\xd0\x00\x00\x00\x00'\xfe\xb5`\x00\x00\x00\x00)\nG\xd0\x00\x00\x00\x00)ޗ`\x00\x00\x00\x00*\xea)\xd0\x00\x00\x00\x00+\xbe" +
-	"y`\x00\x00\x00\x00,\xd3FP\x00\x00\x00\x00-\x9e[`\x00\x00\x00\x00.\xb3(P\x00\x00\x00\x00/~=`\x00\x00\x00\x000\x93\nP\x00\x00\x00\x001gY\xe0\x00\x00\x00\x002r\xecP\x00\x00" +
-	"\x00\x003G;\xe0\x00\x00\x00\x004R\xceP\x00\x00\x00\x005'\x1d\xe0\x00\x00\x00\x0062\xb0P\x00\x00\x00\x007\x06\xff\xe0\x00\x00\x00\x008\x1b\xcc\xd0\x00\x00\x00\x008\xe6\xe1\xe0\x00\x00\x00\x009\xfb" +
-	"\xae\xd0\x00\x00\x00\x00:\xc6\xc3\xe0\x00\x00\x00\x00;ې\xd0\x00\x00\x00\x00<\xaf\xe0`\x00\x00\x00\x00=\xbbr\xd0\x00\x00\x00\x00>\x8f\xc2`\x00\x00\x00\x00?\x9bT\xd0\x00\x00\x00\x00@o\xa4`\x00\x00" +
-	"\x00\x00A\x84qP\x00\x00\x00\x00BO\x86`\x00\x00\x00\x00CdSP\x00\x00\x00\x00D/h`\x00\x00\x00\x00ED5P\x00\x00\x00\x00E\xf3\x9a\xe0\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x03\x04\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\xff\xff\xc4`\x00\x00\xff\xff\xd5\xd0\x01\x04\xff\xff\xc7\xc0\x00\b\xff\xff\xd5\xd0\x01\f\xff\xff\xd5" +
-	"\xd0\x01\x10LMT\x00ADT\x00AST\x00AWT\x00APT\x00\nAST4ADT,M3.2.0,M11.1.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\a\x1c\x9e\x9a]\x04\x00\x00]\x04\x00\x00\x0e\x00\x00\x00America/HavanaTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00j\x00\x00" +
-	"\x00\x04\x00\x00\x00\x10\xff\xff\xff\xffi\x87(\xb8\xff\xff\xff\xff\xacb\u0080\xff\xff\xff\xff\xb1ӔP\xff\xff\xff\xff\xb2t]@\xff\xff\xff\xff\xc8[f\xd0\xff\xff\xff\xff\xc8\xd3Q@\xff\xff\xff\xff\xca;" +
-	"H\xd0\xff\xff\xff\xffʼm\xc0\xff\xff\xff\xff\xcc$eP\xff\xff\xff\xff̜O\xc0\xff\xff\xff\xff\xd1\xc4\vP\xff\xff\xff\xff\xd2;\xf5\xc0\xff\xff\xff\xffӣ\xedP\xff\xff\xff\xff\xd4\x1b\xd7\xc0\xff\xff" +
-	"\xff\xff\xf7`\x05\xd0\xff\xff\xff\xff\xf7\xff}@\xff\xff\xff\xff\xf9=D\xd0\xff\xff\xff\xff\xf9\xe3S\xc0\xff\xff\xff\xff\xfa\xdb;\xd0\xff\xff\xff\xff\xfb\xa7\x86@\xff\xff\xff\xff\xfcũ\xd0\xff\xff\xff\xff\xfd\x87" +
-	"h@\xff\xff\xff\xff\xfe\xb8\x00\xd0\xff\xff\xff\xff\xff\xa7\xe3\xc0\x00\x00\x00\x00\x00\x97\xe2\xd0\x00\x00\x00\x00\x01\x87\xc5\xc0\x00\x00\x00\x00\x02w\xc4\xd0\x00\x00\x00\x00\x03p\xe2@\x00\x00\x00\x00\x04`\xe1P\x00\x00" +
-	"\x00\x00\x055\x14\xc0\x00\x00\x00\x00\x06@\xc3P\x00\x00\x00\x00\a\x16H@\x00\x00\x00\x00\b \xa5P\x00\x00\x00\x00\b\xf7{\xc0\x00\x00\x00\x00\n\x00\x87P\x00\x00\x00\x00\n\xf0j@\x00\x00\x00\x00\v\xe0" +
-	"iP\x00\x00\x00\x00\fن\xc0\x00\x00\x00\x00\r\xc0KP\x00\x00\x00\x00\x0e\xb9h\xc0\x00\x00\x00\x00\x0f\xb2\xa2P\x00\x00\x00\x00\x10}\x9b@\x00\x00\x00\x00\x11Q\xea\xd0\x00\x00\x00\x00\x12f\xb7\xc0\x00\x00" +
-	"\x00\x00\x131\xcc\xd0\x00\x00\x00\x00\x14F\x99\xc0\x00\x00\x00\x00\x15[\x82\xd0\x00\x00\x00\x00\x16&{\xc0\x00\x00\x00\x00\x17;d\xd0\x00\x00\x00\x00\x18\x06]\xc0\x00\x00\x00\x00\x19\x1bF\xd0\x00\x00\x00\x00\x19\xe6" +
-	"?\xc0\x00\x00\x00\x00\x1a\xfb(\xd0\x00\x00\x00\x00\x1b\xcf\\@\x00\x00\x00\x00\x1c\xdb\n\xd0\x00\x00\x00\x00\x1d\xaf>@\x00\x00\x00\x00\x1ezSP\x00\x00\x00\x00\x1f\x8f @\x00\x00\x00\x00 Z5P\x00\x00" +
-	"\x00\x00!o\x02@\x00\x00\x00\x00\"CQ\xd0\x00\x00\x00\x00#N\xe4@\x00\x00\x00\x00$#3\xd0\x00\x00\x00\x00%.\xc6@\x00\x00\x00\x00&\x15\x8a\xd0\x00\x00\x00\x00'\x17\xe2\xc0\x00\x00\x00\x00'\xfe" +
-	"\xa7P\x00\x00\x00\x00(\xf7\xd2\xd0\x00\x00\x00\x00)މP\x00\x00\x00\x00*״\xd0\x00\x00\x00\x00+\xbekP\x00\x00\x00\x00,\xb7\x96\xd0\x00\x00\x00\x00-\x9eMP\x00\x00\x00\x00.\x97x\xd0\x00\x00" +
-	"\x00\x00/~/P\x00\x00\x00\x000wZ\xd0\x00\x00\x00\x001gK\xd0\x00\x00\x00\x002W<\xd0\x00\x00\x00\x003G-\xd0\x00\x00\x00\x004@YP\x00\x00\x00\x005\x1d\xd5P\x00\x00\x00\x0062" +
-	"\xb0P\x00\x00\x00\x006\xfd\xb7P\x00\x00\x00\x008\x1b\xcc\xd0\x00\x00\x00\x008\xe6\xd3\xd0\x00\x00\x00\x009\xfb\xae\xd0\x00\x00\x00\x00:Ƶ\xd0\x00\x00\x00\x00;ې\xd0\x00\x00\x00\x00<\xaf\xd2P\x00\x00" +
-	"\x00\x00=\xbbr\xd0\x00\x00\x00\x00>\x8f\xb4P\x00\x00\x00\x00?\x9bT\xd0\x00\x00\x00\x00@f[\xd0\x00\x00\x00\x00ED5P\x00\x00\x00\x00E\xf3\x8c\xd0\x00\x00\x00\x00G$\x17P\x00\x00\x00\x00G\xdc" +
-	"\xa9P\x00\x00\x00\x00I\x03\xf9P\x00\x00\x00\x00I\xb3P\xd0\x00\x00\x00\x00J\xe3\xdbP\x00\x00\x00\x00K\x9cmP\x00\x00\x00\x00L\xcc\xf7\xd0\x00\x00\x00\x00M\x85\x89\xd0\x00\x00\x00\x00N\xbfN\xd0\x00\x00" +
-	"\x00\x00Ow\xe0\xd0\x00\x00\x00\x00P\x95\xf6P\x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03" +
-	"\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03" +
-	"\xff\xff\xb2\xc8\x00\x00\xff\xff\xb2\xc0\x00\x04\xff\xff\xc7\xc0\x01\b\xff\xff\xb9\xb0\x00\fLMT\x00HMT\x00CDT\x00CST\x00\nCST5CDT,M3.2.0/0,M1" +
-	"1.1.0/1\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe4MS\x99\x1e\x01\x00\x00\x1e\x01\x00\x00\x12\x00\x00\x00America/HermosilloTZif" +
-	"2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x00\x00\x00\x05\x00\x00\x00\x14\xff\xff\xff\xff\xa5\xb6\xe8p\xff\xff\xff\xff\xaf\xf2n\xe0\xff\xff\xff\xff\xb6fV`\xff\xff\xff\xff\xb7" +
-	"C\xd2`\xff\xff\xff\xff\xb8\f6`\xff\xff\xff\xff\xb8\xfd\x86\xf0\xff\xff\xff\xff\xcb\xeaq`\xff\xff\xff\xffؑ\xb4\xf0\x00\x00\x00\x00\x00\x00p\x80\x00\x00\x00\x001g\x84\x10\x00\x00\x00\x002s\x16\x80\x00" +
-	"\x00\x00\x003Gf\x10\x00\x00\x00\x004R\xf8\x80\x00\x00\x00\x005'H\x10\x00\x00\x00\x0062ڀ\x01\x02\x01\x03\x01\x02\x01\x04\x01\x03\x01\x03\x01\x03\x01\xff\xff\x97\xf8\x00\x00\xff\xff\x9d\x90\x00\x04\xff\xff" +
-	"\xab\xa0\x00\b\xff\xff\xab\xa0\x01\f\xff\xff\x8f\x80\x00\x10LMT\x00MST\x00CST\x00MDT\x00PST\x00\nMST7\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00p\xb6{\xc9" +
-	"\x13\x02\x00\x00\x13\x02\x00\x00\x1c\x00\x00\x00America/Indiana/IndianapolisTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00&\x00\x00\x00\a\x00\x00\x00\x1c\xff\xff\xff\xff^\x03\xfe\xa0\xff\xff\xff\xff\x9e\xa6,\x80\xff\xff\xff\xff\x9f\xba\xf9p\xff\xff\xff\xff\xa0\x86\x0e\x80\xff\xff\xff\xff\xa1\x9a\xdbp\xff\xff\xff\xff\xca" +
-	"W\"\x80\xff\xff\xff\xff\xca\xd8Gp\xff\xff\xff\xffˈ\xfe\x80\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2a\t\xf0\xff\xff\xff\xff\xd3u\xf3\x00\xff\xff\xff\xff\xd4@\xeb\xf0\xff\xff\xff\xff\xd5U\xd5\x00\xff" +
-	"\xff\xff\xff\xd6 \xcd\xf0\xff\xff\xff\xff\xd75\xb7\x00\xff\xff\xff\xff\xd8\x00\xaf\xf0\xff\xff\xff\xff\xd9\x15\x99\x00\xff\xff\xff\xff\xd9\xe0\x91\xf0\xff\xff\xff\xff\xda\xfe\xb5\x80\xff\xff\xff\xff\xdb\xc0s\xf0\xff\xff\xff\xff\xdc" +
-	"ޗ\x80\xff\xff\xff\xffݩ\x90p\xff\xff\xff\xff\u07bey\x80\xff\xff\xff\xff߉rp\xff\xff\xff\xff\xe0\x9e[\x80\xff\xff\xff\xff\xe1iTp\xff\xff\xff\xff\xe2~=\x80\xff\xff\xff\xff\xe3I6p\xff" +
-	"\xff\xff\xff\xe4^\x1f\x80\xff\xff\xff\xff\xe8\xf2\x16\xf0\xff\xff\xff\xff\xea\a\x00\x00\xff\xff\xff\xff\xfe\xb8\x1c\xf0\xff\xff\xff\xff\xff\xa7\xff\xe0\x00\x00\x00\x00\x00\x97\xfe\xf0\x00\x00\x00\x00\x01\x87\xe1\xe0\x00\x00\x00\x00D" +
-	"/vp\x00\x00\x00\x00EDC`\x00\x00\x00\x00E\xf3\xa8\xf0\x02\x01\x02\x01\x02\x01\x02\x03\x04\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x05\x02\x05\x06\x05\x06\x05\x06\x05\x06\xff\xff\xaf" +
-	":\x00\x00\xff\xff\xb9\xb0\x01\x04\xff\xff\xab\xa0\x00\b\xff\xff\xb9\xb0\x01\f\xff\xff\xb9\xb0\x01\x10\xff\xff\xb9\xb0\x00\x14\xff\xff\xc7\xc0\x01\x18LMT\x00CDT\x00CST\x00CWT\x00CPT\x00E" +
-	"ST\x00EDT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00$ \x873\xf8\x03\x00\x00\xf8\x03\x00\x00\x14\x00\x00" +
-	"\x00America/Indiana/KnoxTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00]\x00\x00\x00\x06\x00\x00\x00\x18\xff\xff\xff\xff" +
-	"^\x03\xfe\xa0\xff\xff\xff\xff\x9e\xa6,\x80\xff\xff\xff\xff\x9f\xba\xf9p\xff\xff\xff\xff\xa0\x86\x0e\x80\xff\xff\xff\xff\xa1\x9a\xdbp\xff\xff\xff\xffˈ\xfe\x80\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2a\t\xf0" +
-	"\xff\xff\xff\xff\xd5U\xd5\x00\xff\xff\xff\xff\xd6 \xcd\xf0\xff\xff\xff\xff\xd75\xb7\x00\xff\xff\xff\xff\xd8\x00\xaf\xf0\xff\xff\xff\xff\xd9\x15\x99\x00\xff\xff\xff\xff\xd9\xe0\x91\xf0\xff\xff\xff\xff\xda\xfe\xb5\x80\xff\xff\xff\xff" +
-	"\xdb\xc0s\xf0\xff\xff\xff\xff\xdcޗ\x80\xff\xff\xff\xffݩ\x90p\xff\xff\xff\xff\u07bey\x80\xff\xff\xff\xff߉rp\xff\xff\xff\xff\xe0\x9e[\x80\xff\xff\xff\xff\xe1iTp\xff\xff\xff\xff\xe2~=\x80" +
-	"\xff\xff\xff\xff\xe3I6p\xff\xff\xff\xff\xe4^\x1f\x80\xff\xff\xff\xff\xe5W<\xf0\xff\xff\xff\xff\xe6G<\x00\xff\xff\xff\xff\xe77\x1e\xf0\xff\xff\xff\xff\xe8'\x1e\x00\xff\xff\xff\xff\xe8\xf2\x16\xf0\xff\xff\xff\xff" +
-	"\xea\a\x00\x00\xff\xff\xff\xff\xea\xd1\xf8\xf0\xff\xff\xff\xff\xeb\xe6\xe2\x00\xff\xff\xff\xff\xec\xd6\xc4\xf0\xff\xff\xff\xff\xed\xc6\xc4\x00\xff\xff\xff\xff\xee\xbf\xe1p\xff\xff\xff\xff\xef\xaf\xe0\x80\xff\xff\xff\xff\xf0\x9f\xc3p" +
-	"\xff\xff\xff\xff\xf1\x8f\u0080\xff\xff\xff\xff\xf4_\x87p\xff\xff\xff\xff\xfa\xf8g\x00\xff\xff\xff\xff\xfb\xe8I\xf0\xff\xff\xff\xff\xfc\xd8I\x00\xff\xff\xff\xff\xfd\xc8+\xf0\xff\xff\xff\xff\xfe\xb8+\x00\xff\xff\xff\xff" +
-	"\xff\xa8\r\xf0\x00\x00\x00\x00\x00\x98\r\x00\x00\x00\x00\x00\x01\x87\xef\xf0\x00\x00\x00\x00\x02w\xef\x00\x00\x00\x00\x00\x03q\fp\x00\x00\x00\x00\x04a\v\x80\x00\x00\x00\x00\x05P\xeep\x00\x00\x00\x00\x06@\xed\x80" +
-	"\x00\x00\x00\x00\a0\xd0p\x00\x00\x00\x00\a\x8d'\x80\x00\x00\x00\x00\t\x10\xb2p\x00\x00\x00\x00\t\xad\xa3\x00\x00\x00\x00\x00\n\xf0\x94p\x00\x00\x00\x00\v\xe0\x93\x80\x00\x00\x00\x00\fٰ\xf0\x00\x00\x00\x00" +
-	"\r\xc0u\x80\x00\x00\x00\x00\x0e\xb9\x92\xf0\x00\x00\x00\x00\x0f\xa9\x92\x00\x00\x00\x00\x00\x10\x99t\xf0\x00\x00\x00\x00\x11\x89t\x00\x00\x00\x00\x00\x12yV\xf0\x00\x00\x00\x00\x13iV\x00\x00\x00\x00\x00\x14Y8\xf0" +
-	"\x00\x00\x00\x00\x15I8\x00\x00\x00\x00\x00\x169\x1a\xf0\x00\x00\x00\x00\x17)\x1a\x00\x00\x00\x00\x00\x18\"7p\x00\x00\x00\x00\x19\b\xfc\x00\x00\x00\x00\x00\x1a\x02\x19p\x00\x00\x00\x00\x1a\xf2\x18\x80\x00\x00\x00\x00" +
-	"\x1b\xe1\xfbp\x00\x00\x00\x00\x1c\xd1\xfa\x80\x00\x00\x00\x00\x1d\xc1\xddp\x00\x00\x00\x00\x1e\xb1܀\x00\x00\x00\x00\x1f\xa1\xbfp\x00\x00\x00\x00 v\x0f\x00\x00\x00\x00\x00!\x81\xa1p\x00\x00\x00\x00\"U\xf1\x00" +
-	"\x00\x00\x00\x00#j\xbd\xf0\x00\x00\x00\x00$5\xd3\x00\x00\x00\x00\x00%J\x9f\xf0\x00\x00\x00\x00&\x15\xb5\x00\x00\x00\x00\x00'*\x81\xf0\x00\x00\x00\x00'\xfeр\x00\x00\x00\x00)\nc\xf0\x00\x00\x00\x00" +
-	"D/vp\x00\x00\x00\x00EDQp\x00\x00\x00\x00E\xf3\xb7\x00\x02\x01\x02\x01\x02\x03\x04\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x05\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x05\x01\x02\x01\xff\xff\xae\xca\x00\x00\xff" +
-	"\xff\xb9\xb0\x01\x04\xff\xff\xab\xa0\x00\b\xff\xff\xb9\xb0\x01\f\xff\xff\xb9\xb0\x01\x10\xff\xff\xb9\xb0\x00\x14LMT\x00CDT\x00CST\x00CWT\x00CPT\x00EST\x00\nCST6CD" +
-	"T,M3.2.0,M11.1.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00M/U\x9f7\x02\x00\x007\x02\x00\x00\x17\x00\x00\x00America/India" +
-	"na/MarengoTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00" +
-	"\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00*\x00\x00\x00\a\x00\x00\x00\x1c\xff\xff\xff\xff^\x03\xfe\xa0\xff\xff\xff\xff\x9e\xa6," +
-	"\x80\xff\xff\xff\xff\x9f\xba\xf9p\xff\xff\xff\xff\xa0\x86\x0e\x80\xff\xff\xff\xff\xa1\x9a\xdbp\xff\xff\xff\xffˈ\xfe\x80\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2a\t\xf0\xff\xff\xff\xff\xdcޗ\x80\xff\xff\xff" +
-	"\xffݩ\x90p\xff\xff\xff\xff\xe2~=\x80\xff\xff\xff\xff\xe3I6p\xff\xff\xff\xff\xe4^\x1f\x80\xff\xff\xff\xff\xe5)\x18p\xff\xff\xff\xff\xe6G<\x00\xff\xff\xff\xff\xe7\x124\xf0\xff\xff\xff\xff\xe8'\x1e" +
-	"\x00\xff\xff\xff\xff\xe8\xf2\x16\xf0\xff\xff\xff\xff\xea\a\x00\x00\xff\xff\xff\xff\xea\xd1\xf8\xf0\xff\xff\xff\xff\xeb\xe6\xe2\x00\xff\xff\xff\xff\xec\xb1\xda\xf0\xff\xff\xff\xff\xed\xc6\xc4\x00\xff\xff\xff\xff\ue47c\xf0\xff\xff\xff" +
-	"\xff\xef\xaf\xe0\x80\xff\xff\xff\xff\xfe\xb8\x1c\xf0\xff\xff\xff\xff\xff\xa7\xff\xe0\x00\x00\x00\x00\x00\x97\xfe\xf0\x00\x00\x00\x00\x01\x87\xe1\xe0\x00\x00\x00\x00\x02w\xe0\xf0\x00\x00\x00\x00\x03p\xfe`\x00\x00\x00\x00\x04`\xfd" +
-	"p\x00\x00\x00\x00\x05P\xe0`\x00\x00\x00\x00\x06@\xdfp\x00\x00\x00\x00\a0\xc2`\x00\x00\x00\x00\a\x8d\x19p\x00\x00\x00\x00\t\x10\xb2p\x00\x00\x00\x00\t\xad\x94\xf0\x00\x00\x00\x00\n\xf0\x86`\x00\x00\x00" +
-	"\x00D/vp\x00\x00\x00\x00EDC`\x00\x00\x00\x00E\xf3\xa8\xf0\x02\x01\x02\x01\x02\x03\x04\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x01\x05\x06\x05" +
-	"\x06\x05\x06\xff\xff\xaf\r\x00\x00\xff\xff\xb9\xb0\x01\x04\xff\xff\xab\xa0\x00\b\xff\xff\xb9\xb0\x01\f\xff\xff\xb9\xb0\x01\x10\xff\xff\xb9\xb0\x00\x14\xff\xff\xc7\xc0\x01\x18LMT\x00CDT\x00CST\x00CWT" +
-	"\x00CPT\x00EST\x00EDT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xd8N\x8c\xab\x02\x00\x00\xab" +
-	"\x02\x00\x00\x1a\x00\x00\x00America/Indiana/PetersburgTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x008" +
-	"\x00\x00\x00\x06\x00\x00\x00\x18\xff\xff\xff\xff^\x03\xfe\xa0\xff\xff\xff\xff\x9e\xa6,\x80\xff\xff\xff\xff\x9f\xba\xf9p\xff\xff\xff\xff\xa0\x86\x0e\x80\xff\xff\xff\xff\xa1\x9a\xdbp\xff\xff\xff\xffˈ\xfe\x80\xff\xff\xff\xff" +
-	"\xd2#\xf4p\xff\xff\xff\xff\xd2a\t\xf0\xff\xff\xff\xff\xe4g=\xe0\xff\xff\xff\xff\xe5)\x18p\xff\xff\xff\xff\xe6G<\x00\xff\xff\xff\xff\xe7\x124\xf0\xff\xff\xff\xff\xe8'\x1e\x00\xff\xff\xff\xff\xe8\xf2\x16\xf0" +
-	"\xff\xff\xff\xff\xea\a\x00\x00\xff\xff\xff\xff\xea\xd1\xf8\xf0\xff\xff\xff\xff\xeb\xe6\xe2\x00\xff\xff\xff\xff\xec\xb1\xda\xf0\xff\xff\xff\xff\xed\xc6\xc4\x00\xff\xff\xff\xff\ue47c\xf0\xff\xff\xff\xff\xef\xaf\xe0\x80\xff\xff\xff\xff" +
-	"\xf0\x9f\xc3p\xff\xff\xff\xff\xf1\x8f\u0080\xff\xff\xff\xff\xf2\x7f\xa5p\xff\xff\xff\xff\xf3o\xa4\x80\xff\xff\xff\xff\xf4_\x87p\xff\xff\xff\xff\xf5O\x86\x80\xff\xff\xff\xff\xf6?ip\xff\xff\xff\xff\xf7/h\x80" +
-	"\xff\xff\xff\xff\xfa\bg\xf0\xff\xff\xff\xff\xfa\xf8g\x00\xff\xff\xff\xff\xfb\xe8I\xf0\xff\xff\xff\xff\xfc\xd8I\x00\xff\xff\xff\xff\xfd\xc8+\xf0\xff\xff\xff\xff\xfe\xb8+\x00\xff\xff\xff\xff\xff\xa8\r\xf0\x00\x00\x00\x00" +
-	"\x00\x98\r\x00\x00\x00\x00\x00\x01\x87\xef\xf0\x00\x00\x00\x00\x02w\xef\x00\x00\x00\x00\x00\x03q\fp\x00\x00\x00\x00\x04a\v\x80\x00\x00\x00\x00\x05P\xeep\x00\x00\x00\x00\x06@\xed\x80\x00\x00\x00\x00\a0\xd0p" +
-	"\x00\x00\x00\x00\a\x8d'\x80\x00\x00\x00\x00\t\x10\xb2p\x00\x00\x00\x00\t\xad\xa3\x00\x00\x00\x00\x00\n\xf0\x94p\x00\x00\x00\x00\v\xe0\x93\x80\x00\x00\x00\x00\fٰ\xf0\x00\x00\x00\x00\r\xc0u\x80\x00\x00\x00\x00" +
-	"\x0e\xb9\x92\xf0\x00\x00\x00\x00D/vp\x00\x00\x00\x00EDQp\x00\x00\x00\x00E\xf3\xb7\x00\x00\x00\x00\x00G-m\xf0\x02\x01\x02\x01\x02\x03\x04\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x05\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x05\x01\x02\x01\x05\xff\xff\xae-\x00\x00\xff\xff\xb9\xb0\x01\x04\xff\xff\xab\xa0\x00\b\xff\xff\xb9\xb0\x01\f\xff\xff\xb9\xb0" +
-	"\x01\x10\xff\xff\xb9\xb0\x00\x14LMT\x00CDT\x00CST\x00CWT\x00CPT\x00EST\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00صK\xa6\n\x02\x00\x00\n\x02\x00\x00\x19\x00\x00\x00America/Indiana/Tell_CityTZif2\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00%\x00\x00\x00\a\x00\x00\x00\x1c\xff\xff\xff\xff^\x03\xfe\xa0\xff\xff\xff\xff\x9e\xa6,\x80\xff\xff\xff\xff\x9f\xba\xf9p\xff\xff\xff\xff\xa0\x86\x0e\x80\xff\xff" +
-	"\xff\xff\xa1\x9a\xdbp\xff\xff\xff\xffˈ\xfe\x80\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2a\t\xf0\xff\xff\xff\xff\xe4g=\xe0\xff\xff\xff\xff\xe5)\x18p\xff\xff\xff\xff\xe6G<\x00\xff\xff\xff\xff\xe7\x12" +
-	"4\xf0\xff\xff\xff\xff\xe8'\x1e\x00\xff\xff\xff\xff\xe8\xf2\x16\xf0\xff\xff\xff\xff\xea\a\x00\x00\xff\xff\xff\xff\xea\xd1\xf8\xf0\xff\xff\xff\xff\xeb\xe6\xe2\x00\xff\xff\xff\xff\xec\xb1\xda\xf0\xff\xff\xff\xff\xed\xc6\xc4\x00\xff\xff" +
-	"\xff\xff\ue47c\xf0\xff\xff\xff\xff\xef\xaf\xe0\x80\xff\xff\xff\xff\xf0\x9f\xc3p\xff\xff\xff\xff\xf1\x8f\u0080\xff\xff\xff\xff\xf2\x7f\xa5p\xff\xff\xff\xff\xf3o\xa4\x80\xff\xff\xff\xff\xf4_\x87p\xff\xff\xff\xff\xf5O" +
-	"\x86\x80\xff\xff\xff\xff\xfb\xe8I\xf0\xff\xff\xff\xff\xfc\xd8I\x00\xff\xff\xff\xff\xfd\xc8+\xf0\xff\xff\xff\xff\xfe\xb8+\x00\xff\xff\xff\xff\xff\xa7\xff\xe0\x00\x00\x00\x00\x00\x97\xfe\xf0\x00\x00\x00\x00\x01\x87\xe1\xe0\x00\x00" +
-	"\x00\x00D/vp\x00\x00\x00\x00EDQp\x00\x00\x00\x00E\xf3\xb7\x00\x02\x01\x02\x01\x02\x03\x04\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x05\x02\x01\x02\x06\x05\x06\x05\x01\x02\x01\xff" +
-	"\xff\xae\xa9\x00\x00\xff\xff\xb9\xb0\x01\x04\xff\xff\xab\xa0\x00\b\xff\xff\xb9\xb0\x01\f\xff\xff\xb9\xb0\x01\x10\xff\xff\xb9\xb0\x00\x14\xff\xff\xc7\xc0\x01\x18LMT\x00CDT\x00CST\x00CWT\x00CPT" +
-	"\x00EST\x00EDT\x00\nCST6CDT,M3.2.0,M11.1.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x17\x89}q\x01\x00\x00q\x01\x00\x00\x15" +
-	"\x00\x00\x00America/Indiana/VevayTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x00\x00\x00\a\x00\x00\x00\x1c\xff" +
-	"\xff\xff\xff^\x03\xfe\xa0\xff\xff\xff\xff\x9e\xa6,\x80\xff\xff\xff\xff\x9f\xba\xf9p\xff\xff\xff\xff\xa0\x86\x0e\x80\xff\xff\xff\xff\xa1\x9a\xdbp\xff\xff\xff\xffˈ\xfe\x80\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2" +
-	"a\t\xf0\xff\xff\xff\xff\xe2~=\x80\xff\xff\xff\xff\xfe\xb8\x1c\xf0\xff\xff\xff\xff\xff\xa7\xff\xe0\x00\x00\x00\x00\x00\x97\xfe\xf0\x00\x00\x00\x00\x01\x87\xe1\xe0\x00\x00\x00\x00\x02w\xe0\xf0\x00\x00\x00\x00\x03p\xfe`\x00" +
-	"\x00\x00\x00\x04`\xfdp\x00\x00\x00\x00\x05P\xe0`\x00\x00\x00\x00D/vp\x00\x00\x00\x00EDC`\x00\x00\x00\x00E\xf3\xa8\xf0\x02\x01\x02\x01\x02\x03\x04\x02\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\xff" +
-	"\xff\xb0@\x00\x00\xff\xff\xb9\xb0\x01\x04\xff\xff\xab\xa0\x00\b\xff\xff\xb9\xb0\x01\f\xff\xff\xb9\xb0\x01\x10\xff\xff\xb9\xb0\x00\x14\xff\xff\xc7\xc0\x01\x18LMT\x00CDT\x00CST\x00CWT\x00CPT" +
-	"\x00EST\x00EDT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\r\xedsp.\x02\x00\x00.\x02\x00\x00\x19" +
-	"\x00\x00\x00America/Indiana/VincennesTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00)\x00\x00\x00\a\x00" +
-	"\x00\x00\x1c\xff\xff\xff\xff^\x03\xfe\xa0\xff\xff\xff\xff\x9e\xa6,\x80\xff\xff\xff\xff\x9f\xba\xf9p\xff\xff\xff\xff\xa0\x86\x0e\x80\xff\xff\xff\xff\xa1\x9a\xdbp\xff\xff\xff\xffˈ\xfe\x80\xff\xff\xff\xff\xd2#\xf4p\xff" +
-	"\xff\xff\xff\xd2a\t\xf0\xff\xff\xff\xff\xd3u\xf3\x00\xff\xff\xff\xff\xd4@\xeb\xf0\xff\xff\xff\xff\xe0\x9e[\x80\xff\xff\xff\xff\xe1iTp\xff\xff\xff\xff\xe2~=\x80\xff\xff\xff\xff\xe3I6p\xff\xff\xff\xff\xe4" +
-	"g=\xe0\xff\xff\xff\xff\xe5)\x18p\xff\xff\xff\xff\xe6G<\x00\xff\xff\xff\xff\xe7\x124\xf0\xff\xff\xff\xff\xe8'\x1e\x00\xff\xff\xff\xff\xe8\xf2\x16\xf0\xff\xff\xff\xff\xea\a\x00\x00\xff\xff\xff\xff\xea\xd1\xf8\xf0\xff" +
-	"\xff\xff\xff\xeb\xe6\xe2\x00\xff\xff\xff\xff\xec\xb1\xda\xf0\xff\xff\xff\xff\xed\xc6\xc4\x00\xff\xff\xff\xff\xee\xbf\xe1p\xff\xff\xff\xff\xef\xaf\xe0\x80\xff\xff\xff\xff\xf0q\x9e\xf0\xff\xff\xff\xff\xf1\x8f\u0080\xff\xff\xff\xff\xf2" +
-	"\x7f\xa5p\xff\xff\xff\xff\xf3o\xa4\x80\xff\xff\xff\xff\xf4_\x87p\xff\xff\xff\xff\xf5O\x86\x80\xff\xff\xff\xff\xfe\xb8\x1c\xf0\xff\xff\xff\xff\xff\xa7\xff\xe0\x00\x00\x00\x00\x00\x97\xfe\xf0\x00\x00\x00\x00\x01\x87\xe1\xe0\x00" +
-	"\x00\x00\x00D/vp\x00\x00\x00\x00EDQp\x00\x00\x00\x00E\xf3\xb7\x00\x00\x00\x00\x00G-m\xf0\x02\x01\x02\x01\x02\x03\x04\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x05\x06\x05\x06\x05\x01\x02\x01\x05\xff\xff\xad\xf1\x00\x00\xff\xff\xb9\xb0\x01\x04\xff\xff\xab\xa0\x00\b\xff\xff\xb9\xb0\x01\f\xff\xff\xb9\xb0\x01\x10\xff\xff\xb9\xb0\x00\x14\xff\xff\xc7\xc0\x01\x18LMT\x00CD" +
-	"T\x00CST\x00CWT\x00CPT\x00EST\x00EDT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"K-E\xfad\x02\x00\x00d\x02\x00\x00\x17\x00\x00\x00America/Indiana/WinamacTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00/\x00\x00\x00\a\x00\x00\x00\x1c\xff\xff\xff\xff^\x03\xfe\xa0\xff\xff\xff\xff\x9e\xa6,\x80\xff\xff\xff\xff\x9f\xba\xf9p\xff\xff\xff\xff\xa0\x86\x0e\x80\xff\xff\xff\xff\xa1\x9a\xdbp\xff\xff\xff\xffˈ" +
-	"\xfe\x80\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2a\t\xf0\xff\xff\xff\xff\xd3u\xf3\x00\xff\xff\xff\xff\xd4@\xeb\xf0\xff\xff\xff\xff\xd5U\xd5\x00\xff\xff\xff\xff\xd6 \xcd\xf0\xff\xff\xff\xff\xd75\xb7\x00\xff\xff" +
-	"\xff\xff\xd8\x00\xaf\xf0\xff\xff\xff\xff\xd9\x15\x99\x00\xff\xff\xff\xff\xd9\xe0\x91\xf0\xff\xff\xff\xff\xda\xfe\xb5\x80\xff\xff\xff\xff\xdb\xc0s\xf0\xff\xff\xff\xff\xdcޗ\x80\xff\xff\xff\xffݩ\x90p\xff\xff\xff\xff\u07be" +
-	"y\x80\xff\xff\xff\xff߉rp\xff\xff\xff\xff\xe0\x9e[\x80\xff\xff\xff\xff\xe1iTp\xff\xff\xff\xff\xe2~=\x80\xff\xff\xff\xff\xe3I6p\xff\xff\xff\xff\xe4^\x1f\x80\xff\xff\xff\xff\xe5W<\xf0\xff\xff" +
-	"\xff\xff\xe6G<\x00\xff\xff\xff\xff\xe77\x1e\xf0\xff\xff\xff\xff\xe8'\x1e\x00\xff\xff\xff\xff\xe8\xf2\x16\xf0\xff\xff\xff\xff\xea\a\x00\x00\xff\xff\xff\xff\xea\xd1\xf8\xf0\xff\xff\xff\xff\xeb\xe6\xe2\x00\xff\xff\xff\xff\xec\xb1" +
-	"\xda\xf0\xff\xff\xff\xff\xed\xc6\xc4\x00\xff\xff\xff\xff\ue47c\xf0\xff\xff\xff\xff\xef\xaf\xe0\x80\xff\xff\xff\xff\xfe\xb8\x1c\xf0\xff\xff\xff\xff\xff\xa7\xff\xe0\x00\x00\x00\x00\x00\x97\xfe\xf0\x00\x00\x00\x00\x01\x87\xe1\xe0\x00\x00" +
-	"\x00\x00D/vp\x00\x00\x00\x00EDQp\x00\x00\x00\x00E\xf3\xb7\x00\x00\x00\x00\x00G-_\xe0\x02\x01\x02\x01\x02\x03\x04\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x05\x06\x05\x06\x05\x01\x02\x06\x05\xff\xff\xae\xcf\x00\x00\xff\xff\xb9\xb0\x01\x04\xff\xff\xab\xa0\x00\b\xff\xff\xb9\xb0\x01\f\xff\xff\xb9\xb0\x01\x10\xff\xff\xb9\xb0\x00\x14\xff\xff\xc7\xc0\x01\x18L" +
-	"MT\x00CDT\x00CST\x00CWT\x00CPT\x00EST\x00EDT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00p\xb6{\xc9\x13\x02\x00\x00\x13\x02\x00\x00\x14\x00\x00\x00America/IndianapolisTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00&\x00\x00\x00\a\x00\x00\x00\x1c\xff\xff\xff\xff^\x03\xfe\xa0\xff\xff\xff\xff\x9e\xa6,\x80\xff\xff\xff\xff\x9f\xba\xf9p\xff\xff\xff\xff\xa0\x86\x0e\x80\xff\xff\xff\xff\xa1\x9a\xdbp\xff\xff\xff\xff" +
-	"\xcaW\"\x80\xff\xff\xff\xff\xca\xd8Gp\xff\xff\xff\xffˈ\xfe\x80\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2a\t\xf0\xff\xff\xff\xff\xd3u\xf3\x00\xff\xff\xff\xff\xd4@\xeb\xf0\xff\xff\xff\xff\xd5U\xd5\x00" +
-	"\xff\xff\xff\xff\xd6 \xcd\xf0\xff\xff\xff\xff\xd75\xb7\x00\xff\xff\xff\xff\xd8\x00\xaf\xf0\xff\xff\xff\xff\xd9\x15\x99\x00\xff\xff\xff\xff\xd9\xe0\x91\xf0\xff\xff\xff\xff\xda\xfe\xb5\x80\xff\xff\xff\xff\xdb\xc0s\xf0\xff\xff\xff\xff" +
-	"\xdcޗ\x80\xff\xff\xff\xffݩ\x90p\xff\xff\xff\xff\u07bey\x80\xff\xff\xff\xff߉rp\xff\xff\xff\xff\xe0\x9e[\x80\xff\xff\xff\xff\xe1iTp\xff\xff\xff\xff\xe2~=\x80\xff\xff\xff\xff\xe3I6p" +
-	"\xff\xff\xff\xff\xe4^\x1f\x80\xff\xff\xff\xff\xe8\xf2\x16\xf0\xff\xff\xff\xff\xea\a\x00\x00\xff\xff\xff\xff\xfe\xb8\x1c\xf0\xff\xff\xff\xff\xff\xa7\xff\xe0\x00\x00\x00\x00\x00\x97\xfe\xf0\x00\x00\x00\x00\x01\x87\xe1\xe0\x00\x00\x00\x00" +
-	"D/vp\x00\x00\x00\x00EDC`\x00\x00\x00\x00E\xf3\xa8\xf0\x02\x01\x02\x01\x02\x01\x02\x03\x04\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x05\x02\x05\x06\x05\x06\x05\x06\x05\x06\xff\xff" +
-	"\xaf:\x00\x00\xff\xff\xb9\xb0\x01\x04\xff\xff\xab\xa0\x00\b\xff\xff\xb9\xb0\x01\f\xff\xff\xb9\xb0\x01\x10\xff\xff\xb9\xb0\x00\x14\xff\xff\xc7\xc0\x01\x18LMT\x00CDT\x00CST\x00CWT\x00CPT\x00" +
-	"EST\x00EDT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00ʼ\to1\x03\x00\x001\x03\x00\x00\x0e\x00" +
-	"\x00\x00America/InuvikTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01" +
-	"\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00H\x00\x00\x00\x05\x00\x00\x00\x14\xff\xff\xff\xff\xe0\x06N\x80\x00" +
-	"\x00\x00\x00\x04a'\xa0\x00\x00\x00\x00\x05Q\n\x90\x00\x00\x00\x00\x06A\t\xa0\x00\x00\x00\x00\a0\xec\x90\x00\x00\x00\x00\b \xeb\xa0\x00\x00\x00\x00\t\x10ΐ\x00\x00\x00\x00\n\x00͠\x00\x00\x00\x00\n" +
-	"\xf0\xb0\x90\x00\x00\x00\x00\v\u0be0\x00\x00\x00\x00\f\xd9\xcd\x10\x00\x00\x00\x00\r\xc0\x91\xa0\x00\x00\x00\x00\x0e\xb9\xaf\x10\x00\x00\x00\x00\x0f\xa9\xae \x00\x00\x00\x00\x10\x99\x91\x10\x00\x00\x00\x00\x11\x89\x90 \x00" +
-	"\x00\x00\x00\x12ye\x00\x00\x00\x00\x00\x13id\x10\x00\x00\x00\x00\x14YG\x00\x00\x00\x00\x00\x15IF\x10\x00\x00\x00\x00\x169)\x00\x00\x00\x00\x00\x17)(\x10\x00\x00\x00\x00\x18\"E\x80\x00\x00\x00\x00\x19" +
-	"\t\n\x10\x00\x00\x00\x00\x1a\x02'\x80\x00\x00\x00\x00\x1a\xf2&\x90\x00\x00\x00\x00\x1b\xe2\t\x80\x00\x00\x00\x00\x1c\xd2\b\x90\x00\x00\x00\x00\x1d\xc1\xeb\x80\x00\x00\x00\x00\x1e\xb1\xea\x90\x00\x00\x00\x00\x1f\xa1̀\x00" +
-	"\x00\x00\x00 v\x1d\x10\x00\x00\x00\x00!\x81\xaf\x80\x00\x00\x00\x00\"U\xff\x10\x00\x00\x00\x00#j\xcc\x00\x00\x00\x00\x00$5\xe1\x10\x00\x00\x00\x00%J\xae\x00\x00\x00\x00\x00&\x15\xc3\x10\x00\x00\x00\x00'" +
-	"*\x90\x00\x00\x00\x00\x00'\xfeߐ\x00\x00\x00\x00)\nr\x00\x00\x00\x00\x00)\xde\xc1\x90\x00\x00\x00\x00*\xeaT\x00\x00\x00\x00\x00+\xbe\xa3\x90\x00\x00\x00\x00,\xd3p\x80\x00\x00\x00\x00-\x9e\x85\x90\x00" +
-	"\x00\x00\x00.\xb3R\x80\x00\x00\x00\x00/~g\x90\x00\x00\x00\x000\x934\x80\x00\x00\x00\x001g\x84\x10\x00\x00\x00\x002s\x16\x80\x00\x00\x00\x003Gf\x10\x00\x00\x00\x004R\xf8\x80\x00\x00\x00\x005" +
-	"'H\x10\x00\x00\x00\x0062ڀ\x00\x00\x00\x007\a*\x10\x00\x00\x00\x008\x1b\xf7\x00\x00\x00\x00\x008\xe7\f\x10\x00\x00\x00\x009\xfb\xd9\x00\x00\x00\x00\x00:\xc6\xee\x10\x00\x00\x00\x00;ۻ\x00\x00" +
-	"\x00\x00\x00<\xb0\n\x90\x00\x00\x00\x00=\xbb\x9d\x00\x00\x00\x00\x00>\x8f\xec\x90\x00\x00\x00\x00?\x9b\x7f\x00\x00\x00\x00\x00@oΐ\x00\x00\x00\x00A\x84\x9b\x80\x00\x00\x00\x00BO\xb0\x90\x00\x00\x00\x00C" +
-	"d}\x80\x00\x00\x00\x00D/\x92\x90\x00\x00\x00\x00ED_\x80\x00\x00\x00\x00E\xf3\xc5\x10\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03" +
-	"\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x00\x00\x00\x00\x00\x00\xff\xff\x9d\x90\x01\x04\xff\xff\x8f\x80\x00\b\xff\xff\x9d" +
-	"\x90\x00\f\xff\xff\xab\xa0\x01\x10-00\x00PDT\x00PST\x00MST\x00MDT\x00\nMST7MDT,M3.2.0,M11.1.0\nPK\x03\x04\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00Š\xd6\x05W\x03\x00\x00W\x03\x00\x00\x0f\x00\x00\x00America/IqaluitTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00J\x00\x00\x00\a\x00\x00\x00\x1c\xff\xff\xff\xff\xccl\xa1\x80\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2`\xfb\xe0\x00\x00\x00\x00\x04`\xfdp\x00\x00\x00\x00\x05P\xe0`\x00\x00\x00\x00\x06@\xdf" +
-	"p\x00\x00\x00\x00\a0\xc2`\x00\x00\x00\x00\b \xc1p\x00\x00\x00\x00\t\x10\xa4`\x00\x00\x00\x00\n\x00\xa3p\x00\x00\x00\x00\n\xf0\x86`\x00\x00\x00\x00\v\xe0\x85p\x00\x00\x00\x00\f٢\xe0\x00\x00\x00" +
-	"\x00\r\xc0gp\x00\x00\x00\x00\x0e\xb9\x84\xe0\x00\x00\x00\x00\x0f\xa9\x83\xf0\x00\x00\x00\x00\x10\x99f\xe0\x00\x00\x00\x00\x11\x89e\xf0\x00\x00\x00\x00\x12yH\xe0\x00\x00\x00\x00\x13iG\xf0\x00\x00\x00\x00\x14Y*" +
-	"\xe0\x00\x00\x00\x00\x15I)\xf0\x00\x00\x00\x00\x169\f\xe0\x00\x00\x00\x00\x17)\v\xf0\x00\x00\x00\x00\x18\")`\x00\x00\x00\x00\x19\b\xed\xf0\x00\x00\x00\x00\x1a\x02\v`\x00\x00\x00\x00\x1a\xf2\np\x00\x00\x00" +
-	"\x00\x1b\xe1\xed`\x00\x00\x00\x00\x1c\xd1\xecp\x00\x00\x00\x00\x1d\xc1\xcf`\x00\x00\x00\x00\x1e\xb1\xcep\x00\x00\x00\x00\x1f\xa1\xb1`\x00\x00\x00\x00 v\x00\xf0\x00\x00\x00\x00!\x81\x93`\x00\x00\x00\x00\"U\xe2" +
-	"\xf0\x00\x00\x00\x00#j\xaf\xe0\x00\x00\x00\x00$5\xc4\xf0\x00\x00\x00\x00%J\x91\xe0\x00\x00\x00\x00&\x15\xa6\xf0\x00\x00\x00\x00'*s\xe0\x00\x00\x00\x00'\xfe\xc3p\x00\x00\x00\x00)\nU\xe0\x00\x00\x00" +
-	"\x00)ޥp\x00\x00\x00\x00*\xea7\xe0\x00\x00\x00\x00+\xbe\x87p\x00\x00\x00\x00,\xd3T`\x00\x00\x00\x00-\x9eip\x00\x00\x00\x00.\xb36`\x00\x00\x00\x00/~Kp\x00\x00\x00\x000\x93\x18" +
-	"`\x00\x00\x00\x001gg\xf0\x00\x00\x00\x002r\xfa`\x00\x00\x00\x003GI\xf0\x00\x00\x00\x004R\xdc`\x00\x00\x00\x005'+\xf0\x00\x00\x00\x0062\xbe`\x00\x00\x00\x007\a\r\xf0\x00\x00\x00" +
-	"\x008\x1b\xda\xe0\x00\x00\x00\x008\xe6\xfe\x00\x00\x00\x00\x009\xfb\xca\xf0\x00\x00\x00\x00:\xc6\xd1\xf0\x00\x00\x00\x00;۞\xe0\x00\x00\x00\x00<\xaf\xeep\x00\x00\x00\x00=\xbb\x80\xe0\x00\x00\x00\x00>\x8f\xd0" +
-	"p\x00\x00\x00\x00?\x9bb\xe0\x00\x00\x00\x00@o\xb2p\x00\x00\x00\x00A\x84\x7f`\x00\x00\x00\x00BO\x94p\x00\x00\x00\x00Cda`\x00\x00\x00\x00D/vp\x00\x00\x00\x00EDC`\x00\x00\x00" +
-	"\x00E\xf3\xa8\xf0\x04\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02" +
-	"\x03\x02\x03\x05\x06\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x00\x00\x00\x00\x00\x00\xff\xff\xc7\xc0\x01\x04\xff\xff\xb9\xb0\x00\b\xff\xff\xc7\xc0\x01\f\xff\xff\xc7\xc0\x01\x10\xff\xff\xab\xa0\x00\x14\xff\xff\xb9\xb0\x01" +
-	"\x18-00\x00EPT\x00EST\x00EDT\x00EWT\x00CST\x00CDT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00%J\xd5\xebS\x01\x00\x00S\x01\x00\x00\x0f\x00\x00\x00America/JamaicaTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x16\x00\x00\x00\x04\x00\x00\x00\x10\xff\xff\xff\xffi\x87#~\xff\xff\xff\xff\x93\x0f\xb4\xfe\x00\x00\x00\x00\a\x8d\x19p\x00\x00\x00\x00\t\x10\xa4`\x00\x00\x00\x00\t\xad\x94\xf0\x00\x00\x00\x00\n\xf0\x86" +
-	"`\x00\x00\x00\x00\v\xe0\x85p\x00\x00\x00\x00\f٢\xe0\x00\x00\x00\x00\r\xc0gp\x00\x00\x00\x00\x0e\xb9\x84\xe0\x00\x00\x00\x00\x0f\xa9\x83\xf0\x00\x00\x00\x00\x10\x99f\xe0\x00\x00\x00\x00\x11\x89e\xf0\x00\x00\x00" +
-	"\x00\x12yH\xe0\x00\x00\x00\x00\x13iG\xf0\x00\x00\x00\x00\x14Y*\xe0\x00\x00\x00\x00\x15I)\xf0\x00\x00\x00\x00\x169\f\xe0\x00\x00\x00\x00\x17)\v\xf0\x00\x00\x00\x00\x18\")`\x00\x00\x00\x00\x19\b\xed" +
-	"\xf0\x00\x00\x00\x00\x1a\x02\v`\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\xff\xff\xb8\x02\x00\x00\xff\xff\xb8\x02\x00\x04\xff\xff\xb9\xb0\x00\b\xff\xff\xc7\xc0\x01\fLMT\x00K" +
-	"MT\x00EST\x00EDT\x00\nEST5\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00utZ\x1a\xb2\x02\x00\x00\xb2\x02\x00\x00\r\x00\x00\x00America/Jujuy" +
-	"TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00;\x00\x00\x00\x06\x00\x00\x00\x14\xff\xff\xff\xffr\x9c\xae\xb8\xff\xff\xff\xff\xa2\x92\x8f0\xff\xff\xff\xff\xb6{R@\xff" +
-	"\xff\xff\xff\xb7\x1aɰ\xff\xff\xff\xff\xb8\x1e\x8f@\xff\xff\xff\xff\xb8\xd4p0\xff\xff\xff\xff\xba\x17}\xc0\xff\xff\xff\xff\xba\xb5\xa3\xb0\xff\xff\xff\xff\xbb\xf8\xb1@\xff\xff\xff\xff\xbc\x96\xd70\xff\xff\xff\xff\xbd" +
-	"\xd9\xe4\xc0\xff\xff\xff\xff\xbex\n\xb0\xff\xff\xff\xff\xbf\xbb\x18@\xff\xff\xff\xff\xc0Z\x8f\xb0\xff\xff\xff\xff\xc1\x9d\x9d@\xff\xff\xff\xff\xc2;\xc30\xff\xff\xff\xff\xc3~\xd0\xc0\xff\xff\xff\xff\xc4\x1c\xf6\xb0\xff" +
-	"\xff\xff\xff\xc5`\x04@\xff\xff\xff\xff\xc5\xfe*0\xff\xff\xff\xff\xc7A7\xc0\xff\xff\xff\xff\xc7\xe0\xaf0\xff\xff\xff\xffȁ\x94@\xff\xff\xff\xff\xcaM\xa1\xb0\xff\xff\xff\xff\xca\xee\x86\xc0\xff\xff\xff\xff\xce" +
-	"M\xff0\xff\xff\xff\xffΰ\xed\xc0\xff\xff\xff\xff\xd3)5\xb0\xff\xff\xff\xff\xd4Cd\xc0\xff\xff\xff\xff\xf4=\b0\xff\xff\xff\xff\xf4\x9f\xf6\xc0\xff\xff\xff\xff\xf5\x05l0\xff\xff\xff\xff\xf62\x10@\xff" +
-	"\xff\xff\xff\xf6柰\xff\xff\xff\xff\xf8\x13C\xc0\xff\xff\xff\xff\xf8\xc7\xd30\xff\xff\xff\xff\xf9\xf4w@\xff\xff\xff\xff\xfa\xd36\xb0\xff\xff\xff\xff\xfb\xc35\xc0\xff\xff\xff\xff\xfc\xbcS0\xff\xff\xff\xff\xfd" +
-	"\xacR@\xff\xff\xff\xff\xfe\x9c50\xff\xff\xff\xff\xff\x8c4@\x00\x00\x00\x00\a\xa3J\xb0\x00\x00\x00\x00\b$o\xa0\x00\x00\x00\x00#\x94\xb5\xb0\x00\x00\x00\x00$\x10\x94\xa0\x00\x00\x00\x00%7\xf2\xb0\x00" +
-	"\x00\x00\x00%\xf0v\xa0\x00\x00\x00\x00'*W\xc0\x00\x00\x00\x00'\xe2۰\x00\x00\x00\x00(\xee\x8a@\x00\x00\x00\x00)\xb0:\xa0\x00\x00\x00\x00*\xe0\xd30\x00\x00\x00\x00+\x99W \x00\x00\x00\x007" +
-	"\xf6ư\x00\x00\x00\x008\xbf*\xb0\x00\x00\x00\x00Gw\t\xb0\x00\x00\x00\x00G\xdc\x7f \x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03" +
-	"\x02\x03\x02\x03\x02\x03\x02\x03\x02\x05\x04\x05\x04\x05\x04\x02\x03\x02\x04\x05\x04\x05\x03\x05\x04\x05\xff\xff\xc2\xc8\x00\x00\xff\xff\xc3\xd0\x00\x04\xff\xff\xc7\xc0\x00\b\xff\xff\xd5\xd0\x01\f\xff\xff\xe3\xe0\x01\x10\xff\xff\xd5\xd0" +
-	"\x00\fLMT\x00CMT\x00-04\x00-03\x00-02\x00\n<-03>3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?\xc9\x1c\xd4\xc6\x03\x00\x00\xc6\x03\x00\x00\x0e\x00\x00\x00" +
-	"America/JuneauTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00" +
-	"\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00S\x00\x00\x00\n\x00\x00\x00&\xff\xff\xff\xff?\xc2\xfd\xd1\xff\xff\xff" +
-	"\xff}\x872\xc5\xff\xff\xff\xffˉ\x1a\xa0\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2a&\x10\xff\xff\xff\xff\xfe\xb8G \xff\xff\xff\xff\xff\xa8*\x10\x00\x00\x00\x00\x00\x98) \x00\x00\x00\x00\x01\x88\f" +
-	"\x10\x00\x00\x00\x00\x02x\v \x00\x00\x00\x00\x03q(\x90\x00\x00\x00\x00\x04a'\xa0\x00\x00\x00\x00\x05Q\n\x90\x00\x00\x00\x00\x06A\t\xa0\x00\x00\x00\x00\a0\xec\x90\x00\x00\x00\x00\a\x8dC\xa0\x00\x00\x00" +
-	"\x00\t\x10ΐ\x00\x00\x00\x00\t\xad\xbf \x00\x00\x00\x00\n\xf0\xb0\x90\x00\x00\x00\x00\v\u0be0\x00\x00\x00\x00\f\xd9\xcd\x10\x00\x00\x00\x00\r\xc0\x91\xa0\x00\x00\x00\x00\x0e\xb9\xaf\x10\x00\x00\x00\x00\x0f\xa9\xae" +
-	" \x00\x00\x00\x00\x10\x99\x91\x10\x00\x00\x00\x00\x11\x89\x90 \x00\x00\x00\x00\x12ys\x10\x00\x00\x00\x00\x13ir \x00\x00\x00\x00\x14Yc \x00\x00\x00\x00\x15IT \x00\x00\x00\x00\x1697\x10\x00\x00\x00" +
-	"\x00\x17)6 \x00\x00\x00\x00\x18\"S\x90\x00\x00\x00\x00\x19\t\x18 \x00\x00\x00\x00\x1a\x025\x90\x00\x00\x00\x00\x1a+\x14\x10\x00\x00\x00\x00\x1a\xf2B\xb0\x00\x00\x00\x00\x1b\xe2%\xa0\x00\x00\x00\x00\x1c\xd2$" +
-	"\xb0\x00\x00\x00\x00\x1d\xc2\a\xa0\x00\x00\x00\x00\x1e\xb2\x06\xb0\x00\x00\x00\x00\x1f\xa1\xe9\xa0\x00\x00\x00\x00 v90\x00\x00\x00\x00!\x81ˠ\x00\x00\x00\x00\"V\x1b0\x00\x00\x00\x00#j\xe8 \x00\x00\x00" +
-	"\x00$5\xfd0\x00\x00\x00\x00%J\xca \x00\x00\x00\x00&\x15\xdf0\x00\x00\x00\x00'*\xac \x00\x00\x00\x00'\xfe\xfb\xb0\x00\x00\x00\x00)\n\x8e \x00\x00\x00\x00)\xdeݰ\x00\x00\x00\x00*\xeap" +
-	" \x00\x00\x00\x00+\xbe\xbf\xb0\x00\x00\x00\x00,ӌ\xa0\x00\x00\x00\x00-\x9e\xa1\xb0\x00\x00\x00\x00.\xb3n\xa0\x00\x00\x00\x00/~\x83\xb0\x00\x00\x00\x000\x93P\xa0\x00\x00\x00\x001g\xa00\x00\x00\x00" +
-	"\x002s2\xa0\x00\x00\x00\x003G\x820\x00\x00\x00\x004S\x14\xa0\x00\x00\x00\x005'd0\x00\x00\x00\x0062\xf6\xa0\x00\x00\x00\x007\aF0\x00\x00\x00\x008\x1c\x13 \x00\x00\x00\x008\xe7(" +
-	"0\x00\x00\x00\x009\xfb\xf5 \x00\x00\x00\x00:\xc7\n0\x00\x00\x00\x00;\xdb\xd7 \x00\x00\x00\x00<\xb0&\xb0\x00\x00\x00\x00=\xbb\xb9 \x00\x00\x00\x00>\x90\b\xb0\x00\x00\x00\x00?\x9b\x9b \x00\x00\x00" +
-	"\x00@o\xea\xb0\x00\x00\x00\x00A\x84\xb7\xa0\x00\x00\x00\x00BO̰\x00\x00\x00\x00Cd\x99\xa0\x00\x00\x00\x00D/\xae\xb0\x00\x00\x00\x00ED{\xa0\x00\x00\x00\x00E\xf3\xe10\x01\x02\x03\x04\x02\x05\x02" +
-	"\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x06\x02\x05\x02\x05\x02\x05\a\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b" +
-	"\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\x00\x00\xd3{\x00\x00\xff\xff\x81\xfb\x00\x00\xff\xff\x8f\x80\x00\x04\xff\xff\x9d\x90\x01\b\xff\xff\x9d\x90\x01\f\xff\xff\x9d\x90\x01\x10\xff\xff\x8f\x80\x01\x14\xff\xff" +
-	"\x81p\x00\x18\xff\xff\x8f\x80\x01\x1c\xff\xff\x81p\x00!LMT\x00PST\x00PWT\x00PPT\x00PDT\x00YDT\x00YST\x00AKDT\x00AKST\x00\nAKST9" +
-	"AKDT,M3.2.0,M11.1.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdf\xe5\x8d\xc4\xda\x04\x00\x00\xda\x04\x00\x00\x1b\x00\x00\x00America/Ke" +
-	"ntucky/LouisvilleTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" +
-	"\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00u\x00\x00\x00\a\x00\x00\x00\x1c\xff\xff\xff\xff^\x03\xfe\xa0" +
-	"\xff\xff\xff\xff\x9e\xa6,\x80\xff\xff\xff\xff\x9f\xba\xf9p\xff\xff\xff\xff\xa0\x86\x0e\x80\xff\xff\xff\xff\xa1\x9a\xdbp\xff\xff\xff\xff\xa4s\xf7\x00\xff\xff\xff\xff\xa5\x16\x11p\xff\xff\xff\xff\xca\rN\x80\xff\xff\xff\xff" +
-	"\xca\xd8Gp\xff\xff\xff\xffˈ\xfe\x80\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2a\t\xf0\xff\xff\xff\xff\xd3u\xd7\x1c\xff\xff\xff\xffӤ\tp\xff\xff\xff\xff\xda\xfe\xb5\x80\xff\xff\xff\xff\xdb\xc0s\xf0" +
-	"\xff\xff\xff\xff\xdcޗ\x80\xff\xff\xff\xffݩ\x90p\xff\xff\xff\xff\u07bey\x80\xff\xff\xff\xff߉rp\xff\xff\xff\xff\xe0\x9e[\x80\xff\xff\xff\xff\xe1iTp\xff\xff\xff\xff\xe2~=\x80\xff\xff\xff\xff" +
-	"\xe3I6p\xff\xff\xff\xff\xe4^\x1f\x80\xff\xff\xff\xff\xe5)\x18p\xff\xff\xff\xff\xe6G<\x00\xff\xff\xff\xff\xe77\x1e\xf0\xff\xff\xff\xff\xe8'\x1e\x00\xff\xff\xff\xff\xe9\x17\x00\xf0\xff\xff\xff\xff\xea\a\x00\x00" +
-	"\xff\xff\xff\xff\xea\xf6\xe2\xf0\xff\xff\xff\xff\xeb\xe6\xe2\x00\xff\xff\xff\xff\xec\xd6\xc4\xf0\xff\xff\xff\xff\xed\xc6\xc4\x00\xff\xff\xff\xff\xee\xbf\xe1p\xff\xff\xff\xff\xef\xaf\xe0\x80\xff\xff\xff\xff\xf0\x1e\x90p\xff\xff\xff\xff" +
-	"\xfc\xd8:\xf0\xff\xff\xff\xff\xfd\xc8\x1d\xe0\xff\xff\xff\xff\xfe\xb8\x1c\xf0\xff\xff\xff\xff\xff\xa7\xff\xe0\x00\x00\x00\x00\x00\x97\xfe\xf0\x00\x00\x00\x00\x01\x87\xe1\xe0\x00\x00\x00\x00\x02w\xe0\xf0\x00\x00\x00\x00\x03p\xfe`" +
-	"\x00\x00\x00\x00\x04`\xfdp\x00\x00\x00\x00\x05P\xe0`\x00\x00\x00\x00\x06@\xdfp\x00\x00\x00\x00\a0\xc2`\x00\x00\x00\x00\a\x8d\x19p\x00\x00\x00\x00\t\x10\xb2p\x00\x00\x00\x00\t\xad\x94\xf0\x00\x00\x00\x00" +
-	"\n\xf0\x86`\x00\x00\x00\x00\v\xe0\x85p\x00\x00\x00\x00\f٢\xe0\x00\x00\x00\x00\r\xc0gp\x00\x00\x00\x00\x0e\xb9\x84\xe0\x00\x00\x00\x00\x0f\xa9\x83\xf0\x00\x00\x00\x00\x10\x99f\xe0\x00\x00\x00\x00\x11\x89e\xf0" +
-	"\x00\x00\x00\x00\x12yH\xe0\x00\x00\x00\x00\x13iG\xf0\x00\x00\x00\x00\x14Y*\xe0\x00\x00\x00\x00\x15I)\xf0\x00\x00\x00\x00\x169\f\xe0\x00\x00\x00\x00\x17)\v\xf0\x00\x00\x00\x00\x18\")`\x00\x00\x00\x00" +
-	"\x19\b\xed\xf0\x00\x00\x00\x00\x1a\x02\v`\x00\x00\x00\x00\x1a\xf2\np\x00\x00\x00\x00\x1b\xe1\xed`\x00\x00\x00\x00\x1c\xd1\xecp\x00\x00\x00\x00\x1d\xc1\xcf`\x00\x00\x00\x00\x1e\xb1\xcep\x00\x00\x00\x00\x1f\xa1\xb1`" +
-	"\x00\x00\x00\x00 v\x00\xf0\x00\x00\x00\x00!\x81\x93`\x00\x00\x00\x00\"U\xe2\xf0\x00\x00\x00\x00#j\xaf\xe0\x00\x00\x00\x00$5\xc4\xf0\x00\x00\x00\x00%J\x91\xe0\x00\x00\x00\x00&\x15\xa6\xf0\x00\x00\x00\x00" +
-	"'*s\xe0\x00\x00\x00\x00'\xfe\xc3p\x00\x00\x00\x00)\nU\xe0\x00\x00\x00\x00)ޥp\x00\x00\x00\x00*\xea7\xe0\x00\x00\x00\x00+\xbe\x87p\x00\x00\x00\x00,\xd3T`\x00\x00\x00\x00-\x9eip" +
-	"\x00\x00\x00\x00.\xb36`\x00\x00\x00\x00/~Kp\x00\x00\x00\x000\x93\x18`\x00\x00\x00\x001gg\xf0\x00\x00\x00\x002r\xfa`\x00\x00\x00\x003GI\xf0\x00\x00\x00\x004R\xdc`\x00\x00\x00\x00" +
-	"5'+\xf0\x00\x00\x00\x0062\xbe`\x00\x00\x00\x007\a\r\xf0\x00\x00\x00\x008\x1b\xda\xe0\x00\x00\x00\x008\xe6\xef\xf0\x00\x00\x00\x009\xfb\xbc\xe0\x00\x00\x00\x00:\xc6\xd1\xf0\x00\x00\x00\x00;۞\xe0" +
-	"\x00\x00\x00\x00<\xaf\xeep\x00\x00\x00\x00=\xbb\x80\xe0\x00\x00\x00\x00>\x8f\xd0p\x00\x00\x00\x00?\x9bb\xe0\x00\x00\x00\x00@o\xb2p\x00\x00\x00\x00A\x84\x7f`\x00\x00\x00\x00BO\x94p\x00\x00\x00\x00" +
-	"Cda`\x00\x00\x00\x00D/vp\x00\x00\x00\x00EDC`\x00\x00\x00\x00E\xf3\xa8\xf0\x02\x01\x02\x01\x02\x01\x02\x01\x02\x03\x04\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x01\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05" +
-	"\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\xff\xff\xaf\x9a\x00\x00\xff\xff\xb9\xb0\x01\x04\xff\xff\xab\xa0\x00\b\xff\xff\xb9\xb0\x01\f\xff\xff\xb9\xb0\x01\x10\xff\xff\xb9\xb0\x00" +
-	"\x14\xff\xff\xc7\xc0\x01\x18LMT\x00CDT\x00CST\x00CWT\x00CPT\x00EST\x00EDT\x00\nEST5EDT,M3.2.0,M11.1.0\nP" +
-	"K\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x1a|J\xcc\x03\x00\x00\xcc\x03\x00\x00\x1b\x00\x00\x00America/Kentucky/MonticelloTZif" +
-	"2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00W\x00\x00\x00\a\x00\x00\x00\x1c\xff\xff\xff\xff^\x03\xfe\xa0\xff\xff\xff\xff\x9e\xa6,\x80\xff\xff\xff\xff\x9f\xba\xf9p\xff\xff\xff\xff\xa0" +
-	"\x86\x0e\x80\xff\xff\xff\xff\xa1\x9a\xdbp\xff\xff\xff\xffˈ\xfe\x80\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2a\t\xf0\xff\xff\xff\xff\xfc\xd8I\x00\xff\xff\xff\xff\xfd\xc8+\xf0\xff\xff\xff\xff\xfe\xb8+\x00\xff" +
-	"\xff\xff\xff\xff\xa8\r\xf0\x00\x00\x00\x00\x00\x98\r\x00\x00\x00\x00\x00\x01\x87\xef\xf0\x00\x00\x00\x00\x02w\xef\x00\x00\x00\x00\x00\x03q\fp\x00\x00\x00\x00\x04a\v\x80\x00\x00\x00\x00\x05P\xeep\x00\x00\x00\x00\x06" +
-	"@\xed\x80\x00\x00\x00\x00\a0\xd0p\x00\x00\x00\x00\a\x8d'\x80\x00\x00\x00\x00\t\x10\xb2p\x00\x00\x00\x00\t\xad\xa3\x00\x00\x00\x00\x00\n\xf0\x94p\x00\x00\x00\x00\v\xe0\x93\x80\x00\x00\x00\x00\fٰ\xf0\x00" +
-	"\x00\x00\x00\r\xc0u\x80\x00\x00\x00\x00\x0e\xb9\x92\xf0\x00\x00\x00\x00\x0f\xa9\x92\x00\x00\x00\x00\x00\x10\x99t\xf0\x00\x00\x00\x00\x11\x89t\x00\x00\x00\x00\x00\x12yV\xf0\x00\x00\x00\x00\x13iV\x00\x00\x00\x00\x00\x14" +
-	"Y8\xf0\x00\x00\x00\x00\x15I8\x00\x00\x00\x00\x00\x169\x1a\xf0\x00\x00\x00\x00\x17)\x1a\x00\x00\x00\x00\x00\x18\"7p\x00\x00\x00\x00\x19\b\xfc\x00\x00\x00\x00\x00\x1a\x02\x19p\x00\x00\x00\x00\x1a\xf2\x18\x80\x00" +
-	"\x00\x00\x00\x1b\xe1\xfbp\x00\x00\x00\x00\x1c\xd1\xfa\x80\x00\x00\x00\x00\x1d\xc1\xddp\x00\x00\x00\x00\x1e\xb1܀\x00\x00\x00\x00\x1f\xa1\xbfp\x00\x00\x00\x00 v\x0f\x00\x00\x00\x00\x00!\x81\xa1p\x00\x00\x00\x00\"" +
-	"U\xf1\x00\x00\x00\x00\x00#j\xbd\xf0\x00\x00\x00\x00$5\xd3\x00\x00\x00\x00\x00%J\x9f\xf0\x00\x00\x00\x00&\x15\xb5\x00\x00\x00\x00\x00'*\x81\xf0\x00\x00\x00\x00'\xfeр\x00\x00\x00\x00)\nc\xf0\x00" +
-	"\x00\x00\x00)\u07b3\x80\x00\x00\x00\x00*\xeaE\xf0\x00\x00\x00\x00+\xbe\x95\x80\x00\x00\x00\x00,\xd3bp\x00\x00\x00\x00-\x9ew\x80\x00\x00\x00\x00.\xb3Dp\x00\x00\x00\x00/~Y\x80\x00\x00\x00\x000" +
-	"\x93&p\x00\x00\x00\x001gv\x00\x00\x00\x00\x002s\bp\x00\x00\x00\x003GX\x00\x00\x00\x00\x004R\xeap\x00\x00\x00\x005':\x00\x00\x00\x00\x0062\xccp\x00\x00\x00\x007\a\x1c\x00\x00" +
-	"\x00\x00\x008\x1b\xe8\xf0\x00\x00\x00\x008\xe6\xfe\x00\x00\x00\x00\x009\xfb\xca\xf0\x00\x00\x00\x00:\xc6\xd1\xf0\x00\x00\x00\x00;۞\xe0\x00\x00\x00\x00<\xaf\xeep\x00\x00\x00\x00=\xbb\x80\xe0\x00\x00\x00\x00>" +
-	"\x8f\xd0p\x00\x00\x00\x00?\x9bb\xe0\x00\x00\x00\x00@o\xb2p\x00\x00\x00\x00A\x84\x7f`\x00\x00\x00\x00BO\x94p\x00\x00\x00\x00Cda`\x00\x00\x00\x00D/vp\x00\x00\x00\x00EDC`\x00" +
-	"\x00\x00\x00E\xf3\xa8\xf0\x02\x01\x02\x01\x02\x03\x04\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\xff\xff\xb0t\x00\x00\xff\xff\xb9\xb0\x01\x04\xff\xff\xab\xa0\x00\b\xff\xff\xb9\xb0\x01\f\xff\xff" +
-	"\xb9\xb0\x01\x10\xff\xff\xc7\xc0\x01\x14\xff\xff\xb9\xb0\x00\x18LMT\x00CDT\x00CST\x00CWT\x00CPT\x00EDT\x00EST\x00\nEST5EDT,M3.2.0," +
-	"M11.1.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00$ \x873\xf8\x03\x00\x00\xf8\x03\x00\x00\x0f\x00\x00\x00America/Knox_INTZif2\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00]\x00\x00\x00\x06\x00\x00\x00\x18\xff\xff\xff\xff^\x03\xfe\xa0\xff\xff\xff\xff\x9e\xa6,\x80\xff\xff\xff\xff\x9f\xba\xf9p\xff\xff\xff\xff\xa0\x86\x0e\x80" +
-	"\xff\xff\xff\xff\xa1\x9a\xdbp\xff\xff\xff\xffˈ\xfe\x80\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2a\t\xf0\xff\xff\xff\xff\xd5U\xd5\x00\xff\xff\xff\xff\xd6 \xcd\xf0\xff\xff\xff\xff\xd75\xb7\x00\xff\xff\xff\xff" +
-	"\xd8\x00\xaf\xf0\xff\xff\xff\xff\xd9\x15\x99\x00\xff\xff\xff\xff\xd9\xe0\x91\xf0\xff\xff\xff\xff\xda\xfe\xb5\x80\xff\xff\xff\xff\xdb\xc0s\xf0\xff\xff\xff\xff\xdcޗ\x80\xff\xff\xff\xffݩ\x90p\xff\xff\xff\xff\u07bey\x80" +
-	"\xff\xff\xff\xff߉rp\xff\xff\xff\xff\xe0\x9e[\x80\xff\xff\xff\xff\xe1iTp\xff\xff\xff\xff\xe2~=\x80\xff\xff\xff\xff\xe3I6p\xff\xff\xff\xff\xe4^\x1f\x80\xff\xff\xff\xff\xe5W<\xf0\xff\xff\xff\xff" +
-	"\xe6G<\x00\xff\xff\xff\xff\xe77\x1e\xf0\xff\xff\xff\xff\xe8'\x1e\x00\xff\xff\xff\xff\xe8\xf2\x16\xf0\xff\xff\xff\xff\xea\a\x00\x00\xff\xff\xff\xff\xea\xd1\xf8\xf0\xff\xff\xff\xff\xeb\xe6\xe2\x00\xff\xff\xff\xff\xec\xd6\xc4\xf0" +
-	"\xff\xff\xff\xff\xed\xc6\xc4\x00\xff\xff\xff\xff\xee\xbf\xe1p\xff\xff\xff\xff\xef\xaf\xe0\x80\xff\xff\xff\xff\xf0\x9f\xc3p\xff\xff\xff\xff\xf1\x8f\u0080\xff\xff\xff\xff\xf4_\x87p\xff\xff\xff\xff\xfa\xf8g\x00\xff\xff\xff\xff" +
-	"\xfb\xe8I\xf0\xff\xff\xff\xff\xfc\xd8I\x00\xff\xff\xff\xff\xfd\xc8+\xf0\xff\xff\xff\xff\xfe\xb8+\x00\xff\xff\xff\xff\xff\xa8\r\xf0\x00\x00\x00\x00\x00\x98\r\x00\x00\x00\x00\x00\x01\x87\xef\xf0\x00\x00\x00\x00\x02w\xef\x00" +
-	"\x00\x00\x00\x00\x03q\fp\x00\x00\x00\x00\x04a\v\x80\x00\x00\x00\x00\x05P\xeep\x00\x00\x00\x00\x06@\xed\x80\x00\x00\x00\x00\a0\xd0p\x00\x00\x00\x00\a\x8d'\x80\x00\x00\x00\x00\t\x10\xb2p\x00\x00\x00\x00" +
-	"\t\xad\xa3\x00\x00\x00\x00\x00\n\xf0\x94p\x00\x00\x00\x00\v\xe0\x93\x80\x00\x00\x00\x00\fٰ\xf0\x00\x00\x00\x00\r\xc0u\x80\x00\x00\x00\x00\x0e\xb9\x92\xf0\x00\x00\x00\x00\x0f\xa9\x92\x00\x00\x00\x00\x00\x10\x99t\xf0" +
-	"\x00\x00\x00\x00\x11\x89t\x00\x00\x00\x00\x00\x12yV\xf0\x00\x00\x00\x00\x13iV\x00\x00\x00\x00\x00\x14Y8\xf0\x00\x00\x00\x00\x15I8\x00\x00\x00\x00\x00\x169\x1a\xf0\x00\x00\x00\x00\x17)\x1a\x00\x00\x00\x00\x00" +
-	"\x18\"7p\x00\x00\x00\x00\x19\b\xfc\x00\x00\x00\x00\x00\x1a\x02\x19p\x00\x00\x00\x00\x1a\xf2\x18\x80\x00\x00\x00\x00\x1b\xe1\xfbp\x00\x00\x00\x00\x1c\xd1\xfa\x80\x00\x00\x00\x00\x1d\xc1\xddp\x00\x00\x00\x00\x1e\xb1܀" +
-	"\x00\x00\x00\x00\x1f\xa1\xbfp\x00\x00\x00\x00 v\x0f\x00\x00\x00\x00\x00!\x81\xa1p\x00\x00\x00\x00\"U\xf1\x00\x00\x00\x00\x00#j\xbd\xf0\x00\x00\x00\x00$5\xd3\x00\x00\x00\x00\x00%J\x9f\xf0\x00\x00\x00\x00" +
-	"&\x15\xb5\x00\x00\x00\x00\x00'*\x81\xf0\x00\x00\x00\x00'\xfeр\x00\x00\x00\x00)\nc\xf0\x00\x00\x00\x00D/vp\x00\x00\x00\x00EDQp\x00\x00\x00\x00E\xf3\xb7\x00\x02\x01\x02\x01\x02\x03\x04\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x05\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x05\x01\x02\x01\xff\xff\xae\xca\x00\x00\xff\xff\xb9\xb0\x01\x04\xff\xff\xab\xa0\x00\b\xff\xff\xb9\xb0\x01\f\xff\xff\xb9\xb0\x01\x10\xff\xff\xb9\xb0\x00" +
-	"\x14LMT\x00CDT\x00CST\x00CWT\x00CPT\x00EST\x00\nCST6CDT,M3.2.0,M11.1.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00q\xc9*;\xb1\x00\x00\x00\xb1\x00\x00\x00\x12\x00\x00\x00America/KralendijkTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x10\xff\xff\xff\xffz敹\xff\xff\xff\xff\xcb\xf62\xc0\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2`\xed\xd0\x01\x03\x02\x01\xff\xff\xc2\a\x00\x00\xff\xff\xc7\xc0\x00\x04" +
-	"\xff\xff\xd5\xd0\x01\b\xff\xff\xd5\xd0\x01\fLMT\x00AST\x00APT\x00AWT\x00\nAST4\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xad`\x12\xe9\xaa\x00\x00\x00\xaa\x00\x00\x00" +
-	"\x0e\x00\x00\x00America/La_PazTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" +
-	"\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x10\xff\xff\xff\xffi\x87\x1b" +
-	"d\xff\xff\xff\xff\xb8\x1e\x96\xe4\xff\xff\xff\xff\xb8\xee\xd5\xd4\x01\x02\x03\xff\xff\xc0\x1c\x00\x00\xff\xff\xc0\x1c\x00\x04\xff\xff\xce,\x01\b\xff\xff\xc7\xc0\x00\fLMT\x00CMT\x00BST\x00-04\x00" +
-	"\n<-04>4\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe7\xa1\x87\x1b\x01\x00\x00\x1b\x01\x00\x00\f\x00\x00\x00America/LimaTZif2\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x04\x00\x00\x00\f\xff\xff\xff\xffi\x87#\xbc\xff\xff\xff\xff\x8ct@\xd4\xff\xff\xff\xff\xc3\xcfJP\xff\xff\xff\xff\xc4E\xe3@\xff\xff\xff" +
-	"\xff\xc5/J\xd0\xff\xff\xff\xff\xc6\x1f-\xc0\xff\xff\xff\xff\xc7\x0f,\xd0\xff\xff\xff\xff\xc7\xff\x0f\xc0\x00\x00\x00\x00\x1e\x18\xc4P\x00\x00\x00\x00\x1e\x8f]@\x00\x00\x00\x00\x1f\xf9\xf7\xd0\x00\x00\x00\x00 p\x90" +
-	"\xc0\x00\x00\x00\x00%\x9e\xe3\xd0\x00\x00\x00\x00&\x15|\xc0\x00\x00\x00\x00-%\x03P\x00\x00\x00\x00-\x9b\x9c@\x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\xff\xff\xb7\xc4\x00\x00\xff\xff\xb7\xac\x00" +
-	"\x00\xff\xff\xc7\xc0\x01\x04\xff\xff\xb9\xb0\x00\bLMT\x00-04\x00-05\x00\n<-05>5\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf6\"\x12\xfe\x0e\x05\x00\x00\x0e\x05\x00\x00\x13" +
-	"\x00\x00\x00America/Los_AngelesTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00}\x00\x00\x00\x05\x00\x00\x00\x14\xff\xff\xff" +
-	"\xff^\x04\x1a\xc0\xff\xff\xff\xff\x9e\xa6H\xa0\xff\xff\xff\xff\x9f\xbb\x15\x90\xff\xff\xff\xff\xa0\x86*\xa0\xff\xff\xff\xff\xa1\x9a\xf7\x90\xff\xff\xff\xffˉ\x1a\xa0\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2a&" +
-	"\x10\xff\xff\xff\xff\xd6\xfet\\\xff\xff\xff\xff\u0600\xad\x90\xff\xff\xff\xff\xda\xfeÐ\xff\xff\xff\xff\xdb\xc0\x90\x10\xff\xff\xff\xff\xdcޥ\x90\xff\xff\xff\xffݩ\xac\x90\xff\xff\xff\xff\u07be\x87\x90\xff\xff\xff" +
-	"\xff߉\x8e\x90\xff\xff\xff\xff\xe0\x9ei\x90\xff\xff\xff\xff\xe1ip\x90\xff\xff\xff\xff\xe2~K\x90\xff\xff\xff\xff\xe3IR\x90\xff\xff\xff\xff\xe4^-\x90\xff\xff\xff\xff\xe5)4\x90\xff\xff\xff\xff\xe6GJ" +
-	"\x10\xff\xff\xff\xff\xe7\x12Q\x10\xff\xff\xff\xff\xe8',\x10\xff\xff\xff\xff\xe8\xf23\x10\xff\xff\xff\xff\xea\a\x0e\x10\xff\xff\xff\xff\xea\xd2\x15\x10\xff\xff\xff\xff\xeb\xe6\xf0\x10\xff\xff\xff\xff\xec\xb1\xf7\x10\xff\xff\xff" +
-	"\xff\xed\xc6\xd2\x10\xff\xff\xff\xff\xee\x91\xd9\x10\xff\xff\xff\xff\xef\xaf\xee\x90\xff\xff\xff\xff\xf0q\xbb\x10\xff\xff\xff\xff\xf1\x8fА\xff\xff\xff\xff\xf2\x7f\xc1\x90\xff\xff\xff\xff\xf3o\xb2\x90\xff\xff\xff\xff\xf4_\xa3" +
-	"\x90\xff\xff\xff\xff\xf5O\x94\x90\xff\xff\xff\xff\xf6?\x85\x90\xff\xff\xff\xff\xf7/v\x90\xff\xff\xff\xff\xf8(\xa2\x10\xff\xff\xff\xff\xf9\x0fX\x90\xff\xff\xff\xff\xfa\b\x84\x10\xff\xff\xff\xff\xfa\xf8\x83 \xff\xff\xff" +
-	"\xff\xfb\xe8f\x10\xff\xff\xff\xff\xfc\xd8e \xff\xff\xff\xff\xfd\xc8H\x10\xff\xff\xff\xff\xfe\xb8G \xff\xff\xff\xff\xff\xa8*\x10\x00\x00\x00\x00\x00\x98) \x00\x00\x00\x00\x01\x88\f\x10\x00\x00\x00\x00\x02x\v" +
-	" \x00\x00\x00\x00\x03q(\x90\x00\x00\x00\x00\x04a'\xa0\x00\x00\x00\x00\x05Q\n\x90\x00\x00\x00\x00\x06A\t\xa0\x00\x00\x00\x00\a0\xec\x90\x00\x00\x00\x00\a\x8dC\xa0\x00\x00\x00\x00\t\x10ΐ\x00\x00\x00" +
-	"\x00\t\xad\xbf \x00\x00\x00\x00\n\xf0\xb0\x90\x00\x00\x00\x00\v\u0be0\x00\x00\x00\x00\f\xd9\xcd\x10\x00\x00\x00\x00\r\xc0\x91\xa0\x00\x00\x00\x00\x0e\xb9\xaf\x10\x00\x00\x00\x00\x0f\xa9\xae \x00\x00\x00\x00\x10\x99\x91" +
-	"\x10\x00\x00\x00\x00\x11\x89\x90 \x00\x00\x00\x00\x12ys\x10\x00\x00\x00\x00\x13ir \x00\x00\x00\x00\x14YU\x10\x00\x00\x00\x00\x15IT \x00\x00\x00\x00\x1697\x10\x00\x00\x00\x00\x17)6 \x00\x00\x00" +
-	"\x00\x18\"S\x90\x00\x00\x00\x00\x19\t\x18 \x00\x00\x00\x00\x1a\x025\x90\x00\x00\x00\x00\x1a\xf24\xa0\x00\x00\x00\x00\x1b\xe2\x17\x90\x00\x00\x00\x00\x1c\xd2\x16\xa0\x00\x00\x00\x00\x1d\xc1\xf9\x90\x00\x00\x00\x00\x1e\xb1\xf8" +
-	"\xa0\x00\x00\x00\x00\x1f\xa1ې\x00\x00\x00\x00 v+ \x00\x00\x00\x00!\x81\xbd\x90\x00\x00\x00\x00\"V\r \x00\x00\x00\x00#j\xda\x10\x00\x00\x00\x00$5\xef \x00\x00\x00\x00%J\xbc\x10\x00\x00\x00" +
-	"\x00&\x15\xd1 \x00\x00\x00\x00'*\x9e\x10\x00\x00\x00\x00'\xfe\xed\xa0\x00\x00\x00\x00)\n\x80\x10\x00\x00\x00\x00)\xdeϠ\x00\x00\x00\x00*\xeab\x10\x00\x00\x00\x00+\xbe\xb1\xa0\x00\x00\x00\x00,\xd3~" +
-	"\x90\x00\x00\x00\x00-\x9e\x93\xa0\x00\x00\x00\x00.\xb3`\x90\x00\x00\x00\x00/~u\xa0\x00\x00\x00\x000\x93B\x90\x00\x00\x00\x001g\x92 \x00\x00\x00\x002s$\x90\x00\x00\x00\x003Gt \x00\x00\x00" +
-	"\x004S\x06\x90\x00\x00\x00\x005'V \x00\x00\x00\x0062\xe8\x90\x00\x00\x00\x007\a8 \x00\x00\x00\x008\x1c\x05\x10\x00\x00\x00\x008\xe7\x1a \x00\x00\x00\x009\xfb\xe7\x10\x00\x00\x00\x00:\xc6\xfc" +
-	" \x00\x00\x00\x00;\xdb\xc9\x10\x00\x00\x00\x00<\xb0\x18\xa0\x00\x00\x00\x00=\xbb\xab\x10\x00\x00\x00\x00>\x8f\xfa\xa0\x00\x00\x00\x00?\x9b\x8d\x10\x00\x00\x00\x00@oܠ\x00\x00\x00\x00A\x84\xa9\x90\x00\x00\x00" +
-	"\x00BO\xbe\xa0\x00\x00\x00\x00Cd\x8b\x90\x00\x00\x00\x00D/\xa0\xa0\x00\x00\x00\x00EDm\x90\x00\x00\x00\x00E\xf3\xd3 \x02\x01\x02\x01\x02\x03\x04\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\xff\xff\x91&\x00\x00\xff\xff\x9d\x90\x01\x04\xff\xff\x8f\x80\x00\b" +
-	"\xff\xff\x9d\x90\x01\f\xff\xff\x9d\x90\x01\x10LMT\x00PDT\x00PST\x00PWT\x00PPT\x00\nPST8PDT,M3.2.0,M11.1.0\nPK\x03\x04" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdf\xe5\x8d\xc4\xda\x04\x00\x00\xda\x04\x00\x00\x12\x00\x00\x00America/LouisvilleTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00u\x00\x00\x00\a\x00\x00\x00\x1c\xff\xff\xff\xff^\x03\xfe\xa0\xff\xff\xff\xff\x9e\xa6,\x80\xff\xff\xff\xff\x9f\xba\xf9p\xff\xff\xff\xff\xa0\x86\x0e\x80\xff\xff\xff\xff\xa1\x9a\xdbp\xff" +
-	"\xff\xff\xff\xa4s\xf7\x00\xff\xff\xff\xff\xa5\x16\x11p\xff\xff\xff\xff\xca\rN\x80\xff\xff\xff\xff\xca\xd8Gp\xff\xff\xff\xffˈ\xfe\x80\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2a\t\xf0\xff\xff\xff\xff\xd3" +
-	"u\xd7\x1c\xff\xff\xff\xffӤ\tp\xff\xff\xff\xff\xda\xfe\xb5\x80\xff\xff\xff\xff\xdb\xc0s\xf0\xff\xff\xff\xff\xdcޗ\x80\xff\xff\xff\xffݩ\x90p\xff\xff\xff\xff\u07bey\x80\xff\xff\xff\xff߉rp\xff" +
-	"\xff\xff\xff\xe0\x9e[\x80\xff\xff\xff\xff\xe1iTp\xff\xff\xff\xff\xe2~=\x80\xff\xff\xff\xff\xe3I6p\xff\xff\xff\xff\xe4^\x1f\x80\xff\xff\xff\xff\xe5)\x18p\xff\xff\xff\xff\xe6G<\x00\xff\xff\xff\xff\xe7" +
-	"7\x1e\xf0\xff\xff\xff\xff\xe8'\x1e\x00\xff\xff\xff\xff\xe9\x17\x00\xf0\xff\xff\xff\xff\xea\a\x00\x00\xff\xff\xff\xff\xea\xf6\xe2\xf0\xff\xff\xff\xff\xeb\xe6\xe2\x00\xff\xff\xff\xff\xec\xd6\xc4\xf0\xff\xff\xff\xff\xed\xc6\xc4\x00\xff" +
-	"\xff\xff\xff\xee\xbf\xe1p\xff\xff\xff\xff\xef\xaf\xe0\x80\xff\xff\xff\xff\xf0\x1e\x90p\xff\xff\xff\xff\xfc\xd8:\xf0\xff\xff\xff\xff\xfd\xc8\x1d\xe0\xff\xff\xff\xff\xfe\xb8\x1c\xf0\xff\xff\xff\xff\xff\xa7\xff\xe0\x00\x00\x00\x00\x00" +
-	"\x97\xfe\xf0\x00\x00\x00\x00\x01\x87\xe1\xe0\x00\x00\x00\x00\x02w\xe0\xf0\x00\x00\x00\x00\x03p\xfe`\x00\x00\x00\x00\x04`\xfdp\x00\x00\x00\x00\x05P\xe0`\x00\x00\x00\x00\x06@\xdfp\x00\x00\x00\x00\a0\xc2`\x00" +
-	"\x00\x00\x00\a\x8d\x19p\x00\x00\x00\x00\t\x10\xb2p\x00\x00\x00\x00\t\xad\x94\xf0\x00\x00\x00\x00\n\xf0\x86`\x00\x00\x00\x00\v\xe0\x85p\x00\x00\x00\x00\f٢\xe0\x00\x00\x00\x00\r\xc0gp\x00\x00\x00\x00\x0e" +
-	"\xb9\x84\xe0\x00\x00\x00\x00\x0f\xa9\x83\xf0\x00\x00\x00\x00\x10\x99f\xe0\x00\x00\x00\x00\x11\x89e\xf0\x00\x00\x00\x00\x12yH\xe0\x00\x00\x00\x00\x13iG\xf0\x00\x00\x00\x00\x14Y*\xe0\x00\x00\x00\x00\x15I)\xf0\x00" +
-	"\x00\x00\x00\x169\f\xe0\x00\x00\x00\x00\x17)\v\xf0\x00\x00\x00\x00\x18\")`\x00\x00\x00\x00\x19\b\xed\xf0\x00\x00\x00\x00\x1a\x02\v`\x00\x00\x00\x00\x1a\xf2\np\x00\x00\x00\x00\x1b\xe1\xed`\x00\x00\x00\x00\x1c" +
-	"\xd1\xecp\x00\x00\x00\x00\x1d\xc1\xcf`\x00\x00\x00\x00\x1e\xb1\xcep\x00\x00\x00\x00\x1f\xa1\xb1`\x00\x00\x00\x00 v\x00\xf0\x00\x00\x00\x00!\x81\x93`\x00\x00\x00\x00\"U\xe2\xf0\x00\x00\x00\x00#j\xaf\xe0\x00" +
-	"\x00\x00\x00$5\xc4\xf0\x00\x00\x00\x00%J\x91\xe0\x00\x00\x00\x00&\x15\xa6\xf0\x00\x00\x00\x00'*s\xe0\x00\x00\x00\x00'\xfe\xc3p\x00\x00\x00\x00)\nU\xe0\x00\x00\x00\x00)ޥp\x00\x00\x00\x00*" +
-	"\xea7\xe0\x00\x00\x00\x00+\xbe\x87p\x00\x00\x00\x00,\xd3T`\x00\x00\x00\x00-\x9eip\x00\x00\x00\x00.\xb36`\x00\x00\x00\x00/~Kp\x00\x00\x00\x000\x93\x18`\x00\x00\x00\x001gg\xf0\x00" +
-	"\x00\x00\x002r\xfa`\x00\x00\x00\x003GI\xf0\x00\x00\x00\x004R\xdc`\x00\x00\x00\x005'+\xf0\x00\x00\x00\x0062\xbe`\x00\x00\x00\x007\a\r\xf0\x00\x00\x00\x008\x1b\xda\xe0\x00\x00\x00\x008" +
-	"\xe6\xef\xf0\x00\x00\x00\x009\xfb\xbc\xe0\x00\x00\x00\x00:\xc6\xd1\xf0\x00\x00\x00\x00;۞\xe0\x00\x00\x00\x00<\xaf\xeep\x00\x00\x00\x00=\xbb\x80\xe0\x00\x00\x00\x00>\x8f\xd0p\x00\x00\x00\x00?\x9bb\xe0\x00" +
-	"\x00\x00\x00@o\xb2p\x00\x00\x00\x00A\x84\x7f`\x00\x00\x00\x00BO\x94p\x00\x00\x00\x00Cda`\x00\x00\x00\x00D/vp\x00\x00\x00\x00EDC`\x00\x00\x00\x00E\xf3\xa8\xf0\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x03\x04\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x01\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06" +
-	"\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\xff\xff\xaf\x9a\x00\x00\xff\xff" +
-	"\xb9\xb0\x01\x04\xff\xff\xab\xa0\x00\b\xff\xff\xb9\xb0\x01\f\xff\xff\xb9\xb0\x01\x10\xff\xff\xb9\xb0\x00\x14\xff\xff\xc7\xc0\x01\x18LMT\x00CDT\x00CST\x00CWT\x00CPT\x00EST\x00ED" +
-	"T\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00q\xc9*;\xb1\x00\x00\x00\xb1\x00\x00\x00\x15\x00\x00\x00Amer" +
-	"ica/Lower_PrincesTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" +
-	"\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x10\xff\xff\xff\xffz敹" +
-	"\xff\xff\xff\xff\xcb\xf62\xc0\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2`\xed\xd0\x01\x03\x02\x01\xff\xff\xc2\a\x00\x00\xff\xff\xc7\xc0\x00\x04\xff\xff\xd5\xd0\x01\b\xff\xff\xd5\xd0\x01\fLMT\x00AST\x00" +
-	"APT\x00AWT\x00\nAST4\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00挋\x92\xf6\x01\x00\x00\xf6\x01\x00\x00\x0e\x00\x00\x00America/MaceioTZ" +
-	"if2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00)\x00\x00\x00\x03\x00\x00\x00\f\xff\xff\xff\xff\x96\xaah|\xff\xff\xff\xff\xb8\x0fI\xe0\xff\xff\xff\xff\xb8\xfd@\xa0\xff\xff\xff" +
-	"\xff\xb9\xf140\xff\xff\xff\xff\xba\xdet \xff\xff\xff\xff\xda8\xae0\xff\xff\xff\xff\xda\xeb\xfa0\xff\xff\xff\xff\xdc\x19\xe1\xb0\xff\xff\xff\xffܹY \xff\xff\xff\xff\xdd\xfb\x150\xff\xff\xff\xffޛ\xde" +
-	" \xff\xff\xff\xff\xdfݚ0\xff\xff\xff\xff\xe0T3 \xff\xff\xff\xff\xf4\x97\xff\xb0\xff\xff\xff\xff\xf5\x05^ \xff\xff\xff\xff\xf6\xc0d0\xff\xff\xff\xff\xf7\x0e\x1e\xa0\xff\xff\xff\xff\xf8Q,0\xff\xff\xff" +
-	"\xff\xf8\xc7\xc5 \xff\xff\xff\xff\xfa\nҰ\xff\xff\xff\xff\xfa\xa8\xf8\xa0\xff\xff\xff\xff\xfb\xec\x060\xff\xff\xff\xff\xfc\x8b}\xa0\x00\x00\x00\x00\x1dɎ0\x00\x00\x00\x00\x1exנ\x00\x00\x00\x00\x1f\xa05" +
-	"\xb0\x00\x00\x00\x00 3Ϡ\x00\x00\x00\x00!\x81i0\x00\x00\x00\x00\"\vȠ\x00\x00\x00\x00#X\x10\xb0\x00\x00\x00\x00#\xe2p \x00\x00\x00\x00%7\xf2\xb0\x00\x00\x00\x00%\xd4\xc7 \x00\x00\x00" +
-	"\x000\x80y0\x00\x00\x00\x001\x1dM\xa0\x00\x00\x00\x007\xf6ư\x00\x00\x00\x008\xb8\x85 \x00\x00\x00\x009\xdf\xe30\x00\x00\x00\x009\xf2J \x00\x00\x00\x00;\xc8\xff\xb0\x00\x00\x00\x00<o\x0e" +
-	"\xa0\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\xff\xffބ\x00\x00\xff\xff\xe3\xe0\x01\x04\xff\xff\xd5\xd0\x00\b" +
-	"LMT\x00-02\x00-03\x00\n<-03>3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe5s\xb3\\'\x01\x00\x00'\x01\x00\x00\x0f\x00\x00\x00America/Ma" +
-	"naguaTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif" +
-	"2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x05\x00\x00\x00\x14\xff\xff\xff\xffi\x87,d\xff\xff\xff\xff\xbd-H\xe8\x00\x00\x00\x00" +
-	"\x06Ct`\x00\x00\x00\x00\t\xa4>P\x00\x00\x00\x00\x11Q\xf8\xe0\x00\x00\x00\x00\x11\xd4oP\x00\x00\x00\x00\x131\xda\xe0\x00\x00\x00\x00\x13\xb4QP\x00\x00\x00\x00)a\x91 \x00\x00\x00\x00*\xc1KP" +
-	"\x00\x00\x00\x00+C\xdd\xe0\x00\x00\x00\x002\xc9\xefP\x00\x00\x00\x00BX\xc0\xe0\x00\x00\x00\x00C?iP\x00\x00\x00\x00DTn\x80\x00\x00\x00\x00E\x1fY`\x01\x02\x03\x02\x04\x02\x04\x02\x03\x02\x03\x02" +
-	"\x04\x02\x04\x02\xff\xff\xaf\x1c\x00\x00\xff\xff\xaf\x18\x00\x04\xff\xff\xab\xa0\x00\b\xff\xff\xb9\xb0\x00\f\xff\xff\xb9\xb0\x01\x10LMT\x00MMT\x00CST\x00EST\x00CDT\x00\nCST6\n" +
-	"PK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00a\xcb'\xe9\x9c\x01\x00\x00\x9c\x01\x00\x00\x0e\x00\x00\x00America/ManausTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1f\x00\x00\x00\x03\x00\x00\x00\f\xff\xff\xff\xff\x96\xaa\x7fD\xff\xff\xff\xff\xb8\x0fW\xf0\xff\xff\xff\xff\xb8\xfdN\xb0\xff\xff\xff\xff\xb9\xf1B@\xff\xff\xff\xff\xbaނ0\xff" +
-	"\xff\xff\xff\xda8\xbc@\xff\xff\xff\xff\xda\xec\b@\xff\xff\xff\xff\xdc\x19\xef\xc0\xff\xff\xff\xffܹg0\xff\xff\xff\xff\xdd\xfb#@\xff\xff\xff\xffޛ\xec0\xff\xff\xff\xff\xdfݨ@\xff\xff\xff\xff\xe0" +
-	"TA0\xff\xff\xff\xff\xf4\x98\r\xc0\xff\xff\xff\xff\xf5\x05l0\xff\xff\xff\xff\xf6\xc0r@\xff\xff\xff\xff\xf7\x0e,\xb0\xff\xff\xff\xff\xf8Q:@\xff\xff\xff\xff\xf8\xc7\xd30\xff\xff\xff\xff\xfa\n\xe0\xc0\xff" +
-	"\xff\xff\xff\xfa\xa9\x06\xb0\xff\xff\xff\xff\xfb\xec\x14@\xff\xff\xff\xff\xfc\x8b\x8b\xb0\x00\x00\x00\x00\x1dɜ@\x00\x00\x00\x00\x1ex\xe5\xb0\x00\x00\x00\x00\x1f\xa0C\xc0\x00\x00\x00\x00 3ݰ\x00\x00\x00\x00!" +
-	"\x81w@\x00\x00\x00\x00\"\vְ\x00\x00\x00\x00,\xc0\xc3@\x00\x00\x00\x00-f\xd20\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\xff\xff" +
-	"Ǽ\x00\x00\xff\xff\xd5\xd0\x01\x04\xff\xff\xc7\xc0\x00\bLMT\x00-03\x00-04\x00\n<-04>4\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00q\xc9*;\xb1\x00\x00\x00\xb1\x00" +
-	"\x00\x00\x0f\x00\x00\x00America/MarigotTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x10\xff\xff\xff\xff" +
-	"z敹\xff\xff\xff\xff\xcb\xf62\xc0\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2`\xed\xd0\x01\x03\x02\x01\xff\xff\xc2\a\x00\x00\xff\xff\xc7\xc0\x00\x04\xff\xff\xd5\xd0\x01\b\xff\xff\xd5\xd0\x01\fLMT\x00" +
-	"AST\x00APT\x00AWT\x00\nAST4\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa7\x17jҲ\x00\x00\x00\xb2\x00\x00\x00\x12\x00\x00\x00America/Mart" +
-	"iniqueTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZi" +
-	"f2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x11\xff\xff\xff\xffi\x87\x14\xc4\xff\xff\xff\xff\x91\xa3\xc8D\x00\x00\x00" +
-	"\x00\x13Mn@\x00\x00\x00\x00\x144\x16\xb0\x01\x02\x03\x02\xff\xffƼ\x00\x00\xff\xffƼ\x00\x04\xff\xff\xc7\xc0\x00\t\xff\xff\xd5\xd0\x01\rLMT\x00FFMT\x00AST\x00ADT\x00\nA" +
-	"ST4\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00((i\xe4\xb5\x01\x00\x00\xb5\x01\x00\x00\x11\x00\x00\x00America/MatamorosTZif2\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\x00\x00\x03\x00\x00\x00\f\xff\xff\xff\xff\xa5\xb6\xda`\x00\x00\x00\x00\"U\xf1\x00\x00\x00\x00\x00#j\xbd\xf0\x00\x00\x00\x001gv\x00\x00\x00" +
-	"\x00\x002s\bp\x00\x00\x00\x003GX\x00\x00\x00\x00\x004R\xeap\x00\x00\x00\x005':\x00\x00\x00\x00\x0062\xccp\x00\x00\x00\x007\a\x1c\x00\x00\x00\x00\x008\x1b\xe8\xf0\x00\x00\x00\x008\xe6" +
-	"\xfe\x00\x00\x00\x00\x009\xfb\xca\xf0\x00\x00\x00\x00:\xf5\x04\x80\x00\x00\x00\x00;\xb6\xc2\xf0\x00\x00\x00\x00<\xaf\xfc\x80\x00\x00\x00\x00=\xbb\x8e\xf0\x00\x00\x00\x00>\x8fހ\x00\x00\x00\x00?\x9bp\xf0\x00\x00" +
-	"\x00\x00@o\xc0\x80\x00\x00\x00\x00A\x84\x8dp\x00\x00\x00\x00BO\xa2\x80\x00\x00\x00\x00Cdop\x00\x00\x00\x00D/\x84\x80\x00\x00\x00\x00EDQp\x00\x00\x00\x00F\x0ff\x80\x00\x00\x00\x00G$" +
-	"3p\x00\x00\x00\x00G\xf8\x83\x00\x00\x00\x00\x00I\x04\x15p\x00\x00\x00\x00I\xd8e\x00\x00\x00\x00\x00J\xe3\xf7p\x00\x00\x00\x00K\x9c\x97\x80\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\xff\xff\xa4\x98\x00\x00\xff\xff\xab\xa0\x00\x04\xff\xff\xb9\xb0\x01\bLMT\x00CST\x00CDT\x00\nCST6CDT,M3.2.0," +
-	"M11.1.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\xad=\x98\xce\x02\x00\x00\xce\x02\x00\x00\x10\x00\x00\x00America/MazatlanTZif2\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?\x00\x00\x00\x05\x00\x00\x00\x14\xff\xff\xff\xff\xa5\xb6\xe8p\xff\xff\xff\xff\xaf\xf2n\xe0\xff\xff\xff\xff\xb6fV`\xff\xff\xff\xff\xb7C\xd2" +
-	"`\xff\xff\xff\xff\xb8\f6`\xff\xff\xff\xff\xb8\xfd\x86\xf0\xff\xff\xff\xff\xcb\xeaq`\xff\xff\xff\xffؑ\xb4\xf0\x00\x00\x00\x00\x00\x00p\x80\x00\x00\x00\x001g\x84\x10\x00\x00\x00\x002s\x16\x80\x00\x00\x00" +
-	"\x003Gf\x10\x00\x00\x00\x004R\xf8\x80\x00\x00\x00\x005'H\x10\x00\x00\x00\x0062ڀ\x00\x00\x00\x007\a*\x10\x00\x00\x00\x008\x1b\xf7\x00\x00\x00\x00\x008\xe7\f\x10\x00\x00\x00\x009\xfb\xd9" +
-	"\x00\x00\x00\x00\x00:\xf5\x12\x90\x00\x00\x00\x00;\xb6\xd1\x00\x00\x00\x00\x00<\xb0\n\x90\x00\x00\x00\x00=\xbb\x9d\x00\x00\x00\x00\x00>\x8f\xec\x90\x00\x00\x00\x00?\x9b\x7f\x00\x00\x00\x00\x00@oΐ\x00\x00\x00" +
-	"\x00A\x84\x9b\x80\x00\x00\x00\x00BO\xb0\x90\x00\x00\x00\x00Cd}\x80\x00\x00\x00\x00D/\x92\x90\x00\x00\x00\x00ED_\x80\x00\x00\x00\x00F\x0ft\x90\x00\x00\x00\x00G$A\x80\x00\x00\x00\x00G\xf8\x91" +
-	"\x10\x00\x00\x00\x00I\x04#\x80\x00\x00\x00\x00I\xd8s\x10\x00\x00\x00\x00J\xe4\x05\x80\x00\x00\x00\x00K\xb8U\x10\x00\x00\x00\x00L\xcd\"\x00\x00\x00\x00\x00M\x987\x10\x00\x00\x00\x00N\xad\x04\x00\x00\x00\x00" +
-	"\x00Ox\x19\x10\x00\x00\x00\x00P\x8c\xe6\x00\x00\x00\x00\x00Qa5\x90\x00\x00\x00\x00Rl\xc8\x00\x00\x00\x00\x00SA\x17\x90\x00\x00\x00\x00TL\xaa\x00\x00\x00\x00\x00U \xf9\x90\x00\x00\x00\x00V,\x8c" +
-	"\x00\x00\x00\x00\x00W\x00ې\x00\x00\x00\x00X\x15\xa8\x80\x00\x00\x00\x00Xཐ\x00\x00\x00\x00Y\xf5\x8a\x80\x00\x00\x00\x00Z\xc0\x9f\x90\x00\x00\x00\x00[\xd5l\x80\x00\x00\x00\x00\\\xa9\xbc\x10\x00\x00\x00" +
-	"\x00]\xb5N\x80\x00\x00\x00\x00^\x89\x9e\x10\x00\x00\x00\x00_\x950\x80\x00\x00\x00\x00`i\x80\x10\x00\x00\x00\x00a~M\x00\x00\x00\x00\x00bIb\x10\x00\x00\x00\x00c^/\x00\x01\x02\x01\x03\x01\x02\x01" +
-	"\x04\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\xff\xff\x9c<" +
-	"\x00\x00\xff\xff\x9d\x90\x00\x04\xff\xff\xab\xa0\x00\b\xff\xff\xab\xa0\x01\f\xff\xff\x8f\x80\x00\x10LMT\x00MST\x00CST\x00MDT\x00PST\x00\nMST7\nPK\x03\x04\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00ŒZ\x8c\xc4\x02\x00\x00\xc4\x02\x00\x00\x0f\x00\x00\x00America/MendozaTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00=\x00\x00\x00\x06\x00\x00\x00\x14\xff\xff\xff\xffr\x9c\xb2\x04\xff\xff\xff\xff\xa2\x92\x8f0\xff\xff\xff\xff\xb6{R@\xff\xff\xff\xff\xb7\x1aɰ\xff\xff\xff\xff\xb8\x1e\x8f@\xff\xff\xff\xff\xb8\xd4p0" +
-	"\xff\xff\xff\xff\xba\x17}\xc0\xff\xff\xff\xff\xba\xb5\xa3\xb0\xff\xff\xff\xff\xbb\xf8\xb1@\xff\xff\xff\xff\xbc\x96\xd70\xff\xff\xff\xff\xbd\xd9\xe4\xc0\xff\xff\xff\xff\xbex\n\xb0\xff\xff\xff\xff\xbf\xbb\x18@\xff\xff\xff\xff" +
-	"\xc0Z\x8f\xb0\xff\xff\xff\xff\xc1\x9d\x9d@\xff\xff\xff\xff\xc2;\xc30\xff\xff\xff\xff\xc3~\xd0\xc0\xff\xff\xff\xff\xc4\x1c\xf6\xb0\xff\xff\xff\xff\xc5`\x04@\xff\xff\xff\xff\xc5\xfe*0\xff\xff\xff\xff\xc7A7\xc0" +
-	"\xff\xff\xff\xff\xc7\xe0\xaf0\xff\xff\xff\xffȁ\x94@\xff\xff\xff\xff\xcaM\xa1\xb0\xff\xff\xff\xff\xca\xee\x86\xc0\xff\xff\xff\xff\xceM\xff0\xff\xff\xff\xffΰ\xed\xc0\xff\xff\xff\xff\xd3)5\xb0\xff\xff\xff\xff" +
-	"\xd4Cd\xc0\xff\xff\xff\xff\xf4=\b0\xff\xff\xff\xff\xf4\x9f\xf6\xc0\xff\xff\xff\xff\xf5\x05l0\xff\xff\xff\xff\xf62\x10@\xff\xff\xff\xff\xf6柰\xff\xff\xff\xff\xf8\x13C\xc0\xff\xff\xff\xff\xf8\xc7\xd30" +
-	"\xff\xff\xff\xff\xf9\xf4w@\xff\xff\xff\xff\xfa\xd36\xb0\xff\xff\xff\xff\xfb\xc35\xc0\xff\xff\xff\xff\xfc\xbcS0\xff\xff\xff\xff\xfd\xacR@\xff\xff\xff\xff\xfe\x9c50\xff\xff\xff\xff\xff\x8c4@\x00\x00\x00\x00" +
-	"\a\xa3J\xb0\x00\x00\x00\x00\b$o\xa0\x00\x00\x00\x00#\x94\xb5\xb0\x00\x00\x00\x00$\x10\x94\xa0\x00\x00\x00\x00%7\xf2\xb0\x00\x00\x00\x00%\xf0v\xa0\x00\x00\x00\x00'\x194@\x00\x00\x00\x00'\xcdð" +
-	"\x00\x00\x00\x00(\xfag\xc0\x00\x00\x00\x00)\xb0H\xb0\x00\x00\x00\x00*\xe0\xe1@\x00\x00\x00\x00+\x99W \x00\x00\x00\x007\xf6ư\x00\x00\x00\x008\xbf*\xb0\x00\x00\x00\x00@\xb0\x13\xb0\x00\x00\x00\x00" +
-	"AV>\xc0\x00\x00\x00\x00Gw\t\xb0\x00\x00\x00\x00G\xdc\x7f \x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02" +
-	"\x03\x02\x05\x04\x05\x04\x05\x04\x02\x03\x02\x03\x02\x04\x05\x03\x05\x02\x05\x04\x05\xff\xff\xbf|\x00\x00\xff\xff\xc3\xd0\x00\x04\xff\xff\xc7\xc0\x00\b\xff\xff\xd5\xd0\x01\f\xff\xff\xe3\xe0\x01\x10\xff\xff\xd5\xd0\x00\fLMT" +
-	"\x00CMT\x00-04\x00-03\x00-02\x00\n<-03>3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x008O:\xbf\x95\x03\x00\x00\x95\x03\x00\x00\x11\x00\x00\x00Ameri" +
-	"ca/MenomineeTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00" +
-	"\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00R\x00\x00\x00\x06\x00\x00\x00\x18\xff\xff\xff\xffawIc\xff\xff\xff\xff\x9e" +
-	"\xa6,\x80\xff\xff\xff\xff\x9f\xba\xf9p\xff\xff\xff\xff\xa0\x86\x0e\x80\xff\xff\xff\xff\xa1\x9a\xdbp\xff\xff\xff\xffˈ\xfe\x80\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2a\t\xf0\xff\xff\xff\xff\xd3u\xf3\x00\xff" +
-	"\xff\xff\xff\xd4@\xeb\xf0\xff\xff\xff\xff\xf9\x0fJ\x80\xff\xff\xff\xff\xfa\bg\xf0\xff\xff\xff\xff\xfe\xb8+\x00\x00\x00\x00\x00\x06@\xdfp\x00\x00\x00\x00\a0\xd0p\x00\x00\x00\x00\a\x8d'\x80\x00\x00\x00\x00\t" +
-	"\x10\xb2p\x00\x00\x00\x00\t\xad\xa3\x00\x00\x00\x00\x00\n\xf0\x94p\x00\x00\x00\x00\v\xe0\x93\x80\x00\x00\x00\x00\fٰ\xf0\x00\x00\x00\x00\r\xc0u\x80\x00\x00\x00\x00\x0e\xb9\x92\xf0\x00\x00\x00\x00\x0f\xa9\x92\x00\x00" +
-	"\x00\x00\x00\x10\x99t\xf0\x00\x00\x00\x00\x11\x89t\x00\x00\x00\x00\x00\x12yV\xf0\x00\x00\x00\x00\x13iV\x00\x00\x00\x00\x00\x14Y8\xf0\x00\x00\x00\x00\x15I8\x00\x00\x00\x00\x00\x169\x1a\xf0\x00\x00\x00\x00\x17" +
-	")\x1a\x00\x00\x00\x00\x00\x18\"7p\x00\x00\x00\x00\x19\b\xfc\x00\x00\x00\x00\x00\x1a\x02\x19p\x00\x00\x00\x00\x1a\xf2\x18\x80\x00\x00\x00\x00\x1b\xe1\xfbp\x00\x00\x00\x00\x1c\xd1\xfa\x80\x00\x00\x00\x00\x1d\xc1\xddp\x00" +
-	"\x00\x00\x00\x1e\xb1܀\x00\x00\x00\x00\x1f\xa1\xbfp\x00\x00\x00\x00 v\x0f\x00\x00\x00\x00\x00!\x81\xa1p\x00\x00\x00\x00\"U\xf1\x00\x00\x00\x00\x00#j\xbd\xf0\x00\x00\x00\x00$5\xd3\x00\x00\x00\x00\x00%" +
-	"J\x9f\xf0\x00\x00\x00\x00&\x15\xb5\x00\x00\x00\x00\x00'*\x81\xf0\x00\x00\x00\x00'\xfeр\x00\x00\x00\x00)\nc\xf0\x00\x00\x00\x00)\u07b3\x80\x00\x00\x00\x00*\xeaE\xf0\x00\x00\x00\x00+\xbe\x95\x80\x00" +
-	"\x00\x00\x00,\xd3bp\x00\x00\x00\x00-\x9ew\x80\x00\x00\x00\x00.\xb3Dp\x00\x00\x00\x00/~Y\x80\x00\x00\x00\x000\x93&p\x00\x00\x00\x001gv\x00\x00\x00\x00\x002s\bp\x00\x00\x00\x003" +
-	"GX\x00\x00\x00\x00\x004R\xeap\x00\x00\x00\x005':\x00\x00\x00\x00\x0062\xccp\x00\x00\x00\x007\a\x1c\x00\x00\x00\x00\x008\x1b\xe8\xf0\x00\x00\x00\x008\xe6\xfe\x00\x00\x00\x00\x009\xfb\xca\xf0\x00" +
-	"\x00\x00\x00:\xc6\xe0\x00\x00\x00\x00\x00;۬\xf0\x00\x00\x00\x00<\xaf\xfc\x80\x00\x00\x00\x00=\xbb\x8e\xf0\x00\x00\x00\x00>\x8fހ\x00\x00\x00\x00?\x9bp\xf0\x00\x00\x00\x00@o\xc0\x80\x00\x00\x00\x00A" +
-	"\x84\x8dp\x00\x00\x00\x00BO\xa2\x80\x00\x00\x00\x00Cdop\x00\x00\x00\x00D/\x84\x80\x00\x00\x00\x00EDQp\x00\x00\x00\x00E\xf3\xb7\x00\x02\x01\x02\x01\x02\x03\x04\x02\x01\x02\x01\x02\x05\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\xff\xff\xad\xdd\x00\x00\xff\xff\xb9\xb0\x01\x04\xff\xff\xab\xa0\x00\b\xff\xff\xb9\xb0\x01\f\xff\xff\xb9\xb0\x01\x10\xff\xff\xb9\xb0\x00\x14LMT\x00CDT\x00CST\x00CWT\x00CPT" +
-	"\x00EST\x00\nCST6CDT,M3.2.0,M11.1.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\xbd\x809\x8e\x02\x00\x00\x8e\x02\x00\x00\x0e\x00\x00\x00A" +
-	"merica/MeridaTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00" +
-	"\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x009\x00\x00\x00\x04\x00\x00\x00\x10\xff\xff\xff\xff\xa5\xb6\xda`\x00\x00\x00\x00" +
-	"\x16\x86\xd5`\x00\x00\x00\x00\x18LKP\x00\x00\x00\x001gv\x00\x00\x00\x00\x002s\bp\x00\x00\x00\x003GX\x00\x00\x00\x00\x004R\xeap\x00\x00\x00\x005':\x00\x00\x00\x00\x0062\xccp" +
-	"\x00\x00\x00\x007\a\x1c\x00\x00\x00\x00\x008\x1b\xe8\xf0\x00\x00\x00\x008\xe6\xfe\x00\x00\x00\x00\x009\xfb\xca\xf0\x00\x00\x00\x00:\xf5\x04\x80\x00\x00\x00\x00;\xb6\xc2\xf0\x00\x00\x00\x00<\xaf\xfc\x80\x00\x00\x00\x00" +
-	"=\xbb\x8e\xf0\x00\x00\x00\x00>\x8fހ\x00\x00\x00\x00?\x9bp\xf0\x00\x00\x00\x00@o\xc0\x80\x00\x00\x00\x00A\x84\x8dp\x00\x00\x00\x00BO\xa2\x80\x00\x00\x00\x00Cdop\x00\x00\x00\x00D/\x84\x80" +
-	"\x00\x00\x00\x00EDQp\x00\x00\x00\x00F\x0ff\x80\x00\x00\x00\x00G$3p\x00\x00\x00\x00G\xf8\x83\x00\x00\x00\x00\x00I\x04\x15p\x00\x00\x00\x00I\xd8e\x00\x00\x00\x00\x00J\xe3\xf7p\x00\x00\x00\x00" +
-	"K\xb8G\x00\x00\x00\x00\x00L\xcd\x13\xf0\x00\x00\x00\x00M\x98)\x00\x00\x00\x00\x00N\xac\xf5\xf0\x00\x00\x00\x00Ox\v\x00\x00\x00\x00\x00P\x8c\xd7\xf0\x00\x00\x00\x00Qa'\x80\x00\x00\x00\x00Rl\xb9\xf0" +
-	"\x00\x00\x00\x00SA\t\x80\x00\x00\x00\x00TL\x9b\xf0\x00\x00\x00\x00U \xeb\x80\x00\x00\x00\x00V,}\xf0\x00\x00\x00\x00W\x00̀\x00\x00\x00\x00X\x15\x9ap\x00\x00\x00\x00Xீ\x00\x00\x00\x00" +
-	"Y\xf5|p\x00\x00\x00\x00Z\xc0\x91\x80\x00\x00\x00\x00[\xd5^p\x00\x00\x00\x00\\\xa9\xae\x00\x00\x00\x00\x00]\xb5@p\x00\x00\x00\x00^\x89\x90\x00\x00\x00\x00\x00_\x95\"p\x00\x00\x00\x00`ir\x00" +
-	"\x00\x00\x00\x00a~>\xf0\x00\x00\x00\x00bIT\x00\x00\x00\x00\x00c^ \xf0\x01\x02\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03" +
-	"\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\xff\xff\xab\xfc\x00\x00\xff\xff\xab\xa0\x00\x04\xff\xff\xb9\xb0\x00\b\xff\xff\xb9\xb0\x01\fLMT\x00CST\x00EST\x00CDT" +
-	"\x00\nCST6\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x81\xbfyS\x02\x00\x00S\x02\x00\x00\x12\x00\x00\x00America/MetlakatlaTZif2" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00,\x00\x00\x00\b\x00\x00\x00\x1e\xff\xff\xff\xff?\xc2\xfd\xd1\xff\xff\xff\xff}\x870\x1a\xff\xff\xff\xffˉ\x1a\xa0\xff\xff\xff\xff\xd2#" +
-	"\xf4p\xff\xff\xff\xff\xd2a&\x10\xff\xff\xff\xff\xfe\xb8G \xff\xff\xff\xff\xff\xa8*\x10\x00\x00\x00\x00\x00\x98) \x00\x00\x00\x00\x01\x88\f\x10\x00\x00\x00\x00\x02x\v \x00\x00\x00\x00\x03q(\x90\x00\x00" +
-	"\x00\x00\x04a'\xa0\x00\x00\x00\x00\x05Q\n\x90\x00\x00\x00\x00\x06A\t\xa0\x00\x00\x00\x00\a0\xec\x90\x00\x00\x00\x00\a\x8dC\xa0\x00\x00\x00\x00\t\x10ΐ\x00\x00\x00\x00\t\xad\xbf \x00\x00\x00\x00\n\xf0" +
-	"\xb0\x90\x00\x00\x00\x00\v\u0be0\x00\x00\x00\x00\f\xd9\xcd\x10\x00\x00\x00\x00\r\xc0\x91\xa0\x00\x00\x00\x00\x0e\xb9\xaf\x10\x00\x00\x00\x00\x0f\xa9\xae \x00\x00\x00\x00\x10\x99\x91\x10\x00\x00\x00\x00\x11\x89\x90 \x00\x00" +
-	"\x00\x00\x12ys\x10\x00\x00\x00\x00\x13ir \x00\x00\x00\x00\x14YU\x10\x00\x00\x00\x00\x15IT \x00\x00\x00\x00\x1697\x10\x00\x00\x00\x00\x17)6 \x00\x00\x00\x00\x18\"S\x90\x00\x00\x00\x00\x19\t" +
-	"\x18 \x00\x00\x00\x00\x1a\x025\x90\x00\x00\x00\x00V5\xe2\xa0\x00\x00\x00\x00V\xe5H0\x00\x00\x00\x00X\x1e\xff \x00\x00\x00\x00X\xc5*0\x00\x00\x00\x00Y\xfe\xe1 \x00\x00\x00\x00Z\xa5\f0\x00\x00" +
-	"\x00\x00[\xde\xc3 \x00\x00\x00\x00\\DF\xa0\x00\x00\x00\x00\\\x84\xee0\x01\x02\x03\x04\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x06\a\x06" +
-	"\a\x06\a\x02\x06\a\x00\x00\xd6&\x00\x00\xff\xff\x84\xa6\x00\x00\xff\xff\x8f\x80\x00\x04\xff\xff\x9d\x90\x01\b\xff\xff\x9d\x90\x01\f\xff\xff\x9d\x90\x01\x10\xff\xff\x81p\x00\x14\xff\xff\x8f\x80\x01\x19LMT\x00PS" +
-	"T\x00PWT\x00PPT\x00PDT\x00AKST\x00AKDT\x00\nAKST9AKDT,M3.2.0,M11.1.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\xd5\b\x89\x8c\x05\x03\x00\x00\x05\x03\x00\x00\x13\x00\x00\x00America/Mexico_CityTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00D\x00\x00\x00\x06\x00\x00\x00\x18\xff\xff\xff\xff\xa5\xb6\xe8p\xff\xff\xff\xff\xaf\xf2n\xe0\xff\xff\xff\xff\xb6fV`\xff\xff\xff\xff\xb7C\xd2`\xff\xff\xff\xff\xb8\f6`\xff\xff\xff\xff\xb8\xfd" +
-	"\x86\xf0\xff\xff\xff\xff\xc5ް`\xff\xff\xff\xffƗ4P\xff\xff\xff\xff\xc9U\xf1\xe0\xff\xff\xff\xff\xc9\xea\xddP\xff\xff\xff\xff\xcf\x02\xc6\xe0\xff\xff\xff\xffϷVP\xff\xff\xff\xffڙ\x15\xe0\xff\xff" +
-	"\xff\xff\xdbv\x83\xd0\x00\x00\x00\x001gv\x00\x00\x00\x00\x002s\bp\x00\x00\x00\x003GX\x00\x00\x00\x00\x004R\xeap\x00\x00\x00\x005':\x00\x00\x00\x00\x0062\xccp\x00\x00\x00\x007\a" +
-	"\x1c\x00\x00\x00\x00\x008\x1b\xe8\xf0\x00\x00\x00\x008\xe6\xfe\x00\x00\x00\x00\x009\xfb\xca\xf0\x00\x00\x00\x00:\xf5\x04\x80\x00\x00\x00\x00;\xb6\xc2\xf0\x00\x00\x00\x00<\xaf\xfc\x80\x00\x00\x00\x00=\xbb\x8e\xf0\x00\x00" +
-	"\x00\x00>\x8fހ\x00\x00\x00\x00?\x9bp\xf0\x00\x00\x00\x00@o\xc0\x80\x00\x00\x00\x00A\x84\x8dp\x00\x00\x00\x00BO\xa2\x80\x00\x00\x00\x00Cdop\x00\x00\x00\x00D/\x84\x80\x00\x00\x00\x00ED" +
-	"Qp\x00\x00\x00\x00F\x0ff\x80\x00\x00\x00\x00G$3p\x00\x00\x00\x00G\xf8\x83\x00\x00\x00\x00\x00I\x04\x15p\x00\x00\x00\x00I\xd8e\x00\x00\x00\x00\x00J\xe3\xf7p\x00\x00\x00\x00K\xb8G\x00\x00\x00" +
-	"\x00\x00L\xcd\x13\xf0\x00\x00\x00\x00M\x98)\x00\x00\x00\x00\x00N\xac\xf5\xf0\x00\x00\x00\x00Ox\v\x00\x00\x00\x00\x00P\x8c\xd7\xf0\x00\x00\x00\x00Qa'\x80\x00\x00\x00\x00Rl\xb9\xf0\x00\x00\x00\x00SA" +
-	"\t\x80\x00\x00\x00\x00TL\x9b\xf0\x00\x00\x00\x00U \xeb\x80\x00\x00\x00\x00V,}\xf0\x00\x00\x00\x00W\x00̀\x00\x00\x00\x00X\x15\x9ap\x00\x00\x00\x00Xீ\x00\x00\x00\x00Y\xf5|p\x00\x00" +
-	"\x00\x00Z\xc0\x91\x80\x00\x00\x00\x00[\xd5^p\x00\x00\x00\x00\\\xa9\xae\x00\x00\x00\x00\x00]\xb5@p\x00\x00\x00\x00^\x89\x90\x00\x00\x00\x00\x00_\x95\"p\x00\x00\x00\x00`ir\x00\x00\x00\x00\x00a~" +
-	">\xf0\x00\x00\x00\x00bIT\x00\x00\x00\x00\x00c^ \xf0\x01\x02\x01\x03\x01\x02\x04\x02\x04\x02\x05\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02" +
-	"\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\xff\xff\xa3\f\x00\x00\xff\xff\x9d\x90\x00\x04\xff\xff\xab\xa0\x00\b\xff\xff\xab\xa0\x01\f\xff\xff\xb9\xb0\x01\x10\xff\xff\xb9\xb0" +
-	"\x01\x14LMT\x00MST\x00CST\x00MDT\x00CDT\x00CWT\x00\nCST6\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd7\b\\\xc6&\x02\x00\x00&\x02\x00\x00\x10\x00" +
-	"\x00\x00America/MiquelonTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" +
-	"\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00+\x00\x00\x00\x04\x00\x00\x00\x10\xff\xff\xff\xff\x91\xb68" +
-	"\xa8\x00\x00\x00\x00\x13nc\xc0\x00\x00\x00\x00 u\xe4\xd0\x00\x00\x00\x00!\x81w@\x00\x00\x00\x00\"U\xc6\xd0\x00\x00\x00\x00#j\x93\xc0\x00\x00\x00\x00$5\xa8\xd0\x00\x00\x00\x00%Ju\xc0\x00\x00\x00" +
-	"\x00&\x15\x8a\xd0\x00\x00\x00\x00'*W\xc0\x00\x00\x00\x00'\xfe\xa7P\x00\x00\x00\x00)\n9\xc0\x00\x00\x00\x00)މP\x00\x00\x00\x00*\xea\x1b\xc0\x00\x00\x00\x00+\xbekP\x00\x00\x00\x00,\xd38" +
-	"@\x00\x00\x00\x00-\x9eMP\x00\x00\x00\x00.\xb3\x1a@\x00\x00\x00\x00/~/P\x00\x00\x00\x000\x92\xfc@\x00\x00\x00\x001gK\xd0\x00\x00\x00\x002r\xde@\x00\x00\x00\x003G-\xd0\x00\x00\x00" +
-	"\x004R\xc0@\x00\x00\x00\x005'\x0f\xd0\x00\x00\x00\x0062\xa2@\x00\x00\x00\x007\x06\xf1\xd0\x00\x00\x00\x008\x1b\xbe\xc0\x00\x00\x00\x008\xe6\xd3\xd0\x00\x00\x00\x009\xfb\xa0\xc0\x00\x00\x00\x00:Ƶ" +
-	"\xd0\x00\x00\x00\x00;ۂ\xc0\x00\x00\x00\x00<\xaf\xd2P\x00\x00\x00\x00=\xbbd\xc0\x00\x00\x00\x00>\x8f\xb4P\x00\x00\x00\x00?\x9bF\xc0\x00\x00\x00\x00@o\x96P\x00\x00\x00\x00A\x84c@\x00\x00\x00" +
-	"\x00BOxP\x00\x00\x00\x00CdE@\x00\x00\x00\x00D/ZP\x00\x00\x00\x00ED'@\x00\x00\x00\x00E\xf3\x8c\xd0\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03" +
-	"\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\xff\xff\xcbX\x00\x00\xff\xff\xc7\xc0\x00\x04\xff\xff\xd5\xd0\x00\b\xff\xff\xe3\xe0\x01\fLMT\x00AST\x00-03\x00-02\x00" +
-	"\n<-03>3<-02>,M3.2.0,M11.1.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00.\xf9\xc0\x1e\xd5\x05\x00\x00\xd5\x05\x00\x00\x0f\x00\x00\x00Am" +
-	"erica/MonctonTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00" +
-	"\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x92\x00\x00\x00\x06\x00\x00\x00\x18\xff\xff\xff\xff^\x1e\xed\xbc\xff\xff\xff\xff" +
-	"\x80\xf1\xb6P\xff\xff\xff\xff\x9e\xb8\x85`\xff\xff\xff\xff\x9f\xba\xddP\xff\xff\xff\xff\xbb<8\xd0\xff\xff\xff\xff\xbb\xb4#@\xff\xff\xff\xff\xbd\x1c\x1a\xd0\xff\xff\xff\xff\xbd\x94\x05@\xff\xff\xff\xff\xbe\xfb\xfc\xd0" +
-	"\xff\xff\xff\xff\xbfs\xe7@\xff\xff\xff\xff\xc0\xdb\xde\xd0\xff\xff\xff\xff\xc1S\xc9@\xff\xff\xff\xff»\xc0\xd0\xff\xff\xff\xff\xc33\xab@\xff\xff\xff\xffě\xa2\xd0\xff\xff\xff\xff\xc5\x13\x8d@\xff\xff\xff\xff" +
-	"\xc6p\xf8\xd0\xff\xff\xff\xff\xc7\r\xcd@\xff\xff\xff\xff\xc8H\xf1\xd0\xff\xff\xff\xff\xc8\xed\xaf@\xff\xff\xff\xff\xca\x16^\xd0\xff\xff\xff\xff\xca\xd6\xcb\xc0\xff\xff\xff\xffˈ\xe2`\xff\xff\xff\xff\xd2#\xf4p" +
-	"\xff\xff\xff\xff\xd2`\xed\xd0\xff\xff\xff\xff\xd3u\xd6\xe0\xff\xff\xff\xff\xd4@\xcf\xd0\xff\xff\xff\xff\xd5U\xb8\xe0\xff\xff\xff\xff\xd6 \xb1\xd0\xff\xff\xff\xff\xd75\x9a\xe0\xff\xff\xff\xff\xd8\x00\x93\xd0\xff\xff\xff\xff" +
-	"\xd9\x15|\xe0\xff\xff\xff\xff\xd9\xe0u\xd0\xff\xff\xff\xff\xda\xfe\x99`\xff\xff\xff\xff\xdb\xc0W\xd0\xff\xff\xff\xff\xdc\xde{`\xff\xff\xff\xffݩtP\xff\xff\xff\xff\u07be]`\xff\xff\xff\xff߉VP" +
-	"\xff\xff\xff\xff\xe0\x9e?`\xff\xff\xff\xff\xe1i8P\xff\xff\xff\xff\xe2~!`\xff\xff\xff\xff\xe3I\x1aP\xff\xff\xff\xff\xe4^\x03`\xff\xff\xff\xff\xe5(\xfcP\xff\xff\xff\xff\xe6G\x1f\xe0\xff\xff\xff\xff" +
-	"\xe7\x12\x18\xd0\xff\xff\xff\xff\xe8'\x01\xe0\xff\xff\xff\xff\xe9\x16\xe4\xd0\xff\xff\xff\xff\xea\x06\xe3\xe0\xff\xff\xff\xff\xea\xf6\xc6\xd0\xff\xff\xff\xff\xeb\xe6\xc5\xe0\xff\xff\xff\xff\xec֨\xd0\xff\xff\xff\xff\xedƧ\xe0" +
-	"\xff\xff\xff\xff\xee\xbf\xc5P\xff\xff\xff\xff\xef\xaf\xc4`\xff\xff\xff\xff\xf0\x9f\xa7P\xff\xff\xff\xff\xf1\x8f\xa6`\xff\xff\xff\xff\xf2\x7f\x89P\xff\xff\xff\xff\xf3o\x88`\xff\xff\xff\xff\xf4_kP\xff\xff\xff\xff" +
-	"\xf5Oj`\xff\xff\xff\xff\xf6?MP\xff\xff\xff\xff\xf7/L`\xff\xff\xff\xff\xf8(i\xd0\xff\xff\xff\xff\xf9\x0f.`\xff\xff\xff\xff\xfa\bK\xd0\xff\xff\xff\xff\xfa\xf8J\xe0\xff\xff\xff\xff\xfb\xe8-\xd0" +
-	"\xff\xff\xff\xff\xfc\xd8,\xe0\xff\xff\xff\xff\xfd\xc8\x0f\xd0\xff\xff\xff\xff\xfe\xb8\x0e\xe0\xff\xff\xff\xff\xff\xa7\xf1\xd0\x00\x00\x00\x00\x00\x97\xf0\xe0\x00\x00\x00\x00\x01\x87\xd3\xd0\x00\x00\x00\x00\x02w\xd2\xe0\x00\x00\x00\x00" +
-	"\x03p\xf0P\x00\x00\x00\x00\x04`\xef`\x00\x00\x00\x00\x05P\xd2P\x00\x00\x00\x00\b \xb3`\x00\x00\x00\x00\t\x10\x96P\x00\x00\x00\x00\n\x00\x95`\x00\x00\x00\x00\n\xf0xP\x00\x00\x00\x00\v\xe0w`" +
-	"\x00\x00\x00\x00\fٔ\xd0\x00\x00\x00\x00\r\xc0Y`\x00\x00\x00\x00\x0e\xb9v\xd0\x00\x00\x00\x00\x0f\xa9u\xe0\x00\x00\x00\x00\x10\x99X\xd0\x00\x00\x00\x00\x11\x89W\xe0\x00\x00\x00\x00\x12y:\xd0\x00\x00\x00\x00" +
-	"\x13i9\xe0\x00\x00\x00\x00\x14Y\x1c\xd0\x00\x00\x00\x00\x15I\x1b\xe0\x00\x00\x00\x00\x168\xfe\xd0\x00\x00\x00\x00\x17(\xfd\xe0\x00\x00\x00\x00\x18\"\x1bP\x00\x00\x00\x00\x19\b\xdf\xe0\x00\x00\x00\x00\x1a\x01\xfdP" +
-	"\x00\x00\x00\x00\x1a\xf1\xfc`\x00\x00\x00\x00\x1b\xe1\xdfP\x00\x00\x00\x00\x1c\xd1\xde`\x00\x00\x00\x00\x1d\xc1\xc1P\x00\x00\x00\x00\x1e\xb1\xc0`\x00\x00\x00\x00\x1f\xa1\xa3P\x00\x00\x00\x00 u\xf2\xe0\x00\x00\x00\x00" +
-	"!\x81\x85P\x00\x00\x00\x00\"U\xd4\xe0\x00\x00\x00\x00#j\xa1\xd0\x00\x00\x00\x00$5\xb6\xe0\x00\x00\x00\x00%J\x83\xd0\x00\x00\x00\x00&\x15\x98\xe0\x00\x00\x00\x00'*e\xd0\x00\x00\x00\x00'\xfe\xb5`" +
-	"\x00\x00\x00\x00)\nG\xd0\x00\x00\x00\x00)ޗ`\x00\x00\x00\x00*\xea)\xd0\x00\x00\x00\x00+\xbe]|\x00\x00\x00\x00,\xd3*l\x00\x00\x00\x00-\x9e?|\x00\x00\x00\x00.\xb3\fl\x00\x00\x00\x00" +
-	"/~!|\x00\x00\x00\x000\x92\xeel\x00\x00\x00\x001g=\xfc\x00\x00\x00\x002r\xd0l\x00\x00\x00\x003G\x1f\xfc\x00\x00\x00\x004R\xb2l\x00\x00\x00\x005'\x01\xfc\x00\x00\x00\x0062\x94l" +
-	"\x00\x00\x00\x007\x06\xe3\xfc\x00\x00\x00\x008\x1b\xb0\xec\x00\x00\x00\x008\xe6\xc5\xfc\x00\x00\x00\x009\xfb\x92\xec\x00\x00\x00\x00:Ƨ\xfc\x00\x00\x00\x00;\xdbt\xec\x00\x00\x00\x00<\xaf\xc4|\x00\x00\x00\x00" +
-	"=\xbbV\xec\x00\x00\x00\x00>\x8f\xa6|\x00\x00\x00\x00?\x9b8\xec\x00\x00\x00\x00@o\x88|\x00\x00\x00\x00A\x84Ul\x00\x00\x00\x00BOj|\x00\x00\x00\x00Cd7l\x00\x00\x00\x00D/L|" +
-	"\x00\x00\x00\x00ED\x19l\x00\x00\x00\x00E\xf3\x9a\xe0\x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x04\x05\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02" +
-	"\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02" +
-	"\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\xff\xff\xc3D\x00\x00\xff\xff\xb9\xb0\x00\x04\xff\xff\xd5\xd0\x01\b" +
-	"\xff\xff\xc7\xc0\x00\f\xff\xff\xd5\xd0\x01\x10\xff\xff\xd5\xd0\x01\x14LMT\x00EST\x00ADT\x00AST\x00AWT\x00APT\x00\nAST4ADT,M3.2.0,M1" +
-	"1.1.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00L+\xe3u\x84\x02\x00\x00\x84\x02\x00\x00\x11\x00\x00\x00America/MonterreyTZif2\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x009\x00\x00\x00\x03\x00\x00\x00\f\xff\xff\xff\xff\xa5\xb6\xda`\x00\x00\x00\x00\"U\xf1\x00\x00\x00\x00\x00#j\xbd\xf0\x00\x00\x00\x001gv\x00" +
-	"\x00\x00\x00\x002s\bp\x00\x00\x00\x003GX\x00\x00\x00\x00\x004R\xeap\x00\x00\x00\x005':\x00\x00\x00\x00\x0062\xccp\x00\x00\x00\x007\a\x1c\x00\x00\x00\x00\x008\x1b\xe8\xf0\x00\x00\x00\x00" +
-	"8\xe6\xfe\x00\x00\x00\x00\x009\xfb\xca\xf0\x00\x00\x00\x00:\xf5\x04\x80\x00\x00\x00\x00;\xb6\xc2\xf0\x00\x00\x00\x00<\xaf\xfc\x80\x00\x00\x00\x00=\xbb\x8e\xf0\x00\x00\x00\x00>\x8fހ\x00\x00\x00\x00?\x9bp\xf0" +
-	"\x00\x00\x00\x00@o\xc0\x80\x00\x00\x00\x00A\x84\x8dp\x00\x00\x00\x00BO\xa2\x80\x00\x00\x00\x00Cdop\x00\x00\x00\x00D/\x84\x80\x00\x00\x00\x00EDQp\x00\x00\x00\x00F\x0ff\x80\x00\x00\x00\x00" +
-	"G$3p\x00\x00\x00\x00G\xf8\x83\x00\x00\x00\x00\x00I\x04\x15p\x00\x00\x00\x00I\xd8e\x00\x00\x00\x00\x00J\xe3\xf7p\x00\x00\x00\x00K\xb8G\x00\x00\x00\x00\x00L\xcd\x13\xf0\x00\x00\x00\x00M\x98)\x00" +
-	"\x00\x00\x00\x00N\xac\xf5\xf0\x00\x00\x00\x00Ox\v\x00\x00\x00\x00\x00P\x8c\xd7\xf0\x00\x00\x00\x00Qa'\x80\x00\x00\x00\x00Rl\xb9\xf0\x00\x00\x00\x00SA\t\x80\x00\x00\x00\x00TL\x9b\xf0\x00\x00\x00\x00" +
-	"U \xeb\x80\x00\x00\x00\x00V,}\xf0\x00\x00\x00\x00W\x00̀\x00\x00\x00\x00X\x15\x9ap\x00\x00\x00\x00Xீ\x00\x00\x00\x00Y\xf5|p\x00\x00\x00\x00Z\xc0\x91\x80\x00\x00\x00\x00[\xd5^p" +
-	"\x00\x00\x00\x00\\\xa9\xae\x00\x00\x00\x00\x00]\xb5@p\x00\x00\x00\x00^\x89\x90\x00\x00\x00\x00\x00_\x95\"p\x00\x00\x00\x00`ir\x00\x00\x00\x00\x00a~>\xf0\x00\x00\x00\x00bIT\x00\x00\x00\x00\x00" +
-	"c^ \xf0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\xff\xff\xa1\xf4\x00\x00\xff\xff\xab\xa0\x00\x04\xff\xff\xb9\xb0\x01\bLMT\x00CST\x00CDT\x00\nCST6\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x98\x00\b\xc9\x03\x00\x00\xc9" +
-	"\x03\x00\x00\x12\x00\x00\x00America/MontevideoTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00V\x00\x00\x00\t\x00\x00\x00&" +
-	"\xff\xff\xff\xff\x8c4\xe53\xff\xff\xff\xff\xa2\x92\x87\xb3\xff\xff\xff\xff\xa8\xff\xdb@\xff\xff\xff\xff\xa9\xf1\x0f\xb0\xff\xff\xff\xff\xaa\xe2Y8\xff\xff\xff\xff\xab\xd2C0\xff\xff\xff\xff\xacÌ\xb8\xff\xff\xff\xff" +
-	"\xad\xb3v\xb0\xff\xff\xff\xff\xbb\xf4\xb5\xb8\xff\xff\xff\xff\xbc\xbf\xb5\xb0\xff\xff\xff\xff\xbdԗ\xb8\xff\xff\xff\xff\xbe\x9f\x97\xb0\xff\xff\xff\xff\xbf\xb4y\xb8\xff\xff\xff\xff\xc0\x7fy\xb0\xff\xff\xff\xff\xc1\x94[\xb8" +
-	"\xff\xff\xff\xff\xc2_[\xb0\xff\xff\xff\xff\xc3}x8\xff\xff\xff\xff\xc4?=\xb0\xff\xff\xff\xff\xc5]Z8\xff\xff\xff\xff\xc6\x1f\x1f\xb0\xff\xff\xff\xff\xc7\x18R8\xff\xff\xff\xff\xc8\b<0\xff\xff\xff\xff" +
-	"\xc9\x1d\x1e8\xff\xff\xff\xff\xc9\xe8\x1e0\xff\xff\xff\xffʋ\x9f8\xff\xff\xff\xff\xcd\x1e\xc60\xff\xff\xff\xff͕f(\xff\xff\xff\xff\xec\v\x85\xb0\xff\xff\xff\xff\xec\xf25(\xff\xff\xff\xff\xedEJ\xb0" +
-	"\xff\xff\xff\xff\xed\x85\xd6 \xff\xff\xff\xff\xf7\x13r\xb0\xff\xff\xff\xff\xf7\xfa\x1b \xff\xff\xff\xff\xfc\xfe>0\xff\xff\xff\xff\xfd\xf6\x11(\x00\x00\x00\x00\x00\x96u0\x00\x00\x00\x00\x00\xd8R \x00\x00\x00\x00" +
-	"\x04W\x8a\xb0\x00\x00\x00\x00\x04\xc6:\xa0\x00\x00\x00\x00\a\x96\x1b\xb0\x00\x00\x00\x00\a\xdfژ\x00\x00\x00\x00\bƟ(\x00\x00\x00\x00\tZN0\x00\x00\x00\x00\t\xdbs \x00\x00\x00\x00\r\x1a\x120" +
-	"\x00\x00\x00\x00\r\x7f\x87\xa0\x00\x00\x00\x00\x0e\xe7\x7f0\x00\x00\x00\x00\x0f_i\xa0\x00\x00\x00\x00\x10\xd9\xd60\x00\x00\x00\x00\x11?K\xa0\x00\x00\x00\x00\x11\x89-\xb0\x00\x00\x00\x00\x131\xa2\xa0\x00\x00\x00\x00" +
-	"!\xc3T0\x00\x00\x00\x00\"'x \x00\x00\x00\x00#\xa1\xe4\xb0\x00\x00\x00\x00$\x10\x94\xa0\x00\x00\x00\x00%Jg\xb0\x00\x00\x00\x00%\xe7< \x00\x00\x00\x00'!\x0f0\x00\x00\x00\x00'\xd0X\xa0" +
-	"\x00\x00\x00\x00)\n+\xb0\x00\x00\x00\x00)\xb0:\xa0\x00\x00\x00\x00*\xe0\xd30\x00\x00\x00\x00+\x90\x1c\xa0\x00\x00\x00\x00AL\xf60\x00\x00\x00\x00BF/\xc0\x00\x00\x00\x00CH\xa3\xd0\x00\x00\x00\x00" +
-	"D\x13\x9c\xc0\x00\x00\x00\x00E\x1fKP\x00\x00\x00\x00E\xf3~\xc0\x00\x00\x00\x00G\bg\xd0\x00\x00\x00\x00G\xd3`\xc0\x00\x00\x00\x00H\xe8I\xd0\x00\x00\x00\x00I\xb3B\xc0\x00\x00\x00\x00J\xc8+\xd0" +
-	"\x00\x00\x00\x00K\x9c_@\x00\x00\x00\x00L\xa8\r\xd0\x00\x00\x00\x00M|A@\x00\x00\x00\x00N\x87\xef\xd0\x00\x00\x00\x00O\\#@\x00\x00\x00\x00Pq\fP\x00\x00\x00\x00Q<\x05@\x00\x00\x00\x00" +
-	"RP\xeeP\x00\x00\x00\x00S\x1b\xe7@\x00\x00\x00\x00T0\xd0P\x00\x00\x00\x00T\xfb\xc9@\x01\x02\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x06\x05\x06\x05\a\x05\a" +
-	"\x05\x06\x05\a\x05\a\x05\b\x06\x05\a\x05\a\x05\a\x05\a\x05\a\x05\a\x05\a\x05\a\x05\a\x05\a\x05\a\x05\a\x05\a\x05\a\x05\a\x05\a\x05\a\x05\a\x05\a\x05\a\x05\a\x05\a\x05\xff\xff\xcbM\x00\x00" +
-	"\xff\xff\xcbM\x00\x04\xff\xff\xc7\xc0\x00\b\xff\xff\xce\xc8\x00\f\xff\xff\xd5\xd0\x01\x12\xff\xff\xd5\xd0\x00\x12\xff\xff\xdc\xd8\x01\x16\xff\xff\xe3\xe0\x01\x1c\xff\xff\xea\xe8\x01 LMT\x00MMT\x00-04\x00" +
-	"-0330\x00-03\x00-0230\x00-02\x00-0130\x00\n<-03>3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00ӿ\x92\xbc\xb5\x06\x00\x00\xb5\x06\x00\x00" +
-	"\x10\x00\x00\x00America/MontrealTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" +
-	"\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xac\x00\x00\x00\x05\x00\x00\x00\x14\xff\xff\xff\xffr" +
-	"\xeex\xec\xff\xff\xff\xff\x9e\xb8\x93p\xff\xff\xff\xff\x9f\xba\xeb`\xff\xff\xff\xff\xa0\x87.\xc8\xff\xff\xff\xff\xa1\x9a\xb1@\xff\xff\xff\xff\xa2\x94\x06\xf0\xff\xff\xff\xff\xa3U\xa9@\xff\xff\xff\xff\xa4\x86]\xf0\xff" +
-	"\xff\xff\xff\xa5(x`\xff\xff\xff\xff\xa6f?\xf0\xff\xff\xff\xff\xa7\fN\xe0\xff\xff\xff\xff\xa8F!\xf0\xff\xff\xff\xff\xa8\xec0\xe0\xff\xff\xff\xff\xaa\x1c\xc9p\xff\xff\xff\xff\xaa\xd5M`\xff\xff\xff\xff\xab" +
-	"\xfc\xabp\xff\xff\xff\xff\xac\xb5/`\xff\xff\xff\xff\xad܍p\xff\xff\xff\xff\xae\x95\x11`\xff\xff\xff\xff\xaf\xbcop\xff\xff\xff\xff\xb0~-\xe0\xff\xff\xff\xff\xb1\x9cQp\xff\xff\xff\xff\xb2gJ`\xff" +
-	"\xff\xff\xff\xb3|3p\xff\xff\xff\xff\xb4G,`\xff\xff\xff\xff\xb5\\\x15p\xff\xff\xff\xff\xb6'\x0e`\xff\xff\xff\xff\xb7;\xf7p\xff\xff\xff\xff\xb8\x06\xf0`\xff\xff\xff\xff\xb9%\x13\xf0\xff\xff\xff\xff\xb9" +
-	"\xe6\xd2`\xff\xff\xff\xff\xbb\x04\xf5\xf0\xff\xff\xff\xff\xbb\xcf\xee\xe0\xff\xff\xff\xff\xbc\xe4\xd7\xf0\xff\xff\xff\xff\xbd\xaf\xd0\xe0\xff\xff\xff\xff\xbeĹ\xf0\xff\xff\xff\xff\xbf\x8f\xb2\xe0\xff\xff\xff\xff\xc0\xa4\x9b\xf0\xff" +
-	"\xff\xff\xff\xc1o\x94\xe0\xff\xff\xff\xff\u0084}\xf0\xff\xff\xff\xff\xc3Ov\xe0\xff\xff\xff\xff\xc4d_\xf0\xff\xff\xff\xff\xc5/X\xe0\xff\xff\xff\xff\xc6M|p\xff\xff\xff\xff\xc7\x0f:\xe0\xff\xff\xff\xff\xc8" +
-	"-^p\xff\xff\xff\xffˈ\xf0p\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2`\xfb\xe0\xff\xff\xff\xff\xd3u\xe4\xf0\xff\xff\xff\xff\xd4@\xdd\xe0\xff\xff\xff\xff\xd5U\xaa\xd0\xff\xff\xff\xff\xd6 \xa3\xc0\xff" +
-	"\xff\xff\xff\xd75\x8c\xd0\xff\xff\xff\xff\xd8\x00\x85\xc0\xff\xff\xff\xff\xd9\x15n\xd0\xff\xff\xff\xff\xda3v@\xff\xff\xff\xff\xda\xfe\xa7p\xff\xff\xff\xff\xdc\x13t`\xff\xff\xff\xff\xdcމp\xff\xff\xff\xff\xdd" +
-	"\xa9\x82`\xff\xff\xff\xff\u07bekp\xff\xff\xff\xff߉d`\xff\xff\xff\xff\xe0\x9eMp\xff\xff\xff\xff\xe1iF`\xff\xff\xff\xff\xe2~/p\xff\xff\xff\xff\xe3I(`\xff\xff\xff\xff\xe4^\x11p\xff" +
-	"\xff\xff\xff\xe5)\n`\xff\xff\xff\xff\xe6G-\xf0\xff\xff\xff\xff\xe7\x12&\xe0\xff\xff\xff\xff\xe8'\x0f\xf0\xff\xff\xff\xff\xe9\x16\xf2\xe0\xff\xff\xff\xff\xea\x06\xf1\xf0\xff\xff\xff\xff\xea\xf6\xd4\xe0\xff\xff\xff\xff\xeb" +
-	"\xe6\xd3\xf0\xff\xff\xff\xff\xecֶ\xe0\xff\xff\xff\xff\xedƵ\xf0\xff\xff\xff\xff\xee\xbf\xd3`\xff\xff\xff\xff\xef\xaf\xd2p\xff\xff\xff\xff\xf0\x9f\xb5`\xff\xff\xff\xff\xf1\x8f\xb4p\xff\xff\xff\xff\xf2\x7f\x97`\xff" +
-	"\xff\xff\xff\xf3o\x96p\xff\xff\xff\xff\xf4_y`\xff\xff\xff\xff\xf5Oxp\xff\xff\xff\xff\xf6?[`\xff\xff\xff\xff\xf7/Zp\xff\xff\xff\xff\xf8(w\xe0\xff\xff\xff\xff\xf9\x0f<p\xff\xff\xff\xff\xfa" +
-	"\bY\xe0\xff\xff\xff\xff\xfa\xf8X\xf0\xff\xff\xff\xff\xfb\xe8;\xe0\xff\xff\xff\xff\xfc\xd8:\xf0\xff\xff\xff\xff\xfd\xc8\x1d\xe0\xff\xff\xff\xff\xfe\xb8\x1c\xf0\xff\xff\xff\xff\xff\xa7\xff\xe0\x00\x00\x00\x00\x00\x97\xfe\xf0\x00" +
-	"\x00\x00\x00\x01\x87\xe1\xe0\x00\x00\x00\x00\x02w\xe0\xf0\x00\x00\x00\x00\x03p\xfe`\x00\x00\x00\x00\x04`\xfdp\x00\x00\x00\x00\x05P\xe0`\x00\x00\x00\x00\x06@\xdfp\x00\x00\x00\x00\a0\xc2`\x00\x00\x00\x00\b" +
-	" \xc1p\x00\x00\x00\x00\t\x10\xa4`\x00\x00\x00\x00\n\x00\xa3p\x00\x00\x00\x00\n\xf0\x86`\x00\x00\x00\x00\v\xe0\x85p\x00\x00\x00\x00\f٢\xe0\x00\x00\x00\x00\r\xc0gp\x00\x00\x00\x00\x0e\xb9\x84\xe0\x00" +
-	"\x00\x00\x00\x0f\xa9\x83\xf0\x00\x00\x00\x00\x10\x99f\xe0\x00\x00\x00\x00\x11\x89e\xf0\x00\x00\x00\x00\x12yH\xe0\x00\x00\x00\x00\x13iG\xf0\x00\x00\x00\x00\x14Y*\xe0\x00\x00\x00\x00\x15I)\xf0\x00\x00\x00\x00\x16" +
-	"9\f\xe0\x00\x00\x00\x00\x17)\v\xf0\x00\x00\x00\x00\x18\")`\x00\x00\x00\x00\x19\b\xed\xf0\x00\x00\x00\x00\x1a\x02\v`\x00\x00\x00\x00\x1a\xf2\np\x00\x00\x00\x00\x1b\xe1\xed`\x00\x00\x00\x00\x1c\xd1\xecp\x00" +
-	"\x00\x00\x00\x1d\xc1\xcf`\x00\x00\x00\x00\x1e\xb1\xcep\x00\x00\x00\x00\x1f\xa1\xb1`\x00\x00\x00\x00 v\x00\xf0\x00\x00\x00\x00!\x81\x93`\x00\x00\x00\x00\"U\xe2\xf0\x00\x00\x00\x00#j\xaf\xe0\x00\x00\x00\x00$" +
-	"5\xc4\xf0\x00\x00\x00\x00%J\x91\xe0\x00\x00\x00\x00&\x15\xa6\xf0\x00\x00\x00\x00'*s\xe0\x00\x00\x00\x00'\xfe\xc3p\x00\x00\x00\x00)\nU\xe0\x00\x00\x00\x00)ޥp\x00\x00\x00\x00*\xea7\xe0\x00" +
-	"\x00\x00\x00+\xbe\x87p\x00\x00\x00\x00,\xd3T`\x00\x00\x00\x00-\x9eip\x00\x00\x00\x00.\xb36`\x00\x00\x00\x00/~Kp\x00\x00\x00\x000\x93\x18`\x00\x00\x00\x001gg\xf0\x00\x00\x00\x002" +
-	"r\xfa`\x00\x00\x00\x003GI\xf0\x00\x00\x00\x004R\xdc`\x00\x00\x00\x005'+\xf0\x00\x00\x00\x0062\xbe`\x00\x00\x00\x007\a\r\xf0\x00\x00\x00\x008\x1b\xda\xe0\x00\x00\x00\x008\xe6\xef\xf0\x00" +
-	"\x00\x00\x009\xfb\xbc\xe0\x00\x00\x00\x00:\xc6\xd1\xf0\x00\x00\x00\x00;۞\xe0\x00\x00\x00\x00<\xaf\xeep\x00\x00\x00\x00=\xbb\x80\xe0\x00\x00\x00\x00>\x8f\xd0p\x00\x00\x00\x00?\x9bb\xe0\x00\x00\x00\x00@" +
-	"o\xb2p\x00\x00\x00\x00A\x84\x7f`\x00\x00\x00\x00BO\x94p\x00\x00\x00\x00Cda`\x00\x00\x00\x00D/vp\x00\x00\x00\x00EDC`\x00\x00\x00\x00E\xf3\xa8\xf0\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x03\x04\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\xff\xff\xb5\x94\x00\x00\xff\xff\xc7\xc0\x01\x04\xff\xff\xb9\xb0\x00" +
-	"\b\xff\xff\xc7\xc0\x01\f\xff\xff\xc7\xc0\x01\x10LMT\x00EDT\x00EST\x00EWT\x00EPT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03" +
-	"\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00q\xc9*;\xb1\x00\x00\x00\xb1\x00\x00\x00\x12\x00\x00\x00America/MontserratTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x10\xff\xff\xff\xffz敹\xff\xff\xff\xff\xcb\xf62\xc0\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2`\xed\xd0\x01\x03\x02\x01\xff\xff\xc2\a" +
-	"\x00\x00\xff\xff\xc7\xc0\x00\x04\xff\xff\xd5\xd0\x01\b\xff\xff\xd5\xd0\x01\fLMT\x00AST\x00APT\x00AWT\x00\nAST4\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00ӿ\x92\xbc" +
-	"\xb5\x06\x00\x00\xb5\x06\x00\x00\x0e\x00\x00\x00America/NassauTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xac\x00\x00\x00\x05\x00\x00\x00" +
-	"\x14\xff\xff\xff\xffr\xeex\xec\xff\xff\xff\xff\x9e\xb8\x93p\xff\xff\xff\xff\x9f\xba\xeb`\xff\xff\xff\xff\xa0\x87.\xc8\xff\xff\xff\xff\xa1\x9a\xb1@\xff\xff\xff\xff\xa2\x94\x06\xf0\xff\xff\xff\xff\xa3U\xa9@\xff\xff\xff" +
-	"\xff\xa4\x86]\xf0\xff\xff\xff\xff\xa5(x`\xff\xff\xff\xff\xa6f?\xf0\xff\xff\xff\xff\xa7\fN\xe0\xff\xff\xff\xff\xa8F!\xf0\xff\xff\xff\xff\xa8\xec0\xe0\xff\xff\xff\xff\xaa\x1c\xc9p\xff\xff\xff\xff\xaa\xd5M" +
-	"`\xff\xff\xff\xff\xab\xfc\xabp\xff\xff\xff\xff\xac\xb5/`\xff\xff\xff\xff\xad܍p\xff\xff\xff\xff\xae\x95\x11`\xff\xff\xff\xff\xaf\xbcop\xff\xff\xff\xff\xb0~-\xe0\xff\xff\xff\xff\xb1\x9cQp\xff\xff\xff" +
-	"\xff\xb2gJ`\xff\xff\xff\xff\xb3|3p\xff\xff\xff\xff\xb4G,`\xff\xff\xff\xff\xb5\\\x15p\xff\xff\xff\xff\xb6'\x0e`\xff\xff\xff\xff\xb7;\xf7p\xff\xff\xff\xff\xb8\x06\xf0`\xff\xff\xff\xff\xb9%\x13" +
-	"\xf0\xff\xff\xff\xff\xb9\xe6\xd2`\xff\xff\xff\xff\xbb\x04\xf5\xf0\xff\xff\xff\xff\xbb\xcf\xee\xe0\xff\xff\xff\xff\xbc\xe4\xd7\xf0\xff\xff\xff\xff\xbd\xaf\xd0\xe0\xff\xff\xff\xff\xbeĹ\xf0\xff\xff\xff\xff\xbf\x8f\xb2\xe0\xff\xff\xff" +
-	"\xff\xc0\xa4\x9b\xf0\xff\xff\xff\xff\xc1o\x94\xe0\xff\xff\xff\xff\u0084}\xf0\xff\xff\xff\xff\xc3Ov\xe0\xff\xff\xff\xff\xc4d_\xf0\xff\xff\xff\xff\xc5/X\xe0\xff\xff\xff\xff\xc6M|p\xff\xff\xff\xff\xc7\x0f:" +
-	"\xe0\xff\xff\xff\xff\xc8-^p\xff\xff\xff\xffˈ\xf0p\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2`\xfb\xe0\xff\xff\xff\xff\xd3u\xe4\xf0\xff\xff\xff\xff\xd4@\xdd\xe0\xff\xff\xff\xff\xd5U\xaa\xd0\xff\xff\xff" +
-	"\xff\xd6 \xa3\xc0\xff\xff\xff\xff\xd75\x8c\xd0\xff\xff\xff\xff\xd8\x00\x85\xc0\xff\xff\xff\xff\xd9\x15n\xd0\xff\xff\xff\xff\xda3v@\xff\xff\xff\xff\xda\xfe\xa7p\xff\xff\xff\xff\xdc\x13t`\xff\xff\xff\xff\xdcމ" +
-	"p\xff\xff\xff\xffݩ\x82`\xff\xff\xff\xff\u07bekp\xff\xff\xff\xff߉d`\xff\xff\xff\xff\xe0\x9eMp\xff\xff\xff\xff\xe1iF`\xff\xff\xff\xff\xe2~/p\xff\xff\xff\xff\xe3I(`\xff\xff\xff" +
-	"\xff\xe4^\x11p\xff\xff\xff\xff\xe5)\n`\xff\xff\xff\xff\xe6G-\xf0\xff\xff\xff\xff\xe7\x12&\xe0\xff\xff\xff\xff\xe8'\x0f\xf0\xff\xff\xff\xff\xe9\x16\xf2\xe0\xff\xff\xff\xff\xea\x06\xf1\xf0\xff\xff\xff\xff\xea\xf6\xd4" +
-	"\xe0\xff\xff\xff\xff\xeb\xe6\xd3\xf0\xff\xff\xff\xff\xecֶ\xe0\xff\xff\xff\xff\xedƵ\xf0\xff\xff\xff\xff\xee\xbf\xd3`\xff\xff\xff\xff\xef\xaf\xd2p\xff\xff\xff\xff\xf0\x9f\xb5`\xff\xff\xff\xff\xf1\x8f\xb4p\xff\xff\xff" +
-	"\xff\xf2\x7f\x97`\xff\xff\xff\xff\xf3o\x96p\xff\xff\xff\xff\xf4_y`\xff\xff\xff\xff\xf5Oxp\xff\xff\xff\xff\xf6?[`\xff\xff\xff\xff\xf7/Zp\xff\xff\xff\xff\xf8(w\xe0\xff\xff\xff\xff\xf9\x0f<" +
-	"p\xff\xff\xff\xff\xfa\bY\xe0\xff\xff\xff\xff\xfa\xf8X\xf0\xff\xff\xff\xff\xfb\xe8;\xe0\xff\xff\xff\xff\xfc\xd8:\xf0\xff\xff\xff\xff\xfd\xc8\x1d\xe0\xff\xff\xff\xff\xfe\xb8\x1c\xf0\xff\xff\xff\xff\xff\xa7\xff\xe0\x00\x00\x00" +
-	"\x00\x00\x97\xfe\xf0\x00\x00\x00\x00\x01\x87\xe1\xe0\x00\x00\x00\x00\x02w\xe0\xf0\x00\x00\x00\x00\x03p\xfe`\x00\x00\x00\x00\x04`\xfdp\x00\x00\x00\x00\x05P\xe0`\x00\x00\x00\x00\x06@\xdfp\x00\x00\x00\x00\a0\xc2" +
-	"`\x00\x00\x00\x00\b \xc1p\x00\x00\x00\x00\t\x10\xa4`\x00\x00\x00\x00\n\x00\xa3p\x00\x00\x00\x00\n\xf0\x86`\x00\x00\x00\x00\v\xe0\x85p\x00\x00\x00\x00\f٢\xe0\x00\x00\x00\x00\r\xc0gp\x00\x00\x00" +
-	"\x00\x0e\xb9\x84\xe0\x00\x00\x00\x00\x0f\xa9\x83\xf0\x00\x00\x00\x00\x10\x99f\xe0\x00\x00\x00\x00\x11\x89e\xf0\x00\x00\x00\x00\x12yH\xe0\x00\x00\x00\x00\x13iG\xf0\x00\x00\x00\x00\x14Y*\xe0\x00\x00\x00\x00\x15I)" +
-	"\xf0\x00\x00\x00\x00\x169\f\xe0\x00\x00\x00\x00\x17)\v\xf0\x00\x00\x00\x00\x18\")`\x00\x00\x00\x00\x19\b\xed\xf0\x00\x00\x00\x00\x1a\x02\v`\x00\x00\x00\x00\x1a\xf2\np\x00\x00\x00\x00\x1b\xe1\xed`\x00\x00\x00" +
-	"\x00\x1c\xd1\xecp\x00\x00\x00\x00\x1d\xc1\xcf`\x00\x00\x00\x00\x1e\xb1\xcep\x00\x00\x00\x00\x1f\xa1\xb1`\x00\x00\x00\x00 v\x00\xf0\x00\x00\x00\x00!\x81\x93`\x00\x00\x00\x00\"U\xe2\xf0\x00\x00\x00\x00#j\xaf" +
-	"\xe0\x00\x00\x00\x00$5\xc4\xf0\x00\x00\x00\x00%J\x91\xe0\x00\x00\x00\x00&\x15\xa6\xf0\x00\x00\x00\x00'*s\xe0\x00\x00\x00\x00'\xfe\xc3p\x00\x00\x00\x00)\nU\xe0\x00\x00\x00\x00)ޥp\x00\x00\x00" +
-	"\x00*\xea7\xe0\x00\x00\x00\x00+\xbe\x87p\x00\x00\x00\x00,\xd3T`\x00\x00\x00\x00-\x9eip\x00\x00\x00\x00.\xb36`\x00\x00\x00\x00/~Kp\x00\x00\x00\x000\x93\x18`\x00\x00\x00\x001gg" +
-	"\xf0\x00\x00\x00\x002r\xfa`\x00\x00\x00\x003GI\xf0\x00\x00\x00\x004R\xdc`\x00\x00\x00\x005'+\xf0\x00\x00\x00\x0062\xbe`\x00\x00\x00\x007\a\r\xf0\x00\x00\x00\x008\x1b\xda\xe0\x00\x00\x00" +
-	"\x008\xe6\xef\xf0\x00\x00\x00\x009\xfb\xbc\xe0\x00\x00\x00\x00:\xc6\xd1\xf0\x00\x00\x00\x00;۞\xe0\x00\x00\x00\x00<\xaf\xeep\x00\x00\x00\x00=\xbb\x80\xe0\x00\x00\x00\x00>\x8f\xd0p\x00\x00\x00\x00?\x9bb" +
-	"\xe0\x00\x00\x00\x00@o\xb2p\x00\x00\x00\x00A\x84\x7f`\x00\x00\x00\x00BO\x94p\x00\x00\x00\x00Cda`\x00\x00\x00\x00D/vp\x00\x00\x00\x00EDC`\x00\x00\x00\x00E\xf3\xa8\xf0\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x03\x04\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\xff\xff\xb5\x94\x00\x00\xff\xff\xc7\xc0\x01" +
-	"\x04\xff\xff\xb9\xb0\x00\b\xff\xff\xc7\xc0\x01\f\xff\xff\xc7\xc0\x01\x10LMT\x00EDT\x00EST\x00EWT\x00EPT\x00\nEST5EDT,M3.2.0,M11.1" +
-	".0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x003\x9aG\xc8\xd0\x06\x00\x00\xd0\x06\x00\x00\x10\x00\x00\x00America/New_YorkTZif2\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaf\x00\x00\x00\x05\x00\x00\x00\x14\xff\xff\xff\xff^\x03\xf0\x90\xff\xff\xff\xff\x9e\xa6\x1ep\xff\xff\xff\xff\x9f\xba\xeb`\xff\xff\xff\xff\xa0\x86\x00p\xff\xff\xff\xff" +
-	"\xa1\x9a\xcd`\xff\xff\xff\xff\xa2e\xe2p\xff\xff\xff\xff\xa3\x83\xe9\xe0\xff\xff\xff\xff\xa4j\xaep\xff\xff\xff\xff\xa55\xa7`\xff\xff\xff\xff\xa6S\xca\xf0\xff\xff\xff\xff\xa7\x15\x89`\xff\xff\xff\xff\xa83\xac\xf0" +
-	"\xff\xff\xff\xff\xa8\xfe\xa5\xe0\xff\xff\xff\xff\xaa\x13\x8e\xf0\xff\xff\xff\xff\xaaއ\xe0\xff\xff\xff\xff\xab\xf3p\xf0\xff\xff\xff\xff\xac\xbei\xe0\xff\xff\xff\xff\xad\xd3R\xf0\xff\xff\xff\xff\xae\x9eK\xe0\xff\xff\xff\xff" +
-	"\xaf\xb34\xf0\xff\xff\xff\xff\xb0~-\xe0\xff\xff\xff\xff\xb1\x9cQp\xff\xff\xff\xff\xb2gJ`\xff\xff\xff\xff\xb3|3p\xff\xff\xff\xff\xb4G,`\xff\xff\xff\xff\xb5\\\x15p\xff\xff\xff\xff\xb6'\x0e`" +
-	"\xff\xff\xff\xff\xb7;\xf7p\xff\xff\xff\xff\xb8\x06\xf0`\xff\xff\xff\xff\xb9\x1b\xd9p\xff\xff\xff\xff\xb9\xe6\xd2`\xff\xff\xff\xff\xbb\x04\xf5\xf0\xff\xff\xff\xff\xbbƴ`\xff\xff\xff\xff\xbc\xe4\xd7\xf0\xff\xff\xff\xff" +
-	"\xbd\xaf\xd0\xe0\xff\xff\xff\xff\xbeĹ\xf0\xff\xff\xff\xff\xbf\x8f\xb2\xe0\xff\xff\xff\xff\xc0\xa4\x9b\xf0\xff\xff\xff\xff\xc1o\x94\xe0\xff\xff\xff\xff\u0084}\xf0\xff\xff\xff\xff\xc3Ov\xe0\xff\xff\xff\xff\xc4d_\xf0" +
-	"\xff\xff\xff\xff\xc5/X\xe0\xff\xff\xff\xff\xc6M|p\xff\xff\xff\xff\xc7\x0f:\xe0\xff\xff\xff\xff\xc8-^p\xff\xff\xff\xff\xc8\xf8W`\xff\xff\xff\xff\xca\r@p\xff\xff\xff\xff\xca\xd89`\xff\xff\xff\xff" +
-	"ˈ\xf0p\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2`\xfb\xe0\xff\xff\xff\xff\xd3u\xe4\xf0\xff\xff\xff\xff\xd4@\xdd\xe0\xff\xff\xff\xff\xd5U\xc6\xf0\xff\xff\xff\xff\xd6 \xbf\xe0\xff\xff\xff\xff\xd75\xa8\xf0" +
-	"\xff\xff\xff\xff\xd8\x00\xa1\xe0\xff\xff\xff\xff\xd9\x15\x8a\xf0\xff\xff\xff\xff\xd9\xe0\x83\xe0\xff\xff\xff\xff\xda\xfe\xa7p\xff\xff\xff\xff\xdb\xc0e\xe0\xff\xff\xff\xff\xdcމp\xff\xff\xff\xffݩ\x82`\xff\xff\xff\xff" +
-	"\u07bekp\xff\xff\xff\xff߉d`\xff\xff\xff\xff\xe0\x9eMp\xff\xff\xff\xff\xe1iF`\xff\xff\xff\xff\xe2~/p\xff\xff\xff\xff\xe3I(`\xff\xff\xff\xff\xe4^\x11p\xff\xff\xff\xff\xe5W.\xe0" +
-	"\xff\xff\xff\xff\xe6G-\xf0\xff\xff\xff\xff\xe77\x10\xe0\xff\xff\xff\xff\xe8'\x0f\xf0\xff\xff\xff\xff\xe9\x16\xf2\xe0\xff\xff\xff\xff\xea\x06\xf1\xf0\xff\xff\xff\xff\xea\xf6\xd4\xe0\xff\xff\xff\xff\xeb\xe6\xd3\xf0\xff\xff\xff\xff" +
-	"\xecֶ\xe0\xff\xff\xff\xff\xedƵ\xf0\xff\xff\xff\xff\xee\xbf\xd3`\xff\xff\xff\xff\xef\xaf\xd2p\xff\xff\xff\xff\xf0\x9f\xb5`\xff\xff\xff\xff\xf1\x8f\xb4p\xff\xff\xff\xff\xf2\x7f\x97`\xff\xff\xff\xff\xf3o\x96p" +
-	"\xff\xff\xff\xff\xf4_y`\xff\xff\xff\xff\xf5Oxp\xff\xff\xff\xff\xf6?[`\xff\xff\xff\xff\xf7/Zp\xff\xff\xff\xff\xf8(w\xe0\xff\xff\xff\xff\xf9\x0f<p\xff\xff\xff\xff\xfa\bY\xe0\xff\xff\xff\xff" +
-	"\xfa\xf8X\xf0\xff\xff\xff\xff\xfb\xe8;\xe0\xff\xff\xff\xff\xfc\xd8:\xf0\xff\xff\xff\xff\xfd\xc8\x1d\xe0\xff\xff\xff\xff\xfe\xb8\x1c\xf0\xff\xff\xff\xff\xff\xa7\xff\xe0\x00\x00\x00\x00\x00\x97\xfe\xf0\x00\x00\x00\x00\x01\x87\xe1\xe0" +
-	"\x00\x00\x00\x00\x02w\xe0\xf0\x00\x00\x00\x00\x03p\xfe`\x00\x00\x00\x00\x04`\xfdp\x00\x00\x00\x00\x05P\xe0`\x00\x00\x00\x00\x06@\xdfp\x00\x00\x00\x00\a0\xc2`\x00\x00\x00\x00\a\x8d\x19p\x00\x00\x00\x00" +
-	"\t\x10\xa4`\x00\x00\x00\x00\t\xad\x94\xf0\x00\x00\x00\x00\n\xf0\x86`\x00\x00\x00\x00\v\xe0\x85p\x00\x00\x00\x00\f٢\xe0\x00\x00\x00\x00\r\xc0gp\x00\x00\x00\x00\x0e\xb9\x84\xe0\x00\x00\x00\x00\x0f\xa9\x83\xf0" +
-	"\x00\x00\x00\x00\x10\x99f\xe0\x00\x00\x00\x00\x11\x89e\xf0\x00\x00\x00\x00\x12yH\xe0\x00\x00\x00\x00\x13iG\xf0\x00\x00\x00\x00\x14Y*\xe0\x00\x00\x00\x00\x15I)\xf0\x00\x00\x00\x00\x169\f\xe0\x00\x00\x00\x00" +
-	"\x17)\v\xf0\x00\x00\x00\x00\x18\")`\x00\x00\x00\x00\x19\b\xed\xf0\x00\x00\x00\x00\x1a\x02\v`\x00\x00\x00\x00\x1a\xf2\np\x00\x00\x00\x00\x1b\xe1\xed`\x00\x00\x00\x00\x1c\xd1\xecp\x00\x00\x00\x00\x1d\xc1\xcf`" +
-	"\x00\x00\x00\x00\x1e\xb1\xcep\x00\x00\x00\x00\x1f\xa1\xb1`\x00\x00\x00\x00 v\x00\xf0\x00\x00\x00\x00!\x81\x93`\x00\x00\x00\x00\"U\xe2\xf0\x00\x00\x00\x00#j\xaf\xe0\x00\x00\x00\x00$5\xc4\xf0\x00\x00\x00\x00" +
-	"%J\x91\xe0\x00\x00\x00\x00&\x15\xa6\xf0\x00\x00\x00\x00'*s\xe0\x00\x00\x00\x00'\xfe\xc3p\x00\x00\x00\x00)\nU\xe0\x00\x00\x00\x00)ޥp\x00\x00\x00\x00*\xea7\xe0\x00\x00\x00\x00+\xbe\x87p" +
-	"\x00\x00\x00\x00,\xd3T`\x00\x00\x00\x00-\x9eip\x00\x00\x00\x00.\xb36`\x00\x00\x00\x00/~Kp\x00\x00\x00\x000\x93\x18`\x00\x00\x00\x001gg\xf0\x00\x00\x00\x002r\xfa`\x00\x00\x00\x00" +
-	"3GI\xf0\x00\x00\x00\x004R\xdc`\x00\x00\x00\x005'+\xf0\x00\x00\x00\x0062\xbe`\x00\x00\x00\x007\a\r\xf0\x00\x00\x00\x008\x1b\xda\xe0\x00\x00\x00\x008\xe6\xef\xf0\x00\x00\x00\x009\xfb\xbc\xe0" +
-	"\x00\x00\x00\x00:\xc6\xd1\xf0\x00\x00\x00\x00;۞\xe0\x00\x00\x00\x00<\xaf\xeep\x00\x00\x00\x00=\xbb\x80\xe0\x00\x00\x00\x00>\x8f\xd0p\x00\x00\x00\x00?\x9bb\xe0\x00\x00\x00\x00@o\xb2p\x00\x00\x00\x00" +
-	"A\x84\x7f`\x00\x00\x00\x00BO\x94p\x00\x00\x00\x00Cda`\x00\x00\x00\x00D/vp\x00\x00\x00\x00EDC`\x00\x00\x00\x00E\xf3\xa8\xf0\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x03\x04\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\xff\xff\xba\x9e\x00\x00\xff\xff\xc7\xc0\x01\x04\xff\xff\xb9\xb0\x00\b\xff\xff\xc7" +
-	"\xc0\x01\f\xff\xff\xc7\xc0\x01\x10LMT\x00EDT\x00EST\x00EWT\x00EPT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00ӿ\x92\xbc\xb5\x06\x00\x00\xb5\x06\x00\x00\x0f\x00\x00\x00America/NipigonTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\xac\x00\x00\x00\x05\x00\x00\x00\x14\xff\xff\xff\xffr\xeex\xec\xff\xff\xff\xff\x9e\xb8\x93p\xff\xff\xff\xff\x9f\xba\xeb`\xff\xff\xff\xff\xa0\x87.\xc8\xff\xff\xff\xff\xa1\x9a\xb1@\xff\xff\xff\xff\xa2\x94\x06" +
-	"\xf0\xff\xff\xff\xff\xa3U\xa9@\xff\xff\xff\xff\xa4\x86]\xf0\xff\xff\xff\xff\xa5(x`\xff\xff\xff\xff\xa6f?\xf0\xff\xff\xff\xff\xa7\fN\xe0\xff\xff\xff\xff\xa8F!\xf0\xff\xff\xff\xff\xa8\xec0\xe0\xff\xff\xff" +
-	"\xff\xaa\x1c\xc9p\xff\xff\xff\xff\xaa\xd5M`\xff\xff\xff\xff\xab\xfc\xabp\xff\xff\xff\xff\xac\xb5/`\xff\xff\xff\xff\xad܍p\xff\xff\xff\xff\xae\x95\x11`\xff\xff\xff\xff\xaf\xbcop\xff\xff\xff\xff\xb0~-" +
-	"\xe0\xff\xff\xff\xff\xb1\x9cQp\xff\xff\xff\xff\xb2gJ`\xff\xff\xff\xff\xb3|3p\xff\xff\xff\xff\xb4G,`\xff\xff\xff\xff\xb5\\\x15p\xff\xff\xff\xff\xb6'\x0e`\xff\xff\xff\xff\xb7;\xf7p\xff\xff\xff" +
-	"\xff\xb8\x06\xf0`\xff\xff\xff\xff\xb9%\x13\xf0\xff\xff\xff\xff\xb9\xe6\xd2`\xff\xff\xff\xff\xbb\x04\xf5\xf0\xff\xff\xff\xff\xbb\xcf\xee\xe0\xff\xff\xff\xff\xbc\xe4\xd7\xf0\xff\xff\xff\xff\xbd\xaf\xd0\xe0\xff\xff\xff\xff\xbeĹ" +
-	"\xf0\xff\xff\xff\xff\xbf\x8f\xb2\xe0\xff\xff\xff\xff\xc0\xa4\x9b\xf0\xff\xff\xff\xff\xc1o\x94\xe0\xff\xff\xff\xff\u0084}\xf0\xff\xff\xff\xff\xc3Ov\xe0\xff\xff\xff\xff\xc4d_\xf0\xff\xff\xff\xff\xc5/X\xe0\xff\xff\xff" +
-	"\xff\xc6M|p\xff\xff\xff\xff\xc7\x0f:\xe0\xff\xff\xff\xff\xc8-^p\xff\xff\xff\xffˈ\xf0p\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2`\xfb\xe0\xff\xff\xff\xff\xd3u\xe4\xf0\xff\xff\xff\xff\xd4@\xdd" +
-	"\xe0\xff\xff\xff\xff\xd5U\xaa\xd0\xff\xff\xff\xff\xd6 \xa3\xc0\xff\xff\xff\xff\xd75\x8c\xd0\xff\xff\xff\xff\xd8\x00\x85\xc0\xff\xff\xff\xff\xd9\x15n\xd0\xff\xff\xff\xff\xda3v@\xff\xff\xff\xff\xda\xfe\xa7p\xff\xff\xff" +
-	"\xff\xdc\x13t`\xff\xff\xff\xff\xdcމp\xff\xff\xff\xffݩ\x82`\xff\xff\xff\xff\u07bekp\xff\xff\xff\xff߉d`\xff\xff\xff\xff\xe0\x9eMp\xff\xff\xff\xff\xe1iF`\xff\xff\xff\xff\xe2~/" +
-	"p\xff\xff\xff\xff\xe3I(`\xff\xff\xff\xff\xe4^\x11p\xff\xff\xff\xff\xe5)\n`\xff\xff\xff\xff\xe6G-\xf0\xff\xff\xff\xff\xe7\x12&\xe0\xff\xff\xff\xff\xe8'\x0f\xf0\xff\xff\xff\xff\xe9\x16\xf2\xe0\xff\xff\xff" +
-	"\xff\xea\x06\xf1\xf0\xff\xff\xff\xff\xea\xf6\xd4\xe0\xff\xff\xff\xff\xeb\xe6\xd3\xf0\xff\xff\xff\xff\xecֶ\xe0\xff\xff\xff\xff\xedƵ\xf0\xff\xff\xff\xff\xee\xbf\xd3`\xff\xff\xff\xff\xef\xaf\xd2p\xff\xff\xff\xff\xf0\x9f\xb5" +
-	"`\xff\xff\xff\xff\xf1\x8f\xb4p\xff\xff\xff\xff\xf2\x7f\x97`\xff\xff\xff\xff\xf3o\x96p\xff\xff\xff\xff\xf4_y`\xff\xff\xff\xff\xf5Oxp\xff\xff\xff\xff\xf6?[`\xff\xff\xff\xff\xf7/Zp\xff\xff\xff" +
-	"\xff\xf8(w\xe0\xff\xff\xff\xff\xf9\x0f<p\xff\xff\xff\xff\xfa\bY\xe0\xff\xff\xff\xff\xfa\xf8X\xf0\xff\xff\xff\xff\xfb\xe8;\xe0\xff\xff\xff\xff\xfc\xd8:\xf0\xff\xff\xff\xff\xfd\xc8\x1d\xe0\xff\xff\xff\xff\xfe\xb8\x1c" +
-	"\xf0\xff\xff\xff\xff\xff\xa7\xff\xe0\x00\x00\x00\x00\x00\x97\xfe\xf0\x00\x00\x00\x00\x01\x87\xe1\xe0\x00\x00\x00\x00\x02w\xe0\xf0\x00\x00\x00\x00\x03p\xfe`\x00\x00\x00\x00\x04`\xfdp\x00\x00\x00\x00\x05P\xe0`\x00\x00\x00" +
-	"\x00\x06@\xdfp\x00\x00\x00\x00\a0\xc2`\x00\x00\x00\x00\b \xc1p\x00\x00\x00\x00\t\x10\xa4`\x00\x00\x00\x00\n\x00\xa3p\x00\x00\x00\x00\n\xf0\x86`\x00\x00\x00\x00\v\xe0\x85p\x00\x00\x00\x00\f٢" +
-	"\xe0\x00\x00\x00\x00\r\xc0gp\x00\x00\x00\x00\x0e\xb9\x84\xe0\x00\x00\x00\x00\x0f\xa9\x83\xf0\x00\x00\x00\x00\x10\x99f\xe0\x00\x00\x00\x00\x11\x89e\xf0\x00\x00\x00\x00\x12yH\xe0\x00\x00\x00\x00\x13iG\xf0\x00\x00\x00" +
-	"\x00\x14Y*\xe0\x00\x00\x00\x00\x15I)\xf0\x00\x00\x00\x00\x169\f\xe0\x00\x00\x00\x00\x17)\v\xf0\x00\x00\x00\x00\x18\")`\x00\x00\x00\x00\x19\b\xed\xf0\x00\x00\x00\x00\x1a\x02\v`\x00\x00\x00\x00\x1a\xf2\n" +
-	"p\x00\x00\x00\x00\x1b\xe1\xed`\x00\x00\x00\x00\x1c\xd1\xecp\x00\x00\x00\x00\x1d\xc1\xcf`\x00\x00\x00\x00\x1e\xb1\xcep\x00\x00\x00\x00\x1f\xa1\xb1`\x00\x00\x00\x00 v\x00\xf0\x00\x00\x00\x00!\x81\x93`\x00\x00\x00" +
-	"\x00\"U\xe2\xf0\x00\x00\x00\x00#j\xaf\xe0\x00\x00\x00\x00$5\xc4\xf0\x00\x00\x00\x00%J\x91\xe0\x00\x00\x00\x00&\x15\xa6\xf0\x00\x00\x00\x00'*s\xe0\x00\x00\x00\x00'\xfe\xc3p\x00\x00\x00\x00)\nU" +
-	"\xe0\x00\x00\x00\x00)ޥp\x00\x00\x00\x00*\xea7\xe0\x00\x00\x00\x00+\xbe\x87p\x00\x00\x00\x00,\xd3T`\x00\x00\x00\x00-\x9eip\x00\x00\x00\x00.\xb36`\x00\x00\x00\x00/~Kp\x00\x00\x00" +
-	"\x000\x93\x18`\x00\x00\x00\x001gg\xf0\x00\x00\x00\x002r\xfa`\x00\x00\x00\x003GI\xf0\x00\x00\x00\x004R\xdc`\x00\x00\x00\x005'+\xf0\x00\x00\x00\x0062\xbe`\x00\x00\x00\x007\a\r" +
-	"\xf0\x00\x00\x00\x008\x1b\xda\xe0\x00\x00\x00\x008\xe6\xef\xf0\x00\x00\x00\x009\xfb\xbc\xe0\x00\x00\x00\x00:\xc6\xd1\xf0\x00\x00\x00\x00;۞\xe0\x00\x00\x00\x00<\xaf\xeep\x00\x00\x00\x00=\xbb\x80\xe0\x00\x00\x00" +
-	"\x00>\x8f\xd0p\x00\x00\x00\x00?\x9bb\xe0\x00\x00\x00\x00@o\xb2p\x00\x00\x00\x00A\x84\x7f`\x00\x00\x00\x00BO\x94p\x00\x00\x00\x00Cda`\x00\x00\x00\x00D/vp\x00\x00\x00\x00EDC" +
-	"`\x00\x00\x00\x00E\xf3\xa8\xf0\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x03\x04\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\xff\xff\xb5\x94\x00\x00\xff\xff\xc7\xc0\x01\x04\xff\xff\xb9\xb0\x00\b\xff\xff\xc7\xc0\x01\f\xff\xff\xc7\xc0\x01\x10LMT\x00EDT\x00EST\x00EWT\x00EPT\x00\nEST5EDT," +
-	"M3.2.0,M11.1.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00n\xab\xd5\xf9\xcf\x03\x00\x00\xcf\x03\x00\x00\f\x00\x00\x00America/NomeTZi" +
-	"f2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00T\x00\x00\x00\n\x00\x00\x00&\xff\xff\xff\xff?\xc2\xfd\xd1\xff\xff\xff\xff}\x87O\xd2\xff\xff\xff\xffˉD\xd0\xff\xff\xff\xff" +
-	"\xd2#\xf4p\xff\xff\xff\xff\xd2aP@\xff\xff\xff\xff\xfa\xd2U\xb0\xff\xff\xff\xff\xfe\xb8qP\xff\xff\xff\xff\xff\xa8T@\x00\x00\x00\x00\x00\x98SP\x00\x00\x00\x00\x01\x886@\x00\x00\x00\x00\x02x5P" +
-	"\x00\x00\x00\x00\x03qR\xc0\x00\x00\x00\x00\x04aQ\xd0\x00\x00\x00\x00\x05Q4\xc0\x00\x00\x00\x00\x06A3\xd0\x00\x00\x00\x00\a1\x16\xc0\x00\x00\x00\x00\a\x8dm\xd0\x00\x00\x00\x00\t\x10\xf8\xc0\x00\x00\x00\x00" +
-	"\t\xad\xe9P\x00\x00\x00\x00\n\xf0\xda\xc0\x00\x00\x00\x00\v\xe0\xd9\xd0\x00\x00\x00\x00\f\xd9\xf7@\x00\x00\x00\x00\r\xc0\xbb\xd0\x00\x00\x00\x00\x0e\xb9\xd9@\x00\x00\x00\x00\x0f\xa9\xd8P\x00\x00\x00\x00\x10\x99\xbb@" +
-	"\x00\x00\x00\x00\x11\x89\xbaP\x00\x00\x00\x00\x12y\x9d@\x00\x00\x00\x00\x13i\x9cP\x00\x00\x00\x00\x14Y\x7f@\x00\x00\x00\x00\x15I~P\x00\x00\x00\x00\x169a@\x00\x00\x00\x00\x17)`P\x00\x00\x00\x00" +
-	"\x18\"}\xc0\x00\x00\x00\x00\x19\tBP\x00\x00\x00\x00\x1a\x02_\xc0\x00\x00\x00\x00\x1a+\x14\x10\x00\x00\x00\x00\x1a\xf2B\xb0\x00\x00\x00\x00\x1b\xe2%\xa0\x00\x00\x00\x00\x1c\xd2$\xb0\x00\x00\x00\x00\x1d\xc2\a\xa0" +
-	"\x00\x00\x00\x00\x1e\xb2\x06\xb0\x00\x00\x00\x00\x1f\xa1\xe9\xa0\x00\x00\x00\x00 v90\x00\x00\x00\x00!\x81ˠ\x00\x00\x00\x00\"V\x1b0\x00\x00\x00\x00#j\xe8 \x00\x00\x00\x00$5\xfd0\x00\x00\x00\x00" +
-	"%J\xca \x00\x00\x00\x00&\x15\xdf0\x00\x00\x00\x00'*\xac \x00\x00\x00\x00'\xfe\xfb\xb0\x00\x00\x00\x00)\n\x8e \x00\x00\x00\x00)\xdeݰ\x00\x00\x00\x00*\xeap \x00\x00\x00\x00+\xbe\xbf\xb0" +
-	"\x00\x00\x00\x00,ӌ\xa0\x00\x00\x00\x00-\x9e\xa1\xb0\x00\x00\x00\x00.\xb3n\xa0\x00\x00\x00\x00/~\x83\xb0\x00\x00\x00\x000\x93P\xa0\x00\x00\x00\x001g\xa00\x00\x00\x00\x002s2\xa0\x00\x00\x00\x00" +
-	"3G\x820\x00\x00\x00\x004S\x14\xa0\x00\x00\x00\x005'd0\x00\x00\x00\x0062\xf6\xa0\x00\x00\x00\x007\aF0\x00\x00\x00\x008\x1c\x13 \x00\x00\x00\x008\xe7(0\x00\x00\x00\x009\xfb\xf5 " +
-	"\x00\x00\x00\x00:\xc7\n0\x00\x00\x00\x00;\xdb\xd7 \x00\x00\x00\x00<\xb0&\xb0\x00\x00\x00\x00=\xbb\xb9 \x00\x00\x00\x00>\x90\b\xb0\x00\x00\x00\x00?\x9b\x9b \x00\x00\x00\x00@o\xea\xb0\x00\x00\x00\x00" +
-	"A\x84\xb7\xa0\x00\x00\x00\x00BO̰\x00\x00\x00\x00Cd\x99\xa0\x00\x00\x00\x00D/\xae\xb0\x00\x00\x00\x00ED{\xa0\x00\x00\x00\x00E\xf3\xe10\x01\x02\x03\x04\x02\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05" +
-	"\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\a\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b" +
-	"\t\b\t\b\t\b\t\b\x00\x00\xb6n\x00\x00\xff\xffd\xee\x00\x00\xff\xffeP\x00\x04\xff\xffs`\x01\b\xff\xffs`\x01\f\xff\xffeP\x00\x10\xff\xffs`\x01\x14\xff\xff\x81p\x00\x18\xff\xff\x8f\x80" +
-	"\x01\x1c\xff\xff\x81p\x00!LMT\x00NST\x00NWT\x00NPT\x00BST\x00BDT\x00YST\x00AKDT\x00AKST\x00\nAKST9AKDT,M3." +
-	"2.0,M11.1.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb7-2f\xe4\x01\x00\x00\xe4\x01\x00\x00\x0f\x00\x00\x00America/NoronhaTZi" +
-	"f2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\x00\x00\x00\x03\x00\x00\x00\f\xff\xff\xff\xff\x96\xaaed\xff\xff\xff\xff\xb8\x0f;\xd0\xff\xff\xff\xff\xb8\xfd2\x90\xff\xff\xff\xff" +
-	"\xb9\xf1& \xff\xff\xff\xff\xba\xdef\x10\xff\xff\xff\xff\xda8\xa0 \xff\xff\xff\xff\xda\xeb\xec \xff\xff\xff\xff\xdc\x19Ӡ\xff\xff\xff\xffܹK\x10\xff\xff\xff\xff\xdd\xfb\a \xff\xff\xff\xffޛ\xd0\x10" +
-	"\xff\xff\xff\xff\xdf\u074c \xff\xff\xff\xff\xe0T%\x10\xff\xff\xff\xff\xf4\x97\xf1\xa0\xff\xff\xff\xff\xf5\x05P\x10\xff\xff\xff\xff\xf6\xc0V \xff\xff\xff\xff\xf7\x0e\x10\x90\xff\xff\xff\xff\xf8Q\x1e \xff\xff\xff\xff" +
-	"\xf8Ƿ\x10\xff\xff\xff\xff\xfa\nĠ\xff\xff\xff\xff\xfa\xa8\xea\x90\xff\xff\xff\xff\xfb\xeb\xf8 \xff\xff\xff\xff\xfc\x8bo\x90\x00\x00\x00\x00\x1dɀ \x00\x00\x00\x00\x1exɐ\x00\x00\x00\x00\x1f\xa0'\xa0" +
-	"\x00\x00\x00\x00 3\xc1\x90\x00\x00\x00\x00!\x81[ \x00\x00\x00\x00\"\v\xba\x90\x00\x00\x00\x00#X\x02\xa0\x00\x00\x00\x00#\xe2b\x10\x00\x00\x00\x00%7\xe4\xa0\x00\x00\x00\x00%Թ\x10\x00\x00\x00\x00" +
-	"7\xf6\xb8\xa0\x00\x00\x00\x008\xb8w\x10\x00\x00\x00\x009\xdf\xd5 \x00\x00\x00\x009\xe9\x01\x90\x00\x00\x00\x00;\xc8\xf1\xa0\x00\x00\x00\x00<o\x00\x90\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\xff\xff\xe1\x9c\x00\x00\xff\xff\xf1\xf0\x01\x04\xff\xff\xe3\xe0\x00\bLMT\x00-01\x00-02\x00\n<-02>2" +
-	"\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb7.\xb6*\x13\x04\x00\x00\x13\x04\x00\x00\x1b\x00\x00\x00America/North_Dakota/BeulahTZ" +
-	"if2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00`\x00\x00\x00\x06\x00\x00\x00\x18\xff\xff\xff\xff^\x04\f\xb0\xff\xff\xff\xff\x9e\xa6:\x90\xff\xff\xff\xff\x9f\xbb\a\x80\xff\xff\xff" +
-	"\xff\xa0\x86\x1c\x90\xff\xff\xff\xff\xa1\x9a\xe9\x80\xff\xff\xff\xffˉ\f\x90\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2a\x18\x00\xff\xff\xff\xff\xfa\xf8u\x10\xff\xff\xff\xff\xfb\xe8X\x00\xff\xff\xff\xff\xfc\xd8W" +
-	"\x10\xff\xff\xff\xff\xfd\xc8:\x00\xff\xff\xff\xff\xfe\xb89\x10\xff\xff\xff\xff\xff\xa8\x1c\x00\x00\x00\x00\x00\x00\x98\x1b\x10\x00\x00\x00\x00\x01\x87\xfe\x00\x00\x00\x00\x00\x02w\xfd\x10\x00\x00\x00\x00\x03q\x1a\x80\x00\x00\x00" +
-	"\x00\x04a\x19\x90\x00\x00\x00\x00\x05P\xfc\x80\x00\x00\x00\x00\x06@\xfb\x90\x00\x00\x00\x00\a0ހ\x00\x00\x00\x00\a\x8d5\x90\x00\x00\x00\x00\t\x10\xc0\x80\x00\x00\x00\x00\t\xad\xb1\x10\x00\x00\x00\x00\n\xf0\xa2" +
-	"\x80\x00\x00\x00\x00\vࡐ\x00\x00\x00\x00\fٿ\x00\x00\x00\x00\x00\r\xc0\x83\x90\x00\x00\x00\x00\x0e\xb9\xa1\x00\x00\x00\x00\x00\x0f\xa9\xa0\x10\x00\x00\x00\x00\x10\x99\x83\x00\x00\x00\x00\x00\x11\x89\x82\x10\x00\x00\x00" +
-	"\x00\x12ye\x00\x00\x00\x00\x00\x13id\x10\x00\x00\x00\x00\x14YG\x00\x00\x00\x00\x00\x15IF\x10\x00\x00\x00\x00\x169)\x00\x00\x00\x00\x00\x17)(\x10\x00\x00\x00\x00\x18\"E\x80\x00\x00\x00\x00\x19\t\n" +
-	"\x10\x00\x00\x00\x00\x1a\x02'\x80\x00\x00\x00\x00\x1a\xf2&\x90\x00\x00\x00\x00\x1b\xe2\t\x80\x00\x00\x00\x00\x1c\xd2\b\x90\x00\x00\x00\x00\x1d\xc1\xeb\x80\x00\x00\x00\x00\x1e\xb1\xea\x90\x00\x00\x00\x00\x1f\xa1̀\x00\x00\x00" +
-	"\x00 v\x1d\x10\x00\x00\x00\x00!\x81\xaf\x80\x00\x00\x00\x00\"U\xff\x10\x00\x00\x00\x00#j\xcc\x00\x00\x00\x00\x00$5\xe1\x10\x00\x00\x00\x00%J\xae\x00\x00\x00\x00\x00&\x15\xc3\x10\x00\x00\x00\x00'*\x90" +
-	"\x00\x00\x00\x00\x00'\xfeߐ\x00\x00\x00\x00)\nr\x00\x00\x00\x00\x00)\xde\xc1\x90\x00\x00\x00\x00*\xeaT\x00\x00\x00\x00\x00+\xbe\xa3\x90\x00\x00\x00\x00,\xd3p\x80\x00\x00\x00\x00-\x9e\x85\x90\x00\x00\x00" +
-	"\x00.\xb3R\x80\x00\x00\x00\x00/~g\x90\x00\x00\x00\x000\x934\x80\x00\x00\x00\x001g\x84\x10\x00\x00\x00\x002s\x16\x80\x00\x00\x00\x003Gf\x10\x00\x00\x00\x004R\xf8\x80\x00\x00\x00\x005'H" +
-	"\x10\x00\x00\x00\x0062ڀ\x00\x00\x00\x007\a*\x10\x00\x00\x00\x008\x1b\xf7\x00\x00\x00\x00\x008\xe7\f\x10\x00\x00\x00\x009\xfb\xd9\x00\x00\x00\x00\x00:\xc6\xee\x10\x00\x00\x00\x00;ۻ\x00\x00\x00\x00" +
-	"\x00<\xb0\n\x90\x00\x00\x00\x00=\xbb\x9d\x00\x00\x00\x00\x00>\x8f\xec\x90\x00\x00\x00\x00?\x9b\x7f\x00\x00\x00\x00\x00@oΐ\x00\x00\x00\x00A\x84\x9b\x80\x00\x00\x00\x00BO\xb0\x90\x00\x00\x00\x00Cd}" +
-	"\x80\x00\x00\x00\x00D/\x92\x90\x00\x00\x00\x00ED_\x80\x00\x00\x00\x00E\xf3\xc5\x10\x00\x00\x00\x00G-|\x00\x00\x00\x00\x00Gӧ\x10\x00\x00\x00\x00I\r^\x00\x00\x00\x00\x00I\xb3\x89\x10\x00\x00\x00" +
-	"\x00J\xed@\x00\x00\x00\x00\x00K\x9c\xa5\x90\x00\x00\x00\x00L\xd6\\\x80\x02\x01\x02\x01\x02\x03\x04\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x05\xff\xff\xa0" +
-	"\x95\x00\x00\xff\xff\xab\xa0\x01\x04\xff\xff\x9d\x90\x00\b\xff\xff\xab\xa0\x01\f\xff\xff\xab\xa0\x01\x10\xff\xff\xab\xa0\x00\x14LMT\x00MDT\x00MST\x00MWT\x00MPT\x00CST\x00\nCS" +
-	"T6CDT,M3.2.0,M11.1.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00H\xeam\xef\xde\x03\x00\x00\xde\x03\x00\x00\x1b\x00\x00\x00America/N" +
-	"orth_Dakota/CenterTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" +
-	"\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Y\x00\x00\x00\a\x00\x00\x00\x1c\xff\xff\xff\xff^\x04\f" +
-	"\xb0\xff\xff\xff\xff\x9e\xa6:\x90\xff\xff\xff\xff\x9f\xbb\a\x80\xff\xff\xff\xff\xa0\x86\x1c\x90\xff\xff\xff\xff\xa1\x9a\xe9\x80\xff\xff\xff\xffˉ\f\x90\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2a\x18\x00\xff\xff\xff" +
-	"\xff\xfa\xf8u\x10\xff\xff\xff\xff\xfb\xe8X\x00\xff\xff\xff\xff\xfc\xd8W\x10\xff\xff\xff\xff\xfd\xc8:\x00\xff\xff\xff\xff\xfe\xb89\x10\xff\xff\xff\xff\xff\xa8\x1c\x00\x00\x00\x00\x00\x00\x98\x1b\x10\x00\x00\x00\x00\x01\x87\xfe" +
-	"\x00\x00\x00\x00\x00\x02w\xfd\x10\x00\x00\x00\x00\x03q\x1a\x80\x00\x00\x00\x00\x04a\x19\x90\x00\x00\x00\x00\x05P\xfc\x80\x00\x00\x00\x00\x06@\xfb\x90\x00\x00\x00\x00\a0ހ\x00\x00\x00\x00\a\x8d5\x90\x00\x00\x00" +
-	"\x00\t\x10\xc0\x80\x00\x00\x00\x00\t\xad\xb1\x10\x00\x00\x00\x00\n\xf0\xa2\x80\x00\x00\x00\x00\vࡐ\x00\x00\x00\x00\fٿ\x00\x00\x00\x00\x00\r\xc0\x83\x90\x00\x00\x00\x00\x0e\xb9\xa1\x00\x00\x00\x00\x00\x0f\xa9\xa0" +
-	"\x10\x00\x00\x00\x00\x10\x99\x83\x00\x00\x00\x00\x00\x11\x89\x82\x10\x00\x00\x00\x00\x12ye\x00\x00\x00\x00\x00\x13id\x10\x00\x00\x00\x00\x14YG\x00\x00\x00\x00\x00\x15IF\x10\x00\x00\x00\x00\x169)\x00\x00\x00\x00" +
-	"\x00\x17)(\x10\x00\x00\x00\x00\x18\"E\x80\x00\x00\x00\x00\x19\t\n\x10\x00\x00\x00\x00\x1a\x02'\x80\x00\x00\x00\x00\x1a\xf2&\x90\x00\x00\x00\x00\x1b\xe2\t\x80\x00\x00\x00\x00\x1c\xd2\b\x90\x00\x00\x00\x00\x1d\xc1\xeb" +
-	"\x80\x00\x00\x00\x00\x1e\xb1\xea\x90\x00\x00\x00\x00\x1f\xa1̀\x00\x00\x00\x00 v\x1d\x10\x00\x00\x00\x00!\x81\xaf\x80\x00\x00\x00\x00\"U\xff\x10\x00\x00\x00\x00#j\xcc\x00\x00\x00\x00\x00$5\xe1\x10\x00\x00\x00" +
-	"\x00%J\xae\x00\x00\x00\x00\x00&\x15\xc3\x10\x00\x00\x00\x00'*\x90\x00\x00\x00\x00\x00'\xfeߐ\x00\x00\x00\x00)\nr\x00\x00\x00\x00\x00)\xde\xc1\x90\x00\x00\x00\x00*\xeaT\x00\x00\x00\x00\x00+\xbe\x95" +
-	"\x80\x00\x00\x00\x00,\xd3bp\x00\x00\x00\x00-\x9ew\x80\x00\x00\x00\x00.\xb3Dp\x00\x00\x00\x00/~Y\x80\x00\x00\x00\x000\x93&p\x00\x00\x00\x001gv\x00\x00\x00\x00\x002s\bp\x00\x00\x00" +
-	"\x003GX\x00\x00\x00\x00\x004R\xeap\x00\x00\x00\x005':\x00\x00\x00\x00\x0062\xccp\x00\x00\x00\x007\a\x1c\x00\x00\x00\x00\x008\x1b\xe8\xf0\x00\x00\x00\x008\xe6\xfe\x00\x00\x00\x00\x009\xfb\xca" +
-	"\xf0\x00\x00\x00\x00:\xc6\xe0\x00\x00\x00\x00\x00;۬\xf0\x00\x00\x00\x00<\xaf\xfc\x80\x00\x00\x00\x00=\xbb\x8e\xf0\x00\x00\x00\x00>\x8fހ\x00\x00\x00\x00?\x9bp\xf0\x00\x00\x00\x00@o\xc0\x80\x00\x00\x00" +
-	"\x00A\x84\x8dp\x00\x00\x00\x00BO\xa2\x80\x00\x00\x00\x00Cdop\x00\x00\x00\x00D/\x84\x80\x00\x00\x00\x00EDQp\x00\x00\x00\x00E\xf3\xb7\x00\x02\x01\x02\x01\x02\x03\x04\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05" +
-	"\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\xff\xff\xa1\b\x00\x00\xff\xff\xab\xa0\x01\x04\xff\xff\x9d\x90\x00\b\xff\xff\xab\xa0\x01\f\xff\xff\xab\xa0\x01\x10\xff\xff\xb9\xb0\x01\x14\xff\xff\xab\xa0\x00\x18LMT\x00" +
-	"MDT\x00MST\x00MWT\x00MPT\x00CDT\x00CST\x00\nCST6CDT,M3.2.0,M11.1.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00R\x1b\x8b(\xde\x03\x00\x00\xde\x03\x00\x00\x1e\x00\x00\x00America/North_Dakota/New_SalemTZif2\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Y\x00\x00\x00\a\x00\x00\x00\x1c\xff\xff\xff\xff^\x04\f\xb0\xff\xff\xff\xff\x9e\xa6:\x90\xff\xff\xff\xff\x9f\xbb\a\x80\xff\xff\xff\xff\xa0\x86\x1c\x90\xff\xff\xff\xff\xa1" +
-	"\x9a\xe9\x80\xff\xff\xff\xffˉ\f\x90\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2a\x18\x00\xff\xff\xff\xff\xfa\xf8u\x10\xff\xff\xff\xff\xfb\xe8X\x00\xff\xff\xff\xff\xfc\xd8W\x10\xff\xff\xff\xff\xfd\xc8:\x00\xff" +
-	"\xff\xff\xff\xfe\xb89\x10\xff\xff\xff\xff\xff\xa8\x1c\x00\x00\x00\x00\x00\x00\x98\x1b\x10\x00\x00\x00\x00\x01\x87\xfe\x00\x00\x00\x00\x00\x02w\xfd\x10\x00\x00\x00\x00\x03q\x1a\x80\x00\x00\x00\x00\x04a\x19\x90\x00\x00\x00\x00\x05" +
-	"P\xfc\x80\x00\x00\x00\x00\x06@\xfb\x90\x00\x00\x00\x00\a0ހ\x00\x00\x00\x00\a\x8d5\x90\x00\x00\x00\x00\t\x10\xc0\x80\x00\x00\x00\x00\t\xad\xb1\x10\x00\x00\x00\x00\n\xf0\xa2\x80\x00\x00\x00\x00\vࡐ\x00" +
-	"\x00\x00\x00\fٿ\x00\x00\x00\x00\x00\r\xc0\x83\x90\x00\x00\x00\x00\x0e\xb9\xa1\x00\x00\x00\x00\x00\x0f\xa9\xa0\x10\x00\x00\x00\x00\x10\x99\x83\x00\x00\x00\x00\x00\x11\x89\x82\x10\x00\x00\x00\x00\x12ye\x00\x00\x00\x00\x00\x13" +
-	"id\x10\x00\x00\x00\x00\x14YG\x00\x00\x00\x00\x00\x15IF\x10\x00\x00\x00\x00\x169)\x00\x00\x00\x00\x00\x17)(\x10\x00\x00\x00\x00\x18\"E\x80\x00\x00\x00\x00\x19\t\n\x10\x00\x00\x00\x00\x1a\x02'\x80\x00" +
-	"\x00\x00\x00\x1a\xf2&\x90\x00\x00\x00\x00\x1b\xe2\t\x80\x00\x00\x00\x00\x1c\xd2\b\x90\x00\x00\x00\x00\x1d\xc1\xeb\x80\x00\x00\x00\x00\x1e\xb1\xea\x90\x00\x00\x00\x00\x1f\xa1̀\x00\x00\x00\x00 v\x1d\x10\x00\x00\x00\x00!" +
-	"\x81\xaf\x80\x00\x00\x00\x00\"U\xff\x10\x00\x00\x00\x00#j\xcc\x00\x00\x00\x00\x00$5\xe1\x10\x00\x00\x00\x00%J\xae\x00\x00\x00\x00\x00&\x15\xc3\x10\x00\x00\x00\x00'*\x90\x00\x00\x00\x00\x00'\xfeߐ\x00" +
-	"\x00\x00\x00)\nr\x00\x00\x00\x00\x00)\xde\xc1\x90\x00\x00\x00\x00*\xeaT\x00\x00\x00\x00\x00+\xbe\xa3\x90\x00\x00\x00\x00,\xd3p\x80\x00\x00\x00\x00-\x9e\x85\x90\x00\x00\x00\x00.\xb3R\x80\x00\x00\x00\x00/" +
-	"~g\x90\x00\x00\x00\x000\x934\x80\x00\x00\x00\x001g\x84\x10\x00\x00\x00\x002s\x16\x80\x00\x00\x00\x003Gf\x10\x00\x00\x00\x004R\xf8\x80\x00\x00\x00\x005'H\x10\x00\x00\x00\x0062ڀ\x00" +
-	"\x00\x00\x007\a*\x10\x00\x00\x00\x008\x1b\xf7\x00\x00\x00\x00\x008\xe7\f\x10\x00\x00\x00\x009\xfb\xd9\x00\x00\x00\x00\x00:\xc6\xee\x10\x00\x00\x00\x00;ۻ\x00\x00\x00\x00\x00<\xb0\n\x90\x00\x00\x00\x00=" +
-	"\xbb\x9d\x00\x00\x00\x00\x00>\x8f\xec\x90\x00\x00\x00\x00?\x9b\x7f\x00\x00\x00\x00\x00@o\xc0\x80\x00\x00\x00\x00A\x84\x8dp\x00\x00\x00\x00BO\xa2\x80\x00\x00\x00\x00Cdop\x00\x00\x00\x00D/\x84\x80\x00" +
-	"\x00\x00\x00EDQp\x00\x00\x00\x00E\xf3\xb7\x00\x02\x01\x02\x01\x02\x03\x04\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x06\x05\x06\x05\x06\x05\x06\x05\xff\xff\xa0\xed\x00\x00\xff\xff\xab\xa0\x01\x04\xff\xff\x9d\x90" +
-	"\x00\b\xff\xff\xab\xa0\x01\f\xff\xff\xab\xa0\x01\x10\xff\xff\xb9\xb0\x01\x14\xff\xff\xab\xa0\x00\x18LMT\x00MDT\x00MST\x00MWT\x00MPT\x00CDT\x00CST\x00\nCST6C" +
-	"DT,M3.2.0,M11.1.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\xbc\xc9I\xa3\x03\x00\x00\xa3\x03\x00\x00\f\x00\x00\x00America/Nuuk" +
-	"TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00X\x00\x00\x00\x04\x00\x00\x00\f\xff\xff\xff\xff\x9b\x80h\x00\x00\x00\x00\x00\x13M|P\x00\x00\x00\x00\x143\xfa\x90\x00" +
-	"\x00\x00\x00\x15#\xeb\x90\x00\x00\x00\x00\x16\x13ܐ\x00\x00\x00\x00\x17\x03͐\x00\x00\x00\x00\x17\xf3\xbe\x90\x00\x00\x00\x00\x18㯐\x00\x00\x00\x00\x19Ӡ\x90\x00\x00\x00\x00\x1aÑ\x90\x00\x00\x00\x00\x1b" +
-	"\xbc\xbd\x10\x00\x00\x00\x00\x1c\xac\xae\x10\x00\x00\x00\x00\x1d\x9c\x9f\x10\x00\x00\x00\x00\x1e\x8c\x90\x10\x00\x00\x00\x00\x1f|\x81\x10\x00\x00\x00\x00 lr\x10\x00\x00\x00\x00!\\c\x10\x00\x00\x00\x00\"LT\x10\x00" +
-	"\x00\x00\x00#<E\x10\x00\x00\x00\x00$,6\x10\x00\x00\x00\x00%\x1c'\x10\x00\x00\x00\x00&\f\x18\x10\x00\x00\x00\x00'\x05C\x90\x00\x00\x00\x00'\xf54\x90\x00\x00\x00\x00(\xe5%\x90\x00\x00\x00\x00)" +
-	"\xd5\x16\x90\x00\x00\x00\x00*\xc5\a\x90\x00\x00\x00\x00+\xb4\xf8\x90\x00\x00\x00\x00,\xa4\xe9\x90\x00\x00\x00\x00-\x94ڐ\x00\x00\x00\x00.\x84ː\x00\x00\x00\x00/t\xbc\x90\x00\x00\x00\x000d\xad\x90\x00" +
-	"\x00\x00\x001]\xd9\x10\x00\x00\x00\x002r\xb4\x10\x00\x00\x00\x003=\xbb\x10\x00\x00\x00\x004R\x96\x10\x00\x00\x00\x005\x1d\x9d\x10\x00\x00\x00\x0062x\x10\x00\x00\x00\x006\xfd\x7f\x10\x00\x00\x00\x008" +
-	"\x1b\x94\x90\x00\x00\x00\x008\xdda\x10\x00\x00\x00\x009\xfbv\x90\x00\x00\x00\x00:\xbdC\x10\x00\x00\x00\x00;\xdbX\x90\x00\x00\x00\x00<\xa6_\x90\x00\x00\x00\x00=\xbb:\x90\x00\x00\x00\x00>\x86A\x90\x00" +
-	"\x00\x00\x00?\x9b\x1c\x90\x00\x00\x00\x00@f#\x90\x00\x00\x00\x00A\x849\x10\x00\x00\x00\x00BF\x05\x90\x00\x00\x00\x00Cd\x1b\x10\x00\x00\x00\x00D%\xe7\x90\x00\x00\x00\x00EC\xfd\x10\x00\x00\x00\x00F" +
-	"\x05ɐ\x00\x00\x00\x00G#\xdf\x10\x00\x00\x00\x00G\xee\xe6\x10\x00\x00\x00\x00I\x03\xc1\x10\x00\x00\x00\x00I\xce\xc8\x10\x00\x00\x00\x00J\xe3\xa3\x10\x00\x00\x00\x00K\xae\xaa\x10\x00\x00\x00\x00L̿\x90\x00" +
-	"\x00\x00\x00M\x8e\x8c\x10\x00\x00\x00\x00N\xac\xa1\x90\x00\x00\x00\x00Onn\x10\x00\x00\x00\x00P\x8c\x83\x90\x00\x00\x00\x00QW\x8a\x90\x00\x00\x00\x00Rle\x90\x00\x00\x00\x00S7l\x90\x00\x00\x00\x00T" +
-	"LG\x90\x00\x00\x00\x00U\x17N\x90\x00\x00\x00\x00V,)\x90\x00\x00\x00\x00V\xf70\x90\x00\x00\x00\x00X\x15F\x10\x00\x00\x00\x00X\xd7\x12\x90\x00\x00\x00\x00Y\xf5(\x10\x00\x00\x00\x00Z\xb6\xf4\x90\x00" +
-	"\x00\x00\x00[\xd5\n\x10\x00\x00\x00\x00\\\xa0\x11\x10\x00\x00\x00\x00]\xb4\xec\x10\x00\x00\x00\x00^\x7f\xf3\x10\x00\x00\x00\x00_\x94\xce\x10\x00\x00\x00\x00`_\xd5\x10\x00\x00\x00\x00a}\xea\x90\x00\x00\x00\x00b" +
-	"?\xb7\x10\x00\x00\x00\x00c]̐\x00\x00\x00\x00d\x1f\x99\x10\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x03\xff\xffπ\x00\x00\xff\xff\xd5\xd0\x00\x04\xff" +
-	"\xff\xe3\xe0\x01\b\xff\xff\xe3\xe0\x00\bLMT\x00-03\x00-02\x00\n<-02>2\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xe5\x9e<\xc5\x02\x00\x00\xc5\x02\x00\x00\x0f\x00\x00" +
-	"\x00America/OjinagaTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01" +
-	"\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00<\x00\x00\x00\x05\x00\x00\x00\x14\xff\xff\xff\xff\xa5\xb6\xe8p\xff" +
-	"\xff\xff\xff\xaf\xf2n\xe0\xff\xff\xff\xff\xb6fV`\xff\xff\xff\xff\xb7C\xd2`\xff\xff\xff\xff\xb8\f6`\xff\xff\xff\xff\xb8\xfd\x86\xf0\x00\x00\x00\x001gv\x00\x00\x00\x00\x002s\bp\x00\x00\x00\x003" +
-	"GX\x00\x00\x00\x00\x004R\xeap\x00\x00\x00\x005'H\x10\x00\x00\x00\x0062ڀ\x00\x00\x00\x007\a*\x10\x00\x00\x00\x008\x1b\xf7\x00\x00\x00\x00\x008\xe7\f\x10\x00\x00\x00\x009\xfb\xd9\x00\x00" +
-	"\x00\x00\x00:\xf5\x12\x90\x00\x00\x00\x00;\xb6\xd1\x00\x00\x00\x00\x00<\xb0\n\x90\x00\x00\x00\x00=\xbb\x9d\x00\x00\x00\x00\x00>\x8f\xec\x90\x00\x00\x00\x00?\x9b\x7f\x00\x00\x00\x00\x00@oΐ\x00\x00\x00\x00A" +
-	"\x84\x9b\x80\x00\x00\x00\x00BO\xb0\x90\x00\x00\x00\x00Cd}\x80\x00\x00\x00\x00D/\x92\x90\x00\x00\x00\x00ED_\x80\x00\x00\x00\x00F\x0ft\x90\x00\x00\x00\x00G$A\x80\x00\x00\x00\x00G\xf8\x91\x10\x00" +
-	"\x00\x00\x00I\x04#\x80\x00\x00\x00\x00I\xd8s\x10\x00\x00\x00\x00J\xe4\x05\x80\x00\x00\x00\x00K\x9c\xa5\x90\x00\x00\x00\x00L\xd6\\\x80\x00\x00\x00\x00M|\x87\x90\x00\x00\x00\x00N\xb6>\x80\x00\x00\x00\x00O" +
-	"\\i\x90\x00\x00\x00\x00P\x96 \x80\x00\x00\x00\x00Q<K\x90\x00\x00\x00\x00Rv\x02\x80\x00\x00\x00\x00S\x1c-\x90\x00\x00\x00\x00TU\xe4\x80\x00\x00\x00\x00T\xfc\x0f\x90\x00\x00\x00\x00V5ƀ\x00" +
-	"\x00\x00\x00V\xe5,\x10\x00\x00\x00\x00X\x1e\xe3\x00\x00\x00\x00\x00X\xc5\x0e\x10\x00\x00\x00\x00Y\xfe\xc5\x00\x00\x00\x00\x00Z\xa4\xf0\x10\x00\x00\x00\x00[ާ\x00\x00\x00\x00\x00\\\x84\xd2\x10\x00\x00\x00\x00]" +
-	"\xbe\x89\x00\x00\x00\x00\x00^d\xb4\x10\x00\x00\x00\x00_\x9ek\x00\x00\x00\x00\x00`MА\x00\x00\x00\x00a\x87\x87\x80\x00\x00\x00\x00b-\xb2\x90\x00\x00\x00\x00c^/\x00\x01\x02\x01\x03\x01\x02\x04\x02\x04" +
-	"\x02\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x02\xff\xff\x9e\x1c\x00\x00\xff\xff\x9d" +
-	"\x90\x00\x04\xff\xff\xab\xa0\x00\b\xff\xff\xab\xa0\x01\f\xff\xff\xb9\xb0\x01\x10LMT\x00MST\x00CST\x00MDT\x00CDT\x00\nCST6CDT,M3.2.0,M11" +
-	".1.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Ծ\xe7#\x95\x00\x00\x00\x95\x00\x00\x00\x0e\x00\x00\x00America/PanamaTZif2\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\f\xff\xff\xff\xffi\x87&\x10\xff\xff\xff\xff\x8b\xf4a\xe8\x01\x02\xff\xff\xb5p\x00\x00\xff\xff\xb5\x18\x00\x04\xff\xff\xb9\xb0\x00\b" +
-	"LMT\x00CMT\x00EST\x00\nEST5\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Š\xd6\x05W\x03\x00\x00W\x03\x00\x00\x13\x00\x00\x00America/Pang" +
-	"nirtungTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZ" +
-	"if2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00J\x00\x00\x00\a\x00\x00\x00\x1c\xff\xff\xff\xff\xccl\xa1\x80\xff\xff\xff\xff\xd2#\xf4p\xff\xff" +
-	"\xff\xff\xd2`\xfb\xe0\x00\x00\x00\x00\x04`\xfdp\x00\x00\x00\x00\x05P\xe0`\x00\x00\x00\x00\x06@\xdfp\x00\x00\x00\x00\a0\xc2`\x00\x00\x00\x00\b \xc1p\x00\x00\x00\x00\t\x10\xa4`\x00\x00\x00\x00\n\x00" +
-	"\xa3p\x00\x00\x00\x00\n\xf0\x86`\x00\x00\x00\x00\v\xe0\x85p\x00\x00\x00\x00\f٢\xe0\x00\x00\x00\x00\r\xc0gp\x00\x00\x00\x00\x0e\xb9\x84\xe0\x00\x00\x00\x00\x0f\xa9\x83\xf0\x00\x00\x00\x00\x10\x99f\xe0\x00\x00" +
-	"\x00\x00\x11\x89e\xf0\x00\x00\x00\x00\x12yH\xe0\x00\x00\x00\x00\x13iG\xf0\x00\x00\x00\x00\x14Y*\xe0\x00\x00\x00\x00\x15I)\xf0\x00\x00\x00\x00\x169\f\xe0\x00\x00\x00\x00\x17)\v\xf0\x00\x00\x00\x00\x18\"" +
-	")`\x00\x00\x00\x00\x19\b\xed\xf0\x00\x00\x00\x00\x1a\x02\v`\x00\x00\x00\x00\x1a\xf2\np\x00\x00\x00\x00\x1b\xe1\xed`\x00\x00\x00\x00\x1c\xd1\xecp\x00\x00\x00\x00\x1d\xc1\xcf`\x00\x00\x00\x00\x1e\xb1\xcep\x00\x00" +
-	"\x00\x00\x1f\xa1\xb1`\x00\x00\x00\x00 v\x00\xf0\x00\x00\x00\x00!\x81\x93`\x00\x00\x00\x00\"U\xe2\xf0\x00\x00\x00\x00#j\xaf\xe0\x00\x00\x00\x00$5\xc4\xf0\x00\x00\x00\x00%J\x91\xe0\x00\x00\x00\x00&\x15" +
-	"\xa6\xf0\x00\x00\x00\x00'*s\xe0\x00\x00\x00\x00'\xfe\xc3p\x00\x00\x00\x00)\nU\xe0\x00\x00\x00\x00)ޥp\x00\x00\x00\x00*\xea7\xe0\x00\x00\x00\x00+\xbe\x87p\x00\x00\x00\x00,\xd3T`\x00\x00" +
-	"\x00\x00-\x9eip\x00\x00\x00\x00.\xb36`\x00\x00\x00\x00/~Kp\x00\x00\x00\x000\x93\x18`\x00\x00\x00\x001gg\xf0\x00\x00\x00\x002r\xfa`\x00\x00\x00\x003GI\xf0\x00\x00\x00\x004R" +
-	"\xdc`\x00\x00\x00\x005'+\xf0\x00\x00\x00\x0062\xbe`\x00\x00\x00\x007\a\r\xf0\x00\x00\x00\x008\x1b\xda\xe0\x00\x00\x00\x008\xe6\xfe\x00\x00\x00\x00\x009\xfb\xca\xf0\x00\x00\x00\x00:\xc6\xd1\xf0\x00\x00" +
-	"\x00\x00;۞\xe0\x00\x00\x00\x00<\xaf\xeep\x00\x00\x00\x00=\xbb\x80\xe0\x00\x00\x00\x00>\x8f\xd0p\x00\x00\x00\x00?\x9bb\xe0\x00\x00\x00\x00@o\xb2p\x00\x00\x00\x00A\x84\x7f`\x00\x00\x00\x00BO" +
-	"\x94p\x00\x00\x00\x00Cda`\x00\x00\x00\x00D/vp\x00\x00\x00\x00EDC`\x00\x00\x00\x00E\xf3\xa8\xf0\x04\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03" +
-	"\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x05\x06\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x00\x00\x00\x00\x00\x00\xff\xff\xc7\xc0\x01\x04" +
-	"\xff\xff\xb9\xb0\x00\b\xff\xff\xc7\xc0\x01\f\xff\xff\xc7\xc0\x01\x10\xff\xff\xab\xa0\x00\x14\xff\xff\xb9\xb0\x01\x18-00\x00EPT\x00EST\x00EDT\x00EWT\x00CST\x00CDT\x00\nE" +
-	"ST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\xf9\x1dɻ\x00\x00\x00\xbb\x00\x00\x00\x12\x00\x00\x00America/" +
-	"ParamariboTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00" +
-	"\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x05\x00\x00\x00\x12\xff\xff\xff\xff\x91\x05\x8e\xb8\xff\xff\xff\xff\xbe*K" +
-	"\xc4\xff\xff\xff\xff\xd2b,\xb4\x00\x00\x00\x00\x1b\xbe1\xb8\x01\x02\x03\x04\xff\xff\xccH\x00\x00\xff\xff\xcc<\x00\x04\xff\xff\xccL\x00\x04\xff\xff\xce\xc8\x00\b\xff\xff\xd5\xd0\x00\x0eLMT\x00PMT\x00-" +
-	"0330\x00-03\x00\n<-03>3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00ø\xab\x9b\xf0\x00\x00\x00\xf0\x00\x00\x00\x0f\x00\x00\x00America/Phoen" +
-	"ixTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\v\x00\x00\x00\x04\x00\x00\x00\x10\xff\xff\xff\xff^\x04\f\xb0\xff\xff\xff\xff\x9e\xa6:\x90\xff\xff\xff\xff\x9f\xbb\a" +
-	"\x80\xff\xff\xff\xff\xa0\x86\x1c\x90\xff\xff\xff\xff\xa1\x9a\xe9\x80\xff\xff\xff\xffˉ\f\x90\xff\xff\xff\xff\xcf\x17\xdf\x1c\xff\xff\xff\xffϏ\xe5\xac\xff\xff\xff\xffЁ\x1a\x1c\xff\xff\xff\xff\xfa\xf8u\x10\xff\xff\xff" +
-	"\xff\xfb\xe8X\x00\x02\x01\x02\x01\x02\x03\x02\x03\x02\x01\x02\xff\xff\x96\xee\x00\x00\xff\xff\xab\xa0\x01\x04\xff\xff\x9d\x90\x00\b\xff\xff\xab\xa0\x01\fLMT\x00MDT\x00MST\x00MWT\x00\nMST" +
-	"7\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4T\xbd\xeb5\x02\x00\x005\x02\x00\x00\x16\x00\x00\x00America/Port-au-PrinceTZif2\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00-\x00\x00\x00\x04\x00\x00\x00\x11\xff\xff\xff\xffi\x87\x1fP\xff\xff\xff\xff\x9cnq\xfc\x00\x00\x00\x00\x19\x1bF\xd0\x00\x00\x00\x00\x1a\x01\xef" +
-	"@\x00\x00\x00\x00\x1a\xf1\xeeP\x00\x00\x00\x00\x1b\xe1\xd1@\x00\x00\x00\x00\x1c\xd1\xd0P\x00\x00\x00\x00\x1d\xc1\xb3@\x00\x00\x00\x00\x1e\xb1\xb2P\x00\x00\x00\x00\x1f\xa1\x95@\x00\x00\x00\x00 \x91\x94P\x00\x00\x00" +
-	"\x00!\x81w@\x00\x00\x00\x00\"U\xd4\xe0\x00\x00\x00\x00#j\xaf\xe0\x00\x00\x00\x00$5\xb6\xe0\x00\x00\x00\x00%J\x91\xe0\x00\x00\x00\x00&\x15\x98\xe0\x00\x00\x00\x00'*s\xe0\x00\x00\x00\x00'\xfe\xb5" +
-	"`\x00\x00\x00\x00)\nU\xe0\x00\x00\x00\x00)ޗ`\x00\x00\x00\x00*\xea7\xe0\x00\x00\x00\x00+\xbey`\x00\x00\x00\x00,\xd3T`\x00\x00\x00\x00-\x9e[`\x00\x00\x00\x00.\xb36`\x00\x00\x00" +
-	"\x00/~=`\x00\x00\x00\x000\x93\x18`\x00\x00\x00\x001gY\xe0\x00\x00\x00\x002r\xfa`\x00\x00\x00\x003G;\xe0\x00\x00\x00\x004R\xdc`\x00\x00\x00\x00BOxP\x00\x00\x00\x00CdE" +
-	"@\x00\x00\x00\x00D/ZP\x00\x00\x00\x00ED'@\x00\x00\x00\x00O\\Mp\x00\x00\x00\x00P\x96\x04`\x00\x00\x00\x00Q</p\x00\x00\x00\x00Ru\xe6`\x00\x00\x00\x00S\x1c\x11p\x00\x00\x00" +
-	"\x00TU\xc8`\x00\x00\x00\x00T\xfb\xf3p\x00\x00\x00\x00V5\xaa`\x00\x00\x00\x00X\xc4\xf1\xf0\x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02" +
-	"\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\xff\xff\xbc0\x00\x00\xff\xff\xbcD\x00\x04\xff\xff\xc7\xc0\x01\t\xff\xff\xb9\xb0\x00\rLMT\x00PPMT\x00EDT\x00EST\x00\nEST5" +
-	"EDT,M3.2.0,M11.1.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00q\xc9*;\xb1\x00\x00\x00\xb1\x00\x00\x00\x15\x00\x00\x00America/Por" +
-	"t_of_SpainTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00" +
-	"\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x10\xff\xff\xff\xffz敹\xff\xff\xff\xff\xcb\xf62" +
-	"\xc0\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2`\xed\xd0\x01\x03\x02\x01\xff\xff\xc2\a\x00\x00\xff\xff\xc7\xc0\x00\x04\xff\xff\xd5\xd0\x01\b\xff\xff\xd5\xd0\x01\fLMT\x00AST\x00APT\x00AWT" +
-	"\x00\nAST4\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00g\xf5K\x89\xa2\x01\x00\x00\xa2\x01\x00\x00\x12\x00\x00\x00America/Porto_AcreTZif2" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1f\x00\x00\x00\x04\x00\x00\x00\f\xff\xff\xff\xff\x96\xaa\x86\x90\xff\xff\xff\xff\xb8\x0ff\x00\xff\xff\xff\xff\xb8\xfd\\\xc0\xff\xff\xff\xff\xb9\xf1" +
-	"PP\xff\xff\xff\xff\xbaސ@\xff\xff\xff\xff\xda8\xcaP\xff\xff\xff\xff\xda\xec\x16P\xff\xff\xff\xff\xdc\x19\xfd\xd0\xff\xff\xff\xffܹu@\xff\xff\xff\xff\xdd\xfb1P\xff\xff\xff\xffޛ\xfa@\xff\xff" +
-	"\xff\xff\xdfݶP\xff\xff\xff\xff\xe0TO@\xff\xff\xff\xff\xf4\x98\x1b\xd0\xff\xff\xff\xff\xf5\x05z@\xff\xff\xff\xff\xf6\xc0\x80P\xff\xff\xff\xff\xf7\x0e:\xc0\xff\xff\xff\xff\xf8QHP\xff\xff\xff\xff\xf8\xc7" +
-	"\xe1@\xff\xff\xff\xff\xfa\n\xee\xd0\xff\xff\xff\xff\xfa\xa9\x14\xc0\xff\xff\xff\xff\xfb\xec\"P\xff\xff\xff\xff\xfc\x8b\x99\xc0\x00\x00\x00\x00\x1dɪP\x00\x00\x00\x00\x1ex\xf3\xc0\x00\x00\x00\x00\x1f\xa0Q\xd0\x00\x00" +
-	"\x00\x00 3\xeb\xc0\x00\x00\x00\x00!\x81\x85P\x00\x00\x00\x00\"\v\xe4\xc0\x00\x00\x00\x00H`\x7fP\x00\x00\x00\x00R\x7f\x04\xc0\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x03\x02\xff\xff\xc0p\x00\x00\xff\xff\xc7\xc0\x01\x04\xff\xff\xb9\xb0\x00\b\xff\xff\xc7\xc0\x00\x04LMT\x00-04\x00-05\x00\n<-05>5\nPK\x03\x04\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x1b\x81-\xa9\x8a\x01\x00\x00\x8a\x01\x00\x00\x13\x00\x00\x00America/Porto_VelhoTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x1d\x00\x00\x00\x03\x00\x00\x00\f\xff\xff\xff\xff\x96\xaa\x82\xe8\xff\xff\xff\xff\xb8\x0fW\xf0\xff\xff\xff\xff\xb8\xfdN\xb0\xff\xff\xff\xff\xb9\xf1B@\xff\xff\xff\xff\xbaނ0\xff\xff\xff" +
-	"\xff\xda8\xbc@\xff\xff\xff\xff\xda\xec\b@\xff\xff\xff\xff\xdc\x19\xef\xc0\xff\xff\xff\xffܹg0\xff\xff\xff\xff\xdd\xfb#@\xff\xff\xff\xffޛ\xec0\xff\xff\xff\xff\xdfݨ@\xff\xff\xff\xff\xe0TA" +
-	"0\xff\xff\xff\xff\xf4\x98\r\xc0\xff\xff\xff\xff\xf5\x05l0\xff\xff\xff\xff\xf6\xc0r@\xff\xff\xff\xff\xf7\x0e,\xb0\xff\xff\xff\xff\xf8Q:@\xff\xff\xff\xff\xf8\xc7\xd30\xff\xff\xff\xff\xfa\n\xe0\xc0\xff\xff\xff" +
-	"\xff\xfa\xa9\x06\xb0\xff\xff\xff\xff\xfb\xec\x14@\xff\xff\xff\xff\xfc\x8b\x8b\xb0\x00\x00\x00\x00\x1dɜ@\x00\x00\x00\x00\x1ex\xe5\xb0\x00\x00\x00\x00\x1f\xa0C\xc0\x00\x00\x00\x00 3ݰ\x00\x00\x00\x00!\x81w" +
-	"@\x00\x00\x00\x00\"\vְ\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\xff\xff\xc4\x18\x00\x00\xff\xff\xd5\xd0\x01\x04\xff\xff\xc7\xc0\x00\bLMT\x00" +
-	"-03\x00-04\x00\n<-04>4\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00q\xc9*;\xb1\x00\x00\x00\xb1\x00\x00\x00\x13\x00\x00\x00America/Puerto" +
-	"_RicoTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif" +
-	"2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x10\xff\xff\xff\xffz敹\xff\xff\xff\xff\xcb\xf62\xc0\xff\xff\xff\xff" +
-	"\xd2#\xf4p\xff\xff\xff\xff\xd2`\xed\xd0\x01\x03\x02\x01\xff\xff\xc2\a\x00\x00\xff\xff\xc7\xc0\x00\x04\xff\xff\xd5\xd0\x01\b\xff\xff\xd5\xd0\x01\fLMT\x00AST\x00APT\x00AWT\x00\nAST" +
-	"4\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00@\x13\x9b\xb1\xc2\x04\x00\x00\xc2\x04\x00\x00\x14\x00\x00\x00America/Punta_ArenasTZif2\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00u\x00\x00\x00\a\x00\x00\x00\x14\xff\xff\xff\xffi\x87\x1d\xfc\xff\xff\xff\xff\x8f0GE\xff\xff\xff\xff\x9b\\\xe5P\xff\xff\xff\xff\x9f|\xe2\xc5\xff" +
-	"\xff\xff\xff\xa1\x00q\xc0\xff\xff\xff\xff\xb0^w\xc5\xff\xff\xff\xff\xb1w=@\xff\xff\xff\xff\xb2A\x00\xd0\xff\xff\xff\xff\xb3Xp\xc0\xff\xff\xff\xff\xb4\"4P\xff\xff\xff\xff\xb59\xa4@\xff\xff\xff\xff\xb6" +
-	"\x03g\xd0\xff\xff\xff\xff\xb7\x1a\xd7\xc0\xff\xff\xff\xff\xb7\xe4\x9bP\xff\xff\xff\xff\xb8\xfd\\\xc0\xff\xff\xff\xff\xb9\xc7 P\xff\xff\xff\xff\xcc\x1cn@\xff\xff\xff\xff\xccl\xe7\xd0\xff\xff\xff\xff\xd4\x17\xe3@\xff" +
-	"\xff\xff\xff\xd53U\xc0\xff\xff\xff\xff\xd5v\x92@\xff\xff\xff\xff\xfd\xd1<@\xff\xff\xff\xff\xfe\x92\xfa\xb0\xff\xff\xff\xff\xff\xcc\xcd\xc0\x00\x00\x00\x00\x00rܰ\x00\x00\x00\x00\x01uP\xc0\x00\x00\x00\x00\x02" +
-	"@I\xb0\x00\x00\x00\x00\x03U2\xc0\x00\x00\x00\x00\x04 +\xb0\x00\x00\x00\x00\x05>O@\x00\x00\x00\x00\x06\x00\r\xb0\x00\x00\x00\x00\a\v\xbc@\x00\x00\x00\x00\a\xdf\xef\xb0\x00\x00\x00\x00\b\xfe\x13@\x00" +
-	"\x00\x00\x00\t\xbfѰ\x00\x00\x00\x00\n\xdd\xf5@\x00\x00\x00\x00\v\xa8\xee0\x00\x00\x00\x00\f\xbd\xd7@\x00\x00\x00\x00\r\x88\xd00\x00\x00\x00\x00\x0e\x9d\xb9@\x00\x00\x00\x00\x0fh\xb20\x00\x00\x00\x00\x10" +
-	"\x86\xd5\xc0\x00\x00\x00\x00\x11H\x940\x00\x00\x00\x00\x12f\xb7\xc0\x00\x00\x00\x00\x13(v0\x00\x00\x00\x00\x14F\x99\xc0\x00\x00\x00\x00\x15\x11\x92\xb0\x00\x00\x00\x00\x16&{\xc0\x00\x00\x00\x00\x16\xf1t\xb0\x00" +
-	"\x00\x00\x00\x18\x06]\xc0\x00\x00\x00\x00\x18\xd1V\xb0\x00\x00\x00\x00\x19\xe6?\xc0\x00\x00\x00\x00\x1a\xb18\xb0\x00\x00\x00\x00\x1b\xcf\\@\x00\x00\x00\x00\x1c\x91\x1a\xb0\x00\x00\x00\x00\x1d\xaf>@\x00\x00\x00\x00\x1e" +
-	"p\xfc\xb0\x00\x00\x00\x00\x1f\x8f @\x00\x00\x00\x00 \x7f\x030\x00\x00\x00\x00!o\x02@\x00\x00\x00\x00\"9\xfb0\x00\x00\x00\x00#N\xe4@\x00\x00\x00\x00$\x19\xdd0\x00\x00\x00\x00%8\x00\xc0\x00" +
-	"\x00\x00\x00%\xf9\xbf0\x00\x00\x00\x00&\xf2\xf8\xc0\x00\x00\x00\x00'١0\x00\x00\x00\x00(\xf7\xc4\xc0\x00\x00\x00\x00)½\xb0\x00\x00\x00\x00*צ\xc0\x00\x00\x00\x00+\xa2\x9f\xb0\x00\x00\x00\x00," +
-	"\xb7\x88\xc0\x00\x00\x00\x00-\x82\x81\xb0\x00\x00\x00\x00.\x97j\xc0\x00\x00\x00\x00/bc\xb0\x00\x00\x00\x000\x80\x87@\x00\x00\x00\x001BE\xb0\x00\x00\x00\x002`i@\x00\x00\x00\x003=\xd70\x00" +
-	"\x00\x00\x004@K@\x00\x00\x00\x005\vD0\x00\x00\x00\x006\r\xb8@\x00\x00\x00\x007\x06հ\x00\x00\x00\x008\x00\x0f@\x00\x00\x00\x008\xcb\b0\x00\x00\x00\x009\xe9+\xc0\x00\x00\x00\x00:" +
-	"\xaa\xea0\x00\x00\x00\x00;\xc9\r\xc0\x00\x00\x00\x00<\x8a\xcc0\x00\x00\x00\x00=\xa8\xef\xc0\x00\x00\x00\x00>j\xae0\x00\x00\x00\x00?\x88\xd1\xc0\x00\x00\x00\x00@Sʰ\x00\x00\x00\x00Ah\xb3\xc0\x00" +
-	"\x00\x00\x00B3\xac\xb0\x00\x00\x00\x00CH\x95\xc0\x00\x00\x00\x00D\x13\x8e\xb0\x00\x00\x00\x00E1\xb2@\x00\x00\x00\x00E\xf3p\xb0\x00\x00\x00\x00G\x11\x94@\x00\x00\x00\x00G\xef\x020\x00\x00\x00\x00H" +
-	"\xf1v@\x00\x00\x00\x00I\xbco0\x00\x00\x00\x00J\xd1X@\x00\x00\x00\x00K\xb8\x00\xb0\x00\x00\x00\x00L\xb1:@\x00\x00\x00\x00M\xc6\a0\x00\x00\x00\x00NP\x82\xc0\x00\x00\x00\x00O\x9c\xae\xb0\x00" +
-	"\x00\x00\x00PB\xd9\xc0\x00\x00\x00\x00Q|\x90\xb0\x00\x00\x00\x00R+\xf6@\x00\x00\x00\x00S\\r\xb0\x00\x00\x00\x00T\v\xd8@\x00\x00\x00\x00W7\xe60\x00\x00\x00\x00W\xaf\xec\xc0\x00\x00\x00\x00X" +
-	"C\x86\xb0\x01\x02\x01\x03\x01\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x03\x02\x03\x04\x02\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03" +
-	"\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x06" +
-	"\xff\xff\xbd\x84\x00\x00\xff\xff\xbd\xbb\x00\x04\xff\xff\xb9\xb0\x00\b\xff\xff\xc7\xc0\x00\f\xff\xff\xc7\xc0\x01\f\xff\xff\xd5\xd0\x01\x10\xff\xff\xd5\xd0\x00\x10LMT\x00SMT\x00-05\x00-04\x00-0" +
-	"3\x00\n<-03>3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?_p\x99\x0e\x05\x00\x00\x0e\x05\x00\x00\x13\x00\x00\x00America/Rainy_RiverT" +
-	"Zif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00}\x00\x00\x00\x05\x00\x00\x00\x14\xff\xff\xff\xffd䰔\xff\xff\xff\xff\x9b\x01\xfb\xe0\xff\xff\xff\xff\x9búP\xff\xff" +
-	"\xff\xff\x9e\xb8\xa1\x80\xff\xff\xff\xff\x9f\xba\xf9p\xff\xff\xff\xff\u00a0;\x80\xff\xff\xff\xff\xc3O\x84\xf0\xff\xff\xff\xffˈ\xfe\x80\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2a\t\xf0\xff\xff\xff\xffӈ" +
-	"h\x00\xff\xff\xff\xff\xd4S`\xf0\xff\xff\xff\xff\xd5U\xd5\x00\xff\xff\xff\xff\xd6 \xcd\xf0\xff\xff\xff\xff\xd75\xb7\x00\xff\xff\xff\xff\xd8\x00\xaf\xf0\xff\xff\xff\xff\xd9\x15\x99\x00\xff\xff\xff\xff\xd9\xe0\x91\xf0\xff\xff" +
-	"\xff\xff\xdb\x00\a\x00\xff\xff\xff\xff\xdb\xc8\\\xf0\xff\xff\xff\xff\xdcޗ\x80\xff\xff\xff\xffݩ\x90p\xff\xff\xff\xff\u07bey\x80\xff\xff\xff\xff߉rp\xff\xff\xff\xff\xe0\x9e[\x80\xff\xff\xff\xff\xe1i" +
-	"Tp\xff\xff\xff\xff\xe2~=\x80\xff\xff\xff\xff\xe3I6p\xff\xff\xff\xff\xe4^\x1f\x80\xff\xff\xff\xff\xe5)\x18p\xff\xff\xff\xff\xe6G<\x00\xff\xff\xff\xff\xe7\x124\xf0\xff\xff\xff\xff\xe8'\x1e\x00\xff\xff" +
-	"\xff\xff\xe8\xf2\x16\xf0\xff\xff\xff\xff\xea\a\x00\x00\xff\xff\xff\xff\xea\xd1\xf8\xf0\xff\xff\xff\xff\xeb\xe6\xe2\x00\xff\xff\xff\xff\xec\xd6\xc4\xf0\xff\xff\xff\xff\xed\xc6\xc4\x00\xff\xff\xff\xff\ue47c\xf0\xff\xff\xff\xff\xf3o" +
-	"\xa4\x80\xff\xff\xff\xff\xf41b\xf0\xff\xff\xff\xff\xf9\x0fJ\x80\xff\xff\xff\xff\xfa\bv\x00\xff\xff\xff\xff\xfa\xf8g\x00\xff\xff\xff\xff\xfb\xe8X\x00\xff\xff\xff\xff\xfc\xd8I\x00\xff\xff\xff\xff\xfd\xc8:\x00\xff\xff" +
-	"\xff\xff\xfe\xb8+\x00\xff\xff\xff\xff\xff\xa8\x1c\x00\x00\x00\x00\x00\x00\x98\r\x00\x00\x00\x00\x00\x01\x87\xfe\x00\x00\x00\x00\x00\x02w\xef\x00\x00\x00\x00\x00\x03q\x1a\x80\x00\x00\x00\x00\x04a\v\x80\x00\x00\x00\x00\x05P" +
-	"\xfc\x80\x00\x00\x00\x00\x06@\xed\x80\x00\x00\x00\x00\a0ހ\x00\x00\x00\x00\b π\x00\x00\x00\x00\t\x10\xc0\x80\x00\x00\x00\x00\n\x00\xb1\x80\x00\x00\x00\x00\n\xf0\xa2\x80\x00\x00\x00\x00\v\xe0\x93\x80\x00\x00" +
-	"\x00\x00\fٿ\x00\x00\x00\x00\x00\r\xc0u\x80\x00\x00\x00\x00\x0e\xb9\xa1\x00\x00\x00\x00\x00\x0f\xa9\x92\x00\x00\x00\x00\x00\x10\x99\x83\x00\x00\x00\x00\x00\x11\x89t\x00\x00\x00\x00\x00\x12ye\x00\x00\x00\x00\x00\x13i" +
-	"V\x00\x00\x00\x00\x00\x14YG\x00\x00\x00\x00\x00\x15I8\x00\x00\x00\x00\x00\x169)\x00\x00\x00\x00\x00\x17)\x1a\x00\x00\x00\x00\x00\x18\"E\x80\x00\x00\x00\x00\x19\b\xfc\x00\x00\x00\x00\x00\x1a\x02'\x80\x00\x00" +
-	"\x00\x00\x1a\xf2\x18\x80\x00\x00\x00\x00\x1b\xe2\t\x80\x00\x00\x00\x00\x1c\xd1\xfa\x80\x00\x00\x00\x00\x1d\xc1\xeb\x80\x00\x00\x00\x00\x1e\xb1܀\x00\x00\x00\x00\x1f\xa1̀\x00\x00\x00\x00 v\x0f\x00\x00\x00\x00\x00!\x81" +
-	"\xaf\x80\x00\x00\x00\x00\"U\xf1\x00\x00\x00\x00\x00#j\xcc\x00\x00\x00\x00\x00$5\xd3\x00\x00\x00\x00\x00%J\xae\x00\x00\x00\x00\x00&\x15\xb5\x00\x00\x00\x00\x00'*\x90\x00\x00\x00\x00\x00'\xfeр\x00\x00" +
-	"\x00\x00)\nr\x00\x00\x00\x00\x00)\u07b3\x80\x00\x00\x00\x00*\xeaT\x00\x00\x00\x00\x00+\xbe\x95\x80\x00\x00\x00\x00,\xd3p\x80\x00\x00\x00\x00-\x9ew\x80\x00\x00\x00\x00.\xb3R\x80\x00\x00\x00\x00/~" +
-	"Y\x80\x00\x00\x00\x000\x934\x80\x00\x00\x00\x001gv\x00\x00\x00\x00\x002s\x16\x80\x00\x00\x00\x003GX\x00\x00\x00\x00\x004R\xf8\x80\x00\x00\x00\x005':\x00\x00\x00\x00\x0062ڀ\x00\x00" +
-	"\x00\x007\a\x1c\x00\x00\x00\x00\x008\x1b\xf7\x00\x00\x00\x00\x008\xe6\xfe\x00\x00\x00\x00\x009\xfb\xd9\x00\x00\x00\x00\x00:\xc6\xe0\x00\x00\x00\x00\x00;ۻ\x00\x00\x00\x00\x00<\xaf\xfc\x80\x00\x00\x00\x00=\xbb" +
-	"\x9d\x00\x00\x00\x00\x00>\x8fހ\x00\x00\x00\x00?\x9b\x7f\x00\x00\x00\x00\x00@o\xc0\x80\x00\x00\x00\x00A\x84\x9b\x80\x00\x00\x00\x00BO\xa2\x80\x00\x00\x00\x00Cd}\x80\x00\x00\x00\x00D/\x84\x80\x00\x00" +
-	"\x00\x00EDQp\x00\x00\x00\x00E\xf3\xb7\x00\x02\x01\x02\x01\x02\x01\x02\x03\x04\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\xff\xff\xa4\xec\x00\x00\xff\xff\xb9\xb0\x01\x04\xff\xff\xab\xa0\x00\b\xff\xff\xb9\xb0\x01\f\xff\xff\xb9\xb0\x01\x10LMT\x00CDT\x00CST" +
-	"\x00CWT\x00CPT\x00\nCST6CDT,M3.2.0,M11.1.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xdfH\r'\x03\x00\x00'\x03\x00\x00\x14" +
-	"\x00\x00\x00America/Rankin_InletTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00H\x00\x00\x00\x04\x00\x00\x00\x10\xff\xff" +
-	"\xff\xff\xe7\x8cn\x00\x00\x00\x00\x00\x04a\v\x80\x00\x00\x00\x00\x05P\xeep\x00\x00\x00\x00\x06@\xed\x80\x00\x00\x00\x00\a0\xd0p\x00\x00\x00\x00\b π\x00\x00\x00\x00\t\x10\xb2p\x00\x00\x00\x00\n\x00" +
-	"\xb1\x80\x00\x00\x00\x00\n\xf0\x94p\x00\x00\x00\x00\v\xe0\x93\x80\x00\x00\x00\x00\fٰ\xf0\x00\x00\x00\x00\r\xc0u\x80\x00\x00\x00\x00\x0e\xb9\x92\xf0\x00\x00\x00\x00\x0f\xa9\x92\x00\x00\x00\x00\x00\x10\x99t\xf0\x00\x00" +
-	"\x00\x00\x11\x89t\x00\x00\x00\x00\x00\x12yV\xf0\x00\x00\x00\x00\x13iV\x00\x00\x00\x00\x00\x14Y8\xf0\x00\x00\x00\x00\x15I8\x00\x00\x00\x00\x00\x169\x1a\xf0\x00\x00\x00\x00\x17)\x1a\x00\x00\x00\x00\x00\x18\"" +
-	"7p\x00\x00\x00\x00\x19\b\xfc\x00\x00\x00\x00\x00\x1a\x02\x19p\x00\x00\x00\x00\x1a\xf2\x18\x80\x00\x00\x00\x00\x1b\xe1\xfbp\x00\x00\x00\x00\x1c\xd1\xfa\x80\x00\x00\x00\x00\x1d\xc1\xddp\x00\x00\x00\x00\x1e\xb1܀\x00\x00" +
-	"\x00\x00\x1f\xa1\xbfp\x00\x00\x00\x00 v\x0f\x00\x00\x00\x00\x00!\x81\xa1p\x00\x00\x00\x00\"U\xf1\x00\x00\x00\x00\x00#j\xbd\xf0\x00\x00\x00\x00$5\xd3\x00\x00\x00\x00\x00%J\x9f\xf0\x00\x00\x00\x00&\x15" +
-	"\xb5\x00\x00\x00\x00\x00'*\x81\xf0\x00\x00\x00\x00'\xfeр\x00\x00\x00\x00)\nc\xf0\x00\x00\x00\x00)\u07b3\x80\x00\x00\x00\x00*\xeaE\xf0\x00\x00\x00\x00+\xbe\x95\x80\x00\x00\x00\x00,\xd3bp\x00\x00" +
-	"\x00\x00-\x9ew\x80\x00\x00\x00\x00.\xb3Dp\x00\x00\x00\x00/~Y\x80\x00\x00\x00\x000\x93&p\x00\x00\x00\x001gv\x00\x00\x00\x00\x002s\bp\x00\x00\x00\x003GX\x00\x00\x00\x00\x004R" +
-	"\xeap\x00\x00\x00\x005':\x00\x00\x00\x00\x0062\xccp\x00\x00\x00\x007\a\x1c\x00\x00\x00\x00\x008\x1b\xe8\xf0\x00\x00\x00\x008\xe6\xfe\x00\x00\x00\x00\x009\xfb\xca\xf0\x00\x00\x00\x00:\xc6\xe0\x00\x00\x00" +
-	"\x00\x00;۬\xf0\x00\x00\x00\x00<\xaf\xfc\x80\x00\x00\x00\x00=\xbb\x8e\xf0\x00\x00\x00\x00>\x8fހ\x00\x00\x00\x00?\x9bp\xf0\x00\x00\x00\x00@o\xc0\x80\x00\x00\x00\x00A\x84\x8dp\x00\x00\x00\x00BO" +
-	"\xa2\x80\x00\x00\x00\x00Cdop\x00\x00\x00\x00D/\x84\x80\x00\x00\x00\x00EDQp\x00\x00\x00\x00E\xf3\xb7\x00\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x03\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x00\x00\x00\x00\x00\x00\xff\xff\xb9\xb0\x01\x04\xff\xff" +
-	"\xab\xa0\x00\b\xff\xff\xb9\xb0\x00\f-00\x00CDT\x00CST\x00EST\x00\nCST6CDT,M3.2.0,M11.1.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\xbf\x03u\xf3\xe4\x01\x00\x00\xe4\x01\x00\x00\x0e\x00\x00\x00America/RecifeTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"'\x00\x00\x00\x03\x00\x00\x00\f\xff\xff\xff\xff\x96\xaag\xb8\xff\xff\xff\xff\xb8\x0fI\xe0\xff\xff\xff\xff\xb8\xfd@\xa0\xff\xff\xff\xff\xb9\xf140\xff\xff\xff\xff\xba\xdet \xff\xff\xff\xff\xda8\xae0\xff\xff\xff" +
-	"\xff\xda\xeb\xfa0\xff\xff\xff\xff\xdc\x19\xe1\xb0\xff\xff\xff\xffܹY \xff\xff\xff\xff\xdd\xfb\x150\xff\xff\xff\xffޛ\xde \xff\xff\xff\xff\xdfݚ0\xff\xff\xff\xff\xe0T3 \xff\xff\xff\xff\xf4\x97\xff" +
-	"\xb0\xff\xff\xff\xff\xf5\x05^ \xff\xff\xff\xff\xf6\xc0d0\xff\xff\xff\xff\xf7\x0e\x1e\xa0\xff\xff\xff\xff\xf8Q,0\xff\xff\xff\xff\xf8\xc7\xc5 \xff\xff\xff\xff\xfa\nҰ\xff\xff\xff\xff\xfa\xa8\xf8\xa0\xff\xff\xff" +
-	"\xff\xfb\xec\x060\xff\xff\xff\xff\xfc\x8b}\xa0\x00\x00\x00\x00\x1dɎ0\x00\x00\x00\x00\x1exנ\x00\x00\x00\x00\x1f\xa05\xb0\x00\x00\x00\x00 3Ϡ\x00\x00\x00\x00!\x81i0\x00\x00\x00\x00\"\v\xc8" +
-	"\xa0\x00\x00\x00\x00#X\x10\xb0\x00\x00\x00\x00#\xe2p \x00\x00\x00\x00%7\xf2\xb0\x00\x00\x00\x00%\xd4\xc7 \x00\x00\x00\x007\xf6ư\x00\x00\x00\x008\xb8\x85 \x00\x00\x00\x009\xdf\xe30\x00\x00\x00" +
-	"\x009\xe9\x0f\xa0\x00\x00\x00\x00;\xc8\xff\xb0\x00\x00\x00\x00<o\x0e\xa0\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\xff\xff\xdfH\x00\x00\xff\xff\xe3\xe0\x01\x04\xff\xff\xd5\xd0\x00\bLMT\x00-02\x00-03\x00\n<-03>3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\u0096dK~\x02\x00\x00" +
-	"~\x02\x00\x00\x0e\x00\x00\x00America/ReginaTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x005\x00\x00\x00\x06\x00\x00\x00\x18\xff\xff\xff" +
-	"\xff\x86\xfd\x93\x1c\xff\xff\xff\xff\x9e\xb8\xaf\x90\xff\xff\xff\xff\x9f\xbb\a\x80\xff\xff\xff\xff\xb5eO\xf0\xff\xff\xff\xff\xb60H\xe0\xff\xff\xff\xff\xb7E1\xf0\xff\xff\xff\xff\xb8\x10*\xe0\xff\xff\xff\xff\xb9%\x13" +
-	"\xf0\xff\xff\xff\xff\xb9\xf0\f\xe0\xff\xff\xff\xff\xbb\x0e0p\xff\xff\xff\xff\xbb\xcf\xee\xe0\xff\xff\xff\xff\xbc\xee\x12p\xff\xff\xff\xff\xbd\xb9\v`\xff\xff\xff\xff\xc2r\b\xf0\xff\xff\xff\xff\xc3a\xeb\xe0\xff\xff\xff" +
-	"\xff\xc4Q\xea\xf0\xff\xff\xff\xff\xc58\x93`\xff\xff\xff\xff\xc61\xcc\xf0\xff\xff\xff\xff\xc7!\xaf\xe0\xff\xff\xff\xff\xc8\x1a\xe9p\xff\xff\xff\xff\xc9\n\xcc`\xff\xff\xff\xff\xc9\xfa\xcbp\xff\xff\xff\xff\xca\xea\xae" +
-	"`\xff\xff\xff\xffˉ\f\x90\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2a\x18\x00\xff\xff\xff\xff\xd3c\x8c\x10\xff\xff\xff\xff\xd4So\x00\xff\xff\xff\xff\xd5U\xe3\x10\xff\xff\xff\xff\xd6 \xdc\x00\xff\xff\xff" +
-	"\xff\xd75\xc5\x10\xff\xff\xff\xff\xd8\x00\xbe\x00\xff\xff\xff\xff\xd9\x15\xa7\x10\xff\xff\xff\xff\xd9\xe0\xa0\x00\xff\xff\xff\xff\xda\xfeÐ\xff\xff\xff\xff\xdb\xc0\x82\x00\xff\xff\xff\xff\xdcޥ\x90\xff\xff\xff\xffݩ\x9e" +
-	"\x80\xff\xff\xff\xff\u07be\x87\x90\xff\xff\xff\xff߉\x80\x80\xff\xff\xff\xff\xe0\x9ei\x90\xff\xff\xff\xff\xe1ib\x80\xff\xff\xff\xff\xe2~K\x90\xff\xff\xff\xff\xe3ID\x80\xff\xff\xff\xff\xe4^-\x90\xff\xff\xff" +
-	"\xff\xe5)&\x80\xff\xff\xff\xff\xe6GJ\x10\xff\xff\xff\xff\xe7\x12C\x00\xff\xff\xff\xff\xe8',\x10\xff\xff\xff\xff\xe8\xf2%\x00\xff\xff\xff\xff\xeb\xe6\xf0\x10\xff\xff\xff\xff\xec\xd6\xd3\x00\xff\xff\xff\xff\xed\xc6\xd2" +
-	"\x10\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x03\x04\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x05\xff\xff\x9d\xe4\x00\x00" +
-	"\xff\xff\xab\xa0\x01\x04\xff\xff\x9d\x90\x00\b\xff\xff\xab\xa0\x01\f\xff\xff\xab\xa0\x01\x10\xff\xff\xab\xa0\x00\x14LMT\x00MDT\x00MST\x00MWT\x00MPT\x00CST\x00\nCST6\n" +
-	"PK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb0I~D'\x03\x00\x00'\x03\x00\x00\x10\x00\x00\x00America/ResoluteTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00H\x00\x00\x00\x04\x00\x00\x00\x10\xff\xff\xff\xff\xd5\xfb\x81\x80\x00\x00\x00\x00\x04a\v\x80\x00\x00\x00\x00\x05P\xeep\x00\x00\x00\x00\x06@\xed\x80\x00\x00\x00\x00\a0\xd0" +
-	"p\x00\x00\x00\x00\b π\x00\x00\x00\x00\t\x10\xb2p\x00\x00\x00\x00\n\x00\xb1\x80\x00\x00\x00\x00\n\xf0\x94p\x00\x00\x00\x00\v\xe0\x93\x80\x00\x00\x00\x00\fٰ\xf0\x00\x00\x00\x00\r\xc0u\x80\x00\x00\x00" +
-	"\x00\x0e\xb9\x92\xf0\x00\x00\x00\x00\x0f\xa9\x92\x00\x00\x00\x00\x00\x10\x99t\xf0\x00\x00\x00\x00\x11\x89t\x00\x00\x00\x00\x00\x12yV\xf0\x00\x00\x00\x00\x13iV\x00\x00\x00\x00\x00\x14Y8\xf0\x00\x00\x00\x00\x15I8" +
-	"\x00\x00\x00\x00\x00\x169\x1a\xf0\x00\x00\x00\x00\x17)\x1a\x00\x00\x00\x00\x00\x18\"7p\x00\x00\x00\x00\x19\b\xfc\x00\x00\x00\x00\x00\x1a\x02\x19p\x00\x00\x00\x00\x1a\xf2\x18\x80\x00\x00\x00\x00\x1b\xe1\xfbp\x00\x00\x00" +
-	"\x00\x1c\xd1\xfa\x80\x00\x00\x00\x00\x1d\xc1\xddp\x00\x00\x00\x00\x1e\xb1܀\x00\x00\x00\x00\x1f\xa1\xbfp\x00\x00\x00\x00 v\x0f\x00\x00\x00\x00\x00!\x81\xa1p\x00\x00\x00\x00\"U\xf1\x00\x00\x00\x00\x00#j\xbd" +
-	"\xf0\x00\x00\x00\x00$5\xd3\x00\x00\x00\x00\x00%J\x9f\xf0\x00\x00\x00\x00&\x15\xb5\x00\x00\x00\x00\x00'*\x81\xf0\x00\x00\x00\x00'\xfeр\x00\x00\x00\x00)\nc\xf0\x00\x00\x00\x00)\u07b3\x80\x00\x00\x00" +
-	"\x00*\xeaE\xf0\x00\x00\x00\x00+\xbe\x95\x80\x00\x00\x00\x00,\xd3bp\x00\x00\x00\x00-\x9ew\x80\x00\x00\x00\x00.\xb3Dp\x00\x00\x00\x00/~Y\x80\x00\x00\x00\x000\x93&p\x00\x00\x00\x001gv" +
-	"\x00\x00\x00\x00\x002s\bp\x00\x00\x00\x003GX\x00\x00\x00\x00\x004R\xeap\x00\x00\x00\x005':\x00\x00\x00\x00\x0062\xccp\x00\x00\x00\x007\a\x1c\x00\x00\x00\x00\x008\x1b\xe8\xf0\x00\x00\x00" +
-	"\x008\xe6\xfe\x00\x00\x00\x00\x009\xfb\xca\xf0\x00\x00\x00\x00:\xc6\xe0\x00\x00\x00\x00\x00;۬\xf0\x00\x00\x00\x00<\xaf\xfc\x80\x00\x00\x00\x00=\xbb\x8e\xf0\x00\x00\x00\x00>\x8fހ\x00\x00\x00\x00?\x9bp" +
-	"\xf0\x00\x00\x00\x00@o\xc0\x80\x00\x00\x00\x00A\x84\x8dp\x00\x00\x00\x00BO\xa2\x80\x00\x00\x00\x00Cdop\x00\x00\x00\x00D/\x84\x80\x00\x00\x00\x00EDQp\x00\x00\x00\x00E\xf3\xb7\x00\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x03\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x03\x01\x00\x00\x00\x00\x00\x00\xff\xff\xb9\xb0\x01\x04\xff\xff\xab\xa0\x00\b\xff\xff\xb9\xb0\x00\f-00\x00CDT\x00CST\x00EST\x00\nCST6CDT,M3" +
-	".2.0,M11.1.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00g\xf5K\x89\xa2\x01\x00\x00\xa2\x01\x00\x00\x12\x00\x00\x00America/Rio_Branc" +
-	"oTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1f\x00\x00\x00\x04\x00\x00\x00\f\xff\xff\xff\xff\x96\xaa\x86\x90\xff\xff\xff\xff\xb8\x0ff\x00\xff\xff\xff\xff\xb8\xfd\\\xc0" +
-	"\xff\xff\xff\xff\xb9\xf1PP\xff\xff\xff\xff\xbaސ@\xff\xff\xff\xff\xda8\xcaP\xff\xff\xff\xff\xda\xec\x16P\xff\xff\xff\xff\xdc\x19\xfd\xd0\xff\xff\xff\xffܹu@\xff\xff\xff\xff\xdd\xfb1P\xff\xff\xff\xff" +
-	"ޛ\xfa@\xff\xff\xff\xff\xdfݶP\xff\xff\xff\xff\xe0TO@\xff\xff\xff\xff\xf4\x98\x1b\xd0\xff\xff\xff\xff\xf5\x05z@\xff\xff\xff\xff\xf6\xc0\x80P\xff\xff\xff\xff\xf7\x0e:\xc0\xff\xff\xff\xff\xf8QHP" +
-	"\xff\xff\xff\xff\xf8\xc7\xe1@\xff\xff\xff\xff\xfa\n\xee\xd0\xff\xff\xff\xff\xfa\xa9\x14\xc0\xff\xff\xff\xff\xfb\xec\"P\xff\xff\xff\xff\xfc\x8b\x99\xc0\x00\x00\x00\x00\x1dɪP\x00\x00\x00\x00\x1ex\xf3\xc0\x00\x00\x00\x00" +
-	"\x1f\xa0Q\xd0\x00\x00\x00\x00 3\xeb\xc0\x00\x00\x00\x00!\x81\x85P\x00\x00\x00\x00\"\v\xe4\xc0\x00\x00\x00\x00H`\x7fP\x00\x00\x00\x00R\x7f\x04\xc0\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x03\x02\xff\xff\xc0p\x00\x00\xff\xff\xc7\xc0\x01\x04\xff\xff\xb9\xb0\x00\b\xff\xff\xc7\xc0\x00\x04LMT\x00-04\x00-05\x00\n<-05>5\nP" +
-	"K\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xef\xf0R\x8a\xc4\x02\x00\x00\xc4\x02\x00\x00\x0f\x00\x00\x00America/RosarioTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00=\x00\x00\x00\x06\x00\x00\x00\x14\xff\xff\xff\xffr\x9c\xad\xb0\xff\xff\xff\xff\xa2\x92\x8f0\xff\xff\xff\xff\xb6{R@\xff\xff\xff\xff\xb7\x1aɰ\xff\xff\xff\xff\xb8\x1e\x8f@\xff" +
-	"\xff\xff\xff\xb8\xd4p0\xff\xff\xff\xff\xba\x17}\xc0\xff\xff\xff\xff\xba\xb5\xa3\xb0\xff\xff\xff\xff\xbb\xf8\xb1@\xff\xff\xff\xff\xbc\x96\xd70\xff\xff\xff\xff\xbd\xd9\xe4\xc0\xff\xff\xff\xff\xbex\n\xb0\xff\xff\xff\xff\xbf" +
-	"\xbb\x18@\xff\xff\xff\xff\xc0Z\x8f\xb0\xff\xff\xff\xff\xc1\x9d\x9d@\xff\xff\xff\xff\xc2;\xc30\xff\xff\xff\xff\xc3~\xd0\xc0\xff\xff\xff\xff\xc4\x1c\xf6\xb0\xff\xff\xff\xff\xc5`\x04@\xff\xff\xff\xff\xc5\xfe*0\xff" +
-	"\xff\xff\xff\xc7A7\xc0\xff\xff\xff\xff\xc7\xe0\xaf0\xff\xff\xff\xffȁ\x94@\xff\xff\xff\xff\xcaM\xa1\xb0\xff\xff\xff\xff\xca\xee\x86\xc0\xff\xff\xff\xff\xceM\xff0\xff\xff\xff\xffΰ\xed\xc0\xff\xff\xff\xff\xd3" +
-	")5\xb0\xff\xff\xff\xff\xd4Cd\xc0\xff\xff\xff\xff\xf4=\b0\xff\xff\xff\xff\xf4\x9f\xf6\xc0\xff\xff\xff\xff\xf5\x05l0\xff\xff\xff\xff\xf62\x10@\xff\xff\xff\xff\xf6柰\xff\xff\xff\xff\xf8\x13C\xc0\xff" +
-	"\xff\xff\xff\xf8\xc7\xd30\xff\xff\xff\xff\xf9\xf4w@\xff\xff\xff\xff\xfa\xd36\xb0\xff\xff\xff\xff\xfb\xc35\xc0\xff\xff\xff\xff\xfc\xbcS0\xff\xff\xff\xff\xfd\xacR@\xff\xff\xff\xff\xfe\x9c50\xff\xff\xff\xff\xff" +
-	"\x8c4@\x00\x00\x00\x00\a\xa3J\xb0\x00\x00\x00\x00\b$o\xa0\x00\x00\x00\x00#\x94\xb5\xb0\x00\x00\x00\x00$\x10\x94\xa0\x00\x00\x00\x00%7\xf2\xb0\x00\x00\x00\x00%\xf0v\xa0\x00\x00\x00\x00'!\x0f0\x00" +
-	"\x00\x00\x00'\xd0X\xa0\x00\x00\x00\x00)\x00\xff@\x00\x00\x00\x00)\xb0:\xa0\x00\x00\x00\x00*\xe0\xd30\x00\x00\x00\x00+\x99W \x00\x00\x00\x007\xf6ư\x00\x00\x00\x008\xbf*\xb0\x00\x00\x00\x00G" +
-	"w\t\xb0\x00\x00\x00\x00G\xdc\x7f \x00\x00\x00\x00H\xfa\xa2\xb0\x00\x00\x00\x00I\xbca \x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03" +
-	"\x02\x03\x02\x03\x02\x03\x02\x03\x02\x05\x04\x05\x04\x05\x04\x05\x04\x02\x04\x05\x04\x05\x03\x05\x04\x05\x04\x05\xff\xff\xc3\xd0\x00\x00\xff\xff\xc3\xd0\x00\x04\xff\xff\xc7\xc0\x00\b\xff\xff\xd5\xd0\x01\f\xff\xff\xe3\xe0\x01\x10\xff\xff" +
-	"\xd5\xd0\x00\fLMT\x00CMT\x00-04\x00-03\x00-02\x00\n<-03>3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9B$\x90\x01\x04\x00\x00\x01\x04\x00\x00\x14\x00" +
-	"\x00\x00America/Santa_IsabelTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00^\x00\x00\x00\x06\x00\x00\x00\x18\xff\xff\xff" +
-	"\xff\xa5\xb6\xe8p\xff\xff\xff\xff\xa9yOp\xff\xff\xff\xff\xaf\xf2|\xf0\xff\xff\xff\xff\xb6fdp\xff\xff\xff\xff\xb7\x1b\x10\x00\xff\xff\xff\xff\xb8\n\xf2\xf0\xff\xff\xff\xff\xcbꍀ\xff\xff\xff\xff\xd2#\xf4" +
-	"p\xff\xff\xff\xffҙ\xbap\xff\xff\xff\xff\xd7\x1bY\x00\xff\xff\xff\xffؑ\xb4\xf0\xff\xff\xff\xff\xe2~K\x90\xff\xff\xff\xff\xe3IR\x90\xff\xff\xff\xff\xe4^-\x90\xff\xff\xff\xff\xe5)4\x90\xff\xff\xff" +
-	"\xff\xe6GJ\x10\xff\xff\xff\xff\xe7\x12Q\x10\xff\xff\xff\xff\xe8',\x10\xff\xff\xff\xff\xe8\xf23\x10\xff\xff\xff\xff\xea\a\x0e\x10\xff\xff\xff\xff\xea\xd2\x15\x10\xff\xff\xff\xff\xeb\xe6\xf0\x10\xff\xff\xff\xff\xec\xb1\xf7" +
-	"\x10\xff\xff\xff\xff\xed\xc6\xd2\x10\xff\xff\xff\xff\xee\x91\xd9\x10\x00\x00\x00\x00\v\u0be0\x00\x00\x00\x00\f\xd9\xcd\x10\x00\x00\x00\x00\r\xc0\x91\xa0\x00\x00\x00\x00\x0e\xb9\xaf\x10\x00\x00\x00\x00\x0f\xa9\xae \x00\x00\x00" +
-	"\x00\x10\x99\x91\x10\x00\x00\x00\x00\x11\x89\x90 \x00\x00\x00\x00\x12ys\x10\x00\x00\x00\x00\x13ir \x00\x00\x00\x00\x14YU\x10\x00\x00\x00\x00\x15IT \x00\x00\x00\x00\x1697\x10\x00\x00\x00\x00\x17)6" +
-	" \x00\x00\x00\x00\x18\"S\x90\x00\x00\x00\x00\x19\t\x18 \x00\x00\x00\x00\x1a\x025\x90\x00\x00\x00\x00\x1a\xf24\xa0\x00\x00\x00\x00\x1b\xe2\x17\x90\x00\x00\x00\x00\x1c\xd2\x16\xa0\x00\x00\x00\x00\x1d\xc1\xf9\x90\x00\x00\x00" +
-	"\x00\x1e\xb1\xf8\xa0\x00\x00\x00\x00\x1f\xa1ې\x00\x00\x00\x00 v+ \x00\x00\x00\x00!\x81\xbd\x90\x00\x00\x00\x00\"V\r \x00\x00\x00\x00#j\xda\x10\x00\x00\x00\x00$5\xef \x00\x00\x00\x00%J\xbc" +
-	"\x10\x00\x00\x00\x00&\x15\xd1 \x00\x00\x00\x00'*\x9e\x10\x00\x00\x00\x00'\xfe\xed\xa0\x00\x00\x00\x00)\n\x80\x10\x00\x00\x00\x00)\xdeϠ\x00\x00\x00\x00*\xeab\x10\x00\x00\x00\x00+\xbe\xb1\xa0\x00\x00\x00" +
-	"\x00,\xd3~\x90\x00\x00\x00\x00-\x9e\x93\xa0\x00\x00\x00\x00.\xb3`\x90\x00\x00\x00\x00/~u\xa0\x00\x00\x00\x000\x93B\x90\x00\x00\x00\x001g\x92 \x00\x00\x00\x002s$\x90\x00\x00\x00\x003Gt" +
-	" \x00\x00\x00\x004S\x06\x90\x00\x00\x00\x005'V \x00\x00\x00\x0062\xe8\x90\x00\x00\x00\x007\a8 \x00\x00\x00\x008\x1c\x05\x10\x00\x00\x00\x008\xe7\x1a \x00\x00\x00\x009\xfb\xe7\x10\x00\x00\x00" +
-	"\x00:\xc6\xfc \x00\x00\x00\x00;\xdb\xc9\x10\x00\x00\x00\x00<\xb0\x18\xa0\x00\x00\x00\x00=\xbb\xab\x10\x00\x00\x00\x00>\x8f\xfa\xa0\x00\x00\x00\x00?\x9b\x8d\x10\x00\x00\x00\x00@oܠ\x00\x00\x00\x00A\x84\xa9" +
-	"\x90\x00\x00\x00\x00BO\xbe\xa0\x00\x00\x00\x00Cd\x8b\x90\x00\x00\x00\x00D/\xa0\xa0\x00\x00\x00\x00EDm\x90\x00\x00\x00\x00F\x0f\x82\xa0\x00\x00\x00\x00G$O\x90\x00\x00\x00\x00G\xf8\x9f \x00\x00\x00" +
-	"\x00I\x041\x90\x00\x00\x00\x00I\u0601 \x00\x00\x00\x00J\xe4\x13\x90\x00\x00\x00\x00K\x9c\xb3\xa0\x01\x02\x01\x02\x03\x02\x04\x05\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02" +
-	"\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02" +
-	"\x03\x02\x03\xff\xff\x92L\x00\x00\xff\xff\x9d\x90\x00\x04\xff\xff\x8f\x80\x00\b\xff\xff\x9d\x90\x01\f\xff\xff\x9d\x90\x01\x10\xff\xff\x9d\x90\x01\x14LMT\x00MST\x00PST\x00PDT\x00PWT\x00P" +
-	"PT\x00\nPST8PDT,M3.2.0,M11.1.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04,2h\x99\x01\x00\x00\x99\x01\x00\x00\x10\x00\x00\x00Ame" +
-	"rica/SantaremTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00" +
-	"\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1e\x00\x00\x00\x04\x00\x00\x00\f\xff\xff\xff\xff\x96\xaazH\xff\xff\xff\xff" +
-	"\xb8\x0fW\xf0\xff\xff\xff\xff\xb8\xfdN\xb0\xff\xff\xff\xff\xb9\xf1B@\xff\xff\xff\xff\xbaނ0\xff\xff\xff\xff\xda8\xbc@\xff\xff\xff\xff\xda\xec\b@\xff\xff\xff\xff\xdc\x19\xef\xc0\xff\xff\xff\xffܹg0" +
-	"\xff\xff\xff\xff\xdd\xfb#@\xff\xff\xff\xffޛ\xec0\xff\xff\xff\xff\xdfݨ@\xff\xff\xff\xff\xe0TA0\xff\xff\xff\xff\xf4\x98\r\xc0\xff\xff\xff\xff\xf5\x05l0\xff\xff\xff\xff\xf6\xc0r@\xff\xff\xff\xff" +
-	"\xf7\x0e,\xb0\xff\xff\xff\xff\xf8Q:@\xff\xff\xff\xff\xf8\xc7\xd30\xff\xff\xff\xff\xfa\n\xe0\xc0\xff\xff\xff\xff\xfa\xa9\x06\xb0\xff\xff\xff\xff\xfb\xec\x14@\xff\xff\xff\xff\xfc\x8b\x8b\xb0\x00\x00\x00\x00\x1dɜ@" +
-	"\x00\x00\x00\x00\x1ex\xe5\xb0\x00\x00\x00\x00\x1f\xa0C\xc0\x00\x00\x00\x00 3ݰ\x00\x00\x00\x00!\x81w@\x00\x00\x00\x00\"\vְ\x00\x00\x00\x00H`q@\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x03\xff\xff̸\x00\x00\xff\xff\xd5\xd0\x01\x04\xff\xff\xc7\xc0\x00\b\xff\xff\xd5\xd0\x00\x04LMT\x00-03\x00-04\x00\n<-03>" +
-	"3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00]\"_WJ\x05\x00\x00J\x05\x00\x00\x10\x00\x00\x00America/SantiagoTZif3\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x82\x00\x00\x00\x06\x00\x00\x00\x14\xff\xff\xff\xffi\x87\x1d\xc5\xff\xff\xff\xff\x8f0GE\xff\xff\xff\xff\x9b\\\xe5P\xff\xff\xff\xff\x9f|\xe2\xc5\xff\xff\xff\xff\xa1" +
-	"\x00q\xc0\xff\xff\xff\xff\xb0^w\xc5\xff\xff\xff\xff\xb1w=@\xff\xff\xff\xff\xb2A\x00\xd0\xff\xff\xff\xff\xb3Xp\xc0\xff\xff\xff\xff\xb4\"4P\xff\xff\xff\xff\xb59\xa4@\xff\xff\xff\xff\xb6\x03g\xd0\xff" +
-	"\xff\xff\xff\xb7\x1a\xd7\xc0\xff\xff\xff\xff\xb7\xe4\x9bP\xff\xff\xff\xff\xb8\xfd\\\xc0\xff\xff\xff\xff\xb9\xc7 P\xff\xff\xff\xff\xcc\x1cn@\xff\xff\xff\xff\xccl\xe7\xd0\xff\xff\xff\xff\xd3\u070f\xc0\xff\xff\xff\xff\xd4" +
-	"\x17\xd50\xff\xff\xff\xff\xd53U\xc0\xff\xff\xff\xff\xd5v\x92@\xff\xff\xff\xff\xfd\xd1<@\xff\xff\xff\xff\xfe\x92\xfa\xb0\xff\xff\xff\xff\xff\xcc\xcd\xc0\x00\x00\x00\x00\x00rܰ\x00\x00\x00\x00\x01uP\xc0\x00" +
-	"\x00\x00\x00\x02@I\xb0\x00\x00\x00\x00\x03U2\xc0\x00\x00\x00\x00\x04 +\xb0\x00\x00\x00\x00\x05>O@\x00\x00\x00\x00\x06\x00\r\xb0\x00\x00\x00\x00\a\v\xbc@\x00\x00\x00\x00\a\xdf\xef\xb0\x00\x00\x00\x00\b" +
-	"\xfe\x13@\x00\x00\x00\x00\t\xbfѰ\x00\x00\x00\x00\n\xdd\xf5@\x00\x00\x00\x00\v\xa8\xee0\x00\x00\x00\x00\f\xbd\xd7@\x00\x00\x00\x00\r\x88\xd00\x00\x00\x00\x00\x0e\x9d\xb9@\x00\x00\x00\x00\x0fh\xb20\x00" +
-	"\x00\x00\x00\x10\x86\xd5\xc0\x00\x00\x00\x00\x11H\x940\x00\x00\x00\x00\x12f\xb7\xc0\x00\x00\x00\x00\x13(v0\x00\x00\x00\x00\x14F\x99\xc0\x00\x00\x00\x00\x15\x11\x92\xb0\x00\x00\x00\x00\x16&{\xc0\x00\x00\x00\x00\x16" +
-	"\xf1t\xb0\x00\x00\x00\x00\x18\x06]\xc0\x00\x00\x00\x00\x18\xd1V\xb0\x00\x00\x00\x00\x19\xe6?\xc0\x00\x00\x00\x00\x1a\xb18\xb0\x00\x00\x00\x00\x1b\xcf\\@\x00\x00\x00\x00\x1c\x91\x1a\xb0\x00\x00\x00\x00\x1d\xaf>@\x00" +
-	"\x00\x00\x00\x1ep\xfc\xb0\x00\x00\x00\x00\x1f\x8f @\x00\x00\x00\x00 \x7f\x030\x00\x00\x00\x00!o\x02@\x00\x00\x00\x00\"9\xfb0\x00\x00\x00\x00#N\xe4@\x00\x00\x00\x00$\x19\xdd0\x00\x00\x00\x00%" +
-	"8\x00\xc0\x00\x00\x00\x00%\xf9\xbf0\x00\x00\x00\x00&\xf2\xf8\xc0\x00\x00\x00\x00'١0\x00\x00\x00\x00(\xf7\xc4\xc0\x00\x00\x00\x00)½\xb0\x00\x00\x00\x00*צ\xc0\x00\x00\x00\x00+\xa2\x9f\xb0\x00" +
-	"\x00\x00\x00,\xb7\x88\xc0\x00\x00\x00\x00-\x82\x81\xb0\x00\x00\x00\x00.\x97j\xc0\x00\x00\x00\x00/bc\xb0\x00\x00\x00\x000\x80\x87@\x00\x00\x00\x001BE\xb0\x00\x00\x00\x002`i@\x00\x00\x00\x003" +
-	"=\xd70\x00\x00\x00\x004@K@\x00\x00\x00\x005\vD0\x00\x00\x00\x006\r\xb8@\x00\x00\x00\x007\x06հ\x00\x00\x00\x008\x00\x0f@\x00\x00\x00\x008\xcb\b0\x00\x00\x00\x009\xe9+\xc0\x00" +
-	"\x00\x00\x00:\xaa\xea0\x00\x00\x00\x00;\xc9\r\xc0\x00\x00\x00\x00<\x8a\xcc0\x00\x00\x00\x00=\xa8\xef\xc0\x00\x00\x00\x00>j\xae0\x00\x00\x00\x00?\x88\xd1\xc0\x00\x00\x00\x00@Sʰ\x00\x00\x00\x00A" +
-	"h\xb3\xc0\x00\x00\x00\x00B3\xac\xb0\x00\x00\x00\x00CH\x95\xc0\x00\x00\x00\x00D\x13\x8e\xb0\x00\x00\x00\x00E1\xb2@\x00\x00\x00\x00E\xf3p\xb0\x00\x00\x00\x00G\x11\x94@\x00\x00\x00\x00G\xef\x020\x00" +
-	"\x00\x00\x00H\xf1v@\x00\x00\x00\x00I\xbco0\x00\x00\x00\x00J\xd1X@\x00\x00\x00\x00K\xb8\x00\xb0\x00\x00\x00\x00L\xb1:@\x00\x00\x00\x00M\xc6\a0\x00\x00\x00\x00NP\x82\xc0\x00\x00\x00\x00O" +
-	"\x9c\xae\xb0\x00\x00\x00\x00PB\xd9\xc0\x00\x00\x00\x00Q|\x90\xb0\x00\x00\x00\x00R+\xf6@\x00\x00\x00\x00S\\r\xb0\x00\x00\x00\x00T\v\xd8@\x00\x00\x00\x00W7\xe60\x00\x00\x00\x00W\xaf\xec\xc0\x00" +
-	"\x00\x00\x00Y\x17\xc80\x00\x00\x00\x00Y\x8f\xce\xc0\x00\x00\x00\x00Z\xf7\xaa0\x00\x00\x00\x00[o\xb0\xc0\x00\x00\x00\x00\\\xa9g\xb0\x00\x00\x00\x00]t|\xc0\x00\x00\x00\x00^\x89I\xb0\x00\x00\x00\x00_" +
-	"T^\xc0\x00\x00\x00\x00`i+\xb0\x00\x00\x00\x00a4@\xc0\x00\x00\x00\x00bI\r\xb0\x00\x00\x00\x00c\x1d]@\x00\x00\x00\x00d(\xef\xb0\x01\x02\x01\x03\x01\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x03\x02" +
-	"\x03\x05\x04\x02\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05" +
-	"\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\xff\xff\xbd\xbb\x00\x00\xff" +
-	"\xff\xbd\xbb\x00\x04\xff\xff\xb9\xb0\x00\b\xff\xff\xc7\xc0\x00\f\xff\xff\xc7\xc0\x01\f\xff\xff\xd5\xd0\x01\x10LMT\x00SMT\x00-05\x00-04\x00-03\x00\n<-04>4<-03" +
-	">,M9.1.6/24,M4.1.6/24\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00P\x0f(\b=\x01\x00\x00=\x01\x00\x00\x15\x00\x00\x00America/" +
-	"Santo_DomingoTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00" +
-	"\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x00\x00\x06\x00\x00\x00\x1b\xff\xff\xff\xffi\x87\x1d\b\xff\xff\xff\xff" +
-	"\xba\xdfB`\xff\xff\xff\xff\xfa\bK\xd0\xff\xff\xff\xff\xfa\xa7\xc3@\xff\xff\xff\xff\xff\xa7\xf1\xd0\x00\x00\x00\x00\x00C{\xc8\x00\x00\x00\x00\x01\x87\xd3\xd0\x00\x00\x00\x00\x01\xfa\x7fH\x00\x00\x00\x00\x03p\xf0P" +
-	"\x00\x00\x00\x00\x03\xdd\x04H\x00\x00\x00\x00\x05P\xd2P\x00\x00\x00\x00\x05\xbf\x89H\x00\x00\x00\x00\a0\xb4P\x00\x00\x00\x00\a\xa0\xbc\xc8\x00\x00\x00\x00\t\x10\x96P\x00\x00\x00\x009\xfb\xbc\xe0\x00\x00\x00\x00" +
-	":)\xe1`\x01\x03\x02\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x05\x03\x05\xff\xff\xbex\x00\x00\xff\xff\xbe`\x00\x04\xff\xff\xc7\xc0\x01\t\xff\xff\xb9\xb0\x00\r\xff\xff\xc0\xb8\x01\x11\xff\xff\xc7\xc0\x00\x17LMT" +
-	"\x00SDMT\x00EDT\x00EST\x00-0430\x00AST\x00\nAST4\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9d?\xdfڸ\x03\x00\x00\xb8\x03\x00\x00\x11\x00\x00\x00" +
-	"America/Sao_PauloTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" +
-	"\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00[\x00\x00\x00\x03\x00\x00\x00\f\xff\xff\xff\xff\x96\xaar\xb4" +
-	"\xff\xff\xff\xff\xb8\x0fI\xe0\xff\xff\xff\xff\xb8\xfd@\xa0\xff\xff\xff\xff\xb9\xf140\xff\xff\xff\xff\xba\xdet \xff\xff\xff\xff\xda8\xae0\xff\xff\xff\xff\xda\xeb\xfa0\xff\xff\xff\xff\xdc\x19\xe1\xb0\xff\xff\xff\xff" +
-	"ܹY \xff\xff\xff\xff\xdd\xfb\x150\xff\xff\xff\xffޛ\xde \xff\xff\xff\xff\xdfݚ0\xff\xff\xff\xff\xe0T3 \xff\xff\xff\xff\xf4Z\t0\xff\xff\xff\xff\xf5\x05^ \xff\xff\xff\xff\xf6\xc0d0" +
-	"\xff\xff\xff\xff\xf7\x0e\x1e\xa0\xff\xff\xff\xff\xf8Q,0\xff\xff\xff\xff\xf8\xc7\xc5 \xff\xff\xff\xff\xfa\nҰ\xff\xff\xff\xff\xfa\xa8\xf8\xa0\xff\xff\xff\xff\xfb\xec\x060\xff\xff\xff\xff\xfc\x8b}\xa0\x00\x00\x00\x00" +
-	"\x1dɎ0\x00\x00\x00\x00\x1exנ\x00\x00\x00\x00\x1f\xa05\xb0\x00\x00\x00\x00 3Ϡ\x00\x00\x00\x00!\x81i0\x00\x00\x00\x00\"\vȠ\x00\x00\x00\x00#X\x10\xb0\x00\x00\x00\x00#\xe2p " +
-	"\x00\x00\x00\x00%7\xf2\xb0\x00\x00\x00\x00%\xd4\xc7 \x00\x00\x00\x00'!\x0f0\x00\x00\x00\x00'\xbd\xe3\xa0\x00\x00\x00\x00)\x00\xf10\x00\x00\x00\x00)\x94\x8b \x00\x00\x00\x00*\xea\r\xb0\x00\x00\x00\x00" +
-	"+k2\xa0\x00\x00\x00\x00,\xc0\xb50\x00\x00\x00\x00-f\xc4 \x00\x00\x00\x00.\xa0\x970\x00\x00\x00\x00/F\xa6 \x00\x00\x00\x000\x80y0\x00\x00\x00\x001\x1dM\xa0\x00\x00\x00\x002W \xb0" +
-	"\x00\x00\x00\x003\x06j \x00\x00\x00\x0048T0\x00\x00\x00\x004\xf8\xc1 \x00\x00\x00\x006 \x1f0\x00\x00\x00\x006\xcfh\xa0\x00\x00\x00\x007\xf6ư\x00\x00\x00\x008\xb8\x85 \x00\x00\x00\x00" +
-	"9\xdf\xe30\x00\x00\x00\x00:\x8f,\xa0\x00\x00\x00\x00;\xc8\xff\xb0\x00\x00\x00\x00<o\x0e\xa0\x00\x00\x00\x00=đ0\x00\x00\x00\x00>N\xf0\xa0\x00\x00\x00\x00?\x91\xfe0\x00\x00\x00\x00@.Ҡ" +
-	"\x00\x00\x00\x00A\x86\xf80\x00\x00\x00\x00B\x17\xef \x00\x00\x00\x00CQ\xc20\x00\x00\x00\x00C\xf7\xd1 \x00\x00\x00\x00EMS\xb0\x00\x00\x00\x00E\xe0\xed\xa0\x00\x00\x00\x00G\x11\x860\x00\x00\x00\x00" +
-	"G\xb7\x95 \x00\x00\x00\x00H\xfa\xa2\xb0\x00\x00\x00\x00I\x97w \x00\x00\x00\x00Jڄ\xb0\x00\x00\x00\x00K\x80\x93\xa0\x00\x00\x00\x00L\xbaf\xb0\x00\x00\x00\x00M`u\xa0\x00\x00\x00\x00N\x9aH\xb0" +
-	"\x00\x00\x00\x00OI\x92 \x00\x00\x00\x00P\x83e0\x00\x00\x00\x00Q 9\xa0\x00\x00\x00\x00RcG0\x00\x00\x00\x00S\x00\x1b\xa0\x00\x00\x00\x00TC)0\x00\x00\x00\x00T\xe98 \x00\x00\x00\x00" +
-	"V#\v0\x00\x00\x00\x00V\xc9\x1a \x00\x00\x00\x00X\x02\xed0\x00\x00\x00\x00X\xa8\xfc \x00\x00\x00\x00Y\xe2\xcf0\x00\x00\x00\x00Z\x88\xde \x00\x00\x00\x00[\xde`\xb0\x00\x00\x00\x00\\h\xc0 " +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\xff\xff\xd4L\x00\x00\xff\xff\xe3\xe0\x01\x04\xff\xff\xd5\xd0\x00\bLMT\x00-02\x00-03" +
-	"\x00\n<-03>3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00:\x9a1T\xdf\x01\x00\x00\xdf\x01\x00\x00\x14\x00\x00\x00America/ScoresbysundT" +
-	"Zif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\"\x00\x00\x00\x05\x00\x00\x00\x10\xff\xff\xff\xff\x9b\x80L\x18\x00\x00\x00\x00\x13Mn@\x00\x00\x00\x00\x144$\xc0\x00\x00" +
-	"\x00\x00\x15#\xf9\xa0\x00\x00\x00\x00\x16\x13ܐ\x00\x00\x00\x00\x17\x03͐\x00\x00\x00\x00\x17\xf3\xbe\x90\x00\x00\x00\x00\x18㯐\x00\x00\x00\x00\x19Ӡ\x90\x00\x00\x00\x00\x1aÑ\x90\x00\x00\x00\x00\x1b\xbc" +
-	"\xbd\x10\x00\x00\x00\x00\x1c\xac\xae\x10\x00\x00\x00\x00\x1d\x9c\x9f\x10\x00\x00\x00\x00\x1e\x8c\x90\x10\x00\x00\x00\x00\x1f|\x81\x10\x00\x00\x00\x00 lr\x10\x00\x00\x00\x00!\\c\x10\x00\x00\x00\x00\"LT\x10\x00\x00" +
-	"\x00\x00#<E\x10\x00\x00\x00\x00$,6\x10\x00\x00\x00\x00%\x1c'\x10\x00\x00\x00\x00&\f\x18\x10\x00\x00\x00\x00'\x05C\x90\x00\x00\x00\x00'\xf54\x90\x00\x00\x00\x00(\xe5%\x90\x00\x00\x00\x00)\xd5" +
-	"\x16\x90\x00\x00\x00\x00*\xc5\a\x90\x00\x00\x00\x00+\xb4\xf8\x90\x00\x00\x00\x00,\xa4\xe9\x90\x00\x00\x00\x00-\x94ڐ\x00\x00\x00\x00.\x84ː\x00\x00\x00\x00/t\xbc\x90\x00\x00\x00\x000d\xad\x90\x00\x00" +
-	"\x00\x001]\xd9\x10\x01\x02\x01\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\xff\xff\xebh\x00\x00\xff\xff\xe3\xe0\x00\x04\xff\xff\xf1\xf0\x01\b\xff\xff" +
-	"\xf1\xf0\x00\b\x00\x00\x00\x00\x01\fLMT\x00-02\x00-01\x00+00\x00\n<-01>1<+00>,M3.5.0/0,M10.5.0/1\nPK" +
-	"\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00V\x80\x94@\x12\x04\x00\x00\x12\x04\x00\x00\x10\x00\x00\x00America/ShiprockTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00a\x00\x00\x00\x05\x00\x00\x00\x14\xff\xff\xff\xff^\x04\f\xb0\xff\xff\xff\xff\x9e\xa6:\x90\xff\xff\xff\xff\x9f\xbb\a\x80\xff\xff\xff\xff\xa0\x86\x1c\x90\xff\xff\xff\xff\xa1\x9a\xe9\x80\xff" +
-	"\xff\xff\xff\xa2e\xfe\x90\xff\xff\xff\xff\xa3\x84\x06\x00\xff\xff\xff\xff\xa4E\xe0\x90\xff\xff\xff\xff\xa4\x8f\xa6\x80\xff\xff\xff\xffˉ\f\x90\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2a\x18\x00\xff\xff\xff\xff\xf7" +
-	"/v\x90\xff\xff\xff\xff\xf8(\x94\x00\xff\xff\xff\xff\xf9\x0fX\x90\xff\xff\xff\xff\xfa\bv\x00\xff\xff\xff\xff\xfa\xf8u\x10\xff\xff\xff\xff\xfb\xe8X\x00\xff\xff\xff\xff\xfc\xd8W\x10\xff\xff\xff\xff\xfd\xc8:\x00\xff" +
-	"\xff\xff\xff\xfe\xb89\x10\xff\xff\xff\xff\xff\xa8\x1c\x00\x00\x00\x00\x00\x00\x98\x1b\x10\x00\x00\x00\x00\x01\x87\xfe\x00\x00\x00\x00\x00\x02w\xfd\x10\x00\x00\x00\x00\x03q\x1a\x80\x00\x00\x00\x00\x04a\x19\x90\x00\x00\x00\x00\x05" +
-	"P\xfc\x80\x00\x00\x00\x00\x06@\xfb\x90\x00\x00\x00\x00\a0ހ\x00\x00\x00\x00\a\x8d5\x90\x00\x00\x00\x00\t\x10\xc0\x80\x00\x00\x00\x00\t\xad\xb1\x10\x00\x00\x00\x00\n\xf0\xa2\x80\x00\x00\x00\x00\vࡐ\x00" +
-	"\x00\x00\x00\fٿ\x00\x00\x00\x00\x00\r\xc0\x83\x90\x00\x00\x00\x00\x0e\xb9\xa1\x00\x00\x00\x00\x00\x0f\xa9\xa0\x10\x00\x00\x00\x00\x10\x99\x83\x00\x00\x00\x00\x00\x11\x89\x82\x10\x00\x00\x00\x00\x12ye\x00\x00\x00\x00\x00\x13" +
-	"id\x10\x00\x00\x00\x00\x14YG\x00\x00\x00\x00\x00\x15IF\x10\x00\x00\x00\x00\x169)\x00\x00\x00\x00\x00\x17)(\x10\x00\x00\x00\x00\x18\"E\x80\x00\x00\x00\x00\x19\t\n\x10\x00\x00\x00\x00\x1a\x02'\x80\x00" +
-	"\x00\x00\x00\x1a\xf2&\x90\x00\x00\x00\x00\x1b\xe2\t\x80\x00\x00\x00\x00\x1c\xd2\b\x90\x00\x00\x00\x00\x1d\xc1\xeb\x80\x00\x00\x00\x00\x1e\xb1\xea\x90\x00\x00\x00\x00\x1f\xa1̀\x00\x00\x00\x00 v\x1d\x10\x00\x00\x00\x00!" +
-	"\x81\xaf\x80\x00\x00\x00\x00\"U\xff\x10\x00\x00\x00\x00#j\xcc\x00\x00\x00\x00\x00$5\xe1\x10\x00\x00\x00\x00%J\xae\x00\x00\x00\x00\x00&\x15\xc3\x10\x00\x00\x00\x00'*\x90\x00\x00\x00\x00\x00'\xfeߐ\x00" +
-	"\x00\x00\x00)\nr\x00\x00\x00\x00\x00)\xde\xc1\x90\x00\x00\x00\x00*\xeaT\x00\x00\x00\x00\x00+\xbe\xa3\x90\x00\x00\x00\x00,\xd3p\x80\x00\x00\x00\x00-\x9e\x85\x90\x00\x00\x00\x00.\xb3R\x80\x00\x00\x00\x00/" +
-	"~g\x90\x00\x00\x00\x000\x934\x80\x00\x00\x00\x001g\x84\x10\x00\x00\x00\x002s\x16\x80\x00\x00\x00\x003Gf\x10\x00\x00\x00\x004R\xf8\x80\x00\x00\x00\x005'H\x10\x00\x00\x00\x0062ڀ\x00" +
-	"\x00\x00\x007\a*\x10\x00\x00\x00\x008\x1b\xf7\x00\x00\x00\x00\x008\xe7\f\x10\x00\x00\x00\x009\xfb\xd9\x00\x00\x00\x00\x00:\xc6\xee\x10\x00\x00\x00\x00;ۻ\x00\x00\x00\x00\x00<\xb0\n\x90\x00\x00\x00\x00=" +
-	"\xbb\x9d\x00\x00\x00\x00\x00>\x8f\xec\x90\x00\x00\x00\x00?\x9b\x7f\x00\x00\x00\x00\x00@oΐ\x00\x00\x00\x00A\x84\x9b\x80\x00\x00\x00\x00BO\xb0\x90\x00\x00\x00\x00Cd}\x80\x00\x00\x00\x00D/\x92\x90\x00" +
-	"\x00\x00\x00ED_\x80\x00\x00\x00\x00E\xf3\xc5\x10\x02\x01\x02\x01\x02\x01\x02\x01\x02\x03\x04\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\xff\xff\x9d\x94\x00\x00\xff\xff" +
-	"\xab\xa0\x01\x04\xff\xff\x9d\x90\x00\b\xff\xff\xab\xa0\x01\f\xff\xff\xab\xa0\x01\x10LMT\x00MDT\x00MST\x00MWT\x00MPT\x00\nMST7MDT,M3.2.0,M1" +
-	"1.1.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x81{\xc1\x92\xbc\x03\x00\x00\xbc\x03\x00\x00\r\x00\x00\x00America/SitkaTZif2\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00S\x00\x00\x00\t\x00\x00\x00\"\xff\xff\xff\xff?\xc2\xfd\xd1\xff\xff\xff\xff}\x873\x99\xff\xff\xff\xffˉ\x1a\xa0\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff" +
-	"\xd2a&\x10\xff\xff\xff\xff\xfe\xb8G \xff\xff\xff\xff\xff\xa8*\x10\x00\x00\x00\x00\x00\x98) \x00\x00\x00\x00\x01\x88\f\x10\x00\x00\x00\x00\x02x\v \x00\x00\x00\x00\x03q(\x90\x00\x00\x00\x00\x04a'\xa0" +
-	"\x00\x00\x00\x00\x05Q\n\x90\x00\x00\x00\x00\x06A\t\xa0\x00\x00\x00\x00\a0\xec\x90\x00\x00\x00\x00\a\x8dC\xa0\x00\x00\x00\x00\t\x10ΐ\x00\x00\x00\x00\t\xad\xbf \x00\x00\x00\x00\n\xf0\xb0\x90\x00\x00\x00\x00" +
-	"\v\u0be0\x00\x00\x00\x00\f\xd9\xcd\x10\x00\x00\x00\x00\r\xc0\x91\xa0\x00\x00\x00\x00\x0e\xb9\xaf\x10\x00\x00\x00\x00\x0f\xa9\xae \x00\x00\x00\x00\x10\x99\x91\x10\x00\x00\x00\x00\x11\x89\x90 \x00\x00\x00\x00\x12ys\x10" +
-	"\x00\x00\x00\x00\x13ir \x00\x00\x00\x00\x14YU\x10\x00\x00\x00\x00\x15IT \x00\x00\x00\x00\x1697\x10\x00\x00\x00\x00\x17)6 \x00\x00\x00\x00\x18\"S\x90\x00\x00\x00\x00\x19\t\x18 \x00\x00\x00\x00" +
-	"\x1a\x025\x90\x00\x00\x00\x00\x1a+\x14\x10\x00\x00\x00\x00\x1a\xf2B\xb0\x00\x00\x00\x00\x1b\xe2%\xa0\x00\x00\x00\x00\x1c\xd2$\xb0\x00\x00\x00\x00\x1d\xc2\a\xa0\x00\x00\x00\x00\x1e\xb2\x06\xb0\x00\x00\x00\x00\x1f\xa1\xe9\xa0" +
-	"\x00\x00\x00\x00 v90\x00\x00\x00\x00!\x81ˠ\x00\x00\x00\x00\"V\x1b0\x00\x00\x00\x00#j\xe8 \x00\x00\x00\x00$5\xfd0\x00\x00\x00\x00%J\xca \x00\x00\x00\x00&\x15\xdf0\x00\x00\x00\x00" +
-	"'*\xac \x00\x00\x00\x00'\xfe\xfb\xb0\x00\x00\x00\x00)\n\x8e \x00\x00\x00\x00)\xdeݰ\x00\x00\x00\x00*\xeap \x00\x00\x00\x00+\xbe\xbf\xb0\x00\x00\x00\x00,ӌ\xa0\x00\x00\x00\x00-\x9e\xa1\xb0" +
-	"\x00\x00\x00\x00.\xb3n\xa0\x00\x00\x00\x00/~\x83\xb0\x00\x00\x00\x000\x93P\xa0\x00\x00\x00\x001g\xa00\x00\x00\x00\x002s2\xa0\x00\x00\x00\x003G\x820\x00\x00\x00\x004S\x14\xa0\x00\x00\x00\x00" +
-	"5'd0\x00\x00\x00\x0062\xf6\xa0\x00\x00\x00\x007\aF0\x00\x00\x00\x008\x1c\x13 \x00\x00\x00\x008\xe7(0\x00\x00\x00\x009\xfb\xf5 \x00\x00\x00\x00:\xc7\n0\x00\x00\x00\x00;\xdb\xd7 " +
-	"\x00\x00\x00\x00<\xb0&\xb0\x00\x00\x00\x00=\xbb\xb9 \x00\x00\x00\x00>\x90\b\xb0\x00\x00\x00\x00?\x9b\x9b \x00\x00\x00\x00@o\xea\xb0\x00\x00\x00\x00A\x84\xb7\xa0\x00\x00\x00\x00BO̰\x00\x00\x00\x00" +
-	"Cd\x99\xa0\x00\x00\x00\x00D/\xae\xb0\x00\x00\x00\x00ED{\xa0\x00\x00\x00\x00E\xf3\xe10\x01\x02\x03\x04\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05" +
-	"\x02\x05\x06\b\a\b\a\b\a\b\a\b\a\b\a\b\a\b\a\b\a\b\a\b\a\b\a\b\a\b\a\b\a\b\a\b\a\b\a\b\a\b\a\b\a\b\a\b\a\b\a\x00\x00ҧ\x00\x00\xff\xff\x81" +
-	"'\x00\x00\xff\xff\x8f\x80\x00\x04\xff\xff\x9d\x90\x01\b\xff\xff\x9d\x90\x01\f\xff\xff\x9d\x90\x01\x10\xff\xff\x81p\x00\x14\xff\xff\x8f\x80\x01\x18\xff\xff\x81p\x00\x1dLMT\x00PST\x00PWT\x00PPT" +
-	"\x00PDT\x00YST\x00AKDT\x00AKST\x00\nAKST9AKDT,M3.2.0,M11.1.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00q" +
-	"\xc9*;\xb1\x00\x00\x00\xb1\x00\x00\x00\x15\x00\x00\x00America/St_BarthelemyTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x10\xff\xff\xff\xffz敹\xff\xff\xff\xff\xcb\xf62\xc0\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2`\xed\xd0\x01\x03\x02\x01\xff\xff\xc2\a\x00\x00\xff\xff\xc7\xc0\x00\x04\xff" +
-	"\xff\xd5\xd0\x01\b\xff\xff\xd5\xd0\x01\fLMT\x00AST\x00APT\x00AWT\x00\nAST4\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00~\xb2\x0e\x19V\a\x00\x00V\a\x00\x00\x10" +
-	"\x00\x00\x00America/St_JohnsTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" +
-	"\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbb\x00\x00\x00\b\x00\x00\x00\x19\xff\xff\xff\xff^=" +
-	"4\xec\xff\xff\xff\xff\x9c\xcfb\f\xff\xff\xff\xff\x9d\xa4\xe6\xfc\xff\xff\xff\xff\x9e\xb8~\x8c\xff\xff\xff\xff\x9f\xba\xd6|\xff\xff\xff\xff\xa0\xb6\x88\xdc\xff\xff\xff\xff\xa18\xffL\xff\xff\xff\xff\xa2\x95\x19\\\xff\xff" +
-	"\xff\xff\xa3\x84\xfcL\xff\xff\xff\xff\xa4t\xfb\\\xff\xff\xff\xff\xa5d\xdeL\xff\xff\xff\xff\xa6^\x17\xdc\xff\xff\xff\xff\xa7D\xc0L\xff\xff\xff\xff\xa8=\xf9\xdc\xff\xff\xff\xff\xa9$\xa2L\xff\xff\xff\xff\xaa\x1d" +
-	"\xdb\xdc\xff\xff\xff\xff\xab\x04\x84L\xff\xff\xff\xff\xab\xfd\xbd\xdc\xff\xff\xff\xff\xac\xe4fL\xff\xff\xff\xff\xadݟ\xdc\xff\xff\xff\xff\xae͂\xcc\xff\xff\xff\xff\xaf\xbd\x81\xdc\xff\xff\xff\xff\xb0\xadd\xcc\xff\xff" +
-	"\xff\xff\xb1\xa6\x9e\\\xff\xff\xff\xff\xb2\x8dF\xcc\xff\xff\xff\xff\xb3\x86\x80\\\xff\xff\xff\xff\xb4m(\xcc\xff\xff\xff\xff\xb5fb\\\xff\xff\xff\xff\xb6M\n\xcc\xff\xff\xff\xff\xb7FD\\\xff\xff\xff\xff\xb8," +
-	"\xec\xcc\xff\xff\xff\xff\xb9&&\\\xff\xff\xff\xff\xba\x16\tL\xff\xff\xff\xff\xbb\x0fB\xdc\xff\xff\xff\xff\xbb\xf5\xebL\xff\xff\xff\xff\xbc\xef$\xdc\xff\xff\xff\xff\xbd\xd5\xcdL\xff\xff\xff\xff\xbe\x9eMl\xff\xff" +
-	"\xff\xff\xbe\xcf\x06\xa8\xff\xff\xff\xff\xbf\xb5\xaf\x18\xff\xff\xff\xff\xc0\xb818\xff\xff\xff\xff\xc1y\xef\xa8\xff\xff\xff\xff\u0098\x138\xff\xff\xff\xff\xc3YѨ\xff\xff\xff\xff\xc4w\xf58\xff\xff\xff\xff\xc59" +
-	"\xb3\xa8\xff\xff\xff\xff\xc6a\x11\xb8\xff\xff\xff\xff\xc7\x19\x95\xa8\xff\xff\xff\xff\xc8@\xf3\xb8\xff\xff\xff\xff\xc9\x02\xb2(\xff\xff\xff\xff\xca ո\xff\xff\xff\xff\xca\xe2\x94(\xff\xff\xff\xff\xcc\x00\xb7\xb8\xff\xff" +
-	"\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2`\xe6\xc8\xff\xff\xff\xffӈD\xd8\xff\xff\xff\xff\xd4J\x03H\xff\xff\xff\xff\xd5h&\xd8\xff\xff\xff\xff\xd6)\xe5H\xff\xff\xff\xff\xd7H\b\xd8\xff\xff\xff\xff\xd8\t" +
-	"\xc7H\xff\xff\xff\xff\xd9'\xea\xd8\xff\xff\xff\xff\xd9\xe9\xa9H\xff\xff\xff\xff\xdb\x11\aX\xff\xff\xff\xff\xdb\xd2\xc5\xc8\xff\xff\xff\xff\xdc\xdetX\xff\xff\xff\xffݩmH\xff\xff\xff\xff\u07beVX\xff\xff" +
-	"\xff\xff߉OH\xff\xff\xff\xff\xe0\x9e8X\xff\xff\xff\xff\xe1i1H\xff\xff\xff\xff\xe2~\x1aX\xff\xff\xff\xff\xe3I\x13H\xff\xff\xff\xff\xe4]\xfcX\xff\xff\xff\xff\xe5(\xf5H\xff\xff\xff\xff\xe6G" +
-	"\x18\xd8\xff\xff\xff\xff\xe7\x12\x11\xc8\xff\xff\xff\xff\xe8&\xfa\xd8\xff\xff\xff\xff\xe8\xf1\xf3\xc8\xff\xff\xff\xff\xea\x06\xdc\xd8\xff\xff\xff\xff\xea\xd1\xd5\xc8\xff\xff\xff\xff\xeb\xe6\xbe\xd8\xff\xff\xff\xff챷\xc8\xff\xff" +
-	"\xff\xff\xedƠ\xd8\xff\xff\xff\xff\ueffeH\xff\xff\xff\xffﯽX\xff\xff\xff\xff\xf0\x9f\xa0H\xff\xff\xff\xff\xf1\x8f\x9fX\xff\xff\xff\xff\xf2\x7f\x82H\xff\xff\xff\xff\xf3o\x81X\xff\xff\xff\xff\xf4_" +
-	"dH\xff\xff\xff\xff\xf5OcX\xff\xff\xff\xff\xf6?FH\xff\xff\xff\xff\xf7/EX\xff\xff\xff\xff\xf8(b\xc8\xff\xff\xff\xff\xf9\x0f'X\xff\xff\xff\xff\xfa\bD\xc8\xff\xff\xff\xff\xfa\xf8C\xd8\xff\xff" +
-	"\xff\xff\xfb\xe8&\xc8\xff\xff\xff\xff\xfc\xd8%\xd8\xff\xff\xff\xff\xfd\xc8\b\xc8\xff\xff\xff\xff\xfe\xb8\a\xd8\xff\xff\xff\xff\xff\xa7\xea\xc8\x00\x00\x00\x00\x00\x97\xe9\xd8\x00\x00\x00\x00\x01\x87\xcc\xc8\x00\x00\x00\x00\x02w" +
-	"\xcb\xd8\x00\x00\x00\x00\x03p\xe9H\x00\x00\x00\x00\x04`\xe8X\x00\x00\x00\x00\x05P\xcbH\x00\x00\x00\x00\x06@\xcaX\x00\x00\x00\x00\a0\xadH\x00\x00\x00\x00\b \xacX\x00\x00\x00\x00\t\x10\x8fH\x00\x00" +
-	"\x00\x00\n\x00\x8eX\x00\x00\x00\x00\n\xf0qH\x00\x00\x00\x00\v\xe0pX\x00\x00\x00\x00\fٍ\xc8\x00\x00\x00\x00\r\xc0RX\x00\x00\x00\x00\x0e\xb9o\xc8\x00\x00\x00\x00\x0f\xa9n\xd8\x00\x00\x00\x00\x10\x99" +
-	"Q\xc8\x00\x00\x00\x00\x11\x89P\xd8\x00\x00\x00\x00\x12y3\xc8\x00\x00\x00\x00\x13i2\xd8\x00\x00\x00\x00\x14Y\x15\xc8\x00\x00\x00\x00\x15I\x14\xd8\x00\x00\x00\x00\x168\xf7\xc8\x00\x00\x00\x00\x17(\xf6\xd8\x00\x00" +
-	"\x00\x00\x18\"\x14H\x00\x00\x00\x00\x19\b\xd8\xd8\x00\x00\x00\x00\x1a\x01\xf6H\x00\x00\x00\x00\x1a\xf1\xf5X\x00\x00\x00\x00\x1b\xe1\xd8H\x00\x00\x00\x00\x1c\xd1\xd7X\x00\x00\x00\x00\x1d\xc1\xbaH\x00\x00\x00\x00\x1e\xb1" +
-	"\xb9X\x00\x00\x00\x00\x1f\xa1\x9cH\x00\x00\x00\x00 u\xcf\xf4\x00\x00\x00\x00!\x81bd\x00\x00\x00\x00\"U\xb1\xf4\x00\x00\x00\x00#jp\xd4\x00\x00\x00\x00$5\x93\xf4\x00\x00\x00\x00%J`\xe4\x00\x00" +
-	"\x00\x00&\x15u\xf4\x00\x00\x00\x00'*B\xe4\x00\x00\x00\x00'\xfe\x92t\x00\x00\x00\x00)\n$\xe4\x00\x00\x00\x00)\xdett\x00\x00\x00\x00*\xea\x06\xe4\x00\x00\x00\x00+\xbeVt\x00\x00\x00\x00,\xd3" +
-	"#d\x00\x00\x00\x00-\x9e8t\x00\x00\x00\x00.\xb3\x05d\x00\x00\x00\x00/~\x1at\x00\x00\x00\x000\x92\xe7d\x00\x00\x00\x001g6\xf4\x00\x00\x00\x002r\xc9d\x00\x00\x00\x003G\x18\xf4\x00\x00" +
-	"\x00\x004R\xabd\x00\x00\x00\x005&\xfa\xf4\x00\x00\x00\x0062\x8dd\x00\x00\x00\x007\x06\xdc\xf4\x00\x00\x00\x008\x1b\xa9\xe4\x00\x00\x00\x008\xe6\xbe\xf4\x00\x00\x00\x009\xfb\x8b\xe4\x00\x00\x00\x00:\xc6" +
-	"\xa0\xf4\x00\x00\x00\x00;\xdbm\xe4\x00\x00\x00\x00<\xaf\xbdt\x00\x00\x00\x00=\xbbO\xe4\x00\x00\x00\x00>\x8f\x9ft\x00\x00\x00\x00?\x9b1\xe4\x00\x00\x00\x00@o\x81t\x00\x00\x00\x00A\x84Nd\x00\x00" +
-	"\x00\x00BOct\x00\x00\x00\x00Cd0d\x00\x00\x00\x00D/Et\x00\x00\x00\x00ED\x12d\x00\x00\x00\x00E\xf3w\xf4\x00\x00\x00\x00G-.\xe4\x00\x00\x00\x00G\xd3Y\xf4\x00\x00\x00\x00I\r" +
-	"\x10\xe4\x00\x00\x00\x00I\xb3;\xf4\x00\x00\x00\x00J\xec\xf2\xe4\x00\x00\x00\x00K\x9cXt\x00\x00\x00\x00L\xd6\x0fd\x00\x00\x00\x00M|:t\x00\x00\x00\x00N\xb6\rH\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x06\x05\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03" +
-	"\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03" +
-	"\x04\x03\x04\x03\x04\x03\x04\x03\x04\a\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\xff\xff\xce" +
-	"\x94\x00\x00\xff\xffܤ\x01\x04\xff\xffΔ\x00\b\xff\xff\xdc\xd8\x01\x04\xff\xff\xce\xc8\x00\b\xff\xff\xdc\xd8\x01\f\xff\xff\xdc\xd8\x01\x10\xff\xff\xea\xe8\x01\x14LMT\x00NDT\x00NST\x00NPT" +
-	"\x00NWT\x00NDDT\x00\nNST3:30NDT,M3.2.0,M11.1.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00q\xc9*;\xb1\x00\x00\x00\xb1" +
-	"\x00\x00\x00\x10\x00\x00\x00America/St_KittsTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x10\xff\xff" +
-	"\xff\xffz敹\xff\xff\xff\xff\xcb\xf62\xc0\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2`\xed\xd0\x01\x03\x02\x01\xff\xff\xc2\a\x00\x00\xff\xff\xc7\xc0\x00\x04\xff\xff\xd5\xd0\x01\b\xff\xff\xd5\xd0\x01\fLM" +
-	"T\x00AST\x00APT\x00AWT\x00\nAST4\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00q\xc9*;\xb1\x00\x00\x00\xb1\x00\x00\x00\x10\x00\x00\x00America/St" +
-	"_LuciaTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZi" +
-	"f2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x10\xff\xff\xff\xffz敹\xff\xff\xff\xff\xcb\xf62\xc0\xff\xff\xff" +
-	"\xff\xd2#\xf4p\xff\xff\xff\xff\xd2`\xed\xd0\x01\x03\x02\x01\xff\xff\xc2\a\x00\x00\xff\xff\xc7\xc0\x00\x04\xff\xff\xd5\xd0\x01\b\xff\xff\xd5\xd0\x01\fLMT\x00AST\x00APT\x00AWT\x00\nAS" +
-	"T4\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00q\xc9*;\xb1\x00\x00\x00\xb1\x00\x00\x00\x11\x00\x00\x00America/St_ThomasTZif2\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x10\xff\xff\xff\xffz敹\xff\xff\xff\xff\xcb\xf62\xc0\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2`\xed\xd0\x01\x03\x02" +
-	"\x01\xff\xff\xc2\a\x00\x00\xff\xff\xc7\xc0\x00\x04\xff\xff\xd5\xd0\x01\b\xff\xff\xd5\xd0\x01\fLMT\x00AST\x00APT\x00AWT\x00\nAST4\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00q\xc9*;\xb1\x00\x00\x00\xb1\x00\x00\x00\x12\x00\x00\x00America/St_VincentTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x04\x00\x00\x00\x04\x00\x00\x00\x10\xff\xff\xff\xffz敹\xff\xff\xff\xff\xcb\xf62\xc0\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2`\xed\xd0\x01\x03\x02\x01\xff\xff\xc2\a\x00\x00\xff\xff\xc7\xc0\x00\x04\xff\xff" +
-	"\xd5\xd0\x01\b\xff\xff\xd5\xd0\x01\fLMT\x00AST\x00APT\x00AWT\x00\nAST4\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\xd8\x19\x9dp\x01\x00\x00p\x01\x00\x00\x15\x00" +
-	"\x00\x00America/Swift_CurrentTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x00\x00\x06\x00\x00\x00\x18\xff\xff" +
-	"\xff\xff\x86\xfd\x96\x18\xff\xff\xff\xff\x9e\xb8\xaf\x90\xff\xff\xff\xff\x9f\xbb\a\x80\xff\xff\xff\xffˉ\f\x90\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2a\x18\x00\xff\xff\xff\xff\xd3v\x01\x10\xff\xff\xff\xff\xd4S" +
-	"o\x00\xff\xff\xff\xff\xd5U\xe3\x10\xff\xff\xff\xff\xd6 \xdc\x00\xff\xff\xff\xff\xd75\xc5\x10\xff\xff\xff\xff\xd8\x00\xbe\x00\xff\xff\xff\xff\xd9\x15\xa7\x10\xff\xff\xff\xff\xd9\xe0\xa0\x00\xff\xff\xff\xff\xe8',\x10\xff\xff" +
-	"\xff\xff\xe9\x17\x0f\x00\xff\xff\xff\xff\xeb\xe6\xf0\x10\xff\xff\xff\xff\xec\xd6\xd3\x00\xff\xff\xff\xff\xed\xc6\xd2\x10\xff\xff\xff\xff\xee\x91\xcb\x00\xff\xff\xff\xff\xef\xaf\xee\x90\xff\xff\xff\xff\xf0q\xad\x00\x00\x00\x00\x00\x04a" +
-	"\x19\x90\x02\x01\x02\x03\x04\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x05\xff\xff\x9a\xe8\x00\x00\xff\xff\xab\xa0\x01\x04\xff\xff\x9d\x90\x00\b\xff\xff\xab\xa0\x01\f\xff\xff\xab\xa0\x01\x10\xff\xff\xab\xa0\x00" +
-	"\x14LMT\x00MDT\x00MST\x00MWT\x00MPT\x00CST\x00\nCST6\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x82\x13z\xe2\xc2\x00\x00\x00\xc2\x00\x00\x00\x13\x00\x00" +
-	"\x00America/TegucigalpaTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" +
-	"\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\x00\x00\x00\x03\x00\x00\x00\f\xff\xff\xff\xff\xa4" +
-	"LKD\x00\x00\x00\x00 \x9a\xdc\xe0\x00\x00\x00\x00!\\\x9bP\x00\x00\x00\x00\"z\xbe\xe0\x00\x00\x00\x00#<}P\x00\x00\x00\x00D]\x8c\xe0\x00\x00\x00\x00D\xd6\xc8\xd0\x02\x01\x02\x01\x02\x01\x02\xff\xff" +
-	"\xae<\x00\x00\xff\xff\xb9\xb0\x01\x04\xff\xff\xab\xa0\x00\bLMT\x00CDT\x00CST\x00\nCST6\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00U\r\xf7\xd3\xc7\x01\x00\x00\xc7\x01\x00\x00" +
-	"\r\x00\x00\x00America/ThuleTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" +
-	"\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\"\x00\x00\x00\x03\x00\x00\x00\f\xff\xff\xff\xff\x9b\x80w\xfc" +
-	"\x00\x00\x00\x00'\xf5z\xe0\x00\x00\x00\x00(\xe5]\xd0\x00\x00\x00\x00)\xd5\\\xe0\x00\x00\x00\x00*\xc5?\xd0\x00\x00\x00\x00+\xbey`\x00\x00\x00\x00,\xd3FP\x00\x00\x00\x00-\x9e[`\x00\x00\x00\x00" +
-	".\xb3(P\x00\x00\x00\x00/~=`\x00\x00\x00\x000\x93\nP\x00\x00\x00\x001gY\xe0\x00\x00\x00\x002r\xecP\x00\x00\x00\x003G;\xe0\x00\x00\x00\x004R\xceP\x00\x00\x00\x005'\x1d\xe0" +
-	"\x00\x00\x00\x0062\xb0P\x00\x00\x00\x007\x06\xff\xe0\x00\x00\x00\x008\x1b\xcc\xd0\x00\x00\x00\x008\xe6\xe1\xe0\x00\x00\x00\x009\xfb\xae\xd0\x00\x00\x00\x00:\xc6\xc3\xe0\x00\x00\x00\x00;ې\xd0\x00\x00\x00\x00" +
-	"<\xaf\xe0`\x00\x00\x00\x00=\xbbr\xd0\x00\x00\x00\x00>\x8f\xc2`\x00\x00\x00\x00?\x9bT\xd0\x00\x00\x00\x00@o\xa4`\x00\x00\x00\x00A\x84qP\x00\x00\x00\x00BO\x86`\x00\x00\x00\x00CdSP" +
-	"\x00\x00\x00\x00D/h`\x00\x00\x00\x00ED5P\x00\x00\x00\x00E\xf3\x9a\xe0\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\xff\xff" +
-	"\xbf\x84\x00\x00\xff\xff\xd5\xd0\x01\x04\xff\xff\xc7\xc0\x00\bLMT\x00ADT\x00AST\x00\nAST4ADT,M3.2.0,M11.1.0\nPK\x03\x04\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00ӿ\x92\xbc\xb5\x06\x00\x00\xb5\x06\x00\x00\x13\x00\x00\x00America/Thunder_BayTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\xac\x00\x00\x00\x05\x00\x00\x00\x14\xff\xff\xff\xffr\xeex\xec\xff\xff\xff\xff\x9e\xb8\x93p\xff\xff\xff\xff\x9f\xba\xeb`\xff\xff\xff\xff\xa0\x87.\xc8\xff\xff\xff\xff\xa1\x9a\xb1@\xff\xff\xff\xff" +
-	"\xa2\x94\x06\xf0\xff\xff\xff\xff\xa3U\xa9@\xff\xff\xff\xff\xa4\x86]\xf0\xff\xff\xff\xff\xa5(x`\xff\xff\xff\xff\xa6f?\xf0\xff\xff\xff\xff\xa7\fN\xe0\xff\xff\xff\xff\xa8F!\xf0\xff\xff\xff\xff\xa8\xec0\xe0" +
-	"\xff\xff\xff\xff\xaa\x1c\xc9p\xff\xff\xff\xff\xaa\xd5M`\xff\xff\xff\xff\xab\xfc\xabp\xff\xff\xff\xff\xac\xb5/`\xff\xff\xff\xff\xad܍p\xff\xff\xff\xff\xae\x95\x11`\xff\xff\xff\xff\xaf\xbcop\xff\xff\xff\xff" +
-	"\xb0~-\xe0\xff\xff\xff\xff\xb1\x9cQp\xff\xff\xff\xff\xb2gJ`\xff\xff\xff\xff\xb3|3p\xff\xff\xff\xff\xb4G,`\xff\xff\xff\xff\xb5\\\x15p\xff\xff\xff\xff\xb6'\x0e`\xff\xff\xff\xff\xb7;\xf7p" +
-	"\xff\xff\xff\xff\xb8\x06\xf0`\xff\xff\xff\xff\xb9%\x13\xf0\xff\xff\xff\xff\xb9\xe6\xd2`\xff\xff\xff\xff\xbb\x04\xf5\xf0\xff\xff\xff\xff\xbb\xcf\xee\xe0\xff\xff\xff\xff\xbc\xe4\xd7\xf0\xff\xff\xff\xff\xbd\xaf\xd0\xe0\xff\xff\xff\xff" +
-	"\xbeĹ\xf0\xff\xff\xff\xff\xbf\x8f\xb2\xe0\xff\xff\xff\xff\xc0\xa4\x9b\xf0\xff\xff\xff\xff\xc1o\x94\xe0\xff\xff\xff\xff\u0084}\xf0\xff\xff\xff\xff\xc3Ov\xe0\xff\xff\xff\xff\xc4d_\xf0\xff\xff\xff\xff\xc5/X\xe0" +
-	"\xff\xff\xff\xff\xc6M|p\xff\xff\xff\xff\xc7\x0f:\xe0\xff\xff\xff\xff\xc8-^p\xff\xff\xff\xffˈ\xf0p\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2`\xfb\xe0\xff\xff\xff\xff\xd3u\xe4\xf0\xff\xff\xff\xff" +
-	"\xd4@\xdd\xe0\xff\xff\xff\xff\xd5U\xaa\xd0\xff\xff\xff\xff\xd6 \xa3\xc0\xff\xff\xff\xff\xd75\x8c\xd0\xff\xff\xff\xff\xd8\x00\x85\xc0\xff\xff\xff\xff\xd9\x15n\xd0\xff\xff\xff\xff\xda3v@\xff\xff\xff\xff\xda\xfe\xa7p" +
-	"\xff\xff\xff\xff\xdc\x13t`\xff\xff\xff\xff\xdcމp\xff\xff\xff\xffݩ\x82`\xff\xff\xff\xff\u07bekp\xff\xff\xff\xff߉d`\xff\xff\xff\xff\xe0\x9eMp\xff\xff\xff\xff\xe1iF`\xff\xff\xff\xff" +
-	"\xe2~/p\xff\xff\xff\xff\xe3I(`\xff\xff\xff\xff\xe4^\x11p\xff\xff\xff\xff\xe5)\n`\xff\xff\xff\xff\xe6G-\xf0\xff\xff\xff\xff\xe7\x12&\xe0\xff\xff\xff\xff\xe8'\x0f\xf0\xff\xff\xff\xff\xe9\x16\xf2\xe0" +
-	"\xff\xff\xff\xff\xea\x06\xf1\xf0\xff\xff\xff\xff\xea\xf6\xd4\xe0\xff\xff\xff\xff\xeb\xe6\xd3\xf0\xff\xff\xff\xff\xecֶ\xe0\xff\xff\xff\xff\xedƵ\xf0\xff\xff\xff\xff\xee\xbf\xd3`\xff\xff\xff\xff\xef\xaf\xd2p\xff\xff\xff\xff" +
-	"\xf0\x9f\xb5`\xff\xff\xff\xff\xf1\x8f\xb4p\xff\xff\xff\xff\xf2\x7f\x97`\xff\xff\xff\xff\xf3o\x96p\xff\xff\xff\xff\xf4_y`\xff\xff\xff\xff\xf5Oxp\xff\xff\xff\xff\xf6?[`\xff\xff\xff\xff\xf7/Zp" +
-	"\xff\xff\xff\xff\xf8(w\xe0\xff\xff\xff\xff\xf9\x0f<p\xff\xff\xff\xff\xfa\bY\xe0\xff\xff\xff\xff\xfa\xf8X\xf0\xff\xff\xff\xff\xfb\xe8;\xe0\xff\xff\xff\xff\xfc\xd8:\xf0\xff\xff\xff\xff\xfd\xc8\x1d\xe0\xff\xff\xff\xff" +
-	"\xfe\xb8\x1c\xf0\xff\xff\xff\xff\xff\xa7\xff\xe0\x00\x00\x00\x00\x00\x97\xfe\xf0\x00\x00\x00\x00\x01\x87\xe1\xe0\x00\x00\x00\x00\x02w\xe0\xf0\x00\x00\x00\x00\x03p\xfe`\x00\x00\x00\x00\x04`\xfdp\x00\x00\x00\x00\x05P\xe0`" +
-	"\x00\x00\x00\x00\x06@\xdfp\x00\x00\x00\x00\a0\xc2`\x00\x00\x00\x00\b \xc1p\x00\x00\x00\x00\t\x10\xa4`\x00\x00\x00\x00\n\x00\xa3p\x00\x00\x00\x00\n\xf0\x86`\x00\x00\x00\x00\v\xe0\x85p\x00\x00\x00\x00" +
-	"\f٢\xe0\x00\x00\x00\x00\r\xc0gp\x00\x00\x00\x00\x0e\xb9\x84\xe0\x00\x00\x00\x00\x0f\xa9\x83\xf0\x00\x00\x00\x00\x10\x99f\xe0\x00\x00\x00\x00\x11\x89e\xf0\x00\x00\x00\x00\x12yH\xe0\x00\x00\x00\x00\x13iG\xf0" +
-	"\x00\x00\x00\x00\x14Y*\xe0\x00\x00\x00\x00\x15I)\xf0\x00\x00\x00\x00\x169\f\xe0\x00\x00\x00\x00\x17)\v\xf0\x00\x00\x00\x00\x18\")`\x00\x00\x00\x00\x19\b\xed\xf0\x00\x00\x00\x00\x1a\x02\v`\x00\x00\x00\x00" +
-	"\x1a\xf2\np\x00\x00\x00\x00\x1b\xe1\xed`\x00\x00\x00\x00\x1c\xd1\xecp\x00\x00\x00\x00\x1d\xc1\xcf`\x00\x00\x00\x00\x1e\xb1\xcep\x00\x00\x00\x00\x1f\xa1\xb1`\x00\x00\x00\x00 v\x00\xf0\x00\x00\x00\x00!\x81\x93`" +
-	"\x00\x00\x00\x00\"U\xe2\xf0\x00\x00\x00\x00#j\xaf\xe0\x00\x00\x00\x00$5\xc4\xf0\x00\x00\x00\x00%J\x91\xe0\x00\x00\x00\x00&\x15\xa6\xf0\x00\x00\x00\x00'*s\xe0\x00\x00\x00\x00'\xfe\xc3p\x00\x00\x00\x00" +
-	")\nU\xe0\x00\x00\x00\x00)ޥp\x00\x00\x00\x00*\xea7\xe0\x00\x00\x00\x00+\xbe\x87p\x00\x00\x00\x00,\xd3T`\x00\x00\x00\x00-\x9eip\x00\x00\x00\x00.\xb36`\x00\x00\x00\x00/~Kp" +
-	"\x00\x00\x00\x000\x93\x18`\x00\x00\x00\x001gg\xf0\x00\x00\x00\x002r\xfa`\x00\x00\x00\x003GI\xf0\x00\x00\x00\x004R\xdc`\x00\x00\x00\x005'+\xf0\x00\x00\x00\x0062\xbe`\x00\x00\x00\x00" +
-	"7\a\r\xf0\x00\x00\x00\x008\x1b\xda\xe0\x00\x00\x00\x008\xe6\xef\xf0\x00\x00\x00\x009\xfb\xbc\xe0\x00\x00\x00\x00:\xc6\xd1\xf0\x00\x00\x00\x00;۞\xe0\x00\x00\x00\x00<\xaf\xeep\x00\x00\x00\x00=\xbb\x80\xe0" +
-	"\x00\x00\x00\x00>\x8f\xd0p\x00\x00\x00\x00?\x9bb\xe0\x00\x00\x00\x00@o\xb2p\x00\x00\x00\x00A\x84\x7f`\x00\x00\x00\x00BO\x94p\x00\x00\x00\x00Cda`\x00\x00\x00\x00D/vp\x00\x00\x00\x00" +
-	"EDC`\x00\x00\x00\x00E\xf3\xa8\xf0\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x03\x04" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\xff\xff\xb5\x94\x00\x00\xff\xff\xc7\xc0\x01\x04\xff\xff\xb9\xb0\x00\b\xff\xff\xc7\xc0\x01\f\xff\xff\xc7\xc0\x01\x10LMT\x00EDT\x00EST\x00EWT\x00EPT\x00\nEST5E" +
-	"DT,M3.2.0,M11.1.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9B$\x90\x01\x04\x00\x00\x01\x04\x00\x00\x0f\x00\x00\x00America/Tiju" +
-	"anaTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00^\x00\x00\x00\x06\x00\x00\x00\x18\xff\xff\xff\xff\xa5\xb6\xe8p\xff\xff\xff\xff\xa9yOp\xff\xff\xff\xff\xaf\xf2" +
-	"|\xf0\xff\xff\xff\xff\xb6fdp\xff\xff\xff\xff\xb7\x1b\x10\x00\xff\xff\xff\xff\xb8\n\xf2\xf0\xff\xff\xff\xff\xcbꍀ\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xffҙ\xbap\xff\xff\xff\xff\xd7\x1bY\x00\xff\xff" +
-	"\xff\xffؑ\xb4\xf0\xff\xff\xff\xff\xe2~K\x90\xff\xff\xff\xff\xe3IR\x90\xff\xff\xff\xff\xe4^-\x90\xff\xff\xff\xff\xe5)4\x90\xff\xff\xff\xff\xe6GJ\x10\xff\xff\xff\xff\xe7\x12Q\x10\xff\xff\xff\xff\xe8'" +
-	",\x10\xff\xff\xff\xff\xe8\xf23\x10\xff\xff\xff\xff\xea\a\x0e\x10\xff\xff\xff\xff\xea\xd2\x15\x10\xff\xff\xff\xff\xeb\xe6\xf0\x10\xff\xff\xff\xff\xec\xb1\xf7\x10\xff\xff\xff\xff\xed\xc6\xd2\x10\xff\xff\xff\xff\xee\x91\xd9\x10\x00\x00" +
-	"\x00\x00\v\u0be0\x00\x00\x00\x00\f\xd9\xcd\x10\x00\x00\x00\x00\r\xc0\x91\xa0\x00\x00\x00\x00\x0e\xb9\xaf\x10\x00\x00\x00\x00\x0f\xa9\xae \x00\x00\x00\x00\x10\x99\x91\x10\x00\x00\x00\x00\x11\x89\x90 \x00\x00\x00\x00\x12y" +
-	"s\x10\x00\x00\x00\x00\x13ir \x00\x00\x00\x00\x14YU\x10\x00\x00\x00\x00\x15IT \x00\x00\x00\x00\x1697\x10\x00\x00\x00\x00\x17)6 \x00\x00\x00\x00\x18\"S\x90\x00\x00\x00\x00\x19\t\x18 \x00\x00" +
-	"\x00\x00\x1a\x025\x90\x00\x00\x00\x00\x1a\xf24\xa0\x00\x00\x00\x00\x1b\xe2\x17\x90\x00\x00\x00\x00\x1c\xd2\x16\xa0\x00\x00\x00\x00\x1d\xc1\xf9\x90\x00\x00\x00\x00\x1e\xb1\xf8\xa0\x00\x00\x00\x00\x1f\xa1ې\x00\x00\x00\x00 v" +
-	"+ \x00\x00\x00\x00!\x81\xbd\x90\x00\x00\x00\x00\"V\r \x00\x00\x00\x00#j\xda\x10\x00\x00\x00\x00$5\xef \x00\x00\x00\x00%J\xbc\x10\x00\x00\x00\x00&\x15\xd1 \x00\x00\x00\x00'*\x9e\x10\x00\x00" +
-	"\x00\x00'\xfe\xed\xa0\x00\x00\x00\x00)\n\x80\x10\x00\x00\x00\x00)\xdeϠ\x00\x00\x00\x00*\xeab\x10\x00\x00\x00\x00+\xbe\xb1\xa0\x00\x00\x00\x00,\xd3~\x90\x00\x00\x00\x00-\x9e\x93\xa0\x00\x00\x00\x00.\xb3" +
-	"`\x90\x00\x00\x00\x00/~u\xa0\x00\x00\x00\x000\x93B\x90\x00\x00\x00\x001g\x92 \x00\x00\x00\x002s$\x90\x00\x00\x00\x003Gt \x00\x00\x00\x004S\x06\x90\x00\x00\x00\x005'V \x00\x00" +
-	"\x00\x0062\xe8\x90\x00\x00\x00\x007\a8 \x00\x00\x00\x008\x1c\x05\x10\x00\x00\x00\x008\xe7\x1a \x00\x00\x00\x009\xfb\xe7\x10\x00\x00\x00\x00:\xc6\xfc \x00\x00\x00\x00;\xdb\xc9\x10\x00\x00\x00\x00<\xb0" +
-	"\x18\xa0\x00\x00\x00\x00=\xbb\xab\x10\x00\x00\x00\x00>\x8f\xfa\xa0\x00\x00\x00\x00?\x9b\x8d\x10\x00\x00\x00\x00@oܠ\x00\x00\x00\x00A\x84\xa9\x90\x00\x00\x00\x00BO\xbe\xa0\x00\x00\x00\x00Cd\x8b\x90\x00\x00" +
-	"\x00\x00D/\xa0\xa0\x00\x00\x00\x00EDm\x90\x00\x00\x00\x00F\x0f\x82\xa0\x00\x00\x00\x00G$O\x90\x00\x00\x00\x00G\xf8\x9f \x00\x00\x00\x00I\x041\x90\x00\x00\x00\x00I\u0601 \x00\x00\x00\x00J\xe4" +
-	"\x13\x90\x00\x00\x00\x00K\x9c\xb3\xa0\x01\x02\x01\x02\x03\x02\x04\x05\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03" +
-	"\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\xff\xff\x92L\x00\x00\xff\xff\x9d\x90\x00\x04\xff\xff\x8f\x80" +
-	"\x00\b\xff\xff\x9d\x90\x01\f\xff\xff\x9d\x90\x01\x10\xff\xff\x9d\x90\x01\x14LMT\x00MST\x00PST\x00PDT\x00PWT\x00PPT\x00\nPST8PDT,M3.2.0," +
-	"M11.1.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00ӿ\x92\xbc\xb5\x06\x00\x00\xb5\x06\x00\x00\x0f\x00\x00\x00America/TorontoTZif2\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xac\x00\x00\x00\x05\x00\x00\x00\x14\xff\xff\xff\xffr\xeex\xec\xff\xff\xff\xff\x9e\xb8\x93p\xff\xff\xff\xff\x9f\xba\xeb`\xff\xff\xff\xff\xa0\x87.\xc8" +
-	"\xff\xff\xff\xff\xa1\x9a\xb1@\xff\xff\xff\xff\xa2\x94\x06\xf0\xff\xff\xff\xff\xa3U\xa9@\xff\xff\xff\xff\xa4\x86]\xf0\xff\xff\xff\xff\xa5(x`\xff\xff\xff\xff\xa6f?\xf0\xff\xff\xff\xff\xa7\fN\xe0\xff\xff\xff\xff" +
-	"\xa8F!\xf0\xff\xff\xff\xff\xa8\xec0\xe0\xff\xff\xff\xff\xaa\x1c\xc9p\xff\xff\xff\xff\xaa\xd5M`\xff\xff\xff\xff\xab\xfc\xabp\xff\xff\xff\xff\xac\xb5/`\xff\xff\xff\xff\xad܍p\xff\xff\xff\xff\xae\x95\x11`" +
-	"\xff\xff\xff\xff\xaf\xbcop\xff\xff\xff\xff\xb0~-\xe0\xff\xff\xff\xff\xb1\x9cQp\xff\xff\xff\xff\xb2gJ`\xff\xff\xff\xff\xb3|3p\xff\xff\xff\xff\xb4G,`\xff\xff\xff\xff\xb5\\\x15p\xff\xff\xff\xff" +
-	"\xb6'\x0e`\xff\xff\xff\xff\xb7;\xf7p\xff\xff\xff\xff\xb8\x06\xf0`\xff\xff\xff\xff\xb9%\x13\xf0\xff\xff\xff\xff\xb9\xe6\xd2`\xff\xff\xff\xff\xbb\x04\xf5\xf0\xff\xff\xff\xff\xbb\xcf\xee\xe0\xff\xff\xff\xff\xbc\xe4\xd7\xf0" +
-	"\xff\xff\xff\xff\xbd\xaf\xd0\xe0\xff\xff\xff\xff\xbeĹ\xf0\xff\xff\xff\xff\xbf\x8f\xb2\xe0\xff\xff\xff\xff\xc0\xa4\x9b\xf0\xff\xff\xff\xff\xc1o\x94\xe0\xff\xff\xff\xff\u0084}\xf0\xff\xff\xff\xff\xc3Ov\xe0\xff\xff\xff\xff" +
-	"\xc4d_\xf0\xff\xff\xff\xff\xc5/X\xe0\xff\xff\xff\xff\xc6M|p\xff\xff\xff\xff\xc7\x0f:\xe0\xff\xff\xff\xff\xc8-^p\xff\xff\xff\xffˈ\xf0p\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2`\xfb\xe0" +
-	"\xff\xff\xff\xff\xd3u\xe4\xf0\xff\xff\xff\xff\xd4@\xdd\xe0\xff\xff\xff\xff\xd5U\xaa\xd0\xff\xff\xff\xff\xd6 \xa3\xc0\xff\xff\xff\xff\xd75\x8c\xd0\xff\xff\xff\xff\xd8\x00\x85\xc0\xff\xff\xff\xff\xd9\x15n\xd0\xff\xff\xff\xff" +
-	"\xda3v@\xff\xff\xff\xff\xda\xfe\xa7p\xff\xff\xff\xff\xdc\x13t`\xff\xff\xff\xff\xdcމp\xff\xff\xff\xffݩ\x82`\xff\xff\xff\xff\u07bekp\xff\xff\xff\xff߉d`\xff\xff\xff\xff\xe0\x9eMp" +
-	"\xff\xff\xff\xff\xe1iF`\xff\xff\xff\xff\xe2~/p\xff\xff\xff\xff\xe3I(`\xff\xff\xff\xff\xe4^\x11p\xff\xff\xff\xff\xe5)\n`\xff\xff\xff\xff\xe6G-\xf0\xff\xff\xff\xff\xe7\x12&\xe0\xff\xff\xff\xff" +
-	"\xe8'\x0f\xf0\xff\xff\xff\xff\xe9\x16\xf2\xe0\xff\xff\xff\xff\xea\x06\xf1\xf0\xff\xff\xff\xff\xea\xf6\xd4\xe0\xff\xff\xff\xff\xeb\xe6\xd3\xf0\xff\xff\xff\xff\xecֶ\xe0\xff\xff\xff\xff\xedƵ\xf0\xff\xff\xff\xff\xee\xbf\xd3`" +
-	"\xff\xff\xff\xff\xef\xaf\xd2p\xff\xff\xff\xff\xf0\x9f\xb5`\xff\xff\xff\xff\xf1\x8f\xb4p\xff\xff\xff\xff\xf2\x7f\x97`\xff\xff\xff\xff\xf3o\x96p\xff\xff\xff\xff\xf4_y`\xff\xff\xff\xff\xf5Oxp\xff\xff\xff\xff" +
-	"\xf6?[`\xff\xff\xff\xff\xf7/Zp\xff\xff\xff\xff\xf8(w\xe0\xff\xff\xff\xff\xf9\x0f<p\xff\xff\xff\xff\xfa\bY\xe0\xff\xff\xff\xff\xfa\xf8X\xf0\xff\xff\xff\xff\xfb\xe8;\xe0\xff\xff\xff\xff\xfc\xd8:\xf0" +
-	"\xff\xff\xff\xff\xfd\xc8\x1d\xe0\xff\xff\xff\xff\xfe\xb8\x1c\xf0\xff\xff\xff\xff\xff\xa7\xff\xe0\x00\x00\x00\x00\x00\x97\xfe\xf0\x00\x00\x00\x00\x01\x87\xe1\xe0\x00\x00\x00\x00\x02w\xe0\xf0\x00\x00\x00\x00\x03p\xfe`\x00\x00\x00\x00" +
-	"\x04`\xfdp\x00\x00\x00\x00\x05P\xe0`\x00\x00\x00\x00\x06@\xdfp\x00\x00\x00\x00\a0\xc2`\x00\x00\x00\x00\b \xc1p\x00\x00\x00\x00\t\x10\xa4`\x00\x00\x00\x00\n\x00\xa3p\x00\x00\x00\x00\n\xf0\x86`" +
-	"\x00\x00\x00\x00\v\xe0\x85p\x00\x00\x00\x00\f٢\xe0\x00\x00\x00\x00\r\xc0gp\x00\x00\x00\x00\x0e\xb9\x84\xe0\x00\x00\x00\x00\x0f\xa9\x83\xf0\x00\x00\x00\x00\x10\x99f\xe0\x00\x00\x00\x00\x11\x89e\xf0\x00\x00\x00\x00" +
-	"\x12yH\xe0\x00\x00\x00\x00\x13iG\xf0\x00\x00\x00\x00\x14Y*\xe0\x00\x00\x00\x00\x15I)\xf0\x00\x00\x00\x00\x169\f\xe0\x00\x00\x00\x00\x17)\v\xf0\x00\x00\x00\x00\x18\")`\x00\x00\x00\x00\x19\b\xed\xf0" +
-	"\x00\x00\x00\x00\x1a\x02\v`\x00\x00\x00\x00\x1a\xf2\np\x00\x00\x00\x00\x1b\xe1\xed`\x00\x00\x00\x00\x1c\xd1\xecp\x00\x00\x00\x00\x1d\xc1\xcf`\x00\x00\x00\x00\x1e\xb1\xcep\x00\x00\x00\x00\x1f\xa1\xb1`\x00\x00\x00\x00" +
-	" v\x00\xf0\x00\x00\x00\x00!\x81\x93`\x00\x00\x00\x00\"U\xe2\xf0\x00\x00\x00\x00#j\xaf\xe0\x00\x00\x00\x00$5\xc4\xf0\x00\x00\x00\x00%J\x91\xe0\x00\x00\x00\x00&\x15\xa6\xf0\x00\x00\x00\x00'*s\xe0" +
-	"\x00\x00\x00\x00'\xfe\xc3p\x00\x00\x00\x00)\nU\xe0\x00\x00\x00\x00)ޥp\x00\x00\x00\x00*\xea7\xe0\x00\x00\x00\x00+\xbe\x87p\x00\x00\x00\x00,\xd3T`\x00\x00\x00\x00-\x9eip\x00\x00\x00\x00" +
-	".\xb36`\x00\x00\x00\x00/~Kp\x00\x00\x00\x000\x93\x18`\x00\x00\x00\x001gg\xf0\x00\x00\x00\x002r\xfa`\x00\x00\x00\x003GI\xf0\x00\x00\x00\x004R\xdc`\x00\x00\x00\x005'+\xf0" +
-	"\x00\x00\x00\x0062\xbe`\x00\x00\x00\x007\a\r\xf0\x00\x00\x00\x008\x1b\xda\xe0\x00\x00\x00\x008\xe6\xef\xf0\x00\x00\x00\x009\xfb\xbc\xe0\x00\x00\x00\x00:\xc6\xd1\xf0\x00\x00\x00\x00;۞\xe0\x00\x00\x00\x00" +
-	"<\xaf\xeep\x00\x00\x00\x00=\xbb\x80\xe0\x00\x00\x00\x00>\x8f\xd0p\x00\x00\x00\x00?\x9bb\xe0\x00\x00\x00\x00@o\xb2p\x00\x00\x00\x00A\x84\x7f`\x00\x00\x00\x00BO\x94p\x00\x00\x00\x00Cda`" +
-	"\x00\x00\x00\x00D/vp\x00\x00\x00\x00EDC`\x00\x00\x00\x00E\xf3\xa8\xf0\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x03\x04\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\xff\xff\xb5\x94\x00\x00\xff\xff\xc7\xc0\x01\x04\xff\xff\xb9\xb0\x00\b\xff\xff\xc7\xc0\x01\f\xff\xff\xc7\xc0\x01\x10LMT\x00EDT\x00EST\x00EW" +
-	"T\x00EPT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00q\xc9*;\xb1\x00\x00\x00\xb1\x00\x00\x00\x0f\x00\x00\x00" +
-	"America/TortolaTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00" +
-	"\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x10\xff\xff\xff\xffz敹\xff\xff" +
-	"\xff\xff\xcb\xf62\xc0\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2`\xed\xd0\x01\x03\x02\x01\xff\xff\xc2\a\x00\x00\xff\xff\xc7\xc0\x00\x04\xff\xff\xd5\xd0\x01\b\xff\xff\xd5\xd0\x01\fLMT\x00AST\x00AP" +
-	"T\x00AWT\x00\nAST4\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00U9#\xbe2\x05\x00\x002\x05\x00\x00\x11\x00\x00\x00America/VancouverT" +
-	"Zif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x81\x00\x00\x00\x05\x00\x00\x00\x14\xff\xff\xff\xff^=v\xec\xff\xff\xff\xff\x9e\xb8\xbd\xa0\xff\xff\xff\xff\x9f\xbb\x15\x90\xff\xff" +
-	"\xff\xffˉ\x1a\xa0\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2a&\x10\xff\xff\xff\xff\xd3v\x0f \xff\xff\xff\xff\xd4A\b\x10\xff\xff\xff\xff\xd5U\xf1 \xff\xff\xff\xff\xd6 \xea\x10\xff\xff\xff\xff\xd75" +
-	"\xd3 \xff\xff\xff\xff\xd8\x00\xcc\x10\xff\xff\xff\xff\xd9\x15\xb5 \xff\xff\xff\xff\xd9\xe0\xae\x10\xff\xff\xff\xff\xda\xfeѠ\xff\xff\xff\xff\xdb\xc0\x90\x10\xff\xff\xff\xff\xdc\u07b3\xa0\xff\xff\xff\xffݩ\xac\x90\xff\xff" +
-	"\xff\xff\u07be\x95\xa0\xff\xff\xff\xff߉\x8e\x90\xff\xff\xff\xff\xe0\x9ew\xa0\xff\xff\xff\xff\xe1ip\x90\xff\xff\xff\xff\xe2~Y\xa0\xff\xff\xff\xff\xe3IR\x90\xff\xff\xff\xff\xe4^;\xa0\xff\xff\xff\xff\xe5)" +
-	"4\x90\xff\xff\xff\xff\xe6GX \xff\xff\xff\xff\xe7\x12Q\x10\xff\xff\xff\xff\xe8': \xff\xff\xff\xff\xe8\xf23\x10\xff\xff\xff\xff\xea\a\x1c \xff\xff\xff\xff\xea\xd2\x15\x10\xff\xff\xff\xff\xeb\xe6\xfe \xff\xff" +
-	"\xff\xff\xec\xb1\xf7\x10\xff\xff\xff\xff\xed\xc6\xe0 \xff\xff\xff\xff\xee\x91\xd9\x10\xff\xff\xff\xff\xef\xaf\xfc\xa0\xff\xff\xff\xff\xf0q\xbb\x10\xff\xff\xff\xff\xf1\x8fޠ\xff\xff\xff\xff\xf2\x7f\xc1\x90\xff\xff\xff\xff\xf3o" +
-	"\xc0\xa0\xff\xff\xff\xff\xf4_\xa3\x90\xff\xff\xff\xff\xf5O\xa2\xa0\xff\xff\xff\xff\xf6?\x85\x90\xff\xff\xff\xff\xf7/\x84\xa0\xff\xff\xff\xff\xf8(\xa2\x10\xff\xff\xff\xff\xf9\x0ff\xa0\xff\xff\xff\xff\xfa\b\x84\x10\xff\xff" +
-	"\xff\xff\xfa\xf8\x83 \xff\xff\xff\xff\xfb\xe8f\x10\xff\xff\xff\xff\xfc\xd8e \xff\xff\xff\xff\xfd\xc8H\x10\xff\xff\xff\xff\xfe\xb8G \xff\xff\xff\xff\xff\xa8*\x10\x00\x00\x00\x00\x00\x98) \x00\x00\x00\x00\x01\x88" +
-	"\f\x10\x00\x00\x00\x00\x02x\v \x00\x00\x00\x00\x03q(\x90\x00\x00\x00\x00\x04a'\xa0\x00\x00\x00\x00\x05Q\n\x90\x00\x00\x00\x00\x06A\t\xa0\x00\x00\x00\x00\a0\xec\x90\x00\x00\x00\x00\b \xeb\xa0\x00\x00" +
-	"\x00\x00\t\x10ΐ\x00\x00\x00\x00\n\x00͠\x00\x00\x00\x00\n\xf0\xb0\x90\x00\x00\x00\x00\v\u0be0\x00\x00\x00\x00\f\xd9\xcd\x10\x00\x00\x00\x00\r\xc0\x91\xa0\x00\x00\x00\x00\x0e\xb9\xaf\x10\x00\x00\x00\x00\x0f\xa9" +
-	"\xae \x00\x00\x00\x00\x10\x99\x91\x10\x00\x00\x00\x00\x11\x89\x90 \x00\x00\x00\x00\x12ys\x10\x00\x00\x00\x00\x13ir \x00\x00\x00\x00\x14YU\x10\x00\x00\x00\x00\x15IT \x00\x00\x00\x00\x1697\x10\x00\x00" +
-	"\x00\x00\x17)6 \x00\x00\x00\x00\x18\"S\x90\x00\x00\x00\x00\x19\t\x18 \x00\x00\x00\x00\x1a\x025\x90\x00\x00\x00\x00\x1a\xf24\xa0\x00\x00\x00\x00\x1b\xe2\x17\x90\x00\x00\x00\x00\x1c\xd2\x16\xa0\x00\x00\x00\x00\x1d\xc1" +
-	"\xf9\x90\x00\x00\x00\x00\x1e\xb1\xf8\xa0\x00\x00\x00\x00\x1f\xa1ې\x00\x00\x00\x00 v+ \x00\x00\x00\x00!\x81\xbd\x90\x00\x00\x00\x00\"V\r \x00\x00\x00\x00#j\xda\x10\x00\x00\x00\x00$5\xef \x00\x00" +
-	"\x00\x00%J\xbc\x10\x00\x00\x00\x00&\x15\xd1 \x00\x00\x00\x00'*\x9e\x10\x00\x00\x00\x00'\xfe\xed\xa0\x00\x00\x00\x00)\n\x80\x10\x00\x00\x00\x00)\xdeϠ\x00\x00\x00\x00*\xeab\x10\x00\x00\x00\x00+\xbe" +
-	"\xb1\xa0\x00\x00\x00\x00,\xd3~\x90\x00\x00\x00\x00-\x9e\x93\xa0\x00\x00\x00\x00.\xb3`\x90\x00\x00\x00\x00/~u\xa0\x00\x00\x00\x000\x93B\x90\x00\x00\x00\x001g\x92 \x00\x00\x00\x002s$\x90\x00\x00" +
-	"\x00\x003Gt \x00\x00\x00\x004S\x06\x90\x00\x00\x00\x005'V \x00\x00\x00\x0062\xe8\x90\x00\x00\x00\x007\a8 \x00\x00\x00\x008\x1c\x05\x10\x00\x00\x00\x008\xe7\x1a \x00\x00\x00\x009\xfb" +
-	"\xe7\x10\x00\x00\x00\x00:\xc6\xfc \x00\x00\x00\x00;\xdb\xc9\x10\x00\x00\x00\x00<\xb0\x18\xa0\x00\x00\x00\x00=\xbb\xab\x10\x00\x00\x00\x00>\x8f\xfa\xa0\x00\x00\x00\x00?\x9b\x8d\x10\x00\x00\x00\x00@oܠ\x00\x00" +
-	"\x00\x00A\x84\xa9\x90\x00\x00\x00\x00BO\xbe\xa0\x00\x00\x00\x00Cd\x8b\x90\x00\x00\x00\x00D/\xa0\xa0\x00\x00\x00\x00EDm\x90\x00\x00\x00\x00E\xf3\xd3 \x02\x01\x02\x03\x04\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\xff\xff\x8c\x94\x00" +
-	"\x00\xff\xff\x9d\x90\x01\x04\xff\xff\x8f\x80\x00\b\xff\xff\x9d\x90\x01\f\xff\xff\x9d\x90\x01\x10LMT\x00PDT\x00PST\x00PWT\x00PPT\x00\nPST8PDT,M3.2.0" +
-	",M11.1.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00q\xc9*;\xb1\x00\x00\x00\xb1\x00\x00\x00\x0e\x00\x00\x00America/VirginTZif2\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x10\xff\xff\xff\xffz敹\xff\xff\xff\xff\xcb\xf62\xc0\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2`\xed\xd0" +
-	"\x01\x03\x02\x01\xff\xff\xc2\a\x00\x00\xff\xff\xc7\xc0\x00\x04\xff\xff\xd5\xd0\x01\b\xff\xff\xd5\xd0\x01\fLMT\x00AST\x00APT\x00AWT\x00\nAST4\nPK\x03\x04\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\xbf\x1d\xee\x91\x05\x04\x00\x00\x05\x04\x00\x00\x12\x00\x00\x00America/WhitehorseTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00]\x00\x00\x00\t\x00\x00\x00%\xff\xff\xff\xff}\x86\x8a\x9c\xff\xff\xff\xff\x9e\xb8˰\xff\xff\xff\xff\x9f\xbb#\xa0\xff\xff\xff\xff\xa0\xd0\f\xb0\xff\xff\xff\xff\xa1\xa2Ҁ\xff\xff\xff\xffˉ(" +
-	"\xb0\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2a4 \xff\xff\xff\xff\xf7/v\x90\xff\xff\xff\xff\xf8(\xa2\x10\xff\xff\xff\xff\xf8ń\x90\x00\x00\x00\x00\x13ir \x00\x00\x00\x00\x14YU\x10\x00\x00\x00" +
-	"\x00\x15IT \x00\x00\x00\x00\x1697\x10\x00\x00\x00\x00\x17)6 \x00\x00\x00\x00\x18\"S\x90\x00\x00\x00\x00\x19\t\x18 \x00\x00\x00\x00\x1a\x025\x90\x00\x00\x00\x00\x1a\xf24\xa0\x00\x00\x00\x00\x1b\xe2\x17" +
-	"\x90\x00\x00\x00\x00\x1c\xd2\x16\xa0\x00\x00\x00\x00\x1d\xc1\xf9\x90\x00\x00\x00\x00\x1e\xb1\xf8\xa0\x00\x00\x00\x00\x1f\xa1ې\x00\x00\x00\x00 v+ \x00\x00\x00\x00!\x81\xbd\x90\x00\x00\x00\x00\"V\r \x00\x00\x00" +
-	"\x00#j\xda\x10\x00\x00\x00\x00$5\xef \x00\x00\x00\x00%J\xbc\x10\x00\x00\x00\x00&\x15\xd1 \x00\x00\x00\x00'*\x9e\x10\x00\x00\x00\x00'\xfe\xed\xa0\x00\x00\x00\x00)\n\x80\x10\x00\x00\x00\x00)\xde\xcf" +
-	"\xa0\x00\x00\x00\x00*\xeab\x10\x00\x00\x00\x00+\xbe\xb1\xa0\x00\x00\x00\x00,\xd3~\x90\x00\x00\x00\x00-\x9e\x93\xa0\x00\x00\x00\x00.\xb3`\x90\x00\x00\x00\x00/~u\xa0\x00\x00\x00\x000\x93B\x90\x00\x00\x00" +
-	"\x001g\x92 \x00\x00\x00\x002s$\x90\x00\x00\x00\x003Gt \x00\x00\x00\x004S\x06\x90\x00\x00\x00\x005'V \x00\x00\x00\x0062\xe8\x90\x00\x00\x00\x007\a8 \x00\x00\x00\x008\x1c\x05" +
-	"\x10\x00\x00\x00\x008\xe7\x1a \x00\x00\x00\x009\xfb\xe7\x10\x00\x00\x00\x00:\xc6\xfc \x00\x00\x00\x00;\xdb\xc9\x10\x00\x00\x00\x00<\xb0\x18\xa0\x00\x00\x00\x00=\xbb\xab\x10\x00\x00\x00\x00>\x8f\xfa\xa0\x00\x00\x00" +
-	"\x00?\x9b\x8d\x10\x00\x00\x00\x00@oܠ\x00\x00\x00\x00A\x84\xa9\x90\x00\x00\x00\x00BO\xbe\xa0\x00\x00\x00\x00Cd\x8b\x90\x00\x00\x00\x00D/\xa0\xa0\x00\x00\x00\x00EDm\x90\x00\x00\x00\x00E\xf3\xd3" +
-	" \x00\x00\x00\x00G-\x8a\x10\x00\x00\x00\x00Gӵ \x00\x00\x00\x00I\rl\x10\x00\x00\x00\x00I\xb3\x97 \x00\x00\x00\x00J\xedN\x10\x00\x00\x00\x00K\x9c\xb3\xa0\x00\x00\x00\x00L\xd6j\x90\x00\x00\x00" +
-	"\x00M|\x95\xa0\x00\x00\x00\x00N\xb6L\x90\x00\x00\x00\x00O\\w\xa0\x00\x00\x00\x00P\x96.\x90\x00\x00\x00\x00Q<Y\xa0\x00\x00\x00\x00Rv\x10\x90\x00\x00\x00\x00S\x1c;\xa0\x00\x00\x00\x00TU\xf2" +
-	"\x90\x00\x00\x00\x00T\xfc\x1d\xa0\x00\x00\x00\x00V5Ԑ\x00\x00\x00\x00V\xe5: \x00\x00\x00\x00X\x1e\xf1\x10\x00\x00\x00\x00X\xc5\x1c \x00\x00\x00\x00Y\xfe\xd3\x10\x00\x00\x00\x00Z\xa4\xfe \x00\x00\x00" +
-	"\x00[\u07b5\x10\x00\x00\x00\x00\\\x84\xe0 \x00\x00\x00\x00]\xbe\x97\x10\x00\x00\x00\x00^d\xc2 \x00\x00\x00\x00_\x9e\\\xf0\x02\x01\x02\x01\x02\x03\x04\x02\x05\x02\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06" +
-	"\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06" +
-	"\a\x06\a\x06\a\x06\a\x06\a\b\xff\xff\x81d\x00\x00\xff\xff\x8f\x80\x01\x04\xff\xff\x81p\x00\b\xff\xff\x8f\x80\x01\f\xff\xff\x8f\x80\x01\x10\xff\xff\x9d\x90\x01\x14\xff\xff\x8f\x80\x00\x19\xff\xff\x9d\x90\x01\x1d\xff\xff" +
-	"\x9d\x90\x00!LMT\x00YDT\x00YST\x00YWT\x00YPT\x00YDDT\x00PST\x00PDT\x00MST\x00\nMST7\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00?_p\x99\x0e\x05\x00\x00\x0e\x05\x00\x00\x10\x00\x00\x00America/WinnipegTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00}" +
-	"\x00\x00\x00\x05\x00\x00\x00\x14\xff\xff\xff\xffd䰔\xff\xff\xff\xff\x9b\x01\xfb\xe0\xff\xff\xff\xff\x9búP\xff\xff\xff\xff\x9e\xb8\xa1\x80\xff\xff\xff\xff\x9f\xba\xf9p\xff\xff\xff\xff\u00a0;\x80\xff\xff\xff\xff" +
-	"\xc3O\x84\xf0\xff\xff\xff\xffˈ\xfe\x80\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2a\t\xf0\xff\xff\xff\xffӈh\x00\xff\xff\xff\xff\xd4S`\xf0\xff\xff\xff\xff\xd5U\xd5\x00\xff\xff\xff\xff\xd6 \xcd\xf0" +
-	"\xff\xff\xff\xff\xd75\xb7\x00\xff\xff\xff\xff\xd8\x00\xaf\xf0\xff\xff\xff\xff\xd9\x15\x99\x00\xff\xff\xff\xff\xd9\xe0\x91\xf0\xff\xff\xff\xff\xdb\x00\a\x00\xff\xff\xff\xff\xdb\xc8\\\xf0\xff\xff\xff\xff\xdcޗ\x80\xff\xff\xff\xff" +
-	"ݩ\x90p\xff\xff\xff\xff\u07bey\x80\xff\xff\xff\xff߉rp\xff\xff\xff\xff\xe0\x9e[\x80\xff\xff\xff\xff\xe1iTp\xff\xff\xff\xff\xe2~=\x80\xff\xff\xff\xff\xe3I6p\xff\xff\xff\xff\xe4^\x1f\x80" +
-	"\xff\xff\xff\xff\xe5)\x18p\xff\xff\xff\xff\xe6G<\x00\xff\xff\xff\xff\xe7\x124\xf0\xff\xff\xff\xff\xe8'\x1e\x00\xff\xff\xff\xff\xe8\xf2\x16\xf0\xff\xff\xff\xff\xea\a\x00\x00\xff\xff\xff\xff\xea\xd1\xf8\xf0\xff\xff\xff\xff" +
-	"\xeb\xe6\xe2\x00\xff\xff\xff\xff\xec\xd6\xc4\xf0\xff\xff\xff\xff\xed\xc6\xc4\x00\xff\xff\xff\xff\ue47c\xf0\xff\xff\xff\xff\xf3o\xa4\x80\xff\xff\xff\xff\xf41b\xf0\xff\xff\xff\xff\xf9\x0fJ\x80\xff\xff\xff\xff\xfa\bv\x00" +
-	"\xff\xff\xff\xff\xfa\xf8g\x00\xff\xff\xff\xff\xfb\xe8X\x00\xff\xff\xff\xff\xfc\xd8I\x00\xff\xff\xff\xff\xfd\xc8:\x00\xff\xff\xff\xff\xfe\xb8+\x00\xff\xff\xff\xff\xff\xa8\x1c\x00\x00\x00\x00\x00\x00\x98\r\x00\x00\x00\x00\x00" +
-	"\x01\x87\xfe\x00\x00\x00\x00\x00\x02w\xef\x00\x00\x00\x00\x00\x03q\x1a\x80\x00\x00\x00\x00\x04a\v\x80\x00\x00\x00\x00\x05P\xfc\x80\x00\x00\x00\x00\x06@\xed\x80\x00\x00\x00\x00\a0ހ\x00\x00\x00\x00\b π" +
-	"\x00\x00\x00\x00\t\x10\xc0\x80\x00\x00\x00\x00\n\x00\xb1\x80\x00\x00\x00\x00\n\xf0\xa2\x80\x00\x00\x00\x00\v\xe0\x93\x80\x00\x00\x00\x00\fٿ\x00\x00\x00\x00\x00\r\xc0u\x80\x00\x00\x00\x00\x0e\xb9\xa1\x00\x00\x00\x00\x00" +
-	"\x0f\xa9\x92\x00\x00\x00\x00\x00\x10\x99\x83\x00\x00\x00\x00\x00\x11\x89t\x00\x00\x00\x00\x00\x12ye\x00\x00\x00\x00\x00\x13iV\x00\x00\x00\x00\x00\x14YG\x00\x00\x00\x00\x00\x15I8\x00\x00\x00\x00\x00\x169)\x00" +
-	"\x00\x00\x00\x00\x17)\x1a\x00\x00\x00\x00\x00\x18\"E\x80\x00\x00\x00\x00\x19\b\xfc\x00\x00\x00\x00\x00\x1a\x02'\x80\x00\x00\x00\x00\x1a\xf2\x18\x80\x00\x00\x00\x00\x1b\xe2\t\x80\x00\x00\x00\x00\x1c\xd1\xfa\x80\x00\x00\x00\x00" +
-	"\x1d\xc1\xeb\x80\x00\x00\x00\x00\x1e\xb1܀\x00\x00\x00\x00\x1f\xa1̀\x00\x00\x00\x00 v\x0f\x00\x00\x00\x00\x00!\x81\xaf\x80\x00\x00\x00\x00\"U\xf1\x00\x00\x00\x00\x00#j\xcc\x00\x00\x00\x00\x00$5\xd3\x00" +
-	"\x00\x00\x00\x00%J\xae\x00\x00\x00\x00\x00&\x15\xb5\x00\x00\x00\x00\x00'*\x90\x00\x00\x00\x00\x00'\xfeр\x00\x00\x00\x00)\nr\x00\x00\x00\x00\x00)\u07b3\x80\x00\x00\x00\x00*\xeaT\x00\x00\x00\x00\x00" +
-	"+\xbe\x95\x80\x00\x00\x00\x00,\xd3p\x80\x00\x00\x00\x00-\x9ew\x80\x00\x00\x00\x00.\xb3R\x80\x00\x00\x00\x00/~Y\x80\x00\x00\x00\x000\x934\x80\x00\x00\x00\x001gv\x00\x00\x00\x00\x002s\x16\x80" +
-	"\x00\x00\x00\x003GX\x00\x00\x00\x00\x004R\xf8\x80\x00\x00\x00\x005':\x00\x00\x00\x00\x0062ڀ\x00\x00\x00\x007\a\x1c\x00\x00\x00\x00\x008\x1b\xf7\x00\x00\x00\x00\x008\xe6\xfe\x00\x00\x00\x00\x00" +
-	"9\xfb\xd9\x00\x00\x00\x00\x00:\xc6\xe0\x00\x00\x00\x00\x00;ۻ\x00\x00\x00\x00\x00<\xaf\xfc\x80\x00\x00\x00\x00=\xbb\x9d\x00\x00\x00\x00\x00>\x8fހ\x00\x00\x00\x00?\x9b\x7f\x00\x00\x00\x00\x00@o\xc0\x80" +
-	"\x00\x00\x00\x00A\x84\x9b\x80\x00\x00\x00\x00BO\xa2\x80\x00\x00\x00\x00Cd}\x80\x00\x00\x00\x00D/\x84\x80\x00\x00\x00\x00EDQp\x00\x00\x00\x00E\xf3\xb7\x00\x02\x01\x02\x01\x02\x01\x02\x03\x04\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\xff\xff\xa4\xec\x00\x00\xff" +
-	"\xff\xb9\xb0\x01\x04\xff\xff\xab\xa0\x00\b\xff\xff\xb9\xb0\x01\f\xff\xff\xb9\xb0\x01\x10LMT\x00CDT\x00CST\x00CWT\x00CPT\x00\nCST6CDT,M3.2.0,M" +
-	"11.1.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00,\xdb~\xab\xb2\x03\x00\x00\xb2\x03\x00\x00\x0f\x00\x00\x00America/YakutatTZif2\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00S\x00\x00\x00\b\x00\x00\x00\x1e\xff\xff\xff\xff?\xc2\xfd\xd1\xff\xff\xff\xff}\x877\xbf\xff\xff\xff\xffˉ(\xb0\xff\xff\xff\xff\xd2#\xf4p\xff" +
-	"\xff\xff\xff\xd2a4 \xff\xff\xff\xff\xfe\xb8U0\xff\xff\xff\xff\xff\xa88 \x00\x00\x00\x00\x00\x9870\x00\x00\x00\x00\x01\x88\x1a \x00\x00\x00\x00\x02x\x190\x00\x00\x00\x00\x03q6\xa0\x00\x00\x00\x00\x04" +
-	"a5\xb0\x00\x00\x00\x00\x05Q\x18\xa0\x00\x00\x00\x00\x06A\x17\xb0\x00\x00\x00\x00\a0\xfa\xa0\x00\x00\x00\x00\a\x8dQ\xb0\x00\x00\x00\x00\t\x10ܠ\x00\x00\x00\x00\t\xad\xcd0\x00\x00\x00\x00\n\xf0\xbe\xa0\x00" +
-	"\x00\x00\x00\v\u0f70\x00\x00\x00\x00\f\xd9\xdb \x00\x00\x00\x00\r\xc0\x9f\xb0\x00\x00\x00\x00\x0e\xb9\xbd \x00\x00\x00\x00\x0f\xa9\xbc0\x00\x00\x00\x00\x10\x99\x9f \x00\x00\x00\x00\x11\x89\x9e0\x00\x00\x00\x00\x12" +
-	"y\x81 \x00\x00\x00\x00\x13i\x800\x00\x00\x00\x00\x14Yc \x00\x00\x00\x00\x15Ib0\x00\x00\x00\x00\x169E \x00\x00\x00\x00\x17)D0\x00\x00\x00\x00\x18\"a\xa0\x00\x00\x00\x00\x19\t&0\x00" +
-	"\x00\x00\x00\x1a\x02C\xa0\x00\x00\x00\x00\x1a+\x14\x10\x00\x00\x00\x00\x1a\xf2B\xb0\x00\x00\x00\x00\x1b\xe2%\xa0\x00\x00\x00\x00\x1c\xd2$\xb0\x00\x00\x00\x00\x1d\xc2\a\xa0\x00\x00\x00\x00\x1e\xb2\x06\xb0\x00\x00\x00\x00\x1f" +
-	"\xa1\xe9\xa0\x00\x00\x00\x00 v90\x00\x00\x00\x00!\x81ˠ\x00\x00\x00\x00\"V\x1b0\x00\x00\x00\x00#j\xe8 \x00\x00\x00\x00$5\xfd0\x00\x00\x00\x00%J\xca \x00\x00\x00\x00&\x15\xdf0\x00" +
-	"\x00\x00\x00'*\xac \x00\x00\x00\x00'\xfe\xfb\xb0\x00\x00\x00\x00)\n\x8e \x00\x00\x00\x00)\xdeݰ\x00\x00\x00\x00*\xeap \x00\x00\x00\x00+\xbe\xbf\xb0\x00\x00\x00\x00,ӌ\xa0\x00\x00\x00\x00-" +
-	"\x9e\xa1\xb0\x00\x00\x00\x00.\xb3n\xa0\x00\x00\x00\x00/~\x83\xb0\x00\x00\x00\x000\x93P\xa0\x00\x00\x00\x001g\xa00\x00\x00\x00\x002s2\xa0\x00\x00\x00\x003G\x820\x00\x00\x00\x004S\x14\xa0\x00" +
-	"\x00\x00\x005'd0\x00\x00\x00\x0062\xf6\xa0\x00\x00\x00\x007\aF0\x00\x00\x00\x008\x1c\x13 \x00\x00\x00\x008\xe7(0\x00\x00\x00\x009\xfb\xf5 \x00\x00\x00\x00:\xc7\n0\x00\x00\x00\x00;" +
-	"\xdb\xd7 \x00\x00\x00\x00<\xb0&\xb0\x00\x00\x00\x00=\xbb\xb9 \x00\x00\x00\x00>\x90\b\xb0\x00\x00\x00\x00?\x9b\x9b \x00\x00\x00\x00@o\xea\xb0\x00\x00\x00\x00A\x84\xb7\xa0\x00\x00\x00\x00BO̰\x00" +
-	"\x00\x00\x00Cd\x99\xa0\x00\x00\x00\x00D/\xae\xb0\x00\x00\x00\x00ED{\xa0\x00\x00\x00\x00E\xf3\xe10\x01\x02\x03\x04\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02" +
-	"\x05\x02\x05\x02\x05\x02\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\x00\x00\u0381\x00\x00" +
-	"\xff\xff}\x01\x00\x00\xff\xff\x81p\x00\x04\xff\xff\x8f\x80\x01\b\xff\xff\x8f\x80\x01\f\xff\xff\x8f\x80\x01\x10\xff\xff\x8f\x80\x01\x14\xff\xff\x81p\x00\x19LMT\x00YST\x00YWT\x00YPT\x00YD" +
-	"T\x00AKDT\x00AKST\x00\nAKST9AKDT,M3.2.0,M11.1.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/5\xe20L\x03\x00\x00" +
-	"L\x03\x00\x00\x13\x00\x00\x00America/YellowknifeTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00K\x00\x00\x00\x05\x00\x00" +
-	"\x00\x14\xff\xff\xff\xff\xbe*\x18\x00\xff\xff\xff\xffˉ\f\x90\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2a\x18\x00\x00\x00\x00\x00\x04a\x19\x90\x00\x00\x00\x00\x05P\xfc\x80\x00\x00\x00\x00\x06@\xfb\x90\x00\x00" +
-	"\x00\x00\a0ހ\x00\x00\x00\x00\b ݐ\x00\x00\x00\x00\t\x10\xc0\x80\x00\x00\x00\x00\n\x00\xbf\x90\x00\x00\x00\x00\n\xf0\xa2\x80\x00\x00\x00\x00\vࡐ\x00\x00\x00\x00\fٿ\x00\x00\x00\x00\x00\r\xc0" +
-	"\x83\x90\x00\x00\x00\x00\x0e\xb9\xa1\x00\x00\x00\x00\x00\x0f\xa9\xa0\x10\x00\x00\x00\x00\x10\x99\x83\x00\x00\x00\x00\x00\x11\x89\x82\x10\x00\x00\x00\x00\x12ye\x00\x00\x00\x00\x00\x13id\x10\x00\x00\x00\x00\x14YG\x00\x00\x00" +
-	"\x00\x00\x15IF\x10\x00\x00\x00\x00\x169)\x00\x00\x00\x00\x00\x17)(\x10\x00\x00\x00\x00\x18\"E\x80\x00\x00\x00\x00\x19\t\n\x10\x00\x00\x00\x00\x1a\x02'\x80\x00\x00\x00\x00\x1a\xf2&\x90\x00\x00\x00\x00\x1b\xe2" +
-	"\t\x80\x00\x00\x00\x00\x1c\xd2\b\x90\x00\x00\x00\x00\x1d\xc1\xeb\x80\x00\x00\x00\x00\x1e\xb1\xea\x90\x00\x00\x00\x00\x1f\xa1̀\x00\x00\x00\x00 v\x1d\x10\x00\x00\x00\x00!\x81\xaf\x80\x00\x00\x00\x00\"U\xff\x10\x00\x00" +
-	"\x00\x00#j\xcc\x00\x00\x00\x00\x00$5\xe1\x10\x00\x00\x00\x00%J\xae\x00\x00\x00\x00\x00&\x15\xc3\x10\x00\x00\x00\x00'*\x90\x00\x00\x00\x00\x00'\xfeߐ\x00\x00\x00\x00)\nr\x00\x00\x00\x00\x00)\xde" +
-	"\xc1\x90\x00\x00\x00\x00*\xeaT\x00\x00\x00\x00\x00+\xbe\xa3\x90\x00\x00\x00\x00,\xd3p\x80\x00\x00\x00\x00-\x9e\x85\x90\x00\x00\x00\x00.\xb3R\x80\x00\x00\x00\x00/~g\x90\x00\x00\x00\x000\x934\x80\x00\x00" +
-	"\x00\x001g\x84\x10\x00\x00\x00\x002s\x16\x80\x00\x00\x00\x003Gf\x10\x00\x00\x00\x004R\xf8\x80\x00\x00\x00\x005'H\x10\x00\x00\x00\x0062ڀ\x00\x00\x00\x007\a*\x10\x00\x00\x00\x008\x1b" +
-	"\xf7\x00\x00\x00\x00\x008\xe7\f\x10\x00\x00\x00\x009\xfb\xd9\x00\x00\x00\x00\x00:\xc6\xee\x10\x00\x00\x00\x00;ۻ\x00\x00\x00\x00\x00<\xb0\n\x90\x00\x00\x00\x00=\xbb\x9d\x00\x00\x00\x00\x00>\x8f\xec\x90\x00\x00" +
-	"\x00\x00?\x9b\x7f\x00\x00\x00\x00\x00@oΐ\x00\x00\x00\x00A\x84\x9b\x80\x00\x00\x00\x00BO\xb0\x90\x00\x00\x00\x00Cd}\x80\x00\x00\x00\x00D/\x92\x90\x00\x00\x00\x00ED_\x80\x00\x00\x00\x00E\xf3" +
-	"\xc5\x10\x03\x01\x02\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03" +
-	"\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x00\x00\x00\x00\x00\x00\xff\xff\xab\xa0\x01\x04\xff\xff\xab\xa0\x01\b\xff\xff\x9d\x90\x00\f\xff\xff\xab\xa0\x01\x10-00\x00MWT\x00MPT\x00M" +
-	"ST\x00MDT\x00\nMST7MDT,M3.2.0,M11.1.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xddzAh\xf3\x00\x00\x00\xf3\x00\x00\x00\x10\x00\x00" +
-	"\x00Antarctica/CaseyTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" +
-	"\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\f\x00\x00\x00\x03\x00\x00\x00\f\xff\xff\xff\xff\xfe\x1è" +
-	"\x00\x00\x00\x00J\xda\x06 \x00\x00\x00\x00K\x8f\xca\xf0\x00\x00\x00\x00N\xa9\x9c \x00\x00\x00\x00OC͐\x00\x00\x00\x00X\n;\x80\x00\x00\x00\x00Z\xa4\x0f\x10\x00\x00\x00\x00[\xb9\x14@\x00\x00\x00\x00" +
-	"\\\x8d\x1d\x80\x00\x00\x00\x00]\x96E0\x00\x00\x00\x00^c\xc5\x00\x00\x00\x00\x00_x\xa0<\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00p\x80\x00\x04\x00\x00\x9a\xb0\x00\b-0" +
-	"0\x00+08\x00+11\x00\n<+11>-11\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x95\xea\x06\xd3\xc5\x00\x00\x00\xc5\x00\x00\x00\x10\x00\x00\x00Antarctica" +
-	"/DavisTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZi" +
-	"f2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\x00\x00\x00\x03\x00\x00\x00\f\xff\xff\xff\xff\xe7\x9c@\x00\xff\xff\xff\xff\xf6G\xdf\x10\xff\xff\xff" +
-	"\xff\xfeG\xab\x00\x00\x00\x00\x00J\xda\x140\x00\x00\x00\x00K\x97\xfa@\x00\x00\x00\x00N\xa9\xaa0\x00\x00\x00\x00OC\xf7\xc0\x01\x00\x01\x02\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00bp\x00\x04\x00\x00FP" +
-	"\x00\b-00\x00+07\x00+05\x00\n<+07>-7\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00n\x04\x19y\x9a\x00\x00\x00\x9a\x00\x00\x00\x19\x00\x00\x00Antarct" +
-	"ica/DumontDUrvilleTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" +
-	"\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\r\xff\xff\xff\xffV\xb6Z" +
-	"\b\xff\xff\xff\xffr\xed\xa4\x90\x01\x02\x00\x00\x89\xf8\x00\x00\x00\x00\x89\xf0\x00\x04\x00\x00\x8c\xa0\x00\tLMT\x00PMMT\x00+10\x00\n<+10>-10\nPK\x03\x04\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\xb2\x84J]\xd0\x03\x00\x00\xd0\x03\x00\x00\x14\x00\x00\x00Antarctica/MacquarieTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00[\x00\x00\x00\x03\x00\x00\x00\x0e\xff\xff\xff\xff|\x05\x16\x00\xff\xff\xff\xff\x9b\xd5x\x80\xff\xff\xff\xff\x9c\xbc/\x00\xff\xff\xff\xff\xa0\x87\xb4`\xff\xff\xff\xff\xd7\fh\x00\xff\xff\xff" +
-	"\xff\xfb\u008d\x00\xff\xff\xff\xff\xfc\xb2~\x00\xff\xff\xff\xff\xfd\xc7Y\x00\xff\xff\xff\xff\xfev\xb0\x80\xff\xff\xff\xff\xff\xa7;\x00\x00\x00\x00\x00\x00V\x92\x80\x00\x00\x00\x00\x01\x87\x1d\x00\x00\x00\x00\x00\x02?\xaf" +
-	"\x00\x00\x00\x00\x00\x03p9\x80\x00\x00\x00\x00\x04\r\x1c\x00\x00\x00\x00\x00\x05P\x1b\x80\x00\x00\x00\x00\x05\xf68\x80\x00\x00\x00\x00\a/\xfd\x80\x00\x00\x00\x00\a\xd6\x1a\x80\x00\x00\x00\x00\t\x0f߀\x00\x00\x00" +
-	"\x00\t\xb5\xfc\x80\x00\x00\x00\x00\n\xef\xc1\x80\x00\x00\x00\x00\v\x9f\x19\x00\x00\x00\x00\x00\f\xd8\xde\x00\x00\x00\x00\x00\r~\xfb\x00\x00\x00\x00\x00\x0e\xb8\xc0\x00\x00\x00\x00\x00\x0f^\xdd\x00\x00\x00\x00\x00\x10\x98\xa2" +
-	"\x00\x00\x00\x00\x00\x11>\xbf\x00\x00\x00\x00\x00\x12x\x84\x00\x00\x00\x00\x00\x13\x1e\xa1\x00\x00\x00\x00\x00\x14Xf\x00\x00\x00\x00\x00\x14\xfe\x83\x00\x00\x00\x00\x00\x168H\x00\x00\x00\x00\x00\x17\x03O\x00\x00\x00\x00" +
-	"\x00\x18!d\x80\x00\x00\x00\x00\x18\xe31\x00\x00\x00\x00\x00\x1a\x01F\x80\x00\x00\x00\x00\x1a\xa7c\x80\x00\x00\x00\x00\x1b\xe1(\x80\x00\x00\x00\x00\x1c\x87E\x80\x00\x00\x00\x00\x1d\xc1\n\x80\x00\x00\x00\x00\x1eg'" +
-	"\x80\x00\x00\x00\x00\x1f\x97\xb2\x00\x00\x00\x00\x00 Y~\x80\x00\x00\x00\x00!\x80\u0380\x00\x00\x00\x00\"B\x9b\x00\x00\x00\x00\x00#i\xeb\x00\x00\x00\x00\x00$\"}\x00\x00\x00\x00\x00%I\xcd\x00\x00\x00\x00" +
-	"\x00&\x02_\x00\x00\x00\x00\x00')\xaf\x00\x00\x00\x00\x00'\xf4\xb6\x00\x00\x00\x00\x00(\xed\xe1\x80\x00\x00\x00\x00)Ԙ\x00\x00\x00\x00\x00*\xcdÀ\x00\x00\x00\x00+\xb4z\x00\x00\x00\x00\x00,\xad\xa5" +
-	"\x80\x00\x00\x00\x00-\x94\\\x00\x00\x00\x00\x00.\x8d\x87\x80\x00\x00\x00\x00/t>\x00\x00\x00\x00\x000mi\x80\x00\x00\x00\x001]Z\x80\x00\x00\x00\x002V\x86\x00\x00\x00\x00\x003=<\x80\x00\x00\x00" +
-	"\x0046h\x00\x00\x00\x00\x005\x1d\x1e\x80\x00\x00\x00\x006\x16J\x00\x00\x00\x00\x006\xfd\x00\x80\x00\x00\x00\x007\xf6,\x00\x00\x00\x00\x008\xdc\xe2\x80\x00\x00\x00\x009\xa7\xe9\x80\x00\x00\x00\x00:\xbc\xc4" +
-	"\x80\x00\x00\x00\x00;\xbf*\x80\x00\x00\x00\x00<\xa5\xe1\x00\x00\x00\x00\x00=\x9f\f\x80\x00\x00\x00\x00>\x85\xc3\x00\x00\x00\x00\x00?~\xee\x80\x00\x00\x00\x00@e\xa5\x00\x00\x00\x00\x00A^Ѐ\x00\x00\x00" +
-	"\x00BE\x87\x00\x00\x00\x00\x00C>\xb2\x80\x00\x00\x00\x00D.\xa3\x80\x00\x00\x00\x00E\x1e\x94\x80\x00\x00\x00\x00F\x05K\x00\x00\x00\x00\x00G\a\xb1\x00\x00\x00\x00\x00G\xf7\xa2\x00\x00\x00\x00\x00H\xe7\x93" +
-	"\x00\x00\x00\x00\x00Iׄ\x00\x00\x00\x00\x00J\xc7u\x00\x00\x00\x00\x00M\x97H\x00\x01\x02\x01\x00\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x8c\xa0\x00\x04\x00\x00\x9a\xb0\x01\t-00\x00AEST\x00AEDT\x00\nAEST-10AEDT,M10.1.0,M4.1.0/3\nPK" +
-	"\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd7N\xab\x8b\x98\x00\x00\x00\x98\x00\x00\x00\x11\x00\x00\x00Antarctica/MawsonTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\f\xff\xff\xff\xff\xe2 2\x80\x00\x00\x00\x00J\xda\"@\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00T`\x00\x04\x00\x00FP\x00\b-00\x00" +
-	"+06\x00+05\x00\n<+05>-5\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00b\xb2\xaf\xf7\x13\x04\x00\x00\x13\x04\x00\x00\x12\x00\x00\x00Antarctica/Mc" +
-	"MurdoTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif" +
-	"2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00`\x00\x00\x00\x06\x00\x00\x00\x13\xff\xff\xff\xffA\xb7L\xa8\xff\xff\xff\xff\xb0\xb4\xb2\xe8\xff\xff\xff\xff" +
-	"\xb1Q\x87X\xff\xff\xff\xff\xb2x\xe5h\xff\xff\xff\xff\xb3C\xe5`\xff\xff\xff\xff\xb4X\xc7h\xff\xff\xff\xff\xb5#\xc7`\xff\xff\xff\xff\xb68\xa9h\xff\xff\xff\xff\xb7\x03\xa9`\xff\xff\xff\xff\xb8\x18\x8bh" +
-	"\xff\xff\xff\xff\xb8\xec\xc5\xe0\xff\xff\xff\xff\xb9\xf8mh\xff\xff\xff\xff\xba̧\xe0\xff\xff\xff\xff\xbb\xd8Oh\xff\xff\xff\xff\xbc\xe3\xe8\xe0\xff\xff\xff\xff\xbd\xae\xf6\xe8\xff\xff\xff\xff\xbe\xc3\xca\xe0\xff\xff\xff\xff" +
-	"\xbf\x8e\xd8\xe8\xff\xff\xff\xff\xc0\xa3\xac\xe0\xff\xff\xff\xff\xc1n\xba\xe8\xff\xff\xff\xff\u0083\x8e\xe0\xff\xff\xff\xff\xc3N\x9c\xe8\xff\xff\xff\xff\xc4cp\xe0\xff\xff\xff\xff\xc5.~\xe8\xff\xff\xff\xff\xc6L\x8d`" +
-	"\xff\xff\xff\xff\xc7\x0e`\xe8\xff\xff\xff\xff\xc8,o`\xff\xff\xff\xff\xc8\xf7}h\xff\xff\xff\xff\xd2ښ@\x00\x00\x00\x00\t\x18\xfd\xe0\x00\x00\x00\x00\t\xac\xa5\xe0\x00\x00\x00\x00\n\xef\xa5`\x00\x00\x00\x00" +
-	"\v\x9e\xfc\xe0\x00\x00\x00\x00\f\xd8\xc1\xe0\x00\x00\x00\x00\r~\xde\xe0\x00\x00\x00\x00\x0e\xb8\xa3\xe0\x00\x00\x00\x00\x0f^\xc0\xe0\x00\x00\x00\x00\x10\x98\x85\xe0\x00\x00\x00\x00\x11>\xa2\xe0\x00\x00\x00\x00\x12xg\xe0" +
-	"\x00\x00\x00\x00\x13\x1e\x84\xe0\x00\x00\x00\x00\x14XI\xe0\x00\x00\x00\x00\x14\xfef\xe0\x00\x00\x00\x00\x168+\xe0\x00\x00\x00\x00\x16\xe7\x83`\x00\x00\x00\x00\x18!H`\x00\x00\x00\x00\x18\xc7e`\x00\x00\x00\x00" +
-	"\x1a\x01*`\x00\x00\x00\x00\x1a\xa7G`\x00\x00\x00\x00\x1b\xe1\f`\x00\x00\x00\x00\x1c\x87)`\x00\x00\x00\x00\x1d\xc0\xee`\x00\x00\x00\x00\x1eg\v`\x00\x00\x00\x00\x1f\xa0\xd0`\x00\x00\x00\x00 F\xed`" +
-	"\x00\x00\x00\x00!\x80\xb2`\x00\x00\x00\x00\"0\t\xe0\x00\x00\x00\x00#i\xce\xe0\x00\x00\x00\x00$\x0f\xeb\xe0\x00\x00\x00\x00%.\x01`\x00\x00\x00\x00&\x02B\xe0\x00\x00\x00\x00'\r\xe3`\x00\x00\x00\x00" +
-	"'\xe2$\xe0\x00\x00\x00\x00(\xed\xc5`\x00\x00\x00\x00)\xc2\x06\xe0\x00\x00\x00\x00*ͧ`\x00\x00\x00\x00+\xab#`\x00\x00\x00\x00,\xad\x89`\x00\x00\x00\x00-\x8b\x05`\x00\x00\x00\x00.\x8dk`" +
-	"\x00\x00\x00\x00/j\xe7`\x00\x00\x00\x000mM`\x00\x00\x00\x001J\xc9`\x00\x00\x00\x002Vi\xe0\x00\x00\x00\x003*\xab`\x00\x00\x00\x0046K\xe0\x00\x00\x00\x005\n\x8d`\x00\x00\x00\x00" +
-	"6\x16-\xe0\x00\x00\x00\x006\xf3\xa9\xe0\x00\x00\x00\x007\xf6\x0f\xe0\x00\x00\x00\x008Ӌ\xe0\x00\x00\x00\x009\xd5\xf1\xe0\x00\x00\x00\x00:\xb3m\xe0\x00\x00\x00\x00;\xbf\x0e`\x00\x00\x00\x00<\x93O\xe0" +
-	"\x00\x00\x00\x00=\x9e\xf0`\x00\x00\x00\x00>s1\xe0\x00\x00\x00\x00?~\xd2`\x00\x00\x00\x00@\\N`\x00\x00\x00\x00A^\xb4`\x00\x00\x00\x00B<0`\x00\x00\x00\x00C>\x96`\x00\x00\x00\x00" +
-	"D\x1c\x12`\x00\x00\x00\x00E\x1ex`\x00\x00\x00\x00E\xfb\xf4`\x00\x00\x00\x00F\xfeZ`\x02\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x05\x04\x05\x04" +
-	"\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04" +
-	"\x05\x04\x05\x04\x00\x00\xa3\xd8\x00\x00\x00\x00\xaf\xc8\x01\x04\x00\x00\xa1\xb8\x00\t\x00\x00\xa8\xc0\x01\x04\x00\x00\xb6\xd0\x01\x0e\x00\x00\xa8\xc0\x00\x04LMT\x00NZST\x00NZMT\x00NZDT\x00\n" +
-	"NZST-12NZDT,M9.5.0,M4.1.0/3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x95{\xf3\xa9w\x03\x00\x00w\x03\x00\x00\x11\x00\x00\x00An" +
-	"tarctica/PalmerTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00" +
-	"\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00R\x00\x00\x00\x05\x00\x00\x00\x10\xff\xff\xff\xff\xf6\x98\xad\x00\xff\xff" +
-	"\xff\xff\xf6柰\xff\xff\xff\xff\xf8\x13C\xc0\xff\xff\xff\xff\xf8\xc7\xd30\xff\xff\xff\xff\xf9\xf4w@\xff\xff\xff\xff\xfa\xd36\xb0\xff\xff\xff\xff\xfb\xc35\xc0\xff\xff\xff\xff\xfc\xbcS0\xff\xff\xff\xff\xfd\xac" +
-	"R@\xff\xff\xff\xff\xfe\x9c50\xff\xff\xff\xff\xff\x8c4@\x00\x00\x00\x00\a\xa3J\xb0\x00\x00\x00\x00\b$o\xa0\x00\x00\x00\x00\x170\xbc\xb0\x00\x00\x00\x00\x18\x06]\xc0\x00\x00\x00\x00\x18\xd1V\xb0\x00\x00" +
-	"\x00\x00\x19\xe6?\xc0\x00\x00\x00\x00\x1a\xb18\xb0\x00\x00\x00\x00\x1b\xcf\\@\x00\x00\x00\x00\x1c\x91\x1a\xb0\x00\x00\x00\x00\x1d\xaf>@\x00\x00\x00\x00\x1ep\xfc\xb0\x00\x00\x00\x00\x1f\x8f @\x00\x00\x00\x00 \x7f" +
-	"\x030\x00\x00\x00\x00!o\x02@\x00\x00\x00\x00\"9\xfb0\x00\x00\x00\x00#N\xe4@\x00\x00\x00\x00$\x19\xdd0\x00\x00\x00\x00%8\x00\xc0\x00\x00\x00\x00%\xf9\xbf0\x00\x00\x00\x00&\xf2\xf8\xc0\x00\x00" +
-	"\x00\x00'١0\x00\x00\x00\x00(\xf7\xc4\xc0\x00\x00\x00\x00)½\xb0\x00\x00\x00\x00*צ\xc0\x00\x00\x00\x00+\xa2\x9f\xb0\x00\x00\x00\x00,\xb7\x88\xc0\x00\x00\x00\x00-\x82\x81\xb0\x00\x00\x00\x00.\x97" +
-	"j\xc0\x00\x00\x00\x00/bc\xb0\x00\x00\x00\x000\x80\x87@\x00\x00\x00\x001BE\xb0\x00\x00\x00\x002`i@\x00\x00\x00\x003=\xd70\x00\x00\x00\x004@K@\x00\x00\x00\x005\vD0\x00\x00" +
-	"\x00\x006\r\xb8@\x00\x00\x00\x007\x06հ\x00\x00\x00\x008\x00\x0f@\x00\x00\x00\x008\xcb\b0\x00\x00\x00\x009\xe9+\xc0\x00\x00\x00\x00:\xaa\xea0\x00\x00\x00\x00;\xc9\r\xc0\x00\x00\x00\x00<\x8a" +
-	"\xcc0\x00\x00\x00\x00=\xa8\xef\xc0\x00\x00\x00\x00>j\xae0\x00\x00\x00\x00?\x88\xd1\xc0\x00\x00\x00\x00@Sʰ\x00\x00\x00\x00Ah\xb3\xc0\x00\x00\x00\x00B3\xac\xb0\x00\x00\x00\x00CH\x95\xc0\x00\x00" +
-	"\x00\x00D\x13\x8e\xb0\x00\x00\x00\x00E1\xb2@\x00\x00\x00\x00E\xf3p\xb0\x00\x00\x00\x00G\x11\x94@\x00\x00\x00\x00G\xef\x020\x00\x00\x00\x00H\xf1v@\x00\x00\x00\x00I\xbco0\x00\x00\x00\x00J\xd1" +
-	"X@\x00\x00\x00\x00K\xb8\x00\xb0\x00\x00\x00\x00L\xb1:@\x00\x00\x00\x00M\xc6\a0\x00\x00\x00\x00NP\x82\xc0\x00\x00\x00\x00O\x9c\xae\xb0\x00\x00\x00\x00PB\xd9\xc0\x00\x00\x00\x00Q|\x90\xb0\x00\x00" +
-	"\x00\x00R+\xf6@\x00\x00\x00\x00S\\r\xb0\x00\x00\x00\x00T\v\xd8@\x00\x00\x00\x00W7\xe60\x00\x00\x00\x00W\xaf\xec\xc0\x00\x00\x00\x00XC\x86\xb0\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x04\x03\x04\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x04\x00\x00\x00\x00\x00\x00\xff\xff\xc7\xc0\x00\x04\xff\xff\xd5\xd0\x01\b\xff\xff\xe3\xe0\x01\f\xff\xff\xd5\xd0\x00\b-00\x00-04\x00-03\x00-02\x00\n<-03>" +
-	"3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Ɖ\xf71\x84\x00\x00\x00\x84\x00\x00\x00\x12\x00\x00\x00Antarctica/RotheraTZif2\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\b\x00\x00\x00\x00\r\x02-\x00\x01\x00\x00\x00\x00\x00\x00\xff\xff\xd5\xd0\x00\x04-00\x00-03\x00\n<-03>" +
-	"3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00b\xb2\xaf\xf7\x13\x04\x00\x00\x13\x04\x00\x00\x15\x00\x00\x00Antarctica/South_PoleTZif2\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00`\x00\x00\x00\x06\x00\x00\x00\x13\xff\xff\xff\xffA\xb7L\xa8\xff\xff\xff\xff\xb0\xb4\xb2\xe8\xff\xff\xff\xff\xb1Q\x87X\xff\xff\xff\xff\xb2x\xe5h" +
-	"\xff\xff\xff\xff\xb3C\xe5`\xff\xff\xff\xff\xb4X\xc7h\xff\xff\xff\xff\xb5#\xc7`\xff\xff\xff\xff\xb68\xa9h\xff\xff\xff\xff\xb7\x03\xa9`\xff\xff\xff\xff\xb8\x18\x8bh\xff\xff\xff\xff\xb8\xec\xc5\xe0\xff\xff\xff\xff" +
-	"\xb9\xf8mh\xff\xff\xff\xff\xba̧\xe0\xff\xff\xff\xff\xbb\xd8Oh\xff\xff\xff\xff\xbc\xe3\xe8\xe0\xff\xff\xff\xff\xbd\xae\xf6\xe8\xff\xff\xff\xff\xbe\xc3\xca\xe0\xff\xff\xff\xff\xbf\x8e\xd8\xe8\xff\xff\xff\xff\xc0\xa3\xac\xe0" +
-	"\xff\xff\xff\xff\xc1n\xba\xe8\xff\xff\xff\xff\u0083\x8e\xe0\xff\xff\xff\xff\xc3N\x9c\xe8\xff\xff\xff\xff\xc4cp\xe0\xff\xff\xff\xff\xc5.~\xe8\xff\xff\xff\xff\xc6L\x8d`\xff\xff\xff\xff\xc7\x0e`\xe8\xff\xff\xff\xff" +
-	"\xc8,o`\xff\xff\xff\xff\xc8\xf7}h\xff\xff\xff\xff\xd2ښ@\x00\x00\x00\x00\t\x18\xfd\xe0\x00\x00\x00\x00\t\xac\xa5\xe0\x00\x00\x00\x00\n\xef\xa5`\x00\x00\x00\x00\v\x9e\xfc\xe0\x00\x00\x00\x00\f\xd8\xc1\xe0" +
-	"\x00\x00\x00\x00\r~\xde\xe0\x00\x00\x00\x00\x0e\xb8\xa3\xe0\x00\x00\x00\x00\x0f^\xc0\xe0\x00\x00\x00\x00\x10\x98\x85\xe0\x00\x00\x00\x00\x11>\xa2\xe0\x00\x00\x00\x00\x12xg\xe0\x00\x00\x00\x00\x13\x1e\x84\xe0\x00\x00\x00\x00" +
-	"\x14XI\xe0\x00\x00\x00\x00\x14\xfef\xe0\x00\x00\x00\x00\x168+\xe0\x00\x00\x00\x00\x16\xe7\x83`\x00\x00\x00\x00\x18!H`\x00\x00\x00\x00\x18\xc7e`\x00\x00\x00\x00\x1a\x01*`\x00\x00\x00\x00\x1a\xa7G`" +
-	"\x00\x00\x00\x00\x1b\xe1\f`\x00\x00\x00\x00\x1c\x87)`\x00\x00\x00\x00\x1d\xc0\xee`\x00\x00\x00\x00\x1eg\v`\x00\x00\x00\x00\x1f\xa0\xd0`\x00\x00\x00\x00 F\xed`\x00\x00\x00\x00!\x80\xb2`\x00\x00\x00\x00" +
-	"\"0\t\xe0\x00\x00\x00\x00#i\xce\xe0\x00\x00\x00\x00$\x0f\xeb\xe0\x00\x00\x00\x00%.\x01`\x00\x00\x00\x00&\x02B\xe0\x00\x00\x00\x00'\r\xe3`\x00\x00\x00\x00'\xe2$\xe0\x00\x00\x00\x00(\xed\xc5`" +
-	"\x00\x00\x00\x00)\xc2\x06\xe0\x00\x00\x00\x00*ͧ`\x00\x00\x00\x00+\xab#`\x00\x00\x00\x00,\xad\x89`\x00\x00\x00\x00-\x8b\x05`\x00\x00\x00\x00.\x8dk`\x00\x00\x00\x00/j\xe7`\x00\x00\x00\x00" +
-	"0mM`\x00\x00\x00\x001J\xc9`\x00\x00\x00\x002Vi\xe0\x00\x00\x00\x003*\xab`\x00\x00\x00\x0046K\xe0\x00\x00\x00\x005\n\x8d`\x00\x00\x00\x006\x16-\xe0\x00\x00\x00\x006\xf3\xa9\xe0" +
-	"\x00\x00\x00\x007\xf6\x0f\xe0\x00\x00\x00\x008Ӌ\xe0\x00\x00\x00\x009\xd5\xf1\xe0\x00\x00\x00\x00:\xb3m\xe0\x00\x00\x00\x00;\xbf\x0e`\x00\x00\x00\x00<\x93O\xe0\x00\x00\x00\x00=\x9e\xf0`\x00\x00\x00\x00" +
-	">s1\xe0\x00\x00\x00\x00?~\xd2`\x00\x00\x00\x00@\\N`\x00\x00\x00\x00A^\xb4`\x00\x00\x00\x00B<0`\x00\x00\x00\x00C>\x96`\x00\x00\x00\x00D\x1c\x12`\x00\x00\x00\x00E\x1ex`" +
-	"\x00\x00\x00\x00E\xfb\xf4`\x00\x00\x00\x00F\xfeZ`\x02\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04" +
-	"\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x00\x00\xa3\xd8\x00\x00\x00\x00" +
-	"\xaf\xc8\x01\x04\x00\x00\xa1\xb8\x00\t\x00\x00\xa8\xc0\x01\x04\x00\x00\xb6\xd0\x01\x0e\x00\x00\xa8\xc0\x00\x04LMT\x00NZST\x00NZMT\x00NZDT\x00\nNZST-12NZDT," +
-	"M9.5.0,M4.1.0/3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcfׇ\xe1\x85\x00\x00\x00\x85\x00\x00\x00\x10\x00\x00\x00Antarctica/Syo" +
-	"waTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\b\xff\xff\xff\xff\xd5\x1b6\xb4\x01\x00\x00+\xcc\x00\x00\x00\x00*0\x00\x04LM" +
-	"T\x00+03\x00\n<+03>-3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00:\xc8P7\xb1\x00\x00\x00\xb1\x00\x00\x00\x10\x00\x00\x00Antarctica/Trol" +
-	"lTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\f\x00\x00\x00\x00B\rG\x00\x00\x00\x00\x00BF\x05\x90\x02\x01\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x1c \x01\x04\x00\x00\x00\x00\x00\b-00\x00+02\x00+00\x00\n<+00>0<+02>-2,M3.5.0/1,M10.5.0/3\nPK" +
-	"\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00B\x1d\xc6\x1b\x85\x00\x00\x00\x85\x00\x00\x00\x11\x00\x00\x00Antarctica/VostokTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\b\xff\xff\xff\xff\xb0\xfe\xbad\x01\x00\x00R\x1c\x00\x00\x00\x00T`\x00\x04LMT\x00+06\x00\n<+06>-6\nPK" +
-	"\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17S\x91\xb3\xc1\x02\x00\x00\xc1\x02\x00\x00\x13\x00\x00\x00Arctic/LongyearbyenTZif2\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00<\x00\x00\x00\x04\x00\x00\x00\x12\xff\xff\xff\xffo\xa2a\xf8\xff\xff\xff\xff\x9b\f\x17`\xff\xff\xff\xff\x9b\xd5\xda\xf0\xff\xff\xff\xff\x9cٮ\x90\xff\xff\xff\xff\x9d\xa4" +
-	"\xb5\x90\xff\xff\xff\xff\x9e\xb9\x90\x90\xff\xff\xff\xff\x9f\x84\x97\x90\xff\xff\xff\xff\xc8\tq\x90\xff\xff\xff\xff\xcc\xe7K\x10\xff\xff\xff\xffͩ\x17\x90\xff\xff\xff\xff\u03a2C\x10\xff\xff\xff\xffϒ4\x10\xff\xff" +
-	"\xff\xffЂ%\x10\xff\xff\xff\xff\xd1r\x16\x10\xff\xff\xff\xffѶ\x96\x00\xff\xff\xff\xff\xd2X\xbe\x80\xff\xff\xff\xffҡO\x10\xff\xff\xff\xff\xd3c\x1b\x90\xff\xff\xff\xff\xd4K#\x90\xff\xff\xff\xff\xd59" +
-	"\xd1 \xff\xff\xff\xff\xd5g\xe7\x90\xff\xff\xff\xffըs\x00\xff\xff\xff\xff\xd6)\xb4\x10\xff\xff\xff\xff\xd7,\x1a\x10\xff\xff\xff\xff\xd8\t\x96\x10\xff\xff\xff\xff\xd9\x02\xc1\x90\xff\xff\xff\xff\xd9\xe9x\x10\x00\x00" +
-	"\x00\x00\x13MD\x10\x00\x00\x00\x00\x143\xfa\x90\x00\x00\x00\x00\x15#\xeb\x90\x00\x00\x00\x00\x16\x13ܐ\x00\x00\x00\x00\x17\x03͐\x00\x00\x00\x00\x17\xf3\xbe\x90\x00\x00\x00\x00\x18㯐\x00\x00\x00\x00\x19\xd3" +
-	"\xa0\x90\x00\x00\x00\x00\x1aÑ\x90\x00\x00\x00\x00\x1b\xbc\xbd\x10\x00\x00\x00\x00\x1c\xac\xae\x10\x00\x00\x00\x00\x1d\x9c\x9f\x10\x00\x00\x00\x00\x1e\x8c\x90\x10\x00\x00\x00\x00\x1f|\x81\x10\x00\x00\x00\x00 lr\x10\x00\x00" +
-	"\x00\x00!\\c\x10\x00\x00\x00\x00\"LT\x10\x00\x00\x00\x00#<E\x10\x00\x00\x00\x00$,6\x10\x00\x00\x00\x00%\x1c'\x10\x00\x00\x00\x00&\f\x18\x10\x00\x00\x00\x00'\x05C\x90\x00\x00\x00\x00'\xf5" +
-	"4\x90\x00\x00\x00\x00(\xe5%\x90\x00\x00\x00\x00)\xd5\x16\x90\x00\x00\x00\x00*\xc5\a\x90\x00\x00\x00\x00+\xb4\xf8\x90\x00\x00\x00\x00,\xa4\xe9\x90\x00\x00\x00\x00-\x94ڐ\x00\x00\x00\x00.\x84ː\x00\x00" +
-	"\x00\x00/t\xbc\x90\x00\x00\x00\x000d\xad\x90\x00\x00\x00\x001]\xd9\x10\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x03\x01\x02\x01\x02\x01\x03\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x00\x00\f\x88\x00\x00\x00\x00\x1c \x01\x04\x00\x00\x0e\x10\x00\t\x00\x00*0\x01\rLMT\x00CEST\x00CET\x00C" +
-	"EMT\x00\nCET-1CEST,M3.5.0,M10.5.0/3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcfׇ\xe1\x85\x00\x00\x00\x85\x00\x00\x00\t\x00" +
-	"\x00\x00Asia/AdenTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00" +
-	"\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\b\xff\xff\xff\xff\xd5\x1b6\xb4\x01\x00\x00+\xcc\x00" +
-	"\x00\x00\x00*0\x00\x04LMT\x00+03\x00\n<+03>-3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00S\xdd\\2a\x02\x00\x00a\x02\x00\x00\v\x00\x00\x00Asia/A" +
-	"lmatyTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif" +
-	"2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x003\x00\x00\x00\x05\x00\x00\x00\x10\xff\xff\xff\xff\xaa\x19{\xdc\xff\xff\xff\xff\xb5\xa3\xef0\x00\x00\x00\x00" +
-	"\x15'}\xa0\x00\x00\x00\x00\x16\x18\xb2\x10\x00\x00\x00\x00\x17\b\xb1 \x00\x00\x00\x00\x17\xf9\xe5\x90\x00\x00\x00\x00\x18\xe9\xe4\xa0\x00\x00\x00\x00\x19\xdb\x19\x10\x00\x00\x00\x00\x1a\xcci\xa0\x00\x00\x00\x00\x1b\xbcv\xc0" +
-	"\x00\x00\x00\x00\x1c\xacg\xc0\x00\x00\x00\x00\x1d\x9cX\xc0\x00\x00\x00\x00\x1e\x8cI\xc0\x00\x00\x00\x00\x1f|:\xc0\x00\x00\x00\x00 l+\xc0\x00\x00\x00\x00!\\\x1c\xc0\x00\x00\x00\x00\"L\r\xc0\x00\x00\x00\x00" +
-	"#;\xfe\xc0\x00\x00\x00\x00$+\xef\xc0\x00\x00\x00\x00%\x1b\xe0\xc0\x00\x00\x00\x00&\v\xd1\xc0\x00\x00\x00\x00'\x04\xfd@\x00\x00\x00\x00'\xf4\xee@\x00\x00\x00\x00(\xe4\xedP\x00\x00\x00\x00)x\x95P" +
-	"\x00\x00\x00\x00)\xd4\xd0@\x00\x00\x00\x00*\xc4\xc1@\x00\x00\x00\x00+\xb4\xb2@\x00\x00\x00\x00,\xa4\xa3@\x00\x00\x00\x00-\x94\x94@\x00\x00\x00\x00.\x84\x85@\x00\x00\x00\x00/tv@\x00\x00\x00\x00" +
-	"0dg@\x00\x00\x00\x001]\x92\xc0\x00\x00\x00\x002rm\xc0\x00\x00\x00\x003=t\xc0\x00\x00\x00\x004RO\xc0\x00\x00\x00\x005\x1dV\xc0\x00\x00\x00\x00621\xc0\x00\x00\x00\x006\xfd8\xc0" +
-	"\x00\x00\x00\x008\x1bN@\x00\x00\x00\x008\xdd\x1a\xc0\x00\x00\x00\x009\xfb0@\x00\x00\x00\x00:\xbc\xfc\xc0\x00\x00\x00\x00;\xdb\x12@\x00\x00\x00\x00<\xa6\x19@\x00\x00\x00\x00=\xba\xf4@\x00\x00\x00\x00" +
-	">\x85\xfb@\x00\x00\x00\x00?\x9a\xd6@\x00\x00\x00\x00@e\xdd@\x00\x00\x00\x00A\x83\xf2\xc0\x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x04\x01\x03\x02\x03\x02\x03\x02\x03\x02" +
-	"\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x00\x00H$\x00\x00\x00\x00FP\x00\x04\x00\x00bp\x01\b\x00\x00T`\x00\f\x00\x00T`\x01\fLMT\x00+05\x00+07" +
-	"\x00+06\x00\n<+06>-6\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaf\rs\xad\xa0\x03\x00\x00\xa0\x03\x00\x00\n\x00\x00\x00Asia/AmmanTZif2\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00W\x00\x00\x00\x04\x00\x00\x00\x11\xff\xff\xff\xff\xb6\xa3\xd6\xd0\x00\x00\x00\x00\x06ry\xe0\x00\x00\x00\x00\a\f\xabP\x00\x00\x00\x00\b$7" +
-	"`\x00\x00\x00\x00\b\xed\xde\xd0\x00\x00\x00\x00\n\x05j\xe0\x00\x00\x00\x00\n\xcf\x12P\x00\x00\x00\x00\v\xe7\xef\xe0\x00\x00\x00\x00\f\xdau\xd0\x00\x00\x00\x00\r\xc9#`\x00\x00\x00\x00\x0e\x92\xca\xd0\x00\x00\x00" +
-	"\x00\x0f\xa9\x05`\x00\x00\x00\x00\x10r\xac\xd0\x00\x00\x00\x00\x1c\xad\xd5`\x00\x00\x00\x00\x1d\x9f\t\xd0\x00\x00\x00\x00\x1e\x92\xfd`\x00\x00\x00\x00\x1f\x82\xe0P\x00\x00\x00\x00 r\xdf`\x00\x00\x00\x00!b\xc2" +
-	"P\x00\x00\x00\x00\"R\xc1`\x00\x00\x00\x00#K\xde\xd0\x00\x00\x00\x00$d\xbc`\x00\x00\x00\x00%+\xc0\xd0\x00\x00\x00\x00&7o`\x00\x00\x00\x00'\v\xa2\xd0\x00\x00\x00\x00(\vs\xe0\x00\x00\x00" +
-	"\x00(\xe2JP\x00\x00\x00\x00)\xe4\xbe`\x00\x00\x00\x00*\xcbf\xd0\x00\x00\x00\x00+\xbbe\xe0\x00\x00\x00\x00,\xabH\xd0\x00\x00\x00\x00-\x9bG\xe0\x00\x00\x00\x00.x\xb5\xd0\x00\x00\x00\x00/\x84d" +
-	"`\x00\x00\x00\x000X\xa5\xe0\x00\x00\x00\x001dF`\x00\x00\x00\x002A\xc2`\x00\x00\x00\x003D(`\x00\x00\x00\x004!\xa4`\x00\x00\x00\x005$\n`\x00\x00\x00\x006\x01\x86`\x00\x00\x00" +
-	"\x007z\x93`\x00\x00\x00\x007\xea\xa2\xe0\x00\x00\x00\x008\xe2|\xe0\x00\x00\x00\x009ӿ`\x00\x00\x00\x00:\xc2^\xe0\x00\x00\x00\x00;\xb3\xa1`\x00\x00\x00\x00<\xa3\x92`\x00\x00\x00\x00=\x93\x83" +
-	"`\x00\x00\x00\x00>\x83t`\x00\x00\x00\x00?\x98O`\x00\x00\x00\x00@cV`\x00\x00\x00\x00An\xf6\xe0\x00\x00\x00\x00BLr\xe0\x00\x00\x00\x00C<c\xe0\x00\x00\x00\x00D,T\xe0\x00\x00\x00" +
-	"\x00EA/\xe0\x00\x00\x00\x00F\f6\xe0\x00\x00\x00\x00G!\x11\xe0\x00\x00\x00\x00G\xec\x18\xe0\x00\x00\x00\x00I\n.`\x00\x00\x00\x00I\xcb\xfa\xe0\x00\x00\x00\x00J\xea\x10`\x00\x00\x00\x00K\xab\xdc" +
-	"\xe0\x00\x00\x00\x00L\xc9\xf2`\x00\x00\x00\x00M\x94\xf9`\x00\x00\x00\x00N\xa9\xd4`\x00\x00\x00\x00Ot\xdb`\x00\x00\x00\x00R\xb3^P\x00\x00\x00\x00S4\x9f`\x00\x00\x00\x00TR\xb4\xe0\x00\x00\x00" +
-	"\x00U\x14\x81`\x00\x00\x00\x00V2\x96\xe0\x00\x00\x00\x00V\xfd\x9d\xe0\x00\x00\x00\x00X\x12x\xe0\x00\x00\x00\x00X\xdd\x7f\xe0\x00\x00\x00\x00Y\xf2Z\xe0\x00\x00\x00\x00Z\xbda\xe0\x00\x00\x00\x00[\xd2<" +
-	"\xe0\x00\x00\x00\x00\\\x9dC\xe0\x00\x00\x00\x00]\xb2\x1e\xe0\x00\x00\x00\x00^}%\xe0\x00\x00\x00\x00_\x9b;`\x00\x00\x00\x00`]\a\xe0\x00\x00\x00\x00a{\x1d`\x00\x00\x00\x00b\x17\xff\xe0\x00\x00\x00" +
-	"\x00cZ\xff`\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x03\x00\x00!\xb0\x00\x00\x00\x00*0\x01\x04\x00\x00\x1c \x00\t\x00\x00*0\x00\rLMT\x00" +
-	"EEST\x00EET\x00+03\x00\n<+03>-3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00V\xe0\xe7!\xe7\x02\x00\x00\xe7\x02\x00\x00\v\x00\x00\x00Asia/Ana" +
-	"dyrTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00@\x00\x00\x00\a\x00\x00\x00\x14\xff\xff\xff\xff\xaa\x19\x1d\x9c\xff\xff\xff\xff\xb5\xa3\x8c\xc0\x00\x00\x00\x00\x15'" +
-	"\x1b0\x00\x00\x00\x00\x16\x18O\xa0\x00\x00\x00\x00\x17\bN\xb0\x00\x00\x00\x00\x17\xf9\x910\x00\x00\x00\x00\x18\xe9\x90@\x00\x00\x00\x00\x19\xdaİ\x00\x00\x00\x00\x1a\xcc\x15@\x00\x00\x00\x00\x1b\xbc\"`\x00\x00" +
-	"\x00\x00\x1c\xac\x13`\x00\x00\x00\x00\x1d\x9c\x04`\x00\x00\x00\x00\x1e\x8b\xf5`\x00\x00\x00\x00\x1f{\xe6`\x00\x00\x00\x00 k\xd7`\x00\x00\x00\x00![\xc8`\x00\x00\x00\x00\"K\xb9`\x00\x00\x00\x00#;" +
-	"\xaa`\x00\x00\x00\x00$+\x9b`\x00\x00\x00\x00%\x1b\x8c`\x00\x00\x00\x00&\v}`\x00\x00\x00\x00'\x04\xa8\xe0\x00\x00\x00\x00'\xf4\x99\xe0\x00\x00\x00\x00(\xe4\x98\xf0\x00\x00\x00\x00)x@\xf0\x00\x00" +
-	"\x00\x00)\xd4{\xe0\x00\x00\x00\x00*\xc4l\xe0\x00\x00\x00\x00+\xb4]\xe0\x00\x00\x00\x00,\xa4N\xe0\x00\x00\x00\x00-\x94?\xe0\x00\x00\x00\x00.\x840\xe0\x00\x00\x00\x00/t!\xe0\x00\x00\x00\x000d" +
-	"\x12\xe0\x00\x00\x00\x001]>`\x00\x00\x00\x002r\x19`\x00\x00\x00\x003= `\x00\x00\x00\x004Q\xfb`\x00\x00\x00\x005\x1d\x02`\x00\x00\x00\x0061\xdd`\x00\x00\x00\x006\xfc\xe4`\x00\x00" +
-	"\x00\x008\x1a\xf9\xe0\x00\x00\x00\x008\xdc\xc6`\x00\x00\x00\x009\xfa\xdb\xe0\x00\x00\x00\x00:\xbc\xa8`\x00\x00\x00\x00;ڽ\xe0\x00\x00\x00\x00<\xa5\xc4\xe0\x00\x00\x00\x00=\xba\x9f\xe0\x00\x00\x00\x00>\x85" +
-	"\xa6\xe0\x00\x00\x00\x00?\x9a\x81\xe0\x00\x00\x00\x00@e\x88\xe0\x00\x00\x00\x00A\x83\x9e`\x00\x00\x00\x00BEj\xe0\x00\x00\x00\x00Cc\x80`\x00\x00\x00\x00D%L\xe0\x00\x00\x00\x00ECb`\x00\x00" +
-	"\x00\x00F\x05.\xe0\x00\x00\x00\x00G#D`\x00\x00\x00\x00G\xeeK`\x00\x00\x00\x00I\x03&`\x00\x00\x00\x00I\xce-`\x00\x00\x00\x00J\xe3\b`\x00\x00\x00\x00K\xae\x0f`\x00\x00\x00\x00L\xcc" +
-	"2\xf0\x00\x00\x00\x00M\x8d\xffp\x01\x03\x02\x03\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x05\x06\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04" +
-	"\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x05\x06\x01\x00\x00\xa6d\x00\x00\x00\x00\xa8\xc0\x00\x04\x00\x00\xc4\xe0\x01\b\x00\x00\xb6\xd0\x00\f\x00\x00\xb6\xd0\x01\f\x00\x00\xa8\xc0\x01\x04\x00\x00\x9a\xb0\x00\x10LMT\x00" +
-	"+12\x00+14\x00+13\x00+11\x00\n<+12>-12\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00T\x81\x18G^\x02\x00\x00^\x02\x00\x00\n\x00\x00\x00Asia" +
-	"/AqtauTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZi" +
-	"f2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x002\x00\x00\x00\x06\x00\x00\x00\x10\xff\xff\xff\xff\xaa\x19\x94\xe0\xff\xff\xff\xff\xb5\xa3\xfd@\x00\x00\x00" +
-	"\x00\x16\x18\xce0\x00\x00\x00\x00\x17\b\xb1 \x00\x00\x00\x00\x17\xf9\xf3\xa0\x00\x00\x00\x00\x18\xe9\xf2\xb0\x00\x00\x00\x00\x19\xdb' \x00\x00\x00\x00\x1a\xccw\xb0\x00\x00\x00\x00\x1b\xbc\x84\xd0\x00\x00\x00\x00\x1c\xacu" +
-	"\xd0\x00\x00\x00\x00\x1d\x9cf\xd0\x00\x00\x00\x00\x1e\x8cW\xd0\x00\x00\x00\x00\x1f|H\xd0\x00\x00\x00\x00 l9\xd0\x00\x00\x00\x00!\\*\xd0\x00\x00\x00\x00\"L\x1b\xd0\x00\x00\x00\x00#<\f\xd0\x00\x00\x00" +
-	"\x00$+\xfd\xd0\x00\x00\x00\x00%\x1b\xee\xd0\x00\x00\x00\x00&\v\xdf\xd0\x00\x00\x00\x00'\x05\vP\x00\x00\x00\x00'\xf4\xfcP\x00\x00\x00\x00(\xe4\xfb`\x00\x00\x00\x00)x\xa3`\x00\x00\x00\x00)\xd4\xde" +
-	"P\x00\x00\x00\x00*\xc4\xcfP\x00\x00\x00\x00+\xb4\xc0P\x00\x00\x00\x00,\xa4\xb1P\x00\x00\x00\x00-\x94\xa2P\x00\x00\x00\x00.\x84\x93P\x00\x00\x00\x00/t\x92`\x00\x00\x00\x000d\x83`\x00\x00\x00" +
-	"\x001]\xae\xe0\x00\x00\x00\x002r\x89\xe0\x00\x00\x00\x003=\x90\xe0\x00\x00\x00\x004Rk\xe0\x00\x00\x00\x005\x1dr\xe0\x00\x00\x00\x0062M\xe0\x00\x00\x00\x006\xfdT\xe0\x00\x00\x00\x008\x1bj" +
-	"`\x00\x00\x00\x008\xdd6\xe0\x00\x00\x00\x009\xfbL`\x00\x00\x00\x00:\xbd\x18\xe0\x00\x00\x00\x00;\xdb.`\x00\x00\x00\x00<\xa65`\x00\x00\x00\x00=\xbb\x10`\x00\x00\x00\x00>\x86\x17`\x00\x00\x00" +
-	"\x00?\x9a\xf2`\x00\x00\x00\x00@e\xf9`\x00\x00\x00\x00A\x84\x0e\xe0\x01\x02\x03\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x05\x01\x02\x04\x02\x04\x02\x04\x01\x05\x01\x05\x01\x05\x01\x05\x01\x05" +
-	"\x01\x05\x01\x05\x01\x05\x01\x05\x01\x05\x02\x00\x00/ \x00\x00\x00\x008@\x00\x04\x00\x00FP\x00\b\x00\x00T`\x00\f\x00\x00T`\x01\f\x00\x00FP\x01\bLMT\x00+04\x00+05\x00+" +
-	"06\x00\n<+05>-5\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb\xfa\xb5\xbeg\x02\x00\x00g\x02\x00\x00\v\x00\x00\x00Asia/AqtobeTZif2\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x003\x00\x00\x00\x06\x00\x00\x00\x10\xff\xff\xff\xff\xaa\x19\x8eh\xff\xff\xff\xff\xb5\xa3\xfd@\x00\x00\x00\x00\x15'\x8b\xb0\x00\x00\x00\x00\x16\x18\xc0 " +
-	"\x00\x00\x00\x00\x17\b\xb1 \x00\x00\x00\x00\x17\xf9\xf3\xa0\x00\x00\x00\x00\x18\xe9\xf2\xb0\x00\x00\x00\x00\x19\xdb' \x00\x00\x00\x00\x1a\xccw\xb0\x00\x00\x00\x00\x1b\xbc\x84\xd0\x00\x00\x00\x00\x1c\xacu\xd0\x00\x00\x00\x00" +
-	"\x1d\x9cf\xd0\x00\x00\x00\x00\x1e\x8cW\xd0\x00\x00\x00\x00\x1f|H\xd0\x00\x00\x00\x00 l9\xd0\x00\x00\x00\x00!\\*\xd0\x00\x00\x00\x00\"L\x1b\xd0\x00\x00\x00\x00#<\f\xd0\x00\x00\x00\x00$+\xfd\xd0" +
-	"\x00\x00\x00\x00%\x1b\xee\xd0\x00\x00\x00\x00&\v\xdf\xd0\x00\x00\x00\x00'\x05\vP\x00\x00\x00\x00'\xf4\xfcP\x00\x00\x00\x00(\xe4\xfb`\x00\x00\x00\x00)x\xa3`\x00\x00\x00\x00)\xd4\xdeP\x00\x00\x00\x00" +
-	"*\xc4\xcfP\x00\x00\x00\x00+\xb4\xc0P\x00\x00\x00\x00,\xa4\xb1P\x00\x00\x00\x00-\x94\xa2P\x00\x00\x00\x00.\x84\x93P\x00\x00\x00\x00/t\x84P\x00\x00\x00\x000duP\x00\x00\x00\x001]\xa0\xd0" +
-	"\x00\x00\x00\x002r{\xd0\x00\x00\x00\x003=\x82\xd0\x00\x00\x00\x004R]\xd0\x00\x00\x00\x005\x1dd\xd0\x00\x00\x00\x0062?\xd0\x00\x00\x00\x006\xfdF\xd0\x00\x00\x00\x008\x1b\\P\x00\x00\x00\x00" +
-	"8\xdd(\xd0\x00\x00\x00\x009\xfb>P\x00\x00\x00\x00:\xbd\n\xd0\x00\x00\x00\x00;\xdb P\x00\x00\x00\x00<\xa6'P\x00\x00\x00\x00=\xbb\x02P\x00\x00\x00\x00>\x86\tP\x00\x00\x00\x00?\x9a\xe4P" +
-	"\x00\x00\x00\x00@e\xebP\x00\x00\x00\x00A\x84\x00\xd0\x01\x02\x03\x04\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x05\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03" +
-	"\x02\x03\x02\x03\x02\x03\x02\x00\x005\x98\x00\x00\x00\x008@\x00\x04\x00\x00FP\x00\b\x00\x00T`\x01\f\x00\x00T`\x00\f\x00\x00FP\x01\bLMT\x00+04\x00+05\x00+06\x00\n" +
-	"<+05>-5\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00e\x1bb2w\x01\x00\x00w\x01\x00\x00\r\x00\x00\x00Asia/AshgabatTZif2\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x19\x00\x00\x00\x05\x00\x00\x00\x10\xff\xff\xff\xff\xaa\x19\x8dD\xff\xff\xff\xff\xb5\xa3\xfd@\x00\x00\x00\x00\x15'\x8b\xb0\x00\x00\x00\x00\x16\x18\xc0 \x00\x00" +
-	"\x00\x00\x17\b\xbf0\x00\x00\x00\x00\x17\xf9\xf3\xa0\x00\x00\x00\x00\x18\xe9\xf2\xb0\x00\x00\x00\x00\x19\xdb' \x00\x00\x00\x00\x1a\xccw\xb0\x00\x00\x00\x00\x1b\xbc\x84\xd0\x00\x00\x00\x00\x1c\xacu\xd0\x00\x00\x00\x00\x1d\x9c" +
-	"f\xd0\x00\x00\x00\x00\x1e\x8cW\xd0\x00\x00\x00\x00\x1f|H\xd0\x00\x00\x00\x00 l9\xd0\x00\x00\x00\x00!\\*\xd0\x00\x00\x00\x00\"L\x1b\xd0\x00\x00\x00\x00#<\f\xd0\x00\x00\x00\x00$+\xfd\xd0\x00\x00" +
-	"\x00\x00%\x1b\xee\xd0\x00\x00\x00\x00&\v\xdf\xd0\x00\x00\x00\x00'\x05\vP\x00\x00\x00\x00'\xf4\xfcP\x00\x00\x00\x00(\xe4\xfb`\x00\x00\x00\x00)x\xa3`\x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03" +
-	"\x02\x03\x02\x03\x02\x03\x02\x03\x04\x01\x03\x00\x006\xbc\x00\x00\x00\x008@\x00\x04\x00\x00T`\x01\b\x00\x00FP\x00\f\x00\x00FP\x01\fLMT\x00+04\x00+06\x00+05\x00\n<+" +
-	"05>-5\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00e\x1bb2w\x01\x00\x00w\x01\x00\x00\x0e\x00\x00\x00Asia/AshkhabadTZif2\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x19\x00\x00\x00\x05\x00\x00\x00\x10\xff\xff\xff\xff\xaa\x19\x8dD\xff\xff\xff\xff\xb5\xa3\xfd@\x00\x00\x00\x00\x15'\x8b\xb0\x00\x00\x00\x00\x16\x18\xc0 \x00\x00\x00" +
-	"\x00\x17\b\xbf0\x00\x00\x00\x00\x17\xf9\xf3\xa0\x00\x00\x00\x00\x18\xe9\xf2\xb0\x00\x00\x00\x00\x19\xdb' \x00\x00\x00\x00\x1a\xccw\xb0\x00\x00\x00\x00\x1b\xbc\x84\xd0\x00\x00\x00\x00\x1c\xacu\xd0\x00\x00\x00\x00\x1d\x9cf" +
-	"\xd0\x00\x00\x00\x00\x1e\x8cW\xd0\x00\x00\x00\x00\x1f|H\xd0\x00\x00\x00\x00 l9\xd0\x00\x00\x00\x00!\\*\xd0\x00\x00\x00\x00\"L\x1b\xd0\x00\x00\x00\x00#<\f\xd0\x00\x00\x00\x00$+\xfd\xd0\x00\x00\x00" +
-	"\x00%\x1b\xee\xd0\x00\x00\x00\x00&\v\xdf\xd0\x00\x00\x00\x00'\x05\vP\x00\x00\x00\x00'\xf4\xfcP\x00\x00\x00\x00(\xe4\xfb`\x00\x00\x00\x00)x\xa3`\x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02" +
-	"\x03\x02\x03\x02\x03\x02\x03\x04\x01\x03\x00\x006\xbc\x00\x00\x00\x008@\x00\x04\x00\x00T`\x01\b\x00\x00FP\x00\f\x00\x00FP\x01\fLMT\x00+04\x00+06\x00+05\x00\n<+0" +
-	"5>-5\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?\xa7^\xfah\x02\x00\x00h\x02\x00\x00\v\x00\x00\x00Asia/AtyrauTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x002\x00\x00\x00\a\x00\x00\x00\x14\xff\xff\xff\xff\xaa\x19\x93P\xff\xff\xff\xff\xb5\xa4\vP\x00\x00\x00\x00\x16\x18\xce0\x00\x00\x00\x00\x17\b\xb1 \x00\x00\x00\x00\x17\xf9\xf3" +
-	"\xa0\x00\x00\x00\x00\x18\xe9\xf2\xb0\x00\x00\x00\x00\x19\xdb' \x00\x00\x00\x00\x1a\xccw\xb0\x00\x00\x00\x00\x1b\xbc\x84\xd0\x00\x00\x00\x00\x1c\xacu\xd0\x00\x00\x00\x00\x1d\x9cf\xd0\x00\x00\x00\x00\x1e\x8cW\xd0\x00\x00\x00" +
-	"\x00\x1f|H\xd0\x00\x00\x00\x00 l9\xd0\x00\x00\x00\x00!\\*\xd0\x00\x00\x00\x00\"L\x1b\xd0\x00\x00\x00\x00#<\f\xd0\x00\x00\x00\x00$+\xfd\xd0\x00\x00\x00\x00%\x1b\xee\xd0\x00\x00\x00\x00&\v\xdf" +
-	"\xd0\x00\x00\x00\x00'\x05\vP\x00\x00\x00\x00'\xf4\xfcP\x00\x00\x00\x00(\xe4\xfb`\x00\x00\x00\x00)x\xa3`\x00\x00\x00\x00)\xd4\xdeP\x00\x00\x00\x00*\xc4\xcfP\x00\x00\x00\x00+\xb4\xc0P\x00\x00\x00" +
-	"\x00,\xa4\xb1P\x00\x00\x00\x00-\x94\xa2P\x00\x00\x00\x00.\x84\x93P\x00\x00\x00\x00/t\x84P\x00\x00\x00\x000duP\x00\x00\x00\x001]\xa0\xd0\x00\x00\x00\x002r{\xd0\x00\x00\x00\x003=\x82" +
-	"\xd0\x00\x00\x00\x004R]\xd0\x00\x00\x00\x005\x1dd\xd0\x00\x00\x00\x0062?\xd0\x00\x00\x00\x006\xfdF\xd0\x00\x00\x00\x008\x1bj`\x00\x00\x00\x008\xdd6\xe0\x00\x00\x00\x009\xfbL`\x00\x00\x00" +
-	"\x00:\xbd\x18\xe0\x00\x00\x00\x00;\xdb.`\x00\x00\x00\x00<\xa65`\x00\x00\x00\x00=\xbb\x10`\x00\x00\x00\x00>\x86\x17`\x00\x00\x00\x00?\x9a\xf2`\x00\x00\x00\x00@e\xf9`\x00\x00\x00\x00A\x84\x0e" +
-	"\xe0\x01\x02\x03\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x05\x06\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x02\x00\x000\xb0\x00\x00\x00\x00*" +
-	"0\x00\x04\x00\x00FP\x00\b\x00\x00T`\x00\f\x00\x00T`\x01\f\x00\x00FP\x01\b\x00\x008@\x00\x10LMT\x00+03\x00+05\x00+06\x00+04\x00\n<+05>-" +
-	"5\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd7e&uv\x02\x00\x00v\x02\x00\x00\f\x00\x00\x00Asia/BaghdadTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x006\x00\x00\x00\x04\x00\x00\x00\x10\xff\xff\xff\xffi\x86\xb1\xdc\xff\xff\xff\xff\x9e0<\xe0\x00\x00\x00\x00\x170hP\x00\x00\x00\x00\x17\xfa\x0f\xc0\x00\x00\x00\x00\x18\xe8\xbdP\x00" +
-	"\x00\x00\x00\x19\xdbC@\x00\x00\x00\x00\x1a̓\xd0\x00\x00\x00\x00\x1b\xbd\xc8@\x00\x00\x00\x00\x1c\xad\xc7P\x00\x00\x00\x00\x1d\x9ct\xe0\x00\x00\x00\x00\x1e\x8ce\xe0\x00\x00\x00\x00\x1f|V\xe0\x00\x00\x00\x00 " +
-	"lG\xe0\x00\x00\x00\x00!\\8\xe0\x00\x00\x00\x00\"L)\xe0\x00\x00\x00\x00#<\x1a\xe0\x00\x00\x00\x00$,\v\xe0\x00\x00\x00\x00%\x1b\xfc\xe0\x00\x00\x00\x00&\v\xed\xe0\x00\x00\x00\x00'\x05\x19`\x00" +
-	"\x00\x00\x00'\xf6x\x00\x00\x00\x00\x00(纀\x00\x00\x00\x00)\xd8\xfd\x00\x00\x00\x00\x00*\xca?\x80\x00\x00\x00\x00+\xba0\x80\x00\x00\x00\x00,\xabs\x00\x00\x00\x00\x00-\x9bd\x00\x00\x00\x00\x00." +
-	"\x8c\xa6\x80\x00\x00\x00\x00/|\x97\x80\x00\x00\x00\x000m\xda\x00\x00\x00\x00\x001_\x1c\x80\x00\x00\x00\x002P_\x00\x00\x00\x00\x003@P\x00\x00\x00\x00\x0041\x92\x80\x00\x00\x00\x005!\x83\x80\x00" +
-	"\x00\x00\x006\x12\xc6\x00\x00\x00\x00\x007\x02\xb7\x00\x00\x00\x00\x007\xf3\xf9\x80\x00\x00\x00\x008\xe5<\x00\x00\x00\x00\x009\xd6~\x80\x00\x00\x00\x00:\xc6o\x80\x00\x00\x00\x00;\xb7\xb2\x00\x00\x00\x00\x00<" +
-	"\xa7\xa3\x00\x00\x00\x00\x00=\x98\xe5\x80\x00\x00\x00\x00>\x88ր\x00\x00\x00\x00?z\x19\x00\x00\x00\x00\x00@k[\x80\x00\x00\x00\x00A\\\x9e\x00\x00\x00\x00\x00BL\x8f\x00\x00\x00\x00\x00C=р\x00" +
-	"\x00\x00\x00D-\u0080\x00\x00\x00\x00E\x1f\x05\x00\x00\x00\x00\x00F\x0e\xf6\x00\x00\x00\x00\x00G\x008\x80\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03" +
-	"\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x00\x00)\xa4\x00\x00\x00\x00)\xa0\x00\x04\x00\x00*0\x00\b\x00\x008@\x01\fLMT\x00BMT\x00+03" +
-	"\x00+04\x00\n<+03>-3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdav\x19z\x98\x00\x00\x00\x98\x00\x00\x00\f\x00\x00\x00Asia/BahrainTZif" +
-	"2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\f\xff\xff\xff\xff\xa1\xf2\x9d0\x00\x00\x00\x00\x04\x8a\x92\xc0\x01\x02\x00\x000P\x00\x00\x00\x008@\x00" +
-	"\x04\x00\x00*0\x00\bLMT\x00+04\x00+03\x00\n<+03>-3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x87\xb3<\xe8\x02\x00\x00\xe8\x02\x00\x00\t\x00\x00\x00As" +
-	"ia/BakuTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZ" +
-	"if2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00B\x00\x00\x00\x05\x00\x00\x00\x10\xff\xff\xff\xff\xaa\x19\x95D\xff\xff\xff\xff\xe7\xda\fP\x00\x00" +
-	"\x00\x00\x15'\x99\xc0\x00\x00\x00\x00\x16\x18\xce0\x00\x00\x00\x00\x17\b\xcd@\x00\x00\x00\x00\x17\xfa\x01\xb0\x00\x00\x00\x00\x18\xea\x00\xc0\x00\x00\x00\x00\x19\xdb50\x00\x00\x00\x00\x1a̅\xc0\x00\x00\x00\x00\x1b\xbc" +
-	"\x92\xe0\x00\x00\x00\x00\x1c\xac\x83\xe0\x00\x00\x00\x00\x1d\x9ct\xe0\x00\x00\x00\x00\x1e\x8ce\xe0\x00\x00\x00\x00\x1f|V\xe0\x00\x00\x00\x00 lG\xe0\x00\x00\x00\x00!\\8\xe0\x00\x00\x00\x00\"L)\xe0\x00\x00" +
-	"\x00\x00#<\x1a\xe0\x00\x00\x00\x00$,\v\xe0\x00\x00\x00\x00%\x1b\xfc\xe0\x00\x00\x00\x00&\v\xed\xe0\x00\x00\x00\x00'\x05\x19`\x00\x00\x00\x00'\xf5\n`\x00\x00\x00\x00(\xe5\tp\x00\x00\x00\x00)\xd4" +
-	"\xfap\x00\x00\x00\x00*\xc4\xebp\x00\x00\x00\x001]\xd9\x10\x00\x00\x00\x002r\xb4\x10\x00\x00\x00\x003=\xad\x00\x00\x00\x00\x004R\x88\x00\x00\x00\x00\x005\x1d\x8f\x00\x00\x00\x00\x0062j\x00\x00\x00" +
-	"\x00\x006\xfdq\x00\x00\x00\x00\x008\x1b\x86\x80\x00\x00\x00\x008\xddS\x00\x00\x00\x00\x009\xfbh\x80\x00\x00\x00\x00:\xbd5\x00\x00\x00\x00\x00;\xdbJ\x80\x00\x00\x00\x00<\xa6Q\x80\x00\x00\x00\x00=\xbb" +
-	",\x80\x00\x00\x00\x00>\x863\x80\x00\x00\x00\x00?\x9b\x0e\x80\x00\x00\x00\x00@f\x15\x80\x00\x00\x00\x00A\x84+\x00\x00\x00\x00\x00BE\xf7\x80\x00\x00\x00\x00Cd\r\x00\x00\x00\x00\x00D%ـ\x00\x00" +
-	"\x00\x00EC\xef\x00\x00\x00\x00\x00F\x05\xbb\x80\x00\x00\x00\x00G#\xd1\x00\x00\x00\x00\x00G\xee\xd8\x00\x00\x00\x00\x00I\x03\xb3\x00\x00\x00\x00\x00Iκ\x00\x00\x00\x00\x00J\xe3\x95\x00\x00\x00\x00\x00K\xae" +
-	"\x9c\x00\x00\x00\x00\x00Ḻ\x80\x00\x00\x00\x00M\x8e~\x00\x00\x00\x00\x00N\xac\x93\x80\x00\x00\x00\x00On`\x00\x00\x00\x00\x00P\x8cu\x80\x00\x00\x00\x00QW|\x80\x00\x00\x00\x00RlW\x80\x00\x00" +
-	"\x00\x00S7^\x80\x00\x00\x00\x00TL9\x80\x00\x00\x00\x00U\x17@\x80\x00\x00\x00\x00V,\x1b\x80\x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x04\x01\x04\x03\x02\x03\x02\x03" +
-	"\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x00\x00.\xbc\x00\x00\x00\x00*0\x00\x04\x00\x00FP\x01\b\x00\x008@\x00\f" +
-	"\x00\x008@\x01\fLMT\x00+03\x00+05\x00+04\x00\n<+04>-4\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\xf6C\x84\x98\x00\x00\x00\x98\x00\x00\x00\f\x00\x00" +
-	"\x00Asia/BangkokTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00" +
-	"\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\f\xff\xff\xff\xffV\xb6\x85\xc4\xff\xff\xff\xff" +
-	"\xa2jg\xc4\x01\x02\x00\x00^<\x00\x00\x00\x00^<\x00\x04\x00\x00bp\x00\bLMT\x00BMT\x00+07\x00\n<+07>-7\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x87" +
-	"\xbd\xedL\xf1\x02\x00\x00\xf1\x02\x00\x00\f\x00\x00\x00Asia/BarnaulTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00C\x00\x00\x00\x05\x00\x00" +
-	"\x00\x10\xff\xff\xff\xff\xa1\xd5}\xfc\xff\xff\xff\xff\xb5\xa3\xe1 \x00\x00\x00\x00\x15'o\x90\x00\x00\x00\x00\x16\x18\xa4\x00\x00\x00\x00\x00\x17\b\xa3\x10\x00\x00\x00\x00\x17\xf9׀\x00\x00\x00\x00\x18\xe9\u0590\x00\x00" +
-	"\x00\x00\x19\xdb\v\x00\x00\x00\x00\x00\x1a\xcc[\x90\x00\x00\x00\x00\x1b\xbch\xb0\x00\x00\x00\x00\x1c\xacY\xb0\x00\x00\x00\x00\x1d\x9cJ\xb0\x00\x00\x00\x00\x1e\x8c;\xb0\x00\x00\x00\x00\x1f|,\xb0\x00\x00\x00\x00 l" +
-	"\x1d\xb0\x00\x00\x00\x00!\\\x0e\xb0\x00\x00\x00\x00\"K\xff\xb0\x00\x00\x00\x00#;\xf0\xb0\x00\x00\x00\x00$+\xe1\xb0\x00\x00\x00\x00%\x1bҰ\x00\x00\x00\x00&\vð\x00\x00\x00\x00'\x04\xef0\x00\x00" +
-	"\x00\x00'\xf4\xe00\x00\x00\x00\x00(\xe4\xdf@\x00\x00\x00\x00)x\x87@\x00\x00\x00\x00)\xd4\xc20\x00\x00\x00\x00*ij0\x00\x00\x00\x00+\xb4\xa40\x00\x00\x00\x00,\xa4\x950\x00\x00\x00\x00-\x94" +
-	"\x860\x00\x00\x00\x00.\x84w0\x00\x00\x00\x00/th0\x00\x00\x00\x00/\xc7L\x80\x00\x00\x00\x000dg@\x00\x00\x00\x001]\x92\xc0\x00\x00\x00\x002rm\xc0\x00\x00\x00\x003=t\xc0\x00\x00" +
-	"\x00\x004RO\xc0\x00\x00\x00\x005\x1dV\xc0\x00\x00\x00\x00621\xc0\x00\x00\x00\x006\xfd8\xc0\x00\x00\x00\x008\x1bN@\x00\x00\x00\x008\xdd\x1a\xc0\x00\x00\x00\x009\xfb0@\x00\x00\x00\x00:\xbc" +
-	"\xfc\xc0\x00\x00\x00\x00;\xdb\x12@\x00\x00\x00\x00<\xa6\x19@\x00\x00\x00\x00=\xba\xf4@\x00\x00\x00\x00>\x85\xfb@\x00\x00\x00\x00?\x9a\xd6@\x00\x00\x00\x00@e\xdd@\x00\x00\x00\x00A\x83\xf2\xc0\x00\x00" +
-	"\x00\x00BE\xbf@\x00\x00\x00\x00Cc\xd4\xc0\x00\x00\x00\x00D%\xa1@\x00\x00\x00\x00EC\xb6\xc0\x00\x00\x00\x00F\x05\x83@\x00\x00\x00\x00G#\x98\xc0\x00\x00\x00\x00G\xee\x9f\xc0\x00\x00\x00\x00I\x03" +
-	"z\xc0\x00\x00\x00\x00I\u0381\xc0\x00\x00\x00\x00J\xe3\\\xc0\x00\x00\x00\x00K\xaec\xc0\x00\x00\x00\x00L\xccy@\x00\x00\x00\x00M\x8eE\xc0\x00\x00\x00\x00TK\xf30\x00\x00\x00\x00V\xf6\xea@\x01\x03" +
-	"\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x04\x01\x03\x02\x03\x02\x03\x02\x03\x02\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01" +
-	"\x04\x01\x03\x01\x03\x00\x00N\x84\x00\x00\x00\x00T`\x00\x04\x00\x00p\x80\x01\b\x00\x00bp\x00\f\x00\x00bp\x01\fLMT\x00+06\x00+08\x00+07\x00\n<+07>-7\n" +
-	"PK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc7\x11\xe1[\xdc\x02\x00\x00\xdc\x02\x00\x00\v\x00\x00\x00Asia/BeirutTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00@\x00\x00\x00\x03\x00\x00\x00\r\xff\xff\xff\xffV\xb6¸\xff\xff\xff\xff\xa2ec\xe0\xff\xff\xff\xff\xa3{\x82P\xff\xff\xff\xff\xa4N\x80`\xff\xff\xff\xff\xa5?\xb4\xd0\xff\xff\xff\xff" +
-	"\xa6%'\xe0\xff\xff\xff\xff\xa7'\x7f\xd0\xff\xff\xff\xff\xa8)\xf3\xe0\xff\xff\xff\xff\xa8\xeb\xb2P\xff\xff\xff\xff\xe8*\x85\xe0\xff\xff\xff\xff\xe8\xf4-P\xff\xff\xff\xff\xea\v\xb9`\xff\xff\xff\xff\xea\xd5`\xd0" +
-	"\xff\xff\xff\xff\xeb\xec\xec\xe0\xff\xff\xff\xff추P\xff\xff\xff\xff\xed\xcfq\xe0\xff\xff\xff\xff\xee\x99\x19P\xff\xff\xff\xffﰥ`\xff\xff\xff\xff\xf0zL\xd0\x00\x00\x00\x00\x04\xa6^`\x00\x00\x00\x00" +
-	"\x05+w\xd0\x00\x00\x00\x00\x06C\x03\xe0\x00\x00\x00\x00\a\f\xabP\x00\x00\x00\x00\b$7`\x00\x00\x00\x00\b\xed\xde\xd0\x00\x00\x00\x00\n\x05j\xe0\x00\x00\x00\x00\n\xcf\x12P\x00\x00\x00\x00\v\xe7\xef\xe0" +
-	"\x00\x00\x00\x00\f\xb1\x97P\x00\x00\x00\x00\r\xc9#`\x00\x00\x00\x00\x0e\x92\xca\xd0\x00\x00\x00\x00\x0f\xa9\x05`\x00\x00\x00\x00\x10r\xac\xd0\x00\x00\x00\x00\x1a\xf4.\xe0\x00\x00\x00\x00\x1bќ\xd0\x00\x00\x00\x00" +
-	"\x1c\xd5b`\x00\x00\x00\x00\x1d\xb2\xd0P\x00\x00\x00\x00\x1e\xb6\x95\xe0\x00\x00\x00\x00\x1f\x94\x03\xd0\x00\x00\x00\x00 \x97\xc9`\x00\x00\x00\x00!u7P\x00\x00\x00\x00\"\xa3,\xe0\x00\x00\x00\x00#W\xbcP" +
-	"\x00\x00\x00\x00$g_`\x00\x00\x00\x00%8\xef\xd0\x00\x00\x00\x00&<\xb5`\x00\x00\x00\x00'\x1a#P\x00\x00\x00\x00(\x1d\xe8\xe0\x00\x00\x00\x00(\xfbV\xd0\x00\x00\x00\x00*\x00m\xe0\x00\x00\x00\x00" +
-	"*\xce\t\xd0\x00\x00\x00\x00+\xb4\xce`\x00\x00\x00\x00,\xa4\xb1P\x00\x00\x00\x00-\x94\xb0`\x00\x00\x00\x00.\x84\x93P\x00\x00\x00\x00/t\x92`\x00\x00\x00\x000duP\x00\x00\x00\x001]\xae\xe0" +
-	"\x00\x00\x00\x002M\x91\xd0\x00\x00\x00\x003=\x90\xe0\x00\x00\x00\x004-s\xd0\x00\x00\x00\x005\x1dr\xe0\x00\x00\x00\x006\rU\xd0\x00\x00\x00\x006\xfdT\xe0\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x00\x00!H\x00\x00\x00\x00" +
-	"*0\x01\x04\x00\x00\x1c \x00\tLMT\x00EEST\x00EET\x00\nEET-2EEST,M3.5.0/0,M10.5.0/0\nPK\x03\x04\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x000]*\x1bj\x02\x00\x00j\x02\x00\x00\f\x00\x00\x00Asia/BishkekTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x004\x00\x00\x00\x05\x00\x00\x00\x10\xff\xff\xff\xff\xaa\x19~\x10\xff\xff\xff\xff\xb5\xa3\xef0\x00\x00\x00\x00\x15'}\xa0\x00\x00\x00\x00\x16\x18\xb2\x10\x00\x00\x00\x00\x17\b\xb1 \x00\x00\x00\x00\x17\xf9\xe5\x90\x00\x00" +
-	"\x00\x00\x18\xe9\xe4\xa0\x00\x00\x00\x00\x19\xdb\x19\x10\x00\x00\x00\x00\x1a\xcci\xa0\x00\x00\x00\x00\x1b\xbcv\xc0\x00\x00\x00\x00\x1c\xacg\xc0\x00\x00\x00\x00\x1d\x9cX\xc0\x00\x00\x00\x00\x1e\x8cI\xc0\x00\x00\x00\x00\x1f|" +
-	":\xc0\x00\x00\x00\x00 l+\xc0\x00\x00\x00\x00!\\\x1c\xc0\x00\x00\x00\x00\"L\r\xc0\x00\x00\x00\x00#;\xfe\xc0\x00\x00\x00\x00$+\xef\xc0\x00\x00\x00\x00%\x1b\xe0\xc0\x00\x00\x00\x00&\v\xd1\xc0\x00\x00" +
-	"\x00\x00'\x04\xfd@\x00\x00\x00\x00'\xf4\xee@\x00\x00\x00\x00(\xbe\xa3\xc0\x00\x00\x00\x00)\xe770\x00\x00\x00\x00*ĥ \x00\x00\x00\x00+\xc7\x190\x00\x00\x00\x00,\xa4\x87 \x00\x00\x00\x00-\xa6" +
-	"\xfb0\x00\x00\x00\x00.\x84i \x00\x00\x00\x00/\x86\xdd0\x00\x00\x00\x000dK \x00\x00\x00\x001f\xbf0\x00\x00\x00\x002Mg\xa0\x00\x00\x00\x003=\x89\xd8\x00\x00\x00\x004RV\xc8\x00\x00" +
-	"\x00\x005\x1dk\xd8\x00\x00\x00\x00628\xc8\x00\x00\x00\x006\xfdM\xd8\x00\x00\x00\x008\x1bUH\x00\x00\x00\x008\xdd/\xd8\x00\x00\x00\x009\xfb7H\x00\x00\x00\x00:\xbd\x11\xd8\x00\x00\x00\x00;\xdb" +
-	"\x19H\x00\x00\x00\x00<\xa6.X\x00\x00\x00\x00=\xba\xfbH\x00\x00\x00\x00>\x86\x10X\x00\x00\x00\x00?\x9a\xddH\x00\x00\x00\x00@e\xf2X\x00\x00\x00\x00A\x83\xf9\xc8\x00\x00\x00\x00BE\xd4X\x00\x00" +
-	"\x00\x00B\xfb\x92 \x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x03\x00\x00" +
-	"E\xf0\x00\x00\x00\x00FP\x00\x04\x00\x00bp\x01\b\x00\x00T`\x00\f\x00\x00T`\x01\fLMT\x00+05\x00+07\x00+06\x00\n<+06>-6\nPK\x03\x04\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\xa7f^]@\x01\x00\x00@\x01\x00\x00\v\x00\x00\x00Asia/BruneiTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x12\x00\x00\x00\x05\x00\x00\x00\x18\xff\xff\xff\xff\xad\x8a\x06\x90\xff\xff\xff\xff\xbagG\x88\xff\xff\xff\xff\xbf{'\x80\xff\xff\xff\xff\xbf\xf3\x1bP\xff\xff\xff\xff\xc1]\xac\x80\xff\xff\xff\xff\xc1ՠP\xff\xff\xff" +
-	"\xff\xc3>\xe0\x00\xff\xff\xff\xffö\xd3\xd0\xff\xff\xff\xff\xc5 \x13\x80\xff\xff\xff\xffŘ\aP\xff\xff\xff\xff\xc7\x01G\x00\xff\xff\xff\xff\xc7y:\xd0\xff\xff\xff\xff\xc8\xe3\xcc\x00\xff\xff\xff\xff\xc9[\xbf" +
-	"\xd0\xff\xff\xff\xff\xca\xc4\xff\x80\xff\xff\xff\xff\xcb<\xf3P\xff\xff\xff\xffˑX\x00\xff\xff\xff\xff\xd2Hm\xf0\x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x04\x03\x00\x00gp\x00\x00\x00\x00i" +
-	"x\x00\x04\x00\x00u0\x01\n\x00\x00p\x80\x00\x10\x00\x00~\x90\x00\x14LMT\x00+0730\x00+0820\x00+08\x00+09\x00\n<+08>-8\nPK\x03\x04\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x9a\x1a\xdc\xca\xdc\x00\x00\x00\xdc\x00\x00\x00\r\x00\x00\x00Asia/CalcuttaTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\a\x00\x00\x00\x05\x00\x00\x00\x16\xff\xff\xff\xff&\xba\x18(\xff\xff\xff\xffC\xe7\xeb0\xff\xff\xff\xff\x87\x9d\xbc\xba\xff\xff\xff\xff\xcaی(\xff\xff\xff\xff\xcc\x05q\x18\xff\xff\xff\xff̕2\xa8" +
-	"\xff\xff\xff\xff\xd2t\x12\x98\x01\x02\x03\x04\x03\x04\x03\x00\x00R\xd8\x00\x00\x00\x00R\xd0\x00\x04\x00\x00KF\x00\b\x00\x00MX\x00\f\x00\x00[h\x01\x10LMT\x00HMT\x00MMT\x00IST" +
-	"\x00+0630\x00\nIST-5:30\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xab\xcd\xdf\x05\xee\x02\x00\x00\xee\x02\x00\x00\n\x00\x00\x00Asia/ChitaTZi" +
-	"f2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00B\x00\x00\x00\x06\x00\x00\x00\x10\xff\xff\xff\xff\xa1\xdb\xf9\xa0\xff\xff\xff\xff\xb5\xa3\xc5\x00\x00\x00\x00\x00\x15'Sp\x00\x00\x00\x00" +
-	"\x16\x18\x87\xe0\x00\x00\x00\x00\x17\b\x86\xf0\x00\x00\x00\x00\x17\xf9\xbb`\x00\x00\x00\x00\x18\xe9\xbap\x00\x00\x00\x00\x19\xda\xee\xe0\x00\x00\x00\x00\x1a\xcc?p\x00\x00\x00\x00\x1b\xbcL\x90\x00\x00\x00\x00\x1c\xac=\x90" +
-	"\x00\x00\x00\x00\x1d\x9c.\x90\x00\x00\x00\x00\x1e\x8c\x1f\x90\x00\x00\x00\x00\x1f|\x10\x90\x00\x00\x00\x00 l\x01\x90\x00\x00\x00\x00![\xf2\x90\x00\x00\x00\x00\"K\xe3\x90\x00\x00\x00\x00#;Ԑ\x00\x00\x00\x00" +
-	"$+Ő\x00\x00\x00\x00%\x1b\xb6\x90\x00\x00\x00\x00&\v\xa7\x90\x00\x00\x00\x00'\x04\xd3\x10\x00\x00\x00\x00'\xf4\xc4\x10\x00\x00\x00\x00(\xe4\xc3 \x00\x00\x00\x00)xk \x00\x00\x00\x00)Ԧ\x10" +
-	"\x00\x00\x00\x00*ė\x10\x00\x00\x00\x00+\xb4\x88\x10\x00\x00\x00\x00,\xa4y\x10\x00\x00\x00\x00-\x94j\x10\x00\x00\x00\x00.\x84[\x10\x00\x00\x00\x00/tL\x10\x00\x00\x00\x000d=\x10\x00\x00\x00\x00" +
-	"1]h\x90\x00\x00\x00\x002rC\x90\x00\x00\x00\x003=J\x90\x00\x00\x00\x004R%\x90\x00\x00\x00\x005\x1d,\x90\x00\x00\x00\x0062\a\x90\x00\x00\x00\x006\xfd\x0e\x90\x00\x00\x00\x008\x1b$\x10" +
-	"\x00\x00\x00\x008\xdc\xf0\x90\x00\x00\x00\x009\xfb\x06\x10\x00\x00\x00\x00:\xbcҐ\x00\x00\x00\x00;\xda\xe8\x10\x00\x00\x00\x00<\xa5\xef\x10\x00\x00\x00\x00=\xba\xca\x10\x00\x00\x00\x00>\x85\xd1\x10\x00\x00\x00\x00" +
-	"?\x9a\xac\x10\x00\x00\x00\x00@e\xb3\x10\x00\x00\x00\x00A\x83Ȑ\x00\x00\x00\x00BE\x95\x10\x00\x00\x00\x00Cc\xaa\x90\x00\x00\x00\x00D%w\x10\x00\x00\x00\x00EC\x8c\x90\x00\x00\x00\x00F\x05Y\x10" +
-	"\x00\x00\x00\x00G#n\x90\x00\x00\x00\x00G\xeeu\x90\x00\x00\x00\x00I\x03P\x90\x00\x00\x00\x00I\xceW\x90\x00\x00\x00\x00J\xe32\x90\x00\x00\x00\x00K\xae9\x90\x00\x00\x00\x00L\xccO\x10\x00\x00\x00\x00" +
-	"M\x8e\x1b\x90\x00\x00\x00\x00TK\xc9\x00\x00\x00\x00\x00V\xf6\xce \x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x04\x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02" +
-	"\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x05\x01\x03\x00\x00j`\x00\x00\x00\x00p\x80\x00\x04\x00\x00\x8c\xa0\x01\b\x00\x00~\x90\x00\f\x00\x00~\x90\x01\f\x00\x00\x8c\xa0" +
-	"\x00\bLMT\x00+08\x00+10\x00+09\x00\n<+09>-9\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x81z&\x80k\x02\x00\x00k\x02\x00\x00\x0f\x00\x00\x00Asi" +
-	"a/ChoibalsanTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00" +
-	"\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x003\x00\x00\x00\x06\x00\x00\x00\x14\xff\xff\xff\xff\x86\xd3\xe7(\x00\x00\x00\x00\x0f" +
-	"\vܐ\x00\x00\x00\x00\x18\xe9Ȁ\x00\x00\x00\x00\x19\xda\xee\xe0\x00\x00\x00\x00\x1a\xcc?p\x00\x00\x00\x00\x1b\xbc\"`\x00\x00\x00\x00\x1c\xac!p\x00\x00\x00\x00\x1d\x9c\x04`\x00\x00\x00\x00\x1e\x8c\x03p\x00" +
-	"\x00\x00\x00\x1f{\xe6`\x00\x00\x00\x00 k\xe5p\x00\x00\x00\x00![\xc8`\x00\x00\x00\x00\"K\xc7p\x00\x00\x00\x00#;\xaa`\x00\x00\x00\x00$+\xa9p\x00\x00\x00\x00%\x1b\x8c`\x00\x00\x00\x00&" +
-	"\v\x8bp\x00\x00\x00\x00'\x04\xa8\xe0\x00\x00\x00\x00'\xf4\xa7\xf0\x00\x00\x00\x00(\xe4\x8a\xe0\x00\x00\x00\x00)ԉ\xf0\x00\x00\x00\x00*\xc4l\xe0\x00\x00\x00\x00+\xb4k\xf0\x00\x00\x00\x00,\xa4N\xe0\x00" +
-	"\x00\x00\x00-\x94M\xf0\x00\x00\x00\x00.\x840\xe0\x00\x00\x00\x00/t/\xf0\x00\x00\x00\x000d\x12\xe0\x00\x00\x00\x001]Lp\x00\x00\x00\x002M/`\x00\x00\x00\x003=.p\x00\x00\x00\x004" +
-	"-\x11`\x00\x00\x00\x005\x1d\x10p\x00\x00\x00\x006\f\xf3`\x00\x00\x00\x00:饐\x00\x00\x00\x00;\xb4\x9e\x80\x00\x00\x00\x00<\xa4\x9d\x90\x00\x00\x00\x00=\x94\x80\x80\x00\x00\x00\x00>\x84\x7f\x90\x00" +
-	"\x00\x00\x00?tb\x80\x00\x00\x00\x00@da\x90\x00\x00\x00\x00ATD\x80\x00\x00\x00\x00BDC\x90\x00\x00\x00\x00C4&\x80\x00\x00\x00\x00D$%\x90\x00\x00\x00\x00E\x1dC\x00\x00\x00\x00\x00G" +
-	"\xef\xaa\xf0\x00\x00\x00\x00U\x15\x9a\xa0\x00\x00\x00\x00V\x05ap\x00\x00\x00\x00V\xf5|\xa0\x00\x00\x00\x00W\xe5Cp\x01\x02\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04" +
-	"\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x02\x05\x02\x05\x02\x00\x00kX\x00\x00\x00\x00bp\x00\x04\x00\x00p\x80\x00\b\x00\x00~\x90\x00\f\x00\x00\x8c\xa0\x01\x10\x00\x00~\x90" +
-	"\x01\fLMT\x00+07\x00+08\x00+09\x00+10\x00\n<+08>-8\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00*\xe4@\xa9\x89\x01\x00\x00\x89\x01\x00\x00\x0e\x00\x00" +
-	"\x00Asia/ChongqingTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00" +
-	"\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1d\x00\x00\x00\x03\x00\x00\x00\f\xff\xff\xff\xff~6C)\xff\xff" +
-	"\xff\xff\xa0\x97\xa2\x80\xff\xff\xff\xff\xa1y\x04\xf0\xff\xff\xff\xff\xc8Y^\x80\xff\xff\xff\xff\xc9\t\xf9p\xff\xff\xff\xff\xc9ӽ\x00\xff\xff\xff\xff\xcb\x05\x8a\xf0\xff\xff\xff\xff\xcb|@\x00\xff\xff\xff\xff\xd2;" +
-	">\xf0\xff\xff\xff\xffӋ{\x80\xff\xff\xff\xff\xd4B\xad\xf0\xff\xff\xff\xff\xd5E\"\x00\xff\xff\xff\xff\xd6L\xbf\xf0\xff\xff\xff\xff\xd7<\xbf\x00\xff\xff\xff\xff\xd8\x06fp\xff\xff\xff\xff\xd9\x1d\xf2\x80\xff\xff" +
-	"\xff\xff\xd9A|\xf0\x00\x00\x00\x00\x1e\xbaR \x00\x00\x00\x00\x1fi\x9b\x90\x00\x00\x00\x00 ~\x84\xa0\x00\x00\x00\x00!I}\x90\x00\x00\x00\x00\"g\xa1 \x00\x00\x00\x00#)_\x90\x00\x00\x00\x00$G" +
-	"\x83 \x00\x00\x00\x00%\x12|\x10\x00\x00\x00\x00&'e \x00\x00\x00\x00&\xf2^\x10\x00\x00\x00\x00(\aG \x00\x00\x00\x00(\xd2@\x10\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x00\x00q\xd7\x00\x00\x00\x00~\x90\x01\x04\x00\x00p\x80\x00\bLMT\x00CDT\x00CST\x00\nCST-8\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00*\xe4@\xa9\x89\x01\x00\x00\x89\x01\x00\x00\x0e\x00\x00\x00Asia/ChungkingTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1d\x00" +
-	"\x00\x00\x03\x00\x00\x00\f\xff\xff\xff\xff~6C)\xff\xff\xff\xff\xa0\x97\xa2\x80\xff\xff\xff\xff\xa1y\x04\xf0\xff\xff\xff\xff\xc8Y^\x80\xff\xff\xff\xff\xc9\t\xf9p\xff\xff\xff\xff\xc9ӽ\x00\xff\xff\xff\xff\xcb" +
-	"\x05\x8a\xf0\xff\xff\xff\xff\xcb|@\x00\xff\xff\xff\xff\xd2;>\xf0\xff\xff\xff\xffӋ{\x80\xff\xff\xff\xff\xd4B\xad\xf0\xff\xff\xff\xff\xd5E\"\x00\xff\xff\xff\xff\xd6L\xbf\xf0\xff\xff\xff\xff\xd7<\xbf\x00\xff" +
-	"\xff\xff\xff\xd8\x06fp\xff\xff\xff\xff\xd9\x1d\xf2\x80\xff\xff\xff\xff\xd9A|\xf0\x00\x00\x00\x00\x1e\xbaR \x00\x00\x00\x00\x1fi\x9b\x90\x00\x00\x00\x00 ~\x84\xa0\x00\x00\x00\x00!I}\x90\x00\x00\x00\x00\"" +
-	"g\xa1 \x00\x00\x00\x00#)_\x90\x00\x00\x00\x00$G\x83 \x00\x00\x00\x00%\x12|\x10\x00\x00\x00\x00&'e \x00\x00\x00\x00&\xf2^\x10\x00\x00\x00\x00(\aG \x00\x00\x00\x00(\xd2@\x10\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x00\x00q\xd7\x00\x00\x00\x00~\x90\x01\x04\x00\x00p\x80\x00\bLMT\x00CDT\x00CST\x00\nC" +
-	"ST-8\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\\\x91\x87\xbb\xf7\x00\x00\x00\xf7\x00\x00\x00\f\x00\x00\x00Asia/ColomboTZif2\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\b\x00\x00\x00\a\x00\x00\x00\x18\xff\xff\xff\xffV\xb6\x99$\xff\xff\xff\xff\x87\x9d\xbd\x1c\xff\xff\xff\xff\xcbZ\x1c(\xff\xff\xff\xff̕+\xa0\xff\xff\xff\xff\xd2u" +
-	"\x808\x00\x00\x00\x001\xa6\x00(\x00\x00\x00\x002q\x00 \x00\x00\x00\x00D?\xea(\x01\x02\x03\x04\x02\x05\x06\x02\x00\x00J\xdc\x00\x00\x00\x00J\xe4\x00\x04\x00\x00MX\x00\b\x00\x00T`\x01\x0e\x00\x00" +
-	"[h\x01\x12\x00\x00[h\x00\x12\x00\x00T`\x00\x0eLMT\x00MMT\x00+0530\x00+06\x00+0630\x00\n<+0530>-5:30\nPK\x03\x04\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00?Y\xaf\x19\xe7\x00\x00\x00\xe7\x00\x00\x00\n\x00\x00\x00Asia/DaccaTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\a\x00\x00\x00\x06\x00\x00\x00\x1c\xff\xff\xff\xffi\x86\x86\xbc\xff\xff\xff\xff\xcaۆ\xb0\xff\xff\xff\xff\xcc\x05q\x18\xff\xff\xff\xff̕2\xa8\xff\xff\xff\xffݨҘ\x00\x00\x00\x00J;\xc4\x10\x00\x00\x00" +
-	"\x00K<ؐ\x01\x02\x03\x02\x04\x05\x04\x00\x00T\xc4\x00\x00\x00\x00R\xd0\x00\x04\x00\x00[h\x00\b\x00\x00MX\x00\x0e\x00\x00T`\x00\x14\x00\x00bp\x01\x18LMT\x00HMT\x00+063" +
-	"0\x00+0530\x00+06\x00+07\x00\n<+06>-6\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x87\a\xeci\xd2\x04\x00\x00\xd2\x04\x00\x00\r\x00\x00\x00Asia/" +
-	"DamascusTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00T" +
-	"Zif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00y\x00\x00\x00\x04\x00\x00\x00\x11\xff\xff\xff\xff\xa1\xf2\xabx\xff\xff\xff\xff\xa2\x81/\x80\xff" +
-	"\xff\xff\xff\xa3^\x9dp\xff\xff\xff\xff\xa4a\x11\x80\xff\xff\xff\xff\xa5>\x7fp\xff\xff\xff\xff\xa6@\xf3\x80\xff\xff\xff\xff\xa7\x1eap\xff\xff\xff\xff\xa8 Հ\xff\xff\xff\xff\xa9\a}\xf0\xff\xff\xff\xff\xf1" +
-	"\x8fR\x00\xff\xff\xff\xff\xf2[\x9cp\xff\xff\xff\xff\xf3s(\x80\xff\xff\xff\xff\xf4;~p\xff\xff\xff\xff\xf5U\xad\x80\xff\xff\xff\xff\xf6\x1fT\xf0\xff\xff\xff\xff\xf76\xe1\x00\xff\xff\xff\xff\xf7\xff6\xf0\xff" +
-	"\xff\xff\xff\xf9\x0e\xda\x00\xff\xff\xff\xff\xf9\xe1\xbb\xf0\xff\xff\xff\xff\xfa\xf9H\x00\xff\xff\xff\xff\xfb\xc2\xefp\xff\xff\xff\xff\xfc\xdb\xcd\x00\xff\xff\xff\xff\xfd\xa5tp\xff\xff\xff\xff\xfe\xbd\x00\x80\xff\xff\xff\xff\xff" +
-	"\x86\xa7\xf0\x00\x00\x00\x00\x00\x9e4\x00\x00\x00\x00\x00\x01g\xdbp\x00\x00\x00\x00\x02\x7fg\x80\x00\x00\x00\x00\x03I\x0e\xf0\x00\x00\x00\x00\x04a\xec\x80\x00\x00\x00\x00\x05+\x93\xf0\x00\x00\x00\x00\x06C \x00\x00" +
-	"\x00\x00\x00\a\f\xc7p\x00\x00\x00\x00\b$S\x80\x00\x00\x00\x00\b\xed\xfa\xf0\x00\x00\x00\x00\n\x05\x87\x00\x00\x00\x00\x00\n\xcf.p\x00\x00\x00\x00\v\xe8\f\x00\x00\x00\x00\x00\f\xb1\xb3p\x00\x00\x00\x00\r" +
-	"\xc9?\x80\x00\x00\x00\x00\x0ekY\xf0\x00\x00\x00\x00\x0f\xaas\x00\x00\x00\x00\x00\x10L\x8dp\x00\x00\x00\x00\x18\xf4\xc5\x00\x00\x00\x00\x00\x19\xdbmp\x00\x00\x00\x00\x1a\xd7J\x00\x00\x00\x00\x00\x1b\xbd\xf2p\x00" +
-	"\x00\x00\x00\x1eU#\x00\x00\x00\x00\x00\x1f\x8a\xe5p\x00\x00\x00\x00 Gz\x00\x00\x00\x00\x00!\x89\x19\xf0\x00\x00\x00\x00\"<t\x00\x00\x00\x00\x00#k\x9e\xf0\x00\x00\x00\x00$2\xbf\x80\x00\x00\x00\x00%" +
-	"%Ep\x00\x00\x00\x00&\x15D\x80\x00\x00\x00\x00'\x05'p\x00\x00\x00\x00'\xf6[\xe0\x00\x00\x00\x00(\xe7\x90P\x00\x00\x00\x00)\xe2\x1b`\x00\x00\x00\x00*\xca\x15P\x00\x00\x00\x00+\xb2+`\x00" +
-	"\x00\x00\x00,\xa3_\xd0\x00\x00\x00\x00-\x9bG\xe0\x00\x00\x00\x00.\x8c|P\x00\x00\x00\x00/|{`\x00\x00\x00\x000m\xaf\xd0\x00\x00\x00\x001_\x00`\x00\x00\x00\x002P4\xd0\x00\x00\x00\x003" +
-	">\xe2`\x00\x00\x00\x0041hP\x00\x00\x00\x005\x1e\xc4`\x00\x00\x00\x006\x12\x9b\xd0\x00\x00\x00\x007\x02\x9a\xe0\x00\x00\x00\x007\xf3\xcfP\x00\x00\x00\x008\xe5\x1f\xe0\x00\x00\x00\x009\xd6TP\x00" +
-	"\x00\x00\x00:\xc6S`\x00\x00\x00\x00;\xb7\x87\xd0\x00\x00\x00\x00<\xa7\x86\xe0\x00\x00\x00\x00=\x98\xbbP\x00\x00\x00\x00>\x88\xba`\x00\x00\x00\x00?y\xee\xd0\x00\x00\x00\x00@k?`\x00\x00\x00\x00A" +
-	"\\s\xd0\x00\x00\x00\x00BLr\xe0\x00\x00\x00\x00C=\xa7P\x00\x00\x00\x00D-\xa6`\x00\x00\x00\x00E\x12\xfdP\x00\x00\x00\x00F\f6\xe0\x00\x00\x00\x00G*>P\x00\x00\x00\x00G\xf5S`\x00" +
-	"\x00\x00\x00I\vq\xd0\x00\x00\x00\x00I\xcb\xfa\xe0\x00\x00\x00\x00J\xea\x02P\x00\x00\x00\x00K\xb5\x17`\x00\x00\x00\x00L\xc9\xe4P\x00\x00\x00\x00M\x94\xf9`\x00\x00\x00\x00N\xa9\xc6P\x00\x00\x00\x00O" +
-	"t\xdb`\x00\x00\x00\x00P\x89\xa8P\x00\x00\x00\x00QT\xbd`\x00\x00\x00\x00Ri\x8aP\x00\x00\x00\x00S4\x9f`\x00\x00\x00\x00TR\xa6\xd0\x00\x00\x00\x00U\x14\x81`\x00\x00\x00\x00V2\x88\xd0\x00" +
-	"\x00\x00\x00V\xf4c`\x00\x00\x00\x00X\x12j\xd0\x00\x00\x00\x00X\xdd\x7f\xe0\x00\x00\x00\x00Y\xf2L\xd0\x00\x00\x00\x00Z\xbda\xe0\x00\x00\x00\x00[\xd2.\xd0\x00\x00\x00\x00\\\x9dC\xe0\x00\x00\x00\x00]" +
-	"\xb2\x10\xd0\x00\x00\x00\x00^}%\xe0\x00\x00\x00\x00_\x9b-P\x00\x00\x00\x00`]\a\xe0\x00\x00\x00\x00a{\x0fP\x00\x00\x00\x00b<\xe9\xe0\x00\x00\x00\x00cZ\xf1P\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x03\x00\x00\"\b\x00\x00\x00\x00" +
-	"*0\x01\x04\x00\x00\x1c \x00\t\x00\x00*0\x00\rLMT\x00EEST\x00EET\x00+03\x00\n<+03>-3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?Y\xaf\x19" +
-	"\xe7\x00\x00\x00\xe7\x00\x00\x00\n\x00\x00\x00Asia/DhakaTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\x1c\xff\xff\xff" +
-	"\xffi\x86\x86\xbc\xff\xff\xff\xff\xcaۆ\xb0\xff\xff\xff\xff\xcc\x05q\x18\xff\xff\xff\xff̕2\xa8\xff\xff\xff\xffݨҘ\x00\x00\x00\x00J;\xc4\x10\x00\x00\x00\x00K<ؐ\x01\x02\x03\x02\x04\x05\x04" +
-	"\x00\x00T\xc4\x00\x00\x00\x00R\xd0\x00\x04\x00\x00[h\x00\b\x00\x00MX\x00\x0e\x00\x00T`\x00\x14\x00\x00bp\x01\x18LMT\x00HMT\x00+0630\x00+0530\x00+06\x00" +
-	"+07\x00\n<+06>-6\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Β\x1a\x8c\xaa\x00\x00\x00\xaa\x00\x00\x00\t\x00\x00\x00Asia/DiliTZif2\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x03\x00\x00\x00\f\xff\xff\xff\xff\x92\xe6\x18\xc4\xff\xff\xff\xff˙2\xf0\x00\x00\x00\x00\v\xea0p\x00\x00\x00\x009Ù\x00\x01" +
-	"\x02\x01\x02\x00\x00u\xbc\x00\x00\x00\x00p\x80\x00\x04\x00\x00~\x90\x00\bLMT\x00+08\x00+09\x00\n<+09>-9\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xed\x8c\xf1\x91" +
-	"\x85\x00\x00\x00\x85\x00\x00\x00\n\x00\x00\x00Asia/DubaiTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\b\xff\xff\xff" +
-	"\xff\xa1\xf2\x99\xa8\x01\x00\x003\xd8\x00\x00\x00\x008@\x00\x04LMT\x00+04\x00\n<+04>-4\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00's\x96\x1en\x01\x00\x00n\x01\x00" +
-	"\x00\r\x00\x00\x00Asia/DushanbeTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" +
-	"\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x05\x00\x00\x00\x10\xff\xff\xff\xff\xaa\x19\x83" +
-	"\x80\xff\xff\xff\xff\xb5\xa3\xef0\x00\x00\x00\x00\x15'}\xa0\x00\x00\x00\x00\x16\x18\xb2\x10\x00\x00\x00\x00\x17\b\xb1 \x00\x00\x00\x00\x17\xf9\xe5\x90\x00\x00\x00\x00\x18\xe9\xe4\xa0\x00\x00\x00\x00\x19\xdb\x19\x10\x00\x00\x00" +
-	"\x00\x1a\xcci\xa0\x00\x00\x00\x00\x1b\xbcv\xc0\x00\x00\x00\x00\x1c\xacg\xc0\x00\x00\x00\x00\x1d\x9cX\xc0\x00\x00\x00\x00\x1e\x8cI\xc0\x00\x00\x00\x00\x1f|:\xc0\x00\x00\x00\x00 l+\xc0\x00\x00\x00\x00!\\\x1c" +
-	"\xc0\x00\x00\x00\x00\"L\r\xc0\x00\x00\x00\x00#;\xfe\xc0\x00\x00\x00\x00$+\xef\xc0\x00\x00\x00\x00%\x1b\xe0\xc0\x00\x00\x00\x00&\v\xd1\xc0\x00\x00\x00\x00'\x04\xfd@\x00\x00\x00\x00'\xf4\xee@\x00\x00\x00" +
-	"\x00(ʏP\x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x04\x01\x00\x00@\x80\x00\x00\x00\x00FP\x00\x04\x00\x00bp\x01\b\x00\x00T`\x00\f\x00\x00T`\x01\fL" +
-	"MT\x00+05\x00+07\x00+06\x00\n<+05>-5\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00]S\xbb\x12\xac\x03\x00\x00\xac\x03\x00\x00\x0e\x00\x00\x00Asia/F" +
-	"amagustaTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00T" +
-	"Zif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00V\x00\x00\x00\x04\x00\x00\x00\x11\xff\xff\xff\xff\xa5w\x1e,\x00\x00\x00\x00\t\xed\xaf\xe0\x00" +
-	"\x00\x00\x00\nݒ\xd0\x00\x00\x00\x00\v\xfad\xe0\x00\x00\x00\x00\f\xbe\xc6P\x00\x00\x00\x00\r\xa49`\x00\x00\x00\x00\x0e\x8a\xe1\xd0\x00\x00\x00\x00\x0f\x84\x1b`\x00\x00\x00\x00\x10uO\xd0\x00\x00\x00\x00\x11" +
-	"c\xfd`\x00\x00\x00\x00\x12S\xe0P\x00\x00\x00\x00\x13M\x19\xe0\x00\x00\x00\x00\x143\xc2P\x00\x00\x00\x00\x15#\xc1`\x00\x00\x00\x00\x16\x13\xa4P\x00\x00\x00\x00\x17\x03\xa3`\x00\x00\x00\x00\x17\xf3\x86P\x00" +
-	"\x00\x00\x00\x18\xe3\x85`\x00\x00\x00\x00\x19\xd3hP\x00\x00\x00\x00\x1a\xc3g`\x00\x00\x00\x00\x1b\xbc\x84\xd0\x00\x00\x00\x00\x1c\xac\x83\xe0\x00\x00\x00\x00\x1d\x9cf\xd0\x00\x00\x00\x00\x1e\x8ce\xe0\x00\x00\x00\x00\x1f" +
-	"|H\xd0\x00\x00\x00\x00 lG\xe0\x00\x00\x00\x00!\\*\xd0\x00\x00\x00\x00\"L)\xe0\x00\x00\x00\x00#<\f\xd0\x00\x00\x00\x00$,\v\xe0\x00\x00\x00\x00%\x1b\xee\xd0\x00\x00\x00\x00&\v\xed\xe0\x00" +
-	"\x00\x00\x00'\x05\vP\x00\x00\x00\x00'\xf5\n`\x00\x00\x00\x00(\xe4\xedP\x00\x00\x00\x00)\xd4\xec`\x00\x00\x00\x00*\xc4\xcfP\x00\x00\x00\x00+\xb4\xce`\x00\x00\x00\x00,\xa4\xb1P\x00\x00\x00\x00-" +
-	"\x94\xb0`\x00\x00\x00\x00.\x84\x93P\x00\x00\x00\x00/t\x92`\x00\x00\x00\x000duP\x00\x00\x00\x001]\xae\xe0\x00\x00\x00\x002M\x91\xd0\x00\x00\x00\x003=\x90\xe0\x00\x00\x00\x004-s\xd0\x00" +
-	"\x00\x00\x005\x1dr\xe0\x00\x00\x00\x0062x\x10\x00\x00\x00\x006\xfd\x7f\x10\x00\x00\x00\x008\x1b\x94\x90\x00\x00\x00\x008\xdda\x10\x00\x00\x00\x009\xfbv\x90\x00\x00\x00\x00:\xbdC\x10\x00\x00\x00\x00;" +
-	"\xdbX\x90\x00\x00\x00\x00<\xa6_\x90\x00\x00\x00\x00=\xbb:\x90\x00\x00\x00\x00>\x86A\x90\x00\x00\x00\x00?\x9b\x1c\x90\x00\x00\x00\x00@f#\x90\x00\x00\x00\x00A\x849\x10\x00\x00\x00\x00BF\x05\x90\x00" +
-	"\x00\x00\x00Cd\x1b\x10\x00\x00\x00\x00D%\xe7\x90\x00\x00\x00\x00EC\xfd\x10\x00\x00\x00\x00F\x05ɐ\x00\x00\x00\x00G#\xdf\x10\x00\x00\x00\x00G\xee\xe6\x10\x00\x00\x00\x00I\x03\xc1\x10\x00\x00\x00\x00I" +
-	"\xce\xc8\x10\x00\x00\x00\x00J\xe3\xa3\x10\x00\x00\x00\x00K\xae\xaa\x10\x00\x00\x00\x00L̿\x90\x00\x00\x00\x00M\x8e\x8c\x10\x00\x00\x00\x00N\xac\xa1\x90\x00\x00\x00\x00Onn\x10\x00\x00\x00\x00P\x8c\x83\x90\x00" +
-	"\x00\x00\x00QW\x8a\x90\x00\x00\x00\x00Rle\x90\x00\x00\x00\x00S7l\x90\x00\x00\x00\x00TLG\x90\x00\x00\x00\x00U\x17N\x90\x00\x00\x00\x00V,)\x90\x00\x00\x00\x00V\xf70\x90\x00\x00\x00\x00W" +
-	"\xd0\x7f\xd0\x00\x00\x00\x00Y\xf5(\x10\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x03\x02\x00\x00\x1f\xd4\x00\x00\x00\x00*0\x01\x04\x00\x00\x1c \x00\t\x00\x00*0\x00" +
-	"\rLMT\x00EEST\x00EET\x00+03\x00\nEET-2EEST,M3.5.0/3,M10.5.0/4\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00= \x17x\xea\x04\x00\x00\xea\x04\x00\x00\t\x00\x00\x00Asia/GazaTZif3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00x\x00\x00\x00\x05\x00\x00" +
-	"\x00\x15\xff\xff\xff\xff}\xbdJ\xb0\xff\xff\xff\xff\xc8Y\xcf\x00\xff\xff\xff\xff\xc8\xfa\xa6\x00\xff\xff\xff\xff\xc98\x9c\x80\xff\xff\xff\xff\xcc\xe5\xeb\x80\xff\xff\xff\xffͬ\xfe\x00\xff\xff\xff\xff\xce\xc7\x1f\x00\xff\xff" +
-	"\xff\xffϏ\x83\x00\xff\xff\xff\xffЩ\xa4\x00\xff\xff\xff\xffф}\x00\xff\xff\xff\xffҊ׀\xff\xff\xff\xff\xd3e\xb0\x80\xff\xff\xff\xff\xd4l\v\x00\xff\xff\xff\xff\xe86c`\xff\xff\xff\xff\xe8\xf4" +
-	"-P\xff\xff\xff\xff\xea\v\xb9`\xff\xff\xff\xff\xea\xd5`\xd0\xff\xff\xff\xff\xeb\xec\xfa\xf0\xff\xff\xff\xff\xec\xb5m\x00\xff\xff\xff\xff\xed\xcf\x7f\xf0\xff\xff\xff\xff\xee\x97\xf2\x00\xff\xff\xff\xffﰳp\xff\xff" +
-	"\xff\xff\xf0y%\x80\xff\xff\xff\xff\xf1\x91\xe6\xf0\xff\xff\xff\xff\xf2ZY\x00\xff\xff\xff\xff\xf3s\x1ap\xff\xff\xff\xff\xf4;\x8c\x80\xff\xff\xff\xff\xf5U\x9fp\xff\xff\xff\xff\xf6\x1e\x11\x80\xff\xff\xff\xff\xf76" +
-	"\xd2\xf0\xff\xff\xff\xff\xf7\xffE\x00\xff\xff\xff\xff\xf9\x18\x06p\xff\xff\xff\xff\xf9\xe1\xca\x00\xff\xff\xff\xff\xfa\xf99\xf0\xff\xff\xff\xff\xfb'BP\x00\x00\x00\x00\b|\x8b\xe0\x00\x00\x00\x00\b\xfd\xb0\xd0\x00\x00" +
-	"\x00\x00\t\xf6\xea`\x00\x00\x00\x00\n\xa63\xd0\x00\x00\x00\x00\x13\xe9\xfc`\x00\x00\x00\x00\x14![`\x00\x00\x00\x00\x1a\xfa\xc6`\x00\x00\x00\x00\x1b\x8en`\x00\x00\x00\x00\x1c\xbe\xf8\xe0\x00\x00\x00\x00\x1dw" +
-	"|\xd0\x00\x00\x00\x00\x1e\xcc\xff`\x00\x00\x00\x00\x1f`\x99P\x00\x00\x00\x00 \x82\xb1`\x00\x00\x00\x00!I\xb5\xd0\x00\x00\x00\x00\"^\x9e\xe0\x00\x00\x00\x00# ]P\x00\x00\x00\x00$Z0`\x00\x00" +
-	"\x00\x00%\x00?P\x00\x00\x00\x00&\v\xed\xe0\x00\x00\x00\x00&\xd6\xe6\xd0\x00\x00\x00\x00'\xeb\xcf\xe0\x00\x00\x00\x00(\xc0\x03P\x00\x00\x00\x00)\xd4\xec`\x00\x00\x00\x00*\xa9\x1f\xd0\x00\x00\x00\x00+\xbb" +
-	"e\xe0\x00\x00\x00\x00,\x89\x01\xd0\x00\x00\x00\x00-\x9bG\xe0\x00\x00\x00\x00._\xa9P\x00\x00\x00\x00/{)\xe0\x00\x00\x00\x000H\xc5\xd0\x00\x00\x00\x000\xe7\a\xe0\x00\x00\x00\x001dF`\x00\x00" +
-	"\x00\x002A\xc2`\x00\x00\x00\x003D(`\x00\x00\x00\x004!\xa4`\x00\x00\x00\x005$\n`\x00\x00\x00\x006\x01\x86`\x00\x00\x00\x007\x16a`\x00\x00\x00\x008\x06DP\x00\x00\x00\x008\xff" +
-	"}\xe0\x00\x00\x00\x009\xef`\xd0\x00\x00\x00\x00:\xdf_\xe0\x00\x00\x00\x00;\xcfB\xd0\x00\x00\x00\x00<\xbfA\xe0\x00\x00\x00\x00=\xaf$\xd0\x00\x00\x00\x00>\x9f#\xe0\x00\x00\x00\x00?\x8f\x06\xd0\x00\x00" +
-	"\x00\x00@\x7f\x05\xe0\x00\x00\x00\x00A\\\x81\xe0\x00\x00\x00\x00B^\xe7\xe0\x00\x00\x00\x00CA\xb7\xf0\x00\x00\x00\x00D-\xa6`\x00\x00\x00\x00E\x12\xfdP\x00\x00\x00\x00F\x0e\xd9\xe0\x00\x00\x00\x00F\xe8" +
-	"op\x00\x00\x00\x00G\xec\x18\xe0\x00\x00\x00\x00H\xb7\x11\xd0\x00\x00\x00\x00I\xcb\xfa\xe0\x00\x00\x00\x00J\xa0<`\x00\x00\x00\x00K\xad.\x9c\x00\x00\x00\x00La\xbd\xd0\x00\x00\x00\x00M\x94\xf9\x9c\x00\x00" +
-	"\x00\x00N5\xc2P\x00\x00\x00\x00Ot\xdb`\x00\x00\x00\x00P[\x91\xe0\x00\x00\x00\x00QT\xbd`\x00\x00\x00\x00RD\xa0P\x00\x00\x00\x00S4\x9f`\x00\x00\x00\x00TIlP\x00\x00\x00\x00U\x15" +
-	"\xd2\xe0\x00\x00\x00\x00V)\\`\x00\x00\x00\x00V\xf5\xc2\xf0\x00\x00\x00\x00X\x13\xca`\x00\x00\x00\x00Xդ\xf0\x00\x00\x00\x00Y\xf3\xac`\x00\x00\x00\x00Z\xb5\x86\xf0\x00\x00\x00\x00[ӎ`\x00\x00" +
-	"\x00\x00\\\x9dC\xe0\x00\x00\x00\x00]\xb3bP\x00\x00\x00\x00^~w`\x00\x00\x00\x00_\x93R`\x00\x00\x00\x00`^Y`\x00\x00\x00\x00a{\x1d`\x00\x00\x00\x00b?\x8c\xe0\x00\x00\x00\x00c\\" +
-	"^\xf0\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03" +
-	"\x04\x03\x04\x03\x04\x03\x04\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x00\x00 P\x00\x00\x00\x00*0\x01\x04\x00\x00\x1c \x00\t\x00\x00*0\x01\r\x00\x00\x1c \x00\x11LMT\x00EEST\x00EET\x00IDT\x00IST\x00\nEET-2E" +
-	"EST,M3.4.4/50,M10.4.4/50\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00*\xe4@\xa9\x89\x01\x00\x00\x89\x01\x00\x00\v\x00\x00\x00Asia/" +
-	"HarbinTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZi" +
-	"f2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1d\x00\x00\x00\x03\x00\x00\x00\f\xff\xff\xff\xff~6C)\xff\xff\xff\xff\xa0\x97\xa2\x80\xff\xff\xff" +
-	"\xff\xa1y\x04\xf0\xff\xff\xff\xff\xc8Y^\x80\xff\xff\xff\xff\xc9\t\xf9p\xff\xff\xff\xff\xc9ӽ\x00\xff\xff\xff\xff\xcb\x05\x8a\xf0\xff\xff\xff\xff\xcb|@\x00\xff\xff\xff\xff\xd2;>\xf0\xff\xff\xff\xffӋ{" +
-	"\x80\xff\xff\xff\xff\xd4B\xad\xf0\xff\xff\xff\xff\xd5E\"\x00\xff\xff\xff\xff\xd6L\xbf\xf0\xff\xff\xff\xff\xd7<\xbf\x00\xff\xff\xff\xff\xd8\x06fp\xff\xff\xff\xff\xd9\x1d\xf2\x80\xff\xff\xff\xff\xd9A|\xf0\x00\x00\x00" +
-	"\x00\x1e\xbaR \x00\x00\x00\x00\x1fi\x9b\x90\x00\x00\x00\x00 ~\x84\xa0\x00\x00\x00\x00!I}\x90\x00\x00\x00\x00\"g\xa1 \x00\x00\x00\x00#)_\x90\x00\x00\x00\x00$G\x83 \x00\x00\x00\x00%\x12|" +
-	"\x10\x00\x00\x00\x00&'e \x00\x00\x00\x00&\xf2^\x10\x00\x00\x00\x00(\aG \x00\x00\x00\x00(\xd2@\x10\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x00\x00q\xd7\x00\x00\x00\x00~\x90\x01\x04\x00\x00p\x80\x00\bLMT\x00CDT\x00CST\x00\nCST-8\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00C\xbe\x86\xb6\xfc\x04\x00" +
-	"\x00\xfc\x04\x00\x00\v\x00\x00\x00Asia/HebronTZif3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" +
-	"\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00z\x00\x00\x00\x05\x00\x00\x00\x15\xff\xff\xff\xff}" +
-	"\xbdJ\x19\xff\xff\xff\xff\xc8Y\xcf\x00\xff\xff\xff\xff\xc8\xfa\xa6\x00\xff\xff\xff\xff\xc98\x9c\x80\xff\xff\xff\xff\xcc\xe5\xeb\x80\xff\xff\xff\xffͬ\xfe\x00\xff\xff\xff\xff\xce\xc7\x1f\x00\xff\xff\xff\xffϏ\x83\x00\xff" +
-	"\xff\xff\xffЩ\xa4\x00\xff\xff\xff\xffф}\x00\xff\xff\xff\xffҊ׀\xff\xff\xff\xff\xd3e\xb0\x80\xff\xff\xff\xff\xd4l\v\x00\xff\xff\xff\xff\xe86c`\xff\xff\xff\xff\xe8\xf4-P\xff\xff\xff\xff\xea" +
-	"\v\xb9`\xff\xff\xff\xff\xea\xd5`\xd0\xff\xff\xff\xff\xeb\xec\xfa\xf0\xff\xff\xff\xff\xec\xb5m\x00\xff\xff\xff\xff\xed\xcf\x7f\xf0\xff\xff\xff\xff\xee\x97\xf2\x00\xff\xff\xff\xffﰳp\xff\xff\xff\xff\xf0y%\x80\xff" +
-	"\xff\xff\xff\xf1\x91\xe6\xf0\xff\xff\xff\xff\xf2ZY\x00\xff\xff\xff\xff\xf3s\x1ap\xff\xff\xff\xff\xf4;\x8c\x80\xff\xff\xff\xff\xf5U\x9fp\xff\xff\xff\xff\xf6\x1e\x11\x80\xff\xff\xff\xff\xf76\xd2\xf0\xff\xff\xff\xff\xf7" +
-	"\xffE\x00\xff\xff\xff\xff\xf9\x18\x06p\xff\xff\xff\xff\xf9\xe1\xca\x00\xff\xff\xff\xff\xfa\xf99\xf0\xff\xff\xff\xff\xfb'BP\x00\x00\x00\x00\b|\x8b\xe0\x00\x00\x00\x00\b\xfd\xb0\xd0\x00\x00\x00\x00\t\xf6\xea`\x00" +
-	"\x00\x00\x00\n\xa63\xd0\x00\x00\x00\x00\x13\xe9\xfc`\x00\x00\x00\x00\x14![`\x00\x00\x00\x00\x1a\xfa\xc6`\x00\x00\x00\x00\x1b\x8en`\x00\x00\x00\x00\x1c\xbe\xf8\xe0\x00\x00\x00\x00\x1dw|\xd0\x00\x00\x00\x00\x1e" +
-	"\xcc\xff`\x00\x00\x00\x00\x1f`\x99P\x00\x00\x00\x00 \x82\xb1`\x00\x00\x00\x00!I\xb5\xd0\x00\x00\x00\x00\"^\x9e\xe0\x00\x00\x00\x00# ]P\x00\x00\x00\x00$Z0`\x00\x00\x00\x00%\x00?P\x00" +
-	"\x00\x00\x00&\v\xed\xe0\x00\x00\x00\x00&\xd6\xe6\xd0\x00\x00\x00\x00'\xeb\xcf\xe0\x00\x00\x00\x00(\xc0\x03P\x00\x00\x00\x00)\xd4\xec`\x00\x00\x00\x00*\xa9\x1f\xd0\x00\x00\x00\x00+\xbbe\xe0\x00\x00\x00\x00," +
-	"\x89\x01\xd0\x00\x00\x00\x00-\x9bG\xe0\x00\x00\x00\x00._\xa9P\x00\x00\x00\x00/{)\xe0\x00\x00\x00\x000H\xc5\xd0\x00\x00\x00\x000\xe7\a\xe0\x00\x00\x00\x001dF`\x00\x00\x00\x002A\xc2`\x00" +
-	"\x00\x00\x003D(`\x00\x00\x00\x004!\xa4`\x00\x00\x00\x005$\n`\x00\x00\x00\x006\x01\x86`\x00\x00\x00\x007\x16a`\x00\x00\x00\x008\x06DP\x00\x00\x00\x008\xff}\xe0\x00\x00\x00\x009" +
-	"\xef`\xd0\x00\x00\x00\x00:\xdf_\xe0\x00\x00\x00\x00;\xcfB\xd0\x00\x00\x00\x00<\xbfA\xe0\x00\x00\x00\x00=\xaf$\xd0\x00\x00\x00\x00>\x9f#\xe0\x00\x00\x00\x00?\x8f\x06\xd0\x00\x00\x00\x00@\x7f\x05\xe0\x00" +
-	"\x00\x00\x00A\\\x81\xe0\x00\x00\x00\x00B^\xe7\xe0\x00\x00\x00\x00CA\xb7\xf0\x00\x00\x00\x00D-\xa6`\x00\x00\x00\x00E\x12\xfdP\x00\x00\x00\x00F\x0e\xd9\xe0\x00\x00\x00\x00F\xe8op\x00\x00\x00\x00G" +
-	"\xec\x18\xe0\x00\x00\x00\x00H\xbb\x06P\x00\x00\x00\x00I\xcb\xfa\xe0\x00\x00\x00\x00J\xa0<`\x00\x00\x00\x00K\xab\xdc\xe0\x00\x00\x00\x00La\xbd\xd0\x00\x00\x00\x00M\x94\xf9\x9c\x00\x00\x00\x00N5\xc2P\x00" +
-	"\x00\x00\x00N\\\v\xe0\x00\x00\x00\x00N\x84\xdcP\x00\x00\x00\x00Ot\xdb`\x00\x00\x00\x00P[\x91\xe0\x00\x00\x00\x00QT\xbd`\x00\x00\x00\x00RD\xa0P\x00\x00\x00\x00S4\x9f`\x00\x00\x00\x00T" +
-	"IlP\x00\x00\x00\x00U\x15\xd2\xe0\x00\x00\x00\x00V)\\`\x00\x00\x00\x00V\xf5\xc2\xf0\x00\x00\x00\x00X\x13\xca`\x00\x00\x00\x00Xդ\xf0\x00\x00\x00\x00Y\xf3\xac`\x00\x00\x00\x00Z\xb5\x86\xf0\x00" +
-	"\x00\x00\x00[ӎ`\x00\x00\x00\x00\\\x9dC\xe0\x00\x00\x00\x00]\xb3bP\x00\x00\x00\x00^~w`\x00\x00\x00\x00_\x93R`\x00\x00\x00\x00`^Y`\x00\x00\x00\x00a{\x1d`\x00\x00\x00\x00b" +
-	"?\x8c\xe0\x00\x00\x00\x00c\\^\xf0\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04" +
-	"\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x00\x00 \xe7\x00\x00\x00\x00*0\x01\x04\x00\x00\x1c \x00\t\x00\x00*0\x01\r\x00\x00\x1c \x00\x11LMT\x00EEST\x00EET\x00IDT\x00" +
-	"IST\x00\nEET-2EEST,M3.4.4/50,M10.4.4/50\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x000I\xc7\xde\xec\x00\x00\x00\xec\x00" +
-	"\x00\x00\x10\x00\x00\x00Asia/Ho_Chi_MinhTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\t\x00\x00\x00\x05\x00\x00\x00\x15\xff\xff\xff" +
-	"\xff\x88\x8cC\x8a\xff\xff\xff\xff\x91\xa3+\n\xff\xff\xff\xff\xcd5\xe6\x80\xff\xff\xff\xff\xd1Y\xcep\xff\xff\xff\xff\xd2;>\xf0\xff\xff\xff\xff\xd52\xbb\x10\xff\xff\xff\xff\xe4\xb6\xe4\x80\xff\xff\xff\xff\xed/\x98" +
-	"\x00\x00\x00\x00\x00\n=\xc7\x00\x01\x02\x03\x04\x02\x03\x02\x03\x02\x00\x00c\xf6\x00\x00\x00\x00c\xf6\x00\x04\x00\x00bp\x00\t\x00\x00p\x80\x00\r\x00\x00~\x90\x00\x11LMT\x00PLMT\x00+07" +
-	"\x00+08\x00+09\x00\n<+07>-7\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00E\t\xfa-\a\x03\x00\x00\a\x03\x00\x00\x0e\x00\x00\x00Asia/Hong_Ko" +
-	"ngTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00E\x00\x00\x00\x05\x00\x00\x00\x16\xff\xff\xff\xff\x85ic\x90\xff\xff\xff\xff\xcaM10\xff\xff\xff\xff\xcaۓ" +
-	"0\xff\xff\xff\xff\xcbKqx\xff\xff\xff\xffҠސ\xff\xff\xff\xff\xd3k׀\xff\xff\xff\xffԓX\xb8\xff\xff\xff\xff\xd5B\xb08\xff\xff\xff\xff\xd6s:\xb8\xff\xff\xff\xff\xd7>A\xb8\xff\xff\xff" +
-	"\xff\xd8.2\xb8\xff\xff\xff\xff\xd8\xf99\xb8\xff\xff\xff\xff\xda\x0e\x14\xb8\xff\xff\xff\xff\xda\xd9\x1b\xb8\xff\xff\xff\xff\xdb\xed\xf6\xb8\xff\xff\xff\xffܸ\xfd\xb8\xff\xff\xff\xff\xdd\xcdظ\xff\xff\xff\xffޢ\x1a" +
-	"8\xff\xff\xff\xff߶\xf58\xff\xff\xff\xff\xe0\x81\xfc8\xff\xff\xff\xff\xe1\x96\xc9(\xff\xff\xff\xff\xe2Oi8\xff\xff\xff\xff\xe3v\xab(\xff\xff\xff\xff\xe4/K8\xff\xff\xff\xff\xe5_Ǩ\xff\xff\xff" +
-	"\xff\xe6\x0f-8\xff\xff\xff\xff\xe7?\xa9\xa8\xff\xff\xff\xff\xe7\xf8I\xb8\xff\xff\xff\xff\xe9\x1f\x8b\xa8\xff\xff\xff\xff\xe9\xd8+\xb8\xff\xff\xff\xff\xea\xffm\xa8\xff\xff\xff\xff\xeb\xb8\r\xb8\xff\xff\xff\xff\xec\xdfO" +
-	"\xa8\xff\xff\xff\xff\xed\x97\xef\xb8\xff\xff\xff\xff\xee\xc8l(\xff\xff\xff\xff\xefwѸ\xff\xff\xff\xff\xf0\xa8N(\xff\xff\xff\xff\xf1W\xb3\xb8\xff\xff\xff\xff\xf2\x880(\xff\xff\xff\xff\xf3@\xd08\xff\xff\xff" +
-	"\xff\xf4h\x12(\xff\xff\xff\xff\xf5 \xb28\xff\xff\xff\xff\xf6G\xf4(\xff\xff\xff\xff\xf7%~8\xff\xff\xff\xff\xf8\x15a(\xff\xff\xff\xff\xf9\x05`8\xff\xff\xff\xff\xf9\xf5C(\xff\xff\xff\xff\xfa\xe5B" +
-	"8\xff\xff\xff\xff\xfb\xde_\xa8\xff\xff\xff\xff\xfc\xce^\xb8\xff\xff\xff\xff\xfd\xbeA\xa8\xff\xff\xff\xff\xfe\xae@\xb8\xff\xff\xff\xff\xff\x9e#\xa8\x00\x00\x00\x00\x00\x8e\"\xb8\x00\x00\x00\x00\x01~\x05\xa8\x00\x00\x00" +
-	"\x00\x02n\x04\xb8\x00\x00\x00\x00\x03]\xe7\xa8\x00\x00\x00\x00\x04M\xe6\xb8\x00\x00\x00\x00\x05G\x04(\x00\x00\x00\x00\x067\x038\x00\x00\x00\x00\a&\xe6(\x00\x00\x00\x00\a\x83=8\x00\x00\x00\x00\t\x06\xc8" +
-	"(\x00\x00\x00\x00\t\xf6\xc78\x00\x00\x00\x00\n\xe6\xaa(\x00\x00\x00\x00\v֩8\x00\x00\x00\x00\fƌ(\x00\x00\x00\x00\x11\x9b98\x00\x00\x00\x00\x12ol\xa8\x01\x02\x03\x04\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x00\x00" +
-	"k\n\x00\x00\x00\x00p\x80\x00\x04\x00\x00~\x90\x01\b\x00\x00w\x88\x01\r\x00\x00~\x90\x00\x12LMT\x00HKT\x00HKST\x00HKWT\x00JST\x00\nHKT-8\nPK\x03" +
-	"\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xba\xa3b\xc1R\x02\x00\x00R\x02\x00\x00\t\x00\x00\x00Asia/HovdTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x002\x00\x00\x00\x04\x00\x00\x00\x10\xff\xff\xff\xff\x86\xd3\xfc\x94\x00\x00\x00\x00\x0f\v\xea\xa0\x00\x00\x00\x00\x18\xe9\u0590\x00\x00\x00\x00\x19\xdb\v\x00\x00\x00\x00\x00\x1a\xcc[\x90\x00\x00\x00\x00\x1b\xbc>\x80\x00" +
-	"\x00\x00\x00\x1c\xac=\x90\x00\x00\x00\x00\x1d\x9c \x80\x00\x00\x00\x00\x1e\x8c\x1f\x90\x00\x00\x00\x00\x1f|\x02\x80\x00\x00\x00\x00 l\x01\x90\x00\x00\x00\x00![\xe4\x80\x00\x00\x00\x00\"K\xe3\x90\x00\x00\x00\x00#" +
-	";ƀ\x00\x00\x00\x00$+Ő\x00\x00\x00\x00%\x1b\xa8\x80\x00\x00\x00\x00&\v\xa7\x90\x00\x00\x00\x00'\x04\xc5\x00\x00\x00\x00\x00'\xf4\xc4\x10\x00\x00\x00\x00(\xe4\xa7\x00\x00\x00\x00\x00)Ԧ\x10\x00" +
-	"\x00\x00\x00*ĉ\x00\x00\x00\x00\x00+\xb4\x88\x10\x00\x00\x00\x00,\xa4k\x00\x00\x00\x00\x00-\x94j\x10\x00\x00\x00\x00.\x84M\x00\x00\x00\x00\x00/tL\x10\x00\x00\x00\x000d/\x00\x00\x00\x00\x001" +
-	"]h\x90\x00\x00\x00\x002MK\x80\x00\x00\x00\x003=J\x90\x00\x00\x00\x004--\x80\x00\x00\x00\x005\x1d,\x90\x00\x00\x00\x006\r\x0f\x80\x00\x00\x00\x00:\xe9\xc1\xb0\x00\x00\x00\x00;\xb4\xba\xa0\x00" +
-	"\x00\x00\x00<\xa4\xb9\xb0\x00\x00\x00\x00=\x94\x9c\xa0\x00\x00\x00\x00>\x84\x9b\xb0\x00\x00\x00\x00?t~\xa0\x00\x00\x00\x00@d}\xb0\x00\x00\x00\x00AT`\xa0\x00\x00\x00\x00BD_\xb0\x00\x00\x00\x00C" +
-	"4B\xa0\x00\x00\x00\x00D$A\xb0\x00\x00\x00\x00E\x1d_ \x00\x00\x00\x00U\x15\xa8\xb0\x00\x00\x00\x00V\x05o\x80\x00\x00\x00\x00V\xf5\x8a\xb0\x00\x00\x00\x00W\xe5Q\x80\x01\x03\x02\x03\x02\x03\x02\x03\x02" +
-	"\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x00\x00U\xec\x00\x00\x00\x00T`\x00\x04\x00\x00p\x80\x01\b\x00" +
-	"\x00bp\x00\fLMT\x00+06\x00+08\x00+07\x00\n<+07>-7\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf9l\x03\x12\xf8\x02\x00\x00\xf8\x02\x00\x00\f\x00\x00\x00" +
-	"Asia/IrkutskTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00" +
-	"\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00B\x00\x00\x00\a\x00\x00\x00\x14\xff\xff\xff\xffV\xb6\x82?\xff\xff\xff\xff\xa2" +
-	"\x12\x0f\xbf\xff\xff\xff\xff\xb5\xa3\xd3\x10\x00\x00\x00\x00\x15'a\x80\x00\x00\x00\x00\x16\x18\x95\xf0\x00\x00\x00\x00\x17\b\x95\x00\x00\x00\x00\x00\x17\xf9\xc9p\x00\x00\x00\x00\x18\xe9Ȁ\x00\x00\x00\x00\x19\xda\xfc\xf0\x00" +
-	"\x00\x00\x00\x1a\xccM\x80\x00\x00\x00\x00\x1b\xbcZ\xa0\x00\x00\x00\x00\x1c\xacK\xa0\x00\x00\x00\x00\x1d\x9c<\xa0\x00\x00\x00\x00\x1e\x8c-\xa0\x00\x00\x00\x00\x1f|\x1e\xa0\x00\x00\x00\x00 l\x0f\xa0\x00\x00\x00\x00!" +
-	"\\\x00\xa0\x00\x00\x00\x00\"K\xf1\xa0\x00\x00\x00\x00#;\xe2\xa0\x00\x00\x00\x00$+Ӡ\x00\x00\x00\x00%\x1bĠ\x00\x00\x00\x00&\v\xb5\xa0\x00\x00\x00\x00'\x04\xe1 \x00\x00\x00\x00'\xf4\xd2 \x00" +
-	"\x00\x00\x00(\xe4\xd10\x00\x00\x00\x00)xy0\x00\x00\x00\x00)Դ \x00\x00\x00\x00*ĥ \x00\x00\x00\x00+\xb4\x96 \x00\x00\x00\x00,\xa4\x87 \x00\x00\x00\x00-\x94x \x00\x00\x00\x00." +
-	"\x84i \x00\x00\x00\x00/tZ \x00\x00\x00\x000dK \x00\x00\x00\x001]v\xa0\x00\x00\x00\x002rQ\xa0\x00\x00\x00\x003=X\xa0\x00\x00\x00\x004R3\xa0\x00\x00\x00\x005\x1d:\xa0\x00" +
-	"\x00\x00\x0062\x15\xa0\x00\x00\x00\x006\xfd\x1c\xa0\x00\x00\x00\x008\x1b2 \x00\x00\x00\x008\xdc\xfe\xa0\x00\x00\x00\x009\xfb\x14 \x00\x00\x00\x00:\xbc\xe0\xa0\x00\x00\x00\x00;\xda\xf6 \x00\x00\x00\x00<" +
-	"\xa5\xfd \x00\x00\x00\x00=\xba\xd8 \x00\x00\x00\x00>\x85\xdf \x00\x00\x00\x00?\x9a\xba \x00\x00\x00\x00@e\xc1 \x00\x00\x00\x00A\x83֠\x00\x00\x00\x00BE\xa3 \x00\x00\x00\x00Cc\xb8\xa0\x00" +
-	"\x00\x00\x00D%\x85 \x00\x00\x00\x00EC\x9a\xa0\x00\x00\x00\x00F\x05g \x00\x00\x00\x00G#|\xa0\x00\x00\x00\x00G\ue0e0\x00\x00\x00\x00I\x03^\xa0\x00\x00\x00\x00I\xcee\xa0\x00\x00\x00\x00J" +
-	"\xe3@\xa0\x00\x00\x00\x00K\xaeG\xa0\x00\x00\x00\x00L\xcc] \x00\x00\x00\x00M\x8e)\xa0\x00\x00\x00\x00TK\xd7\x10\x01\x02\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x05\x02" +
-	"\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x06\x04\x00\x00a\xc1\x00\x00\x00\x00a\xc1\x00\x04\x00\x00bp\x00\b\x00" +
-	"\x00~\x90\x01\f\x00\x00p\x80\x00\x10\x00\x00p\x80\x01\x10\x00\x00~\x90\x00\fLMT\x00IMT\x00+07\x00+09\x00+08\x00\n<+08>-8\nPK\x03\x04\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\aW\x10Ѱ\x04\x00\x00\xb0\x04\x00\x00\r\x00\x00\x00Asia/IstanbulTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00s\x00\x00\x00\x06\x00\x00\x00\x19\xff\xff\xff\xffV\xb6\xc8\xd8\xff\xff\xff\xff\x90\x8b\xf5\x98\xff\xff\xff\xff\x9b\f\x17`\xff\xff\xff\xff\x9bվ\xd0\xff\xff\xff\xff\xa2ec\xe0\xff\xff\xff\xff\xa3{\x82P\xff\xff" +
-	"\xff\xff\xa4N\x80`\xff\xff\xff\xff\xa5?\xb4\xd0\xff\xff\xff\xff\xa6%'\xe0\xff\xff\xff\xff\xa7'\x7f\xd0\xff\xff\xff\xff\xaa((`\xff\xff\xff\xff\xaa\xe1\xfd\xd0\xff\xff\xff\xff\xab\xf9\x89\xe0\xff\xff\xff\xff\xac\xc3" +
-	"1P\xff\xff\xff\xffȁ?\xe0\xff\xff\xff\xff\xc9\x01\x13P\xff\xff\xff\xff\xc9J\xf5`\xff\xff\xff\xff\xca\u0380P\xff\xff\xff\xff\xcbˮ`\xff\xff\xff\xff\xd2k\tP\xff\xff\xff\xffӢ9`\xff\xff" +
-	"\xff\xff\xd4C\x02P\xff\xff\xff\xff\xd5L\r\xe0\xff\xff\xff\xff\xd6){\xd0\xff\xff\xff\xff\xd7+\xef\xe0\xff\xff\xff\xff\xd8\t]\xd0\xff\xff\xff\xff\xd9\x02\x97`\xff\xff\xff\xff\xd9\xe9?\xd0\xff\xff\xff\xff\xda\xeb" +
-	"\xb3\xe0\xff\xff\xff\xff\xdb\xd2\\P\xff\xff\xff\xff\xdc\xd4\xd0`\xff\xff\xff\xffݲ>P\xff\xff\xff\xff\xf1\xf4\xb9`\xff\xff\xff\xff\xf4b\xefP\xff\xff\xff\xff\xf5h\x06`\xff\xff\xff\xff\xf6\x1f8\xd0\x00\x00" +
-	"\x00\x00\x06n\x93p\x00\x00\x00\x00\a9\x9ap\x00\x00\x00\x00\a\xfbu\x00\x00\x00\x00\x00\t\x19|p\x00\x00\x00\x00\t\xd0\xcb\x00\x00\x00\x00\x00\n\xf9^p\x00\x00\x00\x00\v\xb1\xfe\x80\x00\x00\x00\x00\f\xd9" +
-	"@p\x00\x00\x00\x00\r\xa4U\x80\x00\x00\x00\x00\x0e\xa6\xadp\x00\x00\x00\x00\x0f\x847\x80\x00\x00\x00\x00\x0f\xf8\x11P\x00\x00\x00\x00\x19\x89\xb0p\x00\x00\x00\x00\x19ܰ\xe0\x00\x00\x00\x00\x1b\xe6\xd0\xf0\x00\x00" +
-	"\x00\x00\x1c\xc6\xef\xf0\x00\x00\x00\x00\x1d\x9b1p\x00\x00\x00\x00\x1e\x8cs\xf0\x00\x00\x00\x00\x1f|d\xf0\x00\x00\x00\x00 lU\xf0\x00\x00\x00\x00!\\F\xf0\x00\x00\x00\x00\"L7\xf0\x00\x00\x00\x00#<" +
-	"(\xf0\x00\x00\x00\x00$,\x19\xf0\x00\x00\x00\x00%\x1c\n\xf0\x00\x00\x00\x00&\v\xfb\xf0\x00\x00\x00\x00'\x05'p\x00\x00\x00\x00'\xf5\x18p\x00\x00\x00\x00(\xe5\tp\x00\x00\x00\x00)\xd4\xfap\x00\x00" +
-	"\x00\x00*\xc4\xebp\x00\x00\x00\x00+\xb4\xdcp\x00\x00\x00\x00,\xa4\xcdp\x00\x00\x00\x00-\x8b\x83\xf0\x00\x00\x00\x00.\x84\xafp\x00\x00\x00\x00/t\xa0p\x00\x00\x00\x000d\x91p\x00\x00\x00\x001]" +
-	"\xbc\xf0\x00\x00\x00\x002r\x97\xf0\x00\x00\x00\x003=\x9e\xf0\x00\x00\x00\x004Ry\xf0\x00\x00\x00\x005\x1d\x80\xf0\x00\x00\x00\x0062[\xf0\x00\x00\x00\x006\xfdb\xf0\x00\x00\x00\x008\x1bxp\x00\x00" +
-	"\x00\x008\xddD\xf0\x00\x00\x00\x009\xfbZp\x00\x00\x00\x00:\xbd&\xf0\x00\x00\x00\x00;\xdb<p\x00\x00\x00\x00<\xa6Cp\x00\x00\x00\x00=\xbb\x1ep\x00\x00\x00\x00>\x86%p\x00\x00\x00\x00?\x9b" +
-	"\x00p\x00\x00\x00\x00@f\ap\x00\x00\x00\x00A\x84\x1c\xf0\x00\x00\x00\x00BE\xe9p\x00\x00\x00\x00Cc\xfe\xf0\x00\x00\x00\x00D%\xcbp\x00\x00\x00\x00EC\xe0\xf0\x00\x00\x00\x00F\x05ɐ\x00\x00" +
-	"\x00\x00G#\xdf\x10\x00\x00\x00\x00G\xee\xe6\x10\x00\x00\x00\x00I\x03\xc1\x10\x00\x00\x00\x00I\xce\xc8\x10\x00\x00\x00\x00J\xe3\xa3\x10\x00\x00\x00\x00K\xae\xaa\x10\x00\x00\x00\x00L̿\x90\x00\x00\x00\x00M\x8f" +
-	"ݐ\x00\x00\x00\x00N\xac\xa1\x90\x00\x00\x00\x00Onn\x10\x00\x00\x00\x00P\x8c\x83\x90\x00\x00\x00\x00QW\x8a\x90\x00\x00\x00\x00Rle\x90\x00\x00\x00\x00S8\xbe\x10\x00\x00\x00\x00TLG\x90\x00\x00" +
-	"\x00\x00U\x17N\x90\x00\x00\x00\x00V>\x9e\x90\x00\x00\x00\x00V\xf70\x90\x00\x00\x00\x00W\xcf.P\x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03" +
-	"\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x04\x05\x04\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02" +
-	"\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x04\x00\x00\x1b(\x00\x00\x00\x00\x1bh\x00\x04\x00\x00*0\x01\b\x00\x00\x1c \x00\r\x00\x00*0\x00\x11\x00\x008@\x01" +
-	"\x15LMT\x00IMT\x00EEST\x00EET\x00+03\x00+04\x00\n<+03>-3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00b\xadű\xf8\x00\x00\x00\xf8\x00\x00" +
-	"\x00\f\x00\x00\x00Asia/JakartaTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" +
-	"\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\b\x00\x00\x00\a\x00\x00\x00 \xff\xff\xff\xff?fI`" +
-	"\xff\xff\xff\xff\xa9x\x85\xe0\xff\xff\xff\xff\xba\x16\xde`\xff\xff\xff\xff˿\x83\x88\xff\xff\xff\xff\xd2V\xeep\xff\xff\xff\xff\xd7<\xc6\b\xff\xff\xff\xff\xda\xff&\x00\xff\xff\xff\xff\xf4\xb5\xbe\x88\x01\x02\x03\x04" +
-	"\x03\x05\x03\x06\x00\x00d \x00\x00\x00\x00d \x00\x04\x00\x00g \x00\b\x00\x00ix\x00\x0e\x00\x00~\x90\x00\x14\x00\x00p\x80\x00\x18\x00\x00bp\x00\x1cLMT\x00BMT\x00+0720\x00" +
-	"+0730\x00+09\x00+08\x00WIB\x00\nWIB-7\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00.>[K\xab\x00\x00\x00\xab\x00\x00\x00\r\x00\x00\x00Asia/" +
-	"JayapuraTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00T" +
-	"Zif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x12\xff\xff\xff\xff\xba\x16\xc1\x98\xff\xff\xff\xff\xd0X\xb9\xf0\xff" +
-	"\xff\xff\xff\xf4\xb5\xa2h\x01\x02\x03\x00\x00\x83\xe8\x00\x00\x00\x00~\x90\x00\x04\x00\x00\x85\x98\x00\b\x00\x00~\x90\x00\x0eLMT\x00+09\x00+0930\x00WIT\x00\nWIT-9\nP" +
-	"K\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17✳2\x04\x00\x002\x04\x00\x00\x0e\x00\x00\x00Asia/JerusalemTZif3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00d\x00\x00\x00\x05\x00\x00\x00\x15\xff\xff\xff\xffV\xb6\xc2\xfa\xff\xff\xff\xff\x9e0E\x88\xff\xff\xff\xff\xc8Y\xcf\x00\xff\xff\xff\xff\xc8\xfa\xa6\x00\xff\xff\xff\xff\xc98\x9c\x80\xff\xff" +
-	"\xff\xff\xcc\xe5\xeb\x80\xff\xff\xff\xffͬ\xfe\x00\xff\xff\xff\xff\xce\xc7\x1f\x00\xff\xff\xff\xffϏ\x83\x00\xff\xff\xff\xffЩ\xa4\x00\xff\xff\xff\xffф}\x00\xff\xff\xff\xffҊ׀\xff\xff\xff\xff\xd3e" +
-	"\xb0\x80\xff\xff\xff\xff\xd4l\v\x00\xff\xff\xff\xff\xd7Z0\x80\xff\xff\xff\xff\xd7\xdfX\x00\xff\xff\xff\xff\xd8/À\xff\xff\xff\xff\xd9\x1ec\x00\xff\xff\xff\xff\xda\x10\xf7\x00\xff\xff\xff\xff\xda\xeb\xd0\x00\xff\xff" +
-	"\xff\xff۴4\x00\xff\xff\xff\xffܹ=\x00\xff\xff\xff\xff\xdd\xe0\x8d\x00\xff\xff\xff\xff\u07b4\u0380\xff\xff\xff\xffߤ\xbf\x80\xff\xff\xff\xff\xe0\x8bv\x00\xff\xff\xff\xff\xe1V}\x00\xff\xff\xff\xff\xe2\xbe" +
-	"f\x80\xff\xff\xff\xff\xe36_\x00\xff\xff\xff\xff\xe4\x9eH\x80\xff\xff\xff\xff\xe5\x16A\x00\xff\xff\xff\xff\xe6t\xf0\x00\xff\xff\xff\xff\xe7\x11Ҁ\xff\xff\xff\xff\xe8&\xad\x80\xff\xff\xff\xff\xe8\xe8z\x00\x00\x00" +
-	"\x00\x00\b|\x8b\xe0\x00\x00\x00\x00\b\xfd\xb0\xd0\x00\x00\x00\x00\t\xf6\xea`\x00\x00\x00\x00\n\xa63\xd0\x00\x00\x00\x00\x13\xe9\xfc`\x00\x00\x00\x00\x14![`\x00\x00\x00\x00\x1a\xfa\xc6`\x00\x00\x00\x00\x1b\x8e" +
-	"n`\x00\x00\x00\x00\x1c\xbe\xf8\xe0\x00\x00\x00\x00\x1dw|\xd0\x00\x00\x00\x00\x1e\xcc\xff`\x00\x00\x00\x00\x1f`\x99P\x00\x00\x00\x00 \x82\xb1`\x00\x00\x00\x00!I\xb5\xd0\x00\x00\x00\x00\"^\x9e\xe0\x00\x00" +
-	"\x00\x00# ]P\x00\x00\x00\x00$Z0`\x00\x00\x00\x00%\x00?P\x00\x00\x00\x00&\v\xed\xe0\x00\x00\x00\x00&\xd6\xe6\xd0\x00\x00\x00\x00'\xeb\xcf\xe0\x00\x00\x00\x00(\xc0\x03P\x00\x00\x00\x00)\xd4" +
-	"\xec`\x00\x00\x00\x00*\xa9\x1f\xd0\x00\x00\x00\x00+\xbbe\xe0\x00\x00\x00\x00,\x89\x01\xd0\x00\x00\x00\x00-\x9bG\xe0\x00\x00\x00\x00._\xa9P\x00\x00\x00\x00/{)\xe0\x00\x00\x00\x000H\xc5\xd0\x00\x00" +
-	"\x00\x001H\x96\xe0\x00\x00\x00\x002<nP\x00\x00\x00\x0031\xb3`\x00\x00\x00\x004\x1a\xfe\xd0\x00\x00\x00\x005\x11\x95`\x00\x00\x00\x005\xf1\xa6P\x00\x00\x00\x007\x04\b\x80\x00\x00\x00\x007\xcf" +
-	"\x01p\x00\x00\x00\x008\xf6_\x80\x00\x00\x00\x009\xdc\xf9\xe0\x00\x00\x00\x00:\xd0\xedp\x00\x00\x00\x00;\xae[`\x00\x00\x00\x00<\xa3\xa0p\x00\x00\x00\x00=\xa0\xb2`\x00\x00\x00\x00>\x83\x82p\x00\x00" +
-	"\x00\x00?|\x9f\xe0\x00\x00\x00\x00@s6p\x00\x00\x00\x00AP\xa4`\x00\x00\x00\x00BL\x8f\x00\x00\x00\x00\x00CHOp\x00\x00\x00\x00D,q\x00\x00\x00\x00\x00E\x1e\xf6\xf0\x00\x00\x00\x00F\f" +
-	"S\x00\x00\x00\x00\x00F\xecc\xf0\x00\x00\x00\x00G\xec5\x00\x00\x00\x00\x00H\xe7\xf5p\x00\x00\x00\x00I\xcc\x17\x00\x00\x00\x00\x00J\xbe\x9c\xf0\x00\x00\x00\x00K\xab\xf9\x00\x00\x00\x00\x00L\x8c\t\xf0\x00\x00" +
-	"\x00\x00M\x95\x15\x80\x00\x00\x00\x00N\x87\x9bp\x00\x00\x00\x00Ot\xf7\x80\x00\x00\x00\x00P^B\xf0\x00\x00\x00\x00QTـ\x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x04\x02\x03\x02\x03\x02\x03\x02" +
-	"\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02" +
-	"\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x00\x00!\x06\x00\x00\x00\x00 \xf8\x00\x04\x00\x00*0\x01\b\x00\x00\x1c \x00\f\x00\x008@\x01\x10LMT\x00JMT\x00IDT\x00" +
-	"IST\x00IDDT\x00\nIST-2IDT,M3.4.4/26,M10.5.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\xe2\\\xff\x9f\x00\x00\x00\x9f" +
-	"\x00\x00\x00\n\x00\x00\x00Asia/KabulTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" +
-	"\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x0e\xff\xff\xff\xffi\x86\x9a\xa0" +
-	"\xff\xff\xff\xff\xd0\xf9\xd7@\x01\x02\x00\x00@\xe0\x00\x00\x00\x008@\x00\x04\x00\x00?H\x00\bLMT\x00+04\x00+0430\x00\n<+0430>-4:30\nPK\x03\x04" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0\x9cf>\xd7\x02\x00\x00\xd7\x02\x00\x00\x0e\x00\x00\x00Asia/KamchatkaTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00@\x00\x00\x00\x05\x00\x00\x00\x10\xff\xff\xff\xff\xa7R\x96\xc4\xff\xff\xff\xff\xb5\xa3\x9a\xd0\x00\x00\x00\x00\x15')@\x00\x00\x00\x00\x16\x18]\xb0\x00\x00\x00\x00\x17\b\\\xc0\x00\x00\x00\x00\x17" +
-	"\xf9\x910\x00\x00\x00\x00\x18\xe9\x90@\x00\x00\x00\x00\x19\xdaİ\x00\x00\x00\x00\x1a\xcc\x15@\x00\x00\x00\x00\x1b\xbc\"`\x00\x00\x00\x00\x1c\xac\x13`\x00\x00\x00\x00\x1d\x9c\x04`\x00\x00\x00\x00\x1e\x8b\xf5`\x00" +
-	"\x00\x00\x00\x1f{\xe6`\x00\x00\x00\x00 k\xd7`\x00\x00\x00\x00![\xc8`\x00\x00\x00\x00\"K\xb9`\x00\x00\x00\x00#;\xaa`\x00\x00\x00\x00$+\x9b`\x00\x00\x00\x00%\x1b\x8c`\x00\x00\x00\x00&" +
-	"\v}`\x00\x00\x00\x00'\x04\xa8\xe0\x00\x00\x00\x00'\xf4\x99\xe0\x00\x00\x00\x00(\xe4\x98\xf0\x00\x00\x00\x00)x@\xf0\x00\x00\x00\x00)\xd4{\xe0\x00\x00\x00\x00*\xc4l\xe0\x00\x00\x00\x00+\xb4]\xe0\x00" +
-	"\x00\x00\x00,\xa4N\xe0\x00\x00\x00\x00-\x94?\xe0\x00\x00\x00\x00.\x840\xe0\x00\x00\x00\x00/t!\xe0\x00\x00\x00\x000d\x12\xe0\x00\x00\x00\x001]>`\x00\x00\x00\x002r\x19`\x00\x00\x00\x003" +
-	"= `\x00\x00\x00\x004Q\xfb`\x00\x00\x00\x005\x1d\x02`\x00\x00\x00\x0061\xdd`\x00\x00\x00\x006\xfc\xe4`\x00\x00\x00\x008\x1a\xf9\xe0\x00\x00\x00\x008\xdc\xc6`\x00\x00\x00\x009\xfa\xdb\xe0\x00" +
-	"\x00\x00\x00:\xbc\xa8`\x00\x00\x00\x00;ڽ\xe0\x00\x00\x00\x00<\xa5\xc4\xe0\x00\x00\x00\x00=\xba\x9f\xe0\x00\x00\x00\x00>\x85\xa6\xe0\x00\x00\x00\x00?\x9a\x81\xe0\x00\x00\x00\x00@e\x88\xe0\x00\x00\x00\x00A" +
-	"\x83\x9e`\x00\x00\x00\x00BEj\xe0\x00\x00\x00\x00Cc\x80`\x00\x00\x00\x00D%L\xe0\x00\x00\x00\x00ECb`\x00\x00\x00\x00F\x05.\xe0\x00\x00\x00\x00G#D`\x00\x00\x00\x00G\xeeK`\x00" +
-	"\x00\x00\x00I\x03&`\x00\x00\x00\x00I\xce-`\x00\x00\x00\x00J\xe3\b`\x00\x00\x00\x00K\xae\x0f`\x00\x00\x00\x00L\xcc2\xf0\x00\x00\x00\x00M\x8d\xffp\x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02" +
-	"\x03\x02\x03\x02\x03\x02\x03\x02\x03\x04\x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x04\x01\x03\x00\x00\x94\xbc\x00\x00\x00\x00\x9a" +
-	"\xb0\x00\x04\x00\x00\xb6\xd0\x01\b\x00\x00\xa8\xc0\x00\f\x00\x00\xa8\xc0\x01\fLMT\x00+11\x00+13\x00+12\x00\n<+12>-12\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x009Y\xb7\xf1\n\x01\x00\x00\n\x01\x00\x00\f\x00\x00\x00Asia/KarachiTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\v\x00\x00\x00\x06" +
-	"\x00\x00\x00\x1d\xff\xff\xff\xff\x89~\xfc\xa4\xff\xff\xff\xff̕2\xa8\xff\xff\xff\xff\xd2t\x12\x98\xff\xff\xff\xffݨ\xe0\xa8\x00\x00\x00\x00\x02O\xab0\x00\x00\x00\x00<\xafE\xb0\x00\x00\x00\x00=\x9f(\xa0" +
-	"\x00\x00\x00\x00HA\xa00\x00\x00\x00\x00I\vG\xa0\x00\x00\x00\x00I\xe4\xdd0\x00\x00\x00\x00J\xec{ \x01\x02\x01\x03\x05\x04\x05\x04\x05\x04\x05\x00\x00>\xdc\x00\x00\x00\x00MX\x00\x04\x00\x00[h\x01" +
-	"\n\x00\x00FP\x00\x10\x00\x00T`\x01\x14\x00\x00FP\x00\x19LMT\x00+0530\x00+0630\x00+05\x00PKST\x00PKT\x00\nPKT-5\nPK\x03\x04\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00B\x1d\xc6\x1b\x85\x00\x00\x00\x85\x00\x00\x00\f\x00\x00\x00Asia/KashgarTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\b\xff\xff\xff\xff\xb0\xfe\xbad\x01\x00\x00R\x1c\x00\x00\x00\x00T`\x00\x04LMT\x00+06\x00\n<+06>-6\nPK\x03\x04\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x8bSnT\xa1\x00\x00\x00\xa1\x00\x00\x00\x0e\x00\x00\x00Asia/KathmanduTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x02\x00\x00\x00\x03\x00\x00\x00\x10\xff\xff\xff\xff\xa1\xf2}\x84\x00\x00\x00\x00\x1e\x180\xa8\x01\x02\x00\x00O\xfc\x00\x00\x00\x00MX\x00\x04\x00\x00P\xdc\x00\nLMT\x00+0530\x00+0545" +
-	"\x00\n<+0545>-5:45\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8bSnT\xa1\x00\x00\x00\xa1\x00\x00\x00\r\x00\x00\x00Asia/KatmanduTZ" +
-	"if2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x10\xff\xff\xff\xff\xa1\xf2}\x84\x00\x00\x00\x00\x1e\x180\xa8\x01\x02\x00\x00O\xfc\x00\x00\x00\x00M" +
-	"X\x00\x04\x00\x00P\xdc\x00\nLMT\x00+0530\x00+0545\x00\n<+0545>-5:45\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x83g\x95M\a\x03\x00" +
-	"\x00\a\x03\x00\x00\r\x00\x00\x00Asia/KhandygaTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00C\x00\x00\x00\b\x00\x00\x00\x14\xff\xff\xff" +
-	"\xff\xa1\xdb\xe4\xeb\xff\xff\xff\xff\xb5\xa3\xc5\x00\x00\x00\x00\x00\x15'Sp\x00\x00\x00\x00\x16\x18\x87\xe0\x00\x00\x00\x00\x17\b\x86\xf0\x00\x00\x00\x00\x17\xf9\xbb`\x00\x00\x00\x00\x18\xe9\xbap\x00\x00\x00\x00\x19\xda\xee" +
-	"\xe0\x00\x00\x00\x00\x1a\xcc?p\x00\x00\x00\x00\x1b\xbcL\x90\x00\x00\x00\x00\x1c\xac=\x90\x00\x00\x00\x00\x1d\x9c.\x90\x00\x00\x00\x00\x1e\x8c\x1f\x90\x00\x00\x00\x00\x1f|\x10\x90\x00\x00\x00\x00 l\x01\x90\x00\x00\x00" +
-	"\x00![\xf2\x90\x00\x00\x00\x00\"K\xe3\x90\x00\x00\x00\x00#;Ԑ\x00\x00\x00\x00$+Ő\x00\x00\x00\x00%\x1b\xb6\x90\x00\x00\x00\x00&\v\xa7\x90\x00\x00\x00\x00'\x04\xd3\x10\x00\x00\x00\x00'\xf4\xc4" +
-	"\x10\x00\x00\x00\x00(\xe4\xc3 \x00\x00\x00\x00)xk \x00\x00\x00\x00)Ԧ\x10\x00\x00\x00\x00*ė\x10\x00\x00\x00\x00+\xb4\x88\x10\x00\x00\x00\x00,\xa4y\x10\x00\x00\x00\x00-\x94j\x10\x00\x00\x00" +
-	"\x00.\x84[\x10\x00\x00\x00\x00/tL\x10\x00\x00\x00\x000d=\x10\x00\x00\x00\x001]h\x90\x00\x00\x00\x002rC\x90\x00\x00\x00\x003=J\x90\x00\x00\x00\x004R%\x90\x00\x00\x00\x005\x1d," +
-	"\x90\x00\x00\x00\x0062\a\x90\x00\x00\x00\x006\xfd\x0e\x90\x00\x00\x00\x008\x1b$\x10\x00\x00\x00\x008\xdc\xf0\x90\x00\x00\x00\x009\xfb\x06\x10\x00\x00\x00\x00:\xbcҐ\x00\x00\x00\x00;\xda\xe8\x10\x00\x00\x00" +
-	"\x00<\xa5\xef\x10\x00\x00\x00\x00=\xba\xca\x10\x00\x00\x00\x00>\x85\xd1\x10\x00\x00\x00\x00?\x9a\xac\x10\x00\x00\x00\x00?\xf2\xe4p\x00\x00\x00\x00@e\xa5\x00\x00\x00\x00\x00A\x83\xba\x80\x00\x00\x00\x00BE\x87" +
-	"\x00\x00\x00\x00\x00Cc\x9c\x80\x00\x00\x00\x00D%i\x00\x00\x00\x00\x00EC~\x80\x00\x00\x00\x00F\x05K\x00\x00\x00\x00\x00G#`\x80\x00\x00\x00\x00G\xeeg\x80\x00\x00\x00\x00I\x03B\x80\x00\x00\x00" +
-	"\x00I\xceI\x80\x00\x00\x00\x00J\xe3$\x80\x00\x00\x00\x00K\xae+\x80\x00\x00\x00\x00L\xccA\x00\x00\x00\x00\x00M\x8e\r\x80\x00\x00\x00\x00Nn\x02P\x00\x00\x00\x00TK\xc9\x00\x01\x03\x02\x03\x02\x03\x02" +
-	"\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x04\x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\a\x06\x03" +
-	"\x00\x00\x7f\x15\x00\x00\x00\x00p\x80\x00\x04\x00\x00\x8c\xa0\x01\b\x00\x00~\x90\x00\f\x00\x00~\x90\x01\f\x00\x00\x9a\xb0\x01\x10\x00\x00\x8c\xa0\x00\b\x00\x00\x9a\xb0\x00\x10LMT\x00+08\x00+10\x00" +
-	"+09\x00+11\x00\n<+09>-9\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9a\x1a\xdc\xca\xdc\x00\x00\x00\xdc\x00\x00\x00\f\x00\x00\x00Asia/KolkataT" +
-	"Zif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\x00\x00\x00\x05\x00\x00\x00\x16\xff\xff\xff\xff&\xba\x18(\xff\xff\xff\xffC\xe7\xeb0\xff\xff\xff\xff\x87\x9d\xbc\xba\xff\xff" +
-	"\xff\xff\xcaی(\xff\xff\xff\xff\xcc\x05q\x18\xff\xff\xff\xff̕2\xa8\xff\xff\xff\xff\xd2t\x12\x98\x01\x02\x03\x04\x03\x04\x03\x00\x00R\xd8\x00\x00\x00\x00R\xd0\x00\x04\x00\x00KF\x00\b\x00\x00MX\x00" +
-	"\f\x00\x00[h\x01\x10LMT\x00HMT\x00MMT\x00IST\x00+0630\x00\nIST-5:30\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00L\xe0\x91y\xe5\x02\x00" +
-	"\x00\xe5\x02\x00\x00\x10\x00\x00\x00Asia/KrasnoyarskTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00A\x00\x00\x00\x06\x00\x00\x00\x10" +
-	"\xff\xff\xff\xff\xa1\xf9\r\xf2\xff\xff\xff\xff\xb5\xa3\xe1 \x00\x00\x00\x00\x15'o\x90\x00\x00\x00\x00\x16\x18\xa4\x00\x00\x00\x00\x00\x17\b\xa3\x10\x00\x00\x00\x00\x17\xf9׀\x00\x00\x00\x00\x18\xe9\u0590\x00\x00\x00\x00" +
-	"\x19\xdb\v\x00\x00\x00\x00\x00\x1a\xcc[\x90\x00\x00\x00\x00\x1b\xbch\xb0\x00\x00\x00\x00\x1c\xacY\xb0\x00\x00\x00\x00\x1d\x9cJ\xb0\x00\x00\x00\x00\x1e\x8c;\xb0\x00\x00\x00\x00\x1f|,\xb0\x00\x00\x00\x00 l\x1d\xb0" +
-	"\x00\x00\x00\x00!\\\x0e\xb0\x00\x00\x00\x00\"K\xff\xb0\x00\x00\x00\x00#;\xf0\xb0\x00\x00\x00\x00$+\xe1\xb0\x00\x00\x00\x00%\x1bҰ\x00\x00\x00\x00&\vð\x00\x00\x00\x00'\x04\xef0\x00\x00\x00\x00" +
-	"'\xf4\xe00\x00\x00\x00\x00(\xe4\xdf@\x00\x00\x00\x00)x\x87@\x00\x00\x00\x00)\xd4\xc20\x00\x00\x00\x00*ij0\x00\x00\x00\x00+\xb4\xa40\x00\x00\x00\x00,\xa4\x950\x00\x00\x00\x00-\x94\x860" +
-	"\x00\x00\x00\x00.\x84w0\x00\x00\x00\x00/th0\x00\x00\x00\x000dY0\x00\x00\x00\x001]\x84\xb0\x00\x00\x00\x002r_\xb0\x00\x00\x00\x003=f\xb0\x00\x00\x00\x004RA\xb0\x00\x00\x00\x00" +
-	"5\x1dH\xb0\x00\x00\x00\x0062#\xb0\x00\x00\x00\x006\xfd*\xb0\x00\x00\x00\x008\x1b@0\x00\x00\x00\x008\xdd\f\xb0\x00\x00\x00\x009\xfb\"0\x00\x00\x00\x00:\xbc\xee\xb0\x00\x00\x00\x00;\xdb\x040" +
-	"\x00\x00\x00\x00<\xa6\v0\x00\x00\x00\x00=\xba\xe60\x00\x00\x00\x00>\x85\xed0\x00\x00\x00\x00?\x9a\xc80\x00\x00\x00\x00@e\xcf0\x00\x00\x00\x00A\x83\xe4\xb0\x00\x00\x00\x00BE\xb10\x00\x00\x00\x00" +
-	"Ccư\x00\x00\x00\x00D%\x930\x00\x00\x00\x00EC\xa8\xb0\x00\x00\x00\x00F\x05u0\x00\x00\x00\x00G#\x8a\xb0\x00\x00\x00\x00G\ue470\x00\x00\x00\x00I\x03l\xb0\x00\x00\x00\x00I\xces\xb0" +
-	"\x00\x00\x00\x00J\xe3N\xb0\x00\x00\x00\x00K\xaeU\xb0\x00\x00\x00\x00L\xcck0\x00\x00\x00\x00M\x8e7\xb0\x00\x00\x00\x00TK\xe5 \x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03" +
-	"\x02\x03\x04\x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x05\x03\x00\x00W\x0e\x00\x00\x00\x00T`\x00\x04\x00\x00p" +
-	"\x80\x01\b\x00\x00bp\x00\f\x00\x00bp\x01\f\x00\x00p\x80\x00\bLMT\x00+06\x00+08\x00+07\x00\n<+07>-7\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"F7k\x1c\x00\x01\x00\x00\x00\x01\x00\x00\x11\x00\x00\x00Asia/Kuala_LumpurTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\b" +
-	"\x00\x00\x00\b\x00\x00\x00 \xff\xff\xff\xff~6S\xa3\xff\xff\xff\xff\x86\x83\x85\xa3\xff\xff\xff\xff\xbagN\x90\xff\xff\xff\xff\xc0\n\xe4`\xff\xff\xff\xffʳ\xe5`\xff\xff\xff\xffˑ_\b\xff\xff\xff\xff" +
-	"\xd2Hm\xf0\x00\x00\x00\x00\x16\x91\xee\x00\x01\x02\x03\x04\x05\x06\x05\a\x00\x00a]\x00\x00\x00\x00a]\x00\x04\x00\x00bp\x00\b\x00\x00g \x01\f\x00\x00g \x00\f\x00\x00ix\x00\x12\x00\x00~\x90" +
-	"\x00\x18\x00\x00p\x80\x00\x1cLMT\x00SMT\x00+07\x00+0720\x00+0730\x00+09\x00+08\x00\n<+08>-8\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\xa7f^]@\x01\x00\x00@\x01\x00\x00\f\x00\x00\x00Asia/KuchingTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00" +
-	"\x00\x05\x00\x00\x00\x18\xff\xff\xff\xff\xad\x8a\x06\x90\xff\xff\xff\xff\xbagG\x88\xff\xff\xff\xff\xbf{'\x80\xff\xff\xff\xff\xbf\xf3\x1bP\xff\xff\xff\xff\xc1]\xac\x80\xff\xff\xff\xff\xc1ՠP\xff\xff\xff\xff\xc3>" +
-	"\xe0\x00\xff\xff\xff\xffö\xd3\xd0\xff\xff\xff\xff\xc5 \x13\x80\xff\xff\xff\xffŘ\aP\xff\xff\xff\xff\xc7\x01G\x00\xff\xff\xff\xff\xc7y:\xd0\xff\xff\xff\xff\xc8\xe3\xcc\x00\xff\xff\xff\xff\xc9[\xbf\xd0\xff\xff" +
-	"\xff\xff\xca\xc4\xff\x80\xff\xff\xff\xff\xcb<\xf3P\xff\xff\xff\xffˑX\x00\xff\xff\xff\xff\xd2Hm\xf0\x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x04\x03\x00\x00gp\x00\x00\x00\x00ix\x00\x04" +
-	"\x00\x00u0\x01\n\x00\x00p\x80\x00\x10\x00\x00~\x90\x00\x14LMT\x00+0730\x00+0820\x00+08\x00+09\x00\n<+08>-8\nPK\x03\x04\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\xcfׇ\xe1\x85\x00\x00\x00\x85\x00\x00\x00\v\x00\x00\x00Asia/KuwaitTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" +
-	"\x00\x00\x02\x00\x00\x00\b\xff\xff\xff\xff\xd5\x1b6\xb4\x01\x00\x00+\xcc\x00\x00\x00\x00*0\x00\x04LMT\x00+03\x00\n<+03>-3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1d" +
-	"?v\f\x17\x03\x00\x00\x17\x03\x00\x00\n\x00\x00\x00Asia/MacaoTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00G\x00\x00\x00\x05\x00\x00\x00\x14" +
-	"\xff\xff\xff\xff\x85i[\x8e\xff\xff\xff\xff\xcbGu\xf0\xff\xff\xff\xff\xcb\xf2\xca\xe0\xff\xff\xff\xff\xcc\xfb\xbaP\xff\xff\xff\xff\xcd\xd3\xfe`\xff\xff\xff\xffΝ\xa5\xd0\xff\xff\xff\xff\xd2azp\xff\xff\xff\xff" +
-	"\xd3x\xf8p\xff\xff\xff\xff\xd4B\xad\xf0\xff\xff\xff\xff\xd5K\xabp\xff\xff\xff\xff\xd6tL\xf0\xff\xff\xff\xff\xd7?S\xf0\xff\xff\xff\xff\xd8/D\xf0\xff\xff\xff\xff\xd8\xf8\xfap\xff\xff\xff\xff\xda\r\xd5p" +
-	"\xff\xff\xff\xff\xda\xd8\xdcp\xff\xff\xff\xff\xdb\xed\xb7p\xff\xff\xff\xffܸ\xbep\xff\xff\xff\xff\xdd\xce\xea\xf0\xff\xff\xff\xffޡ\xda\xf0\xff\xff\xff\xff߶\xb5\xf0\xff\xff\xff\xff\xe0\x81\xbc\xf0\xff\xff\xff\xff" +
-	"ᖗ\xf0\xff\xff\xff\xff\xe2O)\xf0\xff\xff\xff\xff\xe3vy\xf0\xff\xff\xff\xff\xe4/\v\xf0\xff\xff\xff\xff\xe5_\x96p\xff\xff\xff\xff\xe6\x0e\xed\xf0\xff\xff\xff\xff\xe7?\xa9\xa8\xff\xff\xff\xff\xe7\xf8I\xb8" +
-	"\xff\xff\xff\xff\xe9\x1f\x8b\xa8\xff\xff\xff\xff\xe9\xd8+\xb8\xff\xff\xff\xff\xea\xffm\xa8\xff\xff\xff\xff\xeb\xb8\r\xb8\xff\xff\xff\xff\xec\xdfO\xa8\xff\xff\xff\xff\xed\x97\xef\xb8\xff\xff\xff\xff\xee\xc8l(\xff\xff\xff\xff" +
-	"\xefwѸ\xff\xff\xff\xff\xf0\xa8N(\xff\xff\xff\xff\xf1W\xb3\xb8\xff\xff\xff\xff\xf2\x880(\xff\xff\xff\xff\xf3@\xd08\xff\xff\xff\xff\xf4h\x12(\xff\xff\xff\xff\xf5 \xb28\xff\xff\xff\xff\xf6G\xf4(" +
-	"\xff\xff\xff\xff\xf7%~8\xff\xff\xff\xff\xf8\x15S\x18\xff\xff\xff\xff\xf9\x05`8\xff\xff\xff\xff\xf9\xf55\x18\xff\xff\xff\xff\xfa\xe5B8\xff\xff\xff\xff\xfb\xde_\xa8\xff\xff\xff\xff\xfc\xce^\xb8\xff\xff\xff\xff" +
-	"\xfd\xbeA\xa8\xff\xff\xff\xff\xfe\xae@\xb8\xff\xff\xff\xff\xff\x9e#\xa8\x00\x00\x00\x00\x00\x8e\"\xb8\x00\x00\x00\x00\x01~\x05\xa8\x00\x00\x00\x00\x02n\x04\xb8\x00\x00\x00\x00\x03]\xe7\xa8\x00\x00\x00\x00\x04M\xe6\xb8" +
-	"\x00\x00\x00\x00\x05G\x04(\x00\x00\x00\x00\x067\x038\x00\x00\x00\x00\a&\xe6(\x00\x00\x00\x00\a\x83=8\x00\x00\x00\x00\t\x06\xc8(\x00\x00\x00\x00\t\xf6\xc78\x00\x00\x00\x00\n\xe6\xaa(\x00\x00\x00\x00" +
-	"\v֩8\x00\x00\x00\x00\fƌ(\x00\x00\x00\x00\x11\x9b98\x00\x00\x00\x00\x12ol\xa8\x01\x03\x02\x03\x02\x03\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04" +
-	"\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x00\x00jr\x00\x00\x00\x00p\x80\x00\x04\x00\x00\x8c\xa0\x01\b\x00\x00~" +
-	"\x90\x00\f\x00\x00~\x90\x01\x10LMT\x00CST\x00+10\x00+09\x00CDT\x00\nCST-8\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1d?v\f\x17\x03\x00\x00\x17\x03" +
-	"\x00\x00\n\x00\x00\x00Asia/MacauTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01" +
-	"\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00G\x00\x00\x00\x05\x00\x00\x00\x14\xff\xff\xff\xff\x85i[\x8e\xff" +
-	"\xff\xff\xff\xcbGu\xf0\xff\xff\xff\xff\xcb\xf2\xca\xe0\xff\xff\xff\xff\xcc\xfb\xbaP\xff\xff\xff\xff\xcd\xd3\xfe`\xff\xff\xff\xffΝ\xa5\xd0\xff\xff\xff\xff\xd2azp\xff\xff\xff\xff\xd3x\xf8p\xff\xff\xff\xff\xd4" +
-	"B\xad\xf0\xff\xff\xff\xff\xd5K\xabp\xff\xff\xff\xff\xd6tL\xf0\xff\xff\xff\xff\xd7?S\xf0\xff\xff\xff\xff\xd8/D\xf0\xff\xff\xff\xff\xd8\xf8\xfap\xff\xff\xff\xff\xda\r\xd5p\xff\xff\xff\xff\xda\xd8\xdcp\xff" +
-	"\xff\xff\xff\xdb\xed\xb7p\xff\xff\xff\xffܸ\xbep\xff\xff\xff\xff\xdd\xce\xea\xf0\xff\xff\xff\xffޡ\xda\xf0\xff\xff\xff\xff߶\xb5\xf0\xff\xff\xff\xff\xe0\x81\xbc\xf0\xff\xff\xff\xffᖗ\xf0\xff\xff\xff\xff\xe2" +
-	"O)\xf0\xff\xff\xff\xff\xe3vy\xf0\xff\xff\xff\xff\xe4/\v\xf0\xff\xff\xff\xff\xe5_\x96p\xff\xff\xff\xff\xe6\x0e\xed\xf0\xff\xff\xff\xff\xe7?\xa9\xa8\xff\xff\xff\xff\xe7\xf8I\xb8\xff\xff\xff\xff\xe9\x1f\x8b\xa8\xff" +
-	"\xff\xff\xff\xe9\xd8+\xb8\xff\xff\xff\xff\xea\xffm\xa8\xff\xff\xff\xff\xeb\xb8\r\xb8\xff\xff\xff\xff\xec\xdfO\xa8\xff\xff\xff\xff\xed\x97\xef\xb8\xff\xff\xff\xff\xee\xc8l(\xff\xff\xff\xff\xefwѸ\xff\xff\xff\xff\xf0" +
-	"\xa8N(\xff\xff\xff\xff\xf1W\xb3\xb8\xff\xff\xff\xff\xf2\x880(\xff\xff\xff\xff\xf3@\xd08\xff\xff\xff\xff\xf4h\x12(\xff\xff\xff\xff\xf5 \xb28\xff\xff\xff\xff\xf6G\xf4(\xff\xff\xff\xff\xf7%~8\xff" +
-	"\xff\xff\xff\xf8\x15S\x18\xff\xff\xff\xff\xf9\x05`8\xff\xff\xff\xff\xf9\xf55\x18\xff\xff\xff\xff\xfa\xe5B8\xff\xff\xff\xff\xfb\xde_\xa8\xff\xff\xff\xff\xfc\xce^\xb8\xff\xff\xff\xff\xfd\xbeA\xa8\xff\xff\xff\xff\xfe" +
-	"\xae@\xb8\xff\xff\xff\xff\xff\x9e#\xa8\x00\x00\x00\x00\x00\x8e\"\xb8\x00\x00\x00\x00\x01~\x05\xa8\x00\x00\x00\x00\x02n\x04\xb8\x00\x00\x00\x00\x03]\xe7\xa8\x00\x00\x00\x00\x04M\xe6\xb8\x00\x00\x00\x00\x05G\x04(\x00" +
-	"\x00\x00\x00\x067\x038\x00\x00\x00\x00\a&\xe6(\x00\x00\x00\x00\a\x83=8\x00\x00\x00\x00\t\x06\xc8(\x00\x00\x00\x00\t\xf6\xc78\x00\x00\x00\x00\n\xe6\xaa(\x00\x00\x00\x00\v֩8\x00\x00\x00\x00\f" +
-	"ƌ(\x00\x00\x00\x00\x11\x9b98\x00\x00\x00\x00\x12ol\xa8\x01\x03\x02\x03\x02\x03\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01" +
-	"\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x00\x00jr\x00\x00\x00\x00p\x80\x00\x04\x00\x00\x8c\xa0\x01\b\x00\x00~\x90\x00\f\x00\x00~\x90\x01\x10" +
-	"LMT\x00CST\x00+10\x00+09\x00CDT\x00\nCST-8\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe4_P\x18\xef\x02\x00\x00\xef\x02\x00\x00\f\x00\x00\x00Asi" +
-	"a/MagadanTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00" +
-	"TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00B\x00\x00\x00\x06\x00\x00\x00\x10\xff\xff\xff\xff\xaa\x196\xa0\xff\xff\xff\xff\xb5\xa3\xa8\xe0" +
-	"\x00\x00\x00\x00\x15'7P\x00\x00\x00\x00\x16\x18k\xc0\x00\x00\x00\x00\x17\bj\xd0\x00\x00\x00\x00\x17\xf9\x9f@\x00\x00\x00\x00\x18\xe9\x9eP\x00\x00\x00\x00\x19\xda\xd2\xc0\x00\x00\x00\x00\x1a\xcc#P\x00\x00\x00\x00" +
-	"\x1b\xbc0p\x00\x00\x00\x00\x1c\xac!p\x00\x00\x00\x00\x1d\x9c\x12p\x00\x00\x00\x00\x1e\x8c\x03p\x00\x00\x00\x00\x1f{\xf4p\x00\x00\x00\x00 k\xe5p\x00\x00\x00\x00![\xd6p\x00\x00\x00\x00\"K\xc7p" +
-	"\x00\x00\x00\x00#;\xb8p\x00\x00\x00\x00$+\xa9p\x00\x00\x00\x00%\x1b\x9ap\x00\x00\x00\x00&\v\x8bp\x00\x00\x00\x00'\x04\xb6\xf0\x00\x00\x00\x00'\xf4\xa7\xf0\x00\x00\x00\x00(\xe4\xa7\x00\x00\x00\x00\x00" +
-	")xO\x00\x00\x00\x00\x00)ԉ\xf0\x00\x00\x00\x00*\xc4z\xf0\x00\x00\x00\x00+\xb4k\xf0\x00\x00\x00\x00,\xa4\\\xf0\x00\x00\x00\x00-\x94M\xf0\x00\x00\x00\x00.\x84>\xf0\x00\x00\x00\x00/t/\xf0" +
-	"\x00\x00\x00\x000d \xf0\x00\x00\x00\x001]Lp\x00\x00\x00\x002r'p\x00\x00\x00\x003=.p\x00\x00\x00\x004R\tp\x00\x00\x00\x005\x1d\x10p\x00\x00\x00\x0061\xebp\x00\x00\x00\x00" +
-	"6\xfc\xf2p\x00\x00\x00\x008\x1b\a\xf0\x00\x00\x00\x008\xdc\xd4p\x00\x00\x00\x009\xfa\xe9\xf0\x00\x00\x00\x00:\xbc\xb6p\x00\x00\x00\x00;\xda\xcb\xf0\x00\x00\x00\x00<\xa5\xd2\xf0\x00\x00\x00\x00=\xba\xad\xf0" +
-	"\x00\x00\x00\x00>\x85\xb4\xf0\x00\x00\x00\x00?\x9a\x8f\xf0\x00\x00\x00\x00@e\x96\xf0\x00\x00\x00\x00A\x83\xacp\x00\x00\x00\x00BEx\xf0\x00\x00\x00\x00Cc\x8ep\x00\x00\x00\x00D%Z\xf0\x00\x00\x00\x00" +
-	"ECpp\x00\x00\x00\x00F\x05<\xf0\x00\x00\x00\x00G#Rp\x00\x00\x00\x00G\xeeYp\x00\x00\x00\x00I\x034p\x00\x00\x00\x00I\xce;p\x00\x00\x00\x00J\xe3\x16p\x00\x00\x00\x00K\xae\x1dp" +
-	"\x00\x00\x00\x00L\xcc2\xf0\x00\x00\x00\x00M\x8d\xffp\x00\x00\x00\x00TK\xac\xe0\x00\x00\x00\x00W\x1b\x9c\x00\x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x04\x01\x03\x02\x03\x02" +
-	"\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x05\x01\x03\x00\x00\x8d`\x00\x00\x00\x00\x8c\xa0\x00\x04\x00\x00\xa8\xc0\x01\b\x00\x00\x9a\xb0" +
-	"\x00\f\x00\x00\x9a\xb0\x01\f\x00\x00\xa8\xc0\x00\bLMT\x00+10\x00+12\x00+11\x00\n<+11>-11\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00`\xc9\xd4\\\xbe\x00" +
-	"\x00\x00\xbe\x00\x00\x00\r\x00\x00\x00Asia/MakassarTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x05\x00\x00\x00\x15\xff\xff" +
-	"\xff\xff\xa1\xf2]\x90\xff\xff\xff\xff\xba\x16Ր\xff\xff\xff\xffˈ\x1d\x80\xff\xff\xff\xff\xd2V\xeep\x01\x02\x03\x04\x00\x00o\xf0\x00\x00\x00\x00o\xf0\x00\x04\x00\x00p\x80\x00\b\x00\x00~\x90\x00\f\x00\x00" +
-	"p\x80\x00\x10LMT\x00MMT\x00+08\x00+09\x00WITA\x00\nWITA-8\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00ǯ\xdf\x1c\xee\x00\x00\x00\xee\x00\x00\x00\v" +
-	"\x00\x00\x00Asia/ManilaTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00" +
-	"\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00\x00\x00\x05\x00\x00\x00\x10\xff\xff\xff\xff\x14\xe1\xdc\x10\xff\xff\xff" +
-	"\xff{\x1f?\x90\xff\xff\xff\xff\xc1\x9c\xf4\x80\xff\xff\xff\xff\xc2\x160p\xff\xff\xff\xff\xcb\xf2\xe7\x00\xff\xff\xff\xffЩ%p\xff\xff\xff\xff\xe2l9\x00\xff\xff\xff\xff\xe2բ\xf0\x00\x00\x00\x00\x0fuF" +
-	"\x80\x00\x00\x00\x00\x10fz\xf0\x01\x03\x02\x03\x04\x03\x02\x03\x02\x03\xff\xff\x1f\xf0\x00\x00\x00\x00qp\x00\x00\x00\x00~\x90\x01\x04\x00\x00p\x80\x00\b\x00\x00~\x90\x00\fLMT\x00PDT\x00PST" +
-	"\x00JST\x00\nPST-8\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xed\x8c\xf1\x91\x85\x00\x00\x00\x85\x00\x00\x00\v\x00\x00\x00Asia/MuscatTZif2\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\b\xff\xff\xff\xff\xa1\xf2\x99\xa8\x01\x00\x003\xd8\x00\x00\x00\x008@\x00\x04LMT\x00+04\x00\n<+" +
-	"04>-4\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03R\xda\xedU\x02\x00\x00U\x02\x00\x00\f\x00\x00\x00Asia/NicosiaTZif2\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x001\x00\x00\x00\x03\x00\x00\x00\r\xff\xff\xff\xff\xa5w\x1e\xb8\x00\x00\x00\x00\t\xed\xaf\xe0\x00\x00\x00\x00\nݒ\xd0\x00\x00\x00\x00\v\xfad\xe0\x00\x00\x00\x00\f" +
-	"\xbe\xc6P\x00\x00\x00\x00\r\xa49`\x00\x00\x00\x00\x0e\x8a\xe1\xd0\x00\x00\x00\x00\x0f\x84\x1b`\x00\x00\x00\x00\x10uO\xd0\x00\x00\x00\x00\x11c\xfd`\x00\x00\x00\x00\x12S\xe0P\x00\x00\x00\x00\x13M\x19\xe0\x00" +
-	"\x00\x00\x00\x143\xc2P\x00\x00\x00\x00\x15#\xc1`\x00\x00\x00\x00\x16\x13\xa4P\x00\x00\x00\x00\x17\x03\xa3`\x00\x00\x00\x00\x17\xf3\x86P\x00\x00\x00\x00\x18\xe3\x85`\x00\x00\x00\x00\x19\xd3hP\x00\x00\x00\x00\x1a" +
-	"\xc3g`\x00\x00\x00\x00\x1b\xbc\x84\xd0\x00\x00\x00\x00\x1c\xac\x83\xe0\x00\x00\x00\x00\x1d\x9cf\xd0\x00\x00\x00\x00\x1e\x8ce\xe0\x00\x00\x00\x00\x1f|H\xd0\x00\x00\x00\x00 lG\xe0\x00\x00\x00\x00!\\*\xd0\x00" +
-	"\x00\x00\x00\"L)\xe0\x00\x00\x00\x00#<\f\xd0\x00\x00\x00\x00$,\v\xe0\x00\x00\x00\x00%\x1b\xee\xd0\x00\x00\x00\x00&\v\xed\xe0\x00\x00\x00\x00'\x05\vP\x00\x00\x00\x00'\xf5\n`\x00\x00\x00\x00(" +
-	"\xe4\xedP\x00\x00\x00\x00)\xd4\xec`\x00\x00\x00\x00*\xc4\xcfP\x00\x00\x00\x00+\xb4\xce`\x00\x00\x00\x00,\xa4\xb1P\x00\x00\x00\x00-\x94\xb0`\x00\x00\x00\x00.\x84\x93P\x00\x00\x00\x00/t\x92`\x00" +
-	"\x00\x00\x000duP\x00\x00\x00\x001]\xae\xe0\x00\x00\x00\x002M\x91\xd0\x00\x00\x00\x003=\x90\xe0\x00\x00\x00\x004-s\xd0\x00\x00\x00\x005\x1dr\xe0\x00\x00\x00\x0062x\x10\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x00\x00\x1fH\x00\x00\x00\x00*0\x01\x04\x00\x00\x1c " +
-	"\x00\tLMT\x00EEST\x00EET\x00\nEET-2EEST,M3.5.0/3,M10.5.0/4\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8a" +
-	"\x9a\x90\xf7\xd6\x02\x00\x00\xd6\x02\x00\x00\x11\x00\x00\x00Asia/NovokuznetskTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00@\x00" +
-	"\x00\x00\x05\x00\x00\x00\x10\xff\xff\xff\xff\xaa\x18 \xc0\xff\xff\xff\xff\xb5\xa3\xe1 \x00\x00\x00\x00\x15'o\x90\x00\x00\x00\x00\x16\x18\xa4\x00\x00\x00\x00\x00\x17\b\xa3\x10\x00\x00\x00\x00\x17\xf9׀\x00\x00\x00\x00\x18" +
-	"\xe9\u0590\x00\x00\x00\x00\x19\xdb\v\x00\x00\x00\x00\x00\x1a\xcc[\x90\x00\x00\x00\x00\x1b\xbch\xb0\x00\x00\x00\x00\x1c\xacY\xb0\x00\x00\x00\x00\x1d\x9cJ\xb0\x00\x00\x00\x00\x1e\x8c;\xb0\x00\x00\x00\x00\x1f|,\xb0\x00" +
-	"\x00\x00\x00 l\x1d\xb0\x00\x00\x00\x00!\\\x0e\xb0\x00\x00\x00\x00\"K\xff\xb0\x00\x00\x00\x00#;\xf0\xb0\x00\x00\x00\x00$+\xe1\xb0\x00\x00\x00\x00%\x1bҰ\x00\x00\x00\x00&\vð\x00\x00\x00\x00'" +
-	"\x04\xef0\x00\x00\x00\x00'\xf4\xe00\x00\x00\x00\x00(\xe4\xdf@\x00\x00\x00\x00)x\x87@\x00\x00\x00\x00)\xd4\xc20\x00\x00\x00\x00*ij0\x00\x00\x00\x00+\xb4\xa40\x00\x00\x00\x00,\xa4\x950\x00" +
-	"\x00\x00\x00-\x94\x860\x00\x00\x00\x00.\x84w0\x00\x00\x00\x00/th0\x00\x00\x00\x000dY0\x00\x00\x00\x001]\x84\xb0\x00\x00\x00\x002r_\xb0\x00\x00\x00\x003=f\xb0\x00\x00\x00\x004" +
-	"RA\xb0\x00\x00\x00\x005\x1dH\xb0\x00\x00\x00\x0062#\xb0\x00\x00\x00\x006\xfd*\xb0\x00\x00\x00\x008\x1b@0\x00\x00\x00\x008\xdd\f\xb0\x00\x00\x00\x009\xfb\"0\x00\x00\x00\x00:\xbc\xee\xb0\x00" +
-	"\x00\x00\x00;\xdb\x040\x00\x00\x00\x00<\xa6\v0\x00\x00\x00\x00=\xba\xe60\x00\x00\x00\x00>\x85\xed0\x00\x00\x00\x00?\x9a\xc80\x00\x00\x00\x00@e\xcf0\x00\x00\x00\x00A\x83\xe4\xb0\x00\x00\x00\x00B" +
-	"E\xb10\x00\x00\x00\x00Ccư\x00\x00\x00\x00D%\x930\x00\x00\x00\x00EC\xa8\xb0\x00\x00\x00\x00F\x05u0\x00\x00\x00\x00G#\x8a\xb0\x00\x00\x00\x00G\ue470\x00\x00\x00\x00I\x03l\xb0\x00" +
-	"\x00\x00\x00I\xces\xb0\x00\x00\x00\x00J\xe3N\xb0\x00\x00\x00\x00K\xaeU\xb0\x00\x00\x00\x00L\xccy@\x00\x00\x00\x00M\x8eE\xc0\x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02" +
-	"\x03\x04\x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x04\x01\x03\x00\x00Q\xc0\x00\x00\x00\x00T`\x00\x04\x00\x00p\x80\x01" +
-	"\b\x00\x00bp\x00\f\x00\x00bp\x01\fLMT\x00+06\x00+08\x00+07\x00\n<+07>-7\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00)p\x1cX\xf1\x02\x00\x00" +
-	"\xf1\x02\x00\x00\x10\x00\x00\x00Asia/NovosibirskTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00C\x00\x00\x00\x05\x00\x00\x00\x10\xff" +
-	"\xff\xff\xff\xa1\xdb\x19$\xff\xff\xff\xff\xb5\xa3\xe1 \x00\x00\x00\x00\x15'o\x90\x00\x00\x00\x00\x16\x18\xa4\x00\x00\x00\x00\x00\x17\b\xa3\x10\x00\x00\x00\x00\x17\xf9׀\x00\x00\x00\x00\x18\xe9\u0590\x00\x00\x00\x00\x19" +
-	"\xdb\v\x00\x00\x00\x00\x00\x1a\xcc[\x90\x00\x00\x00\x00\x1b\xbch\xb0\x00\x00\x00\x00\x1c\xacY\xb0\x00\x00\x00\x00\x1d\x9cJ\xb0\x00\x00\x00\x00\x1e\x8c;\xb0\x00\x00\x00\x00\x1f|,\xb0\x00\x00\x00\x00 l\x1d\xb0\x00" +
-	"\x00\x00\x00!\\\x0e\xb0\x00\x00\x00\x00\"K\xff\xb0\x00\x00\x00\x00#;\xf0\xb0\x00\x00\x00\x00$+\xe1\xb0\x00\x00\x00\x00%\x1bҰ\x00\x00\x00\x00&\vð\x00\x00\x00\x00'\x04\xef0\x00\x00\x00\x00'" +
-	"\xf4\xe00\x00\x00\x00\x00(\xe4\xdf@\x00\x00\x00\x00)x\x87@\x00\x00\x00\x00)\xd4\xc20\x00\x00\x00\x00*ij0\x00\x00\x00\x00+\xb4\xa40\x00\x00\x00\x00+\xfeN\x00\x00\x00\x00\x00,\xa4\xa3@\x00" +
-	"\x00\x00\x00-\x94\x94@\x00\x00\x00\x00.\x84\x85@\x00\x00\x00\x00/tv@\x00\x00\x00\x000dg@\x00\x00\x00\x001]\x92\xc0\x00\x00\x00\x002rm\xc0\x00\x00\x00\x003=t\xc0\x00\x00\x00\x004" +
-	"RO\xc0\x00\x00\x00\x005\x1dV\xc0\x00\x00\x00\x00621\xc0\x00\x00\x00\x006\xfd8\xc0\x00\x00\x00\x008\x1bN@\x00\x00\x00\x008\xdd\x1a\xc0\x00\x00\x00\x009\xfb0@\x00\x00\x00\x00:\xbc\xfc\xc0\x00" +
-	"\x00\x00\x00;\xdb\x12@\x00\x00\x00\x00<\xa6\x19@\x00\x00\x00\x00=\xba\xf4@\x00\x00\x00\x00>\x85\xfb@\x00\x00\x00\x00?\x9a\xd6@\x00\x00\x00\x00@e\xdd@\x00\x00\x00\x00A\x83\xf2\xc0\x00\x00\x00\x00B" +
-	"E\xbf@\x00\x00\x00\x00Cc\xd4\xc0\x00\x00\x00\x00D%\xa1@\x00\x00\x00\x00EC\xb6\xc0\x00\x00\x00\x00F\x05\x83@\x00\x00\x00\x00G#\x98\xc0\x00\x00\x00\x00G\xee\x9f\xc0\x00\x00\x00\x00I\x03z\xc0\x00" +
-	"\x00\x00\x00I\u0381\xc0\x00\x00\x00\x00J\xe3\\\xc0\x00\x00\x00\x00K\xaec\xc0\x00\x00\x00\x00L\xccy@\x00\x00\x00\x00M\x8eE\xc0\x00\x00\x00\x00TK\xf30\x00\x00\x00\x00W\x93\xcc\xc0\x01\x03\x02\x03\x02" +
-	"\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x04\x01\x03\x02\x03\x02\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x03" +
-	"\x01\x03\x00\x00M\xbc\x00\x00\x00\x00T`\x00\x04\x00\x00p\x80\x01\b\x00\x00bp\x00\f\x00\x00bp\x01\fLMT\x00+06\x00+08\x00+07\x00\n<+07>-7\nPK\x03" +
-	"\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00:\x11\xea\xa2\xe5\x02\x00\x00\xe5\x02\x00\x00\t\x00\x00\x00Asia/OmskTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00A\x00\x00\x00\x06\x00\x00\x00\x10\xff\xff\xff\xff\xa1\xb3@\xb6\xff\xff\xff\xff\xb5\xa3\xef0\x00\x00\x00\x00\x15'}\xa0\x00\x00\x00\x00\x16\x18\xb2\x10\x00\x00\x00\x00\x17\b\xb1 \x00\x00\x00\x00\x17\xf9\xe5\x90\x00" +
-	"\x00\x00\x00\x18\xe9\xe4\xa0\x00\x00\x00\x00\x19\xdb\x19\x10\x00\x00\x00\x00\x1a\xcci\xa0\x00\x00\x00\x00\x1b\xbcv\xc0\x00\x00\x00\x00\x1c\xacg\xc0\x00\x00\x00\x00\x1d\x9cX\xc0\x00\x00\x00\x00\x1e\x8cI\xc0\x00\x00\x00\x00\x1f" +
-	"|:\xc0\x00\x00\x00\x00 l+\xc0\x00\x00\x00\x00!\\\x1c\xc0\x00\x00\x00\x00\"L\r\xc0\x00\x00\x00\x00#;\xfe\xc0\x00\x00\x00\x00$+\xef\xc0\x00\x00\x00\x00%\x1b\xe0\xc0\x00\x00\x00\x00&\v\xd1\xc0\x00" +
-	"\x00\x00\x00'\x04\xfd@\x00\x00\x00\x00'\xf4\xee@\x00\x00\x00\x00(\xe4\xedP\x00\x00\x00\x00)x\x95P\x00\x00\x00\x00)\xd4\xd0@\x00\x00\x00\x00*\xc4\xc1@\x00\x00\x00\x00+\xb4\xb2@\x00\x00\x00\x00," +
-	"\xa4\xa3@\x00\x00\x00\x00-\x94\x94@\x00\x00\x00\x00.\x84\x85@\x00\x00\x00\x00/tv@\x00\x00\x00\x000dg@\x00\x00\x00\x001]\x92\xc0\x00\x00\x00\x002rm\xc0\x00\x00\x00\x003=t\xc0\x00" +
-	"\x00\x00\x004RO\xc0\x00\x00\x00\x005\x1dV\xc0\x00\x00\x00\x00621\xc0\x00\x00\x00\x006\xfd8\xc0\x00\x00\x00\x008\x1bN@\x00\x00\x00\x008\xdd\x1a\xc0\x00\x00\x00\x009\xfb0@\x00\x00\x00\x00:" +
-	"\xbc\xfc\xc0\x00\x00\x00\x00;\xdb\x12@\x00\x00\x00\x00<\xa6\x19@\x00\x00\x00\x00=\xba\xf4@\x00\x00\x00\x00>\x85\xfb@\x00\x00\x00\x00?\x9a\xd6@\x00\x00\x00\x00@e\xdd@\x00\x00\x00\x00A\x83\xf2\xc0\x00" +
-	"\x00\x00\x00BE\xbf@\x00\x00\x00\x00Cc\xd4\xc0\x00\x00\x00\x00D%\xa1@\x00\x00\x00\x00EC\xb6\xc0\x00\x00\x00\x00F\x05\x83@\x00\x00\x00\x00G#\x98\xc0\x00\x00\x00\x00G\xee\x9f\xc0\x00\x00\x00\x00I" +
-	"\x03z\xc0\x00\x00\x00\x00I\u0381\xc0\x00\x00\x00\x00J\xe3\\\xc0\x00\x00\x00\x00K\xaec\xc0\x00\x00\x00\x00L\xccy@\x00\x00\x00\x00M\x8eE\xc0\x00\x00\x00\x00TK\xf30\x01\x03\x02\x03\x02\x03\x02\x03\x02" +
-	"\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x04\x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x05\x03\x00\x00D\xca" +
-	"\x00\x00\x00\x00FP\x00\x04\x00\x00bp\x01\b\x00\x00T`\x00\f\x00\x00T`\x01\f\x00\x00bp\x00\bLMT\x00+05\x00+07\x00+06\x00\n<+06>-6\nPK\x03" +
-	"\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00&\xe9\xd1\xd8q\x02\x00\x00q\x02\x00\x00\t\x00\x00\x00Asia/OralTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x003\x00\x00\x00\a\x00\x00\x00\x14\xff\xff\xff\xff\xaa\x19\x93\xdc\xff\xff\xff\xff\xb5\xa4\vP\x00\x00\x00\x00\x15'\x8b\xb0\x00\x00\x00\x00\x16\x18\xc0 \x00\x00\x00\x00\x17\b\xb1 \x00\x00\x00\x00\x17\xf9\xf3\xa0\x00" +
-	"\x00\x00\x00\x18\xe9\xf2\xb0\x00\x00\x00\x00\x19\xdb' \x00\x00\x00\x00\x1a\xccw\xb0\x00\x00\x00\x00\x1b\xbc\x84\xd0\x00\x00\x00\x00\x1c\xacu\xd0\x00\x00\x00\x00\x1d\x9cf\xd0\x00\x00\x00\x00\x1e\x8cW\xd0\x00\x00\x00\x00\x1f" +
-	"|H\xd0\x00\x00\x00\x00 l9\xd0\x00\x00\x00\x00!\\*\xd0\x00\x00\x00\x00\"L\x1b\xd0\x00\x00\x00\x00#<\f\xd0\x00\x00\x00\x00$+\xfd\xd0\x00\x00\x00\x00%\x1b\xfc\xe0\x00\x00\x00\x00&\v\xed\xe0\x00" +
-	"\x00\x00\x00'\x05\x19`\x00\x00\x00\x00'\xf5\n`\x00\x00\x00\x00(\xe4\xfb`\x00\x00\x00\x00)x\xa3`\x00\x00\x00\x00)\xd4\xdeP\x00\x00\x00\x00*\xc4\xdd`\x00\x00\x00\x00+\xb4\xce`\x00\x00\x00\x00," +
-	"\xa4\xbf`\x00\x00\x00\x00-\x94\xb0`\x00\x00\x00\x00.\x84\xa1`\x00\x00\x00\x00/t\x92`\x00\x00\x00\x000d\x83`\x00\x00\x00\x001]\xae\xe0\x00\x00\x00\x002r\x89\xe0\x00\x00\x00\x003=\x90\xe0\x00" +
-	"\x00\x00\x004Rk\xe0\x00\x00\x00\x005\x1dr\xe0\x00\x00\x00\x0062M\xe0\x00\x00\x00\x006\xfdT\xe0\x00\x00\x00\x008\x1bj`\x00\x00\x00\x008\xdd6\xe0\x00\x00\x00\x009\xfbL`\x00\x00\x00\x00:" +
-	"\xbd\x18\xe0\x00\x00\x00\x00;\xdb.`\x00\x00\x00\x00<\xa65`\x00\x00\x00\x00=\xbb\x10`\x00\x00\x00\x00>\x86\x17`\x00\x00\x00\x00?\x9a\xf2`\x00\x00\x00\x00@e\xf9`\x00\x00\x00\x00A\x84\x0e\xe0\x01" +
-	"\x02\x03\x04\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x05\x06\x05\x06\x05\x06\x02\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x02\x00\x000$\x00\x00\x00\x00*0" +
-	"\x00\x04\x00\x00FP\x00\b\x00\x00T`\x01\f\x00\x00T`\x00\f\x00\x00FP\x01\b\x00\x008@\x00\x10LMT\x00+03\x00+05\x00+06\x00+04\x00\n<+05>-5" +
-	"\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\xf6C\x84\x98\x00\x00\x00\x98\x00\x00\x00\x0f\x00\x00\x00Asia/Phnom_PenhTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\f\xff\xff\xff\xffV\xb6\x85\xc4\xff\xff\xff\xff\xa2jg\xc4\x01\x02\x00\x00^<\x00\x00\x00\x00^<\x00\x04\x00\x00bp\x00\bLMT" +
-	"\x00BMT\x00+07\x00\n<+07>-7\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00S\xa5\x81e\xf7\x00\x00\x00\xf7\x00\x00\x00\x0e\x00\x00\x00Asia/Pontian" +
-	"akTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\b\x00\x00\x00\a\x00\x00\x00\x1f\xff\xff\xff\xff\x8b\xff\x8e\x00\xff\xff\xff\xff\xba\x16\xdf\x00\xff\xff\xff\xff\xcby\xa4" +
-	"\b\xff\xff\xff\xff\xd2V\xeep\xff\xff\xff\xff\xd7<\xc6\b\xff\xff\xff\xff\xda\xff&\x00\xff\xff\xff\xff\xf4\xb5\xbe\x88\x00\x00\x00\x00!\xdat\x80\x01\x02\x03\x02\x04\x02\x05\x06\x00\x00f\x80\x00\x00\x00\x00f\x80\x00" +
-	"\x04\x00\x00ix\x00\b\x00\x00~\x90\x00\x0e\x00\x00p\x80\x00\x12\x00\x00p\x80\x00\x16\x00\x00bp\x00\x1bLMT\x00PMT\x00+0730\x00+09\x00+08\x00WITA\x00WI" +
-	"B\x00\nWIB-7\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8a\xc1\x1eB\xb7\x00\x00\x00\xb7\x00\x00\x00\x0e\x00\x00\x00Asia/PyongyangTZif2\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x04\x00\x00\x00\f\xff\xff\xff\xff\x8b\xd7\xf1\x9c\xff\xff\xff\xff\x92\xe6\x16\xf8\xff\xff\xff\xff\xd2/ap\x00\x00\x00\x00U\xce\x02p" +
-	"\x00\x00\x00\x00Z\xecup\x01\x02\x03\x01\x03\x00\x00u\xe4\x00\x00\x00\x00w\x88\x00\x04\x00\x00~\x90\x00\b\x00\x00~\x90\x00\x04LMT\x00KST\x00JST\x00\nKST-9\nPK\x03\x04" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdav\x19z\x98\x00\x00\x00\x98\x00\x00\x00\n\x00\x00\x00Asia/QatarTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\f\xff\xff\xff\xff\xa1\xf2\x9d0\x00\x00\x00\x00\x04\x8a\x92\xc0\x01\x02\x00\x000P\x00\x00\x00\x008@\x00\x04\x00\x00*0\x00\bLMT\x00+04\x00+03\x00\n" +
-	"<+03>-3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa1\xfax\x98g\x02\x00\x00g\x02\x00\x00\r\x00\x00\x00Asia/QostanayTZif2\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x003\x00\x00\x00\x06\x00\x00\x00\x10\xff\xff\xff\xff\xaa\x19\x88\\\xff\xff\xff\xff\xb5\xa3\xfd@\x00\x00\x00\x00\x15'\x8b\xb0\x00\x00\x00\x00\x16\x18\xc0 \x00\x00" +
-	"\x00\x00\x17\b\xb1 \x00\x00\x00\x00\x17\xf9\xf3\xa0\x00\x00\x00\x00\x18\xe9\xf2\xb0\x00\x00\x00\x00\x19\xdb' \x00\x00\x00\x00\x1a\xccw\xb0\x00\x00\x00\x00\x1b\xbc\x84\xd0\x00\x00\x00\x00\x1c\xacu\xd0\x00\x00\x00\x00\x1d\x9c" +
-	"f\xd0\x00\x00\x00\x00\x1e\x8cW\xd0\x00\x00\x00\x00\x1f|H\xd0\x00\x00\x00\x00 l9\xd0\x00\x00\x00\x00!\\*\xd0\x00\x00\x00\x00\"L\x1b\xd0\x00\x00\x00\x00#<\f\xd0\x00\x00\x00\x00$+\xfd\xd0\x00\x00" +
-	"\x00\x00%\x1b\xee\xd0\x00\x00\x00\x00&\v\xdf\xd0\x00\x00\x00\x00'\x05\vP\x00\x00\x00\x00'\xf4\xfcP\x00\x00\x00\x00(\xe4\xfb`\x00\x00\x00\x00)x\xa3`\x00\x00\x00\x00)\xd4\xdeP\x00\x00\x00\x00*\xc4" +
-	"\xcfP\x00\x00\x00\x00+\xb4\xc0P\x00\x00\x00\x00,\xa4\xb1P\x00\x00\x00\x00-\x94\xa2P\x00\x00\x00\x00.\x84\x93P\x00\x00\x00\x00/t\x84P\x00\x00\x00\x000duP\x00\x00\x00\x001]\xa0\xd0\x00\x00" +
-	"\x00\x002r{\xd0\x00\x00\x00\x003=\x82\xd0\x00\x00\x00\x004R]\xd0\x00\x00\x00\x005\x1dd\xd0\x00\x00\x00\x0062?\xd0\x00\x00\x00\x006\xfdF\xd0\x00\x00\x00\x008\x1b\\P\x00\x00\x00\x008\xdd" +
-	"(\xd0\x00\x00\x00\x009\xfb>P\x00\x00\x00\x00:\xbd\n\xd0\x00\x00\x00\x00;\xdb P\x00\x00\x00\x00<\xa6'P\x00\x00\x00\x00=\xbb\x02P\x00\x00\x00\x00>\x86\tP\x00\x00\x00\x00?\x9a\xe4P\x00\x00" +
-	"\x00\x00@e\xebP\x00\x00\x00\x00A\x84\x00\xd0\x01\x02\x03\x04\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x05\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03" +
-	"\x02\x03\x02\x03\x04\x00\x00;\xa4\x00\x00\x00\x008@\x00\x04\x00\x00FP\x00\b\x00\x00T`\x01\f\x00\x00T`\x00\f\x00\x00FP\x01\bLMT\x00+04\x00+05\x00+06\x00\n<+" +
-	"06>-6\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd5ΜGp\x02\x00\x00p\x02\x00\x00\x0e\x00\x00\x00Asia/QyzylordaTZif2\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x004\x00\x00\x00\x06\x00\x00\x00\x10\xff\xff\xff\xff\xaa\x19\x86\xa0\xff\xff\xff\xff\xb5\xa3\xfd@\x00\x00\x00\x00\x15'\x8b\xb0\x00\x00\x00\x00\x16\x18\xc0 \x00\x00\x00" +
-	"\x00\x17\b\xb1 \x00\x00\x00\x00\x17\xf9\xf3\xa0\x00\x00\x00\x00\x18\xe9\xf2\xb0\x00\x00\x00\x00\x19\xdb' \x00\x00\x00\x00\x1a\xccw\xb0\x00\x00\x00\x00\x1b\xbc\x84\xd0\x00\x00\x00\x00\x1c\xacu\xd0\x00\x00\x00\x00\x1d\x9cf" +
-	"\xd0\x00\x00\x00\x00\x1e\x8cW\xd0\x00\x00\x00\x00\x1f|H\xd0\x00\x00\x00\x00 l9\xd0\x00\x00\x00\x00!\\*\xd0\x00\x00\x00\x00\"L\x1b\xd0\x00\x00\x00\x00#<\f\xd0\x00\x00\x00\x00$+\xfd\xd0\x00\x00\x00" +
-	"\x00%\x1b\xee\xd0\x00\x00\x00\x00&\v\xdf\xd0\x00\x00\x00\x00'\x05\vP\x00\x00\x00\x00'\xf4\xfcP\x00\x00\x00\x00(\xe4\xfb`\x00\x00\x00\x00)x\x95P\x00\x00\x00\x00)\xd4\xd0@\x00\x00\x00\x00*\xc4\xcf" +
-	"P\x00\x00\x00\x00+\xb4\xc0P\x00\x00\x00\x00,\xa4\xb1P\x00\x00\x00\x00-\x94\xa2P\x00\x00\x00\x00.\x84\x93P\x00\x00\x00\x00/t\x84P\x00\x00\x00\x000duP\x00\x00\x00\x001]\xa0\xd0\x00\x00\x00" +
-	"\x002r{\xd0\x00\x00\x00\x003=\x82\xd0\x00\x00\x00\x004R]\xd0\x00\x00\x00\x005\x1dd\xd0\x00\x00\x00\x0062?\xd0\x00\x00\x00\x006\xfdF\xd0\x00\x00\x00\x008\x1b\\P\x00\x00\x00\x008\xdd(" +
-	"\xd0\x00\x00\x00\x009\xfb>P\x00\x00\x00\x00:\xbd\n\xd0\x00\x00\x00\x00;\xdb P\x00\x00\x00\x00<\xa6'P\x00\x00\x00\x00=\xbb\x02P\x00\x00\x00\x00>\x86\tP\x00\x00\x00\x00?\x9a\xe4P\x00\x00\x00" +
-	"\x00@e\xebP\x00\x00\x00\x00A\x84\x00\xd0\x00\x00\x00\x00\\\x1bؠ\x01\x02\x03\x04\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x05\x02\x04\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02" +
-	"\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x04\x02\x00\x00=`\x00\x00\x00\x008@\x00\x04\x00\x00FP\x00\b\x00\x00T`\x01\f\x00\x00T`\x00\f\x00\x00FP\x01\bLMT\x00+04\x00+05" +
-	"\x00+06\x00\n<+05>-5\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00ʇ{_\xbb\x00\x00\x00\xbb\x00\x00\x00\f\x00\x00\x00Asia/RangoonTZif" +
-	"2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x12\xff\xff\xff\xffV\xb6\x89\xd1\xff\xff\xff\xff\xa1\xf2sQ\xff\xff\xff\xff\xcb\xf2\xfc\x18\xff\xff\xff\xff\xd1" +
-	"\x9ag\xf0\x01\x02\x03\x02\x00\x00Z/\x00\x00\x00\x00Z/\x00\x04\x00\x00[h\x00\b\x00\x00~\x90\x00\x0eLMT\x00RMT\x00+0630\x00+09\x00\n<+0630>-6:" +
-	"30\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcfׇ\xe1\x85\x00\x00\x00\x85\x00\x00\x00\v\x00\x00\x00Asia/RiyadhTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\b\xff\xff\xff\xff\xd5\x1b6\xb4\x01\x00\x00+\xcc\x00\x00\x00\x00*0\x00\x04LMT\x00+03\x00\n<+03>-3\nPK\x03" +
-	"\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x000I\xc7\xde\xec\x00\x00\x00\xec\x00\x00\x00\v\x00\x00\x00Asia/SaigonTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\t\x00\x00\x00\x05\x00\x00\x00\x15\xff\xff\xff\xff\x88\x8cC\x8a\xff\xff\xff\xff\x91\xa3+\n\xff\xff\xff\xff\xcd5\xe6\x80\xff\xff\xff\xff\xd1Y\xcep\xff\xff\xff\xff\xd2;>\xf0\xff\xff\xff\xff\xd52\xbb" +
-	"\x10\xff\xff\xff\xff\xe4\xb6\xe4\x80\xff\xff\xff\xff\xed/\x98\x00\x00\x00\x00\x00\n=\xc7\x00\x01\x02\x03\x04\x02\x03\x02\x03\x02\x00\x00c\xf6\x00\x00\x00\x00c\xf6\x00\x04\x00\x00bp\x00\t\x00\x00p\x80\x00\r\x00\x00" +
-	"~\x90\x00\x11LMT\x00PLMT\x00+07\x00+08\x00+09\x00\n<+07>-7\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00)\x15II\xf3\x02\x00\x00\xf3\x02\x00\x00" +
-	"\r\x00\x00\x00Asia/SakhalinTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" +
-	"\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00B\x00\x00\x00\x06\x00\x00\x00\x14\xff\xff\xff\xff\x86\xf0\u0378" +
-	"\xff\xff\xff\xff\xd20\xb2\xf0\x00\x00\x00\x00\x15'7P\x00\x00\x00\x00\x16\x18k\xc0\x00\x00\x00\x00\x17\bj\xd0\x00\x00\x00\x00\x17\xf9\x9f@\x00\x00\x00\x00\x18\xe9\x9eP\x00\x00\x00\x00\x19\xda\xd2\xc0\x00\x00\x00\x00" +
-	"\x1a\xcc#P\x00\x00\x00\x00\x1b\xbc0p\x00\x00\x00\x00\x1c\xac!p\x00\x00\x00\x00\x1d\x9c\x12p\x00\x00\x00\x00\x1e\x8c\x03p\x00\x00\x00\x00\x1f{\xf4p\x00\x00\x00\x00 k\xe5p\x00\x00\x00\x00![\xd6p" +
-	"\x00\x00\x00\x00\"K\xc7p\x00\x00\x00\x00#;\xb8p\x00\x00\x00\x00$+\xa9p\x00\x00\x00\x00%\x1b\x9ap\x00\x00\x00\x00&\v\x8bp\x00\x00\x00\x00'\x04\xb6\xf0\x00\x00\x00\x00'\xf4\xa7\xf0\x00\x00\x00\x00" +
-	"(\xe4\xa7\x00\x00\x00\x00\x00)xO\x00\x00\x00\x00\x00)ԉ\xf0\x00\x00\x00\x00*\xc4z\xf0\x00\x00\x00\x00+\xb4k\xf0\x00\x00\x00\x00,\xa4\\\xf0\x00\x00\x00\x00-\x94M\xf0\x00\x00\x00\x00.\x84>\xf0" +
-	"\x00\x00\x00\x00/t/\xf0\x00\x00\x00\x000d \xf0\x00\x00\x00\x001]Lp\x00\x00\x00\x002r'p\x00\x00\x00\x003=.p\x00\x00\x00\x004R\x17\x80\x00\x00\x00\x005\x1d\x1e\x80\x00\x00\x00\x00" +
-	"61\xf9\x80\x00\x00\x00\x006\xfd\x00\x80\x00\x00\x00\x008\x1b\x16\x00\x00\x00\x00\x008\xdc\xe2\x80\x00\x00\x00\x009\xfa\xf8\x00\x00\x00\x00\x00:\xbcĀ\x00\x00\x00\x00;\xda\xda\x00\x00\x00\x00\x00<\xa5\xe1\x00" +
-	"\x00\x00\x00\x00=\xba\xbc\x00\x00\x00\x00\x00>\x85\xc3\x00\x00\x00\x00\x00?\x9a\x9e\x00\x00\x00\x00\x00@e\xa5\x00\x00\x00\x00\x00A\x83\xba\x80\x00\x00\x00\x00BE\x87\x00\x00\x00\x00\x00Cc\x9c\x80\x00\x00\x00\x00" +
-	"D%i\x00\x00\x00\x00\x00EC~\x80\x00\x00\x00\x00F\x05K\x00\x00\x00\x00\x00G#`\x80\x00\x00\x00\x00G\xeeg\x80\x00\x00\x00\x00I\x03B\x80\x00\x00\x00\x00I\xceI\x80\x00\x00\x00\x00J\xe3$\x80" +
-	"\x00\x00\x00\x00K\xae+\x80\x00\x00\x00\x00L\xccA\x00\x00\x00\x00\x00M\x8e\r\x80\x00\x00\x00\x00TK\xba\xf0\x00\x00\x00\x00V\xf6\xb2\x00\x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03" +
-	"\x02\x03\x04\x05\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x03\x05\x03\x00\x00\x85\xc8\x00\x00\x00\x00~\x90\x00\x04\x00\x00" +
-	"\xa8\xc0\x01\b\x00\x00\x9a\xb0\x00\f\x00\x00\x9a\xb0\x01\f\x00\x00\x8c\xa0\x00\x10LMT\x00+09\x00+12\x00+11\x00+10\x00\n<+11>-11\nPK\x03\x04\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00w\rD\an\x01\x00\x00n\x01\x00\x00\x0e\x00\x00\x00Asia/SamarkandTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x18\x00\x00\x00\x05\x00\x00\x00\x10\xff\xff\xff\xff\xaa\x19\x857\xff\xff\xff\xff\xb5\xa3\xfd@\x00\x00\x00\x00\x15'\x8b\xb0\x00\x00\x00\x00\x16\x18\xc0 \x00\x00\x00\x00\x17\b\xb1 \x00\x00\x00\x00\x17\xf9\xf3\xa0\x00" +
-	"\x00\x00\x00\x18\xe9\xf2\xb0\x00\x00\x00\x00\x19\xdb' \x00\x00\x00\x00\x1a\xccw\xb0\x00\x00\x00\x00\x1b\xbc\x84\xd0\x00\x00\x00\x00\x1c\xacu\xd0\x00\x00\x00\x00\x1d\x9cf\xd0\x00\x00\x00\x00\x1e\x8cW\xd0\x00\x00\x00\x00\x1f" +
-	"|H\xd0\x00\x00\x00\x00 l9\xd0\x00\x00\x00\x00!\\*\xd0\x00\x00\x00\x00\"L\x1b\xd0\x00\x00\x00\x00#<\f\xd0\x00\x00\x00\x00$+\xfd\xd0\x00\x00\x00\x00%\x1b\xee\xd0\x00\x00\x00\x00&\v\xdf\xd0\x00" +
-	"\x00\x00\x00'\x05\vP\x00\x00\x00\x00'\xf4\xfcP\x00\x00\x00\x00(\xe4\xedP\x01\x02\x03\x04\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x00\x00>\xc9\x00\x00\x00\x008@\x00\x04\x00" +
-	"\x00FP\x00\b\x00\x00T`\x01\f\x00\x00T`\x00\fLMT\x00+04\x00+05\x00+06\x00\n<+05>-5\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc7X,Y" +
-	"\x9f\x01\x00\x00\x9f\x01\x00\x00\n\x00\x00\x00Asia/SeoulTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1d\x00\x00\x00\x06\x00\x00\x00\x10\xff\xff\xff" +
-	"\xff\x8b\xd7\xf0x\xff\xff\xff\xff\x92\xe6\x16\xf8\xff\xff\xff\xff\xd2C'\xf0\xff\xff\xff\xff\xd7e\x8fp\xff\xff\xff\xff\xd7\xee\x9d`\xff\xff\xff\xff\xd8\xf8\xfap\xff\xff\xff\xff\xd9\xcd-\xe0\xff\xff\xff\xff\xda\u05ca" +
-	"\xf0\xff\xff\xff\xffۭ\x0f\xe0\xff\xff\xff\xff\xdc\xe6\xe2\xf0\xff\xff\xff\xff\u074c\xf1\xe0\xff\xff\xff\xff\xe2O)\xf0\xff\xff\xff\xff\xe4k\xb7\xf8\xff\xff\xff\xff\xe5\x13\x18h\xff\xff\xff\xff\xe6b\x03x\xff\xff\xff" +
-	"\xff\xe7\x11L\xe8\xff\xff\xff\xff\xe8/px\xff\xff\xff\xff\xe8\xe7\xf4h\xff\xff\xff\xff\xea\x0fRx\xff\xff\xff\xff\xea\xc7\xd6h\xff\xff\xff\xff\xeb\xef4x\xff\xff\xff\xff째h\xff\xff\xff\xff\xed\xcf\x16" +
-	"x\xff\xff\xff\xff\ue1dah\xff\xff\xff\xff\xf05qx\x00\x00\x00\x00 \xa3`\x90\x00\x00\x00\x00!ng\x90\x00\x00\x00\x00\"\x83B\x90\x00\x00\x00\x00#NI\x90\x01\x02\x04\x03\x04\x03\x04\x03\x04\x03\x04" +
-	"\x01\x05\x01\x05\x01\x05\x01\x05\x01\x05\x01\x05\x01\x04\x03\x04\x03\x04\x00\x00w\b\x00\x00\x00\x00w\x88\x00\x04\x00\x00~\x90\x00\b\x00\x00\x8c\xa0\x01\f\x00\x00~\x90\x00\x04\x00\x00\x85\x98\x01\fLMT\x00KS" +
-	"T\x00JST\x00KDT\x00\nKST-9\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00*\xe4@\xa9\x89\x01\x00\x00\x89\x01\x00\x00\r\x00\x00\x00Asia/Shanghai" +
-	"TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1d\x00\x00\x00\x03\x00\x00\x00\f\xff\xff\xff\xff~6C)\xff\xff\xff\xff\xa0\x97\xa2\x80\xff\xff\xff\xff\xa1y\x04\xf0\xff" +
-	"\xff\xff\xff\xc8Y^\x80\xff\xff\xff\xff\xc9\t\xf9p\xff\xff\xff\xff\xc9ӽ\x00\xff\xff\xff\xff\xcb\x05\x8a\xf0\xff\xff\xff\xff\xcb|@\x00\xff\xff\xff\xff\xd2;>\xf0\xff\xff\xff\xffӋ{\x80\xff\xff\xff\xff\xd4" +
-	"B\xad\xf0\xff\xff\xff\xff\xd5E\"\x00\xff\xff\xff\xff\xd6L\xbf\xf0\xff\xff\xff\xff\xd7<\xbf\x00\xff\xff\xff\xff\xd8\x06fp\xff\xff\xff\xff\xd9\x1d\xf2\x80\xff\xff\xff\xff\xd9A|\xf0\x00\x00\x00\x00\x1e\xbaR \x00" +
-	"\x00\x00\x00\x1fi\x9b\x90\x00\x00\x00\x00 ~\x84\xa0\x00\x00\x00\x00!I}\x90\x00\x00\x00\x00\"g\xa1 \x00\x00\x00\x00#)_\x90\x00\x00\x00\x00$G\x83 \x00\x00\x00\x00%\x12|\x10\x00\x00\x00\x00&" +
-	"'e \x00\x00\x00\x00&\xf2^\x10\x00\x00\x00\x00(\aG \x00\x00\x00\x00(\xd2@\x10\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x00\x00q\xd7" +
-	"\x00\x00\x00\x00~\x90\x01\x04\x00\x00p\x80\x00\bLMT\x00CDT\x00CST\x00\nCST-8\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00F7k\x1c\x00\x01\x00\x00\x00\x01\x00\x00\x0e" +
-	"\x00\x00\x00Asia/SingaporeTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" +
-	"\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\b\x00\x00\x00\b\x00\x00\x00 \xff\xff\xff\xff~6S\xa3" +
-	"\xff\xff\xff\xff\x86\x83\x85\xa3\xff\xff\xff\xff\xbagN\x90\xff\xff\xff\xff\xc0\n\xe4`\xff\xff\xff\xffʳ\xe5`\xff\xff\xff\xffˑ_\b\xff\xff\xff\xff\xd2Hm\xf0\x00\x00\x00\x00\x16\x91\xee\x00\x01\x02\x03\x04" +
-	"\x05\x06\x05\a\x00\x00a]\x00\x00\x00\x00a]\x00\x04\x00\x00bp\x00\b\x00\x00g \x01\f\x00\x00g \x00\f\x00\x00ix\x00\x12\x00\x00~\x90\x00\x18\x00\x00p\x80\x00\x1cLMT\x00SMT\x00" +
-	"+07\x00+0720\x00+0730\x00+09\x00+08\x00\n<+08>-8\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4Zߐ\xe6\x02\x00\x00\xe6\x02\x00\x00\x12" +
-	"\x00\x00\x00Asia/SrednekolymskTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00A\x00\x00\x00\x06\x00\x00\x00\x10\xff\xff\xff\xff" +
-	"\xaa\x193\xe4\xff\xff\xff\xff\xb5\xa3\xa8\xe0\x00\x00\x00\x00\x15'7P\x00\x00\x00\x00\x16\x18k\xc0\x00\x00\x00\x00\x17\bj\xd0\x00\x00\x00\x00\x17\xf9\x9f@\x00\x00\x00\x00\x18\xe9\x9eP\x00\x00\x00\x00\x19\xda\xd2\xc0" +
-	"\x00\x00\x00\x00\x1a\xcc#P\x00\x00\x00\x00\x1b\xbc0p\x00\x00\x00\x00\x1c\xac!p\x00\x00\x00\x00\x1d\x9c\x12p\x00\x00\x00\x00\x1e\x8c\x03p\x00\x00\x00\x00\x1f{\xf4p\x00\x00\x00\x00 k\xe5p\x00\x00\x00\x00" +
-	"![\xd6p\x00\x00\x00\x00\"K\xc7p\x00\x00\x00\x00#;\xb8p\x00\x00\x00\x00$+\xa9p\x00\x00\x00\x00%\x1b\x9ap\x00\x00\x00\x00&\v\x8bp\x00\x00\x00\x00'\x04\xb6\xf0\x00\x00\x00\x00'\xf4\xa7\xf0" +
-	"\x00\x00\x00\x00(\xe4\xa7\x00\x00\x00\x00\x00)xO\x00\x00\x00\x00\x00)ԉ\xf0\x00\x00\x00\x00*\xc4z\xf0\x00\x00\x00\x00+\xb4k\xf0\x00\x00\x00\x00,\xa4\\\xf0\x00\x00\x00\x00-\x94M\xf0\x00\x00\x00\x00" +
-	".\x84>\xf0\x00\x00\x00\x00/t/\xf0\x00\x00\x00\x000d \xf0\x00\x00\x00\x001]Lp\x00\x00\x00\x002r'p\x00\x00\x00\x003=.p\x00\x00\x00\x004R\tp\x00\x00\x00\x005\x1d\x10p" +
-	"\x00\x00\x00\x0061\xebp\x00\x00\x00\x006\xfc\xf2p\x00\x00\x00\x008\x1b\a\xf0\x00\x00\x00\x008\xdc\xd4p\x00\x00\x00\x009\xfa\xe9\xf0\x00\x00\x00\x00:\xbc\xb6p\x00\x00\x00\x00;\xda\xcb\xf0\x00\x00\x00\x00" +
-	"<\xa5\xd2\xf0\x00\x00\x00\x00=\xba\xad\xf0\x00\x00\x00\x00>\x85\xb4\xf0\x00\x00\x00\x00?\x9a\x8f\xf0\x00\x00\x00\x00@e\x96\xf0\x00\x00\x00\x00A\x83\xacp\x00\x00\x00\x00BEx\xf0\x00\x00\x00\x00Cc\x8ep" +
-	"\x00\x00\x00\x00D%Z\xf0\x00\x00\x00\x00ECpp\x00\x00\x00\x00F\x05<\xf0\x00\x00\x00\x00G#Rp\x00\x00\x00\x00G\xeeYp\x00\x00\x00\x00I\x034p\x00\x00\x00\x00I\xce;p\x00\x00\x00\x00" +
-	"J\xe3\x16p\x00\x00\x00\x00K\xae\x1dp\x00\x00\x00\x00L\xcc2\xf0\x00\x00\x00\x00M\x8d\xffp\x00\x00\x00\x00TK\xac\xe0\x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x04\x01" +
-	"\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x05\x03\x00\x00\x90\x1c\x00\x00\x00\x00\x8c\xa0\x00\x04\x00\x00\xa8\xc0\x01\b\x00" +
-	"\x00\x9a\xb0\x00\f\x00\x00\x9a\xb0\x01\f\x00\x00\xa8\xc0\x00\bLMT\x00+10\x00+12\x00+11\x00\n<+11>-11\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xee\xf0B" +
-	"B\xff\x01\x00\x00\xff\x01\x00\x00\v\x00\x00\x00Asia/TaipeiTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00)\x00\x00\x00\x04\x00\x00\x00\x10\xff" +
-	"\xff\xff\xfft\xce\xf0\x18\xff\xff\xff\xff\xc3UI\x80\xff\xff\xff\xff\xd2TY\x80\xff\xff\xff\xffӋ{\x80\xff\xff\xff\xff\xd4B\xad\xf0\xff\xff\xff\xff\xd5E\"\x00\xff\xff\xff\xff\xd6L\xbf\xf0\xff\xff\xff\xff\xd7" +
-	"<\xbf\x00\xff\xff\xff\xff\xd8\x06fp\xff\xff\xff\xff\xd9\x1d\xf2\x80\xff\xff\xff\xff\xd9\xe7\x99\xf0\xff\xff\xff\xff\xda\xff&\x00\xff\xff\xff\xff\xdb\xc8\xcdp\xff\xff\xff\xff\xdc\xe0Y\x80\xff\xff\xff\xffݪ\x00\xf0\xff" +
-	"\xff\xff\xff\xders\x00\xff\xff\xff\xffߵdp\xff\xff\xff\xff\xe0|\x85\x00\xff\xff\xff\xffᖗ\xf0\xff\xff\xff\xff\xe2]\xb8\x80\xff\xff\xff\xff\xe3w\xcbp\xff\xff\xff\xff\xe4>\xec\x00\xff\xff\xff\xff\xe5" +
-	"0 p\xff\xff\xff\xff\xe6!q\x00\xff\xff\xff\xff\xe7\x12\xa5p\xff\xff\xff\xff\xe8\x02\xa4\x80\xff\xff\xff\xff\xe8\xf3\xd8\xf0\xff\xff\xff\xff\xe9\xe3\xd8\x00\xff\xff\xff\xff\xea\xd5\fp\xff\xff\xff\xff\xeb\xc5\v\x80\xff" +
-	"\xff\xff\xff\xec\xb6?\xf0\xff\xff\xff\xff\xed\xf7\xfc\x00\xff\xff\xff\xff\xee\x98\xc4\xf0\xff\xff\xff\xff\xef\xd9/\x80\xff\xff\xff\xff\xf0y\xf8p\x00\x00\x00\x00\a\xfcV\x00\x00\x00\x00\x00\b\xed\x8ap\x00\x00\x00\x00\t" +
-	"݉\x80\x00\x00\x00\x00\nν\xf0\x00\x00\x00\x00\x11ۡ\x80\x00\x00\x00\x00\x12T\xddp\x01\x02\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01" +
-	"\x03\x01\x03\x01\x03\x01\x03\x01\x00\x00q\xe8\x00\x00\x00\x00p\x80\x00\x04\x00\x00~\x90\x00\b\x00\x00~\x90\x01\fLMT\x00CST\x00JST\x00CDT\x00\nCST-8\nPK\x03\x04\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb2\xe27Yn\x01\x00\x00n\x01\x00\x00\r\x00\x00\x00Asia/TashkentTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x18\x00\x00\x00\x05\x00\x00\x00\x10\xff\xff\xff\xff\xaa\x19\x83\t\xff\xff\xff\xff\xb5\xa3\xef0\x00\x00\x00\x00\x15'}\xa0\x00\x00\x00\x00\x16\x18\xb2\x10\x00\x00\x00\x00\x17\b\xb1 \x00\x00\x00\x00\x17\xf9\xe5" +
-	"\x90\x00\x00\x00\x00\x18\xe9\xe4\xa0\x00\x00\x00\x00\x19\xdb\x19\x10\x00\x00\x00\x00\x1a\xcci\xa0\x00\x00\x00\x00\x1b\xbcv\xc0\x00\x00\x00\x00\x1c\xacg\xc0\x00\x00\x00\x00\x1d\x9cX\xc0\x00\x00\x00\x00\x1e\x8cI\xc0\x00\x00\x00" +
-	"\x00\x1f|:\xc0\x00\x00\x00\x00 l+\xc0\x00\x00\x00\x00!\\\x1c\xc0\x00\x00\x00\x00\"L\r\xc0\x00\x00\x00\x00#;\xfe\xc0\x00\x00\x00\x00$+\xef\xc0\x00\x00\x00\x00%\x1b\xe0\xc0\x00\x00\x00\x00&\v\xd1" +
-	"\xc0\x00\x00\x00\x00'\x04\xfd@\x00\x00\x00\x00'\xf4\xee@\x00\x00\x00\x00(\xe4\xedP\x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x04\x01\x00\x00@\xf7\x00\x00\x00\x00FP\x00" +
-	"\x04\x00\x00bp\x01\b\x00\x00T`\x00\f\x00\x00T`\x01\fLMT\x00+05\x00+07\x00+06\x00\n<+05>-5\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Ѿ" +
-	"\xa8\xc7u\x02\x00\x00u\x02\x00\x00\f\x00\x00\x00Asia/TbilisiTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x004\x00\x00\x00\x06\x00\x00\x00" +
-	"\x15\xff\xff\xff\xffV\xb6\xba\x01\xff\xff\xff\xff\xaa\x19\x9a\x01\xff\xff\xff\xff\xe7\xda\fP\x00\x00\x00\x00\x15'\x99\xc0\x00\x00\x00\x00\x16\x18\xce0\x00\x00\x00\x00\x17\b\xcd@\x00\x00\x00\x00\x17\xfa\x01\xb0\x00\x00\x00" +
-	"\x00\x18\xea\x00\xc0\x00\x00\x00\x00\x19\xdb50\x00\x00\x00\x00\x1a̅\xc0\x00\x00\x00\x00\x1b\xbc\x92\xe0\x00\x00\x00\x00\x1c\xac\x83\xe0\x00\x00\x00\x00\x1d\x9ct\xe0\x00\x00\x00\x00\x1e\x8ce\xe0\x00\x00\x00\x00\x1f|V" +
-	"\xe0\x00\x00\x00\x00 lG\xe0\x00\x00\x00\x00!\\8\xe0\x00\x00\x00\x00\"L)\xe0\x00\x00\x00\x00#<\x1a\xe0\x00\x00\x00\x00$,\v\xe0\x00\x00\x00\x00%\x1b\xfc\xe0\x00\x00\x00\x00&\v\xed\xe0\x00\x00\x00" +
-	"\x00'\x05\x19`\x00\x00\x00\x00'\xf5\n`\x00\x00\x00\x00(\xe5\tp\x00\x00\x00\x00)\xd4\xdeP\x00\x00\x00\x00*\xc4\xc1@\x00\x00\x00\x00+\xb4\xc0P\x00\x00\x00\x00,\xa4\xa3@\x00\x00\x00\x00-\x94\xa2" +
-	"P\x00\x00\x00\x00.\x84\x85@\x00\x00\x00\x00/tv@\x00\x00\x00\x000dY0\x00\x00\x00\x001]\x92\xc0\x00\x00\x00\x003=f\xb0\x00\x00\x00\x004RA\xb0\x00\x00\x00\x005\x1dV\xc0\x00\x00\x00" +
-	"\x0062#\xb0\x00\x00\x00\x006\xfd8\xc0\x00\x00\x00\x008\x1b@0\x00\x00\x00\x008\xdd\x1a\xc0\x00\x00\x00\x009\xfb\"0\x00\x00\x00\x00:\xbc\xfc\xc0\x00\x00\x00\x00;\xdb\x040\x00\x00\x00\x00<\xa6\x19" +
-	"@\x00\x00\x00\x00=\xba\xe60\x00\x00\x00\x00>\x85\xfb@\x00\x00\x00\x00?\x9a\xc80\x00\x00\x00\x00@e\xdd@\x00\x00\x00\x00@\xddǰ\x00\x00\x00\x00A\x84\x1c\xf0\x00\x00\x00\x00BE\xe9p\x01\x02\x04" +
-	"\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x05\x02\x05\x02\x05\x02\x05\x04\x03\x04\x03\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x05\x02\x04\x00\x00)\xff\x00\x00\x00\x00)\xff\x00" +
-	"\x04\x00\x00*0\x00\t\x00\x00FP\x01\r\x00\x008@\x00\x11\x00\x008@\x01\x11LMT\x00TBMT\x00+03\x00+05\x00+04\x00\n<+04>-4\nPK\x03\x04\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8c\xdb?\xec,\x03\x00\x00,\x03\x00\x00\v\x00\x00\x00Asia/TehranTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00G\x00\x00\x00\x06\x00\x00\x00\x1c\xff\xff\xff\xff\x9al}\xc8\xff\xff\xff\xff\xbf\x00\xccH\x00\x00\x00\x00\r\x94D8\x00\x00\x00\x00\x0e\xad\x13\xb8\x00\x00\x00\x00\x0fys@\x00\x00\x00\x00\x10(\xca\xc0\x00" +
-	"\x00\x00\x00\x10\xed:@\x00\x00\x00\x00\x11\xad\xbcH\x00\x00\x00\x00\x12EJ\xb8\x00\x00\x00\x00\x137\xec\xc8\x00\x00\x00\x00\x14-\x15\xb8\x00\x00\x00\x00( v\xc8\x00\x00\x00\x00(\u06dd\xb8\x00\x00\x00\x00)" +
-	"˜\xc8\x00\x00\x00\x00*\xbe\"\xb8\x00\x00\x00\x00+\xac\xd0H\x00\x00\x00\x00,\x9fV8\x00\x00\x00\x00-\x8e\x03\xc8\x00\x00\x00\x00.\x80\x89\xb8\x00\x00\x00\x00/o7H\x00\x00\x00\x000a\xbd8\x00" +
-	"\x00\x00\x001Pj\xc8\x00\x00\x00\x002B\xf0\xb8\x00\x00\x00\x0032\xef\xc8\x00\x00\x00\x004%u\xb8\x00\x00\x00\x005\x14#H\x00\x00\x00\x006\x06\xa98\x00\x00\x00\x006\xf5V\xc8\x00\x00\x00\x007" +
-	"\xe7ܸ\x00\x00\x00\x008֊H\x00\x00\x00\x009\xc9\x108\x00\x00\x00\x00:\xb9\x0fH\x00\x00\x00\x00;\xab\x958\x00\x00\x00\x00<\x9aB\xc8\x00\x00\x00\x00=\x8cȸ\x00\x00\x00\x00>{vH\x00" +
-	"\x00\x00\x00?m\xfc8\x00\x00\x00\x00@\\\xa9\xc8\x00\x00\x00\x00AO/\xb8\x00\x00\x00\x00B?.\xc8\x00\x00\x00\x00C1\xb4\xb8\x00\x00\x00\x00G\xe2\xc9H\x00\x00\x00\x00H\xd5O8\x00\x00\x00\x00I" +
-	"\xc5NH\x00\x00\x00\x00J\xb7\xd48\x00\x00\x00\x00K\xa6\x81\xc8\x00\x00\x00\x00L\x99\a\xb8\x00\x00\x00\x00M\x87\xb5H\x00\x00\x00\x00Nz;8\x00\x00\x00\x00Oh\xe8\xc8\x00\x00\x00\x00P[n\xb8\x00" +
-	"\x00\x00\x00QKm\xc8\x00\x00\x00\x00R=\xf3\xb8\x00\x00\x00\x00S,\xa1H\x00\x00\x00\x00T\x1f'8\x00\x00\x00\x00U\r\xd4\xc8\x00\x00\x00\x00V\x00Z\xb8\x00\x00\x00\x00V\xef\bH\x00\x00\x00\x00W" +
-	"\xe1\x8e8\x00\x00\x00\x00XэH\x00\x00\x00\x00Y\xc4\x138\x00\x00\x00\x00Z\xb2\xc0\xc8\x00\x00\x00\x00[\xa5F\xb8\x00\x00\x00\x00\\\x93\xf4H\x00\x00\x00\x00]\x86z8\x00\x00\x00\x00^u'\xc8\x00" +
-	"\x00\x00\x00_g\xad\xb8\x00\x00\x00\x00`W\xac\xc8\x00\x00\x00\x00aJ2\xb8\x00\x00\x00\x00b8\xe0H\x00\x00\x00\x00c+f8\x01\x03\x02\x05\x04\x05\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03" +
-	"\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x00\x0008\x00\x00\x00\x0008" +
-	"\x00\x04\x00\x00?H\x01\b\x00\x0018\x00\x0e\x00\x00FP\x01\x14\x00\x008@\x00\x18LMT\x00TMT\x00+0430\x00+0330\x00+05\x00+04\x00\n<+033" +
-	"0>-3:30\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17✳2\x04\x00\x002\x04\x00\x00\r\x00\x00\x00Asia/Tel_AvivTZif3\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00d\x00\x00\x00\x05\x00\x00\x00\x15\xff\xff\xff\xffV\xb6\xc2\xfa\xff\xff\xff\xff\x9e0E\x88\xff\xff\xff\xff\xc8Y\xcf\x00\xff\xff\xff\xff\xc8\xfa\xa6\x00\xff\xff" +
-	"\xff\xff\xc98\x9c\x80\xff\xff\xff\xff\xcc\xe5\xeb\x80\xff\xff\xff\xffͬ\xfe\x00\xff\xff\xff\xff\xce\xc7\x1f\x00\xff\xff\xff\xffϏ\x83\x00\xff\xff\xff\xffЩ\xa4\x00\xff\xff\xff\xffф}\x00\xff\xff\xff\xffҊ" +
-	"׀\xff\xff\xff\xff\xd3e\xb0\x80\xff\xff\xff\xff\xd4l\v\x00\xff\xff\xff\xff\xd7Z0\x80\xff\xff\xff\xff\xd7\xdfX\x00\xff\xff\xff\xff\xd8/À\xff\xff\xff\xff\xd9\x1ec\x00\xff\xff\xff\xff\xda\x10\xf7\x00\xff\xff" +
-	"\xff\xff\xda\xeb\xd0\x00\xff\xff\xff\xff۴4\x00\xff\xff\xff\xffܹ=\x00\xff\xff\xff\xff\xdd\xe0\x8d\x00\xff\xff\xff\xff\u07b4\u0380\xff\xff\xff\xffߤ\xbf\x80\xff\xff\xff\xff\xe0\x8bv\x00\xff\xff\xff\xff\xe1V" +
-	"}\x00\xff\xff\xff\xff\xe2\xbef\x80\xff\xff\xff\xff\xe36_\x00\xff\xff\xff\xff\xe4\x9eH\x80\xff\xff\xff\xff\xe5\x16A\x00\xff\xff\xff\xff\xe6t\xf0\x00\xff\xff\xff\xff\xe7\x11Ҁ\xff\xff\xff\xff\xe8&\xad\x80\xff\xff" +
-	"\xff\xff\xe8\xe8z\x00\x00\x00\x00\x00\b|\x8b\xe0\x00\x00\x00\x00\b\xfd\xb0\xd0\x00\x00\x00\x00\t\xf6\xea`\x00\x00\x00\x00\n\xa63\xd0\x00\x00\x00\x00\x13\xe9\xfc`\x00\x00\x00\x00\x14![`\x00\x00\x00\x00\x1a\xfa" +
-	"\xc6`\x00\x00\x00\x00\x1b\x8en`\x00\x00\x00\x00\x1c\xbe\xf8\xe0\x00\x00\x00\x00\x1dw|\xd0\x00\x00\x00\x00\x1e\xcc\xff`\x00\x00\x00\x00\x1f`\x99P\x00\x00\x00\x00 \x82\xb1`\x00\x00\x00\x00!I\xb5\xd0\x00\x00" +
-	"\x00\x00\"^\x9e\xe0\x00\x00\x00\x00# ]P\x00\x00\x00\x00$Z0`\x00\x00\x00\x00%\x00?P\x00\x00\x00\x00&\v\xed\xe0\x00\x00\x00\x00&\xd6\xe6\xd0\x00\x00\x00\x00'\xeb\xcf\xe0\x00\x00\x00\x00(\xc0" +
-	"\x03P\x00\x00\x00\x00)\xd4\xec`\x00\x00\x00\x00*\xa9\x1f\xd0\x00\x00\x00\x00+\xbbe\xe0\x00\x00\x00\x00,\x89\x01\xd0\x00\x00\x00\x00-\x9bG\xe0\x00\x00\x00\x00._\xa9P\x00\x00\x00\x00/{)\xe0\x00\x00" +
-	"\x00\x000H\xc5\xd0\x00\x00\x00\x001H\x96\xe0\x00\x00\x00\x002<nP\x00\x00\x00\x0031\xb3`\x00\x00\x00\x004\x1a\xfe\xd0\x00\x00\x00\x005\x11\x95`\x00\x00\x00\x005\xf1\xa6P\x00\x00\x00\x007\x04" +
-	"\b\x80\x00\x00\x00\x007\xcf\x01p\x00\x00\x00\x008\xf6_\x80\x00\x00\x00\x009\xdc\xf9\xe0\x00\x00\x00\x00:\xd0\xedp\x00\x00\x00\x00;\xae[`\x00\x00\x00\x00<\xa3\xa0p\x00\x00\x00\x00=\xa0\xb2`\x00\x00" +
-	"\x00\x00>\x83\x82p\x00\x00\x00\x00?|\x9f\xe0\x00\x00\x00\x00@s6p\x00\x00\x00\x00AP\xa4`\x00\x00\x00\x00BL\x8f\x00\x00\x00\x00\x00CHOp\x00\x00\x00\x00D,q\x00\x00\x00\x00\x00E\x1e" +
-	"\xf6\xf0\x00\x00\x00\x00F\fS\x00\x00\x00\x00\x00F\xecc\xf0\x00\x00\x00\x00G\xec5\x00\x00\x00\x00\x00H\xe7\xf5p\x00\x00\x00\x00I\xcc\x17\x00\x00\x00\x00\x00J\xbe\x9c\xf0\x00\x00\x00\x00K\xab\xf9\x00\x00\x00" +
-	"\x00\x00L\x8c\t\xf0\x00\x00\x00\x00M\x95\x15\x80\x00\x00\x00\x00N\x87\x9bp\x00\x00\x00\x00Ot\xf7\x80\x00\x00\x00\x00P^B\xf0\x00\x00\x00\x00QTـ\x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03" +
-	"\x04\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02" +
-	"\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x00\x00!\x06\x00\x00\x00\x00 \xf8\x00\x04\x00\x00*0\x01\b\x00\x00\x1c \x00\f\x00\x008@\x01\x10LMT\x00" +
-	"JMT\x00IDT\x00IST\x00IDDT\x00\nIST-2IDT,M3.4.4/26,M10.5.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00j" +
-	"$\xcd\xf4\x9a\x00\x00\x00\x9a\x00\x00\x00\v\x00\x00\x00Asia/ThimbuTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00" +
-	"\x0e\xff\xff\xff\xff\xd5\xe6\x15t\x00\x00\x00\x00!aM\xa8\x01\x02\x00\x00T\f\x00\x00\x00\x00MX\x00\x04\x00\x00T`\x00\nLMT\x00+0530\x00+06\x00\n<+06>-6\n" +
-	"PK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00j$\xcd\xf4\x9a\x00\x00\x00\x9a\x00\x00\x00\f\x00\x00\x00Asia/ThimphuTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x0e\xff\xff\xff\xff\xd5\xe6\x15t\x00\x00\x00\x00!aM\xa8\x01\x02\x00\x00T\f\x00\x00\x00\x00MX\x00\x04\x00\x00T`\x00\nLMT\x00+05" +
-	"30\x00+06\x00\n<+06>-6\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\xf4\xaeg\xd5\x00\x00\x00\xd5\x00\x00\x00\n\x00\x00\x00Asia/TokyoTZif" +
-	"2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\t\x00\x00\x00\x03\x00\x00\x00\f\xff\xff\xff\xffe¤p\xff\xff\xff\xff\xd7>\x02p\xff\xff\xff\xff\xd7\xedY\xf0\xff\xff\xff\xff\xd8" +
-	"\xf8\xfap\xff\xff\xff\xff\xd9\xcd;\xf0\xff\xff\xff\xff\xdb\a\x00\xf0\xff\xff\xff\xffۭ\x1d\xf0\xff\xff\xff\xff\xdc\xe6\xe2\xf0\xff\xff\xff\xff\u074c\xff\xf0\x02\x01\x02\x01\x02\x01\x02\x01\x02\x00\x00\x83\x03\x00\x00\x00\x00" +
-	"\x8c\xa0\x01\x04\x00\x00~\x90\x00\bLMT\x00JDT\x00JST\x00\nJST-9\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00[u\x99q\xf1\x02\x00\x00\xf1\x02\x00\x00\n\x00\x00\x00A" +
-	"sia/TomskTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00" +
-	"TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00C\x00\x00\x00\x05\x00\x00\x00\x10\xff\xff\xff\xff\xa1\xe5N\xd9\xff\xff\xff\xff\xb5\xa3\xe1 " +
-	"\x00\x00\x00\x00\x15'o\x90\x00\x00\x00\x00\x16\x18\xa4\x00\x00\x00\x00\x00\x17\b\xa3\x10\x00\x00\x00\x00\x17\xf9׀\x00\x00\x00\x00\x18\xe9\u0590\x00\x00\x00\x00\x19\xdb\v\x00\x00\x00\x00\x00\x1a\xcc[\x90\x00\x00\x00\x00" +
-	"\x1b\xbch\xb0\x00\x00\x00\x00\x1c\xacY\xb0\x00\x00\x00\x00\x1d\x9cJ\xb0\x00\x00\x00\x00\x1e\x8c;\xb0\x00\x00\x00\x00\x1f|,\xb0\x00\x00\x00\x00 l\x1d\xb0\x00\x00\x00\x00!\\\x0e\xb0\x00\x00\x00\x00\"K\xff\xb0" +
-	"\x00\x00\x00\x00#;\xf0\xb0\x00\x00\x00\x00$+\xe1\xb0\x00\x00\x00\x00%\x1bҰ\x00\x00\x00\x00&\vð\x00\x00\x00\x00'\x04\xef0\x00\x00\x00\x00'\xf4\xe00\x00\x00\x00\x00(\xe4\xdf@\x00\x00\x00\x00" +
-	")x\x87@\x00\x00\x00\x00)\xd4\xc20\x00\x00\x00\x00*ij0\x00\x00\x00\x00+\xb4\xa40\x00\x00\x00\x00,\xa4\x950\x00\x00\x00\x00-\x94\x860\x00\x00\x00\x00.\x84w0\x00\x00\x00\x00/th0" +
-	"\x00\x00\x00\x000dY0\x00\x00\x00\x001]\x84\xb0\x00\x00\x00\x002r_\xb0\x00\x00\x00\x003=f\xb0\x00\x00\x00\x004RA\xb0\x00\x00\x00\x005\x1dH\xb0\x00\x00\x00\x0062#\xb0\x00\x00\x00\x00" +
-	"6\xfd*\xb0\x00\x00\x00\x008\x1b@0\x00\x00\x00\x008\xdd\f\xb0\x00\x00\x00\x009\xfb\"0\x00\x00\x00\x00:\xbc\xee\xb0\x00\x00\x00\x00;\xdb\x040\x00\x00\x00\x00<\xa6\v0\x00\x00\x00\x00<\xce\xe9\xb0" +
-	"\x00\x00\x00\x00=\xba\xf4@\x00\x00\x00\x00>\x85\xfb@\x00\x00\x00\x00?\x9a\xd6@\x00\x00\x00\x00@e\xdd@\x00\x00\x00\x00A\x83\xf2\xc0\x00\x00\x00\x00BE\xbf@\x00\x00\x00\x00Cc\xd4\xc0\x00\x00\x00\x00" +
-	"D%\xa1@\x00\x00\x00\x00EC\xb6\xc0\x00\x00\x00\x00F\x05\x83@\x00\x00\x00\x00G#\x98\xc0\x00\x00\x00\x00G\xee\x9f\xc0\x00\x00\x00\x00I\x03z\xc0\x00\x00\x00\x00I\u0381\xc0\x00\x00\x00\x00J\xe3\\\xc0" +
-	"\x00\x00\x00\x00K\xaec\xc0\x00\x00\x00\x00L\xccy@\x00\x00\x00\x00M\x8eE\xc0\x00\x00\x00\x00TK\xf30\x00\x00\x00\x00WI\xf8\xc0\x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03" +
-	"\x02\x03\x04\x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x03\x01\x03\x00\x00O\xa7\x00\x00\x00\x00T`\x00\x04\x00" +
-	"\x00p\x80\x01\b\x00\x00bp\x00\f\x00\x00bp\x01\fLMT\x00+06\x00+08\x00+07\x00\n<+07>-7\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00`\xc9\xd4\\" +
-	"\xbe\x00\x00\x00\xbe\x00\x00\x00\x12\x00\x00\x00Asia/Ujung_PandangTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00" +
-	"\x05\x00\x00\x00\x15\xff\xff\xff\xff\xa1\xf2]\x90\xff\xff\xff\xff\xba\x16Ր\xff\xff\xff\xffˈ\x1d\x80\xff\xff\xff\xff\xd2V\xeep\x01\x02\x03\x04\x00\x00o\xf0\x00\x00\x00\x00o\xf0\x00\x04\x00\x00p\x80\x00\b\x00" +
-	"\x00~\x90\x00\f\x00\x00p\x80\x00\x10LMT\x00MMT\x00+08\x00+09\x00WITA\x00\nWITA-8\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb2\xb9\xf4\xb6R\x02" +
-	"\x00\x00R\x02\x00\x00\x10\x00\x00\x00Asia/UlaanbaatarTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x002\x00\x00\x00\x04\x00\x00\x00" +
-	"\x10\xff\xff\xff\xff\x86\xd3\xeeL\x00\x00\x00\x00\x0f\vܐ\x00\x00\x00\x00\x18\xe9Ȁ\x00\x00\x00\x00\x19\xda\xfc\xf0\x00\x00\x00\x00\x1a\xccM\x80\x00\x00\x00\x00\x1b\xbc0p\x00\x00\x00\x00\x1c\xac/\x80\x00\x00\x00" +
-	"\x00\x1d\x9c\x12p\x00\x00\x00\x00\x1e\x8c\x11\x80\x00\x00\x00\x00\x1f{\xf4p\x00\x00\x00\x00 k\xf3\x80\x00\x00\x00\x00![\xd6p\x00\x00\x00\x00\"KՀ\x00\x00\x00\x00#;\xb8p\x00\x00\x00\x00$+\xb7" +
-	"\x80\x00\x00\x00\x00%\x1b\x9ap\x00\x00\x00\x00&\v\x99\x80\x00\x00\x00\x00'\x04\xb6\xf0\x00\x00\x00\x00'\xf4\xb6\x00\x00\x00\x00\x00(\xe4\x98\xf0\x00\x00\x00\x00)Ԙ\x00\x00\x00\x00\x00*\xc4z\xf0\x00\x00\x00" +
-	"\x00+\xb4z\x00\x00\x00\x00\x00,\xa4\\\xf0\x00\x00\x00\x00-\x94\\\x00\x00\x00\x00\x00.\x84>\xf0\x00\x00\x00\x00/t>\x00\x00\x00\x00\x000d \xf0\x00\x00\x00\x001]Z\x80\x00\x00\x00\x002M=" +
-	"p\x00\x00\x00\x003=<\x80\x00\x00\x00\x004-\x1fp\x00\x00\x00\x005\x1d\x1e\x80\x00\x00\x00\x006\r\x01p\x00\x00\x00\x00:鳠\x00\x00\x00\x00;\xb4\xac\x90\x00\x00\x00\x00<\xa4\xab\xa0\x00\x00\x00" +
-	"\x00=\x94\x8e\x90\x00\x00\x00\x00>\x84\x8d\xa0\x00\x00\x00\x00?tp\x90\x00\x00\x00\x00@do\xa0\x00\x00\x00\x00ATR\x90\x00\x00\x00\x00BDQ\xa0\x00\x00\x00\x00C44\x90\x00\x00\x00\x00D$3" +
-	"\xa0\x00\x00\x00\x00E\x1dQ\x10\x00\x00\x00\x00U\x15\x9a\xa0\x00\x00\x00\x00V\x05ap\x00\x00\x00\x00V\xf5|\xa0\x00\x00\x00\x00W\xe5Cp\x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02" +
-	"\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x00\x00d4\x00\x00\x00\x00bp\x00\x04\x00\x00~\x90\x01\b\x00\x00p\x80\x00\fLMT\x00+" +
-	"07\x00+09\x00+08\x00\n<+08>-8\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb2\xb9\xf4\xb6R\x02\x00\x00R\x02\x00\x00\x0f\x00\x00\x00Asia/Ulan_" +
-	"BatorTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif" +
-	"2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x002\x00\x00\x00\x04\x00\x00\x00\x10\xff\xff\xff\xff\x86\xd3\xeeL\x00\x00\x00\x00\x0f\vܐ\x00\x00\x00\x00" +
-	"\x18\xe9Ȁ\x00\x00\x00\x00\x19\xda\xfc\xf0\x00\x00\x00\x00\x1a\xccM\x80\x00\x00\x00\x00\x1b\xbc0p\x00\x00\x00\x00\x1c\xac/\x80\x00\x00\x00\x00\x1d\x9c\x12p\x00\x00\x00\x00\x1e\x8c\x11\x80\x00\x00\x00\x00\x1f{\xf4p" +
-	"\x00\x00\x00\x00 k\xf3\x80\x00\x00\x00\x00![\xd6p\x00\x00\x00\x00\"KՀ\x00\x00\x00\x00#;\xb8p\x00\x00\x00\x00$+\xb7\x80\x00\x00\x00\x00%\x1b\x9ap\x00\x00\x00\x00&\v\x99\x80\x00\x00\x00\x00" +
-	"'\x04\xb6\xf0\x00\x00\x00\x00'\xf4\xb6\x00\x00\x00\x00\x00(\xe4\x98\xf0\x00\x00\x00\x00)Ԙ\x00\x00\x00\x00\x00*\xc4z\xf0\x00\x00\x00\x00+\xb4z\x00\x00\x00\x00\x00,\xa4\\\xf0\x00\x00\x00\x00-\x94\\\x00" +
-	"\x00\x00\x00\x00.\x84>\xf0\x00\x00\x00\x00/t>\x00\x00\x00\x00\x000d \xf0\x00\x00\x00\x001]Z\x80\x00\x00\x00\x002M=p\x00\x00\x00\x003=<\x80\x00\x00\x00\x004-\x1fp\x00\x00\x00\x00" +
-	"5\x1d\x1e\x80\x00\x00\x00\x006\r\x01p\x00\x00\x00\x00:鳠\x00\x00\x00\x00;\xb4\xac\x90\x00\x00\x00\x00<\xa4\xab\xa0\x00\x00\x00\x00=\x94\x8e\x90\x00\x00\x00\x00>\x84\x8d\xa0\x00\x00\x00\x00?tp\x90" +
-	"\x00\x00\x00\x00@do\xa0\x00\x00\x00\x00ATR\x90\x00\x00\x00\x00BDQ\xa0\x00\x00\x00\x00C44\x90\x00\x00\x00\x00D$3\xa0\x00\x00\x00\x00E\x1dQ\x10\x00\x00\x00\x00U\x15\x9a\xa0\x00\x00\x00\x00" +
-	"V\x05ap\x00\x00\x00\x00V\xf5|\xa0\x00\x00\x00\x00W\xe5Cp\x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03" +
-	"\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x00\x00d4\x00\x00\x00\x00bp\x00\x04\x00\x00~\x90\x01\b\x00\x00p\x80\x00\fLMT\x00+07\x00+09\x00+08\x00\n<+08>-8\nP" +
-	"K\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00B\x1d\xc6\x1b\x85\x00\x00\x00\x85\x00\x00\x00\v\x00\x00\x00Asia/UrumqiTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\b\xff\xff\xff\xff\xb0\xfe\xbad\x01\x00\x00R\x1c\x00\x00\x00\x00T`\x00\x04LMT\x00+06\x00\n<+06>-6\nPK\x03\x04\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00w\x86\x8d^\x03\x03\x00\x00\x03\x03\x00\x00\r\x00\x00\x00Asia/Ust-NeraTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00B\x00\x00\x00\b\x00\x00\x00\x18\xff\xff\xff\xff\xa1\xdbݺ\xff\xff\xff\xff\xb5\xa3\xc5\x00\x00\x00\x00\x00\x15'Sp\x00\x00\x00\x00\x16\x18k\xc0\x00\x00\x00\x00\x17\bj\xd0\x00\x00\x00\x00\x17\xf9\x9f@\x00" +
-	"\x00\x00\x00\x18\xe9\x9eP\x00\x00\x00\x00\x19\xda\xd2\xc0\x00\x00\x00\x00\x1a\xcc#P\x00\x00\x00\x00\x1b\xbc0p\x00\x00\x00\x00\x1c\xac!p\x00\x00\x00\x00\x1d\x9c\x12p\x00\x00\x00\x00\x1e\x8c\x03p\x00\x00\x00\x00\x1f" +
-	"{\xf4p\x00\x00\x00\x00 k\xe5p\x00\x00\x00\x00![\xd6p\x00\x00\x00\x00\"K\xc7p\x00\x00\x00\x00#;\xb8p\x00\x00\x00\x00$+\xa9p\x00\x00\x00\x00%\x1b\x9ap\x00\x00\x00\x00&\v\x8bp\x00" +
-	"\x00\x00\x00'\x04\xb6\xf0\x00\x00\x00\x00'\xf4\xa7\xf0\x00\x00\x00\x00(\xe4\xa7\x00\x00\x00\x00\x00)xO\x00\x00\x00\x00\x00)ԉ\xf0\x00\x00\x00\x00*\xc4z\xf0\x00\x00\x00\x00+\xb4k\xf0\x00\x00\x00\x00," +
-	"\xa4\\\xf0\x00\x00\x00\x00-\x94M\xf0\x00\x00\x00\x00.\x84>\xf0\x00\x00\x00\x00/t/\xf0\x00\x00\x00\x000d \xf0\x00\x00\x00\x001]Lp\x00\x00\x00\x002r'p\x00\x00\x00\x003=.p\x00" +
-	"\x00\x00\x004R\tp\x00\x00\x00\x005\x1d\x10p\x00\x00\x00\x0061\xebp\x00\x00\x00\x006\xfc\xf2p\x00\x00\x00\x008\x1b\a\xf0\x00\x00\x00\x008\xdc\xd4p\x00\x00\x00\x009\xfa\xe9\xf0\x00\x00\x00\x00:" +
-	"\xbc\xb6p\x00\x00\x00\x00;\xda\xcb\xf0\x00\x00\x00\x00<\xa5\xd2\xf0\x00\x00\x00\x00=\xba\xad\xf0\x00\x00\x00\x00>\x85\xb4\xf0\x00\x00\x00\x00?\x9a\x8f\xf0\x00\x00\x00\x00@e\x96\xf0\x00\x00\x00\x00A\x83\xacp\x00" +
-	"\x00\x00\x00BEx\xf0\x00\x00\x00\x00Cc\x8ep\x00\x00\x00\x00D%Z\xf0\x00\x00\x00\x00ECpp\x00\x00\x00\x00F\x05<\xf0\x00\x00\x00\x00G#Rp\x00\x00\x00\x00G\xeeYp\x00\x00\x00\x00I" +
-	"\x034p\x00\x00\x00\x00I\xce;p\x00\x00\x00\x00J\xe3\x16p\x00\x00\x00\x00K\xae\x1dp\x00\x00\x00\x00L\xcc2\xf0\x00\x00\x00\x00M\x8d\xffp\x00\x00\x00\x00Nm\xf4@\x00\x00\x00\x00TK\xba\xf0\x01" +
-	"\x02\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x05\x06\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03" +
-	"\x04\x03\a\x03\x06\x00\x00\x86F\x00\x00\x00\x00p\x80\x00\x04\x00\x00~\x90\x00\b\x00\x00\x9a\xb0\x00\f\x00\x00\xa8\xc0\x01\x10\x00\x00\x9a\xb0\x01\f\x00\x00\x8c\xa0\x00\x14\x00\x00\xa8\xc0\x00\x10LMT\x00+08" +
-	"\x00+09\x00+11\x00+12\x00+10\x00\n<+10>-10\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\xf6C\x84\x98\x00\x00\x00\x98\x00\x00\x00\x0e\x00\x00\x00Asi" +
-	"a/VientianeTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00" +
-	"\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\f\xff\xff\xff\xffV\xb6\x85\xc4\xff\xff\xff\xff\xa2j" +
-	"g\xc4\x01\x02\x00\x00^<\x00\x00\x00\x00^<\x00\x04\x00\x00bp\x00\bLMT\x00BMT\x00+07\x00\n<+07>-7\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00d%\x05" +
-	"\xd8\xe6\x02\x00\x00\xe6\x02\x00\x00\x10\x00\x00\x00Asia/VladivostokTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00A\x00\x00\x00\x06" +
-	"\x00\x00\x00\x10\xff\xff\xff\xff\xa7YG]\xff\xff\xff\xff\xb5\xa3\xb6\xf0\x00\x00\x00\x00\x15'E`\x00\x00\x00\x00\x16\x18y\xd0\x00\x00\x00\x00\x17\bx\xe0\x00\x00\x00\x00\x17\xf9\xadP\x00\x00\x00\x00\x18\xe9\xac`" +
-	"\x00\x00\x00\x00\x19\xda\xe0\xd0\x00\x00\x00\x00\x1a\xcc1`\x00\x00\x00\x00\x1b\xbc>\x80\x00\x00\x00\x00\x1c\xac/\x80\x00\x00\x00\x00\x1d\x9c \x80\x00\x00\x00\x00\x1e\x8c\x11\x80\x00\x00\x00\x00\x1f|\x02\x80\x00\x00\x00\x00" +
-	" k\xf3\x80\x00\x00\x00\x00![\xe4\x80\x00\x00\x00\x00\"KՀ\x00\x00\x00\x00#;ƀ\x00\x00\x00\x00$+\xb7\x80\x00\x00\x00\x00%\x1b\xa8\x80\x00\x00\x00\x00&\v\x99\x80\x00\x00\x00\x00'\x04\xc5\x00" +
-	"\x00\x00\x00\x00'\xf4\xb6\x00\x00\x00\x00\x00(\xe4\xb5\x10\x00\x00\x00\x00)x]\x10\x00\x00\x00\x00)Ԙ\x00\x00\x00\x00\x00*ĉ\x00\x00\x00\x00\x00+\xb4z\x00\x00\x00\x00\x00,\xa4k\x00\x00\x00\x00\x00" +
-	"-\x94\\\x00\x00\x00\x00\x00.\x84M\x00\x00\x00\x00\x00/t>\x00\x00\x00\x00\x000d/\x00\x00\x00\x00\x001]Z\x80\x00\x00\x00\x002r5\x80\x00\x00\x00\x003=<\x80\x00\x00\x00\x004R\x17\x80" +
-	"\x00\x00\x00\x005\x1d\x1e\x80\x00\x00\x00\x0061\xf9\x80\x00\x00\x00\x006\xfd\x00\x80\x00\x00\x00\x008\x1b\x16\x00\x00\x00\x00\x008\xdc\xe2\x80\x00\x00\x00\x009\xfa\xf8\x00\x00\x00\x00\x00:\xbcĀ\x00\x00\x00\x00" +
-	";\xda\xda\x00\x00\x00\x00\x00<\xa5\xe1\x00\x00\x00\x00\x00=\xba\xbc\x00\x00\x00\x00\x00>\x85\xc3\x00\x00\x00\x00\x00?\x9a\x9e\x00\x00\x00\x00\x00@e\xa5\x00\x00\x00\x00\x00A\x83\xba\x80\x00\x00\x00\x00BE\x87\x00" +
-	"\x00\x00\x00\x00Cc\x9c\x80\x00\x00\x00\x00D%i\x00\x00\x00\x00\x00EC~\x80\x00\x00\x00\x00F\x05K\x00\x00\x00\x00\x00G#`\x80\x00\x00\x00\x00G\xeeg\x80\x00\x00\x00\x00I\x03B\x80\x00\x00\x00\x00" +
-	"I\xceI\x80\x00\x00\x00\x00J\xe3$\x80\x00\x00\x00\x00K\xae+\x80\x00\x00\x00\x00L\xccA\x00\x00\x00\x00\x00M\x8e\r\x80\x00\x00\x00\x00TK\xba\xf0\x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03" +
-	"\x02\x03\x02\x03\x02\x03\x04\x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x05\x03\x00\x00{\xa3\x00\x00\x00\x00~\x90\x00" +
-	"\x04\x00\x00\x9a\xb0\x01\b\x00\x00\x8c\xa0\x00\f\x00\x00\x8c\xa0\x01\f\x00\x00\x9a\xb0\x00\bLMT\x00+09\x00+11\x00+10\x00\n<+10>-10\nPK\x03\x04\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00O\xb0\x03\xe9\xe5\x02\x00\x00\xe5\x02\x00\x00\f\x00\x00\x00Asia/YakutskTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00A" +
-	"\x00\x00\x00\x06\x00\x00\x00\x10\xff\xff\xff\xff\xa1\xdb\xea^\xff\xff\xff\xff\xb5\xa3\xc5\x00\x00\x00\x00\x00\x15'Sp\x00\x00\x00\x00\x16\x18\x87\xe0\x00\x00\x00\x00\x17\b\x86\xf0\x00\x00\x00\x00\x17\xf9\xbb`\x00\x00\x00\x00" +
-	"\x18\xe9\xbap\x00\x00\x00\x00\x19\xda\xee\xe0\x00\x00\x00\x00\x1a\xcc?p\x00\x00\x00\x00\x1b\xbcL\x90\x00\x00\x00\x00\x1c\xac=\x90\x00\x00\x00\x00\x1d\x9c.\x90\x00\x00\x00\x00\x1e\x8c\x1f\x90\x00\x00\x00\x00\x1f|\x10\x90" +
-	"\x00\x00\x00\x00 l\x01\x90\x00\x00\x00\x00![\xf2\x90\x00\x00\x00\x00\"K\xe3\x90\x00\x00\x00\x00#;Ԑ\x00\x00\x00\x00$+Ő\x00\x00\x00\x00%\x1b\xb6\x90\x00\x00\x00\x00&\v\xa7\x90\x00\x00\x00\x00" +
-	"'\x04\xd3\x10\x00\x00\x00\x00'\xf4\xc4\x10\x00\x00\x00\x00(\xe4\xc3 \x00\x00\x00\x00)xk \x00\x00\x00\x00)Ԧ\x10\x00\x00\x00\x00*ė\x10\x00\x00\x00\x00+\xb4\x88\x10\x00\x00\x00\x00,\xa4y\x10" +
-	"\x00\x00\x00\x00-\x94j\x10\x00\x00\x00\x00.\x84[\x10\x00\x00\x00\x00/tL\x10\x00\x00\x00\x000d=\x10\x00\x00\x00\x001]h\x90\x00\x00\x00\x002rC\x90\x00\x00\x00\x003=J\x90\x00\x00\x00\x00" +
-	"4R%\x90\x00\x00\x00\x005\x1d,\x90\x00\x00\x00\x0062\a\x90\x00\x00\x00\x006\xfd\x0e\x90\x00\x00\x00\x008\x1b$\x10\x00\x00\x00\x008\xdc\xf0\x90\x00\x00\x00\x009\xfb\x06\x10\x00\x00\x00\x00:\xbcҐ" +
-	"\x00\x00\x00\x00;\xda\xe8\x10\x00\x00\x00\x00<\xa5\xef\x10\x00\x00\x00\x00=\xba\xca\x10\x00\x00\x00\x00>\x85\xd1\x10\x00\x00\x00\x00?\x9a\xac\x10\x00\x00\x00\x00@e\xb3\x10\x00\x00\x00\x00A\x83Ȑ\x00\x00\x00\x00" +
-	"BE\x95\x10\x00\x00\x00\x00Cc\xaa\x90\x00\x00\x00\x00D%w\x10\x00\x00\x00\x00EC\x8c\x90\x00\x00\x00\x00F\x05Y\x10\x00\x00\x00\x00G#n\x90\x00\x00\x00\x00G\xeeu\x90\x00\x00\x00\x00I\x03P\x90" +
-	"\x00\x00\x00\x00I\xceW\x90\x00\x00\x00\x00J\xe32\x90\x00\x00\x00\x00K\xae9\x90\x00\x00\x00\x00L\xccO\x10\x00\x00\x00\x00M\x8e\x1b\x90\x00\x00\x00\x00TK\xc9\x00\x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03" +
-	"\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x04\x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x05\x03\x00\x00y\xa2\x00\x00\x00" +
-	"\x00p\x80\x00\x04\x00\x00\x8c\xa0\x01\b\x00\x00~\x90\x00\f\x00\x00~\x90\x01\f\x00\x00\x8c\xa0\x00\bLMT\x00+08\x00+10\x00+09\x00\n<+09>-9\nPK\x03\x04\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00ʇ{_\xbb\x00\x00\x00\xbb\x00\x00\x00\v\x00\x00\x00Asia/YangonTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x04\x00\x00\x00\x04\x00\x00\x00\x12\xff\xff\xff\xffV\xb6\x89\xd1\xff\xff\xff\xff\xa1\xf2sQ\xff\xff\xff\xff\xcb\xf2\xfc\x18\xff\xff\xff\xffњg\xf0\x01\x02\x03\x02\x00\x00Z/\x00\x00\x00\x00Z/\x00\x04\x00\x00" +
-	"[h\x00\b\x00\x00~\x90\x00\x0eLMT\x00RMT\x00+0630\x00+09\x00\n<+0630>-6:30\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9a\xea\x18\xd4" +
-	"\xf8\x02\x00\x00\xf8\x02\x00\x00\x12\x00\x00\x00Asia/YekaterinburgTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00B\x00\x00\x00" +
-	"\a\x00\x00\x00\x14\xff\xff\xff\xff\x9b_\t'\xff\xff\xff\xff\xa1\x12\xb1\xff\xff\xff\xff\xff\xb5\xa3\xfd@\x00\x00\x00\x00\x15'\x8b\xb0\x00\x00\x00\x00\x16\x18\xc0 \x00\x00\x00\x00\x17\b\xbf0\x00\x00\x00\x00\x17\xf9\xf3" +
-	"\xa0\x00\x00\x00\x00\x18\xe9\xf2\xb0\x00\x00\x00\x00\x19\xdb' \x00\x00\x00\x00\x1a\xccw\xb0\x00\x00\x00\x00\x1b\xbc\x84\xd0\x00\x00\x00\x00\x1c\xacu\xd0\x00\x00\x00\x00\x1d\x9cf\xd0\x00\x00\x00\x00\x1e\x8cW\xd0\x00\x00\x00" +
-	"\x00\x1f|H\xd0\x00\x00\x00\x00 l9\xd0\x00\x00\x00\x00!\\*\xd0\x00\x00\x00\x00\"L\x1b\xd0\x00\x00\x00\x00#<\f\xd0\x00\x00\x00\x00$+\xfd\xd0\x00\x00\x00\x00%\x1b\xee\xd0\x00\x00\x00\x00&\v\xdf" +
-	"\xd0\x00\x00\x00\x00'\x05\vP\x00\x00\x00\x00'\xf4\xfcP\x00\x00\x00\x00(\xe4\xfb`\x00\x00\x00\x00)x\xa3`\x00\x00\x00\x00)\xd4\xdeP\x00\x00\x00\x00*\xc4\xcfP\x00\x00\x00\x00+\xb4\xc0P\x00\x00\x00" +
-	"\x00,\xa4\xb1P\x00\x00\x00\x00-\x94\xa2P\x00\x00\x00\x00.\x84\x93P\x00\x00\x00\x00/t\x84P\x00\x00\x00\x000duP\x00\x00\x00\x001]\xa0\xd0\x00\x00\x00\x002r{\xd0\x00\x00\x00\x003=\x82" +
-	"\xd0\x00\x00\x00\x004R]\xd0\x00\x00\x00\x005\x1dd\xd0\x00\x00\x00\x0062?\xd0\x00\x00\x00\x006\xfdF\xd0\x00\x00\x00\x008\x1b\\P\x00\x00\x00\x008\xdd(\xd0\x00\x00\x00\x009\xfb>P\x00\x00\x00" +
-	"\x00:\xbd\n\xd0\x00\x00\x00\x00;\xdb P\x00\x00\x00\x00<\xa6'P\x00\x00\x00\x00=\xbb\x02P\x00\x00\x00\x00>\x86\tP\x00\x00\x00\x00?\x9a\xe4P\x00\x00\x00\x00@e\xebP\x00\x00\x00\x00A\x84\x00" +
-	"\xd0\x00\x00\x00\x00BE\xcdP\x00\x00\x00\x00Cc\xe2\xd0\x00\x00\x00\x00D%\xafP\x00\x00\x00\x00EC\xc4\xd0\x00\x00\x00\x00F\x05\x91P\x00\x00\x00\x00G#\xa6\xd0\x00\x00\x00\x00G\xee\xad\xd0\x00\x00\x00" +
-	"\x00I\x03\x88\xd0\x00\x00\x00\x00IΏ\xd0\x00\x00\x00\x00J\xe3j\xd0\x00\x00\x00\x00K\xaeq\xd0\x00\x00\x00\x00L̇P\x00\x00\x00\x00M\x8eS\xd0\x00\x00\x00\x00TL\x01@\x01\x02\x04\x03\x04\x03\x04" +
-	"\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x05\x02\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x06\x04\x00" +
-	"\x008\xd9\x00\x00\x00\x004\xc1\x00\x04\x00\x008@\x00\b\x00\x00T`\x01\f\x00\x00FP\x00\x10\x00\x00FP\x01\x10\x00\x00T`\x00\fLMT\x00PMT\x00+04\x00+06\x00+05" +
-	"\x00\n<+05>-5\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x95-\xad\xc4\x02\x00\x00\xc4\x02\x00\x00\f\x00\x00\x00Asia/YerevanTZif2\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00>\x00\x00\x00\x05\x00\x00\x00\x10\xff\xff\xff\xff\xaa\x19\x9aH\xff\xff\xff\xff\xe7\xda\fP\x00\x00\x00\x00\x15'\x99\xc0\x00\x00\x00\x00\x16\x18\xce0\x00" +
-	"\x00\x00\x00\x17\b\xcd@\x00\x00\x00\x00\x17\xfa\x01\xb0\x00\x00\x00\x00\x18\xea\x00\xc0\x00\x00\x00\x00\x19\xdb50\x00\x00\x00\x00\x1a̅\xc0\x00\x00\x00\x00\x1b\xbc\x92\xe0\x00\x00\x00\x00\x1c\xac\x83\xe0\x00\x00\x00\x00\x1d" +
-	"\x9ct\xe0\x00\x00\x00\x00\x1e\x8ce\xe0\x00\x00\x00\x00\x1f|V\xe0\x00\x00\x00\x00 lG\xe0\x00\x00\x00\x00!\\8\xe0\x00\x00\x00\x00\"L)\xe0\x00\x00\x00\x00#<\x1a\xe0\x00\x00\x00\x00$,\v\xe0\x00" +
-	"\x00\x00\x00%\x1b\xfc\xe0\x00\x00\x00\x00&\v\xed\xe0\x00\x00\x00\x00'\x05\x19`\x00\x00\x00\x00'\xf5\n`\x00\x00\x00\x00(\xe5\tp\x00\x00\x00\x00)\xd4\xfap\x00\x00\x00\x00*\xc4\xebp\x00\x00\x00\x00+" +
-	"\xb4\xdcp\x00\x00\x00\x00,\xa4\xcdp\x00\x00\x00\x00-\x94\xbep\x00\x00\x00\x00.\x84\xafp\x00\x00\x00\x00/t\xa0p\x00\x00\x00\x000d\x91p\x00\x00\x00\x003=\x90\xe0\x00\x00\x00\x004Rk\xe0\x00" +
-	"\x00\x00\x005\x1dr\xe0\x00\x00\x00\x0062M\xe0\x00\x00\x00\x006\xfdT\xe0\x00\x00\x00\x008\x1bj`\x00\x00\x00\x008\xdd6\xe0\x00\x00\x00\x009\xfbL`\x00\x00\x00\x00:\xbd\x18\xe0\x00\x00\x00\x00;" +
-	"\xdb.`\x00\x00\x00\x00<\xa65`\x00\x00\x00\x00=\xbb\x10`\x00\x00\x00\x00>\x86\x17`\x00\x00\x00\x00?\x9a\xf2`\x00\x00\x00\x00@e\xf9`\x00\x00\x00\x00A\x84\x0e\xe0\x00\x00\x00\x00BE\xdb`\x00" +
-	"\x00\x00\x00Cc\xf0\xe0\x00\x00\x00\x00D%\xbd`\x00\x00\x00\x00EC\xd2\xe0\x00\x00\x00\x00F\x05\x9f`\x00\x00\x00\x00G#\xb4\xe0\x00\x00\x00\x00G\xee\xbb\xe0\x00\x00\x00\x00I\x03\x96\xe0\x00\x00\x00\x00I" +
-	"Ν\xe0\x00\x00\x00\x00J\xe3x\xe0\x00\x00\x00\x00K\xae\x7f\xe0\x00\x00\x00\x00L̕`\x00\x00\x00\x00M\x8ea\xe0\x00\x00\x00\x00N\xacw`\x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02" +
-	"\x03\x02\x03\x02\x03\x04\x01\x04\x01\x04\x01\x04\x01\x04\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x00\x00)\xb8\x00\x00\x00\x00*0\x00\x04\x00\x00F" +
-	"P\x01\b\x00\x008@\x00\f\x00\x008@\x01\fLMT\x00+03\x00+05\x00+04\x00\n<+04>-4\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe8\x8dY\x80\xad\x05" +
-	"\x00\x00\xad\x05\x00\x00\x0f\x00\x00\x00Atlantic/AzoresTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8c\x00\x00\x00\a\x00\x00\x00\x18" +
-	"\xff\xff\xff\xff^=\x1b\x90\xff\xff\xff\xff\x92檠\xff\xff\xff\xff\x9bK\x89\x90\xff\xff\xff\xff\x9b\xfe\xe3\xa0\xff\xff\xff\xff\x9c\x9d\t\x90\xff\xff\xff\xff\x9dɟ\x90\xff\xff\xff\xff\x9e\x7f\x8e\x90\xff\xff\xff\xff" +
-	"\x9f\xaa\xd3\x10\xff\xff\xff\xff\xa0_p\x90\xff\xff\xff\xff\xa1\x8c\x06\x90\xff\xff\xff\xff\xa2A\xf5\x90\xff\xff\xff\xff\xa3n\x8b\x90\xff\xff\xff\xff\xa4#)\x10\xff\xff\xff\xff\xa5O\xbf\x10\xff\xff\xff\xff\xaa\x06\v\x90" +
-	"\xff\xff\xff\xff\xaa\xf4\xab\x10\xff\xff\xff\xff\xad\xc9\xc4\x10\xff\xff\xff\xff\xae\xa7@\x10\xff\xff\xff\xff\xaf\xa0k\x90\xff\xff\xff\xff\xb0\x87\"\x10\xff\xff\xff\xff\xb1\x89\x88\x10\xff\xff\xff\xff\xb2p>\x90\xff\xff\xff\xff" +
-	"\xb3r\xa4\x90\xff\xff\xff\xff\xb4P \x90\xff\xff\xff\xff\xb72h\x90\xff\xff\xff\xff\xb8\x0f\xe4\x90\xff\xff\xff\xff\xb8\xffՐ\xff\xff\xff\xff\xb9\xefƐ\xff\xff\xff\xff\xbc\xc8\xd4\x10\xff\xff\xff\xff\xbd\xb8\xc5\x10" +
-	"\xff\xff\xff\xff\xbe\x9f{\x90\xff\xff\xff\xff\xbf\x98\xa7\x10\xff\xff\xff\xff\xc0\x9b\r\x10\xff\xff\xff\xff\xc1x\x89\x10\xff\xff\xff\xff\xc2hz\x10\xff\xff\xff\xff\xc3Xk\x10\xff\xff\xff\xff\xc4?!\x90\xff\xff\xff\xff" +
-	"\xc58M\x10\xff\xff\xff\xff\xc6:\xb3\x10\xff\xff\xff\xff\xc7XȐ\xff\xff\xff\xff\xc7\xd9\xfb\x90\xff\xff\xff\xff\xc9\x01K\x90\xff\xff\xff\xff\xc9\xf1<\x90\xff\xff\xff\xff\xca\xe2\x7f\x10\xff\xff\xff\xff˵o\x10" +
-	"\xff\xff\xff\xff\xcb\xec\xc0\x00\xff\xff\xff\xff̀h\x00\xff\xff\xff\xff\xccܿ\x10\xff\xff\xff\xff͕Q\x10\xff\xff\xff\xff\xcd\xc3g\x80\xff\xff\xff\xff\xcer\xbf\x00\xff\xff\xff\xff\xce\xc5ې\xff\xff\xff\xff" +
-	"\xcfu3\x10\xff\xff\xff\xffϬ\x84\x00\xff\xff\xff\xff\xd0R\xa1\x00\xff\xff\xff\xffХ\xbd\x90\xff\xff\xff\xff\xd1U\x15\x10\xff\xff\xff\xffьf\x00\xff\xff\xff\xff\xd22\x83\x00\xff\xff\xff\xff҅\x9f\x90" +
-	"\xff\xff\xff\xff\xd3Y\xe1\x10\xff\xff\xff\xff\xd4I\xd2\x10\xff\xff\xff\xff\xd59\xed@\xff\xff\xff\xff\xd6)\xde@\xff\xff\xff\xff\xd7\x19\xcf@\xff\xff\xff\xff\xd8\t\xc0@\xff\xff\xff\xff\xd8\xf9\xb1@\xff\xff\xff\xff" +
-	"\xd9\xe9\xa2@\xff\xff\xff\xff\xdaٓ@\xff\xff\xff\xff\xdbɄ@\xff\xff\xff\xffܹu@\xff\xff\xff\xffݲ\xa0\xc0\xff\xff\xff\xffޢ\x91\xc0\xff\xff\xff\xffߒ\x82\xc0\xff\xff\xff\xff\xe0\x82s\xc0" +
-	"\xff\xff\xff\xff\xe1rd\xc0\xff\xff\xff\xff\xe2bU\xc0\xff\xff\xff\xff\xe3RF\xc0\xff\xff\xff\xff\xe4B7\xc0\xff\xff\xff\xff\xe52(\xc0\xff\xff\xff\xff\xe6\"\x19\xc0\xff\xff\xff\xff\xe7\x1bE@\xff\xff\xff\xff" +
-	"\xe8\v6@\xff\xff\xff\xff\xe8\xfb'@\xff\xff\xff\xff\xe9\xeb\x18@\xff\xff\xff\xff\xea\xdb\t@\xff\xff\xff\xff\xeb\xca\xfa@\xff\xff\xff\xff\xec\xba\xeb@\xff\xff\xff\xff\xed\xaa\xdc@\xff\xff\xff\xff\xee\x9a\xcd@" +
-	"\xff\xff\xff\xff\uf2be@\xff\xff\xff\xff\xf0z\xaf@\xff\xff\xff\xff\xf1j\xa0@\xff\xff\xff\xff\xf2c\xcb\xc0\xff\xff\xff\xff\xf3S\xbc\xc0\xff\xff\xff\xff\xf4C\xad\xc0\xff\xff\xff\xff\xf53\x9e\xc0\xff\xff\xff\xff" +
-	"\xf6#\x8f\xc0\xff\xff\xff\xff\xf7\x13\x80\xc0\xff\xff\xff\xff\xf8\x03q\xc0\xff\xff\xff\xff\xf8\xf3b\xc0\x00\x00\x00\x00\r\x9b)\x10\x00\x00\x00\x00\x0e\x8b\x1a\x10\x00\x00\x00\x00\x0f\x84E\x90\x00\x00\x00\x00\x10t6\x90" +
-	"\x00\x00\x00\x00\x11d'\x90\x00\x00\x00\x00\x12T&\xa0\x00\x00\x00\x00\x13D\t\x90\x00\x00\x00\x00\x144\b\xa0\x00\x00\x00\x00\x15#\xf9\xa0\x00\x00\x00\x00\x16\x13\xea\xa0\x00\x00\x00\x00\x17\x03۠\x00\x00\x00\x00" +
-	"\x17\xf3̠\x00\x00\x00\x00\x18\xe3˰\x00\x00\x00\x00\x19Ӯ\xa0\x00\x00\x00\x00\x1aß\xa0\x00\x00\x00\x00\x1b\xbc\xcb \x00\x00\x00\x00\x1c\xac\xbc \x00\x00\x00\x00\x1d\x9c\xad \x00\x00\x00\x00\x1e\x8c\x9e " +
-	"\x00\x00\x00\x00\x1f|\x8f \x00\x00\x00\x00 l\x80 \x00\x00\x00\x00!\\q \x00\x00\x00\x00\"Lb \x00\x00\x00\x00#<S \x00\x00\x00\x00$,D \x00\x00\x00\x00%\x1c5 \x00\x00\x00\x00" +
-	"&\f& \x00\x00\x00\x00'\x05Q\xa0\x00\x00\x00\x00'\xf5B\xa0\x00\x00\x00\x00(\xe53\xa0\x00\x00\x00\x00)\xd5$\xa0\x00\x00\x00\x00*\xc5\x15\xa0\x00\x00\x00\x00+\xb4\xf8\x90\x00\x00\x00\x00,\xa4\xe9\x90" +
-	"\x00\x00\x00\x00-\x94ڐ\x00\x00\x00\x00.\x84ː\x00\x00\x00\x00/t\xbc\x90\x00\x00\x00\x000d\xad\x90\x00\x00\x00\x001]\xd9\x10\x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03" +
-	"\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x04\x02\x03\x02\x04\x02\x03\x02\x04\x02\x03\x02\x04\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03" +
-	"\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x06\x04\x05\x04\x05\x04\x05\x04" +
-	"\xff\xff\xe7\xf0\x00\x00\xff\xff\xe5(\x00\x04\xff\xff\xf1\xf0\x01\b\xff\xff\xe3\xe0\x00\f\x00\x00\x00\x00\x01\x10\xff\xff\xf1\xf0\x00\b\x00\x00\x00\x00\x00\x14LMT\x00HMT\x00-01\x00-02\x00+0" +
-	"0\x00WET\x00\n<-01>1<+00>,M3.5.0/0,M10.5.0/1\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00l&\x04\x99\x00\x04\x00\x00" +
-	"\x00\x04\x00\x00\x10\x00\x00\x00Atlantic/BermudaTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00_\x00\x00\x00\x05\x00\x00\x00\x14\xff" +
-	"\xff\xff\xffi\x87\x18F\xff\xff\xff\xff\x9c̮F\xff\xff\xff\xff\x9d\xb7K6\xff\xff\xff\xff\x9e\xb8m\xc6\xff\xff\xff\xff\x9f\x84\xb86\xff\xff\xff\xff\xb4\xc3\x1d\xe6\xff\xff\xff\xff\xcbb\xa6\xe0\xff\xff\xff\xff\xcc" +
-	"Ӽ\xd0\xff\xff\xff\xff͞\xd1\xe0\xff\xff\xff\xff\xce\xc6\x13\xd0\xff\xff\xff\xff\xcfuy`\xff\xff\xff\xffЯ0P\xff\xff\xff\xff\xd1U[`\xff\xff\xff\xffҏ\x12P\xff\xff\xff\xff\xd5qh`\xff" +
-	"\xff\xff\xff\xd6\x0e<\xd0\xff\xff\xff\xff\xd7Z\x84\xe0\xff\xff\xff\xff\xd7\xe4\xe4P\xff\xff\xff\xff\xd9:f\xe0\xff\xff\xff\xff\xd9\xc4\xc6P\xff\xff\xff\xff\xdb#\x83`\xff\xff\xff\xffۤ\xa8P\xff\xff\xff\xff\xdd" +
-	"\x03e`\xff\xff\xff\xff݄\x8aP\xff\xff\xff\xff\xde\xe3G`\xff\xff\xff\xff\xdfm\xa6\xd0\xff\xff\xff\xff\xe6l\t\xe0\xff\xff\xff\xff\xe77\x02\xd0\x00\x00\x00\x00\b \xb3`\x00\x00\x00\x00\t\x10\x96P\x00" +
-	"\x00\x00\x00\n\x00\x95`\x00\x00\x00\x00\n\xf0xP\x00\x00\x00\x00\v\xe0w`\x00\x00\x00\x00\fٔ\xd0\x00\x00\x00\x00\r\xc0Y`\x00\x00\x00\x00\x0e\xb9v\xd0\x00\x00\x00\x00\x0f\xa9u\xe0\x00\x00\x00\x00\x10" +
-	"\x99X\xd0\x00\x00\x00\x00\x11\x89W\xe0\x00\x00\x00\x00\x12y:\xd0\x00\x00\x00\x00\x13i9\xe0\x00\x00\x00\x00\x14Y\x1c\xd0\x00\x00\x00\x00\x15I\x1b\xe0\x00\x00\x00\x00\x168\xfe\xd0\x00\x00\x00\x00\x17(\xfd\xe0\x00" +
-	"\x00\x00\x00\x18\"\x1bP\x00\x00\x00\x00\x19\b\xdf\xe0\x00\x00\x00\x00\x1a\x01\xfdP\x00\x00\x00\x00\x1a\xf1\xfc`\x00\x00\x00\x00\x1b\xe1\xdfP\x00\x00\x00\x00\x1c\xd1\xde`\x00\x00\x00\x00\x1d\xc1\xc1P\x00\x00\x00\x00\x1e" +
-	"\xb1\xc0`\x00\x00\x00\x00\x1f\xa1\xa3P\x00\x00\x00\x00 u\xf2\xe0\x00\x00\x00\x00!\x81\x85P\x00\x00\x00\x00\"U\xd4\xe0\x00\x00\x00\x00#j\xa1\xd0\x00\x00\x00\x00$5\xb6\xe0\x00\x00\x00\x00%J\x83\xd0\x00" +
-	"\x00\x00\x00&\x15\x98\xe0\x00\x00\x00\x00'*e\xd0\x00\x00\x00\x00'\xfe\xb5`\x00\x00\x00\x00)\nG\xd0\x00\x00\x00\x00)ޗ`\x00\x00\x00\x00*\xea)\xd0\x00\x00\x00\x00+\xbey`\x00\x00\x00\x00," +
-	"\xd3FP\x00\x00\x00\x00-\x9e[`\x00\x00\x00\x00.\xb3(P\x00\x00\x00\x00/~=`\x00\x00\x00\x000\x93\nP\x00\x00\x00\x001gY\xe0\x00\x00\x00\x002r\xecP\x00\x00\x00\x003G;\xe0\x00" +
-	"\x00\x00\x004R\xceP\x00\x00\x00\x005'\x1d\xe0\x00\x00\x00\x0062\xb0P\x00\x00\x00\x007\x06\xff\xe0\x00\x00\x00\x008\x1b\xcc\xd0\x00\x00\x00\x008\xe6\xe1\xe0\x00\x00\x00\x009\xfb\xae\xd0\x00\x00\x00\x00:" +
-	"\xc6\xc3\xe0\x00\x00\x00\x00;ې\xd0\x00\x00\x00\x00<\xaf\xe0`\x00\x00\x00\x00=\xbbr\xd0\x00\x00\x00\x00>\x8f\xc2`\x00\x00\x00\x00?\x9bT\xd0\x00\x00\x00\x00@o\xa4`\x00\x00\x00\x00A\x84qP\x00" +
-	"\x00\x00\x00BO\x86`\x00\x00\x00\x00CdSP\x00\x00\x00\x00D/h`\x00\x00\x00\x00ED5P\x00\x00\x00\x00E\xf3\x9a\xe0\x02\x01\x02\x01\x02\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03" +
-	"\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03" +
-	"\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\xff\xff\xc3:\x00\x00\xff\xff\xd1J\x01\x04\xff\xff\xc3:\x00\b\xff\xff\xd5\xd0\x01\f\xff\xff\xc7\xc0\x00\x10LMT\x00BST\x00BMT\x00ADT\x00" +
-	"AST\x00\nAST4ADT,M3.2.0,M11.1.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaf|7\xb3\xde\x01\x00\x00\xde\x01\x00\x00\x0f\x00\x00\x00At" +
-	"lantic/CanaryTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00" +
-	"\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00#\x00\x00\x00\x04\x00\x00\x00\x11\xff\xff\xff\xff\xa6\x04\\\xf0\xff\xff\xff\xff" +
-	"\xd4A\xf7 \x00\x00\x00\x00\x13M6\x00\x00\x00\x00\x00\x143\xfa\x90\x00\x00\x00\x00\x15#\xeb\x90\x00\x00\x00\x00\x16\x13ܐ\x00\x00\x00\x00\x17\x03͐\x00\x00\x00\x00\x17\xf3\xbe\x90\x00\x00\x00\x00\x18㯐" +
-	"\x00\x00\x00\x00\x19Ӡ\x90\x00\x00\x00\x00\x1aÑ\x90\x00\x00\x00\x00\x1b\xbc\xbd\x10\x00\x00\x00\x00\x1c\xac\xae\x10\x00\x00\x00\x00\x1d\x9c\x9f\x10\x00\x00\x00\x00\x1e\x8c\x90\x10\x00\x00\x00\x00\x1f|\x81\x10\x00\x00\x00\x00" +
-	" lr\x10\x00\x00\x00\x00!\\c\x10\x00\x00\x00\x00\"LT\x10\x00\x00\x00\x00#<E\x10\x00\x00\x00\x00$,6\x10\x00\x00\x00\x00%\x1c'\x10\x00\x00\x00\x00&\f\x18\x10\x00\x00\x00\x00'\x05C\x90" +
-	"\x00\x00\x00\x00'\xf54\x90\x00\x00\x00\x00(\xe5%\x90\x00\x00\x00\x00)\xd5\x16\x90\x00\x00\x00\x00*\xc5\a\x90\x00\x00\x00\x00+\xb4\xf8\x90\x00\x00\x00\x00,\xa4\xe9\x90\x00\x00\x00\x00-\x94ڐ\x00\x00\x00\x00" +
-	".\x84ː\x00\x00\x00\x00/t\xbc\x90\x00\x00\x00\x000d\xad\x90\x00\x00\x00\x001]\xd9\x10\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02" +
-	"\x03\x02\x03\xff\xff\xf1\x90\x00\x00\xff\xff\xf1\xf0\x00\x04\x00\x00\x00\x00\x00\b\x00\x00\x0e\x10\x01\fLMT\x00-01\x00WET\x00WEST\x00\nWET0WEST,M3.5.0" +
-	"/1,M10.5.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\u0097N\xad\xaf\x00\x00\x00\xaf\x00\x00\x00\x13\x00\x00\x00Atlantic/Cape_Verde" +
-	"TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\f\xff\xff\xff\xff\x92檠\xff\xff\xff\xff̕\x9c \xff\xff\xff\xff\xd2t|\x10\x00" +
-	"\x00\x00\x00\v\x17\xf7@\x01\x02\x01\x03\xff\xff\xe9\xf4\x00\x00\xff\xff\xe3\xe0\x00\x04\xff\xff\xf1\xf0\x01\b\xff\xff\xf1\xf0\x00\bLMT\x00-02\x00-01\x00\n<-01>1\nPK\x03\x04\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb7\x0e\xbdm\xb9\x01\x00\x00\xb9\x01\x00\x00\x0f\x00\x00\x00Atlantic/FaeroeTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00 \x00\x00\x00\x03\x00\x00\x00\r\xff\xff\xff\xff\x8bm\xa4X\x00\x00\x00\x00\x15#\xeb\x90\x00\x00\x00\x00\x16\x13ܐ\x00\x00\x00\x00\x17\x03͐\x00\x00\x00\x00\x17\xf3\xbe\x90\x00\x00\x00\x00\x18" +
-	"㯐\x00\x00\x00\x00\x19Ӡ\x90\x00\x00\x00\x00\x1aÑ\x90\x00\x00\x00\x00\x1b\xbc\xbd\x10\x00\x00\x00\x00\x1c\xac\xae\x10\x00\x00\x00\x00\x1d\x9c\x9f\x10\x00\x00\x00\x00\x1e\x8c\x90\x10\x00\x00\x00\x00\x1f|\x81\x10\x00" +
-	"\x00\x00\x00 lr\x10\x00\x00\x00\x00!\\c\x10\x00\x00\x00\x00\"LT\x10\x00\x00\x00\x00#<E\x10\x00\x00\x00\x00$,6\x10\x00\x00\x00\x00%\x1c'\x10\x00\x00\x00\x00&\f\x18\x10\x00\x00\x00\x00'" +
-	"\x05C\x90\x00\x00\x00\x00'\xf54\x90\x00\x00\x00\x00(\xe5%\x90\x00\x00\x00\x00)\xd5\x16\x90\x00\x00\x00\x00*\xc5\a\x90\x00\x00\x00\x00+\xb4\xf8\x90\x00\x00\x00\x00,\xa4\xe9\x90\x00\x00\x00\x00-\x94ڐ\x00" +
-	"\x00\x00\x00.\x84ː\x00\x00\x00\x00/t\xbc\x90\x00\x00\x00\x000d\xad\x90\x00\x00\x00\x001]\xd9\x10\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\xff\xff\xf9\xa8\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x0e\x10\x01\bLMT\x00WET\x00WEST\x00\nWET0WEST,M3.5.0/1,M10.5.0" +
-	"\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb7\x0e\xbdm\xb9\x01\x00\x00\xb9\x01\x00\x00\x0e\x00\x00\x00Atlantic/FaroeTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\x00\x00\x03\x00\x00\x00\r\xff\xff\xff\xff\x8bm\xa4X\x00\x00\x00\x00\x15#\xeb\x90\x00\x00\x00\x00\x16\x13ܐ\x00\x00\x00\x00\x17\x03͐\x00\x00\x00\x00\x17\xf3\xbe\x90" +
-	"\x00\x00\x00\x00\x18㯐\x00\x00\x00\x00\x19Ӡ\x90\x00\x00\x00\x00\x1aÑ\x90\x00\x00\x00\x00\x1b\xbc\xbd\x10\x00\x00\x00\x00\x1c\xac\xae\x10\x00\x00\x00\x00\x1d\x9c\x9f\x10\x00\x00\x00\x00\x1e\x8c\x90\x10\x00\x00\x00\x00" +
-	"\x1f|\x81\x10\x00\x00\x00\x00 lr\x10\x00\x00\x00\x00!\\c\x10\x00\x00\x00\x00\"LT\x10\x00\x00\x00\x00#<E\x10\x00\x00\x00\x00$,6\x10\x00\x00\x00\x00%\x1c'\x10\x00\x00\x00\x00&\f\x18\x10" +
-	"\x00\x00\x00\x00'\x05C\x90\x00\x00\x00\x00'\xf54\x90\x00\x00\x00\x00(\xe5%\x90\x00\x00\x00\x00)\xd5\x16\x90\x00\x00\x00\x00*\xc5\a\x90\x00\x00\x00\x00+\xb4\xf8\x90\x00\x00\x00\x00,\xa4\xe9\x90\x00\x00\x00\x00" +
-	"-\x94ڐ\x00\x00\x00\x00.\x84ː\x00\x00\x00\x00/t\xbc\x90\x00\x00\x00\x000d\xad\x90\x00\x00\x00\x001]\xd9\x10\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\xff\xff\xf9\xa8\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x0e\x10\x01\bLMT\x00WET\x00WEST\x00\nWET0WEST,M3.5.0/1,M1" +
-	"0.5.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17S\x91\xb3\xc1\x02\x00\x00\xc1\x02\x00\x00\x12\x00\x00\x00Atlantic/Jan_MayenTZif2\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00<\x00\x00\x00\x04\x00\x00\x00\x12\xff\xff\xff\xffo\xa2a\xf8\xff\xff\xff\xff\x9b\f\x17`\xff\xff\xff\xff\x9b\xd5\xda\xf0\xff\xff\xff\xff\x9cٮ" +
-	"\x90\xff\xff\xff\xff\x9d\xa4\xb5\x90\xff\xff\xff\xff\x9e\xb9\x90\x90\xff\xff\xff\xff\x9f\x84\x97\x90\xff\xff\xff\xff\xc8\tq\x90\xff\xff\xff\xff\xcc\xe7K\x10\xff\xff\xff\xffͩ\x17\x90\xff\xff\xff\xff\u03a2C\x10\xff\xff\xff" +
-	"\xffϒ4\x10\xff\xff\xff\xffЂ%\x10\xff\xff\xff\xff\xd1r\x16\x10\xff\xff\xff\xffѶ\x96\x00\xff\xff\xff\xff\xd2X\xbe\x80\xff\xff\xff\xffҡO\x10\xff\xff\xff\xff\xd3c\x1b\x90\xff\xff\xff\xff\xd4K#" +
-	"\x90\xff\xff\xff\xff\xd59\xd1 \xff\xff\xff\xff\xd5g\xe7\x90\xff\xff\xff\xffըs\x00\xff\xff\xff\xff\xd6)\xb4\x10\xff\xff\xff\xff\xd7,\x1a\x10\xff\xff\xff\xff\xd8\t\x96\x10\xff\xff\xff\xff\xd9\x02\xc1\x90\xff\xff\xff" +
-	"\xff\xd9\xe9x\x10\x00\x00\x00\x00\x13MD\x10\x00\x00\x00\x00\x143\xfa\x90\x00\x00\x00\x00\x15#\xeb\x90\x00\x00\x00\x00\x16\x13ܐ\x00\x00\x00\x00\x17\x03͐\x00\x00\x00\x00\x17\xf3\xbe\x90\x00\x00\x00\x00\x18\xe3\xaf" +
-	"\x90\x00\x00\x00\x00\x19Ӡ\x90\x00\x00\x00\x00\x1aÑ\x90\x00\x00\x00\x00\x1b\xbc\xbd\x10\x00\x00\x00\x00\x1c\xac\xae\x10\x00\x00\x00\x00\x1d\x9c\x9f\x10\x00\x00\x00\x00\x1e\x8c\x90\x10\x00\x00\x00\x00\x1f|\x81\x10\x00\x00\x00" +
-	"\x00 lr\x10\x00\x00\x00\x00!\\c\x10\x00\x00\x00\x00\"LT\x10\x00\x00\x00\x00#<E\x10\x00\x00\x00\x00$,6\x10\x00\x00\x00\x00%\x1c'\x10\x00\x00\x00\x00&\f\x18\x10\x00\x00\x00\x00'\x05C" +
-	"\x90\x00\x00\x00\x00'\xf54\x90\x00\x00\x00\x00(\xe5%\x90\x00\x00\x00\x00)\xd5\x16\x90\x00\x00\x00\x00*\xc5\a\x90\x00\x00\x00\x00+\xb4\xf8\x90\x00\x00\x00\x00,\xa4\xe9\x90\x00\x00\x00\x00-\x94ڐ\x00\x00\x00" +
-	"\x00.\x84ː\x00\x00\x00\x00/t\xbc\x90\x00\x00\x00\x000d\xad\x90\x00\x00\x00\x001]\xd9\x10\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x03\x01\x02\x01\x02\x01\x03\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x00\x00\f\x88\x00\x00\x00\x00\x1c \x01\x04\x00\x00\x0e\x10\x00\t\x00\x00*0\x01\rLMT\x00CES" +
-	"T\x00CET\x00CEMT\x00\nCET-1CEST,M3.5.0,M10.5.0/3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x001)7\xad\xad\x05\x00" +
-	"\x00\xad\x05\x00\x00\x10\x00\x00\x00Atlantic/MadeiraTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8c\x00\x00\x00\a\x00\x00\x00\x1d" +
-	"\xff\xff\xff\xff^=\x13X\xff\xff\xff\xff\x92朐\xff\xff\xff\xff\x9bK{\x80\xff\xff\xff\xff\x9b\xfeՐ\xff\xff\xff\xff\x9c\x9c\xfb\x80\xff\xff\xff\xff\x9dɑ\x80\xff\xff\xff\xff\x9e\x7f\x80\x80\xff\xff\xff\xff" +
-	"\x9f\xaa\xc5\x00\xff\xff\xff\xff\xa0_b\x80\xff\xff\xff\xff\xa1\x8b\xf8\x80\xff\xff\xff\xff\xa2A\xe7\x80\xff\xff\xff\xff\xa3n}\x80\xff\xff\xff\xff\xa4#\x1b\x00\xff\xff\xff\xff\xa5O\xb1\x00\xff\xff\xff\xff\xaa\x05\xfd\x80" +
-	"\xff\xff\xff\xff\xaa\xf4\x9d\x00\xff\xff\xff\xff\xadɶ\x00\xff\xff\xff\xff\xae\xa72\x00\xff\xff\xff\xff\xaf\xa0]\x80\xff\xff\xff\xff\xb0\x87\x14\x00\xff\xff\xff\xff\xb1\x89z\x00\xff\xff\xff\xff\xb2p0\x80\xff\xff\xff\xff" +
-	"\xb3r\x96\x80\xff\xff\xff\xff\xb4P\x12\x80\xff\xff\xff\xff\xb72Z\x80\xff\xff\xff\xff\xb8\x0fր\xff\xff\xff\xff\xb8\xffǀ\xff\xff\xff\xff\xb9︀\xff\xff\xff\xff\xbc\xc8\xc6\x00\xff\xff\xff\xff\xbd\xb8\xb7\x00" +
-	"\xff\xff\xff\xff\xbe\x9fm\x80\xff\xff\xff\xff\xbf\x98\x99\x00\xff\xff\xff\xff\xc0\x9a\xff\x00\xff\xff\xff\xff\xc1x{\x00\xff\xff\xff\xff\xc2hl\x00\xff\xff\xff\xff\xc3X]\x00\xff\xff\xff\xff\xc4?\x13\x80\xff\xff\xff\xff" +
-	"\xc58?\x00\xff\xff\xff\xff\xc6:\xa5\x00\xff\xff\xff\xff\xc7X\xba\x80\xff\xff\xff\xff\xc7\xd9\xed\x80\xff\xff\xff\xff\xc9\x01=\x80\xff\xff\xff\xff\xc9\xf1.\x80\xff\xff\xff\xff\xca\xe2q\x00\xff\xff\xff\xff˵a\x00" +
-	"\xff\xff\xff\xff\xcb\xec\xb1\xf0\xff\xff\xff\xff̀Y\xf0\xff\xff\xff\xff\xccܱ\x00\xff\xff\xff\xff͕C\x00\xff\xff\xff\xff\xcd\xc3Yp\xff\xff\xff\xff\xcer\xb0\xf0\xff\xff\xff\xff\xce\xc5̀\xff\xff\xff\xff" +
-	"\xcfu%\x00\xff\xff\xff\xffϬu\xf0\xff\xff\xff\xff\xd0R\x92\xf0\xff\xff\xff\xffХ\xaf\x80\xff\xff\xff\xff\xd1U\a\x00\xff\xff\xff\xffьW\xf0\xff\xff\xff\xff\xd22t\xf0\xff\xff\xff\xff҅\x91\x80" +
-	"\xff\xff\xff\xff\xd3Y\xd3\x00\xff\xff\xff\xff\xd4I\xc4\x00\xff\xff\xff\xff\xd59\xdf0\xff\xff\xff\xff\xd6)\xd00\xff\xff\xff\xff\xd7\x19\xc10\xff\xff\xff\xff\xd8\t\xb20\xff\xff\xff\xff\xd8\xf9\xa30\xff\xff\xff\xff" +
-	"\xd9\xe9\x940\xff\xff\xff\xff\xdaم0\xff\xff\xff\xff\xdb\xc9v0\xff\xff\xff\xffܹg0\xff\xff\xff\xffݲ\x92\xb0\xff\xff\xff\xffޢ\x83\xb0\xff\xff\xff\xffߒt\xb0\xff\xff\xff\xff\xe0\x82e\xb0" +
-	"\xff\xff\xff\xff\xe1rV\xb0\xff\xff\xff\xff\xe2bG\xb0\xff\xff\xff\xff\xe3R8\xb0\xff\xff\xff\xff\xe4B)\xb0\xff\xff\xff\xff\xe52\x1a\xb0\xff\xff\xff\xff\xe6\"\v\xb0\xff\xff\xff\xff\xe7\x1b70\xff\xff\xff\xff" +
-	"\xe8\v(0\xff\xff\xff\xff\xe8\xfb\x190\xff\xff\xff\xff\xe9\xeb\n0\xff\xff\xff\xff\xea\xda\xfb0\xff\xff\xff\xff\xeb\xca\xec0\xff\xff\xff\xff\xec\xba\xdd0\xff\xff\xff\xff\xed\xaa\xce0\xff\xff\xff\xff\ue6bf0" +
-	"\xff\xff\xff\xff\uf2b00\xff\xff\xff\xff\xf0z\xa10\xff\xff\xff\xff\xf1j\x920\xff\xff\xff\xff\xf2c\xbd\xb0\xff\xff\xff\xff\xf3S\xae\xb0\xff\xff\xff\xff\xf4C\x9f\xb0\xff\xff\xff\xff\xf53\x90\xb0\xff\xff\xff\xff" +
-	"\xf6#\x81\xb0\xff\xff\xff\xff\xf7\x13r\xb0\xff\xff\xff\xff\xf8\x03c\xb0\xff\xff\xff\xff\xf8\xf3T\xb0\x00\x00\x00\x00\r\x9b\x1b\x00\x00\x00\x00\x00\x0e\x8b\f\x00\x00\x00\x00\x00\x0f\x847\x80\x00\x00\x00\x00\x10t(\x80" +
-	"\x00\x00\x00\x00\x11d\x19\x80\x00\x00\x00\x00\x12T\x18\x90\x00\x00\x00\x00\x13C\xfb\x80\x00\x00\x00\x00\x143\xfa\x90\x00\x00\x00\x00\x15#\xeb\x90\x00\x00\x00\x00\x16\x13ܐ\x00\x00\x00\x00\x17\x03͐\x00\x00\x00\x00" +
-	"\x17\xf3\xbe\x90\x00\x00\x00\x00\x18㽠\x00\x00\x00\x00\x19Ӡ\x90\x00\x00\x00\x00\x1aÑ\x90\x00\x00\x00\x00\x1b\xbc\xbd\x10\x00\x00\x00\x00\x1c\xac\xae\x10\x00\x00\x00\x00\x1d\x9c\x9f\x10\x00\x00\x00\x00\x1e\x8c\x90\x10" +
-	"\x00\x00\x00\x00\x1f|\x81\x10\x00\x00\x00\x00 lr\x10\x00\x00\x00\x00!\\c\x10\x00\x00\x00\x00\"LT\x10\x00\x00\x00\x00#<E\x10\x00\x00\x00\x00$,6\x10\x00\x00\x00\x00%\x1c'\x10\x00\x00\x00\x00" +
-	"&\f\x18\x10\x00\x00\x00\x00'\x05C\x90\x00\x00\x00\x00'\xf54\x90\x00\x00\x00\x00(\xe5%\x90\x00\x00\x00\x00)\xd5\x16\x90\x00\x00\x00\x00*\xc5\a\x90\x00\x00\x00\x00+\xb4\xf8\x90\x00\x00\x00\x00,\xa4\xe9\x90" +
-	"\x00\x00\x00\x00-\x94ڐ\x00\x00\x00\x00.\x84ː\x00\x00\x00\x00/t\xbc\x90\x00\x00\x00\x000d\xad\x90\x00\x00\x00\x001]\xd9\x10\x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03" +
-	"\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x04\x02\x03\x02\x04\x02\x03\x02\x04\x02\x03\x02\x04\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03" +
-	"\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05" +
-	"\xff\xff\xf0(\x00\x00\xff\xff\xf0(\x00\x04\x00\x00\x00\x00\x01\b\xff\xff\xf1\xf0\x00\f\x00\x00\x0e\x10\x01\x10\x00\x00\x0e\x10\x01\x14\x00\x00\x00\x00\x00\x19LMT\x00FMT\x00+00\x00-01\x00+0" +
-	"1\x00WEST\x00WET\x00\nWET0WEST,M3.5.0/1,M10.5.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\b{\x87\x82\x00\x00\x00" +
-	"\x82\x00\x00\x00\x12\x00\x00\x00Atlantic/ReykjavikTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00" +
-	"\b\xff\xff\xff\xff\x92\xe6\x92H\x01\xff\xff\xfc8\x00\x00\x00\x00\x00\x00\x00\x04LMT\x00GMT\x00\nGMT0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f-\xadׄ\x00\x00\x00\x84\x00" +
-	"\x00\x00\x16\x00\x00\x00Atlantic/South_GeorgiaTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00" +
-	"\x00\x00\b\xff\xff\xff\xffi\x86\xfd\xc0\x01\xff\xff\xdd\xc0\x00\x00\xff\xff\xe3\xe0\x00\x04LMT\x00-02\x00\n<-02>2\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\b{\x87\x82\x00" +
-	"\x00\x00\x82\x00\x00\x00\x12\x00\x00\x00Atlantic/St_HelenaTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00" +
-	"\x00\x00\b\xff\xff\xff\xff\x92\xe6\x92H\x01\xff\xff\xfc8\x00\x00\x00\x00\x00\x00\x00\x04LMT\x00GMT\x00\nGMT0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe7\xcf^\xb0\x15\x03\x00\x00" +
-	"\x15\x03\x00\x00\x10\x00\x00\x00Atlantic/StanleyTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00F\x00\x00\x00\x06\x00\x00\x00\x14\xff" +
-	"\xff\xff\xffi\x87\x11\xbc\xff\xff\xff\xff\x93D_<\xff\xff\xff\xff\xc3OZ\xc0\xff\xff\xff\xff\xc46\x030\xff\xff\xff\xff\xc5/<\xc0\xff\xff\xff\xff\xc6\x15\xe50\xff\xff\xff\xff\xc7\x18Y@\xff\xff\xff\xff\xc7" +
-	"\xff\x01\xb0\xff\xff\xff\xff\xc8\xf8;@\xff\xff\xff\xff\xc9\xde\xe3\xb0\xff\xff\xff\xff\xca\xd8\x1d@\xff\xff\xff\xff˾Ű\xff\xff\xff\xff̷\xff@\xff\xff\xff\xff\xcd6\x810\x00\x00\x00\x00\x19\x11\xfe@\x00" +
-	"\x00\x00\x00\x19Ӽ\xb0\x00\x00\x00\x00\x1a\xf1\xc4 \x00\x00\x00\x00\x1b\xaad0\x00\x00\x00\x00\x1cѦ \x00\x00\x00\x00\x1d\x8aF0\x00\x00\x00\x00\x1e\xa8[\xb0\x00\x00\x00\x00\x1fj6@\x00\x00\x00\x00 " +
-	"\x88=\xb0\x00\x00\x00\x00!J\x18@\x00\x00\x00\x00\"h\x1f\xb0\x00\x00\x00\x00#)\xfa@\x00\x00\x00\x00$H\x01\xb0\x00\x00\x00\x00%\t\xdc@\x00\x00\x00\x00&1\x1e0\x00\x00\x00\x00&\xe9\xbe@\x00" +
-	"\x00\x00\x00(\x11\x000\x00\x00\x00\x00(\xd2\xda\xc0\x00\x00\x00\x00)\xf0\xe20\x00\x00\x00\x00*\xb2\xbc\xc0\x00\x00\x00\x00+\xd0\xc40\x00\x00\x00\x00,\x92\x9e\xc0\x00\x00\x00\x00-\xb0\xa60\x00\x00\x00\x00." +
-	"r\x80\xc0\x00\x00\x00\x00/\x90\x880\x00\x00\x00\x000Rb\xc0\x00\x00\x00\x001y\xa4\xb0\x00\x00\x00\x002;\x7f@\x00\x00\x00\x003Y\x86\xb0\x00\x00\x00\x004\x1ba@\x00\x00\x00\x0059h\xb0\x00" +
-	"\x00\x00\x005\xfbC@\x00\x00\x00\x007\x19J\xb0\x00\x00\x00\x007\xdb%@\x00\x00\x00\x008\xf9,\xb0\x00\x00\x00\x009\xbb\a@\x00\x00\x00\x00:\xd9*\xd0\x00\x00\x00\x00;\x91\xca\xe0\x00\x00\x00\x00<" +
-	"\xc2GP\x00\x00\x00\x00=q\xac\xe0\x00\x00\x00\x00>\xa2)P\x00\x00\x00\x00?Z\xc9`\x00\x00\x00\x00@\x82\vP\x00\x00\x00\x00A:\xab`\x00\x00\x00\x00Ba\xedP\x00\x00\x00\x00C\x1a\x8d`\x00" +
-	"\x00\x00\x00DA\xcfP\x00\x00\x00\x00D\xfao`\x00\x00\x00\x00F!\xb1P\x00\x00\x00\x00F\xdaQ`\x00\x00\x00\x00H\n\xcd\xd0\x00\x00\x00\x00H\xc3m\xe0\x00\x00\x00\x00I\xea\xaf\xd0\x00\x00\x00\x00J" +
-	"\xa3O\xe0\x00\x00\x00\x00Kʑ\xd0\x00\x00\x00\x00L\x831\xe0\x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x05\x04\x05\x04\x05\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03" +
-	"\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x05\xff\xff\xc9\xc4\x00\x00\xff\xff\xc9\xc4\x00\x04\xff\xff\xd5\xd0\x01\b\xff\xff\xc7\xc0\x00\f\xff\xff\xe3\xe0\x01\x10\xff" +
-	"\xff\xd5\xd0\x00\bLMT\x00SMT\x00-03\x00-04\x00-02\x00\n<-03>3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00X\xb9\x9ap\x88\x03\x00\x00\x88\x03\x00\x00\r" +
-	"\x00\x00\x00Australia/ACTTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01" +
-	"\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00S\x00\x00\x00\x03\x00\x00\x00\x0e\xff\xff\xff\xffs\x16\x7f<\xff" +
-	"\xff\xff\xff\x9cN\u0080\xff\xff\xff\xff\x9c\xbc/\x00\xff\xff\xff\xff\xcbT\xb3\x00\xff\xff\xff\xff\xcb\xc7e\x80\xff\xff\xff\xff̷V\x80\xff\xff\xff\xffͧG\x80\xff\xff\xff\xffΠs\x00\xff\xff\xff\xff\xcf" +
-	"\x87)\x80\x00\x00\x00\x00\x03p9\x80\x00\x00\x00\x00\x04\r\x1c\x00\x00\x00\x00\x00\x05P\x1b\x80\x00\x00\x00\x00\x05\xf68\x80\x00\x00\x00\x00\a/\xfd\x80\x00\x00\x00\x00\a\xd6\x1a\x80\x00\x00\x00\x00\t\x0f߀\x00" +
-	"\x00\x00\x00\t\xb5\xfc\x80\x00\x00\x00\x00\n\xef\xc1\x80\x00\x00\x00\x00\v\x9f\x19\x00\x00\x00\x00\x00\f\xd8\xde\x00\x00\x00\x00\x00\r~\xfb\x00\x00\x00\x00\x00\x0e\xb8\xc0\x00\x00\x00\x00\x00\x0f^\xdd\x00\x00\x00\x00\x00\x10" +
-	"\x98\xa2\x00\x00\x00\x00\x00\x11>\xbf\x00\x00\x00\x00\x00\x12x\x84\x00\x00\x00\x00\x00\x13\x1e\xa1\x00\x00\x00\x00\x00\x14Xf\x00\x00\x00\x00\x00\x14\xfe\x83\x00\x00\x00\x00\x00\x168H\x00\x00\x00\x00\x00\x17\f\x89\x80\x00" +
-	"\x00\x00\x00\x18!d\x80\x00\x00\x00\x00\x18ǁ\x80\x00\x00\x00\x00\x1a\x01F\x80\x00\x00\x00\x00\x1a\xa7c\x80\x00\x00\x00\x00\x1b\xe1(\x80\x00\x00\x00\x00\x1c\x87E\x80\x00\x00\x00\x00\x1d\xc1\n\x80\x00\x00\x00\x00\x1e" +
-	"y\x9c\x80\x00\x00\x00\x00\x1f\x97\xb2\x00\x00\x00\x00\x00 Y~\x80\x00\x00\x00\x00!\x80\u0380\x00\x00\x00\x00\"B\x9b\x00\x00\x00\x00\x00#i\xeb\x00\x00\x00\x00\x00$\"}\x00\x00\x00\x00\x00%I\xcd\x00\x00" +
-	"\x00\x00\x00%\xef\xea\x00\x00\x00\x00\x00')\xaf\x00\x00\x00\x00\x00'\xcf\xcc\x00\x00\x00\x00\x00)\t\x91\x00\x00\x00\x00\x00)\xaf\xae\x00\x00\x00\x00\x00*\xe9s\x00\x00\x00\x00\x00+\x98ʀ\x00\x00\x00\x00," +
-	"ҏ\x80\x00\x00\x00\x00-x\xac\x80\x00\x00\x00\x00.\xb2q\x80\x00\x00\x00\x00/X\x8e\x80\x00\x00\x00\x000\x92S\x80\x00\x00\x00\x001]Z\x80\x00\x00\x00\x002r5\x80\x00\x00\x00\x003=<\x80\x00" +
-	"\x00\x00\x004R\x17\x80\x00\x00\x00\x005\x1d\x1e\x80\x00\x00\x00\x0061\xf9\x80\x00\x00\x00\x006\xfd\x00\x80\x00\x00\x00\x008\x1b\x16\x00\x00\x00\x00\x008\xdc\xe2\x80\x00\x00\x00\x009\xa7\xe9\x80\x00\x00\x00\x00:" +
-	"\xbcĀ\x00\x00\x00\x00;\xda\xda\x00\x00\x00\x00\x00<\xa5\xe1\x00\x00\x00\x00\x00=\xba\xbc\x00\x00\x00\x00\x00>\x85\xc3\x00\x00\x00\x00\x00?\x9a\x9e\x00\x00\x00\x00\x00@e\xa5\x00\x00\x00\x00\x00A\x83\xba\x80\x00" +
-	"\x00\x00\x00BE\x87\x00\x00\x00\x00\x00Cc\x9c\x80\x00\x00\x00\x00D.\xa3\x80\x00\x00\x00\x00EC~\x80\x00\x00\x00\x00F\x05K\x00\x00\x00\x00\x00G#`\x80\x00\x00\x00\x00G\xf7\xa2\x00\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x00\x00\x8d\xc4\x00\x00\x00\x00\x9a\xb0\x01\x04\x00\x00\x8c\xa0\x00\tLMT\x00AEDT\x00AEST\x00\nAEST-10AE" +
-	"DT,M10.1.0,M4.1.0/3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8ff~ՙ\x03\x00\x00\x99\x03\x00\x00\x12\x00\x00\x00Australia/" +
-	"AdelaideTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00T" +
-	"Zif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00T\x00\x00\x00\x04\x00\x00\x00\x0e\xff\xff\xff\xffs\x16\x8b\x14\xff\xff\xff\xff{\x12\x03p\xff" +
-	"\xff\xff\xff\x9cNɈ\xff\xff\xff\xff\x9c\xbc6\b\xff\xff\xff\xff\xcbT\xba\b\xff\xff\xff\xff\xcb\xc7l\x88\xff\xff\xff\xff̷]\x88\xff\xff\xff\xffͧN\x88\xff\xff\xff\xffΠz\b\xff\xff\xff\xff\xcf" +
-	"\x870\x88\x00\x00\x00\x00\x03p@\x88\x00\x00\x00\x00\x04\r#\b\x00\x00\x00\x00\x05P\"\x88\x00\x00\x00\x00\x05\xf6?\x88\x00\x00\x00\x00\a0\x04\x88\x00\x00\x00\x00\a\xd6!\x88\x00\x00\x00\x00\t\x0f\xe6\x88\x00" +
-	"\x00\x00\x00\t\xb6\x03\x88\x00\x00\x00\x00\n\xefȈ\x00\x00\x00\x00\v\x9f \b\x00\x00\x00\x00\f\xd8\xe5\b\x00\x00\x00\x00\r\x7f\x02\b\x00\x00\x00\x00\x0e\xb8\xc7\b\x00\x00\x00\x00\x0f^\xe4\b\x00\x00\x00\x00\x10" +
-	"\x98\xa9\b\x00\x00\x00\x00\x11>\xc6\b\x00\x00\x00\x00\x12x\x8b\b\x00\x00\x00\x00\x13\x1e\xa8\b\x00\x00\x00\x00\x14Xm\b\x00\x00\x00\x00\x14\xfe\x8a\b\x00\x00\x00\x00\x168O\b\x00\x00\x00\x00\x16禈\x00" +
-	"\x00\x00\x00\x18!k\x88\x00\x00\x00\x00\x18Lj\x88\x00\x00\x00\x00\x1a\x01M\x88\x00\x00\x00\x00\x1a\xa7j\x88\x00\x00\x00\x00\x1b\xe1/\x88\x00\x00\x00\x00\x1c\x87L\x88\x00\x00\x00\x00\x1d\xc1\x11\x88\x00\x00\x00\x00\x1e" +
-	"y\xa3\x88\x00\x00\x00\x00\x1f\x97\xb9\b\x00\x00\x00\x00 Y\x85\x88\x00\x00\x00\x00!\x80Ո\x00\x00\x00\x00\"B\xa2\b\x00\x00\x00\x00#i\xf2\b\x00\x00\x00\x00$\"\x84\b\x00\x00\x00\x00%I\xd4\b\x00" +
-	"\x00\x00\x00&\x02f\b\x00\x00\x00\x00')\xb6\b\x00\x00\x00\x00'\xcf\xd3\b\x00\x00\x00\x00)\t\x98\b\x00\x00\x00\x00)\xcbd\x88\x00\x00\x00\x00*\xe9z\b\x00\x00\x00\x00+\x98ш\x00\x00\x00\x00," +
-	"Җ\x88\x00\x00\x00\x00-\x8b(\x88\x00\x00\x00\x00.\xb2x\x88\x00\x00\x00\x00/tE\b\x00\x00\x00\x000\x92Z\x88\x00\x00\x00\x001]a\x88\x00\x00\x00\x002r<\x88\x00\x00\x00\x003=C\x88\x00" +
-	"\x00\x00\x004R\x1e\x88\x00\x00\x00\x005\x1d%\x88\x00\x00\x00\x0062\x00\x88\x00\x00\x00\x006\xfd\a\x88\x00\x00\x00\x008\x1b\x1d\b\x00\x00\x00\x008\xdc\xe9\x88\x00\x00\x00\x009\xfa\xff\b\x00\x00\x00\x00:" +
-	"\xbcˈ\x00\x00\x00\x00;\xda\xe1\b\x00\x00\x00\x00<\xa5\xe8\b\x00\x00\x00\x00=\xba\xc3\b\x00\x00\x00\x00>\x85\xca\b\x00\x00\x00\x00?\x9a\xa5\b\x00\x00\x00\x00@e\xac\b\x00\x00\x00\x00A\x83\xc1\x88\x00" +
-	"\x00\x00\x00BE\x8e\b\x00\x00\x00\x00Cc\xa3\x88\x00\x00\x00\x00D.\xaa\x88\x00\x00\x00\x00EC\x85\x88\x00\x00\x00\x00F\x05R\b\x00\x00\x00\x00G#g\x88\x00\x00\x00\x00G\xf7\xa9\b\x01\x03\x02\x03\x02" +
-	"\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02" +
-	"\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x00\x00\x81\xec\x00\x00\x00\x00~\x90\x00\x04\x00\x00\x93\xa8\x01\t\x00\x00\x85\x98\x00\x04LMT\x00ACST\x00ACDT\x00\nAC" +
-	"ST-9:30ACDT,M10.1.0,M4.1.0/3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x003\xba\xde\xd3!\x01\x00\x00!\x01\x00\x00\x12\x00\x00\x00A" +
-	"ustralia/BrisbaneTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" +
-	"\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x00\x00\x03\x00\x00\x00\x0e\xff\xff\xff\xffr\xed\x9f\b" +
-	"\xff\xff\xff\xff\x9cN\u0080\xff\xff\xff\xff\x9c\xbc/\x00\xff\xff\xff\xff\xcbT\xb3\x00\xff\xff\xff\xff\xcb\xc7e\x80\xff\xff\xff\xff̷V\x80\xff\xff\xff\xffͧG\x80\xff\xff\xff\xffΠs\x00\xff\xff\xff\xff" +
-	"χ)\x80\x00\x00\x00\x00\x03p9\x80\x00\x00\x00\x00\x04\r\x1c\x00\x00\x00\x00\x00%I\xcd\x00\x00\x00\x00\x00%\xef\xea\x00\x00\x00\x00\x00')\xaf\x00\x00\x00\x00\x00'\xcf\xcc\x00\x00\x00\x00\x00)\t\x91\x00" +
-	"\x00\x00\x00\x00)\xaf\xae\x00\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x00\x00\x8fx\x00\x00\x00\x00\x9a\xb0\x01\x04\x00\x00\x8c\xa0\x00\tLMT\x00AEDT\x00AEST\x00\nAE" +
-	"ST-10\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbd\xca#\x7f\xad\x03\x00\x00\xad\x03\x00\x00\x15\x00\x00\x00Australia/Broken_HillTZi" +
-	"f2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00U\x00\x00\x00\x05\x00\x00\x00\x13\xff\xff\xff\xffs\x16\x88d\xff\xff\xff\xffv\x04\xa5\xe0\xff\xff\xff\xff{\x12\x03p\xff\xff\xff\xff" +
-	"\x9cNɈ\xff\xff\xff\xff\x9c\xbc6\b\xff\xff\xff\xff\xcbT\xba\b\xff\xff\xff\xff\xcb\xc7l\x88\xff\xff\xff\xff̷]\x88\xff\xff\xff\xffͧN\x88\xff\xff\xff\xffΠz\b\xff\xff\xff\xffχ0\x88" +
-	"\x00\x00\x00\x00\x03p@\x88\x00\x00\x00\x00\x04\r#\b\x00\x00\x00\x00\x05P\"\x88\x00\x00\x00\x00\x05\xf6?\x88\x00\x00\x00\x00\a0\x04\x88\x00\x00\x00\x00\a\xd6!\x88\x00\x00\x00\x00\t\x0f\xe6\x88\x00\x00\x00\x00" +
-	"\t\xb6\x03\x88\x00\x00\x00\x00\n\xefȈ\x00\x00\x00\x00\v\x9f \b\x00\x00\x00\x00\f\xd8\xe5\b\x00\x00\x00\x00\r\x7f\x02\b\x00\x00\x00\x00\x0e\xb8\xc7\b\x00\x00\x00\x00\x0f^\xe4\b\x00\x00\x00\x00\x10\x98\xa9\b" +
-	"\x00\x00\x00\x00\x11>\xc6\b\x00\x00\x00\x00\x12x\x8b\b\x00\x00\x00\x00\x13\x1e\xa8\b\x00\x00\x00\x00\x14Xm\b\x00\x00\x00\x00\x14\xfe\x8a\b\x00\x00\x00\x00\x168O\b\x00\x00\x00\x00\x17\f\x90\x88\x00\x00\x00\x00" +
-	"\x18!k\x88\x00\x00\x00\x00\x18Lj\x88\x00\x00\x00\x00\x1a\x01M\x88\x00\x00\x00\x00\x1a\xa7j\x88\x00\x00\x00\x00\x1b\xe1/\x88\x00\x00\x00\x00\x1c\x87L\x88\x00\x00\x00\x00\x1d\xc1\x11\x88\x00\x00\x00\x00\x1ey\xa3\x88" +
-	"\x00\x00\x00\x00\x1f\x97\xb9\b\x00\x00\x00\x00 Y\x85\x88\x00\x00\x00\x00!\x80Ո\x00\x00\x00\x00\"B\xa2\b\x00\x00\x00\x00#i\xf2\b\x00\x00\x00\x00$\"\x84\b\x00\x00\x00\x00%I\xd4\b\x00\x00\x00\x00" +
-	"%\xef\xf1\b\x00\x00\x00\x00')\xb6\b\x00\x00\x00\x00'\xcf\xd3\b\x00\x00\x00\x00)\t\x98\b\x00\x00\x00\x00)\xaf\xb5\b\x00\x00\x00\x00*\xe9z\b\x00\x00\x00\x00+\x98ш\x00\x00\x00\x00,Җ\x88" +
-	"\x00\x00\x00\x00-x\xb3\x88\x00\x00\x00\x00.\xb2x\x88\x00\x00\x00\x00/X\x95\x88\x00\x00\x00\x000\x92Z\x88\x00\x00\x00\x001]a\x88\x00\x00\x00\x002r<\x88\x00\x00\x00\x003=C\x88\x00\x00\x00\x00" +
-	"4R\x1e\x88\x00\x00\x00\x005\x1d%\x88\x00\x00\x00\x0062\x00\x88\x00\x00\x00\x006\xfd\a\x88\x00\x00\x00\x008\x1b\x1d\b\x00\x00\x00\x008\xdc\xe9\x88\x00\x00\x00\x009\xfa\xff\b\x00\x00\x00\x00:\xbcˈ" +
-	"\x00\x00\x00\x00;\xda\xe1\b\x00\x00\x00\x00<\xa5\xe8\b\x00\x00\x00\x00=\xba\xc3\b\x00\x00\x00\x00>\x85\xca\b\x00\x00\x00\x00?\x9a\xa5\b\x00\x00\x00\x00@e\xac\b\x00\x00\x00\x00A\x83\xc1\x88\x00\x00\x00\x00" +
-	"BE\x8e\b\x00\x00\x00\x00Cc\xa3\x88\x00\x00\x00\x00D.\xaa\x88\x00\x00\x00\x00EC\x85\x88\x00\x00\x00\x00F\x05R\b\x00\x00\x00\x00G#g\x88\x00\x00\x00\x00G\xf7\xa9\b\x01\x02\x04\x03\x04\x03\x04\x03" +
-	"\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03" +
-	"\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x00\x00\x84\x9c\x00\x00\x00\x00\x8c\xa0\x00\x04\x00\x00~\x90\x00\t\x00\x00\x93\xa8\x01\x0e\x00\x00\x85\x98\x00\tLMT\x00AEST\x00ACST" +
-	"\x00ACDT\x00\nACST-9:30ACDT,M10.1.0,M4.1.0/3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00X\xb9\x9ap\x88\x03\x00\x00" +
-	"\x88\x03\x00\x00\x12\x00\x00\x00Australia/CanberraTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00S\x00\x00\x00\x03\x00\x00\x00" +
-	"\x0e\xff\xff\xff\xffs\x16\x7f<\xff\xff\xff\xff\x9cN\u0080\xff\xff\xff\xff\x9c\xbc/\x00\xff\xff\xff\xff\xcbT\xb3\x00\xff\xff\xff\xff\xcb\xc7e\x80\xff\xff\xff\xff̷V\x80\xff\xff\xff\xffͧG\x80\xff\xff\xff" +
-	"\xffΠs\x00\xff\xff\xff\xffχ)\x80\x00\x00\x00\x00\x03p9\x80\x00\x00\x00\x00\x04\r\x1c\x00\x00\x00\x00\x00\x05P\x1b\x80\x00\x00\x00\x00\x05\xf68\x80\x00\x00\x00\x00\a/\xfd\x80\x00\x00\x00\x00\a\xd6\x1a" +
-	"\x80\x00\x00\x00\x00\t\x0f߀\x00\x00\x00\x00\t\xb5\xfc\x80\x00\x00\x00\x00\n\xef\xc1\x80\x00\x00\x00\x00\v\x9f\x19\x00\x00\x00\x00\x00\f\xd8\xde\x00\x00\x00\x00\x00\r~\xfb\x00\x00\x00\x00\x00\x0e\xb8\xc0\x00\x00\x00\x00" +
-	"\x00\x0f^\xdd\x00\x00\x00\x00\x00\x10\x98\xa2\x00\x00\x00\x00\x00\x11>\xbf\x00\x00\x00\x00\x00\x12x\x84\x00\x00\x00\x00\x00\x13\x1e\xa1\x00\x00\x00\x00\x00\x14Xf\x00\x00\x00\x00\x00\x14\xfe\x83\x00\x00\x00\x00\x00\x168H" +
-	"\x00\x00\x00\x00\x00\x17\f\x89\x80\x00\x00\x00\x00\x18!d\x80\x00\x00\x00\x00\x18ǁ\x80\x00\x00\x00\x00\x1a\x01F\x80\x00\x00\x00\x00\x1a\xa7c\x80\x00\x00\x00\x00\x1b\xe1(\x80\x00\x00\x00\x00\x1c\x87E\x80\x00\x00\x00" +
-	"\x00\x1d\xc1\n\x80\x00\x00\x00\x00\x1ey\x9c\x80\x00\x00\x00\x00\x1f\x97\xb2\x00\x00\x00\x00\x00 Y~\x80\x00\x00\x00\x00!\x80\u0380\x00\x00\x00\x00\"B\x9b\x00\x00\x00\x00\x00#i\xeb\x00\x00\x00\x00\x00$\"}" +
-	"\x00\x00\x00\x00\x00%I\xcd\x00\x00\x00\x00\x00%\xef\xea\x00\x00\x00\x00\x00')\xaf\x00\x00\x00\x00\x00'\xcf\xcc\x00\x00\x00\x00\x00)\t\x91\x00\x00\x00\x00\x00)\xaf\xae\x00\x00\x00\x00\x00*\xe9s\x00\x00\x00\x00" +
-	"\x00+\x98ʀ\x00\x00\x00\x00,ҏ\x80\x00\x00\x00\x00-x\xac\x80\x00\x00\x00\x00.\xb2q\x80\x00\x00\x00\x00/X\x8e\x80\x00\x00\x00\x000\x92S\x80\x00\x00\x00\x001]Z\x80\x00\x00\x00\x002r5" +
-	"\x80\x00\x00\x00\x003=<\x80\x00\x00\x00\x004R\x17\x80\x00\x00\x00\x005\x1d\x1e\x80\x00\x00\x00\x0061\xf9\x80\x00\x00\x00\x006\xfd\x00\x80\x00\x00\x00\x008\x1b\x16\x00\x00\x00\x00\x008\xdc\xe2\x80\x00\x00\x00" +
-	"\x009\xa7\xe9\x80\x00\x00\x00\x00:\xbcĀ\x00\x00\x00\x00;\xda\xda\x00\x00\x00\x00\x00<\xa5\xe1\x00\x00\x00\x00\x00=\xba\xbc\x00\x00\x00\x00\x00>\x85\xc3\x00\x00\x00\x00\x00?\x9a\x9e\x00\x00\x00\x00\x00@e\xa5" +
-	"\x00\x00\x00\x00\x00A\x83\xba\x80\x00\x00\x00\x00BE\x87\x00\x00\x00\x00\x00Cc\x9c\x80\x00\x00\x00\x00D.\xa3\x80\x00\x00\x00\x00EC~\x80\x00\x00\x00\x00F\x05K\x00\x00\x00\x00\x00G#`\x80\x00\x00\x00" +
-	"\x00G\xf7\xa2\x00\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x00\x00\x8d\xc4\x00\x00\x00\x00\x9a\xb0\x01\x04\x00\x00\x8c\xa0\x00\tLMT\x00AEDT\x00AEST\x00" +
-	"\nAEST-10AEDT,M10.1.0,M4.1.0/3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00E\xf2\xe6Z\xeb\x03\x00\x00\xeb\x03\x00\x00\x10\x00\x00\x00" +
-	"Australia/CurrieTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01" +
-	"\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00^\x00\x00\x00\x03\x00\x00\x00\x0e\xff\xff\xff\xfft.\x00\xe4\xff" +
-	"\xff\xff\xff\x9b\xd5x\x80\xff\xff\xff\xff\x9c\xbc/\x00\xff\xff\xff\xff\x9d\xdaD\x80\xff\xff\xff\xff\x9e\x80a\x80\xff\xff\xff\xff\x9f\xba&\x80\xff\xff\xff\xff\xa0`C\x80\xff\xff\xff\xff\xcbT\xb3\x00\xff\xff\xff\xff\xcb" +
-	"\xc7e\x80\xff\xff\xff\xff̷V\x80\xff\xff\xff\xffͧG\x80\xff\xff\xff\xffΠs\x00\xff\xff\xff\xffχ)\x80\xff\xff\xff\xff\xfb\u008d\x00\xff\xff\xff\xff\xfc\xb2~\x00\xff\xff\xff\xff\xfd\xc7Y\x00\xff" +
-	"\xff\xff\xff\xfev\xb0\x80\xff\xff\xff\xff\xff\xa7;\x00\x00\x00\x00\x00\x00V\x92\x80\x00\x00\x00\x00\x01\x87\x1d\x00\x00\x00\x00\x00\x02?\xaf\x00\x00\x00\x00\x00\x03p9\x80\x00\x00\x00\x00\x04\r\x1c\x00\x00\x00\x00\x00\x05" +
-	"P\x1b\x80\x00\x00\x00\x00\x05\xf68\x80\x00\x00\x00\x00\a/\xfd\x80\x00\x00\x00\x00\a\xd6\x1a\x80\x00\x00\x00\x00\t\x0f߀\x00\x00\x00\x00\t\xb5\xfc\x80\x00\x00\x00\x00\n\xef\xc1\x80\x00\x00\x00\x00\v\x9f\x19\x00\x00" +
-	"\x00\x00\x00\f\xd8\xde\x00\x00\x00\x00\x00\r~\xfb\x00\x00\x00\x00\x00\x0e\xb8\xc0\x00\x00\x00\x00\x00\x0f^\xdd\x00\x00\x00\x00\x00\x10\x98\xa2\x00\x00\x00\x00\x00\x11>\xbf\x00\x00\x00\x00\x00\x12x\x84\x00\x00\x00\x00\x00\x13" +
-	"\x1e\xa1\x00\x00\x00\x00\x00\x14Xf\x00\x00\x00\x00\x00\x14\xfe\x83\x00\x00\x00\x00\x00\x168H\x00\x00\x00\x00\x00\x17\x03O\x00\x00\x00\x00\x00\x18!d\x80\x00\x00\x00\x00\x18\xe31\x00\x00\x00\x00\x00\x1a\x01F\x80\x00" +
-	"\x00\x00\x00\x1a\xa7c\x80\x00\x00\x00\x00\x1b\xe1(\x80\x00\x00\x00\x00\x1c\x87E\x80\x00\x00\x00\x00\x1d\xc1\n\x80\x00\x00\x00\x00\x1eg'\x80\x00\x00\x00\x00\x1f\x97\xb2\x00\x00\x00\x00\x00 Y~\x80\x00\x00\x00\x00!" +
-	"\x80\u0380\x00\x00\x00\x00\"B\x9b\x00\x00\x00\x00\x00#i\xeb\x00\x00\x00\x00\x00$\"}\x00\x00\x00\x00\x00%I\xcd\x00\x00\x00\x00\x00&\x02_\x00\x00\x00\x00\x00')\xaf\x00\x00\x00\x00\x00'\xf4\xb6\x00\x00" +
-	"\x00\x00\x00(\xed\xe1\x80\x00\x00\x00\x00)Ԙ\x00\x00\x00\x00\x00*\xcdÀ\x00\x00\x00\x00+\xb4z\x00\x00\x00\x00\x00,\xad\xa5\x80\x00\x00\x00\x00-\x94\\\x00\x00\x00\x00\x00.\x8d\x87\x80\x00\x00\x00\x00/" +
-	"t>\x00\x00\x00\x00\x000mi\x80\x00\x00\x00\x001]Z\x80\x00\x00\x00\x002V\x86\x00\x00\x00\x00\x003=<\x80\x00\x00\x00\x0046h\x00\x00\x00\x00\x005\x1d\x1e\x80\x00\x00\x00\x006\x16J\x00\x00" +
-	"\x00\x00\x006\xfd\x00\x80\x00\x00\x00\x007\xf6,\x00\x00\x00\x00\x008\xdc\xe2\x80\x00\x00\x00\x009\xa7\xe9\x80\x00\x00\x00\x00:\xbcĀ\x00\x00\x00\x00;\xbf*\x80\x00\x00\x00\x00<\xa5\xe1\x00\x00\x00\x00\x00=" +
-	"\x9f\f\x80\x00\x00\x00\x00>\x85\xc3\x00\x00\x00\x00\x00?~\xee\x80\x00\x00\x00\x00@e\xa5\x00\x00\x00\x00\x00A^Ѐ\x00\x00\x00\x00BE\x87\x00\x00\x00\x00\x00C>\xb2\x80\x00\x00\x00\x00D.\xa3\x80\x00" +
-	"\x00\x00\x00E\x1e\x94\x80\x00\x00\x00\x00F\x05K\x00\x00\x00\x00\x00G\a\xb1\x00\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x00\x00\x8a" +
-	"\x1c\x00\x00\x00\x00\x9a\xb0\x01\x04\x00\x00\x8c\xa0\x00\tLMT\x00AEDT\x00AEST\x00\nAEST-10AEDT,M10.1.0,M4.1.0/3\nP" +
-	"K\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc8R\x1a\x1b\xea\x00\x00\x00\xea\x00\x00\x00\x10\x00\x00\x00Australia/DarwinTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00\x00\x00\x04\x00\x00\x00\x0e\xff\xff\xff\xffs\x16\x92X\xff\xff\xff\xff{\x12\x03p\xff\xff\xff\xff\x9cNɈ\xff\xff\xff\xff\x9c\xbc6\b\xff\xff\xff\xff\xcbT\xba\b" +
-	"\xff\xff\xff\xff\xcb\xc7l\x88\xff\xff\xff\xff̷]\x88\xff\xff\xff\xffͧN\x88\xff\xff\xff\xffΠz\b\xff\xff\xff\xffχ0\x88\x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\x00\x00z\xa8\x00\x00\x00\x00~\x90" +
-	"\x00\x04\x00\x00\x93\xa8\x01\t\x00\x00\x85\x98\x00\x04LMT\x00ACST\x00ACDT\x00\nACST-9:30\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2ܺ\xca:\x01\x00" +
-	"\x00:\x01\x00\x00\x0f\x00\x00\x00Australia/EuclaTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x13\x00\x00\x00\x03\x00\x00\x00\x10\xff" +
-	"\xff\xff\xfft\xa6\n\xb0\xff\xff\xff\xff\x9cN\xd4\x14\xff\xff\xff\xff\x9c\xbc@\x94\xff\xff\xff\xff\xcbTĔ\xff\xff\xff\xff\xcb\xc7w\x14\xff\xff\xff\xff̷h\x14\xff\xff\xff\xffͧY\x14\x00\x00\x00\x00\t" +
-	"\x0f\xf1\x14\x00\x00\x00\x00\t\xb6\x0e\x14\x00\x00\x00\x00\x1a\x01X\x14\x00\x00\x00\x00\x1a\xa7u\x14\x00\x00\x00\x00)%R\x14\x00\x00\x00\x00)\xaf\xbf\x94\x00\x00\x00\x00Eq\xb4\x94\x00\x00\x00\x00F\x05\\\x94\x00" +
-	"\x00\x00\x00G#r\x14\x00\x00\x00\x00G\xeey\x14\x00\x00\x00\x00I\x03T\x14\x00\x00\x00\x00I\xce[\x14\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x00\x00x\xd0\x00\x00\x00\x00\x89\x1c" +
-	"\x01\x04\x00\x00{\f\x00\nLMT\x00+0945\x00+0845\x00\n<+0845>-8:45\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00E\xf2\xe6Z\xeb\x03\x00\x00" +
-	"\xeb\x03\x00\x00\x10\x00\x00\x00Australia/HobartTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00^\x00\x00\x00\x03\x00\x00\x00\x0e\xff" +
-	"\xff\xff\xfft.\x00\xe4\xff\xff\xff\xff\x9b\xd5x\x80\xff\xff\xff\xff\x9c\xbc/\x00\xff\xff\xff\xff\x9d\xdaD\x80\xff\xff\xff\xff\x9e\x80a\x80\xff\xff\xff\xff\x9f\xba&\x80\xff\xff\xff\xff\xa0`C\x80\xff\xff\xff\xff\xcb" +
-	"T\xb3\x00\xff\xff\xff\xff\xcb\xc7e\x80\xff\xff\xff\xff̷V\x80\xff\xff\xff\xffͧG\x80\xff\xff\xff\xffΠs\x00\xff\xff\xff\xffχ)\x80\xff\xff\xff\xff\xfb\u008d\x00\xff\xff\xff\xff\xfc\xb2~\x00\xff" +
-	"\xff\xff\xff\xfd\xc7Y\x00\xff\xff\xff\xff\xfev\xb0\x80\xff\xff\xff\xff\xff\xa7;\x00\x00\x00\x00\x00\x00V\x92\x80\x00\x00\x00\x00\x01\x87\x1d\x00\x00\x00\x00\x00\x02?\xaf\x00\x00\x00\x00\x00\x03p9\x80\x00\x00\x00\x00\x04" +
-	"\r\x1c\x00\x00\x00\x00\x00\x05P\x1b\x80\x00\x00\x00\x00\x05\xf68\x80\x00\x00\x00\x00\a/\xfd\x80\x00\x00\x00\x00\a\xd6\x1a\x80\x00\x00\x00\x00\t\x0f߀\x00\x00\x00\x00\t\xb5\xfc\x80\x00\x00\x00\x00\n\xef\xc1\x80\x00" +
-	"\x00\x00\x00\v\x9f\x19\x00\x00\x00\x00\x00\f\xd8\xde\x00\x00\x00\x00\x00\r~\xfb\x00\x00\x00\x00\x00\x0e\xb8\xc0\x00\x00\x00\x00\x00\x0f^\xdd\x00\x00\x00\x00\x00\x10\x98\xa2\x00\x00\x00\x00\x00\x11>\xbf\x00\x00\x00\x00\x00\x12" +
-	"x\x84\x00\x00\x00\x00\x00\x13\x1e\xa1\x00\x00\x00\x00\x00\x14Xf\x00\x00\x00\x00\x00\x14\xfe\x83\x00\x00\x00\x00\x00\x168H\x00\x00\x00\x00\x00\x17\x03O\x00\x00\x00\x00\x00\x18!d\x80\x00\x00\x00\x00\x18\xe31\x00\x00" +
-	"\x00\x00\x00\x1a\x01F\x80\x00\x00\x00\x00\x1a\xa7c\x80\x00\x00\x00\x00\x1b\xe1(\x80\x00\x00\x00\x00\x1c\x87E\x80\x00\x00\x00\x00\x1d\xc1\n\x80\x00\x00\x00\x00\x1eg'\x80\x00\x00\x00\x00\x1f\x97\xb2\x00\x00\x00\x00\x00 " +
-	"Y~\x80\x00\x00\x00\x00!\x80\u0380\x00\x00\x00\x00\"B\x9b\x00\x00\x00\x00\x00#i\xeb\x00\x00\x00\x00\x00$\"}\x00\x00\x00\x00\x00%I\xcd\x00\x00\x00\x00\x00&\x02_\x00\x00\x00\x00\x00')\xaf\x00\x00" +
-	"\x00\x00\x00'\xf4\xb6\x00\x00\x00\x00\x00(\xed\xe1\x80\x00\x00\x00\x00)Ԙ\x00\x00\x00\x00\x00*\xcdÀ\x00\x00\x00\x00+\xb4z\x00\x00\x00\x00\x00,\xad\xa5\x80\x00\x00\x00\x00-\x94\\\x00\x00\x00\x00\x00." +
-	"\x8d\x87\x80\x00\x00\x00\x00/t>\x00\x00\x00\x00\x000mi\x80\x00\x00\x00\x001]Z\x80\x00\x00\x00\x002V\x86\x00\x00\x00\x00\x003=<\x80\x00\x00\x00\x0046h\x00\x00\x00\x00\x005\x1d\x1e\x80\x00" +
-	"\x00\x00\x006\x16J\x00\x00\x00\x00\x006\xfd\x00\x80\x00\x00\x00\x007\xf6,\x00\x00\x00\x00\x008\xdc\xe2\x80\x00\x00\x00\x009\xa7\xe9\x80\x00\x00\x00\x00:\xbcĀ\x00\x00\x00\x00;\xbf*\x80\x00\x00\x00\x00<" +
-	"\xa5\xe1\x00\x00\x00\x00\x00=\x9f\f\x80\x00\x00\x00\x00>\x85\xc3\x00\x00\x00\x00\x00?~\xee\x80\x00\x00\x00\x00@e\xa5\x00\x00\x00\x00\x00A^Ѐ\x00\x00\x00\x00BE\x87\x00\x00\x00\x00\x00C>\xb2\x80\x00" +
-	"\x00\x00\x00D.\xa3\x80\x00\x00\x00\x00E\x1e\x94\x80\x00\x00\x00\x00F\x05K\x00\x00\x00\x00\x00G\a\xb1\x00\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x00\x00\x8a\x1c\x00\x00\x00\x00\x9a\xb0\x01\x04\x00\x00\x8c\xa0\x00\tLMT\x00AEDT\x00AEST\x00\nAEST-10AEDT,M10.1.0,M4" +
-	".1.0/3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00o3\xdaR\xb4\x02\x00\x00\xb4\x02\x00\x00\r\x00\x00\x00Australia/LHITZif2\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x008\x00\x00\x00\x05\x00\x00\x00\x19\xff\xff\xff\xffs\x16w\xdc\x00\x00\x00\x00\x14\xfef\xe0\x00\x00\x00\x00\x168@\xf8\x00\x00\x00\x00\x16\xe7\x8ah\x00\x00\x00" +
-	"\x00\x18!]x\x00\x00\x00\x00\x18\xc7lh\x00\x00\x00\x00\x1a\x01?x\x00\x00\x00\x00\x1a\xa7Nh\x00\x00\x00\x00\x1b\xe1!x\x00\x00\x00\x00\x1c\x870h\x00\x00\x00\x00\x1d\xc1\x03x\x00\x00\x00\x00\x1ey\x8e" +
-	"p\x00\x00\x00\x00\x1f\x97\xaa\xf8\x00\x00\x00\x00 Ypp\x00\x00\x00\x00!\x80\xc7x\x00\x00\x00\x00\"B\x8c\xf0\x00\x00\x00\x00#i\xe3\xf8\x00\x00\x00\x00$\"n\xf0\x00\x00\x00\x00%I\xc5\xf8\x00\x00\x00" +
-	"\x00%\xef\xdb\xf0\x00\x00\x00\x00')\xa7\xf8\x00\x00\x00\x00'Ͻ\xf0\x00\x00\x00\x00)\t\x89\xf8\x00\x00\x00\x00)\xaf\x9f\xf0\x00\x00\x00\x00*\xe9k\xf8\x00\x00\x00\x00+\x98\xbcp\x00\x00\x00\x00,҈" +
-	"x\x00\x00\x00\x00-x\x9ep\x00\x00\x00\x00.\xb2jx\x00\x00\x00\x00/X\x80p\x00\x00\x00\x000\x92Lx\x00\x00\x00\x001]Lp\x00\x00\x00\x002r.x\x00\x00\x00\x003=.p\x00\x00\x00" +
-	"\x004R\x10x\x00\x00\x00\x005\x1d\x10p\x00\x00\x00\x0061\xf2x\x00\x00\x00\x006\xfc\xf2p\x00\x00\x00\x008\x1b\x0e\xf8\x00\x00\x00\x008\xdc\xd4p\x00\x00\x00\x009\xa7\xe2x\x00\x00\x00\x00:\xbc\xb6" +
-	"p\x00\x00\x00\x00;\xda\xd2\xf8\x00\x00\x00\x00<\xa5\xd2\xf0\x00\x00\x00\x00=\xba\xb4\xf8\x00\x00\x00\x00>\x85\xb4\xf0\x00\x00\x00\x00?\x9a\x96\xf8\x00\x00\x00\x00@e\x96\xf0\x00\x00\x00\x00A\x83\xb3x\x00\x00\x00" +
-	"\x00BEx\xf0\x00\x00\x00\x00Cc\x95x\x00\x00\x00\x00D.\x95p\x00\x00\x00\x00ECwx\x00\x00\x00\x00F\x05<\xf0\x00\x00\x00\x00G#Yx\x00\x00\x00\x00G\xf7\x93\xf0\x01\x03\x02\x03\x02\x03\x02" +
-	"\x03\x02\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x00\x00\x95$\x00\x00\x00\x00\x8c\xa0\x00" +
-	"\x04\x00\x00\xa1\xb8\x01\t\x00\x00\x93\xa8\x00\x0f\x00\x00\x9a\xb0\x01\x15LMT\x00AEST\x00+1130\x00+1030\x00+11\x00\n<+1030>-10:30<+" +
-	"11>-11,M10.1.0,M4.1.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?\x95\xbd\x12E\x01\x00\x00E\x01\x00\x00\x12\x00\x00\x00Australi" +
-	"a/LindemanTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00" +
-	"\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x15\x00\x00\x00\x03\x00\x00\x00\x0e\xff\xff\xff\xffr\xed\xa2\xd4\xff\xff\xff\xff\x9cN\xc2" +
-	"\x80\xff\xff\xff\xff\x9c\xbc/\x00\xff\xff\xff\xff\xcbT\xb3\x00\xff\xff\xff\xff\xcb\xc7e\x80\xff\xff\xff\xff̷V\x80\xff\xff\xff\xffͧG\x80\xff\xff\xff\xffΠs\x00\xff\xff\xff\xffχ)\x80\x00\x00\x00" +
-	"\x00\x03p9\x80\x00\x00\x00\x00\x04\r\x1c\x00\x00\x00\x00\x00%I\xcd\x00\x00\x00\x00\x00%\xef\xea\x00\x00\x00\x00\x00')\xaf\x00\x00\x00\x00\x00'\xcf\xcc\x00\x00\x00\x00\x00)\t\x91\x00\x00\x00\x00\x00)\xaf\xae" +
-	"\x00\x00\x00\x00\x00*\xe9s\x00\x00\x00\x00\x00+\x98ʀ\x00\x00\x00\x00,ҏ\x80\x00\x00\x00\x00-x\xac\x80\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x00\x00\x8b\xac\x00\x00" +
-	"\x00\x00\x9a\xb0\x01\x04\x00\x00\x8c\xa0\x00\tLMT\x00AEDT\x00AEST\x00\nAEST-10\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00o3\xdaR\xb4\x02\x00\x00\xb4\x02\x00" +
-	"\x00\x13\x00\x00\x00Australia/Lord_HoweTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x008\x00\x00\x00\x05\x00\x00\x00\x19\xff" +
-	"\xff\xff\xffs\x16w\xdc\x00\x00\x00\x00\x14\xfef\xe0\x00\x00\x00\x00\x168@\xf8\x00\x00\x00\x00\x16\xe7\x8ah\x00\x00\x00\x00\x18!]x\x00\x00\x00\x00\x18\xc7lh\x00\x00\x00\x00\x1a\x01?x\x00\x00\x00\x00\x1a" +
-	"\xa7Nh\x00\x00\x00\x00\x1b\xe1!x\x00\x00\x00\x00\x1c\x870h\x00\x00\x00\x00\x1d\xc1\x03x\x00\x00\x00\x00\x1ey\x8ep\x00\x00\x00\x00\x1f\x97\xaa\xf8\x00\x00\x00\x00 Ypp\x00\x00\x00\x00!\x80\xc7x\x00" +
-	"\x00\x00\x00\"B\x8c\xf0\x00\x00\x00\x00#i\xe3\xf8\x00\x00\x00\x00$\"n\xf0\x00\x00\x00\x00%I\xc5\xf8\x00\x00\x00\x00%\xef\xdb\xf0\x00\x00\x00\x00')\xa7\xf8\x00\x00\x00\x00'Ͻ\xf0\x00\x00\x00\x00)" +
-	"\t\x89\xf8\x00\x00\x00\x00)\xaf\x9f\xf0\x00\x00\x00\x00*\xe9k\xf8\x00\x00\x00\x00+\x98\xbcp\x00\x00\x00\x00,҈x\x00\x00\x00\x00-x\x9ep\x00\x00\x00\x00.\xb2jx\x00\x00\x00\x00/X\x80p\x00" +
-	"\x00\x00\x000\x92Lx\x00\x00\x00\x001]Lp\x00\x00\x00\x002r.x\x00\x00\x00\x003=.p\x00\x00\x00\x004R\x10x\x00\x00\x00\x005\x1d\x10p\x00\x00\x00\x0061\xf2x\x00\x00\x00\x006" +
-	"\xfc\xf2p\x00\x00\x00\x008\x1b\x0e\xf8\x00\x00\x00\x008\xdc\xd4p\x00\x00\x00\x009\xa7\xe2x\x00\x00\x00\x00:\xbc\xb6p\x00\x00\x00\x00;\xda\xd2\xf8\x00\x00\x00\x00<\xa5\xd2\xf0\x00\x00\x00\x00=\xba\xb4\xf8\x00" +
-	"\x00\x00\x00>\x85\xb4\xf0\x00\x00\x00\x00?\x9a\x96\xf8\x00\x00\x00\x00@e\x96\xf0\x00\x00\x00\x00A\x83\xb3x\x00\x00\x00\x00BEx\xf0\x00\x00\x00\x00Cc\x95x\x00\x00\x00\x00D.\x95p\x00\x00\x00\x00E" +
-	"Cwx\x00\x00\x00\x00F\x05<\xf0\x00\x00\x00\x00G#Yx\x00\x00\x00\x00G\xf7\x93\xf0\x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04" +
-	"\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x00\x00\x95$\x00\x00\x00\x00\x8c\xa0\x00\x04\x00\x00\xa1\xb8\x01\t\x00\x00\x93\xa8\x00\x0f\x00\x00\x9a\xb0\x01\x15LMT\x00AES" +
-	"T\x00+1130\x00+1030\x00+11\x00\n<+1030>-10:30<+11>-11,M10.1.0,M4.1.0\nPK\x03\x04" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9b\xe1\xc1\xa9\x88\x03\x00\x00\x88\x03\x00\x00\x13\x00\x00\x00Australia/MelbourneTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00S\x00\x00\x00\x03\x00\x00\x00\x0e\xff\xff\xff\xffs\x16\x85\x18\xff\xff\xff\xff\x9cN\u0080\xff\xff\xff\xff\x9c\xbc/\x00\xff\xff\xff\xff\xcbT\xb3\x00\xff\xff\xff\xff\xcb\xc7e\x80" +
-	"\xff\xff\xff\xff̷V\x80\xff\xff\xff\xffͧG\x80\xff\xff\xff\xffΠs\x00\xff\xff\xff\xffχ)\x80\x00\x00\x00\x00\x03p9\x80\x00\x00\x00\x00\x04\r\x1c\x00\x00\x00\x00\x00\x05P\x1b\x80\x00\x00\x00\x00" +
-	"\x05\xf68\x80\x00\x00\x00\x00\a/\xfd\x80\x00\x00\x00\x00\a\xd6\x1a\x80\x00\x00\x00\x00\t\x0f߀\x00\x00\x00\x00\t\xb5\xfc\x80\x00\x00\x00\x00\n\xef\xc1\x80\x00\x00\x00\x00\v\x9f\x19\x00\x00\x00\x00\x00\f\xd8\xde\x00" +
-	"\x00\x00\x00\x00\r~\xfb\x00\x00\x00\x00\x00\x0e\xb8\xc0\x00\x00\x00\x00\x00\x0f^\xdd\x00\x00\x00\x00\x00\x10\x98\xa2\x00\x00\x00\x00\x00\x11>\xbf\x00\x00\x00\x00\x00\x12x\x84\x00\x00\x00\x00\x00\x13\x1e\xa1\x00\x00\x00\x00\x00" +
-	"\x14Xf\x00\x00\x00\x00\x00\x14\xfe\x83\x00\x00\x00\x00\x00\x168H\x00\x00\x00\x00\x00\x16矀\x00\x00\x00\x00\x18!d\x80\x00\x00\x00\x00\x18ǁ\x80\x00\x00\x00\x00\x1a\x01F\x80\x00\x00\x00\x00\x1a\xa7c\x80" +
-	"\x00\x00\x00\x00\x1b\xe1(\x80\x00\x00\x00\x00\x1c\x87E\x80\x00\x00\x00\x00\x1d\xc1\n\x80\x00\x00\x00\x00\x1ey\x9c\x80\x00\x00\x00\x00\x1f\x97\xb2\x00\x00\x00\x00\x00 Y~\x80\x00\x00\x00\x00!w\x94\x00\x00\x00\x00\x00" +
-	"\"B\x9b\x00\x00\x00\x00\x00#i\xeb\x00\x00\x00\x00\x00$\"}\x00\x00\x00\x00\x00%I\xcd\x00\x00\x00\x00\x00&\x02_\x00\x00\x00\x00\x00')\xaf\x00\x00\x00\x00\x00'\xcf\xcc\x00\x00\x00\x00\x00)\t\x91\x00" +
-	"\x00\x00\x00\x00)\xaf\xae\x00\x00\x00\x00\x00*\xe9s\x00\x00\x00\x00\x00+\x98ʀ\x00\x00\x00\x00,ҏ\x80\x00\x00\x00\x00-x\xac\x80\x00\x00\x00\x00.\xb2q\x80\x00\x00\x00\x00/t>\x00\x00\x00\x00\x00" +
-	"0\x92S\x80\x00\x00\x00\x001]Z\x80\x00\x00\x00\x002r5\x80\x00\x00\x00\x003=<\x80\x00\x00\x00\x004R\x17\x80\x00\x00\x00\x005\x1d\x1e\x80\x00\x00\x00\x0061\xf9\x80\x00\x00\x00\x006\xfd\x00\x80" +
-	"\x00\x00\x00\x008\x1b\x16\x00\x00\x00\x00\x008\xdc\xe2\x80\x00\x00\x00\x009\xa7\xe9\x80\x00\x00\x00\x00:\xbcĀ\x00\x00\x00\x00;\xda\xda\x00\x00\x00\x00\x00<\xa5\xe1\x00\x00\x00\x00\x00=\xba\xbc\x00\x00\x00\x00\x00" +
-	">\x85\xc3\x00\x00\x00\x00\x00?\x9a\x9e\x00\x00\x00\x00\x00@e\xa5\x00\x00\x00\x00\x00A\x83\xba\x80\x00\x00\x00\x00BE\x87\x00\x00\x00\x00\x00Cc\x9c\x80\x00\x00\x00\x00D.\xa3\x80\x00\x00\x00\x00EC~\x80" +
-	"\x00\x00\x00\x00F\x05K\x00\x00\x00\x00\x00G#`\x80\x00\x00\x00\x00G\xf7\xa2\x00\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x00\x00\x87\xe8\x00\x00\x00\x00\x9a\xb0\x01\x04\x00" +
-	"\x00\x8c\xa0\x00\tLMT\x00AEDT\x00AEST\x00\nAEST-10AEDT,M10.1.0,M4.1.0/3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00X\xb9\x9ap\x88\x03\x00\x00\x88\x03\x00\x00\r\x00\x00\x00Australia/NSWTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00S\x00" +
-	"\x00\x00\x03\x00\x00\x00\x0e\xff\xff\xff\xffs\x16\x7f<\xff\xff\xff\xff\x9cN\u0080\xff\xff\xff\xff\x9c\xbc/\x00\xff\xff\xff\xff\xcbT\xb3\x00\xff\xff\xff\xff\xcb\xc7e\x80\xff\xff\xff\xff̷V\x80\xff\xff\xff\xff\xcd" +
-	"\xa7G\x80\xff\xff\xff\xffΠs\x00\xff\xff\xff\xffχ)\x80\x00\x00\x00\x00\x03p9\x80\x00\x00\x00\x00\x04\r\x1c\x00\x00\x00\x00\x00\x05P\x1b\x80\x00\x00\x00\x00\x05\xf68\x80\x00\x00\x00\x00\a/\xfd\x80\x00" +
-	"\x00\x00\x00\a\xd6\x1a\x80\x00\x00\x00\x00\t\x0f߀\x00\x00\x00\x00\t\xb5\xfc\x80\x00\x00\x00\x00\n\xef\xc1\x80\x00\x00\x00\x00\v\x9f\x19\x00\x00\x00\x00\x00\f\xd8\xde\x00\x00\x00\x00\x00\r~\xfb\x00\x00\x00\x00\x00\x0e" +
-	"\xb8\xc0\x00\x00\x00\x00\x00\x0f^\xdd\x00\x00\x00\x00\x00\x10\x98\xa2\x00\x00\x00\x00\x00\x11>\xbf\x00\x00\x00\x00\x00\x12x\x84\x00\x00\x00\x00\x00\x13\x1e\xa1\x00\x00\x00\x00\x00\x14Xf\x00\x00\x00\x00\x00\x14\xfe\x83\x00\x00" +
-	"\x00\x00\x00\x168H\x00\x00\x00\x00\x00\x17\f\x89\x80\x00\x00\x00\x00\x18!d\x80\x00\x00\x00\x00\x18ǁ\x80\x00\x00\x00\x00\x1a\x01F\x80\x00\x00\x00\x00\x1a\xa7c\x80\x00\x00\x00\x00\x1b\xe1(\x80\x00\x00\x00\x00\x1c" +
-	"\x87E\x80\x00\x00\x00\x00\x1d\xc1\n\x80\x00\x00\x00\x00\x1ey\x9c\x80\x00\x00\x00\x00\x1f\x97\xb2\x00\x00\x00\x00\x00 Y~\x80\x00\x00\x00\x00!\x80\u0380\x00\x00\x00\x00\"B\x9b\x00\x00\x00\x00\x00#i\xeb\x00\x00" +
-	"\x00\x00\x00$\"}\x00\x00\x00\x00\x00%I\xcd\x00\x00\x00\x00\x00%\xef\xea\x00\x00\x00\x00\x00')\xaf\x00\x00\x00\x00\x00'\xcf\xcc\x00\x00\x00\x00\x00)\t\x91\x00\x00\x00\x00\x00)\xaf\xae\x00\x00\x00\x00\x00*" +
-	"\xe9s\x00\x00\x00\x00\x00+\x98ʀ\x00\x00\x00\x00,ҏ\x80\x00\x00\x00\x00-x\xac\x80\x00\x00\x00\x00.\xb2q\x80\x00\x00\x00\x00/X\x8e\x80\x00\x00\x00\x000\x92S\x80\x00\x00\x00\x001]Z\x80\x00" +
-	"\x00\x00\x002r5\x80\x00\x00\x00\x003=<\x80\x00\x00\x00\x004R\x17\x80\x00\x00\x00\x005\x1d\x1e\x80\x00\x00\x00\x0061\xf9\x80\x00\x00\x00\x006\xfd\x00\x80\x00\x00\x00\x008\x1b\x16\x00\x00\x00\x00\x008" +
-	"\xdc\xe2\x80\x00\x00\x00\x009\xa7\xe9\x80\x00\x00\x00\x00:\xbcĀ\x00\x00\x00\x00;\xda\xda\x00\x00\x00\x00\x00<\xa5\xe1\x00\x00\x00\x00\x00=\xba\xbc\x00\x00\x00\x00\x00>\x85\xc3\x00\x00\x00\x00\x00?\x9a\x9e\x00\x00" +
-	"\x00\x00\x00@e\xa5\x00\x00\x00\x00\x00A\x83\xba\x80\x00\x00\x00\x00BE\x87\x00\x00\x00\x00\x00Cc\x9c\x80\x00\x00\x00\x00D.\xa3\x80\x00\x00\x00\x00EC~\x80\x00\x00\x00\x00F\x05K\x00\x00\x00\x00\x00G" +
-	"#`\x80\x00\x00\x00\x00G\xf7\xa2\x00\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x00\x00\x8d\xc4\x00\x00\x00\x00\x9a\xb0\x01\x04\x00\x00\x8c\xa0\x00\tLMT\x00AEDT" +
-	"\x00AEST\x00\nAEST-10AEDT,M10.1.0,M4.1.0/3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc8R\x1a\x1b\xea\x00\x00\x00\xea\x00" +
-	"\x00\x00\x0f\x00\x00\x00Australia/NorthTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00\x00\x00\x04\x00\x00\x00\x0e\xff\xff\xff\xff" +
-	"s\x16\x92X\xff\xff\xff\xff{\x12\x03p\xff\xff\xff\xff\x9cNɈ\xff\xff\xff\xff\x9c\xbc6\b\xff\xff\xff\xff\xcbT\xba\b\xff\xff\xff\xff\xcb\xc7l\x88\xff\xff\xff\xff̷]\x88\xff\xff\xff\xffͧN\x88" +
-	"\xff\xff\xff\xffΠz\b\xff\xff\xff\xffχ0\x88\x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\x00\x00z\xa8\x00\x00\x00\x00~\x90\x00\x04\x00\x00\x93\xa8\x01\t\x00\x00\x85\x98\x00\x04LMT\x00ACST\x00A" +
-	"CDT\x00\nACST-9:30\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00ϻ\xca\x1a2\x01\x00\x002\x01\x00\x00\x0f\x00\x00\x00Australia/Perth" +
-	"TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x13\x00\x00\x00\x03\x00\x00\x00\x0e\xff\xff\xff\xfft\xa6\x16\xe4\xff\xff\xff\xff\x9cNޠ\xff\xff\xff\xff\x9c\xbcK \xff" +
-	"\xff\xff\xff\xcbT\xcf \xff\xff\xff\xff\xcbǁ\xa0\xff\xff\xff\xff̷r\xa0\xff\xff\xff\xffͧc\xa0\x00\x00\x00\x00\t\x0f\xfb\xa0\x00\x00\x00\x00\t\xb6\x18\xa0\x00\x00\x00\x00\x1a\x01b\xa0\x00\x00\x00\x00\x1a" +
-	"\xa7\x7f\xa0\x00\x00\x00\x00)%\\\xa0\x00\x00\x00\x00)\xaf\xca \x00\x00\x00\x00Eq\xbf \x00\x00\x00\x00F\x05g \x00\x00\x00\x00G#|\xa0\x00\x00\x00\x00G\ue0e0\x00\x00\x00\x00I\x03^\xa0\x00" +
-	"\x00\x00\x00I\xcee\xa0\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x00\x00l\x9c\x00\x00\x00\x00~\x90\x01\x04\x00\x00p\x80\x00\tLMT\x00AWDT\x00AWST\x00\nA" +
-	"WST-8\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x003\xba\xde\xd3!\x01\x00\x00!\x01\x00\x00\x14\x00\x00\x00Australia/QueenslandTZif" +
-	"2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x00\x00\x03\x00\x00\x00\x0e\xff\xff\xff\xffr\xed\x9f\b\xff\xff\xff\xff\x9cN\u0080\xff\xff\xff\xff\x9c\xbc/\x00\xff\xff\xff\xff\xcb" +
-	"T\xb3\x00\xff\xff\xff\xff\xcb\xc7e\x80\xff\xff\xff\xff̷V\x80\xff\xff\xff\xffͧG\x80\xff\xff\xff\xffΠs\x00\xff\xff\xff\xffχ)\x80\x00\x00\x00\x00\x03p9\x80\x00\x00\x00\x00\x04\r\x1c\x00\x00" +
-	"\x00\x00\x00%I\xcd\x00\x00\x00\x00\x00%\xef\xea\x00\x00\x00\x00\x00')\xaf\x00\x00\x00\x00\x00'\xcf\xcc\x00\x00\x00\x00\x00)\t\x91\x00\x00\x00\x00\x00)\xaf\xae\x00\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x00\x00\x8fx\x00\x00\x00\x00\x9a\xb0\x01\x04\x00\x00\x8c\xa0\x00\tLMT\x00AEDT\x00AEST\x00\nAEST-10\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8f" +
-	"f~ՙ\x03\x00\x00\x99\x03\x00\x00\x0f\x00\x00\x00Australia/SouthTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00T\x00\x00\x00" +
-	"\x04\x00\x00\x00\x0e\xff\xff\xff\xffs\x16\x8b\x14\xff\xff\xff\xff{\x12\x03p\xff\xff\xff\xff\x9cNɈ\xff\xff\xff\xff\x9c\xbc6\b\xff\xff\xff\xff\xcbT\xba\b\xff\xff\xff\xff\xcb\xc7l\x88\xff\xff\xff\xff̷]" +
-	"\x88\xff\xff\xff\xffͧN\x88\xff\xff\xff\xffΠz\b\xff\xff\xff\xffχ0\x88\x00\x00\x00\x00\x03p@\x88\x00\x00\x00\x00\x04\r#\b\x00\x00\x00\x00\x05P\"\x88\x00\x00\x00\x00\x05\xf6?\x88\x00\x00\x00" +
-	"\x00\a0\x04\x88\x00\x00\x00\x00\a\xd6!\x88\x00\x00\x00\x00\t\x0f\xe6\x88\x00\x00\x00\x00\t\xb6\x03\x88\x00\x00\x00\x00\n\xefȈ\x00\x00\x00\x00\v\x9f \b\x00\x00\x00\x00\f\xd8\xe5\b\x00\x00\x00\x00\r\x7f\x02" +
-	"\b\x00\x00\x00\x00\x0e\xb8\xc7\b\x00\x00\x00\x00\x0f^\xe4\b\x00\x00\x00\x00\x10\x98\xa9\b\x00\x00\x00\x00\x11>\xc6\b\x00\x00\x00\x00\x12x\x8b\b\x00\x00\x00\x00\x13\x1e\xa8\b\x00\x00\x00\x00\x14Xm\b\x00\x00\x00" +
-	"\x00\x14\xfe\x8a\b\x00\x00\x00\x00\x168O\b\x00\x00\x00\x00\x16禈\x00\x00\x00\x00\x18!k\x88\x00\x00\x00\x00\x18Lj\x88\x00\x00\x00\x00\x1a\x01M\x88\x00\x00\x00\x00\x1a\xa7j\x88\x00\x00\x00\x00\x1b\xe1/" +
-	"\x88\x00\x00\x00\x00\x1c\x87L\x88\x00\x00\x00\x00\x1d\xc1\x11\x88\x00\x00\x00\x00\x1ey\xa3\x88\x00\x00\x00\x00\x1f\x97\xb9\b\x00\x00\x00\x00 Y\x85\x88\x00\x00\x00\x00!\x80Ո\x00\x00\x00\x00\"B\xa2\b\x00\x00\x00" +
-	"\x00#i\xf2\b\x00\x00\x00\x00$\"\x84\b\x00\x00\x00\x00%I\xd4\b\x00\x00\x00\x00&\x02f\b\x00\x00\x00\x00')\xb6\b\x00\x00\x00\x00'\xcf\xd3\b\x00\x00\x00\x00)\t\x98\b\x00\x00\x00\x00)\xcbd" +
-	"\x88\x00\x00\x00\x00*\xe9z\b\x00\x00\x00\x00+\x98ш\x00\x00\x00\x00,Җ\x88\x00\x00\x00\x00-\x8b(\x88\x00\x00\x00\x00.\xb2x\x88\x00\x00\x00\x00/tE\b\x00\x00\x00\x000\x92Z\x88\x00\x00\x00" +
-	"\x001]a\x88\x00\x00\x00\x002r<\x88\x00\x00\x00\x003=C\x88\x00\x00\x00\x004R\x1e\x88\x00\x00\x00\x005\x1d%\x88\x00\x00\x00\x0062\x00\x88\x00\x00\x00\x006\xfd\a\x88\x00\x00\x00\x008\x1b\x1d" +
-	"\b\x00\x00\x00\x008\xdc\xe9\x88\x00\x00\x00\x009\xfa\xff\b\x00\x00\x00\x00:\xbcˈ\x00\x00\x00\x00;\xda\xe1\b\x00\x00\x00\x00<\xa5\xe8\b\x00\x00\x00\x00=\xba\xc3\b\x00\x00\x00\x00>\x85\xca\b\x00\x00\x00" +
-	"\x00?\x9a\xa5\b\x00\x00\x00\x00@e\xac\b\x00\x00\x00\x00A\x83\xc1\x88\x00\x00\x00\x00BE\x8e\b\x00\x00\x00\x00Cc\xa3\x88\x00\x00\x00\x00D.\xaa\x88\x00\x00\x00\x00EC\x85\x88\x00\x00\x00\x00F\x05R" +
-	"\b\x00\x00\x00\x00G#g\x88\x00\x00\x00\x00G\xf7\xa9\b\x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02" +
-	"\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x00\x00\x81\xec\x00\x00\x00\x00~\x90\x00\x04\x00\x00\x93\xa8\x01\t\x00" +
-	"\x00\x85\x98\x00\x04LMT\x00ACST\x00ACDT\x00\nACST-9:30ACDT,M10.1.0,M4.1.0/3\nPK\x03\x04\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00X\xb9\x9ap\x88\x03\x00\x00\x88\x03\x00\x00\x10\x00\x00\x00Australia/SydneyTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00S\x00\x00\x00\x03\x00\x00\x00\x0e\xff\xff\xff\xffs\x16\x7f<\xff\xff\xff\xff\x9cN\u0080\xff\xff\xff\xff\x9c\xbc/\x00\xff\xff\xff\xff\xcbT\xb3\x00\xff\xff\xff\xff\xcb\xc7e\x80\xff\xff\xff\xff̷V\x80" +
-	"\xff\xff\xff\xffͧG\x80\xff\xff\xff\xffΠs\x00\xff\xff\xff\xffχ)\x80\x00\x00\x00\x00\x03p9\x80\x00\x00\x00\x00\x04\r\x1c\x00\x00\x00\x00\x00\x05P\x1b\x80\x00\x00\x00\x00\x05\xf68\x80\x00\x00\x00\x00" +
-	"\a/\xfd\x80\x00\x00\x00\x00\a\xd6\x1a\x80\x00\x00\x00\x00\t\x0f߀\x00\x00\x00\x00\t\xb5\xfc\x80\x00\x00\x00\x00\n\xef\xc1\x80\x00\x00\x00\x00\v\x9f\x19\x00\x00\x00\x00\x00\f\xd8\xde\x00\x00\x00\x00\x00\r~\xfb\x00" +
-	"\x00\x00\x00\x00\x0e\xb8\xc0\x00\x00\x00\x00\x00\x0f^\xdd\x00\x00\x00\x00\x00\x10\x98\xa2\x00\x00\x00\x00\x00\x11>\xbf\x00\x00\x00\x00\x00\x12x\x84\x00\x00\x00\x00\x00\x13\x1e\xa1\x00\x00\x00\x00\x00\x14Xf\x00\x00\x00\x00\x00" +
-	"\x14\xfe\x83\x00\x00\x00\x00\x00\x168H\x00\x00\x00\x00\x00\x17\f\x89\x80\x00\x00\x00\x00\x18!d\x80\x00\x00\x00\x00\x18ǁ\x80\x00\x00\x00\x00\x1a\x01F\x80\x00\x00\x00\x00\x1a\xa7c\x80\x00\x00\x00\x00\x1b\xe1(\x80" +
-	"\x00\x00\x00\x00\x1c\x87E\x80\x00\x00\x00\x00\x1d\xc1\n\x80\x00\x00\x00\x00\x1ey\x9c\x80\x00\x00\x00\x00\x1f\x97\xb2\x00\x00\x00\x00\x00 Y~\x80\x00\x00\x00\x00!\x80\u0380\x00\x00\x00\x00\"B\x9b\x00\x00\x00\x00\x00" +
-	"#i\xeb\x00\x00\x00\x00\x00$\"}\x00\x00\x00\x00\x00%I\xcd\x00\x00\x00\x00\x00%\xef\xea\x00\x00\x00\x00\x00')\xaf\x00\x00\x00\x00\x00'\xcf\xcc\x00\x00\x00\x00\x00)\t\x91\x00\x00\x00\x00\x00)\xaf\xae\x00" +
-	"\x00\x00\x00\x00*\xe9s\x00\x00\x00\x00\x00+\x98ʀ\x00\x00\x00\x00,ҏ\x80\x00\x00\x00\x00-x\xac\x80\x00\x00\x00\x00.\xb2q\x80\x00\x00\x00\x00/X\x8e\x80\x00\x00\x00\x000\x92S\x80\x00\x00\x00\x00" +
-	"1]Z\x80\x00\x00\x00\x002r5\x80\x00\x00\x00\x003=<\x80\x00\x00\x00\x004R\x17\x80\x00\x00\x00\x005\x1d\x1e\x80\x00\x00\x00\x0061\xf9\x80\x00\x00\x00\x006\xfd\x00\x80\x00\x00\x00\x008\x1b\x16\x00" +
-	"\x00\x00\x00\x008\xdc\xe2\x80\x00\x00\x00\x009\xa7\xe9\x80\x00\x00\x00\x00:\xbcĀ\x00\x00\x00\x00;\xda\xda\x00\x00\x00\x00\x00<\xa5\xe1\x00\x00\x00\x00\x00=\xba\xbc\x00\x00\x00\x00\x00>\x85\xc3\x00\x00\x00\x00\x00" +
-	"?\x9a\x9e\x00\x00\x00\x00\x00@e\xa5\x00\x00\x00\x00\x00A\x83\xba\x80\x00\x00\x00\x00BE\x87\x00\x00\x00\x00\x00Cc\x9c\x80\x00\x00\x00\x00D.\xa3\x80\x00\x00\x00\x00EC~\x80\x00\x00\x00\x00F\x05K\x00" +
-	"\x00\x00\x00\x00G#`\x80\x00\x00\x00\x00G\xf7\xa2\x00\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x00\x00\x8d\xc4\x00\x00\x00\x00\x9a\xb0\x01\x04\x00\x00\x8c\xa0\x00\tLMT" +
-	"\x00AEDT\x00AEST\x00\nAEST-10AEDT,M10.1.0,M4.1.0/3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00E\xf2\xe6Z\xeb" +
-	"\x03\x00\x00\xeb\x03\x00\x00\x12\x00\x00\x00Australia/TasmaniaTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00^\x00\x00\x00\x03" +
-	"\x00\x00\x00\x0e\xff\xff\xff\xfft.\x00\xe4\xff\xff\xff\xff\x9b\xd5x\x80\xff\xff\xff\xff\x9c\xbc/\x00\xff\xff\xff\xff\x9d\xdaD\x80\xff\xff\xff\xff\x9e\x80a\x80\xff\xff\xff\xff\x9f\xba&\x80\xff\xff\xff\xff\xa0`C\x80" +
-	"\xff\xff\xff\xff\xcbT\xb3\x00\xff\xff\xff\xff\xcb\xc7e\x80\xff\xff\xff\xff̷V\x80\xff\xff\xff\xffͧG\x80\xff\xff\xff\xffΠs\x00\xff\xff\xff\xffχ)\x80\xff\xff\xff\xff\xfb\u008d\x00\xff\xff\xff\xff" +
-	"\xfc\xb2~\x00\xff\xff\xff\xff\xfd\xc7Y\x00\xff\xff\xff\xff\xfev\xb0\x80\xff\xff\xff\xff\xff\xa7;\x00\x00\x00\x00\x00\x00V\x92\x80\x00\x00\x00\x00\x01\x87\x1d\x00\x00\x00\x00\x00\x02?\xaf\x00\x00\x00\x00\x00\x03p9\x80" +
-	"\x00\x00\x00\x00\x04\r\x1c\x00\x00\x00\x00\x00\x05P\x1b\x80\x00\x00\x00\x00\x05\xf68\x80\x00\x00\x00\x00\a/\xfd\x80\x00\x00\x00\x00\a\xd6\x1a\x80\x00\x00\x00\x00\t\x0f߀\x00\x00\x00\x00\t\xb5\xfc\x80\x00\x00\x00\x00" +
-	"\n\xef\xc1\x80\x00\x00\x00\x00\v\x9f\x19\x00\x00\x00\x00\x00\f\xd8\xde\x00\x00\x00\x00\x00\r~\xfb\x00\x00\x00\x00\x00\x0e\xb8\xc0\x00\x00\x00\x00\x00\x0f^\xdd\x00\x00\x00\x00\x00\x10\x98\xa2\x00\x00\x00\x00\x00\x11>\xbf\x00" +
-	"\x00\x00\x00\x00\x12x\x84\x00\x00\x00\x00\x00\x13\x1e\xa1\x00\x00\x00\x00\x00\x14Xf\x00\x00\x00\x00\x00\x14\xfe\x83\x00\x00\x00\x00\x00\x168H\x00\x00\x00\x00\x00\x17\x03O\x00\x00\x00\x00\x00\x18!d\x80\x00\x00\x00\x00" +
-	"\x18\xe31\x00\x00\x00\x00\x00\x1a\x01F\x80\x00\x00\x00\x00\x1a\xa7c\x80\x00\x00\x00\x00\x1b\xe1(\x80\x00\x00\x00\x00\x1c\x87E\x80\x00\x00\x00\x00\x1d\xc1\n\x80\x00\x00\x00\x00\x1eg'\x80\x00\x00\x00\x00\x1f\x97\xb2\x00" +
-	"\x00\x00\x00\x00 Y~\x80\x00\x00\x00\x00!\x80\u0380\x00\x00\x00\x00\"B\x9b\x00\x00\x00\x00\x00#i\xeb\x00\x00\x00\x00\x00$\"}\x00\x00\x00\x00\x00%I\xcd\x00\x00\x00\x00\x00&\x02_\x00\x00\x00\x00\x00" +
-	"')\xaf\x00\x00\x00\x00\x00'\xf4\xb6\x00\x00\x00\x00\x00(\xed\xe1\x80\x00\x00\x00\x00)Ԙ\x00\x00\x00\x00\x00*\xcdÀ\x00\x00\x00\x00+\xb4z\x00\x00\x00\x00\x00,\xad\xa5\x80\x00\x00\x00\x00-\x94\\\x00" +
-	"\x00\x00\x00\x00.\x8d\x87\x80\x00\x00\x00\x00/t>\x00\x00\x00\x00\x000mi\x80\x00\x00\x00\x001]Z\x80\x00\x00\x00\x002V\x86\x00\x00\x00\x00\x003=<\x80\x00\x00\x00\x0046h\x00\x00\x00\x00\x00" +
-	"5\x1d\x1e\x80\x00\x00\x00\x006\x16J\x00\x00\x00\x00\x006\xfd\x00\x80\x00\x00\x00\x007\xf6,\x00\x00\x00\x00\x008\xdc\xe2\x80\x00\x00\x00\x009\xa7\xe9\x80\x00\x00\x00\x00:\xbcĀ\x00\x00\x00\x00;\xbf*\x80" +
-	"\x00\x00\x00\x00<\xa5\xe1\x00\x00\x00\x00\x00=\x9f\f\x80\x00\x00\x00\x00>\x85\xc3\x00\x00\x00\x00\x00?~\xee\x80\x00\x00\x00\x00@e\xa5\x00\x00\x00\x00\x00A^Ѐ\x00\x00\x00\x00BE\x87\x00\x00\x00\x00\x00" +
-	"C>\xb2\x80\x00\x00\x00\x00D.\xa3\x80\x00\x00\x00\x00E\x1e\x94\x80\x00\x00\x00\x00F\x05K\x00\x00\x00\x00\x00G\a\xb1\x00\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x00\x00\x8a\x1c\x00\x00\x00\x00\x9a\xb0\x01\x04\x00\x00\x8c\xa0\x00\tLMT\x00AEDT\x00AEST\x00\nAEST-10AEDT,M10.1" +
-	".0,M4.1.0/3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9b\xe1\xc1\xa9\x88\x03\x00\x00\x88\x03\x00\x00\x12\x00\x00\x00Australia/Victoria" +
-	"TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00S\x00\x00\x00\x03\x00\x00\x00\x0e\xff\xff\xff\xffs\x16\x85\x18\xff\xff\xff\xff\x9cN\u0080\xff\xff\xff\xff\x9c\xbc/\x00\xff" +
-	"\xff\xff\xff\xcbT\xb3\x00\xff\xff\xff\xff\xcb\xc7e\x80\xff\xff\xff\xff̷V\x80\xff\xff\xff\xffͧG\x80\xff\xff\xff\xffΠs\x00\xff\xff\xff\xffχ)\x80\x00\x00\x00\x00\x03p9\x80\x00\x00\x00\x00\x04" +
-	"\r\x1c\x00\x00\x00\x00\x00\x05P\x1b\x80\x00\x00\x00\x00\x05\xf68\x80\x00\x00\x00\x00\a/\xfd\x80\x00\x00\x00\x00\a\xd6\x1a\x80\x00\x00\x00\x00\t\x0f߀\x00\x00\x00\x00\t\xb5\xfc\x80\x00\x00\x00\x00\n\xef\xc1\x80\x00" +
-	"\x00\x00\x00\v\x9f\x19\x00\x00\x00\x00\x00\f\xd8\xde\x00\x00\x00\x00\x00\r~\xfb\x00\x00\x00\x00\x00\x0e\xb8\xc0\x00\x00\x00\x00\x00\x0f^\xdd\x00\x00\x00\x00\x00\x10\x98\xa2\x00\x00\x00\x00\x00\x11>\xbf\x00\x00\x00\x00\x00\x12" +
-	"x\x84\x00\x00\x00\x00\x00\x13\x1e\xa1\x00\x00\x00\x00\x00\x14Xf\x00\x00\x00\x00\x00\x14\xfe\x83\x00\x00\x00\x00\x00\x168H\x00\x00\x00\x00\x00\x16矀\x00\x00\x00\x00\x18!d\x80\x00\x00\x00\x00\x18ǁ\x80\x00" +
-	"\x00\x00\x00\x1a\x01F\x80\x00\x00\x00\x00\x1a\xa7c\x80\x00\x00\x00\x00\x1b\xe1(\x80\x00\x00\x00\x00\x1c\x87E\x80\x00\x00\x00\x00\x1d\xc1\n\x80\x00\x00\x00\x00\x1ey\x9c\x80\x00\x00\x00\x00\x1f\x97\xb2\x00\x00\x00\x00\x00 " +
-	"Y~\x80\x00\x00\x00\x00!w\x94\x00\x00\x00\x00\x00\"B\x9b\x00\x00\x00\x00\x00#i\xeb\x00\x00\x00\x00\x00$\"}\x00\x00\x00\x00\x00%I\xcd\x00\x00\x00\x00\x00&\x02_\x00\x00\x00\x00\x00')\xaf\x00\x00" +
-	"\x00\x00\x00'\xcf\xcc\x00\x00\x00\x00\x00)\t\x91\x00\x00\x00\x00\x00)\xaf\xae\x00\x00\x00\x00\x00*\xe9s\x00\x00\x00\x00\x00+\x98ʀ\x00\x00\x00\x00,ҏ\x80\x00\x00\x00\x00-x\xac\x80\x00\x00\x00\x00." +
-	"\xb2q\x80\x00\x00\x00\x00/t>\x00\x00\x00\x00\x000\x92S\x80\x00\x00\x00\x001]Z\x80\x00\x00\x00\x002r5\x80\x00\x00\x00\x003=<\x80\x00\x00\x00\x004R\x17\x80\x00\x00\x00\x005\x1d\x1e\x80\x00" +
-	"\x00\x00\x0061\xf9\x80\x00\x00\x00\x006\xfd\x00\x80\x00\x00\x00\x008\x1b\x16\x00\x00\x00\x00\x008\xdc\xe2\x80\x00\x00\x00\x009\xa7\xe9\x80\x00\x00\x00\x00:\xbcĀ\x00\x00\x00\x00;\xda\xda\x00\x00\x00\x00\x00<" +
-	"\xa5\xe1\x00\x00\x00\x00\x00=\xba\xbc\x00\x00\x00\x00\x00>\x85\xc3\x00\x00\x00\x00\x00?\x9a\x9e\x00\x00\x00\x00\x00@e\xa5\x00\x00\x00\x00\x00A\x83\xba\x80\x00\x00\x00\x00BE\x87\x00\x00\x00\x00\x00Cc\x9c\x80\x00" +
-	"\x00\x00\x00D.\xa3\x80\x00\x00\x00\x00EC~\x80\x00\x00\x00\x00F\x05K\x00\x00\x00\x00\x00G#`\x80\x00\x00\x00\x00G\xf7\xa2\x00\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x00\x00\x87\xe8\x00\x00\x00\x00\x9a\xb0\x01\x04\x00\x00\x8c\xa0\x00\tLMT\x00AEDT\x00AEST\x00\nAEST-10AEDT,M10.1.0,M4.1." +
-	"0/3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00ϻ\xca\x1a2\x01\x00\x002\x01\x00\x00\x0e\x00\x00\x00Australia/WestTZif2\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x13\x00\x00\x00\x03\x00\x00\x00\x0e\xff\xff\xff\xfft\xa6\x16\xe4\xff\xff\xff\xff\x9cNޠ\xff\xff\xff\xff\x9c\xbcK \xff\xff\xff\xff\xcbT\xcf \xff\xff\xff\xff\xcb" +
-	"ǁ\xa0\xff\xff\xff\xff̷r\xa0\xff\xff\xff\xffͧc\xa0\x00\x00\x00\x00\t\x0f\xfb\xa0\x00\x00\x00\x00\t\xb6\x18\xa0\x00\x00\x00\x00\x1a\x01b\xa0\x00\x00\x00\x00\x1a\xa7\x7f\xa0\x00\x00\x00\x00)%\\\xa0\x00" +
-	"\x00\x00\x00)\xaf\xca \x00\x00\x00\x00Eq\xbf \x00\x00\x00\x00F\x05g \x00\x00\x00\x00G#|\xa0\x00\x00\x00\x00G\ue0e0\x00\x00\x00\x00I\x03^\xa0\x00\x00\x00\x00I\xcee\xa0\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x00\x00l\x9c\x00\x00\x00\x00~\x90\x01\x04\x00\x00p\x80\x00\tLMT\x00AWDT\x00AWST\x00\nAWST-8\nPK\x03\x04\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\xbd\xca#\x7f\xad\x03\x00\x00\xad\x03\x00\x00\x14\x00\x00\x00Australia/YancowinnaTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00U\x00\x00\x00\x05\x00\x00\x00\x13\xff\xff\xff\xffs\x16\x88d\xff\xff\xff\xffv\x04\xa5\xe0\xff\xff\xff\xff{\x12\x03p\xff\xff\xff\xff\x9cNɈ\xff\xff\xff\xff\x9c\xbc6\b\xff" +
-	"\xff\xff\xff\xcbT\xba\b\xff\xff\xff\xff\xcb\xc7l\x88\xff\xff\xff\xff̷]\x88\xff\xff\xff\xffͧN\x88\xff\xff\xff\xffΠz\b\xff\xff\xff\xffχ0\x88\x00\x00\x00\x00\x03p@\x88\x00\x00\x00\x00\x04" +
-	"\r#\b\x00\x00\x00\x00\x05P\"\x88\x00\x00\x00\x00\x05\xf6?\x88\x00\x00\x00\x00\a0\x04\x88\x00\x00\x00\x00\a\xd6!\x88\x00\x00\x00\x00\t\x0f\xe6\x88\x00\x00\x00\x00\t\xb6\x03\x88\x00\x00\x00\x00\n\xefȈ\x00" +
-	"\x00\x00\x00\v\x9f \b\x00\x00\x00\x00\f\xd8\xe5\b\x00\x00\x00\x00\r\x7f\x02\b\x00\x00\x00\x00\x0e\xb8\xc7\b\x00\x00\x00\x00\x0f^\xe4\b\x00\x00\x00\x00\x10\x98\xa9\b\x00\x00\x00\x00\x11>\xc6\b\x00\x00\x00\x00\x12" +
-	"x\x8b\b\x00\x00\x00\x00\x13\x1e\xa8\b\x00\x00\x00\x00\x14Xm\b\x00\x00\x00\x00\x14\xfe\x8a\b\x00\x00\x00\x00\x168O\b\x00\x00\x00\x00\x17\f\x90\x88\x00\x00\x00\x00\x18!k\x88\x00\x00\x00\x00\x18Lj\x88\x00" +
-	"\x00\x00\x00\x1a\x01M\x88\x00\x00\x00\x00\x1a\xa7j\x88\x00\x00\x00\x00\x1b\xe1/\x88\x00\x00\x00\x00\x1c\x87L\x88\x00\x00\x00\x00\x1d\xc1\x11\x88\x00\x00\x00\x00\x1ey\xa3\x88\x00\x00\x00\x00\x1f\x97\xb9\b\x00\x00\x00\x00 " +
-	"Y\x85\x88\x00\x00\x00\x00!\x80Ո\x00\x00\x00\x00\"B\xa2\b\x00\x00\x00\x00#i\xf2\b\x00\x00\x00\x00$\"\x84\b\x00\x00\x00\x00%I\xd4\b\x00\x00\x00\x00%\xef\xf1\b\x00\x00\x00\x00')\xb6\b\x00" +
-	"\x00\x00\x00'\xcf\xd3\b\x00\x00\x00\x00)\t\x98\b\x00\x00\x00\x00)\xaf\xb5\b\x00\x00\x00\x00*\xe9z\b\x00\x00\x00\x00+\x98ш\x00\x00\x00\x00,Җ\x88\x00\x00\x00\x00-x\xb3\x88\x00\x00\x00\x00." +
-	"\xb2x\x88\x00\x00\x00\x00/X\x95\x88\x00\x00\x00\x000\x92Z\x88\x00\x00\x00\x001]a\x88\x00\x00\x00\x002r<\x88\x00\x00\x00\x003=C\x88\x00\x00\x00\x004R\x1e\x88\x00\x00\x00\x005\x1d%\x88\x00" +
-	"\x00\x00\x0062\x00\x88\x00\x00\x00\x006\xfd\a\x88\x00\x00\x00\x008\x1b\x1d\b\x00\x00\x00\x008\xdc\xe9\x88\x00\x00\x00\x009\xfa\xff\b\x00\x00\x00\x00:\xbcˈ\x00\x00\x00\x00;\xda\xe1\b\x00\x00\x00\x00<" +
-	"\xa5\xe8\b\x00\x00\x00\x00=\xba\xc3\b\x00\x00\x00\x00>\x85\xca\b\x00\x00\x00\x00?\x9a\xa5\b\x00\x00\x00\x00@e\xac\b\x00\x00\x00\x00A\x83\xc1\x88\x00\x00\x00\x00BE\x8e\b\x00\x00\x00\x00Cc\xa3\x88\x00" +
-	"\x00\x00\x00D.\xaa\x88\x00\x00\x00\x00EC\x85\x88\x00\x00\x00\x00F\x05R\b\x00\x00\x00\x00G#g\x88\x00\x00\x00\x00G\xf7\xa9\b\x01\x02\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04" +
-	"\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04" +
-	"\x03\x04\x03\x04\x00\x00\x84\x9c\x00\x00\x00\x00\x8c\xa0\x00\x04\x00\x00~\x90\x00\t\x00\x00\x93\xa8\x01\x0e\x00\x00\x85\x98\x00\tLMT\x00AEST\x00ACST\x00ACDT\x00\nACST-9" +
-	":30ACDT,M10.1.0,M4.1.0/3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00g\xf5K\x89\xa2\x01\x00\x00\xa2\x01\x00\x00\v\x00\x00\x00Brazi" +
-	"l/AcreTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZi" +
-	"f2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1f\x00\x00\x00\x04\x00\x00\x00\f\xff\xff\xff\xff\x96\xaa\x86\x90\xff\xff\xff\xff\xb8\x0ff\x00\xff\xff\xff" +
-	"\xff\xb8\xfd\\\xc0\xff\xff\xff\xff\xb9\xf1PP\xff\xff\xff\xff\xbaސ@\xff\xff\xff\xff\xda8\xcaP\xff\xff\xff\xff\xda\xec\x16P\xff\xff\xff\xff\xdc\x19\xfd\xd0\xff\xff\xff\xffܹu@\xff\xff\xff\xff\xdd\xfb1" +
-	"P\xff\xff\xff\xffޛ\xfa@\xff\xff\xff\xff\xdfݶP\xff\xff\xff\xff\xe0TO@\xff\xff\xff\xff\xf4\x98\x1b\xd0\xff\xff\xff\xff\xf5\x05z@\xff\xff\xff\xff\xf6\xc0\x80P\xff\xff\xff\xff\xf7\x0e:\xc0\xff\xff\xff" +
-	"\xff\xf8QHP\xff\xff\xff\xff\xf8\xc7\xe1@\xff\xff\xff\xff\xfa\n\xee\xd0\xff\xff\xff\xff\xfa\xa9\x14\xc0\xff\xff\xff\xff\xfb\xec\"P\xff\xff\xff\xff\xfc\x8b\x99\xc0\x00\x00\x00\x00\x1dɪP\x00\x00\x00\x00\x1ex\xf3" +
-	"\xc0\x00\x00\x00\x00\x1f\xa0Q\xd0\x00\x00\x00\x00 3\xeb\xc0\x00\x00\x00\x00!\x81\x85P\x00\x00\x00\x00\"\v\xe4\xc0\x00\x00\x00\x00H`\x7fP\x00\x00\x00\x00R\x7f\x04\xc0\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x03\x02\xff\xff\xc0p\x00\x00\xff\xff\xc7\xc0\x01\x04\xff\xff\xb9\xb0\x00\b\xff\xff\xc7\xc0\x00\x04LMT\x00-04\x00-05\x00\n<-0" +
-	"5>5\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb7-2f\xe4\x01\x00\x00\xe4\x01\x00\x00\x10\x00\x00\x00Brazil/DeNoronhaTZif2\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\x00\x00\x00\x03\x00\x00\x00\f\xff\xff\xff\xff\x96\xaaed\xff\xff\xff\xff\xb8\x0f;\xd0\xff\xff\xff\xff\xb8\xfd2\x90\xff\xff\xff\xff\xb9\xf1& \xff\xff\xff" +
-	"\xff\xba\xdef\x10\xff\xff\xff\xff\xda8\xa0 \xff\xff\xff\xff\xda\xeb\xec \xff\xff\xff\xff\xdc\x19Ӡ\xff\xff\xff\xffܹK\x10\xff\xff\xff\xff\xdd\xfb\a \xff\xff\xff\xffޛ\xd0\x10\xff\xff\xff\xff\xdf\u074c" +
-	" \xff\xff\xff\xff\xe0T%\x10\xff\xff\xff\xff\xf4\x97\xf1\xa0\xff\xff\xff\xff\xf5\x05P\x10\xff\xff\xff\xff\xf6\xc0V \xff\xff\xff\xff\xf7\x0e\x10\x90\xff\xff\xff\xff\xf8Q\x1e \xff\xff\xff\xff\xf8Ƿ\x10\xff\xff\xff" +
-	"\xff\xfa\nĠ\xff\xff\xff\xff\xfa\xa8\xea\x90\xff\xff\xff\xff\xfb\xeb\xf8 \xff\xff\xff\xff\xfc\x8bo\x90\x00\x00\x00\x00\x1dɀ \x00\x00\x00\x00\x1exɐ\x00\x00\x00\x00\x1f\xa0'\xa0\x00\x00\x00\x00 3\xc1" +
-	"\x90\x00\x00\x00\x00!\x81[ \x00\x00\x00\x00\"\v\xba\x90\x00\x00\x00\x00#X\x02\xa0\x00\x00\x00\x00#\xe2b\x10\x00\x00\x00\x00%7\xe4\xa0\x00\x00\x00\x00%Թ\x10\x00\x00\x00\x007\xf6\xb8\xa0\x00\x00\x00" +
-	"\x008\xb8w\x10\x00\x00\x00\x009\xdf\xd5 \x00\x00\x00\x009\xe9\x01\x90\x00\x00\x00\x00;\xc8\xf1\xa0\x00\x00\x00\x00<o\x00\x90\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\xff\xff\xe1\x9c\x00\x00\xff\xff\xf1\xf0\x01\x04\xff\xff\xe3\xe0\x00\bLMT\x00-01\x00-02\x00\n<-02>2\nPK\x03\x04\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x9d?\xdfڸ\x03\x00\x00\xb8\x03\x00\x00\v\x00\x00\x00Brazil/EastTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00[\x00\x00\x00\x03\x00\x00\x00\f\xff\xff\xff\xff\x96\xaar\xb4\xff\xff\xff\xff\xb8\x0fI\xe0\xff\xff\xff\xff\xb8\xfd@\xa0\xff\xff\xff\xff\xb9\xf140\xff\xff\xff\xff\xba\xdet \xff\xff\xff\xff\xda8\xae0\xff\xff" +
-	"\xff\xff\xda\xeb\xfa0\xff\xff\xff\xff\xdc\x19\xe1\xb0\xff\xff\xff\xffܹY \xff\xff\xff\xff\xdd\xfb\x150\xff\xff\xff\xffޛ\xde \xff\xff\xff\xff\xdfݚ0\xff\xff\xff\xff\xe0T3 \xff\xff\xff\xff\xf4Z" +
-	"\t0\xff\xff\xff\xff\xf5\x05^ \xff\xff\xff\xff\xf6\xc0d0\xff\xff\xff\xff\xf7\x0e\x1e\xa0\xff\xff\xff\xff\xf8Q,0\xff\xff\xff\xff\xf8\xc7\xc5 \xff\xff\xff\xff\xfa\nҰ\xff\xff\xff\xff\xfa\xa8\xf8\xa0\xff\xff" +
-	"\xff\xff\xfb\xec\x060\xff\xff\xff\xff\xfc\x8b}\xa0\x00\x00\x00\x00\x1dɎ0\x00\x00\x00\x00\x1exנ\x00\x00\x00\x00\x1f\xa05\xb0\x00\x00\x00\x00 3Ϡ\x00\x00\x00\x00!\x81i0\x00\x00\x00\x00\"\v" +
-	"Ƞ\x00\x00\x00\x00#X\x10\xb0\x00\x00\x00\x00#\xe2p \x00\x00\x00\x00%7\xf2\xb0\x00\x00\x00\x00%\xd4\xc7 \x00\x00\x00\x00'!\x0f0\x00\x00\x00\x00'\xbd\xe3\xa0\x00\x00\x00\x00)\x00\xf10\x00\x00" +
-	"\x00\x00)\x94\x8b \x00\x00\x00\x00*\xea\r\xb0\x00\x00\x00\x00+k2\xa0\x00\x00\x00\x00,\xc0\xb50\x00\x00\x00\x00-f\xc4 \x00\x00\x00\x00.\xa0\x970\x00\x00\x00\x00/F\xa6 \x00\x00\x00\x000\x80" +
-	"y0\x00\x00\x00\x001\x1dM\xa0\x00\x00\x00\x002W \xb0\x00\x00\x00\x003\x06j \x00\x00\x00\x0048T0\x00\x00\x00\x004\xf8\xc1 \x00\x00\x00\x006 \x1f0\x00\x00\x00\x006\xcfh\xa0\x00\x00" +
-	"\x00\x007\xf6ư\x00\x00\x00\x008\xb8\x85 \x00\x00\x00\x009\xdf\xe30\x00\x00\x00\x00:\x8f,\xa0\x00\x00\x00\x00;\xc8\xff\xb0\x00\x00\x00\x00<o\x0e\xa0\x00\x00\x00\x00=đ0\x00\x00\x00\x00>N" +
-	"\xf0\xa0\x00\x00\x00\x00?\x91\xfe0\x00\x00\x00\x00@.Ҡ\x00\x00\x00\x00A\x86\xf80\x00\x00\x00\x00B\x17\xef \x00\x00\x00\x00CQ\xc20\x00\x00\x00\x00C\xf7\xd1 \x00\x00\x00\x00EMS\xb0\x00\x00" +
-	"\x00\x00E\xe0\xed\xa0\x00\x00\x00\x00G\x11\x860\x00\x00\x00\x00G\xb7\x95 \x00\x00\x00\x00H\xfa\xa2\xb0\x00\x00\x00\x00I\x97w \x00\x00\x00\x00Jڄ\xb0\x00\x00\x00\x00K\x80\x93\xa0\x00\x00\x00\x00L\xba" +
-	"f\xb0\x00\x00\x00\x00M`u\xa0\x00\x00\x00\x00N\x9aH\xb0\x00\x00\x00\x00OI\x92 \x00\x00\x00\x00P\x83e0\x00\x00\x00\x00Q 9\xa0\x00\x00\x00\x00RcG0\x00\x00\x00\x00S\x00\x1b\xa0\x00\x00" +
-	"\x00\x00TC)0\x00\x00\x00\x00T\xe98 \x00\x00\x00\x00V#\v0\x00\x00\x00\x00V\xc9\x1a \x00\x00\x00\x00X\x02\xed0\x00\x00\x00\x00X\xa8\xfc \x00\x00\x00\x00Y\xe2\xcf0\x00\x00\x00\x00Z\x88" +
-	"\xde \x00\x00\x00\x00[\xde`\xb0\x00\x00\x00\x00\\h\xc0 \x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\xff\xff\xd4L\x00\x00\xff\xff\xe3\xe0\x01" +
-	"\x04\xff\xff\xd5\xd0\x00\bLMT\x00-02\x00-03\x00\n<-03>3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00a\xcb'\xe9\x9c\x01\x00\x00\x9c\x01\x00\x00\v\x00\x00\x00Bra" +
-	"zil/WestTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00T" +
-	"Zif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1f\x00\x00\x00\x03\x00\x00\x00\f\xff\xff\xff\xff\x96\xaa\x7fD\xff\xff\xff\xff\xb8\x0fW\xf0\xff" +
-	"\xff\xff\xff\xb8\xfdN\xb0\xff\xff\xff\xff\xb9\xf1B@\xff\xff\xff\xff\xbaނ0\xff\xff\xff\xff\xda8\xbc@\xff\xff\xff\xff\xda\xec\b@\xff\xff\xff\xff\xdc\x19\xef\xc0\xff\xff\xff\xffܹg0\xff\xff\xff\xff\xdd" +
-	"\xfb#@\xff\xff\xff\xffޛ\xec0\xff\xff\xff\xff\xdfݨ@\xff\xff\xff\xff\xe0TA0\xff\xff\xff\xff\xf4\x98\r\xc0\xff\xff\xff\xff\xf5\x05l0\xff\xff\xff\xff\xf6\xc0r@\xff\xff\xff\xff\xf7\x0e,\xb0\xff" +
-	"\xff\xff\xff\xf8Q:@\xff\xff\xff\xff\xf8\xc7\xd30\xff\xff\xff\xff\xfa\n\xe0\xc0\xff\xff\xff\xff\xfa\xa9\x06\xb0\xff\xff\xff\xff\xfb\xec\x14@\xff\xff\xff\xff\xfc\x8b\x8b\xb0\x00\x00\x00\x00\x1dɜ@\x00\x00\x00\x00\x1e" +
-	"x\xe5\xb0\x00\x00\x00\x00\x1f\xa0C\xc0\x00\x00\x00\x00 3ݰ\x00\x00\x00\x00!\x81w@\x00\x00\x00\x00\"\vְ\x00\x00\x00\x00,\xc0\xc3@\x00\x00\x00\x00-f\xd20\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\xff\xffǼ\x00\x00\xff\xff\xd5\xd0\x01\x04\xff\xff\xc7\xc0\x00\bLMT\x00-03\x00-04\x00\n<-04>4\n" +
-	"PK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6\x9aM\xbem\x02\x00\x00m\x02\x00\x00\x03\x00\x00\x00CETTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x005" +
-	"\x00\x00\x00\x02\x00\x00\x00\t\xff\xff\xff\xff\x9b\f\x17`\xff\xff\xff\xff\x9b\xd5\xda\xf0\xff\xff\xff\xff\x9cٮ\x90\xff\xff\xff\xff\x9d\xa4\xb5\x90\xff\xff\xff\xff\x9e\xb9\x90\x90\xff\xff\xff\xff\x9f\x84\x97\x90\xff\xff\xff\xff" +
-	"\xc8\tq\x90\xff\xff\xff\xff\xcc\xe7K\x10\xff\xff\xff\xffͩ\x17\x90\xff\xff\xff\xff\u03a2C\x10\xff\xff\xff\xffϒ4\x10\xff\xff\xff\xffЂ%\x10\xff\xff\xff\xff\xd1r\x16\x10\xff\xff\xff\xff\xd2N@\x90" +
-	"\x00\x00\x00\x00\r\xa4c\x90\x00\x00\x00\x00\x0e\x8b\x1a\x10\x00\x00\x00\x00\x0f\x84E\x90\x00\x00\x00\x00\x10t6\x90\x00\x00\x00\x00\x11d'\x90\x00\x00\x00\x00\x12T\x18\x90\x00\x00\x00\x00\x13MD\x10\x00\x00\x00\x00" +
-	"\x143\xfa\x90\x00\x00\x00\x00\x15#\xeb\x90\x00\x00\x00\x00\x16\x13ܐ\x00\x00\x00\x00\x17\x03͐\x00\x00\x00\x00\x17\xf3\xbe\x90\x00\x00\x00\x00\x18㯐\x00\x00\x00\x00\x19Ӡ\x90\x00\x00\x00\x00\x1aÑ\x90" +
-	"\x00\x00\x00\x00\x1b\xbc\xbd\x10\x00\x00\x00\x00\x1c\xac\xae\x10\x00\x00\x00\x00\x1d\x9c\x9f\x10\x00\x00\x00\x00\x1e\x8c\x90\x10\x00\x00\x00\x00\x1f|\x81\x10\x00\x00\x00\x00 lr\x10\x00\x00\x00\x00!\\c\x10\x00\x00\x00\x00" +
-	"\"LT\x10\x00\x00\x00\x00#<E\x10\x00\x00\x00\x00$,6\x10\x00\x00\x00\x00%\x1c'\x10\x00\x00\x00\x00&\f\x18\x10\x00\x00\x00\x00'\x05C\x90\x00\x00\x00\x00'\xf54\x90\x00\x00\x00\x00(\xe5%\x90" +
-	"\x00\x00\x00\x00)\xd5\x16\x90\x00\x00\x00\x00*\xc5\a\x90\x00\x00\x00\x00+\xb4\xf8\x90\x00\x00\x00\x00,\xa4\xe9\x90\x00\x00\x00\x00-\x94ڐ\x00\x00\x00\x00.\x84ː\x00\x00\x00\x00/t\xbc\x90\x00\x00\x00\x00" +
-	"0d\xad\x90\x00\x00\x00\x001]\xd9\x10\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00" +
-	"\x01\x00\x01\x00\x01\x00\x00\x0e\x10\x00\x05\x00\x00\x1c \x01\x00CEST\x00CET\x00\nCET-1CEST,M3.5.0,M10.5.0/3\nPK\x03\x04\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00<\x8b\x99\x1e\xb7\x03\x00\x00\xb7\x03\x00\x00\a\x00\x00\x00CST6CDTTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00X\x00\x00" +
-	"\x00\x04\x00\x00\x00\x10\xff\xff\xff\xff\x9e\xa6,\x80\xff\xff\xff\xff\x9f\xba\xf9p\xff\xff\xff\xff\xa0\x86\x0e\x80\xff\xff\xff\xff\xa1\x9a\xdbp\xff\xff\xff\xffˈ\xfe\x80\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2a" +
-	"\t\xf0\xff\xff\xff\xff\xfa\xf8g\x00\xff\xff\xff\xff\xfb\xe8I\xf0\xff\xff\xff\xff\xfc\xd8I\x00\xff\xff\xff\xff\xfd\xc8+\xf0\xff\xff\xff\xff\xfe\xb8+\x00\xff\xff\xff\xff\xff\xa8\r\xf0\x00\x00\x00\x00\x00\x98\r\x00\x00\x00" +
-	"\x00\x00\x01\x87\xef\xf0\x00\x00\x00\x00\x02w\xef\x00\x00\x00\x00\x00\x03q\fp\x00\x00\x00\x00\x04a\v\x80\x00\x00\x00\x00\x05P\xeep\x00\x00\x00\x00\x06@\xed\x80\x00\x00\x00\x00\a0\xd0p\x00\x00\x00\x00\a\x8d" +
-	"'\x80\x00\x00\x00\x00\t\x10\xb2p\x00\x00\x00\x00\t\xad\xa3\x00\x00\x00\x00\x00\n\xf0\x94p\x00\x00\x00\x00\v\xe0\x93\x80\x00\x00\x00\x00\fٰ\xf0\x00\x00\x00\x00\r\xc0u\x80\x00\x00\x00\x00\x0e\xb9\x92\xf0\x00\x00" +
-	"\x00\x00\x0f\xa9\x92\x00\x00\x00\x00\x00\x10\x99t\xf0\x00\x00\x00\x00\x11\x89t\x00\x00\x00\x00\x00\x12yV\xf0\x00\x00\x00\x00\x13iV\x00\x00\x00\x00\x00\x14Y8\xf0\x00\x00\x00\x00\x15I8\x00\x00\x00\x00\x00\x169" +
-	"\x1a\xf0\x00\x00\x00\x00\x17)\x1a\x00\x00\x00\x00\x00\x18\"7p\x00\x00\x00\x00\x19\b\xfc\x00\x00\x00\x00\x00\x1a\x02\x19p\x00\x00\x00\x00\x1a\xf2\x18\x80\x00\x00\x00\x00\x1b\xe1\xfbp\x00\x00\x00\x00\x1c\xd1\xfa\x80\x00\x00" +
-	"\x00\x00\x1d\xc1\xddp\x00\x00\x00\x00\x1e\xb1܀\x00\x00\x00\x00\x1f\xa1\xbfp\x00\x00\x00\x00 v\x0f\x00\x00\x00\x00\x00!\x81\xa1p\x00\x00\x00\x00\"U\xf1\x00\x00\x00\x00\x00#j\xbd\xf0\x00\x00\x00\x00$5" +
-	"\xd3\x00\x00\x00\x00\x00%J\x9f\xf0\x00\x00\x00\x00&\x15\xb5\x00\x00\x00\x00\x00'*\x81\xf0\x00\x00\x00\x00'\xfeр\x00\x00\x00\x00)\nc\xf0\x00\x00\x00\x00)\u07b3\x80\x00\x00\x00\x00*\xeaE\xf0\x00\x00" +
-	"\x00\x00+\xbe\x95\x80\x00\x00\x00\x00,\xd3bp\x00\x00\x00\x00-\x9ew\x80\x00\x00\x00\x00.\xb3Dp\x00\x00\x00\x00/~Y\x80\x00\x00\x00\x000\x93&p\x00\x00\x00\x001gv\x00\x00\x00\x00\x002s" +
-	"\bp\x00\x00\x00\x003GX\x00\x00\x00\x00\x004R\xeap\x00\x00\x00\x005':\x00\x00\x00\x00\x0062\xccp\x00\x00\x00\x007\a\x1c\x00\x00\x00\x00\x008\x1b\xe8\xf0\x00\x00\x00\x008\xe6\xfe\x00\x00\x00" +
-	"\x00\x009\xfb\xca\xf0\x00\x00\x00\x00:\xc6\xe0\x00\x00\x00\x00\x00;۬\xf0\x00\x00\x00\x00<\xaf\xfc\x80\x00\x00\x00\x00=\xbb\x8e\xf0\x00\x00\x00\x00>\x8fހ\x00\x00\x00\x00?\x9bp\xf0\x00\x00\x00\x00@o" +
-	"\xc0\x80\x00\x00\x00\x00A\x84\x8dp\x00\x00\x00\x00BO\xa2\x80\x00\x00\x00\x00Cdop\x00\x00\x00\x00D/\x84\x80\x00\x00\x00\x00EDQp\x00\x00\x00\x00E\xf3\xb7\x00\x01\x00\x01\x00\x02\x03\x00\x01\x00\x01" +
-	"\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01" +
-	"\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\xff\xff\xab\xa0\x00\x04\xff\xff\xb9\xb0\x01\x00\xff\xff\xb9\xb0\x01\b\xff\xff\xb9\xb0\x01\fCDT\x00CST\x00CWT\x00CPT\x00\nC" +
-	"ST6CDT,M3.2.0,M11.1.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00):\x17-\x88\x06\x00\x00\x88\x06\x00\x00\x0f\x00\x00\x00Canada/A" +
-	"tlanticTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZ" +
-	"if2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa7\x00\x00\x00\x05\x00\x00\x00\x14\xff\xff\xff\xff\x80\xf1\xab\xa0\xff\xff\xff\xff\x9a\xe4\xde\xc0\xff\xff" +
-	"\xff\xff\x9b\xd6\x130\xff\xff\xff\xff\x9e\xb8\x85`\xff\xff\xff\xff\x9f\xba\xddP\xff\xff\xff\xff\xa2\x9d\x17@\xff\xff\xff\xff\xa30\xb10\xff\xff\xff\xff\xa4zV@\xff\xff\xff\xff\xa5\x1b\x1f0\xff\xff\xff\xff\xa6S" +
-	"\xa0\xc0\xff\xff\xff\xff\xa6\xfcR\xb0\xff\xff\xff\xff\xa8<\xbd@\xff\xff\xff\xff\xa8\xdc4\xb0\xff\xff\xff\xff\xaa\x1c\x9f@\xff\xff\xff\xff\xaa\xcd:0\xff\xff\xff\xff\xab\xfc\x81@\xff\xff\xff\xff\xac\xbf\x910\xff\xff" +
-	"\xff\xff\xad\xee\xd8@\xff\xff\xff\xff\xae\x8c\xfe0\xff\xff\xff\xff\xaf\xbcE@\xff\xff\xff\xff\xb0\x7fU0\xff\xff\xff\xff\xb1\xae\x9c@\xff\xff\xff\xff\xb2Kp\xb0\xff\xff\xff\xff\xb3\x8e~@\xff\xff\xff\xff\xb4$" +
-	"\xbb0\xff\xff\xff\xff\xb5n`@\xff\xff\xff\xff\xb6\x15\xc0\xb0\xff\xff\xff\xff\xb7NB@\xff\xff\xff\xff\xb8\b\x17\xb0\xff\xff\xff\xff\xb9$\xe9\xc0\xff\xff\xff\xff\xb9\xe7\xf9\xb0\xff\xff\xff\xff\xbb\x04\xcb\xc0\xff\xff" +
-	"\xff\xff\xbb\xd1\x160\xff\xff\xff\xff\xbd\x00]@\xff\xff\xff\xff\xbd\x9d1\xb0\xff\xff\xff\xff\xbe\xf2\xb4@\xff\xff\xff\xff\xbf\x90\xda0\xff\xff\xff\xff\xc0\xd3\xe7\xc0\xff\xff\xff\xff\xc1^G0\xff\xff\xff\xff\u008d" +
-	"\x8e@\xff\xff\xff\xff\xc3P\x9e0\xff\xff\xff\xff\xc4mp@\xff\xff\xff\xff\xc50\x800\xff\xff\xff\xff\xc6r<@\xff\xff\xff\xff\xc7\x10b0\xff\xff\xff\xff\xc86n\xc0\xff\xff\xff\xff\xc8\xf9~\xb0\xff\xff" +
-	"\xff\xff\xca\x16P\xc0\xff\xff\xff\xff\xca\xd9`\xb0\xff\xff\xff\xffˈ\xe2`\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2`\xed\xd0\xff\xff\xff\xff\xd3u\xd6\xe0\xff\xff\xff\xff\xd4@\xcf\xd0\xff\xff\xff\xff\xd5U" +
-	"\xb8\xe0\xff\xff\xff\xff\xd6 \xb1\xd0\xff\xff\xff\xff\xd75\x9a\xe0\xff\xff\xff\xff\xd8\x00\x93\xd0\xff\xff\xff\xff\xd9\x15|\xe0\xff\xff\xff\xff\xd9\xe0u\xd0\xff\xff\xff\xff\xdc\xde{`\xff\xff\xff\xffݩtP\xff\xff" +
-	"\xff\xff\u07be]`\xff\xff\xff\xff߉VP\xff\xff\xff\xff\xe0\x9e?`\xff\xff\xff\xff\xe1i8P\xff\xff\xff\xff\xe2~!`\xff\xff\xff\xff\xe3I\x1aP\xff\xff\xff\xff\xe6G\x1f\xe0\xff\xff\xff\xff\xe7\x12" +
-	"\x18\xd0\xff\xff\xff\xff\xe8'\x01\xe0\xff\xff\xff\xff\xe8\xf1\xfa\xd0\xff\xff\xff\xff\xea\x06\xe3\xe0\xff\xff\xff\xff\xea\xd1\xdc\xd0\xff\xff\xff\xff\xeb\xe6\xc5\xe0\xff\xff\xff\xff챾\xd0\xff\xff\xff\xff\xf1\x8f\xa6`\xff\xff" +
-	"\xff\xff\xf2\x7f\x89P\xff\xff\xff\xff\xf3o\x88`\xff\xff\xff\xff\xf4_kP\xff\xff\xff\xff\xf5Oj`\xff\xff\xff\xff\xf6?MP\xff\xff\xff\xff\xf7/L`\xff\xff\xff\xff\xf8(i\xd0\xff\xff\xff\xff\xf9\x0f" +
-	".`\xff\xff\xff\xff\xfa\bK\xd0\xff\xff\xff\xff\xfa\xf8J\xe0\xff\xff\xff\xff\xfb\xe8-\xd0\xff\xff\xff\xff\xfc\xd8,\xe0\xff\xff\xff\xff\xfd\xc8\x0f\xd0\xff\xff\xff\xff\xfe\xb8\x0e\xe0\xff\xff\xff\xff\xff\xa7\xf1\xd0\x00\x00" +
-	"\x00\x00\x00\x97\xf0\xe0\x00\x00\x00\x00\x01\x87\xd3\xd0\x00\x00\x00\x00\x02w\xd2\xe0\x00\x00\x00\x00\x03p\xf0P\x00\x00\x00\x00\x04`\xef`\x00\x00\x00\x00\x05P\xd2P\x00\x00\x00\x00\x06@\xd1`\x00\x00\x00\x00\a0" +
-	"\xb4P\x00\x00\x00\x00\b \xb3`\x00\x00\x00\x00\t\x10\x96P\x00\x00\x00\x00\n\x00\x95`\x00\x00\x00\x00\n\xf0xP\x00\x00\x00\x00\v\xe0w`\x00\x00\x00\x00\fٔ\xd0\x00\x00\x00\x00\r\xc0Y`\x00\x00" +
-	"\x00\x00\x0e\xb9v\xd0\x00\x00\x00\x00\x0f\xa9u\xe0\x00\x00\x00\x00\x10\x99X\xd0\x00\x00\x00\x00\x11\x89W\xe0\x00\x00\x00\x00\x12y:\xd0\x00\x00\x00\x00\x13i9\xe0\x00\x00\x00\x00\x14Y\x1c\xd0\x00\x00\x00\x00\x15I" +
-	"\x1b\xe0\x00\x00\x00\x00\x168\xfe\xd0\x00\x00\x00\x00\x17(\xfd\xe0\x00\x00\x00\x00\x18\"\x1bP\x00\x00\x00\x00\x19\b\xdf\xe0\x00\x00\x00\x00\x1a\x01\xfdP\x00\x00\x00\x00\x1a\xf1\xfc`\x00\x00\x00\x00\x1b\xe1\xdfP\x00\x00" +
-	"\x00\x00\x1c\xd1\xde`\x00\x00\x00\x00\x1d\xc1\xc1P\x00\x00\x00\x00\x1e\xb1\xc0`\x00\x00\x00\x00\x1f\xa1\xa3P\x00\x00\x00\x00 u\xf2\xe0\x00\x00\x00\x00!\x81\x85P\x00\x00\x00\x00\"U\xd4\xe0\x00\x00\x00\x00#j" +
-	"\xa1\xd0\x00\x00\x00\x00$5\xb6\xe0\x00\x00\x00\x00%J\x83\xd0\x00\x00\x00\x00&\x15\x98\xe0\x00\x00\x00\x00'*e\xd0\x00\x00\x00\x00'\xfe\xb5`\x00\x00\x00\x00)\nG\xd0\x00\x00\x00\x00)ޗ`\x00\x00" +
-	"\x00\x00*\xea)\xd0\x00\x00\x00\x00+\xbey`\x00\x00\x00\x00,\xd3FP\x00\x00\x00\x00-\x9e[`\x00\x00\x00\x00.\xb3(P\x00\x00\x00\x00/~=`\x00\x00\x00\x000\x93\nP\x00\x00\x00\x001g" +
-	"Y\xe0\x00\x00\x00\x002r\xecP\x00\x00\x00\x003G;\xe0\x00\x00\x00\x004R\xceP\x00\x00\x00\x005'\x1d\xe0\x00\x00\x00\x0062\xb0P\x00\x00\x00\x007\x06\xff\xe0\x00\x00\x00\x008\x1b\xcc\xd0\x00\x00" +
-	"\x00\x008\xe6\xe1\xe0\x00\x00\x00\x009\xfb\xae\xd0\x00\x00\x00\x00:\xc6\xc3\xe0\x00\x00\x00\x00;ې\xd0\x00\x00\x00\x00<\xaf\xe0`\x00\x00\x00\x00=\xbbr\xd0\x00\x00\x00\x00>\x8f\xc2`\x00\x00\x00\x00?\x9b" +
-	"T\xd0\x00\x00\x00\x00@o\xa4`\x00\x00\x00\x00A\x84qP\x00\x00\x00\x00BO\x86`\x00\x00\x00\x00CdSP\x00\x00\x00\x00D/h`\x00\x00\x00\x00ED5P\x00\x00\x00\x00E\xf3\x9a\xe0\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x03\x04\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\xff\xff\xc4`\x00\x00\xff\xff\xd5\xd0\x01\x04\xff\xff\xc7" +
-	"\xc0\x00\b\xff\xff\xd5\xd0\x01\f\xff\xff\xd5\xd0\x01\x10LMT\x00ADT\x00AST\x00AWT\x00APT\x00\nAST4ADT,M3.2.0,M11.1.0\nP" +
-	"K\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?_p\x99\x0e\x05\x00\x00\x0e\x05\x00\x00\x0e\x00\x00\x00Canada/CentralTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00}\x00\x00\x00\x05\x00\x00\x00\x14\xff\xff\xff\xffd䰔\xff\xff\xff\xff\x9b\x01\xfb\xe0\xff\xff\xff\xff\x9búP\xff\xff\xff\xff\x9e\xb8\xa1\x80\xff\xff\xff\xff\x9f\xba\xf9p\xff\xff" +
-	"\xff\xff\u00a0;\x80\xff\xff\xff\xff\xc3O\x84\xf0\xff\xff\xff\xffˈ\xfe\x80\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2a\t\xf0\xff\xff\xff\xffӈh\x00\xff\xff\xff\xff\xd4S`\xf0\xff\xff\xff\xff\xd5U" +
-	"\xd5\x00\xff\xff\xff\xff\xd6 \xcd\xf0\xff\xff\xff\xff\xd75\xb7\x00\xff\xff\xff\xff\xd8\x00\xaf\xf0\xff\xff\xff\xff\xd9\x15\x99\x00\xff\xff\xff\xff\xd9\xe0\x91\xf0\xff\xff\xff\xff\xdb\x00\a\x00\xff\xff\xff\xff\xdb\xc8\\\xf0\xff\xff" +
-	"\xff\xff\xdcޗ\x80\xff\xff\xff\xffݩ\x90p\xff\xff\xff\xff\u07bey\x80\xff\xff\xff\xff߉rp\xff\xff\xff\xff\xe0\x9e[\x80\xff\xff\xff\xff\xe1iTp\xff\xff\xff\xff\xe2~=\x80\xff\xff\xff\xff\xe3I" +
-	"6p\xff\xff\xff\xff\xe4^\x1f\x80\xff\xff\xff\xff\xe5)\x18p\xff\xff\xff\xff\xe6G<\x00\xff\xff\xff\xff\xe7\x124\xf0\xff\xff\xff\xff\xe8'\x1e\x00\xff\xff\xff\xff\xe8\xf2\x16\xf0\xff\xff\xff\xff\xea\a\x00\x00\xff\xff" +
-	"\xff\xff\xea\xd1\xf8\xf0\xff\xff\xff\xff\xeb\xe6\xe2\x00\xff\xff\xff\xff\xec\xd6\xc4\xf0\xff\xff\xff\xff\xed\xc6\xc4\x00\xff\xff\xff\xff\ue47c\xf0\xff\xff\xff\xff\xf3o\xa4\x80\xff\xff\xff\xff\xf41b\xf0\xff\xff\xff\xff\xf9\x0f" +
-	"J\x80\xff\xff\xff\xff\xfa\bv\x00\xff\xff\xff\xff\xfa\xf8g\x00\xff\xff\xff\xff\xfb\xe8X\x00\xff\xff\xff\xff\xfc\xd8I\x00\xff\xff\xff\xff\xfd\xc8:\x00\xff\xff\xff\xff\xfe\xb8+\x00\xff\xff\xff\xff\xff\xa8\x1c\x00\x00\x00" +
-	"\x00\x00\x00\x98\r\x00\x00\x00\x00\x00\x01\x87\xfe\x00\x00\x00\x00\x00\x02w\xef\x00\x00\x00\x00\x00\x03q\x1a\x80\x00\x00\x00\x00\x04a\v\x80\x00\x00\x00\x00\x05P\xfc\x80\x00\x00\x00\x00\x06@\xed\x80\x00\x00\x00\x00\a0" +
-	"ހ\x00\x00\x00\x00\b π\x00\x00\x00\x00\t\x10\xc0\x80\x00\x00\x00\x00\n\x00\xb1\x80\x00\x00\x00\x00\n\xf0\xa2\x80\x00\x00\x00\x00\v\xe0\x93\x80\x00\x00\x00\x00\fٿ\x00\x00\x00\x00\x00\r\xc0u\x80\x00\x00" +
-	"\x00\x00\x0e\xb9\xa1\x00\x00\x00\x00\x00\x0f\xa9\x92\x00\x00\x00\x00\x00\x10\x99\x83\x00\x00\x00\x00\x00\x11\x89t\x00\x00\x00\x00\x00\x12ye\x00\x00\x00\x00\x00\x13iV\x00\x00\x00\x00\x00\x14YG\x00\x00\x00\x00\x00\x15I" +
-	"8\x00\x00\x00\x00\x00\x169)\x00\x00\x00\x00\x00\x17)\x1a\x00\x00\x00\x00\x00\x18\"E\x80\x00\x00\x00\x00\x19\b\xfc\x00\x00\x00\x00\x00\x1a\x02'\x80\x00\x00\x00\x00\x1a\xf2\x18\x80\x00\x00\x00\x00\x1b\xe2\t\x80\x00\x00" +
-	"\x00\x00\x1c\xd1\xfa\x80\x00\x00\x00\x00\x1d\xc1\xeb\x80\x00\x00\x00\x00\x1e\xb1܀\x00\x00\x00\x00\x1f\xa1̀\x00\x00\x00\x00 v\x0f\x00\x00\x00\x00\x00!\x81\xaf\x80\x00\x00\x00\x00\"U\xf1\x00\x00\x00\x00\x00#j" +
-	"\xcc\x00\x00\x00\x00\x00$5\xd3\x00\x00\x00\x00\x00%J\xae\x00\x00\x00\x00\x00&\x15\xb5\x00\x00\x00\x00\x00'*\x90\x00\x00\x00\x00\x00'\xfeр\x00\x00\x00\x00)\nr\x00\x00\x00\x00\x00)\u07b3\x80\x00\x00" +
-	"\x00\x00*\xeaT\x00\x00\x00\x00\x00+\xbe\x95\x80\x00\x00\x00\x00,\xd3p\x80\x00\x00\x00\x00-\x9ew\x80\x00\x00\x00\x00.\xb3R\x80\x00\x00\x00\x00/~Y\x80\x00\x00\x00\x000\x934\x80\x00\x00\x00\x001g" +
-	"v\x00\x00\x00\x00\x002s\x16\x80\x00\x00\x00\x003GX\x00\x00\x00\x00\x004R\xf8\x80\x00\x00\x00\x005':\x00\x00\x00\x00\x0062ڀ\x00\x00\x00\x007\a\x1c\x00\x00\x00\x00\x008\x1b\xf7\x00\x00\x00" +
-	"\x00\x008\xe6\xfe\x00\x00\x00\x00\x009\xfb\xd9\x00\x00\x00\x00\x00:\xc6\xe0\x00\x00\x00\x00\x00;ۻ\x00\x00\x00\x00\x00<\xaf\xfc\x80\x00\x00\x00\x00=\xbb\x9d\x00\x00\x00\x00\x00>\x8fހ\x00\x00\x00\x00?\x9b" +
-	"\x7f\x00\x00\x00\x00\x00@o\xc0\x80\x00\x00\x00\x00A\x84\x9b\x80\x00\x00\x00\x00BO\xa2\x80\x00\x00\x00\x00Cd}\x80\x00\x00\x00\x00D/\x84\x80\x00\x00\x00\x00EDQp\x00\x00\x00\x00E\xf3\xb7\x00\x02\x01" +
-	"\x02\x01\x02\x01\x02\x03\x04\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\xff\xff\xa4\xec\x00\x00\xff\xff\xb9\xb0\x01\x04\xff\xff\xab\xa0\x00\b\xff\xff\xb9\xb0\x01\f\xff\xff\xb9\xb0\x01\x10LMT\x00CDT\x00CST\x00CWT\x00CPT\x00\nCST6CD" +
-	"T,M3.2.0,M11.1.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00ӿ\x92\xbc\xb5\x06\x00\x00\xb5\x06\x00\x00\x0e\x00\x00\x00Canada/Easter" +
-	"nTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xac\x00\x00\x00\x05\x00\x00\x00\x14\xff\xff\xff\xffr\xeex\xec\xff\xff\xff\xff\x9e\xb8\x93p\xff\xff\xff\xff\x9f\xba\xeb`" +
-	"\xff\xff\xff\xff\xa0\x87.\xc8\xff\xff\xff\xff\xa1\x9a\xb1@\xff\xff\xff\xff\xa2\x94\x06\xf0\xff\xff\xff\xff\xa3U\xa9@\xff\xff\xff\xff\xa4\x86]\xf0\xff\xff\xff\xff\xa5(x`\xff\xff\xff\xff\xa6f?\xf0\xff\xff\xff\xff" +
-	"\xa7\fN\xe0\xff\xff\xff\xff\xa8F!\xf0\xff\xff\xff\xff\xa8\xec0\xe0\xff\xff\xff\xff\xaa\x1c\xc9p\xff\xff\xff\xff\xaa\xd5M`\xff\xff\xff\xff\xab\xfc\xabp\xff\xff\xff\xff\xac\xb5/`\xff\xff\xff\xff\xad܍p" +
-	"\xff\xff\xff\xff\xae\x95\x11`\xff\xff\xff\xff\xaf\xbcop\xff\xff\xff\xff\xb0~-\xe0\xff\xff\xff\xff\xb1\x9cQp\xff\xff\xff\xff\xb2gJ`\xff\xff\xff\xff\xb3|3p\xff\xff\xff\xff\xb4G,`\xff\xff\xff\xff" +
-	"\xb5\\\x15p\xff\xff\xff\xff\xb6'\x0e`\xff\xff\xff\xff\xb7;\xf7p\xff\xff\xff\xff\xb8\x06\xf0`\xff\xff\xff\xff\xb9%\x13\xf0\xff\xff\xff\xff\xb9\xe6\xd2`\xff\xff\xff\xff\xbb\x04\xf5\xf0\xff\xff\xff\xff\xbb\xcf\xee\xe0" +
-	"\xff\xff\xff\xff\xbc\xe4\xd7\xf0\xff\xff\xff\xff\xbd\xaf\xd0\xe0\xff\xff\xff\xff\xbeĹ\xf0\xff\xff\xff\xff\xbf\x8f\xb2\xe0\xff\xff\xff\xff\xc0\xa4\x9b\xf0\xff\xff\xff\xff\xc1o\x94\xe0\xff\xff\xff\xff\u0084}\xf0\xff\xff\xff\xff" +
-	"\xc3Ov\xe0\xff\xff\xff\xff\xc4d_\xf0\xff\xff\xff\xff\xc5/X\xe0\xff\xff\xff\xff\xc6M|p\xff\xff\xff\xff\xc7\x0f:\xe0\xff\xff\xff\xff\xc8-^p\xff\xff\xff\xffˈ\xf0p\xff\xff\xff\xff\xd2#\xf4p" +
-	"\xff\xff\xff\xff\xd2`\xfb\xe0\xff\xff\xff\xff\xd3u\xe4\xf0\xff\xff\xff\xff\xd4@\xdd\xe0\xff\xff\xff\xff\xd5U\xaa\xd0\xff\xff\xff\xff\xd6 \xa3\xc0\xff\xff\xff\xff\xd75\x8c\xd0\xff\xff\xff\xff\xd8\x00\x85\xc0\xff\xff\xff\xff" +
-	"\xd9\x15n\xd0\xff\xff\xff\xff\xda3v@\xff\xff\xff\xff\xda\xfe\xa7p\xff\xff\xff\xff\xdc\x13t`\xff\xff\xff\xff\xdcމp\xff\xff\xff\xffݩ\x82`\xff\xff\xff\xff\u07bekp\xff\xff\xff\xff߉d`" +
-	"\xff\xff\xff\xff\xe0\x9eMp\xff\xff\xff\xff\xe1iF`\xff\xff\xff\xff\xe2~/p\xff\xff\xff\xff\xe3I(`\xff\xff\xff\xff\xe4^\x11p\xff\xff\xff\xff\xe5)\n`\xff\xff\xff\xff\xe6G-\xf0\xff\xff\xff\xff" +
-	"\xe7\x12&\xe0\xff\xff\xff\xff\xe8'\x0f\xf0\xff\xff\xff\xff\xe9\x16\xf2\xe0\xff\xff\xff\xff\xea\x06\xf1\xf0\xff\xff\xff\xff\xea\xf6\xd4\xe0\xff\xff\xff\xff\xeb\xe6\xd3\xf0\xff\xff\xff\xff\xecֶ\xe0\xff\xff\xff\xff\xedƵ\xf0" +
-	"\xff\xff\xff\xff\xee\xbf\xd3`\xff\xff\xff\xff\xef\xaf\xd2p\xff\xff\xff\xff\xf0\x9f\xb5`\xff\xff\xff\xff\xf1\x8f\xb4p\xff\xff\xff\xff\xf2\x7f\x97`\xff\xff\xff\xff\xf3o\x96p\xff\xff\xff\xff\xf4_y`\xff\xff\xff\xff" +
-	"\xf5Oxp\xff\xff\xff\xff\xf6?[`\xff\xff\xff\xff\xf7/Zp\xff\xff\xff\xff\xf8(w\xe0\xff\xff\xff\xff\xf9\x0f<p\xff\xff\xff\xff\xfa\bY\xe0\xff\xff\xff\xff\xfa\xf8X\xf0\xff\xff\xff\xff\xfb\xe8;\xe0" +
-	"\xff\xff\xff\xff\xfc\xd8:\xf0\xff\xff\xff\xff\xfd\xc8\x1d\xe0\xff\xff\xff\xff\xfe\xb8\x1c\xf0\xff\xff\xff\xff\xff\xa7\xff\xe0\x00\x00\x00\x00\x00\x97\xfe\xf0\x00\x00\x00\x00\x01\x87\xe1\xe0\x00\x00\x00\x00\x02w\xe0\xf0\x00\x00\x00\x00" +
-	"\x03p\xfe`\x00\x00\x00\x00\x04`\xfdp\x00\x00\x00\x00\x05P\xe0`\x00\x00\x00\x00\x06@\xdfp\x00\x00\x00\x00\a0\xc2`\x00\x00\x00\x00\b \xc1p\x00\x00\x00\x00\t\x10\xa4`\x00\x00\x00\x00\n\x00\xa3p" +
-	"\x00\x00\x00\x00\n\xf0\x86`\x00\x00\x00\x00\v\xe0\x85p\x00\x00\x00\x00\f٢\xe0\x00\x00\x00\x00\r\xc0gp\x00\x00\x00\x00\x0e\xb9\x84\xe0\x00\x00\x00\x00\x0f\xa9\x83\xf0\x00\x00\x00\x00\x10\x99f\xe0\x00\x00\x00\x00" +
-	"\x11\x89e\xf0\x00\x00\x00\x00\x12yH\xe0\x00\x00\x00\x00\x13iG\xf0\x00\x00\x00\x00\x14Y*\xe0\x00\x00\x00\x00\x15I)\xf0\x00\x00\x00\x00\x169\f\xe0\x00\x00\x00\x00\x17)\v\xf0\x00\x00\x00\x00\x18\")`" +
-	"\x00\x00\x00\x00\x19\b\xed\xf0\x00\x00\x00\x00\x1a\x02\v`\x00\x00\x00\x00\x1a\xf2\np\x00\x00\x00\x00\x1b\xe1\xed`\x00\x00\x00\x00\x1c\xd1\xecp\x00\x00\x00\x00\x1d\xc1\xcf`\x00\x00\x00\x00\x1e\xb1\xcep\x00\x00\x00\x00" +
-	"\x1f\xa1\xb1`\x00\x00\x00\x00 v\x00\xf0\x00\x00\x00\x00!\x81\x93`\x00\x00\x00\x00\"U\xe2\xf0\x00\x00\x00\x00#j\xaf\xe0\x00\x00\x00\x00$5\xc4\xf0\x00\x00\x00\x00%J\x91\xe0\x00\x00\x00\x00&\x15\xa6\xf0" +
-	"\x00\x00\x00\x00'*s\xe0\x00\x00\x00\x00'\xfe\xc3p\x00\x00\x00\x00)\nU\xe0\x00\x00\x00\x00)ޥp\x00\x00\x00\x00*\xea7\xe0\x00\x00\x00\x00+\xbe\x87p\x00\x00\x00\x00,\xd3T`\x00\x00\x00\x00" +
-	"-\x9eip\x00\x00\x00\x00.\xb36`\x00\x00\x00\x00/~Kp\x00\x00\x00\x000\x93\x18`\x00\x00\x00\x001gg\xf0\x00\x00\x00\x002r\xfa`\x00\x00\x00\x003GI\xf0\x00\x00\x00\x004R\xdc`" +
-	"\x00\x00\x00\x005'+\xf0\x00\x00\x00\x0062\xbe`\x00\x00\x00\x007\a\r\xf0\x00\x00\x00\x008\x1b\xda\xe0\x00\x00\x00\x008\xe6\xef\xf0\x00\x00\x00\x009\xfb\xbc\xe0\x00\x00\x00\x00:\xc6\xd1\xf0\x00\x00\x00\x00" +
-	";۞\xe0\x00\x00\x00\x00<\xaf\xeep\x00\x00\x00\x00=\xbb\x80\xe0\x00\x00\x00\x00>\x8f\xd0p\x00\x00\x00\x00?\x9bb\xe0\x00\x00\x00\x00@o\xb2p\x00\x00\x00\x00A\x84\x7f`\x00\x00\x00\x00BO\x94p" +
-	"\x00\x00\x00\x00Cda`\x00\x00\x00\x00D/vp\x00\x00\x00\x00EDC`\x00\x00\x00\x00E\xf3\xa8\xf0\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x03\x04\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\xff\xff\xb5\x94\x00\x00\xff\xff\xc7\xc0\x01\x04\xff\xff\xb9\xb0\x00\b\xff\xff\xc7\xc0\x01\f\xff\xff\xc7\xc0\x01\x10LMT\x00ED" +
-	"T\x00EST\x00EWT\x00EPT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00{\a\a\xdc\xca\x03\x00\x00" +
-	"\xca\x03\x00\x00\x0f\x00\x00\x00Canada/MountainTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Y\x00\x00\x00\x05\x00\x00\x00\x14\xff\xff" +
-	"\xff\xff\x88\xde\xce\xe0\xff\xff\xff\xff\x9e\xb8\xaf\x90\xff\xff\xff\xff\x9f\xbb\a\x80\xff\xff\xff\xff\xa0\x98\x91\x90\xff\xff\xff\xff\xa0҅\x80\xff\xff\xff\xff\xa2\x8a\xe8\x90\xff\xff\xff\xff\xa3\x84\x06\x00\xff\xff\xff\xff\xa4j" +
-	"ʐ\xff\xff\xff\xff\xa55À\xff\xff\xff\xff\xa6S\xe7\x10\xff\xff\xff\xff\xa7\x15\xa5\x80\xff\xff\xff\xff\xa83\xc9\x10\xff\xff\xff\xff\xa8\xfe\xc2\x00\xff\xff\xff\xffˉ\f\x90\xff\xff\xff\xff\xd2#\xf4p\xff\xff" +
-	"\xff\xff\xd2a\x18\x00\xff\xff\xff\xff\xd5U\xe3\x10\xff\xff\xff\xff\xd6 \xdc\x00\x00\x00\x00\x00\x04a\x19\x90\x00\x00\x00\x00\x05P\xfc\x80\x00\x00\x00\x00\x06@\xfb\x90\x00\x00\x00\x00\a0ހ\x00\x00\x00\x00\b " +
-	"ݐ\x00\x00\x00\x00\t\x10\xc0\x80\x00\x00\x00\x00\n\x00\xbf\x90\x00\x00\x00\x00\n\xf0\xa2\x80\x00\x00\x00\x00\vࡐ\x00\x00\x00\x00\fٿ\x00\x00\x00\x00\x00\r\xc0\x83\x90\x00\x00\x00\x00\x0e\xb9\xa1\x00\x00\x00" +
-	"\x00\x00\x0f\xa9\xa0\x10\x00\x00\x00\x00\x10\x99\x83\x00\x00\x00\x00\x00\x11\x89\x82\x10\x00\x00\x00\x00\x12ye\x00\x00\x00\x00\x00\x13id\x10\x00\x00\x00\x00\x14YG\x00\x00\x00\x00\x00\x15IF\x10\x00\x00\x00\x00\x169" +
-	")\x00\x00\x00\x00\x00\x17)(\x10\x00\x00\x00\x00\x18\"E\x80\x00\x00\x00\x00\x19\t\n\x10\x00\x00\x00\x00\x1a\x02'\x80\x00\x00\x00\x00\x1a\xf2&\x90\x00\x00\x00\x00\x1b\xe2\t\x80\x00\x00\x00\x00\x1c\xd2\b\x90\x00\x00" +
-	"\x00\x00\x1d\xc1\xeb\x80\x00\x00\x00\x00\x1e\xb1\xea\x90\x00\x00\x00\x00\x1f\xa1̀\x00\x00\x00\x00 v\x1d\x10\x00\x00\x00\x00!\x81\xaf\x80\x00\x00\x00\x00\"U\xff\x10\x00\x00\x00\x00#j\xcc\x00\x00\x00\x00\x00$5" +
-	"\xe1\x10\x00\x00\x00\x00%J\xae\x00\x00\x00\x00\x00&\x15\xc3\x10\x00\x00\x00\x00'*\x90\x00\x00\x00\x00\x00'\xfeߐ\x00\x00\x00\x00)\nr\x00\x00\x00\x00\x00)\xde\xc1\x90\x00\x00\x00\x00*\xeaT\x00\x00\x00" +
-	"\x00\x00+\xbe\xa3\x90\x00\x00\x00\x00,\xd3p\x80\x00\x00\x00\x00-\x9e\x85\x90\x00\x00\x00\x00.\xb3R\x80\x00\x00\x00\x00/~g\x90\x00\x00\x00\x000\x934\x80\x00\x00\x00\x001g\x84\x10\x00\x00\x00\x002s" +
-	"\x16\x80\x00\x00\x00\x003Gf\x10\x00\x00\x00\x004R\xf8\x80\x00\x00\x00\x005'H\x10\x00\x00\x00\x0062ڀ\x00\x00\x00\x007\a*\x10\x00\x00\x00\x008\x1b\xf7\x00\x00\x00\x00\x008\xe7\f\x10\x00\x00" +
-	"\x00\x009\xfb\xd9\x00\x00\x00\x00\x00:\xc6\xee\x10\x00\x00\x00\x00;ۻ\x00\x00\x00\x00\x00<\xb0\n\x90\x00\x00\x00\x00=\xbb\x9d\x00\x00\x00\x00\x00>\x8f\xec\x90\x00\x00\x00\x00?\x9b\x7f\x00\x00\x00\x00\x00@o" +
-	"ΐ\x00\x00\x00\x00A\x84\x9b\x80\x00\x00\x00\x00BO\xb0\x90\x00\x00\x00\x00Cd}\x80\x00\x00\x00\x00D/\x92\x90\x00\x00\x00\x00ED_\x80\x00\x00\x00\x00E\xf3\xc5\x10\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x03\x04\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\xff\xff\x95\xa0\x00\x00\xff\xff\xab\xa0\x01\x04\xff\xff\x9d\x90\x00\b\xff\xff\xab\xa0\x01\f\xff\xff\xab\xa0\x01\x10LMT\x00MDT\x00MST" +
-	"\x00MWT\x00MPT\x00\nMST7MDT,M3.2.0,M11.1.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00~\xb2\x0e\x19V\a\x00\x00V\a\x00\x00\x13" +
-	"\x00\x00\x00Canada/NewfoundlandTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbb\x00\x00\x00\b\x00\x00\x00\x19\xff\xff\xff" +
-	"\xff^=4\xec\xff\xff\xff\xff\x9c\xcfb\f\xff\xff\xff\xff\x9d\xa4\xe6\xfc\xff\xff\xff\xff\x9e\xb8~\x8c\xff\xff\xff\xff\x9f\xba\xd6|\xff\xff\xff\xff\xa0\xb6\x88\xdc\xff\xff\xff\xff\xa18\xffL\xff\xff\xff\xff\xa2\x95\x19" +
-	"\\\xff\xff\xff\xff\xa3\x84\xfcL\xff\xff\xff\xff\xa4t\xfb\\\xff\xff\xff\xff\xa5d\xdeL\xff\xff\xff\xff\xa6^\x17\xdc\xff\xff\xff\xff\xa7D\xc0L\xff\xff\xff\xff\xa8=\xf9\xdc\xff\xff\xff\xff\xa9$\xa2L\xff\xff\xff" +
-	"\xff\xaa\x1d\xdb\xdc\xff\xff\xff\xff\xab\x04\x84L\xff\xff\xff\xff\xab\xfd\xbd\xdc\xff\xff\xff\xff\xac\xe4fL\xff\xff\xff\xff\xadݟ\xdc\xff\xff\xff\xff\xae͂\xcc\xff\xff\xff\xff\xaf\xbd\x81\xdc\xff\xff\xff\xff\xb0\xadd" +
-	"\xcc\xff\xff\xff\xff\xb1\xa6\x9e\\\xff\xff\xff\xff\xb2\x8dF\xcc\xff\xff\xff\xff\xb3\x86\x80\\\xff\xff\xff\xff\xb4m(\xcc\xff\xff\xff\xff\xb5fb\\\xff\xff\xff\xff\xb6M\n\xcc\xff\xff\xff\xff\xb7FD\\\xff\xff\xff" +
-	"\xff\xb8,\xec\xcc\xff\xff\xff\xff\xb9&&\\\xff\xff\xff\xff\xba\x16\tL\xff\xff\xff\xff\xbb\x0fB\xdc\xff\xff\xff\xff\xbb\xf5\xebL\xff\xff\xff\xff\xbc\xef$\xdc\xff\xff\xff\xff\xbd\xd5\xcdL\xff\xff\xff\xff\xbe\x9eM" +
-	"l\xff\xff\xff\xff\xbe\xcf\x06\xa8\xff\xff\xff\xff\xbf\xb5\xaf\x18\xff\xff\xff\xff\xc0\xb818\xff\xff\xff\xff\xc1y\xef\xa8\xff\xff\xff\xff\u0098\x138\xff\xff\xff\xff\xc3YѨ\xff\xff\xff\xff\xc4w\xf58\xff\xff\xff" +
-	"\xff\xc59\xb3\xa8\xff\xff\xff\xff\xc6a\x11\xb8\xff\xff\xff\xff\xc7\x19\x95\xa8\xff\xff\xff\xff\xc8@\xf3\xb8\xff\xff\xff\xff\xc9\x02\xb2(\xff\xff\xff\xff\xca ո\xff\xff\xff\xff\xca\xe2\x94(\xff\xff\xff\xff\xcc\x00\xb7" +
-	"\xb8\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2`\xe6\xc8\xff\xff\xff\xffӈD\xd8\xff\xff\xff\xff\xd4J\x03H\xff\xff\xff\xff\xd5h&\xd8\xff\xff\xff\xff\xd6)\xe5H\xff\xff\xff\xff\xd7H\b\xd8\xff\xff\xff" +
-	"\xff\xd8\t\xc7H\xff\xff\xff\xff\xd9'\xea\xd8\xff\xff\xff\xff\xd9\xe9\xa9H\xff\xff\xff\xff\xdb\x11\aX\xff\xff\xff\xff\xdb\xd2\xc5\xc8\xff\xff\xff\xff\xdc\xdetX\xff\xff\xff\xffݩmH\xff\xff\xff\xff\u07beV" +
-	"X\xff\xff\xff\xff߉OH\xff\xff\xff\xff\xe0\x9e8X\xff\xff\xff\xff\xe1i1H\xff\xff\xff\xff\xe2~\x1aX\xff\xff\xff\xff\xe3I\x13H\xff\xff\xff\xff\xe4]\xfcX\xff\xff\xff\xff\xe5(\xf5H\xff\xff\xff" +
-	"\xff\xe6G\x18\xd8\xff\xff\xff\xff\xe7\x12\x11\xc8\xff\xff\xff\xff\xe8&\xfa\xd8\xff\xff\xff\xff\xe8\xf1\xf3\xc8\xff\xff\xff\xff\xea\x06\xdc\xd8\xff\xff\xff\xff\xea\xd1\xd5\xc8\xff\xff\xff\xff\xeb\xe6\xbe\xd8\xff\xff\xff\xff챷" +
-	"\xc8\xff\xff\xff\xff\xedƠ\xd8\xff\xff\xff\xff\ueffeH\xff\xff\xff\xffﯽX\xff\xff\xff\xff\xf0\x9f\xa0H\xff\xff\xff\xff\xf1\x8f\x9fX\xff\xff\xff\xff\xf2\x7f\x82H\xff\xff\xff\xff\xf3o\x81X\xff\xff\xff" +
-	"\xff\xf4_dH\xff\xff\xff\xff\xf5OcX\xff\xff\xff\xff\xf6?FH\xff\xff\xff\xff\xf7/EX\xff\xff\xff\xff\xf8(b\xc8\xff\xff\xff\xff\xf9\x0f'X\xff\xff\xff\xff\xfa\bD\xc8\xff\xff\xff\xff\xfa\xf8C" +
-	"\xd8\xff\xff\xff\xff\xfb\xe8&\xc8\xff\xff\xff\xff\xfc\xd8%\xd8\xff\xff\xff\xff\xfd\xc8\b\xc8\xff\xff\xff\xff\xfe\xb8\a\xd8\xff\xff\xff\xff\xff\xa7\xea\xc8\x00\x00\x00\x00\x00\x97\xe9\xd8\x00\x00\x00\x00\x01\x87\xcc\xc8\x00\x00\x00" +
-	"\x00\x02w\xcb\xd8\x00\x00\x00\x00\x03p\xe9H\x00\x00\x00\x00\x04`\xe8X\x00\x00\x00\x00\x05P\xcbH\x00\x00\x00\x00\x06@\xcaX\x00\x00\x00\x00\a0\xadH\x00\x00\x00\x00\b \xacX\x00\x00\x00\x00\t\x10\x8f" +
-	"H\x00\x00\x00\x00\n\x00\x8eX\x00\x00\x00\x00\n\xf0qH\x00\x00\x00\x00\v\xe0pX\x00\x00\x00\x00\fٍ\xc8\x00\x00\x00\x00\r\xc0RX\x00\x00\x00\x00\x0e\xb9o\xc8\x00\x00\x00\x00\x0f\xa9n\xd8\x00\x00\x00" +
-	"\x00\x10\x99Q\xc8\x00\x00\x00\x00\x11\x89P\xd8\x00\x00\x00\x00\x12y3\xc8\x00\x00\x00\x00\x13i2\xd8\x00\x00\x00\x00\x14Y\x15\xc8\x00\x00\x00\x00\x15I\x14\xd8\x00\x00\x00\x00\x168\xf7\xc8\x00\x00\x00\x00\x17(\xf6" +
-	"\xd8\x00\x00\x00\x00\x18\"\x14H\x00\x00\x00\x00\x19\b\xd8\xd8\x00\x00\x00\x00\x1a\x01\xf6H\x00\x00\x00\x00\x1a\xf1\xf5X\x00\x00\x00\x00\x1b\xe1\xd8H\x00\x00\x00\x00\x1c\xd1\xd7X\x00\x00\x00\x00\x1d\xc1\xbaH\x00\x00\x00" +
-	"\x00\x1e\xb1\xb9X\x00\x00\x00\x00\x1f\xa1\x9cH\x00\x00\x00\x00 u\xcf\xf4\x00\x00\x00\x00!\x81bd\x00\x00\x00\x00\"U\xb1\xf4\x00\x00\x00\x00#jp\xd4\x00\x00\x00\x00$5\x93\xf4\x00\x00\x00\x00%J`" +
-	"\xe4\x00\x00\x00\x00&\x15u\xf4\x00\x00\x00\x00'*B\xe4\x00\x00\x00\x00'\xfe\x92t\x00\x00\x00\x00)\n$\xe4\x00\x00\x00\x00)\xdett\x00\x00\x00\x00*\xea\x06\xe4\x00\x00\x00\x00+\xbeVt\x00\x00\x00" +
-	"\x00,\xd3#d\x00\x00\x00\x00-\x9e8t\x00\x00\x00\x00.\xb3\x05d\x00\x00\x00\x00/~\x1at\x00\x00\x00\x000\x92\xe7d\x00\x00\x00\x001g6\xf4\x00\x00\x00\x002r\xc9d\x00\x00\x00\x003G\x18" +
-	"\xf4\x00\x00\x00\x004R\xabd\x00\x00\x00\x005&\xfa\xf4\x00\x00\x00\x0062\x8dd\x00\x00\x00\x007\x06\xdc\xf4\x00\x00\x00\x008\x1b\xa9\xe4\x00\x00\x00\x008\xe6\xbe\xf4\x00\x00\x00\x009\xfb\x8b\xe4\x00\x00\x00" +
-	"\x00:Ơ\xf4\x00\x00\x00\x00;\xdbm\xe4\x00\x00\x00\x00<\xaf\xbdt\x00\x00\x00\x00=\xbbO\xe4\x00\x00\x00\x00>\x8f\x9ft\x00\x00\x00\x00?\x9b1\xe4\x00\x00\x00\x00@o\x81t\x00\x00\x00\x00A\x84N" +
-	"d\x00\x00\x00\x00BOct\x00\x00\x00\x00Cd0d\x00\x00\x00\x00D/Et\x00\x00\x00\x00ED\x12d\x00\x00\x00\x00E\xf3w\xf4\x00\x00\x00\x00G-.\xe4\x00\x00\x00\x00G\xd3Y\xf4\x00\x00\x00" +
-	"\x00I\r\x10\xe4\x00\x00\x00\x00I\xb3;\xf4\x00\x00\x00\x00J\xec\xf2\xe4\x00\x00\x00\x00K\x9cXt\x00\x00\x00\x00L\xd6\x0fd\x00\x00\x00\x00M|:t\x00\x00\x00\x00N\xb6\rH\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x06\x05\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04" +
-	"\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04" +
-	"\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\a\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04" +
-	"\xff\xffΔ\x00\x00\xff\xffܤ\x01\x04\xff\xffΔ\x00\b\xff\xff\xdc\xd8\x01\x04\xff\xff\xce\xc8\x00\b\xff\xff\xdc\xd8\x01\f\xff\xff\xdc\xd8\x01\x10\xff\xff\xea\xe8\x01\x14LMT\x00NDT\x00NST\x00" +
-	"NPT\x00NWT\x00NDDT\x00\nNST3:30NDT,M3.2.0,M11.1.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00U9#\xbe2\x05" +
-	"\x00\x002\x05\x00\x00\x0e\x00\x00\x00Canada/PacificTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x81\x00\x00\x00\x05\x00\x00\x00\x14\xff" +
-	"\xff\xff\xff^=v\xec\xff\xff\xff\xff\x9e\xb8\xbd\xa0\xff\xff\xff\xff\x9f\xbb\x15\x90\xff\xff\xff\xffˉ\x1a\xa0\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2a&\x10\xff\xff\xff\xff\xd3v\x0f \xff\xff\xff\xff\xd4" +
-	"A\b\x10\xff\xff\xff\xff\xd5U\xf1 \xff\xff\xff\xff\xd6 \xea\x10\xff\xff\xff\xff\xd75\xd3 \xff\xff\xff\xff\xd8\x00\xcc\x10\xff\xff\xff\xff\xd9\x15\xb5 \xff\xff\xff\xff\xd9\xe0\xae\x10\xff\xff\xff\xff\xda\xfeѠ\xff" +
-	"\xff\xff\xff\xdb\xc0\x90\x10\xff\xff\xff\xff\xdc\u07b3\xa0\xff\xff\xff\xffݩ\xac\x90\xff\xff\xff\xff\u07be\x95\xa0\xff\xff\xff\xff߉\x8e\x90\xff\xff\xff\xff\xe0\x9ew\xa0\xff\xff\xff\xff\xe1ip\x90\xff\xff\xff\xff\xe2" +
-	"~Y\xa0\xff\xff\xff\xff\xe3IR\x90\xff\xff\xff\xff\xe4^;\xa0\xff\xff\xff\xff\xe5)4\x90\xff\xff\xff\xff\xe6GX \xff\xff\xff\xff\xe7\x12Q\x10\xff\xff\xff\xff\xe8': \xff\xff\xff\xff\xe8\xf23\x10\xff" +
-	"\xff\xff\xff\xea\a\x1c \xff\xff\xff\xff\xea\xd2\x15\x10\xff\xff\xff\xff\xeb\xe6\xfe \xff\xff\xff\xff\xec\xb1\xf7\x10\xff\xff\xff\xff\xed\xc6\xe0 \xff\xff\xff\xff\xee\x91\xd9\x10\xff\xff\xff\xff\xef\xaf\xfc\xa0\xff\xff\xff\xff\xf0" +
-	"q\xbb\x10\xff\xff\xff\xff\xf1\x8fޠ\xff\xff\xff\xff\xf2\x7f\xc1\x90\xff\xff\xff\xff\xf3o\xc0\xa0\xff\xff\xff\xff\xf4_\xa3\x90\xff\xff\xff\xff\xf5O\xa2\xa0\xff\xff\xff\xff\xf6?\x85\x90\xff\xff\xff\xff\xf7/\x84\xa0\xff" +
-	"\xff\xff\xff\xf8(\xa2\x10\xff\xff\xff\xff\xf9\x0ff\xa0\xff\xff\xff\xff\xfa\b\x84\x10\xff\xff\xff\xff\xfa\xf8\x83 \xff\xff\xff\xff\xfb\xe8f\x10\xff\xff\xff\xff\xfc\xd8e \xff\xff\xff\xff\xfd\xc8H\x10\xff\xff\xff\xff\xfe" +
-	"\xb8G \xff\xff\xff\xff\xff\xa8*\x10\x00\x00\x00\x00\x00\x98) \x00\x00\x00\x00\x01\x88\f\x10\x00\x00\x00\x00\x02x\v \x00\x00\x00\x00\x03q(\x90\x00\x00\x00\x00\x04a'\xa0\x00\x00\x00\x00\x05Q\n\x90\x00" +
-	"\x00\x00\x00\x06A\t\xa0\x00\x00\x00\x00\a0\xec\x90\x00\x00\x00\x00\b \xeb\xa0\x00\x00\x00\x00\t\x10ΐ\x00\x00\x00\x00\n\x00͠\x00\x00\x00\x00\n\xf0\xb0\x90\x00\x00\x00\x00\v\u0be0\x00\x00\x00\x00\f" +
-	"\xd9\xcd\x10\x00\x00\x00\x00\r\xc0\x91\xa0\x00\x00\x00\x00\x0e\xb9\xaf\x10\x00\x00\x00\x00\x0f\xa9\xae \x00\x00\x00\x00\x10\x99\x91\x10\x00\x00\x00\x00\x11\x89\x90 \x00\x00\x00\x00\x12ys\x10\x00\x00\x00\x00\x13ir \x00" +
-	"\x00\x00\x00\x14YU\x10\x00\x00\x00\x00\x15IT \x00\x00\x00\x00\x1697\x10\x00\x00\x00\x00\x17)6 \x00\x00\x00\x00\x18\"S\x90\x00\x00\x00\x00\x19\t\x18 \x00\x00\x00\x00\x1a\x025\x90\x00\x00\x00\x00\x1a" +
-	"\xf24\xa0\x00\x00\x00\x00\x1b\xe2\x17\x90\x00\x00\x00\x00\x1c\xd2\x16\xa0\x00\x00\x00\x00\x1d\xc1\xf9\x90\x00\x00\x00\x00\x1e\xb1\xf8\xa0\x00\x00\x00\x00\x1f\xa1ې\x00\x00\x00\x00 v+ \x00\x00\x00\x00!\x81\xbd\x90\x00" +
-	"\x00\x00\x00\"V\r \x00\x00\x00\x00#j\xda\x10\x00\x00\x00\x00$5\xef \x00\x00\x00\x00%J\xbc\x10\x00\x00\x00\x00&\x15\xd1 \x00\x00\x00\x00'*\x9e\x10\x00\x00\x00\x00'\xfe\xed\xa0\x00\x00\x00\x00)" +
-	"\n\x80\x10\x00\x00\x00\x00)\xdeϠ\x00\x00\x00\x00*\xeab\x10\x00\x00\x00\x00+\xbe\xb1\xa0\x00\x00\x00\x00,\xd3~\x90\x00\x00\x00\x00-\x9e\x93\xa0\x00\x00\x00\x00.\xb3`\x90\x00\x00\x00\x00/~u\xa0\x00" +
-	"\x00\x00\x000\x93B\x90\x00\x00\x00\x001g\x92 \x00\x00\x00\x002s$\x90\x00\x00\x00\x003Gt \x00\x00\x00\x004S\x06\x90\x00\x00\x00\x005'V \x00\x00\x00\x0062\xe8\x90\x00\x00\x00\x007" +
-	"\a8 \x00\x00\x00\x008\x1c\x05\x10\x00\x00\x00\x008\xe7\x1a \x00\x00\x00\x009\xfb\xe7\x10\x00\x00\x00\x00:\xc6\xfc \x00\x00\x00\x00;\xdb\xc9\x10\x00\x00\x00\x00<\xb0\x18\xa0\x00\x00\x00\x00=\xbb\xab\x10\x00" +
-	"\x00\x00\x00>\x8f\xfa\xa0\x00\x00\x00\x00?\x9b\x8d\x10\x00\x00\x00\x00@oܠ\x00\x00\x00\x00A\x84\xa9\x90\x00\x00\x00\x00BO\xbe\xa0\x00\x00\x00\x00Cd\x8b\x90\x00\x00\x00\x00D/\xa0\xa0\x00\x00\x00\x00E" +
-	"Dm\x90\x00\x00\x00\x00E\xf3\xd3 \x02\x01\x02\x03\x04\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\xff\xff\x8c\x94\x00\x00\xff\xff\x9d\x90\x01\x04\xff\xff\x8f\x80\x00\b\xff\xff\x9d\x90\x01\f\xff\xff\x9d\x90\x01\x10LMT\x00PDT\x00PS" +
-	"T\x00PWT\x00PPT\x00\nPST8PDT,M3.2.0,M11.1.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\u0096dK~\x02\x00\x00~\x02\x00\x00" +
-	"\x13\x00\x00\x00Canada/SaskatchewanTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x005\x00\x00\x00\x06\x00\x00\x00\x18\xff\xff" +
-	"\xff\xff\x86\xfd\x93\x1c\xff\xff\xff\xff\x9e\xb8\xaf\x90\xff\xff\xff\xff\x9f\xbb\a\x80\xff\xff\xff\xff\xb5eO\xf0\xff\xff\xff\xff\xb60H\xe0\xff\xff\xff\xff\xb7E1\xf0\xff\xff\xff\xff\xb8\x10*\xe0\xff\xff\xff\xff\xb9%" +
-	"\x13\xf0\xff\xff\xff\xff\xb9\xf0\f\xe0\xff\xff\xff\xff\xbb\x0e0p\xff\xff\xff\xff\xbb\xcf\xee\xe0\xff\xff\xff\xff\xbc\xee\x12p\xff\xff\xff\xff\xbd\xb9\v`\xff\xff\xff\xff\xc2r\b\xf0\xff\xff\xff\xff\xc3a\xeb\xe0\xff\xff" +
-	"\xff\xff\xc4Q\xea\xf0\xff\xff\xff\xff\xc58\x93`\xff\xff\xff\xff\xc61\xcc\xf0\xff\xff\xff\xff\xc7!\xaf\xe0\xff\xff\xff\xff\xc8\x1a\xe9p\xff\xff\xff\xff\xc9\n\xcc`\xff\xff\xff\xff\xc9\xfa\xcbp\xff\xff\xff\xff\xca\xea" +
-	"\xae`\xff\xff\xff\xffˉ\f\x90\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2a\x18\x00\xff\xff\xff\xff\xd3c\x8c\x10\xff\xff\xff\xff\xd4So\x00\xff\xff\xff\xff\xd5U\xe3\x10\xff\xff\xff\xff\xd6 \xdc\x00\xff\xff" +
-	"\xff\xff\xd75\xc5\x10\xff\xff\xff\xff\xd8\x00\xbe\x00\xff\xff\xff\xff\xd9\x15\xa7\x10\xff\xff\xff\xff\xd9\xe0\xa0\x00\xff\xff\xff\xff\xda\xfeÐ\xff\xff\xff\xff\xdb\xc0\x82\x00\xff\xff\xff\xff\xdcޥ\x90\xff\xff\xff\xffݩ" +
-	"\x9e\x80\xff\xff\xff\xff\u07be\x87\x90\xff\xff\xff\xff߉\x80\x80\xff\xff\xff\xff\xe0\x9ei\x90\xff\xff\xff\xff\xe1ib\x80\xff\xff\xff\xff\xe2~K\x90\xff\xff\xff\xff\xe3ID\x80\xff\xff\xff\xff\xe4^-\x90\xff\xff" +
-	"\xff\xff\xe5)&\x80\xff\xff\xff\xff\xe6GJ\x10\xff\xff\xff\xff\xe7\x12C\x00\xff\xff\xff\xff\xe8',\x10\xff\xff\xff\xff\xe8\xf2%\x00\xff\xff\xff\xff\xeb\xe6\xf0\x10\xff\xff\xff\xff\xec\xd6\xd3\x00\xff\xff\xff\xff\xed\xc6" +
-	"\xd2\x10\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x03\x04\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x05\xff\xff\x9d\xe4\x00" +
-	"\x00\xff\xff\xab\xa0\x01\x04\xff\xff\x9d\x90\x00\b\xff\xff\xab\xa0\x01\f\xff\xff\xab\xa0\x01\x10\xff\xff\xab\xa0\x00\x14LMT\x00MDT\x00MST\x00MWT\x00MPT\x00CST\x00\nCST6" +
-	"\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbf\x1d\xee\x91\x05\x04\x00\x00\x05\x04\x00\x00\f\x00\x00\x00Canada/YukonTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00]\x00\x00\x00\t\x00\x00\x00%\xff\xff\xff\xff}\x86\x8a\x9c\xff\xff\xff\xff\x9e\xb8˰\xff\xff\xff\xff\x9f\xbb#\xa0\xff\xff\xff\xff\xa0\xd0\f\xb0\xff\xff\xff\xff\xa1\xa2Ҁ\xff\xff" +
-	"\xff\xffˉ(\xb0\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2a4 \xff\xff\xff\xff\xf7/v\x90\xff\xff\xff\xff\xf8(\xa2\x10\xff\xff\xff\xff\xf8ń\x90\x00\x00\x00\x00\x13ir \x00\x00\x00\x00\x14Y" +
-	"U\x10\x00\x00\x00\x00\x15IT \x00\x00\x00\x00\x1697\x10\x00\x00\x00\x00\x17)6 \x00\x00\x00\x00\x18\"S\x90\x00\x00\x00\x00\x19\t\x18 \x00\x00\x00\x00\x1a\x025\x90\x00\x00\x00\x00\x1a\xf24\xa0\x00\x00" +
-	"\x00\x00\x1b\xe2\x17\x90\x00\x00\x00\x00\x1c\xd2\x16\xa0\x00\x00\x00\x00\x1d\xc1\xf9\x90\x00\x00\x00\x00\x1e\xb1\xf8\xa0\x00\x00\x00\x00\x1f\xa1ې\x00\x00\x00\x00 v+ \x00\x00\x00\x00!\x81\xbd\x90\x00\x00\x00\x00\"V" +
-	"\r \x00\x00\x00\x00#j\xda\x10\x00\x00\x00\x00$5\xef \x00\x00\x00\x00%J\xbc\x10\x00\x00\x00\x00&\x15\xd1 \x00\x00\x00\x00'*\x9e\x10\x00\x00\x00\x00'\xfe\xed\xa0\x00\x00\x00\x00)\n\x80\x10\x00\x00" +
-	"\x00\x00)\xdeϠ\x00\x00\x00\x00*\xeab\x10\x00\x00\x00\x00+\xbe\xb1\xa0\x00\x00\x00\x00,\xd3~\x90\x00\x00\x00\x00-\x9e\x93\xa0\x00\x00\x00\x00.\xb3`\x90\x00\x00\x00\x00/~u\xa0\x00\x00\x00\x000\x93" +
-	"B\x90\x00\x00\x00\x001g\x92 \x00\x00\x00\x002s$\x90\x00\x00\x00\x003Gt \x00\x00\x00\x004S\x06\x90\x00\x00\x00\x005'V \x00\x00\x00\x0062\xe8\x90\x00\x00\x00\x007\a8 \x00\x00" +
-	"\x00\x008\x1c\x05\x10\x00\x00\x00\x008\xe7\x1a \x00\x00\x00\x009\xfb\xe7\x10\x00\x00\x00\x00:\xc6\xfc \x00\x00\x00\x00;\xdb\xc9\x10\x00\x00\x00\x00<\xb0\x18\xa0\x00\x00\x00\x00=\xbb\xab\x10\x00\x00\x00\x00>\x8f" +
-	"\xfa\xa0\x00\x00\x00\x00?\x9b\x8d\x10\x00\x00\x00\x00@oܠ\x00\x00\x00\x00A\x84\xa9\x90\x00\x00\x00\x00BO\xbe\xa0\x00\x00\x00\x00Cd\x8b\x90\x00\x00\x00\x00D/\xa0\xa0\x00\x00\x00\x00EDm\x90\x00\x00" +
-	"\x00\x00E\xf3\xd3 \x00\x00\x00\x00G-\x8a\x10\x00\x00\x00\x00Gӵ \x00\x00\x00\x00I\rl\x10\x00\x00\x00\x00I\xb3\x97 \x00\x00\x00\x00J\xedN\x10\x00\x00\x00\x00K\x9c\xb3\xa0\x00\x00\x00\x00L\xd6" +
-	"j\x90\x00\x00\x00\x00M|\x95\xa0\x00\x00\x00\x00N\xb6L\x90\x00\x00\x00\x00O\\w\xa0\x00\x00\x00\x00P\x96.\x90\x00\x00\x00\x00Q<Y\xa0\x00\x00\x00\x00Rv\x10\x90\x00\x00\x00\x00S\x1c;\xa0\x00\x00" +
-	"\x00\x00TU\xf2\x90\x00\x00\x00\x00T\xfc\x1d\xa0\x00\x00\x00\x00V5Ԑ\x00\x00\x00\x00V\xe5: \x00\x00\x00\x00X\x1e\xf1\x10\x00\x00\x00\x00X\xc5\x1c \x00\x00\x00\x00Y\xfe\xd3\x10\x00\x00\x00\x00Z\xa4" +
-	"\xfe \x00\x00\x00\x00[\u07b5\x10\x00\x00\x00\x00\\\x84\xe0 \x00\x00\x00\x00]\xbe\x97\x10\x00\x00\x00\x00^d\xc2 \x00\x00\x00\x00_\x9e\\\xf0\x02\x01\x02\x01\x02\x03\x04\x02\x05\x02\x06\a\x06\a\x06\a\x06\a" +
-	"\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a" +
-	"\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\b\xff\xff\x81d\x00\x00\xff\xff\x8f\x80\x01\x04\xff\xff\x81p\x00\b\xff\xff\x8f\x80\x01\f\xff\xff\x8f\x80\x01\x10\xff\xff\x9d\x90\x01\x14\xff\xff\x8f\x80\x00\x19\xff\xff\x9d" +
-	"\x90\x01\x1d\xff\xff\x9d\x90\x00!LMT\x00YDT\x00YST\x00YWT\x00YPT\x00YDDT\x00PST\x00PDT\x00MST\x00\nMST7\nPK\x03\x04\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00]\"_WJ\x05\x00\x00J\x05\x00\x00\x11\x00\x00\x00Chile/ContinentalTZif3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x82\x00\x00\x00\x06\x00\x00\x00\x14\xff\xff\xff\xffi\x87\x1d\xc5\xff\xff\xff\xff\x8f0GE\xff\xff\xff\xff\x9b\\\xe5P\xff\xff\xff\xff\x9f|\xe2\xc5\xff\xff\xff\xff\xa1\x00q\xc0\xff\xff\xff\xff\xb0^" +
-	"w\xc5\xff\xff\xff\xff\xb1w=@\xff\xff\xff\xff\xb2A\x00\xd0\xff\xff\xff\xff\xb3Xp\xc0\xff\xff\xff\xff\xb4\"4P\xff\xff\xff\xff\xb59\xa4@\xff\xff\xff\xff\xb6\x03g\xd0\xff\xff\xff\xff\xb7\x1a\xd7\xc0\xff\xff" +
-	"\xff\xff\xb7\xe4\x9bP\xff\xff\xff\xff\xb8\xfd\\\xc0\xff\xff\xff\xff\xb9\xc7 P\xff\xff\xff\xff\xcc\x1cn@\xff\xff\xff\xff\xccl\xe7\xd0\xff\xff\xff\xff\xd3\u070f\xc0\xff\xff\xff\xff\xd4\x17\xd50\xff\xff\xff\xff\xd53" +
-	"U\xc0\xff\xff\xff\xff\xd5v\x92@\xff\xff\xff\xff\xfd\xd1<@\xff\xff\xff\xff\xfe\x92\xfa\xb0\xff\xff\xff\xff\xff\xcc\xcd\xc0\x00\x00\x00\x00\x00rܰ\x00\x00\x00\x00\x01uP\xc0\x00\x00\x00\x00\x02@I\xb0\x00\x00" +
-	"\x00\x00\x03U2\xc0\x00\x00\x00\x00\x04 +\xb0\x00\x00\x00\x00\x05>O@\x00\x00\x00\x00\x06\x00\r\xb0\x00\x00\x00\x00\a\v\xbc@\x00\x00\x00\x00\a\xdf\xef\xb0\x00\x00\x00\x00\b\xfe\x13@\x00\x00\x00\x00\t\xbf" +
-	"Ѱ\x00\x00\x00\x00\n\xdd\xf5@\x00\x00\x00\x00\v\xa8\xee0\x00\x00\x00\x00\f\xbd\xd7@\x00\x00\x00\x00\r\x88\xd00\x00\x00\x00\x00\x0e\x9d\xb9@\x00\x00\x00\x00\x0fh\xb20\x00\x00\x00\x00\x10\x86\xd5\xc0\x00\x00" +
-	"\x00\x00\x11H\x940\x00\x00\x00\x00\x12f\xb7\xc0\x00\x00\x00\x00\x13(v0\x00\x00\x00\x00\x14F\x99\xc0\x00\x00\x00\x00\x15\x11\x92\xb0\x00\x00\x00\x00\x16&{\xc0\x00\x00\x00\x00\x16\xf1t\xb0\x00\x00\x00\x00\x18\x06" +
-	"]\xc0\x00\x00\x00\x00\x18\xd1V\xb0\x00\x00\x00\x00\x19\xe6?\xc0\x00\x00\x00\x00\x1a\xb18\xb0\x00\x00\x00\x00\x1b\xcf\\@\x00\x00\x00\x00\x1c\x91\x1a\xb0\x00\x00\x00\x00\x1d\xaf>@\x00\x00\x00\x00\x1ep\xfc\xb0\x00\x00" +
-	"\x00\x00\x1f\x8f @\x00\x00\x00\x00 \x7f\x030\x00\x00\x00\x00!o\x02@\x00\x00\x00\x00\"9\xfb0\x00\x00\x00\x00#N\xe4@\x00\x00\x00\x00$\x19\xdd0\x00\x00\x00\x00%8\x00\xc0\x00\x00\x00\x00%\xf9" +
-	"\xbf0\x00\x00\x00\x00&\xf2\xf8\xc0\x00\x00\x00\x00'١0\x00\x00\x00\x00(\xf7\xc4\xc0\x00\x00\x00\x00)½\xb0\x00\x00\x00\x00*צ\xc0\x00\x00\x00\x00+\xa2\x9f\xb0\x00\x00\x00\x00,\xb7\x88\xc0\x00\x00" +
-	"\x00\x00-\x82\x81\xb0\x00\x00\x00\x00.\x97j\xc0\x00\x00\x00\x00/bc\xb0\x00\x00\x00\x000\x80\x87@\x00\x00\x00\x001BE\xb0\x00\x00\x00\x002`i@\x00\x00\x00\x003=\xd70\x00\x00\x00\x004@" +
-	"K@\x00\x00\x00\x005\vD0\x00\x00\x00\x006\r\xb8@\x00\x00\x00\x007\x06հ\x00\x00\x00\x008\x00\x0f@\x00\x00\x00\x008\xcb\b0\x00\x00\x00\x009\xe9+\xc0\x00\x00\x00\x00:\xaa\xea0\x00\x00" +
-	"\x00\x00;\xc9\r\xc0\x00\x00\x00\x00<\x8a\xcc0\x00\x00\x00\x00=\xa8\xef\xc0\x00\x00\x00\x00>j\xae0\x00\x00\x00\x00?\x88\xd1\xc0\x00\x00\x00\x00@Sʰ\x00\x00\x00\x00Ah\xb3\xc0\x00\x00\x00\x00B3" +
-	"\xac\xb0\x00\x00\x00\x00CH\x95\xc0\x00\x00\x00\x00D\x13\x8e\xb0\x00\x00\x00\x00E1\xb2@\x00\x00\x00\x00E\xf3p\xb0\x00\x00\x00\x00G\x11\x94@\x00\x00\x00\x00G\xef\x020\x00\x00\x00\x00H\xf1v@\x00\x00" +
-	"\x00\x00I\xbco0\x00\x00\x00\x00J\xd1X@\x00\x00\x00\x00K\xb8\x00\xb0\x00\x00\x00\x00L\xb1:@\x00\x00\x00\x00M\xc6\a0\x00\x00\x00\x00NP\x82\xc0\x00\x00\x00\x00O\x9c\xae\xb0\x00\x00\x00\x00PB" +
-	"\xd9\xc0\x00\x00\x00\x00Q|\x90\xb0\x00\x00\x00\x00R+\xf6@\x00\x00\x00\x00S\\r\xb0\x00\x00\x00\x00T\v\xd8@\x00\x00\x00\x00W7\xe60\x00\x00\x00\x00W\xaf\xec\xc0\x00\x00\x00\x00Y\x17\xc80\x00\x00" +
-	"\x00\x00Y\x8f\xce\xc0\x00\x00\x00\x00Z\xf7\xaa0\x00\x00\x00\x00[o\xb0\xc0\x00\x00\x00\x00\\\xa9g\xb0\x00\x00\x00\x00]t|\xc0\x00\x00\x00\x00^\x89I\xb0\x00\x00\x00\x00_T^\xc0\x00\x00\x00\x00`i" +
-	"+\xb0\x00\x00\x00\x00a4@\xc0\x00\x00\x00\x00bI\r\xb0\x00\x00\x00\x00c\x1d]@\x00\x00\x00\x00d(\xef\xb0\x01\x02\x01\x03\x01\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x03\x02\x03\x05\x04\x02\x03\x05\x03\x05\x03" +
-	"\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03" +
-	"\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\xff\xff\xbd\xbb\x00\x00\xff\xff\xbd\xbb\x00\x04\xff\xff\xb9\xb0" +
-	"\x00\b\xff\xff\xc7\xc0\x00\f\xff\xff\xc7\xc0\x01\f\xff\xff\xd5\xd0\x01\x10LMT\x00SMT\x00-05\x00-04\x00-03\x00\n<-04>4<-03>,M9.1.6/" +
-	"24,M4.1.6/24\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?X'\x8e\x96\x04\x00\x00\x96\x04\x00\x00\x12\x00\x00\x00Chile/EasterIslan" +
-	"dTZif3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif3\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00n\x00\x00\x00\x06\x00\x00\x00\x14\xff\xff\xff\xffi\x87B\b\xff\xff\xff\xff\xb9\xc7@\x88\xff\xff\xff\xff\xfd\xd1<@" +
-	"\xff\xff\xff\xff\xfe\x92\xfa\xb0\xff\xff\xff\xff\xff\xcc\xcd\xc0\x00\x00\x00\x00\x00rܰ\x00\x00\x00\x00\x01uP\xc0\x00\x00\x00\x00\x02@I\xb0\x00\x00\x00\x00\x03U2\xc0\x00\x00\x00\x00\x04 +\xb0\x00\x00\x00\x00" +
-	"\x05>O@\x00\x00\x00\x00\x06\x00\r\xb0\x00\x00\x00\x00\a\v\xbc@\x00\x00\x00\x00\a\xdf\xef\xb0\x00\x00\x00\x00\b\xfe\x13@\x00\x00\x00\x00\t\xbfѰ\x00\x00\x00\x00\n\xdd\xf5@\x00\x00\x00\x00\v\xa8\xee0" +
-	"\x00\x00\x00\x00\f\xbd\xd7@\x00\x00\x00\x00\r\x88\xd00\x00\x00\x00\x00\x0e\x9d\xb9@\x00\x00\x00\x00\x0fh\xb20\x00\x00\x00\x00\x10\x86\xd5\xc0\x00\x00\x00\x00\x11H\x940\x00\x00\x00\x00\x12f\xb7\xc0\x00\x00\x00\x00" +
-	"\x13(v0\x00\x00\x00\x00\x14F\x99\xc0\x00\x00\x00\x00\x15\x11\x92\xb0\x00\x00\x00\x00\x16&{\xc0\x00\x00\x00\x00\x16\xf1t\xb0\x00\x00\x00\x00\x18\x06]\xc0\x00\x00\x00\x00\x18\xd1V\xb0\x00\x00\x00\x00\x19\xe6?\xc0" +
-	"\x00\x00\x00\x00\x1a\xb18\xb0\x00\x00\x00\x00\x1b\xcf\\@\x00\x00\x00\x00\x1c\x91\x1a\xb0\x00\x00\x00\x00\x1d\xaf>@\x00\x00\x00\x00\x1ep\xfc\xb0\x00\x00\x00\x00\x1f\x8f @\x00\x00\x00\x00 \x7f\x030\x00\x00\x00\x00" +
-	"!o\x02@\x00\x00\x00\x00\"9\xfb0\x00\x00\x00\x00#N\xe4@\x00\x00\x00\x00$\x19\xdd0\x00\x00\x00\x00%8\x00\xc0\x00\x00\x00\x00%\xf9\xbf0\x00\x00\x00\x00&\xf2\xf8\xc0\x00\x00\x00\x00'١0" +
-	"\x00\x00\x00\x00(\xf7\xc4\xc0\x00\x00\x00\x00)½\xb0\x00\x00\x00\x00*צ\xc0\x00\x00\x00\x00+\xa2\x9f\xb0\x00\x00\x00\x00,\xb7\x88\xc0\x00\x00\x00\x00-\x82\x81\xb0\x00\x00\x00\x00.\x97j\xc0\x00\x00\x00\x00" +
-	"/bc\xb0\x00\x00\x00\x000\x80\x87@\x00\x00\x00\x001BE\xb0\x00\x00\x00\x002`i@\x00\x00\x00\x003=\xd70\x00\x00\x00\x004@K@\x00\x00\x00\x005\vD0\x00\x00\x00\x006\r\xb8@" +
-	"\x00\x00\x00\x007\x06հ\x00\x00\x00\x008\x00\x0f@\x00\x00\x00\x008\xcb\b0\x00\x00\x00\x009\xe9+\xc0\x00\x00\x00\x00:\xaa\xea0\x00\x00\x00\x00;\xc9\r\xc0\x00\x00\x00\x00<\x8a\xcc0\x00\x00\x00\x00" +
-	"=\xa8\xef\xc0\x00\x00\x00\x00>j\xae0\x00\x00\x00\x00?\x88\xd1\xc0\x00\x00\x00\x00@Sʰ\x00\x00\x00\x00Ah\xb3\xc0\x00\x00\x00\x00B3\xac\xb0\x00\x00\x00\x00CH\x95\xc0\x00\x00\x00\x00D\x13\x8e\xb0" +
-	"\x00\x00\x00\x00E1\xb2@\x00\x00\x00\x00E\xf3p\xb0\x00\x00\x00\x00G\x11\x94@\x00\x00\x00\x00G\xef\x020\x00\x00\x00\x00H\xf1v@\x00\x00\x00\x00I\xbco0\x00\x00\x00\x00J\xd1X@\x00\x00\x00\x00" +
-	"K\xb8\x00\xb0\x00\x00\x00\x00L\xb1:@\x00\x00\x00\x00M\xc6\a0\x00\x00\x00\x00NP\x82\xc0\x00\x00\x00\x00O\x9c\xae\xb0\x00\x00\x00\x00PB\xd9\xc0\x00\x00\x00\x00Q|\x90\xb0\x00\x00\x00\x00R+\xf6@" +
-	"\x00\x00\x00\x00S\\r\xb0\x00\x00\x00\x00T\v\xd8@\x00\x00\x00\x00W7\xe60\x00\x00\x00\x00W\xaf\xec\xc0\x00\x00\x00\x00Y\x17\xc80\x00\x00\x00\x00Y\x8f\xce\xc0\x00\x00\x00\x00Z\xf7\xaa0\x00\x00\x00\x00" +
-	"[o\xb0\xc0\x00\x00\x00\x00\\\xa9g\xb0\x00\x00\x00\x00]t|\xc0\x00\x00\x00\x00^\x89I\xb0\x00\x00\x00\x00_T^\xc0\x00\x00\x00\x00`i+\xb0\x00\x00\x00\x00a4@\xc0\x00\x00\x00\x00bI\r\xb0" +
-	"\x00\x00\x00\x00c\x1d]@\x00\x00\x00\x00d(\xef\xb0\x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04" +
-	"\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04" +
-	"\x05\x04\x05\x04\x05\x04\xff\xff\x99x\x00\x00\xff\xff\x99x\x00\x04\xff\xff\xab\xa0\x01\b\xff\xff\x9d\x90\x00\f\xff\xff\xab\xa0\x00\b\xff\xff\xb9\xb0\x01\x10LMT\x00EMT\x00-06\x00-07\x00-0" +
-	"5\x00\n<-06>6<-05>,M9.1.6/22,M4.1.6/22\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\x1c\x9e\x9a]\x04\x00\x00]\x04\x00" +
-	"\x00\x04\x00\x00\x00CubaTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00" +
-	"TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00j\x00\x00\x00\x04\x00\x00\x00\x10\xff\xff\xff\xffi\x87(\xb8\xff\xff\xff\xff\xacb\u0080" +
-	"\xff\xff\xff\xff\xb1ӔP\xff\xff\xff\xff\xb2t]@\xff\xff\xff\xff\xc8[f\xd0\xff\xff\xff\xff\xc8\xd3Q@\xff\xff\xff\xff\xca;H\xd0\xff\xff\xff\xffʼm\xc0\xff\xff\xff\xff\xcc$eP\xff\xff\xff\xff" +
-	"̜O\xc0\xff\xff\xff\xff\xd1\xc4\vP\xff\xff\xff\xff\xd2;\xf5\xc0\xff\xff\xff\xffӣ\xedP\xff\xff\xff\xff\xd4\x1b\xd7\xc0\xff\xff\xff\xff\xf7`\x05\xd0\xff\xff\xff\xff\xf7\xff}@\xff\xff\xff\xff\xf9=D\xd0" +
-	"\xff\xff\xff\xff\xf9\xe3S\xc0\xff\xff\xff\xff\xfa\xdb;\xd0\xff\xff\xff\xff\xfb\xa7\x86@\xff\xff\xff\xff\xfcũ\xd0\xff\xff\xff\xff\xfd\x87h@\xff\xff\xff\xff\xfe\xb8\x00\xd0\xff\xff\xff\xff\xff\xa7\xe3\xc0\x00\x00\x00\x00" +
-	"\x00\x97\xe2\xd0\x00\x00\x00\x00\x01\x87\xc5\xc0\x00\x00\x00\x00\x02w\xc4\xd0\x00\x00\x00\x00\x03p\xe2@\x00\x00\x00\x00\x04`\xe1P\x00\x00\x00\x00\x055\x14\xc0\x00\x00\x00\x00\x06@\xc3P\x00\x00\x00\x00\a\x16H@" +
-	"\x00\x00\x00\x00\b \xa5P\x00\x00\x00\x00\b\xf7{\xc0\x00\x00\x00\x00\n\x00\x87P\x00\x00\x00\x00\n\xf0j@\x00\x00\x00\x00\v\xe0iP\x00\x00\x00\x00\fن\xc0\x00\x00\x00\x00\r\xc0KP\x00\x00\x00\x00" +
-	"\x0e\xb9h\xc0\x00\x00\x00\x00\x0f\xb2\xa2P\x00\x00\x00\x00\x10}\x9b@\x00\x00\x00\x00\x11Q\xea\xd0\x00\x00\x00\x00\x12f\xb7\xc0\x00\x00\x00\x00\x131\xcc\xd0\x00\x00\x00\x00\x14F\x99\xc0\x00\x00\x00\x00\x15[\x82\xd0" +
-	"\x00\x00\x00\x00\x16&{\xc0\x00\x00\x00\x00\x17;d\xd0\x00\x00\x00\x00\x18\x06]\xc0\x00\x00\x00\x00\x19\x1bF\xd0\x00\x00\x00\x00\x19\xe6?\xc0\x00\x00\x00\x00\x1a\xfb(\xd0\x00\x00\x00\x00\x1b\xcf\\@\x00\x00\x00\x00" +
-	"\x1c\xdb\n\xd0\x00\x00\x00\x00\x1d\xaf>@\x00\x00\x00\x00\x1ezSP\x00\x00\x00\x00\x1f\x8f @\x00\x00\x00\x00 Z5P\x00\x00\x00\x00!o\x02@\x00\x00\x00\x00\"CQ\xd0\x00\x00\x00\x00#N\xe4@" +
-	"\x00\x00\x00\x00$#3\xd0\x00\x00\x00\x00%.\xc6@\x00\x00\x00\x00&\x15\x8a\xd0\x00\x00\x00\x00'\x17\xe2\xc0\x00\x00\x00\x00'\xfe\xa7P\x00\x00\x00\x00(\xf7\xd2\xd0\x00\x00\x00\x00)މP\x00\x00\x00\x00" +
-	"*״\xd0\x00\x00\x00\x00+\xbekP\x00\x00\x00\x00,\xb7\x96\xd0\x00\x00\x00\x00-\x9eMP\x00\x00\x00\x00.\x97x\xd0\x00\x00\x00\x00/~/P\x00\x00\x00\x000wZ\xd0\x00\x00\x00\x001gK\xd0" +
-	"\x00\x00\x00\x002W<\xd0\x00\x00\x00\x003G-\xd0\x00\x00\x00\x004@YP\x00\x00\x00\x005\x1d\xd5P\x00\x00\x00\x0062\xb0P\x00\x00\x00\x006\xfd\xb7P\x00\x00\x00\x008\x1b\xcc\xd0\x00\x00\x00\x00" +
-	"8\xe6\xd3\xd0\x00\x00\x00\x009\xfb\xae\xd0\x00\x00\x00\x00:Ƶ\xd0\x00\x00\x00\x00;ې\xd0\x00\x00\x00\x00<\xaf\xd2P\x00\x00\x00\x00=\xbbr\xd0\x00\x00\x00\x00>\x8f\xb4P\x00\x00\x00\x00?\x9bT\xd0" +
-	"\x00\x00\x00\x00@f[\xd0\x00\x00\x00\x00ED5P\x00\x00\x00\x00E\xf3\x8c\xd0\x00\x00\x00\x00G$\x17P\x00\x00\x00\x00GܩP\x00\x00\x00\x00I\x03\xf9P\x00\x00\x00\x00I\xb3P\xd0\x00\x00\x00\x00" +
-	"J\xe3\xdbP\x00\x00\x00\x00K\x9cmP\x00\x00\x00\x00L\xcc\xf7\xd0\x00\x00\x00\x00M\x85\x89\xd0\x00\x00\x00\x00N\xbfN\xd0\x00\x00\x00\x00Ow\xe0\xd0\x00\x00\x00\x00P\x95\xf6P\x01\x03\x02\x03\x02\x03\x02\x03" +
-	"\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03" +
-	"\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\xff\xff\xb2\xc8\x00\x00\xff\xff\xb2\xc0\x00\x04\xff\xff\xc7\xc0\x01\b\xff\xff\xb9\xb0" +
-	"\x00\fLMT\x00HMT\x00CDT\x00CST\x00\nCST5CDT,M3.2.0/0,M11.1.0/1\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"`l\x8d~\xf1\x01\x00\x00\xf1\x01\x00\x00\x03\x00\x00\x00EETTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" +
-	"\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\x00\x00\x00\x02\x00\x00\x00\t\x00\x00\x00\x00\r\xa4" +
-	"c\x90\x00\x00\x00\x00\x0e\x8b\x1a\x10\x00\x00\x00\x00\x0f\x84E\x90\x00\x00\x00\x00\x10t6\x90\x00\x00\x00\x00\x11d'\x90\x00\x00\x00\x00\x12T\x18\x90\x00\x00\x00\x00\x13MD\x10\x00\x00\x00\x00\x143\xfa\x90\x00\x00" +
-	"\x00\x00\x15#\xeb\x90\x00\x00\x00\x00\x16\x13ܐ\x00\x00\x00\x00\x17\x03͐\x00\x00\x00\x00\x17\xf3\xbe\x90\x00\x00\x00\x00\x18㯐\x00\x00\x00\x00\x19Ӡ\x90\x00\x00\x00\x00\x1aÑ\x90\x00\x00\x00\x00\x1b\xbc" +
-	"\xbd\x10\x00\x00\x00\x00\x1c\xac\xae\x10\x00\x00\x00\x00\x1d\x9c\x9f\x10\x00\x00\x00\x00\x1e\x8c\x90\x10\x00\x00\x00\x00\x1f|\x81\x10\x00\x00\x00\x00 lr\x10\x00\x00\x00\x00!\\c\x10\x00\x00\x00\x00\"LT\x10\x00\x00" +
-	"\x00\x00#<E\x10\x00\x00\x00\x00$,6\x10\x00\x00\x00\x00%\x1c'\x10\x00\x00\x00\x00&\f\x18\x10\x00\x00\x00\x00'\x05C\x90\x00\x00\x00\x00'\xf54\x90\x00\x00\x00\x00(\xe5%\x90\x00\x00\x00\x00)\xd5" +
-	"\x16\x90\x00\x00\x00\x00*\xc5\a\x90\x00\x00\x00\x00+\xb4\xf8\x90\x00\x00\x00\x00,\xa4\xe9\x90\x00\x00\x00\x00-\x94ڐ\x00\x00\x00\x00.\x84ː\x00\x00\x00\x00/t\xbc\x90\x00\x00\x00\x000d\xad\x90\x00\x00" +
-	"\x00\x001]\xd9\x10\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x00\x1c \x00\x05\x00\x00*0\x01\x00EES" +
-	"T\x00EET\x00\nEET-2EEST,M3.5.0/3,M10.5.0/4\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00tX\xbe\xe4o\x00\x00\x00o\x00" +
-	"\x00\x00\x03\x00\x00\x00ESTTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00" +
-	"TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x04\xff\xff\xb9\xb0\x00\x00EST\x00\nEST5\n" +
-	"PK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe7/\xebT\xb7\x03\x00\x00\xb7\x03\x00\x00\a\x00\x00\x00EST5EDTTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00X\x00\x00\x00\x04\x00\x00\x00\x10\xff\xff\xff\xff\x9e\xa6\x1ep\xff\xff\xff\xff\x9f\xba\xeb`\xff\xff\xff\xff\xa0\x86\x00p\xff\xff\xff\xff\xa1\x9a\xcd`\xff\xff\xff\xffˈ\xf0p\xff\xff\xff\xff\xd2#\xf4p" +
-	"\xff\xff\xff\xff\xd2`\xfb\xe0\xff\xff\xff\xff\xfa\xf8X\xf0\xff\xff\xff\xff\xfb\xe8;\xe0\xff\xff\xff\xff\xfc\xd8:\xf0\xff\xff\xff\xff\xfd\xc8\x1d\xe0\xff\xff\xff\xff\xfe\xb8\x1c\xf0\xff\xff\xff\xff\xff\xa7\xff\xe0\x00\x00\x00\x00" +
-	"\x00\x97\xfe\xf0\x00\x00\x00\x00\x01\x87\xe1\xe0\x00\x00\x00\x00\x02w\xe0\xf0\x00\x00\x00\x00\x03p\xfe`\x00\x00\x00\x00\x04`\xfdp\x00\x00\x00\x00\x05P\xe0`\x00\x00\x00\x00\x06@\xdfp\x00\x00\x00\x00\a0\xc2`" +
-	"\x00\x00\x00\x00\a\x8d\x19p\x00\x00\x00\x00\t\x10\xa4`\x00\x00\x00\x00\t\xad\x94\xf0\x00\x00\x00\x00\n\xf0\x86`\x00\x00\x00\x00\v\xe0\x85p\x00\x00\x00\x00\f٢\xe0\x00\x00\x00\x00\r\xc0gp\x00\x00\x00\x00" +
-	"\x0e\xb9\x84\xe0\x00\x00\x00\x00\x0f\xa9\x83\xf0\x00\x00\x00\x00\x10\x99f\xe0\x00\x00\x00\x00\x11\x89e\xf0\x00\x00\x00\x00\x12yH\xe0\x00\x00\x00\x00\x13iG\xf0\x00\x00\x00\x00\x14Y*\xe0\x00\x00\x00\x00\x15I)\xf0" +
-	"\x00\x00\x00\x00\x169\f\xe0\x00\x00\x00\x00\x17)\v\xf0\x00\x00\x00\x00\x18\")`\x00\x00\x00\x00\x19\b\xed\xf0\x00\x00\x00\x00\x1a\x02\v`\x00\x00\x00\x00\x1a\xf2\np\x00\x00\x00\x00\x1b\xe1\xed`\x00\x00\x00\x00" +
-	"\x1c\xd1\xecp\x00\x00\x00\x00\x1d\xc1\xcf`\x00\x00\x00\x00\x1e\xb1\xcep\x00\x00\x00\x00\x1f\xa1\xb1`\x00\x00\x00\x00 v\x00\xf0\x00\x00\x00\x00!\x81\x93`\x00\x00\x00\x00\"U\xe2\xf0\x00\x00\x00\x00#j\xaf\xe0" +
-	"\x00\x00\x00\x00$5\xc4\xf0\x00\x00\x00\x00%J\x91\xe0\x00\x00\x00\x00&\x15\xa6\xf0\x00\x00\x00\x00'*s\xe0\x00\x00\x00\x00'\xfe\xc3p\x00\x00\x00\x00)\nU\xe0\x00\x00\x00\x00)ޥp\x00\x00\x00\x00" +
-	"*\xea7\xe0\x00\x00\x00\x00+\xbe\x87p\x00\x00\x00\x00,\xd3T`\x00\x00\x00\x00-\x9eip\x00\x00\x00\x00.\xb36`\x00\x00\x00\x00/~Kp\x00\x00\x00\x000\x93\x18`\x00\x00\x00\x001gg\xf0" +
-	"\x00\x00\x00\x002r\xfa`\x00\x00\x00\x003GI\xf0\x00\x00\x00\x004R\xdc`\x00\x00\x00\x005'+\xf0\x00\x00\x00\x0062\xbe`\x00\x00\x00\x007\a\r\xf0\x00\x00\x00\x008\x1b\xda\xe0\x00\x00\x00\x00" +
-	"8\xe6\xef\xf0\x00\x00\x00\x009\xfb\xbc\xe0\x00\x00\x00\x00:\xc6\xd1\xf0\x00\x00\x00\x00;۞\xe0\x00\x00\x00\x00<\xaf\xeep\x00\x00\x00\x00=\xbb\x80\xe0\x00\x00\x00\x00>\x8f\xd0p\x00\x00\x00\x00?\x9bb\xe0" +
-	"\x00\x00\x00\x00@o\xb2p\x00\x00\x00\x00A\x84\x7f`\x00\x00\x00\x00BO\x94p\x00\x00\x00\x00Cda`\x00\x00\x00\x00D/vp\x00\x00\x00\x00EDC`\x00\x00\x00\x00E\xf3\xa8\xf0\x01\x00\x01\x00" +
-	"\x02\x03\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01" +
-	"\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\xff\xff\xb9\xb0\x00\x04\xff\xff\xc7\xc0\x01\x00\xff\xff\xc7\xc0\x01\b\xff\xff\xc7\xc0\x01\fEDT\x00EST\x00EWT\x00" +
-	"EPT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12tnj\xfc\x04\x00\x00\xfc\x04\x00\x00\x05\x00\x00\x00Eg" +
-	"yptTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x03\x00\x00\x00\r\xff\xff\xff\xff}\xbdM\xab\xff\xff\xff\xffȓ\xb4\xe0\xff\xff\xff\xff\xc8\xfa" +
-	"{\xd0\xff\xff\xff\xff\xc9\xfc\xef\xe0\xff\xff\xff\xff\xca\xc7\xe8\xd0\xff\xff\xff\xff\xcbˮ`\xff\xff\xff\xff\xcc\xdf)\xd0\xff\xff\xff\xffͬ\xe1\xe0\xff\xff\xff\xff\xce\xc6\xf4\xd0\xff\xff\xff\xffϏf\xe0\xff\xff" +
-	"\xff\xffЩy\xd0\xff\xff\xff\xffф`\xe0\xff\xff\xff\xffҊ\xadP\xff\xff\xff\xff\xe86c`\xff\xff\xff\xff\xe8\xf4-P\xff\xff\xff\xff\xea\v\xb9`\xff\xff\xff\xff\xea\xd5`\xd0\xff\xff\xff\xff\xeb\xec" +
-	"\xfa\xf0\xff\xff\xff\xff\xec\xb5m\x00\xff\xff\xff\xff\xed\xcf\x7f\xf0\xff\xff\xff\xff\xee\x97\xf2\x00\xff\xff\xff\xffﰳp\xff\xff\xff\xff\xf0y%\x80\xff\xff\xff\xff\xf1\x91\xe6\xf0\xff\xff\xff\xff\xf2ZY\x00\xff\xff" +
-	"\xff\xff\xf3s\x1ap\xff\xff\xff\xff\xf4;\x8c\x80\xff\xff\xff\xff\xf5U\x9fp\xff\xff\xff\xff\xf6\x1e\x11\x80\xff\xff\xff\xff\xf76\xd2\xf0\xff\xff\xff\xff\xf7\xffE\x00\xff\xff\xff\xff\xf9\x18\x06p\xff\xff\xff\xff\xf9\xe1" +
-	"\xca\x00\xff\xff\xff\xff\xfa\xf99\xf0\xff\xff\xff\xff\xfb\xc2\xfd\x80\xff\xff\xff\xff\xfc۾\xf0\xff\xff\xff\xff\xfd\xa5\x82\x80\xff\xff\xff\xff\xfe\xbc\xf2p\xff\xff\xff\xff\xff\x86\xb6\x00\x00\x00\x00\x00\x00\x9e%\xf0\x00\x00" +
-	"\x00\x00\x01g\xe9\x80\x00\x00\x00\x00\x02\x7fYp\x00\x00\x00\x00\x03I\x1d\x00\x00\x00\x00\x00\x04a\xdep\x00\x00\x00\x00\x05+\xa2\x00\x00\x00\x00\x00\x06C\x11\xf0\x00\x00\x00\x00\a\fՀ\x00\x00\x00\x00\b$" +
-	"Ep\x00\x00\x00\x00\b\xee\t\x00\x00\x00\x00\x00\n\x05x\xf0\x00\x00\x00\x00\n\xcf<\x80\x00\x00\x00\x00\v\xe7\xfd\xf0\x00\x00\x00\x00\f\xb1\xc1\x80\x00\x00\x00\x00\r\xc91p\x00\x00\x00\x00\x0e\x92\xf5\x00\x00\x00" +
-	"\x00\x00\x0f\xaad\xf0\x00\x00\x00\x00\x10t(\x80\x00\x00\x00\x00\x11\x8b\x98p\x00\x00\x00\x00\x12U\\\x00\x00\x00\x00\x00\x13n\x1dp\x00\x00\x00\x00\x147\xe1\x00\x00\x00\x00\x00\x15OP\xf0\x00\x00\x00\x00\x16\x19" +
-	"\x14\x80\x00\x00\x00\x00\x17\xa0\x93\xf0\x00\x00\x00\x00\x17\xfaH\x00\x00\x00\x00\x00\x19p\xa3\xf0\x00\x00\x00\x00\x19\xdb{\x80\x00\x00\x00\x00\x1a\xf4<\xf0\x00\x00\x00\x00\x1b\xbe\x00\x80\x00\x00\x00\x00\x1c\xd5pp\x00\x00" +
-	"\x00\x00\x1d\x9f4\x00\x00\x00\x00\x00\x1e\xb6\xa3\xf0\x00\x00\x00\x00\x1f\x80g\x80\x00\x00\x00\x00 \x97\xd7p\x00\x00\x00\x00!a\x9b\x00\x00\x00\x00\x00\"z\\p\x00\x00\x00\x00#D \x00\x00\x00\x00\x00$b" +
-	"'p\x00\x00\x00\x00%%S\x80\x00\x00\x00\x00&<\xc3p\x00\x00\x00\x00'\x06\x87\x00\x00\x00\x00\x00(\x1d\xf6\xf0\x00\x00\x00\x00(纀\x00\x00\x00\x00*\x00{\xf0\x00\x00\x00\x00*\xca?\x80\x00\x00" +
-	"\x00\x00+\xe1\xafp\x00\x00\x00\x00,\xabs\x00\x00\x00\x00\x00-\xc2\xe2\xf0\x00\x00\x00\x00.\x8c\xa6\x80\x00\x00\x00\x00/\xa0\x13\xe0\x00\x00\x00\x000k\f\xd0\x00\x00\x00\x001\x7f\xf5\xe0\x00\x00\x00\x002J" +
-	"\xee\xd0\x00\x00\x00\x003_\xd7\xe0\x00\x00\x00\x004*\xd0\xd0\x00\x00\x00\x005?\xb9\xe0\x00\x00\x00\x006\n\xb2\xd0\x00\x00\x00\x007(\xd6`\x00\x00\x00\x007\xf3\xcfP\x00\x00\x00\x009\b\xb8`\x00\x00" +
-	"\x00\x009ӱP\x00\x00\x00\x00:\xe8\x9a`\x00\x00\x00\x00;\xb3\x93P\x00\x00\x00\x00<\xc8|`\x00\x00\x00\x00=\x93uP\x00\x00\x00\x00>\xa8^`\x00\x00\x00\x00?sWP\x00\x00\x00\x00@\x91" +
-	"z\xe0\x00\x00\x00\x00A\\s\xd0\x00\x00\x00\x00Bq\\\xe0\x00\x00\x00\x00C<U\xd0\x00\x00\x00\x00DQ>\xe0\x00\x00\x00\x00E\x12\xfdP\x00\x00\x00\x00F1 \xe0\x00\x00\x00\x00F\xe0jP\x00\x00" +
-	"\x00\x00H\x11\x02\xe0\x00\x00\x00\x00H\xb7\x11\xd0\x00\x00\x00\x00I\xf0\xe4\xe0\x00\x00\x00\x00J\x8d\xb9P\x00\x00\x00\x00K\xda\x01`\x00\x00\x00\x00La\xbd\xd0\x00\x00\x00\x00L\x89X\xe0\x00\x00\x00\x00L\xa4" +
-	"\xfaP\x00\x00\x00\x00Su8\xe0\x00\x00\x00\x00S\xac\x89\xd0\x00\x00\x00\x00Sڼ`\x00\x00\x00\x00T$\x82P\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x00\x00\x1dU\x00\x00\x00\x00*0\x01\x04\x00\x00\x1c \x00\tL" +
-	"MT\x00EEST\x00EET\x00\nEET-2\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa1\xd6jL\xd8\x05\x00\x00\xd8\x05\x00\x00\x04\x00\x00\x00EireTZif2\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x91\x00\x00\x00\b\x00\x00\x00\x14\xff\xff\xff\xffW\xd1\n\xf1\xff\xff\xff\xff\x9b&\xb3\x91\xff\xff\xff\xff\x9b\xd6\v\x11\xff\xff\xff\xff\x9c\xcf0\xa0" +
-	"\xff\xff\xff\xff\x9d\xa4à\xff\xff\xff\xff\x9e\x9c\x9d\xa0\xff\xff\xff\xff\x9f\x97\x1a\xa0\xff\xff\xff\xff\xa0\x85\xba \xff\xff\xff\xff\xa1v\xfc\xa0\xff\xff\xff\xff\xa2e\x9c \xff\xff\xff\xff\xa3{Ƞ\xff\xff\xff\xff" +
-	"\xa4N\xb8\xa0\xff\xff\xff\xff\xa5?\xfb \xff\xff\xff\xff\xa6%` \xff\xff\xff\xff\xa7'\xc6 \xff\xff\xff\xff\xa8*, \xff\xff\xff\xff\xa8\xeb\xf8\xa0\xff\xff\xff\xff\xaa\x00Ӡ\xff\xff\xff\xff\xaa\xd5\x15 " +
-	"\xff\xff\xff\xff\xab\xe9\xf0 \xff\xff\xff\xff\xac\xc7l \xff\xff\xff\xff\xad\xc9\xd2 \xff\xff\xff\xff\xae\xa7N \xff\xff\xff\xff\xaf\xa0y\xa0\xff\xff\xff\xff\xb0\x870 \xff\xff\xff\xff\xb1\x92Р\xff\xff\xff\xff" +
-	"\xb2pL\xa0\xff\xff\xff\xff\xb3r\xb2\xa0\xff\xff\xff\xff\xb4P.\xa0\xff\xff\xff\xff\xb5IZ \xff\xff\xff\xff\xb60\x10\xa0\xff\xff\xff\xff\xb72v\xa0\xff\xff\xff\xff\xb8\x0f\xf2\xa0\xff\xff\xff\xff\xb9\x12X\xa0" +
-	"\xff\xff\xff\xff\xb9\xefԠ\xff\xff\xff\xff\xba\xe9\x00 \xff\xff\xff\xff\xbb\xd8\xf1 \xff\xff\xff\xff\xbc\xdbW \xff\xff\xff\xff\xbd\xb8\xd3 \xff\xff\xff\xff\xbe\xb1\xfe\xa0\xff\xff\xff\xff\xbf\x98\xb5 \xff\xff\xff\xff" +
-	"\xc0\x9b\x1b \xff\xff\xff\xff\xc1x\x97 \xff\xff\xff\xff\xc2z\xfd \xff\xff\xff\xff\xc3Xy \xff\xff\xff\xff\xc4Q\xa4\xa0\xff\xff\xff\xff\xc58[ \xff\xff\xff\xff\xc6:\xc1 \xff\xff\xff\xff\xc7X֠" +
-	"\xff\xff\xff\xff\xc7\xda\t\xa0\xff\xff\xff\xff\xd4I\xe0 \xff\xff\xff\xff\xd5\x1e!\xa0\xff\xff\xff\xff\xd6N\xac \xff\xff\xff\xff\xd7,( \xff\xff\xff\xff\xd8.\x8e \xff\xff\xff\xff\xd8\xf9\x95 \xff\xff\xff\xff" +
-	"\xda\x0ep \xff\xff\xff\xff\xda\xeb\xec \xff\xff\xff\xff\xdb\xe5\x17\xa0\xff\xff\xff\xff\xdc\xcb\xce \xff\xff\xff\xff\xdd\xc4\xf9\xa0\xff\xff\xff\xff\u07b4\xea\xa0\xff\xff\xff\xff߮\x16 \xff\xff\xff\xff\xe0\x94̠" +
-	"\xff\xff\xff\xff\xe1rH\xa0\xff\xff\xff\xff\xe2kt \xff\xff\xff\xff\xe3R*\xa0\xff\xff\xff\xff\xe4T\x90\xa0\xff\xff\xff\xff\xe52\f\xa0\xff\xff\xff\xff\xe6=\xad \xff\xff\xff\xff\xe7\x1b) \xff\xff\xff\xff" +
-	"\xe8\x14T\xa0\xff\xff\xff\xff\xe8\xfb\v \xff\xff\xff\xff\xe9\xfdq \xff\xff\xff\xff\xea\xda\xed \xff\xff\xff\xff\xeb\xddS \xff\xff\xff\xff\xec\xba\xcf \xff\xff\xff\xff\xed\xb3\xfa\xa0\xff\xff\xff\xff\ue6b1 " +
-	"\xff\xff\xff\xff\xef\x81g\xa0\xff\xff\xff\xff\xf0\x9f} \xff\xff\xff\xff\xf1aI\xa0\xff\xff\xff\xff\xf2\x7f_ \xff\xff\xff\xff\xf3Jf \xff\xff\xff\xff\xf4_A \xff\xff\xff\xff\xf5!\r\xa0\xff\xff\xff\xff" +
-	"\xf6?# \xff\xff\xff\xff\xf7\x00\xef\xa0\xff\xff\xff\xff\xf8\x1f\x05 \xff\xff\xff\xff\xf8\xe0Ѡ\xff\xff\xff\xff\xf9\xfe\xe7 \xff\xff\xff\xff\xfa\xc0\xb3\xa0\xff\xff\xff\xff\xfb\xe8\x03\xa0\xff\xff\xff\xff\xfc{\xab\xa0" +
-	"\xff\xff\xff\xff\xfdǻp\x00\x00\x00\x00\x03p\xc6 \x00\x00\x00\x00\x04)X \x00\x00\x00\x00\x05P\xa8 \x00\x00\x00\x00\x06\t: \x00\x00\x00\x00\a0\x8a \x00\x00\x00\x00\a\xe9\x1c \x00\x00\x00\x00" +
-	"\t\x10l \x00\x00\x00\x00\t\xc8\xfe \x00\x00\x00\x00\n\xf0N \x00\x00\x00\x00\v\xb2\x1a\xa0\x00\x00\x00\x00\f\xd00 \x00\x00\x00\x00\r\x91\xfc\xa0\x00\x00\x00\x00\x0e\xb0\x12 \x00\x00\x00\x00\x0fqޠ" +
-	"\x00\x00\x00\x00\x10\x99.\xa0\x00\x00\x00\x00\x11Q\xc0\xa0\x00\x00\x00\x00\x12y\x10\xa0\x00\x00\x00\x00\x131\xa2\xa0\x00\x00\x00\x00\x14X\xf2\xa0\x00\x00\x00\x00\x15#\xeb\x90\x00\x00\x00\x00\x168Ɛ\x00\x00\x00\x00" +
-	"\x17\x03͐\x00\x00\x00\x00\x18\x18\xa8\x90\x00\x00\x00\x00\x18㯐\x00\x00\x00\x00\x19\xf8\x8a\x90\x00\x00\x00\x00\x1aÑ\x90\x00\x00\x00\x00\x1b\xe1\xa7\x10\x00\x00\x00\x00\x1c\xac\xae\x10\x00\x00\x00\x00\x1d\xc1\x89\x10" +
-	"\x00\x00\x00\x00\x1e\x8c\x90\x10\x00\x00\x00\x00\x1f\xa1k\x10\x00\x00\x00\x00 lr\x10\x00\x00\x00\x00!\x81M\x10\x00\x00\x00\x00\"LT\x10\x00\x00\x00\x00#a/\x10\x00\x00\x00\x00$,6\x10\x00\x00\x00\x00" +
-	"%JK\x90\x00\x00\x00\x00&\f\x18\x10\x00\x00\x00\x00'*-\x90\x00\x00\x00\x00'\xf54\x90\x00\x00\x00\x00)\n\x0f\x90\x00\x00\x00\x00)\xd5\x16\x90\x00\x00\x00\x00*\xe9\xf1\x90\x00\x00\x00\x00+\xb4\xf8\x90" +
-	"\x00\x00\x00\x00,\xc9Ӑ\x00\x00\x00\x00-\x94ڐ\x00\x00\x00\x00.\xa9\xb5\x90\x00\x00\x00\x00/t\xbc\x90\x00\x00\x00\x000\x89\x97\x90\x00\x00\x00\x001]\xd9\x10\x01\x02\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03" +
-	"\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05" +
-	"\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06" +
-	"\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\xff\xff\xfa\x0f\x00\x00\xff\xff\xfa\x0f\x00\x04\x00\x00\b\x1f\x01\b\x00\x00\x0e\x10\x01\f\x00\x00\x00\x00\x00\x10\x00\x00\x0e\x10\x01\b\x00\x00\x00\x00\x01\x10\x00\x00\x0e\x10\x00" +
-	"\bLMT\x00DMT\x00IST\x00BST\x00GMT\x00\nIST-1GMT0,M10.5.0,M3.5.0/1\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00P\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\a\x00\x00\x00Etc/GMTTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" +
-	"\x04\x00\x00\x00\x00\x00\x00GMT\x00\nGMT0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00P\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\t\x00\x00\x00Etc/GMT+0TZif" +
-	"2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00GMT\x00\nGMT0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x005\xb8\xe8\x86q\x00\x00\x00q\x00\x00\x00\t\x00\x00\x00Etc/GMT+1TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" +
-	"\x04\xff\xff\xf1\xf0\x00\x00-01\x00\n<-01>1\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8e\x1569r\x00\x00\x00r\x00\x00\x00\n\x00\x00\x00Etc/GMT+10T" +
-	"Zif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x04\xff\xffs`\x00\x00-10\x00\n<-10>10\nPK\x03\x04\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00)\xb9\xbe\x9dr\x00\x00\x00r\x00\x00\x00\n\x00\x00\x00Etc/GMT+11TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x01\x00\x00\x00\x04\xff\xffeP\x00\x00-11\x00\n<-11>11\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe5\xf38cr\x00\x00\x00r\x00\x00\x00\n\x00\x00\x00Etc" +
-	"/GMT+12TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZ" +
-	"if2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x04\xff\xffW@\x00\x00-12\x00\n<-12>12" +
-	"\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa9{\xa2qq\x00\x00\x00q\x00\x00\x00\t\x00\x00\x00Etc/GMT+2TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x04\xff\xff\xe3\xe0\x00\x00-02\x00\n<-02>2\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00e\xcb\xe9Qq\x00\x00\x00q\x00\x00\x00\t" +
-	"\x00\x00\x00Etc/GMT+3TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00" +
-	"\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x04\xff\xff\xd5\xd0\x00\x00-03\x00\n<-" +
-	"03>3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd0\xfaFDq\x00\x00\x00q\x00\x00\x00\t\x00\x00\x00Etc/GMT+4TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x04\xff\xff\xc7\xc0\x00\x00-04\x00\n<-04>4\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd4X\x9b\xf3q\x00\x00\x00q" +
-	"\x00\x00\x00\t\x00\x00\x00Etc/GMT+5TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01" +
-	"\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x04\xff\xff\xb9\xb0\x00\x00-05" +
-	"\x00\n<-05>5\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00H\x9b\xd1\x04q\x00\x00\x00q\x00\x00\x00\t\x00\x00\x00Etc/GMT+6TZif2\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x04\xff\xff\xab\xa0\x00\x00-06\x00\n<-06>6\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84+\x9a$q" +
-	"\x00\x00\x00q\x00\x00\x00\t\x00\x00\x00Etc/GMT+7TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" +
-	"\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x04\xff\xff\x9d\x90\x00" +
-	"\x00-07\x00\n<-07>7\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\"\xf8\x8f/q\x00\x00\x00q\x00\x00\x00\t\x00\x00\x00Etc/GMT+8TZif2\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x04\xff\xff\x8f\x80\x00\x00-08\x00\n<-08>8\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84" +
-	"\x19\xb3\tq\x00\x00\x00q\x00\x00\x00\t\x00\x00\x00Etc/GMT+9TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x04\xff" +
-	"\xff\x81p\x00\x00-09\x00\n<-09>9\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00P\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\t\x00\x00\x00Etc/GMT-0TZif" +
-	"2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00GMT\x00\nGMT0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\xf7\x1ac\xc3r\x00\x00\x00r\x00\x00\x00\t\x00\x00\x00Etc/GMT-1TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" +
-	"\x04\x00\x00\x0e\x10\x00\x00+01\x00\n<+01>-1\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd9|\xbd7s\x00\x00\x00s\x00\x00\x00\n\x00\x00\x00Etc/GMT-10" +
-	"TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x04\x00\x00\x8c\xa0\x00\x00+10\x00\n<+10>-10\nPK\x03\x04\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb2\xab\xd1Is\x00\x00\x00s\x00\x00\x00\n\x00\x00\x00Etc/GMT-11TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x01\x00\x00\x00\x04\x00\x00\x9a\xb0\x00\x00+11\x00\n<+11>-11\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf7\x19s\x81s\x00\x00\x00s\x00\x00\x00\n\x00\x00\x00" +
-	"Etc/GMT-12TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00" +
-	"\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x04\x00\x00\xa8\xc0\x00\x00+12\x00\n<+12" +
-	">-12\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90`N\xe8s\x00\x00\x00s\x00\x00\x00\n\x00\x00\x00Etc/GMT-13TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x04\x00\x00\xb6\xd0\x00\x00+13\x00\n<+13>-13\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00,{\xdc;s\x00" +
-	"\x00\x00s\x00\x00\x00\n\x00\x00\x00Etc/GMT-14TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" +
-	"\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x04\x00\x00\xc4\xe0\x00" +
-	"\x00+14\x00\n<+14>-14\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbc\x19y\x04r\x00\x00\x00r\x00\x00\x00\t\x00\x00\x00Etc/GMT-2TZif2\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x04\x00\x00\x1c \x00\x00+02\x00\n<+02>-2\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x9c\xfcm\x99r\x00\x00\x00r\x00\x00\x00\t\x00\x00\x00Etc/GMT-3TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" +
-	"\x00\x04\x00\x00*0\x00\x00+03\x00\n<+03>-3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00k\x19<Qr\x00\x00\x00r\x00\x00\x00\t\x00\x00\x00Etc/GMT-4" +
-	"TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x04\x00\x008@\x00\x00+04\x00\n<+04>-4\nPK\x03\x04\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00!\xd6~wr\x00\x00\x00r\x00\x00\x00\t\x00\x00\x00Etc/GMT-5TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x01\x00\x00\x00\x04\x00\x00FP\x00\x00+05\x00\n<+05>-5\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00j\xd5d\xb0r\x00\x00\x00r\x00\x00\x00\t\x00\x00\x00Etc" +
-	"/GMT-6TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZi" +
-	"f2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x04\x00\x00T`\x00\x00+06\x00\n<+06>-6\n" +
-	"PK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00J0p-r\x00\x00\x00r\x00\x00\x00\t\x00\x00\x00Etc/GMT-7TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x04\x00\x00bp\x00\x00+07\x00\n<+07>-7\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc5\x18\xb6\xfbr\x00\x00\x00r\x00\x00\x00\t" +
-	"\x00\x00\x00Etc/GMT-8TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00" +
-	"\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x04\x00\x00p\x80\x00\x00+08\x00\n<+" +
-	"08>-8\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfc\x19@\xb9r\x00\x00\x00r\x00\x00\x00\t\x00\x00\x00Etc/GMT-9TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x04\x00\x00~\x90\x00\x00+09\x00\n<+09>-9\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00P\xda\xfa\x03o\x00\x00" +
-	"\x00o\x00\x00\x00\b\x00\x00\x00Etc/GMT0TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" +
-	"\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00GM" +
-	"T\x00\nGMT0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00P\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\r\x00\x00\x00Etc/GreenwichTZif2\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00GMT\x00\nGMT0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9f.\xe4x" +
-	"o\x00\x00\x00o\x00\x00\x00\a\x00\x00\x00Etc/UCTTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" +
-	"\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00" +
-	"UTC\x00\nUTC0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00\a\x00\x00\x00Etc/UTCTZif2\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00UTC\x00\nUTC0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9f.\xe4xo\x00\x00\x00" +
-	"o\x00\x00\x00\r\x00\x00\x00Etc/UniversalTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x04\x00\x00\x00\x00" +
-	"\x00\x00UTC\x00\nUTC0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00\b\x00\x00\x00Etc/ZuluTZif2\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00UTC\x00\nUTC0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00o\xbc\x831O" +
-	"\x04\x00\x00O\x04\x00\x00\x10\x00\x00\x00Europe/AmsterdamTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00f\x00\x00\x00\x06\x00\x00" +
-	"\x00\x1a\xff\xff\xff\xffV\xb6\xdf\xe6\xff\xff\xff\xffm\xe8\xc8\x00\xff\xff\xff\xff\x98DI\x80\xff\xff\xff\xff\x9b\f%p\xff\xff\xff\xff\x9b\xd5\xda\xf0\xff\xff\xff\xff\x9cٮ\x90\xff\xff\xff\xff\x9d\xa4\xb5\x90\xff\xff" +
-	"\xff\xff\x9e\xb9\x90\x90\xff\xff\xff\xff\x9f\x84\x97\x90\xff\xff\xff\xff\x9f\xce\xf80\xff\xff\xff\xff\xa0`\xa5\xf0\xff\xff\xff\xff\xa1~\xbbp\xff\xff\xff\xff\xa2.\x12\xf0\xff\xff\xff\xff\xa3zL\xf0\xff\xff\xff\xff\xa45" +
-	"\x81\xf0\xff\xff\xff\xff\xa5^#p\xff\xff\xff\xff\xa6%5\xf0\xff\xff\xff\xff\xa7'\x9b\xf0\xff\xff\xff\xff\xa8*\x01\xf0\xff\xff\xff\xff\xa9\a}\xf0\xff\xff\xff\xff\xa9\xee4p\xff\xff\xff\xff\xaa\xe7_\xf0\xff\xff" +
-	"\xff\xff\xab\xd7P\xf0\xff\xff\xff\xff\xac\xc7A\xf0\xff\xff\xff\xff\xadɧ\xf0\xff\xff\xff\xff\xae\xa7#\xf0\xff\xff\xff\xff\xaf\xa0Op\xff\xff\xff\xff\xb0\x87\x05\xf0\xff\xff\xff\xff\xb1\x89k\xf0\xff\xff\xff\xff\xb2p" +
-	"L\xa0\xff\xff\xff\xff\xb3r\xb2\xa0\xff\xff\xff\xff\xb4P.\xa0\xff\xff\xff\xff\xb5IZ \xff\xff\xff\xff\xb60\x10\xa0\xff\xff\xff\xff\xb72v\xa0\xff\xff\xff\xff\xb8\x0f\xf2\xa0\xff\xff\xff\xff\xb8\xff\xe3\xa0\xff\xff" +
-	"\xff\xff\xb9\xefԠ\xff\xff\xff\xff\xba\u058b \xff\xff\xff\xff\xbb\xd8\xf1 \xff\xff\xff\xff\xbc\xc8\xe2 \xff\xff\xff\xff\xbd\xb8\xd3 \xff\xff\xff\xff\xbe\x9f\x89\xa0\xff\xff\xff\xff\xbf\x98\xb5 \xff\xff\xff\xff\xc0\x9b" +
-	"\x1b \xff\xff\xff\xff\xc1x\x97 \xff\xff\xff\xff\xc2h\x88 \xff\xff\xff\xff\xc3Xy \xff\xff\xff\xff\xc4?/\xa0\xff\xff\xff\xff\xc58[ \xff\xff\xff\xff\xc6:\xc1 \xff\xff\xff\xff\xc7X֠\xff\xff" +
-	"\xff\xff\xc7\xda\t\xa0\xff\xff\xff\xff\xc8J\x19 \xff\xff\xff\xff\xcc\xe7K\x10\xff\xff\xff\xffͩ\x17\x90\xff\xff\xff\xff\u03a2C\x10\xff\xff\xff\xffϒ4\x10\xff\xff\xff\xff\xd0n^\x90\xff\xff\xff\xff\xd1r" +
-	"\x16\x10\xff\xff\xff\xff\xd2N@\x90\xff\xff\xff\xffӑ@\x10\xff\xff\xff\xff\xd4K#\x90\x00\x00\x00\x00\r\xa4c\x90\x00\x00\x00\x00\x0e\x8b\x1a\x10\x00\x00\x00\x00\x0f\x84E\x90\x00\x00\x00\x00\x10t6\x90\x00\x00" +
-	"\x00\x00\x11d'\x90\x00\x00\x00\x00\x12T\x18\x90\x00\x00\x00\x00\x13MD\x10\x00\x00\x00\x00\x143\xfa\x90\x00\x00\x00\x00\x15#\xeb\x90\x00\x00\x00\x00\x16\x13ܐ\x00\x00\x00\x00\x17\x03͐\x00\x00\x00\x00\x17\xf3" +
-	"\xbe\x90\x00\x00\x00\x00\x18㯐\x00\x00\x00\x00\x19Ӡ\x90\x00\x00\x00\x00\x1aÑ\x90\x00\x00\x00\x00\x1b\xbc\xbd\x10\x00\x00\x00\x00\x1c\xac\xae\x10\x00\x00\x00\x00\x1d\x9c\x9f\x10\x00\x00\x00\x00\x1e\x8c\x90\x10\x00\x00" +
-	"\x00\x00\x1f|\x81\x10\x00\x00\x00\x00 lr\x10\x00\x00\x00\x00!\\c\x10\x00\x00\x00\x00\"LT\x10\x00\x00\x00\x00#<E\x10\x00\x00\x00\x00$,6\x10\x00\x00\x00\x00%\x1c'\x10\x00\x00\x00\x00&\f" +
-	"\x18\x10\x00\x00\x00\x00'\x05C\x90\x00\x00\x00\x00'\xf54\x90\x00\x00\x00\x00(\xe5%\x90\x00\x00\x00\x00)\xd5\x16\x90\x00\x00\x00\x00*\xc5\a\x90\x00\x00\x00\x00+\xb4\xf8\x90\x00\x00\x00\x00,\xa4\xe9\x90\x00\x00" +
-	"\x00\x00-\x94ڐ\x00\x00\x00\x00.\x84ː\x00\x00\x00\x00/t\xbc\x90\x00\x00\x00\x000d\xad\x90\x00\x00\x00\x001]\xd9\x10\x01\x02\x03\x04\x03\x04\x03\x04\x03\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02" +
-	"\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04" +
-	"\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x00\x00\x04\x1a\x00\x00\x00\x00\x04\x1a\x00\x04\x00\x00\x00\x00\x00\b\x00\x00\x0e\x10\x00\f\x00\x00\x1c \x01\x10\x00\x00\x0e\x10\x01\x15LMT\x00" +
-	"BMT\x00WET\x00CET\x00CEST\x00WEST\x00\nCET-1CEST,M3.5.0,M10.5.0/3\nPK\x03\x04\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00ߜvυ\x01\x00\x00\x85\x01\x00\x00\x0e\x00\x00\x00Europe/AndorraTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x19\x00\x00\x00\x04\x00\x00\x00\x11\xff\xff\xff\xff~6\xb3\x94\xff\xff\xff\xff\xd4A\xdb\x00\x00\x00\x00\x00\x1c\xac\xae\x10\x00\x00\x00\x00\x1d\x9c\x9f\x10\x00\x00\x00\x00\x1e\x8c\x90\x10\x00\x00\x00\x00\x1f|\x81\x10\x00\x00\x00" +
-	"\x00 lr\x10\x00\x00\x00\x00!\\c\x10\x00\x00\x00\x00\"LT\x10\x00\x00\x00\x00#<E\x10\x00\x00\x00\x00$,6\x10\x00\x00\x00\x00%\x1c'\x10\x00\x00\x00\x00&\f\x18\x10\x00\x00\x00\x00'\x05C" +
-	"\x90\x00\x00\x00\x00'\xf54\x90\x00\x00\x00\x00(\xe5%\x90\x00\x00\x00\x00)\xd5\x16\x90\x00\x00\x00\x00*\xc5\a\x90\x00\x00\x00\x00+\xb4\xf8\x90\x00\x00\x00\x00,\xa4\xe9\x90\x00\x00\x00\x00-\x94ڐ\x00\x00\x00" +
-	"\x00.\x84ː\x00\x00\x00\x00/t\xbc\x90\x00\x00\x00\x000d\xad\x90\x00\x00\x00\x001]\xd9\x10\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x00\x00\x01l\x00\x00" +
-	"\x00\x00\x00\x00\x00\x04\x00\x00\x0e\x10\x00\b\x00\x00\x1c \x01\fLMT\x00WET\x00CET\x00CEST\x00\nCET-1CEST,M3.5.0,M10.5.0" +
-	"/3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00]i\x11u\xd6\x02\x00\x00\xd6\x02\x00\x00\x10\x00\x00\x00Europe/AstrakhanTZif2\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00@\x00\x00\x00\x05\x00\x00\x00\x10\xff\xff\xff\xff\xaa\x18Et\xff\xff\xff\xff\xb5\xa4\vP\x00\x00\x00\x00\x15'\x99\xc0\x00\x00\x00\x00\x16\x18\xce0\x00\x00\x00\x00" +
-	"\x17\b\xcd@\x00\x00\x00\x00\x17\xfa\x01\xb0\x00\x00\x00\x00\x18\xea\x00\xc0\x00\x00\x00\x00\x19\xdb50\x00\x00\x00\x00\x1a̅\xc0\x00\x00\x00\x00\x1b\xbc\x92\xe0\x00\x00\x00\x00\x1c\xac\x83\xe0\x00\x00\x00\x00\x1d\x9ct\xe0" +
-	"\x00\x00\x00\x00\x1e\x8ce\xe0\x00\x00\x00\x00\x1f|V\xe0\x00\x00\x00\x00 lG\xe0\x00\x00\x00\x00!\\8\xe0\x00\x00\x00\x00\"L)\xe0\x00\x00\x00\x00#<\x1a\xe0\x00\x00\x00\x00$,\v\xe0\x00\x00\x00\x00" +
-	"%\x1c\n\xf0\x00\x00\x00\x00&\v\xfb\xf0\x00\x00\x00\x00'\x05'p\x00\x00\x00\x00'\xf5\x18p\x00\x00\x00\x00)\xd4\xec`\x00\x00\x00\x00*\xc4\xebp\x00\x00\x00\x00+\xb4\xdcp\x00\x00\x00\x00,\xa4\xcdp" +
-	"\x00\x00\x00\x00-\x94\xbep\x00\x00\x00\x00.\x84\xafp\x00\x00\x00\x00/t\xa0p\x00\x00\x00\x000d\x91p\x00\x00\x00\x001]\xbc\xf0\x00\x00\x00\x002r\x97\xf0\x00\x00\x00\x003=\x9e\xf0\x00\x00\x00\x00" +
-	"4Ry\xf0\x00\x00\x00\x005\x1d\x80\xf0\x00\x00\x00\x0062[\xf0\x00\x00\x00\x006\xfdb\xf0\x00\x00\x00\x008\x1bxp\x00\x00\x00\x008\xddD\xf0\x00\x00\x00\x009\xfbZp\x00\x00\x00\x00:\xbd&\xf0" +
-	"\x00\x00\x00\x00;\xdb<p\x00\x00\x00\x00<\xa6Cp\x00\x00\x00\x00=\xbb\x1ep\x00\x00\x00\x00>\x86%p\x00\x00\x00\x00?\x9b\x00p\x00\x00\x00\x00@f\ap\x00\x00\x00\x00A\x84\x1c\xf0\x00\x00\x00\x00" +
-	"BE\xe9p\x00\x00\x00\x00Cc\xfe\xf0\x00\x00\x00\x00D%\xcbp\x00\x00\x00\x00EC\xe0\xf0\x00\x00\x00\x00F\x05\xadp\x00\x00\x00\x00G#\xc2\xf0\x00\x00\x00\x00G\xee\xc9\xf0\x00\x00\x00\x00I\x03\xa4\xf0" +
-	"\x00\x00\x00\x00IΫ\xf0\x00\x00\x00\x00J\xe3\x86\xf0\x00\x00\x00\x00K\xae\x8d\xf0\x00\x00\x00\x00Ḷp\x00\x00\x00\x00M\x8eo\xf0\x00\x00\x00\x00TL\x1d`\x00\x00\x00\x00V\xf7\x14p\x01\x03\x02\x03" +
-	"\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x04\x01\x04\x01\x03\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x03\x01\x03" +
-	"\x00\x00-\f\x00\x00\x00\x00*0\x00\x04\x00\x00FP\x01\b\x00\x008@\x00\f\x00\x008@\x01\fLMT\x00+03\x00+05\x00+04\x00\n<+04>-4\nPK\x03\x04\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcb*j\x8f\xaa\x02\x00\x00\xaa\x02\x00\x00\r\x00\x00\x00Europe/AthensTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x007\x00\x00\x00\x06\x00\x00\x00\x1a\xff\xff\xff\xfft?\x98D\xff\xff\xff\xff\x9b\x80!\x80\xff\xff\xff\xff\xb9|\xe9\xe0\xff\xff\xff\xff\xb9Ư\xd0\xff\xff\xff\xff\xc9\xf2c\xe0\xff\xff\xff\xff\xca\x10\xa8" +
-	"P\xff\xff\xff\xff\xcc\xe7K\x10\xff\xff\xff\xffͪL\xf0\xff\xff\xff\xff\u03a2\x18\xe0\xff\xff\xff\xffϓip\xff\xff\xff\xff\xdf\x13\x9e`\xff\xff\xff\xff߷\nP\x00\x00\x00\x00\t\xec^`\x00\x00\x00" +
-	"\x00\v\x18\xf4`\x00\x00\x00\x00\vͮ\x00\x00\x00\x00\x00\f\xbd\x9f\x00\x00\x00\x00\x00\r\xa4U\x80\x00\x00\x00\x00\x0e\x8c]\x80\x00\x00\x00\x00\x0f\x847\x80\x00\x00\x00\x00\x10j\xfc\x10\x00\x00\x00\x00\x11d{" +
-	"\xf0\x00\x00\x00\x00\x12R\xaa\xf0\x00\x00\x00\x00\x13F\x82`\x00\x00\x00\x00\x143\xc2P\x00\x00\x00\x00\x15#\xeb\x90\x00\x00\x00\x00\x16\x13ܐ\x00\x00\x00\x00\x17\x03͐\x00\x00\x00\x00\x17\xf3\xbe\x90\x00\x00\x00" +
-	"\x00\x18㯐\x00\x00\x00\x00\x19Ӡ\x90\x00\x00\x00\x00\x1aÑ\x90\x00\x00\x00\x00\x1b\xbc\xbd\x10\x00\x00\x00\x00\x1c\xac\xae\x10\x00\x00\x00\x00\x1d\x9c\x9f\x10\x00\x00\x00\x00\x1e\x8c\x90\x10\x00\x00\x00\x00\x1f|\x81" +
-	"\x10\x00\x00\x00\x00 lr\x10\x00\x00\x00\x00!\\c\x10\x00\x00\x00\x00\"LT\x10\x00\x00\x00\x00#<E\x10\x00\x00\x00\x00$,6\x10\x00\x00\x00\x00%\x1c'\x10\x00\x00\x00\x00&\f\x18\x10\x00\x00\x00" +
-	"\x00'\x05C\x90\x00\x00\x00\x00'\xf54\x90\x00\x00\x00\x00(\xe5%\x90\x00\x00\x00\x00)\xd5\x16\x90\x00\x00\x00\x00*\xc5\a\x90\x00\x00\x00\x00+\xb4\xf8\x90\x00\x00\x00\x00,\xa4\xe9\x90\x00\x00\x00\x00-\x94\xda" +
-	"\x90\x00\x00\x00\x00.\x84ː\x00\x00\x00\x00/t\xbc\x90\x00\x00\x00\x000d\xad\x90\x00\x00\x00\x001]\xd9\x10\x01\x03\x02\x03\x02\x05\x04\x05\x04\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02" +
-	"\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x00\x00\x16<\x00\x00\x00\x00\x16<\x00\x04\x00\x00*0\x01\b\x00\x00\x1c \x00\r\x00\x00\x0e\x10\x00\x11\x00\x00" +
-	"\x1c \x01\x15LMT\x00AMT\x00EEST\x00EET\x00CET\x00CEST\x00\nEET-2EEST,M3.5.0/3,M10.5.0/4\n" +
-	"PK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00k\xa4,\xb6?\x06\x00\x00?\x06\x00\x00\x0e\x00\x00\x00Europe/BelfastTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9f\x00\x00\x00\x05\x00\x00\x00\x11\xff\xff\xff\xff\x1a]\t\xcb\xff\xff\xff\xff\x9b&\xad\xa0\xff\xff\xff\xff\x9b\xd6\x05 \xff\xff\xff\xff\x9c\xcf0\xa0\xff\xff\xff\xff\x9d\xa4à\xff" +
-	"\xff\xff\xff\x9e\x9c\x9d\xa0\xff\xff\xff\xff\x9f\x97\x1a\xa0\xff\xff\xff\xff\xa0\x85\xba \xff\xff\xff\xff\xa1v\xfc\xa0\xff\xff\xff\xff\xa2e\x9c \xff\xff\xff\xff\xa3{Ƞ\xff\xff\xff\xff\xa4N\xb8\xa0\xff\xff\xff\xff\xa5" +
-	"?\xfb \xff\xff\xff\xff\xa6%` \xff\xff\xff\xff\xa7'\xc6 \xff\xff\xff\xff\xa8*, \xff\xff\xff\xff\xa8\xeb\xf8\xa0\xff\xff\xff\xff\xaa\x00Ӡ\xff\xff\xff\xff\xaa\xd5\x15 \xff\xff\xff\xff\xab\xe9\xf0 \xff" +
-	"\xff\xff\xff\xac\xc7l \xff\xff\xff\xff\xad\xc9\xd2 \xff\xff\xff\xff\xae\xa7N \xff\xff\xff\xff\xaf\xa0y\xa0\xff\xff\xff\xff\xb0\x870 \xff\xff\xff\xff\xb1\x92Р\xff\xff\xff\xff\xb2pL\xa0\xff\xff\xff\xff\xb3" +
-	"r\xb2\xa0\xff\xff\xff\xff\xb4P.\xa0\xff\xff\xff\xff\xb5IZ \xff\xff\xff\xff\xb60\x10\xa0\xff\xff\xff\xff\xb72v\xa0\xff\xff\xff\xff\xb8\x0f\xf2\xa0\xff\xff\xff\xff\xb9\x12X\xa0\xff\xff\xff\xff\xb9\xefԠ\xff" +
-	"\xff\xff\xff\xba\xe9\x00 \xff\xff\xff\xff\xbb\xd8\xf1 \xff\xff\xff\xff\xbc\xdbW \xff\xff\xff\xff\xbd\xb8\xd3 \xff\xff\xff\xff\xbe\xb1\xfe\xa0\xff\xff\xff\xff\xbf\x98\xb5 \xff\xff\xff\xff\xc0\x9b\x1b \xff\xff\xff\xff\xc1" +
-	"x\x97 \xff\xff\xff\xff\xc2z\xfd \xff\xff\xff\xff\xc3Xy \xff\xff\xff\xff\xc4Q\xa4\xa0\xff\xff\xff\xff\xc58[ \xff\xff\xff\xff\xc6:\xc1 \xff\xff\xff\xff\xc7X֠\xff\xff\xff\xff\xc7\xda\t\xa0\xff" +
-	"\xff\xff\xff\xca\x16&\x90\xff\xff\xff\xffʗY\x90\xff\xff\xff\xff\xcb\xd1\x1e\x90\xff\xff\xff\xff\xccw;\x90\xff\xff\xff\xffͱ\x00\x90\xff\xff\xff\xff\xce`X\x10\xff\xff\xff\xffϐ\xe2\x90\xff\xff\xff\xff\xd0" +
-	"n^\x90\xff\xff\xff\xff\xd1r\x16\x10\xff\xff\xff\xff\xd1\xfb2\x10\xff\xff\xff\xff\xd2i\xfe \xff\xff\xff\xff\xd3c)\xa0\xff\xff\xff\xff\xd4I\xe0 \xff\xff\xff\xff\xd5\x1e!\xa0\xff\xff\xff\xff\xd5B\xfd\x90\xff" +
-	"\xff\xff\xff\xd5\xdf\xe0\x10\xff\xff\xff\xff\xd6N\xac \xff\xff\xff\xff\xd6\xfe\x03\xa0\xff\xff\xff\xff\xd8.\x8e \xff\xff\xff\xff\xd8\xf9\x95 \xff\xff\xff\xff\xda\x0ep \xff\xff\xff\xff\xda\xeb\xec \xff\xff\xff\xff\xdb" +
-	"\xe5\x17\xa0\xff\xff\xff\xff\xdc\xcb\xce \xff\xff\xff\xff\xdd\xc4\xf9\xa0\xff\xff\xff\xff\u07b4\xea\xa0\xff\xff\xff\xff߮\x16 \xff\xff\xff\xff\xe0\x94̠\xff\xff\xff\xff\xe1rH\xa0\xff\xff\xff\xff\xe2kt \xff" +
-	"\xff\xff\xff\xe3R*\xa0\xff\xff\xff\xff\xe4T\x90\xa0\xff\xff\xff\xff\xe52\f\xa0\xff\xff\xff\xff\xe6=\xad \xff\xff\xff\xff\xe7\x1b) \xff\xff\xff\xff\xe8\x14T\xa0\xff\xff\xff\xff\xe8\xfb\v \xff\xff\xff\xff\xe9" +
-	"\xfdq \xff\xff\xff\xff\xea\xda\xed \xff\xff\xff\xff\xeb\xddS \xff\xff\xff\xff\xec\xba\xcf \xff\xff\xff\xff\xed\xb3\xfa\xa0\xff\xff\xff\xff\ue6b1 \xff\xff\xff\xff\xef\x81g\xa0\xff\xff\xff\xff\xf0\x9f} \xff" +
-	"\xff\xff\xff\xf1aI\xa0\xff\xff\xff\xff\xf2\x7f_ \xff\xff\xff\xff\xf3Jf \xff\xff\xff\xff\xf4_A \xff\xff\xff\xff\xf5!\r\xa0\xff\xff\xff\xff\xf6?# \xff\xff\xff\xff\xf7\x00\xef\xa0\xff\xff\xff\xff\xf8" +
-	"\x1f\x05 \xff\xff\xff\xff\xf8\xe0Ѡ\xff\xff\xff\xff\xf9\xfe\xe7 \xff\xff\xff\xff\xfa\xc0\xb3\xa0\xff\xff\xff\xff\xfb\xe8\x03\xa0\xff\xff\xff\xff\xfc{\xab\xa0\xff\xff\xff\xff\xfdǻp\x00\x00\x00\x00\x03p\xc6 \x00" +
-	"\x00\x00\x00\x04)X \x00\x00\x00\x00\x05P\xa8 \x00\x00\x00\x00\x06\t: \x00\x00\x00\x00\a0\x8a \x00\x00\x00\x00\a\xe9\x1c \x00\x00\x00\x00\t\x10l \x00\x00\x00\x00\t\xc8\xfe \x00\x00\x00\x00\n" +
-	"\xf0N \x00\x00\x00\x00\v\xb2\x1a\xa0\x00\x00\x00\x00\f\xd00 \x00\x00\x00\x00\r\x91\xfc\xa0\x00\x00\x00\x00\x0e\xb0\x12 \x00\x00\x00\x00\x0fqޠ\x00\x00\x00\x00\x10\x99.\xa0\x00\x00\x00\x00\x11Q\xc0\xa0\x00" +
-	"\x00\x00\x00\x12y\x10\xa0\x00\x00\x00\x00\x131\xa2\xa0\x00\x00\x00\x00\x14X\xf2\xa0\x00\x00\x00\x00\x15#\xeb\x90\x00\x00\x00\x00\x168Ɛ\x00\x00\x00\x00\x17\x03͐\x00\x00\x00\x00\x18\x18\xa8\x90\x00\x00\x00\x00\x18" +
-	"㯐\x00\x00\x00\x00\x19\xf8\x8a\x90\x00\x00\x00\x00\x1aÑ\x90\x00\x00\x00\x00\x1b\xe1\xa7\x10\x00\x00\x00\x00\x1c\xac\xae\x10\x00\x00\x00\x00\x1d\xc1\x89\x10\x00\x00\x00\x00\x1e\x8c\x90\x10\x00\x00\x00\x00\x1f\xa1k\x10\x00" +
-	"\x00\x00\x00 lr\x10\x00\x00\x00\x00!\x81M\x10\x00\x00\x00\x00\"LT\x10\x00\x00\x00\x00#a/\x10\x00\x00\x00\x00$,6\x10\x00\x00\x00\x00%JK\x90\x00\x00\x00\x00&\f\x18\x10\x00\x00\x00\x00'" +
-	"*-\x90\x00\x00\x00\x00'\xf54\x90\x00\x00\x00\x00)\n\x0f\x90\x00\x00\x00\x00)\xd5\x16\x90\x00\x00\x00\x00*\xe9\xf1\x90\x00\x00\x00\x00+\xb4\xf8\x90\x00\x00\x00\x00,\xc9Ӑ\x00\x00\x00\x00-\x94ڐ\x00" +
-	"\x00\x00\x00.\xa9\xb5\x90\x00\x00\x00\x00/t\xbc\x90\x00\x00\x00\x000\x89\x97\x90\x00\x00\x00\x001]\xd9\x10\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x02\x01\x02\x01\x03\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x04\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\xff\xff\xff\xb5\x00\x00\x00\x00\x0e\x10\x01\x04\x00\x00\x00\x00\x00\b\x00\x00\x1c \x01\f\x00\x00\x0e\x10\x00\x04LMT\x00BST\x00GMT\x00BDST\x00\nGM" +
-	"T0BST,M3.5.0/1,M10.5.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe1C\xf9\xa1\xde\x01\x00\x00\xde\x01\x00\x00\x0f\x00\x00\x00Europe/" +
-	"BelgradeTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00T" +
-	"Zif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00$\x00\x00\x00\x03\x00\x00\x00\r\xff\xff\xff\xff^<\xf0H\xff\xff\xff\xff\xca\x025\xe0\xff" +
-	"\xff\xff\xff\xcc\xe7K\x10\xff\xff\xff\xffͩ\x17\x90\xff\xff\xff\xff\u03a2C\x10\xff\xff\xff\xffϒ4\x10\xff\xff\xff\xffЂ%\x10\xff\xff\xff\xffѡ\x8c\x10\xff\xff\xff\xff\xd2N@\x90\x00\x00\x00\x00\x18" +
-	"㯐\x00\x00\x00\x00\x19Ӡ\x90\x00\x00\x00\x00\x1aÑ\x90\x00\x00\x00\x00\x1b\xbc\xbd\x10\x00\x00\x00\x00\x1c\xac\xae\x10\x00\x00\x00\x00\x1d\x9c\x9f\x10\x00\x00\x00\x00\x1e\x8c\x90\x10\x00\x00\x00\x00\x1f|\x81\x10\x00" +
-	"\x00\x00\x00 lr\x10\x00\x00\x00\x00!\\c\x10\x00\x00\x00\x00\"LT\x10\x00\x00\x00\x00#<E\x10\x00\x00\x00\x00$,6\x10\x00\x00\x00\x00%\x1c'\x10\x00\x00\x00\x00&\f\x18\x10\x00\x00\x00\x00'" +
-	"\x05C\x90\x00\x00\x00\x00'\xf54\x90\x00\x00\x00\x00(\xe5%\x90\x00\x00\x00\x00)\xd5\x16\x90\x00\x00\x00\x00*\xc5\a\x90\x00\x00\x00\x00+\xb4\xf8\x90\x00\x00\x00\x00,\xa4\xe9\x90\x00\x00\x00\x00-\x94ڐ\x00" +
-	"\x00\x00\x00.\x84ː\x00\x00\x00\x00/t\xbc\x90\x00\x00\x00\x000d\xad\x90\x00\x00\x00\x001]\xd9\x10\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x00\x00\x138\x00\x00\x00\x00\x0e\x10\x00\x04\x00\x00\x1c \x01\bLMT\x00CET\x00CEST\x00\nCET-1CEST,M3.5.0,M10." +
-	"5.0/3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17S\x91\xb3\xc1\x02\x00\x00\xc1\x02\x00\x00\r\x00\x00\x00Europe/BerlinTZif2\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00<\x00\x00\x00\x04\x00\x00\x00\x12\xff\xff\xff\xffo\xa2a\xf8\xff\xff\xff\xff\x9b\f\x17`\xff\xff\xff\xff\x9b\xd5\xda\xf0\xff\xff\xff\xff\x9cٮ\x90\xff\xff\xff\xff" +
-	"\x9d\xa4\xb5\x90\xff\xff\xff\xff\x9e\xb9\x90\x90\xff\xff\xff\xff\x9f\x84\x97\x90\xff\xff\xff\xff\xc8\tq\x90\xff\xff\xff\xff\xcc\xe7K\x10\xff\xff\xff\xffͩ\x17\x90\xff\xff\xff\xff\u03a2C\x10\xff\xff\xff\xffϒ4\x10" +
-	"\xff\xff\xff\xffЂ%\x10\xff\xff\xff\xff\xd1r\x16\x10\xff\xff\xff\xffѶ\x96\x00\xff\xff\xff\xff\xd2X\xbe\x80\xff\xff\xff\xffҡO\x10\xff\xff\xff\xff\xd3c\x1b\x90\xff\xff\xff\xff\xd4K#\x90\xff\xff\xff\xff" +
-	"\xd59\xd1 \xff\xff\xff\xff\xd5g\xe7\x90\xff\xff\xff\xffըs\x00\xff\xff\xff\xff\xd6)\xb4\x10\xff\xff\xff\xff\xd7,\x1a\x10\xff\xff\xff\xff\xd8\t\x96\x10\xff\xff\xff\xff\xd9\x02\xc1\x90\xff\xff\xff\xff\xd9\xe9x\x10" +
-	"\x00\x00\x00\x00\x13MD\x10\x00\x00\x00\x00\x143\xfa\x90\x00\x00\x00\x00\x15#\xeb\x90\x00\x00\x00\x00\x16\x13ܐ\x00\x00\x00\x00\x17\x03͐\x00\x00\x00\x00\x17\xf3\xbe\x90\x00\x00\x00\x00\x18㯐\x00\x00\x00\x00" +
-	"\x19Ӡ\x90\x00\x00\x00\x00\x1aÑ\x90\x00\x00\x00\x00\x1b\xbc\xbd\x10\x00\x00\x00\x00\x1c\xac\xae\x10\x00\x00\x00\x00\x1d\x9c\x9f\x10\x00\x00\x00\x00\x1e\x8c\x90\x10\x00\x00\x00\x00\x1f|\x81\x10\x00\x00\x00\x00 lr\x10" +
-	"\x00\x00\x00\x00!\\c\x10\x00\x00\x00\x00\"LT\x10\x00\x00\x00\x00#<E\x10\x00\x00\x00\x00$,6\x10\x00\x00\x00\x00%\x1c'\x10\x00\x00\x00\x00&\f\x18\x10\x00\x00\x00\x00'\x05C\x90\x00\x00\x00\x00" +
-	"'\xf54\x90\x00\x00\x00\x00(\xe5%\x90\x00\x00\x00\x00)\xd5\x16\x90\x00\x00\x00\x00*\xc5\a\x90\x00\x00\x00\x00+\xb4\xf8\x90\x00\x00\x00\x00,\xa4\xe9\x90\x00\x00\x00\x00-\x94ڐ\x00\x00\x00\x00.\x84ː" +
-	"\x00\x00\x00\x00/t\xbc\x90\x00\x00\x00\x000d\xad\x90\x00\x00\x00\x001]\xd9\x10\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x03\x01\x02\x01\x02\x01\x03\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x00\x00\f\x88\x00\x00\x00\x00\x1c \x01\x04\x00\x00\x0e\x10\x00\t\x00\x00*0\x01\rLMT\x00CEST\x00CET" +
-	"\x00CEMT\x00\nCET-1CEST,M3.5.0,M10.5.0/3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Io\x11{\xd3\x02\x00\x00\xd3\x02\x00\x00" +
-	"\x11\x00\x00\x00Europe/BratislavaTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00=\x00\x00\x00\x05\x00\x00\x00\x15\xff\xff\xff\xff" +
-	"\x1eI\x92\xf8\xff\xff\xff\xffl\xcf\xea\xf8\xff\xff\xff\xff\x9b\f\x17`\xff\xff\xff\xff\x9b\xd5\xda\xf0\xff\xff\xff\xff\x9cٮ\x90\xff\xff\xff\xff\x9d\xa4\xb5\x90\xff\xff\xff\xff\x9e\xb9\x90\x90\xff\xff\xff\xff\x9f\x84\x97\x90" +
-	"\xff\xff\xff\xff\xc8\tq\x90\xff\xff\xff\xff\xcc\xe7K\x10\xff\xff\xff\xffͩ\x17\x90\xff\xff\xff\xff\u03a2C\x10\xff\xff\xff\xffϒ4\x10\xff\xff\xff\xffЂ%\x10\xff\xff\xff\xff\xd1r\x16\x10\xff\xff\xff\xff" +
-	"\xd2b\a\x10\xff\xff\xff\xffӀ\x1c\x90\xff\xff\xff\xff\xd4I\xd2\x10\xff\xff\xff\xffԓ\xb4 \xff\xff\xff\xff\xd5\x02r \xff\xff\xff\xff\xd5L8\x10\xff\xff\xff\xff\xd6)\xb4\x10\xff\xff\xff\xff\xd7,\x1a\x10" +
-	"\xff\xff\xff\xff\xd8\t\x96\x10\xff\xff\xff\xff\xd9\x01p\x10\xff\xff\xff\xff\xd9\xe9x\x10\x00\x00\x00\x00\x11d'\x90\x00\x00\x00\x00\x12T\x18\x90\x00\x00\x00\x00\x13MD\x10\x00\x00\x00\x00\x143\xfa\x90\x00\x00\x00\x00" +
-	"\x15#\xeb\x90\x00\x00\x00\x00\x16\x13ܐ\x00\x00\x00\x00\x17\x03͐\x00\x00\x00\x00\x17\xf3\xbe\x90\x00\x00\x00\x00\x18㯐\x00\x00\x00\x00\x19Ӡ\x90\x00\x00\x00\x00\x1aÑ\x90\x00\x00\x00\x00\x1b\xbc\xbd\x10" +
-	"\x00\x00\x00\x00\x1c\xac\xae\x10\x00\x00\x00\x00\x1d\x9c\x9f\x10\x00\x00\x00\x00\x1e\x8c\x90\x10\x00\x00\x00\x00\x1f|\x81\x10\x00\x00\x00\x00 lr\x10\x00\x00\x00\x00!\\c\x10\x00\x00\x00\x00\"LT\x10\x00\x00\x00\x00" +
-	"#<E\x10\x00\x00\x00\x00$,6\x10\x00\x00\x00\x00%\x1c'\x10\x00\x00\x00\x00&\f\x18\x10\x00\x00\x00\x00'\x05C\x90\x00\x00\x00\x00'\xf54\x90\x00\x00\x00\x00(\xe5%\x90\x00\x00\x00\x00)\xd5\x16\x90" +
-	"\x00\x00\x00\x00*\xc5\a\x90\x00\x00\x00\x00+\xb4\xf8\x90\x00\x00\x00\x00,\xa4\xe9\x90\x00\x00\x00\x00-\x94ڐ\x00\x00\x00\x00.\x84ː\x00\x00\x00\x00/t\xbc\x90\x00\x00\x00\x000d\xad\x90\x00\x00\x00\x00" +
-	"1]\xd9\x10\x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x04\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03" +
-	"\x02\x03\x02\x03\x02\x00\x00\r\x88\x00\x00\x00\x00\r\x88\x00\x04\x00\x00\x1c \x01\b\x00\x00\x0e\x10\x00\r\x00\x00\x00\x00\x01\x11LMT\x00PMT\x00CEST\x00CET\x00GMT\x00\nCET" +
-	"-1CEST,M3.5.0,M10.5.0/3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00o\xbc\x831O\x04\x00\x00O\x04\x00\x00\x0f\x00\x00\x00Europe" +
-	"/BrusselsTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00" +
-	"TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00f\x00\x00\x00\x06\x00\x00\x00\x1a\xff\xff\xff\xffV\xb6\xdf\xe6\xff\xff\xff\xffm\xe8\xc8\x00" +
-	"\xff\xff\xff\xff\x98DI\x80\xff\xff\xff\xff\x9b\f%p\xff\xff\xff\xff\x9b\xd5\xda\xf0\xff\xff\xff\xff\x9cٮ\x90\xff\xff\xff\xff\x9d\xa4\xb5\x90\xff\xff\xff\xff\x9e\xb9\x90\x90\xff\xff\xff\xff\x9f\x84\x97\x90\xff\xff\xff\xff" +
-	"\x9f\xce\xf80\xff\xff\xff\xff\xa0`\xa5\xf0\xff\xff\xff\xff\xa1~\xbbp\xff\xff\xff\xff\xa2.\x12\xf0\xff\xff\xff\xff\xa3zL\xf0\xff\xff\xff\xff\xa45\x81\xf0\xff\xff\xff\xff\xa5^#p\xff\xff\xff\xff\xa6%5\xf0" +
-	"\xff\xff\xff\xff\xa7'\x9b\xf0\xff\xff\xff\xff\xa8*\x01\xf0\xff\xff\xff\xff\xa9\a}\xf0\xff\xff\xff\xff\xa9\xee4p\xff\xff\xff\xff\xaa\xe7_\xf0\xff\xff\xff\xff\xab\xd7P\xf0\xff\xff\xff\xff\xac\xc7A\xf0\xff\xff\xff\xff" +
-	"\xadɧ\xf0\xff\xff\xff\xff\xae\xa7#\xf0\xff\xff\xff\xff\xaf\xa0Op\xff\xff\xff\xff\xb0\x87\x05\xf0\xff\xff\xff\xff\xb1\x89k\xf0\xff\xff\xff\xff\xb2pL\xa0\xff\xff\xff\xff\xb3r\xb2\xa0\xff\xff\xff\xff\xb4P.\xa0" +
-	"\xff\xff\xff\xff\xb5IZ \xff\xff\xff\xff\xb60\x10\xa0\xff\xff\xff\xff\xb72v\xa0\xff\xff\xff\xff\xb8\x0f\xf2\xa0\xff\xff\xff\xff\xb8\xff\xe3\xa0\xff\xff\xff\xff\xb9\xefԠ\xff\xff\xff\xff\xba\u058b \xff\xff\xff\xff" +
-	"\xbb\xd8\xf1 \xff\xff\xff\xff\xbc\xc8\xe2 \xff\xff\xff\xff\xbd\xb8\xd3 \xff\xff\xff\xff\xbe\x9f\x89\xa0\xff\xff\xff\xff\xbf\x98\xb5 \xff\xff\xff\xff\xc0\x9b\x1b \xff\xff\xff\xff\xc1x\x97 \xff\xff\xff\xff\xc2h\x88 " +
-	"\xff\xff\xff\xff\xc3Xy \xff\xff\xff\xff\xc4?/\xa0\xff\xff\xff\xff\xc58[ \xff\xff\xff\xff\xc6:\xc1 \xff\xff\xff\xff\xc7X֠\xff\xff\xff\xff\xc7\xda\t\xa0\xff\xff\xff\xff\xc8J\x19 \xff\xff\xff\xff" +
-	"\xcc\xe7K\x10\xff\xff\xff\xffͩ\x17\x90\xff\xff\xff\xff\u03a2C\x10\xff\xff\xff\xffϒ4\x10\xff\xff\xff\xff\xd0n^\x90\xff\xff\xff\xff\xd1r\x16\x10\xff\xff\xff\xff\xd2N@\x90\xff\xff\xff\xffӑ@\x10" +
-	"\xff\xff\xff\xff\xd4K#\x90\x00\x00\x00\x00\r\xa4c\x90\x00\x00\x00\x00\x0e\x8b\x1a\x10\x00\x00\x00\x00\x0f\x84E\x90\x00\x00\x00\x00\x10t6\x90\x00\x00\x00\x00\x11d'\x90\x00\x00\x00\x00\x12T\x18\x90\x00\x00\x00\x00" +
-	"\x13MD\x10\x00\x00\x00\x00\x143\xfa\x90\x00\x00\x00\x00\x15#\xeb\x90\x00\x00\x00\x00\x16\x13ܐ\x00\x00\x00\x00\x17\x03͐\x00\x00\x00\x00\x17\xf3\xbe\x90\x00\x00\x00\x00\x18㯐\x00\x00\x00\x00\x19Ӡ\x90" +
-	"\x00\x00\x00\x00\x1aÑ\x90\x00\x00\x00\x00\x1b\xbc\xbd\x10\x00\x00\x00\x00\x1c\xac\xae\x10\x00\x00\x00\x00\x1d\x9c\x9f\x10\x00\x00\x00\x00\x1e\x8c\x90\x10\x00\x00\x00\x00\x1f|\x81\x10\x00\x00\x00\x00 lr\x10\x00\x00\x00\x00" +
-	"!\\c\x10\x00\x00\x00\x00\"LT\x10\x00\x00\x00\x00#<E\x10\x00\x00\x00\x00$,6\x10\x00\x00\x00\x00%\x1c'\x10\x00\x00\x00\x00&\f\x18\x10\x00\x00\x00\x00'\x05C\x90\x00\x00\x00\x00'\xf54\x90" +
-	"\x00\x00\x00\x00(\xe5%\x90\x00\x00\x00\x00)\xd5\x16\x90\x00\x00\x00\x00*\xc5\a\x90\x00\x00\x00\x00+\xb4\xf8\x90\x00\x00\x00\x00,\xa4\xe9\x90\x00\x00\x00\x00-\x94ڐ\x00\x00\x00\x00.\x84ː\x00\x00\x00\x00" +
-	"/t\xbc\x90\x00\x00\x00\x000d\xad\x90\x00\x00\x00\x001]\xd9\x10\x01\x02\x03\x04\x03\x04\x03\x04\x03\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02" +
-	"\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04" +
-	"\x03\x04\x00\x00\x04\x1a\x00\x00\x00\x00\x04\x1a\x00\x04\x00\x00\x00\x00\x00\b\x00\x00\x0e\x10\x00\f\x00\x00\x1c \x01\x10\x00\x00\x0e\x10\x01\x15LMT\x00BMT\x00WET\x00CET\x00CEST\x00W" +
-	"EST\x00\nCET-1CEST,M3.5.0,M10.5.0/3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90\xa9\xf5ϕ\x02\x00\x00\x95\x02\x00\x00\x10\x00" +
-	"\x00\x00Europe/BucharestTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" +
-	"\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x007\x00\x00\x00\x04\x00\x00\x00\x11\xff\xff\xff\xffl\xcf\xe0" +
-	"\b\xff\xff\xff\xff\xb7\xb0\xd2\b\xff\xff\xff\xff\xb9>\xf3`\xff\xff\xff\xff\xb9\xef\x9c`\xff\xff\xff\xff\xbaߍ`\xff\xff\xff\xff\xbb\xcf~`\xff\xff\xff\xff\xbcȩ\xe0\xff\xff\xff\xff\xbd\xb8\x9a\xe0\xff\xff\xff" +
-	"\xff\xbe\xa8\x8b\xe0\xff\xff\xff\xff\xbf\x98|\xe0\xff\xff\xff\xff\xc0\x88m\xe0\xff\xff\xff\xff\xc1x^\xe0\xff\xff\xff\xff\xc2hO\xe0\xff\xff\xff\xff\xc3X@\xe0\xff\xff\xff\xff\xc4H1\xe0\xff\xff\xff\xff\xc58\"" +
-	"\xe0\xff\xff\xff\xff\xc6(\x13\xe0\xff\xff\xff\xff\xc7\x18\x04\xe0\x00\x00\x00\x00\x11\xad\xd1`\x00\x00\x00\x00\x12S\xe0P\x00\x00\x00\x00\x13M\v\xd0\x00\x00\x00\x00\x143\xd0`\x00\x00\x00\x00\x15#݀\x00\x00\x00" +
-	"\x00\x16\x13\u0380\x00\x00\x00\x00\x17\x03\xbf\x80\x00\x00\x00\x00\x17\xf3\xb0\x80\x00\x00\x00\x00\x18㡀\x00\x00\x00\x00\x19Ӓ\x80\x00\x00\x00\x00\x1aÃ\x80\x00\x00\x00\x00\x1b\xbc\xaf\x00\x00\x00\x00\x00\x1c\xac\xa0" +
-	"\x00\x00\x00\x00\x00\x1d\x9c\x91\x00\x00\x00\x00\x00\x1e\x8c\x82\x00\x00\x00\x00\x00\x1f|s\x00\x00\x00\x00\x00 ld\x00\x00\x00\x00\x00!\\U\x00\x00\x00\x00\x00\"LF\x00\x00\x00\x00\x00#<7\x00\x00\x00\x00" +
-	"\x00$,(\x00\x00\x00\x00\x00%\x1c\x19\x00\x00\x00\x00\x00&\f\n\x00\x00\x00\x00\x00'\x055\x80\x00\x00\x00\x00'\xf5\n`\x00\x00\x00\x00(\xe4\xfb`\x00\x00\x00\x00)\xd4\xec`\x00\x00\x00\x00*\xc4\xdd" +
-	"`\x00\x00\x00\x00+\xb4\xce`\x00\x00\x00\x00,\xa4\xbf`\x00\x00\x00\x00-\x94\xb0`\x00\x00\x00\x00.\x84\x93P\x00\x00\x00\x00/t\x92`\x00\x00\x00\x000duP\x00\x00\x00\x001]\xae\xe0\x00\x00\x00" +
-	"\x002r{\xd0\x00\x00\x00\x003=\xbb\x10\x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02" +
-	"\x03\x02\x03\x02\x03\x02\x03\x02\x00\x00\x18x\x00\x00\x00\x00\x18x\x00\x04\x00\x00*0\x01\b\x00\x00\x1c \x00\rLMT\x00BMT\x00EEST\x00EET\x00\nEET-2EEST," +
-	"M3.5.0/3,M10.5.0/4\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6Kf\xab\xfe\x02\x00\x00\xfe\x02\x00\x00\x0f\x00\x00\x00Europe/Buda" +
-	"pestTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00D\x00\x00\x00\x03\x00\x00\x00\r\xff\xff\xff\xffk\x17\x91\x9c\xff\xff\xff\xff\x9b\f\x17`\xff\xff\xff\xff\x9b" +
-	"\xd5\xda\xf0\xff\xff\xff\xff\x9cٮ\x90\xff\xff\xff\xff\x9d\xa4\xb5\x90\xff\xff\xff\xff\x9e\xb9\x90\x90\xff\xff\xff\xff\x9f\x84\x97\x90\xff\xff\xff\xff\xa0\x9a\xc4\x10\xff\xff\xff\xff\xa1dy\x90\xff\xff\xff\xff\xa2p\x1a\x10\xff" +
-	"\xff\xff\xff\xa3M\x96\x10\xff\xff\xff\xff\xc9\xf3\xb5`\xff\xff\xff\xff\xcc\xe7K\x10\xff\xff\xff\xffͩ\x17\x90\xff\xff\xff\xff\u03a2C\x10\xff\xff\xff\xffϒ4\x10\xff\xff\xff\xffЂ%\x10\xff\xff\xff\xff\xd1" +
-	"\x99x\xe0\xff\xff\xff\xffҊ\xc9p\xff\xff\xff\xff\xd3P\xa6\x90\xff\xff\xff\xff\xd4K\x15\x80\xff\xff\xff\xff\xd59\xc3\x10\xff\xff\xff\xff\xd6)\xb4\x10\xff\xff\xff\xff\xd7\x19\xa5\x10\xff\xff\xff\xff\xd8\t\x96\x10\xff" +
-	"\xff\xff\xff\xd9\x02\xc1\x90\xff\xff\xff\xff\xd9\xe9x\x10\xff\xff\xff\xff⢨\xf0\xff\xff\xff\xff\xe3Q\xf2`\xff\xff\xff\xff䂧\x10\xff\xff\xff\xff\xe51\xfe\x90\xff\xff\xff\xff\xe6t\xfe\x10\xff\xff\xff\xff\xe7" +
-	"\x11\xe0\x90\xff\xff\xff\xff\xe8T\xe0\x10\xff\xff\xff\xff\xe8\xf1\u0090\x00\x00\x00\x00\x13M'\xf0\x00\x00\x00\x00\x143\xdep\x00\x00\x00\x00\x15#\xcfp\x00\x00\x00\x00\x16\x13\xc0p\x00\x00\x00\x00\x17\x03\xb1p\x00" +
-	"\x00\x00\x00\x17\xf3\xa2p\x00\x00\x00\x00\x18\xe3\x93p\x00\x00\x00\x00\x19ӄp\x00\x00\x00\x00\x1aÑ\x90\x00\x00\x00\x00\x1b\xbc\xbd\x10\x00\x00\x00\x00\x1c\xac\xae\x10\x00\x00\x00\x00\x1d\x9c\x9f\x10\x00\x00\x00\x00\x1e" +
-	"\x8c\x90\x10\x00\x00\x00\x00\x1f|\x81\x10\x00\x00\x00\x00 lr\x10\x00\x00\x00\x00!\\c\x10\x00\x00\x00\x00\"LT\x10\x00\x00\x00\x00#<E\x10\x00\x00\x00\x00$,6\x10\x00\x00\x00\x00%\x1c'\x10\x00" +
-	"\x00\x00\x00&\f\x18\x10\x00\x00\x00\x00'\x05C\x90\x00\x00\x00\x00'\xf54\x90\x00\x00\x00\x00(\xe5%\x90\x00\x00\x00\x00)\xd5\x16\x90\x00\x00\x00\x00*\xc5\a\x90\x00\x00\x00\x00+\xb4\xf8\x90\x00\x00\x00\x00," +
-	"\xa4\xe9\x90\x00\x00\x00\x00-\x94ڐ\x00\x00\x00\x00.\x84ː\x00\x00\x00\x00/t\xbc\x90\x00\x00\x00\x000d\xad\x90\x00\x00\x00\x001]\xd9\x10\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x00\x00\x11\xe4\x00\x00\x00\x00\x1c" +
-	" \x01\x04\x00\x00\x0e\x10\x00\tLMT\x00CEST\x00CET\x00\nCET-1CEST,M3.5.0,M10.5.0/3\nPK\x03\x04\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00Dd#\xc4\xf1\x01\x00\x00\xf1\x01\x00\x00\x0f\x00\x00\x00Europe/BusingenTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00%\x00\x00\x00\x04\x00\x00\x00\x11\xff\xff\xff\xff$\xf0\xea\x80\xff\xff\xff\xffq\xd4\x06\x86\xff\xff\xff\xff\xca\x17j\x00\xff\xff\xff\xff\xca\xe2q\x00\xff\xff\xff\xff\xcb\xf7L\x00\xff\xff\xff\xff\xcc\xc2S\x00\x00\x00" +
-	"\x00\x00\x15#\xeb\x90\x00\x00\x00\x00\x16\x13ܐ\x00\x00\x00\x00\x17\x03͐\x00\x00\x00\x00\x17\xf3\xbe\x90\x00\x00\x00\x00\x18㯐\x00\x00\x00\x00\x19Ӡ\x90\x00\x00\x00\x00\x1aÑ\x90\x00\x00\x00\x00\x1b\xbc" +
-	"\xbd\x10\x00\x00\x00\x00\x1c\xac\xae\x10\x00\x00\x00\x00\x1d\x9c\x9f\x10\x00\x00\x00\x00\x1e\x8c\x90\x10\x00\x00\x00\x00\x1f|\x81\x10\x00\x00\x00\x00 lr\x10\x00\x00\x00\x00!\\c\x10\x00\x00\x00\x00\"LT\x10\x00\x00" +
-	"\x00\x00#<E\x10\x00\x00\x00\x00$,6\x10\x00\x00\x00\x00%\x1c'\x10\x00\x00\x00\x00&\f\x18\x10\x00\x00\x00\x00'\x05C\x90\x00\x00\x00\x00'\xf54\x90\x00\x00\x00\x00(\xe5%\x90\x00\x00\x00\x00)\xd5" +
-	"\x16\x90\x00\x00\x00\x00*\xc5\a\x90\x00\x00\x00\x00+\xb4\xf8\x90\x00\x00\x00\x00,\xa4\xe9\x90\x00\x00\x00\x00-\x94ڐ\x00\x00\x00\x00.\x84ː\x00\x00\x00\x00/t\xbc\x90\x00\x00\x00\x000d\xad\x90\x00\x00" +
-	"\x00\x001]\xd9\x10\x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x00\x00\b\x00\x00\x00\x00\x00\x06\xfa\x00\x04\x00\x00\x1c \x01" +
-	"\b\x00\x00\x0e\x10\x00\rLMT\x00BMT\x00CEST\x00CET\x00\nCET-1CEST,M3.5.0,M10.5.0/3\nPK\x03\x04\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00I\xb8\xbc\xd3\xf3\x02\x00\x00\xf3\x02\x00\x00\x0f\x00\x00\x00Europe/ChisinauTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00<\x00\x00\x00\t\x00\x00\x00&\xff\xff\xff\xffV\xb6\xc8\xf8\xff\xff\xff\xff\x9ek\x9f\f\xff\xff\xff\xff\xb7\xb0\xd2\b\xff\xff\xff\xff\xb9>\xf3`\xff\xff\xff\xff\xb9\xef\x9c`\xff\xff\xff\xff\xbaߍ`" +
-	"\xff\xff\xff\xff\xbb\xcf~`\xff\xff\xff\xff\xbcȩ\xe0\xff\xff\xff\xff\xbd\xb8\x9a\xe0\xff\xff\xff\xff\xbe\xa8\x8b\xe0\xff\xff\xff\xff\xbf\x98|\xe0\xff\xff\xff\xff\xc0\x88m\xe0\xff\xff\xff\xff\xc1x^\xe0\xff\xff\xff\xff" +
-	"\xc2hO\xe0\xff\xff\xff\xff\xc3X@\xe0\xff\xff\xff\xff\xc4H1\xe0\xff\xff\xff\xff\xc58\"\xe0\xff\xff\xff\xff\xc6(\x13\xe0\xff\xff\xff\xff\xc7\x18\x04\xe0\xff\xff\xff\xffȼ\x93`\xff\xff\xff\xff\xcaw}P" +
-	"\xff\xff\xff\xff\xcc\xe7K\x10\xff\xff\xff\xffͩ\x17\x90\xff\xff\xff\xff\u03a2C\x10\xff\xff\xff\xffϒ4\x10\xff\xff\xff\xff\xd0N\x90`\x00\x00\x00\x00\x15'\xa7\xd0\x00\x00\x00\x00\x16\x18\xdc@\x00\x00\x00\x00" +
-	"\x17\b\xdbP\x00\x00\x00\x00\x17\xfa\x0f\xc0\x00\x00\x00\x00\x18\xea\x0e\xd0\x00\x00\x00\x00\x19\xdbC@\x00\x00\x00\x00\x1a̓\xd0\x00\x00\x00\x00\x1b\xbc\xa0\xf0\x00\x00\x00\x00\x1c\xac\x91\xf0\x00\x00\x00\x00\x1d\x9c\x82\xf0" +
-	"\x00\x00\x00\x00\x1e\x8cs\xf0\x00\x00\x00\x00\x1f|d\xf0\x00\x00\x00\x00 lU\xf0\x00\x00\x00\x00!\\F\xf0\x00\x00\x00\x00\"L7\xf0\x00\x00\x00\x00#<(\xf0\x00\x00\x00\x00$,\x19\xf0\x00\x00\x00\x00" +
-	"%\x1c\n\xf0\x00\x00\x00\x00&\v\xfb\xf0\x00\x00\x00\x00&CL\xe0\x00\x00\x00\x00'\x055\x80\x00\x00\x00\x00'\xf5&\x80\x00\x00\x00\x00(\xe5\x17\x80\x00\x00\x00\x00)\xd4\xec`\x00\x00\x00\x00*\xc4\xcfP" +
-	"\x00\x00\x00\x00+\xb4\xce`\x00\x00\x00\x00,\xa4\xb1P\x00\x00\x00\x00-\x94\xb0`\x00\x00\x00\x00.\x84\x93P\x00\x00\x00\x00/t\x92`\x00\x00\x00\x000duP\x00\x00\x00\x001]\xae\xe0\x00\x00\x00\x00" +
-	"2r{\xd0\x00\x00\x00\x003=\xad\x00\x01\x02\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x06\x05\x06\x05\x06\b\a\b\a\b\a\b\a\b\a\b\a\b\a\b\a\b\a\b\a\x03\x04\x03" +
-	"\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x00\x00\x1b\b\x00\x00\x00\x00\x1a\xf4\x00\x04\x00\x00\x18x\x00\b\x00\x00*0\x01\f\x00\x00\x1c \x00\x11\x00\x00\x0e\x10\x00\x15\x00\x00\x1c \x01\x19\x00\x008@\x01\x1e" +
-	"\x00\x00*0\x00\"LMT\x00CMT\x00BMT\x00EEST\x00EET\x00CET\x00CEST\x00MSD\x00MSK\x00\nEET-2EEST,M3.5." +
-	"0,M10.5.0/3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17S\x91\xb3\xc1\x02\x00\x00\xc1\x02\x00\x00\x11\x00\x00\x00Europe/CopenhagenT" +
-	"Zif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00<\x00\x00\x00\x04\x00\x00\x00\x12\xff\xff\xff\xffo\xa2a\xf8\xff\xff\xff\xff\x9b\f\x17`\xff\xff\xff\xff\x9b\xd5\xda\xf0\xff\xff" +
-	"\xff\xff\x9cٮ\x90\xff\xff\xff\xff\x9d\xa4\xb5\x90\xff\xff\xff\xff\x9e\xb9\x90\x90\xff\xff\xff\xff\x9f\x84\x97\x90\xff\xff\xff\xff\xc8\tq\x90\xff\xff\xff\xff\xcc\xe7K\x10\xff\xff\xff\xffͩ\x17\x90\xff\xff\xff\xff\u03a2" +
-	"C\x10\xff\xff\xff\xffϒ4\x10\xff\xff\xff\xffЂ%\x10\xff\xff\xff\xff\xd1r\x16\x10\xff\xff\xff\xffѶ\x96\x00\xff\xff\xff\xff\xd2X\xbe\x80\xff\xff\xff\xffҡO\x10\xff\xff\xff\xff\xd3c\x1b\x90\xff\xff" +
-	"\xff\xff\xd4K#\x90\xff\xff\xff\xff\xd59\xd1 \xff\xff\xff\xff\xd5g\xe7\x90\xff\xff\xff\xffըs\x00\xff\xff\xff\xff\xd6)\xb4\x10\xff\xff\xff\xff\xd7,\x1a\x10\xff\xff\xff\xff\xd8\t\x96\x10\xff\xff\xff\xff\xd9\x02" +
-	"\xc1\x90\xff\xff\xff\xff\xd9\xe9x\x10\x00\x00\x00\x00\x13MD\x10\x00\x00\x00\x00\x143\xfa\x90\x00\x00\x00\x00\x15#\xeb\x90\x00\x00\x00\x00\x16\x13ܐ\x00\x00\x00\x00\x17\x03͐\x00\x00\x00\x00\x17\xf3\xbe\x90\x00\x00" +
-	"\x00\x00\x18㯐\x00\x00\x00\x00\x19Ӡ\x90\x00\x00\x00\x00\x1aÑ\x90\x00\x00\x00\x00\x1b\xbc\xbd\x10\x00\x00\x00\x00\x1c\xac\xae\x10\x00\x00\x00\x00\x1d\x9c\x9f\x10\x00\x00\x00\x00\x1e\x8c\x90\x10\x00\x00\x00\x00\x1f|" +
-	"\x81\x10\x00\x00\x00\x00 lr\x10\x00\x00\x00\x00!\\c\x10\x00\x00\x00\x00\"LT\x10\x00\x00\x00\x00#<E\x10\x00\x00\x00\x00$,6\x10\x00\x00\x00\x00%\x1c'\x10\x00\x00\x00\x00&\f\x18\x10\x00\x00" +
-	"\x00\x00'\x05C\x90\x00\x00\x00\x00'\xf54\x90\x00\x00\x00\x00(\xe5%\x90\x00\x00\x00\x00)\xd5\x16\x90\x00\x00\x00\x00*\xc5\a\x90\x00\x00\x00\x00+\xb4\xf8\x90\x00\x00\x00\x00,\xa4\xe9\x90\x00\x00\x00\x00-\x94" +
-	"ڐ\x00\x00\x00\x00.\x84ː\x00\x00\x00\x00/t\xbc\x90\x00\x00\x00\x000d\xad\x90\x00\x00\x00\x001]\xd9\x10\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x03\x01\x02\x01\x02\x01\x03\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x00\x00\f\x88\x00\x00\x00\x00\x1c \x01\x04\x00\x00\x0e\x10\x00\t\x00\x00*0\x01\rLM" +
-	"T\x00CEST\x00CET\x00CEMT\x00\nCET-1CEST,M3.5.0,M10.5.0/3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa1\xd6" +
-	"jL\xd8\x05\x00\x00\xd8\x05\x00\x00\r\x00\x00\x00Europe/DublinTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x91\x00\x00\x00\b\x00\x00" +
-	"\x00\x14\xff\xff\xff\xffW\xd1\n\xf1\xff\xff\xff\xff\x9b&\xb3\x91\xff\xff\xff\xff\x9b\xd6\v\x11\xff\xff\xff\xff\x9c\xcf0\xa0\xff\xff\xff\xff\x9d\xa4à\xff\xff\xff\xff\x9e\x9c\x9d\xa0\xff\xff\xff\xff\x9f\x97\x1a\xa0\xff\xff" +
-	"\xff\xff\xa0\x85\xba \xff\xff\xff\xff\xa1v\xfc\xa0\xff\xff\xff\xff\xa2e\x9c \xff\xff\xff\xff\xa3{Ƞ\xff\xff\xff\xff\xa4N\xb8\xa0\xff\xff\xff\xff\xa5?\xfb \xff\xff\xff\xff\xa6%` \xff\xff\xff\xff\xa7'" +
-	"\xc6 \xff\xff\xff\xff\xa8*, \xff\xff\xff\xff\xa8\xeb\xf8\xa0\xff\xff\xff\xff\xaa\x00Ӡ\xff\xff\xff\xff\xaa\xd5\x15 \xff\xff\xff\xff\xab\xe9\xf0 \xff\xff\xff\xff\xac\xc7l \xff\xff\xff\xff\xad\xc9\xd2 \xff\xff" +
-	"\xff\xff\xae\xa7N \xff\xff\xff\xff\xaf\xa0y\xa0\xff\xff\xff\xff\xb0\x870 \xff\xff\xff\xff\xb1\x92Р\xff\xff\xff\xff\xb2pL\xa0\xff\xff\xff\xff\xb3r\xb2\xa0\xff\xff\xff\xff\xb4P.\xa0\xff\xff\xff\xff\xb5I" +
-	"Z \xff\xff\xff\xff\xb60\x10\xa0\xff\xff\xff\xff\xb72v\xa0\xff\xff\xff\xff\xb8\x0f\xf2\xa0\xff\xff\xff\xff\xb9\x12X\xa0\xff\xff\xff\xff\xb9\xefԠ\xff\xff\xff\xff\xba\xe9\x00 \xff\xff\xff\xff\xbb\xd8\xf1 \xff\xff" +
-	"\xff\xff\xbc\xdbW \xff\xff\xff\xff\xbd\xb8\xd3 \xff\xff\xff\xff\xbe\xb1\xfe\xa0\xff\xff\xff\xff\xbf\x98\xb5 \xff\xff\xff\xff\xc0\x9b\x1b \xff\xff\xff\xff\xc1x\x97 \xff\xff\xff\xff\xc2z\xfd \xff\xff\xff\xff\xc3X" +
-	"y \xff\xff\xff\xff\xc4Q\xa4\xa0\xff\xff\xff\xff\xc58[ \xff\xff\xff\xff\xc6:\xc1 \xff\xff\xff\xff\xc7X֠\xff\xff\xff\xff\xc7\xda\t\xa0\xff\xff\xff\xff\xd4I\xe0 \xff\xff\xff\xff\xd5\x1e!\xa0\xff\xff" +
-	"\xff\xff\xd6N\xac \xff\xff\xff\xff\xd7,( \xff\xff\xff\xff\xd8.\x8e \xff\xff\xff\xff\xd8\xf9\x95 \xff\xff\xff\xff\xda\x0ep \xff\xff\xff\xff\xda\xeb\xec \xff\xff\xff\xff\xdb\xe5\x17\xa0\xff\xff\xff\xff\xdc\xcb" +
-	"\xce \xff\xff\xff\xff\xdd\xc4\xf9\xa0\xff\xff\xff\xff\u07b4\xea\xa0\xff\xff\xff\xff߮\x16 \xff\xff\xff\xff\xe0\x94̠\xff\xff\xff\xff\xe1rH\xa0\xff\xff\xff\xff\xe2kt \xff\xff\xff\xff\xe3R*\xa0\xff\xff" +
-	"\xff\xff\xe4T\x90\xa0\xff\xff\xff\xff\xe52\f\xa0\xff\xff\xff\xff\xe6=\xad \xff\xff\xff\xff\xe7\x1b) \xff\xff\xff\xff\xe8\x14T\xa0\xff\xff\xff\xff\xe8\xfb\v \xff\xff\xff\xff\xe9\xfdq \xff\xff\xff\xff\xea\xda" +
-	"\xed \xff\xff\xff\xff\xeb\xddS \xff\xff\xff\xff\xec\xba\xcf \xff\xff\xff\xff\xed\xb3\xfa\xa0\xff\xff\xff\xff\ue6b1 \xff\xff\xff\xff\xef\x81g\xa0\xff\xff\xff\xff\xf0\x9f} \xff\xff\xff\xff\xf1aI\xa0\xff\xff" +
-	"\xff\xff\xf2\x7f_ \xff\xff\xff\xff\xf3Jf \xff\xff\xff\xff\xf4_A \xff\xff\xff\xff\xf5!\r\xa0\xff\xff\xff\xff\xf6?# \xff\xff\xff\xff\xf7\x00\xef\xa0\xff\xff\xff\xff\xf8\x1f\x05 \xff\xff\xff\xff\xf8\xe0" +
-	"Ѡ\xff\xff\xff\xff\xf9\xfe\xe7 \xff\xff\xff\xff\xfa\xc0\xb3\xa0\xff\xff\xff\xff\xfb\xe8\x03\xa0\xff\xff\xff\xff\xfc{\xab\xa0\xff\xff\xff\xff\xfdǻp\x00\x00\x00\x00\x03p\xc6 \x00\x00\x00\x00\x04)X \x00\x00" +
-	"\x00\x00\x05P\xa8 \x00\x00\x00\x00\x06\t: \x00\x00\x00\x00\a0\x8a \x00\x00\x00\x00\a\xe9\x1c \x00\x00\x00\x00\t\x10l \x00\x00\x00\x00\t\xc8\xfe \x00\x00\x00\x00\n\xf0N \x00\x00\x00\x00\v\xb2" +
-	"\x1a\xa0\x00\x00\x00\x00\f\xd00 \x00\x00\x00\x00\r\x91\xfc\xa0\x00\x00\x00\x00\x0e\xb0\x12 \x00\x00\x00\x00\x0fqޠ\x00\x00\x00\x00\x10\x99.\xa0\x00\x00\x00\x00\x11Q\xc0\xa0\x00\x00\x00\x00\x12y\x10\xa0\x00\x00" +
-	"\x00\x00\x131\xa2\xa0\x00\x00\x00\x00\x14X\xf2\xa0\x00\x00\x00\x00\x15#\xeb\x90\x00\x00\x00\x00\x168Ɛ\x00\x00\x00\x00\x17\x03͐\x00\x00\x00\x00\x18\x18\xa8\x90\x00\x00\x00\x00\x18㯐\x00\x00\x00\x00\x19\xf8" +
-	"\x8a\x90\x00\x00\x00\x00\x1aÑ\x90\x00\x00\x00\x00\x1b\xe1\xa7\x10\x00\x00\x00\x00\x1c\xac\xae\x10\x00\x00\x00\x00\x1d\xc1\x89\x10\x00\x00\x00\x00\x1e\x8c\x90\x10\x00\x00\x00\x00\x1f\xa1k\x10\x00\x00\x00\x00 lr\x10\x00\x00" +
-	"\x00\x00!\x81M\x10\x00\x00\x00\x00\"LT\x10\x00\x00\x00\x00#a/\x10\x00\x00\x00\x00$,6\x10\x00\x00\x00\x00%JK\x90\x00\x00\x00\x00&\f\x18\x10\x00\x00\x00\x00'*-\x90\x00\x00\x00\x00'\xf5" +
-	"4\x90\x00\x00\x00\x00)\n\x0f\x90\x00\x00\x00\x00)\xd5\x16\x90\x00\x00\x00\x00*\xe9\xf1\x90\x00\x00\x00\x00+\xb4\xf8\x90\x00\x00\x00\x00,\xc9Ӑ\x00\x00\x00\x00-\x94ڐ\x00\x00\x00\x00.\xa9\xb5\x90\x00\x00" +
-	"\x00\x00/t\xbc\x90\x00\x00\x00\x000\x89\x97\x90\x00\x00\x00\x001]\xd9\x10\x01\x02\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05" +
-	"\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\a\x06\a\x06" +
-	"\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\xff\xff\xfa\x0f\x00\x00\xff\xff\xfa\x0f\x00\x04\x00" +
-	"\x00\b\x1f\x01\b\x00\x00\x0e\x10\x01\f\x00\x00\x00\x00\x00\x10\x00\x00\x0e\x10\x01\b\x00\x00\x00\x00\x01\x10\x00\x00\x0e\x10\x00\bLMT\x00DMT\x00IST\x00BST\x00GMT\x00\nIST-" +
-	"1GMT0,M10.5.0,M3.5.0/1\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00==\xa4\x16\xc4\x04\x00\x00\xc4\x04\x00\x00\x10\x00\x00\x00Europe/" +
-	"GibraltarTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00" +
-	"TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00s\x00\x00\x00\x06\x00\x00\x00\x1a\xff\xff\xff\xffW\xd1\n\x04\xff\xff\xff\xff\x9b&\xad\xa0" +
-	"\xff\xff\xff\xff\x9b\xd6\x05 \xff\xff\xff\xff\x9c\xcf0\xa0\xff\xff\xff\xff\x9d\xa4à\xff\xff\xff\xff\x9e\x9c\x9d\xa0\xff\xff\xff\xff\x9f\x97\x1a\xa0\xff\xff\xff\xff\xa0\x85\xba \xff\xff\xff\xff\xa1v\xfc\xa0\xff\xff\xff\xff" +
-	"\xa2e\x9c \xff\xff\xff\xff\xa3{Ƞ\xff\xff\xff\xff\xa4N\xb8\xa0\xff\xff\xff\xff\xa5?\xfb \xff\xff\xff\xff\xa6%` \xff\xff\xff\xff\xa7'\xc6 \xff\xff\xff\xff\xa8*, \xff\xff\xff\xff\xa8\xeb\xf8\xa0" +
-	"\xff\xff\xff\xff\xaa\x00Ӡ\xff\xff\xff\xff\xaa\xd5\x15 \xff\xff\xff\xff\xab\xe9\xf0 \xff\xff\xff\xff\xac\xc7l \xff\xff\xff\xff\xad\xc9\xd2 \xff\xff\xff\xff\xae\xa7N \xff\xff\xff\xff\xaf\xa0y\xa0\xff\xff\xff\xff" +
-	"\xb0\x870 \xff\xff\xff\xff\xb1\x92Р\xff\xff\xff\xff\xb2pL\xa0\xff\xff\xff\xff\xb3r\xb2\xa0\xff\xff\xff\xff\xb4P.\xa0\xff\xff\xff\xff\xb5IZ \xff\xff\xff\xff\xb60\x10\xa0\xff\xff\xff\xff\xb72v\xa0" +
-	"\xff\xff\xff\xff\xb8\x0f\xf2\xa0\xff\xff\xff\xff\xb9\x12X\xa0\xff\xff\xff\xff\xb9\xefԠ\xff\xff\xff\xff\xba\xe9\x00 \xff\xff\xff\xff\xbb\xd8\xf1 \xff\xff\xff\xff\xbc\xdbW \xff\xff\xff\xff\xbd\xb8\xd3 \xff\xff\xff\xff" +
-	"\xbe\xb1\xfe\xa0\xff\xff\xff\xff\xbf\x98\xb5 \xff\xff\xff\xff\xc0\x9b\x1b \xff\xff\xff\xff\xc1x\x97 \xff\xff\xff\xff\xc2z\xfd \xff\xff\xff\xff\xc3Xy \xff\xff\xff\xff\xc4Q\xa4\xa0\xff\xff\xff\xff\xc58[ " +
-	"\xff\xff\xff\xff\xc6:\xc1 \xff\xff\xff\xff\xc7X֠\xff\xff\xff\xff\xc7\xda\t\xa0\xff\xff\xff\xff\xca\x16&\x90\xff\xff\xff\xffʗY\x90\xff\xff\xff\xff\xcb\xd1\x1e\x90\xff\xff\xff\xff\xccw;\x90\xff\xff\xff\xff" +
-	"ͱ\x00\x90\xff\xff\xff\xff\xce`X\x10\xff\xff\xff\xffϐ\xe2\x90\xff\xff\xff\xff\xd0n^\x90\xff\xff\xff\xff\xd1r\x16\x10\xff\xff\xff\xff\xd1\xfb2\x10\xff\xff\xff\xff\xd2i\xfe \xff\xff\xff\xff\xd3c)\xa0" +
-	"\xff\xff\xff\xff\xd4I\xe0 \xff\xff\xff\xff\xd5\x1e!\xa0\xff\xff\xff\xff\xd5B\xfd\x90\xff\xff\xff\xff\xd5\xdf\xe0\x10\xff\xff\xff\xff\xd6N\xac \xff\xff\xff\xff\xd6\xfe\x03\xa0\xff\xff\xff\xff\xd8.\x8e \xff\xff\xff\xff" +
-	"\xd8\xf9\x95 \xff\xff\xff\xff\xda\x0ep \xff\xff\xff\xff\xda\xeb\xec \xff\xff\xff\xff\xdb\xe5\x17\xa0\xff\xff\xff\xff\xdc\xcb\xce \xff\xff\xff\xff\xdd\xc4\xf9\xa0\xff\xff\xff\xff\u07b4\xea\xa0\xff\xff\xff\xff߮\x16 " +
-	"\xff\xff\xff\xff\xe0\x94̠\xff\xff\xff\xff\xe1rH\xa0\xff\xff\xff\xff\xe2kt \xff\xff\xff\xff\xe3R*\xa0\xff\xff\xff\xff\xe4T\x90\xa0\xff\xff\xff\xff\xe52\f\xa0\xff\xff\xff\xff\xe6=\xad \xff\xff\xff\xff" +
-	"\xe7\x1b) \xff\xff\xff\xff\xe8\x14T\xa0\x00\x00\x00\x00\x17\x03͐\x00\x00\x00\x00\x17\xf3\xbe\x90\x00\x00\x00\x00\x18㯐\x00\x00\x00\x00\x19Ӡ\x90\x00\x00\x00\x00\x1aÑ\x90\x00\x00\x00\x00\x1b\xbc\xbd\x10" +
-	"\x00\x00\x00\x00\x1c\xac\xae\x10\x00\x00\x00\x00\x1d\x9c\x9f\x10\x00\x00\x00\x00\x1e\x8c\x90\x10\x00\x00\x00\x00\x1f|\x81\x10\x00\x00\x00\x00 lr\x10\x00\x00\x00\x00!\\c\x10\x00\x00\x00\x00\"LT\x10\x00\x00\x00\x00" +
-	"#<E\x10\x00\x00\x00\x00$,6\x10\x00\x00\x00\x00%\x1c'\x10\x00\x00\x00\x00&\f\x18\x10\x00\x00\x00\x00'\x05C\x90\x00\x00\x00\x00'\xf54\x90\x00\x00\x00\x00(\xe5%\x90\x00\x00\x00\x00)\xd5\x16\x90" +
-	"\x00\x00\x00\x00*\xc5\a\x90\x00\x00\x00\x00+\xb4\xf8\x90\x00\x00\x00\x00,\xa4\xe9\x90\x00\x00\x00\x00-\x94ڐ\x00\x00\x00\x00.\x84ː\x00\x00\x00\x00/t\xbc\x90\x00\x00\x00\x000d\xad\x90\x00\x00\x00\x00" +
-	"1]\xd9\x10\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x03\x01\x03\x01\x03\x01" +
-	"\x03\x01\x03\x01\x02\x01\x02\x01\x03\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\xff" +
-	"\xff\xfa\xfc\x00\x00\x00\x00\x0e\x10\x01\x04\x00\x00\x00\x00\x00\b\x00\x00\x1c \x01\f\x00\x00\x0e\x10\x00\x11\x00\x00\x1c \x01\x15LMT\x00BST\x00GMT\x00BDST\x00CET\x00CEST" +
-	"\x00\nCET-1CEST,M3.5.0,M10.5.0/3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00k\xa4,\xb6?\x06\x00\x00?\x06\x00\x00\x0f\x00\x00\x00E" +
-	"urope/GuernseyTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00" +
-	"\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9f\x00\x00\x00\x05\x00\x00\x00\x11\xff\xff\xff\xff\x1a]\t\xcb\xff\xff\xff" +
-	"\xff\x9b&\xad\xa0\xff\xff\xff\xff\x9b\xd6\x05 \xff\xff\xff\xff\x9c\xcf0\xa0\xff\xff\xff\xff\x9d\xa4à\xff\xff\xff\xff\x9e\x9c\x9d\xa0\xff\xff\xff\xff\x9f\x97\x1a\xa0\xff\xff\xff\xff\xa0\x85\xba \xff\xff\xff\xff\xa1v\xfc" +
-	"\xa0\xff\xff\xff\xff\xa2e\x9c \xff\xff\xff\xff\xa3{Ƞ\xff\xff\xff\xff\xa4N\xb8\xa0\xff\xff\xff\xff\xa5?\xfb \xff\xff\xff\xff\xa6%` \xff\xff\xff\xff\xa7'\xc6 \xff\xff\xff\xff\xa8*, \xff\xff\xff" +
-	"\xff\xa8\xeb\xf8\xa0\xff\xff\xff\xff\xaa\x00Ӡ\xff\xff\xff\xff\xaa\xd5\x15 \xff\xff\xff\xff\xab\xe9\xf0 \xff\xff\xff\xff\xac\xc7l \xff\xff\xff\xff\xad\xc9\xd2 \xff\xff\xff\xff\xae\xa7N \xff\xff\xff\xff\xaf\xa0y" +
-	"\xa0\xff\xff\xff\xff\xb0\x870 \xff\xff\xff\xff\xb1\x92Р\xff\xff\xff\xff\xb2pL\xa0\xff\xff\xff\xff\xb3r\xb2\xa0\xff\xff\xff\xff\xb4P.\xa0\xff\xff\xff\xff\xb5IZ \xff\xff\xff\xff\xb60\x10\xa0\xff\xff\xff" +
-	"\xff\xb72v\xa0\xff\xff\xff\xff\xb8\x0f\xf2\xa0\xff\xff\xff\xff\xb9\x12X\xa0\xff\xff\xff\xff\xb9\xefԠ\xff\xff\xff\xff\xba\xe9\x00 \xff\xff\xff\xff\xbb\xd8\xf1 \xff\xff\xff\xff\xbc\xdbW \xff\xff\xff\xff\xbd\xb8\xd3" +
-	" \xff\xff\xff\xff\xbe\xb1\xfe\xa0\xff\xff\xff\xff\xbf\x98\xb5 \xff\xff\xff\xff\xc0\x9b\x1b \xff\xff\xff\xff\xc1x\x97 \xff\xff\xff\xff\xc2z\xfd \xff\xff\xff\xff\xc3Xy \xff\xff\xff\xff\xc4Q\xa4\xa0\xff\xff\xff" +
-	"\xff\xc58[ \xff\xff\xff\xff\xc6:\xc1 \xff\xff\xff\xff\xc7X֠\xff\xff\xff\xff\xc7\xda\t\xa0\xff\xff\xff\xff\xca\x16&\x90\xff\xff\xff\xffʗY\x90\xff\xff\xff\xff\xcb\xd1\x1e\x90\xff\xff\xff\xff\xccw;" +
-	"\x90\xff\xff\xff\xffͱ\x00\x90\xff\xff\xff\xff\xce`X\x10\xff\xff\xff\xffϐ\xe2\x90\xff\xff\xff\xff\xd0n^\x90\xff\xff\xff\xff\xd1r\x16\x10\xff\xff\xff\xff\xd1\xfb2\x10\xff\xff\xff\xff\xd2i\xfe \xff\xff\xff" +
-	"\xff\xd3c)\xa0\xff\xff\xff\xff\xd4I\xe0 \xff\xff\xff\xff\xd5\x1e!\xa0\xff\xff\xff\xff\xd5B\xfd\x90\xff\xff\xff\xff\xd5\xdf\xe0\x10\xff\xff\xff\xff\xd6N\xac \xff\xff\xff\xff\xd6\xfe\x03\xa0\xff\xff\xff\xff\xd8.\x8e" +
-	" \xff\xff\xff\xff\xd8\xf9\x95 \xff\xff\xff\xff\xda\x0ep \xff\xff\xff\xff\xda\xeb\xec \xff\xff\xff\xff\xdb\xe5\x17\xa0\xff\xff\xff\xff\xdc\xcb\xce \xff\xff\xff\xff\xdd\xc4\xf9\xa0\xff\xff\xff\xff\u07b4\xea\xa0\xff\xff\xff" +
-	"\xff߮\x16 \xff\xff\xff\xff\xe0\x94̠\xff\xff\xff\xff\xe1rH\xa0\xff\xff\xff\xff\xe2kt \xff\xff\xff\xff\xe3R*\xa0\xff\xff\xff\xff\xe4T\x90\xa0\xff\xff\xff\xff\xe52\f\xa0\xff\xff\xff\xff\xe6=\xad" +
-	" \xff\xff\xff\xff\xe7\x1b) \xff\xff\xff\xff\xe8\x14T\xa0\xff\xff\xff\xff\xe8\xfb\v \xff\xff\xff\xff\xe9\xfdq \xff\xff\xff\xff\xea\xda\xed \xff\xff\xff\xff\xeb\xddS \xff\xff\xff\xff\xec\xba\xcf \xff\xff\xff" +
-	"\xff\xed\xb3\xfa\xa0\xff\xff\xff\xff\ue6b1 \xff\xff\xff\xff\xef\x81g\xa0\xff\xff\xff\xff\xf0\x9f} \xff\xff\xff\xff\xf1aI\xa0\xff\xff\xff\xff\xf2\x7f_ \xff\xff\xff\xff\xf3Jf \xff\xff\xff\xff\xf4_A" +
-	" \xff\xff\xff\xff\xf5!\r\xa0\xff\xff\xff\xff\xf6?# \xff\xff\xff\xff\xf7\x00\xef\xa0\xff\xff\xff\xff\xf8\x1f\x05 \xff\xff\xff\xff\xf8\xe0Ѡ\xff\xff\xff\xff\xf9\xfe\xe7 \xff\xff\xff\xff\xfa\xc0\xb3\xa0\xff\xff\xff" +
-	"\xff\xfb\xe8\x03\xa0\xff\xff\xff\xff\xfc{\xab\xa0\xff\xff\xff\xff\xfdǻp\x00\x00\x00\x00\x03p\xc6 \x00\x00\x00\x00\x04)X \x00\x00\x00\x00\x05P\xa8 \x00\x00\x00\x00\x06\t: \x00\x00\x00\x00\a0\x8a" +
-	" \x00\x00\x00\x00\a\xe9\x1c \x00\x00\x00\x00\t\x10l \x00\x00\x00\x00\t\xc8\xfe \x00\x00\x00\x00\n\xf0N \x00\x00\x00\x00\v\xb2\x1a\xa0\x00\x00\x00\x00\f\xd00 \x00\x00\x00\x00\r\x91\xfc\xa0\x00\x00\x00" +
-	"\x00\x0e\xb0\x12 \x00\x00\x00\x00\x0fqޠ\x00\x00\x00\x00\x10\x99.\xa0\x00\x00\x00\x00\x11Q\xc0\xa0\x00\x00\x00\x00\x12y\x10\xa0\x00\x00\x00\x00\x131\xa2\xa0\x00\x00\x00\x00\x14X\xf2\xa0\x00\x00\x00\x00\x15#\xeb" +
-	"\x90\x00\x00\x00\x00\x168Ɛ\x00\x00\x00\x00\x17\x03͐\x00\x00\x00\x00\x18\x18\xa8\x90\x00\x00\x00\x00\x18㯐\x00\x00\x00\x00\x19\xf8\x8a\x90\x00\x00\x00\x00\x1aÑ\x90\x00\x00\x00\x00\x1b\xe1\xa7\x10\x00\x00\x00" +
-	"\x00\x1c\xac\xae\x10\x00\x00\x00\x00\x1d\xc1\x89\x10\x00\x00\x00\x00\x1e\x8c\x90\x10\x00\x00\x00\x00\x1f\xa1k\x10\x00\x00\x00\x00 lr\x10\x00\x00\x00\x00!\x81M\x10\x00\x00\x00\x00\"LT\x10\x00\x00\x00\x00#a/" +
-	"\x10\x00\x00\x00\x00$,6\x10\x00\x00\x00\x00%JK\x90\x00\x00\x00\x00&\f\x18\x10\x00\x00\x00\x00'*-\x90\x00\x00\x00\x00'\xf54\x90\x00\x00\x00\x00)\n\x0f\x90\x00\x00\x00\x00)\xd5\x16\x90\x00\x00\x00" +
-	"\x00*\xe9\xf1\x90\x00\x00\x00\x00+\xb4\xf8\x90\x00\x00\x00\x00,\xc9Ӑ\x00\x00\x00\x00-\x94ڐ\x00\x00\x00\x00.\xa9\xb5\x90\x00\x00\x00\x00/t\xbc\x90\x00\x00\x00\x000\x89\x97\x90\x00\x00\x00\x001]\xd9" +
-	"\x10\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03" +
-	"\x01\x02\x01\x02\x01\x03\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x04\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\xff\xff\xff\xb5\x00\x00\x00\x00\x0e\x10\x01\x04\x00\x00\x00\x00\x00\b\x00\x00" +
-	"\x1c \x01\f\x00\x00\x0e\x10\x00\x04LMT\x00BST\x00GMT\x00BDST\x00\nGMT0BST,M3.5.0/1,M10.5.0\nPK\x03\x04\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\xe5\xc8X\xa7\xe1\x01\x00\x00\xe1\x01\x00\x00\x0f\x00\x00\x00Europe/HelsinkiTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00#\x00\x00\x00\x04\x00\x00\x00\x11\xff\xff\xff\xffS\xba&\x9b\xff\xff\xff\xff\xa4so\x1b\xff\xff\xff\xff\xcb\xceQ`\xff\xff\xff\xff\xcc\xc0\xe5`\x00\x00\x00\x00\x15#݀\x00\x00\x00\x00\x16\x13\xce" +
-	"\x80\x00\x00\x00\x00\x17\x03\xbf\x80\x00\x00\x00\x00\x17\xf3\xb0\x80\x00\x00\x00\x00\x18㯐\x00\x00\x00\x00\x19Ӡ\x90\x00\x00\x00\x00\x1aÑ\x90\x00\x00\x00\x00\x1b\xbc\xbd\x10\x00\x00\x00\x00\x1c\xac\xae\x10\x00\x00\x00" +
-	"\x00\x1d\x9c\x9f\x10\x00\x00\x00\x00\x1e\x8c\x90\x10\x00\x00\x00\x00\x1f|\x81\x10\x00\x00\x00\x00 lr\x10\x00\x00\x00\x00!\\c\x10\x00\x00\x00\x00\"LT\x10\x00\x00\x00\x00#<E\x10\x00\x00\x00\x00$,6" +
-	"\x10\x00\x00\x00\x00%\x1c'\x10\x00\x00\x00\x00&\f\x18\x10\x00\x00\x00\x00'\x05C\x90\x00\x00\x00\x00'\xf54\x90\x00\x00\x00\x00(\xe5%\x90\x00\x00\x00\x00)\xd5\x16\x90\x00\x00\x00\x00*\xc5\a\x90\x00\x00\x00" +
-	"\x00+\xb4\xf8\x90\x00\x00\x00\x00,\xa4\xe9\x90\x00\x00\x00\x00-\x94ڐ\x00\x00\x00\x00.\x84ː\x00\x00\x00\x00/t\xbc\x90\x00\x00\x00\x000d\xad\x90\x00\x00\x00\x001]\xd9\x10\x01\x03\x02\x03\x02\x03\x02" +
-	"\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x00\x00\x17e\x00\x00\x00\x00\x17e\x00\x04\x00\x00*0\x01\b\x00\x00\x1c \x00\rLMT\x00HMT\x00" +
-	"EEST\x00EET\x00\nEET-2EEST,M3.5.0/3,M10.5.0/4\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00k\xa4,\xb6?\x06\x00" +
-	"\x00?\x06\x00\x00\x12\x00\x00\x00Europe/Isle_of_ManTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9f\x00\x00\x00\x05\x00\x00" +
-	"\x00\x11\xff\xff\xff\xff\x1a]\t\xcb\xff\xff\xff\xff\x9b&\xad\xa0\xff\xff\xff\xff\x9b\xd6\x05 \xff\xff\xff\xff\x9c\xcf0\xa0\xff\xff\xff\xff\x9d\xa4à\xff\xff\xff\xff\x9e\x9c\x9d\xa0\xff\xff\xff\xff\x9f\x97\x1a\xa0\xff\xff" +
-	"\xff\xff\xa0\x85\xba \xff\xff\xff\xff\xa1v\xfc\xa0\xff\xff\xff\xff\xa2e\x9c \xff\xff\xff\xff\xa3{Ƞ\xff\xff\xff\xff\xa4N\xb8\xa0\xff\xff\xff\xff\xa5?\xfb \xff\xff\xff\xff\xa6%` \xff\xff\xff\xff\xa7'" +
-	"\xc6 \xff\xff\xff\xff\xa8*, \xff\xff\xff\xff\xa8\xeb\xf8\xa0\xff\xff\xff\xff\xaa\x00Ӡ\xff\xff\xff\xff\xaa\xd5\x15 \xff\xff\xff\xff\xab\xe9\xf0 \xff\xff\xff\xff\xac\xc7l \xff\xff\xff\xff\xad\xc9\xd2 \xff\xff" +
-	"\xff\xff\xae\xa7N \xff\xff\xff\xff\xaf\xa0y\xa0\xff\xff\xff\xff\xb0\x870 \xff\xff\xff\xff\xb1\x92Р\xff\xff\xff\xff\xb2pL\xa0\xff\xff\xff\xff\xb3r\xb2\xa0\xff\xff\xff\xff\xb4P.\xa0\xff\xff\xff\xff\xb5I" +
-	"Z \xff\xff\xff\xff\xb60\x10\xa0\xff\xff\xff\xff\xb72v\xa0\xff\xff\xff\xff\xb8\x0f\xf2\xa0\xff\xff\xff\xff\xb9\x12X\xa0\xff\xff\xff\xff\xb9\xefԠ\xff\xff\xff\xff\xba\xe9\x00 \xff\xff\xff\xff\xbb\xd8\xf1 \xff\xff" +
-	"\xff\xff\xbc\xdbW \xff\xff\xff\xff\xbd\xb8\xd3 \xff\xff\xff\xff\xbe\xb1\xfe\xa0\xff\xff\xff\xff\xbf\x98\xb5 \xff\xff\xff\xff\xc0\x9b\x1b \xff\xff\xff\xff\xc1x\x97 \xff\xff\xff\xff\xc2z\xfd \xff\xff\xff\xff\xc3X" +
-	"y \xff\xff\xff\xff\xc4Q\xa4\xa0\xff\xff\xff\xff\xc58[ \xff\xff\xff\xff\xc6:\xc1 \xff\xff\xff\xff\xc7X֠\xff\xff\xff\xff\xc7\xda\t\xa0\xff\xff\xff\xff\xca\x16&\x90\xff\xff\xff\xffʗY\x90\xff\xff" +
-	"\xff\xff\xcb\xd1\x1e\x90\xff\xff\xff\xff\xccw;\x90\xff\xff\xff\xffͱ\x00\x90\xff\xff\xff\xff\xce`X\x10\xff\xff\xff\xffϐ\xe2\x90\xff\xff\xff\xff\xd0n^\x90\xff\xff\xff\xff\xd1r\x16\x10\xff\xff\xff\xff\xd1\xfb" +
-	"2\x10\xff\xff\xff\xff\xd2i\xfe \xff\xff\xff\xff\xd3c)\xa0\xff\xff\xff\xff\xd4I\xe0 \xff\xff\xff\xff\xd5\x1e!\xa0\xff\xff\xff\xff\xd5B\xfd\x90\xff\xff\xff\xff\xd5\xdf\xe0\x10\xff\xff\xff\xff\xd6N\xac \xff\xff" +
-	"\xff\xff\xd6\xfe\x03\xa0\xff\xff\xff\xff\xd8.\x8e \xff\xff\xff\xff\xd8\xf9\x95 \xff\xff\xff\xff\xda\x0ep \xff\xff\xff\xff\xda\xeb\xec \xff\xff\xff\xff\xdb\xe5\x17\xa0\xff\xff\xff\xff\xdc\xcb\xce \xff\xff\xff\xff\xdd\xc4" +
-	"\xf9\xa0\xff\xff\xff\xff\u07b4\xea\xa0\xff\xff\xff\xff߮\x16 \xff\xff\xff\xff\xe0\x94̠\xff\xff\xff\xff\xe1rH\xa0\xff\xff\xff\xff\xe2kt \xff\xff\xff\xff\xe3R*\xa0\xff\xff\xff\xff\xe4T\x90\xa0\xff\xff" +
-	"\xff\xff\xe52\f\xa0\xff\xff\xff\xff\xe6=\xad \xff\xff\xff\xff\xe7\x1b) \xff\xff\xff\xff\xe8\x14T\xa0\xff\xff\xff\xff\xe8\xfb\v \xff\xff\xff\xff\xe9\xfdq \xff\xff\xff\xff\xea\xda\xed \xff\xff\xff\xff\xeb\xdd" +
-	"S \xff\xff\xff\xff\xec\xba\xcf \xff\xff\xff\xff\xed\xb3\xfa\xa0\xff\xff\xff\xff\ue6b1 \xff\xff\xff\xff\xef\x81g\xa0\xff\xff\xff\xff\xf0\x9f} \xff\xff\xff\xff\xf1aI\xa0\xff\xff\xff\xff\xf2\x7f_ \xff\xff" +
-	"\xff\xff\xf3Jf \xff\xff\xff\xff\xf4_A \xff\xff\xff\xff\xf5!\r\xa0\xff\xff\xff\xff\xf6?# \xff\xff\xff\xff\xf7\x00\xef\xa0\xff\xff\xff\xff\xf8\x1f\x05 \xff\xff\xff\xff\xf8\xe0Ѡ\xff\xff\xff\xff\xf9\xfe" +
-	"\xe7 \xff\xff\xff\xff\xfa\xc0\xb3\xa0\xff\xff\xff\xff\xfb\xe8\x03\xa0\xff\xff\xff\xff\xfc{\xab\xa0\xff\xff\xff\xff\xfdǻp\x00\x00\x00\x00\x03p\xc6 \x00\x00\x00\x00\x04)X \x00\x00\x00\x00\x05P\xa8 \x00\x00" +
-	"\x00\x00\x06\t: \x00\x00\x00\x00\a0\x8a \x00\x00\x00\x00\a\xe9\x1c \x00\x00\x00\x00\t\x10l \x00\x00\x00\x00\t\xc8\xfe \x00\x00\x00\x00\n\xf0N \x00\x00\x00\x00\v\xb2\x1a\xa0\x00\x00\x00\x00\f\xd0" +
-	"0 \x00\x00\x00\x00\r\x91\xfc\xa0\x00\x00\x00\x00\x0e\xb0\x12 \x00\x00\x00\x00\x0fqޠ\x00\x00\x00\x00\x10\x99.\xa0\x00\x00\x00\x00\x11Q\xc0\xa0\x00\x00\x00\x00\x12y\x10\xa0\x00\x00\x00\x00\x131\xa2\xa0\x00\x00" +
-	"\x00\x00\x14X\xf2\xa0\x00\x00\x00\x00\x15#\xeb\x90\x00\x00\x00\x00\x168Ɛ\x00\x00\x00\x00\x17\x03͐\x00\x00\x00\x00\x18\x18\xa8\x90\x00\x00\x00\x00\x18㯐\x00\x00\x00\x00\x19\xf8\x8a\x90\x00\x00\x00\x00\x1a\xc3" +
-	"\x91\x90\x00\x00\x00\x00\x1b\xe1\xa7\x10\x00\x00\x00\x00\x1c\xac\xae\x10\x00\x00\x00\x00\x1d\xc1\x89\x10\x00\x00\x00\x00\x1e\x8c\x90\x10\x00\x00\x00\x00\x1f\xa1k\x10\x00\x00\x00\x00 lr\x10\x00\x00\x00\x00!\x81M\x10\x00\x00" +
-	"\x00\x00\"LT\x10\x00\x00\x00\x00#a/\x10\x00\x00\x00\x00$,6\x10\x00\x00\x00\x00%JK\x90\x00\x00\x00\x00&\f\x18\x10\x00\x00\x00\x00'*-\x90\x00\x00\x00\x00'\xf54\x90\x00\x00\x00\x00)\n" +
-	"\x0f\x90\x00\x00\x00\x00)\xd5\x16\x90\x00\x00\x00\x00*\xe9\xf1\x90\x00\x00\x00\x00+\xb4\xf8\x90\x00\x00\x00\x00,\xc9Ӑ\x00\x00\x00\x00-\x94ڐ\x00\x00\x00\x00.\xa9\xb5\x90\x00\x00\x00\x00/t\xbc\x90\x00\x00" +
-	"\x00\x000\x89\x97\x90\x00\x00\x00\x001]\xd9\x10\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x02\x01\x02\x01\x03\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x04\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\xff\xff\xff\xb5\x00\x00\x00" +
-	"\x00\x0e\x10\x01\x04\x00\x00\x00\x00\x00\b\x00\x00\x1c \x01\f\x00\x00\x0e\x10\x00\x04LMT\x00BST\x00GMT\x00BDST\x00\nGMT0BST,M3.5.0/1,M1" +
-	"0.5.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\aW\x10Ѱ\x04\x00\x00\xb0\x04\x00\x00\x0f\x00\x00\x00Europe/IstanbulTZif2\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00s\x00\x00\x00\x06\x00\x00\x00\x19\xff\xff\xff\xffV\xb6\xc8\xd8\xff\xff\xff\xff\x90\x8b\xf5\x98\xff\xff\xff\xff\x9b\f\x17`\xff\xff\xff\xff\x9bվ\xd0\xff\xff" +
-	"\xff\xff\xa2ec\xe0\xff\xff\xff\xff\xa3{\x82P\xff\xff\xff\xff\xa4N\x80`\xff\xff\xff\xff\xa5?\xb4\xd0\xff\xff\xff\xff\xa6%'\xe0\xff\xff\xff\xff\xa7'\x7f\xd0\xff\xff\xff\xff\xaa((`\xff\xff\xff\xff\xaa\xe1" +
-	"\xfd\xd0\xff\xff\xff\xff\xab\xf9\x89\xe0\xff\xff\xff\xff\xac\xc31P\xff\xff\xff\xffȁ?\xe0\xff\xff\xff\xff\xc9\x01\x13P\xff\xff\xff\xff\xc9J\xf5`\xff\xff\xff\xff\xca\u0380P\xff\xff\xff\xff\xcbˮ`\xff\xff" +
-	"\xff\xff\xd2k\tP\xff\xff\xff\xffӢ9`\xff\xff\xff\xff\xd4C\x02P\xff\xff\xff\xff\xd5L\r\xe0\xff\xff\xff\xff\xd6){\xd0\xff\xff\xff\xff\xd7+\xef\xe0\xff\xff\xff\xff\xd8\t]\xd0\xff\xff\xff\xff\xd9\x02" +
-	"\x97`\xff\xff\xff\xff\xd9\xe9?\xd0\xff\xff\xff\xff\xda\xeb\xb3\xe0\xff\xff\xff\xff\xdb\xd2\\P\xff\xff\xff\xff\xdc\xd4\xd0`\xff\xff\xff\xffݲ>P\xff\xff\xff\xff\xf1\xf4\xb9`\xff\xff\xff\xff\xf4b\xefP\xff\xff" +
-	"\xff\xff\xf5h\x06`\xff\xff\xff\xff\xf6\x1f8\xd0\x00\x00\x00\x00\x06n\x93p\x00\x00\x00\x00\a9\x9ap\x00\x00\x00\x00\a\xfbu\x00\x00\x00\x00\x00\t\x19|p\x00\x00\x00\x00\t\xd0\xcb\x00\x00\x00\x00\x00\n\xf9" +
-	"^p\x00\x00\x00\x00\v\xb1\xfe\x80\x00\x00\x00\x00\f\xd9@p\x00\x00\x00\x00\r\xa4U\x80\x00\x00\x00\x00\x0e\xa6\xadp\x00\x00\x00\x00\x0f\x847\x80\x00\x00\x00\x00\x0f\xf8\x11P\x00\x00\x00\x00\x19\x89\xb0p\x00\x00" +
-	"\x00\x00\x19ܰ\xe0\x00\x00\x00\x00\x1b\xe6\xd0\xf0\x00\x00\x00\x00\x1c\xc6\xef\xf0\x00\x00\x00\x00\x1d\x9b1p\x00\x00\x00\x00\x1e\x8cs\xf0\x00\x00\x00\x00\x1f|d\xf0\x00\x00\x00\x00 lU\xf0\x00\x00\x00\x00!\\" +
-	"F\xf0\x00\x00\x00\x00\"L7\xf0\x00\x00\x00\x00#<(\xf0\x00\x00\x00\x00$,\x19\xf0\x00\x00\x00\x00%\x1c\n\xf0\x00\x00\x00\x00&\v\xfb\xf0\x00\x00\x00\x00'\x05'p\x00\x00\x00\x00'\xf5\x18p\x00\x00" +
-	"\x00\x00(\xe5\tp\x00\x00\x00\x00)\xd4\xfap\x00\x00\x00\x00*\xc4\xebp\x00\x00\x00\x00+\xb4\xdcp\x00\x00\x00\x00,\xa4\xcdp\x00\x00\x00\x00-\x8b\x83\xf0\x00\x00\x00\x00.\x84\xafp\x00\x00\x00\x00/t" +
-	"\xa0p\x00\x00\x00\x000d\x91p\x00\x00\x00\x001]\xbc\xf0\x00\x00\x00\x002r\x97\xf0\x00\x00\x00\x003=\x9e\xf0\x00\x00\x00\x004Ry\xf0\x00\x00\x00\x005\x1d\x80\xf0\x00\x00\x00\x0062[\xf0\x00\x00" +
-	"\x00\x006\xfdb\xf0\x00\x00\x00\x008\x1bxp\x00\x00\x00\x008\xddD\xf0\x00\x00\x00\x009\xfbZp\x00\x00\x00\x00:\xbd&\xf0\x00\x00\x00\x00;\xdb<p\x00\x00\x00\x00<\xa6Cp\x00\x00\x00\x00=\xbb" +
-	"\x1ep\x00\x00\x00\x00>\x86%p\x00\x00\x00\x00?\x9b\x00p\x00\x00\x00\x00@f\ap\x00\x00\x00\x00A\x84\x1c\xf0\x00\x00\x00\x00BE\xe9p\x00\x00\x00\x00Cc\xfe\xf0\x00\x00\x00\x00D%\xcbp\x00\x00" +
-	"\x00\x00EC\xe0\xf0\x00\x00\x00\x00F\x05ɐ\x00\x00\x00\x00G#\xdf\x10\x00\x00\x00\x00G\xee\xe6\x10\x00\x00\x00\x00I\x03\xc1\x10\x00\x00\x00\x00I\xce\xc8\x10\x00\x00\x00\x00J\xe3\xa3\x10\x00\x00\x00\x00K\xae" +
-	"\xaa\x10\x00\x00\x00\x00L̿\x90\x00\x00\x00\x00M\x8fݐ\x00\x00\x00\x00N\xac\xa1\x90\x00\x00\x00\x00Onn\x10\x00\x00\x00\x00P\x8c\x83\x90\x00\x00\x00\x00QW\x8a\x90\x00\x00\x00\x00Rle\x90\x00\x00" +
-	"\x00\x00S8\xbe\x10\x00\x00\x00\x00TLG\x90\x00\x00\x00\x00U\x17N\x90\x00\x00\x00\x00V>\x9e\x90\x00\x00\x00\x00V\xf70\x90\x00\x00\x00\x00W\xcf.P\x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03" +
-	"\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x04\x05\x04\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02" +
-	"\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x04\x00\x00\x1b(\x00\x00\x00\x00\x1bh\x00\x04\x00\x00*0\x01\b\x00" +
-	"\x00\x1c \x00\r\x00\x00*0\x00\x11\x00\x008@\x01\x15LMT\x00IMT\x00EEST\x00EET\x00+03\x00+04\x00\n<+03>-3\nPK\x03\x04\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00k\xa4,\xb6?\x06\x00\x00?\x06\x00\x00\r\x00\x00\x00Europe/JerseyTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x9f\x00\x00\x00\x05\x00\x00\x00\x11\xff\xff\xff\xff\x1a]\t\xcb\xff\xff\xff\xff\x9b&\xad\xa0\xff\xff\xff\xff\x9b\xd6\x05 \xff\xff\xff\xff\x9c\xcf0\xa0\xff\xff\xff\xff\x9d\xa4à\xff\xff\xff\xff\x9e\x9c\x9d\xa0\xff\xff\xff" +
-	"\xff\x9f\x97\x1a\xa0\xff\xff\xff\xff\xa0\x85\xba \xff\xff\xff\xff\xa1v\xfc\xa0\xff\xff\xff\xff\xa2e\x9c \xff\xff\xff\xff\xa3{Ƞ\xff\xff\xff\xff\xa4N\xb8\xa0\xff\xff\xff\xff\xa5?\xfb \xff\xff\xff\xff\xa6%`" +
-	" \xff\xff\xff\xff\xa7'\xc6 \xff\xff\xff\xff\xa8*, \xff\xff\xff\xff\xa8\xeb\xf8\xa0\xff\xff\xff\xff\xaa\x00Ӡ\xff\xff\xff\xff\xaa\xd5\x15 \xff\xff\xff\xff\xab\xe9\xf0 \xff\xff\xff\xff\xac\xc7l \xff\xff\xff" +
-	"\xff\xad\xc9\xd2 \xff\xff\xff\xff\xae\xa7N \xff\xff\xff\xff\xaf\xa0y\xa0\xff\xff\xff\xff\xb0\x870 \xff\xff\xff\xff\xb1\x92Р\xff\xff\xff\xff\xb2pL\xa0\xff\xff\xff\xff\xb3r\xb2\xa0\xff\xff\xff\xff\xb4P." +
-	"\xa0\xff\xff\xff\xff\xb5IZ \xff\xff\xff\xff\xb60\x10\xa0\xff\xff\xff\xff\xb72v\xa0\xff\xff\xff\xff\xb8\x0f\xf2\xa0\xff\xff\xff\xff\xb9\x12X\xa0\xff\xff\xff\xff\xb9\xefԠ\xff\xff\xff\xff\xba\xe9\x00 \xff\xff\xff" +
-	"\xff\xbb\xd8\xf1 \xff\xff\xff\xff\xbc\xdbW \xff\xff\xff\xff\xbd\xb8\xd3 \xff\xff\xff\xff\xbe\xb1\xfe\xa0\xff\xff\xff\xff\xbf\x98\xb5 \xff\xff\xff\xff\xc0\x9b\x1b \xff\xff\xff\xff\xc1x\x97 \xff\xff\xff\xff\xc2z\xfd" +
-	" \xff\xff\xff\xff\xc3Xy \xff\xff\xff\xff\xc4Q\xa4\xa0\xff\xff\xff\xff\xc58[ \xff\xff\xff\xff\xc6:\xc1 \xff\xff\xff\xff\xc7X֠\xff\xff\xff\xff\xc7\xda\t\xa0\xff\xff\xff\xff\xca\x16&\x90\xff\xff\xff" +
-	"\xffʗY\x90\xff\xff\xff\xff\xcb\xd1\x1e\x90\xff\xff\xff\xff\xccw;\x90\xff\xff\xff\xffͱ\x00\x90\xff\xff\xff\xff\xce`X\x10\xff\xff\xff\xffϐ\xe2\x90\xff\xff\xff\xff\xd0n^\x90\xff\xff\xff\xff\xd1r\x16" +
-	"\x10\xff\xff\xff\xff\xd1\xfb2\x10\xff\xff\xff\xff\xd2i\xfe \xff\xff\xff\xff\xd3c)\xa0\xff\xff\xff\xff\xd4I\xe0 \xff\xff\xff\xff\xd5\x1e!\xa0\xff\xff\xff\xff\xd5B\xfd\x90\xff\xff\xff\xff\xd5\xdf\xe0\x10\xff\xff\xff" +
-	"\xff\xd6N\xac \xff\xff\xff\xff\xd6\xfe\x03\xa0\xff\xff\xff\xff\xd8.\x8e \xff\xff\xff\xff\xd8\xf9\x95 \xff\xff\xff\xff\xda\x0ep \xff\xff\xff\xff\xda\xeb\xec \xff\xff\xff\xff\xdb\xe5\x17\xa0\xff\xff\xff\xff\xdc\xcb\xce" +
-	" \xff\xff\xff\xff\xdd\xc4\xf9\xa0\xff\xff\xff\xff\u07b4\xea\xa0\xff\xff\xff\xff߮\x16 \xff\xff\xff\xff\xe0\x94̠\xff\xff\xff\xff\xe1rH\xa0\xff\xff\xff\xff\xe2kt \xff\xff\xff\xff\xe3R*\xa0\xff\xff\xff" +
-	"\xff\xe4T\x90\xa0\xff\xff\xff\xff\xe52\f\xa0\xff\xff\xff\xff\xe6=\xad \xff\xff\xff\xff\xe7\x1b) \xff\xff\xff\xff\xe8\x14T\xa0\xff\xff\xff\xff\xe8\xfb\v \xff\xff\xff\xff\xe9\xfdq \xff\xff\xff\xff\xea\xda\xed" +
-	" \xff\xff\xff\xff\xeb\xddS \xff\xff\xff\xff\xec\xba\xcf \xff\xff\xff\xff\xed\xb3\xfa\xa0\xff\xff\xff\xff\ue6b1 \xff\xff\xff\xff\xef\x81g\xa0\xff\xff\xff\xff\xf0\x9f} \xff\xff\xff\xff\xf1aI\xa0\xff\xff\xff" +
-	"\xff\xf2\x7f_ \xff\xff\xff\xff\xf3Jf \xff\xff\xff\xff\xf4_A \xff\xff\xff\xff\xf5!\r\xa0\xff\xff\xff\xff\xf6?# \xff\xff\xff\xff\xf7\x00\xef\xa0\xff\xff\xff\xff\xf8\x1f\x05 \xff\xff\xff\xff\xf8\xe0\xd1" +
-	"\xa0\xff\xff\xff\xff\xf9\xfe\xe7 \xff\xff\xff\xff\xfa\xc0\xb3\xa0\xff\xff\xff\xff\xfb\xe8\x03\xa0\xff\xff\xff\xff\xfc{\xab\xa0\xff\xff\xff\xff\xfdǻp\x00\x00\x00\x00\x03p\xc6 \x00\x00\x00\x00\x04)X \x00\x00\x00" +
-	"\x00\x05P\xa8 \x00\x00\x00\x00\x06\t: \x00\x00\x00\x00\a0\x8a \x00\x00\x00\x00\a\xe9\x1c \x00\x00\x00\x00\t\x10l \x00\x00\x00\x00\t\xc8\xfe \x00\x00\x00\x00\n\xf0N \x00\x00\x00\x00\v\xb2\x1a" +
-	"\xa0\x00\x00\x00\x00\f\xd00 \x00\x00\x00\x00\r\x91\xfc\xa0\x00\x00\x00\x00\x0e\xb0\x12 \x00\x00\x00\x00\x0fqޠ\x00\x00\x00\x00\x10\x99.\xa0\x00\x00\x00\x00\x11Q\xc0\xa0\x00\x00\x00\x00\x12y\x10\xa0\x00\x00\x00" +
-	"\x00\x131\xa2\xa0\x00\x00\x00\x00\x14X\xf2\xa0\x00\x00\x00\x00\x15#\xeb\x90\x00\x00\x00\x00\x168Ɛ\x00\x00\x00\x00\x17\x03͐\x00\x00\x00\x00\x18\x18\xa8\x90\x00\x00\x00\x00\x18㯐\x00\x00\x00\x00\x19\xf8\x8a" +
-	"\x90\x00\x00\x00\x00\x1aÑ\x90\x00\x00\x00\x00\x1b\xe1\xa7\x10\x00\x00\x00\x00\x1c\xac\xae\x10\x00\x00\x00\x00\x1d\xc1\x89\x10\x00\x00\x00\x00\x1e\x8c\x90\x10\x00\x00\x00\x00\x1f\xa1k\x10\x00\x00\x00\x00 lr\x10\x00\x00\x00" +
-	"\x00!\x81M\x10\x00\x00\x00\x00\"LT\x10\x00\x00\x00\x00#a/\x10\x00\x00\x00\x00$,6\x10\x00\x00\x00\x00%JK\x90\x00\x00\x00\x00&\f\x18\x10\x00\x00\x00\x00'*-\x90\x00\x00\x00\x00'\xf54" +
-	"\x90\x00\x00\x00\x00)\n\x0f\x90\x00\x00\x00\x00)\xd5\x16\x90\x00\x00\x00\x00*\xe9\xf1\x90\x00\x00\x00\x00+\xb4\xf8\x90\x00\x00\x00\x00,\xc9Ӑ\x00\x00\x00\x00-\x94ڐ\x00\x00\x00\x00.\xa9\xb5\x90\x00\x00\x00" +
-	"\x00/t\xbc\x90\x00\x00\x00\x000\x89\x97\x90\x00\x00\x00\x001]\xd9\x10\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x02\x01\x02\x01\x03\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x04\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\xff\xff\xff\xb5\x00\x00\x00\x00\x0e\x10\x01\x04\x00\x00\x00\x00\x00\b\x00\x00\x1c \x01\f\x00\x00\x0e\x10\x00\x04LMT\x00BST\x00GMT\x00BDST\x00\nGMT0BST,M3.5" +
-	".0/1,M10.5.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00O+j\x94\x88\x03\x00\x00\x88\x03\x00\x00\x12\x00\x00\x00Europe/Kaliningra" +
-	"dTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00P\x00\x00\x00\b\x00\x00\x00\"\xff\xff\xff\xffo\xa2[H\xff\xff\xff\xff\x9b\f\x17`\xff\xff\xff\xff\x9b\xd5\xda\xf0" +
-	"\xff\xff\xff\xff\x9cٮ\x90\xff\xff\xff\xff\x9d\xa4\xb5\x90\xff\xff\xff\xff\x9e\xb9\x90\x90\xff\xff\xff\xff\x9f\x84\x97\x90\xff\xff\xff\xff\xc8\tq\x90\xff\xff\xff\xff\xcc\xe7K\x10\xff\xff\xff\xffͩ\x17\x90\xff\xff\xff\xff" +
-	"\u03a2C\x10\xff\xff\xff\xffϒ4\x10\xff\xff\xff\xffЂ%\x10\xff\xff\xff\xff\xd1r\x16\x10\xff\xff\xff\xff\xd1|w\xe0\xff\xff\xff\xffѕ\x84`\xff\xff\xff\xffҊ\xadP\xff\xff\xff\xff\xd3Y\xb6\xe0" +
-	"\x00\x00\x00\x00\x15'\xa7\xd0\x00\x00\x00\x00\x16\x18\xdc@\x00\x00\x00\x00\x17\b\xdbP\x00\x00\x00\x00\x17\xfa\x0f\xc0\x00\x00\x00\x00\x18\xea\x0e\xd0\x00\x00\x00\x00\x19\xdbC@\x00\x00\x00\x00\x1a̓\xd0\x00\x00\x00\x00" +
-	"\x1b\xbc\xa0\xf0\x00\x00\x00\x00\x1c\xac\x91\xf0\x00\x00\x00\x00\x1d\x9c\x82\xf0\x00\x00\x00\x00\x1e\x8cs\xf0\x00\x00\x00\x00\x1f|d\xf0\x00\x00\x00\x00 lU\xf0\x00\x00\x00\x00!\\F\xf0\x00\x00\x00\x00\"L7\xf0" +
-	"\x00\x00\x00\x00#<(\xf0\x00\x00\x00\x00$,\x19\xf0\x00\x00\x00\x00%\x1c\x19\x00\x00\x00\x00\x00&\f\n\x00\x00\x00\x00\x00'\x055\x80\x00\x00\x00\x00'\xf5&\x80\x00\x00\x00\x00(\xe5\x17\x80\x00\x00\x00\x00" +
-	")\xd5\b\x80\x00\x00\x00\x00*\xc4\xf9\x80\x00\x00\x00\x00+\xb4\xea\x80\x00\x00\x00\x00,\xa4ۀ\x00\x00\x00\x00-\x94̀\x00\x00\x00\x00.\x84\xbd\x80\x00\x00\x00\x00/t\xae\x80\x00\x00\x00\x000d\x9f\x80" +
-	"\x00\x00\x00\x001]\xcb\x00\x00\x00\x00\x002r\xa6\x00\x00\x00\x00\x003=\xad\x00\x00\x00\x00\x004R\x88\x00\x00\x00\x00\x005\x1d\x8f\x00\x00\x00\x00\x0062j\x00\x00\x00\x00\x006\xfdq\x00\x00\x00\x00\x00" +
-	"8\x1b\x86\x80\x00\x00\x00\x008\xddS\x00\x00\x00\x00\x009\xfbh\x80\x00\x00\x00\x00:\xbd5\x00\x00\x00\x00\x00;\xdbJ\x80\x00\x00\x00\x00<\xa6Q\x80\x00\x00\x00\x00=\xbb,\x80\x00\x00\x00\x00>\x863\x80" +
-	"\x00\x00\x00\x00?\x9b\x0e\x80\x00\x00\x00\x00@f\x15\x80\x00\x00\x00\x00A\x84+\x00\x00\x00\x00\x00BE\xf7\x80\x00\x00\x00\x00Cd\r\x00\x00\x00\x00\x00D%ـ\x00\x00\x00\x00EC\xef\x00\x00\x00\x00\x00" +
-	"F\x05\xbb\x80\x00\x00\x00\x00G#\xd1\x00\x00\x00\x00\x00G\xee\xd8\x00\x00\x00\x00\x00I\x03\xb3\x00\x00\x00\x00\x00Iκ\x00\x00\x00\x00\x00J\xe3\x95\x00\x00\x00\x00\x00K\xae\x9c\x00\x00\x00\x00\x00Ḻ\x80" +
-	"\x00\x00\x00\x00M\x8e~\x00\x00\x00\x00\x00TL+p\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x04\x03\x04\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04" +
-	"\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\a\x04\x00\x00\x138\x00\x00\x00\x00\x1c \x01\x04\x00\x00\x0e\x10\x00\t\x00\x00*0\x01\r" +
-	"\x00\x00\x1c \x00\x12\x00\x008@\x01\x16\x00\x00*0\x00\x1a\x00\x00*0\x00\x1eLMT\x00CEST\x00CET\x00EEST\x00EET\x00MSD\x00MSK\x00+03\x00\nE" +
-	"ET-2\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00iS\x18D.\x02\x00\x00.\x02\x00\x00\v\x00\x00\x00Europe/KievTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\x00\x00\x00\b\x00\x00\x00\"\xff\xff\xff\xffV\xb6\xc7d\xff\xff\xff\xff\xaa\x19\xa7d\xff\xff\xff\xff\xb5\xa4\x19`\xff\xff\xff\xff\xca\xcd.\xd0\xff\xff\xff\xff\xcc\xe7K" +
-	"\x10\xff\xff\xff\xffͩ\x17\x90\xff\xff\xff\xff\u03a2C\x10\xff\xff\xff\xff\xceͨp\x00\x00\x00\x00\x15'\xa7\xd0\x00\x00\x00\x00\x16\x18\xdc@\x00\x00\x00\x00\x17\b\xdbP\x00\x00\x00\x00\x17\xfa\x0f\xc0\x00\x00\x00" +
-	"\x00\x18\xea\x0e\xd0\x00\x00\x00\x00\x19\xdbC@\x00\x00\x00\x00\x1a̓\xd0\x00\x00\x00\x00\x1b\xbc\xa0\xf0\x00\x00\x00\x00\x1c\xac\x91\xf0\x00\x00\x00\x00\x1d\x9c\x82\xf0\x00\x00\x00\x00\x1e\x8cs\xf0\x00\x00\x00\x00\x1f|d" +
-	"\xf0\x00\x00\x00\x00 lU\xf0\x00\x00\x00\x00!\\F\xf0\x00\x00\x00\x00\"L7\xf0\x00\x00\x00\x00#<(\xf0\x00\x00\x00\x00$,\x19\xf0\x00\x00\x00\x00%\x1c\n\xf0\x00\x00\x00\x00&\v\xfb\xf0\x00\x00\x00" +
-	"\x00&\x8d \xe0\x00\x00\x00\x00(\xe5\x17\x80\x00\x00\x00\x00)\xd5\b\x80\x00\x00\x00\x00*\xc4\xf9\x80\x00\x00\x00\x00+\xb4\xea\x80\x00\x00\x00\x00,\xa4ۀ\x00\x00\x00\x00-\x94̀\x00\x00\x00\x00.\x84\xbd" +
-	"\x80\x00\x00\x00\x00/t\xae\x80\x00\x00\x00\x000d\x9f\x80\x00\x00\x00\x001]\xcb\x00\x00\x00\x00\x002r\xb4\x10\x01\x02\x03\x05\x04\x05\x04\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06" +
-	"\a\x02\a\x02\a\x02\a\x02\a\x02\a\x02\x00\x00\x1c\x9c\x00\x00\x00\x00\x1c\x9c\x00\x04\x00\x00\x1c \x00\b\x00\x00*0\x00\f\x00\x00\x0e\x10\x00\x10\x00\x00\x1c \x01\x14\x00\x008@\x01\x19\x00\x00*0\x01\x1d" +
-	"LMT\x00KMT\x00EET\x00MSK\x00CET\x00CEST\x00MSD\x00EEST\x00\nEET-2EEST,M3.5.0/3,M10.5." +
-	"0/4\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\xfe\x83\xe5\xcd\x02\x00\x00\xcd\x02\x00\x00\f\x00\x00\x00Europe/KirovTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?\x00\x00\x00\x05\x00\x00\x00\x10\xff\xff\xff\xff\xa1\x009\x80\xff\xff\xff\xff\xb5\xa4\vP\x00\x00\x00\x00\x15'\x99\xc0\x00\x00\x00\x00\x16\x18\xce0\x00\x00\x00\x00\x17\b\xcd" +
-	"@\x00\x00\x00\x00\x17\xfa\x01\xb0\x00\x00\x00\x00\x18\xea\x00\xc0\x00\x00\x00\x00\x19\xdb50\x00\x00\x00\x00\x1a̅\xc0\x00\x00\x00\x00\x1b\xbc\x92\xe0\x00\x00\x00\x00\x1c\xac\x83\xe0\x00\x00\x00\x00\x1d\x9ct\xe0\x00\x00\x00" +
-	"\x00\x1e\x8ce\xe0\x00\x00\x00\x00\x1f|V\xe0\x00\x00\x00\x00 lG\xe0\x00\x00\x00\x00!\\8\xe0\x00\x00\x00\x00\"L)\xe0\x00\x00\x00\x00#<\x1a\xe0\x00\x00\x00\x00$,\v\xe0\x00\x00\x00\x00%\x1c\n" +
-	"\xf0\x00\x00\x00\x00&\v\xfb\xf0\x00\x00\x00\x00'\x05'p\x00\x00\x00\x00'\xf5\x18p\x00\x00\x00\x00)\xd4\xec`\x00\x00\x00\x00*\xc4\xebp\x00\x00\x00\x00+\xb4\xdcp\x00\x00\x00\x00,\xa4\xcdp\x00\x00\x00" +
-	"\x00-\x94\xbep\x00\x00\x00\x00.\x84\xafp\x00\x00\x00\x00/t\xa0p\x00\x00\x00\x000d\x91p\x00\x00\x00\x001]\xbc\xf0\x00\x00\x00\x002r\x97\xf0\x00\x00\x00\x003=\x9e\xf0\x00\x00\x00\x004Ry" +
-	"\xf0\x00\x00\x00\x005\x1d\x80\xf0\x00\x00\x00\x0062[\xf0\x00\x00\x00\x006\xfdb\xf0\x00\x00\x00\x008\x1bxp\x00\x00\x00\x008\xddD\xf0\x00\x00\x00\x009\xfbZp\x00\x00\x00\x00:\xbd&\xf0\x00\x00\x00" +
-	"\x00;\xdb<p\x00\x00\x00\x00<\xa6Cp\x00\x00\x00\x00=\xbb\x1ep\x00\x00\x00\x00>\x86%p\x00\x00\x00\x00?\x9b\x00p\x00\x00\x00\x00@f\ap\x00\x00\x00\x00A\x84\x1c\xf0\x00\x00\x00\x00BE\xe9" +
-	"p\x00\x00\x00\x00Cc\xfe\xf0\x00\x00\x00\x00D%\xcbp\x00\x00\x00\x00EC\xe0\xf0\x00\x00\x00\x00F\x05\xadp\x00\x00\x00\x00G#\xc2\xf0\x00\x00\x00\x00G\xee\xc9\xf0\x00\x00\x00\x00I\x03\xa4\xf0\x00\x00\x00" +
-	"\x00IΫ\xf0\x00\x00\x00\x00J\xe3\x86\xf0\x00\x00\x00\x00K\xae\x8d\xf0\x00\x00\x00\x00Ḷp\x00\x00\x00\x00M\x8eo\xf0\x00\x00\x00\x00TL\x1d`\x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02" +
-	"\x03\x02\x03\x04\x01\x04\x01\x03\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x03\x01\x00\x00.\x98\x00\x00\x00\x00*0\x00\x04" +
-	"\x00\x00FP\x01\b\x00\x008@\x00\f\x00\x008@\x01\fLMT\x00+03\x00+05\x00+04\x00\n<+03>-3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00iS\x18" +
-	"D.\x02\x00\x00.\x02\x00\x00\v\x00\x00\x00Europe/KyivTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\x00\x00\x00\b\x00\x00\x00\"\xff" +
-	"\xff\xff\xffV\xb6\xc7d\xff\xff\xff\xff\xaa\x19\xa7d\xff\xff\xff\xff\xb5\xa4\x19`\xff\xff\xff\xff\xca\xcd.\xd0\xff\xff\xff\xff\xcc\xe7K\x10\xff\xff\xff\xffͩ\x17\x90\xff\xff\xff\xff\u03a2C\x10\xff\xff\xff\xff\xce" +
-	"ͨp\x00\x00\x00\x00\x15'\xa7\xd0\x00\x00\x00\x00\x16\x18\xdc@\x00\x00\x00\x00\x17\b\xdbP\x00\x00\x00\x00\x17\xfa\x0f\xc0\x00\x00\x00\x00\x18\xea\x0e\xd0\x00\x00\x00\x00\x19\xdbC@\x00\x00\x00\x00\x1a̓\xd0\x00" +
-	"\x00\x00\x00\x1b\xbc\xa0\xf0\x00\x00\x00\x00\x1c\xac\x91\xf0\x00\x00\x00\x00\x1d\x9c\x82\xf0\x00\x00\x00\x00\x1e\x8cs\xf0\x00\x00\x00\x00\x1f|d\xf0\x00\x00\x00\x00 lU\xf0\x00\x00\x00\x00!\\F\xf0\x00\x00\x00\x00\"" +
-	"L7\xf0\x00\x00\x00\x00#<(\xf0\x00\x00\x00\x00$,\x19\xf0\x00\x00\x00\x00%\x1c\n\xf0\x00\x00\x00\x00&\v\xfb\xf0\x00\x00\x00\x00&\x8d \xe0\x00\x00\x00\x00(\xe5\x17\x80\x00\x00\x00\x00)\xd5\b\x80\x00" +
-	"\x00\x00\x00*\xc4\xf9\x80\x00\x00\x00\x00+\xb4\xea\x80\x00\x00\x00\x00,\xa4ۀ\x00\x00\x00\x00-\x94̀\x00\x00\x00\x00.\x84\xbd\x80\x00\x00\x00\x00/t\xae\x80\x00\x00\x00\x000d\x9f\x80\x00\x00\x00\x001" +
-	"]\xcb\x00\x00\x00\x00\x002r\xb4\x10\x01\x02\x03\x05\x04\x05\x04\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\a\x02\a\x02\a\x02\a\x02\a\x02\a\x02\x00\x00\x1c\x9c\x00\x00\x00\x00\x1c\x9c" +
-	"\x00\x04\x00\x00\x1c \x00\b\x00\x00*0\x00\f\x00\x00\x0e\x10\x00\x10\x00\x00\x1c \x01\x14\x00\x008@\x01\x19\x00\x00*0\x01\x1dLMT\x00KMT\x00EET\x00MSK\x00CET\x00CE" +
-	"ST\x00MSD\x00EEST\x00\nEET-2EEST,M3.5.0/3,M10.5.0/4\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00&S\x03\t" +
-	"\xae\x05\x00\x00\xae\x05\x00\x00\r\x00\x00\x00Europe/LisbonTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\x00\x00\x00\x06\x00\x00\x00\x1b" +
-	"\xff\xff\xff\xff^=\f\x1d\xff\xff\xff\xff\x92掀\xff\xff\xff\xff\x9bKmp\xff\xff\xff\xff\x9b\xfeǀ\xff\xff\xff\xff\x9c\x9c\xedp\xff\xff\xff\xff\x9dɃp\xff\xff\xff\xff\x9e\x7frp\xff\xff\xff\xff" +
-	"\x9f\xaa\xb6\xf0\xff\xff\xff\xff\xa0_Tp\xff\xff\xff\xff\xa1\x8b\xeap\xff\xff\xff\xff\xa2A\xd9p\xff\xff\xff\xff\xa3nop\xff\xff\xff\xff\xa4#\f\xf0\xff\xff\xff\xff\xa5O\xa2\xf0\xff\xff\xff\xff\xaa\x05\xefp" +
-	"\xff\xff\xff\xff\xaa\xf4\x8e\xf0\xff\xff\xff\xff\xadɧ\xf0\xff\xff\xff\xff\xae\xa7#\xf0\xff\xff\xff\xff\xaf\xa0Op\xff\xff\xff\xff\xb0\x87\x05\xf0\xff\xff\xff\xff\xb1\x89k\xf0\xff\xff\xff\xff\xb2p\"p\xff\xff\xff\xff" +
-	"\xb3r\x88p\xff\xff\xff\xff\xb4P\x04p\xff\xff\xff\xff\xb72Lp\xff\xff\xff\xff\xb8\x0f\xc8p\xff\xff\xff\xff\xb8\xff\xb9p\xff\xff\xff\xff\xb9\xef\xaap\xff\xff\xff\xff\xbcȷ\xf0\xff\xff\xff\xff\xbd\xb8\xa8\xf0" +
-	"\xff\xff\xff\xff\xbe\x9f_p\xff\xff\xff\xff\xbf\x98\x8a\xf0\xff\xff\xff\xff\xc0\x9a\xf0\xf0\xff\xff\xff\xff\xc1xl\xf0\xff\xff\xff\xff\xc2h]\xf0\xff\xff\xff\xff\xc3XN\xf0\xff\xff\xff\xff\xc4?\x05p\xff\xff\xff\xff" +
-	"\xc580\xf0\xff\xff\xff\xff\xc6:\x96\xf0\xff\xff\xff\xff\xc7X\xacp\xff\xff\xff\xff\xc7\xd9\xdfp\xff\xff\xff\xff\xc9\x01/p\xff\xff\xff\xff\xc9\xf1 p\xff\xff\xff\xff\xca\xe2b\xf0\xff\xff\xff\xff˵R\xf0" +
-	"\xff\xff\xff\xff\xcb\xec\xa3\xe0\xff\xff\xff\xff̀K\xe0\xff\xff\xff\xff\xccܢ\xf0\xff\xff\xff\xff͕4\xf0\xff\xff\xff\xff\xcd\xc3K`\xff\xff\xff\xff\xcer\xa2\xe0\xff\xff\xff\xff\xceſp\xff\xff\xff\xff" +
-	"\xcfu\x16\xf0\xff\xff\xff\xffϬg\xe0\xff\xff\xff\xff\xd0R\x84\xe0\xff\xff\xff\xffХ\xa1p\xff\xff\xff\xff\xd1T\xf8\xf0\xff\xff\xff\xffьI\xe0\xff\xff\xff\xff\xd22f\xe0\xff\xff\xff\xff҅\x83p" +
-	"\xff\xff\xff\xff\xd3Y\xc4\xf0\xff\xff\xff\xff\xd4I\xb5\xf0\xff\xff\xff\xff\xd59\xd1 \xff\xff\xff\xff\xd6)\xc2 \xff\xff\xff\xff\xd7\x19\xb3 \xff\xff\xff\xff\xd8\t\xa4 \xff\xff\xff\xff\xd8\xf9\x95 \xff\xff\xff\xff" +
-	"\xd9\xe9\x86 \xff\xff\xff\xff\xda\xd9w \xff\xff\xff\xff\xdb\xc9h \xff\xff\xff\xffܹY \xff\xff\xff\xffݲ\x84\xa0\xff\xff\xff\xffޢu\xa0\xff\xff\xff\xffߒf\xa0\xff\xff\xff\xff\xe0\x82W\xa0" +
-	"\xff\xff\xff\xff\xe1rH\xa0\xff\xff\xff\xff\xe2b9\xa0\xff\xff\xff\xff\xe3R*\xa0\xff\xff\xff\xff\xe4B\x1b\xa0\xff\xff\xff\xff\xe52\f\xa0\xff\xff\xff\xff\xe6!\xfd\xa0\xff\xff\xff\xff\xe7\x1b) \xff\xff\xff\xff" +
-	"\xe8\v\x1a \xff\xff\xff\xff\xe8\xfb\v \xff\xff\xff\xff\xe9\xea\xfc \xff\xff\xff\xff\xea\xda\xed \xff\xff\xff\xff\xeb\xca\xde \xff\xff\xff\xff\xec\xba\xcf \xff\xff\xff\xff\xed\xaa\xc0 \xff\xff\xff\xff\ue6b1 " +
-	"\xff\xff\xff\xff\uf2a2 \xff\xff\xff\xff\xf0z\x93 \xff\xff\xff\xff\xf1j\x84 \xff\xff\xff\xff\xf2c\xaf\xa0\xff\xff\xff\xff\xf3S\xa0\xa0\xff\xff\xff\xff\xf4C\x91\xa0\xff\xff\xff\xff\xf53\x82\xa0\xff\xff\xff\xff" +
-	"\xf6#s\xa0\xff\xff\xff\xff\xf7\x13d\xa0\xff\xff\xff\xff\xf8\x03U\xa0\xff\xff\xff\xff\xf8\xf3F\xa0\x00\x00\x00\x00\f\xab*\x00\x00\x00\x00\x00\r\x9b\x1b\x00\x00\x00\x00\x00\x0e\x8b\f\x00\x00\x00\x00\x00\x0f\x847\x80" +
-	"\x00\x00\x00\x00\x10t(\x80\x00\x00\x00\x00\x11d\x19\x80\x00\x00\x00\x00\x12T\x18\x90\x00\x00\x00\x00\x13C\xfb\x80\x00\x00\x00\x00\x143\xfa\x90\x00\x00\x00\x00\x15#\xeb\x90\x00\x00\x00\x00\x16\x13ܐ\x00\x00\x00\x00" +
-	"\x17\x03͐\x00\x00\x00\x00\x17\xf3\xbe\x90\x00\x00\x00\x00\x18㽠\x00\x00\x00\x00\x19Ӡ\x90\x00\x00\x00\x00\x1aÑ\x90\x00\x00\x00\x00\x1b\xbc\xbd\x10\x00\x00\x00\x00\x1c\xac\xae\x10\x00\x00\x00\x00\x1d\x9c\x9f\x10" +
-	"\x00\x00\x00\x00\x1e\x8c\x90\x10\x00\x00\x00\x00\x1f|\x81\x10\x00\x00\x00\x00 lr\x10\x00\x00\x00\x00!\\c\x10\x00\x00\x00\x00\"LT\x10\x00\x00\x00\x00#<E\x10\x00\x00\x00\x00$,6\x10\x00\x00\x00\x00" +
-	"%\x1c'\x10\x00\x00\x00\x00&\f\x18\x10\x00\x00\x00\x00'\x05C\x90\x00\x00\x00\x00'\xf54\x90\x00\x00\x00\x00(\xe5%\x90\x00\x00\x00\x00)\xd5\x16\x90\x00\x00\x00\x00*\xc5\a\x90\x00\x00\x00\x00+\xb4\xf8\x90" +
-	"\x00\x00\x00\x00,\xa4\xe9\x90\x00\x00\x00\x00-\x94ڐ\x00\x00\x00\x00.\x84ː\x00\x00\x00\x00/t\xbc\x90\x00\x00\x00\x000d\xad\x90\x00\x00\x00\x001]\xd9\x10\x00\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x03\x01\x02\x01\x03\x01\x02\x01\x03\x01\x02\x01\x03\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x04\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x04\x05\x04\x05\x04\x05\x04\x01\xff\xff\xf7c\x00\x00\x00\x00\x0e\x10\x01\x04\x00\x00\x00\x00\x00\t\x00\x00\x1c \x01\r\x00\x00\x0e\x10\x00\x12\x00\x00\x1c \x01\x16LMT\x00WEST\x00WET\x00WE" +
-	"MT\x00CET\x00CEST\x00\nWET0WEST,M3.5.0/1,M10.5.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe1C\xf9\xa1\xde\x01\x00" +
-	"\x00\xde\x01\x00\x00\x10\x00\x00\x00Europe/LjubljanaTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00$\x00\x00\x00\x03\x00\x00\x00\r" +
-	"\xff\xff\xff\xff^<\xf0H\xff\xff\xff\xff\xca\x025\xe0\xff\xff\xff\xff\xcc\xe7K\x10\xff\xff\xff\xffͩ\x17\x90\xff\xff\xff\xff\u03a2C\x10\xff\xff\xff\xffϒ4\x10\xff\xff\xff\xffЂ%\x10\xff\xff\xff\xff" +
-	"ѡ\x8c\x10\xff\xff\xff\xff\xd2N@\x90\x00\x00\x00\x00\x18㯐\x00\x00\x00\x00\x19Ӡ\x90\x00\x00\x00\x00\x1aÑ\x90\x00\x00\x00\x00\x1b\xbc\xbd\x10\x00\x00\x00\x00\x1c\xac\xae\x10\x00\x00\x00\x00\x1d\x9c\x9f\x10" +
-	"\x00\x00\x00\x00\x1e\x8c\x90\x10\x00\x00\x00\x00\x1f|\x81\x10\x00\x00\x00\x00 lr\x10\x00\x00\x00\x00!\\c\x10\x00\x00\x00\x00\"LT\x10\x00\x00\x00\x00#<E\x10\x00\x00\x00\x00$,6\x10\x00\x00\x00\x00" +
-	"%\x1c'\x10\x00\x00\x00\x00&\f\x18\x10\x00\x00\x00\x00'\x05C\x90\x00\x00\x00\x00'\xf54\x90\x00\x00\x00\x00(\xe5%\x90\x00\x00\x00\x00)\xd5\x16\x90\x00\x00\x00\x00*\xc5\a\x90\x00\x00\x00\x00+\xb4\xf8\x90" +
-	"\x00\x00\x00\x00,\xa4\xe9\x90\x00\x00\x00\x00-\x94ڐ\x00\x00\x00\x00.\x84ː\x00\x00\x00\x00/t\xbc\x90\x00\x00\x00\x000d\xad\x90\x00\x00\x00\x001]\xd9\x10\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x00\x00\x138\x00\x00\x00\x00\x0e\x10\x00\x04\x00\x00\x1c \x01\bLMT\x00CET\x00CEST\x00\nCET-" +
-	"1CEST,M3.5.0,M10.5.0/3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00k\xa4,\xb6?\x06\x00\x00?\x06\x00\x00\r\x00\x00\x00Europe/" +
-	"LondonTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZi" +
-	"f2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9f\x00\x00\x00\x05\x00\x00\x00\x11\xff\xff\xff\xff\x1a]\t\xcb\xff\xff\xff\xff\x9b&\xad\xa0\xff\xff\xff" +
-	"\xff\x9b\xd6\x05 \xff\xff\xff\xff\x9c\xcf0\xa0\xff\xff\xff\xff\x9d\xa4à\xff\xff\xff\xff\x9e\x9c\x9d\xa0\xff\xff\xff\xff\x9f\x97\x1a\xa0\xff\xff\xff\xff\xa0\x85\xba \xff\xff\xff\xff\xa1v\xfc\xa0\xff\xff\xff\xff\xa2e\x9c" +
-	" \xff\xff\xff\xff\xa3{Ƞ\xff\xff\xff\xff\xa4N\xb8\xa0\xff\xff\xff\xff\xa5?\xfb \xff\xff\xff\xff\xa6%` \xff\xff\xff\xff\xa7'\xc6 \xff\xff\xff\xff\xa8*, \xff\xff\xff\xff\xa8\xeb\xf8\xa0\xff\xff\xff" +
-	"\xff\xaa\x00Ӡ\xff\xff\xff\xff\xaa\xd5\x15 \xff\xff\xff\xff\xab\xe9\xf0 \xff\xff\xff\xff\xac\xc7l \xff\xff\xff\xff\xad\xc9\xd2 \xff\xff\xff\xff\xae\xa7N \xff\xff\xff\xff\xaf\xa0y\xa0\xff\xff\xff\xff\xb0\x870" +
-	" \xff\xff\xff\xff\xb1\x92Р\xff\xff\xff\xff\xb2pL\xa0\xff\xff\xff\xff\xb3r\xb2\xa0\xff\xff\xff\xff\xb4P.\xa0\xff\xff\xff\xff\xb5IZ \xff\xff\xff\xff\xb60\x10\xa0\xff\xff\xff\xff\xb72v\xa0\xff\xff\xff" +
-	"\xff\xb8\x0f\xf2\xa0\xff\xff\xff\xff\xb9\x12X\xa0\xff\xff\xff\xff\xb9\xefԠ\xff\xff\xff\xff\xba\xe9\x00 \xff\xff\xff\xff\xbb\xd8\xf1 \xff\xff\xff\xff\xbc\xdbW \xff\xff\xff\xff\xbd\xb8\xd3 \xff\xff\xff\xff\xbe\xb1\xfe" +
-	"\xa0\xff\xff\xff\xff\xbf\x98\xb5 \xff\xff\xff\xff\xc0\x9b\x1b \xff\xff\xff\xff\xc1x\x97 \xff\xff\xff\xff\xc2z\xfd \xff\xff\xff\xff\xc3Xy \xff\xff\xff\xff\xc4Q\xa4\xa0\xff\xff\xff\xff\xc58[ \xff\xff\xff" +
-	"\xff\xc6:\xc1 \xff\xff\xff\xff\xc7X֠\xff\xff\xff\xff\xc7\xda\t\xa0\xff\xff\xff\xff\xca\x16&\x90\xff\xff\xff\xffʗY\x90\xff\xff\xff\xff\xcb\xd1\x1e\x90\xff\xff\xff\xff\xccw;\x90\xff\xff\xff\xffͱ\x00" +
-	"\x90\xff\xff\xff\xff\xce`X\x10\xff\xff\xff\xffϐ\xe2\x90\xff\xff\xff\xff\xd0n^\x90\xff\xff\xff\xff\xd1r\x16\x10\xff\xff\xff\xff\xd1\xfb2\x10\xff\xff\xff\xff\xd2i\xfe \xff\xff\xff\xff\xd3c)\xa0\xff\xff\xff" +
-	"\xff\xd4I\xe0 \xff\xff\xff\xff\xd5\x1e!\xa0\xff\xff\xff\xff\xd5B\xfd\x90\xff\xff\xff\xff\xd5\xdf\xe0\x10\xff\xff\xff\xff\xd6N\xac \xff\xff\xff\xff\xd6\xfe\x03\xa0\xff\xff\xff\xff\xd8.\x8e \xff\xff\xff\xff\xd8\xf9\x95" +
-	" \xff\xff\xff\xff\xda\x0ep \xff\xff\xff\xff\xda\xeb\xec \xff\xff\xff\xff\xdb\xe5\x17\xa0\xff\xff\xff\xff\xdc\xcb\xce \xff\xff\xff\xff\xdd\xc4\xf9\xa0\xff\xff\xff\xff\u07b4\xea\xa0\xff\xff\xff\xff߮\x16 \xff\xff\xff" +
-	"\xff\xe0\x94̠\xff\xff\xff\xff\xe1rH\xa0\xff\xff\xff\xff\xe2kt \xff\xff\xff\xff\xe3R*\xa0\xff\xff\xff\xff\xe4T\x90\xa0\xff\xff\xff\xff\xe52\f\xa0\xff\xff\xff\xff\xe6=\xad \xff\xff\xff\xff\xe7\x1b)" +
-	" \xff\xff\xff\xff\xe8\x14T\xa0\xff\xff\xff\xff\xe8\xfb\v \xff\xff\xff\xff\xe9\xfdq \xff\xff\xff\xff\xea\xda\xed \xff\xff\xff\xff\xeb\xddS \xff\xff\xff\xff\xec\xba\xcf \xff\xff\xff\xff\xed\xb3\xfa\xa0\xff\xff\xff" +
-	"\xff\ue6b1 \xff\xff\xff\xff\xef\x81g\xa0\xff\xff\xff\xff\xf0\x9f} \xff\xff\xff\xff\xf1aI\xa0\xff\xff\xff\xff\xf2\x7f_ \xff\xff\xff\xff\xf3Jf \xff\xff\xff\xff\xf4_A \xff\xff\xff\xff\xf5!\r" +
-	"\xa0\xff\xff\xff\xff\xf6?# \xff\xff\xff\xff\xf7\x00\xef\xa0\xff\xff\xff\xff\xf8\x1f\x05 \xff\xff\xff\xff\xf8\xe0Ѡ\xff\xff\xff\xff\xf9\xfe\xe7 \xff\xff\xff\xff\xfa\xc0\xb3\xa0\xff\xff\xff\xff\xfb\xe8\x03\xa0\xff\xff\xff" +
-	"\xff\xfc{\xab\xa0\xff\xff\xff\xff\xfdǻp\x00\x00\x00\x00\x03p\xc6 \x00\x00\x00\x00\x04)X \x00\x00\x00\x00\x05P\xa8 \x00\x00\x00\x00\x06\t: \x00\x00\x00\x00\a0\x8a \x00\x00\x00\x00\a\xe9\x1c" +
-	" \x00\x00\x00\x00\t\x10l \x00\x00\x00\x00\t\xc8\xfe \x00\x00\x00\x00\n\xf0N \x00\x00\x00\x00\v\xb2\x1a\xa0\x00\x00\x00\x00\f\xd00 \x00\x00\x00\x00\r\x91\xfc\xa0\x00\x00\x00\x00\x0e\xb0\x12 \x00\x00\x00" +
-	"\x00\x0fqޠ\x00\x00\x00\x00\x10\x99.\xa0\x00\x00\x00\x00\x11Q\xc0\xa0\x00\x00\x00\x00\x12y\x10\xa0\x00\x00\x00\x00\x131\xa2\xa0\x00\x00\x00\x00\x14X\xf2\xa0\x00\x00\x00\x00\x15#\xeb\x90\x00\x00\x00\x00\x168\xc6" +
-	"\x90\x00\x00\x00\x00\x17\x03͐\x00\x00\x00\x00\x18\x18\xa8\x90\x00\x00\x00\x00\x18㯐\x00\x00\x00\x00\x19\xf8\x8a\x90\x00\x00\x00\x00\x1aÑ\x90\x00\x00\x00\x00\x1b\xe1\xa7\x10\x00\x00\x00\x00\x1c\xac\xae\x10\x00\x00\x00" +
-	"\x00\x1d\xc1\x89\x10\x00\x00\x00\x00\x1e\x8c\x90\x10\x00\x00\x00\x00\x1f\xa1k\x10\x00\x00\x00\x00 lr\x10\x00\x00\x00\x00!\x81M\x10\x00\x00\x00\x00\"LT\x10\x00\x00\x00\x00#a/\x10\x00\x00\x00\x00$,6" +
-	"\x10\x00\x00\x00\x00%JK\x90\x00\x00\x00\x00&\f\x18\x10\x00\x00\x00\x00'*-\x90\x00\x00\x00\x00'\xf54\x90\x00\x00\x00\x00)\n\x0f\x90\x00\x00\x00\x00)\xd5\x16\x90\x00\x00\x00\x00*\xe9\xf1\x90\x00\x00\x00" +
-	"\x00+\xb4\xf8\x90\x00\x00\x00\x00,\xc9Ӑ\x00\x00\x00\x00-\x94ڐ\x00\x00\x00\x00.\xa9\xb5\x90\x00\x00\x00\x00/t\xbc\x90\x00\x00\x00\x000\x89\x97\x90\x00\x00\x00\x001]\xd9\x10\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x02\x01\x02\x01\x03\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x04\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\xff\xff\xff\xb5\x00\x00\x00\x00\x0e\x10\x01\x04\x00\x00\x00\x00\x00\b\x00\x00\x1c \x01\f\x00\x00\x0e\x10" +
-	"\x00\x04LMT\x00BST\x00GMT\x00BDST\x00\nGMT0BST,M3.5.0/1,M10.5.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00o" +
-	"\xbc\x831O\x04\x00\x00O\x04\x00\x00\x11\x00\x00\x00Europe/LuxembourgTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00f\x00" +
-	"\x00\x00\x06\x00\x00\x00\x1a\xff\xff\xff\xffV\xb6\xdf\xe6\xff\xff\xff\xffm\xe8\xc8\x00\xff\xff\xff\xff\x98DI\x80\xff\xff\xff\xff\x9b\f%p\xff\xff\xff\xff\x9b\xd5\xda\xf0\xff\xff\xff\xff\x9cٮ\x90\xff\xff\xff\xff\x9d" +
-	"\xa4\xb5\x90\xff\xff\xff\xff\x9e\xb9\x90\x90\xff\xff\xff\xff\x9f\x84\x97\x90\xff\xff\xff\xff\x9f\xce\xf80\xff\xff\xff\xff\xa0`\xa5\xf0\xff\xff\xff\xff\xa1~\xbbp\xff\xff\xff\xff\xa2.\x12\xf0\xff\xff\xff\xff\xa3zL\xf0\xff" +
-	"\xff\xff\xff\xa45\x81\xf0\xff\xff\xff\xff\xa5^#p\xff\xff\xff\xff\xa6%5\xf0\xff\xff\xff\xff\xa7'\x9b\xf0\xff\xff\xff\xff\xa8*\x01\xf0\xff\xff\xff\xff\xa9\a}\xf0\xff\xff\xff\xff\xa9\xee4p\xff\xff\xff\xff\xaa" +
-	"\xe7_\xf0\xff\xff\xff\xff\xab\xd7P\xf0\xff\xff\xff\xff\xac\xc7A\xf0\xff\xff\xff\xff\xadɧ\xf0\xff\xff\xff\xff\xae\xa7#\xf0\xff\xff\xff\xff\xaf\xa0Op\xff\xff\xff\xff\xb0\x87\x05\xf0\xff\xff\xff\xff\xb1\x89k\xf0\xff" +
-	"\xff\xff\xff\xb2pL\xa0\xff\xff\xff\xff\xb3r\xb2\xa0\xff\xff\xff\xff\xb4P.\xa0\xff\xff\xff\xff\xb5IZ \xff\xff\xff\xff\xb60\x10\xa0\xff\xff\xff\xff\xb72v\xa0\xff\xff\xff\xff\xb8\x0f\xf2\xa0\xff\xff\xff\xff\xb8" +
-	"\xff\xe3\xa0\xff\xff\xff\xff\xb9\xefԠ\xff\xff\xff\xff\xba\u058b \xff\xff\xff\xff\xbb\xd8\xf1 \xff\xff\xff\xff\xbc\xc8\xe2 \xff\xff\xff\xff\xbd\xb8\xd3 \xff\xff\xff\xff\xbe\x9f\x89\xa0\xff\xff\xff\xff\xbf\x98\xb5 \xff" +
-	"\xff\xff\xff\xc0\x9b\x1b \xff\xff\xff\xff\xc1x\x97 \xff\xff\xff\xff\xc2h\x88 \xff\xff\xff\xff\xc3Xy \xff\xff\xff\xff\xc4?/\xa0\xff\xff\xff\xff\xc58[ \xff\xff\xff\xff\xc6:\xc1 \xff\xff\xff\xff\xc7" +
-	"X֠\xff\xff\xff\xff\xc7\xda\t\xa0\xff\xff\xff\xff\xc8J\x19 \xff\xff\xff\xff\xcc\xe7K\x10\xff\xff\xff\xffͩ\x17\x90\xff\xff\xff\xff\u03a2C\x10\xff\xff\xff\xffϒ4\x10\xff\xff\xff\xff\xd0n^\x90\xff" +
-	"\xff\xff\xff\xd1r\x16\x10\xff\xff\xff\xff\xd2N@\x90\xff\xff\xff\xffӑ@\x10\xff\xff\xff\xff\xd4K#\x90\x00\x00\x00\x00\r\xa4c\x90\x00\x00\x00\x00\x0e\x8b\x1a\x10\x00\x00\x00\x00\x0f\x84E\x90\x00\x00\x00\x00\x10" +
-	"t6\x90\x00\x00\x00\x00\x11d'\x90\x00\x00\x00\x00\x12T\x18\x90\x00\x00\x00\x00\x13MD\x10\x00\x00\x00\x00\x143\xfa\x90\x00\x00\x00\x00\x15#\xeb\x90\x00\x00\x00\x00\x16\x13ܐ\x00\x00\x00\x00\x17\x03͐\x00" +
-	"\x00\x00\x00\x17\xf3\xbe\x90\x00\x00\x00\x00\x18㯐\x00\x00\x00\x00\x19Ӡ\x90\x00\x00\x00\x00\x1aÑ\x90\x00\x00\x00\x00\x1b\xbc\xbd\x10\x00\x00\x00\x00\x1c\xac\xae\x10\x00\x00\x00\x00\x1d\x9c\x9f\x10\x00\x00\x00\x00\x1e" +
-	"\x8c\x90\x10\x00\x00\x00\x00\x1f|\x81\x10\x00\x00\x00\x00 lr\x10\x00\x00\x00\x00!\\c\x10\x00\x00\x00\x00\"LT\x10\x00\x00\x00\x00#<E\x10\x00\x00\x00\x00$,6\x10\x00\x00\x00\x00%\x1c'\x10\x00" +
-	"\x00\x00\x00&\f\x18\x10\x00\x00\x00\x00'\x05C\x90\x00\x00\x00\x00'\xf54\x90\x00\x00\x00\x00(\xe5%\x90\x00\x00\x00\x00)\xd5\x16\x90\x00\x00\x00\x00*\xc5\a\x90\x00\x00\x00\x00+\xb4\xf8\x90\x00\x00\x00\x00," +
-	"\xa4\xe9\x90\x00\x00\x00\x00-\x94ڐ\x00\x00\x00\x00.\x84ː\x00\x00\x00\x00/t\xbc\x90\x00\x00\x00\x000d\xad\x90\x00\x00\x00\x001]\xd9\x10\x01\x02\x03\x04\x03\x04\x03\x04\x03\x02\x05\x02\x05\x02\x05\x02\x05" +
-	"\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03" +
-	"\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x00\x00\x04\x1a\x00\x00\x00\x00\x04\x1a\x00\x04\x00\x00\x00\x00\x00\b\x00\x00\x0e\x10\x00\f\x00\x00\x1c \x01\x10\x00\x00\x0e\x10\x01" +
-	"\x15LMT\x00BMT\x00WET\x00CET\x00CEST\x00WEST\x00\nCET-1CEST,M3.5.0,M10.5.0/3\nPK\x03\x04\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00Zk#V\x81\x03\x00\x00\x81\x03\x00\x00\r\x00\x00\x00Europe/MadridTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00O\x00\x00\x00\x06\x00\x00\x00\x1b\xff\xff\xff\xff~6\xb5\x00\xff\xff\xff\xff\x9e\xba\xc5\xf0\xff\xff\xff\xff\x9f\xa09\x00\xff\xff\xff\xff\xa0\x90\x1b\xf0\xff\xff\xff\xff\xa1\x81l\x80\xff\xff\xff\xff\xaa\x05\xef" +
-	"p\xff\xff\xff\xff\xaa\xe7n\x00\xff\xff\xff\xff\xadɧ\xf0\xff\xff\xff\xff\xae\xa72\x00\xff\xff\xff\xff\xaf\xa0Op\xff\xff\xff\xff\xb0\x87\x14\x00\xff\xff\xff\xff\xb1\x89z\x00\xff\xff\xff\xff\xb2p0\x80\xff\xff\xff" +
-	"\xff\xb3r\x88p\xff\xff\xff\xff\xb4P\x12\x80\xff\xff\xff\xff\xc2\xc9\xec\xf0\xff\xff\xff\xff\xc3X]\x00\xff\xff\xff\xff\xc4H?\xf0\xff\xff\xff\xff\xc4m\x1b\xe0\xff\xff\xff\xff\xc59t`\xff\xff\xff\xff\xc7![" +
-	"\x80\xff\xff\xff\xff\xc7\xf5\x8e\xf0\xff\xff\xff\xff\xcb\xf5\xde`\xff\xff\xff\xff̕q\xf0\xff\xff\xff\xff\xcd\xc3K`\xff\xff\xff\xffΠ\xd5p\xff\xff\xff\xffϣ-`\xff\xff\xff\xffЀ\xb7p\xff\xff\xff" +
-	"\xffу\x0f`\xff\xff\xff\xff\xd2`\x99p\xff\xff\xff\xff\xd3b\xf1`\xff\xff\xff\xff\xd4@{p\xff\xff\xff\xff\xd9\x1eF\xe0\xff\xff\xff\xff\xd9\xe9[\xf0\x00\x00\x00\x00\b\r\xcd\xe0\x00\x00\x00\x00\b\xf4\x92" +
-	"p\x00\x00\x00\x00\t\xed\xaf\xe0\x00\x00\x00\x00\n\xd4tp\x00\x00\x00\x00\v\xbb\x1c\xe0\x00\x00\x00\x00\f\xab\x1b\xf0\x00\x00\x00\x00\r\xa49`\x00\x00\x00\x00\x0e\x8a\xfd\xf0\x00\x00\x00\x00\x0f\x84E\x90\x00\x00\x00" +
-	"\x00\x10t6\x90\x00\x00\x00\x00\x11d'\x90\x00\x00\x00\x00\x12T\x18\x90\x00\x00\x00\x00\x13MD\x10\x00\x00\x00\x00\x143\xfa\x90\x00\x00\x00\x00\x15#\xeb\x90\x00\x00\x00\x00\x16\x13ܐ\x00\x00\x00\x00\x17\x03\xcd" +
-	"\x90\x00\x00\x00\x00\x17\xf3\xbe\x90\x00\x00\x00\x00\x18㯐\x00\x00\x00\x00\x19Ӡ\x90\x00\x00\x00\x00\x1aÑ\x90\x00\x00\x00\x00\x1b\xbc\xbd\x10\x00\x00\x00\x00\x1c\xac\xae\x10\x00\x00\x00\x00\x1d\x9c\x9f\x10\x00\x00\x00" +
-	"\x00\x1e\x8c\x90\x10\x00\x00\x00\x00\x1f|\x81\x10\x00\x00\x00\x00 lr\x10\x00\x00\x00\x00!\\c\x10\x00\x00\x00\x00\"LT\x10\x00\x00\x00\x00#<E\x10\x00\x00\x00\x00$,6\x10\x00\x00\x00\x00%\x1c'" +
-	"\x10\x00\x00\x00\x00&\f\x18\x10\x00\x00\x00\x00'\x05C\x90\x00\x00\x00\x00'\xf54\x90\x00\x00\x00\x00(\xe5%\x90\x00\x00\x00\x00)\xd5\x16\x90\x00\x00\x00\x00*\xc5\a\x90\x00\x00\x00\x00+\xb4\xf8\x90\x00\x00\x00" +
-	"\x00,\xa4\xe9\x90\x00\x00\x00\x00-\x94ڐ\x00\x00\x00\x00.\x84ː\x00\x00\x00\x00/t\xbc\x90\x00\x00\x00\x000d\xad\x90\x00\x00\x00\x001]\xd9\x10\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x03\x01\x02\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04" +
-	"\x05\x04\x05\x04\xff\xff\xfc\x8c\x00\x00\x00\x00\x0e\x10\x01\x04\x00\x00\x00\x00\x00\t\x00\x00\x1c \x01\r\x00\x00\x1c \x01\x12\x00\x00\x0e\x10\x00\x17LMT\x00WEST\x00WET\x00WEMT\x00CE" +
-	"ST\x00CET\x00\nCET-1CEST,M3.5.0,M10.5.0/3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00h\xa5J[\xa0\x03\x00\x00\xa0\x03\x00" +
-	"\x00\f\x00\x00\x00Europe/MaltaTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" +
-	"\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00V\x00\x00\x00\x03\x00\x00\x00\r\xff\xff\xff\xffp\xbd\xd3d" +
-	"\xff\xff\xff\xff\x9b8\xf8p\xff\xff\xff\xff\x9b\xd5\xcc\xe0\xff\xff\xff\xff\x9c\xc5\xcb\xf0\xff\xff\xff\xff\x9d\xb7\x00`\xff\xff\xff\xff\x9e\x89\xfep\xff\xff\xff\xff\x9f\xa0\x1c\xe0\xff\xff\xff\xff\xa0`\xa5\xf0\xff\xff\xff\xff" +
-	"\xa1~\xad`\xff\xff\xff\xff\xa2\\7p\xff\xff\xff\xff\xa3L\x1a`\xff\xff\xff\xff\xc8l5\xf0\xff\xff\xff\xff\xcc\xe7K\x10\xff\xff\xff\xffͩ\x17\x90\xff\xff\xff\xff\u03a2C\x10\xff\xff\xff\xffϐ\xe2\x90" +
-	"\xff\xff\xff\xff\xd0n^\x90\xff\xff\xff\xff\xd1r\x16\x10\xff\xff\xff\xff\xd2L\xd2\xf0\xff\xff\xff\xff\xd3>1\x90\xff\xff\xff\xff\xd4I\xd2\x10\xff\xff\xff\xff\xd5\x1d\xf7p\xff\xff\xff\xff\xd6)\x97\xf0\xff\xff\xff\xff" +
-	"\xd6뀐\xff\xff\xff\xff\xd8\t\x96\x10\xff\xff\xff\xff\xf93\xb5\xf0\xff\xff\xff\xff\xf9\xd9\xc4\xe0\xff\xff\xff\xff\xfb\x1c\xd2p\xff\xff\xff\xff\xfb\xb9\xb4\xf0\xff\xff\xff\xff\xfc\xfc\xb4p\xff\xff\xff\xff\xfd\x99\x96\xf0" +
-	"\xff\xff\xff\xff\xfe\xe5\xd0\xf0\xff\xff\xff\xff\xff\x82\xb3p\x00\x00\x00\x00\x00Ų\xf0\x00\x00\x00\x00\x01b\x95p\x00\x00\x00\x00\x02\x9cZp\x00\x00\x00\x00\x03Bwp\x00\x00\x00\x00\x04\x85v\xf0\x00\x00\x00\x00" +
-	"\x05+\x93\xf0\x00\x00\x00\x00\x06\x1a3p\x00\x00\x00\x00\a\n$p\x00\x00\x00\x00\b\x17\x16p\x00\x00\x00\x00\b\xda4p\x00\x00\x00\x00\t\xf7\x14\x90\x00\x00\x00\x00\n\xc2\r\x80\x00\x00\x00\x00\v\xd6\xf6\x90" +
-	"\x00\x00\x00\x00\f\xa1\xef\x80\x00\x00\x00\x00\r\xb6ؐ\x00\x00\x00\x00\x0e\x81р\x00\x00\x00\x00\x0f\x96\xba\x90\x00\x00\x00\x00\x10a\xb3\x80\x00\x00\x00\x00\x11v\x9c\x90\x00\x00\x00\x00\x12A\x95\x80\x00\x00\x00\x00" +
-	"\x13E[\x10\x00\x00\x00\x00\x14*\xb2\x00\x00\x00\x00\x00\x15#\xeb\x90\x00\x00\x00\x00\x16\x13ܐ\x00\x00\x00\x00\x17\x03͐\x00\x00\x00\x00\x17\xf3\xbe\x90\x00\x00\x00\x00\x18㯐\x00\x00\x00\x00\x19Ӡ\x90" +
-	"\x00\x00\x00\x00\x1aÑ\x90\x00\x00\x00\x00\x1b\xbc\xbd\x10\x00\x00\x00\x00\x1c\xac\xae\x10\x00\x00\x00\x00\x1d\x9c\x9f\x10\x00\x00\x00\x00\x1e\x8c\x90\x10\x00\x00\x00\x00\x1f|\x81\x10\x00\x00\x00\x00 lr\x10\x00\x00\x00\x00" +
-	"!\\c\x10\x00\x00\x00\x00\"LT\x10\x00\x00\x00\x00#<E\x10\x00\x00\x00\x00$,6\x10\x00\x00\x00\x00%\x1c'\x10\x00\x00\x00\x00&\f\x18\x10\x00\x00\x00\x00'\x05C\x90\x00\x00\x00\x00'\xf54\x90" +
-	"\x00\x00\x00\x00(\xe5%\x90\x00\x00\x00\x00)\xd5\x16\x90\x00\x00\x00\x00*\xc5\a\x90\x00\x00\x00\x00+\xb4\xf8\x90\x00\x00\x00\x00,\xa4\xe9\x90\x00\x00\x00\x00-\x94ڐ\x00\x00\x00\x00.\x84ː\x00\x00\x00\x00" +
-	"/t\xbc\x90\x00\x00\x00\x000d\xad\x90\x00\x00\x00\x001]\xd9\x10\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x00\x00\r\x9c\x00\x00\x00\x00\x1c \x01\x04\x00\x00" +
-	"\x0e\x10\x00\tLMT\x00CEST\x00CET\x00\nCET-1CEST,M3.5.0,M10.5.0/3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe5" +
-	"\xc8X\xa7\xe1\x01\x00\x00\xe1\x01\x00\x00\x10\x00\x00\x00Europe/MariehamnTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00#\x00\x00" +
-	"\x00\x04\x00\x00\x00\x11\xff\xff\xff\xffS\xba&\x9b\xff\xff\xff\xff\xa4so\x1b\xff\xff\xff\xff\xcb\xceQ`\xff\xff\xff\xff\xcc\xc0\xe5`\x00\x00\x00\x00\x15#݀\x00\x00\x00\x00\x16\x13\u0380\x00\x00\x00\x00\x17\x03" +
-	"\xbf\x80\x00\x00\x00\x00\x17\xf3\xb0\x80\x00\x00\x00\x00\x18㯐\x00\x00\x00\x00\x19Ӡ\x90\x00\x00\x00\x00\x1aÑ\x90\x00\x00\x00\x00\x1b\xbc\xbd\x10\x00\x00\x00\x00\x1c\xac\xae\x10\x00\x00\x00\x00\x1d\x9c\x9f\x10\x00\x00" +
-	"\x00\x00\x1e\x8c\x90\x10\x00\x00\x00\x00\x1f|\x81\x10\x00\x00\x00\x00 lr\x10\x00\x00\x00\x00!\\c\x10\x00\x00\x00\x00\"LT\x10\x00\x00\x00\x00#<E\x10\x00\x00\x00\x00$,6\x10\x00\x00\x00\x00%\x1c" +
-	"'\x10\x00\x00\x00\x00&\f\x18\x10\x00\x00\x00\x00'\x05C\x90\x00\x00\x00\x00'\xf54\x90\x00\x00\x00\x00(\xe5%\x90\x00\x00\x00\x00)\xd5\x16\x90\x00\x00\x00\x00*\xc5\a\x90\x00\x00\x00\x00+\xb4\xf8\x90\x00\x00" +
-	"\x00\x00,\xa4\xe9\x90\x00\x00\x00\x00-\x94ڐ\x00\x00\x00\x00.\x84ː\x00\x00\x00\x00/t\xbc\x90\x00\x00\x00\x000d\xad\x90\x00\x00\x00\x001]\xd9\x10\x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03" +
-	"\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x00\x00\x17e\x00\x00\x00\x00\x17e\x00\x04\x00\x00*0\x01\b\x00\x00\x1c \x00\rLMT\x00HMT\x00EEST\x00EE" +
-	"T\x00\nEET-2EEST,M3.5.0/3,M10.5.0/4\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00WI\xc3\x7f(\x03\x00\x00(\x03\x00\x00\f\x00" +
-	"\x00\x00Europe/MinskTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00" +
-	"\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00D\x00\x00\x00\t\x00\x00\x00&\xff\xff\xff\xffV\xb6\xca(\xff\xff\xff" +
-	"\xff\xaa\x19\xaa8\xff\xff\xff\xff\xb5\xa4\x19`\xff\xff\xff\xff\xca^p\xd0\xff\xff\xff\xff\xcc\xe7K\x10\xff\xff\xff\xffͩ\x17\x90\xff\xff\xff\xff\u03a2C\x10\xff\xff\xff\xffϒ4\x10\xff\xff\xff\xff\xd0\n\x02" +
-	"`\x00\x00\x00\x00\x15'\xa7\xd0\x00\x00\x00\x00\x16\x18\xdc@\x00\x00\x00\x00\x17\b\xdbP\x00\x00\x00\x00\x17\xfa\x0f\xc0\x00\x00\x00\x00\x18\xea\x0e\xd0\x00\x00\x00\x00\x19\xdbC@\x00\x00\x00\x00\x1a̓\xd0\x00\x00\x00" +
-	"\x00\x1b\xbc\xa0\xf0\x00\x00\x00\x00\x1c\xac\x91\xf0\x00\x00\x00\x00\x1d\x9c\x82\xf0\x00\x00\x00\x00\x1e\x8cs\xf0\x00\x00\x00\x00\x1f|d\xf0\x00\x00\x00\x00 lU\xf0\x00\x00\x00\x00!\\F\xf0\x00\x00\x00\x00\"L7" +
-	"\xf0\x00\x00\x00\x00#<(\xf0\x00\x00\x00\x00$,\x19\xf0\x00\x00\x00\x00%\x1c\n\xf0\x00\x00\x00\x00'\xf5\x18p\x00\x00\x00\x00(\xe5\x17\x80\x00\x00\x00\x00)\xd5\b\x80\x00\x00\x00\x00*\xc4\xf9\x80\x00\x00\x00" +
-	"\x00+\xb4\xea\x80\x00\x00\x00\x00,\xa4ۀ\x00\x00\x00\x00-\x94̀\x00\x00\x00\x00.\x84\xbd\x80\x00\x00\x00\x00/t\xae\x80\x00\x00\x00\x000d\x9f\x80\x00\x00\x00\x001]\xcb\x00\x00\x00\x00\x002r\xa6" +
-	"\x00\x00\x00\x00\x003=\xad\x00\x00\x00\x00\x004R\x88\x00\x00\x00\x00\x005\x1d\x8f\x00\x00\x00\x00\x0062j\x00\x00\x00\x00\x006\xfdq\x00\x00\x00\x00\x008\x1b\x86\x80\x00\x00\x00\x008\xddS\x00\x00\x00\x00" +
-	"\x009\xfbh\x80\x00\x00\x00\x00:\xbd5\x00\x00\x00\x00\x00;\xdbJ\x80\x00\x00\x00\x00<\xa6Q\x80\x00\x00\x00\x00=\xbb,\x80\x00\x00\x00\x00>\x863\x80\x00\x00\x00\x00?\x9b\x0e\x80\x00\x00\x00\x00@f\x15" +
-	"\x80\x00\x00\x00\x00A\x84+\x00\x00\x00\x00\x00BE\xf7\x80\x00\x00\x00\x00Cd\r\x00\x00\x00\x00\x00D%ـ\x00\x00\x00\x00EC\xef\x00\x00\x00\x00\x00F\x05\xbb\x80\x00\x00\x00\x00G#\xd1\x00\x00\x00\x00" +
-	"\x00G\xee\xd8\x00\x00\x00\x00\x00I\x03\xb3\x00\x00\x00\x00\x00Iκ\x00\x00\x00\x00\x00J\xe3\x95\x00\x00\x00\x00\x00K\xae\x9c\x00\x00\x00\x00\x00Ḻ\x80\x00\x00\x00\x00M\x8e~\x00\x01\x02\x03\x05\x04\x05\x04" +
-	"\x05\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\a\x02\a\x02\a\x02\a\x02\a\x02\a\x02\a\x02\a\x02\a\x02\a\x02\a\x02\a\x02\a\x02\a\x02\a\x02\a\x02\a\x02\a\x02\a\x02\a\x02" +
-	"\b\x00\x00\x19\xd8\x00\x00\x00\x00\x19\xc8\x00\x04\x00\x00\x1c \x00\b\x00\x00*0\x00\f\x00\x00\x0e\x10\x00\x10\x00\x00\x1c \x01\x14\x00\x008@\x01\x19\x00\x00*0\x01\x1d\x00\x00*0\x00\"LMT\x00M" +
-	"MT\x00EET\x00MSK\x00CET\x00CEST\x00MSD\x00EEST\x00+03\x00\n<+03>-3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc7\xf5\x94\xda" +
-	"Q\x04\x00\x00Q\x04\x00\x00\r\x00\x00\x00Europe/MonacoTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00e\x00\x00\x00\a\x00\x00\x00\x1f" +
-	"\xff\xff\xff\xffkɛ\xcf\xff\xff\xff\xff\x91`PO\xff\xff\xff\xff\x9bGx\xf0\xff\xff\xff\xff\x9b\xd7,p\xff\xff\xff\xff\x9c\xbc\x91p\xff\xff\xff\xff\x9d\xc0H\xf0\xff\xff\xff\xff\x9e\x89\xfep\xff\xff\xff\xff" +
-	"\x9f\xa0*\xf0\xff\xff\xff\xff\xa0`\xa5\xf0\xff\xff\xff\xff\xa1\x80\f\xf0\xff\xff\xff\xff\xa2.\x12\xf0\xff\xff\xff\xff\xa3zL\xf0\xff\xff\xff\xff\xa45\x81\xf0\xff\xff\xff\xff\xa5^#p\xff\xff\xff\xff\xa6%5\xf0" +
-	"\xff\xff\xff\xff\xa7'\x9b\xf0\xff\xff\xff\xff\xa8X&p\xff\xff\xff\xff\xa9\a}\xf0\xff\xff\xff\xff\xa9\xee4p\xff\xff\xff\xff\xaa\xe7_\xf0\xff\xff\xff\xff\xab\xd7P\xf0\xff\xff\xff\xff\xac\xc7A\xf0\xff\xff\xff\xff" +
-	"\xadɧ\xf0\xff\xff\xff\xff\xae\xa7#\xf0\xff\xff\xff\xff\xaf\xa0Op\xff\xff\xff\xff\xb0\x87\x05\xf0\xff\xff\xff\xff\xb1\x89k\xf0\xff\xff\xff\xff\xb2p\"p\xff\xff\xff\xff\xb3r\x88p\xff\xff\xff\xff\xb4P\x04p" +
-	"\xff\xff\xff\xff\xb5I/\xf0\xff\xff\xff\xff\xb6/\xe6p\xff\xff\xff\xff\xb72Lp\xff\xff\xff\xff\xb8\x0f\xc8p\xff\xff\xff\xff\xb8\xff\xb9p\xff\xff\xff\xff\xb9\xef\xaap\xff\xff\xff\xff\xba\xd6`\xf0\xff\xff\xff\xff" +
-	"\xbb\xd8\xc6\xf0\xff\xff\xff\xff\xbcȷ\xf0\xff\xff\xff\xff\xbd\xb8\xa8\xf0\xff\xff\xff\xff\xbe\x9f_p\xff\xff\xff\xff\xbf\x98\x8a\xf0\xff\xff\xff\xff\xc0\x9a\xf0\xf0\xff\xff\xff\xff\xc1xl\xf0\xff\xff\xff\xff\xc2h]\xf0" +
-	"\xff\xff\xff\xff\xc3XN\xf0\xff\xff\xff\xff\xc4?\x05p\xff\xff\xff\xff\xc580\xf0\xff\xff\xff\xff\xc6:\x96\xf0\xff\xff\xff\xff\xc7X\xacp\xff\xff\xff\xff\xc7\xda\t\xa0\xff\xff\xff\xff\xc8l'\xe0\xff\xff\xff\xff" +
-	"\xcc\xe7K\x10\xff\xff\xff\xffͩ\x17\x90\xff\xff\xff\xff\u03a2C\x10\xff\xff\xff\xffϒ4\x10\xff\xff\xff\xff\xd0O\xe1\xe0\xff\xff\xff\xffЉ\xf1\xf0\xff\xff\xff\xff\xd1r\x16\x10\xff\xff\xff\xff\xd2N@\x90" +
-	"\x00\x00\x00\x00\v\xbb9\x00\x00\x00\x00\x00\f\xab\x1b\xf0\x00\x00\x00\x00\r\xa4c\x90\x00\x00\x00\x00\x0e\x8b\x1a\x10\x00\x00\x00\x00\x0f\x84E\x90\x00\x00\x00\x00\x10t6\x90\x00\x00\x00\x00\x11d'\x90\x00\x00\x00\x00" +
-	"\x12T\x18\x90\x00\x00\x00\x00\x13MD\x10\x00\x00\x00\x00\x143\xfa\x90\x00\x00\x00\x00\x15#\xeb\x90\x00\x00\x00\x00\x16\x13ܐ\x00\x00\x00\x00\x17\x03͐\x00\x00\x00\x00\x17\xf3\xbe\x90\x00\x00\x00\x00\x18㯐" +
-	"\x00\x00\x00\x00\x19Ӡ\x90\x00\x00\x00\x00\x1aÑ\x90\x00\x00\x00\x00\x1b\xbc\xbd\x10\x00\x00\x00\x00\x1c\xac\xae\x10\x00\x00\x00\x00\x1d\x9c\x9f\x10\x00\x00\x00\x00\x1e\x8c\x90\x10\x00\x00\x00\x00\x1f|\x81\x10\x00\x00\x00\x00" +
-	" lr\x10\x00\x00\x00\x00!\\c\x10\x00\x00\x00\x00\"LT\x10\x00\x00\x00\x00#<E\x10\x00\x00\x00\x00$,6\x10\x00\x00\x00\x00%\x1c'\x10\x00\x00\x00\x00&\f\x18\x10\x00\x00\x00\x00'\x05C\x90" +
-	"\x00\x00\x00\x00'\xf54\x90\x00\x00\x00\x00(\xe5%\x90\x00\x00\x00\x00)\xd5\x16\x90\x00\x00\x00\x00*\xc5\a\x90\x00\x00\x00\x00+\xb4\xf8\x90\x00\x00\x00\x00,\xa4\xe9\x90\x00\x00\x00\x00-\x94ڐ\x00\x00\x00\x00" +
-	".\x84ː\x00\x00\x00\x00/t\xbc\x90\x00\x00\x00\x000d\xad\x90\x00\x00\x00\x001]\xd9\x10\x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03" +
-	"\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x05\x04\x05\x04\x05\x06\x02\x06\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04" +
-	"\x05\x04\x05\x04\x05\x04\x05\x04\x05\x00\x00\x021\x00\x00\x00\x00\x021\x00\x04\x00\x00\x0e\x10\x01\b\x00\x00\x00\x00\x00\r\x00\x00\x0e\x10\x00\x11\x00\x00\x1c \x01\x15\x00\x00\x1c \x01\x1aLMT\x00PMT\x00W" +
-	"EST\x00WET\x00CET\x00CEST\x00WEMT\x00\nCET-1CEST,M3.5.0,M10.5.0/3\nPK\x03\x04\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\xe1\xc1\xeb\x05\x8c\x03\x00\x00\x8c\x03\x00\x00\r\x00\x00\x00Europe/MoscowTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00N" +
-	"\x00\x00\x00\v\x00\x00\x00&\xff\xff\xff\xffV\xb6\xc0\xc7\xff\xff\xff\xff\x9b_\x1e\xc7\xff\xff\xff\xff\x9d>\xf2y\xff\xff\xff\xff\x9e*\xee\xf9\xff\xff\xff\xff\x9e\xf79i\xff\xff\xff\xff\x9f\x84W\xf9\xff\xff\xff\xff" +
-	"\xa0\xd8l\xe9\xff\xff\xff\xff\xa1\x009\x80\xff\xff\xff\xff\xa1<\xa6@\xff\xff\xff\xff\xa4\x10m\xc0\xff\xff\xff\xff\xa4=2\xb0\xff\xff\xff\xff\xa5\x15h\xb0\xff\xff\xff\xff\xa5=\x03\xc0\xff\xff\xff\xff\xa7\x1eEP" +
-	"\xff\xff\xff\xff\xb5\xa4\x19`\x00\x00\x00\x00\x15'\xa7\xd0\x00\x00\x00\x00\x16\x18\xdc@\x00\x00\x00\x00\x17\b\xdbP\x00\x00\x00\x00\x17\xfa\x0f\xc0\x00\x00\x00\x00\x18\xea\x0e\xd0\x00\x00\x00\x00\x19\xdbC@\x00\x00\x00\x00" +
-	"\x1a̓\xd0\x00\x00\x00\x00\x1b\xbc\xa0\xf0\x00\x00\x00\x00\x1c\xac\x91\xf0\x00\x00\x00\x00\x1d\x9c\x82\xf0\x00\x00\x00\x00\x1e\x8cs\xf0\x00\x00\x00\x00\x1f|d\xf0\x00\x00\x00\x00 lU\xf0\x00\x00\x00\x00!\\F\xf0" +
-	"\x00\x00\x00\x00\"L7\xf0\x00\x00\x00\x00#<(\xf0\x00\x00\x00\x00$,\x19\xf0\x00\x00\x00\x00%\x1c\n\xf0\x00\x00\x00\x00&\v\xfb\xf0\x00\x00\x00\x00'\x05'p\x00\x00\x00\x00'\xf5\x18p\x00\x00\x00\x00" +
-	"(\xe5\x17\x80\x00\x00\x00\x00)x\xbf\x80\x00\x00\x00\x00)\xd4\xfap\x00\x00\x00\x00*\xc4\xebp\x00\x00\x00\x00+\xb4\xdcp\x00\x00\x00\x00,\xa4\xcdp\x00\x00\x00\x00-\x94\xbep\x00\x00\x00\x00.\x84\xafp" +
-	"\x00\x00\x00\x00/t\xa0p\x00\x00\x00\x000d\x91p\x00\x00\x00\x001]\xbc\xf0\x00\x00\x00\x002r\x97\xf0\x00\x00\x00\x003=\x9e\xf0\x00\x00\x00\x004Ry\xf0\x00\x00\x00\x005\x1d\x80\xf0\x00\x00\x00\x00" +
-	"62[\xf0\x00\x00\x00\x006\xfdb\xf0\x00\x00\x00\x008\x1bxp\x00\x00\x00\x008\xddD\xf0\x00\x00\x00\x009\xfbZp\x00\x00\x00\x00:\xbd&\xf0\x00\x00\x00\x00;\xdb<p\x00\x00\x00\x00<\xa6Cp" +
-	"\x00\x00\x00\x00=\xbb\x1ep\x00\x00\x00\x00>\x86%p\x00\x00\x00\x00?\x9b\x00p\x00\x00\x00\x00@f\ap\x00\x00\x00\x00A\x84\x1c\xf0\x00\x00\x00\x00BE\xe9p\x00\x00\x00\x00Cc\xfe\xf0\x00\x00\x00\x00" +
-	"D%\xcbp\x00\x00\x00\x00EC\xe0\xf0\x00\x00\x00\x00F\x05\xadp\x00\x00\x00\x00G#\xc2\xf0\x00\x00\x00\x00G\xee\xc9\xf0\x00\x00\x00\x00I\x03\xa4\xf0\x00\x00\x00\x00IΫ\xf0\x00\x00\x00\x00J\xe3\x86\xf0" +
-	"\x00\x00\x00\x00K\xae\x8d\xf0\x00\x00\x00\x00Ḷp\x00\x00\x00\x00M\x8eo\xf0\x00\x00\x00\x00TL\x1d`\x01\x03\x02\x03\x04\x02\x04\x05\x06\x05\a\x05\x06\b\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05" +
-	"\x06\x05\x06\x05\x06\x05\x06\t\b\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\n\x06\x00\x00#9\x00\x00\x00\x00#9" +
-	"\x00\x04\x00\x001\x87\x01\b\x00\x00#w\x00\x04\x00\x00?\x97\x01\f\x00\x008@\x01\x11\x00\x00*0\x00\x15\x00\x00FP\x01\x19\x00\x00\x1c \x00\x1d\x00\x00*0\x01!\x00\x008@\x00\x15LMT\x00" +
-	"MMT\x00MST\x00MDST\x00MSD\x00MSK\x00+05\x00EET\x00EEST\x00\nMSK-3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03R\xda\xedU" +
-	"\x02\x00\x00U\x02\x00\x00\x0e\x00\x00\x00Europe/NicosiaTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x001\x00\x00\x00\x03\x00\x00\x00\r" +
-	"\xff\xff\xff\xff\xa5w\x1e\xb8\x00\x00\x00\x00\t\xed\xaf\xe0\x00\x00\x00\x00\nݒ\xd0\x00\x00\x00\x00\v\xfad\xe0\x00\x00\x00\x00\f\xbe\xc6P\x00\x00\x00\x00\r\xa49`\x00\x00\x00\x00\x0e\x8a\xe1\xd0\x00\x00\x00\x00" +
-	"\x0f\x84\x1b`\x00\x00\x00\x00\x10uO\xd0\x00\x00\x00\x00\x11c\xfd`\x00\x00\x00\x00\x12S\xe0P\x00\x00\x00\x00\x13M\x19\xe0\x00\x00\x00\x00\x143\xc2P\x00\x00\x00\x00\x15#\xc1`\x00\x00\x00\x00\x16\x13\xa4P" +
-	"\x00\x00\x00\x00\x17\x03\xa3`\x00\x00\x00\x00\x17\xf3\x86P\x00\x00\x00\x00\x18\xe3\x85`\x00\x00\x00\x00\x19\xd3hP\x00\x00\x00\x00\x1a\xc3g`\x00\x00\x00\x00\x1b\xbc\x84\xd0\x00\x00\x00\x00\x1c\xac\x83\xe0\x00\x00\x00\x00" +
-	"\x1d\x9cf\xd0\x00\x00\x00\x00\x1e\x8ce\xe0\x00\x00\x00\x00\x1f|H\xd0\x00\x00\x00\x00 lG\xe0\x00\x00\x00\x00!\\*\xd0\x00\x00\x00\x00\"L)\xe0\x00\x00\x00\x00#<\f\xd0\x00\x00\x00\x00$,\v\xe0" +
-	"\x00\x00\x00\x00%\x1b\xee\xd0\x00\x00\x00\x00&\v\xed\xe0\x00\x00\x00\x00'\x05\vP\x00\x00\x00\x00'\xf5\n`\x00\x00\x00\x00(\xe4\xedP\x00\x00\x00\x00)\xd4\xec`\x00\x00\x00\x00*\xc4\xcfP\x00\x00\x00\x00" +
-	"+\xb4\xce`\x00\x00\x00\x00,\xa4\xb1P\x00\x00\x00\x00-\x94\xb0`\x00\x00\x00\x00.\x84\x93P\x00\x00\x00\x00/t\x92`\x00\x00\x00\x000duP\x00\x00\x00\x001]\xae\xe0\x00\x00\x00\x002M\x91\xd0" +
-	"\x00\x00\x00\x003=\x90\xe0\x00\x00\x00\x004-s\xd0\x00\x00\x00\x005\x1dr\xe0\x00\x00\x00\x0062x\x10\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x00\x00\x1fH\x00\x00\x00\x00*0\x01\x04\x00\x00\x1c \x00\tLMT\x00EEST\x00EET\x00\nEET-2EE" +
-	"ST,M3.5.0/3,M10.5.0/4\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17S\x91\xb3\xc1\x02\x00\x00\xc1\x02\x00\x00\v\x00\x00\x00Europe/O" +
-	"sloTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00<\x00\x00\x00\x04\x00\x00\x00\x12\xff\xff\xff\xffo\xa2a\xf8\xff\xff\xff\xff\x9b\f\x17`\xff\xff\xff\xff\x9b\xd5" +
-	"\xda\xf0\xff\xff\xff\xff\x9cٮ\x90\xff\xff\xff\xff\x9d\xa4\xb5\x90\xff\xff\xff\xff\x9e\xb9\x90\x90\xff\xff\xff\xff\x9f\x84\x97\x90\xff\xff\xff\xff\xc8\tq\x90\xff\xff\xff\xff\xcc\xe7K\x10\xff\xff\xff\xffͩ\x17\x90\xff\xff" +
-	"\xff\xff\u03a2C\x10\xff\xff\xff\xffϒ4\x10\xff\xff\xff\xffЂ%\x10\xff\xff\xff\xff\xd1r\x16\x10\xff\xff\xff\xffѶ\x96\x00\xff\xff\xff\xff\xd2X\xbe\x80\xff\xff\xff\xffҡO\x10\xff\xff\xff\xff\xd3c" +
-	"\x1b\x90\xff\xff\xff\xff\xd4K#\x90\xff\xff\xff\xff\xd59\xd1 \xff\xff\xff\xff\xd5g\xe7\x90\xff\xff\xff\xffըs\x00\xff\xff\xff\xff\xd6)\xb4\x10\xff\xff\xff\xff\xd7,\x1a\x10\xff\xff\xff\xff\xd8\t\x96\x10\xff\xff" +
-	"\xff\xff\xd9\x02\xc1\x90\xff\xff\xff\xff\xd9\xe9x\x10\x00\x00\x00\x00\x13MD\x10\x00\x00\x00\x00\x143\xfa\x90\x00\x00\x00\x00\x15#\xeb\x90\x00\x00\x00\x00\x16\x13ܐ\x00\x00\x00\x00\x17\x03͐\x00\x00\x00\x00\x17\xf3" +
-	"\xbe\x90\x00\x00\x00\x00\x18㯐\x00\x00\x00\x00\x19Ӡ\x90\x00\x00\x00\x00\x1aÑ\x90\x00\x00\x00\x00\x1b\xbc\xbd\x10\x00\x00\x00\x00\x1c\xac\xae\x10\x00\x00\x00\x00\x1d\x9c\x9f\x10\x00\x00\x00\x00\x1e\x8c\x90\x10\x00\x00" +
-	"\x00\x00\x1f|\x81\x10\x00\x00\x00\x00 lr\x10\x00\x00\x00\x00!\\c\x10\x00\x00\x00\x00\"LT\x10\x00\x00\x00\x00#<E\x10\x00\x00\x00\x00$,6\x10\x00\x00\x00\x00%\x1c'\x10\x00\x00\x00\x00&\f" +
-	"\x18\x10\x00\x00\x00\x00'\x05C\x90\x00\x00\x00\x00'\xf54\x90\x00\x00\x00\x00(\xe5%\x90\x00\x00\x00\x00)\xd5\x16\x90\x00\x00\x00\x00*\xc5\a\x90\x00\x00\x00\x00+\xb4\xf8\x90\x00\x00\x00\x00,\xa4\xe9\x90\x00\x00" +
-	"\x00\x00-\x94ڐ\x00\x00\x00\x00.\x84ː\x00\x00\x00\x00/t\xbc\x90\x00\x00\x00\x000d\xad\x90\x00\x00\x00\x001]\xd9\x10\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x03\x01\x02\x01\x02\x01\x03\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x00\x00\f\x88\x00\x00\x00\x00\x1c \x01\x04\x00\x00\x0e\x10\x00\t\x00\x00*0" +
-	"\x01\rLMT\x00CEST\x00CET\x00CEMT\x00\nCET-1CEST,M3.5.0,M10.5.0/3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\xc7\xf5\x94\xdaQ\x04\x00\x00Q\x04\x00\x00\f\x00\x00\x00Europe/ParisTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00e\x00\x00\x00" +
-	"\a\x00\x00\x00\x1f\xff\xff\xff\xffkɛ\xcf\xff\xff\xff\xff\x91`PO\xff\xff\xff\xff\x9bGx\xf0\xff\xff\xff\xff\x9b\xd7,p\xff\xff\xff\xff\x9c\xbc\x91p\xff\xff\xff\xff\x9d\xc0H\xf0\xff\xff\xff\xff\x9e\x89\xfe" +
-	"p\xff\xff\xff\xff\x9f\xa0*\xf0\xff\xff\xff\xff\xa0`\xa5\xf0\xff\xff\xff\xff\xa1\x80\f\xf0\xff\xff\xff\xff\xa2.\x12\xf0\xff\xff\xff\xff\xa3zL\xf0\xff\xff\xff\xff\xa45\x81\xf0\xff\xff\xff\xff\xa5^#p\xff\xff\xff" +
-	"\xff\xa6%5\xf0\xff\xff\xff\xff\xa7'\x9b\xf0\xff\xff\xff\xff\xa8X&p\xff\xff\xff\xff\xa9\a}\xf0\xff\xff\xff\xff\xa9\xee4p\xff\xff\xff\xff\xaa\xe7_\xf0\xff\xff\xff\xff\xab\xd7P\xf0\xff\xff\xff\xff\xac\xc7A" +
-	"\xf0\xff\xff\xff\xff\xadɧ\xf0\xff\xff\xff\xff\xae\xa7#\xf0\xff\xff\xff\xff\xaf\xa0Op\xff\xff\xff\xff\xb0\x87\x05\xf0\xff\xff\xff\xff\xb1\x89k\xf0\xff\xff\xff\xff\xb2p\"p\xff\xff\xff\xff\xb3r\x88p\xff\xff\xff" +
-	"\xff\xb4P\x04p\xff\xff\xff\xff\xb5I/\xf0\xff\xff\xff\xff\xb6/\xe6p\xff\xff\xff\xff\xb72Lp\xff\xff\xff\xff\xb8\x0f\xc8p\xff\xff\xff\xff\xb8\xff\xb9p\xff\xff\xff\xff\xb9\xef\xaap\xff\xff\xff\xff\xba\xd6`" +
-	"\xf0\xff\xff\xff\xff\xbb\xd8\xc6\xf0\xff\xff\xff\xff\xbcȷ\xf0\xff\xff\xff\xff\xbd\xb8\xa8\xf0\xff\xff\xff\xff\xbe\x9f_p\xff\xff\xff\xff\xbf\x98\x8a\xf0\xff\xff\xff\xff\xc0\x9a\xf0\xf0\xff\xff\xff\xff\xc1xl\xf0\xff\xff\xff" +
-	"\xff\xc2h]\xf0\xff\xff\xff\xff\xc3XN\xf0\xff\xff\xff\xff\xc4?\x05p\xff\xff\xff\xff\xc580\xf0\xff\xff\xff\xff\xc6:\x96\xf0\xff\xff\xff\xff\xc7X\xacp\xff\xff\xff\xff\xc7\xda\t\xa0\xff\xff\xff\xff\xc8l'" +
-	"\xe0\xff\xff\xff\xff\xcc\xe7K\x10\xff\xff\xff\xffͩ\x17\x90\xff\xff\xff\xff\u03a2C\x10\xff\xff\xff\xffϒ4\x10\xff\xff\xff\xff\xd0O\xe1\xe0\xff\xff\xff\xffЉ\xf1\xf0\xff\xff\xff\xff\xd1r\x16\x10\xff\xff\xff" +
-	"\xff\xd2N@\x90\x00\x00\x00\x00\v\xbb9\x00\x00\x00\x00\x00\f\xab\x1b\xf0\x00\x00\x00\x00\r\xa4c\x90\x00\x00\x00\x00\x0e\x8b\x1a\x10\x00\x00\x00\x00\x0f\x84E\x90\x00\x00\x00\x00\x10t6\x90\x00\x00\x00\x00\x11d'" +
-	"\x90\x00\x00\x00\x00\x12T\x18\x90\x00\x00\x00\x00\x13MD\x10\x00\x00\x00\x00\x143\xfa\x90\x00\x00\x00\x00\x15#\xeb\x90\x00\x00\x00\x00\x16\x13ܐ\x00\x00\x00\x00\x17\x03͐\x00\x00\x00\x00\x17\xf3\xbe\x90\x00\x00\x00" +
-	"\x00\x18㯐\x00\x00\x00\x00\x19Ӡ\x90\x00\x00\x00\x00\x1aÑ\x90\x00\x00\x00\x00\x1b\xbc\xbd\x10\x00\x00\x00\x00\x1c\xac\xae\x10\x00\x00\x00\x00\x1d\x9c\x9f\x10\x00\x00\x00\x00\x1e\x8c\x90\x10\x00\x00\x00\x00\x1f|\x81" +
-	"\x10\x00\x00\x00\x00 lr\x10\x00\x00\x00\x00!\\c\x10\x00\x00\x00\x00\"LT\x10\x00\x00\x00\x00#<E\x10\x00\x00\x00\x00$,6\x10\x00\x00\x00\x00%\x1c'\x10\x00\x00\x00\x00&\f\x18\x10\x00\x00\x00" +
-	"\x00'\x05C\x90\x00\x00\x00\x00'\xf54\x90\x00\x00\x00\x00(\xe5%\x90\x00\x00\x00\x00)\xd5\x16\x90\x00\x00\x00\x00*\xc5\a\x90\x00\x00\x00\x00+\xb4\xf8\x90\x00\x00\x00\x00,\xa4\xe9\x90\x00\x00\x00\x00-\x94\xda" +
-	"\x90\x00\x00\x00\x00.\x84ː\x00\x00\x00\x00/t\xbc\x90\x00\x00\x00\x000d\xad\x90\x00\x00\x00\x001]\xd9\x10\x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02" +
-	"\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x05\x04\x05\x04\x05\x06\x02\x06\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05" +
-	"\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x00\x00\x021\x00\x00\x00\x00\x021\x00\x04\x00\x00\x0e\x10\x01\b\x00\x00\x00\x00\x00\r\x00\x00\x0e\x10\x00\x11\x00\x00\x1c \x01\x15\x00\x00\x1c \x01\x1aLMT\x00" +
-	"PMT\x00WEST\x00WET\x00CET\x00CEST\x00WEMT\x00\nCET-1CEST,M3.5.0,M10.5.0/3\nPK\x03\x04\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe1C\xf9\xa1\xde\x01\x00\x00\xde\x01\x00\x00\x10\x00\x00\x00Europe/PodgoricaTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00$\x00\x00\x00\x03\x00\x00\x00\r\xff\xff\xff\xff^<\xf0H\xff\xff\xff\xff\xca\x025\xe0\xff\xff\xff\xff\xcc\xe7K\x10\xff\xff\xff\xffͩ\x17\x90\xff\xff\xff\xff\u03a2C\x10\xff\xff\xff\xff" +
-	"ϒ4\x10\xff\xff\xff\xffЂ%\x10\xff\xff\xff\xffѡ\x8c\x10\xff\xff\xff\xff\xd2N@\x90\x00\x00\x00\x00\x18㯐\x00\x00\x00\x00\x19Ӡ\x90\x00\x00\x00\x00\x1aÑ\x90\x00\x00\x00\x00\x1b\xbc\xbd\x10" +
-	"\x00\x00\x00\x00\x1c\xac\xae\x10\x00\x00\x00\x00\x1d\x9c\x9f\x10\x00\x00\x00\x00\x1e\x8c\x90\x10\x00\x00\x00\x00\x1f|\x81\x10\x00\x00\x00\x00 lr\x10\x00\x00\x00\x00!\\c\x10\x00\x00\x00\x00\"LT\x10\x00\x00\x00\x00" +
-	"#<E\x10\x00\x00\x00\x00$,6\x10\x00\x00\x00\x00%\x1c'\x10\x00\x00\x00\x00&\f\x18\x10\x00\x00\x00\x00'\x05C\x90\x00\x00\x00\x00'\xf54\x90\x00\x00\x00\x00(\xe5%\x90\x00\x00\x00\x00)\xd5\x16\x90" +
-	"\x00\x00\x00\x00*\xc5\a\x90\x00\x00\x00\x00+\xb4\xf8\x90\x00\x00\x00\x00,\xa4\xe9\x90\x00\x00\x00\x00-\x94ڐ\x00\x00\x00\x00.\x84ː\x00\x00\x00\x00/t\xbc\x90\x00\x00\x00\x000d\xad\x90\x00\x00\x00\x00" +
-	"1]\xd9\x10\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x00\x00\x138\x00\x00\x00\x00\x0e\x10\x00\x04\x00\x00\x1c \x01\bLM" +
-	"T\x00CET\x00CEST\x00\nCET-1CEST,M3.5.0,M10.5.0/3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Io\x11{\xd3\x02\x00" +
-	"\x00\xd3\x02\x00\x00\r\x00\x00\x00Europe/PragueTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00=\x00\x00\x00\x05\x00\x00\x00\x15\xff\xff\xff" +
-	"\xff\x1eI\x92\xf8\xff\xff\xff\xffl\xcf\xea\xf8\xff\xff\xff\xff\x9b\f\x17`\xff\xff\xff\xff\x9b\xd5\xda\xf0\xff\xff\xff\xff\x9cٮ\x90\xff\xff\xff\xff\x9d\xa4\xb5\x90\xff\xff\xff\xff\x9e\xb9\x90\x90\xff\xff\xff\xff\x9f\x84\x97" +
-	"\x90\xff\xff\xff\xff\xc8\tq\x90\xff\xff\xff\xff\xcc\xe7K\x10\xff\xff\xff\xffͩ\x17\x90\xff\xff\xff\xff\u03a2C\x10\xff\xff\xff\xffϒ4\x10\xff\xff\xff\xffЂ%\x10\xff\xff\xff\xff\xd1r\x16\x10\xff\xff\xff" +
-	"\xff\xd2b\a\x10\xff\xff\xff\xffӀ\x1c\x90\xff\xff\xff\xff\xd4I\xd2\x10\xff\xff\xff\xffԓ\xb4 \xff\xff\xff\xff\xd5\x02r \xff\xff\xff\xff\xd5L8\x10\xff\xff\xff\xff\xd6)\xb4\x10\xff\xff\xff\xff\xd7,\x1a" +
-	"\x10\xff\xff\xff\xff\xd8\t\x96\x10\xff\xff\xff\xff\xd9\x01p\x10\xff\xff\xff\xff\xd9\xe9x\x10\x00\x00\x00\x00\x11d'\x90\x00\x00\x00\x00\x12T\x18\x90\x00\x00\x00\x00\x13MD\x10\x00\x00\x00\x00\x143\xfa\x90\x00\x00\x00" +
-	"\x00\x15#\xeb\x90\x00\x00\x00\x00\x16\x13ܐ\x00\x00\x00\x00\x17\x03͐\x00\x00\x00\x00\x17\xf3\xbe\x90\x00\x00\x00\x00\x18㯐\x00\x00\x00\x00\x19Ӡ\x90\x00\x00\x00\x00\x1aÑ\x90\x00\x00\x00\x00\x1b\xbc\xbd" +
-	"\x10\x00\x00\x00\x00\x1c\xac\xae\x10\x00\x00\x00\x00\x1d\x9c\x9f\x10\x00\x00\x00\x00\x1e\x8c\x90\x10\x00\x00\x00\x00\x1f|\x81\x10\x00\x00\x00\x00 lr\x10\x00\x00\x00\x00!\\c\x10\x00\x00\x00\x00\"LT\x10\x00\x00\x00" +
-	"\x00#<E\x10\x00\x00\x00\x00$,6\x10\x00\x00\x00\x00%\x1c'\x10\x00\x00\x00\x00&\f\x18\x10\x00\x00\x00\x00'\x05C\x90\x00\x00\x00\x00'\xf54\x90\x00\x00\x00\x00(\xe5%\x90\x00\x00\x00\x00)\xd5\x16" +
-	"\x90\x00\x00\x00\x00*\xc5\a\x90\x00\x00\x00\x00+\xb4\xf8\x90\x00\x00\x00\x00,\xa4\xe9\x90\x00\x00\x00\x00-\x94ڐ\x00\x00\x00\x00.\x84ː\x00\x00\x00\x00/t\xbc\x90\x00\x00\x00\x000d\xad\x90\x00\x00\x00" +
-	"\x001]\xd9\x10\x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x04\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02" +
-	"\x03\x02\x03\x02\x03\x02\x00\x00\r\x88\x00\x00\x00\x00\r\x88\x00\x04\x00\x00\x1c \x01\b\x00\x00\x0e\x10\x00\r\x00\x00\x00\x00\x01\x11LMT\x00PMT\x00CEST\x00CET\x00GMT\x00\nCE" +
-	"T-1CEST,M3.5.0,M10.5.0/3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00gp\xc0\xa7\xb6\x02\x00\x00\xb6\x02\x00\x00\v\x00\x00\x00Europ" +
-	"e/RigaTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZi" +
-	"f2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x005\x00\x00\x00\t\x00\x00\x00&\xff\xff\xff\xffV\xb6\xcd^\xff\xff\xff\xff\x9e\xb9\x87\xfe\xff\xff\xff" +
-	"\xff\x9f\x84\x8e\xfe\xff\xff\xff\xff\xa0\x88F~\xff\xff\xff\xff\xa0˂\xfe\xff\xff\xff\xff\xad\xe7\xf1\xde\xff\xff\xff\xffȯd`\xff\xff\xff\xff\xcabeP\xff\xff\xff\xff\xcc\xe7K\x10\xff\xff\xff\xffͩ\x17" +
-	"\x90\xff\xff\xff\xff\u03a2C\x10\xff\xff\xff\xffϒ4\x10\xff\xff\xff\xffЂ%\x10\xff\xff\xff\xffА\x89p\x00\x00\x00\x00\x15'\xa7\xd0\x00\x00\x00\x00\x16\x18\xdc@\x00\x00\x00\x00\x17\b\xdbP\x00\x00\x00" +
-	"\x00\x17\xfa\x0f\xc0\x00\x00\x00\x00\x18\xea\x0e\xd0\x00\x00\x00\x00\x19\xdbC@\x00\x00\x00\x00\x1a̓\xd0\x00\x00\x00\x00\x1b\xbc\xa0\xf0\x00\x00\x00\x00\x1c\xac\x91\xf0\x00\x00\x00\x00\x1d\x9c\x82\xf0\x00\x00\x00\x00\x1e\x8cs" +
-	"\xf0\x00\x00\x00\x00\x1f|d\xf0\x00\x00\x00\x00 lU\xf0\x00\x00\x00\x00!\\F\xf0\x00\x00\x00\x00\"L7\xf0\x00\x00\x00\x00#<(\xf0\x00\x00\x00\x00$,\x19\xf0\x00\x00\x00\x00%\x1c\x19\x00\x00\x00\x00" +
-	"\x00&\f\n\x00\x00\x00\x00\x00'\x055\x80\x00\x00\x00\x00'\xf5&\x80\x00\x00\x00\x00(\xe5\x17\x80\x00\x00\x00\x00)\xd5\b\x80\x00\x00\x00\x00*\xc4\xf9\x80\x00\x00\x00\x00+\xb4\xea\x80\x00\x00\x00\x00,\xa4\xdb" +
-	"\x80\x00\x00\x00\x00-\x94̀\x00\x00\x00\x00.\x84\xbd\x80\x00\x00\x00\x00/t\xae\x80\x00\x00\x00\x000d\x9f\x80\x00\x00\x00\x001]\xcb\x00\x00\x00\x00\x002M\xbc\x00\x00\x00\x00\x003=\xbb\x10\x00\x00\x00" +
-	"\x004R\x96\x10\x00\x00\x00\x005\x1d\x9d\x10\x00\x00\x00\x0062x\x10\x00\x00\x00\x006\xfd\x7f\x10\x00\x00\x00\x008\x1b\x94\x90\x00\x00\x00\x00:\xbdC\x10\x01\x02\x01\x02\x01\x03\x04\x06\x05\x06\x05\x06\x05\x04\a" +
-	"\x04\a\x04\a\x04\a\x04\a\x04\a\x04\a\x04\a\x04\b\x03\b\x03\b\x03\b\x03\b\x03\b\x03\b\x03\b\x03\b\x03\b\x03\b\x03\b\x00\x00\x16\xa2\x00\x00\x00\x00\x16\xa2\x00\x04\x00\x00$\xb2\x01\b\x00\x00\x1c " +
-	"\x00\f\x00\x00*0\x00\x10\x00\x00\x0e\x10\x00\x14\x00\x00\x1c \x01\x18\x00\x008@\x01\x1d\x00\x00*0\x01!LMT\x00RMT\x00LST\x00EET\x00MSK\x00CET\x00CEST" +
-	"\x00MSD\x00EEST\x00\nEET-2EEST,M3.5.0/3,M10.5.0/4\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x95\xb4\x9e\xe7\xb3\x03" +
-	"\x00\x00\xb3\x03\x00\x00\v\x00\x00\x00Europe/RomeTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00W\x00\x00\x00\x04\x00\x00\x00\x11\xff\xff\xff\xff" +
-	">(\xe8L\xff\xff\xff\xffp\xbc\x81p\xff\xff\xff\xff\x9b8\xf8p\xff\xff\xff\xff\x9b\xd5\xcc\xe0\xff\xff\xff\xff\x9c\xc5\xcb\xf0\xff\xff\xff\xff\x9d\xb7\x00`\xff\xff\xff\xff\x9e\x89\xfep\xff\xff\xff\xff\x9f\xa0\x1c\xe0" +
-	"\xff\xff\xff\xff\xa0`\xa5\xf0\xff\xff\xff\xff\xa1~\xad`\xff\xff\xff\xff\xa2\\7p\xff\xff\xff\xff\xa3L\x1a`\xff\xff\xff\xff\xc8l5\xf0\xff\xff\xff\xff\xcc\xe7K\x10\xff\xff\xff\xffͩ\x17\x90\xff\xff\xff\xff" +
-	"\u03a2C\x10\xff\xff\xff\xffϒ4\x10\xff\xff\xff\xff\xd0n^\x90\xff\xff\xff\xff\xd1r\x16\x10\xff\xff\xff\xff\xd2L\xd2\xf0\xff\xff\xff\xff\xd3>1\x90\xff\xff\xff\xff\xd4I\xd2\x10\xff\xff\xff\xff\xd5\x1d\xf7p" +
-	"\xff\xff\xff\xff\xd6)\x97\xf0\xff\xff\xff\xff\xd6뀐\xff\xff\xff\xff\xd8\t\x96\x10\xff\xff\xff\xff\xf93\xb5\xf0\xff\xff\xff\xff\xf9\xd9\xc4\xe0\xff\xff\xff\xff\xfb\x1c\xd2p\xff\xff\xff\xff\xfb\xb9\xb4\xf0\xff\xff\xff\xff" +
-	"\xfc\xfc\xb4p\xff\xff\xff\xff\xfd\x99\x96\xf0\xff\xff\xff\xff\xfe\xe5\xd0\xf0\xff\xff\xff\xff\xff\x82\xb3p\x00\x00\x00\x00\x00Ų\xf0\x00\x00\x00\x00\x01b\x95p\x00\x00\x00\x00\x02\x9cZp\x00\x00\x00\x00\x03Bwp" +
-	"\x00\x00\x00\x00\x04\x85v\xf0\x00\x00\x00\x00\x05+\x93\xf0\x00\x00\x00\x00\x06n\x93p\x00\x00\x00\x00\a\vu\xf0\x00\x00\x00\x00\bE:\xf0\x00\x00\x00\x00\b\xebW\xf0\x00\x00\x00\x00\n.Wp\x00\x00\x00\x00" +
-	"\n\xcb9\xf0\x00\x00\x00\x00\f\x0e9p\x00\x00\x00\x00\f\xab\x1b\xf0\x00\x00\x00\x00\r\xe4\xe0\xf0\x00\x00\x00\x00\x0e\x8a\xfd\xf0\x00\x00\x00\x00\x0f\xcd\xfdp\x00\x00\x00\x00\x10t\x1ap\x00\x00\x00\x00\x11\xad\xdfp" +
-	"\x00\x00\x00\x00\x12S\xfcp\x00\x00\x00\x00\x13MD\x10\x00\x00\x00\x00\x143\xfa\x90\x00\x00\x00\x00\x15#\xeb\x90\x00\x00\x00\x00\x16\x13ܐ\x00\x00\x00\x00\x17\x03͐\x00\x00\x00\x00\x17\xf3\xbe\x90\x00\x00\x00\x00" +
-	"\x18㯐\x00\x00\x00\x00\x19Ӡ\x90\x00\x00\x00\x00\x1aÑ\x90\x00\x00\x00\x00\x1b\xbc\xbd\x10\x00\x00\x00\x00\x1c\xac\xae\x10\x00\x00\x00\x00\x1d\x9c\x9f\x10\x00\x00\x00\x00\x1e\x8c\x90\x10\x00\x00\x00\x00\x1f|\x81\x10" +
-	"\x00\x00\x00\x00 lr\x10\x00\x00\x00\x00!\\c\x10\x00\x00\x00\x00\"LT\x10\x00\x00\x00\x00#<E\x10\x00\x00\x00\x00$,6\x10\x00\x00\x00\x00%\x1c'\x10\x00\x00\x00\x00&\f\x18\x10\x00\x00\x00\x00" +
-	"'\x05C\x90\x00\x00\x00\x00'\xf54\x90\x00\x00\x00\x00(\xe5%\x90\x00\x00\x00\x00)\xd5\x16\x90\x00\x00\x00\x00*\xc5\a\x90\x00\x00\x00\x00+\xb4\xf8\x90\x00\x00\x00\x00,\xa4\xe9\x90\x00\x00\x00\x00-\x94ڐ" +
-	"\x00\x00\x00\x00.\x84ː\x00\x00\x00\x00/t\xbc\x90\x00\x00\x00\x000d\xad\x90\x00\x00\x00\x001]\xd9\x10\x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03" +
-	"\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x00" +
-	"\x00\v\xb4\x00\x00\x00\x00\v\xb4\x00\x04\x00\x00\x1c \x01\b\x00\x00\x0e\x10\x00\rLMT\x00RMT\x00CEST\x00CET\x00\nCET-1CEST,M3.5.0,M1" +
-	"0.5.0/3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x95\x7fpp\xdc\x02\x00\x00\xdc\x02\x00\x00\r\x00\x00\x00Europe/SamaraTZif2\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00@\x00\x00\x00\x06\x00\x00\x00\x10\xff\xff\xff\xff\xa1\x009\x80\xff\xff\xff\xff\xb5\xa4\vP\x00\x00\x00\x00\x15'\x99\xc0\x00\x00\x00\x00\x16\x18\xce0\x00\x00" +
-	"\x00\x00\x17\b\xcd@\x00\x00\x00\x00\x17\xfa\x01\xb0\x00\x00\x00\x00\x18\xea\x00\xc0\x00\x00\x00\x00\x19\xdb50\x00\x00\x00\x00\x1a̅\xc0\x00\x00\x00\x00\x1b\xbc\x92\xe0\x00\x00\x00\x00\x1c\xac\x83\xe0\x00\x00\x00\x00\x1d\x9c" +
-	"t\xe0\x00\x00\x00\x00\x1e\x8ce\xe0\x00\x00\x00\x00\x1f|V\xe0\x00\x00\x00\x00 lG\xe0\x00\x00\x00\x00!\\8\xe0\x00\x00\x00\x00\"L)\xe0\x00\x00\x00\x00#<\x1a\xe0\x00\x00\x00\x00$,\v\xe0\x00\x00" +
-	"\x00\x00%\x1c\n\xf0\x00\x00\x00\x00&\v\xfb\xf0\x00\x00\x00\x00'\x05'p\x00\x00\x00\x00'\xf5\x18p\x00\x00\x00\x00(\xe5\x17\x80\x00\x00\x00\x00)\x00\xc7\x00\x00\x00\x00\x00)\xd4\xec`\x00\x00\x00\x00*\xc4" +
-	"\xdd`\x00\x00\x00\x00+\xb4\xce`\x00\x00\x00\x00,\xa4\xbf`\x00\x00\x00\x00-\x94\xb0`\x00\x00\x00\x00.\x84\xa1`\x00\x00\x00\x00/t\x92`\x00\x00\x00\x000d\x83`\x00\x00\x00\x001]\xae\xe0\x00\x00" +
-	"\x00\x002r\x89\xe0\x00\x00\x00\x003=\x90\xe0\x00\x00\x00\x004Rk\xe0\x00\x00\x00\x005\x1dr\xe0\x00\x00\x00\x0062M\xe0\x00\x00\x00\x006\xfdT\xe0\x00\x00\x00\x008\x1bj`\x00\x00\x00\x008\xdd" +
-	"6\xe0\x00\x00\x00\x009\xfbL`\x00\x00\x00\x00:\xbd\x18\xe0\x00\x00\x00\x00;\xdb.`\x00\x00\x00\x00<\xa65`\x00\x00\x00\x00=\xbb\x10`\x00\x00\x00\x00>\x86\x17`\x00\x00\x00\x00?\x9a\xf2`\x00\x00" +
-	"\x00\x00@e\xf9`\x00\x00\x00\x00A\x84\x0e\xe0\x00\x00\x00\x00BE\xdb`\x00\x00\x00\x00Cc\xf0\xe0\x00\x00\x00\x00D%\xbd`\x00\x00\x00\x00EC\xd2\xe0\x00\x00\x00\x00F\x05\x9f`\x00\x00\x00\x00G#" +
-	"\xb4\xe0\x00\x00\x00\x00G\xee\xbb\xe0\x00\x00\x00\x00I\x03\x96\xe0\x00\x00\x00\x00IΝ\xe0\x00\x00\x00\x00J\xe3x\xe0\x00\x00\x00\x00K\xae\x7f\xe0\x00\x00\x00\x00Ḷp\x00\x00\x00\x00M\x8eo\xf0\x01\x02" +
-	"\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x04\x01\x04\x01\x05\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x04" +
-	"\x01\x02\x00\x00.\xf4\x00\x00\x00\x00*0\x00\x04\x00\x008@\x00\b\x00\x00FP\x01\f\x00\x008@\x01\b\x00\x00*0\x01\x04LMT\x00+03\x00+04\x00+05\x00\n<+04>" +
-	"-4\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x95\xb4\x9e\xe7\xb3\x03\x00\x00\xb3\x03\x00\x00\x11\x00\x00\x00Europe/San_MarinoTZif2\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00W\x00\x00\x00\x04\x00\x00\x00\x11\xff\xff\xff\xff>(\xe8L\xff\xff\xff\xffp\xbc\x81p\xff\xff\xff\xff\x9b8\xf8p\xff\xff\xff\xff\x9b\xd5\xcc\xe0\xff\xff\xff" +
-	"\xff\x9c\xc5\xcb\xf0\xff\xff\xff\xff\x9d\xb7\x00`\xff\xff\xff\xff\x9e\x89\xfep\xff\xff\xff\xff\x9f\xa0\x1c\xe0\xff\xff\xff\xff\xa0`\xa5\xf0\xff\xff\xff\xff\xa1~\xad`\xff\xff\xff\xff\xa2\\7p\xff\xff\xff\xff\xa3L\x1a" +
-	"`\xff\xff\xff\xff\xc8l5\xf0\xff\xff\xff\xff\xcc\xe7K\x10\xff\xff\xff\xffͩ\x17\x90\xff\xff\xff\xff\u03a2C\x10\xff\xff\xff\xffϒ4\x10\xff\xff\xff\xff\xd0n^\x90\xff\xff\xff\xff\xd1r\x16\x10\xff\xff\xff" +
-	"\xff\xd2L\xd2\xf0\xff\xff\xff\xff\xd3>1\x90\xff\xff\xff\xff\xd4I\xd2\x10\xff\xff\xff\xff\xd5\x1d\xf7p\xff\xff\xff\xff\xd6)\x97\xf0\xff\xff\xff\xff\xd6뀐\xff\xff\xff\xff\xd8\t\x96\x10\xff\xff\xff\xff\xf93\xb5" +
-	"\xf0\xff\xff\xff\xff\xf9\xd9\xc4\xe0\xff\xff\xff\xff\xfb\x1c\xd2p\xff\xff\xff\xff\xfb\xb9\xb4\xf0\xff\xff\xff\xff\xfc\xfc\xb4p\xff\xff\xff\xff\xfd\x99\x96\xf0\xff\xff\xff\xff\xfe\xe5\xd0\xf0\xff\xff\xff\xff\xff\x82\xb3p\x00\x00\x00" +
-	"\x00\x00Ų\xf0\x00\x00\x00\x00\x01b\x95p\x00\x00\x00\x00\x02\x9cZp\x00\x00\x00\x00\x03Bwp\x00\x00\x00\x00\x04\x85v\xf0\x00\x00\x00\x00\x05+\x93\xf0\x00\x00\x00\x00\x06n\x93p\x00\x00\x00\x00\a\vu" +
-	"\xf0\x00\x00\x00\x00\bE:\xf0\x00\x00\x00\x00\b\xebW\xf0\x00\x00\x00\x00\n.Wp\x00\x00\x00\x00\n\xcb9\xf0\x00\x00\x00\x00\f\x0e9p\x00\x00\x00\x00\f\xab\x1b\xf0\x00\x00\x00\x00\r\xe4\xe0\xf0\x00\x00\x00" +
-	"\x00\x0e\x8a\xfd\xf0\x00\x00\x00\x00\x0f\xcd\xfdp\x00\x00\x00\x00\x10t\x1ap\x00\x00\x00\x00\x11\xad\xdfp\x00\x00\x00\x00\x12S\xfcp\x00\x00\x00\x00\x13MD\x10\x00\x00\x00\x00\x143\xfa\x90\x00\x00\x00\x00\x15#\xeb" +
-	"\x90\x00\x00\x00\x00\x16\x13ܐ\x00\x00\x00\x00\x17\x03͐\x00\x00\x00\x00\x17\xf3\xbe\x90\x00\x00\x00\x00\x18㯐\x00\x00\x00\x00\x19Ӡ\x90\x00\x00\x00\x00\x1aÑ\x90\x00\x00\x00\x00\x1b\xbc\xbd\x10\x00\x00\x00" +
-	"\x00\x1c\xac\xae\x10\x00\x00\x00\x00\x1d\x9c\x9f\x10\x00\x00\x00\x00\x1e\x8c\x90\x10\x00\x00\x00\x00\x1f|\x81\x10\x00\x00\x00\x00 lr\x10\x00\x00\x00\x00!\\c\x10\x00\x00\x00\x00\"LT\x10\x00\x00\x00\x00#<E" +
-	"\x10\x00\x00\x00\x00$,6\x10\x00\x00\x00\x00%\x1c'\x10\x00\x00\x00\x00&\f\x18\x10\x00\x00\x00\x00'\x05C\x90\x00\x00\x00\x00'\xf54\x90\x00\x00\x00\x00(\xe5%\x90\x00\x00\x00\x00)\xd5\x16\x90\x00\x00\x00" +
-	"\x00*\xc5\a\x90\x00\x00\x00\x00+\xb4\xf8\x90\x00\x00\x00\x00,\xa4\xe9\x90\x00\x00\x00\x00-\x94ڐ\x00\x00\x00\x00.\x84ː\x00\x00\x00\x00/t\xbc\x90\x00\x00\x00\x000d\xad\x90\x00\x00\x00\x001]\xd9" +
-	"\x10\x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02" +
-	"\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x00\x00\v\xb4\x00\x00\x00\x00\v\xb4\x00\x04\x00\x00\x1c \x01\b\x00\x00\x0e\x10\x00\rLMT\x00RMT\x00" +
-	"CEST\x00CET\x00\nCET-1CEST,M3.5.0,M10.5.0/3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe1C\xf9\xa1\xde\x01\x00\x00\xde" +
-	"\x01\x00\x00\x0f\x00\x00\x00Europe/SarajevoTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00$\x00\x00\x00\x03\x00\x00\x00\r\xff\xff\xff" +
-	"\xff^<\xf0H\xff\xff\xff\xff\xca\x025\xe0\xff\xff\xff\xff\xcc\xe7K\x10\xff\xff\xff\xffͩ\x17\x90\xff\xff\xff\xff\u03a2C\x10\xff\xff\xff\xffϒ4\x10\xff\xff\xff\xffЂ%\x10\xff\xff\xff\xffѡ\x8c" +
-	"\x10\xff\xff\xff\xff\xd2N@\x90\x00\x00\x00\x00\x18㯐\x00\x00\x00\x00\x19Ӡ\x90\x00\x00\x00\x00\x1aÑ\x90\x00\x00\x00\x00\x1b\xbc\xbd\x10\x00\x00\x00\x00\x1c\xac\xae\x10\x00\x00\x00\x00\x1d\x9c\x9f\x10\x00\x00\x00" +
-	"\x00\x1e\x8c\x90\x10\x00\x00\x00\x00\x1f|\x81\x10\x00\x00\x00\x00 lr\x10\x00\x00\x00\x00!\\c\x10\x00\x00\x00\x00\"LT\x10\x00\x00\x00\x00#<E\x10\x00\x00\x00\x00$,6\x10\x00\x00\x00\x00%\x1c'" +
-	"\x10\x00\x00\x00\x00&\f\x18\x10\x00\x00\x00\x00'\x05C\x90\x00\x00\x00\x00'\xf54\x90\x00\x00\x00\x00(\xe5%\x90\x00\x00\x00\x00)\xd5\x16\x90\x00\x00\x00\x00*\xc5\a\x90\x00\x00\x00\x00+\xb4\xf8\x90\x00\x00\x00" +
-	"\x00,\xa4\xe9\x90\x00\x00\x00\x00-\x94ڐ\x00\x00\x00\x00.\x84ː\x00\x00\x00\x00/t\xbc\x90\x00\x00\x00\x000d\xad\x90\x00\x00\x00\x001]\xd9\x10\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x00\x00\x138\x00\x00\x00\x00\x0e\x10\x00\x04\x00\x00\x1c \x01\bLMT\x00CET\x00CEST\x00\nCET-1CE" +
-	"ST,M3.5.0,M10.5.0/3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b8\xfel\xd6\x02\x00\x00\xd6\x02\x00\x00\x0e\x00\x00\x00Europe/Sar" +
-	"atovTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00@\x00\x00\x00\x05\x00\x00\x00\x10\xff\xff\xff\xff\xa1\x009\x80\xff\xff\xff\xff\xb5\xa4\vP\x00\x00\x00\x00\x15" +
-	"'\x99\xc0\x00\x00\x00\x00\x16\x18\xce0\x00\x00\x00\x00\x17\b\xcd@\x00\x00\x00\x00\x17\xfa\x01\xb0\x00\x00\x00\x00\x18\xea\x00\xc0\x00\x00\x00\x00\x19\xdb50\x00\x00\x00\x00\x1a̅\xc0\x00\x00\x00\x00\x1b\xbc\x92\xe0\x00" +
-	"\x00\x00\x00\x1c\xac\x83\xe0\x00\x00\x00\x00\x1d\x9ct\xe0\x00\x00\x00\x00\x1e\x8ce\xe0\x00\x00\x00\x00\x1f|V\xe0\x00\x00\x00\x00 lG\xe0\x00\x00\x00\x00!\\8\xe0\x00\x00\x00\x00\"L)\xe0\x00\x00\x00\x00#" +
-	"<(\xf0\x00\x00\x00\x00$,\x19\xf0\x00\x00\x00\x00%\x1c\n\xf0\x00\x00\x00\x00&\v\xfb\xf0\x00\x00\x00\x00'\x05'p\x00\x00\x00\x00'\xf5\x18p\x00\x00\x00\x00)\xd4\xec`\x00\x00\x00\x00*\xc4\xebp\x00" +
-	"\x00\x00\x00+\xb4\xdcp\x00\x00\x00\x00,\xa4\xcdp\x00\x00\x00\x00-\x94\xbep\x00\x00\x00\x00.\x84\xafp\x00\x00\x00\x00/t\xa0p\x00\x00\x00\x000d\x91p\x00\x00\x00\x001]\xbc\xf0\x00\x00\x00\x002" +
-	"r\x97\xf0\x00\x00\x00\x003=\x9e\xf0\x00\x00\x00\x004Ry\xf0\x00\x00\x00\x005\x1d\x80\xf0\x00\x00\x00\x0062[\xf0\x00\x00\x00\x006\xfdb\xf0\x00\x00\x00\x008\x1bxp\x00\x00\x00\x008\xddD\xf0\x00" +
-	"\x00\x00\x009\xfbZp\x00\x00\x00\x00:\xbd&\xf0\x00\x00\x00\x00;\xdb<p\x00\x00\x00\x00<\xa6Cp\x00\x00\x00\x00=\xbb\x1ep\x00\x00\x00\x00>\x86%p\x00\x00\x00\x00?\x9b\x00p\x00\x00\x00\x00@" +
-	"f\ap\x00\x00\x00\x00A\x84\x1c\xf0\x00\x00\x00\x00BE\xe9p\x00\x00\x00\x00Cc\xfe\xf0\x00\x00\x00\x00D%\xcbp\x00\x00\x00\x00EC\xe0\xf0\x00\x00\x00\x00F\x05\xadp\x00\x00\x00\x00G#\xc2\xf0\x00" +
-	"\x00\x00\x00G\xee\xc9\xf0\x00\x00\x00\x00I\x03\xa4\xf0\x00\x00\x00\x00IΫ\xf0\x00\x00\x00\x00J\xe3\x86\xf0\x00\x00\x00\x00K\xae\x8d\xf0\x00\x00\x00\x00Ḷp\x00\x00\x00\x00M\x8eo\xf0\x00\x00\x00\x00T" +
-	"L\x1d`\x00\x00\x00\x00XCNp\x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x04\x01\x04\x01\x04\x01\x03\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01" +
-	"\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x03\x01\x03\x00\x00+2\x00\x00\x00\x00*0\x00\x04\x00\x00FP\x01\b\x00\x008@\x00\f\x00\x008@\x01\fLMT\x00+03\x00+05\x00+04" +
-	"\x00\n<+04>-4\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00}\xb4N\xb8a\x03\x00\x00a\x03\x00\x00\x11\x00\x00\x00Europe/SimferopolTZi" +
-	"f2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00K\x00\x00\x00\t\x00\x00\x00\"\xff\xff\xff\xffV\xb6\xc4\b\xff\xff\xff\xff\xaa\x19\xa4 \xff\xff\xff\xff\xb5\xa4\x19`\xff\xff\xff\xff" +
-	"\xcb\x04\x8d\xd0\xff\xff\xff\xff\xcc\xe7K\x10\xff\xff\xff\xffͩ\x17\x90\xff\xff\xff\xff\u03a2C\x10\xff\xff\xff\xffϒ4\x10\xff\xff\xff\xffϟ8\xe0\x00\x00\x00\x00\x15'\xa7\xd0\x00\x00\x00\x00\x16\x18\xdc@" +
-	"\x00\x00\x00\x00\x17\b\xdbP\x00\x00\x00\x00\x17\xfa\x0f\xc0\x00\x00\x00\x00\x18\xea\x0e\xd0\x00\x00\x00\x00\x19\xdbC@\x00\x00\x00\x00\x1a̓\xd0\x00\x00\x00\x00\x1b\xbc\xa0\xf0\x00\x00\x00\x00\x1c\xac\x91\xf0\x00\x00\x00\x00" +
-	"\x1d\x9c\x82\xf0\x00\x00\x00\x00\x1e\x8cs\xf0\x00\x00\x00\x00\x1f|d\xf0\x00\x00\x00\x00 lU\xf0\x00\x00\x00\x00!\\F\xf0\x00\x00\x00\x00\"L7\xf0\x00\x00\x00\x00#<(\xf0\x00\x00\x00\x00$,\x19\xf0" +
-	"\x00\x00\x00\x00%\x1c\n\xf0\x00\x00\x00\x00&\x8d.\xf0\x00\x00\x00\x00)\xd5\b\x80\x00\x00\x00\x00*\xc4\xf9\x80\x00\x00\x00\x00+\xb4\xea\x80\x00\x00\x00\x00,\xa4ۀ\x00\x00\x00\x00-\x94̀\x00\x00\x00\x00" +
-	"-\xc2\xc6\xd0\x00\x00\x00\x00.\x84\xafp\x00\x00\x00\x00/t\xa0p\x00\x00\x00\x000d\x91p\x00\x00\x00\x001]\xa0\xd0\x00\x00\x00\x002r\xa6\x00\x00\x00\x00\x003=\xbb\x10\x00\x00\x00\x004R\x96\x10" +
-	"\x00\x00\x00\x005\x1d\x9d\x10\x00\x00\x00\x0062x\x10\x00\x00\x00\x006\xfd\x7f\x10\x00\x00\x00\x008\x1b\x94\x90\x00\x00\x00\x008\xdda\x10\x00\x00\x00\x009\xfbv\x90\x00\x00\x00\x00:\xbdC\x10\x00\x00\x00\x00" +
-	";\xdbX\x90\x00\x00\x00\x00<\xa6_\x90\x00\x00\x00\x00=\xbb:\x90\x00\x00\x00\x00>\x86A\x90\x00\x00\x00\x00?\x9b\x1c\x90\x00\x00\x00\x00@f#\x90\x00\x00\x00\x00A\x849\x10\x00\x00\x00\x00BF\x05\x90" +
-	"\x00\x00\x00\x00Cd\x1b\x10\x00\x00\x00\x00D%\xe7\x90\x00\x00\x00\x00EC\xfd\x10\x00\x00\x00\x00F\x05ɐ\x00\x00\x00\x00G#\xdf\x10\x00\x00\x00\x00G\xee\xe6\x10\x00\x00\x00\x00I\x03\xc1\x10\x00\x00\x00\x00" +
-	"I\xce\xc8\x10\x00\x00\x00\x00J\xe3\xa3\x10\x00\x00\x00\x00K\xae\xaa\x10\x00\x00\x00\x00L̿\x90\x00\x00\x00\x00M\x8e\x8c\x10\x00\x00\x00\x00N\xac\xa1\x90\x00\x00\x00\x00Onn\x10\x00\x00\x00\x00P\x8c\x83\x90" +
-	"\x00\x00\x00\x00QW\x8a\x90\x00\x00\x00\x00Rle\x90\x00\x00\x00\x00S7^\x80\x00\x00\x00\x00TL\x1d`\x01\x02\x03\x05\x04\x05\x04\x05\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x02" +
-	"\a\x02\a\x02\a\x06\x03\x06\x03\x06\x03\a\x02\a\x02\a\x02\a\x02\a\x02\a\x02\a\x02\a\x02\a\x02\a\x02\a\x02\a\x02\a\x02\a\x02\a\x02\a\x02\a\x02\b\x03\x00\x00\x1f\xf8\x00\x00\x00\x00\x1f\xe0\x00\x04\x00" +
-	"\x00\x1c \x00\b\x00\x00*0\x00\f\x00\x00\x0e\x10\x00\x10\x00\x00\x1c \x01\x14\x00\x008@\x01\x19\x00\x00*0\x01\x1d\x00\x008@\x00\fLMT\x00SMT\x00EET\x00MSK\x00CET" +
-	"\x00CEST\x00MSD\x00EEST\x00\nMSK-3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe1C\xf9\xa1\xde\x01\x00\x00\xde\x01\x00\x00\r\x00\x00\x00Europe/S" +
-	"kopjeTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif" +
-	"2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00$\x00\x00\x00\x03\x00\x00\x00\r\xff\xff\xff\xff^<\xf0H\xff\xff\xff\xff\xca\x025\xe0\xff\xff\xff\xff" +
-	"\xcc\xe7K\x10\xff\xff\xff\xffͩ\x17\x90\xff\xff\xff\xff\u03a2C\x10\xff\xff\xff\xffϒ4\x10\xff\xff\xff\xffЂ%\x10\xff\xff\xff\xffѡ\x8c\x10\xff\xff\xff\xff\xd2N@\x90\x00\x00\x00\x00\x18㯐" +
-	"\x00\x00\x00\x00\x19Ӡ\x90\x00\x00\x00\x00\x1aÑ\x90\x00\x00\x00\x00\x1b\xbc\xbd\x10\x00\x00\x00\x00\x1c\xac\xae\x10\x00\x00\x00\x00\x1d\x9c\x9f\x10\x00\x00\x00\x00\x1e\x8c\x90\x10\x00\x00\x00\x00\x1f|\x81\x10\x00\x00\x00\x00" +
-	" lr\x10\x00\x00\x00\x00!\\c\x10\x00\x00\x00\x00\"LT\x10\x00\x00\x00\x00#<E\x10\x00\x00\x00\x00$,6\x10\x00\x00\x00\x00%\x1c'\x10\x00\x00\x00\x00&\f\x18\x10\x00\x00\x00\x00'\x05C\x90" +
-	"\x00\x00\x00\x00'\xf54\x90\x00\x00\x00\x00(\xe5%\x90\x00\x00\x00\x00)\xd5\x16\x90\x00\x00\x00\x00*\xc5\a\x90\x00\x00\x00\x00+\xb4\xf8\x90\x00\x00\x00\x00,\xa4\xe9\x90\x00\x00\x00\x00-\x94ڐ\x00\x00\x00\x00" +
-	".\x84ː\x00\x00\x00\x00/t\xbc\x90\x00\x00\x00\x000d\xad\x90\x00\x00\x00\x001]\xd9\x10\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x00\x00\x138\x00\x00\x00\x00\x0e\x10\x00\x04\x00\x00\x1c \x01\bLMT\x00CET\x00CEST\x00\nCET-1CEST,M3.5.0,M10.5.0" +
-	"/3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8c\xc8\x15\xd0P\x02\x00\x00P\x02\x00\x00\f\x00\x00\x00Europe/SofiaTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00-\x00\x00\x00\x06\x00\x00\x00\x1a\xff\xff\xff\xffV\xb6\xce$\xff\xff\xff\xffr\xc3\xe3\x18\xff\xff\xff\xff\xcc\xe7K\x10\xff\xff\xff\xffͩ\x17\x90\xff\xff\xff\xff\u03a2C\x10" +
-	"\xff\xff\xff\xffϒ4\x10\xff\xff\xff\xffЂ%\x10\xff\xff\xff\xff\xd1r$ \x00\x00\x00\x00\x11c\xefP\x00\x00\x00\x00\x12U?\xe0\x00\x00\x00\x00\x13M\v\xd0\x00\x00\x00\x00\x145!\xe0\x00\x00\x00\x00" +
-	"\x15,\xed\xd0\x00\x00\x00\x00\x16\x13\xc0p\x00\x00\x00\x00\x17\f\xcf\xd0\x00\x00\x00\x00\x17\xf3\xb0\x80\x00\x00\x00\x00\x18㡀\x00\x00\x00\x00\x19Ӓ\x80\x00\x00\x00\x00\x1aÃ\x80\x00\x00\x00\x00\x1b\xbc\xaf\x00" +
-	"\x00\x00\x00\x00\x1c\xac\xa0\x00\x00\x00\x00\x00\x1d\x9c\x91\x00\x00\x00\x00\x00\x1e\x8c\x82\x00\x00\x00\x00\x00\x1f|s\x00\x00\x00\x00\x00 ld\x00\x00\x00\x00\x00!\\U\x00\x00\x00\x00\x00\"LF\x00\x00\x00\x00\x00" +
-	"#<7\x00\x00\x00\x00\x00$,(\x00\x00\x00\x00\x00%\x1c\x19\x00\x00\x00\x00\x00&\f\n\x00\x00\x00\x00\x00'\x055\x80\x00\x00\x00\x00'\xf5\n`\x00\x00\x00\x00(\xe4\xedP\x00\x00\x00\x00)\xd4\xec`" +
-	"\x00\x00\x00\x00*\xc4\xcfP\x00\x00\x00\x00+\xb4\xce`\x00\x00\x00\x00,\xa4\xb1P\x00\x00\x00\x00-\x94\xb0`\x00\x00\x00\x00.\x84\x93P\x00\x00\x00\x00/t\x92`\x00\x00\x00\x000duP\x00\x00\x00\x00" +
-	"1]\xae\xe0\x00\x00\x00\x002r{\xd0\x00\x00\x00\x003=\xbb\x10\x01\x02\x03\x04\x03\x04\x03\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02" +
-	"\x05\x02\x05\x02\x05\x00\x00\x15\xdc\x00\x00\x00\x00\x1bh\x00\x04\x00\x00\x1c \x00\b\x00\x00\x0e\x10\x00\f\x00\x00\x1c \x01\x10\x00\x00*0\x01\x15LMT\x00IMT\x00EET\x00CET\x00CES" +
-	"T\x00EEST\x00\nEET-2EEST,M3.5.0/3,M10.5.0/4\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17S\x91\xb3\xc1\x02\x00\x00\xc1" +
-	"\x02\x00\x00\x10\x00\x00\x00Europe/StockholmTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00<\x00\x00\x00\x04\x00\x00\x00\x12\xff\xff" +
-	"\xff\xffo\xa2a\xf8\xff\xff\xff\xff\x9b\f\x17`\xff\xff\xff\xff\x9b\xd5\xda\xf0\xff\xff\xff\xff\x9cٮ\x90\xff\xff\xff\xff\x9d\xa4\xb5\x90\xff\xff\xff\xff\x9e\xb9\x90\x90\xff\xff\xff\xff\x9f\x84\x97\x90\xff\xff\xff\xff\xc8\t" +
-	"q\x90\xff\xff\xff\xff\xcc\xe7K\x10\xff\xff\xff\xffͩ\x17\x90\xff\xff\xff\xff\u03a2C\x10\xff\xff\xff\xffϒ4\x10\xff\xff\xff\xffЂ%\x10\xff\xff\xff\xff\xd1r\x16\x10\xff\xff\xff\xffѶ\x96\x00\xff\xff" +
-	"\xff\xff\xd2X\xbe\x80\xff\xff\xff\xffҡO\x10\xff\xff\xff\xff\xd3c\x1b\x90\xff\xff\xff\xff\xd4K#\x90\xff\xff\xff\xff\xd59\xd1 \xff\xff\xff\xff\xd5g\xe7\x90\xff\xff\xff\xffըs\x00\xff\xff\xff\xff\xd6)" +
-	"\xb4\x10\xff\xff\xff\xff\xd7,\x1a\x10\xff\xff\xff\xff\xd8\t\x96\x10\xff\xff\xff\xff\xd9\x02\xc1\x90\xff\xff\xff\xff\xd9\xe9x\x10\x00\x00\x00\x00\x13MD\x10\x00\x00\x00\x00\x143\xfa\x90\x00\x00\x00\x00\x15#\xeb\x90\x00\x00" +
-	"\x00\x00\x16\x13ܐ\x00\x00\x00\x00\x17\x03͐\x00\x00\x00\x00\x17\xf3\xbe\x90\x00\x00\x00\x00\x18㯐\x00\x00\x00\x00\x19Ӡ\x90\x00\x00\x00\x00\x1aÑ\x90\x00\x00\x00\x00\x1b\xbc\xbd\x10\x00\x00\x00\x00\x1c\xac" +
-	"\xae\x10\x00\x00\x00\x00\x1d\x9c\x9f\x10\x00\x00\x00\x00\x1e\x8c\x90\x10\x00\x00\x00\x00\x1f|\x81\x10\x00\x00\x00\x00 lr\x10\x00\x00\x00\x00!\\c\x10\x00\x00\x00\x00\"LT\x10\x00\x00\x00\x00#<E\x10\x00\x00" +
-	"\x00\x00$,6\x10\x00\x00\x00\x00%\x1c'\x10\x00\x00\x00\x00&\f\x18\x10\x00\x00\x00\x00'\x05C\x90\x00\x00\x00\x00'\xf54\x90\x00\x00\x00\x00(\xe5%\x90\x00\x00\x00\x00)\xd5\x16\x90\x00\x00\x00\x00*\xc5" +
-	"\a\x90\x00\x00\x00\x00+\xb4\xf8\x90\x00\x00\x00\x00,\xa4\xe9\x90\x00\x00\x00\x00-\x94ڐ\x00\x00\x00\x00.\x84ː\x00\x00\x00\x00/t\xbc\x90\x00\x00\x00\x000d\xad\x90\x00\x00\x00\x001]\xd9\x10\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x03\x01\x02\x01\x02\x01\x03\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x00\x00" +
-	"\f\x88\x00\x00\x00\x00\x1c \x01\x04\x00\x00\x0e\x10\x00\t\x00\x00*0\x01\rLMT\x00CEST\x00CET\x00CEMT\x00\nCET-1CEST,M3.5.0,M1" +
-	"0.5.0/3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00q\x16\x9b?\xa3\x02\x00\x00\xa3\x02\x00\x00\x0e\x00\x00\x00Europe/TallinnTZif2\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x004\x00\x00\x00\b\x00\x00\x00\"\xff\xff\xff\xffV\xb6\xcc\xcc\xff\xff\xff\xff\x9eY-\xcc\xff\xff\xff\xff\x9e\xb9\x90\x90\xff\xff\xff\xff\x9f\x84\x97\x90\xff" +
-	"\xff\xff\xff\xa1\x00+p\xff\xff\xff\xff\xa4soL\xff\xff\xff\xffȰ\xb5\xe0\xff\xff\xff\xff\xcaƗP\xff\xff\xff\xff\xcc\xe7K\x10\xff\xff\xff\xffͩ\x17\x90\xff\xff\xff\xff\u03a2C\x10\xff\xff\xff\xff\xcf" +
-	"\x924\x10\xff\xff\xff\xff\xd0t\xcb\xe0\x00\x00\x00\x00\x15'\xa7\xd0\x00\x00\x00\x00\x16\x18\xdc@\x00\x00\x00\x00\x17\b\xdbP\x00\x00\x00\x00\x17\xfa\x0f\xc0\x00\x00\x00\x00\x18\xea\x0e\xd0\x00\x00\x00\x00\x19\xdbC@\x00" +
-	"\x00\x00\x00\x1a̓\xd0\x00\x00\x00\x00\x1b\xbc\xa0\xf0\x00\x00\x00\x00\x1c\xac\x91\xf0\x00\x00\x00\x00\x1d\x9c\x82\xf0\x00\x00\x00\x00\x1e\x8cs\xf0\x00\x00\x00\x00\x1f|d\xf0\x00\x00\x00\x00 lU\xf0\x00\x00\x00\x00!" +
-	"\\F\xf0\x00\x00\x00\x00\"L7\xf0\x00\x00\x00\x00#<(\xf0\x00\x00\x00\x00$,\x19\xf0\x00\x00\x00\x00%\x1c\x19\x00\x00\x00\x00\x00&\f\n\x00\x00\x00\x00\x00'\x055\x80\x00\x00\x00\x00'\xf5&\x80\x00" +
-	"\x00\x00\x00(\xe5\x17\x80\x00\x00\x00\x00)\xd5\b\x80\x00\x00\x00\x00*\xc4\xf9\x80\x00\x00\x00\x00+\xb4\xea\x80\x00\x00\x00\x00,\xa4ۀ\x00\x00\x00\x00-\x94̀\x00\x00\x00\x00.\x84\xbd\x80\x00\x00\x00\x00/" +
-	"t\xae\x80\x00\x00\x00\x000d\x9f\x80\x00\x00\x00\x001]\xcb\x00\x00\x00\x00\x002r\xa6\x00\x00\x00\x00\x003=\xad\x00\x00\x00\x00\x004R\x88\x00\x00\x00\x00\x005\x1d\x8f\x00\x00\x00\x00\x0062x\x10\x00" +
-	"\x00\x00\x006\xfd\x7f\x10\x00\x00\x00\x008\x1b\x94\x90\x00\x00\x00\x00<\xa6_\x90\x01\x03\x02\x03\x01\x04\x05\x02\x03\x02\x03\x02\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\a\x04\a\x04\a\x04\a\x04" +
-	"\a\x04\a\x04\a\x04\a\x04\a\x04\a\x04\a\x04\a\x00\x00\x174\x00\x00\x00\x00\x174\x00\x04\x00\x00\x1c \x01\b\x00\x00\x0e\x10\x00\r\x00\x00\x1c \x00\x11\x00\x00*0\x00\x15\x00\x008@\x01\x19\x00\x00*" +
-	"0\x01\x1dLMT\x00TMT\x00CEST\x00CET\x00EET\x00MSK\x00MSD\x00EEST\x00\nEET-2EEST,M3.5.0/3,M10" +
-	".5.0/4\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xea\xc48\xde\\\x02\x00\x00\\\x02\x00\x00\r\x00\x00\x00Europe/TiraneTZif2\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x002\x00\x00\x00\x03\x00\x00\x00\r\xff\xff\xff\xff\x96\xaa4h\xff\xff\xff\xff\xc8m\x87p\xff\xff\xff\xff\xcc\xe7K\x10\xff\xff\xff\xffͩ\x17\x90\xff\xff\xff" +
-	"\xff\u0378\xe9\x90\x00\x00\x00\x00\b(9\xf0\x00\x00\x00\x00\b\xef>`\x00\x00\x00\x00\n\x05x\xf0\x00\x00\x00\x00\n\xd0q\xe0\x00\x00\x00\x00\v\xe9Op\x00\x00\x00\x00\f\xb4H`\x00\x00\x00\x00\r\xd2k" +
-	"\xf0\x00\x00\x00\x00\x0e\x94*`\x00\x00\x00\x00\x0f\xb0\xfcp\x00\x00\x00\x00\x10t\f`\x00\x00\x00\x00\x11\x90\xdep\x00\x00\x00\x00\x12S\xee`\x00\x00\x00\x00\x13p\xc0p\x00\x00\x00\x00\x14;\xb9`\x00\x00\x00" +
-	"\x00\x15H\xb9p\x00\x00\x00\x00\x16\x13\xb2`\x00\x00\x00\x00\x171\xd5\xf0\x00\x00\x00\x00\x17\xfc\xce\xe0\x00\x00\x00\x00\x19\x00\x94p\x00\x00\x00\x00\x19\xdb_`\x00\x00\x00\x00\x1a̯\xf0\x00\x00\x00\x00\x1b\xbc\xbd" +
-	"\x10\x00\x00\x00\x00\x1c\xac\xae\x10\x00\x00\x00\x00\x1d\x9c\x9f\x10\x00\x00\x00\x00\x1e\x8c\x90\x10\x00\x00\x00\x00\x1f|\x81\x10\x00\x00\x00\x00 lr\x10\x00\x00\x00\x00!\\c\x10\x00\x00\x00\x00\"LT\x10\x00\x00\x00" +
-	"\x00#<E\x10\x00\x00\x00\x00$,6\x10\x00\x00\x00\x00%\x1c'\x10\x00\x00\x00\x00&\f\x18\x10\x00\x00\x00\x00'\x05C\x90\x00\x00\x00\x00'\xf54\x90\x00\x00\x00\x00(\xe5%\x90\x00\x00\x00\x00)\xd5\x16" +
-	"\x90\x00\x00\x00\x00*\xc5\a\x90\x00\x00\x00\x00+\xb4\xf8\x90\x00\x00\x00\x00,\xa4\xe9\x90\x00\x00\x00\x00-\x94ڐ\x00\x00\x00\x00.\x84ː\x00\x00\x00\x00/t\xbc\x90\x00\x00\x00\x000d\xad\x90\x00\x00\x00" +
-	"\x001]\xd9\x10\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x00\x00\x12\x98\x00" +
-	"\x00\x00\x00\x0e\x10\x00\x04\x00\x00\x1c \x01\bLMT\x00CET\x00CEST\x00\nCET-1CEST,M3.5.0,M10.5.0/3\nPK\x03\x04\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00I\xb8\xbc\xd3\xf3\x02\x00\x00\xf3\x02\x00\x00\x0f\x00\x00\x00Europe/TiraspolTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00<\x00\x00\x00\t\x00\x00\x00&\xff\xff\xff\xffV\xb6\xc8\xf8\xff\xff\xff\xff\x9ek\x9f\f\xff\xff\xff\xff\xb7\xb0\xd2\b\xff\xff\xff\xff\xb9>\xf3`\xff\xff\xff\xff\xb9\xef\x9c`\xff\xff\xff\xff\xba\xdf" +
-	"\x8d`\xff\xff\xff\xff\xbb\xcf~`\xff\xff\xff\xff\xbcȩ\xe0\xff\xff\xff\xff\xbd\xb8\x9a\xe0\xff\xff\xff\xff\xbe\xa8\x8b\xe0\xff\xff\xff\xff\xbf\x98|\xe0\xff\xff\xff\xff\xc0\x88m\xe0\xff\xff\xff\xff\xc1x^\xe0\xff\xff" +
-	"\xff\xff\xc2hO\xe0\xff\xff\xff\xff\xc3X@\xe0\xff\xff\xff\xff\xc4H1\xe0\xff\xff\xff\xff\xc58\"\xe0\xff\xff\xff\xff\xc6(\x13\xe0\xff\xff\xff\xff\xc7\x18\x04\xe0\xff\xff\xff\xffȼ\x93`\xff\xff\xff\xff\xcaw" +
-	"}P\xff\xff\xff\xff\xcc\xe7K\x10\xff\xff\xff\xffͩ\x17\x90\xff\xff\xff\xff\u03a2C\x10\xff\xff\xff\xffϒ4\x10\xff\xff\xff\xff\xd0N\x90`\x00\x00\x00\x00\x15'\xa7\xd0\x00\x00\x00\x00\x16\x18\xdc@\x00\x00" +
-	"\x00\x00\x17\b\xdbP\x00\x00\x00\x00\x17\xfa\x0f\xc0\x00\x00\x00\x00\x18\xea\x0e\xd0\x00\x00\x00\x00\x19\xdbC@\x00\x00\x00\x00\x1a̓\xd0\x00\x00\x00\x00\x1b\xbc\xa0\xf0\x00\x00\x00\x00\x1c\xac\x91\xf0\x00\x00\x00\x00\x1d\x9c" +
-	"\x82\xf0\x00\x00\x00\x00\x1e\x8cs\xf0\x00\x00\x00\x00\x1f|d\xf0\x00\x00\x00\x00 lU\xf0\x00\x00\x00\x00!\\F\xf0\x00\x00\x00\x00\"L7\xf0\x00\x00\x00\x00#<(\xf0\x00\x00\x00\x00$,\x19\xf0\x00\x00" +
-	"\x00\x00%\x1c\n\xf0\x00\x00\x00\x00&\v\xfb\xf0\x00\x00\x00\x00&CL\xe0\x00\x00\x00\x00'\x055\x80\x00\x00\x00\x00'\xf5&\x80\x00\x00\x00\x00(\xe5\x17\x80\x00\x00\x00\x00)\xd4\xec`\x00\x00\x00\x00*\xc4" +
-	"\xcfP\x00\x00\x00\x00+\xb4\xce`\x00\x00\x00\x00,\xa4\xb1P\x00\x00\x00\x00-\x94\xb0`\x00\x00\x00\x00.\x84\x93P\x00\x00\x00\x00/t\x92`\x00\x00\x00\x000duP\x00\x00\x00\x001]\xae\xe0\x00\x00" +
-	"\x00\x002r{\xd0\x00\x00\x00\x003=\xad\x00\x01\x02\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x06\x05\x06\x05\x06\b\a\b\a\b\a\b\a\b\a\b\a\b\a\b\a\b\a\b\a\x03" +
-	"\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x00\x00\x1b\b\x00\x00\x00\x00\x1a\xf4\x00\x04\x00\x00\x18x\x00\b\x00\x00*0\x01\f\x00\x00\x1c \x00\x11\x00\x00\x0e\x10\x00\x15\x00\x00\x1c \x01\x19\x00\x008@" +
-	"\x01\x1e\x00\x00*0\x00\"LMT\x00CMT\x00BMT\x00EEST\x00EET\x00CET\x00CEST\x00MSD\x00MSK\x00\nEET-2EEST,M3." +
-	"5.0,M10.5.0/3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00u\xb0\xcd\xfc\xf8\x02\x00\x00\xf8\x02\x00\x00\x10\x00\x00\x00Europe/Ulyanovsk" +
-	"TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00B\x00\x00\x00\a\x00\x00\x00\x14\xff\xff\xff\xff\xa1\x009\x80\xff\xff\xff\xff\xb5\xa4\vP\x00\x00\x00\x00\x15'\x99\xc0\x00" +
-	"\x00\x00\x00\x16\x18\xce0\x00\x00\x00\x00\x17\b\xcd@\x00\x00\x00\x00\x17\xfa\x01\xb0\x00\x00\x00\x00\x18\xea\x00\xc0\x00\x00\x00\x00\x19\xdb50\x00\x00\x00\x00\x1a̅\xc0\x00\x00\x00\x00\x1b\xbc\x92\xe0\x00\x00\x00\x00\x1c" +
-	"\xac\x83\xe0\x00\x00\x00\x00\x1d\x9ct\xe0\x00\x00\x00\x00\x1e\x8ce\xe0\x00\x00\x00\x00\x1f|V\xe0\x00\x00\x00\x00 lG\xe0\x00\x00\x00\x00!\\8\xe0\x00\x00\x00\x00\"L)\xe0\x00\x00\x00\x00#<\x1a\xe0\x00" +
-	"\x00\x00\x00$,\v\xe0\x00\x00\x00\x00%\x1c\n\xf0\x00\x00\x00\x00&\v\xfb\xf0\x00\x00\x00\x00'\x05'p\x00\x00\x00\x00'\xf5\x18p\x00\x00\x00\x00(\xe5\x17\x80\x00\x00\x00\x00)x\xbf\x80\x00\x00\x00\x00)" +
-	"\xd4\xfap\x00\x00\x00\x00*\xc4\xebp\x00\x00\x00\x00+\xb4\xdcp\x00\x00\x00\x00,\xa4\xcdp\x00\x00\x00\x00-\x94\xbep\x00\x00\x00\x00.\x84\xafp\x00\x00\x00\x00/t\xa0p\x00\x00\x00\x000d\x91p\x00" +
-	"\x00\x00\x001]\xbc\xf0\x00\x00\x00\x002r\x97\xf0\x00\x00\x00\x003=\x9e\xf0\x00\x00\x00\x004Ry\xf0\x00\x00\x00\x005\x1d\x80\xf0\x00\x00\x00\x0062[\xf0\x00\x00\x00\x006\xfdb\xf0\x00\x00\x00\x008" +
-	"\x1bxp\x00\x00\x00\x008\xddD\xf0\x00\x00\x00\x009\xfbZp\x00\x00\x00\x00:\xbd&\xf0\x00\x00\x00\x00;\xdb<p\x00\x00\x00\x00<\xa6Cp\x00\x00\x00\x00=\xbb\x1ep\x00\x00\x00\x00>\x86%p\x00" +
-	"\x00\x00\x00?\x9b\x00p\x00\x00\x00\x00@f\ap\x00\x00\x00\x00A\x84\x1c\xf0\x00\x00\x00\x00BE\xe9p\x00\x00\x00\x00Cc\xfe\xf0\x00\x00\x00\x00D%\xcbp\x00\x00\x00\x00EC\xe0\xf0\x00\x00\x00\x00F" +
-	"\x05\xadp\x00\x00\x00\x00G#\xc2\xf0\x00\x00\x00\x00G\xee\xc9\xf0\x00\x00\x00\x00I\x03\xa4\xf0\x00\x00\x00\x00IΫ\xf0\x00\x00\x00\x00J\xe3\x86\xf0\x00\x00\x00\x00K\xae\x8d\xf0\x00\x00\x00\x00Ḷp\x00" +
-	"\x00\x00\x00M\x8eo\xf0\x00\x00\x00\x00TL\x1d`\x00\x00\x00\x00V\xf7\x14p\x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x04\x01\x04\x01\x05\x06\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01" +
-	"\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x03\x01\x03\x00\x00-`\x00\x00\x00\x00*0\x00\x04\x00\x00FP\x01\b\x00\x008@\x00\f\x00\x008@\x01\f\x00" +
-	"\x00*0\x01\x04\x00\x00\x1c \x00\x10LMT\x00+03\x00+05\x00+04\x00+02\x00\n<+04>-4\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00iS\x18D.\x02" +
-	"\x00\x00.\x02\x00\x00\x0f\x00\x00\x00Europe/UzhgorodTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\x00\x00\x00\b\x00\x00\x00\"" +
-	"\xff\xff\xff\xffV\xb6\xc7d\xff\xff\xff\xff\xaa\x19\xa7d\xff\xff\xff\xff\xb5\xa4\x19`\xff\xff\xff\xff\xca\xcd.\xd0\xff\xff\xff\xff\xcc\xe7K\x10\xff\xff\xff\xffͩ\x17\x90\xff\xff\xff\xff\u03a2C\x10\xff\xff\xff\xff" +
-	"\xceͨp\x00\x00\x00\x00\x15'\xa7\xd0\x00\x00\x00\x00\x16\x18\xdc@\x00\x00\x00\x00\x17\b\xdbP\x00\x00\x00\x00\x17\xfa\x0f\xc0\x00\x00\x00\x00\x18\xea\x0e\xd0\x00\x00\x00\x00\x19\xdbC@\x00\x00\x00\x00\x1a̓\xd0" +
-	"\x00\x00\x00\x00\x1b\xbc\xa0\xf0\x00\x00\x00\x00\x1c\xac\x91\xf0\x00\x00\x00\x00\x1d\x9c\x82\xf0\x00\x00\x00\x00\x1e\x8cs\xf0\x00\x00\x00\x00\x1f|d\xf0\x00\x00\x00\x00 lU\xf0\x00\x00\x00\x00!\\F\xf0\x00\x00\x00\x00" +
-	"\"L7\xf0\x00\x00\x00\x00#<(\xf0\x00\x00\x00\x00$,\x19\xf0\x00\x00\x00\x00%\x1c\n\xf0\x00\x00\x00\x00&\v\xfb\xf0\x00\x00\x00\x00&\x8d \xe0\x00\x00\x00\x00(\xe5\x17\x80\x00\x00\x00\x00)\xd5\b\x80" +
-	"\x00\x00\x00\x00*\xc4\xf9\x80\x00\x00\x00\x00+\xb4\xea\x80\x00\x00\x00\x00,\xa4ۀ\x00\x00\x00\x00-\x94̀\x00\x00\x00\x00.\x84\xbd\x80\x00\x00\x00\x00/t\xae\x80\x00\x00\x00\x000d\x9f\x80\x00\x00\x00\x00" +
-	"1]\xcb\x00\x00\x00\x00\x002r\xb4\x10\x01\x02\x03\x05\x04\x05\x04\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\a\x02\a\x02\a\x02\a\x02\a\x02\a\x02\x00\x00\x1c\x9c\x00\x00\x00\x00\x1c" +
-	"\x9c\x00\x04\x00\x00\x1c \x00\b\x00\x00*0\x00\f\x00\x00\x0e\x10\x00\x10\x00\x00\x1c \x01\x14\x00\x008@\x01\x19\x00\x00*0\x01\x1dLMT\x00KMT\x00EET\x00MSK\x00CET\x00C" +
-	"EST\x00MSD\x00EEST\x00\nEET-2EEST,M3.5.0/3,M10.5.0/4\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Dd#" +
-	"\xc4\xf1\x01\x00\x00\xf1\x01\x00\x00\f\x00\x00\x00Europe/VaduzTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00%\x00\x00\x00\x04\x00\x00\x00\x11" +
-	"\xff\xff\xff\xff$\xf0\xea\x80\xff\xff\xff\xffq\xd4\x06\x86\xff\xff\xff\xff\xca\x17j\x00\xff\xff\xff\xff\xca\xe2q\x00\xff\xff\xff\xff\xcb\xf7L\x00\xff\xff\xff\xff\xcc\xc2S\x00\x00\x00\x00\x00\x15#\xeb\x90\x00\x00\x00\x00" +
-	"\x16\x13ܐ\x00\x00\x00\x00\x17\x03͐\x00\x00\x00\x00\x17\xf3\xbe\x90\x00\x00\x00\x00\x18㯐\x00\x00\x00\x00\x19Ӡ\x90\x00\x00\x00\x00\x1aÑ\x90\x00\x00\x00\x00\x1b\xbc\xbd\x10\x00\x00\x00\x00\x1c\xac\xae\x10" +
-	"\x00\x00\x00\x00\x1d\x9c\x9f\x10\x00\x00\x00\x00\x1e\x8c\x90\x10\x00\x00\x00\x00\x1f|\x81\x10\x00\x00\x00\x00 lr\x10\x00\x00\x00\x00!\\c\x10\x00\x00\x00\x00\"LT\x10\x00\x00\x00\x00#<E\x10\x00\x00\x00\x00" +
-	"$,6\x10\x00\x00\x00\x00%\x1c'\x10\x00\x00\x00\x00&\f\x18\x10\x00\x00\x00\x00'\x05C\x90\x00\x00\x00\x00'\xf54\x90\x00\x00\x00\x00(\xe5%\x90\x00\x00\x00\x00)\xd5\x16\x90\x00\x00\x00\x00*\xc5\a\x90" +
-	"\x00\x00\x00\x00+\xb4\xf8\x90\x00\x00\x00\x00,\xa4\xe9\x90\x00\x00\x00\x00-\x94ڐ\x00\x00\x00\x00.\x84ː\x00\x00\x00\x00/t\xbc\x90\x00\x00\x00\x000d\xad\x90\x00\x00\x00\x001]\xd9\x10\x01\x03\x02\x03" +
-	"\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x00\x00\b\x00\x00\x00\x00\x00\x06\xfa\x00\x04\x00\x00\x1c \x01\b\x00\x00\x0e\x10\x00\rLMT" +
-	"\x00BMT\x00CEST\x00CET\x00\nCET-1CEST,M3.5.0,M10.5.0/3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x95\xb4\x9e\xe7" +
-	"\xb3\x03\x00\x00\xb3\x03\x00\x00\x0e\x00\x00\x00Europe/VaticanTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00W\x00\x00\x00\x04\x00\x00\x00" +
-	"\x11\xff\xff\xff\xff>(\xe8L\xff\xff\xff\xffp\xbc\x81p\xff\xff\xff\xff\x9b8\xf8p\xff\xff\xff\xff\x9b\xd5\xcc\xe0\xff\xff\xff\xff\x9c\xc5\xcb\xf0\xff\xff\xff\xff\x9d\xb7\x00`\xff\xff\xff\xff\x9e\x89\xfep\xff\xff\xff" +
-	"\xff\x9f\xa0\x1c\xe0\xff\xff\xff\xff\xa0`\xa5\xf0\xff\xff\xff\xff\xa1~\xad`\xff\xff\xff\xff\xa2\\7p\xff\xff\xff\xff\xa3L\x1a`\xff\xff\xff\xff\xc8l5\xf0\xff\xff\xff\xff\xcc\xe7K\x10\xff\xff\xff\xffͩ\x17" +
-	"\x90\xff\xff\xff\xff\u03a2C\x10\xff\xff\xff\xffϒ4\x10\xff\xff\xff\xff\xd0n^\x90\xff\xff\xff\xff\xd1r\x16\x10\xff\xff\xff\xff\xd2L\xd2\xf0\xff\xff\xff\xff\xd3>1\x90\xff\xff\xff\xff\xd4I\xd2\x10\xff\xff\xff" +
-	"\xff\xd5\x1d\xf7p\xff\xff\xff\xff\xd6)\x97\xf0\xff\xff\xff\xff\xd6뀐\xff\xff\xff\xff\xd8\t\x96\x10\xff\xff\xff\xff\xf93\xb5\xf0\xff\xff\xff\xff\xf9\xd9\xc4\xe0\xff\xff\xff\xff\xfb\x1c\xd2p\xff\xff\xff\xff\xfb\xb9\xb4" +
-	"\xf0\xff\xff\xff\xff\xfc\xfc\xb4p\xff\xff\xff\xff\xfd\x99\x96\xf0\xff\xff\xff\xff\xfe\xe5\xd0\xf0\xff\xff\xff\xff\xff\x82\xb3p\x00\x00\x00\x00\x00Ų\xf0\x00\x00\x00\x00\x01b\x95p\x00\x00\x00\x00\x02\x9cZp\x00\x00\x00" +
-	"\x00\x03Bwp\x00\x00\x00\x00\x04\x85v\xf0\x00\x00\x00\x00\x05+\x93\xf0\x00\x00\x00\x00\x06n\x93p\x00\x00\x00\x00\a\vu\xf0\x00\x00\x00\x00\bE:\xf0\x00\x00\x00\x00\b\xebW\xf0\x00\x00\x00\x00\n.W" +
-	"p\x00\x00\x00\x00\n\xcb9\xf0\x00\x00\x00\x00\f\x0e9p\x00\x00\x00\x00\f\xab\x1b\xf0\x00\x00\x00\x00\r\xe4\xe0\xf0\x00\x00\x00\x00\x0e\x8a\xfd\xf0\x00\x00\x00\x00\x0f\xcd\xfdp\x00\x00\x00\x00\x10t\x1ap\x00\x00\x00" +
-	"\x00\x11\xad\xdfp\x00\x00\x00\x00\x12S\xfcp\x00\x00\x00\x00\x13MD\x10\x00\x00\x00\x00\x143\xfa\x90\x00\x00\x00\x00\x15#\xeb\x90\x00\x00\x00\x00\x16\x13ܐ\x00\x00\x00\x00\x17\x03͐\x00\x00\x00\x00\x17\xf3\xbe" +
-	"\x90\x00\x00\x00\x00\x18㯐\x00\x00\x00\x00\x19Ӡ\x90\x00\x00\x00\x00\x1aÑ\x90\x00\x00\x00\x00\x1b\xbc\xbd\x10\x00\x00\x00\x00\x1c\xac\xae\x10\x00\x00\x00\x00\x1d\x9c\x9f\x10\x00\x00\x00\x00\x1e\x8c\x90\x10\x00\x00\x00" +
-	"\x00\x1f|\x81\x10\x00\x00\x00\x00 lr\x10\x00\x00\x00\x00!\\c\x10\x00\x00\x00\x00\"LT\x10\x00\x00\x00\x00#<E\x10\x00\x00\x00\x00$,6\x10\x00\x00\x00\x00%\x1c'\x10\x00\x00\x00\x00&\f\x18" +
-	"\x10\x00\x00\x00\x00'\x05C\x90\x00\x00\x00\x00'\xf54\x90\x00\x00\x00\x00(\xe5%\x90\x00\x00\x00\x00)\xd5\x16\x90\x00\x00\x00\x00*\xc5\a\x90\x00\x00\x00\x00+\xb4\xf8\x90\x00\x00\x00\x00,\xa4\xe9\x90\x00\x00\x00" +
-	"\x00-\x94ڐ\x00\x00\x00\x00.\x84ː\x00\x00\x00\x00/t\xbc\x90\x00\x00\x00\x000d\xad\x90\x00\x00\x00\x001]\xd9\x10\x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02" +
-	"\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02" +
-	"\x03\x02\x03\x02\x00\x00\v\xb4\x00\x00\x00\x00\v\xb4\x00\x04\x00\x00\x1c \x01\b\x00\x00\x0e\x10\x00\rLMT\x00RMT\x00CEST\x00CET\x00\nCET-1CEST,M3.5" +
-	".0,M10.5.0/3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Z\x05wג\x02\x00\x00\x92\x02\x00\x00\r\x00\x00\x00Europe/ViennaTZif" +
-	"2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x008\x00\x00\x00\x03\x00\x00\x00\r\xff\xff\xff\xffo\xa2_/\xff\xff\xff\xff\x9b\f\x17`\xff\xff\xff\xff\x9b\xd5\xda\xf0\xff\xff\xff\xff\x9c" +
-	"ٮ\x90\xff\xff\xff\xff\x9d\xa4\xb5\x90\xff\xff\xff\xff\x9e\xb9\x90\x90\xff\xff\xff\xff\x9f\x84\x97\x90\xff\xff\xff\xff\xa2p\x1a\x10\xff\xff\xff\xff\xa3D[\x90\xff\xff\xff\xff\xc8\tq\x90\xff\xff\xff\xff\xcc\xe7K\x10\xff" +
-	"\xff\xff\xffͩ\x17\x90\xff\xff\xff\xff\u03a2C\x10\xff\xff\xff\xffϒ4\x10\xff\xff\xff\xffЂ%\x10\xff\xff\xff\xff\xd1r\x16\x10\xff\xff\xff\xff\xd1\x7fE\x10\xff\xff\xff\xff\xd3c\x1b\x90\xff\xff\xff\xff\xd4" +
-	"K#\x90\xff\xff\xff\xff\xd59\xc3\x10\xff\xff\xff\xff\xd6)\xb4\x10\xff\xff\xff\xff\xd7,\x1a\x10\xff\xff\xff\xff\xd8\t\x96\x10\x00\x00\x00\x00\x13M'\xf0\x00\x00\x00\x00\x143\xd0`\x00\x00\x00\x00\x15#\xeb\x90\x00" +
-	"\x00\x00\x00\x16\x13ܐ\x00\x00\x00\x00\x17\x03͐\x00\x00\x00\x00\x17\xf3\xbe\x90\x00\x00\x00\x00\x18㯐\x00\x00\x00\x00\x19Ӡ\x90\x00\x00\x00\x00\x1aÑ\x90\x00\x00\x00\x00\x1b\xbc\xbd\x10\x00\x00\x00\x00\x1c" +
-	"\xac\xae\x10\x00\x00\x00\x00\x1d\x9c\x9f\x10\x00\x00\x00\x00\x1e\x8c\x90\x10\x00\x00\x00\x00\x1f|\x81\x10\x00\x00\x00\x00 lr\x10\x00\x00\x00\x00!\\c\x10\x00\x00\x00\x00\"LT\x10\x00\x00\x00\x00#<E\x10\x00" +
-	"\x00\x00\x00$,6\x10\x00\x00\x00\x00%\x1c'\x10\x00\x00\x00\x00&\f\x18\x10\x00\x00\x00\x00'\x05C\x90\x00\x00\x00\x00'\xf54\x90\x00\x00\x00\x00(\xe5%\x90\x00\x00\x00\x00)\xd5\x16\x90\x00\x00\x00\x00*" +
-	"\xc5\a\x90\x00\x00\x00\x00+\xb4\xf8\x90\x00\x00\x00\x00,\xa4\xe9\x90\x00\x00\x00\x00-\x94ڐ\x00\x00\x00\x00.\x84ː\x00\x00\x00\x00/t\xbc\x90\x00\x00\x00\x000d\xad\x90\x00\x00\x00\x001]\xd9\x10\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x00\x00\x0fQ\x00" +
-	"\x00\x00\x00\x1c \x01\x04\x00\x00\x0e\x10\x00\tLMT\x00CEST\x00CET\x00\nCET-1CEST,M3.5.0,M10.5.0/3\nPK\x03\x04\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\xccb\xf72\xa4\x02\x00\x00\xa4\x02\x00\x00\x0e\x00\x00\x00Europe/VilniusTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x003\x00\x00\x00\t\x00\x00\x00&\xff\xff\xff\xffV\xb6\xccD\xff\xff\xff\xff\x9cO\x1fP\xff\xff\xff\xff\xa1\x85J\x98\xff\xff\xff\xff\xa2\xf10\xf0\xff\xff\xff\xff\xa3fx`\xff\xff\xff\xffȬ\xcf" +
-	"p\xff\xff\xff\xff\xcaY*\xd0\xff\xff\xff\xff\xcc\xe7K\x10\xff\xff\xff\xffͩ\x17\x90\xff\xff\xff\xff\u03a2C\x10\xff\xff\xff\xffϒ4\x10\xff\xff\xff\xff\xd00=\xe0\x00\x00\x00\x00\x15'\xa7\xd0\x00\x00\x00" +
-	"\x00\x16\x18\xdc@\x00\x00\x00\x00\x17\b\xdbP\x00\x00\x00\x00\x17\xfa\x0f\xc0\x00\x00\x00\x00\x18\xea\x0e\xd0\x00\x00\x00\x00\x19\xdbC@\x00\x00\x00\x00\x1a̓\xd0\x00\x00\x00\x00\x1b\xbc\xa0\xf0\x00\x00\x00\x00\x1c\xac\x91" +
-	"\xf0\x00\x00\x00\x00\x1d\x9c\x82\xf0\x00\x00\x00\x00\x1e\x8cs\xf0\x00\x00\x00\x00\x1f|d\xf0\x00\x00\x00\x00 lU\xf0\x00\x00\x00\x00!\\F\xf0\x00\x00\x00\x00\"L7\xf0\x00\x00\x00\x00#<(\xf0\x00\x00\x00" +
-	"\x00$,\x19\xf0\x00\x00\x00\x00%\x1c\x19\x00\x00\x00\x00\x00&\f\n\x00\x00\x00\x00\x00'\x055\x80\x00\x00\x00\x00'\xf5&\x80\x00\x00\x00\x00(\xe5\x17\x80\x00\x00\x00\x00)\xd5\b\x80\x00\x00\x00\x00*\xc4\xf9" +
-	"\x80\x00\x00\x00\x00+\xb4\xea\x80\x00\x00\x00\x00,\xa4ۀ\x00\x00\x00\x00-\x94̀\x00\x00\x00\x00.\x84\xbd\x80\x00\x00\x00\x00/t\xae\x80\x00\x00\x00\x000d\x9f\x80\x00\x00\x00\x001]\xcb\x00\x00\x00\x00" +
-	"\x002r\xa6\x00\x00\x00\x00\x003=\xad\x00\x00\x00\x00\x004R\x88\x00\x00\x00\x00\x005\x1d\x9d\x10\x00\x00\x00\x0062x\x10\x00\x00\x00\x006\xfd\x7f\x10\x00\x00\x00\x008\x1b\x94\x90\x00\x00\x00\x00>\x86A" +
-	"\x90\x01\x02\x03\x04\x03\x05\x06\x03\x06\x03\x06\x05\a\x05\a\x05\a\x05\a\x05\a\x05\a\x05\a\x05\a\x05\b\x04\b\x04\b\x04\b\x04\b\x04\b\x04\b\x04\b\x04\b\x04\x06\x03\x06\x04\b\x00\x00\x17\xbc\x00\x00\x00\x00" +
-	"\x13\xb0\x00\x04\x00\x00\x16h\x00\b\x00\x00\x0e\x10\x00\f\x00\x00\x1c \x00\x10\x00\x00*0\x00\x14\x00\x00\x1c \x01\x18\x00\x008@\x01\x1d\x00\x00*0\x01!LMT\x00WMT\x00KMT\x00CE" +
-	"T\x00EET\x00MSK\x00CEST\x00MSD\x00EEST\x00\nEET-2EEST,M3.5.0/3,M10.5.0/4\nPK\x03\x04\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00Va\x92\xd3\xdf\x02\x00\x00\xdf\x02\x00\x00\x10\x00\x00\x00Europe/VolgogradTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00A\x00\x00\x00\x05\x00\x00\x00\x10\xff\xff\xff\xff\xa1\xf5F\xdc\xff\xff\xff\xff\xb5\xa4\vP\x00\x00\x00\x00\x15'\x99\xc0\x00\x00\x00\x00\x16\x18\xce0\x00\x00\x00\x00\x17\b\xcd@\x00\x00\x00\x00\x17" +
-	"\xfa\x01\xb0\x00\x00\x00\x00\x18\xea\x00\xc0\x00\x00\x00\x00\x19\xdb50\x00\x00\x00\x00\x1a̅\xc0\x00\x00\x00\x00\x1b\xbc\x92\xe0\x00\x00\x00\x00\x1c\xac\x83\xe0\x00\x00\x00\x00\x1d\x9ct\xe0\x00\x00\x00\x00\x1e\x8ce\xe0\x00" +
-	"\x00\x00\x00\x1f|V\xe0\x00\x00\x00\x00 lG\xe0\x00\x00\x00\x00!\\8\xe0\x00\x00\x00\x00\"L)\xe0\x00\x00\x00\x00#<(\xf0\x00\x00\x00\x00$,\x19\xf0\x00\x00\x00\x00%\x1c\n\xf0\x00\x00\x00\x00&" +
-	"\v\xfb\xf0\x00\x00\x00\x00'\x05'p\x00\x00\x00\x00'\xf5\x18p\x00\x00\x00\x00)\xd4\xec`\x00\x00\x00\x00*\xc4\xebp\x00\x00\x00\x00+\xb4\xdcp\x00\x00\x00\x00,\xa4\xcdp\x00\x00\x00\x00-\x94\xbep\x00" +
-	"\x00\x00\x00.\x84\xafp\x00\x00\x00\x00/t\xa0p\x00\x00\x00\x000d\x91p\x00\x00\x00\x001]\xbc\xf0\x00\x00\x00\x002r\x97\xf0\x00\x00\x00\x003=\x9e\xf0\x00\x00\x00\x004Ry\xf0\x00\x00\x00\x005" +
-	"\x1d\x80\xf0\x00\x00\x00\x0062[\xf0\x00\x00\x00\x006\xfdb\xf0\x00\x00\x00\x008\x1bxp\x00\x00\x00\x008\xddD\xf0\x00\x00\x00\x009\xfbZp\x00\x00\x00\x00:\xbd&\xf0\x00\x00\x00\x00;\xdb<p\x00" +
-	"\x00\x00\x00<\xa6Cp\x00\x00\x00\x00=\xbb\x1ep\x00\x00\x00\x00>\x86%p\x00\x00\x00\x00?\x9b\x00p\x00\x00\x00\x00@f\ap\x00\x00\x00\x00A\x84\x1c\xf0\x00\x00\x00\x00BE\xe9p\x00\x00\x00\x00C" +
-	"c\xfe\xf0\x00\x00\x00\x00D%\xcbp\x00\x00\x00\x00EC\xe0\xf0\x00\x00\x00\x00F\x05\xadp\x00\x00\x00\x00G#\xc2\xf0\x00\x00\x00\x00G\xee\xc9\xf0\x00\x00\x00\x00I\x03\xa4\xf0\x00\x00\x00\x00IΫ\xf0\x00" +
-	"\x00\x00\x00J\xe3\x86\xf0\x00\x00\x00\x00K\xae\x8d\xf0\x00\x00\x00\x00Ḷp\x00\x00\x00\x00M\x8eo\xf0\x00\x00\x00\x00TL\x1d`\x00\x00\x00\x00[\xd4\xed\xf0\x00\x00\x00\x00_\xe7\xb2`\x01\x02\x03\x02\x03" +
-	"\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x04\x01\x04\x01\x04\x01\x02\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x02\x01\x02\x01" +
-	"\x00\x00)\xa4\x00\x00\x00\x00*0\x00\x04\x00\x008@\x00\b\x00\x00FP\x01\f\x00\x008@\x01\bLMT\x00+03\x00+04\x00+05\x00\n<+03>-3\nPK\x03\x04\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00>\xfe垛\x03\x00\x00\x9b\x03\x00\x00\r\x00\x00\x00Europe/WarsawTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00R\x00\x00\x00\x06\x00\x00\x00\x1a\xff\xff\xff\xffV\xb6\xd0P\xff\xff\xff\xff\x99\xa8*\xd0\xff\xff\xff\xff\x9b\f\x17`\xff\xff\xff\xff\x9b\xd5\xda\xf0\xff\xff\xff\xff\x9cٮ\x90\xff\xff\xff\xff\x9d\xa4\xb5" +
-	"\x90\xff\xff\xff\xff\x9e\xb9\x90\x90\xff\xff\xff\xff\x9f\x84\x97\x90\xff\xff\xff\xff\xa0\x9a\xb6\x00\xff\xff\xff\xff\xa1e\xbd\x00\xff\xff\xff\xff\xa6}|`\xff\xff\xff\xff\xc8v\xde\x10\xff\xff\xff\xff\xcc\xe7K\x10\xff\xff\xff" +
-	"\xffͩ\x17\x90\xff\xff\xff\xff\u03a2C\x10\xff\xff\xff\xffϒ4\x10\xff\xff\xff\xffЄ\xba\x00\xff\xff\xff\xffѕ\x92p\xff\xff\xff\xffҊ\xbb`\xff\xff\xff\xff\xd3b\xffp\xff\xff\xff\xff\xd4K#" +
-	"\x90\xff\xff\xff\xff\xd5^\xad\x10\xff\xff\xff\xff\xd6)\xb4\x10\xff\xff\xff\xff\xd7,\x1a\x10\xff\xff\xff\xff\xd8\t\x96\x10\xff\xff\xff\xff\xd9\x02\xc1\x90\xff\xff\xff\xff\xd9\xe9x\x10\xff\xff\xff\xff\xe8T\xd2\x00\xff\xff\xff" +
-	"\xff\xe8\xf1\xb4\x80\xff\xff\xff\xff\xe9᥀\xff\xff\xff\xff\xeaі\x80\xff\xff\xff\xff\xec\x14\x96\x00\xff\xff\xff\xff캳\x00\xff\xff\xff\xff\xed\xaa\xa4\x00\xff\xff\xff\xff\ue695\x00\xff\xff\xff\xff\xef\xd4Z" +
-	"\x00\xff\xff\xff\xff\xf0zw\x00\xff\xff\xff\xff\xf1\xb4<\x00\xff\xff\xff\xff\xf2ZY\x00\xff\xff\xff\xff\xf3\x94\x1e\x00\xff\xff\xff\xff\xf4:;\x00\xff\xff\xff\xff\xf5}:\x80\xff\xff\xff\xff\xf6\x1a\x1d\x00\x00\x00\x00" +
-	"\x00\r\xa4U\x80\x00\x00\x00\x00\x0e\x8b\f\x00\x00\x00\x00\x00\x0f\x847\x80\x00\x00\x00\x00\x10t(\x80\x00\x00\x00\x00\x11d\x19\x80\x00\x00\x00\x00\x12T\n\x80\x00\x00\x00\x00\x13M6\x00\x00\x00\x00\x00\x143\xec" +
-	"\x80\x00\x00\x00\x00\x15#݀\x00\x00\x00\x00\x16\x13\u0380\x00\x00\x00\x00\x17\x03\xbf\x80\x00\x00\x00\x00\x17\xf3\xb0\x80\x00\x00\x00\x00\x18㡀\x00\x00\x00\x00\x19Ӓ\x80\x00\x00\x00\x00\x1aÃ\x80\x00\x00\x00" +
-	"\x00\x1b\xbc\xaf\x00\x00\x00\x00\x00\x1c\xac\xa0\x00\x00\x00\x00\x00\x1d\x9c\x91\x00\x00\x00\x00\x00\x1e\x8c\x82\x00\x00\x00\x00\x00\x1f|s\x00\x00\x00\x00\x00 ld\x00\x00\x00\x00\x00!\\U\x00\x00\x00\x00\x00\"LT" +
-	"\x10\x00\x00\x00\x00#<E\x10\x00\x00\x00\x00$,6\x10\x00\x00\x00\x00%\x1c'\x10\x00\x00\x00\x00&\f\x18\x10\x00\x00\x00\x00'\x05C\x90\x00\x00\x00\x00'\xf54\x90\x00\x00\x00\x00(\xe5%\x90\x00\x00\x00" +
-	"\x00)\xd5\x16\x90\x00\x00\x00\x00*\xc5\a\x90\x00\x00\x00\x00+\xb4\xf8\x90\x00\x00\x00\x00,\xa4\xe9\x90\x00\x00\x00\x00-\x94ڐ\x00\x00\x00\x00.\x84ː\x00\x00\x00\x00/t\xbc\x90\x00\x00\x00\x000d\xad" +
-	"\x90\x00\x00\x00\x001]\xd9\x10\x01\x03\x02\x03\x02\x03\x02\x05\x04\x05\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03" +
-	"\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x00\x00\x13\xb0\x00\x00\x00\x00\x13\xb0\x00\x04\x00\x00\x1c \x01\b\x00\x00\x0e\x10\x00\r\x00\x00*0\x01" +
-	"\x11\x00\x00\x1c \x00\x16LMT\x00WMT\x00CEST\x00CET\x00EEST\x00EET\x00\nCET-1CEST,M3.5.0,M10.5.0/3" +
-	"\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe1C\xf9\xa1\xde\x01\x00\x00\xde\x01\x00\x00\r\x00\x00\x00Europe/ZagrebTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00$\x00\x00\x00\x03\x00\x00\x00\r\xff\xff\xff\xff^<\xf0H\xff\xff\xff\xff\xca\x025\xe0\xff\xff\xff\xff\xcc\xe7K\x10\xff\xff\xff\xffͩ\x17\x90\xff\xff\xff\xff\u03a2C\x10\xff" +
-	"\xff\xff\xffϒ4\x10\xff\xff\xff\xffЂ%\x10\xff\xff\xff\xffѡ\x8c\x10\xff\xff\xff\xff\xd2N@\x90\x00\x00\x00\x00\x18㯐\x00\x00\x00\x00\x19Ӡ\x90\x00\x00\x00\x00\x1aÑ\x90\x00\x00\x00\x00\x1b" +
-	"\xbc\xbd\x10\x00\x00\x00\x00\x1c\xac\xae\x10\x00\x00\x00\x00\x1d\x9c\x9f\x10\x00\x00\x00\x00\x1e\x8c\x90\x10\x00\x00\x00\x00\x1f|\x81\x10\x00\x00\x00\x00 lr\x10\x00\x00\x00\x00!\\c\x10\x00\x00\x00\x00\"LT\x10\x00" +
-	"\x00\x00\x00#<E\x10\x00\x00\x00\x00$,6\x10\x00\x00\x00\x00%\x1c'\x10\x00\x00\x00\x00&\f\x18\x10\x00\x00\x00\x00'\x05C\x90\x00\x00\x00\x00'\xf54\x90\x00\x00\x00\x00(\xe5%\x90\x00\x00\x00\x00)" +
-	"\xd5\x16\x90\x00\x00\x00\x00*\xc5\a\x90\x00\x00\x00\x00+\xb4\xf8\x90\x00\x00\x00\x00,\xa4\xe9\x90\x00\x00\x00\x00-\x94ڐ\x00\x00\x00\x00.\x84ː\x00\x00\x00\x00/t\xbc\x90\x00\x00\x00\x000d\xad\x90\x00" +
-	"\x00\x00\x001]\xd9\x10\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x00\x00\x138\x00\x00\x00\x00\x0e\x10\x00\x04\x00\x00\x1c \x01" +
-	"\bLMT\x00CET\x00CEST\x00\nCET-1CEST,M3.5.0,M10.5.0/3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00iS\x18D" +
-	".\x02\x00\x00.\x02\x00\x00\x11\x00\x00\x00Europe/ZaporozhyeTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\x00\x00\x00\b" +
-	"\x00\x00\x00\"\xff\xff\xff\xffV\xb6\xc7d\xff\xff\xff\xff\xaa\x19\xa7d\xff\xff\xff\xff\xb5\xa4\x19`\xff\xff\xff\xff\xca\xcd.\xd0\xff\xff\xff\xff\xcc\xe7K\x10\xff\xff\xff\xffͩ\x17\x90\xff\xff\xff\xff\u03a2C\x10" +
-	"\xff\xff\xff\xff\xceͨp\x00\x00\x00\x00\x15'\xa7\xd0\x00\x00\x00\x00\x16\x18\xdc@\x00\x00\x00\x00\x17\b\xdbP\x00\x00\x00\x00\x17\xfa\x0f\xc0\x00\x00\x00\x00\x18\xea\x0e\xd0\x00\x00\x00\x00\x19\xdbC@\x00\x00\x00\x00" +
-	"\x1a̓\xd0\x00\x00\x00\x00\x1b\xbc\xa0\xf0\x00\x00\x00\x00\x1c\xac\x91\xf0\x00\x00\x00\x00\x1d\x9c\x82\xf0\x00\x00\x00\x00\x1e\x8cs\xf0\x00\x00\x00\x00\x1f|d\xf0\x00\x00\x00\x00 lU\xf0\x00\x00\x00\x00!\\F\xf0" +
-	"\x00\x00\x00\x00\"L7\xf0\x00\x00\x00\x00#<(\xf0\x00\x00\x00\x00$,\x19\xf0\x00\x00\x00\x00%\x1c\n\xf0\x00\x00\x00\x00&\v\xfb\xf0\x00\x00\x00\x00&\x8d \xe0\x00\x00\x00\x00(\xe5\x17\x80\x00\x00\x00\x00" +
-	")\xd5\b\x80\x00\x00\x00\x00*\xc4\xf9\x80\x00\x00\x00\x00+\xb4\xea\x80\x00\x00\x00\x00,\xa4ۀ\x00\x00\x00\x00-\x94̀\x00\x00\x00\x00.\x84\xbd\x80\x00\x00\x00\x00/t\xae\x80\x00\x00\x00\x000d\x9f\x80" +
-	"\x00\x00\x00\x001]\xcb\x00\x00\x00\x00\x002r\xb4\x10\x01\x02\x03\x05\x04\x05\x04\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\a\x02\a\x02\a\x02\a\x02\a\x02\a\x02\x00\x00\x1c\x9c\x00" +
-	"\x00\x00\x00\x1c\x9c\x00\x04\x00\x00\x1c \x00\b\x00\x00*0\x00\f\x00\x00\x0e\x10\x00\x10\x00\x00\x1c \x01\x14\x00\x008@\x01\x19\x00\x00*0\x01\x1dLMT\x00KMT\x00EET\x00MSK\x00C" +
-	"ET\x00CEST\x00MSD\x00EEST\x00\nEET-2EEST,M3.5.0/3,M10.5.0/4\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00Dd#\xc4\xf1\x01\x00\x00\xf1\x01\x00\x00\r\x00\x00\x00Europe/ZurichTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00%\x00\x00\x00" +
-	"\x04\x00\x00\x00\x11\xff\xff\xff\xff$\xf0\xea\x80\xff\xff\xff\xffq\xd4\x06\x86\xff\xff\xff\xff\xca\x17j\x00\xff\xff\xff\xff\xca\xe2q\x00\xff\xff\xff\xff\xcb\xf7L\x00\xff\xff\xff\xff\xcc\xc2S\x00\x00\x00\x00\x00\x15#\xeb" +
-	"\x90\x00\x00\x00\x00\x16\x13ܐ\x00\x00\x00\x00\x17\x03͐\x00\x00\x00\x00\x17\xf3\xbe\x90\x00\x00\x00\x00\x18㯐\x00\x00\x00\x00\x19Ӡ\x90\x00\x00\x00\x00\x1aÑ\x90\x00\x00\x00\x00\x1b\xbc\xbd\x10\x00\x00\x00" +
-	"\x00\x1c\xac\xae\x10\x00\x00\x00\x00\x1d\x9c\x9f\x10\x00\x00\x00\x00\x1e\x8c\x90\x10\x00\x00\x00\x00\x1f|\x81\x10\x00\x00\x00\x00 lr\x10\x00\x00\x00\x00!\\c\x10\x00\x00\x00\x00\"LT\x10\x00\x00\x00\x00#<E" +
-	"\x10\x00\x00\x00\x00$,6\x10\x00\x00\x00\x00%\x1c'\x10\x00\x00\x00\x00&\f\x18\x10\x00\x00\x00\x00'\x05C\x90\x00\x00\x00\x00'\xf54\x90\x00\x00\x00\x00(\xe5%\x90\x00\x00\x00\x00)\xd5\x16\x90\x00\x00\x00" +
-	"\x00*\xc5\a\x90\x00\x00\x00\x00+\xb4\xf8\x90\x00\x00\x00\x00,\xa4\xe9\x90\x00\x00\x00\x00-\x94ڐ\x00\x00\x00\x00.\x84ː\x00\x00\x00\x00/t\xbc\x90\x00\x00\x00\x000d\xad\x90\x00\x00\x00\x001]\xd9" +
-	"\x10\x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x00\x00\b\x00\x00\x00\x00\x00\x06\xfa\x00\x04\x00\x00\x1c \x01\b\x00\x00\x0e\x10" +
-	"\x00\rLMT\x00BMT\x00CEST\x00CET\x00\nCET-1CEST,M3.5.0,M10.5.0/3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\xab\x80c$q\x00\x00\x00q\x00\x00\x00\a\x00\x00\x00FactoryTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x04\x00" +
-	"\x00\x00\x00\x00\x00-00\x00\n<-00>0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00k\xa4,\xb6?\x06\x00\x00?\x06\x00\x00\x02\x00\x00\x00GBTZif2\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9f\x00\x00\x00\x05\x00\x00\x00\x11\xff\xff\xff\xff\x1a]\t\xcb\xff\xff\xff\xff\x9b&\xad\xa0\xff\xff\xff\xff\x9b\xd6\x05 \xff\xff\xff\xff\x9c\xcf0\xa0\xff\xff\xff\xff" +
-	"\x9d\xa4à\xff\xff\xff\xff\x9e\x9c\x9d\xa0\xff\xff\xff\xff\x9f\x97\x1a\xa0\xff\xff\xff\xff\xa0\x85\xba \xff\xff\xff\xff\xa1v\xfc\xa0\xff\xff\xff\xff\xa2e\x9c \xff\xff\xff\xff\xa3{Ƞ\xff\xff\xff\xff\xa4N\xb8\xa0" +
-	"\xff\xff\xff\xff\xa5?\xfb \xff\xff\xff\xff\xa6%` \xff\xff\xff\xff\xa7'\xc6 \xff\xff\xff\xff\xa8*, \xff\xff\xff\xff\xa8\xeb\xf8\xa0\xff\xff\xff\xff\xaa\x00Ӡ\xff\xff\xff\xff\xaa\xd5\x15 \xff\xff\xff\xff" +
-	"\xab\xe9\xf0 \xff\xff\xff\xff\xac\xc7l \xff\xff\xff\xff\xad\xc9\xd2 \xff\xff\xff\xff\xae\xa7N \xff\xff\xff\xff\xaf\xa0y\xa0\xff\xff\xff\xff\xb0\x870 \xff\xff\xff\xff\xb1\x92Р\xff\xff\xff\xff\xb2pL\xa0" +
-	"\xff\xff\xff\xff\xb3r\xb2\xa0\xff\xff\xff\xff\xb4P.\xa0\xff\xff\xff\xff\xb5IZ \xff\xff\xff\xff\xb60\x10\xa0\xff\xff\xff\xff\xb72v\xa0\xff\xff\xff\xff\xb8\x0f\xf2\xa0\xff\xff\xff\xff\xb9\x12X\xa0\xff\xff\xff\xff" +
-	"\xb9\xefԠ\xff\xff\xff\xff\xba\xe9\x00 \xff\xff\xff\xff\xbb\xd8\xf1 \xff\xff\xff\xff\xbc\xdbW \xff\xff\xff\xff\xbd\xb8\xd3 \xff\xff\xff\xff\xbe\xb1\xfe\xa0\xff\xff\xff\xff\xbf\x98\xb5 \xff\xff\xff\xff\xc0\x9b\x1b " +
-	"\xff\xff\xff\xff\xc1x\x97 \xff\xff\xff\xff\xc2z\xfd \xff\xff\xff\xff\xc3Xy \xff\xff\xff\xff\xc4Q\xa4\xa0\xff\xff\xff\xff\xc58[ \xff\xff\xff\xff\xc6:\xc1 \xff\xff\xff\xff\xc7X֠\xff\xff\xff\xff" +
-	"\xc7\xda\t\xa0\xff\xff\xff\xff\xca\x16&\x90\xff\xff\xff\xffʗY\x90\xff\xff\xff\xff\xcb\xd1\x1e\x90\xff\xff\xff\xff\xccw;\x90\xff\xff\xff\xffͱ\x00\x90\xff\xff\xff\xff\xce`X\x10\xff\xff\xff\xffϐ\xe2\x90" +
-	"\xff\xff\xff\xff\xd0n^\x90\xff\xff\xff\xff\xd1r\x16\x10\xff\xff\xff\xff\xd1\xfb2\x10\xff\xff\xff\xff\xd2i\xfe \xff\xff\xff\xff\xd3c)\xa0\xff\xff\xff\xff\xd4I\xe0 \xff\xff\xff\xff\xd5\x1e!\xa0\xff\xff\xff\xff" +
-	"\xd5B\xfd\x90\xff\xff\xff\xff\xd5\xdf\xe0\x10\xff\xff\xff\xff\xd6N\xac \xff\xff\xff\xff\xd6\xfe\x03\xa0\xff\xff\xff\xff\xd8.\x8e \xff\xff\xff\xff\xd8\xf9\x95 \xff\xff\xff\xff\xda\x0ep \xff\xff\xff\xff\xda\xeb\xec " +
-	"\xff\xff\xff\xff\xdb\xe5\x17\xa0\xff\xff\xff\xff\xdc\xcb\xce \xff\xff\xff\xff\xdd\xc4\xf9\xa0\xff\xff\xff\xff\u07b4\xea\xa0\xff\xff\xff\xff߮\x16 \xff\xff\xff\xff\xe0\x94̠\xff\xff\xff\xff\xe1rH\xa0\xff\xff\xff\xff" +
-	"\xe2kt \xff\xff\xff\xff\xe3R*\xa0\xff\xff\xff\xff\xe4T\x90\xa0\xff\xff\xff\xff\xe52\f\xa0\xff\xff\xff\xff\xe6=\xad \xff\xff\xff\xff\xe7\x1b) \xff\xff\xff\xff\xe8\x14T\xa0\xff\xff\xff\xff\xe8\xfb\v " +
-	"\xff\xff\xff\xff\xe9\xfdq \xff\xff\xff\xff\xea\xda\xed \xff\xff\xff\xff\xeb\xddS \xff\xff\xff\xff\xec\xba\xcf \xff\xff\xff\xff\xed\xb3\xfa\xa0\xff\xff\xff\xff\ue6b1 \xff\xff\xff\xff\xef\x81g\xa0\xff\xff\xff\xff" +
-	"\xf0\x9f} \xff\xff\xff\xff\xf1aI\xa0\xff\xff\xff\xff\xf2\x7f_ \xff\xff\xff\xff\xf3Jf \xff\xff\xff\xff\xf4_A \xff\xff\xff\xff\xf5!\r\xa0\xff\xff\xff\xff\xf6?# \xff\xff\xff\xff\xf7\x00\xef\xa0" +
-	"\xff\xff\xff\xff\xf8\x1f\x05 \xff\xff\xff\xff\xf8\xe0Ѡ\xff\xff\xff\xff\xf9\xfe\xe7 \xff\xff\xff\xff\xfa\xc0\xb3\xa0\xff\xff\xff\xff\xfb\xe8\x03\xa0\xff\xff\xff\xff\xfc{\xab\xa0\xff\xff\xff\xff\xfdǻp\x00\x00\x00\x00" +
-	"\x03p\xc6 \x00\x00\x00\x00\x04)X \x00\x00\x00\x00\x05P\xa8 \x00\x00\x00\x00\x06\t: \x00\x00\x00\x00\a0\x8a \x00\x00\x00\x00\a\xe9\x1c \x00\x00\x00\x00\t\x10l \x00\x00\x00\x00\t\xc8\xfe " +
-	"\x00\x00\x00\x00\n\xf0N \x00\x00\x00\x00\v\xb2\x1a\xa0\x00\x00\x00\x00\f\xd00 \x00\x00\x00\x00\r\x91\xfc\xa0\x00\x00\x00\x00\x0e\xb0\x12 \x00\x00\x00\x00\x0fqޠ\x00\x00\x00\x00\x10\x99.\xa0\x00\x00\x00\x00" +
-	"\x11Q\xc0\xa0\x00\x00\x00\x00\x12y\x10\xa0\x00\x00\x00\x00\x131\xa2\xa0\x00\x00\x00\x00\x14X\xf2\xa0\x00\x00\x00\x00\x15#\xeb\x90\x00\x00\x00\x00\x168Ɛ\x00\x00\x00\x00\x17\x03͐\x00\x00\x00\x00\x18\x18\xa8\x90" +
-	"\x00\x00\x00\x00\x18㯐\x00\x00\x00\x00\x19\xf8\x8a\x90\x00\x00\x00\x00\x1aÑ\x90\x00\x00\x00\x00\x1b\xe1\xa7\x10\x00\x00\x00\x00\x1c\xac\xae\x10\x00\x00\x00\x00\x1d\xc1\x89\x10\x00\x00\x00\x00\x1e\x8c\x90\x10\x00\x00\x00\x00" +
-	"\x1f\xa1k\x10\x00\x00\x00\x00 lr\x10\x00\x00\x00\x00!\x81M\x10\x00\x00\x00\x00\"LT\x10\x00\x00\x00\x00#a/\x10\x00\x00\x00\x00$,6\x10\x00\x00\x00\x00%JK\x90\x00\x00\x00\x00&\f\x18\x10" +
-	"\x00\x00\x00\x00'*-\x90\x00\x00\x00\x00'\xf54\x90\x00\x00\x00\x00)\n\x0f\x90\x00\x00\x00\x00)\xd5\x16\x90\x00\x00\x00\x00*\xe9\xf1\x90\x00\x00\x00\x00+\xb4\xf8\x90\x00\x00\x00\x00,\xc9Ӑ\x00\x00\x00\x00" +
-	"-\x94ڐ\x00\x00\x00\x00.\xa9\xb5\x90\x00\x00\x00\x00/t\xbc\x90\x00\x00\x00\x000\x89\x97\x90\x00\x00\x00\x001]\xd9\x10\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x02\x01\x02\x01\x03\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x04\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\xff\xff\xff\xb5\x00\x00\x00\x00\x0e\x10\x01\x04\x00\x00\x00\x00\x00\b\x00\x00\x1c \x01\f\x00\x00\x0e\x10\x00\x04LMT\x00BST\x00GMT\x00BDS" +
-	"T\x00\nGMT0BST,M3.5.0/1,M10.5.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00k\xa4,\xb6?\x06\x00\x00?\x06\x00\x00\a\x00\x00\x00GB" +
-	"-EireTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif" +
-	"2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9f\x00\x00\x00\x05\x00\x00\x00\x11\xff\xff\xff\xff\x1a]\t\xcb\xff\xff\xff\xff\x9b&\xad\xa0\xff\xff\xff\xff" +
-	"\x9b\xd6\x05 \xff\xff\xff\xff\x9c\xcf0\xa0\xff\xff\xff\xff\x9d\xa4à\xff\xff\xff\xff\x9e\x9c\x9d\xa0\xff\xff\xff\xff\x9f\x97\x1a\xa0\xff\xff\xff\xff\xa0\x85\xba \xff\xff\xff\xff\xa1v\xfc\xa0\xff\xff\xff\xff\xa2e\x9c " +
-	"\xff\xff\xff\xff\xa3{Ƞ\xff\xff\xff\xff\xa4N\xb8\xa0\xff\xff\xff\xff\xa5?\xfb \xff\xff\xff\xff\xa6%` \xff\xff\xff\xff\xa7'\xc6 \xff\xff\xff\xff\xa8*, \xff\xff\xff\xff\xa8\xeb\xf8\xa0\xff\xff\xff\xff" +
-	"\xaa\x00Ӡ\xff\xff\xff\xff\xaa\xd5\x15 \xff\xff\xff\xff\xab\xe9\xf0 \xff\xff\xff\xff\xac\xc7l \xff\xff\xff\xff\xad\xc9\xd2 \xff\xff\xff\xff\xae\xa7N \xff\xff\xff\xff\xaf\xa0y\xa0\xff\xff\xff\xff\xb0\x870 " +
-	"\xff\xff\xff\xff\xb1\x92Р\xff\xff\xff\xff\xb2pL\xa0\xff\xff\xff\xff\xb3r\xb2\xa0\xff\xff\xff\xff\xb4P.\xa0\xff\xff\xff\xff\xb5IZ \xff\xff\xff\xff\xb60\x10\xa0\xff\xff\xff\xff\xb72v\xa0\xff\xff\xff\xff" +
-	"\xb8\x0f\xf2\xa0\xff\xff\xff\xff\xb9\x12X\xa0\xff\xff\xff\xff\xb9\xefԠ\xff\xff\xff\xff\xba\xe9\x00 \xff\xff\xff\xff\xbb\xd8\xf1 \xff\xff\xff\xff\xbc\xdbW \xff\xff\xff\xff\xbd\xb8\xd3 \xff\xff\xff\xff\xbe\xb1\xfe\xa0" +
-	"\xff\xff\xff\xff\xbf\x98\xb5 \xff\xff\xff\xff\xc0\x9b\x1b \xff\xff\xff\xff\xc1x\x97 \xff\xff\xff\xff\xc2z\xfd \xff\xff\xff\xff\xc3Xy \xff\xff\xff\xff\xc4Q\xa4\xa0\xff\xff\xff\xff\xc58[ \xff\xff\xff\xff" +
-	"\xc6:\xc1 \xff\xff\xff\xff\xc7X֠\xff\xff\xff\xff\xc7\xda\t\xa0\xff\xff\xff\xff\xca\x16&\x90\xff\xff\xff\xffʗY\x90\xff\xff\xff\xff\xcb\xd1\x1e\x90\xff\xff\xff\xff\xccw;\x90\xff\xff\xff\xffͱ\x00\x90" +
-	"\xff\xff\xff\xff\xce`X\x10\xff\xff\xff\xffϐ\xe2\x90\xff\xff\xff\xff\xd0n^\x90\xff\xff\xff\xff\xd1r\x16\x10\xff\xff\xff\xff\xd1\xfb2\x10\xff\xff\xff\xff\xd2i\xfe \xff\xff\xff\xff\xd3c)\xa0\xff\xff\xff\xff" +
-	"\xd4I\xe0 \xff\xff\xff\xff\xd5\x1e!\xa0\xff\xff\xff\xff\xd5B\xfd\x90\xff\xff\xff\xff\xd5\xdf\xe0\x10\xff\xff\xff\xff\xd6N\xac \xff\xff\xff\xff\xd6\xfe\x03\xa0\xff\xff\xff\xff\xd8.\x8e \xff\xff\xff\xff\xd8\xf9\x95 " +
-	"\xff\xff\xff\xff\xda\x0ep \xff\xff\xff\xff\xda\xeb\xec \xff\xff\xff\xff\xdb\xe5\x17\xa0\xff\xff\xff\xff\xdc\xcb\xce \xff\xff\xff\xff\xdd\xc4\xf9\xa0\xff\xff\xff\xff\u07b4\xea\xa0\xff\xff\xff\xff߮\x16 \xff\xff\xff\xff" +
-	"\xe0\x94̠\xff\xff\xff\xff\xe1rH\xa0\xff\xff\xff\xff\xe2kt \xff\xff\xff\xff\xe3R*\xa0\xff\xff\xff\xff\xe4T\x90\xa0\xff\xff\xff\xff\xe52\f\xa0\xff\xff\xff\xff\xe6=\xad \xff\xff\xff\xff\xe7\x1b) " +
-	"\xff\xff\xff\xff\xe8\x14T\xa0\xff\xff\xff\xff\xe8\xfb\v \xff\xff\xff\xff\xe9\xfdq \xff\xff\xff\xff\xea\xda\xed \xff\xff\xff\xff\xeb\xddS \xff\xff\xff\xff\xec\xba\xcf \xff\xff\xff\xff\xed\xb3\xfa\xa0\xff\xff\xff\xff" +
-	"\ue6b1 \xff\xff\xff\xff\xef\x81g\xa0\xff\xff\xff\xff\xf0\x9f} \xff\xff\xff\xff\xf1aI\xa0\xff\xff\xff\xff\xf2\x7f_ \xff\xff\xff\xff\xf3Jf \xff\xff\xff\xff\xf4_A \xff\xff\xff\xff\xf5!\r\xa0" +
-	"\xff\xff\xff\xff\xf6?# \xff\xff\xff\xff\xf7\x00\xef\xa0\xff\xff\xff\xff\xf8\x1f\x05 \xff\xff\xff\xff\xf8\xe0Ѡ\xff\xff\xff\xff\xf9\xfe\xe7 \xff\xff\xff\xff\xfa\xc0\xb3\xa0\xff\xff\xff\xff\xfb\xe8\x03\xa0\xff\xff\xff\xff" +
-	"\xfc{\xab\xa0\xff\xff\xff\xff\xfdǻp\x00\x00\x00\x00\x03p\xc6 \x00\x00\x00\x00\x04)X \x00\x00\x00\x00\x05P\xa8 \x00\x00\x00\x00\x06\t: \x00\x00\x00\x00\a0\x8a \x00\x00\x00\x00\a\xe9\x1c " +
-	"\x00\x00\x00\x00\t\x10l \x00\x00\x00\x00\t\xc8\xfe \x00\x00\x00\x00\n\xf0N \x00\x00\x00\x00\v\xb2\x1a\xa0\x00\x00\x00\x00\f\xd00 \x00\x00\x00\x00\r\x91\xfc\xa0\x00\x00\x00\x00\x0e\xb0\x12 \x00\x00\x00\x00" +
-	"\x0fqޠ\x00\x00\x00\x00\x10\x99.\xa0\x00\x00\x00\x00\x11Q\xc0\xa0\x00\x00\x00\x00\x12y\x10\xa0\x00\x00\x00\x00\x131\xa2\xa0\x00\x00\x00\x00\x14X\xf2\xa0\x00\x00\x00\x00\x15#\xeb\x90\x00\x00\x00\x00\x168Ɛ" +
-	"\x00\x00\x00\x00\x17\x03͐\x00\x00\x00\x00\x18\x18\xa8\x90\x00\x00\x00\x00\x18㯐\x00\x00\x00\x00\x19\xf8\x8a\x90\x00\x00\x00\x00\x1aÑ\x90\x00\x00\x00\x00\x1b\xe1\xa7\x10\x00\x00\x00\x00\x1c\xac\xae\x10\x00\x00\x00\x00" +
-	"\x1d\xc1\x89\x10\x00\x00\x00\x00\x1e\x8c\x90\x10\x00\x00\x00\x00\x1f\xa1k\x10\x00\x00\x00\x00 lr\x10\x00\x00\x00\x00!\x81M\x10\x00\x00\x00\x00\"LT\x10\x00\x00\x00\x00#a/\x10\x00\x00\x00\x00$,6\x10" +
-	"\x00\x00\x00\x00%JK\x90\x00\x00\x00\x00&\f\x18\x10\x00\x00\x00\x00'*-\x90\x00\x00\x00\x00'\xf54\x90\x00\x00\x00\x00)\n\x0f\x90\x00\x00\x00\x00)\xd5\x16\x90\x00\x00\x00\x00*\xe9\xf1\x90\x00\x00\x00\x00" +
-	"+\xb4\xf8\x90\x00\x00\x00\x00,\xc9Ӑ\x00\x00\x00\x00-\x94ڐ\x00\x00\x00\x00.\xa9\xb5\x90\x00\x00\x00\x00/t\xbc\x90\x00\x00\x00\x000\x89\x97\x90\x00\x00\x00\x001]\xd9\x10\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x02\x01\x02\x01\x03\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x04\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\xff\xff\xff\xb5\x00\x00\x00\x00\x0e\x10\x01\x04\x00\x00\x00\x00\x00\b\x00\x00\x1c \x01\f\x00\x00\x0e\x10\x00" +
-	"\x04LMT\x00BST\x00GMT\x00BDST\x00\nGMT0BST,M3.5.0/1,M10.5.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00P\xda" +
-	"\xfa\x03o\x00\x00\x00o\x00\x00\x00\x03\x00\x00\x00GMTTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" +
-	"\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00GM" +
-	"T\x00\nGMT0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00P\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\x05\x00\x00\x00GMT+0TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00GMT\x00\nGMT0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00P\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00" +
-	"\x05\x00\x00\x00GMT-0TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00" +
-	"TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00GMT\x00\nGMT0\n" +
-	"PK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00P\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\x04\x00\x00\x00GMT0TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x01\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00GMT\x00\nGMT0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00P\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\t\x00\x00\x00Green" +
-	"wichTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00GMT\x00\nGMT0\nPK\x03\x04\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00=\xf7\xfawp\x00\x00\x00p\x00\x00\x00\x03\x00\x00\x00HSTTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" +
-	"\x00\x00\x04\xff\xffs`\x00\x00HST\x00\nHST10\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00E\t\xfa-\a\x03\x00\x00\a\x03\x00\x00\b\x00\x00\x00HongkongTZ" +
-	"if2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00E\x00\x00\x00\x05\x00\x00\x00\x16\xff\xff\xff\xff\x85ic\x90\xff\xff\xff\xff\xcaM10\xff\xff\xff\xff\xcaۓ0\xff\xff\xff" +
-	"\xff\xcbKqx\xff\xff\xff\xffҠސ\xff\xff\xff\xff\xd3k׀\xff\xff\xff\xffԓX\xb8\xff\xff\xff\xff\xd5B\xb08\xff\xff\xff\xff\xd6s:\xb8\xff\xff\xff\xff\xd7>A\xb8\xff\xff\xff\xff\xd8.2" +
-	"\xb8\xff\xff\xff\xff\xd8\xf99\xb8\xff\xff\xff\xff\xda\x0e\x14\xb8\xff\xff\xff\xff\xda\xd9\x1b\xb8\xff\xff\xff\xff\xdb\xed\xf6\xb8\xff\xff\xff\xffܸ\xfd\xb8\xff\xff\xff\xff\xdd\xcdظ\xff\xff\xff\xffޢ\x1a8\xff\xff\xff" +
-	"\xff߶\xf58\xff\xff\xff\xff\xe0\x81\xfc8\xff\xff\xff\xff\xe1\x96\xc9(\xff\xff\xff\xff\xe2Oi8\xff\xff\xff\xff\xe3v\xab(\xff\xff\xff\xff\xe4/K8\xff\xff\xff\xff\xe5_Ǩ\xff\xff\xff\xff\xe6\x0f-" +
-	"8\xff\xff\xff\xff\xe7?\xa9\xa8\xff\xff\xff\xff\xe7\xf8I\xb8\xff\xff\xff\xff\xe9\x1f\x8b\xa8\xff\xff\xff\xff\xe9\xd8+\xb8\xff\xff\xff\xff\xea\xffm\xa8\xff\xff\xff\xff\xeb\xb8\r\xb8\xff\xff\xff\xff\xec\xdfO\xa8\xff\xff\xff" +
-	"\xff\xed\x97\xef\xb8\xff\xff\xff\xff\xee\xc8l(\xff\xff\xff\xff\xefwѸ\xff\xff\xff\xff\xf0\xa8N(\xff\xff\xff\xff\xf1W\xb3\xb8\xff\xff\xff\xff\xf2\x880(\xff\xff\xff\xff\xf3@\xd08\xff\xff\xff\xff\xf4h\x12" +
-	"(\xff\xff\xff\xff\xf5 \xb28\xff\xff\xff\xff\xf6G\xf4(\xff\xff\xff\xff\xf7%~8\xff\xff\xff\xff\xf8\x15a(\xff\xff\xff\xff\xf9\x05`8\xff\xff\xff\xff\xf9\xf5C(\xff\xff\xff\xff\xfa\xe5B8\xff\xff\xff" +
-	"\xff\xfb\xde_\xa8\xff\xff\xff\xff\xfc\xce^\xb8\xff\xff\xff\xff\xfd\xbeA\xa8\xff\xff\xff\xff\xfe\xae@\xb8\xff\xff\xff\xff\xff\x9e#\xa8\x00\x00\x00\x00\x00\x8e\"\xb8\x00\x00\x00\x00\x01~\x05\xa8\x00\x00\x00\x00\x02n\x04" +
-	"\xb8\x00\x00\x00\x00\x03]\xe7\xa8\x00\x00\x00\x00\x04M\xe6\xb8\x00\x00\x00\x00\x05G\x04(\x00\x00\x00\x00\x067\x038\x00\x00\x00\x00\a&\xe6(\x00\x00\x00\x00\a\x83=8\x00\x00\x00\x00\t\x06\xc8(\x00\x00\x00" +
-	"\x00\t\xf6\xc78\x00\x00\x00\x00\n\xe6\xaa(\x00\x00\x00\x00\v֩8\x00\x00\x00\x00\fƌ(\x00\x00\x00\x00\x11\x9b98\x00\x00\x00\x00\x12ol\xa8\x01\x02\x03\x04\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x00\x00k\n\x00\x00" +
-	"\x00\x00p\x80\x00\x04\x00\x00~\x90\x01\b\x00\x00w\x88\x01\r\x00\x00~\x90\x00\x12LMT\x00HKT\x00HKST\x00HKWT\x00JST\x00\nHKT-8\nPK\x03\x04\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\a\x00\x00\x00IcelandTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" +
-	"\x02\x00\x00\x00\b\xff\xff\xff\xff\x92\xe6\x92H\x01\xff\xff\xfc8\x00\x00\x00\x00\x00\x00\x00\x04LMT\x00GMT\x00\nGMT0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\x8d\x98ƿ\x00" +
-	"\x00\x00\xbf\x00\x00\x00\x13\x00\x00\x00Indian/AntananarivoTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x04" +
-	"\x00\x00\x00\x14\xff\xff\xff\xff\x8b\xff\xd1\xfc\xff\xff\xff\xff\xb1\xee\xdaX\xff\xff\xff\xff\xb4\xc7\xe0\xd0\xff\xff\xff\xff\xc1\xed\xadX\xff\xff\xff\xff\xcclz\xd4\x01\x02\x01\x03\x02\x00\x00\"\x84\x00\x00\x00\x00#(\x00" +
-	"\x04\x00\x00*0\x00\n\x00\x00&\xac\x00\x0eLMT\x00+0230\x00EAT\x00+0245\x00\nEAT-3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00x\xb0W\x14\x98\x00" +
-	"\x00\x00\x98\x00\x00\x00\r\x00\x00\x00Indian/ChagosTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\f\xff\xff" +
-	"\xff\xff\x89~\xf7\x9c\x00\x00\x00\x000\xe6ݰ\x01\x02\x00\x00C\xe4\x00\x00\x00\x00FP\x00\x04\x00\x00T`\x00\bLMT\x00+05\x00+06\x00\n<+06>-6\nPK\x03\x04\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\xf6C\x84\x98\x00\x00\x00\x98\x00\x00\x00\x10\x00\x00\x00Indian/ChristmasTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\f\xff\xff\xff\xffV\xb6\x85\xc4\xff\xff\xff\xff\xa2jg\xc4\x01\x02\x00\x00^<\x00\x00\x00\x00^<\x00\x04\x00\x00bp\x00\bLMT\x00BMT\x00" +
-	"+07\x00\n<+07>-7\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00ʇ{_\xbb\x00\x00\x00\xbb\x00\x00\x00\f\x00\x00\x00Indian/CocosTZif2" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x12\xff\xff\xff\xffV\xb6\x89\xd1\xff\xff\xff\xff\xa1\xf2sQ\xff\xff\xff\xff\xcb\xf2\xfc\x18\xff\xff\xff\xffњ" +
-	"g\xf0\x01\x02\x03\x02\x00\x00Z/\x00\x00\x00\x00Z/\x00\x04\x00\x00[h\x00\b\x00\x00~\x90\x00\x0eLMT\x00RMT\x00+0630\x00+09\x00\n<+0630>-6:3" +
-	"0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\r\x00\x00\x00Indian/ComoroTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x04\x00\x00\x00\x14\xff\xff\xff\xff\x8b\xff\xd1\xfc\xff\xff\xff\xff\xb1\xee\xdaX\xff\xff\xff\xff\xb4\xc7\xe0\xd0\xff\xff\xff\xff\xc1\xed\xadX\xff\xff\xff\xff\xcclz\xd4" +
-	"\x01\x02\x01\x03\x02\x00\x00\"\x84\x00\x00\x00\x00#(\x00\x04\x00\x00*0\x00\n\x00\x00&\xac\x00\x0eLMT\x00+0230\x00EAT\x00+0245\x00\nEAT-3\nPK\x03\x04" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\xb2Z\xac\x98\x00\x00\x00\x98\x00\x00\x00\x10\x00\x00\x00Indian/KerguelenTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\f\xff\xff\xff\xffV\xb6\x9f\x18\xff\xff\xff\xff\xed/Ø\x01\x02\x00\x00D\xe8\x00\x00\x00\x00D\xe8\x00\x04\x00\x00FP\x00\bLMT\x00MMT" +
-	"\x00+05\x00\n<+05>-5\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xed\x8c\xf1\x91\x85\x00\x00\x00\x85\x00\x00\x00\v\x00\x00\x00Indian/MaheTZif2" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\b\xff\xff\xff\xff\xa1\xf2\x99\xa8\x01\x00\x003\xd8\x00\x00\x00\x008@\x00\x04LMT\x00+04\x00\n" +
-	"<+04>-4\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\xb2Z\xac\x98\x00\x00\x00\x98\x00\x00\x00\x0f\x00\x00\x00Indian/MaldivesTZif2\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\f\xff\xff\xff\xffV\xb6\x9f\x18\xff\xff\xff\xff\xed/Ø\x01\x02\x00\x00D\xe8\x00\x00\x00\x00D\xe8\x00\x04\x00\x00" +
-	"FP\x00\bLMT\x00MMT\x00+05\x00\n<+05>-5\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x96\xed=\x98\xb3\x00\x00\x00\xb3\x00\x00\x00\x10\x00\x00\x00India" +
-	"n/MauritiusTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00" +
-	"\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x03\x00\x00\x00\f\xff\xff\xff\xff\x89\x7f\x05\x98\x00\x00\x00\x00\x18\x05" +
-	"\xed@\x00\x00\x00\x00\x18\xdbr0\x00\x00\x00\x00I\x03\x96\xe0\x00\x00\x00\x00IΏ\xd0\x02\x01\x02\x01\x02\x00\x005\xe8\x00\x00\x00\x00FP\x01\x04\x00\x008@\x00\bLMT\x00+05\x00+04" +
-	"\x00\n<+04>-4\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x0e\x00\x00\x00Indian/MayotteTZif2\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x04\x00\x00\x00\x14\xff\xff\xff\xff\x8b\xff\xd1\xfc\xff\xff\xff\xff\xb1\xee\xdaX\xff\xff\xff\xff\xb4\xc7\xe0\xd0\xff\xff\xff\xff\xc1\xed\xad" +
-	"X\xff\xff\xff\xff\xcclz\xd4\x01\x02\x01\x03\x02\x00\x00\"\x84\x00\x00\x00\x00#(\x00\x04\x00\x00*0\x00\n\x00\x00&\xac\x00\x0eLMT\x00+0230\x00EAT\x00+0245\x00\nE" +
-	"AT-3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xed\x8c\xf1\x91\x85\x00\x00\x00\x85\x00\x00\x00\x0e\x00\x00\x00Indian/ReunionTZif2\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\b\xff\xff\xff\xff\xa1\xf2\x99\xa8\x01\x00\x003\xd8\x00\x00\x00\x008@\x00\x04LMT\x00+04\x00\n<+04>-" +
-	"4\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8c\xdb?\xec,\x03\x00\x00,\x03\x00\x00\x04\x00\x00\x00IranTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00G\x00\x00\x00\x06\x00\x00\x00\x1c\xff\xff\xff\xff\x9al}\xc8\xff\xff\xff\xff\xbf\x00\xccH\x00\x00\x00\x00\r\x94D8\x00\x00\x00\x00\x0e\xad\x13\xb8\x00\x00\x00\x00\x0fys@\x00\x00\x00\x00\x10(\xca\xc0\x00" +
-	"\x00\x00\x00\x10\xed:@\x00\x00\x00\x00\x11\xad\xbcH\x00\x00\x00\x00\x12EJ\xb8\x00\x00\x00\x00\x137\xec\xc8\x00\x00\x00\x00\x14-\x15\xb8\x00\x00\x00\x00( v\xc8\x00\x00\x00\x00(\u06dd\xb8\x00\x00\x00\x00)" +
-	"˜\xc8\x00\x00\x00\x00*\xbe\"\xb8\x00\x00\x00\x00+\xac\xd0H\x00\x00\x00\x00,\x9fV8\x00\x00\x00\x00-\x8e\x03\xc8\x00\x00\x00\x00.\x80\x89\xb8\x00\x00\x00\x00/o7H\x00\x00\x00\x000a\xbd8\x00" +
-	"\x00\x00\x001Pj\xc8\x00\x00\x00\x002B\xf0\xb8\x00\x00\x00\x0032\xef\xc8\x00\x00\x00\x004%u\xb8\x00\x00\x00\x005\x14#H\x00\x00\x00\x006\x06\xa98\x00\x00\x00\x006\xf5V\xc8\x00\x00\x00\x007" +
-	"\xe7ܸ\x00\x00\x00\x008֊H\x00\x00\x00\x009\xc9\x108\x00\x00\x00\x00:\xb9\x0fH\x00\x00\x00\x00;\xab\x958\x00\x00\x00\x00<\x9aB\xc8\x00\x00\x00\x00=\x8cȸ\x00\x00\x00\x00>{vH\x00" +
-	"\x00\x00\x00?m\xfc8\x00\x00\x00\x00@\\\xa9\xc8\x00\x00\x00\x00AO/\xb8\x00\x00\x00\x00B?.\xc8\x00\x00\x00\x00C1\xb4\xb8\x00\x00\x00\x00G\xe2\xc9H\x00\x00\x00\x00H\xd5O8\x00\x00\x00\x00I" +
-	"\xc5NH\x00\x00\x00\x00J\xb7\xd48\x00\x00\x00\x00K\xa6\x81\xc8\x00\x00\x00\x00L\x99\a\xb8\x00\x00\x00\x00M\x87\xb5H\x00\x00\x00\x00Nz;8\x00\x00\x00\x00Oh\xe8\xc8\x00\x00\x00\x00P[n\xb8\x00" +
-	"\x00\x00\x00QKm\xc8\x00\x00\x00\x00R=\xf3\xb8\x00\x00\x00\x00S,\xa1H\x00\x00\x00\x00T\x1f'8\x00\x00\x00\x00U\r\xd4\xc8\x00\x00\x00\x00V\x00Z\xb8\x00\x00\x00\x00V\xef\bH\x00\x00\x00\x00W" +
-	"\xe1\x8e8\x00\x00\x00\x00XэH\x00\x00\x00\x00Y\xc4\x138\x00\x00\x00\x00Z\xb2\xc0\xc8\x00\x00\x00\x00[\xa5F\xb8\x00\x00\x00\x00\\\x93\xf4H\x00\x00\x00\x00]\x86z8\x00\x00\x00\x00^u'\xc8\x00" +
-	"\x00\x00\x00_g\xad\xb8\x00\x00\x00\x00`W\xac\xc8\x00\x00\x00\x00aJ2\xb8\x00\x00\x00\x00b8\xe0H\x00\x00\x00\x00c+f8\x01\x03\x02\x05\x04\x05\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03" +
-	"\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x00\x0008\x00\x00\x00\x0008" +
-	"\x00\x04\x00\x00?H\x01\b\x00\x0018\x00\x0e\x00\x00FP\x01\x14\x00\x008@\x00\x18LMT\x00TMT\x00+0430\x00+0330\x00+05\x00+04\x00\n<+033" +
-	"0>-3:30\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17✳2\x04\x00\x002\x04\x00\x00\x06\x00\x00\x00IsraelTZif3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00d\x00\x00\x00\x05\x00\x00\x00\x15\xff\xff\xff\xffV\xb6\xc2\xfa\xff\xff\xff\xff\x9e0E\x88\xff\xff\xff\xff\xc8Y\xcf\x00\xff\xff\xff\xff\xc8\xfa\xa6\x00\xff\xff\xff\xff\xc98\x9c\x80\xff" +
-	"\xff\xff\xff\xcc\xe5\xeb\x80\xff\xff\xff\xffͬ\xfe\x00\xff\xff\xff\xff\xce\xc7\x1f\x00\xff\xff\xff\xffϏ\x83\x00\xff\xff\xff\xffЩ\xa4\x00\xff\xff\xff\xffф}\x00\xff\xff\xff\xffҊ׀\xff\xff\xff\xff\xd3" +
-	"e\xb0\x80\xff\xff\xff\xff\xd4l\v\x00\xff\xff\xff\xff\xd7Z0\x80\xff\xff\xff\xff\xd7\xdfX\x00\xff\xff\xff\xff\xd8/À\xff\xff\xff\xff\xd9\x1ec\x00\xff\xff\xff\xff\xda\x10\xf7\x00\xff\xff\xff\xff\xda\xeb\xd0\x00\xff" +
-	"\xff\xff\xff۴4\x00\xff\xff\xff\xffܹ=\x00\xff\xff\xff\xff\xdd\xe0\x8d\x00\xff\xff\xff\xff\u07b4\u0380\xff\xff\xff\xffߤ\xbf\x80\xff\xff\xff\xff\xe0\x8bv\x00\xff\xff\xff\xff\xe1V}\x00\xff\xff\xff\xff\xe2" +
-	"\xbef\x80\xff\xff\xff\xff\xe36_\x00\xff\xff\xff\xff\xe4\x9eH\x80\xff\xff\xff\xff\xe5\x16A\x00\xff\xff\xff\xff\xe6t\xf0\x00\xff\xff\xff\xff\xe7\x11Ҁ\xff\xff\xff\xff\xe8&\xad\x80\xff\xff\xff\xff\xe8\xe8z\x00\x00" +
-	"\x00\x00\x00\b|\x8b\xe0\x00\x00\x00\x00\b\xfd\xb0\xd0\x00\x00\x00\x00\t\xf6\xea`\x00\x00\x00\x00\n\xa63\xd0\x00\x00\x00\x00\x13\xe9\xfc`\x00\x00\x00\x00\x14![`\x00\x00\x00\x00\x1a\xfa\xc6`\x00\x00\x00\x00\x1b" +
-	"\x8en`\x00\x00\x00\x00\x1c\xbe\xf8\xe0\x00\x00\x00\x00\x1dw|\xd0\x00\x00\x00\x00\x1e\xcc\xff`\x00\x00\x00\x00\x1f`\x99P\x00\x00\x00\x00 \x82\xb1`\x00\x00\x00\x00!I\xb5\xd0\x00\x00\x00\x00\"^\x9e\xe0\x00" +
-	"\x00\x00\x00# ]P\x00\x00\x00\x00$Z0`\x00\x00\x00\x00%\x00?P\x00\x00\x00\x00&\v\xed\xe0\x00\x00\x00\x00&\xd6\xe6\xd0\x00\x00\x00\x00'\xeb\xcf\xe0\x00\x00\x00\x00(\xc0\x03P\x00\x00\x00\x00)" +
-	"\xd4\xec`\x00\x00\x00\x00*\xa9\x1f\xd0\x00\x00\x00\x00+\xbbe\xe0\x00\x00\x00\x00,\x89\x01\xd0\x00\x00\x00\x00-\x9bG\xe0\x00\x00\x00\x00._\xa9P\x00\x00\x00\x00/{)\xe0\x00\x00\x00\x000H\xc5\xd0\x00" +
-	"\x00\x00\x001H\x96\xe0\x00\x00\x00\x002<nP\x00\x00\x00\x0031\xb3`\x00\x00\x00\x004\x1a\xfe\xd0\x00\x00\x00\x005\x11\x95`\x00\x00\x00\x005\xf1\xa6P\x00\x00\x00\x007\x04\b\x80\x00\x00\x00\x007" +
-	"\xcf\x01p\x00\x00\x00\x008\xf6_\x80\x00\x00\x00\x009\xdc\xf9\xe0\x00\x00\x00\x00:\xd0\xedp\x00\x00\x00\x00;\xae[`\x00\x00\x00\x00<\xa3\xa0p\x00\x00\x00\x00=\xa0\xb2`\x00\x00\x00\x00>\x83\x82p\x00" +
-	"\x00\x00\x00?|\x9f\xe0\x00\x00\x00\x00@s6p\x00\x00\x00\x00AP\xa4`\x00\x00\x00\x00BL\x8f\x00\x00\x00\x00\x00CHOp\x00\x00\x00\x00D,q\x00\x00\x00\x00\x00E\x1e\xf6\xf0\x00\x00\x00\x00F" +
-	"\fS\x00\x00\x00\x00\x00F\xecc\xf0\x00\x00\x00\x00G\xec5\x00\x00\x00\x00\x00H\xe7\xf5p\x00\x00\x00\x00I\xcc\x17\x00\x00\x00\x00\x00J\xbe\x9c\xf0\x00\x00\x00\x00K\xab\xf9\x00\x00\x00\x00\x00L\x8c\t\xf0\x00" +
-	"\x00\x00\x00M\x95\x15\x80\x00\x00\x00\x00N\x87\x9bp\x00\x00\x00\x00Ot\xf7\x80\x00\x00\x00\x00P^B\xf0\x00\x00\x00\x00QTـ\x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x04\x02\x03\x02\x03\x02\x03" +
-	"\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03" +
-	"\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x00\x00!\x06\x00\x00\x00\x00 \xf8\x00\x04\x00\x00*0\x01\b\x00\x00\x1c \x00\f\x00\x008@\x01\x10LMT\x00JMT\x00IDT" +
-	"\x00IST\x00IDDT\x00\nIST-2IDT,M3.4.4/26,M10.5.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00%J\xd5\xebS\x01\x00\x00" +
-	"S\x01\x00\x00\a\x00\x00\x00JamaicaTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00" +
-	"\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x16\x00\x00\x00\x04\x00\x00\x00\x10\xff\xff\xff\xffi\x87#~\xff\xff" +
-	"\xff\xff\x93\x0f\xb4\xfe\x00\x00\x00\x00\a\x8d\x19p\x00\x00\x00\x00\t\x10\xa4`\x00\x00\x00\x00\t\xad\x94\xf0\x00\x00\x00\x00\n\xf0\x86`\x00\x00\x00\x00\v\xe0\x85p\x00\x00\x00\x00\f٢\xe0\x00\x00\x00\x00\r\xc0" +
-	"gp\x00\x00\x00\x00\x0e\xb9\x84\xe0\x00\x00\x00\x00\x0f\xa9\x83\xf0\x00\x00\x00\x00\x10\x99f\xe0\x00\x00\x00\x00\x11\x89e\xf0\x00\x00\x00\x00\x12yH\xe0\x00\x00\x00\x00\x13iG\xf0\x00\x00\x00\x00\x14Y*\xe0\x00\x00" +
-	"\x00\x00\x15I)\xf0\x00\x00\x00\x00\x169\f\xe0\x00\x00\x00\x00\x17)\v\xf0\x00\x00\x00\x00\x18\")`\x00\x00\x00\x00\x19\b\xed\xf0\x00\x00\x00\x00\x1a\x02\v`\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02" +
-	"\x03\x02\x03\x02\x03\x02\x03\x02\xff\xff\xb8\x02\x00\x00\xff\xff\xb8\x02\x00\x04\xff\xff\xb9\xb0\x00\b\xff\xff\xc7\xc0\x01\fLMT\x00KMT\x00EST\x00EDT\x00\nEST5\nPK\x03\x04\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x02\xf4\xaeg\xd5\x00\x00\x00\xd5\x00\x00\x00\x05\x00\x00\x00JapanTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\t\x00\x00\x00\x03" +
-	"\x00\x00\x00\f\xff\xff\xff\xffe¤p\xff\xff\xff\xff\xd7>\x02p\xff\xff\xff\xff\xd7\xedY\xf0\xff\xff\xff\xff\xd8\xf8\xfap\xff\xff\xff\xff\xd9\xcd;\xf0\xff\xff\xff\xff\xdb\a\x00\xf0\xff\xff\xff\xffۭ\x1d\xf0" +
-	"\xff\xff\xff\xff\xdc\xe6\xe2\xf0\xff\xff\xff\xff\u074c\xff\xf0\x02\x01\x02\x01\x02\x01\x02\x01\x02\x00\x00\x83\x03\x00\x00\x00\x00\x8c\xa0\x01\x04\x00\x00~\x90\x00\bLMT\x00JDT\x00JST\x00\nJST-" +
-	"9\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf6\xe8]*\xdb\x00\x00\x00\xdb\x00\x00\x00\t\x00\x00\x00KwajaleinTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x18\xff\xff\xff\xff~6\x18 \xff\xff\xff\xff\xc1\xed5\xd0\xff\xff\xff\xff\xc9\xea\n`\xff\xff\xff\xff\xcfF\x81\xf0\xff\xff\xff\xff\xff\x86\x1bP\x00\x00\x00\x00" +
-	",v\x0e@\x01\x02\x03\x01\x04\x05\x00\x00\x9c\xe0\x00\x00\x00\x00\x9a\xb0\x00\x04\x00\x00\x8c\xa0\x00\b\x00\x00~\x90\x00\f\xff\xffW@\x00\x10\x00\x00\xa8\xc0\x00\x14LMT\x00+11\x00+10\x00+0" +
-	"9\x00-12\x00+12\x00\n<+12>-12\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00_\x7f2[\xaf\x01\x00\x00\xaf\x01\x00\x00\x05\x00\x00\x00LibyaTZif2" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\x00\x00\x04\x00\x00\x00\x11\xff\xff\xff\xff\xa1\xf2\xc1$\xff\xff\xff\xffݻ\xb1\x10\xff\xff\xff\xff\xde#\xad`\xff\xff\xff\xff\xe1x" +
-	"\xd2\x10\xff\xff\xff\xff\xe1\xe7e\xe0\xff\xff\xff\xff\xe5/?p\xff\xff\xff\xff\xe5\xa9\xcc\xe0\xff\xff\xff\xff\xebN\xc6\xf0\x00\x00\x00\x00\x16\x92B`\x00\x00\x00\x00\x17\b\xf7p\x00\x00\x00\x00\x17\xfa+\xe0\x00\x00" +
-	"\x00\x00\x18\xea*\xf0\x00\x00\x00\x00\x19\xdb_`\x00\x00\x00\x00\x1a̯\xf0\x00\x00\x00\x00\x1b\xbd\xe4`\x00\x00\x00\x00\x1c\xb4z\xf0\x00\x00\x00\x00\x1d\x9f\x17\xe0\x00\x00\x00\x00\x1e\x93\vp\x00\x00\x00\x00\x1f\x82" +
-	"\xee`\x00\x00\x00\x00 pJp\x00\x00\x00\x00!a~\xe0\x00\x00\x00\x00\"R\xcfp\x00\x00\x00\x00#D\x03\xe0\x00\x00\x00\x00$4\x02\xf0\x00\x00\x00\x00%%7`\x00\x00\x00\x00&@\xb7\xf0\x00\x00" +
-	"\x00\x002N\xf1`\x00\x00\x00\x003D6p\x00\x00\x00\x0045j\xe0\x00\x00\x00\x00P\x9d\x99\x00\x00\x00\x00\x00QTـ\x00\x00\x00\x00Ri\xb4\x80\x02\x01\x02\x01\x02\x01\x02\x03\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x03\x02\x01\x03\x02\x01\x03\x00\x00\f\\\x00\x00\x00\x00\x1c \x01\x04\x00\x00\x0e\x10\x00\t\x00\x00\x1c \x00\rLMT\x00CEST\x00CET\x00EET\x00\n" +
-	"EET-2\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x9d\x1b\xc9m\x02\x00\x00m\x02\x00\x00\x03\x00\x00\x00METTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x005\x00\x00\x00\x02\x00\x00\x00\t\xff\xff\xff\xff\x9b\f\x17`\xff\xff\xff\xff\x9b\xd5\xda\xf0\xff\xff\xff\xff\x9cٮ\x90\xff\xff\xff\xff\x9d\xa4\xb5\x90\xff\xff\xff\xff\x9e\xb9\x90\x90\xff\xff\xff\xff\x9f\x84" +
-	"\x97\x90\xff\xff\xff\xff\xc8\tq\x90\xff\xff\xff\xff\xcc\xe7K\x10\xff\xff\xff\xffͩ\x17\x90\xff\xff\xff\xff\u03a2C\x10\xff\xff\xff\xffϒ4\x10\xff\xff\xff\xffЂ%\x10\xff\xff\xff\xff\xd1r\x16\x10\xff\xff" +
-	"\xff\xff\xd2N@\x90\x00\x00\x00\x00\r\xa4c\x90\x00\x00\x00\x00\x0e\x8b\x1a\x10\x00\x00\x00\x00\x0f\x84E\x90\x00\x00\x00\x00\x10t6\x90\x00\x00\x00\x00\x11d'\x90\x00\x00\x00\x00\x12T\x18\x90\x00\x00\x00\x00\x13M" +
-	"D\x10\x00\x00\x00\x00\x143\xfa\x90\x00\x00\x00\x00\x15#\xeb\x90\x00\x00\x00\x00\x16\x13ܐ\x00\x00\x00\x00\x17\x03͐\x00\x00\x00\x00\x17\xf3\xbe\x90\x00\x00\x00\x00\x18㯐\x00\x00\x00\x00\x19Ӡ\x90\x00\x00" +
-	"\x00\x00\x1aÑ\x90\x00\x00\x00\x00\x1b\xbc\xbd\x10\x00\x00\x00\x00\x1c\xac\xae\x10\x00\x00\x00\x00\x1d\x9c\x9f\x10\x00\x00\x00\x00\x1e\x8c\x90\x10\x00\x00\x00\x00\x1f|\x81\x10\x00\x00\x00\x00 lr\x10\x00\x00\x00\x00!\\" +
-	"c\x10\x00\x00\x00\x00\"LT\x10\x00\x00\x00\x00#<E\x10\x00\x00\x00\x00$,6\x10\x00\x00\x00\x00%\x1c'\x10\x00\x00\x00\x00&\f\x18\x10\x00\x00\x00\x00'\x05C\x90\x00\x00\x00\x00'\xf54\x90\x00\x00" +
-	"\x00\x00(\xe5%\x90\x00\x00\x00\x00)\xd5\x16\x90\x00\x00\x00\x00*\xc5\a\x90\x00\x00\x00\x00+\xb4\xf8\x90\x00\x00\x00\x00,\xa4\xe9\x90\x00\x00\x00\x00-\x94ڐ\x00\x00\x00\x00.\x84ː\x00\x00\x00\x00/t" +
-	"\xbc\x90\x00\x00\x00\x000d\xad\x90\x00\x00\x00\x001]\xd9\x10\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00" +
-	"\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x00\x0e\x10\x00\x05\x00\x00\x1c \x01\x00MEST\x00MET\x00\nMET-1MEST,M3.5.0,M10.5.0/3\n" +
-	"PK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf5\x8d\x99\x92o\x00\x00\x00o\x00\x00\x00\x03\x00\x00\x00MSTTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x01\x00\x00\x00\x04\xff\xff\x9d\x90\x00\x00MST\x00\nMST7\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6h\xcac\xb7\x03\x00\x00\xb7\x03\x00\x00\a\x00\x00\x00MST7MD" +
-	"TTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00X\x00\x00\x00\x04\x00\x00\x00\x10\xff\xff\xff\xff\x9e\xa6:\x90\xff\xff\xff\xff\x9f\xbb\a\x80\xff\xff\xff\xff\xa0\x86\x1c\x90" +
-	"\xff\xff\xff\xff\xa1\x9a\xe9\x80\xff\xff\xff\xffˉ\f\x90\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2a\x18\x00\xff\xff\xff\xff\xfa\xf8u\x10\xff\xff\xff\xff\xfb\xe8X\x00\xff\xff\xff\xff\xfc\xd8W\x10\xff\xff\xff\xff" +
-	"\xfd\xc8:\x00\xff\xff\xff\xff\xfe\xb89\x10\xff\xff\xff\xff\xff\xa8\x1c\x00\x00\x00\x00\x00\x00\x98\x1b\x10\x00\x00\x00\x00\x01\x87\xfe\x00\x00\x00\x00\x00\x02w\xfd\x10\x00\x00\x00\x00\x03q\x1a\x80\x00\x00\x00\x00\x04a\x19\x90" +
-	"\x00\x00\x00\x00\x05P\xfc\x80\x00\x00\x00\x00\x06@\xfb\x90\x00\x00\x00\x00\a0ހ\x00\x00\x00\x00\a\x8d5\x90\x00\x00\x00\x00\t\x10\xc0\x80\x00\x00\x00\x00\t\xad\xb1\x10\x00\x00\x00\x00\n\xf0\xa2\x80\x00\x00\x00\x00" +
-	"\vࡐ\x00\x00\x00\x00\fٿ\x00\x00\x00\x00\x00\r\xc0\x83\x90\x00\x00\x00\x00\x0e\xb9\xa1\x00\x00\x00\x00\x00\x0f\xa9\xa0\x10\x00\x00\x00\x00\x10\x99\x83\x00\x00\x00\x00\x00\x11\x89\x82\x10\x00\x00\x00\x00\x12ye\x00" +
-	"\x00\x00\x00\x00\x13id\x10\x00\x00\x00\x00\x14YG\x00\x00\x00\x00\x00\x15IF\x10\x00\x00\x00\x00\x169)\x00\x00\x00\x00\x00\x17)(\x10\x00\x00\x00\x00\x18\"E\x80\x00\x00\x00\x00\x19\t\n\x10\x00\x00\x00\x00" +
-	"\x1a\x02'\x80\x00\x00\x00\x00\x1a\xf2&\x90\x00\x00\x00\x00\x1b\xe2\t\x80\x00\x00\x00\x00\x1c\xd2\b\x90\x00\x00\x00\x00\x1d\xc1\xeb\x80\x00\x00\x00\x00\x1e\xb1\xea\x90\x00\x00\x00\x00\x1f\xa1̀\x00\x00\x00\x00 v\x1d\x10" +
-	"\x00\x00\x00\x00!\x81\xaf\x80\x00\x00\x00\x00\"U\xff\x10\x00\x00\x00\x00#j\xcc\x00\x00\x00\x00\x00$5\xe1\x10\x00\x00\x00\x00%J\xae\x00\x00\x00\x00\x00&\x15\xc3\x10\x00\x00\x00\x00'*\x90\x00\x00\x00\x00\x00" +
-	"'\xfeߐ\x00\x00\x00\x00)\nr\x00\x00\x00\x00\x00)\xde\xc1\x90\x00\x00\x00\x00*\xeaT\x00\x00\x00\x00\x00+\xbe\xa3\x90\x00\x00\x00\x00,\xd3p\x80\x00\x00\x00\x00-\x9e\x85\x90\x00\x00\x00\x00.\xb3R\x80" +
-	"\x00\x00\x00\x00/~g\x90\x00\x00\x00\x000\x934\x80\x00\x00\x00\x001g\x84\x10\x00\x00\x00\x002s\x16\x80\x00\x00\x00\x003Gf\x10\x00\x00\x00\x004R\xf8\x80\x00\x00\x00\x005'H\x10\x00\x00\x00\x00" +
-	"62ڀ\x00\x00\x00\x007\a*\x10\x00\x00\x00\x008\x1b\xf7\x00\x00\x00\x00\x008\xe7\f\x10\x00\x00\x00\x009\xfb\xd9\x00\x00\x00\x00\x00:\xc6\xee\x10\x00\x00\x00\x00;ۻ\x00\x00\x00\x00\x00<\xb0\n\x90" +
-	"\x00\x00\x00\x00=\xbb\x9d\x00\x00\x00\x00\x00>\x8f\xec\x90\x00\x00\x00\x00?\x9b\x7f\x00\x00\x00\x00\x00@oΐ\x00\x00\x00\x00A\x84\x9b\x80\x00\x00\x00\x00BO\xb0\x90\x00\x00\x00\x00Cd}\x80\x00\x00\x00\x00" +
-	"D/\x92\x90\x00\x00\x00\x00ED_\x80\x00\x00\x00\x00E\xf3\xc5\x10\x01\x00\x01\x00\x02\x03\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01" +
-	"\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\xff\xff\x9d\x90\x00\x04\xff\xff\xab\xa0\x01\x00" +
-	"\xff\xff\xab\xa0\x01\b\xff\xff\xab\xa0\x01\fMDT\x00MST\x00MWT\x00MPT\x00\nMST7MDT,M3.2.0,M11.1.0\nPK\x03\x04\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\xb9B$\x90\x01\x04\x00\x00\x01\x04\x00\x00\x10\x00\x00\x00Mexico/BajaNorteTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00^\x00\x00\x00\x06\x00\x00\x00\x18\xff\xff\xff\xff\xa5\xb6\xe8p\xff\xff\xff\xff\xa9yOp\xff\xff\xff\xff\xaf\xf2|\xf0\xff\xff\xff\xff\xb6fdp\xff\xff\xff\xff\xb7\x1b\x10\x00\xff\xff\xff\xff\xb8\n\xf2" +
-	"\xf0\xff\xff\xff\xff\xcbꍀ\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xffҙ\xbap\xff\xff\xff\xff\xd7\x1bY\x00\xff\xff\xff\xffؑ\xb4\xf0\xff\xff\xff\xff\xe2~K\x90\xff\xff\xff\xff\xe3IR\x90\xff\xff\xff" +
-	"\xff\xe4^-\x90\xff\xff\xff\xff\xe5)4\x90\xff\xff\xff\xff\xe6GJ\x10\xff\xff\xff\xff\xe7\x12Q\x10\xff\xff\xff\xff\xe8',\x10\xff\xff\xff\xff\xe8\xf23\x10\xff\xff\xff\xff\xea\a\x0e\x10\xff\xff\xff\xff\xea\xd2\x15" +
-	"\x10\xff\xff\xff\xff\xeb\xe6\xf0\x10\xff\xff\xff\xff\xec\xb1\xf7\x10\xff\xff\xff\xff\xed\xc6\xd2\x10\xff\xff\xff\xff\xee\x91\xd9\x10\x00\x00\x00\x00\v\u0be0\x00\x00\x00\x00\f\xd9\xcd\x10\x00\x00\x00\x00\r\xc0\x91\xa0\x00\x00\x00" +
-	"\x00\x0e\xb9\xaf\x10\x00\x00\x00\x00\x0f\xa9\xae \x00\x00\x00\x00\x10\x99\x91\x10\x00\x00\x00\x00\x11\x89\x90 \x00\x00\x00\x00\x12ys\x10\x00\x00\x00\x00\x13ir \x00\x00\x00\x00\x14YU\x10\x00\x00\x00\x00\x15IT" +
-	" \x00\x00\x00\x00\x1697\x10\x00\x00\x00\x00\x17)6 \x00\x00\x00\x00\x18\"S\x90\x00\x00\x00\x00\x19\t\x18 \x00\x00\x00\x00\x1a\x025\x90\x00\x00\x00\x00\x1a\xf24\xa0\x00\x00\x00\x00\x1b\xe2\x17\x90\x00\x00\x00" +
-	"\x00\x1c\xd2\x16\xa0\x00\x00\x00\x00\x1d\xc1\xf9\x90\x00\x00\x00\x00\x1e\xb1\xf8\xa0\x00\x00\x00\x00\x1f\xa1ې\x00\x00\x00\x00 v+ \x00\x00\x00\x00!\x81\xbd\x90\x00\x00\x00\x00\"V\r \x00\x00\x00\x00#j\xda" +
-	"\x10\x00\x00\x00\x00$5\xef \x00\x00\x00\x00%J\xbc\x10\x00\x00\x00\x00&\x15\xd1 \x00\x00\x00\x00'*\x9e\x10\x00\x00\x00\x00'\xfe\xed\xa0\x00\x00\x00\x00)\n\x80\x10\x00\x00\x00\x00)\xdeϠ\x00\x00\x00" +
-	"\x00*\xeab\x10\x00\x00\x00\x00+\xbe\xb1\xa0\x00\x00\x00\x00,\xd3~\x90\x00\x00\x00\x00-\x9e\x93\xa0\x00\x00\x00\x00.\xb3`\x90\x00\x00\x00\x00/~u\xa0\x00\x00\x00\x000\x93B\x90\x00\x00\x00\x001g\x92" +
-	" \x00\x00\x00\x002s$\x90\x00\x00\x00\x003Gt \x00\x00\x00\x004S\x06\x90\x00\x00\x00\x005'V \x00\x00\x00\x0062\xe8\x90\x00\x00\x00\x007\a8 \x00\x00\x00\x008\x1c\x05\x10\x00\x00\x00" +
-	"\x008\xe7\x1a \x00\x00\x00\x009\xfb\xe7\x10\x00\x00\x00\x00:\xc6\xfc \x00\x00\x00\x00;\xdb\xc9\x10\x00\x00\x00\x00<\xb0\x18\xa0\x00\x00\x00\x00=\xbb\xab\x10\x00\x00\x00\x00>\x8f\xfa\xa0\x00\x00\x00\x00?\x9b\x8d" +
-	"\x10\x00\x00\x00\x00@oܠ\x00\x00\x00\x00A\x84\xa9\x90\x00\x00\x00\x00BO\xbe\xa0\x00\x00\x00\x00Cd\x8b\x90\x00\x00\x00\x00D/\xa0\xa0\x00\x00\x00\x00EDm\x90\x00\x00\x00\x00F\x0f\x82\xa0\x00\x00\x00" +
-	"\x00G$O\x90\x00\x00\x00\x00G\xf8\x9f \x00\x00\x00\x00I\x041\x90\x00\x00\x00\x00I\u0601 \x00\x00\x00\x00J\xe4\x13\x90\x00\x00\x00\x00K\x9c\xb3\xa0\x01\x02\x01\x02\x03\x02\x04\x05\x02\x03\x02\x03\x02\x03\x02" +
-	"\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02" +
-	"\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\xff\xff\x92L\x00\x00\xff\xff\x9d\x90\x00\x04\xff\xff\x8f\x80\x00\b\xff\xff\x9d\x90\x01\f\xff\xff\x9d\x90\x01\x10\xff\xff\x9d\x90\x01\x14LMT\x00M" +
-	"ST\x00PST\x00PDT\x00PWT\x00PPT\x00\nPST8PDT,M3.2.0,M11.1.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\xad=" +
-	"\x98\xce\x02\x00\x00\xce\x02\x00\x00\x0e\x00\x00\x00Mexico/BajaSurTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?\x00\x00\x00\x05\x00\x00" +
-	"\x00\x14\xff\xff\xff\xff\xa5\xb6\xe8p\xff\xff\xff\xff\xaf\xf2n\xe0\xff\xff\xff\xff\xb6fV`\xff\xff\xff\xff\xb7C\xd2`\xff\xff\xff\xff\xb8\f6`\xff\xff\xff\xff\xb8\xfd\x86\xf0\xff\xff\xff\xff\xcb\xeaq`\xff\xff" +
-	"\xff\xffؑ\xb4\xf0\x00\x00\x00\x00\x00\x00p\x80\x00\x00\x00\x001g\x84\x10\x00\x00\x00\x002s\x16\x80\x00\x00\x00\x003Gf\x10\x00\x00\x00\x004R\xf8\x80\x00\x00\x00\x005'H\x10\x00\x00\x00\x0062" +
-	"ڀ\x00\x00\x00\x007\a*\x10\x00\x00\x00\x008\x1b\xf7\x00\x00\x00\x00\x008\xe7\f\x10\x00\x00\x00\x009\xfb\xd9\x00\x00\x00\x00\x00:\xf5\x12\x90\x00\x00\x00\x00;\xb6\xd1\x00\x00\x00\x00\x00<\xb0\n\x90\x00\x00" +
-	"\x00\x00=\xbb\x9d\x00\x00\x00\x00\x00>\x8f\xec\x90\x00\x00\x00\x00?\x9b\x7f\x00\x00\x00\x00\x00@oΐ\x00\x00\x00\x00A\x84\x9b\x80\x00\x00\x00\x00BO\xb0\x90\x00\x00\x00\x00Cd}\x80\x00\x00\x00\x00D/" +
-	"\x92\x90\x00\x00\x00\x00ED_\x80\x00\x00\x00\x00F\x0ft\x90\x00\x00\x00\x00G$A\x80\x00\x00\x00\x00G\xf8\x91\x10\x00\x00\x00\x00I\x04#\x80\x00\x00\x00\x00I\xd8s\x10\x00\x00\x00\x00J\xe4\x05\x80\x00\x00" +
-	"\x00\x00K\xb8U\x10\x00\x00\x00\x00L\xcd\"\x00\x00\x00\x00\x00M\x987\x10\x00\x00\x00\x00N\xad\x04\x00\x00\x00\x00\x00Ox\x19\x10\x00\x00\x00\x00P\x8c\xe6\x00\x00\x00\x00\x00Qa5\x90\x00\x00\x00\x00Rl" +
-	"\xc8\x00\x00\x00\x00\x00SA\x17\x90\x00\x00\x00\x00TL\xaa\x00\x00\x00\x00\x00U \xf9\x90\x00\x00\x00\x00V,\x8c\x00\x00\x00\x00\x00W\x00ې\x00\x00\x00\x00X\x15\xa8\x80\x00\x00\x00\x00Xཐ\x00\x00" +
-	"\x00\x00Y\xf5\x8a\x80\x00\x00\x00\x00Z\xc0\x9f\x90\x00\x00\x00\x00[\xd5l\x80\x00\x00\x00\x00\\\xa9\xbc\x10\x00\x00\x00\x00]\xb5N\x80\x00\x00\x00\x00^\x89\x9e\x10\x00\x00\x00\x00_\x950\x80\x00\x00\x00\x00`i" +
-	"\x80\x10\x00\x00\x00\x00a~M\x00\x00\x00\x00\x00bIb\x10\x00\x00\x00\x00c^/\x00\x01\x02\x01\x03\x01\x02\x01\x04\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03" +
-	"\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\xff\xff\x9c<\x00\x00\xff\xff\x9d\x90\x00\x04\xff\xff\xab\xa0\x00\b\xff\xff\xab\xa0\x01\f\xff\xff\x8f\x80\x00\x10L" +
-	"MT\x00MST\x00CST\x00MDT\x00PST\x00\nMST7\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd5\b\x89\x8c\x05\x03\x00\x00\x05\x03\x00\x00\x0e\x00\x00\x00Mexic" +
-	"o/GeneralTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00" +
-	"TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00D\x00\x00\x00\x06\x00\x00\x00\x18\xff\xff\xff\xff\xa5\xb6\xe8p\xff\xff\xff\xff\xaf\xf2n\xe0" +
-	"\xff\xff\xff\xff\xb6fV`\xff\xff\xff\xff\xb7C\xd2`\xff\xff\xff\xff\xb8\f6`\xff\xff\xff\xff\xb8\xfd\x86\xf0\xff\xff\xff\xff\xc5ް`\xff\xff\xff\xffƗ4P\xff\xff\xff\xff\xc9U\xf1\xe0\xff\xff\xff\xff" +
-	"\xc9\xea\xddP\xff\xff\xff\xff\xcf\x02\xc6\xe0\xff\xff\xff\xffϷVP\xff\xff\xff\xffڙ\x15\xe0\xff\xff\xff\xff\xdbv\x83\xd0\x00\x00\x00\x001gv\x00\x00\x00\x00\x002s\bp\x00\x00\x00\x003GX\x00" +
-	"\x00\x00\x00\x004R\xeap\x00\x00\x00\x005':\x00\x00\x00\x00\x0062\xccp\x00\x00\x00\x007\a\x1c\x00\x00\x00\x00\x008\x1b\xe8\xf0\x00\x00\x00\x008\xe6\xfe\x00\x00\x00\x00\x009\xfb\xca\xf0\x00\x00\x00\x00" +
-	":\xf5\x04\x80\x00\x00\x00\x00;\xb6\xc2\xf0\x00\x00\x00\x00<\xaf\xfc\x80\x00\x00\x00\x00=\xbb\x8e\xf0\x00\x00\x00\x00>\x8fހ\x00\x00\x00\x00?\x9bp\xf0\x00\x00\x00\x00@o\xc0\x80\x00\x00\x00\x00A\x84\x8dp" +
-	"\x00\x00\x00\x00BO\xa2\x80\x00\x00\x00\x00Cdop\x00\x00\x00\x00D/\x84\x80\x00\x00\x00\x00EDQp\x00\x00\x00\x00F\x0ff\x80\x00\x00\x00\x00G$3p\x00\x00\x00\x00G\xf8\x83\x00\x00\x00\x00\x00" +
-	"I\x04\x15p\x00\x00\x00\x00I\xd8e\x00\x00\x00\x00\x00J\xe3\xf7p\x00\x00\x00\x00K\xb8G\x00\x00\x00\x00\x00L\xcd\x13\xf0\x00\x00\x00\x00M\x98)\x00\x00\x00\x00\x00N\xac\xf5\xf0\x00\x00\x00\x00Ox\v\x00" +
-	"\x00\x00\x00\x00P\x8c\xd7\xf0\x00\x00\x00\x00Qa'\x80\x00\x00\x00\x00Rl\xb9\xf0\x00\x00\x00\x00SA\t\x80\x00\x00\x00\x00TL\x9b\xf0\x00\x00\x00\x00U \xeb\x80\x00\x00\x00\x00V,}\xf0\x00\x00\x00\x00" +
-	"W\x00̀\x00\x00\x00\x00X\x15\x9ap\x00\x00\x00\x00Xீ\x00\x00\x00\x00Y\xf5|p\x00\x00\x00\x00Z\xc0\x91\x80\x00\x00\x00\x00[\xd5^p\x00\x00\x00\x00\\\xa9\xae\x00\x00\x00\x00\x00]\xb5@p" +
-	"\x00\x00\x00\x00^\x89\x90\x00\x00\x00\x00\x00_\x95\"p\x00\x00\x00\x00`ir\x00\x00\x00\x00\x00a~>\xf0\x00\x00\x00\x00bIT\x00\x00\x00\x00\x00c^ \xf0\x01\x02\x01\x03\x01\x02\x04\x02\x04\x02\x05\x02" +
-	"\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\xff\xff\xa3\f" +
-	"\x00\x00\xff\xff\x9d\x90\x00\x04\xff\xff\xab\xa0\x00\b\xff\xff\xab\xa0\x01\f\xff\xff\xb9\xb0\x01\x10\xff\xff\xb9\xb0\x01\x14LMT\x00MST\x00CST\x00MDT\x00CDT\x00CWT\x00\nCST" +
-	"6\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00b\xb2\xaf\xf7\x13\x04\x00\x00\x13\x04\x00\x00\x02\x00\x00\x00NZTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"`\x00\x00\x00\x06\x00\x00\x00\x13\xff\xff\xff\xffA\xb7L\xa8\xff\xff\xff\xff\xb0\xb4\xb2\xe8\xff\xff\xff\xff\xb1Q\x87X\xff\xff\xff\xff\xb2x\xe5h\xff\xff\xff\xff\xb3C\xe5`\xff\xff\xff\xff\xb4X\xc7h\xff\xff\xff" +
-	"\xff\xb5#\xc7`\xff\xff\xff\xff\xb68\xa9h\xff\xff\xff\xff\xb7\x03\xa9`\xff\xff\xff\xff\xb8\x18\x8bh\xff\xff\xff\xff\xb8\xec\xc5\xe0\xff\xff\xff\xff\xb9\xf8mh\xff\xff\xff\xff\xba̧\xe0\xff\xff\xff\xff\xbb\xd8O" +
-	"h\xff\xff\xff\xff\xbc\xe3\xe8\xe0\xff\xff\xff\xff\xbd\xae\xf6\xe8\xff\xff\xff\xff\xbe\xc3\xca\xe0\xff\xff\xff\xff\xbf\x8e\xd8\xe8\xff\xff\xff\xff\xc0\xa3\xac\xe0\xff\xff\xff\xff\xc1n\xba\xe8\xff\xff\xff\xff\u0083\x8e\xe0\xff\xff\xff" +
-	"\xff\xc3N\x9c\xe8\xff\xff\xff\xff\xc4cp\xe0\xff\xff\xff\xff\xc5.~\xe8\xff\xff\xff\xff\xc6L\x8d`\xff\xff\xff\xff\xc7\x0e`\xe8\xff\xff\xff\xff\xc8,o`\xff\xff\xff\xff\xc8\xf7}h\xff\xff\xff\xff\xd2ښ" +
-	"@\x00\x00\x00\x00\t\x18\xfd\xe0\x00\x00\x00\x00\t\xac\xa5\xe0\x00\x00\x00\x00\n\xef\xa5`\x00\x00\x00\x00\v\x9e\xfc\xe0\x00\x00\x00\x00\f\xd8\xc1\xe0\x00\x00\x00\x00\r~\xde\xe0\x00\x00\x00\x00\x0e\xb8\xa3\xe0\x00\x00\x00" +
-	"\x00\x0f^\xc0\xe0\x00\x00\x00\x00\x10\x98\x85\xe0\x00\x00\x00\x00\x11>\xa2\xe0\x00\x00\x00\x00\x12xg\xe0\x00\x00\x00\x00\x13\x1e\x84\xe0\x00\x00\x00\x00\x14XI\xe0\x00\x00\x00\x00\x14\xfef\xe0\x00\x00\x00\x00\x168+" +
-	"\xe0\x00\x00\x00\x00\x16\xe7\x83`\x00\x00\x00\x00\x18!H`\x00\x00\x00\x00\x18\xc7e`\x00\x00\x00\x00\x1a\x01*`\x00\x00\x00\x00\x1a\xa7G`\x00\x00\x00\x00\x1b\xe1\f`\x00\x00\x00\x00\x1c\x87)`\x00\x00\x00" +
-	"\x00\x1d\xc0\xee`\x00\x00\x00\x00\x1eg\v`\x00\x00\x00\x00\x1f\xa0\xd0`\x00\x00\x00\x00 F\xed`\x00\x00\x00\x00!\x80\xb2`\x00\x00\x00\x00\"0\t\xe0\x00\x00\x00\x00#i\xce\xe0\x00\x00\x00\x00$\x0f\xeb" +
-	"\xe0\x00\x00\x00\x00%.\x01`\x00\x00\x00\x00&\x02B\xe0\x00\x00\x00\x00'\r\xe3`\x00\x00\x00\x00'\xe2$\xe0\x00\x00\x00\x00(\xed\xc5`\x00\x00\x00\x00)\xc2\x06\xe0\x00\x00\x00\x00*ͧ`\x00\x00\x00" +
-	"\x00+\xab#`\x00\x00\x00\x00,\xad\x89`\x00\x00\x00\x00-\x8b\x05`\x00\x00\x00\x00.\x8dk`\x00\x00\x00\x00/j\xe7`\x00\x00\x00\x000mM`\x00\x00\x00\x001J\xc9`\x00\x00\x00\x002Vi" +
-	"\xe0\x00\x00\x00\x003*\xab`\x00\x00\x00\x0046K\xe0\x00\x00\x00\x005\n\x8d`\x00\x00\x00\x006\x16-\xe0\x00\x00\x00\x006\xf3\xa9\xe0\x00\x00\x00\x007\xf6\x0f\xe0\x00\x00\x00\x008Ӌ\xe0\x00\x00\x00" +
-	"\x009\xd5\xf1\xe0\x00\x00\x00\x00:\xb3m\xe0\x00\x00\x00\x00;\xbf\x0e`\x00\x00\x00\x00<\x93O\xe0\x00\x00\x00\x00=\x9e\xf0`\x00\x00\x00\x00>s1\xe0\x00\x00\x00\x00?~\xd2`\x00\x00\x00\x00@\\N" +
-	"`\x00\x00\x00\x00A^\xb4`\x00\x00\x00\x00B<0`\x00\x00\x00\x00C>\x96`\x00\x00\x00\x00D\x1c\x12`\x00\x00\x00\x00E\x1ex`\x00\x00\x00\x00E\xfb\xf4`\x00\x00\x00\x00F\xfeZ`\x02\x01\x02" +
-	"\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05" +
-	"\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x00\x00\xa3\xd8\x00\x00\x00\x00\xaf\xc8\x01\x04\x00\x00\xa1\xb8\x00\t\x00\x00\xa8\xc0\x01\x04\x00\x00\xb6" +
-	"\xd0\x01\x0e\x00\x00\xa8\xc0\x00\x04LMT\x00NZST\x00NZMT\x00NZDT\x00\nNZST-12NZDT,M9.5.0,M4.1.0/3\nPK\x03" +
-	"\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x96\xc5FF(\x03\x00\x00(\x03\x00\x00\a\x00\x00\x00NZ-CHATTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"E\x00\x00\x00\x04\x00\x00\x00\x16\xff\xff\xff\xffA\xb7D\x84\xff\xff\xff\xff\xd2ږ\xbc\x00\x00\x00\x00\t\x18\xfd\xe0\x00\x00\x00\x00\t\xac\xa5\xe0\x00\x00\x00\x00\n\xef\xa5`\x00\x00\x00\x00\v\x9e\xfc\xe0\x00\x00\x00" +
-	"\x00\f\xd8\xc1\xe0\x00\x00\x00\x00\r~\xde\xe0\x00\x00\x00\x00\x0e\xb8\xa3\xe0\x00\x00\x00\x00\x0f^\xc0\xe0\x00\x00\x00\x00\x10\x98\x85\xe0\x00\x00\x00\x00\x11>\xa2\xe0\x00\x00\x00\x00\x12xg\xe0\x00\x00\x00\x00\x13\x1e\x84" +
-	"\xe0\x00\x00\x00\x00\x14XI\xe0\x00\x00\x00\x00\x14\xfef\xe0\x00\x00\x00\x00\x168+\xe0\x00\x00\x00\x00\x16\xe7\x83`\x00\x00\x00\x00\x18!H`\x00\x00\x00\x00\x18\xc7e`\x00\x00\x00\x00\x1a\x01*`\x00\x00\x00" +
-	"\x00\x1a\xa7G`\x00\x00\x00\x00\x1b\xe1\f`\x00\x00\x00\x00\x1c\x87)`\x00\x00\x00\x00\x1d\xc0\xee`\x00\x00\x00\x00\x1eg\v`\x00\x00\x00\x00\x1f\xa0\xd0`\x00\x00\x00\x00 F\xed`\x00\x00\x00\x00!\x80\xb2" +
-	"`\x00\x00\x00\x00\"0\t\xe0\x00\x00\x00\x00#i\xce\xe0\x00\x00\x00\x00$\x0f\xeb\xe0\x00\x00\x00\x00%.\x01`\x00\x00\x00\x00&\x02B\xe0\x00\x00\x00\x00'\r\xe3`\x00\x00\x00\x00'\xe2$\xe0\x00\x00\x00" +
-	"\x00(\xed\xc5`\x00\x00\x00\x00)\xc2\x06\xe0\x00\x00\x00\x00*ͧ`\x00\x00\x00\x00+\xab#`\x00\x00\x00\x00,\xad\x89`\x00\x00\x00\x00-\x8b\x05`\x00\x00\x00\x00.\x8dk`\x00\x00\x00\x00/j\xe7" +
-	"`\x00\x00\x00\x000mM`\x00\x00\x00\x001J\xc9`\x00\x00\x00\x002Vi\xe0\x00\x00\x00\x003*\xab`\x00\x00\x00\x0046K\xe0\x00\x00\x00\x005\n\x8d`\x00\x00\x00\x006\x16-\xe0\x00\x00\x00" +
-	"\x006\xf3\xa9\xe0\x00\x00\x00\x007\xf6\x0f\xe0\x00\x00\x00\x008Ӌ\xe0\x00\x00\x00\x009\xd5\xf1\xe0\x00\x00\x00\x00:\xb3m\xe0\x00\x00\x00\x00;\xbf\x0e`\x00\x00\x00\x00<\x93O\xe0\x00\x00\x00\x00=\x9e\xf0" +
-	"`\x00\x00\x00\x00>s1\xe0\x00\x00\x00\x00?~\xd2`\x00\x00\x00\x00@\\N`\x00\x00\x00\x00A^\xb4`\x00\x00\x00\x00B<0`\x00\x00\x00\x00C>\x96`\x00\x00\x00\x00D\x1c\x12`\x00\x00\x00" +
-	"\x00E\x1ex`\x00\x00\x00\x00E\xfb\xf4`\x00\x00\x00\x00F\xfeZ`\x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02" +
-	"\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x00\x00\xab\xfc\x00\x00\x00\x00\xacD\x00\x04\x00\x00\xc1\\\x01\n\x00\x00\xb3L\x00\x10LMT\x00+1" +
-	"215\x00+1345\x00+1245\x00\n<+1245>-12:45<+1345>,M9.5.0/2:45,M4.1.0/3:4" +
-	"5\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00V\x80\x94@\x12\x04\x00\x00\x12\x04\x00\x00\x06\x00\x00\x00NavajoTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00a\x00\x00\x00\x05\x00\x00\x00\x14\xff\xff\xff\xff^\x04\f\xb0\xff\xff\xff\xff\x9e\xa6:\x90\xff\xff\xff\xff\x9f\xbb\a\x80\xff\xff\xff\xff\xa0\x86\x1c\x90\xff\xff\xff\xff\xa1\x9a\xe9\x80\xff\xff\xff\xff\xa2e\xfe" +
-	"\x90\xff\xff\xff\xff\xa3\x84\x06\x00\xff\xff\xff\xff\xa4E\xe0\x90\xff\xff\xff\xff\xa4\x8f\xa6\x80\xff\xff\xff\xffˉ\f\x90\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2a\x18\x00\xff\xff\xff\xff\xf7/v\x90\xff\xff\xff" +
-	"\xff\xf8(\x94\x00\xff\xff\xff\xff\xf9\x0fX\x90\xff\xff\xff\xff\xfa\bv\x00\xff\xff\xff\xff\xfa\xf8u\x10\xff\xff\xff\xff\xfb\xe8X\x00\xff\xff\xff\xff\xfc\xd8W\x10\xff\xff\xff\xff\xfd\xc8:\x00\xff\xff\xff\xff\xfe\xb89" +
-	"\x10\xff\xff\xff\xff\xff\xa8\x1c\x00\x00\x00\x00\x00\x00\x98\x1b\x10\x00\x00\x00\x00\x01\x87\xfe\x00\x00\x00\x00\x00\x02w\xfd\x10\x00\x00\x00\x00\x03q\x1a\x80\x00\x00\x00\x00\x04a\x19\x90\x00\x00\x00\x00\x05P\xfc\x80\x00\x00\x00" +
-	"\x00\x06@\xfb\x90\x00\x00\x00\x00\a0ހ\x00\x00\x00\x00\a\x8d5\x90\x00\x00\x00\x00\t\x10\xc0\x80\x00\x00\x00\x00\t\xad\xb1\x10\x00\x00\x00\x00\n\xf0\xa2\x80\x00\x00\x00\x00\vࡐ\x00\x00\x00\x00\fٿ" +
-	"\x00\x00\x00\x00\x00\r\xc0\x83\x90\x00\x00\x00\x00\x0e\xb9\xa1\x00\x00\x00\x00\x00\x0f\xa9\xa0\x10\x00\x00\x00\x00\x10\x99\x83\x00\x00\x00\x00\x00\x11\x89\x82\x10\x00\x00\x00\x00\x12ye\x00\x00\x00\x00\x00\x13id\x10\x00\x00\x00" +
-	"\x00\x14YG\x00\x00\x00\x00\x00\x15IF\x10\x00\x00\x00\x00\x169)\x00\x00\x00\x00\x00\x17)(\x10\x00\x00\x00\x00\x18\"E\x80\x00\x00\x00\x00\x19\t\n\x10\x00\x00\x00\x00\x1a\x02'\x80\x00\x00\x00\x00\x1a\xf2&" +
-	"\x90\x00\x00\x00\x00\x1b\xe2\t\x80\x00\x00\x00\x00\x1c\xd2\b\x90\x00\x00\x00\x00\x1d\xc1\xeb\x80\x00\x00\x00\x00\x1e\xb1\xea\x90\x00\x00\x00\x00\x1f\xa1̀\x00\x00\x00\x00 v\x1d\x10\x00\x00\x00\x00!\x81\xaf\x80\x00\x00\x00" +
-	"\x00\"U\xff\x10\x00\x00\x00\x00#j\xcc\x00\x00\x00\x00\x00$5\xe1\x10\x00\x00\x00\x00%J\xae\x00\x00\x00\x00\x00&\x15\xc3\x10\x00\x00\x00\x00'*\x90\x00\x00\x00\x00\x00'\xfeߐ\x00\x00\x00\x00)\nr" +
-	"\x00\x00\x00\x00\x00)\xde\xc1\x90\x00\x00\x00\x00*\xeaT\x00\x00\x00\x00\x00+\xbe\xa3\x90\x00\x00\x00\x00,\xd3p\x80\x00\x00\x00\x00-\x9e\x85\x90\x00\x00\x00\x00.\xb3R\x80\x00\x00\x00\x00/~g\x90\x00\x00\x00" +
-	"\x000\x934\x80\x00\x00\x00\x001g\x84\x10\x00\x00\x00\x002s\x16\x80\x00\x00\x00\x003Gf\x10\x00\x00\x00\x004R\xf8\x80\x00\x00\x00\x005'H\x10\x00\x00\x00\x0062ڀ\x00\x00\x00\x007\a*" +
-	"\x10\x00\x00\x00\x008\x1b\xf7\x00\x00\x00\x00\x008\xe7\f\x10\x00\x00\x00\x009\xfb\xd9\x00\x00\x00\x00\x00:\xc6\xee\x10\x00\x00\x00\x00;ۻ\x00\x00\x00\x00\x00<\xb0\n\x90\x00\x00\x00\x00=\xbb\x9d\x00\x00\x00\x00" +
-	"\x00>\x8f\xec\x90\x00\x00\x00\x00?\x9b\x7f\x00\x00\x00\x00\x00@oΐ\x00\x00\x00\x00A\x84\x9b\x80\x00\x00\x00\x00BO\xb0\x90\x00\x00\x00\x00Cd}\x80\x00\x00\x00\x00D/\x92\x90\x00\x00\x00\x00ED_" +
-	"\x80\x00\x00\x00\x00E\xf3\xc5\x10\x02\x01\x02\x01\x02\x01\x02\x01\x02\x03\x04\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\xff\xff\x9d\x94\x00\x00\xff\xff\xab\xa0\x01\x04\xff\xff" +
-	"\x9d\x90\x00\b\xff\xff\xab\xa0\x01\f\xff\xff\xab\xa0\x01\x10LMT\x00MDT\x00MST\x00MWT\x00MPT\x00\nMST7MDT,M3.2.0,M11.1.0\n" +
-	"PK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00*\xe4@\xa9\x89\x01\x00\x00\x89\x01\x00\x00\x03\x00\x00\x00PRCTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1d" +
-	"\x00\x00\x00\x03\x00\x00\x00\f\xff\xff\xff\xff~6C)\xff\xff\xff\xff\xa0\x97\xa2\x80\xff\xff\xff\xff\xa1y\x04\xf0\xff\xff\xff\xff\xc8Y^\x80\xff\xff\xff\xff\xc9\t\xf9p\xff\xff\xff\xff\xc9ӽ\x00\xff\xff\xff\xff" +
-	"\xcb\x05\x8a\xf0\xff\xff\xff\xff\xcb|@\x00\xff\xff\xff\xff\xd2;>\xf0\xff\xff\xff\xffӋ{\x80\xff\xff\xff\xff\xd4B\xad\xf0\xff\xff\xff\xff\xd5E\"\x00\xff\xff\xff\xff\xd6L\xbf\xf0\xff\xff\xff\xff\xd7<\xbf\x00" +
-	"\xff\xff\xff\xff\xd8\x06fp\xff\xff\xff\xff\xd9\x1d\xf2\x80\xff\xff\xff\xff\xd9A|\xf0\x00\x00\x00\x00\x1e\xbaR \x00\x00\x00\x00\x1fi\x9b\x90\x00\x00\x00\x00 ~\x84\xa0\x00\x00\x00\x00!I}\x90\x00\x00\x00\x00" +
-	"\"g\xa1 \x00\x00\x00\x00#)_\x90\x00\x00\x00\x00$G\x83 \x00\x00\x00\x00%\x12|\x10\x00\x00\x00\x00&'e \x00\x00\x00\x00&\xf2^\x10\x00\x00\x00\x00(\aG \x00\x00\x00\x00(\xd2@\x10" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x00\x00q\xd7\x00\x00\x00\x00~\x90\x01\x04\x00\x00p\x80\x00\bLMT\x00CDT\x00CST\x00\n" +
-	"CST-8\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00ŭV\xad\xb7\x03\x00\x00\xb7\x03\x00\x00\a\x00\x00\x00PST8PDTTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00X\x00\x00\x00\x04\x00\x00\x00\x10\xff\xff\xff\xff\x9e\xa6H\xa0\xff\xff\xff\xff\x9f\xbb\x15\x90\xff\xff\xff\xff\xa0\x86*\xa0\xff\xff\xff\xff\xa1\x9a\xf7\x90\xff\xff\xff\xffˉ\x1a\xa0\xff\xff" +
-	"\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2a&\x10\xff\xff\xff\xff\xfa\xf8\x83 \xff\xff\xff\xff\xfb\xe8f\x10\xff\xff\xff\xff\xfc\xd8e \xff\xff\xff\xff\xfd\xc8H\x10\xff\xff\xff\xff\xfe\xb8G \xff\xff\xff\xff\xff\xa8" +
-	"*\x10\x00\x00\x00\x00\x00\x98) \x00\x00\x00\x00\x01\x88\f\x10\x00\x00\x00\x00\x02x\v \x00\x00\x00\x00\x03q(\x90\x00\x00\x00\x00\x04a'\xa0\x00\x00\x00\x00\x05Q\n\x90\x00\x00\x00\x00\x06A\t\xa0\x00\x00" +
-	"\x00\x00\a0\xec\x90\x00\x00\x00\x00\a\x8dC\xa0\x00\x00\x00\x00\t\x10ΐ\x00\x00\x00\x00\t\xad\xbf \x00\x00\x00\x00\n\xf0\xb0\x90\x00\x00\x00\x00\v\u0be0\x00\x00\x00\x00\f\xd9\xcd\x10\x00\x00\x00\x00\r\xc0" +
-	"\x91\xa0\x00\x00\x00\x00\x0e\xb9\xaf\x10\x00\x00\x00\x00\x0f\xa9\xae \x00\x00\x00\x00\x10\x99\x91\x10\x00\x00\x00\x00\x11\x89\x90 \x00\x00\x00\x00\x12ys\x10\x00\x00\x00\x00\x13ir \x00\x00\x00\x00\x14YU\x10\x00\x00" +
-	"\x00\x00\x15IT \x00\x00\x00\x00\x1697\x10\x00\x00\x00\x00\x17)6 \x00\x00\x00\x00\x18\"S\x90\x00\x00\x00\x00\x19\t\x18 \x00\x00\x00\x00\x1a\x025\x90\x00\x00\x00\x00\x1a\xf24\xa0\x00\x00\x00\x00\x1b\xe2" +
-	"\x17\x90\x00\x00\x00\x00\x1c\xd2\x16\xa0\x00\x00\x00\x00\x1d\xc1\xf9\x90\x00\x00\x00\x00\x1e\xb1\xf8\xa0\x00\x00\x00\x00\x1f\xa1ې\x00\x00\x00\x00 v+ \x00\x00\x00\x00!\x81\xbd\x90\x00\x00\x00\x00\"V\r \x00\x00" +
-	"\x00\x00#j\xda\x10\x00\x00\x00\x00$5\xef \x00\x00\x00\x00%J\xbc\x10\x00\x00\x00\x00&\x15\xd1 \x00\x00\x00\x00'*\x9e\x10\x00\x00\x00\x00'\xfe\xed\xa0\x00\x00\x00\x00)\n\x80\x10\x00\x00\x00\x00)\xde" +
-	"Ϡ\x00\x00\x00\x00*\xeab\x10\x00\x00\x00\x00+\xbe\xb1\xa0\x00\x00\x00\x00,\xd3~\x90\x00\x00\x00\x00-\x9e\x93\xa0\x00\x00\x00\x00.\xb3`\x90\x00\x00\x00\x00/~u\xa0\x00\x00\x00\x000\x93B\x90\x00\x00" +
-	"\x00\x001g\x92 \x00\x00\x00\x002s$\x90\x00\x00\x00\x003Gt \x00\x00\x00\x004S\x06\x90\x00\x00\x00\x005'V \x00\x00\x00\x0062\xe8\x90\x00\x00\x00\x007\a8 \x00\x00\x00\x008\x1c" +
-	"\x05\x10\x00\x00\x00\x008\xe7\x1a \x00\x00\x00\x009\xfb\xe7\x10\x00\x00\x00\x00:\xc6\xfc \x00\x00\x00\x00;\xdb\xc9\x10\x00\x00\x00\x00<\xb0\x18\xa0\x00\x00\x00\x00=\xbb\xab\x10\x00\x00\x00\x00>\x8f\xfa\xa0\x00\x00" +
-	"\x00\x00?\x9b\x8d\x10\x00\x00\x00\x00@oܠ\x00\x00\x00\x00A\x84\xa9\x90\x00\x00\x00\x00BO\xbe\xa0\x00\x00\x00\x00Cd\x8b\x90\x00\x00\x00\x00D/\xa0\xa0\x00\x00\x00\x00EDm\x90\x00\x00\x00\x00E\xf3" +
-	"\xd3 \x01\x00\x01\x00\x02\x03\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01" +
-	"\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\xff\xff\x8f\x80\x00\x04\xff\xff\x9d\x90\x01\x00\xff\xff\x9d\x90\x01\b\xff\xff\x9d\x90\x01\fPDT\x00PS" +
-	"T\x00PWT\x00PPT\x00\nPST8PDT,M3.2.0,M11.1.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8A\x15\xfe\x97\x01\x00\x00\x97\x01\x00\x00" +
-	"\f\x00\x00\x00Pacific/ApiaTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01" +
-	"\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x00\x00\a\x00\x00\x00\x1a\xff\xff\xff\xffn=\xc9\x00\xff" +
-	"\xff\xff\xff\x91\x05\xfc\x00\xff\xff\xff\xff\xdab\x048\x00\x00\x00\x00L\x9f'\xb0\x00\x00\x00\x00M\x97+\xe0\x00\x00\x00\x00N}\xe2`\x00\x00\x00\x00N\xfd\x8b\xa0\x00\x00\x00\x00Ow\r\xe0\x00\x00\x00\x00P" +
-	"f\xfe\xe0\x00\x00\x00\x00Q`*`\x00\x00\x00\x00RF\xe0\xe0\x00\x00\x00\x00S@\f`\x00\x00\x00\x00T&\xc2\xe0\x00\x00\x00\x00U\x1f\xee`\x00\x00\x00\x00V\x06\xa4\xe0\x00\x00\x00\x00V\xff\xd0`\x00" +
-	"\x00\x00\x00W\xe6\x86\xe0\x00\x00\x00\x00X߲`\x00\x00\x00\x00Y\xc6h\xe0\x00\x00\x00\x00Z\xbf\x94`\x00\x00\x00\x00[\xaf\x85`\x00\x00\x00\x00\\\xa8\xb0\xe0\x00\x00\x00\x00]\x8fg`\x00\x00\x00\x00^" +
-	"\x88\x92\xe0\x00\x00\x00\x00_oI`\x00\x00\x00\x00`ht\xe0\x01\x02\x04\x03\x04\x03\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x00\x00\xb0\x80\x00\x00\xff\xff_\x00\x00\x00\xff\xff^" +
-	"H\x00\x04\xff\xffs`\x01\n\xff\xffeP\x00\x0e\x00\x00\xb6\xd0\x00\x12\x00\x00\xc4\xe0\x01\x16LMT\x00-1130\x00-10\x00-11\x00+13\x00+14\x00\n<+13>-" +
-	"13\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00b\xb2\xaf\xf7\x13\x04\x00\x00\x13\x04\x00\x00\x10\x00\x00\x00Pacific/AucklandTZif2\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00`\x00\x00\x00\x06\x00\x00\x00\x13\xff\xff\xff\xffA\xb7L\xa8\xff\xff\xff\xff\xb0\xb4\xb2\xe8\xff\xff\xff\xff\xb1Q\x87X\xff\xff\xff\xff\xb2x\xe5h\xff\xff\xff\xff" +
-	"\xb3C\xe5`\xff\xff\xff\xff\xb4X\xc7h\xff\xff\xff\xff\xb5#\xc7`\xff\xff\xff\xff\xb68\xa9h\xff\xff\xff\xff\xb7\x03\xa9`\xff\xff\xff\xff\xb8\x18\x8bh\xff\xff\xff\xff\xb8\xec\xc5\xe0\xff\xff\xff\xff\xb9\xf8mh" +
-	"\xff\xff\xff\xff\xba̧\xe0\xff\xff\xff\xff\xbb\xd8Oh\xff\xff\xff\xff\xbc\xe3\xe8\xe0\xff\xff\xff\xff\xbd\xae\xf6\xe8\xff\xff\xff\xff\xbe\xc3\xca\xe0\xff\xff\xff\xff\xbf\x8e\xd8\xe8\xff\xff\xff\xff\xc0\xa3\xac\xe0\xff\xff\xff\xff" +
-	"\xc1n\xba\xe8\xff\xff\xff\xff\u0083\x8e\xe0\xff\xff\xff\xff\xc3N\x9c\xe8\xff\xff\xff\xff\xc4cp\xe0\xff\xff\xff\xff\xc5.~\xe8\xff\xff\xff\xff\xc6L\x8d`\xff\xff\xff\xff\xc7\x0e`\xe8\xff\xff\xff\xff\xc8,o`" +
-	"\xff\xff\xff\xff\xc8\xf7}h\xff\xff\xff\xff\xd2ښ@\x00\x00\x00\x00\t\x18\xfd\xe0\x00\x00\x00\x00\t\xac\xa5\xe0\x00\x00\x00\x00\n\xef\xa5`\x00\x00\x00\x00\v\x9e\xfc\xe0\x00\x00\x00\x00\f\xd8\xc1\xe0\x00\x00\x00\x00" +
-	"\r~\xde\xe0\x00\x00\x00\x00\x0e\xb8\xa3\xe0\x00\x00\x00\x00\x0f^\xc0\xe0\x00\x00\x00\x00\x10\x98\x85\xe0\x00\x00\x00\x00\x11>\xa2\xe0\x00\x00\x00\x00\x12xg\xe0\x00\x00\x00\x00\x13\x1e\x84\xe0\x00\x00\x00\x00\x14XI\xe0" +
-	"\x00\x00\x00\x00\x14\xfef\xe0\x00\x00\x00\x00\x168+\xe0\x00\x00\x00\x00\x16\xe7\x83`\x00\x00\x00\x00\x18!H`\x00\x00\x00\x00\x18\xc7e`\x00\x00\x00\x00\x1a\x01*`\x00\x00\x00\x00\x1a\xa7G`\x00\x00\x00\x00" +
-	"\x1b\xe1\f`\x00\x00\x00\x00\x1c\x87)`\x00\x00\x00\x00\x1d\xc0\xee`\x00\x00\x00\x00\x1eg\v`\x00\x00\x00\x00\x1f\xa0\xd0`\x00\x00\x00\x00 F\xed`\x00\x00\x00\x00!\x80\xb2`\x00\x00\x00\x00\"0\t\xe0" +
-	"\x00\x00\x00\x00#i\xce\xe0\x00\x00\x00\x00$\x0f\xeb\xe0\x00\x00\x00\x00%.\x01`\x00\x00\x00\x00&\x02B\xe0\x00\x00\x00\x00'\r\xe3`\x00\x00\x00\x00'\xe2$\xe0\x00\x00\x00\x00(\xed\xc5`\x00\x00\x00\x00" +
-	")\xc2\x06\xe0\x00\x00\x00\x00*ͧ`\x00\x00\x00\x00+\xab#`\x00\x00\x00\x00,\xad\x89`\x00\x00\x00\x00-\x8b\x05`\x00\x00\x00\x00.\x8dk`\x00\x00\x00\x00/j\xe7`\x00\x00\x00\x000mM`" +
-	"\x00\x00\x00\x001J\xc9`\x00\x00\x00\x002Vi\xe0\x00\x00\x00\x003*\xab`\x00\x00\x00\x0046K\xe0\x00\x00\x00\x005\n\x8d`\x00\x00\x00\x006\x16-\xe0\x00\x00\x00\x006\xf3\xa9\xe0\x00\x00\x00\x00" +
-	"7\xf6\x0f\xe0\x00\x00\x00\x008Ӌ\xe0\x00\x00\x00\x009\xd5\xf1\xe0\x00\x00\x00\x00:\xb3m\xe0\x00\x00\x00\x00;\xbf\x0e`\x00\x00\x00\x00<\x93O\xe0\x00\x00\x00\x00=\x9e\xf0`\x00\x00\x00\x00>s1\xe0" +
-	"\x00\x00\x00\x00?~\xd2`\x00\x00\x00\x00@\\N`\x00\x00\x00\x00A^\xb4`\x00\x00\x00\x00B<0`\x00\x00\x00\x00C>\x96`\x00\x00\x00\x00D\x1c\x12`\x00\x00\x00\x00E\x1ex`\x00\x00\x00\x00" +
-	"E\xfb\xf4`\x00\x00\x00\x00F\xfeZ`\x02\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04" +
-	"\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x00\x00\xa3\xd8\x00\x00\x00\x00\xaf\xc8\x01\x04" +
-	"\x00\x00\xa1\xb8\x00\t\x00\x00\xa8\xc0\x01\x04\x00\x00\xb6\xd0\x01\x0e\x00\x00\xa8\xc0\x00\x04LMT\x00NZST\x00NZMT\x00NZDT\x00\nNZST-12NZDT,M9.5" +
-	".0,M4.1.0/3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9a\xf2:F\xc9\x00\x00\x00\xc9\x00\x00\x00\x14\x00\x00\x00Pacific/Bougainvil" +
-	"leTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x05\x00\x00\x00\x15\xff\xff\xff\xffV\xb6R(\xff\xff\xff\xffr\xed\xa4\x90\xff\xff\xff\xff\xccC6" +
-	"`\xff\xff\xff\xff\xd2+l\xf0\x00\x00\x00\x00T\x9e׀\x01\x02\x03\x02\x04\x00\x00\x91\xd8\x00\x00\x00\x00\x89\xf0\x00\x04\x00\x00\x8c\xa0\x00\t\x00\x00~\x90\x00\r\x00\x00\x9a\xb0\x00\x11LMT\x00PMMT" +
-	"\x00+10\x00+09\x00+11\x00\n<+11>-11\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x96\xc5FF(\x03\x00\x00(\x03\x00\x00\x0f\x00\x00\x00Pacific" +
-	"/ChathamTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00T" +
-	"Zif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00E\x00\x00\x00\x04\x00\x00\x00\x16\xff\xff\xff\xffA\xb7D\x84\xff\xff\xff\xff\xd2ږ\xbc\x00" +
-	"\x00\x00\x00\t\x18\xfd\xe0\x00\x00\x00\x00\t\xac\xa5\xe0\x00\x00\x00\x00\n\xef\xa5`\x00\x00\x00\x00\v\x9e\xfc\xe0\x00\x00\x00\x00\f\xd8\xc1\xe0\x00\x00\x00\x00\r~\xde\xe0\x00\x00\x00\x00\x0e\xb8\xa3\xe0\x00\x00\x00\x00\x0f" +
-	"^\xc0\xe0\x00\x00\x00\x00\x10\x98\x85\xe0\x00\x00\x00\x00\x11>\xa2\xe0\x00\x00\x00\x00\x12xg\xe0\x00\x00\x00\x00\x13\x1e\x84\xe0\x00\x00\x00\x00\x14XI\xe0\x00\x00\x00\x00\x14\xfef\xe0\x00\x00\x00\x00\x168+\xe0\x00" +
-	"\x00\x00\x00\x16\xe7\x83`\x00\x00\x00\x00\x18!H`\x00\x00\x00\x00\x18\xc7e`\x00\x00\x00\x00\x1a\x01*`\x00\x00\x00\x00\x1a\xa7G`\x00\x00\x00\x00\x1b\xe1\f`\x00\x00\x00\x00\x1c\x87)`\x00\x00\x00\x00\x1d" +
-	"\xc0\xee`\x00\x00\x00\x00\x1eg\v`\x00\x00\x00\x00\x1f\xa0\xd0`\x00\x00\x00\x00 F\xed`\x00\x00\x00\x00!\x80\xb2`\x00\x00\x00\x00\"0\t\xe0\x00\x00\x00\x00#i\xce\xe0\x00\x00\x00\x00$\x0f\xeb\xe0\x00" +
-	"\x00\x00\x00%.\x01`\x00\x00\x00\x00&\x02B\xe0\x00\x00\x00\x00'\r\xe3`\x00\x00\x00\x00'\xe2$\xe0\x00\x00\x00\x00(\xed\xc5`\x00\x00\x00\x00)\xc2\x06\xe0\x00\x00\x00\x00*ͧ`\x00\x00\x00\x00+" +
-	"\xab#`\x00\x00\x00\x00,\xad\x89`\x00\x00\x00\x00-\x8b\x05`\x00\x00\x00\x00.\x8dk`\x00\x00\x00\x00/j\xe7`\x00\x00\x00\x000mM`\x00\x00\x00\x001J\xc9`\x00\x00\x00\x002Vi\xe0\x00" +
-	"\x00\x00\x003*\xab`\x00\x00\x00\x0046K\xe0\x00\x00\x00\x005\n\x8d`\x00\x00\x00\x006\x16-\xe0\x00\x00\x00\x006\xf3\xa9\xe0\x00\x00\x00\x007\xf6\x0f\xe0\x00\x00\x00\x008Ӌ\xe0\x00\x00\x00\x009" +
-	"\xd5\xf1\xe0\x00\x00\x00\x00:\xb3m\xe0\x00\x00\x00\x00;\xbf\x0e`\x00\x00\x00\x00<\x93O\xe0\x00\x00\x00\x00=\x9e\xf0`\x00\x00\x00\x00>s1\xe0\x00\x00\x00\x00?~\xd2`\x00\x00\x00\x00@\\N`\x00" +
-	"\x00\x00\x00A^\xb4`\x00\x00\x00\x00B<0`\x00\x00\x00\x00C>\x96`\x00\x00\x00\x00D\x1c\x12`\x00\x00\x00\x00E\x1ex`\x00\x00\x00\x00E\xfb\xf4`\x00\x00\x00\x00F\xfeZ`\x01\x03\x02\x03\x02" +
-	"\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02" +
-	"\x03\x02\x03\x02\x00\x00\xab\xfc\x00\x00\x00\x00\xacD\x00\x04\x00\x00\xc1\\\x01\n\x00\x00\xb3L\x00\x10LMT\x00+1215\x00+1345\x00+1245\x00\n<+1245>-1" +
-	"2:45<+1345>,M9.5.0/2:45,M4.1.0/3:45\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00n\x04\x19y\x9a\x00\x00\x00\x9a\x00" +
-	"\x00\x00\r\x00\x00\x00Pacific/ChuukTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" +
-	"\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\r\xff\xff\xff\xffV\xb6" +
-	"Z\b\xff\xff\xff\xffr\xed\xa4\x90\x01\x02\x00\x00\x89\xf8\x00\x00\x00\x00\x89\xf0\x00\x04\x00\x00\x8c\xa0\x00\tLMT\x00PMMT\x00+10\x00\n<+10>-10\nPK\x03\x04\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00?X'\x8e\x96\x04\x00\x00\x96\x04\x00\x00\x0e\x00\x00\x00Pacific/EasterTZif3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00n\x00\x00\x00\x06\x00\x00\x00\x14\xff\xff\xff\xffi\x87B\b\xff\xff\xff\xff\xb9\xc7@\x88\xff\xff\xff\xff\xfd\xd1<@\xff\xff\xff\xff\xfe\x92\xfa\xb0\xff\xff\xff\xff\xff\xcc\xcd\xc0\x00\x00\x00\x00\x00rܰ" +
-	"\x00\x00\x00\x00\x01uP\xc0\x00\x00\x00\x00\x02@I\xb0\x00\x00\x00\x00\x03U2\xc0\x00\x00\x00\x00\x04 +\xb0\x00\x00\x00\x00\x05>O@\x00\x00\x00\x00\x06\x00\r\xb0\x00\x00\x00\x00\a\v\xbc@\x00\x00\x00\x00" +
-	"\a\xdf\xef\xb0\x00\x00\x00\x00\b\xfe\x13@\x00\x00\x00\x00\t\xbfѰ\x00\x00\x00\x00\n\xdd\xf5@\x00\x00\x00\x00\v\xa8\xee0\x00\x00\x00\x00\f\xbd\xd7@\x00\x00\x00\x00\r\x88\xd00\x00\x00\x00\x00\x0e\x9d\xb9@" +
-	"\x00\x00\x00\x00\x0fh\xb20\x00\x00\x00\x00\x10\x86\xd5\xc0\x00\x00\x00\x00\x11H\x940\x00\x00\x00\x00\x12f\xb7\xc0\x00\x00\x00\x00\x13(v0\x00\x00\x00\x00\x14F\x99\xc0\x00\x00\x00\x00\x15\x11\x92\xb0\x00\x00\x00\x00" +
-	"\x16&{\xc0\x00\x00\x00\x00\x16\xf1t\xb0\x00\x00\x00\x00\x18\x06]\xc0\x00\x00\x00\x00\x18\xd1V\xb0\x00\x00\x00\x00\x19\xe6?\xc0\x00\x00\x00\x00\x1a\xb18\xb0\x00\x00\x00\x00\x1b\xcf\\@\x00\x00\x00\x00\x1c\x91\x1a\xb0" +
-	"\x00\x00\x00\x00\x1d\xaf>@\x00\x00\x00\x00\x1ep\xfc\xb0\x00\x00\x00\x00\x1f\x8f @\x00\x00\x00\x00 \x7f\x030\x00\x00\x00\x00!o\x02@\x00\x00\x00\x00\"9\xfb0\x00\x00\x00\x00#N\xe4@\x00\x00\x00\x00" +
-	"$\x19\xdd0\x00\x00\x00\x00%8\x00\xc0\x00\x00\x00\x00%\xf9\xbf0\x00\x00\x00\x00&\xf2\xf8\xc0\x00\x00\x00\x00'١0\x00\x00\x00\x00(\xf7\xc4\xc0\x00\x00\x00\x00)½\xb0\x00\x00\x00\x00*צ\xc0" +
-	"\x00\x00\x00\x00+\xa2\x9f\xb0\x00\x00\x00\x00,\xb7\x88\xc0\x00\x00\x00\x00-\x82\x81\xb0\x00\x00\x00\x00.\x97j\xc0\x00\x00\x00\x00/bc\xb0\x00\x00\x00\x000\x80\x87@\x00\x00\x00\x001BE\xb0\x00\x00\x00\x00" +
-	"2`i@\x00\x00\x00\x003=\xd70\x00\x00\x00\x004@K@\x00\x00\x00\x005\vD0\x00\x00\x00\x006\r\xb8@\x00\x00\x00\x007\x06հ\x00\x00\x00\x008\x00\x0f@\x00\x00\x00\x008\xcb\b0" +
-	"\x00\x00\x00\x009\xe9+\xc0\x00\x00\x00\x00:\xaa\xea0\x00\x00\x00\x00;\xc9\r\xc0\x00\x00\x00\x00<\x8a\xcc0\x00\x00\x00\x00=\xa8\xef\xc0\x00\x00\x00\x00>j\xae0\x00\x00\x00\x00?\x88\xd1\xc0\x00\x00\x00\x00" +
-	"@Sʰ\x00\x00\x00\x00Ah\xb3\xc0\x00\x00\x00\x00B3\xac\xb0\x00\x00\x00\x00CH\x95\xc0\x00\x00\x00\x00D\x13\x8e\xb0\x00\x00\x00\x00E1\xb2@\x00\x00\x00\x00E\xf3p\xb0\x00\x00\x00\x00G\x11\x94@" +
-	"\x00\x00\x00\x00G\xef\x020\x00\x00\x00\x00H\xf1v@\x00\x00\x00\x00I\xbco0\x00\x00\x00\x00J\xd1X@\x00\x00\x00\x00K\xb8\x00\xb0\x00\x00\x00\x00L\xb1:@\x00\x00\x00\x00M\xc6\a0\x00\x00\x00\x00" +
-	"NP\x82\xc0\x00\x00\x00\x00O\x9c\xae\xb0\x00\x00\x00\x00PB\xd9\xc0\x00\x00\x00\x00Q|\x90\xb0\x00\x00\x00\x00R+\xf6@\x00\x00\x00\x00S\\r\xb0\x00\x00\x00\x00T\v\xd8@\x00\x00\x00\x00W7\xe60" +
-	"\x00\x00\x00\x00W\xaf\xec\xc0\x00\x00\x00\x00Y\x17\xc80\x00\x00\x00\x00Y\x8f\xce\xc0\x00\x00\x00\x00Z\xf7\xaa0\x00\x00\x00\x00[o\xb0\xc0\x00\x00\x00\x00\\\xa9g\xb0\x00\x00\x00\x00]t|\xc0\x00\x00\x00\x00" +
-	"^\x89I\xb0\x00\x00\x00\x00_T^\xc0\x00\x00\x00\x00`i+\xb0\x00\x00\x00\x00a4@\xc0\x00\x00\x00\x00bI\r\xb0\x00\x00\x00\x00c\x1d]@\x00\x00\x00\x00d(\xef\xb0\x01\x03\x02\x03\x02\x03\x02\x03" +
-	"\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04" +
-	"\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\xff\xff\x99x\x00\x00\xff\xff\x99x\x00\x04\xff\xff\xab\xa0\x01\b" +
-	"\xff\xff\x9d\x90\x00\f\xff\xff\xab\xa0\x00\b\xff\xff\xb9\xb0\x01\x10LMT\x00EMT\x00-06\x00-07\x00-05\x00\n<-06>6<-05>,M9.1.6/22" +
-	",M4.1.6/22\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9e\x7f\xab\x95V\x01\x00\x00V\x01\x00\x00\r\x00\x00\x00Pacific/EfateTZif2\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x00\x00\x03\x00\x00\x00\f\xff\xff\xff\xff\x92\xf5´\x00\x00\x00\x00\ay\x99@\x00\x00\x00\x00\a\xfa\xcc@\x00\x00\x00\x00\x19\xd2\xf7" +
-	"\xd0\x00\x00\x00\x00\x1a\xc2\xda\xc0\x00\x00\x00\x00\x1b\xb2\xd9\xd0\x00\x00\x00\x00\x1c\xa2\xbc\xc0\x00\x00\x00\x00\x1d\x9b\xf6P\x00\x00\x00\x00\x1e\x82\x9e\xc0\x00\x00\x00\x00\x1f{\xd8P\x00\x00\x00\x00 k\xbb@\x00\x00\x00" +
-	"\x00![\xbaP\x00\x00\x00\x00\"K\x9d@\x00\x00\x00\x00#;\x9cP\x00\x00\x00\x00$+\x7f@\x00\x00\x00\x00%\x1b~P\x00\x00\x00\x00&\va@\x00\x00\x00\x00&\xfb`P\x00\x00\x00\x00'\xebC" +
-	"@\x00\x00\x00\x00(\xe4|\xd0\x00\x00\x00\x00)\x81Q@\x00\x00\x00\x00*\xe9H\xd0\x00\x00\x00\x00+a3@\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x00\x00\x9d\xcc" +
-	"\x00\x00\x00\x00\xa8\xc0\x01\x04\x00\x00\x9a\xb0\x00\bLMT\x00+12\x00+11\x00\n<+11>-11\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xec =\x89\xac\x00\x00\x00\xac\x00" +
-	"\x00\x00\x11\x00\x00\x00Pacific/EnderburyTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x10\xff\xff" +
-	"\xff\xff\xc3,ۀ\x00\x00\x00\x00\x12V\x04\xc0\x00\x00\x00\x00/\x059\xb0\x01\x02\x03\x00\x00\x00\x00\x00\x00\xff\xffW@\x00\x04\xff\xffeP\x00\b\x00\x00\xb6\xd0\x00\f-00\x00-12\x00-11" +
-	"\x00+13\x00\n<+13>-13\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8a|\xdcU\x99\x00\x00\x00\x99\x00\x00\x00\x0f\x00\x00\x00Pacific/Fakaofo" +
-	"TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\f\xff\xff\xff\xff~7U\x88\x00\x00\x00\x00N\xfd\x99\xb0\x01\x02\xff\xff_x\x00\x00\xff" +
-	"\xffeP\x00\x04\x00\x00\xb6\xd0\x00\bLMT\x00-11\x00+13\x00\n<+13>-13\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfd_yl\x8c\x01\x00\x00\x8c\x01\x00\x00\f" +
-	"\x00\x00\x00Pacific/FijiTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00" +
-	"\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1d\x00\x00\x00\x03\x00\x00\x00\f\xff\xff\xff\xff\x9a\x13\xb1\xc0\x00\x00" +
-	"\x00\x006;\x17\xe0\x00\x00\x00\x006\xd7\xfa`\x00\x00\x00\x008$4`\x00\x00\x00\x008\xb7\xdc`\x00\x00\x00\x00K\x11,\xe0\x00\x00\x00\x00K\xae\x0f`\x00\x00\x00\x00L\xc2\xea`\x00\x00\x00\x00Mr" +
-	"A\xe0\x00\x00\x00\x00N\xa2\xcc`\x00\x00\x00\x00O\x1a\xc4\xe0\x00\x00\x00\x00P\x82\xae`\x00\x00\x00\x00P\xfa\xa6\xe0\x00\x00\x00\x00Rk\xca\xe0\x00\x00\x00\x00R\xdaz\xd0\x00\x00\x00\x00TT\xe7`\x00\x00" +
-	"\x00\x00T\xbaj\xe0\x00\x00\x00\x00V4\xc9`\x00\x00\x00\x00V\x9aL\xe0\x00\x00\x00\x00X\x1d\xe5\xe0\x00\x00\x00\x00Xz.\xe0\x00\x00\x00\x00Y\xfd\xc7\xe0\x00\x00\x00\x00ZZ\x10\xe0\x00\x00\x00\x00[\xdd" +
-	"\xa9\xe0\x00\x00\x00\x00\\9\xf2\xe0\x00\x00\x00\x00]\xc6\xc6`\x00\x00\x00\x00^\x19\xd4\xe0\x00\x00\x00\x00_\xde\a`\x00\x00\x00\x00`\x02\xf1`\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x00\x00\xa7\xc0\x00\x00\x00\x00\xb6\xd0\x01\x04\x00\x00\xa8\xc0\x00\bLMT\x00+13\x00+12\x00\n<+12>-12\nPK\x03\x04\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x006\xb7S{\x86\x00\x00\x00\x86\x00\x00\x00\x10\x00\x00\x00Pacific/FunafutiTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\b\xff\xff\xff\xff~6\x12\xcc\x01\x00\x00\xa24\x00\x00\x00\x00\xa8\xc0\x00\x04LMT\x00+12\x00\n<+12>-12\nPK\x03\x04\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x81\xe3w\n\xaf\x00\x00\x00\xaf\x00\x00\x00\x11\x00\x00\x00Pacific/GalapagosTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\f\xff\xff\xff\xff\xb6\xa4L\x80\x00\x00\x00\x00\x1e\x18\xc4P\x00\x00\x00\x00+\x17\n\xe0\x00\x00\x00\x00+q\xf4P\x01\x03\x02\x03\xff\xff\xac\x00\x00\x00\xff\xff\xb9\xb0\x00" +
-	"\x04\xff\xff\xb9\xb0\x01\x04\xff\xff\xab\xa0\x00\bLMT\x00-05\x00-06\x00\n<-06>6\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc23\xa0\xbc\x84\x00\x00\x00\x84\x00\x00\x00\x0f" +
-	"\x00\x00\x00Pacific/GambierTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" +
-	"\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\b\xff\xff\xff\xff\x94PH" +
-	"\x04\x01\xff\xff\x81|\x00\x00\xff\xff\x81p\x00\x04LMT\x00-09\x00\n<-09>9\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Y\xd2K|\x86\x00\x00\x00\x86\x00\x00\x00\x13\x00\x00\x00" +
-	"Pacific/GuadalcanalTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" +
-	"\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\b\xff\xff\xff\xff\x94O" +
-	"3\x8c\x01\x00\x00\x95\xf4\x00\x00\x00\x00\x9a\xb0\x00\x04LMT\x00+11\x00\n<+11>-11\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00FI\xfe\x14^\x01\x00\x00^\x01\x00\x00\f" +
-	"\x00\x00\x00Pacific/GuamTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00" +
-	"\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x15\x00\x00\x00\x06\x00\x00\x00\x15\xff\xff\xff\xff\x14\xe1\xc5\xcc\xff\xff" +
-	"\xff\xff~6-L\xff\xff\xff\xff\xcb7\x95\xe0\xff\xff\xff\xff\xd0.\x89\xf0\xff\xff\xff\xff\xec7\xbe\x00\xff\xff\xff\xff\xef6\xf8\xf0\xff\xff\xff\xff\xfb\x9b\x00\x00\xff\xff\xff\xff\xfe?'\x8c\xff\xff\xff\xff\xff\x01" +
-	"\x1e\x00\xff\xff\xff\xff\xff]X\xf0\x00\x00\x00\x00\x00\x97,\x00\x00\x00\x00\x00\x01Fup\x00\x00\x00\x00\x02w\x0e\x00\x00\x00\x00\x00\x03&Wp\x00\x00\x00\x00\ap\x97\x00\x00\x00\x00\x00\a\xcc\xd1\xf0\x00\x00" +
-	"\x00\x00\f\b\x91\x00\x00\x00\x00\x00\f|\x87,\x00\x00\x00\x00\r\xbf\x94\x80\x00\x00\x00\x00\x0ee\xa3p\x00\x00\x00\x00:C^`\x01\x02\x03\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x05\xff" +
-	"\xff64\x00\x00\x00\x00\x87\xb4\x00\x00\x00\x00\x8c\xa0\x00\x04\x00\x00~\x90\x00\b\x00\x00\x9a\xb0\x01\f\x00\x00\x8c\xa0\x00\x10LMT\x00GST\x00+09\x00GDT\x00ChST\x00\nChS" +
-	"T-10\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xeaK\x85v\xdd\x00\x00\x00\xdd\x00\x00\x00\x10\x00\x00\x00Pacific/HonoluluTZif2\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\x14\xff\xff\xff\xfft\xe0p\xbe\xff\xff\xff\xff\xbb\x05CH\xff\xff\xff\xff\xbb!qX\xff\xff\xff\xffˉ=\xc8\xff\xff" +
-	"\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2aI8\xff\xff\xff\xffՍsH\x01\x02\x01\x03\x04\x01\x05\xff\xffl\x02\x00\x00\xff\xfflX\x00\x04\xff\xffzh\x01\b\xff\xffzh\x01\f\xff\xffzh\x01\x10\xff" +
-	"\xffs`\x00\x04LMT\x00HST\x00HDT\x00HWT\x00HPT\x00\nHST10\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xeaK\x85v\xdd\x00\x00\x00\xdd\x00\x00\x00\x10\x00" +
-	"\x00\x00Pacific/JohnstonTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" +
-	"\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\x14\xff\xff\xff\xfft\xe0p" +
-	"\xbe\xff\xff\xff\xff\xbb\x05CH\xff\xff\xff\xff\xbb!qX\xff\xff\xff\xffˉ=\xc8\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2aI8\xff\xff\xff\xffՍsH\x01\x02\x01\x03\x04\x01\x05\xff\xffl\x02" +
-	"\x00\x00\xff\xfflX\x00\x04\xff\xffzh\x01\b\xff\xffzh\x01\f\xff\xffzh\x01\x10\xff\xffs`\x00\x04LMT\x00HST\x00HDT\x00HWT\x00HPT\x00\nHST10\nP" +
-	"K\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xec =\x89\xac\x00\x00\x00\xac\x00\x00\x00\x0e\x00\x00\x00Pacific/KantonTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x10\xff\xff\xff\xff\xc3,ۀ\x00\x00\x00\x00\x12V\x04\xc0\x00\x00\x00\x00/\x059\xb0\x01\x02\x03\x00\x00\x00\x00\x00\x00\xff\xffW@\x00\x04\xff\xffe" +
-	"P\x00\b\x00\x00\xb6\xd0\x00\f-00\x00-12\x00-11\x00+13\x00\n<+13>-13\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc8=ku\xae\x00\x00\x00\xae\x00\x00" +
-	"\x00\x12\x00\x00\x00Pacific/KiritimatiTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x12\xff\xff" +
-	"\xff\xff~7H\x80\x00\x00\x00\x00\x12U\xf2\x00\x00\x00\x00\x00/\x05+\xa0\x01\x02\x03\xff\xffl\x80\x00\x00\xff\xffj\x00\x00\x04\xff\xffs`\x00\n\x00\x00\xc4\xe0\x00\x0eLMT\x00-1040\x00-" +
-	"10\x00+14\x00\n<+14>-14\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97n7\x1a\xf2\x00\x00\x00\xf2\x00\x00\x00\x0e\x00\x00\x00Pacific/Kosra" +
-	"eTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\t\x00\x00\x00\x06\x00\x00\x00\x14\xff\xff\xff\xff\x14ᴴ\xff\xff\xff\xff~6\x1c4\xff\xff\xff\xff\x98\x11\x95\xd0" +
-	"\xff\xff\xff\xff\xa09\xf9\xf0\xff\xff\xff\xff\xc1\xed5\xd0\xff\xff\xff\xff\xc9\xea\n`\xff\xff\xff\xff\xd2\x11\x0e\xf0\xff\xff\xff\xff\xff\x86\x1bP\x00\x00\x00\x006\x8bg@\x01\x02\x03\x02\x04\x03\x02\x05\x02\xff\xffG" +
-	"L\x00\x00\x00\x00\x98\xcc\x00\x00\x00\x00\x9a\xb0\x00\x04\x00\x00~\x90\x00\b\x00\x00\x8c\xa0\x00\f\x00\x00\xa8\xc0\x00\x10LMT\x00+11\x00+09\x00+10\x00+12\x00\n<+11>-" +
-	"11\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf6\xe8]*\xdb\x00\x00\x00\xdb\x00\x00\x00\x11\x00\x00\x00Pacific/KwajaleinTZif2\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x18\xff\xff\xff\xff~6\x18 \xff\xff\xff\xff\xc1\xed5\xd0\xff\xff\xff\xff\xc9\xea\n`\xff\xff\xff\xff\xcfF\x81\xf0\xff\xff\xff" +
-	"\xff\xff\x86\x1bP\x00\x00\x00\x00,v\x0e@\x01\x02\x03\x01\x04\x05\x00\x00\x9c\xe0\x00\x00\x00\x00\x9a\xb0\x00\x04\x00\x00\x8c\xa0\x00\b\x00\x00~\x90\x00\f\xff\xffW@\x00\x10\x00\x00\xa8\xc0\x00\x14LMT\x00+" +
-	"11\x00+10\x00+09\x00-12\x00+12\x00\n<+12>-12\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x006\xb7S{\x86\x00\x00\x00\x86\x00\x00\x00\x0e\x00\x00\x00P" +
-	"acific/MajuroTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00" +
-	"\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\b\xff\xff\xff\xff~6\x12\xcc\x01\x00\x00\xa2" +
-	"4\x00\x00\x00\x00\xa8\xc0\x00\x04LMT\x00+12\x00\n<+12>-12\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00D6\x83\xa1\x8b\x00\x00\x00\x8b\x00\x00\x00\x11\x00\x00\x00Pac" +
-	"ific/MarquesasTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00" +
-	"\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\n\xff\xff\xff\xff\x94PLH\x01\xff\xff" +
-	"}8\x00\x00\xff\xffzh\x00\x04LMT\x00-0930\x00\n<-0930>9:30\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00t\xca{e\x92\x00\x00\x00\x92\x00\x00\x00\x0e" +
-	"\x00\x00\x00Pacific/MidwayTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" +
-	"\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\b\xff\xff\xff\xffn=\xc8\b" +
-	"\xff\xff\xff\xff\x91\x05\xfb\b\x01\x02\x00\x00\xb1x\x00\x00\xff\xff_\xf8\x00\x00\xff\xffeP\x00\x04LMT\x00SST\x00\nSST11\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe2;Z" +
-	"\xf7\xb7\x00\x00\x00\xb7\x00\x00\x00\r\x00\x00\x00Pacific/NauruTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00" +
-	"\x12\xff\xff\xff\xff\xa3\xe7+\x04\xff\xff\xff\xff̐\xe9\xc8\xff\xff\xff\xff\xd2C'\xf0\x00\x00\x00\x00\x11!\xa8\xe8\x01\x02\x01\x03\x00\x00\x9c|\x00\x00\x00\x00\xa1\xb8\x00\x04\x00\x00~\x90\x00\n\x00\x00\xa8\xc0\x00" +
-	"\x0eLMT\x00+1130\x00+09\x00+12\x00\n<+12>-12\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x91\xd60\f\x9a\x00\x00\x00\x9a\x00\x00\x00\f\x00\x00\x00P" +
-	"acific/NiueTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00" +
-	"\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x0e\xff\xff\xff\xffߡjL\xff\xff\xff\xff\xf5\xa6" +
-	"\xb8`\x01\x02\xff\xff`\xb4\x00\x00\xff\xff`\xa0\x00\x04\xff\xffeP\x00\nLMT\x00-1120\x00-11\x00\n<-11>11\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Y" +
-	"5\x1a6\xf7\x00\x00\x00\xf7\x00\x00\x00\x0f\x00\x00\x00Pacific/NorfolkTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00" +
-	"\x06\x00\x00\x00\x1e\xff\xff\xff\xff~6\x17\x88\xff\xff\xff\xff\xdcA\xf8\x80\x00\x00\x00\x00\t\x0f\xcah\x00\x00\x00\x00\t\xb5\xe7h\x00\x00\x00\x00V\x0f\xe6h\x00\x00\x00\x00]\x98\xaf\xf0\x01\x02\x03\x02\x04\x05\x00" +
-	"\x00\x9dx\x00\x00\x00\x00\x9d\x80\x00\x04\x00\x00\xa1\xb8\x00\n\x00\x00\xaf\xc8\x01\x10\x00\x00\x9a\xb0\x00\x16\x00\x00\xa8\xc0\x01\x1aLMT\x00+1112\x00+1130\x00+1230\x00+11" +
-	"\x00+12\x00\n<+11>-11<+12>,M10.1.0,M4.1.0/3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb7\xef\x97\xc6\xc6\x00\x00\x00\xc6" +
-	"\x00\x00\x00\x0e\x00\x00\x00Pacific/NoumeaTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\x00\x00\x00\x03\x00\x00\x00\f\xff\xff\xff\xff" +
-	"\x92\xf5\xc4t\x00\x00\x00\x00\x0e\xe6\xbaP\x00\x00\x00\x00\x0fV\xbb\xc0\x00\x00\x00\x00\x10ƜP\x00\x00\x00\x00\x117\xef@\x00\x00\x00\x002\xa0K\xf0\x00\x00\x00\x003\x18Dp\x02\x01\x02\x01\x02\x01\x02\x00" +
-	"\x00\x9c\f\x00\x00\x00\x00\xa8\xc0\x01\x04\x00\x00\x9a\xb0\x00\bLMT\x00+12\x00+11\x00\n<+11>-11\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00t\xca{e\x92\x00\x00" +
-	"\x00\x92\x00\x00\x00\x11\x00\x00\x00Pacific/Pago_PagoTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00" +
-	"\b\xff\xff\xff\xffn=\xc8\b\xff\xff\xff\xff\x91\x05\xfb\b\x01\x02\x00\x00\xb1x\x00\x00\xff\xff_\xf8\x00\x00\xff\xffeP\x00\x04LMT\x00SST\x00\nSST11\nPK\x03\x04\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x80\xf8vܔ\x00\x00\x00\x94\x00\x00\x00\r\x00\x00\x00Pacific/PalauTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x02\x00\x00\x00\x03\x00\x00\x00\b\xff\xff\xff\xff\x14\xe1\xcfl\xff\xff\xff\xff~66\xec\x01\x02\xff\xff,\x94\x00\x00\x00\x00~\x14\x00\x00\x00\x00~\x90\x00\x04LMT\x00+09\x00\n<+09>" +
-	"-9\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfa\x0fA\x05\x99\x00\x00\x00\x99\x00\x00\x00\x10\x00\x00\x00Pacific/PitcairnTZif2\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x0e\xff\xff\xff\xff~7.\xf4\x00\x00\x00\x005DB\b\x01\x02\xff\xff\x86\f\x00\x00\xff\xff\x88x\x00\x04\xff\xff\x8f\x80\x00\n" +
-	"LMT\x00-0830\x00-08\x00\n<-08>8\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Y\xd2K|\x86\x00\x00\x00\x86\x00\x00\x00\x0f\x00\x00\x00Pacific/" +
-	"PohnpeiTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZ" +
-	"if2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\b\xff\xff\xff\xff\x94O3\x8c\x01\x00\x00\x95\xf4\x00\x00\x00\x00\x9a" +
-	"\xb0\x00\x04LMT\x00+11\x00\n<+11>-11\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Y\xd2K|\x86\x00\x00\x00\x86\x00\x00\x00\x0e\x00\x00\x00Pacific/P" +
-	"onapeTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif" +
-	"2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\b\xff\xff\xff\xff\x94O3\x8c\x01\x00\x00\x95\xf4\x00\x00\x00\x00\x9a\xb0\x00" +
-	"\x04LMT\x00+11\x00\n<+11>-11\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00n\x04\x19y\x9a\x00\x00\x00\x9a\x00\x00\x00\x14\x00\x00\x00Pacific/Por" +
-	"t_MoresbyTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00" +
-	"TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\r\xff\xff\xff\xffV\xb6Z\b\xff\xff\xff\xffr\xed\xa4\x90" +
-	"\x01\x02\x00\x00\x89\xf8\x00\x00\x00\x00\x89\xf0\x00\x04\x00\x00\x8c\xa0\x00\tLMT\x00PMMT\x00+10\x00\n<+10>-10\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\xe3\xa3" +
-	"S\x96\x01\x00\x00\x96\x01\x00\x00\x11\x00\x00\x00Pacific/RarotongaTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x00\x00" +
-	"\x05\x00\x00\x00\x14\xff\xff\xff\xff|L\xdc\xc8\xff\xff\xff\xffߡ`\xc8\x00\x00\x00\x00\x10\xac\x1b(\x00\x00\x00\x00\x11?\xb5\x18\x00\x00\x00\x00\x12y\x81 \x00\x00\x00\x00\x13\x1f\x97\x18\x00\x00\x00\x00\x14Yc" +
-	" \x00\x00\x00\x00\x14\xffy\x18\x00\x00\x00\x00\x169E \x00\x00\x00\x00\x16蕘\x00\x00\x00\x00\x18\"a\xa0\x00\x00\x00\x00\x18\xc8w\x98\x00\x00\x00\x00\x1a\x02C\xa0\x00\x00\x00\x00\x1a\xa8Y\x98\x00\x00\x00" +
-	"\x00\x1b\xe2%\xa0\x00\x00\x00\x00\x1c\x88;\x98\x00\x00\x00\x00\x1d\xc2\a\xa0\x00\x00\x00\x00\x1eh\x1d\x98\x00\x00\x00\x00\x1f\xa1\xe9\xa0\x00\x00\x00\x00 G\xff\x98\x00\x00\x00\x00!\x81ˠ\x00\x00\x00\x00\"1\x1c" +
-	"\x18\x00\x00\x00\x00#j\xe8 \x00\x00\x00\x00$\x10\xfe\x18\x00\x00\x00\x00%J\xca \x00\x00\x00\x00%\xf0\xe0\x18\x00\x00\x00\x00'*\xac \x00\x00\x00\x00'\xd0\xc2\x18\x01\x02\x04\x03\x04\x03\x04\x03\x04\x03\x04" +
-	"\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x00\x00\xbb\xb8\x00\x00\xff\xffj8\x00\x00\xff\xfflX\x00\x04\xff\xffs`\x00\n\xff\xffzh\x01\x0eLMT\x00-1030\x00-10" +
-	"\x00-0930\x00\n<-10>10\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00FI\xfe\x14^\x01\x00\x00^\x01\x00\x00\x0e\x00\x00\x00Pacific/Saipan" +
-	"TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x15\x00\x00\x00\x06\x00\x00\x00\x15\xff\xff\xff\xff\x14\xe1\xc5\xcc\xff\xff\xff\xff~6-L\xff\xff\xff\xff\xcb7\x95\xe0\xff" +
-	"\xff\xff\xff\xd0.\x89\xf0\xff\xff\xff\xff\xec7\xbe\x00\xff\xff\xff\xff\xef6\xf8\xf0\xff\xff\xff\xff\xfb\x9b\x00\x00\xff\xff\xff\xff\xfe?'\x8c\xff\xff\xff\xff\xff\x01\x1e\x00\xff\xff\xff\xff\xff]X\xf0\x00\x00\x00\x00\x00" +
-	"\x97,\x00\x00\x00\x00\x00\x01Fup\x00\x00\x00\x00\x02w\x0e\x00\x00\x00\x00\x00\x03&Wp\x00\x00\x00\x00\ap\x97\x00\x00\x00\x00\x00\a\xcc\xd1\xf0\x00\x00\x00\x00\f\b\x91\x00\x00\x00\x00\x00\f|\x87,\x00" +
-	"\x00\x00\x00\r\xbf\x94\x80\x00\x00\x00\x00\x0ee\xa3p\x00\x00\x00\x00:C^`\x01\x02\x03\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x05\xff\xff64\x00\x00\x00\x00\x87\xb4\x00\x00\x00\x00\x8c\xa0" +
-	"\x00\x04\x00\x00~\x90\x00\b\x00\x00\x9a\xb0\x01\f\x00\x00\x8c\xa0\x00\x10LMT\x00GST\x00+09\x00GDT\x00ChST\x00\nChST-10\nPK\x03\x04\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00t\xca{e\x92\x00\x00\x00\x92\x00\x00\x00\r\x00\x00\x00Pacific/SamoaTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02" +
-	"\x00\x00\x00\x03\x00\x00\x00\b\xff\xff\xff\xffn=\xc8\b\xff\xff\xff\xff\x91\x05\xfb\b\x01\x02\x00\x00\xb1x\x00\x00\xff\xff_\xf8\x00\x00\xff\xffeP\x00\x04LMT\x00SST\x00\nSST11\nP" +
-	"K\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xea\xc1\xdaυ\x00\x00\x00\x85\x00\x00\x00\x0e\x00\x00\x00Pacific/TahitiTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\b\xff\xff\xff\xff\x94PU\xb8\x01\xff\xffs\xc8\x00\x00\xff\xffs`\x00\x04LMT\x00-10\x00\n<-10>10\nPK\x03\x04" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x006\xb7S{\x86\x00\x00\x00\x86\x00\x00\x00\x0e\x00\x00\x00Pacific/TarawaTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\b\xff\xff\xff\xff~6\x12\xcc\x01\x00\x00\xa24\x00\x00\x00\x00\xa8\xc0\x00\x04LMT\x00+12\x00\n<+12>-12\nPK\x03\x04\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x97F\x91\xb3\xed\x00\x00\x00\xed\x00\x00\x00\x11\x00\x00\x00Pacific/TongatapuTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\n\x00\x00\x00\x04\x00\x00\x00\x12\xff\xff\xff\xff\xd2E\x9c@\xff\xff\xff\xff\xef\x11\xe0\x10\x00\x00\x00\x007\xfbG\xd0\x00\x00\x00\x008\xd3}\xd0\x00\x00\x00\x00:\x04\bP\x00\x00\x00\x00" +
-	":r\xb8@\x00\x00\x00\x00;\xe3\xeaP\x00\x00\x00\x00<R\x9a@\x00\x00\x00\x00X\x1d\xd7\xd0\x00\x00\x00\x00Xz \xd0\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x00\x00\xad@\x00\x00\x00\x00\xadp\x00\x04\x00\x00" +
-	"\xb6\xd0\x00\n\x00\x00\xc4\xe0\x01\x0eLMT\x00+1220\x00+13\x00+14\x00\n<+13>-13\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00n\x04\x19y\x9a\x00\x00\x00" +
-	"\x9a\x00\x00\x00\f\x00\x00\x00Pacific/TrukTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" +
-	"\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\r\xff\xff\xff\xffV" +
-	"\xb6Z\b\xff\xff\xff\xffr\xed\xa4\x90\x01\x02\x00\x00\x89\xf8\x00\x00\x00\x00\x89\xf0\x00\x04\x00\x00\x8c\xa0\x00\tLMT\x00PMMT\x00+10\x00\n<+10>-10\nPK\x03\x04\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x006\xb7S{\x86\x00\x00\x00\x86\x00\x00\x00\f\x00\x00\x00Pacific/WakeTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\b\xff\xff\xff\xff~6\x12\xcc\x01\x00\x00\xa24\x00\x00\x00\x00\xa8\xc0\x00\x04LMT\x00+12\x00\n<+12>-12\nPK\x03\x04\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x006\xb7S{\x86\x00\x00\x00\x86\x00\x00\x00\x0e\x00\x00\x00Pacific/WallisTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x01\x00\x00\x00\x02\x00\x00\x00\b\xff\xff\xff\xff~6\x12\xcc\x01\x00\x00\xa24\x00\x00\x00\x00\xa8\xc0\x00\x04LMT\x00+12\x00\n<+12>-12\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00n\x04\x19y\x9a\x00\x00\x00\x9a\x00\x00\x00\v\x00\x00\x00Pacific/YapTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x03" +
-	"\x00\x00\x00\r\xff\xff\xff\xffV\xb6Z\b\xff\xff\xff\xffr\xed\xa4\x90\x01\x02\x00\x00\x89\xf8\x00\x00\x00\x00\x89\xf0\x00\x04\x00\x00\x8c\xa0\x00\tLMT\x00PMMT\x00+10\x00\n<+10>-" +
-	"10\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00>\xfe垛\x03\x00\x00\x9b\x03\x00\x00\x06\x00\x00\x00PolandTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00R\x00\x00\x00\x06\x00\x00\x00\x1a\xff\xff\xff\xffV\xb6\xd0P\xff\xff\xff\xff\x99\xa8*\xd0\xff\xff\xff\xff\x9b\f\x17`\xff\xff\xff\xff\x9b\xd5\xda\xf0\xff\xff\xff\xff\x9cٮ\x90\xff\xff\xff\xff\x9d\xa4" +
-	"\xb5\x90\xff\xff\xff\xff\x9e\xb9\x90\x90\xff\xff\xff\xff\x9f\x84\x97\x90\xff\xff\xff\xff\xa0\x9a\xb6\x00\xff\xff\xff\xff\xa1e\xbd\x00\xff\xff\xff\xff\xa6}|`\xff\xff\xff\xff\xc8v\xde\x10\xff\xff\xff\xff\xcc\xe7K\x10\xff\xff" +
-	"\xff\xffͩ\x17\x90\xff\xff\xff\xff\u03a2C\x10\xff\xff\xff\xffϒ4\x10\xff\xff\xff\xffЄ\xba\x00\xff\xff\xff\xffѕ\x92p\xff\xff\xff\xffҊ\xbb`\xff\xff\xff\xff\xd3b\xffp\xff\xff\xff\xff\xd4K" +
-	"#\x90\xff\xff\xff\xff\xd5^\xad\x10\xff\xff\xff\xff\xd6)\xb4\x10\xff\xff\xff\xff\xd7,\x1a\x10\xff\xff\xff\xff\xd8\t\x96\x10\xff\xff\xff\xff\xd9\x02\xc1\x90\xff\xff\xff\xff\xd9\xe9x\x10\xff\xff\xff\xff\xe8T\xd2\x00\xff\xff" +
-	"\xff\xff\xe8\xf1\xb4\x80\xff\xff\xff\xff\xe9᥀\xff\xff\xff\xff\xeaі\x80\xff\xff\xff\xff\xec\x14\x96\x00\xff\xff\xff\xff캳\x00\xff\xff\xff\xff\xed\xaa\xa4\x00\xff\xff\xff\xff\ue695\x00\xff\xff\xff\xff\xef\xd4" +
-	"Z\x00\xff\xff\xff\xff\xf0zw\x00\xff\xff\xff\xff\xf1\xb4<\x00\xff\xff\xff\xff\xf2ZY\x00\xff\xff\xff\xff\xf3\x94\x1e\x00\xff\xff\xff\xff\xf4:;\x00\xff\xff\xff\xff\xf5}:\x80\xff\xff\xff\xff\xf6\x1a\x1d\x00\x00\x00" +
-	"\x00\x00\r\xa4U\x80\x00\x00\x00\x00\x0e\x8b\f\x00\x00\x00\x00\x00\x0f\x847\x80\x00\x00\x00\x00\x10t(\x80\x00\x00\x00\x00\x11d\x19\x80\x00\x00\x00\x00\x12T\n\x80\x00\x00\x00\x00\x13M6\x00\x00\x00\x00\x00\x143" +
-	"\xec\x80\x00\x00\x00\x00\x15#݀\x00\x00\x00\x00\x16\x13\u0380\x00\x00\x00\x00\x17\x03\xbf\x80\x00\x00\x00\x00\x17\xf3\xb0\x80\x00\x00\x00\x00\x18㡀\x00\x00\x00\x00\x19Ӓ\x80\x00\x00\x00\x00\x1aÃ\x80\x00\x00" +
-	"\x00\x00\x1b\xbc\xaf\x00\x00\x00\x00\x00\x1c\xac\xa0\x00\x00\x00\x00\x00\x1d\x9c\x91\x00\x00\x00\x00\x00\x1e\x8c\x82\x00\x00\x00\x00\x00\x1f|s\x00\x00\x00\x00\x00 ld\x00\x00\x00\x00\x00!\\U\x00\x00\x00\x00\x00\"L" +
-	"T\x10\x00\x00\x00\x00#<E\x10\x00\x00\x00\x00$,6\x10\x00\x00\x00\x00%\x1c'\x10\x00\x00\x00\x00&\f\x18\x10\x00\x00\x00\x00'\x05C\x90\x00\x00\x00\x00'\xf54\x90\x00\x00\x00\x00(\xe5%\x90\x00\x00" +
-	"\x00\x00)\xd5\x16\x90\x00\x00\x00\x00*\xc5\a\x90\x00\x00\x00\x00+\xb4\xf8\x90\x00\x00\x00\x00,\xa4\xe9\x90\x00\x00\x00\x00-\x94ڐ\x00\x00\x00\x00.\x84ː\x00\x00\x00\x00/t\xbc\x90\x00\x00\x00\x000d" +
-	"\xad\x90\x00\x00\x00\x001]\xd9\x10\x01\x03\x02\x03\x02\x03\x02\x05\x04\x05\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02" +
-	"\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x00\x00\x13\xb0\x00\x00\x00\x00\x13\xb0\x00\x04\x00\x00\x1c \x01\b\x00\x00\x0e\x10\x00\r\x00\x00*0" +
-	"\x01\x11\x00\x00\x1c \x00\x16LMT\x00WMT\x00CEST\x00CET\x00EEST\x00EET\x00\nCET-1CEST,M3.5.0,M10.5.0/" +
-	"3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00&S\x03\t\xae\x05\x00\x00\xae\x05\x00\x00\b\x00\x00\x00PortugalTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x8d\x00\x00\x00\x06\x00\x00\x00\x1b\xff\xff\xff\xff^=\f\x1d\xff\xff\xff\xff\x92掀\xff\xff\xff\xff\x9bKmp\xff\xff\xff\xff\x9b\xfeǀ\xff\xff\xff\xff\x9c\x9c\xedp\xff\xff\xff\xff\x9d" +
-	"Ƀp\xff\xff\xff\xff\x9e\x7frp\xff\xff\xff\xff\x9f\xaa\xb6\xf0\xff\xff\xff\xff\xa0_Tp\xff\xff\xff\xff\xa1\x8b\xeap\xff\xff\xff\xff\xa2A\xd9p\xff\xff\xff\xff\xa3nop\xff\xff\xff\xff\xa4#\f\xf0\xff" +
-	"\xff\xff\xff\xa5O\xa2\xf0\xff\xff\xff\xff\xaa\x05\xefp\xff\xff\xff\xff\xaa\xf4\x8e\xf0\xff\xff\xff\xff\xadɧ\xf0\xff\xff\xff\xff\xae\xa7#\xf0\xff\xff\xff\xff\xaf\xa0Op\xff\xff\xff\xff\xb0\x87\x05\xf0\xff\xff\xff\xff\xb1" +
-	"\x89k\xf0\xff\xff\xff\xff\xb2p\"p\xff\xff\xff\xff\xb3r\x88p\xff\xff\xff\xff\xb4P\x04p\xff\xff\xff\xff\xb72Lp\xff\xff\xff\xff\xb8\x0f\xc8p\xff\xff\xff\xff\xb8\xff\xb9p\xff\xff\xff\xff\xb9\xef\xaap\xff" +
-	"\xff\xff\xff\xbcȷ\xf0\xff\xff\xff\xff\xbd\xb8\xa8\xf0\xff\xff\xff\xff\xbe\x9f_p\xff\xff\xff\xff\xbf\x98\x8a\xf0\xff\xff\xff\xff\xc0\x9a\xf0\xf0\xff\xff\xff\xff\xc1xl\xf0\xff\xff\xff\xff\xc2h]\xf0\xff\xff\xff\xff\xc3" +
-	"XN\xf0\xff\xff\xff\xff\xc4?\x05p\xff\xff\xff\xff\xc580\xf0\xff\xff\xff\xff\xc6:\x96\xf0\xff\xff\xff\xff\xc7X\xacp\xff\xff\xff\xff\xc7\xd9\xdfp\xff\xff\xff\xff\xc9\x01/p\xff\xff\xff\xff\xc9\xf1 p\xff" +
-	"\xff\xff\xff\xca\xe2b\xf0\xff\xff\xff\xff˵R\xf0\xff\xff\xff\xff\xcb\xec\xa3\xe0\xff\xff\xff\xff̀K\xe0\xff\xff\xff\xff\xccܢ\xf0\xff\xff\xff\xff͕4\xf0\xff\xff\xff\xff\xcd\xc3K`\xff\xff\xff\xff\xce" +
-	"r\xa2\xe0\xff\xff\xff\xff\xceſp\xff\xff\xff\xff\xcfu\x16\xf0\xff\xff\xff\xffϬg\xe0\xff\xff\xff\xff\xd0R\x84\xe0\xff\xff\xff\xffХ\xa1p\xff\xff\xff\xff\xd1T\xf8\xf0\xff\xff\xff\xffьI\xe0\xff" +
-	"\xff\xff\xff\xd22f\xe0\xff\xff\xff\xff҅\x83p\xff\xff\xff\xff\xd3Y\xc4\xf0\xff\xff\xff\xff\xd4I\xb5\xf0\xff\xff\xff\xff\xd59\xd1 \xff\xff\xff\xff\xd6)\xc2 \xff\xff\xff\xff\xd7\x19\xb3 \xff\xff\xff\xff\xd8" +
-	"\t\xa4 \xff\xff\xff\xff\xd8\xf9\x95 \xff\xff\xff\xff\xd9\xe9\x86 \xff\xff\xff\xff\xda\xd9w \xff\xff\xff\xff\xdb\xc9h \xff\xff\xff\xffܹY \xff\xff\xff\xffݲ\x84\xa0\xff\xff\xff\xffޢu\xa0\xff" +
-	"\xff\xff\xffߒf\xa0\xff\xff\xff\xff\xe0\x82W\xa0\xff\xff\xff\xff\xe1rH\xa0\xff\xff\xff\xff\xe2b9\xa0\xff\xff\xff\xff\xe3R*\xa0\xff\xff\xff\xff\xe4B\x1b\xa0\xff\xff\xff\xff\xe52\f\xa0\xff\xff\xff\xff\xe6" +
-	"!\xfd\xa0\xff\xff\xff\xff\xe7\x1b) \xff\xff\xff\xff\xe8\v\x1a \xff\xff\xff\xff\xe8\xfb\v \xff\xff\xff\xff\xe9\xea\xfc \xff\xff\xff\xff\xea\xda\xed \xff\xff\xff\xff\xeb\xca\xde \xff\xff\xff\xff\xec\xba\xcf \xff" +
-	"\xff\xff\xff\xed\xaa\xc0 \xff\xff\xff\xff\ue6b1 \xff\xff\xff\xff\uf2a2 \xff\xff\xff\xff\xf0z\x93 \xff\xff\xff\xff\xf1j\x84 \xff\xff\xff\xff\xf2c\xaf\xa0\xff\xff\xff\xff\xf3S\xa0\xa0\xff\xff\xff\xff\xf4" +
-	"C\x91\xa0\xff\xff\xff\xff\xf53\x82\xa0\xff\xff\xff\xff\xf6#s\xa0\xff\xff\xff\xff\xf7\x13d\xa0\xff\xff\xff\xff\xf8\x03U\xa0\xff\xff\xff\xff\xf8\xf3F\xa0\x00\x00\x00\x00\f\xab*\x00\x00\x00\x00\x00\r\x9b\x1b\x00\x00" +
-	"\x00\x00\x00\x0e\x8b\f\x00\x00\x00\x00\x00\x0f\x847\x80\x00\x00\x00\x00\x10t(\x80\x00\x00\x00\x00\x11d\x19\x80\x00\x00\x00\x00\x12T\x18\x90\x00\x00\x00\x00\x13C\xfb\x80\x00\x00\x00\x00\x143\xfa\x90\x00\x00\x00\x00\x15" +
-	"#\xeb\x90\x00\x00\x00\x00\x16\x13ܐ\x00\x00\x00\x00\x17\x03͐\x00\x00\x00\x00\x17\xf3\xbe\x90\x00\x00\x00\x00\x18㽠\x00\x00\x00\x00\x19Ӡ\x90\x00\x00\x00\x00\x1aÑ\x90\x00\x00\x00\x00\x1b\xbc\xbd\x10\x00" +
-	"\x00\x00\x00\x1c\xac\xae\x10\x00\x00\x00\x00\x1d\x9c\x9f\x10\x00\x00\x00\x00\x1e\x8c\x90\x10\x00\x00\x00\x00\x1f|\x81\x10\x00\x00\x00\x00 lr\x10\x00\x00\x00\x00!\\c\x10\x00\x00\x00\x00\"LT\x10\x00\x00\x00\x00#" +
-	"<E\x10\x00\x00\x00\x00$,6\x10\x00\x00\x00\x00%\x1c'\x10\x00\x00\x00\x00&\f\x18\x10\x00\x00\x00\x00'\x05C\x90\x00\x00\x00\x00'\xf54\x90\x00\x00\x00\x00(\xe5%\x90\x00\x00\x00\x00)\xd5\x16\x90\x00" +
-	"\x00\x00\x00*\xc5\a\x90\x00\x00\x00\x00+\xb4\xf8\x90\x00\x00\x00\x00,\xa4\xe9\x90\x00\x00\x00\x00-\x94ڐ\x00\x00\x00\x00.\x84ː\x00\x00\x00\x00/t\xbc\x90\x00\x00\x00\x000d\xad\x90\x00\x00\x00\x001" +
-	"]\xd9\x10\x00\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x03\x01\x02\x01\x03\x01\x02\x01\x03\x01\x02\x01" +
-	"\x03\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x04\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x04\x05\x04\x05\x04\x05\x04\x01\xff\xff\xf7c\x00\x00\x00\x00\x0e\x10\x01\x04\x00\x00\x00\x00\x00\t\x00\x00\x1c \x01\r\x00\x00\x0e\x10\x00\x12\x00\x00\x1c \x01\x16" +
-	"LMT\x00WEST\x00WET\x00WEMT\x00CET\x00CEST\x00\nWET0WEST,M3.5.0/1,M10.5.0\nPK\x03\x04\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\xee\xf0BB\xff\x01\x00\x00\xff\x01\x00\x00\x03\x00\x00\x00ROCTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00)\x00\x00\x00\x04\x00\x00" +
-	"\x00\x10\xff\xff\xff\xfft\xce\xf0\x18\xff\xff\xff\xff\xc3UI\x80\xff\xff\xff\xff\xd2TY\x80\xff\xff\xff\xffӋ{\x80\xff\xff\xff\xff\xd4B\xad\xf0\xff\xff\xff\xff\xd5E\"\x00\xff\xff\xff\xff\xd6L\xbf\xf0\xff\xff" +
-	"\xff\xff\xd7<\xbf\x00\xff\xff\xff\xff\xd8\x06fp\xff\xff\xff\xff\xd9\x1d\xf2\x80\xff\xff\xff\xff\xd9\xe7\x99\xf0\xff\xff\xff\xff\xda\xff&\x00\xff\xff\xff\xff\xdb\xc8\xcdp\xff\xff\xff\xff\xdc\xe0Y\x80\xff\xff\xff\xffݪ" +
-	"\x00\xf0\xff\xff\xff\xff\xders\x00\xff\xff\xff\xffߵdp\xff\xff\xff\xff\xe0|\x85\x00\xff\xff\xff\xffᖗ\xf0\xff\xff\xff\xff\xe2]\xb8\x80\xff\xff\xff\xff\xe3w\xcbp\xff\xff\xff\xff\xe4>\xec\x00\xff\xff" +
-	"\xff\xff\xe50 p\xff\xff\xff\xff\xe6!q\x00\xff\xff\xff\xff\xe7\x12\xa5p\xff\xff\xff\xff\xe8\x02\xa4\x80\xff\xff\xff\xff\xe8\xf3\xd8\xf0\xff\xff\xff\xff\xe9\xe3\xd8\x00\xff\xff\xff\xff\xea\xd5\fp\xff\xff\xff\xff\xeb\xc5" +
-	"\v\x80\xff\xff\xff\xff\xec\xb6?\xf0\xff\xff\xff\xff\xed\xf7\xfc\x00\xff\xff\xff\xff\xee\x98\xc4\xf0\xff\xff\xff\xff\xef\xd9/\x80\xff\xff\xff\xff\xf0y\xf8p\x00\x00\x00\x00\a\xfcV\x00\x00\x00\x00\x00\b\xed\x8ap\x00\x00" +
-	"\x00\x00\t݉\x80\x00\x00\x00\x00\nν\xf0\x00\x00\x00\x00\x11ۡ\x80\x00\x00\x00\x00\x12T\xddp\x01\x02\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03" +
-	"\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x00\x00q\xe8\x00\x00\x00\x00p\x80\x00\x04\x00\x00~\x90\x00\b\x00\x00~\x90\x01\fLMT\x00CST\x00JST\x00CDT\x00\nCST-8\nPK" +
-	"\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc7X,Y\x9f\x01\x00\x00\x9f\x01\x00\x00\x03\x00\x00\x00ROKTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1d\x00\x00" +
-	"\x00\x06\x00\x00\x00\x10\xff\xff\xff\xff\x8b\xd7\xf0x\xff\xff\xff\xff\x92\xe6\x16\xf8\xff\xff\xff\xff\xd2C'\xf0\xff\xff\xff\xff\xd7e\x8fp\xff\xff\xff\xff\xd7\xee\x9d`\xff\xff\xff\xff\xd8\xf8\xfap\xff\xff\xff\xff\xd9\xcd" +
-	"-\xe0\xff\xff\xff\xff\xda\u05ca\xf0\xff\xff\xff\xffۭ\x0f\xe0\xff\xff\xff\xff\xdc\xe6\xe2\xf0\xff\xff\xff\xff\u074c\xf1\xe0\xff\xff\xff\xff\xe2O)\xf0\xff\xff\xff\xff\xe4k\xb7\xf8\xff\xff\xff\xff\xe5\x13\x18h\xff\xff" +
-	"\xff\xff\xe6b\x03x\xff\xff\xff\xff\xe7\x11L\xe8\xff\xff\xff\xff\xe8/px\xff\xff\xff\xff\xe8\xe7\xf4h\xff\xff\xff\xff\xea\x0fRx\xff\xff\xff\xff\xea\xc7\xd6h\xff\xff\xff\xff\xeb\xef4x\xff\xff\xff\xff\xec\xa7" +
-	"\xb8h\xff\xff\xff\xff\xed\xcf\x16x\xff\xff\xff\xff\ue1dah\xff\xff\xff\xff\xf05qx\x00\x00\x00\x00 \xa3`\x90\x00\x00\x00\x00!ng\x90\x00\x00\x00\x00\"\x83B\x90\x00\x00\x00\x00#NI\x90\x01\x02" +
-	"\x04\x03\x04\x03\x04\x03\x04\x03\x04\x01\x05\x01\x05\x01\x05\x01\x05\x01\x05\x01\x05\x01\x04\x03\x04\x03\x04\x00\x00w\b\x00\x00\x00\x00w\x88\x00\x04\x00\x00~\x90\x00\b\x00\x00\x8c\xa0\x01\f\x00\x00~\x90\x00\x04\x00\x00\x85" +
-	"\x98\x01\fLMT\x00KST\x00JST\x00KDT\x00\nKST-9\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00F7k\x1c\x00\x01\x00\x00\x00\x01\x00\x00\t\x00\x00\x00Sing" +
-	"aporeTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif" +
-	"2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\b\x00\x00\x00\b\x00\x00\x00 \xff\xff\xff\xff~6S\xa3\xff\xff\xff\xff\x86\x83\x85\xa3\xff\xff\xff\xff" +
-	"\xbagN\x90\xff\xff\xff\xff\xc0\n\xe4`\xff\xff\xff\xffʳ\xe5`\xff\xff\xff\xffˑ_\b\xff\xff\xff\xff\xd2Hm\xf0\x00\x00\x00\x00\x16\x91\xee\x00\x01\x02\x03\x04\x05\x06\x05\a\x00\x00a]\x00\x00\x00\x00" +
-	"a]\x00\x04\x00\x00bp\x00\b\x00\x00g \x01\f\x00\x00g \x00\f\x00\x00ix\x00\x12\x00\x00~\x90\x00\x18\x00\x00p\x80\x00\x1cLMT\x00SMT\x00+07\x00+0720\x00+0" +
-	"730\x00+09\x00+08\x00\n<+08>-8\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\aW\x10Ѱ\x04\x00\x00\xb0\x04\x00\x00\x06\x00\x00\x00TurkeyTZi" +
-	"f2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00s\x00\x00\x00\x06\x00\x00\x00\x19\xff\xff\xff\xffV\xb6\xc8\xd8\xff\xff\xff\xff\x90\x8b\xf5\x98\xff\xff\xff\xff\x9b\f\x17`\xff\xff\xff\xff" +
-	"\x9bվ\xd0\xff\xff\xff\xff\xa2ec\xe0\xff\xff\xff\xff\xa3{\x82P\xff\xff\xff\xff\xa4N\x80`\xff\xff\xff\xff\xa5?\xb4\xd0\xff\xff\xff\xff\xa6%'\xe0\xff\xff\xff\xff\xa7'\x7f\xd0\xff\xff\xff\xff\xaa((`" +
-	"\xff\xff\xff\xff\xaa\xe1\xfd\xd0\xff\xff\xff\xff\xab\xf9\x89\xe0\xff\xff\xff\xff\xac\xc31P\xff\xff\xff\xffȁ?\xe0\xff\xff\xff\xff\xc9\x01\x13P\xff\xff\xff\xff\xc9J\xf5`\xff\xff\xff\xff\xca\u0380P\xff\xff\xff\xff" +
-	"\xcbˮ`\xff\xff\xff\xff\xd2k\tP\xff\xff\xff\xffӢ9`\xff\xff\xff\xff\xd4C\x02P\xff\xff\xff\xff\xd5L\r\xe0\xff\xff\xff\xff\xd6){\xd0\xff\xff\xff\xff\xd7+\xef\xe0\xff\xff\xff\xff\xd8\t]\xd0" +
-	"\xff\xff\xff\xff\xd9\x02\x97`\xff\xff\xff\xff\xd9\xe9?\xd0\xff\xff\xff\xff\xda\xeb\xb3\xe0\xff\xff\xff\xff\xdb\xd2\\P\xff\xff\xff\xff\xdc\xd4\xd0`\xff\xff\xff\xffݲ>P\xff\xff\xff\xff\xf1\xf4\xb9`\xff\xff\xff\xff" +
-	"\xf4b\xefP\xff\xff\xff\xff\xf5h\x06`\xff\xff\xff\xff\xf6\x1f8\xd0\x00\x00\x00\x00\x06n\x93p\x00\x00\x00\x00\a9\x9ap\x00\x00\x00\x00\a\xfbu\x00\x00\x00\x00\x00\t\x19|p\x00\x00\x00\x00\t\xd0\xcb\x00" +
-	"\x00\x00\x00\x00\n\xf9^p\x00\x00\x00\x00\v\xb1\xfe\x80\x00\x00\x00\x00\f\xd9@p\x00\x00\x00\x00\r\xa4U\x80\x00\x00\x00\x00\x0e\xa6\xadp\x00\x00\x00\x00\x0f\x847\x80\x00\x00\x00\x00\x0f\xf8\x11P\x00\x00\x00\x00" +
-	"\x19\x89\xb0p\x00\x00\x00\x00\x19ܰ\xe0\x00\x00\x00\x00\x1b\xe6\xd0\xf0\x00\x00\x00\x00\x1c\xc6\xef\xf0\x00\x00\x00\x00\x1d\x9b1p\x00\x00\x00\x00\x1e\x8cs\xf0\x00\x00\x00\x00\x1f|d\xf0\x00\x00\x00\x00 lU\xf0" +
-	"\x00\x00\x00\x00!\\F\xf0\x00\x00\x00\x00\"L7\xf0\x00\x00\x00\x00#<(\xf0\x00\x00\x00\x00$,\x19\xf0\x00\x00\x00\x00%\x1c\n\xf0\x00\x00\x00\x00&\v\xfb\xf0\x00\x00\x00\x00'\x05'p\x00\x00\x00\x00" +
-	"'\xf5\x18p\x00\x00\x00\x00(\xe5\tp\x00\x00\x00\x00)\xd4\xfap\x00\x00\x00\x00*\xc4\xebp\x00\x00\x00\x00+\xb4\xdcp\x00\x00\x00\x00,\xa4\xcdp\x00\x00\x00\x00-\x8b\x83\xf0\x00\x00\x00\x00.\x84\xafp" +
-	"\x00\x00\x00\x00/t\xa0p\x00\x00\x00\x000d\x91p\x00\x00\x00\x001]\xbc\xf0\x00\x00\x00\x002r\x97\xf0\x00\x00\x00\x003=\x9e\xf0\x00\x00\x00\x004Ry\xf0\x00\x00\x00\x005\x1d\x80\xf0\x00\x00\x00\x00" +
-	"62[\xf0\x00\x00\x00\x006\xfdb\xf0\x00\x00\x00\x008\x1bxp\x00\x00\x00\x008\xddD\xf0\x00\x00\x00\x009\xfbZp\x00\x00\x00\x00:\xbd&\xf0\x00\x00\x00\x00;\xdb<p\x00\x00\x00\x00<\xa6Cp" +
-	"\x00\x00\x00\x00=\xbb\x1ep\x00\x00\x00\x00>\x86%p\x00\x00\x00\x00?\x9b\x00p\x00\x00\x00\x00@f\ap\x00\x00\x00\x00A\x84\x1c\xf0\x00\x00\x00\x00BE\xe9p\x00\x00\x00\x00Cc\xfe\xf0\x00\x00\x00\x00" +
-	"D%\xcbp\x00\x00\x00\x00EC\xe0\xf0\x00\x00\x00\x00F\x05ɐ\x00\x00\x00\x00G#\xdf\x10\x00\x00\x00\x00G\xee\xe6\x10\x00\x00\x00\x00I\x03\xc1\x10\x00\x00\x00\x00I\xce\xc8\x10\x00\x00\x00\x00J\xe3\xa3\x10" +
-	"\x00\x00\x00\x00K\xae\xaa\x10\x00\x00\x00\x00L̿\x90\x00\x00\x00\x00M\x8fݐ\x00\x00\x00\x00N\xac\xa1\x90\x00\x00\x00\x00Onn\x10\x00\x00\x00\x00P\x8c\x83\x90\x00\x00\x00\x00QW\x8a\x90\x00\x00\x00\x00" +
-	"Rle\x90\x00\x00\x00\x00S8\xbe\x10\x00\x00\x00\x00TLG\x90\x00\x00\x00\x00U\x17N\x90\x00\x00\x00\x00V>\x9e\x90\x00\x00\x00\x00V\xf70\x90\x00\x00\x00\x00W\xcf.P\x01\x03\x02\x03\x02\x03\x02\x03" +
-	"\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x04\x05\x04\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02" +
-	"\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x04\x00\x00\x1b(\x00\x00\x00\x00\x1bh\x00\x04\x00" +
-	"\x00*0\x01\b\x00\x00\x1c \x00\r\x00\x00*0\x00\x11\x00\x008@\x01\x15LMT\x00IMT\x00EEST\x00EET\x00+03\x00+04\x00\n<+03>-3\nPK\x03" +
-	"\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00\x03\x00\x00\x00UCTTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x01\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00UTC\x00\nUTC0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x005\x11Q\x06\xd1\x03\x00\x00\xd1\x03\x00\x00\t\x00\x00\x00US/Alaska" +
-	"TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00T\x00\x00\x00\n\x00\x00\x00(\xff\xff\xff\xff?\xc2\xfd\xd1\xff\xff\xff\xff}\x87AH\xff\xff\xff\xffˉ6\xc0\xff" +
-	"\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2aB0\xff\xff\xff\xff\xfa\xd2G\xa0\xff\xff\xff\xff\xfe\xb8c@\xff\xff\xff\xff\xff\xa8F0\x00\x00\x00\x00\x00\x98E@\x00\x00\x00\x00\x01\x88(0\x00\x00\x00\x00\x02" +
-	"x'@\x00\x00\x00\x00\x03qD\xb0\x00\x00\x00\x00\x04aC\xc0\x00\x00\x00\x00\x05Q&\xb0\x00\x00\x00\x00\x06A%\xc0\x00\x00\x00\x00\a1\b\xb0\x00\x00\x00\x00\a\x8d_\xc0\x00\x00\x00\x00\t\x10\xea\xb0\x00" +
-	"\x00\x00\x00\t\xad\xdb@\x00\x00\x00\x00\n\xf0̰\x00\x00\x00\x00\v\xe0\xcb\xc0\x00\x00\x00\x00\f\xd9\xe90\x00\x00\x00\x00\r\xc0\xad\xc0\x00\x00\x00\x00\x0e\xb9\xcb0\x00\x00\x00\x00\x0f\xa9\xca@\x00\x00\x00\x00\x10" +
-	"\x99\xad0\x00\x00\x00\x00\x11\x89\xac@\x00\x00\x00\x00\x12y\x8f0\x00\x00\x00\x00\x13i\x8e@\x00\x00\x00\x00\x14Yq0\x00\x00\x00\x00\x15Ip@\x00\x00\x00\x00\x169S0\x00\x00\x00\x00\x17)R@\x00" +
-	"\x00\x00\x00\x18\"o\xb0\x00\x00\x00\x00\x19\t4@\x00\x00\x00\x00\x1a\x02Q\xb0\x00\x00\x00\x00\x1a+\x14\x10\x00\x00\x00\x00\x1a\xf2B\xb0\x00\x00\x00\x00\x1b\xe2%\xa0\x00\x00\x00\x00\x1c\xd2$\xb0\x00\x00\x00\x00\x1d" +
-	"\xc2\a\xa0\x00\x00\x00\x00\x1e\xb2\x06\xb0\x00\x00\x00\x00\x1f\xa1\xe9\xa0\x00\x00\x00\x00 v90\x00\x00\x00\x00!\x81ˠ\x00\x00\x00\x00\"V\x1b0\x00\x00\x00\x00#j\xe8 \x00\x00\x00\x00$5\xfd0\x00" +
-	"\x00\x00\x00%J\xca \x00\x00\x00\x00&\x15\xdf0\x00\x00\x00\x00'*\xac \x00\x00\x00\x00'\xfe\xfb\xb0\x00\x00\x00\x00)\n\x8e \x00\x00\x00\x00)\xdeݰ\x00\x00\x00\x00*\xeap \x00\x00\x00\x00+" +
-	"\xbe\xbf\xb0\x00\x00\x00\x00,ӌ\xa0\x00\x00\x00\x00-\x9e\xa1\xb0\x00\x00\x00\x00.\xb3n\xa0\x00\x00\x00\x00/~\x83\xb0\x00\x00\x00\x000\x93P\xa0\x00\x00\x00\x001g\xa00\x00\x00\x00\x002s2\xa0\x00" +
-	"\x00\x00\x003G\x820\x00\x00\x00\x004S\x14\xa0\x00\x00\x00\x005'd0\x00\x00\x00\x0062\xf6\xa0\x00\x00\x00\x007\aF0\x00\x00\x00\x008\x1c\x13 \x00\x00\x00\x008\xe7(0\x00\x00\x00\x009" +
-	"\xfb\xf5 \x00\x00\x00\x00:\xc7\n0\x00\x00\x00\x00;\xdb\xd7 \x00\x00\x00\x00<\xb0&\xb0\x00\x00\x00\x00=\xbb\xb9 \x00\x00\x00\x00>\x90\b\xb0\x00\x00\x00\x00?\x9b\x9b \x00\x00\x00\x00@o\xea\xb0\x00" +
-	"\x00\x00\x00A\x84\xb7\xa0\x00\x00\x00\x00BO̰\x00\x00\x00\x00Cd\x99\xa0\x00\x00\x00\x00D/\xae\xb0\x00\x00\x00\x00ED{\xa0\x00\x00\x00\x00E\xf3\xe10\x01\x02\x03\x04\x02\x05\x06\x05\x06\x05\x06\x05\x06" +
-	"\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\a\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t" +
-	"\b\t\b\t\b\t\b\t\b\t\b\x00\x00\xc4\xf8\x00\x00\xff\xffsx\x00\x00\xff\xffs`\x00\x04\xff\xff\x81p\x01\b\xff\xff\x81p\x01\f\xff\xffs`\x00\x10\xff\xff\x81p\x01\x15\xff\xff\x81p\x00\x1a\xff" +
-	"\xff\x8f\x80\x01\x1e\xff\xff\x81p\x00#LMT\x00AST\x00AWT\x00APT\x00AHST\x00AHDT\x00YST\x00AKDT\x00AKST\x00\nAKST9AKD" +
-	"T,M3.2.0,M11.1.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xae,\xa44\xc9\x03\x00\x00\xc9\x03\x00\x00\v\x00\x00\x00US/AleutianTZ" +
-	"if2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00T\x00\x00\x00\n\x00\x00\x00!\xff\xff\xff\xff?\xc2\xfd\xd1\xff\xff\xff\xff}\x87Z^\xff\xff\xff\xffˉD\xd0\xff\xff\xff" +
-	"\xff\xd2#\xf4p\xff\xff\xff\xff\xd2aP@\xff\xff\xff\xff\xfa\xd2U\xb0\xff\xff\xff\xff\xfe\xb8qP\xff\xff\xff\xff\xff\xa8T@\x00\x00\x00\x00\x00\x98SP\x00\x00\x00\x00\x01\x886@\x00\x00\x00\x00\x02x5" +
-	"P\x00\x00\x00\x00\x03qR\xc0\x00\x00\x00\x00\x04aQ\xd0\x00\x00\x00\x00\x05Q4\xc0\x00\x00\x00\x00\x06A3\xd0\x00\x00\x00\x00\a1\x16\xc0\x00\x00\x00\x00\a\x8dm\xd0\x00\x00\x00\x00\t\x10\xf8\xc0\x00\x00\x00" +
-	"\x00\t\xad\xe9P\x00\x00\x00\x00\n\xf0\xda\xc0\x00\x00\x00\x00\v\xe0\xd9\xd0\x00\x00\x00\x00\f\xd9\xf7@\x00\x00\x00\x00\r\xc0\xbb\xd0\x00\x00\x00\x00\x0e\xb9\xd9@\x00\x00\x00\x00\x0f\xa9\xd8P\x00\x00\x00\x00\x10\x99\xbb" +
-	"@\x00\x00\x00\x00\x11\x89\xbaP\x00\x00\x00\x00\x12y\x9d@\x00\x00\x00\x00\x13i\x9cP\x00\x00\x00\x00\x14Y\x7f@\x00\x00\x00\x00\x15I~P\x00\x00\x00\x00\x169a@\x00\x00\x00\x00\x17)`P\x00\x00\x00" +
-	"\x00\x18\"}\xc0\x00\x00\x00\x00\x19\tBP\x00\x00\x00\x00\x1a\x02_\xc0\x00\x00\x00\x00\x1a+\" \x00\x00\x00\x00\x1a\xf2P\xc0\x00\x00\x00\x00\x1b\xe23\xb0\x00\x00\x00\x00\x1c\xd22\xc0\x00\x00\x00\x00\x1d\xc2\x15" +
-	"\xb0\x00\x00\x00\x00\x1e\xb2\x14\xc0\x00\x00\x00\x00\x1f\xa1\xf7\xb0\x00\x00\x00\x00 vG@\x00\x00\x00\x00!\x81ٰ\x00\x00\x00\x00\"V)@\x00\x00\x00\x00#j\xf60\x00\x00\x00\x00$6\v@\x00\x00\x00" +
-	"\x00%J\xd80\x00\x00\x00\x00&\x15\xed@\x00\x00\x00\x00'*\xba0\x00\x00\x00\x00'\xff\t\xc0\x00\x00\x00\x00)\n\x9c0\x00\x00\x00\x00)\xde\xeb\xc0\x00\x00\x00\x00*\xea~0\x00\x00\x00\x00+\xbe\xcd" +
-	"\xc0\x00\x00\x00\x00,Ӛ\xb0\x00\x00\x00\x00-\x9e\xaf\xc0\x00\x00\x00\x00.\xb3|\xb0\x00\x00\x00\x00/~\x91\xc0\x00\x00\x00\x000\x93^\xb0\x00\x00\x00\x001g\xae@\x00\x00\x00\x002s@\xb0\x00\x00\x00" +
-	"\x003G\x90@\x00\x00\x00\x004S\"\xb0\x00\x00\x00\x005'r@\x00\x00\x00\x0063\x04\xb0\x00\x00\x00\x007\aT@\x00\x00\x00\x008\x1c!0\x00\x00\x00\x008\xe76@\x00\x00\x00\x009\xfc\x03" +
-	"0\x00\x00\x00\x00:\xc7\x18@\x00\x00\x00\x00;\xdb\xe50\x00\x00\x00\x00<\xb04\xc0\x00\x00\x00\x00=\xbb\xc70\x00\x00\x00\x00>\x90\x16\xc0\x00\x00\x00\x00?\x9b\xa90\x00\x00\x00\x00@o\xf8\xc0\x00\x00\x00" +
-	"\x00A\x84Ű\x00\x00\x00\x00BO\xda\xc0\x00\x00\x00\x00Cd\xa7\xb0\x00\x00\x00\x00D/\xbc\xc0\x00\x00\x00\x00ED\x89\xb0\x00\x00\x00\x00E\xf3\xef@\x01\x02\x03\x04\x02\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06" +
-	"\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\a\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t\b\t" +
-	"\b\t\b\t\b\t\b\t\b\x00\x00\xab\xe2\x00\x00\xff\xffZb\x00\x00\xff\xffeP\x00\x04\xff\xffs`\x01\b\xff\xffs`\x01\f\xff\xffeP\x00\x10\xff\xffs`\x01\x14\xff\xffs`\x00\x18\xff\xff\x81" +
-	"p\x01\x1d\xff\xffs`\x00\x19LMT\x00NST\x00NWT\x00NPT\x00BST\x00BDT\x00AHST\x00HDT\x00\nHST10HDT,M3.2.0,M" +
-	"11.1.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00ø\xab\x9b\xf0\x00\x00\x00\xf0\x00\x00\x00\n\x00\x00\x00US/ArizonaTZif2\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\v\x00\x00\x00\x04\x00\x00\x00\x10\xff\xff\xff\xff^\x04\f\xb0\xff\xff\xff\xff\x9e\xa6:\x90\xff\xff\xff\xff\x9f\xbb\a\x80\xff\xff\xff\xff\xa0\x86\x1c\x90\xff\xff\xff\xff\xa1\x9a" +
-	"\xe9\x80\xff\xff\xff\xffˉ\f\x90\xff\xff\xff\xff\xcf\x17\xdf\x1c\xff\xff\xff\xffϏ\xe5\xac\xff\xff\xff\xffЁ\x1a\x1c\xff\xff\xff\xff\xfa\xf8u\x10\xff\xff\xff\xff\xfb\xe8X\x00\x02\x01\x02\x01\x02\x03\x02\x03\x02\x01" +
-	"\x02\xff\xff\x96\xee\x00\x00\xff\xff\xab\xa0\x01\x04\xff\xff\x9d\x90\x00\b\xff\xff\xab\xa0\x01\fLMT\x00MDT\x00MST\x00MWT\x00\nMST7\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x9bܩ=\xda\x06\x00\x00\xda\x06\x00\x00\n\x00\x00\x00US/CentralTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaf\x00\x00\x00\x06\x00\x00" +
-	"\x00\x18\xff\xff\xff\xff^\x03\xfe\xa0\xff\xff\xff\xff\x9e\xa6,\x80\xff\xff\xff\xff\x9f\xba\xf9p\xff\xff\xff\xff\xa0\x86\x0e\x80\xff\xff\xff\xff\xa1\x9a\xdbp\xff\xff\xff\xff\xa2\xcbt\x00\xff\xff\xff\xff\xa3\x83\xf7\xf0\xff\xff" +
-	"\xff\xff\xa4EҀ\xff\xff\xff\xff\xa5c\xd9\xf0\xff\xff\xff\xff\xa6S\xd9\x00\xff\xff\xff\xff\xa7\x15\x97p\xff\xff\xff\xff\xa83\xbb\x00\xff\xff\xff\xff\xa8\xfe\xb3\xf0\xff\xff\xff\xff\xaa\x13\x9d\x00\xff\xff\xff\xff\xaa\xde" +
-	"\x95\xf0\xff\xff\xff\xff\xab\xf3\x7f\x00\xff\xff\xff\xff\xac\xbew\xf0\xff\xff\xff\xff\xad\xd3a\x00\xff\xff\xff\xff\xae\x9eY\xf0\xff\xff\xff\xff\xaf\xb3C\x00\xff\xff\xff\xff\xb0~;\xf0\xff\xff\xff\xff\xb1\x9c_\x80\xff\xff" +
-	"\xff\xff\xb2gXp\xff\xff\xff\xff\xb3|A\x80\xff\xff\xff\xff\xb4G:p\xff\xff\xff\xff\xb5\\#\x80\xff\xff\xff\xff\xb6'\x1cp\xff\xff\xff\xff\xb7<\x05\x80\xff\xff\xff\xff\xb8\x06\xfep\xff\xff\xff\xff\xb9\x1b" +
-	"\xe7\x80\xff\xff\xff\xff\xb9\xe6\xe0p\xff\xff\xff\xff\xbb\x05\x04\x00\xff\xff\xff\xff\xbb\xc6\xc2p\xff\xff\xff\xff\xbc\xe4\xe6\x00\xff\xff\xff\xff\xbd\xaf\xde\xf0\xff\xff\xff\xff\xbe\xc4\xc8\x00\xff\xff\xff\xff\xbf\x8f\xc0\xf0\xff\xff" +
-	"\xff\xff\xc0Z\xd6\x00\xff\xff\xff\xff\xc1\xb0<p\xff\xff\xff\xff\u0084\x8c\x00\xff\xff\xff\xff\xc3O\x84\xf0\xff\xff\xff\xff\xc4dn\x00\xff\xff\xff\xff\xc5/f\xf0\xff\xff\xff\xff\xc6M\x8a\x80\xff\xff\xff\xff\xc7\x0f" +
-	"H\xf0\xff\xff\xff\xff\xc8-l\x80\xff\xff\xff\xff\xc8\xf8ep\xff\xff\xff\xff\xca\rN\x80\xff\xff\xff\xff\xca\xd8Gp\xff\xff\xff\xffˈ\xfe\x80\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2a\t\xf0\xff\xff" +
-	"\xff\xff\xd3u\xf3\x00\xff\xff\xff\xff\xd4@\xeb\xf0\xff\xff\xff\xff\xd5U\xd5\x00\xff\xff\xff\xff\xd6 \xcd\xf0\xff\xff\xff\xff\xd75\xb7\x00\xff\xff\xff\xff\xd8\x00\xaf\xf0\xff\xff\xff\xff\xd9\x15\x99\x00\xff\xff\xff\xff\xd9\xe0" +
-	"\x91\xf0\xff\xff\xff\xff\xda\xfe\xb5\x80\xff\xff\xff\xff\xdb\xc0s\xf0\xff\xff\xff\xff\xdcޗ\x80\xff\xff\xff\xffݩ\x90p\xff\xff\xff\xff\u07bey\x80\xff\xff\xff\xff߉rp\xff\xff\xff\xff\xe0\x9e[\x80\xff\xff" +
-	"\xff\xff\xe1iTp\xff\xff\xff\xff\xe2~=\x80\xff\xff\xff\xff\xe3I6p\xff\xff\xff\xff\xe4^\x1f\x80\xff\xff\xff\xff\xe5W<\xf0\xff\xff\xff\xff\xe6G<\x00\xff\xff\xff\xff\xe77\x1e\xf0\xff\xff\xff\xff\xe8'" +
-	"\x1e\x00\xff\xff\xff\xff\xe9\x17\x00\xf0\xff\xff\xff\xff\xea\a\x00\x00\xff\xff\xff\xff\xea\xf6\xe2\xf0\xff\xff\xff\xff\xeb\xe6\xe2\x00\xff\xff\xff\xff\xec\xd6\xc4\xf0\xff\xff\xff\xff\xed\xc6\xc4\x00\xff\xff\xff\xff\xee\xbf\xe1p\xff\xff" +
-	"\xff\xff\xef\xaf\xe0\x80\xff\xff\xff\xff\xf0\x9f\xc3p\xff\xff\xff\xff\xf1\x8f\u0080\xff\xff\xff\xff\xf2\x7f\xa5p\xff\xff\xff\xff\xf3o\xa4\x80\xff\xff\xff\xff\xf4_\x87p\xff\xff\xff\xff\xf5O\x86\x80\xff\xff\xff\xff\xf6?" +
-	"ip\xff\xff\xff\xff\xf7/h\x80\xff\xff\xff\xff\xf8(\x85\xf0\xff\xff\xff\xff\xf9\x0fJ\x80\xff\xff\xff\xff\xfa\bg\xf0\xff\xff\xff\xff\xfa\xf8g\x00\xff\xff\xff\xff\xfb\xe8I\xf0\xff\xff\xff\xff\xfc\xd8I\x00\xff\xff" +
-	"\xff\xff\xfd\xc8+\xf0\xff\xff\xff\xff\xfe\xb8+\x00\xff\xff\xff\xff\xff\xa8\r\xf0\x00\x00\x00\x00\x00\x98\r\x00\x00\x00\x00\x00\x01\x87\xef\xf0\x00\x00\x00\x00\x02w\xef\x00\x00\x00\x00\x00\x03q\fp\x00\x00\x00\x00\x04a" +
-	"\v\x80\x00\x00\x00\x00\x05P\xeep\x00\x00\x00\x00\x06@\xed\x80\x00\x00\x00\x00\a0\xd0p\x00\x00\x00\x00\a\x8d'\x80\x00\x00\x00\x00\t\x10\xb2p\x00\x00\x00\x00\t\xad\xa3\x00\x00\x00\x00\x00\n\xf0\x94p\x00\x00" +
-	"\x00\x00\v\xe0\x93\x80\x00\x00\x00\x00\fٰ\xf0\x00\x00\x00\x00\r\xc0u\x80\x00\x00\x00\x00\x0e\xb9\x92\xf0\x00\x00\x00\x00\x0f\xa9\x92\x00\x00\x00\x00\x00\x10\x99t\xf0\x00\x00\x00\x00\x11\x89t\x00\x00\x00\x00\x00\x12y" +
-	"V\xf0\x00\x00\x00\x00\x13iV\x00\x00\x00\x00\x00\x14Y8\xf0\x00\x00\x00\x00\x15I8\x00\x00\x00\x00\x00\x169\x1a\xf0\x00\x00\x00\x00\x17)\x1a\x00\x00\x00\x00\x00\x18\"7p\x00\x00\x00\x00\x19\b\xfc\x00\x00\x00" +
-	"\x00\x00\x1a\x02\x19p\x00\x00\x00\x00\x1a\xf2\x18\x80\x00\x00\x00\x00\x1b\xe1\xfbp\x00\x00\x00\x00\x1c\xd1\xfa\x80\x00\x00\x00\x00\x1d\xc1\xddp\x00\x00\x00\x00\x1e\xb1܀\x00\x00\x00\x00\x1f\xa1\xbfp\x00\x00\x00\x00 v" +
-	"\x0f\x00\x00\x00\x00\x00!\x81\xa1p\x00\x00\x00\x00\"U\xf1\x00\x00\x00\x00\x00#j\xbd\xf0\x00\x00\x00\x00$5\xd3\x00\x00\x00\x00\x00%J\x9f\xf0\x00\x00\x00\x00&\x15\xb5\x00\x00\x00\x00\x00'*\x81\xf0\x00\x00" +
-	"\x00\x00'\xfeр\x00\x00\x00\x00)\nc\xf0\x00\x00\x00\x00)\u07b3\x80\x00\x00\x00\x00*\xeaE\xf0\x00\x00\x00\x00+\xbe\x95\x80\x00\x00\x00\x00,\xd3bp\x00\x00\x00\x00-\x9ew\x80\x00\x00\x00\x00.\xb3" +
-	"Dp\x00\x00\x00\x00/~Y\x80\x00\x00\x00\x000\x93&p\x00\x00\x00\x001gv\x00\x00\x00\x00\x002s\bp\x00\x00\x00\x003GX\x00\x00\x00\x00\x004R\xeap\x00\x00\x00\x005':\x00\x00\x00" +
-	"\x00\x0062\xccp\x00\x00\x00\x007\a\x1c\x00\x00\x00\x00\x008\x1b\xe8\xf0\x00\x00\x00\x008\xe6\xfe\x00\x00\x00\x00\x009\xfb\xca\xf0\x00\x00\x00\x00:\xc6\xe0\x00\x00\x00\x00\x00;۬\xf0\x00\x00\x00\x00<\xaf" +
-	"\xfc\x80\x00\x00\x00\x00=\xbb\x8e\xf0\x00\x00\x00\x00>\x8fހ\x00\x00\x00\x00?\x9bp\xf0\x00\x00\x00\x00@o\xc0\x80\x00\x00\x00\x00A\x84\x8dp\x00\x00\x00\x00BO\xa2\x80\x00\x00\x00\x00Cdop\x00\x00" +
-	"\x00\x00D/\x84\x80\x00\x00\x00\x00EDQp\x00\x00\x00\x00E\xf3\xb7\x00\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x03" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x04\x05\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\xff\xff\xad\xd4\x00\x00\xff\xff\xb9\xb0\x01\x04\xff\xff\xab\xa0\x00\b\xff\xff\xb9\xb0\x00\f\xff\xff\xb9\xb0\x01\x10\xff\xff\xb9\xb0\x01\x14LMT\x00CDT" +
-	"\x00CST\x00EST\x00CWT\x00CPT\x00\nCST6CDT,M3.2.0,M11.1.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00p\xb6{\xc9\x13" +
-	"\x02\x00\x00\x13\x02\x00\x00\x0f\x00\x00\x00US/East-IndianaTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00&\x00\x00\x00\a\x00\x00\x00" +
-	"\x1c\xff\xff\xff\xff^\x03\xfe\xa0\xff\xff\xff\xff\x9e\xa6,\x80\xff\xff\xff\xff\x9f\xba\xf9p\xff\xff\xff\xff\xa0\x86\x0e\x80\xff\xff\xff\xff\xa1\x9a\xdbp\xff\xff\xff\xff\xcaW\"\x80\xff\xff\xff\xff\xca\xd8Gp\xff\xff\xff" +
-	"\xffˈ\xfe\x80\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2a\t\xf0\xff\xff\xff\xff\xd3u\xf3\x00\xff\xff\xff\xff\xd4@\xeb\xf0\xff\xff\xff\xff\xd5U\xd5\x00\xff\xff\xff\xff\xd6 \xcd\xf0\xff\xff\xff\xff\xd75\xb7" +
-	"\x00\xff\xff\xff\xff\xd8\x00\xaf\xf0\xff\xff\xff\xff\xd9\x15\x99\x00\xff\xff\xff\xff\xd9\xe0\x91\xf0\xff\xff\xff\xff\xda\xfe\xb5\x80\xff\xff\xff\xff\xdb\xc0s\xf0\xff\xff\xff\xff\xdcޗ\x80\xff\xff\xff\xffݩ\x90p\xff\xff\xff" +
-	"\xff\u07bey\x80\xff\xff\xff\xff߉rp\xff\xff\xff\xff\xe0\x9e[\x80\xff\xff\xff\xff\xe1iTp\xff\xff\xff\xff\xe2~=\x80\xff\xff\xff\xff\xe3I6p\xff\xff\xff\xff\xe4^\x1f\x80\xff\xff\xff\xff\xe8\xf2\x16" +
-	"\xf0\xff\xff\xff\xff\xea\a\x00\x00\xff\xff\xff\xff\xfe\xb8\x1c\xf0\xff\xff\xff\xff\xff\xa7\xff\xe0\x00\x00\x00\x00\x00\x97\xfe\xf0\x00\x00\x00\x00\x01\x87\xe1\xe0\x00\x00\x00\x00D/vp\x00\x00\x00\x00EDC`\x00\x00\x00" +
-	"\x00E\xf3\xa8\xf0\x02\x01\x02\x01\x02\x01\x02\x03\x04\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x05\x02\x05\x06\x05\x06\x05\x06\x05\x06\xff\xff\xaf:\x00\x00\xff\xff\xb9\xb0\x01\x04\xff\xff\xab\xa0\x00" +
-	"\b\xff\xff\xb9\xb0\x01\f\xff\xff\xb9\xb0\x01\x10\xff\xff\xb9\xb0\x00\x14\xff\xff\xc7\xc0\x01\x18LMT\x00CDT\x00CST\x00CWT\x00CPT\x00EST\x00EDT\x00\nEST5ED" +
-	"T,M3.2.0,M11.1.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x003\x9aG\xc8\xd0\x06\x00\x00\xd0\x06\x00\x00\n\x00\x00\x00US/EasternTZi" +
-	"f2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaf\x00\x00\x00\x05\x00\x00\x00\x14\xff\xff\xff\xff^\x03\xf0\x90\xff\xff\xff\xff\x9e\xa6\x1ep\xff\xff\xff\xff\x9f\xba\xeb`\xff\xff\xff\xff" +
-	"\xa0\x86\x00p\xff\xff\xff\xff\xa1\x9a\xcd`\xff\xff\xff\xff\xa2e\xe2p\xff\xff\xff\xff\xa3\x83\xe9\xe0\xff\xff\xff\xff\xa4j\xaep\xff\xff\xff\xff\xa55\xa7`\xff\xff\xff\xff\xa6S\xca\xf0\xff\xff\xff\xff\xa7\x15\x89`" +
-	"\xff\xff\xff\xff\xa83\xac\xf0\xff\xff\xff\xff\xa8\xfe\xa5\xe0\xff\xff\xff\xff\xaa\x13\x8e\xf0\xff\xff\xff\xff\xaaއ\xe0\xff\xff\xff\xff\xab\xf3p\xf0\xff\xff\xff\xff\xac\xbei\xe0\xff\xff\xff\xff\xad\xd3R\xf0\xff\xff\xff\xff" +
-	"\xae\x9eK\xe0\xff\xff\xff\xff\xaf\xb34\xf0\xff\xff\xff\xff\xb0~-\xe0\xff\xff\xff\xff\xb1\x9cQp\xff\xff\xff\xff\xb2gJ`\xff\xff\xff\xff\xb3|3p\xff\xff\xff\xff\xb4G,`\xff\xff\xff\xff\xb5\\\x15p" +
-	"\xff\xff\xff\xff\xb6'\x0e`\xff\xff\xff\xff\xb7;\xf7p\xff\xff\xff\xff\xb8\x06\xf0`\xff\xff\xff\xff\xb9\x1b\xd9p\xff\xff\xff\xff\xb9\xe6\xd2`\xff\xff\xff\xff\xbb\x04\xf5\xf0\xff\xff\xff\xff\xbbƴ`\xff\xff\xff\xff" +
-	"\xbc\xe4\xd7\xf0\xff\xff\xff\xff\xbd\xaf\xd0\xe0\xff\xff\xff\xff\xbeĹ\xf0\xff\xff\xff\xff\xbf\x8f\xb2\xe0\xff\xff\xff\xff\xc0\xa4\x9b\xf0\xff\xff\xff\xff\xc1o\x94\xe0\xff\xff\xff\xff\u0084}\xf0\xff\xff\xff\xff\xc3Ov\xe0" +
-	"\xff\xff\xff\xff\xc4d_\xf0\xff\xff\xff\xff\xc5/X\xe0\xff\xff\xff\xff\xc6M|p\xff\xff\xff\xff\xc7\x0f:\xe0\xff\xff\xff\xff\xc8-^p\xff\xff\xff\xff\xc8\xf8W`\xff\xff\xff\xff\xca\r@p\xff\xff\xff\xff" +
-	"\xca\xd89`\xff\xff\xff\xffˈ\xf0p\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2`\xfb\xe0\xff\xff\xff\xff\xd3u\xe4\xf0\xff\xff\xff\xff\xd4@\xdd\xe0\xff\xff\xff\xff\xd5U\xc6\xf0\xff\xff\xff\xff\xd6 \xbf\xe0" +
-	"\xff\xff\xff\xff\xd75\xa8\xf0\xff\xff\xff\xff\xd8\x00\xa1\xe0\xff\xff\xff\xff\xd9\x15\x8a\xf0\xff\xff\xff\xff\xd9\xe0\x83\xe0\xff\xff\xff\xff\xda\xfe\xa7p\xff\xff\xff\xff\xdb\xc0e\xe0\xff\xff\xff\xff\xdcމp\xff\xff\xff\xff" +
-	"ݩ\x82`\xff\xff\xff\xff\u07bekp\xff\xff\xff\xff߉d`\xff\xff\xff\xff\xe0\x9eMp\xff\xff\xff\xff\xe1iF`\xff\xff\xff\xff\xe2~/p\xff\xff\xff\xff\xe3I(`\xff\xff\xff\xff\xe4^\x11p" +
-	"\xff\xff\xff\xff\xe5W.\xe0\xff\xff\xff\xff\xe6G-\xf0\xff\xff\xff\xff\xe77\x10\xe0\xff\xff\xff\xff\xe8'\x0f\xf0\xff\xff\xff\xff\xe9\x16\xf2\xe0\xff\xff\xff\xff\xea\x06\xf1\xf0\xff\xff\xff\xff\xea\xf6\xd4\xe0\xff\xff\xff\xff" +
-	"\xeb\xe6\xd3\xf0\xff\xff\xff\xff\xecֶ\xe0\xff\xff\xff\xff\xedƵ\xf0\xff\xff\xff\xff\xee\xbf\xd3`\xff\xff\xff\xff\xef\xaf\xd2p\xff\xff\xff\xff\xf0\x9f\xb5`\xff\xff\xff\xff\xf1\x8f\xb4p\xff\xff\xff\xff\xf2\x7f\x97`" +
-	"\xff\xff\xff\xff\xf3o\x96p\xff\xff\xff\xff\xf4_y`\xff\xff\xff\xff\xf5Oxp\xff\xff\xff\xff\xf6?[`\xff\xff\xff\xff\xf7/Zp\xff\xff\xff\xff\xf8(w\xe0\xff\xff\xff\xff\xf9\x0f<p\xff\xff\xff\xff" +
-	"\xfa\bY\xe0\xff\xff\xff\xff\xfa\xf8X\xf0\xff\xff\xff\xff\xfb\xe8;\xe0\xff\xff\xff\xff\xfc\xd8:\xf0\xff\xff\xff\xff\xfd\xc8\x1d\xe0\xff\xff\xff\xff\xfe\xb8\x1c\xf0\xff\xff\xff\xff\xff\xa7\xff\xe0\x00\x00\x00\x00\x00\x97\xfe\xf0" +
-	"\x00\x00\x00\x00\x01\x87\xe1\xe0\x00\x00\x00\x00\x02w\xe0\xf0\x00\x00\x00\x00\x03p\xfe`\x00\x00\x00\x00\x04`\xfdp\x00\x00\x00\x00\x05P\xe0`\x00\x00\x00\x00\x06@\xdfp\x00\x00\x00\x00\a0\xc2`\x00\x00\x00\x00" +
-	"\a\x8d\x19p\x00\x00\x00\x00\t\x10\xa4`\x00\x00\x00\x00\t\xad\x94\xf0\x00\x00\x00\x00\n\xf0\x86`\x00\x00\x00\x00\v\xe0\x85p\x00\x00\x00\x00\f٢\xe0\x00\x00\x00\x00\r\xc0gp\x00\x00\x00\x00\x0e\xb9\x84\xe0" +
-	"\x00\x00\x00\x00\x0f\xa9\x83\xf0\x00\x00\x00\x00\x10\x99f\xe0\x00\x00\x00\x00\x11\x89e\xf0\x00\x00\x00\x00\x12yH\xe0\x00\x00\x00\x00\x13iG\xf0\x00\x00\x00\x00\x14Y*\xe0\x00\x00\x00\x00\x15I)\xf0\x00\x00\x00\x00" +
-	"\x169\f\xe0\x00\x00\x00\x00\x17)\v\xf0\x00\x00\x00\x00\x18\")`\x00\x00\x00\x00\x19\b\xed\xf0\x00\x00\x00\x00\x1a\x02\v`\x00\x00\x00\x00\x1a\xf2\np\x00\x00\x00\x00\x1b\xe1\xed`\x00\x00\x00\x00\x1c\xd1\xecp" +
-	"\x00\x00\x00\x00\x1d\xc1\xcf`\x00\x00\x00\x00\x1e\xb1\xcep\x00\x00\x00\x00\x1f\xa1\xb1`\x00\x00\x00\x00 v\x00\xf0\x00\x00\x00\x00!\x81\x93`\x00\x00\x00\x00\"U\xe2\xf0\x00\x00\x00\x00#j\xaf\xe0\x00\x00\x00\x00" +
-	"$5\xc4\xf0\x00\x00\x00\x00%J\x91\xe0\x00\x00\x00\x00&\x15\xa6\xf0\x00\x00\x00\x00'*s\xe0\x00\x00\x00\x00'\xfe\xc3p\x00\x00\x00\x00)\nU\xe0\x00\x00\x00\x00)ޥp\x00\x00\x00\x00*\xea7\xe0" +
-	"\x00\x00\x00\x00+\xbe\x87p\x00\x00\x00\x00,\xd3T`\x00\x00\x00\x00-\x9eip\x00\x00\x00\x00.\xb36`\x00\x00\x00\x00/~Kp\x00\x00\x00\x000\x93\x18`\x00\x00\x00\x001gg\xf0\x00\x00\x00\x00" +
-	"2r\xfa`\x00\x00\x00\x003GI\xf0\x00\x00\x00\x004R\xdc`\x00\x00\x00\x005'+\xf0\x00\x00\x00\x0062\xbe`\x00\x00\x00\x007\a\r\xf0\x00\x00\x00\x008\x1b\xda\xe0\x00\x00\x00\x008\xe6\xef\xf0" +
-	"\x00\x00\x00\x009\xfb\xbc\xe0\x00\x00\x00\x00:\xc6\xd1\xf0\x00\x00\x00\x00;۞\xe0\x00\x00\x00\x00<\xaf\xeep\x00\x00\x00\x00=\xbb\x80\xe0\x00\x00\x00\x00>\x8f\xd0p\x00\x00\x00\x00?\x9bb\xe0\x00\x00\x00\x00" +
-	"@o\xb2p\x00\x00\x00\x00A\x84\x7f`\x00\x00\x00\x00BO\x94p\x00\x00\x00\x00Cda`\x00\x00\x00\x00D/vp\x00\x00\x00\x00EDC`\x00\x00\x00\x00E\xf3\xa8\xf0\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x03\x04\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\xff\xff\xba\x9e\x00\x00\xff\xff\xc7\xc0\x01\x04\xff" +
-	"\xff\xb9\xb0\x00\b\xff\xff\xc7\xc0\x01\f\xff\xff\xc7\xc0\x01\x10LMT\x00EDT\x00EST\x00EWT\x00EPT\x00\nEST5EDT,M3.2.0,M11.1.0" +
-	"\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xeaK\x85v\xdd\x00\x00\x00\xdd\x00\x00\x00\t\x00\x00\x00US/HawaiiTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\x14\xff\xff\xff\xfft\xe0p\xbe\xff\xff\xff\xff\xbb\x05CH\xff\xff\xff\xff\xbb!qX\xff\xff\xff\xffˉ=\xc8\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2" +
-	"aI8\xff\xff\xff\xffՍsH\x01\x02\x01\x03\x04\x01\x05\xff\xffl\x02\x00\x00\xff\xfflX\x00\x04\xff\xffzh\x01\b\xff\xffzh\x01\f\xff\xffzh\x01\x10\xff\xffs`\x00\x04LMT\x00HS" +
-	"T\x00HDT\x00HWT\x00HPT\x00\nHST10\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00$ \x873\xf8\x03\x00\x00\xf8\x03\x00\x00\x11\x00\x00\x00US/Indian" +
-	"a-StarkeTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00T" +
-	"Zif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00]\x00\x00\x00\x06\x00\x00\x00\x18\xff\xff\xff\xff^\x03\xfe\xa0\xff\xff\xff\xff\x9e\xa6,\x80\xff" +
-	"\xff\xff\xff\x9f\xba\xf9p\xff\xff\xff\xff\xa0\x86\x0e\x80\xff\xff\xff\xff\xa1\x9a\xdbp\xff\xff\xff\xffˈ\xfe\x80\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2a\t\xf0\xff\xff\xff\xff\xd5U\xd5\x00\xff\xff\xff\xff\xd6" +
-	" \xcd\xf0\xff\xff\xff\xff\xd75\xb7\x00\xff\xff\xff\xff\xd8\x00\xaf\xf0\xff\xff\xff\xff\xd9\x15\x99\x00\xff\xff\xff\xff\xd9\xe0\x91\xf0\xff\xff\xff\xff\xda\xfe\xb5\x80\xff\xff\xff\xff\xdb\xc0s\xf0\xff\xff\xff\xff\xdcޗ\x80\xff" +
-	"\xff\xff\xffݩ\x90p\xff\xff\xff\xff\u07bey\x80\xff\xff\xff\xff߉rp\xff\xff\xff\xff\xe0\x9e[\x80\xff\xff\xff\xff\xe1iTp\xff\xff\xff\xff\xe2~=\x80\xff\xff\xff\xff\xe3I6p\xff\xff\xff\xff\xe4" +
-	"^\x1f\x80\xff\xff\xff\xff\xe5W<\xf0\xff\xff\xff\xff\xe6G<\x00\xff\xff\xff\xff\xe77\x1e\xf0\xff\xff\xff\xff\xe8'\x1e\x00\xff\xff\xff\xff\xe8\xf2\x16\xf0\xff\xff\xff\xff\xea\a\x00\x00\xff\xff\xff\xff\xea\xd1\xf8\xf0\xff" +
-	"\xff\xff\xff\xeb\xe6\xe2\x00\xff\xff\xff\xff\xec\xd6\xc4\xf0\xff\xff\xff\xff\xed\xc6\xc4\x00\xff\xff\xff\xff\xee\xbf\xe1p\xff\xff\xff\xff\xef\xaf\xe0\x80\xff\xff\xff\xff\xf0\x9f\xc3p\xff\xff\xff\xff\xf1\x8f\u0080\xff\xff\xff\xff\xf4" +
-	"_\x87p\xff\xff\xff\xff\xfa\xf8g\x00\xff\xff\xff\xff\xfb\xe8I\xf0\xff\xff\xff\xff\xfc\xd8I\x00\xff\xff\xff\xff\xfd\xc8+\xf0\xff\xff\xff\xff\xfe\xb8+\x00\xff\xff\xff\xff\xff\xa8\r\xf0\x00\x00\x00\x00\x00\x98\r\x00\x00" +
-	"\x00\x00\x00\x01\x87\xef\xf0\x00\x00\x00\x00\x02w\xef\x00\x00\x00\x00\x00\x03q\fp\x00\x00\x00\x00\x04a\v\x80\x00\x00\x00\x00\x05P\xeep\x00\x00\x00\x00\x06@\xed\x80\x00\x00\x00\x00\a0\xd0p\x00\x00\x00\x00\a" +
-	"\x8d'\x80\x00\x00\x00\x00\t\x10\xb2p\x00\x00\x00\x00\t\xad\xa3\x00\x00\x00\x00\x00\n\xf0\x94p\x00\x00\x00\x00\v\xe0\x93\x80\x00\x00\x00\x00\fٰ\xf0\x00\x00\x00\x00\r\xc0u\x80\x00\x00\x00\x00\x0e\xb9\x92\xf0\x00" +
-	"\x00\x00\x00\x0f\xa9\x92\x00\x00\x00\x00\x00\x10\x99t\xf0\x00\x00\x00\x00\x11\x89t\x00\x00\x00\x00\x00\x12yV\xf0\x00\x00\x00\x00\x13iV\x00\x00\x00\x00\x00\x14Y8\xf0\x00\x00\x00\x00\x15I8\x00\x00\x00\x00\x00\x16" +
-	"9\x1a\xf0\x00\x00\x00\x00\x17)\x1a\x00\x00\x00\x00\x00\x18\"7p\x00\x00\x00\x00\x19\b\xfc\x00\x00\x00\x00\x00\x1a\x02\x19p\x00\x00\x00\x00\x1a\xf2\x18\x80\x00\x00\x00\x00\x1b\xe1\xfbp\x00\x00\x00\x00\x1c\xd1\xfa\x80\x00" +
-	"\x00\x00\x00\x1d\xc1\xddp\x00\x00\x00\x00\x1e\xb1܀\x00\x00\x00\x00\x1f\xa1\xbfp\x00\x00\x00\x00 v\x0f\x00\x00\x00\x00\x00!\x81\xa1p\x00\x00\x00\x00\"U\xf1\x00\x00\x00\x00\x00#j\xbd\xf0\x00\x00\x00\x00$" +
-	"5\xd3\x00\x00\x00\x00\x00%J\x9f\xf0\x00\x00\x00\x00&\x15\xb5\x00\x00\x00\x00\x00'*\x81\xf0\x00\x00\x00\x00'\xfeр\x00\x00\x00\x00)\nc\xf0\x00\x00\x00\x00D/vp\x00\x00\x00\x00EDQp\x00" +
-	"\x00\x00\x00E\xf3\xb7\x00\x02\x01\x02\x01\x02\x03\x04\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x05\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x05\x01\x02\x01\xff\xff\xae\xca\x00\x00\xff\xff\xb9\xb0\x01\x04\xff\xff\xab\xa0\x00\b\xff\xff" +
-	"\xb9\xb0\x01\f\xff\xff\xb9\xb0\x01\x10\xff\xff\xb9\xb0\x00\x14LMT\x00CDT\x00CST\x00CWT\x00CPT\x00EST\x00\nCST6CDT,M3.2.0,M11." +
-	"1.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00>\x14\xe7\x03\x83\x03\x00\x00\x83\x03\x00\x00\v\x00\x00\x00US/MichiganTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00P\x00\x00\x00\x06\x00\x00\x00\x18\xff\xff\xff\xff\x85\xbd\"[\xff\xff\xff\xff\x99<\x94\x00\xff\xff\xff\xffˈ\xf0p\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2`\xfb\xe0" +
-	"\xff\xff\xff\xff\xd75\xa8\xf0\xff\xff\xff\xff\xd8\x00\xa1\xe0\xff\xff\xff\xff\xfb3\x90\x8c\xff\xff\xff\xff\xfb\xe8;\xe0\xff\xff\xff\xff\xfc\xd8:\xf0\xff\xff\xff\xff\xfd\xc8\x1d\xe0\x00\x00\x00\x00\x06@\xdfp\x00\x00\x00\x00" +
-	"\a0\xc2`\x00\x00\x00\x00\a\x8d\x19p\x00\x00\x00\x00\t\x10\xa4`\x00\x00\x00\x00\n\x00\xa3p\x00\x00\x00\x00\n\xf0\x86`\x00\x00\x00\x00\v\xe0\x85p\x00\x00\x00\x00\f٢\xe0\x00\x00\x00\x00\r\xc0gp" +
-	"\x00\x00\x00\x00\x0e\xb9\x84\xe0\x00\x00\x00\x00\x0f\xa9\x83\xf0\x00\x00\x00\x00\x10\x99f\xe0\x00\x00\x00\x00\x11\x89e\xf0\x00\x00\x00\x00\x12yH\xe0\x00\x00\x00\x00\x13iG\xf0\x00\x00\x00\x00\x14Y*\xe0\x00\x00\x00\x00" +
-	"\x15I)\xf0\x00\x00\x00\x00\x169\f\xe0\x00\x00\x00\x00\x17)\v\xf0\x00\x00\x00\x00\x18\")`\x00\x00\x00\x00\x19\b\xed\xf0\x00\x00\x00\x00\x1a\x02\v`\x00\x00\x00\x00\x1a\xf2\np\x00\x00\x00\x00\x1b\xe1\xed`" +
-	"\x00\x00\x00\x00\x1c\xd1\xecp\x00\x00\x00\x00\x1d\xc1\xcf`\x00\x00\x00\x00\x1e\xb1\xcep\x00\x00\x00\x00\x1f\xa1\xb1`\x00\x00\x00\x00 v\x00\xf0\x00\x00\x00\x00!\x81\x93`\x00\x00\x00\x00\"U\xe2\xf0\x00\x00\x00\x00" +
-	"#j\xaf\xe0\x00\x00\x00\x00$5\xc4\xf0\x00\x00\x00\x00%J\x91\xe0\x00\x00\x00\x00&\x15\xa6\xf0\x00\x00\x00\x00'*s\xe0\x00\x00\x00\x00'\xfe\xc3p\x00\x00\x00\x00)\nU\xe0\x00\x00\x00\x00)ޥp" +
-	"\x00\x00\x00\x00*\xea7\xe0\x00\x00\x00\x00+\xbe\x87p\x00\x00\x00\x00,\xd3T`\x00\x00\x00\x00-\x9eip\x00\x00\x00\x00.\xb36`\x00\x00\x00\x00/~Kp\x00\x00\x00\x000\x93\x18`\x00\x00\x00\x00" +
-	"1gg\xf0\x00\x00\x00\x002r\xfa`\x00\x00\x00\x003GI\xf0\x00\x00\x00\x004R\xdc`\x00\x00\x00\x005'+\xf0\x00\x00\x00\x0062\xbe`\x00\x00\x00\x007\a\r\xf0\x00\x00\x00\x008\x1b\xda\xe0" +
-	"\x00\x00\x00\x008\xe6\xef\xf0\x00\x00\x00\x009\xfb\xbc\xe0\x00\x00\x00\x00:\xc6\xd1\xf0\x00\x00\x00\x00;۞\xe0\x00\x00\x00\x00<\xaf\xeep\x00\x00\x00\x00=\xbb\x80\xe0\x00\x00\x00\x00>\x8f\xd0p\x00\x00\x00\x00" +
-	"?\x9bb\xe0\x00\x00\x00\x00@o\xb2p\x00\x00\x00\x00A\x84\x7f`\x00\x00\x00\x00BO\x94p\x00\x00\x00\x00Cda`\x00\x00\x00\x00D/vp\x00\x00\x00\x00EDC`\x00\x00\x00\x00E\xf3\xa8\xf0" +
-	"\x01\x02\x03\x04\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05" +
-	"\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\xff\xff\xb2%\x00\x00\xff\xff\xab\xa0\x00\x04\xff\xff\xb9\xb0\x00\b\xff\xff\xc7\xc0\x01\f\xff\xff\xc7\xc0\x01\x10\xff\xff\xc7\xc0\x01\x14LMT\x00" +
-	"CST\x00EST\x00EWT\x00EPT\x00EDT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00V\x80" +
-	"\x94@\x12\x04\x00\x00\x12\x04\x00\x00\v\x00\x00\x00US/MountainTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00a\x00\x00\x00\x05\x00\x00\x00\x14" +
-	"\xff\xff\xff\xff^\x04\f\xb0\xff\xff\xff\xff\x9e\xa6:\x90\xff\xff\xff\xff\x9f\xbb\a\x80\xff\xff\xff\xff\xa0\x86\x1c\x90\xff\xff\xff\xff\xa1\x9a\xe9\x80\xff\xff\xff\xff\xa2e\xfe\x90\xff\xff\xff\xff\xa3\x84\x06\x00\xff\xff\xff\xff" +
-	"\xa4E\xe0\x90\xff\xff\xff\xff\xa4\x8f\xa6\x80\xff\xff\xff\xffˉ\f\x90\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2a\x18\x00\xff\xff\xff\xff\xf7/v\x90\xff\xff\xff\xff\xf8(\x94\x00\xff\xff\xff\xff\xf9\x0fX\x90" +
-	"\xff\xff\xff\xff\xfa\bv\x00\xff\xff\xff\xff\xfa\xf8u\x10\xff\xff\xff\xff\xfb\xe8X\x00\xff\xff\xff\xff\xfc\xd8W\x10\xff\xff\xff\xff\xfd\xc8:\x00\xff\xff\xff\xff\xfe\xb89\x10\xff\xff\xff\xff\xff\xa8\x1c\x00\x00\x00\x00\x00" +
-	"\x00\x98\x1b\x10\x00\x00\x00\x00\x01\x87\xfe\x00\x00\x00\x00\x00\x02w\xfd\x10\x00\x00\x00\x00\x03q\x1a\x80\x00\x00\x00\x00\x04a\x19\x90\x00\x00\x00\x00\x05P\xfc\x80\x00\x00\x00\x00\x06@\xfb\x90\x00\x00\x00\x00\a0ހ" +
-	"\x00\x00\x00\x00\a\x8d5\x90\x00\x00\x00\x00\t\x10\xc0\x80\x00\x00\x00\x00\t\xad\xb1\x10\x00\x00\x00\x00\n\xf0\xa2\x80\x00\x00\x00\x00\vࡐ\x00\x00\x00\x00\fٿ\x00\x00\x00\x00\x00\r\xc0\x83\x90\x00\x00\x00\x00" +
-	"\x0e\xb9\xa1\x00\x00\x00\x00\x00\x0f\xa9\xa0\x10\x00\x00\x00\x00\x10\x99\x83\x00\x00\x00\x00\x00\x11\x89\x82\x10\x00\x00\x00\x00\x12ye\x00\x00\x00\x00\x00\x13id\x10\x00\x00\x00\x00\x14YG\x00\x00\x00\x00\x00\x15IF\x10" +
-	"\x00\x00\x00\x00\x169)\x00\x00\x00\x00\x00\x17)(\x10\x00\x00\x00\x00\x18\"E\x80\x00\x00\x00\x00\x19\t\n\x10\x00\x00\x00\x00\x1a\x02'\x80\x00\x00\x00\x00\x1a\xf2&\x90\x00\x00\x00\x00\x1b\xe2\t\x80\x00\x00\x00\x00" +
-	"\x1c\xd2\b\x90\x00\x00\x00\x00\x1d\xc1\xeb\x80\x00\x00\x00\x00\x1e\xb1\xea\x90\x00\x00\x00\x00\x1f\xa1̀\x00\x00\x00\x00 v\x1d\x10\x00\x00\x00\x00!\x81\xaf\x80\x00\x00\x00\x00\"U\xff\x10\x00\x00\x00\x00#j\xcc\x00" +
-	"\x00\x00\x00\x00$5\xe1\x10\x00\x00\x00\x00%J\xae\x00\x00\x00\x00\x00&\x15\xc3\x10\x00\x00\x00\x00'*\x90\x00\x00\x00\x00\x00'\xfeߐ\x00\x00\x00\x00)\nr\x00\x00\x00\x00\x00)\xde\xc1\x90\x00\x00\x00\x00" +
-	"*\xeaT\x00\x00\x00\x00\x00+\xbe\xa3\x90\x00\x00\x00\x00,\xd3p\x80\x00\x00\x00\x00-\x9e\x85\x90\x00\x00\x00\x00.\xb3R\x80\x00\x00\x00\x00/~g\x90\x00\x00\x00\x000\x934\x80\x00\x00\x00\x001g\x84\x10" +
-	"\x00\x00\x00\x002s\x16\x80\x00\x00\x00\x003Gf\x10\x00\x00\x00\x004R\xf8\x80\x00\x00\x00\x005'H\x10\x00\x00\x00\x0062ڀ\x00\x00\x00\x007\a*\x10\x00\x00\x00\x008\x1b\xf7\x00\x00\x00\x00\x00" +
-	"8\xe7\f\x10\x00\x00\x00\x009\xfb\xd9\x00\x00\x00\x00\x00:\xc6\xee\x10\x00\x00\x00\x00;ۻ\x00\x00\x00\x00\x00<\xb0\n\x90\x00\x00\x00\x00=\xbb\x9d\x00\x00\x00\x00\x00>\x8f\xec\x90\x00\x00\x00\x00?\x9b\x7f\x00" +
-	"\x00\x00\x00\x00@oΐ\x00\x00\x00\x00A\x84\x9b\x80\x00\x00\x00\x00BO\xb0\x90\x00\x00\x00\x00Cd}\x80\x00\x00\x00\x00D/\x92\x90\x00\x00\x00\x00ED_\x80\x00\x00\x00\x00E\xf3\xc5\x10\x02\x01\x02\x01" +
-	"\x02\x01\x02\x01\x02\x03\x04\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\xff\xff\x9d\x94\x00\x00\xff\xff\xab\xa0\x01\x04\xff\xff\x9d\x90\x00\b\xff\xff\xab\xa0\x01\f\xff\xff\xab" +
-	"\xa0\x01\x10LMT\x00MDT\x00MST\x00MWT\x00MPT\x00\nMST7MDT,M3.2.0,M11.1.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\xf6\"\x12\xfe\x0e\x05\x00\x00\x0e\x05\x00\x00\n\x00\x00\x00US/PacificTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00}\x00\x00\x00\x05\x00\x00" +
-	"\x00\x14\xff\xff\xff\xff^\x04\x1a\xc0\xff\xff\xff\xff\x9e\xa6H\xa0\xff\xff\xff\xff\x9f\xbb\x15\x90\xff\xff\xff\xff\xa0\x86*\xa0\xff\xff\xff\xff\xa1\x9a\xf7\x90\xff\xff\xff\xffˉ\x1a\xa0\xff\xff\xff\xff\xd2#\xf4p\xff\xff" +
-	"\xff\xff\xd2a&\x10\xff\xff\xff\xff\xd6\xfet\\\xff\xff\xff\xff\u0600\xad\x90\xff\xff\xff\xff\xda\xfeÐ\xff\xff\xff\xff\xdb\xc0\x90\x10\xff\xff\xff\xff\xdcޥ\x90\xff\xff\xff\xffݩ\xac\x90\xff\xff\xff\xff\u07be" +
-	"\x87\x90\xff\xff\xff\xff߉\x8e\x90\xff\xff\xff\xff\xe0\x9ei\x90\xff\xff\xff\xff\xe1ip\x90\xff\xff\xff\xff\xe2~K\x90\xff\xff\xff\xff\xe3IR\x90\xff\xff\xff\xff\xe4^-\x90\xff\xff\xff\xff\xe5)4\x90\xff\xff" +
-	"\xff\xff\xe6GJ\x10\xff\xff\xff\xff\xe7\x12Q\x10\xff\xff\xff\xff\xe8',\x10\xff\xff\xff\xff\xe8\xf23\x10\xff\xff\xff\xff\xea\a\x0e\x10\xff\xff\xff\xff\xea\xd2\x15\x10\xff\xff\xff\xff\xeb\xe6\xf0\x10\xff\xff\xff\xff\xec\xb1" +
-	"\xf7\x10\xff\xff\xff\xff\xed\xc6\xd2\x10\xff\xff\xff\xff\xee\x91\xd9\x10\xff\xff\xff\xff\xef\xaf\xee\x90\xff\xff\xff\xff\xf0q\xbb\x10\xff\xff\xff\xff\xf1\x8fА\xff\xff\xff\xff\xf2\x7f\xc1\x90\xff\xff\xff\xff\xf3o\xb2\x90\xff\xff" +
-	"\xff\xff\xf4_\xa3\x90\xff\xff\xff\xff\xf5O\x94\x90\xff\xff\xff\xff\xf6?\x85\x90\xff\xff\xff\xff\xf7/v\x90\xff\xff\xff\xff\xf8(\xa2\x10\xff\xff\xff\xff\xf9\x0fX\x90\xff\xff\xff\xff\xfa\b\x84\x10\xff\xff\xff\xff\xfa\xf8" +
-	"\x83 \xff\xff\xff\xff\xfb\xe8f\x10\xff\xff\xff\xff\xfc\xd8e \xff\xff\xff\xff\xfd\xc8H\x10\xff\xff\xff\xff\xfe\xb8G \xff\xff\xff\xff\xff\xa8*\x10\x00\x00\x00\x00\x00\x98) \x00\x00\x00\x00\x01\x88\f\x10\x00\x00" +
-	"\x00\x00\x02x\v \x00\x00\x00\x00\x03q(\x90\x00\x00\x00\x00\x04a'\xa0\x00\x00\x00\x00\x05Q\n\x90\x00\x00\x00\x00\x06A\t\xa0\x00\x00\x00\x00\a0\xec\x90\x00\x00\x00\x00\a\x8dC\xa0\x00\x00\x00\x00\t\x10" +
-	"ΐ\x00\x00\x00\x00\t\xad\xbf \x00\x00\x00\x00\n\xf0\xb0\x90\x00\x00\x00\x00\v\u0be0\x00\x00\x00\x00\f\xd9\xcd\x10\x00\x00\x00\x00\r\xc0\x91\xa0\x00\x00\x00\x00\x0e\xb9\xaf\x10\x00\x00\x00\x00\x0f\xa9\xae \x00\x00" +
-	"\x00\x00\x10\x99\x91\x10\x00\x00\x00\x00\x11\x89\x90 \x00\x00\x00\x00\x12ys\x10\x00\x00\x00\x00\x13ir \x00\x00\x00\x00\x14YU\x10\x00\x00\x00\x00\x15IT \x00\x00\x00\x00\x1697\x10\x00\x00\x00\x00\x17)" +
-	"6 \x00\x00\x00\x00\x18\"S\x90\x00\x00\x00\x00\x19\t\x18 \x00\x00\x00\x00\x1a\x025\x90\x00\x00\x00\x00\x1a\xf24\xa0\x00\x00\x00\x00\x1b\xe2\x17\x90\x00\x00\x00\x00\x1c\xd2\x16\xa0\x00\x00\x00\x00\x1d\xc1\xf9\x90\x00\x00" +
-	"\x00\x00\x1e\xb1\xf8\xa0\x00\x00\x00\x00\x1f\xa1ې\x00\x00\x00\x00 v+ \x00\x00\x00\x00!\x81\xbd\x90\x00\x00\x00\x00\"V\r \x00\x00\x00\x00#j\xda\x10\x00\x00\x00\x00$5\xef \x00\x00\x00\x00%J" +
-	"\xbc\x10\x00\x00\x00\x00&\x15\xd1 \x00\x00\x00\x00'*\x9e\x10\x00\x00\x00\x00'\xfe\xed\xa0\x00\x00\x00\x00)\n\x80\x10\x00\x00\x00\x00)\xdeϠ\x00\x00\x00\x00*\xeab\x10\x00\x00\x00\x00+\xbe\xb1\xa0\x00\x00" +
-	"\x00\x00,\xd3~\x90\x00\x00\x00\x00-\x9e\x93\xa0\x00\x00\x00\x00.\xb3`\x90\x00\x00\x00\x00/~u\xa0\x00\x00\x00\x000\x93B\x90\x00\x00\x00\x001g\x92 \x00\x00\x00\x002s$\x90\x00\x00\x00\x003G" +
-	"t \x00\x00\x00\x004S\x06\x90\x00\x00\x00\x005'V \x00\x00\x00\x0062\xe8\x90\x00\x00\x00\x007\a8 \x00\x00\x00\x008\x1c\x05\x10\x00\x00\x00\x008\xe7\x1a \x00\x00\x00\x009\xfb\xe7\x10\x00\x00" +
-	"\x00\x00:\xc6\xfc \x00\x00\x00\x00;\xdb\xc9\x10\x00\x00\x00\x00<\xb0\x18\xa0\x00\x00\x00\x00=\xbb\xab\x10\x00\x00\x00\x00>\x8f\xfa\xa0\x00\x00\x00\x00?\x9b\x8d\x10\x00\x00\x00\x00@oܠ\x00\x00\x00\x00A\x84" +
-	"\xa9\x90\x00\x00\x00\x00BO\xbe\xa0\x00\x00\x00\x00Cd\x8b\x90\x00\x00\x00\x00D/\xa0\xa0\x00\x00\x00\x00EDm\x90\x00\x00\x00\x00E\xf3\xd3 \x02\x01\x02\x01\x02\x03\x04\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" +
-	"\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\xff\xff\x91&\x00\x00\xff\xff\x9d\x90\x01\x04\xff" +
-	"\xff\x8f\x80\x00\b\xff\xff\x9d\x90\x01\f\xff\xff\x9d\x90\x01\x10LMT\x00PDT\x00PST\x00PWT\x00PPT\x00\nPST8PDT,M3.2.0,M11.1.0" +
-	"\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00t\xca{e\x92\x00\x00\x00\x92\x00\x00\x00\b\x00\x00\x00US/SamoaTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\b\xff\xff\xff\xffn=\xc8\b\xff\xff\xff\xff\x91\x05\xfb\b\x01\x02\x00\x00\xb1x\x00\x00\xff\xff_\xf8\x00\x00\xff\xffeP\x00\x04LMT\x00SST\x00\nS" +
-	"ST11\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00\x03\x00\x00\x00UTCTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00UTC\x00\nUTC0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00\t\x00\x00\x00U" +
-	"niversalTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00T" +
-	"Zif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00UTC\x00\nUTC0\nP" +
-	"K\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe1\xc1\xeb\x05\x8c\x03\x00\x00\x8c\x03\x00\x00\x04\x00\x00\x00W-SUTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00N" +
-	"\x00\x00\x00\v\x00\x00\x00&\xff\xff\xff\xffV\xb6\xc0\xc7\xff\xff\xff\xff\x9b_\x1e\xc7\xff\xff\xff\xff\x9d>\xf2y\xff\xff\xff\xff\x9e*\xee\xf9\xff\xff\xff\xff\x9e\xf79i\xff\xff\xff\xff\x9f\x84W\xf9\xff\xff\xff\xff" +
-	"\xa0\xd8l\xe9\xff\xff\xff\xff\xa1\x009\x80\xff\xff\xff\xff\xa1<\xa6@\xff\xff\xff\xff\xa4\x10m\xc0\xff\xff\xff\xff\xa4=2\xb0\xff\xff\xff\xff\xa5\x15h\xb0\xff\xff\xff\xff\xa5=\x03\xc0\xff\xff\xff\xff\xa7\x1eEP" +
-	"\xff\xff\xff\xff\xb5\xa4\x19`\x00\x00\x00\x00\x15'\xa7\xd0\x00\x00\x00\x00\x16\x18\xdc@\x00\x00\x00\x00\x17\b\xdbP\x00\x00\x00\x00\x17\xfa\x0f\xc0\x00\x00\x00\x00\x18\xea\x0e\xd0\x00\x00\x00\x00\x19\xdbC@\x00\x00\x00\x00" +
-	"\x1a̓\xd0\x00\x00\x00\x00\x1b\xbc\xa0\xf0\x00\x00\x00\x00\x1c\xac\x91\xf0\x00\x00\x00\x00\x1d\x9c\x82\xf0\x00\x00\x00\x00\x1e\x8cs\xf0\x00\x00\x00\x00\x1f|d\xf0\x00\x00\x00\x00 lU\xf0\x00\x00\x00\x00!\\F\xf0" +
-	"\x00\x00\x00\x00\"L7\xf0\x00\x00\x00\x00#<(\xf0\x00\x00\x00\x00$,\x19\xf0\x00\x00\x00\x00%\x1c\n\xf0\x00\x00\x00\x00&\v\xfb\xf0\x00\x00\x00\x00'\x05'p\x00\x00\x00\x00'\xf5\x18p\x00\x00\x00\x00" +
-	"(\xe5\x17\x80\x00\x00\x00\x00)x\xbf\x80\x00\x00\x00\x00)\xd4\xfap\x00\x00\x00\x00*\xc4\xebp\x00\x00\x00\x00+\xb4\xdcp\x00\x00\x00\x00,\xa4\xcdp\x00\x00\x00\x00-\x94\xbep\x00\x00\x00\x00.\x84\xafp" +
-	"\x00\x00\x00\x00/t\xa0p\x00\x00\x00\x000d\x91p\x00\x00\x00\x001]\xbc\xf0\x00\x00\x00\x002r\x97\xf0\x00\x00\x00\x003=\x9e\xf0\x00\x00\x00\x004Ry\xf0\x00\x00\x00\x005\x1d\x80\xf0\x00\x00\x00\x00" +
-	"62[\xf0\x00\x00\x00\x006\xfdb\xf0\x00\x00\x00\x008\x1bxp\x00\x00\x00\x008\xddD\xf0\x00\x00\x00\x009\xfbZp\x00\x00\x00\x00:\xbd&\xf0\x00\x00\x00\x00;\xdb<p\x00\x00\x00\x00<\xa6Cp" +
-	"\x00\x00\x00\x00=\xbb\x1ep\x00\x00\x00\x00>\x86%p\x00\x00\x00\x00?\x9b\x00p\x00\x00\x00\x00@f\ap\x00\x00\x00\x00A\x84\x1c\xf0\x00\x00\x00\x00BE\xe9p\x00\x00\x00\x00Cc\xfe\xf0\x00\x00\x00\x00" +
-	"D%\xcbp\x00\x00\x00\x00EC\xe0\xf0\x00\x00\x00\x00F\x05\xadp\x00\x00\x00\x00G#\xc2\xf0\x00\x00\x00\x00G\xee\xc9\xf0\x00\x00\x00\x00I\x03\xa4\xf0\x00\x00\x00\x00IΫ\xf0\x00\x00\x00\x00J\xe3\x86\xf0" +
-	"\x00\x00\x00\x00K\xae\x8d\xf0\x00\x00\x00\x00Ḷp\x00\x00\x00\x00M\x8eo\xf0\x00\x00\x00\x00TL\x1d`\x01\x03\x02\x03\x04\x02\x04\x05\x06\x05\a\x05\x06\b\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05" +
-	"\x06\x05\x06\x05\x06\x05\x06\t\b\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\n\x06\x00\x00#9\x00\x00\x00\x00#9" +
-	"\x00\x04\x00\x001\x87\x01\b\x00\x00#w\x00\x04\x00\x00?\x97\x01\f\x00\x008@\x01\x11\x00\x00*0\x00\x15\x00\x00FP\x01\x19\x00\x00\x1c \x00\x1d\x00\x00*0\x01!\x00\x008@\x00\x15LMT\x00" +
-	"MMT\x00MST\x00MDST\x00MSD\x00MSK\x00+05\x00EET\x00EEST\x00\nMSK-3\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x002\x91B\xc0\xee" +
-	"\x01\x00\x00\xee\x01\x00\x00\x03\x00\x00\x00WETTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00" +
-	"\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\x00\x00\x00\x02\x00\x00\x00\t\x00\x00\x00\x00\r\xa4c\x90\x00\x00\x00" +
-	"\x00\x0e\x8b\x1a\x10\x00\x00\x00\x00\x0f\x84E\x90\x00\x00\x00\x00\x10t6\x90\x00\x00\x00\x00\x11d'\x90\x00\x00\x00\x00\x12T\x18\x90\x00\x00\x00\x00\x13MD\x10\x00\x00\x00\x00\x143\xfa\x90\x00\x00\x00\x00\x15#\xeb" +
-	"\x90\x00\x00\x00\x00\x16\x13ܐ\x00\x00\x00\x00\x17\x03͐\x00\x00\x00\x00\x17\xf3\xbe\x90\x00\x00\x00\x00\x18㯐\x00\x00\x00\x00\x19Ӡ\x90\x00\x00\x00\x00\x1aÑ\x90\x00\x00\x00\x00\x1b\xbc\xbd\x10\x00\x00\x00" +
-	"\x00\x1c\xac\xae\x10\x00\x00\x00\x00\x1d\x9c\x9f\x10\x00\x00\x00\x00\x1e\x8c\x90\x10\x00\x00\x00\x00\x1f|\x81\x10\x00\x00\x00\x00 lr\x10\x00\x00\x00\x00!\\c\x10\x00\x00\x00\x00\"LT\x10\x00\x00\x00\x00#<E" +
-	"\x10\x00\x00\x00\x00$,6\x10\x00\x00\x00\x00%\x1c'\x10\x00\x00\x00\x00&\f\x18\x10\x00\x00\x00\x00'\x05C\x90\x00\x00\x00\x00'\xf54\x90\x00\x00\x00\x00(\xe5%\x90\x00\x00\x00\x00)\xd5\x16\x90\x00\x00\x00" +
-	"\x00*\xc5\a\x90\x00\x00\x00\x00+\xb4\xf8\x90\x00\x00\x00\x00,\xa4\xe9\x90\x00\x00\x00\x00-\x94ڐ\x00\x00\x00\x00.\x84ː\x00\x00\x00\x00/t\xbc\x90\x00\x00\x00\x000d\xad\x90\x00\x00\x00\x001]\xd9" +
-	"\x10\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x00\x00\x00\x00\x05\x00\x00\x0e\x10\x01\x00WEST\x00WET" +
-	"\x00\nWET0WEST,M3.5.0/1,M10.5.0\nPK\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00\x04\x00\x00\x00Zu" +
-	"luTZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00UTC\x00\nUTC0\nPK\x01\x02\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Africa/AbidjanPK\x01\x02\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xae\x00\x00\x00Africa/AccraPK\x01\x02\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Z\x01\x00\x00Africa/Addis_AbabaPK\x01\x02\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Ê\x0e\xc0\xd6\x01\x00\x00\xd6\x01\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00I\x02\x00\x00Africa/AlgiersPK\x01\x02\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00K\x04\x00\x00Africa/AsmaraPK\x01\x02\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x005\x05\x00\x00Africa/AsmeraPK\x01\x02\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1f\x06\x00\x00Africa/BamakoPK\x01\x02\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcc\x06\x00\x00Africa/BanguiPK\x01\x02\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xab\a\x00\x00Africa/BanjulPK\x01\x02\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\xca>\xd5\xe0\x95\x00\x00\x00\x95\x00\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00X\b\x00\x00Africa/BissauPK\x01\x02\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00 \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\t\x00\x00Africa/BlantyrePK\x01\x02\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc8\t\x00\x00Africa/BrazzavillePK\x01\x02\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xac\n\x00\x00Africa/BujumburaPK\x01\x02" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12tnj\xfc\x04\x00\x00\xfc\x04\x00\x00\f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00]\v\x00\x00Africa/CairoPK\x01\x02\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00d\x01\x05\x89\x7f\a\x00\x00\x7f\a\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x83\x10\x00\x00Africa/CasablancaPK\x01" +
-	"\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9f\x1b\xeb\xdd2\x02\x00\x002\x02\x00\x00\f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x001\x18\x00\x00Africa/CeutaPK\x01\x02\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\x1a\x00\x00Africa/ConakryPK\x01\x02\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00;\x1b\x00\x00Africa/DakarPK\x01\x02\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe7\x1b\x00\x00Africa/Dar_es_SalaamP" +
-	"K\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd8\x1c\x00\x00Africa/Djibouti" +
-	"PK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc4\x1d\x00\x00Africa/DoualaP" +
-	"K\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00)\xae\x8eo&\a\x00\x00&\a\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x1e\x00\x00Africa/El_Aaiun" +
-	"PK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf6%\x00\x00Africa/Freetow" +
-	"nPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa5&\x00\x00Africa/Gaboro" +
-	"nePK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00U'\x00\x00Africa/Harar" +
-	"ePK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcc\fTξ\x00\x00\x00\xbe\x00\x00\x00\x13\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03(\x00\x00Africa/Johann" +
-	"esburgPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\xcf\x10n\xca\x01\x00\x00\xca\x01\x00\x00\v\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf2(\x00\x00Africa/J" +
-	"ubaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe5*\x00\x00Africa/Kamp" +
-	"alaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00V\xadD\xef\xca\x01\x00\x00\xca\x01\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd0+\x00\x00Africa/Khar" +
-	"toumPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc7-\x00\x00Africa/Kig" +
-	"aliPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00u.\x00\x00Africa/Kins" +
-	"hasaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00V/\x00\x00Africa/Lag" +
-	"osPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0040\x00\x00Africa/Libre" +
-	"villePK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\v\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x171\x00\x00Africa/Lo" +
-	"mePK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc21\x00\x00Africa/Luand" +
-	"aPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa12\x00\x00Africa/Lubumb" +
-	"ashiPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00S3\x00\x00Africa/Lus" +
-	"akaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x014\x00\x00Africa/Mala" +
-	"boPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe04\x00\x00Africa/Maput" +
-	"oPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcc\fTξ\x00\x00\x00\xbe\x00\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8e5\x00\x00Africa/Maseru" +
-	"PK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcc\fTξ\x00\x00\x00\xbe\x00\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00w6\x00\x00Africa/Mbabane" +
-	"PK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00a7\x00\x00Africa/Mogadis" +
-	"huPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x006\x99rU\xa4\x00\x00\x00\xa4\x00\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00N8\x00\x00Africa/Monro" +
-	"viaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1f9\x00\x00Africa/Nair" +
-	"obiPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaa\x81\t\x03\xa0\x00\x00\x00\xa0\x00\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n:\x00\x00Africa/Ndja" +
-	"menaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd7:\x00\x00Africa/Nia" +
-	"meyPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb6;\x00\x00Africa/Noua" +
-	"kchottPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00g<\x00\x00Africa/O" +
-	"uagadougouPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x19=\x00\x00Afri" +
-	"ca/Porto-NovoPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc1\n\x8a\x84\xad\x00\x00\x00\xad\x00\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfc=\x00\x00A" +
-	"frica/Sao_TomePK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6>\x00\x00" +
-	"Africa/TimbuktuPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00_\x7f2[\xaf\x01\x00\x00\xaf\x01\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85?\x00" +
-	"\x00Africa/TripoliPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x93\xf4\x94\v\xc1\x01\x00\x00\xc1\x01\x00\x00\f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00`A\x00" +
-	"\x00Africa/TunisPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00m)\xb8P~\x02\x00\x00~\x02\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00KC\x00\x00A" +
-	"frica/WindhoekPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xae,\xa44\xc9\x03\x00\x00\xc9\x03\x00\x00\f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf6E\x00\x00" +
-	"America/AdakPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x005\x11Q\x06\xd1\x03\x00\x00\xd1\x03\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe9I\x00\x00Am" +
-	"erica/AnchoragePK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00q\xc9*;\xb1\x00\x00\x00\xb1\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe9M\x00" +
-	"\x00America/AnguillaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00q\xc9*;\xb1\x00\x00\x00\xb1\x00\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc8" +
-	"N\x00\x00America/AntiguaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00<\x01V\rP\x02\x00\x00P\x02\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\xa6O\x00\x00America/AraguainaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\xbf\xf5\xe5\xc4\x02\x00\x00\xc4\x02\x00\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00%R\x00\x00America/Argentina/Buenos_AiresPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00R\xc8\xd9\xf6\xc4\x02\x00" +
-	"\x00\xc4\x02\x00\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00%U\x00\x00America/Argentina/CatamarcaPK\x01\x02\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00R\xc8\xd9\xf6\xc4\x02\x00\x00\xc4\x02\x00\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\"X\x00\x00America/Argentina/ComodR" +
-	"ivadaviaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xef\xf0R\x8a\xc4\x02\x00\x00\xc4\x02\x00\x00\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00$[\x00\x00Americ" +
-	"a/Argentina/CordobaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00utZ\x1a\xb2\x02\x00\x00\xb2\x02\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x1f^\x00\x00America/Argentina/JujuyPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00m\aD\x0e\xcd\x02\x00\x00\xcd\x02\x00\x00\x1a\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06a\x00\x00America/Argentina/La_RiojaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00ŒZ\x8c" +
-	"\xc4\x02\x00\x00\xc4\x02\x00\x00\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\vd\x00\x00America/Argentina/MendozaPK\x01\x02\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x8ep\xb4c\xc4\x02\x00\x00\xc4\x02\x00\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06g\x00\x00America/Argentina/Rio_G" +
-	"allegosPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00t*\x9b!\xb2\x02\x00\x00\xb2\x02\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06j\x00\x00America" +
-	"/Argentina/SaltaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfcz=\xe1\xcd\x02\x00\x00\xcd\x02\x00\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xedl" +
-	"\x00\x00America/Argentina/San_JuanPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x80\xb9\\\xcd\x02\x00\x00\xcd\x02\x00\x00\x1a\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf2o\x00\x00America/Argentina/San_LuisPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Y\xd8֭" +
-	"\xd6\x02\x00\x00\xd6\x02\x00\x00\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf7r\x00\x00America/Argentina/TucumanPK\x01\x02\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x8b}\xb6\x1e\xc4\x02\x00\x00\xc4\x02\x00\x00\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04v\x00\x00America/Argentina/Ushua" +
-	"iaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00q\xc9*;\xb1\x00\x00\x00\xb1\x00\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xffx\x00\x00America/Arub" +
-	"aPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00d\xa9y\x9at\x03\x00\x00t\x03\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdby\x00\x00America/Asunc" +
-	"ionPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Ծ\xe7#\x95\x00\x00\x00\x95\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00}}\x00\x00America/Ati" +
-	"kokanPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xae,\xa44\xc9\x03\x00\x00\xc9\x03\x00\x00\f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00@~\x00\x00America/A" +
-	"tkaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00OKjǪ\x02\x00\x00\xaa\x02\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x003\x82\x00\x00America/Bah" +
-	"iaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00U\x0e\x01n\xd8\x02\x00\x00\xd8\x02\x00\x00\x16\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\b\x85\x00\x00America/Bahi" +
-	"a_BanderasPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00l=\xad\xbe\x16\x01\x00\x00\x16\x01\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x88\x00\x00Amer" +
-	"ica/BarbadosPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85-\xb9\xf8\x8a\x01\x00\x00\x8a\x01\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00X\x89\x00\x00Am" +
-	"erica/BelemPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x89غ\xee\x15\x04\x00\x00\x15\x04\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\r\x8b\x00\x00Ame" +
-	"rica/BelizePK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00q\xc9*;\xb1\x00\x00\x00\xb1\x00\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00N\x8f\x00\x00Ame" +
-	"rica/Blanc-SablonPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf8Dz\x97\xae\x01\x00\x00\xae\x01\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x001" +
-	"\x90\x00\x00America/Boa_VistaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00,g\xec\xec\xb3\x00\x00\x00\xb3\x00\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x0e\x92\x00\x00America/BogotaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00.\xbe\x1a>\xe7\x03\x00\x00\xe7\x03\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\xed\x92\x00\x00America/BoisePK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\xbf\xf5\xe5\xc4\x02\x00\x00\xc4\x02\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\xff\x96\x00\x00America/Buenos_AiresPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\xba\xb2\x94s\x03\x00\x00s\x03\x00\x00\x15\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\xf5\x99\x00\x00America/Cambridge_BayPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1e\xfbn۸\x03\x00\x00\xb8\x03\x00\x00" +
-	"\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9b\x9d\x00\x00America/Campo_GrandePK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf2\x04\xde\xdd\x11\x02" +
-	"\x00\x00\x11\x02\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\xa1\x00\x00America/CancunPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xac\x8e\xee\x13\xbe\x00" +
-	"\x00\x00\xbe\x00\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00£\x00\x00America/CaracasPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00R\xc8\xd9\xf6\xc4" +
-	"\x02\x00\x00\xc4\x02\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xad\xa4\x00\x00America/CatamarcaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa1'" +
-	"\a\xbd\x97\x00\x00\x00\x97\x00\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa0\xa7\x00\x00America/CayennePK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd4" +
-	"\xbe\xe7#\x95\x00\x00\x00\x95\x00\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00d\xa8\x00\x00America/CaymanPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9b" +
-	"ܩ=\xda\x06\x00\x00\xda\x06\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00%\xa9\x00\x00America/ChicagoPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x111\x04q\xb3\x02\x00\x00\xb3\x02\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00,\xb0\x00\x00America/ChihuahuaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\xad\xf2L\x06\xce\x02\x00\x00\xce\x02\x00\x00\x15\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0e\xb3\x00\x00America/Ciudad_JuarezPK\x01\x02\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Ծ\xe7#\x95\x00\x00\x00\x95\x00\x00\x00\x15\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\xb6\x00\x00America/Coral_Harbou" +
-	"rPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xef\xf0R\x8a\xc4\x02\x00\x00\xc4\x02\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\u05f6\x00\x00America/Cordo" +
-	"baPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1݂x\xe8\x00\x00\x00\xe8\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00ȹ\x00\x00America/Cost" +
-	"a_RicaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00ø\xab\x9b\xf0\x00\x00\x00\xf0\x00\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\xba\x00\x00America/" +
-	"CrestonPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f$*\xa0\xa6\x03\x00\x00\xa6\x03\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfd\xbb\x00\x00America" +
-	"/CuiabaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00q\xc9*;\xb1\x00\x00\x00\xb1\x00\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Ͽ\x00\x00America" +
-	"/CuracaoPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00k\xc2\rx\xbf\x01\x00\x00\xbf\x01\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xad\xc0\x00\x00Americ" +
-	"a/DanmarkshavnPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\xe6\xf5J\x05\x04\x00\x00\x05\x04\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9e\xc2\x00\x00" +
-	"America/DawsonPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00+\x10`ȫ\x02\x00\x00\xab\x02\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcf\xc6\x00\x00" +
-	"America/Dawson_CreekPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00V\x80\x94@\x12\x04\x00\x00\x12\x04\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\xac\xc9\x00\x00America/DenverPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00>\x14\xe7\x03\x83\x03\x00\x00\x83\x03\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\xea\xcd\x00\x00America/DetroitPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00q\xc9*;\xb1\x00\x00\x00\xb1\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x9a\xd1\x00\x00America/DominicaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00{\a\a\xdc\xca\x03\x00\x00\xca\x03\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00y\xd2\x00\x00America/EdmontonPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00s\xb0\xeau\xb4\x01\x00\x00\xb4\x01\x00\x00\x10\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00q\xd6\x00\x00America/EirunepePK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xea$\xc1\xbf\xb0\x00\x00\x00\xb0\x00\x00\x00\x13\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00S\xd8\x00\x00America/El_SalvadorPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9B$\x90\x01\x04\x00\x00\x01\x04\x00\x00" +
-	"\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x004\xd9\x00\x00America/EnsenadaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf6@\rm\xa8\x05\x00\x00\xa8\x05" +
-	"\x00\x00\x13\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00c\xdd\x00\x00America/Fort_NelsonPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00p\xb6{\xc9\x13" +
-	"\x02\x00\x00\x13\x02\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00<\xe3\x00\x00America/Fort_WaynePK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4" +
-	"\x11Z\xde\xe4\x01\x00\x00\xe4\x01\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\xe5\x00\x00America/FortalezaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00M\x94\xc7Kp\x03\x00\x00p\x03\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x92\xe7\x00\x00America/Glace_BayPK\x01\x02\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x80\xbc\xc9I\xa3\x03\x00\x00\xa3\x03\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x001\xeb\x00\x00America/GodthabPK\x01\x02\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x1d\xf7\a ,\x06\x00\x00,\x06\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xef\x00\x00America/Goose_BayPK\x01\x02\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe3\xc9I\xd0U\x03\x00\x00U\x03\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\\\xf5\x00\x00America/Grand_TurkPK\x01" +
-	"\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00q\xc9*;\xb1\x00\x00\x00\xb1\x00\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe1\xf8\x00\x00America/GrenadaPK" +
-	"\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00q\xc9*;\xb1\x00\x00\x00\xb1\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbf\xf9\x00\x00America/Guadelou" +
-	"pePK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xac\x8a\x83S\xd4\x00\x00\x00\xd4\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa0\xfa\x00\x00America/Guat" +
-	"emalaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcd\xc3v\xe3\xb3\x00\x00\x00\xb3\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\xfb\x00\x00America/G" +
-	"uayaquilPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x05\xf3\x89\xb5\x00\x00\x00\xb5\x00\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\xfc\x00\x00Americ" +
-	"a/GuyanaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00):\x17-\x88\x06\x00\x00\x88\x06\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00f\xfd\x00\x00Americ" +
-	"a/HalifaxPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\x1c\x9e\x9a]\x04\x00\x00]\x04\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x04\x01\x00Ameri" +
-	"ca/HavanaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe4MS\x99\x1e\x01\x00\x00\x1e\x01\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\b\x01\x00Ameri" +
-	"ca/HermosilloPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00p\xb6{\xc9\x13\x02\x00\x00\x13\x02\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf2\t\x01\x00A" +
-	"merica/Indiana/IndianapolisPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00$ \x873\xf8\x03\x00\x00\xf8\x03\x00\x00\x14\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00?\f\x01\x00America/Indiana/KnoxPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00M/U\x9f7\x02\x00\x007\x02\x00" +
-	"\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00i\x10\x01\x00America/Indiana/MarengoPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xd8" +
-	"N\x8c\xab\x02\x00\x00\xab\x02\x00\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd5\x12\x01\x00America/Indiana/PetersburgPK\x01\x02\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00صK\xa6\n\x02\x00\x00\n\x02\x00\x00\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x15\x01\x00America/Indiana/Tell" +
-	"_CityPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x17\x89}q\x01\x00\x00q\x01\x00\x00\x15\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf9\x17\x01\x00America/I" +
-	"ndiana/VevayPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\r\xedsp.\x02\x00\x00.\x02\x00\x00\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9d\x19\x01\x00Am" +
-	"erica/Indiana/VincennesPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00K-E\xfad\x02\x00\x00d\x02\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x02\x1c\x01\x00America/Indiana/WinamacPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00p\xb6{\xc9\x13\x02\x00\x00\x13\x02\x00\x00" +
-	"\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9b\x1e\x01\x00America/IndianapolisPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00ʼ\to1\x03" +
-	"\x00\x001\x03\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0 \x01\x00America/InuvikPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Š\xd6\x05W\x03" +
-	"\x00\x00W\x03\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00=$\x01\x00America/IqaluitPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00%J\xd5\xebS" +
-	"\x01\x00\x00S\x01\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc1'\x01\x00America/JamaicaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00utZ\x1a" +
-	"\xb2\x02\x00\x00\xb2\x02\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00A)\x01\x00America/JujuyPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?\xc9\x1c\xd4\xc6" +
-	"\x03\x00\x00\xc6\x03\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1e,\x01\x00America/JuneauPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdf\xe5\x8d\xc4\xda" +
-	"\x04\x00\x00\xda\x04\x00\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x100\x01\x00America/Kentucky/LouisvillePK\x01\x02\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x03\x1a|J\xcc\x03\x00\x00\xcc\x03\x00\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00#5\x01\x00America/Kentucky/Monti" +
-	"celloPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00$ \x873\xf8\x03\x00\x00\xf8\x03\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00(9\x01\x00America/K" +
-	"nox_INPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00q\xc9*;\xb1\x00\x00\x00\xb1\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00M=\x01\x00America/" +
-	"KralendijkPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xad`\x12\xe9\xaa\x00\x00\x00\xaa\x00\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00.>\x01\x00Amer" +
-	"ica/La_PazPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe7\xa1\x87\x1b\x01\x00\x00\x1b\x01\x00\x00\f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04?\x01\x00Amer" +
-	"ica/LimaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf6\"\x12\xfe\x0e\x05\x00\x00\x0e\x05\x00\x00\x13\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00I@\x01\x00Americ" +
-	"a/Los_AngelesPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdf\xe5\x8d\xc4\xda\x04\x00\x00\xda\x04\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88E\x01\x00A" +
-	"merica/LouisvillePK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00q\xc9*;\xb1\x00\x00\x00\xb1\x00\x00\x00\x15\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x92" +
-	"J\x01\x00America/Lower_PrincesPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00挋\x92\xf6\x01\x00\x00\xf6\x01\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00vK\x01\x00America/MaceioPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe5s\xb3\\'\x01\x00\x00'\x01\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x98M\x01\x00America/ManaguaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00a\xcb'\xe9\x9c\x01\x00\x00\x9c\x01\x00\x00\x0e\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\xecN\x01\x00America/ManausPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00q\xc9*;\xb1\x00\x00\x00\xb1\x00\x00\x00\x0f\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\xb4P\x01\x00America/MarigotPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa7\x17jҲ\x00\x00\x00\xb2\x00\x00\x00\x12\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x92Q\x01\x00America/MartiniquePK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00((i\xe4\xb5\x01\x00\x00\xb5\x01\x00\x00\x11\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00tR\x01\x00America/MatamorosPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\xad=\x98\xce\x02\x00\x00\xce\x02\x00" +
-	"\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00XT\x01\x00America/MazatlanPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00ŒZ\x8c\xc4\x02\x00\x00\xc4" +
-	"\x02\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00TW\x01\x00America/MendozaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x008O:\xbf\x95\x03\x00\x00" +
-	"\x95\x03\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00EZ\x01\x00America/MenomineePK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\xbd\x809\x8e" +
-	"\x02\x00\x00\x8e\x02\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\t^\x01\x00America/MeridaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x81\xbfyS" +
-	"\x02\x00\x00S\x02\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc3`\x01\x00America/MetlakatlaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd5" +
-	"\b\x89\x8c\x05\x03\x00\x00\x05\x03\x00\x00\x13\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Fc\x01\x00America/Mexico_CityPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\xd7\b\\\xc6&\x02\x00\x00&\x02\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00|f\x01\x00America/MiquelonPK\x01\x02\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00.\xf9\xc0\x1e\xd5\x05\x00\x00\xd5\x05\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd0h\x01\x00America/MonctonPK\x01\x02\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00L+\xe3u\x84\x02\x00\x00\x84\x02\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd2n\x01\x00America/MonterreyPK\x01\x02\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x98\x00\b\xc9\x03\x00\x00\xc9\x03\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85q\x01\x00America/MontevideoPK" +
-	"\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00ӿ\x92\xbc\xb5\x06\x00\x00\xb5\x06\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00~u\x01\x00America/Montreal" +
-	"PK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00q\xc9*;\xb1\x00\x00\x00\xb1\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00a|\x01\x00America/Montse" +
-	"rratPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00ӿ\x92\xbc\xb5\x06\x00\x00\xb5\x06\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00B}\x01\x00America/Na" +
-	"ssauPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x003\x9aG\xc8\xd0\x06\x00\x00\xd0\x06\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00#\x84\x01\x00America/Ne" +
-	"w_YorkPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00ӿ\x92\xbc\xb5\x06\x00\x00\xb5\x06\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00!\x8b\x01\x00America/" +
-	"NipigonPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00n\xab\xd5\xf9\xcf\x03\x00\x00\xcf\x03\x00\x00\f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x92\x01\x00America" +
-	"/NomePK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb7-2f\xe4\x01\x00\x00\xe4\x01\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfc\x95\x01\x00America/N" +
-	"oronhaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb7.\xb6*\x13\x04\x00\x00\x13\x04\x00\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\r\x98\x01\x00America/" +
-	"North_Dakota/BeulahPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00H\xeam\xef\xde\x03\x00\x00\xde\x03\x00\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00Y\x9c\x01\x00America/North_Dakota/CenterPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00R\x1b\x8b(\xde\x03\x00\x00\xde\x03\x00\x00" +
-	"\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00p\xa0\x01\x00America/North_Dakota/New_SalemPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x80\xbc\xc9I\xa3\x03\x00\x00\xa3\x03\x00\x00\f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8a\xa4\x01\x00America/NuukPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x01\xe5\x9e<\xc5\x02\x00\x00\xc5\x02\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00W\xa8\x01\x00America/OjinagaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00Ծ\xe7#\x95\x00\x00\x00\x95\x00\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00I\xab\x01\x00America/PanamaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00Š\xd6\x05W\x03\x00\x00W\x03\x00\x00\x13\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\xac\x01\x00America/PangnirtungPK\x01\x02\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\xf1\xf9\x1dɻ\x00\x00\x00\xbb\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x92\xaf\x01\x00America/ParamariboPK\x01\x02" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00ø\xab\x9b\xf0\x00\x00\x00\xf0\x00\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00}\xb0\x01\x00America/PhoenixPK\x01" +
-	"\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4T\xbd\xeb5\x02\x00\x005\x02\x00\x00\x16\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9a\xb1\x01\x00America/Port-au-P" +
-	"rincePK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00q\xc9*;\xb1\x00\x00\x00\xb1\x00\x00\x00\x15\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xb4\x01\x00America/P" +
-	"ort_of_SpainPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00g\xf5K\x89\xa2\x01\x00\x00\xa2\x01\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe7\xb4\x01\x00Am" +
-	"erica/Porto_AcrePK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x81-\xa9\x8a\x01\x00\x00\x8a\x01\x00\x00\x13\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\xb6" +
-	"\x01\x00America/Porto_VelhoPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00q\xc9*;\xb1\x00\x00\x00\xb1\x00\x00\x00\x13\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00t\xb8\x01\x00America/Puerto_RicoPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00@\x13\x9b\xb1\xc2\x04\x00\x00\xc2\x04\x00\x00\x14\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00V\xb9\x01\x00America/Punta_ArenasPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?_p\x99\x0e\x05\x00\x00\x0e\x05\x00\x00" +
-	"\x13\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00J\xbe\x01\x00America/Rainy_RiverPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xdfH\r'\x03\x00" +
-	"\x00'\x03\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x89\xc3\x01\x00America/Rankin_InletPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbf" +
-	"\x03u\xf3\xe4\x01\x00\x00\xe4\x01\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe2\xc6\x01\x00America/RecifePK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2" +
-	"\x96dK~\x02\x00\x00~\x02\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf2\xc8\x01\x00America/ReginaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb0" +
-	"I~D'\x03\x00\x00'\x03\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9c\xcb\x01\x00America/ResolutePK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00g\xf5K\x89\xa2\x01\x00\x00\xa2\x01\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\xce\x01\x00America/Rio_BrancoPK\x01\x02\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\xef\xf0R\x8a\xc4\x02\x00\x00\xc4\x02\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc3\xd0\x01\x00America/RosarioPK\x01\x02\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\xb9B$\x90\x01\x04\x00\x00\x01\x04\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\xd3\x01\x00America/Santa_IsabelPK\x01\x02" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04,2h\x99\x01\x00\x00\x99\x01\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe7\xd7\x01\x00America/SantaremPK" +
-	"\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00]\"_WJ\x05\x00\x00J\x05\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xae\xd9\x01\x00America/Santiago" +
-	"PK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00P\x0f(\b=\x01\x00\x00=\x01\x00\x00\x15\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00&\xdf\x01\x00America/Santo_" +
-	"DomingoPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9d?\xdfڸ\x03\x00\x00\xb8\x03\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x96\xe0\x01\x00America" +
-	"/Sao_PauloPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00:\x9a1T\xdf\x01\x00\x00\xdf\x01\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00}\xe4\x01\x00Amer" +
-	"ica/ScoresbysundPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00V\x80\x94@\x12\x04\x00\x00\x12\x04\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8e\xe6" +
-	"\x01\x00America/ShiprockPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x81{\xc1\x92\xbc\x03\x00\x00\xbc\x03\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\xce\xea\x01\x00America/SitkaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00q\xc9*;\xb1\x00\x00\x00\xb1\x00\x00\x00\x15\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb5" +
-	"\xee\x01\x00America/St_BarthelemyPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00~\xb2\x0e\x19V\a\x00\x00V\a\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x99\xef\x01\x00America/St_JohnsPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00q\xc9*;\xb1\x00\x00\x00\xb1\x00\x00\x00\x10\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x1d\xf7\x01\x00America/St_KittsPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00q\xc9*;\xb1\x00\x00\x00\xb1\x00\x00\x00\x10\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfc\xf7\x01\x00America/St_LuciaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00q\xc9*;\xb1\x00\x00\x00\xb1\x00\x00\x00\x11\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb\xf8\x01\x00America/St_ThomasPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00q\xc9*;\xb1\x00\x00\x00\xb1\x00\x00" +
-	"\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbb\xf9\x01\x00America/St_VincentPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\xd8\x19\x9dp\x01\x00" +
-	"\x00p\x01\x00\x00\x15\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9c\xfa\x01\x00America/Swift_CurrentPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x82\x13z\xe2\xc2\x00\x00\x00\xc2\x00\x00\x00\x13\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?\xfc\x01\x00America/TegucigalpaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00U\r\xf7\xd3\xc7\x01\x00\x00\xc7\x01\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x002\xfd\x01\x00America/ThulePK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00ӿ\x92\xbc\xb5\x06\x00\x00\xb5\x06\x00\x00\x13\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00$\xff\x01\x00America/Thunder_BayPK\x01\x02\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9B$\x90\x01\x04\x00\x00\x01\x04\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x06\x02\x00America/TijuanaPK\x01\x02\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00ӿ\x92\xbc\xb5\x06\x00\x00\xb5\x06\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x008\n\x02\x00America/TorontoPK\x01\x02\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00q\xc9*;\xb1\x00\x00\x00\xb1\x00\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x11\x02\x00America/TortolaPK\x01\x02" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00U9#\xbe2\x05\x00\x002\x05\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf8\x11\x02\x00America/VancouverP" +
-	"K\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00q\xc9*;\xb1\x00\x00\x00\xb1\x00\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Y\x17\x02\x00America/VirginP" +
-	"K\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbf\x1d\xee\x91\x05\x04\x00\x00\x05\x04\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x006\x18\x02\x00America/Whiteho" +
-	"rsePK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?_p\x99\x0e\x05\x00\x00\x0e\x05\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00k\x1c\x02\x00America/Win" +
-	"nipegPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00,\xdb~\xab\xb2\x03\x00\x00\xb2\x03\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa7!\x02\x00America/Y" +
-	"akutatPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/5\xe20L\x03\x00\x00L\x03\x00\x00\x13\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x86%\x02\x00America/" +
-	"YellowknifePK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xddzAh\xf3\x00\x00\x00\xf3\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03)\x02\x00Ant" +
-	"arctica/CaseyPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x95\xea\x06\xd3\xc5\x00\x00\x00\xc5\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00$*\x02\x00A" +
-	"ntarctica/DavisPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00n\x04\x19y\x9a\x00\x00\x00\x9a\x00\x00\x00\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17+\x02" +
-	"\x00Antarctica/DumontDUrvillePK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb2\x84J]\xd0\x03\x00\x00\xd0\x03\x00\x00\x14\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\xe8+\x02\x00Antarctica/MacquariePK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd7N\xab\x8b\x98\x00\x00\x00\x98\x00\x00\x00" +
-	"\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xea/\x02\x00Antarctica/MawsonPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00b\xb2\xaf\xf7\x13\x04\x00\x00\x13" +
-	"\x04\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb10\x02\x00Antarctica/McMurdoPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x95{\xf3\xa9w" +
-	"\x03\x00\x00w\x03\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf44\x02\x00Antarctica/PalmerPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Ɖ" +
-	"\xf71\x84\x00\x00\x00\x84\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9a8\x02\x00Antarctica/RotheraPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00b\xb2\xaf\xf7\x13\x04\x00\x00\x13\x04\x00\x00\x15\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00N9\x02\x00Antarctica/South_PolePK\x01\x02\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcfׇ\xe1\x85\x00\x00\x00\x85\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x94=\x02\x00Antarctica/SyowaPK\x01\x02\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00:\xc8P7\xb1\x00\x00\x00\xb1\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00G>\x02\x00Antarctica/TrollPK\x01" +
-	"\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00B\x1d\xc6\x1b\x85\x00\x00\x00\x85\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00&?\x02\x00Antarctica/Vostok" +
-	"PK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17S\x91\xb3\xc1\x02\x00\x00\xc1\x02\x00\x00\x13\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xda?\x02\x00Arctic/Longyea" +
-	"rbyenPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcfׇ\xe1\x85\x00\x00\x00\x85\x00\x00\x00\t\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xccB\x02\x00Asia/Aden" +
-	"PK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00S\xdd\\2a\x02\x00\x00a\x02\x00\x00\v\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00xC\x02\x00Asia/AlmatyPK\x01" +
-	"\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaf\rs\xad\xa0\x03\x00\x00\xa0\x03\x00\x00\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02F\x02\x00Asia/AmmanPK\x01\x02\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00V\xe0\xe7!\xe7\x02\x00\x00\xe7\x02\x00\x00\v\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcaI\x02\x00Asia/AnadyrPK\x01\x02\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00T\x81\x18G^\x02\x00\x00^\x02\x00\x00\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdaL\x02\x00Asia/AqtauPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\xdb\xfa\xb5\xbeg\x02\x00\x00g\x02\x00\x00\v\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00`O\x02\x00Asia/AqtobePK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00e" +
-	"\x1bb2w\x01\x00\x00w\x01\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0Q\x02\x00Asia/AshgabatPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00e\x1b" +
-	"b2w\x01\x00\x00w\x01\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x92S\x02\x00Asia/AshkhabadPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?\xa7" +
-	"^\xfah\x02\x00\x00h\x02\x00\x00\v\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x005U\x02\x00Asia/AtyrauPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd7e&uv" +
-	"\x02\x00\x00v\x02\x00\x00\f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc6W\x02\x00Asia/BaghdadPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdav\x19z\x98\x00\x00" +
-	"\x00\x98\x00\x00\x00\f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00fZ\x02\x00Asia/BahrainPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x87\xb3<\xe8\x02\x00\x00\xe8" +
-	"\x02\x00\x00\t\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00([\x02\x00Asia/BakuPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\xf6C\x84\x98\x00\x00\x00\x98\x00\x00\x00\f\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x007^\x02\x00Asia/BangkokPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x87\xbd\xedL\xf1\x02\x00\x00\xf1\x02\x00\x00\f\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf9^\x02\x00Asia/BarnaulPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc7\x11\xe1[\xdc\x02\x00\x00\xdc\x02\x00\x00\v\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x14b\x02\x00Asia/BeirutPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x000]*\x1bj\x02\x00\x00j\x02\x00\x00\f\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x19e\x02\x00Asia/BishkekPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa7f^]@\x01\x00\x00@\x01\x00\x00\v\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\xadg\x02\x00Asia/BruneiPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9a\x1a\xdc\xca\xdc\x00\x00\x00\xdc\x00\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x16i\x02\x00Asia/CalcuttaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xab\xcd\xdf\x05\xee\x02\x00\x00\xee\x02\x00\x00\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1d" +
-	"j\x02\x00Asia/ChitaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x81z&\x80k\x02\x00\x00k\x02\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x003m\x02\x00A" +
-	"sia/ChoibalsanPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00*\xe4@\xa9\x89\x01\x00\x00\x89\x01\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcbo\x02\x00" +
-	"Asia/ChongqingPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00*\xe4@\xa9\x89\x01\x00\x00\x89\x01\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80q\x02\x00" +
-	"Asia/ChungkingPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\\\x91\x87\xbb\xf7\x00\x00\x00\xf7\x00\x00\x00\f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x005s\x02\x00" +
-	"Asia/ColomboPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?Y\xaf\x19\xe7\x00\x00\x00\xe7\x00\x00\x00\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Vt\x02\x00As" +
-	"ia/DaccaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x87\a\xeci\xd2\x04\x00\x00\xd2\x04\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00eu\x02\x00Asia/D" +
-	"amascusPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?Y\xaf\x19\xe7\x00\x00\x00\xe7\x00\x00\x00\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00bz\x02\x00Asia/Dh" +
-	"akaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Β\x1a\x8c\xaa\x00\x00\x00\xaa\x00\x00\x00\t\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00q{\x02\x00Asia/DiliPK" +
-	"\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xed\x8c\xf1\x91\x85\x00\x00\x00\x85\x00\x00\x00\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00B|\x02\x00Asia/DubaiPK\x01\x02\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00's\x96\x1en\x01\x00\x00n\x01\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xef|\x02\x00Asia/DushanbePK\x01\x02\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00]S\xbb\x12\xac\x03\x00\x00\xac\x03\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88~\x02\x00Asia/FamagustaPK\x01\x02\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00= \x17x\xea\x04\x00\x00\xea\x04\x00\x00\t\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00`\x82\x02\x00Asia/GazaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00*\xe4@\xa9\x89\x01\x00\x00\x89\x01\x00\x00\v\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00q\x87\x02\x00Asia/HarbinPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00C\xbe\x86\xb6\xfc\x04\x00\x00\xfc\x04\x00\x00\v\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00#\x89\x02\x00Asia/HebronPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x000I" +
-	"\xc7\xde\xec\x00\x00\x00\xec\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00H\x8e\x02\x00Asia/Ho_Chi_MinhPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"E\t\xfa-\a\x03\x00\x00\a\x03\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00b\x8f\x02\x00Asia/Hong_KongPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\xba\xa3b\xc1R\x02\x00\x00R\x02\x00\x00\t\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x95\x92\x02\x00Asia/HovdPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf9l\x03\x12\xf8" +
-	"\x02\x00\x00\xf8\x02\x00\x00\f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0e\x95\x02\x00Asia/IrkutskPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\aW\x10Ѱ\x04\x00" +
-	"\x00\xb0\x04\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x000\x98\x02\x00Asia/IstanbulPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00b\xadű\xf8\x00\x00\x00" +
-	"\xf8\x00\x00\x00\f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\v\x9d\x02\x00Asia/JakartaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00.>[K\xab\x00\x00\x00\xab\x00" +
-	"\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00-\x9e\x02\x00Asia/JayapuraPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17✳2\x04\x00\x002\x04\x00" +
-	"\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x9f\x02\x00Asia/JerusalemPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\xe2\\\xff\x9f\x00\x00\x00\x9f\x00\x00" +
-	"\x00\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00a\xa3\x02\x00Asia/KabulPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0\x9cf>\xd7\x02\x00\x00\xd7\x02\x00\x00\x0e\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00(\xa4\x02\x00Asia/KamchatkaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x009Y\xb7\xf1\n\x01\x00\x00\n\x01\x00\x00\f\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00+\xa7\x02\x00Asia/KarachiPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00B\x1d\xc6\x1b\x85\x00\x00\x00\x85\x00\x00\x00\f\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00_\xa8\x02\x00Asia/KashgarPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8bSnT\xa1\x00\x00\x00\xa1\x00\x00\x00\x0e\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x0e\xa9\x02\x00Asia/KathmanduPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8bSnT\xa1\x00\x00\x00\xa1\x00\x00\x00\r\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00۩\x02\x00Asia/KatmanduPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x83g\x95M\a\x03\x00\x00\a\x03\x00\x00\r\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\xa7\xaa\x02\x00Asia/KhandygaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9a\x1a\xdc\xca\xdc\x00\x00\x00\xdc\x00\x00\x00\f\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00٭\x02\x00Asia/KolkataPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00L\xe0\x91y\xe5\x02\x00\x00\xe5\x02\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00߮\x02\x00Asia/KrasnoyarskPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00F7k\x1c\x00\x01\x00\x00\x00\x01\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\xf2\xb1\x02\x00Asia/Kuala_LumpurPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa7f^]@\x01\x00\x00@\x01\x00\x00\f\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00!\xb3\x02\x00Asia/KuchingPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcfׇ\xe1\x85\x00\x00\x00\x85\x00\x00\x00\v\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x8b\xb4\x02\x00Asia/KuwaitPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1d?v\f\x17\x03\x00\x00\x17\x03\x00\x00\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x009\xb5\x02\x00Asia/MacaoPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1d?v\f\x17\x03\x00\x00\x17\x03\x00\x00\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00x" +
-	"\xb8\x02\x00Asia/MacauPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe4_P\x18\xef\x02\x00\x00\xef\x02\x00\x00\f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb7\xbb\x02\x00A" +
-	"sia/MagadanPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00`\xc9\xd4\\\xbe\x00\x00\x00\xbe\x00\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00о\x02\x00Asi" +
-	"a/MakassarPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00ǯ\xdf\x1c\xee\x00\x00\x00\xee\x00\x00\x00\v\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\xbf\x02\x00Asia" +
-	"/ManilaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xed\x8c\xf1\x91\x85\x00\x00\x00\x85\x00\x00\x00\v\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd0\xc0\x02\x00Asia/Mu" +
-	"scatPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03R\xda\xedU\x02\x00\x00U\x02\x00\x00\f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00~\xc1\x02\x00Asia/Nicos" +
-	"iaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8a\x9a\x90\xf7\xd6\x02\x00\x00\xd6\x02\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfd\xc3\x02\x00Asia/Novokuz" +
-	"netskPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00)p\x1cX\xf1\x02\x00\x00\xf1\x02\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\xc7\x02\x00Asia/Novo" +
-	"sibirskPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00:\x11\xea\xa2\xe5\x02\x00\x00\xe5\x02\x00\x00\t\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00!\xca\x02\x00Asia/Om" +
-	"skPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00&\xe9\xd1\xd8q\x02\x00\x00q\x02\x00\x00\t\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00-\xcd\x02\x00Asia/OralPK\x01" +
-	"\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\xf6C\x84\x98\x00\x00\x00\x98\x00\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc5\xcf\x02\x00Asia/Phnom_PenhPK" +
-	"\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00S\xa5\x81e\xf7\x00\x00\x00\xf7\x00\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8a\xd0\x02\x00Asia/PontianakPK" +
-	"\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8a\xc1\x1eB\xb7\x00\x00\x00\xb7\x00\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xad\xd1\x02\x00Asia/PyongyangPK" +
-	"\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdav\x19z\x98\x00\x00\x00\x98\x00\x00\x00\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90\xd2\x02\x00Asia/QatarPK\x01\x02\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa1\xfax\x98g\x02\x00\x00g\x02\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00P\xd3\x02\x00Asia/QostanayPK\x01\x02\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd5ΜGp\x02\x00\x00p\x02\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe2\xd5\x02\x00Asia/QyzylordaPK\x01\x02\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00ʇ{_\xbb\x00\x00\x00\xbb\x00\x00\x00\f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00~\xd8\x02\x00Asia/RangoonPK\x01\x02\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\xcfׇ\xe1\x85\x00\x00\x00\x85\x00\x00\x00\v\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00c\xd9\x02\x00Asia/RiyadhPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x000I\xc7\xde\xec\x00\x00\x00\xec\x00\x00\x00\v\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\xda\x02\x00Asia/SaigonPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00)\x15II\xf3\x02\x00\x00\xf3\x02\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00&\xdb\x02\x00Asia/SakhalinPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"w\rD\an\x01\x00\x00n\x01\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00D\xde\x02\x00Asia/SamarkandPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\xc7X,Y\x9f\x01\x00\x00\x9f\x01\x00\x00\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xdf\x02\x00Asia/SeoulPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00*\xe4@\xa9" +
-	"\x89\x01\x00\x00\x89\x01\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa5\xe1\x02\x00Asia/ShanghaiPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00F7k\x1c\x00" +
-	"\x01\x00\x00\x00\x01\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Y\xe3\x02\x00Asia/SingaporePK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4Zߐ\xe6" +
-	"\x02\x00\x00\xe6\x02\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\xe4\x02\x00Asia/SrednekolymskPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xee" +
-	"\xf0BB\xff\x01\x00\x00\xff\x01\x00\x00\v\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9b\xe7\x02\x00Asia/TaipeiPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb2\xe27Y" +
-	"n\x01\x00\x00n\x01\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc3\xe9\x02\x00Asia/TashkentPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Ѿ\xa8\xc7u" +
-	"\x02\x00\x00u\x02\x00\x00\f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\\\xeb\x02\x00Asia/TbilisiPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8c\xdb?\xec,\x03\x00" +
-	"\x00,\x03\x00\x00\v\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfb\xed\x02\x00Asia/TehranPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17✳2\x04\x00\x002\x04" +
-	"\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00P\xf1\x02\x00Asia/Tel_AvivPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00j$\xcd\xf4\x9a\x00\x00\x00\x9a\x00\x00" +
-	"\x00\v\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xad\xf5\x02\x00Asia/ThimbuPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00j$\xcd\xf4\x9a\x00\x00\x00\x9a\x00\x00\x00\f\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00p\xf6\x02\x00Asia/ThimphuPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\xf4\xaeg\xd5\x00\x00\x00\xd5\x00\x00\x00\n\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x004\xf7\x02\x00Asia/TokyoPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00[u\x99q\xf1\x02\x00\x00\xf1\x02\x00\x00\n\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x001\xf8\x02\x00Asia/TomskPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00`\xc9\xd4\\\xbe\x00\x00\x00\xbe\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00J\xfb\x02\x00Asia/Ujung_PandangPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb2\xb9\xf4\xb6R\x02\x00\x00R\x02\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x008\xfc\x02\x00Asia/UlaanbaatarPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb2\xb9\xf4\xb6R\x02\x00\x00R\x02\x00\x00\x0f\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\xb8\xfe\x02\x00Asia/Ulan_BatorPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00B\x1d\xc6\x1b\x85\x00\x00\x00\x85\x00\x00\x00\v\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x007\x01\x03\x00Asia/UrumqiPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00w\x86\x8d^\x03\x03\x00\x00\x03\x03\x00\x00\r\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\xe5\x01\x03\x00Asia/Ust-NeraPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\xf6C\x84\x98\x00\x00\x00\x98\x00\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x13\x05\x03\x00Asia/VientianePK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00d%\x05\xd8\xe6\x02\x00\x00\xe6\x02\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\xd7\x05\x03\x00Asia/VladivostokPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00O\xb0\x03\xe9\xe5\x02\x00\x00\xe5\x02\x00\x00\f\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\xeb\b\x03\x00Asia/YakutskPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00ʇ{_\xbb\x00\x00\x00\xbb\x00\x00\x00\v\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\xfa\v\x03\x00Asia/YangonPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9a\xea\x18\xd4\xf8\x02\x00\x00\xf8\x02\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\xde\f\x03\x00Asia/YekaterinburgPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x95-\xad\xc4\x02\x00\x00\xc4\x02\x00\x00\f\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x06\x10\x03\x00Asia/YerevanPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe8\x8dY\x80\xad\x05\x00\x00\xad\x05\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\xf4\x12\x03\x00Atlantic/AzoresPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00l&\x04\x99\x00\x04\x00\x00\x00\x04\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\xce\x18\x03\x00Atlantic/BermudaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaf|7\xb3\xde\x01\x00\x00\xde\x01\x00\x00\x0f\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\xfc\x1c\x03\x00Atlantic/CanaryPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\u0097N\xad\xaf\x00\x00\x00\xaf\x00\x00\x00\x13\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\a\x1f\x03\x00Atlantic/Cape_VerdePK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb7\x0e\xbdm\xb9\x01\x00\x00\xb9\x01\x00\x00\x0f" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe7\x1f\x03\x00Atlantic/FaeroePK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb7\x0e\xbdm\xb9\x01\x00\x00\xb9\x01\x00\x00" +
-	"\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcd!\x03\x00Atlantic/FaroePK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17S\x91\xb3\xc1\x02\x00\x00\xc1\x02\x00\x00" +
-	"\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb2#\x03\x00Atlantic/Jan_MayenPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x001)7\xad\xad\x05\x00\x00" +
-	"\xad\x05\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3&\x03\x00Atlantic/MadeiraPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\b{\x87\x82\x00" +
-	"\x00\x00\x82\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00~,\x03\x00Atlantic/ReykjavikPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f-" +
-	"\xadׄ\x00\x00\x00\x84\x00\x00\x00\x16\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x000-\x03\x00Atlantic/South_GeorgiaPK\x01\x02\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe8-\x03\x00Atlantic/St_HelenaPK\x01\x02\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe7\xcf^\xb0\x15\x03\x00\x00\x15\x03\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9a.\x03\x00Atlantic/StanleyPK\x01\x02" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00X\xb9\x9ap\x88\x03\x00\x00\x88\x03\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdd1\x03\x00Australia/ACTPK\x01\x02\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8ff~ՙ\x03\x00\x00\x99\x03\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x905\x03\x00Australia/AdelaideP" +
-	"K\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x003\xba\xde\xd3!\x01\x00\x00!\x01\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Y9\x03\x00Australia/Brisb" +
-	"anePK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbd\xca#\x7f\xad\x03\x00\x00\xad\x03\x00\x00\x15\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaa:\x03\x00Australia/B" +
-	"roken_HillPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00X\xb9\x9ap\x88\x03\x00\x00\x88\x03\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8a>\x03\x00Aust" +
-	"ralia/CanberraPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00E\xf2\xe6Z\xeb\x03\x00\x00\xeb\x03\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00BB\x03\x00" +
-	"Australia/CurriePK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc8R\x1a\x1b\xea\x00\x00\x00\xea\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00[F" +
-	"\x03\x00Australia/DarwinPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2ܺ\xca:\x01\x00\x00:\x01\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"sG\x03\x00Australia/EuclaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00E\xf2\xe6Z\xeb\x03\x00\x00\xeb\x03\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\xdaH\x03\x00Australia/HobartPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00o3\xdaR\xb4\x02\x00\x00\xb4\x02\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\xf3L\x03\x00Australia/LHIPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?\x95\xbd\x12E\x01\x00\x00E\x01\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\xd2O\x03\x00Australia/LindemanPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00o3\xdaR\xb4\x02\x00\x00\xb4\x02\x00\x00\x13\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00GQ\x03\x00Australia/Lord_HowePK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9b\xe1\xc1\xa9\x88\x03\x00\x00\x88\x03\x00\x00\x13\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00,T\x03\x00Australia/MelbournePK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00X\xb9\x9ap\x88\x03\x00\x00\x88\x03" +
-	"\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe5W\x03\x00Australia/NSWPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc8R\x1a\x1b\xea\x00\x00\x00\xea\x00\x00" +
-	"\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x98[\x03\x00Australia/NorthPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00ϻ\xca\x1a2\x01\x00\x002\x01" +
-	"\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaf\\\x03\x00Australia/PerthPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x003\xba\xde\xd3!\x01\x00\x00!" +
-	"\x01\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0e^\x03\x00Australia/QueenslandPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8ff~" +
-	"ՙ\x03\x00\x00\x99\x03\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00a_\x03\x00Australia/SouthPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00X\xb9" +
-	"\x9ap\x88\x03\x00\x00\x88\x03\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'c\x03\x00Australia/SydneyPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"E\xf2\xe6Z\xeb\x03\x00\x00\xeb\x03\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xddf\x03\x00Australia/TasmaniaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x9b\xe1\xc1\xa9\x88\x03\x00\x00\x88\x03\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf8j\x03\x00Australia/VictoriaPK\x01\x02\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00ϻ\xca\x1a2\x01\x00\x002\x01\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb0n\x03\x00Australia/WestPK\x01\x02\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\xbd\xca#\x7f\xad\x03\x00\x00\xad\x03\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0ep\x03\x00Australia/YancowinnaPK" +
-	"\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00g\xf5K\x89\xa2\x01\x00\x00\xa2\x01\x00\x00\v\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xeds\x03\x00Brazil/AcrePK\x01\x02\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb7-2f\xe4\x01\x00\x00\xe4\x01\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8u\x03\x00Brazil/DeNoronhaPK\x01" +
-	"\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9d?\xdfڸ\x03\x00\x00\xb8\x03\x00\x00\v\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcaw\x03\x00Brazil/EastPK\x01\x02\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00a\xcb'\xe9\x9c\x01\x00\x00\x9c\x01\x00\x00\v\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xab{\x03\x00Brazil/WestPK\x01\x02\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\xe6\x9aM\xbem\x02\x00\x00m\x02\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00p}\x03\x00CETPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00<\x8b\x99\x1e" +
-	"\xb7\x03\x00\x00\xb7\x03\x00\x00\a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x7f\x03\x00CST6CDTPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00):\x17-\x88\x06\x00\x00\x88\x06\x00" +
-	"\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00ڃ\x03\x00Canada/AtlanticPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?_p\x99\x0e\x05\x00\x00\x0e\x05" +
-	"\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8f\x8a\x03\x00Canada/CentralPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00ӿ\x92\xbc\xb5\x06\x00\x00\xb5\x06" +
-	"\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00ɏ\x03\x00Canada/EasternPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00{\a\a\xdc\xca\x03\x00\x00\xca\x03" +
-	"\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaa\x96\x03\x00Canada/MountainPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00~\xb2\x0e\x19V\a\x00\x00V" +
-	"\a\x00\x00\x13\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa1\x9a\x03\x00Canada/NewfoundlandPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00U9#\xbe" +
-	"2\x05\x00\x002\x05\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00(\xa2\x03\x00Canada/PacificPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\u0096dK" +
-	"~\x02\x00\x00~\x02\x00\x00\x13\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x86\xa7\x03\x00Canada/SaskatchewanPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\xbf\x1d\xee\x91\x05\x04\x00\x00\x05\x04\x00\x00\f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x005\xaa\x03\x00Canada/YukonPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00]" +
-	"\"_WJ\x05\x00\x00J\x05\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00d\xae\x03\x00Chile/ContinentalPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00?X'\x8e\x96\x04\x00\x00\x96\x04\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00ݳ\x03\x00Chile/EasterIslandPK\x01\x02\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\a\x1c\x9e\x9a]\x04\x00\x00]\x04\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\xb8\x03\x00CubaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00`l\x8d~" +
-	"\xf1\x01\x00\x00\xf1\x01\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\"\xbd\x03\x00EETPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00tX\xbe\xe4o\x00\x00\x00o\x00\x00\x00\x03\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x004\xbf\x03\x00ESTPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe7/\xebT\xb7\x03\x00\x00\xb7\x03\x00\x00\a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"Ŀ\x03\x00EST5EDTPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12tnj\xfc\x04\x00\x00\xfc\x04\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa0\xc3\x03\x00Egy" +
-	"ptPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa1\xd6jL\xd8\x05\x00\x00\xd8\x05\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbf\xc8\x03\x00EirePK\x01\x02\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00P\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\xce\x03\x00Etc/GMTPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00P\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\t\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00M\xcf\x03\x00Etc/GMT+0PK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x005\xb8\xe8\x86" +
-	"q\x00\x00\x00q\x00\x00\x00\t\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe3\xcf\x03\x00Etc/GMT+1PK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8e\x1569r\x00\x00\x00r" +
-	"\x00\x00\x00\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00{\xd0\x03\x00Etc/GMT+10PK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00)\xb9\xbe\x9dr\x00\x00\x00r\x00\x00\x00\n" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x15\xd1\x03\x00Etc/GMT+11PK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe5\xf38cr\x00\x00\x00r\x00\x00\x00\n\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaf\xd1\x03\x00Etc/GMT+12PK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa9{\xa2qq\x00\x00\x00q\x00\x00\x00\t\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00I\xd2\x03\x00Etc/GMT+2PK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00e\xcb\xe9Qq\x00\x00\x00q\x00\x00\x00\t\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\xe1\xd2\x03\x00Etc/GMT+3PK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd0\xfaFDq\x00\x00\x00q\x00\x00\x00\t\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00y\xd3\x03\x00E" +
-	"tc/GMT+4PK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd4X\x9b\xf3q\x00\x00\x00q\x00\x00\x00\t\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\xd4\x03\x00Etc/GM" +
-	"T+5PK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00H\x9b\xd1\x04q\x00\x00\x00q\x00\x00\x00\t\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa9\xd4\x03\x00Etc/GMT+6PK" +
-	"\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84+\x9a$q\x00\x00\x00q\x00\x00\x00\t\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00A\xd5\x03\x00Etc/GMT+7PK\x01\x02\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\"\xf8\x8f/q\x00\x00\x00q\x00\x00\x00\t\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd9\xd5\x03\x00Etc/GMT+8PK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x84\x19\xb3\tq\x00\x00\x00q\x00\x00\x00\t\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00q\xd6\x03\x00Etc/GMT+9PK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00P" +
-	"\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\t\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\t\xd7\x03\x00Etc/GMT-0PK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf7\x1ac\xc3r\x00" +
-	"\x00\x00r\x00\x00\x00\t\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9f\xd7\x03\x00Etc/GMT-1PK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd9|\xbd7s\x00\x00\x00s\x00\x00" +
-	"\x00\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x008\xd8\x03\x00Etc/GMT-10PK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb2\xab\xd1Is\x00\x00\x00s\x00\x00\x00\n\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd3\xd8\x03\x00Etc/GMT-11PK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf7\x19s\x81s\x00\x00\x00s\x00\x00\x00\n\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00n\xd9\x03\x00Etc/GMT-12PK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90`N\xe8s\x00\x00\x00s\x00\x00\x00\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\t\xda\x03\x00Etc/GMT-13PK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00,{\xdc;s\x00\x00\x00s\x00\x00\x00\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4" +
-	"\xda\x03\x00Etc/GMT-14PK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbc\x19y\x04r\x00\x00\x00r\x00\x00\x00\t\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?\xdb\x03\x00E" +
-	"tc/GMT-2PK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9c\xfcm\x99r\x00\x00\x00r\x00\x00\x00\t\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd8\xdb\x03\x00Etc/GM" +
-	"T-3PK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00k\x19<Qr\x00\x00\x00r\x00\x00\x00\t\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00q\xdc\x03\x00Etc/GMT-4PK" +
-	"\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00!\xd6~wr\x00\x00\x00r\x00\x00\x00\t\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\xdd\x03\x00Etc/GMT-5PK\x01\x02\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00j\xd5d\xb0r\x00\x00\x00r\x00\x00\x00\t\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\xdd\x03\x00Etc/GMT-6PK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00J0p-r\x00\x00\x00r\x00\x00\x00\t\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00<\xde\x03\x00Etc/GMT-7PK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc5" +
-	"\x18\xb6\xfbr\x00\x00\x00r\x00\x00\x00\t\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd5\xde\x03\x00Etc/GMT-8PK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfc\x19@\xb9r\x00" +
-	"\x00\x00r\x00\x00\x00\t\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00n\xdf\x03\x00Etc/GMT-9PK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00P\xda\xfa\x03o\x00\x00\x00o\x00\x00" +
-	"\x00\b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\xe0\x03\x00Etc/GMT0PK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00P\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\r\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9c\xe0\x03\x00Etc/GreenwichPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00\a\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x006\xe1\x03\x00Etc/UCTPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00\a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\xca\xe1\x03\x00Etc/UTCPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00^\xe2\x03\x00Et" +
-	"c/UniversalPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00\b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf8\xe2\x03\x00Etc" +
-	"/ZuluPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00o\xbc\x831O\x04\x00\x00O\x04\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\xe3\x03\x00Europe/Am" +
-	"sterdamPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00ߜvυ\x01\x00\x00\x85\x01\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\xe8\x03\x00Europe/" +
-	"AndorraPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00]i\x11u\xd6\x02\x00\x00\xd6\x02\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbb\xe9\x03\x00Europe/" +
-	"AstrakhanPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcb*j\x8f\xaa\x02\x00\x00\xaa\x02\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbf\xec\x03\x00Europ" +
-	"e/AthensPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00k\xa4,\xb6?\x06\x00\x00?\x06\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x94\xef\x03\x00Europe" +
-	"/BelfastPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe1C\xf9\xa1\xde\x01\x00\x00\xde\x01\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xf5\x03\x00Europe" +
-	"/BelgradePK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17S\x91\xb3\xc1\x02\x00\x00\xc1\x02\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\xf8\x03\x00Europ" +
-	"e/BerlinPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Io\x11{\xd3\x02\x00\x00\xd3\x02\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf6\xfa\x03\x00Europe" +
-	"/BratislavaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00o\xbc\x831O\x04\x00\x00O\x04\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf8\xfd\x03\x00Eur" +
-	"ope/BrusselsPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90\xa9\xf5ϕ\x02\x00\x00\x95\x02\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00t\x02\x04\x00Eu" +
-	"rope/BucharestPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6Kf\xab\xfe\x02\x00\x00\xfe\x02\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x007\x05\x04\x00" +
-	"Europe/BudapestPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Dd#\xc4\xf1\x01\x00\x00\xf1\x01\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00b\b\x04" +
-	"\x00Europe/BusingenPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00I\xb8\xbc\xd3\xf3\x02\x00\x00\xf3\x02\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\n" +
-	"\x04\x00Europe/ChisinauPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17S\x91\xb3\xc1\x02\x00\x00\xc1\x02\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa0" +
-	"\r\x04\x00Europe/CopenhagenPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa1\xd6jL\xd8\x05\x00\x00\xd8\x05\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x90\x10\x04\x00Europe/DublinPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00==\xa4\x16\xc4\x04\x00\x00\xc4\x04\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x93\x16\x04\x00Europe/GibraltarPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00k\xa4,\xb6?\x06\x00\x00?\x06\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x85\x1b\x04\x00Europe/GuernseyPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe5\xc8X\xa7\xe1\x01\x00\x00\xe1\x01\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\xf1!\x04\x00Europe/HelsinkiPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00k\xa4,\xb6?\x06\x00\x00?\x06\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\xff#\x04\x00Europe/Isle_of_ManPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\aW\x10Ѱ\x04\x00\x00\xb0\x04\x00\x00\x0f\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00n*\x04\x00Europe/IstanbulPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00k\xa4,\xb6?\x06\x00\x00?\x06\x00\x00\r\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00K/\x04\x00Europe/JerseyPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00O+j\x94\x88\x03\x00\x00\x88\x03\x00\x00\x12\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb55\x04\x00Europe/KaliningradPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00iS\x18D.\x02\x00\x00.\x02\x00\x00\v" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00m9\x04\x00Europe/KievPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\xfe\x83\xe5\xcd\x02\x00\x00\xcd\x02\x00\x00\f\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc4;\x04\x00Europe/KirovPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00iS\x18D.\x02\x00\x00.\x02\x00\x00\v\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\xbb>\x04\x00Europe/KyivPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00&S\x03\t\xae\x05\x00\x00\xae\x05\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x12A\x04\x00Europe/LisbonPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe1C\xf9\xa1\xde\x01\x00\x00\xde\x01\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\xebF\x04\x00Europe/LjubljanaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00k\xa4,\xb6?\x06\x00\x00?\x06\x00\x00\r\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\xf7H\x04\x00Europe/LondonPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00o\xbc\x831O\x04\x00\x00O\x04\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00aO\x04\x00Europe/LuxembourgPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Zk#V\x81\x03\x00\x00\x81\x03\x00\x00\r\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\xdfS\x04\x00Europe/MadridPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00h\xa5J[\xa0\x03\x00\x00\xa0\x03\x00\x00\f\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x8bW\x04\x00Europe/MaltaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe5\xc8X\xa7\xe1\x01\x00\x00\xe1\x01\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00U[\x04\x00Europe/MariehamnPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00WI\xc3\x7f(\x03\x00\x00(\x03\x00\x00\f\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00d]\x04\x00Europe/MinskPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc7\xf5\x94\xdaQ\x04\x00\x00Q\x04\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\xb6`\x04\x00Europe/MonacoPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe1\xc1\xeb\x05\x8c\x03\x00\x00\x8c\x03\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x002e\x04\x00Europe/MoscowPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03R\xda\xedU\x02\x00\x00U\x02\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\xe9h\x04\x00Europe/NicosiaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17S\x91\xb3\xc1\x02\x00\x00\xc1\x02\x00\x00\v\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00jk\x04\x00Europe/OsloPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc7\xf5\x94\xdaQ\x04\x00\x00Q\x04\x00\x00\f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"Tn\x04\x00Europe/ParisPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe1C\xf9\xa1\xde\x01\x00\x00\xde\x01\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcfr" +
-	"\x04\x00Europe/PodgoricaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Io\x11{\xd3\x02\x00\x00\xd3\x02\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\xdbt\x04\x00Europe/PraguePK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00gp\xc0\xa7\xb6\x02\x00\x00\xb6\x02\x00\x00\v\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd9" +
-	"w\x04\x00Europe/RigaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x95\xb4\x9e\xe7\xb3\x03\x00\x00\xb3\x03\x00\x00\v\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8z\x04\x00" +
-	"Europe/RomePK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x95\x7fpp\xdc\x02\x00\x00\xdc\x02\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x94~\x04\x00Eur" +
-	"ope/SamaraPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x95\xb4\x9e\xe7\xb3\x03\x00\x00\xb3\x03\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9b\x81\x04\x00Euro" +
-	"pe/San_MarinoPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe1C\xf9\xa1\xde\x01\x00\x00\xde\x01\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00}\x85\x04\x00E" +
-	"urope/SarajevoPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b8\xfel\xd6\x02\x00\x00\xd6\x02\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x87\x04\x00" +
-	"Europe/SaratovPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00}\xb4N\xb8a\x03\x00\x00a\x03\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8a\x8a\x04\x00" +
-	"Europe/SimferopolPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe1C\xf9\xa1\xde\x01\x00\x00\xde\x01\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a" +
-	"\x8e\x04\x00Europe/SkopjePK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8c\xc8\x15\xd0P\x02\x00\x00P\x02\x00\x00\f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00#\x90" +
-	"\x04\x00Europe/SofiaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17S\x91\xb3\xc1\x02\x00\x00\xc1\x02\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9d\x92\x04\x00" +
-	"Europe/StockholmPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00q\x16\x9b?\xa3\x02\x00\x00\xa3\x02\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8c\x95" +
-	"\x04\x00Europe/TallinnPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xea\xc48\xde\\\x02\x00\x00\\\x02\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00[\x98" +
-	"\x04\x00Europe/TiranePK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00I\xb8\xbc\xd3\xf3\x02\x00\x00\xf3\x02\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe2\x9a\x04" +
-	"\x00Europe/TiraspolPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00u\xb0\xcd\xfc\xf8\x02\x00\x00\xf8\x02\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x9e" +
-	"\x04\x00Europe/UlyanovskPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00iS\x18D.\x02\x00\x00.\x02\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"(\xa1\x04\x00Europe/UzhgorodPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Dd#\xc4\xf1\x01\x00\x00\xf1\x01\x00\x00\f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x83\xa3\x04\x00Europe/VaduzPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x95\xb4\x9e\xe7\xb3\x03\x00\x00\xb3\x03\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9e" +
-	"\xa5\x04\x00Europe/VaticanPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Z\x05wג\x02\x00\x00\x92\x02\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00}" +
-	"\xa9\x04\x00Europe/ViennaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xccb\xf72\xa4\x02\x00\x00\xa4\x02\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00:\xac" +
-	"\x04\x00Europe/VilniusPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Va\x92\xd3\xdf\x02\x00\x00\xdf\x02\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\xaf" +
-	"\x04\x00Europe/VolgogradPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00>\xfe垛\x03\x00\x00\x9b\x03\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x17\xb2\x04\x00Europe/WarsawPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe1C\xf9\xa1\xde\x01\x00\x00\xde\x01\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdd" +
-	"\xb5\x04\x00Europe/ZagrebPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00iS\x18D.\x02\x00\x00.\x02\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6\xb7" +
-	"\x04\x00Europe/ZaporozhyePK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Dd#\xc4\xf1\x01\x00\x00\xf1\x01\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00C\xba\x04\x00Europe/ZurichPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xab\x80c$q\x00\x00\x00q\x00\x00\x00\a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"_\xbc\x04\x00FactoryPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00k\xa4,\xb6?\x06\x00\x00?\x06\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf5\xbc\x04\x00GBP" +
-	"K\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00k\xa4,\xb6?\x06\x00\x00?\x06\x00\x00\a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00T\xc3\x04\x00GB-EirePK\x01\x02\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00P\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\xc9\x04\x00GMTPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00P\xda\xfa" +
-	"\x03o\x00\x00\x00o\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00H\xca\x04\x00GMT+0PK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00P\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00" +
-	"\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xda\xca\x04\x00GMT-0PK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00P\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00l\xcb\x04\x00GMT0PK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00P\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\t\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfd\xcb\x04\x00G" +
-	"reenwichPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00=\xf7\xfawp\x00\x00\x00p\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x93\xcc\x04\x00HSTPK\x01" +
-	"\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00E\t\xfa-\a\x03\x00\x00\a\x03\x00\x00\b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00$\xcd\x04\x00HongkongPK\x01\x02\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Q\xd0\x04\x00IcelandPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x13\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf8\xd0\x04\x00Indian/AntananarivoPK\x01\x02\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00x\xb0W\x14\x98\x00\x00\x00\x98\x00\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe8\xd1\x04\x00Indian/ChagosPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x88\xf6C\x84\x98\x00\x00\x00\x98\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xab\xd2\x04\x00Indian/ChristmasPK\x01\x02\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00ʇ{_\xbb\x00\x00\x00\xbb\x00\x00\x00\f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00q\xd3\x04\x00Indian/CocosPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00V\xd4\x04\x00Indian/ComoroPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\xb9\xb2Z\xac\x98\x00\x00\x00\x98\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00@\xd5\x04\x00Indian/KerguelenPK\x01\x02\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\xed\x8c\xf1\x91\x85\x00\x00\x00\x85\x00\x00\x00\v\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\xd6\x04\x00Indian/MahePK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\xb9\xb2Z\xac\x98\x00\x00\x00\x98\x00\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\xd6\x04\x00Indian/MaldivesPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x96\xed=\x98\xb3\x00\x00\x00\xb3\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00y\xd7\x04\x00Indian/MauritiusPK\x01\x02\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Z\xd8\x04\x00Indian/MayottePK\x01\x02\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\xed\x8c\xf1\x91\x85\x00\x00\x00\x85\x00\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00E\xd9\x04\x00Indian/ReunionPK\x01\x02\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x8c\xdb?\xec,\x03\x00\x00,\x03\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf6\xd9\x04\x00IranPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17✳2" +
-	"\x04\x00\x002\x04\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00D\xdd\x04\x00IsraelPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00%J\xd5\xebS\x01\x00\x00S\x01\x00\x00\a" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9a\xe1\x04\x00JamaicaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\xf4\xaeg\xd5\x00\x00\x00\xd5\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x12\xe3\x04\x00JapanPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf6\xe8]*\xdb\x00\x00\x00\xdb\x00\x00\x00\t\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\xe4\x04" +
-	"\x00KwajaleinPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00_\x7f2[\xaf\x01\x00\x00\xaf\x01\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\f\xe5\x04\x00Liby" +
-	"aPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x9d\x1b\xc9m\x02\x00\x00m\x02\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xe6\x04\x00METPK\x01\x02\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\xf5\x8d\x99\x92o\x00\x00\x00o\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00l\xe9\x04\x00MSTPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6h\xcac\xb7" +
-	"\x03\x00\x00\xb7\x03\x00\x00\a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfc\xe9\x04\x00MST7MDTPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9B$\x90\x01\x04\x00\x00\x01\x04\x00\x00" +
-	"\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd8\xed\x04\x00Mexico/BajaNortePK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\xad=\x98\xce\x02\x00\x00\xce\x02" +
-	"\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\xf2\x04\x00Mexico/BajaSurPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd5\b\x89\x8c\x05\x03\x00\x00\x05\x03" +
-	"\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xf5\x04\x00Mexico/GeneralPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00b\xb2\xaf\xf7\x13\x04\x00\x00\x13\x04" +
-	"\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x002\xf8\x04\x00NZPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x96\xc5FF(\x03\x00\x00(\x03\x00\x00\a\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00e\xfc\x04\x00NZ-CHATPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00V\x80\x94@\x12\x04\x00\x00\x12\x04\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb2\xff\x04" +
-	"\x00NavajoPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00*\xe4@\xa9\x89\x01\x00\x00\x89\x01\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe8\x03\x05\x00PRCPK\x01\x02" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00ŭV\xad\xb7\x03\x00\x00\xb7\x03\x00\x00\a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x92\x05\x05\x00PST8PDTPK\x01\x02\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\xa8A\x15\xfe\x97\x01\x00\x00\x97\x01\x00\x00\f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00n\t\x05\x00Pacific/ApiaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00b\xb2\xaf\xf7\x13\x04\x00\x00\x13\x04\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/\v\x05\x00Pacific/AucklandPK\x01\x02\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x9a\xf2:F\xc9\x00\x00\x00\xc9\x00\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00p\x0f\x05\x00Pacific/BougainvillePK\x01\x02\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x96\xc5FF(\x03\x00\x00(\x03\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00k\x10\x05\x00Pacific/ChathamPK\x01\x02" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00n\x04\x19y\x9a\x00\x00\x00\x9a\x00\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x13\x05\x00Pacific/ChuukPK\x01\x02\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?X'\x8e\x96\x04\x00\x00\x96\x04\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\x14\x05\x00Pacific/EasterPK\x01\x02\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9e\x7f\xab\x95V\x01\x00\x00V\x01\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00G\x19\x05\x00Pacific/EfatePK\x01\x02\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xec =\x89\xac\x00\x00\x00\xac\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc8\x1a\x05\x00Pacific/EnderburyPK\x01" +
-	"\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8a|\xdcU\x99\x00\x00\x00\x99\x00\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x1b\x05\x00Pacific/FakaofoPK" +
-	"\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfd_yl\x8c\x01\x00\x00\x8c\x01\x00\x00\f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00i\x1c\x05\x00Pacific/FijiPK\x01\x02" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x006\xb7S{\x86\x00\x00\x00\x86\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1f\x1e\x05\x00Pacific/FunafutiPK" +
-	"\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x81\xe3w\n\xaf\x00\x00\x00\xaf\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd3\x1e\x05\x00Pacific/Galapago" +
-	"sPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc23\xa0\xbc\x84\x00\x00\x00\x84\x00\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x1f\x05\x00Pacific/Gambi" +
-	"erPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Y\xd2K|\x86\x00\x00\x00\x86\x00\x00\x00\x13\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00b \x05\x00Pacific/Guad" +
-	"alcanalPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00FI\xfe\x14^\x01\x00\x00^\x01\x00\x00\f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x19!\x05\x00Pacific" +
-	"/GuamPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xeaK\x85v\xdd\x00\x00\x00\xdd\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa1\"\x05\x00Pacific/H" +
-	"onoluluPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xeaK\x85v\xdd\x00\x00\x00\xdd\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xac#\x05\x00Pacific" +
-	"/JohnstonPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xec =\x89\xac\x00\x00\x00\xac\x00\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb7$\x05\x00Pacif" +
-	"ic/KantonPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc8=ku\xae\x00\x00\x00\xae\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8f%\x05\x00Pacif" +
-	"ic/KiritimatiPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97n7\x1a\xf2\x00\x00\x00\xf2\x00\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00m&\x05\x00P" +
-	"acific/KosraePK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf6\xe8]*\xdb\x00\x00\x00\xdb\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8b'\x05\x00P" +
-	"acific/KwajaleinPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x006\xb7S{\x86\x00\x00\x00\x86\x00\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x95(" +
-	"\x05\x00Pacific/MajuroPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00D6\x83\xa1\x8b\x00\x00\x00\x8b\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00G)" +
-	"\x05\x00Pacific/MarquesasPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00t\xca{e\x92\x00\x00\x00\x92\x00\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x01*\x05\x00Pacific/MidwayPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe2;Z\xf7\xb7\x00\x00\x00\xb7\x00\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\xbf*\x05\x00Pacific/NauruPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x91\xd60\f\x9a\x00\x00\x00\x9a\x00\x00\x00\f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\xa1+\x05\x00Pacific/NiuePK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Y5\x1a6\xf7\x00\x00\x00\xf7\x00\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00e," +
-	"\x05\x00Pacific/NorfolkPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb7\xef\x97\xc6\xc6\x00\x00\x00\xc6\x00\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x89" +
-	"-\x05\x00Pacific/NoumeaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00t\xca{e\x92\x00\x00\x00\x92\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00{" +
-	".\x05\x00Pacific/Pago_PagoPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\xf8vܔ\x00\x00\x00\x94\x00\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00</\x05\x00Pacific/PalauPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfa\x0fA\x05\x99\x00\x00\x00\x99\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\xfb/\x05\x00Pacific/PitcairnPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Y\xd2K|\x86\x00\x00\x00\x86\x00\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\xc20\x05\x00Pacific/PohnpeiPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Y\xd2K|\x86\x00\x00\x00\x86\x00\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00u1\x05\x00Pacific/PonapePK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00n\x04\x19y\x9a\x00\x00\x00\x9a\x00\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00'2\x05\x00Pacific/Port_MoresbyPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\xe3\xa3S\x96\x01\x00\x00\x96\x01\x00\x00\x11\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf32\x05\x00Pacific/RarotongaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00FI\xfe\x14^\x01\x00\x00^\x01\x00\x00\x0e" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb84\x05\x00Pacific/SaipanPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00t\xca{e\x92\x00\x00\x00\x92\x00\x00\x00\r" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00B6\x05\x00Pacific/SamoaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xea\xc1\xdaυ\x00\x00\x00\x85\x00\x00\x00\x0e\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff6\x05\x00Pacific/TahitiPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x006\xb7S{\x86\x00\x00\x00\x86\x00\x00\x00\x0e\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb07\x05\x00Pacific/TarawaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97F\x91\xb3\xed\x00\x00\x00\xed\x00\x00\x00\x11\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00b8\x05\x00Pacific/TongatapuPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00n\x04\x19y\x9a\x00\x00\x00\x9a\x00\x00" +
-	"\x00\f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00~9\x05\x00Pacific/TrukPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x006\xb7S{\x86\x00\x00\x00\x86\x00\x00\x00\f" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00B:\x05\x00Pacific/WakePK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x006\xb7S{\x86\x00\x00\x00\x86\x00\x00\x00\x0e\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf2:\x05\x00Pacific/WallisPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00n\x04\x19y\x9a\x00\x00\x00\x9a\x00\x00\x00\v\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4;\x05\x00Pacific/YapPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00>\xfe垛\x03\x00\x00\x9b\x03\x00\x00\x06\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00g<\x05\x00PolandPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00&S\x03\t\xae\x05\x00\x00\xae\x05\x00\x00\b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"&@\x05\x00PortugalPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xee\xf0BB\xff\x01\x00\x00\xff\x01\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfaE\x05\x00RO" +
-	"CPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc7X,Y\x9f\x01\x00\x00\x9f\x01\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1aH\x05\x00ROKPK\x01\x02\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00F7k\x1c\x00\x01\x00\x00\x00\x01\x00\x00\t\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdaI\x05\x00SingaporePK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\aW\x10Ѱ\x04\x00\x00\xb0\x04\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01K\x05\x00TurkeyPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9f.\xe4xo\x00\x00" +
-	"\x00o\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd5O\x05\x00UCTPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x005\x11Q\x06\xd1\x03\x00\x00\xd1\x03\x00\x00\t\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00eP\x05\x00US/AlaskaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xae,\xa44\xc9\x03\x00\x00\xc9\x03\x00\x00\v\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00]T\x05\x00US/AleutianPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00ø\xab\x9b\xf0\x00\x00\x00\xf0\x00\x00\x00\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"OX\x05\x00US/ArizonaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9bܩ=\xda\x06\x00\x00\xda\x06\x00\x00\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00gY\x05\x00" +
-	"US/CentralPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00p\xb6{\xc9\x13\x02\x00\x00\x13\x02\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00i`\x05\x00US/E" +
-	"ast-IndianaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x003\x9aG\xc8\xd0\x06\x00\x00\xd0\x06\x00\x00\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa9b\x05\x00US/" +
-	"EasternPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xeaK\x85v\xdd\x00\x00\x00\xdd\x00\x00\x00\t\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa1i\x05\x00US/Hawa" +
-	"iiPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00$ \x873\xf8\x03\x00\x00\xf8\x03\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa5j\x05\x00US/Indiana-S" +
-	"tarkePK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00>\x14\xe7\x03\x83\x03\x00\x00\x83\x03\x00\x00\v\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xccn\x05\x00US/Michig" +
-	"anPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00V\x80\x94@\x12\x04\x00\x00\x12\x04\x00\x00\v\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00xr\x05\x00US/MountainP" +
-	"K\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf6\"\x12\xfe\x0e\x05\x00\x00\x0e\x05\x00\x00\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3v\x05\x00US/PacificPK\x01\x02\x00" +
-	"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00t\xca{e\x92\x00\x00\x00\x92\x00\x00\x00\b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe9{\x05\x00US/SamoaPK\x01\x02\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa1|\x05\x00UTCPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9f.\xe4xo\x00" +
-	"\x00\x00o\x00\x00\x00\t\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x001}\x05\x00UniversalPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe1\xc1\xeb\x05\x8c\x03\x00\x00\x8c\x03\x00" +
-	"\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc7}\x05\x00W-SUPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x002\x91B\xc0\xee\x01\x00\x00\xee\x01\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00" +
-	"\x00\x00\x00\x00\x00u\x81\x05\x00WETPK\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x83\x05\x00Zu" +
-	"luPK\x05\x06\x00\x00\x00\x00U\x02U\x02m\x8c\x00\x00\x15\x84\x05\x00\x00\x00"
diff --git a/src/time/zoneinfo.go b/src/time/zoneinfo.go
index dd3b4ed..4edcf3d 100644
--- a/src/time/zoneinfo.go
+++ b/src/time/zoneinfo.go
@@ -203,7 +203,7 @@
 	// If we're at the end of the known zone transitions,
 	// try the extend string.
 	if lo == len(tx)-1 && l.extend != "" {
-		if ename, eoffset, estart, eend, eisDST, ok := tzset(l.extend, end, sec); ok {
+		if ename, eoffset, estart, eend, eisDST, ok := tzset(l.extend, start, sec); ok {
 			return ename, eoffset, estart, eend, eisDST
 		}
 	}
@@ -264,12 +264,12 @@
 }
 
 // tzset takes a timezone string like the one found in the TZ environment
-// variable, the end of the last time zone transition expressed as seconds
+// variable, the time of the last time zone transition expressed as seconds
 // since January 1, 1970 00:00:00 UTC, and a time expressed the same way.
 // We call this a tzset string since in C the function tzset reads TZ.
 // The return values are as for lookup, plus ok which reports whether the
 // parse succeeded.
-func tzset(s string, initEnd, sec int64) (name string, offset int, start, end int64, isDST, ok bool) {
+func tzset(s string, lastTxSec, sec int64) (name string, offset int, start, end int64, isDST, ok bool) {
 	var (
 		stdName, dstName     string
 		stdOffset, dstOffset int
@@ -290,7 +290,7 @@
 
 	if len(s) == 0 || s[0] == ',' {
 		// No daylight savings time.
-		return stdName, stdOffset, initEnd, omega, false, true
+		return stdName, stdOffset, lastTxSec, omega, false, true
 	}
 
 	dstName, s, ok = tzsetName(s)
diff --git a/src/time/zoneinfo_abbrs_windows.go b/src/time/zoneinfo_abbrs_windows.go
index 139bda1..2783174 100644
--- a/src/time/zoneinfo_abbrs_windows.go
+++ b/src/time/zoneinfo_abbrs_windows.go
@@ -3,7 +3,7 @@
 // license that can be found in the LICENSE file.
 
 // Code generated by genzabbrs.go; DO NOT EDIT.
-// Based on information from https://raw.githubusercontent.com/unicode-org/cldr/master/common/supplemental/windowsZones.xml
+// Based on information from https://raw.githubusercontent.com/unicode-org/cldr/main/common/supplemental/windowsZones.xml
 
 package time
 
@@ -13,7 +13,7 @@
 }
 
 var abbrs = map[string]abbr{
-	"Egypt Standard Time":             {"EET", "EET"},     // Africa/Cairo
+	"Egypt Standard Time":             {"EET", "EEST"},    // Africa/Cairo
 	"Morocco Standard Time":           {"+00", "+01"},     // Africa/Casablanca
 	"South Africa Standard Time":      {"SAST", "SAST"},   // Africa/Johannesburg
 	"South Sudan Standard Time":       {"CAT", "CAT"},     // Africa/Juba
@@ -34,7 +34,6 @@
 	"Venezuela Standard Time":         {"-04", "-04"},     // America/Caracas
 	"SA Eastern Standard Time":        {"-03", "-03"},     // America/Cayenne
 	"Central Standard Time":           {"CST", "CDT"},     // America/Chicago
-	"Mountain Standard Time (Mexico)": {"CST", "CST"},     // America/Chihuahua
 	"Central Brazilian Standard Time": {"-04", "-04"},     // America/Cuiaba
 	"Mountain Standard Time":          {"MST", "MDT"},     // America/Denver
 	"Greenland Standard Time":         {"-03", "-02"},     // America/Godthab
@@ -45,6 +44,7 @@
 	"US Eastern Standard Time":        {"EST", "EDT"},     // America/Indianapolis
 	"SA Western Standard Time":        {"-04", "-04"},     // America/La_Paz
 	"Pacific Standard Time":           {"PST", "PDT"},     // America/Los_Angeles
+	"Mountain Standard Time (Mexico)": {"MST", "MST"},     // America/Mazatlan
 	"Central Standard Time (Mexico)":  {"CST", "CST"},     // America/Mexico_City
 	"Saint Pierre Standard Time":      {"-03", "-02"},     // America/Miquelon
 	"Montevideo Standard Time":        {"-03", "-03"},     // America/Montevideo
@@ -136,7 +136,7 @@
 	"Romance Standard Time":           {"CET", "CEST"},    // Europe/Paris
 	"Russia Time Zone 3":              {"+04", "+04"},     // Europe/Samara
 	"Saratov Standard Time":           {"+04", "+04"},     // Europe/Saratov
-	"Volgograd Standard Time":         {"+03", "+03"},     // Europe/Volgograd
+	"Volgograd Standard Time":         {"MSK", "MSK"},     // Europe/Volgograd
 	"Central European Standard Time":  {"CET", "CEST"},    // Europe/Warsaw
 	"Mauritius Standard Time":         {"+04", "+04"},     // Indian/Mauritius
 	"Samoa Standard Time":             {"+13", "+13"},     // Pacific/Apia
diff --git a/src/time/zoneinfo_plan9.go b/src/time/zoneinfo_plan9.go
index 5d432fe..d13b623 100644
--- a/src/time/zoneinfo_plan9.go
+++ b/src/time/zoneinfo_plan9.go
@@ -56,7 +56,7 @@
 		if len(f) == 2 && f[0] == "GMT" {
 			return UTC, nil
 		}
-		return nil, badData
+		return nil, errBadData
 	}
 
 	var zones [2]zone
@@ -64,14 +64,14 @@
 	// standard timezone offset
 	o, err := atoi(f[1])
 	if err != nil {
-		return nil, badData
+		return nil, errBadData
 	}
 	zones[0] = zone{name: f[0], offset: o, isDST: false}
 
 	// alternate timezone offset
 	o, err = atoi(f[3])
 	if err != nil {
-		return nil, badData
+		return nil, errBadData
 	}
 	zones[1] = zone{name: f[2], offset: o, isDST: true}
 
@@ -85,7 +85,7 @@
 		}
 		t, err := atoi(f[i])
 		if err != nil {
-			return nil, badData
+			return nil, errBadData
 		}
 		t -= zones[0].offset
 		tx = append(tx, zoneTrans{when: int64(t), index: uint8(zi)})
diff --git a/src/time/zoneinfo_read.go b/src/time/zoneinfo_read.go
index 90814ad..4d0e47d 100644
--- a/src/time/zoneinfo_read.go
+++ b/src/time/zoneinfo_read.go
@@ -107,7 +107,7 @@
 	return string(p)
 }
 
-var badData = errors.New("malformed time zone information")
+var errBadData = errors.New("malformed time zone information")
 
 // LoadLocationFromTZData returns a Location with the given name
 // initialized from the IANA Time Zone database-formatted data.
@@ -118,14 +118,14 @@
 
 	// 4-byte magic "TZif"
 	if magic := d.read(4); string(magic) != "TZif" {
-		return nil, badData
+		return nil, errBadData
 	}
 
 	// 1-byte version, then 15 bytes of padding
 	var version int
 	var p []byte
 	if p = d.read(16); len(p) != 16 {
-		return nil, badData
+		return nil, errBadData
 	} else {
 		switch p[0] {
 		case 0:
@@ -135,7 +135,7 @@
 		case '3':
 			version = 3
 		default:
-			return nil, badData
+			return nil, errBadData
 		}
 	}
 
@@ -158,10 +158,10 @@
 	for i := 0; i < 6; i++ {
 		nn, ok := d.big4()
 		if !ok {
-			return nil, badData
+			return nil, errBadData
 		}
 		if uint32(int(nn)) != nn {
-			return nil, badData
+			return nil, errBadData
 		}
 		n[i] = int(nn)
 	}
@@ -191,10 +191,10 @@
 		for i := 0; i < 6; i++ {
 			nn, ok := d.big4()
 			if !ok {
-				return nil, badData
+				return nil, errBadData
 			}
 			if uint32(int(nn)) != nn {
-				return nil, badData
+				return nil, errBadData
 			}
 			n[i] = int(nn)
 		}
@@ -229,7 +229,7 @@
 	isutc := d.read(n[NUTCLocal])
 
 	if d.error { // ran out of data
-		return nil, badData
+		return nil, errBadData
 	}
 
 	var extend string
@@ -245,26 +245,26 @@
 	if nzone == 0 {
 		// Reject tzdata files with no zones. There's nothing useful in them.
 		// This also avoids a panic later when we add and then use a fake transition (golang.org/issue/29437).
-		return nil, badData
+		return nil, errBadData
 	}
 	zones := make([]zone, nzone)
 	for i := range zones {
 		var ok bool
 		var n uint32
 		if n, ok = zonedata.big4(); !ok {
-			return nil, badData
+			return nil, errBadData
 		}
 		if uint32(int(n)) != n {
-			return nil, badData
+			return nil, errBadData
 		}
 		zones[i].offset = int(int32(n))
 		var b byte
 		if b, ok = zonedata.byte(); !ok {
-			return nil, badData
+			return nil, errBadData
 		}
 		zones[i].isDST = b != 0
 		if b, ok = zonedata.byte(); !ok || int(b) >= len(abbrev) {
-			return nil, badData
+			return nil, errBadData
 		}
 		zones[i].name = byteString(abbrev[b:])
 		if runtime.GOOS == "aix" && len(name) > 8 && (name[:8] == "Etc/GMT+" || name[:8] == "Etc/GMT-") {
@@ -283,20 +283,20 @@
 		var n int64
 		if !is64 {
 			if n4, ok := txtimes.big4(); !ok {
-				return nil, badData
+				return nil, errBadData
 			} else {
 				n = int64(int32(n4))
 			}
 		} else {
 			if n8, ok := txtimes.big8(); !ok {
-				return nil, badData
+				return nil, errBadData
 			} else {
 				n = int64(n8)
 			}
 		}
 		tx[i].when = n
 		if int(txzones[i]) >= len(zones) {
-			return nil, badData
+			return nil, errBadData
 		}
 		tx[i].index = txzones[i]
 		if i < len(isstd) {
@@ -329,7 +329,7 @@
 			} else if l.extend != "" {
 				// If we're at the end of the known zone transitions,
 				// try the extend string.
-				if name, offset, estart, eend, isDST, ok := tzset(l.extend, l.cacheEnd, sec); ok {
+				if name, offset, estart, eend, isDST, ok := tzset(l.extend, l.cacheStart, sec); ok {
 					l.cacheStart = estart
 					l.cacheEnd = eend
 					// Find the zone that is returned by tzset to avoid allocation if possible.
diff --git a/src/time/zoneinfo_test.go b/src/time/zoneinfo_test.go
index 243ff8e..8cd37b5 100644
--- a/src/time/zoneinfo_test.go
+++ b/src/time/zoneinfo_test.go
@@ -271,6 +271,7 @@
 		{"PST8PDT,M3.2.0,M11.1.0", 0, 2172733199, "PDT", -7 * 60 * 60, 2152173600, 2172733200, true, true},
 		{"PST8PDT,M3.2.0,M11.1.0", 0, 2172733200, "PST", -8 * 60 * 60, 2172733200, 2177452800, false, true},
 		{"PST8PDT,M3.2.0,M11.1.0", 0, 2172733201, "PST", -8 * 60 * 60, 2172733200, 2177452800, false, true},
+		{"KST-9", 592333200, 1677246697, "KST", 9 * 60 * 60, 592333200, 1<<63 - 1, false, true},
 	} {
 		name, off, start, end, isDST, ok := time.Tzset(test.inStr, test.inEnd, test.inSec)
 		if name != test.name || off != test.off || start != test.start || end != test.end || isDST != test.isDST || ok != test.ok {
diff --git a/src/time/zoneinfo_unix.go b/src/time/zoneinfo_unix.go
index 67b8beb..b52c67d 100644
--- a/src/time/zoneinfo_unix.go
+++ b/src/time/zoneinfo_unix.go
@@ -16,11 +16,13 @@
 )
 
 // Many systems use /usr/share/zoneinfo, Solaris 2 has
-// /usr/share/lib/zoneinfo, IRIX 6 has /usr/lib/locale/TZ.
+// /usr/share/lib/zoneinfo, IRIX 6 has /usr/lib/locale/TZ,
+// NixOS has /etc/zoneinfo.
 var platformZoneSources = []string{
 	"/usr/share/zoneinfo/",
 	"/usr/share/lib/zoneinfo/",
 	"/usr/lib/locale/TZ/",
+	"/etc/zoneinfo",
 }
 
 func initLocal() {
diff --git a/src/time/zoneinfo_wasip1.go b/src/time/zoneinfo_wasip1.go
new file mode 100644
index 0000000..b6c8bbc
--- /dev/null
+++ b/src/time/zoneinfo_wasip1.go
@@ -0,0 +1,12 @@
+// Copyright 2023 The Go Authors. 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
+
+// in wasip1 zoneinfo is managed by the runtime.
+var platformZoneSources = []string{}
+
+func initLocal() {
+	localLoc.name = "Local"
+}
diff --git a/src/unicode/tables.go b/src/unicode/tables.go
index a9b23bf..a0c0e1c 100644
--- a/src/unicode/tables.go
+++ b/src/unicode/tables.go
@@ -3,7 +3,7 @@
 package unicode
 
 // Version is the Unicode edition from which the tables are derived.
-const Version = "13.0.0"
+const Version = "15.0.0"
 
 // Categories is the set of Unicode category tables.
 var Categories = map[string]*RangeTable{
@@ -52,7 +52,8 @@
 		{0x00ad, 0x0600, 1363},
 		{0x0601, 0x0605, 1},
 		{0x061c, 0x06dd, 193},
-		{0x070f, 0x08e2, 467},
+		{0x070f, 0x0890, 385},
+		{0x0891, 0x08e2, 81},
 		{0x180e, 0x200b, 2045},
 		{0x200c, 0x200f, 1},
 		{0x202a, 0x202e, 1},
@@ -64,7 +65,7 @@
 	},
 	R32: []Range32{
 		{0x110bd, 0x110cd, 16},
-		{0x13430, 0x13438, 1},
+		{0x13430, 0x1343f, 1},
 		{0x1bca0, 0x1bca3, 1},
 		{0x1d173, 0x1d17a, 1},
 		{0xe0001, 0xe0020, 31},
@@ -88,7 +89,8 @@
 		{0x00ad, 0x0600, 1363},
 		{0x0601, 0x0605, 1},
 		{0x061c, 0x06dd, 193},
-		{0x070f, 0x08e2, 467},
+		{0x070f, 0x0890, 385},
+		{0x0891, 0x08e2, 81},
 		{0x180e, 0x200b, 2045},
 		{0x200c, 0x200f, 1},
 		{0x202a, 0x202e, 1},
@@ -99,7 +101,7 @@
 	},
 	R32: []Range32{
 		{0x110bd, 0x110cd, 16},
-		{0x13430, 0x13438, 1},
+		{0x13430, 0x1343f, 1},
 		{0x1bca0, 0x1bca3, 1},
 		{0x1d173, 0x1d17a, 1},
 		{0xe0001, 0xe0020, 31},
@@ -169,8 +171,9 @@
 		{0x0828, 0x0840, 24},
 		{0x0841, 0x0858, 1},
 		{0x0860, 0x086a, 1},
-		{0x08a0, 0x08b4, 1},
-		{0x08b6, 0x08c7, 1},
+		{0x0870, 0x0887, 1},
+		{0x0889, 0x088e, 1},
+		{0x08a0, 0x08c9, 1},
 		{0x0904, 0x0939, 1},
 		{0x093d, 0x0950, 19},
 		{0x0958, 0x0961, 1},
@@ -231,17 +234,18 @@
 		{0x0c2a, 0x0c39, 1},
 		{0x0c3d, 0x0c58, 27},
 		{0x0c59, 0x0c5a, 1},
-		{0x0c60, 0x0c61, 1},
-		{0x0c80, 0x0c85, 5},
-		{0x0c86, 0x0c8c, 1},
+		{0x0c5d, 0x0c60, 3},
+		{0x0c61, 0x0c80, 31},
+		{0x0c85, 0x0c8c, 1},
 		{0x0c8e, 0x0c90, 1},
 		{0x0c92, 0x0ca8, 1},
 		{0x0caa, 0x0cb3, 1},
 		{0x0cb5, 0x0cb9, 1},
-		{0x0cbd, 0x0cde, 33},
-		{0x0ce0, 0x0ce1, 1},
-		{0x0cf1, 0x0cf2, 1},
-		{0x0d04, 0x0d0c, 1},
+		{0x0cbd, 0x0cdd, 32},
+		{0x0cde, 0x0ce0, 2},
+		{0x0ce1, 0x0cf1, 16},
+		{0x0cf2, 0x0d04, 18},
+		{0x0d05, 0x0d0c, 1},
 		{0x0d0e, 0x0d10, 1},
 		{0x0d12, 0x0d3a, 1},
 		{0x0d3d, 0x0d4e, 17},
@@ -307,9 +311,8 @@
 		{0x1681, 0x169a, 1},
 		{0x16a0, 0x16ea, 1},
 		{0x16f1, 0x16f8, 1},
-		{0x1700, 0x170c, 1},
-		{0x170e, 0x1711, 1},
-		{0x1720, 0x1731, 1},
+		{0x1700, 0x1711, 1},
+		{0x171f, 0x1731, 1},
 		{0x1740, 0x1751, 1},
 		{0x1760, 0x176c, 1},
 		{0x176e, 0x1770, 1},
@@ -329,7 +332,7 @@
 		{0x1a20, 0x1a54, 1},
 		{0x1aa7, 0x1b05, 94},
 		{0x1b06, 0x1b33, 1},
-		{0x1b45, 0x1b4b, 1},
+		{0x1b45, 0x1b4c, 1},
 		{0x1b83, 0x1ba0, 1},
 		{0x1bae, 0x1baf, 1},
 		{0x1bba, 0x1be5, 1},
@@ -374,9 +377,7 @@
 		{0x2145, 0x2149, 1},
 		{0x214e, 0x2183, 53},
 		{0x2184, 0x2c00, 2684},
-		{0x2c01, 0x2c2e, 1},
-		{0x2c30, 0x2c5e, 1},
-		{0x2c60, 0x2ce4, 1},
+		{0x2c01, 0x2ce4, 1},
 		{0x2ceb, 0x2cee, 1},
 		{0x2cf2, 0x2cf3, 1},
 		{0x2d00, 0x2d25, 1},
@@ -405,8 +406,7 @@
 		{0x31a0, 0x31bf, 1},
 		{0x31f0, 0x31ff, 1},
 		{0x3400, 0x4dbf, 1},
-		{0x4e00, 0x9ffc, 1},
-		{0xa000, 0xa48c, 1},
+		{0x4e00, 0xa48c, 1},
 		{0xa4d0, 0xa4fd, 1},
 		{0xa500, 0xa60c, 1},
 		{0xa610, 0xa61f, 1},
@@ -416,9 +416,11 @@
 		{0xa6a0, 0xa6e5, 1},
 		{0xa717, 0xa71f, 1},
 		{0xa722, 0xa788, 1},
-		{0xa78b, 0xa7bf, 1},
-		{0xa7c2, 0xa7ca, 1},
-		{0xa7f5, 0xa801, 1},
+		{0xa78b, 0xa7ca, 1},
+		{0xa7d0, 0xa7d1, 1},
+		{0xa7d3, 0xa7d5, 2},
+		{0xa7d6, 0xa7d9, 1},
+		{0xa7f2, 0xa801, 1},
 		{0xa803, 0xa805, 1},
 		{0xa807, 0xa80a, 1},
 		{0xa80c, 0xa822, 1},
@@ -507,9 +509,20 @@
 		{0x104d8, 0x104fb, 1},
 		{0x10500, 0x10527, 1},
 		{0x10530, 0x10563, 1},
+		{0x10570, 0x1057a, 1},
+		{0x1057c, 0x1058a, 1},
+		{0x1058c, 0x10592, 1},
+		{0x10594, 0x10595, 1},
+		{0x10597, 0x105a1, 1},
+		{0x105a3, 0x105b1, 1},
+		{0x105b3, 0x105b9, 1},
+		{0x105bb, 0x105bc, 1},
 		{0x10600, 0x10736, 1},
 		{0x10740, 0x10755, 1},
 		{0x10760, 0x10767, 1},
+		{0x10780, 0x10785, 1},
+		{0x10787, 0x107b0, 1},
+		{0x107b2, 0x107ba, 1},
 		{0x10800, 0x10805, 1},
 		{0x10808, 0x1080a, 2},
 		{0x1080b, 0x10835, 1},
@@ -545,10 +558,13 @@
 		{0x10f00, 0x10f1c, 1},
 		{0x10f27, 0x10f30, 9},
 		{0x10f31, 0x10f45, 1},
+		{0x10f70, 0x10f81, 1},
 		{0x10fb0, 0x10fc4, 1},
 		{0x10fe0, 0x10ff6, 1},
 		{0x11003, 0x11037, 1},
-		{0x11083, 0x110af, 1},
+		{0x11071, 0x11072, 1},
+		{0x11075, 0x11083, 14},
+		{0x11084, 0x110af, 1},
 		{0x110d0, 0x110e8, 1},
 		{0x11103, 0x11126, 1},
 		{0x11144, 0x11147, 3},
@@ -559,6 +575,7 @@
 		{0x111da, 0x111dc, 2},
 		{0x11200, 0x11211, 1},
 		{0x11213, 0x1122b, 1},
+		{0x1123f, 0x11240, 1},
 		{0x11280, 0x11286, 1},
 		{0x11288, 0x1128a, 2},
 		{0x1128b, 0x1128d, 1},
@@ -586,6 +603,7 @@
 		{0x11681, 0x116aa, 1},
 		{0x116b8, 0x11700, 72},
 		{0x11701, 0x1171a, 1},
+		{0x11740, 0x11746, 1},
 		{0x11800, 0x1182b, 1},
 		{0x118a0, 0x118df, 1},
 		{0x118ff, 0x11906, 1},
@@ -601,8 +619,8 @@
 		{0x11a0c, 0x11a32, 1},
 		{0x11a3a, 0x11a50, 22},
 		{0x11a5c, 0x11a89, 1},
-		{0x11a9d, 0x11ac0, 35},
-		{0x11ac1, 0x11af8, 1},
+		{0x11a9d, 0x11ab0, 19},
+		{0x11ab1, 0x11af8, 1},
 		{0x11c00, 0x11c08, 1},
 		{0x11c0a, 0x11c2e, 1},
 		{0x11c40, 0x11c72, 50},
@@ -616,13 +634,19 @@
 		{0x11d6a, 0x11d89, 1},
 		{0x11d98, 0x11ee0, 328},
 		{0x11ee1, 0x11ef2, 1},
+		{0x11f02, 0x11f04, 2},
+		{0x11f05, 0x11f10, 1},
+		{0x11f12, 0x11f33, 1},
 		{0x11fb0, 0x12000, 80},
 		{0x12001, 0x12399, 1},
 		{0x12480, 0x12543, 1},
-		{0x13000, 0x1342e, 1},
+		{0x12f90, 0x12ff0, 1},
+		{0x13000, 0x1342f, 1},
+		{0x13441, 0x13446, 1},
 		{0x14400, 0x14646, 1},
 		{0x16800, 0x16a38, 1},
 		{0x16a40, 0x16a5e, 1},
+		{0x16a70, 0x16abe, 1},
 		{0x16ad0, 0x16aed, 1},
 		{0x16b00, 0x16b2f, 1},
 		{0x16b40, 0x16b43, 1},
@@ -637,9 +661,14 @@
 		{0x17001, 0x187f7, 1},
 		{0x18800, 0x18cd5, 1},
 		{0x18d00, 0x18d08, 1},
-		{0x1b000, 0x1b11e, 1},
-		{0x1b150, 0x1b152, 1},
-		{0x1b164, 0x1b167, 1},
+		{0x1aff0, 0x1aff3, 1},
+		{0x1aff5, 0x1affb, 1},
+		{0x1affd, 0x1affe, 1},
+		{0x1b000, 0x1b122, 1},
+		{0x1b132, 0x1b150, 30},
+		{0x1b151, 0x1b152, 1},
+		{0x1b155, 0x1b164, 15},
+		{0x1b165, 0x1b167, 1},
 		{0x1b170, 0x1b2fb, 1},
 		{0x1bc00, 0x1bc6a, 1},
 		{0x1bc70, 0x1bc7c, 1},
@@ -675,10 +704,19 @@
 		{0x1d78a, 0x1d7a8, 1},
 		{0x1d7aa, 0x1d7c2, 1},
 		{0x1d7c4, 0x1d7cb, 1},
+		{0x1df00, 0x1df1e, 1},
+		{0x1df25, 0x1df2a, 1},
+		{0x1e030, 0x1e06d, 1},
 		{0x1e100, 0x1e12c, 1},
 		{0x1e137, 0x1e13d, 1},
-		{0x1e14e, 0x1e2c0, 370},
-		{0x1e2c1, 0x1e2eb, 1},
+		{0x1e14e, 0x1e290, 322},
+		{0x1e291, 0x1e2ad, 1},
+		{0x1e2c0, 0x1e2eb, 1},
+		{0x1e4d0, 0x1e4eb, 1},
+		{0x1e7e0, 0x1e7e6, 1},
+		{0x1e7e8, 0x1e7eb, 1},
+		{0x1e7ed, 0x1e7ee, 1},
+		{0x1e7f0, 0x1e7fe, 1},
 		{0x1e800, 0x1e8c4, 1},
 		{0x1e900, 0x1e943, 1},
 		{0x1e94b, 0x1ee00, 1205},
@@ -706,13 +744,14 @@
 		{0x1eea1, 0x1eea3, 1},
 		{0x1eea5, 0x1eea9, 1},
 		{0x1eeab, 0x1eebb, 1},
-		{0x20000, 0x2a6dd, 1},
-		{0x2a700, 0x2b734, 1},
+		{0x20000, 0x2a6df, 1},
+		{0x2a700, 0x2b739, 1},
 		{0x2b740, 0x2b81d, 1},
 		{0x2b820, 0x2cea1, 1},
 		{0x2ceb0, 0x2ebe0, 1},
 		{0x2f800, 0x2fa1d, 1},
 		{0x30000, 0x3134a, 1},
+		{0x31350, 0x323af, 1},
 	},
 	LatinOffset: 6,
 }
@@ -807,7 +846,7 @@
 		{0x213c, 0x213d, 1},
 		{0x2146, 0x2149, 1},
 		{0x214e, 0x2184, 54},
-		{0x2c30, 0x2c5e, 1},
+		{0x2c30, 0x2c5f, 1},
 		{0x2c61, 0x2c65, 4},
 		{0x2c66, 0x2c6c, 2},
 		{0x2c71, 0x2c73, 2},
@@ -831,11 +870,11 @@
 		{0xa794, 0xa795, 1},
 		{0xa797, 0xa7a9, 2},
 		{0xa7af, 0xa7b5, 6},
-		{0xa7b7, 0xa7bf, 2},
-		{0xa7c3, 0xa7c8, 5},
-		{0xa7ca, 0xa7f6, 44},
-		{0xa7fa, 0xab30, 822},
-		{0xab31, 0xab5a, 1},
+		{0xa7b7, 0xa7c3, 2},
+		{0xa7c8, 0xa7ca, 2},
+		{0xa7d1, 0xa7d9, 2},
+		{0xa7f6, 0xa7fa, 4},
+		{0xab30, 0xab5a, 1},
 		{0xab60, 0xab68, 1},
 		{0xab70, 0xabbf, 1},
 		{0xfb00, 0xfb06, 1},
@@ -845,6 +884,10 @@
 	R32: []Range32{
 		{0x10428, 0x1044f, 1},
 		{0x104d8, 0x104fb, 1},
+		{0x10597, 0x105a1, 1},
+		{0x105a3, 0x105b1, 1},
+		{0x105b3, 0x105b9, 1},
+		{0x105bb, 0x105bc, 1},
 		{0x10cc0, 0x10cf2, 1},
 		{0x118c0, 0x118df, 1},
 		{0x16e60, 0x16e7f, 1},
@@ -875,8 +918,11 @@
 		{0x1d78a, 0x1d78f, 1},
 		{0x1d7aa, 0x1d7c2, 1},
 		{0x1d7c4, 0x1d7c9, 1},
-		{0x1d7cb, 0x1e922, 4439},
-		{0x1e923, 0x1e943, 1},
+		{0x1d7cb, 0x1df00, 1845},
+		{0x1df01, 0x1df09, 1},
+		{0x1df0b, 0x1df1e, 1},
+		{0x1df25, 0x1df2a, 1},
+		{0x1e922, 0x1e943, 1},
 	},
 	LatinOffset: 4,
 }
@@ -893,11 +939,11 @@
 		{0x07f4, 0x07f5, 1},
 		{0x07fa, 0x081a, 32},
 		{0x0824, 0x0828, 4},
-		{0x0971, 0x0e46, 1237},
-		{0x0ec6, 0x10fc, 566},
-		{0x17d7, 0x1843, 108},
-		{0x1aa7, 0x1c78, 465},
-		{0x1c79, 0x1c7d, 1},
+		{0x08c9, 0x0971, 168},
+		{0x0e46, 0x0ec6, 128},
+		{0x10fc, 0x17d7, 1755},
+		{0x1843, 0x1aa7, 612},
+		{0x1c78, 0x1c7d, 1},
 		{0x1d2c, 0x1d6a, 1},
 		{0x1d78, 0x1d9b, 35},
 		{0x1d9c, 0x1dbf, 1},
@@ -916,6 +962,7 @@
 		{0xa69c, 0xa69d, 1},
 		{0xa717, 0xa71f, 1},
 		{0xa770, 0xa788, 24},
+		{0xa7f2, 0xa7f4, 1},
 		{0xa7f8, 0xa7f9, 1},
 		{0xa9cf, 0xa9e6, 23},
 		{0xaa70, 0xaadd, 109},
@@ -925,12 +972,19 @@
 		{0xff9e, 0xff9f, 1},
 	},
 	R32: []Range32{
+		{0x10780, 0x10785, 1},
+		{0x10787, 0x107b0, 1},
+		{0x107b2, 0x107ba, 1},
 		{0x16b40, 0x16b43, 1},
 		{0x16f93, 0x16f9f, 1},
 		{0x16fe0, 0x16fe1, 1},
-		{0x16fe3, 0x1e137, 29012},
-		{0x1e138, 0x1e13d, 1},
-		{0x1e94b, 0x1e94b, 1},
+		{0x16fe3, 0x1aff0, 16397},
+		{0x1aff1, 0x1aff3, 1},
+		{0x1aff5, 0x1affb, 1},
+		{0x1affd, 0x1affe, 1},
+		{0x1e030, 0x1e06d, 1},
+		{0x1e137, 0x1e13d, 1},
+		{0x1e4eb, 0x1e94b, 1120},
 	},
 }
 
@@ -957,8 +1011,9 @@
 		{0x0800, 0x0815, 1},
 		{0x0840, 0x0858, 1},
 		{0x0860, 0x086a, 1},
-		{0x08a0, 0x08b4, 1},
-		{0x08b6, 0x08c7, 1},
+		{0x0870, 0x0887, 1},
+		{0x0889, 0x088e, 1},
+		{0x08a0, 0x08c8, 1},
 		{0x0904, 0x0939, 1},
 		{0x093d, 0x0950, 19},
 		{0x0958, 0x0961, 1},
@@ -1019,17 +1074,18 @@
 		{0x0c2a, 0x0c39, 1},
 		{0x0c3d, 0x0c58, 27},
 		{0x0c59, 0x0c5a, 1},
-		{0x0c60, 0x0c61, 1},
-		{0x0c80, 0x0c85, 5},
-		{0x0c86, 0x0c8c, 1},
+		{0x0c5d, 0x0c60, 3},
+		{0x0c61, 0x0c80, 31},
+		{0x0c85, 0x0c8c, 1},
 		{0x0c8e, 0x0c90, 1},
 		{0x0c92, 0x0ca8, 1},
 		{0x0caa, 0x0cb3, 1},
 		{0x0cb5, 0x0cb9, 1},
-		{0x0cbd, 0x0cde, 33},
-		{0x0ce0, 0x0ce1, 1},
-		{0x0cf1, 0x0cf2, 1},
-		{0x0d04, 0x0d0c, 1},
+		{0x0cbd, 0x0cdd, 32},
+		{0x0cde, 0x0ce0, 2},
+		{0x0ce1, 0x0cf1, 16},
+		{0x0cf2, 0x0d04, 18},
+		{0x0d05, 0x0d0c, 1},
 		{0x0d0e, 0x0d10, 1},
 		{0x0d12, 0x0d3a, 1},
 		{0x0d3d, 0x0d4e, 17},
@@ -1089,9 +1145,8 @@
 		{0x1681, 0x169a, 1},
 		{0x16a0, 0x16ea, 1},
 		{0x16f1, 0x16f8, 1},
-		{0x1700, 0x170c, 1},
-		{0x170e, 0x1711, 1},
-		{0x1720, 0x1731, 1},
+		{0x1700, 0x1711, 1},
+		{0x171f, 0x1731, 1},
 		{0x1740, 0x1751, 1},
 		{0x1760, 0x176c, 1},
 		{0x176e, 0x1770, 1},
@@ -1111,7 +1166,7 @@
 		{0x1a00, 0x1a16, 1},
 		{0x1a20, 0x1a54, 1},
 		{0x1b05, 0x1b33, 1},
-		{0x1b45, 0x1b4b, 1},
+		{0x1b45, 0x1b4c, 1},
 		{0x1b83, 0x1ba0, 1},
 		{0x1bae, 0x1baf, 1},
 		{0x1bba, 0x1be5, 1},
@@ -1143,8 +1198,7 @@
 		{0x31a0, 0x31bf, 1},
 		{0x31f0, 0x31ff, 1},
 		{0x3400, 0x4dbf, 1},
-		{0x4e00, 0x9ffc, 1},
-		{0xa000, 0xa014, 1},
+		{0x4e00, 0xa014, 1},
 		{0xa016, 0xa48c, 1},
 		{0xa4d0, 0xa4f7, 1},
 		{0xa500, 0xa60b, 1},
@@ -1272,10 +1326,13 @@
 		{0x10f00, 0x10f1c, 1},
 		{0x10f27, 0x10f30, 9},
 		{0x10f31, 0x10f45, 1},
+		{0x10f70, 0x10f81, 1},
 		{0x10fb0, 0x10fc4, 1},
 		{0x10fe0, 0x10ff6, 1},
 		{0x11003, 0x11037, 1},
-		{0x11083, 0x110af, 1},
+		{0x11071, 0x11072, 1},
+		{0x11075, 0x11083, 14},
+		{0x11084, 0x110af, 1},
 		{0x110d0, 0x110e8, 1},
 		{0x11103, 0x11126, 1},
 		{0x11144, 0x11147, 3},
@@ -1286,6 +1343,7 @@
 		{0x111da, 0x111dc, 2},
 		{0x11200, 0x11211, 1},
 		{0x11213, 0x1122b, 1},
+		{0x1123f, 0x11240, 1},
 		{0x11280, 0x11286, 1},
 		{0x11288, 0x1128a, 2},
 		{0x1128b, 0x1128d, 1},
@@ -1313,6 +1371,7 @@
 		{0x11681, 0x116aa, 1},
 		{0x116b8, 0x11700, 72},
 		{0x11701, 0x1171a, 1},
+		{0x11740, 0x11746, 1},
 		{0x11800, 0x1182b, 1},
 		{0x118ff, 0x11906, 1},
 		{0x11909, 0x1190c, 3},
@@ -1327,8 +1386,8 @@
 		{0x11a0c, 0x11a32, 1},
 		{0x11a3a, 0x11a50, 22},
 		{0x11a5c, 0x11a89, 1},
-		{0x11a9d, 0x11ac0, 35},
-		{0x11ac1, 0x11af8, 1},
+		{0x11a9d, 0x11ab0, 19},
+		{0x11ab1, 0x11af8, 1},
 		{0x11c00, 0x11c08, 1},
 		{0x11c0a, 0x11c2e, 1},
 		{0x11c40, 0x11c72, 50},
@@ -1342,13 +1401,19 @@
 		{0x11d6a, 0x11d89, 1},
 		{0x11d98, 0x11ee0, 328},
 		{0x11ee1, 0x11ef2, 1},
+		{0x11f02, 0x11f04, 2},
+		{0x11f05, 0x11f10, 1},
+		{0x11f12, 0x11f33, 1},
 		{0x11fb0, 0x12000, 80},
 		{0x12001, 0x12399, 1},
 		{0x12480, 0x12543, 1},
-		{0x13000, 0x1342e, 1},
+		{0x12f90, 0x12ff0, 1},
+		{0x13000, 0x1342f, 1},
+		{0x13441, 0x13446, 1},
 		{0x14400, 0x14646, 1},
 		{0x16800, 0x16a38, 1},
 		{0x16a40, 0x16a5e, 1},
+		{0x16a70, 0x16abe, 1},
 		{0x16ad0, 0x16aed, 1},
 		{0x16b00, 0x16b2f, 1},
 		{0x16b63, 0x16b77, 1},
@@ -1358,17 +1423,26 @@
 		{0x17001, 0x187f7, 1},
 		{0x18800, 0x18cd5, 1},
 		{0x18d00, 0x18d08, 1},
-		{0x1b000, 0x1b11e, 1},
-		{0x1b150, 0x1b152, 1},
-		{0x1b164, 0x1b167, 1},
+		{0x1b000, 0x1b122, 1},
+		{0x1b132, 0x1b150, 30},
+		{0x1b151, 0x1b152, 1},
+		{0x1b155, 0x1b164, 15},
+		{0x1b165, 0x1b167, 1},
 		{0x1b170, 0x1b2fb, 1},
 		{0x1bc00, 0x1bc6a, 1},
 		{0x1bc70, 0x1bc7c, 1},
 		{0x1bc80, 0x1bc88, 1},
 		{0x1bc90, 0x1bc99, 1},
-		{0x1e100, 0x1e12c, 1},
-		{0x1e14e, 0x1e2c0, 370},
-		{0x1e2c1, 0x1e2eb, 1},
+		{0x1df0a, 0x1e100, 502},
+		{0x1e101, 0x1e12c, 1},
+		{0x1e14e, 0x1e290, 322},
+		{0x1e291, 0x1e2ad, 1},
+		{0x1e2c0, 0x1e2eb, 1},
+		{0x1e4d0, 0x1e4ea, 1},
+		{0x1e7e0, 0x1e7e6, 1},
+		{0x1e7e8, 0x1e7eb, 1},
+		{0x1e7ed, 0x1e7ee, 1},
+		{0x1e7f0, 0x1e7fe, 1},
 		{0x1e800, 0x1e8c4, 1},
 		{0x1ee00, 0x1ee03, 1},
 		{0x1ee05, 0x1ee1f, 1},
@@ -1394,13 +1468,14 @@
 		{0x1eea1, 0x1eea3, 1},
 		{0x1eea5, 0x1eea9, 1},
 		{0x1eeab, 0x1eebb, 1},
-		{0x20000, 0x2a6dd, 1},
-		{0x2a700, 0x2b734, 1},
+		{0x20000, 0x2a6df, 1},
+		{0x2a700, 0x2b739, 1},
 		{0x2b740, 0x2b81d, 1},
 		{0x2b820, 0x2cea1, 1},
 		{0x2ceb0, 0x2ebe0, 1},
 		{0x2f800, 0x2fa1d, 1},
 		{0x30000, 0x3134a, 1},
+		{0x31350, 0x323af, 1},
 	},
 	LatinOffset: 1,
 }
@@ -1501,7 +1576,7 @@
 		{0x2130, 0x2133, 1},
 		{0x213e, 0x213f, 1},
 		{0x2145, 0x2183, 62},
-		{0x2c00, 0x2c2e, 1},
+		{0x2c00, 0x2c2f, 1},
 		{0x2c60, 0x2c62, 2},
 		{0x2c63, 0x2c64, 1},
 		{0x2c67, 0x2c6d, 2},
@@ -1522,15 +1597,20 @@
 		{0xa796, 0xa7aa, 2},
 		{0xa7ab, 0xa7ae, 1},
 		{0xa7b0, 0xa7b4, 1},
-		{0xa7b6, 0xa7be, 2},
-		{0xa7c2, 0xa7c4, 2},
+		{0xa7b6, 0xa7c4, 2},
 		{0xa7c5, 0xa7c7, 1},
-		{0xa7c9, 0xa7f5, 44},
-		{0xff21, 0xff3a, 1},
+		{0xa7c9, 0xa7d0, 7},
+		{0xa7d6, 0xa7d8, 2},
+		{0xa7f5, 0xff21, 22316},
+		{0xff22, 0xff3a, 1},
 	},
 	R32: []Range32{
 		{0x10400, 0x10427, 1},
 		{0x104b0, 0x104d3, 1},
+		{0x10570, 0x1057a, 1},
+		{0x1057c, 0x1058a, 1},
+		{0x1058c, 0x10592, 1},
+		{0x10594, 0x10595, 1},
 		{0x10c80, 0x10cb2, 1},
 		{0x118a0, 0x118bf, 1},
 		{0x16e40, 0x16e5f, 1},
@@ -1594,7 +1674,8 @@
 		{0x0825, 0x0827, 1},
 		{0x0829, 0x082d, 1},
 		{0x0859, 0x085b, 1},
-		{0x08d3, 0x08e1, 1},
+		{0x0898, 0x089f, 1},
+		{0x08ca, 0x08e1, 1},
 		{0x08e3, 0x0903, 1},
 		{0x093a, 0x093c, 1},
 		{0x093e, 0x094f, 1},
@@ -1634,7 +1715,8 @@
 		{0x0bca, 0x0bcd, 1},
 		{0x0bd7, 0x0c00, 41},
 		{0x0c01, 0x0c04, 1},
-		{0x0c3e, 0x0c44, 1},
+		{0x0c3c, 0x0c3e, 2},
+		{0x0c3f, 0x0c44, 1},
 		{0x0c46, 0x0c48, 1},
 		{0x0c4a, 0x0c4d, 1},
 		{0x0c55, 0x0c56, 1},
@@ -1646,7 +1728,8 @@
 		{0x0cca, 0x0ccd, 1},
 		{0x0cd5, 0x0cd6, 1},
 		{0x0ce2, 0x0ce3, 1},
-		{0x0d00, 0x0d03, 1},
+		{0x0cf3, 0x0d00, 13},
+		{0x0d01, 0x0d03, 1},
 		{0x0d3b, 0x0d3c, 1},
 		{0x0d3e, 0x0d44, 1},
 		{0x0d46, 0x0d48, 1},
@@ -1664,7 +1747,7 @@
 		{0x0e47, 0x0e4e, 1},
 		{0x0eb1, 0x0eb4, 3},
 		{0x0eb5, 0x0ebc, 1},
-		{0x0ec8, 0x0ecd, 1},
+		{0x0ec8, 0x0ece, 1},
 		{0x0f18, 0x0f19, 1},
 		{0x0f35, 0x0f39, 2},
 		{0x0f3e, 0x0f3f, 1},
@@ -1683,22 +1766,22 @@
 		{0x108f, 0x109a, 11},
 		{0x109b, 0x109d, 1},
 		{0x135d, 0x135f, 1},
-		{0x1712, 0x1714, 1},
+		{0x1712, 0x1715, 1},
 		{0x1732, 0x1734, 1},
 		{0x1752, 0x1753, 1},
 		{0x1772, 0x1773, 1},
 		{0x17b4, 0x17d3, 1},
 		{0x17dd, 0x180b, 46},
 		{0x180c, 0x180d, 1},
-		{0x1885, 0x1886, 1},
-		{0x18a9, 0x1920, 119},
-		{0x1921, 0x192b, 1},
+		{0x180f, 0x1885, 118},
+		{0x1886, 0x18a9, 35},
+		{0x1920, 0x192b, 1},
 		{0x1930, 0x193b, 1},
 		{0x1a17, 0x1a1b, 1},
 		{0x1a55, 0x1a5e, 1},
 		{0x1a60, 0x1a7c, 1},
 		{0x1a7f, 0x1ab0, 49},
-		{0x1ab1, 0x1ac0, 1},
+		{0x1ab1, 0x1ace, 1},
 		{0x1b00, 0x1b04, 1},
 		{0x1b34, 0x1b44, 1},
 		{0x1b6b, 0x1b73, 1},
@@ -1710,8 +1793,7 @@
 		{0x1cd4, 0x1ce8, 1},
 		{0x1ced, 0x1cf4, 7},
 		{0x1cf7, 0x1cf9, 1},
-		{0x1dc0, 0x1df9, 1},
-		{0x1dfb, 0x1dff, 1},
+		{0x1dc0, 0x1dff, 1},
 		{0x20d0, 0x20f0, 1},
 		{0x2cef, 0x2cf1, 1},
 		{0x2d7f, 0x2de0, 97},
@@ -1763,12 +1845,17 @@
 		{0x10ae6, 0x10d24, 574},
 		{0x10d25, 0x10d27, 1},
 		{0x10eab, 0x10eac, 1},
+		{0x10efd, 0x10eff, 1},
 		{0x10f46, 0x10f50, 1},
+		{0x10f82, 0x10f85, 1},
 		{0x11000, 0x11002, 1},
 		{0x11038, 0x11046, 1},
-		{0x1107f, 0x11082, 1},
+		{0x11070, 0x11073, 3},
+		{0x11074, 0x1107f, 11},
+		{0x11080, 0x11082, 1},
 		{0x110b0, 0x110ba, 1},
-		{0x11100, 0x11102, 1},
+		{0x110c2, 0x11100, 62},
+		{0x11101, 0x11102, 1},
 		{0x11127, 0x11134, 1},
 		{0x11145, 0x11146, 1},
 		{0x11173, 0x11180, 13},
@@ -1777,8 +1864,8 @@
 		{0x111c9, 0x111cc, 1},
 		{0x111ce, 0x111cf, 1},
 		{0x1122c, 0x11237, 1},
-		{0x1123e, 0x112df, 161},
-		{0x112e0, 0x112ea, 1},
+		{0x1123e, 0x11241, 3},
+		{0x112df, 0x112ea, 1},
 		{0x11300, 0x11303, 1},
 		{0x1133b, 0x1133c, 1},
 		{0x1133e, 0x11344, 1},
@@ -1825,6 +1912,12 @@
 		{0x11d90, 0x11d91, 1},
 		{0x11d93, 0x11d97, 1},
 		{0x11ef3, 0x11ef6, 1},
+		{0x11f00, 0x11f01, 1},
+		{0x11f03, 0x11f34, 49},
+		{0x11f35, 0x11f3a, 1},
+		{0x11f3e, 0x11f42, 1},
+		{0x13440, 0x13447, 7},
+		{0x13448, 0x13455, 1},
 		{0x16af0, 0x16af4, 1},
 		{0x16b30, 0x16b36, 1},
 		{0x16f4f, 0x16f51, 2},
@@ -1832,8 +1925,10 @@
 		{0x16f8f, 0x16f92, 1},
 		{0x16fe4, 0x16ff0, 12},
 		{0x16ff1, 0x1bc9d, 19628},
-		{0x1bc9e, 0x1d165, 5319},
-		{0x1d166, 0x1d169, 1},
+		{0x1bc9e, 0x1cf00, 4706},
+		{0x1cf01, 0x1cf2d, 1},
+		{0x1cf30, 0x1cf46, 1},
+		{0x1d165, 0x1d169, 1},
 		{0x1d16d, 0x1d172, 1},
 		{0x1d17b, 0x1d182, 1},
 		{0x1d185, 0x1d18b, 1},
@@ -1849,8 +1944,11 @@
 		{0x1e01b, 0x1e021, 1},
 		{0x1e023, 0x1e024, 1},
 		{0x1e026, 0x1e02a, 1},
-		{0x1e130, 0x1e136, 1},
-		{0x1e2ec, 0x1e2ef, 1},
+		{0x1e08f, 0x1e130, 161},
+		{0x1e131, 0x1e136, 1},
+		{0x1e2ae, 0x1e2ec, 62},
+		{0x1e2ed, 0x1e2ef, 1},
+		{0x1e4ec, 0x1e4ef, 1},
 		{0x1e8d0, 0x1e8d6, 1},
 		{0x1e944, 0x1e94a, 1},
 		{0xe0100, 0xe01ef, 1},
@@ -1890,8 +1988,9 @@
 		{0x0cc7, 0x0cc8, 1},
 		{0x0cca, 0x0ccb, 1},
 		{0x0cd5, 0x0cd6, 1},
-		{0x0d02, 0x0d03, 1},
-		{0x0d3e, 0x0d40, 1},
+		{0x0cf3, 0x0d02, 15},
+		{0x0d03, 0x0d3e, 59},
+		{0x0d3f, 0x0d40, 1},
 		{0x0d46, 0x0d48, 1},
 		{0x0d4a, 0x0d4c, 1},
 		{0x0d57, 0x0d82, 43},
@@ -1911,6 +2010,7 @@
 		{0x1087, 0x108c, 1},
 		{0x108f, 0x109a, 11},
 		{0x109b, 0x109c, 1},
+		{0x1715, 0x1734, 31},
 		{0x17b6, 0x17be, 8},
 		{0x17bf, 0x17c5, 1},
 		{0x17c7, 0x17c8, 1},
@@ -2009,7 +2109,10 @@
 		{0x11d8a, 0x11d8e, 1},
 		{0x11d93, 0x11d94, 1},
 		{0x11d96, 0x11ef5, 351},
-		{0x11ef6, 0x16f51, 20571},
+		{0x11ef6, 0x11f03, 13},
+		{0x11f34, 0x11f35, 1},
+		{0x11f3e, 0x11f3f, 1},
+		{0x11f41, 0x16f51, 20496},
 		{0x16f52, 0x16f87, 1},
 		{0x16ff0, 0x16ff1, 1},
 		{0x1d165, 0x1d166, 1},
@@ -2052,7 +2155,8 @@
 		{0x0825, 0x0827, 1},
 		{0x0829, 0x082d, 1},
 		{0x0859, 0x085b, 1},
-		{0x08d3, 0x08e1, 1},
+		{0x0898, 0x089f, 1},
+		{0x08ca, 0x08e1, 1},
 		{0x08e3, 0x0902, 1},
 		{0x093a, 0x093c, 2},
 		{0x0941, 0x0948, 1},
@@ -2085,7 +2189,8 @@
 		{0x0b63, 0x0b82, 31},
 		{0x0bc0, 0x0bcd, 13},
 		{0x0c00, 0x0c04, 4},
-		{0x0c3e, 0x0c40, 1},
+		{0x0c3c, 0x0c3e, 2},
+		{0x0c3f, 0x0c40, 1},
 		{0x0c46, 0x0c48, 1},
 		{0x0c4a, 0x0c4d, 1},
 		{0x0c55, 0x0c56, 1},
@@ -2106,7 +2211,7 @@
 		{0x0e47, 0x0e4e, 1},
 		{0x0eb1, 0x0eb4, 3},
 		{0x0eb5, 0x0ebc, 1},
-		{0x0ec8, 0x0ecd, 1},
+		{0x0ec8, 0x0ece, 1},
 		{0x0f18, 0x0f19, 1},
 		{0x0f35, 0x0f39, 2},
 		{0x0f71, 0x0f7e, 1},
@@ -2127,7 +2232,7 @@
 		{0x109d, 0x135d, 704},
 		{0x135e, 0x135f, 1},
 		{0x1712, 0x1714, 1},
-		{0x1732, 0x1734, 1},
+		{0x1732, 0x1733, 1},
 		{0x1752, 0x1753, 1},
 		{0x1772, 0x1773, 1},
 		{0x17b4, 0x17b5, 1},
@@ -2136,9 +2241,9 @@
 		{0x17ca, 0x17d3, 1},
 		{0x17dd, 0x180b, 46},
 		{0x180c, 0x180d, 1},
-		{0x1885, 0x1886, 1},
-		{0x18a9, 0x1920, 119},
-		{0x1921, 0x1922, 1},
+		{0x180f, 0x1885, 118},
+		{0x1886, 0x18a9, 35},
+		{0x1920, 0x1922, 1},
 		{0x1927, 0x1928, 1},
 		{0x1932, 0x1939, 7},
 		{0x193a, 0x193b, 1},
@@ -2150,7 +2255,7 @@
 		{0x1a73, 0x1a7c, 1},
 		{0x1a7f, 0x1ab0, 49},
 		{0x1ab1, 0x1abd, 1},
-		{0x1abf, 0x1ac0, 1},
+		{0x1abf, 0x1ace, 1},
 		{0x1b00, 0x1b03, 1},
 		{0x1b34, 0x1b36, 2},
 		{0x1b37, 0x1b3a, 1},
@@ -2170,8 +2275,7 @@
 		{0x1ce2, 0x1ce8, 1},
 		{0x1ced, 0x1cf4, 7},
 		{0x1cf8, 0x1cf9, 1},
-		{0x1dc0, 0x1df9, 1},
-		{0x1dfb, 0x1dff, 1},
+		{0x1dc0, 0x1dff, 1},
 		{0x20d0, 0x20dc, 1},
 		{0x20e1, 0x20e5, 4},
 		{0x20e6, 0x20f0, 1},
@@ -2223,13 +2327,18 @@
 		{0x10ae6, 0x10d24, 574},
 		{0x10d25, 0x10d27, 1},
 		{0x10eab, 0x10eac, 1},
+		{0x10efd, 0x10eff, 1},
 		{0x10f46, 0x10f50, 1},
+		{0x10f82, 0x10f85, 1},
 		{0x11001, 0x11038, 55},
 		{0x11039, 0x11046, 1},
-		{0x1107f, 0x11081, 1},
+		{0x11070, 0x11073, 3},
+		{0x11074, 0x1107f, 11},
+		{0x11080, 0x11081, 1},
 		{0x110b3, 0x110b6, 1},
 		{0x110b9, 0x110ba, 1},
-		{0x11100, 0x11102, 1},
+		{0x110c2, 0x11100, 62},
+		{0x11101, 0x11102, 1},
 		{0x11127, 0x1112b, 1},
 		{0x1112d, 0x11134, 1},
 		{0x11173, 0x11180, 13},
@@ -2240,8 +2349,8 @@
 		{0x11230, 0x11231, 1},
 		{0x11234, 0x11236, 2},
 		{0x11237, 0x1123e, 7},
-		{0x112df, 0x112e3, 4},
-		{0x112e4, 0x112ea, 1},
+		{0x11241, 0x112df, 158},
+		{0x112e3, 0x112ea, 1},
 		{0x11300, 0x11301, 1},
 		{0x1133b, 0x1133c, 1},
 		{0x11340, 0x11366, 38},
@@ -2296,14 +2405,21 @@
 		{0x11d47, 0x11d90, 73},
 		{0x11d91, 0x11d95, 4},
 		{0x11d97, 0x11ef3, 348},
-		{0x11ef4, 0x16af0, 19452},
-		{0x16af1, 0x16af4, 1},
+		{0x11ef4, 0x11f00, 12},
+		{0x11f01, 0x11f36, 53},
+		{0x11f37, 0x11f3a, 1},
+		{0x11f40, 0x11f42, 2},
+		{0x13440, 0x13447, 7},
+		{0x13448, 0x13455, 1},
+		{0x16af0, 0x16af4, 1},
 		{0x16b30, 0x16b36, 1},
 		{0x16f4f, 0x16f8f, 64},
 		{0x16f90, 0x16f92, 1},
 		{0x16fe4, 0x1bc9d, 19641},
-		{0x1bc9e, 0x1d167, 5321},
-		{0x1d168, 0x1d169, 1},
+		{0x1bc9e, 0x1cf00, 4706},
+		{0x1cf01, 0x1cf2d, 1},
+		{0x1cf30, 0x1cf46, 1},
+		{0x1d167, 0x1d169, 1},
 		{0x1d17b, 0x1d182, 1},
 		{0x1d185, 0x1d18b, 1},
 		{0x1d1aa, 0x1d1ad, 1},
@@ -2318,8 +2434,11 @@
 		{0x1e01b, 0x1e021, 1},
 		{0x1e023, 0x1e024, 1},
 		{0x1e026, 0x1e02a, 1},
-		{0x1e130, 0x1e136, 1},
-		{0x1e2ec, 0x1e2ef, 1},
+		{0x1e08f, 0x1e130, 161},
+		{0x1e131, 0x1e136, 1},
+		{0x1e2ae, 0x1e2ec, 62},
+		{0x1e2ed, 0x1e2ef, 1},
+		{0x1e4ec, 0x1e4ef, 1},
 		{0x1e8d0, 0x1e8d6, 1},
 		{0x1e944, 0x1e94a, 1},
 		{0xe0100, 0xe01ef, 1},
@@ -2441,17 +2560,21 @@
 		{0x11c50, 0x11c6c, 1},
 		{0x11d50, 0x11d59, 1},
 		{0x11da0, 0x11da9, 1},
+		{0x11f50, 0x11f59, 1},
 		{0x11fc0, 0x11fd4, 1},
 		{0x12400, 0x1246e, 1},
 		{0x16a60, 0x16a69, 1},
+		{0x16ac0, 0x16ac9, 1},
 		{0x16b50, 0x16b59, 1},
 		{0x16b5b, 0x16b61, 1},
 		{0x16e80, 0x16e96, 1},
+		{0x1d2c0, 0x1d2d3, 1},
 		{0x1d2e0, 0x1d2f3, 1},
 		{0x1d360, 0x1d378, 1},
 		{0x1d7ce, 0x1d7ff, 1},
 		{0x1e140, 0x1e149, 1},
 		{0x1e2f0, 0x1e2f9, 1},
+		{0x1e4f0, 0x1e4f9, 1},
 		{0x1e8c7, 0x1e8cf, 1},
 		{0x1e950, 0x1e959, 1},
 		{0x1ec71, 0x1ecab, 1},
@@ -2523,11 +2646,14 @@
 		{0x11c50, 0x11c59, 1},
 		{0x11d50, 0x11d59, 1},
 		{0x11da0, 0x11da9, 1},
+		{0x11f50, 0x11f59, 1},
 		{0x16a60, 0x16a69, 1},
+		{0x16ac0, 0x16ac9, 1},
 		{0x16b50, 0x16b59, 1},
 		{0x1d7ce, 0x1d7ff, 1},
 		{0x1e140, 0x1e149, 1},
 		{0x1e2f0, 0x1e2f9, 1},
+		{0x1e4f0, 0x1e4f9, 1},
 		{0x1e950, 0x1e959, 1},
 		{0x1fbf0, 0x1fbf9, 1},
 	},
@@ -2617,6 +2743,7 @@
 		{0x11fc0, 0x11fd4, 1},
 		{0x16b5b, 0x16b61, 1},
 		{0x16e80, 0x16e96, 1},
+		{0x1d2c0, 0x1d2d3, 1},
 		{0x1d2e0, 0x1d2f3, 1},
 		{0x1d360, 0x1d378, 1},
 		{0x1e8c7, 0x1e8cf, 1},
@@ -2651,9 +2778,9 @@
 		{0x05f3, 0x05f4, 1},
 		{0x0609, 0x060a, 1},
 		{0x060c, 0x060d, 1},
-		{0x061b, 0x061e, 3},
-		{0x061f, 0x066a, 75},
-		{0x066b, 0x066d, 1},
+		{0x061b, 0x061d, 2},
+		{0x061e, 0x061f, 1},
+		{0x066a, 0x066d, 1},
 		{0x06d4, 0x0700, 44},
 		{0x0701, 0x070d, 1},
 		{0x07f7, 0x07f9, 1},
@@ -2686,6 +2813,7 @@
 		{0x1aa0, 0x1aa6, 1},
 		{0x1aa8, 0x1aad, 1},
 		{0x1b5a, 0x1b60, 1},
+		{0x1b7d, 0x1b7e, 1},
 		{0x1bfc, 0x1bff, 1},
 		{0x1c3b, 0x1c3f, 1},
 		{0x1c7e, 0x1c7f, 1},
@@ -2710,8 +2838,8 @@
 		{0x2d70, 0x2e00, 144},
 		{0x2e01, 0x2e2e, 1},
 		{0x2e30, 0x2e4f, 1},
-		{0x2e52, 0x3001, 431},
-		{0x3002, 0x3003, 1},
+		{0x2e52, 0x2e5d, 1},
+		{0x3001, 0x3003, 1},
 		{0x3008, 0x3011, 1},
 		{0x3014, 0x301f, 1},
 		{0x3030, 0x303d, 13},
@@ -2759,6 +2887,7 @@
 		{0x10b99, 0x10b9c, 1},
 		{0x10ead, 0x10f55, 168},
 		{0x10f56, 0x10f59, 1},
+		{0x10f86, 0x10f89, 1},
 		{0x11047, 0x1104d, 1},
 		{0x110bb, 0x110bc, 1},
 		{0x110be, 0x110c1, 1},
@@ -2775,18 +2904,22 @@
 		{0x115c1, 0x115d7, 1},
 		{0x11641, 0x11643, 1},
 		{0x11660, 0x1166c, 1},
-		{0x1173c, 0x1173e, 1},
+		{0x116b9, 0x1173c, 131},
+		{0x1173d, 0x1173e, 1},
 		{0x1183b, 0x11944, 265},
 		{0x11945, 0x11946, 1},
 		{0x119e2, 0x11a3f, 93},
 		{0x11a40, 0x11a46, 1},
 		{0x11a9a, 0x11a9c, 1},
 		{0x11a9e, 0x11aa2, 1},
+		{0x11b00, 0x11b09, 1},
 		{0x11c41, 0x11c45, 1},
 		{0x11c70, 0x11c71, 1},
 		{0x11ef7, 0x11ef8, 1},
+		{0x11f43, 0x11f4f, 1},
 		{0x11fff, 0x12470, 1137},
 		{0x12471, 0x12474, 1},
+		{0x12ff1, 0x12ff2, 1},
 		{0x16a6e, 0x16a6f, 1},
 		{0x16af5, 0x16b37, 66},
 		{0x16b38, 0x16b3b, 1},
@@ -2817,11 +2950,11 @@
 		{0x2011, 0x2015, 1},
 		{0x2e17, 0x2e1a, 3},
 		{0x2e3a, 0x2e3b, 1},
-		{0x2e40, 0x301c, 476},
-		{0x3030, 0x30a0, 112},
-		{0xfe31, 0xfe32, 1},
-		{0xfe58, 0xfe63, 11},
-		{0xff0d, 0xff0d, 1},
+		{0x2e40, 0x2e5d, 29},
+		{0x301c, 0x3030, 20},
+		{0x30a0, 0xfe31, 52625},
+		{0xfe32, 0xfe58, 38},
+		{0xfe63, 0xff0d, 170},
 	},
 	R32: []Range32{
 		{0x10ead, 0x10ead, 1},
@@ -2843,6 +2976,7 @@
 		{0x29d9, 0x29db, 2},
 		{0x29fd, 0x2e23, 1062},
 		{0x2e25, 0x2e29, 2},
+		{0x2e56, 0x2e5c, 2},
 		{0x3009, 0x3011, 2},
 		{0x3015, 0x301b, 2},
 		{0x301e, 0x301f, 1},
@@ -2895,9 +3029,9 @@
 		{0x05f3, 0x05f4, 1},
 		{0x0609, 0x060a, 1},
 		{0x060c, 0x060d, 1},
-		{0x061b, 0x061e, 3},
-		{0x061f, 0x066a, 75},
-		{0x066b, 0x066d, 1},
+		{0x061b, 0x061d, 2},
+		{0x061e, 0x061f, 1},
+		{0x066a, 0x066d, 1},
 		{0x06d4, 0x0700, 44},
 		{0x0701, 0x070d, 1},
 		{0x07f7, 0x07f9, 1},
@@ -2928,6 +3062,7 @@
 		{0x1aa0, 0x1aa6, 1},
 		{0x1aa8, 0x1aad, 1},
 		{0x1b5a, 0x1b60, 1},
+		{0x1b7d, 0x1b7e, 1},
 		{0x1bfc, 0x1bff, 1},
 		{0x1c3b, 0x1c3f, 1},
 		{0x1c7e, 0x1c7f, 1},
@@ -2956,8 +3091,8 @@
 		{0x2e3c, 0x2e3f, 1},
 		{0x2e41, 0x2e43, 2},
 		{0x2e44, 0x2e4f, 1},
-		{0x2e52, 0x3001, 431},
-		{0x3002, 0x3003, 1},
+		{0x2e52, 0x2e54, 1},
+		{0x3001, 0x3003, 1},
 		{0x303d, 0x30fb, 190},
 		{0xa4fe, 0xa4ff, 1},
 		{0xa60d, 0xa60f, 1},
@@ -3003,6 +3138,7 @@
 		{0x10b39, 0x10b3f, 1},
 		{0x10b99, 0x10b9c, 1},
 		{0x10f55, 0x10f59, 1},
+		{0x10f86, 0x10f89, 1},
 		{0x11047, 0x1104d, 1},
 		{0x110bb, 0x110bc, 1},
 		{0x110be, 0x110c1, 1},
@@ -3019,18 +3155,22 @@
 		{0x115c1, 0x115d7, 1},
 		{0x11641, 0x11643, 1},
 		{0x11660, 0x1166c, 1},
-		{0x1173c, 0x1173e, 1},
+		{0x116b9, 0x1173c, 131},
+		{0x1173d, 0x1173e, 1},
 		{0x1183b, 0x11944, 265},
 		{0x11945, 0x11946, 1},
 		{0x119e2, 0x11a3f, 93},
 		{0x11a40, 0x11a46, 1},
 		{0x11a9a, 0x11a9c, 1},
 		{0x11a9e, 0x11aa2, 1},
+		{0x11b00, 0x11b09, 1},
 		{0x11c41, 0x11c45, 1},
 		{0x11c70, 0x11c71, 1},
 		{0x11ef7, 0x11ef8, 1},
+		{0x11f43, 0x11f4f, 1},
 		{0x11fff, 0x12470, 1137},
 		{0x12471, 0x12474, 1},
+		{0x12ff1, 0x12ff2, 1},
 		{0x16a6e, 0x16a6f, 1},
 		{0x16af5, 0x16b37, 66},
 		{0x16b38, 0x16b3b, 1},
@@ -3059,8 +3199,9 @@
 		{0x29d8, 0x29da, 2},
 		{0x29fc, 0x2e22, 1062},
 		{0x2e24, 0x2e28, 2},
-		{0x2e42, 0x3008, 454},
-		{0x300a, 0x3010, 2},
+		{0x2e42, 0x2e55, 19},
+		{0x2e57, 0x2e5b, 2},
+		{0x3008, 0x3010, 2},
 		{0x3014, 0x301a, 2},
 		{0x301d, 0xfd3f, 52514},
 		{0xfe17, 0xfe35, 30},
@@ -3101,10 +3242,11 @@
 		{0x06e9, 0x06fd, 20},
 		{0x06fe, 0x07f6, 248},
 		{0x07fe, 0x07ff, 1},
-		{0x09f2, 0x09f3, 1},
-		{0x09fa, 0x09fb, 1},
-		{0x0af1, 0x0b70, 127},
-		{0x0bf3, 0x0bfa, 1},
+		{0x0888, 0x09f2, 362},
+		{0x09f3, 0x09fa, 7},
+		{0x09fb, 0x0af1, 246},
+		{0x0b70, 0x0bf3, 131},
+		{0x0bf4, 0x0bfa, 1},
 		{0x0c7f, 0x0d4f, 208},
 		{0x0d79, 0x0e3f, 198},
 		{0x0f01, 0x0f03, 1},
@@ -3132,7 +3274,7 @@
 		{0x2044, 0x2052, 14},
 		{0x207a, 0x207c, 1},
 		{0x208a, 0x208c, 1},
-		{0x20a0, 0x20bf, 1},
+		{0x20a0, 0x20c0, 1},
 		{0x2100, 0x2101, 1},
 		{0x2103, 0x2106, 1},
 		{0x2108, 0x2109, 1},
@@ -3190,8 +3332,10 @@
 		{0xaa77, 0xaa79, 1},
 		{0xab5b, 0xab6a, 15},
 		{0xab6b, 0xfb29, 20414},
-		{0xfbb2, 0xfbc1, 1},
-		{0xfdfc, 0xfdfd, 1},
+		{0xfbb2, 0xfbc2, 1},
+		{0xfd40, 0xfd4f, 1},
+		{0xfdcf, 0xfdfc, 45},
+		{0xfdfd, 0xfdff, 1},
 		{0xfe62, 0xfe64, 2},
 		{0xfe65, 0xfe66, 1},
 		{0xfe69, 0xff04, 155},
@@ -3215,13 +3359,14 @@
 		{0x11fd5, 0x11ff1, 1},
 		{0x16b3c, 0x16b3f, 1},
 		{0x16b45, 0x1bc9c, 20823},
+		{0x1cf50, 0x1cfc3, 1},
 		{0x1d000, 0x1d0f5, 1},
 		{0x1d100, 0x1d126, 1},
 		{0x1d129, 0x1d164, 1},
 		{0x1d16a, 0x1d16c, 1},
 		{0x1d183, 0x1d184, 1},
 		{0x1d18c, 0x1d1a9, 1},
-		{0x1d1ae, 0x1d1e8, 1},
+		{0x1d1ae, 0x1d1ea, 1},
 		{0x1d200, 0x1d241, 1},
 		{0x1d245, 0x1d300, 187},
 		{0x1d301, 0x1d356, 1},
@@ -3252,28 +3397,27 @@
 		{0x1f250, 0x1f251, 1},
 		{0x1f260, 0x1f265, 1},
 		{0x1f300, 0x1f6d7, 1},
-		{0x1f6e0, 0x1f6ec, 1},
+		{0x1f6dc, 0x1f6ec, 1},
 		{0x1f6f0, 0x1f6fc, 1},
-		{0x1f700, 0x1f773, 1},
-		{0x1f780, 0x1f7d8, 1},
+		{0x1f700, 0x1f776, 1},
+		{0x1f77b, 0x1f7d9, 1},
 		{0x1f7e0, 0x1f7eb, 1},
-		{0x1f800, 0x1f80b, 1},
+		{0x1f7f0, 0x1f800, 16},
+		{0x1f801, 0x1f80b, 1},
 		{0x1f810, 0x1f847, 1},
 		{0x1f850, 0x1f859, 1},
 		{0x1f860, 0x1f887, 1},
 		{0x1f890, 0x1f8ad, 1},
 		{0x1f8b0, 0x1f8b1, 1},
-		{0x1f900, 0x1f978, 1},
-		{0x1f97a, 0x1f9cb, 1},
-		{0x1f9cd, 0x1fa53, 1},
+		{0x1f900, 0x1fa53, 1},
 		{0x1fa60, 0x1fa6d, 1},
-		{0x1fa70, 0x1fa74, 1},
-		{0x1fa78, 0x1fa7a, 1},
-		{0x1fa80, 0x1fa86, 1},
-		{0x1fa90, 0x1faa8, 1},
-		{0x1fab0, 0x1fab6, 1},
-		{0x1fac0, 0x1fac2, 1},
-		{0x1fad0, 0x1fad6, 1},
+		{0x1fa70, 0x1fa7c, 1},
+		{0x1fa80, 0x1fa88, 1},
+		{0x1fa90, 0x1fabd, 1},
+		{0x1fabf, 0x1fac5, 1},
+		{0x1face, 0x1fadb, 1},
+		{0x1fae0, 0x1fae8, 1},
+		{0x1faf0, 0x1faf8, 1},
 		{0x1fb00, 0x1fb92, 1},
 		{0x1fb94, 0x1fbca, 1},
 	},
@@ -3290,7 +3434,7 @@
 		{0x09fb, 0x0af1, 246},
 		{0x0bf9, 0x0e3f, 582},
 		{0x17db, 0x20a0, 2245},
-		{0x20a1, 0x20bf, 1},
+		{0x20a1, 0x20c0, 1},
 		{0xa838, 0xfdfc, 21956},
 		{0xfe69, 0xff04, 155},
 		{0xffe0, 0xffe1, 1},
@@ -3314,8 +3458,9 @@
 		{0x02ed, 0x02ef, 2},
 		{0x02f0, 0x02ff, 1},
 		{0x0375, 0x0384, 15},
-		{0x0385, 0x1fbd, 7224},
-		{0x1fbf, 0x1fc1, 1},
+		{0x0385, 0x0888, 1283},
+		{0x1fbd, 0x1fbf, 2},
+		{0x1fc0, 0x1fc1, 1},
 		{0x1fcd, 0x1fcf, 1},
 		{0x1fdd, 0x1fdf, 1},
 		{0x1fed, 0x1fef, 1},
@@ -3326,7 +3471,7 @@
 		{0xa789, 0xa78a, 1},
 		{0xab5b, 0xab6a, 15},
 		{0xab6b, 0xfbb2, 20551},
-		{0xfbb3, 0xfbc1, 1},
+		{0xfbb3, 0xfbc2, 1},
 		{0xff3e, 0xff40, 2},
 		{0xffe3, 0xffe3, 1},
 	},
@@ -3488,10 +3633,12 @@
 		{0xa836, 0xa837, 1},
 		{0xa839, 0xaa77, 574},
 		{0xaa78, 0xaa79, 1},
-		{0xfdfd, 0xffe4, 487},
-		{0xffe8, 0xffed, 5},
-		{0xffee, 0xfffc, 14},
-		{0xfffd, 0xfffd, 1},
+		{0xfd40, 0xfd4f, 1},
+		{0xfdcf, 0xfdfd, 46},
+		{0xfdfe, 0xfdff, 1},
+		{0xffe4, 0xffe8, 4},
+		{0xffed, 0xffee, 1},
+		{0xfffc, 0xfffd, 1},
 	},
 	R32: []Range32{
 		{0x10137, 0x1013f, 1},
@@ -3506,13 +3653,14 @@
 		{0x11fe1, 0x11ff1, 1},
 		{0x16b3c, 0x16b3f, 1},
 		{0x16b45, 0x1bc9c, 20823},
+		{0x1cf50, 0x1cfc3, 1},
 		{0x1d000, 0x1d0f5, 1},
 		{0x1d100, 0x1d126, 1},
 		{0x1d129, 0x1d164, 1},
 		{0x1d16a, 0x1d16c, 1},
 		{0x1d183, 0x1d184, 1},
 		{0x1d18c, 0x1d1a9, 1},
-		{0x1d1ae, 0x1d1e8, 1},
+		{0x1d1ae, 0x1d1ea, 1},
 		{0x1d200, 0x1d241, 1},
 		{0x1d245, 0x1d300, 187},
 		{0x1d301, 0x1d356, 1},
@@ -3537,28 +3685,27 @@
 		{0x1f260, 0x1f265, 1},
 		{0x1f300, 0x1f3fa, 1},
 		{0x1f400, 0x1f6d7, 1},
-		{0x1f6e0, 0x1f6ec, 1},
+		{0x1f6dc, 0x1f6ec, 1},
 		{0x1f6f0, 0x1f6fc, 1},
-		{0x1f700, 0x1f773, 1},
-		{0x1f780, 0x1f7d8, 1},
+		{0x1f700, 0x1f776, 1},
+		{0x1f77b, 0x1f7d9, 1},
 		{0x1f7e0, 0x1f7eb, 1},
-		{0x1f800, 0x1f80b, 1},
+		{0x1f7f0, 0x1f800, 16},
+		{0x1f801, 0x1f80b, 1},
 		{0x1f810, 0x1f847, 1},
 		{0x1f850, 0x1f859, 1},
 		{0x1f860, 0x1f887, 1},
 		{0x1f890, 0x1f8ad, 1},
 		{0x1f8b0, 0x1f8b1, 1},
-		{0x1f900, 0x1f978, 1},
-		{0x1f97a, 0x1f9cb, 1},
-		{0x1f9cd, 0x1fa53, 1},
+		{0x1f900, 0x1fa53, 1},
 		{0x1fa60, 0x1fa6d, 1},
-		{0x1fa70, 0x1fa74, 1},
-		{0x1fa78, 0x1fa7a, 1},
-		{0x1fa80, 0x1fa86, 1},
-		{0x1fa90, 0x1faa8, 1},
-		{0x1fab0, 0x1fab6, 1},
-		{0x1fac0, 0x1fac2, 1},
-		{0x1fad0, 0x1fad6, 1},
+		{0x1fa70, 0x1fa7c, 1},
+		{0x1fa80, 0x1fa88, 1},
+		{0x1fa90, 0x1fabd, 1},
+		{0x1fabf, 0x1fac5, 1},
+		{0x1face, 0x1fadb, 1},
+		{0x1fae0, 0x1fae8, 1},
+		{0x1faf0, 0x1faf8, 1},
 		{0x1fb00, 0x1fb92, 1},
 		{0x1fb94, 0x1fbca, 1},
 	},
@@ -3681,6 +3828,7 @@
 	"Coptic":                 Coptic,
 	"Cuneiform":              Cuneiform,
 	"Cypriot":                Cypriot,
+	"Cypro_Minoan":           Cypro_Minoan,
 	"Cyrillic":               Cyrillic,
 	"Deseret":                Deseret,
 	"Devanagari":             Devanagari,
@@ -3714,6 +3862,7 @@
 	"Kaithi":                 Kaithi,
 	"Kannada":                Kannada,
 	"Katakana":               Katakana,
+	"Kawi":                   Kawi,
 	"Kayah_Li":               Kayah_Li,
 	"Kharoshthi":             Kharoshthi,
 	"Khitan_Small_Script":    Khitan_Small_Script,
@@ -3748,6 +3897,7 @@
 	"Multani":                Multani,
 	"Myanmar":                Myanmar,
 	"Nabataean":              Nabataean,
+	"Nag_Mundari":            Nag_Mundari,
 	"Nandinagari":            Nandinagari,
 	"New_Tai_Lue":            New_Tai_Lue,
 	"Newa":                   Newa,
@@ -3764,6 +3914,7 @@
 	"Old_Sogdian":            Old_Sogdian,
 	"Old_South_Arabian":      Old_South_Arabian,
 	"Old_Turkic":             Old_Turkic,
+	"Old_Uyghur":             Old_Uyghur,
 	"Oriya":                  Oriya,
 	"Osage":                  Osage,
 	"Osmanya":                Osmanya,
@@ -3795,6 +3946,7 @@
 	"Tai_Viet":               Tai_Viet,
 	"Takri":                  Takri,
 	"Tamil":                  Tamil,
+	"Tangsa":                 Tangsa,
 	"Tangut":                 Tangut,
 	"Telugu":                 Telugu,
 	"Thaana":                 Thaana,
@@ -3802,8 +3954,10 @@
 	"Tibetan":                Tibetan,
 	"Tifinagh":               Tifinagh,
 	"Tirhuta":                Tirhuta,
+	"Toto":                   Toto,
 	"Ugaritic":               Ugaritic,
 	"Vai":                    Vai,
+	"Vithkuqi":               Vithkuqi,
 	"Wancho":                 Wancho,
 	"Warang_Citi":            Warang_Citi,
 	"Yezidi":                 Yezidi,
@@ -3825,7 +3979,7 @@
 	R32: []Range32{
 		{0x11700, 0x1171a, 1},
 		{0x1171d, 0x1172b, 1},
-		{0x11730, 0x1173f, 1},
+		{0x11730, 0x11746, 1},
 	},
 }
 
@@ -3841,27 +3995,29 @@
 		{0x0600, 0x0604, 1},
 		{0x0606, 0x060b, 1},
 		{0x060d, 0x061a, 1},
-		{0x061c, 0x0620, 2},
-		{0x0621, 0x063f, 1},
+		{0x061c, 0x061e, 1},
+		{0x0620, 0x063f, 1},
 		{0x0641, 0x064a, 1},
 		{0x0656, 0x066f, 1},
 		{0x0671, 0x06dc, 1},
 		{0x06de, 0x06ff, 1},
 		{0x0750, 0x077f, 1},
-		{0x08a0, 0x08b4, 1},
-		{0x08b6, 0x08c7, 1},
-		{0x08d3, 0x08e1, 1},
+		{0x0870, 0x088e, 1},
+		{0x0890, 0x0891, 1},
+		{0x0898, 0x08e1, 1},
 		{0x08e3, 0x08ff, 1},
-		{0xfb50, 0xfbc1, 1},
+		{0xfb50, 0xfbc2, 1},
 		{0xfbd3, 0xfd3d, 1},
-		{0xfd50, 0xfd8f, 1},
+		{0xfd40, 0xfd8f, 1},
 		{0xfd92, 0xfdc7, 1},
-		{0xfdf0, 0xfdfd, 1},
+		{0xfdcf, 0xfdf0, 33},
+		{0xfdf1, 0xfdff, 1},
 		{0xfe70, 0xfe74, 1},
 		{0xfe76, 0xfefc, 1},
 	},
 	R32: []Range32{
 		{0x10e60, 0x10e7e, 1},
+		{0x10efd, 0x10eff, 1},
 		{0x1ee00, 0x1ee03, 1},
 		{0x1ee05, 0x1ee1f, 1},
 		{0x1ee21, 0x1ee22, 1},
@@ -3909,8 +4065,8 @@
 
 var _Balinese = &RangeTable{
 	R16: []Range16{
-		{0x1b00, 0x1b4b, 1},
-		{0x1b50, 0x1b7c, 1},
+		{0x1b00, 0x1b4c, 1},
+		{0x1b50, 0x1b7e, 1},
 	},
 }
 
@@ -3979,7 +4135,7 @@
 	R16: []Range16{},
 	R32: []Range32{
 		{0x11000, 0x1104d, 1},
-		{0x11052, 0x1106f, 1},
+		{0x11052, 0x11075, 1},
 		{0x1107f, 0x1107f, 1},
 	},
 }
@@ -4008,6 +4164,9 @@
 		{0x1400, 0x167f, 1},
 		{0x18b0, 0x18f5, 1},
 	},
+	R32: []Range32{
+		{0x11ab0, 0x11abf, 1},
+	},
 }
 
 var _Carian = &RangeTable{
@@ -4091,7 +4250,7 @@
 		{0x2066, 0x2070, 1},
 		{0x2074, 0x207e, 1},
 		{0x2080, 0x208e, 1},
-		{0x20a0, 0x20bf, 1},
+		{0x20a0, 0x20c0, 1},
 		{0x2100, 0x2125, 1},
 		{0x2127, 0x2129, 1},
 		{0x212c, 0x2131, 1},
@@ -4104,7 +4263,7 @@
 		{0x2900, 0x2b73, 1},
 		{0x2b76, 0x2b95, 1},
 		{0x2b97, 0x2bff, 1},
-		{0x2e00, 0x2e52, 1},
+		{0x2e00, 0x2e5d, 1},
 		{0x2ff0, 0x2ffb, 1},
 		{0x3000, 0x3004, 1},
 		{0x3006, 0x3008, 2},
@@ -4149,15 +4308,16 @@
 		{0x10190, 0x1019c, 1},
 		{0x101d0, 0x101fc, 1},
 		{0x102e1, 0x102fb, 1},
-		{0x16fe2, 0x16fe3, 1},
 		{0x1bca0, 0x1bca3, 1},
+		{0x1cf50, 0x1cfc3, 1},
 		{0x1d000, 0x1d0f5, 1},
 		{0x1d100, 0x1d126, 1},
 		{0x1d129, 0x1d166, 1},
 		{0x1d16a, 0x1d17a, 1},
 		{0x1d183, 0x1d184, 1},
 		{0x1d18c, 0x1d1a9, 1},
-		{0x1d1ae, 0x1d1e8, 1},
+		{0x1d1ae, 0x1d1ea, 1},
+		{0x1d2c0, 0x1d2d3, 1},
 		{0x1d2e0, 0x1d2f3, 1},
 		{0x1d300, 0x1d356, 1},
 		{0x1d360, 0x1d378, 1},
@@ -4198,28 +4358,27 @@
 		{0x1f250, 0x1f251, 1},
 		{0x1f260, 0x1f265, 1},
 		{0x1f300, 0x1f6d7, 1},
-		{0x1f6e0, 0x1f6ec, 1},
+		{0x1f6dc, 0x1f6ec, 1},
 		{0x1f6f0, 0x1f6fc, 1},
-		{0x1f700, 0x1f773, 1},
-		{0x1f780, 0x1f7d8, 1},
+		{0x1f700, 0x1f776, 1},
+		{0x1f77b, 0x1f7d9, 1},
 		{0x1f7e0, 0x1f7eb, 1},
-		{0x1f800, 0x1f80b, 1},
+		{0x1f7f0, 0x1f800, 16},
+		{0x1f801, 0x1f80b, 1},
 		{0x1f810, 0x1f847, 1},
 		{0x1f850, 0x1f859, 1},
 		{0x1f860, 0x1f887, 1},
 		{0x1f890, 0x1f8ad, 1},
 		{0x1f8b0, 0x1f8b1, 1},
-		{0x1f900, 0x1f978, 1},
-		{0x1f97a, 0x1f9cb, 1},
-		{0x1f9cd, 0x1fa53, 1},
+		{0x1f900, 0x1fa53, 1},
 		{0x1fa60, 0x1fa6d, 1},
-		{0x1fa70, 0x1fa74, 1},
-		{0x1fa78, 0x1fa7a, 1},
-		{0x1fa80, 0x1fa86, 1},
-		{0x1fa90, 0x1faa8, 1},
-		{0x1fab0, 0x1fab6, 1},
-		{0x1fac0, 0x1fac2, 1},
-		{0x1fad0, 0x1fad6, 1},
+		{0x1fa70, 0x1fa7c, 1},
+		{0x1fa80, 0x1fa88, 1},
+		{0x1fa90, 0x1fabd, 1},
+		{0x1fabf, 0x1fac5, 1},
+		{0x1face, 0x1fadb, 1},
+		{0x1fae0, 0x1fae8, 1},
+		{0x1faf0, 0x1faf8, 1},
 		{0x1fb00, 0x1fb92, 1},
 		{0x1fb94, 0x1fbca, 1},
 		{0x1fbf0, 0x1fbf9, 1},
@@ -4258,6 +4417,13 @@
 	},
 }
 
+var _Cypro_Minoan = &RangeTable{
+	R16: []Range16{},
+	R32: []Range32{
+		{0x12f90, 0x12ff2, 1},
+	},
+}
+
 var _Cyrillic = &RangeTable{
 	R16: []Range16{
 		{0x0400, 0x0484, 1},
@@ -4268,6 +4434,10 @@
 		{0xa640, 0xa69f, 1},
 		{0xfe2e, 0xfe2f, 1},
 	},
+	R32: []Range32{
+		{0x1e030, 0x1e06d, 1},
+		{0x1e08f, 0x1e08f, 1},
+	},
 }
 
 var _Deseret = &RangeTable{
@@ -4284,6 +4454,9 @@
 		{0x0966, 0x097f, 1},
 		{0xa8e0, 0xa8ff, 1},
 	},
+	R32: []Range32{
+		{0x11b00, 0x11b09, 1},
+	},
 }
 
 var _Dives_Akuru = &RangeTable{
@@ -4321,8 +4494,7 @@
 var _Egyptian_Hieroglyphs = &RangeTable{
 	R16: []Range16{},
 	R32: []Range32{
-		{0x13000, 0x1342e, 1},
-		{0x13430, 0x13438, 1},
+		{0x13000, 0x13455, 1},
 	},
 }
 
@@ -4375,6 +4547,12 @@
 		{0xab20, 0xab26, 1},
 		{0xab28, 0xab2e, 1},
 	},
+	R32: []Range32{
+		{0x1e7e0, 0x1e7e6, 1},
+		{0x1e7e8, 0x1e7eb, 1},
+		{0x1e7ed, 0x1e7ee, 1},
+		{0x1e7f0, 0x1e7fe, 1},
+	},
 }
 
 var _Georgian = &RangeTable{
@@ -4392,8 +4570,7 @@
 
 var _Glagolitic = &RangeTable{
 	R16: []Range16{
-		{0x2c00, 0x2c2e, 1},
-		{0x2c30, 0x2c5e, 1},
+		{0x2c00, 0x2c5f, 1},
 	},
 	R32: []Range32{
 		{0x1e000, 0x1e006, 1},
@@ -4531,19 +4708,21 @@
 		{0x3021, 0x3029, 1},
 		{0x3038, 0x303b, 1},
 		{0x3400, 0x4dbf, 1},
-		{0x4e00, 0x9ffc, 1},
+		{0x4e00, 0x9fff, 1},
 		{0xf900, 0xfa6d, 1},
 		{0xfa70, 0xfad9, 1},
 	},
 	R32: []Range32{
+		{0x16fe2, 0x16fe3, 1},
 		{0x16ff0, 0x16ff1, 1},
-		{0x20000, 0x2a6dd, 1},
-		{0x2a700, 0x2b734, 1},
+		{0x20000, 0x2a6df, 1},
+		{0x2a700, 0x2b739, 1},
 		{0x2b740, 0x2b81d, 1},
 		{0x2b820, 0x2cea1, 1},
 		{0x2ceb0, 0x2ebe0, 1},
 		{0x2f800, 0x2fa1d, 1},
 		{0x30000, 0x3134a, 1},
+		{0x31350, 0x323af, 1},
 	},
 }
 
@@ -4609,8 +4788,9 @@
 		{0x309d, 0x309f, 1},
 	},
 	R32: []Range32{
-		{0x1b001, 0x1b11e, 1},
-		{0x1b150, 0x1b152, 1},
+		{0x1b001, 0x1b11f, 1},
+		{0x1b132, 0x1b150, 30},
+		{0x1b151, 0x1b152, 1},
 		{0x1f200, 0x1f200, 1},
 	},
 }
@@ -4630,14 +4810,13 @@
 		{0x064b, 0x0655, 1},
 		{0x0670, 0x0951, 737},
 		{0x0952, 0x0954, 1},
-		{0x1ab0, 0x1ac0, 1},
+		{0x1ab0, 0x1ace, 1},
 		{0x1cd0, 0x1cd2, 1},
 		{0x1cd4, 0x1ce0, 1},
 		{0x1ce2, 0x1ce8, 1},
 		{0x1ced, 0x1cf4, 7},
 		{0x1cf8, 0x1cf9, 1},
-		{0x1dc0, 0x1df9, 1},
-		{0x1dfb, 0x1dff, 1},
+		{0x1dc0, 0x1dff, 1},
 		{0x200c, 0x200d, 1},
 		{0x20d0, 0x20f0, 1},
 		{0x302a, 0x302d, 1},
@@ -4647,8 +4826,10 @@
 	},
 	R32: []Range32{
 		{0x101fd, 0x102e0, 227},
-		{0x1133b, 0x1d167, 48684},
-		{0x1d168, 0x1d169, 1},
+		{0x1133b, 0x1cf00, 48069},
+		{0x1cf01, 0x1cf2d, 1},
+		{0x1cf30, 0x1cf46, 1},
+		{0x1d167, 0x1d169, 1},
 		{0x1d17b, 0x1d182, 1},
 		{0x1d185, 0x1d18b, 1},
 		{0x1d1aa, 0x1d1ad, 1},
@@ -4683,7 +4864,7 @@
 var _Kaithi = &RangeTable{
 	R16: []Range16{},
 	R32: []Range32{
-		{0x11080, 0x110c1, 1},
+		{0x11080, 0x110c2, 1},
 		{0x110cd, 0x110cd, 1},
 	},
 }
@@ -4699,10 +4880,10 @@
 		{0x0cc6, 0x0cc8, 1},
 		{0x0cca, 0x0ccd, 1},
 		{0x0cd5, 0x0cd6, 1},
-		{0x0cde, 0x0ce0, 2},
-		{0x0ce1, 0x0ce3, 1},
+		{0x0cdd, 0x0cde, 1},
+		{0x0ce0, 0x0ce3, 1},
 		{0x0ce6, 0x0cef, 1},
-		{0x0cf1, 0x0cf2, 1},
+		{0x0cf1, 0x0cf3, 1},
 	},
 }
 
@@ -4717,11 +4898,25 @@
 		{0xff71, 0xff9d, 1},
 	},
 	R32: []Range32{
-		{0x1b000, 0x1b164, 356},
+		{0x1aff0, 0x1aff3, 1},
+		{0x1aff5, 0x1affb, 1},
+		{0x1affd, 0x1affe, 1},
+		{0x1b000, 0x1b120, 288},
+		{0x1b121, 0x1b122, 1},
+		{0x1b155, 0x1b164, 15},
 		{0x1b165, 0x1b167, 1},
 	},
 }
 
+var _Kawi = &RangeTable{
+	R16: []Range16{},
+	R32: []Range32{
+		{0x11f00, 0x11f10, 1},
+		{0x11f12, 0x11f3a, 1},
+		{0x11f3e, 0x11f59, 1},
+	},
+}
+
 var _Kayah_Li = &RangeTable{
 	R16: []Range16{
 		{0xa900, 0xa92d, 1},
@@ -4764,7 +4959,7 @@
 	R16: []Range16{},
 	R32: []Range32{
 		{0x11200, 0x11211, 1},
-		{0x11213, 0x1123e, 1},
+		{0x11213, 0x11241, 1},
 	},
 }
 
@@ -4786,7 +4981,7 @@
 		{0x0ea8, 0x0ebd, 1},
 		{0x0ec0, 0x0ec4, 1},
 		{0x0ec6, 0x0ec8, 2},
-		{0x0ec9, 0x0ecd, 1},
+		{0x0ec9, 0x0ece, 1},
 		{0x0ed0, 0x0ed9, 1},
 		{0x0edc, 0x0edf, 1},
 	},
@@ -4814,9 +5009,11 @@
 		{0x2160, 0x2188, 1},
 		{0x2c60, 0x2c7f, 1},
 		{0xa722, 0xa787, 1},
-		{0xa78b, 0xa7bf, 1},
-		{0xa7c2, 0xa7ca, 1},
-		{0xa7f5, 0xa7ff, 1},
+		{0xa78b, 0xa7ca, 1},
+		{0xa7d0, 0xa7d1, 1},
+		{0xa7d3, 0xa7d5, 2},
+		{0xa7d6, 0xa7d9, 1},
+		{0xa7f2, 0xa7ff, 1},
 		{0xab30, 0xab5a, 1},
 		{0xab5c, 0xab64, 1},
 		{0xab66, 0xab69, 1},
@@ -4824,6 +5021,13 @@
 		{0xff21, 0xff3a, 1},
 		{0xff41, 0xff5a, 1},
 	},
+	R32: []Range32{
+		{0x10780, 0x10785, 1},
+		{0x10787, 0x107b0, 1},
+		{0x107b2, 0x107ba, 1},
+		{0x1df00, 0x1df1e, 1},
+		{0x1df25, 0x1df2a, 1},
+	},
 	LatinOffset: 5,
 }
 
@@ -5014,8 +5218,7 @@
 	R16: []Range16{
 		{0x1800, 0x1801, 1},
 		{0x1804, 0x1806, 2},
-		{0x1807, 0x180e, 1},
-		{0x1810, 0x1819, 1},
+		{0x1807, 0x1819, 1},
 		{0x1820, 0x1878, 1},
 		{0x1880, 0x18aa, 1},
 	},
@@ -5060,6 +5263,13 @@
 	},
 }
 
+var _Nag_Mundari = &RangeTable{
+	R16: []Range16{},
+	R32: []Range32{
+		{0x1e4d0, 0x1e4f9, 1},
+	},
+}
+
 var _Nandinagari = &RangeTable{
 	R16: []Range16{},
 	R32: []Range32{
@@ -5183,6 +5393,13 @@
 	},
 }
 
+var _Old_Uyghur = &RangeTable{
+	R16: []Range16{},
+	R32: []Range32{
+		{0x10f70, 0x10f89, 1},
+	},
+}
+
 var _Oriya = &RangeTable{
 	R16: []Range16{
 		{0x0b01, 0x0b03, 1},
@@ -5391,8 +5608,8 @@
 
 var _Tagalog = &RangeTable{
 	R16: []Range16{
-		{0x1700, 0x170c, 1},
-		{0x170e, 0x1714, 1},
+		{0x1700, 0x1715, 1},
+		{0x171f, 0x171f, 1},
 	},
 }
 
@@ -5431,7 +5648,7 @@
 var _Takri = &RangeTable{
 	R16: []Range16{},
 	R32: []Range32{
-		{0x11680, 0x116b8, 1},
+		{0x11680, 0x116b9, 1},
 		{0x116c0, 0x116c9, 1},
 	},
 }
@@ -5460,6 +5677,14 @@
 	},
 }
 
+var _Tangsa = &RangeTable{
+	R16: []Range16{},
+	R32: []Range32{
+		{0x16a70, 0x16abe, 1},
+		{0x16ac0, 0x16ac9, 1},
+	},
+}
+
 var _Tangut = &RangeTable{
 	R16: []Range16{},
 	R32: []Range32{
@@ -5476,12 +5701,13 @@
 		{0x0c0e, 0x0c10, 1},
 		{0x0c12, 0x0c28, 1},
 		{0x0c2a, 0x0c39, 1},
-		{0x0c3d, 0x0c44, 1},
+		{0x0c3c, 0x0c44, 1},
 		{0x0c46, 0x0c48, 1},
 		{0x0c4a, 0x0c4d, 1},
 		{0x0c55, 0x0c56, 1},
 		{0x0c58, 0x0c5a, 1},
-		{0x0c60, 0x0c63, 1},
+		{0x0c5d, 0x0c60, 3},
+		{0x0c61, 0x0c63, 1},
 		{0x0c66, 0x0c6f, 1},
 		{0x0c77, 0x0c7f, 1},
 	},
@@ -5528,6 +5754,13 @@
 	},
 }
 
+var _Toto = &RangeTable{
+	R16: []Range16{},
+	R32: []Range32{
+		{0x1e290, 0x1e2ae, 1},
+	},
+}
+
 var _Ugaritic = &RangeTable{
 	R16: []Range16{},
 	R32: []Range32{
@@ -5542,6 +5775,20 @@
 	},
 }
 
+var _Vithkuqi = &RangeTable{
+	R16: []Range16{},
+	R32: []Range32{
+		{0x10570, 0x1057a, 1},
+		{0x1057c, 0x1058a, 1},
+		{0x1058c, 0x10592, 1},
+		{0x10594, 0x10595, 1},
+		{0x10597, 0x105a1, 1},
+		{0x105a3, 0x105b1, 1},
+		{0x105b3, 0x105b9, 1},
+		{0x105bb, 0x105bc, 1},
+	},
+}
+
 var _Wancho = &RangeTable{
 	R16: []Range16{},
 	R32: []Range32{
@@ -5611,6 +5858,7 @@
 	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.
+	Cypro_Minoan           = _Cypro_Minoan           // Cypro_Minoan is the set of Unicode characters in script Cypro_Minoan.
 	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.
@@ -5644,6 +5892,7 @@
 	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.
+	Kawi                   = _Kawi                   // Kawi is the set of Unicode characters in script Kawi.
 	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.
 	Khitan_Small_Script    = _Khitan_Small_Script    // Khitan_Small_Script is the set of Unicode characters in script Khitan_Small_Script.
@@ -5678,6 +5927,7 @@
 	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.
+	Nag_Mundari            = _Nag_Mundari            // Nag_Mundari is the set of Unicode characters in script Nag_Mundari.
 	Nandinagari            = _Nandinagari            // Nandinagari is the set of Unicode characters in script Nandinagari.
 	New_Tai_Lue            = _New_Tai_Lue            // New_Tai_Lue is the set of Unicode characters in script New_Tai_Lue.
 	Newa                   = _Newa                   // Newa is the set of Unicode characters in script Newa.
@@ -5694,6 +5944,7 @@
 	Old_Sogdian            = _Old_Sogdian            // Old_Sogdian is the set of Unicode characters in script Old_Sogdian.
 	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.
+	Old_Uyghur             = _Old_Uyghur             // Old_Uyghur is the set of Unicode characters in script Old_Uyghur.
 	Oriya                  = _Oriya                  // Oriya is the set of Unicode characters in script Oriya.
 	Osage                  = _Osage                  // Osage is the set of Unicode characters in script Osage.
 	Osmanya                = _Osmanya                // Osmanya is the set of Unicode characters in script Osmanya.
@@ -5725,6 +5976,7 @@
 	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.
+	Tangsa                 = _Tangsa                 // Tangsa is the set of Unicode characters in script Tangsa.
 	Tangut                 = _Tangut                 // Tangut is the set of Unicode characters in script Tangut.
 	Telugu                 = _Telugu                 // Telugu is the set of Unicode characters in script Telugu.
 	Thaana                 = _Thaana                 // Thaana is the set of Unicode characters in script Thaana.
@@ -5732,8 +5984,10 @@
 	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.
+	Toto                   = _Toto                   // Toto is the set of Unicode characters in script Toto.
 	Ugaritic               = _Ugaritic               // Ugaritic is the set of Unicode characters in script Ugaritic.
 	Vai                    = _Vai                    // Vai is the set of Unicode characters in script Vai.
+	Vithkuqi               = _Vithkuqi               // Vithkuqi is the set of Unicode characters in script Vithkuqi.
 	Wancho                 = _Wancho                 // Wancho is the set of Unicode characters in script Wancho.
 	Warang_Citi            = _Warang_Citi            // Warang_Citi is the set of Unicode characters in script Warang_Citi.
 	Yezidi                 = _Yezidi                 // Yezidi is the set of Unicode characters in script Yezidi.
@@ -5808,11 +6062,11 @@
 		{0x208b, 0x2212, 391},
 		{0x2e17, 0x2e1a, 3},
 		{0x2e3a, 0x2e3b, 1},
-		{0x2e40, 0x301c, 476},
-		{0x3030, 0x30a0, 112},
-		{0xfe31, 0xfe32, 1},
-		{0xfe58, 0xfe63, 11},
-		{0xff0d, 0xff0d, 1},
+		{0x2e40, 0x2e5d, 29},
+		{0x301c, 0x3030, 20},
+		{0x30a0, 0xfe31, 52625},
+		{0xfe32, 0xfe58, 38},
+		{0xfe63, 0xff0d, 170},
 	},
 	R32: []Range32{
 		{0x10ead, 0x10ead, 1},
@@ -5859,6 +6113,8 @@
 		{0x07a6, 0x07b0, 1},
 		{0x07eb, 0x07f5, 1},
 		{0x0818, 0x0819, 1},
+		{0x0898, 0x089f, 1},
+		{0x08c9, 0x08d2, 1},
 		{0x08e3, 0x08fe, 1},
 		{0x093c, 0x094d, 17},
 		{0x0951, 0x0954, 1},
@@ -5869,10 +6125,10 @@
 		{0x0afe, 0x0aff, 1},
 		{0x0b3c, 0x0b4d, 17},
 		{0x0b55, 0x0bcd, 120},
-		{0x0c4d, 0x0cbc, 111},
-		{0x0ccd, 0x0d3b, 110},
-		{0x0d3c, 0x0d4d, 17},
-		{0x0dca, 0x0e47, 125},
+		{0x0c3c, 0x0c4d, 17},
+		{0x0cbc, 0x0ccd, 17},
+		{0x0d3b, 0x0d3c, 1},
+		{0x0d4d, 0x0e47, 125},
 		{0x0e48, 0x0e4c, 1},
 		{0x0e4e, 0x0eba, 108},
 		{0x0ec8, 0x0ecc, 1},
@@ -5889,12 +6145,14 @@
 		{0x108f, 0x109a, 11},
 		{0x109b, 0x135d, 706},
 		{0x135e, 0x135f, 1},
+		{0x1714, 0x1715, 1},
 		{0x17c9, 0x17d3, 1},
 		{0x17dd, 0x1939, 348},
 		{0x193a, 0x193b, 1},
 		{0x1a75, 0x1a7c, 1},
 		{0x1a7f, 0x1ab0, 49},
-		{0x1ab1, 0x1abd, 1},
+		{0x1ab1, 0x1abe, 1},
+		{0x1ac1, 0x1acb, 1},
 		{0x1b34, 0x1b44, 16},
 		{0x1b6b, 0x1b73, 1},
 		{0x1baa, 0x1bab, 1},
@@ -5905,8 +6163,7 @@
 		{0x1cf7, 0x1cf9, 1},
 		{0x1d2c, 0x1d6a, 1},
 		{0x1dc4, 0x1dcf, 1},
-		{0x1df5, 0x1df9, 1},
-		{0x1dfd, 0x1dff, 1},
+		{0x1df5, 0x1dff, 1},
 		{0x1fbd, 0x1fbf, 2},
 		{0x1fc0, 0x1fc1, 1},
 		{0x1fcd, 0x1fcf, 1},
@@ -5943,10 +6200,16 @@
 		{0xff9f, 0xffe3, 68},
 	},
 	R32: []Range32{
-		{0x102e0, 0x10ae5, 2053},
-		{0x10ae6, 0x10d22, 572},
-		{0x10d23, 0x10d27, 1},
+		{0x102e0, 0x10780, 1184},
+		{0x10781, 0x10785, 1},
+		{0x10787, 0x107b0, 1},
+		{0x107b2, 0x107ba, 1},
+		{0x10ae5, 0x10ae6, 1},
+		{0x10d22, 0x10d27, 1},
+		{0x10efd, 0x10eff, 1},
 		{0x10f46, 0x10f50, 1},
+		{0x10f82, 0x10f85, 1},
+		{0x11046, 0x11070, 42},
 		{0x110b9, 0x110ba, 1},
 		{0x11133, 0x11134, 1},
 		{0x11173, 0x111c0, 77},
@@ -5968,17 +6231,25 @@
 		{0x11a99, 0x11c3f, 422},
 		{0x11d42, 0x11d44, 2},
 		{0x11d45, 0x11d97, 82},
+		{0x13447, 0x13455, 1},
 		{0x16af0, 0x16af4, 1},
 		{0x16b30, 0x16b36, 1},
 		{0x16f8f, 0x16f9f, 1},
 		{0x16ff0, 0x16ff1, 1},
+		{0x1aff0, 0x1aff3, 1},
+		{0x1aff5, 0x1affb, 1},
+		{0x1affd, 0x1affe, 1},
+		{0x1cf00, 0x1cf2d, 1},
+		{0x1cf30, 0x1cf46, 1},
 		{0x1d167, 0x1d169, 1},
 		{0x1d16d, 0x1d172, 1},
 		{0x1d17b, 0x1d182, 1},
 		{0x1d185, 0x1d18b, 1},
 		{0x1d1aa, 0x1d1ad, 1},
+		{0x1e030, 0x1e06d, 1},
 		{0x1e130, 0x1e136, 1},
-		{0x1e2ec, 0x1e2ef, 1},
+		{0x1e2ae, 0x1e2ec, 62},
+		{0x1e2ed, 0x1e2ef, 1},
 		{0x1e8d0, 0x1e8d6, 1},
 		{0x1e944, 0x1e946, 1},
 		{0x1e948, 0x1e94a, 1},
@@ -6005,6 +6276,7 @@
 		{0xff70, 0xff70, 1},
 	},
 	R32: []Range32{
+		{0x10781, 0x10782, 1},
 		{0x1135d, 0x115c6, 617},
 		{0x115c7, 0x115c8, 1},
 		{0x11a98, 0x16b42, 20650},
@@ -6058,7 +6330,7 @@
 		{0x3021, 0x3029, 1},
 		{0x3038, 0x303a, 1},
 		{0x3400, 0x4dbf, 1},
-		{0x4e00, 0x9ffc, 1},
+		{0x4e00, 0x9fff, 1},
 		{0xf900, 0xfa6d, 1},
 		{0xfa70, 0xfad9, 1},
 	},
@@ -6068,13 +6340,14 @@
 		{0x18800, 0x18cd5, 1},
 		{0x18d00, 0x18d08, 1},
 		{0x1b170, 0x1b2fb, 1},
-		{0x20000, 0x2a6dd, 1},
-		{0x2a700, 0x2b734, 1},
+		{0x20000, 0x2a6df, 1},
+		{0x2a700, 0x2b739, 1},
 		{0x2b740, 0x2b81d, 1},
 		{0x2b820, 0x2cea1, 1},
 		{0x2ceb0, 0x2ebe0, 1},
 		{0x2f800, 0x2fa1d, 1},
 		{0x30000, 0x3134a, 1},
+		{0x31350, 0x323af, 1},
 	},
 }
 
@@ -6178,7 +6451,7 @@
 		{0x0bc6, 0x0bc8, 1},
 		{0x0bca, 0x0bcc, 1},
 		{0x0bd7, 0x0c00, 41},
-		{0x0c01, 0x0c03, 1},
+		{0x0c01, 0x0c04, 1},
 		{0x0c3e, 0x0c44, 1},
 		{0x0c46, 0x0c48, 1},
 		{0x0c4a, 0x0c4c, 1},
@@ -6190,7 +6463,8 @@
 		{0x0cca, 0x0ccc, 1},
 		{0x0cd5, 0x0cd6, 1},
 		{0x0ce2, 0x0ce3, 1},
-		{0x0d00, 0x0d03, 1},
+		{0x0cf3, 0x0d00, 13},
+		{0x0d01, 0x0d03, 1},
 		{0x0d3e, 0x0d44, 1},
 		{0x0d46, 0x0d48, 1},
 		{0x0d4a, 0x0d4c, 1},
@@ -6207,7 +6481,7 @@
 		{0x0eb4, 0x0eb9, 1},
 		{0x0ebb, 0x0ebc, 1},
 		{0x0ecd, 0x0f71, 164},
-		{0x0f72, 0x0f81, 1},
+		{0x0f72, 0x0f83, 1},
 		{0x0f8d, 0x0f97, 1},
 		{0x0f99, 0x0fbc, 1},
 		{0x102b, 0x1036, 1},
@@ -6234,6 +6508,7 @@
 		{0x1a55, 0x1a5e, 1},
 		{0x1a61, 0x1a74, 1},
 		{0x1abf, 0x1ac0, 1},
+		{0x1acc, 0x1ace, 1},
 		{0x1b00, 0x1b04, 1},
 		{0x1b35, 0x1b43, 1},
 		{0x1b80, 0x1b82, 1},
@@ -6278,9 +6553,11 @@
 		{0x10eab, 0x10eac, 1},
 		{0x11000, 0x11002, 1},
 		{0x11038, 0x11045, 1},
-		{0x11082, 0x110b0, 46},
-		{0x110b1, 0x110b8, 1},
-		{0x11100, 0x11102, 1},
+		{0x11073, 0x11074, 1},
+		{0x11080, 0x11082, 1},
+		{0x110b0, 0x110b8, 1},
+		{0x110c2, 0x11100, 62},
+		{0x11101, 0x11102, 1},
 		{0x11127, 0x11132, 1},
 		{0x11145, 0x11146, 1},
 		{0x11180, 0x11182, 1},
@@ -6288,7 +6565,8 @@
 		{0x111ce, 0x111cf, 1},
 		{0x1122c, 0x11234, 1},
 		{0x11237, 0x1123e, 7},
-		{0x112df, 0x112e8, 1},
+		{0x11241, 0x112df, 158},
+		{0x112e0, 0x112e8, 1},
 		{0x11300, 0x11303, 1},
 		{0x1133e, 0x11344, 1},
 		{0x11347, 0x11348, 1},
@@ -6331,6 +6609,10 @@
 		{0x11d90, 0x11d91, 1},
 		{0x11d93, 0x11d96, 1},
 		{0x11ef3, 0x11ef6, 1},
+		{0x11f00, 0x11f01, 1},
+		{0x11f03, 0x11f34, 49},
+		{0x11f35, 0x11f3a, 1},
+		{0x11f3e, 0x11f40, 1},
 		{0x16f4f, 0x16f51, 2},
 		{0x16f52, 0x16f87, 1},
 		{0x16f8f, 0x16f92, 1},
@@ -6341,8 +6623,8 @@
 		{0x1e01b, 0x1e021, 1},
 		{0x1e023, 0x1e024, 1},
 		{0x1e026, 0x1e02a, 1},
-		{0x1e947, 0x1f130, 2025},
-		{0x1f131, 0x1f149, 1},
+		{0x1e08f, 0x1e947, 2232},
+		{0x1f130, 0x1f149, 1},
 		{0x1f150, 0x1f169, 1},
 		{0x1f170, 0x1f189, 1},
 	},
@@ -6410,7 +6692,8 @@
 		{0x02c0, 0x02c1, 1},
 		{0x02e0, 0x02e4, 1},
 		{0x0345, 0x037a, 53},
-		{0x1d2c, 0x1d6a, 1},
+		{0x10fc, 0x1d2c, 3120},
+		{0x1d2d, 0x1d6a, 1},
 		{0x1d78, 0x1d9b, 35},
 		{0x1d9c, 0x1dbf, 1},
 		{0x2071, 0x207f, 14},
@@ -6419,9 +6702,18 @@
 		{0x24d0, 0x24e9, 1},
 		{0x2c7c, 0x2c7d, 1},
 		{0xa69c, 0xa69d, 1},
-		{0xa770, 0xa7f8, 136},
-		{0xa7f9, 0xab5c, 867},
-		{0xab5d, 0xab5f, 1},
+		{0xa770, 0xa7f2, 130},
+		{0xa7f3, 0xa7f4, 1},
+		{0xa7f8, 0xa7f9, 1},
+		{0xab5c, 0xab5f, 1},
+		{0xab69, 0xab69, 1},
+	},
+	R32: []Range32{
+		{0x10780, 0x10783, 3},
+		{0x10784, 0x10785, 1},
+		{0x10787, 0x107b0, 1},
+		{0x107b2, 0x107ba, 1},
+		{0x1e030, 0x1e06d, 1},
 	},
 	LatinOffset: 1,
 }
@@ -6607,6 +6899,7 @@
 	R16: []Range16{
 		{0x0600, 0x0605, 1},
 		{0x06dd, 0x070f, 50},
+		{0x0890, 0x0891, 1},
 		{0x08e2, 0x08e2, 1},
 	},
 	R32: []Range32{
@@ -6649,7 +6942,7 @@
 	R16: []Range16{
 		{0x0021, 0x002e, 13},
 		{0x003f, 0x0589, 1354},
-		{0x061e, 0x061f, 1},
+		{0x061d, 0x061f, 1},
 		{0x06d4, 0x0700, 44},
 		{0x0701, 0x0702, 1},
 		{0x07f9, 0x0837, 62},
@@ -6665,11 +6958,13 @@
 		{0x1aa9, 0x1aab, 1},
 		{0x1b5a, 0x1b5b, 1},
 		{0x1b5e, 0x1b5f, 1},
+		{0x1b7d, 0x1b7e, 1},
 		{0x1c3b, 0x1c3c, 1},
 		{0x1c7e, 0x1c7f, 1},
 		{0x203c, 0x203d, 1},
 		{0x2047, 0x2049, 1},
 		{0x2e2e, 0x2e3c, 14},
+		{0x2e53, 0x2e54, 1},
 		{0x3002, 0xa4ff, 29949},
 		{0xa60e, 0xa60f, 1},
 		{0xa6f3, 0xa6f7, 4},
@@ -6687,6 +6982,7 @@
 	R32: []Range32{
 		{0x10a56, 0x10a57, 1},
 		{0x10f55, 0x10f59, 1},
+		{0x10f86, 0x10f89, 1},
 		{0x11047, 0x11048, 1},
 		{0x110be, 0x110c1, 1},
 		{0x11141, 0x11143, 1},
@@ -6705,6 +7001,7 @@
 		{0x11a9b, 0x11a9c, 1},
 		{0x11c41, 0x11c42, 1},
 		{0x11ef7, 0x11ef8, 1},
+		{0x11f43, 0x11f44, 1},
 		{0x16a6e, 0x16a6f, 1},
 		{0x16af5, 0x16b37, 66},
 		{0x16b38, 0x16b44, 12},
@@ -6741,6 +7038,8 @@
 		{0x1d62a, 0x1d62b, 1},
 		{0x1d65e, 0x1d65f, 1},
 		{0x1d692, 0x1d693, 1},
+		{0x1df1a, 0x1e04c, 306},
+		{0x1e04d, 0x1e068, 27},
 	},
 	LatinOffset: 1,
 }
@@ -6753,7 +7052,7 @@
 		{0x037e, 0x0387, 9},
 		{0x0589, 0x05c3, 58},
 		{0x060c, 0x061b, 15},
-		{0x061e, 0x061f, 1},
+		{0x061d, 0x061f, 1},
 		{0x06d4, 0x0700, 44},
 		{0x0701, 0x070a, 1},
 		{0x070c, 0x07f8, 236},
@@ -6776,6 +7075,7 @@
 		{0x1aa8, 0x1aab, 1},
 		{0x1b5a, 0x1b5b, 1},
 		{0x1b5d, 0x1b5f, 1},
+		{0x1b7d, 0x1b7e, 1},
 		{0x1c3b, 0x1c3f, 1},
 		{0x1c7e, 0x1c7f, 1},
 		{0x203c, 0x203d, 1},
@@ -6783,6 +7083,7 @@
 		{0x2e2e, 0x2e3c, 14},
 		{0x2e41, 0x2e4c, 11},
 		{0x2e4e, 0x2e4f, 1},
+		{0x2e53, 0x2e54, 1},
 		{0x3001, 0x3002, 1},
 		{0xa4fe, 0xa4ff, 1},
 		{0xa60d, 0xa60f, 1},
@@ -6809,6 +7110,7 @@
 		{0x10b3a, 0x10b3f, 1},
 		{0x10b99, 0x10b9c, 1},
 		{0x10f55, 0x10f59, 1},
+		{0x10f86, 0x10f89, 1},
 		{0x11047, 0x1104d, 1},
 		{0x110be, 0x110c1, 1},
 		{0x11141, 0x11143, 1},
@@ -6829,7 +7131,8 @@
 		{0x11aa1, 0x11aa2, 1},
 		{0x11c41, 0x11c43, 1},
 		{0x11c71, 0x11ef7, 646},
-		{0x11ef8, 0x12470, 1400},
+		{0x11ef8, 0x11f43, 75},
+		{0x11f44, 0x12470, 1324},
 		{0x12471, 0x12474, 1},
 		{0x16a6e, 0x16a6f, 1},
 		{0x16af5, 0x16b37, 66},
@@ -6844,7 +7147,7 @@
 var _Unified_Ideograph = &RangeTable{
 	R16: []Range16{
 		{0x3400, 0x4dbf, 1},
-		{0x4e00, 0x9ffc, 1},
+		{0x4e00, 0x9fff, 1},
 		{0xfa0e, 0xfa0f, 1},
 		{0xfa11, 0xfa13, 2},
 		{0xfa14, 0xfa1f, 11},
@@ -6853,19 +7156,21 @@
 		{0xfa28, 0xfa29, 1},
 	},
 	R32: []Range32{
-		{0x20000, 0x2a6dd, 1},
-		{0x2a700, 0x2b734, 1},
+		{0x20000, 0x2a6df, 1},
+		{0x2a700, 0x2b739, 1},
 		{0x2b740, 0x2b81d, 1},
 		{0x2b820, 0x2cea1, 1},
 		{0x2ceb0, 0x2ebe0, 1},
 		{0x30000, 0x3134a, 1},
+		{0x31350, 0x323af, 1},
 	},
 }
 
 var _Variation_Selector = &RangeTable{
 	R16: []Range16{
 		{0x180b, 0x180d, 1},
-		{0xfe00, 0xfe0f, 1},
+		{0x180f, 0xfe00, 58865},
+		{0xfe01, 0xfe0f, 1},
 	},
 	R32: []Range32{
 		{0xe0100, 0xe01ef, 1},
@@ -7181,8 +7486,8 @@
 	{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}},
+	{0x2C00, 0x2C2F, d{0, 48, 0}},
+	{0x2C30, 0x2C5F, d{-48, 0, -48}},
 	{0x2C60, 0x2C61, d{UpperLower, UpperLower, UpperLower}},
 	{0x2C62, 0x2C62, d{0, -10743, 0}},
 	{0x2C63, 0x2C63, d{0, -3814, 0}},
@@ -7224,12 +7529,13 @@
 	{0xA7B1, 0xA7B1, d{0, -42282, 0}},
 	{0xA7B2, 0xA7B2, d{0, -42261, 0}},
 	{0xA7B3, 0xA7B3, d{0, 928, 0}},
-	{0xA7B4, 0xA7BF, d{UpperLower, UpperLower, UpperLower}},
-	{0xA7C2, 0xA7C3, d{UpperLower, UpperLower, UpperLower}},
+	{0xA7B4, 0xA7C3, d{UpperLower, UpperLower, UpperLower}},
 	{0xA7C4, 0xA7C4, d{0, -48, 0}},
 	{0xA7C5, 0xA7C5, d{0, -42307, 0}},
 	{0xA7C6, 0xA7C6, d{0, -35384, 0}},
 	{0xA7C7, 0xA7CA, d{UpperLower, UpperLower, UpperLower}},
+	{0xA7D0, 0xA7D1, d{UpperLower, UpperLower, UpperLower}},
+	{0xA7D6, 0xA7D9, d{UpperLower, UpperLower, UpperLower}},
 	{0xA7F5, 0xA7F6, d{UpperLower, UpperLower, UpperLower}},
 	{0xAB53, 0xAB53, d{-928, 0, -928}},
 	{0xAB70, 0xABBF, d{-38864, 0, -38864}},
@@ -7239,6 +7545,14 @@
 	{0x10428, 0x1044F, d{-40, 0, -40}},
 	{0x104B0, 0x104D3, d{0, 40, 0}},
 	{0x104D8, 0x104FB, d{-40, 0, -40}},
+	{0x10570, 0x1057A, d{0, 39, 0}},
+	{0x1057C, 0x1058A, d{0, 39, 0}},
+	{0x1058C, 0x10592, d{0, 39, 0}},
+	{0x10594, 0x10595, d{0, 39, 0}},
+	{0x10597, 0x105A1, d{-39, 0, -39}},
+	{0x105A3, 0x105B1, d{-39, 0, -39}},
+	{0x105B3, 0x105B9, d{-39, 0, -39}},
+	{0x105BB, 0x105BC, d{-39, 0, -39}},
 	{0x10C80, 0x10CB2, d{0, 64, 0}},
 	{0x10CC0, 0x10CF2, d{-64, 0, -64}},
 	{0x118A0, 0x118BF, d{0, 32, 0}},
@@ -7376,7 +7690,7 @@
 	0x7C: pS | pp,  // '|'
 	0x7D: pP | pp,  // '}'
 	0x7E: pS | pp,  // '~'
-	0x7F: pC,       // '\u007f'
+	0x7F: pC,       // '\x7f'
 	0x80: pC,       // '\u0080'
 	0x81: pC,       // '\u0081'
 	0x82: pC,       // '\u0082'
@@ -7831,7 +8145,7 @@
 		{0x2126, 0x212a, 4},
 		{0x212b, 0x2132, 7},
 		{0x2183, 0x2c00, 2685},
-		{0x2c01, 0x2c2e, 1},
+		{0x2c01, 0x2c2f, 1},
 		{0x2c60, 0x2c62, 2},
 		{0x2c63, 0x2c64, 1},
 		{0x2c67, 0x2c6d, 2},
@@ -7852,15 +8166,20 @@
 		{0xa796, 0xa7aa, 2},
 		{0xa7ab, 0xa7ae, 1},
 		{0xa7b0, 0xa7b4, 1},
-		{0xa7b6, 0xa7be, 2},
-		{0xa7c2, 0xa7c4, 2},
+		{0xa7b6, 0xa7c4, 2},
 		{0xa7c5, 0xa7c7, 1},
-		{0xa7c9, 0xa7f5, 44},
-		{0xff21, 0xff3a, 1},
+		{0xa7c9, 0xa7d0, 7},
+		{0xa7d6, 0xa7d8, 2},
+		{0xa7f5, 0xff21, 22316},
+		{0xff22, 0xff3a, 1},
 	},
 	R32: []Range32{
 		{0x10400, 0x10427, 1},
 		{0x104b0, 0x104d3, 1},
+		{0x10570, 0x1057a, 1},
+		{0x1057c, 0x1058a, 1},
+		{0x1058c, 0x10592, 1},
+		{0x10594, 0x10595, 1},
 		{0x10c80, 0x10cb2, 1},
 		{0x118a0, 0x118bf, 1},
 		{0x16e40, 0x16e5f, 1},
@@ -7969,7 +8288,7 @@
 		{0x1fd1, 0x1fe0, 15},
 		{0x1fe1, 0x1fe5, 4},
 		{0x214e, 0x2184, 54},
-		{0x2c30, 0x2c5e, 1},
+		{0x2c30, 0x2c5f, 1},
 		{0x2c61, 0x2c65, 4},
 		{0x2c66, 0x2c6c, 2},
 		{0x2c73, 0x2c76, 3},
@@ -7987,9 +8306,10 @@
 		{0xa78c, 0xa791, 5},
 		{0xa793, 0xa794, 1},
 		{0xa797, 0xa7a9, 2},
-		{0xa7b5, 0xa7bf, 2},
-		{0xa7c3, 0xa7c8, 5},
-		{0xa7ca, 0xa7f6, 44},
+		{0xa7b5, 0xa7c3, 2},
+		{0xa7c8, 0xa7ca, 2},
+		{0xa7d1, 0xa7d7, 6},
+		{0xa7d9, 0xa7f6, 29},
 		{0xab53, 0xab70, 29},
 		{0xab71, 0xabbf, 1},
 		{0xff41, 0xff5a, 1},
@@ -7997,6 +8317,10 @@
 	R32: []Range32{
 		{0x10428, 0x1044f, 1},
 		{0x104d8, 0x104fb, 1},
+		{0x10597, 0x105a1, 1},
+		{0x105a3, 0x105b1, 1},
+		{0x105b3, 0x105b9, 1},
+		{0x105bb, 0x105bc, 1},
 		{0x10cc0, 0x10cf2, 1},
 		{0x118c0, 0x118df, 1},
 		{0x16e60, 0x16e7f, 1},
@@ -8048,7 +8372,7 @@
 	},
 }
 
-// Range entries: 3499 16-bit, 1820 32-bit, 5319 total.
-// Range bytes: 20994 16-bit, 21840 32-bit, 42834 total.
+// Range entries: 3535 16-bit, 2031 32-bit, 5566 total.
+// Range bytes: 21210 16-bit, 24372 32-bit, 45582 total.
 
 // Fold orbit bytes: 88 pairs, 352 bytes
diff --git a/src/unicode/utf16/utf16.go b/src/unicode/utf16/utf16.go
index 38d8be6..1c6d2c6 100644
--- a/src/unicode/utf16/utf16.go
+++ b/src/unicode/utf16/utf16.go
@@ -103,23 +103,31 @@
 // 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
+	// Preallocate capacity to hold up to 64 runes.
+	// Decode inlines, so the allocation can live on the stack.
+	buf := make([]rune, 0, 64)
+	return decode(s, buf)
+}
+
+// decode appends to buf the Unicode code point sequence represented
+// by the UTF-16 encoding s and return the extended buffer.
+func decode(s []uint16, buf []rune) []rune {
 	for i := 0; i < len(s); i++ {
+		var ar rune
 		switch r := s[i]; {
 		case r < surr1, surr3 <= r:
 			// normal rune
-			a[n] = rune(r)
+			ar = rune(r)
 		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]))
+			ar = DecodeRune(rune(r), rune(s[i+1]))
 			i++
 		default:
 			// invalid surrogate sequence
-			a[n] = replacementChar
+			ar = replacementChar
 		}
-		n++
+		buf = append(buf, ar)
 	}
-	return a[:n]
+	return buf
 }
diff --git a/src/unicode/utf16/utf16_test.go b/src/unicode/utf16/utf16_test.go
index be339b1..a5a503d 100644
--- a/src/unicode/utf16/utf16_test.go
+++ b/src/unicode/utf16/utf16_test.go
@@ -5,6 +5,7 @@
 package utf16_test
 
 import (
+	"internal/testenv"
 	"reflect"
 	"testing"
 	"unicode"
@@ -103,6 +104,22 @@
 	{[]uint16{0xdfff}, []rune{0xfffd}},
 }
 
+func TestAllocationsDecode(t *testing.T) {
+	testenv.SkipIfOptimizationOff(t)
+
+	for _, tt := range decodeTests {
+		allocs := testing.AllocsPerRun(10, func() {
+			out := Decode(tt.in)
+			if out == nil {
+				t.Errorf("Decode(%x) = nil", tt.in)
+			}
+		})
+		if allocs > 0 {
+			t.Errorf("Decode allocated %v times", allocs)
+		}
+	}
+}
+
 func TestDecode(t *testing.T) {
 	for _, tt := range decodeTests {
 		out := Decode(tt.in)
diff --git a/src/vendor/golang.org/x/crypto/cryptobyte/asn1.go b/src/vendor/golang.org/x/crypto/cryptobyte/asn1.go
index 401414d..6fc2838 100644
--- a/src/vendor/golang.org/x/crypto/cryptobyte/asn1.go
+++ b/src/vendor/golang.org/x/crypto/cryptobyte/asn1.go
@@ -431,6 +431,14 @@
 		}
 		ret <<= 7
 		b := s.read(1)[0]
+
+		// ITU-T X.690, section 8.19.2:
+		// The subidentifier shall be encoded in the fewest possible octets,
+		// that is, the leading octet of the subidentifier shall not have the value 0x80.
+		if i == 0 && b == 0x80 {
+			return false
+		}
+
 		ret |= int(b & 0x7f)
 		if b&0x80 == 0 {
 			*out = ret
@@ -559,7 +567,7 @@
 	return true
 }
 
-// ReadASN1BitString decodes an ASN.1 BIT STRING into out and advances. It is
+// ReadASN1BitStringAsBytes decodes an ASN.1 BIT STRING into out and advances. It is
 // an error if the BIT STRING is not a whole number of bytes. It reports
 // whether the read was successful.
 func (s *String) ReadASN1BitStringAsBytes(out *[]byte) bool {
diff --git a/src/vendor/golang.org/x/crypto/cryptobyte/builder.go b/src/vendor/golang.org/x/crypto/cryptobyte/builder.go
index 2a90c59..c05ac7d 100644
--- a/src/vendor/golang.org/x/crypto/cryptobyte/builder.go
+++ b/src/vendor/golang.org/x/crypto/cryptobyte/builder.go
@@ -303,9 +303,9 @@
 	b.result = append(b.result, bytes...)
 }
 
-// Unwrite rolls back n bytes written directly to the Builder. An attempt by a
-// child builder passed to a continuation to unwrite bytes from its parent will
-// panic.
+// Unwrite rolls back non-negative n bytes written directly to the Builder.
+// An attempt by a child builder passed to a continuation to unwrite bytes
+// from its parent will panic.
 func (b *Builder) Unwrite(n int) {
 	if b.err != nil {
 		return
@@ -317,6 +317,9 @@
 	if length < 0 {
 		panic("cryptobyte: internal error")
 	}
+	if n < 0 {
+		panic("cryptobyte: attempted to unwrite negative number of bytes")
+	}
 	if n > length {
 		panic("cryptobyte: attempted to unwrite more than was written")
 	}
diff --git a/src/vendor/golang.org/x/net/dns/dnsmessage/message.go b/src/vendor/golang.org/x/net/dns/dnsmessage/message.go
index ffdf19d..37da3de 100644
--- a/src/vendor/golang.org/x/net/dns/dnsmessage/message.go
+++ b/src/vendor/golang.org/x/net/dns/dnsmessage/message.go
@@ -260,9 +260,11 @@
 	errReserved           = errors.New("segment prefix is reserved")
 	errTooManyPtr         = errors.New("too many pointers (>10)")
 	errInvalidPtr         = errors.New("invalid pointer")
+	errInvalidName        = errors.New("invalid dns name")
 	errNilResouceBody     = errors.New("nil resource body")
 	errResourceLen        = errors.New("insufficient data for resource body length")
 	errSegTooLong         = errors.New("segment length too long")
+	errNameTooLong        = errors.New("name too long")
 	errZeroSegLen         = errors.New("zero length segment")
 	errResTooLong         = errors.New("resource length too long")
 	errTooManyQuestions   = errors.New("too many Questions to pack (>65535)")
@@ -525,12 +527,14 @@
 // When parsing is started, the Header is parsed. Next, each Question can be
 // either parsed or skipped. Alternatively, all Questions can be skipped at
 // once. When all Questions have been parsed, attempting to parse Questions
-// will return (nil, nil) and attempting to skip Questions will return
-// (true, nil). After all Questions have been either parsed or skipped, all
+// will return the [ErrSectionDone] error.
+// After all Questions have been either parsed or skipped, all
 // Answers, Authorities and Additionals can be either parsed or skipped in the
 // same way, and each type of Resource must be fully parsed or skipped before
 // proceeding to the next type of Resource.
 //
+// Parser is safe to copy to preserve the parsing state.
+//
 // Note that there is no requirement to fully skip or parse the message.
 type Parser struct {
 	msg    []byte
@@ -1728,7 +1732,7 @@
 //
 // The provided extRCode must be an extended RCode.
 func (h *ResourceHeader) SetEDNS0(udpPayloadLen int, extRCode RCode, dnssecOK bool) error {
-	h.Name = Name{Data: [nameLen]byte{'.'}, Length: 1} // RFC 6891 section 6.1.2
+	h.Name = Name{Data: [255]byte{'.'}, Length: 1} // RFC 6891 section 6.1.2
 	h.Type = TypeOPT
 	h.Class = Class(udpPayloadLen)
 	h.TTL = uint32(extRCode) >> 4 << 24
@@ -1888,21 +1892,21 @@
 	return newOff, nil
 }
 
-const nameLen = 255
+const nonEncodedNameMax = 254
 
 // A Name is a non-encoded domain name. It is used instead of strings to avoid
 // allocations.
 type Name struct {
-	Data   [nameLen]byte // 255 bytes
+	Data   [255]byte
 	Length uint8
 }
 
 // NewName creates a new Name from a string.
 func NewName(name string) (Name, error) {
-	if len(name) > nameLen {
+	n := Name{Length: uint8(len(name))}
+	if len(name) > len(n.Data) {
 		return Name{}, errCalcLen
 	}
-	n := Name{Length: uint8(len(name))}
 	copy(n.Data[:], name)
 	return n, nil
 }
@@ -1936,6 +1940,10 @@
 func (n *Name) pack(msg []byte, compression map[string]int, compressionOff int) ([]byte, error) {
 	oldMsg := msg
 
+	if n.Length > nonEncodedNameMax {
+		return nil, errNameTooLong
+	}
+
 	// Add a trailing dot to canonicalize name.
 	if n.Length == 0 || n.Data[n.Length-1] != '.' {
 		return oldMsg, errNonCanonicalName
@@ -2029,6 +2037,15 @@
 			if endOff > len(msg) {
 				return off, errCalcLen
 			}
+
+			// Reject names containing dots.
+			// See issue golang/go#56246
+			for _, v := range msg[currOff:endOff] {
+				if v == '.' {
+					return off, errInvalidName
+				}
+			}
+
 			name = append(name, msg[currOff:endOff]...)
 			name = append(name, '.')
 			currOff = endOff
@@ -2057,8 +2074,8 @@
 	if len(name) == 0 {
 		name = append(name, '.')
 	}
-	if len(name) > len(n.Data) {
-		return off, errCalcLen
+	if len(name) > nonEncodedNameMax {
+		return off, errNameTooLong
 	}
 	n.Length = uint8(len(name))
 	if ptr == 0 {
diff --git a/src/vendor/golang.org/x/net/http2/hpack/hpack.go b/src/vendor/golang.org/x/net/http2/hpack/hpack.go
index fe52df9..7a1d976 100644
--- a/src/vendor/golang.org/x/net/http2/hpack/hpack.go
+++ b/src/vendor/golang.org/x/net/http2/hpack/hpack.go
@@ -211,7 +211,7 @@
 	return dt.ents[dt.len()-(int(i)-staticTable.len())], true
 }
 
-// Decode decodes an entire block.
+// DecodeFull decodes an entire block.
 //
 // TODO: remove this method and make it incremental later? This is
 // easier for debugging now.
diff --git a/src/vendor/golang.org/x/net/idna/idna9.0.0.go b/src/vendor/golang.org/x/net/idna/idna9.0.0.go
index aae6aac..ee1698c 100644
--- a/src/vendor/golang.org/x/net/idna/idna9.0.0.go
+++ b/src/vendor/golang.org/x/net/idna/idna9.0.0.go
@@ -121,7 +121,7 @@
 	}
 }
 
-// StrictDomainName limits the set of permissable ASCII characters to those
+// StrictDomainName limits the set of permissible ASCII characters to those
 // allowed in domain names as defined in RFC 1034 (A-Z, a-z, 0-9 and the
 // hyphen). This is set by default for MapForLookup and ValidateForRegistration,
 // but is only useful if ValidateLabels is set.
diff --git a/src/vendor/golang.org/x/net/idna/tables13.0.0.go b/src/vendor/golang.org/x/net/idna/tables13.0.0.go
index 390c5e5..66701ea 100644
--- a/src/vendor/golang.org/x/net/idna/tables13.0.0.go
+++ b/src/vendor/golang.org/x/net/idna/tables13.0.0.go
@@ -1,151 +1,294 @@
 // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
 
-//go:build go1.16
-// +build go1.16
+//go:build go1.16 && !go1.21
+// +build go1.16,!go1.21
 
 package idna
 
 // UnicodeVersion is the Unicode version from which the tables in this package are derived.
 const UnicodeVersion = "13.0.0"
 
-var mappings string = "" + // Size: 8188 bytes
-	"\x00\x01 \x03 ̈\x01a\x03 ̄\x012\x013\x03 ́\x03 ̧\x011\x01o\x051⁄4\x051⁄2" +
-	"\x053⁄4\x03i̇\x03l·\x03ʼn\x01s\x03dž\x03ⱥ\x03ⱦ\x01h\x01j\x01r\x01w\x01y" +
-	"\x03 ̆\x03 ̇\x03 ̊\x03 ̨\x03 ̃\x03 ̋\x01l\x01x\x04̈́\x03 ι\x01;\x05 ̈́" +
-	"\x04եւ\x04اٴ\x04وٴ\x04ۇٴ\x04يٴ\x06क़\x06ख़\x06ग़\x06ज़\x06ड़\x06ढ़\x06फ़" +
-	"\x06य़\x06ড়\x06ঢ়\x06য়\x06ਲ਼\x06ਸ਼\x06ਖ਼\x06ਗ਼\x06ਜ਼\x06ਫ਼\x06ଡ଼\x06ଢ଼" +
-	"\x06ํา\x06ໍາ\x06ຫນ\x06ຫມ\x06གྷ\x06ཌྷ\x06དྷ\x06བྷ\x06ཛྷ\x06ཀྵ\x06ཱི\x06ཱུ" +
-	"\x06ྲྀ\x09ྲཱྀ\x06ླྀ\x09ླཱྀ\x06ཱྀ\x06ྒྷ\x06ྜྷ\x06ྡྷ\x06ྦྷ\x06ྫྷ\x06ྐྵ\x02" +
-	"в\x02д\x02о\x02с\x02т\x02ъ\x02ѣ\x02æ\x01b\x01d\x01e\x02ǝ\x01g\x01i\x01k" +
-	"\x01m\x01n\x02ȣ\x01p\x01t\x01u\x02ɐ\x02ɑ\x02ə\x02ɛ\x02ɜ\x02ŋ\x02ɔ\x02ɯ" +
-	"\x01v\x02β\x02γ\x02δ\x02φ\x02χ\x02ρ\x02н\x02ɒ\x01c\x02ɕ\x02ð\x01f\x02ɟ" +
-	"\x02ɡ\x02ɥ\x02ɨ\x02ɩ\x02ɪ\x02ʝ\x02ɭ\x02ʟ\x02ɱ\x02ɰ\x02ɲ\x02ɳ\x02ɴ\x02ɵ" +
-	"\x02ɸ\x02ʂ\x02ʃ\x02ƫ\x02ʉ\x02ʊ\x02ʋ\x02ʌ\x01z\x02ʐ\x02ʑ\x02ʒ\x02θ\x02ss" +
-	"\x02ά\x02έ\x02ή\x02ί\x02ό\x02ύ\x02ώ\x05ἀι\x05ἁι\x05ἂι\x05ἃι\x05ἄι\x05ἅι" +
-	"\x05ἆι\x05ἇι\x05ἠι\x05ἡι\x05ἢι\x05ἣι\x05ἤι\x05ἥι\x05ἦι\x05ἧι\x05ὠι\x05ὡι" +
-	"\x05ὢι\x05ὣι\x05ὤι\x05ὥι\x05ὦι\x05ὧι\x05ὰι\x04αι\x04άι\x05ᾶι\x02ι\x05 ̈͂" +
-	"\x05ὴι\x04ηι\x04ήι\x05ῆι\x05 ̓̀\x05 ̓́\x05 ̓͂\x02ΐ\x05 ̔̀\x05 ̔́\x05 ̔͂" +
-	"\x02ΰ\x05 ̈̀\x01`\x05ὼι\x04ωι\x04ώι\x05ῶι\x06′′\x09′′′\x06‵‵\x09‵‵‵\x02!" +
-	"!\x02??\x02?!\x02!?\x0c′′′′\x010\x014\x015\x016\x017\x018\x019\x01+\x01=" +
-	"\x01(\x01)\x02rs\x02ħ\x02no\x01q\x02sm\x02tm\x02ω\x02å\x02א\x02ב\x02ג" +
-	"\x02ד\x02π\x051⁄7\x051⁄9\x061⁄10\x051⁄3\x052⁄3\x051⁄5\x052⁄5\x053⁄5\x054" +
-	"⁄5\x051⁄6\x055⁄6\x051⁄8\x053⁄8\x055⁄8\x057⁄8\x041⁄\x02ii\x02iv\x02vi" +
-	"\x04viii\x02ix\x02xi\x050⁄3\x06∫∫\x09∫∫∫\x06∮∮\x09∮∮∮\x0210\x0211\x0212" +
-	"\x0213\x0214\x0215\x0216\x0217\x0218\x0219\x0220\x04(10)\x04(11)\x04(12)" +
-	"\x04(13)\x04(14)\x04(15)\x04(16)\x04(17)\x04(18)\x04(19)\x04(20)\x0c∫∫∫∫" +
-	"\x02==\x05⫝̸\x02ɫ\x02ɽ\x02ȿ\x02ɀ\x01.\x04 ゙\x04 ゚\x06より\x06コト\x05(ᄀ)\x05" +
-	"(ᄂ)\x05(ᄃ)\x05(ᄅ)\x05(ᄆ)\x05(ᄇ)\x05(ᄉ)\x05(ᄋ)\x05(ᄌ)\x05(ᄎ)\x05(ᄏ)\x05(ᄐ" +
-	")\x05(ᄑ)\x05(ᄒ)\x05(가)\x05(나)\x05(다)\x05(라)\x05(마)\x05(바)\x05(사)\x05(아)" +
-	"\x05(자)\x05(차)\x05(카)\x05(타)\x05(파)\x05(하)\x05(주)\x08(오전)\x08(오후)\x05(一)" +
-	"\x05(二)\x05(三)\x05(四)\x05(五)\x05(六)\x05(七)\x05(八)\x05(九)\x05(十)\x05(月)" +
-	"\x05(火)\x05(水)\x05(木)\x05(金)\x05(土)\x05(日)\x05(株)\x05(有)\x05(社)\x05(名)" +
-	"\x05(特)\x05(財)\x05(祝)\x05(労)\x05(代)\x05(呼)\x05(学)\x05(監)\x05(企)\x05(資)" +
-	"\x05(協)\x05(祭)\x05(休)\x05(自)\x05(至)\x0221\x0222\x0223\x0224\x0225\x0226" +
-	"\x0227\x0228\x0229\x0230\x0231\x0232\x0233\x0234\x0235\x06참고\x06주의\x0236" +
-	"\x0237\x0238\x0239\x0240\x0241\x0242\x0243\x0244\x0245\x0246\x0247\x0248" +
-	"\x0249\x0250\x041月\x042月\x043月\x044月\x045月\x046月\x047月\x048月\x049月\x0510" +
-	"月\x0511月\x0512月\x02hg\x02ev\x06令和\x0cアパート\x0cアルファ\x0cアンペア\x09アール\x0cイニ" +
-	"ング\x09インチ\x09ウォン\x0fエスクード\x0cエーカー\x09オンス\x09オーム\x09カイリ\x0cカラット\x0cカロリー" +
-	"\x09ガロン\x09ガンマ\x06ギガ\x09ギニー\x0cキュリー\x0cギルダー\x06キロ\x0fキログラム\x12キロメートル\x0f" +
-	"キロワット\x09グラム\x0fグラムトン\x0fクルゼイロ\x0cクローネ\x09ケース\x09コルナ\x09コーポ\x0cサイクル" +
-	"\x0fサンチーム\x0cシリング\x09センチ\x09セント\x09ダース\x06デシ\x06ドル\x06トン\x06ナノ\x09ノット" +
-	"\x09ハイツ\x0fパーセント\x09パーツ\x0cバーレル\x0fピアストル\x09ピクル\x06ピコ\x06ビル\x0fファラッド\x0c" +
-	"フィート\x0fブッシェル\x09フラン\x0fヘクタール\x06ペソ\x09ペニヒ\x09ヘルツ\x09ペンス\x09ページ\x09ベータ" +
-	"\x0cポイント\x09ボルト\x06ホン\x09ポンド\x09ホール\x09ホーン\x0cマイクロ\x09マイル\x09マッハ\x09マルク" +
-	"\x0fマンション\x0cミクロン\x06ミリ\x0fミリバール\x06メガ\x0cメガトン\x0cメートル\x09ヤード\x09ヤール\x09" +
-	"ユアン\x0cリットル\x06リラ\x09ルピー\x0cルーブル\x06レム\x0fレントゲン\x09ワット\x040点\x041点\x04" +
-	"2点\x043点\x044点\x045点\x046点\x047点\x048点\x049点\x0510点\x0511点\x0512点\x0513点" +
-	"\x0514点\x0515点\x0516点\x0517点\x0518点\x0519点\x0520点\x0521点\x0522点\x0523点" +
-	"\x0524点\x02da\x02au\x02ov\x02pc\x02dm\x02iu\x06平成\x06昭和\x06大正\x06明治\x0c株" +
-	"式会社\x02pa\x02na\x02ma\x02ka\x02kb\x02mb\x02gb\x04kcal\x02pf\x02nf\x02m" +
-	"g\x02kg\x02hz\x02ml\x02dl\x02kl\x02fm\x02nm\x02mm\x02cm\x02km\x02m2\x02m" +
-	"3\x05m∕s\x06m∕s2\x07rad∕s\x08rad∕s2\x02ps\x02ns\x02ms\x02pv\x02nv\x02mv" +
-	"\x02kv\x02pw\x02nw\x02mw\x02kw\x02bq\x02cc\x02cd\x06c∕kg\x02db\x02gy\x02" +
-	"ha\x02hp\x02in\x02kk\x02kt\x02lm\x02ln\x02lx\x02ph\x02pr\x02sr\x02sv\x02" +
-	"wb\x05v∕m\x05a∕m\x041日\x042日\x043日\x044日\x045日\x046日\x047日\x048日\x049日" +
-	"\x0510日\x0511日\x0512日\x0513日\x0514日\x0515日\x0516日\x0517日\x0518日\x0519日" +
-	"\x0520日\x0521日\x0522日\x0523日\x0524日\x0525日\x0526日\x0527日\x0528日\x0529日" +
-	"\x0530日\x0531日\x02ь\x02ɦ\x02ɬ\x02ʞ\x02ʇ\x02œ\x02ʍ\x04𤋮\x04𢡊\x04𢡄\x04𣏕" +
-	"\x04𥉉\x04𥳐\x04𧻓\x02ff\x02fi\x02fl\x02st\x04մն\x04մե\x04մի\x04վն\x04մխ" +
-	"\x04יִ\x04ײַ\x02ע\x02ה\x02כ\x02ל\x02ם\x02ר\x02ת\x04שׁ\x04שׂ\x06שּׁ\x06שּ" +
-	"ׂ\x04אַ\x04אָ\x04אּ\x04בּ\x04גּ\x04דּ\x04הּ\x04וּ\x04זּ\x04טּ\x04יּ\x04" +
-	"ךּ\x04כּ\x04לּ\x04מּ\x04נּ\x04סּ\x04ףּ\x04פּ\x04צּ\x04קּ\x04רּ\x04שּ" +
-	"\x04תּ\x04וֹ\x04בֿ\x04כֿ\x04פֿ\x04אל\x02ٱ\x02ٻ\x02پ\x02ڀ\x02ٺ\x02ٿ\x02ٹ" +
-	"\x02ڤ\x02ڦ\x02ڄ\x02ڃ\x02چ\x02ڇ\x02ڍ\x02ڌ\x02ڎ\x02ڈ\x02ژ\x02ڑ\x02ک\x02گ" +
-	"\x02ڳ\x02ڱ\x02ں\x02ڻ\x02ۀ\x02ہ\x02ھ\x02ے\x02ۓ\x02ڭ\x02ۇ\x02ۆ\x02ۈ\x02ۋ" +
-	"\x02ۅ\x02ۉ\x02ې\x02ى\x04ئا\x04ئە\x04ئو\x04ئۇ\x04ئۆ\x04ئۈ\x04ئې\x04ئى\x02" +
-	"ی\x04ئج\x04ئح\x04ئم\x04ئي\x04بج\x04بح\x04بخ\x04بم\x04بى\x04بي\x04تج\x04" +
-	"تح\x04تخ\x04تم\x04تى\x04تي\x04ثج\x04ثم\x04ثى\x04ثي\x04جح\x04جم\x04حج" +
-	"\x04حم\x04خج\x04خح\x04خم\x04سج\x04سح\x04سخ\x04سم\x04صح\x04صم\x04ضج\x04ضح" +
-	"\x04ضخ\x04ضم\x04طح\x04طم\x04ظم\x04عج\x04عم\x04غج\x04غم\x04فج\x04فح\x04فخ" +
-	"\x04فم\x04فى\x04في\x04قح\x04قم\x04قى\x04قي\x04كا\x04كج\x04كح\x04كخ\x04كل" +
-	"\x04كم\x04كى\x04كي\x04لج\x04لح\x04لخ\x04لم\x04لى\x04لي\x04مج\x04مح\x04مخ" +
-	"\x04مم\x04مى\x04مي\x04نج\x04نح\x04نخ\x04نم\x04نى\x04ني\x04هج\x04هم\x04هى" +
-	"\x04هي\x04يج\x04يح\x04يخ\x04يم\x04يى\x04يي\x04ذٰ\x04رٰ\x04ىٰ\x05 ٌّ\x05 " +
-	"ٍّ\x05 َّ\x05 ُّ\x05 ِّ\x05 ّٰ\x04ئر\x04ئز\x04ئن\x04بر\x04بز\x04بن\x04ت" +
-	"ر\x04تز\x04تن\x04ثر\x04ثز\x04ثن\x04ما\x04نر\x04نز\x04نن\x04ير\x04يز\x04" +
-	"ين\x04ئخ\x04ئه\x04به\x04ته\x04صخ\x04له\x04نه\x04هٰ\x04يه\x04ثه\x04سه" +
-	"\x04شم\x04شه\x06ـَّ\x06ـُّ\x06ـِّ\x04طى\x04طي\x04عى\x04عي\x04غى\x04غي" +
-	"\x04سى\x04سي\x04شى\x04شي\x04حى\x04حي\x04جى\x04جي\x04خى\x04خي\x04صى\x04صي" +
-	"\x04ضى\x04ضي\x04شج\x04شح\x04شخ\x04شر\x04سر\x04صر\x04ضر\x04اً\x06تجم\x06ت" +
-	"حج\x06تحم\x06تخم\x06تمج\x06تمح\x06تمخ\x06جمح\x06حمي\x06حمى\x06سحج\x06سج" +
-	"ح\x06سجى\x06سمح\x06سمج\x06سمم\x06صحح\x06صمم\x06شحم\x06شجي\x06شمخ\x06شمم" +
-	"\x06ضحى\x06ضخم\x06طمح\x06طمم\x06طمي\x06عجم\x06عمم\x06عمى\x06غمم\x06غمي" +
-	"\x06غمى\x06فخم\x06قمح\x06قمم\x06لحم\x06لحي\x06لحى\x06لجج\x06لخم\x06لمح" +
-	"\x06محج\x06محم\x06محي\x06مجح\x06مجم\x06مخج\x06مخم\x06مجخ\x06همج\x06همم" +
-	"\x06نحم\x06نحى\x06نجم\x06نجى\x06نمي\x06نمى\x06يمم\x06بخي\x06تجي\x06تجى" +
-	"\x06تخي\x06تخى\x06تمي\x06تمى\x06جمي\x06جحى\x06جمى\x06سخى\x06صحي\x06شحي" +
-	"\x06ضحي\x06لجي\x06لمي\x06يحي\x06يجي\x06يمي\x06ممي\x06قمي\x06نحي\x06عمي" +
-	"\x06كمي\x06نجح\x06مخي\x06لجم\x06كمم\x06جحي\x06حجي\x06مجي\x06فمي\x06بحي" +
-	"\x06سخي\x06نجي\x06صلے\x06قلے\x08الله\x08اكبر\x08محمد\x08صلعم\x08رسول\x08" +
-	"عليه\x08وسلم\x06صلى!صلى الله عليه وسلم\x0fجل جلاله\x08ریال\x01,\x01:" +
-	"\x01!\x01?\x01_\x01{\x01}\x01[\x01]\x01#\x01&\x01*\x01-\x01<\x01>\x01\\" +
-	"\x01$\x01%\x01@\x04ـً\x04ـَ\x04ـُ\x04ـِ\x04ـّ\x04ـْ\x02ء\x02آ\x02أ\x02ؤ" +
-	"\x02إ\x02ئ\x02ا\x02ب\x02ة\x02ت\x02ث\x02ج\x02ح\x02خ\x02د\x02ذ\x02ر\x02ز" +
-	"\x02س\x02ش\x02ص\x02ض\x02ط\x02ظ\x02ع\x02غ\x02ف\x02ق\x02ك\x02ل\x02م\x02ن" +
-	"\x02ه\x02و\x02ي\x04لآ\x04لأ\x04لإ\x04لا\x01\x22\x01'\x01/\x01^\x01|\x01~" +
-	"\x02¢\x02£\x02¬\x02¦\x02¥\x08𝅗𝅥\x08𝅘𝅥\x0c𝅘𝅥𝅮\x0c𝅘𝅥𝅯\x0c𝅘𝅥𝅰\x0c𝅘𝅥𝅱\x0c𝅘𝅥𝅲" +
-	"\x08𝆹𝅥\x08𝆺𝅥\x0c𝆹𝅥𝅮\x0c𝆺𝅥𝅮\x0c𝆹𝅥𝅯\x0c𝆺𝅥𝅯\x02ı\x02ȷ\x02α\x02ε\x02ζ\x02η" +
-	"\x02κ\x02λ\x02μ\x02ν\x02ξ\x02ο\x02σ\x02τ\x02υ\x02ψ\x03∇\x03∂\x02ϝ\x02ٮ" +
-	"\x02ڡ\x02ٯ\x020,\x021,\x022,\x023,\x024,\x025,\x026,\x027,\x028,\x029," +
-	"\x03(a)\x03(b)\x03(c)\x03(d)\x03(e)\x03(f)\x03(g)\x03(h)\x03(i)\x03(j)" +
-	"\x03(k)\x03(l)\x03(m)\x03(n)\x03(o)\x03(p)\x03(q)\x03(r)\x03(s)\x03(t)" +
-	"\x03(u)\x03(v)\x03(w)\x03(x)\x03(y)\x03(z)\x07〔s〕\x02wz\x02hv\x02sd\x03p" +
-	"pv\x02wc\x02mc\x02md\x02mr\x02dj\x06ほか\x06ココ\x03サ\x03手\x03字\x03双\x03デ" +
-	"\x03二\x03多\x03解\x03天\x03交\x03映\x03無\x03料\x03前\x03後\x03再\x03新\x03初\x03終" +
-	"\x03生\x03販\x03声\x03吹\x03演\x03投\x03捕\x03一\x03三\x03遊\x03左\x03中\x03右\x03指" +
-	"\x03走\x03打\x03禁\x03空\x03合\x03満\x03有\x03月\x03申\x03割\x03営\x03配\x09〔本〕\x09〔" +
-	"三〕\x09〔二〕\x09〔安〕\x09〔点〕\x09〔打〕\x09〔盗〕\x09〔勝〕\x09〔敗〕\x03得\x03可\x03丽\x03" +
-	"丸\x03乁\x03你\x03侮\x03侻\x03倂\x03偺\x03備\x03僧\x03像\x03㒞\x03免\x03兔\x03兤\x03" +
-	"具\x03㒹\x03內\x03冗\x03冤\x03仌\x03冬\x03况\x03凵\x03刃\x03㓟\x03刻\x03剆\x03剷\x03" +
-	"㔕\x03勇\x03勉\x03勤\x03勺\x03包\x03匆\x03北\x03卉\x03卑\x03博\x03即\x03卽\x03卿\x03" +
-	"灰\x03及\x03叟\x03叫\x03叱\x03吆\x03咞\x03吸\x03呈\x03周\x03咢\x03哶\x03唐\x03啓\x03" +
-	"啣\x03善\x03喙\x03喫\x03喳\x03嗂\x03圖\x03嘆\x03圗\x03噑\x03噴\x03切\x03壮\x03城\x03" +
-	"埴\x03堍\x03型\x03堲\x03報\x03墬\x03売\x03壷\x03夆\x03夢\x03奢\x03姬\x03娛\x03娧\x03" +
-	"姘\x03婦\x03㛮\x03嬈\x03嬾\x03寃\x03寘\x03寧\x03寳\x03寿\x03将\x03尢\x03㞁\x03屠\x03" +
-	"屮\x03峀\x03岍\x03嵃\x03嵮\x03嵫\x03嵼\x03巡\x03巢\x03㠯\x03巽\x03帨\x03帽\x03幩\x03" +
-	"㡢\x03㡼\x03庰\x03庳\x03庶\x03廊\x03廾\x03舁\x03弢\x03㣇\x03形\x03彫\x03㣣\x03徚\x03" +
-	"忍\x03志\x03忹\x03悁\x03㤺\x03㤜\x03悔\x03惇\x03慈\x03慌\x03慎\x03慺\x03憎\x03憲\x03" +
-	"憤\x03憯\x03懞\x03懲\x03懶\x03成\x03戛\x03扝\x03抱\x03拔\x03捐\x03挽\x03拼\x03捨\x03" +
-	"掃\x03揤\x03搢\x03揅\x03掩\x03㨮\x03摩\x03摾\x03撝\x03摷\x03㩬\x03敏\x03敬\x03旣\x03" +
-	"書\x03晉\x03㬙\x03暑\x03㬈\x03㫤\x03冒\x03冕\x03最\x03暜\x03肭\x03䏙\x03朗\x03望\x03" +
-	"朡\x03杞\x03杓\x03㭉\x03柺\x03枅\x03桒\x03梅\x03梎\x03栟\x03椔\x03㮝\x03楂\x03榣\x03" +
-	"槪\x03檨\x03櫛\x03㰘\x03次\x03歔\x03㱎\x03歲\x03殟\x03殺\x03殻\x03汎\x03沿\x03泍\x03" +
-	"汧\x03洖\x03派\x03海\x03流\x03浩\x03浸\x03涅\x03洴\x03港\x03湮\x03㴳\x03滋\x03滇\x03" +
-	"淹\x03潮\x03濆\x03瀹\x03瀞\x03瀛\x03㶖\x03灊\x03災\x03灷\x03炭\x03煅\x03熜\x03爨\x03" +
-	"爵\x03牐\x03犀\x03犕\x03獺\x03王\x03㺬\x03玥\x03㺸\x03瑇\x03瑜\x03瑱\x03璅\x03瓊\x03" +
-	"㼛\x03甤\x03甾\x03異\x03瘐\x03㿼\x03䀈\x03直\x03眞\x03真\x03睊\x03䀹\x03瞋\x03䁆\x03" +
-	"䂖\x03硎\x03碌\x03磌\x03䃣\x03祖\x03福\x03秫\x03䄯\x03穀\x03穊\x03穏\x03䈂\x03篆\x03" +
-	"築\x03䈧\x03糒\x03䊠\x03糨\x03糣\x03紀\x03絣\x03䌁\x03緇\x03縂\x03繅\x03䌴\x03䍙\x03" +
-	"罺\x03羕\x03翺\x03者\x03聠\x03聰\x03䏕\x03育\x03脃\x03䐋\x03脾\x03媵\x03舄\x03辞\x03" +
-	"䑫\x03芑\x03芋\x03芝\x03劳\x03花\x03芳\x03芽\x03苦\x03若\x03茝\x03荣\x03莭\x03茣\x03" +
-	"莽\x03菧\x03著\x03荓\x03菊\x03菌\x03菜\x03䔫\x03蓱\x03蓳\x03蔖\x03蕤\x03䕝\x03䕡\x03" +
-	"䕫\x03虐\x03虜\x03虧\x03虩\x03蚩\x03蚈\x03蜎\x03蛢\x03蝹\x03蜨\x03蝫\x03螆\x03蟡\x03" +
-	"蠁\x03䗹\x03衠\x03衣\x03裗\x03裞\x03䘵\x03裺\x03㒻\x03䚾\x03䛇\x03誠\x03諭\x03變\x03" +
-	"豕\x03貫\x03賁\x03贛\x03起\x03跋\x03趼\x03跰\x03軔\x03輸\x03邔\x03郱\x03鄑\x03鄛\x03" +
-	"鈸\x03鋗\x03鋘\x03鉼\x03鏹\x03鐕\x03開\x03䦕\x03閷\x03䧦\x03雃\x03嶲\x03霣\x03䩮\x03" +
-	"䩶\x03韠\x03䪲\x03頋\x03頩\x03飢\x03䬳\x03餩\x03馧\x03駂\x03駾\x03䯎\x03鬒\x03鱀\x03" +
-	"鳽\x03䳎\x03䳭\x03鵧\x03䳸\x03麻\x03䵖\x03黹\x03黾\x03鼅\x03鼏\x03鼖\x03鼻"
+var mappings string = "" + // Size: 6539 bytes
+	"  ̈a ̄23 ́ ̧1o1⁄41⁄23⁄4i̇l·ʼnsdžⱥⱦhjrwy ̆ ̇ ̊ ̨ ̃ ̋lẍ́ ι; ̈́եւاٴوٴۇٴيٴक" +
+	"़ख़ग़ज़ड़ढ़फ़य़ড়ঢ়য়ਲ਼ਸ਼ਖ਼ਗ਼ਜ਼ਫ਼ଡ଼ଢ଼ําໍາຫນຫມགྷཌྷདྷབྷཛྷཀྵཱཱིུྲྀྲཱྀླྀླཱ" +
+	"ཱྀྀྒྷྜྷྡྷྦྷྫྷྐྵвдостъѣæbdeǝgikmnȣptuɐɑəɛɜŋɔɯvβγδφχρнɒcɕðfɟɡɥɨɩɪʝɭʟɱɰɲɳ" +
+	"ɴɵɸʂʃƫʉʊʋʌzʐʑʒθssάέήίόύώἀιἁιἂιἃιἄιἅιἆιἇιἠιἡιἢιἣιἤιἥιἦιἧιὠιὡιὢιὣιὤιὥιὦιὧ" +
+	"ιὰιαιάιᾶιι ̈͂ὴιηιήιῆι ̓̀ ̓́ ̓͂ΐ ̔̀ ̔́ ̔͂ΰ ̈̀`ὼιωιώιῶι′′′′′‵‵‵‵‵!!???!!?" +
+	"′′′′0456789+=()rsħnoqsmtmωåאבגדπ1⁄71⁄91⁄101⁄32⁄31⁄52⁄53⁄54⁄51⁄65⁄61⁄83" +
+	"⁄85⁄87⁄81⁄iiivviviiiixxi0⁄3∫∫∫∫∫∮∮∮∮∮1011121314151617181920(10)(11)(12" +
+	")(13)(14)(15)(16)(17)(18)(19)(20)∫∫∫∫==⫝̸ɫɽȿɀ. ゙ ゚よりコト(ᄀ)(ᄂ)(ᄃ)(ᄅ)(ᄆ)(ᄇ)" +
+	"(ᄉ)(ᄋ)(ᄌ)(ᄎ)(ᄏ)(ᄐ)(ᄑ)(ᄒ)(가)(나)(다)(라)(마)(바)(사)(아)(자)(차)(카)(타)(파)(하)(주)(오전" +
+	")(오후)(一)(二)(三)(四)(五)(六)(七)(八)(九)(十)(月)(火)(水)(木)(金)(土)(日)(株)(有)(社)(名)(特)(" +
+	"財)(祝)(労)(代)(呼)(学)(監)(企)(資)(協)(祭)(休)(自)(至)21222324252627282930313233343" +
+	"5참고주의3637383940414243444546474849501月2月3月4月5月6月7月8月9月10月11月12月hgev令和アパート" +
+	"アルファアンペアアールイニングインチウォンエスクードエーカーオンスオームカイリカラットカロリーガロンガンマギガギニーキュリーギルダーキロキロ" +
+	"グラムキロメートルキロワットグラムグラムトンクルゼイロクローネケースコルナコーポサイクルサンチームシリングセンチセントダースデシドルトンナノ" +
+	"ノットハイツパーセントパーツバーレルピアストルピクルピコビルファラッドフィートブッシェルフランヘクタールペソペニヒヘルツペンスページベータポ" +
+	"イントボルトホンポンドホールホーンマイクロマイルマッハマルクマンションミクロンミリミリバールメガメガトンメートルヤードヤールユアンリットルリ" +
+	"ラルピールーブルレムレントゲンワット0点1点2点3点4点5点6点7点8点9点10点11点12点13点14点15点16点17点18点19点20" +
+	"点21点22点23点24点daauovpcdmiu平成昭和大正明治株式会社panamakakbmbgbkcalpfnfmgkghzmldlk" +
+	"lfmnmmmcmkmm2m3m∕sm∕s2rad∕srad∕s2psnsmspvnvmvkvpwnwmwkwbqcccdc∕kgdbgyhah" +
+	"pinkkktlmlnlxphprsrsvwbv∕ma∕m1日2日3日4日5日6日7日8日9日10日11日12日13日14日15日16日17日1" +
+	"8日19日20日21日22日23日24日25日26日27日28日29日30日31日ьɦɬʞʇœʍ𤋮𢡊𢡄𣏕𥉉𥳐𧻓fffiflstմնմեմիվնմ" +
+	"խיִײַעהכלםרתשׁשׂשּׁשּׂאַאָאּבּגּדּהּוּזּטּיּךּכּלּמּנּסּףּפּצּקּרּשּתּו" +
+	"ֹבֿכֿפֿאלٱٻپڀٺٿٹڤڦڄڃچڇڍڌڎڈژڑکگڳڱںڻۀہھےۓڭۇۆۈۋۅۉېىئائەئوئۇئۆئۈئېئىیئجئحئم" +
+	"ئيبجبحبخبمبىبيتجتحتختمتىتيثجثمثىثيجحجمحجحمخجخحخمسجسحسخسمصحصمضجضحضخضمطحط" +
+	"مظمعجعمغجغمفجفحفخفمفىفيقحقمقىقيكاكجكحكخكلكمكىكيلجلحلخلملىليمجمحمخمممىمي" +
+	"نجنحنخنمنىنيهجهمهىهييجيحيخيميىييذٰرٰىٰ ٌّ ٍّ َّ ُّ ِّ ّٰئرئزئنبربزبنترت" +
+	"زتنثرثزثنمانرنزننيريزينئخئهبهتهصخلهنههٰيهثهسهشمشهـَّـُّـِّطىطيعىعيغىغيس" +
+	"ىسيشىشيحىحيجىجيخىخيصىصيضىضيشجشحشخشرسرصرضراًتجمتحجتحمتخمتمجتمحتمخجمححميح" +
+	"مىسحجسجحسجىسمحسمجسممصححصممشحمشجيشمخشممضحىضخمطمحطممطميعجمعممعمىغممغميغمى" +
+	"فخمقمحقمملحملحيلحىلججلخملمحمحجمحممحيمجحمجممخجمخممجخهمجهممنحمنحىنجمنجىنم" +
+	"ينمىيممبخيتجيتجىتخيتخىتميتمىجميجحىجمىسخىصحيشحيضحيلجيلمييحييجييميمميقمين" +
+	"حيعميكمينجحمخيلجمكممجحيحجيمجيفميبحيسخينجيصلےقلےاللهاكبرمحمدصلعمرسولعليه" +
+	"وسلمصلىصلى الله عليه وسلمجل جلالهریال,:!?_{}[]#&*-<>\\$%@ـًـَـُـِـّـْءآ" +
+	"أؤإئابةتثجحخدذرزسشصضطظعغفقكلمنهويلآلألإلا\x22'/^|~¢£¬¦¥𝅗𝅥𝅘𝅥𝅘𝅥𝅮𝅘𝅥𝅯𝅘𝅥𝅰𝅘𝅥𝅱" +
+	"𝅘𝅥𝅲𝆹𝅥𝆺𝅥𝆹𝅥𝅮𝆺𝅥𝅮𝆹𝅥𝅯𝆺𝅥𝅯ıȷαεζηκλμνξοστυψ∇∂ϝٮڡٯ0,1,2,3,4,5,6,7,8,9,(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)〔s" +
+	"〕wzhvsdppvwcmcmdmrdjほかココサ手字双デ二多解天交映無料前後再新初終生販声吹演投捕一三遊左中右指走打禁空合満有月申割営配〔" +
+	"本〕〔三〕〔二〕〔安〕〔点〕〔打〕〔盗〕〔勝〕〔敗〕得可丽丸乁你侮侻倂偺備僧像㒞免兔兤具㒹內冗冤仌冬况凵刃㓟刻剆剷㔕勇勉勤勺包匆北卉卑博即卽" +
+	"卿灰及叟叫叱吆咞吸呈周咢哶唐啓啣善喙喫喳嗂圖嘆圗噑噴切壮城埴堍型堲報墬売壷夆夢奢姬娛娧姘婦㛮嬈嬾寃寘寧寳寿将尢㞁屠屮峀岍嵃嵮嵫嵼巡巢㠯巽帨帽" +
+	"幩㡢㡼庰庳庶廊廾舁弢㣇形彫㣣徚忍志忹悁㤺㤜悔惇慈慌慎慺憎憲憤憯懞懲懶成戛扝抱拔捐挽拼捨掃揤搢揅掩㨮摩摾撝摷㩬敏敬旣書晉㬙暑㬈㫤冒冕最暜肭䏙朗" +
+	"望朡杞杓㭉柺枅桒梅梎栟椔㮝楂榣槪檨櫛㰘次歔㱎歲殟殺殻汎沿泍汧洖派海流浩浸涅洴港湮㴳滋滇淹潮濆瀹瀞瀛㶖灊災灷炭煅熜爨爵牐犀犕獺王㺬玥㺸瑇瑜瑱璅" +
+	"瓊㼛甤甾異瘐㿼䀈直眞真睊䀹瞋䁆䂖硎碌磌䃣祖福秫䄯穀穊穏䈂篆築䈧糒䊠糨糣紀絣䌁緇縂繅䌴䍙罺羕翺者聠聰䏕育脃䐋脾媵舄辞䑫芑芋芝劳花芳芽苦若茝荣莭" +
+	"茣莽菧著荓菊菌菜䔫蓱蓳蔖蕤䕝䕡䕫虐虜虧虩蚩蚈蜎蛢蝹蜨蝫螆蟡蠁䗹衠衣裗裞䘵裺㒻䚾䛇誠諭變豕貫賁贛起跋趼跰軔輸邔郱鄑鄛鈸鋗鋘鉼鏹鐕開䦕閷䧦雃嶲霣" +
+	"䩮䩶韠䪲頋頩飢䬳餩馧駂駾䯎鬒鱀鳽䳎䳭鵧䳸麻䵖黹黾鼅鼏鼖鼻"
+
+var mappingIndex = []uint16{ // 1650 elements
+	// Entry 0 - 3F
+	0x0000, 0x0000, 0x0001, 0x0004, 0x0005, 0x0008, 0x0009, 0x000a,
+	0x000d, 0x0010, 0x0011, 0x0012, 0x0017, 0x001c, 0x0021, 0x0024,
+	0x0027, 0x002a, 0x002b, 0x002e, 0x0031, 0x0034, 0x0035, 0x0036,
+	0x0037, 0x0038, 0x0039, 0x003c, 0x003f, 0x0042, 0x0045, 0x0048,
+	0x004b, 0x004c, 0x004d, 0x0051, 0x0054, 0x0055, 0x005a, 0x005e,
+	0x0062, 0x0066, 0x006a, 0x006e, 0x0074, 0x007a, 0x0080, 0x0086,
+	0x008c, 0x0092, 0x0098, 0x009e, 0x00a4, 0x00aa, 0x00b0, 0x00b6,
+	0x00bc, 0x00c2, 0x00c8, 0x00ce, 0x00d4, 0x00da, 0x00e0, 0x00e6,
+	// Entry 40 - 7F
+	0x00ec, 0x00f2, 0x00f8, 0x00fe, 0x0104, 0x010a, 0x0110, 0x0116,
+	0x011c, 0x0122, 0x0128, 0x012e, 0x0137, 0x013d, 0x0146, 0x014c,
+	0x0152, 0x0158, 0x015e, 0x0164, 0x016a, 0x0170, 0x0172, 0x0174,
+	0x0176, 0x0178, 0x017a, 0x017c, 0x017e, 0x0180, 0x0181, 0x0182,
+	0x0183, 0x0185, 0x0186, 0x0187, 0x0188, 0x0189, 0x018a, 0x018c,
+	0x018d, 0x018e, 0x018f, 0x0191, 0x0193, 0x0195, 0x0197, 0x0199,
+	0x019b, 0x019d, 0x019f, 0x01a0, 0x01a2, 0x01a4, 0x01a6, 0x01a8,
+	0x01aa, 0x01ac, 0x01ae, 0x01b0, 0x01b1, 0x01b3, 0x01b5, 0x01b6,
+	// Entry 80 - BF
+	0x01b8, 0x01ba, 0x01bc, 0x01be, 0x01c0, 0x01c2, 0x01c4, 0x01c6,
+	0x01c8, 0x01ca, 0x01cc, 0x01ce, 0x01d0, 0x01d2, 0x01d4, 0x01d6,
+	0x01d8, 0x01da, 0x01dc, 0x01de, 0x01e0, 0x01e2, 0x01e4, 0x01e5,
+	0x01e7, 0x01e9, 0x01eb, 0x01ed, 0x01ef, 0x01f1, 0x01f3, 0x01f5,
+	0x01f7, 0x01f9, 0x01fb, 0x01fd, 0x0202, 0x0207, 0x020c, 0x0211,
+	0x0216, 0x021b, 0x0220, 0x0225, 0x022a, 0x022f, 0x0234, 0x0239,
+	0x023e, 0x0243, 0x0248, 0x024d, 0x0252, 0x0257, 0x025c, 0x0261,
+	0x0266, 0x026b, 0x0270, 0x0275, 0x027a, 0x027e, 0x0282, 0x0287,
+	// Entry C0 - FF
+	0x0289, 0x028e, 0x0293, 0x0297, 0x029b, 0x02a0, 0x02a5, 0x02aa,
+	0x02af, 0x02b1, 0x02b6, 0x02bb, 0x02c0, 0x02c2, 0x02c7, 0x02c8,
+	0x02cd, 0x02d1, 0x02d5, 0x02da, 0x02e0, 0x02e9, 0x02ef, 0x02f8,
+	0x02fa, 0x02fc, 0x02fe, 0x0300, 0x030c, 0x030d, 0x030e, 0x030f,
+	0x0310, 0x0311, 0x0312, 0x0313, 0x0314, 0x0315, 0x0316, 0x0317,
+	0x0319, 0x031b, 0x031d, 0x031e, 0x0320, 0x0322, 0x0324, 0x0326,
+	0x0328, 0x032a, 0x032c, 0x032e, 0x0330, 0x0335, 0x033a, 0x0340,
+	0x0345, 0x034a, 0x034f, 0x0354, 0x0359, 0x035e, 0x0363, 0x0368,
+	// Entry 100 - 13F
+	0x036d, 0x0372, 0x0377, 0x037c, 0x0380, 0x0382, 0x0384, 0x0386,
+	0x038a, 0x038c, 0x038e, 0x0393, 0x0399, 0x03a2, 0x03a8, 0x03b1,
+	0x03b3, 0x03b5, 0x03b7, 0x03b9, 0x03bb, 0x03bd, 0x03bf, 0x03c1,
+	0x03c3, 0x03c5, 0x03c7, 0x03cb, 0x03cf, 0x03d3, 0x03d7, 0x03db,
+	0x03df, 0x03e3, 0x03e7, 0x03eb, 0x03ef, 0x03f3, 0x03ff, 0x0401,
+	0x0406, 0x0408, 0x040a, 0x040c, 0x040e, 0x040f, 0x0413, 0x0417,
+	0x041d, 0x0423, 0x0428, 0x042d, 0x0432, 0x0437, 0x043c, 0x0441,
+	0x0446, 0x044b, 0x0450, 0x0455, 0x045a, 0x045f, 0x0464, 0x0469,
+	// Entry 140 - 17F
+	0x046e, 0x0473, 0x0478, 0x047d, 0x0482, 0x0487, 0x048c, 0x0491,
+	0x0496, 0x049b, 0x04a0, 0x04a5, 0x04aa, 0x04af, 0x04b4, 0x04bc,
+	0x04c4, 0x04c9, 0x04ce, 0x04d3, 0x04d8, 0x04dd, 0x04e2, 0x04e7,
+	0x04ec, 0x04f1, 0x04f6, 0x04fb, 0x0500, 0x0505, 0x050a, 0x050f,
+	0x0514, 0x0519, 0x051e, 0x0523, 0x0528, 0x052d, 0x0532, 0x0537,
+	0x053c, 0x0541, 0x0546, 0x054b, 0x0550, 0x0555, 0x055a, 0x055f,
+	0x0564, 0x0569, 0x056e, 0x0573, 0x0578, 0x057a, 0x057c, 0x057e,
+	0x0580, 0x0582, 0x0584, 0x0586, 0x0588, 0x058a, 0x058c, 0x058e,
+	// Entry 180 - 1BF
+	0x0590, 0x0592, 0x0594, 0x0596, 0x059c, 0x05a2, 0x05a4, 0x05a6,
+	0x05a8, 0x05aa, 0x05ac, 0x05ae, 0x05b0, 0x05b2, 0x05b4, 0x05b6,
+	0x05b8, 0x05ba, 0x05bc, 0x05be, 0x05c0, 0x05c4, 0x05c8, 0x05cc,
+	0x05d0, 0x05d4, 0x05d8, 0x05dc, 0x05e0, 0x05e4, 0x05e9, 0x05ee,
+	0x05f3, 0x05f5, 0x05f7, 0x05fd, 0x0609, 0x0615, 0x0621, 0x062a,
+	0x0636, 0x063f, 0x0648, 0x0657, 0x0663, 0x066c, 0x0675, 0x067e,
+	0x068a, 0x0696, 0x069f, 0x06a8, 0x06ae, 0x06b7, 0x06c3, 0x06cf,
+	0x06d5, 0x06e4, 0x06f6, 0x0705, 0x070e, 0x071d, 0x072c, 0x0738,
+	// Entry 1C0 - 1FF
+	0x0741, 0x074a, 0x0753, 0x075f, 0x076e, 0x077a, 0x0783, 0x078c,
+	0x0795, 0x079b, 0x07a1, 0x07a7, 0x07ad, 0x07b6, 0x07bf, 0x07ce,
+	0x07d7, 0x07e3, 0x07f2, 0x07fb, 0x0801, 0x0807, 0x0816, 0x0822,
+	0x0831, 0x083a, 0x0849, 0x084f, 0x0858, 0x0861, 0x086a, 0x0873,
+	0x087c, 0x0888, 0x0891, 0x0897, 0x08a0, 0x08a9, 0x08b2, 0x08be,
+	0x08c7, 0x08d0, 0x08d9, 0x08e8, 0x08f4, 0x08fa, 0x0909, 0x090f,
+	0x091b, 0x0927, 0x0930, 0x0939, 0x0942, 0x094e, 0x0954, 0x095d,
+	0x0969, 0x096f, 0x097e, 0x0987, 0x098b, 0x098f, 0x0993, 0x0997,
+	// Entry 200 - 23F
+	0x099b, 0x099f, 0x09a3, 0x09a7, 0x09ab, 0x09af, 0x09b4, 0x09b9,
+	0x09be, 0x09c3, 0x09c8, 0x09cd, 0x09d2, 0x09d7, 0x09dc, 0x09e1,
+	0x09e6, 0x09eb, 0x09f0, 0x09f5, 0x09fa, 0x09fc, 0x09fe, 0x0a00,
+	0x0a02, 0x0a04, 0x0a06, 0x0a0c, 0x0a12, 0x0a18, 0x0a1e, 0x0a2a,
+	0x0a2c, 0x0a2e, 0x0a30, 0x0a32, 0x0a34, 0x0a36, 0x0a38, 0x0a3c,
+	0x0a3e, 0x0a40, 0x0a42, 0x0a44, 0x0a46, 0x0a48, 0x0a4a, 0x0a4c,
+	0x0a4e, 0x0a50, 0x0a52, 0x0a54, 0x0a56, 0x0a58, 0x0a5a, 0x0a5f,
+	0x0a65, 0x0a6c, 0x0a74, 0x0a76, 0x0a78, 0x0a7a, 0x0a7c, 0x0a7e,
+	// Entry 240 - 27F
+	0x0a80, 0x0a82, 0x0a84, 0x0a86, 0x0a88, 0x0a8a, 0x0a8c, 0x0a8e,
+	0x0a90, 0x0a96, 0x0a98, 0x0a9a, 0x0a9c, 0x0a9e, 0x0aa0, 0x0aa2,
+	0x0aa4, 0x0aa6, 0x0aa8, 0x0aaa, 0x0aac, 0x0aae, 0x0ab0, 0x0ab2,
+	0x0ab4, 0x0ab9, 0x0abe, 0x0ac2, 0x0ac6, 0x0aca, 0x0ace, 0x0ad2,
+	0x0ad6, 0x0ada, 0x0ade, 0x0ae2, 0x0ae7, 0x0aec, 0x0af1, 0x0af6,
+	0x0afb, 0x0b00, 0x0b05, 0x0b0a, 0x0b0f, 0x0b14, 0x0b19, 0x0b1e,
+	0x0b23, 0x0b28, 0x0b2d, 0x0b32, 0x0b37, 0x0b3c, 0x0b41, 0x0b46,
+	0x0b4b, 0x0b50, 0x0b52, 0x0b54, 0x0b56, 0x0b58, 0x0b5a, 0x0b5c,
+	// Entry 280 - 2BF
+	0x0b5e, 0x0b62, 0x0b66, 0x0b6a, 0x0b6e, 0x0b72, 0x0b76, 0x0b7a,
+	0x0b7c, 0x0b7e, 0x0b80, 0x0b82, 0x0b86, 0x0b8a, 0x0b8e, 0x0b92,
+	0x0b96, 0x0b9a, 0x0b9e, 0x0ba0, 0x0ba2, 0x0ba4, 0x0ba6, 0x0ba8,
+	0x0baa, 0x0bac, 0x0bb0, 0x0bb4, 0x0bba, 0x0bc0, 0x0bc4, 0x0bc8,
+	0x0bcc, 0x0bd0, 0x0bd4, 0x0bd8, 0x0bdc, 0x0be0, 0x0be4, 0x0be8,
+	0x0bec, 0x0bf0, 0x0bf4, 0x0bf8, 0x0bfc, 0x0c00, 0x0c04, 0x0c08,
+	0x0c0c, 0x0c10, 0x0c14, 0x0c18, 0x0c1c, 0x0c20, 0x0c24, 0x0c28,
+	0x0c2c, 0x0c30, 0x0c34, 0x0c36, 0x0c38, 0x0c3a, 0x0c3c, 0x0c3e,
+	// Entry 2C0 - 2FF
+	0x0c40, 0x0c42, 0x0c44, 0x0c46, 0x0c48, 0x0c4a, 0x0c4c, 0x0c4e,
+	0x0c50, 0x0c52, 0x0c54, 0x0c56, 0x0c58, 0x0c5a, 0x0c5c, 0x0c5e,
+	0x0c60, 0x0c62, 0x0c64, 0x0c66, 0x0c68, 0x0c6a, 0x0c6c, 0x0c6e,
+	0x0c70, 0x0c72, 0x0c74, 0x0c76, 0x0c78, 0x0c7a, 0x0c7c, 0x0c7e,
+	0x0c80, 0x0c82, 0x0c86, 0x0c8a, 0x0c8e, 0x0c92, 0x0c96, 0x0c9a,
+	0x0c9e, 0x0ca2, 0x0ca4, 0x0ca8, 0x0cac, 0x0cb0, 0x0cb4, 0x0cb8,
+	0x0cbc, 0x0cc0, 0x0cc4, 0x0cc8, 0x0ccc, 0x0cd0, 0x0cd4, 0x0cd8,
+	0x0cdc, 0x0ce0, 0x0ce4, 0x0ce8, 0x0cec, 0x0cf0, 0x0cf4, 0x0cf8,
+	// Entry 300 - 33F
+	0x0cfc, 0x0d00, 0x0d04, 0x0d08, 0x0d0c, 0x0d10, 0x0d14, 0x0d18,
+	0x0d1c, 0x0d20, 0x0d24, 0x0d28, 0x0d2c, 0x0d30, 0x0d34, 0x0d38,
+	0x0d3c, 0x0d40, 0x0d44, 0x0d48, 0x0d4c, 0x0d50, 0x0d54, 0x0d58,
+	0x0d5c, 0x0d60, 0x0d64, 0x0d68, 0x0d6c, 0x0d70, 0x0d74, 0x0d78,
+	0x0d7c, 0x0d80, 0x0d84, 0x0d88, 0x0d8c, 0x0d90, 0x0d94, 0x0d98,
+	0x0d9c, 0x0da0, 0x0da4, 0x0da8, 0x0dac, 0x0db0, 0x0db4, 0x0db8,
+	0x0dbc, 0x0dc0, 0x0dc4, 0x0dc8, 0x0dcc, 0x0dd0, 0x0dd4, 0x0dd8,
+	0x0ddc, 0x0de0, 0x0de4, 0x0de8, 0x0dec, 0x0df0, 0x0df4, 0x0df8,
+	// Entry 340 - 37F
+	0x0dfc, 0x0e00, 0x0e04, 0x0e08, 0x0e0c, 0x0e10, 0x0e14, 0x0e18,
+	0x0e1d, 0x0e22, 0x0e27, 0x0e2c, 0x0e31, 0x0e36, 0x0e3a, 0x0e3e,
+	0x0e42, 0x0e46, 0x0e4a, 0x0e4e, 0x0e52, 0x0e56, 0x0e5a, 0x0e5e,
+	0x0e62, 0x0e66, 0x0e6a, 0x0e6e, 0x0e72, 0x0e76, 0x0e7a, 0x0e7e,
+	0x0e82, 0x0e86, 0x0e8a, 0x0e8e, 0x0e92, 0x0e96, 0x0e9a, 0x0e9e,
+	0x0ea2, 0x0ea6, 0x0eaa, 0x0eae, 0x0eb2, 0x0eb6, 0x0ebc, 0x0ec2,
+	0x0ec8, 0x0ecc, 0x0ed0, 0x0ed4, 0x0ed8, 0x0edc, 0x0ee0, 0x0ee4,
+	0x0ee8, 0x0eec, 0x0ef0, 0x0ef4, 0x0ef8, 0x0efc, 0x0f00, 0x0f04,
+	// Entry 380 - 3BF
+	0x0f08, 0x0f0c, 0x0f10, 0x0f14, 0x0f18, 0x0f1c, 0x0f20, 0x0f24,
+	0x0f28, 0x0f2c, 0x0f30, 0x0f34, 0x0f38, 0x0f3e, 0x0f44, 0x0f4a,
+	0x0f50, 0x0f56, 0x0f5c, 0x0f62, 0x0f68, 0x0f6e, 0x0f74, 0x0f7a,
+	0x0f80, 0x0f86, 0x0f8c, 0x0f92, 0x0f98, 0x0f9e, 0x0fa4, 0x0faa,
+	0x0fb0, 0x0fb6, 0x0fbc, 0x0fc2, 0x0fc8, 0x0fce, 0x0fd4, 0x0fda,
+	0x0fe0, 0x0fe6, 0x0fec, 0x0ff2, 0x0ff8, 0x0ffe, 0x1004, 0x100a,
+	0x1010, 0x1016, 0x101c, 0x1022, 0x1028, 0x102e, 0x1034, 0x103a,
+	0x1040, 0x1046, 0x104c, 0x1052, 0x1058, 0x105e, 0x1064, 0x106a,
+	// Entry 3C0 - 3FF
+	0x1070, 0x1076, 0x107c, 0x1082, 0x1088, 0x108e, 0x1094, 0x109a,
+	0x10a0, 0x10a6, 0x10ac, 0x10b2, 0x10b8, 0x10be, 0x10c4, 0x10ca,
+	0x10d0, 0x10d6, 0x10dc, 0x10e2, 0x10e8, 0x10ee, 0x10f4, 0x10fa,
+	0x1100, 0x1106, 0x110c, 0x1112, 0x1118, 0x111e, 0x1124, 0x112a,
+	0x1130, 0x1136, 0x113c, 0x1142, 0x1148, 0x114e, 0x1154, 0x115a,
+	0x1160, 0x1166, 0x116c, 0x1172, 0x1178, 0x1180, 0x1188, 0x1190,
+	0x1198, 0x11a0, 0x11a8, 0x11b0, 0x11b6, 0x11d7, 0x11e6, 0x11ee,
+	0x11ef, 0x11f0, 0x11f1, 0x11f2, 0x11f3, 0x11f4, 0x11f5, 0x11f6,
+	// Entry 400 - 43F
+	0x11f7, 0x11f8, 0x11f9, 0x11fa, 0x11fb, 0x11fc, 0x11fd, 0x11fe,
+	0x11ff, 0x1200, 0x1201, 0x1205, 0x1209, 0x120d, 0x1211, 0x1215,
+	0x1219, 0x121b, 0x121d, 0x121f, 0x1221, 0x1223, 0x1225, 0x1227,
+	0x1229, 0x122b, 0x122d, 0x122f, 0x1231, 0x1233, 0x1235, 0x1237,
+	0x1239, 0x123b, 0x123d, 0x123f, 0x1241, 0x1243, 0x1245, 0x1247,
+	0x1249, 0x124b, 0x124d, 0x124f, 0x1251, 0x1253, 0x1255, 0x1257,
+	0x1259, 0x125b, 0x125d, 0x125f, 0x1263, 0x1267, 0x126b, 0x126f,
+	0x1270, 0x1271, 0x1272, 0x1273, 0x1274, 0x1275, 0x1277, 0x1279,
+	// Entry 440 - 47F
+	0x127b, 0x127d, 0x127f, 0x1287, 0x128f, 0x129b, 0x12a7, 0x12b3,
+	0x12bf, 0x12cb, 0x12d3, 0x12db, 0x12e7, 0x12f3, 0x12ff, 0x130b,
+	0x130d, 0x130f, 0x1311, 0x1313, 0x1315, 0x1317, 0x1319, 0x131b,
+	0x131d, 0x131f, 0x1321, 0x1323, 0x1325, 0x1327, 0x1329, 0x132b,
+	0x132e, 0x1331, 0x1333, 0x1335, 0x1337, 0x1339, 0x133b, 0x133d,
+	0x133f, 0x1341, 0x1343, 0x1345, 0x1347, 0x1349, 0x134b, 0x134d,
+	0x1350, 0x1353, 0x1356, 0x1359, 0x135c, 0x135f, 0x1362, 0x1365,
+	0x1368, 0x136b, 0x136e, 0x1371, 0x1374, 0x1377, 0x137a, 0x137d,
+	// Entry 480 - 4BF
+	0x1380, 0x1383, 0x1386, 0x1389, 0x138c, 0x138f, 0x1392, 0x1395,
+	0x1398, 0x139b, 0x13a2, 0x13a4, 0x13a6, 0x13a8, 0x13ab, 0x13ad,
+	0x13af, 0x13b1, 0x13b3, 0x13b5, 0x13bb, 0x13c1, 0x13c4, 0x13c7,
+	0x13ca, 0x13cd, 0x13d0, 0x13d3, 0x13d6, 0x13d9, 0x13dc, 0x13df,
+	0x13e2, 0x13e5, 0x13e8, 0x13eb, 0x13ee, 0x13f1, 0x13f4, 0x13f7,
+	0x13fa, 0x13fd, 0x1400, 0x1403, 0x1406, 0x1409, 0x140c, 0x140f,
+	0x1412, 0x1415, 0x1418, 0x141b, 0x141e, 0x1421, 0x1424, 0x1427,
+	0x142a, 0x142d, 0x1430, 0x1433, 0x1436, 0x1439, 0x143c, 0x143f,
+	// Entry 4C0 - 4FF
+	0x1442, 0x1445, 0x1448, 0x1451, 0x145a, 0x1463, 0x146c, 0x1475,
+	0x147e, 0x1487, 0x1490, 0x1499, 0x149c, 0x149f, 0x14a2, 0x14a5,
+	0x14a8, 0x14ab, 0x14ae, 0x14b1, 0x14b4, 0x14b7, 0x14ba, 0x14bd,
+	0x14c0, 0x14c3, 0x14c6, 0x14c9, 0x14cc, 0x14cf, 0x14d2, 0x14d5,
+	0x14d8, 0x14db, 0x14de, 0x14e1, 0x14e4, 0x14e7, 0x14ea, 0x14ed,
+	0x14f0, 0x14f3, 0x14f6, 0x14f9, 0x14fc, 0x14ff, 0x1502, 0x1505,
+	0x1508, 0x150b, 0x150e, 0x1511, 0x1514, 0x1517, 0x151a, 0x151d,
+	0x1520, 0x1523, 0x1526, 0x1529, 0x152c, 0x152f, 0x1532, 0x1535,
+	// Entry 500 - 53F
+	0x1538, 0x153b, 0x153e, 0x1541, 0x1544, 0x1547, 0x154a, 0x154d,
+	0x1550, 0x1553, 0x1556, 0x1559, 0x155c, 0x155f, 0x1562, 0x1565,
+	0x1568, 0x156b, 0x156e, 0x1571, 0x1574, 0x1577, 0x157a, 0x157d,
+	0x1580, 0x1583, 0x1586, 0x1589, 0x158c, 0x158f, 0x1592, 0x1595,
+	0x1598, 0x159b, 0x159e, 0x15a1, 0x15a4, 0x15a7, 0x15aa, 0x15ad,
+	0x15b0, 0x15b3, 0x15b6, 0x15b9, 0x15bc, 0x15bf, 0x15c2, 0x15c5,
+	0x15c8, 0x15cb, 0x15ce, 0x15d1, 0x15d4, 0x15d7, 0x15da, 0x15dd,
+	0x15e0, 0x15e3, 0x15e6, 0x15e9, 0x15ec, 0x15ef, 0x15f2, 0x15f5,
+	// Entry 540 - 57F
+	0x15f8, 0x15fb, 0x15fe, 0x1601, 0x1604, 0x1607, 0x160a, 0x160d,
+	0x1610, 0x1613, 0x1616, 0x1619, 0x161c, 0x161f, 0x1622, 0x1625,
+	0x1628, 0x162b, 0x162e, 0x1631, 0x1634, 0x1637, 0x163a, 0x163d,
+	0x1640, 0x1643, 0x1646, 0x1649, 0x164c, 0x164f, 0x1652, 0x1655,
+	0x1658, 0x165b, 0x165e, 0x1661, 0x1664, 0x1667, 0x166a, 0x166d,
+	0x1670, 0x1673, 0x1676, 0x1679, 0x167c, 0x167f, 0x1682, 0x1685,
+	0x1688, 0x168b, 0x168e, 0x1691, 0x1694, 0x1697, 0x169a, 0x169d,
+	0x16a0, 0x16a3, 0x16a6, 0x16a9, 0x16ac, 0x16af, 0x16b2, 0x16b5,
+	// Entry 580 - 5BF
+	0x16b8, 0x16bb, 0x16be, 0x16c1, 0x16c4, 0x16c7, 0x16ca, 0x16cd,
+	0x16d0, 0x16d3, 0x16d6, 0x16d9, 0x16dc, 0x16df, 0x16e2, 0x16e5,
+	0x16e8, 0x16eb, 0x16ee, 0x16f1, 0x16f4, 0x16f7, 0x16fa, 0x16fd,
+	0x1700, 0x1703, 0x1706, 0x1709, 0x170c, 0x170f, 0x1712, 0x1715,
+	0x1718, 0x171b, 0x171e, 0x1721, 0x1724, 0x1727, 0x172a, 0x172d,
+	0x1730, 0x1733, 0x1736, 0x1739, 0x173c, 0x173f, 0x1742, 0x1745,
+	0x1748, 0x174b, 0x174e, 0x1751, 0x1754, 0x1757, 0x175a, 0x175d,
+	0x1760, 0x1763, 0x1766, 0x1769, 0x176c, 0x176f, 0x1772, 0x1775,
+	// Entry 5C0 - 5FF
+	0x1778, 0x177b, 0x177e, 0x1781, 0x1784, 0x1787, 0x178a, 0x178d,
+	0x1790, 0x1793, 0x1796, 0x1799, 0x179c, 0x179f, 0x17a2, 0x17a5,
+	0x17a8, 0x17ab, 0x17ae, 0x17b1, 0x17b4, 0x17b7, 0x17ba, 0x17bd,
+	0x17c0, 0x17c3, 0x17c6, 0x17c9, 0x17cc, 0x17cf, 0x17d2, 0x17d5,
+	0x17d8, 0x17db, 0x17de, 0x17e1, 0x17e4, 0x17e7, 0x17ea, 0x17ed,
+	0x17f0, 0x17f3, 0x17f6, 0x17f9, 0x17fc, 0x17ff, 0x1802, 0x1805,
+	0x1808, 0x180b, 0x180e, 0x1811, 0x1814, 0x1817, 0x181a, 0x181d,
+	0x1820, 0x1823, 0x1826, 0x1829, 0x182c, 0x182f, 0x1832, 0x1835,
+	// Entry 600 - 63F
+	0x1838, 0x183b, 0x183e, 0x1841, 0x1844, 0x1847, 0x184a, 0x184d,
+	0x1850, 0x1853, 0x1856, 0x1859, 0x185c, 0x185f, 0x1862, 0x1865,
+	0x1868, 0x186b, 0x186e, 0x1871, 0x1874, 0x1877, 0x187a, 0x187d,
+	0x1880, 0x1883, 0x1886, 0x1889, 0x188c, 0x188f, 0x1892, 0x1895,
+	0x1898, 0x189b, 0x189e, 0x18a1, 0x18a4, 0x18a7, 0x18aa, 0x18ad,
+	0x18b0, 0x18b3, 0x18b6, 0x18b9, 0x18bc, 0x18bf, 0x18c2, 0x18c5,
+	0x18c8, 0x18cb, 0x18ce, 0x18d1, 0x18d4, 0x18d7, 0x18da, 0x18dd,
+	0x18e0, 0x18e3, 0x18e6, 0x18e9, 0x18ec, 0x18ef, 0x18f2, 0x18f5,
+	// Entry 640 - 67F
+	0x18f8, 0x18fb, 0x18fe, 0x1901, 0x1904, 0x1907, 0x190a, 0x190d,
+	0x1910, 0x1913, 0x1916, 0x1919, 0x191c, 0x191f, 0x1922, 0x1925,
+	0x1928, 0x192b, 0x192e, 0x1931, 0x1934, 0x1937, 0x193a, 0x193d,
+	0x1940, 0x1943, 0x1946, 0x1949, 0x194c, 0x194f, 0x1952, 0x1955,
+	0x1958, 0x195b, 0x195e, 0x1961, 0x1964, 0x1967, 0x196a, 0x196d,
+	0x1970, 0x1973, 0x1976, 0x1979, 0x197c, 0x197f, 0x1982, 0x1985,
+	0x1988, 0x198b,
+} // Size: 3324 bytes
 
 var xorData string = "" + // Size: 4862 bytes
 	"\x02\x0c\x09\x02\xb0\xec\x02\xad\xd8\x02\xad\xd9\x02\x06\x07\x02\x0f\x12" +
@@ -547,7 +690,7 @@
 	return 0
 }
 
-// idnaTrie. Total size: 30288 bytes (29.58 KiB). Checksum: c0cd84404a2f6f19.
+// idnaTrie. Total size: 30196 bytes (29.49 KiB). Checksum: e2ae95a945f04016.
 type idnaTrie struct{}
 
 func newIdnaTrie(i int) *idnaTrie {
@@ -600,11 +743,11 @@
 	0xd2: 0x0040, 0xd3: 0x0040, 0xd4: 0x0040, 0xd5: 0x0040, 0xd6: 0x0040, 0xd7: 0x0040,
 	0xd8: 0x0040, 0xd9: 0x0040, 0xda: 0x0040, 0xdb: 0x0040, 0xdc: 0x0040, 0xdd: 0x0040,
 	0xde: 0x0040, 0xdf: 0x0040, 0xe0: 0x000a, 0xe1: 0x0018, 0xe2: 0x0018, 0xe3: 0x0018,
-	0xe4: 0x0018, 0xe5: 0x0018, 0xe6: 0x0018, 0xe7: 0x0018, 0xe8: 0x001a, 0xe9: 0x0018,
-	0xea: 0x0039, 0xeb: 0x0018, 0xec: 0x0018, 0xed: 0x03c0, 0xee: 0x0018, 0xef: 0x004a,
-	0xf0: 0x0018, 0xf1: 0x0018, 0xf2: 0x0069, 0xf3: 0x0079, 0xf4: 0x008a, 0xf5: 0x0005,
-	0xf6: 0x0018, 0xf7: 0x0008, 0xf8: 0x00aa, 0xf9: 0x00c9, 0xfa: 0x00d9, 0xfb: 0x0018,
-	0xfc: 0x00e9, 0xfd: 0x0119, 0xfe: 0x0149, 0xff: 0x0018,
+	0xe4: 0x0018, 0xe5: 0x0018, 0xe6: 0x0018, 0xe7: 0x0018, 0xe8: 0x0012, 0xe9: 0x0018,
+	0xea: 0x0019, 0xeb: 0x0018, 0xec: 0x0018, 0xed: 0x03c0, 0xee: 0x0018, 0xef: 0x0022,
+	0xf0: 0x0018, 0xf1: 0x0018, 0xf2: 0x0029, 0xf3: 0x0031, 0xf4: 0x003a, 0xf5: 0x0005,
+	0xf6: 0x0018, 0xf7: 0x0008, 0xf8: 0x0042, 0xf9: 0x0049, 0xfa: 0x0051, 0xfb: 0x0018,
+	0xfc: 0x0059, 0xfd: 0x0061, 0xfe: 0x0069, 0xff: 0x0018,
 	// Block 0x4, offset 0x100
 	0x100: 0xe00d, 0x101: 0x0008, 0x102: 0xe00d, 0x103: 0x0008, 0x104: 0xe00d, 0x105: 0x0008,
 	0x106: 0xe00d, 0x107: 0x0008, 0x108: 0xe00d, 0x109: 0x0008, 0x10a: 0xe00d, 0x10b: 0x0008,
@@ -614,12 +757,12 @@
 	0x11e: 0xe00d, 0x11f: 0x0008, 0x120: 0xe00d, 0x121: 0x0008, 0x122: 0xe00d, 0x123: 0x0008,
 	0x124: 0xe00d, 0x125: 0x0008, 0x126: 0xe00d, 0x127: 0x0008, 0x128: 0xe00d, 0x129: 0x0008,
 	0x12a: 0xe00d, 0x12b: 0x0008, 0x12c: 0xe00d, 0x12d: 0x0008, 0x12e: 0xe00d, 0x12f: 0x0008,
-	0x130: 0x0179, 0x131: 0x0008, 0x132: 0x0035, 0x133: 0x004d, 0x134: 0xe00d, 0x135: 0x0008,
+	0x130: 0x0071, 0x131: 0x0008, 0x132: 0x0035, 0x133: 0x004d, 0x134: 0xe00d, 0x135: 0x0008,
 	0x136: 0xe00d, 0x137: 0x0008, 0x138: 0x0008, 0x139: 0xe01d, 0x13a: 0x0008, 0x13b: 0xe03d,
-	0x13c: 0x0008, 0x13d: 0xe01d, 0x13e: 0x0008, 0x13f: 0x0199,
+	0x13c: 0x0008, 0x13d: 0xe01d, 0x13e: 0x0008, 0x13f: 0x0079,
 	// Block 0x5, offset 0x140
-	0x140: 0x0199, 0x141: 0xe01d, 0x142: 0x0008, 0x143: 0xe03d, 0x144: 0x0008, 0x145: 0xe01d,
-	0x146: 0x0008, 0x147: 0xe07d, 0x148: 0x0008, 0x149: 0x01b9, 0x14a: 0xe00d, 0x14b: 0x0008,
+	0x140: 0x0079, 0x141: 0xe01d, 0x142: 0x0008, 0x143: 0xe03d, 0x144: 0x0008, 0x145: 0xe01d,
+	0x146: 0x0008, 0x147: 0xe07d, 0x148: 0x0008, 0x149: 0x0081, 0x14a: 0xe00d, 0x14b: 0x0008,
 	0x14c: 0xe00d, 0x14d: 0x0008, 0x14e: 0xe00d, 0x14f: 0x0008, 0x150: 0xe00d, 0x151: 0x0008,
 	0x152: 0xe00d, 0x153: 0x0008, 0x154: 0xe00d, 0x155: 0x0008, 0x156: 0xe00d, 0x157: 0x0008,
 	0x158: 0xe00d, 0x159: 0x0008, 0x15a: 0xe00d, 0x15b: 0x0008, 0x15c: 0xe00d, 0x15d: 0x0008,
@@ -628,7 +771,7 @@
 	0x16a: 0xe00d, 0x16b: 0x0008, 0x16c: 0xe00d, 0x16d: 0x0008, 0x16e: 0xe00d, 0x16f: 0x0008,
 	0x170: 0xe00d, 0x171: 0x0008, 0x172: 0xe00d, 0x173: 0x0008, 0x174: 0xe00d, 0x175: 0x0008,
 	0x176: 0xe00d, 0x177: 0x0008, 0x178: 0x0065, 0x179: 0xe01d, 0x17a: 0x0008, 0x17b: 0xe03d,
-	0x17c: 0x0008, 0x17d: 0xe01d, 0x17e: 0x0008, 0x17f: 0x01d9,
+	0x17c: 0x0008, 0x17d: 0xe01d, 0x17e: 0x0008, 0x17f: 0x0089,
 	// Block 0x6, offset 0x180
 	0x180: 0x0008, 0x181: 0x007d, 0x182: 0xe00d, 0x183: 0x0008, 0x184: 0xe00d, 0x185: 0x0008,
 	0x186: 0x007d, 0x187: 0xe07d, 0x188: 0x0008, 0x189: 0x0095, 0x18a: 0x00ad, 0x18b: 0xe03d,
@@ -642,8 +785,8 @@
 	0x1b6: 0x0008, 0x1b7: 0x01e5, 0x1b8: 0xe00d, 0x1b9: 0x0008, 0x1ba: 0x0008, 0x1bb: 0x0008,
 	0x1bc: 0xe00d, 0x1bd: 0x0008, 0x1be: 0x0008, 0x1bf: 0x0008,
 	// Block 0x7, offset 0x1c0
-	0x1c0: 0x0008, 0x1c1: 0x0008, 0x1c2: 0x0008, 0x1c3: 0x0008, 0x1c4: 0x01e9, 0x1c5: 0x01e9,
-	0x1c6: 0x01e9, 0x1c7: 0x01fd, 0x1c8: 0x0215, 0x1c9: 0x022d, 0x1ca: 0x0245, 0x1cb: 0x025d,
+	0x1c0: 0x0008, 0x1c1: 0x0008, 0x1c2: 0x0008, 0x1c3: 0x0008, 0x1c4: 0x0091, 0x1c5: 0x0091,
+	0x1c6: 0x0091, 0x1c7: 0x01fd, 0x1c8: 0x0215, 0x1c9: 0x022d, 0x1ca: 0x0245, 0x1cb: 0x025d,
 	0x1cc: 0x0275, 0x1cd: 0xe01d, 0x1ce: 0x0008, 0x1cf: 0xe0fd, 0x1d0: 0x0008, 0x1d1: 0xe01d,
 	0x1d2: 0x0008, 0x1d3: 0xe03d, 0x1d4: 0x0008, 0x1d5: 0xe01d, 0x1d6: 0x0008, 0x1d7: 0xe07d,
 	0x1d8: 0x0008, 0x1d9: 0xe01d, 0x1da: 0x0008, 0x1db: 0xe03d, 0x1dc: 0x0008, 0x1dd: 0x0008,
@@ -663,22 +806,22 @@
 	0x224: 0xe00d, 0x225: 0x0008, 0x226: 0xe00d, 0x227: 0x0008, 0x228: 0xe00d, 0x229: 0x0008,
 	0x22a: 0xe00d, 0x22b: 0x0008, 0x22c: 0xe00d, 0x22d: 0x0008, 0x22e: 0xe00d, 0x22f: 0x0008,
 	0x230: 0xe00d, 0x231: 0x0008, 0x232: 0xe00d, 0x233: 0x0008, 0x234: 0x0008, 0x235: 0x0008,
-	0x236: 0x0008, 0x237: 0x0008, 0x238: 0x0008, 0x239: 0x0008, 0x23a: 0x0209, 0x23b: 0xe03d,
-	0x23c: 0x0008, 0x23d: 0x031d, 0x23e: 0x0229, 0x23f: 0x0008,
+	0x236: 0x0008, 0x237: 0x0008, 0x238: 0x0008, 0x239: 0x0008, 0x23a: 0x0099, 0x23b: 0xe03d,
+	0x23c: 0x0008, 0x23d: 0x031d, 0x23e: 0x00a1, 0x23f: 0x0008,
 	// Block 0x9, offset 0x240
 	0x240: 0x0008, 0x241: 0x0008, 0x242: 0x0018, 0x243: 0x0018, 0x244: 0x0018, 0x245: 0x0018,
 	0x246: 0x0008, 0x247: 0x0008, 0x248: 0x0008, 0x249: 0x0008, 0x24a: 0x0008, 0x24b: 0x0008,
 	0x24c: 0x0008, 0x24d: 0x0008, 0x24e: 0x0008, 0x24f: 0x0008, 0x250: 0x0008, 0x251: 0x0008,
 	0x252: 0x0018, 0x253: 0x0018, 0x254: 0x0018, 0x255: 0x0018, 0x256: 0x0018, 0x257: 0x0018,
-	0x258: 0x029a, 0x259: 0x02ba, 0x25a: 0x02da, 0x25b: 0x02fa, 0x25c: 0x031a, 0x25d: 0x033a,
-	0x25e: 0x0018, 0x25f: 0x0018, 0x260: 0x03ad, 0x261: 0x0359, 0x262: 0x01d9, 0x263: 0x0369,
+	0x258: 0x00d2, 0x259: 0x00da, 0x25a: 0x00e2, 0x25b: 0x00ea, 0x25c: 0x00f2, 0x25d: 0x00fa,
+	0x25e: 0x0018, 0x25f: 0x0018, 0x260: 0x03ad, 0x261: 0x0101, 0x262: 0x0089, 0x263: 0x0109,
 	0x264: 0x03c5, 0x265: 0x0018, 0x266: 0x0018, 0x267: 0x0018, 0x268: 0x0018, 0x269: 0x0018,
 	0x26a: 0x0018, 0x26b: 0x0018, 0x26c: 0x0008, 0x26d: 0x0018, 0x26e: 0x0008, 0x26f: 0x0018,
 	0x270: 0x0018, 0x271: 0x0018, 0x272: 0x0018, 0x273: 0x0018, 0x274: 0x0018, 0x275: 0x0018,
 	0x276: 0x0018, 0x277: 0x0018, 0x278: 0x0018, 0x279: 0x0018, 0x27a: 0x0018, 0x27b: 0x0018,
 	0x27c: 0x0018, 0x27d: 0x0018, 0x27e: 0x0018, 0x27f: 0x0018,
 	// Block 0xa, offset 0x280
-	0x280: 0x03dd, 0x281: 0x03dd, 0x282: 0x3308, 0x283: 0x03f5, 0x284: 0x0379, 0x285: 0x040d,
+	0x280: 0x03dd, 0x281: 0x03dd, 0x282: 0x3308, 0x283: 0x03f5, 0x284: 0x0111, 0x285: 0x040d,
 	0x286: 0x3308, 0x287: 0x3308, 0x288: 0x3308, 0x289: 0x3308, 0x28a: 0x3308, 0x28b: 0x3308,
 	0x28c: 0x3308, 0x28d: 0x3308, 0x28e: 0x3308, 0x28f: 0x33c0, 0x290: 0x3308, 0x291: 0x3308,
 	0x292: 0x3308, 0x293: 0x3308, 0x294: 0x3308, 0x295: 0x3308, 0x296: 0x3308, 0x297: 0x3308,
@@ -687,10 +830,10 @@
 	0x2a4: 0x3308, 0x2a5: 0x3308, 0x2a6: 0x3308, 0x2a7: 0x3308, 0x2a8: 0x3308, 0x2a9: 0x3308,
 	0x2aa: 0x3308, 0x2ab: 0x3308, 0x2ac: 0x3308, 0x2ad: 0x3308, 0x2ae: 0x3308, 0x2af: 0x3308,
 	0x2b0: 0xe00d, 0x2b1: 0x0008, 0x2b2: 0xe00d, 0x2b3: 0x0008, 0x2b4: 0x0425, 0x2b5: 0x0008,
-	0x2b6: 0xe00d, 0x2b7: 0x0008, 0x2b8: 0x0040, 0x2b9: 0x0040, 0x2ba: 0x03a2, 0x2bb: 0x0008,
-	0x2bc: 0x0008, 0x2bd: 0x0008, 0x2be: 0x03c2, 0x2bf: 0x043d,
+	0x2b6: 0xe00d, 0x2b7: 0x0008, 0x2b8: 0x0040, 0x2b9: 0x0040, 0x2ba: 0x011a, 0x2bb: 0x0008,
+	0x2bc: 0x0008, 0x2bd: 0x0008, 0x2be: 0x0122, 0x2bf: 0x043d,
 	// Block 0xb, offset 0x2c0
-	0x2c0: 0x0040, 0x2c1: 0x0040, 0x2c2: 0x0040, 0x2c3: 0x0040, 0x2c4: 0x008a, 0x2c5: 0x03d2,
+	0x2c0: 0x0040, 0x2c1: 0x0040, 0x2c2: 0x0040, 0x2c3: 0x0040, 0x2c4: 0x003a, 0x2c5: 0x012a,
 	0x2c6: 0xe155, 0x2c7: 0x0455, 0x2c8: 0xe12d, 0x2c9: 0xe13d, 0x2ca: 0xe12d, 0x2cb: 0x0040,
 	0x2cc: 0x03dd, 0x2cd: 0x0040, 0x2ce: 0x046d, 0x2cf: 0x0485, 0x2d0: 0x0008, 0x2d1: 0xe105,
 	0x2d2: 0xe105, 0x2d3: 0xe105, 0x2d4: 0xe105, 0x2d5: 0xe105, 0x2d6: 0xe105, 0x2d7: 0xe105,
@@ -782,8 +925,8 @@
 	0x49e: 0x3308, 0x49f: 0x3308, 0x4a0: 0x0808, 0x4a1: 0x0808, 0x4a2: 0x0808, 0x4a3: 0x0808,
 	0x4a4: 0x0808, 0x4a5: 0x0808, 0x4a6: 0x0808, 0x4a7: 0x0808, 0x4a8: 0x0808, 0x4a9: 0x0808,
 	0x4aa: 0x0018, 0x4ab: 0x0818, 0x4ac: 0x0818, 0x4ad: 0x0818, 0x4ae: 0x0a08, 0x4af: 0x0a08,
-	0x4b0: 0x3308, 0x4b1: 0x0c08, 0x4b2: 0x0c08, 0x4b3: 0x0c08, 0x4b4: 0x0808, 0x4b5: 0x0429,
-	0x4b6: 0x0451, 0x4b7: 0x0479, 0x4b8: 0x04a1, 0x4b9: 0x0a08, 0x4ba: 0x0a08, 0x4bb: 0x0a08,
+	0x4b0: 0x3308, 0x4b1: 0x0c08, 0x4b2: 0x0c08, 0x4b3: 0x0c08, 0x4b4: 0x0808, 0x4b5: 0x0139,
+	0x4b6: 0x0141, 0x4b7: 0x0149, 0x4b8: 0x0151, 0x4b9: 0x0a08, 0x4ba: 0x0a08, 0x4bb: 0x0a08,
 	0x4bc: 0x0a08, 0x4bd: 0x0a08, 0x4be: 0x0a08, 0x4bf: 0x0a08,
 	// Block 0x13, offset 0x4c0
 	0x4c0: 0x0c08, 0x4c1: 0x0a08, 0x4c2: 0x0a08, 0x4c3: 0x0c08, 0x4c4: 0x0c08, 0x4c5: 0x0c08,
@@ -826,8 +969,8 @@
 	0x586: 0x3308, 0x587: 0x3308, 0x588: 0x3308, 0x589: 0x3008, 0x58a: 0x3008, 0x58b: 0x3008,
 	0x58c: 0x3008, 0x58d: 0x3b08, 0x58e: 0x3008, 0x58f: 0x3008, 0x590: 0x0008, 0x591: 0x3308,
 	0x592: 0x3308, 0x593: 0x3308, 0x594: 0x3308, 0x595: 0x3308, 0x596: 0x3308, 0x597: 0x3308,
-	0x598: 0x04c9, 0x599: 0x0501, 0x59a: 0x0539, 0x59b: 0x0571, 0x59c: 0x05a9, 0x59d: 0x05e1,
-	0x59e: 0x0619, 0x59f: 0x0651, 0x5a0: 0x0008, 0x5a1: 0x0008, 0x5a2: 0x3308, 0x5a3: 0x3308,
+	0x598: 0x0159, 0x599: 0x0161, 0x59a: 0x0169, 0x59b: 0x0171, 0x59c: 0x0179, 0x59d: 0x0181,
+	0x59e: 0x0189, 0x59f: 0x0191, 0x5a0: 0x0008, 0x5a1: 0x0008, 0x5a2: 0x3308, 0x5a3: 0x3308,
 	0x5a4: 0x0018, 0x5a5: 0x0018, 0x5a6: 0x0008, 0x5a7: 0x0008, 0x5a8: 0x0008, 0x5a9: 0x0008,
 	0x5aa: 0x0008, 0x5ab: 0x0008, 0x5ac: 0x0008, 0x5ad: 0x0008, 0x5ae: 0x0008, 0x5af: 0x0008,
 	0x5b0: 0x0018, 0x5b1: 0x0008, 0x5b2: 0x0008, 0x5b3: 0x0008, 0x5b4: 0x0008, 0x5b5: 0x0008,
@@ -850,8 +993,8 @@
 	0x606: 0x0040, 0x607: 0x3008, 0x608: 0x3008, 0x609: 0x0040, 0x60a: 0x0040, 0x60b: 0x3008,
 	0x60c: 0x3008, 0x60d: 0x3b08, 0x60e: 0x0008, 0x60f: 0x0040, 0x610: 0x0040, 0x611: 0x0040,
 	0x612: 0x0040, 0x613: 0x0040, 0x614: 0x0040, 0x615: 0x0040, 0x616: 0x0040, 0x617: 0x3008,
-	0x618: 0x0040, 0x619: 0x0040, 0x61a: 0x0040, 0x61b: 0x0040, 0x61c: 0x0689, 0x61d: 0x06c1,
-	0x61e: 0x0040, 0x61f: 0x06f9, 0x620: 0x0008, 0x621: 0x0008, 0x622: 0x3308, 0x623: 0x3308,
+	0x618: 0x0040, 0x619: 0x0040, 0x61a: 0x0040, 0x61b: 0x0040, 0x61c: 0x0199, 0x61d: 0x01a1,
+	0x61e: 0x0040, 0x61f: 0x01a9, 0x620: 0x0008, 0x621: 0x0008, 0x622: 0x3308, 0x623: 0x3308,
 	0x624: 0x0040, 0x625: 0x0040, 0x626: 0x0008, 0x627: 0x0008, 0x628: 0x0008, 0x629: 0x0008,
 	0x62a: 0x0008, 0x62b: 0x0008, 0x62c: 0x0008, 0x62d: 0x0008, 0x62e: 0x0008, 0x62f: 0x0008,
 	0x630: 0x0008, 0x631: 0x0008, 0x632: 0x0018, 0x633: 0x0018, 0x634: 0x0018, 0x635: 0x0018,
@@ -866,16 +1009,16 @@
 	0x65e: 0x0008, 0x65f: 0x0008, 0x660: 0x0008, 0x661: 0x0008, 0x662: 0x0008, 0x663: 0x0008,
 	0x664: 0x0008, 0x665: 0x0008, 0x666: 0x0008, 0x667: 0x0008, 0x668: 0x0008, 0x669: 0x0040,
 	0x66a: 0x0008, 0x66b: 0x0008, 0x66c: 0x0008, 0x66d: 0x0008, 0x66e: 0x0008, 0x66f: 0x0008,
-	0x670: 0x0008, 0x671: 0x0040, 0x672: 0x0008, 0x673: 0x0731, 0x674: 0x0040, 0x675: 0x0008,
-	0x676: 0x0769, 0x677: 0x0040, 0x678: 0x0008, 0x679: 0x0008, 0x67a: 0x0040, 0x67b: 0x0040,
+	0x670: 0x0008, 0x671: 0x0040, 0x672: 0x0008, 0x673: 0x01b1, 0x674: 0x0040, 0x675: 0x0008,
+	0x676: 0x01b9, 0x677: 0x0040, 0x678: 0x0008, 0x679: 0x0008, 0x67a: 0x0040, 0x67b: 0x0040,
 	0x67c: 0x3308, 0x67d: 0x0040, 0x67e: 0x3008, 0x67f: 0x3008,
 	// Block 0x1a, offset 0x680
 	0x680: 0x3008, 0x681: 0x3308, 0x682: 0x3308, 0x683: 0x0040, 0x684: 0x0040, 0x685: 0x0040,
 	0x686: 0x0040, 0x687: 0x3308, 0x688: 0x3308, 0x689: 0x0040, 0x68a: 0x0040, 0x68b: 0x3308,
 	0x68c: 0x3308, 0x68d: 0x3b08, 0x68e: 0x0040, 0x68f: 0x0040, 0x690: 0x0040, 0x691: 0x3308,
 	0x692: 0x0040, 0x693: 0x0040, 0x694: 0x0040, 0x695: 0x0040, 0x696: 0x0040, 0x697: 0x0040,
-	0x698: 0x0040, 0x699: 0x07a1, 0x69a: 0x07d9, 0x69b: 0x0811, 0x69c: 0x0008, 0x69d: 0x0040,
-	0x69e: 0x0849, 0x69f: 0x0040, 0x6a0: 0x0040, 0x6a1: 0x0040, 0x6a2: 0x0040, 0x6a3: 0x0040,
+	0x698: 0x0040, 0x699: 0x01c1, 0x69a: 0x01c9, 0x69b: 0x01d1, 0x69c: 0x0008, 0x69d: 0x0040,
+	0x69e: 0x01d9, 0x69f: 0x0040, 0x6a0: 0x0040, 0x6a1: 0x0040, 0x6a2: 0x0040, 0x6a3: 0x0040,
 	0x6a4: 0x0040, 0x6a5: 0x0040, 0x6a6: 0x0008, 0x6a7: 0x0008, 0x6a8: 0x0008, 0x6a9: 0x0008,
 	0x6aa: 0x0008, 0x6ab: 0x0008, 0x6ac: 0x0008, 0x6ad: 0x0008, 0x6ae: 0x0008, 0x6af: 0x0008,
 	0x6b0: 0x3308, 0x6b1: 0x3308, 0x6b2: 0x0008, 0x6b3: 0x0008, 0x6b4: 0x0008, 0x6b5: 0x3308,
@@ -922,7 +1065,7 @@
 	0x786: 0x0040, 0x787: 0x3008, 0x788: 0x3008, 0x789: 0x0040, 0x78a: 0x0040, 0x78b: 0x3008,
 	0x78c: 0x3008, 0x78d: 0x3b08, 0x78e: 0x0040, 0x78f: 0x0040, 0x790: 0x0040, 0x791: 0x0040,
 	0x792: 0x0040, 0x793: 0x0040, 0x794: 0x0040, 0x795: 0x3308, 0x796: 0x3308, 0x797: 0x3008,
-	0x798: 0x0040, 0x799: 0x0040, 0x79a: 0x0040, 0x79b: 0x0040, 0x79c: 0x0881, 0x79d: 0x08b9,
+	0x798: 0x0040, 0x799: 0x0040, 0x79a: 0x0040, 0x79b: 0x0040, 0x79c: 0x01e1, 0x79d: 0x01e9,
 	0x79e: 0x0040, 0x79f: 0x0008, 0x7a0: 0x0008, 0x7a1: 0x0008, 0x7a2: 0x3308, 0x7a3: 0x3308,
 	0x7a4: 0x0040, 0x7a5: 0x0040, 0x7a6: 0x0008, 0x7a7: 0x0008, 0x7a8: 0x0008, 0x7a9: 0x0008,
 	0x7aa: 0x0008, 0x7ab: 0x0008, 0x7ac: 0x0008, 0x7ad: 0x0008, 0x7ae: 0x0008, 0x7af: 0x0008,
@@ -998,32 +1141,32 @@
 	0x91e: 0x0008, 0x91f: 0x0008, 0x920: 0x0008, 0x921: 0x0008, 0x922: 0x0008, 0x923: 0x0008,
 	0x924: 0x0040, 0x925: 0x0008, 0x926: 0x0040, 0x927: 0x0008, 0x928: 0x0008, 0x929: 0x0008,
 	0x92a: 0x0008, 0x92b: 0x0008, 0x92c: 0x0008, 0x92d: 0x0008, 0x92e: 0x0008, 0x92f: 0x0008,
-	0x930: 0x0008, 0x931: 0x3308, 0x932: 0x0008, 0x933: 0x0929, 0x934: 0x3308, 0x935: 0x3308,
+	0x930: 0x0008, 0x931: 0x3308, 0x932: 0x0008, 0x933: 0x01f9, 0x934: 0x3308, 0x935: 0x3308,
 	0x936: 0x3308, 0x937: 0x3308, 0x938: 0x3308, 0x939: 0x3308, 0x93a: 0x3b08, 0x93b: 0x3308,
 	0x93c: 0x3308, 0x93d: 0x0008, 0x93e: 0x0040, 0x93f: 0x0040,
 	// Block 0x25, offset 0x940
-	0x940: 0x0008, 0x941: 0x0008, 0x942: 0x0008, 0x943: 0x09d1, 0x944: 0x0008, 0x945: 0x0008,
+	0x940: 0x0008, 0x941: 0x0008, 0x942: 0x0008, 0x943: 0x0211, 0x944: 0x0008, 0x945: 0x0008,
 	0x946: 0x0008, 0x947: 0x0008, 0x948: 0x0040, 0x949: 0x0008, 0x94a: 0x0008, 0x94b: 0x0008,
-	0x94c: 0x0008, 0x94d: 0x0a09, 0x94e: 0x0008, 0x94f: 0x0008, 0x950: 0x0008, 0x951: 0x0008,
-	0x952: 0x0a41, 0x953: 0x0008, 0x954: 0x0008, 0x955: 0x0008, 0x956: 0x0008, 0x957: 0x0a79,
-	0x958: 0x0008, 0x959: 0x0008, 0x95a: 0x0008, 0x95b: 0x0008, 0x95c: 0x0ab1, 0x95d: 0x0008,
+	0x94c: 0x0008, 0x94d: 0x0219, 0x94e: 0x0008, 0x94f: 0x0008, 0x950: 0x0008, 0x951: 0x0008,
+	0x952: 0x0221, 0x953: 0x0008, 0x954: 0x0008, 0x955: 0x0008, 0x956: 0x0008, 0x957: 0x0229,
+	0x958: 0x0008, 0x959: 0x0008, 0x95a: 0x0008, 0x95b: 0x0008, 0x95c: 0x0231, 0x95d: 0x0008,
 	0x95e: 0x0008, 0x95f: 0x0008, 0x960: 0x0008, 0x961: 0x0008, 0x962: 0x0008, 0x963: 0x0008,
-	0x964: 0x0008, 0x965: 0x0008, 0x966: 0x0008, 0x967: 0x0008, 0x968: 0x0008, 0x969: 0x0ae9,
+	0x964: 0x0008, 0x965: 0x0008, 0x966: 0x0008, 0x967: 0x0008, 0x968: 0x0008, 0x969: 0x0239,
 	0x96a: 0x0008, 0x96b: 0x0008, 0x96c: 0x0008, 0x96d: 0x0040, 0x96e: 0x0040, 0x96f: 0x0040,
-	0x970: 0x0040, 0x971: 0x3308, 0x972: 0x3308, 0x973: 0x0b21, 0x974: 0x3308, 0x975: 0x0b59,
-	0x976: 0x0b91, 0x977: 0x0bc9, 0x978: 0x0c19, 0x979: 0x0c51, 0x97a: 0x3308, 0x97b: 0x3308,
+	0x970: 0x0040, 0x971: 0x3308, 0x972: 0x3308, 0x973: 0x0241, 0x974: 0x3308, 0x975: 0x0249,
+	0x976: 0x0251, 0x977: 0x0259, 0x978: 0x0261, 0x979: 0x0269, 0x97a: 0x3308, 0x97b: 0x3308,
 	0x97c: 0x3308, 0x97d: 0x3308, 0x97e: 0x3308, 0x97f: 0x3008,
 	// Block 0x26, offset 0x980
-	0x980: 0x3308, 0x981: 0x0ca1, 0x982: 0x3308, 0x983: 0x3308, 0x984: 0x3b08, 0x985: 0x0018,
+	0x980: 0x3308, 0x981: 0x0271, 0x982: 0x3308, 0x983: 0x3308, 0x984: 0x3b08, 0x985: 0x0018,
 	0x986: 0x3308, 0x987: 0x3308, 0x988: 0x0008, 0x989: 0x0008, 0x98a: 0x0008, 0x98b: 0x0008,
 	0x98c: 0x0008, 0x98d: 0x3308, 0x98e: 0x3308, 0x98f: 0x3308, 0x990: 0x3308, 0x991: 0x3308,
-	0x992: 0x3308, 0x993: 0x0cd9, 0x994: 0x3308, 0x995: 0x3308, 0x996: 0x3308, 0x997: 0x3308,
-	0x998: 0x0040, 0x999: 0x3308, 0x99a: 0x3308, 0x99b: 0x3308, 0x99c: 0x3308, 0x99d: 0x0d11,
-	0x99e: 0x3308, 0x99f: 0x3308, 0x9a0: 0x3308, 0x9a1: 0x3308, 0x9a2: 0x0d49, 0x9a3: 0x3308,
-	0x9a4: 0x3308, 0x9a5: 0x3308, 0x9a6: 0x3308, 0x9a7: 0x0d81, 0x9a8: 0x3308, 0x9a9: 0x3308,
-	0x9aa: 0x3308, 0x9ab: 0x3308, 0x9ac: 0x0db9, 0x9ad: 0x3308, 0x9ae: 0x3308, 0x9af: 0x3308,
+	0x992: 0x3308, 0x993: 0x0279, 0x994: 0x3308, 0x995: 0x3308, 0x996: 0x3308, 0x997: 0x3308,
+	0x998: 0x0040, 0x999: 0x3308, 0x99a: 0x3308, 0x99b: 0x3308, 0x99c: 0x3308, 0x99d: 0x0281,
+	0x99e: 0x3308, 0x99f: 0x3308, 0x9a0: 0x3308, 0x9a1: 0x3308, 0x9a2: 0x0289, 0x9a3: 0x3308,
+	0x9a4: 0x3308, 0x9a5: 0x3308, 0x9a6: 0x3308, 0x9a7: 0x0291, 0x9a8: 0x3308, 0x9a9: 0x3308,
+	0x9aa: 0x3308, 0x9ab: 0x3308, 0x9ac: 0x0299, 0x9ad: 0x3308, 0x9ae: 0x3308, 0x9af: 0x3308,
 	0x9b0: 0x3308, 0x9b1: 0x3308, 0x9b2: 0x3308, 0x9b3: 0x3308, 0x9b4: 0x3308, 0x9b5: 0x3308,
-	0x9b6: 0x3308, 0x9b7: 0x3308, 0x9b8: 0x3308, 0x9b9: 0x0df1, 0x9ba: 0x3308, 0x9bb: 0x3308,
+	0x9b6: 0x3308, 0x9b7: 0x3308, 0x9b8: 0x3308, 0x9b9: 0x02a1, 0x9ba: 0x3308, 0x9bb: 0x3308,
 	0x9bc: 0x3308, 0x9bd: 0x0040, 0x9be: 0x0018, 0x9bf: 0x0018,
 	// Block 0x27, offset 0x9c0
 	0x9c0: 0x0008, 0x9c1: 0x0008, 0x9c2: 0x0008, 0x9c3: 0x0008, 0x9c4: 0x0008, 0x9c5: 0x0008,
@@ -1033,34 +1176,34 @@
 	0x9d8: 0x0008, 0x9d9: 0x0008, 0x9da: 0x0008, 0x9db: 0x0008, 0x9dc: 0x0008, 0x9dd: 0x0008,
 	0x9de: 0x0008, 0x9df: 0x0008, 0x9e0: 0x0008, 0x9e1: 0x0008, 0x9e2: 0x0008, 0x9e3: 0x0008,
 	0x9e4: 0x0008, 0x9e5: 0x0008, 0x9e6: 0x0008, 0x9e7: 0x0008, 0x9e8: 0x0008, 0x9e9: 0x0008,
-	0x9ea: 0x0008, 0x9eb: 0x0008, 0x9ec: 0x0039, 0x9ed: 0x0ed1, 0x9ee: 0x0ee9, 0x9ef: 0x0008,
-	0x9f0: 0x0ef9, 0x9f1: 0x0f09, 0x9f2: 0x0f19, 0x9f3: 0x0f31, 0x9f4: 0x0249, 0x9f5: 0x0f41,
-	0x9f6: 0x0259, 0x9f7: 0x0f51, 0x9f8: 0x0359, 0x9f9: 0x0f61, 0x9fa: 0x0f71, 0x9fb: 0x0008,
-	0x9fc: 0x00d9, 0x9fd: 0x0f81, 0x9fe: 0x0f99, 0x9ff: 0x0269,
+	0x9ea: 0x0008, 0x9eb: 0x0008, 0x9ec: 0x0019, 0x9ed: 0x02e1, 0x9ee: 0x02e9, 0x9ef: 0x0008,
+	0x9f0: 0x02f1, 0x9f1: 0x02f9, 0x9f2: 0x0301, 0x9f3: 0x0309, 0x9f4: 0x00a9, 0x9f5: 0x0311,
+	0x9f6: 0x00b1, 0x9f7: 0x0319, 0x9f8: 0x0101, 0x9f9: 0x0321, 0x9fa: 0x0329, 0x9fb: 0x0008,
+	0x9fc: 0x0051, 0x9fd: 0x0331, 0x9fe: 0x0339, 0x9ff: 0x00b9,
 	// Block 0x28, offset 0xa00
-	0xa00: 0x0fa9, 0xa01: 0x0fb9, 0xa02: 0x0279, 0xa03: 0x0039, 0xa04: 0x0fc9, 0xa05: 0x0fe1,
-	0xa06: 0x05b5, 0xa07: 0x0ee9, 0xa08: 0x0ef9, 0xa09: 0x0f09, 0xa0a: 0x0ff9, 0xa0b: 0x1011,
-	0xa0c: 0x1029, 0xa0d: 0x0f31, 0xa0e: 0x0008, 0xa0f: 0x0f51, 0xa10: 0x0f61, 0xa11: 0x1041,
-	0xa12: 0x00d9, 0xa13: 0x1059, 0xa14: 0x05cd, 0xa15: 0x05cd, 0xa16: 0x0f99, 0xa17: 0x0fa9,
-	0xa18: 0x0fb9, 0xa19: 0x05b5, 0xa1a: 0x1071, 0xa1b: 0x1089, 0xa1c: 0x05e5, 0xa1d: 0x1099,
-	0xa1e: 0x10b1, 0xa1f: 0x10c9, 0xa20: 0x10e1, 0xa21: 0x10f9, 0xa22: 0x0f41, 0xa23: 0x0269,
-	0xa24: 0x0fb9, 0xa25: 0x1089, 0xa26: 0x1099, 0xa27: 0x10b1, 0xa28: 0x1111, 0xa29: 0x10e1,
-	0xa2a: 0x10f9, 0xa2b: 0x0008, 0xa2c: 0x0008, 0xa2d: 0x0008, 0xa2e: 0x0008, 0xa2f: 0x0008,
+	0xa00: 0x0341, 0xa01: 0x0349, 0xa02: 0x00c1, 0xa03: 0x0019, 0xa04: 0x0351, 0xa05: 0x0359,
+	0xa06: 0x05b5, 0xa07: 0x02e9, 0xa08: 0x02f1, 0xa09: 0x02f9, 0xa0a: 0x0361, 0xa0b: 0x0369,
+	0xa0c: 0x0371, 0xa0d: 0x0309, 0xa0e: 0x0008, 0xa0f: 0x0319, 0xa10: 0x0321, 0xa11: 0x0379,
+	0xa12: 0x0051, 0xa13: 0x0381, 0xa14: 0x05cd, 0xa15: 0x05cd, 0xa16: 0x0339, 0xa17: 0x0341,
+	0xa18: 0x0349, 0xa19: 0x05b5, 0xa1a: 0x0389, 0xa1b: 0x0391, 0xa1c: 0x05e5, 0xa1d: 0x0399,
+	0xa1e: 0x03a1, 0xa1f: 0x03a9, 0xa20: 0x03b1, 0xa21: 0x03b9, 0xa22: 0x0311, 0xa23: 0x00b9,
+	0xa24: 0x0349, 0xa25: 0x0391, 0xa26: 0x0399, 0xa27: 0x03a1, 0xa28: 0x03c1, 0xa29: 0x03b1,
+	0xa2a: 0x03b9, 0xa2b: 0x0008, 0xa2c: 0x0008, 0xa2d: 0x0008, 0xa2e: 0x0008, 0xa2f: 0x0008,
 	0xa30: 0x0008, 0xa31: 0x0008, 0xa32: 0x0008, 0xa33: 0x0008, 0xa34: 0x0008, 0xa35: 0x0008,
-	0xa36: 0x0008, 0xa37: 0x0008, 0xa38: 0x1129, 0xa39: 0x0008, 0xa3a: 0x0008, 0xa3b: 0x0008,
+	0xa36: 0x0008, 0xa37: 0x0008, 0xa38: 0x03c9, 0xa39: 0x0008, 0xa3a: 0x0008, 0xa3b: 0x0008,
 	0xa3c: 0x0008, 0xa3d: 0x0008, 0xa3e: 0x0008, 0xa3f: 0x0008,
 	// Block 0x29, offset 0xa40
 	0xa40: 0x0008, 0xa41: 0x0008, 0xa42: 0x0008, 0xa43: 0x0008, 0xa44: 0x0008, 0xa45: 0x0008,
 	0xa46: 0x0008, 0xa47: 0x0008, 0xa48: 0x0008, 0xa49: 0x0008, 0xa4a: 0x0008, 0xa4b: 0x0008,
 	0xa4c: 0x0008, 0xa4d: 0x0008, 0xa4e: 0x0008, 0xa4f: 0x0008, 0xa50: 0x0008, 0xa51: 0x0008,
 	0xa52: 0x0008, 0xa53: 0x0008, 0xa54: 0x0008, 0xa55: 0x0008, 0xa56: 0x0008, 0xa57: 0x0008,
-	0xa58: 0x0008, 0xa59: 0x0008, 0xa5a: 0x0008, 0xa5b: 0x1141, 0xa5c: 0x1159, 0xa5d: 0x1169,
-	0xa5e: 0x1181, 0xa5f: 0x1029, 0xa60: 0x1199, 0xa61: 0x11a9, 0xa62: 0x11c1, 0xa63: 0x11d9,
-	0xa64: 0x11f1, 0xa65: 0x1209, 0xa66: 0x1221, 0xa67: 0x05fd, 0xa68: 0x1239, 0xa69: 0x1251,
-	0xa6a: 0xe17d, 0xa6b: 0x1269, 0xa6c: 0x1281, 0xa6d: 0x1299, 0xa6e: 0x12b1, 0xa6f: 0x12c9,
-	0xa70: 0x12e1, 0xa71: 0x12f9, 0xa72: 0x1311, 0xa73: 0x1329, 0xa74: 0x1341, 0xa75: 0x1359,
-	0xa76: 0x1371, 0xa77: 0x1389, 0xa78: 0x0615, 0xa79: 0x13a1, 0xa7a: 0x13b9, 0xa7b: 0x13d1,
-	0xa7c: 0x13e1, 0xa7d: 0x13f9, 0xa7e: 0x1411, 0xa7f: 0x1429,
+	0xa58: 0x0008, 0xa59: 0x0008, 0xa5a: 0x0008, 0xa5b: 0x03d1, 0xa5c: 0x03d9, 0xa5d: 0x03e1,
+	0xa5e: 0x03e9, 0xa5f: 0x0371, 0xa60: 0x03f1, 0xa61: 0x03f9, 0xa62: 0x0401, 0xa63: 0x0409,
+	0xa64: 0x0411, 0xa65: 0x0419, 0xa66: 0x0421, 0xa67: 0x05fd, 0xa68: 0x0429, 0xa69: 0x0431,
+	0xa6a: 0xe17d, 0xa6b: 0x0439, 0xa6c: 0x0441, 0xa6d: 0x0449, 0xa6e: 0x0451, 0xa6f: 0x0459,
+	0xa70: 0x0461, 0xa71: 0x0469, 0xa72: 0x0471, 0xa73: 0x0479, 0xa74: 0x0481, 0xa75: 0x0489,
+	0xa76: 0x0491, 0xa77: 0x0499, 0xa78: 0x0615, 0xa79: 0x04a1, 0xa7a: 0x04a9, 0xa7b: 0x04b1,
+	0xa7c: 0x04b9, 0xa7d: 0x04c1, 0xa7e: 0x04c9, 0xa7f: 0x04d1,
 	// Block 0x2a, offset 0xa80
 	0xa80: 0xe00d, 0xa81: 0x0008, 0xa82: 0xe00d, 0xa83: 0x0008, 0xa84: 0xe00d, 0xa85: 0x0008,
 	0xa86: 0xe00d, 0xa87: 0x0008, 0xa88: 0xe00d, 0xa89: 0x0008, 0xa8a: 0xe00d, 0xa8b: 0x0008,
@@ -1079,7 +1222,7 @@
 	0xacc: 0xe00d, 0xacd: 0x0008, 0xace: 0xe00d, 0xacf: 0x0008, 0xad0: 0xe00d, 0xad1: 0x0008,
 	0xad2: 0xe00d, 0xad3: 0x0008, 0xad4: 0xe00d, 0xad5: 0x0008, 0xad6: 0x0008, 0xad7: 0x0008,
 	0xad8: 0x0008, 0xad9: 0x0008, 0xada: 0x062d, 0xadb: 0x064d, 0xadc: 0x0008, 0xadd: 0x0008,
-	0xade: 0x1441, 0xadf: 0x0008, 0xae0: 0xe00d, 0xae1: 0x0008, 0xae2: 0xe00d, 0xae3: 0x0008,
+	0xade: 0x04d9, 0xadf: 0x0008, 0xae0: 0xe00d, 0xae1: 0x0008, 0xae2: 0xe00d, 0xae3: 0x0008,
 	0xae4: 0xe00d, 0xae5: 0x0008, 0xae6: 0xe00d, 0xae7: 0x0008, 0xae8: 0xe00d, 0xae9: 0x0008,
 	0xaea: 0xe00d, 0xaeb: 0x0008, 0xaec: 0xe00d, 0xaed: 0x0008, 0xaee: 0xe00d, 0xaef: 0x0008,
 	0xaf0: 0xe00d, 0xaf1: 0x0008, 0xaf2: 0xe00d, 0xaf3: 0x0008, 0xaf4: 0xe00d, 0xaf5: 0x0008,
@@ -1094,33 +1237,33 @@
 	0xb1e: 0x0040, 0xb1f: 0xe045, 0xb20: 0x0008, 0xb21: 0x0008, 0xb22: 0x0008, 0xb23: 0x0008,
 	0xb24: 0x0008, 0xb25: 0x0008, 0xb26: 0x0008, 0xb27: 0x0008, 0xb28: 0xe045, 0xb29: 0xe045,
 	0xb2a: 0xe045, 0xb2b: 0xe045, 0xb2c: 0xe045, 0xb2d: 0xe045, 0xb2e: 0xe045, 0xb2f: 0xe045,
-	0xb30: 0x0008, 0xb31: 0x1459, 0xb32: 0x0008, 0xb33: 0x1471, 0xb34: 0x0008, 0xb35: 0x1489,
-	0xb36: 0x0008, 0xb37: 0x14a1, 0xb38: 0x0008, 0xb39: 0x14b9, 0xb3a: 0x0008, 0xb3b: 0x14d1,
-	0xb3c: 0x0008, 0xb3d: 0x14e9, 0xb3e: 0x0040, 0xb3f: 0x0040,
+	0xb30: 0x0008, 0xb31: 0x04e1, 0xb32: 0x0008, 0xb33: 0x04e9, 0xb34: 0x0008, 0xb35: 0x04f1,
+	0xb36: 0x0008, 0xb37: 0x04f9, 0xb38: 0x0008, 0xb39: 0x0501, 0xb3a: 0x0008, 0xb3b: 0x0509,
+	0xb3c: 0x0008, 0xb3d: 0x0511, 0xb3e: 0x0040, 0xb3f: 0x0040,
 	// Block 0x2d, offset 0xb40
-	0xb40: 0x1501, 0xb41: 0x1531, 0xb42: 0x1561, 0xb43: 0x1591, 0xb44: 0x15c1, 0xb45: 0x15f1,
-	0xb46: 0x1621, 0xb47: 0x1651, 0xb48: 0x1501, 0xb49: 0x1531, 0xb4a: 0x1561, 0xb4b: 0x1591,
-	0xb4c: 0x15c1, 0xb4d: 0x15f1, 0xb4e: 0x1621, 0xb4f: 0x1651, 0xb50: 0x1681, 0xb51: 0x16b1,
-	0xb52: 0x16e1, 0xb53: 0x1711, 0xb54: 0x1741, 0xb55: 0x1771, 0xb56: 0x17a1, 0xb57: 0x17d1,
-	0xb58: 0x1681, 0xb59: 0x16b1, 0xb5a: 0x16e1, 0xb5b: 0x1711, 0xb5c: 0x1741, 0xb5d: 0x1771,
-	0xb5e: 0x17a1, 0xb5f: 0x17d1, 0xb60: 0x1801, 0xb61: 0x1831, 0xb62: 0x1861, 0xb63: 0x1891,
-	0xb64: 0x18c1, 0xb65: 0x18f1, 0xb66: 0x1921, 0xb67: 0x1951, 0xb68: 0x1801, 0xb69: 0x1831,
-	0xb6a: 0x1861, 0xb6b: 0x1891, 0xb6c: 0x18c1, 0xb6d: 0x18f1, 0xb6e: 0x1921, 0xb6f: 0x1951,
-	0xb70: 0x0008, 0xb71: 0x0008, 0xb72: 0x1981, 0xb73: 0x19b1, 0xb74: 0x19d9, 0xb75: 0x0040,
-	0xb76: 0x0008, 0xb77: 0x1a01, 0xb78: 0xe045, 0xb79: 0xe045, 0xb7a: 0x0665, 0xb7b: 0x1459,
-	0xb7c: 0x19b1, 0xb7d: 0x067e, 0xb7e: 0x1a31, 0xb7f: 0x069e,
+	0xb40: 0x0519, 0xb41: 0x0521, 0xb42: 0x0529, 0xb43: 0x0531, 0xb44: 0x0539, 0xb45: 0x0541,
+	0xb46: 0x0549, 0xb47: 0x0551, 0xb48: 0x0519, 0xb49: 0x0521, 0xb4a: 0x0529, 0xb4b: 0x0531,
+	0xb4c: 0x0539, 0xb4d: 0x0541, 0xb4e: 0x0549, 0xb4f: 0x0551, 0xb50: 0x0559, 0xb51: 0x0561,
+	0xb52: 0x0569, 0xb53: 0x0571, 0xb54: 0x0579, 0xb55: 0x0581, 0xb56: 0x0589, 0xb57: 0x0591,
+	0xb58: 0x0559, 0xb59: 0x0561, 0xb5a: 0x0569, 0xb5b: 0x0571, 0xb5c: 0x0579, 0xb5d: 0x0581,
+	0xb5e: 0x0589, 0xb5f: 0x0591, 0xb60: 0x0599, 0xb61: 0x05a1, 0xb62: 0x05a9, 0xb63: 0x05b1,
+	0xb64: 0x05b9, 0xb65: 0x05c1, 0xb66: 0x05c9, 0xb67: 0x05d1, 0xb68: 0x0599, 0xb69: 0x05a1,
+	0xb6a: 0x05a9, 0xb6b: 0x05b1, 0xb6c: 0x05b9, 0xb6d: 0x05c1, 0xb6e: 0x05c9, 0xb6f: 0x05d1,
+	0xb70: 0x0008, 0xb71: 0x0008, 0xb72: 0x05d9, 0xb73: 0x05e1, 0xb74: 0x05e9, 0xb75: 0x0040,
+	0xb76: 0x0008, 0xb77: 0x05f1, 0xb78: 0xe045, 0xb79: 0xe045, 0xb7a: 0x0665, 0xb7b: 0x04e1,
+	0xb7c: 0x05e1, 0xb7d: 0x067e, 0xb7e: 0x05f9, 0xb7f: 0x069e,
 	// Block 0x2e, offset 0xb80
-	0xb80: 0x06be, 0xb81: 0x1a4a, 0xb82: 0x1a79, 0xb83: 0x1aa9, 0xb84: 0x1ad1, 0xb85: 0x0040,
-	0xb86: 0x0008, 0xb87: 0x1af9, 0xb88: 0x06dd, 0xb89: 0x1471, 0xb8a: 0x06f5, 0xb8b: 0x1489,
-	0xb8c: 0x1aa9, 0xb8d: 0x1b2a, 0xb8e: 0x1b5a, 0xb8f: 0x1b8a, 0xb90: 0x0008, 0xb91: 0x0008,
-	0xb92: 0x0008, 0xb93: 0x1bb9, 0xb94: 0x0040, 0xb95: 0x0040, 0xb96: 0x0008, 0xb97: 0x0008,
-	0xb98: 0xe045, 0xb99: 0xe045, 0xb9a: 0x070d, 0xb9b: 0x14a1, 0xb9c: 0x0040, 0xb9d: 0x1bd2,
-	0xb9e: 0x1c02, 0xb9f: 0x1c32, 0xba0: 0x0008, 0xba1: 0x0008, 0xba2: 0x0008, 0xba3: 0x1c61,
+	0xb80: 0x06be, 0xb81: 0x0602, 0xb82: 0x0609, 0xb83: 0x0611, 0xb84: 0x0619, 0xb85: 0x0040,
+	0xb86: 0x0008, 0xb87: 0x0621, 0xb88: 0x06dd, 0xb89: 0x04e9, 0xb8a: 0x06f5, 0xb8b: 0x04f1,
+	0xb8c: 0x0611, 0xb8d: 0x062a, 0xb8e: 0x0632, 0xb8f: 0x063a, 0xb90: 0x0008, 0xb91: 0x0008,
+	0xb92: 0x0008, 0xb93: 0x0641, 0xb94: 0x0040, 0xb95: 0x0040, 0xb96: 0x0008, 0xb97: 0x0008,
+	0xb98: 0xe045, 0xb99: 0xe045, 0xb9a: 0x070d, 0xb9b: 0x04f9, 0xb9c: 0x0040, 0xb9d: 0x064a,
+	0xb9e: 0x0652, 0xb9f: 0x065a, 0xba0: 0x0008, 0xba1: 0x0008, 0xba2: 0x0008, 0xba3: 0x0661,
 	0xba4: 0x0008, 0xba5: 0x0008, 0xba6: 0x0008, 0xba7: 0x0008, 0xba8: 0xe045, 0xba9: 0xe045,
-	0xbaa: 0x0725, 0xbab: 0x14d1, 0xbac: 0xe04d, 0xbad: 0x1c7a, 0xbae: 0x03d2, 0xbaf: 0x1caa,
-	0xbb0: 0x0040, 0xbb1: 0x0040, 0xbb2: 0x1cb9, 0xbb3: 0x1ce9, 0xbb4: 0x1d11, 0xbb5: 0x0040,
-	0xbb6: 0x0008, 0xbb7: 0x1d39, 0xbb8: 0x073d, 0xbb9: 0x14b9, 0xbba: 0x0515, 0xbbb: 0x14e9,
-	0xbbc: 0x1ce9, 0xbbd: 0x0756, 0xbbe: 0x0776, 0xbbf: 0x0040,
+	0xbaa: 0x0725, 0xbab: 0x0509, 0xbac: 0xe04d, 0xbad: 0x066a, 0xbae: 0x012a, 0xbaf: 0x0672,
+	0xbb0: 0x0040, 0xbb1: 0x0040, 0xbb2: 0x0679, 0xbb3: 0x0681, 0xbb4: 0x0689, 0xbb5: 0x0040,
+	0xbb6: 0x0008, 0xbb7: 0x0691, 0xbb8: 0x073d, 0xbb9: 0x0501, 0xbba: 0x0515, 0xbbb: 0x0511,
+	0xbbc: 0x0681, 0xbbd: 0x0756, 0xbbe: 0x0776, 0xbbf: 0x0040,
 	// Block 0x2f, offset 0xbc0
 	0xbc0: 0x000a, 0xbc1: 0x000a, 0xbc2: 0x000a, 0xbc3: 0x000a, 0xbc4: 0x000a, 0xbc5: 0x000a,
 	0xbc6: 0x000a, 0xbc7: 0x000a, 0xbc8: 0x000a, 0xbc9: 0x000a, 0xbca: 0x000a, 0xbcb: 0x03c0,
@@ -1130,72 +1273,72 @@
 	0xbde: 0x0018, 0xbdf: 0x0018, 0xbe0: 0x0018, 0xbe1: 0x0018, 0xbe2: 0x0018, 0xbe3: 0x0018,
 	0xbe4: 0x0040, 0xbe5: 0x0040, 0xbe6: 0x0040, 0xbe7: 0x0018, 0xbe8: 0x0040, 0xbe9: 0x0040,
 	0xbea: 0x0340, 0xbeb: 0x0340, 0xbec: 0x0340, 0xbed: 0x0340, 0xbee: 0x0340, 0xbef: 0x000a,
-	0xbf0: 0x0018, 0xbf1: 0x0018, 0xbf2: 0x0018, 0xbf3: 0x1d69, 0xbf4: 0x1da1, 0xbf5: 0x0018,
-	0xbf6: 0x1df1, 0xbf7: 0x1e29, 0xbf8: 0x0018, 0xbf9: 0x0018, 0xbfa: 0x0018, 0xbfb: 0x0018,
-	0xbfc: 0x1e7a, 0xbfd: 0x0018, 0xbfe: 0x07b6, 0xbff: 0x0018,
+	0xbf0: 0x0018, 0xbf1: 0x0018, 0xbf2: 0x0018, 0xbf3: 0x0699, 0xbf4: 0x06a1, 0xbf5: 0x0018,
+	0xbf6: 0x06a9, 0xbf7: 0x06b1, 0xbf8: 0x0018, 0xbf9: 0x0018, 0xbfa: 0x0018, 0xbfb: 0x0018,
+	0xbfc: 0x06ba, 0xbfd: 0x0018, 0xbfe: 0x07b6, 0xbff: 0x0018,
 	// Block 0x30, offset 0xc00
 	0xc00: 0x0018, 0xc01: 0x0018, 0xc02: 0x0018, 0xc03: 0x0018, 0xc04: 0x0018, 0xc05: 0x0018,
-	0xc06: 0x0018, 0xc07: 0x1e92, 0xc08: 0x1eaa, 0xc09: 0x1ec2, 0xc0a: 0x0018, 0xc0b: 0x0018,
+	0xc06: 0x0018, 0xc07: 0x06c2, 0xc08: 0x06ca, 0xc09: 0x06d2, 0xc0a: 0x0018, 0xc0b: 0x0018,
 	0xc0c: 0x0018, 0xc0d: 0x0018, 0xc0e: 0x0018, 0xc0f: 0x0018, 0xc10: 0x0018, 0xc11: 0x0018,
-	0xc12: 0x0018, 0xc13: 0x0018, 0xc14: 0x0018, 0xc15: 0x0018, 0xc16: 0x0018, 0xc17: 0x1ed9,
+	0xc12: 0x0018, 0xc13: 0x0018, 0xc14: 0x0018, 0xc15: 0x0018, 0xc16: 0x0018, 0xc17: 0x06d9,
 	0xc18: 0x0018, 0xc19: 0x0018, 0xc1a: 0x0018, 0xc1b: 0x0018, 0xc1c: 0x0018, 0xc1d: 0x0018,
 	0xc1e: 0x0018, 0xc1f: 0x000a, 0xc20: 0x03c0, 0xc21: 0x0340, 0xc22: 0x0340, 0xc23: 0x0340,
 	0xc24: 0x03c0, 0xc25: 0x0040, 0xc26: 0x0040, 0xc27: 0x0040, 0xc28: 0x0040, 0xc29: 0x0040,
 	0xc2a: 0x0340, 0xc2b: 0x0340, 0xc2c: 0x0340, 0xc2d: 0x0340, 0xc2e: 0x0340, 0xc2f: 0x0340,
-	0xc30: 0x1f41, 0xc31: 0x0f41, 0xc32: 0x0040, 0xc33: 0x0040, 0xc34: 0x1f51, 0xc35: 0x1f61,
-	0xc36: 0x1f71, 0xc37: 0x1f81, 0xc38: 0x1f91, 0xc39: 0x1fa1, 0xc3a: 0x1fb2, 0xc3b: 0x07d5,
-	0xc3c: 0x1fc2, 0xc3d: 0x1fd2, 0xc3e: 0x1fe2, 0xc3f: 0x0f71,
+	0xc30: 0x06e1, 0xc31: 0x0311, 0xc32: 0x0040, 0xc33: 0x0040, 0xc34: 0x06e9, 0xc35: 0x06f1,
+	0xc36: 0x06f9, 0xc37: 0x0701, 0xc38: 0x0709, 0xc39: 0x0711, 0xc3a: 0x071a, 0xc3b: 0x07d5,
+	0xc3c: 0x0722, 0xc3d: 0x072a, 0xc3e: 0x0732, 0xc3f: 0x0329,
 	// Block 0x31, offset 0xc40
-	0xc40: 0x1f41, 0xc41: 0x00c9, 0xc42: 0x0069, 0xc43: 0x0079, 0xc44: 0x1f51, 0xc45: 0x1f61,
-	0xc46: 0x1f71, 0xc47: 0x1f81, 0xc48: 0x1f91, 0xc49: 0x1fa1, 0xc4a: 0x1fb2, 0xc4b: 0x07ed,
-	0xc4c: 0x1fc2, 0xc4d: 0x1fd2, 0xc4e: 0x1fe2, 0xc4f: 0x0040, 0xc50: 0x0039, 0xc51: 0x0f09,
-	0xc52: 0x00d9, 0xc53: 0x0369, 0xc54: 0x0ff9, 0xc55: 0x0249, 0xc56: 0x0f51, 0xc57: 0x0359,
-	0xc58: 0x0f61, 0xc59: 0x0f71, 0xc5a: 0x0f99, 0xc5b: 0x01d9, 0xc5c: 0x0fa9, 0xc5d: 0x0040,
+	0xc40: 0x06e1, 0xc41: 0x0049, 0xc42: 0x0029, 0xc43: 0x0031, 0xc44: 0x06e9, 0xc45: 0x06f1,
+	0xc46: 0x06f9, 0xc47: 0x0701, 0xc48: 0x0709, 0xc49: 0x0711, 0xc4a: 0x071a, 0xc4b: 0x07ed,
+	0xc4c: 0x0722, 0xc4d: 0x072a, 0xc4e: 0x0732, 0xc4f: 0x0040, 0xc50: 0x0019, 0xc51: 0x02f9,
+	0xc52: 0x0051, 0xc53: 0x0109, 0xc54: 0x0361, 0xc55: 0x00a9, 0xc56: 0x0319, 0xc57: 0x0101,
+	0xc58: 0x0321, 0xc59: 0x0329, 0xc5a: 0x0339, 0xc5b: 0x0089, 0xc5c: 0x0341, 0xc5d: 0x0040,
 	0xc5e: 0x0040, 0xc5f: 0x0040, 0xc60: 0x0018, 0xc61: 0x0018, 0xc62: 0x0018, 0xc63: 0x0018,
-	0xc64: 0x0018, 0xc65: 0x0018, 0xc66: 0x0018, 0xc67: 0x0018, 0xc68: 0x1ff1, 0xc69: 0x0018,
+	0xc64: 0x0018, 0xc65: 0x0018, 0xc66: 0x0018, 0xc67: 0x0018, 0xc68: 0x0739, 0xc69: 0x0018,
 	0xc6a: 0x0018, 0xc6b: 0x0018, 0xc6c: 0x0018, 0xc6d: 0x0018, 0xc6e: 0x0018, 0xc6f: 0x0018,
 	0xc70: 0x0018, 0xc71: 0x0018, 0xc72: 0x0018, 0xc73: 0x0018, 0xc74: 0x0018, 0xc75: 0x0018,
 	0xc76: 0x0018, 0xc77: 0x0018, 0xc78: 0x0018, 0xc79: 0x0018, 0xc7a: 0x0018, 0xc7b: 0x0018,
 	0xc7c: 0x0018, 0xc7d: 0x0018, 0xc7e: 0x0018, 0xc7f: 0x0018,
 	// Block 0x32, offset 0xc80
-	0xc80: 0x0806, 0xc81: 0x0826, 0xc82: 0x1159, 0xc83: 0x0845, 0xc84: 0x0018, 0xc85: 0x0866,
-	0xc86: 0x0886, 0xc87: 0x1011, 0xc88: 0x0018, 0xc89: 0x08a5, 0xc8a: 0x0f31, 0xc8b: 0x0249,
-	0xc8c: 0x0249, 0xc8d: 0x0249, 0xc8e: 0x0249, 0xc8f: 0x2009, 0xc90: 0x0f41, 0xc91: 0x0f41,
-	0xc92: 0x0359, 0xc93: 0x0359, 0xc94: 0x0018, 0xc95: 0x0f71, 0xc96: 0x2021, 0xc97: 0x0018,
-	0xc98: 0x0018, 0xc99: 0x0f99, 0xc9a: 0x2039, 0xc9b: 0x0269, 0xc9c: 0x0269, 0xc9d: 0x0269,
-	0xc9e: 0x0018, 0xc9f: 0x0018, 0xca0: 0x2049, 0xca1: 0x08c5, 0xca2: 0x2061, 0xca3: 0x0018,
-	0xca4: 0x13d1, 0xca5: 0x0018, 0xca6: 0x2079, 0xca7: 0x0018, 0xca8: 0x13d1, 0xca9: 0x0018,
-	0xcaa: 0x0f51, 0xcab: 0x2091, 0xcac: 0x0ee9, 0xcad: 0x1159, 0xcae: 0x0018, 0xcaf: 0x0f09,
-	0xcb0: 0x0f09, 0xcb1: 0x1199, 0xcb2: 0x0040, 0xcb3: 0x0f61, 0xcb4: 0x00d9, 0xcb5: 0x20a9,
-	0xcb6: 0x20c1, 0xcb7: 0x20d9, 0xcb8: 0x20f1, 0xcb9: 0x0f41, 0xcba: 0x0018, 0xcbb: 0x08e5,
-	0xcbc: 0x2109, 0xcbd: 0x10b1, 0xcbe: 0x10b1, 0xcbf: 0x2109,
+	0xc80: 0x0806, 0xc81: 0x0826, 0xc82: 0x03d9, 0xc83: 0x0845, 0xc84: 0x0018, 0xc85: 0x0866,
+	0xc86: 0x0886, 0xc87: 0x0369, 0xc88: 0x0018, 0xc89: 0x08a5, 0xc8a: 0x0309, 0xc8b: 0x00a9,
+	0xc8c: 0x00a9, 0xc8d: 0x00a9, 0xc8e: 0x00a9, 0xc8f: 0x0741, 0xc90: 0x0311, 0xc91: 0x0311,
+	0xc92: 0x0101, 0xc93: 0x0101, 0xc94: 0x0018, 0xc95: 0x0329, 0xc96: 0x0749, 0xc97: 0x0018,
+	0xc98: 0x0018, 0xc99: 0x0339, 0xc9a: 0x0751, 0xc9b: 0x00b9, 0xc9c: 0x00b9, 0xc9d: 0x00b9,
+	0xc9e: 0x0018, 0xc9f: 0x0018, 0xca0: 0x0759, 0xca1: 0x08c5, 0xca2: 0x0761, 0xca3: 0x0018,
+	0xca4: 0x04b1, 0xca5: 0x0018, 0xca6: 0x0769, 0xca7: 0x0018, 0xca8: 0x04b1, 0xca9: 0x0018,
+	0xcaa: 0x0319, 0xcab: 0x0771, 0xcac: 0x02e9, 0xcad: 0x03d9, 0xcae: 0x0018, 0xcaf: 0x02f9,
+	0xcb0: 0x02f9, 0xcb1: 0x03f1, 0xcb2: 0x0040, 0xcb3: 0x0321, 0xcb4: 0x0051, 0xcb5: 0x0779,
+	0xcb6: 0x0781, 0xcb7: 0x0789, 0xcb8: 0x0791, 0xcb9: 0x0311, 0xcba: 0x0018, 0xcbb: 0x08e5,
+	0xcbc: 0x0799, 0xcbd: 0x03a1, 0xcbe: 0x03a1, 0xcbf: 0x0799,
 	// Block 0x33, offset 0xcc0
-	0xcc0: 0x0905, 0xcc1: 0x0018, 0xcc2: 0x0018, 0xcc3: 0x0018, 0xcc4: 0x0018, 0xcc5: 0x0ef9,
-	0xcc6: 0x0ef9, 0xcc7: 0x0f09, 0xcc8: 0x0f41, 0xcc9: 0x0259, 0xcca: 0x0018, 0xccb: 0x0018,
-	0xccc: 0x0018, 0xccd: 0x0018, 0xcce: 0x0008, 0xccf: 0x0018, 0xcd0: 0x2121, 0xcd1: 0x2151,
-	0xcd2: 0x2181, 0xcd3: 0x21b9, 0xcd4: 0x21e9, 0xcd5: 0x2219, 0xcd6: 0x2249, 0xcd7: 0x2279,
-	0xcd8: 0x22a9, 0xcd9: 0x22d9, 0xcda: 0x2309, 0xcdb: 0x2339, 0xcdc: 0x2369, 0xcdd: 0x2399,
-	0xcde: 0x23c9, 0xcdf: 0x23f9, 0xce0: 0x0f41, 0xce1: 0x2421, 0xce2: 0x091d, 0xce3: 0x2439,
-	0xce4: 0x1089, 0xce5: 0x2451, 0xce6: 0x093d, 0xce7: 0x2469, 0xce8: 0x2491, 0xce9: 0x0369,
-	0xcea: 0x24a9, 0xceb: 0x095d, 0xcec: 0x0359, 0xced: 0x1159, 0xcee: 0x0ef9, 0xcef: 0x0f61,
-	0xcf0: 0x0f41, 0xcf1: 0x2421, 0xcf2: 0x097d, 0xcf3: 0x2439, 0xcf4: 0x1089, 0xcf5: 0x2451,
-	0xcf6: 0x099d, 0xcf7: 0x2469, 0xcf8: 0x2491, 0xcf9: 0x0369, 0xcfa: 0x24a9, 0xcfb: 0x09bd,
-	0xcfc: 0x0359, 0xcfd: 0x1159, 0xcfe: 0x0ef9, 0xcff: 0x0f61,
+	0xcc0: 0x0905, 0xcc1: 0x0018, 0xcc2: 0x0018, 0xcc3: 0x0018, 0xcc4: 0x0018, 0xcc5: 0x02f1,
+	0xcc6: 0x02f1, 0xcc7: 0x02f9, 0xcc8: 0x0311, 0xcc9: 0x00b1, 0xcca: 0x0018, 0xccb: 0x0018,
+	0xccc: 0x0018, 0xccd: 0x0018, 0xcce: 0x0008, 0xccf: 0x0018, 0xcd0: 0x07a1, 0xcd1: 0x07a9,
+	0xcd2: 0x07b1, 0xcd3: 0x07b9, 0xcd4: 0x07c1, 0xcd5: 0x07c9, 0xcd6: 0x07d1, 0xcd7: 0x07d9,
+	0xcd8: 0x07e1, 0xcd9: 0x07e9, 0xcda: 0x07f1, 0xcdb: 0x07f9, 0xcdc: 0x0801, 0xcdd: 0x0809,
+	0xcde: 0x0811, 0xcdf: 0x0819, 0xce0: 0x0311, 0xce1: 0x0821, 0xce2: 0x091d, 0xce3: 0x0829,
+	0xce4: 0x0391, 0xce5: 0x0831, 0xce6: 0x093d, 0xce7: 0x0839, 0xce8: 0x0841, 0xce9: 0x0109,
+	0xcea: 0x0849, 0xceb: 0x095d, 0xcec: 0x0101, 0xced: 0x03d9, 0xcee: 0x02f1, 0xcef: 0x0321,
+	0xcf0: 0x0311, 0xcf1: 0x0821, 0xcf2: 0x097d, 0xcf3: 0x0829, 0xcf4: 0x0391, 0xcf5: 0x0831,
+	0xcf6: 0x099d, 0xcf7: 0x0839, 0xcf8: 0x0841, 0xcf9: 0x0109, 0xcfa: 0x0849, 0xcfb: 0x09bd,
+	0xcfc: 0x0101, 0xcfd: 0x03d9, 0xcfe: 0x02f1, 0xcff: 0x0321,
 	// Block 0x34, offset 0xd00
 	0xd00: 0x0018, 0xd01: 0x0018, 0xd02: 0x0018, 0xd03: 0x0018, 0xd04: 0x0018, 0xd05: 0x0018,
 	0xd06: 0x0018, 0xd07: 0x0018, 0xd08: 0x0018, 0xd09: 0x0018, 0xd0a: 0x0018, 0xd0b: 0x0040,
 	0xd0c: 0x0040, 0xd0d: 0x0040, 0xd0e: 0x0040, 0xd0f: 0x0040, 0xd10: 0x0040, 0xd11: 0x0040,
 	0xd12: 0x0040, 0xd13: 0x0040, 0xd14: 0x0040, 0xd15: 0x0040, 0xd16: 0x0040, 0xd17: 0x0040,
 	0xd18: 0x0040, 0xd19: 0x0040, 0xd1a: 0x0040, 0xd1b: 0x0040, 0xd1c: 0x0040, 0xd1d: 0x0040,
-	0xd1e: 0x0040, 0xd1f: 0x0040, 0xd20: 0x00c9, 0xd21: 0x0069, 0xd22: 0x0079, 0xd23: 0x1f51,
-	0xd24: 0x1f61, 0xd25: 0x1f71, 0xd26: 0x1f81, 0xd27: 0x1f91, 0xd28: 0x1fa1, 0xd29: 0x2601,
-	0xd2a: 0x2619, 0xd2b: 0x2631, 0xd2c: 0x2649, 0xd2d: 0x2661, 0xd2e: 0x2679, 0xd2f: 0x2691,
-	0xd30: 0x26a9, 0xd31: 0x26c1, 0xd32: 0x26d9, 0xd33: 0x26f1, 0xd34: 0x0a1e, 0xd35: 0x0a3e,
+	0xd1e: 0x0040, 0xd1f: 0x0040, 0xd20: 0x0049, 0xd21: 0x0029, 0xd22: 0x0031, 0xd23: 0x06e9,
+	0xd24: 0x06f1, 0xd25: 0x06f9, 0xd26: 0x0701, 0xd27: 0x0709, 0xd28: 0x0711, 0xd29: 0x0879,
+	0xd2a: 0x0881, 0xd2b: 0x0889, 0xd2c: 0x0891, 0xd2d: 0x0899, 0xd2e: 0x08a1, 0xd2f: 0x08a9,
+	0xd30: 0x08b1, 0xd31: 0x08b9, 0xd32: 0x08c1, 0xd33: 0x08c9, 0xd34: 0x0a1e, 0xd35: 0x0a3e,
 	0xd36: 0x0a5e, 0xd37: 0x0a7e, 0xd38: 0x0a9e, 0xd39: 0x0abe, 0xd3a: 0x0ade, 0xd3b: 0x0afe,
-	0xd3c: 0x0b1e, 0xd3d: 0x270a, 0xd3e: 0x2732, 0xd3f: 0x275a,
+	0xd3c: 0x0b1e, 0xd3d: 0x08d2, 0xd3e: 0x08da, 0xd3f: 0x08e2,
 	// Block 0x35, offset 0xd40
-	0xd40: 0x2782, 0xd41: 0x27aa, 0xd42: 0x27d2, 0xd43: 0x27fa, 0xd44: 0x2822, 0xd45: 0x284a,
-	0xd46: 0x2872, 0xd47: 0x289a, 0xd48: 0x0040, 0xd49: 0x0040, 0xd4a: 0x0040, 0xd4b: 0x0040,
+	0xd40: 0x08ea, 0xd41: 0x08f2, 0xd42: 0x08fa, 0xd43: 0x0902, 0xd44: 0x090a, 0xd45: 0x0912,
+	0xd46: 0x091a, 0xd47: 0x0922, 0xd48: 0x0040, 0xd49: 0x0040, 0xd4a: 0x0040, 0xd4b: 0x0040,
 	0xd4c: 0x0040, 0xd4d: 0x0040, 0xd4e: 0x0040, 0xd4f: 0x0040, 0xd50: 0x0040, 0xd51: 0x0040,
 	0xd52: 0x0040, 0xd53: 0x0040, 0xd54: 0x0040, 0xd55: 0x0040, 0xd56: 0x0040, 0xd57: 0x0040,
 	0xd58: 0x0040, 0xd59: 0x0040, 0xd5a: 0x0040, 0xd5b: 0x0040, 0xd5c: 0x0b3e, 0xd5d: 0x0b5e,
@@ -1203,17 +1346,17 @@
 	0xd64: 0x0c3e, 0xd65: 0x0c5e, 0xd66: 0x0c7e, 0xd67: 0x0c9e, 0xd68: 0x0cbe, 0xd69: 0x0cde,
 	0xd6a: 0x0cfe, 0xd6b: 0x0d1e, 0xd6c: 0x0d3e, 0xd6d: 0x0d5e, 0xd6e: 0x0d7e, 0xd6f: 0x0d9e,
 	0xd70: 0x0dbe, 0xd71: 0x0dde, 0xd72: 0x0dfe, 0xd73: 0x0e1e, 0xd74: 0x0e3e, 0xd75: 0x0e5e,
-	0xd76: 0x0039, 0xd77: 0x0ee9, 0xd78: 0x1159, 0xd79: 0x0ef9, 0xd7a: 0x0f09, 0xd7b: 0x1199,
-	0xd7c: 0x0f31, 0xd7d: 0x0249, 0xd7e: 0x0f41, 0xd7f: 0x0259,
+	0xd76: 0x0019, 0xd77: 0x02e9, 0xd78: 0x03d9, 0xd79: 0x02f1, 0xd7a: 0x02f9, 0xd7b: 0x03f1,
+	0xd7c: 0x0309, 0xd7d: 0x00a9, 0xd7e: 0x0311, 0xd7f: 0x00b1,
 	// Block 0x36, offset 0xd80
-	0xd80: 0x0f51, 0xd81: 0x0359, 0xd82: 0x0f61, 0xd83: 0x0f71, 0xd84: 0x00d9, 0xd85: 0x0f99,
-	0xd86: 0x2039, 0xd87: 0x0269, 0xd88: 0x01d9, 0xd89: 0x0fa9, 0xd8a: 0x0fb9, 0xd8b: 0x1089,
-	0xd8c: 0x0279, 0xd8d: 0x0369, 0xd8e: 0x0289, 0xd8f: 0x13d1, 0xd90: 0x0039, 0xd91: 0x0ee9,
-	0xd92: 0x1159, 0xd93: 0x0ef9, 0xd94: 0x0f09, 0xd95: 0x1199, 0xd96: 0x0f31, 0xd97: 0x0249,
-	0xd98: 0x0f41, 0xd99: 0x0259, 0xd9a: 0x0f51, 0xd9b: 0x0359, 0xd9c: 0x0f61, 0xd9d: 0x0f71,
-	0xd9e: 0x00d9, 0xd9f: 0x0f99, 0xda0: 0x2039, 0xda1: 0x0269, 0xda2: 0x01d9, 0xda3: 0x0fa9,
-	0xda4: 0x0fb9, 0xda5: 0x1089, 0xda6: 0x0279, 0xda7: 0x0369, 0xda8: 0x0289, 0xda9: 0x13d1,
-	0xdaa: 0x1f41, 0xdab: 0x0018, 0xdac: 0x0018, 0xdad: 0x0018, 0xdae: 0x0018, 0xdaf: 0x0018,
+	0xd80: 0x0319, 0xd81: 0x0101, 0xd82: 0x0321, 0xd83: 0x0329, 0xd84: 0x0051, 0xd85: 0x0339,
+	0xd86: 0x0751, 0xd87: 0x00b9, 0xd88: 0x0089, 0xd89: 0x0341, 0xd8a: 0x0349, 0xd8b: 0x0391,
+	0xd8c: 0x00c1, 0xd8d: 0x0109, 0xd8e: 0x00c9, 0xd8f: 0x04b1, 0xd90: 0x0019, 0xd91: 0x02e9,
+	0xd92: 0x03d9, 0xd93: 0x02f1, 0xd94: 0x02f9, 0xd95: 0x03f1, 0xd96: 0x0309, 0xd97: 0x00a9,
+	0xd98: 0x0311, 0xd99: 0x00b1, 0xd9a: 0x0319, 0xd9b: 0x0101, 0xd9c: 0x0321, 0xd9d: 0x0329,
+	0xd9e: 0x0051, 0xd9f: 0x0339, 0xda0: 0x0751, 0xda1: 0x00b9, 0xda2: 0x0089, 0xda3: 0x0341,
+	0xda4: 0x0349, 0xda5: 0x0391, 0xda6: 0x00c1, 0xda7: 0x0109, 0xda8: 0x00c9, 0xda9: 0x04b1,
+	0xdaa: 0x06e1, 0xdab: 0x0018, 0xdac: 0x0018, 0xdad: 0x0018, 0xdae: 0x0018, 0xdaf: 0x0018,
 	0xdb0: 0x0018, 0xdb1: 0x0018, 0xdb2: 0x0018, 0xdb3: 0x0018, 0xdb4: 0x0018, 0xdb5: 0x0018,
 	0xdb6: 0x0018, 0xdb7: 0x0018, 0xdb8: 0x0018, 0xdb9: 0x0018, 0xdba: 0x0018, 0xdbb: 0x0018,
 	0xdbc: 0x0018, 0xdbd: 0x0018, 0xdbe: 0x0018, 0xdbf: 0x0018,
@@ -1223,12 +1366,12 @@
 	0xdcc: 0x0008, 0xdcd: 0x0008, 0xdce: 0x0008, 0xdcf: 0x0008, 0xdd0: 0x0008, 0xdd1: 0x0008,
 	0xdd2: 0x0008, 0xdd3: 0x0008, 0xdd4: 0x0008, 0xdd5: 0x0008, 0xdd6: 0x0008, 0xdd7: 0x0008,
 	0xdd8: 0x0008, 0xdd9: 0x0008, 0xdda: 0x0008, 0xddb: 0x0008, 0xddc: 0x0008, 0xddd: 0x0008,
-	0xdde: 0x0008, 0xddf: 0x0040, 0xde0: 0xe00d, 0xde1: 0x0008, 0xde2: 0x2971, 0xde3: 0x0ed5,
-	0xde4: 0x2989, 0xde5: 0x0008, 0xde6: 0x0008, 0xde7: 0xe07d, 0xde8: 0x0008, 0xde9: 0xe01d,
-	0xdea: 0x0008, 0xdeb: 0xe03d, 0xdec: 0x0008, 0xded: 0x0fe1, 0xdee: 0x1281, 0xdef: 0x0fc9,
-	0xdf0: 0x1141, 0xdf1: 0x0008, 0xdf2: 0xe00d, 0xdf3: 0x0008, 0xdf4: 0x0008, 0xdf5: 0xe01d,
+	0xdde: 0x0008, 0xddf: 0x0040, 0xde0: 0xe00d, 0xde1: 0x0008, 0xde2: 0x0941, 0xde3: 0x0ed5,
+	0xde4: 0x0949, 0xde5: 0x0008, 0xde6: 0x0008, 0xde7: 0xe07d, 0xde8: 0x0008, 0xde9: 0xe01d,
+	0xdea: 0x0008, 0xdeb: 0xe03d, 0xdec: 0x0008, 0xded: 0x0359, 0xdee: 0x0441, 0xdef: 0x0351,
+	0xdf0: 0x03d1, 0xdf1: 0x0008, 0xdf2: 0xe00d, 0xdf3: 0x0008, 0xdf4: 0x0008, 0xdf5: 0xe01d,
 	0xdf6: 0x0008, 0xdf7: 0x0008, 0xdf8: 0x0008, 0xdf9: 0x0008, 0xdfa: 0x0008, 0xdfb: 0x0008,
-	0xdfc: 0x0259, 0xdfd: 0x1089, 0xdfe: 0x29a1, 0xdff: 0x29b9,
+	0xdfc: 0x00b1, 0xdfd: 0x0391, 0xdfe: 0x0951, 0xdff: 0x0959,
 	// Block 0x38, offset 0xe00
 	0xe00: 0xe00d, 0xe01: 0x0008, 0xe02: 0xe00d, 0xe03: 0x0008, 0xe04: 0xe00d, 0xe05: 0x0008,
 	0xe06: 0xe00d, 0xe07: 0x0008, 0xe08: 0xe00d, 0xe09: 0x0008, 0xe0a: 0xe00d, 0xe0b: 0x0008,
@@ -1254,7 +1397,7 @@
 	0xe76: 0x0040, 0xe77: 0x0040, 0xe78: 0x0040, 0xe79: 0x0040, 0xe7a: 0x0040, 0xe7b: 0x0040,
 	0xe7c: 0x0040, 0xe7d: 0x0040, 0xe7e: 0x0040, 0xe7f: 0x0040,
 	// Block 0x3a, offset 0xe80
-	0xe80: 0x000a, 0xe81: 0x0018, 0xe82: 0x29d1, 0xe83: 0x0018, 0xe84: 0x0018, 0xe85: 0x0008,
+	0xe80: 0x000a, 0xe81: 0x0018, 0xe82: 0x0961, 0xe83: 0x0018, 0xe84: 0x0018, 0xe85: 0x0008,
 	0xe86: 0x0008, 0xe87: 0x0008, 0xe88: 0x0018, 0xe89: 0x0018, 0xe8a: 0x0018, 0xe8b: 0x0018,
 	0xe8c: 0x0018, 0xe8d: 0x0018, 0xe8e: 0x0018, 0xe8f: 0x0018, 0xe90: 0x0018, 0xe91: 0x0018,
 	0xe92: 0x0018, 0xe93: 0x0018, 0xe94: 0x0018, 0xe95: 0x0018, 0xe96: 0x0018, 0xe97: 0x0018,
@@ -1290,17 +1433,17 @@
 	0xf36: 0x0008, 0xf37: 0x0008, 0xf38: 0x0008, 0xf39: 0x0008, 0xf3a: 0x0008, 0xf3b: 0x0008,
 	0xf3c: 0x0008, 0xf3d: 0x0008, 0xf3e: 0x0008, 0xf3f: 0x0008,
 	// Block 0x3d, offset 0xf40
-	0xf40: 0x36a2, 0xf41: 0x36d2, 0xf42: 0x3702, 0xf43: 0x3732, 0xf44: 0x32d5, 0xf45: 0x32f5,
+	0xf40: 0x0b82, 0xf41: 0x0b8a, 0xf42: 0x0b92, 0xf43: 0x0b9a, 0xf44: 0x32d5, 0xf45: 0x32f5,
 	0xf46: 0x3315, 0xf47: 0x3335, 0xf48: 0x0018, 0xf49: 0x0018, 0xf4a: 0x0018, 0xf4b: 0x0018,
-	0xf4c: 0x0018, 0xf4d: 0x0018, 0xf4e: 0x0018, 0xf4f: 0x0018, 0xf50: 0x3355, 0xf51: 0x3761,
-	0xf52: 0x3779, 0xf53: 0x3791, 0xf54: 0x37a9, 0xf55: 0x37c1, 0xf56: 0x37d9, 0xf57: 0x37f1,
-	0xf58: 0x3809, 0xf59: 0x3821, 0xf5a: 0x3839, 0xf5b: 0x3851, 0xf5c: 0x3869, 0xf5d: 0x3881,
-	0xf5e: 0x3899, 0xf5f: 0x38b1, 0xf60: 0x3375, 0xf61: 0x3395, 0xf62: 0x33b5, 0xf63: 0x33d5,
+	0xf4c: 0x0018, 0xf4d: 0x0018, 0xf4e: 0x0018, 0xf4f: 0x0018, 0xf50: 0x3355, 0xf51: 0x0ba1,
+	0xf52: 0x0ba9, 0xf53: 0x0bb1, 0xf54: 0x0bb9, 0xf55: 0x0bc1, 0xf56: 0x0bc9, 0xf57: 0x0bd1,
+	0xf58: 0x0bd9, 0xf59: 0x0be1, 0xf5a: 0x0be9, 0xf5b: 0x0bf1, 0xf5c: 0x0bf9, 0xf5d: 0x0c01,
+	0xf5e: 0x0c09, 0xf5f: 0x0c11, 0xf60: 0x3375, 0xf61: 0x3395, 0xf62: 0x33b5, 0xf63: 0x33d5,
 	0xf64: 0x33f5, 0xf65: 0x33f5, 0xf66: 0x3415, 0xf67: 0x3435, 0xf68: 0x3455, 0xf69: 0x3475,
 	0xf6a: 0x3495, 0xf6b: 0x34b5, 0xf6c: 0x34d5, 0xf6d: 0x34f5, 0xf6e: 0x3515, 0xf6f: 0x3535,
 	0xf70: 0x3555, 0xf71: 0x3575, 0xf72: 0x3595, 0xf73: 0x35b5, 0xf74: 0x35d5, 0xf75: 0x35f5,
 	0xf76: 0x3615, 0xf77: 0x3635, 0xf78: 0x3655, 0xf79: 0x3675, 0xf7a: 0x3695, 0xf7b: 0x36b5,
-	0xf7c: 0x38c9, 0xf7d: 0x3901, 0xf7e: 0x36d5, 0xf7f: 0x0018,
+	0xf7c: 0x0c19, 0xf7d: 0x0c21, 0xf7e: 0x36d5, 0xf7f: 0x0018,
 	// Block 0x3e, offset 0xf80
 	0xf80: 0x36f5, 0xf81: 0x3715, 0xf82: 0x3735, 0xf83: 0x3755, 0xf84: 0x3775, 0xf85: 0x3795,
 	0xf86: 0x37b5, 0xf87: 0x37d5, 0xf88: 0x37f5, 0xf89: 0x3815, 0xf8a: 0x3835, 0xf8b: 0x3855,
@@ -1310,13 +1453,13 @@
 	0xf9e: 0x3ab5, 0xf9f: 0x3ad5, 0xfa0: 0x3af5, 0xfa1: 0x3b15, 0xfa2: 0x3b35, 0xfa3: 0x3b55,
 	0xfa4: 0x3b75, 0xfa5: 0x3b95, 0xfa6: 0x1295, 0xfa7: 0x3bb5, 0xfa8: 0x3bd5, 0xfa9: 0x3bf5,
 	0xfaa: 0x3c15, 0xfab: 0x3c35, 0xfac: 0x3c55, 0xfad: 0x3c75, 0xfae: 0x23b5, 0xfaf: 0x3c95,
-	0xfb0: 0x3cb5, 0xfb1: 0x3939, 0xfb2: 0x3951, 0xfb3: 0x3969, 0xfb4: 0x3981, 0xfb5: 0x3999,
-	0xfb6: 0x39b1, 0xfb7: 0x39c9, 0xfb8: 0x39e1, 0xfb9: 0x39f9, 0xfba: 0x3a11, 0xfbb: 0x3a29,
-	0xfbc: 0x3a41, 0xfbd: 0x3a59, 0xfbe: 0x3a71, 0xfbf: 0x3a89,
+	0xfb0: 0x3cb5, 0xfb1: 0x0c29, 0xfb2: 0x0c31, 0xfb3: 0x0c39, 0xfb4: 0x0c41, 0xfb5: 0x0c49,
+	0xfb6: 0x0c51, 0xfb7: 0x0c59, 0xfb8: 0x0c61, 0xfb9: 0x0c69, 0xfba: 0x0c71, 0xfbb: 0x0c79,
+	0xfbc: 0x0c81, 0xfbd: 0x0c89, 0xfbe: 0x0c91, 0xfbf: 0x0c99,
 	// Block 0x3f, offset 0xfc0
-	0xfc0: 0x3aa1, 0xfc1: 0x3ac9, 0xfc2: 0x3af1, 0xfc3: 0x3b19, 0xfc4: 0x3b41, 0xfc5: 0x3b69,
-	0xfc6: 0x3b91, 0xfc7: 0x3bb9, 0xfc8: 0x3be1, 0xfc9: 0x3c09, 0xfca: 0x3c39, 0xfcb: 0x3c69,
-	0xfcc: 0x3c99, 0xfcd: 0x3cd5, 0xfce: 0x3cb1, 0xfcf: 0x3cf5, 0xfd0: 0x3d15, 0xfd1: 0x3d2d,
+	0xfc0: 0x0ca1, 0xfc1: 0x0ca9, 0xfc2: 0x0cb1, 0xfc3: 0x0cb9, 0xfc4: 0x0cc1, 0xfc5: 0x0cc9,
+	0xfc6: 0x0cd1, 0xfc7: 0x0cd9, 0xfc8: 0x0ce1, 0xfc9: 0x0ce9, 0xfca: 0x0cf1, 0xfcb: 0x0cf9,
+	0xfcc: 0x0d01, 0xfcd: 0x3cd5, 0xfce: 0x0d09, 0xfcf: 0x3cf5, 0xfd0: 0x3d15, 0xfd1: 0x3d2d,
 	0xfd2: 0x3d45, 0xfd3: 0x3d5d, 0xfd4: 0x3d75, 0xfd5: 0x3d75, 0xfd6: 0x3d5d, 0xfd7: 0x3d8d,
 	0xfd8: 0x07d5, 0xfd9: 0x3da5, 0xfda: 0x3dbd, 0xfdb: 0x3dd5, 0xfdc: 0x3ded, 0xfdd: 0x3e05,
 	0xfde: 0x3e1d, 0xfdf: 0x3e35, 0xfe0: 0x3e4d, 0xfe1: 0x3e65, 0xfe2: 0x3e7d, 0xfe3: 0x3e95,
@@ -1324,769 +1467,769 @@
 	0xfea: 0x3ef5, 0xfeb: 0x3f0d, 0xfec: 0x3f25, 0xfed: 0x3f3d, 0xfee: 0x3f55, 0xfef: 0x3f55,
 	0xff0: 0x3f6d, 0xff1: 0x3f6d, 0xff2: 0x3f6d, 0xff3: 0x3f85, 0xff4: 0x3f9d, 0xff5: 0x3fb5,
 	0xff6: 0x3fcd, 0xff7: 0x3fb5, 0xff8: 0x3fe5, 0xff9: 0x3ffd, 0xffa: 0x3f85, 0xffb: 0x4015,
-	0xffc: 0x402d, 0xffd: 0x402d, 0xffe: 0x402d, 0xfff: 0x3cc9,
+	0xffc: 0x402d, 0xffd: 0x402d, 0xffe: 0x402d, 0xfff: 0x0d11,
 	// Block 0x40, offset 0x1000
-	0x1000: 0x3d01, 0x1001: 0x3d69, 0x1002: 0x3dd1, 0x1003: 0x3e39, 0x1004: 0x3e89, 0x1005: 0x3ef1,
-	0x1006: 0x3f41, 0x1007: 0x3f91, 0x1008: 0x4011, 0x1009: 0x4079, 0x100a: 0x40c9, 0x100b: 0x4119,
-	0x100c: 0x4169, 0x100d: 0x41d1, 0x100e: 0x4239, 0x100f: 0x4289, 0x1010: 0x42d9, 0x1011: 0x4311,
-	0x1012: 0x4361, 0x1013: 0x43c9, 0x1014: 0x4431, 0x1015: 0x4469, 0x1016: 0x44e9, 0x1017: 0x4581,
-	0x1018: 0x4601, 0x1019: 0x4651, 0x101a: 0x46d1, 0x101b: 0x4751, 0x101c: 0x47b9, 0x101d: 0x4809,
-	0x101e: 0x4859, 0x101f: 0x48a9, 0x1020: 0x4911, 0x1021: 0x4991, 0x1022: 0x49f9, 0x1023: 0x4a49,
-	0x1024: 0x4a99, 0x1025: 0x4ae9, 0x1026: 0x4b21, 0x1027: 0x4b59, 0x1028: 0x4b91, 0x1029: 0x4bc9,
-	0x102a: 0x4c19, 0x102b: 0x4c69, 0x102c: 0x4ce9, 0x102d: 0x4d39, 0x102e: 0x4da1, 0x102f: 0x4e21,
-	0x1030: 0x4e71, 0x1031: 0x4ea9, 0x1032: 0x4ee1, 0x1033: 0x4f61, 0x1034: 0x4fc9, 0x1035: 0x5049,
-	0x1036: 0x5099, 0x1037: 0x5119, 0x1038: 0x5151, 0x1039: 0x51a1, 0x103a: 0x51f1, 0x103b: 0x5241,
-	0x103c: 0x5291, 0x103d: 0x52e1, 0x103e: 0x5349, 0x103f: 0x5399,
+	0x1000: 0x10f9, 0x1001: 0x1101, 0x1002: 0x40a5, 0x1003: 0x1109, 0x1004: 0x1111, 0x1005: 0x1119,
+	0x1006: 0x1121, 0x1007: 0x1129, 0x1008: 0x40c5, 0x1009: 0x1131, 0x100a: 0x1139, 0x100b: 0x1141,
+	0x100c: 0x40e5, 0x100d: 0x40e5, 0x100e: 0x1149, 0x100f: 0x1151, 0x1010: 0x1159, 0x1011: 0x4105,
+	0x1012: 0x4125, 0x1013: 0x4145, 0x1014: 0x4165, 0x1015: 0x4185, 0x1016: 0x1161, 0x1017: 0x1169,
+	0x1018: 0x1171, 0x1019: 0x1179, 0x101a: 0x1181, 0x101b: 0x41a5, 0x101c: 0x1189, 0x101d: 0x1191,
+	0x101e: 0x1199, 0x101f: 0x41c5, 0x1020: 0x41e5, 0x1021: 0x11a1, 0x1022: 0x4205, 0x1023: 0x4225,
+	0x1024: 0x4245, 0x1025: 0x11a9, 0x1026: 0x4265, 0x1027: 0x11b1, 0x1028: 0x11b9, 0x1029: 0x10f9,
+	0x102a: 0x4285, 0x102b: 0x42a5, 0x102c: 0x42c5, 0x102d: 0x42e5, 0x102e: 0x11c1, 0x102f: 0x11c9,
+	0x1030: 0x11d1, 0x1031: 0x11d9, 0x1032: 0x4305, 0x1033: 0x11e1, 0x1034: 0x11e9, 0x1035: 0x11f1,
+	0x1036: 0x4325, 0x1037: 0x11f9, 0x1038: 0x1201, 0x1039: 0x11f9, 0x103a: 0x1209, 0x103b: 0x1211,
+	0x103c: 0x4345, 0x103d: 0x1219, 0x103e: 0x1221, 0x103f: 0x1219,
 	// Block 0x41, offset 0x1040
-	0x1040: 0x53d1, 0x1041: 0x5421, 0x1042: 0x5471, 0x1043: 0x54c1, 0x1044: 0x5529, 0x1045: 0x5579,
-	0x1046: 0x55c9, 0x1047: 0x5619, 0x1048: 0x5699, 0x1049: 0x5701, 0x104a: 0x5739, 0x104b: 0x57b9,
-	0x104c: 0x57f1, 0x104d: 0x5859, 0x104e: 0x58c1, 0x104f: 0x5911, 0x1050: 0x5961, 0x1051: 0x59b1,
-	0x1052: 0x5a19, 0x1053: 0x5a51, 0x1054: 0x5aa1, 0x1055: 0x5b09, 0x1056: 0x5b41, 0x1057: 0x5bc1,
-	0x1058: 0x5c11, 0x1059: 0x5c39, 0x105a: 0x5c61, 0x105b: 0x5c89, 0x105c: 0x5cb1, 0x105d: 0x5cd9,
-	0x105e: 0x5d01, 0x105f: 0x5d29, 0x1060: 0x5d51, 0x1061: 0x5d79, 0x1062: 0x5da1, 0x1063: 0x5dd1,
-	0x1064: 0x5e01, 0x1065: 0x5e31, 0x1066: 0x5e61, 0x1067: 0x5e91, 0x1068: 0x5ec1, 0x1069: 0x5ef1,
-	0x106a: 0x5f21, 0x106b: 0x5f51, 0x106c: 0x5f81, 0x106d: 0x5fb1, 0x106e: 0x5fe1, 0x106f: 0x6011,
-	0x1070: 0x6041, 0x1071: 0x4045, 0x1072: 0x6071, 0x1073: 0x6089, 0x1074: 0x4065, 0x1075: 0x60a1,
-	0x1076: 0x60b9, 0x1077: 0x60d1, 0x1078: 0x4085, 0x1079: 0x4085, 0x107a: 0x60e9, 0x107b: 0x6101,
-	0x107c: 0x6139, 0x107d: 0x6171, 0x107e: 0x61a9, 0x107f: 0x61e1,
+	0x1040: 0x4365, 0x1041: 0x4385, 0x1042: 0x0040, 0x1043: 0x1229, 0x1044: 0x1231, 0x1045: 0x1239,
+	0x1046: 0x1241, 0x1047: 0x0040, 0x1048: 0x1249, 0x1049: 0x1251, 0x104a: 0x1259, 0x104b: 0x1261,
+	0x104c: 0x1269, 0x104d: 0x1271, 0x104e: 0x1199, 0x104f: 0x1279, 0x1050: 0x1281, 0x1051: 0x1289,
+	0x1052: 0x43a5, 0x1053: 0x1291, 0x1054: 0x1121, 0x1055: 0x43c5, 0x1056: 0x43e5, 0x1057: 0x1299,
+	0x1058: 0x0040, 0x1059: 0x4405, 0x105a: 0x12a1, 0x105b: 0x12a9, 0x105c: 0x12b1, 0x105d: 0x12b9,
+	0x105e: 0x12c1, 0x105f: 0x12c9, 0x1060: 0x12d1, 0x1061: 0x12d9, 0x1062: 0x12e1, 0x1063: 0x12e9,
+	0x1064: 0x12f1, 0x1065: 0x12f9, 0x1066: 0x1301, 0x1067: 0x1309, 0x1068: 0x1311, 0x1069: 0x1319,
+	0x106a: 0x1321, 0x106b: 0x1329, 0x106c: 0x1331, 0x106d: 0x1339, 0x106e: 0x1341, 0x106f: 0x1349,
+	0x1070: 0x1351, 0x1071: 0x1359, 0x1072: 0x1361, 0x1073: 0x1369, 0x1074: 0x1371, 0x1075: 0x1379,
+	0x1076: 0x1381, 0x1077: 0x1389, 0x1078: 0x1391, 0x1079: 0x1399, 0x107a: 0x13a1, 0x107b: 0x13a9,
+	0x107c: 0x13b1, 0x107d: 0x13b9, 0x107e: 0x13c1, 0x107f: 0x4425,
 	// Block 0x42, offset 0x1080
-	0x1080: 0x6249, 0x1081: 0x6261, 0x1082: 0x40a5, 0x1083: 0x6279, 0x1084: 0x6291, 0x1085: 0x62a9,
-	0x1086: 0x62c1, 0x1087: 0x62d9, 0x1088: 0x40c5, 0x1089: 0x62f1, 0x108a: 0x6319, 0x108b: 0x6331,
-	0x108c: 0x40e5, 0x108d: 0x40e5, 0x108e: 0x6349, 0x108f: 0x6361, 0x1090: 0x6379, 0x1091: 0x4105,
-	0x1092: 0x4125, 0x1093: 0x4145, 0x1094: 0x4165, 0x1095: 0x4185, 0x1096: 0x6391, 0x1097: 0x63a9,
-	0x1098: 0x63c1, 0x1099: 0x63d9, 0x109a: 0x63f1, 0x109b: 0x41a5, 0x109c: 0x6409, 0x109d: 0x6421,
-	0x109e: 0x6439, 0x109f: 0x41c5, 0x10a0: 0x41e5, 0x10a1: 0x6451, 0x10a2: 0x4205, 0x10a3: 0x4225,
-	0x10a4: 0x4245, 0x10a5: 0x6469, 0x10a6: 0x4265, 0x10a7: 0x6481, 0x10a8: 0x64b1, 0x10a9: 0x6249,
-	0x10aa: 0x4285, 0x10ab: 0x42a5, 0x10ac: 0x42c5, 0x10ad: 0x42e5, 0x10ae: 0x64e9, 0x10af: 0x6529,
-	0x10b0: 0x6571, 0x10b1: 0x6589, 0x10b2: 0x4305, 0x10b3: 0x65a1, 0x10b4: 0x65b9, 0x10b5: 0x65d1,
-	0x10b6: 0x4325, 0x10b7: 0x65e9, 0x10b8: 0x6601, 0x10b9: 0x65e9, 0x10ba: 0x6619, 0x10bb: 0x6631,
-	0x10bc: 0x4345, 0x10bd: 0x6649, 0x10be: 0x6661, 0x10bf: 0x6649,
+	0x1080: 0xe00d, 0x1081: 0x0008, 0x1082: 0xe00d, 0x1083: 0x0008, 0x1084: 0xe00d, 0x1085: 0x0008,
+	0x1086: 0xe00d, 0x1087: 0x0008, 0x1088: 0xe00d, 0x1089: 0x0008, 0x108a: 0xe00d, 0x108b: 0x0008,
+	0x108c: 0xe00d, 0x108d: 0x0008, 0x108e: 0xe00d, 0x108f: 0x0008, 0x1090: 0xe00d, 0x1091: 0x0008,
+	0x1092: 0xe00d, 0x1093: 0x0008, 0x1094: 0xe00d, 0x1095: 0x0008, 0x1096: 0xe00d, 0x1097: 0x0008,
+	0x1098: 0xe00d, 0x1099: 0x0008, 0x109a: 0xe00d, 0x109b: 0x0008, 0x109c: 0xe00d, 0x109d: 0x0008,
+	0x109e: 0xe00d, 0x109f: 0x0008, 0x10a0: 0xe00d, 0x10a1: 0x0008, 0x10a2: 0xe00d, 0x10a3: 0x0008,
+	0x10a4: 0xe00d, 0x10a5: 0x0008, 0x10a6: 0xe00d, 0x10a7: 0x0008, 0x10a8: 0xe00d, 0x10a9: 0x0008,
+	0x10aa: 0xe00d, 0x10ab: 0x0008, 0x10ac: 0xe00d, 0x10ad: 0x0008, 0x10ae: 0x0008, 0x10af: 0x3308,
+	0x10b0: 0x3318, 0x10b1: 0x3318, 0x10b2: 0x3318, 0x10b3: 0x0018, 0x10b4: 0x3308, 0x10b5: 0x3308,
+	0x10b6: 0x3308, 0x10b7: 0x3308, 0x10b8: 0x3308, 0x10b9: 0x3308, 0x10ba: 0x3308, 0x10bb: 0x3308,
+	0x10bc: 0x3308, 0x10bd: 0x3308, 0x10be: 0x0018, 0x10bf: 0x0008,
 	// Block 0x43, offset 0x10c0
-	0x10c0: 0x4365, 0x10c1: 0x4385, 0x10c2: 0x0040, 0x10c3: 0x6679, 0x10c4: 0x6691, 0x10c5: 0x66a9,
-	0x10c6: 0x66c1, 0x10c7: 0x0040, 0x10c8: 0x66f9, 0x10c9: 0x6711, 0x10ca: 0x6729, 0x10cb: 0x6741,
-	0x10cc: 0x6759, 0x10cd: 0x6771, 0x10ce: 0x6439, 0x10cf: 0x6789, 0x10d0: 0x67a1, 0x10d1: 0x67b9,
-	0x10d2: 0x43a5, 0x10d3: 0x67d1, 0x10d4: 0x62c1, 0x10d5: 0x43c5, 0x10d6: 0x43e5, 0x10d7: 0x67e9,
-	0x10d8: 0x0040, 0x10d9: 0x4405, 0x10da: 0x6801, 0x10db: 0x6819, 0x10dc: 0x6831, 0x10dd: 0x6849,
-	0x10de: 0x6861, 0x10df: 0x6891, 0x10e0: 0x68c1, 0x10e1: 0x68e9, 0x10e2: 0x6911, 0x10e3: 0x6939,
-	0x10e4: 0x6961, 0x10e5: 0x6989, 0x10e6: 0x69b1, 0x10e7: 0x69d9, 0x10e8: 0x6a01, 0x10e9: 0x6a29,
-	0x10ea: 0x6a59, 0x10eb: 0x6a89, 0x10ec: 0x6ab9, 0x10ed: 0x6ae9, 0x10ee: 0x6b19, 0x10ef: 0x6b49,
-	0x10f0: 0x6b79, 0x10f1: 0x6ba9, 0x10f2: 0x6bd9, 0x10f3: 0x6c09, 0x10f4: 0x6c39, 0x10f5: 0x6c69,
-	0x10f6: 0x6c99, 0x10f7: 0x6cc9, 0x10f8: 0x6cf9, 0x10f9: 0x6d29, 0x10fa: 0x6d59, 0x10fb: 0x6d89,
-	0x10fc: 0x6db9, 0x10fd: 0x6de9, 0x10fe: 0x6e19, 0x10ff: 0x4425,
+	0x10c0: 0xe00d, 0x10c1: 0x0008, 0x10c2: 0xe00d, 0x10c3: 0x0008, 0x10c4: 0xe00d, 0x10c5: 0x0008,
+	0x10c6: 0xe00d, 0x10c7: 0x0008, 0x10c8: 0xe00d, 0x10c9: 0x0008, 0x10ca: 0xe00d, 0x10cb: 0x0008,
+	0x10cc: 0xe00d, 0x10cd: 0x0008, 0x10ce: 0xe00d, 0x10cf: 0x0008, 0x10d0: 0xe00d, 0x10d1: 0x0008,
+	0x10d2: 0xe00d, 0x10d3: 0x0008, 0x10d4: 0xe00d, 0x10d5: 0x0008, 0x10d6: 0xe00d, 0x10d7: 0x0008,
+	0x10d8: 0xe00d, 0x10d9: 0x0008, 0x10da: 0xe00d, 0x10db: 0x0008, 0x10dc: 0x02d1, 0x10dd: 0x13c9,
+	0x10de: 0x3308, 0x10df: 0x3308, 0x10e0: 0x0008, 0x10e1: 0x0008, 0x10e2: 0x0008, 0x10e3: 0x0008,
+	0x10e4: 0x0008, 0x10e5: 0x0008, 0x10e6: 0x0008, 0x10e7: 0x0008, 0x10e8: 0x0008, 0x10e9: 0x0008,
+	0x10ea: 0x0008, 0x10eb: 0x0008, 0x10ec: 0x0008, 0x10ed: 0x0008, 0x10ee: 0x0008, 0x10ef: 0x0008,
+	0x10f0: 0x0008, 0x10f1: 0x0008, 0x10f2: 0x0008, 0x10f3: 0x0008, 0x10f4: 0x0008, 0x10f5: 0x0008,
+	0x10f6: 0x0008, 0x10f7: 0x0008, 0x10f8: 0x0008, 0x10f9: 0x0008, 0x10fa: 0x0008, 0x10fb: 0x0008,
+	0x10fc: 0x0008, 0x10fd: 0x0008, 0x10fe: 0x0008, 0x10ff: 0x0008,
 	// Block 0x44, offset 0x1100
-	0x1100: 0xe00d, 0x1101: 0x0008, 0x1102: 0xe00d, 0x1103: 0x0008, 0x1104: 0xe00d, 0x1105: 0x0008,
-	0x1106: 0xe00d, 0x1107: 0x0008, 0x1108: 0xe00d, 0x1109: 0x0008, 0x110a: 0xe00d, 0x110b: 0x0008,
-	0x110c: 0xe00d, 0x110d: 0x0008, 0x110e: 0xe00d, 0x110f: 0x0008, 0x1110: 0xe00d, 0x1111: 0x0008,
-	0x1112: 0xe00d, 0x1113: 0x0008, 0x1114: 0xe00d, 0x1115: 0x0008, 0x1116: 0xe00d, 0x1117: 0x0008,
-	0x1118: 0xe00d, 0x1119: 0x0008, 0x111a: 0xe00d, 0x111b: 0x0008, 0x111c: 0xe00d, 0x111d: 0x0008,
-	0x111e: 0xe00d, 0x111f: 0x0008, 0x1120: 0xe00d, 0x1121: 0x0008, 0x1122: 0xe00d, 0x1123: 0x0008,
+	0x1100: 0x0018, 0x1101: 0x0018, 0x1102: 0x0018, 0x1103: 0x0018, 0x1104: 0x0018, 0x1105: 0x0018,
+	0x1106: 0x0018, 0x1107: 0x0018, 0x1108: 0x0018, 0x1109: 0x0018, 0x110a: 0x0018, 0x110b: 0x0018,
+	0x110c: 0x0018, 0x110d: 0x0018, 0x110e: 0x0018, 0x110f: 0x0018, 0x1110: 0x0018, 0x1111: 0x0018,
+	0x1112: 0x0018, 0x1113: 0x0018, 0x1114: 0x0018, 0x1115: 0x0018, 0x1116: 0x0018, 0x1117: 0x0008,
+	0x1118: 0x0008, 0x1119: 0x0008, 0x111a: 0x0008, 0x111b: 0x0008, 0x111c: 0x0008, 0x111d: 0x0008,
+	0x111e: 0x0008, 0x111f: 0x0008, 0x1120: 0x0018, 0x1121: 0x0018, 0x1122: 0xe00d, 0x1123: 0x0008,
 	0x1124: 0xe00d, 0x1125: 0x0008, 0x1126: 0xe00d, 0x1127: 0x0008, 0x1128: 0xe00d, 0x1129: 0x0008,
-	0x112a: 0xe00d, 0x112b: 0x0008, 0x112c: 0xe00d, 0x112d: 0x0008, 0x112e: 0x0008, 0x112f: 0x3308,
-	0x1130: 0x3318, 0x1131: 0x3318, 0x1132: 0x3318, 0x1133: 0x0018, 0x1134: 0x3308, 0x1135: 0x3308,
-	0x1136: 0x3308, 0x1137: 0x3308, 0x1138: 0x3308, 0x1139: 0x3308, 0x113a: 0x3308, 0x113b: 0x3308,
-	0x113c: 0x3308, 0x113d: 0x3308, 0x113e: 0x0018, 0x113f: 0x0008,
+	0x112a: 0xe00d, 0x112b: 0x0008, 0x112c: 0xe00d, 0x112d: 0x0008, 0x112e: 0xe00d, 0x112f: 0x0008,
+	0x1130: 0x0008, 0x1131: 0x0008, 0x1132: 0xe00d, 0x1133: 0x0008, 0x1134: 0xe00d, 0x1135: 0x0008,
+	0x1136: 0xe00d, 0x1137: 0x0008, 0x1138: 0xe00d, 0x1139: 0x0008, 0x113a: 0xe00d, 0x113b: 0x0008,
+	0x113c: 0xe00d, 0x113d: 0x0008, 0x113e: 0xe00d, 0x113f: 0x0008,
 	// Block 0x45, offset 0x1140
 	0x1140: 0xe00d, 0x1141: 0x0008, 0x1142: 0xe00d, 0x1143: 0x0008, 0x1144: 0xe00d, 0x1145: 0x0008,
 	0x1146: 0xe00d, 0x1147: 0x0008, 0x1148: 0xe00d, 0x1149: 0x0008, 0x114a: 0xe00d, 0x114b: 0x0008,
 	0x114c: 0xe00d, 0x114d: 0x0008, 0x114e: 0xe00d, 0x114f: 0x0008, 0x1150: 0xe00d, 0x1151: 0x0008,
 	0x1152: 0xe00d, 0x1153: 0x0008, 0x1154: 0xe00d, 0x1155: 0x0008, 0x1156: 0xe00d, 0x1157: 0x0008,
-	0x1158: 0xe00d, 0x1159: 0x0008, 0x115a: 0xe00d, 0x115b: 0x0008, 0x115c: 0x0ea1, 0x115d: 0x6e49,
-	0x115e: 0x3308, 0x115f: 0x3308, 0x1160: 0x0008, 0x1161: 0x0008, 0x1162: 0x0008, 0x1163: 0x0008,
-	0x1164: 0x0008, 0x1165: 0x0008, 0x1166: 0x0008, 0x1167: 0x0008, 0x1168: 0x0008, 0x1169: 0x0008,
-	0x116a: 0x0008, 0x116b: 0x0008, 0x116c: 0x0008, 0x116d: 0x0008, 0x116e: 0x0008, 0x116f: 0x0008,
-	0x1170: 0x0008, 0x1171: 0x0008, 0x1172: 0x0008, 0x1173: 0x0008, 0x1174: 0x0008, 0x1175: 0x0008,
-	0x1176: 0x0008, 0x1177: 0x0008, 0x1178: 0x0008, 0x1179: 0x0008, 0x117a: 0x0008, 0x117b: 0x0008,
-	0x117c: 0x0008, 0x117d: 0x0008, 0x117e: 0x0008, 0x117f: 0x0008,
+	0x1158: 0xe00d, 0x1159: 0x0008, 0x115a: 0xe00d, 0x115b: 0x0008, 0x115c: 0xe00d, 0x115d: 0x0008,
+	0x115e: 0xe00d, 0x115f: 0x0008, 0x1160: 0xe00d, 0x1161: 0x0008, 0x1162: 0xe00d, 0x1163: 0x0008,
+	0x1164: 0xe00d, 0x1165: 0x0008, 0x1166: 0xe00d, 0x1167: 0x0008, 0x1168: 0xe00d, 0x1169: 0x0008,
+	0x116a: 0xe00d, 0x116b: 0x0008, 0x116c: 0xe00d, 0x116d: 0x0008, 0x116e: 0xe00d, 0x116f: 0x0008,
+	0x1170: 0xe0fd, 0x1171: 0x0008, 0x1172: 0x0008, 0x1173: 0x0008, 0x1174: 0x0008, 0x1175: 0x0008,
+	0x1176: 0x0008, 0x1177: 0x0008, 0x1178: 0x0008, 0x1179: 0xe01d, 0x117a: 0x0008, 0x117b: 0xe03d,
+	0x117c: 0x0008, 0x117d: 0x4445, 0x117e: 0xe00d, 0x117f: 0x0008,
 	// Block 0x46, offset 0x1180
-	0x1180: 0x0018, 0x1181: 0x0018, 0x1182: 0x0018, 0x1183: 0x0018, 0x1184: 0x0018, 0x1185: 0x0018,
-	0x1186: 0x0018, 0x1187: 0x0018, 0x1188: 0x0018, 0x1189: 0x0018, 0x118a: 0x0018, 0x118b: 0x0018,
-	0x118c: 0x0018, 0x118d: 0x0018, 0x118e: 0x0018, 0x118f: 0x0018, 0x1190: 0x0018, 0x1191: 0x0018,
-	0x1192: 0x0018, 0x1193: 0x0018, 0x1194: 0x0018, 0x1195: 0x0018, 0x1196: 0x0018, 0x1197: 0x0008,
-	0x1198: 0x0008, 0x1199: 0x0008, 0x119a: 0x0008, 0x119b: 0x0008, 0x119c: 0x0008, 0x119d: 0x0008,
-	0x119e: 0x0008, 0x119f: 0x0008, 0x11a0: 0x0018, 0x11a1: 0x0018, 0x11a2: 0xe00d, 0x11a3: 0x0008,
+	0x1180: 0xe00d, 0x1181: 0x0008, 0x1182: 0xe00d, 0x1183: 0x0008, 0x1184: 0xe00d, 0x1185: 0x0008,
+	0x1186: 0xe00d, 0x1187: 0x0008, 0x1188: 0x0008, 0x1189: 0x0018, 0x118a: 0x0018, 0x118b: 0xe03d,
+	0x118c: 0x0008, 0x118d: 0x0409, 0x118e: 0x0008, 0x118f: 0x0008, 0x1190: 0xe00d, 0x1191: 0x0008,
+	0x1192: 0xe00d, 0x1193: 0x0008, 0x1194: 0x0008, 0x1195: 0x0008, 0x1196: 0xe00d, 0x1197: 0x0008,
+	0x1198: 0xe00d, 0x1199: 0x0008, 0x119a: 0xe00d, 0x119b: 0x0008, 0x119c: 0xe00d, 0x119d: 0x0008,
+	0x119e: 0xe00d, 0x119f: 0x0008, 0x11a0: 0xe00d, 0x11a1: 0x0008, 0x11a2: 0xe00d, 0x11a3: 0x0008,
 	0x11a4: 0xe00d, 0x11a5: 0x0008, 0x11a6: 0xe00d, 0x11a7: 0x0008, 0x11a8: 0xe00d, 0x11a9: 0x0008,
-	0x11aa: 0xe00d, 0x11ab: 0x0008, 0x11ac: 0xe00d, 0x11ad: 0x0008, 0x11ae: 0xe00d, 0x11af: 0x0008,
-	0x11b0: 0x0008, 0x11b1: 0x0008, 0x11b2: 0xe00d, 0x11b3: 0x0008, 0x11b4: 0xe00d, 0x11b5: 0x0008,
+	0x11aa: 0x13d1, 0x11ab: 0x0371, 0x11ac: 0x0401, 0x11ad: 0x13d9, 0x11ae: 0x0421, 0x11af: 0x0008,
+	0x11b0: 0x13e1, 0x11b1: 0x13e9, 0x11b2: 0x0429, 0x11b3: 0x4465, 0x11b4: 0xe00d, 0x11b5: 0x0008,
 	0x11b6: 0xe00d, 0x11b7: 0x0008, 0x11b8: 0xe00d, 0x11b9: 0x0008, 0x11ba: 0xe00d, 0x11bb: 0x0008,
 	0x11bc: 0xe00d, 0x11bd: 0x0008, 0x11be: 0xe00d, 0x11bf: 0x0008,
 	// Block 0x47, offset 0x11c0
-	0x11c0: 0xe00d, 0x11c1: 0x0008, 0x11c2: 0xe00d, 0x11c3: 0x0008, 0x11c4: 0xe00d, 0x11c5: 0x0008,
-	0x11c6: 0xe00d, 0x11c7: 0x0008, 0x11c8: 0xe00d, 0x11c9: 0x0008, 0x11ca: 0xe00d, 0x11cb: 0x0008,
-	0x11cc: 0xe00d, 0x11cd: 0x0008, 0x11ce: 0xe00d, 0x11cf: 0x0008, 0x11d0: 0xe00d, 0x11d1: 0x0008,
-	0x11d2: 0xe00d, 0x11d3: 0x0008, 0x11d4: 0xe00d, 0x11d5: 0x0008, 0x11d6: 0xe00d, 0x11d7: 0x0008,
-	0x11d8: 0xe00d, 0x11d9: 0x0008, 0x11da: 0xe00d, 0x11db: 0x0008, 0x11dc: 0xe00d, 0x11dd: 0x0008,
-	0x11de: 0xe00d, 0x11df: 0x0008, 0x11e0: 0xe00d, 0x11e1: 0x0008, 0x11e2: 0xe00d, 0x11e3: 0x0008,
-	0x11e4: 0xe00d, 0x11e5: 0x0008, 0x11e6: 0xe00d, 0x11e7: 0x0008, 0x11e8: 0xe00d, 0x11e9: 0x0008,
-	0x11ea: 0xe00d, 0x11eb: 0x0008, 0x11ec: 0xe00d, 0x11ed: 0x0008, 0x11ee: 0xe00d, 0x11ef: 0x0008,
-	0x11f0: 0xe0fd, 0x11f1: 0x0008, 0x11f2: 0x0008, 0x11f3: 0x0008, 0x11f4: 0x0008, 0x11f5: 0x0008,
-	0x11f6: 0x0008, 0x11f7: 0x0008, 0x11f8: 0x0008, 0x11f9: 0xe01d, 0x11fa: 0x0008, 0x11fb: 0xe03d,
-	0x11fc: 0x0008, 0x11fd: 0x4445, 0x11fe: 0xe00d, 0x11ff: 0x0008,
+	0x11c0: 0x650d, 0x11c1: 0x652d, 0x11c2: 0x654d, 0x11c3: 0x656d, 0x11c4: 0x658d, 0x11c5: 0x65ad,
+	0x11c6: 0x65cd, 0x11c7: 0x65ed, 0x11c8: 0x660d, 0x11c9: 0x662d, 0x11ca: 0x664d, 0x11cb: 0x666d,
+	0x11cc: 0x668d, 0x11cd: 0x66ad, 0x11ce: 0x0008, 0x11cf: 0x0008, 0x11d0: 0x66cd, 0x11d1: 0x0008,
+	0x11d2: 0x66ed, 0x11d3: 0x0008, 0x11d4: 0x0008, 0x11d5: 0x670d, 0x11d6: 0x672d, 0x11d7: 0x674d,
+	0x11d8: 0x676d, 0x11d9: 0x678d, 0x11da: 0x67ad, 0x11db: 0x67cd, 0x11dc: 0x67ed, 0x11dd: 0x680d,
+	0x11de: 0x682d, 0x11df: 0x0008, 0x11e0: 0x684d, 0x11e1: 0x0008, 0x11e2: 0x686d, 0x11e3: 0x0008,
+	0x11e4: 0x0008, 0x11e5: 0x688d, 0x11e6: 0x68ad, 0x11e7: 0x0008, 0x11e8: 0x0008, 0x11e9: 0x0008,
+	0x11ea: 0x68cd, 0x11eb: 0x68ed, 0x11ec: 0x690d, 0x11ed: 0x692d, 0x11ee: 0x694d, 0x11ef: 0x696d,
+	0x11f0: 0x698d, 0x11f1: 0x69ad, 0x11f2: 0x69cd, 0x11f3: 0x69ed, 0x11f4: 0x6a0d, 0x11f5: 0x6a2d,
+	0x11f6: 0x6a4d, 0x11f7: 0x6a6d, 0x11f8: 0x6a8d, 0x11f9: 0x6aad, 0x11fa: 0x6acd, 0x11fb: 0x6aed,
+	0x11fc: 0x6b0d, 0x11fd: 0x6b2d, 0x11fe: 0x6b4d, 0x11ff: 0x6b6d,
 	// Block 0x48, offset 0x1200
-	0x1200: 0xe00d, 0x1201: 0x0008, 0x1202: 0xe00d, 0x1203: 0x0008, 0x1204: 0xe00d, 0x1205: 0x0008,
-	0x1206: 0xe00d, 0x1207: 0x0008, 0x1208: 0x0008, 0x1209: 0x0018, 0x120a: 0x0018, 0x120b: 0xe03d,
-	0x120c: 0x0008, 0x120d: 0x11d9, 0x120e: 0x0008, 0x120f: 0x0008, 0x1210: 0xe00d, 0x1211: 0x0008,
-	0x1212: 0xe00d, 0x1213: 0x0008, 0x1214: 0x0008, 0x1215: 0x0008, 0x1216: 0xe00d, 0x1217: 0x0008,
-	0x1218: 0xe00d, 0x1219: 0x0008, 0x121a: 0xe00d, 0x121b: 0x0008, 0x121c: 0xe00d, 0x121d: 0x0008,
-	0x121e: 0xe00d, 0x121f: 0x0008, 0x1220: 0xe00d, 0x1221: 0x0008, 0x1222: 0xe00d, 0x1223: 0x0008,
-	0x1224: 0xe00d, 0x1225: 0x0008, 0x1226: 0xe00d, 0x1227: 0x0008, 0x1228: 0xe00d, 0x1229: 0x0008,
-	0x122a: 0x6e61, 0x122b: 0x1029, 0x122c: 0x11c1, 0x122d: 0x6e79, 0x122e: 0x1221, 0x122f: 0x0008,
-	0x1230: 0x6e91, 0x1231: 0x6ea9, 0x1232: 0x1239, 0x1233: 0x4465, 0x1234: 0xe00d, 0x1235: 0x0008,
-	0x1236: 0xe00d, 0x1237: 0x0008, 0x1238: 0xe00d, 0x1239: 0x0008, 0x123a: 0xe00d, 0x123b: 0x0008,
-	0x123c: 0xe00d, 0x123d: 0x0008, 0x123e: 0xe00d, 0x123f: 0x0008,
+	0x1200: 0x7acd, 0x1201: 0x7aed, 0x1202: 0x7b0d, 0x1203: 0x7b2d, 0x1204: 0x7b4d, 0x1205: 0x7b6d,
+	0x1206: 0x7b8d, 0x1207: 0x7bad, 0x1208: 0x7bcd, 0x1209: 0x7bed, 0x120a: 0x7c0d, 0x120b: 0x7c2d,
+	0x120c: 0x7c4d, 0x120d: 0x7c6d, 0x120e: 0x7c8d, 0x120f: 0x1409, 0x1210: 0x1411, 0x1211: 0x1419,
+	0x1212: 0x7cad, 0x1213: 0x7ccd, 0x1214: 0x7ced, 0x1215: 0x1421, 0x1216: 0x1429, 0x1217: 0x1431,
+	0x1218: 0x7d0d, 0x1219: 0x7d2d, 0x121a: 0x0040, 0x121b: 0x0040, 0x121c: 0x0040, 0x121d: 0x0040,
+	0x121e: 0x0040, 0x121f: 0x0040, 0x1220: 0x0040, 0x1221: 0x0040, 0x1222: 0x0040, 0x1223: 0x0040,
+	0x1224: 0x0040, 0x1225: 0x0040, 0x1226: 0x0040, 0x1227: 0x0040, 0x1228: 0x0040, 0x1229: 0x0040,
+	0x122a: 0x0040, 0x122b: 0x0040, 0x122c: 0x0040, 0x122d: 0x0040, 0x122e: 0x0040, 0x122f: 0x0040,
+	0x1230: 0x0040, 0x1231: 0x0040, 0x1232: 0x0040, 0x1233: 0x0040, 0x1234: 0x0040, 0x1235: 0x0040,
+	0x1236: 0x0040, 0x1237: 0x0040, 0x1238: 0x0040, 0x1239: 0x0040, 0x123a: 0x0040, 0x123b: 0x0040,
+	0x123c: 0x0040, 0x123d: 0x0040, 0x123e: 0x0040, 0x123f: 0x0040,
 	// Block 0x49, offset 0x1240
-	0x1240: 0x650d, 0x1241: 0x652d, 0x1242: 0x654d, 0x1243: 0x656d, 0x1244: 0x658d, 0x1245: 0x65ad,
-	0x1246: 0x65cd, 0x1247: 0x65ed, 0x1248: 0x660d, 0x1249: 0x662d, 0x124a: 0x664d, 0x124b: 0x666d,
-	0x124c: 0x668d, 0x124d: 0x66ad, 0x124e: 0x0008, 0x124f: 0x0008, 0x1250: 0x66cd, 0x1251: 0x0008,
-	0x1252: 0x66ed, 0x1253: 0x0008, 0x1254: 0x0008, 0x1255: 0x670d, 0x1256: 0x672d, 0x1257: 0x674d,
-	0x1258: 0x676d, 0x1259: 0x678d, 0x125a: 0x67ad, 0x125b: 0x67cd, 0x125c: 0x67ed, 0x125d: 0x680d,
-	0x125e: 0x682d, 0x125f: 0x0008, 0x1260: 0x684d, 0x1261: 0x0008, 0x1262: 0x686d, 0x1263: 0x0008,
-	0x1264: 0x0008, 0x1265: 0x688d, 0x1266: 0x68ad, 0x1267: 0x0008, 0x1268: 0x0008, 0x1269: 0x0008,
-	0x126a: 0x68cd, 0x126b: 0x68ed, 0x126c: 0x690d, 0x126d: 0x692d, 0x126e: 0x694d, 0x126f: 0x696d,
-	0x1270: 0x698d, 0x1271: 0x69ad, 0x1272: 0x69cd, 0x1273: 0x69ed, 0x1274: 0x6a0d, 0x1275: 0x6a2d,
-	0x1276: 0x6a4d, 0x1277: 0x6a6d, 0x1278: 0x6a8d, 0x1279: 0x6aad, 0x127a: 0x6acd, 0x127b: 0x6aed,
-	0x127c: 0x6b0d, 0x127d: 0x6b2d, 0x127e: 0x6b4d, 0x127f: 0x6b6d,
+	0x1240: 0x1439, 0x1241: 0x1441, 0x1242: 0x1449, 0x1243: 0x7d4d, 0x1244: 0x7d6d, 0x1245: 0x1451,
+	0x1246: 0x1451, 0x1247: 0x0040, 0x1248: 0x0040, 0x1249: 0x0040, 0x124a: 0x0040, 0x124b: 0x0040,
+	0x124c: 0x0040, 0x124d: 0x0040, 0x124e: 0x0040, 0x124f: 0x0040, 0x1250: 0x0040, 0x1251: 0x0040,
+	0x1252: 0x0040, 0x1253: 0x1459, 0x1254: 0x1461, 0x1255: 0x1469, 0x1256: 0x1471, 0x1257: 0x1479,
+	0x1258: 0x0040, 0x1259: 0x0040, 0x125a: 0x0040, 0x125b: 0x0040, 0x125c: 0x0040, 0x125d: 0x1481,
+	0x125e: 0x3308, 0x125f: 0x1489, 0x1260: 0x1491, 0x1261: 0x0779, 0x1262: 0x0791, 0x1263: 0x1499,
+	0x1264: 0x14a1, 0x1265: 0x14a9, 0x1266: 0x14b1, 0x1267: 0x14b9, 0x1268: 0x14c1, 0x1269: 0x071a,
+	0x126a: 0x14c9, 0x126b: 0x14d1, 0x126c: 0x14d9, 0x126d: 0x14e1, 0x126e: 0x14e9, 0x126f: 0x14f1,
+	0x1270: 0x14f9, 0x1271: 0x1501, 0x1272: 0x1509, 0x1273: 0x1511, 0x1274: 0x1519, 0x1275: 0x1521,
+	0x1276: 0x1529, 0x1277: 0x0040, 0x1278: 0x1531, 0x1279: 0x1539, 0x127a: 0x1541, 0x127b: 0x1549,
+	0x127c: 0x1551, 0x127d: 0x0040, 0x127e: 0x1559, 0x127f: 0x0040,
 	// Block 0x4a, offset 0x1280
-	0x1280: 0x7acd, 0x1281: 0x7aed, 0x1282: 0x7b0d, 0x1283: 0x7b2d, 0x1284: 0x7b4d, 0x1285: 0x7b6d,
-	0x1286: 0x7b8d, 0x1287: 0x7bad, 0x1288: 0x7bcd, 0x1289: 0x7bed, 0x128a: 0x7c0d, 0x128b: 0x7c2d,
-	0x128c: 0x7c4d, 0x128d: 0x7c6d, 0x128e: 0x7c8d, 0x128f: 0x6f19, 0x1290: 0x6f41, 0x1291: 0x6f69,
-	0x1292: 0x7cad, 0x1293: 0x7ccd, 0x1294: 0x7ced, 0x1295: 0x6f91, 0x1296: 0x6fb9, 0x1297: 0x6fe1,
-	0x1298: 0x7d0d, 0x1299: 0x7d2d, 0x129a: 0x0040, 0x129b: 0x0040, 0x129c: 0x0040, 0x129d: 0x0040,
-	0x129e: 0x0040, 0x129f: 0x0040, 0x12a0: 0x0040, 0x12a1: 0x0040, 0x12a2: 0x0040, 0x12a3: 0x0040,
-	0x12a4: 0x0040, 0x12a5: 0x0040, 0x12a6: 0x0040, 0x12a7: 0x0040, 0x12a8: 0x0040, 0x12a9: 0x0040,
-	0x12aa: 0x0040, 0x12ab: 0x0040, 0x12ac: 0x0040, 0x12ad: 0x0040, 0x12ae: 0x0040, 0x12af: 0x0040,
-	0x12b0: 0x0040, 0x12b1: 0x0040, 0x12b2: 0x0040, 0x12b3: 0x0040, 0x12b4: 0x0040, 0x12b5: 0x0040,
-	0x12b6: 0x0040, 0x12b7: 0x0040, 0x12b8: 0x0040, 0x12b9: 0x0040, 0x12ba: 0x0040, 0x12bb: 0x0040,
-	0x12bc: 0x0040, 0x12bd: 0x0040, 0x12be: 0x0040, 0x12bf: 0x0040,
+	0x1280: 0x1561, 0x1281: 0x1569, 0x1282: 0x0040, 0x1283: 0x1571, 0x1284: 0x1579, 0x1285: 0x0040,
+	0x1286: 0x1581, 0x1287: 0x1589, 0x1288: 0x1591, 0x1289: 0x1599, 0x128a: 0x15a1, 0x128b: 0x15a9,
+	0x128c: 0x15b1, 0x128d: 0x15b9, 0x128e: 0x15c1, 0x128f: 0x15c9, 0x1290: 0x15d1, 0x1291: 0x15d1,
+	0x1292: 0x15d9, 0x1293: 0x15d9, 0x1294: 0x15d9, 0x1295: 0x15d9, 0x1296: 0x15e1, 0x1297: 0x15e1,
+	0x1298: 0x15e1, 0x1299: 0x15e1, 0x129a: 0x15e9, 0x129b: 0x15e9, 0x129c: 0x15e9, 0x129d: 0x15e9,
+	0x129e: 0x15f1, 0x129f: 0x15f1, 0x12a0: 0x15f1, 0x12a1: 0x15f1, 0x12a2: 0x15f9, 0x12a3: 0x15f9,
+	0x12a4: 0x15f9, 0x12a5: 0x15f9, 0x12a6: 0x1601, 0x12a7: 0x1601, 0x12a8: 0x1601, 0x12a9: 0x1601,
+	0x12aa: 0x1609, 0x12ab: 0x1609, 0x12ac: 0x1609, 0x12ad: 0x1609, 0x12ae: 0x1611, 0x12af: 0x1611,
+	0x12b0: 0x1611, 0x12b1: 0x1611, 0x12b2: 0x1619, 0x12b3: 0x1619, 0x12b4: 0x1619, 0x12b5: 0x1619,
+	0x12b6: 0x1621, 0x12b7: 0x1621, 0x12b8: 0x1621, 0x12b9: 0x1621, 0x12ba: 0x1629, 0x12bb: 0x1629,
+	0x12bc: 0x1629, 0x12bd: 0x1629, 0x12be: 0x1631, 0x12bf: 0x1631,
 	// Block 0x4b, offset 0x12c0
-	0x12c0: 0x7009, 0x12c1: 0x7021, 0x12c2: 0x7039, 0x12c3: 0x7d4d, 0x12c4: 0x7d6d, 0x12c5: 0x7051,
-	0x12c6: 0x7051, 0x12c7: 0x0040, 0x12c8: 0x0040, 0x12c9: 0x0040, 0x12ca: 0x0040, 0x12cb: 0x0040,
-	0x12cc: 0x0040, 0x12cd: 0x0040, 0x12ce: 0x0040, 0x12cf: 0x0040, 0x12d0: 0x0040, 0x12d1: 0x0040,
-	0x12d2: 0x0040, 0x12d3: 0x7069, 0x12d4: 0x7091, 0x12d5: 0x70b9, 0x12d6: 0x70e1, 0x12d7: 0x7109,
-	0x12d8: 0x0040, 0x12d9: 0x0040, 0x12da: 0x0040, 0x12db: 0x0040, 0x12dc: 0x0040, 0x12dd: 0x7131,
-	0x12de: 0x3308, 0x12df: 0x7159, 0x12e0: 0x7181, 0x12e1: 0x20a9, 0x12e2: 0x20f1, 0x12e3: 0x7199,
-	0x12e4: 0x71b1, 0x12e5: 0x71c9, 0x12e6: 0x71e1, 0x12e7: 0x71f9, 0x12e8: 0x7211, 0x12e9: 0x1fb2,
-	0x12ea: 0x7229, 0x12eb: 0x7251, 0x12ec: 0x7279, 0x12ed: 0x72b1, 0x12ee: 0x72e9, 0x12ef: 0x7311,
-	0x12f0: 0x7339, 0x12f1: 0x7361, 0x12f2: 0x7389, 0x12f3: 0x73b1, 0x12f4: 0x73d9, 0x12f5: 0x7401,
-	0x12f6: 0x7429, 0x12f7: 0x0040, 0x12f8: 0x7451, 0x12f9: 0x7479, 0x12fa: 0x74a1, 0x12fb: 0x74c9,
-	0x12fc: 0x74f1, 0x12fd: 0x0040, 0x12fe: 0x7519, 0x12ff: 0x0040,
+	0x12c0: 0x1631, 0x12c1: 0x1631, 0x12c2: 0x1639, 0x12c3: 0x1639, 0x12c4: 0x1641, 0x12c5: 0x1641,
+	0x12c6: 0x1649, 0x12c7: 0x1649, 0x12c8: 0x1651, 0x12c9: 0x1651, 0x12ca: 0x1659, 0x12cb: 0x1659,
+	0x12cc: 0x1661, 0x12cd: 0x1661, 0x12ce: 0x1669, 0x12cf: 0x1669, 0x12d0: 0x1669, 0x12d1: 0x1669,
+	0x12d2: 0x1671, 0x12d3: 0x1671, 0x12d4: 0x1671, 0x12d5: 0x1671, 0x12d6: 0x1679, 0x12d7: 0x1679,
+	0x12d8: 0x1679, 0x12d9: 0x1679, 0x12da: 0x1681, 0x12db: 0x1681, 0x12dc: 0x1681, 0x12dd: 0x1681,
+	0x12de: 0x1689, 0x12df: 0x1689, 0x12e0: 0x1691, 0x12e1: 0x1691, 0x12e2: 0x1691, 0x12e3: 0x1691,
+	0x12e4: 0x1699, 0x12e5: 0x1699, 0x12e6: 0x16a1, 0x12e7: 0x16a1, 0x12e8: 0x16a1, 0x12e9: 0x16a1,
+	0x12ea: 0x16a9, 0x12eb: 0x16a9, 0x12ec: 0x16a9, 0x12ed: 0x16a9, 0x12ee: 0x16b1, 0x12ef: 0x16b1,
+	0x12f0: 0x16b9, 0x12f1: 0x16b9, 0x12f2: 0x0818, 0x12f3: 0x0818, 0x12f4: 0x0818, 0x12f5: 0x0818,
+	0x12f6: 0x0818, 0x12f7: 0x0818, 0x12f8: 0x0818, 0x12f9: 0x0818, 0x12fa: 0x0818, 0x12fb: 0x0818,
+	0x12fc: 0x0818, 0x12fd: 0x0818, 0x12fe: 0x0818, 0x12ff: 0x0818,
 	// Block 0x4c, offset 0x1300
-	0x1300: 0x7541, 0x1301: 0x7569, 0x1302: 0x0040, 0x1303: 0x7591, 0x1304: 0x75b9, 0x1305: 0x0040,
-	0x1306: 0x75e1, 0x1307: 0x7609, 0x1308: 0x7631, 0x1309: 0x7659, 0x130a: 0x7681, 0x130b: 0x76a9,
-	0x130c: 0x76d1, 0x130d: 0x76f9, 0x130e: 0x7721, 0x130f: 0x7749, 0x1310: 0x7771, 0x1311: 0x7771,
-	0x1312: 0x7789, 0x1313: 0x7789, 0x1314: 0x7789, 0x1315: 0x7789, 0x1316: 0x77a1, 0x1317: 0x77a1,
-	0x1318: 0x77a1, 0x1319: 0x77a1, 0x131a: 0x77b9, 0x131b: 0x77b9, 0x131c: 0x77b9, 0x131d: 0x77b9,
-	0x131e: 0x77d1, 0x131f: 0x77d1, 0x1320: 0x77d1, 0x1321: 0x77d1, 0x1322: 0x77e9, 0x1323: 0x77e9,
-	0x1324: 0x77e9, 0x1325: 0x77e9, 0x1326: 0x7801, 0x1327: 0x7801, 0x1328: 0x7801, 0x1329: 0x7801,
-	0x132a: 0x7819, 0x132b: 0x7819, 0x132c: 0x7819, 0x132d: 0x7819, 0x132e: 0x7831, 0x132f: 0x7831,
-	0x1330: 0x7831, 0x1331: 0x7831, 0x1332: 0x7849, 0x1333: 0x7849, 0x1334: 0x7849, 0x1335: 0x7849,
-	0x1336: 0x7861, 0x1337: 0x7861, 0x1338: 0x7861, 0x1339: 0x7861, 0x133a: 0x7879, 0x133b: 0x7879,
-	0x133c: 0x7879, 0x133d: 0x7879, 0x133e: 0x7891, 0x133f: 0x7891,
+	0x1300: 0x0818, 0x1301: 0x0818, 0x1302: 0x0040, 0x1303: 0x0040, 0x1304: 0x0040, 0x1305: 0x0040,
+	0x1306: 0x0040, 0x1307: 0x0040, 0x1308: 0x0040, 0x1309: 0x0040, 0x130a: 0x0040, 0x130b: 0x0040,
+	0x130c: 0x0040, 0x130d: 0x0040, 0x130e: 0x0040, 0x130f: 0x0040, 0x1310: 0x0040, 0x1311: 0x0040,
+	0x1312: 0x0040, 0x1313: 0x16c1, 0x1314: 0x16c1, 0x1315: 0x16c1, 0x1316: 0x16c1, 0x1317: 0x16c9,
+	0x1318: 0x16c9, 0x1319: 0x16d1, 0x131a: 0x16d1, 0x131b: 0x16d9, 0x131c: 0x16d9, 0x131d: 0x0149,
+	0x131e: 0x16e1, 0x131f: 0x16e1, 0x1320: 0x16e9, 0x1321: 0x16e9, 0x1322: 0x16f1, 0x1323: 0x16f1,
+	0x1324: 0x16f9, 0x1325: 0x16f9, 0x1326: 0x16f9, 0x1327: 0x16f9, 0x1328: 0x1701, 0x1329: 0x1701,
+	0x132a: 0x1709, 0x132b: 0x1709, 0x132c: 0x1711, 0x132d: 0x1711, 0x132e: 0x1719, 0x132f: 0x1719,
+	0x1330: 0x1721, 0x1331: 0x1721, 0x1332: 0x1729, 0x1333: 0x1729, 0x1334: 0x1731, 0x1335: 0x1731,
+	0x1336: 0x1739, 0x1337: 0x1739, 0x1338: 0x1739, 0x1339: 0x1741, 0x133a: 0x1741, 0x133b: 0x1741,
+	0x133c: 0x1749, 0x133d: 0x1749, 0x133e: 0x1749, 0x133f: 0x1749,
 	// Block 0x4d, offset 0x1340
-	0x1340: 0x7891, 0x1341: 0x7891, 0x1342: 0x78a9, 0x1343: 0x78a9, 0x1344: 0x78c1, 0x1345: 0x78c1,
-	0x1346: 0x78d9, 0x1347: 0x78d9, 0x1348: 0x78f1, 0x1349: 0x78f1, 0x134a: 0x7909, 0x134b: 0x7909,
-	0x134c: 0x7921, 0x134d: 0x7921, 0x134e: 0x7939, 0x134f: 0x7939, 0x1350: 0x7939, 0x1351: 0x7939,
-	0x1352: 0x7951, 0x1353: 0x7951, 0x1354: 0x7951, 0x1355: 0x7951, 0x1356: 0x7969, 0x1357: 0x7969,
-	0x1358: 0x7969, 0x1359: 0x7969, 0x135a: 0x7981, 0x135b: 0x7981, 0x135c: 0x7981, 0x135d: 0x7981,
-	0x135e: 0x7999, 0x135f: 0x7999, 0x1360: 0x79b1, 0x1361: 0x79b1, 0x1362: 0x79b1, 0x1363: 0x79b1,
-	0x1364: 0x79c9, 0x1365: 0x79c9, 0x1366: 0x79e1, 0x1367: 0x79e1, 0x1368: 0x79e1, 0x1369: 0x79e1,
-	0x136a: 0x79f9, 0x136b: 0x79f9, 0x136c: 0x79f9, 0x136d: 0x79f9, 0x136e: 0x7a11, 0x136f: 0x7a11,
-	0x1370: 0x7a29, 0x1371: 0x7a29, 0x1372: 0x0818, 0x1373: 0x0818, 0x1374: 0x0818, 0x1375: 0x0818,
-	0x1376: 0x0818, 0x1377: 0x0818, 0x1378: 0x0818, 0x1379: 0x0818, 0x137a: 0x0818, 0x137b: 0x0818,
-	0x137c: 0x0818, 0x137d: 0x0818, 0x137e: 0x0818, 0x137f: 0x0818,
+	0x1340: 0x1949, 0x1341: 0x1951, 0x1342: 0x1959, 0x1343: 0x1961, 0x1344: 0x1969, 0x1345: 0x1971,
+	0x1346: 0x1979, 0x1347: 0x1981, 0x1348: 0x1989, 0x1349: 0x1991, 0x134a: 0x1999, 0x134b: 0x19a1,
+	0x134c: 0x19a9, 0x134d: 0x19b1, 0x134e: 0x19b9, 0x134f: 0x19c1, 0x1350: 0x19c9, 0x1351: 0x19d1,
+	0x1352: 0x19d9, 0x1353: 0x19e1, 0x1354: 0x19e9, 0x1355: 0x19f1, 0x1356: 0x19f9, 0x1357: 0x1a01,
+	0x1358: 0x1a09, 0x1359: 0x1a11, 0x135a: 0x1a19, 0x135b: 0x1a21, 0x135c: 0x1a29, 0x135d: 0x1a31,
+	0x135e: 0x1a3a, 0x135f: 0x1a42, 0x1360: 0x1a4a, 0x1361: 0x1a52, 0x1362: 0x1a5a, 0x1363: 0x1a62,
+	0x1364: 0x1a69, 0x1365: 0x1a71, 0x1366: 0x1761, 0x1367: 0x1a79, 0x1368: 0x1741, 0x1369: 0x1769,
+	0x136a: 0x1a81, 0x136b: 0x1a89, 0x136c: 0x1789, 0x136d: 0x1a91, 0x136e: 0x1791, 0x136f: 0x1799,
+	0x1370: 0x1a99, 0x1371: 0x1aa1, 0x1372: 0x17b9, 0x1373: 0x1aa9, 0x1374: 0x17c1, 0x1375: 0x17c9,
+	0x1376: 0x1ab1, 0x1377: 0x1ab9, 0x1378: 0x17d9, 0x1379: 0x1ac1, 0x137a: 0x17e1, 0x137b: 0x17e9,
+	0x137c: 0x18d1, 0x137d: 0x18d9, 0x137e: 0x18f1, 0x137f: 0x18f9,
 	// Block 0x4e, offset 0x1380
-	0x1380: 0x0818, 0x1381: 0x0818, 0x1382: 0x0040, 0x1383: 0x0040, 0x1384: 0x0040, 0x1385: 0x0040,
-	0x1386: 0x0040, 0x1387: 0x0040, 0x1388: 0x0040, 0x1389: 0x0040, 0x138a: 0x0040, 0x138b: 0x0040,
-	0x138c: 0x0040, 0x138d: 0x0040, 0x138e: 0x0040, 0x138f: 0x0040, 0x1390: 0x0040, 0x1391: 0x0040,
-	0x1392: 0x0040, 0x1393: 0x7a41, 0x1394: 0x7a41, 0x1395: 0x7a41, 0x1396: 0x7a41, 0x1397: 0x7a59,
-	0x1398: 0x7a59, 0x1399: 0x7a71, 0x139a: 0x7a71, 0x139b: 0x7a89, 0x139c: 0x7a89, 0x139d: 0x0479,
-	0x139e: 0x7aa1, 0x139f: 0x7aa1, 0x13a0: 0x7ab9, 0x13a1: 0x7ab9, 0x13a2: 0x7ad1, 0x13a3: 0x7ad1,
-	0x13a4: 0x7ae9, 0x13a5: 0x7ae9, 0x13a6: 0x7ae9, 0x13a7: 0x7ae9, 0x13a8: 0x7b01, 0x13a9: 0x7b01,
-	0x13aa: 0x7b19, 0x13ab: 0x7b19, 0x13ac: 0x7b41, 0x13ad: 0x7b41, 0x13ae: 0x7b69, 0x13af: 0x7b69,
-	0x13b0: 0x7b91, 0x13b1: 0x7b91, 0x13b2: 0x7bb9, 0x13b3: 0x7bb9, 0x13b4: 0x7be1, 0x13b5: 0x7be1,
-	0x13b6: 0x7c09, 0x13b7: 0x7c09, 0x13b8: 0x7c09, 0x13b9: 0x7c31, 0x13ba: 0x7c31, 0x13bb: 0x7c31,
-	0x13bc: 0x7c59, 0x13bd: 0x7c59, 0x13be: 0x7c59, 0x13bf: 0x7c59,
+	0x1380: 0x1901, 0x1381: 0x1921, 0x1382: 0x1929, 0x1383: 0x1931, 0x1384: 0x1939, 0x1385: 0x1959,
+	0x1386: 0x1961, 0x1387: 0x1969, 0x1388: 0x1ac9, 0x1389: 0x1989, 0x138a: 0x1ad1, 0x138b: 0x1ad9,
+	0x138c: 0x19b9, 0x138d: 0x1ae1, 0x138e: 0x19c1, 0x138f: 0x19c9, 0x1390: 0x1a31, 0x1391: 0x1ae9,
+	0x1392: 0x1af1, 0x1393: 0x1a09, 0x1394: 0x1af9, 0x1395: 0x1a11, 0x1396: 0x1a19, 0x1397: 0x1751,
+	0x1398: 0x1759, 0x1399: 0x1b01, 0x139a: 0x1761, 0x139b: 0x1b09, 0x139c: 0x1771, 0x139d: 0x1779,
+	0x139e: 0x1781, 0x139f: 0x1789, 0x13a0: 0x1b11, 0x13a1: 0x17a1, 0x13a2: 0x17a9, 0x13a3: 0x17b1,
+	0x13a4: 0x17b9, 0x13a5: 0x1b19, 0x13a6: 0x17d9, 0x13a7: 0x17f1, 0x13a8: 0x17f9, 0x13a9: 0x1801,
+	0x13aa: 0x1809, 0x13ab: 0x1811, 0x13ac: 0x1821, 0x13ad: 0x1829, 0x13ae: 0x1831, 0x13af: 0x1839,
+	0x13b0: 0x1841, 0x13b1: 0x1849, 0x13b2: 0x1b21, 0x13b3: 0x1851, 0x13b4: 0x1859, 0x13b5: 0x1861,
+	0x13b6: 0x1869, 0x13b7: 0x1871, 0x13b8: 0x1879, 0x13b9: 0x1889, 0x13ba: 0x1891, 0x13bb: 0x1899,
+	0x13bc: 0x18a1, 0x13bd: 0x18a9, 0x13be: 0x18b1, 0x13bf: 0x18b9,
 	// Block 0x4f, offset 0x13c0
-	0x13c0: 0x8649, 0x13c1: 0x8671, 0x13c2: 0x8699, 0x13c3: 0x86c1, 0x13c4: 0x86e9, 0x13c5: 0x8711,
-	0x13c6: 0x8739, 0x13c7: 0x8761, 0x13c8: 0x8789, 0x13c9: 0x87b1, 0x13ca: 0x87d9, 0x13cb: 0x8801,
-	0x13cc: 0x8829, 0x13cd: 0x8851, 0x13ce: 0x8879, 0x13cf: 0x88a1, 0x13d0: 0x88c9, 0x13d1: 0x88f1,
-	0x13d2: 0x8919, 0x13d3: 0x8941, 0x13d4: 0x8969, 0x13d5: 0x8991, 0x13d6: 0x89b9, 0x13d7: 0x89e1,
-	0x13d8: 0x8a09, 0x13d9: 0x8a31, 0x13da: 0x8a59, 0x13db: 0x8a81, 0x13dc: 0x8aa9, 0x13dd: 0x8ad1,
-	0x13de: 0x8afa, 0x13df: 0x8b2a, 0x13e0: 0x8b5a, 0x13e1: 0x8b8a, 0x13e2: 0x8bba, 0x13e3: 0x8bea,
-	0x13e4: 0x8c19, 0x13e5: 0x8c41, 0x13e6: 0x7cc1, 0x13e7: 0x8c69, 0x13e8: 0x7c31, 0x13e9: 0x7ce9,
-	0x13ea: 0x8c91, 0x13eb: 0x8cb9, 0x13ec: 0x7d89, 0x13ed: 0x8ce1, 0x13ee: 0x7db1, 0x13ef: 0x7dd9,
-	0x13f0: 0x8d09, 0x13f1: 0x8d31, 0x13f2: 0x7e79, 0x13f3: 0x8d59, 0x13f4: 0x7ea1, 0x13f5: 0x7ec9,
-	0x13f6: 0x8d81, 0x13f7: 0x8da9, 0x13f8: 0x7f19, 0x13f9: 0x8dd1, 0x13fa: 0x7f41, 0x13fb: 0x7f69,
-	0x13fc: 0x83f1, 0x13fd: 0x8419, 0x13fe: 0x8491, 0x13ff: 0x84b9,
+	0x13c0: 0x18c1, 0x13c1: 0x18c9, 0x13c2: 0x18e1, 0x13c3: 0x18e9, 0x13c4: 0x1909, 0x13c5: 0x1911,
+	0x13c6: 0x1919, 0x13c7: 0x1921, 0x13c8: 0x1929, 0x13c9: 0x1941, 0x13ca: 0x1949, 0x13cb: 0x1951,
+	0x13cc: 0x1959, 0x13cd: 0x1b29, 0x13ce: 0x1971, 0x13cf: 0x1979, 0x13d0: 0x1981, 0x13d1: 0x1989,
+	0x13d2: 0x19a1, 0x13d3: 0x19a9, 0x13d4: 0x19b1, 0x13d5: 0x19b9, 0x13d6: 0x1b31, 0x13d7: 0x19d1,
+	0x13d8: 0x19d9, 0x13d9: 0x1b39, 0x13da: 0x19f1, 0x13db: 0x19f9, 0x13dc: 0x1a01, 0x13dd: 0x1a09,
+	0x13de: 0x1b41, 0x13df: 0x1761, 0x13e0: 0x1b09, 0x13e1: 0x1789, 0x13e2: 0x1b11, 0x13e3: 0x17b9,
+	0x13e4: 0x1b19, 0x13e5: 0x17d9, 0x13e6: 0x1b49, 0x13e7: 0x1841, 0x13e8: 0x1b51, 0x13e9: 0x1b59,
+	0x13ea: 0x1b61, 0x13eb: 0x1921, 0x13ec: 0x1929, 0x13ed: 0x1959, 0x13ee: 0x19b9, 0x13ef: 0x1b31,
+	0x13f0: 0x1a09, 0x13f1: 0x1b41, 0x13f2: 0x1b69, 0x13f3: 0x1b71, 0x13f4: 0x1b79, 0x13f5: 0x1b81,
+	0x13f6: 0x1b89, 0x13f7: 0x1b91, 0x13f8: 0x1b99, 0x13f9: 0x1ba1, 0x13fa: 0x1ba9, 0x13fb: 0x1bb1,
+	0x13fc: 0x1bb9, 0x13fd: 0x1bc1, 0x13fe: 0x1bc9, 0x13ff: 0x1bd1,
 	// Block 0x50, offset 0x1400
-	0x1400: 0x84e1, 0x1401: 0x8581, 0x1402: 0x85a9, 0x1403: 0x85d1, 0x1404: 0x85f9, 0x1405: 0x8699,
-	0x1406: 0x86c1, 0x1407: 0x86e9, 0x1408: 0x8df9, 0x1409: 0x8789, 0x140a: 0x8e21, 0x140b: 0x8e49,
-	0x140c: 0x8879, 0x140d: 0x8e71, 0x140e: 0x88a1, 0x140f: 0x88c9, 0x1410: 0x8ad1, 0x1411: 0x8e99,
-	0x1412: 0x8ec1, 0x1413: 0x8a09, 0x1414: 0x8ee9, 0x1415: 0x8a31, 0x1416: 0x8a59, 0x1417: 0x7c71,
-	0x1418: 0x7c99, 0x1419: 0x8f11, 0x141a: 0x7cc1, 0x141b: 0x8f39, 0x141c: 0x7d11, 0x141d: 0x7d39,
-	0x141e: 0x7d61, 0x141f: 0x7d89, 0x1420: 0x8f61, 0x1421: 0x7e01, 0x1422: 0x7e29, 0x1423: 0x7e51,
-	0x1424: 0x7e79, 0x1425: 0x8f89, 0x1426: 0x7f19, 0x1427: 0x7f91, 0x1428: 0x7fb9, 0x1429: 0x7fe1,
-	0x142a: 0x8009, 0x142b: 0x8031, 0x142c: 0x8081, 0x142d: 0x80a9, 0x142e: 0x80d1, 0x142f: 0x80f9,
-	0x1430: 0x8121, 0x1431: 0x8149, 0x1432: 0x8fb1, 0x1433: 0x8171, 0x1434: 0x8199, 0x1435: 0x81c1,
-	0x1436: 0x81e9, 0x1437: 0x8211, 0x1438: 0x8239, 0x1439: 0x8289, 0x143a: 0x82b1, 0x143b: 0x82d9,
-	0x143c: 0x8301, 0x143d: 0x8329, 0x143e: 0x8351, 0x143f: 0x8379,
+	0x1400: 0x1bd9, 0x1401: 0x1be1, 0x1402: 0x1be9, 0x1403: 0x1bf1, 0x1404: 0x1bf9, 0x1405: 0x1c01,
+	0x1406: 0x1c09, 0x1407: 0x1c11, 0x1408: 0x1c19, 0x1409: 0x1c21, 0x140a: 0x1c29, 0x140b: 0x1c31,
+	0x140c: 0x1b59, 0x140d: 0x1c39, 0x140e: 0x1c41, 0x140f: 0x1c49, 0x1410: 0x1c51, 0x1411: 0x1b81,
+	0x1412: 0x1b89, 0x1413: 0x1b91, 0x1414: 0x1b99, 0x1415: 0x1ba1, 0x1416: 0x1ba9, 0x1417: 0x1bb1,
+	0x1418: 0x1bb9, 0x1419: 0x1bc1, 0x141a: 0x1bc9, 0x141b: 0x1bd1, 0x141c: 0x1bd9, 0x141d: 0x1be1,
+	0x141e: 0x1be9, 0x141f: 0x1bf1, 0x1420: 0x1bf9, 0x1421: 0x1c01, 0x1422: 0x1c09, 0x1423: 0x1c11,
+	0x1424: 0x1c19, 0x1425: 0x1c21, 0x1426: 0x1c29, 0x1427: 0x1c31, 0x1428: 0x1b59, 0x1429: 0x1c39,
+	0x142a: 0x1c41, 0x142b: 0x1c49, 0x142c: 0x1c51, 0x142d: 0x1c21, 0x142e: 0x1c29, 0x142f: 0x1c31,
+	0x1430: 0x1b59, 0x1431: 0x1b51, 0x1432: 0x1b61, 0x1433: 0x1881, 0x1434: 0x1829, 0x1435: 0x1831,
+	0x1436: 0x1839, 0x1437: 0x1c21, 0x1438: 0x1c29, 0x1439: 0x1c31, 0x143a: 0x1881, 0x143b: 0x1889,
+	0x143c: 0x1c59, 0x143d: 0x1c59, 0x143e: 0x0018, 0x143f: 0x0018,
 	// Block 0x51, offset 0x1440
-	0x1440: 0x83a1, 0x1441: 0x83c9, 0x1442: 0x8441, 0x1443: 0x8469, 0x1444: 0x8509, 0x1445: 0x8531,
-	0x1446: 0x8559, 0x1447: 0x8581, 0x1448: 0x85a9, 0x1449: 0x8621, 0x144a: 0x8649, 0x144b: 0x8671,
-	0x144c: 0x8699, 0x144d: 0x8fd9, 0x144e: 0x8711, 0x144f: 0x8739, 0x1450: 0x8761, 0x1451: 0x8789,
-	0x1452: 0x8801, 0x1453: 0x8829, 0x1454: 0x8851, 0x1455: 0x8879, 0x1456: 0x9001, 0x1457: 0x88f1,
-	0x1458: 0x8919, 0x1459: 0x9029, 0x145a: 0x8991, 0x145b: 0x89b9, 0x145c: 0x89e1, 0x145d: 0x8a09,
-	0x145e: 0x9051, 0x145f: 0x7cc1, 0x1460: 0x8f39, 0x1461: 0x7d89, 0x1462: 0x8f61, 0x1463: 0x7e79,
-	0x1464: 0x8f89, 0x1465: 0x7f19, 0x1466: 0x9079, 0x1467: 0x8121, 0x1468: 0x90a1, 0x1469: 0x90c9,
-	0x146a: 0x90f1, 0x146b: 0x8581, 0x146c: 0x85a9, 0x146d: 0x8699, 0x146e: 0x8879, 0x146f: 0x9001,
-	0x1470: 0x8a09, 0x1471: 0x9051, 0x1472: 0x9119, 0x1473: 0x9151, 0x1474: 0x9189, 0x1475: 0x91c1,
-	0x1476: 0x91e9, 0x1477: 0x9211, 0x1478: 0x9239, 0x1479: 0x9261, 0x147a: 0x9289, 0x147b: 0x92b1,
-	0x147c: 0x92d9, 0x147d: 0x9301, 0x147e: 0x9329, 0x147f: 0x9351,
+	0x1440: 0x0040, 0x1441: 0x0040, 0x1442: 0x0040, 0x1443: 0x0040, 0x1444: 0x0040, 0x1445: 0x0040,
+	0x1446: 0x0040, 0x1447: 0x0040, 0x1448: 0x0040, 0x1449: 0x0040, 0x144a: 0x0040, 0x144b: 0x0040,
+	0x144c: 0x0040, 0x144d: 0x0040, 0x144e: 0x0040, 0x144f: 0x0040, 0x1450: 0x1c61, 0x1451: 0x1c69,
+	0x1452: 0x1c69, 0x1453: 0x1c71, 0x1454: 0x1c79, 0x1455: 0x1c81, 0x1456: 0x1c89, 0x1457: 0x1c91,
+	0x1458: 0x1c99, 0x1459: 0x1c99, 0x145a: 0x1ca1, 0x145b: 0x1ca9, 0x145c: 0x1cb1, 0x145d: 0x1cb9,
+	0x145e: 0x1cc1, 0x145f: 0x1cc9, 0x1460: 0x1cc9, 0x1461: 0x1cd1, 0x1462: 0x1cd9, 0x1463: 0x1cd9,
+	0x1464: 0x1ce1, 0x1465: 0x1ce1, 0x1466: 0x1ce9, 0x1467: 0x1cf1, 0x1468: 0x1cf1, 0x1469: 0x1cf9,
+	0x146a: 0x1d01, 0x146b: 0x1d01, 0x146c: 0x1d09, 0x146d: 0x1d09, 0x146e: 0x1d11, 0x146f: 0x1d19,
+	0x1470: 0x1d19, 0x1471: 0x1d21, 0x1472: 0x1d21, 0x1473: 0x1d29, 0x1474: 0x1d31, 0x1475: 0x1d39,
+	0x1476: 0x1d41, 0x1477: 0x1d41, 0x1478: 0x1d49, 0x1479: 0x1d51, 0x147a: 0x1d59, 0x147b: 0x1d61,
+	0x147c: 0x1d69, 0x147d: 0x1d69, 0x147e: 0x1d71, 0x147f: 0x1d79,
 	// Block 0x52, offset 0x1480
-	0x1480: 0x9379, 0x1481: 0x93a1, 0x1482: 0x93c9, 0x1483: 0x93f1, 0x1484: 0x9419, 0x1485: 0x9441,
-	0x1486: 0x9469, 0x1487: 0x9491, 0x1488: 0x94b9, 0x1489: 0x94e1, 0x148a: 0x9509, 0x148b: 0x9531,
-	0x148c: 0x90c9, 0x148d: 0x9559, 0x148e: 0x9581, 0x148f: 0x95a9, 0x1490: 0x95d1, 0x1491: 0x91c1,
-	0x1492: 0x91e9, 0x1493: 0x9211, 0x1494: 0x9239, 0x1495: 0x9261, 0x1496: 0x9289, 0x1497: 0x92b1,
-	0x1498: 0x92d9, 0x1499: 0x9301, 0x149a: 0x9329, 0x149b: 0x9351, 0x149c: 0x9379, 0x149d: 0x93a1,
-	0x149e: 0x93c9, 0x149f: 0x93f1, 0x14a0: 0x9419, 0x14a1: 0x9441, 0x14a2: 0x9469, 0x14a3: 0x9491,
-	0x14a4: 0x94b9, 0x14a5: 0x94e1, 0x14a6: 0x9509, 0x14a7: 0x9531, 0x14a8: 0x90c9, 0x14a9: 0x9559,
-	0x14aa: 0x9581, 0x14ab: 0x95a9, 0x14ac: 0x95d1, 0x14ad: 0x94e1, 0x14ae: 0x9509, 0x14af: 0x9531,
-	0x14b0: 0x90c9, 0x14b1: 0x90a1, 0x14b2: 0x90f1, 0x14b3: 0x8261, 0x14b4: 0x80a9, 0x14b5: 0x80d1,
-	0x14b6: 0x80f9, 0x14b7: 0x94e1, 0x14b8: 0x9509, 0x14b9: 0x9531, 0x14ba: 0x8261, 0x14bb: 0x8289,
-	0x14bc: 0x95f9, 0x14bd: 0x95f9, 0x14be: 0x0018, 0x14bf: 0x0018,
+	0x1480: 0x1f29, 0x1481: 0x1f31, 0x1482: 0x1f39, 0x1483: 0x1f11, 0x1484: 0x1d39, 0x1485: 0x1ce9,
+	0x1486: 0x1f41, 0x1487: 0x1f49, 0x1488: 0x0040, 0x1489: 0x0040, 0x148a: 0x0040, 0x148b: 0x0040,
+	0x148c: 0x0040, 0x148d: 0x0040, 0x148e: 0x0040, 0x148f: 0x0040, 0x1490: 0x0040, 0x1491: 0x0040,
+	0x1492: 0x0040, 0x1493: 0x0040, 0x1494: 0x0040, 0x1495: 0x0040, 0x1496: 0x0040, 0x1497: 0x0040,
+	0x1498: 0x0040, 0x1499: 0x0040, 0x149a: 0x0040, 0x149b: 0x0040, 0x149c: 0x0040, 0x149d: 0x0040,
+	0x149e: 0x0040, 0x149f: 0x0040, 0x14a0: 0x0040, 0x14a1: 0x0040, 0x14a2: 0x0040, 0x14a3: 0x0040,
+	0x14a4: 0x0040, 0x14a5: 0x0040, 0x14a6: 0x0040, 0x14a7: 0x0040, 0x14a8: 0x0040, 0x14a9: 0x0040,
+	0x14aa: 0x0040, 0x14ab: 0x0040, 0x14ac: 0x0040, 0x14ad: 0x0040, 0x14ae: 0x0040, 0x14af: 0x0040,
+	0x14b0: 0x1f51, 0x14b1: 0x1f59, 0x14b2: 0x1f61, 0x14b3: 0x1f69, 0x14b4: 0x1f71, 0x14b5: 0x1f79,
+	0x14b6: 0x1f81, 0x14b7: 0x1f89, 0x14b8: 0x1f91, 0x14b9: 0x1f99, 0x14ba: 0x1fa2, 0x14bb: 0x1faa,
+	0x14bc: 0x1fb1, 0x14bd: 0x0018, 0x14be: 0x0040, 0x14bf: 0x0040,
 	// Block 0x53, offset 0x14c0
-	0x14c0: 0x0040, 0x14c1: 0x0040, 0x14c2: 0x0040, 0x14c3: 0x0040, 0x14c4: 0x0040, 0x14c5: 0x0040,
-	0x14c6: 0x0040, 0x14c7: 0x0040, 0x14c8: 0x0040, 0x14c9: 0x0040, 0x14ca: 0x0040, 0x14cb: 0x0040,
-	0x14cc: 0x0040, 0x14cd: 0x0040, 0x14ce: 0x0040, 0x14cf: 0x0040, 0x14d0: 0x9621, 0x14d1: 0x9659,
-	0x14d2: 0x9659, 0x14d3: 0x9691, 0x14d4: 0x96c9, 0x14d5: 0x9701, 0x14d6: 0x9739, 0x14d7: 0x9771,
-	0x14d8: 0x97a9, 0x14d9: 0x97a9, 0x14da: 0x97e1, 0x14db: 0x9819, 0x14dc: 0x9851, 0x14dd: 0x9889,
-	0x14de: 0x98c1, 0x14df: 0x98f9, 0x14e0: 0x98f9, 0x14e1: 0x9931, 0x14e2: 0x9969, 0x14e3: 0x9969,
-	0x14e4: 0x99a1, 0x14e5: 0x99a1, 0x14e6: 0x99d9, 0x14e7: 0x9a11, 0x14e8: 0x9a11, 0x14e9: 0x9a49,
-	0x14ea: 0x9a81, 0x14eb: 0x9a81, 0x14ec: 0x9ab9, 0x14ed: 0x9ab9, 0x14ee: 0x9af1, 0x14ef: 0x9b29,
-	0x14f0: 0x9b29, 0x14f1: 0x9b61, 0x14f2: 0x9b61, 0x14f3: 0x9b99, 0x14f4: 0x9bd1, 0x14f5: 0x9c09,
-	0x14f6: 0x9c41, 0x14f7: 0x9c41, 0x14f8: 0x9c79, 0x14f9: 0x9cb1, 0x14fa: 0x9ce9, 0x14fb: 0x9d21,
-	0x14fc: 0x9d59, 0x14fd: 0x9d59, 0x14fe: 0x9d91, 0x14ff: 0x9dc9,
+	0x14c0: 0x33c0, 0x14c1: 0x33c0, 0x14c2: 0x33c0, 0x14c3: 0x33c0, 0x14c4: 0x33c0, 0x14c5: 0x33c0,
+	0x14c6: 0x33c0, 0x14c7: 0x33c0, 0x14c8: 0x33c0, 0x14c9: 0x33c0, 0x14ca: 0x33c0, 0x14cb: 0x33c0,
+	0x14cc: 0x33c0, 0x14cd: 0x33c0, 0x14ce: 0x33c0, 0x14cf: 0x33c0, 0x14d0: 0x1fba, 0x14d1: 0x7d8d,
+	0x14d2: 0x0040, 0x14d3: 0x1fc2, 0x14d4: 0x0122, 0x14d5: 0x1fca, 0x14d6: 0x1fd2, 0x14d7: 0x7dad,
+	0x14d8: 0x7dcd, 0x14d9: 0x0040, 0x14da: 0x0040, 0x14db: 0x0040, 0x14dc: 0x0040, 0x14dd: 0x0040,
+	0x14de: 0x0040, 0x14df: 0x0040, 0x14e0: 0x3308, 0x14e1: 0x3308, 0x14e2: 0x3308, 0x14e3: 0x3308,
+	0x14e4: 0x3308, 0x14e5: 0x3308, 0x14e6: 0x3308, 0x14e7: 0x3308, 0x14e8: 0x3308, 0x14e9: 0x3308,
+	0x14ea: 0x3308, 0x14eb: 0x3308, 0x14ec: 0x3308, 0x14ed: 0x3308, 0x14ee: 0x3308, 0x14ef: 0x3308,
+	0x14f0: 0x0040, 0x14f1: 0x7ded, 0x14f2: 0x7e0d, 0x14f3: 0x1fda, 0x14f4: 0x1fda, 0x14f5: 0x072a,
+	0x14f6: 0x0732, 0x14f7: 0x1fe2, 0x14f8: 0x1fea, 0x14f9: 0x7e2d, 0x14fa: 0x7e4d, 0x14fb: 0x7e6d,
+	0x14fc: 0x7e2d, 0x14fd: 0x7e8d, 0x14fe: 0x7ead, 0x14ff: 0x7e8d,
 	// Block 0x54, offset 0x1500
-	0x1500: 0xa999, 0x1501: 0xa9d1, 0x1502: 0xaa09, 0x1503: 0xa8f1, 0x1504: 0x9c09, 0x1505: 0x99d9,
-	0x1506: 0xaa41, 0x1507: 0xaa79, 0x1508: 0x0040, 0x1509: 0x0040, 0x150a: 0x0040, 0x150b: 0x0040,
-	0x150c: 0x0040, 0x150d: 0x0040, 0x150e: 0x0040, 0x150f: 0x0040, 0x1510: 0x0040, 0x1511: 0x0040,
-	0x1512: 0x0040, 0x1513: 0x0040, 0x1514: 0x0040, 0x1515: 0x0040, 0x1516: 0x0040, 0x1517: 0x0040,
-	0x1518: 0x0040, 0x1519: 0x0040, 0x151a: 0x0040, 0x151b: 0x0040, 0x151c: 0x0040, 0x151d: 0x0040,
-	0x151e: 0x0040, 0x151f: 0x0040, 0x1520: 0x0040, 0x1521: 0x0040, 0x1522: 0x0040, 0x1523: 0x0040,
-	0x1524: 0x0040, 0x1525: 0x0040, 0x1526: 0x0040, 0x1527: 0x0040, 0x1528: 0x0040, 0x1529: 0x0040,
-	0x152a: 0x0040, 0x152b: 0x0040, 0x152c: 0x0040, 0x152d: 0x0040, 0x152e: 0x0040, 0x152f: 0x0040,
-	0x1530: 0xaab1, 0x1531: 0xaae9, 0x1532: 0xab21, 0x1533: 0xab69, 0x1534: 0xabb1, 0x1535: 0xabf9,
-	0x1536: 0xac41, 0x1537: 0xac89, 0x1538: 0xacd1, 0x1539: 0xad19, 0x153a: 0xad52, 0x153b: 0xae62,
-	0x153c: 0xaee1, 0x153d: 0x0018, 0x153e: 0x0040, 0x153f: 0x0040,
+	0x1500: 0x7ecd, 0x1501: 0x7eed, 0x1502: 0x7f0d, 0x1503: 0x7eed, 0x1504: 0x7f2d, 0x1505: 0x0018,
+	0x1506: 0x0018, 0x1507: 0x1ff2, 0x1508: 0x1ffa, 0x1509: 0x7f4e, 0x150a: 0x7f6e, 0x150b: 0x7f8e,
+	0x150c: 0x7fae, 0x150d: 0x1fda, 0x150e: 0x1fda, 0x150f: 0x1fda, 0x1510: 0x1fba, 0x1511: 0x7fcd,
+	0x1512: 0x0040, 0x1513: 0x0040, 0x1514: 0x0122, 0x1515: 0x1fc2, 0x1516: 0x1fd2, 0x1517: 0x1fca,
+	0x1518: 0x7fed, 0x1519: 0x072a, 0x151a: 0x0732, 0x151b: 0x1fe2, 0x151c: 0x1fea, 0x151d: 0x7ecd,
+	0x151e: 0x7f2d, 0x151f: 0x2002, 0x1520: 0x200a, 0x1521: 0x2012, 0x1522: 0x071a, 0x1523: 0x2019,
+	0x1524: 0x2022, 0x1525: 0x202a, 0x1526: 0x0722, 0x1527: 0x0040, 0x1528: 0x2032, 0x1529: 0x203a,
+	0x152a: 0x2042, 0x152b: 0x204a, 0x152c: 0x0040, 0x152d: 0x0040, 0x152e: 0x0040, 0x152f: 0x0040,
+	0x1530: 0x800e, 0x1531: 0x2051, 0x1532: 0x802e, 0x1533: 0x0808, 0x1534: 0x804e, 0x1535: 0x0040,
+	0x1536: 0x806e, 0x1537: 0x2059, 0x1538: 0x808e, 0x1539: 0x2061, 0x153a: 0x80ae, 0x153b: 0x2069,
+	0x153c: 0x80ce, 0x153d: 0x2071, 0x153e: 0x80ee, 0x153f: 0x2079,
 	// Block 0x55, offset 0x1540
-	0x1540: 0x33c0, 0x1541: 0x33c0, 0x1542: 0x33c0, 0x1543: 0x33c0, 0x1544: 0x33c0, 0x1545: 0x33c0,
-	0x1546: 0x33c0, 0x1547: 0x33c0, 0x1548: 0x33c0, 0x1549: 0x33c0, 0x154a: 0x33c0, 0x154b: 0x33c0,
-	0x154c: 0x33c0, 0x154d: 0x33c0, 0x154e: 0x33c0, 0x154f: 0x33c0, 0x1550: 0xaf2a, 0x1551: 0x7d8d,
-	0x1552: 0x0040, 0x1553: 0xaf3a, 0x1554: 0x03c2, 0x1555: 0xaf4a, 0x1556: 0xaf5a, 0x1557: 0x7dad,
-	0x1558: 0x7dcd, 0x1559: 0x0040, 0x155a: 0x0040, 0x155b: 0x0040, 0x155c: 0x0040, 0x155d: 0x0040,
-	0x155e: 0x0040, 0x155f: 0x0040, 0x1560: 0x3308, 0x1561: 0x3308, 0x1562: 0x3308, 0x1563: 0x3308,
-	0x1564: 0x3308, 0x1565: 0x3308, 0x1566: 0x3308, 0x1567: 0x3308, 0x1568: 0x3308, 0x1569: 0x3308,
-	0x156a: 0x3308, 0x156b: 0x3308, 0x156c: 0x3308, 0x156d: 0x3308, 0x156e: 0x3308, 0x156f: 0x3308,
-	0x1570: 0x0040, 0x1571: 0x7ded, 0x1572: 0x7e0d, 0x1573: 0xaf6a, 0x1574: 0xaf6a, 0x1575: 0x1fd2,
-	0x1576: 0x1fe2, 0x1577: 0xaf7a, 0x1578: 0xaf8a, 0x1579: 0x7e2d, 0x157a: 0x7e4d, 0x157b: 0x7e6d,
-	0x157c: 0x7e2d, 0x157d: 0x7e8d, 0x157e: 0x7ead, 0x157f: 0x7e8d,
+	0x1540: 0x2081, 0x1541: 0x2089, 0x1542: 0x2089, 0x1543: 0x2091, 0x1544: 0x2091, 0x1545: 0x2099,
+	0x1546: 0x2099, 0x1547: 0x20a1, 0x1548: 0x20a1, 0x1549: 0x20a9, 0x154a: 0x20a9, 0x154b: 0x20a9,
+	0x154c: 0x20a9, 0x154d: 0x20b1, 0x154e: 0x20b1, 0x154f: 0x20b9, 0x1550: 0x20b9, 0x1551: 0x20b9,
+	0x1552: 0x20b9, 0x1553: 0x20c1, 0x1554: 0x20c1, 0x1555: 0x20c9, 0x1556: 0x20c9, 0x1557: 0x20c9,
+	0x1558: 0x20c9, 0x1559: 0x20d1, 0x155a: 0x20d1, 0x155b: 0x20d1, 0x155c: 0x20d1, 0x155d: 0x20d9,
+	0x155e: 0x20d9, 0x155f: 0x20d9, 0x1560: 0x20d9, 0x1561: 0x20e1, 0x1562: 0x20e1, 0x1563: 0x20e1,
+	0x1564: 0x20e1, 0x1565: 0x20e9, 0x1566: 0x20e9, 0x1567: 0x20e9, 0x1568: 0x20e9, 0x1569: 0x20f1,
+	0x156a: 0x20f1, 0x156b: 0x20f9, 0x156c: 0x20f9, 0x156d: 0x2101, 0x156e: 0x2101, 0x156f: 0x2109,
+	0x1570: 0x2109, 0x1571: 0x2111, 0x1572: 0x2111, 0x1573: 0x2111, 0x1574: 0x2111, 0x1575: 0x2119,
+	0x1576: 0x2119, 0x1577: 0x2119, 0x1578: 0x2119, 0x1579: 0x2121, 0x157a: 0x2121, 0x157b: 0x2121,
+	0x157c: 0x2121, 0x157d: 0x2129, 0x157e: 0x2129, 0x157f: 0x2129,
 	// Block 0x56, offset 0x1580
-	0x1580: 0x7ecd, 0x1581: 0x7eed, 0x1582: 0x7f0d, 0x1583: 0x7eed, 0x1584: 0x7f2d, 0x1585: 0x0018,
-	0x1586: 0x0018, 0x1587: 0xaf9a, 0x1588: 0xafaa, 0x1589: 0x7f4e, 0x158a: 0x7f6e, 0x158b: 0x7f8e,
-	0x158c: 0x7fae, 0x158d: 0xaf6a, 0x158e: 0xaf6a, 0x158f: 0xaf6a, 0x1590: 0xaf2a, 0x1591: 0x7fcd,
-	0x1592: 0x0040, 0x1593: 0x0040, 0x1594: 0x03c2, 0x1595: 0xaf3a, 0x1596: 0xaf5a, 0x1597: 0xaf4a,
-	0x1598: 0x7fed, 0x1599: 0x1fd2, 0x159a: 0x1fe2, 0x159b: 0xaf7a, 0x159c: 0xaf8a, 0x159d: 0x7ecd,
-	0x159e: 0x7f2d, 0x159f: 0xafba, 0x15a0: 0xafca, 0x15a1: 0xafda, 0x15a2: 0x1fb2, 0x15a3: 0xafe9,
-	0x15a4: 0xaffa, 0x15a5: 0xb00a, 0x15a6: 0x1fc2, 0x15a7: 0x0040, 0x15a8: 0xb01a, 0x15a9: 0xb02a,
-	0x15aa: 0xb03a, 0x15ab: 0xb04a, 0x15ac: 0x0040, 0x15ad: 0x0040, 0x15ae: 0x0040, 0x15af: 0x0040,
-	0x15b0: 0x800e, 0x15b1: 0xb059, 0x15b2: 0x802e, 0x15b3: 0x0808, 0x15b4: 0x804e, 0x15b5: 0x0040,
-	0x15b6: 0x806e, 0x15b7: 0xb081, 0x15b8: 0x808e, 0x15b9: 0xb0a9, 0x15ba: 0x80ae, 0x15bb: 0xb0d1,
-	0x15bc: 0x80ce, 0x15bd: 0xb0f9, 0x15be: 0x80ee, 0x15bf: 0xb121,
+	0x1580: 0x2129, 0x1581: 0x2131, 0x1582: 0x2131, 0x1583: 0x2131, 0x1584: 0x2131, 0x1585: 0x2139,
+	0x1586: 0x2139, 0x1587: 0x2139, 0x1588: 0x2139, 0x1589: 0x2141, 0x158a: 0x2141, 0x158b: 0x2141,
+	0x158c: 0x2141, 0x158d: 0x2149, 0x158e: 0x2149, 0x158f: 0x2149, 0x1590: 0x2149, 0x1591: 0x2151,
+	0x1592: 0x2151, 0x1593: 0x2151, 0x1594: 0x2151, 0x1595: 0x2159, 0x1596: 0x2159, 0x1597: 0x2159,
+	0x1598: 0x2159, 0x1599: 0x2161, 0x159a: 0x2161, 0x159b: 0x2161, 0x159c: 0x2161, 0x159d: 0x2169,
+	0x159e: 0x2169, 0x159f: 0x2169, 0x15a0: 0x2169, 0x15a1: 0x2171, 0x15a2: 0x2171, 0x15a3: 0x2171,
+	0x15a4: 0x2171, 0x15a5: 0x2179, 0x15a6: 0x2179, 0x15a7: 0x2179, 0x15a8: 0x2179, 0x15a9: 0x2181,
+	0x15aa: 0x2181, 0x15ab: 0x2181, 0x15ac: 0x2181, 0x15ad: 0x2189, 0x15ae: 0x2189, 0x15af: 0x1701,
+	0x15b0: 0x1701, 0x15b1: 0x2191, 0x15b2: 0x2191, 0x15b3: 0x2191, 0x15b4: 0x2191, 0x15b5: 0x2199,
+	0x15b6: 0x2199, 0x15b7: 0x21a1, 0x15b8: 0x21a1, 0x15b9: 0x21a9, 0x15ba: 0x21a9, 0x15bb: 0x21b1,
+	0x15bc: 0x21b1, 0x15bd: 0x0040, 0x15be: 0x0040, 0x15bf: 0x03c0,
 	// Block 0x57, offset 0x15c0
-	0x15c0: 0xb149, 0x15c1: 0xb161, 0x15c2: 0xb161, 0x15c3: 0xb179, 0x15c4: 0xb179, 0x15c5: 0xb191,
-	0x15c6: 0xb191, 0x15c7: 0xb1a9, 0x15c8: 0xb1a9, 0x15c9: 0xb1c1, 0x15ca: 0xb1c1, 0x15cb: 0xb1c1,
-	0x15cc: 0xb1c1, 0x15cd: 0xb1d9, 0x15ce: 0xb1d9, 0x15cf: 0xb1f1, 0x15d0: 0xb1f1, 0x15d1: 0xb1f1,
-	0x15d2: 0xb1f1, 0x15d3: 0xb209, 0x15d4: 0xb209, 0x15d5: 0xb221, 0x15d6: 0xb221, 0x15d7: 0xb221,
-	0x15d8: 0xb221, 0x15d9: 0xb239, 0x15da: 0xb239, 0x15db: 0xb239, 0x15dc: 0xb239, 0x15dd: 0xb251,
-	0x15de: 0xb251, 0x15df: 0xb251, 0x15e0: 0xb251, 0x15e1: 0xb269, 0x15e2: 0xb269, 0x15e3: 0xb269,
-	0x15e4: 0xb269, 0x15e5: 0xb281, 0x15e6: 0xb281, 0x15e7: 0xb281, 0x15e8: 0xb281, 0x15e9: 0xb299,
-	0x15ea: 0xb299, 0x15eb: 0xb2b1, 0x15ec: 0xb2b1, 0x15ed: 0xb2c9, 0x15ee: 0xb2c9, 0x15ef: 0xb2e1,
-	0x15f0: 0xb2e1, 0x15f1: 0xb2f9, 0x15f2: 0xb2f9, 0x15f3: 0xb2f9, 0x15f4: 0xb2f9, 0x15f5: 0xb311,
-	0x15f6: 0xb311, 0x15f7: 0xb311, 0x15f8: 0xb311, 0x15f9: 0xb329, 0x15fa: 0xb329, 0x15fb: 0xb329,
-	0x15fc: 0xb329, 0x15fd: 0xb341, 0x15fe: 0xb341, 0x15ff: 0xb341,
+	0x15c0: 0x0040, 0x15c1: 0x1fca, 0x15c2: 0x21ba, 0x15c3: 0x2002, 0x15c4: 0x203a, 0x15c5: 0x2042,
+	0x15c6: 0x200a, 0x15c7: 0x21c2, 0x15c8: 0x072a, 0x15c9: 0x0732, 0x15ca: 0x2012, 0x15cb: 0x071a,
+	0x15cc: 0x1fba, 0x15cd: 0x2019, 0x15ce: 0x0961, 0x15cf: 0x21ca, 0x15d0: 0x06e1, 0x15d1: 0x0049,
+	0x15d2: 0x0029, 0x15d3: 0x0031, 0x15d4: 0x06e9, 0x15d5: 0x06f1, 0x15d6: 0x06f9, 0x15d7: 0x0701,
+	0x15d8: 0x0709, 0x15d9: 0x0711, 0x15da: 0x1fc2, 0x15db: 0x0122, 0x15dc: 0x2022, 0x15dd: 0x0722,
+	0x15de: 0x202a, 0x15df: 0x1fd2, 0x15e0: 0x204a, 0x15e1: 0x0019, 0x15e2: 0x02e9, 0x15e3: 0x03d9,
+	0x15e4: 0x02f1, 0x15e5: 0x02f9, 0x15e6: 0x03f1, 0x15e7: 0x0309, 0x15e8: 0x00a9, 0x15e9: 0x0311,
+	0x15ea: 0x00b1, 0x15eb: 0x0319, 0x15ec: 0x0101, 0x15ed: 0x0321, 0x15ee: 0x0329, 0x15ef: 0x0051,
+	0x15f0: 0x0339, 0x15f1: 0x0751, 0x15f2: 0x00b9, 0x15f3: 0x0089, 0x15f4: 0x0341, 0x15f5: 0x0349,
+	0x15f6: 0x0391, 0x15f7: 0x00c1, 0x15f8: 0x0109, 0x15f9: 0x00c9, 0x15fa: 0x04b1, 0x15fb: 0x1ff2,
+	0x15fc: 0x2032, 0x15fd: 0x1ffa, 0x15fe: 0x21d2, 0x15ff: 0x1fda,
 	// Block 0x58, offset 0x1600
-	0x1600: 0xb341, 0x1601: 0xb359, 0x1602: 0xb359, 0x1603: 0xb359, 0x1604: 0xb359, 0x1605: 0xb371,
-	0x1606: 0xb371, 0x1607: 0xb371, 0x1608: 0xb371, 0x1609: 0xb389, 0x160a: 0xb389, 0x160b: 0xb389,
-	0x160c: 0xb389, 0x160d: 0xb3a1, 0x160e: 0xb3a1, 0x160f: 0xb3a1, 0x1610: 0xb3a1, 0x1611: 0xb3b9,
-	0x1612: 0xb3b9, 0x1613: 0xb3b9, 0x1614: 0xb3b9, 0x1615: 0xb3d1, 0x1616: 0xb3d1, 0x1617: 0xb3d1,
-	0x1618: 0xb3d1, 0x1619: 0xb3e9, 0x161a: 0xb3e9, 0x161b: 0xb3e9, 0x161c: 0xb3e9, 0x161d: 0xb401,
-	0x161e: 0xb401, 0x161f: 0xb401, 0x1620: 0xb401, 0x1621: 0xb419, 0x1622: 0xb419, 0x1623: 0xb419,
-	0x1624: 0xb419, 0x1625: 0xb431, 0x1626: 0xb431, 0x1627: 0xb431, 0x1628: 0xb431, 0x1629: 0xb449,
-	0x162a: 0xb449, 0x162b: 0xb449, 0x162c: 0xb449, 0x162d: 0xb461, 0x162e: 0xb461, 0x162f: 0x7b01,
-	0x1630: 0x7b01, 0x1631: 0xb479, 0x1632: 0xb479, 0x1633: 0xb479, 0x1634: 0xb479, 0x1635: 0xb491,
-	0x1636: 0xb491, 0x1637: 0xb4b9, 0x1638: 0xb4b9, 0x1639: 0xb4e1, 0x163a: 0xb4e1, 0x163b: 0xb509,
-	0x163c: 0xb509, 0x163d: 0x0040, 0x163e: 0x0040, 0x163f: 0x03c0,
+	0x1600: 0x0672, 0x1601: 0x0019, 0x1602: 0x02e9, 0x1603: 0x03d9, 0x1604: 0x02f1, 0x1605: 0x02f9,
+	0x1606: 0x03f1, 0x1607: 0x0309, 0x1608: 0x00a9, 0x1609: 0x0311, 0x160a: 0x00b1, 0x160b: 0x0319,
+	0x160c: 0x0101, 0x160d: 0x0321, 0x160e: 0x0329, 0x160f: 0x0051, 0x1610: 0x0339, 0x1611: 0x0751,
+	0x1612: 0x00b9, 0x1613: 0x0089, 0x1614: 0x0341, 0x1615: 0x0349, 0x1616: 0x0391, 0x1617: 0x00c1,
+	0x1618: 0x0109, 0x1619: 0x00c9, 0x161a: 0x04b1, 0x161b: 0x1fe2, 0x161c: 0x21da, 0x161d: 0x1fea,
+	0x161e: 0x21e2, 0x161f: 0x810d, 0x1620: 0x812d, 0x1621: 0x0961, 0x1622: 0x814d, 0x1623: 0x814d,
+	0x1624: 0x816d, 0x1625: 0x818d, 0x1626: 0x81ad, 0x1627: 0x81cd, 0x1628: 0x81ed, 0x1629: 0x820d,
+	0x162a: 0x822d, 0x162b: 0x824d, 0x162c: 0x826d, 0x162d: 0x828d, 0x162e: 0x82ad, 0x162f: 0x82cd,
+	0x1630: 0x82ed, 0x1631: 0x830d, 0x1632: 0x832d, 0x1633: 0x834d, 0x1634: 0x836d, 0x1635: 0x838d,
+	0x1636: 0x83ad, 0x1637: 0x83cd, 0x1638: 0x83ed, 0x1639: 0x840d, 0x163a: 0x842d, 0x163b: 0x844d,
+	0x163c: 0x81ed, 0x163d: 0x846d, 0x163e: 0x848d, 0x163f: 0x824d,
 	// Block 0x59, offset 0x1640
-	0x1640: 0x0040, 0x1641: 0xaf4a, 0x1642: 0xb532, 0x1643: 0xafba, 0x1644: 0xb02a, 0x1645: 0xb03a,
-	0x1646: 0xafca, 0x1647: 0xb542, 0x1648: 0x1fd2, 0x1649: 0x1fe2, 0x164a: 0xafda, 0x164b: 0x1fb2,
-	0x164c: 0xaf2a, 0x164d: 0xafe9, 0x164e: 0x29d1, 0x164f: 0xb552, 0x1650: 0x1f41, 0x1651: 0x00c9,
-	0x1652: 0x0069, 0x1653: 0x0079, 0x1654: 0x1f51, 0x1655: 0x1f61, 0x1656: 0x1f71, 0x1657: 0x1f81,
-	0x1658: 0x1f91, 0x1659: 0x1fa1, 0x165a: 0xaf3a, 0x165b: 0x03c2, 0x165c: 0xaffa, 0x165d: 0x1fc2,
-	0x165e: 0xb00a, 0x165f: 0xaf5a, 0x1660: 0xb04a, 0x1661: 0x0039, 0x1662: 0x0ee9, 0x1663: 0x1159,
-	0x1664: 0x0ef9, 0x1665: 0x0f09, 0x1666: 0x1199, 0x1667: 0x0f31, 0x1668: 0x0249, 0x1669: 0x0f41,
-	0x166a: 0x0259, 0x166b: 0x0f51, 0x166c: 0x0359, 0x166d: 0x0f61, 0x166e: 0x0f71, 0x166f: 0x00d9,
-	0x1670: 0x0f99, 0x1671: 0x2039, 0x1672: 0x0269, 0x1673: 0x01d9, 0x1674: 0x0fa9, 0x1675: 0x0fb9,
-	0x1676: 0x1089, 0x1677: 0x0279, 0x1678: 0x0369, 0x1679: 0x0289, 0x167a: 0x13d1, 0x167b: 0xaf9a,
-	0x167c: 0xb01a, 0x167d: 0xafaa, 0x167e: 0xb562, 0x167f: 0xaf6a,
+	0x1640: 0x84ad, 0x1641: 0x84cd, 0x1642: 0x84ed, 0x1643: 0x850d, 0x1644: 0x852d, 0x1645: 0x854d,
+	0x1646: 0x856d, 0x1647: 0x858d, 0x1648: 0x850d, 0x1649: 0x85ad, 0x164a: 0x850d, 0x164b: 0x85cd,
+	0x164c: 0x85cd, 0x164d: 0x85ed, 0x164e: 0x85ed, 0x164f: 0x860d, 0x1650: 0x854d, 0x1651: 0x862d,
+	0x1652: 0x864d, 0x1653: 0x862d, 0x1654: 0x866d, 0x1655: 0x864d, 0x1656: 0x868d, 0x1657: 0x868d,
+	0x1658: 0x86ad, 0x1659: 0x86ad, 0x165a: 0x86cd, 0x165b: 0x86cd, 0x165c: 0x864d, 0x165d: 0x814d,
+	0x165e: 0x86ed, 0x165f: 0x870d, 0x1660: 0x0040, 0x1661: 0x872d, 0x1662: 0x874d, 0x1663: 0x876d,
+	0x1664: 0x878d, 0x1665: 0x876d, 0x1666: 0x87ad, 0x1667: 0x87cd, 0x1668: 0x87ed, 0x1669: 0x87ed,
+	0x166a: 0x880d, 0x166b: 0x880d, 0x166c: 0x882d, 0x166d: 0x882d, 0x166e: 0x880d, 0x166f: 0x880d,
+	0x1670: 0x884d, 0x1671: 0x886d, 0x1672: 0x888d, 0x1673: 0x88ad, 0x1674: 0x88cd, 0x1675: 0x88ed,
+	0x1676: 0x88ed, 0x1677: 0x88ed, 0x1678: 0x890d, 0x1679: 0x890d, 0x167a: 0x890d, 0x167b: 0x890d,
+	0x167c: 0x87ed, 0x167d: 0x87ed, 0x167e: 0x87ed, 0x167f: 0x0040,
 	// Block 0x5a, offset 0x1680
-	0x1680: 0x1caa, 0x1681: 0x0039, 0x1682: 0x0ee9, 0x1683: 0x1159, 0x1684: 0x0ef9, 0x1685: 0x0f09,
-	0x1686: 0x1199, 0x1687: 0x0f31, 0x1688: 0x0249, 0x1689: 0x0f41, 0x168a: 0x0259, 0x168b: 0x0f51,
-	0x168c: 0x0359, 0x168d: 0x0f61, 0x168e: 0x0f71, 0x168f: 0x00d9, 0x1690: 0x0f99, 0x1691: 0x2039,
-	0x1692: 0x0269, 0x1693: 0x01d9, 0x1694: 0x0fa9, 0x1695: 0x0fb9, 0x1696: 0x1089, 0x1697: 0x0279,
-	0x1698: 0x0369, 0x1699: 0x0289, 0x169a: 0x13d1, 0x169b: 0xaf7a, 0x169c: 0xb572, 0x169d: 0xaf8a,
-	0x169e: 0xb582, 0x169f: 0x810d, 0x16a0: 0x812d, 0x16a1: 0x29d1, 0x16a2: 0x814d, 0x16a3: 0x814d,
-	0x16a4: 0x816d, 0x16a5: 0x818d, 0x16a6: 0x81ad, 0x16a7: 0x81cd, 0x16a8: 0x81ed, 0x16a9: 0x820d,
-	0x16aa: 0x822d, 0x16ab: 0x824d, 0x16ac: 0x826d, 0x16ad: 0x828d, 0x16ae: 0x82ad, 0x16af: 0x82cd,
-	0x16b0: 0x82ed, 0x16b1: 0x830d, 0x16b2: 0x832d, 0x16b3: 0x834d, 0x16b4: 0x836d, 0x16b5: 0x838d,
-	0x16b6: 0x83ad, 0x16b7: 0x83cd, 0x16b8: 0x83ed, 0x16b9: 0x840d, 0x16ba: 0x842d, 0x16bb: 0x844d,
-	0x16bc: 0x81ed, 0x16bd: 0x846d, 0x16be: 0x848d, 0x16bf: 0x824d,
+	0x1680: 0x0040, 0x1681: 0x0040, 0x1682: 0x874d, 0x1683: 0x872d, 0x1684: 0x892d, 0x1685: 0x872d,
+	0x1686: 0x874d, 0x1687: 0x872d, 0x1688: 0x0040, 0x1689: 0x0040, 0x168a: 0x894d, 0x168b: 0x874d,
+	0x168c: 0x896d, 0x168d: 0x892d, 0x168e: 0x896d, 0x168f: 0x874d, 0x1690: 0x0040, 0x1691: 0x0040,
+	0x1692: 0x898d, 0x1693: 0x89ad, 0x1694: 0x88ad, 0x1695: 0x896d, 0x1696: 0x892d, 0x1697: 0x896d,
+	0x1698: 0x0040, 0x1699: 0x0040, 0x169a: 0x89cd, 0x169b: 0x89ed, 0x169c: 0x89cd, 0x169d: 0x0040,
+	0x169e: 0x0040, 0x169f: 0x0040, 0x16a0: 0x21e9, 0x16a1: 0x21f1, 0x16a2: 0x21f9, 0x16a3: 0x8a0e,
+	0x16a4: 0x2201, 0x16a5: 0x2209, 0x16a6: 0x8a2d, 0x16a7: 0x0040, 0x16a8: 0x8a4d, 0x16a9: 0x8a6d,
+	0x16aa: 0x8a8d, 0x16ab: 0x8a6d, 0x16ac: 0x8aad, 0x16ad: 0x8acd, 0x16ae: 0x8aed, 0x16af: 0x0040,
+	0x16b0: 0x0040, 0x16b1: 0x0040, 0x16b2: 0x0040, 0x16b3: 0x0040, 0x16b4: 0x0040, 0x16b5: 0x0040,
+	0x16b6: 0x0040, 0x16b7: 0x0040, 0x16b8: 0x0040, 0x16b9: 0x0340, 0x16ba: 0x0340, 0x16bb: 0x0340,
+	0x16bc: 0x0040, 0x16bd: 0x0040, 0x16be: 0x0040, 0x16bf: 0x0040,
 	// Block 0x5b, offset 0x16c0
-	0x16c0: 0x84ad, 0x16c1: 0x84cd, 0x16c2: 0x84ed, 0x16c3: 0x850d, 0x16c4: 0x852d, 0x16c5: 0x854d,
-	0x16c6: 0x856d, 0x16c7: 0x858d, 0x16c8: 0x850d, 0x16c9: 0x85ad, 0x16ca: 0x850d, 0x16cb: 0x85cd,
-	0x16cc: 0x85cd, 0x16cd: 0x85ed, 0x16ce: 0x85ed, 0x16cf: 0x860d, 0x16d0: 0x854d, 0x16d1: 0x862d,
-	0x16d2: 0x864d, 0x16d3: 0x862d, 0x16d4: 0x866d, 0x16d5: 0x864d, 0x16d6: 0x868d, 0x16d7: 0x868d,
-	0x16d8: 0x86ad, 0x16d9: 0x86ad, 0x16da: 0x86cd, 0x16db: 0x86cd, 0x16dc: 0x864d, 0x16dd: 0x814d,
-	0x16de: 0x86ed, 0x16df: 0x870d, 0x16e0: 0x0040, 0x16e1: 0x872d, 0x16e2: 0x874d, 0x16e3: 0x876d,
-	0x16e4: 0x878d, 0x16e5: 0x876d, 0x16e6: 0x87ad, 0x16e7: 0x87cd, 0x16e8: 0x87ed, 0x16e9: 0x87ed,
-	0x16ea: 0x880d, 0x16eb: 0x880d, 0x16ec: 0x882d, 0x16ed: 0x882d, 0x16ee: 0x880d, 0x16ef: 0x880d,
-	0x16f0: 0x884d, 0x16f1: 0x886d, 0x16f2: 0x888d, 0x16f3: 0x88ad, 0x16f4: 0x88cd, 0x16f5: 0x88ed,
-	0x16f6: 0x88ed, 0x16f7: 0x88ed, 0x16f8: 0x890d, 0x16f9: 0x890d, 0x16fa: 0x890d, 0x16fb: 0x890d,
-	0x16fc: 0x87ed, 0x16fd: 0x87ed, 0x16fe: 0x87ed, 0x16ff: 0x0040,
+	0x16c0: 0x0a08, 0x16c1: 0x0a08, 0x16c2: 0x0a08, 0x16c3: 0x0a08, 0x16c4: 0x0a08, 0x16c5: 0x0c08,
+	0x16c6: 0x0808, 0x16c7: 0x0c08, 0x16c8: 0x0818, 0x16c9: 0x0c08, 0x16ca: 0x0c08, 0x16cb: 0x0808,
+	0x16cc: 0x0808, 0x16cd: 0x0908, 0x16ce: 0x0c08, 0x16cf: 0x0c08, 0x16d0: 0x0c08, 0x16d1: 0x0c08,
+	0x16d2: 0x0c08, 0x16d3: 0x0a08, 0x16d4: 0x0a08, 0x16d5: 0x0a08, 0x16d6: 0x0a08, 0x16d7: 0x0908,
+	0x16d8: 0x0a08, 0x16d9: 0x0a08, 0x16da: 0x0a08, 0x16db: 0x0a08, 0x16dc: 0x0a08, 0x16dd: 0x0c08,
+	0x16de: 0x0a08, 0x16df: 0x0a08, 0x16e0: 0x0a08, 0x16e1: 0x0c08, 0x16e2: 0x0808, 0x16e3: 0x0808,
+	0x16e4: 0x0c08, 0x16e5: 0x3308, 0x16e6: 0x3308, 0x16e7: 0x0040, 0x16e8: 0x0040, 0x16e9: 0x0040,
+	0x16ea: 0x0040, 0x16eb: 0x0a18, 0x16ec: 0x0a18, 0x16ed: 0x0a18, 0x16ee: 0x0a18, 0x16ef: 0x0c18,
+	0x16f0: 0x0818, 0x16f1: 0x0818, 0x16f2: 0x0818, 0x16f3: 0x0818, 0x16f4: 0x0818, 0x16f5: 0x0818,
+	0x16f6: 0x0818, 0x16f7: 0x0040, 0x16f8: 0x0040, 0x16f9: 0x0040, 0x16fa: 0x0040, 0x16fb: 0x0040,
+	0x16fc: 0x0040, 0x16fd: 0x0040, 0x16fe: 0x0040, 0x16ff: 0x0040,
 	// Block 0x5c, offset 0x1700
-	0x1700: 0x0040, 0x1701: 0x0040, 0x1702: 0x874d, 0x1703: 0x872d, 0x1704: 0x892d, 0x1705: 0x872d,
-	0x1706: 0x874d, 0x1707: 0x872d, 0x1708: 0x0040, 0x1709: 0x0040, 0x170a: 0x894d, 0x170b: 0x874d,
-	0x170c: 0x896d, 0x170d: 0x892d, 0x170e: 0x896d, 0x170f: 0x874d, 0x1710: 0x0040, 0x1711: 0x0040,
-	0x1712: 0x898d, 0x1713: 0x89ad, 0x1714: 0x88ad, 0x1715: 0x896d, 0x1716: 0x892d, 0x1717: 0x896d,
-	0x1718: 0x0040, 0x1719: 0x0040, 0x171a: 0x89cd, 0x171b: 0x89ed, 0x171c: 0x89cd, 0x171d: 0x0040,
-	0x171e: 0x0040, 0x171f: 0x0040, 0x1720: 0xb591, 0x1721: 0xb5a9, 0x1722: 0xb5c1, 0x1723: 0x8a0e,
-	0x1724: 0xb5d9, 0x1725: 0xb5f1, 0x1726: 0x8a2d, 0x1727: 0x0040, 0x1728: 0x8a4d, 0x1729: 0x8a6d,
-	0x172a: 0x8a8d, 0x172b: 0x8a6d, 0x172c: 0x8aad, 0x172d: 0x8acd, 0x172e: 0x8aed, 0x172f: 0x0040,
+	0x1700: 0x0a08, 0x1701: 0x0c08, 0x1702: 0x0a08, 0x1703: 0x0c08, 0x1704: 0x0c08, 0x1705: 0x0c08,
+	0x1706: 0x0a08, 0x1707: 0x0a08, 0x1708: 0x0a08, 0x1709: 0x0c08, 0x170a: 0x0a08, 0x170b: 0x0a08,
+	0x170c: 0x0c08, 0x170d: 0x0a08, 0x170e: 0x0c08, 0x170f: 0x0c08, 0x1710: 0x0a08, 0x1711: 0x0c08,
+	0x1712: 0x0040, 0x1713: 0x0040, 0x1714: 0x0040, 0x1715: 0x0040, 0x1716: 0x0040, 0x1717: 0x0040,
+	0x1718: 0x0040, 0x1719: 0x0818, 0x171a: 0x0818, 0x171b: 0x0818, 0x171c: 0x0818, 0x171d: 0x0040,
+	0x171e: 0x0040, 0x171f: 0x0040, 0x1720: 0x0040, 0x1721: 0x0040, 0x1722: 0x0040, 0x1723: 0x0040,
+	0x1724: 0x0040, 0x1725: 0x0040, 0x1726: 0x0040, 0x1727: 0x0040, 0x1728: 0x0040, 0x1729: 0x0c18,
+	0x172a: 0x0c18, 0x172b: 0x0c18, 0x172c: 0x0c18, 0x172d: 0x0a18, 0x172e: 0x0a18, 0x172f: 0x0818,
 	0x1730: 0x0040, 0x1731: 0x0040, 0x1732: 0x0040, 0x1733: 0x0040, 0x1734: 0x0040, 0x1735: 0x0040,
-	0x1736: 0x0040, 0x1737: 0x0040, 0x1738: 0x0040, 0x1739: 0x0340, 0x173a: 0x0340, 0x173b: 0x0340,
+	0x1736: 0x0040, 0x1737: 0x0040, 0x1738: 0x0040, 0x1739: 0x0040, 0x173a: 0x0040, 0x173b: 0x0040,
 	0x173c: 0x0040, 0x173d: 0x0040, 0x173e: 0x0040, 0x173f: 0x0040,
 	// Block 0x5d, offset 0x1740
-	0x1740: 0x0a08, 0x1741: 0x0a08, 0x1742: 0x0a08, 0x1743: 0x0a08, 0x1744: 0x0a08, 0x1745: 0x0c08,
-	0x1746: 0x0808, 0x1747: 0x0c08, 0x1748: 0x0818, 0x1749: 0x0c08, 0x174a: 0x0c08, 0x174b: 0x0808,
-	0x174c: 0x0808, 0x174d: 0x0908, 0x174e: 0x0c08, 0x174f: 0x0c08, 0x1750: 0x0c08, 0x1751: 0x0c08,
-	0x1752: 0x0c08, 0x1753: 0x0a08, 0x1754: 0x0a08, 0x1755: 0x0a08, 0x1756: 0x0a08, 0x1757: 0x0908,
-	0x1758: 0x0a08, 0x1759: 0x0a08, 0x175a: 0x0a08, 0x175b: 0x0a08, 0x175c: 0x0a08, 0x175d: 0x0c08,
-	0x175e: 0x0a08, 0x175f: 0x0a08, 0x1760: 0x0a08, 0x1761: 0x0c08, 0x1762: 0x0808, 0x1763: 0x0808,
-	0x1764: 0x0c08, 0x1765: 0x3308, 0x1766: 0x3308, 0x1767: 0x0040, 0x1768: 0x0040, 0x1769: 0x0040,
-	0x176a: 0x0040, 0x176b: 0x0a18, 0x176c: 0x0a18, 0x176d: 0x0a18, 0x176e: 0x0a18, 0x176f: 0x0c18,
-	0x1770: 0x0818, 0x1771: 0x0818, 0x1772: 0x0818, 0x1773: 0x0818, 0x1774: 0x0818, 0x1775: 0x0818,
-	0x1776: 0x0818, 0x1777: 0x0040, 0x1778: 0x0040, 0x1779: 0x0040, 0x177a: 0x0040, 0x177b: 0x0040,
-	0x177c: 0x0040, 0x177d: 0x0040, 0x177e: 0x0040, 0x177f: 0x0040,
+	0x1740: 0x3308, 0x1741: 0x3308, 0x1742: 0x3008, 0x1743: 0x3008, 0x1744: 0x0040, 0x1745: 0x0008,
+	0x1746: 0x0008, 0x1747: 0x0008, 0x1748: 0x0008, 0x1749: 0x0008, 0x174a: 0x0008, 0x174b: 0x0008,
+	0x174c: 0x0008, 0x174d: 0x0040, 0x174e: 0x0040, 0x174f: 0x0008, 0x1750: 0x0008, 0x1751: 0x0040,
+	0x1752: 0x0040, 0x1753: 0x0008, 0x1754: 0x0008, 0x1755: 0x0008, 0x1756: 0x0008, 0x1757: 0x0008,
+	0x1758: 0x0008, 0x1759: 0x0008, 0x175a: 0x0008, 0x175b: 0x0008, 0x175c: 0x0008, 0x175d: 0x0008,
+	0x175e: 0x0008, 0x175f: 0x0008, 0x1760: 0x0008, 0x1761: 0x0008, 0x1762: 0x0008, 0x1763: 0x0008,
+	0x1764: 0x0008, 0x1765: 0x0008, 0x1766: 0x0008, 0x1767: 0x0008, 0x1768: 0x0008, 0x1769: 0x0040,
+	0x176a: 0x0008, 0x176b: 0x0008, 0x176c: 0x0008, 0x176d: 0x0008, 0x176e: 0x0008, 0x176f: 0x0008,
+	0x1770: 0x0008, 0x1771: 0x0040, 0x1772: 0x0008, 0x1773: 0x0008, 0x1774: 0x0040, 0x1775: 0x0008,
+	0x1776: 0x0008, 0x1777: 0x0008, 0x1778: 0x0008, 0x1779: 0x0008, 0x177a: 0x0040, 0x177b: 0x3308,
+	0x177c: 0x3308, 0x177d: 0x0008, 0x177e: 0x3008, 0x177f: 0x3008,
 	// Block 0x5e, offset 0x1780
-	0x1780: 0x0a08, 0x1781: 0x0c08, 0x1782: 0x0a08, 0x1783: 0x0c08, 0x1784: 0x0c08, 0x1785: 0x0c08,
-	0x1786: 0x0a08, 0x1787: 0x0a08, 0x1788: 0x0a08, 0x1789: 0x0c08, 0x178a: 0x0a08, 0x178b: 0x0a08,
-	0x178c: 0x0c08, 0x178d: 0x0a08, 0x178e: 0x0c08, 0x178f: 0x0c08, 0x1790: 0x0a08, 0x1791: 0x0c08,
-	0x1792: 0x0040, 0x1793: 0x0040, 0x1794: 0x0040, 0x1795: 0x0040, 0x1796: 0x0040, 0x1797: 0x0040,
-	0x1798: 0x0040, 0x1799: 0x0818, 0x179a: 0x0818, 0x179b: 0x0818, 0x179c: 0x0818, 0x179d: 0x0040,
-	0x179e: 0x0040, 0x179f: 0x0040, 0x17a0: 0x0040, 0x17a1: 0x0040, 0x17a2: 0x0040, 0x17a3: 0x0040,
-	0x17a4: 0x0040, 0x17a5: 0x0040, 0x17a6: 0x0040, 0x17a7: 0x0040, 0x17a8: 0x0040, 0x17a9: 0x0c18,
-	0x17aa: 0x0c18, 0x17ab: 0x0c18, 0x17ac: 0x0c18, 0x17ad: 0x0a18, 0x17ae: 0x0a18, 0x17af: 0x0818,
-	0x17b0: 0x0040, 0x17b1: 0x0040, 0x17b2: 0x0040, 0x17b3: 0x0040, 0x17b4: 0x0040, 0x17b5: 0x0040,
+	0x1780: 0x3308, 0x1781: 0x3008, 0x1782: 0x3008, 0x1783: 0x3008, 0x1784: 0x3008, 0x1785: 0x0040,
+	0x1786: 0x0040, 0x1787: 0x3008, 0x1788: 0x3008, 0x1789: 0x0040, 0x178a: 0x0040, 0x178b: 0x3008,
+	0x178c: 0x3008, 0x178d: 0x3808, 0x178e: 0x0040, 0x178f: 0x0040, 0x1790: 0x0008, 0x1791: 0x0040,
+	0x1792: 0x0040, 0x1793: 0x0040, 0x1794: 0x0040, 0x1795: 0x0040, 0x1796: 0x0040, 0x1797: 0x3008,
+	0x1798: 0x0040, 0x1799: 0x0040, 0x179a: 0x0040, 0x179b: 0x0040, 0x179c: 0x0040, 0x179d: 0x0008,
+	0x179e: 0x0008, 0x179f: 0x0008, 0x17a0: 0x0008, 0x17a1: 0x0008, 0x17a2: 0x3008, 0x17a3: 0x3008,
+	0x17a4: 0x0040, 0x17a5: 0x0040, 0x17a6: 0x3308, 0x17a7: 0x3308, 0x17a8: 0x3308, 0x17a9: 0x3308,
+	0x17aa: 0x3308, 0x17ab: 0x3308, 0x17ac: 0x3308, 0x17ad: 0x0040, 0x17ae: 0x0040, 0x17af: 0x0040,
+	0x17b0: 0x3308, 0x17b1: 0x3308, 0x17b2: 0x3308, 0x17b3: 0x3308, 0x17b4: 0x3308, 0x17b5: 0x0040,
 	0x17b6: 0x0040, 0x17b7: 0x0040, 0x17b8: 0x0040, 0x17b9: 0x0040, 0x17ba: 0x0040, 0x17bb: 0x0040,
 	0x17bc: 0x0040, 0x17bd: 0x0040, 0x17be: 0x0040, 0x17bf: 0x0040,
 	// Block 0x5f, offset 0x17c0
-	0x17c0: 0x3308, 0x17c1: 0x3308, 0x17c2: 0x3008, 0x17c3: 0x3008, 0x17c4: 0x0040, 0x17c5: 0x0008,
-	0x17c6: 0x0008, 0x17c7: 0x0008, 0x17c8: 0x0008, 0x17c9: 0x0008, 0x17ca: 0x0008, 0x17cb: 0x0008,
-	0x17cc: 0x0008, 0x17cd: 0x0040, 0x17ce: 0x0040, 0x17cf: 0x0008, 0x17d0: 0x0008, 0x17d1: 0x0040,
-	0x17d2: 0x0040, 0x17d3: 0x0008, 0x17d4: 0x0008, 0x17d5: 0x0008, 0x17d6: 0x0008, 0x17d7: 0x0008,
+	0x17c0: 0x0008, 0x17c1: 0x0008, 0x17c2: 0x0008, 0x17c3: 0x0008, 0x17c4: 0x0008, 0x17c5: 0x0008,
+	0x17c6: 0x0008, 0x17c7: 0x0040, 0x17c8: 0x0040, 0x17c9: 0x0008, 0x17ca: 0x0040, 0x17cb: 0x0040,
+	0x17cc: 0x0008, 0x17cd: 0x0008, 0x17ce: 0x0008, 0x17cf: 0x0008, 0x17d0: 0x0008, 0x17d1: 0x0008,
+	0x17d2: 0x0008, 0x17d3: 0x0008, 0x17d4: 0x0040, 0x17d5: 0x0008, 0x17d6: 0x0008, 0x17d7: 0x0040,
 	0x17d8: 0x0008, 0x17d9: 0x0008, 0x17da: 0x0008, 0x17db: 0x0008, 0x17dc: 0x0008, 0x17dd: 0x0008,
 	0x17de: 0x0008, 0x17df: 0x0008, 0x17e0: 0x0008, 0x17e1: 0x0008, 0x17e2: 0x0008, 0x17e3: 0x0008,
-	0x17e4: 0x0008, 0x17e5: 0x0008, 0x17e6: 0x0008, 0x17e7: 0x0008, 0x17e8: 0x0008, 0x17e9: 0x0040,
+	0x17e4: 0x0008, 0x17e5: 0x0008, 0x17e6: 0x0008, 0x17e7: 0x0008, 0x17e8: 0x0008, 0x17e9: 0x0008,
 	0x17ea: 0x0008, 0x17eb: 0x0008, 0x17ec: 0x0008, 0x17ed: 0x0008, 0x17ee: 0x0008, 0x17ef: 0x0008,
-	0x17f0: 0x0008, 0x17f1: 0x0040, 0x17f2: 0x0008, 0x17f3: 0x0008, 0x17f4: 0x0040, 0x17f5: 0x0008,
-	0x17f6: 0x0008, 0x17f7: 0x0008, 0x17f8: 0x0008, 0x17f9: 0x0008, 0x17fa: 0x0040, 0x17fb: 0x3308,
-	0x17fc: 0x3308, 0x17fd: 0x0008, 0x17fe: 0x3008, 0x17ff: 0x3008,
+	0x17f0: 0x3008, 0x17f1: 0x3008, 0x17f2: 0x3008, 0x17f3: 0x3008, 0x17f4: 0x3008, 0x17f5: 0x3008,
+	0x17f6: 0x0040, 0x17f7: 0x3008, 0x17f8: 0x3008, 0x17f9: 0x0040, 0x17fa: 0x0040, 0x17fb: 0x3308,
+	0x17fc: 0x3308, 0x17fd: 0x3808, 0x17fe: 0x3b08, 0x17ff: 0x0008,
 	// Block 0x60, offset 0x1800
-	0x1800: 0x3308, 0x1801: 0x3008, 0x1802: 0x3008, 0x1803: 0x3008, 0x1804: 0x3008, 0x1805: 0x0040,
-	0x1806: 0x0040, 0x1807: 0x3008, 0x1808: 0x3008, 0x1809: 0x0040, 0x180a: 0x0040, 0x180b: 0x3008,
-	0x180c: 0x3008, 0x180d: 0x3808, 0x180e: 0x0040, 0x180f: 0x0040, 0x1810: 0x0008, 0x1811: 0x0040,
-	0x1812: 0x0040, 0x1813: 0x0040, 0x1814: 0x0040, 0x1815: 0x0040, 0x1816: 0x0040, 0x1817: 0x3008,
-	0x1818: 0x0040, 0x1819: 0x0040, 0x181a: 0x0040, 0x181b: 0x0040, 0x181c: 0x0040, 0x181d: 0x0008,
-	0x181e: 0x0008, 0x181f: 0x0008, 0x1820: 0x0008, 0x1821: 0x0008, 0x1822: 0x3008, 0x1823: 0x3008,
-	0x1824: 0x0040, 0x1825: 0x0040, 0x1826: 0x3308, 0x1827: 0x3308, 0x1828: 0x3308, 0x1829: 0x3308,
-	0x182a: 0x3308, 0x182b: 0x3308, 0x182c: 0x3308, 0x182d: 0x0040, 0x182e: 0x0040, 0x182f: 0x0040,
-	0x1830: 0x3308, 0x1831: 0x3308, 0x1832: 0x3308, 0x1833: 0x3308, 0x1834: 0x3308, 0x1835: 0x0040,
-	0x1836: 0x0040, 0x1837: 0x0040, 0x1838: 0x0040, 0x1839: 0x0040, 0x183a: 0x0040, 0x183b: 0x0040,
-	0x183c: 0x0040, 0x183d: 0x0040, 0x183e: 0x0040, 0x183f: 0x0040,
+	0x1800: 0x0019, 0x1801: 0x02e9, 0x1802: 0x03d9, 0x1803: 0x02f1, 0x1804: 0x02f9, 0x1805: 0x03f1,
+	0x1806: 0x0309, 0x1807: 0x00a9, 0x1808: 0x0311, 0x1809: 0x00b1, 0x180a: 0x0319, 0x180b: 0x0101,
+	0x180c: 0x0321, 0x180d: 0x0329, 0x180e: 0x0051, 0x180f: 0x0339, 0x1810: 0x0751, 0x1811: 0x00b9,
+	0x1812: 0x0089, 0x1813: 0x0341, 0x1814: 0x0349, 0x1815: 0x0391, 0x1816: 0x00c1, 0x1817: 0x0109,
+	0x1818: 0x00c9, 0x1819: 0x04b1, 0x181a: 0x0019, 0x181b: 0x02e9, 0x181c: 0x03d9, 0x181d: 0x02f1,
+	0x181e: 0x02f9, 0x181f: 0x03f1, 0x1820: 0x0309, 0x1821: 0x00a9, 0x1822: 0x0311, 0x1823: 0x00b1,
+	0x1824: 0x0319, 0x1825: 0x0101, 0x1826: 0x0321, 0x1827: 0x0329, 0x1828: 0x0051, 0x1829: 0x0339,
+	0x182a: 0x0751, 0x182b: 0x00b9, 0x182c: 0x0089, 0x182d: 0x0341, 0x182e: 0x0349, 0x182f: 0x0391,
+	0x1830: 0x00c1, 0x1831: 0x0109, 0x1832: 0x00c9, 0x1833: 0x04b1, 0x1834: 0x0019, 0x1835: 0x02e9,
+	0x1836: 0x03d9, 0x1837: 0x02f1, 0x1838: 0x02f9, 0x1839: 0x03f1, 0x183a: 0x0309, 0x183b: 0x00a9,
+	0x183c: 0x0311, 0x183d: 0x00b1, 0x183e: 0x0319, 0x183f: 0x0101,
 	// Block 0x61, offset 0x1840
-	0x1840: 0x0008, 0x1841: 0x0008, 0x1842: 0x0008, 0x1843: 0x0008, 0x1844: 0x0008, 0x1845: 0x0008,
-	0x1846: 0x0008, 0x1847: 0x0040, 0x1848: 0x0040, 0x1849: 0x0008, 0x184a: 0x0040, 0x184b: 0x0040,
-	0x184c: 0x0008, 0x184d: 0x0008, 0x184e: 0x0008, 0x184f: 0x0008, 0x1850: 0x0008, 0x1851: 0x0008,
-	0x1852: 0x0008, 0x1853: 0x0008, 0x1854: 0x0040, 0x1855: 0x0008, 0x1856: 0x0008, 0x1857: 0x0040,
-	0x1858: 0x0008, 0x1859: 0x0008, 0x185a: 0x0008, 0x185b: 0x0008, 0x185c: 0x0008, 0x185d: 0x0008,
-	0x185e: 0x0008, 0x185f: 0x0008, 0x1860: 0x0008, 0x1861: 0x0008, 0x1862: 0x0008, 0x1863: 0x0008,
-	0x1864: 0x0008, 0x1865: 0x0008, 0x1866: 0x0008, 0x1867: 0x0008, 0x1868: 0x0008, 0x1869: 0x0008,
-	0x186a: 0x0008, 0x186b: 0x0008, 0x186c: 0x0008, 0x186d: 0x0008, 0x186e: 0x0008, 0x186f: 0x0008,
-	0x1870: 0x3008, 0x1871: 0x3008, 0x1872: 0x3008, 0x1873: 0x3008, 0x1874: 0x3008, 0x1875: 0x3008,
-	0x1876: 0x0040, 0x1877: 0x3008, 0x1878: 0x3008, 0x1879: 0x0040, 0x187a: 0x0040, 0x187b: 0x3308,
-	0x187c: 0x3308, 0x187d: 0x3808, 0x187e: 0x3b08, 0x187f: 0x0008,
+	0x1840: 0x0321, 0x1841: 0x0329, 0x1842: 0x0051, 0x1843: 0x0339, 0x1844: 0x0751, 0x1845: 0x00b9,
+	0x1846: 0x0089, 0x1847: 0x0341, 0x1848: 0x0349, 0x1849: 0x0391, 0x184a: 0x00c1, 0x184b: 0x0109,
+	0x184c: 0x00c9, 0x184d: 0x04b1, 0x184e: 0x0019, 0x184f: 0x02e9, 0x1850: 0x03d9, 0x1851: 0x02f1,
+	0x1852: 0x02f9, 0x1853: 0x03f1, 0x1854: 0x0309, 0x1855: 0x0040, 0x1856: 0x0311, 0x1857: 0x00b1,
+	0x1858: 0x0319, 0x1859: 0x0101, 0x185a: 0x0321, 0x185b: 0x0329, 0x185c: 0x0051, 0x185d: 0x0339,
+	0x185e: 0x0751, 0x185f: 0x00b9, 0x1860: 0x0089, 0x1861: 0x0341, 0x1862: 0x0349, 0x1863: 0x0391,
+	0x1864: 0x00c1, 0x1865: 0x0109, 0x1866: 0x00c9, 0x1867: 0x04b1, 0x1868: 0x0019, 0x1869: 0x02e9,
+	0x186a: 0x03d9, 0x186b: 0x02f1, 0x186c: 0x02f9, 0x186d: 0x03f1, 0x186e: 0x0309, 0x186f: 0x00a9,
+	0x1870: 0x0311, 0x1871: 0x00b1, 0x1872: 0x0319, 0x1873: 0x0101, 0x1874: 0x0321, 0x1875: 0x0329,
+	0x1876: 0x0051, 0x1877: 0x0339, 0x1878: 0x0751, 0x1879: 0x00b9, 0x187a: 0x0089, 0x187b: 0x0341,
+	0x187c: 0x0349, 0x187d: 0x0391, 0x187e: 0x00c1, 0x187f: 0x0109,
 	// Block 0x62, offset 0x1880
-	0x1880: 0x0039, 0x1881: 0x0ee9, 0x1882: 0x1159, 0x1883: 0x0ef9, 0x1884: 0x0f09, 0x1885: 0x1199,
-	0x1886: 0x0f31, 0x1887: 0x0249, 0x1888: 0x0f41, 0x1889: 0x0259, 0x188a: 0x0f51, 0x188b: 0x0359,
-	0x188c: 0x0f61, 0x188d: 0x0f71, 0x188e: 0x00d9, 0x188f: 0x0f99, 0x1890: 0x2039, 0x1891: 0x0269,
-	0x1892: 0x01d9, 0x1893: 0x0fa9, 0x1894: 0x0fb9, 0x1895: 0x1089, 0x1896: 0x0279, 0x1897: 0x0369,
-	0x1898: 0x0289, 0x1899: 0x13d1, 0x189a: 0x0039, 0x189b: 0x0ee9, 0x189c: 0x1159, 0x189d: 0x0ef9,
-	0x189e: 0x0f09, 0x189f: 0x1199, 0x18a0: 0x0f31, 0x18a1: 0x0249, 0x18a2: 0x0f41, 0x18a3: 0x0259,
-	0x18a4: 0x0f51, 0x18a5: 0x0359, 0x18a6: 0x0f61, 0x18a7: 0x0f71, 0x18a8: 0x00d9, 0x18a9: 0x0f99,
-	0x18aa: 0x2039, 0x18ab: 0x0269, 0x18ac: 0x01d9, 0x18ad: 0x0fa9, 0x18ae: 0x0fb9, 0x18af: 0x1089,
-	0x18b0: 0x0279, 0x18b1: 0x0369, 0x18b2: 0x0289, 0x18b3: 0x13d1, 0x18b4: 0x0039, 0x18b5: 0x0ee9,
-	0x18b6: 0x1159, 0x18b7: 0x0ef9, 0x18b8: 0x0f09, 0x18b9: 0x1199, 0x18ba: 0x0f31, 0x18bb: 0x0249,
-	0x18bc: 0x0f41, 0x18bd: 0x0259, 0x18be: 0x0f51, 0x18bf: 0x0359,
+	0x1880: 0x00c9, 0x1881: 0x04b1, 0x1882: 0x0019, 0x1883: 0x02e9, 0x1884: 0x03d9, 0x1885: 0x02f1,
+	0x1886: 0x02f9, 0x1887: 0x03f1, 0x1888: 0x0309, 0x1889: 0x00a9, 0x188a: 0x0311, 0x188b: 0x00b1,
+	0x188c: 0x0319, 0x188d: 0x0101, 0x188e: 0x0321, 0x188f: 0x0329, 0x1890: 0x0051, 0x1891: 0x0339,
+	0x1892: 0x0751, 0x1893: 0x00b9, 0x1894: 0x0089, 0x1895: 0x0341, 0x1896: 0x0349, 0x1897: 0x0391,
+	0x1898: 0x00c1, 0x1899: 0x0109, 0x189a: 0x00c9, 0x189b: 0x04b1, 0x189c: 0x0019, 0x189d: 0x0040,
+	0x189e: 0x03d9, 0x189f: 0x02f1, 0x18a0: 0x0040, 0x18a1: 0x0040, 0x18a2: 0x0309, 0x18a3: 0x0040,
+	0x18a4: 0x0040, 0x18a5: 0x00b1, 0x18a6: 0x0319, 0x18a7: 0x0040, 0x18a8: 0x0040, 0x18a9: 0x0329,
+	0x18aa: 0x0051, 0x18ab: 0x0339, 0x18ac: 0x0751, 0x18ad: 0x0040, 0x18ae: 0x0089, 0x18af: 0x0341,
+	0x18b0: 0x0349, 0x18b1: 0x0391, 0x18b2: 0x00c1, 0x18b3: 0x0109, 0x18b4: 0x00c9, 0x18b5: 0x04b1,
+	0x18b6: 0x0019, 0x18b7: 0x02e9, 0x18b8: 0x03d9, 0x18b9: 0x02f1, 0x18ba: 0x0040, 0x18bb: 0x03f1,
+	0x18bc: 0x0040, 0x18bd: 0x00a9, 0x18be: 0x0311, 0x18bf: 0x00b1,
 	// Block 0x63, offset 0x18c0
-	0x18c0: 0x0f61, 0x18c1: 0x0f71, 0x18c2: 0x00d9, 0x18c3: 0x0f99, 0x18c4: 0x2039, 0x18c5: 0x0269,
-	0x18c6: 0x01d9, 0x18c7: 0x0fa9, 0x18c8: 0x0fb9, 0x18c9: 0x1089, 0x18ca: 0x0279, 0x18cb: 0x0369,
-	0x18cc: 0x0289, 0x18cd: 0x13d1, 0x18ce: 0x0039, 0x18cf: 0x0ee9, 0x18d0: 0x1159, 0x18d1: 0x0ef9,
-	0x18d2: 0x0f09, 0x18d3: 0x1199, 0x18d4: 0x0f31, 0x18d5: 0x0040, 0x18d6: 0x0f41, 0x18d7: 0x0259,
-	0x18d8: 0x0f51, 0x18d9: 0x0359, 0x18da: 0x0f61, 0x18db: 0x0f71, 0x18dc: 0x00d9, 0x18dd: 0x0f99,
-	0x18de: 0x2039, 0x18df: 0x0269, 0x18e0: 0x01d9, 0x18e1: 0x0fa9, 0x18e2: 0x0fb9, 0x18e3: 0x1089,
-	0x18e4: 0x0279, 0x18e5: 0x0369, 0x18e6: 0x0289, 0x18e7: 0x13d1, 0x18e8: 0x0039, 0x18e9: 0x0ee9,
-	0x18ea: 0x1159, 0x18eb: 0x0ef9, 0x18ec: 0x0f09, 0x18ed: 0x1199, 0x18ee: 0x0f31, 0x18ef: 0x0249,
-	0x18f0: 0x0f41, 0x18f1: 0x0259, 0x18f2: 0x0f51, 0x18f3: 0x0359, 0x18f4: 0x0f61, 0x18f5: 0x0f71,
-	0x18f6: 0x00d9, 0x18f7: 0x0f99, 0x18f8: 0x2039, 0x18f9: 0x0269, 0x18fa: 0x01d9, 0x18fb: 0x0fa9,
-	0x18fc: 0x0fb9, 0x18fd: 0x1089, 0x18fe: 0x0279, 0x18ff: 0x0369,
+	0x18c0: 0x0319, 0x18c1: 0x0101, 0x18c2: 0x0321, 0x18c3: 0x0329, 0x18c4: 0x0040, 0x18c5: 0x0339,
+	0x18c6: 0x0751, 0x18c7: 0x00b9, 0x18c8: 0x0089, 0x18c9: 0x0341, 0x18ca: 0x0349, 0x18cb: 0x0391,
+	0x18cc: 0x00c1, 0x18cd: 0x0109, 0x18ce: 0x00c9, 0x18cf: 0x04b1, 0x18d0: 0x0019, 0x18d1: 0x02e9,
+	0x18d2: 0x03d9, 0x18d3: 0x02f1, 0x18d4: 0x02f9, 0x18d5: 0x03f1, 0x18d6: 0x0309, 0x18d7: 0x00a9,
+	0x18d8: 0x0311, 0x18d9: 0x00b1, 0x18da: 0x0319, 0x18db: 0x0101, 0x18dc: 0x0321, 0x18dd: 0x0329,
+	0x18de: 0x0051, 0x18df: 0x0339, 0x18e0: 0x0751, 0x18e1: 0x00b9, 0x18e2: 0x0089, 0x18e3: 0x0341,
+	0x18e4: 0x0349, 0x18e5: 0x0391, 0x18e6: 0x00c1, 0x18e7: 0x0109, 0x18e8: 0x00c9, 0x18e9: 0x04b1,
+	0x18ea: 0x0019, 0x18eb: 0x02e9, 0x18ec: 0x03d9, 0x18ed: 0x02f1, 0x18ee: 0x02f9, 0x18ef: 0x03f1,
+	0x18f0: 0x0309, 0x18f1: 0x00a9, 0x18f2: 0x0311, 0x18f3: 0x00b1, 0x18f4: 0x0319, 0x18f5: 0x0101,
+	0x18f6: 0x0321, 0x18f7: 0x0329, 0x18f8: 0x0051, 0x18f9: 0x0339, 0x18fa: 0x0751, 0x18fb: 0x00b9,
+	0x18fc: 0x0089, 0x18fd: 0x0341, 0x18fe: 0x0349, 0x18ff: 0x0391,
 	// Block 0x64, offset 0x1900
-	0x1900: 0x0289, 0x1901: 0x13d1, 0x1902: 0x0039, 0x1903: 0x0ee9, 0x1904: 0x1159, 0x1905: 0x0ef9,
-	0x1906: 0x0f09, 0x1907: 0x1199, 0x1908: 0x0f31, 0x1909: 0x0249, 0x190a: 0x0f41, 0x190b: 0x0259,
-	0x190c: 0x0f51, 0x190d: 0x0359, 0x190e: 0x0f61, 0x190f: 0x0f71, 0x1910: 0x00d9, 0x1911: 0x0f99,
-	0x1912: 0x2039, 0x1913: 0x0269, 0x1914: 0x01d9, 0x1915: 0x0fa9, 0x1916: 0x0fb9, 0x1917: 0x1089,
-	0x1918: 0x0279, 0x1919: 0x0369, 0x191a: 0x0289, 0x191b: 0x13d1, 0x191c: 0x0039, 0x191d: 0x0040,
-	0x191e: 0x1159, 0x191f: 0x0ef9, 0x1920: 0x0040, 0x1921: 0x0040, 0x1922: 0x0f31, 0x1923: 0x0040,
-	0x1924: 0x0040, 0x1925: 0x0259, 0x1926: 0x0f51, 0x1927: 0x0040, 0x1928: 0x0040, 0x1929: 0x0f71,
-	0x192a: 0x00d9, 0x192b: 0x0f99, 0x192c: 0x2039, 0x192d: 0x0040, 0x192e: 0x01d9, 0x192f: 0x0fa9,
-	0x1930: 0x0fb9, 0x1931: 0x1089, 0x1932: 0x0279, 0x1933: 0x0369, 0x1934: 0x0289, 0x1935: 0x13d1,
-	0x1936: 0x0039, 0x1937: 0x0ee9, 0x1938: 0x1159, 0x1939: 0x0ef9, 0x193a: 0x0040, 0x193b: 0x1199,
-	0x193c: 0x0040, 0x193d: 0x0249, 0x193e: 0x0f41, 0x193f: 0x0259,
+	0x1900: 0x00c1, 0x1901: 0x0109, 0x1902: 0x00c9, 0x1903: 0x04b1, 0x1904: 0x0019, 0x1905: 0x02e9,
+	0x1906: 0x0040, 0x1907: 0x02f1, 0x1908: 0x02f9, 0x1909: 0x03f1, 0x190a: 0x0309, 0x190b: 0x0040,
+	0x190c: 0x0040, 0x190d: 0x00b1, 0x190e: 0x0319, 0x190f: 0x0101, 0x1910: 0x0321, 0x1911: 0x0329,
+	0x1912: 0x0051, 0x1913: 0x0339, 0x1914: 0x0751, 0x1915: 0x0040, 0x1916: 0x0089, 0x1917: 0x0341,
+	0x1918: 0x0349, 0x1919: 0x0391, 0x191a: 0x00c1, 0x191b: 0x0109, 0x191c: 0x00c9, 0x191d: 0x0040,
+	0x191e: 0x0019, 0x191f: 0x02e9, 0x1920: 0x03d9, 0x1921: 0x02f1, 0x1922: 0x02f9, 0x1923: 0x03f1,
+	0x1924: 0x0309, 0x1925: 0x00a9, 0x1926: 0x0311, 0x1927: 0x00b1, 0x1928: 0x0319, 0x1929: 0x0101,
+	0x192a: 0x0321, 0x192b: 0x0329, 0x192c: 0x0051, 0x192d: 0x0339, 0x192e: 0x0751, 0x192f: 0x00b9,
+	0x1930: 0x0089, 0x1931: 0x0341, 0x1932: 0x0349, 0x1933: 0x0391, 0x1934: 0x00c1, 0x1935: 0x0109,
+	0x1936: 0x00c9, 0x1937: 0x04b1, 0x1938: 0x0019, 0x1939: 0x02e9, 0x193a: 0x0040, 0x193b: 0x02f1,
+	0x193c: 0x02f9, 0x193d: 0x03f1, 0x193e: 0x0309, 0x193f: 0x0040,
 	// Block 0x65, offset 0x1940
-	0x1940: 0x0f51, 0x1941: 0x0359, 0x1942: 0x0f61, 0x1943: 0x0f71, 0x1944: 0x0040, 0x1945: 0x0f99,
-	0x1946: 0x2039, 0x1947: 0x0269, 0x1948: 0x01d9, 0x1949: 0x0fa9, 0x194a: 0x0fb9, 0x194b: 0x1089,
-	0x194c: 0x0279, 0x194d: 0x0369, 0x194e: 0x0289, 0x194f: 0x13d1, 0x1950: 0x0039, 0x1951: 0x0ee9,
-	0x1952: 0x1159, 0x1953: 0x0ef9, 0x1954: 0x0f09, 0x1955: 0x1199, 0x1956: 0x0f31, 0x1957: 0x0249,
-	0x1958: 0x0f41, 0x1959: 0x0259, 0x195a: 0x0f51, 0x195b: 0x0359, 0x195c: 0x0f61, 0x195d: 0x0f71,
-	0x195e: 0x00d9, 0x195f: 0x0f99, 0x1960: 0x2039, 0x1961: 0x0269, 0x1962: 0x01d9, 0x1963: 0x0fa9,
-	0x1964: 0x0fb9, 0x1965: 0x1089, 0x1966: 0x0279, 0x1967: 0x0369, 0x1968: 0x0289, 0x1969: 0x13d1,
-	0x196a: 0x0039, 0x196b: 0x0ee9, 0x196c: 0x1159, 0x196d: 0x0ef9, 0x196e: 0x0f09, 0x196f: 0x1199,
-	0x1970: 0x0f31, 0x1971: 0x0249, 0x1972: 0x0f41, 0x1973: 0x0259, 0x1974: 0x0f51, 0x1975: 0x0359,
-	0x1976: 0x0f61, 0x1977: 0x0f71, 0x1978: 0x00d9, 0x1979: 0x0f99, 0x197a: 0x2039, 0x197b: 0x0269,
-	0x197c: 0x01d9, 0x197d: 0x0fa9, 0x197e: 0x0fb9, 0x197f: 0x1089,
+	0x1940: 0x0311, 0x1941: 0x00b1, 0x1942: 0x0319, 0x1943: 0x0101, 0x1944: 0x0321, 0x1945: 0x0040,
+	0x1946: 0x0051, 0x1947: 0x0040, 0x1948: 0x0040, 0x1949: 0x0040, 0x194a: 0x0089, 0x194b: 0x0341,
+	0x194c: 0x0349, 0x194d: 0x0391, 0x194e: 0x00c1, 0x194f: 0x0109, 0x1950: 0x00c9, 0x1951: 0x0040,
+	0x1952: 0x0019, 0x1953: 0x02e9, 0x1954: 0x03d9, 0x1955: 0x02f1, 0x1956: 0x02f9, 0x1957: 0x03f1,
+	0x1958: 0x0309, 0x1959: 0x00a9, 0x195a: 0x0311, 0x195b: 0x00b1, 0x195c: 0x0319, 0x195d: 0x0101,
+	0x195e: 0x0321, 0x195f: 0x0329, 0x1960: 0x0051, 0x1961: 0x0339, 0x1962: 0x0751, 0x1963: 0x00b9,
+	0x1964: 0x0089, 0x1965: 0x0341, 0x1966: 0x0349, 0x1967: 0x0391, 0x1968: 0x00c1, 0x1969: 0x0109,
+	0x196a: 0x00c9, 0x196b: 0x04b1, 0x196c: 0x0019, 0x196d: 0x02e9, 0x196e: 0x03d9, 0x196f: 0x02f1,
+	0x1970: 0x02f9, 0x1971: 0x03f1, 0x1972: 0x0309, 0x1973: 0x00a9, 0x1974: 0x0311, 0x1975: 0x00b1,
+	0x1976: 0x0319, 0x1977: 0x0101, 0x1978: 0x0321, 0x1979: 0x0329, 0x197a: 0x0051, 0x197b: 0x0339,
+	0x197c: 0x0751, 0x197d: 0x00b9, 0x197e: 0x0089, 0x197f: 0x0341,
 	// Block 0x66, offset 0x1980
-	0x1980: 0x0279, 0x1981: 0x0369, 0x1982: 0x0289, 0x1983: 0x13d1, 0x1984: 0x0039, 0x1985: 0x0ee9,
-	0x1986: 0x0040, 0x1987: 0x0ef9, 0x1988: 0x0f09, 0x1989: 0x1199, 0x198a: 0x0f31, 0x198b: 0x0040,
-	0x198c: 0x0040, 0x198d: 0x0259, 0x198e: 0x0f51, 0x198f: 0x0359, 0x1990: 0x0f61, 0x1991: 0x0f71,
-	0x1992: 0x00d9, 0x1993: 0x0f99, 0x1994: 0x2039, 0x1995: 0x0040, 0x1996: 0x01d9, 0x1997: 0x0fa9,
-	0x1998: 0x0fb9, 0x1999: 0x1089, 0x199a: 0x0279, 0x199b: 0x0369, 0x199c: 0x0289, 0x199d: 0x0040,
-	0x199e: 0x0039, 0x199f: 0x0ee9, 0x19a0: 0x1159, 0x19a1: 0x0ef9, 0x19a2: 0x0f09, 0x19a3: 0x1199,
-	0x19a4: 0x0f31, 0x19a5: 0x0249, 0x19a6: 0x0f41, 0x19a7: 0x0259, 0x19a8: 0x0f51, 0x19a9: 0x0359,
-	0x19aa: 0x0f61, 0x19ab: 0x0f71, 0x19ac: 0x00d9, 0x19ad: 0x0f99, 0x19ae: 0x2039, 0x19af: 0x0269,
-	0x19b0: 0x01d9, 0x19b1: 0x0fa9, 0x19b2: 0x0fb9, 0x19b3: 0x1089, 0x19b4: 0x0279, 0x19b5: 0x0369,
-	0x19b6: 0x0289, 0x19b7: 0x13d1, 0x19b8: 0x0039, 0x19b9: 0x0ee9, 0x19ba: 0x0040, 0x19bb: 0x0ef9,
-	0x19bc: 0x0f09, 0x19bd: 0x1199, 0x19be: 0x0f31, 0x19bf: 0x0040,
+	0x1980: 0x0349, 0x1981: 0x0391, 0x1982: 0x00c1, 0x1983: 0x0109, 0x1984: 0x00c9, 0x1985: 0x04b1,
+	0x1986: 0x0019, 0x1987: 0x02e9, 0x1988: 0x03d9, 0x1989: 0x02f1, 0x198a: 0x02f9, 0x198b: 0x03f1,
+	0x198c: 0x0309, 0x198d: 0x00a9, 0x198e: 0x0311, 0x198f: 0x00b1, 0x1990: 0x0319, 0x1991: 0x0101,
+	0x1992: 0x0321, 0x1993: 0x0329, 0x1994: 0x0051, 0x1995: 0x0339, 0x1996: 0x0751, 0x1997: 0x00b9,
+	0x1998: 0x0089, 0x1999: 0x0341, 0x199a: 0x0349, 0x199b: 0x0391, 0x199c: 0x00c1, 0x199d: 0x0109,
+	0x199e: 0x00c9, 0x199f: 0x04b1, 0x19a0: 0x0019, 0x19a1: 0x02e9, 0x19a2: 0x03d9, 0x19a3: 0x02f1,
+	0x19a4: 0x02f9, 0x19a5: 0x03f1, 0x19a6: 0x0309, 0x19a7: 0x00a9, 0x19a8: 0x0311, 0x19a9: 0x00b1,
+	0x19aa: 0x0319, 0x19ab: 0x0101, 0x19ac: 0x0321, 0x19ad: 0x0329, 0x19ae: 0x0051, 0x19af: 0x0339,
+	0x19b0: 0x0751, 0x19b1: 0x00b9, 0x19b2: 0x0089, 0x19b3: 0x0341, 0x19b4: 0x0349, 0x19b5: 0x0391,
+	0x19b6: 0x00c1, 0x19b7: 0x0109, 0x19b8: 0x00c9, 0x19b9: 0x04b1, 0x19ba: 0x0019, 0x19bb: 0x02e9,
+	0x19bc: 0x03d9, 0x19bd: 0x02f1, 0x19be: 0x02f9, 0x19bf: 0x03f1,
 	// Block 0x67, offset 0x19c0
-	0x19c0: 0x0f41, 0x19c1: 0x0259, 0x19c2: 0x0f51, 0x19c3: 0x0359, 0x19c4: 0x0f61, 0x19c5: 0x0040,
-	0x19c6: 0x00d9, 0x19c7: 0x0040, 0x19c8: 0x0040, 0x19c9: 0x0040, 0x19ca: 0x01d9, 0x19cb: 0x0fa9,
-	0x19cc: 0x0fb9, 0x19cd: 0x1089, 0x19ce: 0x0279, 0x19cf: 0x0369, 0x19d0: 0x0289, 0x19d1: 0x0040,
-	0x19d2: 0x0039, 0x19d3: 0x0ee9, 0x19d4: 0x1159, 0x19d5: 0x0ef9, 0x19d6: 0x0f09, 0x19d7: 0x1199,
-	0x19d8: 0x0f31, 0x19d9: 0x0249, 0x19da: 0x0f41, 0x19db: 0x0259, 0x19dc: 0x0f51, 0x19dd: 0x0359,
-	0x19de: 0x0f61, 0x19df: 0x0f71, 0x19e0: 0x00d9, 0x19e1: 0x0f99, 0x19e2: 0x2039, 0x19e3: 0x0269,
-	0x19e4: 0x01d9, 0x19e5: 0x0fa9, 0x19e6: 0x0fb9, 0x19e7: 0x1089, 0x19e8: 0x0279, 0x19e9: 0x0369,
-	0x19ea: 0x0289, 0x19eb: 0x13d1, 0x19ec: 0x0039, 0x19ed: 0x0ee9, 0x19ee: 0x1159, 0x19ef: 0x0ef9,
-	0x19f0: 0x0f09, 0x19f1: 0x1199, 0x19f2: 0x0f31, 0x19f3: 0x0249, 0x19f4: 0x0f41, 0x19f5: 0x0259,
-	0x19f6: 0x0f51, 0x19f7: 0x0359, 0x19f8: 0x0f61, 0x19f9: 0x0f71, 0x19fa: 0x00d9, 0x19fb: 0x0f99,
-	0x19fc: 0x2039, 0x19fd: 0x0269, 0x19fe: 0x01d9, 0x19ff: 0x0fa9,
+	0x19c0: 0x0309, 0x19c1: 0x00a9, 0x19c2: 0x0311, 0x19c3: 0x00b1, 0x19c4: 0x0319, 0x19c5: 0x0101,
+	0x19c6: 0x0321, 0x19c7: 0x0329, 0x19c8: 0x0051, 0x19c9: 0x0339, 0x19ca: 0x0751, 0x19cb: 0x00b9,
+	0x19cc: 0x0089, 0x19cd: 0x0341, 0x19ce: 0x0349, 0x19cf: 0x0391, 0x19d0: 0x00c1, 0x19d1: 0x0109,
+	0x19d2: 0x00c9, 0x19d3: 0x04b1, 0x19d4: 0x0019, 0x19d5: 0x02e9, 0x19d6: 0x03d9, 0x19d7: 0x02f1,
+	0x19d8: 0x02f9, 0x19d9: 0x03f1, 0x19da: 0x0309, 0x19db: 0x00a9, 0x19dc: 0x0311, 0x19dd: 0x00b1,
+	0x19de: 0x0319, 0x19df: 0x0101, 0x19e0: 0x0321, 0x19e1: 0x0329, 0x19e2: 0x0051, 0x19e3: 0x0339,
+	0x19e4: 0x0751, 0x19e5: 0x00b9, 0x19e6: 0x0089, 0x19e7: 0x0341, 0x19e8: 0x0349, 0x19e9: 0x0391,
+	0x19ea: 0x00c1, 0x19eb: 0x0109, 0x19ec: 0x00c9, 0x19ed: 0x04b1, 0x19ee: 0x0019, 0x19ef: 0x02e9,
+	0x19f0: 0x03d9, 0x19f1: 0x02f1, 0x19f2: 0x02f9, 0x19f3: 0x03f1, 0x19f4: 0x0309, 0x19f5: 0x00a9,
+	0x19f6: 0x0311, 0x19f7: 0x00b1, 0x19f8: 0x0319, 0x19f9: 0x0101, 0x19fa: 0x0321, 0x19fb: 0x0329,
+	0x19fc: 0x0051, 0x19fd: 0x0339, 0x19fe: 0x0751, 0x19ff: 0x00b9,
 	// Block 0x68, offset 0x1a00
-	0x1a00: 0x0fb9, 0x1a01: 0x1089, 0x1a02: 0x0279, 0x1a03: 0x0369, 0x1a04: 0x0289, 0x1a05: 0x13d1,
-	0x1a06: 0x0039, 0x1a07: 0x0ee9, 0x1a08: 0x1159, 0x1a09: 0x0ef9, 0x1a0a: 0x0f09, 0x1a0b: 0x1199,
-	0x1a0c: 0x0f31, 0x1a0d: 0x0249, 0x1a0e: 0x0f41, 0x1a0f: 0x0259, 0x1a10: 0x0f51, 0x1a11: 0x0359,
-	0x1a12: 0x0f61, 0x1a13: 0x0f71, 0x1a14: 0x00d9, 0x1a15: 0x0f99, 0x1a16: 0x2039, 0x1a17: 0x0269,
-	0x1a18: 0x01d9, 0x1a19: 0x0fa9, 0x1a1a: 0x0fb9, 0x1a1b: 0x1089, 0x1a1c: 0x0279, 0x1a1d: 0x0369,
-	0x1a1e: 0x0289, 0x1a1f: 0x13d1, 0x1a20: 0x0039, 0x1a21: 0x0ee9, 0x1a22: 0x1159, 0x1a23: 0x0ef9,
-	0x1a24: 0x0f09, 0x1a25: 0x1199, 0x1a26: 0x0f31, 0x1a27: 0x0249, 0x1a28: 0x0f41, 0x1a29: 0x0259,
-	0x1a2a: 0x0f51, 0x1a2b: 0x0359, 0x1a2c: 0x0f61, 0x1a2d: 0x0f71, 0x1a2e: 0x00d9, 0x1a2f: 0x0f99,
-	0x1a30: 0x2039, 0x1a31: 0x0269, 0x1a32: 0x01d9, 0x1a33: 0x0fa9, 0x1a34: 0x0fb9, 0x1a35: 0x1089,
-	0x1a36: 0x0279, 0x1a37: 0x0369, 0x1a38: 0x0289, 0x1a39: 0x13d1, 0x1a3a: 0x0039, 0x1a3b: 0x0ee9,
-	0x1a3c: 0x1159, 0x1a3d: 0x0ef9, 0x1a3e: 0x0f09, 0x1a3f: 0x1199,
+	0x1a00: 0x0089, 0x1a01: 0x0341, 0x1a02: 0x0349, 0x1a03: 0x0391, 0x1a04: 0x00c1, 0x1a05: 0x0109,
+	0x1a06: 0x00c9, 0x1a07: 0x04b1, 0x1a08: 0x0019, 0x1a09: 0x02e9, 0x1a0a: 0x03d9, 0x1a0b: 0x02f1,
+	0x1a0c: 0x02f9, 0x1a0d: 0x03f1, 0x1a0e: 0x0309, 0x1a0f: 0x00a9, 0x1a10: 0x0311, 0x1a11: 0x00b1,
+	0x1a12: 0x0319, 0x1a13: 0x0101, 0x1a14: 0x0321, 0x1a15: 0x0329, 0x1a16: 0x0051, 0x1a17: 0x0339,
+	0x1a18: 0x0751, 0x1a19: 0x00b9, 0x1a1a: 0x0089, 0x1a1b: 0x0341, 0x1a1c: 0x0349, 0x1a1d: 0x0391,
+	0x1a1e: 0x00c1, 0x1a1f: 0x0109, 0x1a20: 0x00c9, 0x1a21: 0x04b1, 0x1a22: 0x0019, 0x1a23: 0x02e9,
+	0x1a24: 0x03d9, 0x1a25: 0x02f1, 0x1a26: 0x02f9, 0x1a27: 0x03f1, 0x1a28: 0x0309, 0x1a29: 0x00a9,
+	0x1a2a: 0x0311, 0x1a2b: 0x00b1, 0x1a2c: 0x0319, 0x1a2d: 0x0101, 0x1a2e: 0x0321, 0x1a2f: 0x0329,
+	0x1a30: 0x0051, 0x1a31: 0x0339, 0x1a32: 0x0751, 0x1a33: 0x00b9, 0x1a34: 0x0089, 0x1a35: 0x0341,
+	0x1a36: 0x0349, 0x1a37: 0x0391, 0x1a38: 0x00c1, 0x1a39: 0x0109, 0x1a3a: 0x00c9, 0x1a3b: 0x04b1,
+	0x1a3c: 0x0019, 0x1a3d: 0x02e9, 0x1a3e: 0x03d9, 0x1a3f: 0x02f1,
 	// Block 0x69, offset 0x1a40
-	0x1a40: 0x0f31, 0x1a41: 0x0249, 0x1a42: 0x0f41, 0x1a43: 0x0259, 0x1a44: 0x0f51, 0x1a45: 0x0359,
-	0x1a46: 0x0f61, 0x1a47: 0x0f71, 0x1a48: 0x00d9, 0x1a49: 0x0f99, 0x1a4a: 0x2039, 0x1a4b: 0x0269,
-	0x1a4c: 0x01d9, 0x1a4d: 0x0fa9, 0x1a4e: 0x0fb9, 0x1a4f: 0x1089, 0x1a50: 0x0279, 0x1a51: 0x0369,
-	0x1a52: 0x0289, 0x1a53: 0x13d1, 0x1a54: 0x0039, 0x1a55: 0x0ee9, 0x1a56: 0x1159, 0x1a57: 0x0ef9,
-	0x1a58: 0x0f09, 0x1a59: 0x1199, 0x1a5a: 0x0f31, 0x1a5b: 0x0249, 0x1a5c: 0x0f41, 0x1a5d: 0x0259,
-	0x1a5e: 0x0f51, 0x1a5f: 0x0359, 0x1a60: 0x0f61, 0x1a61: 0x0f71, 0x1a62: 0x00d9, 0x1a63: 0x0f99,
-	0x1a64: 0x2039, 0x1a65: 0x0269, 0x1a66: 0x01d9, 0x1a67: 0x0fa9, 0x1a68: 0x0fb9, 0x1a69: 0x1089,
-	0x1a6a: 0x0279, 0x1a6b: 0x0369, 0x1a6c: 0x0289, 0x1a6d: 0x13d1, 0x1a6e: 0x0039, 0x1a6f: 0x0ee9,
-	0x1a70: 0x1159, 0x1a71: 0x0ef9, 0x1a72: 0x0f09, 0x1a73: 0x1199, 0x1a74: 0x0f31, 0x1a75: 0x0249,
-	0x1a76: 0x0f41, 0x1a77: 0x0259, 0x1a78: 0x0f51, 0x1a79: 0x0359, 0x1a7a: 0x0f61, 0x1a7b: 0x0f71,
-	0x1a7c: 0x00d9, 0x1a7d: 0x0f99, 0x1a7e: 0x2039, 0x1a7f: 0x0269,
+	0x1a40: 0x02f9, 0x1a41: 0x03f1, 0x1a42: 0x0309, 0x1a43: 0x00a9, 0x1a44: 0x0311, 0x1a45: 0x00b1,
+	0x1a46: 0x0319, 0x1a47: 0x0101, 0x1a48: 0x0321, 0x1a49: 0x0329, 0x1a4a: 0x0051, 0x1a4b: 0x0339,
+	0x1a4c: 0x0751, 0x1a4d: 0x00b9, 0x1a4e: 0x0089, 0x1a4f: 0x0341, 0x1a50: 0x0349, 0x1a51: 0x0391,
+	0x1a52: 0x00c1, 0x1a53: 0x0109, 0x1a54: 0x00c9, 0x1a55: 0x04b1, 0x1a56: 0x0019, 0x1a57: 0x02e9,
+	0x1a58: 0x03d9, 0x1a59: 0x02f1, 0x1a5a: 0x02f9, 0x1a5b: 0x03f1, 0x1a5c: 0x0309, 0x1a5d: 0x00a9,
+	0x1a5e: 0x0311, 0x1a5f: 0x00b1, 0x1a60: 0x0319, 0x1a61: 0x0101, 0x1a62: 0x0321, 0x1a63: 0x0329,
+	0x1a64: 0x0051, 0x1a65: 0x0339, 0x1a66: 0x0751, 0x1a67: 0x00b9, 0x1a68: 0x0089, 0x1a69: 0x0341,
+	0x1a6a: 0x0349, 0x1a6b: 0x0391, 0x1a6c: 0x00c1, 0x1a6d: 0x0109, 0x1a6e: 0x00c9, 0x1a6f: 0x04b1,
+	0x1a70: 0x0019, 0x1a71: 0x02e9, 0x1a72: 0x03d9, 0x1a73: 0x02f1, 0x1a74: 0x02f9, 0x1a75: 0x03f1,
+	0x1a76: 0x0309, 0x1a77: 0x00a9, 0x1a78: 0x0311, 0x1a79: 0x00b1, 0x1a7a: 0x0319, 0x1a7b: 0x0101,
+	0x1a7c: 0x0321, 0x1a7d: 0x0329, 0x1a7e: 0x0051, 0x1a7f: 0x0339,
 	// Block 0x6a, offset 0x1a80
-	0x1a80: 0x01d9, 0x1a81: 0x0fa9, 0x1a82: 0x0fb9, 0x1a83: 0x1089, 0x1a84: 0x0279, 0x1a85: 0x0369,
-	0x1a86: 0x0289, 0x1a87: 0x13d1, 0x1a88: 0x0039, 0x1a89: 0x0ee9, 0x1a8a: 0x1159, 0x1a8b: 0x0ef9,
-	0x1a8c: 0x0f09, 0x1a8d: 0x1199, 0x1a8e: 0x0f31, 0x1a8f: 0x0249, 0x1a90: 0x0f41, 0x1a91: 0x0259,
-	0x1a92: 0x0f51, 0x1a93: 0x0359, 0x1a94: 0x0f61, 0x1a95: 0x0f71, 0x1a96: 0x00d9, 0x1a97: 0x0f99,
-	0x1a98: 0x2039, 0x1a99: 0x0269, 0x1a9a: 0x01d9, 0x1a9b: 0x0fa9, 0x1a9c: 0x0fb9, 0x1a9d: 0x1089,
-	0x1a9e: 0x0279, 0x1a9f: 0x0369, 0x1aa0: 0x0289, 0x1aa1: 0x13d1, 0x1aa2: 0x0039, 0x1aa3: 0x0ee9,
-	0x1aa4: 0x1159, 0x1aa5: 0x0ef9, 0x1aa6: 0x0f09, 0x1aa7: 0x1199, 0x1aa8: 0x0f31, 0x1aa9: 0x0249,
-	0x1aaa: 0x0f41, 0x1aab: 0x0259, 0x1aac: 0x0f51, 0x1aad: 0x0359, 0x1aae: 0x0f61, 0x1aaf: 0x0f71,
-	0x1ab0: 0x00d9, 0x1ab1: 0x0f99, 0x1ab2: 0x2039, 0x1ab3: 0x0269, 0x1ab4: 0x01d9, 0x1ab5: 0x0fa9,
-	0x1ab6: 0x0fb9, 0x1ab7: 0x1089, 0x1ab8: 0x0279, 0x1ab9: 0x0369, 0x1aba: 0x0289, 0x1abb: 0x13d1,
-	0x1abc: 0x0039, 0x1abd: 0x0ee9, 0x1abe: 0x1159, 0x1abf: 0x0ef9,
+	0x1a80: 0x0751, 0x1a81: 0x00b9, 0x1a82: 0x0089, 0x1a83: 0x0341, 0x1a84: 0x0349, 0x1a85: 0x0391,
+	0x1a86: 0x00c1, 0x1a87: 0x0109, 0x1a88: 0x00c9, 0x1a89: 0x04b1, 0x1a8a: 0x0019, 0x1a8b: 0x02e9,
+	0x1a8c: 0x03d9, 0x1a8d: 0x02f1, 0x1a8e: 0x02f9, 0x1a8f: 0x03f1, 0x1a90: 0x0309, 0x1a91: 0x00a9,
+	0x1a92: 0x0311, 0x1a93: 0x00b1, 0x1a94: 0x0319, 0x1a95: 0x0101, 0x1a96: 0x0321, 0x1a97: 0x0329,
+	0x1a98: 0x0051, 0x1a99: 0x0339, 0x1a9a: 0x0751, 0x1a9b: 0x00b9, 0x1a9c: 0x0089, 0x1a9d: 0x0341,
+	0x1a9e: 0x0349, 0x1a9f: 0x0391, 0x1aa0: 0x00c1, 0x1aa1: 0x0109, 0x1aa2: 0x00c9, 0x1aa3: 0x04b1,
+	0x1aa4: 0x2279, 0x1aa5: 0x2281, 0x1aa6: 0x0040, 0x1aa7: 0x0040, 0x1aa8: 0x2289, 0x1aa9: 0x0399,
+	0x1aaa: 0x03a1, 0x1aab: 0x03a9, 0x1aac: 0x2291, 0x1aad: 0x2299, 0x1aae: 0x22a1, 0x1aaf: 0x04d1,
+	0x1ab0: 0x05f9, 0x1ab1: 0x22a9, 0x1ab2: 0x22b1, 0x1ab3: 0x22b9, 0x1ab4: 0x22c1, 0x1ab5: 0x22c9,
+	0x1ab6: 0x22d1, 0x1ab7: 0x0799, 0x1ab8: 0x03c1, 0x1ab9: 0x04d1, 0x1aba: 0x22d9, 0x1abb: 0x22e1,
+	0x1abc: 0x22e9, 0x1abd: 0x03b1, 0x1abe: 0x03b9, 0x1abf: 0x22f1,
 	// Block 0x6b, offset 0x1ac0
-	0x1ac0: 0x0f09, 0x1ac1: 0x1199, 0x1ac2: 0x0f31, 0x1ac3: 0x0249, 0x1ac4: 0x0f41, 0x1ac5: 0x0259,
-	0x1ac6: 0x0f51, 0x1ac7: 0x0359, 0x1ac8: 0x0f61, 0x1ac9: 0x0f71, 0x1aca: 0x00d9, 0x1acb: 0x0f99,
-	0x1acc: 0x2039, 0x1acd: 0x0269, 0x1ace: 0x01d9, 0x1acf: 0x0fa9, 0x1ad0: 0x0fb9, 0x1ad1: 0x1089,
-	0x1ad2: 0x0279, 0x1ad3: 0x0369, 0x1ad4: 0x0289, 0x1ad5: 0x13d1, 0x1ad6: 0x0039, 0x1ad7: 0x0ee9,
-	0x1ad8: 0x1159, 0x1ad9: 0x0ef9, 0x1ada: 0x0f09, 0x1adb: 0x1199, 0x1adc: 0x0f31, 0x1add: 0x0249,
-	0x1ade: 0x0f41, 0x1adf: 0x0259, 0x1ae0: 0x0f51, 0x1ae1: 0x0359, 0x1ae2: 0x0f61, 0x1ae3: 0x0f71,
-	0x1ae4: 0x00d9, 0x1ae5: 0x0f99, 0x1ae6: 0x2039, 0x1ae7: 0x0269, 0x1ae8: 0x01d9, 0x1ae9: 0x0fa9,
-	0x1aea: 0x0fb9, 0x1aeb: 0x1089, 0x1aec: 0x0279, 0x1aed: 0x0369, 0x1aee: 0x0289, 0x1aef: 0x13d1,
-	0x1af0: 0x0039, 0x1af1: 0x0ee9, 0x1af2: 0x1159, 0x1af3: 0x0ef9, 0x1af4: 0x0f09, 0x1af5: 0x1199,
-	0x1af6: 0x0f31, 0x1af7: 0x0249, 0x1af8: 0x0f41, 0x1af9: 0x0259, 0x1afa: 0x0f51, 0x1afb: 0x0359,
-	0x1afc: 0x0f61, 0x1afd: 0x0f71, 0x1afe: 0x00d9, 0x1aff: 0x0f99,
+	0x1ac0: 0x0769, 0x1ac1: 0x22f9, 0x1ac2: 0x2289, 0x1ac3: 0x0399, 0x1ac4: 0x03a1, 0x1ac5: 0x03a9,
+	0x1ac6: 0x2291, 0x1ac7: 0x2299, 0x1ac8: 0x22a1, 0x1ac9: 0x04d1, 0x1aca: 0x05f9, 0x1acb: 0x22a9,
+	0x1acc: 0x22b1, 0x1acd: 0x22b9, 0x1ace: 0x22c1, 0x1acf: 0x22c9, 0x1ad0: 0x22d1, 0x1ad1: 0x0799,
+	0x1ad2: 0x03c1, 0x1ad3: 0x22d9, 0x1ad4: 0x22d9, 0x1ad5: 0x22e1, 0x1ad6: 0x22e9, 0x1ad7: 0x03b1,
+	0x1ad8: 0x03b9, 0x1ad9: 0x22f1, 0x1ada: 0x0769, 0x1adb: 0x2301, 0x1adc: 0x2291, 0x1add: 0x04d1,
+	0x1ade: 0x22a9, 0x1adf: 0x03b1, 0x1ae0: 0x03c1, 0x1ae1: 0x0799, 0x1ae2: 0x2289, 0x1ae3: 0x0399,
+	0x1ae4: 0x03a1, 0x1ae5: 0x03a9, 0x1ae6: 0x2291, 0x1ae7: 0x2299, 0x1ae8: 0x22a1, 0x1ae9: 0x04d1,
+	0x1aea: 0x05f9, 0x1aeb: 0x22a9, 0x1aec: 0x22b1, 0x1aed: 0x22b9, 0x1aee: 0x22c1, 0x1aef: 0x22c9,
+	0x1af0: 0x22d1, 0x1af1: 0x0799, 0x1af2: 0x03c1, 0x1af3: 0x04d1, 0x1af4: 0x22d9, 0x1af5: 0x22e1,
+	0x1af6: 0x22e9, 0x1af7: 0x03b1, 0x1af8: 0x03b9, 0x1af9: 0x22f1, 0x1afa: 0x0769, 0x1afb: 0x22f9,
+	0x1afc: 0x2289, 0x1afd: 0x0399, 0x1afe: 0x03a1, 0x1aff: 0x03a9,
 	// Block 0x6c, offset 0x1b00
-	0x1b00: 0x2039, 0x1b01: 0x0269, 0x1b02: 0x01d9, 0x1b03: 0x0fa9, 0x1b04: 0x0fb9, 0x1b05: 0x1089,
-	0x1b06: 0x0279, 0x1b07: 0x0369, 0x1b08: 0x0289, 0x1b09: 0x13d1, 0x1b0a: 0x0039, 0x1b0b: 0x0ee9,
-	0x1b0c: 0x1159, 0x1b0d: 0x0ef9, 0x1b0e: 0x0f09, 0x1b0f: 0x1199, 0x1b10: 0x0f31, 0x1b11: 0x0249,
-	0x1b12: 0x0f41, 0x1b13: 0x0259, 0x1b14: 0x0f51, 0x1b15: 0x0359, 0x1b16: 0x0f61, 0x1b17: 0x0f71,
-	0x1b18: 0x00d9, 0x1b19: 0x0f99, 0x1b1a: 0x2039, 0x1b1b: 0x0269, 0x1b1c: 0x01d9, 0x1b1d: 0x0fa9,
-	0x1b1e: 0x0fb9, 0x1b1f: 0x1089, 0x1b20: 0x0279, 0x1b21: 0x0369, 0x1b22: 0x0289, 0x1b23: 0x13d1,
-	0x1b24: 0xbad1, 0x1b25: 0xbae9, 0x1b26: 0x0040, 0x1b27: 0x0040, 0x1b28: 0xbb01, 0x1b29: 0x1099,
-	0x1b2a: 0x10b1, 0x1b2b: 0x10c9, 0x1b2c: 0xbb19, 0x1b2d: 0xbb31, 0x1b2e: 0xbb49, 0x1b2f: 0x1429,
-	0x1b30: 0x1a31, 0x1b31: 0xbb61, 0x1b32: 0xbb79, 0x1b33: 0xbb91, 0x1b34: 0xbba9, 0x1b35: 0xbbc1,
-	0x1b36: 0xbbd9, 0x1b37: 0x2109, 0x1b38: 0x1111, 0x1b39: 0x1429, 0x1b3a: 0xbbf1, 0x1b3b: 0xbc09,
-	0x1b3c: 0xbc21, 0x1b3d: 0x10e1, 0x1b3e: 0x10f9, 0x1b3f: 0xbc39,
+	0x1b00: 0x2291, 0x1b01: 0x2299, 0x1b02: 0x22a1, 0x1b03: 0x04d1, 0x1b04: 0x05f9, 0x1b05: 0x22a9,
+	0x1b06: 0x22b1, 0x1b07: 0x22b9, 0x1b08: 0x22c1, 0x1b09: 0x22c9, 0x1b0a: 0x22d1, 0x1b0b: 0x0799,
+	0x1b0c: 0x03c1, 0x1b0d: 0x22d9, 0x1b0e: 0x22d9, 0x1b0f: 0x22e1, 0x1b10: 0x22e9, 0x1b11: 0x03b1,
+	0x1b12: 0x03b9, 0x1b13: 0x22f1, 0x1b14: 0x0769, 0x1b15: 0x2301, 0x1b16: 0x2291, 0x1b17: 0x04d1,
+	0x1b18: 0x22a9, 0x1b19: 0x03b1, 0x1b1a: 0x03c1, 0x1b1b: 0x0799, 0x1b1c: 0x2289, 0x1b1d: 0x0399,
+	0x1b1e: 0x03a1, 0x1b1f: 0x03a9, 0x1b20: 0x2291, 0x1b21: 0x2299, 0x1b22: 0x22a1, 0x1b23: 0x04d1,
+	0x1b24: 0x05f9, 0x1b25: 0x22a9, 0x1b26: 0x22b1, 0x1b27: 0x22b9, 0x1b28: 0x22c1, 0x1b29: 0x22c9,
+	0x1b2a: 0x22d1, 0x1b2b: 0x0799, 0x1b2c: 0x03c1, 0x1b2d: 0x04d1, 0x1b2e: 0x22d9, 0x1b2f: 0x22e1,
+	0x1b30: 0x22e9, 0x1b31: 0x03b1, 0x1b32: 0x03b9, 0x1b33: 0x22f1, 0x1b34: 0x0769, 0x1b35: 0x22f9,
+	0x1b36: 0x2289, 0x1b37: 0x0399, 0x1b38: 0x03a1, 0x1b39: 0x03a9, 0x1b3a: 0x2291, 0x1b3b: 0x2299,
+	0x1b3c: 0x22a1, 0x1b3d: 0x04d1, 0x1b3e: 0x05f9, 0x1b3f: 0x22a9,
 	// Block 0x6d, offset 0x1b40
-	0x1b40: 0x2079, 0x1b41: 0xbc51, 0x1b42: 0xbb01, 0x1b43: 0x1099, 0x1b44: 0x10b1, 0x1b45: 0x10c9,
-	0x1b46: 0xbb19, 0x1b47: 0xbb31, 0x1b48: 0xbb49, 0x1b49: 0x1429, 0x1b4a: 0x1a31, 0x1b4b: 0xbb61,
-	0x1b4c: 0xbb79, 0x1b4d: 0xbb91, 0x1b4e: 0xbba9, 0x1b4f: 0xbbc1, 0x1b50: 0xbbd9, 0x1b51: 0x2109,
-	0x1b52: 0x1111, 0x1b53: 0xbbf1, 0x1b54: 0xbbf1, 0x1b55: 0xbc09, 0x1b56: 0xbc21, 0x1b57: 0x10e1,
-	0x1b58: 0x10f9, 0x1b59: 0xbc39, 0x1b5a: 0x2079, 0x1b5b: 0xbc71, 0x1b5c: 0xbb19, 0x1b5d: 0x1429,
-	0x1b5e: 0xbb61, 0x1b5f: 0x10e1, 0x1b60: 0x1111, 0x1b61: 0x2109, 0x1b62: 0xbb01, 0x1b63: 0x1099,
-	0x1b64: 0x10b1, 0x1b65: 0x10c9, 0x1b66: 0xbb19, 0x1b67: 0xbb31, 0x1b68: 0xbb49, 0x1b69: 0x1429,
-	0x1b6a: 0x1a31, 0x1b6b: 0xbb61, 0x1b6c: 0xbb79, 0x1b6d: 0xbb91, 0x1b6e: 0xbba9, 0x1b6f: 0xbbc1,
-	0x1b70: 0xbbd9, 0x1b71: 0x2109, 0x1b72: 0x1111, 0x1b73: 0x1429, 0x1b74: 0xbbf1, 0x1b75: 0xbc09,
-	0x1b76: 0xbc21, 0x1b77: 0x10e1, 0x1b78: 0x10f9, 0x1b79: 0xbc39, 0x1b7a: 0x2079, 0x1b7b: 0xbc51,
-	0x1b7c: 0xbb01, 0x1b7d: 0x1099, 0x1b7e: 0x10b1, 0x1b7f: 0x10c9,
+	0x1b40: 0x22b1, 0x1b41: 0x22b9, 0x1b42: 0x22c1, 0x1b43: 0x22c9, 0x1b44: 0x22d1, 0x1b45: 0x0799,
+	0x1b46: 0x03c1, 0x1b47: 0x22d9, 0x1b48: 0x22d9, 0x1b49: 0x22e1, 0x1b4a: 0x22e9, 0x1b4b: 0x03b1,
+	0x1b4c: 0x03b9, 0x1b4d: 0x22f1, 0x1b4e: 0x0769, 0x1b4f: 0x2301, 0x1b50: 0x2291, 0x1b51: 0x04d1,
+	0x1b52: 0x22a9, 0x1b53: 0x03b1, 0x1b54: 0x03c1, 0x1b55: 0x0799, 0x1b56: 0x2289, 0x1b57: 0x0399,
+	0x1b58: 0x03a1, 0x1b59: 0x03a9, 0x1b5a: 0x2291, 0x1b5b: 0x2299, 0x1b5c: 0x22a1, 0x1b5d: 0x04d1,
+	0x1b5e: 0x05f9, 0x1b5f: 0x22a9, 0x1b60: 0x22b1, 0x1b61: 0x22b9, 0x1b62: 0x22c1, 0x1b63: 0x22c9,
+	0x1b64: 0x22d1, 0x1b65: 0x0799, 0x1b66: 0x03c1, 0x1b67: 0x04d1, 0x1b68: 0x22d9, 0x1b69: 0x22e1,
+	0x1b6a: 0x22e9, 0x1b6b: 0x03b1, 0x1b6c: 0x03b9, 0x1b6d: 0x22f1, 0x1b6e: 0x0769, 0x1b6f: 0x22f9,
+	0x1b70: 0x2289, 0x1b71: 0x0399, 0x1b72: 0x03a1, 0x1b73: 0x03a9, 0x1b74: 0x2291, 0x1b75: 0x2299,
+	0x1b76: 0x22a1, 0x1b77: 0x04d1, 0x1b78: 0x05f9, 0x1b79: 0x22a9, 0x1b7a: 0x22b1, 0x1b7b: 0x22b9,
+	0x1b7c: 0x22c1, 0x1b7d: 0x22c9, 0x1b7e: 0x22d1, 0x1b7f: 0x0799,
 	// Block 0x6e, offset 0x1b80
-	0x1b80: 0xbb19, 0x1b81: 0xbb31, 0x1b82: 0xbb49, 0x1b83: 0x1429, 0x1b84: 0x1a31, 0x1b85: 0xbb61,
-	0x1b86: 0xbb79, 0x1b87: 0xbb91, 0x1b88: 0xbba9, 0x1b89: 0xbbc1, 0x1b8a: 0xbbd9, 0x1b8b: 0x2109,
-	0x1b8c: 0x1111, 0x1b8d: 0xbbf1, 0x1b8e: 0xbbf1, 0x1b8f: 0xbc09, 0x1b90: 0xbc21, 0x1b91: 0x10e1,
-	0x1b92: 0x10f9, 0x1b93: 0xbc39, 0x1b94: 0x2079, 0x1b95: 0xbc71, 0x1b96: 0xbb19, 0x1b97: 0x1429,
-	0x1b98: 0xbb61, 0x1b99: 0x10e1, 0x1b9a: 0x1111, 0x1b9b: 0x2109, 0x1b9c: 0xbb01, 0x1b9d: 0x1099,
-	0x1b9e: 0x10b1, 0x1b9f: 0x10c9, 0x1ba0: 0xbb19, 0x1ba1: 0xbb31, 0x1ba2: 0xbb49, 0x1ba3: 0x1429,
-	0x1ba4: 0x1a31, 0x1ba5: 0xbb61, 0x1ba6: 0xbb79, 0x1ba7: 0xbb91, 0x1ba8: 0xbba9, 0x1ba9: 0xbbc1,
-	0x1baa: 0xbbd9, 0x1bab: 0x2109, 0x1bac: 0x1111, 0x1bad: 0x1429, 0x1bae: 0xbbf1, 0x1baf: 0xbc09,
-	0x1bb0: 0xbc21, 0x1bb1: 0x10e1, 0x1bb2: 0x10f9, 0x1bb3: 0xbc39, 0x1bb4: 0x2079, 0x1bb5: 0xbc51,
-	0x1bb6: 0xbb01, 0x1bb7: 0x1099, 0x1bb8: 0x10b1, 0x1bb9: 0x10c9, 0x1bba: 0xbb19, 0x1bbb: 0xbb31,
-	0x1bbc: 0xbb49, 0x1bbd: 0x1429, 0x1bbe: 0x1a31, 0x1bbf: 0xbb61,
+	0x1b80: 0x03c1, 0x1b81: 0x22d9, 0x1b82: 0x22d9, 0x1b83: 0x22e1, 0x1b84: 0x22e9, 0x1b85: 0x03b1,
+	0x1b86: 0x03b9, 0x1b87: 0x22f1, 0x1b88: 0x0769, 0x1b89: 0x2301, 0x1b8a: 0x2291, 0x1b8b: 0x04d1,
+	0x1b8c: 0x22a9, 0x1b8d: 0x03b1, 0x1b8e: 0x03c1, 0x1b8f: 0x0799, 0x1b90: 0x2289, 0x1b91: 0x0399,
+	0x1b92: 0x03a1, 0x1b93: 0x03a9, 0x1b94: 0x2291, 0x1b95: 0x2299, 0x1b96: 0x22a1, 0x1b97: 0x04d1,
+	0x1b98: 0x05f9, 0x1b99: 0x22a9, 0x1b9a: 0x22b1, 0x1b9b: 0x22b9, 0x1b9c: 0x22c1, 0x1b9d: 0x22c9,
+	0x1b9e: 0x22d1, 0x1b9f: 0x0799, 0x1ba0: 0x03c1, 0x1ba1: 0x04d1, 0x1ba2: 0x22d9, 0x1ba3: 0x22e1,
+	0x1ba4: 0x22e9, 0x1ba5: 0x03b1, 0x1ba6: 0x03b9, 0x1ba7: 0x22f1, 0x1ba8: 0x0769, 0x1ba9: 0x22f9,
+	0x1baa: 0x2289, 0x1bab: 0x0399, 0x1bac: 0x03a1, 0x1bad: 0x03a9, 0x1bae: 0x2291, 0x1baf: 0x2299,
+	0x1bb0: 0x22a1, 0x1bb1: 0x04d1, 0x1bb2: 0x05f9, 0x1bb3: 0x22a9, 0x1bb4: 0x22b1, 0x1bb5: 0x22b9,
+	0x1bb6: 0x22c1, 0x1bb7: 0x22c9, 0x1bb8: 0x22d1, 0x1bb9: 0x0799, 0x1bba: 0x03c1, 0x1bbb: 0x22d9,
+	0x1bbc: 0x22d9, 0x1bbd: 0x22e1, 0x1bbe: 0x22e9, 0x1bbf: 0x03b1,
 	// Block 0x6f, offset 0x1bc0
-	0x1bc0: 0xbb79, 0x1bc1: 0xbb91, 0x1bc2: 0xbba9, 0x1bc3: 0xbbc1, 0x1bc4: 0xbbd9, 0x1bc5: 0x2109,
-	0x1bc6: 0x1111, 0x1bc7: 0xbbf1, 0x1bc8: 0xbbf1, 0x1bc9: 0xbc09, 0x1bca: 0xbc21, 0x1bcb: 0x10e1,
-	0x1bcc: 0x10f9, 0x1bcd: 0xbc39, 0x1bce: 0x2079, 0x1bcf: 0xbc71, 0x1bd0: 0xbb19, 0x1bd1: 0x1429,
-	0x1bd2: 0xbb61, 0x1bd3: 0x10e1, 0x1bd4: 0x1111, 0x1bd5: 0x2109, 0x1bd6: 0xbb01, 0x1bd7: 0x1099,
-	0x1bd8: 0x10b1, 0x1bd9: 0x10c9, 0x1bda: 0xbb19, 0x1bdb: 0xbb31, 0x1bdc: 0xbb49, 0x1bdd: 0x1429,
-	0x1bde: 0x1a31, 0x1bdf: 0xbb61, 0x1be0: 0xbb79, 0x1be1: 0xbb91, 0x1be2: 0xbba9, 0x1be3: 0xbbc1,
-	0x1be4: 0xbbd9, 0x1be5: 0x2109, 0x1be6: 0x1111, 0x1be7: 0x1429, 0x1be8: 0xbbf1, 0x1be9: 0xbc09,
-	0x1bea: 0xbc21, 0x1beb: 0x10e1, 0x1bec: 0x10f9, 0x1bed: 0xbc39, 0x1bee: 0x2079, 0x1bef: 0xbc51,
-	0x1bf0: 0xbb01, 0x1bf1: 0x1099, 0x1bf2: 0x10b1, 0x1bf3: 0x10c9, 0x1bf4: 0xbb19, 0x1bf5: 0xbb31,
-	0x1bf6: 0xbb49, 0x1bf7: 0x1429, 0x1bf8: 0x1a31, 0x1bf9: 0xbb61, 0x1bfa: 0xbb79, 0x1bfb: 0xbb91,
-	0x1bfc: 0xbba9, 0x1bfd: 0xbbc1, 0x1bfe: 0xbbd9, 0x1bff: 0x2109,
+	0x1bc0: 0x03b9, 0x1bc1: 0x22f1, 0x1bc2: 0x0769, 0x1bc3: 0x2301, 0x1bc4: 0x2291, 0x1bc5: 0x04d1,
+	0x1bc6: 0x22a9, 0x1bc7: 0x03b1, 0x1bc8: 0x03c1, 0x1bc9: 0x0799, 0x1bca: 0x2309, 0x1bcb: 0x2309,
+	0x1bcc: 0x0040, 0x1bcd: 0x0040, 0x1bce: 0x06e1, 0x1bcf: 0x0049, 0x1bd0: 0x0029, 0x1bd1: 0x0031,
+	0x1bd2: 0x06e9, 0x1bd3: 0x06f1, 0x1bd4: 0x06f9, 0x1bd5: 0x0701, 0x1bd6: 0x0709, 0x1bd7: 0x0711,
+	0x1bd8: 0x06e1, 0x1bd9: 0x0049, 0x1bda: 0x0029, 0x1bdb: 0x0031, 0x1bdc: 0x06e9, 0x1bdd: 0x06f1,
+	0x1bde: 0x06f9, 0x1bdf: 0x0701, 0x1be0: 0x0709, 0x1be1: 0x0711, 0x1be2: 0x06e1, 0x1be3: 0x0049,
+	0x1be4: 0x0029, 0x1be5: 0x0031, 0x1be6: 0x06e9, 0x1be7: 0x06f1, 0x1be8: 0x06f9, 0x1be9: 0x0701,
+	0x1bea: 0x0709, 0x1beb: 0x0711, 0x1bec: 0x06e1, 0x1bed: 0x0049, 0x1bee: 0x0029, 0x1bef: 0x0031,
+	0x1bf0: 0x06e9, 0x1bf1: 0x06f1, 0x1bf2: 0x06f9, 0x1bf3: 0x0701, 0x1bf4: 0x0709, 0x1bf5: 0x0711,
+	0x1bf6: 0x06e1, 0x1bf7: 0x0049, 0x1bf8: 0x0029, 0x1bf9: 0x0031, 0x1bfa: 0x06e9, 0x1bfb: 0x06f1,
+	0x1bfc: 0x06f9, 0x1bfd: 0x0701, 0x1bfe: 0x0709, 0x1bff: 0x0711,
 	// Block 0x70, offset 0x1c00
-	0x1c00: 0x1111, 0x1c01: 0xbbf1, 0x1c02: 0xbbf1, 0x1c03: 0xbc09, 0x1c04: 0xbc21, 0x1c05: 0x10e1,
-	0x1c06: 0x10f9, 0x1c07: 0xbc39, 0x1c08: 0x2079, 0x1c09: 0xbc71, 0x1c0a: 0xbb19, 0x1c0b: 0x1429,
-	0x1c0c: 0xbb61, 0x1c0d: 0x10e1, 0x1c0e: 0x1111, 0x1c0f: 0x2109, 0x1c10: 0xbb01, 0x1c11: 0x1099,
-	0x1c12: 0x10b1, 0x1c13: 0x10c9, 0x1c14: 0xbb19, 0x1c15: 0xbb31, 0x1c16: 0xbb49, 0x1c17: 0x1429,
-	0x1c18: 0x1a31, 0x1c19: 0xbb61, 0x1c1a: 0xbb79, 0x1c1b: 0xbb91, 0x1c1c: 0xbba9, 0x1c1d: 0xbbc1,
-	0x1c1e: 0xbbd9, 0x1c1f: 0x2109, 0x1c20: 0x1111, 0x1c21: 0x1429, 0x1c22: 0xbbf1, 0x1c23: 0xbc09,
-	0x1c24: 0xbc21, 0x1c25: 0x10e1, 0x1c26: 0x10f9, 0x1c27: 0xbc39, 0x1c28: 0x2079, 0x1c29: 0xbc51,
-	0x1c2a: 0xbb01, 0x1c2b: 0x1099, 0x1c2c: 0x10b1, 0x1c2d: 0x10c9, 0x1c2e: 0xbb19, 0x1c2f: 0xbb31,
-	0x1c30: 0xbb49, 0x1c31: 0x1429, 0x1c32: 0x1a31, 0x1c33: 0xbb61, 0x1c34: 0xbb79, 0x1c35: 0xbb91,
-	0x1c36: 0xbba9, 0x1c37: 0xbbc1, 0x1c38: 0xbbd9, 0x1c39: 0x2109, 0x1c3a: 0x1111, 0x1c3b: 0xbbf1,
-	0x1c3c: 0xbbf1, 0x1c3d: 0xbc09, 0x1c3e: 0xbc21, 0x1c3f: 0x10e1,
+	0x1c00: 0xe115, 0x1c01: 0xe115, 0x1c02: 0xe135, 0x1c03: 0xe135, 0x1c04: 0xe115, 0x1c05: 0xe115,
+	0x1c06: 0xe175, 0x1c07: 0xe175, 0x1c08: 0xe115, 0x1c09: 0xe115, 0x1c0a: 0xe135, 0x1c0b: 0xe135,
+	0x1c0c: 0xe115, 0x1c0d: 0xe115, 0x1c0e: 0xe1f5, 0x1c0f: 0xe1f5, 0x1c10: 0xe115, 0x1c11: 0xe115,
+	0x1c12: 0xe135, 0x1c13: 0xe135, 0x1c14: 0xe115, 0x1c15: 0xe115, 0x1c16: 0xe175, 0x1c17: 0xe175,
+	0x1c18: 0xe115, 0x1c19: 0xe115, 0x1c1a: 0xe135, 0x1c1b: 0xe135, 0x1c1c: 0xe115, 0x1c1d: 0xe115,
+	0x1c1e: 0x8b3d, 0x1c1f: 0x8b3d, 0x1c20: 0x04b5, 0x1c21: 0x04b5, 0x1c22: 0x0a08, 0x1c23: 0x0a08,
+	0x1c24: 0x0a08, 0x1c25: 0x0a08, 0x1c26: 0x0a08, 0x1c27: 0x0a08, 0x1c28: 0x0a08, 0x1c29: 0x0a08,
+	0x1c2a: 0x0a08, 0x1c2b: 0x0a08, 0x1c2c: 0x0a08, 0x1c2d: 0x0a08, 0x1c2e: 0x0a08, 0x1c2f: 0x0a08,
+	0x1c30: 0x0a08, 0x1c31: 0x0a08, 0x1c32: 0x0a08, 0x1c33: 0x0a08, 0x1c34: 0x0a08, 0x1c35: 0x0a08,
+	0x1c36: 0x0a08, 0x1c37: 0x0a08, 0x1c38: 0x0a08, 0x1c39: 0x0a08, 0x1c3a: 0x0a08, 0x1c3b: 0x0a08,
+	0x1c3c: 0x0a08, 0x1c3d: 0x0a08, 0x1c3e: 0x0a08, 0x1c3f: 0x0a08,
 	// Block 0x71, offset 0x1c40
-	0x1c40: 0x10f9, 0x1c41: 0xbc39, 0x1c42: 0x2079, 0x1c43: 0xbc71, 0x1c44: 0xbb19, 0x1c45: 0x1429,
-	0x1c46: 0xbb61, 0x1c47: 0x10e1, 0x1c48: 0x1111, 0x1c49: 0x2109, 0x1c4a: 0xbc91, 0x1c4b: 0xbc91,
-	0x1c4c: 0x0040, 0x1c4d: 0x0040, 0x1c4e: 0x1f41, 0x1c4f: 0x00c9, 0x1c50: 0x0069, 0x1c51: 0x0079,
-	0x1c52: 0x1f51, 0x1c53: 0x1f61, 0x1c54: 0x1f71, 0x1c55: 0x1f81, 0x1c56: 0x1f91, 0x1c57: 0x1fa1,
-	0x1c58: 0x1f41, 0x1c59: 0x00c9, 0x1c5a: 0x0069, 0x1c5b: 0x0079, 0x1c5c: 0x1f51, 0x1c5d: 0x1f61,
-	0x1c5e: 0x1f71, 0x1c5f: 0x1f81, 0x1c60: 0x1f91, 0x1c61: 0x1fa1, 0x1c62: 0x1f41, 0x1c63: 0x00c9,
-	0x1c64: 0x0069, 0x1c65: 0x0079, 0x1c66: 0x1f51, 0x1c67: 0x1f61, 0x1c68: 0x1f71, 0x1c69: 0x1f81,
-	0x1c6a: 0x1f91, 0x1c6b: 0x1fa1, 0x1c6c: 0x1f41, 0x1c6d: 0x00c9, 0x1c6e: 0x0069, 0x1c6f: 0x0079,
-	0x1c70: 0x1f51, 0x1c71: 0x1f61, 0x1c72: 0x1f71, 0x1c73: 0x1f81, 0x1c74: 0x1f91, 0x1c75: 0x1fa1,
-	0x1c76: 0x1f41, 0x1c77: 0x00c9, 0x1c78: 0x0069, 0x1c79: 0x0079, 0x1c7a: 0x1f51, 0x1c7b: 0x1f61,
-	0x1c7c: 0x1f71, 0x1c7d: 0x1f81, 0x1c7e: 0x1f91, 0x1c7f: 0x1fa1,
+	0x1c40: 0x20b1, 0x1c41: 0x20b9, 0x1c42: 0x20d9, 0x1c43: 0x20f1, 0x1c44: 0x0040, 0x1c45: 0x2189,
+	0x1c46: 0x2109, 0x1c47: 0x20e1, 0x1c48: 0x2131, 0x1c49: 0x2191, 0x1c4a: 0x2161, 0x1c4b: 0x2169,
+	0x1c4c: 0x2171, 0x1c4d: 0x2179, 0x1c4e: 0x2111, 0x1c4f: 0x2141, 0x1c50: 0x2151, 0x1c51: 0x2121,
+	0x1c52: 0x2159, 0x1c53: 0x2101, 0x1c54: 0x2119, 0x1c55: 0x20c9, 0x1c56: 0x20d1, 0x1c57: 0x20e9,
+	0x1c58: 0x20f9, 0x1c59: 0x2129, 0x1c5a: 0x2139, 0x1c5b: 0x2149, 0x1c5c: 0x2311, 0x1c5d: 0x1689,
+	0x1c5e: 0x2319, 0x1c5f: 0x2321, 0x1c60: 0x0040, 0x1c61: 0x20b9, 0x1c62: 0x20d9, 0x1c63: 0x0040,
+	0x1c64: 0x2181, 0x1c65: 0x0040, 0x1c66: 0x0040, 0x1c67: 0x20e1, 0x1c68: 0x0040, 0x1c69: 0x2191,
+	0x1c6a: 0x2161, 0x1c6b: 0x2169, 0x1c6c: 0x2171, 0x1c6d: 0x2179, 0x1c6e: 0x2111, 0x1c6f: 0x2141,
+	0x1c70: 0x2151, 0x1c71: 0x2121, 0x1c72: 0x2159, 0x1c73: 0x0040, 0x1c74: 0x2119, 0x1c75: 0x20c9,
+	0x1c76: 0x20d1, 0x1c77: 0x20e9, 0x1c78: 0x0040, 0x1c79: 0x2129, 0x1c7a: 0x0040, 0x1c7b: 0x2149,
+	0x1c7c: 0x0040, 0x1c7d: 0x0040, 0x1c7e: 0x0040, 0x1c7f: 0x0040,
 	// Block 0x72, offset 0x1c80
-	0x1c80: 0xe115, 0x1c81: 0xe115, 0x1c82: 0xe135, 0x1c83: 0xe135, 0x1c84: 0xe115, 0x1c85: 0xe115,
-	0x1c86: 0xe175, 0x1c87: 0xe175, 0x1c88: 0xe115, 0x1c89: 0xe115, 0x1c8a: 0xe135, 0x1c8b: 0xe135,
-	0x1c8c: 0xe115, 0x1c8d: 0xe115, 0x1c8e: 0xe1f5, 0x1c8f: 0xe1f5, 0x1c90: 0xe115, 0x1c91: 0xe115,
-	0x1c92: 0xe135, 0x1c93: 0xe135, 0x1c94: 0xe115, 0x1c95: 0xe115, 0x1c96: 0xe175, 0x1c97: 0xe175,
-	0x1c98: 0xe115, 0x1c99: 0xe115, 0x1c9a: 0xe135, 0x1c9b: 0xe135, 0x1c9c: 0xe115, 0x1c9d: 0xe115,
-	0x1c9e: 0x8b3d, 0x1c9f: 0x8b3d, 0x1ca0: 0x04b5, 0x1ca1: 0x04b5, 0x1ca2: 0x0a08, 0x1ca3: 0x0a08,
-	0x1ca4: 0x0a08, 0x1ca5: 0x0a08, 0x1ca6: 0x0a08, 0x1ca7: 0x0a08, 0x1ca8: 0x0a08, 0x1ca9: 0x0a08,
-	0x1caa: 0x0a08, 0x1cab: 0x0a08, 0x1cac: 0x0a08, 0x1cad: 0x0a08, 0x1cae: 0x0a08, 0x1caf: 0x0a08,
-	0x1cb0: 0x0a08, 0x1cb1: 0x0a08, 0x1cb2: 0x0a08, 0x1cb3: 0x0a08, 0x1cb4: 0x0a08, 0x1cb5: 0x0a08,
-	0x1cb6: 0x0a08, 0x1cb7: 0x0a08, 0x1cb8: 0x0a08, 0x1cb9: 0x0a08, 0x1cba: 0x0a08, 0x1cbb: 0x0a08,
-	0x1cbc: 0x0a08, 0x1cbd: 0x0a08, 0x1cbe: 0x0a08, 0x1cbf: 0x0a08,
+	0x1c80: 0x0040, 0x1c81: 0x0040, 0x1c82: 0x20d9, 0x1c83: 0x0040, 0x1c84: 0x0040, 0x1c85: 0x0040,
+	0x1c86: 0x0040, 0x1c87: 0x20e1, 0x1c88: 0x0040, 0x1c89: 0x2191, 0x1c8a: 0x0040, 0x1c8b: 0x2169,
+	0x1c8c: 0x0040, 0x1c8d: 0x2179, 0x1c8e: 0x2111, 0x1c8f: 0x2141, 0x1c90: 0x0040, 0x1c91: 0x2121,
+	0x1c92: 0x2159, 0x1c93: 0x0040, 0x1c94: 0x2119, 0x1c95: 0x0040, 0x1c96: 0x0040, 0x1c97: 0x20e9,
+	0x1c98: 0x0040, 0x1c99: 0x2129, 0x1c9a: 0x0040, 0x1c9b: 0x2149, 0x1c9c: 0x0040, 0x1c9d: 0x1689,
+	0x1c9e: 0x0040, 0x1c9f: 0x2321, 0x1ca0: 0x0040, 0x1ca1: 0x20b9, 0x1ca2: 0x20d9, 0x1ca3: 0x0040,
+	0x1ca4: 0x2181, 0x1ca5: 0x0040, 0x1ca6: 0x0040, 0x1ca7: 0x20e1, 0x1ca8: 0x2131, 0x1ca9: 0x2191,
+	0x1caa: 0x2161, 0x1cab: 0x0040, 0x1cac: 0x2171, 0x1cad: 0x2179, 0x1cae: 0x2111, 0x1caf: 0x2141,
+	0x1cb0: 0x2151, 0x1cb1: 0x2121, 0x1cb2: 0x2159, 0x1cb3: 0x0040, 0x1cb4: 0x2119, 0x1cb5: 0x20c9,
+	0x1cb6: 0x20d1, 0x1cb7: 0x20e9, 0x1cb8: 0x0040, 0x1cb9: 0x2129, 0x1cba: 0x2139, 0x1cbb: 0x2149,
+	0x1cbc: 0x2311, 0x1cbd: 0x0040, 0x1cbe: 0x2319, 0x1cbf: 0x0040,
 	// Block 0x73, offset 0x1cc0
-	0x1cc0: 0xb1d9, 0x1cc1: 0xb1f1, 0x1cc2: 0xb251, 0x1cc3: 0xb299, 0x1cc4: 0x0040, 0x1cc5: 0xb461,
-	0x1cc6: 0xb2e1, 0x1cc7: 0xb269, 0x1cc8: 0xb359, 0x1cc9: 0xb479, 0x1cca: 0xb3e9, 0x1ccb: 0xb401,
-	0x1ccc: 0xb419, 0x1ccd: 0xb431, 0x1cce: 0xb2f9, 0x1ccf: 0xb389, 0x1cd0: 0xb3b9, 0x1cd1: 0xb329,
-	0x1cd2: 0xb3d1, 0x1cd3: 0xb2c9, 0x1cd4: 0xb311, 0x1cd5: 0xb221, 0x1cd6: 0xb239, 0x1cd7: 0xb281,
-	0x1cd8: 0xb2b1, 0x1cd9: 0xb341, 0x1cda: 0xb371, 0x1cdb: 0xb3a1, 0x1cdc: 0xbca9, 0x1cdd: 0x7999,
-	0x1cde: 0xbcc1, 0x1cdf: 0xbcd9, 0x1ce0: 0x0040, 0x1ce1: 0xb1f1, 0x1ce2: 0xb251, 0x1ce3: 0x0040,
-	0x1ce4: 0xb449, 0x1ce5: 0x0040, 0x1ce6: 0x0040, 0x1ce7: 0xb269, 0x1ce8: 0x0040, 0x1ce9: 0xb479,
-	0x1cea: 0xb3e9, 0x1ceb: 0xb401, 0x1cec: 0xb419, 0x1ced: 0xb431, 0x1cee: 0xb2f9, 0x1cef: 0xb389,
-	0x1cf0: 0xb3b9, 0x1cf1: 0xb329, 0x1cf2: 0xb3d1, 0x1cf3: 0x0040, 0x1cf4: 0xb311, 0x1cf5: 0xb221,
-	0x1cf6: 0xb239, 0x1cf7: 0xb281, 0x1cf8: 0x0040, 0x1cf9: 0xb341, 0x1cfa: 0x0040, 0x1cfb: 0xb3a1,
+	0x1cc0: 0x20b1, 0x1cc1: 0x20b9, 0x1cc2: 0x20d9, 0x1cc3: 0x20f1, 0x1cc4: 0x2181, 0x1cc5: 0x2189,
+	0x1cc6: 0x2109, 0x1cc7: 0x20e1, 0x1cc8: 0x2131, 0x1cc9: 0x2191, 0x1cca: 0x0040, 0x1ccb: 0x2169,
+	0x1ccc: 0x2171, 0x1ccd: 0x2179, 0x1cce: 0x2111, 0x1ccf: 0x2141, 0x1cd0: 0x2151, 0x1cd1: 0x2121,
+	0x1cd2: 0x2159, 0x1cd3: 0x2101, 0x1cd4: 0x2119, 0x1cd5: 0x20c9, 0x1cd6: 0x20d1, 0x1cd7: 0x20e9,
+	0x1cd8: 0x20f9, 0x1cd9: 0x2129, 0x1cda: 0x2139, 0x1cdb: 0x2149, 0x1cdc: 0x0040, 0x1cdd: 0x0040,
+	0x1cde: 0x0040, 0x1cdf: 0x0040, 0x1ce0: 0x0040, 0x1ce1: 0x20b9, 0x1ce2: 0x20d9, 0x1ce3: 0x20f1,
+	0x1ce4: 0x0040, 0x1ce5: 0x2189, 0x1ce6: 0x2109, 0x1ce7: 0x20e1, 0x1ce8: 0x2131, 0x1ce9: 0x2191,
+	0x1cea: 0x0040, 0x1ceb: 0x2169, 0x1cec: 0x2171, 0x1ced: 0x2179, 0x1cee: 0x2111, 0x1cef: 0x2141,
+	0x1cf0: 0x2151, 0x1cf1: 0x2121, 0x1cf2: 0x2159, 0x1cf3: 0x2101, 0x1cf4: 0x2119, 0x1cf5: 0x20c9,
+	0x1cf6: 0x20d1, 0x1cf7: 0x20e9, 0x1cf8: 0x20f9, 0x1cf9: 0x2129, 0x1cfa: 0x2139, 0x1cfb: 0x2149,
 	0x1cfc: 0x0040, 0x1cfd: 0x0040, 0x1cfe: 0x0040, 0x1cff: 0x0040,
 	// Block 0x74, offset 0x1d00
-	0x1d00: 0x0040, 0x1d01: 0x0040, 0x1d02: 0xb251, 0x1d03: 0x0040, 0x1d04: 0x0040, 0x1d05: 0x0040,
-	0x1d06: 0x0040, 0x1d07: 0xb269, 0x1d08: 0x0040, 0x1d09: 0xb479, 0x1d0a: 0x0040, 0x1d0b: 0xb401,
-	0x1d0c: 0x0040, 0x1d0d: 0xb431, 0x1d0e: 0xb2f9, 0x1d0f: 0xb389, 0x1d10: 0x0040, 0x1d11: 0xb329,
-	0x1d12: 0xb3d1, 0x1d13: 0x0040, 0x1d14: 0xb311, 0x1d15: 0x0040, 0x1d16: 0x0040, 0x1d17: 0xb281,
-	0x1d18: 0x0040, 0x1d19: 0xb341, 0x1d1a: 0x0040, 0x1d1b: 0xb3a1, 0x1d1c: 0x0040, 0x1d1d: 0x7999,
-	0x1d1e: 0x0040, 0x1d1f: 0xbcd9, 0x1d20: 0x0040, 0x1d21: 0xb1f1, 0x1d22: 0xb251, 0x1d23: 0x0040,
-	0x1d24: 0xb449, 0x1d25: 0x0040, 0x1d26: 0x0040, 0x1d27: 0xb269, 0x1d28: 0xb359, 0x1d29: 0xb479,
-	0x1d2a: 0xb3e9, 0x1d2b: 0x0040, 0x1d2c: 0xb419, 0x1d2d: 0xb431, 0x1d2e: 0xb2f9, 0x1d2f: 0xb389,
-	0x1d30: 0xb3b9, 0x1d31: 0xb329, 0x1d32: 0xb3d1, 0x1d33: 0x0040, 0x1d34: 0xb311, 0x1d35: 0xb221,
-	0x1d36: 0xb239, 0x1d37: 0xb281, 0x1d38: 0x0040, 0x1d39: 0xb341, 0x1d3a: 0xb371, 0x1d3b: 0xb3a1,
-	0x1d3c: 0xbca9, 0x1d3d: 0x0040, 0x1d3e: 0xbcc1, 0x1d3f: 0x0040,
+	0x1d00: 0x0040, 0x1d01: 0x232a, 0x1d02: 0x2332, 0x1d03: 0x233a, 0x1d04: 0x2342, 0x1d05: 0x234a,
+	0x1d06: 0x2352, 0x1d07: 0x235a, 0x1d08: 0x2362, 0x1d09: 0x236a, 0x1d0a: 0x2372, 0x1d0b: 0x0018,
+	0x1d0c: 0x0018, 0x1d0d: 0x0018, 0x1d0e: 0x0018, 0x1d0f: 0x0018, 0x1d10: 0x237a, 0x1d11: 0x2382,
+	0x1d12: 0x238a, 0x1d13: 0x2392, 0x1d14: 0x239a, 0x1d15: 0x23a2, 0x1d16: 0x23aa, 0x1d17: 0x23b2,
+	0x1d18: 0x23ba, 0x1d19: 0x23c2, 0x1d1a: 0x23ca, 0x1d1b: 0x23d2, 0x1d1c: 0x23da, 0x1d1d: 0x23e2,
+	0x1d1e: 0x23ea, 0x1d1f: 0x23f2, 0x1d20: 0x23fa, 0x1d21: 0x2402, 0x1d22: 0x240a, 0x1d23: 0x2412,
+	0x1d24: 0x241a, 0x1d25: 0x2422, 0x1d26: 0x242a, 0x1d27: 0x2432, 0x1d28: 0x243a, 0x1d29: 0x2442,
+	0x1d2a: 0x2449, 0x1d2b: 0x03d9, 0x1d2c: 0x00b9, 0x1d2d: 0x1239, 0x1d2e: 0x2451, 0x1d2f: 0x0018,
+	0x1d30: 0x0019, 0x1d31: 0x02e9, 0x1d32: 0x03d9, 0x1d33: 0x02f1, 0x1d34: 0x02f9, 0x1d35: 0x03f1,
+	0x1d36: 0x0309, 0x1d37: 0x00a9, 0x1d38: 0x0311, 0x1d39: 0x00b1, 0x1d3a: 0x0319, 0x1d3b: 0x0101,
+	0x1d3c: 0x0321, 0x1d3d: 0x0329, 0x1d3e: 0x0051, 0x1d3f: 0x0339,
 	// Block 0x75, offset 0x1d40
-	0x1d40: 0xb1d9, 0x1d41: 0xb1f1, 0x1d42: 0xb251, 0x1d43: 0xb299, 0x1d44: 0xb449, 0x1d45: 0xb461,
-	0x1d46: 0xb2e1, 0x1d47: 0xb269, 0x1d48: 0xb359, 0x1d49: 0xb479, 0x1d4a: 0x0040, 0x1d4b: 0xb401,
-	0x1d4c: 0xb419, 0x1d4d: 0xb431, 0x1d4e: 0xb2f9, 0x1d4f: 0xb389, 0x1d50: 0xb3b9, 0x1d51: 0xb329,
-	0x1d52: 0xb3d1, 0x1d53: 0xb2c9, 0x1d54: 0xb311, 0x1d55: 0xb221, 0x1d56: 0xb239, 0x1d57: 0xb281,
-	0x1d58: 0xb2b1, 0x1d59: 0xb341, 0x1d5a: 0xb371, 0x1d5b: 0xb3a1, 0x1d5c: 0x0040, 0x1d5d: 0x0040,
-	0x1d5e: 0x0040, 0x1d5f: 0x0040, 0x1d60: 0x0040, 0x1d61: 0xb1f1, 0x1d62: 0xb251, 0x1d63: 0xb299,
-	0x1d64: 0x0040, 0x1d65: 0xb461, 0x1d66: 0xb2e1, 0x1d67: 0xb269, 0x1d68: 0xb359, 0x1d69: 0xb479,
-	0x1d6a: 0x0040, 0x1d6b: 0xb401, 0x1d6c: 0xb419, 0x1d6d: 0xb431, 0x1d6e: 0xb2f9, 0x1d6f: 0xb389,
-	0x1d70: 0xb3b9, 0x1d71: 0xb329, 0x1d72: 0xb3d1, 0x1d73: 0xb2c9, 0x1d74: 0xb311, 0x1d75: 0xb221,
-	0x1d76: 0xb239, 0x1d77: 0xb281, 0x1d78: 0xb2b1, 0x1d79: 0xb341, 0x1d7a: 0xb371, 0x1d7b: 0xb3a1,
-	0x1d7c: 0x0040, 0x1d7d: 0x0040, 0x1d7e: 0x0040, 0x1d7f: 0x0040,
+	0x1d40: 0x0751, 0x1d41: 0x00b9, 0x1d42: 0x0089, 0x1d43: 0x0341, 0x1d44: 0x0349, 0x1d45: 0x0391,
+	0x1d46: 0x00c1, 0x1d47: 0x0109, 0x1d48: 0x00c9, 0x1d49: 0x04b1, 0x1d4a: 0x2459, 0x1d4b: 0x11f9,
+	0x1d4c: 0x2461, 0x1d4d: 0x04d9, 0x1d4e: 0x2469, 0x1d4f: 0x2471, 0x1d50: 0x0018, 0x1d51: 0x0018,
+	0x1d52: 0x0018, 0x1d53: 0x0018, 0x1d54: 0x0018, 0x1d55: 0x0018, 0x1d56: 0x0018, 0x1d57: 0x0018,
+	0x1d58: 0x0018, 0x1d59: 0x0018, 0x1d5a: 0x0018, 0x1d5b: 0x0018, 0x1d5c: 0x0018, 0x1d5d: 0x0018,
+	0x1d5e: 0x0018, 0x1d5f: 0x0018, 0x1d60: 0x0018, 0x1d61: 0x0018, 0x1d62: 0x0018, 0x1d63: 0x0018,
+	0x1d64: 0x0018, 0x1d65: 0x0018, 0x1d66: 0x0018, 0x1d67: 0x0018, 0x1d68: 0x0018, 0x1d69: 0x0018,
+	0x1d6a: 0x2479, 0x1d6b: 0x2481, 0x1d6c: 0x2489, 0x1d6d: 0x0018, 0x1d6e: 0x0018, 0x1d6f: 0x0018,
+	0x1d70: 0x0018, 0x1d71: 0x0018, 0x1d72: 0x0018, 0x1d73: 0x0018, 0x1d74: 0x0018, 0x1d75: 0x0018,
+	0x1d76: 0x0018, 0x1d77: 0x0018, 0x1d78: 0x0018, 0x1d79: 0x0018, 0x1d7a: 0x0018, 0x1d7b: 0x0018,
+	0x1d7c: 0x0018, 0x1d7d: 0x0018, 0x1d7e: 0x0018, 0x1d7f: 0x0018,
 	// Block 0x76, offset 0x1d80
-	0x1d80: 0x0040, 0x1d81: 0xbcf2, 0x1d82: 0xbd0a, 0x1d83: 0xbd22, 0x1d84: 0xbd3a, 0x1d85: 0xbd52,
-	0x1d86: 0xbd6a, 0x1d87: 0xbd82, 0x1d88: 0xbd9a, 0x1d89: 0xbdb2, 0x1d8a: 0xbdca, 0x1d8b: 0x0018,
-	0x1d8c: 0x0018, 0x1d8d: 0x0018, 0x1d8e: 0x0018, 0x1d8f: 0x0018, 0x1d90: 0xbde2, 0x1d91: 0xbe02,
-	0x1d92: 0xbe22, 0x1d93: 0xbe42, 0x1d94: 0xbe62, 0x1d95: 0xbe82, 0x1d96: 0xbea2, 0x1d97: 0xbec2,
-	0x1d98: 0xbee2, 0x1d99: 0xbf02, 0x1d9a: 0xbf22, 0x1d9b: 0xbf42, 0x1d9c: 0xbf62, 0x1d9d: 0xbf82,
-	0x1d9e: 0xbfa2, 0x1d9f: 0xbfc2, 0x1da0: 0xbfe2, 0x1da1: 0xc002, 0x1da2: 0xc022, 0x1da3: 0xc042,
-	0x1da4: 0xc062, 0x1da5: 0xc082, 0x1da6: 0xc0a2, 0x1da7: 0xc0c2, 0x1da8: 0xc0e2, 0x1da9: 0xc102,
-	0x1daa: 0xc121, 0x1dab: 0x1159, 0x1dac: 0x0269, 0x1dad: 0x66a9, 0x1dae: 0xc161, 0x1daf: 0x0018,
-	0x1db0: 0x0039, 0x1db1: 0x0ee9, 0x1db2: 0x1159, 0x1db3: 0x0ef9, 0x1db4: 0x0f09, 0x1db5: 0x1199,
-	0x1db6: 0x0f31, 0x1db7: 0x0249, 0x1db8: 0x0f41, 0x1db9: 0x0259, 0x1dba: 0x0f51, 0x1dbb: 0x0359,
-	0x1dbc: 0x0f61, 0x1dbd: 0x0f71, 0x1dbe: 0x00d9, 0x1dbf: 0x0f99,
+	0x1d80: 0x2499, 0x1d81: 0x24a1, 0x1d82: 0x24a9, 0x1d83: 0x0040, 0x1d84: 0x0040, 0x1d85: 0x0040,
+	0x1d86: 0x0040, 0x1d87: 0x0040, 0x1d88: 0x0040, 0x1d89: 0x0040, 0x1d8a: 0x0040, 0x1d8b: 0x0040,
+	0x1d8c: 0x0040, 0x1d8d: 0x0040, 0x1d8e: 0x0040, 0x1d8f: 0x0040, 0x1d90: 0x24b1, 0x1d91: 0x24b9,
+	0x1d92: 0x24c1, 0x1d93: 0x24c9, 0x1d94: 0x24d1, 0x1d95: 0x24d9, 0x1d96: 0x24e1, 0x1d97: 0x24e9,
+	0x1d98: 0x24f1, 0x1d99: 0x24f9, 0x1d9a: 0x2501, 0x1d9b: 0x2509, 0x1d9c: 0x2511, 0x1d9d: 0x2519,
+	0x1d9e: 0x2521, 0x1d9f: 0x2529, 0x1da0: 0x2531, 0x1da1: 0x2539, 0x1da2: 0x2541, 0x1da3: 0x2549,
+	0x1da4: 0x2551, 0x1da5: 0x2559, 0x1da6: 0x2561, 0x1da7: 0x2569, 0x1da8: 0x2571, 0x1da9: 0x2579,
+	0x1daa: 0x2581, 0x1dab: 0x2589, 0x1dac: 0x2591, 0x1dad: 0x2599, 0x1dae: 0x25a1, 0x1daf: 0x25a9,
+	0x1db0: 0x25b1, 0x1db1: 0x25b9, 0x1db2: 0x25c1, 0x1db3: 0x25c9, 0x1db4: 0x25d1, 0x1db5: 0x25d9,
+	0x1db6: 0x25e1, 0x1db7: 0x25e9, 0x1db8: 0x25f1, 0x1db9: 0x25f9, 0x1dba: 0x2601, 0x1dbb: 0x2609,
+	0x1dbc: 0x0040, 0x1dbd: 0x0040, 0x1dbe: 0x0040, 0x1dbf: 0x0040,
 	// Block 0x77, offset 0x1dc0
-	0x1dc0: 0x2039, 0x1dc1: 0x0269, 0x1dc2: 0x01d9, 0x1dc3: 0x0fa9, 0x1dc4: 0x0fb9, 0x1dc5: 0x1089,
-	0x1dc6: 0x0279, 0x1dc7: 0x0369, 0x1dc8: 0x0289, 0x1dc9: 0x13d1, 0x1dca: 0xc179, 0x1dcb: 0x65e9,
-	0x1dcc: 0xc191, 0x1dcd: 0x1441, 0x1dce: 0xc1a9, 0x1dcf: 0xc1c9, 0x1dd0: 0x0018, 0x1dd1: 0x0018,
-	0x1dd2: 0x0018, 0x1dd3: 0x0018, 0x1dd4: 0x0018, 0x1dd5: 0x0018, 0x1dd6: 0x0018, 0x1dd7: 0x0018,
-	0x1dd8: 0x0018, 0x1dd9: 0x0018, 0x1dda: 0x0018, 0x1ddb: 0x0018, 0x1ddc: 0x0018, 0x1ddd: 0x0018,
-	0x1dde: 0x0018, 0x1ddf: 0x0018, 0x1de0: 0x0018, 0x1de1: 0x0018, 0x1de2: 0x0018, 0x1de3: 0x0018,
-	0x1de4: 0x0018, 0x1de5: 0x0018, 0x1de6: 0x0018, 0x1de7: 0x0018, 0x1de8: 0x0018, 0x1de9: 0x0018,
-	0x1dea: 0xc1e1, 0x1deb: 0xc1f9, 0x1dec: 0xc211, 0x1ded: 0x0018, 0x1dee: 0x0018, 0x1def: 0x0018,
-	0x1df0: 0x0018, 0x1df1: 0x0018, 0x1df2: 0x0018, 0x1df3: 0x0018, 0x1df4: 0x0018, 0x1df5: 0x0018,
-	0x1df6: 0x0018, 0x1df7: 0x0018, 0x1df8: 0x0018, 0x1df9: 0x0018, 0x1dfa: 0x0018, 0x1dfb: 0x0018,
-	0x1dfc: 0x0018, 0x1dfd: 0x0018, 0x1dfe: 0x0018, 0x1dff: 0x0018,
+	0x1dc0: 0x2669, 0x1dc1: 0x2671, 0x1dc2: 0x2679, 0x1dc3: 0x8b55, 0x1dc4: 0x2681, 0x1dc5: 0x2689,
+	0x1dc6: 0x2691, 0x1dc7: 0x2699, 0x1dc8: 0x26a1, 0x1dc9: 0x26a9, 0x1dca: 0x26b1, 0x1dcb: 0x26b9,
+	0x1dcc: 0x26c1, 0x1dcd: 0x8b75, 0x1dce: 0x26c9, 0x1dcf: 0x26d1, 0x1dd0: 0x26d9, 0x1dd1: 0x26e1,
+	0x1dd2: 0x8b95, 0x1dd3: 0x26e9, 0x1dd4: 0x26f1, 0x1dd5: 0x2521, 0x1dd6: 0x8bb5, 0x1dd7: 0x26f9,
+	0x1dd8: 0x2701, 0x1dd9: 0x2709, 0x1dda: 0x2711, 0x1ddb: 0x2719, 0x1ddc: 0x8bd5, 0x1ddd: 0x2721,
+	0x1dde: 0x2729, 0x1ddf: 0x2731, 0x1de0: 0x2739, 0x1de1: 0x2741, 0x1de2: 0x25f9, 0x1de3: 0x2749,
+	0x1de4: 0x2751, 0x1de5: 0x2759, 0x1de6: 0x2761, 0x1de7: 0x2769, 0x1de8: 0x2771, 0x1de9: 0x2779,
+	0x1dea: 0x2781, 0x1deb: 0x2789, 0x1dec: 0x2791, 0x1ded: 0x2799, 0x1dee: 0x27a1, 0x1def: 0x27a9,
+	0x1df0: 0x27b1, 0x1df1: 0x27b9, 0x1df2: 0x27b9, 0x1df3: 0x27b9, 0x1df4: 0x8bf5, 0x1df5: 0x27c1,
+	0x1df6: 0x27c9, 0x1df7: 0x27d1, 0x1df8: 0x8c15, 0x1df9: 0x27d9, 0x1dfa: 0x27e1, 0x1dfb: 0x27e9,
+	0x1dfc: 0x27f1, 0x1dfd: 0x27f9, 0x1dfe: 0x2801, 0x1dff: 0x2809,
 	// Block 0x78, offset 0x1e00
-	0x1e00: 0xc241, 0x1e01: 0xc279, 0x1e02: 0xc2b1, 0x1e03: 0x0040, 0x1e04: 0x0040, 0x1e05: 0x0040,
-	0x1e06: 0x0040, 0x1e07: 0x0040, 0x1e08: 0x0040, 0x1e09: 0x0040, 0x1e0a: 0x0040, 0x1e0b: 0x0040,
-	0x1e0c: 0x0040, 0x1e0d: 0x0040, 0x1e0e: 0x0040, 0x1e0f: 0x0040, 0x1e10: 0xc2d1, 0x1e11: 0xc2f1,
-	0x1e12: 0xc311, 0x1e13: 0xc331, 0x1e14: 0xc351, 0x1e15: 0xc371, 0x1e16: 0xc391, 0x1e17: 0xc3b1,
-	0x1e18: 0xc3d1, 0x1e19: 0xc3f1, 0x1e1a: 0xc411, 0x1e1b: 0xc431, 0x1e1c: 0xc451, 0x1e1d: 0xc471,
-	0x1e1e: 0xc491, 0x1e1f: 0xc4b1, 0x1e20: 0xc4d1, 0x1e21: 0xc4f1, 0x1e22: 0xc511, 0x1e23: 0xc531,
-	0x1e24: 0xc551, 0x1e25: 0xc571, 0x1e26: 0xc591, 0x1e27: 0xc5b1, 0x1e28: 0xc5d1, 0x1e29: 0xc5f1,
-	0x1e2a: 0xc611, 0x1e2b: 0xc631, 0x1e2c: 0xc651, 0x1e2d: 0xc671, 0x1e2e: 0xc691, 0x1e2f: 0xc6b1,
-	0x1e30: 0xc6d1, 0x1e31: 0xc6f1, 0x1e32: 0xc711, 0x1e33: 0xc731, 0x1e34: 0xc751, 0x1e35: 0xc771,
-	0x1e36: 0xc791, 0x1e37: 0xc7b1, 0x1e38: 0xc7d1, 0x1e39: 0xc7f1, 0x1e3a: 0xc811, 0x1e3b: 0xc831,
-	0x1e3c: 0x0040, 0x1e3d: 0x0040, 0x1e3e: 0x0040, 0x1e3f: 0x0040,
+	0x1e00: 0x2811, 0x1e01: 0x2819, 0x1e02: 0x2821, 0x1e03: 0x2829, 0x1e04: 0x2831, 0x1e05: 0x2839,
+	0x1e06: 0x2839, 0x1e07: 0x2841, 0x1e08: 0x2849, 0x1e09: 0x2851, 0x1e0a: 0x2859, 0x1e0b: 0x2861,
+	0x1e0c: 0x2869, 0x1e0d: 0x2871, 0x1e0e: 0x2879, 0x1e0f: 0x2881, 0x1e10: 0x2889, 0x1e11: 0x2891,
+	0x1e12: 0x2899, 0x1e13: 0x28a1, 0x1e14: 0x28a9, 0x1e15: 0x28b1, 0x1e16: 0x28b9, 0x1e17: 0x28c1,
+	0x1e18: 0x28c9, 0x1e19: 0x8c35, 0x1e1a: 0x28d1, 0x1e1b: 0x28d9, 0x1e1c: 0x28e1, 0x1e1d: 0x24d9,
+	0x1e1e: 0x28e9, 0x1e1f: 0x28f1, 0x1e20: 0x8c55, 0x1e21: 0x8c75, 0x1e22: 0x28f9, 0x1e23: 0x2901,
+	0x1e24: 0x2909, 0x1e25: 0x2911, 0x1e26: 0x2919, 0x1e27: 0x2921, 0x1e28: 0x2040, 0x1e29: 0x2929,
+	0x1e2a: 0x2931, 0x1e2b: 0x2931, 0x1e2c: 0x8c95, 0x1e2d: 0x2939, 0x1e2e: 0x2941, 0x1e2f: 0x2949,
+	0x1e30: 0x2951, 0x1e31: 0x8cb5, 0x1e32: 0x2959, 0x1e33: 0x2961, 0x1e34: 0x2040, 0x1e35: 0x2969,
+	0x1e36: 0x2971, 0x1e37: 0x2979, 0x1e38: 0x2981, 0x1e39: 0x2989, 0x1e3a: 0x2991, 0x1e3b: 0x8cd5,
+	0x1e3c: 0x2999, 0x1e3d: 0x8cf5, 0x1e3e: 0x29a1, 0x1e3f: 0x29a9,
 	// Block 0x79, offset 0x1e40
-	0x1e40: 0xcb61, 0x1e41: 0xcb81, 0x1e42: 0xcba1, 0x1e43: 0x8b55, 0x1e44: 0xcbc1, 0x1e45: 0xcbe1,
-	0x1e46: 0xcc01, 0x1e47: 0xcc21, 0x1e48: 0xcc41, 0x1e49: 0xcc61, 0x1e4a: 0xcc81, 0x1e4b: 0xcca1,
-	0x1e4c: 0xccc1, 0x1e4d: 0x8b75, 0x1e4e: 0xcce1, 0x1e4f: 0xcd01, 0x1e50: 0xcd21, 0x1e51: 0xcd41,
-	0x1e52: 0x8b95, 0x1e53: 0xcd61, 0x1e54: 0xcd81, 0x1e55: 0xc491, 0x1e56: 0x8bb5, 0x1e57: 0xcda1,
-	0x1e58: 0xcdc1, 0x1e59: 0xcde1, 0x1e5a: 0xce01, 0x1e5b: 0xce21, 0x1e5c: 0x8bd5, 0x1e5d: 0xce41,
-	0x1e5e: 0xce61, 0x1e5f: 0xce81, 0x1e60: 0xcea1, 0x1e61: 0xcec1, 0x1e62: 0xc7f1, 0x1e63: 0xcee1,
-	0x1e64: 0xcf01, 0x1e65: 0xcf21, 0x1e66: 0xcf41, 0x1e67: 0xcf61, 0x1e68: 0xcf81, 0x1e69: 0xcfa1,
-	0x1e6a: 0xcfc1, 0x1e6b: 0xcfe1, 0x1e6c: 0xd001, 0x1e6d: 0xd021, 0x1e6e: 0xd041, 0x1e6f: 0xd061,
-	0x1e70: 0xd081, 0x1e71: 0xd0a1, 0x1e72: 0xd0a1, 0x1e73: 0xd0a1, 0x1e74: 0x8bf5, 0x1e75: 0xd0c1,
-	0x1e76: 0xd0e1, 0x1e77: 0xd101, 0x1e78: 0x8c15, 0x1e79: 0xd121, 0x1e7a: 0xd141, 0x1e7b: 0xd161,
-	0x1e7c: 0xd181, 0x1e7d: 0xd1a1, 0x1e7e: 0xd1c1, 0x1e7f: 0xd1e1,
+	0x1e40: 0x29b1, 0x1e41: 0x29b9, 0x1e42: 0x29c1, 0x1e43: 0x29c9, 0x1e44: 0x29d1, 0x1e45: 0x29d9,
+	0x1e46: 0x29e1, 0x1e47: 0x29e9, 0x1e48: 0x29f1, 0x1e49: 0x8d15, 0x1e4a: 0x29f9, 0x1e4b: 0x2a01,
+	0x1e4c: 0x2a09, 0x1e4d: 0x2a11, 0x1e4e: 0x2a19, 0x1e4f: 0x8d35, 0x1e50: 0x2a21, 0x1e51: 0x8d55,
+	0x1e52: 0x8d75, 0x1e53: 0x2a29, 0x1e54: 0x2a31, 0x1e55: 0x2a31, 0x1e56: 0x2a39, 0x1e57: 0x8d95,
+	0x1e58: 0x8db5, 0x1e59: 0x2a41, 0x1e5a: 0x2a49, 0x1e5b: 0x2a51, 0x1e5c: 0x2a59, 0x1e5d: 0x2a61,
+	0x1e5e: 0x2a69, 0x1e5f: 0x2a71, 0x1e60: 0x2a79, 0x1e61: 0x2a81, 0x1e62: 0x2a89, 0x1e63: 0x2a91,
+	0x1e64: 0x8dd5, 0x1e65: 0x2a99, 0x1e66: 0x2aa1, 0x1e67: 0x2aa9, 0x1e68: 0x2ab1, 0x1e69: 0x2aa9,
+	0x1e6a: 0x2ab9, 0x1e6b: 0x2ac1, 0x1e6c: 0x2ac9, 0x1e6d: 0x2ad1, 0x1e6e: 0x2ad9, 0x1e6f: 0x2ae1,
+	0x1e70: 0x2ae9, 0x1e71: 0x2af1, 0x1e72: 0x2af9, 0x1e73: 0x2b01, 0x1e74: 0x2b09, 0x1e75: 0x2b11,
+	0x1e76: 0x2b19, 0x1e77: 0x2b21, 0x1e78: 0x8df5, 0x1e79: 0x2b29, 0x1e7a: 0x2b31, 0x1e7b: 0x2b39,
+	0x1e7c: 0x2b41, 0x1e7d: 0x2b49, 0x1e7e: 0x8e15, 0x1e7f: 0x2b51,
 	// Block 0x7a, offset 0x1e80
-	0x1e80: 0xd201, 0x1e81: 0xd221, 0x1e82: 0xd241, 0x1e83: 0xd261, 0x1e84: 0xd281, 0x1e85: 0xd2a1,
-	0x1e86: 0xd2a1, 0x1e87: 0xd2c1, 0x1e88: 0xd2e1, 0x1e89: 0xd301, 0x1e8a: 0xd321, 0x1e8b: 0xd341,
-	0x1e8c: 0xd361, 0x1e8d: 0xd381, 0x1e8e: 0xd3a1, 0x1e8f: 0xd3c1, 0x1e90: 0xd3e1, 0x1e91: 0xd401,
-	0x1e92: 0xd421, 0x1e93: 0xd441, 0x1e94: 0xd461, 0x1e95: 0xd481, 0x1e96: 0xd4a1, 0x1e97: 0xd4c1,
-	0x1e98: 0xd4e1, 0x1e99: 0x8c35, 0x1e9a: 0xd501, 0x1e9b: 0xd521, 0x1e9c: 0xd541, 0x1e9d: 0xc371,
-	0x1e9e: 0xd561, 0x1e9f: 0xd581, 0x1ea0: 0x8c55, 0x1ea1: 0x8c75, 0x1ea2: 0xd5a1, 0x1ea3: 0xd5c1,
-	0x1ea4: 0xd5e1, 0x1ea5: 0xd601, 0x1ea6: 0xd621, 0x1ea7: 0xd641, 0x1ea8: 0x2040, 0x1ea9: 0xd661,
-	0x1eaa: 0xd681, 0x1eab: 0xd681, 0x1eac: 0x8c95, 0x1ead: 0xd6a1, 0x1eae: 0xd6c1, 0x1eaf: 0xd6e1,
-	0x1eb0: 0xd701, 0x1eb1: 0x8cb5, 0x1eb2: 0xd721, 0x1eb3: 0xd741, 0x1eb4: 0x2040, 0x1eb5: 0xd761,
-	0x1eb6: 0xd781, 0x1eb7: 0xd7a1, 0x1eb8: 0xd7c1, 0x1eb9: 0xd7e1, 0x1eba: 0xd801, 0x1ebb: 0x8cd5,
-	0x1ebc: 0xd821, 0x1ebd: 0x8cf5, 0x1ebe: 0xd841, 0x1ebf: 0xd861,
+	0x1e80: 0x2b59, 0x1e81: 0x2b61, 0x1e82: 0x2b69, 0x1e83: 0x2b71, 0x1e84: 0x2b79, 0x1e85: 0x2b81,
+	0x1e86: 0x2b89, 0x1e87: 0x2b91, 0x1e88: 0x2b99, 0x1e89: 0x2ba1, 0x1e8a: 0x8e35, 0x1e8b: 0x2ba9,
+	0x1e8c: 0x2bb1, 0x1e8d: 0x2bb9, 0x1e8e: 0x2bc1, 0x1e8f: 0x2bc9, 0x1e90: 0x2bd1, 0x1e91: 0x2bd9,
+	0x1e92: 0x2be1, 0x1e93: 0x2be9, 0x1e94: 0x2bf1, 0x1e95: 0x2bf9, 0x1e96: 0x2c01, 0x1e97: 0x2c09,
+	0x1e98: 0x2c11, 0x1e99: 0x2c19, 0x1e9a: 0x2c21, 0x1e9b: 0x2c29, 0x1e9c: 0x2c31, 0x1e9d: 0x8e55,
+	0x1e9e: 0x2c39, 0x1e9f: 0x2c41, 0x1ea0: 0x2c49, 0x1ea1: 0x2c51, 0x1ea2: 0x2c59, 0x1ea3: 0x8e75,
+	0x1ea4: 0x2c61, 0x1ea5: 0x2c69, 0x1ea6: 0x2c71, 0x1ea7: 0x2c79, 0x1ea8: 0x2c81, 0x1ea9: 0x2c89,
+	0x1eaa: 0x2c91, 0x1eab: 0x2c99, 0x1eac: 0x7f0d, 0x1ead: 0x2ca1, 0x1eae: 0x2ca9, 0x1eaf: 0x2cb1,
+	0x1eb0: 0x8e95, 0x1eb1: 0x2cb9, 0x1eb2: 0x2cc1, 0x1eb3: 0x2cc9, 0x1eb4: 0x2cd1, 0x1eb5: 0x2cd9,
+	0x1eb6: 0x2ce1, 0x1eb7: 0x8eb5, 0x1eb8: 0x8ed5, 0x1eb9: 0x8ef5, 0x1eba: 0x2ce9, 0x1ebb: 0x8f15,
+	0x1ebc: 0x2cf1, 0x1ebd: 0x2cf9, 0x1ebe: 0x2d01, 0x1ebf: 0x2d09,
 	// Block 0x7b, offset 0x1ec0
-	0x1ec0: 0xd881, 0x1ec1: 0xd8a1, 0x1ec2: 0xd8c1, 0x1ec3: 0xd8e1, 0x1ec4: 0xd901, 0x1ec5: 0xd921,
-	0x1ec6: 0xd941, 0x1ec7: 0xd961, 0x1ec8: 0xd981, 0x1ec9: 0x8d15, 0x1eca: 0xd9a1, 0x1ecb: 0xd9c1,
-	0x1ecc: 0xd9e1, 0x1ecd: 0xda01, 0x1ece: 0xda21, 0x1ecf: 0x8d35, 0x1ed0: 0xda41, 0x1ed1: 0x8d55,
-	0x1ed2: 0x8d75, 0x1ed3: 0xda61, 0x1ed4: 0xda81, 0x1ed5: 0xda81, 0x1ed6: 0xdaa1, 0x1ed7: 0x8d95,
-	0x1ed8: 0x8db5, 0x1ed9: 0xdac1, 0x1eda: 0xdae1, 0x1edb: 0xdb01, 0x1edc: 0xdb21, 0x1edd: 0xdb41,
-	0x1ede: 0xdb61, 0x1edf: 0xdb81, 0x1ee0: 0xdba1, 0x1ee1: 0xdbc1, 0x1ee2: 0xdbe1, 0x1ee3: 0xdc01,
-	0x1ee4: 0x8dd5, 0x1ee5: 0xdc21, 0x1ee6: 0xdc41, 0x1ee7: 0xdc61, 0x1ee8: 0xdc81, 0x1ee9: 0xdc61,
-	0x1eea: 0xdca1, 0x1eeb: 0xdcc1, 0x1eec: 0xdce1, 0x1eed: 0xdd01, 0x1eee: 0xdd21, 0x1eef: 0xdd41,
-	0x1ef0: 0xdd61, 0x1ef1: 0xdd81, 0x1ef2: 0xdda1, 0x1ef3: 0xddc1, 0x1ef4: 0xdde1, 0x1ef5: 0xde01,
-	0x1ef6: 0xde21, 0x1ef7: 0xde41, 0x1ef8: 0x8df5, 0x1ef9: 0xde61, 0x1efa: 0xde81, 0x1efb: 0xdea1,
-	0x1efc: 0xdec1, 0x1efd: 0xdee1, 0x1efe: 0x8e15, 0x1eff: 0xdf01,
+	0x1ec0: 0x2d11, 0x1ec1: 0x2d19, 0x1ec2: 0x2d21, 0x1ec3: 0x2d29, 0x1ec4: 0x2d31, 0x1ec5: 0x2d39,
+	0x1ec6: 0x8f35, 0x1ec7: 0x2d41, 0x1ec8: 0x2d49, 0x1ec9: 0x2d51, 0x1eca: 0x2d59, 0x1ecb: 0x2d61,
+	0x1ecc: 0x2d69, 0x1ecd: 0x8f55, 0x1ece: 0x2d71, 0x1ecf: 0x2d79, 0x1ed0: 0x8f75, 0x1ed1: 0x8f95,
+	0x1ed2: 0x2d81, 0x1ed3: 0x2d89, 0x1ed4: 0x2d91, 0x1ed5: 0x2d99, 0x1ed6: 0x2da1, 0x1ed7: 0x2da9,
+	0x1ed8: 0x2db1, 0x1ed9: 0x2db9, 0x1eda: 0x2dc1, 0x1edb: 0x8fb5, 0x1edc: 0x2dc9, 0x1edd: 0x8fd5,
+	0x1ede: 0x2dd1, 0x1edf: 0x2040, 0x1ee0: 0x2dd9, 0x1ee1: 0x2de1, 0x1ee2: 0x2de9, 0x1ee3: 0x8ff5,
+	0x1ee4: 0x2df1, 0x1ee5: 0x2df9, 0x1ee6: 0x9015, 0x1ee7: 0x9035, 0x1ee8: 0x2e01, 0x1ee9: 0x2e09,
+	0x1eea: 0x2e11, 0x1eeb: 0x2e19, 0x1eec: 0x2e21, 0x1eed: 0x2e21, 0x1eee: 0x2e29, 0x1eef: 0x2e31,
+	0x1ef0: 0x2e39, 0x1ef1: 0x2e41, 0x1ef2: 0x2e49, 0x1ef3: 0x2e51, 0x1ef4: 0x2e59, 0x1ef5: 0x9055,
+	0x1ef6: 0x2e61, 0x1ef7: 0x9075, 0x1ef8: 0x2e69, 0x1ef9: 0x9095, 0x1efa: 0x2e71, 0x1efb: 0x90b5,
+	0x1efc: 0x90d5, 0x1efd: 0x90f5, 0x1efe: 0x2e79, 0x1eff: 0x2e81,
 	// Block 0x7c, offset 0x1f00
-	0x1f00: 0xe601, 0x1f01: 0xe621, 0x1f02: 0xe641, 0x1f03: 0xe661, 0x1f04: 0xe681, 0x1f05: 0xe6a1,
-	0x1f06: 0x8f35, 0x1f07: 0xe6c1, 0x1f08: 0xe6e1, 0x1f09: 0xe701, 0x1f0a: 0xe721, 0x1f0b: 0xe741,
-	0x1f0c: 0xe761, 0x1f0d: 0x8f55, 0x1f0e: 0xe781, 0x1f0f: 0xe7a1, 0x1f10: 0x8f75, 0x1f11: 0x8f95,
-	0x1f12: 0xe7c1, 0x1f13: 0xe7e1, 0x1f14: 0xe801, 0x1f15: 0xe821, 0x1f16: 0xe841, 0x1f17: 0xe861,
-	0x1f18: 0xe881, 0x1f19: 0xe8a1, 0x1f1a: 0xe8c1, 0x1f1b: 0x8fb5, 0x1f1c: 0xe8e1, 0x1f1d: 0x8fd5,
-	0x1f1e: 0xe901, 0x1f1f: 0x2040, 0x1f20: 0xe921, 0x1f21: 0xe941, 0x1f22: 0xe961, 0x1f23: 0x8ff5,
-	0x1f24: 0xe981, 0x1f25: 0xe9a1, 0x1f26: 0x9015, 0x1f27: 0x9035, 0x1f28: 0xe9c1, 0x1f29: 0xe9e1,
-	0x1f2a: 0xea01, 0x1f2b: 0xea21, 0x1f2c: 0xea41, 0x1f2d: 0xea41, 0x1f2e: 0xea61, 0x1f2f: 0xea81,
-	0x1f30: 0xeaa1, 0x1f31: 0xeac1, 0x1f32: 0xeae1, 0x1f33: 0xeb01, 0x1f34: 0xeb21, 0x1f35: 0x9055,
-	0x1f36: 0xeb41, 0x1f37: 0x9075, 0x1f38: 0xeb61, 0x1f39: 0x9095, 0x1f3a: 0xeb81, 0x1f3b: 0x90b5,
-	0x1f3c: 0x90d5, 0x1f3d: 0x90f5, 0x1f3e: 0xeba1, 0x1f3f: 0xebc1,
+	0x1f00: 0x2e89, 0x1f01: 0x9115, 0x1f02: 0x9135, 0x1f03: 0x9155, 0x1f04: 0x9175, 0x1f05: 0x2e91,
+	0x1f06: 0x2e99, 0x1f07: 0x2e99, 0x1f08: 0x2ea1, 0x1f09: 0x2ea9, 0x1f0a: 0x2eb1, 0x1f0b: 0x2eb9,
+	0x1f0c: 0x2ec1, 0x1f0d: 0x9195, 0x1f0e: 0x2ec9, 0x1f0f: 0x2ed1, 0x1f10: 0x2ed9, 0x1f11: 0x2ee1,
+	0x1f12: 0x91b5, 0x1f13: 0x2ee9, 0x1f14: 0x91d5, 0x1f15: 0x91f5, 0x1f16: 0x2ef1, 0x1f17: 0x2ef9,
+	0x1f18: 0x2f01, 0x1f19: 0x2f09, 0x1f1a: 0x2f11, 0x1f1b: 0x2f19, 0x1f1c: 0x9215, 0x1f1d: 0x9235,
+	0x1f1e: 0x9255, 0x1f1f: 0x2040, 0x1f20: 0x2f21, 0x1f21: 0x9275, 0x1f22: 0x2f29, 0x1f23: 0x2f31,
+	0x1f24: 0x2f39, 0x1f25: 0x9295, 0x1f26: 0x2f41, 0x1f27: 0x2f49, 0x1f28: 0x2f51, 0x1f29: 0x2f59,
+	0x1f2a: 0x2f61, 0x1f2b: 0x92b5, 0x1f2c: 0x2f69, 0x1f2d: 0x2f71, 0x1f2e: 0x2f79, 0x1f2f: 0x2f81,
+	0x1f30: 0x2f89, 0x1f31: 0x2f91, 0x1f32: 0x92d5, 0x1f33: 0x92f5, 0x1f34: 0x2f99, 0x1f35: 0x9315,
+	0x1f36: 0x2fa1, 0x1f37: 0x9335, 0x1f38: 0x2fa9, 0x1f39: 0x2fb1, 0x1f3a: 0x2fb9, 0x1f3b: 0x9355,
+	0x1f3c: 0x9375, 0x1f3d: 0x2fc1, 0x1f3e: 0x9395, 0x1f3f: 0x2fc9,
 	// Block 0x7d, offset 0x1f40
-	0x1f40: 0xebe1, 0x1f41: 0x9115, 0x1f42: 0x9135, 0x1f43: 0x9155, 0x1f44: 0x9175, 0x1f45: 0xec01,
-	0x1f46: 0xec21, 0x1f47: 0xec21, 0x1f48: 0xec41, 0x1f49: 0xec61, 0x1f4a: 0xec81, 0x1f4b: 0xeca1,
-	0x1f4c: 0xecc1, 0x1f4d: 0x9195, 0x1f4e: 0xece1, 0x1f4f: 0xed01, 0x1f50: 0xed21, 0x1f51: 0xed41,
-	0x1f52: 0x91b5, 0x1f53: 0xed61, 0x1f54: 0x91d5, 0x1f55: 0x91f5, 0x1f56: 0xed81, 0x1f57: 0xeda1,
-	0x1f58: 0xedc1, 0x1f59: 0xede1, 0x1f5a: 0xee01, 0x1f5b: 0xee21, 0x1f5c: 0x9215, 0x1f5d: 0x9235,
-	0x1f5e: 0x9255, 0x1f5f: 0x2040, 0x1f60: 0xee41, 0x1f61: 0x9275, 0x1f62: 0xee61, 0x1f63: 0xee81,
-	0x1f64: 0xeea1, 0x1f65: 0x9295, 0x1f66: 0xeec1, 0x1f67: 0xeee1, 0x1f68: 0xef01, 0x1f69: 0xef21,
-	0x1f6a: 0xef41, 0x1f6b: 0x92b5, 0x1f6c: 0xef61, 0x1f6d: 0xef81, 0x1f6e: 0xefa1, 0x1f6f: 0xefc1,
-	0x1f70: 0xefe1, 0x1f71: 0xf001, 0x1f72: 0x92d5, 0x1f73: 0x92f5, 0x1f74: 0xf021, 0x1f75: 0x9315,
-	0x1f76: 0xf041, 0x1f77: 0x9335, 0x1f78: 0xf061, 0x1f79: 0xf081, 0x1f7a: 0xf0a1, 0x1f7b: 0x9355,
-	0x1f7c: 0x9375, 0x1f7d: 0xf0c1, 0x1f7e: 0x9395, 0x1f7f: 0xf0e1,
+	0x1f40: 0x93b5, 0x1f41: 0x2fd1, 0x1f42: 0x2fd9, 0x1f43: 0x2fe1, 0x1f44: 0x2fe9, 0x1f45: 0x2ff1,
+	0x1f46: 0x2ff9, 0x1f47: 0x93d5, 0x1f48: 0x93f5, 0x1f49: 0x9415, 0x1f4a: 0x9435, 0x1f4b: 0x2a29,
+	0x1f4c: 0x3001, 0x1f4d: 0x3009, 0x1f4e: 0x3011, 0x1f4f: 0x3019, 0x1f50: 0x3021, 0x1f51: 0x3029,
+	0x1f52: 0x3031, 0x1f53: 0x3039, 0x1f54: 0x3041, 0x1f55: 0x3049, 0x1f56: 0x3051, 0x1f57: 0x9455,
+	0x1f58: 0x3059, 0x1f59: 0x3061, 0x1f5a: 0x3069, 0x1f5b: 0x3071, 0x1f5c: 0x3079, 0x1f5d: 0x3081,
+	0x1f5e: 0x3089, 0x1f5f: 0x3091, 0x1f60: 0x3099, 0x1f61: 0x30a1, 0x1f62: 0x30a9, 0x1f63: 0x30b1,
+	0x1f64: 0x9475, 0x1f65: 0x9495, 0x1f66: 0x94b5, 0x1f67: 0x30b9, 0x1f68: 0x30c1, 0x1f69: 0x30c9,
+	0x1f6a: 0x30d1, 0x1f6b: 0x94d5, 0x1f6c: 0x30d9, 0x1f6d: 0x94f5, 0x1f6e: 0x30e1, 0x1f6f: 0x30e9,
+	0x1f70: 0x9515, 0x1f71: 0x9535, 0x1f72: 0x30f1, 0x1f73: 0x30f9, 0x1f74: 0x3101, 0x1f75: 0x3109,
+	0x1f76: 0x3111, 0x1f77: 0x3119, 0x1f78: 0x3121, 0x1f79: 0x3129, 0x1f7a: 0x3131, 0x1f7b: 0x3139,
+	0x1f7c: 0x3141, 0x1f7d: 0x3149, 0x1f7e: 0x3151, 0x1f7f: 0x2040,
 	// Block 0x7e, offset 0x1f80
-	0x1f80: 0xf721, 0x1f81: 0xf741, 0x1f82: 0xf761, 0x1f83: 0xf781, 0x1f84: 0xf7a1, 0x1f85: 0x9555,
-	0x1f86: 0xf7c1, 0x1f87: 0xf7e1, 0x1f88: 0xf801, 0x1f89: 0xf821, 0x1f8a: 0xf841, 0x1f8b: 0x9575,
-	0x1f8c: 0x9595, 0x1f8d: 0xf861, 0x1f8e: 0xf881, 0x1f8f: 0xf8a1, 0x1f90: 0xf8c1, 0x1f91: 0xf8e1,
-	0x1f92: 0xf901, 0x1f93: 0x95b5, 0x1f94: 0xf921, 0x1f95: 0xf941, 0x1f96: 0xf961, 0x1f97: 0xf981,
-	0x1f98: 0x95d5, 0x1f99: 0x95f5, 0x1f9a: 0xf9a1, 0x1f9b: 0xf9c1, 0x1f9c: 0xf9e1, 0x1f9d: 0x9615,
-	0x1f9e: 0xfa01, 0x1f9f: 0xfa21, 0x1fa0: 0x684d, 0x1fa1: 0x9635, 0x1fa2: 0xfa41, 0x1fa3: 0xfa61,
-	0x1fa4: 0xfa81, 0x1fa5: 0x9655, 0x1fa6: 0xfaa1, 0x1fa7: 0xfac1, 0x1fa8: 0xfae1, 0x1fa9: 0xfb01,
-	0x1faa: 0xfb21, 0x1fab: 0xfb41, 0x1fac: 0xfb61, 0x1fad: 0x9675, 0x1fae: 0xfb81, 0x1faf: 0xfba1,
-	0x1fb0: 0xfbc1, 0x1fb1: 0x9695, 0x1fb2: 0xfbe1, 0x1fb3: 0xfc01, 0x1fb4: 0xfc21, 0x1fb5: 0xfc41,
-	0x1fb6: 0x7b6d, 0x1fb7: 0x96b5, 0x1fb8: 0xfc61, 0x1fb9: 0xfc81, 0x1fba: 0xfca1, 0x1fbb: 0x96d5,
-	0x1fbc: 0xfcc1, 0x1fbd: 0x96f5, 0x1fbe: 0xfce1, 0x1fbf: 0xfce1,
+	0x1f80: 0x3159, 0x1f81: 0x3161, 0x1f82: 0x3169, 0x1f83: 0x3171, 0x1f84: 0x3179, 0x1f85: 0x9555,
+	0x1f86: 0x3181, 0x1f87: 0x3189, 0x1f88: 0x3191, 0x1f89: 0x3199, 0x1f8a: 0x31a1, 0x1f8b: 0x9575,
+	0x1f8c: 0x9595, 0x1f8d: 0x31a9, 0x1f8e: 0x31b1, 0x1f8f: 0x31b9, 0x1f90: 0x31c1, 0x1f91: 0x31c9,
+	0x1f92: 0x31d1, 0x1f93: 0x95b5, 0x1f94: 0x31d9, 0x1f95: 0x31e1, 0x1f96: 0x31e9, 0x1f97: 0x31f1,
+	0x1f98: 0x95d5, 0x1f99: 0x95f5, 0x1f9a: 0x31f9, 0x1f9b: 0x3201, 0x1f9c: 0x3209, 0x1f9d: 0x9615,
+	0x1f9e: 0x3211, 0x1f9f: 0x3219, 0x1fa0: 0x684d, 0x1fa1: 0x9635, 0x1fa2: 0x3221, 0x1fa3: 0x3229,
+	0x1fa4: 0x3231, 0x1fa5: 0x9655, 0x1fa6: 0x3239, 0x1fa7: 0x3241, 0x1fa8: 0x3249, 0x1fa9: 0x3251,
+	0x1faa: 0x3259, 0x1fab: 0x3261, 0x1fac: 0x3269, 0x1fad: 0x9675, 0x1fae: 0x3271, 0x1faf: 0x3279,
+	0x1fb0: 0x3281, 0x1fb1: 0x9695, 0x1fb2: 0x3289, 0x1fb3: 0x3291, 0x1fb4: 0x3299, 0x1fb5: 0x32a1,
+	0x1fb6: 0x7b6d, 0x1fb7: 0x96b5, 0x1fb8: 0x32a9, 0x1fb9: 0x32b1, 0x1fba: 0x32b9, 0x1fbb: 0x96d5,
+	0x1fbc: 0x32c1, 0x1fbd: 0x96f5, 0x1fbe: 0x32c9, 0x1fbf: 0x32c9,
 	// Block 0x7f, offset 0x1fc0
-	0x1fc0: 0xfd01, 0x1fc1: 0x9715, 0x1fc2: 0xfd21, 0x1fc3: 0xfd41, 0x1fc4: 0xfd61, 0x1fc5: 0xfd81,
-	0x1fc6: 0xfda1, 0x1fc7: 0xfdc1, 0x1fc8: 0xfde1, 0x1fc9: 0x9735, 0x1fca: 0xfe01, 0x1fcb: 0xfe21,
-	0x1fcc: 0xfe41, 0x1fcd: 0xfe61, 0x1fce: 0xfe81, 0x1fcf: 0xfea1, 0x1fd0: 0x9755, 0x1fd1: 0xfec1,
-	0x1fd2: 0x9775, 0x1fd3: 0x9795, 0x1fd4: 0x97b5, 0x1fd5: 0xfee1, 0x1fd6: 0xff01, 0x1fd7: 0xff21,
-	0x1fd8: 0xff41, 0x1fd9: 0xff61, 0x1fda: 0xff81, 0x1fdb: 0xffa1, 0x1fdc: 0xffc1, 0x1fdd: 0x97d5,
+	0x1fc0: 0x32d1, 0x1fc1: 0x9715, 0x1fc2: 0x32d9, 0x1fc3: 0x32e1, 0x1fc4: 0x32e9, 0x1fc5: 0x32f1,
+	0x1fc6: 0x32f9, 0x1fc7: 0x3301, 0x1fc8: 0x3309, 0x1fc9: 0x9735, 0x1fca: 0x3311, 0x1fcb: 0x3319,
+	0x1fcc: 0x3321, 0x1fcd: 0x3329, 0x1fce: 0x3331, 0x1fcf: 0x3339, 0x1fd0: 0x9755, 0x1fd1: 0x3341,
+	0x1fd2: 0x9775, 0x1fd3: 0x9795, 0x1fd4: 0x97b5, 0x1fd5: 0x3349, 0x1fd6: 0x3351, 0x1fd7: 0x3359,
+	0x1fd8: 0x3361, 0x1fd9: 0x3369, 0x1fda: 0x3371, 0x1fdb: 0x3379, 0x1fdc: 0x3381, 0x1fdd: 0x97d5,
 	0x1fde: 0x0040, 0x1fdf: 0x0040, 0x1fe0: 0x0040, 0x1fe1: 0x0040, 0x1fe2: 0x0040, 0x1fe3: 0x0040,
 	0x1fe4: 0x0040, 0x1fe5: 0x0040, 0x1fe6: 0x0040, 0x1fe7: 0x0040, 0x1fe8: 0x0040, 0x1fe9: 0x0040,
 	0x1fea: 0x0040, 0x1feb: 0x0040, 0x1fec: 0x0040, 0x1fed: 0x0040, 0x1fee: 0x0040, 0x1fef: 0x0040,
@@ -2134,7 +2277,7 @@
 	0x1b8: 0xd6, 0x1b9: 0xd7, 0x1ba: 0xd8, 0x1bb: 0xd9, 0x1bc: 0xda, 0x1bd: 0xdb, 0x1be: 0xdc, 0x1bf: 0x37,
 	// Block 0x7, offset 0x1c0
 	0x1c0: 0x38, 0x1c1: 0xdd, 0x1c2: 0xde, 0x1c3: 0xdf, 0x1c4: 0xe0, 0x1c5: 0x39, 0x1c6: 0x3a, 0x1c7: 0xe1,
-	0x1c8: 0xe2, 0x1c9: 0x3b, 0x1ca: 0x3c, 0x1cb: 0x3d, 0x1cc: 0x3e, 0x1cd: 0x3f, 0x1ce: 0x40, 0x1cf: 0x41,
+	0x1c8: 0xe2, 0x1c9: 0x3b, 0x1ca: 0x3c, 0x1cb: 0x3d, 0x1cc: 0xe3, 0x1cd: 0xe4, 0x1ce: 0x3e, 0x1cf: 0x3f,
 	0x1d0: 0xa0, 0x1d1: 0xa0, 0x1d2: 0xa0, 0x1d3: 0xa0, 0x1d4: 0xa0, 0x1d5: 0xa0, 0x1d6: 0xa0, 0x1d7: 0xa0,
 	0x1d8: 0xa0, 0x1d9: 0xa0, 0x1da: 0xa0, 0x1db: 0xa0, 0x1dc: 0xa0, 0x1dd: 0xa0, 0x1de: 0xa0, 0x1df: 0xa0,
 	0x1e0: 0xa0, 0x1e1: 0xa0, 0x1e2: 0xa0, 0x1e3: 0xa0, 0x1e4: 0xa0, 0x1e5: 0xa0, 0x1e6: 0xa0, 0x1e7: 0xa0,
@@ -2167,143 +2310,143 @@
 	0x2a0: 0xa0, 0x2a1: 0xa0, 0x2a2: 0xa0, 0x2a3: 0xa0, 0x2a4: 0xa0, 0x2a5: 0xa0, 0x2a6: 0xa0, 0x2a7: 0xa0,
 	0x2a8: 0xa0, 0x2a9: 0xa0, 0x2aa: 0xa0, 0x2ab: 0xa0, 0x2ac: 0xa0, 0x2ad: 0xa0, 0x2ae: 0xa0, 0x2af: 0xa0,
 	0x2b0: 0xa0, 0x2b1: 0xa0, 0x2b2: 0xa0, 0x2b3: 0xa0, 0x2b4: 0xa0, 0x2b5: 0xa0, 0x2b6: 0xa0, 0x2b7: 0xa0,
-	0x2b8: 0xa0, 0x2b9: 0xa0, 0x2ba: 0xa0, 0x2bb: 0xa0, 0x2bc: 0xa0, 0x2bd: 0xa0, 0x2be: 0xa0, 0x2bf: 0xe3,
+	0x2b8: 0xa0, 0x2b9: 0xa0, 0x2ba: 0xa0, 0x2bb: 0xa0, 0x2bc: 0xa0, 0x2bd: 0xa0, 0x2be: 0xa0, 0x2bf: 0xe5,
 	// Block 0xb, offset 0x2c0
 	0x2c0: 0xa0, 0x2c1: 0xa0, 0x2c2: 0xa0, 0x2c3: 0xa0, 0x2c4: 0xa0, 0x2c5: 0xa0, 0x2c6: 0xa0, 0x2c7: 0xa0,
 	0x2c8: 0xa0, 0x2c9: 0xa0, 0x2ca: 0xa0, 0x2cb: 0xa0, 0x2cc: 0xa0, 0x2cd: 0xa0, 0x2ce: 0xa0, 0x2cf: 0xa0,
-	0x2d0: 0xa0, 0x2d1: 0xa0, 0x2d2: 0xe4, 0x2d3: 0xe5, 0x2d4: 0xa0, 0x2d5: 0xa0, 0x2d6: 0xa0, 0x2d7: 0xa0,
-	0x2d8: 0xe6, 0x2d9: 0x42, 0x2da: 0x43, 0x2db: 0xe7, 0x2dc: 0x44, 0x2dd: 0x45, 0x2de: 0x46, 0x2df: 0xe8,
-	0x2e0: 0xe9, 0x2e1: 0xea, 0x2e2: 0xeb, 0x2e3: 0xec, 0x2e4: 0xed, 0x2e5: 0xee, 0x2e6: 0xef, 0x2e7: 0xf0,
-	0x2e8: 0xf1, 0x2e9: 0xf2, 0x2ea: 0xf3, 0x2eb: 0xf4, 0x2ec: 0xf5, 0x2ed: 0xf6, 0x2ee: 0xf7, 0x2ef: 0xf8,
+	0x2d0: 0xa0, 0x2d1: 0xa0, 0x2d2: 0xe6, 0x2d3: 0xe7, 0x2d4: 0xa0, 0x2d5: 0xa0, 0x2d6: 0xa0, 0x2d7: 0xa0,
+	0x2d8: 0xe8, 0x2d9: 0x40, 0x2da: 0x41, 0x2db: 0xe9, 0x2dc: 0x42, 0x2dd: 0x43, 0x2de: 0x44, 0x2df: 0xea,
+	0x2e0: 0xeb, 0x2e1: 0xec, 0x2e2: 0xed, 0x2e3: 0xee, 0x2e4: 0xef, 0x2e5: 0xf0, 0x2e6: 0xf1, 0x2e7: 0xf2,
+	0x2e8: 0xf3, 0x2e9: 0xf4, 0x2ea: 0xf5, 0x2eb: 0xf6, 0x2ec: 0xf7, 0x2ed: 0xf8, 0x2ee: 0xf9, 0x2ef: 0xfa,
 	0x2f0: 0xa0, 0x2f1: 0xa0, 0x2f2: 0xa0, 0x2f3: 0xa0, 0x2f4: 0xa0, 0x2f5: 0xa0, 0x2f6: 0xa0, 0x2f7: 0xa0,
 	0x2f8: 0xa0, 0x2f9: 0xa0, 0x2fa: 0xa0, 0x2fb: 0xa0, 0x2fc: 0xa0, 0x2fd: 0xa0, 0x2fe: 0xa0, 0x2ff: 0xa0,
 	// Block 0xc, offset 0x300
 	0x300: 0xa0, 0x301: 0xa0, 0x302: 0xa0, 0x303: 0xa0, 0x304: 0xa0, 0x305: 0xa0, 0x306: 0xa0, 0x307: 0xa0,
 	0x308: 0xa0, 0x309: 0xa0, 0x30a: 0xa0, 0x30b: 0xa0, 0x30c: 0xa0, 0x30d: 0xa0, 0x30e: 0xa0, 0x30f: 0xa0,
 	0x310: 0xa0, 0x311: 0xa0, 0x312: 0xa0, 0x313: 0xa0, 0x314: 0xa0, 0x315: 0xa0, 0x316: 0xa0, 0x317: 0xa0,
-	0x318: 0xa0, 0x319: 0xa0, 0x31a: 0xa0, 0x31b: 0xa0, 0x31c: 0xa0, 0x31d: 0xa0, 0x31e: 0xf9, 0x31f: 0xfa,
+	0x318: 0xa0, 0x319: 0xa0, 0x31a: 0xa0, 0x31b: 0xa0, 0x31c: 0xa0, 0x31d: 0xa0, 0x31e: 0xfb, 0x31f: 0xfc,
 	// Block 0xd, offset 0x340
-	0x340: 0xfb, 0x341: 0xfb, 0x342: 0xfb, 0x343: 0xfb, 0x344: 0xfb, 0x345: 0xfb, 0x346: 0xfb, 0x347: 0xfb,
-	0x348: 0xfb, 0x349: 0xfb, 0x34a: 0xfb, 0x34b: 0xfb, 0x34c: 0xfb, 0x34d: 0xfb, 0x34e: 0xfb, 0x34f: 0xfb,
-	0x350: 0xfb, 0x351: 0xfb, 0x352: 0xfb, 0x353: 0xfb, 0x354: 0xfb, 0x355: 0xfb, 0x356: 0xfb, 0x357: 0xfb,
-	0x358: 0xfb, 0x359: 0xfb, 0x35a: 0xfb, 0x35b: 0xfb, 0x35c: 0xfb, 0x35d: 0xfb, 0x35e: 0xfb, 0x35f: 0xfb,
-	0x360: 0xfb, 0x361: 0xfb, 0x362: 0xfb, 0x363: 0xfb, 0x364: 0xfb, 0x365: 0xfb, 0x366: 0xfb, 0x367: 0xfb,
-	0x368: 0xfb, 0x369: 0xfb, 0x36a: 0xfb, 0x36b: 0xfb, 0x36c: 0xfb, 0x36d: 0xfb, 0x36e: 0xfb, 0x36f: 0xfb,
-	0x370: 0xfb, 0x371: 0xfb, 0x372: 0xfb, 0x373: 0xfb, 0x374: 0xfb, 0x375: 0xfb, 0x376: 0xfb, 0x377: 0xfb,
-	0x378: 0xfb, 0x379: 0xfb, 0x37a: 0xfb, 0x37b: 0xfb, 0x37c: 0xfb, 0x37d: 0xfb, 0x37e: 0xfb, 0x37f: 0xfb,
+	0x340: 0xfd, 0x341: 0xfd, 0x342: 0xfd, 0x343: 0xfd, 0x344: 0xfd, 0x345: 0xfd, 0x346: 0xfd, 0x347: 0xfd,
+	0x348: 0xfd, 0x349: 0xfd, 0x34a: 0xfd, 0x34b: 0xfd, 0x34c: 0xfd, 0x34d: 0xfd, 0x34e: 0xfd, 0x34f: 0xfd,
+	0x350: 0xfd, 0x351: 0xfd, 0x352: 0xfd, 0x353: 0xfd, 0x354: 0xfd, 0x355: 0xfd, 0x356: 0xfd, 0x357: 0xfd,
+	0x358: 0xfd, 0x359: 0xfd, 0x35a: 0xfd, 0x35b: 0xfd, 0x35c: 0xfd, 0x35d: 0xfd, 0x35e: 0xfd, 0x35f: 0xfd,
+	0x360: 0xfd, 0x361: 0xfd, 0x362: 0xfd, 0x363: 0xfd, 0x364: 0xfd, 0x365: 0xfd, 0x366: 0xfd, 0x367: 0xfd,
+	0x368: 0xfd, 0x369: 0xfd, 0x36a: 0xfd, 0x36b: 0xfd, 0x36c: 0xfd, 0x36d: 0xfd, 0x36e: 0xfd, 0x36f: 0xfd,
+	0x370: 0xfd, 0x371: 0xfd, 0x372: 0xfd, 0x373: 0xfd, 0x374: 0xfd, 0x375: 0xfd, 0x376: 0xfd, 0x377: 0xfd,
+	0x378: 0xfd, 0x379: 0xfd, 0x37a: 0xfd, 0x37b: 0xfd, 0x37c: 0xfd, 0x37d: 0xfd, 0x37e: 0xfd, 0x37f: 0xfd,
 	// Block 0xe, offset 0x380
-	0x380: 0xfb, 0x381: 0xfb, 0x382: 0xfb, 0x383: 0xfb, 0x384: 0xfb, 0x385: 0xfb, 0x386: 0xfb, 0x387: 0xfb,
-	0x388: 0xfb, 0x389: 0xfb, 0x38a: 0xfb, 0x38b: 0xfb, 0x38c: 0xfb, 0x38d: 0xfb, 0x38e: 0xfb, 0x38f: 0xfb,
-	0x390: 0xfb, 0x391: 0xfb, 0x392: 0xfb, 0x393: 0xfb, 0x394: 0xfb, 0x395: 0xfb, 0x396: 0xfb, 0x397: 0xfb,
-	0x398: 0xfb, 0x399: 0xfb, 0x39a: 0xfb, 0x39b: 0xfb, 0x39c: 0xfb, 0x39d: 0xfb, 0x39e: 0xfb, 0x39f: 0xfb,
-	0x3a0: 0xfb, 0x3a1: 0xfb, 0x3a2: 0xfb, 0x3a3: 0xfb, 0x3a4: 0xfc, 0x3a5: 0xfd, 0x3a6: 0xfe, 0x3a7: 0xff,
-	0x3a8: 0x47, 0x3a9: 0x100, 0x3aa: 0x101, 0x3ab: 0x48, 0x3ac: 0x49, 0x3ad: 0x4a, 0x3ae: 0x4b, 0x3af: 0x4c,
-	0x3b0: 0x102, 0x3b1: 0x4d, 0x3b2: 0x4e, 0x3b3: 0x4f, 0x3b4: 0x50, 0x3b5: 0x51, 0x3b6: 0x103, 0x3b7: 0x52,
-	0x3b8: 0x53, 0x3b9: 0x54, 0x3ba: 0x55, 0x3bb: 0x56, 0x3bc: 0x57, 0x3bd: 0x58, 0x3be: 0x59, 0x3bf: 0x5a,
+	0x380: 0xfd, 0x381: 0xfd, 0x382: 0xfd, 0x383: 0xfd, 0x384: 0xfd, 0x385: 0xfd, 0x386: 0xfd, 0x387: 0xfd,
+	0x388: 0xfd, 0x389: 0xfd, 0x38a: 0xfd, 0x38b: 0xfd, 0x38c: 0xfd, 0x38d: 0xfd, 0x38e: 0xfd, 0x38f: 0xfd,
+	0x390: 0xfd, 0x391: 0xfd, 0x392: 0xfd, 0x393: 0xfd, 0x394: 0xfd, 0x395: 0xfd, 0x396: 0xfd, 0x397: 0xfd,
+	0x398: 0xfd, 0x399: 0xfd, 0x39a: 0xfd, 0x39b: 0xfd, 0x39c: 0xfd, 0x39d: 0xfd, 0x39e: 0xfd, 0x39f: 0xfd,
+	0x3a0: 0xfd, 0x3a1: 0xfd, 0x3a2: 0xfd, 0x3a3: 0xfd, 0x3a4: 0xfe, 0x3a5: 0xff, 0x3a6: 0x100, 0x3a7: 0x101,
+	0x3a8: 0x45, 0x3a9: 0x102, 0x3aa: 0x103, 0x3ab: 0x46, 0x3ac: 0x47, 0x3ad: 0x48, 0x3ae: 0x49, 0x3af: 0x4a,
+	0x3b0: 0x104, 0x3b1: 0x4b, 0x3b2: 0x4c, 0x3b3: 0x4d, 0x3b4: 0x4e, 0x3b5: 0x4f, 0x3b6: 0x105, 0x3b7: 0x50,
+	0x3b8: 0x51, 0x3b9: 0x52, 0x3ba: 0x53, 0x3bb: 0x54, 0x3bc: 0x55, 0x3bd: 0x56, 0x3be: 0x57, 0x3bf: 0x58,
 	// Block 0xf, offset 0x3c0
-	0x3c0: 0x104, 0x3c1: 0x105, 0x3c2: 0xa0, 0x3c3: 0x106, 0x3c4: 0x107, 0x3c5: 0x9c, 0x3c6: 0x108, 0x3c7: 0x109,
-	0x3c8: 0xfb, 0x3c9: 0xfb, 0x3ca: 0x10a, 0x3cb: 0x10b, 0x3cc: 0x10c, 0x3cd: 0x10d, 0x3ce: 0x10e, 0x3cf: 0x10f,
-	0x3d0: 0x110, 0x3d1: 0xa0, 0x3d2: 0x111, 0x3d3: 0x112, 0x3d4: 0x113, 0x3d5: 0x114, 0x3d6: 0xfb, 0x3d7: 0xfb,
-	0x3d8: 0xa0, 0x3d9: 0xa0, 0x3da: 0xa0, 0x3db: 0xa0, 0x3dc: 0x115, 0x3dd: 0x116, 0x3de: 0xfb, 0x3df: 0xfb,
-	0x3e0: 0x117, 0x3e1: 0x118, 0x3e2: 0x119, 0x3e3: 0x11a, 0x3e4: 0x11b, 0x3e5: 0xfb, 0x3e6: 0x11c, 0x3e7: 0x11d,
-	0x3e8: 0x11e, 0x3e9: 0x11f, 0x3ea: 0x120, 0x3eb: 0x5b, 0x3ec: 0x121, 0x3ed: 0x122, 0x3ee: 0x5c, 0x3ef: 0xfb,
-	0x3f0: 0x123, 0x3f1: 0x124, 0x3f2: 0x125, 0x3f3: 0x126, 0x3f4: 0x127, 0x3f5: 0xfb, 0x3f6: 0xfb, 0x3f7: 0xfb,
-	0x3f8: 0xfb, 0x3f9: 0x128, 0x3fa: 0x129, 0x3fb: 0xfb, 0x3fc: 0x12a, 0x3fd: 0x12b, 0x3fe: 0x12c, 0x3ff: 0x12d,
+	0x3c0: 0x106, 0x3c1: 0x107, 0x3c2: 0xa0, 0x3c3: 0x108, 0x3c4: 0x109, 0x3c5: 0x9c, 0x3c6: 0x10a, 0x3c7: 0x10b,
+	0x3c8: 0xfd, 0x3c9: 0xfd, 0x3ca: 0x10c, 0x3cb: 0x10d, 0x3cc: 0x10e, 0x3cd: 0x10f, 0x3ce: 0x110, 0x3cf: 0x111,
+	0x3d0: 0x112, 0x3d1: 0xa0, 0x3d2: 0x113, 0x3d3: 0x114, 0x3d4: 0x115, 0x3d5: 0x116, 0x3d6: 0xfd, 0x3d7: 0xfd,
+	0x3d8: 0xa0, 0x3d9: 0xa0, 0x3da: 0xa0, 0x3db: 0xa0, 0x3dc: 0x117, 0x3dd: 0x118, 0x3de: 0xfd, 0x3df: 0xfd,
+	0x3e0: 0x119, 0x3e1: 0x11a, 0x3e2: 0x11b, 0x3e3: 0x11c, 0x3e4: 0x11d, 0x3e5: 0xfd, 0x3e6: 0x11e, 0x3e7: 0x11f,
+	0x3e8: 0x120, 0x3e9: 0x121, 0x3ea: 0x122, 0x3eb: 0x59, 0x3ec: 0x123, 0x3ed: 0x124, 0x3ee: 0x5a, 0x3ef: 0xfd,
+	0x3f0: 0x125, 0x3f1: 0x126, 0x3f2: 0x127, 0x3f3: 0x128, 0x3f4: 0x129, 0x3f5: 0xfd, 0x3f6: 0xfd, 0x3f7: 0xfd,
+	0x3f8: 0xfd, 0x3f9: 0x12a, 0x3fa: 0x12b, 0x3fb: 0xfd, 0x3fc: 0x12c, 0x3fd: 0x12d, 0x3fe: 0x12e, 0x3ff: 0x12f,
 	// Block 0x10, offset 0x400
-	0x400: 0x12e, 0x401: 0x12f, 0x402: 0x130, 0x403: 0x131, 0x404: 0x132, 0x405: 0x133, 0x406: 0x134, 0x407: 0x135,
-	0x408: 0x136, 0x409: 0xfb, 0x40a: 0x137, 0x40b: 0x138, 0x40c: 0x5d, 0x40d: 0x5e, 0x40e: 0xfb, 0x40f: 0xfb,
-	0x410: 0x139, 0x411: 0x13a, 0x412: 0x13b, 0x413: 0x13c, 0x414: 0xfb, 0x415: 0xfb, 0x416: 0x13d, 0x417: 0x13e,
-	0x418: 0x13f, 0x419: 0x140, 0x41a: 0x141, 0x41b: 0x142, 0x41c: 0x143, 0x41d: 0xfb, 0x41e: 0xfb, 0x41f: 0xfb,
-	0x420: 0x144, 0x421: 0xfb, 0x422: 0x145, 0x423: 0x146, 0x424: 0x5f, 0x425: 0x147, 0x426: 0x148, 0x427: 0x149,
-	0x428: 0x14a, 0x429: 0x14b, 0x42a: 0x14c, 0x42b: 0x14d, 0x42c: 0xfb, 0x42d: 0xfb, 0x42e: 0xfb, 0x42f: 0xfb,
-	0x430: 0x14e, 0x431: 0x14f, 0x432: 0x150, 0x433: 0xfb, 0x434: 0x151, 0x435: 0x152, 0x436: 0x153, 0x437: 0xfb,
-	0x438: 0xfb, 0x439: 0xfb, 0x43a: 0xfb, 0x43b: 0x154, 0x43c: 0xfb, 0x43d: 0xfb, 0x43e: 0x155, 0x43f: 0x156,
+	0x400: 0x130, 0x401: 0x131, 0x402: 0x132, 0x403: 0x133, 0x404: 0x134, 0x405: 0x135, 0x406: 0x136, 0x407: 0x137,
+	0x408: 0x138, 0x409: 0xfd, 0x40a: 0x139, 0x40b: 0x13a, 0x40c: 0x5b, 0x40d: 0x5c, 0x40e: 0xfd, 0x40f: 0xfd,
+	0x410: 0x13b, 0x411: 0x13c, 0x412: 0x13d, 0x413: 0x13e, 0x414: 0xfd, 0x415: 0xfd, 0x416: 0x13f, 0x417: 0x140,
+	0x418: 0x141, 0x419: 0x142, 0x41a: 0x143, 0x41b: 0x144, 0x41c: 0x145, 0x41d: 0xfd, 0x41e: 0xfd, 0x41f: 0xfd,
+	0x420: 0x146, 0x421: 0xfd, 0x422: 0x147, 0x423: 0x148, 0x424: 0x5d, 0x425: 0x149, 0x426: 0x14a, 0x427: 0x14b,
+	0x428: 0x14c, 0x429: 0x14d, 0x42a: 0x14e, 0x42b: 0x14f, 0x42c: 0xfd, 0x42d: 0xfd, 0x42e: 0xfd, 0x42f: 0xfd,
+	0x430: 0x150, 0x431: 0x151, 0x432: 0x152, 0x433: 0xfd, 0x434: 0x153, 0x435: 0x154, 0x436: 0x155, 0x437: 0xfd,
+	0x438: 0xfd, 0x439: 0xfd, 0x43a: 0xfd, 0x43b: 0x156, 0x43c: 0xfd, 0x43d: 0xfd, 0x43e: 0x157, 0x43f: 0x158,
 	// Block 0x11, offset 0x440
 	0x440: 0xa0, 0x441: 0xa0, 0x442: 0xa0, 0x443: 0xa0, 0x444: 0xa0, 0x445: 0xa0, 0x446: 0xa0, 0x447: 0xa0,
-	0x448: 0xa0, 0x449: 0xa0, 0x44a: 0xa0, 0x44b: 0xa0, 0x44c: 0xa0, 0x44d: 0xa0, 0x44e: 0x157, 0x44f: 0xfb,
-	0x450: 0x9c, 0x451: 0x158, 0x452: 0xa0, 0x453: 0xa0, 0x454: 0xa0, 0x455: 0x159, 0x456: 0xfb, 0x457: 0xfb,
-	0x458: 0xfb, 0x459: 0xfb, 0x45a: 0xfb, 0x45b: 0xfb, 0x45c: 0xfb, 0x45d: 0xfb, 0x45e: 0xfb, 0x45f: 0xfb,
-	0x460: 0xfb, 0x461: 0xfb, 0x462: 0xfb, 0x463: 0xfb, 0x464: 0xfb, 0x465: 0xfb, 0x466: 0xfb, 0x467: 0xfb,
-	0x468: 0xfb, 0x469: 0xfb, 0x46a: 0xfb, 0x46b: 0xfb, 0x46c: 0xfb, 0x46d: 0xfb, 0x46e: 0xfb, 0x46f: 0xfb,
-	0x470: 0xfb, 0x471: 0xfb, 0x472: 0xfb, 0x473: 0xfb, 0x474: 0xfb, 0x475: 0xfb, 0x476: 0xfb, 0x477: 0xfb,
-	0x478: 0xfb, 0x479: 0xfb, 0x47a: 0xfb, 0x47b: 0xfb, 0x47c: 0xfb, 0x47d: 0xfb, 0x47e: 0xfb, 0x47f: 0xfb,
+	0x448: 0xa0, 0x449: 0xa0, 0x44a: 0xa0, 0x44b: 0xa0, 0x44c: 0xa0, 0x44d: 0xa0, 0x44e: 0x159, 0x44f: 0xfd,
+	0x450: 0x9c, 0x451: 0x15a, 0x452: 0xa0, 0x453: 0xa0, 0x454: 0xa0, 0x455: 0x15b, 0x456: 0xfd, 0x457: 0xfd,
+	0x458: 0xfd, 0x459: 0xfd, 0x45a: 0xfd, 0x45b: 0xfd, 0x45c: 0xfd, 0x45d: 0xfd, 0x45e: 0xfd, 0x45f: 0xfd,
+	0x460: 0xfd, 0x461: 0xfd, 0x462: 0xfd, 0x463: 0xfd, 0x464: 0xfd, 0x465: 0xfd, 0x466: 0xfd, 0x467: 0xfd,
+	0x468: 0xfd, 0x469: 0xfd, 0x46a: 0xfd, 0x46b: 0xfd, 0x46c: 0xfd, 0x46d: 0xfd, 0x46e: 0xfd, 0x46f: 0xfd,
+	0x470: 0xfd, 0x471: 0xfd, 0x472: 0xfd, 0x473: 0xfd, 0x474: 0xfd, 0x475: 0xfd, 0x476: 0xfd, 0x477: 0xfd,
+	0x478: 0xfd, 0x479: 0xfd, 0x47a: 0xfd, 0x47b: 0xfd, 0x47c: 0xfd, 0x47d: 0xfd, 0x47e: 0xfd, 0x47f: 0xfd,
 	// Block 0x12, offset 0x480
 	0x480: 0xa0, 0x481: 0xa0, 0x482: 0xa0, 0x483: 0xa0, 0x484: 0xa0, 0x485: 0xa0, 0x486: 0xa0, 0x487: 0xa0,
 	0x488: 0xa0, 0x489: 0xa0, 0x48a: 0xa0, 0x48b: 0xa0, 0x48c: 0xa0, 0x48d: 0xa0, 0x48e: 0xa0, 0x48f: 0xa0,
-	0x490: 0x15a, 0x491: 0xfb, 0x492: 0xfb, 0x493: 0xfb, 0x494: 0xfb, 0x495: 0xfb, 0x496: 0xfb, 0x497: 0xfb,
-	0x498: 0xfb, 0x499: 0xfb, 0x49a: 0xfb, 0x49b: 0xfb, 0x49c: 0xfb, 0x49d: 0xfb, 0x49e: 0xfb, 0x49f: 0xfb,
-	0x4a0: 0xfb, 0x4a1: 0xfb, 0x4a2: 0xfb, 0x4a3: 0xfb, 0x4a4: 0xfb, 0x4a5: 0xfb, 0x4a6: 0xfb, 0x4a7: 0xfb,
-	0x4a8: 0xfb, 0x4a9: 0xfb, 0x4aa: 0xfb, 0x4ab: 0xfb, 0x4ac: 0xfb, 0x4ad: 0xfb, 0x4ae: 0xfb, 0x4af: 0xfb,
-	0x4b0: 0xfb, 0x4b1: 0xfb, 0x4b2: 0xfb, 0x4b3: 0xfb, 0x4b4: 0xfb, 0x4b5: 0xfb, 0x4b6: 0xfb, 0x4b7: 0xfb,
-	0x4b8: 0xfb, 0x4b9: 0xfb, 0x4ba: 0xfb, 0x4bb: 0xfb, 0x4bc: 0xfb, 0x4bd: 0xfb, 0x4be: 0xfb, 0x4bf: 0xfb,
+	0x490: 0x15c, 0x491: 0xfd, 0x492: 0xfd, 0x493: 0xfd, 0x494: 0xfd, 0x495: 0xfd, 0x496: 0xfd, 0x497: 0xfd,
+	0x498: 0xfd, 0x499: 0xfd, 0x49a: 0xfd, 0x49b: 0xfd, 0x49c: 0xfd, 0x49d: 0xfd, 0x49e: 0xfd, 0x49f: 0xfd,
+	0x4a0: 0xfd, 0x4a1: 0xfd, 0x4a2: 0xfd, 0x4a3: 0xfd, 0x4a4: 0xfd, 0x4a5: 0xfd, 0x4a6: 0xfd, 0x4a7: 0xfd,
+	0x4a8: 0xfd, 0x4a9: 0xfd, 0x4aa: 0xfd, 0x4ab: 0xfd, 0x4ac: 0xfd, 0x4ad: 0xfd, 0x4ae: 0xfd, 0x4af: 0xfd,
+	0x4b0: 0xfd, 0x4b1: 0xfd, 0x4b2: 0xfd, 0x4b3: 0xfd, 0x4b4: 0xfd, 0x4b5: 0xfd, 0x4b6: 0xfd, 0x4b7: 0xfd,
+	0x4b8: 0xfd, 0x4b9: 0xfd, 0x4ba: 0xfd, 0x4bb: 0xfd, 0x4bc: 0xfd, 0x4bd: 0xfd, 0x4be: 0xfd, 0x4bf: 0xfd,
 	// Block 0x13, offset 0x4c0
-	0x4c0: 0xfb, 0x4c1: 0xfb, 0x4c2: 0xfb, 0x4c3: 0xfb, 0x4c4: 0xfb, 0x4c5: 0xfb, 0x4c6: 0xfb, 0x4c7: 0xfb,
-	0x4c8: 0xfb, 0x4c9: 0xfb, 0x4ca: 0xfb, 0x4cb: 0xfb, 0x4cc: 0xfb, 0x4cd: 0xfb, 0x4ce: 0xfb, 0x4cf: 0xfb,
+	0x4c0: 0xfd, 0x4c1: 0xfd, 0x4c2: 0xfd, 0x4c3: 0xfd, 0x4c4: 0xfd, 0x4c5: 0xfd, 0x4c6: 0xfd, 0x4c7: 0xfd,
+	0x4c8: 0xfd, 0x4c9: 0xfd, 0x4ca: 0xfd, 0x4cb: 0xfd, 0x4cc: 0xfd, 0x4cd: 0xfd, 0x4ce: 0xfd, 0x4cf: 0xfd,
 	0x4d0: 0xa0, 0x4d1: 0xa0, 0x4d2: 0xa0, 0x4d3: 0xa0, 0x4d4: 0xa0, 0x4d5: 0xa0, 0x4d6: 0xa0, 0x4d7: 0xa0,
-	0x4d8: 0xa0, 0x4d9: 0x15b, 0x4da: 0xfb, 0x4db: 0xfb, 0x4dc: 0xfb, 0x4dd: 0xfb, 0x4de: 0xfb, 0x4df: 0xfb,
-	0x4e0: 0xfb, 0x4e1: 0xfb, 0x4e2: 0xfb, 0x4e3: 0xfb, 0x4e4: 0xfb, 0x4e5: 0xfb, 0x4e6: 0xfb, 0x4e7: 0xfb,
-	0x4e8: 0xfb, 0x4e9: 0xfb, 0x4ea: 0xfb, 0x4eb: 0xfb, 0x4ec: 0xfb, 0x4ed: 0xfb, 0x4ee: 0xfb, 0x4ef: 0xfb,
-	0x4f0: 0xfb, 0x4f1: 0xfb, 0x4f2: 0xfb, 0x4f3: 0xfb, 0x4f4: 0xfb, 0x4f5: 0xfb, 0x4f6: 0xfb, 0x4f7: 0xfb,
-	0x4f8: 0xfb, 0x4f9: 0xfb, 0x4fa: 0xfb, 0x4fb: 0xfb, 0x4fc: 0xfb, 0x4fd: 0xfb, 0x4fe: 0xfb, 0x4ff: 0xfb,
+	0x4d8: 0xa0, 0x4d9: 0x15d, 0x4da: 0xfd, 0x4db: 0xfd, 0x4dc: 0xfd, 0x4dd: 0xfd, 0x4de: 0xfd, 0x4df: 0xfd,
+	0x4e0: 0xfd, 0x4e1: 0xfd, 0x4e2: 0xfd, 0x4e3: 0xfd, 0x4e4: 0xfd, 0x4e5: 0xfd, 0x4e6: 0xfd, 0x4e7: 0xfd,
+	0x4e8: 0xfd, 0x4e9: 0xfd, 0x4ea: 0xfd, 0x4eb: 0xfd, 0x4ec: 0xfd, 0x4ed: 0xfd, 0x4ee: 0xfd, 0x4ef: 0xfd,
+	0x4f0: 0xfd, 0x4f1: 0xfd, 0x4f2: 0xfd, 0x4f3: 0xfd, 0x4f4: 0xfd, 0x4f5: 0xfd, 0x4f6: 0xfd, 0x4f7: 0xfd,
+	0x4f8: 0xfd, 0x4f9: 0xfd, 0x4fa: 0xfd, 0x4fb: 0xfd, 0x4fc: 0xfd, 0x4fd: 0xfd, 0x4fe: 0xfd, 0x4ff: 0xfd,
 	// Block 0x14, offset 0x500
-	0x500: 0xfb, 0x501: 0xfb, 0x502: 0xfb, 0x503: 0xfb, 0x504: 0xfb, 0x505: 0xfb, 0x506: 0xfb, 0x507: 0xfb,
-	0x508: 0xfb, 0x509: 0xfb, 0x50a: 0xfb, 0x50b: 0xfb, 0x50c: 0xfb, 0x50d: 0xfb, 0x50e: 0xfb, 0x50f: 0xfb,
-	0x510: 0xfb, 0x511: 0xfb, 0x512: 0xfb, 0x513: 0xfb, 0x514: 0xfb, 0x515: 0xfb, 0x516: 0xfb, 0x517: 0xfb,
-	0x518: 0xfb, 0x519: 0xfb, 0x51a: 0xfb, 0x51b: 0xfb, 0x51c: 0xfb, 0x51d: 0xfb, 0x51e: 0xfb, 0x51f: 0xfb,
+	0x500: 0xfd, 0x501: 0xfd, 0x502: 0xfd, 0x503: 0xfd, 0x504: 0xfd, 0x505: 0xfd, 0x506: 0xfd, 0x507: 0xfd,
+	0x508: 0xfd, 0x509: 0xfd, 0x50a: 0xfd, 0x50b: 0xfd, 0x50c: 0xfd, 0x50d: 0xfd, 0x50e: 0xfd, 0x50f: 0xfd,
+	0x510: 0xfd, 0x511: 0xfd, 0x512: 0xfd, 0x513: 0xfd, 0x514: 0xfd, 0x515: 0xfd, 0x516: 0xfd, 0x517: 0xfd,
+	0x518: 0xfd, 0x519: 0xfd, 0x51a: 0xfd, 0x51b: 0xfd, 0x51c: 0xfd, 0x51d: 0xfd, 0x51e: 0xfd, 0x51f: 0xfd,
 	0x520: 0xa0, 0x521: 0xa0, 0x522: 0xa0, 0x523: 0xa0, 0x524: 0xa0, 0x525: 0xa0, 0x526: 0xa0, 0x527: 0xa0,
-	0x528: 0x14d, 0x529: 0x15c, 0x52a: 0xfb, 0x52b: 0x15d, 0x52c: 0x15e, 0x52d: 0x15f, 0x52e: 0x160, 0x52f: 0xfb,
-	0x530: 0xfb, 0x531: 0xfb, 0x532: 0xfb, 0x533: 0xfb, 0x534: 0xfb, 0x535: 0xfb, 0x536: 0xfb, 0x537: 0xfb,
-	0x538: 0xfb, 0x539: 0x161, 0x53a: 0x162, 0x53b: 0xfb, 0x53c: 0xa0, 0x53d: 0x163, 0x53e: 0x164, 0x53f: 0x165,
+	0x528: 0x14f, 0x529: 0x15e, 0x52a: 0xfd, 0x52b: 0x15f, 0x52c: 0x160, 0x52d: 0x161, 0x52e: 0x162, 0x52f: 0xfd,
+	0x530: 0xfd, 0x531: 0xfd, 0x532: 0xfd, 0x533: 0xfd, 0x534: 0xfd, 0x535: 0xfd, 0x536: 0xfd, 0x537: 0xfd,
+	0x538: 0xfd, 0x539: 0x163, 0x53a: 0x164, 0x53b: 0xfd, 0x53c: 0xa0, 0x53d: 0x165, 0x53e: 0x166, 0x53f: 0x167,
 	// Block 0x15, offset 0x540
 	0x540: 0xa0, 0x541: 0xa0, 0x542: 0xa0, 0x543: 0xa0, 0x544: 0xa0, 0x545: 0xa0, 0x546: 0xa0, 0x547: 0xa0,
 	0x548: 0xa0, 0x549: 0xa0, 0x54a: 0xa0, 0x54b: 0xa0, 0x54c: 0xa0, 0x54d: 0xa0, 0x54e: 0xa0, 0x54f: 0xa0,
 	0x550: 0xa0, 0x551: 0xa0, 0x552: 0xa0, 0x553: 0xa0, 0x554: 0xa0, 0x555: 0xa0, 0x556: 0xa0, 0x557: 0xa0,
-	0x558: 0xa0, 0x559: 0xa0, 0x55a: 0xa0, 0x55b: 0xa0, 0x55c: 0xa0, 0x55d: 0xa0, 0x55e: 0xa0, 0x55f: 0x166,
+	0x558: 0xa0, 0x559: 0xa0, 0x55a: 0xa0, 0x55b: 0xa0, 0x55c: 0xa0, 0x55d: 0xa0, 0x55e: 0xa0, 0x55f: 0x168,
 	0x560: 0xa0, 0x561: 0xa0, 0x562: 0xa0, 0x563: 0xa0, 0x564: 0xa0, 0x565: 0xa0, 0x566: 0xa0, 0x567: 0xa0,
 	0x568: 0xa0, 0x569: 0xa0, 0x56a: 0xa0, 0x56b: 0xa0, 0x56c: 0xa0, 0x56d: 0xa0, 0x56e: 0xa0, 0x56f: 0xa0,
-	0x570: 0xa0, 0x571: 0xa0, 0x572: 0xa0, 0x573: 0x167, 0x574: 0x168, 0x575: 0xfb, 0x576: 0xfb, 0x577: 0xfb,
-	0x578: 0xfb, 0x579: 0xfb, 0x57a: 0xfb, 0x57b: 0xfb, 0x57c: 0xfb, 0x57d: 0xfb, 0x57e: 0xfb, 0x57f: 0xfb,
+	0x570: 0xa0, 0x571: 0xa0, 0x572: 0xa0, 0x573: 0x169, 0x574: 0x16a, 0x575: 0xfd, 0x576: 0xfd, 0x577: 0xfd,
+	0x578: 0xfd, 0x579: 0xfd, 0x57a: 0xfd, 0x57b: 0xfd, 0x57c: 0xfd, 0x57d: 0xfd, 0x57e: 0xfd, 0x57f: 0xfd,
 	// Block 0x16, offset 0x580
-	0x580: 0xa0, 0x581: 0xa0, 0x582: 0xa0, 0x583: 0xa0, 0x584: 0x169, 0x585: 0x16a, 0x586: 0xa0, 0x587: 0xa0,
-	0x588: 0xa0, 0x589: 0xa0, 0x58a: 0xa0, 0x58b: 0x16b, 0x58c: 0xfb, 0x58d: 0xfb, 0x58e: 0xfb, 0x58f: 0xfb,
-	0x590: 0xfb, 0x591: 0xfb, 0x592: 0xfb, 0x593: 0xfb, 0x594: 0xfb, 0x595: 0xfb, 0x596: 0xfb, 0x597: 0xfb,
-	0x598: 0xfb, 0x599: 0xfb, 0x59a: 0xfb, 0x59b: 0xfb, 0x59c: 0xfb, 0x59d: 0xfb, 0x59e: 0xfb, 0x59f: 0xfb,
-	0x5a0: 0xfb, 0x5a1: 0xfb, 0x5a2: 0xfb, 0x5a3: 0xfb, 0x5a4: 0xfb, 0x5a5: 0xfb, 0x5a6: 0xfb, 0x5a7: 0xfb,
-	0x5a8: 0xfb, 0x5a9: 0xfb, 0x5aa: 0xfb, 0x5ab: 0xfb, 0x5ac: 0xfb, 0x5ad: 0xfb, 0x5ae: 0xfb, 0x5af: 0xfb,
-	0x5b0: 0xa0, 0x5b1: 0x16c, 0x5b2: 0x16d, 0x5b3: 0xfb, 0x5b4: 0xfb, 0x5b5: 0xfb, 0x5b6: 0xfb, 0x5b7: 0xfb,
-	0x5b8: 0xfb, 0x5b9: 0xfb, 0x5ba: 0xfb, 0x5bb: 0xfb, 0x5bc: 0xfb, 0x5bd: 0xfb, 0x5be: 0xfb, 0x5bf: 0xfb,
+	0x580: 0xa0, 0x581: 0xa0, 0x582: 0xa0, 0x583: 0xa0, 0x584: 0x16b, 0x585: 0x16c, 0x586: 0xa0, 0x587: 0xa0,
+	0x588: 0xa0, 0x589: 0xa0, 0x58a: 0xa0, 0x58b: 0x16d, 0x58c: 0xfd, 0x58d: 0xfd, 0x58e: 0xfd, 0x58f: 0xfd,
+	0x590: 0xfd, 0x591: 0xfd, 0x592: 0xfd, 0x593: 0xfd, 0x594: 0xfd, 0x595: 0xfd, 0x596: 0xfd, 0x597: 0xfd,
+	0x598: 0xfd, 0x599: 0xfd, 0x59a: 0xfd, 0x59b: 0xfd, 0x59c: 0xfd, 0x59d: 0xfd, 0x59e: 0xfd, 0x59f: 0xfd,
+	0x5a0: 0xfd, 0x5a1: 0xfd, 0x5a2: 0xfd, 0x5a3: 0xfd, 0x5a4: 0xfd, 0x5a5: 0xfd, 0x5a6: 0xfd, 0x5a7: 0xfd,
+	0x5a8: 0xfd, 0x5a9: 0xfd, 0x5aa: 0xfd, 0x5ab: 0xfd, 0x5ac: 0xfd, 0x5ad: 0xfd, 0x5ae: 0xfd, 0x5af: 0xfd,
+	0x5b0: 0xa0, 0x5b1: 0x16e, 0x5b2: 0x16f, 0x5b3: 0xfd, 0x5b4: 0xfd, 0x5b5: 0xfd, 0x5b6: 0xfd, 0x5b7: 0xfd,
+	0x5b8: 0xfd, 0x5b9: 0xfd, 0x5ba: 0xfd, 0x5bb: 0xfd, 0x5bc: 0xfd, 0x5bd: 0xfd, 0x5be: 0xfd, 0x5bf: 0xfd,
 	// Block 0x17, offset 0x5c0
-	0x5c0: 0x9c, 0x5c1: 0x9c, 0x5c2: 0x9c, 0x5c3: 0x16e, 0x5c4: 0x16f, 0x5c5: 0x170, 0x5c6: 0x171, 0x5c7: 0x172,
-	0x5c8: 0x9c, 0x5c9: 0x173, 0x5ca: 0xfb, 0x5cb: 0x174, 0x5cc: 0x9c, 0x5cd: 0x175, 0x5ce: 0xfb, 0x5cf: 0xfb,
-	0x5d0: 0x60, 0x5d1: 0x61, 0x5d2: 0x62, 0x5d3: 0x63, 0x5d4: 0x64, 0x5d5: 0x65, 0x5d6: 0x66, 0x5d7: 0x67,
-	0x5d8: 0x68, 0x5d9: 0x69, 0x5da: 0x6a, 0x5db: 0x6b, 0x5dc: 0x6c, 0x5dd: 0x6d, 0x5de: 0x6e, 0x5df: 0x6f,
+	0x5c0: 0x9c, 0x5c1: 0x9c, 0x5c2: 0x9c, 0x5c3: 0x170, 0x5c4: 0x171, 0x5c5: 0x172, 0x5c6: 0x173, 0x5c7: 0x174,
+	0x5c8: 0x9c, 0x5c9: 0x175, 0x5ca: 0xfd, 0x5cb: 0x176, 0x5cc: 0x9c, 0x5cd: 0x177, 0x5ce: 0xfd, 0x5cf: 0xfd,
+	0x5d0: 0x5e, 0x5d1: 0x5f, 0x5d2: 0x60, 0x5d3: 0x61, 0x5d4: 0x62, 0x5d5: 0x63, 0x5d6: 0x64, 0x5d7: 0x65,
+	0x5d8: 0x66, 0x5d9: 0x67, 0x5da: 0x68, 0x5db: 0x69, 0x5dc: 0x6a, 0x5dd: 0x6b, 0x5de: 0x6c, 0x5df: 0x6d,
 	0x5e0: 0x9c, 0x5e1: 0x9c, 0x5e2: 0x9c, 0x5e3: 0x9c, 0x5e4: 0x9c, 0x5e5: 0x9c, 0x5e6: 0x9c, 0x5e7: 0x9c,
-	0x5e8: 0x176, 0x5e9: 0x177, 0x5ea: 0x178, 0x5eb: 0xfb, 0x5ec: 0xfb, 0x5ed: 0xfb, 0x5ee: 0xfb, 0x5ef: 0xfb,
-	0x5f0: 0xfb, 0x5f1: 0xfb, 0x5f2: 0xfb, 0x5f3: 0xfb, 0x5f4: 0xfb, 0x5f5: 0xfb, 0x5f6: 0xfb, 0x5f7: 0xfb,
-	0x5f8: 0xfb, 0x5f9: 0xfb, 0x5fa: 0xfb, 0x5fb: 0xfb, 0x5fc: 0xfb, 0x5fd: 0xfb, 0x5fe: 0xfb, 0x5ff: 0xfb,
+	0x5e8: 0x178, 0x5e9: 0x179, 0x5ea: 0x17a, 0x5eb: 0xfd, 0x5ec: 0xfd, 0x5ed: 0xfd, 0x5ee: 0xfd, 0x5ef: 0xfd,
+	0x5f0: 0xfd, 0x5f1: 0xfd, 0x5f2: 0xfd, 0x5f3: 0xfd, 0x5f4: 0xfd, 0x5f5: 0xfd, 0x5f6: 0xfd, 0x5f7: 0xfd,
+	0x5f8: 0xfd, 0x5f9: 0xfd, 0x5fa: 0xfd, 0x5fb: 0xfd, 0x5fc: 0xfd, 0x5fd: 0xfd, 0x5fe: 0xfd, 0x5ff: 0xfd,
 	// Block 0x18, offset 0x600
-	0x600: 0x179, 0x601: 0xfb, 0x602: 0xfb, 0x603: 0xfb, 0x604: 0x17a, 0x605: 0x17b, 0x606: 0xfb, 0x607: 0xfb,
-	0x608: 0xfb, 0x609: 0xfb, 0x60a: 0xfb, 0x60b: 0x17c, 0x60c: 0xfb, 0x60d: 0xfb, 0x60e: 0xfb, 0x60f: 0xfb,
-	0x610: 0xfb, 0x611: 0xfb, 0x612: 0xfb, 0x613: 0xfb, 0x614: 0xfb, 0x615: 0xfb, 0x616: 0xfb, 0x617: 0xfb,
-	0x618: 0xfb, 0x619: 0xfb, 0x61a: 0xfb, 0x61b: 0xfb, 0x61c: 0xfb, 0x61d: 0xfb, 0x61e: 0xfb, 0x61f: 0xfb,
-	0x620: 0x123, 0x621: 0x123, 0x622: 0x123, 0x623: 0x17d, 0x624: 0x70, 0x625: 0x17e, 0x626: 0xfb, 0x627: 0xfb,
-	0x628: 0xfb, 0x629: 0xfb, 0x62a: 0xfb, 0x62b: 0xfb, 0x62c: 0xfb, 0x62d: 0xfb, 0x62e: 0xfb, 0x62f: 0xfb,
-	0x630: 0xfb, 0x631: 0x17f, 0x632: 0x180, 0x633: 0xfb, 0x634: 0x181, 0x635: 0xfb, 0x636: 0xfb, 0x637: 0xfb,
-	0x638: 0x71, 0x639: 0x72, 0x63a: 0x73, 0x63b: 0x182, 0x63c: 0xfb, 0x63d: 0xfb, 0x63e: 0xfb, 0x63f: 0xfb,
+	0x600: 0x17b, 0x601: 0xfd, 0x602: 0xfd, 0x603: 0xfd, 0x604: 0x17c, 0x605: 0x17d, 0x606: 0xfd, 0x607: 0xfd,
+	0x608: 0xfd, 0x609: 0xfd, 0x60a: 0xfd, 0x60b: 0x17e, 0x60c: 0xfd, 0x60d: 0xfd, 0x60e: 0xfd, 0x60f: 0xfd,
+	0x610: 0xfd, 0x611: 0xfd, 0x612: 0xfd, 0x613: 0xfd, 0x614: 0xfd, 0x615: 0xfd, 0x616: 0xfd, 0x617: 0xfd,
+	0x618: 0xfd, 0x619: 0xfd, 0x61a: 0xfd, 0x61b: 0xfd, 0x61c: 0xfd, 0x61d: 0xfd, 0x61e: 0xfd, 0x61f: 0xfd,
+	0x620: 0x125, 0x621: 0x125, 0x622: 0x125, 0x623: 0x17f, 0x624: 0x6e, 0x625: 0x180, 0x626: 0xfd, 0x627: 0xfd,
+	0x628: 0xfd, 0x629: 0xfd, 0x62a: 0xfd, 0x62b: 0xfd, 0x62c: 0xfd, 0x62d: 0xfd, 0x62e: 0xfd, 0x62f: 0xfd,
+	0x630: 0xfd, 0x631: 0x181, 0x632: 0x182, 0x633: 0xfd, 0x634: 0x183, 0x635: 0xfd, 0x636: 0xfd, 0x637: 0xfd,
+	0x638: 0x6f, 0x639: 0x70, 0x63a: 0x71, 0x63b: 0x184, 0x63c: 0xfd, 0x63d: 0xfd, 0x63e: 0xfd, 0x63f: 0xfd,
 	// Block 0x19, offset 0x640
-	0x640: 0x183, 0x641: 0x9c, 0x642: 0x184, 0x643: 0x185, 0x644: 0x74, 0x645: 0x75, 0x646: 0x186, 0x647: 0x187,
-	0x648: 0x76, 0x649: 0x188, 0x64a: 0xfb, 0x64b: 0xfb, 0x64c: 0x9c, 0x64d: 0x9c, 0x64e: 0x9c, 0x64f: 0x9c,
+	0x640: 0x185, 0x641: 0x9c, 0x642: 0x186, 0x643: 0x187, 0x644: 0x72, 0x645: 0x73, 0x646: 0x188, 0x647: 0x189,
+	0x648: 0x74, 0x649: 0x18a, 0x64a: 0xfd, 0x64b: 0xfd, 0x64c: 0x9c, 0x64d: 0x9c, 0x64e: 0x9c, 0x64f: 0x9c,
 	0x650: 0x9c, 0x651: 0x9c, 0x652: 0x9c, 0x653: 0x9c, 0x654: 0x9c, 0x655: 0x9c, 0x656: 0x9c, 0x657: 0x9c,
-	0x658: 0x9c, 0x659: 0x9c, 0x65a: 0x9c, 0x65b: 0x189, 0x65c: 0x9c, 0x65d: 0x18a, 0x65e: 0x9c, 0x65f: 0x18b,
-	0x660: 0x18c, 0x661: 0x18d, 0x662: 0x18e, 0x663: 0xfb, 0x664: 0x9c, 0x665: 0x18f, 0x666: 0x9c, 0x667: 0x190,
-	0x668: 0x9c, 0x669: 0x191, 0x66a: 0x192, 0x66b: 0x193, 0x66c: 0x9c, 0x66d: 0x9c, 0x66e: 0x194, 0x66f: 0x195,
-	0x670: 0xfb, 0x671: 0xfb, 0x672: 0xfb, 0x673: 0xfb, 0x674: 0xfb, 0x675: 0xfb, 0x676: 0xfb, 0x677: 0xfb,
-	0x678: 0xfb, 0x679: 0xfb, 0x67a: 0xfb, 0x67b: 0xfb, 0x67c: 0xfb, 0x67d: 0xfb, 0x67e: 0xfb, 0x67f: 0xfb,
+	0x658: 0x9c, 0x659: 0x9c, 0x65a: 0x9c, 0x65b: 0x18b, 0x65c: 0x9c, 0x65d: 0x18c, 0x65e: 0x9c, 0x65f: 0x18d,
+	0x660: 0x18e, 0x661: 0x18f, 0x662: 0x190, 0x663: 0xfd, 0x664: 0x9c, 0x665: 0x191, 0x666: 0x9c, 0x667: 0x192,
+	0x668: 0x9c, 0x669: 0x193, 0x66a: 0x194, 0x66b: 0x195, 0x66c: 0x9c, 0x66d: 0x9c, 0x66e: 0x196, 0x66f: 0x197,
+	0x670: 0xfd, 0x671: 0xfd, 0x672: 0xfd, 0x673: 0xfd, 0x674: 0xfd, 0x675: 0xfd, 0x676: 0xfd, 0x677: 0xfd,
+	0x678: 0xfd, 0x679: 0xfd, 0x67a: 0xfd, 0x67b: 0xfd, 0x67c: 0xfd, 0x67d: 0xfd, 0x67e: 0xfd, 0x67f: 0xfd,
 	// Block 0x1a, offset 0x680
 	0x680: 0xa0, 0x681: 0xa0, 0x682: 0xa0, 0x683: 0xa0, 0x684: 0xa0, 0x685: 0xa0, 0x686: 0xa0, 0x687: 0xa0,
 	0x688: 0xa0, 0x689: 0xa0, 0x68a: 0xa0, 0x68b: 0xa0, 0x68c: 0xa0, 0x68d: 0xa0, 0x68e: 0xa0, 0x68f: 0xa0,
 	0x690: 0xa0, 0x691: 0xa0, 0x692: 0xa0, 0x693: 0xa0, 0x694: 0xa0, 0x695: 0xa0, 0x696: 0xa0, 0x697: 0xa0,
-	0x698: 0xa0, 0x699: 0xa0, 0x69a: 0xa0, 0x69b: 0x196, 0x69c: 0xa0, 0x69d: 0xa0, 0x69e: 0xa0, 0x69f: 0xa0,
+	0x698: 0xa0, 0x699: 0xa0, 0x69a: 0xa0, 0x69b: 0x198, 0x69c: 0xa0, 0x69d: 0xa0, 0x69e: 0xa0, 0x69f: 0xa0,
 	0x6a0: 0xa0, 0x6a1: 0xa0, 0x6a2: 0xa0, 0x6a3: 0xa0, 0x6a4: 0xa0, 0x6a5: 0xa0, 0x6a6: 0xa0, 0x6a7: 0xa0,
 	0x6a8: 0xa0, 0x6a9: 0xa0, 0x6aa: 0xa0, 0x6ab: 0xa0, 0x6ac: 0xa0, 0x6ad: 0xa0, 0x6ae: 0xa0, 0x6af: 0xa0,
 	0x6b0: 0xa0, 0x6b1: 0xa0, 0x6b2: 0xa0, 0x6b3: 0xa0, 0x6b4: 0xa0, 0x6b5: 0xa0, 0x6b6: 0xa0, 0x6b7: 0xa0,
@@ -2312,8 +2455,8 @@
 	0x6c0: 0xa0, 0x6c1: 0xa0, 0x6c2: 0xa0, 0x6c3: 0xa0, 0x6c4: 0xa0, 0x6c5: 0xa0, 0x6c6: 0xa0, 0x6c7: 0xa0,
 	0x6c8: 0xa0, 0x6c9: 0xa0, 0x6ca: 0xa0, 0x6cb: 0xa0, 0x6cc: 0xa0, 0x6cd: 0xa0, 0x6ce: 0xa0, 0x6cf: 0xa0,
 	0x6d0: 0xa0, 0x6d1: 0xa0, 0x6d2: 0xa0, 0x6d3: 0xa0, 0x6d4: 0xa0, 0x6d5: 0xa0, 0x6d6: 0xa0, 0x6d7: 0xa0,
-	0x6d8: 0xa0, 0x6d9: 0xa0, 0x6da: 0xa0, 0x6db: 0xa0, 0x6dc: 0x197, 0x6dd: 0xa0, 0x6de: 0xa0, 0x6df: 0xa0,
-	0x6e0: 0x198, 0x6e1: 0xa0, 0x6e2: 0xa0, 0x6e3: 0xa0, 0x6e4: 0xa0, 0x6e5: 0xa0, 0x6e6: 0xa0, 0x6e7: 0xa0,
+	0x6d8: 0xa0, 0x6d9: 0xa0, 0x6da: 0xa0, 0x6db: 0xa0, 0x6dc: 0x199, 0x6dd: 0xa0, 0x6de: 0xa0, 0x6df: 0xa0,
+	0x6e0: 0x19a, 0x6e1: 0xa0, 0x6e2: 0xa0, 0x6e3: 0xa0, 0x6e4: 0xa0, 0x6e5: 0xa0, 0x6e6: 0xa0, 0x6e7: 0xa0,
 	0x6e8: 0xa0, 0x6e9: 0xa0, 0x6ea: 0xa0, 0x6eb: 0xa0, 0x6ec: 0xa0, 0x6ed: 0xa0, 0x6ee: 0xa0, 0x6ef: 0xa0,
 	0x6f0: 0xa0, 0x6f1: 0xa0, 0x6f2: 0xa0, 0x6f3: 0xa0, 0x6f4: 0xa0, 0x6f5: 0xa0, 0x6f6: 0xa0, 0x6f7: 0xa0,
 	0x6f8: 0xa0, 0x6f9: 0xa0, 0x6fa: 0xa0, 0x6fb: 0xa0, 0x6fc: 0xa0, 0x6fd: 0xa0, 0x6fe: 0xa0, 0x6ff: 0xa0,
@@ -2325,34 +2468,34 @@
 	0x720: 0xa0, 0x721: 0xa0, 0x722: 0xa0, 0x723: 0xa0, 0x724: 0xa0, 0x725: 0xa0, 0x726: 0xa0, 0x727: 0xa0,
 	0x728: 0xa0, 0x729: 0xa0, 0x72a: 0xa0, 0x72b: 0xa0, 0x72c: 0xa0, 0x72d: 0xa0, 0x72e: 0xa0, 0x72f: 0xa0,
 	0x730: 0xa0, 0x731: 0xa0, 0x732: 0xa0, 0x733: 0xa0, 0x734: 0xa0, 0x735: 0xa0, 0x736: 0xa0, 0x737: 0xa0,
-	0x738: 0xa0, 0x739: 0xa0, 0x73a: 0x199, 0x73b: 0xa0, 0x73c: 0xa0, 0x73d: 0xa0, 0x73e: 0xa0, 0x73f: 0xa0,
+	0x738: 0xa0, 0x739: 0xa0, 0x73a: 0x19b, 0x73b: 0xa0, 0x73c: 0xa0, 0x73d: 0xa0, 0x73e: 0xa0, 0x73f: 0xa0,
 	// Block 0x1d, offset 0x740
 	0x740: 0xa0, 0x741: 0xa0, 0x742: 0xa0, 0x743: 0xa0, 0x744: 0xa0, 0x745: 0xa0, 0x746: 0xa0, 0x747: 0xa0,
 	0x748: 0xa0, 0x749: 0xa0, 0x74a: 0xa0, 0x74b: 0xa0, 0x74c: 0xa0, 0x74d: 0xa0, 0x74e: 0xa0, 0x74f: 0xa0,
 	0x750: 0xa0, 0x751: 0xa0, 0x752: 0xa0, 0x753: 0xa0, 0x754: 0xa0, 0x755: 0xa0, 0x756: 0xa0, 0x757: 0xa0,
 	0x758: 0xa0, 0x759: 0xa0, 0x75a: 0xa0, 0x75b: 0xa0, 0x75c: 0xa0, 0x75d: 0xa0, 0x75e: 0xa0, 0x75f: 0xa0,
 	0x760: 0xa0, 0x761: 0xa0, 0x762: 0xa0, 0x763: 0xa0, 0x764: 0xa0, 0x765: 0xa0, 0x766: 0xa0, 0x767: 0xa0,
-	0x768: 0xa0, 0x769: 0xa0, 0x76a: 0xa0, 0x76b: 0xa0, 0x76c: 0xa0, 0x76d: 0xa0, 0x76e: 0xa0, 0x76f: 0x19a,
-	0x770: 0xfb, 0x771: 0xfb, 0x772: 0xfb, 0x773: 0xfb, 0x774: 0xfb, 0x775: 0xfb, 0x776: 0xfb, 0x777: 0xfb,
-	0x778: 0xfb, 0x779: 0xfb, 0x77a: 0xfb, 0x77b: 0xfb, 0x77c: 0xfb, 0x77d: 0xfb, 0x77e: 0xfb, 0x77f: 0xfb,
+	0x768: 0xa0, 0x769: 0xa0, 0x76a: 0xa0, 0x76b: 0xa0, 0x76c: 0xa0, 0x76d: 0xa0, 0x76e: 0xa0, 0x76f: 0x19c,
+	0x770: 0xfd, 0x771: 0xfd, 0x772: 0xfd, 0x773: 0xfd, 0x774: 0xfd, 0x775: 0xfd, 0x776: 0xfd, 0x777: 0xfd,
+	0x778: 0xfd, 0x779: 0xfd, 0x77a: 0xfd, 0x77b: 0xfd, 0x77c: 0xfd, 0x77d: 0xfd, 0x77e: 0xfd, 0x77f: 0xfd,
 	// Block 0x1e, offset 0x780
-	0x780: 0xfb, 0x781: 0xfb, 0x782: 0xfb, 0x783: 0xfb, 0x784: 0xfb, 0x785: 0xfb, 0x786: 0xfb, 0x787: 0xfb,
-	0x788: 0xfb, 0x789: 0xfb, 0x78a: 0xfb, 0x78b: 0xfb, 0x78c: 0xfb, 0x78d: 0xfb, 0x78e: 0xfb, 0x78f: 0xfb,
-	0x790: 0xfb, 0x791: 0xfb, 0x792: 0xfb, 0x793: 0xfb, 0x794: 0xfb, 0x795: 0xfb, 0x796: 0xfb, 0x797: 0xfb,
-	0x798: 0xfb, 0x799: 0xfb, 0x79a: 0xfb, 0x79b: 0xfb, 0x79c: 0xfb, 0x79d: 0xfb, 0x79e: 0xfb, 0x79f: 0xfb,
-	0x7a0: 0x77, 0x7a1: 0x78, 0x7a2: 0x79, 0x7a3: 0x19b, 0x7a4: 0x7a, 0x7a5: 0x7b, 0x7a6: 0x19c, 0x7a7: 0x7c,
-	0x7a8: 0x7d, 0x7a9: 0xfb, 0x7aa: 0xfb, 0x7ab: 0xfb, 0x7ac: 0xfb, 0x7ad: 0xfb, 0x7ae: 0xfb, 0x7af: 0xfb,
-	0x7b0: 0xfb, 0x7b1: 0xfb, 0x7b2: 0xfb, 0x7b3: 0xfb, 0x7b4: 0xfb, 0x7b5: 0xfb, 0x7b6: 0xfb, 0x7b7: 0xfb,
-	0x7b8: 0xfb, 0x7b9: 0xfb, 0x7ba: 0xfb, 0x7bb: 0xfb, 0x7bc: 0xfb, 0x7bd: 0xfb, 0x7be: 0xfb, 0x7bf: 0xfb,
+	0x780: 0xfd, 0x781: 0xfd, 0x782: 0xfd, 0x783: 0xfd, 0x784: 0xfd, 0x785: 0xfd, 0x786: 0xfd, 0x787: 0xfd,
+	0x788: 0xfd, 0x789: 0xfd, 0x78a: 0xfd, 0x78b: 0xfd, 0x78c: 0xfd, 0x78d: 0xfd, 0x78e: 0xfd, 0x78f: 0xfd,
+	0x790: 0xfd, 0x791: 0xfd, 0x792: 0xfd, 0x793: 0xfd, 0x794: 0xfd, 0x795: 0xfd, 0x796: 0xfd, 0x797: 0xfd,
+	0x798: 0xfd, 0x799: 0xfd, 0x79a: 0xfd, 0x79b: 0xfd, 0x79c: 0xfd, 0x79d: 0xfd, 0x79e: 0xfd, 0x79f: 0xfd,
+	0x7a0: 0x75, 0x7a1: 0x76, 0x7a2: 0x77, 0x7a3: 0x78, 0x7a4: 0x79, 0x7a5: 0x7a, 0x7a6: 0x7b, 0x7a7: 0x7c,
+	0x7a8: 0x7d, 0x7a9: 0xfd, 0x7aa: 0xfd, 0x7ab: 0xfd, 0x7ac: 0xfd, 0x7ad: 0xfd, 0x7ae: 0xfd, 0x7af: 0xfd,
+	0x7b0: 0xfd, 0x7b1: 0xfd, 0x7b2: 0xfd, 0x7b3: 0xfd, 0x7b4: 0xfd, 0x7b5: 0xfd, 0x7b6: 0xfd, 0x7b7: 0xfd,
+	0x7b8: 0xfd, 0x7b9: 0xfd, 0x7ba: 0xfd, 0x7bb: 0xfd, 0x7bc: 0xfd, 0x7bd: 0xfd, 0x7be: 0xfd, 0x7bf: 0xfd,
 	// Block 0x1f, offset 0x7c0
 	0x7c0: 0xa0, 0x7c1: 0xa0, 0x7c2: 0xa0, 0x7c3: 0xa0, 0x7c4: 0xa0, 0x7c5: 0xa0, 0x7c6: 0xa0, 0x7c7: 0xa0,
-	0x7c8: 0xa0, 0x7c9: 0xa0, 0x7ca: 0xa0, 0x7cb: 0xa0, 0x7cc: 0xa0, 0x7cd: 0x19d, 0x7ce: 0xfb, 0x7cf: 0xfb,
-	0x7d0: 0xfb, 0x7d1: 0xfb, 0x7d2: 0xfb, 0x7d3: 0xfb, 0x7d4: 0xfb, 0x7d5: 0xfb, 0x7d6: 0xfb, 0x7d7: 0xfb,
-	0x7d8: 0xfb, 0x7d9: 0xfb, 0x7da: 0xfb, 0x7db: 0xfb, 0x7dc: 0xfb, 0x7dd: 0xfb, 0x7de: 0xfb, 0x7df: 0xfb,
-	0x7e0: 0xfb, 0x7e1: 0xfb, 0x7e2: 0xfb, 0x7e3: 0xfb, 0x7e4: 0xfb, 0x7e5: 0xfb, 0x7e6: 0xfb, 0x7e7: 0xfb,
-	0x7e8: 0xfb, 0x7e9: 0xfb, 0x7ea: 0xfb, 0x7eb: 0xfb, 0x7ec: 0xfb, 0x7ed: 0xfb, 0x7ee: 0xfb, 0x7ef: 0xfb,
-	0x7f0: 0xfb, 0x7f1: 0xfb, 0x7f2: 0xfb, 0x7f3: 0xfb, 0x7f4: 0xfb, 0x7f5: 0xfb, 0x7f6: 0xfb, 0x7f7: 0xfb,
-	0x7f8: 0xfb, 0x7f9: 0xfb, 0x7fa: 0xfb, 0x7fb: 0xfb, 0x7fc: 0xfb, 0x7fd: 0xfb, 0x7fe: 0xfb, 0x7ff: 0xfb,
+	0x7c8: 0xa0, 0x7c9: 0xa0, 0x7ca: 0xa0, 0x7cb: 0xa0, 0x7cc: 0xa0, 0x7cd: 0x19d, 0x7ce: 0xfd, 0x7cf: 0xfd,
+	0x7d0: 0xfd, 0x7d1: 0xfd, 0x7d2: 0xfd, 0x7d3: 0xfd, 0x7d4: 0xfd, 0x7d5: 0xfd, 0x7d6: 0xfd, 0x7d7: 0xfd,
+	0x7d8: 0xfd, 0x7d9: 0xfd, 0x7da: 0xfd, 0x7db: 0xfd, 0x7dc: 0xfd, 0x7dd: 0xfd, 0x7de: 0xfd, 0x7df: 0xfd,
+	0x7e0: 0xfd, 0x7e1: 0xfd, 0x7e2: 0xfd, 0x7e3: 0xfd, 0x7e4: 0xfd, 0x7e5: 0xfd, 0x7e6: 0xfd, 0x7e7: 0xfd,
+	0x7e8: 0xfd, 0x7e9: 0xfd, 0x7ea: 0xfd, 0x7eb: 0xfd, 0x7ec: 0xfd, 0x7ed: 0xfd, 0x7ee: 0xfd, 0x7ef: 0xfd,
+	0x7f0: 0xfd, 0x7f1: 0xfd, 0x7f2: 0xfd, 0x7f3: 0xfd, 0x7f4: 0xfd, 0x7f5: 0xfd, 0x7f6: 0xfd, 0x7f7: 0xfd,
+	0x7f8: 0xfd, 0x7f9: 0xfd, 0x7fa: 0xfd, 0x7fb: 0xfd, 0x7fc: 0xfd, 0x7fd: 0xfd, 0x7fe: 0xfd, 0x7ff: 0xfd,
 	// Block 0x20, offset 0x800
 	0x810: 0x0d, 0x811: 0x0e, 0x812: 0x0f, 0x813: 0x10, 0x814: 0x11, 0x815: 0x0b, 0x816: 0x12, 0x817: 0x07,
 	0x818: 0x13, 0x819: 0x0b, 0x81a: 0x0b, 0x81b: 0x14, 0x81c: 0x0b, 0x81d: 0x15, 0x81e: 0x16, 0x81f: 0x17,
@@ -2370,14 +2513,14 @@
 	0x870: 0x0b, 0x871: 0x0b, 0x872: 0x0b, 0x873: 0x0b, 0x874: 0x0b, 0x875: 0x0b, 0x876: 0x0b, 0x877: 0x0b,
 	0x878: 0x0b, 0x879: 0x0b, 0x87a: 0x0b, 0x87b: 0x0b, 0x87c: 0x0b, 0x87d: 0x0b, 0x87e: 0x0b, 0x87f: 0x0b,
 	// Block 0x22, offset 0x880
-	0x880: 0x19e, 0x881: 0x19f, 0x882: 0xfb, 0x883: 0xfb, 0x884: 0x1a0, 0x885: 0x1a0, 0x886: 0x1a0, 0x887: 0x1a1,
-	0x888: 0xfb, 0x889: 0xfb, 0x88a: 0xfb, 0x88b: 0xfb, 0x88c: 0xfb, 0x88d: 0xfb, 0x88e: 0xfb, 0x88f: 0xfb,
-	0x890: 0xfb, 0x891: 0xfb, 0x892: 0xfb, 0x893: 0xfb, 0x894: 0xfb, 0x895: 0xfb, 0x896: 0xfb, 0x897: 0xfb,
-	0x898: 0xfb, 0x899: 0xfb, 0x89a: 0xfb, 0x89b: 0xfb, 0x89c: 0xfb, 0x89d: 0xfb, 0x89e: 0xfb, 0x89f: 0xfb,
-	0x8a0: 0xfb, 0x8a1: 0xfb, 0x8a2: 0xfb, 0x8a3: 0xfb, 0x8a4: 0xfb, 0x8a5: 0xfb, 0x8a6: 0xfb, 0x8a7: 0xfb,
-	0x8a8: 0xfb, 0x8a9: 0xfb, 0x8aa: 0xfb, 0x8ab: 0xfb, 0x8ac: 0xfb, 0x8ad: 0xfb, 0x8ae: 0xfb, 0x8af: 0xfb,
-	0x8b0: 0xfb, 0x8b1: 0xfb, 0x8b2: 0xfb, 0x8b3: 0xfb, 0x8b4: 0xfb, 0x8b5: 0xfb, 0x8b6: 0xfb, 0x8b7: 0xfb,
-	0x8b8: 0xfb, 0x8b9: 0xfb, 0x8ba: 0xfb, 0x8bb: 0xfb, 0x8bc: 0xfb, 0x8bd: 0xfb, 0x8be: 0xfb, 0x8bf: 0xfb,
+	0x880: 0x19e, 0x881: 0x19f, 0x882: 0xfd, 0x883: 0xfd, 0x884: 0x1a0, 0x885: 0x1a0, 0x886: 0x1a0, 0x887: 0x1a1,
+	0x888: 0xfd, 0x889: 0xfd, 0x88a: 0xfd, 0x88b: 0xfd, 0x88c: 0xfd, 0x88d: 0xfd, 0x88e: 0xfd, 0x88f: 0xfd,
+	0x890: 0xfd, 0x891: 0xfd, 0x892: 0xfd, 0x893: 0xfd, 0x894: 0xfd, 0x895: 0xfd, 0x896: 0xfd, 0x897: 0xfd,
+	0x898: 0xfd, 0x899: 0xfd, 0x89a: 0xfd, 0x89b: 0xfd, 0x89c: 0xfd, 0x89d: 0xfd, 0x89e: 0xfd, 0x89f: 0xfd,
+	0x8a0: 0xfd, 0x8a1: 0xfd, 0x8a2: 0xfd, 0x8a3: 0xfd, 0x8a4: 0xfd, 0x8a5: 0xfd, 0x8a6: 0xfd, 0x8a7: 0xfd,
+	0x8a8: 0xfd, 0x8a9: 0xfd, 0x8aa: 0xfd, 0x8ab: 0xfd, 0x8ac: 0xfd, 0x8ad: 0xfd, 0x8ae: 0xfd, 0x8af: 0xfd,
+	0x8b0: 0xfd, 0x8b1: 0xfd, 0x8b2: 0xfd, 0x8b3: 0xfd, 0x8b4: 0xfd, 0x8b5: 0xfd, 0x8b6: 0xfd, 0x8b7: 0xfd,
+	0x8b8: 0xfd, 0x8b9: 0xfd, 0x8ba: 0xfd, 0x8bb: 0xfd, 0x8bc: 0xfd, 0x8bd: 0xfd, 0x8be: 0xfd, 0x8bf: 0xfd,
 	// Block 0x23, offset 0x8c0
 	0x8c0: 0x0b, 0x8c1: 0x0b, 0x8c2: 0x0b, 0x8c3: 0x0b, 0x8c4: 0x0b, 0x8c5: 0x0b, 0x8c6: 0x0b, 0x8c7: 0x0b,
 	0x8c8: 0x0b, 0x8c9: 0x0b, 0x8ca: 0x0b, 0x8cb: 0x0b, 0x8cc: 0x0b, 0x8cd: 0x0b, 0x8ce: 0x0b, 0x8cf: 0x0b,
@@ -2393,10 +2536,10 @@
 }
 
 // idnaSparseOffset: 292 entries, 584 bytes
-var idnaSparseOffset = []uint16{0x0, 0x8, 0x19, 0x25, 0x27, 0x2c, 0x33, 0x3e, 0x4a, 0x4e, 0x5d, 0x62, 0x6c, 0x78, 0x85, 0x8b, 0x94, 0xa4, 0xb2, 0xbd, 0xca, 0xdb, 0xe5, 0xec, 0xf9, 0x10a, 0x111, 0x11c, 0x12b, 0x139, 0x143, 0x145, 0x14a, 0x14d, 0x150, 0x152, 0x15e, 0x169, 0x171, 0x177, 0x17d, 0x182, 0x187, 0x18a, 0x18e, 0x194, 0x199, 0x1a5, 0x1af, 0x1b5, 0x1c6, 0x1d0, 0x1d3, 0x1db, 0x1de, 0x1eb, 0x1f3, 0x1f7, 0x1fe, 0x206, 0x216, 0x222, 0x225, 0x22f, 0x23b, 0x247, 0x253, 0x25b, 0x260, 0x26d, 0x27e, 0x282, 0x28d, 0x291, 0x29a, 0x2a2, 0x2a8, 0x2ad, 0x2b0, 0x2b4, 0x2ba, 0x2be, 0x2c2, 0x2c6, 0x2cc, 0x2d4, 0x2db, 0x2e6, 0x2f0, 0x2f4, 0x2f7, 0x2fd, 0x301, 0x303, 0x306, 0x308, 0x30b, 0x315, 0x318, 0x327, 0x32b, 0x330, 0x333, 0x337, 0x33c, 0x341, 0x347, 0x358, 0x368, 0x36e, 0x372, 0x381, 0x386, 0x38e, 0x398, 0x3a3, 0x3ab, 0x3bc, 0x3c5, 0x3d5, 0x3e2, 0x3ee, 0x3f3, 0x400, 0x404, 0x409, 0x40b, 0x40d, 0x411, 0x413, 0x417, 0x420, 0x426, 0x42a, 0x43a, 0x444, 0x449, 0x44c, 0x452, 0x459, 0x45e, 0x462, 0x468, 0x46d, 0x476, 0x47b, 0x481, 0x488, 0x48f, 0x496, 0x49a, 0x49f, 0x4a2, 0x4a7, 0x4b3, 0x4b9, 0x4be, 0x4c5, 0x4cd, 0x4d2, 0x4d6, 0x4e6, 0x4ed, 0x4f1, 0x4f5, 0x4fc, 0x4fe, 0x501, 0x504, 0x508, 0x511, 0x515, 0x51d, 0x525, 0x52d, 0x539, 0x545, 0x54b, 0x554, 0x560, 0x567, 0x570, 0x57b, 0x582, 0x591, 0x59e, 0x5ab, 0x5b4, 0x5b8, 0x5c7, 0x5cf, 0x5da, 0x5e3, 0x5e9, 0x5f1, 0x5fa, 0x605, 0x608, 0x614, 0x61d, 0x620, 0x625, 0x62e, 0x633, 0x640, 0x64b, 0x654, 0x65e, 0x661, 0x66b, 0x674, 0x680, 0x68d, 0x69a, 0x6a8, 0x6af, 0x6b3, 0x6b7, 0x6ba, 0x6bf, 0x6c2, 0x6c7, 0x6ca, 0x6d1, 0x6d8, 0x6dc, 0x6e7, 0x6ea, 0x6ed, 0x6f0, 0x6f6, 0x6fc, 0x705, 0x708, 0x70b, 0x70e, 0x711, 0x718, 0x71b, 0x720, 0x72a, 0x72d, 0x731, 0x740, 0x74c, 0x750, 0x755, 0x759, 0x75e, 0x762, 0x767, 0x770, 0x77b, 0x781, 0x787, 0x78d, 0x793, 0x79c, 0x79f, 0x7a2, 0x7a6, 0x7aa, 0x7ae, 0x7b4, 0x7ba, 0x7bf, 0x7c2, 0x7d2, 0x7d9, 0x7dc, 0x7e1, 0x7e5, 0x7eb, 0x7f2, 0x7f6, 0x7fa, 0x803, 0x80a, 0x80f, 0x813, 0x821, 0x824, 0x827, 0x82b, 0x82f, 0x832, 0x842, 0x853, 0x856, 0x85b, 0x85d, 0x85f}
+var idnaSparseOffset = []uint16{0x0, 0x8, 0x19, 0x25, 0x27, 0x2c, 0x33, 0x3e, 0x4a, 0x4e, 0x5d, 0x62, 0x6c, 0x78, 0x85, 0x8b, 0x94, 0xa4, 0xb2, 0xbd, 0xca, 0xdb, 0xe5, 0xec, 0xf9, 0x10a, 0x111, 0x11c, 0x12b, 0x139, 0x143, 0x145, 0x14a, 0x14d, 0x150, 0x152, 0x15e, 0x169, 0x171, 0x177, 0x17d, 0x182, 0x187, 0x18a, 0x18e, 0x194, 0x199, 0x1a5, 0x1af, 0x1b5, 0x1c6, 0x1d0, 0x1d3, 0x1db, 0x1de, 0x1eb, 0x1f3, 0x1f7, 0x1fe, 0x206, 0x216, 0x222, 0x225, 0x22f, 0x23b, 0x247, 0x253, 0x25b, 0x260, 0x26d, 0x27e, 0x282, 0x28d, 0x291, 0x29a, 0x2a2, 0x2a8, 0x2ad, 0x2b0, 0x2b4, 0x2ba, 0x2be, 0x2c2, 0x2c6, 0x2cc, 0x2d4, 0x2db, 0x2e6, 0x2f0, 0x2f4, 0x2f7, 0x2fd, 0x301, 0x303, 0x306, 0x308, 0x30b, 0x315, 0x318, 0x327, 0x32b, 0x32f, 0x331, 0x33a, 0x33d, 0x341, 0x346, 0x34b, 0x351, 0x362, 0x372, 0x378, 0x37c, 0x38b, 0x390, 0x398, 0x3a2, 0x3ad, 0x3b5, 0x3c6, 0x3cf, 0x3df, 0x3ec, 0x3f8, 0x3fd, 0x40a, 0x40e, 0x413, 0x415, 0x417, 0x41b, 0x41d, 0x421, 0x42a, 0x430, 0x434, 0x444, 0x44e, 0x453, 0x456, 0x45c, 0x463, 0x468, 0x46c, 0x472, 0x477, 0x480, 0x485, 0x48b, 0x492, 0x499, 0x4a0, 0x4a4, 0x4a9, 0x4ac, 0x4b1, 0x4bd, 0x4c3, 0x4c8, 0x4cf, 0x4d7, 0x4dc, 0x4e0, 0x4f0, 0x4f7, 0x4fb, 0x4ff, 0x506, 0x508, 0x50b, 0x50e, 0x512, 0x51b, 0x51f, 0x527, 0x52f, 0x537, 0x543, 0x54f, 0x555, 0x55e, 0x56a, 0x571, 0x57a, 0x585, 0x58c, 0x59b, 0x5a8, 0x5b5, 0x5be, 0x5c2, 0x5d1, 0x5d9, 0x5e4, 0x5ed, 0x5f3, 0x5fb, 0x604, 0x60f, 0x612, 0x61e, 0x627, 0x62a, 0x62f, 0x638, 0x63d, 0x64a, 0x655, 0x65e, 0x668, 0x66b, 0x675, 0x67e, 0x68a, 0x697, 0x6a4, 0x6b2, 0x6b9, 0x6bd, 0x6c1, 0x6c4, 0x6c9, 0x6cc, 0x6d1, 0x6d4, 0x6db, 0x6e2, 0x6e6, 0x6f1, 0x6f4, 0x6f7, 0x6fa, 0x700, 0x706, 0x70f, 0x712, 0x715, 0x718, 0x71b, 0x722, 0x725, 0x72a, 0x734, 0x737, 0x73b, 0x74a, 0x756, 0x75a, 0x75f, 0x763, 0x768, 0x76c, 0x771, 0x77a, 0x785, 0x78b, 0x791, 0x797, 0x79d, 0x7a6, 0x7a9, 0x7ac, 0x7b0, 0x7b4, 0x7b8, 0x7be, 0x7c4, 0x7c9, 0x7cc, 0x7dc, 0x7e3, 0x7e6, 0x7eb, 0x7ef, 0x7f5, 0x7fc, 0x800, 0x804, 0x80d, 0x814, 0x819, 0x81d, 0x82b, 0x82e, 0x831, 0x835, 0x839, 0x83c, 0x83f, 0x844, 0x846, 0x848}
 
-// idnaSparseValues: 2146 entries, 8584 bytes
-var idnaSparseValues = [2146]valueRange{
+// idnaSparseValues: 2123 entries, 8492 bytes
+var idnaSparseValues = [2123]valueRange{
 	// Block 0x0, offset 0x0
 	{value: 0x0000, lo: 0x07},
 	{value: 0xe105, lo: 0x80, hi: 0x96},
@@ -2427,15 +2570,15 @@
 	// Block 0x2, offset 0x19
 	{value: 0x0000, lo: 0x0b},
 	{value: 0x0008, lo: 0x80, hi: 0xaf},
-	{value: 0x0249, lo: 0xb0, hi: 0xb0},
+	{value: 0x00a9, lo: 0xb0, hi: 0xb0},
 	{value: 0x037d, lo: 0xb1, hi: 0xb1},
-	{value: 0x0259, lo: 0xb2, hi: 0xb2},
-	{value: 0x0269, lo: 0xb3, hi: 0xb3},
+	{value: 0x00b1, lo: 0xb2, hi: 0xb2},
+	{value: 0x00b9, lo: 0xb3, hi: 0xb3},
 	{value: 0x034d, lo: 0xb4, hi: 0xb4},
 	{value: 0x0395, lo: 0xb5, hi: 0xb5},
 	{value: 0xe1bd, lo: 0xb6, hi: 0xb6},
-	{value: 0x0279, lo: 0xb7, hi: 0xb7},
-	{value: 0x0289, lo: 0xb8, hi: 0xb8},
+	{value: 0x00c1, lo: 0xb7, hi: 0xb7},
+	{value: 0x00c9, lo: 0xb8, hi: 0xb8},
 	{value: 0x0008, lo: 0xb9, hi: 0xbf},
 	// Block 0x3, offset 0x25
 	{value: 0x0000, lo: 0x01},
@@ -2457,7 +2600,7 @@
 	// Block 0x6, offset 0x33
 	{value: 0x0000, lo: 0x0a},
 	{value: 0x0008, lo: 0x80, hi: 0x86},
-	{value: 0x0401, lo: 0x87, hi: 0x87},
+	{value: 0x0131, lo: 0x87, hi: 0x87},
 	{value: 0x0008, lo: 0x88, hi: 0x88},
 	{value: 0x0018, lo: 0x89, hi: 0x8a},
 	{value: 0x0040, lo: 0x8b, hi: 0x8c},
@@ -2643,7 +2786,7 @@
 	{value: 0x0008, lo: 0x81, hi: 0xb0},
 	{value: 0x3308, lo: 0xb1, hi: 0xb1},
 	{value: 0x0008, lo: 0xb2, hi: 0xb2},
-	{value: 0x08f1, lo: 0xb3, hi: 0xb3},
+	{value: 0x01f1, lo: 0xb3, hi: 0xb3},
 	{value: 0x3308, lo: 0xb4, hi: 0xb9},
 	{value: 0x3b08, lo: 0xba, hi: 0xba},
 	{value: 0x0040, lo: 0xbb, hi: 0xbe},
@@ -2666,8 +2809,8 @@
 	{value: 0x0040, lo: 0x8e, hi: 0x8f},
 	{value: 0x0008, lo: 0x90, hi: 0x99},
 	{value: 0x0040, lo: 0x9a, hi: 0x9b},
-	{value: 0x0961, lo: 0x9c, hi: 0x9c},
-	{value: 0x0999, lo: 0x9d, hi: 0x9d},
+	{value: 0x0201, lo: 0x9c, hi: 0x9c},
+	{value: 0x0209, lo: 0x9d, hi: 0x9d},
 	{value: 0x0008, lo: 0x9e, hi: 0x9f},
 	{value: 0x0040, lo: 0xa0, hi: 0xbf},
 	// Block 0x18, offset 0xf9
@@ -3075,13 +3218,13 @@
 	{value: 0x0018, lo: 0xbe, hi: 0xbf},
 	// Block 0x44, offset 0x260
 	{value: 0x0000, lo: 0x0c},
-	{value: 0x0e29, lo: 0x80, hi: 0x80},
-	{value: 0x0e41, lo: 0x81, hi: 0x81},
-	{value: 0x0e59, lo: 0x82, hi: 0x82},
-	{value: 0x0e71, lo: 0x83, hi: 0x83},
-	{value: 0x0e89, lo: 0x84, hi: 0x85},
-	{value: 0x0ea1, lo: 0x86, hi: 0x86},
-	{value: 0x0eb9, lo: 0x87, hi: 0x87},
+	{value: 0x02a9, lo: 0x80, hi: 0x80},
+	{value: 0x02b1, lo: 0x81, hi: 0x81},
+	{value: 0x02b9, lo: 0x82, hi: 0x82},
+	{value: 0x02c1, lo: 0x83, hi: 0x83},
+	{value: 0x02c9, lo: 0x84, hi: 0x85},
+	{value: 0x02d1, lo: 0x86, hi: 0x86},
+	{value: 0x02d9, lo: 0x87, hi: 0x87},
 	{value: 0x057d, lo: 0x88, hi: 0x88},
 	{value: 0x0040, lo: 0x89, hi: 0x8f},
 	{value: 0x059d, lo: 0x90, hi: 0xba},
@@ -3133,18 +3276,18 @@
 	{value: 0x0040, lo: 0x83, hi: 0x83},
 	{value: 0x0008, lo: 0x84, hi: 0x84},
 	{value: 0x0018, lo: 0x85, hi: 0x88},
-	{value: 0x24c1, lo: 0x89, hi: 0x89},
+	{value: 0x0851, lo: 0x89, hi: 0x89},
 	{value: 0x0018, lo: 0x8a, hi: 0x8b},
 	{value: 0x0040, lo: 0x8c, hi: 0x8f},
 	{value: 0x0018, lo: 0x90, hi: 0xbf},
 	// Block 0x4a, offset 0x29a
 	{value: 0x0000, lo: 0x07},
 	{value: 0x0018, lo: 0x80, hi: 0xab},
-	{value: 0x24f1, lo: 0xac, hi: 0xac},
-	{value: 0x2529, lo: 0xad, hi: 0xad},
+	{value: 0x0859, lo: 0xac, hi: 0xac},
+	{value: 0x0861, lo: 0xad, hi: 0xad},
 	{value: 0x0018, lo: 0xae, hi: 0xae},
-	{value: 0x2579, lo: 0xaf, hi: 0xaf},
-	{value: 0x25b1, lo: 0xb0, hi: 0xb0},
+	{value: 0x0869, lo: 0xaf, hi: 0xaf},
+	{value: 0x0871, lo: 0xb0, hi: 0xb0},
 	{value: 0x0018, lo: 0xb1, hi: 0xbf},
 	// Block 0x4b, offset 0x2a2
 	{value: 0x0000, lo: 0x05},
@@ -3166,19 +3309,19 @@
 	// Block 0x4e, offset 0x2b0
 	{value: 0x0000, lo: 0x03},
 	{value: 0x0018, lo: 0x80, hi: 0x8b},
-	{value: 0x28c1, lo: 0x8c, hi: 0x8c},
+	{value: 0x0929, lo: 0x8c, hi: 0x8c},
 	{value: 0x0018, lo: 0x8d, hi: 0xbf},
 	// Block 0x4f, offset 0x2b4
 	{value: 0x0000, lo: 0x05},
 	{value: 0x0018, lo: 0x80, hi: 0xb3},
 	{value: 0x0e7e, lo: 0xb4, hi: 0xb4},
-	{value: 0x292a, lo: 0xb5, hi: 0xb5},
+	{value: 0x0932, lo: 0xb5, hi: 0xb5},
 	{value: 0x0e9e, lo: 0xb6, hi: 0xb6},
 	{value: 0x0018, lo: 0xb7, hi: 0xbf},
 	// Block 0x50, offset 0x2ba
 	{value: 0x0000, lo: 0x03},
 	{value: 0x0018, lo: 0x80, hi: 0x9b},
-	{value: 0x2941, lo: 0x9c, hi: 0x9c},
+	{value: 0x0939, lo: 0x9c, hi: 0x9c},
 	{value: 0x0018, lo: 0x9d, hi: 0xbf},
 	// Block 0x51, offset 0x2be
 	{value: 0x0000, lo: 0x03},
@@ -3277,16 +3420,16 @@
 	{value: 0x0008, lo: 0x80, hi: 0x96},
 	{value: 0x0040, lo: 0x97, hi: 0x98},
 	{value: 0x3308, lo: 0x99, hi: 0x9a},
-	{value: 0x29e2, lo: 0x9b, hi: 0x9b},
-	{value: 0x2a0a, lo: 0x9c, hi: 0x9c},
+	{value: 0x096a, lo: 0x9b, hi: 0x9b},
+	{value: 0x0972, lo: 0x9c, hi: 0x9c},
 	{value: 0x0008, lo: 0x9d, hi: 0x9e},
-	{value: 0x2a31, lo: 0x9f, hi: 0x9f},
+	{value: 0x0979, lo: 0x9f, hi: 0x9f},
 	{value: 0x0018, lo: 0xa0, hi: 0xa0},
 	{value: 0x0008, lo: 0xa1, hi: 0xbf},
 	// Block 0x61, offset 0x315
 	{value: 0x0000, lo: 0x02},
 	{value: 0x0008, lo: 0x80, hi: 0xbe},
-	{value: 0x2a69, lo: 0xbf, hi: 0xbf},
+	{value: 0x0981, lo: 0xbf, hi: 0xbf},
 	// Block 0x62, offset 0x318
 	{value: 0x0000, lo: 0x0e},
 	{value: 0x0040, lo: 0x80, hi: 0x84},
@@ -3309,46 +3452,58 @@
 	{value: 0x0040, lo: 0xa4, hi: 0xaf},
 	{value: 0x0008, lo: 0xb0, hi: 0xbf},
 	// Block 0x64, offset 0x32b
-	{value: 0x0030, lo: 0x04},
-	{value: 0x2aa2, lo: 0x80, hi: 0x9d},
-	{value: 0x305a, lo: 0x9e, hi: 0x9e},
+	{value: 0x0008, lo: 0x03},
+	{value: 0x098a, lo: 0x80, hi: 0x9e},
 	{value: 0x0040, lo: 0x9f, hi: 0x9f},
-	{value: 0x30a2, lo: 0xa0, hi: 0xbf},
-	// Block 0x65, offset 0x330
+	{value: 0x0a82, lo: 0xa0, hi: 0xbf},
+	// Block 0x65, offset 0x32f
+	{value: 0x0008, lo: 0x01},
+	{value: 0x0d19, lo: 0x80, hi: 0xbf},
+	// Block 0x66, offset 0x331
+	{value: 0x0008, lo: 0x08},
+	{value: 0x0f19, lo: 0x80, hi: 0xb0},
+	{value: 0x4045, lo: 0xb1, hi: 0xb1},
+	{value: 0x10a1, lo: 0xb2, hi: 0xb3},
+	{value: 0x4065, lo: 0xb4, hi: 0xb4},
+	{value: 0x10b1, lo: 0xb5, hi: 0xb7},
+	{value: 0x4085, lo: 0xb8, hi: 0xb8},
+	{value: 0x4085, lo: 0xb9, hi: 0xb9},
+	{value: 0x10c9, lo: 0xba, hi: 0xbf},
+	// Block 0x67, offset 0x33a
 	{value: 0x0000, lo: 0x02},
 	{value: 0x0008, lo: 0x80, hi: 0xbc},
 	{value: 0x0040, lo: 0xbd, hi: 0xbf},
-	// Block 0x66, offset 0x333
+	// Block 0x68, offset 0x33d
 	{value: 0x0000, lo: 0x03},
 	{value: 0x0008, lo: 0x80, hi: 0x8c},
 	{value: 0x0040, lo: 0x8d, hi: 0x8f},
 	{value: 0x0018, lo: 0x90, hi: 0xbf},
-	// Block 0x67, offset 0x337
+	// Block 0x69, offset 0x341
 	{value: 0x0000, lo: 0x04},
 	{value: 0x0018, lo: 0x80, hi: 0x86},
 	{value: 0x0040, lo: 0x87, hi: 0x8f},
 	{value: 0x0008, lo: 0x90, hi: 0xbd},
 	{value: 0x0018, lo: 0xbe, hi: 0xbf},
-	// Block 0x68, offset 0x33c
+	// Block 0x6a, offset 0x346
 	{value: 0x0000, lo: 0x04},
 	{value: 0x0008, lo: 0x80, hi: 0x8c},
 	{value: 0x0018, lo: 0x8d, hi: 0x8f},
 	{value: 0x0008, lo: 0x90, hi: 0xab},
 	{value: 0x0040, lo: 0xac, hi: 0xbf},
-	// Block 0x69, offset 0x341
+	// Block 0x6b, offset 0x34b
 	{value: 0x0000, lo: 0x05},
 	{value: 0x0008, lo: 0x80, hi: 0xa5},
 	{value: 0x0018, lo: 0xa6, hi: 0xaf},
 	{value: 0x3308, lo: 0xb0, hi: 0xb1},
 	{value: 0x0018, lo: 0xb2, hi: 0xb7},
 	{value: 0x0040, lo: 0xb8, hi: 0xbf},
-	// Block 0x6a, offset 0x347
+	// Block 0x6c, offset 0x351
 	{value: 0x0000, lo: 0x10},
 	{value: 0x0040, lo: 0x80, hi: 0x81},
 	{value: 0xe00d, lo: 0x82, hi: 0x82},
 	{value: 0x0008, lo: 0x83, hi: 0x83},
 	{value: 0x03f5, lo: 0x84, hi: 0x84},
-	{value: 0x1329, lo: 0x85, hi: 0x85},
+	{value: 0x0479, lo: 0x85, hi: 0x85},
 	{value: 0x447d, lo: 0x86, hi: 0x86},
 	{value: 0xe07d, lo: 0x87, hi: 0x87},
 	{value: 0x0008, lo: 0x88, hi: 0x88},
@@ -3357,10 +3512,10 @@
 	{value: 0x0040, lo: 0x8b, hi: 0xb4},
 	{value: 0xe01d, lo: 0xb5, hi: 0xb5},
 	{value: 0x0008, lo: 0xb6, hi: 0xb7},
-	{value: 0x2009, lo: 0xb8, hi: 0xb8},
-	{value: 0x6ec1, lo: 0xb9, hi: 0xb9},
+	{value: 0x0741, lo: 0xb8, hi: 0xb8},
+	{value: 0x13f1, lo: 0xb9, hi: 0xb9},
 	{value: 0x0008, lo: 0xba, hi: 0xbf},
-	// Block 0x6b, offset 0x358
+	// Block 0x6d, offset 0x362
 	{value: 0x0000, lo: 0x0f},
 	{value: 0x0008, lo: 0x80, hi: 0x81},
 	{value: 0x3308, lo: 0x82, hi: 0x82},
@@ -3377,19 +3532,19 @@
 	{value: 0x0040, lo: 0xad, hi: 0xaf},
 	{value: 0x0018, lo: 0xb0, hi: 0xb9},
 	{value: 0x0040, lo: 0xba, hi: 0xbf},
-	// Block 0x6c, offset 0x368
+	// Block 0x6e, offset 0x372
 	{value: 0x0000, lo: 0x05},
 	{value: 0x0208, lo: 0x80, hi: 0xb1},
 	{value: 0x0108, lo: 0xb2, hi: 0xb2},
 	{value: 0x0008, lo: 0xb3, hi: 0xb3},
 	{value: 0x0018, lo: 0xb4, hi: 0xb7},
 	{value: 0x0040, lo: 0xb8, hi: 0xbf},
-	// Block 0x6d, offset 0x36e
+	// Block 0x6f, offset 0x378
 	{value: 0x0000, lo: 0x03},
 	{value: 0x3008, lo: 0x80, hi: 0x81},
 	{value: 0x0008, lo: 0x82, hi: 0xb3},
 	{value: 0x3008, lo: 0xb4, hi: 0xbf},
-	// Block 0x6e, offset 0x372
+	// Block 0x70, offset 0x37c
 	{value: 0x0000, lo: 0x0e},
 	{value: 0x3008, lo: 0x80, hi: 0x83},
 	{value: 0x3b08, lo: 0x84, hi: 0x84},
@@ -3405,13 +3560,13 @@
 	{value: 0x0018, lo: 0xbc, hi: 0xbc},
 	{value: 0x0008, lo: 0xbd, hi: 0xbe},
 	{value: 0x3308, lo: 0xbf, hi: 0xbf},
-	// Block 0x6f, offset 0x381
+	// Block 0x71, offset 0x38b
 	{value: 0x0000, lo: 0x04},
 	{value: 0x0008, lo: 0x80, hi: 0xa5},
 	{value: 0x3308, lo: 0xa6, hi: 0xad},
 	{value: 0x0018, lo: 0xae, hi: 0xaf},
 	{value: 0x0008, lo: 0xb0, hi: 0xbf},
-	// Block 0x70, offset 0x386
+	// Block 0x72, offset 0x390
 	{value: 0x0000, lo: 0x07},
 	{value: 0x0008, lo: 0x80, hi: 0x86},
 	{value: 0x3308, lo: 0x87, hi: 0x91},
@@ -3420,7 +3575,7 @@
 	{value: 0x0040, lo: 0x94, hi: 0x9e},
 	{value: 0x0018, lo: 0x9f, hi: 0xbc},
 	{value: 0x0040, lo: 0xbd, hi: 0xbf},
-	// Block 0x71, offset 0x38e
+	// Block 0x73, offset 0x398
 	{value: 0x0000, lo: 0x09},
 	{value: 0x3308, lo: 0x80, hi: 0x82},
 	{value: 0x3008, lo: 0x83, hi: 0x83},
@@ -3431,7 +3586,7 @@
 	{value: 0x3008, lo: 0xba, hi: 0xbb},
 	{value: 0x3308, lo: 0xbc, hi: 0xbd},
 	{value: 0x3008, lo: 0xbe, hi: 0xbf},
-	// Block 0x72, offset 0x398
+	// Block 0x74, offset 0x3a2
 	{value: 0x0000, lo: 0x0a},
 	{value: 0x3808, lo: 0x80, hi: 0x80},
 	{value: 0x0018, lo: 0x81, hi: 0x8d},
@@ -3443,7 +3598,7 @@
 	{value: 0x3308, lo: 0xa5, hi: 0xa5},
 	{value: 0x0008, lo: 0xa6, hi: 0xbe},
 	{value: 0x0040, lo: 0xbf, hi: 0xbf},
-	// Block 0x73, offset 0x3a3
+	// Block 0x75, offset 0x3ad
 	{value: 0x0000, lo: 0x07},
 	{value: 0x0008, lo: 0x80, hi: 0xa8},
 	{value: 0x3308, lo: 0xa9, hi: 0xae},
@@ -3452,7 +3607,7 @@
 	{value: 0x3008, lo: 0xb3, hi: 0xb4},
 	{value: 0x3308, lo: 0xb5, hi: 0xb6},
 	{value: 0x0040, lo: 0xb7, hi: 0xbf},
-	// Block 0x74, offset 0x3ab
+	// Block 0x76, offset 0x3b5
 	{value: 0x0000, lo: 0x10},
 	{value: 0x0008, lo: 0x80, hi: 0x82},
 	{value: 0x3308, lo: 0x83, hi: 0x83},
@@ -3470,7 +3625,7 @@
 	{value: 0x3308, lo: 0xbc, hi: 0xbc},
 	{value: 0x3008, lo: 0xbd, hi: 0xbd},
 	{value: 0x0008, lo: 0xbe, hi: 0xbf},
-	// Block 0x75, offset 0x3bc
+	// Block 0x77, offset 0x3c6
 	{value: 0x0000, lo: 0x08},
 	{value: 0x0008, lo: 0x80, hi: 0xaf},
 	{value: 0x3308, lo: 0xb0, hi: 0xb0},
@@ -3480,7 +3635,7 @@
 	{value: 0x3308, lo: 0xb7, hi: 0xb8},
 	{value: 0x0008, lo: 0xb9, hi: 0xbd},
 	{value: 0x3308, lo: 0xbe, hi: 0xbf},
-	// Block 0x76, offset 0x3c5
+	// Block 0x78, offset 0x3cf
 	{value: 0x0000, lo: 0x0f},
 	{value: 0x0008, lo: 0x80, hi: 0x80},
 	{value: 0x3308, lo: 0x81, hi: 0x81},
@@ -3497,7 +3652,7 @@
 	{value: 0x3008, lo: 0xb5, hi: 0xb5},
 	{value: 0x3b08, lo: 0xb6, hi: 0xb6},
 	{value: 0x0040, lo: 0xb7, hi: 0xbf},
-	// Block 0x77, offset 0x3d5
+	// Block 0x79, offset 0x3df
 	{value: 0x0000, lo: 0x0c},
 	{value: 0x0040, lo: 0x80, hi: 0x80},
 	{value: 0x0008, lo: 0x81, hi: 0x86},
@@ -3511,26 +3666,26 @@
 	{value: 0x0008, lo: 0xa8, hi: 0xae},
 	{value: 0x0040, lo: 0xaf, hi: 0xaf},
 	{value: 0x0008, lo: 0xb0, hi: 0xbf},
-	// Block 0x78, offset 0x3e2
+	// Block 0x7a, offset 0x3ec
 	{value: 0x0000, lo: 0x0b},
 	{value: 0x0008, lo: 0x80, hi: 0x9a},
 	{value: 0x0018, lo: 0x9b, hi: 0x9b},
 	{value: 0x449d, lo: 0x9c, hi: 0x9c},
 	{value: 0x44b5, lo: 0x9d, hi: 0x9d},
-	{value: 0x2971, lo: 0x9e, hi: 0x9e},
+	{value: 0x0941, lo: 0x9e, hi: 0x9e},
 	{value: 0xe06d, lo: 0x9f, hi: 0x9f},
 	{value: 0x0008, lo: 0xa0, hi: 0xa8},
-	{value: 0x6ed9, lo: 0xa9, hi: 0xa9},
+	{value: 0x13f9, lo: 0xa9, hi: 0xa9},
 	{value: 0x0018, lo: 0xaa, hi: 0xab},
 	{value: 0x0040, lo: 0xac, hi: 0xaf},
 	{value: 0x44cd, lo: 0xb0, hi: 0xbf},
-	// Block 0x79, offset 0x3ee
+	// Block 0x7b, offset 0x3f8
 	{value: 0x0000, lo: 0x04},
 	{value: 0x44ed, lo: 0x80, hi: 0x8f},
 	{value: 0x450d, lo: 0x90, hi: 0x9f},
 	{value: 0x452d, lo: 0xa0, hi: 0xaf},
 	{value: 0x450d, lo: 0xb0, hi: 0xbf},
-	// Block 0x7a, offset 0x3f3
+	// Block 0x7c, offset 0x3fd
 	{value: 0x0000, lo: 0x0c},
 	{value: 0x0008, lo: 0x80, hi: 0xa2},
 	{value: 0x3008, lo: 0xa3, hi: 0xa4},
@@ -3544,76 +3699,76 @@
 	{value: 0x0040, lo: 0xae, hi: 0xaf},
 	{value: 0x0008, lo: 0xb0, hi: 0xb9},
 	{value: 0x0040, lo: 0xba, hi: 0xbf},
-	// Block 0x7b, offset 0x400
+	// Block 0x7d, offset 0x40a
 	{value: 0x0000, lo: 0x03},
 	{value: 0x0008, lo: 0x80, hi: 0xa3},
 	{value: 0x0040, lo: 0xa4, hi: 0xaf},
 	{value: 0x0018, lo: 0xb0, hi: 0xbf},
-	// Block 0x7c, offset 0x404
+	// Block 0x7e, offset 0x40e
 	{value: 0x0000, lo: 0x04},
 	{value: 0x0018, lo: 0x80, hi: 0x86},
 	{value: 0x0040, lo: 0x87, hi: 0x8a},
 	{value: 0x0018, lo: 0x8b, hi: 0xbb},
 	{value: 0x0040, lo: 0xbc, hi: 0xbf},
-	// Block 0x7d, offset 0x409
+	// Block 0x7f, offset 0x413
 	{value: 0x0000, lo: 0x01},
 	{value: 0x0040, lo: 0x80, hi: 0xbf},
-	// Block 0x7e, offset 0x40b
+	// Block 0x80, offset 0x415
 	{value: 0x0020, lo: 0x01},
 	{value: 0x454d, lo: 0x80, hi: 0xbf},
-	// Block 0x7f, offset 0x40d
+	// Block 0x81, offset 0x417
 	{value: 0x0020, lo: 0x03},
 	{value: 0x4d4d, lo: 0x80, hi: 0x94},
 	{value: 0x4b0d, lo: 0x95, hi: 0x95},
 	{value: 0x4fed, lo: 0x96, hi: 0xbf},
-	// Block 0x80, offset 0x411
+	// Block 0x82, offset 0x41b
 	{value: 0x0020, lo: 0x01},
 	{value: 0x552d, lo: 0x80, hi: 0xbf},
-	// Block 0x81, offset 0x413
+	// Block 0x83, offset 0x41d
 	{value: 0x0020, lo: 0x03},
 	{value: 0x5d2d, lo: 0x80, hi: 0x84},
 	{value: 0x568d, lo: 0x85, hi: 0x85},
 	{value: 0x5dcd, lo: 0x86, hi: 0xbf},
-	// Block 0x82, offset 0x417
+	// Block 0x84, offset 0x421
 	{value: 0x0020, lo: 0x08},
 	{value: 0x6b8d, lo: 0x80, hi: 0x8f},
 	{value: 0x6d4d, lo: 0x90, hi: 0x90},
 	{value: 0x6d8d, lo: 0x91, hi: 0xab},
-	{value: 0x6ef1, lo: 0xac, hi: 0xac},
+	{value: 0x1401, lo: 0xac, hi: 0xac},
 	{value: 0x70ed, lo: 0xad, hi: 0xad},
 	{value: 0x0040, lo: 0xae, hi: 0xae},
 	{value: 0x0040, lo: 0xaf, hi: 0xaf},
 	{value: 0x710d, lo: 0xb0, hi: 0xbf},
-	// Block 0x83, offset 0x420
+	// Block 0x85, offset 0x42a
 	{value: 0x0020, lo: 0x05},
 	{value: 0x730d, lo: 0x80, hi: 0xad},
 	{value: 0x656d, lo: 0xae, hi: 0xae},
 	{value: 0x78cd, lo: 0xaf, hi: 0xb5},
 	{value: 0x6f8d, lo: 0xb6, hi: 0xb6},
 	{value: 0x79ad, lo: 0xb7, hi: 0xbf},
-	// Block 0x84, offset 0x426
-	{value: 0x0028, lo: 0x03},
-	{value: 0x7c71, lo: 0x80, hi: 0x82},
-	{value: 0x7c31, lo: 0x83, hi: 0x83},
-	{value: 0x7ce9, lo: 0x84, hi: 0xbf},
-	// Block 0x85, offset 0x42a
-	{value: 0x0038, lo: 0x0f},
-	{value: 0x9e01, lo: 0x80, hi: 0x83},
-	{value: 0x9ea9, lo: 0x84, hi: 0x85},
-	{value: 0x9ee1, lo: 0x86, hi: 0x87},
-	{value: 0x9f19, lo: 0x88, hi: 0x8f},
+	// Block 0x86, offset 0x430
+	{value: 0x0008, lo: 0x03},
+	{value: 0x1751, lo: 0x80, hi: 0x82},
+	{value: 0x1741, lo: 0x83, hi: 0x83},
+	{value: 0x1769, lo: 0x84, hi: 0xbf},
+	// Block 0x87, offset 0x434
+	{value: 0x0008, lo: 0x0f},
+	{value: 0x1d81, lo: 0x80, hi: 0x83},
+	{value: 0x1d99, lo: 0x84, hi: 0x85},
+	{value: 0x1da1, lo: 0x86, hi: 0x87},
+	{value: 0x1da9, lo: 0x88, hi: 0x8f},
 	{value: 0x0040, lo: 0x90, hi: 0x90},
 	{value: 0x0040, lo: 0x91, hi: 0x91},
-	{value: 0xa0d9, lo: 0x92, hi: 0x97},
-	{value: 0xa1f1, lo: 0x98, hi: 0x9c},
-	{value: 0xa2d1, lo: 0x9d, hi: 0xb3},
-	{value: 0x9d91, lo: 0xb4, hi: 0xb4},
-	{value: 0x9e01, lo: 0xb5, hi: 0xb5},
-	{value: 0xa7d9, lo: 0xb6, hi: 0xbb},
-	{value: 0xa8b9, lo: 0xbc, hi: 0xbc},
-	{value: 0xa849, lo: 0xbd, hi: 0xbd},
-	{value: 0xa929, lo: 0xbe, hi: 0xbf},
-	// Block 0x86, offset 0x43a
+	{value: 0x1de9, lo: 0x92, hi: 0x97},
+	{value: 0x1e11, lo: 0x98, hi: 0x9c},
+	{value: 0x1e31, lo: 0x9d, hi: 0xb3},
+	{value: 0x1d71, lo: 0xb4, hi: 0xb4},
+	{value: 0x1d81, lo: 0xb5, hi: 0xb5},
+	{value: 0x1ee9, lo: 0xb6, hi: 0xbb},
+	{value: 0x1f09, lo: 0xbc, hi: 0xbc},
+	{value: 0x1ef9, lo: 0xbd, hi: 0xbd},
+	{value: 0x1f19, lo: 0xbe, hi: 0xbf},
+	// Block 0x88, offset 0x444
 	{value: 0x0000, lo: 0x09},
 	{value: 0x0008, lo: 0x80, hi: 0x8b},
 	{value: 0x0040, lo: 0x8c, hi: 0x8c},
@@ -3624,24 +3779,24 @@
 	{value: 0x0008, lo: 0xbc, hi: 0xbd},
 	{value: 0x0040, lo: 0xbe, hi: 0xbe},
 	{value: 0x0008, lo: 0xbf, hi: 0xbf},
-	// Block 0x87, offset 0x444
+	// Block 0x89, offset 0x44e
 	{value: 0x0000, lo: 0x04},
 	{value: 0x0008, lo: 0x80, hi: 0x8d},
 	{value: 0x0040, lo: 0x8e, hi: 0x8f},
 	{value: 0x0008, lo: 0x90, hi: 0x9d},
 	{value: 0x0040, lo: 0x9e, hi: 0xbf},
-	// Block 0x88, offset 0x449
+	// Block 0x8a, offset 0x453
 	{value: 0x0000, lo: 0x02},
 	{value: 0x0008, lo: 0x80, hi: 0xba},
 	{value: 0x0040, lo: 0xbb, hi: 0xbf},
-	// Block 0x89, offset 0x44c
+	// Block 0x8b, offset 0x456
 	{value: 0x0000, lo: 0x05},
 	{value: 0x0018, lo: 0x80, hi: 0x82},
 	{value: 0x0040, lo: 0x83, hi: 0x86},
 	{value: 0x0018, lo: 0x87, hi: 0xb3},
 	{value: 0x0040, lo: 0xb4, hi: 0xb6},
 	{value: 0x0018, lo: 0xb7, hi: 0xbf},
-	// Block 0x8a, offset 0x452
+	// Block 0x8c, offset 0x45c
 	{value: 0x0000, lo: 0x06},
 	{value: 0x0018, lo: 0x80, hi: 0x8e},
 	{value: 0x0040, lo: 0x8f, hi: 0x8f},
@@ -3649,31 +3804,31 @@
 	{value: 0x0040, lo: 0x9d, hi: 0x9f},
 	{value: 0x0018, lo: 0xa0, hi: 0xa0},
 	{value: 0x0040, lo: 0xa1, hi: 0xbf},
-	// Block 0x8b, offset 0x459
+	// Block 0x8d, offset 0x463
 	{value: 0x0000, lo: 0x04},
 	{value: 0x0040, lo: 0x80, hi: 0x8f},
 	{value: 0x0018, lo: 0x90, hi: 0xbc},
 	{value: 0x3308, lo: 0xbd, hi: 0xbd},
 	{value: 0x0040, lo: 0xbe, hi: 0xbf},
-	// Block 0x8c, offset 0x45e
+	// Block 0x8e, offset 0x468
 	{value: 0x0000, lo: 0x03},
 	{value: 0x0008, lo: 0x80, hi: 0x9c},
 	{value: 0x0040, lo: 0x9d, hi: 0x9f},
 	{value: 0x0008, lo: 0xa0, hi: 0xbf},
-	// Block 0x8d, offset 0x462
+	// Block 0x8f, offset 0x46c
 	{value: 0x0000, lo: 0x05},
 	{value: 0x0008, lo: 0x80, hi: 0x90},
 	{value: 0x0040, lo: 0x91, hi: 0x9f},
 	{value: 0x3308, lo: 0xa0, hi: 0xa0},
 	{value: 0x0018, lo: 0xa1, hi: 0xbb},
 	{value: 0x0040, lo: 0xbc, hi: 0xbf},
-	// Block 0x8e, offset 0x468
+	// Block 0x90, offset 0x472
 	{value: 0x0000, lo: 0x04},
 	{value: 0x0008, lo: 0x80, hi: 0x9f},
 	{value: 0x0018, lo: 0xa0, hi: 0xa3},
 	{value: 0x0040, lo: 0xa4, hi: 0xac},
 	{value: 0x0008, lo: 0xad, hi: 0xbf},
-	// Block 0x8f, offset 0x46d
+	// Block 0x91, offset 0x477
 	{value: 0x0000, lo: 0x08},
 	{value: 0x0008, lo: 0x80, hi: 0x80},
 	{value: 0x0018, lo: 0x81, hi: 0x81},
@@ -3683,20 +3838,20 @@
 	{value: 0x0008, lo: 0x90, hi: 0xb5},
 	{value: 0x3308, lo: 0xb6, hi: 0xba},
 	{value: 0x0040, lo: 0xbb, hi: 0xbf},
-	// Block 0x90, offset 0x476
+	// Block 0x92, offset 0x480
 	{value: 0x0000, lo: 0x04},
 	{value: 0x0008, lo: 0x80, hi: 0x9d},
 	{value: 0x0040, lo: 0x9e, hi: 0x9e},
 	{value: 0x0018, lo: 0x9f, hi: 0x9f},
 	{value: 0x0008, lo: 0xa0, hi: 0xbf},
-	// Block 0x91, offset 0x47b
+	// Block 0x93, offset 0x485
 	{value: 0x0000, lo: 0x05},
 	{value: 0x0008, lo: 0x80, hi: 0x83},
 	{value: 0x0040, lo: 0x84, hi: 0x87},
 	{value: 0x0008, lo: 0x88, hi: 0x8f},
 	{value: 0x0018, lo: 0x90, hi: 0x95},
 	{value: 0x0040, lo: 0x96, hi: 0xbf},
-	// Block 0x92, offset 0x481
+	// Block 0x94, offset 0x48b
 	{value: 0x0000, lo: 0x06},
 	{value: 0xe145, lo: 0x80, hi: 0x87},
 	{value: 0xe1c5, lo: 0x88, hi: 0x8f},
@@ -3704,7 +3859,7 @@
 	{value: 0x8b0d, lo: 0x98, hi: 0x9f},
 	{value: 0x8b25, lo: 0xa0, hi: 0xa7},
 	{value: 0x0008, lo: 0xa8, hi: 0xbf},
-	// Block 0x93, offset 0x488
+	// Block 0x95, offset 0x492
 	{value: 0x0000, lo: 0x06},
 	{value: 0x0008, lo: 0x80, hi: 0x9d},
 	{value: 0x0040, lo: 0x9e, hi: 0x9f},
@@ -3712,7 +3867,7 @@
 	{value: 0x0040, lo: 0xaa, hi: 0xaf},
 	{value: 0x8b25, lo: 0xb0, hi: 0xb7},
 	{value: 0x8b0d, lo: 0xb8, hi: 0xbf},
-	// Block 0x94, offset 0x48f
+	// Block 0x96, offset 0x499
 	{value: 0x0000, lo: 0x06},
 	{value: 0xe145, lo: 0x80, hi: 0x87},
 	{value: 0xe1c5, lo: 0x88, hi: 0x8f},
@@ -3720,28 +3875,28 @@
 	{value: 0x0040, lo: 0x94, hi: 0x97},
 	{value: 0x0008, lo: 0x98, hi: 0xbb},
 	{value: 0x0040, lo: 0xbc, hi: 0xbf},
-	// Block 0x95, offset 0x496
+	// Block 0x97, offset 0x4a0
 	{value: 0x0000, lo: 0x03},
 	{value: 0x0008, lo: 0x80, hi: 0xa7},
 	{value: 0x0040, lo: 0xa8, hi: 0xaf},
 	{value: 0x0008, lo: 0xb0, hi: 0xbf},
-	// Block 0x96, offset 0x49a
+	// Block 0x98, offset 0x4a4
 	{value: 0x0000, lo: 0x04},
 	{value: 0x0008, lo: 0x80, hi: 0xa3},
 	{value: 0x0040, lo: 0xa4, hi: 0xae},
 	{value: 0x0018, lo: 0xaf, hi: 0xaf},
 	{value: 0x0040, lo: 0xb0, hi: 0xbf},
-	// Block 0x97, offset 0x49f
+	// Block 0x99, offset 0x4a9
 	{value: 0x0000, lo: 0x02},
 	{value: 0x0008, lo: 0x80, hi: 0xb6},
 	{value: 0x0040, lo: 0xb7, hi: 0xbf},
-	// Block 0x98, offset 0x4a2
+	// Block 0x9a, offset 0x4ac
 	{value: 0x0000, lo: 0x04},
 	{value: 0x0008, lo: 0x80, hi: 0x95},
 	{value: 0x0040, lo: 0x96, hi: 0x9f},
 	{value: 0x0008, lo: 0xa0, hi: 0xa7},
 	{value: 0x0040, lo: 0xa8, hi: 0xbf},
-	// Block 0x99, offset 0x4a7
+	// Block 0x9b, offset 0x4b1
 	{value: 0x0000, lo: 0x0b},
 	{value: 0x0808, lo: 0x80, hi: 0x85},
 	{value: 0x0040, lo: 0x86, hi: 0x87},
@@ -3754,20 +3909,20 @@
 	{value: 0x0808, lo: 0xbc, hi: 0xbc},
 	{value: 0x0040, lo: 0xbd, hi: 0xbe},
 	{value: 0x0808, lo: 0xbf, hi: 0xbf},
-	// Block 0x9a, offset 0x4b3
+	// Block 0x9c, offset 0x4bd
 	{value: 0x0000, lo: 0x05},
 	{value: 0x0808, lo: 0x80, hi: 0x95},
 	{value: 0x0040, lo: 0x96, hi: 0x96},
 	{value: 0x0818, lo: 0x97, hi: 0x9f},
 	{value: 0x0808, lo: 0xa0, hi: 0xb6},
 	{value: 0x0818, lo: 0xb7, hi: 0xbf},
-	// Block 0x9b, offset 0x4b9
+	// Block 0x9d, offset 0x4c3
 	{value: 0x0000, lo: 0x04},
 	{value: 0x0808, lo: 0x80, hi: 0x9e},
 	{value: 0x0040, lo: 0x9f, hi: 0xa6},
 	{value: 0x0818, lo: 0xa7, hi: 0xaf},
 	{value: 0x0040, lo: 0xb0, hi: 0xbf},
-	// Block 0x9c, offset 0x4be
+	// Block 0x9e, offset 0x4c8
 	{value: 0x0000, lo: 0x06},
 	{value: 0x0040, lo: 0x80, hi: 0x9f},
 	{value: 0x0808, lo: 0xa0, hi: 0xb2},
@@ -3775,7 +3930,7 @@
 	{value: 0x0808, lo: 0xb4, hi: 0xb5},
 	{value: 0x0040, lo: 0xb6, hi: 0xba},
 	{value: 0x0818, lo: 0xbb, hi: 0xbf},
-	// Block 0x9d, offset 0x4c5
+	// Block 0x9f, offset 0x4cf
 	{value: 0x0000, lo: 0x07},
 	{value: 0x0808, lo: 0x80, hi: 0x95},
 	{value: 0x0818, lo: 0x96, hi: 0x9b},
@@ -3784,18 +3939,18 @@
 	{value: 0x0808, lo: 0xa0, hi: 0xb9},
 	{value: 0x0040, lo: 0xba, hi: 0xbe},
 	{value: 0x0818, lo: 0xbf, hi: 0xbf},
-	// Block 0x9e, offset 0x4cd
+	// Block 0xa0, offset 0x4d7
 	{value: 0x0000, lo: 0x04},
 	{value: 0x0808, lo: 0x80, hi: 0xb7},
 	{value: 0x0040, lo: 0xb8, hi: 0xbb},
 	{value: 0x0818, lo: 0xbc, hi: 0xbd},
 	{value: 0x0808, lo: 0xbe, hi: 0xbf},
-	// Block 0x9f, offset 0x4d2
+	// Block 0xa1, offset 0x4dc
 	{value: 0x0000, lo: 0x03},
 	{value: 0x0818, lo: 0x80, hi: 0x8f},
 	{value: 0x0040, lo: 0x90, hi: 0x91},
 	{value: 0x0818, lo: 0x92, hi: 0xbf},
-	// Block 0xa0, offset 0x4d6
+	// Block 0xa2, offset 0x4e0
 	{value: 0x0000, lo: 0x0f},
 	{value: 0x0808, lo: 0x80, hi: 0x80},
 	{value: 0x3308, lo: 0x81, hi: 0x83},
@@ -3812,7 +3967,7 @@
 	{value: 0x3308, lo: 0xb8, hi: 0xba},
 	{value: 0x0040, lo: 0xbb, hi: 0xbe},
 	{value: 0x3b08, lo: 0xbf, hi: 0xbf},
-	// Block 0xa1, offset 0x4e6
+	// Block 0xa3, offset 0x4f0
 	{value: 0x0000, lo: 0x06},
 	{value: 0x0818, lo: 0x80, hi: 0x88},
 	{value: 0x0040, lo: 0x89, hi: 0x8f},
@@ -3820,17 +3975,17 @@
 	{value: 0x0040, lo: 0x99, hi: 0x9f},
 	{value: 0x0808, lo: 0xa0, hi: 0xbc},
 	{value: 0x0818, lo: 0xbd, hi: 0xbf},
-	// Block 0xa2, offset 0x4ed
+	// Block 0xa4, offset 0x4f7
 	{value: 0x0000, lo: 0x03},
 	{value: 0x0808, lo: 0x80, hi: 0x9c},
 	{value: 0x0818, lo: 0x9d, hi: 0x9f},
 	{value: 0x0040, lo: 0xa0, hi: 0xbf},
-	// Block 0xa3, offset 0x4f1
+	// Block 0xa5, offset 0x4fb
 	{value: 0x0000, lo: 0x03},
 	{value: 0x0808, lo: 0x80, hi: 0xb5},
 	{value: 0x0040, lo: 0xb6, hi: 0xb8},
 	{value: 0x0018, lo: 0xb9, hi: 0xbf},
-	// Block 0xa4, offset 0x4f5
+	// Block 0xa6, offset 0x4ff
 	{value: 0x0000, lo: 0x06},
 	{value: 0x0808, lo: 0x80, hi: 0x95},
 	{value: 0x0040, lo: 0x96, hi: 0x97},
@@ -3838,23 +3993,23 @@
 	{value: 0x0808, lo: 0xa0, hi: 0xb2},
 	{value: 0x0040, lo: 0xb3, hi: 0xb7},
 	{value: 0x0818, lo: 0xb8, hi: 0xbf},
-	// Block 0xa5, offset 0x4fc
+	// Block 0xa7, offset 0x506
 	{value: 0x0000, lo: 0x01},
 	{value: 0x0808, lo: 0x80, hi: 0xbf},
-	// Block 0xa6, offset 0x4fe
+	// Block 0xa8, offset 0x508
 	{value: 0x0000, lo: 0x02},
 	{value: 0x0808, lo: 0x80, hi: 0x88},
 	{value: 0x0040, lo: 0x89, hi: 0xbf},
-	// Block 0xa7, offset 0x501
+	// Block 0xa9, offset 0x50b
 	{value: 0x0000, lo: 0x02},
 	{value: 0x03dd, lo: 0x80, hi: 0xb2},
 	{value: 0x0040, lo: 0xb3, hi: 0xbf},
-	// Block 0xa8, offset 0x504
+	// Block 0xaa, offset 0x50e
 	{value: 0x0000, lo: 0x03},
 	{value: 0x0808, lo: 0x80, hi: 0xb2},
 	{value: 0x0040, lo: 0xb3, hi: 0xb9},
 	{value: 0x0818, lo: 0xba, hi: 0xbf},
-	// Block 0xa9, offset 0x508
+	// Block 0xab, offset 0x512
 	{value: 0x0000, lo: 0x08},
 	{value: 0x0908, lo: 0x80, hi: 0x80},
 	{value: 0x0a08, lo: 0x81, hi: 0xa1},
@@ -3864,12 +4019,12 @@
 	{value: 0x0040, lo: 0xa8, hi: 0xaf},
 	{value: 0x0808, lo: 0xb0, hi: 0xb9},
 	{value: 0x0040, lo: 0xba, hi: 0xbf},
-	// Block 0xaa, offset 0x511
+	// Block 0xac, offset 0x51b
 	{value: 0x0000, lo: 0x03},
 	{value: 0x0040, lo: 0x80, hi: 0x9f},
 	{value: 0x0818, lo: 0xa0, hi: 0xbe},
 	{value: 0x0040, lo: 0xbf, hi: 0xbf},
-	// Block 0xab, offset 0x515
+	// Block 0xad, offset 0x51f
 	{value: 0x0000, lo: 0x07},
 	{value: 0x0808, lo: 0x80, hi: 0xa9},
 	{value: 0x0040, lo: 0xaa, hi: 0xaa},
@@ -3878,7 +4033,7 @@
 	{value: 0x0040, lo: 0xae, hi: 0xaf},
 	{value: 0x0808, lo: 0xb0, hi: 0xb1},
 	{value: 0x0040, lo: 0xb2, hi: 0xbf},
-	// Block 0xac, offset 0x51d
+	// Block 0xae, offset 0x527
 	{value: 0x0000, lo: 0x07},
 	{value: 0x0808, lo: 0x80, hi: 0x9c},
 	{value: 0x0818, lo: 0x9d, hi: 0xa6},
@@ -3887,7 +4042,7 @@
 	{value: 0x0a08, lo: 0xb0, hi: 0xb2},
 	{value: 0x0c08, lo: 0xb3, hi: 0xb3},
 	{value: 0x0a08, lo: 0xb4, hi: 0xbf},
-	// Block 0xad, offset 0x525
+	// Block 0xaf, offset 0x52f
 	{value: 0x0000, lo: 0x07},
 	{value: 0x0a08, lo: 0x80, hi: 0x84},
 	{value: 0x0808, lo: 0x85, hi: 0x85},
@@ -3896,7 +4051,7 @@
 	{value: 0x0c18, lo: 0x94, hi: 0x94},
 	{value: 0x0818, lo: 0x95, hi: 0x99},
 	{value: 0x0040, lo: 0x9a, hi: 0xbf},
-	// Block 0xae, offset 0x52d
+	// Block 0xb0, offset 0x537
 	{value: 0x0000, lo: 0x0b},
 	{value: 0x0040, lo: 0x80, hi: 0xaf},
 	{value: 0x0a08, lo: 0xb0, hi: 0xb0},
@@ -3909,7 +4064,7 @@
 	{value: 0x0a08, lo: 0xbb, hi: 0xbc},
 	{value: 0x0c08, lo: 0xbd, hi: 0xbd},
 	{value: 0x0a08, lo: 0xbe, hi: 0xbf},
-	// Block 0xaf, offset 0x539
+	// Block 0xb1, offset 0x543
 	{value: 0x0000, lo: 0x0b},
 	{value: 0x0808, lo: 0x80, hi: 0x80},
 	{value: 0x0a08, lo: 0x81, hi: 0x81},
@@ -3922,14 +4077,14 @@
 	{value: 0x0040, lo: 0x8c, hi: 0x9f},
 	{value: 0x0808, lo: 0xa0, hi: 0xb6},
 	{value: 0x0040, lo: 0xb7, hi: 0xbf},
-	// Block 0xb0, offset 0x545
+	// Block 0xb2, offset 0x54f
 	{value: 0x0000, lo: 0x05},
 	{value: 0x3008, lo: 0x80, hi: 0x80},
 	{value: 0x3308, lo: 0x81, hi: 0x81},
 	{value: 0x3008, lo: 0x82, hi: 0x82},
 	{value: 0x0008, lo: 0x83, hi: 0xb7},
 	{value: 0x3308, lo: 0xb8, hi: 0xbf},
-	// Block 0xb1, offset 0x54b
+	// Block 0xb3, offset 0x555
 	{value: 0x0000, lo: 0x08},
 	{value: 0x3308, lo: 0x80, hi: 0x85},
 	{value: 0x3b08, lo: 0x86, hi: 0x86},
@@ -3939,7 +4094,7 @@
 	{value: 0x0008, lo: 0xa6, hi: 0xaf},
 	{value: 0x0040, lo: 0xb0, hi: 0xbe},
 	{value: 0x3b08, lo: 0xbf, hi: 0xbf},
-	// Block 0xb2, offset 0x554
+	// Block 0xb4, offset 0x55e
 	{value: 0x0000, lo: 0x0b},
 	{value: 0x3308, lo: 0x80, hi: 0x81},
 	{value: 0x3008, lo: 0x82, hi: 0x82},
@@ -3952,7 +4107,7 @@
 	{value: 0x0018, lo: 0xbb, hi: 0xbc},
 	{value: 0x0040, lo: 0xbd, hi: 0xbd},
 	{value: 0x0018, lo: 0xbe, hi: 0xbf},
-	// Block 0xb3, offset 0x560
+	// Block 0xb5, offset 0x56a
 	{value: 0x0000, lo: 0x06},
 	{value: 0x0018, lo: 0x80, hi: 0x81},
 	{value: 0x0040, lo: 0x82, hi: 0x8f},
@@ -3960,7 +4115,7 @@
 	{value: 0x0040, lo: 0xa9, hi: 0xaf},
 	{value: 0x0008, lo: 0xb0, hi: 0xb9},
 	{value: 0x0040, lo: 0xba, hi: 0xbf},
-	// Block 0xb4, offset 0x567
+	// Block 0xb6, offset 0x571
 	{value: 0x0000, lo: 0x08},
 	{value: 0x3308, lo: 0x80, hi: 0x82},
 	{value: 0x0008, lo: 0x83, hi: 0xa6},
@@ -3970,7 +4125,7 @@
 	{value: 0x3b08, lo: 0xb3, hi: 0xb4},
 	{value: 0x0040, lo: 0xb5, hi: 0xb5},
 	{value: 0x0008, lo: 0xb6, hi: 0xbf},
-	// Block 0xb5, offset 0x570
+	// Block 0xb7, offset 0x57a
 	{value: 0x0000, lo: 0x0a},
 	{value: 0x0018, lo: 0x80, hi: 0x83},
 	{value: 0x0008, lo: 0x84, hi: 0x84},
@@ -3982,7 +4137,7 @@
 	{value: 0x0018, lo: 0xb4, hi: 0xb5},
 	{value: 0x0008, lo: 0xb6, hi: 0xb6},
 	{value: 0x0040, lo: 0xb7, hi: 0xbf},
-	// Block 0xb6, offset 0x57b
+	// Block 0xb8, offset 0x585
 	{value: 0x0000, lo: 0x06},
 	{value: 0x3308, lo: 0x80, hi: 0x81},
 	{value: 0x3008, lo: 0x82, hi: 0x82},
@@ -3990,7 +4145,7 @@
 	{value: 0x3008, lo: 0xb3, hi: 0xb5},
 	{value: 0x3308, lo: 0xb6, hi: 0xbe},
 	{value: 0x3008, lo: 0xbf, hi: 0xbf},
-	// Block 0xb7, offset 0x582
+	// Block 0xb9, offset 0x58c
 	{value: 0x0000, lo: 0x0e},
 	{value: 0x3808, lo: 0x80, hi: 0x80},
 	{value: 0x0008, lo: 0x81, hi: 0x84},
@@ -4006,7 +4161,7 @@
 	{value: 0x0040, lo: 0xa0, hi: 0xa0},
 	{value: 0x0018, lo: 0xa1, hi: 0xb4},
 	{value: 0x0040, lo: 0xb5, hi: 0xbf},
-	// Block 0xb8, offset 0x591
+	// Block 0xba, offset 0x59b
 	{value: 0x0000, lo: 0x0c},
 	{value: 0x0008, lo: 0x80, hi: 0x91},
 	{value: 0x0040, lo: 0x92, hi: 0x92},
@@ -4020,7 +4175,7 @@
 	{value: 0x0018, lo: 0xb8, hi: 0xbd},
 	{value: 0x3308, lo: 0xbe, hi: 0xbe},
 	{value: 0x0040, lo: 0xbf, hi: 0xbf},
-	// Block 0xb9, offset 0x59e
+	// Block 0xbb, offset 0x5a8
 	{value: 0x0000, lo: 0x0c},
 	{value: 0x0008, lo: 0x80, hi: 0x86},
 	{value: 0x0040, lo: 0x87, hi: 0x87},
@@ -4034,7 +4189,7 @@
 	{value: 0x0018, lo: 0xa9, hi: 0xa9},
 	{value: 0x0040, lo: 0xaa, hi: 0xaf},
 	{value: 0x0008, lo: 0xb0, hi: 0xbf},
-	// Block 0xba, offset 0x5ab
+	// Block 0xbc, offset 0x5b5
 	{value: 0x0000, lo: 0x08},
 	{value: 0x0008, lo: 0x80, hi: 0x9e},
 	{value: 0x3308, lo: 0x9f, hi: 0x9f},
@@ -4044,12 +4199,12 @@
 	{value: 0x0040, lo: 0xab, hi: 0xaf},
 	{value: 0x0008, lo: 0xb0, hi: 0xb9},
 	{value: 0x0040, lo: 0xba, hi: 0xbf},
-	// Block 0xbb, offset 0x5b4
+	// Block 0xbd, offset 0x5be
 	{value: 0x0000, lo: 0x03},
 	{value: 0x0008, lo: 0x80, hi: 0xb4},
 	{value: 0x3008, lo: 0xb5, hi: 0xb7},
 	{value: 0x3308, lo: 0xb8, hi: 0xbf},
-	// Block 0xbc, offset 0x5b8
+	// Block 0xbe, offset 0x5c2
 	{value: 0x0000, lo: 0x0e},
 	{value: 0x3008, lo: 0x80, hi: 0x81},
 	{value: 0x3b08, lo: 0x82, hi: 0x82},
@@ -4065,7 +4220,7 @@
 	{value: 0x3308, lo: 0x9e, hi: 0x9e},
 	{value: 0x0008, lo: 0x9f, hi: 0xa1},
 	{value: 0x0040, lo: 0xa2, hi: 0xbf},
-	// Block 0xbd, offset 0x5c7
+	// Block 0xbf, offset 0x5d1
 	{value: 0x0000, lo: 0x07},
 	{value: 0x0008, lo: 0x80, hi: 0xaf},
 	{value: 0x3008, lo: 0xb0, hi: 0xb2},
@@ -4074,7 +4229,7 @@
 	{value: 0x3308, lo: 0xba, hi: 0xba},
 	{value: 0x3008, lo: 0xbb, hi: 0xbe},
 	{value: 0x3308, lo: 0xbf, hi: 0xbf},
-	// Block 0xbe, offset 0x5cf
+	// Block 0xc0, offset 0x5d9
 	{value: 0x0000, lo: 0x0a},
 	{value: 0x3308, lo: 0x80, hi: 0x80},
 	{value: 0x3008, lo: 0x81, hi: 0x81},
@@ -4086,7 +4241,7 @@
 	{value: 0x0040, lo: 0x88, hi: 0x8f},
 	{value: 0x0008, lo: 0x90, hi: 0x99},
 	{value: 0x0040, lo: 0x9a, hi: 0xbf},
-	// Block 0xbf, offset 0x5da
+	// Block 0xc1, offset 0x5e4
 	{value: 0x0000, lo: 0x08},
 	{value: 0x0008, lo: 0x80, hi: 0xae},
 	{value: 0x3008, lo: 0xaf, hi: 0xb1},
@@ -4096,14 +4251,14 @@
 	{value: 0x3308, lo: 0xbc, hi: 0xbd},
 	{value: 0x3008, lo: 0xbe, hi: 0xbe},
 	{value: 0x3b08, lo: 0xbf, hi: 0xbf},
-	// Block 0xc0, offset 0x5e3
+	// Block 0xc2, offset 0x5ed
 	{value: 0x0000, lo: 0x05},
 	{value: 0x3308, lo: 0x80, hi: 0x80},
 	{value: 0x0018, lo: 0x81, hi: 0x97},
 	{value: 0x0008, lo: 0x98, hi: 0x9b},
 	{value: 0x3308, lo: 0x9c, hi: 0x9d},
 	{value: 0x0040, lo: 0x9e, hi: 0xbf},
-	// Block 0xc1, offset 0x5e9
+	// Block 0xc3, offset 0x5f3
 	{value: 0x0000, lo: 0x07},
 	{value: 0x0008, lo: 0x80, hi: 0xaf},
 	{value: 0x3008, lo: 0xb0, hi: 0xb2},
@@ -4112,7 +4267,7 @@
 	{value: 0x3308, lo: 0xbd, hi: 0xbd},
 	{value: 0x3008, lo: 0xbe, hi: 0xbe},
 	{value: 0x3b08, lo: 0xbf, hi: 0xbf},
-	// Block 0xc2, offset 0x5f1
+	// Block 0xc4, offset 0x5fb
 	{value: 0x0000, lo: 0x08},
 	{value: 0x3308, lo: 0x80, hi: 0x80},
 	{value: 0x0018, lo: 0x81, hi: 0x83},
@@ -4122,7 +4277,7 @@
 	{value: 0x0040, lo: 0x9a, hi: 0x9f},
 	{value: 0x0018, lo: 0xa0, hi: 0xac},
 	{value: 0x0040, lo: 0xad, hi: 0xbf},
-	// Block 0xc3, offset 0x5fa
+	// Block 0xc5, offset 0x604
 	{value: 0x0000, lo: 0x0a},
 	{value: 0x0008, lo: 0x80, hi: 0xaa},
 	{value: 0x3308, lo: 0xab, hi: 0xab},
@@ -4134,11 +4289,11 @@
 	{value: 0x3308, lo: 0xb7, hi: 0xb7},
 	{value: 0x0008, lo: 0xb8, hi: 0xb8},
 	{value: 0x0040, lo: 0xb9, hi: 0xbf},
-	// Block 0xc4, offset 0x605
+	// Block 0xc6, offset 0x60f
 	{value: 0x0000, lo: 0x02},
 	{value: 0x0008, lo: 0x80, hi: 0x89},
 	{value: 0x0040, lo: 0x8a, hi: 0xbf},
-	// Block 0xc5, offset 0x608
+	// Block 0xc7, offset 0x612
 	{value: 0x0000, lo: 0x0b},
 	{value: 0x0008, lo: 0x80, hi: 0x9a},
 	{value: 0x0040, lo: 0x9b, hi: 0x9c},
@@ -4151,7 +4306,7 @@
 	{value: 0x0040, lo: 0xac, hi: 0xaf},
 	{value: 0x0008, lo: 0xb0, hi: 0xb9},
 	{value: 0x0018, lo: 0xba, hi: 0xbf},
-	// Block 0xc6, offset 0x614
+	// Block 0xc8, offset 0x61e
 	{value: 0x0000, lo: 0x08},
 	{value: 0x0008, lo: 0x80, hi: 0xab},
 	{value: 0x3008, lo: 0xac, hi: 0xae},
@@ -4161,17 +4316,17 @@
 	{value: 0x3308, lo: 0xba, hi: 0xba},
 	{value: 0x0018, lo: 0xbb, hi: 0xbb},
 	{value: 0x0040, lo: 0xbc, hi: 0xbf},
-	// Block 0xc7, offset 0x61d
+	// Block 0xc9, offset 0x627
 	{value: 0x0000, lo: 0x02},
 	{value: 0x0040, lo: 0x80, hi: 0x9f},
 	{value: 0x049d, lo: 0xa0, hi: 0xbf},
-	// Block 0xc8, offset 0x620
+	// Block 0xca, offset 0x62a
 	{value: 0x0000, lo: 0x04},
 	{value: 0x0008, lo: 0x80, hi: 0xa9},
 	{value: 0x0018, lo: 0xaa, hi: 0xb2},
 	{value: 0x0040, lo: 0xb3, hi: 0xbe},
 	{value: 0x0008, lo: 0xbf, hi: 0xbf},
-	// Block 0xc9, offset 0x625
+	// Block 0xcb, offset 0x62f
 	{value: 0x0000, lo: 0x08},
 	{value: 0x3008, lo: 0x80, hi: 0x80},
 	{value: 0x0008, lo: 0x81, hi: 0x81},
@@ -4181,13 +4336,13 @@
 	{value: 0x0040, lo: 0x87, hi: 0x8f},
 	{value: 0x0008, lo: 0x90, hi: 0x99},
 	{value: 0x0040, lo: 0x9a, hi: 0xbf},
-	// Block 0xca, offset 0x62e
+	// Block 0xcc, offset 0x638
 	{value: 0x0000, lo: 0x04},
 	{value: 0x0040, lo: 0x80, hi: 0x9f},
 	{value: 0x0008, lo: 0xa0, hi: 0xa7},
 	{value: 0x0040, lo: 0xa8, hi: 0xa9},
 	{value: 0x0008, lo: 0xaa, hi: 0xbf},
-	// Block 0xcb, offset 0x633
+	// Block 0xcd, offset 0x63d
 	{value: 0x0000, lo: 0x0c},
 	{value: 0x0008, lo: 0x80, hi: 0x90},
 	{value: 0x3008, lo: 0x91, hi: 0x93},
@@ -4201,7 +4356,7 @@
 	{value: 0x0008, lo: 0xa3, hi: 0xa3},
 	{value: 0x3008, lo: 0xa4, hi: 0xa4},
 	{value: 0x0040, lo: 0xa5, hi: 0xbf},
-	// Block 0xcc, offset 0x640
+	// Block 0xce, offset 0x64a
 	{value: 0x0000, lo: 0x0a},
 	{value: 0x0008, lo: 0x80, hi: 0x80},
 	{value: 0x3308, lo: 0x81, hi: 0x8a},
@@ -4213,7 +4368,7 @@
 	{value: 0x0008, lo: 0xba, hi: 0xba},
 	{value: 0x3308, lo: 0xbb, hi: 0xbe},
 	{value: 0x0018, lo: 0xbf, hi: 0xbf},
-	// Block 0xcd, offset 0x64b
+	// Block 0xcf, offset 0x655
 	{value: 0x0000, lo: 0x08},
 	{value: 0x0018, lo: 0x80, hi: 0x86},
 	{value: 0x3b08, lo: 0x87, hi: 0x87},
@@ -4223,7 +4378,7 @@
 	{value: 0x3008, lo: 0x97, hi: 0x98},
 	{value: 0x3308, lo: 0x99, hi: 0x9b},
 	{value: 0x0008, lo: 0x9c, hi: 0xbf},
-	// Block 0xce, offset 0x654
+	// Block 0xd0, offset 0x65e
 	{value: 0x0000, lo: 0x09},
 	{value: 0x0008, lo: 0x80, hi: 0x89},
 	{value: 0x3308, lo: 0x8a, hi: 0x96},
@@ -4234,11 +4389,11 @@
 	{value: 0x0008, lo: 0x9d, hi: 0x9d},
 	{value: 0x0018, lo: 0x9e, hi: 0xa2},
 	{value: 0x0040, lo: 0xa3, hi: 0xbf},
-	// Block 0xcf, offset 0x65e
+	// Block 0xd1, offset 0x668
 	{value: 0x0000, lo: 0x02},
 	{value: 0x0008, lo: 0x80, hi: 0xb8},
 	{value: 0x0040, lo: 0xb9, hi: 0xbf},
-	// Block 0xd0, offset 0x661
+	// Block 0xd2, offset 0x66b
 	{value: 0x0000, lo: 0x09},
 	{value: 0x0008, lo: 0x80, hi: 0x88},
 	{value: 0x0040, lo: 0x89, hi: 0x89},
@@ -4249,7 +4404,7 @@
 	{value: 0x3308, lo: 0xb8, hi: 0xbd},
 	{value: 0x3008, lo: 0xbe, hi: 0xbe},
 	{value: 0x3b08, lo: 0xbf, hi: 0xbf},
-	// Block 0xd1, offset 0x66b
+	// Block 0xd3, offset 0x675
 	{value: 0x0000, lo: 0x08},
 	{value: 0x0008, lo: 0x80, hi: 0x80},
 	{value: 0x0018, lo: 0x81, hi: 0x85},
@@ -4259,7 +4414,7 @@
 	{value: 0x0040, lo: 0xad, hi: 0xaf},
 	{value: 0x0018, lo: 0xb0, hi: 0xb1},
 	{value: 0x0008, lo: 0xb2, hi: 0xbf},
-	// Block 0xd2, offset 0x674
+	// Block 0xd4, offset 0x67e
 	{value: 0x0000, lo: 0x0b},
 	{value: 0x0008, lo: 0x80, hi: 0x8f},
 	{value: 0x0040, lo: 0x90, hi: 0x91},
@@ -4272,7 +4427,7 @@
 	{value: 0x3008, lo: 0xb4, hi: 0xb4},
 	{value: 0x3308, lo: 0xb5, hi: 0xb6},
 	{value: 0x0040, lo: 0xb7, hi: 0xbf},
-	// Block 0xd3, offset 0x680
+	// Block 0xd5, offset 0x68a
 	{value: 0x0000, lo: 0x0c},
 	{value: 0x0008, lo: 0x80, hi: 0x86},
 	{value: 0x0040, lo: 0x87, hi: 0x87},
@@ -4286,7 +4441,7 @@
 	{value: 0x3308, lo: 0xbc, hi: 0xbd},
 	{value: 0x0040, lo: 0xbe, hi: 0xbe},
 	{value: 0x3308, lo: 0xbf, hi: 0xbf},
-	// Block 0xd4, offset 0x68d
+	// Block 0xd6, offset 0x697
 	{value: 0x0000, lo: 0x0c},
 	{value: 0x3308, lo: 0x80, hi: 0x83},
 	{value: 0x3b08, lo: 0x84, hi: 0x85},
@@ -4300,7 +4455,7 @@
 	{value: 0x0008, lo: 0xa7, hi: 0xa8},
 	{value: 0x0040, lo: 0xa9, hi: 0xa9},
 	{value: 0x0008, lo: 0xaa, hi: 0xbf},
-	// Block 0xd5, offset 0x69a
+	// Block 0xd7, offset 0x6a4
 	{value: 0x0000, lo: 0x0d},
 	{value: 0x0008, lo: 0x80, hi: 0x89},
 	{value: 0x3008, lo: 0x8a, hi: 0x8e},
@@ -4315,7 +4470,7 @@
 	{value: 0x0040, lo: 0x99, hi: 0x9f},
 	{value: 0x0008, lo: 0xa0, hi: 0xa9},
 	{value: 0x0040, lo: 0xaa, hi: 0xbf},
-	// Block 0xd6, offset 0x6a8
+	// Block 0xd8, offset 0x6b2
 	{value: 0x0000, lo: 0x06},
 	{value: 0x0040, lo: 0x80, hi: 0x9f},
 	{value: 0x0008, lo: 0xa0, hi: 0xb2},
@@ -4323,41 +4478,41 @@
 	{value: 0x3008, lo: 0xb5, hi: 0xb6},
 	{value: 0x0018, lo: 0xb7, hi: 0xb8},
 	{value: 0x0040, lo: 0xb9, hi: 0xbf},
-	// Block 0xd7, offset 0x6af
+	// Block 0xd9, offset 0x6b9
 	{value: 0x0000, lo: 0x03},
 	{value: 0x0040, lo: 0x80, hi: 0xaf},
 	{value: 0x0008, lo: 0xb0, hi: 0xb0},
 	{value: 0x0040, lo: 0xb1, hi: 0xbf},
-	// Block 0xd8, offset 0x6b3
+	// Block 0xda, offset 0x6bd
 	{value: 0x0000, lo: 0x03},
 	{value: 0x0018, lo: 0x80, hi: 0xb1},
 	{value: 0x0040, lo: 0xb2, hi: 0xbe},
 	{value: 0x0018, lo: 0xbf, hi: 0xbf},
-	// Block 0xd9, offset 0x6b7
+	// Block 0xdb, offset 0x6c1
 	{value: 0x0000, lo: 0x02},
 	{value: 0x0008, lo: 0x80, hi: 0x99},
 	{value: 0x0040, lo: 0x9a, hi: 0xbf},
-	// Block 0xda, offset 0x6ba
+	// Block 0xdc, offset 0x6c4
 	{value: 0x0000, lo: 0x04},
 	{value: 0x0018, lo: 0x80, hi: 0xae},
 	{value: 0x0040, lo: 0xaf, hi: 0xaf},
 	{value: 0x0018, lo: 0xb0, hi: 0xb4},
 	{value: 0x0040, lo: 0xb5, hi: 0xbf},
-	// Block 0xdb, offset 0x6bf
+	// Block 0xdd, offset 0x6c9
 	{value: 0x0000, lo: 0x02},
 	{value: 0x0008, lo: 0x80, hi: 0x83},
 	{value: 0x0040, lo: 0x84, hi: 0xbf},
-	// Block 0xdc, offset 0x6c2
+	// Block 0xde, offset 0x6cc
 	{value: 0x0000, lo: 0x04},
 	{value: 0x0008, lo: 0x80, hi: 0xae},
 	{value: 0x0040, lo: 0xaf, hi: 0xaf},
 	{value: 0x0340, lo: 0xb0, hi: 0xb8},
 	{value: 0x0040, lo: 0xb9, hi: 0xbf},
-	// Block 0xdd, offset 0x6c7
+	// Block 0xdf, offset 0x6d1
 	{value: 0x0000, lo: 0x02},
 	{value: 0x0008, lo: 0x80, hi: 0x86},
 	{value: 0x0040, lo: 0x87, hi: 0xbf},
-	// Block 0xde, offset 0x6ca
+	// Block 0xe0, offset 0x6d4
 	{value: 0x0000, lo: 0x06},
 	{value: 0x0008, lo: 0x80, hi: 0x9e},
 	{value: 0x0040, lo: 0x9f, hi: 0x9f},
@@ -4365,7 +4520,7 @@
 	{value: 0x0040, lo: 0xaa, hi: 0xad},
 	{value: 0x0018, lo: 0xae, hi: 0xaf},
 	{value: 0x0040, lo: 0xb0, hi: 0xbf},
-	// Block 0xdf, offset 0x6d1
+	// Block 0xe1, offset 0x6db
 	{value: 0x0000, lo: 0x06},
 	{value: 0x0040, lo: 0x80, hi: 0x8f},
 	{value: 0x0008, lo: 0x90, hi: 0xad},
@@ -4373,12 +4528,12 @@
 	{value: 0x3308, lo: 0xb0, hi: 0xb4},
 	{value: 0x0018, lo: 0xb5, hi: 0xb5},
 	{value: 0x0040, lo: 0xb6, hi: 0xbf},
-	// Block 0xe0, offset 0x6d8
+	// Block 0xe2, offset 0x6e2
 	{value: 0x0000, lo: 0x03},
 	{value: 0x0008, lo: 0x80, hi: 0xaf},
 	{value: 0x3308, lo: 0xb0, hi: 0xb6},
 	{value: 0x0018, lo: 0xb7, hi: 0xbf},
-	// Block 0xe1, offset 0x6dc
+	// Block 0xe3, offset 0x6e6
 	{value: 0x0000, lo: 0x0a},
 	{value: 0x0008, lo: 0x80, hi: 0x83},
 	{value: 0x0018, lo: 0x84, hi: 0x85},
@@ -4390,33 +4545,33 @@
 	{value: 0x0008, lo: 0xa3, hi: 0xb7},
 	{value: 0x0040, lo: 0xb8, hi: 0xbc},
 	{value: 0x0008, lo: 0xbd, hi: 0xbf},
-	// Block 0xe2, offset 0x6e7
+	// Block 0xe4, offset 0x6f1
 	{value: 0x0000, lo: 0x02},
 	{value: 0x0008, lo: 0x80, hi: 0x8f},
 	{value: 0x0040, lo: 0x90, hi: 0xbf},
-	// Block 0xe3, offset 0x6ea
+	// Block 0xe5, offset 0x6f4
 	{value: 0x0000, lo: 0x02},
 	{value: 0xe105, lo: 0x80, hi: 0x9f},
 	{value: 0x0008, lo: 0xa0, hi: 0xbf},
-	// Block 0xe4, offset 0x6ed
+	// Block 0xe6, offset 0x6f7
 	{value: 0x0000, lo: 0x02},
 	{value: 0x0018, lo: 0x80, hi: 0x9a},
 	{value: 0x0040, lo: 0x9b, hi: 0xbf},
-	// Block 0xe5, offset 0x6f0
+	// Block 0xe7, offset 0x6fa
 	{value: 0x0000, lo: 0x05},
 	{value: 0x0008, lo: 0x80, hi: 0x8a},
 	{value: 0x0040, lo: 0x8b, hi: 0x8e},
 	{value: 0x3308, lo: 0x8f, hi: 0x8f},
 	{value: 0x0008, lo: 0x90, hi: 0x90},
 	{value: 0x3008, lo: 0x91, hi: 0xbf},
-	// Block 0xe6, offset 0x6f6
+	// Block 0xe8, offset 0x700
 	{value: 0x0000, lo: 0x05},
 	{value: 0x3008, lo: 0x80, hi: 0x87},
 	{value: 0x0040, lo: 0x88, hi: 0x8e},
 	{value: 0x3308, lo: 0x8f, hi: 0x92},
 	{value: 0x0008, lo: 0x93, hi: 0x9f},
 	{value: 0x0040, lo: 0xa0, hi: 0xbf},
-	// Block 0xe7, offset 0x6fc
+	// Block 0xe9, offset 0x706
 	{value: 0x0000, lo: 0x08},
 	{value: 0x0040, lo: 0x80, hi: 0x9f},
 	{value: 0x0008, lo: 0xa0, hi: 0xa1},
@@ -4426,23 +4581,23 @@
 	{value: 0x0040, lo: 0xa5, hi: 0xaf},
 	{value: 0x3008, lo: 0xb0, hi: 0xb1},
 	{value: 0x0040, lo: 0xb2, hi: 0xbf},
-	// Block 0xe8, offset 0x705
+	// Block 0xea, offset 0x70f
 	{value: 0x0000, lo: 0x02},
 	{value: 0x0008, lo: 0x80, hi: 0xb7},
 	{value: 0x0040, lo: 0xb8, hi: 0xbf},
-	// Block 0xe9, offset 0x708
+	// Block 0xeb, offset 0x712
 	{value: 0x0000, lo: 0x02},
 	{value: 0x0008, lo: 0x80, hi: 0x95},
 	{value: 0x0040, lo: 0x96, hi: 0xbf},
-	// Block 0xea, offset 0x70b
+	// Block 0xec, offset 0x715
 	{value: 0x0000, lo: 0x02},
 	{value: 0x0008, lo: 0x80, hi: 0x88},
 	{value: 0x0040, lo: 0x89, hi: 0xbf},
-	// Block 0xeb, offset 0x70e
+	// Block 0xed, offset 0x718
 	{value: 0x0000, lo: 0x02},
 	{value: 0x0008, lo: 0x80, hi: 0x9e},
 	{value: 0x0040, lo: 0x9f, hi: 0xbf},
-	// Block 0xec, offset 0x711
+	// Block 0xee, offset 0x71b
 	{value: 0x0000, lo: 0x06},
 	{value: 0x0040, lo: 0x80, hi: 0x8f},
 	{value: 0x0008, lo: 0x90, hi: 0x92},
@@ -4450,17 +4605,17 @@
 	{value: 0x0008, lo: 0xa4, hi: 0xa7},
 	{value: 0x0040, lo: 0xa8, hi: 0xaf},
 	{value: 0x0008, lo: 0xb0, hi: 0xbf},
-	// Block 0xed, offset 0x718
+	// Block 0xef, offset 0x722
 	{value: 0x0000, lo: 0x02},
 	{value: 0x0008, lo: 0x80, hi: 0xbb},
 	{value: 0x0040, lo: 0xbc, hi: 0xbf},
-	// Block 0xee, offset 0x71b
+	// Block 0xf0, offset 0x725
 	{value: 0x0000, lo: 0x04},
 	{value: 0x0008, lo: 0x80, hi: 0xaa},
 	{value: 0x0040, lo: 0xab, hi: 0xaf},
 	{value: 0x0008, lo: 0xb0, hi: 0xbc},
 	{value: 0x0040, lo: 0xbd, hi: 0xbf},
-	// Block 0xef, offset 0x720
+	// Block 0xf1, offset 0x72a
 	{value: 0x0000, lo: 0x09},
 	{value: 0x0008, lo: 0x80, hi: 0x88},
 	{value: 0x0040, lo: 0x89, hi: 0x8f},
@@ -4471,32 +4626,32 @@
 	{value: 0x0018, lo: 0x9f, hi: 0x9f},
 	{value: 0x03c0, lo: 0xa0, hi: 0xa3},
 	{value: 0x0040, lo: 0xa4, hi: 0xbf},
-	// Block 0xf0, offset 0x72a
+	// Block 0xf2, offset 0x734
 	{value: 0x0000, lo: 0x02},
 	{value: 0x0018, lo: 0x80, hi: 0xb5},
 	{value: 0x0040, lo: 0xb6, hi: 0xbf},
-	// Block 0xf1, offset 0x72d
+	// Block 0xf3, offset 0x737
 	{value: 0x0000, lo: 0x03},
 	{value: 0x0018, lo: 0x80, hi: 0xa6},
 	{value: 0x0040, lo: 0xa7, hi: 0xa8},
 	{value: 0x0018, lo: 0xa9, hi: 0xbf},
-	// Block 0xf2, offset 0x731
+	// Block 0xf4, offset 0x73b
 	{value: 0x0000, lo: 0x0e},
 	{value: 0x0018, lo: 0x80, hi: 0x9d},
-	{value: 0xb609, lo: 0x9e, hi: 0x9e},
-	{value: 0xb651, lo: 0x9f, hi: 0x9f},
-	{value: 0xb699, lo: 0xa0, hi: 0xa0},
-	{value: 0xb701, lo: 0xa1, hi: 0xa1},
-	{value: 0xb769, lo: 0xa2, hi: 0xa2},
-	{value: 0xb7d1, lo: 0xa3, hi: 0xa3},
-	{value: 0xb839, lo: 0xa4, hi: 0xa4},
+	{value: 0x2211, lo: 0x9e, hi: 0x9e},
+	{value: 0x2219, lo: 0x9f, hi: 0x9f},
+	{value: 0x2221, lo: 0xa0, hi: 0xa0},
+	{value: 0x2229, lo: 0xa1, hi: 0xa1},
+	{value: 0x2231, lo: 0xa2, hi: 0xa2},
+	{value: 0x2239, lo: 0xa3, hi: 0xa3},
+	{value: 0x2241, lo: 0xa4, hi: 0xa4},
 	{value: 0x3018, lo: 0xa5, hi: 0xa6},
 	{value: 0x3318, lo: 0xa7, hi: 0xa9},
 	{value: 0x0018, lo: 0xaa, hi: 0xac},
 	{value: 0x3018, lo: 0xad, hi: 0xb2},
 	{value: 0x0340, lo: 0xb3, hi: 0xba},
 	{value: 0x3318, lo: 0xbb, hi: 0xbf},
-	// Block 0xf3, offset 0x740
+	// Block 0xf5, offset 0x74a
 	{value: 0x0000, lo: 0x0b},
 	{value: 0x3318, lo: 0x80, hi: 0x82},
 	{value: 0x0018, lo: 0x83, hi: 0x84},
@@ -4504,45 +4659,45 @@
 	{value: 0x0018, lo: 0x8c, hi: 0xa9},
 	{value: 0x3318, lo: 0xaa, hi: 0xad},
 	{value: 0x0018, lo: 0xae, hi: 0xba},
-	{value: 0xb8a1, lo: 0xbb, hi: 0xbb},
-	{value: 0xb8e9, lo: 0xbc, hi: 0xbc},
-	{value: 0xb931, lo: 0xbd, hi: 0xbd},
-	{value: 0xb999, lo: 0xbe, hi: 0xbe},
-	{value: 0xba01, lo: 0xbf, hi: 0xbf},
-	// Block 0xf4, offset 0x74c
+	{value: 0x2249, lo: 0xbb, hi: 0xbb},
+	{value: 0x2251, lo: 0xbc, hi: 0xbc},
+	{value: 0x2259, lo: 0xbd, hi: 0xbd},
+	{value: 0x2261, lo: 0xbe, hi: 0xbe},
+	{value: 0x2269, lo: 0xbf, hi: 0xbf},
+	// Block 0xf6, offset 0x756
 	{value: 0x0000, lo: 0x03},
-	{value: 0xba69, lo: 0x80, hi: 0x80},
+	{value: 0x2271, lo: 0x80, hi: 0x80},
 	{value: 0x0018, lo: 0x81, hi: 0xa8},
 	{value: 0x0040, lo: 0xa9, hi: 0xbf},
-	// Block 0xf5, offset 0x750
+	// Block 0xf7, offset 0x75a
 	{value: 0x0000, lo: 0x04},
 	{value: 0x0018, lo: 0x80, hi: 0x81},
 	{value: 0x3318, lo: 0x82, hi: 0x84},
 	{value: 0x0018, lo: 0x85, hi: 0x85},
 	{value: 0x0040, lo: 0x86, hi: 0xbf},
-	// Block 0xf6, offset 0x755
+	// Block 0xf8, offset 0x75f
 	{value: 0x0000, lo: 0x03},
 	{value: 0x0040, lo: 0x80, hi: 0x9f},
 	{value: 0x0018, lo: 0xa0, hi: 0xb3},
 	{value: 0x0040, lo: 0xb4, hi: 0xbf},
-	// Block 0xf7, offset 0x759
+	// Block 0xf9, offset 0x763
 	{value: 0x0000, lo: 0x04},
 	{value: 0x0018, lo: 0x80, hi: 0x96},
 	{value: 0x0040, lo: 0x97, hi: 0x9f},
 	{value: 0x0018, lo: 0xa0, hi: 0xb8},
 	{value: 0x0040, lo: 0xb9, hi: 0xbf},
-	// Block 0xf8, offset 0x75e
+	// Block 0xfa, offset 0x768
 	{value: 0x0000, lo: 0x03},
 	{value: 0x3308, lo: 0x80, hi: 0xb6},
 	{value: 0x0018, lo: 0xb7, hi: 0xba},
 	{value: 0x3308, lo: 0xbb, hi: 0xbf},
-	// Block 0xf9, offset 0x762
+	// Block 0xfb, offset 0x76c
 	{value: 0x0000, lo: 0x04},
 	{value: 0x3308, lo: 0x80, hi: 0xac},
 	{value: 0x0018, lo: 0xad, hi: 0xb4},
 	{value: 0x3308, lo: 0xb5, hi: 0xb5},
 	{value: 0x0018, lo: 0xb6, hi: 0xbf},
-	// Block 0xfa, offset 0x767
+	// Block 0xfc, offset 0x771
 	{value: 0x0000, lo: 0x08},
 	{value: 0x0018, lo: 0x80, hi: 0x83},
 	{value: 0x3308, lo: 0x84, hi: 0x84},
@@ -4552,7 +4707,7 @@
 	{value: 0x0040, lo: 0xa0, hi: 0xa0},
 	{value: 0x3308, lo: 0xa1, hi: 0xaf},
 	{value: 0x0040, lo: 0xb0, hi: 0xbf},
-	// Block 0xfb, offset 0x770
+	// Block 0xfd, offset 0x77a
 	{value: 0x0000, lo: 0x0a},
 	{value: 0x3308, lo: 0x80, hi: 0x86},
 	{value: 0x0040, lo: 0x87, hi: 0x87},
@@ -4564,35 +4719,35 @@
 	{value: 0x0040, lo: 0xa5, hi: 0xa5},
 	{value: 0x3308, lo: 0xa6, hi: 0xaa},
 	{value: 0x0040, lo: 0xab, hi: 0xbf},
-	// Block 0xfc, offset 0x77b
+	// Block 0xfe, offset 0x785
 	{value: 0x0000, lo: 0x05},
 	{value: 0x0008, lo: 0x80, hi: 0xac},
 	{value: 0x0040, lo: 0xad, hi: 0xaf},
 	{value: 0x3308, lo: 0xb0, hi: 0xb6},
 	{value: 0x0008, lo: 0xb7, hi: 0xbd},
 	{value: 0x0040, lo: 0xbe, hi: 0xbf},
-	// Block 0xfd, offset 0x781
+	// Block 0xff, offset 0x78b
 	{value: 0x0000, lo: 0x05},
 	{value: 0x0008, lo: 0x80, hi: 0x89},
 	{value: 0x0040, lo: 0x8a, hi: 0x8d},
 	{value: 0x0008, lo: 0x8e, hi: 0x8e},
 	{value: 0x0018, lo: 0x8f, hi: 0x8f},
 	{value: 0x0040, lo: 0x90, hi: 0xbf},
-	// Block 0xfe, offset 0x787
+	// Block 0x100, offset 0x791
 	{value: 0x0000, lo: 0x05},
 	{value: 0x0008, lo: 0x80, hi: 0xab},
 	{value: 0x3308, lo: 0xac, hi: 0xaf},
 	{value: 0x0008, lo: 0xb0, hi: 0xb9},
 	{value: 0x0040, lo: 0xba, hi: 0xbe},
 	{value: 0x0018, lo: 0xbf, hi: 0xbf},
-	// Block 0xff, offset 0x78d
+	// Block 0x101, offset 0x797
 	{value: 0x0000, lo: 0x05},
 	{value: 0x0808, lo: 0x80, hi: 0x84},
 	{value: 0x0040, lo: 0x85, hi: 0x86},
 	{value: 0x0818, lo: 0x87, hi: 0x8f},
 	{value: 0x3308, lo: 0x90, hi: 0x96},
 	{value: 0x0040, lo: 0x97, hi: 0xbf},
-	// Block 0x100, offset 0x793
+	// Block 0x102, offset 0x79d
 	{value: 0x0000, lo: 0x08},
 	{value: 0x0a08, lo: 0x80, hi: 0x83},
 	{value: 0x3308, lo: 0x84, hi: 0x8a},
@@ -4602,71 +4757,71 @@
 	{value: 0x0040, lo: 0x9a, hi: 0x9d},
 	{value: 0x0818, lo: 0x9e, hi: 0x9f},
 	{value: 0x0040, lo: 0xa0, hi: 0xbf},
-	// Block 0x101, offset 0x79c
+	// Block 0x103, offset 0x7a6
 	{value: 0x0000, lo: 0x02},
 	{value: 0x0040, lo: 0x80, hi: 0xb0},
 	{value: 0x0818, lo: 0xb1, hi: 0xbf},
-	// Block 0x102, offset 0x79f
+	// Block 0x104, offset 0x7a9
 	{value: 0x0000, lo: 0x02},
 	{value: 0x0818, lo: 0x80, hi: 0xb4},
 	{value: 0x0040, lo: 0xb5, hi: 0xbf},
-	// Block 0x103, offset 0x7a2
+	// Block 0x105, offset 0x7ac
 	{value: 0x0000, lo: 0x03},
 	{value: 0x0040, lo: 0x80, hi: 0x80},
 	{value: 0x0818, lo: 0x81, hi: 0xbd},
 	{value: 0x0040, lo: 0xbe, hi: 0xbf},
-	// Block 0x104, offset 0x7a6
+	// Block 0x106, offset 0x7b0
 	{value: 0x0000, lo: 0x03},
 	{value: 0x0040, lo: 0x80, hi: 0xaf},
 	{value: 0x0018, lo: 0xb0, hi: 0xb1},
 	{value: 0x0040, lo: 0xb2, hi: 0xbf},
-	// Block 0x105, offset 0x7aa
+	// Block 0x107, offset 0x7b4
 	{value: 0x0000, lo: 0x03},
 	{value: 0x0018, lo: 0x80, hi: 0xab},
 	{value: 0x0040, lo: 0xac, hi: 0xaf},
 	{value: 0x0018, lo: 0xb0, hi: 0xbf},
-	// Block 0x106, offset 0x7ae
+	// Block 0x108, offset 0x7b8
 	{value: 0x0000, lo: 0x05},
 	{value: 0x0018, lo: 0x80, hi: 0x93},
 	{value: 0x0040, lo: 0x94, hi: 0x9f},
 	{value: 0x0018, lo: 0xa0, hi: 0xae},
 	{value: 0x0040, lo: 0xaf, hi: 0xb0},
 	{value: 0x0018, lo: 0xb1, hi: 0xbf},
-	// Block 0x107, offset 0x7b4
+	// Block 0x109, offset 0x7be
 	{value: 0x0000, lo: 0x05},
 	{value: 0x0040, lo: 0x80, hi: 0x80},
 	{value: 0x0018, lo: 0x81, hi: 0x8f},
 	{value: 0x0040, lo: 0x90, hi: 0x90},
 	{value: 0x0018, lo: 0x91, hi: 0xb5},
 	{value: 0x0040, lo: 0xb6, hi: 0xbf},
-	// Block 0x108, offset 0x7ba
+	// Block 0x10a, offset 0x7c4
 	{value: 0x0000, lo: 0x04},
 	{value: 0x0018, lo: 0x80, hi: 0x8f},
-	{value: 0xc229, lo: 0x90, hi: 0x90},
+	{value: 0x2491, lo: 0x90, hi: 0x90},
 	{value: 0x0018, lo: 0x91, hi: 0xad},
 	{value: 0x0040, lo: 0xae, hi: 0xbf},
-	// Block 0x109, offset 0x7bf
+	// Block 0x10b, offset 0x7c9
 	{value: 0x0000, lo: 0x02},
 	{value: 0x0040, lo: 0x80, hi: 0xa5},
 	{value: 0x0018, lo: 0xa6, hi: 0xbf},
-	// Block 0x10a, offset 0x7c2
+	// Block 0x10c, offset 0x7cc
 	{value: 0x0000, lo: 0x0f},
-	{value: 0xc851, lo: 0x80, hi: 0x80},
-	{value: 0xc8a1, lo: 0x81, hi: 0x81},
-	{value: 0xc8f1, lo: 0x82, hi: 0x82},
-	{value: 0xc941, lo: 0x83, hi: 0x83},
-	{value: 0xc991, lo: 0x84, hi: 0x84},
-	{value: 0xc9e1, lo: 0x85, hi: 0x85},
-	{value: 0xca31, lo: 0x86, hi: 0x86},
-	{value: 0xca81, lo: 0x87, hi: 0x87},
-	{value: 0xcad1, lo: 0x88, hi: 0x88},
+	{value: 0x2611, lo: 0x80, hi: 0x80},
+	{value: 0x2619, lo: 0x81, hi: 0x81},
+	{value: 0x2621, lo: 0x82, hi: 0x82},
+	{value: 0x2629, lo: 0x83, hi: 0x83},
+	{value: 0x2631, lo: 0x84, hi: 0x84},
+	{value: 0x2639, lo: 0x85, hi: 0x85},
+	{value: 0x2641, lo: 0x86, hi: 0x86},
+	{value: 0x2649, lo: 0x87, hi: 0x87},
+	{value: 0x2651, lo: 0x88, hi: 0x88},
 	{value: 0x0040, lo: 0x89, hi: 0x8f},
-	{value: 0xcb21, lo: 0x90, hi: 0x90},
-	{value: 0xcb41, lo: 0x91, hi: 0x91},
+	{value: 0x2659, lo: 0x90, hi: 0x90},
+	{value: 0x2661, lo: 0x91, hi: 0x91},
 	{value: 0x0040, lo: 0x92, hi: 0x9f},
 	{value: 0x0018, lo: 0xa0, hi: 0xa5},
 	{value: 0x0040, lo: 0xa6, hi: 0xbf},
-	// Block 0x10b, offset 0x7d2
+	// Block 0x10d, offset 0x7dc
 	{value: 0x0000, lo: 0x06},
 	{value: 0x0018, lo: 0x80, hi: 0x97},
 	{value: 0x0040, lo: 0x98, hi: 0x9f},
@@ -4674,29 +4829,29 @@
 	{value: 0x0040, lo: 0xad, hi: 0xaf},
 	{value: 0x0018, lo: 0xb0, hi: 0xbc},
 	{value: 0x0040, lo: 0xbd, hi: 0xbf},
-	// Block 0x10c, offset 0x7d9
+	// Block 0x10e, offset 0x7e3
 	{value: 0x0000, lo: 0x02},
 	{value: 0x0018, lo: 0x80, hi: 0xb3},
 	{value: 0x0040, lo: 0xb4, hi: 0xbf},
-	// Block 0x10d, offset 0x7dc
+	// Block 0x10f, offset 0x7e6
 	{value: 0x0000, lo: 0x04},
 	{value: 0x0018, lo: 0x80, hi: 0x98},
 	{value: 0x0040, lo: 0x99, hi: 0x9f},
 	{value: 0x0018, lo: 0xa0, hi: 0xab},
 	{value: 0x0040, lo: 0xac, hi: 0xbf},
-	// Block 0x10e, offset 0x7e1
+	// Block 0x110, offset 0x7eb
 	{value: 0x0000, lo: 0x03},
 	{value: 0x0018, lo: 0x80, hi: 0x8b},
 	{value: 0x0040, lo: 0x8c, hi: 0x8f},
 	{value: 0x0018, lo: 0x90, hi: 0xbf},
-	// Block 0x10f, offset 0x7e5
+	// Block 0x111, offset 0x7ef
 	{value: 0x0000, lo: 0x05},
 	{value: 0x0018, lo: 0x80, hi: 0x87},
 	{value: 0x0040, lo: 0x88, hi: 0x8f},
 	{value: 0x0018, lo: 0x90, hi: 0x99},
 	{value: 0x0040, lo: 0x9a, hi: 0x9f},
 	{value: 0x0018, lo: 0xa0, hi: 0xbf},
-	// Block 0x110, offset 0x7eb
+	// Block 0x112, offset 0x7f5
 	{value: 0x0000, lo: 0x06},
 	{value: 0x0018, lo: 0x80, hi: 0x87},
 	{value: 0x0040, lo: 0x88, hi: 0x8f},
@@ -4704,17 +4859,17 @@
 	{value: 0x0040, lo: 0xae, hi: 0xaf},
 	{value: 0x0018, lo: 0xb0, hi: 0xb1},
 	{value: 0x0040, lo: 0xb2, hi: 0xbf},
-	// Block 0x111, offset 0x7f2
+	// Block 0x113, offset 0x7fc
 	{value: 0x0000, lo: 0x03},
 	{value: 0x0018, lo: 0x80, hi: 0xb8},
 	{value: 0x0040, lo: 0xb9, hi: 0xb9},
 	{value: 0x0018, lo: 0xba, hi: 0xbf},
-	// Block 0x112, offset 0x7f6
+	// Block 0x114, offset 0x800
 	{value: 0x0000, lo: 0x03},
 	{value: 0x0018, lo: 0x80, hi: 0x8b},
 	{value: 0x0040, lo: 0x8c, hi: 0x8c},
 	{value: 0x0018, lo: 0x8d, hi: 0xbf},
-	// Block 0x113, offset 0x7fa
+	// Block 0x115, offset 0x804
 	{value: 0x0000, lo: 0x08},
 	{value: 0x0018, lo: 0x80, hi: 0x93},
 	{value: 0x0040, lo: 0x94, hi: 0x9f},
@@ -4724,7 +4879,7 @@
 	{value: 0x0040, lo: 0xb5, hi: 0xb7},
 	{value: 0x0018, lo: 0xb8, hi: 0xba},
 	{value: 0x0040, lo: 0xbb, hi: 0xbf},
-	// Block 0x114, offset 0x803
+	// Block 0x116, offset 0x80d
 	{value: 0x0000, lo: 0x06},
 	{value: 0x0018, lo: 0x80, hi: 0x86},
 	{value: 0x0040, lo: 0x87, hi: 0x8f},
@@ -4732,109 +4887,74 @@
 	{value: 0x0040, lo: 0xa9, hi: 0xaf},
 	{value: 0x0018, lo: 0xb0, hi: 0xb6},
 	{value: 0x0040, lo: 0xb7, hi: 0xbf},
-	// Block 0x115, offset 0x80a
+	// Block 0x117, offset 0x814
 	{value: 0x0000, lo: 0x04},
 	{value: 0x0018, lo: 0x80, hi: 0x82},
 	{value: 0x0040, lo: 0x83, hi: 0x8f},
 	{value: 0x0018, lo: 0x90, hi: 0x96},
 	{value: 0x0040, lo: 0x97, hi: 0xbf},
-	// Block 0x116, offset 0x80f
+	// Block 0x118, offset 0x819
 	{value: 0x0000, lo: 0x03},
 	{value: 0x0018, lo: 0x80, hi: 0x92},
 	{value: 0x0040, lo: 0x93, hi: 0x93},
 	{value: 0x0018, lo: 0x94, hi: 0xbf},
-	// Block 0x117, offset 0x813
+	// Block 0x119, offset 0x81d
 	{value: 0x0000, lo: 0x0d},
 	{value: 0x0018, lo: 0x80, hi: 0x8a},
 	{value: 0x0040, lo: 0x8b, hi: 0xaf},
-	{value: 0x1f41, lo: 0xb0, hi: 0xb0},
-	{value: 0x00c9, lo: 0xb1, hi: 0xb1},
-	{value: 0x0069, lo: 0xb2, hi: 0xb2},
-	{value: 0x0079, lo: 0xb3, hi: 0xb3},
-	{value: 0x1f51, lo: 0xb4, hi: 0xb4},
-	{value: 0x1f61, lo: 0xb5, hi: 0xb5},
-	{value: 0x1f71, lo: 0xb6, hi: 0xb6},
-	{value: 0x1f81, lo: 0xb7, hi: 0xb7},
-	{value: 0x1f91, lo: 0xb8, hi: 0xb8},
-	{value: 0x1fa1, lo: 0xb9, hi: 0xb9},
+	{value: 0x06e1, lo: 0xb0, hi: 0xb0},
+	{value: 0x0049, lo: 0xb1, hi: 0xb1},
+	{value: 0x0029, lo: 0xb2, hi: 0xb2},
+	{value: 0x0031, lo: 0xb3, hi: 0xb3},
+	{value: 0x06e9, lo: 0xb4, hi: 0xb4},
+	{value: 0x06f1, lo: 0xb5, hi: 0xb5},
+	{value: 0x06f9, lo: 0xb6, hi: 0xb6},
+	{value: 0x0701, lo: 0xb7, hi: 0xb7},
+	{value: 0x0709, lo: 0xb8, hi: 0xb8},
+	{value: 0x0711, lo: 0xb9, hi: 0xb9},
 	{value: 0x0040, lo: 0xba, hi: 0xbf},
-	// Block 0x118, offset 0x821
+	// Block 0x11a, offset 0x82b
 	{value: 0x0000, lo: 0x02},
 	{value: 0x0008, lo: 0x80, hi: 0x9d},
 	{value: 0x0040, lo: 0x9e, hi: 0xbf},
-	// Block 0x119, offset 0x824
+	// Block 0x11b, offset 0x82e
 	{value: 0x0000, lo: 0x02},
 	{value: 0x0008, lo: 0x80, hi: 0xb4},
 	{value: 0x0040, lo: 0xb5, hi: 0xbf},
-	// Block 0x11a, offset 0x827
+	// Block 0x11c, offset 0x831
 	{value: 0x0000, lo: 0x03},
 	{value: 0x0008, lo: 0x80, hi: 0x9d},
 	{value: 0x0040, lo: 0x9e, hi: 0x9f},
 	{value: 0x0008, lo: 0xa0, hi: 0xbf},
-	// Block 0x11b, offset 0x82b
+	// Block 0x11d, offset 0x835
 	{value: 0x0000, lo: 0x03},
 	{value: 0x0008, lo: 0x80, hi: 0xa1},
 	{value: 0x0040, lo: 0xa2, hi: 0xaf},
 	{value: 0x0008, lo: 0xb0, hi: 0xbf},
-	// Block 0x11c, offset 0x82f
+	// Block 0x11e, offset 0x839
 	{value: 0x0000, lo: 0x02},
 	{value: 0x0008, lo: 0x80, hi: 0xa0},
 	{value: 0x0040, lo: 0xa1, hi: 0xbf},
-	// Block 0x11d, offset 0x832
-	{value: 0x0020, lo: 0x0f},
-	{value: 0xdf21, lo: 0x80, hi: 0x89},
-	{value: 0x8e35, lo: 0x8a, hi: 0x8a},
-	{value: 0xe061, lo: 0x8b, hi: 0x9c},
-	{value: 0x8e55, lo: 0x9d, hi: 0x9d},
-	{value: 0xe2a1, lo: 0x9e, hi: 0xa2},
-	{value: 0x8e75, lo: 0xa3, hi: 0xa3},
-	{value: 0xe341, lo: 0xa4, hi: 0xab},
-	{value: 0x7f0d, lo: 0xac, hi: 0xac},
-	{value: 0xe441, lo: 0xad, hi: 0xaf},
-	{value: 0x8e95, lo: 0xb0, hi: 0xb0},
-	{value: 0xe4a1, lo: 0xb1, hi: 0xb6},
-	{value: 0x8eb5, lo: 0xb7, hi: 0xb9},
-	{value: 0xe561, lo: 0xba, hi: 0xba},
-	{value: 0x8f15, lo: 0xbb, hi: 0xbb},
-	{value: 0xe581, lo: 0xbc, hi: 0xbf},
-	// Block 0x11e, offset 0x842
-	{value: 0x0020, lo: 0x10},
-	{value: 0x93b5, lo: 0x80, hi: 0x80},
-	{value: 0xf101, lo: 0x81, hi: 0x86},
-	{value: 0x93d5, lo: 0x87, hi: 0x8a},
-	{value: 0xda61, lo: 0x8b, hi: 0x8b},
-	{value: 0xf1c1, lo: 0x8c, hi: 0x96},
-	{value: 0x9455, lo: 0x97, hi: 0x97},
-	{value: 0xf321, lo: 0x98, hi: 0xa3},
-	{value: 0x9475, lo: 0xa4, hi: 0xa6},
-	{value: 0xf4a1, lo: 0xa7, hi: 0xaa},
-	{value: 0x94d5, lo: 0xab, hi: 0xab},
-	{value: 0xf521, lo: 0xac, hi: 0xac},
-	{value: 0x94f5, lo: 0xad, hi: 0xad},
-	{value: 0xf541, lo: 0xae, hi: 0xaf},
-	{value: 0x9515, lo: 0xb0, hi: 0xb1},
-	{value: 0xf581, lo: 0xb2, hi: 0xbe},
-	{value: 0x2040, lo: 0xbf, hi: 0xbf},
-	// Block 0x11f, offset 0x853
+	// Block 0x11f, offset 0x83c
 	{value: 0x0000, lo: 0x02},
 	{value: 0x0008, lo: 0x80, hi: 0x8a},
 	{value: 0x0040, lo: 0x8b, hi: 0xbf},
-	// Block 0x120, offset 0x856
+	// Block 0x120, offset 0x83f
 	{value: 0x0000, lo: 0x04},
 	{value: 0x0040, lo: 0x80, hi: 0x80},
 	{value: 0x0340, lo: 0x81, hi: 0x81},
 	{value: 0x0040, lo: 0x82, hi: 0x9f},
 	{value: 0x0340, lo: 0xa0, hi: 0xbf},
-	// Block 0x121, offset 0x85b
+	// Block 0x121, offset 0x844
 	{value: 0x0000, lo: 0x01},
 	{value: 0x0340, lo: 0x80, hi: 0xbf},
-	// Block 0x122, offset 0x85d
+	// Block 0x122, offset 0x846
 	{value: 0x0000, lo: 0x01},
 	{value: 0x33c0, lo: 0x80, hi: 0xbf},
-	// Block 0x123, offset 0x85f
+	// Block 0x123, offset 0x848
 	{value: 0x0000, lo: 0x02},
 	{value: 0x33c0, lo: 0x80, hi: 0xaf},
 	{value: 0x0040, lo: 0xb0, hi: 0xbf},
 }
 
-// Total table size 43370 bytes (42KiB); checksum: EBD909C0
+// Total table size 44953 bytes (43KiB); checksum: D51909DD
diff --git a/src/vendor/golang.org/x/net/idna/tables15.0.0.go b/src/vendor/golang.org/x/net/idna/tables15.0.0.go
new file mode 100644
index 0000000..4003377
--- /dev/null
+++ b/src/vendor/golang.org/x/net/idna/tables15.0.0.go
@@ -0,0 +1,5145 @@
+// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
+
+//go:build go1.21
+// +build go1.21
+
+package idna
+
+// UnicodeVersion is the Unicode version from which the tables in this package are derived.
+const UnicodeVersion = "15.0.0"
+
+var mappings string = "" + // Size: 6704 bytes
+	"  ̈a ̄23 ́ ̧1o1⁄41⁄23⁄4i̇l·ʼnsdžⱥⱦhjrwy ̆ ̇ ̊ ̨ ̃ ̋lẍ́ ι; ̈́եւاٴوٴۇٴيٴक" +
+	"़ख़ग़ज़ड़ढ़फ़य़ড়ঢ়য়ਲ਼ਸ਼ਖ਼ਗ਼ਜ਼ਫ਼ଡ଼ଢ଼ําໍາຫນຫມགྷཌྷདྷབྷཛྷཀྵཱཱིུྲྀྲཱྀླྀླཱ" +
+	"ཱྀྀྒྷྜྷྡྷྦྷྫྷྐྵвдостъѣæbdeǝgikmnȣptuɐɑəɛɜŋɔɯvβγδφχρнɒcɕðfɟɡɥɨɩɪʝɭʟɱɰɲɳ" +
+	"ɴɵɸʂʃƫʉʊʋʌzʐʑʒθssάέήίόύώἀιἁιἂιἃιἄιἅιἆιἇιἠιἡιἢιἣιἤιἥιἦιἧιὠιὡιὢιὣιὤιὥιὦιὧ" +
+	"ιὰιαιάιᾶιι ̈͂ὴιηιήιῆι ̓̀ ̓́ ̓͂ΐ ̔̀ ̔́ ̔͂ΰ ̈̀`ὼιωιώιῶι′′′′′‵‵‵‵‵!!???!!?" +
+	"′′′′0456789+=()rsħnoqsmtmωåאבגדπ1⁄71⁄91⁄101⁄32⁄31⁄52⁄53⁄54⁄51⁄65⁄61⁄83" +
+	"⁄85⁄87⁄81⁄iiivviviiiixxi0⁄3∫∫∫∫∫∮∮∮∮∮1011121314151617181920(10)(11)(12" +
+	")(13)(14)(15)(16)(17)(18)(19)(20)∫∫∫∫==⫝̸ɫɽȿɀ. ゙ ゚よりコト(ᄀ)(ᄂ)(ᄃ)(ᄅ)(ᄆ)(ᄇ)" +
+	"(ᄉ)(ᄋ)(ᄌ)(ᄎ)(ᄏ)(ᄐ)(ᄑ)(ᄒ)(가)(나)(다)(라)(마)(바)(사)(아)(자)(차)(카)(타)(파)(하)(주)(오전" +
+	")(오후)(一)(二)(三)(四)(五)(六)(七)(八)(九)(十)(月)(火)(水)(木)(金)(土)(日)(株)(有)(社)(名)(特)(" +
+	"財)(祝)(労)(代)(呼)(学)(監)(企)(資)(協)(祭)(休)(自)(至)21222324252627282930313233343" +
+	"5참고주의3637383940414243444546474849501月2月3月4月5月6月7月8月9月10月11月12月hgev令和アパート" +
+	"アルファアンペアアールイニングインチウォンエスクードエーカーオンスオームカイリカラットカロリーガロンガンマギガギニーキュリーギルダーキロキロ" +
+	"グラムキロメートルキロワットグラムグラムトンクルゼイロクローネケースコルナコーポサイクルサンチームシリングセンチセントダースデシドルトンナノ" +
+	"ノットハイツパーセントパーツバーレルピアストルピクルピコビルファラッドフィートブッシェルフランヘクタールペソペニヒヘルツペンスページベータポ" +
+	"イントボルトホンポンドホールホーンマイクロマイルマッハマルクマンションミクロンミリミリバールメガメガトンメートルヤードヤールユアンリットルリ" +
+	"ラルピールーブルレムレントゲンワット0点1点2点3点4点5点6点7点8点9点10点11点12点13点14点15点16点17点18点19点20" +
+	"点21点22点23点24点daauovpcdmiu平成昭和大正明治株式会社panamakakbmbgbkcalpfnfmgkghzmldlk" +
+	"lfmnmmmcmkmm2m3m∕sm∕s2rad∕srad∕s2psnsmspvnvmvkvpwnwmwkwbqcccdc∕kgdbgyhah" +
+	"pinkkktlmlnlxphprsrsvwbv∕ma∕m1日2日3日4日5日6日7日8日9日10日11日12日13日14日15日16日17日1" +
+	"8日19日20日21日22日23日24日25日26日27日28日29日30日31日ьɦɬʞʇœʍ𤋮𢡊𢡄𣏕𥉉𥳐𧻓fffiflstմնմեմիվնմ" +
+	"խיִײַעהכלםרתשׁשׂשּׁשּׂאַאָאּבּגּדּהּוּזּטּיּךּכּלּמּנּסּףּפּצּקּרּשּתּו" +
+	"ֹבֿכֿפֿאלٱٻپڀٺٿٹڤڦڄڃچڇڍڌڎڈژڑکگڳڱںڻۀہھےۓڭۇۆۈۋۅۉېىئائەئوئۇئۆئۈئېئىیئجئحئم" +
+	"ئيبجبحبخبمبىبيتجتحتختمتىتيثجثمثىثيجحجمحجحمخجخحخمسجسحسخسمصحصمضجضحضخضمطحط" +
+	"مظمعجعمغجغمفجفحفخفمفىفيقحقمقىقيكاكجكحكخكلكمكىكيلجلحلخلملىليمجمحمخمممىمي" +
+	"نجنحنخنمنىنيهجهمهىهييجيحيخيميىييذٰرٰىٰ ٌّ ٍّ َّ ُّ ِّ ّٰئرئزئنبربزبنترت" +
+	"زتنثرثزثنمانرنزننيريزينئخئهبهتهصخلهنههٰيهثهسهشمشهـَّـُّـِّطىطيعىعيغىغيس" +
+	"ىسيشىشيحىحيجىجيخىخيصىصيضىضيشجشحشخشرسرصرضراًتجمتحجتحمتخمتمجتمحتمخجمححميح" +
+	"مىسحجسجحسجىسمحسمجسممصححصممشحمشجيشمخشممضحىضخمطمحطممطميعجمعممعمىغممغميغمى" +
+	"فخمقمحقمملحملحيلحىلججلخملمحمحجمحممحيمجحمجممخجمخممجخهمجهممنحمنحىنجمنجىنم" +
+	"ينمىيممبخيتجيتجىتخيتخىتميتمىجميجحىجمىسخىصحيشحيضحيلجيلمييحييجييميمميقمين" +
+	"حيعميكمينجحمخيلجمكممجحيحجيمجيفميبحيسخينجيصلےقلےاللهاكبرمحمدصلعمرسولعليه" +
+	"وسلمصلىصلى الله عليه وسلمجل جلالهریال,:!?_{}[]#&*-<>\\$%@ـًـَـُـِـّـْءآ" +
+	"أؤإئابةتثجحخدذرزسشصضطظعغفقكلمنهويلآلألإلا\x22'/^|~¢£¬¦¥ːˑʙɓʣꭦʥʤɖɗᶑɘɞʩɤɢ" +
+	"ɠʛʜɧʄʪʫꞎɮʎøɶɷɺɾʀʨʦꭧʧʈⱱʏʡʢʘǀǁǂ𝅗𝅥𝅘𝅥𝅘𝅥𝅮𝅘𝅥𝅯𝅘𝅥𝅰𝅘𝅥𝅱𝅘𝅥𝅲𝆹𝅥𝆺𝅥𝆹𝅥𝅮𝆺𝅥𝅮𝆹𝅥𝅯𝆺𝅥𝅯ıȷαεζηκ" +
+	"λμνξοστυψ∇∂ϝабгежзиклмпруфхцчшыэюꚉәіјөүӏґѕџҫꙑұٮڡٯ0,1,2,3,4,5,6,7,8,9,(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)〔s〕wzhvsdppvwcmcmdmrdjほかココサ手字双デ二多解天交映無料前後再新初終生販声吹演投捕一三遊左中右指走打禁空合満有月申" +
+	"割営配〔本〕〔三〕〔二〕〔安〕〔点〕〔打〕〔盗〕〔勝〕〔敗〕得可丽丸乁你侮侻倂偺備僧像㒞免兔兤具㒹內冗冤仌冬况凵刃㓟刻剆剷㔕勇勉勤勺包匆北卉" +
+	"卑博即卽卿灰及叟叫叱吆咞吸呈周咢哶唐啓啣善喙喫喳嗂圖嘆圗噑噴切壮城埴堍型堲報墬売壷夆夢奢姬娛娧姘婦㛮嬈嬾寃寘寧寳寿将尢㞁屠屮峀岍嵃嵮嵫嵼巡巢" +
+	"㠯巽帨帽幩㡢㡼庰庳庶廊廾舁弢㣇形彫㣣徚忍志忹悁㤺㤜悔惇慈慌慎慺憎憲憤憯懞懲懶成戛扝抱拔捐挽拼捨掃揤搢揅掩㨮摩摾撝摷㩬敏敬旣書晉㬙暑㬈㫤冒冕最" +
+	"暜肭䏙朗望朡杞杓㭉柺枅桒梅梎栟椔㮝楂榣槪檨櫛㰘次歔㱎歲殟殺殻汎沿泍汧洖派海流浩浸涅洴港湮㴳滋滇淹潮濆瀹瀞瀛㶖灊災灷炭煅熜爨爵牐犀犕獺王㺬玥㺸" +
+	"瑇瑜瑱璅瓊㼛甤甾異瘐㿼䀈直眞真睊䀹瞋䁆䂖硎碌磌䃣祖福秫䄯穀穊穏䈂篆築䈧糒䊠糨糣紀絣䌁緇縂繅䌴䍙罺羕翺者聠聰䏕育脃䐋脾媵舄辞䑫芑芋芝劳花芳芽苦" +
+	"若茝荣莭茣莽菧著荓菊菌菜䔫蓱蓳蔖蕤䕝䕡䕫虐虜虧虩蚩蚈蜎蛢蝹蜨蝫螆蟡蠁䗹衠衣裗裞䘵裺㒻䚾䛇誠諭變豕貫賁贛起跋趼跰軔輸邔郱鄑鄛鈸鋗鋘鉼鏹鐕開䦕閷" +
+	"䧦雃嶲霣䩮䩶韠䪲頋頩飢䬳餩馧駂駾䯎鬒鱀鳽䳎䳭鵧䳸麻䵖黹黾鼅鼏鼖鼻"
+
+var mappingIndex = []uint16{ // 1729 elements
+	// Entry 0 - 3F
+	0x0000, 0x0000, 0x0001, 0x0004, 0x0005, 0x0008, 0x0009, 0x000a,
+	0x000d, 0x0010, 0x0011, 0x0012, 0x0017, 0x001c, 0x0021, 0x0024,
+	0x0027, 0x002a, 0x002b, 0x002e, 0x0031, 0x0034, 0x0035, 0x0036,
+	0x0037, 0x0038, 0x0039, 0x003c, 0x003f, 0x0042, 0x0045, 0x0048,
+	0x004b, 0x004c, 0x004d, 0x0051, 0x0054, 0x0055, 0x005a, 0x005e,
+	0x0062, 0x0066, 0x006a, 0x006e, 0x0074, 0x007a, 0x0080, 0x0086,
+	0x008c, 0x0092, 0x0098, 0x009e, 0x00a4, 0x00aa, 0x00b0, 0x00b6,
+	0x00bc, 0x00c2, 0x00c8, 0x00ce, 0x00d4, 0x00da, 0x00e0, 0x00e6,
+	// Entry 40 - 7F
+	0x00ec, 0x00f2, 0x00f8, 0x00fe, 0x0104, 0x010a, 0x0110, 0x0116,
+	0x011c, 0x0122, 0x0128, 0x012e, 0x0137, 0x013d, 0x0146, 0x014c,
+	0x0152, 0x0158, 0x015e, 0x0164, 0x016a, 0x0170, 0x0172, 0x0174,
+	0x0176, 0x0178, 0x017a, 0x017c, 0x017e, 0x0180, 0x0181, 0x0182,
+	0x0183, 0x0185, 0x0186, 0x0187, 0x0188, 0x0189, 0x018a, 0x018c,
+	0x018d, 0x018e, 0x018f, 0x0191, 0x0193, 0x0195, 0x0197, 0x0199,
+	0x019b, 0x019d, 0x019f, 0x01a0, 0x01a2, 0x01a4, 0x01a6, 0x01a8,
+	0x01aa, 0x01ac, 0x01ae, 0x01b0, 0x01b1, 0x01b3, 0x01b5, 0x01b6,
+	// Entry 80 - BF
+	0x01b8, 0x01ba, 0x01bc, 0x01be, 0x01c0, 0x01c2, 0x01c4, 0x01c6,
+	0x01c8, 0x01ca, 0x01cc, 0x01ce, 0x01d0, 0x01d2, 0x01d4, 0x01d6,
+	0x01d8, 0x01da, 0x01dc, 0x01de, 0x01e0, 0x01e2, 0x01e4, 0x01e5,
+	0x01e7, 0x01e9, 0x01eb, 0x01ed, 0x01ef, 0x01f1, 0x01f3, 0x01f5,
+	0x01f7, 0x01f9, 0x01fb, 0x01fd, 0x0202, 0x0207, 0x020c, 0x0211,
+	0x0216, 0x021b, 0x0220, 0x0225, 0x022a, 0x022f, 0x0234, 0x0239,
+	0x023e, 0x0243, 0x0248, 0x024d, 0x0252, 0x0257, 0x025c, 0x0261,
+	0x0266, 0x026b, 0x0270, 0x0275, 0x027a, 0x027e, 0x0282, 0x0287,
+	// Entry C0 - FF
+	0x0289, 0x028e, 0x0293, 0x0297, 0x029b, 0x02a0, 0x02a5, 0x02aa,
+	0x02af, 0x02b1, 0x02b6, 0x02bb, 0x02c0, 0x02c2, 0x02c7, 0x02c8,
+	0x02cd, 0x02d1, 0x02d5, 0x02da, 0x02e0, 0x02e9, 0x02ef, 0x02f8,
+	0x02fa, 0x02fc, 0x02fe, 0x0300, 0x030c, 0x030d, 0x030e, 0x030f,
+	0x0310, 0x0311, 0x0312, 0x0313, 0x0314, 0x0315, 0x0316, 0x0317,
+	0x0319, 0x031b, 0x031d, 0x031e, 0x0320, 0x0322, 0x0324, 0x0326,
+	0x0328, 0x032a, 0x032c, 0x032e, 0x0330, 0x0335, 0x033a, 0x0340,
+	0x0345, 0x034a, 0x034f, 0x0354, 0x0359, 0x035e, 0x0363, 0x0368,
+	// Entry 100 - 13F
+	0x036d, 0x0372, 0x0377, 0x037c, 0x0380, 0x0382, 0x0384, 0x0386,
+	0x038a, 0x038c, 0x038e, 0x0393, 0x0399, 0x03a2, 0x03a8, 0x03b1,
+	0x03b3, 0x03b5, 0x03b7, 0x03b9, 0x03bb, 0x03bd, 0x03bf, 0x03c1,
+	0x03c3, 0x03c5, 0x03c7, 0x03cb, 0x03cf, 0x03d3, 0x03d7, 0x03db,
+	0x03df, 0x03e3, 0x03e7, 0x03eb, 0x03ef, 0x03f3, 0x03ff, 0x0401,
+	0x0406, 0x0408, 0x040a, 0x040c, 0x040e, 0x040f, 0x0413, 0x0417,
+	0x041d, 0x0423, 0x0428, 0x042d, 0x0432, 0x0437, 0x043c, 0x0441,
+	0x0446, 0x044b, 0x0450, 0x0455, 0x045a, 0x045f, 0x0464, 0x0469,
+	// Entry 140 - 17F
+	0x046e, 0x0473, 0x0478, 0x047d, 0x0482, 0x0487, 0x048c, 0x0491,
+	0x0496, 0x049b, 0x04a0, 0x04a5, 0x04aa, 0x04af, 0x04b4, 0x04bc,
+	0x04c4, 0x04c9, 0x04ce, 0x04d3, 0x04d8, 0x04dd, 0x04e2, 0x04e7,
+	0x04ec, 0x04f1, 0x04f6, 0x04fb, 0x0500, 0x0505, 0x050a, 0x050f,
+	0x0514, 0x0519, 0x051e, 0x0523, 0x0528, 0x052d, 0x0532, 0x0537,
+	0x053c, 0x0541, 0x0546, 0x054b, 0x0550, 0x0555, 0x055a, 0x055f,
+	0x0564, 0x0569, 0x056e, 0x0573, 0x0578, 0x057a, 0x057c, 0x057e,
+	0x0580, 0x0582, 0x0584, 0x0586, 0x0588, 0x058a, 0x058c, 0x058e,
+	// Entry 180 - 1BF
+	0x0590, 0x0592, 0x0594, 0x0596, 0x059c, 0x05a2, 0x05a4, 0x05a6,
+	0x05a8, 0x05aa, 0x05ac, 0x05ae, 0x05b0, 0x05b2, 0x05b4, 0x05b6,
+	0x05b8, 0x05ba, 0x05bc, 0x05be, 0x05c0, 0x05c4, 0x05c8, 0x05cc,
+	0x05d0, 0x05d4, 0x05d8, 0x05dc, 0x05e0, 0x05e4, 0x05e9, 0x05ee,
+	0x05f3, 0x05f5, 0x05f7, 0x05fd, 0x0609, 0x0615, 0x0621, 0x062a,
+	0x0636, 0x063f, 0x0648, 0x0657, 0x0663, 0x066c, 0x0675, 0x067e,
+	0x068a, 0x0696, 0x069f, 0x06a8, 0x06ae, 0x06b7, 0x06c3, 0x06cf,
+	0x06d5, 0x06e4, 0x06f6, 0x0705, 0x070e, 0x071d, 0x072c, 0x0738,
+	// Entry 1C0 - 1FF
+	0x0741, 0x074a, 0x0753, 0x075f, 0x076e, 0x077a, 0x0783, 0x078c,
+	0x0795, 0x079b, 0x07a1, 0x07a7, 0x07ad, 0x07b6, 0x07bf, 0x07ce,
+	0x07d7, 0x07e3, 0x07f2, 0x07fb, 0x0801, 0x0807, 0x0816, 0x0822,
+	0x0831, 0x083a, 0x0849, 0x084f, 0x0858, 0x0861, 0x086a, 0x0873,
+	0x087c, 0x0888, 0x0891, 0x0897, 0x08a0, 0x08a9, 0x08b2, 0x08be,
+	0x08c7, 0x08d0, 0x08d9, 0x08e8, 0x08f4, 0x08fa, 0x0909, 0x090f,
+	0x091b, 0x0927, 0x0930, 0x0939, 0x0942, 0x094e, 0x0954, 0x095d,
+	0x0969, 0x096f, 0x097e, 0x0987, 0x098b, 0x098f, 0x0993, 0x0997,
+	// Entry 200 - 23F
+	0x099b, 0x099f, 0x09a3, 0x09a7, 0x09ab, 0x09af, 0x09b4, 0x09b9,
+	0x09be, 0x09c3, 0x09c8, 0x09cd, 0x09d2, 0x09d7, 0x09dc, 0x09e1,
+	0x09e6, 0x09eb, 0x09f0, 0x09f5, 0x09fa, 0x09fc, 0x09fe, 0x0a00,
+	0x0a02, 0x0a04, 0x0a06, 0x0a0c, 0x0a12, 0x0a18, 0x0a1e, 0x0a2a,
+	0x0a2c, 0x0a2e, 0x0a30, 0x0a32, 0x0a34, 0x0a36, 0x0a38, 0x0a3c,
+	0x0a3e, 0x0a40, 0x0a42, 0x0a44, 0x0a46, 0x0a48, 0x0a4a, 0x0a4c,
+	0x0a4e, 0x0a50, 0x0a52, 0x0a54, 0x0a56, 0x0a58, 0x0a5a, 0x0a5f,
+	0x0a65, 0x0a6c, 0x0a74, 0x0a76, 0x0a78, 0x0a7a, 0x0a7c, 0x0a7e,
+	// Entry 240 - 27F
+	0x0a80, 0x0a82, 0x0a84, 0x0a86, 0x0a88, 0x0a8a, 0x0a8c, 0x0a8e,
+	0x0a90, 0x0a96, 0x0a98, 0x0a9a, 0x0a9c, 0x0a9e, 0x0aa0, 0x0aa2,
+	0x0aa4, 0x0aa6, 0x0aa8, 0x0aaa, 0x0aac, 0x0aae, 0x0ab0, 0x0ab2,
+	0x0ab4, 0x0ab9, 0x0abe, 0x0ac2, 0x0ac6, 0x0aca, 0x0ace, 0x0ad2,
+	0x0ad6, 0x0ada, 0x0ade, 0x0ae2, 0x0ae7, 0x0aec, 0x0af1, 0x0af6,
+	0x0afb, 0x0b00, 0x0b05, 0x0b0a, 0x0b0f, 0x0b14, 0x0b19, 0x0b1e,
+	0x0b23, 0x0b28, 0x0b2d, 0x0b32, 0x0b37, 0x0b3c, 0x0b41, 0x0b46,
+	0x0b4b, 0x0b50, 0x0b52, 0x0b54, 0x0b56, 0x0b58, 0x0b5a, 0x0b5c,
+	// Entry 280 - 2BF
+	0x0b5e, 0x0b62, 0x0b66, 0x0b6a, 0x0b6e, 0x0b72, 0x0b76, 0x0b7a,
+	0x0b7c, 0x0b7e, 0x0b80, 0x0b82, 0x0b86, 0x0b8a, 0x0b8e, 0x0b92,
+	0x0b96, 0x0b9a, 0x0b9e, 0x0ba0, 0x0ba2, 0x0ba4, 0x0ba6, 0x0ba8,
+	0x0baa, 0x0bac, 0x0bb0, 0x0bb4, 0x0bba, 0x0bc0, 0x0bc4, 0x0bc8,
+	0x0bcc, 0x0bd0, 0x0bd4, 0x0bd8, 0x0bdc, 0x0be0, 0x0be4, 0x0be8,
+	0x0bec, 0x0bf0, 0x0bf4, 0x0bf8, 0x0bfc, 0x0c00, 0x0c04, 0x0c08,
+	0x0c0c, 0x0c10, 0x0c14, 0x0c18, 0x0c1c, 0x0c20, 0x0c24, 0x0c28,
+	0x0c2c, 0x0c30, 0x0c34, 0x0c36, 0x0c38, 0x0c3a, 0x0c3c, 0x0c3e,
+	// Entry 2C0 - 2FF
+	0x0c40, 0x0c42, 0x0c44, 0x0c46, 0x0c48, 0x0c4a, 0x0c4c, 0x0c4e,
+	0x0c50, 0x0c52, 0x0c54, 0x0c56, 0x0c58, 0x0c5a, 0x0c5c, 0x0c5e,
+	0x0c60, 0x0c62, 0x0c64, 0x0c66, 0x0c68, 0x0c6a, 0x0c6c, 0x0c6e,
+	0x0c70, 0x0c72, 0x0c74, 0x0c76, 0x0c78, 0x0c7a, 0x0c7c, 0x0c7e,
+	0x0c80, 0x0c82, 0x0c86, 0x0c8a, 0x0c8e, 0x0c92, 0x0c96, 0x0c9a,
+	0x0c9e, 0x0ca2, 0x0ca4, 0x0ca8, 0x0cac, 0x0cb0, 0x0cb4, 0x0cb8,
+	0x0cbc, 0x0cc0, 0x0cc4, 0x0cc8, 0x0ccc, 0x0cd0, 0x0cd4, 0x0cd8,
+	0x0cdc, 0x0ce0, 0x0ce4, 0x0ce8, 0x0cec, 0x0cf0, 0x0cf4, 0x0cf8,
+	// Entry 300 - 33F
+	0x0cfc, 0x0d00, 0x0d04, 0x0d08, 0x0d0c, 0x0d10, 0x0d14, 0x0d18,
+	0x0d1c, 0x0d20, 0x0d24, 0x0d28, 0x0d2c, 0x0d30, 0x0d34, 0x0d38,
+	0x0d3c, 0x0d40, 0x0d44, 0x0d48, 0x0d4c, 0x0d50, 0x0d54, 0x0d58,
+	0x0d5c, 0x0d60, 0x0d64, 0x0d68, 0x0d6c, 0x0d70, 0x0d74, 0x0d78,
+	0x0d7c, 0x0d80, 0x0d84, 0x0d88, 0x0d8c, 0x0d90, 0x0d94, 0x0d98,
+	0x0d9c, 0x0da0, 0x0da4, 0x0da8, 0x0dac, 0x0db0, 0x0db4, 0x0db8,
+	0x0dbc, 0x0dc0, 0x0dc4, 0x0dc8, 0x0dcc, 0x0dd0, 0x0dd4, 0x0dd8,
+	0x0ddc, 0x0de0, 0x0de4, 0x0de8, 0x0dec, 0x0df0, 0x0df4, 0x0df8,
+	// Entry 340 - 37F
+	0x0dfc, 0x0e00, 0x0e04, 0x0e08, 0x0e0c, 0x0e10, 0x0e14, 0x0e18,
+	0x0e1d, 0x0e22, 0x0e27, 0x0e2c, 0x0e31, 0x0e36, 0x0e3a, 0x0e3e,
+	0x0e42, 0x0e46, 0x0e4a, 0x0e4e, 0x0e52, 0x0e56, 0x0e5a, 0x0e5e,
+	0x0e62, 0x0e66, 0x0e6a, 0x0e6e, 0x0e72, 0x0e76, 0x0e7a, 0x0e7e,
+	0x0e82, 0x0e86, 0x0e8a, 0x0e8e, 0x0e92, 0x0e96, 0x0e9a, 0x0e9e,
+	0x0ea2, 0x0ea6, 0x0eaa, 0x0eae, 0x0eb2, 0x0eb6, 0x0ebc, 0x0ec2,
+	0x0ec8, 0x0ecc, 0x0ed0, 0x0ed4, 0x0ed8, 0x0edc, 0x0ee0, 0x0ee4,
+	0x0ee8, 0x0eec, 0x0ef0, 0x0ef4, 0x0ef8, 0x0efc, 0x0f00, 0x0f04,
+	// Entry 380 - 3BF
+	0x0f08, 0x0f0c, 0x0f10, 0x0f14, 0x0f18, 0x0f1c, 0x0f20, 0x0f24,
+	0x0f28, 0x0f2c, 0x0f30, 0x0f34, 0x0f38, 0x0f3e, 0x0f44, 0x0f4a,
+	0x0f50, 0x0f56, 0x0f5c, 0x0f62, 0x0f68, 0x0f6e, 0x0f74, 0x0f7a,
+	0x0f80, 0x0f86, 0x0f8c, 0x0f92, 0x0f98, 0x0f9e, 0x0fa4, 0x0faa,
+	0x0fb0, 0x0fb6, 0x0fbc, 0x0fc2, 0x0fc8, 0x0fce, 0x0fd4, 0x0fda,
+	0x0fe0, 0x0fe6, 0x0fec, 0x0ff2, 0x0ff8, 0x0ffe, 0x1004, 0x100a,
+	0x1010, 0x1016, 0x101c, 0x1022, 0x1028, 0x102e, 0x1034, 0x103a,
+	0x1040, 0x1046, 0x104c, 0x1052, 0x1058, 0x105e, 0x1064, 0x106a,
+	// Entry 3C0 - 3FF
+	0x1070, 0x1076, 0x107c, 0x1082, 0x1088, 0x108e, 0x1094, 0x109a,
+	0x10a0, 0x10a6, 0x10ac, 0x10b2, 0x10b8, 0x10be, 0x10c4, 0x10ca,
+	0x10d0, 0x10d6, 0x10dc, 0x10e2, 0x10e8, 0x10ee, 0x10f4, 0x10fa,
+	0x1100, 0x1106, 0x110c, 0x1112, 0x1118, 0x111e, 0x1124, 0x112a,
+	0x1130, 0x1136, 0x113c, 0x1142, 0x1148, 0x114e, 0x1154, 0x115a,
+	0x1160, 0x1166, 0x116c, 0x1172, 0x1178, 0x1180, 0x1188, 0x1190,
+	0x1198, 0x11a0, 0x11a8, 0x11b0, 0x11b6, 0x11d7, 0x11e6, 0x11ee,
+	0x11ef, 0x11f0, 0x11f1, 0x11f2, 0x11f3, 0x11f4, 0x11f5, 0x11f6,
+	// Entry 400 - 43F
+	0x11f7, 0x11f8, 0x11f9, 0x11fa, 0x11fb, 0x11fc, 0x11fd, 0x11fe,
+	0x11ff, 0x1200, 0x1201, 0x1205, 0x1209, 0x120d, 0x1211, 0x1215,
+	0x1219, 0x121b, 0x121d, 0x121f, 0x1221, 0x1223, 0x1225, 0x1227,
+	0x1229, 0x122b, 0x122d, 0x122f, 0x1231, 0x1233, 0x1235, 0x1237,
+	0x1239, 0x123b, 0x123d, 0x123f, 0x1241, 0x1243, 0x1245, 0x1247,
+	0x1249, 0x124b, 0x124d, 0x124f, 0x1251, 0x1253, 0x1255, 0x1257,
+	0x1259, 0x125b, 0x125d, 0x125f, 0x1263, 0x1267, 0x126b, 0x126f,
+	0x1270, 0x1271, 0x1272, 0x1273, 0x1274, 0x1275, 0x1277, 0x1279,
+	// Entry 440 - 47F
+	0x127b, 0x127d, 0x127f, 0x1281, 0x1283, 0x1285, 0x1287, 0x1289,
+	0x128c, 0x128e, 0x1290, 0x1292, 0x1294, 0x1297, 0x1299, 0x129b,
+	0x129d, 0x129f, 0x12a1, 0x12a3, 0x12a5, 0x12a7, 0x12a9, 0x12ab,
+	0x12ad, 0x12af, 0x12b2, 0x12b4, 0x12b6, 0x12b8, 0x12ba, 0x12bc,
+	0x12be, 0x12c0, 0x12c2, 0x12c4, 0x12c6, 0x12c9, 0x12cb, 0x12cd,
+	0x12d0, 0x12d2, 0x12d4, 0x12d6, 0x12d8, 0x12da, 0x12dc, 0x12de,
+	0x12e6, 0x12ee, 0x12fa, 0x1306, 0x1312, 0x131e, 0x132a, 0x1332,
+	0x133a, 0x1346, 0x1352, 0x135e, 0x136a, 0x136c, 0x136e, 0x1370,
+	// Entry 480 - 4BF
+	0x1372, 0x1374, 0x1376, 0x1378, 0x137a, 0x137c, 0x137e, 0x1380,
+	0x1382, 0x1384, 0x1386, 0x1388, 0x138a, 0x138d, 0x1390, 0x1392,
+	0x1394, 0x1396, 0x1398, 0x139a, 0x139c, 0x139e, 0x13a0, 0x13a2,
+	0x13a4, 0x13a6, 0x13a8, 0x13aa, 0x13ac, 0x13ae, 0x13b0, 0x13b2,
+	0x13b4, 0x13b6, 0x13b8, 0x13ba, 0x13bc, 0x13bf, 0x13c1, 0x13c3,
+	0x13c5, 0x13c7, 0x13c9, 0x13cb, 0x13cd, 0x13cf, 0x13d1, 0x13d3,
+	0x13d6, 0x13d8, 0x13da, 0x13dc, 0x13de, 0x13e0, 0x13e2, 0x13e4,
+	0x13e6, 0x13e8, 0x13ea, 0x13ec, 0x13ee, 0x13f0, 0x13f2, 0x13f5,
+	// Entry 4C0 - 4FF
+	0x13f8, 0x13fb, 0x13fe, 0x1401, 0x1404, 0x1407, 0x140a, 0x140d,
+	0x1410, 0x1413, 0x1416, 0x1419, 0x141c, 0x141f, 0x1422, 0x1425,
+	0x1428, 0x142b, 0x142e, 0x1431, 0x1434, 0x1437, 0x143a, 0x143d,
+	0x1440, 0x1447, 0x1449, 0x144b, 0x144d, 0x1450, 0x1452, 0x1454,
+	0x1456, 0x1458, 0x145a, 0x1460, 0x1466, 0x1469, 0x146c, 0x146f,
+	0x1472, 0x1475, 0x1478, 0x147b, 0x147e, 0x1481, 0x1484, 0x1487,
+	0x148a, 0x148d, 0x1490, 0x1493, 0x1496, 0x1499, 0x149c, 0x149f,
+	0x14a2, 0x14a5, 0x14a8, 0x14ab, 0x14ae, 0x14b1, 0x14b4, 0x14b7,
+	// Entry 500 - 53F
+	0x14ba, 0x14bd, 0x14c0, 0x14c3, 0x14c6, 0x14c9, 0x14cc, 0x14cf,
+	0x14d2, 0x14d5, 0x14d8, 0x14db, 0x14de, 0x14e1, 0x14e4, 0x14e7,
+	0x14ea, 0x14ed, 0x14f6, 0x14ff, 0x1508, 0x1511, 0x151a, 0x1523,
+	0x152c, 0x1535, 0x153e, 0x1541, 0x1544, 0x1547, 0x154a, 0x154d,
+	0x1550, 0x1553, 0x1556, 0x1559, 0x155c, 0x155f, 0x1562, 0x1565,
+	0x1568, 0x156b, 0x156e, 0x1571, 0x1574, 0x1577, 0x157a, 0x157d,
+	0x1580, 0x1583, 0x1586, 0x1589, 0x158c, 0x158f, 0x1592, 0x1595,
+	0x1598, 0x159b, 0x159e, 0x15a1, 0x15a4, 0x15a7, 0x15aa, 0x15ad,
+	// Entry 540 - 57F
+	0x15b0, 0x15b3, 0x15b6, 0x15b9, 0x15bc, 0x15bf, 0x15c2, 0x15c5,
+	0x15c8, 0x15cb, 0x15ce, 0x15d1, 0x15d4, 0x15d7, 0x15da, 0x15dd,
+	0x15e0, 0x15e3, 0x15e6, 0x15e9, 0x15ec, 0x15ef, 0x15f2, 0x15f5,
+	0x15f8, 0x15fb, 0x15fe, 0x1601, 0x1604, 0x1607, 0x160a, 0x160d,
+	0x1610, 0x1613, 0x1616, 0x1619, 0x161c, 0x161f, 0x1622, 0x1625,
+	0x1628, 0x162b, 0x162e, 0x1631, 0x1634, 0x1637, 0x163a, 0x163d,
+	0x1640, 0x1643, 0x1646, 0x1649, 0x164c, 0x164f, 0x1652, 0x1655,
+	0x1658, 0x165b, 0x165e, 0x1661, 0x1664, 0x1667, 0x166a, 0x166d,
+	// Entry 580 - 5BF
+	0x1670, 0x1673, 0x1676, 0x1679, 0x167c, 0x167f, 0x1682, 0x1685,
+	0x1688, 0x168b, 0x168e, 0x1691, 0x1694, 0x1697, 0x169a, 0x169d,
+	0x16a0, 0x16a3, 0x16a6, 0x16a9, 0x16ac, 0x16af, 0x16b2, 0x16b5,
+	0x16b8, 0x16bb, 0x16be, 0x16c1, 0x16c4, 0x16c7, 0x16ca, 0x16cd,
+	0x16d0, 0x16d3, 0x16d6, 0x16d9, 0x16dc, 0x16df, 0x16e2, 0x16e5,
+	0x16e8, 0x16eb, 0x16ee, 0x16f1, 0x16f4, 0x16f7, 0x16fa, 0x16fd,
+	0x1700, 0x1703, 0x1706, 0x1709, 0x170c, 0x170f, 0x1712, 0x1715,
+	0x1718, 0x171b, 0x171e, 0x1721, 0x1724, 0x1727, 0x172a, 0x172d,
+	// Entry 5C0 - 5FF
+	0x1730, 0x1733, 0x1736, 0x1739, 0x173c, 0x173f, 0x1742, 0x1745,
+	0x1748, 0x174b, 0x174e, 0x1751, 0x1754, 0x1757, 0x175a, 0x175d,
+	0x1760, 0x1763, 0x1766, 0x1769, 0x176c, 0x176f, 0x1772, 0x1775,
+	0x1778, 0x177b, 0x177e, 0x1781, 0x1784, 0x1787, 0x178a, 0x178d,
+	0x1790, 0x1793, 0x1796, 0x1799, 0x179c, 0x179f, 0x17a2, 0x17a5,
+	0x17a8, 0x17ab, 0x17ae, 0x17b1, 0x17b4, 0x17b7, 0x17ba, 0x17bd,
+	0x17c0, 0x17c3, 0x17c6, 0x17c9, 0x17cc, 0x17cf, 0x17d2, 0x17d5,
+	0x17d8, 0x17db, 0x17de, 0x17e1, 0x17e4, 0x17e7, 0x17ea, 0x17ed,
+	// Entry 600 - 63F
+	0x17f0, 0x17f3, 0x17f6, 0x17f9, 0x17fc, 0x17ff, 0x1802, 0x1805,
+	0x1808, 0x180b, 0x180e, 0x1811, 0x1814, 0x1817, 0x181a, 0x181d,
+	0x1820, 0x1823, 0x1826, 0x1829, 0x182c, 0x182f, 0x1832, 0x1835,
+	0x1838, 0x183b, 0x183e, 0x1841, 0x1844, 0x1847, 0x184a, 0x184d,
+	0x1850, 0x1853, 0x1856, 0x1859, 0x185c, 0x185f, 0x1862, 0x1865,
+	0x1868, 0x186b, 0x186e, 0x1871, 0x1874, 0x1877, 0x187a, 0x187d,
+	0x1880, 0x1883, 0x1886, 0x1889, 0x188c, 0x188f, 0x1892, 0x1895,
+	0x1898, 0x189b, 0x189e, 0x18a1, 0x18a4, 0x18a7, 0x18aa, 0x18ad,
+	// Entry 640 - 67F
+	0x18b0, 0x18b3, 0x18b6, 0x18b9, 0x18bc, 0x18bf, 0x18c2, 0x18c5,
+	0x18c8, 0x18cb, 0x18ce, 0x18d1, 0x18d4, 0x18d7, 0x18da, 0x18dd,
+	0x18e0, 0x18e3, 0x18e6, 0x18e9, 0x18ec, 0x18ef, 0x18f2, 0x18f5,
+	0x18f8, 0x18fb, 0x18fe, 0x1901, 0x1904, 0x1907, 0x190a, 0x190d,
+	0x1910, 0x1913, 0x1916, 0x1919, 0x191c, 0x191f, 0x1922, 0x1925,
+	0x1928, 0x192b, 0x192e, 0x1931, 0x1934, 0x1937, 0x193a, 0x193d,
+	0x1940, 0x1943, 0x1946, 0x1949, 0x194c, 0x194f, 0x1952, 0x1955,
+	0x1958, 0x195b, 0x195e, 0x1961, 0x1964, 0x1967, 0x196a, 0x196d,
+	// Entry 680 - 6BF
+	0x1970, 0x1973, 0x1976, 0x1979, 0x197c, 0x197f, 0x1982, 0x1985,
+	0x1988, 0x198b, 0x198e, 0x1991, 0x1994, 0x1997, 0x199a, 0x199d,
+	0x19a0, 0x19a3, 0x19a6, 0x19a9, 0x19ac, 0x19af, 0x19b2, 0x19b5,
+	0x19b8, 0x19bb, 0x19be, 0x19c1, 0x19c4, 0x19c7, 0x19ca, 0x19cd,
+	0x19d0, 0x19d3, 0x19d6, 0x19d9, 0x19dc, 0x19df, 0x19e2, 0x19e5,
+	0x19e8, 0x19eb, 0x19ee, 0x19f1, 0x19f4, 0x19f7, 0x19fa, 0x19fd,
+	0x1a00, 0x1a03, 0x1a06, 0x1a09, 0x1a0c, 0x1a0f, 0x1a12, 0x1a15,
+	0x1a18, 0x1a1b, 0x1a1e, 0x1a21, 0x1a24, 0x1a27, 0x1a2a, 0x1a2d,
+	// Entry 6C0 - 6FF
+	0x1a30,
+} // Size: 3482 bytes
+
+var xorData string = "" + // Size: 4907 bytes
+	"\x02\x0c\x09\x02\xb0\xec\x02\xad\xd8\x02\xad\xd9\x02\x06\x07\x02\x0f\x12" +
+	"\x02\x0f\x1f\x02\x0f\x1d\x02\x01\x13\x02\x0f\x16\x02\x0f\x0b\x02\x0f3" +
+	"\x02\x0f7\x02\x0f?\x02\x0f/\x02\x0f*\x02\x0c&\x02\x0c*\x02\x0c;\x02\x0c9" +
+	"\x02\x0c%\x02\xab\xed\x02\xab\xe2\x02\xab\xe3\x02\xa9\xe0\x02\xa9\xe1" +
+	"\x02\xa9\xe6\x02\xa3\xcb\x02\xa3\xc8\x02\xa3\xc9\x02\x01#\x02\x01\x08" +
+	"\x02\x0e>\x02\x0e'\x02\x0f\x03\x02\x03\x0d\x02\x03\x09\x02\x03\x17\x02" +
+	"\x03\x0e\x02\x02\x03\x02\x011\x02\x01\x00\x02\x01\x10\x02\x03<\x02\x07" +
+	"\x0d\x02\x02\x0c\x02\x0c0\x02\x01\x03\x02\x01\x01\x02\x01 \x02\x01\x22" +
+	"\x02\x01)\x02\x01\x0a\x02\x01\x0c\x02\x02\x06\x02\x02\x02\x02\x03\x10" +
+	"\x03\x037 \x03\x0b+\x03\x021\x00\x02\x01\x04\x02\x01\x02\x02\x019\x02" +
+	"\x03\x1c\x02\x02$\x03\x80p$\x02\x03:\x02\x03\x0a\x03\xc1r.\x03\xc1r,\x03" +
+	"\xc1r\x02\x02\x02:\x02\x02>\x02\x02,\x02\x02\x10\x02\x02\x00\x03\xc1s<" +
+	"\x03\xc1s*\x03\xc2L$\x03\xc2L;\x02\x09)\x02\x0a\x19\x03\x83\xab\xe3\x03" +
+	"\x83\xab\xf2\x03 4\xe0\x03\x81\xab\xea\x03\x81\xab\xf3\x03 4\xef\x03\x96" +
+	"\xe1\xcd\x03\x84\xe5\xc3\x02\x0d\x11\x03\x8b\xec\xcb\x03\x94\xec\xcf\x03" +
+	"\x9a\xec\xc2\x03\x8b\xec\xdb\x03\x94\xec\xdf\x03\x9a\xec\xd2\x03\x01\x0c" +
+	"!\x03\x01\x0c#\x03ʠ\x9d\x03ʣ\x9c\x03ʢ\x9f\x03ʥ\x9e\x03ʤ\x91\x03ʧ\x90\x03" +
+	"ʦ\x93\x03ʩ\x92\x03ʨ\x95\x03\xca\xf3\xb5\x03\xca\xf0\xb4\x03\xca\xf1\xb7" +
+	"\x03\xca\xf6\xb6\x03\xca\xf7\x89\x03\xca\xf4\x88\x03\xca\xf5\x8b\x03\xca" +
+	"\xfa\x8a\x03\xca\xfb\x8d\x03\xca\xf8\x8c\x03\xca\xf9\x8f\x03\xca\xfe\x8e" +
+	"\x03\xca\xff\x81\x03\xca\xfc\x80\x03\xca\xfd\x83\x03\xca\xe2\x82\x03\xca" +
+	"\xe3\x85\x03\xca\xe0\x84\x03\xca\xe1\x87\x03\xca\xe6\x86\x03\xca\xe7\x99" +
+	"\x03\xca\xe4\x98\x03\xca\xe5\x9b\x03\xca\xea\x9a\x03\xca\xeb\x9d\x03\xca" +
+	"\xe8\x9c\x03ؓ\x89\x03ߔ\x8b\x02\x010\x03\x03\x04\x1e\x03\x04\x15\x12\x03" +
+	"\x0b\x05,\x03\x06\x04\x00\x03\x06\x04)\x03\x06\x044\x03\x06\x04<\x03\x06" +
+	"\x05\x1d\x03\x06\x06\x00\x03\x06\x06\x0a\x03\x06\x06'\x03\x06\x062\x03" +
+	"\x0786\x03\x079/\x03\x079 \x03\x07:\x0e\x03\x07:\x1b\x03\x07:%\x03\x07;/" +
+	"\x03\x07;%\x03\x074\x11\x03\x076\x09\x03\x077*\x03\x070\x01\x03\x070\x0f" +
+	"\x03\x070.\x03\x071\x16\x03\x071\x04\x03\x0710\x03\x072\x18\x03\x072-" +
+	"\x03\x073\x14\x03\x073>\x03\x07'\x09\x03\x07 \x00\x03\x07\x1f\x0b\x03" +
+	"\x07\x18#\x03\x07\x18(\x03\x07\x186\x03\x07\x18\x03\x03\x07\x19\x16\x03" +
+	"\x07\x116\x03\x07\x12'\x03\x07\x13\x10\x03\x07\x0c&\x03\x07\x0c\x08\x03" +
+	"\x07\x0c\x13\x03\x07\x0d\x02\x03\x07\x0d\x1c\x03\x07\x0b5\x03\x07\x0b" +
+	"\x0a\x03\x07\x0b\x01\x03\x07\x0b\x0f\x03\x07\x05\x00\x03\x07\x05\x09\x03" +
+	"\x07\x05\x0b\x03\x07\x07\x01\x03\x07\x07\x08\x03\x07\x00<\x03\x07\x00+" +
+	"\x03\x07\x01)\x03\x07\x01\x1b\x03\x07\x01\x08\x03\x07\x03?\x03\x0445\x03" +
+	"\x044\x08\x03\x0454\x03\x04)/\x03\x04)5\x03\x04+\x05\x03\x04+\x14\x03" +
+	"\x04+ \x03\x04+<\x03\x04*&\x03\x04*\x22\x03\x04&8\x03\x04!\x01\x03\x04!" +
+	"\x22\x03\x04\x11+\x03\x04\x10.\x03\x04\x104\x03\x04\x13=\x03\x04\x12\x04" +
+	"\x03\x04\x12\x0a\x03\x04\x0d\x1d\x03\x04\x0d\x07\x03\x04\x0d \x03\x05<>" +
+	"\x03\x055<\x03\x055!\x03\x055#\x03\x055&\x03\x054\x1d\x03\x054\x02\x03" +
+	"\x054\x07\x03\x0571\x03\x053\x1a\x03\x053\x16\x03\x05.<\x03\x05.\x07\x03" +
+	"\x05):\x03\x05)<\x03\x05)\x0c\x03\x05)\x15\x03\x05+-\x03\x05+5\x03\x05$" +
+	"\x1e\x03\x05$\x14\x03\x05'\x04\x03\x05'\x14\x03\x05&\x02\x03\x05\x226" +
+	"\x03\x05\x22\x0c\x03\x05\x22\x1c\x03\x05\x19\x0a\x03\x05\x1b\x09\x03\x05" +
+	"\x1b\x0c\x03\x05\x14\x07\x03\x05\x16?\x03\x05\x16\x0c\x03\x05\x0c\x05" +
+	"\x03\x05\x0e\x0f\x03\x05\x01\x0e\x03\x05\x00(\x03\x05\x030\x03\x05\x03" +
+	"\x06\x03\x0a==\x03\x0a=1\x03\x0a=,\x03\x0a=\x0c\x03\x0a??\x03\x0a<\x08" +
+	"\x03\x0a9!\x03\x0a9)\x03\x0a97\x03\x0a99\x03\x0a6\x0a\x03\x0a6\x1c\x03" +
+	"\x0a6\x17\x03\x0a7'\x03\x0a78\x03\x0a73\x03\x0a'\x01\x03\x0a'&\x03\x0a" +
+	"\x1f\x0e\x03\x0a\x1f\x03\x03\x0a\x1f3\x03\x0a\x1b/\x03\x0a\x18\x19\x03" +
+	"\x0a\x19\x01\x03\x0a\x16\x14\x03\x0a\x0e\x22\x03\x0a\x0f\x10\x03\x0a\x0f" +
+	"\x02\x03\x0a\x0f \x03\x0a\x0c\x04\x03\x0a\x0b>\x03\x0a\x0b+\x03\x0a\x08/" +
+	"\x03\x0a\x046\x03\x0a\x05\x14\x03\x0a\x00\x04\x03\x0a\x00\x10\x03\x0a" +
+	"\x00\x14\x03\x0b<3\x03\x0b;*\x03\x0b9\x22\x03\x0b9)\x03\x0b97\x03\x0b+" +
+	"\x10\x03\x0b((\x03\x0b&5\x03\x0b$\x1c\x03\x0b$\x12\x03\x0b%\x04\x03\x0b#" +
+	"<\x03\x0b#0\x03\x0b#\x0d\x03\x0b#\x19\x03\x0b!:\x03\x0b!\x1f\x03\x0b!" +
+	"\x00\x03\x0b\x1e5\x03\x0b\x1c\x1d\x03\x0b\x1d-\x03\x0b\x1d(\x03\x0b\x18." +
+	"\x03\x0b\x18 \x03\x0b\x18\x16\x03\x0b\x14\x13\x03\x0b\x15$\x03\x0b\x15" +
+	"\x22\x03\x0b\x12\x1b\x03\x0b\x12\x10\x03\x0b\x132\x03\x0b\x13=\x03\x0b" +
+	"\x12\x18\x03\x0b\x0c&\x03\x0b\x061\x03\x0b\x06:\x03\x0b\x05#\x03\x0b\x05" +
+	"<\x03\x0b\x04\x0b\x03\x0b\x04\x04\x03\x0b\x04\x1b\x03\x0b\x042\x03\x0b" +
+	"\x041\x03\x0b\x03\x03\x03\x0b\x03\x1d\x03\x0b\x03/\x03\x0b\x03+\x03\x0b" +
+	"\x02\x1b\x03\x0b\x02\x00\x03\x0b\x01\x1e\x03\x0b\x01\x08\x03\x0b\x015" +
+	"\x03\x06\x0d9\x03\x06\x0d=\x03\x06\x0d?\x03\x02\x001\x03\x02\x003\x03" +
+	"\x02\x02\x19\x03\x02\x006\x03\x02\x02\x1b\x03\x02\x004\x03\x02\x00<\x03" +
+	"\x02\x02\x0a\x03\x02\x02\x0e\x03\x02\x01\x1a\x03\x02\x01\x07\x03\x02\x01" +
+	"\x05\x03\x02\x01\x0b\x03\x02\x01%\x03\x02\x01\x0c\x03\x02\x01\x04\x03" +
+	"\x02\x01\x1c\x03\x02\x00.\x03\x02\x002\x03\x02\x00>\x03\x02\x00\x12\x03" +
+	"\x02\x00\x16\x03\x02\x011\x03\x02\x013\x03\x02\x02 \x03\x02\x02%\x03\x02" +
+	"\x02$\x03\x02\x028\x03\x02\x02;\x03\x02\x024\x03\x02\x012\x03\x02\x022" +
+	"\x03\x02\x02/\x03\x02\x01,\x03\x02\x01\x13\x03\x02\x01\x16\x03\x02\x01" +
+	"\x11\x03\x02\x01\x1e\x03\x02\x01\x15\x03\x02\x01\x17\x03\x02\x01\x0f\x03" +
+	"\x02\x01\x08\x03\x02\x00?\x03\x02\x03\x07\x03\x02\x03\x0d\x03\x02\x03" +
+	"\x13\x03\x02\x03\x1d\x03\x02\x03\x1f\x03\x02\x00\x03\x03\x02\x00\x0d\x03" +
+	"\x02\x00\x01\x03\x02\x00\x1b\x03\x02\x00\x19\x03\x02\x00\x18\x03\x02\x00" +
+	"\x13\x03\x02\x00/\x03\x07>\x12\x03\x07<\x1f\x03\x07>\x1d\x03\x06\x1d\x0e" +
+	"\x03\x07>\x1c\x03\x07>:\x03\x07>\x13\x03\x04\x12+\x03\x07?\x03\x03\x07>" +
+	"\x02\x03\x06\x224\x03\x06\x1a.\x03\x07<%\x03\x06\x1c\x0b\x03\x0609\x03" +
+	"\x05\x1f\x01\x03\x04'\x08\x03\x93\xfd\xf5\x03\x02\x0d \x03\x02\x0d#\x03" +
+	"\x02\x0d!\x03\x02\x0d&\x03\x02\x0d\x22\x03\x02\x0d/\x03\x02\x0d,\x03\x02" +
+	"\x0d$\x03\x02\x0d'\x03\x02\x0d%\x03\x02\x0d;\x03\x02\x0d=\x03\x02\x0d?" +
+	"\x03\x099.\x03\x08\x0b7\x03\x08\x02\x14\x03\x08\x14\x0d\x03\x08.:\x03" +
+	"\x089'\x03\x0f\x0b\x18\x03\x0f\x1c1\x03\x0f\x17&\x03\x0f9\x1f\x03\x0f0" +
+	"\x0c\x03\x0e\x0a9\x03\x0e\x056\x03\x0e\x1c#\x03\x0f\x13\x0e\x03\x072\x00" +
+	"\x03\x070\x0d\x03\x072\x0b\x03\x06\x11\x18\x03\x070\x10\x03\x06\x0f(\x03" +
+	"\x072\x05\x03\x06\x0f,\x03\x073\x15\x03\x06\x07\x08\x03\x05\x16\x02\x03" +
+	"\x04\x0b \x03\x05:8\x03\x05\x16%\x03\x0a\x0d\x1f\x03\x06\x16\x10\x03\x05" +
+	"\x1d5\x03\x05*;\x03\x05\x16\x1b\x03\x04.-\x03\x06\x1a\x19\x03\x04\x03," +
+	"\x03\x0b87\x03\x04/\x0a\x03\x06\x00,\x03\x04-\x01\x03\x04\x1e-\x03\x06/(" +
+	"\x03\x0a\x0b5\x03\x06\x0e7\x03\x06\x07.\x03\x0597\x03\x0a*%\x03\x0760" +
+	"\x03\x06\x0c;\x03\x05'\x00\x03\x072.\x03\x072\x08\x03\x06=\x01\x03\x06" +
+	"\x05\x1b\x03\x06\x06\x12\x03\x06$=\x03\x06'\x0d\x03\x04\x11\x0f\x03\x076" +
+	",\x03\x06\x07;\x03\x06.,\x03\x86\xf9\xea\x03\x8f\xff\xeb\x02\x092\x02" +
+	"\x095\x02\x094\x02\x09;\x02\x09>\x02\x098\x02\x09*\x02\x09/\x02\x09,\x02" +
+	"\x09%\x02\x09&\x02\x09#\x02\x09 \x02\x08!\x02\x08%\x02\x08$\x02\x08+\x02" +
+	"\x08.\x02\x08*\x02\x08&\x02\x088\x02\x08>\x02\x084\x02\x086\x02\x080\x02" +
+	"\x08\x10\x02\x08\x17\x02\x08\x12\x02\x08\x1d\x02\x08\x1f\x02\x08\x13\x02" +
+	"\x08\x15\x02\x08\x14\x02\x08\x0c\x03\x8b\xfd\xd0\x03\x81\xec\xc6\x03\x87" +
+	"\xe0\x8a\x03-2\xe3\x03\x80\xef\xe4\x03-2\xea\x03\x88\xe6\xeb\x03\x8e\xe6" +
+	"\xe8\x03\x84\xe6\xe9\x03\x97\xe6\xee\x03-2\xf9\x03-2\xf6\x03\x8e\xe3\xad" +
+	"\x03\x80\xe3\x92\x03\x88\xe3\x90\x03\x8e\xe3\x90\x03\x80\xe3\x97\x03\x88" +
+	"\xe3\x95\x03\x88\xfe\xcb\x03\x8e\xfe\xca\x03\x84\xfe\xcd\x03\x91\xef\xc9" +
+	"\x03-2\xc1\x03-2\xc0\x03-2\xcb\x03\x88@\x09\x03\x8e@\x08\x03\x8f\xe0\xf5" +
+	"\x03\x8e\xe6\xf9\x03\x8e\xe0\xfa\x03\x93\xff\xf4\x03\x84\xee\xd3\x03\x0b" +
+	"(\x04\x023 \x03\x0b)\x08\x021;\x02\x01*\x03\x0b#\x10\x03\x0b 0\x03\x0b!" +
+	"\x10\x03\x0b!0\x03\x07\x15\x08\x03\x09?5\x03\x07\x1f\x08\x03\x07\x17\x0b" +
+	"\x03\x09\x1f\x15\x03\x0b\x1c7\x03\x0a+#\x03\x06\x1a\x1b\x03\x06\x1a\x14" +
+	"\x03\x0a\x01\x18\x03\x06#\x1b\x03\x0a2\x0c\x03\x0a\x01\x04\x03\x09#;\x03" +
+	"\x08='\x03\x08\x1a\x0a\x03\x07</\x03\x07:+\x03\x07\x07*\x03\x06&\x1c\x03" +
+	"\x09\x0c\x16\x03\x09\x10\x0e\x03\x08'\x0f\x03\x08+\x09\x03\x074%\x03\x06" +
+	"!3\x03\x06\x03+\x03\x0b\x1e\x19\x03\x0a))\x03\x09\x08\x19\x03\x08,\x05" +
+	"\x03\x07<2\x03\x06\x1c>\x03\x0a\x111\x03\x09\x1b\x09\x03\x073.\x03\x07" +
+	"\x01\x00\x03\x09/,\x03\x07#>\x03\x07\x048\x03\x0a\x1f\x22\x03\x098>\x03" +
+	"\x09\x11\x00\x03\x08/\x17\x03\x06'\x22\x03\x0b\x1a+\x03\x0a\x22\x19\x03" +
+	"\x0a/1\x03\x0974\x03\x09\x0f\x22\x03\x08,\x22\x03\x08?\x14\x03\x07$5\x03" +
+	"\x07<3\x03\x07=*\x03\x07\x13\x18\x03\x068\x0a\x03\x06\x09\x16\x03\x06" +
+	"\x13\x00\x03\x08\x067\x03\x08\x01\x03\x03\x08\x12\x1d\x03\x07+7\x03\x06(" +
+	";\x03\x06\x1c?\x03\x07\x0e\x17\x03\x0a\x06\x1d\x03\x0a\x19\x07\x03\x08" +
+	"\x14$\x03\x07$;\x03\x08,$\x03\x08\x06\x0d\x03\x07\x16\x0a\x03\x06>>\x03" +
+	"\x0a\x06\x12\x03\x0a\x14)\x03\x09\x0d\x1f\x03\x09\x12\x17\x03\x09\x19" +
+	"\x01\x03\x08\x11 \x03\x08\x1d'\x03\x06<\x1a\x03\x0a.\x00\x03\x07'\x18" +
+	"\x03\x0a\x22\x08\x03\x08\x0d\x0a\x03\x08\x13)\x03\x07*)\x03\x06<,\x03" +
+	"\x07\x0b\x1a\x03\x09.\x14\x03\x09\x0d\x1e\x03\x07\x0e#\x03\x0b\x1d'\x03" +
+	"\x0a\x0a8\x03\x09%2\x03\x08+&\x03\x080\x12\x03\x0a)4\x03\x08\x06\x1f\x03" +
+	"\x0b\x1b\x1a\x03\x0a\x1b\x0f\x03\x0b\x1d*\x03\x09\x16$\x03\x090\x11\x03" +
+	"\x08\x11\x08\x03\x0a*(\x03\x0a\x042\x03\x089,\x03\x074'\x03\x07\x0f\x05" +
+	"\x03\x09\x0b\x0a\x03\x07\x1b\x01\x03\x09\x17:\x03\x09.\x0d\x03\x07.\x11" +
+	"\x03\x09+\x15\x03\x080\x13\x03\x0b\x1f\x19\x03\x0a \x11\x03\x0a\x220\x03" +
+	"\x09\x07;\x03\x08\x16\x1c\x03\x07,\x13\x03\x07\x0e/\x03\x06\x221\x03\x0a" +
+	".\x0a\x03\x0a7\x02\x03\x0a\x032\x03\x0a\x1d.\x03\x091\x06\x03\x09\x19:" +
+	"\x03\x08\x02/\x03\x060+\x03\x06\x0f-\x03\x06\x1c\x1f\x03\x06\x1d\x07\x03" +
+	"\x0a,\x11\x03\x09=\x0d\x03\x09\x0b;\x03\x07\x1b/\x03\x0a\x1f:\x03\x09 " +
+	"\x1f\x03\x09.\x10\x03\x094\x0b\x03\x09\x1a1\x03\x08#\x1a\x03\x084\x1d" +
+	"\x03\x08\x01\x1f\x03\x08\x11\x22\x03\x07'8\x03\x07\x1a>\x03\x0757\x03" +
+	"\x06&9\x03\x06+\x11\x03\x0a.\x0b\x03\x0a,>\x03\x0a4#\x03\x08%\x17\x03" +
+	"\x07\x05\x22\x03\x07\x0c\x0b\x03\x0a\x1d+\x03\x0a\x19\x16\x03\x09+\x1f" +
+	"\x03\x09\x08\x0b\x03\x08\x16\x18\x03\x08+\x12\x03\x0b\x1d\x0c\x03\x0a=" +
+	"\x10\x03\x0a\x09\x0d\x03\x0a\x10\x11\x03\x09&0\x03\x08(\x1f\x03\x087\x07" +
+	"\x03\x08\x185\x03\x07'6\x03\x06.\x05\x03\x06=\x04\x03\x06;;\x03\x06\x06," +
+	"\x03\x0b\x18>\x03\x08\x00\x18\x03\x06 \x03\x03\x06<\x00\x03\x09%\x18\x03" +
+	"\x0b\x1c<\x03\x0a%!\x03\x0a\x09\x12\x03\x0a\x16\x02\x03\x090'\x03\x09" +
+	"\x0e=\x03\x08 \x0e\x03\x08>\x03\x03\x074>\x03\x06&?\x03\x06\x19\x09\x03" +
+	"\x06?(\x03\x0a-\x0e\x03\x09:3\x03\x098:\x03\x09\x12\x0b\x03\x09\x1d\x17" +
+	"\x03\x087\x05\x03\x082\x14\x03\x08\x06%\x03\x08\x13\x1f\x03\x06\x06\x0e" +
+	"\x03\x0a\x22<\x03\x09/<\x03\x06>+\x03\x0a'?\x03\x0a\x13\x0c\x03\x09\x10<" +
+	"\x03\x07\x1b=\x03\x0a\x19\x13\x03\x09\x22\x1d\x03\x09\x07\x0d\x03\x08)" +
+	"\x1c\x03\x06=\x1a\x03\x0a/4\x03\x0a7\x11\x03\x0a\x16:\x03\x09?3\x03\x09:" +
+	"/\x03\x09\x05\x0a\x03\x09\x14\x06\x03\x087\x22\x03\x080\x07\x03\x08\x1a" +
+	"\x1f\x03\x07\x04(\x03\x07\x04\x09\x03\x06 %\x03\x06<\x08\x03\x0a+\x14" +
+	"\x03\x09\x1d\x16\x03\x0a70\x03\x08 >\x03\x0857\x03\x070\x0a\x03\x06=\x12" +
+	"\x03\x06\x16%\x03\x06\x1d,\x03\x099#\x03\x09\x10>\x03\x07 \x1e\x03\x08" +
+	"\x0c<\x03\x08\x0b\x18\x03\x08\x15+\x03\x08,:\x03\x08%\x22\x03\x07\x0a$" +
+	"\x03\x0b\x1c=\x03\x07+\x08\x03\x0a/\x05\x03\x0a \x07\x03\x0a\x12'\x03" +
+	"\x09#\x11\x03\x08\x1b\x15\x03\x0a\x06\x01\x03\x09\x1c\x1b\x03\x0922\x03" +
+	"\x07\x14<\x03\x07\x09\x04\x03\x061\x04\x03\x07\x0e\x01\x03\x0a\x13\x18" +
+	"\x03\x0a-\x0c\x03\x0a?\x0d\x03\x0a\x09\x0a\x03\x091&\x03\x0a/\x0b\x03" +
+	"\x08$<\x03\x083\x1d\x03\x08\x0c$\x03\x08\x0d\x07\x03\x08\x0d?\x03\x08" +
+	"\x0e\x14\x03\x065\x0a\x03\x08\x1a#\x03\x08\x16#\x03\x0702\x03\x07\x03" +
+	"\x1a\x03\x06(\x1d\x03\x06+\x1b\x03\x06\x0b\x05\x03\x06\x0b\x17\x03\x06" +
+	"\x0c\x04\x03\x06\x1e\x19\x03\x06+0\x03\x062\x18\x03\x0b\x16\x1e\x03\x0a+" +
+	"\x16\x03\x0a-?\x03\x0a#:\x03\x0a#\x10\x03\x0a%$\x03\x0a>+\x03\x0a01\x03" +
+	"\x0a1\x10\x03\x0a\x099\x03\x0a\x0a\x12\x03\x0a\x19\x1f\x03\x0a\x19\x12" +
+	"\x03\x09*)\x03\x09-\x16\x03\x09.1\x03\x09.2\x03\x09<\x0e\x03\x09> \x03" +
+	"\x093\x12\x03\x09\x0b\x01\x03\x09\x1c2\x03\x09\x11\x1c\x03\x09\x15%\x03" +
+	"\x08,&\x03\x08!\x22\x03\x089(\x03\x08\x0b\x1a\x03\x08\x0d2\x03\x08\x0c" +
+	"\x04\x03\x08\x0c\x06\x03\x08\x0c\x1f\x03\x08\x0c\x0c\x03\x08\x0f\x1f\x03" +
+	"\x08\x0f\x1d\x03\x08\x00\x14\x03\x08\x03\x14\x03\x08\x06\x16\x03\x08\x1e" +
+	"#\x03\x08\x11\x11\x03\x08\x10\x18\x03\x08\x14(\x03\x07)\x1e\x03\x07.1" +
+	"\x03\x07 $\x03\x07 '\x03\x078\x08\x03\x07\x0d0\x03\x07\x0f7\x03\x07\x05#" +
+	"\x03\x07\x05\x1a\x03\x07\x1a7\x03\x07\x1d-\x03\x07\x17\x10\x03\x06)\x1f" +
+	"\x03\x062\x0b\x03\x066\x16\x03\x06\x09\x11\x03\x09(\x1e\x03\x07!5\x03" +
+	"\x0b\x11\x16\x03\x0a/\x04\x03\x0a,\x1a\x03\x0b\x173\x03\x0a,1\x03\x0a/5" +
+	"\x03\x0a\x221\x03\x0a\x22\x0d\x03\x0a?%\x03\x0a<,\x03\x0a?#\x03\x0a>\x19" +
+	"\x03\x0a\x08&\x03\x0a\x0b\x0e\x03\x0a\x0c:\x03\x0a\x0c+\x03\x0a\x03\x22" +
+	"\x03\x0a\x06)\x03\x0a\x11\x10\x03\x0a\x11\x1a\x03\x0a\x17-\x03\x0a\x14(" +
+	"\x03\x09)\x1e\x03\x09/\x09\x03\x09.\x00\x03\x09,\x07\x03\x09/*\x03\x09-9" +
+	"\x03\x09\x228\x03\x09%\x09\x03\x09:\x12\x03\x09;\x1d\x03\x09?\x06\x03" +
+	"\x093%\x03\x096\x05\x03\x096\x08\x03\x097\x02\x03\x09\x07,\x03\x09\x04," +
+	"\x03\x09\x1f\x16\x03\x09\x11\x03\x03\x09\x11\x12\x03\x09\x168\x03\x08*" +
+	"\x05\x03\x08/2\x03\x084:\x03\x08\x22+\x03\x08 0\x03\x08&\x0a\x03\x08;" +
+	"\x10\x03\x08>$\x03\x08>\x18\x03\x0829\x03\x082:\x03\x081,\x03\x081<\x03" +
+	"\x081\x1c\x03\x087#\x03\x087*\x03\x08\x09'\x03\x08\x00\x1d\x03\x08\x05-" +
+	"\x03\x08\x1f4\x03\x08\x1d\x04\x03\x08\x16\x0f\x03\x07*7\x03\x07'!\x03" +
+	"\x07%\x1b\x03\x077\x0c\x03\x07\x0c1\x03\x07\x0c.\x03\x07\x00\x06\x03\x07" +
+	"\x01\x02\x03\x07\x010\x03\x07\x06=\x03\x07\x01\x03\x03\x07\x01\x13\x03" +
+	"\x07\x06\x06\x03\x07\x05\x0a\x03\x07\x1f\x09\x03\x07\x17:\x03\x06*1\x03" +
+	"\x06-\x1d\x03\x06\x223\x03\x062:\x03\x060$\x03\x066\x1e\x03\x064\x12\x03" +
+	"\x0645\x03\x06\x0b\x00\x03\x06\x0b7\x03\x06\x07\x1f\x03\x06\x15\x12\x03" +
+	"\x0c\x05\x0f\x03\x0b+\x0b\x03\x0b+-\x03\x06\x16\x1b\x03\x06\x15\x17\x03" +
+	"\x89\xca\xea\x03\x89\xca\xe8\x03\x0c8\x10\x03\x0c8\x01\x03\x0c8\x0f\x03" +
+	"\x0d8%\x03\x0d8!\x03\x0c8-\x03\x0c8/\x03\x0c8+\x03\x0c87\x03\x0c85\x03" +
+	"\x0c9\x09\x03\x0c9\x0d\x03\x0c9\x0f\x03\x0c9\x0b\x03\xcfu\x0c\x03\xcfu" +
+	"\x0f\x03\xcfu\x0e\x03\xcfu\x09\x03\x0c9\x10\x03\x0d9\x0c\x03\xcf`;\x03" +
+	"\xcf`>\x03\xcf`9\x03\xcf`8\x03\xcf`7\x03\xcf`*\x03\xcf`-\x03\xcf`,\x03" +
+	"\x0d\x1b\x1a\x03\x0d\x1b&\x03\x0c=.\x03\x0c=%\x03\x0c>\x1e\x03\x0c>\x14" +
+	"\x03\x0c?\x06\x03\x0c?\x0b\x03\x0c?\x0c\x03\x0c?\x0d\x03\x0c?\x02\x03" +
+	"\x0c>\x0f\x03\x0c>\x08\x03\x0c>\x09\x03\x0c>,\x03\x0c>\x0c\x03\x0c?\x13" +
+	"\x03\x0c?\x16\x03\x0c?\x15\x03\x0c?\x1c\x03\x0c?\x1f\x03\x0c?\x1d\x03" +
+	"\x0c?\x1a\x03\x0c?\x17\x03\x0c?\x08\x03\x0c?\x09\x03\x0c?\x0e\x03\x0c?" +
+	"\x04\x03\x0c?\x05\x03\x0c<?\x03\x0c=\x00\x03\x0c=\x06\x03\x0c=\x05\x03" +
+	"\x0c=\x0c\x03\x0c=\x0f\x03\x0c=\x0d\x03\x0c=\x0b\x03\x0c=\x07\x03\x0c=" +
+	"\x19\x03\x0c=\x15\x03\x0c=\x11\x03\x0c=1\x03\x0c=3\x03\x0c=0\x03\x0c=>" +
+	"\x03\x0c=2\x03\x0c=6\x03\x0c<\x07\x03\x0c<\x05\x03\x0e:!\x03\x0e:#\x03" +
+	"\x0e8\x09\x03\x0e:&\x03\x0e8\x0b\x03\x0e:$\x03\x0e:,\x03\x0e8\x1a\x03" +
+	"\x0e8\x1e\x03\x0e:*\x03\x0e:7\x03\x0e:5\x03\x0e:;\x03\x0e:\x15\x03\x0e:<" +
+	"\x03\x0e:4\x03\x0e:'\x03\x0e:-\x03\x0e:%\x03\x0e:?\x03\x0e:=\x03\x0e:)" +
+	"\x03\x0e:/\x03\xcfs'\x03\x0d=\x0f\x03\x0d+*\x03\x0d99\x03\x0d9;\x03\x0d9" +
+	"?\x03\x0d)\x0d\x03\x0d(%\x02\x01\x18\x02\x01(\x02\x03'\x02\x03)\x02\x03+" +
+	"\x02\x03/\x02\x03\x19\x02\x03\x1b\x02\x03\x1f\x03\x0d\x22\x18\x03\x0d" +
+	"\x22\x1a\x03\x0d\x22'\x03\x0d\x22/\x03\x0d\x223\x03\x0d\x22$\x02\x01\x1e" +
+	"\x03\x0f$!\x03\x0f87\x03\x0f4\x0e\x03\x0f5\x1d\x03\x06'\x03\x03\x0f\x08" +
+	"\x18\x03\x0f\x0d\x1b\x03\x0e2=\x03\x0e;\x08\x03\x0e:\x0b\x03\x0e\x06$" +
+	"\x03\x0e\x0d)\x03\x0e\x16\x1f\x03\x0e\x16\x1b\x03\x0d$\x0a\x03\x05,\x1d" +
+	"\x03\x0d. \x03\x0d.#\x03\x0c(/\x03\x09%\x02\x03\x0d90\x03\x0d\x0e4\x03" +
+	"\x0d\x0d\x0f\x03\x0c#\x00\x03\x0c,\x1e\x03\x0c2\x0e\x03\x0c\x01\x17\x03" +
+	"\x0c\x09:\x03\x0e\x173\x03\x0c\x08\x03\x03\x0c\x11\x07\x03\x0c\x10\x18" +
+	"\x03\x0c\x1f\x1c\x03\x0c\x19\x0e\x03\x0c\x1a\x1f\x03\x0f0>\x03\x0b->\x03" +
+	"\x0b<+\x03\x0b8\x13\x03\x0b\x043\x03\x0b\x14\x03\x03\x0b\x16%\x03\x0d" +
+	"\x22&\x03\x0b\x1a\x1a\x03\x0b\x1a\x04\x03\x0a%9\x03\x0a&2\x03\x0a&0\x03" +
+	"\x0a!\x1a\x03\x0a!7\x03\x0a5\x10\x03\x0a=4\x03\x0a?\x0e\x03\x0a>\x10\x03" +
+	"\x0a\x00 \x03\x0a\x0f:\x03\x0a\x0f9\x03\x0a\x0b\x0a\x03\x0a\x17%\x03\x0a" +
+	"\x1b-\x03\x09-\x1a\x03\x09,4\x03\x09.,\x03\x09)\x09\x03\x096!\x03\x091" +
+	"\x1f\x03\x093\x16\x03\x0c+\x1f\x03\x098 \x03\x098=\x03\x0c(\x1a\x03\x0c(" +
+	"\x16\x03\x09\x0a+\x03\x09\x16\x12\x03\x09\x13\x0e\x03\x09\x153\x03\x08)!" +
+	"\x03\x09\x1a\x01\x03\x09\x18\x01\x03\x08%#\x03\x08>\x22\x03\x08\x05%\x03" +
+	"\x08\x02*\x03\x08\x15;\x03\x08\x1b7\x03\x0f\x07\x1d\x03\x0f\x04\x03\x03" +
+	"\x070\x0c\x03\x07;\x0b\x03\x07\x08\x17\x03\x07\x12\x06\x03\x06/-\x03\x06" +
+	"71\x03\x065+\x03\x06>7\x03\x06\x049\x03\x05+\x1e\x03\x05,\x17\x03\x05 " +
+	"\x1d\x03\x05\x22\x05\x03\x050\x1d"
+
+// lookup returns the trie value for the first UTF-8 encoding in s and
+// the width in bytes of this encoding. The size will be 0 if s does not
+// hold enough bytes to complete the encoding. len(s) must be greater than 0.
+func (t *idnaTrie) lookup(s []byte) (v uint16, sz int) {
+	c0 := s[0]
+	switch {
+	case c0 < 0x80: // is ASCII
+		return idnaValues[c0], 1
+	case c0 < 0xC2:
+		return 0, 1 // Illegal UTF-8: not a starter, not ASCII.
+	case c0 < 0xE0: // 2-byte UTF-8
+		if len(s) < 2 {
+			return 0, 0
+		}
+		i := idnaIndex[c0]
+		c1 := s[1]
+		if c1 < 0x80 || 0xC0 <= c1 {
+			return 0, 1 // Illegal UTF-8: not a continuation byte.
+		}
+		return t.lookupValue(uint32(i), c1), 2
+	case c0 < 0xF0: // 3-byte UTF-8
+		if len(s) < 3 {
+			return 0, 0
+		}
+		i := idnaIndex[c0]
+		c1 := s[1]
+		if c1 < 0x80 || 0xC0 <= c1 {
+			return 0, 1 // Illegal UTF-8: not a continuation byte.
+		}
+		o := uint32(i)<<6 + uint32(c1)
+		i = idnaIndex[o]
+		c2 := s[2]
+		if c2 < 0x80 || 0xC0 <= c2 {
+			return 0, 2 // Illegal UTF-8: not a continuation byte.
+		}
+		return t.lookupValue(uint32(i), c2), 3
+	case c0 < 0xF8: // 4-byte UTF-8
+		if len(s) < 4 {
+			return 0, 0
+		}
+		i := idnaIndex[c0]
+		c1 := s[1]
+		if c1 < 0x80 || 0xC0 <= c1 {
+			return 0, 1 // Illegal UTF-8: not a continuation byte.
+		}
+		o := uint32(i)<<6 + uint32(c1)
+		i = idnaIndex[o]
+		c2 := s[2]
+		if c2 < 0x80 || 0xC0 <= c2 {
+			return 0, 2 // Illegal UTF-8: not a continuation byte.
+		}
+		o = uint32(i)<<6 + uint32(c2)
+		i = idnaIndex[o]
+		c3 := s[3]
+		if c3 < 0x80 || 0xC0 <= c3 {
+			return 0, 3 // Illegal UTF-8: not a continuation byte.
+		}
+		return t.lookupValue(uint32(i), c3), 4
+	}
+	// Illegal rune
+	return 0, 1
+}
+
+// lookupUnsafe returns the trie value for the first UTF-8 encoding in s.
+// s must start with a full and valid UTF-8 encoded rune.
+func (t *idnaTrie) lookupUnsafe(s []byte) uint16 {
+	c0 := s[0]
+	if c0 < 0x80 { // is ASCII
+		return idnaValues[c0]
+	}
+	i := idnaIndex[c0]
+	if c0 < 0xE0 { // 2-byte UTF-8
+		return t.lookupValue(uint32(i), s[1])
+	}
+	i = idnaIndex[uint32(i)<<6+uint32(s[1])]
+	if c0 < 0xF0 { // 3-byte UTF-8
+		return t.lookupValue(uint32(i), s[2])
+	}
+	i = idnaIndex[uint32(i)<<6+uint32(s[2])]
+	if c0 < 0xF8 { // 4-byte UTF-8
+		return t.lookupValue(uint32(i), s[3])
+	}
+	return 0
+}
+
+// lookupString returns the trie value for the first UTF-8 encoding in s and
+// the width in bytes of this encoding. The size will be 0 if s does not
+// hold enough bytes to complete the encoding. len(s) must be greater than 0.
+func (t *idnaTrie) lookupString(s string) (v uint16, sz int) {
+	c0 := s[0]
+	switch {
+	case c0 < 0x80: // is ASCII
+		return idnaValues[c0], 1
+	case c0 < 0xC2:
+		return 0, 1 // Illegal UTF-8: not a starter, not ASCII.
+	case c0 < 0xE0: // 2-byte UTF-8
+		if len(s) < 2 {
+			return 0, 0
+		}
+		i := idnaIndex[c0]
+		c1 := s[1]
+		if c1 < 0x80 || 0xC0 <= c1 {
+			return 0, 1 // Illegal UTF-8: not a continuation byte.
+		}
+		return t.lookupValue(uint32(i), c1), 2
+	case c0 < 0xF0: // 3-byte UTF-8
+		if len(s) < 3 {
+			return 0, 0
+		}
+		i := idnaIndex[c0]
+		c1 := s[1]
+		if c1 < 0x80 || 0xC0 <= c1 {
+			return 0, 1 // Illegal UTF-8: not a continuation byte.
+		}
+		o := uint32(i)<<6 + uint32(c1)
+		i = idnaIndex[o]
+		c2 := s[2]
+		if c2 < 0x80 || 0xC0 <= c2 {
+			return 0, 2 // Illegal UTF-8: not a continuation byte.
+		}
+		return t.lookupValue(uint32(i), c2), 3
+	case c0 < 0xF8: // 4-byte UTF-8
+		if len(s) < 4 {
+			return 0, 0
+		}
+		i := idnaIndex[c0]
+		c1 := s[1]
+		if c1 < 0x80 || 0xC0 <= c1 {
+			return 0, 1 // Illegal UTF-8: not a continuation byte.
+		}
+		o := uint32(i)<<6 + uint32(c1)
+		i = idnaIndex[o]
+		c2 := s[2]
+		if c2 < 0x80 || 0xC0 <= c2 {
+			return 0, 2 // Illegal UTF-8: not a continuation byte.
+		}
+		o = uint32(i)<<6 + uint32(c2)
+		i = idnaIndex[o]
+		c3 := s[3]
+		if c3 < 0x80 || 0xC0 <= c3 {
+			return 0, 3 // Illegal UTF-8: not a continuation byte.
+		}
+		return t.lookupValue(uint32(i), c3), 4
+	}
+	// Illegal rune
+	return 0, 1
+}
+
+// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s.
+// s must start with a full and valid UTF-8 encoded rune.
+func (t *idnaTrie) lookupStringUnsafe(s string) uint16 {
+	c0 := s[0]
+	if c0 < 0x80 { // is ASCII
+		return idnaValues[c0]
+	}
+	i := idnaIndex[c0]
+	if c0 < 0xE0 { // 2-byte UTF-8
+		return t.lookupValue(uint32(i), s[1])
+	}
+	i = idnaIndex[uint32(i)<<6+uint32(s[1])]
+	if c0 < 0xF0 { // 3-byte UTF-8
+		return t.lookupValue(uint32(i), s[2])
+	}
+	i = idnaIndex[uint32(i)<<6+uint32(s[2])]
+	if c0 < 0xF8 { // 4-byte UTF-8
+		return t.lookupValue(uint32(i), s[3])
+	}
+	return 0
+}
+
+// idnaTrie. Total size: 31598 bytes (30.86 KiB). Checksum: d3118eda0d6b5360.
+type idnaTrie struct{}
+
+func newIdnaTrie(i int) *idnaTrie {
+	return &idnaTrie{}
+}
+
+// lookupValue determines the type of block n and looks up the value for b.
+func (t *idnaTrie) lookupValue(n uint32, b byte) uint16 {
+	switch {
+	case n < 133:
+		return uint16(idnaValues[n<<6+uint32(b)])
+	default:
+		n -= 133
+		return uint16(idnaSparse.lookup(n, b))
+	}
+}
+
+// idnaValues: 135 blocks, 8640 entries, 17280 bytes
+// The third block is the zero block.
+var idnaValues = [8640]uint16{
+	// Block 0x0, offset 0x0
+	0x00: 0x0080, 0x01: 0x0080, 0x02: 0x0080, 0x03: 0x0080, 0x04: 0x0080, 0x05: 0x0080,
+	0x06: 0x0080, 0x07: 0x0080, 0x08: 0x0080, 0x09: 0x0080, 0x0a: 0x0080, 0x0b: 0x0080,
+	0x0c: 0x0080, 0x0d: 0x0080, 0x0e: 0x0080, 0x0f: 0x0080, 0x10: 0x0080, 0x11: 0x0080,
+	0x12: 0x0080, 0x13: 0x0080, 0x14: 0x0080, 0x15: 0x0080, 0x16: 0x0080, 0x17: 0x0080,
+	0x18: 0x0080, 0x19: 0x0080, 0x1a: 0x0080, 0x1b: 0x0080, 0x1c: 0x0080, 0x1d: 0x0080,
+	0x1e: 0x0080, 0x1f: 0x0080, 0x20: 0x0080, 0x21: 0x0080, 0x22: 0x0080, 0x23: 0x0080,
+	0x24: 0x0080, 0x25: 0x0080, 0x26: 0x0080, 0x27: 0x0080, 0x28: 0x0080, 0x29: 0x0080,
+	0x2a: 0x0080, 0x2b: 0x0080, 0x2c: 0x0080, 0x2d: 0x0008, 0x2e: 0x0008, 0x2f: 0x0080,
+	0x30: 0x0008, 0x31: 0x0008, 0x32: 0x0008, 0x33: 0x0008, 0x34: 0x0008, 0x35: 0x0008,
+	0x36: 0x0008, 0x37: 0x0008, 0x38: 0x0008, 0x39: 0x0008, 0x3a: 0x0080, 0x3b: 0x0080,
+	0x3c: 0x0080, 0x3d: 0x0080, 0x3e: 0x0080, 0x3f: 0x0080,
+	// Block 0x1, offset 0x40
+	0x40: 0x0080, 0x41: 0xe105, 0x42: 0xe105, 0x43: 0xe105, 0x44: 0xe105, 0x45: 0xe105,
+	0x46: 0xe105, 0x47: 0xe105, 0x48: 0xe105, 0x49: 0xe105, 0x4a: 0xe105, 0x4b: 0xe105,
+	0x4c: 0xe105, 0x4d: 0xe105, 0x4e: 0xe105, 0x4f: 0xe105, 0x50: 0xe105, 0x51: 0xe105,
+	0x52: 0xe105, 0x53: 0xe105, 0x54: 0xe105, 0x55: 0xe105, 0x56: 0xe105, 0x57: 0xe105,
+	0x58: 0xe105, 0x59: 0xe105, 0x5a: 0xe105, 0x5b: 0x0080, 0x5c: 0x0080, 0x5d: 0x0080,
+	0x5e: 0x0080, 0x5f: 0x0080, 0x60: 0x0080, 0x61: 0x0008, 0x62: 0x0008, 0x63: 0x0008,
+	0x64: 0x0008, 0x65: 0x0008, 0x66: 0x0008, 0x67: 0x0008, 0x68: 0x0008, 0x69: 0x0008,
+	0x6a: 0x0008, 0x6b: 0x0008, 0x6c: 0x0008, 0x6d: 0x0008, 0x6e: 0x0008, 0x6f: 0x0008,
+	0x70: 0x0008, 0x71: 0x0008, 0x72: 0x0008, 0x73: 0x0008, 0x74: 0x0008, 0x75: 0x0008,
+	0x76: 0x0008, 0x77: 0x0008, 0x78: 0x0008, 0x79: 0x0008, 0x7a: 0x0008, 0x7b: 0x0080,
+	0x7c: 0x0080, 0x7d: 0x0080, 0x7e: 0x0080, 0x7f: 0x0080,
+	// Block 0x2, offset 0x80
+	// Block 0x3, offset 0xc0
+	0xc0: 0x0040, 0xc1: 0x0040, 0xc2: 0x0040, 0xc3: 0x0040, 0xc4: 0x0040, 0xc5: 0x0040,
+	0xc6: 0x0040, 0xc7: 0x0040, 0xc8: 0x0040, 0xc9: 0x0040, 0xca: 0x0040, 0xcb: 0x0040,
+	0xcc: 0x0040, 0xcd: 0x0040, 0xce: 0x0040, 0xcf: 0x0040, 0xd0: 0x0040, 0xd1: 0x0040,
+	0xd2: 0x0040, 0xd3: 0x0040, 0xd4: 0x0040, 0xd5: 0x0040, 0xd6: 0x0040, 0xd7: 0x0040,
+	0xd8: 0x0040, 0xd9: 0x0040, 0xda: 0x0040, 0xdb: 0x0040, 0xdc: 0x0040, 0xdd: 0x0040,
+	0xde: 0x0040, 0xdf: 0x0040, 0xe0: 0x000a, 0xe1: 0x0018, 0xe2: 0x0018, 0xe3: 0x0018,
+	0xe4: 0x0018, 0xe5: 0x0018, 0xe6: 0x0018, 0xe7: 0x0018, 0xe8: 0x0012, 0xe9: 0x0018,
+	0xea: 0x0019, 0xeb: 0x0018, 0xec: 0x0018, 0xed: 0x03c0, 0xee: 0x0018, 0xef: 0x0022,
+	0xf0: 0x0018, 0xf1: 0x0018, 0xf2: 0x0029, 0xf3: 0x0031, 0xf4: 0x003a, 0xf5: 0x0005,
+	0xf6: 0x0018, 0xf7: 0x0008, 0xf8: 0x0042, 0xf9: 0x0049, 0xfa: 0x0051, 0xfb: 0x0018,
+	0xfc: 0x0059, 0xfd: 0x0061, 0xfe: 0x0069, 0xff: 0x0018,
+	// Block 0x4, offset 0x100
+	0x100: 0xe00d, 0x101: 0x0008, 0x102: 0xe00d, 0x103: 0x0008, 0x104: 0xe00d, 0x105: 0x0008,
+	0x106: 0xe00d, 0x107: 0x0008, 0x108: 0xe00d, 0x109: 0x0008, 0x10a: 0xe00d, 0x10b: 0x0008,
+	0x10c: 0xe00d, 0x10d: 0x0008, 0x10e: 0xe00d, 0x10f: 0x0008, 0x110: 0xe00d, 0x111: 0x0008,
+	0x112: 0xe00d, 0x113: 0x0008, 0x114: 0xe00d, 0x115: 0x0008, 0x116: 0xe00d, 0x117: 0x0008,
+	0x118: 0xe00d, 0x119: 0x0008, 0x11a: 0xe00d, 0x11b: 0x0008, 0x11c: 0xe00d, 0x11d: 0x0008,
+	0x11e: 0xe00d, 0x11f: 0x0008, 0x120: 0xe00d, 0x121: 0x0008, 0x122: 0xe00d, 0x123: 0x0008,
+	0x124: 0xe00d, 0x125: 0x0008, 0x126: 0xe00d, 0x127: 0x0008, 0x128: 0xe00d, 0x129: 0x0008,
+	0x12a: 0xe00d, 0x12b: 0x0008, 0x12c: 0xe00d, 0x12d: 0x0008, 0x12e: 0xe00d, 0x12f: 0x0008,
+	0x130: 0x0071, 0x131: 0x0008, 0x132: 0x0035, 0x133: 0x004d, 0x134: 0xe00d, 0x135: 0x0008,
+	0x136: 0xe00d, 0x137: 0x0008, 0x138: 0x0008, 0x139: 0xe01d, 0x13a: 0x0008, 0x13b: 0xe03d,
+	0x13c: 0x0008, 0x13d: 0xe01d, 0x13e: 0x0008, 0x13f: 0x0079,
+	// Block 0x5, offset 0x140
+	0x140: 0x0079, 0x141: 0xe01d, 0x142: 0x0008, 0x143: 0xe03d, 0x144: 0x0008, 0x145: 0xe01d,
+	0x146: 0x0008, 0x147: 0xe07d, 0x148: 0x0008, 0x149: 0x0081, 0x14a: 0xe00d, 0x14b: 0x0008,
+	0x14c: 0xe00d, 0x14d: 0x0008, 0x14e: 0xe00d, 0x14f: 0x0008, 0x150: 0xe00d, 0x151: 0x0008,
+	0x152: 0xe00d, 0x153: 0x0008, 0x154: 0xe00d, 0x155: 0x0008, 0x156: 0xe00d, 0x157: 0x0008,
+	0x158: 0xe00d, 0x159: 0x0008, 0x15a: 0xe00d, 0x15b: 0x0008, 0x15c: 0xe00d, 0x15d: 0x0008,
+	0x15e: 0xe00d, 0x15f: 0x0008, 0x160: 0xe00d, 0x161: 0x0008, 0x162: 0xe00d, 0x163: 0x0008,
+	0x164: 0xe00d, 0x165: 0x0008, 0x166: 0xe00d, 0x167: 0x0008, 0x168: 0xe00d, 0x169: 0x0008,
+	0x16a: 0xe00d, 0x16b: 0x0008, 0x16c: 0xe00d, 0x16d: 0x0008, 0x16e: 0xe00d, 0x16f: 0x0008,
+	0x170: 0xe00d, 0x171: 0x0008, 0x172: 0xe00d, 0x173: 0x0008, 0x174: 0xe00d, 0x175: 0x0008,
+	0x176: 0xe00d, 0x177: 0x0008, 0x178: 0x0065, 0x179: 0xe01d, 0x17a: 0x0008, 0x17b: 0xe03d,
+	0x17c: 0x0008, 0x17d: 0xe01d, 0x17e: 0x0008, 0x17f: 0x0089,
+	// Block 0x6, offset 0x180
+	0x180: 0x0008, 0x181: 0x007d, 0x182: 0xe00d, 0x183: 0x0008, 0x184: 0xe00d, 0x185: 0x0008,
+	0x186: 0x007d, 0x187: 0xe07d, 0x188: 0x0008, 0x189: 0x0095, 0x18a: 0x00ad, 0x18b: 0xe03d,
+	0x18c: 0x0008, 0x18d: 0x0008, 0x18e: 0x00c5, 0x18f: 0x00dd, 0x190: 0x00f5, 0x191: 0xe01d,
+	0x192: 0x0008, 0x193: 0x010d, 0x194: 0x0125, 0x195: 0x0008, 0x196: 0x013d, 0x197: 0x013d,
+	0x198: 0xe00d, 0x199: 0x0008, 0x19a: 0x0008, 0x19b: 0x0008, 0x19c: 0x010d, 0x19d: 0x0155,
+	0x19e: 0x0008, 0x19f: 0x016d, 0x1a0: 0xe00d, 0x1a1: 0x0008, 0x1a2: 0xe00d, 0x1a3: 0x0008,
+	0x1a4: 0xe00d, 0x1a5: 0x0008, 0x1a6: 0x0185, 0x1a7: 0xe07d, 0x1a8: 0x0008, 0x1a9: 0x019d,
+	0x1aa: 0x0008, 0x1ab: 0x0008, 0x1ac: 0xe00d, 0x1ad: 0x0008, 0x1ae: 0x0185, 0x1af: 0xe0fd,
+	0x1b0: 0x0008, 0x1b1: 0x01b5, 0x1b2: 0x01cd, 0x1b3: 0xe03d, 0x1b4: 0x0008, 0x1b5: 0xe01d,
+	0x1b6: 0x0008, 0x1b7: 0x01e5, 0x1b8: 0xe00d, 0x1b9: 0x0008, 0x1ba: 0x0008, 0x1bb: 0x0008,
+	0x1bc: 0xe00d, 0x1bd: 0x0008, 0x1be: 0x0008, 0x1bf: 0x0008,
+	// Block 0x7, offset 0x1c0
+	0x1c0: 0x0008, 0x1c1: 0x0008, 0x1c2: 0x0008, 0x1c3: 0x0008, 0x1c4: 0x0091, 0x1c5: 0x0091,
+	0x1c6: 0x0091, 0x1c7: 0x01fd, 0x1c8: 0x0215, 0x1c9: 0x022d, 0x1ca: 0x0245, 0x1cb: 0x025d,
+	0x1cc: 0x0275, 0x1cd: 0xe01d, 0x1ce: 0x0008, 0x1cf: 0xe0fd, 0x1d0: 0x0008, 0x1d1: 0xe01d,
+	0x1d2: 0x0008, 0x1d3: 0xe03d, 0x1d4: 0x0008, 0x1d5: 0xe01d, 0x1d6: 0x0008, 0x1d7: 0xe07d,
+	0x1d8: 0x0008, 0x1d9: 0xe01d, 0x1da: 0x0008, 0x1db: 0xe03d, 0x1dc: 0x0008, 0x1dd: 0x0008,
+	0x1de: 0xe00d, 0x1df: 0x0008, 0x1e0: 0xe00d, 0x1e1: 0x0008, 0x1e2: 0xe00d, 0x1e3: 0x0008,
+	0x1e4: 0xe00d, 0x1e5: 0x0008, 0x1e6: 0xe00d, 0x1e7: 0x0008, 0x1e8: 0xe00d, 0x1e9: 0x0008,
+	0x1ea: 0xe00d, 0x1eb: 0x0008, 0x1ec: 0xe00d, 0x1ed: 0x0008, 0x1ee: 0xe00d, 0x1ef: 0x0008,
+	0x1f0: 0x0008, 0x1f1: 0x028d, 0x1f2: 0x02a5, 0x1f3: 0x02bd, 0x1f4: 0xe00d, 0x1f5: 0x0008,
+	0x1f6: 0x02d5, 0x1f7: 0x02ed, 0x1f8: 0xe00d, 0x1f9: 0x0008, 0x1fa: 0xe00d, 0x1fb: 0x0008,
+	0x1fc: 0xe00d, 0x1fd: 0x0008, 0x1fe: 0xe00d, 0x1ff: 0x0008,
+	// Block 0x8, offset 0x200
+	0x200: 0xe00d, 0x201: 0x0008, 0x202: 0xe00d, 0x203: 0x0008, 0x204: 0xe00d, 0x205: 0x0008,
+	0x206: 0xe00d, 0x207: 0x0008, 0x208: 0xe00d, 0x209: 0x0008, 0x20a: 0xe00d, 0x20b: 0x0008,
+	0x20c: 0xe00d, 0x20d: 0x0008, 0x20e: 0xe00d, 0x20f: 0x0008, 0x210: 0xe00d, 0x211: 0x0008,
+	0x212: 0xe00d, 0x213: 0x0008, 0x214: 0xe00d, 0x215: 0x0008, 0x216: 0xe00d, 0x217: 0x0008,
+	0x218: 0xe00d, 0x219: 0x0008, 0x21a: 0xe00d, 0x21b: 0x0008, 0x21c: 0xe00d, 0x21d: 0x0008,
+	0x21e: 0xe00d, 0x21f: 0x0008, 0x220: 0x0305, 0x221: 0x0008, 0x222: 0xe00d, 0x223: 0x0008,
+	0x224: 0xe00d, 0x225: 0x0008, 0x226: 0xe00d, 0x227: 0x0008, 0x228: 0xe00d, 0x229: 0x0008,
+	0x22a: 0xe00d, 0x22b: 0x0008, 0x22c: 0xe00d, 0x22d: 0x0008, 0x22e: 0xe00d, 0x22f: 0x0008,
+	0x230: 0xe00d, 0x231: 0x0008, 0x232: 0xe00d, 0x233: 0x0008, 0x234: 0x0008, 0x235: 0x0008,
+	0x236: 0x0008, 0x237: 0x0008, 0x238: 0x0008, 0x239: 0x0008, 0x23a: 0x0099, 0x23b: 0xe03d,
+	0x23c: 0x0008, 0x23d: 0x031d, 0x23e: 0x00a1, 0x23f: 0x0008,
+	// Block 0x9, offset 0x240
+	0x240: 0x0008, 0x241: 0x0008, 0x242: 0x0018, 0x243: 0x0018, 0x244: 0x0018, 0x245: 0x0018,
+	0x246: 0x0008, 0x247: 0x0008, 0x248: 0x0008, 0x249: 0x0008, 0x24a: 0x0008, 0x24b: 0x0008,
+	0x24c: 0x0008, 0x24d: 0x0008, 0x24e: 0x0008, 0x24f: 0x0008, 0x250: 0x0008, 0x251: 0x0008,
+	0x252: 0x0018, 0x253: 0x0018, 0x254: 0x0018, 0x255: 0x0018, 0x256: 0x0018, 0x257: 0x0018,
+	0x258: 0x00d2, 0x259: 0x00da, 0x25a: 0x00e2, 0x25b: 0x00ea, 0x25c: 0x00f2, 0x25d: 0x00fa,
+	0x25e: 0x0018, 0x25f: 0x0018, 0x260: 0x03ad, 0x261: 0x0101, 0x262: 0x0089, 0x263: 0x0109,
+	0x264: 0x03c5, 0x265: 0x0018, 0x266: 0x0018, 0x267: 0x0018, 0x268: 0x0018, 0x269: 0x0018,
+	0x26a: 0x0018, 0x26b: 0x0018, 0x26c: 0x0008, 0x26d: 0x0018, 0x26e: 0x0008, 0x26f: 0x0018,
+	0x270: 0x0018, 0x271: 0x0018, 0x272: 0x0018, 0x273: 0x0018, 0x274: 0x0018, 0x275: 0x0018,
+	0x276: 0x0018, 0x277: 0x0018, 0x278: 0x0018, 0x279: 0x0018, 0x27a: 0x0018, 0x27b: 0x0018,
+	0x27c: 0x0018, 0x27d: 0x0018, 0x27e: 0x0018, 0x27f: 0x0018,
+	// Block 0xa, offset 0x280
+	0x280: 0x03dd, 0x281: 0x03dd, 0x282: 0x3308, 0x283: 0x03f5, 0x284: 0x0111, 0x285: 0x040d,
+	0x286: 0x3308, 0x287: 0x3308, 0x288: 0x3308, 0x289: 0x3308, 0x28a: 0x3308, 0x28b: 0x3308,
+	0x28c: 0x3308, 0x28d: 0x3308, 0x28e: 0x3308, 0x28f: 0x33c0, 0x290: 0x3308, 0x291: 0x3308,
+	0x292: 0x3308, 0x293: 0x3308, 0x294: 0x3308, 0x295: 0x3308, 0x296: 0x3308, 0x297: 0x3308,
+	0x298: 0x3308, 0x299: 0x3308, 0x29a: 0x3308, 0x29b: 0x3308, 0x29c: 0x3308, 0x29d: 0x3308,
+	0x29e: 0x3308, 0x29f: 0x3308, 0x2a0: 0x3308, 0x2a1: 0x3308, 0x2a2: 0x3308, 0x2a3: 0x3308,
+	0x2a4: 0x3308, 0x2a5: 0x3308, 0x2a6: 0x3308, 0x2a7: 0x3308, 0x2a8: 0x3308, 0x2a9: 0x3308,
+	0x2aa: 0x3308, 0x2ab: 0x3308, 0x2ac: 0x3308, 0x2ad: 0x3308, 0x2ae: 0x3308, 0x2af: 0x3308,
+	0x2b0: 0xe00d, 0x2b1: 0x0008, 0x2b2: 0xe00d, 0x2b3: 0x0008, 0x2b4: 0x0425, 0x2b5: 0x0008,
+	0x2b6: 0xe00d, 0x2b7: 0x0008, 0x2b8: 0x0040, 0x2b9: 0x0040, 0x2ba: 0x011a, 0x2bb: 0x0008,
+	0x2bc: 0x0008, 0x2bd: 0x0008, 0x2be: 0x0122, 0x2bf: 0x043d,
+	// Block 0xb, offset 0x2c0
+	0x2c0: 0x0040, 0x2c1: 0x0040, 0x2c2: 0x0040, 0x2c3: 0x0040, 0x2c4: 0x003a, 0x2c5: 0x012a,
+	0x2c6: 0xe155, 0x2c7: 0x0455, 0x2c8: 0xe12d, 0x2c9: 0xe13d, 0x2ca: 0xe12d, 0x2cb: 0x0040,
+	0x2cc: 0x03dd, 0x2cd: 0x0040, 0x2ce: 0x046d, 0x2cf: 0x0485, 0x2d0: 0x0008, 0x2d1: 0xe105,
+	0x2d2: 0xe105, 0x2d3: 0xe105, 0x2d4: 0xe105, 0x2d5: 0xe105, 0x2d6: 0xe105, 0x2d7: 0xe105,
+	0x2d8: 0xe105, 0x2d9: 0xe105, 0x2da: 0xe105, 0x2db: 0xe105, 0x2dc: 0xe105, 0x2dd: 0xe105,
+	0x2de: 0xe105, 0x2df: 0xe105, 0x2e0: 0x049d, 0x2e1: 0x049d, 0x2e2: 0x0040, 0x2e3: 0x049d,
+	0x2e4: 0x049d, 0x2e5: 0x049d, 0x2e6: 0x049d, 0x2e7: 0x049d, 0x2e8: 0x049d, 0x2e9: 0x049d,
+	0x2ea: 0x049d, 0x2eb: 0x049d, 0x2ec: 0x0008, 0x2ed: 0x0008, 0x2ee: 0x0008, 0x2ef: 0x0008,
+	0x2f0: 0x0008, 0x2f1: 0x0008, 0x2f2: 0x0008, 0x2f3: 0x0008, 0x2f4: 0x0008, 0x2f5: 0x0008,
+	0x2f6: 0x0008, 0x2f7: 0x0008, 0x2f8: 0x0008, 0x2f9: 0x0008, 0x2fa: 0x0008, 0x2fb: 0x0008,
+	0x2fc: 0x0008, 0x2fd: 0x0008, 0x2fe: 0x0008, 0x2ff: 0x0008,
+	// Block 0xc, offset 0x300
+	0x300: 0x0008, 0x301: 0x0008, 0x302: 0xe00f, 0x303: 0x0008, 0x304: 0x0008, 0x305: 0x0008,
+	0x306: 0x0008, 0x307: 0x0008, 0x308: 0x0008, 0x309: 0x0008, 0x30a: 0x0008, 0x30b: 0x0008,
+	0x30c: 0x0008, 0x30d: 0x0008, 0x30e: 0x0008, 0x30f: 0xe0c5, 0x310: 0x04b5, 0x311: 0x04cd,
+	0x312: 0xe0bd, 0x313: 0xe0f5, 0x314: 0xe0fd, 0x315: 0xe09d, 0x316: 0xe0b5, 0x317: 0x0008,
+	0x318: 0xe00d, 0x319: 0x0008, 0x31a: 0xe00d, 0x31b: 0x0008, 0x31c: 0xe00d, 0x31d: 0x0008,
+	0x31e: 0xe00d, 0x31f: 0x0008, 0x320: 0xe00d, 0x321: 0x0008, 0x322: 0xe00d, 0x323: 0x0008,
+	0x324: 0xe00d, 0x325: 0x0008, 0x326: 0xe00d, 0x327: 0x0008, 0x328: 0xe00d, 0x329: 0x0008,
+	0x32a: 0xe00d, 0x32b: 0x0008, 0x32c: 0xe00d, 0x32d: 0x0008, 0x32e: 0xe00d, 0x32f: 0x0008,
+	0x330: 0x04e5, 0x331: 0xe185, 0x332: 0xe18d, 0x333: 0x0008, 0x334: 0x04fd, 0x335: 0x03dd,
+	0x336: 0x0018, 0x337: 0xe07d, 0x338: 0x0008, 0x339: 0xe1d5, 0x33a: 0xe00d, 0x33b: 0x0008,
+	0x33c: 0x0008, 0x33d: 0x0515, 0x33e: 0x052d, 0x33f: 0x052d,
+	// Block 0xd, offset 0x340
+	0x340: 0x0008, 0x341: 0x0008, 0x342: 0x0008, 0x343: 0x0008, 0x344: 0x0008, 0x345: 0x0008,
+	0x346: 0x0008, 0x347: 0x0008, 0x348: 0x0008, 0x349: 0x0008, 0x34a: 0x0008, 0x34b: 0x0008,
+	0x34c: 0x0008, 0x34d: 0x0008, 0x34e: 0x0008, 0x34f: 0x0008, 0x350: 0x0008, 0x351: 0x0008,
+	0x352: 0x0008, 0x353: 0x0008, 0x354: 0x0008, 0x355: 0x0008, 0x356: 0x0008, 0x357: 0x0008,
+	0x358: 0x0008, 0x359: 0x0008, 0x35a: 0x0008, 0x35b: 0x0008, 0x35c: 0x0008, 0x35d: 0x0008,
+	0x35e: 0x0008, 0x35f: 0x0008, 0x360: 0xe00d, 0x361: 0x0008, 0x362: 0xe00d, 0x363: 0x0008,
+	0x364: 0xe00d, 0x365: 0x0008, 0x366: 0xe00d, 0x367: 0x0008, 0x368: 0xe00d, 0x369: 0x0008,
+	0x36a: 0xe00d, 0x36b: 0x0008, 0x36c: 0xe00d, 0x36d: 0x0008, 0x36e: 0xe00d, 0x36f: 0x0008,
+	0x370: 0xe00d, 0x371: 0x0008, 0x372: 0xe00d, 0x373: 0x0008, 0x374: 0xe00d, 0x375: 0x0008,
+	0x376: 0xe00d, 0x377: 0x0008, 0x378: 0xe00d, 0x379: 0x0008, 0x37a: 0xe00d, 0x37b: 0x0008,
+	0x37c: 0xe00d, 0x37d: 0x0008, 0x37e: 0xe00d, 0x37f: 0x0008,
+	// Block 0xe, offset 0x380
+	0x380: 0xe00d, 0x381: 0x0008, 0x382: 0x0018, 0x383: 0x3308, 0x384: 0x3308, 0x385: 0x3308,
+	0x386: 0x3308, 0x387: 0x3308, 0x388: 0x3318, 0x389: 0x3318, 0x38a: 0xe00d, 0x38b: 0x0008,
+	0x38c: 0xe00d, 0x38d: 0x0008, 0x38e: 0xe00d, 0x38f: 0x0008, 0x390: 0xe00d, 0x391: 0x0008,
+	0x392: 0xe00d, 0x393: 0x0008, 0x394: 0xe00d, 0x395: 0x0008, 0x396: 0xe00d, 0x397: 0x0008,
+	0x398: 0xe00d, 0x399: 0x0008, 0x39a: 0xe00d, 0x39b: 0x0008, 0x39c: 0xe00d, 0x39d: 0x0008,
+	0x39e: 0xe00d, 0x39f: 0x0008, 0x3a0: 0xe00d, 0x3a1: 0x0008, 0x3a2: 0xe00d, 0x3a3: 0x0008,
+	0x3a4: 0xe00d, 0x3a5: 0x0008, 0x3a6: 0xe00d, 0x3a7: 0x0008, 0x3a8: 0xe00d, 0x3a9: 0x0008,
+	0x3aa: 0xe00d, 0x3ab: 0x0008, 0x3ac: 0xe00d, 0x3ad: 0x0008, 0x3ae: 0xe00d, 0x3af: 0x0008,
+	0x3b0: 0xe00d, 0x3b1: 0x0008, 0x3b2: 0xe00d, 0x3b3: 0x0008, 0x3b4: 0xe00d, 0x3b5: 0x0008,
+	0x3b6: 0xe00d, 0x3b7: 0x0008, 0x3b8: 0xe00d, 0x3b9: 0x0008, 0x3ba: 0xe00d, 0x3bb: 0x0008,
+	0x3bc: 0xe00d, 0x3bd: 0x0008, 0x3be: 0xe00d, 0x3bf: 0x0008,
+	// Block 0xf, offset 0x3c0
+	0x3c0: 0x0040, 0x3c1: 0xe01d, 0x3c2: 0x0008, 0x3c3: 0xe03d, 0x3c4: 0x0008, 0x3c5: 0xe01d,
+	0x3c6: 0x0008, 0x3c7: 0xe07d, 0x3c8: 0x0008, 0x3c9: 0xe01d, 0x3ca: 0x0008, 0x3cb: 0xe03d,
+	0x3cc: 0x0008, 0x3cd: 0xe01d, 0x3ce: 0x0008, 0x3cf: 0x0008, 0x3d0: 0xe00d, 0x3d1: 0x0008,
+	0x3d2: 0xe00d, 0x3d3: 0x0008, 0x3d4: 0xe00d, 0x3d5: 0x0008, 0x3d6: 0xe00d, 0x3d7: 0x0008,
+	0x3d8: 0xe00d, 0x3d9: 0x0008, 0x3da: 0xe00d, 0x3db: 0x0008, 0x3dc: 0xe00d, 0x3dd: 0x0008,
+	0x3de: 0xe00d, 0x3df: 0x0008, 0x3e0: 0xe00d, 0x3e1: 0x0008, 0x3e2: 0xe00d, 0x3e3: 0x0008,
+	0x3e4: 0xe00d, 0x3e5: 0x0008, 0x3e6: 0xe00d, 0x3e7: 0x0008, 0x3e8: 0xe00d, 0x3e9: 0x0008,
+	0x3ea: 0xe00d, 0x3eb: 0x0008, 0x3ec: 0xe00d, 0x3ed: 0x0008, 0x3ee: 0xe00d, 0x3ef: 0x0008,
+	0x3f0: 0xe00d, 0x3f1: 0x0008, 0x3f2: 0xe00d, 0x3f3: 0x0008, 0x3f4: 0xe00d, 0x3f5: 0x0008,
+	0x3f6: 0xe00d, 0x3f7: 0x0008, 0x3f8: 0xe00d, 0x3f9: 0x0008, 0x3fa: 0xe00d, 0x3fb: 0x0008,
+	0x3fc: 0xe00d, 0x3fd: 0x0008, 0x3fe: 0xe00d, 0x3ff: 0x0008,
+	// Block 0x10, offset 0x400
+	0x400: 0xe00d, 0x401: 0x0008, 0x402: 0xe00d, 0x403: 0x0008, 0x404: 0xe00d, 0x405: 0x0008,
+	0x406: 0xe00d, 0x407: 0x0008, 0x408: 0xe00d, 0x409: 0x0008, 0x40a: 0xe00d, 0x40b: 0x0008,
+	0x40c: 0xe00d, 0x40d: 0x0008, 0x40e: 0xe00d, 0x40f: 0x0008, 0x410: 0xe00d, 0x411: 0x0008,
+	0x412: 0xe00d, 0x413: 0x0008, 0x414: 0xe00d, 0x415: 0x0008, 0x416: 0xe00d, 0x417: 0x0008,
+	0x418: 0xe00d, 0x419: 0x0008, 0x41a: 0xe00d, 0x41b: 0x0008, 0x41c: 0xe00d, 0x41d: 0x0008,
+	0x41e: 0xe00d, 0x41f: 0x0008, 0x420: 0xe00d, 0x421: 0x0008, 0x422: 0xe00d, 0x423: 0x0008,
+	0x424: 0xe00d, 0x425: 0x0008, 0x426: 0xe00d, 0x427: 0x0008, 0x428: 0xe00d, 0x429: 0x0008,
+	0x42a: 0xe00d, 0x42b: 0x0008, 0x42c: 0xe00d, 0x42d: 0x0008, 0x42e: 0xe00d, 0x42f: 0x0008,
+	0x430: 0x0040, 0x431: 0x03f5, 0x432: 0x03f5, 0x433: 0x03f5, 0x434: 0x03f5, 0x435: 0x03f5,
+	0x436: 0x03f5, 0x437: 0x03f5, 0x438: 0x03f5, 0x439: 0x03f5, 0x43a: 0x03f5, 0x43b: 0x03f5,
+	0x43c: 0x03f5, 0x43d: 0x03f5, 0x43e: 0x03f5, 0x43f: 0x03f5,
+	// Block 0x11, offset 0x440
+	0x440: 0x0840, 0x441: 0x0840, 0x442: 0x0840, 0x443: 0x0840, 0x444: 0x0840, 0x445: 0x0840,
+	0x446: 0x0018, 0x447: 0x0018, 0x448: 0x0818, 0x449: 0x0018, 0x44a: 0x0018, 0x44b: 0x0818,
+	0x44c: 0x0018, 0x44d: 0x0818, 0x44e: 0x0018, 0x44f: 0x0018, 0x450: 0x3308, 0x451: 0x3308,
+	0x452: 0x3308, 0x453: 0x3308, 0x454: 0x3308, 0x455: 0x3308, 0x456: 0x3308, 0x457: 0x3308,
+	0x458: 0x3308, 0x459: 0x3308, 0x45a: 0x3308, 0x45b: 0x0818, 0x45c: 0x0b40, 0x45d: 0x0818,
+	0x45e: 0x0818, 0x45f: 0x0818, 0x460: 0x0a08, 0x461: 0x0808, 0x462: 0x0c08, 0x463: 0x0c08,
+	0x464: 0x0c08, 0x465: 0x0c08, 0x466: 0x0a08, 0x467: 0x0c08, 0x468: 0x0a08, 0x469: 0x0c08,
+	0x46a: 0x0a08, 0x46b: 0x0a08, 0x46c: 0x0a08, 0x46d: 0x0a08, 0x46e: 0x0a08, 0x46f: 0x0c08,
+	0x470: 0x0c08, 0x471: 0x0c08, 0x472: 0x0c08, 0x473: 0x0a08, 0x474: 0x0a08, 0x475: 0x0a08,
+	0x476: 0x0a08, 0x477: 0x0a08, 0x478: 0x0a08, 0x479: 0x0a08, 0x47a: 0x0a08, 0x47b: 0x0a08,
+	0x47c: 0x0a08, 0x47d: 0x0a08, 0x47e: 0x0a08, 0x47f: 0x0a08,
+	// Block 0x12, offset 0x480
+	0x480: 0x0818, 0x481: 0x0a08, 0x482: 0x0a08, 0x483: 0x0a08, 0x484: 0x0a08, 0x485: 0x0a08,
+	0x486: 0x0a08, 0x487: 0x0a08, 0x488: 0x0c08, 0x489: 0x0a08, 0x48a: 0x0a08, 0x48b: 0x3308,
+	0x48c: 0x3308, 0x48d: 0x3308, 0x48e: 0x3308, 0x48f: 0x3308, 0x490: 0x3308, 0x491: 0x3308,
+	0x492: 0x3308, 0x493: 0x3308, 0x494: 0x3308, 0x495: 0x3308, 0x496: 0x3308, 0x497: 0x3308,
+	0x498: 0x3308, 0x499: 0x3308, 0x49a: 0x3308, 0x49b: 0x3308, 0x49c: 0x3308, 0x49d: 0x3308,
+	0x49e: 0x3308, 0x49f: 0x3308, 0x4a0: 0x0808, 0x4a1: 0x0808, 0x4a2: 0x0808, 0x4a3: 0x0808,
+	0x4a4: 0x0808, 0x4a5: 0x0808, 0x4a6: 0x0808, 0x4a7: 0x0808, 0x4a8: 0x0808, 0x4a9: 0x0808,
+	0x4aa: 0x0018, 0x4ab: 0x0818, 0x4ac: 0x0818, 0x4ad: 0x0818, 0x4ae: 0x0a08, 0x4af: 0x0a08,
+	0x4b0: 0x3308, 0x4b1: 0x0c08, 0x4b2: 0x0c08, 0x4b3: 0x0c08, 0x4b4: 0x0808, 0x4b5: 0x0139,
+	0x4b6: 0x0141, 0x4b7: 0x0149, 0x4b8: 0x0151, 0x4b9: 0x0a08, 0x4ba: 0x0a08, 0x4bb: 0x0a08,
+	0x4bc: 0x0a08, 0x4bd: 0x0a08, 0x4be: 0x0a08, 0x4bf: 0x0a08,
+	// Block 0x13, offset 0x4c0
+	0x4c0: 0x0c08, 0x4c1: 0x0a08, 0x4c2: 0x0a08, 0x4c3: 0x0c08, 0x4c4: 0x0c08, 0x4c5: 0x0c08,
+	0x4c6: 0x0c08, 0x4c7: 0x0c08, 0x4c8: 0x0c08, 0x4c9: 0x0c08, 0x4ca: 0x0c08, 0x4cb: 0x0c08,
+	0x4cc: 0x0a08, 0x4cd: 0x0c08, 0x4ce: 0x0a08, 0x4cf: 0x0c08, 0x4d0: 0x0a08, 0x4d1: 0x0a08,
+	0x4d2: 0x0c08, 0x4d3: 0x0c08, 0x4d4: 0x0818, 0x4d5: 0x0c08, 0x4d6: 0x3308, 0x4d7: 0x3308,
+	0x4d8: 0x3308, 0x4d9: 0x3308, 0x4da: 0x3308, 0x4db: 0x3308, 0x4dc: 0x3308, 0x4dd: 0x0840,
+	0x4de: 0x0018, 0x4df: 0x3308, 0x4e0: 0x3308, 0x4e1: 0x3308, 0x4e2: 0x3308, 0x4e3: 0x3308,
+	0x4e4: 0x3308, 0x4e5: 0x0808, 0x4e6: 0x0808, 0x4e7: 0x3308, 0x4e8: 0x3308, 0x4e9: 0x0018,
+	0x4ea: 0x3308, 0x4eb: 0x3308, 0x4ec: 0x3308, 0x4ed: 0x3308, 0x4ee: 0x0c08, 0x4ef: 0x0c08,
+	0x4f0: 0x0008, 0x4f1: 0x0008, 0x4f2: 0x0008, 0x4f3: 0x0008, 0x4f4: 0x0008, 0x4f5: 0x0008,
+	0x4f6: 0x0008, 0x4f7: 0x0008, 0x4f8: 0x0008, 0x4f9: 0x0008, 0x4fa: 0x0a08, 0x4fb: 0x0a08,
+	0x4fc: 0x0a08, 0x4fd: 0x0808, 0x4fe: 0x0808, 0x4ff: 0x0a08,
+	// Block 0x14, offset 0x500
+	0x500: 0x0818, 0x501: 0x0818, 0x502: 0x0818, 0x503: 0x0818, 0x504: 0x0818, 0x505: 0x0818,
+	0x506: 0x0818, 0x507: 0x0818, 0x508: 0x0818, 0x509: 0x0818, 0x50a: 0x0818, 0x50b: 0x0818,
+	0x50c: 0x0818, 0x50d: 0x0818, 0x50e: 0x0040, 0x50f: 0x0b40, 0x510: 0x0c08, 0x511: 0x3308,
+	0x512: 0x0a08, 0x513: 0x0a08, 0x514: 0x0a08, 0x515: 0x0c08, 0x516: 0x0c08, 0x517: 0x0c08,
+	0x518: 0x0c08, 0x519: 0x0c08, 0x51a: 0x0a08, 0x51b: 0x0a08, 0x51c: 0x0a08, 0x51d: 0x0a08,
+	0x51e: 0x0c08, 0x51f: 0x0a08, 0x520: 0x0a08, 0x521: 0x0a08, 0x522: 0x0a08, 0x523: 0x0a08,
+	0x524: 0x0a08, 0x525: 0x0a08, 0x526: 0x0a08, 0x527: 0x0a08, 0x528: 0x0c08, 0x529: 0x0a08,
+	0x52a: 0x0c08, 0x52b: 0x0a08, 0x52c: 0x0c08, 0x52d: 0x0a08, 0x52e: 0x0a08, 0x52f: 0x0c08,
+	0x530: 0x3308, 0x531: 0x3308, 0x532: 0x3308, 0x533: 0x3308, 0x534: 0x3308, 0x535: 0x3308,
+	0x536: 0x3308, 0x537: 0x3308, 0x538: 0x3308, 0x539: 0x3308, 0x53a: 0x3308, 0x53b: 0x3308,
+	0x53c: 0x3308, 0x53d: 0x3308, 0x53e: 0x3308, 0x53f: 0x3308,
+	// Block 0x15, offset 0x540
+	0x540: 0x0c08, 0x541: 0x0a08, 0x542: 0x0a08, 0x543: 0x0a08, 0x544: 0x0a08, 0x545: 0x0a08,
+	0x546: 0x0c08, 0x547: 0x0c08, 0x548: 0x0a08, 0x549: 0x0c08, 0x54a: 0x0a08, 0x54b: 0x0a08,
+	0x54c: 0x0a08, 0x54d: 0x0a08, 0x54e: 0x0a08, 0x54f: 0x0a08, 0x550: 0x0a08, 0x551: 0x0a08,
+	0x552: 0x0a08, 0x553: 0x0a08, 0x554: 0x0c08, 0x555: 0x0a08, 0x556: 0x0c08, 0x557: 0x0c08,
+	0x558: 0x0c08, 0x559: 0x3308, 0x55a: 0x3308, 0x55b: 0x3308, 0x55c: 0x0040, 0x55d: 0x0040,
+	0x55e: 0x0818, 0x55f: 0x0040, 0x560: 0x0a08, 0x561: 0x0808, 0x562: 0x0a08, 0x563: 0x0a08,
+	0x564: 0x0a08, 0x565: 0x0a08, 0x566: 0x0808, 0x567: 0x0c08, 0x568: 0x0a08, 0x569: 0x0c08,
+	0x56a: 0x0c08, 0x56b: 0x0040, 0x56c: 0x0040, 0x56d: 0x0040, 0x56e: 0x0040, 0x56f: 0x0040,
+	0x570: 0x0c08, 0x571: 0x0c08, 0x572: 0x0c08, 0x573: 0x0c08, 0x574: 0x0c08, 0x575: 0x0c08,
+	0x576: 0x0c08, 0x577: 0x0c08, 0x578: 0x0c08, 0x579: 0x0c08, 0x57a: 0x0c08, 0x57b: 0x0c08,
+	0x57c: 0x0c08, 0x57d: 0x0c08, 0x57e: 0x0c08, 0x57f: 0x0c08,
+	// Block 0x16, offset 0x580
+	0x580: 0x0c08, 0x581: 0x0c08, 0x582: 0x0c08, 0x583: 0x0808, 0x584: 0x0808, 0x585: 0x0808,
+	0x586: 0x0a08, 0x587: 0x0808, 0x588: 0x0818, 0x589: 0x0a08, 0x58a: 0x0a08, 0x58b: 0x0a08,
+	0x58c: 0x0a08, 0x58d: 0x0a08, 0x58e: 0x0c08, 0x58f: 0x0040, 0x590: 0x0840, 0x591: 0x0840,
+	0x592: 0x0040, 0x593: 0x0040, 0x594: 0x0040, 0x595: 0x0040, 0x596: 0x0040, 0x597: 0x0040,
+	0x598: 0x3308, 0x599: 0x3308, 0x59a: 0x3308, 0x59b: 0x3308, 0x59c: 0x3308, 0x59d: 0x3308,
+	0x59e: 0x3308, 0x59f: 0x3308, 0x5a0: 0x0a08, 0x5a1: 0x0a08, 0x5a2: 0x0a08, 0x5a3: 0x0a08,
+	0x5a4: 0x0a08, 0x5a5: 0x0a08, 0x5a6: 0x0a08, 0x5a7: 0x0a08, 0x5a8: 0x0a08, 0x5a9: 0x0a08,
+	0x5aa: 0x0c08, 0x5ab: 0x0c08, 0x5ac: 0x0c08, 0x5ad: 0x0808, 0x5ae: 0x0c08, 0x5af: 0x0a08,
+	0x5b0: 0x0a08, 0x5b1: 0x0c08, 0x5b2: 0x0c08, 0x5b3: 0x0a08, 0x5b4: 0x0a08, 0x5b5: 0x0a08,
+	0x5b6: 0x0a08, 0x5b7: 0x0a08, 0x5b8: 0x0a08, 0x5b9: 0x0c08, 0x5ba: 0x0a08, 0x5bb: 0x0a08,
+	0x5bc: 0x0a08, 0x5bd: 0x0a08, 0x5be: 0x0a08, 0x5bf: 0x0a08,
+	// Block 0x17, offset 0x5c0
+	0x5c0: 0x3008, 0x5c1: 0x3308, 0x5c2: 0x3308, 0x5c3: 0x3308, 0x5c4: 0x3308, 0x5c5: 0x3308,
+	0x5c6: 0x3308, 0x5c7: 0x3308, 0x5c8: 0x3308, 0x5c9: 0x3008, 0x5ca: 0x3008, 0x5cb: 0x3008,
+	0x5cc: 0x3008, 0x5cd: 0x3b08, 0x5ce: 0x3008, 0x5cf: 0x3008, 0x5d0: 0x0008, 0x5d1: 0x3308,
+	0x5d2: 0x3308, 0x5d3: 0x3308, 0x5d4: 0x3308, 0x5d5: 0x3308, 0x5d6: 0x3308, 0x5d7: 0x3308,
+	0x5d8: 0x0159, 0x5d9: 0x0161, 0x5da: 0x0169, 0x5db: 0x0171, 0x5dc: 0x0179, 0x5dd: 0x0181,
+	0x5de: 0x0189, 0x5df: 0x0191, 0x5e0: 0x0008, 0x5e1: 0x0008, 0x5e2: 0x3308, 0x5e3: 0x3308,
+	0x5e4: 0x0018, 0x5e5: 0x0018, 0x5e6: 0x0008, 0x5e7: 0x0008, 0x5e8: 0x0008, 0x5e9: 0x0008,
+	0x5ea: 0x0008, 0x5eb: 0x0008, 0x5ec: 0x0008, 0x5ed: 0x0008, 0x5ee: 0x0008, 0x5ef: 0x0008,
+	0x5f0: 0x0018, 0x5f1: 0x0008, 0x5f2: 0x0008, 0x5f3: 0x0008, 0x5f4: 0x0008, 0x5f5: 0x0008,
+	0x5f6: 0x0008, 0x5f7: 0x0008, 0x5f8: 0x0008, 0x5f9: 0x0008, 0x5fa: 0x0008, 0x5fb: 0x0008,
+	0x5fc: 0x0008, 0x5fd: 0x0008, 0x5fe: 0x0008, 0x5ff: 0x0008,
+	// Block 0x18, offset 0x600
+	0x600: 0x0008, 0x601: 0x3308, 0x602: 0x3008, 0x603: 0x3008, 0x604: 0x0040, 0x605: 0x0008,
+	0x606: 0x0008, 0x607: 0x0008, 0x608: 0x0008, 0x609: 0x0008, 0x60a: 0x0008, 0x60b: 0x0008,
+	0x60c: 0x0008, 0x60d: 0x0040, 0x60e: 0x0040, 0x60f: 0x0008, 0x610: 0x0008, 0x611: 0x0040,
+	0x612: 0x0040, 0x613: 0x0008, 0x614: 0x0008, 0x615: 0x0008, 0x616: 0x0008, 0x617: 0x0008,
+	0x618: 0x0008, 0x619: 0x0008, 0x61a: 0x0008, 0x61b: 0x0008, 0x61c: 0x0008, 0x61d: 0x0008,
+	0x61e: 0x0008, 0x61f: 0x0008, 0x620: 0x0008, 0x621: 0x0008, 0x622: 0x0008, 0x623: 0x0008,
+	0x624: 0x0008, 0x625: 0x0008, 0x626: 0x0008, 0x627: 0x0008, 0x628: 0x0008, 0x629: 0x0040,
+	0x62a: 0x0008, 0x62b: 0x0008, 0x62c: 0x0008, 0x62d: 0x0008, 0x62e: 0x0008, 0x62f: 0x0008,
+	0x630: 0x0008, 0x631: 0x0040, 0x632: 0x0008, 0x633: 0x0040, 0x634: 0x0040, 0x635: 0x0040,
+	0x636: 0x0008, 0x637: 0x0008, 0x638: 0x0008, 0x639: 0x0008, 0x63a: 0x0040, 0x63b: 0x0040,
+	0x63c: 0x3308, 0x63d: 0x0008, 0x63e: 0x3008, 0x63f: 0x3008,
+	// Block 0x19, offset 0x640
+	0x640: 0x3008, 0x641: 0x3308, 0x642: 0x3308, 0x643: 0x3308, 0x644: 0x3308, 0x645: 0x0040,
+	0x646: 0x0040, 0x647: 0x3008, 0x648: 0x3008, 0x649: 0x0040, 0x64a: 0x0040, 0x64b: 0x3008,
+	0x64c: 0x3008, 0x64d: 0x3b08, 0x64e: 0x0008, 0x64f: 0x0040, 0x650: 0x0040, 0x651: 0x0040,
+	0x652: 0x0040, 0x653: 0x0040, 0x654: 0x0040, 0x655: 0x0040, 0x656: 0x0040, 0x657: 0x3008,
+	0x658: 0x0040, 0x659: 0x0040, 0x65a: 0x0040, 0x65b: 0x0040, 0x65c: 0x0199, 0x65d: 0x01a1,
+	0x65e: 0x0040, 0x65f: 0x01a9, 0x660: 0x0008, 0x661: 0x0008, 0x662: 0x3308, 0x663: 0x3308,
+	0x664: 0x0040, 0x665: 0x0040, 0x666: 0x0008, 0x667: 0x0008, 0x668: 0x0008, 0x669: 0x0008,
+	0x66a: 0x0008, 0x66b: 0x0008, 0x66c: 0x0008, 0x66d: 0x0008, 0x66e: 0x0008, 0x66f: 0x0008,
+	0x670: 0x0008, 0x671: 0x0008, 0x672: 0x0018, 0x673: 0x0018, 0x674: 0x0018, 0x675: 0x0018,
+	0x676: 0x0018, 0x677: 0x0018, 0x678: 0x0018, 0x679: 0x0018, 0x67a: 0x0018, 0x67b: 0x0018,
+	0x67c: 0x0008, 0x67d: 0x0018, 0x67e: 0x3308, 0x67f: 0x0040,
+	// Block 0x1a, offset 0x680
+	0x680: 0x0040, 0x681: 0x3308, 0x682: 0x3308, 0x683: 0x3008, 0x684: 0x0040, 0x685: 0x0008,
+	0x686: 0x0008, 0x687: 0x0008, 0x688: 0x0008, 0x689: 0x0008, 0x68a: 0x0008, 0x68b: 0x0040,
+	0x68c: 0x0040, 0x68d: 0x0040, 0x68e: 0x0040, 0x68f: 0x0008, 0x690: 0x0008, 0x691: 0x0040,
+	0x692: 0x0040, 0x693: 0x0008, 0x694: 0x0008, 0x695: 0x0008, 0x696: 0x0008, 0x697: 0x0008,
+	0x698: 0x0008, 0x699: 0x0008, 0x69a: 0x0008, 0x69b: 0x0008, 0x69c: 0x0008, 0x69d: 0x0008,
+	0x69e: 0x0008, 0x69f: 0x0008, 0x6a0: 0x0008, 0x6a1: 0x0008, 0x6a2: 0x0008, 0x6a3: 0x0008,
+	0x6a4: 0x0008, 0x6a5: 0x0008, 0x6a6: 0x0008, 0x6a7: 0x0008, 0x6a8: 0x0008, 0x6a9: 0x0040,
+	0x6aa: 0x0008, 0x6ab: 0x0008, 0x6ac: 0x0008, 0x6ad: 0x0008, 0x6ae: 0x0008, 0x6af: 0x0008,
+	0x6b0: 0x0008, 0x6b1: 0x0040, 0x6b2: 0x0008, 0x6b3: 0x01b1, 0x6b4: 0x0040, 0x6b5: 0x0008,
+	0x6b6: 0x01b9, 0x6b7: 0x0040, 0x6b8: 0x0008, 0x6b9: 0x0008, 0x6ba: 0x0040, 0x6bb: 0x0040,
+	0x6bc: 0x3308, 0x6bd: 0x0040, 0x6be: 0x3008, 0x6bf: 0x3008,
+	// Block 0x1b, offset 0x6c0
+	0x6c0: 0x3008, 0x6c1: 0x3308, 0x6c2: 0x3308, 0x6c3: 0x0040, 0x6c4: 0x0040, 0x6c5: 0x0040,
+	0x6c6: 0x0040, 0x6c7: 0x3308, 0x6c8: 0x3308, 0x6c9: 0x0040, 0x6ca: 0x0040, 0x6cb: 0x3308,
+	0x6cc: 0x3308, 0x6cd: 0x3b08, 0x6ce: 0x0040, 0x6cf: 0x0040, 0x6d0: 0x0040, 0x6d1: 0x3308,
+	0x6d2: 0x0040, 0x6d3: 0x0040, 0x6d4: 0x0040, 0x6d5: 0x0040, 0x6d6: 0x0040, 0x6d7: 0x0040,
+	0x6d8: 0x0040, 0x6d9: 0x01c1, 0x6da: 0x01c9, 0x6db: 0x01d1, 0x6dc: 0x0008, 0x6dd: 0x0040,
+	0x6de: 0x01d9, 0x6df: 0x0040, 0x6e0: 0x0040, 0x6e1: 0x0040, 0x6e2: 0x0040, 0x6e3: 0x0040,
+	0x6e4: 0x0040, 0x6e5: 0x0040, 0x6e6: 0x0008, 0x6e7: 0x0008, 0x6e8: 0x0008, 0x6e9: 0x0008,
+	0x6ea: 0x0008, 0x6eb: 0x0008, 0x6ec: 0x0008, 0x6ed: 0x0008, 0x6ee: 0x0008, 0x6ef: 0x0008,
+	0x6f0: 0x3308, 0x6f1: 0x3308, 0x6f2: 0x0008, 0x6f3: 0x0008, 0x6f4: 0x0008, 0x6f5: 0x3308,
+	0x6f6: 0x0018, 0x6f7: 0x0040, 0x6f8: 0x0040, 0x6f9: 0x0040, 0x6fa: 0x0040, 0x6fb: 0x0040,
+	0x6fc: 0x0040, 0x6fd: 0x0040, 0x6fe: 0x0040, 0x6ff: 0x0040,
+	// Block 0x1c, offset 0x700
+	0x700: 0x0040, 0x701: 0x3308, 0x702: 0x3308, 0x703: 0x3008, 0x704: 0x0040, 0x705: 0x0008,
+	0x706: 0x0008, 0x707: 0x0008, 0x708: 0x0008, 0x709: 0x0008, 0x70a: 0x0008, 0x70b: 0x0008,
+	0x70c: 0x0008, 0x70d: 0x0008, 0x70e: 0x0040, 0x70f: 0x0008, 0x710: 0x0008, 0x711: 0x0008,
+	0x712: 0x0040, 0x713: 0x0008, 0x714: 0x0008, 0x715: 0x0008, 0x716: 0x0008, 0x717: 0x0008,
+	0x718: 0x0008, 0x719: 0x0008, 0x71a: 0x0008, 0x71b: 0x0008, 0x71c: 0x0008, 0x71d: 0x0008,
+	0x71e: 0x0008, 0x71f: 0x0008, 0x720: 0x0008, 0x721: 0x0008, 0x722: 0x0008, 0x723: 0x0008,
+	0x724: 0x0008, 0x725: 0x0008, 0x726: 0x0008, 0x727: 0x0008, 0x728: 0x0008, 0x729: 0x0040,
+	0x72a: 0x0008, 0x72b: 0x0008, 0x72c: 0x0008, 0x72d: 0x0008, 0x72e: 0x0008, 0x72f: 0x0008,
+	0x730: 0x0008, 0x731: 0x0040, 0x732: 0x0008, 0x733: 0x0008, 0x734: 0x0040, 0x735: 0x0008,
+	0x736: 0x0008, 0x737: 0x0008, 0x738: 0x0008, 0x739: 0x0008, 0x73a: 0x0040, 0x73b: 0x0040,
+	0x73c: 0x3308, 0x73d: 0x0008, 0x73e: 0x3008, 0x73f: 0x3008,
+	// Block 0x1d, offset 0x740
+	0x740: 0x3008, 0x741: 0x3308, 0x742: 0x3308, 0x743: 0x3308, 0x744: 0x3308, 0x745: 0x3308,
+	0x746: 0x0040, 0x747: 0x3308, 0x748: 0x3308, 0x749: 0x3008, 0x74a: 0x0040, 0x74b: 0x3008,
+	0x74c: 0x3008, 0x74d: 0x3b08, 0x74e: 0x0040, 0x74f: 0x0040, 0x750: 0x0008, 0x751: 0x0040,
+	0x752: 0x0040, 0x753: 0x0040, 0x754: 0x0040, 0x755: 0x0040, 0x756: 0x0040, 0x757: 0x0040,
+	0x758: 0x0040, 0x759: 0x0040, 0x75a: 0x0040, 0x75b: 0x0040, 0x75c: 0x0040, 0x75d: 0x0040,
+	0x75e: 0x0040, 0x75f: 0x0040, 0x760: 0x0008, 0x761: 0x0008, 0x762: 0x3308, 0x763: 0x3308,
+	0x764: 0x0040, 0x765: 0x0040, 0x766: 0x0008, 0x767: 0x0008, 0x768: 0x0008, 0x769: 0x0008,
+	0x76a: 0x0008, 0x76b: 0x0008, 0x76c: 0x0008, 0x76d: 0x0008, 0x76e: 0x0008, 0x76f: 0x0008,
+	0x770: 0x0018, 0x771: 0x0018, 0x772: 0x0040, 0x773: 0x0040, 0x774: 0x0040, 0x775: 0x0040,
+	0x776: 0x0040, 0x777: 0x0040, 0x778: 0x0040, 0x779: 0x0008, 0x77a: 0x3308, 0x77b: 0x3308,
+	0x77c: 0x3308, 0x77d: 0x3308, 0x77e: 0x3308, 0x77f: 0x3308,
+	// Block 0x1e, offset 0x780
+	0x780: 0x0040, 0x781: 0x3308, 0x782: 0x3008, 0x783: 0x3008, 0x784: 0x0040, 0x785: 0x0008,
+	0x786: 0x0008, 0x787: 0x0008, 0x788: 0x0008, 0x789: 0x0008, 0x78a: 0x0008, 0x78b: 0x0008,
+	0x78c: 0x0008, 0x78d: 0x0040, 0x78e: 0x0040, 0x78f: 0x0008, 0x790: 0x0008, 0x791: 0x0040,
+	0x792: 0x0040, 0x793: 0x0008, 0x794: 0x0008, 0x795: 0x0008, 0x796: 0x0008, 0x797: 0x0008,
+	0x798: 0x0008, 0x799: 0x0008, 0x79a: 0x0008, 0x79b: 0x0008, 0x79c: 0x0008, 0x79d: 0x0008,
+	0x79e: 0x0008, 0x79f: 0x0008, 0x7a0: 0x0008, 0x7a1: 0x0008, 0x7a2: 0x0008, 0x7a3: 0x0008,
+	0x7a4: 0x0008, 0x7a5: 0x0008, 0x7a6: 0x0008, 0x7a7: 0x0008, 0x7a8: 0x0008, 0x7a9: 0x0040,
+	0x7aa: 0x0008, 0x7ab: 0x0008, 0x7ac: 0x0008, 0x7ad: 0x0008, 0x7ae: 0x0008, 0x7af: 0x0008,
+	0x7b0: 0x0008, 0x7b1: 0x0040, 0x7b2: 0x0008, 0x7b3: 0x0008, 0x7b4: 0x0040, 0x7b5: 0x0008,
+	0x7b6: 0x0008, 0x7b7: 0x0008, 0x7b8: 0x0008, 0x7b9: 0x0008, 0x7ba: 0x0040, 0x7bb: 0x0040,
+	0x7bc: 0x3308, 0x7bd: 0x0008, 0x7be: 0x3008, 0x7bf: 0x3308,
+	// Block 0x1f, offset 0x7c0
+	0x7c0: 0x3008, 0x7c1: 0x3308, 0x7c2: 0x3308, 0x7c3: 0x3308, 0x7c4: 0x3308, 0x7c5: 0x0040,
+	0x7c6: 0x0040, 0x7c7: 0x3008, 0x7c8: 0x3008, 0x7c9: 0x0040, 0x7ca: 0x0040, 0x7cb: 0x3008,
+	0x7cc: 0x3008, 0x7cd: 0x3b08, 0x7ce: 0x0040, 0x7cf: 0x0040, 0x7d0: 0x0040, 0x7d1: 0x0040,
+	0x7d2: 0x0040, 0x7d3: 0x0040, 0x7d4: 0x0040, 0x7d5: 0x3308, 0x7d6: 0x3308, 0x7d7: 0x3008,
+	0x7d8: 0x0040, 0x7d9: 0x0040, 0x7da: 0x0040, 0x7db: 0x0040, 0x7dc: 0x01e1, 0x7dd: 0x01e9,
+	0x7de: 0x0040, 0x7df: 0x0008, 0x7e0: 0x0008, 0x7e1: 0x0008, 0x7e2: 0x3308, 0x7e3: 0x3308,
+	0x7e4: 0x0040, 0x7e5: 0x0040, 0x7e6: 0x0008, 0x7e7: 0x0008, 0x7e8: 0x0008, 0x7e9: 0x0008,
+	0x7ea: 0x0008, 0x7eb: 0x0008, 0x7ec: 0x0008, 0x7ed: 0x0008, 0x7ee: 0x0008, 0x7ef: 0x0008,
+	0x7f0: 0x0018, 0x7f1: 0x0008, 0x7f2: 0x0018, 0x7f3: 0x0018, 0x7f4: 0x0018, 0x7f5: 0x0018,
+	0x7f6: 0x0018, 0x7f7: 0x0018, 0x7f8: 0x0040, 0x7f9: 0x0040, 0x7fa: 0x0040, 0x7fb: 0x0040,
+	0x7fc: 0x0040, 0x7fd: 0x0040, 0x7fe: 0x0040, 0x7ff: 0x0040,
+	// Block 0x20, offset 0x800
+	0x800: 0x0040, 0x801: 0x0040, 0x802: 0x3308, 0x803: 0x0008, 0x804: 0x0040, 0x805: 0x0008,
+	0x806: 0x0008, 0x807: 0x0008, 0x808: 0x0008, 0x809: 0x0008, 0x80a: 0x0008, 0x80b: 0x0040,
+	0x80c: 0x0040, 0x80d: 0x0040, 0x80e: 0x0008, 0x80f: 0x0008, 0x810: 0x0008, 0x811: 0x0040,
+	0x812: 0x0008, 0x813: 0x0008, 0x814: 0x0008, 0x815: 0x0008, 0x816: 0x0040, 0x817: 0x0040,
+	0x818: 0x0040, 0x819: 0x0008, 0x81a: 0x0008, 0x81b: 0x0040, 0x81c: 0x0008, 0x81d: 0x0040,
+	0x81e: 0x0008, 0x81f: 0x0008, 0x820: 0x0040, 0x821: 0x0040, 0x822: 0x0040, 0x823: 0x0008,
+	0x824: 0x0008, 0x825: 0x0040, 0x826: 0x0040, 0x827: 0x0040, 0x828: 0x0008, 0x829: 0x0008,
+	0x82a: 0x0008, 0x82b: 0x0040, 0x82c: 0x0040, 0x82d: 0x0040, 0x82e: 0x0008, 0x82f: 0x0008,
+	0x830: 0x0008, 0x831: 0x0008, 0x832: 0x0008, 0x833: 0x0008, 0x834: 0x0008, 0x835: 0x0008,
+	0x836: 0x0008, 0x837: 0x0008, 0x838: 0x0008, 0x839: 0x0008, 0x83a: 0x0040, 0x83b: 0x0040,
+	0x83c: 0x0040, 0x83d: 0x0040, 0x83e: 0x3008, 0x83f: 0x3008,
+	// Block 0x21, offset 0x840
+	0x840: 0x3308, 0x841: 0x3008, 0x842: 0x3008, 0x843: 0x3008, 0x844: 0x3008, 0x845: 0x0040,
+	0x846: 0x3308, 0x847: 0x3308, 0x848: 0x3308, 0x849: 0x0040, 0x84a: 0x3308, 0x84b: 0x3308,
+	0x84c: 0x3308, 0x84d: 0x3b08, 0x84e: 0x0040, 0x84f: 0x0040, 0x850: 0x0040, 0x851: 0x0040,
+	0x852: 0x0040, 0x853: 0x0040, 0x854: 0x0040, 0x855: 0x3308, 0x856: 0x3308, 0x857: 0x0040,
+	0x858: 0x0008, 0x859: 0x0008, 0x85a: 0x0008, 0x85b: 0x0040, 0x85c: 0x0040, 0x85d: 0x0008,
+	0x85e: 0x0040, 0x85f: 0x0040, 0x860: 0x0008, 0x861: 0x0008, 0x862: 0x3308, 0x863: 0x3308,
+	0x864: 0x0040, 0x865: 0x0040, 0x866: 0x0008, 0x867: 0x0008, 0x868: 0x0008, 0x869: 0x0008,
+	0x86a: 0x0008, 0x86b: 0x0008, 0x86c: 0x0008, 0x86d: 0x0008, 0x86e: 0x0008, 0x86f: 0x0008,
+	0x870: 0x0040, 0x871: 0x0040, 0x872: 0x0040, 0x873: 0x0040, 0x874: 0x0040, 0x875: 0x0040,
+	0x876: 0x0040, 0x877: 0x0018, 0x878: 0x0018, 0x879: 0x0018, 0x87a: 0x0018, 0x87b: 0x0018,
+	0x87c: 0x0018, 0x87d: 0x0018, 0x87e: 0x0018, 0x87f: 0x0018,
+	// Block 0x22, offset 0x880
+	0x880: 0x0008, 0x881: 0x3308, 0x882: 0x3008, 0x883: 0x3008, 0x884: 0x0018, 0x885: 0x0008,
+	0x886: 0x0008, 0x887: 0x0008, 0x888: 0x0008, 0x889: 0x0008, 0x88a: 0x0008, 0x88b: 0x0008,
+	0x88c: 0x0008, 0x88d: 0x0040, 0x88e: 0x0008, 0x88f: 0x0008, 0x890: 0x0008, 0x891: 0x0040,
+	0x892: 0x0008, 0x893: 0x0008, 0x894: 0x0008, 0x895: 0x0008, 0x896: 0x0008, 0x897: 0x0008,
+	0x898: 0x0008, 0x899: 0x0008, 0x89a: 0x0008, 0x89b: 0x0008, 0x89c: 0x0008, 0x89d: 0x0008,
+	0x89e: 0x0008, 0x89f: 0x0008, 0x8a0: 0x0008, 0x8a1: 0x0008, 0x8a2: 0x0008, 0x8a3: 0x0008,
+	0x8a4: 0x0008, 0x8a5: 0x0008, 0x8a6: 0x0008, 0x8a7: 0x0008, 0x8a8: 0x0008, 0x8a9: 0x0040,
+	0x8aa: 0x0008, 0x8ab: 0x0008, 0x8ac: 0x0008, 0x8ad: 0x0008, 0x8ae: 0x0008, 0x8af: 0x0008,
+	0x8b0: 0x0008, 0x8b1: 0x0008, 0x8b2: 0x0008, 0x8b3: 0x0008, 0x8b4: 0x0040, 0x8b5: 0x0008,
+	0x8b6: 0x0008, 0x8b7: 0x0008, 0x8b8: 0x0008, 0x8b9: 0x0008, 0x8ba: 0x0040, 0x8bb: 0x0040,
+	0x8bc: 0x3308, 0x8bd: 0x0008, 0x8be: 0x3008, 0x8bf: 0x3308,
+	// Block 0x23, offset 0x8c0
+	0x8c0: 0x3008, 0x8c1: 0x3008, 0x8c2: 0x3008, 0x8c3: 0x3008, 0x8c4: 0x3008, 0x8c5: 0x0040,
+	0x8c6: 0x3308, 0x8c7: 0x3008, 0x8c8: 0x3008, 0x8c9: 0x0040, 0x8ca: 0x3008, 0x8cb: 0x3008,
+	0x8cc: 0x3308, 0x8cd: 0x3b08, 0x8ce: 0x0040, 0x8cf: 0x0040, 0x8d0: 0x0040, 0x8d1: 0x0040,
+	0x8d2: 0x0040, 0x8d3: 0x0040, 0x8d4: 0x0040, 0x8d5: 0x3008, 0x8d6: 0x3008, 0x8d7: 0x0040,
+	0x8d8: 0x0040, 0x8d9: 0x0040, 0x8da: 0x0040, 0x8db: 0x0040, 0x8dc: 0x0040, 0x8dd: 0x0008,
+	0x8de: 0x0008, 0x8df: 0x0040, 0x8e0: 0x0008, 0x8e1: 0x0008, 0x8e2: 0x3308, 0x8e3: 0x3308,
+	0x8e4: 0x0040, 0x8e5: 0x0040, 0x8e6: 0x0008, 0x8e7: 0x0008, 0x8e8: 0x0008, 0x8e9: 0x0008,
+	0x8ea: 0x0008, 0x8eb: 0x0008, 0x8ec: 0x0008, 0x8ed: 0x0008, 0x8ee: 0x0008, 0x8ef: 0x0008,
+	0x8f0: 0x0040, 0x8f1: 0x0008, 0x8f2: 0x0008, 0x8f3: 0x3008, 0x8f4: 0x0040, 0x8f5: 0x0040,
+	0x8f6: 0x0040, 0x8f7: 0x0040, 0x8f8: 0x0040, 0x8f9: 0x0040, 0x8fa: 0x0040, 0x8fb: 0x0040,
+	0x8fc: 0x0040, 0x8fd: 0x0040, 0x8fe: 0x0040, 0x8ff: 0x0040,
+	// Block 0x24, offset 0x900
+	0x900: 0x3008, 0x901: 0x3308, 0x902: 0x3308, 0x903: 0x3308, 0x904: 0x3308, 0x905: 0x0040,
+	0x906: 0x3008, 0x907: 0x3008, 0x908: 0x3008, 0x909: 0x0040, 0x90a: 0x3008, 0x90b: 0x3008,
+	0x90c: 0x3008, 0x90d: 0x3b08, 0x90e: 0x0008, 0x90f: 0x0018, 0x910: 0x0040, 0x911: 0x0040,
+	0x912: 0x0040, 0x913: 0x0040, 0x914: 0x0008, 0x915: 0x0008, 0x916: 0x0008, 0x917: 0x3008,
+	0x918: 0x0018, 0x919: 0x0018, 0x91a: 0x0018, 0x91b: 0x0018, 0x91c: 0x0018, 0x91d: 0x0018,
+	0x91e: 0x0018, 0x91f: 0x0008, 0x920: 0x0008, 0x921: 0x0008, 0x922: 0x3308, 0x923: 0x3308,
+	0x924: 0x0040, 0x925: 0x0040, 0x926: 0x0008, 0x927: 0x0008, 0x928: 0x0008, 0x929: 0x0008,
+	0x92a: 0x0008, 0x92b: 0x0008, 0x92c: 0x0008, 0x92d: 0x0008, 0x92e: 0x0008, 0x92f: 0x0008,
+	0x930: 0x0018, 0x931: 0x0018, 0x932: 0x0018, 0x933: 0x0018, 0x934: 0x0018, 0x935: 0x0018,
+	0x936: 0x0018, 0x937: 0x0018, 0x938: 0x0018, 0x939: 0x0018, 0x93a: 0x0008, 0x93b: 0x0008,
+	0x93c: 0x0008, 0x93d: 0x0008, 0x93e: 0x0008, 0x93f: 0x0008,
+	// Block 0x25, offset 0x940
+	0x940: 0x0040, 0x941: 0x0008, 0x942: 0x0008, 0x943: 0x0040, 0x944: 0x0008, 0x945: 0x0040,
+	0x946: 0x0008, 0x947: 0x0008, 0x948: 0x0008, 0x949: 0x0008, 0x94a: 0x0008, 0x94b: 0x0040,
+	0x94c: 0x0008, 0x94d: 0x0008, 0x94e: 0x0008, 0x94f: 0x0008, 0x950: 0x0008, 0x951: 0x0008,
+	0x952: 0x0008, 0x953: 0x0008, 0x954: 0x0008, 0x955: 0x0008, 0x956: 0x0008, 0x957: 0x0008,
+	0x958: 0x0008, 0x959: 0x0008, 0x95a: 0x0008, 0x95b: 0x0008, 0x95c: 0x0008, 0x95d: 0x0008,
+	0x95e: 0x0008, 0x95f: 0x0008, 0x960: 0x0008, 0x961: 0x0008, 0x962: 0x0008, 0x963: 0x0008,
+	0x964: 0x0040, 0x965: 0x0008, 0x966: 0x0040, 0x967: 0x0008, 0x968: 0x0008, 0x969: 0x0008,
+	0x96a: 0x0008, 0x96b: 0x0008, 0x96c: 0x0008, 0x96d: 0x0008, 0x96e: 0x0008, 0x96f: 0x0008,
+	0x970: 0x0008, 0x971: 0x3308, 0x972: 0x0008, 0x973: 0x01f9, 0x974: 0x3308, 0x975: 0x3308,
+	0x976: 0x3308, 0x977: 0x3308, 0x978: 0x3308, 0x979: 0x3308, 0x97a: 0x3b08, 0x97b: 0x3308,
+	0x97c: 0x3308, 0x97d: 0x0008, 0x97e: 0x0040, 0x97f: 0x0040,
+	// Block 0x26, offset 0x980
+	0x980: 0x0008, 0x981: 0x0008, 0x982: 0x0008, 0x983: 0x0211, 0x984: 0x0008, 0x985: 0x0008,
+	0x986: 0x0008, 0x987: 0x0008, 0x988: 0x0040, 0x989: 0x0008, 0x98a: 0x0008, 0x98b: 0x0008,
+	0x98c: 0x0008, 0x98d: 0x0219, 0x98e: 0x0008, 0x98f: 0x0008, 0x990: 0x0008, 0x991: 0x0008,
+	0x992: 0x0221, 0x993: 0x0008, 0x994: 0x0008, 0x995: 0x0008, 0x996: 0x0008, 0x997: 0x0229,
+	0x998: 0x0008, 0x999: 0x0008, 0x99a: 0x0008, 0x99b: 0x0008, 0x99c: 0x0231, 0x99d: 0x0008,
+	0x99e: 0x0008, 0x99f: 0x0008, 0x9a0: 0x0008, 0x9a1: 0x0008, 0x9a2: 0x0008, 0x9a3: 0x0008,
+	0x9a4: 0x0008, 0x9a5: 0x0008, 0x9a6: 0x0008, 0x9a7: 0x0008, 0x9a8: 0x0008, 0x9a9: 0x0239,
+	0x9aa: 0x0008, 0x9ab: 0x0008, 0x9ac: 0x0008, 0x9ad: 0x0040, 0x9ae: 0x0040, 0x9af: 0x0040,
+	0x9b0: 0x0040, 0x9b1: 0x3308, 0x9b2: 0x3308, 0x9b3: 0x0241, 0x9b4: 0x3308, 0x9b5: 0x0249,
+	0x9b6: 0x0251, 0x9b7: 0x0259, 0x9b8: 0x0261, 0x9b9: 0x0269, 0x9ba: 0x3308, 0x9bb: 0x3308,
+	0x9bc: 0x3308, 0x9bd: 0x3308, 0x9be: 0x3308, 0x9bf: 0x3008,
+	// Block 0x27, offset 0x9c0
+	0x9c0: 0x3308, 0x9c1: 0x0271, 0x9c2: 0x3308, 0x9c3: 0x3308, 0x9c4: 0x3b08, 0x9c5: 0x0018,
+	0x9c6: 0x3308, 0x9c7: 0x3308, 0x9c8: 0x0008, 0x9c9: 0x0008, 0x9ca: 0x0008, 0x9cb: 0x0008,
+	0x9cc: 0x0008, 0x9cd: 0x3308, 0x9ce: 0x3308, 0x9cf: 0x3308, 0x9d0: 0x3308, 0x9d1: 0x3308,
+	0x9d2: 0x3308, 0x9d3: 0x0279, 0x9d4: 0x3308, 0x9d5: 0x3308, 0x9d6: 0x3308, 0x9d7: 0x3308,
+	0x9d8: 0x0040, 0x9d9: 0x3308, 0x9da: 0x3308, 0x9db: 0x3308, 0x9dc: 0x3308, 0x9dd: 0x0281,
+	0x9de: 0x3308, 0x9df: 0x3308, 0x9e0: 0x3308, 0x9e1: 0x3308, 0x9e2: 0x0289, 0x9e3: 0x3308,
+	0x9e4: 0x3308, 0x9e5: 0x3308, 0x9e6: 0x3308, 0x9e7: 0x0291, 0x9e8: 0x3308, 0x9e9: 0x3308,
+	0x9ea: 0x3308, 0x9eb: 0x3308, 0x9ec: 0x0299, 0x9ed: 0x3308, 0x9ee: 0x3308, 0x9ef: 0x3308,
+	0x9f0: 0x3308, 0x9f1: 0x3308, 0x9f2: 0x3308, 0x9f3: 0x3308, 0x9f4: 0x3308, 0x9f5: 0x3308,
+	0x9f6: 0x3308, 0x9f7: 0x3308, 0x9f8: 0x3308, 0x9f9: 0x02a1, 0x9fa: 0x3308, 0x9fb: 0x3308,
+	0x9fc: 0x3308, 0x9fd: 0x0040, 0x9fe: 0x0018, 0x9ff: 0x0018,
+	// Block 0x28, offset 0xa00
+	0xa00: 0x0008, 0xa01: 0x0008, 0xa02: 0x0008, 0xa03: 0x0008, 0xa04: 0x0008, 0xa05: 0x0008,
+	0xa06: 0x0008, 0xa07: 0x0008, 0xa08: 0x0008, 0xa09: 0x0008, 0xa0a: 0x0008, 0xa0b: 0x0008,
+	0xa0c: 0x0008, 0xa0d: 0x0008, 0xa0e: 0x0008, 0xa0f: 0x0008, 0xa10: 0x0008, 0xa11: 0x0008,
+	0xa12: 0x0008, 0xa13: 0x0008, 0xa14: 0x0008, 0xa15: 0x0008, 0xa16: 0x0008, 0xa17: 0x0008,
+	0xa18: 0x0008, 0xa19: 0x0008, 0xa1a: 0x0008, 0xa1b: 0x0008, 0xa1c: 0x0008, 0xa1d: 0x0008,
+	0xa1e: 0x0008, 0xa1f: 0x0008, 0xa20: 0x0008, 0xa21: 0x0008, 0xa22: 0x0008, 0xa23: 0x0008,
+	0xa24: 0x0008, 0xa25: 0x0008, 0xa26: 0x0008, 0xa27: 0x0008, 0xa28: 0x0008, 0xa29: 0x0008,
+	0xa2a: 0x0008, 0xa2b: 0x0008, 0xa2c: 0x0019, 0xa2d: 0x02e1, 0xa2e: 0x02e9, 0xa2f: 0x0008,
+	0xa30: 0x02f1, 0xa31: 0x02f9, 0xa32: 0x0301, 0xa33: 0x0309, 0xa34: 0x00a9, 0xa35: 0x0311,
+	0xa36: 0x00b1, 0xa37: 0x0319, 0xa38: 0x0101, 0xa39: 0x0321, 0xa3a: 0x0329, 0xa3b: 0x0008,
+	0xa3c: 0x0051, 0xa3d: 0x0331, 0xa3e: 0x0339, 0xa3f: 0x00b9,
+	// Block 0x29, offset 0xa40
+	0xa40: 0x0341, 0xa41: 0x0349, 0xa42: 0x00c1, 0xa43: 0x0019, 0xa44: 0x0351, 0xa45: 0x0359,
+	0xa46: 0x05b5, 0xa47: 0x02e9, 0xa48: 0x02f1, 0xa49: 0x02f9, 0xa4a: 0x0361, 0xa4b: 0x0369,
+	0xa4c: 0x0371, 0xa4d: 0x0309, 0xa4e: 0x0008, 0xa4f: 0x0319, 0xa50: 0x0321, 0xa51: 0x0379,
+	0xa52: 0x0051, 0xa53: 0x0381, 0xa54: 0x05cd, 0xa55: 0x05cd, 0xa56: 0x0339, 0xa57: 0x0341,
+	0xa58: 0x0349, 0xa59: 0x05b5, 0xa5a: 0x0389, 0xa5b: 0x0391, 0xa5c: 0x05e5, 0xa5d: 0x0399,
+	0xa5e: 0x03a1, 0xa5f: 0x03a9, 0xa60: 0x03b1, 0xa61: 0x03b9, 0xa62: 0x0311, 0xa63: 0x00b9,
+	0xa64: 0x0349, 0xa65: 0x0391, 0xa66: 0x0399, 0xa67: 0x03a1, 0xa68: 0x03c1, 0xa69: 0x03b1,
+	0xa6a: 0x03b9, 0xa6b: 0x0008, 0xa6c: 0x0008, 0xa6d: 0x0008, 0xa6e: 0x0008, 0xa6f: 0x0008,
+	0xa70: 0x0008, 0xa71: 0x0008, 0xa72: 0x0008, 0xa73: 0x0008, 0xa74: 0x0008, 0xa75: 0x0008,
+	0xa76: 0x0008, 0xa77: 0x0008, 0xa78: 0x03c9, 0xa79: 0x0008, 0xa7a: 0x0008, 0xa7b: 0x0008,
+	0xa7c: 0x0008, 0xa7d: 0x0008, 0xa7e: 0x0008, 0xa7f: 0x0008,
+	// Block 0x2a, offset 0xa80
+	0xa80: 0x0008, 0xa81: 0x0008, 0xa82: 0x0008, 0xa83: 0x0008, 0xa84: 0x0008, 0xa85: 0x0008,
+	0xa86: 0x0008, 0xa87: 0x0008, 0xa88: 0x0008, 0xa89: 0x0008, 0xa8a: 0x0008, 0xa8b: 0x0008,
+	0xa8c: 0x0008, 0xa8d: 0x0008, 0xa8e: 0x0008, 0xa8f: 0x0008, 0xa90: 0x0008, 0xa91: 0x0008,
+	0xa92: 0x0008, 0xa93: 0x0008, 0xa94: 0x0008, 0xa95: 0x0008, 0xa96: 0x0008, 0xa97: 0x0008,
+	0xa98: 0x0008, 0xa99: 0x0008, 0xa9a: 0x0008, 0xa9b: 0x03d1, 0xa9c: 0x03d9, 0xa9d: 0x03e1,
+	0xa9e: 0x03e9, 0xa9f: 0x0371, 0xaa0: 0x03f1, 0xaa1: 0x03f9, 0xaa2: 0x0401, 0xaa3: 0x0409,
+	0xaa4: 0x0411, 0xaa5: 0x0419, 0xaa6: 0x0421, 0xaa7: 0x05fd, 0xaa8: 0x0429, 0xaa9: 0x0431,
+	0xaaa: 0xe17d, 0xaab: 0x0439, 0xaac: 0x0441, 0xaad: 0x0449, 0xaae: 0x0451, 0xaaf: 0x0459,
+	0xab0: 0x0461, 0xab1: 0x0469, 0xab2: 0x0471, 0xab3: 0x0479, 0xab4: 0x0481, 0xab5: 0x0489,
+	0xab6: 0x0491, 0xab7: 0x0499, 0xab8: 0x0615, 0xab9: 0x04a1, 0xaba: 0x04a9, 0xabb: 0x04b1,
+	0xabc: 0x04b9, 0xabd: 0x04c1, 0xabe: 0x04c9, 0xabf: 0x04d1,
+	// Block 0x2b, offset 0xac0
+	0xac0: 0xe00d, 0xac1: 0x0008, 0xac2: 0xe00d, 0xac3: 0x0008, 0xac4: 0xe00d, 0xac5: 0x0008,
+	0xac6: 0xe00d, 0xac7: 0x0008, 0xac8: 0xe00d, 0xac9: 0x0008, 0xaca: 0xe00d, 0xacb: 0x0008,
+	0xacc: 0xe00d, 0xacd: 0x0008, 0xace: 0xe00d, 0xacf: 0x0008, 0xad0: 0xe00d, 0xad1: 0x0008,
+	0xad2: 0xe00d, 0xad3: 0x0008, 0xad4: 0xe00d, 0xad5: 0x0008, 0xad6: 0xe00d, 0xad7: 0x0008,
+	0xad8: 0xe00d, 0xad9: 0x0008, 0xada: 0xe00d, 0xadb: 0x0008, 0xadc: 0xe00d, 0xadd: 0x0008,
+	0xade: 0xe00d, 0xadf: 0x0008, 0xae0: 0xe00d, 0xae1: 0x0008, 0xae2: 0xe00d, 0xae3: 0x0008,
+	0xae4: 0xe00d, 0xae5: 0x0008, 0xae6: 0xe00d, 0xae7: 0x0008, 0xae8: 0xe00d, 0xae9: 0x0008,
+	0xaea: 0xe00d, 0xaeb: 0x0008, 0xaec: 0xe00d, 0xaed: 0x0008, 0xaee: 0xe00d, 0xaef: 0x0008,
+	0xaf0: 0xe00d, 0xaf1: 0x0008, 0xaf2: 0xe00d, 0xaf3: 0x0008, 0xaf4: 0xe00d, 0xaf5: 0x0008,
+	0xaf6: 0xe00d, 0xaf7: 0x0008, 0xaf8: 0xe00d, 0xaf9: 0x0008, 0xafa: 0xe00d, 0xafb: 0x0008,
+	0xafc: 0xe00d, 0xafd: 0x0008, 0xafe: 0xe00d, 0xaff: 0x0008,
+	// Block 0x2c, offset 0xb00
+	0xb00: 0xe00d, 0xb01: 0x0008, 0xb02: 0xe00d, 0xb03: 0x0008, 0xb04: 0xe00d, 0xb05: 0x0008,
+	0xb06: 0xe00d, 0xb07: 0x0008, 0xb08: 0xe00d, 0xb09: 0x0008, 0xb0a: 0xe00d, 0xb0b: 0x0008,
+	0xb0c: 0xe00d, 0xb0d: 0x0008, 0xb0e: 0xe00d, 0xb0f: 0x0008, 0xb10: 0xe00d, 0xb11: 0x0008,
+	0xb12: 0xe00d, 0xb13: 0x0008, 0xb14: 0xe00d, 0xb15: 0x0008, 0xb16: 0x0008, 0xb17: 0x0008,
+	0xb18: 0x0008, 0xb19: 0x0008, 0xb1a: 0x062d, 0xb1b: 0x064d, 0xb1c: 0x0008, 0xb1d: 0x0008,
+	0xb1e: 0x04d9, 0xb1f: 0x0008, 0xb20: 0xe00d, 0xb21: 0x0008, 0xb22: 0xe00d, 0xb23: 0x0008,
+	0xb24: 0xe00d, 0xb25: 0x0008, 0xb26: 0xe00d, 0xb27: 0x0008, 0xb28: 0xe00d, 0xb29: 0x0008,
+	0xb2a: 0xe00d, 0xb2b: 0x0008, 0xb2c: 0xe00d, 0xb2d: 0x0008, 0xb2e: 0xe00d, 0xb2f: 0x0008,
+	0xb30: 0xe00d, 0xb31: 0x0008, 0xb32: 0xe00d, 0xb33: 0x0008, 0xb34: 0xe00d, 0xb35: 0x0008,
+	0xb36: 0xe00d, 0xb37: 0x0008, 0xb38: 0xe00d, 0xb39: 0x0008, 0xb3a: 0xe00d, 0xb3b: 0x0008,
+	0xb3c: 0xe00d, 0xb3d: 0x0008, 0xb3e: 0xe00d, 0xb3f: 0x0008,
+	// Block 0x2d, offset 0xb40
+	0xb40: 0x0008, 0xb41: 0x0008, 0xb42: 0x0008, 0xb43: 0x0008, 0xb44: 0x0008, 0xb45: 0x0008,
+	0xb46: 0x0040, 0xb47: 0x0040, 0xb48: 0xe045, 0xb49: 0xe045, 0xb4a: 0xe045, 0xb4b: 0xe045,
+	0xb4c: 0xe045, 0xb4d: 0xe045, 0xb4e: 0x0040, 0xb4f: 0x0040, 0xb50: 0x0008, 0xb51: 0x0008,
+	0xb52: 0x0008, 0xb53: 0x0008, 0xb54: 0x0008, 0xb55: 0x0008, 0xb56: 0x0008, 0xb57: 0x0008,
+	0xb58: 0x0040, 0xb59: 0xe045, 0xb5a: 0x0040, 0xb5b: 0xe045, 0xb5c: 0x0040, 0xb5d: 0xe045,
+	0xb5e: 0x0040, 0xb5f: 0xe045, 0xb60: 0x0008, 0xb61: 0x0008, 0xb62: 0x0008, 0xb63: 0x0008,
+	0xb64: 0x0008, 0xb65: 0x0008, 0xb66: 0x0008, 0xb67: 0x0008, 0xb68: 0xe045, 0xb69: 0xe045,
+	0xb6a: 0xe045, 0xb6b: 0xe045, 0xb6c: 0xe045, 0xb6d: 0xe045, 0xb6e: 0xe045, 0xb6f: 0xe045,
+	0xb70: 0x0008, 0xb71: 0x04e1, 0xb72: 0x0008, 0xb73: 0x04e9, 0xb74: 0x0008, 0xb75: 0x04f1,
+	0xb76: 0x0008, 0xb77: 0x04f9, 0xb78: 0x0008, 0xb79: 0x0501, 0xb7a: 0x0008, 0xb7b: 0x0509,
+	0xb7c: 0x0008, 0xb7d: 0x0511, 0xb7e: 0x0040, 0xb7f: 0x0040,
+	// Block 0x2e, offset 0xb80
+	0xb80: 0x0519, 0xb81: 0x0521, 0xb82: 0x0529, 0xb83: 0x0531, 0xb84: 0x0539, 0xb85: 0x0541,
+	0xb86: 0x0549, 0xb87: 0x0551, 0xb88: 0x0519, 0xb89: 0x0521, 0xb8a: 0x0529, 0xb8b: 0x0531,
+	0xb8c: 0x0539, 0xb8d: 0x0541, 0xb8e: 0x0549, 0xb8f: 0x0551, 0xb90: 0x0559, 0xb91: 0x0561,
+	0xb92: 0x0569, 0xb93: 0x0571, 0xb94: 0x0579, 0xb95: 0x0581, 0xb96: 0x0589, 0xb97: 0x0591,
+	0xb98: 0x0559, 0xb99: 0x0561, 0xb9a: 0x0569, 0xb9b: 0x0571, 0xb9c: 0x0579, 0xb9d: 0x0581,
+	0xb9e: 0x0589, 0xb9f: 0x0591, 0xba0: 0x0599, 0xba1: 0x05a1, 0xba2: 0x05a9, 0xba3: 0x05b1,
+	0xba4: 0x05b9, 0xba5: 0x05c1, 0xba6: 0x05c9, 0xba7: 0x05d1, 0xba8: 0x0599, 0xba9: 0x05a1,
+	0xbaa: 0x05a9, 0xbab: 0x05b1, 0xbac: 0x05b9, 0xbad: 0x05c1, 0xbae: 0x05c9, 0xbaf: 0x05d1,
+	0xbb0: 0x0008, 0xbb1: 0x0008, 0xbb2: 0x05d9, 0xbb3: 0x05e1, 0xbb4: 0x05e9, 0xbb5: 0x0040,
+	0xbb6: 0x0008, 0xbb7: 0x05f1, 0xbb8: 0xe045, 0xbb9: 0xe045, 0xbba: 0x0665, 0xbbb: 0x04e1,
+	0xbbc: 0x05e1, 0xbbd: 0x067e, 0xbbe: 0x05f9, 0xbbf: 0x069e,
+	// Block 0x2f, offset 0xbc0
+	0xbc0: 0x06be, 0xbc1: 0x0602, 0xbc2: 0x0609, 0xbc3: 0x0611, 0xbc4: 0x0619, 0xbc5: 0x0040,
+	0xbc6: 0x0008, 0xbc7: 0x0621, 0xbc8: 0x06dd, 0xbc9: 0x04e9, 0xbca: 0x06f5, 0xbcb: 0x04f1,
+	0xbcc: 0x0611, 0xbcd: 0x062a, 0xbce: 0x0632, 0xbcf: 0x063a, 0xbd0: 0x0008, 0xbd1: 0x0008,
+	0xbd2: 0x0008, 0xbd3: 0x0641, 0xbd4: 0x0040, 0xbd5: 0x0040, 0xbd6: 0x0008, 0xbd7: 0x0008,
+	0xbd8: 0xe045, 0xbd9: 0xe045, 0xbda: 0x070d, 0xbdb: 0x04f9, 0xbdc: 0x0040, 0xbdd: 0x064a,
+	0xbde: 0x0652, 0xbdf: 0x065a, 0xbe0: 0x0008, 0xbe1: 0x0008, 0xbe2: 0x0008, 0xbe3: 0x0661,
+	0xbe4: 0x0008, 0xbe5: 0x0008, 0xbe6: 0x0008, 0xbe7: 0x0008, 0xbe8: 0xe045, 0xbe9: 0xe045,
+	0xbea: 0x0725, 0xbeb: 0x0509, 0xbec: 0xe04d, 0xbed: 0x066a, 0xbee: 0x012a, 0xbef: 0x0672,
+	0xbf0: 0x0040, 0xbf1: 0x0040, 0xbf2: 0x0679, 0xbf3: 0x0681, 0xbf4: 0x0689, 0xbf5: 0x0040,
+	0xbf6: 0x0008, 0xbf7: 0x0691, 0xbf8: 0x073d, 0xbf9: 0x0501, 0xbfa: 0x0515, 0xbfb: 0x0511,
+	0xbfc: 0x0681, 0xbfd: 0x0756, 0xbfe: 0x0776, 0xbff: 0x0040,
+	// Block 0x30, offset 0xc00
+	0xc00: 0x000a, 0xc01: 0x000a, 0xc02: 0x000a, 0xc03: 0x000a, 0xc04: 0x000a, 0xc05: 0x000a,
+	0xc06: 0x000a, 0xc07: 0x000a, 0xc08: 0x000a, 0xc09: 0x000a, 0xc0a: 0x000a, 0xc0b: 0x03c0,
+	0xc0c: 0x0003, 0xc0d: 0x0003, 0xc0e: 0x0340, 0xc0f: 0x0b40, 0xc10: 0x0018, 0xc11: 0xe00d,
+	0xc12: 0x0018, 0xc13: 0x0018, 0xc14: 0x0018, 0xc15: 0x0018, 0xc16: 0x0018, 0xc17: 0x0796,
+	0xc18: 0x0018, 0xc19: 0x0018, 0xc1a: 0x0018, 0xc1b: 0x0018, 0xc1c: 0x0018, 0xc1d: 0x0018,
+	0xc1e: 0x0018, 0xc1f: 0x0018, 0xc20: 0x0018, 0xc21: 0x0018, 0xc22: 0x0018, 0xc23: 0x0018,
+	0xc24: 0x0040, 0xc25: 0x0040, 0xc26: 0x0040, 0xc27: 0x0018, 0xc28: 0x0040, 0xc29: 0x0040,
+	0xc2a: 0x0340, 0xc2b: 0x0340, 0xc2c: 0x0340, 0xc2d: 0x0340, 0xc2e: 0x0340, 0xc2f: 0x000a,
+	0xc30: 0x0018, 0xc31: 0x0018, 0xc32: 0x0018, 0xc33: 0x0699, 0xc34: 0x06a1, 0xc35: 0x0018,
+	0xc36: 0x06a9, 0xc37: 0x06b1, 0xc38: 0x0018, 0xc39: 0x0018, 0xc3a: 0x0018, 0xc3b: 0x0018,
+	0xc3c: 0x06ba, 0xc3d: 0x0018, 0xc3e: 0x07b6, 0xc3f: 0x0018,
+	// Block 0x31, offset 0xc40
+	0xc40: 0x0018, 0xc41: 0x0018, 0xc42: 0x0018, 0xc43: 0x0018, 0xc44: 0x0018, 0xc45: 0x0018,
+	0xc46: 0x0018, 0xc47: 0x06c2, 0xc48: 0x06ca, 0xc49: 0x06d2, 0xc4a: 0x0018, 0xc4b: 0x0018,
+	0xc4c: 0x0018, 0xc4d: 0x0018, 0xc4e: 0x0018, 0xc4f: 0x0018, 0xc50: 0x0018, 0xc51: 0x0018,
+	0xc52: 0x0018, 0xc53: 0x0018, 0xc54: 0x0018, 0xc55: 0x0018, 0xc56: 0x0018, 0xc57: 0x06d9,
+	0xc58: 0x0018, 0xc59: 0x0018, 0xc5a: 0x0018, 0xc5b: 0x0018, 0xc5c: 0x0018, 0xc5d: 0x0018,
+	0xc5e: 0x0018, 0xc5f: 0x000a, 0xc60: 0x03c0, 0xc61: 0x0340, 0xc62: 0x0340, 0xc63: 0x0340,
+	0xc64: 0x03c0, 0xc65: 0x0040, 0xc66: 0x0040, 0xc67: 0x0040, 0xc68: 0x0040, 0xc69: 0x0040,
+	0xc6a: 0x0340, 0xc6b: 0x0340, 0xc6c: 0x0340, 0xc6d: 0x0340, 0xc6e: 0x0340, 0xc6f: 0x0340,
+	0xc70: 0x06e1, 0xc71: 0x0311, 0xc72: 0x0040, 0xc73: 0x0040, 0xc74: 0x06e9, 0xc75: 0x06f1,
+	0xc76: 0x06f9, 0xc77: 0x0701, 0xc78: 0x0709, 0xc79: 0x0711, 0xc7a: 0x071a, 0xc7b: 0x07d5,
+	0xc7c: 0x0722, 0xc7d: 0x072a, 0xc7e: 0x0732, 0xc7f: 0x0329,
+	// Block 0x32, offset 0xc80
+	0xc80: 0x06e1, 0xc81: 0x0049, 0xc82: 0x0029, 0xc83: 0x0031, 0xc84: 0x06e9, 0xc85: 0x06f1,
+	0xc86: 0x06f9, 0xc87: 0x0701, 0xc88: 0x0709, 0xc89: 0x0711, 0xc8a: 0x071a, 0xc8b: 0x07ed,
+	0xc8c: 0x0722, 0xc8d: 0x072a, 0xc8e: 0x0732, 0xc8f: 0x0040, 0xc90: 0x0019, 0xc91: 0x02f9,
+	0xc92: 0x0051, 0xc93: 0x0109, 0xc94: 0x0361, 0xc95: 0x00a9, 0xc96: 0x0319, 0xc97: 0x0101,
+	0xc98: 0x0321, 0xc99: 0x0329, 0xc9a: 0x0339, 0xc9b: 0x0089, 0xc9c: 0x0341, 0xc9d: 0x0040,
+	0xc9e: 0x0040, 0xc9f: 0x0040, 0xca0: 0x0018, 0xca1: 0x0018, 0xca2: 0x0018, 0xca3: 0x0018,
+	0xca4: 0x0018, 0xca5: 0x0018, 0xca6: 0x0018, 0xca7: 0x0018, 0xca8: 0x0739, 0xca9: 0x0018,
+	0xcaa: 0x0018, 0xcab: 0x0018, 0xcac: 0x0018, 0xcad: 0x0018, 0xcae: 0x0018, 0xcaf: 0x0018,
+	0xcb0: 0x0018, 0xcb1: 0x0018, 0xcb2: 0x0018, 0xcb3: 0x0018, 0xcb4: 0x0018, 0xcb5: 0x0018,
+	0xcb6: 0x0018, 0xcb7: 0x0018, 0xcb8: 0x0018, 0xcb9: 0x0018, 0xcba: 0x0018, 0xcbb: 0x0018,
+	0xcbc: 0x0018, 0xcbd: 0x0018, 0xcbe: 0x0018, 0xcbf: 0x0018,
+	// Block 0x33, offset 0xcc0
+	0xcc0: 0x0806, 0xcc1: 0x0826, 0xcc2: 0x03d9, 0xcc3: 0x0845, 0xcc4: 0x0018, 0xcc5: 0x0866,
+	0xcc6: 0x0886, 0xcc7: 0x0369, 0xcc8: 0x0018, 0xcc9: 0x08a5, 0xcca: 0x0309, 0xccb: 0x00a9,
+	0xccc: 0x00a9, 0xccd: 0x00a9, 0xcce: 0x00a9, 0xccf: 0x0741, 0xcd0: 0x0311, 0xcd1: 0x0311,
+	0xcd2: 0x0101, 0xcd3: 0x0101, 0xcd4: 0x0018, 0xcd5: 0x0329, 0xcd6: 0x0749, 0xcd7: 0x0018,
+	0xcd8: 0x0018, 0xcd9: 0x0339, 0xcda: 0x0751, 0xcdb: 0x00b9, 0xcdc: 0x00b9, 0xcdd: 0x00b9,
+	0xcde: 0x0018, 0xcdf: 0x0018, 0xce0: 0x0759, 0xce1: 0x08c5, 0xce2: 0x0761, 0xce3: 0x0018,
+	0xce4: 0x04b1, 0xce5: 0x0018, 0xce6: 0x0769, 0xce7: 0x0018, 0xce8: 0x04b1, 0xce9: 0x0018,
+	0xcea: 0x0319, 0xceb: 0x0771, 0xcec: 0x02e9, 0xced: 0x03d9, 0xcee: 0x0018, 0xcef: 0x02f9,
+	0xcf0: 0x02f9, 0xcf1: 0x03f1, 0xcf2: 0x0040, 0xcf3: 0x0321, 0xcf4: 0x0051, 0xcf5: 0x0779,
+	0xcf6: 0x0781, 0xcf7: 0x0789, 0xcf8: 0x0791, 0xcf9: 0x0311, 0xcfa: 0x0018, 0xcfb: 0x08e5,
+	0xcfc: 0x0799, 0xcfd: 0x03a1, 0xcfe: 0x03a1, 0xcff: 0x0799,
+	// Block 0x34, offset 0xd00
+	0xd00: 0x0905, 0xd01: 0x0018, 0xd02: 0x0018, 0xd03: 0x0018, 0xd04: 0x0018, 0xd05: 0x02f1,
+	0xd06: 0x02f1, 0xd07: 0x02f9, 0xd08: 0x0311, 0xd09: 0x00b1, 0xd0a: 0x0018, 0xd0b: 0x0018,
+	0xd0c: 0x0018, 0xd0d: 0x0018, 0xd0e: 0x0008, 0xd0f: 0x0018, 0xd10: 0x07a1, 0xd11: 0x07a9,
+	0xd12: 0x07b1, 0xd13: 0x07b9, 0xd14: 0x07c1, 0xd15: 0x07c9, 0xd16: 0x07d1, 0xd17: 0x07d9,
+	0xd18: 0x07e1, 0xd19: 0x07e9, 0xd1a: 0x07f1, 0xd1b: 0x07f9, 0xd1c: 0x0801, 0xd1d: 0x0809,
+	0xd1e: 0x0811, 0xd1f: 0x0819, 0xd20: 0x0311, 0xd21: 0x0821, 0xd22: 0x091d, 0xd23: 0x0829,
+	0xd24: 0x0391, 0xd25: 0x0831, 0xd26: 0x093d, 0xd27: 0x0839, 0xd28: 0x0841, 0xd29: 0x0109,
+	0xd2a: 0x0849, 0xd2b: 0x095d, 0xd2c: 0x0101, 0xd2d: 0x03d9, 0xd2e: 0x02f1, 0xd2f: 0x0321,
+	0xd30: 0x0311, 0xd31: 0x0821, 0xd32: 0x097d, 0xd33: 0x0829, 0xd34: 0x0391, 0xd35: 0x0831,
+	0xd36: 0x099d, 0xd37: 0x0839, 0xd38: 0x0841, 0xd39: 0x0109, 0xd3a: 0x0849, 0xd3b: 0x09bd,
+	0xd3c: 0x0101, 0xd3d: 0x03d9, 0xd3e: 0x02f1, 0xd3f: 0x0321,
+	// Block 0x35, offset 0xd40
+	0xd40: 0x0018, 0xd41: 0x0018, 0xd42: 0x0018, 0xd43: 0x0018, 0xd44: 0x0018, 0xd45: 0x0018,
+	0xd46: 0x0018, 0xd47: 0x0018, 0xd48: 0x0018, 0xd49: 0x0018, 0xd4a: 0x0018, 0xd4b: 0x0040,
+	0xd4c: 0x0040, 0xd4d: 0x0040, 0xd4e: 0x0040, 0xd4f: 0x0040, 0xd50: 0x0040, 0xd51: 0x0040,
+	0xd52: 0x0040, 0xd53: 0x0040, 0xd54: 0x0040, 0xd55: 0x0040, 0xd56: 0x0040, 0xd57: 0x0040,
+	0xd58: 0x0040, 0xd59: 0x0040, 0xd5a: 0x0040, 0xd5b: 0x0040, 0xd5c: 0x0040, 0xd5d: 0x0040,
+	0xd5e: 0x0040, 0xd5f: 0x0040, 0xd60: 0x0049, 0xd61: 0x0029, 0xd62: 0x0031, 0xd63: 0x06e9,
+	0xd64: 0x06f1, 0xd65: 0x06f9, 0xd66: 0x0701, 0xd67: 0x0709, 0xd68: 0x0711, 0xd69: 0x0879,
+	0xd6a: 0x0881, 0xd6b: 0x0889, 0xd6c: 0x0891, 0xd6d: 0x0899, 0xd6e: 0x08a1, 0xd6f: 0x08a9,
+	0xd70: 0x08b1, 0xd71: 0x08b9, 0xd72: 0x08c1, 0xd73: 0x08c9, 0xd74: 0x0a1e, 0xd75: 0x0a3e,
+	0xd76: 0x0a5e, 0xd77: 0x0a7e, 0xd78: 0x0a9e, 0xd79: 0x0abe, 0xd7a: 0x0ade, 0xd7b: 0x0afe,
+	0xd7c: 0x0b1e, 0xd7d: 0x08d2, 0xd7e: 0x08da, 0xd7f: 0x08e2,
+	// Block 0x36, offset 0xd80
+	0xd80: 0x08ea, 0xd81: 0x08f2, 0xd82: 0x08fa, 0xd83: 0x0902, 0xd84: 0x090a, 0xd85: 0x0912,
+	0xd86: 0x091a, 0xd87: 0x0922, 0xd88: 0x0040, 0xd89: 0x0040, 0xd8a: 0x0040, 0xd8b: 0x0040,
+	0xd8c: 0x0040, 0xd8d: 0x0040, 0xd8e: 0x0040, 0xd8f: 0x0040, 0xd90: 0x0040, 0xd91: 0x0040,
+	0xd92: 0x0040, 0xd93: 0x0040, 0xd94: 0x0040, 0xd95: 0x0040, 0xd96: 0x0040, 0xd97: 0x0040,
+	0xd98: 0x0040, 0xd99: 0x0040, 0xd9a: 0x0040, 0xd9b: 0x0040, 0xd9c: 0x0b3e, 0xd9d: 0x0b5e,
+	0xd9e: 0x0b7e, 0xd9f: 0x0b9e, 0xda0: 0x0bbe, 0xda1: 0x0bde, 0xda2: 0x0bfe, 0xda3: 0x0c1e,
+	0xda4: 0x0c3e, 0xda5: 0x0c5e, 0xda6: 0x0c7e, 0xda7: 0x0c9e, 0xda8: 0x0cbe, 0xda9: 0x0cde,
+	0xdaa: 0x0cfe, 0xdab: 0x0d1e, 0xdac: 0x0d3e, 0xdad: 0x0d5e, 0xdae: 0x0d7e, 0xdaf: 0x0d9e,
+	0xdb0: 0x0dbe, 0xdb1: 0x0dde, 0xdb2: 0x0dfe, 0xdb3: 0x0e1e, 0xdb4: 0x0e3e, 0xdb5: 0x0e5e,
+	0xdb6: 0x0019, 0xdb7: 0x02e9, 0xdb8: 0x03d9, 0xdb9: 0x02f1, 0xdba: 0x02f9, 0xdbb: 0x03f1,
+	0xdbc: 0x0309, 0xdbd: 0x00a9, 0xdbe: 0x0311, 0xdbf: 0x00b1,
+	// Block 0x37, offset 0xdc0
+	0xdc0: 0x0319, 0xdc1: 0x0101, 0xdc2: 0x0321, 0xdc3: 0x0329, 0xdc4: 0x0051, 0xdc5: 0x0339,
+	0xdc6: 0x0751, 0xdc7: 0x00b9, 0xdc8: 0x0089, 0xdc9: 0x0341, 0xdca: 0x0349, 0xdcb: 0x0391,
+	0xdcc: 0x00c1, 0xdcd: 0x0109, 0xdce: 0x00c9, 0xdcf: 0x04b1, 0xdd0: 0x0019, 0xdd1: 0x02e9,
+	0xdd2: 0x03d9, 0xdd3: 0x02f1, 0xdd4: 0x02f9, 0xdd5: 0x03f1, 0xdd6: 0x0309, 0xdd7: 0x00a9,
+	0xdd8: 0x0311, 0xdd9: 0x00b1, 0xdda: 0x0319, 0xddb: 0x0101, 0xddc: 0x0321, 0xddd: 0x0329,
+	0xdde: 0x0051, 0xddf: 0x0339, 0xde0: 0x0751, 0xde1: 0x00b9, 0xde2: 0x0089, 0xde3: 0x0341,
+	0xde4: 0x0349, 0xde5: 0x0391, 0xde6: 0x00c1, 0xde7: 0x0109, 0xde8: 0x00c9, 0xde9: 0x04b1,
+	0xdea: 0x06e1, 0xdeb: 0x0018, 0xdec: 0x0018, 0xded: 0x0018, 0xdee: 0x0018, 0xdef: 0x0018,
+	0xdf0: 0x0018, 0xdf1: 0x0018, 0xdf2: 0x0018, 0xdf3: 0x0018, 0xdf4: 0x0018, 0xdf5: 0x0018,
+	0xdf6: 0x0018, 0xdf7: 0x0018, 0xdf8: 0x0018, 0xdf9: 0x0018, 0xdfa: 0x0018, 0xdfb: 0x0018,
+	0xdfc: 0x0018, 0xdfd: 0x0018, 0xdfe: 0x0018, 0xdff: 0x0018,
+	// Block 0x38, offset 0xe00
+	0xe00: 0x0008, 0xe01: 0x0008, 0xe02: 0x0008, 0xe03: 0x0008, 0xe04: 0x0008, 0xe05: 0x0008,
+	0xe06: 0x0008, 0xe07: 0x0008, 0xe08: 0x0008, 0xe09: 0x0008, 0xe0a: 0x0008, 0xe0b: 0x0008,
+	0xe0c: 0x0008, 0xe0d: 0x0008, 0xe0e: 0x0008, 0xe0f: 0x0008, 0xe10: 0x0008, 0xe11: 0x0008,
+	0xe12: 0x0008, 0xe13: 0x0008, 0xe14: 0x0008, 0xe15: 0x0008, 0xe16: 0x0008, 0xe17: 0x0008,
+	0xe18: 0x0008, 0xe19: 0x0008, 0xe1a: 0x0008, 0xe1b: 0x0008, 0xe1c: 0x0008, 0xe1d: 0x0008,
+	0xe1e: 0x0008, 0xe1f: 0x0008, 0xe20: 0xe00d, 0xe21: 0x0008, 0xe22: 0x0941, 0xe23: 0x0ed5,
+	0xe24: 0x0949, 0xe25: 0x0008, 0xe26: 0x0008, 0xe27: 0xe07d, 0xe28: 0x0008, 0xe29: 0xe01d,
+	0xe2a: 0x0008, 0xe2b: 0xe03d, 0xe2c: 0x0008, 0xe2d: 0x0359, 0xe2e: 0x0441, 0xe2f: 0x0351,
+	0xe30: 0x03d1, 0xe31: 0x0008, 0xe32: 0xe00d, 0xe33: 0x0008, 0xe34: 0x0008, 0xe35: 0xe01d,
+	0xe36: 0x0008, 0xe37: 0x0008, 0xe38: 0x0008, 0xe39: 0x0008, 0xe3a: 0x0008, 0xe3b: 0x0008,
+	0xe3c: 0x00b1, 0xe3d: 0x0391, 0xe3e: 0x0951, 0xe3f: 0x0959,
+	// Block 0x39, offset 0xe40
+	0xe40: 0xe00d, 0xe41: 0x0008, 0xe42: 0xe00d, 0xe43: 0x0008, 0xe44: 0xe00d, 0xe45: 0x0008,
+	0xe46: 0xe00d, 0xe47: 0x0008, 0xe48: 0xe00d, 0xe49: 0x0008, 0xe4a: 0xe00d, 0xe4b: 0x0008,
+	0xe4c: 0xe00d, 0xe4d: 0x0008, 0xe4e: 0xe00d, 0xe4f: 0x0008, 0xe50: 0xe00d, 0xe51: 0x0008,
+	0xe52: 0xe00d, 0xe53: 0x0008, 0xe54: 0xe00d, 0xe55: 0x0008, 0xe56: 0xe00d, 0xe57: 0x0008,
+	0xe58: 0xe00d, 0xe59: 0x0008, 0xe5a: 0xe00d, 0xe5b: 0x0008, 0xe5c: 0xe00d, 0xe5d: 0x0008,
+	0xe5e: 0xe00d, 0xe5f: 0x0008, 0xe60: 0xe00d, 0xe61: 0x0008, 0xe62: 0xe00d, 0xe63: 0x0008,
+	0xe64: 0x0008, 0xe65: 0x0018, 0xe66: 0x0018, 0xe67: 0x0018, 0xe68: 0x0018, 0xe69: 0x0018,
+	0xe6a: 0x0018, 0xe6b: 0xe03d, 0xe6c: 0x0008, 0xe6d: 0xe01d, 0xe6e: 0x0008, 0xe6f: 0x3308,
+	0xe70: 0x3308, 0xe71: 0x3308, 0xe72: 0xe00d, 0xe73: 0x0008, 0xe74: 0x0040, 0xe75: 0x0040,
+	0xe76: 0x0040, 0xe77: 0x0040, 0xe78: 0x0040, 0xe79: 0x0018, 0xe7a: 0x0018, 0xe7b: 0x0018,
+	0xe7c: 0x0018, 0xe7d: 0x0018, 0xe7e: 0x0018, 0xe7f: 0x0018,
+	// Block 0x3a, offset 0xe80
+	0xe80: 0x2715, 0xe81: 0x2735, 0xe82: 0x2755, 0xe83: 0x2775, 0xe84: 0x2795, 0xe85: 0x27b5,
+	0xe86: 0x27d5, 0xe87: 0x27f5, 0xe88: 0x2815, 0xe89: 0x2835, 0xe8a: 0x2855, 0xe8b: 0x2875,
+	0xe8c: 0x2895, 0xe8d: 0x28b5, 0xe8e: 0x28d5, 0xe8f: 0x28f5, 0xe90: 0x2915, 0xe91: 0x2935,
+	0xe92: 0x2955, 0xe93: 0x2975, 0xe94: 0x2995, 0xe95: 0x29b5, 0xe96: 0x0040, 0xe97: 0x0040,
+	0xe98: 0x0040, 0xe99: 0x0040, 0xe9a: 0x0040, 0xe9b: 0x0040, 0xe9c: 0x0040, 0xe9d: 0x0040,
+	0xe9e: 0x0040, 0xe9f: 0x0040, 0xea0: 0x0040, 0xea1: 0x0040, 0xea2: 0x0040, 0xea3: 0x0040,
+	0xea4: 0x0040, 0xea5: 0x0040, 0xea6: 0x0040, 0xea7: 0x0040, 0xea8: 0x0040, 0xea9: 0x0040,
+	0xeaa: 0x0040, 0xeab: 0x0040, 0xeac: 0x0040, 0xead: 0x0040, 0xeae: 0x0040, 0xeaf: 0x0040,
+	0xeb0: 0x0040, 0xeb1: 0x0040, 0xeb2: 0x0040, 0xeb3: 0x0040, 0xeb4: 0x0040, 0xeb5: 0x0040,
+	0xeb6: 0x0040, 0xeb7: 0x0040, 0xeb8: 0x0040, 0xeb9: 0x0040, 0xeba: 0x0040, 0xebb: 0x0040,
+	0xebc: 0x0040, 0xebd: 0x0040, 0xebe: 0x0040, 0xebf: 0x0040,
+	// Block 0x3b, offset 0xec0
+	0xec0: 0x000a, 0xec1: 0x0018, 0xec2: 0x0961, 0xec3: 0x0018, 0xec4: 0x0018, 0xec5: 0x0008,
+	0xec6: 0x0008, 0xec7: 0x0008, 0xec8: 0x0018, 0xec9: 0x0018, 0xeca: 0x0018, 0xecb: 0x0018,
+	0xecc: 0x0018, 0xecd: 0x0018, 0xece: 0x0018, 0xecf: 0x0018, 0xed0: 0x0018, 0xed1: 0x0018,
+	0xed2: 0x0018, 0xed3: 0x0018, 0xed4: 0x0018, 0xed5: 0x0018, 0xed6: 0x0018, 0xed7: 0x0018,
+	0xed8: 0x0018, 0xed9: 0x0018, 0xeda: 0x0018, 0xedb: 0x0018, 0xedc: 0x0018, 0xedd: 0x0018,
+	0xede: 0x0018, 0xedf: 0x0018, 0xee0: 0x0018, 0xee1: 0x0018, 0xee2: 0x0018, 0xee3: 0x0018,
+	0xee4: 0x0018, 0xee5: 0x0018, 0xee6: 0x0018, 0xee7: 0x0018, 0xee8: 0x0018, 0xee9: 0x0018,
+	0xeea: 0x3308, 0xeeb: 0x3308, 0xeec: 0x3308, 0xeed: 0x3308, 0xeee: 0x3018, 0xeef: 0x3018,
+	0xef0: 0x0018, 0xef1: 0x0018, 0xef2: 0x0018, 0xef3: 0x0018, 0xef4: 0x0018, 0xef5: 0x0018,
+	0xef6: 0xe125, 0xef7: 0x0018, 0xef8: 0x29d5, 0xef9: 0x29f5, 0xefa: 0x2a15, 0xefb: 0x0018,
+	0xefc: 0x0008, 0xefd: 0x0018, 0xefe: 0x0018, 0xeff: 0x0018,
+	// Block 0x3c, offset 0xf00
+	0xf00: 0x2b55, 0xf01: 0x2b75, 0xf02: 0x2b95, 0xf03: 0x2bb5, 0xf04: 0x2bd5, 0xf05: 0x2bf5,
+	0xf06: 0x2bf5, 0xf07: 0x2bf5, 0xf08: 0x2c15, 0xf09: 0x2c15, 0xf0a: 0x2c15, 0xf0b: 0x2c15,
+	0xf0c: 0x2c35, 0xf0d: 0x2c35, 0xf0e: 0x2c35, 0xf0f: 0x2c55, 0xf10: 0x2c75, 0xf11: 0x2c75,
+	0xf12: 0x2a95, 0xf13: 0x2a95, 0xf14: 0x2c75, 0xf15: 0x2c75, 0xf16: 0x2c95, 0xf17: 0x2c95,
+	0xf18: 0x2c75, 0xf19: 0x2c75, 0xf1a: 0x2a95, 0xf1b: 0x2a95, 0xf1c: 0x2c75, 0xf1d: 0x2c75,
+	0xf1e: 0x2c55, 0xf1f: 0x2c55, 0xf20: 0x2cb5, 0xf21: 0x2cb5, 0xf22: 0x2cd5, 0xf23: 0x2cd5,
+	0xf24: 0x0040, 0xf25: 0x2cf5, 0xf26: 0x2d15, 0xf27: 0x2d35, 0xf28: 0x2d35, 0xf29: 0x2d55,
+	0xf2a: 0x2d75, 0xf2b: 0x2d95, 0xf2c: 0x2db5, 0xf2d: 0x2dd5, 0xf2e: 0x2df5, 0xf2f: 0x2e15,
+	0xf30: 0x2e35, 0xf31: 0x2e55, 0xf32: 0x2e55, 0xf33: 0x2e75, 0xf34: 0x2e95, 0xf35: 0x2e95,
+	0xf36: 0x2eb5, 0xf37: 0x2ed5, 0xf38: 0x2e75, 0xf39: 0x2ef5, 0xf3a: 0x2f15, 0xf3b: 0x2ef5,
+	0xf3c: 0x2e75, 0xf3d: 0x2f35, 0xf3e: 0x2f55, 0xf3f: 0x2f75,
+	// Block 0x3d, offset 0xf40
+	0xf40: 0x2f95, 0xf41: 0x2fb5, 0xf42: 0x2d15, 0xf43: 0x2cf5, 0xf44: 0x2fd5, 0xf45: 0x2ff5,
+	0xf46: 0x3015, 0xf47: 0x3035, 0xf48: 0x3055, 0xf49: 0x3075, 0xf4a: 0x3095, 0xf4b: 0x30b5,
+	0xf4c: 0x30d5, 0xf4d: 0x30f5, 0xf4e: 0x3115, 0xf4f: 0x0040, 0xf50: 0x0018, 0xf51: 0x0018,
+	0xf52: 0x3135, 0xf53: 0x3155, 0xf54: 0x3175, 0xf55: 0x3195, 0xf56: 0x31b5, 0xf57: 0x31d5,
+	0xf58: 0x31f5, 0xf59: 0x3215, 0xf5a: 0x3235, 0xf5b: 0x3255, 0xf5c: 0x3175, 0xf5d: 0x3275,
+	0xf5e: 0x3295, 0xf5f: 0x32b5, 0xf60: 0x0008, 0xf61: 0x0008, 0xf62: 0x0008, 0xf63: 0x0008,
+	0xf64: 0x0008, 0xf65: 0x0008, 0xf66: 0x0008, 0xf67: 0x0008, 0xf68: 0x0008, 0xf69: 0x0008,
+	0xf6a: 0x0008, 0xf6b: 0x0008, 0xf6c: 0x0008, 0xf6d: 0x0008, 0xf6e: 0x0008, 0xf6f: 0x0008,
+	0xf70: 0x0008, 0xf71: 0x0008, 0xf72: 0x0008, 0xf73: 0x0008, 0xf74: 0x0008, 0xf75: 0x0008,
+	0xf76: 0x0008, 0xf77: 0x0008, 0xf78: 0x0008, 0xf79: 0x0008, 0xf7a: 0x0008, 0xf7b: 0x0008,
+	0xf7c: 0x0008, 0xf7d: 0x0008, 0xf7e: 0x0008, 0xf7f: 0x0008,
+	// Block 0x3e, offset 0xf80
+	0xf80: 0x0b82, 0xf81: 0x0b8a, 0xf82: 0x0b92, 0xf83: 0x0b9a, 0xf84: 0x32d5, 0xf85: 0x32f5,
+	0xf86: 0x3315, 0xf87: 0x3335, 0xf88: 0x0018, 0xf89: 0x0018, 0xf8a: 0x0018, 0xf8b: 0x0018,
+	0xf8c: 0x0018, 0xf8d: 0x0018, 0xf8e: 0x0018, 0xf8f: 0x0018, 0xf90: 0x3355, 0xf91: 0x0ba1,
+	0xf92: 0x0ba9, 0xf93: 0x0bb1, 0xf94: 0x0bb9, 0xf95: 0x0bc1, 0xf96: 0x0bc9, 0xf97: 0x0bd1,
+	0xf98: 0x0bd9, 0xf99: 0x0be1, 0xf9a: 0x0be9, 0xf9b: 0x0bf1, 0xf9c: 0x0bf9, 0xf9d: 0x0c01,
+	0xf9e: 0x0c09, 0xf9f: 0x0c11, 0xfa0: 0x3375, 0xfa1: 0x3395, 0xfa2: 0x33b5, 0xfa3: 0x33d5,
+	0xfa4: 0x33f5, 0xfa5: 0x33f5, 0xfa6: 0x3415, 0xfa7: 0x3435, 0xfa8: 0x3455, 0xfa9: 0x3475,
+	0xfaa: 0x3495, 0xfab: 0x34b5, 0xfac: 0x34d5, 0xfad: 0x34f5, 0xfae: 0x3515, 0xfaf: 0x3535,
+	0xfb0: 0x3555, 0xfb1: 0x3575, 0xfb2: 0x3595, 0xfb3: 0x35b5, 0xfb4: 0x35d5, 0xfb5: 0x35f5,
+	0xfb6: 0x3615, 0xfb7: 0x3635, 0xfb8: 0x3655, 0xfb9: 0x3675, 0xfba: 0x3695, 0xfbb: 0x36b5,
+	0xfbc: 0x0c19, 0xfbd: 0x0c21, 0xfbe: 0x36d5, 0xfbf: 0x0018,
+	// Block 0x3f, offset 0xfc0
+	0xfc0: 0x36f5, 0xfc1: 0x3715, 0xfc2: 0x3735, 0xfc3: 0x3755, 0xfc4: 0x3775, 0xfc5: 0x3795,
+	0xfc6: 0x37b5, 0xfc7: 0x37d5, 0xfc8: 0x37f5, 0xfc9: 0x3815, 0xfca: 0x3835, 0xfcb: 0x3855,
+	0xfcc: 0x3875, 0xfcd: 0x3895, 0xfce: 0x38b5, 0xfcf: 0x38d5, 0xfd0: 0x38f5, 0xfd1: 0x3915,
+	0xfd2: 0x3935, 0xfd3: 0x3955, 0xfd4: 0x3975, 0xfd5: 0x3995, 0xfd6: 0x39b5, 0xfd7: 0x39d5,
+	0xfd8: 0x39f5, 0xfd9: 0x3a15, 0xfda: 0x3a35, 0xfdb: 0x3a55, 0xfdc: 0x3a75, 0xfdd: 0x3a95,
+	0xfde: 0x3ab5, 0xfdf: 0x3ad5, 0xfe0: 0x3af5, 0xfe1: 0x3b15, 0xfe2: 0x3b35, 0xfe3: 0x3b55,
+	0xfe4: 0x3b75, 0xfe5: 0x3b95, 0xfe6: 0x1295, 0xfe7: 0x3bb5, 0xfe8: 0x3bd5, 0xfe9: 0x3bf5,
+	0xfea: 0x3c15, 0xfeb: 0x3c35, 0xfec: 0x3c55, 0xfed: 0x3c75, 0xfee: 0x23b5, 0xfef: 0x3c95,
+	0xff0: 0x3cb5, 0xff1: 0x0c29, 0xff2: 0x0c31, 0xff3: 0x0c39, 0xff4: 0x0c41, 0xff5: 0x0c49,
+	0xff6: 0x0c51, 0xff7: 0x0c59, 0xff8: 0x0c61, 0xff9: 0x0c69, 0xffa: 0x0c71, 0xffb: 0x0c79,
+	0xffc: 0x0c81, 0xffd: 0x0c89, 0xffe: 0x0c91, 0xfff: 0x0c99,
+	// Block 0x40, offset 0x1000
+	0x1000: 0x0ca1, 0x1001: 0x0ca9, 0x1002: 0x0cb1, 0x1003: 0x0cb9, 0x1004: 0x0cc1, 0x1005: 0x0cc9,
+	0x1006: 0x0cd1, 0x1007: 0x0cd9, 0x1008: 0x0ce1, 0x1009: 0x0ce9, 0x100a: 0x0cf1, 0x100b: 0x0cf9,
+	0x100c: 0x0d01, 0x100d: 0x3cd5, 0x100e: 0x0d09, 0x100f: 0x3cf5, 0x1010: 0x3d15, 0x1011: 0x3d2d,
+	0x1012: 0x3d45, 0x1013: 0x3d5d, 0x1014: 0x3d75, 0x1015: 0x3d75, 0x1016: 0x3d5d, 0x1017: 0x3d8d,
+	0x1018: 0x07d5, 0x1019: 0x3da5, 0x101a: 0x3dbd, 0x101b: 0x3dd5, 0x101c: 0x3ded, 0x101d: 0x3e05,
+	0x101e: 0x3e1d, 0x101f: 0x3e35, 0x1020: 0x3e4d, 0x1021: 0x3e65, 0x1022: 0x3e7d, 0x1023: 0x3e95,
+	0x1024: 0x3ead, 0x1025: 0x3ead, 0x1026: 0x3ec5, 0x1027: 0x3ec5, 0x1028: 0x3edd, 0x1029: 0x3edd,
+	0x102a: 0x3ef5, 0x102b: 0x3f0d, 0x102c: 0x3f25, 0x102d: 0x3f3d, 0x102e: 0x3f55, 0x102f: 0x3f55,
+	0x1030: 0x3f6d, 0x1031: 0x3f6d, 0x1032: 0x3f6d, 0x1033: 0x3f85, 0x1034: 0x3f9d, 0x1035: 0x3fb5,
+	0x1036: 0x3fcd, 0x1037: 0x3fb5, 0x1038: 0x3fe5, 0x1039: 0x3ffd, 0x103a: 0x3f85, 0x103b: 0x4015,
+	0x103c: 0x402d, 0x103d: 0x402d, 0x103e: 0x402d, 0x103f: 0x0d11,
+	// Block 0x41, offset 0x1040
+	0x1040: 0x10f9, 0x1041: 0x1101, 0x1042: 0x40a5, 0x1043: 0x1109, 0x1044: 0x1111, 0x1045: 0x1119,
+	0x1046: 0x1121, 0x1047: 0x1129, 0x1048: 0x40c5, 0x1049: 0x1131, 0x104a: 0x1139, 0x104b: 0x1141,
+	0x104c: 0x40e5, 0x104d: 0x40e5, 0x104e: 0x1149, 0x104f: 0x1151, 0x1050: 0x1159, 0x1051: 0x4105,
+	0x1052: 0x4125, 0x1053: 0x4145, 0x1054: 0x4165, 0x1055: 0x4185, 0x1056: 0x1161, 0x1057: 0x1169,
+	0x1058: 0x1171, 0x1059: 0x1179, 0x105a: 0x1181, 0x105b: 0x41a5, 0x105c: 0x1189, 0x105d: 0x1191,
+	0x105e: 0x1199, 0x105f: 0x41c5, 0x1060: 0x41e5, 0x1061: 0x11a1, 0x1062: 0x4205, 0x1063: 0x4225,
+	0x1064: 0x4245, 0x1065: 0x11a9, 0x1066: 0x4265, 0x1067: 0x11b1, 0x1068: 0x11b9, 0x1069: 0x10f9,
+	0x106a: 0x4285, 0x106b: 0x42a5, 0x106c: 0x42c5, 0x106d: 0x42e5, 0x106e: 0x11c1, 0x106f: 0x11c9,
+	0x1070: 0x11d1, 0x1071: 0x11d9, 0x1072: 0x4305, 0x1073: 0x11e1, 0x1074: 0x11e9, 0x1075: 0x11f1,
+	0x1076: 0x4325, 0x1077: 0x11f9, 0x1078: 0x1201, 0x1079: 0x11f9, 0x107a: 0x1209, 0x107b: 0x1211,
+	0x107c: 0x4345, 0x107d: 0x1219, 0x107e: 0x1221, 0x107f: 0x1219,
+	// Block 0x42, offset 0x1080
+	0x1080: 0x4365, 0x1081: 0x4385, 0x1082: 0x0040, 0x1083: 0x1229, 0x1084: 0x1231, 0x1085: 0x1239,
+	0x1086: 0x1241, 0x1087: 0x0040, 0x1088: 0x1249, 0x1089: 0x1251, 0x108a: 0x1259, 0x108b: 0x1261,
+	0x108c: 0x1269, 0x108d: 0x1271, 0x108e: 0x1199, 0x108f: 0x1279, 0x1090: 0x1281, 0x1091: 0x1289,
+	0x1092: 0x43a5, 0x1093: 0x1291, 0x1094: 0x1121, 0x1095: 0x43c5, 0x1096: 0x43e5, 0x1097: 0x1299,
+	0x1098: 0x0040, 0x1099: 0x4405, 0x109a: 0x12a1, 0x109b: 0x12a9, 0x109c: 0x12b1, 0x109d: 0x12b9,
+	0x109e: 0x12c1, 0x109f: 0x12c9, 0x10a0: 0x12d1, 0x10a1: 0x12d9, 0x10a2: 0x12e1, 0x10a3: 0x12e9,
+	0x10a4: 0x12f1, 0x10a5: 0x12f9, 0x10a6: 0x1301, 0x10a7: 0x1309, 0x10a8: 0x1311, 0x10a9: 0x1319,
+	0x10aa: 0x1321, 0x10ab: 0x1329, 0x10ac: 0x1331, 0x10ad: 0x1339, 0x10ae: 0x1341, 0x10af: 0x1349,
+	0x10b0: 0x1351, 0x10b1: 0x1359, 0x10b2: 0x1361, 0x10b3: 0x1369, 0x10b4: 0x1371, 0x10b5: 0x1379,
+	0x10b6: 0x1381, 0x10b7: 0x1389, 0x10b8: 0x1391, 0x10b9: 0x1399, 0x10ba: 0x13a1, 0x10bb: 0x13a9,
+	0x10bc: 0x13b1, 0x10bd: 0x13b9, 0x10be: 0x13c1, 0x10bf: 0x4425,
+	// Block 0x43, offset 0x10c0
+	0x10c0: 0xe00d, 0x10c1: 0x0008, 0x10c2: 0xe00d, 0x10c3: 0x0008, 0x10c4: 0xe00d, 0x10c5: 0x0008,
+	0x10c6: 0xe00d, 0x10c7: 0x0008, 0x10c8: 0xe00d, 0x10c9: 0x0008, 0x10ca: 0xe00d, 0x10cb: 0x0008,
+	0x10cc: 0xe00d, 0x10cd: 0x0008, 0x10ce: 0xe00d, 0x10cf: 0x0008, 0x10d0: 0xe00d, 0x10d1: 0x0008,
+	0x10d2: 0xe00d, 0x10d3: 0x0008, 0x10d4: 0xe00d, 0x10d5: 0x0008, 0x10d6: 0xe00d, 0x10d7: 0x0008,
+	0x10d8: 0xe00d, 0x10d9: 0x0008, 0x10da: 0xe00d, 0x10db: 0x0008, 0x10dc: 0xe00d, 0x10dd: 0x0008,
+	0x10de: 0xe00d, 0x10df: 0x0008, 0x10e0: 0xe00d, 0x10e1: 0x0008, 0x10e2: 0xe00d, 0x10e3: 0x0008,
+	0x10e4: 0xe00d, 0x10e5: 0x0008, 0x10e6: 0xe00d, 0x10e7: 0x0008, 0x10e8: 0xe00d, 0x10e9: 0x0008,
+	0x10ea: 0xe00d, 0x10eb: 0x0008, 0x10ec: 0xe00d, 0x10ed: 0x0008, 0x10ee: 0x0008, 0x10ef: 0x3308,
+	0x10f0: 0x3318, 0x10f1: 0x3318, 0x10f2: 0x3318, 0x10f3: 0x0018, 0x10f4: 0x3308, 0x10f5: 0x3308,
+	0x10f6: 0x3308, 0x10f7: 0x3308, 0x10f8: 0x3308, 0x10f9: 0x3308, 0x10fa: 0x3308, 0x10fb: 0x3308,
+	0x10fc: 0x3308, 0x10fd: 0x3308, 0x10fe: 0x0018, 0x10ff: 0x0008,
+	// Block 0x44, offset 0x1100
+	0x1100: 0xe00d, 0x1101: 0x0008, 0x1102: 0xe00d, 0x1103: 0x0008, 0x1104: 0xe00d, 0x1105: 0x0008,
+	0x1106: 0xe00d, 0x1107: 0x0008, 0x1108: 0xe00d, 0x1109: 0x0008, 0x110a: 0xe00d, 0x110b: 0x0008,
+	0x110c: 0xe00d, 0x110d: 0x0008, 0x110e: 0xe00d, 0x110f: 0x0008, 0x1110: 0xe00d, 0x1111: 0x0008,
+	0x1112: 0xe00d, 0x1113: 0x0008, 0x1114: 0xe00d, 0x1115: 0x0008, 0x1116: 0xe00d, 0x1117: 0x0008,
+	0x1118: 0xe00d, 0x1119: 0x0008, 0x111a: 0xe00d, 0x111b: 0x0008, 0x111c: 0x02d1, 0x111d: 0x13c9,
+	0x111e: 0x3308, 0x111f: 0x3308, 0x1120: 0x0008, 0x1121: 0x0008, 0x1122: 0x0008, 0x1123: 0x0008,
+	0x1124: 0x0008, 0x1125: 0x0008, 0x1126: 0x0008, 0x1127: 0x0008, 0x1128: 0x0008, 0x1129: 0x0008,
+	0x112a: 0x0008, 0x112b: 0x0008, 0x112c: 0x0008, 0x112d: 0x0008, 0x112e: 0x0008, 0x112f: 0x0008,
+	0x1130: 0x0008, 0x1131: 0x0008, 0x1132: 0x0008, 0x1133: 0x0008, 0x1134: 0x0008, 0x1135: 0x0008,
+	0x1136: 0x0008, 0x1137: 0x0008, 0x1138: 0x0008, 0x1139: 0x0008, 0x113a: 0x0008, 0x113b: 0x0008,
+	0x113c: 0x0008, 0x113d: 0x0008, 0x113e: 0x0008, 0x113f: 0x0008,
+	// Block 0x45, offset 0x1140
+	0x1140: 0x0018, 0x1141: 0x0018, 0x1142: 0x0018, 0x1143: 0x0018, 0x1144: 0x0018, 0x1145: 0x0018,
+	0x1146: 0x0018, 0x1147: 0x0018, 0x1148: 0x0018, 0x1149: 0x0018, 0x114a: 0x0018, 0x114b: 0x0018,
+	0x114c: 0x0018, 0x114d: 0x0018, 0x114e: 0x0018, 0x114f: 0x0018, 0x1150: 0x0018, 0x1151: 0x0018,
+	0x1152: 0x0018, 0x1153: 0x0018, 0x1154: 0x0018, 0x1155: 0x0018, 0x1156: 0x0018, 0x1157: 0x0008,
+	0x1158: 0x0008, 0x1159: 0x0008, 0x115a: 0x0008, 0x115b: 0x0008, 0x115c: 0x0008, 0x115d: 0x0008,
+	0x115e: 0x0008, 0x115f: 0x0008, 0x1160: 0x0018, 0x1161: 0x0018, 0x1162: 0xe00d, 0x1163: 0x0008,
+	0x1164: 0xe00d, 0x1165: 0x0008, 0x1166: 0xe00d, 0x1167: 0x0008, 0x1168: 0xe00d, 0x1169: 0x0008,
+	0x116a: 0xe00d, 0x116b: 0x0008, 0x116c: 0xe00d, 0x116d: 0x0008, 0x116e: 0xe00d, 0x116f: 0x0008,
+	0x1170: 0x0008, 0x1171: 0x0008, 0x1172: 0xe00d, 0x1173: 0x0008, 0x1174: 0xe00d, 0x1175: 0x0008,
+	0x1176: 0xe00d, 0x1177: 0x0008, 0x1178: 0xe00d, 0x1179: 0x0008, 0x117a: 0xe00d, 0x117b: 0x0008,
+	0x117c: 0xe00d, 0x117d: 0x0008, 0x117e: 0xe00d, 0x117f: 0x0008,
+	// Block 0x46, offset 0x1180
+	0x1180: 0xe00d, 0x1181: 0x0008, 0x1182: 0xe00d, 0x1183: 0x0008, 0x1184: 0xe00d, 0x1185: 0x0008,
+	0x1186: 0xe00d, 0x1187: 0x0008, 0x1188: 0xe00d, 0x1189: 0x0008, 0x118a: 0xe00d, 0x118b: 0x0008,
+	0x118c: 0xe00d, 0x118d: 0x0008, 0x118e: 0xe00d, 0x118f: 0x0008, 0x1190: 0xe00d, 0x1191: 0x0008,
+	0x1192: 0xe00d, 0x1193: 0x0008, 0x1194: 0xe00d, 0x1195: 0x0008, 0x1196: 0xe00d, 0x1197: 0x0008,
+	0x1198: 0xe00d, 0x1199: 0x0008, 0x119a: 0xe00d, 0x119b: 0x0008, 0x119c: 0xe00d, 0x119d: 0x0008,
+	0x119e: 0xe00d, 0x119f: 0x0008, 0x11a0: 0xe00d, 0x11a1: 0x0008, 0x11a2: 0xe00d, 0x11a3: 0x0008,
+	0x11a4: 0xe00d, 0x11a5: 0x0008, 0x11a6: 0xe00d, 0x11a7: 0x0008, 0x11a8: 0xe00d, 0x11a9: 0x0008,
+	0x11aa: 0xe00d, 0x11ab: 0x0008, 0x11ac: 0xe00d, 0x11ad: 0x0008, 0x11ae: 0xe00d, 0x11af: 0x0008,
+	0x11b0: 0xe0fd, 0x11b1: 0x0008, 0x11b2: 0x0008, 0x11b3: 0x0008, 0x11b4: 0x0008, 0x11b5: 0x0008,
+	0x11b6: 0x0008, 0x11b7: 0x0008, 0x11b8: 0x0008, 0x11b9: 0xe01d, 0x11ba: 0x0008, 0x11bb: 0xe03d,
+	0x11bc: 0x0008, 0x11bd: 0x4445, 0x11be: 0xe00d, 0x11bf: 0x0008,
+	// Block 0x47, offset 0x11c0
+	0x11c0: 0xe00d, 0x11c1: 0x0008, 0x11c2: 0xe00d, 0x11c3: 0x0008, 0x11c4: 0xe00d, 0x11c5: 0x0008,
+	0x11c6: 0xe00d, 0x11c7: 0x0008, 0x11c8: 0x0008, 0x11c9: 0x0018, 0x11ca: 0x0018, 0x11cb: 0xe03d,
+	0x11cc: 0x0008, 0x11cd: 0x0409, 0x11ce: 0x0008, 0x11cf: 0x0008, 0x11d0: 0xe00d, 0x11d1: 0x0008,
+	0x11d2: 0xe00d, 0x11d3: 0x0008, 0x11d4: 0x0008, 0x11d5: 0x0008, 0x11d6: 0xe00d, 0x11d7: 0x0008,
+	0x11d8: 0xe00d, 0x11d9: 0x0008, 0x11da: 0xe00d, 0x11db: 0x0008, 0x11dc: 0xe00d, 0x11dd: 0x0008,
+	0x11de: 0xe00d, 0x11df: 0x0008, 0x11e0: 0xe00d, 0x11e1: 0x0008, 0x11e2: 0xe00d, 0x11e3: 0x0008,
+	0x11e4: 0xe00d, 0x11e5: 0x0008, 0x11e6: 0xe00d, 0x11e7: 0x0008, 0x11e8: 0xe00d, 0x11e9: 0x0008,
+	0x11ea: 0x13d1, 0x11eb: 0x0371, 0x11ec: 0x0401, 0x11ed: 0x13d9, 0x11ee: 0x0421, 0x11ef: 0x0008,
+	0x11f0: 0x13e1, 0x11f1: 0x13e9, 0x11f2: 0x0429, 0x11f3: 0x4465, 0x11f4: 0xe00d, 0x11f5: 0x0008,
+	0x11f6: 0xe00d, 0x11f7: 0x0008, 0x11f8: 0xe00d, 0x11f9: 0x0008, 0x11fa: 0xe00d, 0x11fb: 0x0008,
+	0x11fc: 0xe00d, 0x11fd: 0x0008, 0x11fe: 0xe00d, 0x11ff: 0x0008,
+	// Block 0x48, offset 0x1200
+	0x1200: 0xe00d, 0x1201: 0x0008, 0x1202: 0xe00d, 0x1203: 0x0008, 0x1204: 0x03f5, 0x1205: 0x0479,
+	0x1206: 0x447d, 0x1207: 0xe07d, 0x1208: 0x0008, 0x1209: 0xe01d, 0x120a: 0x0008, 0x120b: 0x0040,
+	0x120c: 0x0040, 0x120d: 0x0040, 0x120e: 0x0040, 0x120f: 0x0040, 0x1210: 0xe00d, 0x1211: 0x0008,
+	0x1212: 0x0040, 0x1213: 0x0008, 0x1214: 0x0040, 0x1215: 0x0008, 0x1216: 0xe00d, 0x1217: 0x0008,
+	0x1218: 0xe00d, 0x1219: 0x0008, 0x121a: 0x0040, 0x121b: 0x0040, 0x121c: 0x0040, 0x121d: 0x0040,
+	0x121e: 0x0040, 0x121f: 0x0040, 0x1220: 0x0040, 0x1221: 0x0040, 0x1222: 0x0040, 0x1223: 0x0040,
+	0x1224: 0x0040, 0x1225: 0x0040, 0x1226: 0x0040, 0x1227: 0x0040, 0x1228: 0x0040, 0x1229: 0x0040,
+	0x122a: 0x0040, 0x122b: 0x0040, 0x122c: 0x0040, 0x122d: 0x0040, 0x122e: 0x0040, 0x122f: 0x0040,
+	0x1230: 0x0040, 0x1231: 0x0040, 0x1232: 0x03d9, 0x1233: 0x03f1, 0x1234: 0x0751, 0x1235: 0xe01d,
+	0x1236: 0x0008, 0x1237: 0x0008, 0x1238: 0x0741, 0x1239: 0x13f1, 0x123a: 0x0008, 0x123b: 0x0008,
+	0x123c: 0x0008, 0x123d: 0x0008, 0x123e: 0x0008, 0x123f: 0x0008,
+	// Block 0x49, offset 0x1240
+	0x1240: 0x650d, 0x1241: 0x652d, 0x1242: 0x654d, 0x1243: 0x656d, 0x1244: 0x658d, 0x1245: 0x65ad,
+	0x1246: 0x65cd, 0x1247: 0x65ed, 0x1248: 0x660d, 0x1249: 0x662d, 0x124a: 0x664d, 0x124b: 0x666d,
+	0x124c: 0x668d, 0x124d: 0x66ad, 0x124e: 0x0008, 0x124f: 0x0008, 0x1250: 0x66cd, 0x1251: 0x0008,
+	0x1252: 0x66ed, 0x1253: 0x0008, 0x1254: 0x0008, 0x1255: 0x670d, 0x1256: 0x672d, 0x1257: 0x674d,
+	0x1258: 0x676d, 0x1259: 0x678d, 0x125a: 0x67ad, 0x125b: 0x67cd, 0x125c: 0x67ed, 0x125d: 0x680d,
+	0x125e: 0x682d, 0x125f: 0x0008, 0x1260: 0x684d, 0x1261: 0x0008, 0x1262: 0x686d, 0x1263: 0x0008,
+	0x1264: 0x0008, 0x1265: 0x688d, 0x1266: 0x68ad, 0x1267: 0x0008, 0x1268: 0x0008, 0x1269: 0x0008,
+	0x126a: 0x68cd, 0x126b: 0x68ed, 0x126c: 0x690d, 0x126d: 0x692d, 0x126e: 0x694d, 0x126f: 0x696d,
+	0x1270: 0x698d, 0x1271: 0x69ad, 0x1272: 0x69cd, 0x1273: 0x69ed, 0x1274: 0x6a0d, 0x1275: 0x6a2d,
+	0x1276: 0x6a4d, 0x1277: 0x6a6d, 0x1278: 0x6a8d, 0x1279: 0x6aad, 0x127a: 0x6acd, 0x127b: 0x6aed,
+	0x127c: 0x6b0d, 0x127d: 0x6b2d, 0x127e: 0x6b4d, 0x127f: 0x6b6d,
+	// Block 0x4a, offset 0x1280
+	0x1280: 0x7acd, 0x1281: 0x7aed, 0x1282: 0x7b0d, 0x1283: 0x7b2d, 0x1284: 0x7b4d, 0x1285: 0x7b6d,
+	0x1286: 0x7b8d, 0x1287: 0x7bad, 0x1288: 0x7bcd, 0x1289: 0x7bed, 0x128a: 0x7c0d, 0x128b: 0x7c2d,
+	0x128c: 0x7c4d, 0x128d: 0x7c6d, 0x128e: 0x7c8d, 0x128f: 0x1409, 0x1290: 0x1411, 0x1291: 0x1419,
+	0x1292: 0x7cad, 0x1293: 0x7ccd, 0x1294: 0x7ced, 0x1295: 0x1421, 0x1296: 0x1429, 0x1297: 0x1431,
+	0x1298: 0x7d0d, 0x1299: 0x7d2d, 0x129a: 0x0040, 0x129b: 0x0040, 0x129c: 0x0040, 0x129d: 0x0040,
+	0x129e: 0x0040, 0x129f: 0x0040, 0x12a0: 0x0040, 0x12a1: 0x0040, 0x12a2: 0x0040, 0x12a3: 0x0040,
+	0x12a4: 0x0040, 0x12a5: 0x0040, 0x12a6: 0x0040, 0x12a7: 0x0040, 0x12a8: 0x0040, 0x12a9: 0x0040,
+	0x12aa: 0x0040, 0x12ab: 0x0040, 0x12ac: 0x0040, 0x12ad: 0x0040, 0x12ae: 0x0040, 0x12af: 0x0040,
+	0x12b0: 0x0040, 0x12b1: 0x0040, 0x12b2: 0x0040, 0x12b3: 0x0040, 0x12b4: 0x0040, 0x12b5: 0x0040,
+	0x12b6: 0x0040, 0x12b7: 0x0040, 0x12b8: 0x0040, 0x12b9: 0x0040, 0x12ba: 0x0040, 0x12bb: 0x0040,
+	0x12bc: 0x0040, 0x12bd: 0x0040, 0x12be: 0x0040, 0x12bf: 0x0040,
+	// Block 0x4b, offset 0x12c0
+	0x12c0: 0x1439, 0x12c1: 0x1441, 0x12c2: 0x1449, 0x12c3: 0x7d4d, 0x12c4: 0x7d6d, 0x12c5: 0x1451,
+	0x12c6: 0x1451, 0x12c7: 0x0040, 0x12c8: 0x0040, 0x12c9: 0x0040, 0x12ca: 0x0040, 0x12cb: 0x0040,
+	0x12cc: 0x0040, 0x12cd: 0x0040, 0x12ce: 0x0040, 0x12cf: 0x0040, 0x12d0: 0x0040, 0x12d1: 0x0040,
+	0x12d2: 0x0040, 0x12d3: 0x1459, 0x12d4: 0x1461, 0x12d5: 0x1469, 0x12d6: 0x1471, 0x12d7: 0x1479,
+	0x12d8: 0x0040, 0x12d9: 0x0040, 0x12da: 0x0040, 0x12db: 0x0040, 0x12dc: 0x0040, 0x12dd: 0x1481,
+	0x12de: 0x3308, 0x12df: 0x1489, 0x12e0: 0x1491, 0x12e1: 0x0779, 0x12e2: 0x0791, 0x12e3: 0x1499,
+	0x12e4: 0x14a1, 0x12e5: 0x14a9, 0x12e6: 0x14b1, 0x12e7: 0x14b9, 0x12e8: 0x14c1, 0x12e9: 0x071a,
+	0x12ea: 0x14c9, 0x12eb: 0x14d1, 0x12ec: 0x14d9, 0x12ed: 0x14e1, 0x12ee: 0x14e9, 0x12ef: 0x14f1,
+	0x12f0: 0x14f9, 0x12f1: 0x1501, 0x12f2: 0x1509, 0x12f3: 0x1511, 0x12f4: 0x1519, 0x12f5: 0x1521,
+	0x12f6: 0x1529, 0x12f7: 0x0040, 0x12f8: 0x1531, 0x12f9: 0x1539, 0x12fa: 0x1541, 0x12fb: 0x1549,
+	0x12fc: 0x1551, 0x12fd: 0x0040, 0x12fe: 0x1559, 0x12ff: 0x0040,
+	// Block 0x4c, offset 0x1300
+	0x1300: 0x1561, 0x1301: 0x1569, 0x1302: 0x0040, 0x1303: 0x1571, 0x1304: 0x1579, 0x1305: 0x0040,
+	0x1306: 0x1581, 0x1307: 0x1589, 0x1308: 0x1591, 0x1309: 0x1599, 0x130a: 0x15a1, 0x130b: 0x15a9,
+	0x130c: 0x15b1, 0x130d: 0x15b9, 0x130e: 0x15c1, 0x130f: 0x15c9, 0x1310: 0x15d1, 0x1311: 0x15d1,
+	0x1312: 0x15d9, 0x1313: 0x15d9, 0x1314: 0x15d9, 0x1315: 0x15d9, 0x1316: 0x15e1, 0x1317: 0x15e1,
+	0x1318: 0x15e1, 0x1319: 0x15e1, 0x131a: 0x15e9, 0x131b: 0x15e9, 0x131c: 0x15e9, 0x131d: 0x15e9,
+	0x131e: 0x15f1, 0x131f: 0x15f1, 0x1320: 0x15f1, 0x1321: 0x15f1, 0x1322: 0x15f9, 0x1323: 0x15f9,
+	0x1324: 0x15f9, 0x1325: 0x15f9, 0x1326: 0x1601, 0x1327: 0x1601, 0x1328: 0x1601, 0x1329: 0x1601,
+	0x132a: 0x1609, 0x132b: 0x1609, 0x132c: 0x1609, 0x132d: 0x1609, 0x132e: 0x1611, 0x132f: 0x1611,
+	0x1330: 0x1611, 0x1331: 0x1611, 0x1332: 0x1619, 0x1333: 0x1619, 0x1334: 0x1619, 0x1335: 0x1619,
+	0x1336: 0x1621, 0x1337: 0x1621, 0x1338: 0x1621, 0x1339: 0x1621, 0x133a: 0x1629, 0x133b: 0x1629,
+	0x133c: 0x1629, 0x133d: 0x1629, 0x133e: 0x1631, 0x133f: 0x1631,
+	// Block 0x4d, offset 0x1340
+	0x1340: 0x1631, 0x1341: 0x1631, 0x1342: 0x1639, 0x1343: 0x1639, 0x1344: 0x1641, 0x1345: 0x1641,
+	0x1346: 0x1649, 0x1347: 0x1649, 0x1348: 0x1651, 0x1349: 0x1651, 0x134a: 0x1659, 0x134b: 0x1659,
+	0x134c: 0x1661, 0x134d: 0x1661, 0x134e: 0x1669, 0x134f: 0x1669, 0x1350: 0x1669, 0x1351: 0x1669,
+	0x1352: 0x1671, 0x1353: 0x1671, 0x1354: 0x1671, 0x1355: 0x1671, 0x1356: 0x1679, 0x1357: 0x1679,
+	0x1358: 0x1679, 0x1359: 0x1679, 0x135a: 0x1681, 0x135b: 0x1681, 0x135c: 0x1681, 0x135d: 0x1681,
+	0x135e: 0x1689, 0x135f: 0x1689, 0x1360: 0x1691, 0x1361: 0x1691, 0x1362: 0x1691, 0x1363: 0x1691,
+	0x1364: 0x1699, 0x1365: 0x1699, 0x1366: 0x16a1, 0x1367: 0x16a1, 0x1368: 0x16a1, 0x1369: 0x16a1,
+	0x136a: 0x16a9, 0x136b: 0x16a9, 0x136c: 0x16a9, 0x136d: 0x16a9, 0x136e: 0x16b1, 0x136f: 0x16b1,
+	0x1370: 0x16b9, 0x1371: 0x16b9, 0x1372: 0x0818, 0x1373: 0x0818, 0x1374: 0x0818, 0x1375: 0x0818,
+	0x1376: 0x0818, 0x1377: 0x0818, 0x1378: 0x0818, 0x1379: 0x0818, 0x137a: 0x0818, 0x137b: 0x0818,
+	0x137c: 0x0818, 0x137d: 0x0818, 0x137e: 0x0818, 0x137f: 0x0818,
+	// Block 0x4e, offset 0x1380
+	0x1380: 0x0818, 0x1381: 0x0818, 0x1382: 0x0818, 0x1383: 0x0040, 0x1384: 0x0040, 0x1385: 0x0040,
+	0x1386: 0x0040, 0x1387: 0x0040, 0x1388: 0x0040, 0x1389: 0x0040, 0x138a: 0x0040, 0x138b: 0x0040,
+	0x138c: 0x0040, 0x138d: 0x0040, 0x138e: 0x0040, 0x138f: 0x0040, 0x1390: 0x0040, 0x1391: 0x0040,
+	0x1392: 0x0040, 0x1393: 0x16c1, 0x1394: 0x16c1, 0x1395: 0x16c1, 0x1396: 0x16c1, 0x1397: 0x16c9,
+	0x1398: 0x16c9, 0x1399: 0x16d1, 0x139a: 0x16d1, 0x139b: 0x16d9, 0x139c: 0x16d9, 0x139d: 0x0149,
+	0x139e: 0x16e1, 0x139f: 0x16e1, 0x13a0: 0x16e9, 0x13a1: 0x16e9, 0x13a2: 0x16f1, 0x13a3: 0x16f1,
+	0x13a4: 0x16f9, 0x13a5: 0x16f9, 0x13a6: 0x16f9, 0x13a7: 0x16f9, 0x13a8: 0x1701, 0x13a9: 0x1701,
+	0x13aa: 0x1709, 0x13ab: 0x1709, 0x13ac: 0x1711, 0x13ad: 0x1711, 0x13ae: 0x1719, 0x13af: 0x1719,
+	0x13b0: 0x1721, 0x13b1: 0x1721, 0x13b2: 0x1729, 0x13b3: 0x1729, 0x13b4: 0x1731, 0x13b5: 0x1731,
+	0x13b6: 0x1739, 0x13b7: 0x1739, 0x13b8: 0x1739, 0x13b9: 0x1741, 0x13ba: 0x1741, 0x13bb: 0x1741,
+	0x13bc: 0x1749, 0x13bd: 0x1749, 0x13be: 0x1749, 0x13bf: 0x1749,
+	// Block 0x4f, offset 0x13c0
+	0x13c0: 0x1949, 0x13c1: 0x1951, 0x13c2: 0x1959, 0x13c3: 0x1961, 0x13c4: 0x1969, 0x13c5: 0x1971,
+	0x13c6: 0x1979, 0x13c7: 0x1981, 0x13c8: 0x1989, 0x13c9: 0x1991, 0x13ca: 0x1999, 0x13cb: 0x19a1,
+	0x13cc: 0x19a9, 0x13cd: 0x19b1, 0x13ce: 0x19b9, 0x13cf: 0x19c1, 0x13d0: 0x19c9, 0x13d1: 0x19d1,
+	0x13d2: 0x19d9, 0x13d3: 0x19e1, 0x13d4: 0x19e9, 0x13d5: 0x19f1, 0x13d6: 0x19f9, 0x13d7: 0x1a01,
+	0x13d8: 0x1a09, 0x13d9: 0x1a11, 0x13da: 0x1a19, 0x13db: 0x1a21, 0x13dc: 0x1a29, 0x13dd: 0x1a31,
+	0x13de: 0x1a3a, 0x13df: 0x1a42, 0x13e0: 0x1a4a, 0x13e1: 0x1a52, 0x13e2: 0x1a5a, 0x13e3: 0x1a62,
+	0x13e4: 0x1a69, 0x13e5: 0x1a71, 0x13e6: 0x1761, 0x13e7: 0x1a79, 0x13e8: 0x1741, 0x13e9: 0x1769,
+	0x13ea: 0x1a81, 0x13eb: 0x1a89, 0x13ec: 0x1789, 0x13ed: 0x1a91, 0x13ee: 0x1791, 0x13ef: 0x1799,
+	0x13f0: 0x1a99, 0x13f1: 0x1aa1, 0x13f2: 0x17b9, 0x13f3: 0x1aa9, 0x13f4: 0x17c1, 0x13f5: 0x17c9,
+	0x13f6: 0x1ab1, 0x13f7: 0x1ab9, 0x13f8: 0x17d9, 0x13f9: 0x1ac1, 0x13fa: 0x17e1, 0x13fb: 0x17e9,
+	0x13fc: 0x18d1, 0x13fd: 0x18d9, 0x13fe: 0x18f1, 0x13ff: 0x18f9,
+	// Block 0x50, offset 0x1400
+	0x1400: 0x1901, 0x1401: 0x1921, 0x1402: 0x1929, 0x1403: 0x1931, 0x1404: 0x1939, 0x1405: 0x1959,
+	0x1406: 0x1961, 0x1407: 0x1969, 0x1408: 0x1ac9, 0x1409: 0x1989, 0x140a: 0x1ad1, 0x140b: 0x1ad9,
+	0x140c: 0x19b9, 0x140d: 0x1ae1, 0x140e: 0x19c1, 0x140f: 0x19c9, 0x1410: 0x1a31, 0x1411: 0x1ae9,
+	0x1412: 0x1af1, 0x1413: 0x1a09, 0x1414: 0x1af9, 0x1415: 0x1a11, 0x1416: 0x1a19, 0x1417: 0x1751,
+	0x1418: 0x1759, 0x1419: 0x1b01, 0x141a: 0x1761, 0x141b: 0x1b09, 0x141c: 0x1771, 0x141d: 0x1779,
+	0x141e: 0x1781, 0x141f: 0x1789, 0x1420: 0x1b11, 0x1421: 0x17a1, 0x1422: 0x17a9, 0x1423: 0x17b1,
+	0x1424: 0x17b9, 0x1425: 0x1b19, 0x1426: 0x17d9, 0x1427: 0x17f1, 0x1428: 0x17f9, 0x1429: 0x1801,
+	0x142a: 0x1809, 0x142b: 0x1811, 0x142c: 0x1821, 0x142d: 0x1829, 0x142e: 0x1831, 0x142f: 0x1839,
+	0x1430: 0x1841, 0x1431: 0x1849, 0x1432: 0x1b21, 0x1433: 0x1851, 0x1434: 0x1859, 0x1435: 0x1861,
+	0x1436: 0x1869, 0x1437: 0x1871, 0x1438: 0x1879, 0x1439: 0x1889, 0x143a: 0x1891, 0x143b: 0x1899,
+	0x143c: 0x18a1, 0x143d: 0x18a9, 0x143e: 0x18b1, 0x143f: 0x18b9,
+	// Block 0x51, offset 0x1440
+	0x1440: 0x18c1, 0x1441: 0x18c9, 0x1442: 0x18e1, 0x1443: 0x18e9, 0x1444: 0x1909, 0x1445: 0x1911,
+	0x1446: 0x1919, 0x1447: 0x1921, 0x1448: 0x1929, 0x1449: 0x1941, 0x144a: 0x1949, 0x144b: 0x1951,
+	0x144c: 0x1959, 0x144d: 0x1b29, 0x144e: 0x1971, 0x144f: 0x1979, 0x1450: 0x1981, 0x1451: 0x1989,
+	0x1452: 0x19a1, 0x1453: 0x19a9, 0x1454: 0x19b1, 0x1455: 0x19b9, 0x1456: 0x1b31, 0x1457: 0x19d1,
+	0x1458: 0x19d9, 0x1459: 0x1b39, 0x145a: 0x19f1, 0x145b: 0x19f9, 0x145c: 0x1a01, 0x145d: 0x1a09,
+	0x145e: 0x1b41, 0x145f: 0x1761, 0x1460: 0x1b09, 0x1461: 0x1789, 0x1462: 0x1b11, 0x1463: 0x17b9,
+	0x1464: 0x1b19, 0x1465: 0x17d9, 0x1466: 0x1b49, 0x1467: 0x1841, 0x1468: 0x1b51, 0x1469: 0x1b59,
+	0x146a: 0x1b61, 0x146b: 0x1921, 0x146c: 0x1929, 0x146d: 0x1959, 0x146e: 0x19b9, 0x146f: 0x1b31,
+	0x1470: 0x1a09, 0x1471: 0x1b41, 0x1472: 0x1b69, 0x1473: 0x1b71, 0x1474: 0x1b79, 0x1475: 0x1b81,
+	0x1476: 0x1b89, 0x1477: 0x1b91, 0x1478: 0x1b99, 0x1479: 0x1ba1, 0x147a: 0x1ba9, 0x147b: 0x1bb1,
+	0x147c: 0x1bb9, 0x147d: 0x1bc1, 0x147e: 0x1bc9, 0x147f: 0x1bd1,
+	// Block 0x52, offset 0x1480
+	0x1480: 0x1bd9, 0x1481: 0x1be1, 0x1482: 0x1be9, 0x1483: 0x1bf1, 0x1484: 0x1bf9, 0x1485: 0x1c01,
+	0x1486: 0x1c09, 0x1487: 0x1c11, 0x1488: 0x1c19, 0x1489: 0x1c21, 0x148a: 0x1c29, 0x148b: 0x1c31,
+	0x148c: 0x1b59, 0x148d: 0x1c39, 0x148e: 0x1c41, 0x148f: 0x1c49, 0x1490: 0x1c51, 0x1491: 0x1b81,
+	0x1492: 0x1b89, 0x1493: 0x1b91, 0x1494: 0x1b99, 0x1495: 0x1ba1, 0x1496: 0x1ba9, 0x1497: 0x1bb1,
+	0x1498: 0x1bb9, 0x1499: 0x1bc1, 0x149a: 0x1bc9, 0x149b: 0x1bd1, 0x149c: 0x1bd9, 0x149d: 0x1be1,
+	0x149e: 0x1be9, 0x149f: 0x1bf1, 0x14a0: 0x1bf9, 0x14a1: 0x1c01, 0x14a2: 0x1c09, 0x14a3: 0x1c11,
+	0x14a4: 0x1c19, 0x14a5: 0x1c21, 0x14a6: 0x1c29, 0x14a7: 0x1c31, 0x14a8: 0x1b59, 0x14a9: 0x1c39,
+	0x14aa: 0x1c41, 0x14ab: 0x1c49, 0x14ac: 0x1c51, 0x14ad: 0x1c21, 0x14ae: 0x1c29, 0x14af: 0x1c31,
+	0x14b0: 0x1b59, 0x14b1: 0x1b51, 0x14b2: 0x1b61, 0x14b3: 0x1881, 0x14b4: 0x1829, 0x14b5: 0x1831,
+	0x14b6: 0x1839, 0x14b7: 0x1c21, 0x14b8: 0x1c29, 0x14b9: 0x1c31, 0x14ba: 0x1881, 0x14bb: 0x1889,
+	0x14bc: 0x1c59, 0x14bd: 0x1c59, 0x14be: 0x0018, 0x14bf: 0x0018,
+	// Block 0x53, offset 0x14c0
+	0x14c0: 0x0018, 0x14c1: 0x0018, 0x14c2: 0x0018, 0x14c3: 0x0018, 0x14c4: 0x0018, 0x14c5: 0x0018,
+	0x14c6: 0x0018, 0x14c7: 0x0018, 0x14c8: 0x0018, 0x14c9: 0x0018, 0x14ca: 0x0018, 0x14cb: 0x0018,
+	0x14cc: 0x0018, 0x14cd: 0x0018, 0x14ce: 0x0018, 0x14cf: 0x0018, 0x14d0: 0x1c61, 0x14d1: 0x1c69,
+	0x14d2: 0x1c69, 0x14d3: 0x1c71, 0x14d4: 0x1c79, 0x14d5: 0x1c81, 0x14d6: 0x1c89, 0x14d7: 0x1c91,
+	0x14d8: 0x1c99, 0x14d9: 0x1c99, 0x14da: 0x1ca1, 0x14db: 0x1ca9, 0x14dc: 0x1cb1, 0x14dd: 0x1cb9,
+	0x14de: 0x1cc1, 0x14df: 0x1cc9, 0x14e0: 0x1cc9, 0x14e1: 0x1cd1, 0x14e2: 0x1cd9, 0x14e3: 0x1cd9,
+	0x14e4: 0x1ce1, 0x14e5: 0x1ce1, 0x14e6: 0x1ce9, 0x14e7: 0x1cf1, 0x14e8: 0x1cf1, 0x14e9: 0x1cf9,
+	0x14ea: 0x1d01, 0x14eb: 0x1d01, 0x14ec: 0x1d09, 0x14ed: 0x1d09, 0x14ee: 0x1d11, 0x14ef: 0x1d19,
+	0x14f0: 0x1d19, 0x14f1: 0x1d21, 0x14f2: 0x1d21, 0x14f3: 0x1d29, 0x14f4: 0x1d31, 0x14f5: 0x1d39,
+	0x14f6: 0x1d41, 0x14f7: 0x1d41, 0x14f8: 0x1d49, 0x14f9: 0x1d51, 0x14fa: 0x1d59, 0x14fb: 0x1d61,
+	0x14fc: 0x1d69, 0x14fd: 0x1d69, 0x14fe: 0x1d71, 0x14ff: 0x1d79,
+	// Block 0x54, offset 0x1500
+	0x1500: 0x1f29, 0x1501: 0x1f31, 0x1502: 0x1f39, 0x1503: 0x1f11, 0x1504: 0x1d39, 0x1505: 0x1ce9,
+	0x1506: 0x1f41, 0x1507: 0x1f49, 0x1508: 0x0040, 0x1509: 0x0040, 0x150a: 0x0040, 0x150b: 0x0040,
+	0x150c: 0x0040, 0x150d: 0x0040, 0x150e: 0x0040, 0x150f: 0x0018, 0x1510: 0x0040, 0x1511: 0x0040,
+	0x1512: 0x0040, 0x1513: 0x0040, 0x1514: 0x0040, 0x1515: 0x0040, 0x1516: 0x0040, 0x1517: 0x0040,
+	0x1518: 0x0040, 0x1519: 0x0040, 0x151a: 0x0040, 0x151b: 0x0040, 0x151c: 0x0040, 0x151d: 0x0040,
+	0x151e: 0x0040, 0x151f: 0x0040, 0x1520: 0x0040, 0x1521: 0x0040, 0x1522: 0x0040, 0x1523: 0x0040,
+	0x1524: 0x0040, 0x1525: 0x0040, 0x1526: 0x0040, 0x1527: 0x0040, 0x1528: 0x0040, 0x1529: 0x0040,
+	0x152a: 0x0040, 0x152b: 0x0040, 0x152c: 0x0040, 0x152d: 0x0040, 0x152e: 0x0040, 0x152f: 0x0040,
+	0x1530: 0x1f51, 0x1531: 0x1f59, 0x1532: 0x1f61, 0x1533: 0x1f69, 0x1534: 0x1f71, 0x1535: 0x1f79,
+	0x1536: 0x1f81, 0x1537: 0x1f89, 0x1538: 0x1f91, 0x1539: 0x1f99, 0x153a: 0x1fa2, 0x153b: 0x1faa,
+	0x153c: 0x1fb1, 0x153d: 0x0018, 0x153e: 0x0018, 0x153f: 0x0018,
+	// Block 0x55, offset 0x1540
+	0x1540: 0x33c0, 0x1541: 0x33c0, 0x1542: 0x33c0, 0x1543: 0x33c0, 0x1544: 0x33c0, 0x1545: 0x33c0,
+	0x1546: 0x33c0, 0x1547: 0x33c0, 0x1548: 0x33c0, 0x1549: 0x33c0, 0x154a: 0x33c0, 0x154b: 0x33c0,
+	0x154c: 0x33c0, 0x154d: 0x33c0, 0x154e: 0x33c0, 0x154f: 0x33c0, 0x1550: 0x1fba, 0x1551: 0x7d8d,
+	0x1552: 0x0040, 0x1553: 0x1fc2, 0x1554: 0x0122, 0x1555: 0x1fca, 0x1556: 0x1fd2, 0x1557: 0x7dad,
+	0x1558: 0x7dcd, 0x1559: 0x0040, 0x155a: 0x0040, 0x155b: 0x0040, 0x155c: 0x0040, 0x155d: 0x0040,
+	0x155e: 0x0040, 0x155f: 0x0040, 0x1560: 0x3308, 0x1561: 0x3308, 0x1562: 0x3308, 0x1563: 0x3308,
+	0x1564: 0x3308, 0x1565: 0x3308, 0x1566: 0x3308, 0x1567: 0x3308, 0x1568: 0x3308, 0x1569: 0x3308,
+	0x156a: 0x3308, 0x156b: 0x3308, 0x156c: 0x3308, 0x156d: 0x3308, 0x156e: 0x3308, 0x156f: 0x3308,
+	0x1570: 0x0040, 0x1571: 0x7ded, 0x1572: 0x7e0d, 0x1573: 0x1fda, 0x1574: 0x1fda, 0x1575: 0x072a,
+	0x1576: 0x0732, 0x1577: 0x1fe2, 0x1578: 0x1fea, 0x1579: 0x7e2d, 0x157a: 0x7e4d, 0x157b: 0x7e6d,
+	0x157c: 0x7e2d, 0x157d: 0x7e8d, 0x157e: 0x7ead, 0x157f: 0x7e8d,
+	// Block 0x56, offset 0x1580
+	0x1580: 0x7ecd, 0x1581: 0x7eed, 0x1582: 0x7f0d, 0x1583: 0x7eed, 0x1584: 0x7f2d, 0x1585: 0x0018,
+	0x1586: 0x0018, 0x1587: 0x1ff2, 0x1588: 0x1ffa, 0x1589: 0x7f4e, 0x158a: 0x7f6e, 0x158b: 0x7f8e,
+	0x158c: 0x7fae, 0x158d: 0x1fda, 0x158e: 0x1fda, 0x158f: 0x1fda, 0x1590: 0x1fba, 0x1591: 0x7fcd,
+	0x1592: 0x0040, 0x1593: 0x0040, 0x1594: 0x0122, 0x1595: 0x1fc2, 0x1596: 0x1fd2, 0x1597: 0x1fca,
+	0x1598: 0x7fed, 0x1599: 0x072a, 0x159a: 0x0732, 0x159b: 0x1fe2, 0x159c: 0x1fea, 0x159d: 0x7ecd,
+	0x159e: 0x7f2d, 0x159f: 0x2002, 0x15a0: 0x200a, 0x15a1: 0x2012, 0x15a2: 0x071a, 0x15a3: 0x2019,
+	0x15a4: 0x2022, 0x15a5: 0x202a, 0x15a6: 0x0722, 0x15a7: 0x0040, 0x15a8: 0x2032, 0x15a9: 0x203a,
+	0x15aa: 0x2042, 0x15ab: 0x204a, 0x15ac: 0x0040, 0x15ad: 0x0040, 0x15ae: 0x0040, 0x15af: 0x0040,
+	0x15b0: 0x800e, 0x15b1: 0x2051, 0x15b2: 0x802e, 0x15b3: 0x0808, 0x15b4: 0x804e, 0x15b5: 0x0040,
+	0x15b6: 0x806e, 0x15b7: 0x2059, 0x15b8: 0x808e, 0x15b9: 0x2061, 0x15ba: 0x80ae, 0x15bb: 0x2069,
+	0x15bc: 0x80ce, 0x15bd: 0x2071, 0x15be: 0x80ee, 0x15bf: 0x2079,
+	// Block 0x57, offset 0x15c0
+	0x15c0: 0x2081, 0x15c1: 0x2089, 0x15c2: 0x2089, 0x15c3: 0x2091, 0x15c4: 0x2091, 0x15c5: 0x2099,
+	0x15c6: 0x2099, 0x15c7: 0x20a1, 0x15c8: 0x20a1, 0x15c9: 0x20a9, 0x15ca: 0x20a9, 0x15cb: 0x20a9,
+	0x15cc: 0x20a9, 0x15cd: 0x20b1, 0x15ce: 0x20b1, 0x15cf: 0x20b9, 0x15d0: 0x20b9, 0x15d1: 0x20b9,
+	0x15d2: 0x20b9, 0x15d3: 0x20c1, 0x15d4: 0x20c1, 0x15d5: 0x20c9, 0x15d6: 0x20c9, 0x15d7: 0x20c9,
+	0x15d8: 0x20c9, 0x15d9: 0x20d1, 0x15da: 0x20d1, 0x15db: 0x20d1, 0x15dc: 0x20d1, 0x15dd: 0x20d9,
+	0x15de: 0x20d9, 0x15df: 0x20d9, 0x15e0: 0x20d9, 0x15e1: 0x20e1, 0x15e2: 0x20e1, 0x15e3: 0x20e1,
+	0x15e4: 0x20e1, 0x15e5: 0x20e9, 0x15e6: 0x20e9, 0x15e7: 0x20e9, 0x15e8: 0x20e9, 0x15e9: 0x20f1,
+	0x15ea: 0x20f1, 0x15eb: 0x20f9, 0x15ec: 0x20f9, 0x15ed: 0x2101, 0x15ee: 0x2101, 0x15ef: 0x2109,
+	0x15f0: 0x2109, 0x15f1: 0x2111, 0x15f2: 0x2111, 0x15f3: 0x2111, 0x15f4: 0x2111, 0x15f5: 0x2119,
+	0x15f6: 0x2119, 0x15f7: 0x2119, 0x15f8: 0x2119, 0x15f9: 0x2121, 0x15fa: 0x2121, 0x15fb: 0x2121,
+	0x15fc: 0x2121, 0x15fd: 0x2129, 0x15fe: 0x2129, 0x15ff: 0x2129,
+	// Block 0x58, offset 0x1600
+	0x1600: 0x2129, 0x1601: 0x2131, 0x1602: 0x2131, 0x1603: 0x2131, 0x1604: 0x2131, 0x1605: 0x2139,
+	0x1606: 0x2139, 0x1607: 0x2139, 0x1608: 0x2139, 0x1609: 0x2141, 0x160a: 0x2141, 0x160b: 0x2141,
+	0x160c: 0x2141, 0x160d: 0x2149, 0x160e: 0x2149, 0x160f: 0x2149, 0x1610: 0x2149, 0x1611: 0x2151,
+	0x1612: 0x2151, 0x1613: 0x2151, 0x1614: 0x2151, 0x1615: 0x2159, 0x1616: 0x2159, 0x1617: 0x2159,
+	0x1618: 0x2159, 0x1619: 0x2161, 0x161a: 0x2161, 0x161b: 0x2161, 0x161c: 0x2161, 0x161d: 0x2169,
+	0x161e: 0x2169, 0x161f: 0x2169, 0x1620: 0x2169, 0x1621: 0x2171, 0x1622: 0x2171, 0x1623: 0x2171,
+	0x1624: 0x2171, 0x1625: 0x2179, 0x1626: 0x2179, 0x1627: 0x2179, 0x1628: 0x2179, 0x1629: 0x2181,
+	0x162a: 0x2181, 0x162b: 0x2181, 0x162c: 0x2181, 0x162d: 0x2189, 0x162e: 0x2189, 0x162f: 0x1701,
+	0x1630: 0x1701, 0x1631: 0x2191, 0x1632: 0x2191, 0x1633: 0x2191, 0x1634: 0x2191, 0x1635: 0x2199,
+	0x1636: 0x2199, 0x1637: 0x21a1, 0x1638: 0x21a1, 0x1639: 0x21a9, 0x163a: 0x21a9, 0x163b: 0x21b1,
+	0x163c: 0x21b1, 0x163d: 0x0040, 0x163e: 0x0040, 0x163f: 0x03c0,
+	// Block 0x59, offset 0x1640
+	0x1640: 0x0040, 0x1641: 0x1fca, 0x1642: 0x21ba, 0x1643: 0x2002, 0x1644: 0x203a, 0x1645: 0x2042,
+	0x1646: 0x200a, 0x1647: 0x21c2, 0x1648: 0x072a, 0x1649: 0x0732, 0x164a: 0x2012, 0x164b: 0x071a,
+	0x164c: 0x1fba, 0x164d: 0x2019, 0x164e: 0x0961, 0x164f: 0x21ca, 0x1650: 0x06e1, 0x1651: 0x0049,
+	0x1652: 0x0029, 0x1653: 0x0031, 0x1654: 0x06e9, 0x1655: 0x06f1, 0x1656: 0x06f9, 0x1657: 0x0701,
+	0x1658: 0x0709, 0x1659: 0x0711, 0x165a: 0x1fc2, 0x165b: 0x0122, 0x165c: 0x2022, 0x165d: 0x0722,
+	0x165e: 0x202a, 0x165f: 0x1fd2, 0x1660: 0x204a, 0x1661: 0x0019, 0x1662: 0x02e9, 0x1663: 0x03d9,
+	0x1664: 0x02f1, 0x1665: 0x02f9, 0x1666: 0x03f1, 0x1667: 0x0309, 0x1668: 0x00a9, 0x1669: 0x0311,
+	0x166a: 0x00b1, 0x166b: 0x0319, 0x166c: 0x0101, 0x166d: 0x0321, 0x166e: 0x0329, 0x166f: 0x0051,
+	0x1670: 0x0339, 0x1671: 0x0751, 0x1672: 0x00b9, 0x1673: 0x0089, 0x1674: 0x0341, 0x1675: 0x0349,
+	0x1676: 0x0391, 0x1677: 0x00c1, 0x1678: 0x0109, 0x1679: 0x00c9, 0x167a: 0x04b1, 0x167b: 0x1ff2,
+	0x167c: 0x2032, 0x167d: 0x1ffa, 0x167e: 0x21d2, 0x167f: 0x1fda,
+	// Block 0x5a, offset 0x1680
+	0x1680: 0x0672, 0x1681: 0x0019, 0x1682: 0x02e9, 0x1683: 0x03d9, 0x1684: 0x02f1, 0x1685: 0x02f9,
+	0x1686: 0x03f1, 0x1687: 0x0309, 0x1688: 0x00a9, 0x1689: 0x0311, 0x168a: 0x00b1, 0x168b: 0x0319,
+	0x168c: 0x0101, 0x168d: 0x0321, 0x168e: 0x0329, 0x168f: 0x0051, 0x1690: 0x0339, 0x1691: 0x0751,
+	0x1692: 0x00b9, 0x1693: 0x0089, 0x1694: 0x0341, 0x1695: 0x0349, 0x1696: 0x0391, 0x1697: 0x00c1,
+	0x1698: 0x0109, 0x1699: 0x00c9, 0x169a: 0x04b1, 0x169b: 0x1fe2, 0x169c: 0x21da, 0x169d: 0x1fea,
+	0x169e: 0x21e2, 0x169f: 0x810d, 0x16a0: 0x812d, 0x16a1: 0x0961, 0x16a2: 0x814d, 0x16a3: 0x814d,
+	0x16a4: 0x816d, 0x16a5: 0x818d, 0x16a6: 0x81ad, 0x16a7: 0x81cd, 0x16a8: 0x81ed, 0x16a9: 0x820d,
+	0x16aa: 0x822d, 0x16ab: 0x824d, 0x16ac: 0x826d, 0x16ad: 0x828d, 0x16ae: 0x82ad, 0x16af: 0x82cd,
+	0x16b0: 0x82ed, 0x16b1: 0x830d, 0x16b2: 0x832d, 0x16b3: 0x834d, 0x16b4: 0x836d, 0x16b5: 0x838d,
+	0x16b6: 0x83ad, 0x16b7: 0x83cd, 0x16b8: 0x83ed, 0x16b9: 0x840d, 0x16ba: 0x842d, 0x16bb: 0x844d,
+	0x16bc: 0x81ed, 0x16bd: 0x846d, 0x16be: 0x848d, 0x16bf: 0x824d,
+	// Block 0x5b, offset 0x16c0
+	0x16c0: 0x84ad, 0x16c1: 0x84cd, 0x16c2: 0x84ed, 0x16c3: 0x850d, 0x16c4: 0x852d, 0x16c5: 0x854d,
+	0x16c6: 0x856d, 0x16c7: 0x858d, 0x16c8: 0x850d, 0x16c9: 0x85ad, 0x16ca: 0x850d, 0x16cb: 0x85cd,
+	0x16cc: 0x85cd, 0x16cd: 0x85ed, 0x16ce: 0x85ed, 0x16cf: 0x860d, 0x16d0: 0x854d, 0x16d1: 0x862d,
+	0x16d2: 0x864d, 0x16d3: 0x862d, 0x16d4: 0x866d, 0x16d5: 0x864d, 0x16d6: 0x868d, 0x16d7: 0x868d,
+	0x16d8: 0x86ad, 0x16d9: 0x86ad, 0x16da: 0x86cd, 0x16db: 0x86cd, 0x16dc: 0x864d, 0x16dd: 0x814d,
+	0x16de: 0x86ed, 0x16df: 0x870d, 0x16e0: 0x0040, 0x16e1: 0x872d, 0x16e2: 0x874d, 0x16e3: 0x876d,
+	0x16e4: 0x878d, 0x16e5: 0x876d, 0x16e6: 0x87ad, 0x16e7: 0x87cd, 0x16e8: 0x87ed, 0x16e9: 0x87ed,
+	0x16ea: 0x880d, 0x16eb: 0x880d, 0x16ec: 0x882d, 0x16ed: 0x882d, 0x16ee: 0x880d, 0x16ef: 0x880d,
+	0x16f0: 0x884d, 0x16f1: 0x886d, 0x16f2: 0x888d, 0x16f3: 0x88ad, 0x16f4: 0x88cd, 0x16f5: 0x88ed,
+	0x16f6: 0x88ed, 0x16f7: 0x88ed, 0x16f8: 0x890d, 0x16f9: 0x890d, 0x16fa: 0x890d, 0x16fb: 0x890d,
+	0x16fc: 0x87ed, 0x16fd: 0x87ed, 0x16fe: 0x87ed, 0x16ff: 0x0040,
+	// Block 0x5c, offset 0x1700
+	0x1700: 0x0040, 0x1701: 0x0040, 0x1702: 0x874d, 0x1703: 0x872d, 0x1704: 0x892d, 0x1705: 0x872d,
+	0x1706: 0x874d, 0x1707: 0x872d, 0x1708: 0x0040, 0x1709: 0x0040, 0x170a: 0x894d, 0x170b: 0x874d,
+	0x170c: 0x896d, 0x170d: 0x892d, 0x170e: 0x896d, 0x170f: 0x874d, 0x1710: 0x0040, 0x1711: 0x0040,
+	0x1712: 0x898d, 0x1713: 0x89ad, 0x1714: 0x88ad, 0x1715: 0x896d, 0x1716: 0x892d, 0x1717: 0x896d,
+	0x1718: 0x0040, 0x1719: 0x0040, 0x171a: 0x89cd, 0x171b: 0x89ed, 0x171c: 0x89cd, 0x171d: 0x0040,
+	0x171e: 0x0040, 0x171f: 0x0040, 0x1720: 0x21e9, 0x1721: 0x21f1, 0x1722: 0x21f9, 0x1723: 0x8a0e,
+	0x1724: 0x2201, 0x1725: 0x2209, 0x1726: 0x8a2d, 0x1727: 0x0040, 0x1728: 0x8a4d, 0x1729: 0x8a6d,
+	0x172a: 0x8a8d, 0x172b: 0x8a6d, 0x172c: 0x8aad, 0x172d: 0x8acd, 0x172e: 0x8aed, 0x172f: 0x0040,
+	0x1730: 0x0040, 0x1731: 0x0040, 0x1732: 0x0040, 0x1733: 0x0040, 0x1734: 0x0040, 0x1735: 0x0040,
+	0x1736: 0x0040, 0x1737: 0x0040, 0x1738: 0x0040, 0x1739: 0x0340, 0x173a: 0x0340, 0x173b: 0x0340,
+	0x173c: 0x0040, 0x173d: 0x0040, 0x173e: 0x0040, 0x173f: 0x0040,
+	// Block 0x5d, offset 0x1740
+	0x1740: 0x0008, 0x1741: 0x0008, 0x1742: 0x0008, 0x1743: 0x0008, 0x1744: 0x0008, 0x1745: 0x0008,
+	0x1746: 0x0008, 0x1747: 0x0008, 0x1748: 0x0008, 0x1749: 0x0008, 0x174a: 0x0008, 0x174b: 0x0008,
+	0x174c: 0x0008, 0x174d: 0x0008, 0x174e: 0x0008, 0x174f: 0x0008, 0x1750: 0x0008, 0x1751: 0x0008,
+	0x1752: 0x0008, 0x1753: 0x0008, 0x1754: 0x0008, 0x1755: 0x0008, 0x1756: 0x0008, 0x1757: 0x0008,
+	0x1758: 0x0008, 0x1759: 0x0008, 0x175a: 0x0008, 0x175b: 0x0008, 0x175c: 0x0008, 0x175d: 0x0008,
+	0x175e: 0x0008, 0x175f: 0x0008, 0x1760: 0x0008, 0x1761: 0x0008, 0x1762: 0x0008, 0x1763: 0x0008,
+	0x1764: 0x0040, 0x1765: 0x0040, 0x1766: 0x0040, 0x1767: 0x0040, 0x1768: 0x0040, 0x1769: 0x0040,
+	0x176a: 0x0040, 0x176b: 0x0040, 0x176c: 0x0040, 0x176d: 0x0040, 0x176e: 0x0040, 0x176f: 0x0018,
+	0x1770: 0x8b3d, 0x1771: 0x8b55, 0x1772: 0x8b6d, 0x1773: 0x8b55, 0x1774: 0x8b85, 0x1775: 0x8b55,
+	0x1776: 0x8b6d, 0x1777: 0x8b55, 0x1778: 0x8b3d, 0x1779: 0x8b9d, 0x177a: 0x8bb5, 0x177b: 0x0040,
+	0x177c: 0x8bcd, 0x177d: 0x8b9d, 0x177e: 0x8bb5, 0x177f: 0x8b9d,
+	// Block 0x5e, offset 0x1780
+	0x1780: 0xe13d, 0x1781: 0xe14d, 0x1782: 0xe15d, 0x1783: 0xe14d, 0x1784: 0xe17d, 0x1785: 0xe14d,
+	0x1786: 0xe15d, 0x1787: 0xe14d, 0x1788: 0xe13d, 0x1789: 0xe1cd, 0x178a: 0xe1dd, 0x178b: 0x0040,
+	0x178c: 0xe1fd, 0x178d: 0xe1cd, 0x178e: 0xe1dd, 0x178f: 0xe1cd, 0x1790: 0xe13d, 0x1791: 0xe14d,
+	0x1792: 0xe15d, 0x1793: 0x0040, 0x1794: 0xe17d, 0x1795: 0xe14d, 0x1796: 0x0040, 0x1797: 0x0008,
+	0x1798: 0x0008, 0x1799: 0x0008, 0x179a: 0x0008, 0x179b: 0x0008, 0x179c: 0x0008, 0x179d: 0x0008,
+	0x179e: 0x0008, 0x179f: 0x0008, 0x17a0: 0x0008, 0x17a1: 0x0008, 0x17a2: 0x0040, 0x17a3: 0x0008,
+	0x17a4: 0x0008, 0x17a5: 0x0008, 0x17a6: 0x0008, 0x17a7: 0x0008, 0x17a8: 0x0008, 0x17a9: 0x0008,
+	0x17aa: 0x0008, 0x17ab: 0x0008, 0x17ac: 0x0008, 0x17ad: 0x0008, 0x17ae: 0x0008, 0x17af: 0x0008,
+	0x17b0: 0x0008, 0x17b1: 0x0008, 0x17b2: 0x0040, 0x17b3: 0x0008, 0x17b4: 0x0008, 0x17b5: 0x0008,
+	0x17b6: 0x0008, 0x17b7: 0x0008, 0x17b8: 0x0008, 0x17b9: 0x0008, 0x17ba: 0x0040, 0x17bb: 0x0008,
+	0x17bc: 0x0008, 0x17bd: 0x0040, 0x17be: 0x0040, 0x17bf: 0x0040,
+	// Block 0x5f, offset 0x17c0
+	0x17c0: 0x0008, 0x17c1: 0x2211, 0x17c2: 0x2219, 0x17c3: 0x02e1, 0x17c4: 0x2221, 0x17c5: 0x2229,
+	0x17c6: 0x0040, 0x17c7: 0x2231, 0x17c8: 0x2239, 0x17c9: 0x2241, 0x17ca: 0x2249, 0x17cb: 0x2251,
+	0x17cc: 0x2259, 0x17cd: 0x2261, 0x17ce: 0x2269, 0x17cf: 0x2271, 0x17d0: 0x2279, 0x17d1: 0x2281,
+	0x17d2: 0x2289, 0x17d3: 0x2291, 0x17d4: 0x2299, 0x17d5: 0x0741, 0x17d6: 0x22a1, 0x17d7: 0x22a9,
+	0x17d8: 0x22b1, 0x17d9: 0x22b9, 0x17da: 0x22c1, 0x17db: 0x13d9, 0x17dc: 0x8be5, 0x17dd: 0x22c9,
+	0x17de: 0x22d1, 0x17df: 0x8c05, 0x17e0: 0x22d9, 0x17e1: 0x8c25, 0x17e2: 0x22e1, 0x17e3: 0x22e9,
+	0x17e4: 0x22f1, 0x17e5: 0x0751, 0x17e6: 0x22f9, 0x17e7: 0x8c45, 0x17e8: 0x0949, 0x17e9: 0x2301,
+	0x17ea: 0x2309, 0x17eb: 0x2311, 0x17ec: 0x2319, 0x17ed: 0x2321, 0x17ee: 0x2329, 0x17ef: 0x2331,
+	0x17f0: 0x2339, 0x17f1: 0x0040, 0x17f2: 0x2341, 0x17f3: 0x2349, 0x17f4: 0x2351, 0x17f5: 0x2359,
+	0x17f6: 0x2361, 0x17f7: 0x2369, 0x17f8: 0x2371, 0x17f9: 0x8c65, 0x17fa: 0x8c85, 0x17fb: 0x0040,
+	0x17fc: 0x0040, 0x17fd: 0x0040, 0x17fe: 0x0040, 0x17ff: 0x0040,
+	// Block 0x60, offset 0x1800
+	0x1800: 0x0a08, 0x1801: 0x0a08, 0x1802: 0x0a08, 0x1803: 0x0a08, 0x1804: 0x0a08, 0x1805: 0x0c08,
+	0x1806: 0x0808, 0x1807: 0x0c08, 0x1808: 0x0818, 0x1809: 0x0c08, 0x180a: 0x0c08, 0x180b: 0x0808,
+	0x180c: 0x0808, 0x180d: 0x0908, 0x180e: 0x0c08, 0x180f: 0x0c08, 0x1810: 0x0c08, 0x1811: 0x0c08,
+	0x1812: 0x0c08, 0x1813: 0x0a08, 0x1814: 0x0a08, 0x1815: 0x0a08, 0x1816: 0x0a08, 0x1817: 0x0908,
+	0x1818: 0x0a08, 0x1819: 0x0a08, 0x181a: 0x0a08, 0x181b: 0x0a08, 0x181c: 0x0a08, 0x181d: 0x0c08,
+	0x181e: 0x0a08, 0x181f: 0x0a08, 0x1820: 0x0a08, 0x1821: 0x0c08, 0x1822: 0x0808, 0x1823: 0x0808,
+	0x1824: 0x0c08, 0x1825: 0x3308, 0x1826: 0x3308, 0x1827: 0x0040, 0x1828: 0x0040, 0x1829: 0x0040,
+	0x182a: 0x0040, 0x182b: 0x0a18, 0x182c: 0x0a18, 0x182d: 0x0a18, 0x182e: 0x0a18, 0x182f: 0x0c18,
+	0x1830: 0x0818, 0x1831: 0x0818, 0x1832: 0x0818, 0x1833: 0x0818, 0x1834: 0x0818, 0x1835: 0x0818,
+	0x1836: 0x0818, 0x1837: 0x0040, 0x1838: 0x0040, 0x1839: 0x0040, 0x183a: 0x0040, 0x183b: 0x0040,
+	0x183c: 0x0040, 0x183d: 0x0040, 0x183e: 0x0040, 0x183f: 0x0040,
+	// Block 0x61, offset 0x1840
+	0x1840: 0x0a08, 0x1841: 0x0c08, 0x1842: 0x0a08, 0x1843: 0x0c08, 0x1844: 0x0c08, 0x1845: 0x0c08,
+	0x1846: 0x0a08, 0x1847: 0x0a08, 0x1848: 0x0a08, 0x1849: 0x0c08, 0x184a: 0x0a08, 0x184b: 0x0a08,
+	0x184c: 0x0c08, 0x184d: 0x0a08, 0x184e: 0x0c08, 0x184f: 0x0c08, 0x1850: 0x0a08, 0x1851: 0x0c08,
+	0x1852: 0x0040, 0x1853: 0x0040, 0x1854: 0x0040, 0x1855: 0x0040, 0x1856: 0x0040, 0x1857: 0x0040,
+	0x1858: 0x0040, 0x1859: 0x0818, 0x185a: 0x0818, 0x185b: 0x0818, 0x185c: 0x0818, 0x185d: 0x0040,
+	0x185e: 0x0040, 0x185f: 0x0040, 0x1860: 0x0040, 0x1861: 0x0040, 0x1862: 0x0040, 0x1863: 0x0040,
+	0x1864: 0x0040, 0x1865: 0x0040, 0x1866: 0x0040, 0x1867: 0x0040, 0x1868: 0x0040, 0x1869: 0x0c18,
+	0x186a: 0x0c18, 0x186b: 0x0c18, 0x186c: 0x0c18, 0x186d: 0x0a18, 0x186e: 0x0a18, 0x186f: 0x0818,
+	0x1870: 0x0040, 0x1871: 0x0040, 0x1872: 0x0040, 0x1873: 0x0040, 0x1874: 0x0040, 0x1875: 0x0040,
+	0x1876: 0x0040, 0x1877: 0x0040, 0x1878: 0x0040, 0x1879: 0x0040, 0x187a: 0x0040, 0x187b: 0x0040,
+	0x187c: 0x0040, 0x187d: 0x0040, 0x187e: 0x0040, 0x187f: 0x0040,
+	// Block 0x62, offset 0x1880
+	0x1880: 0x3308, 0x1881: 0x3308, 0x1882: 0x3008, 0x1883: 0x3008, 0x1884: 0x0040, 0x1885: 0x0008,
+	0x1886: 0x0008, 0x1887: 0x0008, 0x1888: 0x0008, 0x1889: 0x0008, 0x188a: 0x0008, 0x188b: 0x0008,
+	0x188c: 0x0008, 0x188d: 0x0040, 0x188e: 0x0040, 0x188f: 0x0008, 0x1890: 0x0008, 0x1891: 0x0040,
+	0x1892: 0x0040, 0x1893: 0x0008, 0x1894: 0x0008, 0x1895: 0x0008, 0x1896: 0x0008, 0x1897: 0x0008,
+	0x1898: 0x0008, 0x1899: 0x0008, 0x189a: 0x0008, 0x189b: 0x0008, 0x189c: 0x0008, 0x189d: 0x0008,
+	0x189e: 0x0008, 0x189f: 0x0008, 0x18a0: 0x0008, 0x18a1: 0x0008, 0x18a2: 0x0008, 0x18a3: 0x0008,
+	0x18a4: 0x0008, 0x18a5: 0x0008, 0x18a6: 0x0008, 0x18a7: 0x0008, 0x18a8: 0x0008, 0x18a9: 0x0040,
+	0x18aa: 0x0008, 0x18ab: 0x0008, 0x18ac: 0x0008, 0x18ad: 0x0008, 0x18ae: 0x0008, 0x18af: 0x0008,
+	0x18b0: 0x0008, 0x18b1: 0x0040, 0x18b2: 0x0008, 0x18b3: 0x0008, 0x18b4: 0x0040, 0x18b5: 0x0008,
+	0x18b6: 0x0008, 0x18b7: 0x0008, 0x18b8: 0x0008, 0x18b9: 0x0008, 0x18ba: 0x0040, 0x18bb: 0x3308,
+	0x18bc: 0x3308, 0x18bd: 0x0008, 0x18be: 0x3008, 0x18bf: 0x3008,
+	// Block 0x63, offset 0x18c0
+	0x18c0: 0x3308, 0x18c1: 0x3008, 0x18c2: 0x3008, 0x18c3: 0x3008, 0x18c4: 0x3008, 0x18c5: 0x0040,
+	0x18c6: 0x0040, 0x18c7: 0x3008, 0x18c8: 0x3008, 0x18c9: 0x0040, 0x18ca: 0x0040, 0x18cb: 0x3008,
+	0x18cc: 0x3008, 0x18cd: 0x3808, 0x18ce: 0x0040, 0x18cf: 0x0040, 0x18d0: 0x0008, 0x18d1: 0x0040,
+	0x18d2: 0x0040, 0x18d3: 0x0040, 0x18d4: 0x0040, 0x18d5: 0x0040, 0x18d6: 0x0040, 0x18d7: 0x3008,
+	0x18d8: 0x0040, 0x18d9: 0x0040, 0x18da: 0x0040, 0x18db: 0x0040, 0x18dc: 0x0040, 0x18dd: 0x0008,
+	0x18de: 0x0008, 0x18df: 0x0008, 0x18e0: 0x0008, 0x18e1: 0x0008, 0x18e2: 0x3008, 0x18e3: 0x3008,
+	0x18e4: 0x0040, 0x18e5: 0x0040, 0x18e6: 0x3308, 0x18e7: 0x3308, 0x18e8: 0x3308, 0x18e9: 0x3308,
+	0x18ea: 0x3308, 0x18eb: 0x3308, 0x18ec: 0x3308, 0x18ed: 0x0040, 0x18ee: 0x0040, 0x18ef: 0x0040,
+	0x18f0: 0x3308, 0x18f1: 0x3308, 0x18f2: 0x3308, 0x18f3: 0x3308, 0x18f4: 0x3308, 0x18f5: 0x0040,
+	0x18f6: 0x0040, 0x18f7: 0x0040, 0x18f8: 0x0040, 0x18f9: 0x0040, 0x18fa: 0x0040, 0x18fb: 0x0040,
+	0x18fc: 0x0040, 0x18fd: 0x0040, 0x18fe: 0x0040, 0x18ff: 0x0040,
+	// Block 0x64, offset 0x1900
+	0x1900: 0x0008, 0x1901: 0x0008, 0x1902: 0x0008, 0x1903: 0x0008, 0x1904: 0x0008, 0x1905: 0x0008,
+	0x1906: 0x0008, 0x1907: 0x0040, 0x1908: 0x0040, 0x1909: 0x0008, 0x190a: 0x0040, 0x190b: 0x0040,
+	0x190c: 0x0008, 0x190d: 0x0008, 0x190e: 0x0008, 0x190f: 0x0008, 0x1910: 0x0008, 0x1911: 0x0008,
+	0x1912: 0x0008, 0x1913: 0x0008, 0x1914: 0x0040, 0x1915: 0x0008, 0x1916: 0x0008, 0x1917: 0x0040,
+	0x1918: 0x0008, 0x1919: 0x0008, 0x191a: 0x0008, 0x191b: 0x0008, 0x191c: 0x0008, 0x191d: 0x0008,
+	0x191e: 0x0008, 0x191f: 0x0008, 0x1920: 0x0008, 0x1921: 0x0008, 0x1922: 0x0008, 0x1923: 0x0008,
+	0x1924: 0x0008, 0x1925: 0x0008, 0x1926: 0x0008, 0x1927: 0x0008, 0x1928: 0x0008, 0x1929: 0x0008,
+	0x192a: 0x0008, 0x192b: 0x0008, 0x192c: 0x0008, 0x192d: 0x0008, 0x192e: 0x0008, 0x192f: 0x0008,
+	0x1930: 0x3008, 0x1931: 0x3008, 0x1932: 0x3008, 0x1933: 0x3008, 0x1934: 0x3008, 0x1935: 0x3008,
+	0x1936: 0x0040, 0x1937: 0x3008, 0x1938: 0x3008, 0x1939: 0x0040, 0x193a: 0x0040, 0x193b: 0x3308,
+	0x193c: 0x3308, 0x193d: 0x3808, 0x193e: 0x3b08, 0x193f: 0x0008,
+	// Block 0x65, offset 0x1940
+	0x1940: 0x0019, 0x1941: 0x02e9, 0x1942: 0x03d9, 0x1943: 0x02f1, 0x1944: 0x02f9, 0x1945: 0x03f1,
+	0x1946: 0x0309, 0x1947: 0x00a9, 0x1948: 0x0311, 0x1949: 0x00b1, 0x194a: 0x0319, 0x194b: 0x0101,
+	0x194c: 0x0321, 0x194d: 0x0329, 0x194e: 0x0051, 0x194f: 0x0339, 0x1950: 0x0751, 0x1951: 0x00b9,
+	0x1952: 0x0089, 0x1953: 0x0341, 0x1954: 0x0349, 0x1955: 0x0391, 0x1956: 0x00c1, 0x1957: 0x0109,
+	0x1958: 0x00c9, 0x1959: 0x04b1, 0x195a: 0x0019, 0x195b: 0x02e9, 0x195c: 0x03d9, 0x195d: 0x02f1,
+	0x195e: 0x02f9, 0x195f: 0x03f1, 0x1960: 0x0309, 0x1961: 0x00a9, 0x1962: 0x0311, 0x1963: 0x00b1,
+	0x1964: 0x0319, 0x1965: 0x0101, 0x1966: 0x0321, 0x1967: 0x0329, 0x1968: 0x0051, 0x1969: 0x0339,
+	0x196a: 0x0751, 0x196b: 0x00b9, 0x196c: 0x0089, 0x196d: 0x0341, 0x196e: 0x0349, 0x196f: 0x0391,
+	0x1970: 0x00c1, 0x1971: 0x0109, 0x1972: 0x00c9, 0x1973: 0x04b1, 0x1974: 0x0019, 0x1975: 0x02e9,
+	0x1976: 0x03d9, 0x1977: 0x02f1, 0x1978: 0x02f9, 0x1979: 0x03f1, 0x197a: 0x0309, 0x197b: 0x00a9,
+	0x197c: 0x0311, 0x197d: 0x00b1, 0x197e: 0x0319, 0x197f: 0x0101,
+	// Block 0x66, offset 0x1980
+	0x1980: 0x0321, 0x1981: 0x0329, 0x1982: 0x0051, 0x1983: 0x0339, 0x1984: 0x0751, 0x1985: 0x00b9,
+	0x1986: 0x0089, 0x1987: 0x0341, 0x1988: 0x0349, 0x1989: 0x0391, 0x198a: 0x00c1, 0x198b: 0x0109,
+	0x198c: 0x00c9, 0x198d: 0x04b1, 0x198e: 0x0019, 0x198f: 0x02e9, 0x1990: 0x03d9, 0x1991: 0x02f1,
+	0x1992: 0x02f9, 0x1993: 0x03f1, 0x1994: 0x0309, 0x1995: 0x0040, 0x1996: 0x0311, 0x1997: 0x00b1,
+	0x1998: 0x0319, 0x1999: 0x0101, 0x199a: 0x0321, 0x199b: 0x0329, 0x199c: 0x0051, 0x199d: 0x0339,
+	0x199e: 0x0751, 0x199f: 0x00b9, 0x19a0: 0x0089, 0x19a1: 0x0341, 0x19a2: 0x0349, 0x19a3: 0x0391,
+	0x19a4: 0x00c1, 0x19a5: 0x0109, 0x19a6: 0x00c9, 0x19a7: 0x04b1, 0x19a8: 0x0019, 0x19a9: 0x02e9,
+	0x19aa: 0x03d9, 0x19ab: 0x02f1, 0x19ac: 0x02f9, 0x19ad: 0x03f1, 0x19ae: 0x0309, 0x19af: 0x00a9,
+	0x19b0: 0x0311, 0x19b1: 0x00b1, 0x19b2: 0x0319, 0x19b3: 0x0101, 0x19b4: 0x0321, 0x19b5: 0x0329,
+	0x19b6: 0x0051, 0x19b7: 0x0339, 0x19b8: 0x0751, 0x19b9: 0x00b9, 0x19ba: 0x0089, 0x19bb: 0x0341,
+	0x19bc: 0x0349, 0x19bd: 0x0391, 0x19be: 0x00c1, 0x19bf: 0x0109,
+	// Block 0x67, offset 0x19c0
+	0x19c0: 0x00c9, 0x19c1: 0x04b1, 0x19c2: 0x0019, 0x19c3: 0x02e9, 0x19c4: 0x03d9, 0x19c5: 0x02f1,
+	0x19c6: 0x02f9, 0x19c7: 0x03f1, 0x19c8: 0x0309, 0x19c9: 0x00a9, 0x19ca: 0x0311, 0x19cb: 0x00b1,
+	0x19cc: 0x0319, 0x19cd: 0x0101, 0x19ce: 0x0321, 0x19cf: 0x0329, 0x19d0: 0x0051, 0x19d1: 0x0339,
+	0x19d2: 0x0751, 0x19d3: 0x00b9, 0x19d4: 0x0089, 0x19d5: 0x0341, 0x19d6: 0x0349, 0x19d7: 0x0391,
+	0x19d8: 0x00c1, 0x19d9: 0x0109, 0x19da: 0x00c9, 0x19db: 0x04b1, 0x19dc: 0x0019, 0x19dd: 0x0040,
+	0x19de: 0x03d9, 0x19df: 0x02f1, 0x19e0: 0x0040, 0x19e1: 0x0040, 0x19e2: 0x0309, 0x19e3: 0x0040,
+	0x19e4: 0x0040, 0x19e5: 0x00b1, 0x19e6: 0x0319, 0x19e7: 0x0040, 0x19e8: 0x0040, 0x19e9: 0x0329,
+	0x19ea: 0x0051, 0x19eb: 0x0339, 0x19ec: 0x0751, 0x19ed: 0x0040, 0x19ee: 0x0089, 0x19ef: 0x0341,
+	0x19f0: 0x0349, 0x19f1: 0x0391, 0x19f2: 0x00c1, 0x19f3: 0x0109, 0x19f4: 0x00c9, 0x19f5: 0x04b1,
+	0x19f6: 0x0019, 0x19f7: 0x02e9, 0x19f8: 0x03d9, 0x19f9: 0x02f1, 0x19fa: 0x0040, 0x19fb: 0x03f1,
+	0x19fc: 0x0040, 0x19fd: 0x00a9, 0x19fe: 0x0311, 0x19ff: 0x00b1,
+	// Block 0x68, offset 0x1a00
+	0x1a00: 0x0319, 0x1a01: 0x0101, 0x1a02: 0x0321, 0x1a03: 0x0329, 0x1a04: 0x0040, 0x1a05: 0x0339,
+	0x1a06: 0x0751, 0x1a07: 0x00b9, 0x1a08: 0x0089, 0x1a09: 0x0341, 0x1a0a: 0x0349, 0x1a0b: 0x0391,
+	0x1a0c: 0x00c1, 0x1a0d: 0x0109, 0x1a0e: 0x00c9, 0x1a0f: 0x04b1, 0x1a10: 0x0019, 0x1a11: 0x02e9,
+	0x1a12: 0x03d9, 0x1a13: 0x02f1, 0x1a14: 0x02f9, 0x1a15: 0x03f1, 0x1a16: 0x0309, 0x1a17: 0x00a9,
+	0x1a18: 0x0311, 0x1a19: 0x00b1, 0x1a1a: 0x0319, 0x1a1b: 0x0101, 0x1a1c: 0x0321, 0x1a1d: 0x0329,
+	0x1a1e: 0x0051, 0x1a1f: 0x0339, 0x1a20: 0x0751, 0x1a21: 0x00b9, 0x1a22: 0x0089, 0x1a23: 0x0341,
+	0x1a24: 0x0349, 0x1a25: 0x0391, 0x1a26: 0x00c1, 0x1a27: 0x0109, 0x1a28: 0x00c9, 0x1a29: 0x04b1,
+	0x1a2a: 0x0019, 0x1a2b: 0x02e9, 0x1a2c: 0x03d9, 0x1a2d: 0x02f1, 0x1a2e: 0x02f9, 0x1a2f: 0x03f1,
+	0x1a30: 0x0309, 0x1a31: 0x00a9, 0x1a32: 0x0311, 0x1a33: 0x00b1, 0x1a34: 0x0319, 0x1a35: 0x0101,
+	0x1a36: 0x0321, 0x1a37: 0x0329, 0x1a38: 0x0051, 0x1a39: 0x0339, 0x1a3a: 0x0751, 0x1a3b: 0x00b9,
+	0x1a3c: 0x0089, 0x1a3d: 0x0341, 0x1a3e: 0x0349, 0x1a3f: 0x0391,
+	// Block 0x69, offset 0x1a40
+	0x1a40: 0x00c1, 0x1a41: 0x0109, 0x1a42: 0x00c9, 0x1a43: 0x04b1, 0x1a44: 0x0019, 0x1a45: 0x02e9,
+	0x1a46: 0x0040, 0x1a47: 0x02f1, 0x1a48: 0x02f9, 0x1a49: 0x03f1, 0x1a4a: 0x0309, 0x1a4b: 0x0040,
+	0x1a4c: 0x0040, 0x1a4d: 0x00b1, 0x1a4e: 0x0319, 0x1a4f: 0x0101, 0x1a50: 0x0321, 0x1a51: 0x0329,
+	0x1a52: 0x0051, 0x1a53: 0x0339, 0x1a54: 0x0751, 0x1a55: 0x0040, 0x1a56: 0x0089, 0x1a57: 0x0341,
+	0x1a58: 0x0349, 0x1a59: 0x0391, 0x1a5a: 0x00c1, 0x1a5b: 0x0109, 0x1a5c: 0x00c9, 0x1a5d: 0x0040,
+	0x1a5e: 0x0019, 0x1a5f: 0x02e9, 0x1a60: 0x03d9, 0x1a61: 0x02f1, 0x1a62: 0x02f9, 0x1a63: 0x03f1,
+	0x1a64: 0x0309, 0x1a65: 0x00a9, 0x1a66: 0x0311, 0x1a67: 0x00b1, 0x1a68: 0x0319, 0x1a69: 0x0101,
+	0x1a6a: 0x0321, 0x1a6b: 0x0329, 0x1a6c: 0x0051, 0x1a6d: 0x0339, 0x1a6e: 0x0751, 0x1a6f: 0x00b9,
+	0x1a70: 0x0089, 0x1a71: 0x0341, 0x1a72: 0x0349, 0x1a73: 0x0391, 0x1a74: 0x00c1, 0x1a75: 0x0109,
+	0x1a76: 0x00c9, 0x1a77: 0x04b1, 0x1a78: 0x0019, 0x1a79: 0x02e9, 0x1a7a: 0x0040, 0x1a7b: 0x02f1,
+	0x1a7c: 0x02f9, 0x1a7d: 0x03f1, 0x1a7e: 0x0309, 0x1a7f: 0x0040,
+	// Block 0x6a, offset 0x1a80
+	0x1a80: 0x0311, 0x1a81: 0x00b1, 0x1a82: 0x0319, 0x1a83: 0x0101, 0x1a84: 0x0321, 0x1a85: 0x0040,
+	0x1a86: 0x0051, 0x1a87: 0x0040, 0x1a88: 0x0040, 0x1a89: 0x0040, 0x1a8a: 0x0089, 0x1a8b: 0x0341,
+	0x1a8c: 0x0349, 0x1a8d: 0x0391, 0x1a8e: 0x00c1, 0x1a8f: 0x0109, 0x1a90: 0x00c9, 0x1a91: 0x0040,
+	0x1a92: 0x0019, 0x1a93: 0x02e9, 0x1a94: 0x03d9, 0x1a95: 0x02f1, 0x1a96: 0x02f9, 0x1a97: 0x03f1,
+	0x1a98: 0x0309, 0x1a99: 0x00a9, 0x1a9a: 0x0311, 0x1a9b: 0x00b1, 0x1a9c: 0x0319, 0x1a9d: 0x0101,
+	0x1a9e: 0x0321, 0x1a9f: 0x0329, 0x1aa0: 0x0051, 0x1aa1: 0x0339, 0x1aa2: 0x0751, 0x1aa3: 0x00b9,
+	0x1aa4: 0x0089, 0x1aa5: 0x0341, 0x1aa6: 0x0349, 0x1aa7: 0x0391, 0x1aa8: 0x00c1, 0x1aa9: 0x0109,
+	0x1aaa: 0x00c9, 0x1aab: 0x04b1, 0x1aac: 0x0019, 0x1aad: 0x02e9, 0x1aae: 0x03d9, 0x1aaf: 0x02f1,
+	0x1ab0: 0x02f9, 0x1ab1: 0x03f1, 0x1ab2: 0x0309, 0x1ab3: 0x00a9, 0x1ab4: 0x0311, 0x1ab5: 0x00b1,
+	0x1ab6: 0x0319, 0x1ab7: 0x0101, 0x1ab8: 0x0321, 0x1ab9: 0x0329, 0x1aba: 0x0051, 0x1abb: 0x0339,
+	0x1abc: 0x0751, 0x1abd: 0x00b9, 0x1abe: 0x0089, 0x1abf: 0x0341,
+	// Block 0x6b, offset 0x1ac0
+	0x1ac0: 0x0349, 0x1ac1: 0x0391, 0x1ac2: 0x00c1, 0x1ac3: 0x0109, 0x1ac4: 0x00c9, 0x1ac5: 0x04b1,
+	0x1ac6: 0x0019, 0x1ac7: 0x02e9, 0x1ac8: 0x03d9, 0x1ac9: 0x02f1, 0x1aca: 0x02f9, 0x1acb: 0x03f1,
+	0x1acc: 0x0309, 0x1acd: 0x00a9, 0x1ace: 0x0311, 0x1acf: 0x00b1, 0x1ad0: 0x0319, 0x1ad1: 0x0101,
+	0x1ad2: 0x0321, 0x1ad3: 0x0329, 0x1ad4: 0x0051, 0x1ad5: 0x0339, 0x1ad6: 0x0751, 0x1ad7: 0x00b9,
+	0x1ad8: 0x0089, 0x1ad9: 0x0341, 0x1ada: 0x0349, 0x1adb: 0x0391, 0x1adc: 0x00c1, 0x1add: 0x0109,
+	0x1ade: 0x00c9, 0x1adf: 0x04b1, 0x1ae0: 0x0019, 0x1ae1: 0x02e9, 0x1ae2: 0x03d9, 0x1ae3: 0x02f1,
+	0x1ae4: 0x02f9, 0x1ae5: 0x03f1, 0x1ae6: 0x0309, 0x1ae7: 0x00a9, 0x1ae8: 0x0311, 0x1ae9: 0x00b1,
+	0x1aea: 0x0319, 0x1aeb: 0x0101, 0x1aec: 0x0321, 0x1aed: 0x0329, 0x1aee: 0x0051, 0x1aef: 0x0339,
+	0x1af0: 0x0751, 0x1af1: 0x00b9, 0x1af2: 0x0089, 0x1af3: 0x0341, 0x1af4: 0x0349, 0x1af5: 0x0391,
+	0x1af6: 0x00c1, 0x1af7: 0x0109, 0x1af8: 0x00c9, 0x1af9: 0x04b1, 0x1afa: 0x0019, 0x1afb: 0x02e9,
+	0x1afc: 0x03d9, 0x1afd: 0x02f1, 0x1afe: 0x02f9, 0x1aff: 0x03f1,
+	// Block 0x6c, offset 0x1b00
+	0x1b00: 0x0309, 0x1b01: 0x00a9, 0x1b02: 0x0311, 0x1b03: 0x00b1, 0x1b04: 0x0319, 0x1b05: 0x0101,
+	0x1b06: 0x0321, 0x1b07: 0x0329, 0x1b08: 0x0051, 0x1b09: 0x0339, 0x1b0a: 0x0751, 0x1b0b: 0x00b9,
+	0x1b0c: 0x0089, 0x1b0d: 0x0341, 0x1b0e: 0x0349, 0x1b0f: 0x0391, 0x1b10: 0x00c1, 0x1b11: 0x0109,
+	0x1b12: 0x00c9, 0x1b13: 0x04b1, 0x1b14: 0x0019, 0x1b15: 0x02e9, 0x1b16: 0x03d9, 0x1b17: 0x02f1,
+	0x1b18: 0x02f9, 0x1b19: 0x03f1, 0x1b1a: 0x0309, 0x1b1b: 0x00a9, 0x1b1c: 0x0311, 0x1b1d: 0x00b1,
+	0x1b1e: 0x0319, 0x1b1f: 0x0101, 0x1b20: 0x0321, 0x1b21: 0x0329, 0x1b22: 0x0051, 0x1b23: 0x0339,
+	0x1b24: 0x0751, 0x1b25: 0x00b9, 0x1b26: 0x0089, 0x1b27: 0x0341, 0x1b28: 0x0349, 0x1b29: 0x0391,
+	0x1b2a: 0x00c1, 0x1b2b: 0x0109, 0x1b2c: 0x00c9, 0x1b2d: 0x04b1, 0x1b2e: 0x0019, 0x1b2f: 0x02e9,
+	0x1b30: 0x03d9, 0x1b31: 0x02f1, 0x1b32: 0x02f9, 0x1b33: 0x03f1, 0x1b34: 0x0309, 0x1b35: 0x00a9,
+	0x1b36: 0x0311, 0x1b37: 0x00b1, 0x1b38: 0x0319, 0x1b39: 0x0101, 0x1b3a: 0x0321, 0x1b3b: 0x0329,
+	0x1b3c: 0x0051, 0x1b3d: 0x0339, 0x1b3e: 0x0751, 0x1b3f: 0x00b9,
+	// Block 0x6d, offset 0x1b40
+	0x1b40: 0x0089, 0x1b41: 0x0341, 0x1b42: 0x0349, 0x1b43: 0x0391, 0x1b44: 0x00c1, 0x1b45: 0x0109,
+	0x1b46: 0x00c9, 0x1b47: 0x04b1, 0x1b48: 0x0019, 0x1b49: 0x02e9, 0x1b4a: 0x03d9, 0x1b4b: 0x02f1,
+	0x1b4c: 0x02f9, 0x1b4d: 0x03f1, 0x1b4e: 0x0309, 0x1b4f: 0x00a9, 0x1b50: 0x0311, 0x1b51: 0x00b1,
+	0x1b52: 0x0319, 0x1b53: 0x0101, 0x1b54: 0x0321, 0x1b55: 0x0329, 0x1b56: 0x0051, 0x1b57: 0x0339,
+	0x1b58: 0x0751, 0x1b59: 0x00b9, 0x1b5a: 0x0089, 0x1b5b: 0x0341, 0x1b5c: 0x0349, 0x1b5d: 0x0391,
+	0x1b5e: 0x00c1, 0x1b5f: 0x0109, 0x1b60: 0x00c9, 0x1b61: 0x04b1, 0x1b62: 0x0019, 0x1b63: 0x02e9,
+	0x1b64: 0x03d9, 0x1b65: 0x02f1, 0x1b66: 0x02f9, 0x1b67: 0x03f1, 0x1b68: 0x0309, 0x1b69: 0x00a9,
+	0x1b6a: 0x0311, 0x1b6b: 0x00b1, 0x1b6c: 0x0319, 0x1b6d: 0x0101, 0x1b6e: 0x0321, 0x1b6f: 0x0329,
+	0x1b70: 0x0051, 0x1b71: 0x0339, 0x1b72: 0x0751, 0x1b73: 0x00b9, 0x1b74: 0x0089, 0x1b75: 0x0341,
+	0x1b76: 0x0349, 0x1b77: 0x0391, 0x1b78: 0x00c1, 0x1b79: 0x0109, 0x1b7a: 0x00c9, 0x1b7b: 0x04b1,
+	0x1b7c: 0x0019, 0x1b7d: 0x02e9, 0x1b7e: 0x03d9, 0x1b7f: 0x02f1,
+	// Block 0x6e, offset 0x1b80
+	0x1b80: 0x02f9, 0x1b81: 0x03f1, 0x1b82: 0x0309, 0x1b83: 0x00a9, 0x1b84: 0x0311, 0x1b85: 0x00b1,
+	0x1b86: 0x0319, 0x1b87: 0x0101, 0x1b88: 0x0321, 0x1b89: 0x0329, 0x1b8a: 0x0051, 0x1b8b: 0x0339,
+	0x1b8c: 0x0751, 0x1b8d: 0x00b9, 0x1b8e: 0x0089, 0x1b8f: 0x0341, 0x1b90: 0x0349, 0x1b91: 0x0391,
+	0x1b92: 0x00c1, 0x1b93: 0x0109, 0x1b94: 0x00c9, 0x1b95: 0x04b1, 0x1b96: 0x0019, 0x1b97: 0x02e9,
+	0x1b98: 0x03d9, 0x1b99: 0x02f1, 0x1b9a: 0x02f9, 0x1b9b: 0x03f1, 0x1b9c: 0x0309, 0x1b9d: 0x00a9,
+	0x1b9e: 0x0311, 0x1b9f: 0x00b1, 0x1ba0: 0x0319, 0x1ba1: 0x0101, 0x1ba2: 0x0321, 0x1ba3: 0x0329,
+	0x1ba4: 0x0051, 0x1ba5: 0x0339, 0x1ba6: 0x0751, 0x1ba7: 0x00b9, 0x1ba8: 0x0089, 0x1ba9: 0x0341,
+	0x1baa: 0x0349, 0x1bab: 0x0391, 0x1bac: 0x00c1, 0x1bad: 0x0109, 0x1bae: 0x00c9, 0x1baf: 0x04b1,
+	0x1bb0: 0x0019, 0x1bb1: 0x02e9, 0x1bb2: 0x03d9, 0x1bb3: 0x02f1, 0x1bb4: 0x02f9, 0x1bb5: 0x03f1,
+	0x1bb6: 0x0309, 0x1bb7: 0x00a9, 0x1bb8: 0x0311, 0x1bb9: 0x00b1, 0x1bba: 0x0319, 0x1bbb: 0x0101,
+	0x1bbc: 0x0321, 0x1bbd: 0x0329, 0x1bbe: 0x0051, 0x1bbf: 0x0339,
+	// Block 0x6f, offset 0x1bc0
+	0x1bc0: 0x0751, 0x1bc1: 0x00b9, 0x1bc2: 0x0089, 0x1bc3: 0x0341, 0x1bc4: 0x0349, 0x1bc5: 0x0391,
+	0x1bc6: 0x00c1, 0x1bc7: 0x0109, 0x1bc8: 0x00c9, 0x1bc9: 0x04b1, 0x1bca: 0x0019, 0x1bcb: 0x02e9,
+	0x1bcc: 0x03d9, 0x1bcd: 0x02f1, 0x1bce: 0x02f9, 0x1bcf: 0x03f1, 0x1bd0: 0x0309, 0x1bd1: 0x00a9,
+	0x1bd2: 0x0311, 0x1bd3: 0x00b1, 0x1bd4: 0x0319, 0x1bd5: 0x0101, 0x1bd6: 0x0321, 0x1bd7: 0x0329,
+	0x1bd8: 0x0051, 0x1bd9: 0x0339, 0x1bda: 0x0751, 0x1bdb: 0x00b9, 0x1bdc: 0x0089, 0x1bdd: 0x0341,
+	0x1bde: 0x0349, 0x1bdf: 0x0391, 0x1be0: 0x00c1, 0x1be1: 0x0109, 0x1be2: 0x00c9, 0x1be3: 0x04b1,
+	0x1be4: 0x23e1, 0x1be5: 0x23e9, 0x1be6: 0x0040, 0x1be7: 0x0040, 0x1be8: 0x23f1, 0x1be9: 0x0399,
+	0x1bea: 0x03a1, 0x1beb: 0x03a9, 0x1bec: 0x23f9, 0x1bed: 0x2401, 0x1bee: 0x2409, 0x1bef: 0x04d1,
+	0x1bf0: 0x05f9, 0x1bf1: 0x2411, 0x1bf2: 0x2419, 0x1bf3: 0x2421, 0x1bf4: 0x2429, 0x1bf5: 0x2431,
+	0x1bf6: 0x2439, 0x1bf7: 0x0799, 0x1bf8: 0x03c1, 0x1bf9: 0x04d1, 0x1bfa: 0x2441, 0x1bfb: 0x2449,
+	0x1bfc: 0x2451, 0x1bfd: 0x03b1, 0x1bfe: 0x03b9, 0x1bff: 0x2459,
+	// Block 0x70, offset 0x1c00
+	0x1c00: 0x0769, 0x1c01: 0x2461, 0x1c02: 0x23f1, 0x1c03: 0x0399, 0x1c04: 0x03a1, 0x1c05: 0x03a9,
+	0x1c06: 0x23f9, 0x1c07: 0x2401, 0x1c08: 0x2409, 0x1c09: 0x04d1, 0x1c0a: 0x05f9, 0x1c0b: 0x2411,
+	0x1c0c: 0x2419, 0x1c0d: 0x2421, 0x1c0e: 0x2429, 0x1c0f: 0x2431, 0x1c10: 0x2439, 0x1c11: 0x0799,
+	0x1c12: 0x03c1, 0x1c13: 0x2441, 0x1c14: 0x2441, 0x1c15: 0x2449, 0x1c16: 0x2451, 0x1c17: 0x03b1,
+	0x1c18: 0x03b9, 0x1c19: 0x2459, 0x1c1a: 0x0769, 0x1c1b: 0x2469, 0x1c1c: 0x23f9, 0x1c1d: 0x04d1,
+	0x1c1e: 0x2411, 0x1c1f: 0x03b1, 0x1c20: 0x03c1, 0x1c21: 0x0799, 0x1c22: 0x23f1, 0x1c23: 0x0399,
+	0x1c24: 0x03a1, 0x1c25: 0x03a9, 0x1c26: 0x23f9, 0x1c27: 0x2401, 0x1c28: 0x2409, 0x1c29: 0x04d1,
+	0x1c2a: 0x05f9, 0x1c2b: 0x2411, 0x1c2c: 0x2419, 0x1c2d: 0x2421, 0x1c2e: 0x2429, 0x1c2f: 0x2431,
+	0x1c30: 0x2439, 0x1c31: 0x0799, 0x1c32: 0x03c1, 0x1c33: 0x04d1, 0x1c34: 0x2441, 0x1c35: 0x2449,
+	0x1c36: 0x2451, 0x1c37: 0x03b1, 0x1c38: 0x03b9, 0x1c39: 0x2459, 0x1c3a: 0x0769, 0x1c3b: 0x2461,
+	0x1c3c: 0x23f1, 0x1c3d: 0x0399, 0x1c3e: 0x03a1, 0x1c3f: 0x03a9,
+	// Block 0x71, offset 0x1c40
+	0x1c40: 0x23f9, 0x1c41: 0x2401, 0x1c42: 0x2409, 0x1c43: 0x04d1, 0x1c44: 0x05f9, 0x1c45: 0x2411,
+	0x1c46: 0x2419, 0x1c47: 0x2421, 0x1c48: 0x2429, 0x1c49: 0x2431, 0x1c4a: 0x2439, 0x1c4b: 0x0799,
+	0x1c4c: 0x03c1, 0x1c4d: 0x2441, 0x1c4e: 0x2441, 0x1c4f: 0x2449, 0x1c50: 0x2451, 0x1c51: 0x03b1,
+	0x1c52: 0x03b9, 0x1c53: 0x2459, 0x1c54: 0x0769, 0x1c55: 0x2469, 0x1c56: 0x23f9, 0x1c57: 0x04d1,
+	0x1c58: 0x2411, 0x1c59: 0x03b1, 0x1c5a: 0x03c1, 0x1c5b: 0x0799, 0x1c5c: 0x23f1, 0x1c5d: 0x0399,
+	0x1c5e: 0x03a1, 0x1c5f: 0x03a9, 0x1c60: 0x23f9, 0x1c61: 0x2401, 0x1c62: 0x2409, 0x1c63: 0x04d1,
+	0x1c64: 0x05f9, 0x1c65: 0x2411, 0x1c66: 0x2419, 0x1c67: 0x2421, 0x1c68: 0x2429, 0x1c69: 0x2431,
+	0x1c6a: 0x2439, 0x1c6b: 0x0799, 0x1c6c: 0x03c1, 0x1c6d: 0x04d1, 0x1c6e: 0x2441, 0x1c6f: 0x2449,
+	0x1c70: 0x2451, 0x1c71: 0x03b1, 0x1c72: 0x03b9, 0x1c73: 0x2459, 0x1c74: 0x0769, 0x1c75: 0x2461,
+	0x1c76: 0x23f1, 0x1c77: 0x0399, 0x1c78: 0x03a1, 0x1c79: 0x03a9, 0x1c7a: 0x23f9, 0x1c7b: 0x2401,
+	0x1c7c: 0x2409, 0x1c7d: 0x04d1, 0x1c7e: 0x05f9, 0x1c7f: 0x2411,
+	// Block 0x72, offset 0x1c80
+	0x1c80: 0x2419, 0x1c81: 0x2421, 0x1c82: 0x2429, 0x1c83: 0x2431, 0x1c84: 0x2439, 0x1c85: 0x0799,
+	0x1c86: 0x03c1, 0x1c87: 0x2441, 0x1c88: 0x2441, 0x1c89: 0x2449, 0x1c8a: 0x2451, 0x1c8b: 0x03b1,
+	0x1c8c: 0x03b9, 0x1c8d: 0x2459, 0x1c8e: 0x0769, 0x1c8f: 0x2469, 0x1c90: 0x23f9, 0x1c91: 0x04d1,
+	0x1c92: 0x2411, 0x1c93: 0x03b1, 0x1c94: 0x03c1, 0x1c95: 0x0799, 0x1c96: 0x23f1, 0x1c97: 0x0399,
+	0x1c98: 0x03a1, 0x1c99: 0x03a9, 0x1c9a: 0x23f9, 0x1c9b: 0x2401, 0x1c9c: 0x2409, 0x1c9d: 0x04d1,
+	0x1c9e: 0x05f9, 0x1c9f: 0x2411, 0x1ca0: 0x2419, 0x1ca1: 0x2421, 0x1ca2: 0x2429, 0x1ca3: 0x2431,
+	0x1ca4: 0x2439, 0x1ca5: 0x0799, 0x1ca6: 0x03c1, 0x1ca7: 0x04d1, 0x1ca8: 0x2441, 0x1ca9: 0x2449,
+	0x1caa: 0x2451, 0x1cab: 0x03b1, 0x1cac: 0x03b9, 0x1cad: 0x2459, 0x1cae: 0x0769, 0x1caf: 0x2461,
+	0x1cb0: 0x23f1, 0x1cb1: 0x0399, 0x1cb2: 0x03a1, 0x1cb3: 0x03a9, 0x1cb4: 0x23f9, 0x1cb5: 0x2401,
+	0x1cb6: 0x2409, 0x1cb7: 0x04d1, 0x1cb8: 0x05f9, 0x1cb9: 0x2411, 0x1cba: 0x2419, 0x1cbb: 0x2421,
+	0x1cbc: 0x2429, 0x1cbd: 0x2431, 0x1cbe: 0x2439, 0x1cbf: 0x0799,
+	// Block 0x73, offset 0x1cc0
+	0x1cc0: 0x03c1, 0x1cc1: 0x2441, 0x1cc2: 0x2441, 0x1cc3: 0x2449, 0x1cc4: 0x2451, 0x1cc5: 0x03b1,
+	0x1cc6: 0x03b9, 0x1cc7: 0x2459, 0x1cc8: 0x0769, 0x1cc9: 0x2469, 0x1cca: 0x23f9, 0x1ccb: 0x04d1,
+	0x1ccc: 0x2411, 0x1ccd: 0x03b1, 0x1cce: 0x03c1, 0x1ccf: 0x0799, 0x1cd0: 0x23f1, 0x1cd1: 0x0399,
+	0x1cd2: 0x03a1, 0x1cd3: 0x03a9, 0x1cd4: 0x23f9, 0x1cd5: 0x2401, 0x1cd6: 0x2409, 0x1cd7: 0x04d1,
+	0x1cd8: 0x05f9, 0x1cd9: 0x2411, 0x1cda: 0x2419, 0x1cdb: 0x2421, 0x1cdc: 0x2429, 0x1cdd: 0x2431,
+	0x1cde: 0x2439, 0x1cdf: 0x0799, 0x1ce0: 0x03c1, 0x1ce1: 0x04d1, 0x1ce2: 0x2441, 0x1ce3: 0x2449,
+	0x1ce4: 0x2451, 0x1ce5: 0x03b1, 0x1ce6: 0x03b9, 0x1ce7: 0x2459, 0x1ce8: 0x0769, 0x1ce9: 0x2461,
+	0x1cea: 0x23f1, 0x1ceb: 0x0399, 0x1cec: 0x03a1, 0x1ced: 0x03a9, 0x1cee: 0x23f9, 0x1cef: 0x2401,
+	0x1cf0: 0x2409, 0x1cf1: 0x04d1, 0x1cf2: 0x05f9, 0x1cf3: 0x2411, 0x1cf4: 0x2419, 0x1cf5: 0x2421,
+	0x1cf6: 0x2429, 0x1cf7: 0x2431, 0x1cf8: 0x2439, 0x1cf9: 0x0799, 0x1cfa: 0x03c1, 0x1cfb: 0x2441,
+	0x1cfc: 0x2441, 0x1cfd: 0x2449, 0x1cfe: 0x2451, 0x1cff: 0x03b1,
+	// Block 0x74, offset 0x1d00
+	0x1d00: 0x03b9, 0x1d01: 0x2459, 0x1d02: 0x0769, 0x1d03: 0x2469, 0x1d04: 0x23f9, 0x1d05: 0x04d1,
+	0x1d06: 0x2411, 0x1d07: 0x03b1, 0x1d08: 0x03c1, 0x1d09: 0x0799, 0x1d0a: 0x2471, 0x1d0b: 0x2471,
+	0x1d0c: 0x0040, 0x1d0d: 0x0040, 0x1d0e: 0x06e1, 0x1d0f: 0x0049, 0x1d10: 0x0029, 0x1d11: 0x0031,
+	0x1d12: 0x06e9, 0x1d13: 0x06f1, 0x1d14: 0x06f9, 0x1d15: 0x0701, 0x1d16: 0x0709, 0x1d17: 0x0711,
+	0x1d18: 0x06e1, 0x1d19: 0x0049, 0x1d1a: 0x0029, 0x1d1b: 0x0031, 0x1d1c: 0x06e9, 0x1d1d: 0x06f1,
+	0x1d1e: 0x06f9, 0x1d1f: 0x0701, 0x1d20: 0x0709, 0x1d21: 0x0711, 0x1d22: 0x06e1, 0x1d23: 0x0049,
+	0x1d24: 0x0029, 0x1d25: 0x0031, 0x1d26: 0x06e9, 0x1d27: 0x06f1, 0x1d28: 0x06f9, 0x1d29: 0x0701,
+	0x1d2a: 0x0709, 0x1d2b: 0x0711, 0x1d2c: 0x06e1, 0x1d2d: 0x0049, 0x1d2e: 0x0029, 0x1d2f: 0x0031,
+	0x1d30: 0x06e9, 0x1d31: 0x06f1, 0x1d32: 0x06f9, 0x1d33: 0x0701, 0x1d34: 0x0709, 0x1d35: 0x0711,
+	0x1d36: 0x06e1, 0x1d37: 0x0049, 0x1d38: 0x0029, 0x1d39: 0x0031, 0x1d3a: 0x06e9, 0x1d3b: 0x06f1,
+	0x1d3c: 0x06f9, 0x1d3d: 0x0701, 0x1d3e: 0x0709, 0x1d3f: 0x0711,
+	// Block 0x75, offset 0x1d40
+	0x1d40: 0x3308, 0x1d41: 0x3308, 0x1d42: 0x3308, 0x1d43: 0x3308, 0x1d44: 0x3308, 0x1d45: 0x3308,
+	0x1d46: 0x3308, 0x1d47: 0x0040, 0x1d48: 0x3308, 0x1d49: 0x3308, 0x1d4a: 0x3308, 0x1d4b: 0x3308,
+	0x1d4c: 0x3308, 0x1d4d: 0x3308, 0x1d4e: 0x3308, 0x1d4f: 0x3308, 0x1d50: 0x3308, 0x1d51: 0x3308,
+	0x1d52: 0x3308, 0x1d53: 0x3308, 0x1d54: 0x3308, 0x1d55: 0x3308, 0x1d56: 0x3308, 0x1d57: 0x3308,
+	0x1d58: 0x3308, 0x1d59: 0x0040, 0x1d5a: 0x0040, 0x1d5b: 0x3308, 0x1d5c: 0x3308, 0x1d5d: 0x3308,
+	0x1d5e: 0x3308, 0x1d5f: 0x3308, 0x1d60: 0x3308, 0x1d61: 0x3308, 0x1d62: 0x0040, 0x1d63: 0x3308,
+	0x1d64: 0x3308, 0x1d65: 0x0040, 0x1d66: 0x3308, 0x1d67: 0x3308, 0x1d68: 0x3308, 0x1d69: 0x3308,
+	0x1d6a: 0x3308, 0x1d6b: 0x0040, 0x1d6c: 0x0040, 0x1d6d: 0x0040, 0x1d6e: 0x0040, 0x1d6f: 0x0040,
+	0x1d70: 0x2479, 0x1d71: 0x2481, 0x1d72: 0x02a9, 0x1d73: 0x2489, 0x1d74: 0x02b1, 0x1d75: 0x2491,
+	0x1d76: 0x2499, 0x1d77: 0x24a1, 0x1d78: 0x24a9, 0x1d79: 0x24b1, 0x1d7a: 0x24b9, 0x1d7b: 0x24c1,
+	0x1d7c: 0x02b9, 0x1d7d: 0x24c9, 0x1d7e: 0x24d1, 0x1d7f: 0x02c1,
+	// Block 0x76, offset 0x1d80
+	0x1d80: 0x02c9, 0x1d81: 0x24d9, 0x1d82: 0x24e1, 0x1d83: 0x24e9, 0x1d84: 0x24f1, 0x1d85: 0x24f9,
+	0x1d86: 0x2501, 0x1d87: 0x2509, 0x1d88: 0x2511, 0x1d89: 0x2519, 0x1d8a: 0x2521, 0x1d8b: 0x2529,
+	0x1d8c: 0x2531, 0x1d8d: 0x2539, 0x1d8e: 0x2541, 0x1d8f: 0x2549, 0x1d90: 0x2551, 0x1d91: 0x2479,
+	0x1d92: 0x2481, 0x1d93: 0x02a9, 0x1d94: 0x2489, 0x1d95: 0x02b1, 0x1d96: 0x2491, 0x1d97: 0x2499,
+	0x1d98: 0x24a1, 0x1d99: 0x24a9, 0x1d9a: 0x24b1, 0x1d9b: 0x24b9, 0x1d9c: 0x02b9, 0x1d9d: 0x24c9,
+	0x1d9e: 0x02c1, 0x1d9f: 0x24d9, 0x1da0: 0x24e1, 0x1da1: 0x24e9, 0x1da2: 0x24f1, 0x1da3: 0x24f9,
+	0x1da4: 0x2501, 0x1da5: 0x02d1, 0x1da6: 0x2509, 0x1da7: 0x2559, 0x1da8: 0x2531, 0x1da9: 0x2561,
+	0x1daa: 0x2569, 0x1dab: 0x2571, 0x1dac: 0x2579, 0x1dad: 0x2581, 0x1dae: 0x0040, 0x1daf: 0x0040,
+	0x1db0: 0x0040, 0x1db1: 0x0040, 0x1db2: 0x0040, 0x1db3: 0x0040, 0x1db4: 0x0040, 0x1db5: 0x0040,
+	0x1db6: 0x0040, 0x1db7: 0x0040, 0x1db8: 0x0040, 0x1db9: 0x0040, 0x1dba: 0x0040, 0x1dbb: 0x0040,
+	0x1dbc: 0x0040, 0x1dbd: 0x0040, 0x1dbe: 0x0040, 0x1dbf: 0x0040,
+	// Block 0x77, offset 0x1dc0
+	0x1dc0: 0xe115, 0x1dc1: 0xe115, 0x1dc2: 0xe135, 0x1dc3: 0xe135, 0x1dc4: 0xe115, 0x1dc5: 0xe115,
+	0x1dc6: 0xe175, 0x1dc7: 0xe175, 0x1dc8: 0xe115, 0x1dc9: 0xe115, 0x1dca: 0xe135, 0x1dcb: 0xe135,
+	0x1dcc: 0xe115, 0x1dcd: 0xe115, 0x1dce: 0xe1f5, 0x1dcf: 0xe1f5, 0x1dd0: 0xe115, 0x1dd1: 0xe115,
+	0x1dd2: 0xe135, 0x1dd3: 0xe135, 0x1dd4: 0xe115, 0x1dd5: 0xe115, 0x1dd6: 0xe175, 0x1dd7: 0xe175,
+	0x1dd8: 0xe115, 0x1dd9: 0xe115, 0x1dda: 0xe135, 0x1ddb: 0xe135, 0x1ddc: 0xe115, 0x1ddd: 0xe115,
+	0x1dde: 0x8ca5, 0x1ddf: 0x8ca5, 0x1de0: 0x04b5, 0x1de1: 0x04b5, 0x1de2: 0x0a08, 0x1de3: 0x0a08,
+	0x1de4: 0x0a08, 0x1de5: 0x0a08, 0x1de6: 0x0a08, 0x1de7: 0x0a08, 0x1de8: 0x0a08, 0x1de9: 0x0a08,
+	0x1dea: 0x0a08, 0x1deb: 0x0a08, 0x1dec: 0x0a08, 0x1ded: 0x0a08, 0x1dee: 0x0a08, 0x1def: 0x0a08,
+	0x1df0: 0x0a08, 0x1df1: 0x0a08, 0x1df2: 0x0a08, 0x1df3: 0x0a08, 0x1df4: 0x0a08, 0x1df5: 0x0a08,
+	0x1df6: 0x0a08, 0x1df7: 0x0a08, 0x1df8: 0x0a08, 0x1df9: 0x0a08, 0x1dfa: 0x0a08, 0x1dfb: 0x0a08,
+	0x1dfc: 0x0a08, 0x1dfd: 0x0a08, 0x1dfe: 0x0a08, 0x1dff: 0x0a08,
+	// Block 0x78, offset 0x1e00
+	0x1e00: 0x20b1, 0x1e01: 0x20b9, 0x1e02: 0x20d9, 0x1e03: 0x20f1, 0x1e04: 0x0040, 0x1e05: 0x2189,
+	0x1e06: 0x2109, 0x1e07: 0x20e1, 0x1e08: 0x2131, 0x1e09: 0x2191, 0x1e0a: 0x2161, 0x1e0b: 0x2169,
+	0x1e0c: 0x2171, 0x1e0d: 0x2179, 0x1e0e: 0x2111, 0x1e0f: 0x2141, 0x1e10: 0x2151, 0x1e11: 0x2121,
+	0x1e12: 0x2159, 0x1e13: 0x2101, 0x1e14: 0x2119, 0x1e15: 0x20c9, 0x1e16: 0x20d1, 0x1e17: 0x20e9,
+	0x1e18: 0x20f9, 0x1e19: 0x2129, 0x1e1a: 0x2139, 0x1e1b: 0x2149, 0x1e1c: 0x2589, 0x1e1d: 0x1689,
+	0x1e1e: 0x2591, 0x1e1f: 0x2599, 0x1e20: 0x0040, 0x1e21: 0x20b9, 0x1e22: 0x20d9, 0x1e23: 0x0040,
+	0x1e24: 0x2181, 0x1e25: 0x0040, 0x1e26: 0x0040, 0x1e27: 0x20e1, 0x1e28: 0x0040, 0x1e29: 0x2191,
+	0x1e2a: 0x2161, 0x1e2b: 0x2169, 0x1e2c: 0x2171, 0x1e2d: 0x2179, 0x1e2e: 0x2111, 0x1e2f: 0x2141,
+	0x1e30: 0x2151, 0x1e31: 0x2121, 0x1e32: 0x2159, 0x1e33: 0x0040, 0x1e34: 0x2119, 0x1e35: 0x20c9,
+	0x1e36: 0x20d1, 0x1e37: 0x20e9, 0x1e38: 0x0040, 0x1e39: 0x2129, 0x1e3a: 0x0040, 0x1e3b: 0x2149,
+	0x1e3c: 0x0040, 0x1e3d: 0x0040, 0x1e3e: 0x0040, 0x1e3f: 0x0040,
+	// Block 0x79, offset 0x1e40
+	0x1e40: 0x0040, 0x1e41: 0x0040, 0x1e42: 0x20d9, 0x1e43: 0x0040, 0x1e44: 0x0040, 0x1e45: 0x0040,
+	0x1e46: 0x0040, 0x1e47: 0x20e1, 0x1e48: 0x0040, 0x1e49: 0x2191, 0x1e4a: 0x0040, 0x1e4b: 0x2169,
+	0x1e4c: 0x0040, 0x1e4d: 0x2179, 0x1e4e: 0x2111, 0x1e4f: 0x2141, 0x1e50: 0x0040, 0x1e51: 0x2121,
+	0x1e52: 0x2159, 0x1e53: 0x0040, 0x1e54: 0x2119, 0x1e55: 0x0040, 0x1e56: 0x0040, 0x1e57: 0x20e9,
+	0x1e58: 0x0040, 0x1e59: 0x2129, 0x1e5a: 0x0040, 0x1e5b: 0x2149, 0x1e5c: 0x0040, 0x1e5d: 0x1689,
+	0x1e5e: 0x0040, 0x1e5f: 0x2599, 0x1e60: 0x0040, 0x1e61: 0x20b9, 0x1e62: 0x20d9, 0x1e63: 0x0040,
+	0x1e64: 0x2181, 0x1e65: 0x0040, 0x1e66: 0x0040, 0x1e67: 0x20e1, 0x1e68: 0x2131, 0x1e69: 0x2191,
+	0x1e6a: 0x2161, 0x1e6b: 0x0040, 0x1e6c: 0x2171, 0x1e6d: 0x2179, 0x1e6e: 0x2111, 0x1e6f: 0x2141,
+	0x1e70: 0x2151, 0x1e71: 0x2121, 0x1e72: 0x2159, 0x1e73: 0x0040, 0x1e74: 0x2119, 0x1e75: 0x20c9,
+	0x1e76: 0x20d1, 0x1e77: 0x20e9, 0x1e78: 0x0040, 0x1e79: 0x2129, 0x1e7a: 0x2139, 0x1e7b: 0x2149,
+	0x1e7c: 0x2589, 0x1e7d: 0x0040, 0x1e7e: 0x2591, 0x1e7f: 0x0040,
+	// Block 0x7a, offset 0x1e80
+	0x1e80: 0x20b1, 0x1e81: 0x20b9, 0x1e82: 0x20d9, 0x1e83: 0x20f1, 0x1e84: 0x2181, 0x1e85: 0x2189,
+	0x1e86: 0x2109, 0x1e87: 0x20e1, 0x1e88: 0x2131, 0x1e89: 0x2191, 0x1e8a: 0x0040, 0x1e8b: 0x2169,
+	0x1e8c: 0x2171, 0x1e8d: 0x2179, 0x1e8e: 0x2111, 0x1e8f: 0x2141, 0x1e90: 0x2151, 0x1e91: 0x2121,
+	0x1e92: 0x2159, 0x1e93: 0x2101, 0x1e94: 0x2119, 0x1e95: 0x20c9, 0x1e96: 0x20d1, 0x1e97: 0x20e9,
+	0x1e98: 0x20f9, 0x1e99: 0x2129, 0x1e9a: 0x2139, 0x1e9b: 0x2149, 0x1e9c: 0x0040, 0x1e9d: 0x0040,
+	0x1e9e: 0x0040, 0x1e9f: 0x0040, 0x1ea0: 0x0040, 0x1ea1: 0x20b9, 0x1ea2: 0x20d9, 0x1ea3: 0x20f1,
+	0x1ea4: 0x0040, 0x1ea5: 0x2189, 0x1ea6: 0x2109, 0x1ea7: 0x20e1, 0x1ea8: 0x2131, 0x1ea9: 0x2191,
+	0x1eaa: 0x0040, 0x1eab: 0x2169, 0x1eac: 0x2171, 0x1ead: 0x2179, 0x1eae: 0x2111, 0x1eaf: 0x2141,
+	0x1eb0: 0x2151, 0x1eb1: 0x2121, 0x1eb2: 0x2159, 0x1eb3: 0x2101, 0x1eb4: 0x2119, 0x1eb5: 0x20c9,
+	0x1eb6: 0x20d1, 0x1eb7: 0x20e9, 0x1eb8: 0x20f9, 0x1eb9: 0x2129, 0x1eba: 0x2139, 0x1ebb: 0x2149,
+	0x1ebc: 0x0040, 0x1ebd: 0x0040, 0x1ebe: 0x0040, 0x1ebf: 0x0040,
+	// Block 0x7b, offset 0x1ec0
+	0x1ec0: 0x0040, 0x1ec1: 0x25a2, 0x1ec2: 0x25aa, 0x1ec3: 0x25b2, 0x1ec4: 0x25ba, 0x1ec5: 0x25c2,
+	0x1ec6: 0x25ca, 0x1ec7: 0x25d2, 0x1ec8: 0x25da, 0x1ec9: 0x25e2, 0x1eca: 0x25ea, 0x1ecb: 0x0018,
+	0x1ecc: 0x0018, 0x1ecd: 0x0018, 0x1ece: 0x0018, 0x1ecf: 0x0018, 0x1ed0: 0x25f2, 0x1ed1: 0x25fa,
+	0x1ed2: 0x2602, 0x1ed3: 0x260a, 0x1ed4: 0x2612, 0x1ed5: 0x261a, 0x1ed6: 0x2622, 0x1ed7: 0x262a,
+	0x1ed8: 0x2632, 0x1ed9: 0x263a, 0x1eda: 0x2642, 0x1edb: 0x264a, 0x1edc: 0x2652, 0x1edd: 0x265a,
+	0x1ede: 0x2662, 0x1edf: 0x266a, 0x1ee0: 0x2672, 0x1ee1: 0x267a, 0x1ee2: 0x2682, 0x1ee3: 0x268a,
+	0x1ee4: 0x2692, 0x1ee5: 0x269a, 0x1ee6: 0x26a2, 0x1ee7: 0x26aa, 0x1ee8: 0x26b2, 0x1ee9: 0x26ba,
+	0x1eea: 0x26c1, 0x1eeb: 0x03d9, 0x1eec: 0x00b9, 0x1eed: 0x1239, 0x1eee: 0x26c9, 0x1eef: 0x0018,
+	0x1ef0: 0x0019, 0x1ef1: 0x02e9, 0x1ef2: 0x03d9, 0x1ef3: 0x02f1, 0x1ef4: 0x02f9, 0x1ef5: 0x03f1,
+	0x1ef6: 0x0309, 0x1ef7: 0x00a9, 0x1ef8: 0x0311, 0x1ef9: 0x00b1, 0x1efa: 0x0319, 0x1efb: 0x0101,
+	0x1efc: 0x0321, 0x1efd: 0x0329, 0x1efe: 0x0051, 0x1eff: 0x0339,
+	// Block 0x7c, offset 0x1f00
+	0x1f00: 0x0751, 0x1f01: 0x00b9, 0x1f02: 0x0089, 0x1f03: 0x0341, 0x1f04: 0x0349, 0x1f05: 0x0391,
+	0x1f06: 0x00c1, 0x1f07: 0x0109, 0x1f08: 0x00c9, 0x1f09: 0x04b1, 0x1f0a: 0x26d1, 0x1f0b: 0x11f9,
+	0x1f0c: 0x26d9, 0x1f0d: 0x04d9, 0x1f0e: 0x26e1, 0x1f0f: 0x26e9, 0x1f10: 0x0018, 0x1f11: 0x0018,
+	0x1f12: 0x0018, 0x1f13: 0x0018, 0x1f14: 0x0018, 0x1f15: 0x0018, 0x1f16: 0x0018, 0x1f17: 0x0018,
+	0x1f18: 0x0018, 0x1f19: 0x0018, 0x1f1a: 0x0018, 0x1f1b: 0x0018, 0x1f1c: 0x0018, 0x1f1d: 0x0018,
+	0x1f1e: 0x0018, 0x1f1f: 0x0018, 0x1f20: 0x0018, 0x1f21: 0x0018, 0x1f22: 0x0018, 0x1f23: 0x0018,
+	0x1f24: 0x0018, 0x1f25: 0x0018, 0x1f26: 0x0018, 0x1f27: 0x0018, 0x1f28: 0x0018, 0x1f29: 0x0018,
+	0x1f2a: 0x26f1, 0x1f2b: 0x26f9, 0x1f2c: 0x2701, 0x1f2d: 0x0018, 0x1f2e: 0x0018, 0x1f2f: 0x0018,
+	0x1f30: 0x0018, 0x1f31: 0x0018, 0x1f32: 0x0018, 0x1f33: 0x0018, 0x1f34: 0x0018, 0x1f35: 0x0018,
+	0x1f36: 0x0018, 0x1f37: 0x0018, 0x1f38: 0x0018, 0x1f39: 0x0018, 0x1f3a: 0x0018, 0x1f3b: 0x0018,
+	0x1f3c: 0x0018, 0x1f3d: 0x0018, 0x1f3e: 0x0018, 0x1f3f: 0x0018,
+	// Block 0x7d, offset 0x1f40
+	0x1f40: 0x2711, 0x1f41: 0x2719, 0x1f42: 0x2721, 0x1f43: 0x0040, 0x1f44: 0x0040, 0x1f45: 0x0040,
+	0x1f46: 0x0040, 0x1f47: 0x0040, 0x1f48: 0x0040, 0x1f49: 0x0040, 0x1f4a: 0x0040, 0x1f4b: 0x0040,
+	0x1f4c: 0x0040, 0x1f4d: 0x0040, 0x1f4e: 0x0040, 0x1f4f: 0x0040, 0x1f50: 0x2729, 0x1f51: 0x2731,
+	0x1f52: 0x2739, 0x1f53: 0x2741, 0x1f54: 0x2749, 0x1f55: 0x2751, 0x1f56: 0x2759, 0x1f57: 0x2761,
+	0x1f58: 0x2769, 0x1f59: 0x2771, 0x1f5a: 0x2779, 0x1f5b: 0x2781, 0x1f5c: 0x2789, 0x1f5d: 0x2791,
+	0x1f5e: 0x2799, 0x1f5f: 0x27a1, 0x1f60: 0x27a9, 0x1f61: 0x27b1, 0x1f62: 0x27b9, 0x1f63: 0x27c1,
+	0x1f64: 0x27c9, 0x1f65: 0x27d1, 0x1f66: 0x27d9, 0x1f67: 0x27e1, 0x1f68: 0x27e9, 0x1f69: 0x27f1,
+	0x1f6a: 0x27f9, 0x1f6b: 0x2801, 0x1f6c: 0x2809, 0x1f6d: 0x2811, 0x1f6e: 0x2819, 0x1f6f: 0x2821,
+	0x1f70: 0x2829, 0x1f71: 0x2831, 0x1f72: 0x2839, 0x1f73: 0x2841, 0x1f74: 0x2849, 0x1f75: 0x2851,
+	0x1f76: 0x2859, 0x1f77: 0x2861, 0x1f78: 0x2869, 0x1f79: 0x2871, 0x1f7a: 0x2879, 0x1f7b: 0x2881,
+	0x1f7c: 0x0040, 0x1f7d: 0x0040, 0x1f7e: 0x0040, 0x1f7f: 0x0040,
+	// Block 0x7e, offset 0x1f80
+	0x1f80: 0x28e1, 0x1f81: 0x28e9, 0x1f82: 0x28f1, 0x1f83: 0x8cbd, 0x1f84: 0x28f9, 0x1f85: 0x2901,
+	0x1f86: 0x2909, 0x1f87: 0x2911, 0x1f88: 0x2919, 0x1f89: 0x2921, 0x1f8a: 0x2929, 0x1f8b: 0x2931,
+	0x1f8c: 0x2939, 0x1f8d: 0x8cdd, 0x1f8e: 0x2941, 0x1f8f: 0x2949, 0x1f90: 0x2951, 0x1f91: 0x2959,
+	0x1f92: 0x8cfd, 0x1f93: 0x2961, 0x1f94: 0x2969, 0x1f95: 0x2799, 0x1f96: 0x8d1d, 0x1f97: 0x2971,
+	0x1f98: 0x2979, 0x1f99: 0x2981, 0x1f9a: 0x2989, 0x1f9b: 0x2991, 0x1f9c: 0x8d3d, 0x1f9d: 0x2999,
+	0x1f9e: 0x29a1, 0x1f9f: 0x29a9, 0x1fa0: 0x29b1, 0x1fa1: 0x29b9, 0x1fa2: 0x2871, 0x1fa3: 0x29c1,
+	0x1fa4: 0x29c9, 0x1fa5: 0x29d1, 0x1fa6: 0x29d9, 0x1fa7: 0x29e1, 0x1fa8: 0x29e9, 0x1fa9: 0x29f1,
+	0x1faa: 0x29f9, 0x1fab: 0x2a01, 0x1fac: 0x2a09, 0x1fad: 0x2a11, 0x1fae: 0x2a19, 0x1faf: 0x2a21,
+	0x1fb0: 0x2a29, 0x1fb1: 0x2a31, 0x1fb2: 0x2a31, 0x1fb3: 0x2a31, 0x1fb4: 0x8d5d, 0x1fb5: 0x2a39,
+	0x1fb6: 0x2a41, 0x1fb7: 0x2a49, 0x1fb8: 0x8d7d, 0x1fb9: 0x2a51, 0x1fba: 0x2a59, 0x1fbb: 0x2a61,
+	0x1fbc: 0x2a69, 0x1fbd: 0x2a71, 0x1fbe: 0x2a79, 0x1fbf: 0x2a81,
+	// Block 0x7f, offset 0x1fc0
+	0x1fc0: 0x2a89, 0x1fc1: 0x2a91, 0x1fc2: 0x2a99, 0x1fc3: 0x2aa1, 0x1fc4: 0x2aa9, 0x1fc5: 0x2ab1,
+	0x1fc6: 0x2ab1, 0x1fc7: 0x2ab9, 0x1fc8: 0x2ac1, 0x1fc9: 0x2ac9, 0x1fca: 0x2ad1, 0x1fcb: 0x2ad9,
+	0x1fcc: 0x2ae1, 0x1fcd: 0x2ae9, 0x1fce: 0x2af1, 0x1fcf: 0x2af9, 0x1fd0: 0x2b01, 0x1fd1: 0x2b09,
+	0x1fd2: 0x2b11, 0x1fd3: 0x2b19, 0x1fd4: 0x2b21, 0x1fd5: 0x2b29, 0x1fd6: 0x2b31, 0x1fd7: 0x2b39,
+	0x1fd8: 0x2b41, 0x1fd9: 0x8d9d, 0x1fda: 0x2b49, 0x1fdb: 0x2b51, 0x1fdc: 0x2b59, 0x1fdd: 0x2751,
+	0x1fde: 0x2b61, 0x1fdf: 0x2b69, 0x1fe0: 0x8dbd, 0x1fe1: 0x8ddd, 0x1fe2: 0x2b71, 0x1fe3: 0x2b79,
+	0x1fe4: 0x2b81, 0x1fe5: 0x2b89, 0x1fe6: 0x2b91, 0x1fe7: 0x2b99, 0x1fe8: 0x2040, 0x1fe9: 0x2ba1,
+	0x1fea: 0x2ba9, 0x1feb: 0x2ba9, 0x1fec: 0x8dfd, 0x1fed: 0x2bb1, 0x1fee: 0x2bb9, 0x1fef: 0x2bc1,
+	0x1ff0: 0x2bc9, 0x1ff1: 0x8e1d, 0x1ff2: 0x2bd1, 0x1ff3: 0x2bd9, 0x1ff4: 0x2040, 0x1ff5: 0x2be1,
+	0x1ff6: 0x2be9, 0x1ff7: 0x2bf1, 0x1ff8: 0x2bf9, 0x1ff9: 0x2c01, 0x1ffa: 0x2c09, 0x1ffb: 0x8e3d,
+	0x1ffc: 0x2c11, 0x1ffd: 0x8e5d, 0x1ffe: 0x2c19, 0x1fff: 0x2c21,
+	// Block 0x80, offset 0x2000
+	0x2000: 0x2c29, 0x2001: 0x2c31, 0x2002: 0x2c39, 0x2003: 0x2c41, 0x2004: 0x2c49, 0x2005: 0x2c51,
+	0x2006: 0x2c59, 0x2007: 0x2c61, 0x2008: 0x2c69, 0x2009: 0x8e7d, 0x200a: 0x2c71, 0x200b: 0x2c79,
+	0x200c: 0x2c81, 0x200d: 0x2c89, 0x200e: 0x2c91, 0x200f: 0x8e9d, 0x2010: 0x2c99, 0x2011: 0x8ebd,
+	0x2012: 0x8edd, 0x2013: 0x2ca1, 0x2014: 0x2ca9, 0x2015: 0x2ca9, 0x2016: 0x2cb1, 0x2017: 0x8efd,
+	0x2018: 0x8f1d, 0x2019: 0x2cb9, 0x201a: 0x2cc1, 0x201b: 0x2cc9, 0x201c: 0x2cd1, 0x201d: 0x2cd9,
+	0x201e: 0x2ce1, 0x201f: 0x2ce9, 0x2020: 0x2cf1, 0x2021: 0x2cf9, 0x2022: 0x2d01, 0x2023: 0x2d09,
+	0x2024: 0x8f3d, 0x2025: 0x2d11, 0x2026: 0x2d19, 0x2027: 0x2d21, 0x2028: 0x2d29, 0x2029: 0x2d21,
+	0x202a: 0x2d31, 0x202b: 0x2d39, 0x202c: 0x2d41, 0x202d: 0x2d49, 0x202e: 0x2d51, 0x202f: 0x2d59,
+	0x2030: 0x2d61, 0x2031: 0x2d69, 0x2032: 0x2d71, 0x2033: 0x2d79, 0x2034: 0x2d81, 0x2035: 0x2d89,
+	0x2036: 0x2d91, 0x2037: 0x2d99, 0x2038: 0x8f5d, 0x2039: 0x2da1, 0x203a: 0x2da9, 0x203b: 0x2db1,
+	0x203c: 0x2db9, 0x203d: 0x2dc1, 0x203e: 0x8f7d, 0x203f: 0x2dc9,
+	// Block 0x81, offset 0x2040
+	0x2040: 0x2dd1, 0x2041: 0x2dd9, 0x2042: 0x2de1, 0x2043: 0x2de9, 0x2044: 0x2df1, 0x2045: 0x2df9,
+	0x2046: 0x2e01, 0x2047: 0x2e09, 0x2048: 0x2e11, 0x2049: 0x2e19, 0x204a: 0x8f9d, 0x204b: 0x2e21,
+	0x204c: 0x2e29, 0x204d: 0x2e31, 0x204e: 0x2e39, 0x204f: 0x2e41, 0x2050: 0x2e49, 0x2051: 0x2e51,
+	0x2052: 0x2e59, 0x2053: 0x2e61, 0x2054: 0x2e69, 0x2055: 0x2e71, 0x2056: 0x2e79, 0x2057: 0x2e81,
+	0x2058: 0x2e89, 0x2059: 0x2e91, 0x205a: 0x2e99, 0x205b: 0x2ea1, 0x205c: 0x2ea9, 0x205d: 0x8fbd,
+	0x205e: 0x2eb1, 0x205f: 0x2eb9, 0x2060: 0x2ec1, 0x2061: 0x2ec9, 0x2062: 0x2ed1, 0x2063: 0x8fdd,
+	0x2064: 0x2ed9, 0x2065: 0x2ee1, 0x2066: 0x2ee9, 0x2067: 0x2ef1, 0x2068: 0x2ef9, 0x2069: 0x2f01,
+	0x206a: 0x2f09, 0x206b: 0x2f11, 0x206c: 0x7f0d, 0x206d: 0x2f19, 0x206e: 0x2f21, 0x206f: 0x2f29,
+	0x2070: 0x8ffd, 0x2071: 0x2f31, 0x2072: 0x2f39, 0x2073: 0x2f41, 0x2074: 0x2f49, 0x2075: 0x2f51,
+	0x2076: 0x2f59, 0x2077: 0x901d, 0x2078: 0x903d, 0x2079: 0x905d, 0x207a: 0x2f61, 0x207b: 0x907d,
+	0x207c: 0x2f69, 0x207d: 0x2f71, 0x207e: 0x2f79, 0x207f: 0x2f81,
+	// Block 0x82, offset 0x2080
+	0x2080: 0x2f89, 0x2081: 0x2f91, 0x2082: 0x2f99, 0x2083: 0x2fa1, 0x2084: 0x2fa9, 0x2085: 0x2fb1,
+	0x2086: 0x909d, 0x2087: 0x2fb9, 0x2088: 0x2fc1, 0x2089: 0x2fc9, 0x208a: 0x2fd1, 0x208b: 0x2fd9,
+	0x208c: 0x2fe1, 0x208d: 0x90bd, 0x208e: 0x2fe9, 0x208f: 0x2ff1, 0x2090: 0x90dd, 0x2091: 0x90fd,
+	0x2092: 0x2ff9, 0x2093: 0x3001, 0x2094: 0x3009, 0x2095: 0x3011, 0x2096: 0x3019, 0x2097: 0x3021,
+	0x2098: 0x3029, 0x2099: 0x3031, 0x209a: 0x3039, 0x209b: 0x911d, 0x209c: 0x3041, 0x209d: 0x913d,
+	0x209e: 0x3049, 0x209f: 0x2040, 0x20a0: 0x3051, 0x20a1: 0x3059, 0x20a2: 0x3061, 0x20a3: 0x915d,
+	0x20a4: 0x3069, 0x20a5: 0x3071, 0x20a6: 0x917d, 0x20a7: 0x919d, 0x20a8: 0x3079, 0x20a9: 0x3081,
+	0x20aa: 0x3089, 0x20ab: 0x3091, 0x20ac: 0x3099, 0x20ad: 0x3099, 0x20ae: 0x30a1, 0x20af: 0x30a9,
+	0x20b0: 0x30b1, 0x20b1: 0x30b9, 0x20b2: 0x30c1, 0x20b3: 0x30c9, 0x20b4: 0x30d1, 0x20b5: 0x91bd,
+	0x20b6: 0x30d9, 0x20b7: 0x91dd, 0x20b8: 0x30e1, 0x20b9: 0x91fd, 0x20ba: 0x30e9, 0x20bb: 0x921d,
+	0x20bc: 0x923d, 0x20bd: 0x925d, 0x20be: 0x30f1, 0x20bf: 0x30f9,
+	// Block 0x83, offset 0x20c0
+	0x20c0: 0x3101, 0x20c1: 0x927d, 0x20c2: 0x929d, 0x20c3: 0x92bd, 0x20c4: 0x92dd, 0x20c5: 0x3109,
+	0x20c6: 0x3111, 0x20c7: 0x3111, 0x20c8: 0x3119, 0x20c9: 0x3121, 0x20ca: 0x3129, 0x20cb: 0x3131,
+	0x20cc: 0x3139, 0x20cd: 0x92fd, 0x20ce: 0x3141, 0x20cf: 0x3149, 0x20d0: 0x3151, 0x20d1: 0x3159,
+	0x20d2: 0x931d, 0x20d3: 0x3161, 0x20d4: 0x933d, 0x20d5: 0x935d, 0x20d6: 0x3169, 0x20d7: 0x3171,
+	0x20d8: 0x3179, 0x20d9: 0x3181, 0x20da: 0x3189, 0x20db: 0x3191, 0x20dc: 0x937d, 0x20dd: 0x939d,
+	0x20de: 0x93bd, 0x20df: 0x2040, 0x20e0: 0x3199, 0x20e1: 0x93dd, 0x20e2: 0x31a1, 0x20e3: 0x31a9,
+	0x20e4: 0x31b1, 0x20e5: 0x93fd, 0x20e6: 0x31b9, 0x20e7: 0x31c1, 0x20e8: 0x31c9, 0x20e9: 0x31d1,
+	0x20ea: 0x31d9, 0x20eb: 0x941d, 0x20ec: 0x31e1, 0x20ed: 0x31e9, 0x20ee: 0x31f1, 0x20ef: 0x31f9,
+	0x20f0: 0x3201, 0x20f1: 0x3209, 0x20f2: 0x943d, 0x20f3: 0x945d, 0x20f4: 0x3211, 0x20f5: 0x947d,
+	0x20f6: 0x3219, 0x20f7: 0x949d, 0x20f8: 0x3221, 0x20f9: 0x3229, 0x20fa: 0x3231, 0x20fb: 0x94bd,
+	0x20fc: 0x94dd, 0x20fd: 0x3239, 0x20fe: 0x94fd, 0x20ff: 0x3241,
+	// Block 0x84, offset 0x2100
+	0x2100: 0x951d, 0x2101: 0x3249, 0x2102: 0x3251, 0x2103: 0x3259, 0x2104: 0x3261, 0x2105: 0x3269,
+	0x2106: 0x3271, 0x2107: 0x953d, 0x2108: 0x955d, 0x2109: 0x957d, 0x210a: 0x959d, 0x210b: 0x2ca1,
+	0x210c: 0x3279, 0x210d: 0x3281, 0x210e: 0x3289, 0x210f: 0x3291, 0x2110: 0x3299, 0x2111: 0x32a1,
+	0x2112: 0x32a9, 0x2113: 0x32b1, 0x2114: 0x32b9, 0x2115: 0x32c1, 0x2116: 0x32c9, 0x2117: 0x95bd,
+	0x2118: 0x32d1, 0x2119: 0x32d9, 0x211a: 0x32e1, 0x211b: 0x32e9, 0x211c: 0x32f1, 0x211d: 0x32f9,
+	0x211e: 0x3301, 0x211f: 0x3309, 0x2120: 0x3311, 0x2121: 0x3319, 0x2122: 0x3321, 0x2123: 0x3329,
+	0x2124: 0x95dd, 0x2125: 0x95fd, 0x2126: 0x961d, 0x2127: 0x3331, 0x2128: 0x3339, 0x2129: 0x3341,
+	0x212a: 0x3349, 0x212b: 0x963d, 0x212c: 0x3351, 0x212d: 0x965d, 0x212e: 0x3359, 0x212f: 0x3361,
+	0x2130: 0x967d, 0x2131: 0x969d, 0x2132: 0x3369, 0x2133: 0x3371, 0x2134: 0x3379, 0x2135: 0x3381,
+	0x2136: 0x3389, 0x2137: 0x3391, 0x2138: 0x3399, 0x2139: 0x33a1, 0x213a: 0x33a9, 0x213b: 0x33b1,
+	0x213c: 0x33b9, 0x213d: 0x33c1, 0x213e: 0x33c9, 0x213f: 0x2040,
+	// Block 0x85, offset 0x2140
+	0x2140: 0x33d1, 0x2141: 0x33d9, 0x2142: 0x33e1, 0x2143: 0x33e9, 0x2144: 0x33f1, 0x2145: 0x96bd,
+	0x2146: 0x33f9, 0x2147: 0x3401, 0x2148: 0x3409, 0x2149: 0x3411, 0x214a: 0x3419, 0x214b: 0x96dd,
+	0x214c: 0x96fd, 0x214d: 0x3421, 0x214e: 0x3429, 0x214f: 0x3431, 0x2150: 0x3439, 0x2151: 0x3441,
+	0x2152: 0x3449, 0x2153: 0x971d, 0x2154: 0x3451, 0x2155: 0x3459, 0x2156: 0x3461, 0x2157: 0x3469,
+	0x2158: 0x973d, 0x2159: 0x975d, 0x215a: 0x3471, 0x215b: 0x3479, 0x215c: 0x3481, 0x215d: 0x977d,
+	0x215e: 0x3489, 0x215f: 0x3491, 0x2160: 0x684d, 0x2161: 0x979d, 0x2162: 0x3499, 0x2163: 0x34a1,
+	0x2164: 0x34a9, 0x2165: 0x97bd, 0x2166: 0x34b1, 0x2167: 0x34b9, 0x2168: 0x34c1, 0x2169: 0x34c9,
+	0x216a: 0x34d1, 0x216b: 0x34d9, 0x216c: 0x34e1, 0x216d: 0x97dd, 0x216e: 0x34e9, 0x216f: 0x34f1,
+	0x2170: 0x34f9, 0x2171: 0x97fd, 0x2172: 0x3501, 0x2173: 0x3509, 0x2174: 0x3511, 0x2175: 0x3519,
+	0x2176: 0x7b6d, 0x2177: 0x981d, 0x2178: 0x3521, 0x2179: 0x3529, 0x217a: 0x3531, 0x217b: 0x983d,
+	0x217c: 0x3539, 0x217d: 0x985d, 0x217e: 0x3541, 0x217f: 0x3541,
+	// Block 0x86, offset 0x2180
+	0x2180: 0x3549, 0x2181: 0x987d, 0x2182: 0x3551, 0x2183: 0x3559, 0x2184: 0x3561, 0x2185: 0x3569,
+	0x2186: 0x3571, 0x2187: 0x3579, 0x2188: 0x3581, 0x2189: 0x989d, 0x218a: 0x3589, 0x218b: 0x3591,
+	0x218c: 0x3599, 0x218d: 0x35a1, 0x218e: 0x35a9, 0x218f: 0x35b1, 0x2190: 0x98bd, 0x2191: 0x35b9,
+	0x2192: 0x98dd, 0x2193: 0x98fd, 0x2194: 0x991d, 0x2195: 0x35c1, 0x2196: 0x35c9, 0x2197: 0x35d1,
+	0x2198: 0x35d9, 0x2199: 0x35e1, 0x219a: 0x35e9, 0x219b: 0x35f1, 0x219c: 0x35f9, 0x219d: 0x993d,
+	0x219e: 0x0040, 0x219f: 0x0040, 0x21a0: 0x0040, 0x21a1: 0x0040, 0x21a2: 0x0040, 0x21a3: 0x0040,
+	0x21a4: 0x0040, 0x21a5: 0x0040, 0x21a6: 0x0040, 0x21a7: 0x0040, 0x21a8: 0x0040, 0x21a9: 0x0040,
+	0x21aa: 0x0040, 0x21ab: 0x0040, 0x21ac: 0x0040, 0x21ad: 0x0040, 0x21ae: 0x0040, 0x21af: 0x0040,
+	0x21b0: 0x0040, 0x21b1: 0x0040, 0x21b2: 0x0040, 0x21b3: 0x0040, 0x21b4: 0x0040, 0x21b5: 0x0040,
+	0x21b6: 0x0040, 0x21b7: 0x0040, 0x21b8: 0x0040, 0x21b9: 0x0040, 0x21ba: 0x0040, 0x21bb: 0x0040,
+	0x21bc: 0x0040, 0x21bd: 0x0040, 0x21be: 0x0040, 0x21bf: 0x0040,
+}
+
+// idnaIndex: 39 blocks, 2496 entries, 4992 bytes
+// Block 0 is the zero block.
+var idnaIndex = [2496]uint16{
+	// Block 0x0, offset 0x0
+	// Block 0x1, offset 0x40
+	// Block 0x2, offset 0x80
+	// Block 0x3, offset 0xc0
+	0xc2: 0x01, 0xc3: 0x85, 0xc4: 0x02, 0xc5: 0x03, 0xc6: 0x04, 0xc7: 0x05,
+	0xc8: 0x06, 0xc9: 0x86, 0xca: 0x87, 0xcb: 0x07, 0xcc: 0x88, 0xcd: 0x08, 0xce: 0x09, 0xcf: 0x0a,
+	0xd0: 0x89, 0xd1: 0x0b, 0xd2: 0x0c, 0xd3: 0x0d, 0xd4: 0x0e, 0xd5: 0x8a, 0xd6: 0x8b, 0xd7: 0x8c,
+	0xd8: 0x0f, 0xd9: 0x10, 0xda: 0x8d, 0xdb: 0x11, 0xdc: 0x12, 0xdd: 0x8e, 0xde: 0x8f, 0xdf: 0x90,
+	0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, 0xe4: 0x06, 0xe5: 0x07, 0xe6: 0x07, 0xe7: 0x07,
+	0xe8: 0x07, 0xe9: 0x07, 0xea: 0x08, 0xeb: 0x07, 0xec: 0x07, 0xed: 0x09, 0xee: 0x0a, 0xef: 0x0b,
+	0xf0: 0x20, 0xf1: 0x21, 0xf2: 0x21, 0xf3: 0x23, 0xf4: 0x24,
+	// Block 0x4, offset 0x100
+	0x120: 0x91, 0x121: 0x13, 0x122: 0x14, 0x123: 0x92, 0x124: 0x93, 0x125: 0x15, 0x126: 0x16, 0x127: 0x17,
+	0x128: 0x18, 0x129: 0x19, 0x12a: 0x1a, 0x12b: 0x1b, 0x12c: 0x1c, 0x12d: 0x1d, 0x12e: 0x1e, 0x12f: 0x94,
+	0x130: 0x95, 0x131: 0x1f, 0x132: 0x20, 0x133: 0x21, 0x134: 0x96, 0x135: 0x22, 0x136: 0x97, 0x137: 0x98,
+	0x138: 0x99, 0x139: 0x9a, 0x13a: 0x23, 0x13b: 0x9b, 0x13c: 0x9c, 0x13d: 0x24, 0x13e: 0x25, 0x13f: 0x9d,
+	// Block 0x5, offset 0x140
+	0x140: 0x9e, 0x141: 0x9f, 0x142: 0xa0, 0x143: 0xa1, 0x144: 0xa2, 0x145: 0xa3, 0x146: 0xa4, 0x147: 0xa5,
+	0x148: 0xa6, 0x149: 0xa7, 0x14a: 0xa8, 0x14b: 0xa9, 0x14c: 0xaa, 0x14d: 0xab, 0x14e: 0xac, 0x14f: 0xad,
+	0x150: 0xae, 0x151: 0xa6, 0x152: 0xa6, 0x153: 0xa6, 0x154: 0xa6, 0x155: 0xa6, 0x156: 0xa6, 0x157: 0xa6,
+	0x158: 0xa6, 0x159: 0xaf, 0x15a: 0xb0, 0x15b: 0xb1, 0x15c: 0xb2, 0x15d: 0xb3, 0x15e: 0xb4, 0x15f: 0xb5,
+	0x160: 0xb6, 0x161: 0xb7, 0x162: 0xb8, 0x163: 0xb9, 0x164: 0xba, 0x165: 0xbb, 0x166: 0xbc, 0x167: 0xbd,
+	0x168: 0xbe, 0x169: 0xbf, 0x16a: 0xc0, 0x16b: 0xc1, 0x16c: 0xc2, 0x16d: 0xc3, 0x16e: 0xc4, 0x16f: 0xc5,
+	0x170: 0xc6, 0x171: 0xc7, 0x172: 0xc8, 0x173: 0xc9, 0x174: 0x26, 0x175: 0x27, 0x176: 0x28, 0x177: 0x88,
+	0x178: 0x29, 0x179: 0x29, 0x17a: 0x2a, 0x17b: 0x29, 0x17c: 0xca, 0x17d: 0x2b, 0x17e: 0x2c, 0x17f: 0x2d,
+	// Block 0x6, offset 0x180
+	0x180: 0x2e, 0x181: 0x2f, 0x182: 0x30, 0x183: 0xcb, 0x184: 0x31, 0x185: 0x32, 0x186: 0xcc, 0x187: 0xa2,
+	0x188: 0xcd, 0x189: 0xce, 0x18a: 0xa2, 0x18b: 0xa2, 0x18c: 0xcf, 0x18d: 0xa2, 0x18e: 0xa2, 0x18f: 0xa2,
+	0x190: 0xd0, 0x191: 0x33, 0x192: 0x34, 0x193: 0x35, 0x194: 0xa2, 0x195: 0xa2, 0x196: 0xa2, 0x197: 0xa2,
+	0x198: 0xa2, 0x199: 0xa2, 0x19a: 0xa2, 0x19b: 0xa2, 0x19c: 0xa2, 0x19d: 0xa2, 0x19e: 0xa2, 0x19f: 0xa2,
+	0x1a0: 0xa2, 0x1a1: 0xa2, 0x1a2: 0xa2, 0x1a3: 0xa2, 0x1a4: 0xa2, 0x1a5: 0xa2, 0x1a6: 0xa2, 0x1a7: 0xa2,
+	0x1a8: 0xd1, 0x1a9: 0xd2, 0x1aa: 0xa2, 0x1ab: 0xd3, 0x1ac: 0xa2, 0x1ad: 0xd4, 0x1ae: 0xd5, 0x1af: 0xa2,
+	0x1b0: 0xd6, 0x1b1: 0x36, 0x1b2: 0x29, 0x1b3: 0x37, 0x1b4: 0xd7, 0x1b5: 0xd8, 0x1b6: 0xd9, 0x1b7: 0xda,
+	0x1b8: 0xdb, 0x1b9: 0xdc, 0x1ba: 0xdd, 0x1bb: 0xde, 0x1bc: 0xdf, 0x1bd: 0xe0, 0x1be: 0xe1, 0x1bf: 0x38,
+	// Block 0x7, offset 0x1c0
+	0x1c0: 0x39, 0x1c1: 0xe2, 0x1c2: 0xe3, 0x1c3: 0xe4, 0x1c4: 0xe5, 0x1c5: 0x3a, 0x1c6: 0x3b, 0x1c7: 0xe6,
+	0x1c8: 0xe7, 0x1c9: 0x3c, 0x1ca: 0x3d, 0x1cb: 0x3e, 0x1cc: 0xe8, 0x1cd: 0xe9, 0x1ce: 0x3f, 0x1cf: 0x40,
+	0x1d0: 0xa6, 0x1d1: 0xa6, 0x1d2: 0xa6, 0x1d3: 0xa6, 0x1d4: 0xa6, 0x1d5: 0xa6, 0x1d6: 0xa6, 0x1d7: 0xa6,
+	0x1d8: 0xa6, 0x1d9: 0xa6, 0x1da: 0xa6, 0x1db: 0xa6, 0x1dc: 0xa6, 0x1dd: 0xa6, 0x1de: 0xa6, 0x1df: 0xa6,
+	0x1e0: 0xa6, 0x1e1: 0xa6, 0x1e2: 0xa6, 0x1e3: 0xa6, 0x1e4: 0xa6, 0x1e5: 0xa6, 0x1e6: 0xa6, 0x1e7: 0xa6,
+	0x1e8: 0xa6, 0x1e9: 0xa6, 0x1ea: 0xa6, 0x1eb: 0xa6, 0x1ec: 0xa6, 0x1ed: 0xa6, 0x1ee: 0xa6, 0x1ef: 0xa6,
+	0x1f0: 0xa6, 0x1f1: 0xa6, 0x1f2: 0xa6, 0x1f3: 0xa6, 0x1f4: 0xa6, 0x1f5: 0xa6, 0x1f6: 0xa6, 0x1f7: 0xa6,
+	0x1f8: 0xa6, 0x1f9: 0xa6, 0x1fa: 0xa6, 0x1fb: 0xa6, 0x1fc: 0xa6, 0x1fd: 0xa6, 0x1fe: 0xa6, 0x1ff: 0xa6,
+	// Block 0x8, offset 0x200
+	0x200: 0xa6, 0x201: 0xa6, 0x202: 0xa6, 0x203: 0xa6, 0x204: 0xa6, 0x205: 0xa6, 0x206: 0xa6, 0x207: 0xa6,
+	0x208: 0xa6, 0x209: 0xa6, 0x20a: 0xa6, 0x20b: 0xa6, 0x20c: 0xa6, 0x20d: 0xa6, 0x20e: 0xa6, 0x20f: 0xa6,
+	0x210: 0xa6, 0x211: 0xa6, 0x212: 0xa6, 0x213: 0xa6, 0x214: 0xa6, 0x215: 0xa6, 0x216: 0xa6, 0x217: 0xa6,
+	0x218: 0xa6, 0x219: 0xa6, 0x21a: 0xa6, 0x21b: 0xa6, 0x21c: 0xa6, 0x21d: 0xa6, 0x21e: 0xa6, 0x21f: 0xa6,
+	0x220: 0xa6, 0x221: 0xa6, 0x222: 0xa6, 0x223: 0xa6, 0x224: 0xa6, 0x225: 0xa6, 0x226: 0xa6, 0x227: 0xa6,
+	0x228: 0xa6, 0x229: 0xa6, 0x22a: 0xa6, 0x22b: 0xa6, 0x22c: 0xa6, 0x22d: 0xa6, 0x22e: 0xa6, 0x22f: 0xa6,
+	0x230: 0xa6, 0x231: 0xa6, 0x232: 0xa6, 0x233: 0xa6, 0x234: 0xa6, 0x235: 0xa6, 0x236: 0xa6, 0x237: 0xa2,
+	0x238: 0xa6, 0x239: 0xa6, 0x23a: 0xa6, 0x23b: 0xa6, 0x23c: 0xa6, 0x23d: 0xa6, 0x23e: 0xa6, 0x23f: 0xa6,
+	// Block 0x9, offset 0x240
+	0x240: 0xa6, 0x241: 0xa6, 0x242: 0xa6, 0x243: 0xa6, 0x244: 0xa6, 0x245: 0xa6, 0x246: 0xa6, 0x247: 0xa6,
+	0x248: 0xa6, 0x249: 0xa6, 0x24a: 0xa6, 0x24b: 0xa6, 0x24c: 0xa6, 0x24d: 0xa6, 0x24e: 0xa6, 0x24f: 0xa6,
+	0x250: 0xa6, 0x251: 0xa6, 0x252: 0xa6, 0x253: 0xa6, 0x254: 0xa6, 0x255: 0xa6, 0x256: 0xa6, 0x257: 0xa6,
+	0x258: 0xa6, 0x259: 0xa6, 0x25a: 0xa6, 0x25b: 0xa6, 0x25c: 0xa6, 0x25d: 0xa6, 0x25e: 0xa6, 0x25f: 0xa6,
+	0x260: 0xa6, 0x261: 0xa6, 0x262: 0xa6, 0x263: 0xa6, 0x264: 0xa6, 0x265: 0xa6, 0x266: 0xa6, 0x267: 0xa6,
+	0x268: 0xa6, 0x269: 0xa6, 0x26a: 0xa6, 0x26b: 0xa6, 0x26c: 0xa6, 0x26d: 0xa6, 0x26e: 0xa6, 0x26f: 0xa6,
+	0x270: 0xa6, 0x271: 0xa6, 0x272: 0xa6, 0x273: 0xa6, 0x274: 0xa6, 0x275: 0xa6, 0x276: 0xa6, 0x277: 0xa6,
+	0x278: 0xa6, 0x279: 0xa6, 0x27a: 0xa6, 0x27b: 0xa6, 0x27c: 0xa6, 0x27d: 0xa6, 0x27e: 0xa6, 0x27f: 0xa6,
+	// Block 0xa, offset 0x280
+	0x280: 0xa6, 0x281: 0xa6, 0x282: 0xa6, 0x283: 0xa6, 0x284: 0xa6, 0x285: 0xa6, 0x286: 0xa6, 0x287: 0xa6,
+	0x288: 0xa6, 0x289: 0xa6, 0x28a: 0xa6, 0x28b: 0xa6, 0x28c: 0xa6, 0x28d: 0xa6, 0x28e: 0xa6, 0x28f: 0xa6,
+	0x290: 0xa6, 0x291: 0xa6, 0x292: 0xea, 0x293: 0xeb, 0x294: 0xa6, 0x295: 0xa6, 0x296: 0xa6, 0x297: 0xa6,
+	0x298: 0xec, 0x299: 0x41, 0x29a: 0x42, 0x29b: 0xed, 0x29c: 0x43, 0x29d: 0x44, 0x29e: 0x45, 0x29f: 0x46,
+	0x2a0: 0xee, 0x2a1: 0xef, 0x2a2: 0xf0, 0x2a3: 0xf1, 0x2a4: 0xf2, 0x2a5: 0xf3, 0x2a6: 0xf4, 0x2a7: 0xf5,
+	0x2a8: 0xf6, 0x2a9: 0xf7, 0x2aa: 0xf8, 0x2ab: 0xf9, 0x2ac: 0xfa, 0x2ad: 0xfb, 0x2ae: 0xfc, 0x2af: 0xfd,
+	0x2b0: 0xa6, 0x2b1: 0xa6, 0x2b2: 0xa6, 0x2b3: 0xa6, 0x2b4: 0xa6, 0x2b5: 0xa6, 0x2b6: 0xa6, 0x2b7: 0xa6,
+	0x2b8: 0xa6, 0x2b9: 0xa6, 0x2ba: 0xa6, 0x2bb: 0xa6, 0x2bc: 0xa6, 0x2bd: 0xa6, 0x2be: 0xa6, 0x2bf: 0xa6,
+	// Block 0xb, offset 0x2c0
+	0x2c0: 0xa6, 0x2c1: 0xa6, 0x2c2: 0xa6, 0x2c3: 0xa6, 0x2c4: 0xa6, 0x2c5: 0xa6, 0x2c6: 0xa6, 0x2c7: 0xa6,
+	0x2c8: 0xa6, 0x2c9: 0xa6, 0x2ca: 0xa6, 0x2cb: 0xa6, 0x2cc: 0xa6, 0x2cd: 0xa6, 0x2ce: 0xa6, 0x2cf: 0xa6,
+	0x2d0: 0xa6, 0x2d1: 0xa6, 0x2d2: 0xa6, 0x2d3: 0xa6, 0x2d4: 0xa6, 0x2d5: 0xa6, 0x2d6: 0xa6, 0x2d7: 0xa6,
+	0x2d8: 0xa6, 0x2d9: 0xa6, 0x2da: 0xa6, 0x2db: 0xa6, 0x2dc: 0xa6, 0x2dd: 0xa6, 0x2de: 0xfe, 0x2df: 0xff,
+	// Block 0xc, offset 0x300
+	0x300: 0x100, 0x301: 0x100, 0x302: 0x100, 0x303: 0x100, 0x304: 0x100, 0x305: 0x100, 0x306: 0x100, 0x307: 0x100,
+	0x308: 0x100, 0x309: 0x100, 0x30a: 0x100, 0x30b: 0x100, 0x30c: 0x100, 0x30d: 0x100, 0x30e: 0x100, 0x30f: 0x100,
+	0x310: 0x100, 0x311: 0x100, 0x312: 0x100, 0x313: 0x100, 0x314: 0x100, 0x315: 0x100, 0x316: 0x100, 0x317: 0x100,
+	0x318: 0x100, 0x319: 0x100, 0x31a: 0x100, 0x31b: 0x100, 0x31c: 0x100, 0x31d: 0x100, 0x31e: 0x100, 0x31f: 0x100,
+	0x320: 0x100, 0x321: 0x100, 0x322: 0x100, 0x323: 0x100, 0x324: 0x100, 0x325: 0x100, 0x326: 0x100, 0x327: 0x100,
+	0x328: 0x100, 0x329: 0x100, 0x32a: 0x100, 0x32b: 0x100, 0x32c: 0x100, 0x32d: 0x100, 0x32e: 0x100, 0x32f: 0x100,
+	0x330: 0x100, 0x331: 0x100, 0x332: 0x100, 0x333: 0x100, 0x334: 0x100, 0x335: 0x100, 0x336: 0x100, 0x337: 0x100,
+	0x338: 0x100, 0x339: 0x100, 0x33a: 0x100, 0x33b: 0x100, 0x33c: 0x100, 0x33d: 0x100, 0x33e: 0x100, 0x33f: 0x100,
+	// Block 0xd, offset 0x340
+	0x340: 0x100, 0x341: 0x100, 0x342: 0x100, 0x343: 0x100, 0x344: 0x100, 0x345: 0x100, 0x346: 0x100, 0x347: 0x100,
+	0x348: 0x100, 0x349: 0x100, 0x34a: 0x100, 0x34b: 0x100, 0x34c: 0x100, 0x34d: 0x100, 0x34e: 0x100, 0x34f: 0x100,
+	0x350: 0x100, 0x351: 0x100, 0x352: 0x100, 0x353: 0x100, 0x354: 0x100, 0x355: 0x100, 0x356: 0x100, 0x357: 0x100,
+	0x358: 0x100, 0x359: 0x100, 0x35a: 0x100, 0x35b: 0x100, 0x35c: 0x100, 0x35d: 0x100, 0x35e: 0x100, 0x35f: 0x100,
+	0x360: 0x100, 0x361: 0x100, 0x362: 0x100, 0x363: 0x100, 0x364: 0x101, 0x365: 0x102, 0x366: 0x103, 0x367: 0x104,
+	0x368: 0x47, 0x369: 0x105, 0x36a: 0x106, 0x36b: 0x48, 0x36c: 0x49, 0x36d: 0x4a, 0x36e: 0x4b, 0x36f: 0x4c,
+	0x370: 0x107, 0x371: 0x4d, 0x372: 0x4e, 0x373: 0x4f, 0x374: 0x50, 0x375: 0x51, 0x376: 0x108, 0x377: 0x52,
+	0x378: 0x53, 0x379: 0x54, 0x37a: 0x55, 0x37b: 0x56, 0x37c: 0x57, 0x37d: 0x58, 0x37e: 0x59, 0x37f: 0x5a,
+	// Block 0xe, offset 0x380
+	0x380: 0x109, 0x381: 0x10a, 0x382: 0xa6, 0x383: 0x10b, 0x384: 0x10c, 0x385: 0xa2, 0x386: 0x10d, 0x387: 0x10e,
+	0x388: 0x100, 0x389: 0x100, 0x38a: 0x10f, 0x38b: 0x110, 0x38c: 0x111, 0x38d: 0x112, 0x38e: 0x113, 0x38f: 0x114,
+	0x390: 0x115, 0x391: 0xa6, 0x392: 0x116, 0x393: 0x117, 0x394: 0x118, 0x395: 0x5b, 0x396: 0x5c, 0x397: 0x100,
+	0x398: 0xa6, 0x399: 0xa6, 0x39a: 0xa6, 0x39b: 0xa6, 0x39c: 0x119, 0x39d: 0x11a, 0x39e: 0x5d, 0x39f: 0x100,
+	0x3a0: 0x11b, 0x3a1: 0x11c, 0x3a2: 0x11d, 0x3a3: 0x11e, 0x3a4: 0x11f, 0x3a5: 0x100, 0x3a6: 0x120, 0x3a7: 0x121,
+	0x3a8: 0x122, 0x3a9: 0x123, 0x3aa: 0x124, 0x3ab: 0x5e, 0x3ac: 0x125, 0x3ad: 0x126, 0x3ae: 0x5f, 0x3af: 0x100,
+	0x3b0: 0x127, 0x3b1: 0x128, 0x3b2: 0x129, 0x3b3: 0x12a, 0x3b4: 0x12b, 0x3b5: 0x100, 0x3b6: 0x100, 0x3b7: 0x100,
+	0x3b8: 0x100, 0x3b9: 0x12c, 0x3ba: 0x12d, 0x3bb: 0x12e, 0x3bc: 0x12f, 0x3bd: 0x130, 0x3be: 0x131, 0x3bf: 0x132,
+	// Block 0xf, offset 0x3c0
+	0x3c0: 0x133, 0x3c1: 0x134, 0x3c2: 0x135, 0x3c3: 0x136, 0x3c4: 0x137, 0x3c5: 0x138, 0x3c6: 0x139, 0x3c7: 0x13a,
+	0x3c8: 0x13b, 0x3c9: 0x13c, 0x3ca: 0x13d, 0x3cb: 0x13e, 0x3cc: 0x60, 0x3cd: 0x61, 0x3ce: 0x100, 0x3cf: 0x100,
+	0x3d0: 0x13f, 0x3d1: 0x140, 0x3d2: 0x141, 0x3d3: 0x142, 0x3d4: 0x100, 0x3d5: 0x100, 0x3d6: 0x143, 0x3d7: 0x144,
+	0x3d8: 0x145, 0x3d9: 0x146, 0x3da: 0x147, 0x3db: 0x148, 0x3dc: 0x149, 0x3dd: 0x14a, 0x3de: 0x100, 0x3df: 0x100,
+	0x3e0: 0x14b, 0x3e1: 0x100, 0x3e2: 0x14c, 0x3e3: 0x14d, 0x3e4: 0x62, 0x3e5: 0x14e, 0x3e6: 0x14f, 0x3e7: 0x150,
+	0x3e8: 0x151, 0x3e9: 0x152, 0x3ea: 0x153, 0x3eb: 0x154, 0x3ec: 0x155, 0x3ed: 0x100, 0x3ee: 0x100, 0x3ef: 0x100,
+	0x3f0: 0x156, 0x3f1: 0x157, 0x3f2: 0x158, 0x3f3: 0x100, 0x3f4: 0x159, 0x3f5: 0x15a, 0x3f6: 0x15b, 0x3f7: 0x100,
+	0x3f8: 0x100, 0x3f9: 0x100, 0x3fa: 0x100, 0x3fb: 0x15c, 0x3fc: 0x15d, 0x3fd: 0x15e, 0x3fe: 0x15f, 0x3ff: 0x160,
+	// Block 0x10, offset 0x400
+	0x400: 0xa6, 0x401: 0xa6, 0x402: 0xa6, 0x403: 0xa6, 0x404: 0xa6, 0x405: 0xa6, 0x406: 0xa6, 0x407: 0xa6,
+	0x408: 0xa6, 0x409: 0xa6, 0x40a: 0xa6, 0x40b: 0xa6, 0x40c: 0xa6, 0x40d: 0xa6, 0x40e: 0x161, 0x40f: 0x100,
+	0x410: 0xa2, 0x411: 0x162, 0x412: 0xa6, 0x413: 0xa6, 0x414: 0xa6, 0x415: 0x163, 0x416: 0x100, 0x417: 0x100,
+	0x418: 0x100, 0x419: 0x100, 0x41a: 0x100, 0x41b: 0x100, 0x41c: 0x100, 0x41d: 0x100, 0x41e: 0x100, 0x41f: 0x100,
+	0x420: 0x100, 0x421: 0x100, 0x422: 0x100, 0x423: 0x100, 0x424: 0x100, 0x425: 0x100, 0x426: 0x100, 0x427: 0x100,
+	0x428: 0x100, 0x429: 0x100, 0x42a: 0x100, 0x42b: 0x100, 0x42c: 0x100, 0x42d: 0x100, 0x42e: 0x100, 0x42f: 0x100,
+	0x430: 0x100, 0x431: 0x100, 0x432: 0x100, 0x433: 0x100, 0x434: 0x100, 0x435: 0x100, 0x436: 0x100, 0x437: 0x100,
+	0x438: 0x100, 0x439: 0x100, 0x43a: 0x100, 0x43b: 0x100, 0x43c: 0x100, 0x43d: 0x100, 0x43e: 0x164, 0x43f: 0x165,
+	// Block 0x11, offset 0x440
+	0x440: 0xa6, 0x441: 0xa6, 0x442: 0xa6, 0x443: 0xa6, 0x444: 0xa6, 0x445: 0xa6, 0x446: 0xa6, 0x447: 0xa6,
+	0x448: 0xa6, 0x449: 0xa6, 0x44a: 0xa6, 0x44b: 0xa6, 0x44c: 0xa6, 0x44d: 0xa6, 0x44e: 0xa6, 0x44f: 0xa6,
+	0x450: 0x166, 0x451: 0x167, 0x452: 0x100, 0x453: 0x100, 0x454: 0x100, 0x455: 0x100, 0x456: 0x100, 0x457: 0x100,
+	0x458: 0x100, 0x459: 0x100, 0x45a: 0x100, 0x45b: 0x100, 0x45c: 0x100, 0x45d: 0x100, 0x45e: 0x100, 0x45f: 0x100,
+	0x460: 0x100, 0x461: 0x100, 0x462: 0x100, 0x463: 0x100, 0x464: 0x100, 0x465: 0x100, 0x466: 0x100, 0x467: 0x100,
+	0x468: 0x100, 0x469: 0x100, 0x46a: 0x100, 0x46b: 0x100, 0x46c: 0x100, 0x46d: 0x100, 0x46e: 0x100, 0x46f: 0x100,
+	0x470: 0x100, 0x471: 0x100, 0x472: 0x100, 0x473: 0x100, 0x474: 0x100, 0x475: 0x100, 0x476: 0x100, 0x477: 0x100,
+	0x478: 0x100, 0x479: 0x100, 0x47a: 0x100, 0x47b: 0x100, 0x47c: 0x100, 0x47d: 0x100, 0x47e: 0x100, 0x47f: 0x100,
+	// Block 0x12, offset 0x480
+	0x480: 0x100, 0x481: 0x100, 0x482: 0x100, 0x483: 0x100, 0x484: 0x100, 0x485: 0x100, 0x486: 0x100, 0x487: 0x100,
+	0x488: 0x100, 0x489: 0x100, 0x48a: 0x100, 0x48b: 0x100, 0x48c: 0x100, 0x48d: 0x100, 0x48e: 0x100, 0x48f: 0x100,
+	0x490: 0xa6, 0x491: 0xa6, 0x492: 0xa6, 0x493: 0xa6, 0x494: 0xa6, 0x495: 0xa6, 0x496: 0xa6, 0x497: 0xa6,
+	0x498: 0xa6, 0x499: 0x14a, 0x49a: 0x100, 0x49b: 0x100, 0x49c: 0x100, 0x49d: 0x100, 0x49e: 0x100, 0x49f: 0x100,
+	0x4a0: 0x100, 0x4a1: 0x100, 0x4a2: 0x100, 0x4a3: 0x100, 0x4a4: 0x100, 0x4a5: 0x100, 0x4a6: 0x100, 0x4a7: 0x100,
+	0x4a8: 0x100, 0x4a9: 0x100, 0x4aa: 0x100, 0x4ab: 0x100, 0x4ac: 0x100, 0x4ad: 0x100, 0x4ae: 0x100, 0x4af: 0x100,
+	0x4b0: 0x100, 0x4b1: 0x100, 0x4b2: 0x100, 0x4b3: 0x100, 0x4b4: 0x100, 0x4b5: 0x100, 0x4b6: 0x100, 0x4b7: 0x100,
+	0x4b8: 0x100, 0x4b9: 0x100, 0x4ba: 0x100, 0x4bb: 0x100, 0x4bc: 0x100, 0x4bd: 0x100, 0x4be: 0x100, 0x4bf: 0x100,
+	// Block 0x13, offset 0x4c0
+	0x4c0: 0x100, 0x4c1: 0x100, 0x4c2: 0x100, 0x4c3: 0x100, 0x4c4: 0x100, 0x4c5: 0x100, 0x4c6: 0x100, 0x4c7: 0x100,
+	0x4c8: 0x100, 0x4c9: 0x100, 0x4ca: 0x100, 0x4cb: 0x100, 0x4cc: 0x100, 0x4cd: 0x100, 0x4ce: 0x100, 0x4cf: 0x100,
+	0x4d0: 0x100, 0x4d1: 0x100, 0x4d2: 0x100, 0x4d3: 0x100, 0x4d4: 0x100, 0x4d5: 0x100, 0x4d6: 0x100, 0x4d7: 0x100,
+	0x4d8: 0x100, 0x4d9: 0x100, 0x4da: 0x100, 0x4db: 0x100, 0x4dc: 0x100, 0x4dd: 0x100, 0x4de: 0x100, 0x4df: 0x100,
+	0x4e0: 0xa6, 0x4e1: 0xa6, 0x4e2: 0xa6, 0x4e3: 0xa6, 0x4e4: 0xa6, 0x4e5: 0xa6, 0x4e6: 0xa6, 0x4e7: 0xa6,
+	0x4e8: 0x154, 0x4e9: 0x168, 0x4ea: 0x169, 0x4eb: 0x16a, 0x4ec: 0x16b, 0x4ed: 0x16c, 0x4ee: 0x16d, 0x4ef: 0x100,
+	0x4f0: 0x100, 0x4f1: 0x100, 0x4f2: 0x100, 0x4f3: 0x100, 0x4f4: 0x100, 0x4f5: 0x100, 0x4f6: 0x100, 0x4f7: 0x100,
+	0x4f8: 0x100, 0x4f9: 0x16e, 0x4fa: 0x16f, 0x4fb: 0x100, 0x4fc: 0xa6, 0x4fd: 0x170, 0x4fe: 0x171, 0x4ff: 0x172,
+	// Block 0x14, offset 0x500
+	0x500: 0xa6, 0x501: 0xa6, 0x502: 0xa6, 0x503: 0xa6, 0x504: 0xa6, 0x505: 0xa6, 0x506: 0xa6, 0x507: 0xa6,
+	0x508: 0xa6, 0x509: 0xa6, 0x50a: 0xa6, 0x50b: 0xa6, 0x50c: 0xa6, 0x50d: 0xa6, 0x50e: 0xa6, 0x50f: 0xa6,
+	0x510: 0xa6, 0x511: 0xa6, 0x512: 0xa6, 0x513: 0xa6, 0x514: 0xa6, 0x515: 0xa6, 0x516: 0xa6, 0x517: 0xa6,
+	0x518: 0xa6, 0x519: 0xa6, 0x51a: 0xa6, 0x51b: 0xa6, 0x51c: 0xa6, 0x51d: 0xa6, 0x51e: 0xa6, 0x51f: 0x173,
+	0x520: 0xa6, 0x521: 0xa6, 0x522: 0xa6, 0x523: 0xa6, 0x524: 0xa6, 0x525: 0xa6, 0x526: 0xa6, 0x527: 0xa6,
+	0x528: 0xa6, 0x529: 0xa6, 0x52a: 0xa6, 0x52b: 0xa6, 0x52c: 0xa6, 0x52d: 0xa6, 0x52e: 0xa6, 0x52f: 0xa6,
+	0x530: 0xa6, 0x531: 0xa6, 0x532: 0xa6, 0x533: 0x174, 0x534: 0x175, 0x535: 0x100, 0x536: 0x100, 0x537: 0x100,
+	0x538: 0x100, 0x539: 0x100, 0x53a: 0x100, 0x53b: 0x100, 0x53c: 0x100, 0x53d: 0x100, 0x53e: 0x100, 0x53f: 0x100,
+	// Block 0x15, offset 0x540
+	0x540: 0x100, 0x541: 0x100, 0x542: 0x100, 0x543: 0x100, 0x544: 0x100, 0x545: 0x100, 0x546: 0x100, 0x547: 0x100,
+	0x548: 0x100, 0x549: 0x100, 0x54a: 0x100, 0x54b: 0x100, 0x54c: 0x100, 0x54d: 0x100, 0x54e: 0x100, 0x54f: 0x100,
+	0x550: 0x100, 0x551: 0x100, 0x552: 0x100, 0x553: 0x100, 0x554: 0x100, 0x555: 0x100, 0x556: 0x100, 0x557: 0x100,
+	0x558: 0x100, 0x559: 0x100, 0x55a: 0x100, 0x55b: 0x100, 0x55c: 0x100, 0x55d: 0x100, 0x55e: 0x100, 0x55f: 0x100,
+	0x560: 0x100, 0x561: 0x100, 0x562: 0x100, 0x563: 0x100, 0x564: 0x100, 0x565: 0x100, 0x566: 0x100, 0x567: 0x100,
+	0x568: 0x100, 0x569: 0x100, 0x56a: 0x100, 0x56b: 0x100, 0x56c: 0x100, 0x56d: 0x100, 0x56e: 0x100, 0x56f: 0x100,
+	0x570: 0x100, 0x571: 0x100, 0x572: 0x100, 0x573: 0x100, 0x574: 0x100, 0x575: 0x100, 0x576: 0x100, 0x577: 0x100,
+	0x578: 0x100, 0x579: 0x100, 0x57a: 0x100, 0x57b: 0x100, 0x57c: 0x100, 0x57d: 0x100, 0x57e: 0x100, 0x57f: 0x176,
+	// Block 0x16, offset 0x580
+	0x580: 0xa6, 0x581: 0xa6, 0x582: 0xa6, 0x583: 0xa6, 0x584: 0x177, 0x585: 0x178, 0x586: 0xa6, 0x587: 0xa6,
+	0x588: 0xa6, 0x589: 0xa6, 0x58a: 0xa6, 0x58b: 0x179, 0x58c: 0x100, 0x58d: 0x100, 0x58e: 0x100, 0x58f: 0x100,
+	0x590: 0x100, 0x591: 0x100, 0x592: 0x100, 0x593: 0x100, 0x594: 0x100, 0x595: 0x100, 0x596: 0x100, 0x597: 0x100,
+	0x598: 0x100, 0x599: 0x100, 0x59a: 0x100, 0x59b: 0x100, 0x59c: 0x100, 0x59d: 0x100, 0x59e: 0x100, 0x59f: 0x100,
+	0x5a0: 0x100, 0x5a1: 0x100, 0x5a2: 0x100, 0x5a3: 0x100, 0x5a4: 0x100, 0x5a5: 0x100, 0x5a6: 0x100, 0x5a7: 0x100,
+	0x5a8: 0x100, 0x5a9: 0x100, 0x5aa: 0x100, 0x5ab: 0x100, 0x5ac: 0x100, 0x5ad: 0x100, 0x5ae: 0x100, 0x5af: 0x100,
+	0x5b0: 0xa6, 0x5b1: 0x17a, 0x5b2: 0x17b, 0x5b3: 0x100, 0x5b4: 0x100, 0x5b5: 0x100, 0x5b6: 0x100, 0x5b7: 0x100,
+	0x5b8: 0x100, 0x5b9: 0x100, 0x5ba: 0x100, 0x5bb: 0x100, 0x5bc: 0x100, 0x5bd: 0x100, 0x5be: 0x100, 0x5bf: 0x100,
+	// Block 0x17, offset 0x5c0
+	0x5c0: 0x100, 0x5c1: 0x100, 0x5c2: 0x100, 0x5c3: 0x100, 0x5c4: 0x100, 0x5c5: 0x100, 0x5c6: 0x100, 0x5c7: 0x100,
+	0x5c8: 0x100, 0x5c9: 0x100, 0x5ca: 0x100, 0x5cb: 0x100, 0x5cc: 0x100, 0x5cd: 0x100, 0x5ce: 0x100, 0x5cf: 0x100,
+	0x5d0: 0x100, 0x5d1: 0x100, 0x5d2: 0x100, 0x5d3: 0x100, 0x5d4: 0x100, 0x5d5: 0x100, 0x5d6: 0x100, 0x5d7: 0x100,
+	0x5d8: 0x100, 0x5d9: 0x100, 0x5da: 0x100, 0x5db: 0x100, 0x5dc: 0x100, 0x5dd: 0x100, 0x5de: 0x100, 0x5df: 0x100,
+	0x5e0: 0x100, 0x5e1: 0x100, 0x5e2: 0x100, 0x5e3: 0x100, 0x5e4: 0x100, 0x5e5: 0x100, 0x5e6: 0x100, 0x5e7: 0x100,
+	0x5e8: 0x100, 0x5e9: 0x100, 0x5ea: 0x100, 0x5eb: 0x100, 0x5ec: 0x100, 0x5ed: 0x100, 0x5ee: 0x100, 0x5ef: 0x100,
+	0x5f0: 0x100, 0x5f1: 0x100, 0x5f2: 0x100, 0x5f3: 0x100, 0x5f4: 0x100, 0x5f5: 0x100, 0x5f6: 0x100, 0x5f7: 0x100,
+	0x5f8: 0x100, 0x5f9: 0x100, 0x5fa: 0x100, 0x5fb: 0x100, 0x5fc: 0x17c, 0x5fd: 0x17d, 0x5fe: 0xa2, 0x5ff: 0x17e,
+	// Block 0x18, offset 0x600
+	0x600: 0xa2, 0x601: 0xa2, 0x602: 0xa2, 0x603: 0x17f, 0x604: 0x180, 0x605: 0x181, 0x606: 0x182, 0x607: 0x183,
+	0x608: 0xa2, 0x609: 0x184, 0x60a: 0x100, 0x60b: 0x185, 0x60c: 0xa2, 0x60d: 0x186, 0x60e: 0x100, 0x60f: 0x100,
+	0x610: 0x63, 0x611: 0x64, 0x612: 0x65, 0x613: 0x66, 0x614: 0x67, 0x615: 0x68, 0x616: 0x69, 0x617: 0x6a,
+	0x618: 0x6b, 0x619: 0x6c, 0x61a: 0x6d, 0x61b: 0x6e, 0x61c: 0x6f, 0x61d: 0x70, 0x61e: 0x71, 0x61f: 0x72,
+	0x620: 0xa2, 0x621: 0xa2, 0x622: 0xa2, 0x623: 0xa2, 0x624: 0xa2, 0x625: 0xa2, 0x626: 0xa2, 0x627: 0xa2,
+	0x628: 0x187, 0x629: 0x188, 0x62a: 0x189, 0x62b: 0x100, 0x62c: 0x100, 0x62d: 0x100, 0x62e: 0x100, 0x62f: 0x100,
+	0x630: 0x100, 0x631: 0x100, 0x632: 0x100, 0x633: 0x100, 0x634: 0x100, 0x635: 0x100, 0x636: 0x100, 0x637: 0x100,
+	0x638: 0x100, 0x639: 0x100, 0x63a: 0x100, 0x63b: 0x100, 0x63c: 0x18a, 0x63d: 0x100, 0x63e: 0x100, 0x63f: 0x100,
+	// Block 0x19, offset 0x640
+	0x640: 0x73, 0x641: 0x74, 0x642: 0x18b, 0x643: 0x100, 0x644: 0x18c, 0x645: 0x18d, 0x646: 0x100, 0x647: 0x100,
+	0x648: 0x100, 0x649: 0x100, 0x64a: 0x18e, 0x64b: 0x18f, 0x64c: 0x100, 0x64d: 0x100, 0x64e: 0x100, 0x64f: 0x100,
+	0x650: 0x100, 0x651: 0x100, 0x652: 0x100, 0x653: 0x190, 0x654: 0x100, 0x655: 0x100, 0x656: 0x100, 0x657: 0x100,
+	0x658: 0x100, 0x659: 0x100, 0x65a: 0x100, 0x65b: 0x100, 0x65c: 0x100, 0x65d: 0x100, 0x65e: 0x100, 0x65f: 0x191,
+	0x660: 0x127, 0x661: 0x127, 0x662: 0x127, 0x663: 0x192, 0x664: 0x75, 0x665: 0x193, 0x666: 0x100, 0x667: 0x100,
+	0x668: 0x100, 0x669: 0x100, 0x66a: 0x100, 0x66b: 0x100, 0x66c: 0x100, 0x66d: 0x100, 0x66e: 0x100, 0x66f: 0x100,
+	0x670: 0x100, 0x671: 0x194, 0x672: 0x195, 0x673: 0x100, 0x674: 0x196, 0x675: 0x100, 0x676: 0x100, 0x677: 0x100,
+	0x678: 0x76, 0x679: 0x77, 0x67a: 0x78, 0x67b: 0x197, 0x67c: 0x100, 0x67d: 0x100, 0x67e: 0x100, 0x67f: 0x100,
+	// Block 0x1a, offset 0x680
+	0x680: 0x198, 0x681: 0xa2, 0x682: 0x199, 0x683: 0x19a, 0x684: 0x79, 0x685: 0x7a, 0x686: 0x19b, 0x687: 0x19c,
+	0x688: 0x7b, 0x689: 0x19d, 0x68a: 0x100, 0x68b: 0x100, 0x68c: 0xa2, 0x68d: 0xa2, 0x68e: 0xa2, 0x68f: 0xa2,
+	0x690: 0xa2, 0x691: 0xa2, 0x692: 0xa2, 0x693: 0xa2, 0x694: 0xa2, 0x695: 0xa2, 0x696: 0xa2, 0x697: 0xa2,
+	0x698: 0xa2, 0x699: 0xa2, 0x69a: 0xa2, 0x69b: 0x19e, 0x69c: 0xa2, 0x69d: 0x19f, 0x69e: 0xa2, 0x69f: 0x1a0,
+	0x6a0: 0x1a1, 0x6a1: 0x1a2, 0x6a2: 0x1a3, 0x6a3: 0x100, 0x6a4: 0xa2, 0x6a5: 0xa2, 0x6a6: 0xa2, 0x6a7: 0xa2,
+	0x6a8: 0xa2, 0x6a9: 0x1a4, 0x6aa: 0x1a5, 0x6ab: 0x1a6, 0x6ac: 0xa2, 0x6ad: 0xa2, 0x6ae: 0x1a7, 0x6af: 0x1a8,
+	0x6b0: 0x100, 0x6b1: 0x100, 0x6b2: 0x100, 0x6b3: 0x100, 0x6b4: 0x100, 0x6b5: 0x100, 0x6b6: 0x100, 0x6b7: 0x100,
+	0x6b8: 0x100, 0x6b9: 0x100, 0x6ba: 0x100, 0x6bb: 0x100, 0x6bc: 0x100, 0x6bd: 0x100, 0x6be: 0x100, 0x6bf: 0x100,
+	// Block 0x1b, offset 0x6c0
+	0x6c0: 0xa6, 0x6c1: 0xa6, 0x6c2: 0xa6, 0x6c3: 0xa6, 0x6c4: 0xa6, 0x6c5: 0xa6, 0x6c6: 0xa6, 0x6c7: 0xa6,
+	0x6c8: 0xa6, 0x6c9: 0xa6, 0x6ca: 0xa6, 0x6cb: 0xa6, 0x6cc: 0xa6, 0x6cd: 0xa6, 0x6ce: 0xa6, 0x6cf: 0xa6,
+	0x6d0: 0xa6, 0x6d1: 0xa6, 0x6d2: 0xa6, 0x6d3: 0xa6, 0x6d4: 0xa6, 0x6d5: 0xa6, 0x6d6: 0xa6, 0x6d7: 0xa6,
+	0x6d8: 0xa6, 0x6d9: 0xa6, 0x6da: 0xa6, 0x6db: 0x1a9, 0x6dc: 0xa6, 0x6dd: 0xa6, 0x6de: 0xa6, 0x6df: 0xa6,
+	0x6e0: 0xa6, 0x6e1: 0xa6, 0x6e2: 0xa6, 0x6e3: 0xa6, 0x6e4: 0xa6, 0x6e5: 0xa6, 0x6e6: 0xa6, 0x6e7: 0xa6,
+	0x6e8: 0xa6, 0x6e9: 0xa6, 0x6ea: 0xa6, 0x6eb: 0xa6, 0x6ec: 0xa6, 0x6ed: 0xa6, 0x6ee: 0xa6, 0x6ef: 0xa6,
+	0x6f0: 0xa6, 0x6f1: 0xa6, 0x6f2: 0xa6, 0x6f3: 0xa6, 0x6f4: 0xa6, 0x6f5: 0xa6, 0x6f6: 0xa6, 0x6f7: 0xa6,
+	0x6f8: 0xa6, 0x6f9: 0xa6, 0x6fa: 0xa6, 0x6fb: 0xa6, 0x6fc: 0xa6, 0x6fd: 0xa6, 0x6fe: 0xa6, 0x6ff: 0xa6,
+	// Block 0x1c, offset 0x700
+	0x700: 0xa6, 0x701: 0xa6, 0x702: 0xa6, 0x703: 0xa6, 0x704: 0xa6, 0x705: 0xa6, 0x706: 0xa6, 0x707: 0xa6,
+	0x708: 0xa6, 0x709: 0xa6, 0x70a: 0xa6, 0x70b: 0xa6, 0x70c: 0xa6, 0x70d: 0xa6, 0x70e: 0xa6, 0x70f: 0xa6,
+	0x710: 0xa6, 0x711: 0xa6, 0x712: 0xa6, 0x713: 0xa6, 0x714: 0xa6, 0x715: 0xa6, 0x716: 0xa6, 0x717: 0xa6,
+	0x718: 0xa6, 0x719: 0xa6, 0x71a: 0xa6, 0x71b: 0xa6, 0x71c: 0x1aa, 0x71d: 0xa6, 0x71e: 0xa6, 0x71f: 0xa6,
+	0x720: 0x1ab, 0x721: 0xa6, 0x722: 0xa6, 0x723: 0xa6, 0x724: 0xa6, 0x725: 0xa6, 0x726: 0xa6, 0x727: 0xa6,
+	0x728: 0xa6, 0x729: 0xa6, 0x72a: 0xa6, 0x72b: 0xa6, 0x72c: 0xa6, 0x72d: 0xa6, 0x72e: 0xa6, 0x72f: 0xa6,
+	0x730: 0xa6, 0x731: 0xa6, 0x732: 0xa6, 0x733: 0xa6, 0x734: 0xa6, 0x735: 0xa6, 0x736: 0xa6, 0x737: 0xa6,
+	0x738: 0xa6, 0x739: 0xa6, 0x73a: 0xa6, 0x73b: 0xa6, 0x73c: 0xa6, 0x73d: 0xa6, 0x73e: 0xa6, 0x73f: 0xa6,
+	// Block 0x1d, offset 0x740
+	0x740: 0xa6, 0x741: 0xa6, 0x742: 0xa6, 0x743: 0xa6, 0x744: 0xa6, 0x745: 0xa6, 0x746: 0xa6, 0x747: 0xa6,
+	0x748: 0xa6, 0x749: 0xa6, 0x74a: 0xa6, 0x74b: 0xa6, 0x74c: 0xa6, 0x74d: 0xa6, 0x74e: 0xa6, 0x74f: 0xa6,
+	0x750: 0xa6, 0x751: 0xa6, 0x752: 0xa6, 0x753: 0xa6, 0x754: 0xa6, 0x755: 0xa6, 0x756: 0xa6, 0x757: 0xa6,
+	0x758: 0xa6, 0x759: 0xa6, 0x75a: 0xa6, 0x75b: 0xa6, 0x75c: 0xa6, 0x75d: 0xa6, 0x75e: 0xa6, 0x75f: 0xa6,
+	0x760: 0xa6, 0x761: 0xa6, 0x762: 0xa6, 0x763: 0xa6, 0x764: 0xa6, 0x765: 0xa6, 0x766: 0xa6, 0x767: 0xa6,
+	0x768: 0xa6, 0x769: 0xa6, 0x76a: 0xa6, 0x76b: 0xa6, 0x76c: 0xa6, 0x76d: 0xa6, 0x76e: 0xa6, 0x76f: 0xa6,
+	0x770: 0xa6, 0x771: 0xa6, 0x772: 0xa6, 0x773: 0xa6, 0x774: 0xa6, 0x775: 0xa6, 0x776: 0xa6, 0x777: 0xa6,
+	0x778: 0xa6, 0x779: 0xa6, 0x77a: 0x1ac, 0x77b: 0xa6, 0x77c: 0xa6, 0x77d: 0xa6, 0x77e: 0xa6, 0x77f: 0xa6,
+	// Block 0x1e, offset 0x780
+	0x780: 0xa6, 0x781: 0xa6, 0x782: 0xa6, 0x783: 0xa6, 0x784: 0xa6, 0x785: 0xa6, 0x786: 0xa6, 0x787: 0xa6,
+	0x788: 0xa6, 0x789: 0xa6, 0x78a: 0xa6, 0x78b: 0xa6, 0x78c: 0xa6, 0x78d: 0xa6, 0x78e: 0xa6, 0x78f: 0xa6,
+	0x790: 0xa6, 0x791: 0xa6, 0x792: 0xa6, 0x793: 0xa6, 0x794: 0xa6, 0x795: 0xa6, 0x796: 0xa6, 0x797: 0xa6,
+	0x798: 0xa6, 0x799: 0xa6, 0x79a: 0xa6, 0x79b: 0xa6, 0x79c: 0xa6, 0x79d: 0xa6, 0x79e: 0xa6, 0x79f: 0xa6,
+	0x7a0: 0xa6, 0x7a1: 0xa6, 0x7a2: 0xa6, 0x7a3: 0xa6, 0x7a4: 0xa6, 0x7a5: 0xa6, 0x7a6: 0xa6, 0x7a7: 0xa6,
+	0x7a8: 0xa6, 0x7a9: 0xa6, 0x7aa: 0xa6, 0x7ab: 0xa6, 0x7ac: 0xa6, 0x7ad: 0xa6, 0x7ae: 0xa6, 0x7af: 0x1ad,
+	0x7b0: 0x100, 0x7b1: 0x100, 0x7b2: 0x100, 0x7b3: 0x100, 0x7b4: 0x100, 0x7b5: 0x100, 0x7b6: 0x100, 0x7b7: 0x100,
+	0x7b8: 0x100, 0x7b9: 0x100, 0x7ba: 0x100, 0x7bb: 0x100, 0x7bc: 0x100, 0x7bd: 0x100, 0x7be: 0x100, 0x7bf: 0x100,
+	// Block 0x1f, offset 0x7c0
+	0x7c0: 0x100, 0x7c1: 0x100, 0x7c2: 0x100, 0x7c3: 0x100, 0x7c4: 0x100, 0x7c5: 0x100, 0x7c6: 0x100, 0x7c7: 0x100,
+	0x7c8: 0x100, 0x7c9: 0x100, 0x7ca: 0x100, 0x7cb: 0x100, 0x7cc: 0x100, 0x7cd: 0x100, 0x7ce: 0x100, 0x7cf: 0x100,
+	0x7d0: 0x100, 0x7d1: 0x100, 0x7d2: 0x100, 0x7d3: 0x100, 0x7d4: 0x100, 0x7d5: 0x100, 0x7d6: 0x100, 0x7d7: 0x100,
+	0x7d8: 0x100, 0x7d9: 0x100, 0x7da: 0x100, 0x7db: 0x100, 0x7dc: 0x100, 0x7dd: 0x100, 0x7de: 0x100, 0x7df: 0x100,
+	0x7e0: 0x7c, 0x7e1: 0x7d, 0x7e2: 0x7e, 0x7e3: 0x7f, 0x7e4: 0x80, 0x7e5: 0x81, 0x7e6: 0x82, 0x7e7: 0x83,
+	0x7e8: 0x84, 0x7e9: 0x100, 0x7ea: 0x100, 0x7eb: 0x100, 0x7ec: 0x100, 0x7ed: 0x100, 0x7ee: 0x100, 0x7ef: 0x100,
+	0x7f0: 0x100, 0x7f1: 0x100, 0x7f2: 0x100, 0x7f3: 0x100, 0x7f4: 0x100, 0x7f5: 0x100, 0x7f6: 0x100, 0x7f7: 0x100,
+	0x7f8: 0x100, 0x7f9: 0x100, 0x7fa: 0x100, 0x7fb: 0x100, 0x7fc: 0x100, 0x7fd: 0x100, 0x7fe: 0x100, 0x7ff: 0x100,
+	// Block 0x20, offset 0x800
+	0x800: 0xa6, 0x801: 0xa6, 0x802: 0xa6, 0x803: 0xa6, 0x804: 0xa6, 0x805: 0xa6, 0x806: 0xa6, 0x807: 0xa6,
+	0x808: 0xa6, 0x809: 0xa6, 0x80a: 0xa6, 0x80b: 0xa6, 0x80c: 0xa6, 0x80d: 0x1ae, 0x80e: 0xa6, 0x80f: 0xa6,
+	0x810: 0xa6, 0x811: 0xa6, 0x812: 0xa6, 0x813: 0xa6, 0x814: 0xa6, 0x815: 0xa6, 0x816: 0xa6, 0x817: 0xa6,
+	0x818: 0xa6, 0x819: 0xa6, 0x81a: 0xa6, 0x81b: 0xa6, 0x81c: 0xa6, 0x81d: 0xa6, 0x81e: 0xa6, 0x81f: 0xa6,
+	0x820: 0xa6, 0x821: 0xa6, 0x822: 0xa6, 0x823: 0xa6, 0x824: 0xa6, 0x825: 0xa6, 0x826: 0xa6, 0x827: 0xa6,
+	0x828: 0xa6, 0x829: 0xa6, 0x82a: 0xa6, 0x82b: 0xa6, 0x82c: 0xa6, 0x82d: 0xa6, 0x82e: 0xa6, 0x82f: 0xa6,
+	0x830: 0xa6, 0x831: 0xa6, 0x832: 0xa6, 0x833: 0xa6, 0x834: 0xa6, 0x835: 0xa6, 0x836: 0xa6, 0x837: 0xa6,
+	0x838: 0xa6, 0x839: 0xa6, 0x83a: 0xa6, 0x83b: 0xa6, 0x83c: 0xa6, 0x83d: 0xa6, 0x83e: 0xa6, 0x83f: 0xa6,
+	// Block 0x21, offset 0x840
+	0x840: 0xa6, 0x841: 0xa6, 0x842: 0xa6, 0x843: 0xa6, 0x844: 0xa6, 0x845: 0xa6, 0x846: 0xa6, 0x847: 0xa6,
+	0x848: 0xa6, 0x849: 0xa6, 0x84a: 0xa6, 0x84b: 0xa6, 0x84c: 0xa6, 0x84d: 0xa6, 0x84e: 0x1af, 0x84f: 0x100,
+	0x850: 0x100, 0x851: 0x100, 0x852: 0x100, 0x853: 0x100, 0x854: 0x100, 0x855: 0x100, 0x856: 0x100, 0x857: 0x100,
+	0x858: 0x100, 0x859: 0x100, 0x85a: 0x100, 0x85b: 0x100, 0x85c: 0x100, 0x85d: 0x100, 0x85e: 0x100, 0x85f: 0x100,
+	0x860: 0x100, 0x861: 0x100, 0x862: 0x100, 0x863: 0x100, 0x864: 0x100, 0x865: 0x100, 0x866: 0x100, 0x867: 0x100,
+	0x868: 0x100, 0x869: 0x100, 0x86a: 0x100, 0x86b: 0x100, 0x86c: 0x100, 0x86d: 0x100, 0x86e: 0x100, 0x86f: 0x100,
+	0x870: 0x100, 0x871: 0x100, 0x872: 0x100, 0x873: 0x100, 0x874: 0x100, 0x875: 0x100, 0x876: 0x100, 0x877: 0x100,
+	0x878: 0x100, 0x879: 0x100, 0x87a: 0x100, 0x87b: 0x100, 0x87c: 0x100, 0x87d: 0x100, 0x87e: 0x100, 0x87f: 0x100,
+	// Block 0x22, offset 0x880
+	0x890: 0x0c, 0x891: 0x0d, 0x892: 0x0e, 0x893: 0x0f, 0x894: 0x10, 0x895: 0x0a, 0x896: 0x11, 0x897: 0x07,
+	0x898: 0x12, 0x899: 0x0a, 0x89a: 0x13, 0x89b: 0x14, 0x89c: 0x15, 0x89d: 0x16, 0x89e: 0x17, 0x89f: 0x18,
+	0x8a0: 0x07, 0x8a1: 0x07, 0x8a2: 0x07, 0x8a3: 0x07, 0x8a4: 0x07, 0x8a5: 0x07, 0x8a6: 0x07, 0x8a7: 0x07,
+	0x8a8: 0x07, 0x8a9: 0x07, 0x8aa: 0x19, 0x8ab: 0x1a, 0x8ac: 0x1b, 0x8ad: 0x07, 0x8ae: 0x1c, 0x8af: 0x1d,
+	0x8b0: 0x07, 0x8b1: 0x1e, 0x8b2: 0x1f, 0x8b3: 0x0a, 0x8b4: 0x0a, 0x8b5: 0x0a, 0x8b6: 0x0a, 0x8b7: 0x0a,
+	0x8b8: 0x0a, 0x8b9: 0x0a, 0x8ba: 0x0a, 0x8bb: 0x0a, 0x8bc: 0x0a, 0x8bd: 0x0a, 0x8be: 0x0a, 0x8bf: 0x0a,
+	// Block 0x23, offset 0x8c0
+	0x8c0: 0x0a, 0x8c1: 0x0a, 0x8c2: 0x0a, 0x8c3: 0x0a, 0x8c4: 0x0a, 0x8c5: 0x0a, 0x8c6: 0x0a, 0x8c7: 0x0a,
+	0x8c8: 0x0a, 0x8c9: 0x0a, 0x8ca: 0x0a, 0x8cb: 0x0a, 0x8cc: 0x0a, 0x8cd: 0x0a, 0x8ce: 0x0a, 0x8cf: 0x0a,
+	0x8d0: 0x0a, 0x8d1: 0x0a, 0x8d2: 0x0a, 0x8d3: 0x0a, 0x8d4: 0x0a, 0x8d5: 0x0a, 0x8d6: 0x0a, 0x8d7: 0x0a,
+	0x8d8: 0x0a, 0x8d9: 0x0a, 0x8da: 0x0a, 0x8db: 0x0a, 0x8dc: 0x0a, 0x8dd: 0x0a, 0x8de: 0x0a, 0x8df: 0x0a,
+	0x8e0: 0x0a, 0x8e1: 0x0a, 0x8e2: 0x0a, 0x8e3: 0x0a, 0x8e4: 0x0a, 0x8e5: 0x0a, 0x8e6: 0x0a, 0x8e7: 0x0a,
+	0x8e8: 0x0a, 0x8e9: 0x0a, 0x8ea: 0x0a, 0x8eb: 0x0a, 0x8ec: 0x0a, 0x8ed: 0x0a, 0x8ee: 0x0a, 0x8ef: 0x0a,
+	0x8f0: 0x0a, 0x8f1: 0x0a, 0x8f2: 0x0a, 0x8f3: 0x0a, 0x8f4: 0x0a, 0x8f5: 0x0a, 0x8f6: 0x0a, 0x8f7: 0x0a,
+	0x8f8: 0x0a, 0x8f9: 0x0a, 0x8fa: 0x0a, 0x8fb: 0x0a, 0x8fc: 0x0a, 0x8fd: 0x0a, 0x8fe: 0x0a, 0x8ff: 0x0a,
+	// Block 0x24, offset 0x900
+	0x900: 0x1b0, 0x901: 0x1b1, 0x902: 0x100, 0x903: 0x100, 0x904: 0x1b2, 0x905: 0x1b2, 0x906: 0x1b2, 0x907: 0x1b3,
+	0x908: 0x100, 0x909: 0x100, 0x90a: 0x100, 0x90b: 0x100, 0x90c: 0x100, 0x90d: 0x100, 0x90e: 0x100, 0x90f: 0x100,
+	0x910: 0x100, 0x911: 0x100, 0x912: 0x100, 0x913: 0x100, 0x914: 0x100, 0x915: 0x100, 0x916: 0x100, 0x917: 0x100,
+	0x918: 0x100, 0x919: 0x100, 0x91a: 0x100, 0x91b: 0x100, 0x91c: 0x100, 0x91d: 0x100, 0x91e: 0x100, 0x91f: 0x100,
+	0x920: 0x100, 0x921: 0x100, 0x922: 0x100, 0x923: 0x100, 0x924: 0x100, 0x925: 0x100, 0x926: 0x100, 0x927: 0x100,
+	0x928: 0x100, 0x929: 0x100, 0x92a: 0x100, 0x92b: 0x100, 0x92c: 0x100, 0x92d: 0x100, 0x92e: 0x100, 0x92f: 0x100,
+	0x930: 0x100, 0x931: 0x100, 0x932: 0x100, 0x933: 0x100, 0x934: 0x100, 0x935: 0x100, 0x936: 0x100, 0x937: 0x100,
+	0x938: 0x100, 0x939: 0x100, 0x93a: 0x100, 0x93b: 0x100, 0x93c: 0x100, 0x93d: 0x100, 0x93e: 0x100, 0x93f: 0x100,
+	// Block 0x25, offset 0x940
+	0x940: 0x0a, 0x941: 0x0a, 0x942: 0x0a, 0x943: 0x0a, 0x944: 0x0a, 0x945: 0x0a, 0x946: 0x0a, 0x947: 0x0a,
+	0x948: 0x0a, 0x949: 0x0a, 0x94a: 0x0a, 0x94b: 0x0a, 0x94c: 0x0a, 0x94d: 0x0a, 0x94e: 0x0a, 0x94f: 0x0a,
+	0x950: 0x0a, 0x951: 0x0a, 0x952: 0x0a, 0x953: 0x0a, 0x954: 0x0a, 0x955: 0x0a, 0x956: 0x0a, 0x957: 0x0a,
+	0x958: 0x0a, 0x959: 0x0a, 0x95a: 0x0a, 0x95b: 0x0a, 0x95c: 0x0a, 0x95d: 0x0a, 0x95e: 0x0a, 0x95f: 0x0a,
+	0x960: 0x22, 0x961: 0x0a, 0x962: 0x0a, 0x963: 0x0a, 0x964: 0x0a, 0x965: 0x0a, 0x966: 0x0a, 0x967: 0x0a,
+	0x968: 0x0a, 0x969: 0x0a, 0x96a: 0x0a, 0x96b: 0x0a, 0x96c: 0x0a, 0x96d: 0x0a, 0x96e: 0x0a, 0x96f: 0x0a,
+	0x970: 0x0a, 0x971: 0x0a, 0x972: 0x0a, 0x973: 0x0a, 0x974: 0x0a, 0x975: 0x0a, 0x976: 0x0a, 0x977: 0x0a,
+	0x978: 0x0a, 0x979: 0x0a, 0x97a: 0x0a, 0x97b: 0x0a, 0x97c: 0x0a, 0x97d: 0x0a, 0x97e: 0x0a, 0x97f: 0x0a,
+	// Block 0x26, offset 0x980
+	0x980: 0x0a, 0x981: 0x0a, 0x982: 0x0a, 0x983: 0x0a, 0x984: 0x0a, 0x985: 0x0a, 0x986: 0x0a, 0x987: 0x0a,
+	0x988: 0x0a, 0x989: 0x0a, 0x98a: 0x0a, 0x98b: 0x0a, 0x98c: 0x0a, 0x98d: 0x0a, 0x98e: 0x0a, 0x98f: 0x0a,
+}
+
+// idnaSparseOffset: 303 entries, 606 bytes
+var idnaSparseOffset = []uint16{0x0, 0x8, 0x19, 0x25, 0x27, 0x2c, 0x33, 0x3e, 0x4a, 0x4e, 0x5d, 0x62, 0x6c, 0x78, 0x7e, 0x87, 0x97, 0xa6, 0xb1, 0xbe, 0xcf, 0xd9, 0xe0, 0xed, 0xfe, 0x105, 0x110, 0x11f, 0x12d, 0x137, 0x139, 0x13e, 0x141, 0x144, 0x146, 0x152, 0x15d, 0x165, 0x16b, 0x171, 0x176, 0x17b, 0x17e, 0x182, 0x188, 0x18d, 0x198, 0x1a2, 0x1a8, 0x1b9, 0x1c4, 0x1c7, 0x1cf, 0x1d2, 0x1df, 0x1e7, 0x1eb, 0x1f2, 0x1fa, 0x20a, 0x216, 0x219, 0x223, 0x22f, 0x23b, 0x247, 0x24f, 0x254, 0x261, 0x272, 0x27d, 0x282, 0x28b, 0x293, 0x299, 0x29e, 0x2a1, 0x2a5, 0x2ab, 0x2af, 0x2b3, 0x2b7, 0x2bc, 0x2c4, 0x2cb, 0x2d6, 0x2e0, 0x2e4, 0x2e7, 0x2ed, 0x2f1, 0x2f3, 0x2f6, 0x2f8, 0x2fb, 0x305, 0x308, 0x317, 0x31b, 0x31f, 0x321, 0x32a, 0x32e, 0x333, 0x338, 0x33e, 0x34e, 0x354, 0x358, 0x367, 0x36c, 0x374, 0x37e, 0x389, 0x391, 0x3a2, 0x3ab, 0x3bb, 0x3c8, 0x3d4, 0x3d9, 0x3e6, 0x3ea, 0x3ef, 0x3f1, 0x3f3, 0x3f7, 0x3f9, 0x3fd, 0x406, 0x40c, 0x410, 0x420, 0x42a, 0x42f, 0x432, 0x438, 0x43f, 0x444, 0x448, 0x44e, 0x453, 0x45c, 0x461, 0x467, 0x46e, 0x475, 0x47c, 0x480, 0x483, 0x488, 0x494, 0x49a, 0x49f, 0x4a6, 0x4ae, 0x4b3, 0x4b7, 0x4c7, 0x4ce, 0x4d2, 0x4d6, 0x4dd, 0x4df, 0x4e2, 0x4e5, 0x4e9, 0x4f2, 0x4f6, 0x4fe, 0x501, 0x509, 0x514, 0x523, 0x52f, 0x535, 0x542, 0x54e, 0x556, 0x55f, 0x56a, 0x571, 0x580, 0x58d, 0x591, 0x59e, 0x5a7, 0x5ab, 0x5ba, 0x5c2, 0x5cd, 0x5d6, 0x5dc, 0x5e4, 0x5ed, 0x5f9, 0x5fc, 0x608, 0x60b, 0x614, 0x617, 0x61c, 0x625, 0x62a, 0x637, 0x642, 0x64b, 0x656, 0x659, 0x65c, 0x666, 0x66f, 0x67b, 0x688, 0x695, 0x6a3, 0x6aa, 0x6b5, 0x6bc, 0x6c0, 0x6c4, 0x6c7, 0x6cc, 0x6cf, 0x6d2, 0x6d6, 0x6d9, 0x6de, 0x6e5, 0x6e8, 0x6f0, 0x6f4, 0x6ff, 0x702, 0x705, 0x708, 0x70e, 0x714, 0x71d, 0x720, 0x723, 0x726, 0x72e, 0x733, 0x73c, 0x73f, 0x744, 0x74e, 0x752, 0x756, 0x759, 0x75c, 0x760, 0x76f, 0x77b, 0x77f, 0x784, 0x789, 0x78e, 0x792, 0x797, 0x7a0, 0x7a5, 0x7a9, 0x7af, 0x7b5, 0x7ba, 0x7c0, 0x7c6, 0x7d0, 0x7d6, 0x7df, 0x7e2, 0x7e5, 0x7e9, 0x7ed, 0x7f1, 0x7f7, 0x7fd, 0x802, 0x805, 0x815, 0x81c, 0x820, 0x827, 0x82b, 0x831, 0x838, 0x83f, 0x845, 0x84e, 0x852, 0x860, 0x863, 0x866, 0x86a, 0x86e, 0x871, 0x875, 0x878, 0x87d, 0x87f, 0x881}
+
+// idnaSparseValues: 2180 entries, 8720 bytes
+var idnaSparseValues = [2180]valueRange{
+	// Block 0x0, offset 0x0
+	{value: 0x0000, lo: 0x07},
+	{value: 0xe105, lo: 0x80, hi: 0x96},
+	{value: 0x0018, lo: 0x97, hi: 0x97},
+	{value: 0xe105, lo: 0x98, hi: 0x9e},
+	{value: 0x001f, lo: 0x9f, hi: 0x9f},
+	{value: 0x0008, lo: 0xa0, hi: 0xb6},
+	{value: 0x0018, lo: 0xb7, hi: 0xb7},
+	{value: 0x0008, lo: 0xb8, hi: 0xbf},
+	// Block 0x1, offset 0x8
+	{value: 0x0000, lo: 0x10},
+	{value: 0x0008, lo: 0x80, hi: 0x80},
+	{value: 0xe01d, lo: 0x81, hi: 0x81},
+	{value: 0x0008, lo: 0x82, hi: 0x82},
+	{value: 0x0335, lo: 0x83, hi: 0x83},
+	{value: 0x034d, lo: 0x84, hi: 0x84},
+	{value: 0x0365, lo: 0x85, hi: 0x85},
+	{value: 0xe00d, lo: 0x86, hi: 0x86},
+	{value: 0x0008, lo: 0x87, hi: 0x87},
+	{value: 0xe00d, lo: 0x88, hi: 0x88},
+	{value: 0x0008, lo: 0x89, hi: 0x89},
+	{value: 0xe00d, lo: 0x8a, hi: 0x8a},
+	{value: 0x0008, lo: 0x8b, hi: 0x8b},
+	{value: 0xe00d, lo: 0x8c, hi: 0x8c},
+	{value: 0x0008, lo: 0x8d, hi: 0x8d},
+	{value: 0xe00d, lo: 0x8e, hi: 0x8e},
+	{value: 0x0008, lo: 0x8f, hi: 0xbf},
+	// Block 0x2, offset 0x19
+	{value: 0x0000, lo: 0x0b},
+	{value: 0x0008, lo: 0x80, hi: 0xaf},
+	{value: 0x00a9, lo: 0xb0, hi: 0xb0},
+	{value: 0x037d, lo: 0xb1, hi: 0xb1},
+	{value: 0x00b1, lo: 0xb2, hi: 0xb2},
+	{value: 0x00b9, lo: 0xb3, hi: 0xb3},
+	{value: 0x034d, lo: 0xb4, hi: 0xb4},
+	{value: 0x0395, lo: 0xb5, hi: 0xb5},
+	{value: 0xe1bd, lo: 0xb6, hi: 0xb6},
+	{value: 0x00c1, lo: 0xb7, hi: 0xb7},
+	{value: 0x00c9, lo: 0xb8, hi: 0xb8},
+	{value: 0x0008, lo: 0xb9, hi: 0xbf},
+	// Block 0x3, offset 0x25
+	{value: 0x0000, lo: 0x01},
+	{value: 0x3308, lo: 0x80, hi: 0xbf},
+	// Block 0x4, offset 0x27
+	{value: 0x0000, lo: 0x04},
+	{value: 0x03f5, lo: 0x80, hi: 0x8f},
+	{value: 0xe105, lo: 0x90, hi: 0x9f},
+	{value: 0x049d, lo: 0xa0, hi: 0xaf},
+	{value: 0x0008, lo: 0xb0, hi: 0xbf},
+	// Block 0x5, offset 0x2c
+	{value: 0x0000, lo: 0x06},
+	{value: 0xe185, lo: 0x80, hi: 0x8f},
+	{value: 0x0545, lo: 0x90, hi: 0x96},
+	{value: 0x0040, lo: 0x97, hi: 0x98},
+	{value: 0x0008, lo: 0x99, hi: 0x99},
+	{value: 0x0018, lo: 0x9a, hi: 0x9f},
+	{value: 0x0008, lo: 0xa0, hi: 0xbf},
+	// Block 0x6, offset 0x33
+	{value: 0x0000, lo: 0x0a},
+	{value: 0x0008, lo: 0x80, hi: 0x86},
+	{value: 0x0131, lo: 0x87, hi: 0x87},
+	{value: 0x0008, lo: 0x88, hi: 0x88},
+	{value: 0x0018, lo: 0x89, hi: 0x8a},
+	{value: 0x0040, lo: 0x8b, hi: 0x8c},
+	{value: 0x0018, lo: 0x8d, hi: 0x8f},
+	{value: 0x0040, lo: 0x90, hi: 0x90},
+	{value: 0x3308, lo: 0x91, hi: 0xbd},
+	{value: 0x0818, lo: 0xbe, hi: 0xbe},
+	{value: 0x3308, lo: 0xbf, hi: 0xbf},
+	// Block 0x7, offset 0x3e
+	{value: 0x0000, lo: 0x0b},
+	{value: 0x0818, lo: 0x80, hi: 0x80},
+	{value: 0x3308, lo: 0x81, hi: 0x82},
+	{value: 0x0818, lo: 0x83, hi: 0x83},
+	{value: 0x3308, lo: 0x84, hi: 0x85},
+	{value: 0x0818, lo: 0x86, hi: 0x86},
+	{value: 0x3308, lo: 0x87, hi: 0x87},
+	{value: 0x0040, lo: 0x88, hi: 0x8f},
+	{value: 0x0808, lo: 0x90, hi: 0xaa},
+	{value: 0x0040, lo: 0xab, hi: 0xae},
+	{value: 0x0808, lo: 0xaf, hi: 0xb4},
+	{value: 0x0040, lo: 0xb5, hi: 0xbf},
+	// Block 0x8, offset 0x4a
+	{value: 0x0000, lo: 0x03},
+	{value: 0x0a08, lo: 0x80, hi: 0x87},
+	{value: 0x0c08, lo: 0x88, hi: 0x99},
+	{value: 0x0a08, lo: 0x9a, hi: 0xbf},
+	// Block 0x9, offset 0x4e
+	{value: 0x0000, lo: 0x0e},
+	{value: 0x3308, lo: 0x80, hi: 0x8a},
+	{value: 0x0040, lo: 0x8b, hi: 0x8c},
+	{value: 0x0c08, lo: 0x8d, hi: 0x8d},
+	{value: 0x0a08, lo: 0x8e, hi: 0x98},
+	{value: 0x0c08, lo: 0x99, hi: 0x9b},
+	{value: 0x0a08, lo: 0x9c, hi: 0xaa},
+	{value: 0x0c08, lo: 0xab, hi: 0xac},
+	{value: 0x0a08, lo: 0xad, hi: 0xb0},
+	{value: 0x0c08, lo: 0xb1, hi: 0xb1},
+	{value: 0x0a08, lo: 0xb2, hi: 0xb2},
+	{value: 0x0c08, lo: 0xb3, hi: 0xb4},
+	{value: 0x0a08, lo: 0xb5, hi: 0xb7},
+	{value: 0x0c08, lo: 0xb8, hi: 0xb9},
+	{value: 0x0a08, lo: 0xba, hi: 0xbf},
+	// Block 0xa, offset 0x5d
+	{value: 0x0000, lo: 0x04},
+	{value: 0x0808, lo: 0x80, hi: 0xa5},
+	{value: 0x3308, lo: 0xa6, hi: 0xb0},
+	{value: 0x0808, lo: 0xb1, hi: 0xb1},
+	{value: 0x0040, lo: 0xb2, hi: 0xbf},
+	// Block 0xb, offset 0x62
+	{value: 0x0000, lo: 0x09},
+	{value: 0x0808, lo: 0x80, hi: 0x89},
+	{value: 0x0a08, lo: 0x8a, hi: 0xaa},
+	{value: 0x3308, lo: 0xab, hi: 0xb3},
+	{value: 0x0808, lo: 0xb4, hi: 0xb5},
+	{value: 0x0018, lo: 0xb6, hi: 0xb9},
+	{value: 0x0818, lo: 0xba, hi: 0xba},
+	{value: 0x0040, lo: 0xbb, hi: 0xbc},
+	{value: 0x3308, lo: 0xbd, hi: 0xbd},
+	{value: 0x0818, lo: 0xbe, hi: 0xbf},
+	// Block 0xc, offset 0x6c
+	{value: 0x0000, lo: 0x0b},
+	{value: 0x0808, lo: 0x80, hi: 0x95},
+	{value: 0x3308, lo: 0x96, hi: 0x99},
+	{value: 0x0808, lo: 0x9a, hi: 0x9a},
+	{value: 0x3308, lo: 0x9b, hi: 0xa3},
+	{value: 0x0808, lo: 0xa4, hi: 0xa4},
+	{value: 0x3308, lo: 0xa5, hi: 0xa7},
+	{value: 0x0808, lo: 0xa8, hi: 0xa8},
+	{value: 0x3308, lo: 0xa9, hi: 0xad},
+	{value: 0x0040, lo: 0xae, hi: 0xaf},
+	{value: 0x0818, lo: 0xb0, hi: 0xbe},
+	{value: 0x0040, lo: 0xbf, hi: 0xbf},
+	// Block 0xd, offset 0x78
+	{value: 0x0000, lo: 0x05},
+	{value: 0x0a08, lo: 0x80, hi: 0x88},
+	{value: 0x0808, lo: 0x89, hi: 0x89},
+	{value: 0x3308, lo: 0x8a, hi: 0xa1},
+	{value: 0x0840, lo: 0xa2, hi: 0xa2},
+	{value: 0x3308, lo: 0xa3, hi: 0xbf},
+	// Block 0xe, offset 0x7e
+	{value: 0x0000, lo: 0x08},
+	{value: 0x3308, lo: 0x80, hi: 0x82},
+	{value: 0x3008, lo: 0x83, hi: 0x83},
+	{value: 0x0008, lo: 0x84, hi: 0xb9},
+	{value: 0x3308, lo: 0xba, hi: 0xba},
+	{value: 0x3008, lo: 0xbb, hi: 0xbb},
+	{value: 0x3308, lo: 0xbc, hi: 0xbc},
+	{value: 0x0008, lo: 0xbd, hi: 0xbd},
+	{value: 0x3008, lo: 0xbe, hi: 0xbf},
+	// Block 0xf, offset 0x87
+	{value: 0x0000, lo: 0x0f},
+	{value: 0x3308, lo: 0x80, hi: 0x80},
+	{value: 0x3008, lo: 0x81, hi: 0x82},
+	{value: 0x0040, lo: 0x83, hi: 0x85},
+	{value: 0x3008, lo: 0x86, hi: 0x88},
+	{value: 0x0040, lo: 0x89, hi: 0x89},
+	{value: 0x3008, lo: 0x8a, hi: 0x8c},
+	{value: 0x3b08, lo: 0x8d, hi: 0x8d},
+	{value: 0x0040, lo: 0x8e, hi: 0x8f},
+	{value: 0x0008, lo: 0x90, hi: 0x90},
+	{value: 0x0040, lo: 0x91, hi: 0x96},
+	{value: 0x3008, lo: 0x97, hi: 0x97},
+	{value: 0x0040, lo: 0x98, hi: 0xa5},
+	{value: 0x0008, lo: 0xa6, hi: 0xaf},
+	{value: 0x0018, lo: 0xb0, hi: 0xba},
+	{value: 0x0040, lo: 0xbb, hi: 0xbf},
+	// Block 0x10, offset 0x97
+	{value: 0x0000, lo: 0x0e},
+	{value: 0x3308, lo: 0x80, hi: 0x80},
+	{value: 0x3008, lo: 0x81, hi: 0x83},
+	{value: 0x3308, lo: 0x84, hi: 0x84},
+	{value: 0x0008, lo: 0x85, hi: 0x8c},
+	{value: 0x0040, lo: 0x8d, hi: 0x8d},
+	{value: 0x0008, lo: 0x8e, hi: 0x90},
+	{value: 0x0040, lo: 0x91, hi: 0x91},
+	{value: 0x0008, lo: 0x92, hi: 0xa8},
+	{value: 0x0040, lo: 0xa9, hi: 0xa9},
+	{value: 0x0008, lo: 0xaa, hi: 0xb9},
+	{value: 0x0040, lo: 0xba, hi: 0xbb},
+	{value: 0x3308, lo: 0xbc, hi: 0xbc},
+	{value: 0x0008, lo: 0xbd, hi: 0xbd},
+	{value: 0x3308, lo: 0xbe, hi: 0xbf},
+	// Block 0x11, offset 0xa6
+	{value: 0x0000, lo: 0x0a},
+	{value: 0x3308, lo: 0x80, hi: 0x81},
+	{value: 0x3008, lo: 0x82, hi: 0x83},
+	{value: 0x0008, lo: 0x84, hi: 0x8c},
+	{value: 0x0040, lo: 0x8d, hi: 0x8d},
+	{value: 0x0008, lo: 0x8e, hi: 0x90},
+	{value: 0x0040, lo: 0x91, hi: 0x91},
+	{value: 0x0008, lo: 0x92, hi: 0xba},
+	{value: 0x3b08, lo: 0xbb, hi: 0xbc},
+	{value: 0x0008, lo: 0xbd, hi: 0xbd},
+	{value: 0x3008, lo: 0xbe, hi: 0xbf},
+	// Block 0x12, offset 0xb1
+	{value: 0x0000, lo: 0x0c},
+	{value: 0x0040, lo: 0x80, hi: 0x80},
+	{value: 0x3308, lo: 0x81, hi: 0x81},
+	{value: 0x3008, lo: 0x82, hi: 0x83},
+	{value: 0x0040, lo: 0x84, hi: 0x84},
+	{value: 0x0008, lo: 0x85, hi: 0x96},
+	{value: 0x0040, lo: 0x97, hi: 0x99},
+	{value: 0x0008, lo: 0x9a, hi: 0xb1},
+	{value: 0x0040, lo: 0xb2, hi: 0xb2},
+	{value: 0x0008, lo: 0xb3, hi: 0xbb},
+	{value: 0x0040, lo: 0xbc, hi: 0xbc},
+	{value: 0x0008, lo: 0xbd, hi: 0xbd},
+	{value: 0x0040, lo: 0xbe, hi: 0xbf},
+	// Block 0x13, offset 0xbe
+	{value: 0x0000, lo: 0x10},
+	{value: 0x0008, lo: 0x80, hi: 0x86},
+	{value: 0x0040, lo: 0x87, hi: 0x89},
+	{value: 0x3b08, lo: 0x8a, hi: 0x8a},
+	{value: 0x0040, lo: 0x8b, hi: 0x8e},
+	{value: 0x3008, lo: 0x8f, hi: 0x91},
+	{value: 0x3308, lo: 0x92, hi: 0x94},
+	{value: 0x0040, lo: 0x95, hi: 0x95},
+	{value: 0x3308, lo: 0x96, hi: 0x96},
+	{value: 0x0040, lo: 0x97, hi: 0x97},
+	{value: 0x3008, lo: 0x98, hi: 0x9f},
+	{value: 0x0040, lo: 0xa0, hi: 0xa5},
+	{value: 0x0008, lo: 0xa6, hi: 0xaf},
+	{value: 0x0040, lo: 0xb0, hi: 0xb1},
+	{value: 0x3008, lo: 0xb2, hi: 0xb3},
+	{value: 0x0018, lo: 0xb4, hi: 0xb4},
+	{value: 0x0040, lo: 0xb5, hi: 0xbf},
+	// Block 0x14, offset 0xcf
+	{value: 0x0000, lo: 0x09},
+	{value: 0x0040, lo: 0x80, hi: 0x80},
+	{value: 0x0008, lo: 0x81, hi: 0xb0},
+	{value: 0x3308, lo: 0xb1, hi: 0xb1},
+	{value: 0x0008, lo: 0xb2, hi: 0xb2},
+	{value: 0x01f1, lo: 0xb3, hi: 0xb3},
+	{value: 0x3308, lo: 0xb4, hi: 0xb9},
+	{value: 0x3b08, lo: 0xba, hi: 0xba},
+	{value: 0x0040, lo: 0xbb, hi: 0xbe},
+	{value: 0x0018, lo: 0xbf, hi: 0xbf},
+	// Block 0x15, offset 0xd9
+	{value: 0x0000, lo: 0x06},
+	{value: 0x0008, lo: 0x80, hi: 0x86},
+	{value: 0x3308, lo: 0x87, hi: 0x8e},
+	{value: 0x0018, lo: 0x8f, hi: 0x8f},
+	{value: 0x0008, lo: 0x90, hi: 0x99},
+	{value: 0x0018, lo: 0x9a, hi: 0x9b},
+	{value: 0x0040, lo: 0x9c, hi: 0xbf},
+	// Block 0x16, offset 0xe0
+	{value: 0x0000, lo: 0x0c},
+	{value: 0x0008, lo: 0x80, hi: 0x84},
+	{value: 0x0040, lo: 0x85, hi: 0x85},
+	{value: 0x0008, lo: 0x86, hi: 0x86},
+	{value: 0x0040, lo: 0x87, hi: 0x87},
+	{value: 0x3308, lo: 0x88, hi: 0x8e},
+	{value: 0x0040, lo: 0x8f, hi: 0x8f},
+	{value: 0x0008, lo: 0x90, hi: 0x99},
+	{value: 0x0040, lo: 0x9a, hi: 0x9b},
+	{value: 0x0201, lo: 0x9c, hi: 0x9c},
+	{value: 0x0209, lo: 0x9d, hi: 0x9d},
+	{value: 0x0008, lo: 0x9e, hi: 0x9f},
+	{value: 0x0040, lo: 0xa0, hi: 0xbf},
+	// Block 0x17, offset 0xed
+	{value: 0x0000, lo: 0x10},
+	{value: 0x0008, lo: 0x80, hi: 0x80},
+	{value: 0x0018, lo: 0x81, hi: 0x8a},
+	{value: 0x0008, lo: 0x8b, hi: 0x8b},
+	{value: 0xe03d, lo: 0x8c, hi: 0x8c},
+	{value: 0x0018, lo: 0x8d, hi: 0x97},
+	{value: 0x3308, lo: 0x98, hi: 0x99},
+	{value: 0x0018, lo: 0x9a, hi: 0x9f},
+	{value: 0x0008, lo: 0xa0, hi: 0xa9},
+	{value: 0x0018, lo: 0xaa, hi: 0xb4},
+	{value: 0x3308, lo: 0xb5, hi: 0xb5},
+	{value: 0x0018, lo: 0xb6, hi: 0xb6},
+	{value: 0x3308, lo: 0xb7, hi: 0xb7},
+	{value: 0x0018, lo: 0xb8, hi: 0xb8},
+	{value: 0x3308, lo: 0xb9, hi: 0xb9},
+	{value: 0x0018, lo: 0xba, hi: 0xbd},
+	{value: 0x3008, lo: 0xbe, hi: 0xbf},
+	// Block 0x18, offset 0xfe
+	{value: 0x0000, lo: 0x06},
+	{value: 0x0018, lo: 0x80, hi: 0x85},
+	{value: 0x3308, lo: 0x86, hi: 0x86},
+	{value: 0x0018, lo: 0x87, hi: 0x8c},
+	{value: 0x0040, lo: 0x8d, hi: 0x8d},
+	{value: 0x0018, lo: 0x8e, hi: 0x9a},
+	{value: 0x0040, lo: 0x9b, hi: 0xbf},
+	// Block 0x19, offset 0x105
+	{value: 0x0000, lo: 0x0a},
+	{value: 0x0008, lo: 0x80, hi: 0xaa},
+	{value: 0x3008, lo: 0xab, hi: 0xac},
+	{value: 0x3308, lo: 0xad, hi: 0xb0},
+	{value: 0x3008, lo: 0xb1, hi: 0xb1},
+	{value: 0x3308, lo: 0xb2, hi: 0xb7},
+	{value: 0x3008, lo: 0xb8, hi: 0xb8},
+	{value: 0x3b08, lo: 0xb9, hi: 0xba},
+	{value: 0x3008, lo: 0xbb, hi: 0xbc},
+	{value: 0x3308, lo: 0xbd, hi: 0xbe},
+	{value: 0x0008, lo: 0xbf, hi: 0xbf},
+	// Block 0x1a, offset 0x110
+	{value: 0x0000, lo: 0x0e},
+	{value: 0x0008, lo: 0x80, hi: 0x89},
+	{value: 0x0018, lo: 0x8a, hi: 0x8f},
+	{value: 0x0008, lo: 0x90, hi: 0x95},
+	{value: 0x3008, lo: 0x96, hi: 0x97},
+	{value: 0x3308, lo: 0x98, hi: 0x99},
+	{value: 0x0008, lo: 0x9a, hi: 0x9d},
+	{value: 0x3308, lo: 0x9e, hi: 0xa0},
+	{value: 0x0008, lo: 0xa1, hi: 0xa1},
+	{value: 0x3008, lo: 0xa2, hi: 0xa4},
+	{value: 0x0008, lo: 0xa5, hi: 0xa6},
+	{value: 0x3008, lo: 0xa7, hi: 0xad},
+	{value: 0x0008, lo: 0xae, hi: 0xb0},
+	{value: 0x3308, lo: 0xb1, hi: 0xb4},
+	{value: 0x0008, lo: 0xb5, hi: 0xbf},
+	// Block 0x1b, offset 0x11f
+	{value: 0x0000, lo: 0x0d},
+	{value: 0x0008, lo: 0x80, hi: 0x81},
+	{value: 0x3308, lo: 0x82, hi: 0x82},
+	{value: 0x3008, lo: 0x83, hi: 0x84},
+	{value: 0x3308, lo: 0x85, hi: 0x86},
+	{value: 0x3008, lo: 0x87, hi: 0x8c},
+	{value: 0x3308, lo: 0x8d, hi: 0x8d},
+	{value: 0x0008, lo: 0x8e, hi: 0x8e},
+	{value: 0x3008, lo: 0x8f, hi: 0x8f},
+	{value: 0x0008, lo: 0x90, hi: 0x99},
+	{value: 0x3008, lo: 0x9a, hi: 0x9c},
+	{value: 0x3308, lo: 0x9d, hi: 0x9d},
+	{value: 0x0018, lo: 0x9e, hi: 0x9f},
+	{value: 0x0040, lo: 0xa0, hi: 0xbf},
+	// Block 0x1c, offset 0x12d
+	{value: 0x0000, lo: 0x09},
+	{value: 0x0040, lo: 0x80, hi: 0x86},
+	{value: 0x055d, lo: 0x87, hi: 0x87},
+	{value: 0x0040, lo: 0x88, hi: 0x8c},
+	{value: 0x055d, lo: 0x8d, hi: 0x8d},
+	{value: 0x0040, lo: 0x8e, hi: 0x8f},
+	{value: 0x0008, lo: 0x90, hi: 0xba},
+	{value: 0x0018, lo: 0xbb, hi: 0xbb},
+	{value: 0xe105, lo: 0xbc, hi: 0xbc},
+	{value: 0x0008, lo: 0xbd, hi: 0xbf},
+	// Block 0x1d, offset 0x137
+	{value: 0x0000, lo: 0x01},
+	{value: 0x0018, lo: 0x80, hi: 0xbf},
+	// Block 0x1e, offset 0x139
+	{value: 0x0000, lo: 0x04},
+	{value: 0x0018, lo: 0x80, hi: 0x9e},
+	{value: 0x0040, lo: 0x9f, hi: 0xa0},
+	{value: 0x2018, lo: 0xa1, hi: 0xb5},
+	{value: 0x0018, lo: 0xb6, hi: 0xbf},
+	// Block 0x1f, offset 0x13e
+	{value: 0x0000, lo: 0x02},
+	{value: 0x0018, lo: 0x80, hi: 0xa7},
+	{value: 0x2018, lo: 0xa8, hi: 0xbf},
+	// Block 0x20, offset 0x141
+	{value: 0x0000, lo: 0x02},
+	{value: 0x2018, lo: 0x80, hi: 0x82},
+	{value: 0x0018, lo: 0x83, hi: 0xbf},
+	// Block 0x21, offset 0x144
+	{value: 0x0000, lo: 0x01},
+	{value: 0x0008, lo: 0x80, hi: 0xbf},
+	// Block 0x22, offset 0x146
+	{value: 0x0000, lo: 0x0b},
+	{value: 0x0008, lo: 0x80, hi: 0x88},
+	{value: 0x0040, lo: 0x89, hi: 0x89},
+	{value: 0x0008, lo: 0x8a, hi: 0x8d},
+	{value: 0x0040, lo: 0x8e, hi: 0x8f},
+	{value: 0x0008, lo: 0x90, hi: 0x96},
+	{value: 0x0040, lo: 0x97, hi: 0x97},
+	{value: 0x0008, lo: 0x98, hi: 0x98},
+	{value: 0x0040, lo: 0x99, hi: 0x99},
+	{value: 0x0008, lo: 0x9a, hi: 0x9d},
+	{value: 0x0040, lo: 0x9e, hi: 0x9f},
+	{value: 0x0008, lo: 0xa0, hi: 0xbf},
+	// Block 0x23, offset 0x152
+	{value: 0x0000, lo: 0x0a},
+	{value: 0x0008, lo: 0x80, hi: 0x88},
+	{value: 0x0040, lo: 0x89, hi: 0x89},
+	{value: 0x0008, lo: 0x8a, hi: 0x8d},
+	{value: 0x0040, lo: 0x8e, hi: 0x8f},
+	{value: 0x0008, lo: 0x90, hi: 0xb0},
+	{value: 0x0040, lo: 0xb1, hi: 0xb1},
+	{value: 0x0008, lo: 0xb2, hi: 0xb5},
+	{value: 0x0040, lo: 0xb6, hi: 0xb7},
+	{value: 0x0008, lo: 0xb8, hi: 0xbe},
+	{value: 0x0040, lo: 0xbf, hi: 0xbf},
+	// Block 0x24, offset 0x15d
+	{value: 0x0000, lo: 0x07},
+	{value: 0x0008, lo: 0x80, hi: 0x80},
+	{value: 0x0040, lo: 0x81, hi: 0x81},
+	{value: 0x0008, lo: 0x82, hi: 0x85},
+	{value: 0x0040, lo: 0x86, hi: 0x87},
+	{value: 0x0008, lo: 0x88, hi: 0x96},
+	{value: 0x0040, lo: 0x97, hi: 0x97},
+	{value: 0x0008, lo: 0x98, hi: 0xbf},
+	// Block 0x25, offset 0x165
+	{value: 0x0000, lo: 0x05},
+	{value: 0x0008, lo: 0x80, hi: 0x90},
+	{value: 0x0040, lo: 0x91, hi: 0x91},
+	{value: 0x0008, lo: 0x92, hi: 0x95},
+	{value: 0x0040, lo: 0x96, hi: 0x97},
+	{value: 0x0008, lo: 0x98, hi: 0xbf},
+	// Block 0x26, offset 0x16b
+	{value: 0x0000, lo: 0x05},
+	{value: 0x0008, lo: 0x80, hi: 0x9a},
+	{value: 0x0040, lo: 0x9b, hi: 0x9c},
+	{value: 0x3308, lo: 0x9d, hi: 0x9f},
+	{value: 0x0018, lo: 0xa0, hi: 0xbc},
+	{value: 0x0040, lo: 0xbd, hi: 0xbf},
+	// Block 0x27, offset 0x171
+	{value: 0x0000, lo: 0x04},
+	{value: 0x0008, lo: 0x80, hi: 0x8f},
+	{value: 0x0018, lo: 0x90, hi: 0x99},
+	{value: 0x0040, lo: 0x9a, hi: 0x9f},
+	{value: 0x0008, lo: 0xa0, hi: 0xbf},
+	// Block 0x28, offset 0x176
+	{value: 0x0000, lo: 0x04},
+	{value: 0x0008, lo: 0x80, hi: 0xb5},
+	{value: 0x0040, lo: 0xb6, hi: 0xb7},
+	{value: 0xe045, lo: 0xb8, hi: 0xbd},
+	{value: 0x0040, lo: 0xbe, hi: 0xbf},
+	// Block 0x29, offset 0x17b
+	{value: 0x0000, lo: 0x02},
+	{value: 0x0018, lo: 0x80, hi: 0x80},
+	{value: 0x0008, lo: 0x81, hi: 0xbf},
+	// Block 0x2a, offset 0x17e
+	{value: 0x0000, lo: 0x03},
+	{value: 0x0008, lo: 0x80, hi: 0xac},
+	{value: 0x0018, lo: 0xad, hi: 0xae},
+	{value: 0x0008, lo: 0xaf, hi: 0xbf},
+	// Block 0x2b, offset 0x182
+	{value: 0x0000, lo: 0x05},
+	{value: 0x0040, lo: 0x80, hi: 0x80},
+	{value: 0x0008, lo: 0x81, hi: 0x9a},
+	{value: 0x0018, lo: 0x9b, hi: 0x9c},
+	{value: 0x0040, lo: 0x9d, hi: 0x9f},
+	{value: 0x0008, lo: 0xa0, hi: 0xbf},
+	// Block 0x2c, offset 0x188
+	{value: 0x0000, lo: 0x04},
+	{value: 0x0008, lo: 0x80, hi: 0xaa},
+	{value: 0x0018, lo: 0xab, hi: 0xb0},
+	{value: 0x0008, lo: 0xb1, hi: 0xb8},
+	{value: 0x0040, lo: 0xb9, hi: 0xbf},
+	// Block 0x2d, offset 0x18d
+	{value: 0x0000, lo: 0x0a},
+	{value: 0x0008, lo: 0x80, hi: 0x91},
+	{value: 0x3308, lo: 0x92, hi: 0x93},
+	{value: 0x3b08, lo: 0x94, hi: 0x94},
+	{value: 0x3808, lo: 0x95, hi: 0x95},
+	{value: 0x0040, lo: 0x96, hi: 0x9e},
+	{value: 0x0008, lo: 0x9f, hi: 0xb1},
+	{value: 0x3308, lo: 0xb2, hi: 0xb3},
+	{value: 0x3808, lo: 0xb4, hi: 0xb4},
+	{value: 0x0018, lo: 0xb5, hi: 0xb6},
+	{value: 0x0040, lo: 0xb7, hi: 0xbf},
+	// Block 0x2e, offset 0x198
+	{value: 0x0000, lo: 0x09},
+	{value: 0x0008, lo: 0x80, hi: 0x91},
+	{value: 0x3308, lo: 0x92, hi: 0x93},
+	{value: 0x0040, lo: 0x94, hi: 0x9f},
+	{value: 0x0008, lo: 0xa0, hi: 0xac},
+	{value: 0x0040, lo: 0xad, hi: 0xad},
+	{value: 0x0008, lo: 0xae, hi: 0xb0},
+	{value: 0x0040, lo: 0xb1, hi: 0xb1},
+	{value: 0x3308, lo: 0xb2, hi: 0xb3},
+	{value: 0x0040, lo: 0xb4, hi: 0xbf},
+	// Block 0x2f, offset 0x1a2
+	{value: 0x0000, lo: 0x05},
+	{value: 0x0008, lo: 0x80, hi: 0xb3},
+	{value: 0x3340, lo: 0xb4, hi: 0xb5},
+	{value: 0x3008, lo: 0xb6, hi: 0xb6},
+	{value: 0x3308, lo: 0xb7, hi: 0xbd},
+	{value: 0x3008, lo: 0xbe, hi: 0xbf},
+	// Block 0x30, offset 0x1a8
+	{value: 0x0000, lo: 0x10},
+	{value: 0x3008, lo: 0x80, hi: 0x85},
+	{value: 0x3308, lo: 0x86, hi: 0x86},
+	{value: 0x3008, lo: 0x87, hi: 0x88},
+	{value: 0x3308, lo: 0x89, hi: 0x91},
+	{value: 0x3b08, lo: 0x92, hi: 0x92},
+	{value: 0x3308, lo: 0x93, hi: 0x93},
+	{value: 0x0018, lo: 0x94, hi: 0x96},
+	{value: 0x0008, lo: 0x97, hi: 0x97},
+	{value: 0x0018, lo: 0x98, hi: 0x9b},
+	{value: 0x0008, lo: 0x9c, hi: 0x9c},
+	{value: 0x3308, lo: 0x9d, hi: 0x9d},
+	{value: 0x0040, lo: 0x9e, hi: 0x9f},
+	{value: 0x0008, lo: 0xa0, hi: 0xa9},
+	{value: 0x0040, lo: 0xaa, hi: 0xaf},
+	{value: 0x0018, lo: 0xb0, hi: 0xb9},
+	{value: 0x0040, lo: 0xba, hi: 0xbf},
+	// Block 0x31, offset 0x1b9
+	{value: 0x0000, lo: 0x0a},
+	{value: 0x0018, lo: 0x80, hi: 0x85},
+	{value: 0x0040, lo: 0x86, hi: 0x86},
+	{value: 0x0218, lo: 0x87, hi: 0x87},
+	{value: 0x0018, lo: 0x88, hi: 0x8a},
+	{value: 0x33c0, lo: 0x8b, hi: 0x8d},
+	{value: 0x0040, lo: 0x8e, hi: 0x8e},
+	{value: 0x33c0, lo: 0x8f, hi: 0x8f},
+	{value: 0x0008, lo: 0x90, hi: 0x99},
+	{value: 0x0040, lo: 0x9a, hi: 0x9f},
+	{value: 0x0208, lo: 0xa0, hi: 0xbf},
+	// Block 0x32, offset 0x1c4
+	{value: 0x0000, lo: 0x02},
+	{value: 0x0208, lo: 0x80, hi: 0xb8},
+	{value: 0x0040, lo: 0xb9, hi: 0xbf},
+	// Block 0x33, offset 0x1c7
+	{value: 0x0000, lo: 0x07},
+	{value: 0x0008, lo: 0x80, hi: 0x84},
+	{value: 0x3308, lo: 0x85, hi: 0x86},
+	{value: 0x0208, lo: 0x87, hi: 0xa8},
+	{value: 0x3308, lo: 0xa9, hi: 0xa9},
+	{value: 0x0208, lo: 0xaa, hi: 0xaa},
+	{value: 0x0040, lo: 0xab, hi: 0xaf},
+	{value: 0x0008, lo: 0xb0, hi: 0xbf},
+	// Block 0x34, offset 0x1cf
+	{value: 0x0000, lo: 0x02},
+	{value: 0x0008, lo: 0x80, hi: 0xb5},
+	{value: 0x0040, lo: 0xb6, hi: 0xbf},
+	// Block 0x35, offset 0x1d2
+	{value: 0x0000, lo: 0x0c},
+	{value: 0x0008, lo: 0x80, hi: 0x9e},
+	{value: 0x0040, lo: 0x9f, hi: 0x9f},
+	{value: 0x3308, lo: 0xa0, hi: 0xa2},
+	{value: 0x3008, lo: 0xa3, hi: 0xa6},
+	{value: 0x3308, lo: 0xa7, hi: 0xa8},
+	{value: 0x3008, lo: 0xa9, hi: 0xab},
+	{value: 0x0040, lo: 0xac, hi: 0xaf},
+	{value: 0x3008, lo: 0xb0, hi: 0xb1},
+	{value: 0x3308, lo: 0xb2, hi: 0xb2},
+	{value: 0x3008, lo: 0xb3, hi: 0xb8},
+	{value: 0x3308, lo: 0xb9, hi: 0xbb},
+	{value: 0x0040, lo: 0xbc, hi: 0xbf},
+	// Block 0x36, offset 0x1df
+	{value: 0x0000, lo: 0x07},
+	{value: 0x0018, lo: 0x80, hi: 0x80},
+	{value: 0x0040, lo: 0x81, hi: 0x83},
+	{value: 0x0018, lo: 0x84, hi: 0x85},
+	{value: 0x0008, lo: 0x86, hi: 0xad},
+	{value: 0x0040, lo: 0xae, hi: 0xaf},
+	{value: 0x0008, lo: 0xb0, hi: 0xb4},
+	{value: 0x0040, lo: 0xb5, hi: 0xbf},
+	// Block 0x37, offset 0x1e7
+	{value: 0x0000, lo: 0x03},
+	{value: 0x0008, lo: 0x80, hi: 0xab},
+	{value: 0x0040, lo: 0xac, hi: 0xaf},
+	{value: 0x0008, lo: 0xb0, hi: 0xbf},
+	// Block 0x38, offset 0x1eb
+	{value: 0x0000, lo: 0x06},
+	{value: 0x0008, lo: 0x80, hi: 0x89},
+	{value: 0x0040, lo: 0x8a, hi: 0x8f},
+	{value: 0x0008, lo: 0x90, hi: 0x99},
+	{value: 0x0028, lo: 0x9a, hi: 0x9a},
+	{value: 0x0040, lo: 0x9b, hi: 0x9d},
+	{value: 0x0018, lo: 0x9e, hi: 0xbf},
+	// Block 0x39, offset 0x1f2
+	{value: 0x0000, lo: 0x07},
+	{value: 0x0008, lo: 0x80, hi: 0x96},
+	{value: 0x3308, lo: 0x97, hi: 0x98},
+	{value: 0x3008, lo: 0x99, hi: 0x9a},
+	{value: 0x3308, lo: 0x9b, hi: 0x9b},
+	{value: 0x0040, lo: 0x9c, hi: 0x9d},
+	{value: 0x0018, lo: 0x9e, hi: 0x9f},
+	{value: 0x0008, lo: 0xa0, hi: 0xbf},
+	// Block 0x3a, offset 0x1fa
+	{value: 0x0000, lo: 0x0f},
+	{value: 0x0008, lo: 0x80, hi: 0x94},
+	{value: 0x3008, lo: 0x95, hi: 0x95},
+	{value: 0x3308, lo: 0x96, hi: 0x96},
+	{value: 0x3008, lo: 0x97, hi: 0x97},
+	{value: 0x3308, lo: 0x98, hi: 0x9e},
+	{value: 0x0040, lo: 0x9f, hi: 0x9f},
+	{value: 0x3b08, lo: 0xa0, hi: 0xa0},
+	{value: 0x3008, lo: 0xa1, hi: 0xa1},
+	{value: 0x3308, lo: 0xa2, hi: 0xa2},
+	{value: 0x3008, lo: 0xa3, hi: 0xa4},
+	{value: 0x3308, lo: 0xa5, hi: 0xac},
+	{value: 0x3008, lo: 0xad, hi: 0xb2},
+	{value: 0x3308, lo: 0xb3, hi: 0xbc},
+	{value: 0x0040, lo: 0xbd, hi: 0xbe},
+	{value: 0x3308, lo: 0xbf, hi: 0xbf},
+	// Block 0x3b, offset 0x20a
+	{value: 0x0000, lo: 0x0b},
+	{value: 0x0008, lo: 0x80, hi: 0x89},
+	{value: 0x0040, lo: 0x8a, hi: 0x8f},
+	{value: 0x0008, lo: 0x90, hi: 0x99},
+	{value: 0x0040, lo: 0x9a, hi: 0x9f},
+	{value: 0x0018, lo: 0xa0, hi: 0xa6},
+	{value: 0x0008, lo: 0xa7, hi: 0xa7},
+	{value: 0x0018, lo: 0xa8, hi: 0xad},
+	{value: 0x0040, lo: 0xae, hi: 0xaf},
+	{value: 0x3308, lo: 0xb0, hi: 0xbd},
+	{value: 0x3318, lo: 0xbe, hi: 0xbe},
+	{value: 0x3308, lo: 0xbf, hi: 0xbf},
+	// Block 0x3c, offset 0x216
+	{value: 0x0000, lo: 0x02},
+	{value: 0x3308, lo: 0x80, hi: 0x8e},
+	{value: 0x0040, lo: 0x8f, hi: 0xbf},
+	// Block 0x3d, offset 0x219
+	{value: 0x0000, lo: 0x09},
+	{value: 0x3308, lo: 0x80, hi: 0x83},
+	{value: 0x3008, lo: 0x84, hi: 0x84},
+	{value: 0x0008, lo: 0x85, hi: 0xb3},
+	{value: 0x3308, lo: 0xb4, hi: 0xb4},
+	{value: 0x3008, lo: 0xb5, hi: 0xb5},
+	{value: 0x3308, lo: 0xb6, hi: 0xba},
+	{value: 0x3008, lo: 0xbb, hi: 0xbb},
+	{value: 0x3308, lo: 0xbc, hi: 0xbc},
+	{value: 0x3008, lo: 0xbd, hi: 0xbf},
+	// Block 0x3e, offset 0x223
+	{value: 0x0000, lo: 0x0b},
+	{value: 0x3008, lo: 0x80, hi: 0x81},
+	{value: 0x3308, lo: 0x82, hi: 0x82},
+	{value: 0x3008, lo: 0x83, hi: 0x83},
+	{value: 0x3808, lo: 0x84, hi: 0x84},
+	{value: 0x0008, lo: 0x85, hi: 0x8c},
+	{value: 0x0040, lo: 0x8d, hi: 0x8f},
+	{value: 0x0008, lo: 0x90, hi: 0x99},
+	{value: 0x0018, lo: 0x9a, hi: 0xaa},
+	{value: 0x3308, lo: 0xab, hi: 0xb3},
+	{value: 0x0018, lo: 0xb4, hi: 0xbe},
+	{value: 0x0040, lo: 0xbf, hi: 0xbf},
+	// Block 0x3f, offset 0x22f
+	{value: 0x0000, lo: 0x0b},
+	{value: 0x3308, lo: 0x80, hi: 0x81},
+	{value: 0x3008, lo: 0x82, hi: 0x82},
+	{value: 0x0008, lo: 0x83, hi: 0xa0},
+	{value: 0x3008, lo: 0xa1, hi: 0xa1},
+	{value: 0x3308, lo: 0xa2, hi: 0xa5},
+	{value: 0x3008, lo: 0xa6, hi: 0xa7},
+	{value: 0x3308, lo: 0xa8, hi: 0xa9},
+	{value: 0x3808, lo: 0xaa, hi: 0xaa},
+	{value: 0x3b08, lo: 0xab, hi: 0xab},
+	{value: 0x3308, lo: 0xac, hi: 0xad},
+	{value: 0x0008, lo: 0xae, hi: 0xbf},
+	// Block 0x40, offset 0x23b
+	{value: 0x0000, lo: 0x0b},
+	{value: 0x0008, lo: 0x80, hi: 0xa5},
+	{value: 0x3308, lo: 0xa6, hi: 0xa6},
+	{value: 0x3008, lo: 0xa7, hi: 0xa7},
+	{value: 0x3308, lo: 0xa8, hi: 0xa9},
+	{value: 0x3008, lo: 0xaa, hi: 0xac},
+	{value: 0x3308, lo: 0xad, hi: 0xad},
+	{value: 0x3008, lo: 0xae, hi: 0xae},
+	{value: 0x3308, lo: 0xaf, hi: 0xb1},
+	{value: 0x3808, lo: 0xb2, hi: 0xb3},
+	{value: 0x0040, lo: 0xb4, hi: 0xbb},
+	{value: 0x0018, lo: 0xbc, hi: 0xbf},
+	// Block 0x41, offset 0x247
+	{value: 0x0000, lo: 0x07},
+	{value: 0x0008, lo: 0x80, hi: 0xa3},
+	{value: 0x3008, lo: 0xa4, hi: 0xab},
+	{value: 0x3308, lo: 0xac, hi: 0xb3},
+	{value: 0x3008, lo: 0xb4, hi: 0xb5},
+	{value: 0x3308, lo: 0xb6, hi: 0xb7},
+	{value: 0x0040, lo: 0xb8, hi: 0xba},
+	{value: 0x0018, lo: 0xbb, hi: 0xbf},
+	// Block 0x42, offset 0x24f
+	{value: 0x0000, lo: 0x04},
+	{value: 0x0008, lo: 0x80, hi: 0x89},
+	{value: 0x0040, lo: 0x8a, hi: 0x8c},
+	{value: 0x0008, lo: 0x8d, hi: 0xbd},
+	{value: 0x0018, lo: 0xbe, hi: 0xbf},
+	// Block 0x43, offset 0x254
+	{value: 0x0000, lo: 0x0c},
+	{value: 0x02a9, lo: 0x80, hi: 0x80},
+	{value: 0x02b1, lo: 0x81, hi: 0x81},
+	{value: 0x02b9, lo: 0x82, hi: 0x82},
+	{value: 0x02c1, lo: 0x83, hi: 0x83},
+	{value: 0x02c9, lo: 0x84, hi: 0x85},
+	{value: 0x02d1, lo: 0x86, hi: 0x86},
+	{value: 0x02d9, lo: 0x87, hi: 0x87},
+	{value: 0x057d, lo: 0x88, hi: 0x88},
+	{value: 0x0040, lo: 0x89, hi: 0x8f},
+	{value: 0x059d, lo: 0x90, hi: 0xba},
+	{value: 0x0040, lo: 0xbb, hi: 0xbc},
+	{value: 0x059d, lo: 0xbd, hi: 0xbf},
+	// Block 0x44, offset 0x261
+	{value: 0x0000, lo: 0x10},
+	{value: 0x0018, lo: 0x80, hi: 0x87},
+	{value: 0x0040, lo: 0x88, hi: 0x8f},
+	{value: 0x3308, lo: 0x90, hi: 0x92},
+	{value: 0x0018, lo: 0x93, hi: 0x93},
+	{value: 0x3308, lo: 0x94, hi: 0xa0},
+	{value: 0x3008, lo: 0xa1, hi: 0xa1},
+	{value: 0x3308, lo: 0xa2, hi: 0xa8},
+	{value: 0x0008, lo: 0xa9, hi: 0xac},
+	{value: 0x3308, lo: 0xad, hi: 0xad},
+	{value: 0x0008, lo: 0xae, hi: 0xb3},
+	{value: 0x3308, lo: 0xb4, hi: 0xb4},
+	{value: 0x0008, lo: 0xb5, hi: 0xb6},
+	{value: 0x3008, lo: 0xb7, hi: 0xb7},
+	{value: 0x3308, lo: 0xb8, hi: 0xb9},
+	{value: 0x0008, lo: 0xba, hi: 0xba},
+	{value: 0x0040, lo: 0xbb, hi: 0xbf},
+	// Block 0x45, offset 0x272
+	{value: 0x0000, lo: 0x0a},
+	{value: 0x0008, lo: 0x80, hi: 0x87},
+	{value: 0xe045, lo: 0x88, hi: 0x8f},
+	{value: 0x0008, lo: 0x90, hi: 0x95},
+	{value: 0x0040, lo: 0x96, hi: 0x97},
+	{value: 0xe045, lo: 0x98, hi: 0x9d},
+	{value: 0x0040, lo: 0x9e, hi: 0x9f},
+	{value: 0x0008, lo: 0xa0, hi: 0xa7},
+	{value: 0xe045, lo: 0xa8, hi: 0xaf},
+	{value: 0x0008, lo: 0xb0, hi: 0xb7},
+	{value: 0xe045, lo: 0xb8, hi: 0xbf},
+	// Block 0x46, offset 0x27d
+	{value: 0x0000, lo: 0x04},
+	{value: 0x0018, lo: 0x80, hi: 0x80},
+	{value: 0x0040, lo: 0x81, hi: 0x8f},
+	{value: 0x3318, lo: 0x90, hi: 0xb0},
+	{value: 0x0040, lo: 0xb1, hi: 0xbf},
+	// Block 0x47, offset 0x282
+	{value: 0x0000, lo: 0x08},
+	{value: 0x0018, lo: 0x80, hi: 0x82},
+	{value: 0x0040, lo: 0x83, hi: 0x83},
+	{value: 0x0008, lo: 0x84, hi: 0x84},
+	{value: 0x0018, lo: 0x85, hi: 0x88},
+	{value: 0x0851, lo: 0x89, hi: 0x89},
+	{value: 0x0018, lo: 0x8a, hi: 0x8b},
+	{value: 0x0040, lo: 0x8c, hi: 0x8f},
+	{value: 0x0018, lo: 0x90, hi: 0xbf},
+	// Block 0x48, offset 0x28b
+	{value: 0x0000, lo: 0x07},
+	{value: 0x0018, lo: 0x80, hi: 0xab},
+	{value: 0x0859, lo: 0xac, hi: 0xac},
+	{value: 0x0861, lo: 0xad, hi: 0xad},
+	{value: 0x0018, lo: 0xae, hi: 0xae},
+	{value: 0x0869, lo: 0xaf, hi: 0xaf},
+	{value: 0x0871, lo: 0xb0, hi: 0xb0},
+	{value: 0x0018, lo: 0xb1, hi: 0xbf},
+	// Block 0x49, offset 0x293
+	{value: 0x0000, lo: 0x05},
+	{value: 0x0018, lo: 0x80, hi: 0x9f},
+	{value: 0x0080, lo: 0xa0, hi: 0xa0},
+	{value: 0x0018, lo: 0xa1, hi: 0xad},
+	{value: 0x0080, lo: 0xae, hi: 0xaf},
+	{value: 0x0018, lo: 0xb0, hi: 0xbf},
+	// Block 0x4a, offset 0x299
+	{value: 0x0000, lo: 0x04},
+	{value: 0x0018, lo: 0x80, hi: 0xa8},
+	{value: 0x09dd, lo: 0xa9, hi: 0xa9},
+	{value: 0x09fd, lo: 0xaa, hi: 0xaa},
+	{value: 0x0018, lo: 0xab, hi: 0xbf},
+	// Block 0x4b, offset 0x29e
+	{value: 0x0000, lo: 0x02},
+	{value: 0x0018, lo: 0x80, hi: 0xa6},
+	{value: 0x0040, lo: 0xa7, hi: 0xbf},
+	// Block 0x4c, offset 0x2a1
+	{value: 0x0000, lo: 0x03},
+	{value: 0x0018, lo: 0x80, hi: 0x8b},
+	{value: 0x0929, lo: 0x8c, hi: 0x8c},
+	{value: 0x0018, lo: 0x8d, hi: 0xbf},
+	// Block 0x4d, offset 0x2a5
+	{value: 0x0000, lo: 0x05},
+	{value: 0x0018, lo: 0x80, hi: 0xb3},
+	{value: 0x0e7e, lo: 0xb4, hi: 0xb4},
+	{value: 0x0932, lo: 0xb5, hi: 0xb5},
+	{value: 0x0e9e, lo: 0xb6, hi: 0xb6},
+	{value: 0x0018, lo: 0xb7, hi: 0xbf},
+	// Block 0x4e, offset 0x2ab
+	{value: 0x0000, lo: 0x03},
+	{value: 0x0018, lo: 0x80, hi: 0x9b},
+	{value: 0x0939, lo: 0x9c, hi: 0x9c},
+	{value: 0x0018, lo: 0x9d, hi: 0xbf},
+	// Block 0x4f, offset 0x2af
+	{value: 0x0000, lo: 0x03},
+	{value: 0x0018, lo: 0x80, hi: 0xb3},
+	{value: 0x0040, lo: 0xb4, hi: 0xb5},
+	{value: 0x0018, lo: 0xb6, hi: 0xbf},
+	// Block 0x50, offset 0x2b3
+	{value: 0x0000, lo: 0x03},
+	{value: 0x0018, lo: 0x80, hi: 0x95},
+	{value: 0x0040, lo: 0x96, hi: 0x96},
+	{value: 0x0018, lo: 0x97, hi: 0xbf},
+	// Block 0x51, offset 0x2b7
+	{value: 0x0000, lo: 0x04},
+	{value: 0xe185, lo: 0x80, hi: 0x8f},
+	{value: 0x03f5, lo: 0x90, hi: 0x9f},
+	{value: 0x0ebd, lo: 0xa0, hi: 0xaf},
+	{value: 0x0008, lo: 0xb0, hi: 0xbf},
+	// Block 0x52, offset 0x2bc
+	{value: 0x0000, lo: 0x07},
+	{value: 0x0008, lo: 0x80, hi: 0xa5},
+	{value: 0x0040, lo: 0xa6, hi: 0xa6},
+	{value: 0x0008, lo: 0xa7, hi: 0xa7},
+	{value: 0x0040, lo: 0xa8, hi: 0xac},
+	{value: 0x0008, lo: 0xad, hi: 0xad},
+	{value: 0x0040, lo: 0xae, hi: 0xaf},
+	{value: 0x0008, lo: 0xb0, hi: 0xbf},
+	// Block 0x53, offset 0x2c4
+	{value: 0x0000, lo: 0x06},
+	{value: 0x0008, lo: 0x80, hi: 0xa7},
+	{value: 0x0040, lo: 0xa8, hi: 0xae},
+	{value: 0xe075, lo: 0xaf, hi: 0xaf},
+	{value: 0x0018, lo: 0xb0, hi: 0xb0},
+	{value: 0x0040, lo: 0xb1, hi: 0xbe},
+	{value: 0x3b08, lo: 0xbf, hi: 0xbf},
+	// Block 0x54, offset 0x2cb
+	{value: 0x0000, lo: 0x0a},
+	{value: 0x0008, lo: 0x80, hi: 0x96},
+	{value: 0x0040, lo: 0x97, hi: 0x9f},
+	{value: 0x0008, lo: 0xa0, hi: 0xa6},
+	{value: 0x0040, lo: 0xa7, hi: 0xa7},
+	{value: 0x0008, lo: 0xa8, hi: 0xae},
+	{value: 0x0040, lo: 0xaf, hi: 0xaf},
+	{value: 0x0008, lo: 0xb0, hi: 0xb6},
+	{value: 0x0040, lo: 0xb7, hi: 0xb7},
+	{value: 0x0008, lo: 0xb8, hi: 0xbe},
+	{value: 0x0040, lo: 0xbf, hi: 0xbf},
+	// Block 0x55, offset 0x2d6
+	{value: 0x0000, lo: 0x09},
+	{value: 0x0008, lo: 0x80, hi: 0x86},
+	{value: 0x0040, lo: 0x87, hi: 0x87},
+	{value: 0x0008, lo: 0x88, hi: 0x8e},
+	{value: 0x0040, lo: 0x8f, hi: 0x8f},
+	{value: 0x0008, lo: 0x90, hi: 0x96},
+	{value: 0x0040, lo: 0x97, hi: 0x97},
+	{value: 0x0008, lo: 0x98, hi: 0x9e},
+	{value: 0x0040, lo: 0x9f, hi: 0x9f},
+	{value: 0x3308, lo: 0xa0, hi: 0xbf},
+	// Block 0x56, offset 0x2e0
+	{value: 0x0000, lo: 0x03},
+	{value: 0x0018, lo: 0x80, hi: 0xae},
+	{value: 0x0008, lo: 0xaf, hi: 0xaf},
+	{value: 0x0018, lo: 0xb0, hi: 0xbf},
+	// Block 0x57, offset 0x2e4
+	{value: 0x0000, lo: 0x02},
+	{value: 0x0018, lo: 0x80, hi: 0x9d},
+	{value: 0x0040, lo: 0x9e, hi: 0xbf},
+	// Block 0x58, offset 0x2e7
+	{value: 0x0000, lo: 0x05},
+	{value: 0x0018, lo: 0x80, hi: 0x99},
+	{value: 0x0040, lo: 0x9a, hi: 0x9a},
+	{value: 0x0018, lo: 0x9b, hi: 0x9e},
+	{value: 0x0ef5, lo: 0x9f, hi: 0x9f},
+	{value: 0x0018, lo: 0xa0, hi: 0xbf},
+	// Block 0x59, offset 0x2ed
+	{value: 0x0000, lo: 0x03},
+	{value: 0x0018, lo: 0x80, hi: 0xb2},
+	{value: 0x0f15, lo: 0xb3, hi: 0xb3},
+	{value: 0x0040, lo: 0xb4, hi: 0xbf},
+	// Block 0x5a, offset 0x2f1
+	{value: 0x0020, lo: 0x01},
+	{value: 0x0f35, lo: 0x80, hi: 0xbf},
+	// Block 0x5b, offset 0x2f3
+	{value: 0x0020, lo: 0x02},
+	{value: 0x1735, lo: 0x80, hi: 0x8f},
+	{value: 0x1915, lo: 0x90, hi: 0xbf},
+	// Block 0x5c, offset 0x2f6
+	{value: 0x0020, lo: 0x01},
+	{value: 0x1f15, lo: 0x80, hi: 0xbf},
+	// Block 0x5d, offset 0x2f8
+	{value: 0x0000, lo: 0x02},
+	{value: 0x0040, lo: 0x80, hi: 0x80},
+	{value: 0x0008, lo: 0x81, hi: 0xbf},
+	// Block 0x5e, offset 0x2fb
+	{value: 0x0000, lo: 0x09},
+	{value: 0x0008, lo: 0x80, hi: 0x96},
+	{value: 0x0040, lo: 0x97, hi: 0x98},
+	{value: 0x3308, lo: 0x99, hi: 0x9a},
+	{value: 0x096a, lo: 0x9b, hi: 0x9b},
+	{value: 0x0972, lo: 0x9c, hi: 0x9c},
+	{value: 0x0008, lo: 0x9d, hi: 0x9e},
+	{value: 0x0979, lo: 0x9f, hi: 0x9f},
+	{value: 0x0018, lo: 0xa0, hi: 0xa0},
+	{value: 0x0008, lo: 0xa1, hi: 0xbf},
+	// Block 0x5f, offset 0x305
+	{value: 0x0000, lo: 0x02},
+	{value: 0x0008, lo: 0x80, hi: 0xbe},
+	{value: 0x0981, lo: 0xbf, hi: 0xbf},
+	// Block 0x60, offset 0x308
+	{value: 0x0000, lo: 0x0e},
+	{value: 0x0040, lo: 0x80, hi: 0x84},
+	{value: 0x0008, lo: 0x85, hi: 0xaf},
+	{value: 0x0040, lo: 0xb0, hi: 0xb0},
+	{value: 0x2a35, lo: 0xb1, hi: 0xb1},
+	{value: 0x2a55, lo: 0xb2, hi: 0xb2},
+	{value: 0x2a75, lo: 0xb3, hi: 0xb3},
+	{value: 0x2a95, lo: 0xb4, hi: 0xb4},
+	{value: 0x2a75, lo: 0xb5, hi: 0xb5},
+	{value: 0x2ab5, lo: 0xb6, hi: 0xb6},
+	{value: 0x2ad5, lo: 0xb7, hi: 0xb7},
+	{value: 0x2af5, lo: 0xb8, hi: 0xb9},
+	{value: 0x2b15, lo: 0xba, hi: 0xbb},
+	{value: 0x2b35, lo: 0xbc, hi: 0xbd},
+	{value: 0x2b15, lo: 0xbe, hi: 0xbf},
+	// Block 0x61, offset 0x317
+	{value: 0x0000, lo: 0x03},
+	{value: 0x0018, lo: 0x80, hi: 0xa3},
+	{value: 0x0040, lo: 0xa4, hi: 0xaf},
+	{value: 0x0008, lo: 0xb0, hi: 0xbf},
+	// Block 0x62, offset 0x31b
+	{value: 0x0008, lo: 0x03},
+	{value: 0x098a, lo: 0x80, hi: 0x9e},
+	{value: 0x0040, lo: 0x9f, hi: 0x9f},
+	{value: 0x0a82, lo: 0xa0, hi: 0xbf},
+	// Block 0x63, offset 0x31f
+	{value: 0x0008, lo: 0x01},
+	{value: 0x0d19, lo: 0x80, hi: 0xbf},
+	// Block 0x64, offset 0x321
+	{value: 0x0008, lo: 0x08},
+	{value: 0x0f19, lo: 0x80, hi: 0xb0},
+	{value: 0x4045, lo: 0xb1, hi: 0xb1},
+	{value: 0x10a1, lo: 0xb2, hi: 0xb3},
+	{value: 0x4065, lo: 0xb4, hi: 0xb4},
+	{value: 0x10b1, lo: 0xb5, hi: 0xb7},
+	{value: 0x4085, lo: 0xb8, hi: 0xb8},
+	{value: 0x4085, lo: 0xb9, hi: 0xb9},
+	{value: 0x10c9, lo: 0xba, hi: 0xbf},
+	// Block 0x65, offset 0x32a
+	{value: 0x0000, lo: 0x03},
+	{value: 0x0008, lo: 0x80, hi: 0x8c},
+	{value: 0x0040, lo: 0x8d, hi: 0x8f},
+	{value: 0x0018, lo: 0x90, hi: 0xbf},
+	// Block 0x66, offset 0x32e
+	{value: 0x0000, lo: 0x04},
+	{value: 0x0018, lo: 0x80, hi: 0x86},
+	{value: 0x0040, lo: 0x87, hi: 0x8f},
+	{value: 0x0008, lo: 0x90, hi: 0xbd},
+	{value: 0x0018, lo: 0xbe, hi: 0xbf},
+	// Block 0x67, offset 0x333
+	{value: 0x0000, lo: 0x04},
+	{value: 0x0008, lo: 0x80, hi: 0x8c},
+	{value: 0x0018, lo: 0x8d, hi: 0x8f},
+	{value: 0x0008, lo: 0x90, hi: 0xab},
+	{value: 0x0040, lo: 0xac, hi: 0xbf},
+	// Block 0x68, offset 0x338
+	{value: 0x0000, lo: 0x05},
+	{value: 0x0008, lo: 0x80, hi: 0xa5},
+	{value: 0x0018, lo: 0xa6, hi: 0xaf},
+	{value: 0x3308, lo: 0xb0, hi: 0xb1},
+	{value: 0x0018, lo: 0xb2, hi: 0xb7},
+	{value: 0x0040, lo: 0xb8, hi: 0xbf},
+	// Block 0x69, offset 0x33e
+	{value: 0x0000, lo: 0x0f},
+	{value: 0x0008, lo: 0x80, hi: 0x81},
+	{value: 0x3308, lo: 0x82, hi: 0x82},
+	{value: 0x0008, lo: 0x83, hi: 0x85},
+	{value: 0x3b08, lo: 0x86, hi: 0x86},
+	{value: 0x0008, lo: 0x87, hi: 0x8a},
+	{value: 0x3308, lo: 0x8b, hi: 0x8b},
+	{value: 0x0008, lo: 0x8c, hi: 0xa2},
+	{value: 0x3008, lo: 0xa3, hi: 0xa4},
+	{value: 0x3308, lo: 0xa5, hi: 0xa6},
+	{value: 0x3008, lo: 0xa7, hi: 0xa7},
+	{value: 0x0018, lo: 0xa8, hi: 0xab},
+	{value: 0x3b08, lo: 0xac, hi: 0xac},
+	{value: 0x0040, lo: 0xad, hi: 0xaf},
+	{value: 0x0018, lo: 0xb0, hi: 0xb9},
+	{value: 0x0040, lo: 0xba, hi: 0xbf},
+	// Block 0x6a, offset 0x34e
+	{value: 0x0000, lo: 0x05},
+	{value: 0x0208, lo: 0x80, hi: 0xb1},
+	{value: 0x0108, lo: 0xb2, hi: 0xb2},
+	{value: 0x0008, lo: 0xb3, hi: 0xb3},
+	{value: 0x0018, lo: 0xb4, hi: 0xb7},
+	{value: 0x0040, lo: 0xb8, hi: 0xbf},
+	// Block 0x6b, offset 0x354
+	{value: 0x0000, lo: 0x03},
+	{value: 0x3008, lo: 0x80, hi: 0x81},
+	{value: 0x0008, lo: 0x82, hi: 0xb3},
+	{value: 0x3008, lo: 0xb4, hi: 0xbf},
+	// Block 0x6c, offset 0x358
+	{value: 0x0000, lo: 0x0e},
+	{value: 0x3008, lo: 0x80, hi: 0x83},
+	{value: 0x3b08, lo: 0x84, hi: 0x84},
+	{value: 0x3308, lo: 0x85, hi: 0x85},
+	{value: 0x0040, lo: 0x86, hi: 0x8d},
+	{value: 0x0018, lo: 0x8e, hi: 0x8f},
+	{value: 0x0008, lo: 0x90, hi: 0x99},
+	{value: 0x0040, lo: 0x9a, hi: 0x9f},
+	{value: 0x3308, lo: 0xa0, hi: 0xb1},
+	{value: 0x0008, lo: 0xb2, hi: 0xb7},
+	{value: 0x0018, lo: 0xb8, hi: 0xba},
+	{value: 0x0008, lo: 0xbb, hi: 0xbb},
+	{value: 0x0018, lo: 0xbc, hi: 0xbc},
+	{value: 0x0008, lo: 0xbd, hi: 0xbe},
+	{value: 0x3308, lo: 0xbf, hi: 0xbf},
+	// Block 0x6d, offset 0x367
+	{value: 0x0000, lo: 0x04},
+	{value: 0x0008, lo: 0x80, hi: 0xa5},
+	{value: 0x3308, lo: 0xa6, hi: 0xad},
+	{value: 0x0018, lo: 0xae, hi: 0xaf},
+	{value: 0x0008, lo: 0xb0, hi: 0xbf},
+	// Block 0x6e, offset 0x36c
+	{value: 0x0000, lo: 0x07},
+	{value: 0x0008, lo: 0x80, hi: 0x86},
+	{value: 0x3308, lo: 0x87, hi: 0x91},
+	{value: 0x3008, lo: 0x92, hi: 0x92},
+	{value: 0x3808, lo: 0x93, hi: 0x93},
+	{value: 0x0040, lo: 0x94, hi: 0x9e},
+	{value: 0x0018, lo: 0x9f, hi: 0xbc},
+	{value: 0x0040, lo: 0xbd, hi: 0xbf},
+	// Block 0x6f, offset 0x374
+	{value: 0x0000, lo: 0x09},
+	{value: 0x3308, lo: 0x80, hi: 0x82},
+	{value: 0x3008, lo: 0x83, hi: 0x83},
+	{value: 0x0008, lo: 0x84, hi: 0xb2},
+	{value: 0x3308, lo: 0xb3, hi: 0xb3},
+	{value: 0x3008, lo: 0xb4, hi: 0xb5},
+	{value: 0x3308, lo: 0xb6, hi: 0xb9},
+	{value: 0x3008, lo: 0xba, hi: 0xbb},
+	{value: 0x3308, lo: 0xbc, hi: 0xbd},
+	{value: 0x3008, lo: 0xbe, hi: 0xbf},
+	// Block 0x70, offset 0x37e
+	{value: 0x0000, lo: 0x0a},
+	{value: 0x3808, lo: 0x80, hi: 0x80},
+	{value: 0x0018, lo: 0x81, hi: 0x8d},
+	{value: 0x0040, lo: 0x8e, hi: 0x8e},
+	{value: 0x0008, lo: 0x8f, hi: 0x99},
+	{value: 0x0040, lo: 0x9a, hi: 0x9d},
+	{value: 0x0018, lo: 0x9e, hi: 0x9f},
+	{value: 0x0008, lo: 0xa0, hi: 0xa4},
+	{value: 0x3308, lo: 0xa5, hi: 0xa5},
+	{value: 0x0008, lo: 0xa6, hi: 0xbe},
+	{value: 0x0040, lo: 0xbf, hi: 0xbf},
+	// Block 0x71, offset 0x389
+	{value: 0x0000, lo: 0x07},
+	{value: 0x0008, lo: 0x80, hi: 0xa8},
+	{value: 0x3308, lo: 0xa9, hi: 0xae},
+	{value: 0x3008, lo: 0xaf, hi: 0xb0},
+	{value: 0x3308, lo: 0xb1, hi: 0xb2},
+	{value: 0x3008, lo: 0xb3, hi: 0xb4},
+	{value: 0x3308, lo: 0xb5, hi: 0xb6},
+	{value: 0x0040, lo: 0xb7, hi: 0xbf},
+	// Block 0x72, offset 0x391
+	{value: 0x0000, lo: 0x10},
+	{value: 0x0008, lo: 0x80, hi: 0x82},
+	{value: 0x3308, lo: 0x83, hi: 0x83},
+	{value: 0x0008, lo: 0x84, hi: 0x8b},
+	{value: 0x3308, lo: 0x8c, hi: 0x8c},
+	{value: 0x3008, lo: 0x8d, hi: 0x8d},
+	{value: 0x0040, lo: 0x8e, hi: 0x8f},
+	{value: 0x0008, lo: 0x90, hi: 0x99},
+	{value: 0x0040, lo: 0x9a, hi: 0x9b},
+	{value: 0x0018, lo: 0x9c, hi: 0x9f},
+	{value: 0x0008, lo: 0xa0, hi: 0xb6},
+	{value: 0x0018, lo: 0xb7, hi: 0xb9},
+	{value: 0x0008, lo: 0xba, hi: 0xba},
+	{value: 0x3008, lo: 0xbb, hi: 0xbb},
+	{value: 0x3308, lo: 0xbc, hi: 0xbc},
+	{value: 0x3008, lo: 0xbd, hi: 0xbd},
+	{value: 0x0008, lo: 0xbe, hi: 0xbf},
+	// Block 0x73, offset 0x3a2
+	{value: 0x0000, lo: 0x08},
+	{value: 0x0008, lo: 0x80, hi: 0xaf},
+	{value: 0x3308, lo: 0xb0, hi: 0xb0},
+	{value: 0x0008, lo: 0xb1, hi: 0xb1},
+	{value: 0x3308, lo: 0xb2, hi: 0xb4},
+	{value: 0x0008, lo: 0xb5, hi: 0xb6},
+	{value: 0x3308, lo: 0xb7, hi: 0xb8},
+	{value: 0x0008, lo: 0xb9, hi: 0xbd},
+	{value: 0x3308, lo: 0xbe, hi: 0xbf},
+	// Block 0x74, offset 0x3ab
+	{value: 0x0000, lo: 0x0f},
+	{value: 0x0008, lo: 0x80, hi: 0x80},
+	{value: 0x3308, lo: 0x81, hi: 0x81},
+	{value: 0x0008, lo: 0x82, hi: 0x82},
+	{value: 0x0040, lo: 0x83, hi: 0x9a},
+	{value: 0x0008, lo: 0x9b, hi: 0x9d},
+	{value: 0x0018, lo: 0x9e, hi: 0x9f},
+	{value: 0x0008, lo: 0xa0, hi: 0xaa},
+	{value: 0x3008, lo: 0xab, hi: 0xab},
+	{value: 0x3308, lo: 0xac, hi: 0xad},
+	{value: 0x3008, lo: 0xae, hi: 0xaf},
+	{value: 0x0018, lo: 0xb0, hi: 0xb1},
+	{value: 0x0008, lo: 0xb2, hi: 0xb4},
+	{value: 0x3008, lo: 0xb5, hi: 0xb5},
+	{value: 0x3b08, lo: 0xb6, hi: 0xb6},
+	{value: 0x0040, lo: 0xb7, hi: 0xbf},
+	// Block 0x75, offset 0x3bb
+	{value: 0x0000, lo: 0x0c},
+	{value: 0x0040, lo: 0x80, hi: 0x80},
+	{value: 0x0008, lo: 0x81, hi: 0x86},
+	{value: 0x0040, lo: 0x87, hi: 0x88},
+	{value: 0x0008, lo: 0x89, hi: 0x8e},
+	{value: 0x0040, lo: 0x8f, hi: 0x90},
+	{value: 0x0008, lo: 0x91, hi: 0x96},
+	{value: 0x0040, lo: 0x97, hi: 0x9f},
+	{value: 0x0008, lo: 0xa0, hi: 0xa6},
+	{value: 0x0040, lo: 0xa7, hi: 0xa7},
+	{value: 0x0008, lo: 0xa8, hi: 0xae},
+	{value: 0x0040, lo: 0xaf, hi: 0xaf},
+	{value: 0x0008, lo: 0xb0, hi: 0xbf},
+	// Block 0x76, offset 0x3c8
+	{value: 0x0000, lo: 0x0b},
+	{value: 0x0008, lo: 0x80, hi: 0x9a},
+	{value: 0x0018, lo: 0x9b, hi: 0x9b},
+	{value: 0x449d, lo: 0x9c, hi: 0x9c},
+	{value: 0x44b5, lo: 0x9d, hi: 0x9d},
+	{value: 0x0941, lo: 0x9e, hi: 0x9e},
+	{value: 0xe06d, lo: 0x9f, hi: 0x9f},
+	{value: 0x0008, lo: 0xa0, hi: 0xa8},
+	{value: 0x13f9, lo: 0xa9, hi: 0xa9},
+	{value: 0x0018, lo: 0xaa, hi: 0xab},
+	{value: 0x0040, lo: 0xac, hi: 0xaf},
+	{value: 0x44cd, lo: 0xb0, hi: 0xbf},
+	// Block 0x77, offset 0x3d4
+	{value: 0x0000, lo: 0x04},
+	{value: 0x44ed, lo: 0x80, hi: 0x8f},
+	{value: 0x450d, lo: 0x90, hi: 0x9f},
+	{value: 0x452d, lo: 0xa0, hi: 0xaf},
+	{value: 0x450d, lo: 0xb0, hi: 0xbf},
+	// Block 0x78, offset 0x3d9
+	{value: 0x0000, lo: 0x0c},
+	{value: 0x0008, lo: 0x80, hi: 0xa2},
+	{value: 0x3008, lo: 0xa3, hi: 0xa4},
+	{value: 0x3308, lo: 0xa5, hi: 0xa5},
+	{value: 0x3008, lo: 0xa6, hi: 0xa7},
+	{value: 0x3308, lo: 0xa8, hi: 0xa8},
+	{value: 0x3008, lo: 0xa9, hi: 0xaa},
+	{value: 0x0018, lo: 0xab, hi: 0xab},
+	{value: 0x3008, lo: 0xac, hi: 0xac},
+	{value: 0x3b08, lo: 0xad, hi: 0xad},
+	{value: 0x0040, lo: 0xae, hi: 0xaf},
+	{value: 0x0008, lo: 0xb0, hi: 0xb9},
+	{value: 0x0040, lo: 0xba, hi: 0xbf},
+	// Block 0x79, offset 0x3e6
+	{value: 0x0000, lo: 0x03},
+	{value: 0x0008, lo: 0x80, hi: 0xa3},
+	{value: 0x0040, lo: 0xa4, hi: 0xaf},
+	{value: 0x0018, lo: 0xb0, hi: 0xbf},
+	// Block 0x7a, offset 0x3ea
+	{value: 0x0000, lo: 0x04},
+	{value: 0x0018, lo: 0x80, hi: 0x86},
+	{value: 0x0040, lo: 0x87, hi: 0x8a},
+	{value: 0x0018, lo: 0x8b, hi: 0xbb},
+	{value: 0x0040, lo: 0xbc, hi: 0xbf},
+	// Block 0x7b, offset 0x3ef
+	{value: 0x0000, lo: 0x01},
+	{value: 0x0040, lo: 0x80, hi: 0xbf},
+	// Block 0x7c, offset 0x3f1
+	{value: 0x0020, lo: 0x01},
+	{value: 0x454d, lo: 0x80, hi: 0xbf},
+	// Block 0x7d, offset 0x3f3
+	{value: 0x0020, lo: 0x03},
+	{value: 0x4d4d, lo: 0x80, hi: 0x94},
+	{value: 0x4b0d, lo: 0x95, hi: 0x95},
+	{value: 0x4fed, lo: 0x96, hi: 0xbf},
+	// Block 0x7e, offset 0x3f7
+	{value: 0x0020, lo: 0x01},
+	{value: 0x552d, lo: 0x80, hi: 0xbf},
+	// Block 0x7f, offset 0x3f9
+	{value: 0x0020, lo: 0x03},
+	{value: 0x5d2d, lo: 0x80, hi: 0x84},
+	{value: 0x568d, lo: 0x85, hi: 0x85},
+	{value: 0x5dcd, lo: 0x86, hi: 0xbf},
+	// Block 0x80, offset 0x3fd
+	{value: 0x0020, lo: 0x08},
+	{value: 0x6b8d, lo: 0x80, hi: 0x8f},
+	{value: 0x6d4d, lo: 0x90, hi: 0x90},
+	{value: 0x6d8d, lo: 0x91, hi: 0xab},
+	{value: 0x1401, lo: 0xac, hi: 0xac},
+	{value: 0x70ed, lo: 0xad, hi: 0xad},
+	{value: 0x0040, lo: 0xae, hi: 0xae},
+	{value: 0x0040, lo: 0xaf, hi: 0xaf},
+	{value: 0x710d, lo: 0xb0, hi: 0xbf},
+	// Block 0x81, offset 0x406
+	{value: 0x0020, lo: 0x05},
+	{value: 0x730d, lo: 0x80, hi: 0xad},
+	{value: 0x656d, lo: 0xae, hi: 0xae},
+	{value: 0x78cd, lo: 0xaf, hi: 0xb5},
+	{value: 0x6f8d, lo: 0xb6, hi: 0xb6},
+	{value: 0x79ad, lo: 0xb7, hi: 0xbf},
+	// Block 0x82, offset 0x40c
+	{value: 0x0008, lo: 0x03},
+	{value: 0x1751, lo: 0x80, hi: 0x82},
+	{value: 0x1741, lo: 0x83, hi: 0x83},
+	{value: 0x1769, lo: 0x84, hi: 0xbf},
+	// Block 0x83, offset 0x410
+	{value: 0x0008, lo: 0x0f},
+	{value: 0x1d81, lo: 0x80, hi: 0x83},
+	{value: 0x1d99, lo: 0x84, hi: 0x85},
+	{value: 0x1da1, lo: 0x86, hi: 0x87},
+	{value: 0x1da9, lo: 0x88, hi: 0x8f},
+	{value: 0x0040, lo: 0x90, hi: 0x90},
+	{value: 0x0040, lo: 0x91, hi: 0x91},
+	{value: 0x1de9, lo: 0x92, hi: 0x97},
+	{value: 0x1e11, lo: 0x98, hi: 0x9c},
+	{value: 0x1e31, lo: 0x9d, hi: 0xb3},
+	{value: 0x1d71, lo: 0xb4, hi: 0xb4},
+	{value: 0x1d81, lo: 0xb5, hi: 0xb5},
+	{value: 0x1ee9, lo: 0xb6, hi: 0xbb},
+	{value: 0x1f09, lo: 0xbc, hi: 0xbc},
+	{value: 0x1ef9, lo: 0xbd, hi: 0xbd},
+	{value: 0x1f19, lo: 0xbe, hi: 0xbf},
+	// Block 0x84, offset 0x420
+	{value: 0x0000, lo: 0x09},
+	{value: 0x0008, lo: 0x80, hi: 0x8b},
+	{value: 0x0040, lo: 0x8c, hi: 0x8c},
+	{value: 0x0008, lo: 0x8d, hi: 0xa6},
+	{value: 0x0040, lo: 0xa7, hi: 0xa7},
+	{value: 0x0008, lo: 0xa8, hi: 0xba},
+	{value: 0x0040, lo: 0xbb, hi: 0xbb},
+	{value: 0x0008, lo: 0xbc, hi: 0xbd},
+	{value: 0x0040, lo: 0xbe, hi: 0xbe},
+	{value: 0x0008, lo: 0xbf, hi: 0xbf},
+	// Block 0x85, offset 0x42a
+	{value: 0x0000, lo: 0x04},
+	{value: 0x0008, lo: 0x80, hi: 0x8d},
+	{value: 0x0040, lo: 0x8e, hi: 0x8f},
+	{value: 0x0008, lo: 0x90, hi: 0x9d},
+	{value: 0x0040, lo: 0x9e, hi: 0xbf},
+	// Block 0x86, offset 0x42f
+	{value: 0x0000, lo: 0x02},
+	{value: 0x0008, lo: 0x80, hi: 0xba},
+	{value: 0x0040, lo: 0xbb, hi: 0xbf},
+	// Block 0x87, offset 0x432
+	{value: 0x0000, lo: 0x05},
+	{value: 0x0018, lo: 0x80, hi: 0x82},
+	{value: 0x0040, lo: 0x83, hi: 0x86},
+	{value: 0x0018, lo: 0x87, hi: 0xb3},
+	{value: 0x0040, lo: 0xb4, hi: 0xb6},
+	{value: 0x0018, lo: 0xb7, hi: 0xbf},
+	// Block 0x88, offset 0x438
+	{value: 0x0000, lo: 0x06},
+	{value: 0x0018, lo: 0x80, hi: 0x8e},
+	{value: 0x0040, lo: 0x8f, hi: 0x8f},
+	{value: 0x0018, lo: 0x90, hi: 0x9c},
+	{value: 0x0040, lo: 0x9d, hi: 0x9f},
+	{value: 0x0018, lo: 0xa0, hi: 0xa0},
+	{value: 0x0040, lo: 0xa1, hi: 0xbf},
+	// Block 0x89, offset 0x43f
+	{value: 0x0000, lo: 0x04},
+	{value: 0x0040, lo: 0x80, hi: 0x8f},
+	{value: 0x0018, lo: 0x90, hi: 0xbc},
+	{value: 0x3308, lo: 0xbd, hi: 0xbd},
+	{value: 0x0040, lo: 0xbe, hi: 0xbf},
+	// Block 0x8a, offset 0x444
+	{value: 0x0000, lo: 0x03},
+	{value: 0x0008, lo: 0x80, hi: 0x9c},
+	{value: 0x0040, lo: 0x9d, hi: 0x9f},
+	{value: 0x0008, lo: 0xa0, hi: 0xbf},
+	// Block 0x8b, offset 0x448
+	{value: 0x0000, lo: 0x05},
+	{value: 0x0008, lo: 0x80, hi: 0x90},
+	{value: 0x0040, lo: 0x91, hi: 0x9f},
+	{value: 0x3308, lo: 0xa0, hi: 0xa0},
+	{value: 0x0018, lo: 0xa1, hi: 0xbb},
+	{value: 0x0040, lo: 0xbc, hi: 0xbf},
+	// Block 0x8c, offset 0x44e
+	{value: 0x0000, lo: 0x04},
+	{value: 0x0008, lo: 0x80, hi: 0x9f},
+	{value: 0x0018, lo: 0xa0, hi: 0xa3},
+	{value: 0x0040, lo: 0xa4, hi: 0xac},
+	{value: 0x0008, lo: 0xad, hi: 0xbf},
+	// Block 0x8d, offset 0x453
+	{value: 0x0000, lo: 0x08},
+	{value: 0x0008, lo: 0x80, hi: 0x80},
+	{value: 0x0018, lo: 0x81, hi: 0x81},
+	{value: 0x0008, lo: 0x82, hi: 0x89},
+	{value: 0x0018, lo: 0x8a, hi: 0x8a},
+	{value: 0x0040, lo: 0x8b, hi: 0x8f},
+	{value: 0x0008, lo: 0x90, hi: 0xb5},
+	{value: 0x3308, lo: 0xb6, hi: 0xba},
+	{value: 0x0040, lo: 0xbb, hi: 0xbf},
+	// Block 0x8e, offset 0x45c
+	{value: 0x0000, lo: 0x04},
+	{value: 0x0008, lo: 0x80, hi: 0x9d},
+	{value: 0x0040, lo: 0x9e, hi: 0x9e},
+	{value: 0x0018, lo: 0x9f, hi: 0x9f},
+	{value: 0x0008, lo: 0xa0, hi: 0xbf},
+	// Block 0x8f, offset 0x461
+	{value: 0x0000, lo: 0x05},
+	{value: 0x0008, lo: 0x80, hi: 0x83},
+	{value: 0x0040, lo: 0x84, hi: 0x87},
+	{value: 0x0008, lo: 0x88, hi: 0x8f},
+	{value: 0x0018, lo: 0x90, hi: 0x95},
+	{value: 0x0040, lo: 0x96, hi: 0xbf},
+	// Block 0x90, offset 0x467
+	{value: 0x0000, lo: 0x06},
+	{value: 0xe145, lo: 0x80, hi: 0x87},
+	{value: 0xe1c5, lo: 0x88, hi: 0x8f},
+	{value: 0xe145, lo: 0x90, hi: 0x97},
+	{value: 0x8b0d, lo: 0x98, hi: 0x9f},
+	{value: 0x8b25, lo: 0xa0, hi: 0xa7},
+	{value: 0x0008, lo: 0xa8, hi: 0xbf},
+	// Block 0x91, offset 0x46e
+	{value: 0x0000, lo: 0x06},
+	{value: 0x0008, lo: 0x80, hi: 0x9d},
+	{value: 0x0040, lo: 0x9e, hi: 0x9f},
+	{value: 0x0008, lo: 0xa0, hi: 0xa9},
+	{value: 0x0040, lo: 0xaa, hi: 0xaf},
+	{value: 0x8b25, lo: 0xb0, hi: 0xb7},
+	{value: 0x8b0d, lo: 0xb8, hi: 0xbf},
+	// Block 0x92, offset 0x475
+	{value: 0x0000, lo: 0x06},
+	{value: 0xe145, lo: 0x80, hi: 0x87},
+	{value: 0xe1c5, lo: 0x88, hi: 0x8f},
+	{value: 0xe145, lo: 0x90, hi: 0x93},
+	{value: 0x0040, lo: 0x94, hi: 0x97},
+	{value: 0x0008, lo: 0x98, hi: 0xbb},
+	{value: 0x0040, lo: 0xbc, hi: 0xbf},
+	// Block 0x93, offset 0x47c
+	{value: 0x0000, lo: 0x03},
+	{value: 0x0008, lo: 0x80, hi: 0xa7},
+	{value: 0x0040, lo: 0xa8, hi: 0xaf},
+	{value: 0x0008, lo: 0xb0, hi: 0xbf},
+	// Block 0x94, offset 0x480
+	{value: 0x0000, lo: 0x02},
+	{value: 0x0008, lo: 0x80, hi: 0xb6},
+	{value: 0x0040, lo: 0xb7, hi: 0xbf},
+	// Block 0x95, offset 0x483
+	{value: 0x0000, lo: 0x04},
+	{value: 0x0008, lo: 0x80, hi: 0x95},
+	{value: 0x0040, lo: 0x96, hi: 0x9f},
+	{value: 0x0008, lo: 0xa0, hi: 0xa7},
+	{value: 0x0040, lo: 0xa8, hi: 0xbf},
+	// Block 0x96, offset 0x488
+	{value: 0x0000, lo: 0x0b},
+	{value: 0x0808, lo: 0x80, hi: 0x85},
+	{value: 0x0040, lo: 0x86, hi: 0x87},
+	{value: 0x0808, lo: 0x88, hi: 0x88},
+	{value: 0x0040, lo: 0x89, hi: 0x89},
+	{value: 0x0808, lo: 0x8a, hi: 0xb5},
+	{value: 0x0040, lo: 0xb6, hi: 0xb6},
+	{value: 0x0808, lo: 0xb7, hi: 0xb8},
+	{value: 0x0040, lo: 0xb9, hi: 0xbb},
+	{value: 0x0808, lo: 0xbc, hi: 0xbc},
+	{value: 0x0040, lo: 0xbd, hi: 0xbe},
+	{value: 0x0808, lo: 0xbf, hi: 0xbf},
+	// Block 0x97, offset 0x494
+	{value: 0x0000, lo: 0x05},
+	{value: 0x0808, lo: 0x80, hi: 0x95},
+	{value: 0x0040, lo: 0x96, hi: 0x96},
+	{value: 0x0818, lo: 0x97, hi: 0x9f},
+	{value: 0x0808, lo: 0xa0, hi: 0xb6},
+	{value: 0x0818, lo: 0xb7, hi: 0xbf},
+	// Block 0x98, offset 0x49a
+	{value: 0x0000, lo: 0x04},
+	{value: 0x0808, lo: 0x80, hi: 0x9e},
+	{value: 0x0040, lo: 0x9f, hi: 0xa6},
+	{value: 0x0818, lo: 0xa7, hi: 0xaf},
+	{value: 0x0040, lo: 0xb0, hi: 0xbf},
+	// Block 0x99, offset 0x49f
+	{value: 0x0000, lo: 0x06},
+	{value: 0x0040, lo: 0x80, hi: 0x9f},
+	{value: 0x0808, lo: 0xa0, hi: 0xb2},
+	{value: 0x0040, lo: 0xb3, hi: 0xb3},
+	{value: 0x0808, lo: 0xb4, hi: 0xb5},
+	{value: 0x0040, lo: 0xb6, hi: 0xba},
+	{value: 0x0818, lo: 0xbb, hi: 0xbf},
+	// Block 0x9a, offset 0x4a6
+	{value: 0x0000, lo: 0x07},
+	{value: 0x0808, lo: 0x80, hi: 0x95},
+	{value: 0x0818, lo: 0x96, hi: 0x9b},
+	{value: 0x0040, lo: 0x9c, hi: 0x9e},
+	{value: 0x0018, lo: 0x9f, hi: 0x9f},
+	{value: 0x0808, lo: 0xa0, hi: 0xb9},
+	{value: 0x0040, lo: 0xba, hi: 0xbe},
+	{value: 0x0818, lo: 0xbf, hi: 0xbf},
+	// Block 0x9b, offset 0x4ae
+	{value: 0x0000, lo: 0x04},
+	{value: 0x0808, lo: 0x80, hi: 0xb7},
+	{value: 0x0040, lo: 0xb8, hi: 0xbb},
+	{value: 0x0818, lo: 0xbc, hi: 0xbd},
+	{value: 0x0808, lo: 0xbe, hi: 0xbf},
+	// Block 0x9c, offset 0x4b3
+	{value: 0x0000, lo: 0x03},
+	{value: 0x0818, lo: 0x80, hi: 0x8f},
+	{value: 0x0040, lo: 0x90, hi: 0x91},
+	{value: 0x0818, lo: 0x92, hi: 0xbf},
+	// Block 0x9d, offset 0x4b7
+	{value: 0x0000, lo: 0x0f},
+	{value: 0x0808, lo: 0x80, hi: 0x80},
+	{value: 0x3308, lo: 0x81, hi: 0x83},
+	{value: 0x0040, lo: 0x84, hi: 0x84},
+	{value: 0x3308, lo: 0x85, hi: 0x86},
+	{value: 0x0040, lo: 0x87, hi: 0x8b},
+	{value: 0x3308, lo: 0x8c, hi: 0x8f},
+	{value: 0x0808, lo: 0x90, hi: 0x93},
+	{value: 0x0040, lo: 0x94, hi: 0x94},
+	{value: 0x0808, lo: 0x95, hi: 0x97},
+	{value: 0x0040, lo: 0x98, hi: 0x98},
+	{value: 0x0808, lo: 0x99, hi: 0xb5},
+	{value: 0x0040, lo: 0xb6, hi: 0xb7},
+	{value: 0x3308, lo: 0xb8, hi: 0xba},
+	{value: 0x0040, lo: 0xbb, hi: 0xbe},
+	{value: 0x3b08, lo: 0xbf, hi: 0xbf},
+	// Block 0x9e, offset 0x4c7
+	{value: 0x0000, lo: 0x06},
+	{value: 0x0818, lo: 0x80, hi: 0x88},
+	{value: 0x0040, lo: 0x89, hi: 0x8f},
+	{value: 0x0818, lo: 0x90, hi: 0x98},
+	{value: 0x0040, lo: 0x99, hi: 0x9f},
+	{value: 0x0808, lo: 0xa0, hi: 0xbc},
+	{value: 0x0818, lo: 0xbd, hi: 0xbf},
+	// Block 0x9f, offset 0x4ce
+	{value: 0x0000, lo: 0x03},
+	{value: 0x0808, lo: 0x80, hi: 0x9c},
+	{value: 0x0818, lo: 0x9d, hi: 0x9f},
+	{value: 0x0040, lo: 0xa0, hi: 0xbf},
+	// Block 0xa0, offset 0x4d2
+	{value: 0x0000, lo: 0x03},
+	{value: 0x0808, lo: 0x80, hi: 0xb5},
+	{value: 0x0040, lo: 0xb6, hi: 0xb8},
+	{value: 0x0018, lo: 0xb9, hi: 0xbf},
+	// Block 0xa1, offset 0x4d6
+	{value: 0x0000, lo: 0x06},
+	{value: 0x0808, lo: 0x80, hi: 0x95},
+	{value: 0x0040, lo: 0x96, hi: 0x97},
+	{value: 0x0818, lo: 0x98, hi: 0x9f},
+	{value: 0x0808, lo: 0xa0, hi: 0xb2},
+	{value: 0x0040, lo: 0xb3, hi: 0xb7},
+	{value: 0x0818, lo: 0xb8, hi: 0xbf},
+	// Block 0xa2, offset 0x4dd
+	{value: 0x0000, lo: 0x01},
+	{value: 0x0808, lo: 0x80, hi: 0xbf},
+	// Block 0xa3, offset 0x4df
+	{value: 0x0000, lo: 0x02},
+	{value: 0x0808, lo: 0x80, hi: 0x88},
+	{value: 0x0040, lo: 0x89, hi: 0xbf},
+	// Block 0xa4, offset 0x4e2
+	{value: 0x0000, lo: 0x02},
+	{value: 0x03dd, lo: 0x80, hi: 0xb2},
+	{value: 0x0040, lo: 0xb3, hi: 0xbf},
+	// Block 0xa5, offset 0x4e5
+	{value: 0x0000, lo: 0x03},
+	{value: 0x0808, lo: 0x80, hi: 0xb2},
+	{value: 0x0040, lo: 0xb3, hi: 0xb9},
+	{value: 0x0818, lo: 0xba, hi: 0xbf},
+	// Block 0xa6, offset 0x4e9
+	{value: 0x0000, lo: 0x08},
+	{value: 0x0908, lo: 0x80, hi: 0x80},
+	{value: 0x0a08, lo: 0x81, hi: 0xa1},
+	{value: 0x0c08, lo: 0xa2, hi: 0xa2},
+	{value: 0x0a08, lo: 0xa3, hi: 0xa3},
+	{value: 0x3308, lo: 0xa4, hi: 0xa7},
+	{value: 0x0040, lo: 0xa8, hi: 0xaf},
+	{value: 0x0808, lo: 0xb0, hi: 0xb9},
+	{value: 0x0040, lo: 0xba, hi: 0xbf},
+	// Block 0xa7, offset 0x4f2
+	{value: 0x0000, lo: 0x03},
+	{value: 0x0040, lo: 0x80, hi: 0x9f},
+	{value: 0x0818, lo: 0xa0, hi: 0xbe},
+	{value: 0x0040, lo: 0xbf, hi: 0xbf},
+	// Block 0xa8, offset 0x4f6
+	{value: 0x0000, lo: 0x07},
+	{value: 0x0808, lo: 0x80, hi: 0xa9},
+	{value: 0x0040, lo: 0xaa, hi: 0xaa},
+	{value: 0x3308, lo: 0xab, hi: 0xac},
+	{value: 0x0818, lo: 0xad, hi: 0xad},
+	{value: 0x0040, lo: 0xae, hi: 0xaf},
+	{value: 0x0808, lo: 0xb0, hi: 0xb1},
+	{value: 0x0040, lo: 0xb2, hi: 0xbf},
+	// Block 0xa9, offset 0x4fe
+	{value: 0x0000, lo: 0x02},
+	{value: 0x0040, lo: 0x80, hi: 0xbc},
+	{value: 0x3308, lo: 0xbd, hi: 0xbf},
+	// Block 0xaa, offset 0x501
+	{value: 0x0000, lo: 0x07},
+	{value: 0x0808, lo: 0x80, hi: 0x9c},
+	{value: 0x0818, lo: 0x9d, hi: 0xa6},
+	{value: 0x0808, lo: 0xa7, hi: 0xa7},
+	{value: 0x0040, lo: 0xa8, hi: 0xaf},
+	{value: 0x0a08, lo: 0xb0, hi: 0xb2},
+	{value: 0x0c08, lo: 0xb3, hi: 0xb3},
+	{value: 0x0a08, lo: 0xb4, hi: 0xbf},
+	// Block 0xab, offset 0x509
+	{value: 0x0000, lo: 0x0a},
+	{value: 0x0a08, lo: 0x80, hi: 0x84},
+	{value: 0x0808, lo: 0x85, hi: 0x85},
+	{value: 0x3308, lo: 0x86, hi: 0x90},
+	{value: 0x0a18, lo: 0x91, hi: 0x93},
+	{value: 0x0c18, lo: 0x94, hi: 0x94},
+	{value: 0x0818, lo: 0x95, hi: 0x99},
+	{value: 0x0040, lo: 0x9a, hi: 0xaf},
+	{value: 0x0a08, lo: 0xb0, hi: 0xb3},
+	{value: 0x0c08, lo: 0xb4, hi: 0xb5},
+	{value: 0x0a08, lo: 0xb6, hi: 0xbf},
+	// Block 0xac, offset 0x514
+	{value: 0x0000, lo: 0x0e},
+	{value: 0x0a08, lo: 0x80, hi: 0x81},
+	{value: 0x3308, lo: 0x82, hi: 0x85},
+	{value: 0x0818, lo: 0x86, hi: 0x89},
+	{value: 0x0040, lo: 0x8a, hi: 0xaf},
+	{value: 0x0a08, lo: 0xb0, hi: 0xb0},
+	{value: 0x0808, lo: 0xb1, hi: 0xb1},
+	{value: 0x0a08, lo: 0xb2, hi: 0xb3},
+	{value: 0x0c08, lo: 0xb4, hi: 0xb6},
+	{value: 0x0808, lo: 0xb7, hi: 0xb7},
+	{value: 0x0a08, lo: 0xb8, hi: 0xb8},
+	{value: 0x0c08, lo: 0xb9, hi: 0xba},
+	{value: 0x0a08, lo: 0xbb, hi: 0xbc},
+	{value: 0x0c08, lo: 0xbd, hi: 0xbd},
+	{value: 0x0a08, lo: 0xbe, hi: 0xbf},
+	// Block 0xad, offset 0x523
+	{value: 0x0000, lo: 0x0b},
+	{value: 0x0808, lo: 0x80, hi: 0x80},
+	{value: 0x0a08, lo: 0x81, hi: 0x81},
+	{value: 0x0c08, lo: 0x82, hi: 0x83},
+	{value: 0x0a08, lo: 0x84, hi: 0x84},
+	{value: 0x0818, lo: 0x85, hi: 0x88},
+	{value: 0x0c18, lo: 0x89, hi: 0x89},
+	{value: 0x0a18, lo: 0x8a, hi: 0x8a},
+	{value: 0x0918, lo: 0x8b, hi: 0x8b},
+	{value: 0x0040, lo: 0x8c, hi: 0x9f},
+	{value: 0x0808, lo: 0xa0, hi: 0xb6},
+	{value: 0x0040, lo: 0xb7, hi: 0xbf},
+	// Block 0xae, offset 0x52f
+	{value: 0x0000, lo: 0x05},
+	{value: 0x3008, lo: 0x80, hi: 0x80},
+	{value: 0x3308, lo: 0x81, hi: 0x81},
+	{value: 0x3008, lo: 0x82, hi: 0x82},
+	{value: 0x0008, lo: 0x83, hi: 0xb7},
+	{value: 0x3308, lo: 0xb8, hi: 0xbf},
+	// Block 0xaf, offset 0x535
+	{value: 0x0000, lo: 0x0c},
+	{value: 0x3308, lo: 0x80, hi: 0x85},
+	{value: 0x3b08, lo: 0x86, hi: 0x86},
+	{value: 0x0018, lo: 0x87, hi: 0x8d},
+	{value: 0x0040, lo: 0x8e, hi: 0x91},
+	{value: 0x0018, lo: 0x92, hi: 0xa5},
+	{value: 0x0008, lo: 0xa6, hi: 0xaf},
+	{value: 0x3b08, lo: 0xb0, hi: 0xb0},
+	{value: 0x0008, lo: 0xb1, hi: 0xb2},
+	{value: 0x3308, lo: 0xb3, hi: 0xb4},
+	{value: 0x0008, lo: 0xb5, hi: 0xb5},
+	{value: 0x0040, lo: 0xb6, hi: 0xbe},
+	{value: 0x3b08, lo: 0xbf, hi: 0xbf},
+	// Block 0xb0, offset 0x542
+	{value: 0x0000, lo: 0x0b},
+	{value: 0x3308, lo: 0x80, hi: 0x81},
+	{value: 0x3008, lo: 0x82, hi: 0x82},
+	{value: 0x0008, lo: 0x83, hi: 0xaf},
+	{value: 0x3008, lo: 0xb0, hi: 0xb2},
+	{value: 0x3308, lo: 0xb3, hi: 0xb6},
+	{value: 0x3008, lo: 0xb7, hi: 0xb8},
+	{value: 0x3b08, lo: 0xb9, hi: 0xb9},
+	{value: 0x3308, lo: 0xba, hi: 0xba},
+	{value: 0x0018, lo: 0xbb, hi: 0xbc},
+	{value: 0x0040, lo: 0xbd, hi: 0xbd},
+	{value: 0x0018, lo: 0xbe, hi: 0xbf},
+	// Block 0xb1, offset 0x54e
+	{value: 0x0000, lo: 0x07},
+	{value: 0x0018, lo: 0x80, hi: 0x81},
+	{value: 0x3308, lo: 0x82, hi: 0x82},
+	{value: 0x0040, lo: 0x83, hi: 0x8f},
+	{value: 0x0008, lo: 0x90, hi: 0xa8},
+	{value: 0x0040, lo: 0xa9, hi: 0xaf},
+	{value: 0x0008, lo: 0xb0, hi: 0xb9},
+	{value: 0x0040, lo: 0xba, hi: 0xbf},
+	// Block 0xb2, offset 0x556
+	{value: 0x0000, lo: 0x08},
+	{value: 0x3308, lo: 0x80, hi: 0x82},
+	{value: 0x0008, lo: 0x83, hi: 0xa6},
+	{value: 0x3308, lo: 0xa7, hi: 0xab},
+	{value: 0x3008, lo: 0xac, hi: 0xac},
+	{value: 0x3308, lo: 0xad, hi: 0xb2},
+	{value: 0x3b08, lo: 0xb3, hi: 0xb4},
+	{value: 0x0040, lo: 0xb5, hi: 0xb5},
+	{value: 0x0008, lo: 0xb6, hi: 0xbf},
+	// Block 0xb3, offset 0x55f
+	{value: 0x0000, lo: 0x0a},
+	{value: 0x0018, lo: 0x80, hi: 0x83},
+	{value: 0x0008, lo: 0x84, hi: 0x84},
+	{value: 0x3008, lo: 0x85, hi: 0x86},
+	{value: 0x0008, lo: 0x87, hi: 0x87},
+	{value: 0x0040, lo: 0x88, hi: 0x8f},
+	{value: 0x0008, lo: 0x90, hi: 0xb2},
+	{value: 0x3308, lo: 0xb3, hi: 0xb3},
+	{value: 0x0018, lo: 0xb4, hi: 0xb5},
+	{value: 0x0008, lo: 0xb6, hi: 0xb6},
+	{value: 0x0040, lo: 0xb7, hi: 0xbf},
+	// Block 0xb4, offset 0x56a
+	{value: 0x0000, lo: 0x06},
+	{value: 0x3308, lo: 0x80, hi: 0x81},
+	{value: 0x3008, lo: 0x82, hi: 0x82},
+	{value: 0x0008, lo: 0x83, hi: 0xb2},
+	{value: 0x3008, lo: 0xb3, hi: 0xb5},
+	{value: 0x3308, lo: 0xb6, hi: 0xbe},
+	{value: 0x3008, lo: 0xbf, hi: 0xbf},
+	// Block 0xb5, offset 0x571
+	{value: 0x0000, lo: 0x0e},
+	{value: 0x3808, lo: 0x80, hi: 0x80},
+	{value: 0x0008, lo: 0x81, hi: 0x84},
+	{value: 0x0018, lo: 0x85, hi: 0x88},
+	{value: 0x3308, lo: 0x89, hi: 0x8c},
+	{value: 0x0018, lo: 0x8d, hi: 0x8d},
+	{value: 0x3008, lo: 0x8e, hi: 0x8e},
+	{value: 0x3308, lo: 0x8f, hi: 0x8f},
+	{value: 0x0008, lo: 0x90, hi: 0x9a},
+	{value: 0x0018, lo: 0x9b, hi: 0x9b},
+	{value: 0x0008, lo: 0x9c, hi: 0x9c},
+	{value: 0x0018, lo: 0x9d, hi: 0x9f},
+	{value: 0x0040, lo: 0xa0, hi: 0xa0},
+	{value: 0x0018, lo: 0xa1, hi: 0xb4},
+	{value: 0x0040, lo: 0xb5, hi: 0xbf},
+	// Block 0xb6, offset 0x580
+	{value: 0x0000, lo: 0x0c},
+	{value: 0x0008, lo: 0x80, hi: 0x91},
+	{value: 0x0040, lo: 0x92, hi: 0x92},
+	{value: 0x0008, lo: 0x93, hi: 0xab},
+	{value: 0x3008, lo: 0xac, hi: 0xae},
+	{value: 0x3308, lo: 0xaf, hi: 0xb1},
+	{value: 0x3008, lo: 0xb2, hi: 0xb3},
+	{value: 0x3308, lo: 0xb4, hi: 0xb4},
+	{value: 0x3808, lo: 0xb5, hi: 0xb5},
+	{value: 0x3308, lo: 0xb6, hi: 0xb7},
+	{value: 0x0018, lo: 0xb8, hi: 0xbd},
+	{value: 0x3308, lo: 0xbe, hi: 0xbe},
+	{value: 0x0008, lo: 0xbf, hi: 0xbf},
+	// Block 0xb7, offset 0x58d
+	{value: 0x0000, lo: 0x03},
+	{value: 0x0008, lo: 0x80, hi: 0x80},
+	{value: 0x3308, lo: 0x81, hi: 0x81},
+	{value: 0x0040, lo: 0x82, hi: 0xbf},
+	// Block 0xb8, offset 0x591
+	{value: 0x0000, lo: 0x0c},
+	{value: 0x0008, lo: 0x80, hi: 0x86},
+	{value: 0x0040, lo: 0x87, hi: 0x87},
+	{value: 0x0008, lo: 0x88, hi: 0x88},
+	{value: 0x0040, lo: 0x89, hi: 0x89},
+	{value: 0x0008, lo: 0x8a, hi: 0x8d},
+	{value: 0x0040, lo: 0x8e, hi: 0x8e},
+	{value: 0x0008, lo: 0x8f, hi: 0x9d},
+	{value: 0x0040, lo: 0x9e, hi: 0x9e},
+	{value: 0x0008, lo: 0x9f, hi: 0xa8},
+	{value: 0x0018, lo: 0xa9, hi: 0xa9},
+	{value: 0x0040, lo: 0xaa, hi: 0xaf},
+	{value: 0x0008, lo: 0xb0, hi: 0xbf},
+	// Block 0xb9, offset 0x59e
+	{value: 0x0000, lo: 0x08},
+	{value: 0x0008, lo: 0x80, hi: 0x9e},
+	{value: 0x3308, lo: 0x9f, hi: 0x9f},
+	{value: 0x3008, lo: 0xa0, hi: 0xa2},
+	{value: 0x3308, lo: 0xa3, hi: 0xa9},
+	{value: 0x3b08, lo: 0xaa, hi: 0xaa},
+	{value: 0x0040, lo: 0xab, hi: 0xaf},
+	{value: 0x0008, lo: 0xb0, hi: 0xb9},
+	{value: 0x0040, lo: 0xba, hi: 0xbf},
+	// Block 0xba, offset 0x5a7
+	{value: 0x0000, lo: 0x03},
+	{value: 0x0008, lo: 0x80, hi: 0xb4},
+	{value: 0x3008, lo: 0xb5, hi: 0xb7},
+	{value: 0x3308, lo: 0xb8, hi: 0xbf},
+	// Block 0xbb, offset 0x5ab
+	{value: 0x0000, lo: 0x0e},
+	{value: 0x3008, lo: 0x80, hi: 0x81},
+	{value: 0x3b08, lo: 0x82, hi: 0x82},
+	{value: 0x3308, lo: 0x83, hi: 0x84},
+	{value: 0x3008, lo: 0x85, hi: 0x85},
+	{value: 0x3308, lo: 0x86, hi: 0x86},
+	{value: 0x0008, lo: 0x87, hi: 0x8a},
+	{value: 0x0018, lo: 0x8b, hi: 0x8f},
+	{value: 0x0008, lo: 0x90, hi: 0x99},
+	{value: 0x0018, lo: 0x9a, hi: 0x9b},
+	{value: 0x0040, lo: 0x9c, hi: 0x9c},
+	{value: 0x0018, lo: 0x9d, hi: 0x9d},
+	{value: 0x3308, lo: 0x9e, hi: 0x9e},
+	{value: 0x0008, lo: 0x9f, hi: 0xa1},
+	{value: 0x0040, lo: 0xa2, hi: 0xbf},
+	// Block 0xbc, offset 0x5ba
+	{value: 0x0000, lo: 0x07},
+	{value: 0x0008, lo: 0x80, hi: 0xaf},
+	{value: 0x3008, lo: 0xb0, hi: 0xb2},
+	{value: 0x3308, lo: 0xb3, hi: 0xb8},
+	{value: 0x3008, lo: 0xb9, hi: 0xb9},
+	{value: 0x3308, lo: 0xba, hi: 0xba},
+	{value: 0x3008, lo: 0xbb, hi: 0xbe},
+	{value: 0x3308, lo: 0xbf, hi: 0xbf},
+	// Block 0xbd, offset 0x5c2
+	{value: 0x0000, lo: 0x0a},
+	{value: 0x3308, lo: 0x80, hi: 0x80},
+	{value: 0x3008, lo: 0x81, hi: 0x81},
+	{value: 0x3b08, lo: 0x82, hi: 0x82},
+	{value: 0x3308, lo: 0x83, hi: 0x83},
+	{value: 0x0008, lo: 0x84, hi: 0x85},
+	{value: 0x0018, lo: 0x86, hi: 0x86},
+	{value: 0x0008, lo: 0x87, hi: 0x87},
+	{value: 0x0040, lo: 0x88, hi: 0x8f},
+	{value: 0x0008, lo: 0x90, hi: 0x99},
+	{value: 0x0040, lo: 0x9a, hi: 0xbf},
+	// Block 0xbe, offset 0x5cd
+	{value: 0x0000, lo: 0x08},
+	{value: 0x0008, lo: 0x80, hi: 0xae},
+	{value: 0x3008, lo: 0xaf, hi: 0xb1},
+	{value: 0x3308, lo: 0xb2, hi: 0xb5},
+	{value: 0x0040, lo: 0xb6, hi: 0xb7},
+	{value: 0x3008, lo: 0xb8, hi: 0xbb},
+	{value: 0x3308, lo: 0xbc, hi: 0xbd},
+	{value: 0x3008, lo: 0xbe, hi: 0xbe},
+	{value: 0x3b08, lo: 0xbf, hi: 0xbf},
+	// Block 0xbf, offset 0x5d6
+	{value: 0x0000, lo: 0x05},
+	{value: 0x3308, lo: 0x80, hi: 0x80},
+	{value: 0x0018, lo: 0x81, hi: 0x97},
+	{value: 0x0008, lo: 0x98, hi: 0x9b},
+	{value: 0x3308, lo: 0x9c, hi: 0x9d},
+	{value: 0x0040, lo: 0x9e, hi: 0xbf},
+	// Block 0xc0, offset 0x5dc
+	{value: 0x0000, lo: 0x07},
+	{value: 0x0008, lo: 0x80, hi: 0xaf},
+	{value: 0x3008, lo: 0xb0, hi: 0xb2},
+	{value: 0x3308, lo: 0xb3, hi: 0xba},
+	{value: 0x3008, lo: 0xbb, hi: 0xbc},
+	{value: 0x3308, lo: 0xbd, hi: 0xbd},
+	{value: 0x3008, lo: 0xbe, hi: 0xbe},
+	{value: 0x3b08, lo: 0xbf, hi: 0xbf},
+	// Block 0xc1, offset 0x5e4
+	{value: 0x0000, lo: 0x08},
+	{value: 0x3308, lo: 0x80, hi: 0x80},
+	{value: 0x0018, lo: 0x81, hi: 0x83},
+	{value: 0x0008, lo: 0x84, hi: 0x84},
+	{value: 0x0040, lo: 0x85, hi: 0x8f},
+	{value: 0x0008, lo: 0x90, hi: 0x99},
+	{value: 0x0040, lo: 0x9a, hi: 0x9f},
+	{value: 0x0018, lo: 0xa0, hi: 0xac},
+	{value: 0x0040, lo: 0xad, hi: 0xbf},
+	// Block 0xc2, offset 0x5ed
+	{value: 0x0000, lo: 0x0b},
+	{value: 0x0008, lo: 0x80, hi: 0xaa},
+	{value: 0x3308, lo: 0xab, hi: 0xab},
+	{value: 0x3008, lo: 0xac, hi: 0xac},
+	{value: 0x3308, lo: 0xad, hi: 0xad},
+	{value: 0x3008, lo: 0xae, hi: 0xaf},
+	{value: 0x3308, lo: 0xb0, hi: 0xb5},
+	{value: 0x3808, lo: 0xb6, hi: 0xb6},
+	{value: 0x3308, lo: 0xb7, hi: 0xb7},
+	{value: 0x0008, lo: 0xb8, hi: 0xb8},
+	{value: 0x0018, lo: 0xb9, hi: 0xb9},
+	{value: 0x0040, lo: 0xba, hi: 0xbf},
+	// Block 0xc3, offset 0x5f9
+	{value: 0x0000, lo: 0x02},
+	{value: 0x0008, lo: 0x80, hi: 0x89},
+	{value: 0x0040, lo: 0x8a, hi: 0xbf},
+	// Block 0xc4, offset 0x5fc
+	{value: 0x0000, lo: 0x0b},
+	{value: 0x0008, lo: 0x80, hi: 0x9a},
+	{value: 0x0040, lo: 0x9b, hi: 0x9c},
+	{value: 0x3308, lo: 0x9d, hi: 0x9f},
+	{value: 0x3008, lo: 0xa0, hi: 0xa1},
+	{value: 0x3308, lo: 0xa2, hi: 0xa5},
+	{value: 0x3008, lo: 0xa6, hi: 0xa6},
+	{value: 0x3308, lo: 0xa7, hi: 0xaa},
+	{value: 0x3b08, lo: 0xab, hi: 0xab},
+	{value: 0x0040, lo: 0xac, hi: 0xaf},
+	{value: 0x0008, lo: 0xb0, hi: 0xb9},
+	{value: 0x0018, lo: 0xba, hi: 0xbf},
+	// Block 0xc5, offset 0x608
+	{value: 0x0000, lo: 0x02},
+	{value: 0x0008, lo: 0x80, hi: 0x86},
+	{value: 0x0040, lo: 0x87, hi: 0xbf},
+	// Block 0xc6, offset 0x60b
+	{value: 0x0000, lo: 0x08},
+	{value: 0x0008, lo: 0x80, hi: 0xab},
+	{value: 0x3008, lo: 0xac, hi: 0xae},
+	{value: 0x3308, lo: 0xaf, hi: 0xb7},
+	{value: 0x3008, lo: 0xb8, hi: 0xb8},
+	{value: 0x3b08, lo: 0xb9, hi: 0xb9},
+	{value: 0x3308, lo: 0xba, hi: 0xba},
+	{value: 0x0018, lo: 0xbb, hi: 0xbb},
+	{value: 0x0040, lo: 0xbc, hi: 0xbf},
+	// Block 0xc7, offset 0x614
+	{value: 0x0000, lo: 0x02},
+	{value: 0x0040, lo: 0x80, hi: 0x9f},
+	{value: 0x049d, lo: 0xa0, hi: 0xbf},
+	// Block 0xc8, offset 0x617
+	{value: 0x0000, lo: 0x04},
+	{value: 0x0008, lo: 0x80, hi: 0xa9},
+	{value: 0x0018, lo: 0xaa, hi: 0xb2},
+	{value: 0x0040, lo: 0xb3, hi: 0xbe},
+	{value: 0x0008, lo: 0xbf, hi: 0xbf},
+	// Block 0xc9, offset 0x61c
+	{value: 0x0000, lo: 0x08},
+	{value: 0x3008, lo: 0x80, hi: 0x80},
+	{value: 0x0008, lo: 0x81, hi: 0x81},
+	{value: 0x3008, lo: 0x82, hi: 0x82},
+	{value: 0x3308, lo: 0x83, hi: 0x83},
+	{value: 0x0018, lo: 0x84, hi: 0x86},
+	{value: 0x0040, lo: 0x87, hi: 0x8f},
+	{value: 0x0008, lo: 0x90, hi: 0x99},
+	{value: 0x0040, lo: 0x9a, hi: 0xbf},
+	// Block 0xca, offset 0x625
+	{value: 0x0000, lo: 0x04},
+	{value: 0x0040, lo: 0x80, hi: 0x9f},
+	{value: 0x0008, lo: 0xa0, hi: 0xa7},
+	{value: 0x0040, lo: 0xa8, hi: 0xa9},
+	{value: 0x0008, lo: 0xaa, hi: 0xbf},
+	// Block 0xcb, offset 0x62a
+	{value: 0x0000, lo: 0x0c},
+	{value: 0x0008, lo: 0x80, hi: 0x90},
+	{value: 0x3008, lo: 0x91, hi: 0x93},
+	{value: 0x3308, lo: 0x94, hi: 0x97},
+	{value: 0x0040, lo: 0x98, hi: 0x99},
+	{value: 0x3308, lo: 0x9a, hi: 0x9b},
+	{value: 0x3008, lo: 0x9c, hi: 0x9f},
+	{value: 0x3b08, lo: 0xa0, hi: 0xa0},
+	{value: 0x0008, lo: 0xa1, hi: 0xa1},
+	{value: 0x0018, lo: 0xa2, hi: 0xa2},
+	{value: 0x0008, lo: 0xa3, hi: 0xa3},
+	{value: 0x3008, lo: 0xa4, hi: 0xa4},
+	{value: 0x0040, lo: 0xa5, hi: 0xbf},
+	// Block 0xcc, offset 0x637
+	{value: 0x0000, lo: 0x0a},
+	{value: 0x0008, lo: 0x80, hi: 0x80},
+	{value: 0x3308, lo: 0x81, hi: 0x8a},
+	{value: 0x0008, lo: 0x8b, hi: 0xb2},
+	{value: 0x3308, lo: 0xb3, hi: 0xb3},
+	{value: 0x3b08, lo: 0xb4, hi: 0xb4},
+	{value: 0x3308, lo: 0xb5, hi: 0xb8},
+	{value: 0x3008, lo: 0xb9, hi: 0xb9},
+	{value: 0x0008, lo: 0xba, hi: 0xba},
+	{value: 0x3308, lo: 0xbb, hi: 0xbe},
+	{value: 0x0018, lo: 0xbf, hi: 0xbf},
+	// Block 0xcd, offset 0x642
+	{value: 0x0000, lo: 0x08},
+	{value: 0x0018, lo: 0x80, hi: 0x86},
+	{value: 0x3b08, lo: 0x87, hi: 0x87},
+	{value: 0x0040, lo: 0x88, hi: 0x8f},
+	{value: 0x0008, lo: 0x90, hi: 0x90},
+	{value: 0x3308, lo: 0x91, hi: 0x96},
+	{value: 0x3008, lo: 0x97, hi: 0x98},
+	{value: 0x3308, lo: 0x99, hi: 0x9b},
+	{value: 0x0008, lo: 0x9c, hi: 0xbf},
+	// Block 0xce, offset 0x64b
+	{value: 0x0000, lo: 0x0a},
+	{value: 0x0008, lo: 0x80, hi: 0x89},
+	{value: 0x3308, lo: 0x8a, hi: 0x96},
+	{value: 0x3008, lo: 0x97, hi: 0x97},
+	{value: 0x3308, lo: 0x98, hi: 0x98},
+	{value: 0x3b08, lo: 0x99, hi: 0x99},
+	{value: 0x0018, lo: 0x9a, hi: 0x9c},
+	{value: 0x0008, lo: 0x9d, hi: 0x9d},
+	{value: 0x0018, lo: 0x9e, hi: 0xa2},
+	{value: 0x0040, lo: 0xa3, hi: 0xaf},
+	{value: 0x0008, lo: 0xb0, hi: 0xbf},
+	// Block 0xcf, offset 0x656
+	{value: 0x0000, lo: 0x02},
+	{value: 0x0008, lo: 0x80, hi: 0xb8},
+	{value: 0x0040, lo: 0xb9, hi: 0xbf},
+	// Block 0xd0, offset 0x659
+	{value: 0x0000, lo: 0x02},
+	{value: 0x0018, lo: 0x80, hi: 0x89},
+	{value: 0x0040, lo: 0x8a, hi: 0xbf},
+	// Block 0xd1, offset 0x65c
+	{value: 0x0000, lo: 0x09},
+	{value: 0x0008, lo: 0x80, hi: 0x88},
+	{value: 0x0040, lo: 0x89, hi: 0x89},
+	{value: 0x0008, lo: 0x8a, hi: 0xae},
+	{value: 0x3008, lo: 0xaf, hi: 0xaf},
+	{value: 0x3308, lo: 0xb0, hi: 0xb6},
+	{value: 0x0040, lo: 0xb7, hi: 0xb7},
+	{value: 0x3308, lo: 0xb8, hi: 0xbd},
+	{value: 0x3008, lo: 0xbe, hi: 0xbe},
+	{value: 0x3b08, lo: 0xbf, hi: 0xbf},
+	// Block 0xd2, offset 0x666
+	{value: 0x0000, lo: 0x08},
+	{value: 0x0008, lo: 0x80, hi: 0x80},
+	{value: 0x0018, lo: 0x81, hi: 0x85},
+	{value: 0x0040, lo: 0x86, hi: 0x8f},
+	{value: 0x0008, lo: 0x90, hi: 0x99},
+	{value: 0x0018, lo: 0x9a, hi: 0xac},
+	{value: 0x0040, lo: 0xad, hi: 0xaf},
+	{value: 0x0018, lo: 0xb0, hi: 0xb1},
+	{value: 0x0008, lo: 0xb2, hi: 0xbf},
+	// Block 0xd3, offset 0x66f
+	{value: 0x0000, lo: 0x0b},
+	{value: 0x0008, lo: 0x80, hi: 0x8f},
+	{value: 0x0040, lo: 0x90, hi: 0x91},
+	{value: 0x3308, lo: 0x92, hi: 0xa7},
+	{value: 0x0040, lo: 0xa8, hi: 0xa8},
+	{value: 0x3008, lo: 0xa9, hi: 0xa9},
+	{value: 0x3308, lo: 0xaa, hi: 0xb0},
+	{value: 0x3008, lo: 0xb1, hi: 0xb1},
+	{value: 0x3308, lo: 0xb2, hi: 0xb3},
+	{value: 0x3008, lo: 0xb4, hi: 0xb4},
+	{value: 0x3308, lo: 0xb5, hi: 0xb6},
+	{value: 0x0040, lo: 0xb7, hi: 0xbf},
+	// Block 0xd4, offset 0x67b
+	{value: 0x0000, lo: 0x0c},
+	{value: 0x0008, lo: 0x80, hi: 0x86},
+	{value: 0x0040, lo: 0x87, hi: 0x87},
+	{value: 0x0008, lo: 0x88, hi: 0x89},
+	{value: 0x0040, lo: 0x8a, hi: 0x8a},
+	{value: 0x0008, lo: 0x8b, hi: 0xb0},
+	{value: 0x3308, lo: 0xb1, hi: 0xb6},
+	{value: 0x0040, lo: 0xb7, hi: 0xb9},
+	{value: 0x3308, lo: 0xba, hi: 0xba},
+	{value: 0x0040, lo: 0xbb, hi: 0xbb},
+	{value: 0x3308, lo: 0xbc, hi: 0xbd},
+	{value: 0x0040, lo: 0xbe, hi: 0xbe},
+	{value: 0x3308, lo: 0xbf, hi: 0xbf},
+	// Block 0xd5, offset 0x688
+	{value: 0x0000, lo: 0x0c},
+	{value: 0x3308, lo: 0x80, hi: 0x83},
+	{value: 0x3b08, lo: 0x84, hi: 0x85},
+	{value: 0x0008, lo: 0x86, hi: 0x86},
+	{value: 0x3308, lo: 0x87, hi: 0x87},
+	{value: 0x0040, lo: 0x88, hi: 0x8f},
+	{value: 0x0008, lo: 0x90, hi: 0x99},
+	{value: 0x0040, lo: 0x9a, hi: 0x9f},
+	{value: 0x0008, lo: 0xa0, hi: 0xa5},
+	{value: 0x0040, lo: 0xa6, hi: 0xa6},
+	{value: 0x0008, lo: 0xa7, hi: 0xa8},
+	{value: 0x0040, lo: 0xa9, hi: 0xa9},
+	{value: 0x0008, lo: 0xaa, hi: 0xbf},
+	// Block 0xd6, offset 0x695
+	{value: 0x0000, lo: 0x0d},
+	{value: 0x0008, lo: 0x80, hi: 0x89},
+	{value: 0x3008, lo: 0x8a, hi: 0x8e},
+	{value: 0x0040, lo: 0x8f, hi: 0x8f},
+	{value: 0x3308, lo: 0x90, hi: 0x91},
+	{value: 0x0040, lo: 0x92, hi: 0x92},
+	{value: 0x3008, lo: 0x93, hi: 0x94},
+	{value: 0x3308, lo: 0x95, hi: 0x95},
+	{value: 0x3008, lo: 0x96, hi: 0x96},
+	{value: 0x3b08, lo: 0x97, hi: 0x97},
+	{value: 0x0008, lo: 0x98, hi: 0x98},
+	{value: 0x0040, lo: 0x99, hi: 0x9f},
+	{value: 0x0008, lo: 0xa0, hi: 0xa9},
+	{value: 0x0040, lo: 0xaa, hi: 0xbf},
+	// Block 0xd7, offset 0x6a3
+	{value: 0x0000, lo: 0x06},
+	{value: 0x0040, lo: 0x80, hi: 0x9f},
+	{value: 0x0008, lo: 0xa0, hi: 0xb2},
+	{value: 0x3308, lo: 0xb3, hi: 0xb4},
+	{value: 0x3008, lo: 0xb5, hi: 0xb6},
+	{value: 0x0018, lo: 0xb7, hi: 0xb8},
+	{value: 0x0040, lo: 0xb9, hi: 0xbf},
+	// Block 0xd8, offset 0x6aa
+	{value: 0x0000, lo: 0x0a},
+	{value: 0x3308, lo: 0x80, hi: 0x81},
+	{value: 0x0008, lo: 0x82, hi: 0x82},
+	{value: 0x3008, lo: 0x83, hi: 0x83},
+	{value: 0x0008, lo: 0x84, hi: 0x90},
+	{value: 0x0040, lo: 0x91, hi: 0x91},
+	{value: 0x0008, lo: 0x92, hi: 0xb3},
+	{value: 0x3008, lo: 0xb4, hi: 0xb5},
+	{value: 0x3308, lo: 0xb6, hi: 0xba},
+	{value: 0x0040, lo: 0xbb, hi: 0xbd},
+	{value: 0x3008, lo: 0xbe, hi: 0xbf},
+	// Block 0xd9, offset 0x6b5
+	{value: 0x0000, lo: 0x06},
+	{value: 0x3308, lo: 0x80, hi: 0x80},
+	{value: 0x3808, lo: 0x81, hi: 0x81},
+	{value: 0x3b08, lo: 0x82, hi: 0x82},
+	{value: 0x0018, lo: 0x83, hi: 0x8f},
+	{value: 0x0008, lo: 0x90, hi: 0x99},
+	{value: 0x0040, lo: 0x9a, hi: 0xbf},
+	// Block 0xda, offset 0x6bc
+	{value: 0x0000, lo: 0x03},
+	{value: 0x0040, lo: 0x80, hi: 0xaf},
+	{value: 0x0008, lo: 0xb0, hi: 0xb0},
+	{value: 0x0040, lo: 0xb1, hi: 0xbf},
+	// Block 0xdb, offset 0x6c0
+	{value: 0x0000, lo: 0x03},
+	{value: 0x0018, lo: 0x80, hi: 0xb1},
+	{value: 0x0040, lo: 0xb2, hi: 0xbe},
+	{value: 0x0018, lo: 0xbf, hi: 0xbf},
+	// Block 0xdc, offset 0x6c4
+	{value: 0x0000, lo: 0x02},
+	{value: 0x0008, lo: 0x80, hi: 0x99},
+	{value: 0x0040, lo: 0x9a, hi: 0xbf},
+	// Block 0xdd, offset 0x6c7
+	{value: 0x0000, lo: 0x04},
+	{value: 0x0018, lo: 0x80, hi: 0xae},
+	{value: 0x0040, lo: 0xaf, hi: 0xaf},
+	{value: 0x0018, lo: 0xb0, hi: 0xb4},
+	{value: 0x0040, lo: 0xb5, hi: 0xbf},
+	// Block 0xde, offset 0x6cc
+	{value: 0x0000, lo: 0x02},
+	{value: 0x0008, lo: 0x80, hi: 0x83},
+	{value: 0x0040, lo: 0x84, hi: 0xbf},
+	// Block 0xdf, offset 0x6cf
+	{value: 0x0000, lo: 0x02},
+	{value: 0x0040, lo: 0x80, hi: 0x8f},
+	{value: 0x0008, lo: 0x90, hi: 0xbf},
+	// Block 0xe0, offset 0x6d2
+	{value: 0x0000, lo: 0x03},
+	{value: 0x0008, lo: 0x80, hi: 0xb0},
+	{value: 0x0018, lo: 0xb1, hi: 0xb2},
+	{value: 0x0040, lo: 0xb3, hi: 0xbf},
+	// Block 0xe1, offset 0x6d6
+	{value: 0x0000, lo: 0x02},
+	{value: 0x0008, lo: 0x80, hi: 0xaf},
+	{value: 0x0340, lo: 0xb0, hi: 0xbf},
+	// Block 0xe2, offset 0x6d9
+	{value: 0x0000, lo: 0x04},
+	{value: 0x3308, lo: 0x80, hi: 0x80},
+	{value: 0x0008, lo: 0x81, hi: 0x86},
+	{value: 0x3308, lo: 0x87, hi: 0x95},
+	{value: 0x0040, lo: 0x96, hi: 0xbf},
+	// Block 0xe3, offset 0x6de
+	{value: 0x0000, lo: 0x06},
+	{value: 0x0008, lo: 0x80, hi: 0x9e},
+	{value: 0x0040, lo: 0x9f, hi: 0x9f},
+	{value: 0x0008, lo: 0xa0, hi: 0xa9},
+	{value: 0x0040, lo: 0xaa, hi: 0xad},
+	{value: 0x0018, lo: 0xae, hi: 0xaf},
+	{value: 0x0008, lo: 0xb0, hi: 0xbf},
+	// Block 0xe4, offset 0x6e5
+	{value: 0x0000, lo: 0x02},
+	{value: 0x0008, lo: 0x80, hi: 0xbe},
+	{value: 0x0040, lo: 0xbf, hi: 0xbf},
+	// Block 0xe5, offset 0x6e8
+	{value: 0x0000, lo: 0x07},
+	{value: 0x0008, lo: 0x80, hi: 0x89},
+	{value: 0x0040, lo: 0x8a, hi: 0x8f},
+	{value: 0x0008, lo: 0x90, hi: 0xad},
+	{value: 0x0040, lo: 0xae, hi: 0xaf},
+	{value: 0x3308, lo: 0xb0, hi: 0xb4},
+	{value: 0x0018, lo: 0xb5, hi: 0xb5},
+	{value: 0x0040, lo: 0xb6, hi: 0xbf},
+	// Block 0xe6, offset 0x6f0
+	{value: 0x0000, lo: 0x03},
+	{value: 0x0008, lo: 0x80, hi: 0xaf},
+	{value: 0x3308, lo: 0xb0, hi: 0xb6},
+	{value: 0x0018, lo: 0xb7, hi: 0xbf},
+	// Block 0xe7, offset 0x6f4
+	{value: 0x0000, lo: 0x0a},
+	{value: 0x0008, lo: 0x80, hi: 0x83},
+	{value: 0x0018, lo: 0x84, hi: 0x85},
+	{value: 0x0040, lo: 0x86, hi: 0x8f},
+	{value: 0x0008, lo: 0x90, hi: 0x99},
+	{value: 0x0040, lo: 0x9a, hi: 0x9a},
+	{value: 0x0018, lo: 0x9b, hi: 0xa1},
+	{value: 0x0040, lo: 0xa2, hi: 0xa2},
+	{value: 0x0008, lo: 0xa3, hi: 0xb7},
+	{value: 0x0040, lo: 0xb8, hi: 0xbc},
+	{value: 0x0008, lo: 0xbd, hi: 0xbf},
+	// Block 0xe8, offset 0x6ff
+	{value: 0x0000, lo: 0x02},
+	{value: 0x0008, lo: 0x80, hi: 0x8f},
+	{value: 0x0040, lo: 0x90, hi: 0xbf},
+	// Block 0xe9, offset 0x702
+	{value: 0x0000, lo: 0x02},
+	{value: 0xe105, lo: 0x80, hi: 0x9f},
+	{value: 0x0008, lo: 0xa0, hi: 0xbf},
+	// Block 0xea, offset 0x705
+	{value: 0x0000, lo: 0x02},
+	{value: 0x0018, lo: 0x80, hi: 0x9a},
+	{value: 0x0040, lo: 0x9b, hi: 0xbf},
+	// Block 0xeb, offset 0x708
+	{value: 0x0000, lo: 0x05},
+	{value: 0x0008, lo: 0x80, hi: 0x8a},
+	{value: 0x0040, lo: 0x8b, hi: 0x8e},
+	{value: 0x3308, lo: 0x8f, hi: 0x8f},
+	{value: 0x0008, lo: 0x90, hi: 0x90},
+	{value: 0x3008, lo: 0x91, hi: 0xbf},
+	// Block 0xec, offset 0x70e
+	{value: 0x0000, lo: 0x05},
+	{value: 0x3008, lo: 0x80, hi: 0x87},
+	{value: 0x0040, lo: 0x88, hi: 0x8e},
+	{value: 0x3308, lo: 0x8f, hi: 0x92},
+	{value: 0x0008, lo: 0x93, hi: 0x9f},
+	{value: 0x0040, lo: 0xa0, hi: 0xbf},
+	// Block 0xed, offset 0x714
+	{value: 0x0000, lo: 0x08},
+	{value: 0x0040, lo: 0x80, hi: 0x9f},
+	{value: 0x0008, lo: 0xa0, hi: 0xa1},
+	{value: 0x0018, lo: 0xa2, hi: 0xa2},
+	{value: 0x0008, lo: 0xa3, hi: 0xa3},
+	{value: 0x3308, lo: 0xa4, hi: 0xa4},
+	{value: 0x0040, lo: 0xa5, hi: 0xaf},
+	{value: 0x3008, lo: 0xb0, hi: 0xb1},
+	{value: 0x0040, lo: 0xb2, hi: 0xbf},
+	// Block 0xee, offset 0x71d
+	{value: 0x0000, lo: 0x02},
+	{value: 0x0008, lo: 0x80, hi: 0xb7},
+	{value: 0x0040, lo: 0xb8, hi: 0xbf},
+	// Block 0xef, offset 0x720
+	{value: 0x0000, lo: 0x02},
+	{value: 0x0008, lo: 0x80, hi: 0x95},
+	{value: 0x0040, lo: 0x96, hi: 0xbf},
+	// Block 0xf0, offset 0x723
+	{value: 0x0000, lo: 0x02},
+	{value: 0x0008, lo: 0x80, hi: 0x88},
+	{value: 0x0040, lo: 0x89, hi: 0xbf},
+	// Block 0xf1, offset 0x726
+	{value: 0x0000, lo: 0x07},
+	{value: 0x0040, lo: 0x80, hi: 0xaf},
+	{value: 0x0008, lo: 0xb0, hi: 0xb3},
+	{value: 0x0040, lo: 0xb4, hi: 0xb4},
+	{value: 0x0008, lo: 0xb5, hi: 0xbb},
+	{value: 0x0040, lo: 0xbc, hi: 0xbc},
+	{value: 0x0008, lo: 0xbd, hi: 0xbe},
+	{value: 0x0040, lo: 0xbf, hi: 0xbf},
+	// Block 0xf2, offset 0x72e
+	{value: 0x0000, lo: 0x04},
+	{value: 0x0008, lo: 0x80, hi: 0xa2},
+	{value: 0x0040, lo: 0xa3, hi: 0xb1},
+	{value: 0x0008, lo: 0xb2, hi: 0xb2},
+	{value: 0x0040, lo: 0xb3, hi: 0xbf},
+	// Block 0xf3, offset 0x733
+	{value: 0x0000, lo: 0x08},
+	{value: 0x0040, lo: 0x80, hi: 0x8f},
+	{value: 0x0008, lo: 0x90, hi: 0x92},
+	{value: 0x0040, lo: 0x93, hi: 0x94},
+	{value: 0x0008, lo: 0x95, hi: 0x95},
+	{value: 0x0040, lo: 0x96, hi: 0xa3},
+	{value: 0x0008, lo: 0xa4, hi: 0xa7},
+	{value: 0x0040, lo: 0xa8, hi: 0xaf},
+	{value: 0x0008, lo: 0xb0, hi: 0xbf},
+	// Block 0xf4, offset 0x73c
+	{value: 0x0000, lo: 0x02},
+	{value: 0x0008, lo: 0x80, hi: 0xbb},
+	{value: 0x0040, lo: 0xbc, hi: 0xbf},
+	// Block 0xf5, offset 0x73f
+	{value: 0x0000, lo: 0x04},
+	{value: 0x0008, lo: 0x80, hi: 0xaa},
+	{value: 0x0040, lo: 0xab, hi: 0xaf},
+	{value: 0x0008, lo: 0xb0, hi: 0xbc},
+	{value: 0x0040, lo: 0xbd, hi: 0xbf},
+	// Block 0xf6, offset 0x744
+	{value: 0x0000, lo: 0x09},
+	{value: 0x0008, lo: 0x80, hi: 0x88},
+	{value: 0x0040, lo: 0x89, hi: 0x8f},
+	{value: 0x0008, lo: 0x90, hi: 0x99},
+	{value: 0x0040, lo: 0x9a, hi: 0x9b},
+	{value: 0x0018, lo: 0x9c, hi: 0x9c},
+	{value: 0x3308, lo: 0x9d, hi: 0x9e},
+	{value: 0x0018, lo: 0x9f, hi: 0x9f},
+	{value: 0x03c0, lo: 0xa0, hi: 0xa3},
+	{value: 0x0040, lo: 0xa4, hi: 0xbf},
+	// Block 0xf7, offset 0x74e
+	{value: 0x0000, lo: 0x03},
+	{value: 0x3308, lo: 0x80, hi: 0xad},
+	{value: 0x0040, lo: 0xae, hi: 0xaf},
+	{value: 0x3308, lo: 0xb0, hi: 0xbf},
+	// Block 0xf8, offset 0x752
+	{value: 0x0000, lo: 0x03},
+	{value: 0x3308, lo: 0x80, hi: 0x86},
+	{value: 0x0040, lo: 0x87, hi: 0x8f},
+	{value: 0x0018, lo: 0x90, hi: 0xbf},
+	// Block 0xf9, offset 0x756
+	{value: 0x0000, lo: 0x02},
+	{value: 0x0018, lo: 0x80, hi: 0x83},
+	{value: 0x0040, lo: 0x84, hi: 0xbf},
+	// Block 0xfa, offset 0x759
+	{value: 0x0000, lo: 0x02},
+	{value: 0x0018, lo: 0x80, hi: 0xb5},
+	{value: 0x0040, lo: 0xb6, hi: 0xbf},
+	// Block 0xfb, offset 0x75c
+	{value: 0x0000, lo: 0x03},
+	{value: 0x0018, lo: 0x80, hi: 0xa6},
+	{value: 0x0040, lo: 0xa7, hi: 0xa8},
+	{value: 0x0018, lo: 0xa9, hi: 0xbf},
+	// Block 0xfc, offset 0x760
+	{value: 0x0000, lo: 0x0e},
+	{value: 0x0018, lo: 0x80, hi: 0x9d},
+	{value: 0x2379, lo: 0x9e, hi: 0x9e},
+	{value: 0x2381, lo: 0x9f, hi: 0x9f},
+	{value: 0x2389, lo: 0xa0, hi: 0xa0},
+	{value: 0x2391, lo: 0xa1, hi: 0xa1},
+	{value: 0x2399, lo: 0xa2, hi: 0xa2},
+	{value: 0x23a1, lo: 0xa3, hi: 0xa3},
+	{value: 0x23a9, lo: 0xa4, hi: 0xa4},
+	{value: 0x3018, lo: 0xa5, hi: 0xa6},
+	{value: 0x3318, lo: 0xa7, hi: 0xa9},
+	{value: 0x0018, lo: 0xaa, hi: 0xac},
+	{value: 0x3018, lo: 0xad, hi: 0xb2},
+	{value: 0x0340, lo: 0xb3, hi: 0xba},
+	{value: 0x3318, lo: 0xbb, hi: 0xbf},
+	// Block 0xfd, offset 0x76f
+	{value: 0x0000, lo: 0x0b},
+	{value: 0x3318, lo: 0x80, hi: 0x82},
+	{value: 0x0018, lo: 0x83, hi: 0x84},
+	{value: 0x3318, lo: 0x85, hi: 0x8b},
+	{value: 0x0018, lo: 0x8c, hi: 0xa9},
+	{value: 0x3318, lo: 0xaa, hi: 0xad},
+	{value: 0x0018, lo: 0xae, hi: 0xba},
+	{value: 0x23b1, lo: 0xbb, hi: 0xbb},
+	{value: 0x23b9, lo: 0xbc, hi: 0xbc},
+	{value: 0x23c1, lo: 0xbd, hi: 0xbd},
+	{value: 0x23c9, lo: 0xbe, hi: 0xbe},
+	{value: 0x23d1, lo: 0xbf, hi: 0xbf},
+	// Block 0xfe, offset 0x77b
+	{value: 0x0000, lo: 0x03},
+	{value: 0x23d9, lo: 0x80, hi: 0x80},
+	{value: 0x0018, lo: 0x81, hi: 0xaa},
+	{value: 0x0040, lo: 0xab, hi: 0xbf},
+	// Block 0xff, offset 0x77f
+	{value: 0x0000, lo: 0x04},
+	{value: 0x0018, lo: 0x80, hi: 0x81},
+	{value: 0x3318, lo: 0x82, hi: 0x84},
+	{value: 0x0018, lo: 0x85, hi: 0x85},
+	{value: 0x0040, lo: 0x86, hi: 0xbf},
+	// Block 0x100, offset 0x784
+	{value: 0x0000, lo: 0x04},
+	{value: 0x0018, lo: 0x80, hi: 0x93},
+	{value: 0x0040, lo: 0x94, hi: 0x9f},
+	{value: 0x0018, lo: 0xa0, hi: 0xb3},
+	{value: 0x0040, lo: 0xb4, hi: 0xbf},
+	// Block 0x101, offset 0x789
+	{value: 0x0000, lo: 0x04},
+	{value: 0x0018, lo: 0x80, hi: 0x96},
+	{value: 0x0040, lo: 0x97, hi: 0x9f},
+	{value: 0x0018, lo: 0xa0, hi: 0xb8},
+	{value: 0x0040, lo: 0xb9, hi: 0xbf},
+	// Block 0x102, offset 0x78e
+	{value: 0x0000, lo: 0x03},
+	{value: 0x3308, lo: 0x80, hi: 0xb6},
+	{value: 0x0018, lo: 0xb7, hi: 0xba},
+	{value: 0x3308, lo: 0xbb, hi: 0xbf},
+	// Block 0x103, offset 0x792
+	{value: 0x0000, lo: 0x04},
+	{value: 0x3308, lo: 0x80, hi: 0xac},
+	{value: 0x0018, lo: 0xad, hi: 0xb4},
+	{value: 0x3308, lo: 0xb5, hi: 0xb5},
+	{value: 0x0018, lo: 0xb6, hi: 0xbf},
+	// Block 0x104, offset 0x797
+	{value: 0x0000, lo: 0x08},
+	{value: 0x0018, lo: 0x80, hi: 0x83},
+	{value: 0x3308, lo: 0x84, hi: 0x84},
+	{value: 0x0018, lo: 0x85, hi: 0x8b},
+	{value: 0x0040, lo: 0x8c, hi: 0x9a},
+	{value: 0x3308, lo: 0x9b, hi: 0x9f},
+	{value: 0x0040, lo: 0xa0, hi: 0xa0},
+	{value: 0x3308, lo: 0xa1, hi: 0xaf},
+	{value: 0x0040, lo: 0xb0, hi: 0xbf},
+	// Block 0x105, offset 0x7a0
+	{value: 0x0000, lo: 0x04},
+	{value: 0x0008, lo: 0x80, hi: 0x9e},
+	{value: 0x0040, lo: 0x9f, hi: 0xa4},
+	{value: 0x0008, lo: 0xa5, hi: 0xaa},
+	{value: 0x0040, lo: 0xab, hi: 0xbf},
+	// Block 0x106, offset 0x7a5
+	{value: 0x0000, lo: 0x03},
+	{value: 0x0040, lo: 0x80, hi: 0x8e},
+	{value: 0x3308, lo: 0x8f, hi: 0x8f},
+	{value: 0x0040, lo: 0x90, hi: 0xbf},
+	// Block 0x107, offset 0x7a9
+	{value: 0x0000, lo: 0x05},
+	{value: 0x0008, lo: 0x80, hi: 0xac},
+	{value: 0x0040, lo: 0xad, hi: 0xaf},
+	{value: 0x3308, lo: 0xb0, hi: 0xb6},
+	{value: 0x0008, lo: 0xb7, hi: 0xbd},
+	{value: 0x0040, lo: 0xbe, hi: 0xbf},
+	// Block 0x108, offset 0x7af
+	{value: 0x0000, lo: 0x05},
+	{value: 0x0008, lo: 0x80, hi: 0x89},
+	{value: 0x0040, lo: 0x8a, hi: 0x8d},
+	{value: 0x0008, lo: 0x8e, hi: 0x8e},
+	{value: 0x0018, lo: 0x8f, hi: 0x8f},
+	{value: 0x0040, lo: 0x90, hi: 0xbf},
+	// Block 0x109, offset 0x7b5
+	{value: 0x0000, lo: 0x04},
+	{value: 0x0040, lo: 0x80, hi: 0x8f},
+	{value: 0x0008, lo: 0x90, hi: 0xad},
+	{value: 0x3308, lo: 0xae, hi: 0xae},
+	{value: 0x0040, lo: 0xaf, hi: 0xbf},
+	// Block 0x10a, offset 0x7ba
+	{value: 0x0000, lo: 0x05},
+	{value: 0x0008, lo: 0x80, hi: 0xab},
+	{value: 0x3308, lo: 0xac, hi: 0xaf},
+	{value: 0x0008, lo: 0xb0, hi: 0xb9},
+	{value: 0x0040, lo: 0xba, hi: 0xbe},
+	{value: 0x0018, lo: 0xbf, hi: 0xbf},
+	// Block 0x10b, offset 0x7c0
+	{value: 0x0000, lo: 0x05},
+	{value: 0x0040, lo: 0x80, hi: 0x8f},
+	{value: 0x0008, lo: 0x90, hi: 0xab},
+	{value: 0x3308, lo: 0xac, hi: 0xaf},
+	{value: 0x0008, lo: 0xb0, hi: 0xb9},
+	{value: 0x0040, lo: 0xba, hi: 0xbf},
+	// Block 0x10c, offset 0x7c6
+	{value: 0x0000, lo: 0x09},
+	{value: 0x0040, lo: 0x80, hi: 0x9f},
+	{value: 0x0008, lo: 0xa0, hi: 0xa6},
+	{value: 0x0040, lo: 0xa7, hi: 0xa7},
+	{value: 0x0008, lo: 0xa8, hi: 0xab},
+	{value: 0x0040, lo: 0xac, hi: 0xac},
+	{value: 0x0008, lo: 0xad, hi: 0xae},
+	{value: 0x0040, lo: 0xaf, hi: 0xaf},
+	{value: 0x0008, lo: 0xb0, hi: 0xbe},
+	{value: 0x0040, lo: 0xbf, hi: 0xbf},
+	// Block 0x10d, offset 0x7d0
+	{value: 0x0000, lo: 0x05},
+	{value: 0x0808, lo: 0x80, hi: 0x84},
+	{value: 0x0040, lo: 0x85, hi: 0x86},
+	{value: 0x0818, lo: 0x87, hi: 0x8f},
+	{value: 0x3308, lo: 0x90, hi: 0x96},
+	{value: 0x0040, lo: 0x97, hi: 0xbf},
+	// Block 0x10e, offset 0x7d6
+	{value: 0x0000, lo: 0x08},
+	{value: 0x0a08, lo: 0x80, hi: 0x83},
+	{value: 0x3308, lo: 0x84, hi: 0x8a},
+	{value: 0x0b08, lo: 0x8b, hi: 0x8b},
+	{value: 0x0040, lo: 0x8c, hi: 0x8f},
+	{value: 0x0808, lo: 0x90, hi: 0x99},
+	{value: 0x0040, lo: 0x9a, hi: 0x9d},
+	{value: 0x0818, lo: 0x9e, hi: 0x9f},
+	{value: 0x0040, lo: 0xa0, hi: 0xbf},
+	// Block 0x10f, offset 0x7df
+	{value: 0x0000, lo: 0x02},
+	{value: 0x0040, lo: 0x80, hi: 0xb0},
+	{value: 0x0818, lo: 0xb1, hi: 0xbf},
+	// Block 0x110, offset 0x7e2
+	{value: 0x0000, lo: 0x02},
+	{value: 0x0818, lo: 0x80, hi: 0xb4},
+	{value: 0x0040, lo: 0xb5, hi: 0xbf},
+	// Block 0x111, offset 0x7e5
+	{value: 0x0000, lo: 0x03},
+	{value: 0x0040, lo: 0x80, hi: 0x80},
+	{value: 0x0818, lo: 0x81, hi: 0xbd},
+	{value: 0x0040, lo: 0xbe, hi: 0xbf},
+	// Block 0x112, offset 0x7e9
+	{value: 0x0000, lo: 0x03},
+	{value: 0x0040, lo: 0x80, hi: 0xaf},
+	{value: 0x0018, lo: 0xb0, hi: 0xb1},
+	{value: 0x0040, lo: 0xb2, hi: 0xbf},
+	// Block 0x113, offset 0x7ed
+	{value: 0x0000, lo: 0x03},
+	{value: 0x0018, lo: 0x80, hi: 0xab},
+	{value: 0x0040, lo: 0xac, hi: 0xaf},
+	{value: 0x0018, lo: 0xb0, hi: 0xbf},
+	// Block 0x114, offset 0x7f1
+	{value: 0x0000, lo: 0x05},
+	{value: 0x0018, lo: 0x80, hi: 0x93},
+	{value: 0x0040, lo: 0x94, hi: 0x9f},
+	{value: 0x0018, lo: 0xa0, hi: 0xae},
+	{value: 0x0040, lo: 0xaf, hi: 0xb0},
+	{value: 0x0018, lo: 0xb1, hi: 0xbf},
+	// Block 0x115, offset 0x7f7
+	{value: 0x0000, lo: 0x05},
+	{value: 0x0040, lo: 0x80, hi: 0x80},
+	{value: 0x0018, lo: 0x81, hi: 0x8f},
+	{value: 0x0040, lo: 0x90, hi: 0x90},
+	{value: 0x0018, lo: 0x91, hi: 0xb5},
+	{value: 0x0040, lo: 0xb6, hi: 0xbf},
+	// Block 0x116, offset 0x7fd
+	{value: 0x0000, lo: 0x04},
+	{value: 0x0018, lo: 0x80, hi: 0x8f},
+	{value: 0x2709, lo: 0x90, hi: 0x90},
+	{value: 0x0018, lo: 0x91, hi: 0xad},
+	{value: 0x0040, lo: 0xae, hi: 0xbf},
+	// Block 0x117, offset 0x802
+	{value: 0x0000, lo: 0x02},
+	{value: 0x0040, lo: 0x80, hi: 0xa5},
+	{value: 0x0018, lo: 0xa6, hi: 0xbf},
+	// Block 0x118, offset 0x805
+	{value: 0x0000, lo: 0x0f},
+	{value: 0x2889, lo: 0x80, hi: 0x80},
+	{value: 0x2891, lo: 0x81, hi: 0x81},
+	{value: 0x2899, lo: 0x82, hi: 0x82},
+	{value: 0x28a1, lo: 0x83, hi: 0x83},
+	{value: 0x28a9, lo: 0x84, hi: 0x84},
+	{value: 0x28b1, lo: 0x85, hi: 0x85},
+	{value: 0x28b9, lo: 0x86, hi: 0x86},
+	{value: 0x28c1, lo: 0x87, hi: 0x87},
+	{value: 0x28c9, lo: 0x88, hi: 0x88},
+	{value: 0x0040, lo: 0x89, hi: 0x8f},
+	{value: 0x28d1, lo: 0x90, hi: 0x90},
+	{value: 0x28d9, lo: 0x91, hi: 0x91},
+	{value: 0x0040, lo: 0x92, hi: 0x9f},
+	{value: 0x0018, lo: 0xa0, hi: 0xa5},
+	{value: 0x0040, lo: 0xa6, hi: 0xbf},
+	// Block 0x119, offset 0x815
+	{value: 0x0000, lo: 0x06},
+	{value: 0x0018, lo: 0x80, hi: 0x97},
+	{value: 0x0040, lo: 0x98, hi: 0x9b},
+	{value: 0x0018, lo: 0x9c, hi: 0xac},
+	{value: 0x0040, lo: 0xad, hi: 0xaf},
+	{value: 0x0018, lo: 0xb0, hi: 0xbc},
+	{value: 0x0040, lo: 0xbd, hi: 0xbf},
+	// Block 0x11a, offset 0x81c
+	{value: 0x0000, lo: 0x03},
+	{value: 0x0018, lo: 0x80, hi: 0xb6},
+	{value: 0x0040, lo: 0xb7, hi: 0xba},
+	{value: 0x0018, lo: 0xbb, hi: 0xbf},
+	// Block 0x11b, offset 0x820
+	{value: 0x0000, lo: 0x06},
+	{value: 0x0018, lo: 0x80, hi: 0x99},
+	{value: 0x0040, lo: 0x9a, hi: 0x9f},
+	{value: 0x0018, lo: 0xa0, hi: 0xab},
+	{value: 0x0040, lo: 0xac, hi: 0xaf},
+	{value: 0x0018, lo: 0xb0, hi: 0xb0},
+	{value: 0x0040, lo: 0xb1, hi: 0xbf},
+	// Block 0x11c, offset 0x827
+	{value: 0x0000, lo: 0x03},
+	{value: 0x0018, lo: 0x80, hi: 0x8b},
+	{value: 0x0040, lo: 0x8c, hi: 0x8f},
+	{value: 0x0018, lo: 0x90, hi: 0xbf},
+	// Block 0x11d, offset 0x82b
+	{value: 0x0000, lo: 0x05},
+	{value: 0x0018, lo: 0x80, hi: 0x87},
+	{value: 0x0040, lo: 0x88, hi: 0x8f},
+	{value: 0x0018, lo: 0x90, hi: 0x99},
+	{value: 0x0040, lo: 0x9a, hi: 0x9f},
+	{value: 0x0018, lo: 0xa0, hi: 0xbf},
+	// Block 0x11e, offset 0x831
+	{value: 0x0000, lo: 0x06},
+	{value: 0x0018, lo: 0x80, hi: 0x87},
+	{value: 0x0040, lo: 0x88, hi: 0x8f},
+	{value: 0x0018, lo: 0x90, hi: 0xad},
+	{value: 0x0040, lo: 0xae, hi: 0xaf},
+	{value: 0x0018, lo: 0xb0, hi: 0xb1},
+	{value: 0x0040, lo: 0xb2, hi: 0xbf},
+	// Block 0x11f, offset 0x838
+	{value: 0x0000, lo: 0x06},
+	{value: 0x0018, lo: 0x80, hi: 0x93},
+	{value: 0x0040, lo: 0x94, hi: 0x9f},
+	{value: 0x0018, lo: 0xa0, hi: 0xad},
+	{value: 0x0040, lo: 0xae, hi: 0xaf},
+	{value: 0x0018, lo: 0xb0, hi: 0xbc},
+	{value: 0x0040, lo: 0xbd, hi: 0xbf},
+	// Block 0x120, offset 0x83f
+	{value: 0x0000, lo: 0x05},
+	{value: 0x0018, lo: 0x80, hi: 0x88},
+	{value: 0x0040, lo: 0x89, hi: 0x8f},
+	{value: 0x0018, lo: 0x90, hi: 0xbd},
+	{value: 0x0040, lo: 0xbe, hi: 0xbe},
+	{value: 0x0018, lo: 0xbf, hi: 0xbf},
+	// Block 0x121, offset 0x845
+	{value: 0x0000, lo: 0x08},
+	{value: 0x0018, lo: 0x80, hi: 0x85},
+	{value: 0x0040, lo: 0x86, hi: 0x8d},
+	{value: 0x0018, lo: 0x8e, hi: 0x9b},
+	{value: 0x0040, lo: 0x9c, hi: 0x9f},
+	{value: 0x0018, lo: 0xa0, hi: 0xa8},
+	{value: 0x0040, lo: 0xa9, hi: 0xaf},
+	{value: 0x0018, lo: 0xb0, hi: 0xb8},
+	{value: 0x0040, lo: 0xb9, hi: 0xbf},
+	// Block 0x122, offset 0x84e
+	{value: 0x0000, lo: 0x03},
+	{value: 0x0018, lo: 0x80, hi: 0x92},
+	{value: 0x0040, lo: 0x93, hi: 0x93},
+	{value: 0x0018, lo: 0x94, hi: 0xbf},
+	// Block 0x123, offset 0x852
+	{value: 0x0000, lo: 0x0d},
+	{value: 0x0018, lo: 0x80, hi: 0x8a},
+	{value: 0x0040, lo: 0x8b, hi: 0xaf},
+	{value: 0x06e1, lo: 0xb0, hi: 0xb0},
+	{value: 0x0049, lo: 0xb1, hi: 0xb1},
+	{value: 0x0029, lo: 0xb2, hi: 0xb2},
+	{value: 0x0031, lo: 0xb3, hi: 0xb3},
+	{value: 0x06e9, lo: 0xb4, hi: 0xb4},
+	{value: 0x06f1, lo: 0xb5, hi: 0xb5},
+	{value: 0x06f9, lo: 0xb6, hi: 0xb6},
+	{value: 0x0701, lo: 0xb7, hi: 0xb7},
+	{value: 0x0709, lo: 0xb8, hi: 0xb8},
+	{value: 0x0711, lo: 0xb9, hi: 0xb9},
+	{value: 0x0040, lo: 0xba, hi: 0xbf},
+	// Block 0x124, offset 0x860
+	{value: 0x0000, lo: 0x02},
+	{value: 0x0008, lo: 0x80, hi: 0x9f},
+	{value: 0x0040, lo: 0xa0, hi: 0xbf},
+	// Block 0x125, offset 0x863
+	{value: 0x0000, lo: 0x02},
+	{value: 0x0008, lo: 0x80, hi: 0xb9},
+	{value: 0x0040, lo: 0xba, hi: 0xbf},
+	// Block 0x126, offset 0x866
+	{value: 0x0000, lo: 0x03},
+	{value: 0x0008, lo: 0x80, hi: 0x9d},
+	{value: 0x0040, lo: 0x9e, hi: 0x9f},
+	{value: 0x0008, lo: 0xa0, hi: 0xbf},
+	// Block 0x127, offset 0x86a
+	{value: 0x0000, lo: 0x03},
+	{value: 0x0008, lo: 0x80, hi: 0xa1},
+	{value: 0x0040, lo: 0xa2, hi: 0xaf},
+	{value: 0x0008, lo: 0xb0, hi: 0xbf},
+	// Block 0x128, offset 0x86e
+	{value: 0x0000, lo: 0x02},
+	{value: 0x0008, lo: 0x80, hi: 0xa0},
+	{value: 0x0040, lo: 0xa1, hi: 0xbf},
+	// Block 0x129, offset 0x871
+	{value: 0x0000, lo: 0x03},
+	{value: 0x0008, lo: 0x80, hi: 0x8a},
+	{value: 0x0040, lo: 0x8b, hi: 0x8f},
+	{value: 0x0008, lo: 0x90, hi: 0xbf},
+	// Block 0x12a, offset 0x875
+	{value: 0x0000, lo: 0x02},
+	{value: 0x0008, lo: 0x80, hi: 0xaf},
+	{value: 0x0040, lo: 0xb0, hi: 0xbf},
+	// Block 0x12b, offset 0x878
+	{value: 0x0000, lo: 0x04},
+	{value: 0x0040, lo: 0x80, hi: 0x80},
+	{value: 0x0340, lo: 0x81, hi: 0x81},
+	{value: 0x0040, lo: 0x82, hi: 0x9f},
+	{value: 0x0340, lo: 0xa0, hi: 0xbf},
+	// Block 0x12c, offset 0x87d
+	{value: 0x0000, lo: 0x01},
+	{value: 0x0340, lo: 0x80, hi: 0xbf},
+	// Block 0x12d, offset 0x87f
+	{value: 0x0000, lo: 0x01},
+	{value: 0x33c0, lo: 0x80, hi: 0xbf},
+	// Block 0x12e, offset 0x881
+	{value: 0x0000, lo: 0x02},
+	{value: 0x33c0, lo: 0x80, hi: 0xaf},
+	{value: 0x0040, lo: 0xb0, hi: 0xbf},
+}
+
+// Total table size 46723 bytes (45KiB); checksum: 4CF3143A
diff --git a/src/vendor/golang.org/x/net/idna/trie.go b/src/vendor/golang.org/x/net/idna/trie.go
index c4ef847..4212741 100644
--- a/src/vendor/golang.org/x/net/idna/trie.go
+++ b/src/vendor/golang.org/x/net/idna/trie.go
@@ -6,27 +6,6 @@
 
 package idna
 
-// appendMapping appends the mapping for the respective rune. isMapped must be
-// true. A mapping is a categorization of a rune as defined in UTS #46.
-func (c info) appendMapping(b []byte, s string) []byte {
-	index := int(c >> indexShift)
-	if c&xorBit == 0 {
-		s := mappings[index:]
-		return append(b, s[1:s[0]+1]...)
-	}
-	b = append(b, s...)
-	if c&inlineXOR == inlineXOR {
-		// TODO: support and handle two-byte inline masks
-		b[len(b)-1] ^= byte(index)
-	} else {
-		for p := len(b) - int(xorData[index]); p < len(b); p++ {
-			index++
-			b[p] ^= xorData[index]
-		}
-	}
-	return b
-}
-
 // Sparse block handling code.
 
 type valueRange struct {
diff --git a/src/vendor/golang.org/x/net/idna/trie12.0.0.go b/src/vendor/golang.org/x/net/idna/trie12.0.0.go
new file mode 100644
index 0000000..bb63f90
--- /dev/null
+++ b/src/vendor/golang.org/x/net/idna/trie12.0.0.go
@@ -0,0 +1,31 @@
+// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
+
+// Copyright 2016 The Go 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:build !go1.16
+// +build !go1.16
+
+package idna
+
+// appendMapping appends the mapping for the respective rune. isMapped must be
+// true. A mapping is a categorization of a rune as defined in UTS #46.
+func (c info) appendMapping(b []byte, s string) []byte {
+	index := int(c >> indexShift)
+	if c&xorBit == 0 {
+		s := mappings[index:]
+		return append(b, s[1:s[0]+1]...)
+	}
+	b = append(b, s...)
+	if c&inlineXOR == inlineXOR {
+		// TODO: support and handle two-byte inline masks
+		b[len(b)-1] ^= byte(index)
+	} else {
+		for p := len(b) - int(xorData[index]); p < len(b); p++ {
+			index++
+			b[p] ^= xorData[index]
+		}
+	}
+	return b
+}
diff --git a/src/vendor/golang.org/x/net/idna/trie13.0.0.go b/src/vendor/golang.org/x/net/idna/trie13.0.0.go
new file mode 100644
index 0000000..7d68a8d
--- /dev/null
+++ b/src/vendor/golang.org/x/net/idna/trie13.0.0.go
@@ -0,0 +1,31 @@
+// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
+
+// Copyright 2016 The Go 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:build go1.16
+// +build go1.16
+
+package idna
+
+// appendMapping appends the mapping for the respective rune. isMapped must be
+// true. A mapping is a categorization of a rune as defined in UTS #46.
+func (c info) appendMapping(b []byte, s string) []byte {
+	index := int(c >> indexShift)
+	if c&xorBit == 0 {
+		p := index
+		return append(b, mappings[mappingIndex[p]:mappingIndex[p+1]]...)
+	}
+	b = append(b, s...)
+	if c&inlineXOR == inlineXOR {
+		// TODO: support and handle two-byte inline masks
+		b[len(b)-1] ^= byte(index)
+	} else {
+		for p := len(b) - int(xorData[index]); p < len(b); p++ {
+			index++
+			b[p] ^= xorData[index]
+		}
+	}
+	return b
+}
diff --git a/src/vendor/golang.org/x/net/nettest/nettest.go b/src/vendor/golang.org/x/net/nettest/nettest.go
index 6918f2c..3656c3c 100644
--- a/src/vendor/golang.org/x/net/nettest/nettest.go
+++ b/src/vendor/golang.org/x/net/nettest/nettest.go
@@ -20,11 +20,13 @@
 )
 
 var (
-	stackOnce          sync.Once
-	ipv4Enabled        bool
-	ipv6Enabled        bool
-	unStrmDgramEnabled bool
-	rawSocketSess      bool
+	stackOnce               sync.Once
+	ipv4Enabled             bool
+	canListenTCP4OnLoopback bool
+	ipv6Enabled             bool
+	canListenTCP6OnLoopback bool
+	unStrmDgramEnabled      bool
+	rawSocketSess           bool
 
 	aLongTimeAgo = time.Unix(233431200, 0)
 	neverTimeout = time.Time{}
@@ -34,13 +36,19 @@
 )
 
 func probeStack() {
+	if _, err := RoutedInterface("ip4", net.FlagUp); err == nil {
+		ipv4Enabled = true
+	}
 	if ln, err := net.Listen("tcp4", "127.0.0.1:0"); err == nil {
 		ln.Close()
-		ipv4Enabled = true
+		canListenTCP4OnLoopback = true
+	}
+	if _, err := RoutedInterface("ip6", net.FlagUp); err == nil {
+		ipv6Enabled = true
 	}
 	if ln, err := net.Listen("tcp6", "[::1]:0"); err == nil {
 		ln.Close()
-		ipv6Enabled = true
+		canListenTCP6OnLoopback = true
 	}
 	rawSocketSess = supportsRawSocket()
 	switch runtime.GOOS {
@@ -95,12 +103,12 @@
 		// This is an internal network name for testing on the
 		// package net of the standard library.
 		switch runtime.GOOS {
-		case "android", "fuchsia", "hurd", "ios", "js", "nacl", "plan9", "windows":
+		case "android", "fuchsia", "hurd", "ios", "js", "nacl", "plan9", "wasip1", "windows":
 			return false
 		}
 	case "ip", "ip4", "ip6":
 		switch runtime.GOOS {
-		case "fuchsia", "hurd", "js", "nacl", "plan9":
+		case "fuchsia", "hurd", "js", "nacl", "plan9", "wasip1":
 			return false
 		default:
 			if os.Getuid() != 0 {
@@ -109,21 +117,15 @@
 		}
 	case "unix", "unixgram":
 		switch runtime.GOOS {
-		case "android", "fuchsia", "hurd", "ios", "js", "nacl", "plan9", "windows":
+		case "android", "fuchsia", "hurd", "ios", "js", "nacl", "plan9", "wasip1", "windows":
 			return false
 		case "aix":
 			return unixStrmDgramEnabled()
 		}
 	case "unixpacket":
 		switch runtime.GOOS {
-		case "aix", "android", "fuchsia", "hurd", "darwin", "ios", "js", "nacl", "plan9", "windows", "zos":
+		case "aix", "android", "fuchsia", "hurd", "darwin", "ios", "js", "nacl", "plan9", "wasip1", "windows", "zos":
 			return false
-		case "netbsd":
-			// It passes on amd64 at least. 386 fails
-			// (Issue 22927). arm is unknown.
-			if runtime.GOARCH == "386" {
-				return false
-			}
 		}
 	}
 	switch ss[0] {
@@ -154,22 +156,23 @@
 // The provided network must be "tcp", "tcp4", "tcp6", "unix" or
 // "unixpacket".
 func NewLocalListener(network string) (net.Listener, error) {
+	stackOnce.Do(probeStack)
 	switch network {
 	case "tcp":
-		if SupportsIPv4() {
+		if canListenTCP4OnLoopback {
 			if ln, err := net.Listen("tcp4", "127.0.0.1:0"); err == nil {
 				return ln, nil
 			}
 		}
-		if SupportsIPv6() {
+		if canListenTCP6OnLoopback {
 			return net.Listen("tcp6", "[::1]:0")
 		}
 	case "tcp4":
-		if SupportsIPv4() {
+		if canListenTCP4OnLoopback {
 			return net.Listen("tcp4", "127.0.0.1:0")
 		}
 	case "tcp6":
-		if SupportsIPv6() {
+		if canListenTCP6OnLoopback {
 			return net.Listen("tcp6", "[::1]:0")
 		}
 	case "unix", "unixpacket":
@@ -187,22 +190,23 @@
 //
 // The provided network must be "udp", "udp4", "udp6" or "unixgram".
 func NewLocalPacketListener(network string) (net.PacketConn, error) {
+	stackOnce.Do(probeStack)
 	switch network {
 	case "udp":
-		if SupportsIPv4() {
+		if canListenTCP4OnLoopback {
 			if c, err := net.ListenPacket("udp4", "127.0.0.1:0"); err == nil {
 				return c, nil
 			}
 		}
-		if SupportsIPv6() {
+		if canListenTCP6OnLoopback {
 			return net.ListenPacket("udp6", "[::1]:0")
 		}
 	case "udp4":
-		if SupportsIPv4() {
+		if canListenTCP4OnLoopback {
 			return net.ListenPacket("udp4", "127.0.0.1:0")
 		}
 	case "udp6":
-		if SupportsIPv6() {
+		if canListenTCP6OnLoopback {
 			return net.ListenPacket("udp6", "[::1]:0")
 		}
 	case "unixgram":
diff --git a/src/vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.c b/src/vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.c
index a4605e6..6cc7310 100644
--- a/src/vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.c
+++ b/src/vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.c
@@ -2,6 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
+//go:build (386 || amd64 || amd64p32) && gccgo
 // +build 386 amd64 amd64p32
 // +build gccgo
 
diff --git a/src/vendor/golang.org/x/sys/cpu/cpu_linux_arm64.go b/src/vendor/golang.org/x/sys/cpu/cpu_linux_arm64.go
index 79a38a0..a968b80 100644
--- a/src/vendor/golang.org/x/sys/cpu/cpu_linux_arm64.go
+++ b/src/vendor/golang.org/x/sys/cpu/cpu_linux_arm64.go
@@ -4,6 +4,11 @@
 
 package cpu
 
+import (
+	"strings"
+	"syscall"
+)
+
 // HWCAP/HWCAP2 bits. These are exposed by Linux.
 const (
 	hwcap_FP       = 1 << 0
@@ -32,10 +37,45 @@
 	hwcap_ASIMDFHM = 1 << 23
 )
 
+// linuxKernelCanEmulateCPUID reports whether we're running
+// on Linux 4.11+. Ideally we'd like to ask the question about
+// whether the current kernel contains
+// https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=77c97b4ee21290f5f083173d957843b615abbff2
+// but the version number will have to do.
+func linuxKernelCanEmulateCPUID() bool {
+	var un syscall.Utsname
+	syscall.Uname(&un)
+	var sb strings.Builder
+	for _, b := range un.Release[:] {
+		if b == 0 {
+			break
+		}
+		sb.WriteByte(byte(b))
+	}
+	major, minor, _, ok := parseRelease(sb.String())
+	return ok && (major > 4 || major == 4 && minor >= 11)
+}
+
 func doinit() {
 	if err := readHWCAP(); err != nil {
-		// failed to read /proc/self/auxv, try reading registers directly
-		readARM64Registers()
+		// We failed to read /proc/self/auxv. This can happen if the binary has
+		// been given extra capabilities(7) with /bin/setcap.
+		//
+		// When this happens, we have two options. If the Linux kernel is new
+		// enough (4.11+), we can read the arm64 registers directly which'll
+		// trap into the kernel and then return back to userspace.
+		//
+		// But on older kernels, such as Linux 4.4.180 as used on many Synology
+		// devices, calling readARM64Registers (specifically getisar0) will
+		// cause a SIGILL and we'll die. So for older kernels, parse /proc/cpuinfo
+		// instead.
+		//
+		// See golang/go#57336.
+		if linuxKernelCanEmulateCPUID() {
+			readARM64Registers()
+		} else {
+			readLinuxProcCPUInfo()
+		}
 		return
 	}
 
diff --git a/src/vendor/golang.org/x/sys/cpu/endian_big.go b/src/vendor/golang.org/x/sys/cpu/endian_big.go
new file mode 100644
index 0000000..93ce03a
--- /dev/null
+++ b/src/vendor/golang.org/x/sys/cpu/endian_big.go
@@ -0,0 +1,11 @@
+// Copyright 2023 The Go 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:build armbe || arm64be || m68k || mips || mips64 || mips64p32 || ppc || ppc64 || s390 || s390x || shbe || sparc || sparc64
+// +build armbe arm64be m68k mips mips64 mips64p32 ppc ppc64 s390 s390x shbe sparc sparc64
+
+package cpu
+
+// IsBigEndian records whether the GOARCH's byte order is big endian.
+const IsBigEndian = true
diff --git a/src/vendor/golang.org/x/sys/cpu/endian_little.go b/src/vendor/golang.org/x/sys/cpu/endian_little.go
new file mode 100644
index 0000000..55db853
--- /dev/null
+++ b/src/vendor/golang.org/x/sys/cpu/endian_little.go
@@ -0,0 +1,11 @@
+// Copyright 2023 The Go 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:build 386 || amd64 || amd64p32 || alpha || arm || arm64 || loong64 || mipsle || mips64le || mips64p32le || nios2 || ppc64le || riscv || riscv64 || sh || wasm
+// +build 386 amd64 amd64p32 alpha arm arm64 loong64 mipsle mips64le mips64p32le nios2 ppc64le riscv riscv64 sh wasm
+
+package cpu
+
+// IsBigEndian records whether the GOARCH's byte order is big endian.
+const IsBigEndian = false
diff --git a/src/vendor/golang.org/x/sys/cpu/hwcap_linux.go b/src/vendor/golang.org/x/sys/cpu/hwcap_linux.go
index f3baa37..1d9d91f 100644
--- a/src/vendor/golang.org/x/sys/cpu/hwcap_linux.go
+++ b/src/vendor/golang.org/x/sys/cpu/hwcap_linux.go
@@ -24,6 +24,21 @@
 var hwCap2 uint
 
 func readHWCAP() error {
+	// For Go 1.21+, get auxv from the Go runtime.
+	if a := getAuxv(); len(a) > 0 {
+		for len(a) >= 2 {
+			tag, val := a[0], uint(a[1])
+			a = a[2:]
+			switch tag {
+			case _AT_HWCAP:
+				hwCap = val
+			case _AT_HWCAP2:
+				hwCap2 = val
+			}
+		}
+		return nil
+	}
+
 	buf, err := ioutil.ReadFile(procAuxv)
 	if err != nil {
 		// e.g. on android /proc/self/auxv is not accessible, so silently
diff --git a/src/vendor/golang.org/x/sys/cpu/parse.go b/src/vendor/golang.org/x/sys/cpu/parse.go
new file mode 100644
index 0000000..762b63d
--- /dev/null
+++ b/src/vendor/golang.org/x/sys/cpu/parse.go
@@ -0,0 +1,43 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package cpu
+
+import "strconv"
+
+// parseRelease parses a dot-separated version number. It follows the semver
+// syntax, but allows the minor and patch versions to be elided.
+//
+// This is a copy of the Go runtime's parseRelease from
+// https://golang.org/cl/209597.
+func parseRelease(rel string) (major, minor, patch int, ok bool) {
+	// Strip anything after a dash or plus.
+	for i := 0; i < len(rel); i++ {
+		if rel[i] == '-' || rel[i] == '+' {
+			rel = rel[:i]
+			break
+		}
+	}
+
+	next := func() (int, bool) {
+		for i := 0; i < len(rel); i++ {
+			if rel[i] == '.' {
+				ver, err := strconv.Atoi(rel[:i])
+				rel = rel[i+1:]
+				return ver, err == nil
+			}
+		}
+		ver, err := strconv.Atoi(rel)
+		rel = ""
+		return ver, err == nil
+	}
+	if major, ok = next(); !ok || rel == "" {
+		return
+	}
+	if minor, ok = next(); !ok || rel == "" {
+		return
+	}
+	patch, ok = next()
+	return
+}
diff --git a/src/vendor/golang.org/x/sys/cpu/proc_cpuinfo_linux.go b/src/vendor/golang.org/x/sys/cpu/proc_cpuinfo_linux.go
new file mode 100644
index 0000000..d87bd6b
--- /dev/null
+++ b/src/vendor/golang.org/x/sys/cpu/proc_cpuinfo_linux.go
@@ -0,0 +1,54 @@
+// Copyright 2022 The Go 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:build linux && arm64
+// +build linux,arm64
+
+package cpu
+
+import (
+	"errors"
+	"io"
+	"os"
+	"strings"
+)
+
+func readLinuxProcCPUInfo() error {
+	f, err := os.Open("/proc/cpuinfo")
+	if err != nil {
+		return err
+	}
+	defer f.Close()
+
+	var buf [1 << 10]byte // enough for first CPU
+	n, err := io.ReadFull(f, buf[:])
+	if err != nil && err != io.ErrUnexpectedEOF {
+		return err
+	}
+	in := string(buf[:n])
+	const features = "\nFeatures	: "
+	i := strings.Index(in, features)
+	if i == -1 {
+		return errors.New("no CPU features found")
+	}
+	in = in[i+len(features):]
+	if i := strings.Index(in, "\n"); i != -1 {
+		in = in[:i]
+	}
+	m := map[string]*bool{}
+
+	initOptions() // need it early here; it's harmless to call twice
+	for _, o := range options {
+		m[o.Name] = o.Feature
+	}
+	// The EVTSTRM field has alias "evstrm" in Go, but Linux calls it "evtstrm".
+	m["evtstrm"] = &ARM64.HasEVTSTRM
+
+	for _, f := range strings.Fields(in) {
+		if p, ok := m[f]; ok {
+			*p = true
+		}
+	}
+	return nil
+}
diff --git a/src/vendor/golang.org/x/sys/cpu/runtime_auxv.go b/src/vendor/golang.org/x/sys/cpu/runtime_auxv.go
new file mode 100644
index 0000000..5f92ac9
--- /dev/null
+++ b/src/vendor/golang.org/x/sys/cpu/runtime_auxv.go
@@ -0,0 +1,16 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package cpu
+
+// getAuxvFn is non-nil on Go 1.21+ (via runtime_auxv_go121.go init)
+// on platforms that use auxv.
+var getAuxvFn func() []uintptr
+
+func getAuxv() []uintptr {
+	if getAuxvFn == nil {
+		return nil
+	}
+	return getAuxvFn()
+}
diff --git a/src/vendor/golang.org/x/sys/cpu/runtime_auxv_go121.go b/src/vendor/golang.org/x/sys/cpu/runtime_auxv_go121.go
new file mode 100644
index 0000000..b975ea2
--- /dev/null
+++ b/src/vendor/golang.org/x/sys/cpu/runtime_auxv_go121.go
@@ -0,0 +1,19 @@
+// Copyright 2023 The Go 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:build go1.21
+// +build go1.21
+
+package cpu
+
+import (
+	_ "unsafe" // for linkname
+)
+
+//go:linkname runtime_getAuxv runtime.getAuxv
+func runtime_getAuxv() []uintptr
+
+func init() {
+	getAuxvFn = runtime_getAuxv
+}
diff --git a/src/vendor/golang.org/x/text/unicode/bidi/tables13.0.0.go b/src/vendor/golang.org/x/text/unicode/bidi/tables13.0.0.go
index f248eff..ffadb7b 100644
--- a/src/vendor/golang.org/x/text/unicode/bidi/tables13.0.0.go
+++ b/src/vendor/golang.org/x/text/unicode/bidi/tables13.0.0.go
@@ -1,7 +1,7 @@
 // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
 
-//go:build go1.16
-// +build go1.16
+//go:build go1.16 && !go1.21
+// +build go1.16,!go1.21
 
 package bidi
 
diff --git a/src/vendor/golang.org/x/text/unicode/bidi/tables15.0.0.go b/src/vendor/golang.org/x/text/unicode/bidi/tables15.0.0.go
new file mode 100644
index 0000000..92cce58
--- /dev/null
+++ b/src/vendor/golang.org/x/text/unicode/bidi/tables15.0.0.go
@@ -0,0 +1,2043 @@
+// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
+
+//go:build go1.21
+// +build go1.21
+
+package bidi
+
+// UnicodeVersion is the Unicode version from which the tables in this package are derived.
+const UnicodeVersion = "15.0.0"
+
+// xorMasks contains masks to be xor-ed with brackets to get the reverse
+// version.
+var xorMasks = []int32{ // 8 elements
+	0, 1, 6, 7, 3, 15, 29, 63,
+} // Size: 56 bytes
+
+// lookup returns the trie value for the first UTF-8 encoding in s and
+// the width in bytes of this encoding. The size will be 0 if s does not
+// hold enough bytes to complete the encoding. len(s) must be greater than 0.
+func (t *bidiTrie) lookup(s []byte) (v uint8, sz int) {
+	c0 := s[0]
+	switch {
+	case c0 < 0x80: // is ASCII
+		return bidiValues[c0], 1
+	case c0 < 0xC2:
+		return 0, 1 // Illegal UTF-8: not a starter, not ASCII.
+	case c0 < 0xE0: // 2-byte UTF-8
+		if len(s) < 2 {
+			return 0, 0
+		}
+		i := bidiIndex[c0]
+		c1 := s[1]
+		if c1 < 0x80 || 0xC0 <= c1 {
+			return 0, 1 // Illegal UTF-8: not a continuation byte.
+		}
+		return t.lookupValue(uint32(i), c1), 2
+	case c0 < 0xF0: // 3-byte UTF-8
+		if len(s) < 3 {
+			return 0, 0
+		}
+		i := bidiIndex[c0]
+		c1 := s[1]
+		if c1 < 0x80 || 0xC0 <= c1 {
+			return 0, 1 // Illegal UTF-8: not a continuation byte.
+		}
+		o := uint32(i)<<6 + uint32(c1)
+		i = bidiIndex[o]
+		c2 := s[2]
+		if c2 < 0x80 || 0xC0 <= c2 {
+			return 0, 2 // Illegal UTF-8: not a continuation byte.
+		}
+		return t.lookupValue(uint32(i), c2), 3
+	case c0 < 0xF8: // 4-byte UTF-8
+		if len(s) < 4 {
+			return 0, 0
+		}
+		i := bidiIndex[c0]
+		c1 := s[1]
+		if c1 < 0x80 || 0xC0 <= c1 {
+			return 0, 1 // Illegal UTF-8: not a continuation byte.
+		}
+		o := uint32(i)<<6 + uint32(c1)
+		i = bidiIndex[o]
+		c2 := s[2]
+		if c2 < 0x80 || 0xC0 <= c2 {
+			return 0, 2 // Illegal UTF-8: not a continuation byte.
+		}
+		o = uint32(i)<<6 + uint32(c2)
+		i = bidiIndex[o]
+		c3 := s[3]
+		if c3 < 0x80 || 0xC0 <= c3 {
+			return 0, 3 // Illegal UTF-8: not a continuation byte.
+		}
+		return t.lookupValue(uint32(i), c3), 4
+	}
+	// Illegal rune
+	return 0, 1
+}
+
+// lookupUnsafe returns the trie value for the first UTF-8 encoding in s.
+// s must start with a full and valid UTF-8 encoded rune.
+func (t *bidiTrie) lookupUnsafe(s []byte) uint8 {
+	c0 := s[0]
+	if c0 < 0x80 { // is ASCII
+		return bidiValues[c0]
+	}
+	i := bidiIndex[c0]
+	if c0 < 0xE0 { // 2-byte UTF-8
+		return t.lookupValue(uint32(i), s[1])
+	}
+	i = bidiIndex[uint32(i)<<6+uint32(s[1])]
+	if c0 < 0xF0 { // 3-byte UTF-8
+		return t.lookupValue(uint32(i), s[2])
+	}
+	i = bidiIndex[uint32(i)<<6+uint32(s[2])]
+	if c0 < 0xF8 { // 4-byte UTF-8
+		return t.lookupValue(uint32(i), s[3])
+	}
+	return 0
+}
+
+// lookupString returns the trie value for the first UTF-8 encoding in s and
+// the width in bytes of this encoding. The size will be 0 if s does not
+// hold enough bytes to complete the encoding. len(s) must be greater than 0.
+func (t *bidiTrie) lookupString(s string) (v uint8, sz int) {
+	c0 := s[0]
+	switch {
+	case c0 < 0x80: // is ASCII
+		return bidiValues[c0], 1
+	case c0 < 0xC2:
+		return 0, 1 // Illegal UTF-8: not a starter, not ASCII.
+	case c0 < 0xE0: // 2-byte UTF-8
+		if len(s) < 2 {
+			return 0, 0
+		}
+		i := bidiIndex[c0]
+		c1 := s[1]
+		if c1 < 0x80 || 0xC0 <= c1 {
+			return 0, 1 // Illegal UTF-8: not a continuation byte.
+		}
+		return t.lookupValue(uint32(i), c1), 2
+	case c0 < 0xF0: // 3-byte UTF-8
+		if len(s) < 3 {
+			return 0, 0
+		}
+		i := bidiIndex[c0]
+		c1 := s[1]
+		if c1 < 0x80 || 0xC0 <= c1 {
+			return 0, 1 // Illegal UTF-8: not a continuation byte.
+		}
+		o := uint32(i)<<6 + uint32(c1)
+		i = bidiIndex[o]
+		c2 := s[2]
+		if c2 < 0x80 || 0xC0 <= c2 {
+			return 0, 2 // Illegal UTF-8: not a continuation byte.
+		}
+		return t.lookupValue(uint32(i), c2), 3
+	case c0 < 0xF8: // 4-byte UTF-8
+		if len(s) < 4 {
+			return 0, 0
+		}
+		i := bidiIndex[c0]
+		c1 := s[1]
+		if c1 < 0x80 || 0xC0 <= c1 {
+			return 0, 1 // Illegal UTF-8: not a continuation byte.
+		}
+		o := uint32(i)<<6 + uint32(c1)
+		i = bidiIndex[o]
+		c2 := s[2]
+		if c2 < 0x80 || 0xC0 <= c2 {
+			return 0, 2 // Illegal UTF-8: not a continuation byte.
+		}
+		o = uint32(i)<<6 + uint32(c2)
+		i = bidiIndex[o]
+		c3 := s[3]
+		if c3 < 0x80 || 0xC0 <= c3 {
+			return 0, 3 // Illegal UTF-8: not a continuation byte.
+		}
+		return t.lookupValue(uint32(i), c3), 4
+	}
+	// Illegal rune
+	return 0, 1
+}
+
+// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s.
+// s must start with a full and valid UTF-8 encoded rune.
+func (t *bidiTrie) lookupStringUnsafe(s string) uint8 {
+	c0 := s[0]
+	if c0 < 0x80 { // is ASCII
+		return bidiValues[c0]
+	}
+	i := bidiIndex[c0]
+	if c0 < 0xE0 { // 2-byte UTF-8
+		return t.lookupValue(uint32(i), s[1])
+	}
+	i = bidiIndex[uint32(i)<<6+uint32(s[1])]
+	if c0 < 0xF0 { // 3-byte UTF-8
+		return t.lookupValue(uint32(i), s[2])
+	}
+	i = bidiIndex[uint32(i)<<6+uint32(s[2])]
+	if c0 < 0xF8 { // 4-byte UTF-8
+		return t.lookupValue(uint32(i), s[3])
+	}
+	return 0
+}
+
+// bidiTrie. Total size: 19904 bytes (19.44 KiB). Checksum: b1f201ed2debb6c8.
+type bidiTrie struct{}
+
+func newBidiTrie(i int) *bidiTrie {
+	return &bidiTrie{}
+}
+
+// lookupValue determines the type of block n and looks up the value for b.
+func (t *bidiTrie) lookupValue(n uint32, b byte) uint8 {
+	switch {
+	default:
+		return uint8(bidiValues[n<<6+uint32(b)])
+	}
+}
+
+// bidiValues: 259 blocks, 16576 entries, 16576 bytes
+// The third block is the zero block.
+var bidiValues = [16576]uint8{
+	// Block 0x0, offset 0x0
+	0x00: 0x000b, 0x01: 0x000b, 0x02: 0x000b, 0x03: 0x000b, 0x04: 0x000b, 0x05: 0x000b,
+	0x06: 0x000b, 0x07: 0x000b, 0x08: 0x000b, 0x09: 0x0008, 0x0a: 0x0007, 0x0b: 0x0008,
+	0x0c: 0x0009, 0x0d: 0x0007, 0x0e: 0x000b, 0x0f: 0x000b, 0x10: 0x000b, 0x11: 0x000b,
+	0x12: 0x000b, 0x13: 0x000b, 0x14: 0x000b, 0x15: 0x000b, 0x16: 0x000b, 0x17: 0x000b,
+	0x18: 0x000b, 0x19: 0x000b, 0x1a: 0x000b, 0x1b: 0x000b, 0x1c: 0x0007, 0x1d: 0x0007,
+	0x1e: 0x0007, 0x1f: 0x0008, 0x20: 0x0009, 0x21: 0x000a, 0x22: 0x000a, 0x23: 0x0004,
+	0x24: 0x0004, 0x25: 0x0004, 0x26: 0x000a, 0x27: 0x000a, 0x28: 0x003a, 0x29: 0x002a,
+	0x2a: 0x000a, 0x2b: 0x0003, 0x2c: 0x0006, 0x2d: 0x0003, 0x2e: 0x0006, 0x2f: 0x0006,
+	0x30: 0x0002, 0x31: 0x0002, 0x32: 0x0002, 0x33: 0x0002, 0x34: 0x0002, 0x35: 0x0002,
+	0x36: 0x0002, 0x37: 0x0002, 0x38: 0x0002, 0x39: 0x0002, 0x3a: 0x0006, 0x3b: 0x000a,
+	0x3c: 0x000a, 0x3d: 0x000a, 0x3e: 0x000a, 0x3f: 0x000a,
+	// Block 0x1, offset 0x40
+	0x40: 0x000a,
+	0x5b: 0x005a, 0x5c: 0x000a, 0x5d: 0x004a,
+	0x5e: 0x000a, 0x5f: 0x000a, 0x60: 0x000a,
+	0x7b: 0x005a,
+	0x7c: 0x000a, 0x7d: 0x004a, 0x7e: 0x000a, 0x7f: 0x000b,
+	// Block 0x2, offset 0x80
+	// Block 0x3, offset 0xc0
+	0xc0: 0x000b, 0xc1: 0x000b, 0xc2: 0x000b, 0xc3: 0x000b, 0xc4: 0x000b, 0xc5: 0x0007,
+	0xc6: 0x000b, 0xc7: 0x000b, 0xc8: 0x000b, 0xc9: 0x000b, 0xca: 0x000b, 0xcb: 0x000b,
+	0xcc: 0x000b, 0xcd: 0x000b, 0xce: 0x000b, 0xcf: 0x000b, 0xd0: 0x000b, 0xd1: 0x000b,
+	0xd2: 0x000b, 0xd3: 0x000b, 0xd4: 0x000b, 0xd5: 0x000b, 0xd6: 0x000b, 0xd7: 0x000b,
+	0xd8: 0x000b, 0xd9: 0x000b, 0xda: 0x000b, 0xdb: 0x000b, 0xdc: 0x000b, 0xdd: 0x000b,
+	0xde: 0x000b, 0xdf: 0x000b, 0xe0: 0x0006, 0xe1: 0x000a, 0xe2: 0x0004, 0xe3: 0x0004,
+	0xe4: 0x0004, 0xe5: 0x0004, 0xe6: 0x000a, 0xe7: 0x000a, 0xe8: 0x000a, 0xe9: 0x000a,
+	0xeb: 0x000a, 0xec: 0x000a, 0xed: 0x000b, 0xee: 0x000a, 0xef: 0x000a,
+	0xf0: 0x0004, 0xf1: 0x0004, 0xf2: 0x0002, 0xf3: 0x0002, 0xf4: 0x000a,
+	0xf6: 0x000a, 0xf7: 0x000a, 0xf8: 0x000a, 0xf9: 0x0002, 0xfb: 0x000a,
+	0xfc: 0x000a, 0xfd: 0x000a, 0xfe: 0x000a, 0xff: 0x000a,
+	// Block 0x4, offset 0x100
+	0x117: 0x000a,
+	0x137: 0x000a,
+	// Block 0x5, offset 0x140
+	0x179: 0x000a, 0x17a: 0x000a,
+	// Block 0x6, offset 0x180
+	0x182: 0x000a, 0x183: 0x000a, 0x184: 0x000a, 0x185: 0x000a,
+	0x186: 0x000a, 0x187: 0x000a, 0x188: 0x000a, 0x189: 0x000a, 0x18a: 0x000a, 0x18b: 0x000a,
+	0x18c: 0x000a, 0x18d: 0x000a, 0x18e: 0x000a, 0x18f: 0x000a,
+	0x192: 0x000a, 0x193: 0x000a, 0x194: 0x000a, 0x195: 0x000a, 0x196: 0x000a, 0x197: 0x000a,
+	0x198: 0x000a, 0x199: 0x000a, 0x19a: 0x000a, 0x19b: 0x000a, 0x19c: 0x000a, 0x19d: 0x000a,
+	0x19e: 0x000a, 0x19f: 0x000a,
+	0x1a5: 0x000a, 0x1a6: 0x000a, 0x1a7: 0x000a, 0x1a8: 0x000a, 0x1a9: 0x000a,
+	0x1aa: 0x000a, 0x1ab: 0x000a, 0x1ac: 0x000a, 0x1ad: 0x000a, 0x1af: 0x000a,
+	0x1b0: 0x000a, 0x1b1: 0x000a, 0x1b2: 0x000a, 0x1b3: 0x000a, 0x1b4: 0x000a, 0x1b5: 0x000a,
+	0x1b6: 0x000a, 0x1b7: 0x000a, 0x1b8: 0x000a, 0x1b9: 0x000a, 0x1ba: 0x000a, 0x1bb: 0x000a,
+	0x1bc: 0x000a, 0x1bd: 0x000a, 0x1be: 0x000a, 0x1bf: 0x000a,
+	// Block 0x7, offset 0x1c0
+	0x1c0: 0x000c, 0x1c1: 0x000c, 0x1c2: 0x000c, 0x1c3: 0x000c, 0x1c4: 0x000c, 0x1c5: 0x000c,
+	0x1c6: 0x000c, 0x1c7: 0x000c, 0x1c8: 0x000c, 0x1c9: 0x000c, 0x1ca: 0x000c, 0x1cb: 0x000c,
+	0x1cc: 0x000c, 0x1cd: 0x000c, 0x1ce: 0x000c, 0x1cf: 0x000c, 0x1d0: 0x000c, 0x1d1: 0x000c,
+	0x1d2: 0x000c, 0x1d3: 0x000c, 0x1d4: 0x000c, 0x1d5: 0x000c, 0x1d6: 0x000c, 0x1d7: 0x000c,
+	0x1d8: 0x000c, 0x1d9: 0x000c, 0x1da: 0x000c, 0x1db: 0x000c, 0x1dc: 0x000c, 0x1dd: 0x000c,
+	0x1de: 0x000c, 0x1df: 0x000c, 0x1e0: 0x000c, 0x1e1: 0x000c, 0x1e2: 0x000c, 0x1e3: 0x000c,
+	0x1e4: 0x000c, 0x1e5: 0x000c, 0x1e6: 0x000c, 0x1e7: 0x000c, 0x1e8: 0x000c, 0x1e9: 0x000c,
+	0x1ea: 0x000c, 0x1eb: 0x000c, 0x1ec: 0x000c, 0x1ed: 0x000c, 0x1ee: 0x000c, 0x1ef: 0x000c,
+	0x1f0: 0x000c, 0x1f1: 0x000c, 0x1f2: 0x000c, 0x1f3: 0x000c, 0x1f4: 0x000c, 0x1f5: 0x000c,
+	0x1f6: 0x000c, 0x1f7: 0x000c, 0x1f8: 0x000c, 0x1f9: 0x000c, 0x1fa: 0x000c, 0x1fb: 0x000c,
+	0x1fc: 0x000c, 0x1fd: 0x000c, 0x1fe: 0x000c, 0x1ff: 0x000c,
+	// Block 0x8, offset 0x200
+	0x200: 0x000c, 0x201: 0x000c, 0x202: 0x000c, 0x203: 0x000c, 0x204: 0x000c, 0x205: 0x000c,
+	0x206: 0x000c, 0x207: 0x000c, 0x208: 0x000c, 0x209: 0x000c, 0x20a: 0x000c, 0x20b: 0x000c,
+	0x20c: 0x000c, 0x20d: 0x000c, 0x20e: 0x000c, 0x20f: 0x000c, 0x210: 0x000c, 0x211: 0x000c,
+	0x212: 0x000c, 0x213: 0x000c, 0x214: 0x000c, 0x215: 0x000c, 0x216: 0x000c, 0x217: 0x000c,
+	0x218: 0x000c, 0x219: 0x000c, 0x21a: 0x000c, 0x21b: 0x000c, 0x21c: 0x000c, 0x21d: 0x000c,
+	0x21e: 0x000c, 0x21f: 0x000c, 0x220: 0x000c, 0x221: 0x000c, 0x222: 0x000c, 0x223: 0x000c,
+	0x224: 0x000c, 0x225: 0x000c, 0x226: 0x000c, 0x227: 0x000c, 0x228: 0x000c, 0x229: 0x000c,
+	0x22a: 0x000c, 0x22b: 0x000c, 0x22c: 0x000c, 0x22d: 0x000c, 0x22e: 0x000c, 0x22f: 0x000c,
+	0x234: 0x000a, 0x235: 0x000a,
+	0x23e: 0x000a,
+	// Block 0x9, offset 0x240
+	0x244: 0x000a, 0x245: 0x000a,
+	0x247: 0x000a,
+	// Block 0xa, offset 0x280
+	0x2b6: 0x000a,
+	// Block 0xb, offset 0x2c0
+	0x2c3: 0x000c, 0x2c4: 0x000c, 0x2c5: 0x000c,
+	0x2c6: 0x000c, 0x2c7: 0x000c, 0x2c8: 0x000c, 0x2c9: 0x000c,
+	// Block 0xc, offset 0x300
+	0x30a: 0x000a,
+	0x30d: 0x000a, 0x30e: 0x000a, 0x30f: 0x0004, 0x310: 0x0001, 0x311: 0x000c,
+	0x312: 0x000c, 0x313: 0x000c, 0x314: 0x000c, 0x315: 0x000c, 0x316: 0x000c, 0x317: 0x000c,
+	0x318: 0x000c, 0x319: 0x000c, 0x31a: 0x000c, 0x31b: 0x000c, 0x31c: 0x000c, 0x31d: 0x000c,
+	0x31e: 0x000c, 0x31f: 0x000c, 0x320: 0x000c, 0x321: 0x000c, 0x322: 0x000c, 0x323: 0x000c,
+	0x324: 0x000c, 0x325: 0x000c, 0x326: 0x000c, 0x327: 0x000c, 0x328: 0x000c, 0x329: 0x000c,
+	0x32a: 0x000c, 0x32b: 0x000c, 0x32c: 0x000c, 0x32d: 0x000c, 0x32e: 0x000c, 0x32f: 0x000c,
+	0x330: 0x000c, 0x331: 0x000c, 0x332: 0x000c, 0x333: 0x000c, 0x334: 0x000c, 0x335: 0x000c,
+	0x336: 0x000c, 0x337: 0x000c, 0x338: 0x000c, 0x339: 0x000c, 0x33a: 0x000c, 0x33b: 0x000c,
+	0x33c: 0x000c, 0x33d: 0x000c, 0x33e: 0x0001, 0x33f: 0x000c,
+	// Block 0xd, offset 0x340
+	0x340: 0x0001, 0x341: 0x000c, 0x342: 0x000c, 0x343: 0x0001, 0x344: 0x000c, 0x345: 0x000c,
+	0x346: 0x0001, 0x347: 0x000c, 0x348: 0x0001, 0x349: 0x0001, 0x34a: 0x0001, 0x34b: 0x0001,
+	0x34c: 0x0001, 0x34d: 0x0001, 0x34e: 0x0001, 0x34f: 0x0001, 0x350: 0x0001, 0x351: 0x0001,
+	0x352: 0x0001, 0x353: 0x0001, 0x354: 0x0001, 0x355: 0x0001, 0x356: 0x0001, 0x357: 0x0001,
+	0x358: 0x0001, 0x359: 0x0001, 0x35a: 0x0001, 0x35b: 0x0001, 0x35c: 0x0001, 0x35d: 0x0001,
+	0x35e: 0x0001, 0x35f: 0x0001, 0x360: 0x0001, 0x361: 0x0001, 0x362: 0x0001, 0x363: 0x0001,
+	0x364: 0x0001, 0x365: 0x0001, 0x366: 0x0001, 0x367: 0x0001, 0x368: 0x0001, 0x369: 0x0001,
+	0x36a: 0x0001, 0x36b: 0x0001, 0x36c: 0x0001, 0x36d: 0x0001, 0x36e: 0x0001, 0x36f: 0x0001,
+	0x370: 0x0001, 0x371: 0x0001, 0x372: 0x0001, 0x373: 0x0001, 0x374: 0x0001, 0x375: 0x0001,
+	0x376: 0x0001, 0x377: 0x0001, 0x378: 0x0001, 0x379: 0x0001, 0x37a: 0x0001, 0x37b: 0x0001,
+	0x37c: 0x0001, 0x37d: 0x0001, 0x37e: 0x0001, 0x37f: 0x0001,
+	// Block 0xe, offset 0x380
+	0x380: 0x0005, 0x381: 0x0005, 0x382: 0x0005, 0x383: 0x0005, 0x384: 0x0005, 0x385: 0x0005,
+	0x386: 0x000a, 0x387: 0x000a, 0x388: 0x000d, 0x389: 0x0004, 0x38a: 0x0004, 0x38b: 0x000d,
+	0x38c: 0x0006, 0x38d: 0x000d, 0x38e: 0x000a, 0x38f: 0x000a, 0x390: 0x000c, 0x391: 0x000c,
+	0x392: 0x000c, 0x393: 0x000c, 0x394: 0x000c, 0x395: 0x000c, 0x396: 0x000c, 0x397: 0x000c,
+	0x398: 0x000c, 0x399: 0x000c, 0x39a: 0x000c, 0x39b: 0x000d, 0x39c: 0x000d, 0x39d: 0x000d,
+	0x39e: 0x000d, 0x39f: 0x000d, 0x3a0: 0x000d, 0x3a1: 0x000d, 0x3a2: 0x000d, 0x3a3: 0x000d,
+	0x3a4: 0x000d, 0x3a5: 0x000d, 0x3a6: 0x000d, 0x3a7: 0x000d, 0x3a8: 0x000d, 0x3a9: 0x000d,
+	0x3aa: 0x000d, 0x3ab: 0x000d, 0x3ac: 0x000d, 0x3ad: 0x000d, 0x3ae: 0x000d, 0x3af: 0x000d,
+	0x3b0: 0x000d, 0x3b1: 0x000d, 0x3b2: 0x000d, 0x3b3: 0x000d, 0x3b4: 0x000d, 0x3b5: 0x000d,
+	0x3b6: 0x000d, 0x3b7: 0x000d, 0x3b8: 0x000d, 0x3b9: 0x000d, 0x3ba: 0x000d, 0x3bb: 0x000d,
+	0x3bc: 0x000d, 0x3bd: 0x000d, 0x3be: 0x000d, 0x3bf: 0x000d,
+	// Block 0xf, offset 0x3c0
+	0x3c0: 0x000d, 0x3c1: 0x000d, 0x3c2: 0x000d, 0x3c3: 0x000d, 0x3c4: 0x000d, 0x3c5: 0x000d,
+	0x3c6: 0x000d, 0x3c7: 0x000d, 0x3c8: 0x000d, 0x3c9: 0x000d, 0x3ca: 0x000d, 0x3cb: 0x000c,
+	0x3cc: 0x000c, 0x3cd: 0x000c, 0x3ce: 0x000c, 0x3cf: 0x000c, 0x3d0: 0x000c, 0x3d1: 0x000c,
+	0x3d2: 0x000c, 0x3d3: 0x000c, 0x3d4: 0x000c, 0x3d5: 0x000c, 0x3d6: 0x000c, 0x3d7: 0x000c,
+	0x3d8: 0x000c, 0x3d9: 0x000c, 0x3da: 0x000c, 0x3db: 0x000c, 0x3dc: 0x000c, 0x3dd: 0x000c,
+	0x3de: 0x000c, 0x3df: 0x000c, 0x3e0: 0x0005, 0x3e1: 0x0005, 0x3e2: 0x0005, 0x3e3: 0x0005,
+	0x3e4: 0x0005, 0x3e5: 0x0005, 0x3e6: 0x0005, 0x3e7: 0x0005, 0x3e8: 0x0005, 0x3e9: 0x0005,
+	0x3ea: 0x0004, 0x3eb: 0x0005, 0x3ec: 0x0005, 0x3ed: 0x000d, 0x3ee: 0x000d, 0x3ef: 0x000d,
+	0x3f0: 0x000c, 0x3f1: 0x000d, 0x3f2: 0x000d, 0x3f3: 0x000d, 0x3f4: 0x000d, 0x3f5: 0x000d,
+	0x3f6: 0x000d, 0x3f7: 0x000d, 0x3f8: 0x000d, 0x3f9: 0x000d, 0x3fa: 0x000d, 0x3fb: 0x000d,
+	0x3fc: 0x000d, 0x3fd: 0x000d, 0x3fe: 0x000d, 0x3ff: 0x000d,
+	// Block 0x10, offset 0x400
+	0x400: 0x000d, 0x401: 0x000d, 0x402: 0x000d, 0x403: 0x000d, 0x404: 0x000d, 0x405: 0x000d,
+	0x406: 0x000d, 0x407: 0x000d, 0x408: 0x000d, 0x409: 0x000d, 0x40a: 0x000d, 0x40b: 0x000d,
+	0x40c: 0x000d, 0x40d: 0x000d, 0x40e: 0x000d, 0x40f: 0x000d, 0x410: 0x000d, 0x411: 0x000d,
+	0x412: 0x000d, 0x413: 0x000d, 0x414: 0x000d, 0x415: 0x000d, 0x416: 0x000d, 0x417: 0x000d,
+	0x418: 0x000d, 0x419: 0x000d, 0x41a: 0x000d, 0x41b: 0x000d, 0x41c: 0x000d, 0x41d: 0x000d,
+	0x41e: 0x000d, 0x41f: 0x000d, 0x420: 0x000d, 0x421: 0x000d, 0x422: 0x000d, 0x423: 0x000d,
+	0x424: 0x000d, 0x425: 0x000d, 0x426: 0x000d, 0x427: 0x000d, 0x428: 0x000d, 0x429: 0x000d,
+	0x42a: 0x000d, 0x42b: 0x000d, 0x42c: 0x000d, 0x42d: 0x000d, 0x42e: 0x000d, 0x42f: 0x000d,
+	0x430: 0x000d, 0x431: 0x000d, 0x432: 0x000d, 0x433: 0x000d, 0x434: 0x000d, 0x435: 0x000d,
+	0x436: 0x000d, 0x437: 0x000d, 0x438: 0x000d, 0x439: 0x000d, 0x43a: 0x000d, 0x43b: 0x000d,
+	0x43c: 0x000d, 0x43d: 0x000d, 0x43e: 0x000d, 0x43f: 0x000d,
+	// Block 0x11, offset 0x440
+	0x440: 0x000d, 0x441: 0x000d, 0x442: 0x000d, 0x443: 0x000d, 0x444: 0x000d, 0x445: 0x000d,
+	0x446: 0x000d, 0x447: 0x000d, 0x448: 0x000d, 0x449: 0x000d, 0x44a: 0x000d, 0x44b: 0x000d,
+	0x44c: 0x000d, 0x44d: 0x000d, 0x44e: 0x000d, 0x44f: 0x000d, 0x450: 0x000d, 0x451: 0x000d,
+	0x452: 0x000d, 0x453: 0x000d, 0x454: 0x000d, 0x455: 0x000d, 0x456: 0x000c, 0x457: 0x000c,
+	0x458: 0x000c, 0x459: 0x000c, 0x45a: 0x000c, 0x45b: 0x000c, 0x45c: 0x000c, 0x45d: 0x0005,
+	0x45e: 0x000a, 0x45f: 0x000c, 0x460: 0x000c, 0x461: 0x000c, 0x462: 0x000c, 0x463: 0x000c,
+	0x464: 0x000c, 0x465: 0x000d, 0x466: 0x000d, 0x467: 0x000c, 0x468: 0x000c, 0x469: 0x000a,
+	0x46a: 0x000c, 0x46b: 0x000c, 0x46c: 0x000c, 0x46d: 0x000c, 0x46e: 0x000d, 0x46f: 0x000d,
+	0x470: 0x0002, 0x471: 0x0002, 0x472: 0x0002, 0x473: 0x0002, 0x474: 0x0002, 0x475: 0x0002,
+	0x476: 0x0002, 0x477: 0x0002, 0x478: 0x0002, 0x479: 0x0002, 0x47a: 0x000d, 0x47b: 0x000d,
+	0x47c: 0x000d, 0x47d: 0x000d, 0x47e: 0x000d, 0x47f: 0x000d,
+	// Block 0x12, offset 0x480
+	0x480: 0x000d, 0x481: 0x000d, 0x482: 0x000d, 0x483: 0x000d, 0x484: 0x000d, 0x485: 0x000d,
+	0x486: 0x000d, 0x487: 0x000d, 0x488: 0x000d, 0x489: 0x000d, 0x48a: 0x000d, 0x48b: 0x000d,
+	0x48c: 0x000d, 0x48d: 0x000d, 0x48e: 0x000d, 0x48f: 0x000d, 0x490: 0x000d, 0x491: 0x000c,
+	0x492: 0x000d, 0x493: 0x000d, 0x494: 0x000d, 0x495: 0x000d, 0x496: 0x000d, 0x497: 0x000d,
+	0x498: 0x000d, 0x499: 0x000d, 0x49a: 0x000d, 0x49b: 0x000d, 0x49c: 0x000d, 0x49d: 0x000d,
+	0x49e: 0x000d, 0x49f: 0x000d, 0x4a0: 0x000d, 0x4a1: 0x000d, 0x4a2: 0x000d, 0x4a3: 0x000d,
+	0x4a4: 0x000d, 0x4a5: 0x000d, 0x4a6: 0x000d, 0x4a7: 0x000d, 0x4a8: 0x000d, 0x4a9: 0x000d,
+	0x4aa: 0x000d, 0x4ab: 0x000d, 0x4ac: 0x000d, 0x4ad: 0x000d, 0x4ae: 0x000d, 0x4af: 0x000d,
+	0x4b0: 0x000c, 0x4b1: 0x000c, 0x4b2: 0x000c, 0x4b3: 0x000c, 0x4b4: 0x000c, 0x4b5: 0x000c,
+	0x4b6: 0x000c, 0x4b7: 0x000c, 0x4b8: 0x000c, 0x4b9: 0x000c, 0x4ba: 0x000c, 0x4bb: 0x000c,
+	0x4bc: 0x000c, 0x4bd: 0x000c, 0x4be: 0x000c, 0x4bf: 0x000c,
+	// Block 0x13, offset 0x4c0
+	0x4c0: 0x000c, 0x4c1: 0x000c, 0x4c2: 0x000c, 0x4c3: 0x000c, 0x4c4: 0x000c, 0x4c5: 0x000c,
+	0x4c6: 0x000c, 0x4c7: 0x000c, 0x4c8: 0x000c, 0x4c9: 0x000c, 0x4ca: 0x000c, 0x4cb: 0x000d,
+	0x4cc: 0x000d, 0x4cd: 0x000d, 0x4ce: 0x000d, 0x4cf: 0x000d, 0x4d0: 0x000d, 0x4d1: 0x000d,
+	0x4d2: 0x000d, 0x4d3: 0x000d, 0x4d4: 0x000d, 0x4d5: 0x000d, 0x4d6: 0x000d, 0x4d7: 0x000d,
+	0x4d8: 0x000d, 0x4d9: 0x000d, 0x4da: 0x000d, 0x4db: 0x000d, 0x4dc: 0x000d, 0x4dd: 0x000d,
+	0x4de: 0x000d, 0x4df: 0x000d, 0x4e0: 0x000d, 0x4e1: 0x000d, 0x4e2: 0x000d, 0x4e3: 0x000d,
+	0x4e4: 0x000d, 0x4e5: 0x000d, 0x4e6: 0x000d, 0x4e7: 0x000d, 0x4e8: 0x000d, 0x4e9: 0x000d,
+	0x4ea: 0x000d, 0x4eb: 0x000d, 0x4ec: 0x000d, 0x4ed: 0x000d, 0x4ee: 0x000d, 0x4ef: 0x000d,
+	0x4f0: 0x000d, 0x4f1: 0x000d, 0x4f2: 0x000d, 0x4f3: 0x000d, 0x4f4: 0x000d, 0x4f5: 0x000d,
+	0x4f6: 0x000d, 0x4f7: 0x000d, 0x4f8: 0x000d, 0x4f9: 0x000d, 0x4fa: 0x000d, 0x4fb: 0x000d,
+	0x4fc: 0x000d, 0x4fd: 0x000d, 0x4fe: 0x000d, 0x4ff: 0x000d,
+	// Block 0x14, offset 0x500
+	0x500: 0x000d, 0x501: 0x000d, 0x502: 0x000d, 0x503: 0x000d, 0x504: 0x000d, 0x505: 0x000d,
+	0x506: 0x000d, 0x507: 0x000d, 0x508: 0x000d, 0x509: 0x000d, 0x50a: 0x000d, 0x50b: 0x000d,
+	0x50c: 0x000d, 0x50d: 0x000d, 0x50e: 0x000d, 0x50f: 0x000d, 0x510: 0x000d, 0x511: 0x000d,
+	0x512: 0x000d, 0x513: 0x000d, 0x514: 0x000d, 0x515: 0x000d, 0x516: 0x000d, 0x517: 0x000d,
+	0x518: 0x000d, 0x519: 0x000d, 0x51a: 0x000d, 0x51b: 0x000d, 0x51c: 0x000d, 0x51d: 0x000d,
+	0x51e: 0x000d, 0x51f: 0x000d, 0x520: 0x000d, 0x521: 0x000d, 0x522: 0x000d, 0x523: 0x000d,
+	0x524: 0x000d, 0x525: 0x000d, 0x526: 0x000c, 0x527: 0x000c, 0x528: 0x000c, 0x529: 0x000c,
+	0x52a: 0x000c, 0x52b: 0x000c, 0x52c: 0x000c, 0x52d: 0x000c, 0x52e: 0x000c, 0x52f: 0x000c,
+	0x530: 0x000c, 0x531: 0x000d, 0x532: 0x000d, 0x533: 0x000d, 0x534: 0x000d, 0x535: 0x000d,
+	0x536: 0x000d, 0x537: 0x000d, 0x538: 0x000d, 0x539: 0x000d, 0x53a: 0x000d, 0x53b: 0x000d,
+	0x53c: 0x000d, 0x53d: 0x000d, 0x53e: 0x000d, 0x53f: 0x000d,
+	// Block 0x15, offset 0x540
+	0x540: 0x0001, 0x541: 0x0001, 0x542: 0x0001, 0x543: 0x0001, 0x544: 0x0001, 0x545: 0x0001,
+	0x546: 0x0001, 0x547: 0x0001, 0x548: 0x0001, 0x549: 0x0001, 0x54a: 0x0001, 0x54b: 0x0001,
+	0x54c: 0x0001, 0x54d: 0x0001, 0x54e: 0x0001, 0x54f: 0x0001, 0x550: 0x0001, 0x551: 0x0001,
+	0x552: 0x0001, 0x553: 0x0001, 0x554: 0x0001, 0x555: 0x0001, 0x556: 0x0001, 0x557: 0x0001,
+	0x558: 0x0001, 0x559: 0x0001, 0x55a: 0x0001, 0x55b: 0x0001, 0x55c: 0x0001, 0x55d: 0x0001,
+	0x55e: 0x0001, 0x55f: 0x0001, 0x560: 0x0001, 0x561: 0x0001, 0x562: 0x0001, 0x563: 0x0001,
+	0x564: 0x0001, 0x565: 0x0001, 0x566: 0x0001, 0x567: 0x0001, 0x568: 0x0001, 0x569: 0x0001,
+	0x56a: 0x0001, 0x56b: 0x000c, 0x56c: 0x000c, 0x56d: 0x000c, 0x56e: 0x000c, 0x56f: 0x000c,
+	0x570: 0x000c, 0x571: 0x000c, 0x572: 0x000c, 0x573: 0x000c, 0x574: 0x0001, 0x575: 0x0001,
+	0x576: 0x000a, 0x577: 0x000a, 0x578: 0x000a, 0x579: 0x000a, 0x57a: 0x0001, 0x57b: 0x0001,
+	0x57c: 0x0001, 0x57d: 0x000c, 0x57e: 0x0001, 0x57f: 0x0001,
+	// Block 0x16, offset 0x580
+	0x580: 0x0001, 0x581: 0x0001, 0x582: 0x0001, 0x583: 0x0001, 0x584: 0x0001, 0x585: 0x0001,
+	0x586: 0x0001, 0x587: 0x0001, 0x588: 0x0001, 0x589: 0x0001, 0x58a: 0x0001, 0x58b: 0x0001,
+	0x58c: 0x0001, 0x58d: 0x0001, 0x58e: 0x0001, 0x58f: 0x0001, 0x590: 0x0001, 0x591: 0x0001,
+	0x592: 0x0001, 0x593: 0x0001, 0x594: 0x0001, 0x595: 0x0001, 0x596: 0x000c, 0x597: 0x000c,
+	0x598: 0x000c, 0x599: 0x000c, 0x59a: 0x0001, 0x59b: 0x000c, 0x59c: 0x000c, 0x59d: 0x000c,
+	0x59e: 0x000c, 0x59f: 0x000c, 0x5a0: 0x000c, 0x5a1: 0x000c, 0x5a2: 0x000c, 0x5a3: 0x000c,
+	0x5a4: 0x0001, 0x5a5: 0x000c, 0x5a6: 0x000c, 0x5a7: 0x000c, 0x5a8: 0x0001, 0x5a9: 0x000c,
+	0x5aa: 0x000c, 0x5ab: 0x000c, 0x5ac: 0x000c, 0x5ad: 0x000c, 0x5ae: 0x0001, 0x5af: 0x0001,
+	0x5b0: 0x0001, 0x5b1: 0x0001, 0x5b2: 0x0001, 0x5b3: 0x0001, 0x5b4: 0x0001, 0x5b5: 0x0001,
+	0x5b6: 0x0001, 0x5b7: 0x0001, 0x5b8: 0x0001, 0x5b9: 0x0001, 0x5ba: 0x0001, 0x5bb: 0x0001,
+	0x5bc: 0x0001, 0x5bd: 0x0001, 0x5be: 0x0001, 0x5bf: 0x0001,
+	// Block 0x17, offset 0x5c0
+	0x5c0: 0x0001, 0x5c1: 0x0001, 0x5c2: 0x0001, 0x5c3: 0x0001, 0x5c4: 0x0001, 0x5c5: 0x0001,
+	0x5c6: 0x0001, 0x5c7: 0x0001, 0x5c8: 0x0001, 0x5c9: 0x0001, 0x5ca: 0x0001, 0x5cb: 0x0001,
+	0x5cc: 0x0001, 0x5cd: 0x0001, 0x5ce: 0x0001, 0x5cf: 0x0001, 0x5d0: 0x0001, 0x5d1: 0x0001,
+	0x5d2: 0x0001, 0x5d3: 0x0001, 0x5d4: 0x0001, 0x5d5: 0x0001, 0x5d6: 0x0001, 0x5d7: 0x0001,
+	0x5d8: 0x0001, 0x5d9: 0x000c, 0x5da: 0x000c, 0x5db: 0x000c, 0x5dc: 0x0001, 0x5dd: 0x0001,
+	0x5de: 0x0001, 0x5df: 0x0001, 0x5e0: 0x000d, 0x5e1: 0x000d, 0x5e2: 0x000d, 0x5e3: 0x000d,
+	0x5e4: 0x000d, 0x5e5: 0x000d, 0x5e6: 0x000d, 0x5e7: 0x000d, 0x5e8: 0x000d, 0x5e9: 0x000d,
+	0x5ea: 0x000d, 0x5eb: 0x0001, 0x5ec: 0x0001, 0x5ed: 0x0001, 0x5ee: 0x0001, 0x5ef: 0x0001,
+	0x5f0: 0x000d, 0x5f1: 0x000d, 0x5f2: 0x000d, 0x5f3: 0x000d, 0x5f4: 0x000d, 0x5f5: 0x000d,
+	0x5f6: 0x000d, 0x5f7: 0x000d, 0x5f8: 0x000d, 0x5f9: 0x000d, 0x5fa: 0x000d, 0x5fb: 0x000d,
+	0x5fc: 0x000d, 0x5fd: 0x000d, 0x5fe: 0x000d, 0x5ff: 0x000d,
+	// Block 0x18, offset 0x600
+	0x600: 0x000d, 0x601: 0x000d, 0x602: 0x000d, 0x603: 0x000d, 0x604: 0x000d, 0x605: 0x000d,
+	0x606: 0x000d, 0x607: 0x000d, 0x608: 0x000d, 0x609: 0x000d, 0x60a: 0x000d, 0x60b: 0x000d,
+	0x60c: 0x000d, 0x60d: 0x000d, 0x60e: 0x000d, 0x60f: 0x0001, 0x610: 0x0005, 0x611: 0x0005,
+	0x612: 0x0001, 0x613: 0x0001, 0x614: 0x0001, 0x615: 0x0001, 0x616: 0x0001, 0x617: 0x0001,
+	0x618: 0x000c, 0x619: 0x000c, 0x61a: 0x000c, 0x61b: 0x000c, 0x61c: 0x000c, 0x61d: 0x000c,
+	0x61e: 0x000c, 0x61f: 0x000c, 0x620: 0x000d, 0x621: 0x000d, 0x622: 0x000d, 0x623: 0x000d,
+	0x624: 0x000d, 0x625: 0x000d, 0x626: 0x000d, 0x627: 0x000d, 0x628: 0x000d, 0x629: 0x000d,
+	0x62a: 0x000d, 0x62b: 0x000d, 0x62c: 0x000d, 0x62d: 0x000d, 0x62e: 0x000d, 0x62f: 0x000d,
+	0x630: 0x000d, 0x631: 0x000d, 0x632: 0x000d, 0x633: 0x000d, 0x634: 0x000d, 0x635: 0x000d,
+	0x636: 0x000d, 0x637: 0x000d, 0x638: 0x000d, 0x639: 0x000d, 0x63a: 0x000d, 0x63b: 0x000d,
+	0x63c: 0x000d, 0x63d: 0x000d, 0x63e: 0x000d, 0x63f: 0x000d,
+	// Block 0x19, offset 0x640
+	0x640: 0x000d, 0x641: 0x000d, 0x642: 0x000d, 0x643: 0x000d, 0x644: 0x000d, 0x645: 0x000d,
+	0x646: 0x000d, 0x647: 0x000d, 0x648: 0x000d, 0x649: 0x000d, 0x64a: 0x000c, 0x64b: 0x000c,
+	0x64c: 0x000c, 0x64d: 0x000c, 0x64e: 0x000c, 0x64f: 0x000c, 0x650: 0x000c, 0x651: 0x000c,
+	0x652: 0x000c, 0x653: 0x000c, 0x654: 0x000c, 0x655: 0x000c, 0x656: 0x000c, 0x657: 0x000c,
+	0x658: 0x000c, 0x659: 0x000c, 0x65a: 0x000c, 0x65b: 0x000c, 0x65c: 0x000c, 0x65d: 0x000c,
+	0x65e: 0x000c, 0x65f: 0x000c, 0x660: 0x000c, 0x661: 0x000c, 0x662: 0x0005, 0x663: 0x000c,
+	0x664: 0x000c, 0x665: 0x000c, 0x666: 0x000c, 0x667: 0x000c, 0x668: 0x000c, 0x669: 0x000c,
+	0x66a: 0x000c, 0x66b: 0x000c, 0x66c: 0x000c, 0x66d: 0x000c, 0x66e: 0x000c, 0x66f: 0x000c,
+	0x670: 0x000c, 0x671: 0x000c, 0x672: 0x000c, 0x673: 0x000c, 0x674: 0x000c, 0x675: 0x000c,
+	0x676: 0x000c, 0x677: 0x000c, 0x678: 0x000c, 0x679: 0x000c, 0x67a: 0x000c, 0x67b: 0x000c,
+	0x67c: 0x000c, 0x67d: 0x000c, 0x67e: 0x000c, 0x67f: 0x000c,
+	// Block 0x1a, offset 0x680
+	0x680: 0x000c, 0x681: 0x000c, 0x682: 0x000c,
+	0x6ba: 0x000c,
+	0x6bc: 0x000c,
+	// Block 0x1b, offset 0x6c0
+	0x6c1: 0x000c, 0x6c2: 0x000c, 0x6c3: 0x000c, 0x6c4: 0x000c, 0x6c5: 0x000c,
+	0x6c6: 0x000c, 0x6c7: 0x000c, 0x6c8: 0x000c,
+	0x6cd: 0x000c, 0x6d1: 0x000c,
+	0x6d2: 0x000c, 0x6d3: 0x000c, 0x6d4: 0x000c, 0x6d5: 0x000c, 0x6d6: 0x000c, 0x6d7: 0x000c,
+	0x6e2: 0x000c, 0x6e3: 0x000c,
+	// Block 0x1c, offset 0x700
+	0x701: 0x000c,
+	0x73c: 0x000c,
+	// Block 0x1d, offset 0x740
+	0x741: 0x000c, 0x742: 0x000c, 0x743: 0x000c, 0x744: 0x000c,
+	0x74d: 0x000c,
+	0x762: 0x000c, 0x763: 0x000c,
+	0x772: 0x0004, 0x773: 0x0004,
+	0x77b: 0x0004,
+	0x77e: 0x000c,
+	// Block 0x1e, offset 0x780
+	0x781: 0x000c, 0x782: 0x000c,
+	0x7bc: 0x000c,
+	// Block 0x1f, offset 0x7c0
+	0x7c1: 0x000c, 0x7c2: 0x000c,
+	0x7c7: 0x000c, 0x7c8: 0x000c, 0x7cb: 0x000c,
+	0x7cc: 0x000c, 0x7cd: 0x000c, 0x7d1: 0x000c,
+	0x7f0: 0x000c, 0x7f1: 0x000c, 0x7f5: 0x000c,
+	// Block 0x20, offset 0x800
+	0x801: 0x000c, 0x802: 0x000c, 0x803: 0x000c, 0x804: 0x000c, 0x805: 0x000c,
+	0x807: 0x000c, 0x808: 0x000c,
+	0x80d: 0x000c,
+	0x822: 0x000c, 0x823: 0x000c,
+	0x831: 0x0004,
+	0x83a: 0x000c, 0x83b: 0x000c,
+	0x83c: 0x000c, 0x83d: 0x000c, 0x83e: 0x000c, 0x83f: 0x000c,
+	// Block 0x21, offset 0x840
+	0x841: 0x000c,
+	0x87c: 0x000c, 0x87f: 0x000c,
+	// Block 0x22, offset 0x880
+	0x881: 0x000c, 0x882: 0x000c, 0x883: 0x000c, 0x884: 0x000c,
+	0x88d: 0x000c,
+	0x895: 0x000c, 0x896: 0x000c,
+	0x8a2: 0x000c, 0x8a3: 0x000c,
+	// Block 0x23, offset 0x8c0
+	0x8c2: 0x000c,
+	// Block 0x24, offset 0x900
+	0x900: 0x000c,
+	0x90d: 0x000c,
+	0x933: 0x000a, 0x934: 0x000a, 0x935: 0x000a,
+	0x936: 0x000a, 0x937: 0x000a, 0x938: 0x000a, 0x939: 0x0004, 0x93a: 0x000a,
+	// Block 0x25, offset 0x940
+	0x940: 0x000c, 0x944: 0x000c,
+	0x97c: 0x000c, 0x97e: 0x000c, 0x97f: 0x000c,
+	// Block 0x26, offset 0x980
+	0x980: 0x000c,
+	0x986: 0x000c, 0x987: 0x000c, 0x988: 0x000c, 0x98a: 0x000c, 0x98b: 0x000c,
+	0x98c: 0x000c, 0x98d: 0x000c,
+	0x995: 0x000c, 0x996: 0x000c,
+	0x9a2: 0x000c, 0x9a3: 0x000c,
+	0x9b8: 0x000a, 0x9b9: 0x000a, 0x9ba: 0x000a, 0x9bb: 0x000a,
+	0x9bc: 0x000a, 0x9bd: 0x000a, 0x9be: 0x000a,
+	// Block 0x27, offset 0x9c0
+	0x9cc: 0x000c, 0x9cd: 0x000c,
+	0x9e2: 0x000c, 0x9e3: 0x000c,
+	// Block 0x28, offset 0xa00
+	0xa00: 0x000c, 0xa01: 0x000c,
+	0xa3b: 0x000c,
+	0xa3c: 0x000c,
+	// Block 0x29, offset 0xa40
+	0xa41: 0x000c, 0xa42: 0x000c, 0xa43: 0x000c, 0xa44: 0x000c,
+	0xa4d: 0x000c,
+	0xa62: 0x000c, 0xa63: 0x000c,
+	// Block 0x2a, offset 0xa80
+	0xa81: 0x000c,
+	// Block 0x2b, offset 0xac0
+	0xaca: 0x000c,
+	0xad2: 0x000c, 0xad3: 0x000c, 0xad4: 0x000c, 0xad6: 0x000c,
+	// Block 0x2c, offset 0xb00
+	0xb31: 0x000c, 0xb34: 0x000c, 0xb35: 0x000c,
+	0xb36: 0x000c, 0xb37: 0x000c, 0xb38: 0x000c, 0xb39: 0x000c, 0xb3a: 0x000c,
+	0xb3f: 0x0004,
+	// Block 0x2d, offset 0xb40
+	0xb47: 0x000c, 0xb48: 0x000c, 0xb49: 0x000c, 0xb4a: 0x000c, 0xb4b: 0x000c,
+	0xb4c: 0x000c, 0xb4d: 0x000c, 0xb4e: 0x000c,
+	// Block 0x2e, offset 0xb80
+	0xbb1: 0x000c, 0xbb4: 0x000c, 0xbb5: 0x000c,
+	0xbb6: 0x000c, 0xbb7: 0x000c, 0xbb8: 0x000c, 0xbb9: 0x000c, 0xbba: 0x000c, 0xbbb: 0x000c,
+	0xbbc: 0x000c,
+	// Block 0x2f, offset 0xbc0
+	0xbc8: 0x000c, 0xbc9: 0x000c, 0xbca: 0x000c, 0xbcb: 0x000c,
+	0xbcc: 0x000c, 0xbcd: 0x000c, 0xbce: 0x000c,
+	// Block 0x30, offset 0xc00
+	0xc18: 0x000c, 0xc19: 0x000c,
+	0xc35: 0x000c,
+	0xc37: 0x000c, 0xc39: 0x000c, 0xc3a: 0x003a, 0xc3b: 0x002a,
+	0xc3c: 0x003a, 0xc3d: 0x002a,
+	// Block 0x31, offset 0xc40
+	0xc71: 0x000c, 0xc72: 0x000c, 0xc73: 0x000c, 0xc74: 0x000c, 0xc75: 0x000c,
+	0xc76: 0x000c, 0xc77: 0x000c, 0xc78: 0x000c, 0xc79: 0x000c, 0xc7a: 0x000c, 0xc7b: 0x000c,
+	0xc7c: 0x000c, 0xc7d: 0x000c, 0xc7e: 0x000c,
+	// Block 0x32, offset 0xc80
+	0xc80: 0x000c, 0xc81: 0x000c, 0xc82: 0x000c, 0xc83: 0x000c, 0xc84: 0x000c,
+	0xc86: 0x000c, 0xc87: 0x000c,
+	0xc8d: 0x000c, 0xc8e: 0x000c, 0xc8f: 0x000c, 0xc90: 0x000c, 0xc91: 0x000c,
+	0xc92: 0x000c, 0xc93: 0x000c, 0xc94: 0x000c, 0xc95: 0x000c, 0xc96: 0x000c, 0xc97: 0x000c,
+	0xc99: 0x000c, 0xc9a: 0x000c, 0xc9b: 0x000c, 0xc9c: 0x000c, 0xc9d: 0x000c,
+	0xc9e: 0x000c, 0xc9f: 0x000c, 0xca0: 0x000c, 0xca1: 0x000c, 0xca2: 0x000c, 0xca3: 0x000c,
+	0xca4: 0x000c, 0xca5: 0x000c, 0xca6: 0x000c, 0xca7: 0x000c, 0xca8: 0x000c, 0xca9: 0x000c,
+	0xcaa: 0x000c, 0xcab: 0x000c, 0xcac: 0x000c, 0xcad: 0x000c, 0xcae: 0x000c, 0xcaf: 0x000c,
+	0xcb0: 0x000c, 0xcb1: 0x000c, 0xcb2: 0x000c, 0xcb3: 0x000c, 0xcb4: 0x000c, 0xcb5: 0x000c,
+	0xcb6: 0x000c, 0xcb7: 0x000c, 0xcb8: 0x000c, 0xcb9: 0x000c, 0xcba: 0x000c, 0xcbb: 0x000c,
+	0xcbc: 0x000c,
+	// Block 0x33, offset 0xcc0
+	0xcc6: 0x000c,
+	// Block 0x34, offset 0xd00
+	0xd2d: 0x000c, 0xd2e: 0x000c, 0xd2f: 0x000c,
+	0xd30: 0x000c, 0xd32: 0x000c, 0xd33: 0x000c, 0xd34: 0x000c, 0xd35: 0x000c,
+	0xd36: 0x000c, 0xd37: 0x000c, 0xd39: 0x000c, 0xd3a: 0x000c,
+	0xd3d: 0x000c, 0xd3e: 0x000c,
+	// Block 0x35, offset 0xd40
+	0xd58: 0x000c, 0xd59: 0x000c,
+	0xd5e: 0x000c, 0xd5f: 0x000c, 0xd60: 0x000c,
+	0xd71: 0x000c, 0xd72: 0x000c, 0xd73: 0x000c, 0xd74: 0x000c,
+	// Block 0x36, offset 0xd80
+	0xd82: 0x000c, 0xd85: 0x000c,
+	0xd86: 0x000c,
+	0xd8d: 0x000c,
+	0xd9d: 0x000c,
+	// Block 0x37, offset 0xdc0
+	0xddd: 0x000c,
+	0xdde: 0x000c, 0xddf: 0x000c,
+	// Block 0x38, offset 0xe00
+	0xe10: 0x000a, 0xe11: 0x000a,
+	0xe12: 0x000a, 0xe13: 0x000a, 0xe14: 0x000a, 0xe15: 0x000a, 0xe16: 0x000a, 0xe17: 0x000a,
+	0xe18: 0x000a, 0xe19: 0x000a,
+	// Block 0x39, offset 0xe40
+	0xe40: 0x000a,
+	// Block 0x3a, offset 0xe80
+	0xe80: 0x0009,
+	0xe9b: 0x007a, 0xe9c: 0x006a,
+	// Block 0x3b, offset 0xec0
+	0xed2: 0x000c, 0xed3: 0x000c, 0xed4: 0x000c,
+	0xef2: 0x000c, 0xef3: 0x000c,
+	// Block 0x3c, offset 0xf00
+	0xf12: 0x000c, 0xf13: 0x000c,
+	0xf32: 0x000c, 0xf33: 0x000c,
+	// Block 0x3d, offset 0xf40
+	0xf74: 0x000c, 0xf75: 0x000c,
+	0xf77: 0x000c, 0xf78: 0x000c, 0xf79: 0x000c, 0xf7a: 0x000c, 0xf7b: 0x000c,
+	0xf7c: 0x000c, 0xf7d: 0x000c,
+	// Block 0x3e, offset 0xf80
+	0xf86: 0x000c, 0xf89: 0x000c, 0xf8a: 0x000c, 0xf8b: 0x000c,
+	0xf8c: 0x000c, 0xf8d: 0x000c, 0xf8e: 0x000c, 0xf8f: 0x000c, 0xf90: 0x000c, 0xf91: 0x000c,
+	0xf92: 0x000c, 0xf93: 0x000c,
+	0xf9b: 0x0004, 0xf9d: 0x000c,
+	0xfb0: 0x000a, 0xfb1: 0x000a, 0xfb2: 0x000a, 0xfb3: 0x000a, 0xfb4: 0x000a, 0xfb5: 0x000a,
+	0xfb6: 0x000a, 0xfb7: 0x000a, 0xfb8: 0x000a, 0xfb9: 0x000a,
+	// Block 0x3f, offset 0xfc0
+	0xfc0: 0x000a, 0xfc1: 0x000a, 0xfc2: 0x000a, 0xfc3: 0x000a, 0xfc4: 0x000a, 0xfc5: 0x000a,
+	0xfc6: 0x000a, 0xfc7: 0x000a, 0xfc8: 0x000a, 0xfc9: 0x000a, 0xfca: 0x000a, 0xfcb: 0x000c,
+	0xfcc: 0x000c, 0xfcd: 0x000c, 0xfce: 0x000b, 0xfcf: 0x000c,
+	// Block 0x40, offset 0x1000
+	0x1005: 0x000c,
+	0x1006: 0x000c,
+	0x1029: 0x000c,
+	// Block 0x41, offset 0x1040
+	0x1060: 0x000c, 0x1061: 0x000c, 0x1062: 0x000c,
+	0x1067: 0x000c, 0x1068: 0x000c,
+	0x1072: 0x000c,
+	0x1079: 0x000c, 0x107a: 0x000c, 0x107b: 0x000c,
+	// Block 0x42, offset 0x1080
+	0x1080: 0x000a, 0x1084: 0x000a, 0x1085: 0x000a,
+	// Block 0x43, offset 0x10c0
+	0x10de: 0x000a, 0x10df: 0x000a, 0x10e0: 0x000a, 0x10e1: 0x000a, 0x10e2: 0x000a, 0x10e3: 0x000a,
+	0x10e4: 0x000a, 0x10e5: 0x000a, 0x10e6: 0x000a, 0x10e7: 0x000a, 0x10e8: 0x000a, 0x10e9: 0x000a,
+	0x10ea: 0x000a, 0x10eb: 0x000a, 0x10ec: 0x000a, 0x10ed: 0x000a, 0x10ee: 0x000a, 0x10ef: 0x000a,
+	0x10f0: 0x000a, 0x10f1: 0x000a, 0x10f2: 0x000a, 0x10f3: 0x000a, 0x10f4: 0x000a, 0x10f5: 0x000a,
+	0x10f6: 0x000a, 0x10f7: 0x000a, 0x10f8: 0x000a, 0x10f9: 0x000a, 0x10fa: 0x000a, 0x10fb: 0x000a,
+	0x10fc: 0x000a, 0x10fd: 0x000a, 0x10fe: 0x000a, 0x10ff: 0x000a,
+	// Block 0x44, offset 0x1100
+	0x1117: 0x000c,
+	0x1118: 0x000c, 0x111b: 0x000c,
+	// Block 0x45, offset 0x1140
+	0x1156: 0x000c,
+	0x1158: 0x000c, 0x1159: 0x000c, 0x115a: 0x000c, 0x115b: 0x000c, 0x115c: 0x000c, 0x115d: 0x000c,
+	0x115e: 0x000c, 0x1160: 0x000c, 0x1162: 0x000c,
+	0x1165: 0x000c, 0x1166: 0x000c, 0x1167: 0x000c, 0x1168: 0x000c, 0x1169: 0x000c,
+	0x116a: 0x000c, 0x116b: 0x000c, 0x116c: 0x000c,
+	0x1173: 0x000c, 0x1174: 0x000c, 0x1175: 0x000c,
+	0x1176: 0x000c, 0x1177: 0x000c, 0x1178: 0x000c, 0x1179: 0x000c, 0x117a: 0x000c, 0x117b: 0x000c,
+	0x117c: 0x000c, 0x117f: 0x000c,
+	// Block 0x46, offset 0x1180
+	0x11b0: 0x000c, 0x11b1: 0x000c, 0x11b2: 0x000c, 0x11b3: 0x000c, 0x11b4: 0x000c, 0x11b5: 0x000c,
+	0x11b6: 0x000c, 0x11b7: 0x000c, 0x11b8: 0x000c, 0x11b9: 0x000c, 0x11ba: 0x000c, 0x11bb: 0x000c,
+	0x11bc: 0x000c, 0x11bd: 0x000c, 0x11be: 0x000c, 0x11bf: 0x000c,
+	// Block 0x47, offset 0x11c0
+	0x11c0: 0x000c, 0x11c1: 0x000c, 0x11c2: 0x000c, 0x11c3: 0x000c, 0x11c4: 0x000c, 0x11c5: 0x000c,
+	0x11c6: 0x000c, 0x11c7: 0x000c, 0x11c8: 0x000c, 0x11c9: 0x000c, 0x11ca: 0x000c, 0x11cb: 0x000c,
+	0x11cc: 0x000c, 0x11cd: 0x000c, 0x11ce: 0x000c,
+	// Block 0x48, offset 0x1200
+	0x1200: 0x000c, 0x1201: 0x000c, 0x1202: 0x000c, 0x1203: 0x000c,
+	0x1234: 0x000c,
+	0x1236: 0x000c, 0x1237: 0x000c, 0x1238: 0x000c, 0x1239: 0x000c, 0x123a: 0x000c,
+	0x123c: 0x000c,
+	// Block 0x49, offset 0x1240
+	0x1242: 0x000c,
+	0x126b: 0x000c, 0x126c: 0x000c, 0x126d: 0x000c, 0x126e: 0x000c, 0x126f: 0x000c,
+	0x1270: 0x000c, 0x1271: 0x000c, 0x1272: 0x000c, 0x1273: 0x000c,
+	// Block 0x4a, offset 0x1280
+	0x1280: 0x000c, 0x1281: 0x000c,
+	0x12a2: 0x000c, 0x12a3: 0x000c,
+	0x12a4: 0x000c, 0x12a5: 0x000c, 0x12a8: 0x000c, 0x12a9: 0x000c,
+	0x12ab: 0x000c, 0x12ac: 0x000c, 0x12ad: 0x000c,
+	// Block 0x4b, offset 0x12c0
+	0x12e6: 0x000c, 0x12e8: 0x000c, 0x12e9: 0x000c,
+	0x12ed: 0x000c, 0x12ef: 0x000c,
+	0x12f0: 0x000c, 0x12f1: 0x000c,
+	// Block 0x4c, offset 0x1300
+	0x132c: 0x000c, 0x132d: 0x000c, 0x132e: 0x000c, 0x132f: 0x000c,
+	0x1330: 0x000c, 0x1331: 0x000c, 0x1332: 0x000c, 0x1333: 0x000c,
+	0x1336: 0x000c, 0x1337: 0x000c,
+	// Block 0x4d, offset 0x1340
+	0x1350: 0x000c, 0x1351: 0x000c,
+	0x1352: 0x000c, 0x1354: 0x000c, 0x1355: 0x000c, 0x1356: 0x000c, 0x1357: 0x000c,
+	0x1358: 0x000c, 0x1359: 0x000c, 0x135a: 0x000c, 0x135b: 0x000c, 0x135c: 0x000c, 0x135d: 0x000c,
+	0x135e: 0x000c, 0x135f: 0x000c, 0x1360: 0x000c, 0x1362: 0x000c, 0x1363: 0x000c,
+	0x1364: 0x000c, 0x1365: 0x000c, 0x1366: 0x000c, 0x1367: 0x000c, 0x1368: 0x000c,
+	0x136d: 0x000c,
+	0x1374: 0x000c,
+	0x1378: 0x000c, 0x1379: 0x000c,
+	// Block 0x4e, offset 0x1380
+	0x13bd: 0x000a, 0x13bf: 0x000a,
+	// Block 0x4f, offset 0x13c0
+	0x13c0: 0x000a, 0x13c1: 0x000a,
+	0x13cd: 0x000a, 0x13ce: 0x000a, 0x13cf: 0x000a,
+	0x13dd: 0x000a,
+	0x13de: 0x000a, 0x13df: 0x000a,
+	0x13ed: 0x000a, 0x13ee: 0x000a, 0x13ef: 0x000a,
+	0x13fd: 0x000a, 0x13fe: 0x000a,
+	// Block 0x50, offset 0x1400
+	0x1400: 0x0009, 0x1401: 0x0009, 0x1402: 0x0009, 0x1403: 0x0009, 0x1404: 0x0009, 0x1405: 0x0009,
+	0x1406: 0x0009, 0x1407: 0x0009, 0x1408: 0x0009, 0x1409: 0x0009, 0x140a: 0x0009, 0x140b: 0x000b,
+	0x140c: 0x000b, 0x140d: 0x000b, 0x140f: 0x0001, 0x1410: 0x000a, 0x1411: 0x000a,
+	0x1412: 0x000a, 0x1413: 0x000a, 0x1414: 0x000a, 0x1415: 0x000a, 0x1416: 0x000a, 0x1417: 0x000a,
+	0x1418: 0x000a, 0x1419: 0x000a, 0x141a: 0x000a, 0x141b: 0x000a, 0x141c: 0x000a, 0x141d: 0x000a,
+	0x141e: 0x000a, 0x141f: 0x000a, 0x1420: 0x000a, 0x1421: 0x000a, 0x1422: 0x000a, 0x1423: 0x000a,
+	0x1424: 0x000a, 0x1425: 0x000a, 0x1426: 0x000a, 0x1427: 0x000a, 0x1428: 0x0009, 0x1429: 0x0007,
+	0x142a: 0x000e, 0x142b: 0x000e, 0x142c: 0x000e, 0x142d: 0x000e, 0x142e: 0x000e, 0x142f: 0x0006,
+	0x1430: 0x0004, 0x1431: 0x0004, 0x1432: 0x0004, 0x1433: 0x0004, 0x1434: 0x0004, 0x1435: 0x000a,
+	0x1436: 0x000a, 0x1437: 0x000a, 0x1438: 0x000a, 0x1439: 0x000a, 0x143a: 0x000a, 0x143b: 0x000a,
+	0x143c: 0x000a, 0x143d: 0x000a, 0x143e: 0x000a, 0x143f: 0x000a,
+	// Block 0x51, offset 0x1440
+	0x1440: 0x000a, 0x1441: 0x000a, 0x1442: 0x000a, 0x1443: 0x000a, 0x1444: 0x0006, 0x1445: 0x009a,
+	0x1446: 0x008a, 0x1447: 0x000a, 0x1448: 0x000a, 0x1449: 0x000a, 0x144a: 0x000a, 0x144b: 0x000a,
+	0x144c: 0x000a, 0x144d: 0x000a, 0x144e: 0x000a, 0x144f: 0x000a, 0x1450: 0x000a, 0x1451: 0x000a,
+	0x1452: 0x000a, 0x1453: 0x000a, 0x1454: 0x000a, 0x1455: 0x000a, 0x1456: 0x000a, 0x1457: 0x000a,
+	0x1458: 0x000a, 0x1459: 0x000a, 0x145a: 0x000a, 0x145b: 0x000a, 0x145c: 0x000a, 0x145d: 0x000a,
+	0x145e: 0x000a, 0x145f: 0x0009, 0x1460: 0x000b, 0x1461: 0x000b, 0x1462: 0x000b, 0x1463: 0x000b,
+	0x1464: 0x000b, 0x1465: 0x000b, 0x1466: 0x000e, 0x1467: 0x000e, 0x1468: 0x000e, 0x1469: 0x000e,
+	0x146a: 0x000b, 0x146b: 0x000b, 0x146c: 0x000b, 0x146d: 0x000b, 0x146e: 0x000b, 0x146f: 0x000b,
+	0x1470: 0x0002, 0x1474: 0x0002, 0x1475: 0x0002,
+	0x1476: 0x0002, 0x1477: 0x0002, 0x1478: 0x0002, 0x1479: 0x0002, 0x147a: 0x0003, 0x147b: 0x0003,
+	0x147c: 0x000a, 0x147d: 0x009a, 0x147e: 0x008a,
+	// Block 0x52, offset 0x1480
+	0x1480: 0x0002, 0x1481: 0x0002, 0x1482: 0x0002, 0x1483: 0x0002, 0x1484: 0x0002, 0x1485: 0x0002,
+	0x1486: 0x0002, 0x1487: 0x0002, 0x1488: 0x0002, 0x1489: 0x0002, 0x148a: 0x0003, 0x148b: 0x0003,
+	0x148c: 0x000a, 0x148d: 0x009a, 0x148e: 0x008a,
+	0x14a0: 0x0004, 0x14a1: 0x0004, 0x14a2: 0x0004, 0x14a3: 0x0004,
+	0x14a4: 0x0004, 0x14a5: 0x0004, 0x14a6: 0x0004, 0x14a7: 0x0004, 0x14a8: 0x0004, 0x14a9: 0x0004,
+	0x14aa: 0x0004, 0x14ab: 0x0004, 0x14ac: 0x0004, 0x14ad: 0x0004, 0x14ae: 0x0004, 0x14af: 0x0004,
+	0x14b0: 0x0004, 0x14b1: 0x0004, 0x14b2: 0x0004, 0x14b3: 0x0004, 0x14b4: 0x0004, 0x14b5: 0x0004,
+	0x14b6: 0x0004, 0x14b7: 0x0004, 0x14b8: 0x0004, 0x14b9: 0x0004, 0x14ba: 0x0004, 0x14bb: 0x0004,
+	0x14bc: 0x0004, 0x14bd: 0x0004, 0x14be: 0x0004, 0x14bf: 0x0004,
+	// Block 0x53, offset 0x14c0
+	0x14c0: 0x0004, 0x14c1: 0x0004, 0x14c2: 0x0004, 0x14c3: 0x0004, 0x14c4: 0x0004, 0x14c5: 0x0004,
+	0x14c6: 0x0004, 0x14c7: 0x0004, 0x14c8: 0x0004, 0x14c9: 0x0004, 0x14ca: 0x0004, 0x14cb: 0x0004,
+	0x14cc: 0x0004, 0x14cd: 0x0004, 0x14ce: 0x0004, 0x14cf: 0x0004, 0x14d0: 0x000c, 0x14d1: 0x000c,
+	0x14d2: 0x000c, 0x14d3: 0x000c, 0x14d4: 0x000c, 0x14d5: 0x000c, 0x14d6: 0x000c, 0x14d7: 0x000c,
+	0x14d8: 0x000c, 0x14d9: 0x000c, 0x14da: 0x000c, 0x14db: 0x000c, 0x14dc: 0x000c, 0x14dd: 0x000c,
+	0x14de: 0x000c, 0x14df: 0x000c, 0x14e0: 0x000c, 0x14e1: 0x000c, 0x14e2: 0x000c, 0x14e3: 0x000c,
+	0x14e4: 0x000c, 0x14e5: 0x000c, 0x14e6: 0x000c, 0x14e7: 0x000c, 0x14e8: 0x000c, 0x14e9: 0x000c,
+	0x14ea: 0x000c, 0x14eb: 0x000c, 0x14ec: 0x000c, 0x14ed: 0x000c, 0x14ee: 0x000c, 0x14ef: 0x000c,
+	0x14f0: 0x000c,
+	// Block 0x54, offset 0x1500
+	0x1500: 0x000a, 0x1501: 0x000a, 0x1503: 0x000a, 0x1504: 0x000a, 0x1505: 0x000a,
+	0x1506: 0x000a, 0x1508: 0x000a, 0x1509: 0x000a,
+	0x1514: 0x000a, 0x1516: 0x000a, 0x1517: 0x000a,
+	0x1518: 0x000a,
+	0x151e: 0x000a, 0x151f: 0x000a, 0x1520: 0x000a, 0x1521: 0x000a, 0x1522: 0x000a, 0x1523: 0x000a,
+	0x1525: 0x000a, 0x1527: 0x000a, 0x1529: 0x000a,
+	0x152e: 0x0004,
+	0x153a: 0x000a, 0x153b: 0x000a,
+	// Block 0x55, offset 0x1540
+	0x1540: 0x000a, 0x1541: 0x000a, 0x1542: 0x000a, 0x1543: 0x000a, 0x1544: 0x000a,
+	0x154a: 0x000a, 0x154b: 0x000a,
+	0x154c: 0x000a, 0x154d: 0x000a, 0x1550: 0x000a, 0x1551: 0x000a,
+	0x1552: 0x000a, 0x1553: 0x000a, 0x1554: 0x000a, 0x1555: 0x000a, 0x1556: 0x000a, 0x1557: 0x000a,
+	0x1558: 0x000a, 0x1559: 0x000a, 0x155a: 0x000a, 0x155b: 0x000a, 0x155c: 0x000a, 0x155d: 0x000a,
+	0x155e: 0x000a, 0x155f: 0x000a,
+	// Block 0x56, offset 0x1580
+	0x1589: 0x000a, 0x158a: 0x000a, 0x158b: 0x000a,
+	0x1590: 0x000a, 0x1591: 0x000a,
+	0x1592: 0x000a, 0x1593: 0x000a, 0x1594: 0x000a, 0x1595: 0x000a, 0x1596: 0x000a, 0x1597: 0x000a,
+	0x1598: 0x000a, 0x1599: 0x000a, 0x159a: 0x000a, 0x159b: 0x000a, 0x159c: 0x000a, 0x159d: 0x000a,
+	0x159e: 0x000a, 0x159f: 0x000a, 0x15a0: 0x000a, 0x15a1: 0x000a, 0x15a2: 0x000a, 0x15a3: 0x000a,
+	0x15a4: 0x000a, 0x15a5: 0x000a, 0x15a6: 0x000a, 0x15a7: 0x000a, 0x15a8: 0x000a, 0x15a9: 0x000a,
+	0x15aa: 0x000a, 0x15ab: 0x000a, 0x15ac: 0x000a, 0x15ad: 0x000a, 0x15ae: 0x000a, 0x15af: 0x000a,
+	0x15b0: 0x000a, 0x15b1: 0x000a, 0x15b2: 0x000a, 0x15b3: 0x000a, 0x15b4: 0x000a, 0x15b5: 0x000a,
+	0x15b6: 0x000a, 0x15b7: 0x000a, 0x15b8: 0x000a, 0x15b9: 0x000a, 0x15ba: 0x000a, 0x15bb: 0x000a,
+	0x15bc: 0x000a, 0x15bd: 0x000a, 0x15be: 0x000a, 0x15bf: 0x000a,
+	// Block 0x57, offset 0x15c0
+	0x15c0: 0x000a, 0x15c1: 0x000a, 0x15c2: 0x000a, 0x15c3: 0x000a, 0x15c4: 0x000a, 0x15c5: 0x000a,
+	0x15c6: 0x000a, 0x15c7: 0x000a, 0x15c8: 0x000a, 0x15c9: 0x000a, 0x15ca: 0x000a, 0x15cb: 0x000a,
+	0x15cc: 0x000a, 0x15cd: 0x000a, 0x15ce: 0x000a, 0x15cf: 0x000a, 0x15d0: 0x000a, 0x15d1: 0x000a,
+	0x15d2: 0x000a, 0x15d3: 0x000a, 0x15d4: 0x000a, 0x15d5: 0x000a, 0x15d6: 0x000a, 0x15d7: 0x000a,
+	0x15d8: 0x000a, 0x15d9: 0x000a, 0x15da: 0x000a, 0x15db: 0x000a, 0x15dc: 0x000a, 0x15dd: 0x000a,
+	0x15de: 0x000a, 0x15df: 0x000a, 0x15e0: 0x000a, 0x15e1: 0x000a, 0x15e2: 0x000a, 0x15e3: 0x000a,
+	0x15e4: 0x000a, 0x15e5: 0x000a, 0x15e6: 0x000a, 0x15e7: 0x000a, 0x15e8: 0x000a, 0x15e9: 0x000a,
+	0x15ea: 0x000a, 0x15eb: 0x000a, 0x15ec: 0x000a, 0x15ed: 0x000a, 0x15ee: 0x000a, 0x15ef: 0x000a,
+	0x15f0: 0x000a, 0x15f1: 0x000a, 0x15f2: 0x000a, 0x15f3: 0x000a, 0x15f4: 0x000a, 0x15f5: 0x000a,
+	0x15f6: 0x000a, 0x15f7: 0x000a, 0x15f8: 0x000a, 0x15f9: 0x000a, 0x15fa: 0x000a, 0x15fb: 0x000a,
+	0x15fc: 0x000a, 0x15fd: 0x000a, 0x15fe: 0x000a, 0x15ff: 0x000a,
+	// Block 0x58, offset 0x1600
+	0x1600: 0x000a, 0x1601: 0x000a, 0x1602: 0x000a, 0x1603: 0x000a, 0x1604: 0x000a, 0x1605: 0x000a,
+	0x1606: 0x000a, 0x1607: 0x000a, 0x1608: 0x000a, 0x1609: 0x000a, 0x160a: 0x000a, 0x160b: 0x000a,
+	0x160c: 0x000a, 0x160d: 0x000a, 0x160e: 0x000a, 0x160f: 0x000a, 0x1610: 0x000a, 0x1611: 0x000a,
+	0x1612: 0x0003, 0x1613: 0x0004, 0x1614: 0x000a, 0x1615: 0x000a, 0x1616: 0x000a, 0x1617: 0x000a,
+	0x1618: 0x000a, 0x1619: 0x000a, 0x161a: 0x000a, 0x161b: 0x000a, 0x161c: 0x000a, 0x161d: 0x000a,
+	0x161e: 0x000a, 0x161f: 0x000a, 0x1620: 0x000a, 0x1621: 0x000a, 0x1622: 0x000a, 0x1623: 0x000a,
+	0x1624: 0x000a, 0x1625: 0x000a, 0x1626: 0x000a, 0x1627: 0x000a, 0x1628: 0x000a, 0x1629: 0x000a,
+	0x162a: 0x000a, 0x162b: 0x000a, 0x162c: 0x000a, 0x162d: 0x000a, 0x162e: 0x000a, 0x162f: 0x000a,
+	0x1630: 0x000a, 0x1631: 0x000a, 0x1632: 0x000a, 0x1633: 0x000a, 0x1634: 0x000a, 0x1635: 0x000a,
+	0x1636: 0x000a, 0x1637: 0x000a, 0x1638: 0x000a, 0x1639: 0x000a, 0x163a: 0x000a, 0x163b: 0x000a,
+	0x163c: 0x000a, 0x163d: 0x000a, 0x163e: 0x000a, 0x163f: 0x000a,
+	// Block 0x59, offset 0x1640
+	0x1640: 0x000a, 0x1641: 0x000a, 0x1642: 0x000a, 0x1643: 0x000a, 0x1644: 0x000a, 0x1645: 0x000a,
+	0x1646: 0x000a, 0x1647: 0x000a, 0x1648: 0x003a, 0x1649: 0x002a, 0x164a: 0x003a, 0x164b: 0x002a,
+	0x164c: 0x000a, 0x164d: 0x000a, 0x164e: 0x000a, 0x164f: 0x000a, 0x1650: 0x000a, 0x1651: 0x000a,
+	0x1652: 0x000a, 0x1653: 0x000a, 0x1654: 0x000a, 0x1655: 0x000a, 0x1656: 0x000a, 0x1657: 0x000a,
+	0x1658: 0x000a, 0x1659: 0x000a, 0x165a: 0x000a, 0x165b: 0x000a, 0x165c: 0x000a, 0x165d: 0x000a,
+	0x165e: 0x000a, 0x165f: 0x000a, 0x1660: 0x000a, 0x1661: 0x000a, 0x1662: 0x000a, 0x1663: 0x000a,
+	0x1664: 0x000a, 0x1665: 0x000a, 0x1666: 0x000a, 0x1667: 0x000a, 0x1668: 0x000a, 0x1669: 0x009a,
+	0x166a: 0x008a, 0x166b: 0x000a, 0x166c: 0x000a, 0x166d: 0x000a, 0x166e: 0x000a, 0x166f: 0x000a,
+	0x1670: 0x000a, 0x1671: 0x000a, 0x1672: 0x000a, 0x1673: 0x000a, 0x1674: 0x000a, 0x1675: 0x000a,
+	// Block 0x5a, offset 0x1680
+	0x16bb: 0x000a,
+	0x16bc: 0x000a, 0x16bd: 0x000a, 0x16be: 0x000a, 0x16bf: 0x000a,
+	// Block 0x5b, offset 0x16c0
+	0x16c0: 0x000a, 0x16c1: 0x000a, 0x16c2: 0x000a, 0x16c3: 0x000a, 0x16c4: 0x000a, 0x16c5: 0x000a,
+	0x16c6: 0x000a, 0x16c7: 0x000a, 0x16c8: 0x000a, 0x16c9: 0x000a, 0x16ca: 0x000a, 0x16cb: 0x000a,
+	0x16cc: 0x000a, 0x16cd: 0x000a, 0x16ce: 0x000a, 0x16cf: 0x000a, 0x16d0: 0x000a, 0x16d1: 0x000a,
+	0x16d2: 0x000a, 0x16d3: 0x000a, 0x16d4: 0x000a, 0x16d6: 0x000a, 0x16d7: 0x000a,
+	0x16d8: 0x000a, 0x16d9: 0x000a, 0x16da: 0x000a, 0x16db: 0x000a, 0x16dc: 0x000a, 0x16dd: 0x000a,
+	0x16de: 0x000a, 0x16df: 0x000a, 0x16e0: 0x000a, 0x16e1: 0x000a, 0x16e2: 0x000a, 0x16e3: 0x000a,
+	0x16e4: 0x000a, 0x16e5: 0x000a, 0x16e6: 0x000a, 0x16e7: 0x000a, 0x16e8: 0x000a, 0x16e9: 0x000a,
+	0x16ea: 0x000a, 0x16eb: 0x000a, 0x16ec: 0x000a, 0x16ed: 0x000a, 0x16ee: 0x000a, 0x16ef: 0x000a,
+	0x16f0: 0x000a, 0x16f1: 0x000a, 0x16f2: 0x000a, 0x16f3: 0x000a, 0x16f4: 0x000a, 0x16f5: 0x000a,
+	0x16f6: 0x000a, 0x16f7: 0x000a, 0x16f8: 0x000a, 0x16f9: 0x000a, 0x16fa: 0x000a, 0x16fb: 0x000a,
+	0x16fc: 0x000a, 0x16fd: 0x000a, 0x16fe: 0x000a, 0x16ff: 0x000a,
+	// Block 0x5c, offset 0x1700
+	0x1700: 0x000a, 0x1701: 0x000a, 0x1702: 0x000a, 0x1703: 0x000a, 0x1704: 0x000a, 0x1705: 0x000a,
+	0x1706: 0x000a, 0x1707: 0x000a, 0x1708: 0x000a, 0x1709: 0x000a, 0x170a: 0x000a, 0x170b: 0x000a,
+	0x170c: 0x000a, 0x170d: 0x000a, 0x170e: 0x000a, 0x170f: 0x000a, 0x1710: 0x000a, 0x1711: 0x000a,
+	0x1712: 0x000a, 0x1713: 0x000a, 0x1714: 0x000a, 0x1715: 0x000a, 0x1716: 0x000a, 0x1717: 0x000a,
+	0x1718: 0x000a, 0x1719: 0x000a, 0x171a: 0x000a, 0x171b: 0x000a, 0x171c: 0x000a, 0x171d: 0x000a,
+	0x171e: 0x000a, 0x171f: 0x000a, 0x1720: 0x000a, 0x1721: 0x000a, 0x1722: 0x000a, 0x1723: 0x000a,
+	0x1724: 0x000a, 0x1725: 0x000a, 0x1726: 0x000a,
+	// Block 0x5d, offset 0x1740
+	0x1740: 0x000a, 0x1741: 0x000a, 0x1742: 0x000a, 0x1743: 0x000a, 0x1744: 0x000a, 0x1745: 0x000a,
+	0x1746: 0x000a, 0x1747: 0x000a, 0x1748: 0x000a, 0x1749: 0x000a, 0x174a: 0x000a,
+	0x1760: 0x000a, 0x1761: 0x000a, 0x1762: 0x000a, 0x1763: 0x000a,
+	0x1764: 0x000a, 0x1765: 0x000a, 0x1766: 0x000a, 0x1767: 0x000a, 0x1768: 0x000a, 0x1769: 0x000a,
+	0x176a: 0x000a, 0x176b: 0x000a, 0x176c: 0x000a, 0x176d: 0x000a, 0x176e: 0x000a, 0x176f: 0x000a,
+	0x1770: 0x000a, 0x1771: 0x000a, 0x1772: 0x000a, 0x1773: 0x000a, 0x1774: 0x000a, 0x1775: 0x000a,
+	0x1776: 0x000a, 0x1777: 0x000a, 0x1778: 0x000a, 0x1779: 0x000a, 0x177a: 0x000a, 0x177b: 0x000a,
+	0x177c: 0x000a, 0x177d: 0x000a, 0x177e: 0x000a, 0x177f: 0x000a,
+	// Block 0x5e, offset 0x1780
+	0x1780: 0x000a, 0x1781: 0x000a, 0x1782: 0x000a, 0x1783: 0x000a, 0x1784: 0x000a, 0x1785: 0x000a,
+	0x1786: 0x000a, 0x1787: 0x000a, 0x1788: 0x0002, 0x1789: 0x0002, 0x178a: 0x0002, 0x178b: 0x0002,
+	0x178c: 0x0002, 0x178d: 0x0002, 0x178e: 0x0002, 0x178f: 0x0002, 0x1790: 0x0002, 0x1791: 0x0002,
+	0x1792: 0x0002, 0x1793: 0x0002, 0x1794: 0x0002, 0x1795: 0x0002, 0x1796: 0x0002, 0x1797: 0x0002,
+	0x1798: 0x0002, 0x1799: 0x0002, 0x179a: 0x0002, 0x179b: 0x0002,
+	// Block 0x5f, offset 0x17c0
+	0x17ea: 0x000a, 0x17eb: 0x000a, 0x17ec: 0x000a, 0x17ed: 0x000a, 0x17ee: 0x000a, 0x17ef: 0x000a,
+	0x17f0: 0x000a, 0x17f1: 0x000a, 0x17f2: 0x000a, 0x17f3: 0x000a, 0x17f4: 0x000a, 0x17f5: 0x000a,
+	0x17f6: 0x000a, 0x17f7: 0x000a, 0x17f8: 0x000a, 0x17f9: 0x000a, 0x17fa: 0x000a, 0x17fb: 0x000a,
+	0x17fc: 0x000a, 0x17fd: 0x000a, 0x17fe: 0x000a, 0x17ff: 0x000a,
+	// Block 0x60, offset 0x1800
+	0x1800: 0x000a, 0x1801: 0x000a, 0x1802: 0x000a, 0x1803: 0x000a, 0x1804: 0x000a, 0x1805: 0x000a,
+	0x1806: 0x000a, 0x1807: 0x000a, 0x1808: 0x000a, 0x1809: 0x000a, 0x180a: 0x000a, 0x180b: 0x000a,
+	0x180c: 0x000a, 0x180d: 0x000a, 0x180e: 0x000a, 0x180f: 0x000a, 0x1810: 0x000a, 0x1811: 0x000a,
+	0x1812: 0x000a, 0x1813: 0x000a, 0x1814: 0x000a, 0x1815: 0x000a, 0x1816: 0x000a, 0x1817: 0x000a,
+	0x1818: 0x000a, 0x1819: 0x000a, 0x181a: 0x000a, 0x181b: 0x000a, 0x181c: 0x000a, 0x181d: 0x000a,
+	0x181e: 0x000a, 0x181f: 0x000a, 0x1820: 0x000a, 0x1821: 0x000a, 0x1822: 0x000a, 0x1823: 0x000a,
+	0x1824: 0x000a, 0x1825: 0x000a, 0x1826: 0x000a, 0x1827: 0x000a, 0x1828: 0x000a, 0x1829: 0x000a,
+	0x182a: 0x000a, 0x182b: 0x000a, 0x182d: 0x000a, 0x182e: 0x000a, 0x182f: 0x000a,
+	0x1830: 0x000a, 0x1831: 0x000a, 0x1832: 0x000a, 0x1833: 0x000a, 0x1834: 0x000a, 0x1835: 0x000a,
+	0x1836: 0x000a, 0x1837: 0x000a, 0x1838: 0x000a, 0x1839: 0x000a, 0x183a: 0x000a, 0x183b: 0x000a,
+	0x183c: 0x000a, 0x183d: 0x000a, 0x183e: 0x000a, 0x183f: 0x000a,
+	// Block 0x61, offset 0x1840
+	0x1840: 0x000a, 0x1841: 0x000a, 0x1842: 0x000a, 0x1843: 0x000a, 0x1844: 0x000a, 0x1845: 0x000a,
+	0x1846: 0x000a, 0x1847: 0x000a, 0x1848: 0x000a, 0x1849: 0x000a, 0x184a: 0x000a, 0x184b: 0x000a,
+	0x184c: 0x000a, 0x184d: 0x000a, 0x184e: 0x000a, 0x184f: 0x000a, 0x1850: 0x000a, 0x1851: 0x000a,
+	0x1852: 0x000a, 0x1853: 0x000a, 0x1854: 0x000a, 0x1855: 0x000a, 0x1856: 0x000a, 0x1857: 0x000a,
+	0x1858: 0x000a, 0x1859: 0x000a, 0x185a: 0x000a, 0x185b: 0x000a, 0x185c: 0x000a, 0x185d: 0x000a,
+	0x185e: 0x000a, 0x185f: 0x000a, 0x1860: 0x000a, 0x1861: 0x000a, 0x1862: 0x000a, 0x1863: 0x000a,
+	0x1864: 0x000a, 0x1865: 0x000a, 0x1866: 0x000a, 0x1867: 0x000a, 0x1868: 0x003a, 0x1869: 0x002a,
+	0x186a: 0x003a, 0x186b: 0x002a, 0x186c: 0x003a, 0x186d: 0x002a, 0x186e: 0x003a, 0x186f: 0x002a,
+	0x1870: 0x003a, 0x1871: 0x002a, 0x1872: 0x003a, 0x1873: 0x002a, 0x1874: 0x003a, 0x1875: 0x002a,
+	0x1876: 0x000a, 0x1877: 0x000a, 0x1878: 0x000a, 0x1879: 0x000a, 0x187a: 0x000a, 0x187b: 0x000a,
+	0x187c: 0x000a, 0x187d: 0x000a, 0x187e: 0x000a, 0x187f: 0x000a,
+	// Block 0x62, offset 0x1880
+	0x1880: 0x000a, 0x1881: 0x000a, 0x1882: 0x000a, 0x1883: 0x000a, 0x1884: 0x000a, 0x1885: 0x009a,
+	0x1886: 0x008a, 0x1887: 0x000a, 0x1888: 0x000a, 0x1889: 0x000a, 0x188a: 0x000a, 0x188b: 0x000a,
+	0x188c: 0x000a, 0x188d: 0x000a, 0x188e: 0x000a, 0x188f: 0x000a, 0x1890: 0x000a, 0x1891: 0x000a,
+	0x1892: 0x000a, 0x1893: 0x000a, 0x1894: 0x000a, 0x1895: 0x000a, 0x1896: 0x000a, 0x1897: 0x000a,
+	0x1898: 0x000a, 0x1899: 0x000a, 0x189a: 0x000a, 0x189b: 0x000a, 0x189c: 0x000a, 0x189d: 0x000a,
+	0x189e: 0x000a, 0x189f: 0x000a, 0x18a0: 0x000a, 0x18a1: 0x000a, 0x18a2: 0x000a, 0x18a3: 0x000a,
+	0x18a4: 0x000a, 0x18a5: 0x000a, 0x18a6: 0x003a, 0x18a7: 0x002a, 0x18a8: 0x003a, 0x18a9: 0x002a,
+	0x18aa: 0x003a, 0x18ab: 0x002a, 0x18ac: 0x003a, 0x18ad: 0x002a, 0x18ae: 0x003a, 0x18af: 0x002a,
+	0x18b0: 0x000a, 0x18b1: 0x000a, 0x18b2: 0x000a, 0x18b3: 0x000a, 0x18b4: 0x000a, 0x18b5: 0x000a,
+	0x18b6: 0x000a, 0x18b7: 0x000a, 0x18b8: 0x000a, 0x18b9: 0x000a, 0x18ba: 0x000a, 0x18bb: 0x000a,
+	0x18bc: 0x000a, 0x18bd: 0x000a, 0x18be: 0x000a, 0x18bf: 0x000a,
+	// Block 0x63, offset 0x18c0
+	0x18c0: 0x000a, 0x18c1: 0x000a, 0x18c2: 0x000a, 0x18c3: 0x007a, 0x18c4: 0x006a, 0x18c5: 0x009a,
+	0x18c6: 0x008a, 0x18c7: 0x00ba, 0x18c8: 0x00aa, 0x18c9: 0x009a, 0x18ca: 0x008a, 0x18cb: 0x007a,
+	0x18cc: 0x006a, 0x18cd: 0x00da, 0x18ce: 0x002a, 0x18cf: 0x003a, 0x18d0: 0x00ca, 0x18d1: 0x009a,
+	0x18d2: 0x008a, 0x18d3: 0x007a, 0x18d4: 0x006a, 0x18d5: 0x009a, 0x18d6: 0x008a, 0x18d7: 0x00ba,
+	0x18d8: 0x00aa, 0x18d9: 0x000a, 0x18da: 0x000a, 0x18db: 0x000a, 0x18dc: 0x000a, 0x18dd: 0x000a,
+	0x18de: 0x000a, 0x18df: 0x000a, 0x18e0: 0x000a, 0x18e1: 0x000a, 0x18e2: 0x000a, 0x18e3: 0x000a,
+	0x18e4: 0x000a, 0x18e5: 0x000a, 0x18e6: 0x000a, 0x18e7: 0x000a, 0x18e8: 0x000a, 0x18e9: 0x000a,
+	0x18ea: 0x000a, 0x18eb: 0x000a, 0x18ec: 0x000a, 0x18ed: 0x000a, 0x18ee: 0x000a, 0x18ef: 0x000a,
+	0x18f0: 0x000a, 0x18f1: 0x000a, 0x18f2: 0x000a, 0x18f3: 0x000a, 0x18f4: 0x000a, 0x18f5: 0x000a,
+	0x18f6: 0x000a, 0x18f7: 0x000a, 0x18f8: 0x000a, 0x18f9: 0x000a, 0x18fa: 0x000a, 0x18fb: 0x000a,
+	0x18fc: 0x000a, 0x18fd: 0x000a, 0x18fe: 0x000a, 0x18ff: 0x000a,
+	// Block 0x64, offset 0x1900
+	0x1900: 0x000a, 0x1901: 0x000a, 0x1902: 0x000a, 0x1903: 0x000a, 0x1904: 0x000a, 0x1905: 0x000a,
+	0x1906: 0x000a, 0x1907: 0x000a, 0x1908: 0x000a, 0x1909: 0x000a, 0x190a: 0x000a, 0x190b: 0x000a,
+	0x190c: 0x000a, 0x190d: 0x000a, 0x190e: 0x000a, 0x190f: 0x000a, 0x1910: 0x000a, 0x1911: 0x000a,
+	0x1912: 0x000a, 0x1913: 0x000a, 0x1914: 0x000a, 0x1915: 0x000a, 0x1916: 0x000a, 0x1917: 0x000a,
+	0x1918: 0x003a, 0x1919: 0x002a, 0x191a: 0x003a, 0x191b: 0x002a, 0x191c: 0x000a, 0x191d: 0x000a,
+	0x191e: 0x000a, 0x191f: 0x000a, 0x1920: 0x000a, 0x1921: 0x000a, 0x1922: 0x000a, 0x1923: 0x000a,
+	0x1924: 0x000a, 0x1925: 0x000a, 0x1926: 0x000a, 0x1927: 0x000a, 0x1928: 0x000a, 0x1929: 0x000a,
+	0x192a: 0x000a, 0x192b: 0x000a, 0x192c: 0x000a, 0x192d: 0x000a, 0x192e: 0x000a, 0x192f: 0x000a,
+	0x1930: 0x000a, 0x1931: 0x000a, 0x1932: 0x000a, 0x1933: 0x000a, 0x1934: 0x000a, 0x1935: 0x000a,
+	0x1936: 0x000a, 0x1937: 0x000a, 0x1938: 0x000a, 0x1939: 0x000a, 0x193a: 0x000a, 0x193b: 0x000a,
+	0x193c: 0x003a, 0x193d: 0x002a, 0x193e: 0x000a, 0x193f: 0x000a,
+	// Block 0x65, offset 0x1940
+	0x1940: 0x000a, 0x1941: 0x000a, 0x1942: 0x000a, 0x1943: 0x000a, 0x1944: 0x000a, 0x1945: 0x000a,
+	0x1946: 0x000a, 0x1947: 0x000a, 0x1948: 0x000a, 0x1949: 0x000a, 0x194a: 0x000a, 0x194b: 0x000a,
+	0x194c: 0x000a, 0x194d: 0x000a, 0x194e: 0x000a, 0x194f: 0x000a, 0x1950: 0x000a, 0x1951: 0x000a,
+	0x1952: 0x000a, 0x1953: 0x000a, 0x1954: 0x000a, 0x1955: 0x000a, 0x1956: 0x000a, 0x1957: 0x000a,
+	0x1958: 0x000a, 0x1959: 0x000a, 0x195a: 0x000a, 0x195b: 0x000a, 0x195c: 0x000a, 0x195d: 0x000a,
+	0x195e: 0x000a, 0x195f: 0x000a, 0x1960: 0x000a, 0x1961: 0x000a, 0x1962: 0x000a, 0x1963: 0x000a,
+	0x1964: 0x000a, 0x1965: 0x000a, 0x1966: 0x000a, 0x1967: 0x000a, 0x1968: 0x000a, 0x1969: 0x000a,
+	0x196a: 0x000a, 0x196b: 0x000a, 0x196c: 0x000a, 0x196d: 0x000a, 0x196e: 0x000a, 0x196f: 0x000a,
+	0x1970: 0x000a, 0x1971: 0x000a, 0x1972: 0x000a, 0x1973: 0x000a,
+	0x1976: 0x000a, 0x1977: 0x000a, 0x1978: 0x000a, 0x1979: 0x000a, 0x197a: 0x000a, 0x197b: 0x000a,
+	0x197c: 0x000a, 0x197d: 0x000a, 0x197e: 0x000a, 0x197f: 0x000a,
+	// Block 0x66, offset 0x1980
+	0x1980: 0x000a, 0x1981: 0x000a, 0x1982: 0x000a, 0x1983: 0x000a, 0x1984: 0x000a, 0x1985: 0x000a,
+	0x1986: 0x000a, 0x1987: 0x000a, 0x1988: 0x000a, 0x1989: 0x000a, 0x198a: 0x000a, 0x198b: 0x000a,
+	0x198c: 0x000a, 0x198d: 0x000a, 0x198e: 0x000a, 0x198f: 0x000a, 0x1990: 0x000a, 0x1991: 0x000a,
+	0x1992: 0x000a, 0x1993: 0x000a, 0x1994: 0x000a, 0x1995: 0x000a, 0x1997: 0x000a,
+	0x1998: 0x000a, 0x1999: 0x000a, 0x199a: 0x000a, 0x199b: 0x000a, 0x199c: 0x000a, 0x199d: 0x000a,
+	0x199e: 0x000a, 0x199f: 0x000a, 0x19a0: 0x000a, 0x19a1: 0x000a, 0x19a2: 0x000a, 0x19a3: 0x000a,
+	0x19a4: 0x000a, 0x19a5: 0x000a, 0x19a6: 0x000a, 0x19a7: 0x000a, 0x19a8: 0x000a, 0x19a9: 0x000a,
+	0x19aa: 0x000a, 0x19ab: 0x000a, 0x19ac: 0x000a, 0x19ad: 0x000a, 0x19ae: 0x000a, 0x19af: 0x000a,
+	0x19b0: 0x000a, 0x19b1: 0x000a, 0x19b2: 0x000a, 0x19b3: 0x000a, 0x19b4: 0x000a, 0x19b5: 0x000a,
+	0x19b6: 0x000a, 0x19b7: 0x000a, 0x19b8: 0x000a, 0x19b9: 0x000a, 0x19ba: 0x000a, 0x19bb: 0x000a,
+	0x19bc: 0x000a, 0x19bd: 0x000a, 0x19be: 0x000a, 0x19bf: 0x000a,
+	// Block 0x67, offset 0x19c0
+	0x19e5: 0x000a, 0x19e6: 0x000a, 0x19e7: 0x000a, 0x19e8: 0x000a, 0x19e9: 0x000a,
+	0x19ea: 0x000a, 0x19ef: 0x000c,
+	0x19f0: 0x000c, 0x19f1: 0x000c,
+	0x19f9: 0x000a, 0x19fa: 0x000a, 0x19fb: 0x000a,
+	0x19fc: 0x000a, 0x19fd: 0x000a, 0x19fe: 0x000a, 0x19ff: 0x000a,
+	// Block 0x68, offset 0x1a00
+	0x1a3f: 0x000c,
+	// Block 0x69, offset 0x1a40
+	0x1a60: 0x000c, 0x1a61: 0x000c, 0x1a62: 0x000c, 0x1a63: 0x000c,
+	0x1a64: 0x000c, 0x1a65: 0x000c, 0x1a66: 0x000c, 0x1a67: 0x000c, 0x1a68: 0x000c, 0x1a69: 0x000c,
+	0x1a6a: 0x000c, 0x1a6b: 0x000c, 0x1a6c: 0x000c, 0x1a6d: 0x000c, 0x1a6e: 0x000c, 0x1a6f: 0x000c,
+	0x1a70: 0x000c, 0x1a71: 0x000c, 0x1a72: 0x000c, 0x1a73: 0x000c, 0x1a74: 0x000c, 0x1a75: 0x000c,
+	0x1a76: 0x000c, 0x1a77: 0x000c, 0x1a78: 0x000c, 0x1a79: 0x000c, 0x1a7a: 0x000c, 0x1a7b: 0x000c,
+	0x1a7c: 0x000c, 0x1a7d: 0x000c, 0x1a7e: 0x000c, 0x1a7f: 0x000c,
+	// Block 0x6a, offset 0x1a80
+	0x1a80: 0x000a, 0x1a81: 0x000a, 0x1a82: 0x000a, 0x1a83: 0x000a, 0x1a84: 0x000a, 0x1a85: 0x000a,
+	0x1a86: 0x000a, 0x1a87: 0x000a, 0x1a88: 0x000a, 0x1a89: 0x000a, 0x1a8a: 0x000a, 0x1a8b: 0x000a,
+	0x1a8c: 0x000a, 0x1a8d: 0x000a, 0x1a8e: 0x000a, 0x1a8f: 0x000a, 0x1a90: 0x000a, 0x1a91: 0x000a,
+	0x1a92: 0x000a, 0x1a93: 0x000a, 0x1a94: 0x000a, 0x1a95: 0x000a, 0x1a96: 0x000a, 0x1a97: 0x000a,
+	0x1a98: 0x000a, 0x1a99: 0x000a, 0x1a9a: 0x000a, 0x1a9b: 0x000a, 0x1a9c: 0x000a, 0x1a9d: 0x000a,
+	0x1a9e: 0x000a, 0x1a9f: 0x000a, 0x1aa0: 0x000a, 0x1aa1: 0x000a, 0x1aa2: 0x003a, 0x1aa3: 0x002a,
+	0x1aa4: 0x003a, 0x1aa5: 0x002a, 0x1aa6: 0x003a, 0x1aa7: 0x002a, 0x1aa8: 0x003a, 0x1aa9: 0x002a,
+	0x1aaa: 0x000a, 0x1aab: 0x000a, 0x1aac: 0x000a, 0x1aad: 0x000a, 0x1aae: 0x000a, 0x1aaf: 0x000a,
+	0x1ab0: 0x000a, 0x1ab1: 0x000a, 0x1ab2: 0x000a, 0x1ab3: 0x000a, 0x1ab4: 0x000a, 0x1ab5: 0x000a,
+	0x1ab6: 0x000a, 0x1ab7: 0x000a, 0x1ab8: 0x000a, 0x1ab9: 0x000a, 0x1aba: 0x000a, 0x1abb: 0x000a,
+	0x1abc: 0x000a, 0x1abd: 0x000a, 0x1abe: 0x000a, 0x1abf: 0x000a,
+	// Block 0x6b, offset 0x1ac0
+	0x1ac0: 0x000a, 0x1ac1: 0x000a, 0x1ac2: 0x000a, 0x1ac3: 0x000a, 0x1ac4: 0x000a, 0x1ac5: 0x000a,
+	0x1ac6: 0x000a, 0x1ac7: 0x000a, 0x1ac8: 0x000a, 0x1ac9: 0x000a, 0x1aca: 0x000a, 0x1acb: 0x000a,
+	0x1acc: 0x000a, 0x1acd: 0x000a, 0x1ace: 0x000a, 0x1acf: 0x000a, 0x1ad0: 0x000a, 0x1ad1: 0x000a,
+	0x1ad2: 0x000a, 0x1ad3: 0x000a, 0x1ad4: 0x000a, 0x1ad5: 0x009a, 0x1ad6: 0x008a, 0x1ad7: 0x00ba,
+	0x1ad8: 0x00aa, 0x1ad9: 0x009a, 0x1ada: 0x008a, 0x1adb: 0x007a, 0x1adc: 0x006a, 0x1add: 0x000a,
+	// Block 0x6c, offset 0x1b00
+	0x1b00: 0x000a, 0x1b01: 0x000a, 0x1b02: 0x000a, 0x1b03: 0x000a, 0x1b04: 0x000a, 0x1b05: 0x000a,
+	0x1b06: 0x000a, 0x1b07: 0x000a, 0x1b08: 0x000a, 0x1b09: 0x000a, 0x1b0a: 0x000a, 0x1b0b: 0x000a,
+	0x1b0c: 0x000a, 0x1b0d: 0x000a, 0x1b0e: 0x000a, 0x1b0f: 0x000a, 0x1b10: 0x000a, 0x1b11: 0x000a,
+	0x1b12: 0x000a, 0x1b13: 0x000a, 0x1b14: 0x000a, 0x1b15: 0x000a, 0x1b16: 0x000a, 0x1b17: 0x000a,
+	0x1b18: 0x000a, 0x1b19: 0x000a, 0x1b1b: 0x000a, 0x1b1c: 0x000a, 0x1b1d: 0x000a,
+	0x1b1e: 0x000a, 0x1b1f: 0x000a, 0x1b20: 0x000a, 0x1b21: 0x000a, 0x1b22: 0x000a, 0x1b23: 0x000a,
+	0x1b24: 0x000a, 0x1b25: 0x000a, 0x1b26: 0x000a, 0x1b27: 0x000a, 0x1b28: 0x000a, 0x1b29: 0x000a,
+	0x1b2a: 0x000a, 0x1b2b: 0x000a, 0x1b2c: 0x000a, 0x1b2d: 0x000a, 0x1b2e: 0x000a, 0x1b2f: 0x000a,
+	0x1b30: 0x000a, 0x1b31: 0x000a, 0x1b32: 0x000a, 0x1b33: 0x000a, 0x1b34: 0x000a, 0x1b35: 0x000a,
+	0x1b36: 0x000a, 0x1b37: 0x000a, 0x1b38: 0x000a, 0x1b39: 0x000a, 0x1b3a: 0x000a, 0x1b3b: 0x000a,
+	0x1b3c: 0x000a, 0x1b3d: 0x000a, 0x1b3e: 0x000a, 0x1b3f: 0x000a,
+	// Block 0x6d, offset 0x1b40
+	0x1b40: 0x000a, 0x1b41: 0x000a, 0x1b42: 0x000a, 0x1b43: 0x000a, 0x1b44: 0x000a, 0x1b45: 0x000a,
+	0x1b46: 0x000a, 0x1b47: 0x000a, 0x1b48: 0x000a, 0x1b49: 0x000a, 0x1b4a: 0x000a, 0x1b4b: 0x000a,
+	0x1b4c: 0x000a, 0x1b4d: 0x000a, 0x1b4e: 0x000a, 0x1b4f: 0x000a, 0x1b50: 0x000a, 0x1b51: 0x000a,
+	0x1b52: 0x000a, 0x1b53: 0x000a, 0x1b54: 0x000a, 0x1b55: 0x000a, 0x1b56: 0x000a, 0x1b57: 0x000a,
+	0x1b58: 0x000a, 0x1b59: 0x000a, 0x1b5a: 0x000a, 0x1b5b: 0x000a, 0x1b5c: 0x000a, 0x1b5d: 0x000a,
+	0x1b5e: 0x000a, 0x1b5f: 0x000a, 0x1b60: 0x000a, 0x1b61: 0x000a, 0x1b62: 0x000a, 0x1b63: 0x000a,
+	0x1b64: 0x000a, 0x1b65: 0x000a, 0x1b66: 0x000a, 0x1b67: 0x000a, 0x1b68: 0x000a, 0x1b69: 0x000a,
+	0x1b6a: 0x000a, 0x1b6b: 0x000a, 0x1b6c: 0x000a, 0x1b6d: 0x000a, 0x1b6e: 0x000a, 0x1b6f: 0x000a,
+	0x1b70: 0x000a, 0x1b71: 0x000a, 0x1b72: 0x000a, 0x1b73: 0x000a,
+	// Block 0x6e, offset 0x1b80
+	0x1b80: 0x000a, 0x1b81: 0x000a, 0x1b82: 0x000a, 0x1b83: 0x000a, 0x1b84: 0x000a, 0x1b85: 0x000a,
+	0x1b86: 0x000a, 0x1b87: 0x000a, 0x1b88: 0x000a, 0x1b89: 0x000a, 0x1b8a: 0x000a, 0x1b8b: 0x000a,
+	0x1b8c: 0x000a, 0x1b8d: 0x000a, 0x1b8e: 0x000a, 0x1b8f: 0x000a, 0x1b90: 0x000a, 0x1b91: 0x000a,
+	0x1b92: 0x000a, 0x1b93: 0x000a, 0x1b94: 0x000a, 0x1b95: 0x000a,
+	0x1bb0: 0x000a, 0x1bb1: 0x000a, 0x1bb2: 0x000a, 0x1bb3: 0x000a, 0x1bb4: 0x000a, 0x1bb5: 0x000a,
+	0x1bb6: 0x000a, 0x1bb7: 0x000a, 0x1bb8: 0x000a, 0x1bb9: 0x000a, 0x1bba: 0x000a, 0x1bbb: 0x000a,
+	// Block 0x6f, offset 0x1bc0
+	0x1bc0: 0x0009, 0x1bc1: 0x000a, 0x1bc2: 0x000a, 0x1bc3: 0x000a, 0x1bc4: 0x000a,
+	0x1bc8: 0x003a, 0x1bc9: 0x002a, 0x1bca: 0x003a, 0x1bcb: 0x002a,
+	0x1bcc: 0x003a, 0x1bcd: 0x002a, 0x1bce: 0x003a, 0x1bcf: 0x002a, 0x1bd0: 0x003a, 0x1bd1: 0x002a,
+	0x1bd2: 0x000a, 0x1bd3: 0x000a, 0x1bd4: 0x003a, 0x1bd5: 0x002a, 0x1bd6: 0x003a, 0x1bd7: 0x002a,
+	0x1bd8: 0x003a, 0x1bd9: 0x002a, 0x1bda: 0x003a, 0x1bdb: 0x002a, 0x1bdc: 0x000a, 0x1bdd: 0x000a,
+	0x1bde: 0x000a, 0x1bdf: 0x000a, 0x1be0: 0x000a,
+	0x1bea: 0x000c, 0x1beb: 0x000c, 0x1bec: 0x000c, 0x1bed: 0x000c,
+	0x1bf0: 0x000a,
+	0x1bf6: 0x000a, 0x1bf7: 0x000a,
+	0x1bfd: 0x000a, 0x1bfe: 0x000a, 0x1bff: 0x000a,
+	// Block 0x70, offset 0x1c00
+	0x1c19: 0x000c, 0x1c1a: 0x000c, 0x1c1b: 0x000a, 0x1c1c: 0x000a,
+	0x1c20: 0x000a,
+	// Block 0x71, offset 0x1c40
+	0x1c7b: 0x000a,
+	// Block 0x72, offset 0x1c80
+	0x1c80: 0x000a, 0x1c81: 0x000a, 0x1c82: 0x000a, 0x1c83: 0x000a, 0x1c84: 0x000a, 0x1c85: 0x000a,
+	0x1c86: 0x000a, 0x1c87: 0x000a, 0x1c88: 0x000a, 0x1c89: 0x000a, 0x1c8a: 0x000a, 0x1c8b: 0x000a,
+	0x1c8c: 0x000a, 0x1c8d: 0x000a, 0x1c8e: 0x000a, 0x1c8f: 0x000a, 0x1c90: 0x000a, 0x1c91: 0x000a,
+	0x1c92: 0x000a, 0x1c93: 0x000a, 0x1c94: 0x000a, 0x1c95: 0x000a, 0x1c96: 0x000a, 0x1c97: 0x000a,
+	0x1c98: 0x000a, 0x1c99: 0x000a, 0x1c9a: 0x000a, 0x1c9b: 0x000a, 0x1c9c: 0x000a, 0x1c9d: 0x000a,
+	0x1c9e: 0x000a, 0x1c9f: 0x000a, 0x1ca0: 0x000a, 0x1ca1: 0x000a, 0x1ca2: 0x000a, 0x1ca3: 0x000a,
+	// Block 0x73, offset 0x1cc0
+	0x1cdd: 0x000a,
+	0x1cde: 0x000a,
+	// Block 0x74, offset 0x1d00
+	0x1d10: 0x000a, 0x1d11: 0x000a,
+	0x1d12: 0x000a, 0x1d13: 0x000a, 0x1d14: 0x000a, 0x1d15: 0x000a, 0x1d16: 0x000a, 0x1d17: 0x000a,
+	0x1d18: 0x000a, 0x1d19: 0x000a, 0x1d1a: 0x000a, 0x1d1b: 0x000a, 0x1d1c: 0x000a, 0x1d1d: 0x000a,
+	0x1d1e: 0x000a, 0x1d1f: 0x000a,
+	0x1d3c: 0x000a, 0x1d3d: 0x000a, 0x1d3e: 0x000a,
+	// Block 0x75, offset 0x1d40
+	0x1d71: 0x000a, 0x1d72: 0x000a, 0x1d73: 0x000a, 0x1d74: 0x000a, 0x1d75: 0x000a,
+	0x1d76: 0x000a, 0x1d77: 0x000a, 0x1d78: 0x000a, 0x1d79: 0x000a, 0x1d7a: 0x000a, 0x1d7b: 0x000a,
+	0x1d7c: 0x000a, 0x1d7d: 0x000a, 0x1d7e: 0x000a, 0x1d7f: 0x000a,
+	// Block 0x76, offset 0x1d80
+	0x1d8c: 0x000a, 0x1d8d: 0x000a, 0x1d8e: 0x000a, 0x1d8f: 0x000a,
+	// Block 0x77, offset 0x1dc0
+	0x1df7: 0x000a, 0x1df8: 0x000a, 0x1df9: 0x000a, 0x1dfa: 0x000a,
+	// Block 0x78, offset 0x1e00
+	0x1e1e: 0x000a, 0x1e1f: 0x000a,
+	0x1e3f: 0x000a,
+	// Block 0x79, offset 0x1e40
+	0x1e50: 0x000a, 0x1e51: 0x000a,
+	0x1e52: 0x000a, 0x1e53: 0x000a, 0x1e54: 0x000a, 0x1e55: 0x000a, 0x1e56: 0x000a, 0x1e57: 0x000a,
+	0x1e58: 0x000a, 0x1e59: 0x000a, 0x1e5a: 0x000a, 0x1e5b: 0x000a, 0x1e5c: 0x000a, 0x1e5d: 0x000a,
+	0x1e5e: 0x000a, 0x1e5f: 0x000a, 0x1e60: 0x000a, 0x1e61: 0x000a, 0x1e62: 0x000a, 0x1e63: 0x000a,
+	0x1e64: 0x000a, 0x1e65: 0x000a, 0x1e66: 0x000a, 0x1e67: 0x000a, 0x1e68: 0x000a, 0x1e69: 0x000a,
+	0x1e6a: 0x000a, 0x1e6b: 0x000a, 0x1e6c: 0x000a, 0x1e6d: 0x000a, 0x1e6e: 0x000a, 0x1e6f: 0x000a,
+	0x1e70: 0x000a, 0x1e71: 0x000a, 0x1e72: 0x000a, 0x1e73: 0x000a, 0x1e74: 0x000a, 0x1e75: 0x000a,
+	0x1e76: 0x000a, 0x1e77: 0x000a, 0x1e78: 0x000a, 0x1e79: 0x000a, 0x1e7a: 0x000a, 0x1e7b: 0x000a,
+	0x1e7c: 0x000a, 0x1e7d: 0x000a, 0x1e7e: 0x000a, 0x1e7f: 0x000a,
+	// Block 0x7a, offset 0x1e80
+	0x1e80: 0x000a, 0x1e81: 0x000a, 0x1e82: 0x000a, 0x1e83: 0x000a, 0x1e84: 0x000a, 0x1e85: 0x000a,
+	0x1e86: 0x000a,
+	// Block 0x7b, offset 0x1ec0
+	0x1ecd: 0x000a, 0x1ece: 0x000a, 0x1ecf: 0x000a,
+	// Block 0x7c, offset 0x1f00
+	0x1f2f: 0x000c,
+	0x1f30: 0x000c, 0x1f31: 0x000c, 0x1f32: 0x000c, 0x1f33: 0x000a, 0x1f34: 0x000c, 0x1f35: 0x000c,
+	0x1f36: 0x000c, 0x1f37: 0x000c, 0x1f38: 0x000c, 0x1f39: 0x000c, 0x1f3a: 0x000c, 0x1f3b: 0x000c,
+	0x1f3c: 0x000c, 0x1f3d: 0x000c, 0x1f3e: 0x000a, 0x1f3f: 0x000a,
+	// Block 0x7d, offset 0x1f40
+	0x1f5e: 0x000c, 0x1f5f: 0x000c,
+	// Block 0x7e, offset 0x1f80
+	0x1fb0: 0x000c, 0x1fb1: 0x000c,
+	// Block 0x7f, offset 0x1fc0
+	0x1fc0: 0x000a, 0x1fc1: 0x000a, 0x1fc2: 0x000a, 0x1fc3: 0x000a, 0x1fc4: 0x000a, 0x1fc5: 0x000a,
+	0x1fc6: 0x000a, 0x1fc7: 0x000a, 0x1fc8: 0x000a, 0x1fc9: 0x000a, 0x1fca: 0x000a, 0x1fcb: 0x000a,
+	0x1fcc: 0x000a, 0x1fcd: 0x000a, 0x1fce: 0x000a, 0x1fcf: 0x000a, 0x1fd0: 0x000a, 0x1fd1: 0x000a,
+	0x1fd2: 0x000a, 0x1fd3: 0x000a, 0x1fd4: 0x000a, 0x1fd5: 0x000a, 0x1fd6: 0x000a, 0x1fd7: 0x000a,
+	0x1fd8: 0x000a, 0x1fd9: 0x000a, 0x1fda: 0x000a, 0x1fdb: 0x000a, 0x1fdc: 0x000a, 0x1fdd: 0x000a,
+	0x1fde: 0x000a, 0x1fdf: 0x000a, 0x1fe0: 0x000a, 0x1fe1: 0x000a,
+	// Block 0x80, offset 0x2000
+	0x2008: 0x000a,
+	// Block 0x81, offset 0x2040
+	0x2042: 0x000c,
+	0x2046: 0x000c, 0x204b: 0x000c,
+	0x2065: 0x000c, 0x2066: 0x000c, 0x2068: 0x000a, 0x2069: 0x000a,
+	0x206a: 0x000a, 0x206b: 0x000a, 0x206c: 0x000c,
+	0x2078: 0x0004, 0x2079: 0x0004,
+	// Block 0x82, offset 0x2080
+	0x20b4: 0x000a, 0x20b5: 0x000a,
+	0x20b6: 0x000a, 0x20b7: 0x000a,
+	// Block 0x83, offset 0x20c0
+	0x20c4: 0x000c, 0x20c5: 0x000c,
+	0x20e0: 0x000c, 0x20e1: 0x000c, 0x20e2: 0x000c, 0x20e3: 0x000c,
+	0x20e4: 0x000c, 0x20e5: 0x000c, 0x20e6: 0x000c, 0x20e7: 0x000c, 0x20e8: 0x000c, 0x20e9: 0x000c,
+	0x20ea: 0x000c, 0x20eb: 0x000c, 0x20ec: 0x000c, 0x20ed: 0x000c, 0x20ee: 0x000c, 0x20ef: 0x000c,
+	0x20f0: 0x000c, 0x20f1: 0x000c,
+	0x20ff: 0x000c,
+	// Block 0x84, offset 0x2100
+	0x2126: 0x000c, 0x2127: 0x000c, 0x2128: 0x000c, 0x2129: 0x000c,
+	0x212a: 0x000c, 0x212b: 0x000c, 0x212c: 0x000c, 0x212d: 0x000c,
+	// Block 0x85, offset 0x2140
+	0x2147: 0x000c, 0x2148: 0x000c, 0x2149: 0x000c, 0x214a: 0x000c, 0x214b: 0x000c,
+	0x214c: 0x000c, 0x214d: 0x000c, 0x214e: 0x000c, 0x214f: 0x000c, 0x2150: 0x000c, 0x2151: 0x000c,
+	// Block 0x86, offset 0x2180
+	0x2180: 0x000c, 0x2181: 0x000c, 0x2182: 0x000c,
+	0x21b3: 0x000c,
+	0x21b6: 0x000c, 0x21b7: 0x000c, 0x21b8: 0x000c, 0x21b9: 0x000c,
+	0x21bc: 0x000c, 0x21bd: 0x000c,
+	// Block 0x87, offset 0x21c0
+	0x21e5: 0x000c,
+	// Block 0x88, offset 0x2200
+	0x2229: 0x000c,
+	0x222a: 0x000c, 0x222b: 0x000c, 0x222c: 0x000c, 0x222d: 0x000c, 0x222e: 0x000c,
+	0x2231: 0x000c, 0x2232: 0x000c, 0x2235: 0x000c,
+	0x2236: 0x000c,
+	// Block 0x89, offset 0x2240
+	0x2243: 0x000c,
+	0x224c: 0x000c,
+	0x227c: 0x000c,
+	// Block 0x8a, offset 0x2280
+	0x22b0: 0x000c, 0x22b2: 0x000c, 0x22b3: 0x000c, 0x22b4: 0x000c,
+	0x22b7: 0x000c, 0x22b8: 0x000c,
+	0x22be: 0x000c, 0x22bf: 0x000c,
+	// Block 0x8b, offset 0x22c0
+	0x22c1: 0x000c,
+	0x22ec: 0x000c, 0x22ed: 0x000c,
+	0x22f6: 0x000c,
+	// Block 0x8c, offset 0x2300
+	0x232a: 0x000a, 0x232b: 0x000a,
+	// Block 0x8d, offset 0x2340
+	0x2365: 0x000c, 0x2368: 0x000c,
+	0x236d: 0x000c,
+	// Block 0x8e, offset 0x2380
+	0x239d: 0x0001,
+	0x239e: 0x000c, 0x239f: 0x0001, 0x23a0: 0x0001, 0x23a1: 0x0001, 0x23a2: 0x0001, 0x23a3: 0x0001,
+	0x23a4: 0x0001, 0x23a5: 0x0001, 0x23a6: 0x0001, 0x23a7: 0x0001, 0x23a8: 0x0001, 0x23a9: 0x0003,
+	0x23aa: 0x0001, 0x23ab: 0x0001, 0x23ac: 0x0001, 0x23ad: 0x0001, 0x23ae: 0x0001, 0x23af: 0x0001,
+	0x23b0: 0x0001, 0x23b1: 0x0001, 0x23b2: 0x0001, 0x23b3: 0x0001, 0x23b4: 0x0001, 0x23b5: 0x0001,
+	0x23b6: 0x0001, 0x23b7: 0x0001, 0x23b8: 0x0001, 0x23b9: 0x0001, 0x23ba: 0x0001, 0x23bb: 0x0001,
+	0x23bc: 0x0001, 0x23bd: 0x0001, 0x23be: 0x0001, 0x23bf: 0x0001,
+	// Block 0x8f, offset 0x23c0
+	0x23c0: 0x0001, 0x23c1: 0x0001, 0x23c2: 0x0001, 0x23c3: 0x0001, 0x23c4: 0x0001, 0x23c5: 0x0001,
+	0x23c6: 0x0001, 0x23c7: 0x0001, 0x23c8: 0x0001, 0x23c9: 0x0001, 0x23ca: 0x0001, 0x23cb: 0x0001,
+	0x23cc: 0x0001, 0x23cd: 0x0001, 0x23ce: 0x0001, 0x23cf: 0x0001, 0x23d0: 0x000d, 0x23d1: 0x000d,
+	0x23d2: 0x000d, 0x23d3: 0x000d, 0x23d4: 0x000d, 0x23d5: 0x000d, 0x23d6: 0x000d, 0x23d7: 0x000d,
+	0x23d8: 0x000d, 0x23d9: 0x000d, 0x23da: 0x000d, 0x23db: 0x000d, 0x23dc: 0x000d, 0x23dd: 0x000d,
+	0x23de: 0x000d, 0x23df: 0x000d, 0x23e0: 0x000d, 0x23e1: 0x000d, 0x23e2: 0x000d, 0x23e3: 0x000d,
+	0x23e4: 0x000d, 0x23e5: 0x000d, 0x23e6: 0x000d, 0x23e7: 0x000d, 0x23e8: 0x000d, 0x23e9: 0x000d,
+	0x23ea: 0x000d, 0x23eb: 0x000d, 0x23ec: 0x000d, 0x23ed: 0x000d, 0x23ee: 0x000d, 0x23ef: 0x000d,
+	0x23f0: 0x000d, 0x23f1: 0x000d, 0x23f2: 0x000d, 0x23f3: 0x000d, 0x23f4: 0x000d, 0x23f5: 0x000d,
+	0x23f6: 0x000d, 0x23f7: 0x000d, 0x23f8: 0x000d, 0x23f9: 0x000d, 0x23fa: 0x000d, 0x23fb: 0x000d,
+	0x23fc: 0x000d, 0x23fd: 0x000d, 0x23fe: 0x000d, 0x23ff: 0x000d,
+	// Block 0x90, offset 0x2400
+	0x2400: 0x000d, 0x2401: 0x000d, 0x2402: 0x000d, 0x2403: 0x000d, 0x2404: 0x000d, 0x2405: 0x000d,
+	0x2406: 0x000d, 0x2407: 0x000d, 0x2408: 0x000d, 0x2409: 0x000d, 0x240a: 0x000d, 0x240b: 0x000d,
+	0x240c: 0x000d, 0x240d: 0x000d, 0x240e: 0x000d, 0x240f: 0x000d, 0x2410: 0x000d, 0x2411: 0x000d,
+	0x2412: 0x000d, 0x2413: 0x000d, 0x2414: 0x000d, 0x2415: 0x000d, 0x2416: 0x000d, 0x2417: 0x000d,
+	0x2418: 0x000d, 0x2419: 0x000d, 0x241a: 0x000d, 0x241b: 0x000d, 0x241c: 0x000d, 0x241d: 0x000d,
+	0x241e: 0x000d, 0x241f: 0x000d, 0x2420: 0x000d, 0x2421: 0x000d, 0x2422: 0x000d, 0x2423: 0x000d,
+	0x2424: 0x000d, 0x2425: 0x000d, 0x2426: 0x000d, 0x2427: 0x000d, 0x2428: 0x000d, 0x2429: 0x000d,
+	0x242a: 0x000d, 0x242b: 0x000d, 0x242c: 0x000d, 0x242d: 0x000d, 0x242e: 0x000d, 0x242f: 0x000d,
+	0x2430: 0x000d, 0x2431: 0x000d, 0x2432: 0x000d, 0x2433: 0x000d, 0x2434: 0x000d, 0x2435: 0x000d,
+	0x2436: 0x000d, 0x2437: 0x000d, 0x2438: 0x000d, 0x2439: 0x000d, 0x243a: 0x000d, 0x243b: 0x000d,
+	0x243c: 0x000d, 0x243d: 0x000d, 0x243e: 0x000a, 0x243f: 0x000a,
+	// Block 0x91, offset 0x2440
+	0x2440: 0x000a, 0x2441: 0x000a, 0x2442: 0x000a, 0x2443: 0x000a, 0x2444: 0x000a, 0x2445: 0x000a,
+	0x2446: 0x000a, 0x2447: 0x000a, 0x2448: 0x000a, 0x2449: 0x000a, 0x244a: 0x000a, 0x244b: 0x000a,
+	0x244c: 0x000a, 0x244d: 0x000a, 0x244e: 0x000a, 0x244f: 0x000a, 0x2450: 0x000d, 0x2451: 0x000d,
+	0x2452: 0x000d, 0x2453: 0x000d, 0x2454: 0x000d, 0x2455: 0x000d, 0x2456: 0x000d, 0x2457: 0x000d,
+	0x2458: 0x000d, 0x2459: 0x000d, 0x245a: 0x000d, 0x245b: 0x000d, 0x245c: 0x000d, 0x245d: 0x000d,
+	0x245e: 0x000d, 0x245f: 0x000d, 0x2460: 0x000d, 0x2461: 0x000d, 0x2462: 0x000d, 0x2463: 0x000d,
+	0x2464: 0x000d, 0x2465: 0x000d, 0x2466: 0x000d, 0x2467: 0x000d, 0x2468: 0x000d, 0x2469: 0x000d,
+	0x246a: 0x000d, 0x246b: 0x000d, 0x246c: 0x000d, 0x246d: 0x000d, 0x246e: 0x000d, 0x246f: 0x000d,
+	0x2470: 0x000d, 0x2471: 0x000d, 0x2472: 0x000d, 0x2473: 0x000d, 0x2474: 0x000d, 0x2475: 0x000d,
+	0x2476: 0x000d, 0x2477: 0x000d, 0x2478: 0x000d, 0x2479: 0x000d, 0x247a: 0x000d, 0x247b: 0x000d,
+	0x247c: 0x000d, 0x247d: 0x000d, 0x247e: 0x000d, 0x247f: 0x000d,
+	// Block 0x92, offset 0x2480
+	0x2480: 0x000d, 0x2481: 0x000d, 0x2482: 0x000d, 0x2483: 0x000d, 0x2484: 0x000d, 0x2485: 0x000d,
+	0x2486: 0x000d, 0x2487: 0x000d, 0x2488: 0x000d, 0x2489: 0x000d, 0x248a: 0x000d, 0x248b: 0x000d,
+	0x248c: 0x000d, 0x248d: 0x000d, 0x248e: 0x000d, 0x248f: 0x000a, 0x2490: 0x000b, 0x2491: 0x000b,
+	0x2492: 0x000b, 0x2493: 0x000b, 0x2494: 0x000b, 0x2495: 0x000b, 0x2496: 0x000b, 0x2497: 0x000b,
+	0x2498: 0x000b, 0x2499: 0x000b, 0x249a: 0x000b, 0x249b: 0x000b, 0x249c: 0x000b, 0x249d: 0x000b,
+	0x249e: 0x000b, 0x249f: 0x000b, 0x24a0: 0x000b, 0x24a1: 0x000b, 0x24a2: 0x000b, 0x24a3: 0x000b,
+	0x24a4: 0x000b, 0x24a5: 0x000b, 0x24a6: 0x000b, 0x24a7: 0x000b, 0x24a8: 0x000b, 0x24a9: 0x000b,
+	0x24aa: 0x000b, 0x24ab: 0x000b, 0x24ac: 0x000b, 0x24ad: 0x000b, 0x24ae: 0x000b, 0x24af: 0x000b,
+	0x24b0: 0x000d, 0x24b1: 0x000d, 0x24b2: 0x000d, 0x24b3: 0x000d, 0x24b4: 0x000d, 0x24b5: 0x000d,
+	0x24b6: 0x000d, 0x24b7: 0x000d, 0x24b8: 0x000d, 0x24b9: 0x000d, 0x24ba: 0x000d, 0x24bb: 0x000d,
+	0x24bc: 0x000d, 0x24bd: 0x000a, 0x24be: 0x000a, 0x24bf: 0x000a,
+	// Block 0x93, offset 0x24c0
+	0x24c0: 0x000c, 0x24c1: 0x000c, 0x24c2: 0x000c, 0x24c3: 0x000c, 0x24c4: 0x000c, 0x24c5: 0x000c,
+	0x24c6: 0x000c, 0x24c7: 0x000c, 0x24c8: 0x000c, 0x24c9: 0x000c, 0x24ca: 0x000c, 0x24cb: 0x000c,
+	0x24cc: 0x000c, 0x24cd: 0x000c, 0x24ce: 0x000c, 0x24cf: 0x000c, 0x24d0: 0x000a, 0x24d1: 0x000a,
+	0x24d2: 0x000a, 0x24d3: 0x000a, 0x24d4: 0x000a, 0x24d5: 0x000a, 0x24d6: 0x000a, 0x24d7: 0x000a,
+	0x24d8: 0x000a, 0x24d9: 0x000a,
+	0x24e0: 0x000c, 0x24e1: 0x000c, 0x24e2: 0x000c, 0x24e3: 0x000c,
+	0x24e4: 0x000c, 0x24e5: 0x000c, 0x24e6: 0x000c, 0x24e7: 0x000c, 0x24e8: 0x000c, 0x24e9: 0x000c,
+	0x24ea: 0x000c, 0x24eb: 0x000c, 0x24ec: 0x000c, 0x24ed: 0x000c, 0x24ee: 0x000c, 0x24ef: 0x000c,
+	0x24f0: 0x000a, 0x24f1: 0x000a, 0x24f2: 0x000a, 0x24f3: 0x000a, 0x24f4: 0x000a, 0x24f5: 0x000a,
+	0x24f6: 0x000a, 0x24f7: 0x000a, 0x24f8: 0x000a, 0x24f9: 0x000a, 0x24fa: 0x000a, 0x24fb: 0x000a,
+	0x24fc: 0x000a, 0x24fd: 0x000a, 0x24fe: 0x000a, 0x24ff: 0x000a,
+	// Block 0x94, offset 0x2500
+	0x2500: 0x000a, 0x2501: 0x000a, 0x2502: 0x000a, 0x2503: 0x000a, 0x2504: 0x000a, 0x2505: 0x000a,
+	0x2506: 0x000a, 0x2507: 0x000a, 0x2508: 0x000a, 0x2509: 0x000a, 0x250a: 0x000a, 0x250b: 0x000a,
+	0x250c: 0x000a, 0x250d: 0x000a, 0x250e: 0x000a, 0x250f: 0x000a, 0x2510: 0x0006, 0x2511: 0x000a,
+	0x2512: 0x0006, 0x2514: 0x000a, 0x2515: 0x0006, 0x2516: 0x000a, 0x2517: 0x000a,
+	0x2518: 0x000a, 0x2519: 0x009a, 0x251a: 0x008a, 0x251b: 0x007a, 0x251c: 0x006a, 0x251d: 0x009a,
+	0x251e: 0x008a, 0x251f: 0x0004, 0x2520: 0x000a, 0x2521: 0x000a, 0x2522: 0x0003, 0x2523: 0x0003,
+	0x2524: 0x000a, 0x2525: 0x000a, 0x2526: 0x000a, 0x2528: 0x000a, 0x2529: 0x0004,
+	0x252a: 0x0004, 0x252b: 0x000a,
+	0x2530: 0x000d, 0x2531: 0x000d, 0x2532: 0x000d, 0x2533: 0x000d, 0x2534: 0x000d, 0x2535: 0x000d,
+	0x2536: 0x000d, 0x2537: 0x000d, 0x2538: 0x000d, 0x2539: 0x000d, 0x253a: 0x000d, 0x253b: 0x000d,
+	0x253c: 0x000d, 0x253d: 0x000d, 0x253e: 0x000d, 0x253f: 0x000d,
+	// Block 0x95, offset 0x2540
+	0x2540: 0x000d, 0x2541: 0x000d, 0x2542: 0x000d, 0x2543: 0x000d, 0x2544: 0x000d, 0x2545: 0x000d,
+	0x2546: 0x000d, 0x2547: 0x000d, 0x2548: 0x000d, 0x2549: 0x000d, 0x254a: 0x000d, 0x254b: 0x000d,
+	0x254c: 0x000d, 0x254d: 0x000d, 0x254e: 0x000d, 0x254f: 0x000d, 0x2550: 0x000d, 0x2551: 0x000d,
+	0x2552: 0x000d, 0x2553: 0x000d, 0x2554: 0x000d, 0x2555: 0x000d, 0x2556: 0x000d, 0x2557: 0x000d,
+	0x2558: 0x000d, 0x2559: 0x000d, 0x255a: 0x000d, 0x255b: 0x000d, 0x255c: 0x000d, 0x255d: 0x000d,
+	0x255e: 0x000d, 0x255f: 0x000d, 0x2560: 0x000d, 0x2561: 0x000d, 0x2562: 0x000d, 0x2563: 0x000d,
+	0x2564: 0x000d, 0x2565: 0x000d, 0x2566: 0x000d, 0x2567: 0x000d, 0x2568: 0x000d, 0x2569: 0x000d,
+	0x256a: 0x000d, 0x256b: 0x000d, 0x256c: 0x000d, 0x256d: 0x000d, 0x256e: 0x000d, 0x256f: 0x000d,
+	0x2570: 0x000d, 0x2571: 0x000d, 0x2572: 0x000d, 0x2573: 0x000d, 0x2574: 0x000d, 0x2575: 0x000d,
+	0x2576: 0x000d, 0x2577: 0x000d, 0x2578: 0x000d, 0x2579: 0x000d, 0x257a: 0x000d, 0x257b: 0x000d,
+	0x257c: 0x000d, 0x257d: 0x000d, 0x257e: 0x000d, 0x257f: 0x000b,
+	// Block 0x96, offset 0x2580
+	0x2581: 0x000a, 0x2582: 0x000a, 0x2583: 0x0004, 0x2584: 0x0004, 0x2585: 0x0004,
+	0x2586: 0x000a, 0x2587: 0x000a, 0x2588: 0x003a, 0x2589: 0x002a, 0x258a: 0x000a, 0x258b: 0x0003,
+	0x258c: 0x0006, 0x258d: 0x0003, 0x258e: 0x0006, 0x258f: 0x0006, 0x2590: 0x0002, 0x2591: 0x0002,
+	0x2592: 0x0002, 0x2593: 0x0002, 0x2594: 0x0002, 0x2595: 0x0002, 0x2596: 0x0002, 0x2597: 0x0002,
+	0x2598: 0x0002, 0x2599: 0x0002, 0x259a: 0x0006, 0x259b: 0x000a, 0x259c: 0x000a, 0x259d: 0x000a,
+	0x259e: 0x000a, 0x259f: 0x000a, 0x25a0: 0x000a,
+	0x25bb: 0x005a,
+	0x25bc: 0x000a, 0x25bd: 0x004a, 0x25be: 0x000a, 0x25bf: 0x000a,
+	// Block 0x97, offset 0x25c0
+	0x25c0: 0x000a,
+	0x25db: 0x005a, 0x25dc: 0x000a, 0x25dd: 0x004a,
+	0x25de: 0x000a, 0x25df: 0x00fa, 0x25e0: 0x00ea, 0x25e1: 0x000a, 0x25e2: 0x003a, 0x25e3: 0x002a,
+	0x25e4: 0x000a, 0x25e5: 0x000a,
+	// Block 0x98, offset 0x2600
+	0x2620: 0x0004, 0x2621: 0x0004, 0x2622: 0x000a, 0x2623: 0x000a,
+	0x2624: 0x000a, 0x2625: 0x0004, 0x2626: 0x0004, 0x2628: 0x000a, 0x2629: 0x000a,
+	0x262a: 0x000a, 0x262b: 0x000a, 0x262c: 0x000a, 0x262d: 0x000a, 0x262e: 0x000a,
+	0x2630: 0x000b, 0x2631: 0x000b, 0x2632: 0x000b, 0x2633: 0x000b, 0x2634: 0x000b, 0x2635: 0x000b,
+	0x2636: 0x000b, 0x2637: 0x000b, 0x2638: 0x000b, 0x2639: 0x000a, 0x263a: 0x000a, 0x263b: 0x000a,
+	0x263c: 0x000a, 0x263d: 0x000a, 0x263e: 0x000b, 0x263f: 0x000b,
+	// Block 0x99, offset 0x2640
+	0x2641: 0x000a,
+	// Block 0x9a, offset 0x2680
+	0x2680: 0x000a, 0x2681: 0x000a, 0x2682: 0x000a, 0x2683: 0x000a, 0x2684: 0x000a, 0x2685: 0x000a,
+	0x2686: 0x000a, 0x2687: 0x000a, 0x2688: 0x000a, 0x2689: 0x000a, 0x268a: 0x000a, 0x268b: 0x000a,
+	0x268c: 0x000a, 0x2690: 0x000a, 0x2691: 0x000a,
+	0x2692: 0x000a, 0x2693: 0x000a, 0x2694: 0x000a, 0x2695: 0x000a, 0x2696: 0x000a, 0x2697: 0x000a,
+	0x2698: 0x000a, 0x2699: 0x000a, 0x269a: 0x000a, 0x269b: 0x000a, 0x269c: 0x000a,
+	0x26a0: 0x000a,
+	// Block 0x9b, offset 0x26c0
+	0x26fd: 0x000c,
+	// Block 0x9c, offset 0x2700
+	0x2720: 0x000c, 0x2721: 0x0002, 0x2722: 0x0002, 0x2723: 0x0002,
+	0x2724: 0x0002, 0x2725: 0x0002, 0x2726: 0x0002, 0x2727: 0x0002, 0x2728: 0x0002, 0x2729: 0x0002,
+	0x272a: 0x0002, 0x272b: 0x0002, 0x272c: 0x0002, 0x272d: 0x0002, 0x272e: 0x0002, 0x272f: 0x0002,
+	0x2730: 0x0002, 0x2731: 0x0002, 0x2732: 0x0002, 0x2733: 0x0002, 0x2734: 0x0002, 0x2735: 0x0002,
+	0x2736: 0x0002, 0x2737: 0x0002, 0x2738: 0x0002, 0x2739: 0x0002, 0x273a: 0x0002, 0x273b: 0x0002,
+	// Block 0x9d, offset 0x2740
+	0x2776: 0x000c, 0x2777: 0x000c, 0x2778: 0x000c, 0x2779: 0x000c, 0x277a: 0x000c,
+	// Block 0x9e, offset 0x2780
+	0x2780: 0x0001, 0x2781: 0x0001, 0x2782: 0x0001, 0x2783: 0x0001, 0x2784: 0x0001, 0x2785: 0x0001,
+	0x2786: 0x0001, 0x2787: 0x0001, 0x2788: 0x0001, 0x2789: 0x0001, 0x278a: 0x0001, 0x278b: 0x0001,
+	0x278c: 0x0001, 0x278d: 0x0001, 0x278e: 0x0001, 0x278f: 0x0001, 0x2790: 0x0001, 0x2791: 0x0001,
+	0x2792: 0x0001, 0x2793: 0x0001, 0x2794: 0x0001, 0x2795: 0x0001, 0x2796: 0x0001, 0x2797: 0x0001,
+	0x2798: 0x0001, 0x2799: 0x0001, 0x279a: 0x0001, 0x279b: 0x0001, 0x279c: 0x0001, 0x279d: 0x0001,
+	0x279e: 0x0001, 0x279f: 0x0001, 0x27a0: 0x0001, 0x27a1: 0x0001, 0x27a2: 0x0001, 0x27a3: 0x0001,
+	0x27a4: 0x0001, 0x27a5: 0x0001, 0x27a6: 0x0001, 0x27a7: 0x0001, 0x27a8: 0x0001, 0x27a9: 0x0001,
+	0x27aa: 0x0001, 0x27ab: 0x0001, 0x27ac: 0x0001, 0x27ad: 0x0001, 0x27ae: 0x0001, 0x27af: 0x0001,
+	0x27b0: 0x0001, 0x27b1: 0x0001, 0x27b2: 0x0001, 0x27b3: 0x0001, 0x27b4: 0x0001, 0x27b5: 0x0001,
+	0x27b6: 0x0001, 0x27b7: 0x0001, 0x27b8: 0x0001, 0x27b9: 0x0001, 0x27ba: 0x0001, 0x27bb: 0x0001,
+	0x27bc: 0x0001, 0x27bd: 0x0001, 0x27be: 0x0001, 0x27bf: 0x0001,
+	// Block 0x9f, offset 0x27c0
+	0x27c0: 0x0001, 0x27c1: 0x0001, 0x27c2: 0x0001, 0x27c3: 0x0001, 0x27c4: 0x0001, 0x27c5: 0x0001,
+	0x27c6: 0x0001, 0x27c7: 0x0001, 0x27c8: 0x0001, 0x27c9: 0x0001, 0x27ca: 0x0001, 0x27cb: 0x0001,
+	0x27cc: 0x0001, 0x27cd: 0x0001, 0x27ce: 0x0001, 0x27cf: 0x0001, 0x27d0: 0x0001, 0x27d1: 0x0001,
+	0x27d2: 0x0001, 0x27d3: 0x0001, 0x27d4: 0x0001, 0x27d5: 0x0001, 0x27d6: 0x0001, 0x27d7: 0x0001,
+	0x27d8: 0x0001, 0x27d9: 0x0001, 0x27da: 0x0001, 0x27db: 0x0001, 0x27dc: 0x0001, 0x27dd: 0x0001,
+	0x27de: 0x0001, 0x27df: 0x000a, 0x27e0: 0x0001, 0x27e1: 0x0001, 0x27e2: 0x0001, 0x27e3: 0x0001,
+	0x27e4: 0x0001, 0x27e5: 0x0001, 0x27e6: 0x0001, 0x27e7: 0x0001, 0x27e8: 0x0001, 0x27e9: 0x0001,
+	0x27ea: 0x0001, 0x27eb: 0x0001, 0x27ec: 0x0001, 0x27ed: 0x0001, 0x27ee: 0x0001, 0x27ef: 0x0001,
+	0x27f0: 0x0001, 0x27f1: 0x0001, 0x27f2: 0x0001, 0x27f3: 0x0001, 0x27f4: 0x0001, 0x27f5: 0x0001,
+	0x27f6: 0x0001, 0x27f7: 0x0001, 0x27f8: 0x0001, 0x27f9: 0x0001, 0x27fa: 0x0001, 0x27fb: 0x0001,
+	0x27fc: 0x0001, 0x27fd: 0x0001, 0x27fe: 0x0001, 0x27ff: 0x0001,
+	// Block 0xa0, offset 0x2800
+	0x2800: 0x0001, 0x2801: 0x000c, 0x2802: 0x000c, 0x2803: 0x000c, 0x2804: 0x0001, 0x2805: 0x000c,
+	0x2806: 0x000c, 0x2807: 0x0001, 0x2808: 0x0001, 0x2809: 0x0001, 0x280a: 0x0001, 0x280b: 0x0001,
+	0x280c: 0x000c, 0x280d: 0x000c, 0x280e: 0x000c, 0x280f: 0x000c, 0x2810: 0x0001, 0x2811: 0x0001,
+	0x2812: 0x0001, 0x2813: 0x0001, 0x2814: 0x0001, 0x2815: 0x0001, 0x2816: 0x0001, 0x2817: 0x0001,
+	0x2818: 0x0001, 0x2819: 0x0001, 0x281a: 0x0001, 0x281b: 0x0001, 0x281c: 0x0001, 0x281d: 0x0001,
+	0x281e: 0x0001, 0x281f: 0x0001, 0x2820: 0x0001, 0x2821: 0x0001, 0x2822: 0x0001, 0x2823: 0x0001,
+	0x2824: 0x0001, 0x2825: 0x0001, 0x2826: 0x0001, 0x2827: 0x0001, 0x2828: 0x0001, 0x2829: 0x0001,
+	0x282a: 0x0001, 0x282b: 0x0001, 0x282c: 0x0001, 0x282d: 0x0001, 0x282e: 0x0001, 0x282f: 0x0001,
+	0x2830: 0x0001, 0x2831: 0x0001, 0x2832: 0x0001, 0x2833: 0x0001, 0x2834: 0x0001, 0x2835: 0x0001,
+	0x2836: 0x0001, 0x2837: 0x0001, 0x2838: 0x000c, 0x2839: 0x000c, 0x283a: 0x000c, 0x283b: 0x0001,
+	0x283c: 0x0001, 0x283d: 0x0001, 0x283e: 0x0001, 0x283f: 0x000c,
+	// Block 0xa1, offset 0x2840
+	0x2840: 0x0001, 0x2841: 0x0001, 0x2842: 0x0001, 0x2843: 0x0001, 0x2844: 0x0001, 0x2845: 0x0001,
+	0x2846: 0x0001, 0x2847: 0x0001, 0x2848: 0x0001, 0x2849: 0x0001, 0x284a: 0x0001, 0x284b: 0x0001,
+	0x284c: 0x0001, 0x284d: 0x0001, 0x284e: 0x0001, 0x284f: 0x0001, 0x2850: 0x0001, 0x2851: 0x0001,
+	0x2852: 0x0001, 0x2853: 0x0001, 0x2854: 0x0001, 0x2855: 0x0001, 0x2856: 0x0001, 0x2857: 0x0001,
+	0x2858: 0x0001, 0x2859: 0x0001, 0x285a: 0x0001, 0x285b: 0x0001, 0x285c: 0x0001, 0x285d: 0x0001,
+	0x285e: 0x0001, 0x285f: 0x0001, 0x2860: 0x0001, 0x2861: 0x0001, 0x2862: 0x0001, 0x2863: 0x0001,
+	0x2864: 0x0001, 0x2865: 0x000c, 0x2866: 0x000c, 0x2867: 0x0001, 0x2868: 0x0001, 0x2869: 0x0001,
+	0x286a: 0x0001, 0x286b: 0x0001, 0x286c: 0x0001, 0x286d: 0x0001, 0x286e: 0x0001, 0x286f: 0x0001,
+	0x2870: 0x0001, 0x2871: 0x0001, 0x2872: 0x0001, 0x2873: 0x0001, 0x2874: 0x0001, 0x2875: 0x0001,
+	0x2876: 0x0001, 0x2877: 0x0001, 0x2878: 0x0001, 0x2879: 0x0001, 0x287a: 0x0001, 0x287b: 0x0001,
+	0x287c: 0x0001, 0x287d: 0x0001, 0x287e: 0x0001, 0x287f: 0x0001,
+	// Block 0xa2, offset 0x2880
+	0x2880: 0x0001, 0x2881: 0x0001, 0x2882: 0x0001, 0x2883: 0x0001, 0x2884: 0x0001, 0x2885: 0x0001,
+	0x2886: 0x0001, 0x2887: 0x0001, 0x2888: 0x0001, 0x2889: 0x0001, 0x288a: 0x0001, 0x288b: 0x0001,
+	0x288c: 0x0001, 0x288d: 0x0001, 0x288e: 0x0001, 0x288f: 0x0001, 0x2890: 0x0001, 0x2891: 0x0001,
+	0x2892: 0x0001, 0x2893: 0x0001, 0x2894: 0x0001, 0x2895: 0x0001, 0x2896: 0x0001, 0x2897: 0x0001,
+	0x2898: 0x0001, 0x2899: 0x0001, 0x289a: 0x0001, 0x289b: 0x0001, 0x289c: 0x0001, 0x289d: 0x0001,
+	0x289e: 0x0001, 0x289f: 0x0001, 0x28a0: 0x0001, 0x28a1: 0x0001, 0x28a2: 0x0001, 0x28a3: 0x0001,
+	0x28a4: 0x0001, 0x28a5: 0x0001, 0x28a6: 0x0001, 0x28a7: 0x0001, 0x28a8: 0x0001, 0x28a9: 0x0001,
+	0x28aa: 0x0001, 0x28ab: 0x0001, 0x28ac: 0x0001, 0x28ad: 0x0001, 0x28ae: 0x0001, 0x28af: 0x0001,
+	0x28b0: 0x0001, 0x28b1: 0x0001, 0x28b2: 0x0001, 0x28b3: 0x0001, 0x28b4: 0x0001, 0x28b5: 0x0001,
+	0x28b6: 0x0001, 0x28b7: 0x0001, 0x28b8: 0x0001, 0x28b9: 0x000a, 0x28ba: 0x000a, 0x28bb: 0x000a,
+	0x28bc: 0x000a, 0x28bd: 0x000a, 0x28be: 0x000a, 0x28bf: 0x000a,
+	// Block 0xa3, offset 0x28c0
+	0x28c0: 0x000d, 0x28c1: 0x000d, 0x28c2: 0x000d, 0x28c3: 0x000d, 0x28c4: 0x000d, 0x28c5: 0x000d,
+	0x28c6: 0x000d, 0x28c7: 0x000d, 0x28c8: 0x000d, 0x28c9: 0x000d, 0x28ca: 0x000d, 0x28cb: 0x000d,
+	0x28cc: 0x000d, 0x28cd: 0x000d, 0x28ce: 0x000d, 0x28cf: 0x000d, 0x28d0: 0x000d, 0x28d1: 0x000d,
+	0x28d2: 0x000d, 0x28d3: 0x000d, 0x28d4: 0x000d, 0x28d5: 0x000d, 0x28d6: 0x000d, 0x28d7: 0x000d,
+	0x28d8: 0x000d, 0x28d9: 0x000d, 0x28da: 0x000d, 0x28db: 0x000d, 0x28dc: 0x000d, 0x28dd: 0x000d,
+	0x28de: 0x000d, 0x28df: 0x000d, 0x28e0: 0x000d, 0x28e1: 0x000d, 0x28e2: 0x000d, 0x28e3: 0x000d,
+	0x28e4: 0x000c, 0x28e5: 0x000c, 0x28e6: 0x000c, 0x28e7: 0x000c, 0x28e8: 0x0001, 0x28e9: 0x0001,
+	0x28ea: 0x0001, 0x28eb: 0x0001, 0x28ec: 0x0001, 0x28ed: 0x0001, 0x28ee: 0x0001, 0x28ef: 0x0001,
+	0x28f0: 0x0005, 0x28f1: 0x0005, 0x28f2: 0x0005, 0x28f3: 0x0005, 0x28f4: 0x0005, 0x28f5: 0x0005,
+	0x28f6: 0x0005, 0x28f7: 0x0005, 0x28f8: 0x0005, 0x28f9: 0x0005, 0x28fa: 0x0001, 0x28fb: 0x0001,
+	0x28fc: 0x0001, 0x28fd: 0x0001, 0x28fe: 0x0001, 0x28ff: 0x0001,
+	// Block 0xa4, offset 0x2900
+	0x2900: 0x0001, 0x2901: 0x0001, 0x2902: 0x0001, 0x2903: 0x0001, 0x2904: 0x0001, 0x2905: 0x0001,
+	0x2906: 0x0001, 0x2907: 0x0001, 0x2908: 0x0001, 0x2909: 0x0001, 0x290a: 0x0001, 0x290b: 0x0001,
+	0x290c: 0x0001, 0x290d: 0x0001, 0x290e: 0x0001, 0x290f: 0x0001, 0x2910: 0x0001, 0x2911: 0x0001,
+	0x2912: 0x0001, 0x2913: 0x0001, 0x2914: 0x0001, 0x2915: 0x0001, 0x2916: 0x0001, 0x2917: 0x0001,
+	0x2918: 0x0001, 0x2919: 0x0001, 0x291a: 0x0001, 0x291b: 0x0001, 0x291c: 0x0001, 0x291d: 0x0001,
+	0x291e: 0x0001, 0x291f: 0x0001, 0x2920: 0x0005, 0x2921: 0x0005, 0x2922: 0x0005, 0x2923: 0x0005,
+	0x2924: 0x0005, 0x2925: 0x0005, 0x2926: 0x0005, 0x2927: 0x0005, 0x2928: 0x0005, 0x2929: 0x0005,
+	0x292a: 0x0005, 0x292b: 0x0005, 0x292c: 0x0005, 0x292d: 0x0005, 0x292e: 0x0005, 0x292f: 0x0005,
+	0x2930: 0x0005, 0x2931: 0x0005, 0x2932: 0x0005, 0x2933: 0x0005, 0x2934: 0x0005, 0x2935: 0x0005,
+	0x2936: 0x0005, 0x2937: 0x0005, 0x2938: 0x0005, 0x2939: 0x0005, 0x293a: 0x0005, 0x293b: 0x0005,
+	0x293c: 0x0005, 0x293d: 0x0005, 0x293e: 0x0005, 0x293f: 0x0001,
+	// Block 0xa5, offset 0x2940
+	0x2940: 0x0001, 0x2941: 0x0001, 0x2942: 0x0001, 0x2943: 0x0001, 0x2944: 0x0001, 0x2945: 0x0001,
+	0x2946: 0x0001, 0x2947: 0x0001, 0x2948: 0x0001, 0x2949: 0x0001, 0x294a: 0x0001, 0x294b: 0x0001,
+	0x294c: 0x0001, 0x294d: 0x0001, 0x294e: 0x0001, 0x294f: 0x0001, 0x2950: 0x0001, 0x2951: 0x0001,
+	0x2952: 0x0001, 0x2953: 0x0001, 0x2954: 0x0001, 0x2955: 0x0001, 0x2956: 0x0001, 0x2957: 0x0001,
+	0x2958: 0x0001, 0x2959: 0x0001, 0x295a: 0x0001, 0x295b: 0x0001, 0x295c: 0x0001, 0x295d: 0x0001,
+	0x295e: 0x0001, 0x295f: 0x0001, 0x2960: 0x0001, 0x2961: 0x0001, 0x2962: 0x0001, 0x2963: 0x0001,
+	0x2964: 0x0001, 0x2965: 0x0001, 0x2966: 0x0001, 0x2967: 0x0001, 0x2968: 0x0001, 0x2969: 0x0001,
+	0x296a: 0x0001, 0x296b: 0x000c, 0x296c: 0x000c, 0x296d: 0x0001, 0x296e: 0x0001, 0x296f: 0x0001,
+	0x2970: 0x0001, 0x2971: 0x0001, 0x2972: 0x0001, 0x2973: 0x0001, 0x2974: 0x0001, 0x2975: 0x0001,
+	0x2976: 0x0001, 0x2977: 0x0001, 0x2978: 0x0001, 0x2979: 0x0001, 0x297a: 0x0001, 0x297b: 0x0001,
+	0x297c: 0x0001, 0x297d: 0x0001, 0x297e: 0x0001, 0x297f: 0x0001,
+	// Block 0xa6, offset 0x2980
+	0x2980: 0x0001, 0x2981: 0x0001, 0x2982: 0x0001, 0x2983: 0x0001, 0x2984: 0x0001, 0x2985: 0x0001,
+	0x2986: 0x0001, 0x2987: 0x0001, 0x2988: 0x0001, 0x2989: 0x0001, 0x298a: 0x0001, 0x298b: 0x0001,
+	0x298c: 0x0001, 0x298d: 0x0001, 0x298e: 0x0001, 0x298f: 0x0001, 0x2990: 0x0001, 0x2991: 0x0001,
+	0x2992: 0x0001, 0x2993: 0x0001, 0x2994: 0x0001, 0x2995: 0x0001, 0x2996: 0x0001, 0x2997: 0x0001,
+	0x2998: 0x0001, 0x2999: 0x0001, 0x299a: 0x0001, 0x299b: 0x0001, 0x299c: 0x0001, 0x299d: 0x0001,
+	0x299e: 0x0001, 0x299f: 0x0001, 0x29a0: 0x0001, 0x29a1: 0x0001, 0x29a2: 0x0001, 0x29a3: 0x0001,
+	0x29a4: 0x0001, 0x29a5: 0x0001, 0x29a6: 0x0001, 0x29a7: 0x0001, 0x29a8: 0x0001, 0x29a9: 0x0001,
+	0x29aa: 0x0001, 0x29ab: 0x0001, 0x29ac: 0x0001, 0x29ad: 0x0001, 0x29ae: 0x0001, 0x29af: 0x0001,
+	0x29b0: 0x0001, 0x29b1: 0x0001, 0x29b2: 0x0001, 0x29b3: 0x0001, 0x29b4: 0x0001, 0x29b5: 0x0001,
+	0x29b6: 0x0001, 0x29b7: 0x0001, 0x29b8: 0x0001, 0x29b9: 0x0001, 0x29ba: 0x0001, 0x29bb: 0x0001,
+	0x29bc: 0x0001, 0x29bd: 0x000c, 0x29be: 0x000c, 0x29bf: 0x000c,
+	// Block 0xa7, offset 0x29c0
+	0x29c0: 0x0001, 0x29c1: 0x0001, 0x29c2: 0x0001, 0x29c3: 0x0001, 0x29c4: 0x0001, 0x29c5: 0x0001,
+	0x29c6: 0x0001, 0x29c7: 0x0001, 0x29c8: 0x0001, 0x29c9: 0x0001, 0x29ca: 0x0001, 0x29cb: 0x0001,
+	0x29cc: 0x0001, 0x29cd: 0x0001, 0x29ce: 0x0001, 0x29cf: 0x0001, 0x29d0: 0x0001, 0x29d1: 0x0001,
+	0x29d2: 0x0001, 0x29d3: 0x0001, 0x29d4: 0x0001, 0x29d5: 0x0001, 0x29d6: 0x0001, 0x29d7: 0x0001,
+	0x29d8: 0x0001, 0x29d9: 0x0001, 0x29da: 0x0001, 0x29db: 0x0001, 0x29dc: 0x0001, 0x29dd: 0x0001,
+	0x29de: 0x0001, 0x29df: 0x0001, 0x29e0: 0x0001, 0x29e1: 0x0001, 0x29e2: 0x0001, 0x29e3: 0x0001,
+	0x29e4: 0x0001, 0x29e5: 0x0001, 0x29e6: 0x0001, 0x29e7: 0x0001, 0x29e8: 0x0001, 0x29e9: 0x0001,
+	0x29ea: 0x0001, 0x29eb: 0x0001, 0x29ec: 0x0001, 0x29ed: 0x0001, 0x29ee: 0x0001, 0x29ef: 0x0001,
+	0x29f0: 0x000d, 0x29f1: 0x000d, 0x29f2: 0x000d, 0x29f3: 0x000d, 0x29f4: 0x000d, 0x29f5: 0x000d,
+	0x29f6: 0x000d, 0x29f7: 0x000d, 0x29f8: 0x000d, 0x29f9: 0x000d, 0x29fa: 0x000d, 0x29fb: 0x000d,
+	0x29fc: 0x000d, 0x29fd: 0x000d, 0x29fe: 0x000d, 0x29ff: 0x000d,
+	// Block 0xa8, offset 0x2a00
+	0x2a00: 0x000d, 0x2a01: 0x000d, 0x2a02: 0x000d, 0x2a03: 0x000d, 0x2a04: 0x000d, 0x2a05: 0x000d,
+	0x2a06: 0x000c, 0x2a07: 0x000c, 0x2a08: 0x000c, 0x2a09: 0x000c, 0x2a0a: 0x000c, 0x2a0b: 0x000c,
+	0x2a0c: 0x000c, 0x2a0d: 0x000c, 0x2a0e: 0x000c, 0x2a0f: 0x000c, 0x2a10: 0x000c, 0x2a11: 0x000d,
+	0x2a12: 0x000d, 0x2a13: 0x000d, 0x2a14: 0x000d, 0x2a15: 0x000d, 0x2a16: 0x000d, 0x2a17: 0x000d,
+	0x2a18: 0x000d, 0x2a19: 0x000d, 0x2a1a: 0x0001, 0x2a1b: 0x0001, 0x2a1c: 0x0001, 0x2a1d: 0x0001,
+	0x2a1e: 0x0001, 0x2a1f: 0x0001, 0x2a20: 0x0001, 0x2a21: 0x0001, 0x2a22: 0x0001, 0x2a23: 0x0001,
+	0x2a24: 0x0001, 0x2a25: 0x0001, 0x2a26: 0x0001, 0x2a27: 0x0001, 0x2a28: 0x0001, 0x2a29: 0x0001,
+	0x2a2a: 0x0001, 0x2a2b: 0x0001, 0x2a2c: 0x0001, 0x2a2d: 0x0001, 0x2a2e: 0x0001, 0x2a2f: 0x0001,
+	0x2a30: 0x0001, 0x2a31: 0x0001, 0x2a32: 0x0001, 0x2a33: 0x0001, 0x2a34: 0x0001, 0x2a35: 0x0001,
+	0x2a36: 0x0001, 0x2a37: 0x0001, 0x2a38: 0x0001, 0x2a39: 0x0001, 0x2a3a: 0x0001, 0x2a3b: 0x0001,
+	0x2a3c: 0x0001, 0x2a3d: 0x0001, 0x2a3e: 0x0001, 0x2a3f: 0x0001,
+	// Block 0xa9, offset 0x2a40
+	0x2a40: 0x0001, 0x2a41: 0x0001, 0x2a42: 0x000c, 0x2a43: 0x000c, 0x2a44: 0x000c, 0x2a45: 0x000c,
+	0x2a46: 0x0001, 0x2a47: 0x0001, 0x2a48: 0x0001, 0x2a49: 0x0001, 0x2a4a: 0x0001, 0x2a4b: 0x0001,
+	0x2a4c: 0x0001, 0x2a4d: 0x0001, 0x2a4e: 0x0001, 0x2a4f: 0x0001, 0x2a50: 0x0001, 0x2a51: 0x0001,
+	0x2a52: 0x0001, 0x2a53: 0x0001, 0x2a54: 0x0001, 0x2a55: 0x0001, 0x2a56: 0x0001, 0x2a57: 0x0001,
+	0x2a58: 0x0001, 0x2a59: 0x0001, 0x2a5a: 0x0001, 0x2a5b: 0x0001, 0x2a5c: 0x0001, 0x2a5d: 0x0001,
+	0x2a5e: 0x0001, 0x2a5f: 0x0001, 0x2a60: 0x0001, 0x2a61: 0x0001, 0x2a62: 0x0001, 0x2a63: 0x0001,
+	0x2a64: 0x0001, 0x2a65: 0x0001, 0x2a66: 0x0001, 0x2a67: 0x0001, 0x2a68: 0x0001, 0x2a69: 0x0001,
+	0x2a6a: 0x0001, 0x2a6b: 0x0001, 0x2a6c: 0x0001, 0x2a6d: 0x0001, 0x2a6e: 0x0001, 0x2a6f: 0x0001,
+	0x2a70: 0x0001, 0x2a71: 0x0001, 0x2a72: 0x0001, 0x2a73: 0x0001, 0x2a74: 0x0001, 0x2a75: 0x0001,
+	0x2a76: 0x0001, 0x2a77: 0x0001, 0x2a78: 0x0001, 0x2a79: 0x0001, 0x2a7a: 0x0001, 0x2a7b: 0x0001,
+	0x2a7c: 0x0001, 0x2a7d: 0x0001, 0x2a7e: 0x0001, 0x2a7f: 0x0001,
+	// Block 0xaa, offset 0x2a80
+	0x2a81: 0x000c,
+	0x2ab8: 0x000c, 0x2ab9: 0x000c, 0x2aba: 0x000c, 0x2abb: 0x000c,
+	0x2abc: 0x000c, 0x2abd: 0x000c, 0x2abe: 0x000c, 0x2abf: 0x000c,
+	// Block 0xab, offset 0x2ac0
+	0x2ac0: 0x000c, 0x2ac1: 0x000c, 0x2ac2: 0x000c, 0x2ac3: 0x000c, 0x2ac4: 0x000c, 0x2ac5: 0x000c,
+	0x2ac6: 0x000c,
+	0x2ad2: 0x000a, 0x2ad3: 0x000a, 0x2ad4: 0x000a, 0x2ad5: 0x000a, 0x2ad6: 0x000a, 0x2ad7: 0x000a,
+	0x2ad8: 0x000a, 0x2ad9: 0x000a, 0x2ada: 0x000a, 0x2adb: 0x000a, 0x2adc: 0x000a, 0x2add: 0x000a,
+	0x2ade: 0x000a, 0x2adf: 0x000a, 0x2ae0: 0x000a, 0x2ae1: 0x000a, 0x2ae2: 0x000a, 0x2ae3: 0x000a,
+	0x2ae4: 0x000a, 0x2ae5: 0x000a,
+	0x2af0: 0x000c, 0x2af3: 0x000c, 0x2af4: 0x000c,
+	0x2aff: 0x000c,
+	// Block 0xac, offset 0x2b00
+	0x2b00: 0x000c, 0x2b01: 0x000c,
+	0x2b33: 0x000c, 0x2b34: 0x000c, 0x2b35: 0x000c,
+	0x2b36: 0x000c, 0x2b39: 0x000c, 0x2b3a: 0x000c,
+	// Block 0xad, offset 0x2b40
+	0x2b40: 0x000c, 0x2b41: 0x000c, 0x2b42: 0x000c,
+	0x2b67: 0x000c, 0x2b68: 0x000c, 0x2b69: 0x000c,
+	0x2b6a: 0x000c, 0x2b6b: 0x000c, 0x2b6d: 0x000c, 0x2b6e: 0x000c, 0x2b6f: 0x000c,
+	0x2b70: 0x000c, 0x2b71: 0x000c, 0x2b72: 0x000c, 0x2b73: 0x000c, 0x2b74: 0x000c,
+	// Block 0xae, offset 0x2b80
+	0x2bb3: 0x000c,
+	// Block 0xaf, offset 0x2bc0
+	0x2bc0: 0x000c, 0x2bc1: 0x000c,
+	0x2bf6: 0x000c, 0x2bf7: 0x000c, 0x2bf8: 0x000c, 0x2bf9: 0x000c, 0x2bfa: 0x000c, 0x2bfb: 0x000c,
+	0x2bfc: 0x000c, 0x2bfd: 0x000c, 0x2bfe: 0x000c,
+	// Block 0xb0, offset 0x2c00
+	0x2c09: 0x000c, 0x2c0a: 0x000c, 0x2c0b: 0x000c,
+	0x2c0c: 0x000c, 0x2c0f: 0x000c,
+	// Block 0xb1, offset 0x2c40
+	0x2c6f: 0x000c,
+	0x2c70: 0x000c, 0x2c71: 0x000c, 0x2c74: 0x000c,
+	0x2c76: 0x000c, 0x2c77: 0x000c,
+	0x2c7e: 0x000c,
+	// Block 0xb2, offset 0x2c80
+	0x2c9f: 0x000c, 0x2ca3: 0x000c,
+	0x2ca4: 0x000c, 0x2ca5: 0x000c, 0x2ca6: 0x000c, 0x2ca7: 0x000c, 0x2ca8: 0x000c, 0x2ca9: 0x000c,
+	0x2caa: 0x000c,
+	// Block 0xb3, offset 0x2cc0
+	0x2cc0: 0x000c,
+	0x2ce6: 0x000c, 0x2ce7: 0x000c, 0x2ce8: 0x000c, 0x2ce9: 0x000c,
+	0x2cea: 0x000c, 0x2ceb: 0x000c, 0x2cec: 0x000c,
+	0x2cf0: 0x000c, 0x2cf1: 0x000c, 0x2cf2: 0x000c, 0x2cf3: 0x000c, 0x2cf4: 0x000c,
+	// Block 0xb4, offset 0x2d00
+	0x2d38: 0x000c, 0x2d39: 0x000c, 0x2d3a: 0x000c, 0x2d3b: 0x000c,
+	0x2d3c: 0x000c, 0x2d3d: 0x000c, 0x2d3e: 0x000c, 0x2d3f: 0x000c,
+	// Block 0xb5, offset 0x2d40
+	0x2d42: 0x000c, 0x2d43: 0x000c, 0x2d44: 0x000c,
+	0x2d46: 0x000c,
+	0x2d5e: 0x000c,
+	// Block 0xb6, offset 0x2d80
+	0x2db3: 0x000c, 0x2db4: 0x000c, 0x2db5: 0x000c,
+	0x2db6: 0x000c, 0x2db7: 0x000c, 0x2db8: 0x000c, 0x2dba: 0x000c,
+	0x2dbf: 0x000c,
+	// Block 0xb7, offset 0x2dc0
+	0x2dc0: 0x000c, 0x2dc2: 0x000c, 0x2dc3: 0x000c,
+	// Block 0xb8, offset 0x2e00
+	0x2e32: 0x000c, 0x2e33: 0x000c, 0x2e34: 0x000c, 0x2e35: 0x000c,
+	0x2e3c: 0x000c, 0x2e3d: 0x000c, 0x2e3f: 0x000c,
+	// Block 0xb9, offset 0x2e40
+	0x2e40: 0x000c,
+	0x2e5c: 0x000c, 0x2e5d: 0x000c,
+	// Block 0xba, offset 0x2e80
+	0x2eb3: 0x000c, 0x2eb4: 0x000c, 0x2eb5: 0x000c,
+	0x2eb6: 0x000c, 0x2eb7: 0x000c, 0x2eb8: 0x000c, 0x2eb9: 0x000c, 0x2eba: 0x000c,
+	0x2ebd: 0x000c, 0x2ebf: 0x000c,
+	// Block 0xbb, offset 0x2ec0
+	0x2ec0: 0x000c,
+	0x2ee0: 0x000a, 0x2ee1: 0x000a, 0x2ee2: 0x000a, 0x2ee3: 0x000a,
+	0x2ee4: 0x000a, 0x2ee5: 0x000a, 0x2ee6: 0x000a, 0x2ee7: 0x000a, 0x2ee8: 0x000a, 0x2ee9: 0x000a,
+	0x2eea: 0x000a, 0x2eeb: 0x000a, 0x2eec: 0x000a,
+	// Block 0xbc, offset 0x2f00
+	0x2f2b: 0x000c, 0x2f2d: 0x000c,
+	0x2f30: 0x000c, 0x2f31: 0x000c, 0x2f32: 0x000c, 0x2f33: 0x000c, 0x2f34: 0x000c, 0x2f35: 0x000c,
+	0x2f37: 0x000c,
+	// Block 0xbd, offset 0x2f40
+	0x2f5d: 0x000c,
+	0x2f5e: 0x000c, 0x2f5f: 0x000c, 0x2f62: 0x000c, 0x2f63: 0x000c,
+	0x2f64: 0x000c, 0x2f65: 0x000c, 0x2f67: 0x000c, 0x2f68: 0x000c, 0x2f69: 0x000c,
+	0x2f6a: 0x000c, 0x2f6b: 0x000c,
+	// Block 0xbe, offset 0x2f80
+	0x2faf: 0x000c,
+	0x2fb0: 0x000c, 0x2fb1: 0x000c, 0x2fb2: 0x000c, 0x2fb3: 0x000c, 0x2fb4: 0x000c, 0x2fb5: 0x000c,
+	0x2fb6: 0x000c, 0x2fb7: 0x000c, 0x2fb9: 0x000c, 0x2fba: 0x000c,
+	// Block 0xbf, offset 0x2fc0
+	0x2ffb: 0x000c,
+	0x2ffc: 0x000c, 0x2ffe: 0x000c,
+	// Block 0xc0, offset 0x3000
+	0x3003: 0x000c,
+	// Block 0xc1, offset 0x3040
+	0x3054: 0x000c, 0x3055: 0x000c, 0x3056: 0x000c, 0x3057: 0x000c,
+	0x305a: 0x000c, 0x305b: 0x000c,
+	0x3060: 0x000c,
+	// Block 0xc2, offset 0x3080
+	0x3081: 0x000c, 0x3082: 0x000c, 0x3083: 0x000c, 0x3084: 0x000c, 0x3085: 0x000c,
+	0x3086: 0x000c, 0x3089: 0x000c, 0x308a: 0x000c,
+	0x30b3: 0x000c, 0x30b4: 0x000c, 0x30b5: 0x000c,
+	0x30b6: 0x000c, 0x30b7: 0x000c, 0x30b8: 0x000c, 0x30bb: 0x000c,
+	0x30bc: 0x000c, 0x30bd: 0x000c, 0x30be: 0x000c,
+	// Block 0xc3, offset 0x30c0
+	0x30c7: 0x000c,
+	0x30d1: 0x000c,
+	0x30d2: 0x000c, 0x30d3: 0x000c, 0x30d4: 0x000c, 0x30d5: 0x000c, 0x30d6: 0x000c,
+	0x30d9: 0x000c, 0x30da: 0x000c, 0x30db: 0x000c,
+	// Block 0xc4, offset 0x3100
+	0x310a: 0x000c, 0x310b: 0x000c,
+	0x310c: 0x000c, 0x310d: 0x000c, 0x310e: 0x000c, 0x310f: 0x000c, 0x3110: 0x000c, 0x3111: 0x000c,
+	0x3112: 0x000c, 0x3113: 0x000c, 0x3114: 0x000c, 0x3115: 0x000c, 0x3116: 0x000c,
+	0x3118: 0x000c, 0x3119: 0x000c,
+	// Block 0xc5, offset 0x3140
+	0x3170: 0x000c, 0x3171: 0x000c, 0x3172: 0x000c, 0x3173: 0x000c, 0x3174: 0x000c, 0x3175: 0x000c,
+	0x3176: 0x000c, 0x3178: 0x000c, 0x3179: 0x000c, 0x317a: 0x000c, 0x317b: 0x000c,
+	0x317c: 0x000c, 0x317d: 0x000c,
+	// Block 0xc6, offset 0x3180
+	0x3192: 0x000c, 0x3193: 0x000c, 0x3194: 0x000c, 0x3195: 0x000c, 0x3196: 0x000c, 0x3197: 0x000c,
+	0x3198: 0x000c, 0x3199: 0x000c, 0x319a: 0x000c, 0x319b: 0x000c, 0x319c: 0x000c, 0x319d: 0x000c,
+	0x319e: 0x000c, 0x319f: 0x000c, 0x31a0: 0x000c, 0x31a1: 0x000c, 0x31a2: 0x000c, 0x31a3: 0x000c,
+	0x31a4: 0x000c, 0x31a5: 0x000c, 0x31a6: 0x000c, 0x31a7: 0x000c,
+	0x31aa: 0x000c, 0x31ab: 0x000c, 0x31ac: 0x000c, 0x31ad: 0x000c, 0x31ae: 0x000c, 0x31af: 0x000c,
+	0x31b0: 0x000c, 0x31b2: 0x000c, 0x31b3: 0x000c, 0x31b5: 0x000c,
+	0x31b6: 0x000c,
+	// Block 0xc7, offset 0x31c0
+	0x31f1: 0x000c, 0x31f2: 0x000c, 0x31f3: 0x000c, 0x31f4: 0x000c, 0x31f5: 0x000c,
+	0x31f6: 0x000c, 0x31fa: 0x000c,
+	0x31fc: 0x000c, 0x31fd: 0x000c, 0x31ff: 0x000c,
+	// Block 0xc8, offset 0x3200
+	0x3200: 0x000c, 0x3201: 0x000c, 0x3202: 0x000c, 0x3203: 0x000c, 0x3204: 0x000c, 0x3205: 0x000c,
+	0x3207: 0x000c,
+	// Block 0xc9, offset 0x3240
+	0x3250: 0x000c, 0x3251: 0x000c,
+	0x3255: 0x000c, 0x3257: 0x000c,
+	// Block 0xca, offset 0x3280
+	0x32b3: 0x000c, 0x32b4: 0x000c,
+	// Block 0xcb, offset 0x32c0
+	0x32c0: 0x000c, 0x32c1: 0x000c,
+	0x32f6: 0x000c, 0x32f7: 0x000c, 0x32f8: 0x000c, 0x32f9: 0x000c, 0x32fa: 0x000c,
+	// Block 0xcc, offset 0x3300
+	0x3300: 0x000c, 0x3302: 0x000c,
+	// Block 0xcd, offset 0x3340
+	0x3355: 0x000a, 0x3356: 0x000a, 0x3357: 0x000a,
+	0x3358: 0x000a, 0x3359: 0x000a, 0x335a: 0x000a, 0x335b: 0x000a, 0x335c: 0x000a, 0x335d: 0x0004,
+	0x335e: 0x0004, 0x335f: 0x0004, 0x3360: 0x0004, 0x3361: 0x000a, 0x3362: 0x000a, 0x3363: 0x000a,
+	0x3364: 0x000a, 0x3365: 0x000a, 0x3366: 0x000a, 0x3367: 0x000a, 0x3368: 0x000a, 0x3369: 0x000a,
+	0x336a: 0x000a, 0x336b: 0x000a, 0x336c: 0x000a, 0x336d: 0x000a, 0x336e: 0x000a, 0x336f: 0x000a,
+	0x3370: 0x000a, 0x3371: 0x000a,
+	// Block 0xce, offset 0x3380
+	0x3380: 0x000c,
+	0x3387: 0x000c, 0x3388: 0x000c, 0x3389: 0x000c, 0x338a: 0x000c, 0x338b: 0x000c,
+	0x338c: 0x000c, 0x338d: 0x000c, 0x338e: 0x000c, 0x338f: 0x000c, 0x3390: 0x000c, 0x3391: 0x000c,
+	0x3392: 0x000c, 0x3393: 0x000c, 0x3394: 0x000c, 0x3395: 0x000c,
+	// Block 0xcf, offset 0x33c0
+	0x33f0: 0x000c, 0x33f1: 0x000c, 0x33f2: 0x000c, 0x33f3: 0x000c, 0x33f4: 0x000c,
+	// Block 0xd0, offset 0x3400
+	0x3430: 0x000c, 0x3431: 0x000c, 0x3432: 0x000c, 0x3433: 0x000c, 0x3434: 0x000c, 0x3435: 0x000c,
+	0x3436: 0x000c,
+	// Block 0xd1, offset 0x3440
+	0x344f: 0x000c,
+	// Block 0xd2, offset 0x3480
+	0x348f: 0x000c, 0x3490: 0x000c, 0x3491: 0x000c,
+	0x3492: 0x000c,
+	// Block 0xd3, offset 0x34c0
+	0x34e2: 0x000a,
+	0x34e4: 0x000c,
+	// Block 0xd4, offset 0x3500
+	0x351d: 0x000c,
+	0x351e: 0x000c, 0x3520: 0x000b, 0x3521: 0x000b, 0x3522: 0x000b, 0x3523: 0x000b,
+	// Block 0xd5, offset 0x3540
+	0x3540: 0x000c, 0x3541: 0x000c, 0x3542: 0x000c, 0x3543: 0x000c, 0x3544: 0x000c, 0x3545: 0x000c,
+	0x3546: 0x000c, 0x3547: 0x000c, 0x3548: 0x000c, 0x3549: 0x000c, 0x354a: 0x000c, 0x354b: 0x000c,
+	0x354c: 0x000c, 0x354d: 0x000c, 0x354e: 0x000c, 0x354f: 0x000c, 0x3550: 0x000c, 0x3551: 0x000c,
+	0x3552: 0x000c, 0x3553: 0x000c, 0x3554: 0x000c, 0x3555: 0x000c, 0x3556: 0x000c, 0x3557: 0x000c,
+	0x3558: 0x000c, 0x3559: 0x000c, 0x355a: 0x000c, 0x355b: 0x000c, 0x355c: 0x000c, 0x355d: 0x000c,
+	0x355e: 0x000c, 0x355f: 0x000c, 0x3560: 0x000c, 0x3561: 0x000c, 0x3562: 0x000c, 0x3563: 0x000c,
+	0x3564: 0x000c, 0x3565: 0x000c, 0x3566: 0x000c, 0x3567: 0x000c, 0x3568: 0x000c, 0x3569: 0x000c,
+	0x356a: 0x000c, 0x356b: 0x000c, 0x356c: 0x000c, 0x356d: 0x000c,
+	0x3570: 0x000c, 0x3571: 0x000c, 0x3572: 0x000c, 0x3573: 0x000c, 0x3574: 0x000c, 0x3575: 0x000c,
+	0x3576: 0x000c, 0x3577: 0x000c, 0x3578: 0x000c, 0x3579: 0x000c, 0x357a: 0x000c, 0x357b: 0x000c,
+	0x357c: 0x000c, 0x357d: 0x000c, 0x357e: 0x000c, 0x357f: 0x000c,
+	// Block 0xd6, offset 0x3580
+	0x3580: 0x000c, 0x3581: 0x000c, 0x3582: 0x000c, 0x3583: 0x000c, 0x3584: 0x000c, 0x3585: 0x000c,
+	0x3586: 0x000c,
+	// Block 0xd7, offset 0x35c0
+	0x35e7: 0x000c, 0x35e8: 0x000c, 0x35e9: 0x000c,
+	0x35f3: 0x000b, 0x35f4: 0x000b, 0x35f5: 0x000b,
+	0x35f6: 0x000b, 0x35f7: 0x000b, 0x35f8: 0x000b, 0x35f9: 0x000b, 0x35fa: 0x000b, 0x35fb: 0x000c,
+	0x35fc: 0x000c, 0x35fd: 0x000c, 0x35fe: 0x000c, 0x35ff: 0x000c,
+	// Block 0xd8, offset 0x3600
+	0x3600: 0x000c, 0x3601: 0x000c, 0x3602: 0x000c, 0x3605: 0x000c,
+	0x3606: 0x000c, 0x3607: 0x000c, 0x3608: 0x000c, 0x3609: 0x000c, 0x360a: 0x000c, 0x360b: 0x000c,
+	0x362a: 0x000c, 0x362b: 0x000c, 0x362c: 0x000c, 0x362d: 0x000c,
+	// Block 0xd9, offset 0x3640
+	0x3669: 0x000a,
+	0x366a: 0x000a,
+	// Block 0xda, offset 0x3680
+	0x3680: 0x000a, 0x3681: 0x000a, 0x3682: 0x000c, 0x3683: 0x000c, 0x3684: 0x000c, 0x3685: 0x000a,
+	// Block 0xdb, offset 0x36c0
+	0x36c0: 0x000a, 0x36c1: 0x000a, 0x36c2: 0x000a, 0x36c3: 0x000a, 0x36c4: 0x000a, 0x36c5: 0x000a,
+	0x36c6: 0x000a, 0x36c7: 0x000a, 0x36c8: 0x000a, 0x36c9: 0x000a, 0x36ca: 0x000a, 0x36cb: 0x000a,
+	0x36cc: 0x000a, 0x36cd: 0x000a, 0x36ce: 0x000a, 0x36cf: 0x000a, 0x36d0: 0x000a, 0x36d1: 0x000a,
+	0x36d2: 0x000a, 0x36d3: 0x000a, 0x36d4: 0x000a, 0x36d5: 0x000a, 0x36d6: 0x000a,
+	// Block 0xdc, offset 0x3700
+	0x371b: 0x000a,
+	// Block 0xdd, offset 0x3740
+	0x3755: 0x000a,
+	// Block 0xde, offset 0x3780
+	0x378f: 0x000a,
+	// Block 0xdf, offset 0x37c0
+	0x37c9: 0x000a,
+	// Block 0xe0, offset 0x3800
+	0x3803: 0x000a,
+	0x380e: 0x0002, 0x380f: 0x0002, 0x3810: 0x0002, 0x3811: 0x0002,
+	0x3812: 0x0002, 0x3813: 0x0002, 0x3814: 0x0002, 0x3815: 0x0002, 0x3816: 0x0002, 0x3817: 0x0002,
+	0x3818: 0x0002, 0x3819: 0x0002, 0x381a: 0x0002, 0x381b: 0x0002, 0x381c: 0x0002, 0x381d: 0x0002,
+	0x381e: 0x0002, 0x381f: 0x0002, 0x3820: 0x0002, 0x3821: 0x0002, 0x3822: 0x0002, 0x3823: 0x0002,
+	0x3824: 0x0002, 0x3825: 0x0002, 0x3826: 0x0002, 0x3827: 0x0002, 0x3828: 0x0002, 0x3829: 0x0002,
+	0x382a: 0x0002, 0x382b: 0x0002, 0x382c: 0x0002, 0x382d: 0x0002, 0x382e: 0x0002, 0x382f: 0x0002,
+	0x3830: 0x0002, 0x3831: 0x0002, 0x3832: 0x0002, 0x3833: 0x0002, 0x3834: 0x0002, 0x3835: 0x0002,
+	0x3836: 0x0002, 0x3837: 0x0002, 0x3838: 0x0002, 0x3839: 0x0002, 0x383a: 0x0002, 0x383b: 0x0002,
+	0x383c: 0x0002, 0x383d: 0x0002, 0x383e: 0x0002, 0x383f: 0x0002,
+	// Block 0xe1, offset 0x3840
+	0x3840: 0x000c, 0x3841: 0x000c, 0x3842: 0x000c, 0x3843: 0x000c, 0x3844: 0x000c, 0x3845: 0x000c,
+	0x3846: 0x000c, 0x3847: 0x000c, 0x3848: 0x000c, 0x3849: 0x000c, 0x384a: 0x000c, 0x384b: 0x000c,
+	0x384c: 0x000c, 0x384d: 0x000c, 0x384e: 0x000c, 0x384f: 0x000c, 0x3850: 0x000c, 0x3851: 0x000c,
+	0x3852: 0x000c, 0x3853: 0x000c, 0x3854: 0x000c, 0x3855: 0x000c, 0x3856: 0x000c, 0x3857: 0x000c,
+	0x3858: 0x000c, 0x3859: 0x000c, 0x385a: 0x000c, 0x385b: 0x000c, 0x385c: 0x000c, 0x385d: 0x000c,
+	0x385e: 0x000c, 0x385f: 0x000c, 0x3860: 0x000c, 0x3861: 0x000c, 0x3862: 0x000c, 0x3863: 0x000c,
+	0x3864: 0x000c, 0x3865: 0x000c, 0x3866: 0x000c, 0x3867: 0x000c, 0x3868: 0x000c, 0x3869: 0x000c,
+	0x386a: 0x000c, 0x386b: 0x000c, 0x386c: 0x000c, 0x386d: 0x000c, 0x386e: 0x000c, 0x386f: 0x000c,
+	0x3870: 0x000c, 0x3871: 0x000c, 0x3872: 0x000c, 0x3873: 0x000c, 0x3874: 0x000c, 0x3875: 0x000c,
+	0x3876: 0x000c, 0x387b: 0x000c,
+	0x387c: 0x000c, 0x387d: 0x000c, 0x387e: 0x000c, 0x387f: 0x000c,
+	// Block 0xe2, offset 0x3880
+	0x3880: 0x000c, 0x3881: 0x000c, 0x3882: 0x000c, 0x3883: 0x000c, 0x3884: 0x000c, 0x3885: 0x000c,
+	0x3886: 0x000c, 0x3887: 0x000c, 0x3888: 0x000c, 0x3889: 0x000c, 0x388a: 0x000c, 0x388b: 0x000c,
+	0x388c: 0x000c, 0x388d: 0x000c, 0x388e: 0x000c, 0x388f: 0x000c, 0x3890: 0x000c, 0x3891: 0x000c,
+	0x3892: 0x000c, 0x3893: 0x000c, 0x3894: 0x000c, 0x3895: 0x000c, 0x3896: 0x000c, 0x3897: 0x000c,
+	0x3898: 0x000c, 0x3899: 0x000c, 0x389a: 0x000c, 0x389b: 0x000c, 0x389c: 0x000c, 0x389d: 0x000c,
+	0x389e: 0x000c, 0x389f: 0x000c, 0x38a0: 0x000c, 0x38a1: 0x000c, 0x38a2: 0x000c, 0x38a3: 0x000c,
+	0x38a4: 0x000c, 0x38a5: 0x000c, 0x38a6: 0x000c, 0x38a7: 0x000c, 0x38a8: 0x000c, 0x38a9: 0x000c,
+	0x38aa: 0x000c, 0x38ab: 0x000c, 0x38ac: 0x000c,
+	0x38b5: 0x000c,
+	// Block 0xe3, offset 0x38c0
+	0x38c4: 0x000c,
+	0x38db: 0x000c, 0x38dc: 0x000c, 0x38dd: 0x000c,
+	0x38de: 0x000c, 0x38df: 0x000c, 0x38e1: 0x000c, 0x38e2: 0x000c, 0x38e3: 0x000c,
+	0x38e4: 0x000c, 0x38e5: 0x000c, 0x38e6: 0x000c, 0x38e7: 0x000c, 0x38e8: 0x000c, 0x38e9: 0x000c,
+	0x38ea: 0x000c, 0x38eb: 0x000c, 0x38ec: 0x000c, 0x38ed: 0x000c, 0x38ee: 0x000c, 0x38ef: 0x000c,
+	// Block 0xe4, offset 0x3900
+	0x3900: 0x000c, 0x3901: 0x000c, 0x3902: 0x000c, 0x3903: 0x000c, 0x3904: 0x000c, 0x3905: 0x000c,
+	0x3906: 0x000c, 0x3908: 0x000c, 0x3909: 0x000c, 0x390a: 0x000c, 0x390b: 0x000c,
+	0x390c: 0x000c, 0x390d: 0x000c, 0x390e: 0x000c, 0x390f: 0x000c, 0x3910: 0x000c, 0x3911: 0x000c,
+	0x3912: 0x000c, 0x3913: 0x000c, 0x3914: 0x000c, 0x3915: 0x000c, 0x3916: 0x000c, 0x3917: 0x000c,
+	0x3918: 0x000c, 0x391b: 0x000c, 0x391c: 0x000c, 0x391d: 0x000c,
+	0x391e: 0x000c, 0x391f: 0x000c, 0x3920: 0x000c, 0x3921: 0x000c, 0x3923: 0x000c,
+	0x3924: 0x000c, 0x3926: 0x000c, 0x3927: 0x000c, 0x3928: 0x000c, 0x3929: 0x000c,
+	0x392a: 0x000c,
+	// Block 0xe5, offset 0x3940
+	0x396e: 0x000c,
+	// Block 0xe6, offset 0x3980
+	0x39ac: 0x000c, 0x39ad: 0x000c, 0x39ae: 0x000c, 0x39af: 0x000c,
+	0x39bf: 0x0004,
+	// Block 0xe7, offset 0x39c0
+	0x39ec: 0x000c, 0x39ed: 0x000c, 0x39ee: 0x000c, 0x39ef: 0x000c,
+	// Block 0xe8, offset 0x3a00
+	0x3a00: 0x0001, 0x3a01: 0x0001, 0x3a02: 0x0001, 0x3a03: 0x0001, 0x3a04: 0x0001, 0x3a05: 0x0001,
+	0x3a06: 0x0001, 0x3a07: 0x0001, 0x3a08: 0x0001, 0x3a09: 0x0001, 0x3a0a: 0x0001, 0x3a0b: 0x0001,
+	0x3a0c: 0x0001, 0x3a0d: 0x0001, 0x3a0e: 0x0001, 0x3a0f: 0x0001, 0x3a10: 0x000c, 0x3a11: 0x000c,
+	0x3a12: 0x000c, 0x3a13: 0x000c, 0x3a14: 0x000c, 0x3a15: 0x000c, 0x3a16: 0x000c, 0x3a17: 0x0001,
+	0x3a18: 0x0001, 0x3a19: 0x0001, 0x3a1a: 0x0001, 0x3a1b: 0x0001, 0x3a1c: 0x0001, 0x3a1d: 0x0001,
+	0x3a1e: 0x0001, 0x3a1f: 0x0001, 0x3a20: 0x0001, 0x3a21: 0x0001, 0x3a22: 0x0001, 0x3a23: 0x0001,
+	0x3a24: 0x0001, 0x3a25: 0x0001, 0x3a26: 0x0001, 0x3a27: 0x0001, 0x3a28: 0x0001, 0x3a29: 0x0001,
+	0x3a2a: 0x0001, 0x3a2b: 0x0001, 0x3a2c: 0x0001, 0x3a2d: 0x0001, 0x3a2e: 0x0001, 0x3a2f: 0x0001,
+	0x3a30: 0x0001, 0x3a31: 0x0001, 0x3a32: 0x0001, 0x3a33: 0x0001, 0x3a34: 0x0001, 0x3a35: 0x0001,
+	0x3a36: 0x0001, 0x3a37: 0x0001, 0x3a38: 0x0001, 0x3a39: 0x0001, 0x3a3a: 0x0001, 0x3a3b: 0x0001,
+	0x3a3c: 0x0001, 0x3a3d: 0x0001, 0x3a3e: 0x0001, 0x3a3f: 0x0001,
+	// Block 0xe9, offset 0x3a40
+	0x3a40: 0x0001, 0x3a41: 0x0001, 0x3a42: 0x0001, 0x3a43: 0x0001, 0x3a44: 0x000c, 0x3a45: 0x000c,
+	0x3a46: 0x000c, 0x3a47: 0x000c, 0x3a48: 0x000c, 0x3a49: 0x000c, 0x3a4a: 0x000c, 0x3a4b: 0x0001,
+	0x3a4c: 0x0001, 0x3a4d: 0x0001, 0x3a4e: 0x0001, 0x3a4f: 0x0001, 0x3a50: 0x0001, 0x3a51: 0x0001,
+	0x3a52: 0x0001, 0x3a53: 0x0001, 0x3a54: 0x0001, 0x3a55: 0x0001, 0x3a56: 0x0001, 0x3a57: 0x0001,
+	0x3a58: 0x0001, 0x3a59: 0x0001, 0x3a5a: 0x0001, 0x3a5b: 0x0001, 0x3a5c: 0x0001, 0x3a5d: 0x0001,
+	0x3a5e: 0x0001, 0x3a5f: 0x0001, 0x3a60: 0x0001, 0x3a61: 0x0001, 0x3a62: 0x0001, 0x3a63: 0x0001,
+	0x3a64: 0x0001, 0x3a65: 0x0001, 0x3a66: 0x0001, 0x3a67: 0x0001, 0x3a68: 0x0001, 0x3a69: 0x0001,
+	0x3a6a: 0x0001, 0x3a6b: 0x0001, 0x3a6c: 0x0001, 0x3a6d: 0x0001, 0x3a6e: 0x0001, 0x3a6f: 0x0001,
+	0x3a70: 0x0001, 0x3a71: 0x0001, 0x3a72: 0x0001, 0x3a73: 0x0001, 0x3a74: 0x0001, 0x3a75: 0x0001,
+	0x3a76: 0x0001, 0x3a77: 0x0001, 0x3a78: 0x0001, 0x3a79: 0x0001, 0x3a7a: 0x0001, 0x3a7b: 0x0001,
+	0x3a7c: 0x0001, 0x3a7d: 0x0001, 0x3a7e: 0x0001, 0x3a7f: 0x0001,
+	// Block 0xea, offset 0x3a80
+	0x3a80: 0x0001, 0x3a81: 0x0001, 0x3a82: 0x0001, 0x3a83: 0x0001, 0x3a84: 0x0001, 0x3a85: 0x0001,
+	0x3a86: 0x0001, 0x3a87: 0x0001, 0x3a88: 0x0001, 0x3a89: 0x0001, 0x3a8a: 0x0001, 0x3a8b: 0x0001,
+	0x3a8c: 0x0001, 0x3a8d: 0x0001, 0x3a8e: 0x0001, 0x3a8f: 0x0001, 0x3a90: 0x0001, 0x3a91: 0x0001,
+	0x3a92: 0x0001, 0x3a93: 0x0001, 0x3a94: 0x0001, 0x3a95: 0x0001, 0x3a96: 0x0001, 0x3a97: 0x0001,
+	0x3a98: 0x0001, 0x3a99: 0x0001, 0x3a9a: 0x0001, 0x3a9b: 0x0001, 0x3a9c: 0x0001, 0x3a9d: 0x0001,
+	0x3a9e: 0x0001, 0x3a9f: 0x0001, 0x3aa0: 0x0001, 0x3aa1: 0x0001, 0x3aa2: 0x0001, 0x3aa3: 0x0001,
+	0x3aa4: 0x0001, 0x3aa5: 0x0001, 0x3aa6: 0x0001, 0x3aa7: 0x0001, 0x3aa8: 0x0001, 0x3aa9: 0x0001,
+	0x3aaa: 0x0001, 0x3aab: 0x0001, 0x3aac: 0x0001, 0x3aad: 0x0001, 0x3aae: 0x0001, 0x3aaf: 0x0001,
+	0x3ab0: 0x0001, 0x3ab1: 0x000d, 0x3ab2: 0x000d, 0x3ab3: 0x000d, 0x3ab4: 0x000d, 0x3ab5: 0x000d,
+	0x3ab6: 0x000d, 0x3ab7: 0x000d, 0x3ab8: 0x000d, 0x3ab9: 0x000d, 0x3aba: 0x000d, 0x3abb: 0x000d,
+	0x3abc: 0x000d, 0x3abd: 0x000d, 0x3abe: 0x000d, 0x3abf: 0x000d,
+	// Block 0xeb, offset 0x3ac0
+	0x3ac0: 0x000d, 0x3ac1: 0x000d, 0x3ac2: 0x000d, 0x3ac3: 0x000d, 0x3ac4: 0x000d, 0x3ac5: 0x000d,
+	0x3ac6: 0x000d, 0x3ac7: 0x000d, 0x3ac8: 0x000d, 0x3ac9: 0x000d, 0x3aca: 0x000d, 0x3acb: 0x000d,
+	0x3acc: 0x000d, 0x3acd: 0x000d, 0x3ace: 0x000d, 0x3acf: 0x000d, 0x3ad0: 0x000d, 0x3ad1: 0x000d,
+	0x3ad2: 0x000d, 0x3ad3: 0x000d, 0x3ad4: 0x000d, 0x3ad5: 0x000d, 0x3ad6: 0x000d, 0x3ad7: 0x000d,
+	0x3ad8: 0x000d, 0x3ad9: 0x000d, 0x3ada: 0x000d, 0x3adb: 0x000d, 0x3adc: 0x000d, 0x3add: 0x000d,
+	0x3ade: 0x000d, 0x3adf: 0x000d, 0x3ae0: 0x000d, 0x3ae1: 0x000d, 0x3ae2: 0x000d, 0x3ae3: 0x000d,
+	0x3ae4: 0x000d, 0x3ae5: 0x000d, 0x3ae6: 0x000d, 0x3ae7: 0x000d, 0x3ae8: 0x000d, 0x3ae9: 0x000d,
+	0x3aea: 0x000d, 0x3aeb: 0x000d, 0x3aec: 0x000d, 0x3aed: 0x000d, 0x3aee: 0x000d, 0x3aef: 0x000d,
+	0x3af0: 0x000d, 0x3af1: 0x000d, 0x3af2: 0x000d, 0x3af3: 0x000d, 0x3af4: 0x000d, 0x3af5: 0x0001,
+	0x3af6: 0x0001, 0x3af7: 0x0001, 0x3af8: 0x0001, 0x3af9: 0x0001, 0x3afa: 0x0001, 0x3afb: 0x0001,
+	0x3afc: 0x0001, 0x3afd: 0x0001, 0x3afe: 0x0001, 0x3aff: 0x0001,
+	// Block 0xec, offset 0x3b00
+	0x3b00: 0x0001, 0x3b01: 0x000d, 0x3b02: 0x000d, 0x3b03: 0x000d, 0x3b04: 0x000d, 0x3b05: 0x000d,
+	0x3b06: 0x000d, 0x3b07: 0x000d, 0x3b08: 0x000d, 0x3b09: 0x000d, 0x3b0a: 0x000d, 0x3b0b: 0x000d,
+	0x3b0c: 0x000d, 0x3b0d: 0x000d, 0x3b0e: 0x000d, 0x3b0f: 0x000d, 0x3b10: 0x000d, 0x3b11: 0x000d,
+	0x3b12: 0x000d, 0x3b13: 0x000d, 0x3b14: 0x000d, 0x3b15: 0x000d, 0x3b16: 0x000d, 0x3b17: 0x000d,
+	0x3b18: 0x000d, 0x3b19: 0x000d, 0x3b1a: 0x000d, 0x3b1b: 0x000d, 0x3b1c: 0x000d, 0x3b1d: 0x000d,
+	0x3b1e: 0x000d, 0x3b1f: 0x000d, 0x3b20: 0x000d, 0x3b21: 0x000d, 0x3b22: 0x000d, 0x3b23: 0x000d,
+	0x3b24: 0x000d, 0x3b25: 0x000d, 0x3b26: 0x000d, 0x3b27: 0x000d, 0x3b28: 0x000d, 0x3b29: 0x000d,
+	0x3b2a: 0x000d, 0x3b2b: 0x000d, 0x3b2c: 0x000d, 0x3b2d: 0x000d, 0x3b2e: 0x000d, 0x3b2f: 0x000d,
+	0x3b30: 0x000d, 0x3b31: 0x000d, 0x3b32: 0x000d, 0x3b33: 0x000d, 0x3b34: 0x000d, 0x3b35: 0x000d,
+	0x3b36: 0x000d, 0x3b37: 0x000d, 0x3b38: 0x000d, 0x3b39: 0x000d, 0x3b3a: 0x000d, 0x3b3b: 0x000d,
+	0x3b3c: 0x000d, 0x3b3d: 0x000d, 0x3b3e: 0x0001, 0x3b3f: 0x0001,
+	// Block 0xed, offset 0x3b40
+	0x3b40: 0x000d, 0x3b41: 0x000d, 0x3b42: 0x000d, 0x3b43: 0x000d, 0x3b44: 0x000d, 0x3b45: 0x000d,
+	0x3b46: 0x000d, 0x3b47: 0x000d, 0x3b48: 0x000d, 0x3b49: 0x000d, 0x3b4a: 0x000d, 0x3b4b: 0x000d,
+	0x3b4c: 0x000d, 0x3b4d: 0x000d, 0x3b4e: 0x000d, 0x3b4f: 0x000d, 0x3b50: 0x000d, 0x3b51: 0x000d,
+	0x3b52: 0x000d, 0x3b53: 0x000d, 0x3b54: 0x000d, 0x3b55: 0x000d, 0x3b56: 0x000d, 0x3b57: 0x000d,
+	0x3b58: 0x000d, 0x3b59: 0x000d, 0x3b5a: 0x000d, 0x3b5b: 0x000d, 0x3b5c: 0x000d, 0x3b5d: 0x000d,
+	0x3b5e: 0x000d, 0x3b5f: 0x000d, 0x3b60: 0x000d, 0x3b61: 0x000d, 0x3b62: 0x000d, 0x3b63: 0x000d,
+	0x3b64: 0x000d, 0x3b65: 0x000d, 0x3b66: 0x000d, 0x3b67: 0x000d, 0x3b68: 0x000d, 0x3b69: 0x000d,
+	0x3b6a: 0x000d, 0x3b6b: 0x000d, 0x3b6c: 0x000d, 0x3b6d: 0x000d, 0x3b6e: 0x000d, 0x3b6f: 0x000d,
+	0x3b70: 0x000a, 0x3b71: 0x000a, 0x3b72: 0x000d, 0x3b73: 0x000d, 0x3b74: 0x000d, 0x3b75: 0x000d,
+	0x3b76: 0x000d, 0x3b77: 0x000d, 0x3b78: 0x000d, 0x3b79: 0x000d, 0x3b7a: 0x000d, 0x3b7b: 0x000d,
+	0x3b7c: 0x000d, 0x3b7d: 0x000d, 0x3b7e: 0x000d, 0x3b7f: 0x000d,
+	// Block 0xee, offset 0x3b80
+	0x3b80: 0x000a, 0x3b81: 0x000a, 0x3b82: 0x000a, 0x3b83: 0x000a, 0x3b84: 0x000a, 0x3b85: 0x000a,
+	0x3b86: 0x000a, 0x3b87: 0x000a, 0x3b88: 0x000a, 0x3b89: 0x000a, 0x3b8a: 0x000a, 0x3b8b: 0x000a,
+	0x3b8c: 0x000a, 0x3b8d: 0x000a, 0x3b8e: 0x000a, 0x3b8f: 0x000a, 0x3b90: 0x000a, 0x3b91: 0x000a,
+	0x3b92: 0x000a, 0x3b93: 0x000a, 0x3b94: 0x000a, 0x3b95: 0x000a, 0x3b96: 0x000a, 0x3b97: 0x000a,
+	0x3b98: 0x000a, 0x3b99: 0x000a, 0x3b9a: 0x000a, 0x3b9b: 0x000a, 0x3b9c: 0x000a, 0x3b9d: 0x000a,
+	0x3b9e: 0x000a, 0x3b9f: 0x000a, 0x3ba0: 0x000a, 0x3ba1: 0x000a, 0x3ba2: 0x000a, 0x3ba3: 0x000a,
+	0x3ba4: 0x000a, 0x3ba5: 0x000a, 0x3ba6: 0x000a, 0x3ba7: 0x000a, 0x3ba8: 0x000a, 0x3ba9: 0x000a,
+	0x3baa: 0x000a, 0x3bab: 0x000a,
+	0x3bb0: 0x000a, 0x3bb1: 0x000a, 0x3bb2: 0x000a, 0x3bb3: 0x000a, 0x3bb4: 0x000a, 0x3bb5: 0x000a,
+	0x3bb6: 0x000a, 0x3bb7: 0x000a, 0x3bb8: 0x000a, 0x3bb9: 0x000a, 0x3bba: 0x000a, 0x3bbb: 0x000a,
+	0x3bbc: 0x000a, 0x3bbd: 0x000a, 0x3bbe: 0x000a, 0x3bbf: 0x000a,
+	// Block 0xef, offset 0x3bc0
+	0x3bc0: 0x000a, 0x3bc1: 0x000a, 0x3bc2: 0x000a, 0x3bc3: 0x000a, 0x3bc4: 0x000a, 0x3bc5: 0x000a,
+	0x3bc6: 0x000a, 0x3bc7: 0x000a, 0x3bc8: 0x000a, 0x3bc9: 0x000a, 0x3bca: 0x000a, 0x3bcb: 0x000a,
+	0x3bcc: 0x000a, 0x3bcd: 0x000a, 0x3bce: 0x000a, 0x3bcf: 0x000a, 0x3bd0: 0x000a, 0x3bd1: 0x000a,
+	0x3bd2: 0x000a, 0x3bd3: 0x000a,
+	0x3be0: 0x000a, 0x3be1: 0x000a, 0x3be2: 0x000a, 0x3be3: 0x000a,
+	0x3be4: 0x000a, 0x3be5: 0x000a, 0x3be6: 0x000a, 0x3be7: 0x000a, 0x3be8: 0x000a, 0x3be9: 0x000a,
+	0x3bea: 0x000a, 0x3beb: 0x000a, 0x3bec: 0x000a, 0x3bed: 0x000a, 0x3bee: 0x000a,
+	0x3bf1: 0x000a, 0x3bf2: 0x000a, 0x3bf3: 0x000a, 0x3bf4: 0x000a, 0x3bf5: 0x000a,
+	0x3bf6: 0x000a, 0x3bf7: 0x000a, 0x3bf8: 0x000a, 0x3bf9: 0x000a, 0x3bfa: 0x000a, 0x3bfb: 0x000a,
+	0x3bfc: 0x000a, 0x3bfd: 0x000a, 0x3bfe: 0x000a, 0x3bff: 0x000a,
+	// Block 0xf0, offset 0x3c00
+	0x3c01: 0x000a, 0x3c02: 0x000a, 0x3c03: 0x000a, 0x3c04: 0x000a, 0x3c05: 0x000a,
+	0x3c06: 0x000a, 0x3c07: 0x000a, 0x3c08: 0x000a, 0x3c09: 0x000a, 0x3c0a: 0x000a, 0x3c0b: 0x000a,
+	0x3c0c: 0x000a, 0x3c0d: 0x000a, 0x3c0e: 0x000a, 0x3c0f: 0x000a, 0x3c11: 0x000a,
+	0x3c12: 0x000a, 0x3c13: 0x000a, 0x3c14: 0x000a, 0x3c15: 0x000a, 0x3c16: 0x000a, 0x3c17: 0x000a,
+	0x3c18: 0x000a, 0x3c19: 0x000a, 0x3c1a: 0x000a, 0x3c1b: 0x000a, 0x3c1c: 0x000a, 0x3c1d: 0x000a,
+	0x3c1e: 0x000a, 0x3c1f: 0x000a, 0x3c20: 0x000a, 0x3c21: 0x000a, 0x3c22: 0x000a, 0x3c23: 0x000a,
+	0x3c24: 0x000a, 0x3c25: 0x000a, 0x3c26: 0x000a, 0x3c27: 0x000a, 0x3c28: 0x000a, 0x3c29: 0x000a,
+	0x3c2a: 0x000a, 0x3c2b: 0x000a, 0x3c2c: 0x000a, 0x3c2d: 0x000a, 0x3c2e: 0x000a, 0x3c2f: 0x000a,
+	0x3c30: 0x000a, 0x3c31: 0x000a, 0x3c32: 0x000a, 0x3c33: 0x000a, 0x3c34: 0x000a, 0x3c35: 0x000a,
+	// Block 0xf1, offset 0x3c40
+	0x3c40: 0x0002, 0x3c41: 0x0002, 0x3c42: 0x0002, 0x3c43: 0x0002, 0x3c44: 0x0002, 0x3c45: 0x0002,
+	0x3c46: 0x0002, 0x3c47: 0x0002, 0x3c48: 0x0002, 0x3c49: 0x0002, 0x3c4a: 0x0002, 0x3c4b: 0x000a,
+	0x3c4c: 0x000a, 0x3c4d: 0x000a, 0x3c4e: 0x000a, 0x3c4f: 0x000a,
+	0x3c6f: 0x000a,
+	// Block 0xf2, offset 0x3c80
+	0x3caa: 0x000a, 0x3cab: 0x000a, 0x3cac: 0x000a, 0x3cad: 0x000a, 0x3cae: 0x000a, 0x3caf: 0x000a,
+	// Block 0xf3, offset 0x3cc0
+	0x3ced: 0x000a,
+	// Block 0xf4, offset 0x3d00
+	0x3d20: 0x000a, 0x3d21: 0x000a, 0x3d22: 0x000a, 0x3d23: 0x000a,
+	0x3d24: 0x000a, 0x3d25: 0x000a,
+	// Block 0xf5, offset 0x3d40
+	0x3d40: 0x000a, 0x3d41: 0x000a, 0x3d42: 0x000a, 0x3d43: 0x000a, 0x3d44: 0x000a, 0x3d45: 0x000a,
+	0x3d46: 0x000a, 0x3d47: 0x000a, 0x3d48: 0x000a, 0x3d49: 0x000a, 0x3d4a: 0x000a, 0x3d4b: 0x000a,
+	0x3d4c: 0x000a, 0x3d4d: 0x000a, 0x3d4e: 0x000a, 0x3d4f: 0x000a, 0x3d50: 0x000a, 0x3d51: 0x000a,
+	0x3d52: 0x000a, 0x3d53: 0x000a, 0x3d54: 0x000a, 0x3d55: 0x000a, 0x3d56: 0x000a, 0x3d57: 0x000a,
+	0x3d5c: 0x000a, 0x3d5d: 0x000a,
+	0x3d5e: 0x000a, 0x3d5f: 0x000a, 0x3d60: 0x000a, 0x3d61: 0x000a, 0x3d62: 0x000a, 0x3d63: 0x000a,
+	0x3d64: 0x000a, 0x3d65: 0x000a, 0x3d66: 0x000a, 0x3d67: 0x000a, 0x3d68: 0x000a, 0x3d69: 0x000a,
+	0x3d6a: 0x000a, 0x3d6b: 0x000a, 0x3d6c: 0x000a,
+	0x3d70: 0x000a, 0x3d71: 0x000a, 0x3d72: 0x000a, 0x3d73: 0x000a, 0x3d74: 0x000a, 0x3d75: 0x000a,
+	0x3d76: 0x000a, 0x3d77: 0x000a, 0x3d78: 0x000a, 0x3d79: 0x000a, 0x3d7a: 0x000a, 0x3d7b: 0x000a,
+	0x3d7c: 0x000a,
+	// Block 0xf6, offset 0x3d80
+	0x3d80: 0x000a, 0x3d81: 0x000a, 0x3d82: 0x000a, 0x3d83: 0x000a, 0x3d84: 0x000a, 0x3d85: 0x000a,
+	0x3d86: 0x000a, 0x3d87: 0x000a, 0x3d88: 0x000a, 0x3d89: 0x000a, 0x3d8a: 0x000a, 0x3d8b: 0x000a,
+	0x3d8c: 0x000a, 0x3d8d: 0x000a, 0x3d8e: 0x000a, 0x3d8f: 0x000a, 0x3d90: 0x000a, 0x3d91: 0x000a,
+	0x3d92: 0x000a, 0x3d93: 0x000a, 0x3d94: 0x000a, 0x3d95: 0x000a, 0x3d96: 0x000a, 0x3d97: 0x000a,
+	0x3d98: 0x000a, 0x3d99: 0x000a, 0x3d9a: 0x000a, 0x3d9b: 0x000a, 0x3d9c: 0x000a, 0x3d9d: 0x000a,
+	0x3d9e: 0x000a, 0x3d9f: 0x000a, 0x3da0: 0x000a, 0x3da1: 0x000a, 0x3da2: 0x000a, 0x3da3: 0x000a,
+	0x3da4: 0x000a, 0x3da5: 0x000a, 0x3da6: 0x000a, 0x3da7: 0x000a, 0x3da8: 0x000a, 0x3da9: 0x000a,
+	0x3daa: 0x000a, 0x3dab: 0x000a, 0x3dac: 0x000a, 0x3dad: 0x000a, 0x3dae: 0x000a, 0x3daf: 0x000a,
+	0x3db0: 0x000a, 0x3db1: 0x000a, 0x3db2: 0x000a, 0x3db3: 0x000a, 0x3db4: 0x000a, 0x3db5: 0x000a,
+	0x3db6: 0x000a, 0x3dbb: 0x000a,
+	0x3dbc: 0x000a, 0x3dbd: 0x000a, 0x3dbe: 0x000a, 0x3dbf: 0x000a,
+	// Block 0xf7, offset 0x3dc0
+	0x3dc0: 0x000a, 0x3dc1: 0x000a, 0x3dc2: 0x000a, 0x3dc3: 0x000a, 0x3dc4: 0x000a, 0x3dc5: 0x000a,
+	0x3dc6: 0x000a, 0x3dc7: 0x000a, 0x3dc8: 0x000a, 0x3dc9: 0x000a, 0x3dca: 0x000a, 0x3dcb: 0x000a,
+	0x3dcc: 0x000a, 0x3dcd: 0x000a, 0x3dce: 0x000a, 0x3dcf: 0x000a, 0x3dd0: 0x000a, 0x3dd1: 0x000a,
+	0x3dd2: 0x000a, 0x3dd3: 0x000a, 0x3dd4: 0x000a, 0x3dd5: 0x000a, 0x3dd6: 0x000a, 0x3dd7: 0x000a,
+	0x3dd8: 0x000a, 0x3dd9: 0x000a,
+	0x3de0: 0x000a, 0x3de1: 0x000a, 0x3de2: 0x000a, 0x3de3: 0x000a,
+	0x3de4: 0x000a, 0x3de5: 0x000a, 0x3de6: 0x000a, 0x3de7: 0x000a, 0x3de8: 0x000a, 0x3de9: 0x000a,
+	0x3dea: 0x000a, 0x3deb: 0x000a,
+	0x3df0: 0x000a,
+	// Block 0xf8, offset 0x3e00
+	0x3e00: 0x000a, 0x3e01: 0x000a, 0x3e02: 0x000a, 0x3e03: 0x000a, 0x3e04: 0x000a, 0x3e05: 0x000a,
+	0x3e06: 0x000a, 0x3e07: 0x000a, 0x3e08: 0x000a, 0x3e09: 0x000a, 0x3e0a: 0x000a, 0x3e0b: 0x000a,
+	0x3e10: 0x000a, 0x3e11: 0x000a,
+	0x3e12: 0x000a, 0x3e13: 0x000a, 0x3e14: 0x000a, 0x3e15: 0x000a, 0x3e16: 0x000a, 0x3e17: 0x000a,
+	0x3e18: 0x000a, 0x3e19: 0x000a, 0x3e1a: 0x000a, 0x3e1b: 0x000a, 0x3e1c: 0x000a, 0x3e1d: 0x000a,
+	0x3e1e: 0x000a, 0x3e1f: 0x000a, 0x3e20: 0x000a, 0x3e21: 0x000a, 0x3e22: 0x000a, 0x3e23: 0x000a,
+	0x3e24: 0x000a, 0x3e25: 0x000a, 0x3e26: 0x000a, 0x3e27: 0x000a, 0x3e28: 0x000a, 0x3e29: 0x000a,
+	0x3e2a: 0x000a, 0x3e2b: 0x000a, 0x3e2c: 0x000a, 0x3e2d: 0x000a, 0x3e2e: 0x000a, 0x3e2f: 0x000a,
+	0x3e30: 0x000a, 0x3e31: 0x000a, 0x3e32: 0x000a, 0x3e33: 0x000a, 0x3e34: 0x000a, 0x3e35: 0x000a,
+	0x3e36: 0x000a, 0x3e37: 0x000a, 0x3e38: 0x000a, 0x3e39: 0x000a, 0x3e3a: 0x000a, 0x3e3b: 0x000a,
+	0x3e3c: 0x000a, 0x3e3d: 0x000a, 0x3e3e: 0x000a, 0x3e3f: 0x000a,
+	// Block 0xf9, offset 0x3e40
+	0x3e40: 0x000a, 0x3e41: 0x000a, 0x3e42: 0x000a, 0x3e43: 0x000a, 0x3e44: 0x000a, 0x3e45: 0x000a,
+	0x3e46: 0x000a, 0x3e47: 0x000a,
+	0x3e50: 0x000a, 0x3e51: 0x000a,
+	0x3e52: 0x000a, 0x3e53: 0x000a, 0x3e54: 0x000a, 0x3e55: 0x000a, 0x3e56: 0x000a, 0x3e57: 0x000a,
+	0x3e58: 0x000a, 0x3e59: 0x000a,
+	0x3e60: 0x000a, 0x3e61: 0x000a, 0x3e62: 0x000a, 0x3e63: 0x000a,
+	0x3e64: 0x000a, 0x3e65: 0x000a, 0x3e66: 0x000a, 0x3e67: 0x000a, 0x3e68: 0x000a, 0x3e69: 0x000a,
+	0x3e6a: 0x000a, 0x3e6b: 0x000a, 0x3e6c: 0x000a, 0x3e6d: 0x000a, 0x3e6e: 0x000a, 0x3e6f: 0x000a,
+	0x3e70: 0x000a, 0x3e71: 0x000a, 0x3e72: 0x000a, 0x3e73: 0x000a, 0x3e74: 0x000a, 0x3e75: 0x000a,
+	0x3e76: 0x000a, 0x3e77: 0x000a, 0x3e78: 0x000a, 0x3e79: 0x000a, 0x3e7a: 0x000a, 0x3e7b: 0x000a,
+	0x3e7c: 0x000a, 0x3e7d: 0x000a, 0x3e7e: 0x000a, 0x3e7f: 0x000a,
+	// Block 0xfa, offset 0x3e80
+	0x3e80: 0x000a, 0x3e81: 0x000a, 0x3e82: 0x000a, 0x3e83: 0x000a, 0x3e84: 0x000a, 0x3e85: 0x000a,
+	0x3e86: 0x000a, 0x3e87: 0x000a,
+	0x3e90: 0x000a, 0x3e91: 0x000a,
+	0x3e92: 0x000a, 0x3e93: 0x000a, 0x3e94: 0x000a, 0x3e95: 0x000a, 0x3e96: 0x000a, 0x3e97: 0x000a,
+	0x3e98: 0x000a, 0x3e99: 0x000a, 0x3e9a: 0x000a, 0x3e9b: 0x000a, 0x3e9c: 0x000a, 0x3e9d: 0x000a,
+	0x3e9e: 0x000a, 0x3e9f: 0x000a, 0x3ea0: 0x000a, 0x3ea1: 0x000a, 0x3ea2: 0x000a, 0x3ea3: 0x000a,
+	0x3ea4: 0x000a, 0x3ea5: 0x000a, 0x3ea6: 0x000a, 0x3ea7: 0x000a, 0x3ea8: 0x000a, 0x3ea9: 0x000a,
+	0x3eaa: 0x000a, 0x3eab: 0x000a, 0x3eac: 0x000a, 0x3ead: 0x000a,
+	0x3eb0: 0x000a, 0x3eb1: 0x000a,
+	// Block 0xfb, offset 0x3ec0
+	0x3ec0: 0x000a, 0x3ec1: 0x000a, 0x3ec2: 0x000a, 0x3ec3: 0x000a, 0x3ec4: 0x000a, 0x3ec5: 0x000a,
+	0x3ec6: 0x000a, 0x3ec7: 0x000a, 0x3ec8: 0x000a, 0x3ec9: 0x000a, 0x3eca: 0x000a, 0x3ecb: 0x000a,
+	0x3ecc: 0x000a, 0x3ecd: 0x000a, 0x3ece: 0x000a, 0x3ecf: 0x000a, 0x3ed0: 0x000a, 0x3ed1: 0x000a,
+	0x3ed2: 0x000a, 0x3ed3: 0x000a,
+	0x3ee0: 0x000a, 0x3ee1: 0x000a, 0x3ee2: 0x000a, 0x3ee3: 0x000a,
+	0x3ee4: 0x000a, 0x3ee5: 0x000a, 0x3ee6: 0x000a, 0x3ee7: 0x000a, 0x3ee8: 0x000a, 0x3ee9: 0x000a,
+	0x3eea: 0x000a, 0x3eeb: 0x000a, 0x3eec: 0x000a, 0x3eed: 0x000a,
+	0x3ef0: 0x000a, 0x3ef1: 0x000a, 0x3ef2: 0x000a, 0x3ef3: 0x000a, 0x3ef4: 0x000a, 0x3ef5: 0x000a,
+	0x3ef6: 0x000a, 0x3ef7: 0x000a, 0x3ef8: 0x000a, 0x3ef9: 0x000a, 0x3efa: 0x000a, 0x3efb: 0x000a,
+	0x3efc: 0x000a,
+	// Block 0xfc, offset 0x3f00
+	0x3f00: 0x000a, 0x3f01: 0x000a, 0x3f02: 0x000a, 0x3f03: 0x000a, 0x3f04: 0x000a, 0x3f05: 0x000a,
+	0x3f06: 0x000a, 0x3f07: 0x000a, 0x3f08: 0x000a,
+	0x3f10: 0x000a, 0x3f11: 0x000a,
+	0x3f12: 0x000a, 0x3f13: 0x000a, 0x3f14: 0x000a, 0x3f15: 0x000a, 0x3f16: 0x000a, 0x3f17: 0x000a,
+	0x3f18: 0x000a, 0x3f19: 0x000a, 0x3f1a: 0x000a, 0x3f1b: 0x000a, 0x3f1c: 0x000a, 0x3f1d: 0x000a,
+	0x3f1e: 0x000a, 0x3f1f: 0x000a, 0x3f20: 0x000a, 0x3f21: 0x000a, 0x3f22: 0x000a, 0x3f23: 0x000a,
+	0x3f24: 0x000a, 0x3f25: 0x000a, 0x3f26: 0x000a, 0x3f27: 0x000a, 0x3f28: 0x000a, 0x3f29: 0x000a,
+	0x3f2a: 0x000a, 0x3f2b: 0x000a, 0x3f2c: 0x000a, 0x3f2d: 0x000a, 0x3f2e: 0x000a, 0x3f2f: 0x000a,
+	0x3f30: 0x000a, 0x3f31: 0x000a, 0x3f32: 0x000a, 0x3f33: 0x000a, 0x3f34: 0x000a, 0x3f35: 0x000a,
+	0x3f36: 0x000a, 0x3f37: 0x000a, 0x3f38: 0x000a, 0x3f39: 0x000a, 0x3f3a: 0x000a, 0x3f3b: 0x000a,
+	0x3f3c: 0x000a, 0x3f3d: 0x000a, 0x3f3f: 0x000a,
+	// Block 0xfd, offset 0x3f40
+	0x3f40: 0x000a, 0x3f41: 0x000a, 0x3f42: 0x000a, 0x3f43: 0x000a, 0x3f44: 0x000a, 0x3f45: 0x000a,
+	0x3f4e: 0x000a, 0x3f4f: 0x000a, 0x3f50: 0x000a, 0x3f51: 0x000a,
+	0x3f52: 0x000a, 0x3f53: 0x000a, 0x3f54: 0x000a, 0x3f55: 0x000a, 0x3f56: 0x000a, 0x3f57: 0x000a,
+	0x3f58: 0x000a, 0x3f59: 0x000a, 0x3f5a: 0x000a, 0x3f5b: 0x000a,
+	0x3f60: 0x000a, 0x3f61: 0x000a, 0x3f62: 0x000a, 0x3f63: 0x000a,
+	0x3f64: 0x000a, 0x3f65: 0x000a, 0x3f66: 0x000a, 0x3f67: 0x000a, 0x3f68: 0x000a,
+	0x3f70: 0x000a, 0x3f71: 0x000a, 0x3f72: 0x000a, 0x3f73: 0x000a, 0x3f74: 0x000a, 0x3f75: 0x000a,
+	0x3f76: 0x000a, 0x3f77: 0x000a, 0x3f78: 0x000a,
+	// Block 0xfe, offset 0x3f80
+	0x3f80: 0x000a, 0x3f81: 0x000a, 0x3f82: 0x000a, 0x3f83: 0x000a, 0x3f84: 0x000a, 0x3f85: 0x000a,
+	0x3f86: 0x000a, 0x3f87: 0x000a, 0x3f88: 0x000a, 0x3f89: 0x000a, 0x3f8a: 0x000a, 0x3f8b: 0x000a,
+	0x3f8c: 0x000a, 0x3f8d: 0x000a, 0x3f8e: 0x000a, 0x3f8f: 0x000a, 0x3f90: 0x000a, 0x3f91: 0x000a,
+	0x3f92: 0x000a, 0x3f94: 0x000a, 0x3f95: 0x000a, 0x3f96: 0x000a, 0x3f97: 0x000a,
+	0x3f98: 0x000a, 0x3f99: 0x000a, 0x3f9a: 0x000a, 0x3f9b: 0x000a, 0x3f9c: 0x000a, 0x3f9d: 0x000a,
+	0x3f9e: 0x000a, 0x3f9f: 0x000a, 0x3fa0: 0x000a, 0x3fa1: 0x000a, 0x3fa2: 0x000a, 0x3fa3: 0x000a,
+	0x3fa4: 0x000a, 0x3fa5: 0x000a, 0x3fa6: 0x000a, 0x3fa7: 0x000a, 0x3fa8: 0x000a, 0x3fa9: 0x000a,
+	0x3faa: 0x000a, 0x3fab: 0x000a, 0x3fac: 0x000a, 0x3fad: 0x000a, 0x3fae: 0x000a, 0x3faf: 0x000a,
+	0x3fb0: 0x000a, 0x3fb1: 0x000a, 0x3fb2: 0x000a, 0x3fb3: 0x000a, 0x3fb4: 0x000a, 0x3fb5: 0x000a,
+	0x3fb6: 0x000a, 0x3fb7: 0x000a, 0x3fb8: 0x000a, 0x3fb9: 0x000a, 0x3fba: 0x000a, 0x3fbb: 0x000a,
+	0x3fbc: 0x000a, 0x3fbd: 0x000a, 0x3fbe: 0x000a, 0x3fbf: 0x000a,
+	// Block 0xff, offset 0x3fc0
+	0x3fc0: 0x000a, 0x3fc1: 0x000a, 0x3fc2: 0x000a, 0x3fc3: 0x000a, 0x3fc4: 0x000a, 0x3fc5: 0x000a,
+	0x3fc6: 0x000a, 0x3fc7: 0x000a, 0x3fc8: 0x000a, 0x3fc9: 0x000a, 0x3fca: 0x000a,
+	0x3ff0: 0x0002, 0x3ff1: 0x0002, 0x3ff2: 0x0002, 0x3ff3: 0x0002, 0x3ff4: 0x0002, 0x3ff5: 0x0002,
+	0x3ff6: 0x0002, 0x3ff7: 0x0002, 0x3ff8: 0x0002, 0x3ff9: 0x0002,
+	// Block 0x100, offset 0x4000
+	0x403e: 0x000b, 0x403f: 0x000b,
+	// Block 0x101, offset 0x4040
+	0x4040: 0x000b, 0x4041: 0x000b, 0x4042: 0x000b, 0x4043: 0x000b, 0x4044: 0x000b, 0x4045: 0x000b,
+	0x4046: 0x000b, 0x4047: 0x000b, 0x4048: 0x000b, 0x4049: 0x000b, 0x404a: 0x000b, 0x404b: 0x000b,
+	0x404c: 0x000b, 0x404d: 0x000b, 0x404e: 0x000b, 0x404f: 0x000b, 0x4050: 0x000b, 0x4051: 0x000b,
+	0x4052: 0x000b, 0x4053: 0x000b, 0x4054: 0x000b, 0x4055: 0x000b, 0x4056: 0x000b, 0x4057: 0x000b,
+	0x4058: 0x000b, 0x4059: 0x000b, 0x405a: 0x000b, 0x405b: 0x000b, 0x405c: 0x000b, 0x405d: 0x000b,
+	0x405e: 0x000b, 0x405f: 0x000b, 0x4060: 0x000b, 0x4061: 0x000b, 0x4062: 0x000b, 0x4063: 0x000b,
+	0x4064: 0x000b, 0x4065: 0x000b, 0x4066: 0x000b, 0x4067: 0x000b, 0x4068: 0x000b, 0x4069: 0x000b,
+	0x406a: 0x000b, 0x406b: 0x000b, 0x406c: 0x000b, 0x406d: 0x000b, 0x406e: 0x000b, 0x406f: 0x000b,
+	0x4070: 0x000b, 0x4071: 0x000b, 0x4072: 0x000b, 0x4073: 0x000b, 0x4074: 0x000b, 0x4075: 0x000b,
+	0x4076: 0x000b, 0x4077: 0x000b, 0x4078: 0x000b, 0x4079: 0x000b, 0x407a: 0x000b, 0x407b: 0x000b,
+	0x407c: 0x000b, 0x407d: 0x000b, 0x407e: 0x000b, 0x407f: 0x000b,
+	// Block 0x102, offset 0x4080
+	0x4080: 0x000c, 0x4081: 0x000c, 0x4082: 0x000c, 0x4083: 0x000c, 0x4084: 0x000c, 0x4085: 0x000c,
+	0x4086: 0x000c, 0x4087: 0x000c, 0x4088: 0x000c, 0x4089: 0x000c, 0x408a: 0x000c, 0x408b: 0x000c,
+	0x408c: 0x000c, 0x408d: 0x000c, 0x408e: 0x000c, 0x408f: 0x000c, 0x4090: 0x000c, 0x4091: 0x000c,
+	0x4092: 0x000c, 0x4093: 0x000c, 0x4094: 0x000c, 0x4095: 0x000c, 0x4096: 0x000c, 0x4097: 0x000c,
+	0x4098: 0x000c, 0x4099: 0x000c, 0x409a: 0x000c, 0x409b: 0x000c, 0x409c: 0x000c, 0x409d: 0x000c,
+	0x409e: 0x000c, 0x409f: 0x000c, 0x40a0: 0x000c, 0x40a1: 0x000c, 0x40a2: 0x000c, 0x40a3: 0x000c,
+	0x40a4: 0x000c, 0x40a5: 0x000c, 0x40a6: 0x000c, 0x40a7: 0x000c, 0x40a8: 0x000c, 0x40a9: 0x000c,
+	0x40aa: 0x000c, 0x40ab: 0x000c, 0x40ac: 0x000c, 0x40ad: 0x000c, 0x40ae: 0x000c, 0x40af: 0x000c,
+	0x40b0: 0x000b, 0x40b1: 0x000b, 0x40b2: 0x000b, 0x40b3: 0x000b, 0x40b4: 0x000b, 0x40b5: 0x000b,
+	0x40b6: 0x000b, 0x40b7: 0x000b, 0x40b8: 0x000b, 0x40b9: 0x000b, 0x40ba: 0x000b, 0x40bb: 0x000b,
+	0x40bc: 0x000b, 0x40bd: 0x000b, 0x40be: 0x000b, 0x40bf: 0x000b,
+}
+
+// bidiIndex: 26 blocks, 1664 entries, 3328 bytes
+// Block 0 is the zero block.
+var bidiIndex = [1664]uint16{
+	// Block 0x0, offset 0x0
+	// Block 0x1, offset 0x40
+	// Block 0x2, offset 0x80
+	// Block 0x3, offset 0xc0
+	0xc2: 0x01, 0xc3: 0x02,
+	0xca: 0x03, 0xcb: 0x04, 0xcc: 0x05, 0xcd: 0x06, 0xce: 0x07, 0xcf: 0x08,
+	0xd2: 0x09, 0xd6: 0x0a, 0xd7: 0x0b,
+	0xd8: 0x0c, 0xd9: 0x0d, 0xda: 0x0e, 0xdb: 0x0f, 0xdc: 0x10, 0xdd: 0x11, 0xde: 0x12, 0xdf: 0x13,
+	0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, 0xe4: 0x06,
+	0xea: 0x07, 0xef: 0x08,
+	0xf0: 0x13, 0xf1: 0x14, 0xf2: 0x14, 0xf3: 0x16, 0xf4: 0x17,
+	// Block 0x4, offset 0x100
+	0x120: 0x14, 0x121: 0x15, 0x122: 0x16, 0x123: 0x17, 0x124: 0x18, 0x125: 0x19, 0x126: 0x1a, 0x127: 0x1b,
+	0x128: 0x1c, 0x129: 0x1d, 0x12a: 0x1c, 0x12b: 0x1e, 0x12c: 0x1f, 0x12d: 0x20, 0x12e: 0x21, 0x12f: 0x22,
+	0x130: 0x23, 0x131: 0x24, 0x132: 0x1a, 0x133: 0x25, 0x134: 0x26, 0x135: 0x27, 0x136: 0x28, 0x137: 0x29,
+	0x138: 0x2a, 0x139: 0x2b, 0x13a: 0x2c, 0x13b: 0x2d, 0x13c: 0x2e, 0x13d: 0x2f, 0x13e: 0x30, 0x13f: 0x31,
+	// Block 0x5, offset 0x140
+	0x140: 0x32, 0x141: 0x33, 0x142: 0x34,
+	0x14d: 0x35, 0x14e: 0x36,
+	0x150: 0x37,
+	0x15a: 0x38, 0x15c: 0x39, 0x15d: 0x3a, 0x15e: 0x3b, 0x15f: 0x3c,
+	0x160: 0x3d, 0x162: 0x3e, 0x164: 0x3f, 0x165: 0x40, 0x167: 0x41,
+	0x168: 0x42, 0x169: 0x43, 0x16a: 0x44, 0x16b: 0x45, 0x16c: 0x46, 0x16d: 0x47, 0x16e: 0x48, 0x16f: 0x49,
+	0x170: 0x4a, 0x173: 0x4b, 0x177: 0x05,
+	0x17e: 0x4c, 0x17f: 0x4d,
+	// Block 0x6, offset 0x180
+	0x180: 0x4e, 0x181: 0x4f, 0x182: 0x50, 0x183: 0x51, 0x184: 0x52, 0x185: 0x53, 0x186: 0x54, 0x187: 0x55,
+	0x188: 0x56, 0x189: 0x55, 0x18a: 0x55, 0x18b: 0x55, 0x18c: 0x57, 0x18d: 0x58, 0x18e: 0x59, 0x18f: 0x55,
+	0x190: 0x5a, 0x191: 0x5b, 0x192: 0x5c, 0x193: 0x5d, 0x194: 0x55, 0x195: 0x55, 0x196: 0x55, 0x197: 0x55,
+	0x198: 0x55, 0x199: 0x55, 0x19a: 0x5e, 0x19b: 0x55, 0x19c: 0x55, 0x19d: 0x5f, 0x19e: 0x55, 0x19f: 0x60,
+	0x1a4: 0x55, 0x1a5: 0x55, 0x1a6: 0x61, 0x1a7: 0x62,
+	0x1a8: 0x55, 0x1a9: 0x55, 0x1aa: 0x55, 0x1ab: 0x55, 0x1ac: 0x55, 0x1ad: 0x63, 0x1ae: 0x64, 0x1af: 0x55,
+	0x1b3: 0x65, 0x1b5: 0x66, 0x1b7: 0x67,
+	0x1b8: 0x68, 0x1b9: 0x69, 0x1ba: 0x6a, 0x1bb: 0x6b, 0x1bc: 0x55, 0x1bd: 0x55, 0x1be: 0x55, 0x1bf: 0x6c,
+	// Block 0x7, offset 0x1c0
+	0x1c0: 0x6d, 0x1c2: 0x6e, 0x1c3: 0x6f, 0x1c7: 0x70,
+	0x1c8: 0x71, 0x1c9: 0x72, 0x1ca: 0x73, 0x1cb: 0x74, 0x1cd: 0x75, 0x1cf: 0x76,
+	// Block 0x8, offset 0x200
+	0x237: 0x55,
+	// Block 0x9, offset 0x240
+	0x252: 0x77, 0x253: 0x78,
+	0x258: 0x79, 0x259: 0x7a, 0x25a: 0x7b, 0x25b: 0x7c, 0x25c: 0x7d, 0x25e: 0x7e,
+	0x260: 0x7f, 0x261: 0x80, 0x263: 0x81, 0x264: 0x82, 0x265: 0x83, 0x266: 0x84, 0x267: 0x85,
+	0x268: 0x86, 0x269: 0x87, 0x26a: 0x88, 0x26b: 0x89, 0x26d: 0x8a, 0x26f: 0x8b,
+	// Block 0xa, offset 0x280
+	0x2ac: 0x8c, 0x2ad: 0x8d, 0x2ae: 0x0e, 0x2af: 0x0e,
+	0x2b0: 0x0e, 0x2b1: 0x0e, 0x2b2: 0x0e, 0x2b3: 0x0e, 0x2b4: 0x8e, 0x2b5: 0x8f, 0x2b6: 0x0e, 0x2b7: 0x90,
+	0x2b8: 0x91, 0x2b9: 0x92, 0x2ba: 0x0e, 0x2bb: 0x93, 0x2bc: 0x94, 0x2bd: 0x95, 0x2bf: 0x96,
+	// Block 0xb, offset 0x2c0
+	0x2c4: 0x97, 0x2c5: 0x55, 0x2c6: 0x98, 0x2c7: 0x99,
+	0x2cb: 0x9a, 0x2cd: 0x9b,
+	0x2e0: 0x9c, 0x2e1: 0x9c, 0x2e2: 0x9c, 0x2e3: 0x9c, 0x2e4: 0x9d, 0x2e5: 0x9c, 0x2e6: 0x9c, 0x2e7: 0x9c,
+	0x2e8: 0x9e, 0x2e9: 0x9c, 0x2ea: 0x9c, 0x2eb: 0x9f, 0x2ec: 0xa0, 0x2ed: 0x9c, 0x2ee: 0x9c, 0x2ef: 0x9c,
+	0x2f0: 0x9c, 0x2f1: 0x9c, 0x2f2: 0x9c, 0x2f3: 0x9c, 0x2f4: 0xa1, 0x2f5: 0x9c, 0x2f6: 0x9c, 0x2f7: 0x9c,
+	0x2f8: 0x9c, 0x2f9: 0xa2, 0x2fa: 0xa3, 0x2fb: 0xa4, 0x2fc: 0xa5, 0x2fd: 0xa6, 0x2fe: 0xa7, 0x2ff: 0x9c,
+	// Block 0xc, offset 0x300
+	0x300: 0xa8, 0x301: 0xa9, 0x302: 0xaa, 0x303: 0x21, 0x304: 0xab, 0x305: 0xac, 0x306: 0xad, 0x307: 0xae,
+	0x308: 0xaf, 0x309: 0x28, 0x30b: 0xb0, 0x30c: 0x26, 0x30d: 0xb1,
+	0x310: 0xb2, 0x311: 0xb3, 0x312: 0xb4, 0x313: 0xb5, 0x316: 0xb6, 0x317: 0xb7,
+	0x318: 0xb8, 0x319: 0xb9, 0x31a: 0xba, 0x31c: 0xbb,
+	0x320: 0xbc, 0x324: 0xbd, 0x325: 0xbe, 0x327: 0xbf,
+	0x328: 0xc0, 0x329: 0xc1, 0x32a: 0xc2,
+	0x330: 0xc3, 0x332: 0xc4, 0x334: 0xc5, 0x335: 0xc6, 0x336: 0xc7,
+	0x33b: 0xc8, 0x33c: 0xc9, 0x33d: 0xca, 0x33f: 0xcb,
+	// Block 0xd, offset 0x340
+	0x351: 0xcc,
+	// Block 0xe, offset 0x380
+	0x3ab: 0xcd, 0x3ac: 0xce,
+	0x3bd: 0xcf, 0x3be: 0xd0, 0x3bf: 0xd1,
+	// Block 0xf, offset 0x3c0
+	0x3f2: 0xd2,
+	// Block 0x10, offset 0x400
+	0x43c: 0xd3, 0x43d: 0xd4,
+	// Block 0x11, offset 0x440
+	0x445: 0xd5, 0x446: 0xd6, 0x447: 0xd7,
+	0x448: 0x55, 0x449: 0xd8, 0x44c: 0x55, 0x44d: 0xd9,
+	0x45b: 0xda, 0x45c: 0xdb, 0x45d: 0xdc, 0x45e: 0xdd, 0x45f: 0xde,
+	0x468: 0xdf, 0x469: 0xe0, 0x46a: 0xe1,
+	// Block 0x12, offset 0x480
+	0x480: 0xe2, 0x482: 0xcf, 0x484: 0xce,
+	0x48a: 0xe3, 0x48b: 0xe4,
+	0x493: 0xe5,
+	0x4a0: 0x9c, 0x4a1: 0x9c, 0x4a2: 0x9c, 0x4a3: 0xe6, 0x4a4: 0x9c, 0x4a5: 0xe7, 0x4a6: 0x9c, 0x4a7: 0x9c,
+	0x4a8: 0x9c, 0x4a9: 0x9c, 0x4aa: 0x9c, 0x4ab: 0x9c, 0x4ac: 0x9c, 0x4ad: 0x9c, 0x4ae: 0x9c, 0x4af: 0x9c,
+	0x4b0: 0x9c, 0x4b1: 0xe8, 0x4b2: 0xe9, 0x4b3: 0x9c, 0x4b4: 0xea, 0x4b5: 0x9c, 0x4b6: 0x9c, 0x4b7: 0x9c,
+	0x4b8: 0x0e, 0x4b9: 0x0e, 0x4ba: 0x0e, 0x4bb: 0xeb, 0x4bc: 0x9c, 0x4bd: 0x9c, 0x4be: 0x9c, 0x4bf: 0x9c,
+	// Block 0x13, offset 0x4c0
+	0x4c0: 0xec, 0x4c1: 0x55, 0x4c2: 0xed, 0x4c3: 0xee, 0x4c4: 0xef, 0x4c5: 0xf0, 0x4c6: 0xf1,
+	0x4c9: 0xf2, 0x4cc: 0x55, 0x4cd: 0x55, 0x4ce: 0x55, 0x4cf: 0x55,
+	0x4d0: 0x55, 0x4d1: 0x55, 0x4d2: 0x55, 0x4d3: 0x55, 0x4d4: 0x55, 0x4d5: 0x55, 0x4d6: 0x55, 0x4d7: 0x55,
+	0x4d8: 0x55, 0x4d9: 0x55, 0x4da: 0x55, 0x4db: 0xf3, 0x4dc: 0x55, 0x4dd: 0xf4, 0x4de: 0x55, 0x4df: 0xf5,
+	0x4e0: 0xf6, 0x4e1: 0xf7, 0x4e2: 0xf8, 0x4e4: 0x55, 0x4e5: 0x55, 0x4e6: 0x55, 0x4e7: 0x55,
+	0x4e8: 0x55, 0x4e9: 0xf9, 0x4ea: 0xfa, 0x4eb: 0xfb, 0x4ec: 0x55, 0x4ed: 0x55, 0x4ee: 0xfc, 0x4ef: 0xfd,
+	0x4ff: 0xfe,
+	// Block 0x14, offset 0x500
+	0x53f: 0xfe,
+	// Block 0x15, offset 0x540
+	0x550: 0x09, 0x551: 0x0a, 0x553: 0x0b, 0x556: 0x0c,
+	0x55b: 0x0d, 0x55c: 0x0e, 0x55d: 0x0f, 0x55e: 0x10, 0x55f: 0x11,
+	0x56f: 0x12,
+	0x57f: 0x12,
+	// Block 0x16, offset 0x580
+	0x58f: 0x12,
+	0x59f: 0x12,
+	0x5af: 0x12,
+	0x5bf: 0x12,
+	// Block 0x17, offset 0x5c0
+	0x5c0: 0xff, 0x5c1: 0xff, 0x5c2: 0xff, 0x5c3: 0xff, 0x5c4: 0x05, 0x5c5: 0x05, 0x5c6: 0x05, 0x5c7: 0x100,
+	0x5c8: 0xff, 0x5c9: 0xff, 0x5ca: 0xff, 0x5cb: 0xff, 0x5cc: 0xff, 0x5cd: 0xff, 0x5ce: 0xff, 0x5cf: 0xff,
+	0x5d0: 0xff, 0x5d1: 0xff, 0x5d2: 0xff, 0x5d3: 0xff, 0x5d4: 0xff, 0x5d5: 0xff, 0x5d6: 0xff, 0x5d7: 0xff,
+	0x5d8: 0xff, 0x5d9: 0xff, 0x5da: 0xff, 0x5db: 0xff, 0x5dc: 0xff, 0x5dd: 0xff, 0x5de: 0xff, 0x5df: 0xff,
+	0x5e0: 0xff, 0x5e1: 0xff, 0x5e2: 0xff, 0x5e3: 0xff, 0x5e4: 0xff, 0x5e5: 0xff, 0x5e6: 0xff, 0x5e7: 0xff,
+	0x5e8: 0xff, 0x5e9: 0xff, 0x5ea: 0xff, 0x5eb: 0xff, 0x5ec: 0xff, 0x5ed: 0xff, 0x5ee: 0xff, 0x5ef: 0xff,
+	0x5f0: 0xff, 0x5f1: 0xff, 0x5f2: 0xff, 0x5f3: 0xff, 0x5f4: 0xff, 0x5f5: 0xff, 0x5f6: 0xff, 0x5f7: 0xff,
+	0x5f8: 0xff, 0x5f9: 0xff, 0x5fa: 0xff, 0x5fb: 0xff, 0x5fc: 0xff, 0x5fd: 0xff, 0x5fe: 0xff, 0x5ff: 0xff,
+	// Block 0x18, offset 0x600
+	0x60f: 0x12,
+	0x61f: 0x12,
+	0x620: 0x15,
+	0x62f: 0x12,
+	0x63f: 0x12,
+	// Block 0x19, offset 0x640
+	0x64f: 0x12,
+}
+
+// Total table size 19960 bytes (19KiB); checksum: F50EF68C
diff --git a/src/vendor/golang.org/x/text/unicode/norm/forminfo.go b/src/vendor/golang.org/x/text/unicode/norm/forminfo.go
index d69ccb4..487335d 100644
--- a/src/vendor/golang.org/x/text/unicode/norm/forminfo.go
+++ b/src/vendor/golang.org/x/text/unicode/norm/forminfo.go
@@ -13,7 +13,7 @@
 // a rune to a uint16. The values take two forms.  For v >= 0x8000:
 //   bits
 //   15:    1 (inverse of NFD_QC bit of qcInfo)
-//   13..7: qcInfo (see below). isYesD is always true (no decompostion).
+//   13..7: qcInfo (see below). isYesD is always true (no decomposition).
 //    6..0: ccc (compressed CCC value).
 // For v < 0x8000, the respective rune has a decomposition and v is an index
 // into a byte array of UTF-8 decomposition sequences and additional info and
diff --git a/src/vendor/golang.org/x/text/unicode/norm/tables13.0.0.go b/src/vendor/golang.org/x/text/unicode/norm/tables13.0.0.go
index 9115ef2..f65785e 100644
--- a/src/vendor/golang.org/x/text/unicode/norm/tables13.0.0.go
+++ b/src/vendor/golang.org/x/text/unicode/norm/tables13.0.0.go
@@ -1,7 +1,7 @@
 // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
 
-//go:build go1.16
-// +build go1.16
+//go:build go1.16 && !go1.21
+// +build go1.16,!go1.21
 
 package norm
 
diff --git a/src/vendor/golang.org/x/text/unicode/norm/tables15.0.0.go b/src/vendor/golang.org/x/text/unicode/norm/tables15.0.0.go
new file mode 100644
index 0000000..e1858b8
--- /dev/null
+++ b/src/vendor/golang.org/x/text/unicode/norm/tables15.0.0.go
@@ -0,0 +1,7908 @@
+// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
+
+//go:build go1.21
+// +build go1.21
+
+package norm
+
+import "sync"
+
+const (
+	// Version is the Unicode edition from which the tables are derived.
+	Version = "15.0.0"
+
+	// MaxTransformChunkSize indicates the maximum number of bytes that Transform
+	// may need to write atomically for any Form. Making a destination buffer at
+	// least this size ensures that Transform can always make progress and that
+	// the user does not need to grow the buffer on an ErrShortDst.
+	MaxTransformChunkSize = 35 + maxNonStarters*4
+)
+
+var ccc = [56]uint8{
+	0, 1, 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, 84, 91, 103, 107, 118, 122, 129,
+	130, 132, 202, 214, 216, 218, 220, 222,
+	224, 226, 228, 230, 232, 233, 234, 240,
+}
+
+const (
+	firstMulti            = 0x199A
+	firstCCC              = 0x2DD5
+	endMulti              = 0x30A1
+	firstLeadingCCC       = 0x4AEF
+	firstCCCZeroExcept    = 0x4BB9
+	firstStarterWithNLead = 0x4BE0
+	lastDecomp            = 0x4BE2
+	maxDecomp             = 0x8000
+)
+
+// decomps: 19426 bytes
+var decomps = [...]byte{
+	// Bytes 0 - 3f
+	0x00, 0x41, 0x20, 0x41, 0x21, 0x41, 0x22, 0x41,
+	0x23, 0x41, 0x24, 0x41, 0x25, 0x41, 0x26, 0x41,
+	0x27, 0x41, 0x28, 0x41, 0x29, 0x41, 0x2A, 0x41,
+	0x2B, 0x41, 0x2C, 0x41, 0x2D, 0x41, 0x2E, 0x41,
+	0x2F, 0x41, 0x30, 0x41, 0x31, 0x41, 0x32, 0x41,
+	0x33, 0x41, 0x34, 0x41, 0x35, 0x41, 0x36, 0x41,
+	0x37, 0x41, 0x38, 0x41, 0x39, 0x41, 0x3A, 0x41,
+	0x3B, 0x41, 0x3C, 0x41, 0x3D, 0x41, 0x3E, 0x41,
+	// Bytes 40 - 7f
+	0x3F, 0x41, 0x40, 0x41, 0x41, 0x41, 0x42, 0x41,
+	0x43, 0x41, 0x44, 0x41, 0x45, 0x41, 0x46, 0x41,
+	0x47, 0x41, 0x48, 0x41, 0x49, 0x41, 0x4A, 0x41,
+	0x4B, 0x41, 0x4C, 0x41, 0x4D, 0x41, 0x4E, 0x41,
+	0x4F, 0x41, 0x50, 0x41, 0x51, 0x41, 0x52, 0x41,
+	0x53, 0x41, 0x54, 0x41, 0x55, 0x41, 0x56, 0x41,
+	0x57, 0x41, 0x58, 0x41, 0x59, 0x41, 0x5A, 0x41,
+	0x5B, 0x41, 0x5C, 0x41, 0x5D, 0x41, 0x5E, 0x41,
+	// Bytes 80 - bf
+	0x5F, 0x41, 0x60, 0x41, 0x61, 0x41, 0x62, 0x41,
+	0x63, 0x41, 0x64, 0x41, 0x65, 0x41, 0x66, 0x41,
+	0x67, 0x41, 0x68, 0x41, 0x69, 0x41, 0x6A, 0x41,
+	0x6B, 0x41, 0x6C, 0x41, 0x6D, 0x41, 0x6E, 0x41,
+	0x6F, 0x41, 0x70, 0x41, 0x71, 0x41, 0x72, 0x41,
+	0x73, 0x41, 0x74, 0x41, 0x75, 0x41, 0x76, 0x41,
+	0x77, 0x41, 0x78, 0x41, 0x79, 0x41, 0x7A, 0x41,
+	0x7B, 0x41, 0x7C, 0x41, 0x7D, 0x41, 0x7E, 0x42,
+	// Bytes c0 - ff
+	0xC2, 0xA2, 0x42, 0xC2, 0xA3, 0x42, 0xC2, 0xA5,
+	0x42, 0xC2, 0xA6, 0x42, 0xC2, 0xAC, 0x42, 0xC2,
+	0xB7, 0x42, 0xC3, 0x86, 0x42, 0xC3, 0xA6, 0x42,
+	0xC3, 0xB0, 0x42, 0xC3, 0xB8, 0x42, 0xC4, 0xA6,
+	0x42, 0xC4, 0xA7, 0x42, 0xC4, 0xB1, 0x42, 0xC5,
+	0x8B, 0x42, 0xC5, 0x93, 0x42, 0xC6, 0x8E, 0x42,
+	0xC6, 0x90, 0x42, 0xC6, 0xAB, 0x42, 0xC7, 0x80,
+	0x42, 0xC7, 0x81, 0x42, 0xC7, 0x82, 0x42, 0xC8,
+	// Bytes 100 - 13f
+	0xA2, 0x42, 0xC8, 0xB7, 0x42, 0xC9, 0x90, 0x42,
+	0xC9, 0x91, 0x42, 0xC9, 0x92, 0x42, 0xC9, 0x93,
+	0x42, 0xC9, 0x94, 0x42, 0xC9, 0x95, 0x42, 0xC9,
+	0x96, 0x42, 0xC9, 0x97, 0x42, 0xC9, 0x98, 0x42,
+	0xC9, 0x99, 0x42, 0xC9, 0x9B, 0x42, 0xC9, 0x9C,
+	0x42, 0xC9, 0x9E, 0x42, 0xC9, 0x9F, 0x42, 0xC9,
+	0xA0, 0x42, 0xC9, 0xA1, 0x42, 0xC9, 0xA2, 0x42,
+	0xC9, 0xA3, 0x42, 0xC9, 0xA4, 0x42, 0xC9, 0xA5,
+	// Bytes 140 - 17f
+	0x42, 0xC9, 0xA6, 0x42, 0xC9, 0xA7, 0x42, 0xC9,
+	0xA8, 0x42, 0xC9, 0xA9, 0x42, 0xC9, 0xAA, 0x42,
+	0xC9, 0xAB, 0x42, 0xC9, 0xAC, 0x42, 0xC9, 0xAD,
+	0x42, 0xC9, 0xAE, 0x42, 0xC9, 0xAF, 0x42, 0xC9,
+	0xB0, 0x42, 0xC9, 0xB1, 0x42, 0xC9, 0xB2, 0x42,
+	0xC9, 0xB3, 0x42, 0xC9, 0xB4, 0x42, 0xC9, 0xB5,
+	0x42, 0xC9, 0xB6, 0x42, 0xC9, 0xB7, 0x42, 0xC9,
+	0xB8, 0x42, 0xC9, 0xB9, 0x42, 0xC9, 0xBA, 0x42,
+	// Bytes 180 - 1bf
+	0xC9, 0xBB, 0x42, 0xC9, 0xBD, 0x42, 0xC9, 0xBE,
+	0x42, 0xCA, 0x80, 0x42, 0xCA, 0x81, 0x42, 0xCA,
+	0x82, 0x42, 0xCA, 0x83, 0x42, 0xCA, 0x84, 0x42,
+	0xCA, 0x88, 0x42, 0xCA, 0x89, 0x42, 0xCA, 0x8A,
+	0x42, 0xCA, 0x8B, 0x42, 0xCA, 0x8C, 0x42, 0xCA,
+	0x8D, 0x42, 0xCA, 0x8E, 0x42, 0xCA, 0x8F, 0x42,
+	0xCA, 0x90, 0x42, 0xCA, 0x91, 0x42, 0xCA, 0x92,
+	0x42, 0xCA, 0x95, 0x42, 0xCA, 0x98, 0x42, 0xCA,
+	// Bytes 1c0 - 1ff
+	0x99, 0x42, 0xCA, 0x9B, 0x42, 0xCA, 0x9C, 0x42,
+	0xCA, 0x9D, 0x42, 0xCA, 0x9F, 0x42, 0xCA, 0xA1,
+	0x42, 0xCA, 0xA2, 0x42, 0xCA, 0xA3, 0x42, 0xCA,
+	0xA4, 0x42, 0xCA, 0xA5, 0x42, 0xCA, 0xA6, 0x42,
+	0xCA, 0xA7, 0x42, 0xCA, 0xA8, 0x42, 0xCA, 0xA9,
+	0x42, 0xCA, 0xAA, 0x42, 0xCA, 0xAB, 0x42, 0xCA,
+	0xB9, 0x42, 0xCB, 0x90, 0x42, 0xCB, 0x91, 0x42,
+	0xCE, 0x91, 0x42, 0xCE, 0x92, 0x42, 0xCE, 0x93,
+	// Bytes 200 - 23f
+	0x42, 0xCE, 0x94, 0x42, 0xCE, 0x95, 0x42, 0xCE,
+	0x96, 0x42, 0xCE, 0x97, 0x42, 0xCE, 0x98, 0x42,
+	0xCE, 0x99, 0x42, 0xCE, 0x9A, 0x42, 0xCE, 0x9B,
+	0x42, 0xCE, 0x9C, 0x42, 0xCE, 0x9D, 0x42, 0xCE,
+	0x9E, 0x42, 0xCE, 0x9F, 0x42, 0xCE, 0xA0, 0x42,
+	0xCE, 0xA1, 0x42, 0xCE, 0xA3, 0x42, 0xCE, 0xA4,
+	0x42, 0xCE, 0xA5, 0x42, 0xCE, 0xA6, 0x42, 0xCE,
+	0xA7, 0x42, 0xCE, 0xA8, 0x42, 0xCE, 0xA9, 0x42,
+	// Bytes 240 - 27f
+	0xCE, 0xB1, 0x42, 0xCE, 0xB2, 0x42, 0xCE, 0xB3,
+	0x42, 0xCE, 0xB4, 0x42, 0xCE, 0xB5, 0x42, 0xCE,
+	0xB6, 0x42, 0xCE, 0xB7, 0x42, 0xCE, 0xB8, 0x42,
+	0xCE, 0xB9, 0x42, 0xCE, 0xBA, 0x42, 0xCE, 0xBB,
+	0x42, 0xCE, 0xBC, 0x42, 0xCE, 0xBD, 0x42, 0xCE,
+	0xBE, 0x42, 0xCE, 0xBF, 0x42, 0xCF, 0x80, 0x42,
+	0xCF, 0x81, 0x42, 0xCF, 0x82, 0x42, 0xCF, 0x83,
+	0x42, 0xCF, 0x84, 0x42, 0xCF, 0x85, 0x42, 0xCF,
+	// Bytes 280 - 2bf
+	0x86, 0x42, 0xCF, 0x87, 0x42, 0xCF, 0x88, 0x42,
+	0xCF, 0x89, 0x42, 0xCF, 0x9C, 0x42, 0xCF, 0x9D,
+	0x42, 0xD0, 0xB0, 0x42, 0xD0, 0xB1, 0x42, 0xD0,
+	0xB2, 0x42, 0xD0, 0xB3, 0x42, 0xD0, 0xB4, 0x42,
+	0xD0, 0xB5, 0x42, 0xD0, 0xB6, 0x42, 0xD0, 0xB7,
+	0x42, 0xD0, 0xB8, 0x42, 0xD0, 0xBA, 0x42, 0xD0,
+	0xBB, 0x42, 0xD0, 0xBC, 0x42, 0xD0, 0xBD, 0x42,
+	0xD0, 0xBE, 0x42, 0xD0, 0xBF, 0x42, 0xD1, 0x80,
+	// Bytes 2c0 - 2ff
+	0x42, 0xD1, 0x81, 0x42, 0xD1, 0x82, 0x42, 0xD1,
+	0x83, 0x42, 0xD1, 0x84, 0x42, 0xD1, 0x85, 0x42,
+	0xD1, 0x86, 0x42, 0xD1, 0x87, 0x42, 0xD1, 0x88,
+	0x42, 0xD1, 0x8A, 0x42, 0xD1, 0x8B, 0x42, 0xD1,
+	0x8C, 0x42, 0xD1, 0x8D, 0x42, 0xD1, 0x8E, 0x42,
+	0xD1, 0x95, 0x42, 0xD1, 0x96, 0x42, 0xD1, 0x98,
+	0x42, 0xD1, 0x9F, 0x42, 0xD2, 0x91, 0x42, 0xD2,
+	0xAB, 0x42, 0xD2, 0xAF, 0x42, 0xD2, 0xB1, 0x42,
+	// Bytes 300 - 33f
+	0xD3, 0x8F, 0x42, 0xD3, 0x99, 0x42, 0xD3, 0xA9,
+	0x42, 0xD7, 0x90, 0x42, 0xD7, 0x91, 0x42, 0xD7,
+	0x92, 0x42, 0xD7, 0x93, 0x42, 0xD7, 0x94, 0x42,
+	0xD7, 0x9B, 0x42, 0xD7, 0x9C, 0x42, 0xD7, 0x9D,
+	0x42, 0xD7, 0xA2, 0x42, 0xD7, 0xA8, 0x42, 0xD7,
+	0xAA, 0x42, 0xD8, 0xA1, 0x42, 0xD8, 0xA7, 0x42,
+	0xD8, 0xA8, 0x42, 0xD8, 0xA9, 0x42, 0xD8, 0xAA,
+	0x42, 0xD8, 0xAB, 0x42, 0xD8, 0xAC, 0x42, 0xD8,
+	// Bytes 340 - 37f
+	0xAD, 0x42, 0xD8, 0xAE, 0x42, 0xD8, 0xAF, 0x42,
+	0xD8, 0xB0, 0x42, 0xD8, 0xB1, 0x42, 0xD8, 0xB2,
+	0x42, 0xD8, 0xB3, 0x42, 0xD8, 0xB4, 0x42, 0xD8,
+	0xB5, 0x42, 0xD8, 0xB6, 0x42, 0xD8, 0xB7, 0x42,
+	0xD8, 0xB8, 0x42, 0xD8, 0xB9, 0x42, 0xD8, 0xBA,
+	0x42, 0xD9, 0x81, 0x42, 0xD9, 0x82, 0x42, 0xD9,
+	0x83, 0x42, 0xD9, 0x84, 0x42, 0xD9, 0x85, 0x42,
+	0xD9, 0x86, 0x42, 0xD9, 0x87, 0x42, 0xD9, 0x88,
+	// Bytes 380 - 3bf
+	0x42, 0xD9, 0x89, 0x42, 0xD9, 0x8A, 0x42, 0xD9,
+	0xAE, 0x42, 0xD9, 0xAF, 0x42, 0xD9, 0xB1, 0x42,
+	0xD9, 0xB9, 0x42, 0xD9, 0xBA, 0x42, 0xD9, 0xBB,
+	0x42, 0xD9, 0xBE, 0x42, 0xD9, 0xBF, 0x42, 0xDA,
+	0x80, 0x42, 0xDA, 0x83, 0x42, 0xDA, 0x84, 0x42,
+	0xDA, 0x86, 0x42, 0xDA, 0x87, 0x42, 0xDA, 0x88,
+	0x42, 0xDA, 0x8C, 0x42, 0xDA, 0x8D, 0x42, 0xDA,
+	0x8E, 0x42, 0xDA, 0x91, 0x42, 0xDA, 0x98, 0x42,
+	// Bytes 3c0 - 3ff
+	0xDA, 0xA1, 0x42, 0xDA, 0xA4, 0x42, 0xDA, 0xA6,
+	0x42, 0xDA, 0xA9, 0x42, 0xDA, 0xAD, 0x42, 0xDA,
+	0xAF, 0x42, 0xDA, 0xB1, 0x42, 0xDA, 0xB3, 0x42,
+	0xDA, 0xBA, 0x42, 0xDA, 0xBB, 0x42, 0xDA, 0xBE,
+	0x42, 0xDB, 0x81, 0x42, 0xDB, 0x85, 0x42, 0xDB,
+	0x86, 0x42, 0xDB, 0x87, 0x42, 0xDB, 0x88, 0x42,
+	0xDB, 0x89, 0x42, 0xDB, 0x8B, 0x42, 0xDB, 0x8C,
+	0x42, 0xDB, 0x90, 0x42, 0xDB, 0x92, 0x43, 0xE0,
+	// Bytes 400 - 43f
+	0xBC, 0x8B, 0x43, 0xE1, 0x83, 0x9C, 0x43, 0xE1,
+	0x84, 0x80, 0x43, 0xE1, 0x84, 0x81, 0x43, 0xE1,
+	0x84, 0x82, 0x43, 0xE1, 0x84, 0x83, 0x43, 0xE1,
+	0x84, 0x84, 0x43, 0xE1, 0x84, 0x85, 0x43, 0xE1,
+	0x84, 0x86, 0x43, 0xE1, 0x84, 0x87, 0x43, 0xE1,
+	0x84, 0x88, 0x43, 0xE1, 0x84, 0x89, 0x43, 0xE1,
+	0x84, 0x8A, 0x43, 0xE1, 0x84, 0x8B, 0x43, 0xE1,
+	0x84, 0x8C, 0x43, 0xE1, 0x84, 0x8D, 0x43, 0xE1,
+	// Bytes 440 - 47f
+	0x84, 0x8E, 0x43, 0xE1, 0x84, 0x8F, 0x43, 0xE1,
+	0x84, 0x90, 0x43, 0xE1, 0x84, 0x91, 0x43, 0xE1,
+	0x84, 0x92, 0x43, 0xE1, 0x84, 0x94, 0x43, 0xE1,
+	0x84, 0x95, 0x43, 0xE1, 0x84, 0x9A, 0x43, 0xE1,
+	0x84, 0x9C, 0x43, 0xE1, 0x84, 0x9D, 0x43, 0xE1,
+	0x84, 0x9E, 0x43, 0xE1, 0x84, 0xA0, 0x43, 0xE1,
+	0x84, 0xA1, 0x43, 0xE1, 0x84, 0xA2, 0x43, 0xE1,
+	0x84, 0xA3, 0x43, 0xE1, 0x84, 0xA7, 0x43, 0xE1,
+	// Bytes 480 - 4bf
+	0x84, 0xA9, 0x43, 0xE1, 0x84, 0xAB, 0x43, 0xE1,
+	0x84, 0xAC, 0x43, 0xE1, 0x84, 0xAD, 0x43, 0xE1,
+	0x84, 0xAE, 0x43, 0xE1, 0x84, 0xAF, 0x43, 0xE1,
+	0x84, 0xB2, 0x43, 0xE1, 0x84, 0xB6, 0x43, 0xE1,
+	0x85, 0x80, 0x43, 0xE1, 0x85, 0x87, 0x43, 0xE1,
+	0x85, 0x8C, 0x43, 0xE1, 0x85, 0x97, 0x43, 0xE1,
+	0x85, 0x98, 0x43, 0xE1, 0x85, 0x99, 0x43, 0xE1,
+	0x85, 0xA0, 0x43, 0xE1, 0x86, 0x84, 0x43, 0xE1,
+	// Bytes 4c0 - 4ff
+	0x86, 0x85, 0x43, 0xE1, 0x86, 0x88, 0x43, 0xE1,
+	0x86, 0x91, 0x43, 0xE1, 0x86, 0x92, 0x43, 0xE1,
+	0x86, 0x94, 0x43, 0xE1, 0x86, 0x9E, 0x43, 0xE1,
+	0x86, 0xA1, 0x43, 0xE1, 0x87, 0x87, 0x43, 0xE1,
+	0x87, 0x88, 0x43, 0xE1, 0x87, 0x8C, 0x43, 0xE1,
+	0x87, 0x8E, 0x43, 0xE1, 0x87, 0x93, 0x43, 0xE1,
+	0x87, 0x97, 0x43, 0xE1, 0x87, 0x99, 0x43, 0xE1,
+	0x87, 0x9D, 0x43, 0xE1, 0x87, 0x9F, 0x43, 0xE1,
+	// Bytes 500 - 53f
+	0x87, 0xB1, 0x43, 0xE1, 0x87, 0xB2, 0x43, 0xE1,
+	0xB4, 0x82, 0x43, 0xE1, 0xB4, 0x96, 0x43, 0xE1,
+	0xB4, 0x97, 0x43, 0xE1, 0xB4, 0x9C, 0x43, 0xE1,
+	0xB4, 0x9D, 0x43, 0xE1, 0xB4, 0xA5, 0x43, 0xE1,
+	0xB5, 0xBB, 0x43, 0xE1, 0xB6, 0x85, 0x43, 0xE1,
+	0xB6, 0x91, 0x43, 0xE2, 0x80, 0x82, 0x43, 0xE2,
+	0x80, 0x83, 0x43, 0xE2, 0x80, 0x90, 0x43, 0xE2,
+	0x80, 0x93, 0x43, 0xE2, 0x80, 0x94, 0x43, 0xE2,
+	// Bytes 540 - 57f
+	0x82, 0xA9, 0x43, 0xE2, 0x86, 0x90, 0x43, 0xE2,
+	0x86, 0x91, 0x43, 0xE2, 0x86, 0x92, 0x43, 0xE2,
+	0x86, 0x93, 0x43, 0xE2, 0x88, 0x82, 0x43, 0xE2,
+	0x88, 0x87, 0x43, 0xE2, 0x88, 0x91, 0x43, 0xE2,
+	0x88, 0x92, 0x43, 0xE2, 0x94, 0x82, 0x43, 0xE2,
+	0x96, 0xA0, 0x43, 0xE2, 0x97, 0x8B, 0x43, 0xE2,
+	0xA6, 0x85, 0x43, 0xE2, 0xA6, 0x86, 0x43, 0xE2,
+	0xB1, 0xB1, 0x43, 0xE2, 0xB5, 0xA1, 0x43, 0xE3,
+	// Bytes 580 - 5bf
+	0x80, 0x81, 0x43, 0xE3, 0x80, 0x82, 0x43, 0xE3,
+	0x80, 0x88, 0x43, 0xE3, 0x80, 0x89, 0x43, 0xE3,
+	0x80, 0x8A, 0x43, 0xE3, 0x80, 0x8B, 0x43, 0xE3,
+	0x80, 0x8C, 0x43, 0xE3, 0x80, 0x8D, 0x43, 0xE3,
+	0x80, 0x8E, 0x43, 0xE3, 0x80, 0x8F, 0x43, 0xE3,
+	0x80, 0x90, 0x43, 0xE3, 0x80, 0x91, 0x43, 0xE3,
+	0x80, 0x92, 0x43, 0xE3, 0x80, 0x94, 0x43, 0xE3,
+	0x80, 0x95, 0x43, 0xE3, 0x80, 0x96, 0x43, 0xE3,
+	// Bytes 5c0 - 5ff
+	0x80, 0x97, 0x43, 0xE3, 0x82, 0xA1, 0x43, 0xE3,
+	0x82, 0xA2, 0x43, 0xE3, 0x82, 0xA3, 0x43, 0xE3,
+	0x82, 0xA4, 0x43, 0xE3, 0x82, 0xA5, 0x43, 0xE3,
+	0x82, 0xA6, 0x43, 0xE3, 0x82, 0xA7, 0x43, 0xE3,
+	0x82, 0xA8, 0x43, 0xE3, 0x82, 0xA9, 0x43, 0xE3,
+	0x82, 0xAA, 0x43, 0xE3, 0x82, 0xAB, 0x43, 0xE3,
+	0x82, 0xAD, 0x43, 0xE3, 0x82, 0xAF, 0x43, 0xE3,
+	0x82, 0xB1, 0x43, 0xE3, 0x82, 0xB3, 0x43, 0xE3,
+	// Bytes 600 - 63f
+	0x82, 0xB5, 0x43, 0xE3, 0x82, 0xB7, 0x43, 0xE3,
+	0x82, 0xB9, 0x43, 0xE3, 0x82, 0xBB, 0x43, 0xE3,
+	0x82, 0xBD, 0x43, 0xE3, 0x82, 0xBF, 0x43, 0xE3,
+	0x83, 0x81, 0x43, 0xE3, 0x83, 0x83, 0x43, 0xE3,
+	0x83, 0x84, 0x43, 0xE3, 0x83, 0x86, 0x43, 0xE3,
+	0x83, 0x88, 0x43, 0xE3, 0x83, 0x8A, 0x43, 0xE3,
+	0x83, 0x8B, 0x43, 0xE3, 0x83, 0x8C, 0x43, 0xE3,
+	0x83, 0x8D, 0x43, 0xE3, 0x83, 0x8E, 0x43, 0xE3,
+	// Bytes 640 - 67f
+	0x83, 0x8F, 0x43, 0xE3, 0x83, 0x92, 0x43, 0xE3,
+	0x83, 0x95, 0x43, 0xE3, 0x83, 0x98, 0x43, 0xE3,
+	0x83, 0x9B, 0x43, 0xE3, 0x83, 0x9E, 0x43, 0xE3,
+	0x83, 0x9F, 0x43, 0xE3, 0x83, 0xA0, 0x43, 0xE3,
+	0x83, 0xA1, 0x43, 0xE3, 0x83, 0xA2, 0x43, 0xE3,
+	0x83, 0xA3, 0x43, 0xE3, 0x83, 0xA4, 0x43, 0xE3,
+	0x83, 0xA5, 0x43, 0xE3, 0x83, 0xA6, 0x43, 0xE3,
+	0x83, 0xA7, 0x43, 0xE3, 0x83, 0xA8, 0x43, 0xE3,
+	// Bytes 680 - 6bf
+	0x83, 0xA9, 0x43, 0xE3, 0x83, 0xAA, 0x43, 0xE3,
+	0x83, 0xAB, 0x43, 0xE3, 0x83, 0xAC, 0x43, 0xE3,
+	0x83, 0xAD, 0x43, 0xE3, 0x83, 0xAF, 0x43, 0xE3,
+	0x83, 0xB0, 0x43, 0xE3, 0x83, 0xB1, 0x43, 0xE3,
+	0x83, 0xB2, 0x43, 0xE3, 0x83, 0xB3, 0x43, 0xE3,
+	0x83, 0xBB, 0x43, 0xE3, 0x83, 0xBC, 0x43, 0xE3,
+	0x92, 0x9E, 0x43, 0xE3, 0x92, 0xB9, 0x43, 0xE3,
+	0x92, 0xBB, 0x43, 0xE3, 0x93, 0x9F, 0x43, 0xE3,
+	// Bytes 6c0 - 6ff
+	0x94, 0x95, 0x43, 0xE3, 0x9B, 0xAE, 0x43, 0xE3,
+	0x9B, 0xBC, 0x43, 0xE3, 0x9E, 0x81, 0x43, 0xE3,
+	0xA0, 0xAF, 0x43, 0xE3, 0xA1, 0xA2, 0x43, 0xE3,
+	0xA1, 0xBC, 0x43, 0xE3, 0xA3, 0x87, 0x43, 0xE3,
+	0xA3, 0xA3, 0x43, 0xE3, 0xA4, 0x9C, 0x43, 0xE3,
+	0xA4, 0xBA, 0x43, 0xE3, 0xA8, 0xAE, 0x43, 0xE3,
+	0xA9, 0xAC, 0x43, 0xE3, 0xAB, 0xA4, 0x43, 0xE3,
+	0xAC, 0x88, 0x43, 0xE3, 0xAC, 0x99, 0x43, 0xE3,
+	// Bytes 700 - 73f
+	0xAD, 0x89, 0x43, 0xE3, 0xAE, 0x9D, 0x43, 0xE3,
+	0xB0, 0x98, 0x43, 0xE3, 0xB1, 0x8E, 0x43, 0xE3,
+	0xB4, 0xB3, 0x43, 0xE3, 0xB6, 0x96, 0x43, 0xE3,
+	0xBA, 0xAC, 0x43, 0xE3, 0xBA, 0xB8, 0x43, 0xE3,
+	0xBC, 0x9B, 0x43, 0xE3, 0xBF, 0xBC, 0x43, 0xE4,
+	0x80, 0x88, 0x43, 0xE4, 0x80, 0x98, 0x43, 0xE4,
+	0x80, 0xB9, 0x43, 0xE4, 0x81, 0x86, 0x43, 0xE4,
+	0x82, 0x96, 0x43, 0xE4, 0x83, 0xA3, 0x43, 0xE4,
+	// Bytes 740 - 77f
+	0x84, 0xAF, 0x43, 0xE4, 0x88, 0x82, 0x43, 0xE4,
+	0x88, 0xA7, 0x43, 0xE4, 0x8A, 0xA0, 0x43, 0xE4,
+	0x8C, 0x81, 0x43, 0xE4, 0x8C, 0xB4, 0x43, 0xE4,
+	0x8D, 0x99, 0x43, 0xE4, 0x8F, 0x95, 0x43, 0xE4,
+	0x8F, 0x99, 0x43, 0xE4, 0x90, 0x8B, 0x43, 0xE4,
+	0x91, 0xAB, 0x43, 0xE4, 0x94, 0xAB, 0x43, 0xE4,
+	0x95, 0x9D, 0x43, 0xE4, 0x95, 0xA1, 0x43, 0xE4,
+	0x95, 0xAB, 0x43, 0xE4, 0x97, 0x97, 0x43, 0xE4,
+	// Bytes 780 - 7bf
+	0x97, 0xB9, 0x43, 0xE4, 0x98, 0xB5, 0x43, 0xE4,
+	0x9A, 0xBE, 0x43, 0xE4, 0x9B, 0x87, 0x43, 0xE4,
+	0xA6, 0x95, 0x43, 0xE4, 0xA7, 0xA6, 0x43, 0xE4,
+	0xA9, 0xAE, 0x43, 0xE4, 0xA9, 0xB6, 0x43, 0xE4,
+	0xAA, 0xB2, 0x43, 0xE4, 0xAC, 0xB3, 0x43, 0xE4,
+	0xAF, 0x8E, 0x43, 0xE4, 0xB3, 0x8E, 0x43, 0xE4,
+	0xB3, 0xAD, 0x43, 0xE4, 0xB3, 0xB8, 0x43, 0xE4,
+	0xB5, 0x96, 0x43, 0xE4, 0xB8, 0x80, 0x43, 0xE4,
+	// Bytes 7c0 - 7ff
+	0xB8, 0x81, 0x43, 0xE4, 0xB8, 0x83, 0x43, 0xE4,
+	0xB8, 0x89, 0x43, 0xE4, 0xB8, 0x8A, 0x43, 0xE4,
+	0xB8, 0x8B, 0x43, 0xE4, 0xB8, 0x8D, 0x43, 0xE4,
+	0xB8, 0x99, 0x43, 0xE4, 0xB8, 0xA6, 0x43, 0xE4,
+	0xB8, 0xA8, 0x43, 0xE4, 0xB8, 0xAD, 0x43, 0xE4,
+	0xB8, 0xB2, 0x43, 0xE4, 0xB8, 0xB6, 0x43, 0xE4,
+	0xB8, 0xB8, 0x43, 0xE4, 0xB8, 0xB9, 0x43, 0xE4,
+	0xB8, 0xBD, 0x43, 0xE4, 0xB8, 0xBF, 0x43, 0xE4,
+	// Bytes 800 - 83f
+	0xB9, 0x81, 0x43, 0xE4, 0xB9, 0x99, 0x43, 0xE4,
+	0xB9, 0x9D, 0x43, 0xE4, 0xBA, 0x82, 0x43, 0xE4,
+	0xBA, 0x85, 0x43, 0xE4, 0xBA, 0x86, 0x43, 0xE4,
+	0xBA, 0x8C, 0x43, 0xE4, 0xBA, 0x94, 0x43, 0xE4,
+	0xBA, 0xA0, 0x43, 0xE4, 0xBA, 0xA4, 0x43, 0xE4,
+	0xBA, 0xAE, 0x43, 0xE4, 0xBA, 0xBA, 0x43, 0xE4,
+	0xBB, 0x80, 0x43, 0xE4, 0xBB, 0x8C, 0x43, 0xE4,
+	0xBB, 0xA4, 0x43, 0xE4, 0xBC, 0x81, 0x43, 0xE4,
+	// Bytes 840 - 87f
+	0xBC, 0x91, 0x43, 0xE4, 0xBD, 0xA0, 0x43, 0xE4,
+	0xBE, 0x80, 0x43, 0xE4, 0xBE, 0x86, 0x43, 0xE4,
+	0xBE, 0x8B, 0x43, 0xE4, 0xBE, 0xAE, 0x43, 0xE4,
+	0xBE, 0xBB, 0x43, 0xE4, 0xBE, 0xBF, 0x43, 0xE5,
+	0x80, 0x82, 0x43, 0xE5, 0x80, 0xAB, 0x43, 0xE5,
+	0x81, 0xBA, 0x43, 0xE5, 0x82, 0x99, 0x43, 0xE5,
+	0x83, 0x8F, 0x43, 0xE5, 0x83, 0x9A, 0x43, 0xE5,
+	0x83, 0xA7, 0x43, 0xE5, 0x84, 0xAA, 0x43, 0xE5,
+	// Bytes 880 - 8bf
+	0x84, 0xBF, 0x43, 0xE5, 0x85, 0x80, 0x43, 0xE5,
+	0x85, 0x85, 0x43, 0xE5, 0x85, 0x8D, 0x43, 0xE5,
+	0x85, 0x94, 0x43, 0xE5, 0x85, 0xA4, 0x43, 0xE5,
+	0x85, 0xA5, 0x43, 0xE5, 0x85, 0xA7, 0x43, 0xE5,
+	0x85, 0xA8, 0x43, 0xE5, 0x85, 0xA9, 0x43, 0xE5,
+	0x85, 0xAB, 0x43, 0xE5, 0x85, 0xAD, 0x43, 0xE5,
+	0x85, 0xB7, 0x43, 0xE5, 0x86, 0x80, 0x43, 0xE5,
+	0x86, 0x82, 0x43, 0xE5, 0x86, 0x8D, 0x43, 0xE5,
+	// Bytes 8c0 - 8ff
+	0x86, 0x92, 0x43, 0xE5, 0x86, 0x95, 0x43, 0xE5,
+	0x86, 0x96, 0x43, 0xE5, 0x86, 0x97, 0x43, 0xE5,
+	0x86, 0x99, 0x43, 0xE5, 0x86, 0xA4, 0x43, 0xE5,
+	0x86, 0xAB, 0x43, 0xE5, 0x86, 0xAC, 0x43, 0xE5,
+	0x86, 0xB5, 0x43, 0xE5, 0x86, 0xB7, 0x43, 0xE5,
+	0x87, 0x89, 0x43, 0xE5, 0x87, 0x8C, 0x43, 0xE5,
+	0x87, 0x9C, 0x43, 0xE5, 0x87, 0x9E, 0x43, 0xE5,
+	0x87, 0xA0, 0x43, 0xE5, 0x87, 0xB5, 0x43, 0xE5,
+	// Bytes 900 - 93f
+	0x88, 0x80, 0x43, 0xE5, 0x88, 0x83, 0x43, 0xE5,
+	0x88, 0x87, 0x43, 0xE5, 0x88, 0x97, 0x43, 0xE5,
+	0x88, 0x9D, 0x43, 0xE5, 0x88, 0xA9, 0x43, 0xE5,
+	0x88, 0xBA, 0x43, 0xE5, 0x88, 0xBB, 0x43, 0xE5,
+	0x89, 0x86, 0x43, 0xE5, 0x89, 0x8D, 0x43, 0xE5,
+	0x89, 0xB2, 0x43, 0xE5, 0x89, 0xB7, 0x43, 0xE5,
+	0x8A, 0x89, 0x43, 0xE5, 0x8A, 0x9B, 0x43, 0xE5,
+	0x8A, 0xA3, 0x43, 0xE5, 0x8A, 0xB3, 0x43, 0xE5,
+	// Bytes 940 - 97f
+	0x8A, 0xB4, 0x43, 0xE5, 0x8B, 0x87, 0x43, 0xE5,
+	0x8B, 0x89, 0x43, 0xE5, 0x8B, 0x92, 0x43, 0xE5,
+	0x8B, 0x9E, 0x43, 0xE5, 0x8B, 0xA4, 0x43, 0xE5,
+	0x8B, 0xB5, 0x43, 0xE5, 0x8B, 0xB9, 0x43, 0xE5,
+	0x8B, 0xBA, 0x43, 0xE5, 0x8C, 0x85, 0x43, 0xE5,
+	0x8C, 0x86, 0x43, 0xE5, 0x8C, 0x95, 0x43, 0xE5,
+	0x8C, 0x97, 0x43, 0xE5, 0x8C, 0x9A, 0x43, 0xE5,
+	0x8C, 0xB8, 0x43, 0xE5, 0x8C, 0xBB, 0x43, 0xE5,
+	// Bytes 980 - 9bf
+	0x8C, 0xBF, 0x43, 0xE5, 0x8D, 0x81, 0x43, 0xE5,
+	0x8D, 0x84, 0x43, 0xE5, 0x8D, 0x85, 0x43, 0xE5,
+	0x8D, 0x89, 0x43, 0xE5, 0x8D, 0x91, 0x43, 0xE5,
+	0x8D, 0x94, 0x43, 0xE5, 0x8D, 0x9A, 0x43, 0xE5,
+	0x8D, 0x9C, 0x43, 0xE5, 0x8D, 0xA9, 0x43, 0xE5,
+	0x8D, 0xB0, 0x43, 0xE5, 0x8D, 0xB3, 0x43, 0xE5,
+	0x8D, 0xB5, 0x43, 0xE5, 0x8D, 0xBD, 0x43, 0xE5,
+	0x8D, 0xBF, 0x43, 0xE5, 0x8E, 0x82, 0x43, 0xE5,
+	// Bytes 9c0 - 9ff
+	0x8E, 0xB6, 0x43, 0xE5, 0x8F, 0x83, 0x43, 0xE5,
+	0x8F, 0x88, 0x43, 0xE5, 0x8F, 0x8A, 0x43, 0xE5,
+	0x8F, 0x8C, 0x43, 0xE5, 0x8F, 0x9F, 0x43, 0xE5,
+	0x8F, 0xA3, 0x43, 0xE5, 0x8F, 0xA5, 0x43, 0xE5,
+	0x8F, 0xAB, 0x43, 0xE5, 0x8F, 0xAF, 0x43, 0xE5,
+	0x8F, 0xB1, 0x43, 0xE5, 0x8F, 0xB3, 0x43, 0xE5,
+	0x90, 0x86, 0x43, 0xE5, 0x90, 0x88, 0x43, 0xE5,
+	0x90, 0x8D, 0x43, 0xE5, 0x90, 0x8F, 0x43, 0xE5,
+	// Bytes a00 - a3f
+	0x90, 0x9D, 0x43, 0xE5, 0x90, 0xB8, 0x43, 0xE5,
+	0x90, 0xB9, 0x43, 0xE5, 0x91, 0x82, 0x43, 0xE5,
+	0x91, 0x88, 0x43, 0xE5, 0x91, 0xA8, 0x43, 0xE5,
+	0x92, 0x9E, 0x43, 0xE5, 0x92, 0xA2, 0x43, 0xE5,
+	0x92, 0xBD, 0x43, 0xE5, 0x93, 0xB6, 0x43, 0xE5,
+	0x94, 0x90, 0x43, 0xE5, 0x95, 0x8F, 0x43, 0xE5,
+	0x95, 0x93, 0x43, 0xE5, 0x95, 0x95, 0x43, 0xE5,
+	0x95, 0xA3, 0x43, 0xE5, 0x96, 0x84, 0x43, 0xE5,
+	// Bytes a40 - a7f
+	0x96, 0x87, 0x43, 0xE5, 0x96, 0x99, 0x43, 0xE5,
+	0x96, 0x9D, 0x43, 0xE5, 0x96, 0xAB, 0x43, 0xE5,
+	0x96, 0xB3, 0x43, 0xE5, 0x96, 0xB6, 0x43, 0xE5,
+	0x97, 0x80, 0x43, 0xE5, 0x97, 0x82, 0x43, 0xE5,
+	0x97, 0xA2, 0x43, 0xE5, 0x98, 0x86, 0x43, 0xE5,
+	0x99, 0x91, 0x43, 0xE5, 0x99, 0xA8, 0x43, 0xE5,
+	0x99, 0xB4, 0x43, 0xE5, 0x9B, 0x97, 0x43, 0xE5,
+	0x9B, 0x9B, 0x43, 0xE5, 0x9B, 0xB9, 0x43, 0xE5,
+	// Bytes a80 - abf
+	0x9C, 0x96, 0x43, 0xE5, 0x9C, 0x97, 0x43, 0xE5,
+	0x9C, 0x9F, 0x43, 0xE5, 0x9C, 0xB0, 0x43, 0xE5,
+	0x9E, 0x8B, 0x43, 0xE5, 0x9F, 0x8E, 0x43, 0xE5,
+	0x9F, 0xB4, 0x43, 0xE5, 0xA0, 0x8D, 0x43, 0xE5,
+	0xA0, 0xB1, 0x43, 0xE5, 0xA0, 0xB2, 0x43, 0xE5,
+	0xA1, 0x80, 0x43, 0xE5, 0xA1, 0x9A, 0x43, 0xE5,
+	0xA1, 0x9E, 0x43, 0xE5, 0xA2, 0xA8, 0x43, 0xE5,
+	0xA2, 0xAC, 0x43, 0xE5, 0xA2, 0xB3, 0x43, 0xE5,
+	// Bytes ac0 - aff
+	0xA3, 0x98, 0x43, 0xE5, 0xA3, 0x9F, 0x43, 0xE5,
+	0xA3, 0xAB, 0x43, 0xE5, 0xA3, 0xAE, 0x43, 0xE5,
+	0xA3, 0xB0, 0x43, 0xE5, 0xA3, 0xB2, 0x43, 0xE5,
+	0xA3, 0xB7, 0x43, 0xE5, 0xA4, 0x82, 0x43, 0xE5,
+	0xA4, 0x86, 0x43, 0xE5, 0xA4, 0x8A, 0x43, 0xE5,
+	0xA4, 0x95, 0x43, 0xE5, 0xA4, 0x9A, 0x43, 0xE5,
+	0xA4, 0x9C, 0x43, 0xE5, 0xA4, 0xA2, 0x43, 0xE5,
+	0xA4, 0xA7, 0x43, 0xE5, 0xA4, 0xA9, 0x43, 0xE5,
+	// Bytes b00 - b3f
+	0xA5, 0x84, 0x43, 0xE5, 0xA5, 0x88, 0x43, 0xE5,
+	0xA5, 0x91, 0x43, 0xE5, 0xA5, 0x94, 0x43, 0xE5,
+	0xA5, 0xA2, 0x43, 0xE5, 0xA5, 0xB3, 0x43, 0xE5,
+	0xA7, 0x98, 0x43, 0xE5, 0xA7, 0xAC, 0x43, 0xE5,
+	0xA8, 0x9B, 0x43, 0xE5, 0xA8, 0xA7, 0x43, 0xE5,
+	0xA9, 0xA2, 0x43, 0xE5, 0xA9, 0xA6, 0x43, 0xE5,
+	0xAA, 0xB5, 0x43, 0xE5, 0xAC, 0x88, 0x43, 0xE5,
+	0xAC, 0xA8, 0x43, 0xE5, 0xAC, 0xBE, 0x43, 0xE5,
+	// Bytes b40 - b7f
+	0xAD, 0x90, 0x43, 0xE5, 0xAD, 0x97, 0x43, 0xE5,
+	0xAD, 0xA6, 0x43, 0xE5, 0xAE, 0x80, 0x43, 0xE5,
+	0xAE, 0x85, 0x43, 0xE5, 0xAE, 0x97, 0x43, 0xE5,
+	0xAF, 0x83, 0x43, 0xE5, 0xAF, 0x98, 0x43, 0xE5,
+	0xAF, 0xA7, 0x43, 0xE5, 0xAF, 0xAE, 0x43, 0xE5,
+	0xAF, 0xB3, 0x43, 0xE5, 0xAF, 0xB8, 0x43, 0xE5,
+	0xAF, 0xBF, 0x43, 0xE5, 0xB0, 0x86, 0x43, 0xE5,
+	0xB0, 0x8F, 0x43, 0xE5, 0xB0, 0xA2, 0x43, 0xE5,
+	// Bytes b80 - bbf
+	0xB0, 0xB8, 0x43, 0xE5, 0xB0, 0xBF, 0x43, 0xE5,
+	0xB1, 0xA0, 0x43, 0xE5, 0xB1, 0xA2, 0x43, 0xE5,
+	0xB1, 0xA4, 0x43, 0xE5, 0xB1, 0xA5, 0x43, 0xE5,
+	0xB1, 0xAE, 0x43, 0xE5, 0xB1, 0xB1, 0x43, 0xE5,
+	0xB2, 0x8D, 0x43, 0xE5, 0xB3, 0x80, 0x43, 0xE5,
+	0xB4, 0x99, 0x43, 0xE5, 0xB5, 0x83, 0x43, 0xE5,
+	0xB5, 0x90, 0x43, 0xE5, 0xB5, 0xAB, 0x43, 0xE5,
+	0xB5, 0xAE, 0x43, 0xE5, 0xB5, 0xBC, 0x43, 0xE5,
+	// Bytes bc0 - bff
+	0xB6, 0xB2, 0x43, 0xE5, 0xB6, 0xBA, 0x43, 0xE5,
+	0xB7, 0x9B, 0x43, 0xE5, 0xB7, 0xA1, 0x43, 0xE5,
+	0xB7, 0xA2, 0x43, 0xE5, 0xB7, 0xA5, 0x43, 0xE5,
+	0xB7, 0xA6, 0x43, 0xE5, 0xB7, 0xB1, 0x43, 0xE5,
+	0xB7, 0xBD, 0x43, 0xE5, 0xB7, 0xBE, 0x43, 0xE5,
+	0xB8, 0xA8, 0x43, 0xE5, 0xB8, 0xBD, 0x43, 0xE5,
+	0xB9, 0xA9, 0x43, 0xE5, 0xB9, 0xB2, 0x43, 0xE5,
+	0xB9, 0xB4, 0x43, 0xE5, 0xB9, 0xBA, 0x43, 0xE5,
+	// Bytes c00 - c3f
+	0xB9, 0xBC, 0x43, 0xE5, 0xB9, 0xBF, 0x43, 0xE5,
+	0xBA, 0xA6, 0x43, 0xE5, 0xBA, 0xB0, 0x43, 0xE5,
+	0xBA, 0xB3, 0x43, 0xE5, 0xBA, 0xB6, 0x43, 0xE5,
+	0xBB, 0x89, 0x43, 0xE5, 0xBB, 0x8A, 0x43, 0xE5,
+	0xBB, 0x92, 0x43, 0xE5, 0xBB, 0x93, 0x43, 0xE5,
+	0xBB, 0x99, 0x43, 0xE5, 0xBB, 0xAC, 0x43, 0xE5,
+	0xBB, 0xB4, 0x43, 0xE5, 0xBB, 0xBE, 0x43, 0xE5,
+	0xBC, 0x84, 0x43, 0xE5, 0xBC, 0x8B, 0x43, 0xE5,
+	// Bytes c40 - c7f
+	0xBC, 0x93, 0x43, 0xE5, 0xBC, 0xA2, 0x43, 0xE5,
+	0xBD, 0x90, 0x43, 0xE5, 0xBD, 0x93, 0x43, 0xE5,
+	0xBD, 0xA1, 0x43, 0xE5, 0xBD, 0xA2, 0x43, 0xE5,
+	0xBD, 0xA9, 0x43, 0xE5, 0xBD, 0xAB, 0x43, 0xE5,
+	0xBD, 0xB3, 0x43, 0xE5, 0xBE, 0x8B, 0x43, 0xE5,
+	0xBE, 0x8C, 0x43, 0xE5, 0xBE, 0x97, 0x43, 0xE5,
+	0xBE, 0x9A, 0x43, 0xE5, 0xBE, 0xA9, 0x43, 0xE5,
+	0xBE, 0xAD, 0x43, 0xE5, 0xBF, 0x83, 0x43, 0xE5,
+	// Bytes c80 - cbf
+	0xBF, 0x8D, 0x43, 0xE5, 0xBF, 0x97, 0x43, 0xE5,
+	0xBF, 0xB5, 0x43, 0xE5, 0xBF, 0xB9, 0x43, 0xE6,
+	0x80, 0x92, 0x43, 0xE6, 0x80, 0x9C, 0x43, 0xE6,
+	0x81, 0xB5, 0x43, 0xE6, 0x82, 0x81, 0x43, 0xE6,
+	0x82, 0x94, 0x43, 0xE6, 0x83, 0x87, 0x43, 0xE6,
+	0x83, 0x98, 0x43, 0xE6, 0x83, 0xA1, 0x43, 0xE6,
+	0x84, 0x88, 0x43, 0xE6, 0x85, 0x84, 0x43, 0xE6,
+	0x85, 0x88, 0x43, 0xE6, 0x85, 0x8C, 0x43, 0xE6,
+	// Bytes cc0 - cff
+	0x85, 0x8E, 0x43, 0xE6, 0x85, 0xA0, 0x43, 0xE6,
+	0x85, 0xA8, 0x43, 0xE6, 0x85, 0xBA, 0x43, 0xE6,
+	0x86, 0x8E, 0x43, 0xE6, 0x86, 0x90, 0x43, 0xE6,
+	0x86, 0xA4, 0x43, 0xE6, 0x86, 0xAF, 0x43, 0xE6,
+	0x86, 0xB2, 0x43, 0xE6, 0x87, 0x9E, 0x43, 0xE6,
+	0x87, 0xB2, 0x43, 0xE6, 0x87, 0xB6, 0x43, 0xE6,
+	0x88, 0x80, 0x43, 0xE6, 0x88, 0x88, 0x43, 0xE6,
+	0x88, 0x90, 0x43, 0xE6, 0x88, 0x9B, 0x43, 0xE6,
+	// Bytes d00 - d3f
+	0x88, 0xAE, 0x43, 0xE6, 0x88, 0xB4, 0x43, 0xE6,
+	0x88, 0xB6, 0x43, 0xE6, 0x89, 0x8B, 0x43, 0xE6,
+	0x89, 0x93, 0x43, 0xE6, 0x89, 0x9D, 0x43, 0xE6,
+	0x8A, 0x95, 0x43, 0xE6, 0x8A, 0xB1, 0x43, 0xE6,
+	0x8B, 0x89, 0x43, 0xE6, 0x8B, 0x8F, 0x43, 0xE6,
+	0x8B, 0x93, 0x43, 0xE6, 0x8B, 0x94, 0x43, 0xE6,
+	0x8B, 0xBC, 0x43, 0xE6, 0x8B, 0xBE, 0x43, 0xE6,
+	0x8C, 0x87, 0x43, 0xE6, 0x8C, 0xBD, 0x43, 0xE6,
+	// Bytes d40 - d7f
+	0x8D, 0x90, 0x43, 0xE6, 0x8D, 0x95, 0x43, 0xE6,
+	0x8D, 0xA8, 0x43, 0xE6, 0x8D, 0xBB, 0x43, 0xE6,
+	0x8E, 0x83, 0x43, 0xE6, 0x8E, 0xA0, 0x43, 0xE6,
+	0x8E, 0xA9, 0x43, 0xE6, 0x8F, 0x84, 0x43, 0xE6,
+	0x8F, 0x85, 0x43, 0xE6, 0x8F, 0xA4, 0x43, 0xE6,
+	0x90, 0x9C, 0x43, 0xE6, 0x90, 0xA2, 0x43, 0xE6,
+	0x91, 0x92, 0x43, 0xE6, 0x91, 0xA9, 0x43, 0xE6,
+	0x91, 0xB7, 0x43, 0xE6, 0x91, 0xBE, 0x43, 0xE6,
+	// Bytes d80 - dbf
+	0x92, 0x9A, 0x43, 0xE6, 0x92, 0x9D, 0x43, 0xE6,
+	0x93, 0x84, 0x43, 0xE6, 0x94, 0xAF, 0x43, 0xE6,
+	0x94, 0xB4, 0x43, 0xE6, 0x95, 0x8F, 0x43, 0xE6,
+	0x95, 0x96, 0x43, 0xE6, 0x95, 0xAC, 0x43, 0xE6,
+	0x95, 0xB8, 0x43, 0xE6, 0x96, 0x87, 0x43, 0xE6,
+	0x96, 0x97, 0x43, 0xE6, 0x96, 0x99, 0x43, 0xE6,
+	0x96, 0xA4, 0x43, 0xE6, 0x96, 0xB0, 0x43, 0xE6,
+	0x96, 0xB9, 0x43, 0xE6, 0x97, 0x85, 0x43, 0xE6,
+	// Bytes dc0 - dff
+	0x97, 0xA0, 0x43, 0xE6, 0x97, 0xA2, 0x43, 0xE6,
+	0x97, 0xA3, 0x43, 0xE6, 0x97, 0xA5, 0x43, 0xE6,
+	0x98, 0x93, 0x43, 0xE6, 0x98, 0xA0, 0x43, 0xE6,
+	0x99, 0x89, 0x43, 0xE6, 0x99, 0xB4, 0x43, 0xE6,
+	0x9A, 0x88, 0x43, 0xE6, 0x9A, 0x91, 0x43, 0xE6,
+	0x9A, 0x9C, 0x43, 0xE6, 0x9A, 0xB4, 0x43, 0xE6,
+	0x9B, 0x86, 0x43, 0xE6, 0x9B, 0xB0, 0x43, 0xE6,
+	0x9B, 0xB4, 0x43, 0xE6, 0x9B, 0xB8, 0x43, 0xE6,
+	// Bytes e00 - e3f
+	0x9C, 0x80, 0x43, 0xE6, 0x9C, 0x88, 0x43, 0xE6,
+	0x9C, 0x89, 0x43, 0xE6, 0x9C, 0x97, 0x43, 0xE6,
+	0x9C, 0x9B, 0x43, 0xE6, 0x9C, 0xA1, 0x43, 0xE6,
+	0x9C, 0xA8, 0x43, 0xE6, 0x9D, 0x8E, 0x43, 0xE6,
+	0x9D, 0x93, 0x43, 0xE6, 0x9D, 0x96, 0x43, 0xE6,
+	0x9D, 0x9E, 0x43, 0xE6, 0x9D, 0xBB, 0x43, 0xE6,
+	0x9E, 0x85, 0x43, 0xE6, 0x9E, 0x97, 0x43, 0xE6,
+	0x9F, 0xB3, 0x43, 0xE6, 0x9F, 0xBA, 0x43, 0xE6,
+	// Bytes e40 - e7f
+	0xA0, 0x97, 0x43, 0xE6, 0xA0, 0x9F, 0x43, 0xE6,
+	0xA0, 0xAA, 0x43, 0xE6, 0xA1, 0x92, 0x43, 0xE6,
+	0xA2, 0x81, 0x43, 0xE6, 0xA2, 0x85, 0x43, 0xE6,
+	0xA2, 0x8E, 0x43, 0xE6, 0xA2, 0xA8, 0x43, 0xE6,
+	0xA4, 0x94, 0x43, 0xE6, 0xA5, 0x82, 0x43, 0xE6,
+	0xA6, 0xA3, 0x43, 0xE6, 0xA7, 0xAA, 0x43, 0xE6,
+	0xA8, 0x82, 0x43, 0xE6, 0xA8, 0x93, 0x43, 0xE6,
+	0xAA, 0xA8, 0x43, 0xE6, 0xAB, 0x93, 0x43, 0xE6,
+	// Bytes e80 - ebf
+	0xAB, 0x9B, 0x43, 0xE6, 0xAC, 0x84, 0x43, 0xE6,
+	0xAC, 0xA0, 0x43, 0xE6, 0xAC, 0xA1, 0x43, 0xE6,
+	0xAD, 0x94, 0x43, 0xE6, 0xAD, 0xA2, 0x43, 0xE6,
+	0xAD, 0xA3, 0x43, 0xE6, 0xAD, 0xB2, 0x43, 0xE6,
+	0xAD, 0xB7, 0x43, 0xE6, 0xAD, 0xB9, 0x43, 0xE6,
+	0xAE, 0x9F, 0x43, 0xE6, 0xAE, 0xAE, 0x43, 0xE6,
+	0xAE, 0xB3, 0x43, 0xE6, 0xAE, 0xBA, 0x43, 0xE6,
+	0xAE, 0xBB, 0x43, 0xE6, 0xAF, 0x8B, 0x43, 0xE6,
+	// Bytes ec0 - eff
+	0xAF, 0x8D, 0x43, 0xE6, 0xAF, 0x94, 0x43, 0xE6,
+	0xAF, 0x9B, 0x43, 0xE6, 0xB0, 0x8F, 0x43, 0xE6,
+	0xB0, 0x94, 0x43, 0xE6, 0xB0, 0xB4, 0x43, 0xE6,
+	0xB1, 0x8E, 0x43, 0xE6, 0xB1, 0xA7, 0x43, 0xE6,
+	0xB2, 0x88, 0x43, 0xE6, 0xB2, 0xBF, 0x43, 0xE6,
+	0xB3, 0x8C, 0x43, 0xE6, 0xB3, 0x8D, 0x43, 0xE6,
+	0xB3, 0xA5, 0x43, 0xE6, 0xB3, 0xA8, 0x43, 0xE6,
+	0xB4, 0x96, 0x43, 0xE6, 0xB4, 0x9B, 0x43, 0xE6,
+	// Bytes f00 - f3f
+	0xB4, 0x9E, 0x43, 0xE6, 0xB4, 0xB4, 0x43, 0xE6,
+	0xB4, 0xBE, 0x43, 0xE6, 0xB5, 0x81, 0x43, 0xE6,
+	0xB5, 0xA9, 0x43, 0xE6, 0xB5, 0xAA, 0x43, 0xE6,
+	0xB5, 0xB7, 0x43, 0xE6, 0xB5, 0xB8, 0x43, 0xE6,
+	0xB6, 0x85, 0x43, 0xE6, 0xB7, 0x8B, 0x43, 0xE6,
+	0xB7, 0x9A, 0x43, 0xE6, 0xB7, 0xAA, 0x43, 0xE6,
+	0xB7, 0xB9, 0x43, 0xE6, 0xB8, 0x9A, 0x43, 0xE6,
+	0xB8, 0xAF, 0x43, 0xE6, 0xB9, 0xAE, 0x43, 0xE6,
+	// Bytes f40 - f7f
+	0xBA, 0x80, 0x43, 0xE6, 0xBA, 0x9C, 0x43, 0xE6,
+	0xBA, 0xBA, 0x43, 0xE6, 0xBB, 0x87, 0x43, 0xE6,
+	0xBB, 0x8B, 0x43, 0xE6, 0xBB, 0x91, 0x43, 0xE6,
+	0xBB, 0x9B, 0x43, 0xE6, 0xBC, 0x8F, 0x43, 0xE6,
+	0xBC, 0x94, 0x43, 0xE6, 0xBC, 0xA2, 0x43, 0xE6,
+	0xBC, 0xA3, 0x43, 0xE6, 0xBD, 0xAE, 0x43, 0xE6,
+	0xBF, 0x86, 0x43, 0xE6, 0xBF, 0xAB, 0x43, 0xE6,
+	0xBF, 0xBE, 0x43, 0xE7, 0x80, 0x9B, 0x43, 0xE7,
+	// Bytes f80 - fbf
+	0x80, 0x9E, 0x43, 0xE7, 0x80, 0xB9, 0x43, 0xE7,
+	0x81, 0x8A, 0x43, 0xE7, 0x81, 0xAB, 0x43, 0xE7,
+	0x81, 0xB0, 0x43, 0xE7, 0x81, 0xB7, 0x43, 0xE7,
+	0x81, 0xBD, 0x43, 0xE7, 0x82, 0x99, 0x43, 0xE7,
+	0x82, 0xAD, 0x43, 0xE7, 0x83, 0x88, 0x43, 0xE7,
+	0x83, 0x99, 0x43, 0xE7, 0x84, 0xA1, 0x43, 0xE7,
+	0x85, 0x85, 0x43, 0xE7, 0x85, 0x89, 0x43, 0xE7,
+	0x85, 0xAE, 0x43, 0xE7, 0x86, 0x9C, 0x43, 0xE7,
+	// Bytes fc0 - fff
+	0x87, 0x8E, 0x43, 0xE7, 0x87, 0x90, 0x43, 0xE7,
+	0x88, 0x90, 0x43, 0xE7, 0x88, 0x9B, 0x43, 0xE7,
+	0x88, 0xA8, 0x43, 0xE7, 0x88, 0xAA, 0x43, 0xE7,
+	0x88, 0xAB, 0x43, 0xE7, 0x88, 0xB5, 0x43, 0xE7,
+	0x88, 0xB6, 0x43, 0xE7, 0x88, 0xBB, 0x43, 0xE7,
+	0x88, 0xBF, 0x43, 0xE7, 0x89, 0x87, 0x43, 0xE7,
+	0x89, 0x90, 0x43, 0xE7, 0x89, 0x99, 0x43, 0xE7,
+	0x89, 0x9B, 0x43, 0xE7, 0x89, 0xA2, 0x43, 0xE7,
+	// Bytes 1000 - 103f
+	0x89, 0xB9, 0x43, 0xE7, 0x8A, 0x80, 0x43, 0xE7,
+	0x8A, 0x95, 0x43, 0xE7, 0x8A, 0xAC, 0x43, 0xE7,
+	0x8A, 0xAF, 0x43, 0xE7, 0x8B, 0x80, 0x43, 0xE7,
+	0x8B, 0xBC, 0x43, 0xE7, 0x8C, 0xAA, 0x43, 0xE7,
+	0x8D, 0xB5, 0x43, 0xE7, 0x8D, 0xBA, 0x43, 0xE7,
+	0x8E, 0x84, 0x43, 0xE7, 0x8E, 0x87, 0x43, 0xE7,
+	0x8E, 0x89, 0x43, 0xE7, 0x8E, 0x8B, 0x43, 0xE7,
+	0x8E, 0xA5, 0x43, 0xE7, 0x8E, 0xB2, 0x43, 0xE7,
+	// Bytes 1040 - 107f
+	0x8F, 0x9E, 0x43, 0xE7, 0x90, 0x86, 0x43, 0xE7,
+	0x90, 0x89, 0x43, 0xE7, 0x90, 0xA2, 0x43, 0xE7,
+	0x91, 0x87, 0x43, 0xE7, 0x91, 0x9C, 0x43, 0xE7,
+	0x91, 0xA9, 0x43, 0xE7, 0x91, 0xB1, 0x43, 0xE7,
+	0x92, 0x85, 0x43, 0xE7, 0x92, 0x89, 0x43, 0xE7,
+	0x92, 0x98, 0x43, 0xE7, 0x93, 0x8A, 0x43, 0xE7,
+	0x93, 0x9C, 0x43, 0xE7, 0x93, 0xA6, 0x43, 0xE7,
+	0x94, 0x86, 0x43, 0xE7, 0x94, 0x98, 0x43, 0xE7,
+	// Bytes 1080 - 10bf
+	0x94, 0x9F, 0x43, 0xE7, 0x94, 0xA4, 0x43, 0xE7,
+	0x94, 0xA8, 0x43, 0xE7, 0x94, 0xB0, 0x43, 0xE7,
+	0x94, 0xB2, 0x43, 0xE7, 0x94, 0xB3, 0x43, 0xE7,
+	0x94, 0xB7, 0x43, 0xE7, 0x94, 0xBB, 0x43, 0xE7,
+	0x94, 0xBE, 0x43, 0xE7, 0x95, 0x99, 0x43, 0xE7,
+	0x95, 0xA5, 0x43, 0xE7, 0x95, 0xB0, 0x43, 0xE7,
+	0x96, 0x8B, 0x43, 0xE7, 0x96, 0x92, 0x43, 0xE7,
+	0x97, 0xA2, 0x43, 0xE7, 0x98, 0x90, 0x43, 0xE7,
+	// Bytes 10c0 - 10ff
+	0x98, 0x9D, 0x43, 0xE7, 0x98, 0x9F, 0x43, 0xE7,
+	0x99, 0x82, 0x43, 0xE7, 0x99, 0xA9, 0x43, 0xE7,
+	0x99, 0xB6, 0x43, 0xE7, 0x99, 0xBD, 0x43, 0xE7,
+	0x9A, 0xAE, 0x43, 0xE7, 0x9A, 0xBF, 0x43, 0xE7,
+	0x9B, 0x8A, 0x43, 0xE7, 0x9B, 0x9B, 0x43, 0xE7,
+	0x9B, 0xA3, 0x43, 0xE7, 0x9B, 0xA7, 0x43, 0xE7,
+	0x9B, 0xAE, 0x43, 0xE7, 0x9B, 0xB4, 0x43, 0xE7,
+	0x9C, 0x81, 0x43, 0xE7, 0x9C, 0x9E, 0x43, 0xE7,
+	// Bytes 1100 - 113f
+	0x9C, 0x9F, 0x43, 0xE7, 0x9D, 0x80, 0x43, 0xE7,
+	0x9D, 0x8A, 0x43, 0xE7, 0x9E, 0x8B, 0x43, 0xE7,
+	0x9E, 0xA7, 0x43, 0xE7, 0x9F, 0x9B, 0x43, 0xE7,
+	0x9F, 0xA2, 0x43, 0xE7, 0x9F, 0xB3, 0x43, 0xE7,
+	0xA1, 0x8E, 0x43, 0xE7, 0xA1, 0xAB, 0x43, 0xE7,
+	0xA2, 0x8C, 0x43, 0xE7, 0xA2, 0x91, 0x43, 0xE7,
+	0xA3, 0x8A, 0x43, 0xE7, 0xA3, 0x8C, 0x43, 0xE7,
+	0xA3, 0xBB, 0x43, 0xE7, 0xA4, 0xAA, 0x43, 0xE7,
+	// Bytes 1140 - 117f
+	0xA4, 0xBA, 0x43, 0xE7, 0xA4, 0xBC, 0x43, 0xE7,
+	0xA4, 0xBE, 0x43, 0xE7, 0xA5, 0x88, 0x43, 0xE7,
+	0xA5, 0x89, 0x43, 0xE7, 0xA5, 0x90, 0x43, 0xE7,
+	0xA5, 0x96, 0x43, 0xE7, 0xA5, 0x9D, 0x43, 0xE7,
+	0xA5, 0x9E, 0x43, 0xE7, 0xA5, 0xA5, 0x43, 0xE7,
+	0xA5, 0xBF, 0x43, 0xE7, 0xA6, 0x81, 0x43, 0xE7,
+	0xA6, 0x8D, 0x43, 0xE7, 0xA6, 0x8E, 0x43, 0xE7,
+	0xA6, 0x8F, 0x43, 0xE7, 0xA6, 0xAE, 0x43, 0xE7,
+	// Bytes 1180 - 11bf
+	0xA6, 0xB8, 0x43, 0xE7, 0xA6, 0xBE, 0x43, 0xE7,
+	0xA7, 0x8A, 0x43, 0xE7, 0xA7, 0x98, 0x43, 0xE7,
+	0xA7, 0xAB, 0x43, 0xE7, 0xA8, 0x9C, 0x43, 0xE7,
+	0xA9, 0x80, 0x43, 0xE7, 0xA9, 0x8A, 0x43, 0xE7,
+	0xA9, 0x8F, 0x43, 0xE7, 0xA9, 0xB4, 0x43, 0xE7,
+	0xA9, 0xBA, 0x43, 0xE7, 0xAA, 0x81, 0x43, 0xE7,
+	0xAA, 0xB1, 0x43, 0xE7, 0xAB, 0x8B, 0x43, 0xE7,
+	0xAB, 0xAE, 0x43, 0xE7, 0xAB, 0xB9, 0x43, 0xE7,
+	// Bytes 11c0 - 11ff
+	0xAC, 0xA0, 0x43, 0xE7, 0xAE, 0x8F, 0x43, 0xE7,
+	0xAF, 0x80, 0x43, 0xE7, 0xAF, 0x86, 0x43, 0xE7,
+	0xAF, 0x89, 0x43, 0xE7, 0xB0, 0xBE, 0x43, 0xE7,
+	0xB1, 0xA0, 0x43, 0xE7, 0xB1, 0xB3, 0x43, 0xE7,
+	0xB1, 0xBB, 0x43, 0xE7, 0xB2, 0x92, 0x43, 0xE7,
+	0xB2, 0xBE, 0x43, 0xE7, 0xB3, 0x92, 0x43, 0xE7,
+	0xB3, 0x96, 0x43, 0xE7, 0xB3, 0xA3, 0x43, 0xE7,
+	0xB3, 0xA7, 0x43, 0xE7, 0xB3, 0xA8, 0x43, 0xE7,
+	// Bytes 1200 - 123f
+	0xB3, 0xB8, 0x43, 0xE7, 0xB4, 0x80, 0x43, 0xE7,
+	0xB4, 0x90, 0x43, 0xE7, 0xB4, 0xA2, 0x43, 0xE7,
+	0xB4, 0xAF, 0x43, 0xE7, 0xB5, 0x82, 0x43, 0xE7,
+	0xB5, 0x9B, 0x43, 0xE7, 0xB5, 0xA3, 0x43, 0xE7,
+	0xB6, 0xA0, 0x43, 0xE7, 0xB6, 0xBE, 0x43, 0xE7,
+	0xB7, 0x87, 0x43, 0xE7, 0xB7, 0xB4, 0x43, 0xE7,
+	0xB8, 0x82, 0x43, 0xE7, 0xB8, 0x89, 0x43, 0xE7,
+	0xB8, 0xB7, 0x43, 0xE7, 0xB9, 0x81, 0x43, 0xE7,
+	// Bytes 1240 - 127f
+	0xB9, 0x85, 0x43, 0xE7, 0xBC, 0xB6, 0x43, 0xE7,
+	0xBC, 0xBE, 0x43, 0xE7, 0xBD, 0x91, 0x43, 0xE7,
+	0xBD, 0xB2, 0x43, 0xE7, 0xBD, 0xB9, 0x43, 0xE7,
+	0xBD, 0xBA, 0x43, 0xE7, 0xBE, 0x85, 0x43, 0xE7,
+	0xBE, 0x8A, 0x43, 0xE7, 0xBE, 0x95, 0x43, 0xE7,
+	0xBE, 0x9A, 0x43, 0xE7, 0xBE, 0xBD, 0x43, 0xE7,
+	0xBF, 0xBA, 0x43, 0xE8, 0x80, 0x81, 0x43, 0xE8,
+	0x80, 0x85, 0x43, 0xE8, 0x80, 0x8C, 0x43, 0xE8,
+	// Bytes 1280 - 12bf
+	0x80, 0x92, 0x43, 0xE8, 0x80, 0xB3, 0x43, 0xE8,
+	0x81, 0x86, 0x43, 0xE8, 0x81, 0xA0, 0x43, 0xE8,
+	0x81, 0xAF, 0x43, 0xE8, 0x81, 0xB0, 0x43, 0xE8,
+	0x81, 0xBE, 0x43, 0xE8, 0x81, 0xBF, 0x43, 0xE8,
+	0x82, 0x89, 0x43, 0xE8, 0x82, 0x8B, 0x43, 0xE8,
+	0x82, 0xAD, 0x43, 0xE8, 0x82, 0xB2, 0x43, 0xE8,
+	0x84, 0x83, 0x43, 0xE8, 0x84, 0xBE, 0x43, 0xE8,
+	0x87, 0x98, 0x43, 0xE8, 0x87, 0xA3, 0x43, 0xE8,
+	// Bytes 12c0 - 12ff
+	0x87, 0xA8, 0x43, 0xE8, 0x87, 0xAA, 0x43, 0xE8,
+	0x87, 0xAD, 0x43, 0xE8, 0x87, 0xB3, 0x43, 0xE8,
+	0x87, 0xBC, 0x43, 0xE8, 0x88, 0x81, 0x43, 0xE8,
+	0x88, 0x84, 0x43, 0xE8, 0x88, 0x8C, 0x43, 0xE8,
+	0x88, 0x98, 0x43, 0xE8, 0x88, 0x9B, 0x43, 0xE8,
+	0x88, 0x9F, 0x43, 0xE8, 0x89, 0xAE, 0x43, 0xE8,
+	0x89, 0xAF, 0x43, 0xE8, 0x89, 0xB2, 0x43, 0xE8,
+	0x89, 0xB8, 0x43, 0xE8, 0x89, 0xB9, 0x43, 0xE8,
+	// Bytes 1300 - 133f
+	0x8A, 0x8B, 0x43, 0xE8, 0x8A, 0x91, 0x43, 0xE8,
+	0x8A, 0x9D, 0x43, 0xE8, 0x8A, 0xB1, 0x43, 0xE8,
+	0x8A, 0xB3, 0x43, 0xE8, 0x8A, 0xBD, 0x43, 0xE8,
+	0x8B, 0xA5, 0x43, 0xE8, 0x8B, 0xA6, 0x43, 0xE8,
+	0x8C, 0x9D, 0x43, 0xE8, 0x8C, 0xA3, 0x43, 0xE8,
+	0x8C, 0xB6, 0x43, 0xE8, 0x8D, 0x92, 0x43, 0xE8,
+	0x8D, 0x93, 0x43, 0xE8, 0x8D, 0xA3, 0x43, 0xE8,
+	0x8E, 0xAD, 0x43, 0xE8, 0x8E, 0xBD, 0x43, 0xE8,
+	// Bytes 1340 - 137f
+	0x8F, 0x89, 0x43, 0xE8, 0x8F, 0x8A, 0x43, 0xE8,
+	0x8F, 0x8C, 0x43, 0xE8, 0x8F, 0x9C, 0x43, 0xE8,
+	0x8F, 0xA7, 0x43, 0xE8, 0x8F, 0xAF, 0x43, 0xE8,
+	0x8F, 0xB1, 0x43, 0xE8, 0x90, 0xBD, 0x43, 0xE8,
+	0x91, 0x89, 0x43, 0xE8, 0x91, 0x97, 0x43, 0xE8,
+	0x93, 0xAE, 0x43, 0xE8, 0x93, 0xB1, 0x43, 0xE8,
+	0x93, 0xB3, 0x43, 0xE8, 0x93, 0xBC, 0x43, 0xE8,
+	0x94, 0x96, 0x43, 0xE8, 0x95, 0xA4, 0x43, 0xE8,
+	// Bytes 1380 - 13bf
+	0x97, 0x8D, 0x43, 0xE8, 0x97, 0xBA, 0x43, 0xE8,
+	0x98, 0x86, 0x43, 0xE8, 0x98, 0x92, 0x43, 0xE8,
+	0x98, 0xAD, 0x43, 0xE8, 0x98, 0xBF, 0x43, 0xE8,
+	0x99, 0x8D, 0x43, 0xE8, 0x99, 0x90, 0x43, 0xE8,
+	0x99, 0x9C, 0x43, 0xE8, 0x99, 0xA7, 0x43, 0xE8,
+	0x99, 0xA9, 0x43, 0xE8, 0x99, 0xAB, 0x43, 0xE8,
+	0x9A, 0x88, 0x43, 0xE8, 0x9A, 0xA9, 0x43, 0xE8,
+	0x9B, 0xA2, 0x43, 0xE8, 0x9C, 0x8E, 0x43, 0xE8,
+	// Bytes 13c0 - 13ff
+	0x9C, 0xA8, 0x43, 0xE8, 0x9D, 0xAB, 0x43, 0xE8,
+	0x9D, 0xB9, 0x43, 0xE8, 0x9E, 0x86, 0x43, 0xE8,
+	0x9E, 0xBA, 0x43, 0xE8, 0x9F, 0xA1, 0x43, 0xE8,
+	0xA0, 0x81, 0x43, 0xE8, 0xA0, 0x9F, 0x43, 0xE8,
+	0xA1, 0x80, 0x43, 0xE8, 0xA1, 0x8C, 0x43, 0xE8,
+	0xA1, 0xA0, 0x43, 0xE8, 0xA1, 0xA3, 0x43, 0xE8,
+	0xA3, 0x82, 0x43, 0xE8, 0xA3, 0x8F, 0x43, 0xE8,
+	0xA3, 0x97, 0x43, 0xE8, 0xA3, 0x9E, 0x43, 0xE8,
+	// Bytes 1400 - 143f
+	0xA3, 0xA1, 0x43, 0xE8, 0xA3, 0xB8, 0x43, 0xE8,
+	0xA3, 0xBA, 0x43, 0xE8, 0xA4, 0x90, 0x43, 0xE8,
+	0xA5, 0x81, 0x43, 0xE8, 0xA5, 0xA4, 0x43, 0xE8,
+	0xA5, 0xBE, 0x43, 0xE8, 0xA6, 0x86, 0x43, 0xE8,
+	0xA6, 0x8B, 0x43, 0xE8, 0xA6, 0x96, 0x43, 0xE8,
+	0xA7, 0x92, 0x43, 0xE8, 0xA7, 0xA3, 0x43, 0xE8,
+	0xA8, 0x80, 0x43, 0xE8, 0xAA, 0xA0, 0x43, 0xE8,
+	0xAA, 0xAA, 0x43, 0xE8, 0xAA, 0xBF, 0x43, 0xE8,
+	// Bytes 1440 - 147f
+	0xAB, 0x8B, 0x43, 0xE8, 0xAB, 0x92, 0x43, 0xE8,
+	0xAB, 0x96, 0x43, 0xE8, 0xAB, 0xAD, 0x43, 0xE8,
+	0xAB, 0xB8, 0x43, 0xE8, 0xAB, 0xBE, 0x43, 0xE8,
+	0xAC, 0x81, 0x43, 0xE8, 0xAC, 0xB9, 0x43, 0xE8,
+	0xAD, 0x98, 0x43, 0xE8, 0xAE, 0x80, 0x43, 0xE8,
+	0xAE, 0x8A, 0x43, 0xE8, 0xB0, 0xB7, 0x43, 0xE8,
+	0xB1, 0x86, 0x43, 0xE8, 0xB1, 0x88, 0x43, 0xE8,
+	0xB1, 0x95, 0x43, 0xE8, 0xB1, 0xB8, 0x43, 0xE8,
+	// Bytes 1480 - 14bf
+	0xB2, 0x9D, 0x43, 0xE8, 0xB2, 0xA1, 0x43, 0xE8,
+	0xB2, 0xA9, 0x43, 0xE8, 0xB2, 0xAB, 0x43, 0xE8,
+	0xB3, 0x81, 0x43, 0xE8, 0xB3, 0x82, 0x43, 0xE8,
+	0xB3, 0x87, 0x43, 0xE8, 0xB3, 0x88, 0x43, 0xE8,
+	0xB3, 0x93, 0x43, 0xE8, 0xB4, 0x88, 0x43, 0xE8,
+	0xB4, 0x9B, 0x43, 0xE8, 0xB5, 0xA4, 0x43, 0xE8,
+	0xB5, 0xB0, 0x43, 0xE8, 0xB5, 0xB7, 0x43, 0xE8,
+	0xB6, 0xB3, 0x43, 0xE8, 0xB6, 0xBC, 0x43, 0xE8,
+	// Bytes 14c0 - 14ff
+	0xB7, 0x8B, 0x43, 0xE8, 0xB7, 0xAF, 0x43, 0xE8,
+	0xB7, 0xB0, 0x43, 0xE8, 0xBA, 0xAB, 0x43, 0xE8,
+	0xBB, 0x8A, 0x43, 0xE8, 0xBB, 0x94, 0x43, 0xE8,
+	0xBC, 0xA6, 0x43, 0xE8, 0xBC, 0xAA, 0x43, 0xE8,
+	0xBC, 0xB8, 0x43, 0xE8, 0xBC, 0xBB, 0x43, 0xE8,
+	0xBD, 0xA2, 0x43, 0xE8, 0xBE, 0x9B, 0x43, 0xE8,
+	0xBE, 0x9E, 0x43, 0xE8, 0xBE, 0xB0, 0x43, 0xE8,
+	0xBE, 0xB5, 0x43, 0xE8, 0xBE, 0xB6, 0x43, 0xE9,
+	// Bytes 1500 - 153f
+	0x80, 0xA3, 0x43, 0xE9, 0x80, 0xB8, 0x43, 0xE9,
+	0x81, 0x8A, 0x43, 0xE9, 0x81, 0xA9, 0x43, 0xE9,
+	0x81, 0xB2, 0x43, 0xE9, 0x81, 0xBC, 0x43, 0xE9,
+	0x82, 0x8F, 0x43, 0xE9, 0x82, 0x91, 0x43, 0xE9,
+	0x82, 0x94, 0x43, 0xE9, 0x83, 0x8E, 0x43, 0xE9,
+	0x83, 0x9E, 0x43, 0xE9, 0x83, 0xB1, 0x43, 0xE9,
+	0x83, 0xBD, 0x43, 0xE9, 0x84, 0x91, 0x43, 0xE9,
+	0x84, 0x9B, 0x43, 0xE9, 0x85, 0x89, 0x43, 0xE9,
+	// Bytes 1540 - 157f
+	0x85, 0x8D, 0x43, 0xE9, 0x85, 0xAA, 0x43, 0xE9,
+	0x86, 0x99, 0x43, 0xE9, 0x86, 0xB4, 0x43, 0xE9,
+	0x87, 0x86, 0x43, 0xE9, 0x87, 0x8C, 0x43, 0xE9,
+	0x87, 0x8F, 0x43, 0xE9, 0x87, 0x91, 0x43, 0xE9,
+	0x88, 0xB4, 0x43, 0xE9, 0x88, 0xB8, 0x43, 0xE9,
+	0x89, 0xB6, 0x43, 0xE9, 0x89, 0xBC, 0x43, 0xE9,
+	0x8B, 0x97, 0x43, 0xE9, 0x8B, 0x98, 0x43, 0xE9,
+	0x8C, 0x84, 0x43, 0xE9, 0x8D, 0x8A, 0x43, 0xE9,
+	// Bytes 1580 - 15bf
+	0x8F, 0xB9, 0x43, 0xE9, 0x90, 0x95, 0x43, 0xE9,
+	0x95, 0xB7, 0x43, 0xE9, 0x96, 0x80, 0x43, 0xE9,
+	0x96, 0x8B, 0x43, 0xE9, 0x96, 0xAD, 0x43, 0xE9,
+	0x96, 0xB7, 0x43, 0xE9, 0x98, 0x9C, 0x43, 0xE9,
+	0x98, 0xAE, 0x43, 0xE9, 0x99, 0x8B, 0x43, 0xE9,
+	0x99, 0x8D, 0x43, 0xE9, 0x99, 0xB5, 0x43, 0xE9,
+	0x99, 0xB8, 0x43, 0xE9, 0x99, 0xBC, 0x43, 0xE9,
+	0x9A, 0x86, 0x43, 0xE9, 0x9A, 0xA3, 0x43, 0xE9,
+	// Bytes 15c0 - 15ff
+	0x9A, 0xB6, 0x43, 0xE9, 0x9A, 0xB7, 0x43, 0xE9,
+	0x9A, 0xB8, 0x43, 0xE9, 0x9A, 0xB9, 0x43, 0xE9,
+	0x9B, 0x83, 0x43, 0xE9, 0x9B, 0xA2, 0x43, 0xE9,
+	0x9B, 0xA3, 0x43, 0xE9, 0x9B, 0xA8, 0x43, 0xE9,
+	0x9B, 0xB6, 0x43, 0xE9, 0x9B, 0xB7, 0x43, 0xE9,
+	0x9C, 0xA3, 0x43, 0xE9, 0x9C, 0xB2, 0x43, 0xE9,
+	0x9D, 0x88, 0x43, 0xE9, 0x9D, 0x91, 0x43, 0xE9,
+	0x9D, 0x96, 0x43, 0xE9, 0x9D, 0x9E, 0x43, 0xE9,
+	// Bytes 1600 - 163f
+	0x9D, 0xA2, 0x43, 0xE9, 0x9D, 0xA9, 0x43, 0xE9,
+	0x9F, 0x8B, 0x43, 0xE9, 0x9F, 0x9B, 0x43, 0xE9,
+	0x9F, 0xA0, 0x43, 0xE9, 0x9F, 0xAD, 0x43, 0xE9,
+	0x9F, 0xB3, 0x43, 0xE9, 0x9F, 0xBF, 0x43, 0xE9,
+	0xA0, 0x81, 0x43, 0xE9, 0xA0, 0x85, 0x43, 0xE9,
+	0xA0, 0x8B, 0x43, 0xE9, 0xA0, 0x98, 0x43, 0xE9,
+	0xA0, 0xA9, 0x43, 0xE9, 0xA0, 0xBB, 0x43, 0xE9,
+	0xA1, 0x9E, 0x43, 0xE9, 0xA2, 0xA8, 0x43, 0xE9,
+	// Bytes 1640 - 167f
+	0xA3, 0x9B, 0x43, 0xE9, 0xA3, 0x9F, 0x43, 0xE9,
+	0xA3, 0xA2, 0x43, 0xE9, 0xA3, 0xAF, 0x43, 0xE9,
+	0xA3, 0xBC, 0x43, 0xE9, 0xA4, 0xA8, 0x43, 0xE9,
+	0xA4, 0xA9, 0x43, 0xE9, 0xA6, 0x96, 0x43, 0xE9,
+	0xA6, 0x99, 0x43, 0xE9, 0xA6, 0xA7, 0x43, 0xE9,
+	0xA6, 0xAC, 0x43, 0xE9, 0xA7, 0x82, 0x43, 0xE9,
+	0xA7, 0xB1, 0x43, 0xE9, 0xA7, 0xBE, 0x43, 0xE9,
+	0xA9, 0xAA, 0x43, 0xE9, 0xAA, 0xA8, 0x43, 0xE9,
+	// Bytes 1680 - 16bf
+	0xAB, 0x98, 0x43, 0xE9, 0xAB, 0x9F, 0x43, 0xE9,
+	0xAC, 0x92, 0x43, 0xE9, 0xAC, 0xA5, 0x43, 0xE9,
+	0xAC, 0xAF, 0x43, 0xE9, 0xAC, 0xB2, 0x43, 0xE9,
+	0xAC, 0xBC, 0x43, 0xE9, 0xAD, 0x9A, 0x43, 0xE9,
+	0xAD, 0xAF, 0x43, 0xE9, 0xB1, 0x80, 0x43, 0xE9,
+	0xB1, 0x97, 0x43, 0xE9, 0xB3, 0xA5, 0x43, 0xE9,
+	0xB3, 0xBD, 0x43, 0xE9, 0xB5, 0xA7, 0x43, 0xE9,
+	0xB6, 0xB4, 0x43, 0xE9, 0xB7, 0xBA, 0x43, 0xE9,
+	// Bytes 16c0 - 16ff
+	0xB8, 0x9E, 0x43, 0xE9, 0xB9, 0xB5, 0x43, 0xE9,
+	0xB9, 0xBF, 0x43, 0xE9, 0xBA, 0x97, 0x43, 0xE9,
+	0xBA, 0x9F, 0x43, 0xE9, 0xBA, 0xA5, 0x43, 0xE9,
+	0xBA, 0xBB, 0x43, 0xE9, 0xBB, 0x83, 0x43, 0xE9,
+	0xBB, 0x8D, 0x43, 0xE9, 0xBB, 0x8E, 0x43, 0xE9,
+	0xBB, 0x91, 0x43, 0xE9, 0xBB, 0xB9, 0x43, 0xE9,
+	0xBB, 0xBD, 0x43, 0xE9, 0xBB, 0xBE, 0x43, 0xE9,
+	0xBC, 0x85, 0x43, 0xE9, 0xBC, 0x8E, 0x43, 0xE9,
+	// Bytes 1700 - 173f
+	0xBC, 0x8F, 0x43, 0xE9, 0xBC, 0x93, 0x43, 0xE9,
+	0xBC, 0x96, 0x43, 0xE9, 0xBC, 0xA0, 0x43, 0xE9,
+	0xBC, 0xBB, 0x43, 0xE9, 0xBD, 0x83, 0x43, 0xE9,
+	0xBD, 0x8A, 0x43, 0xE9, 0xBD, 0x92, 0x43, 0xE9,
+	0xBE, 0x8D, 0x43, 0xE9, 0xBE, 0x8E, 0x43, 0xE9,
+	0xBE, 0x9C, 0x43, 0xE9, 0xBE, 0x9F, 0x43, 0xE9,
+	0xBE, 0xA0, 0x43, 0xEA, 0x99, 0x91, 0x43, 0xEA,
+	0x9A, 0x89, 0x43, 0xEA, 0x9C, 0xA7, 0x43, 0xEA,
+	// Bytes 1740 - 177f
+	0x9D, 0xAF, 0x43, 0xEA, 0x9E, 0x8E, 0x43, 0xEA,
+	0xAC, 0xB7, 0x43, 0xEA, 0xAD, 0x92, 0x43, 0xEA,
+	0xAD, 0xA6, 0x43, 0xEA, 0xAD, 0xA7, 0x44, 0xF0,
+	0x9D, 0xBC, 0x84, 0x44, 0xF0, 0x9D, 0xBC, 0x85,
+	0x44, 0xF0, 0x9D, 0xBC, 0x86, 0x44, 0xF0, 0x9D,
+	0xBC, 0x88, 0x44, 0xF0, 0x9D, 0xBC, 0x8A, 0x44,
+	0xF0, 0x9D, 0xBC, 0x9E, 0x44, 0xF0, 0xA0, 0x84,
+	0xA2, 0x44, 0xF0, 0xA0, 0x94, 0x9C, 0x44, 0xF0,
+	// Bytes 1780 - 17bf
+	0xA0, 0x94, 0xA5, 0x44, 0xF0, 0xA0, 0x95, 0x8B,
+	0x44, 0xF0, 0xA0, 0x98, 0xBA, 0x44, 0xF0, 0xA0,
+	0xA0, 0x84, 0x44, 0xF0, 0xA0, 0xA3, 0x9E, 0x44,
+	0xF0, 0xA0, 0xA8, 0xAC, 0x44, 0xF0, 0xA0, 0xAD,
+	0xA3, 0x44, 0xF0, 0xA1, 0x93, 0xA4, 0x44, 0xF0,
+	0xA1, 0x9A, 0xA8, 0x44, 0xF0, 0xA1, 0x9B, 0xAA,
+	0x44, 0xF0, 0xA1, 0xA7, 0x88, 0x44, 0xF0, 0xA1,
+	0xAC, 0x98, 0x44, 0xF0, 0xA1, 0xB4, 0x8B, 0x44,
+	// Bytes 17c0 - 17ff
+	0xF0, 0xA1, 0xB7, 0xA4, 0x44, 0xF0, 0xA1, 0xB7,
+	0xA6, 0x44, 0xF0, 0xA2, 0x86, 0x83, 0x44, 0xF0,
+	0xA2, 0x86, 0x9F, 0x44, 0xF0, 0xA2, 0x8C, 0xB1,
+	0x44, 0xF0, 0xA2, 0x9B, 0x94, 0x44, 0xF0, 0xA2,
+	0xA1, 0x84, 0x44, 0xF0, 0xA2, 0xA1, 0x8A, 0x44,
+	0xF0, 0xA2, 0xAC, 0x8C, 0x44, 0xF0, 0xA2, 0xAF,
+	0xB1, 0x44, 0xF0, 0xA3, 0x80, 0x8A, 0x44, 0xF0,
+	0xA3, 0x8A, 0xB8, 0x44, 0xF0, 0xA3, 0x8D, 0x9F,
+	// Bytes 1800 - 183f
+	0x44, 0xF0, 0xA3, 0x8E, 0x93, 0x44, 0xF0, 0xA3,
+	0x8E, 0x9C, 0x44, 0xF0, 0xA3, 0x8F, 0x83, 0x44,
+	0xF0, 0xA3, 0x8F, 0x95, 0x44, 0xF0, 0xA3, 0x91,
+	0xAD, 0x44, 0xF0, 0xA3, 0x9A, 0xA3, 0x44, 0xF0,
+	0xA3, 0xA2, 0xA7, 0x44, 0xF0, 0xA3, 0xAA, 0x8D,
+	0x44, 0xF0, 0xA3, 0xAB, 0xBA, 0x44, 0xF0, 0xA3,
+	0xB2, 0xBC, 0x44, 0xF0, 0xA3, 0xB4, 0x9E, 0x44,
+	0xF0, 0xA3, 0xBB, 0x91, 0x44, 0xF0, 0xA3, 0xBD,
+	// Bytes 1840 - 187f
+	0x9E, 0x44, 0xF0, 0xA3, 0xBE, 0x8E, 0x44, 0xF0,
+	0xA4, 0x89, 0xA3, 0x44, 0xF0, 0xA4, 0x8B, 0xAE,
+	0x44, 0xF0, 0xA4, 0x8E, 0xAB, 0x44, 0xF0, 0xA4,
+	0x98, 0x88, 0x44, 0xF0, 0xA4, 0x9C, 0xB5, 0x44,
+	0xF0, 0xA4, 0xA0, 0x94, 0x44, 0xF0, 0xA4, 0xB0,
+	0xB6, 0x44, 0xF0, 0xA4, 0xB2, 0x92, 0x44, 0xF0,
+	0xA4, 0xBE, 0xA1, 0x44, 0xF0, 0xA4, 0xBE, 0xB8,
+	0x44, 0xF0, 0xA5, 0x81, 0x84, 0x44, 0xF0, 0xA5,
+	// Bytes 1880 - 18bf
+	0x83, 0xB2, 0x44, 0xF0, 0xA5, 0x83, 0xB3, 0x44,
+	0xF0, 0xA5, 0x84, 0x99, 0x44, 0xF0, 0xA5, 0x84,
+	0xB3, 0x44, 0xF0, 0xA5, 0x89, 0x89, 0x44, 0xF0,
+	0xA5, 0x90, 0x9D, 0x44, 0xF0, 0xA5, 0x98, 0xA6,
+	0x44, 0xF0, 0xA5, 0x9A, 0x9A, 0x44, 0xF0, 0xA5,
+	0x9B, 0x85, 0x44, 0xF0, 0xA5, 0xA5, 0xBC, 0x44,
+	0xF0, 0xA5, 0xAA, 0xA7, 0x44, 0xF0, 0xA5, 0xAE,
+	0xAB, 0x44, 0xF0, 0xA5, 0xB2, 0x80, 0x44, 0xF0,
+	// Bytes 18c0 - 18ff
+	0xA5, 0xB3, 0x90, 0x44, 0xF0, 0xA5, 0xBE, 0x86,
+	0x44, 0xF0, 0xA6, 0x87, 0x9A, 0x44, 0xF0, 0xA6,
+	0x88, 0xA8, 0x44, 0xF0, 0xA6, 0x89, 0x87, 0x44,
+	0xF0, 0xA6, 0x8B, 0x99, 0x44, 0xF0, 0xA6, 0x8C,
+	0xBE, 0x44, 0xF0, 0xA6, 0x93, 0x9A, 0x44, 0xF0,
+	0xA6, 0x94, 0xA3, 0x44, 0xF0, 0xA6, 0x96, 0xA8,
+	0x44, 0xF0, 0xA6, 0x9E, 0xA7, 0x44, 0xF0, 0xA6,
+	0x9E, 0xB5, 0x44, 0xF0, 0xA6, 0xAC, 0xBC, 0x44,
+	// Bytes 1900 - 193f
+	0xF0, 0xA6, 0xB0, 0xB6, 0x44, 0xF0, 0xA6, 0xB3,
+	0x95, 0x44, 0xF0, 0xA6, 0xB5, 0xAB, 0x44, 0xF0,
+	0xA6, 0xBC, 0xAC, 0x44, 0xF0, 0xA6, 0xBE, 0xB1,
+	0x44, 0xF0, 0xA7, 0x83, 0x92, 0x44, 0xF0, 0xA7,
+	0x8F, 0x8A, 0x44, 0xF0, 0xA7, 0x99, 0xA7, 0x44,
+	0xF0, 0xA7, 0xA2, 0xAE, 0x44, 0xF0, 0xA7, 0xA5,
+	0xA6, 0x44, 0xF0, 0xA7, 0xB2, 0xA8, 0x44, 0xF0,
+	0xA7, 0xBB, 0x93, 0x44, 0xF0, 0xA7, 0xBC, 0xAF,
+	// Bytes 1940 - 197f
+	0x44, 0xF0, 0xA8, 0x97, 0x92, 0x44, 0xF0, 0xA8,
+	0x97, 0xAD, 0x44, 0xF0, 0xA8, 0x9C, 0xAE, 0x44,
+	0xF0, 0xA8, 0xAF, 0xBA, 0x44, 0xF0, 0xA8, 0xB5,
+	0xB7, 0x44, 0xF0, 0xA9, 0x85, 0x85, 0x44, 0xF0,
+	0xA9, 0x87, 0x9F, 0x44, 0xF0, 0xA9, 0x88, 0x9A,
+	0x44, 0xF0, 0xA9, 0x90, 0x8A, 0x44, 0xF0, 0xA9,
+	0x92, 0x96, 0x44, 0xF0, 0xA9, 0x96, 0xB6, 0x44,
+	0xF0, 0xA9, 0xAC, 0xB0, 0x44, 0xF0, 0xAA, 0x83,
+	// Bytes 1980 - 19bf
+	0x8E, 0x44, 0xF0, 0xAA, 0x84, 0x85, 0x44, 0xF0,
+	0xAA, 0x88, 0x8E, 0x44, 0xF0, 0xAA, 0x8A, 0x91,
+	0x44, 0xF0, 0xAA, 0x8E, 0x92, 0x44, 0xF0, 0xAA,
+	0x98, 0x80, 0x42, 0x21, 0x21, 0x42, 0x21, 0x3F,
+	0x42, 0x2E, 0x2E, 0x42, 0x30, 0x2C, 0x42, 0x30,
+	0x2E, 0x42, 0x31, 0x2C, 0x42, 0x31, 0x2E, 0x42,
+	0x31, 0x30, 0x42, 0x31, 0x31, 0x42, 0x31, 0x32,
+	0x42, 0x31, 0x33, 0x42, 0x31, 0x34, 0x42, 0x31,
+	// Bytes 19c0 - 19ff
+	0x35, 0x42, 0x31, 0x36, 0x42, 0x31, 0x37, 0x42,
+	0x31, 0x38, 0x42, 0x31, 0x39, 0x42, 0x32, 0x2C,
+	0x42, 0x32, 0x2E, 0x42, 0x32, 0x30, 0x42, 0x32,
+	0x31, 0x42, 0x32, 0x32, 0x42, 0x32, 0x33, 0x42,
+	0x32, 0x34, 0x42, 0x32, 0x35, 0x42, 0x32, 0x36,
+	0x42, 0x32, 0x37, 0x42, 0x32, 0x38, 0x42, 0x32,
+	0x39, 0x42, 0x33, 0x2C, 0x42, 0x33, 0x2E, 0x42,
+	0x33, 0x30, 0x42, 0x33, 0x31, 0x42, 0x33, 0x32,
+	// Bytes 1a00 - 1a3f
+	0x42, 0x33, 0x33, 0x42, 0x33, 0x34, 0x42, 0x33,
+	0x35, 0x42, 0x33, 0x36, 0x42, 0x33, 0x37, 0x42,
+	0x33, 0x38, 0x42, 0x33, 0x39, 0x42, 0x34, 0x2C,
+	0x42, 0x34, 0x2E, 0x42, 0x34, 0x30, 0x42, 0x34,
+	0x31, 0x42, 0x34, 0x32, 0x42, 0x34, 0x33, 0x42,
+	0x34, 0x34, 0x42, 0x34, 0x35, 0x42, 0x34, 0x36,
+	0x42, 0x34, 0x37, 0x42, 0x34, 0x38, 0x42, 0x34,
+	0x39, 0x42, 0x35, 0x2C, 0x42, 0x35, 0x2E, 0x42,
+	// Bytes 1a40 - 1a7f
+	0x35, 0x30, 0x42, 0x36, 0x2C, 0x42, 0x36, 0x2E,
+	0x42, 0x37, 0x2C, 0x42, 0x37, 0x2E, 0x42, 0x38,
+	0x2C, 0x42, 0x38, 0x2E, 0x42, 0x39, 0x2C, 0x42,
+	0x39, 0x2E, 0x42, 0x3D, 0x3D, 0x42, 0x3F, 0x21,
+	0x42, 0x3F, 0x3F, 0x42, 0x41, 0x55, 0x42, 0x42,
+	0x71, 0x42, 0x43, 0x44, 0x42, 0x44, 0x4A, 0x42,
+	0x44, 0x5A, 0x42, 0x44, 0x7A, 0x42, 0x47, 0x42,
+	0x42, 0x47, 0x79, 0x42, 0x48, 0x50, 0x42, 0x48,
+	// Bytes 1a80 - 1abf
+	0x56, 0x42, 0x48, 0x67, 0x42, 0x48, 0x7A, 0x42,
+	0x49, 0x49, 0x42, 0x49, 0x4A, 0x42, 0x49, 0x55,
+	0x42, 0x49, 0x56, 0x42, 0x49, 0x58, 0x42, 0x4B,
+	0x42, 0x42, 0x4B, 0x4B, 0x42, 0x4B, 0x4D, 0x42,
+	0x4C, 0x4A, 0x42, 0x4C, 0x6A, 0x42, 0x4D, 0x42,
+	0x42, 0x4D, 0x43, 0x42, 0x4D, 0x44, 0x42, 0x4D,
+	0x52, 0x42, 0x4D, 0x56, 0x42, 0x4D, 0x57, 0x42,
+	0x4E, 0x4A, 0x42, 0x4E, 0x6A, 0x42, 0x4E, 0x6F,
+	// Bytes 1ac0 - 1aff
+	0x42, 0x50, 0x48, 0x42, 0x50, 0x52, 0x42, 0x50,
+	0x61, 0x42, 0x52, 0x73, 0x42, 0x53, 0x44, 0x42,
+	0x53, 0x4D, 0x42, 0x53, 0x53, 0x42, 0x53, 0x76,
+	0x42, 0x54, 0x4D, 0x42, 0x56, 0x49, 0x42, 0x57,
+	0x43, 0x42, 0x57, 0x5A, 0x42, 0x57, 0x62, 0x42,
+	0x58, 0x49, 0x42, 0x63, 0x63, 0x42, 0x63, 0x64,
+	0x42, 0x63, 0x6D, 0x42, 0x64, 0x42, 0x42, 0x64,
+	0x61, 0x42, 0x64, 0x6C, 0x42, 0x64, 0x6D, 0x42,
+	// Bytes 1b00 - 1b3f
+	0x64, 0x7A, 0x42, 0x65, 0x56, 0x42, 0x66, 0x66,
+	0x42, 0x66, 0x69, 0x42, 0x66, 0x6C, 0x42, 0x66,
+	0x6D, 0x42, 0x68, 0x61, 0x42, 0x69, 0x69, 0x42,
+	0x69, 0x6A, 0x42, 0x69, 0x6E, 0x42, 0x69, 0x76,
+	0x42, 0x69, 0x78, 0x42, 0x6B, 0x41, 0x42, 0x6B,
+	0x56, 0x42, 0x6B, 0x57, 0x42, 0x6B, 0x67, 0x42,
+	0x6B, 0x6C, 0x42, 0x6B, 0x6D, 0x42, 0x6B, 0x74,
+	0x42, 0x6C, 0x6A, 0x42, 0x6C, 0x6D, 0x42, 0x6C,
+	// Bytes 1b40 - 1b7f
+	0x6E, 0x42, 0x6C, 0x78, 0x42, 0x6D, 0x32, 0x42,
+	0x6D, 0x33, 0x42, 0x6D, 0x41, 0x42, 0x6D, 0x56,
+	0x42, 0x6D, 0x57, 0x42, 0x6D, 0x62, 0x42, 0x6D,
+	0x67, 0x42, 0x6D, 0x6C, 0x42, 0x6D, 0x6D, 0x42,
+	0x6D, 0x73, 0x42, 0x6E, 0x41, 0x42, 0x6E, 0x46,
+	0x42, 0x6E, 0x56, 0x42, 0x6E, 0x57, 0x42, 0x6E,
+	0x6A, 0x42, 0x6E, 0x6D, 0x42, 0x6E, 0x73, 0x42,
+	0x6F, 0x56, 0x42, 0x70, 0x41, 0x42, 0x70, 0x46,
+	// Bytes 1b80 - 1bbf
+	0x42, 0x70, 0x56, 0x42, 0x70, 0x57, 0x42, 0x70,
+	0x63, 0x42, 0x70, 0x73, 0x42, 0x73, 0x72, 0x42,
+	0x73, 0x74, 0x42, 0x76, 0x69, 0x42, 0x78, 0x69,
+	0x43, 0x28, 0x31, 0x29, 0x43, 0x28, 0x32, 0x29,
+	0x43, 0x28, 0x33, 0x29, 0x43, 0x28, 0x34, 0x29,
+	0x43, 0x28, 0x35, 0x29, 0x43, 0x28, 0x36, 0x29,
+	0x43, 0x28, 0x37, 0x29, 0x43, 0x28, 0x38, 0x29,
+	0x43, 0x28, 0x39, 0x29, 0x43, 0x28, 0x41, 0x29,
+	// Bytes 1bc0 - 1bff
+	0x43, 0x28, 0x42, 0x29, 0x43, 0x28, 0x43, 0x29,
+	0x43, 0x28, 0x44, 0x29, 0x43, 0x28, 0x45, 0x29,
+	0x43, 0x28, 0x46, 0x29, 0x43, 0x28, 0x47, 0x29,
+	0x43, 0x28, 0x48, 0x29, 0x43, 0x28, 0x49, 0x29,
+	0x43, 0x28, 0x4A, 0x29, 0x43, 0x28, 0x4B, 0x29,
+	0x43, 0x28, 0x4C, 0x29, 0x43, 0x28, 0x4D, 0x29,
+	0x43, 0x28, 0x4E, 0x29, 0x43, 0x28, 0x4F, 0x29,
+	0x43, 0x28, 0x50, 0x29, 0x43, 0x28, 0x51, 0x29,
+	// Bytes 1c00 - 1c3f
+	0x43, 0x28, 0x52, 0x29, 0x43, 0x28, 0x53, 0x29,
+	0x43, 0x28, 0x54, 0x29, 0x43, 0x28, 0x55, 0x29,
+	0x43, 0x28, 0x56, 0x29, 0x43, 0x28, 0x57, 0x29,
+	0x43, 0x28, 0x58, 0x29, 0x43, 0x28, 0x59, 0x29,
+	0x43, 0x28, 0x5A, 0x29, 0x43, 0x28, 0x61, 0x29,
+	0x43, 0x28, 0x62, 0x29, 0x43, 0x28, 0x63, 0x29,
+	0x43, 0x28, 0x64, 0x29, 0x43, 0x28, 0x65, 0x29,
+	0x43, 0x28, 0x66, 0x29, 0x43, 0x28, 0x67, 0x29,
+	// Bytes 1c40 - 1c7f
+	0x43, 0x28, 0x68, 0x29, 0x43, 0x28, 0x69, 0x29,
+	0x43, 0x28, 0x6A, 0x29, 0x43, 0x28, 0x6B, 0x29,
+	0x43, 0x28, 0x6C, 0x29, 0x43, 0x28, 0x6D, 0x29,
+	0x43, 0x28, 0x6E, 0x29, 0x43, 0x28, 0x6F, 0x29,
+	0x43, 0x28, 0x70, 0x29, 0x43, 0x28, 0x71, 0x29,
+	0x43, 0x28, 0x72, 0x29, 0x43, 0x28, 0x73, 0x29,
+	0x43, 0x28, 0x74, 0x29, 0x43, 0x28, 0x75, 0x29,
+	0x43, 0x28, 0x76, 0x29, 0x43, 0x28, 0x77, 0x29,
+	// Bytes 1c80 - 1cbf
+	0x43, 0x28, 0x78, 0x29, 0x43, 0x28, 0x79, 0x29,
+	0x43, 0x28, 0x7A, 0x29, 0x43, 0x2E, 0x2E, 0x2E,
+	0x43, 0x31, 0x30, 0x2E, 0x43, 0x31, 0x31, 0x2E,
+	0x43, 0x31, 0x32, 0x2E, 0x43, 0x31, 0x33, 0x2E,
+	0x43, 0x31, 0x34, 0x2E, 0x43, 0x31, 0x35, 0x2E,
+	0x43, 0x31, 0x36, 0x2E, 0x43, 0x31, 0x37, 0x2E,
+	0x43, 0x31, 0x38, 0x2E, 0x43, 0x31, 0x39, 0x2E,
+	0x43, 0x32, 0x30, 0x2E, 0x43, 0x3A, 0x3A, 0x3D,
+	// Bytes 1cc0 - 1cff
+	0x43, 0x3D, 0x3D, 0x3D, 0x43, 0x43, 0x6F, 0x2E,
+	0x43, 0x46, 0x41, 0x58, 0x43, 0x47, 0x48, 0x7A,
+	0x43, 0x47, 0x50, 0x61, 0x43, 0x49, 0x49, 0x49,
+	0x43, 0x4C, 0x54, 0x44, 0x43, 0x4C, 0xC2, 0xB7,
+	0x43, 0x4D, 0x48, 0x7A, 0x43, 0x4D, 0x50, 0x61,
+	0x43, 0x4D, 0xCE, 0xA9, 0x43, 0x50, 0x50, 0x4D,
+	0x43, 0x50, 0x50, 0x56, 0x43, 0x50, 0x54, 0x45,
+	0x43, 0x54, 0x45, 0x4C, 0x43, 0x54, 0x48, 0x7A,
+	// Bytes 1d00 - 1d3f
+	0x43, 0x56, 0x49, 0x49, 0x43, 0x58, 0x49, 0x49,
+	0x43, 0x61, 0x2F, 0x63, 0x43, 0x61, 0x2F, 0x73,
+	0x43, 0x61, 0xCA, 0xBE, 0x43, 0x62, 0x61, 0x72,
+	0x43, 0x63, 0x2F, 0x6F, 0x43, 0x63, 0x2F, 0x75,
+	0x43, 0x63, 0x61, 0x6C, 0x43, 0x63, 0x6D, 0x32,
+	0x43, 0x63, 0x6D, 0x33, 0x43, 0x64, 0x6D, 0x32,
+	0x43, 0x64, 0x6D, 0x33, 0x43, 0x65, 0x72, 0x67,
+	0x43, 0x66, 0x66, 0x69, 0x43, 0x66, 0x66, 0x6C,
+	// Bytes 1d40 - 1d7f
+	0x43, 0x67, 0x61, 0x6C, 0x43, 0x68, 0x50, 0x61,
+	0x43, 0x69, 0x69, 0x69, 0x43, 0x6B, 0x48, 0x7A,
+	0x43, 0x6B, 0x50, 0x61, 0x43, 0x6B, 0x6D, 0x32,
+	0x43, 0x6B, 0x6D, 0x33, 0x43, 0x6B, 0xCE, 0xA9,
+	0x43, 0x6C, 0x6F, 0x67, 0x43, 0x6C, 0xC2, 0xB7,
+	0x43, 0x6D, 0x69, 0x6C, 0x43, 0x6D, 0x6D, 0x32,
+	0x43, 0x6D, 0x6D, 0x33, 0x43, 0x6D, 0x6F, 0x6C,
+	0x43, 0x72, 0x61, 0x64, 0x43, 0x76, 0x69, 0x69,
+	// Bytes 1d80 - 1dbf
+	0x43, 0x78, 0x69, 0x69, 0x43, 0xC2, 0xB0, 0x43,
+	0x43, 0xC2, 0xB0, 0x46, 0x43, 0xCA, 0xBC, 0x6E,
+	0x43, 0xCE, 0xBC, 0x41, 0x43, 0xCE, 0xBC, 0x46,
+	0x43, 0xCE, 0xBC, 0x56, 0x43, 0xCE, 0xBC, 0x57,
+	0x43, 0xCE, 0xBC, 0x67, 0x43, 0xCE, 0xBC, 0x6C,
+	0x43, 0xCE, 0xBC, 0x6D, 0x43, 0xCE, 0xBC, 0x73,
+	0x44, 0x28, 0x31, 0x30, 0x29, 0x44, 0x28, 0x31,
+	0x31, 0x29, 0x44, 0x28, 0x31, 0x32, 0x29, 0x44,
+	// Bytes 1dc0 - 1dff
+	0x28, 0x31, 0x33, 0x29, 0x44, 0x28, 0x31, 0x34,
+	0x29, 0x44, 0x28, 0x31, 0x35, 0x29, 0x44, 0x28,
+	0x31, 0x36, 0x29, 0x44, 0x28, 0x31, 0x37, 0x29,
+	0x44, 0x28, 0x31, 0x38, 0x29, 0x44, 0x28, 0x31,
+	0x39, 0x29, 0x44, 0x28, 0x32, 0x30, 0x29, 0x44,
+	0x30, 0xE7, 0x82, 0xB9, 0x44, 0x31, 0xE2, 0x81,
+	0x84, 0x44, 0x31, 0xE6, 0x97, 0xA5, 0x44, 0x31,
+	0xE6, 0x9C, 0x88, 0x44, 0x31, 0xE7, 0x82, 0xB9,
+	// Bytes 1e00 - 1e3f
+	0x44, 0x32, 0xE6, 0x97, 0xA5, 0x44, 0x32, 0xE6,
+	0x9C, 0x88, 0x44, 0x32, 0xE7, 0x82, 0xB9, 0x44,
+	0x33, 0xE6, 0x97, 0xA5, 0x44, 0x33, 0xE6, 0x9C,
+	0x88, 0x44, 0x33, 0xE7, 0x82, 0xB9, 0x44, 0x34,
+	0xE6, 0x97, 0xA5, 0x44, 0x34, 0xE6, 0x9C, 0x88,
+	0x44, 0x34, 0xE7, 0x82, 0xB9, 0x44, 0x35, 0xE6,
+	0x97, 0xA5, 0x44, 0x35, 0xE6, 0x9C, 0x88, 0x44,
+	0x35, 0xE7, 0x82, 0xB9, 0x44, 0x36, 0xE6, 0x97,
+	// Bytes 1e40 - 1e7f
+	0xA5, 0x44, 0x36, 0xE6, 0x9C, 0x88, 0x44, 0x36,
+	0xE7, 0x82, 0xB9, 0x44, 0x37, 0xE6, 0x97, 0xA5,
+	0x44, 0x37, 0xE6, 0x9C, 0x88, 0x44, 0x37, 0xE7,
+	0x82, 0xB9, 0x44, 0x38, 0xE6, 0x97, 0xA5, 0x44,
+	0x38, 0xE6, 0x9C, 0x88, 0x44, 0x38, 0xE7, 0x82,
+	0xB9, 0x44, 0x39, 0xE6, 0x97, 0xA5, 0x44, 0x39,
+	0xE6, 0x9C, 0x88, 0x44, 0x39, 0xE7, 0x82, 0xB9,
+	0x44, 0x56, 0x49, 0x49, 0x49, 0x44, 0x61, 0x2E,
+	// Bytes 1e80 - 1ebf
+	0x6D, 0x2E, 0x44, 0x6B, 0x63, 0x61, 0x6C, 0x44,
+	0x70, 0x2E, 0x6D, 0x2E, 0x44, 0x76, 0x69, 0x69,
+	0x69, 0x44, 0xD5, 0xA5, 0xD6, 0x82, 0x44, 0xD5,
+	0xB4, 0xD5, 0xA5, 0x44, 0xD5, 0xB4, 0xD5, 0xAB,
+	0x44, 0xD5, 0xB4, 0xD5, 0xAD, 0x44, 0xD5, 0xB4,
+	0xD5, 0xB6, 0x44, 0xD5, 0xBE, 0xD5, 0xB6, 0x44,
+	0xD7, 0x90, 0xD7, 0x9C, 0x44, 0xD8, 0xA7, 0xD9,
+	0xB4, 0x44, 0xD8, 0xA8, 0xD8, 0xAC, 0x44, 0xD8,
+	// Bytes 1ec0 - 1eff
+	0xA8, 0xD8, 0xAD, 0x44, 0xD8, 0xA8, 0xD8, 0xAE,
+	0x44, 0xD8, 0xA8, 0xD8, 0xB1, 0x44, 0xD8, 0xA8,
+	0xD8, 0xB2, 0x44, 0xD8, 0xA8, 0xD9, 0x85, 0x44,
+	0xD8, 0xA8, 0xD9, 0x86, 0x44, 0xD8, 0xA8, 0xD9,
+	0x87, 0x44, 0xD8, 0xA8, 0xD9, 0x89, 0x44, 0xD8,
+	0xA8, 0xD9, 0x8A, 0x44, 0xD8, 0xAA, 0xD8, 0xAC,
+	0x44, 0xD8, 0xAA, 0xD8, 0xAD, 0x44, 0xD8, 0xAA,
+	0xD8, 0xAE, 0x44, 0xD8, 0xAA, 0xD8, 0xB1, 0x44,
+	// Bytes 1f00 - 1f3f
+	0xD8, 0xAA, 0xD8, 0xB2, 0x44, 0xD8, 0xAA, 0xD9,
+	0x85, 0x44, 0xD8, 0xAA, 0xD9, 0x86, 0x44, 0xD8,
+	0xAA, 0xD9, 0x87, 0x44, 0xD8, 0xAA, 0xD9, 0x89,
+	0x44, 0xD8, 0xAA, 0xD9, 0x8A, 0x44, 0xD8, 0xAB,
+	0xD8, 0xAC, 0x44, 0xD8, 0xAB, 0xD8, 0xB1, 0x44,
+	0xD8, 0xAB, 0xD8, 0xB2, 0x44, 0xD8, 0xAB, 0xD9,
+	0x85, 0x44, 0xD8, 0xAB, 0xD9, 0x86, 0x44, 0xD8,
+	0xAB, 0xD9, 0x87, 0x44, 0xD8, 0xAB, 0xD9, 0x89,
+	// Bytes 1f40 - 1f7f
+	0x44, 0xD8, 0xAB, 0xD9, 0x8A, 0x44, 0xD8, 0xAC,
+	0xD8, 0xAD, 0x44, 0xD8, 0xAC, 0xD9, 0x85, 0x44,
+	0xD8, 0xAC, 0xD9, 0x89, 0x44, 0xD8, 0xAC, 0xD9,
+	0x8A, 0x44, 0xD8, 0xAD, 0xD8, 0xAC, 0x44, 0xD8,
+	0xAD, 0xD9, 0x85, 0x44, 0xD8, 0xAD, 0xD9, 0x89,
+	0x44, 0xD8, 0xAD, 0xD9, 0x8A, 0x44, 0xD8, 0xAE,
+	0xD8, 0xAC, 0x44, 0xD8, 0xAE, 0xD8, 0xAD, 0x44,
+	0xD8, 0xAE, 0xD9, 0x85, 0x44, 0xD8, 0xAE, 0xD9,
+	// Bytes 1f80 - 1fbf
+	0x89, 0x44, 0xD8, 0xAE, 0xD9, 0x8A, 0x44, 0xD8,
+	0xB3, 0xD8, 0xAC, 0x44, 0xD8, 0xB3, 0xD8, 0xAD,
+	0x44, 0xD8, 0xB3, 0xD8, 0xAE, 0x44, 0xD8, 0xB3,
+	0xD8, 0xB1, 0x44, 0xD8, 0xB3, 0xD9, 0x85, 0x44,
+	0xD8, 0xB3, 0xD9, 0x87, 0x44, 0xD8, 0xB3, 0xD9,
+	0x89, 0x44, 0xD8, 0xB3, 0xD9, 0x8A, 0x44, 0xD8,
+	0xB4, 0xD8, 0xAC, 0x44, 0xD8, 0xB4, 0xD8, 0xAD,
+	0x44, 0xD8, 0xB4, 0xD8, 0xAE, 0x44, 0xD8, 0xB4,
+	// Bytes 1fc0 - 1fff
+	0xD8, 0xB1, 0x44, 0xD8, 0xB4, 0xD9, 0x85, 0x44,
+	0xD8, 0xB4, 0xD9, 0x87, 0x44, 0xD8, 0xB4, 0xD9,
+	0x89, 0x44, 0xD8, 0xB4, 0xD9, 0x8A, 0x44, 0xD8,
+	0xB5, 0xD8, 0xAD, 0x44, 0xD8, 0xB5, 0xD8, 0xAE,
+	0x44, 0xD8, 0xB5, 0xD8, 0xB1, 0x44, 0xD8, 0xB5,
+	0xD9, 0x85, 0x44, 0xD8, 0xB5, 0xD9, 0x89, 0x44,
+	0xD8, 0xB5, 0xD9, 0x8A, 0x44, 0xD8, 0xB6, 0xD8,
+	0xAC, 0x44, 0xD8, 0xB6, 0xD8, 0xAD, 0x44, 0xD8,
+	// Bytes 2000 - 203f
+	0xB6, 0xD8, 0xAE, 0x44, 0xD8, 0xB6, 0xD8, 0xB1,
+	0x44, 0xD8, 0xB6, 0xD9, 0x85, 0x44, 0xD8, 0xB6,
+	0xD9, 0x89, 0x44, 0xD8, 0xB6, 0xD9, 0x8A, 0x44,
+	0xD8, 0xB7, 0xD8, 0xAD, 0x44, 0xD8, 0xB7, 0xD9,
+	0x85, 0x44, 0xD8, 0xB7, 0xD9, 0x89, 0x44, 0xD8,
+	0xB7, 0xD9, 0x8A, 0x44, 0xD8, 0xB8, 0xD9, 0x85,
+	0x44, 0xD8, 0xB9, 0xD8, 0xAC, 0x44, 0xD8, 0xB9,
+	0xD9, 0x85, 0x44, 0xD8, 0xB9, 0xD9, 0x89, 0x44,
+	// Bytes 2040 - 207f
+	0xD8, 0xB9, 0xD9, 0x8A, 0x44, 0xD8, 0xBA, 0xD8,
+	0xAC, 0x44, 0xD8, 0xBA, 0xD9, 0x85, 0x44, 0xD8,
+	0xBA, 0xD9, 0x89, 0x44, 0xD8, 0xBA, 0xD9, 0x8A,
+	0x44, 0xD9, 0x81, 0xD8, 0xAC, 0x44, 0xD9, 0x81,
+	0xD8, 0xAD, 0x44, 0xD9, 0x81, 0xD8, 0xAE, 0x44,
+	0xD9, 0x81, 0xD9, 0x85, 0x44, 0xD9, 0x81, 0xD9,
+	0x89, 0x44, 0xD9, 0x81, 0xD9, 0x8A, 0x44, 0xD9,
+	0x82, 0xD8, 0xAD, 0x44, 0xD9, 0x82, 0xD9, 0x85,
+	// Bytes 2080 - 20bf
+	0x44, 0xD9, 0x82, 0xD9, 0x89, 0x44, 0xD9, 0x82,
+	0xD9, 0x8A, 0x44, 0xD9, 0x83, 0xD8, 0xA7, 0x44,
+	0xD9, 0x83, 0xD8, 0xAC, 0x44, 0xD9, 0x83, 0xD8,
+	0xAD, 0x44, 0xD9, 0x83, 0xD8, 0xAE, 0x44, 0xD9,
+	0x83, 0xD9, 0x84, 0x44, 0xD9, 0x83, 0xD9, 0x85,
+	0x44, 0xD9, 0x83, 0xD9, 0x89, 0x44, 0xD9, 0x83,
+	0xD9, 0x8A, 0x44, 0xD9, 0x84, 0xD8, 0xA7, 0x44,
+	0xD9, 0x84, 0xD8, 0xAC, 0x44, 0xD9, 0x84, 0xD8,
+	// Bytes 20c0 - 20ff
+	0xAD, 0x44, 0xD9, 0x84, 0xD8, 0xAE, 0x44, 0xD9,
+	0x84, 0xD9, 0x85, 0x44, 0xD9, 0x84, 0xD9, 0x87,
+	0x44, 0xD9, 0x84, 0xD9, 0x89, 0x44, 0xD9, 0x84,
+	0xD9, 0x8A, 0x44, 0xD9, 0x85, 0xD8, 0xA7, 0x44,
+	0xD9, 0x85, 0xD8, 0xAC, 0x44, 0xD9, 0x85, 0xD8,
+	0xAD, 0x44, 0xD9, 0x85, 0xD8, 0xAE, 0x44, 0xD9,
+	0x85, 0xD9, 0x85, 0x44, 0xD9, 0x85, 0xD9, 0x89,
+	0x44, 0xD9, 0x85, 0xD9, 0x8A, 0x44, 0xD9, 0x86,
+	// Bytes 2100 - 213f
+	0xD8, 0xAC, 0x44, 0xD9, 0x86, 0xD8, 0xAD, 0x44,
+	0xD9, 0x86, 0xD8, 0xAE, 0x44, 0xD9, 0x86, 0xD8,
+	0xB1, 0x44, 0xD9, 0x86, 0xD8, 0xB2, 0x44, 0xD9,
+	0x86, 0xD9, 0x85, 0x44, 0xD9, 0x86, 0xD9, 0x86,
+	0x44, 0xD9, 0x86, 0xD9, 0x87, 0x44, 0xD9, 0x86,
+	0xD9, 0x89, 0x44, 0xD9, 0x86, 0xD9, 0x8A, 0x44,
+	0xD9, 0x87, 0xD8, 0xAC, 0x44, 0xD9, 0x87, 0xD9,
+	0x85, 0x44, 0xD9, 0x87, 0xD9, 0x89, 0x44, 0xD9,
+	// Bytes 2140 - 217f
+	0x87, 0xD9, 0x8A, 0x44, 0xD9, 0x88, 0xD9, 0xB4,
+	0x44, 0xD9, 0x8A, 0xD8, 0xAC, 0x44, 0xD9, 0x8A,
+	0xD8, 0xAD, 0x44, 0xD9, 0x8A, 0xD8, 0xAE, 0x44,
+	0xD9, 0x8A, 0xD8, 0xB1, 0x44, 0xD9, 0x8A, 0xD8,
+	0xB2, 0x44, 0xD9, 0x8A, 0xD9, 0x85, 0x44, 0xD9,
+	0x8A, 0xD9, 0x86, 0x44, 0xD9, 0x8A, 0xD9, 0x87,
+	0x44, 0xD9, 0x8A, 0xD9, 0x89, 0x44, 0xD9, 0x8A,
+	0xD9, 0x8A, 0x44, 0xD9, 0x8A, 0xD9, 0xB4, 0x44,
+	// Bytes 2180 - 21bf
+	0xDB, 0x87, 0xD9, 0xB4, 0x45, 0x28, 0xE1, 0x84,
+	0x80, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x82, 0x29,
+	0x45, 0x28, 0xE1, 0x84, 0x83, 0x29, 0x45, 0x28,
+	0xE1, 0x84, 0x85, 0x29, 0x45, 0x28, 0xE1, 0x84,
+	0x86, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x87, 0x29,
+	0x45, 0x28, 0xE1, 0x84, 0x89, 0x29, 0x45, 0x28,
+	0xE1, 0x84, 0x8B, 0x29, 0x45, 0x28, 0xE1, 0x84,
+	0x8C, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x8E, 0x29,
+	// Bytes 21c0 - 21ff
+	0x45, 0x28, 0xE1, 0x84, 0x8F, 0x29, 0x45, 0x28,
+	0xE1, 0x84, 0x90, 0x29, 0x45, 0x28, 0xE1, 0x84,
+	0x91, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x92, 0x29,
+	0x45, 0x28, 0xE4, 0xB8, 0x80, 0x29, 0x45, 0x28,
+	0xE4, 0xB8, 0x83, 0x29, 0x45, 0x28, 0xE4, 0xB8,
+	0x89, 0x29, 0x45, 0x28, 0xE4, 0xB9, 0x9D, 0x29,
+	0x45, 0x28, 0xE4, 0xBA, 0x8C, 0x29, 0x45, 0x28,
+	0xE4, 0xBA, 0x94, 0x29, 0x45, 0x28, 0xE4, 0xBB,
+	// Bytes 2200 - 223f
+	0xA3, 0x29, 0x45, 0x28, 0xE4, 0xBC, 0x81, 0x29,
+	0x45, 0x28, 0xE4, 0xBC, 0x91, 0x29, 0x45, 0x28,
+	0xE5, 0x85, 0xAB, 0x29, 0x45, 0x28, 0xE5, 0x85,
+	0xAD, 0x29, 0x45, 0x28, 0xE5, 0x8A, 0xB4, 0x29,
+	0x45, 0x28, 0xE5, 0x8D, 0x81, 0x29, 0x45, 0x28,
+	0xE5, 0x8D, 0x94, 0x29, 0x45, 0x28, 0xE5, 0x90,
+	0x8D, 0x29, 0x45, 0x28, 0xE5, 0x91, 0xBC, 0x29,
+	0x45, 0x28, 0xE5, 0x9B, 0x9B, 0x29, 0x45, 0x28,
+	// Bytes 2240 - 227f
+	0xE5, 0x9C, 0x9F, 0x29, 0x45, 0x28, 0xE5, 0xAD,
+	0xA6, 0x29, 0x45, 0x28, 0xE6, 0x97, 0xA5, 0x29,
+	0x45, 0x28, 0xE6, 0x9C, 0x88, 0x29, 0x45, 0x28,
+	0xE6, 0x9C, 0x89, 0x29, 0x45, 0x28, 0xE6, 0x9C,
+	0xA8, 0x29, 0x45, 0x28, 0xE6, 0xA0, 0xAA, 0x29,
+	0x45, 0x28, 0xE6, 0xB0, 0xB4, 0x29, 0x45, 0x28,
+	0xE7, 0x81, 0xAB, 0x29, 0x45, 0x28, 0xE7, 0x89,
+	0xB9, 0x29, 0x45, 0x28, 0xE7, 0x9B, 0xA3, 0x29,
+	// Bytes 2280 - 22bf
+	0x45, 0x28, 0xE7, 0xA4, 0xBE, 0x29, 0x45, 0x28,
+	0xE7, 0xA5, 0x9D, 0x29, 0x45, 0x28, 0xE7, 0xA5,
+	0xAD, 0x29, 0x45, 0x28, 0xE8, 0x87, 0xAA, 0x29,
+	0x45, 0x28, 0xE8, 0x87, 0xB3, 0x29, 0x45, 0x28,
+	0xE8, 0xB2, 0xA1, 0x29, 0x45, 0x28, 0xE8, 0xB3,
+	0x87, 0x29, 0x45, 0x28, 0xE9, 0x87, 0x91, 0x29,
+	0x45, 0x30, 0xE2, 0x81, 0x84, 0x33, 0x45, 0x31,
+	0x30, 0xE6, 0x97, 0xA5, 0x45, 0x31, 0x30, 0xE6,
+	// Bytes 22c0 - 22ff
+	0x9C, 0x88, 0x45, 0x31, 0x30, 0xE7, 0x82, 0xB9,
+	0x45, 0x31, 0x31, 0xE6, 0x97, 0xA5, 0x45, 0x31,
+	0x31, 0xE6, 0x9C, 0x88, 0x45, 0x31, 0x31, 0xE7,
+	0x82, 0xB9, 0x45, 0x31, 0x32, 0xE6, 0x97, 0xA5,
+	0x45, 0x31, 0x32, 0xE6, 0x9C, 0x88, 0x45, 0x31,
+	0x32, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x33, 0xE6,
+	0x97, 0xA5, 0x45, 0x31, 0x33, 0xE7, 0x82, 0xB9,
+	0x45, 0x31, 0x34, 0xE6, 0x97, 0xA5, 0x45, 0x31,
+	// Bytes 2300 - 233f
+	0x34, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x35, 0xE6,
+	0x97, 0xA5, 0x45, 0x31, 0x35, 0xE7, 0x82, 0xB9,
+	0x45, 0x31, 0x36, 0xE6, 0x97, 0xA5, 0x45, 0x31,
+	0x36, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x37, 0xE6,
+	0x97, 0xA5, 0x45, 0x31, 0x37, 0xE7, 0x82, 0xB9,
+	0x45, 0x31, 0x38, 0xE6, 0x97, 0xA5, 0x45, 0x31,
+	0x38, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x39, 0xE6,
+	0x97, 0xA5, 0x45, 0x31, 0x39, 0xE7, 0x82, 0xB9,
+	// Bytes 2340 - 237f
+	0x45, 0x31, 0xE2, 0x81, 0x84, 0x32, 0x45, 0x31,
+	0xE2, 0x81, 0x84, 0x33, 0x45, 0x31, 0xE2, 0x81,
+	0x84, 0x34, 0x45, 0x31, 0xE2, 0x81, 0x84, 0x35,
+	0x45, 0x31, 0xE2, 0x81, 0x84, 0x36, 0x45, 0x31,
+	0xE2, 0x81, 0x84, 0x37, 0x45, 0x31, 0xE2, 0x81,
+	0x84, 0x38, 0x45, 0x31, 0xE2, 0x81, 0x84, 0x39,
+	0x45, 0x32, 0x30, 0xE6, 0x97, 0xA5, 0x45, 0x32,
+	0x30, 0xE7, 0x82, 0xB9, 0x45, 0x32, 0x31, 0xE6,
+	// Bytes 2380 - 23bf
+	0x97, 0xA5, 0x45, 0x32, 0x31, 0xE7, 0x82, 0xB9,
+	0x45, 0x32, 0x32, 0xE6, 0x97, 0xA5, 0x45, 0x32,
+	0x32, 0xE7, 0x82, 0xB9, 0x45, 0x32, 0x33, 0xE6,
+	0x97, 0xA5, 0x45, 0x32, 0x33, 0xE7, 0x82, 0xB9,
+	0x45, 0x32, 0x34, 0xE6, 0x97, 0xA5, 0x45, 0x32,
+	0x34, 0xE7, 0x82, 0xB9, 0x45, 0x32, 0x35, 0xE6,
+	0x97, 0xA5, 0x45, 0x32, 0x36, 0xE6, 0x97, 0xA5,
+	0x45, 0x32, 0x37, 0xE6, 0x97, 0xA5, 0x45, 0x32,
+	// Bytes 23c0 - 23ff
+	0x38, 0xE6, 0x97, 0xA5, 0x45, 0x32, 0x39, 0xE6,
+	0x97, 0xA5, 0x45, 0x32, 0xE2, 0x81, 0x84, 0x33,
+	0x45, 0x32, 0xE2, 0x81, 0x84, 0x35, 0x45, 0x33,
+	0x30, 0xE6, 0x97, 0xA5, 0x45, 0x33, 0x31, 0xE6,
+	0x97, 0xA5, 0x45, 0x33, 0xE2, 0x81, 0x84, 0x34,
+	0x45, 0x33, 0xE2, 0x81, 0x84, 0x35, 0x45, 0x33,
+	0xE2, 0x81, 0x84, 0x38, 0x45, 0x34, 0xE2, 0x81,
+	0x84, 0x35, 0x45, 0x35, 0xE2, 0x81, 0x84, 0x36,
+	// Bytes 2400 - 243f
+	0x45, 0x35, 0xE2, 0x81, 0x84, 0x38, 0x45, 0x37,
+	0xE2, 0x81, 0x84, 0x38, 0x45, 0x41, 0xE2, 0x88,
+	0x95, 0x6D, 0x45, 0x56, 0xE2, 0x88, 0x95, 0x6D,
+	0x45, 0x6D, 0xE2, 0x88, 0x95, 0x73, 0x46, 0x31,
+	0xE2, 0x81, 0x84, 0x31, 0x30, 0x46, 0x43, 0xE2,
+	0x88, 0x95, 0x6B, 0x67, 0x46, 0x6D, 0xE2, 0x88,
+	0x95, 0x73, 0x32, 0x46, 0xD8, 0xA8, 0xD8, 0xAD,
+	0xD9, 0x8A, 0x46, 0xD8, 0xA8, 0xD8, 0xAE, 0xD9,
+	// Bytes 2440 - 247f
+	0x8A, 0x46, 0xD8, 0xAA, 0xD8, 0xAC, 0xD9, 0x85,
+	0x46, 0xD8, 0xAA, 0xD8, 0xAC, 0xD9, 0x89, 0x46,
+	0xD8, 0xAA, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD8,
+	0xAA, 0xD8, 0xAD, 0xD8, 0xAC, 0x46, 0xD8, 0xAA,
+	0xD8, 0xAD, 0xD9, 0x85, 0x46, 0xD8, 0xAA, 0xD8,
+	0xAE, 0xD9, 0x85, 0x46, 0xD8, 0xAA, 0xD8, 0xAE,
+	0xD9, 0x89, 0x46, 0xD8, 0xAA, 0xD8, 0xAE, 0xD9,
+	0x8A, 0x46, 0xD8, 0xAA, 0xD9, 0x85, 0xD8, 0xAC,
+	// Bytes 2480 - 24bf
+	0x46, 0xD8, 0xAA, 0xD9, 0x85, 0xD8, 0xAD, 0x46,
+	0xD8, 0xAA, 0xD9, 0x85, 0xD8, 0xAE, 0x46, 0xD8,
+	0xAA, 0xD9, 0x85, 0xD9, 0x89, 0x46, 0xD8, 0xAA,
+	0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD8, 0xAC, 0xD8,
+	0xAD, 0xD9, 0x89, 0x46, 0xD8, 0xAC, 0xD8, 0xAD,
+	0xD9, 0x8A, 0x46, 0xD8, 0xAC, 0xD9, 0x85, 0xD8,
+	0xAD, 0x46, 0xD8, 0xAC, 0xD9, 0x85, 0xD9, 0x89,
+	0x46, 0xD8, 0xAC, 0xD9, 0x85, 0xD9, 0x8A, 0x46,
+	// Bytes 24c0 - 24ff
+	0xD8, 0xAD, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD8,
+	0xAD, 0xD9, 0x85, 0xD9, 0x89, 0x46, 0xD8, 0xAD,
+	0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD8, 0xB3, 0xD8,
+	0xAC, 0xD8, 0xAD, 0x46, 0xD8, 0xB3, 0xD8, 0xAC,
+	0xD9, 0x89, 0x46, 0xD8, 0xB3, 0xD8, 0xAD, 0xD8,
+	0xAC, 0x46, 0xD8, 0xB3, 0xD8, 0xAE, 0xD9, 0x89,
+	0x46, 0xD8, 0xB3, 0xD8, 0xAE, 0xD9, 0x8A, 0x46,
+	0xD8, 0xB3, 0xD9, 0x85, 0xD8, 0xAC, 0x46, 0xD8,
+	// Bytes 2500 - 253f
+	0xB3, 0xD9, 0x85, 0xD8, 0xAD, 0x46, 0xD8, 0xB3,
+	0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD8, 0xB4, 0xD8,
+	0xAC, 0xD9, 0x8A, 0x46, 0xD8, 0xB4, 0xD8, 0xAD,
+	0xD9, 0x85, 0x46, 0xD8, 0xB4, 0xD8, 0xAD, 0xD9,
+	0x8A, 0x46, 0xD8, 0xB4, 0xD9, 0x85, 0xD8, 0xAE,
+	0x46, 0xD8, 0xB4, 0xD9, 0x85, 0xD9, 0x85, 0x46,
+	0xD8, 0xB5, 0xD8, 0xAD, 0xD8, 0xAD, 0x46, 0xD8,
+	0xB5, 0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD8, 0xB5,
+	// Bytes 2540 - 257f
+	0xD9, 0x84, 0xD9, 0x89, 0x46, 0xD8, 0xB5, 0xD9,
+	0x84, 0xDB, 0x92, 0x46, 0xD8, 0xB5, 0xD9, 0x85,
+	0xD9, 0x85, 0x46, 0xD8, 0xB6, 0xD8, 0xAD, 0xD9,
+	0x89, 0x46, 0xD8, 0xB6, 0xD8, 0xAD, 0xD9, 0x8A,
+	0x46, 0xD8, 0xB6, 0xD8, 0xAE, 0xD9, 0x85, 0x46,
+	0xD8, 0xB7, 0xD9, 0x85, 0xD8, 0xAD, 0x46, 0xD8,
+	0xB7, 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD8, 0xB7,
+	0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD8, 0xB9, 0xD8,
+	// Bytes 2580 - 25bf
+	0xAC, 0xD9, 0x85, 0x46, 0xD8, 0xB9, 0xD9, 0x85,
+	0xD9, 0x85, 0x46, 0xD8, 0xB9, 0xD9, 0x85, 0xD9,
+	0x89, 0x46, 0xD8, 0xB9, 0xD9, 0x85, 0xD9, 0x8A,
+	0x46, 0xD8, 0xBA, 0xD9, 0x85, 0xD9, 0x85, 0x46,
+	0xD8, 0xBA, 0xD9, 0x85, 0xD9, 0x89, 0x46, 0xD8,
+	0xBA, 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x81,
+	0xD8, 0xAE, 0xD9, 0x85, 0x46, 0xD9, 0x81, 0xD9,
+	0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x82, 0xD9, 0x84,
+	// Bytes 25c0 - 25ff
+	0xDB, 0x92, 0x46, 0xD9, 0x82, 0xD9, 0x85, 0xD8,
+	0xAD, 0x46, 0xD9, 0x82, 0xD9, 0x85, 0xD9, 0x85,
+	0x46, 0xD9, 0x82, 0xD9, 0x85, 0xD9, 0x8A, 0x46,
+	0xD9, 0x83, 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD9,
+	0x83, 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x84,
+	0xD8, 0xAC, 0xD8, 0xAC, 0x46, 0xD9, 0x84, 0xD8,
+	0xAC, 0xD9, 0x85, 0x46, 0xD9, 0x84, 0xD8, 0xAC,
+	0xD9, 0x8A, 0x46, 0xD9, 0x84, 0xD8, 0xAD, 0xD9,
+	// Bytes 2600 - 263f
+	0x85, 0x46, 0xD9, 0x84, 0xD8, 0xAD, 0xD9, 0x89,
+	0x46, 0xD9, 0x84, 0xD8, 0xAD, 0xD9, 0x8A, 0x46,
+	0xD9, 0x84, 0xD8, 0xAE, 0xD9, 0x85, 0x46, 0xD9,
+	0x84, 0xD9, 0x85, 0xD8, 0xAD, 0x46, 0xD9, 0x84,
+	0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x85, 0xD8,
+	0xAC, 0xD8, 0xAD, 0x46, 0xD9, 0x85, 0xD8, 0xAC,
+	0xD8, 0xAE, 0x46, 0xD9, 0x85, 0xD8, 0xAC, 0xD9,
+	0x85, 0x46, 0xD9, 0x85, 0xD8, 0xAC, 0xD9, 0x8A,
+	// Bytes 2640 - 267f
+	0x46, 0xD9, 0x85, 0xD8, 0xAD, 0xD8, 0xAC, 0x46,
+	0xD9, 0x85, 0xD8, 0xAD, 0xD9, 0x85, 0x46, 0xD9,
+	0x85, 0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD9, 0x85,
+	0xD8, 0xAE, 0xD8, 0xAC, 0x46, 0xD9, 0x85, 0xD8,
+	0xAE, 0xD9, 0x85, 0x46, 0xD9, 0x85, 0xD8, 0xAE,
+	0xD9, 0x8A, 0x46, 0xD9, 0x85, 0xD9, 0x85, 0xD9,
+	0x8A, 0x46, 0xD9, 0x86, 0xD8, 0xAC, 0xD8, 0xAD,
+	0x46, 0xD9, 0x86, 0xD8, 0xAC, 0xD9, 0x85, 0x46,
+	// Bytes 2680 - 26bf
+	0xD9, 0x86, 0xD8, 0xAC, 0xD9, 0x89, 0x46, 0xD9,
+	0x86, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD9, 0x86,
+	0xD8, 0xAD, 0xD9, 0x85, 0x46, 0xD9, 0x86, 0xD8,
+	0xAD, 0xD9, 0x89, 0x46, 0xD9, 0x86, 0xD8, 0xAD,
+	0xD9, 0x8A, 0x46, 0xD9, 0x86, 0xD9, 0x85, 0xD9,
+	0x89, 0x46, 0xD9, 0x86, 0xD9, 0x85, 0xD9, 0x8A,
+	0x46, 0xD9, 0x87, 0xD9, 0x85, 0xD8, 0xAC, 0x46,
+	0xD9, 0x87, 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD9,
+	// Bytes 26c0 - 26ff
+	0x8A, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD9, 0x8A,
+	0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD9, 0x8A, 0xD9,
+	0x85, 0xD9, 0x85, 0x46, 0xD9, 0x8A, 0xD9, 0x85,
+	0xD9, 0x8A, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD8,
+	0xA7, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD8, 0xAC,
+	0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD8, 0xAD, 0x46,
+	0xD9, 0x8A, 0xD9, 0x94, 0xD8, 0xAE, 0x46, 0xD9,
+	0x8A, 0xD9, 0x94, 0xD8, 0xB1, 0x46, 0xD9, 0x8A,
+	// Bytes 2700 - 273f
+	0xD9, 0x94, 0xD8, 0xB2, 0x46, 0xD9, 0x8A, 0xD9,
+	0x94, 0xD9, 0x85, 0x46, 0xD9, 0x8A, 0xD9, 0x94,
+	0xD9, 0x86, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD9,
+	0x87, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD9, 0x88,
+	0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD9, 0x89, 0x46,
+	0xD9, 0x8A, 0xD9, 0x94, 0xD9, 0x8A, 0x46, 0xD9,
+	0x8A, 0xD9, 0x94, 0xDB, 0x86, 0x46, 0xD9, 0x8A,
+	0xD9, 0x94, 0xDB, 0x87, 0x46, 0xD9, 0x8A, 0xD9,
+	// Bytes 2740 - 277f
+	0x94, 0xDB, 0x88, 0x46, 0xD9, 0x8A, 0xD9, 0x94,
+	0xDB, 0x90, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xDB,
+	0x95, 0x46, 0xE0, 0xB9, 0x8D, 0xE0, 0xB8, 0xB2,
+	0x46, 0xE0, 0xBA, 0xAB, 0xE0, 0xBA, 0x99, 0x46,
+	0xE0, 0xBA, 0xAB, 0xE0, 0xBA, 0xA1, 0x46, 0xE0,
+	0xBB, 0x8D, 0xE0, 0xBA, 0xB2, 0x46, 0xE0, 0xBD,
+	0x80, 0xE0, 0xBE, 0xB5, 0x46, 0xE0, 0xBD, 0x82,
+	0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBD, 0x8C, 0xE0,
+	// Bytes 2780 - 27bf
+	0xBE, 0xB7, 0x46, 0xE0, 0xBD, 0x91, 0xE0, 0xBE,
+	0xB7, 0x46, 0xE0, 0xBD, 0x96, 0xE0, 0xBE, 0xB7,
+	0x46, 0xE0, 0xBD, 0x9B, 0xE0, 0xBE, 0xB7, 0x46,
+	0xE0, 0xBE, 0x90, 0xE0, 0xBE, 0xB5, 0x46, 0xE0,
+	0xBE, 0x92, 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBE,
+	0x9C, 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBE, 0xA1,
+	0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBE, 0xA6, 0xE0,
+	0xBE, 0xB7, 0x46, 0xE0, 0xBE, 0xAB, 0xE0, 0xBE,
+	// Bytes 27c0 - 27ff
+	0xB7, 0x46, 0xE2, 0x80, 0xB2, 0xE2, 0x80, 0xB2,
+	0x46, 0xE2, 0x80, 0xB5, 0xE2, 0x80, 0xB5, 0x46,
+	0xE2, 0x88, 0xAB, 0xE2, 0x88, 0xAB, 0x46, 0xE2,
+	0x88, 0xAE, 0xE2, 0x88, 0xAE, 0x46, 0xE3, 0x81,
+	0xBB, 0xE3, 0x81, 0x8B, 0x46, 0xE3, 0x82, 0x88,
+	0xE3, 0x82, 0x8A, 0x46, 0xE3, 0x82, 0xAD, 0xE3,
+	0x83, 0xAD, 0x46, 0xE3, 0x82, 0xB3, 0xE3, 0x82,
+	0xB3, 0x46, 0xE3, 0x82, 0xB3, 0xE3, 0x83, 0x88,
+	// Bytes 2800 - 283f
+	0x46, 0xE3, 0x83, 0x88, 0xE3, 0x83, 0xB3, 0x46,
+	0xE3, 0x83, 0x8A, 0xE3, 0x83, 0x8E, 0x46, 0xE3,
+	0x83, 0x9B, 0xE3, 0x83, 0xB3, 0x46, 0xE3, 0x83,
+	0x9F, 0xE3, 0x83, 0xAA, 0x46, 0xE3, 0x83, 0xAA,
+	0xE3, 0x83, 0xA9, 0x46, 0xE3, 0x83, 0xAC, 0xE3,
+	0x83, 0xA0, 0x46, 0xE4, 0xBB, 0xA4, 0xE5, 0x92,
+	0x8C, 0x46, 0xE5, 0xA4, 0xA7, 0xE6, 0xAD, 0xA3,
+	0x46, 0xE5, 0xB9, 0xB3, 0xE6, 0x88, 0x90, 0x46,
+	// Bytes 2840 - 287f
+	0xE6, 0x98, 0x8E, 0xE6, 0xB2, 0xBB, 0x46, 0xE6,
+	0x98, 0xAD, 0xE5, 0x92, 0x8C, 0x47, 0x72, 0x61,
+	0x64, 0xE2, 0x88, 0x95, 0x73, 0x47, 0xE3, 0x80,
+	0x94, 0x53, 0xE3, 0x80, 0x95, 0x48, 0x28, 0xE1,
+	0x84, 0x80, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28,
+	0xE1, 0x84, 0x82, 0xE1, 0x85, 0xA1, 0x29, 0x48,
+	0x28, 0xE1, 0x84, 0x83, 0xE1, 0x85, 0xA1, 0x29,
+	0x48, 0x28, 0xE1, 0x84, 0x85, 0xE1, 0x85, 0xA1,
+	// Bytes 2880 - 28bf
+	0x29, 0x48, 0x28, 0xE1, 0x84, 0x86, 0xE1, 0x85,
+	0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x87, 0xE1,
+	0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x89,
+	0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84,
+	0x8B, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1,
+	0x84, 0x8C, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28,
+	0xE1, 0x84, 0x8C, 0xE1, 0x85, 0xAE, 0x29, 0x48,
+	0x28, 0xE1, 0x84, 0x8E, 0xE1, 0x85, 0xA1, 0x29,
+	// Bytes 28c0 - 28ff
+	0x48, 0x28, 0xE1, 0x84, 0x8F, 0xE1, 0x85, 0xA1,
+	0x29, 0x48, 0x28, 0xE1, 0x84, 0x90, 0xE1, 0x85,
+	0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x91, 0xE1,
+	0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x92,
+	0xE1, 0x85, 0xA1, 0x29, 0x48, 0x72, 0x61, 0x64,
+	0xE2, 0x88, 0x95, 0x73, 0x32, 0x48, 0xD8, 0xA7,
+	0xD9, 0x83, 0xD8, 0xA8, 0xD8, 0xB1, 0x48, 0xD8,
+	0xA7, 0xD9, 0x84, 0xD9, 0x84, 0xD9, 0x87, 0x48,
+	// Bytes 2900 - 293f
+	0xD8, 0xB1, 0xD8, 0xB3, 0xD9, 0x88, 0xD9, 0x84,
+	0x48, 0xD8, 0xB1, 0xDB, 0x8C, 0xD8, 0xA7, 0xD9,
+	0x84, 0x48, 0xD8, 0xB5, 0xD9, 0x84, 0xD8, 0xB9,
+	0xD9, 0x85, 0x48, 0xD8, 0xB9, 0xD9, 0x84, 0xD9,
+	0x8A, 0xD9, 0x87, 0x48, 0xD9, 0x85, 0xD8, 0xAD,
+	0xD9, 0x85, 0xD8, 0xAF, 0x48, 0xD9, 0x88, 0xD8,
+	0xB3, 0xD9, 0x84, 0xD9, 0x85, 0x49, 0xE2, 0x80,
+	0xB2, 0xE2, 0x80, 0xB2, 0xE2, 0x80, 0xB2, 0x49,
+	// Bytes 2940 - 297f
+	0xE2, 0x80, 0xB5, 0xE2, 0x80, 0xB5, 0xE2, 0x80,
+	0xB5, 0x49, 0xE2, 0x88, 0xAB, 0xE2, 0x88, 0xAB,
+	0xE2, 0x88, 0xAB, 0x49, 0xE2, 0x88, 0xAE, 0xE2,
+	0x88, 0xAE, 0xE2, 0x88, 0xAE, 0x49, 0xE3, 0x80,
+	0x94, 0xE4, 0xB8, 0x89, 0xE3, 0x80, 0x95, 0x49,
+	0xE3, 0x80, 0x94, 0xE4, 0xBA, 0x8C, 0xE3, 0x80,
+	0x95, 0x49, 0xE3, 0x80, 0x94, 0xE5, 0x8B, 0x9D,
+	0xE3, 0x80, 0x95, 0x49, 0xE3, 0x80, 0x94, 0xE5,
+	// Bytes 2980 - 29bf
+	0xAE, 0x89, 0xE3, 0x80, 0x95, 0x49, 0xE3, 0x80,
+	0x94, 0xE6, 0x89, 0x93, 0xE3, 0x80, 0x95, 0x49,
+	0xE3, 0x80, 0x94, 0xE6, 0x95, 0x97, 0xE3, 0x80,
+	0x95, 0x49, 0xE3, 0x80, 0x94, 0xE6, 0x9C, 0xAC,
+	0xE3, 0x80, 0x95, 0x49, 0xE3, 0x80, 0x94, 0xE7,
+	0x82, 0xB9, 0xE3, 0x80, 0x95, 0x49, 0xE3, 0x80,
+	0x94, 0xE7, 0x9B, 0x97, 0xE3, 0x80, 0x95, 0x49,
+	0xE3, 0x82, 0xA2, 0xE3, 0x83, 0xBC, 0xE3, 0x83,
+	// Bytes 29c0 - 29ff
+	0xAB, 0x49, 0xE3, 0x82, 0xA4, 0xE3, 0x83, 0xB3,
+	0xE3, 0x83, 0x81, 0x49, 0xE3, 0x82, 0xA6, 0xE3,
+	0x82, 0xA9, 0xE3, 0x83, 0xB3, 0x49, 0xE3, 0x82,
+	0xAA, 0xE3, 0x83, 0xB3, 0xE3, 0x82, 0xB9, 0x49,
+	0xE3, 0x82, 0xAA, 0xE3, 0x83, 0xBC, 0xE3, 0x83,
+	0xA0, 0x49, 0xE3, 0x82, 0xAB, 0xE3, 0x82, 0xA4,
+	0xE3, 0x83, 0xAA, 0x49, 0xE3, 0x82, 0xB1, 0xE3,
+	0x83, 0xBC, 0xE3, 0x82, 0xB9, 0x49, 0xE3, 0x82,
+	// Bytes 2a00 - 2a3f
+	0xB3, 0xE3, 0x83, 0xAB, 0xE3, 0x83, 0x8A, 0x49,
+	0xE3, 0x82, 0xBB, 0xE3, 0x83, 0xB3, 0xE3, 0x83,
+	0x81, 0x49, 0xE3, 0x82, 0xBB, 0xE3, 0x83, 0xB3,
+	0xE3, 0x83, 0x88, 0x49, 0xE3, 0x83, 0x86, 0xE3,
+	0x82, 0x99, 0xE3, 0x82, 0xB7, 0x49, 0xE3, 0x83,
+	0x88, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xAB, 0x49,
+	0xE3, 0x83, 0x8E, 0xE3, 0x83, 0x83, 0xE3, 0x83,
+	0x88, 0x49, 0xE3, 0x83, 0x8F, 0xE3, 0x82, 0xA4,
+	// Bytes 2a40 - 2a7f
+	0xE3, 0x83, 0x84, 0x49, 0xE3, 0x83, 0x92, 0xE3,
+	0x82, 0x99, 0xE3, 0x83, 0xAB, 0x49, 0xE3, 0x83,
+	0x92, 0xE3, 0x82, 0x9A, 0xE3, 0x82, 0xB3, 0x49,
+	0xE3, 0x83, 0x95, 0xE3, 0x83, 0xA9, 0xE3, 0x83,
+	0xB3, 0x49, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x9A,
+	0xE3, 0x82, 0xBD, 0x49, 0xE3, 0x83, 0x98, 0xE3,
+	0x83, 0xAB, 0xE3, 0x83, 0x84, 0x49, 0xE3, 0x83,
+	0x9B, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0xAB, 0x49,
+	// Bytes 2a80 - 2abf
+	0xE3, 0x83, 0x9B, 0xE3, 0x83, 0xBC, 0xE3, 0x83,
+	0xB3, 0x49, 0xE3, 0x83, 0x9E, 0xE3, 0x82, 0xA4,
+	0xE3, 0x83, 0xAB, 0x49, 0xE3, 0x83, 0x9E, 0xE3,
+	0x83, 0x83, 0xE3, 0x83, 0x8F, 0x49, 0xE3, 0x83,
+	0x9E, 0xE3, 0x83, 0xAB, 0xE3, 0x82, 0xAF, 0x49,
+	0xE3, 0x83, 0xA4, 0xE3, 0x83, 0xBC, 0xE3, 0x83,
+	0xAB, 0x49, 0xE3, 0x83, 0xA6, 0xE3, 0x82, 0xA2,
+	0xE3, 0x83, 0xB3, 0x49, 0xE3, 0x83, 0xAF, 0xE3,
+	// Bytes 2ac0 - 2aff
+	0x83, 0x83, 0xE3, 0x83, 0x88, 0x4C, 0xE2, 0x80,
+	0xB2, 0xE2, 0x80, 0xB2, 0xE2, 0x80, 0xB2, 0xE2,
+	0x80, 0xB2, 0x4C, 0xE2, 0x88, 0xAB, 0xE2, 0x88,
+	0xAB, 0xE2, 0x88, 0xAB, 0xE2, 0x88, 0xAB, 0x4C,
+	0xE3, 0x82, 0xA2, 0xE3, 0x83, 0xAB, 0xE3, 0x83,
+	0x95, 0xE3, 0x82, 0xA1, 0x4C, 0xE3, 0x82, 0xA8,
+	0xE3, 0x83, 0xBC, 0xE3, 0x82, 0xAB, 0xE3, 0x83,
+	0xBC, 0x4C, 0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99,
+	// Bytes 2b00 - 2b3f
+	0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xB3, 0x4C, 0xE3,
+	0x82, 0xAB, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xB3,
+	0xE3, 0x83, 0x9E, 0x4C, 0xE3, 0x82, 0xAB, 0xE3,
+	0x83, 0xA9, 0xE3, 0x83, 0x83, 0xE3, 0x83, 0x88,
+	0x4C, 0xE3, 0x82, 0xAB, 0xE3, 0x83, 0xAD, 0xE3,
+	0x83, 0xAA, 0xE3, 0x83, 0xBC, 0x4C, 0xE3, 0x82,
+	0xAD, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0x8B, 0xE3,
+	0x83, 0xBC, 0x4C, 0xE3, 0x82, 0xAD, 0xE3, 0x83,
+	// Bytes 2b40 - 2b7f
+	0xA5, 0xE3, 0x83, 0xAA, 0xE3, 0x83, 0xBC, 0x4C,
+	0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, 0xE3, 0x83,
+	0xA9, 0xE3, 0x83, 0xA0, 0x4C, 0xE3, 0x82, 0xAF,
+	0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xBC, 0xE3, 0x83,
+	0x8D, 0x4C, 0xE3, 0x82, 0xB5, 0xE3, 0x82, 0xA4,
+	0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xAB, 0x4C, 0xE3,
+	0x82, 0xBF, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xBC,
+	0xE3, 0x82, 0xB9, 0x4C, 0xE3, 0x83, 0x8F, 0xE3,
+	// Bytes 2b80 - 2bbf
+	0x82, 0x9A, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x84,
+	0x4C, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x9A, 0xE3,
+	0x82, 0xAF, 0xE3, 0x83, 0xAB, 0x4C, 0xE3, 0x83,
+	0x95, 0xE3, 0x82, 0xA3, 0xE3, 0x83, 0xBC, 0xE3,
+	0x83, 0x88, 0x4C, 0xE3, 0x83, 0x98, 0xE3, 0x82,
+	0x99, 0xE3, 0x83, 0xBC, 0xE3, 0x82, 0xBF, 0x4C,
+	0xE3, 0x83, 0x98, 0xE3, 0x82, 0x9A, 0xE3, 0x83,
+	0x8B, 0xE3, 0x83, 0x92, 0x4C, 0xE3, 0x83, 0x98,
+	// Bytes 2bc0 - 2bff
+	0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xB3, 0xE3, 0x82,
+	0xB9, 0x4C, 0xE3, 0x83, 0x9B, 0xE3, 0x82, 0x99,
+	0xE3, 0x83, 0xAB, 0xE3, 0x83, 0x88, 0x4C, 0xE3,
+	0x83, 0x9E, 0xE3, 0x82, 0xA4, 0xE3, 0x82, 0xAF,
+	0xE3, 0x83, 0xAD, 0x4C, 0xE3, 0x83, 0x9F, 0xE3,
+	0x82, 0xAF, 0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xB3,
+	0x4C, 0xE3, 0x83, 0xA1, 0xE3, 0x83, 0xBC, 0xE3,
+	0x83, 0x88, 0xE3, 0x83, 0xAB, 0x4C, 0xE3, 0x83,
+	// Bytes 2c00 - 2c3f
+	0xAA, 0xE3, 0x83, 0x83, 0xE3, 0x83, 0x88, 0xE3,
+	0x83, 0xAB, 0x4C, 0xE3, 0x83, 0xAB, 0xE3, 0x83,
+	0x92, 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xBC, 0x4C,
+	0xE6, 0xA0, 0xAA, 0xE5, 0xBC, 0x8F, 0xE4, 0xBC,
+	0x9A, 0xE7, 0xA4, 0xBE, 0x4E, 0x28, 0xE1, 0x84,
+	0x8B, 0xE1, 0x85, 0xA9, 0xE1, 0x84, 0x92, 0xE1,
+	0x85, 0xAE, 0x29, 0x4F, 0xD8, 0xAC, 0xD9, 0x84,
+	0x20, 0xD8, 0xAC, 0xD9, 0x84, 0xD8, 0xA7, 0xD9,
+	// Bytes 2c40 - 2c7f
+	0x84, 0xD9, 0x87, 0x4F, 0xE3, 0x82, 0xA2, 0xE3,
+	0x83, 0x8F, 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xBC,
+	0xE3, 0x83, 0x88, 0x4F, 0xE3, 0x82, 0xA2, 0xE3,
+	0x83, 0xB3, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x9A,
+	0xE3, 0x82, 0xA2, 0x4F, 0xE3, 0x82, 0xAD, 0xE3,
+	0x83, 0xAD, 0xE3, 0x83, 0xAF, 0xE3, 0x83, 0x83,
+	0xE3, 0x83, 0x88, 0x4F, 0xE3, 0x82, 0xB5, 0xE3,
+	0x83, 0xB3, 0xE3, 0x83, 0x81, 0xE3, 0x83, 0xBC,
+	// Bytes 2c80 - 2cbf
+	0xE3, 0x83, 0xA0, 0x4F, 0xE3, 0x83, 0x8F, 0xE3,
+	0x82, 0x99, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0xAC,
+	0xE3, 0x83, 0xAB, 0x4F, 0xE3, 0x83, 0x98, 0xE3,
+	0x82, 0xAF, 0xE3, 0x82, 0xBF, 0xE3, 0x83, 0xBC,
+	0xE3, 0x83, 0xAB, 0x4F, 0xE3, 0x83, 0x9B, 0xE3,
+	0x82, 0x9A, 0xE3, 0x82, 0xA4, 0xE3, 0x83, 0xB3,
+	0xE3, 0x83, 0x88, 0x4F, 0xE3, 0x83, 0x9E, 0xE3,
+	0x83, 0xB3, 0xE3, 0x82, 0xB7, 0xE3, 0x83, 0xA7,
+	// Bytes 2cc0 - 2cff
+	0xE3, 0x83, 0xB3, 0x4F, 0xE3, 0x83, 0xA1, 0xE3,
+	0x82, 0xAB, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0x88,
+	0xE3, 0x83, 0xB3, 0x4F, 0xE3, 0x83, 0xAB, 0xE3,
+	0x83, 0xBC, 0xE3, 0x83, 0x95, 0xE3, 0x82, 0x99,
+	0xE3, 0x83, 0xAB, 0x51, 0x28, 0xE1, 0x84, 0x8B,
+	0xE1, 0x85, 0xA9, 0xE1, 0x84, 0x8C, 0xE1, 0x85,
+	0xA5, 0xE1, 0x86, 0xAB, 0x29, 0x52, 0xE3, 0x82,
+	0xAD, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xAB, 0xE3,
+	// Bytes 2d00 - 2d3f
+	0x82, 0xBF, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xBC,
+	0x52, 0xE3, 0x82, 0xAD, 0xE3, 0x83, 0xAD, 0xE3,
+	0x82, 0xAF, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xA9,
+	0xE3, 0x83, 0xA0, 0x52, 0xE3, 0x82, 0xAD, 0xE3,
+	0x83, 0xAD, 0xE3, 0x83, 0xA1, 0xE3, 0x83, 0xBC,
+	0xE3, 0x83, 0x88, 0xE3, 0x83, 0xAB, 0x52, 0xE3,
+	0x82, 0xAF, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xA9,
+	0xE3, 0x83, 0xA0, 0xE3, 0x83, 0x88, 0xE3, 0x83,
+	// Bytes 2d40 - 2d7f
+	0xB3, 0x52, 0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xAB,
+	0xE3, 0x82, 0xBB, 0xE3, 0x82, 0x99, 0xE3, 0x82,
+	0xA4, 0xE3, 0x83, 0xAD, 0x52, 0xE3, 0x83, 0x8F,
+	0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xBC, 0xE3, 0x82,
+	0xBB, 0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x88, 0x52,
+	0xE3, 0x83, 0x92, 0xE3, 0x82, 0x9A, 0xE3, 0x82,
+	0xA2, 0xE3, 0x82, 0xB9, 0xE3, 0x83, 0x88, 0xE3,
+	0x83, 0xAB, 0x52, 0xE3, 0x83, 0x95, 0xE3, 0x82,
+	// Bytes 2d80 - 2dbf
+	0x99, 0xE3, 0x83, 0x83, 0xE3, 0x82, 0xB7, 0xE3,
+	0x82, 0xA7, 0xE3, 0x83, 0xAB, 0x52, 0xE3, 0x83,
+	0x9F, 0xE3, 0x83, 0xAA, 0xE3, 0x83, 0x8F, 0xE3,
+	0x82, 0x99, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0xAB,
+	0x52, 0xE3, 0x83, 0xAC, 0xE3, 0x83, 0xB3, 0xE3,
+	0x83, 0x88, 0xE3, 0x82, 0xB1, 0xE3, 0x82, 0x99,
+	0xE3, 0x83, 0xB3, 0x61, 0xD8, 0xB5, 0xD9, 0x84,
+	0xD9, 0x89, 0x20, 0xD8, 0xA7, 0xD9, 0x84, 0xD9,
+	// Bytes 2dc0 - 2dff
+	0x84, 0xD9, 0x87, 0x20, 0xD8, 0xB9, 0xD9, 0x84,
+	0xD9, 0x8A, 0xD9, 0x87, 0x20, 0xD9, 0x88, 0xD8,
+	0xB3, 0xD9, 0x84, 0xD9, 0x85, 0x06, 0xE0, 0xA7,
+	0x87, 0xE0, 0xA6, 0xBE, 0x01, 0x06, 0xE0, 0xA7,
+	0x87, 0xE0, 0xA7, 0x97, 0x01, 0x06, 0xE0, 0xAD,
+	0x87, 0xE0, 0xAC, 0xBE, 0x01, 0x06, 0xE0, 0xAD,
+	0x87, 0xE0, 0xAD, 0x96, 0x01, 0x06, 0xE0, 0xAD,
+	0x87, 0xE0, 0xAD, 0x97, 0x01, 0x06, 0xE0, 0xAE,
+	// Bytes 2e00 - 2e3f
+	0x92, 0xE0, 0xAF, 0x97, 0x01, 0x06, 0xE0, 0xAF,
+	0x86, 0xE0, 0xAE, 0xBE, 0x01, 0x06, 0xE0, 0xAF,
+	0x86, 0xE0, 0xAF, 0x97, 0x01, 0x06, 0xE0, 0xAF,
+	0x87, 0xE0, 0xAE, 0xBE, 0x01, 0x06, 0xE0, 0xB2,
+	0xBF, 0xE0, 0xB3, 0x95, 0x01, 0x06, 0xE0, 0xB3,
+	0x86, 0xE0, 0xB3, 0x95, 0x01, 0x06, 0xE0, 0xB3,
+	0x86, 0xE0, 0xB3, 0x96, 0x01, 0x06, 0xE0, 0xB5,
+	0x86, 0xE0, 0xB4, 0xBE, 0x01, 0x06, 0xE0, 0xB5,
+	// Bytes 2e40 - 2e7f
+	0x86, 0xE0, 0xB5, 0x97, 0x01, 0x06, 0xE0, 0xB5,
+	0x87, 0xE0, 0xB4, 0xBE, 0x01, 0x06, 0xE0, 0xB7,
+	0x99, 0xE0, 0xB7, 0x9F, 0x01, 0x06, 0xE1, 0x80,
+	0xA5, 0xE1, 0x80, 0xAE, 0x01, 0x06, 0xE1, 0xAC,
+	0x85, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, 0xAC,
+	0x87, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, 0xAC,
+	0x89, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, 0xAC,
+	0x8B, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, 0xAC,
+	// Bytes 2e80 - 2ebf
+	0x8D, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, 0xAC,
+	0x91, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, 0xAC,
+	0xBA, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, 0xAC,
+	0xBC, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, 0xAC,
+	0xBE, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, 0xAC,
+	0xBF, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, 0xAD,
+	0x82, 0xE1, 0xAC, 0xB5, 0x01, 0x08, 0xF0, 0x91,
+	0x84, 0xB1, 0xF0, 0x91, 0x84, 0xA7, 0x01, 0x08,
+	// Bytes 2ec0 - 2eff
+	0xF0, 0x91, 0x84, 0xB2, 0xF0, 0x91, 0x84, 0xA7,
+	0x01, 0x08, 0xF0, 0x91, 0x8D, 0x87, 0xF0, 0x91,
+	0x8C, 0xBE, 0x01, 0x08, 0xF0, 0x91, 0x8D, 0x87,
+	0xF0, 0x91, 0x8D, 0x97, 0x01, 0x08, 0xF0, 0x91,
+	0x92, 0xB9, 0xF0, 0x91, 0x92, 0xB0, 0x01, 0x08,
+	0xF0, 0x91, 0x92, 0xB9, 0xF0, 0x91, 0x92, 0xBA,
+	0x01, 0x08, 0xF0, 0x91, 0x92, 0xB9, 0xF0, 0x91,
+	0x92, 0xBD, 0x01, 0x08, 0xF0, 0x91, 0x96, 0xB8,
+	// Bytes 2f00 - 2f3f
+	0xF0, 0x91, 0x96, 0xAF, 0x01, 0x08, 0xF0, 0x91,
+	0x96, 0xB9, 0xF0, 0x91, 0x96, 0xAF, 0x01, 0x08,
+	0xF0, 0x91, 0xA4, 0xB5, 0xF0, 0x91, 0xA4, 0xB0,
+	0x01, 0x09, 0xE0, 0xB3, 0x86, 0xE0, 0xB3, 0x82,
+	0xE0, 0xB3, 0x95, 0x02, 0x09, 0xE0, 0xB7, 0x99,
+	0xE0, 0xB7, 0x8F, 0xE0, 0xB7, 0x8A, 0x16, 0x44,
+	0x44, 0x5A, 0xCC, 0x8C, 0xCD, 0x44, 0x44, 0x7A,
+	0xCC, 0x8C, 0xCD, 0x44, 0x64, 0x7A, 0xCC, 0x8C,
+	// Bytes 2f40 - 2f7f
+	0xCD, 0x46, 0xD9, 0x84, 0xD8, 0xA7, 0xD9, 0x93,
+	0xCD, 0x46, 0xD9, 0x84, 0xD8, 0xA7, 0xD9, 0x94,
+	0xCD, 0x46, 0xD9, 0x84, 0xD8, 0xA7, 0xD9, 0x95,
+	0xB9, 0x46, 0xE1, 0x84, 0x80, 0xE1, 0x85, 0xA1,
+	0x01, 0x46, 0xE1, 0x84, 0x82, 0xE1, 0x85, 0xA1,
+	0x01, 0x46, 0xE1, 0x84, 0x83, 0xE1, 0x85, 0xA1,
+	0x01, 0x46, 0xE1, 0x84, 0x85, 0xE1, 0x85, 0xA1,
+	0x01, 0x46, 0xE1, 0x84, 0x86, 0xE1, 0x85, 0xA1,
+	// Bytes 2f80 - 2fbf
+	0x01, 0x46, 0xE1, 0x84, 0x87, 0xE1, 0x85, 0xA1,
+	0x01, 0x46, 0xE1, 0x84, 0x89, 0xE1, 0x85, 0xA1,
+	0x01, 0x46, 0xE1, 0x84, 0x8B, 0xE1, 0x85, 0xA1,
+	0x01, 0x46, 0xE1, 0x84, 0x8B, 0xE1, 0x85, 0xAE,
+	0x01, 0x46, 0xE1, 0x84, 0x8C, 0xE1, 0x85, 0xA1,
+	0x01, 0x46, 0xE1, 0x84, 0x8E, 0xE1, 0x85, 0xA1,
+	0x01, 0x46, 0xE1, 0x84, 0x8F, 0xE1, 0x85, 0xA1,
+	0x01, 0x46, 0xE1, 0x84, 0x90, 0xE1, 0x85, 0xA1,
+	// Bytes 2fc0 - 2fff
+	0x01, 0x46, 0xE1, 0x84, 0x91, 0xE1, 0x85, 0xA1,
+	0x01, 0x46, 0xE1, 0x84, 0x92, 0xE1, 0x85, 0xA1,
+	0x01, 0x49, 0xE3, 0x83, 0xA1, 0xE3, 0x82, 0xAB,
+	0xE3, 0x82, 0x99, 0x11, 0x4C, 0xE1, 0x84, 0x8C,
+	0xE1, 0x85, 0xAE, 0xE1, 0x84, 0x8B, 0xE1, 0x85,
+	0xB4, 0x01, 0x4C, 0xE3, 0x82, 0xAD, 0xE3, 0x82,
+	0x99, 0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, 0x11,
+	0x4C, 0xE3, 0x82, 0xB3, 0xE3, 0x83, 0xBC, 0xE3,
+	// Bytes 3000 - 303f
+	0x83, 0x9B, 0xE3, 0x82, 0x9A, 0x11, 0x4C, 0xE3,
+	0x83, 0xA4, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x88,
+	0xE3, 0x82, 0x99, 0x11, 0x4F, 0xE1, 0x84, 0x8E,
+	0xE1, 0x85, 0xA1, 0xE1, 0x86, 0xB7, 0xE1, 0x84,
+	0x80, 0xE1, 0x85, 0xA9, 0x01, 0x4F, 0xE3, 0x82,
+	0xA4, 0xE3, 0x83, 0x8B, 0xE3, 0x83, 0xB3, 0xE3,
+	0x82, 0xAF, 0xE3, 0x82, 0x99, 0x11, 0x4F, 0xE3,
+	0x82, 0xB7, 0xE3, 0x83, 0xAA, 0xE3, 0x83, 0xB3,
+	// Bytes 3040 - 307f
+	0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, 0x11, 0x4F,
+	0xE3, 0x83, 0x98, 0xE3, 0x82, 0x9A, 0xE3, 0x83,
+	0xBC, 0xE3, 0x82, 0xB7, 0xE3, 0x82, 0x99, 0x11,
+	0x4F, 0xE3, 0x83, 0x9B, 0xE3, 0x82, 0x9A, 0xE3,
+	0x83, 0xB3, 0xE3, 0x83, 0x88, 0xE3, 0x82, 0x99,
+	0x11, 0x52, 0xE3, 0x82, 0xA8, 0xE3, 0x82, 0xB9,
+	0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xBC, 0xE3, 0x83,
+	0x88, 0xE3, 0x82, 0x99, 0x11, 0x52, 0xE3, 0x83,
+	// Bytes 3080 - 30bf
+	0x95, 0xE3, 0x82, 0xA1, 0xE3, 0x83, 0xA9, 0xE3,
+	0x83, 0x83, 0xE3, 0x83, 0x88, 0xE3, 0x82, 0x99,
+	0x11, 0x86, 0xE0, 0xB3, 0x86, 0xE0, 0xB3, 0x82,
+	0x01, 0x86, 0xE0, 0xB7, 0x99, 0xE0, 0xB7, 0x8F,
+	0x01, 0x03, 0x3C, 0xCC, 0xB8, 0x05, 0x03, 0x3D,
+	0xCC, 0xB8, 0x05, 0x03, 0x3E, 0xCC, 0xB8, 0x05,
+	0x03, 0x41, 0xCC, 0x80, 0xCD, 0x03, 0x41, 0xCC,
+	0x81, 0xCD, 0x03, 0x41, 0xCC, 0x83, 0xCD, 0x03,
+	// Bytes 30c0 - 30ff
+	0x41, 0xCC, 0x84, 0xCD, 0x03, 0x41, 0xCC, 0x89,
+	0xCD, 0x03, 0x41, 0xCC, 0x8C, 0xCD, 0x03, 0x41,
+	0xCC, 0x8F, 0xCD, 0x03, 0x41, 0xCC, 0x91, 0xCD,
+	0x03, 0x41, 0xCC, 0xA5, 0xB9, 0x03, 0x41, 0xCC,
+	0xA8, 0xA9, 0x03, 0x42, 0xCC, 0x87, 0xCD, 0x03,
+	0x42, 0xCC, 0xA3, 0xB9, 0x03, 0x42, 0xCC, 0xB1,
+	0xB9, 0x03, 0x43, 0xCC, 0x81, 0xCD, 0x03, 0x43,
+	0xCC, 0x82, 0xCD, 0x03, 0x43, 0xCC, 0x87, 0xCD,
+	// Bytes 3100 - 313f
+	0x03, 0x43, 0xCC, 0x8C, 0xCD, 0x03, 0x44, 0xCC,
+	0x87, 0xCD, 0x03, 0x44, 0xCC, 0x8C, 0xCD, 0x03,
+	0x44, 0xCC, 0xA3, 0xB9, 0x03, 0x44, 0xCC, 0xA7,
+	0xA9, 0x03, 0x44, 0xCC, 0xAD, 0xB9, 0x03, 0x44,
+	0xCC, 0xB1, 0xB9, 0x03, 0x45, 0xCC, 0x80, 0xCD,
+	0x03, 0x45, 0xCC, 0x81, 0xCD, 0x03, 0x45, 0xCC,
+	0x83, 0xCD, 0x03, 0x45, 0xCC, 0x86, 0xCD, 0x03,
+	0x45, 0xCC, 0x87, 0xCD, 0x03, 0x45, 0xCC, 0x88,
+	// Bytes 3140 - 317f
+	0xCD, 0x03, 0x45, 0xCC, 0x89, 0xCD, 0x03, 0x45,
+	0xCC, 0x8C, 0xCD, 0x03, 0x45, 0xCC, 0x8F, 0xCD,
+	0x03, 0x45, 0xCC, 0x91, 0xCD, 0x03, 0x45, 0xCC,
+	0xA8, 0xA9, 0x03, 0x45, 0xCC, 0xAD, 0xB9, 0x03,
+	0x45, 0xCC, 0xB0, 0xB9, 0x03, 0x46, 0xCC, 0x87,
+	0xCD, 0x03, 0x47, 0xCC, 0x81, 0xCD, 0x03, 0x47,
+	0xCC, 0x82, 0xCD, 0x03, 0x47, 0xCC, 0x84, 0xCD,
+	0x03, 0x47, 0xCC, 0x86, 0xCD, 0x03, 0x47, 0xCC,
+	// Bytes 3180 - 31bf
+	0x87, 0xCD, 0x03, 0x47, 0xCC, 0x8C, 0xCD, 0x03,
+	0x47, 0xCC, 0xA7, 0xA9, 0x03, 0x48, 0xCC, 0x82,
+	0xCD, 0x03, 0x48, 0xCC, 0x87, 0xCD, 0x03, 0x48,
+	0xCC, 0x88, 0xCD, 0x03, 0x48, 0xCC, 0x8C, 0xCD,
+	0x03, 0x48, 0xCC, 0xA3, 0xB9, 0x03, 0x48, 0xCC,
+	0xA7, 0xA9, 0x03, 0x48, 0xCC, 0xAE, 0xB9, 0x03,
+	0x49, 0xCC, 0x80, 0xCD, 0x03, 0x49, 0xCC, 0x81,
+	0xCD, 0x03, 0x49, 0xCC, 0x82, 0xCD, 0x03, 0x49,
+	// Bytes 31c0 - 31ff
+	0xCC, 0x83, 0xCD, 0x03, 0x49, 0xCC, 0x84, 0xCD,
+	0x03, 0x49, 0xCC, 0x86, 0xCD, 0x03, 0x49, 0xCC,
+	0x87, 0xCD, 0x03, 0x49, 0xCC, 0x89, 0xCD, 0x03,
+	0x49, 0xCC, 0x8C, 0xCD, 0x03, 0x49, 0xCC, 0x8F,
+	0xCD, 0x03, 0x49, 0xCC, 0x91, 0xCD, 0x03, 0x49,
+	0xCC, 0xA3, 0xB9, 0x03, 0x49, 0xCC, 0xA8, 0xA9,
+	0x03, 0x49, 0xCC, 0xB0, 0xB9, 0x03, 0x4A, 0xCC,
+	0x82, 0xCD, 0x03, 0x4B, 0xCC, 0x81, 0xCD, 0x03,
+	// Bytes 3200 - 323f
+	0x4B, 0xCC, 0x8C, 0xCD, 0x03, 0x4B, 0xCC, 0xA3,
+	0xB9, 0x03, 0x4B, 0xCC, 0xA7, 0xA9, 0x03, 0x4B,
+	0xCC, 0xB1, 0xB9, 0x03, 0x4C, 0xCC, 0x81, 0xCD,
+	0x03, 0x4C, 0xCC, 0x8C, 0xCD, 0x03, 0x4C, 0xCC,
+	0xA7, 0xA9, 0x03, 0x4C, 0xCC, 0xAD, 0xB9, 0x03,
+	0x4C, 0xCC, 0xB1, 0xB9, 0x03, 0x4D, 0xCC, 0x81,
+	0xCD, 0x03, 0x4D, 0xCC, 0x87, 0xCD, 0x03, 0x4D,
+	0xCC, 0xA3, 0xB9, 0x03, 0x4E, 0xCC, 0x80, 0xCD,
+	// Bytes 3240 - 327f
+	0x03, 0x4E, 0xCC, 0x81, 0xCD, 0x03, 0x4E, 0xCC,
+	0x83, 0xCD, 0x03, 0x4E, 0xCC, 0x87, 0xCD, 0x03,
+	0x4E, 0xCC, 0x8C, 0xCD, 0x03, 0x4E, 0xCC, 0xA3,
+	0xB9, 0x03, 0x4E, 0xCC, 0xA7, 0xA9, 0x03, 0x4E,
+	0xCC, 0xAD, 0xB9, 0x03, 0x4E, 0xCC, 0xB1, 0xB9,
+	0x03, 0x4F, 0xCC, 0x80, 0xCD, 0x03, 0x4F, 0xCC,
+	0x81, 0xCD, 0x03, 0x4F, 0xCC, 0x86, 0xCD, 0x03,
+	0x4F, 0xCC, 0x89, 0xCD, 0x03, 0x4F, 0xCC, 0x8B,
+	// Bytes 3280 - 32bf
+	0xCD, 0x03, 0x4F, 0xCC, 0x8C, 0xCD, 0x03, 0x4F,
+	0xCC, 0x8F, 0xCD, 0x03, 0x4F, 0xCC, 0x91, 0xCD,
+	0x03, 0x50, 0xCC, 0x81, 0xCD, 0x03, 0x50, 0xCC,
+	0x87, 0xCD, 0x03, 0x52, 0xCC, 0x81, 0xCD, 0x03,
+	0x52, 0xCC, 0x87, 0xCD, 0x03, 0x52, 0xCC, 0x8C,
+	0xCD, 0x03, 0x52, 0xCC, 0x8F, 0xCD, 0x03, 0x52,
+	0xCC, 0x91, 0xCD, 0x03, 0x52, 0xCC, 0xA7, 0xA9,
+	0x03, 0x52, 0xCC, 0xB1, 0xB9, 0x03, 0x53, 0xCC,
+	// Bytes 32c0 - 32ff
+	0x82, 0xCD, 0x03, 0x53, 0xCC, 0x87, 0xCD, 0x03,
+	0x53, 0xCC, 0xA6, 0xB9, 0x03, 0x53, 0xCC, 0xA7,
+	0xA9, 0x03, 0x54, 0xCC, 0x87, 0xCD, 0x03, 0x54,
+	0xCC, 0x8C, 0xCD, 0x03, 0x54, 0xCC, 0xA3, 0xB9,
+	0x03, 0x54, 0xCC, 0xA6, 0xB9, 0x03, 0x54, 0xCC,
+	0xA7, 0xA9, 0x03, 0x54, 0xCC, 0xAD, 0xB9, 0x03,
+	0x54, 0xCC, 0xB1, 0xB9, 0x03, 0x55, 0xCC, 0x80,
+	0xCD, 0x03, 0x55, 0xCC, 0x81, 0xCD, 0x03, 0x55,
+	// Bytes 3300 - 333f
+	0xCC, 0x82, 0xCD, 0x03, 0x55, 0xCC, 0x86, 0xCD,
+	0x03, 0x55, 0xCC, 0x89, 0xCD, 0x03, 0x55, 0xCC,
+	0x8A, 0xCD, 0x03, 0x55, 0xCC, 0x8B, 0xCD, 0x03,
+	0x55, 0xCC, 0x8C, 0xCD, 0x03, 0x55, 0xCC, 0x8F,
+	0xCD, 0x03, 0x55, 0xCC, 0x91, 0xCD, 0x03, 0x55,
+	0xCC, 0xA3, 0xB9, 0x03, 0x55, 0xCC, 0xA4, 0xB9,
+	0x03, 0x55, 0xCC, 0xA8, 0xA9, 0x03, 0x55, 0xCC,
+	0xAD, 0xB9, 0x03, 0x55, 0xCC, 0xB0, 0xB9, 0x03,
+	// Bytes 3340 - 337f
+	0x56, 0xCC, 0x83, 0xCD, 0x03, 0x56, 0xCC, 0xA3,
+	0xB9, 0x03, 0x57, 0xCC, 0x80, 0xCD, 0x03, 0x57,
+	0xCC, 0x81, 0xCD, 0x03, 0x57, 0xCC, 0x82, 0xCD,
+	0x03, 0x57, 0xCC, 0x87, 0xCD, 0x03, 0x57, 0xCC,
+	0x88, 0xCD, 0x03, 0x57, 0xCC, 0xA3, 0xB9, 0x03,
+	0x58, 0xCC, 0x87, 0xCD, 0x03, 0x58, 0xCC, 0x88,
+	0xCD, 0x03, 0x59, 0xCC, 0x80, 0xCD, 0x03, 0x59,
+	0xCC, 0x81, 0xCD, 0x03, 0x59, 0xCC, 0x82, 0xCD,
+	// Bytes 3380 - 33bf
+	0x03, 0x59, 0xCC, 0x83, 0xCD, 0x03, 0x59, 0xCC,
+	0x84, 0xCD, 0x03, 0x59, 0xCC, 0x87, 0xCD, 0x03,
+	0x59, 0xCC, 0x88, 0xCD, 0x03, 0x59, 0xCC, 0x89,
+	0xCD, 0x03, 0x59, 0xCC, 0xA3, 0xB9, 0x03, 0x5A,
+	0xCC, 0x81, 0xCD, 0x03, 0x5A, 0xCC, 0x82, 0xCD,
+	0x03, 0x5A, 0xCC, 0x87, 0xCD, 0x03, 0x5A, 0xCC,
+	0x8C, 0xCD, 0x03, 0x5A, 0xCC, 0xA3, 0xB9, 0x03,
+	0x5A, 0xCC, 0xB1, 0xB9, 0x03, 0x61, 0xCC, 0x80,
+	// Bytes 33c0 - 33ff
+	0xCD, 0x03, 0x61, 0xCC, 0x81, 0xCD, 0x03, 0x61,
+	0xCC, 0x83, 0xCD, 0x03, 0x61, 0xCC, 0x84, 0xCD,
+	0x03, 0x61, 0xCC, 0x89, 0xCD, 0x03, 0x61, 0xCC,
+	0x8C, 0xCD, 0x03, 0x61, 0xCC, 0x8F, 0xCD, 0x03,
+	0x61, 0xCC, 0x91, 0xCD, 0x03, 0x61, 0xCC, 0xA5,
+	0xB9, 0x03, 0x61, 0xCC, 0xA8, 0xA9, 0x03, 0x62,
+	0xCC, 0x87, 0xCD, 0x03, 0x62, 0xCC, 0xA3, 0xB9,
+	0x03, 0x62, 0xCC, 0xB1, 0xB9, 0x03, 0x63, 0xCC,
+	// Bytes 3400 - 343f
+	0x81, 0xCD, 0x03, 0x63, 0xCC, 0x82, 0xCD, 0x03,
+	0x63, 0xCC, 0x87, 0xCD, 0x03, 0x63, 0xCC, 0x8C,
+	0xCD, 0x03, 0x64, 0xCC, 0x87, 0xCD, 0x03, 0x64,
+	0xCC, 0x8C, 0xCD, 0x03, 0x64, 0xCC, 0xA3, 0xB9,
+	0x03, 0x64, 0xCC, 0xA7, 0xA9, 0x03, 0x64, 0xCC,
+	0xAD, 0xB9, 0x03, 0x64, 0xCC, 0xB1, 0xB9, 0x03,
+	0x65, 0xCC, 0x80, 0xCD, 0x03, 0x65, 0xCC, 0x81,
+	0xCD, 0x03, 0x65, 0xCC, 0x83, 0xCD, 0x03, 0x65,
+	// Bytes 3440 - 347f
+	0xCC, 0x86, 0xCD, 0x03, 0x65, 0xCC, 0x87, 0xCD,
+	0x03, 0x65, 0xCC, 0x88, 0xCD, 0x03, 0x65, 0xCC,
+	0x89, 0xCD, 0x03, 0x65, 0xCC, 0x8C, 0xCD, 0x03,
+	0x65, 0xCC, 0x8F, 0xCD, 0x03, 0x65, 0xCC, 0x91,
+	0xCD, 0x03, 0x65, 0xCC, 0xA8, 0xA9, 0x03, 0x65,
+	0xCC, 0xAD, 0xB9, 0x03, 0x65, 0xCC, 0xB0, 0xB9,
+	0x03, 0x66, 0xCC, 0x87, 0xCD, 0x03, 0x67, 0xCC,
+	0x81, 0xCD, 0x03, 0x67, 0xCC, 0x82, 0xCD, 0x03,
+	// Bytes 3480 - 34bf
+	0x67, 0xCC, 0x84, 0xCD, 0x03, 0x67, 0xCC, 0x86,
+	0xCD, 0x03, 0x67, 0xCC, 0x87, 0xCD, 0x03, 0x67,
+	0xCC, 0x8C, 0xCD, 0x03, 0x67, 0xCC, 0xA7, 0xA9,
+	0x03, 0x68, 0xCC, 0x82, 0xCD, 0x03, 0x68, 0xCC,
+	0x87, 0xCD, 0x03, 0x68, 0xCC, 0x88, 0xCD, 0x03,
+	0x68, 0xCC, 0x8C, 0xCD, 0x03, 0x68, 0xCC, 0xA3,
+	0xB9, 0x03, 0x68, 0xCC, 0xA7, 0xA9, 0x03, 0x68,
+	0xCC, 0xAE, 0xB9, 0x03, 0x68, 0xCC, 0xB1, 0xB9,
+	// Bytes 34c0 - 34ff
+	0x03, 0x69, 0xCC, 0x80, 0xCD, 0x03, 0x69, 0xCC,
+	0x81, 0xCD, 0x03, 0x69, 0xCC, 0x82, 0xCD, 0x03,
+	0x69, 0xCC, 0x83, 0xCD, 0x03, 0x69, 0xCC, 0x84,
+	0xCD, 0x03, 0x69, 0xCC, 0x86, 0xCD, 0x03, 0x69,
+	0xCC, 0x89, 0xCD, 0x03, 0x69, 0xCC, 0x8C, 0xCD,
+	0x03, 0x69, 0xCC, 0x8F, 0xCD, 0x03, 0x69, 0xCC,
+	0x91, 0xCD, 0x03, 0x69, 0xCC, 0xA3, 0xB9, 0x03,
+	0x69, 0xCC, 0xA8, 0xA9, 0x03, 0x69, 0xCC, 0xB0,
+	// Bytes 3500 - 353f
+	0xB9, 0x03, 0x6A, 0xCC, 0x82, 0xCD, 0x03, 0x6A,
+	0xCC, 0x8C, 0xCD, 0x03, 0x6B, 0xCC, 0x81, 0xCD,
+	0x03, 0x6B, 0xCC, 0x8C, 0xCD, 0x03, 0x6B, 0xCC,
+	0xA3, 0xB9, 0x03, 0x6B, 0xCC, 0xA7, 0xA9, 0x03,
+	0x6B, 0xCC, 0xB1, 0xB9, 0x03, 0x6C, 0xCC, 0x81,
+	0xCD, 0x03, 0x6C, 0xCC, 0x8C, 0xCD, 0x03, 0x6C,
+	0xCC, 0xA7, 0xA9, 0x03, 0x6C, 0xCC, 0xAD, 0xB9,
+	0x03, 0x6C, 0xCC, 0xB1, 0xB9, 0x03, 0x6D, 0xCC,
+	// Bytes 3540 - 357f
+	0x81, 0xCD, 0x03, 0x6D, 0xCC, 0x87, 0xCD, 0x03,
+	0x6D, 0xCC, 0xA3, 0xB9, 0x03, 0x6E, 0xCC, 0x80,
+	0xCD, 0x03, 0x6E, 0xCC, 0x81, 0xCD, 0x03, 0x6E,
+	0xCC, 0x83, 0xCD, 0x03, 0x6E, 0xCC, 0x87, 0xCD,
+	0x03, 0x6E, 0xCC, 0x8C, 0xCD, 0x03, 0x6E, 0xCC,
+	0xA3, 0xB9, 0x03, 0x6E, 0xCC, 0xA7, 0xA9, 0x03,
+	0x6E, 0xCC, 0xAD, 0xB9, 0x03, 0x6E, 0xCC, 0xB1,
+	0xB9, 0x03, 0x6F, 0xCC, 0x80, 0xCD, 0x03, 0x6F,
+	// Bytes 3580 - 35bf
+	0xCC, 0x81, 0xCD, 0x03, 0x6F, 0xCC, 0x86, 0xCD,
+	0x03, 0x6F, 0xCC, 0x89, 0xCD, 0x03, 0x6F, 0xCC,
+	0x8B, 0xCD, 0x03, 0x6F, 0xCC, 0x8C, 0xCD, 0x03,
+	0x6F, 0xCC, 0x8F, 0xCD, 0x03, 0x6F, 0xCC, 0x91,
+	0xCD, 0x03, 0x70, 0xCC, 0x81, 0xCD, 0x03, 0x70,
+	0xCC, 0x87, 0xCD, 0x03, 0x72, 0xCC, 0x81, 0xCD,
+	0x03, 0x72, 0xCC, 0x87, 0xCD, 0x03, 0x72, 0xCC,
+	0x8C, 0xCD, 0x03, 0x72, 0xCC, 0x8F, 0xCD, 0x03,
+	// Bytes 35c0 - 35ff
+	0x72, 0xCC, 0x91, 0xCD, 0x03, 0x72, 0xCC, 0xA7,
+	0xA9, 0x03, 0x72, 0xCC, 0xB1, 0xB9, 0x03, 0x73,
+	0xCC, 0x82, 0xCD, 0x03, 0x73, 0xCC, 0x87, 0xCD,
+	0x03, 0x73, 0xCC, 0xA6, 0xB9, 0x03, 0x73, 0xCC,
+	0xA7, 0xA9, 0x03, 0x74, 0xCC, 0x87, 0xCD, 0x03,
+	0x74, 0xCC, 0x88, 0xCD, 0x03, 0x74, 0xCC, 0x8C,
+	0xCD, 0x03, 0x74, 0xCC, 0xA3, 0xB9, 0x03, 0x74,
+	0xCC, 0xA6, 0xB9, 0x03, 0x74, 0xCC, 0xA7, 0xA9,
+	// Bytes 3600 - 363f
+	0x03, 0x74, 0xCC, 0xAD, 0xB9, 0x03, 0x74, 0xCC,
+	0xB1, 0xB9, 0x03, 0x75, 0xCC, 0x80, 0xCD, 0x03,
+	0x75, 0xCC, 0x81, 0xCD, 0x03, 0x75, 0xCC, 0x82,
+	0xCD, 0x03, 0x75, 0xCC, 0x86, 0xCD, 0x03, 0x75,
+	0xCC, 0x89, 0xCD, 0x03, 0x75, 0xCC, 0x8A, 0xCD,
+	0x03, 0x75, 0xCC, 0x8B, 0xCD, 0x03, 0x75, 0xCC,
+	0x8C, 0xCD, 0x03, 0x75, 0xCC, 0x8F, 0xCD, 0x03,
+	0x75, 0xCC, 0x91, 0xCD, 0x03, 0x75, 0xCC, 0xA3,
+	// Bytes 3640 - 367f
+	0xB9, 0x03, 0x75, 0xCC, 0xA4, 0xB9, 0x03, 0x75,
+	0xCC, 0xA8, 0xA9, 0x03, 0x75, 0xCC, 0xAD, 0xB9,
+	0x03, 0x75, 0xCC, 0xB0, 0xB9, 0x03, 0x76, 0xCC,
+	0x83, 0xCD, 0x03, 0x76, 0xCC, 0xA3, 0xB9, 0x03,
+	0x77, 0xCC, 0x80, 0xCD, 0x03, 0x77, 0xCC, 0x81,
+	0xCD, 0x03, 0x77, 0xCC, 0x82, 0xCD, 0x03, 0x77,
+	0xCC, 0x87, 0xCD, 0x03, 0x77, 0xCC, 0x88, 0xCD,
+	0x03, 0x77, 0xCC, 0x8A, 0xCD, 0x03, 0x77, 0xCC,
+	// Bytes 3680 - 36bf
+	0xA3, 0xB9, 0x03, 0x78, 0xCC, 0x87, 0xCD, 0x03,
+	0x78, 0xCC, 0x88, 0xCD, 0x03, 0x79, 0xCC, 0x80,
+	0xCD, 0x03, 0x79, 0xCC, 0x81, 0xCD, 0x03, 0x79,
+	0xCC, 0x82, 0xCD, 0x03, 0x79, 0xCC, 0x83, 0xCD,
+	0x03, 0x79, 0xCC, 0x84, 0xCD, 0x03, 0x79, 0xCC,
+	0x87, 0xCD, 0x03, 0x79, 0xCC, 0x88, 0xCD, 0x03,
+	0x79, 0xCC, 0x89, 0xCD, 0x03, 0x79, 0xCC, 0x8A,
+	0xCD, 0x03, 0x79, 0xCC, 0xA3, 0xB9, 0x03, 0x7A,
+	// Bytes 36c0 - 36ff
+	0xCC, 0x81, 0xCD, 0x03, 0x7A, 0xCC, 0x82, 0xCD,
+	0x03, 0x7A, 0xCC, 0x87, 0xCD, 0x03, 0x7A, 0xCC,
+	0x8C, 0xCD, 0x03, 0x7A, 0xCC, 0xA3, 0xB9, 0x03,
+	0x7A, 0xCC, 0xB1, 0xB9, 0x04, 0xC2, 0xA8, 0xCC,
+	0x80, 0xCE, 0x04, 0xC2, 0xA8, 0xCC, 0x81, 0xCE,
+	0x04, 0xC2, 0xA8, 0xCD, 0x82, 0xCE, 0x04, 0xC3,
+	0x86, 0xCC, 0x81, 0xCD, 0x04, 0xC3, 0x86, 0xCC,
+	0x84, 0xCD, 0x04, 0xC3, 0x98, 0xCC, 0x81, 0xCD,
+	// Bytes 3700 - 373f
+	0x04, 0xC3, 0xA6, 0xCC, 0x81, 0xCD, 0x04, 0xC3,
+	0xA6, 0xCC, 0x84, 0xCD, 0x04, 0xC3, 0xB8, 0xCC,
+	0x81, 0xCD, 0x04, 0xC5, 0xBF, 0xCC, 0x87, 0xCD,
+	0x04, 0xC6, 0xB7, 0xCC, 0x8C, 0xCD, 0x04, 0xCA,
+	0x92, 0xCC, 0x8C, 0xCD, 0x04, 0xCE, 0x91, 0xCC,
+	0x80, 0xCD, 0x04, 0xCE, 0x91, 0xCC, 0x81, 0xCD,
+	0x04, 0xCE, 0x91, 0xCC, 0x84, 0xCD, 0x04, 0xCE,
+	0x91, 0xCC, 0x86, 0xCD, 0x04, 0xCE, 0x91, 0xCD,
+	// Bytes 3740 - 377f
+	0x85, 0xDD, 0x04, 0xCE, 0x95, 0xCC, 0x80, 0xCD,
+	0x04, 0xCE, 0x95, 0xCC, 0x81, 0xCD, 0x04, 0xCE,
+	0x97, 0xCC, 0x80, 0xCD, 0x04, 0xCE, 0x97, 0xCC,
+	0x81, 0xCD, 0x04, 0xCE, 0x97, 0xCD, 0x85, 0xDD,
+	0x04, 0xCE, 0x99, 0xCC, 0x80, 0xCD, 0x04, 0xCE,
+	0x99, 0xCC, 0x81, 0xCD, 0x04, 0xCE, 0x99, 0xCC,
+	0x84, 0xCD, 0x04, 0xCE, 0x99, 0xCC, 0x86, 0xCD,
+	0x04, 0xCE, 0x99, 0xCC, 0x88, 0xCD, 0x04, 0xCE,
+	// Bytes 3780 - 37bf
+	0x9F, 0xCC, 0x80, 0xCD, 0x04, 0xCE, 0x9F, 0xCC,
+	0x81, 0xCD, 0x04, 0xCE, 0xA1, 0xCC, 0x94, 0xCD,
+	0x04, 0xCE, 0xA5, 0xCC, 0x80, 0xCD, 0x04, 0xCE,
+	0xA5, 0xCC, 0x81, 0xCD, 0x04, 0xCE, 0xA5, 0xCC,
+	0x84, 0xCD, 0x04, 0xCE, 0xA5, 0xCC, 0x86, 0xCD,
+	0x04, 0xCE, 0xA5, 0xCC, 0x88, 0xCD, 0x04, 0xCE,
+	0xA9, 0xCC, 0x80, 0xCD, 0x04, 0xCE, 0xA9, 0xCC,
+	0x81, 0xCD, 0x04, 0xCE, 0xA9, 0xCD, 0x85, 0xDD,
+	// Bytes 37c0 - 37ff
+	0x04, 0xCE, 0xB1, 0xCC, 0x84, 0xCD, 0x04, 0xCE,
+	0xB1, 0xCC, 0x86, 0xCD, 0x04, 0xCE, 0xB1, 0xCD,
+	0x85, 0xDD, 0x04, 0xCE, 0xB5, 0xCC, 0x80, 0xCD,
+	0x04, 0xCE, 0xB5, 0xCC, 0x81, 0xCD, 0x04, 0xCE,
+	0xB7, 0xCD, 0x85, 0xDD, 0x04, 0xCE, 0xB9, 0xCC,
+	0x80, 0xCD, 0x04, 0xCE, 0xB9, 0xCC, 0x81, 0xCD,
+	0x04, 0xCE, 0xB9, 0xCC, 0x84, 0xCD, 0x04, 0xCE,
+	0xB9, 0xCC, 0x86, 0xCD, 0x04, 0xCE, 0xB9, 0xCD,
+	// Bytes 3800 - 383f
+	0x82, 0xCD, 0x04, 0xCE, 0xBF, 0xCC, 0x80, 0xCD,
+	0x04, 0xCE, 0xBF, 0xCC, 0x81, 0xCD, 0x04, 0xCF,
+	0x81, 0xCC, 0x93, 0xCD, 0x04, 0xCF, 0x81, 0xCC,
+	0x94, 0xCD, 0x04, 0xCF, 0x85, 0xCC, 0x80, 0xCD,
+	0x04, 0xCF, 0x85, 0xCC, 0x81, 0xCD, 0x04, 0xCF,
+	0x85, 0xCC, 0x84, 0xCD, 0x04, 0xCF, 0x85, 0xCC,
+	0x86, 0xCD, 0x04, 0xCF, 0x85, 0xCD, 0x82, 0xCD,
+	0x04, 0xCF, 0x89, 0xCD, 0x85, 0xDD, 0x04, 0xCF,
+	// Bytes 3840 - 387f
+	0x92, 0xCC, 0x81, 0xCD, 0x04, 0xCF, 0x92, 0xCC,
+	0x88, 0xCD, 0x04, 0xD0, 0x86, 0xCC, 0x88, 0xCD,
+	0x04, 0xD0, 0x90, 0xCC, 0x86, 0xCD, 0x04, 0xD0,
+	0x90, 0xCC, 0x88, 0xCD, 0x04, 0xD0, 0x93, 0xCC,
+	0x81, 0xCD, 0x04, 0xD0, 0x95, 0xCC, 0x80, 0xCD,
+	0x04, 0xD0, 0x95, 0xCC, 0x86, 0xCD, 0x04, 0xD0,
+	0x95, 0xCC, 0x88, 0xCD, 0x04, 0xD0, 0x96, 0xCC,
+	0x86, 0xCD, 0x04, 0xD0, 0x96, 0xCC, 0x88, 0xCD,
+	// Bytes 3880 - 38bf
+	0x04, 0xD0, 0x97, 0xCC, 0x88, 0xCD, 0x04, 0xD0,
+	0x98, 0xCC, 0x80, 0xCD, 0x04, 0xD0, 0x98, 0xCC,
+	0x84, 0xCD, 0x04, 0xD0, 0x98, 0xCC, 0x86, 0xCD,
+	0x04, 0xD0, 0x98, 0xCC, 0x88, 0xCD, 0x04, 0xD0,
+	0x9A, 0xCC, 0x81, 0xCD, 0x04, 0xD0, 0x9E, 0xCC,
+	0x88, 0xCD, 0x04, 0xD0, 0xA3, 0xCC, 0x84, 0xCD,
+	0x04, 0xD0, 0xA3, 0xCC, 0x86, 0xCD, 0x04, 0xD0,
+	0xA3, 0xCC, 0x88, 0xCD, 0x04, 0xD0, 0xA3, 0xCC,
+	// Bytes 38c0 - 38ff
+	0x8B, 0xCD, 0x04, 0xD0, 0xA7, 0xCC, 0x88, 0xCD,
+	0x04, 0xD0, 0xAB, 0xCC, 0x88, 0xCD, 0x04, 0xD0,
+	0xAD, 0xCC, 0x88, 0xCD, 0x04, 0xD0, 0xB0, 0xCC,
+	0x86, 0xCD, 0x04, 0xD0, 0xB0, 0xCC, 0x88, 0xCD,
+	0x04, 0xD0, 0xB3, 0xCC, 0x81, 0xCD, 0x04, 0xD0,
+	0xB5, 0xCC, 0x80, 0xCD, 0x04, 0xD0, 0xB5, 0xCC,
+	0x86, 0xCD, 0x04, 0xD0, 0xB5, 0xCC, 0x88, 0xCD,
+	0x04, 0xD0, 0xB6, 0xCC, 0x86, 0xCD, 0x04, 0xD0,
+	// Bytes 3900 - 393f
+	0xB6, 0xCC, 0x88, 0xCD, 0x04, 0xD0, 0xB7, 0xCC,
+	0x88, 0xCD, 0x04, 0xD0, 0xB8, 0xCC, 0x80, 0xCD,
+	0x04, 0xD0, 0xB8, 0xCC, 0x84, 0xCD, 0x04, 0xD0,
+	0xB8, 0xCC, 0x86, 0xCD, 0x04, 0xD0, 0xB8, 0xCC,
+	0x88, 0xCD, 0x04, 0xD0, 0xBA, 0xCC, 0x81, 0xCD,
+	0x04, 0xD0, 0xBE, 0xCC, 0x88, 0xCD, 0x04, 0xD1,
+	0x83, 0xCC, 0x84, 0xCD, 0x04, 0xD1, 0x83, 0xCC,
+	0x86, 0xCD, 0x04, 0xD1, 0x83, 0xCC, 0x88, 0xCD,
+	// Bytes 3940 - 397f
+	0x04, 0xD1, 0x83, 0xCC, 0x8B, 0xCD, 0x04, 0xD1,
+	0x87, 0xCC, 0x88, 0xCD, 0x04, 0xD1, 0x8B, 0xCC,
+	0x88, 0xCD, 0x04, 0xD1, 0x8D, 0xCC, 0x88, 0xCD,
+	0x04, 0xD1, 0x96, 0xCC, 0x88, 0xCD, 0x04, 0xD1,
+	0xB4, 0xCC, 0x8F, 0xCD, 0x04, 0xD1, 0xB5, 0xCC,
+	0x8F, 0xCD, 0x04, 0xD3, 0x98, 0xCC, 0x88, 0xCD,
+	0x04, 0xD3, 0x99, 0xCC, 0x88, 0xCD, 0x04, 0xD3,
+	0xA8, 0xCC, 0x88, 0xCD, 0x04, 0xD3, 0xA9, 0xCC,
+	// Bytes 3980 - 39bf
+	0x88, 0xCD, 0x04, 0xD8, 0xA7, 0xD9, 0x93, 0xCD,
+	0x04, 0xD8, 0xA7, 0xD9, 0x94, 0xCD, 0x04, 0xD8,
+	0xA7, 0xD9, 0x95, 0xB9, 0x04, 0xD9, 0x88, 0xD9,
+	0x94, 0xCD, 0x04, 0xD9, 0x8A, 0xD9, 0x94, 0xCD,
+	0x04, 0xDB, 0x81, 0xD9, 0x94, 0xCD, 0x04, 0xDB,
+	0x92, 0xD9, 0x94, 0xCD, 0x04, 0xDB, 0x95, 0xD9,
+	0x94, 0xCD, 0x05, 0x41, 0xCC, 0x82, 0xCC, 0x80,
+	0xCE, 0x05, 0x41, 0xCC, 0x82, 0xCC, 0x81, 0xCE,
+	// Bytes 39c0 - 39ff
+	0x05, 0x41, 0xCC, 0x82, 0xCC, 0x83, 0xCE, 0x05,
+	0x41, 0xCC, 0x82, 0xCC, 0x89, 0xCE, 0x05, 0x41,
+	0xCC, 0x86, 0xCC, 0x80, 0xCE, 0x05, 0x41, 0xCC,
+	0x86, 0xCC, 0x81, 0xCE, 0x05, 0x41, 0xCC, 0x86,
+	0xCC, 0x83, 0xCE, 0x05, 0x41, 0xCC, 0x86, 0xCC,
+	0x89, 0xCE, 0x05, 0x41, 0xCC, 0x87, 0xCC, 0x84,
+	0xCE, 0x05, 0x41, 0xCC, 0x88, 0xCC, 0x84, 0xCE,
+	0x05, 0x41, 0xCC, 0x8A, 0xCC, 0x81, 0xCE, 0x05,
+	// Bytes 3a00 - 3a3f
+	0x41, 0xCC, 0xA3, 0xCC, 0x82, 0xCE, 0x05, 0x41,
+	0xCC, 0xA3, 0xCC, 0x86, 0xCE, 0x05, 0x43, 0xCC,
+	0xA7, 0xCC, 0x81, 0xCE, 0x05, 0x45, 0xCC, 0x82,
+	0xCC, 0x80, 0xCE, 0x05, 0x45, 0xCC, 0x82, 0xCC,
+	0x81, 0xCE, 0x05, 0x45, 0xCC, 0x82, 0xCC, 0x83,
+	0xCE, 0x05, 0x45, 0xCC, 0x82, 0xCC, 0x89, 0xCE,
+	0x05, 0x45, 0xCC, 0x84, 0xCC, 0x80, 0xCE, 0x05,
+	0x45, 0xCC, 0x84, 0xCC, 0x81, 0xCE, 0x05, 0x45,
+	// Bytes 3a40 - 3a7f
+	0xCC, 0xA3, 0xCC, 0x82, 0xCE, 0x05, 0x45, 0xCC,
+	0xA7, 0xCC, 0x86, 0xCE, 0x05, 0x49, 0xCC, 0x88,
+	0xCC, 0x81, 0xCE, 0x05, 0x4C, 0xCC, 0xA3, 0xCC,
+	0x84, 0xCE, 0x05, 0x4F, 0xCC, 0x82, 0xCC, 0x80,
+	0xCE, 0x05, 0x4F, 0xCC, 0x82, 0xCC, 0x81, 0xCE,
+	0x05, 0x4F, 0xCC, 0x82, 0xCC, 0x83, 0xCE, 0x05,
+	0x4F, 0xCC, 0x82, 0xCC, 0x89, 0xCE, 0x05, 0x4F,
+	0xCC, 0x83, 0xCC, 0x81, 0xCE, 0x05, 0x4F, 0xCC,
+	// Bytes 3a80 - 3abf
+	0x83, 0xCC, 0x84, 0xCE, 0x05, 0x4F, 0xCC, 0x83,
+	0xCC, 0x88, 0xCE, 0x05, 0x4F, 0xCC, 0x84, 0xCC,
+	0x80, 0xCE, 0x05, 0x4F, 0xCC, 0x84, 0xCC, 0x81,
+	0xCE, 0x05, 0x4F, 0xCC, 0x87, 0xCC, 0x84, 0xCE,
+	0x05, 0x4F, 0xCC, 0x88, 0xCC, 0x84, 0xCE, 0x05,
+	0x4F, 0xCC, 0x9B, 0xCC, 0x80, 0xCE, 0x05, 0x4F,
+	0xCC, 0x9B, 0xCC, 0x81, 0xCE, 0x05, 0x4F, 0xCC,
+	0x9B, 0xCC, 0x83, 0xCE, 0x05, 0x4F, 0xCC, 0x9B,
+	// Bytes 3ac0 - 3aff
+	0xCC, 0x89, 0xCE, 0x05, 0x4F, 0xCC, 0x9B, 0xCC,
+	0xA3, 0xBA, 0x05, 0x4F, 0xCC, 0xA3, 0xCC, 0x82,
+	0xCE, 0x05, 0x4F, 0xCC, 0xA8, 0xCC, 0x84, 0xCE,
+	0x05, 0x52, 0xCC, 0xA3, 0xCC, 0x84, 0xCE, 0x05,
+	0x53, 0xCC, 0x81, 0xCC, 0x87, 0xCE, 0x05, 0x53,
+	0xCC, 0x8C, 0xCC, 0x87, 0xCE, 0x05, 0x53, 0xCC,
+	0xA3, 0xCC, 0x87, 0xCE, 0x05, 0x55, 0xCC, 0x83,
+	0xCC, 0x81, 0xCE, 0x05, 0x55, 0xCC, 0x84, 0xCC,
+	// Bytes 3b00 - 3b3f
+	0x88, 0xCE, 0x05, 0x55, 0xCC, 0x88, 0xCC, 0x80,
+	0xCE, 0x05, 0x55, 0xCC, 0x88, 0xCC, 0x81, 0xCE,
+	0x05, 0x55, 0xCC, 0x88, 0xCC, 0x84, 0xCE, 0x05,
+	0x55, 0xCC, 0x88, 0xCC, 0x8C, 0xCE, 0x05, 0x55,
+	0xCC, 0x9B, 0xCC, 0x80, 0xCE, 0x05, 0x55, 0xCC,
+	0x9B, 0xCC, 0x81, 0xCE, 0x05, 0x55, 0xCC, 0x9B,
+	0xCC, 0x83, 0xCE, 0x05, 0x55, 0xCC, 0x9B, 0xCC,
+	0x89, 0xCE, 0x05, 0x55, 0xCC, 0x9B, 0xCC, 0xA3,
+	// Bytes 3b40 - 3b7f
+	0xBA, 0x05, 0x61, 0xCC, 0x82, 0xCC, 0x80, 0xCE,
+	0x05, 0x61, 0xCC, 0x82, 0xCC, 0x81, 0xCE, 0x05,
+	0x61, 0xCC, 0x82, 0xCC, 0x83, 0xCE, 0x05, 0x61,
+	0xCC, 0x82, 0xCC, 0x89, 0xCE, 0x05, 0x61, 0xCC,
+	0x86, 0xCC, 0x80, 0xCE, 0x05, 0x61, 0xCC, 0x86,
+	0xCC, 0x81, 0xCE, 0x05, 0x61, 0xCC, 0x86, 0xCC,
+	0x83, 0xCE, 0x05, 0x61, 0xCC, 0x86, 0xCC, 0x89,
+	0xCE, 0x05, 0x61, 0xCC, 0x87, 0xCC, 0x84, 0xCE,
+	// Bytes 3b80 - 3bbf
+	0x05, 0x61, 0xCC, 0x88, 0xCC, 0x84, 0xCE, 0x05,
+	0x61, 0xCC, 0x8A, 0xCC, 0x81, 0xCE, 0x05, 0x61,
+	0xCC, 0xA3, 0xCC, 0x82, 0xCE, 0x05, 0x61, 0xCC,
+	0xA3, 0xCC, 0x86, 0xCE, 0x05, 0x63, 0xCC, 0xA7,
+	0xCC, 0x81, 0xCE, 0x05, 0x65, 0xCC, 0x82, 0xCC,
+	0x80, 0xCE, 0x05, 0x65, 0xCC, 0x82, 0xCC, 0x81,
+	0xCE, 0x05, 0x65, 0xCC, 0x82, 0xCC, 0x83, 0xCE,
+	0x05, 0x65, 0xCC, 0x82, 0xCC, 0x89, 0xCE, 0x05,
+	// Bytes 3bc0 - 3bff
+	0x65, 0xCC, 0x84, 0xCC, 0x80, 0xCE, 0x05, 0x65,
+	0xCC, 0x84, 0xCC, 0x81, 0xCE, 0x05, 0x65, 0xCC,
+	0xA3, 0xCC, 0x82, 0xCE, 0x05, 0x65, 0xCC, 0xA7,
+	0xCC, 0x86, 0xCE, 0x05, 0x69, 0xCC, 0x88, 0xCC,
+	0x81, 0xCE, 0x05, 0x6C, 0xCC, 0xA3, 0xCC, 0x84,
+	0xCE, 0x05, 0x6F, 0xCC, 0x82, 0xCC, 0x80, 0xCE,
+	0x05, 0x6F, 0xCC, 0x82, 0xCC, 0x81, 0xCE, 0x05,
+	0x6F, 0xCC, 0x82, 0xCC, 0x83, 0xCE, 0x05, 0x6F,
+	// Bytes 3c00 - 3c3f
+	0xCC, 0x82, 0xCC, 0x89, 0xCE, 0x05, 0x6F, 0xCC,
+	0x83, 0xCC, 0x81, 0xCE, 0x05, 0x6F, 0xCC, 0x83,
+	0xCC, 0x84, 0xCE, 0x05, 0x6F, 0xCC, 0x83, 0xCC,
+	0x88, 0xCE, 0x05, 0x6F, 0xCC, 0x84, 0xCC, 0x80,
+	0xCE, 0x05, 0x6F, 0xCC, 0x84, 0xCC, 0x81, 0xCE,
+	0x05, 0x6F, 0xCC, 0x87, 0xCC, 0x84, 0xCE, 0x05,
+	0x6F, 0xCC, 0x88, 0xCC, 0x84, 0xCE, 0x05, 0x6F,
+	0xCC, 0x9B, 0xCC, 0x80, 0xCE, 0x05, 0x6F, 0xCC,
+	// Bytes 3c40 - 3c7f
+	0x9B, 0xCC, 0x81, 0xCE, 0x05, 0x6F, 0xCC, 0x9B,
+	0xCC, 0x83, 0xCE, 0x05, 0x6F, 0xCC, 0x9B, 0xCC,
+	0x89, 0xCE, 0x05, 0x6F, 0xCC, 0x9B, 0xCC, 0xA3,
+	0xBA, 0x05, 0x6F, 0xCC, 0xA3, 0xCC, 0x82, 0xCE,
+	0x05, 0x6F, 0xCC, 0xA8, 0xCC, 0x84, 0xCE, 0x05,
+	0x72, 0xCC, 0xA3, 0xCC, 0x84, 0xCE, 0x05, 0x73,
+	0xCC, 0x81, 0xCC, 0x87, 0xCE, 0x05, 0x73, 0xCC,
+	0x8C, 0xCC, 0x87, 0xCE, 0x05, 0x73, 0xCC, 0xA3,
+	// Bytes 3c80 - 3cbf
+	0xCC, 0x87, 0xCE, 0x05, 0x75, 0xCC, 0x83, 0xCC,
+	0x81, 0xCE, 0x05, 0x75, 0xCC, 0x84, 0xCC, 0x88,
+	0xCE, 0x05, 0x75, 0xCC, 0x88, 0xCC, 0x80, 0xCE,
+	0x05, 0x75, 0xCC, 0x88, 0xCC, 0x81, 0xCE, 0x05,
+	0x75, 0xCC, 0x88, 0xCC, 0x84, 0xCE, 0x05, 0x75,
+	0xCC, 0x88, 0xCC, 0x8C, 0xCE, 0x05, 0x75, 0xCC,
+	0x9B, 0xCC, 0x80, 0xCE, 0x05, 0x75, 0xCC, 0x9B,
+	0xCC, 0x81, 0xCE, 0x05, 0x75, 0xCC, 0x9B, 0xCC,
+	// Bytes 3cc0 - 3cff
+	0x83, 0xCE, 0x05, 0x75, 0xCC, 0x9B, 0xCC, 0x89,
+	0xCE, 0x05, 0x75, 0xCC, 0x9B, 0xCC, 0xA3, 0xBA,
+	0x05, 0xE1, 0xBE, 0xBF, 0xCC, 0x80, 0xCE, 0x05,
+	0xE1, 0xBE, 0xBF, 0xCC, 0x81, 0xCE, 0x05, 0xE1,
+	0xBE, 0xBF, 0xCD, 0x82, 0xCE, 0x05, 0xE1, 0xBF,
+	0xBE, 0xCC, 0x80, 0xCE, 0x05, 0xE1, 0xBF, 0xBE,
+	0xCC, 0x81, 0xCE, 0x05, 0xE1, 0xBF, 0xBE, 0xCD,
+	0x82, 0xCE, 0x05, 0xE2, 0x86, 0x90, 0xCC, 0xB8,
+	// Bytes 3d00 - 3d3f
+	0x05, 0x05, 0xE2, 0x86, 0x92, 0xCC, 0xB8, 0x05,
+	0x05, 0xE2, 0x86, 0x94, 0xCC, 0xB8, 0x05, 0x05,
+	0xE2, 0x87, 0x90, 0xCC, 0xB8, 0x05, 0x05, 0xE2,
+	0x87, 0x92, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x87,
+	0x94, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x88, 0x83,
+	0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x88, 0x88, 0xCC,
+	0xB8, 0x05, 0x05, 0xE2, 0x88, 0x8B, 0xCC, 0xB8,
+	0x05, 0x05, 0xE2, 0x88, 0xA3, 0xCC, 0xB8, 0x05,
+	// Bytes 3d40 - 3d7f
+	0x05, 0xE2, 0x88, 0xA5, 0xCC, 0xB8, 0x05, 0x05,
+	0xE2, 0x88, 0xBC, 0xCC, 0xB8, 0x05, 0x05, 0xE2,
+	0x89, 0x83, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89,
+	0x85, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0x88,
+	0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0x8D, 0xCC,
+	0xB8, 0x05, 0x05, 0xE2, 0x89, 0xA1, 0xCC, 0xB8,
+	0x05, 0x05, 0xE2, 0x89, 0xA4, 0xCC, 0xB8, 0x05,
+	0x05, 0xE2, 0x89, 0xA5, 0xCC, 0xB8, 0x05, 0x05,
+	// Bytes 3d80 - 3dbf
+	0xE2, 0x89, 0xB2, 0xCC, 0xB8, 0x05, 0x05, 0xE2,
+	0x89, 0xB3, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89,
+	0xB6, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0xB7,
+	0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0xBA, 0xCC,
+	0xB8, 0x05, 0x05, 0xE2, 0x89, 0xBB, 0xCC, 0xB8,
+	0x05, 0x05, 0xE2, 0x89, 0xBC, 0xCC, 0xB8, 0x05,
+	0x05, 0xE2, 0x89, 0xBD, 0xCC, 0xB8, 0x05, 0x05,
+	0xE2, 0x8A, 0x82, 0xCC, 0xB8, 0x05, 0x05, 0xE2,
+	// Bytes 3dc0 - 3dff
+	0x8A, 0x83, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A,
+	0x86, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0x87,
+	0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0x91, 0xCC,
+	0xB8, 0x05, 0x05, 0xE2, 0x8A, 0x92, 0xCC, 0xB8,
+	0x05, 0x05, 0xE2, 0x8A, 0xA2, 0xCC, 0xB8, 0x05,
+	0x05, 0xE2, 0x8A, 0xA8, 0xCC, 0xB8, 0x05, 0x05,
+	0xE2, 0x8A, 0xA9, 0xCC, 0xB8, 0x05, 0x05, 0xE2,
+	0x8A, 0xAB, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A,
+	// Bytes 3e00 - 3e3f
+	0xB2, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0xB3,
+	0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0xB4, 0xCC,
+	0xB8, 0x05, 0x05, 0xE2, 0x8A, 0xB5, 0xCC, 0xB8,
+	0x05, 0x06, 0xCE, 0x91, 0xCC, 0x93, 0xCD, 0x85,
+	0xDE, 0x06, 0xCE, 0x91, 0xCC, 0x94, 0xCD, 0x85,
+	0xDE, 0x06, 0xCE, 0x95, 0xCC, 0x93, 0xCC, 0x80,
+	0xCE, 0x06, 0xCE, 0x95, 0xCC, 0x93, 0xCC, 0x81,
+	0xCE, 0x06, 0xCE, 0x95, 0xCC, 0x94, 0xCC, 0x80,
+	// Bytes 3e40 - 3e7f
+	0xCE, 0x06, 0xCE, 0x95, 0xCC, 0x94, 0xCC, 0x81,
+	0xCE, 0x06, 0xCE, 0x97, 0xCC, 0x93, 0xCD, 0x85,
+	0xDE, 0x06, 0xCE, 0x97, 0xCC, 0x94, 0xCD, 0x85,
+	0xDE, 0x06, 0xCE, 0x99, 0xCC, 0x93, 0xCC, 0x80,
+	0xCE, 0x06, 0xCE, 0x99, 0xCC, 0x93, 0xCC, 0x81,
+	0xCE, 0x06, 0xCE, 0x99, 0xCC, 0x93, 0xCD, 0x82,
+	0xCE, 0x06, 0xCE, 0x99, 0xCC, 0x94, 0xCC, 0x80,
+	0xCE, 0x06, 0xCE, 0x99, 0xCC, 0x94, 0xCC, 0x81,
+	// Bytes 3e80 - 3ebf
+	0xCE, 0x06, 0xCE, 0x99, 0xCC, 0x94, 0xCD, 0x82,
+	0xCE, 0x06, 0xCE, 0x9F, 0xCC, 0x93, 0xCC, 0x80,
+	0xCE, 0x06, 0xCE, 0x9F, 0xCC, 0x93, 0xCC, 0x81,
+	0xCE, 0x06, 0xCE, 0x9F, 0xCC, 0x94, 0xCC, 0x80,
+	0xCE, 0x06, 0xCE, 0x9F, 0xCC, 0x94, 0xCC, 0x81,
+	0xCE, 0x06, 0xCE, 0xA5, 0xCC, 0x94, 0xCC, 0x80,
+	0xCE, 0x06, 0xCE, 0xA5, 0xCC, 0x94, 0xCC, 0x81,
+	0xCE, 0x06, 0xCE, 0xA5, 0xCC, 0x94, 0xCD, 0x82,
+	// Bytes 3ec0 - 3eff
+	0xCE, 0x06, 0xCE, 0xA9, 0xCC, 0x93, 0xCD, 0x85,
+	0xDE, 0x06, 0xCE, 0xA9, 0xCC, 0x94, 0xCD, 0x85,
+	0xDE, 0x06, 0xCE, 0xB1, 0xCC, 0x80, 0xCD, 0x85,
+	0xDE, 0x06, 0xCE, 0xB1, 0xCC, 0x81, 0xCD, 0x85,
+	0xDE, 0x06, 0xCE, 0xB1, 0xCC, 0x93, 0xCD, 0x85,
+	0xDE, 0x06, 0xCE, 0xB1, 0xCC, 0x94, 0xCD, 0x85,
+	0xDE, 0x06, 0xCE, 0xB1, 0xCD, 0x82, 0xCD, 0x85,
+	0xDE, 0x06, 0xCE, 0xB5, 0xCC, 0x93, 0xCC, 0x80,
+	// Bytes 3f00 - 3f3f
+	0xCE, 0x06, 0xCE, 0xB5, 0xCC, 0x93, 0xCC, 0x81,
+	0xCE, 0x06, 0xCE, 0xB5, 0xCC, 0x94, 0xCC, 0x80,
+	0xCE, 0x06, 0xCE, 0xB5, 0xCC, 0x94, 0xCC, 0x81,
+	0xCE, 0x06, 0xCE, 0xB7, 0xCC, 0x80, 0xCD, 0x85,
+	0xDE, 0x06, 0xCE, 0xB7, 0xCC, 0x81, 0xCD, 0x85,
+	0xDE, 0x06, 0xCE, 0xB7, 0xCC, 0x93, 0xCD, 0x85,
+	0xDE, 0x06, 0xCE, 0xB7, 0xCC, 0x94, 0xCD, 0x85,
+	0xDE, 0x06, 0xCE, 0xB7, 0xCD, 0x82, 0xCD, 0x85,
+	// Bytes 3f40 - 3f7f
+	0xDE, 0x06, 0xCE, 0xB9, 0xCC, 0x88, 0xCC, 0x80,
+	0xCE, 0x06, 0xCE, 0xB9, 0xCC, 0x88, 0xCC, 0x81,
+	0xCE, 0x06, 0xCE, 0xB9, 0xCC, 0x88, 0xCD, 0x82,
+	0xCE, 0x06, 0xCE, 0xB9, 0xCC, 0x93, 0xCC, 0x80,
+	0xCE, 0x06, 0xCE, 0xB9, 0xCC, 0x93, 0xCC, 0x81,
+	0xCE, 0x06, 0xCE, 0xB9, 0xCC, 0x93, 0xCD, 0x82,
+	0xCE, 0x06, 0xCE, 0xB9, 0xCC, 0x94, 0xCC, 0x80,
+	0xCE, 0x06, 0xCE, 0xB9, 0xCC, 0x94, 0xCC, 0x81,
+	// Bytes 3f80 - 3fbf
+	0xCE, 0x06, 0xCE, 0xB9, 0xCC, 0x94, 0xCD, 0x82,
+	0xCE, 0x06, 0xCE, 0xBF, 0xCC, 0x93, 0xCC, 0x80,
+	0xCE, 0x06, 0xCE, 0xBF, 0xCC, 0x93, 0xCC, 0x81,
+	0xCE, 0x06, 0xCE, 0xBF, 0xCC, 0x94, 0xCC, 0x80,
+	0xCE, 0x06, 0xCE, 0xBF, 0xCC, 0x94, 0xCC, 0x81,
+	0xCE, 0x06, 0xCF, 0x85, 0xCC, 0x88, 0xCC, 0x80,
+	0xCE, 0x06, 0xCF, 0x85, 0xCC, 0x88, 0xCC, 0x81,
+	0xCE, 0x06, 0xCF, 0x85, 0xCC, 0x88, 0xCD, 0x82,
+	// Bytes 3fc0 - 3fff
+	0xCE, 0x06, 0xCF, 0x85, 0xCC, 0x93, 0xCC, 0x80,
+	0xCE, 0x06, 0xCF, 0x85, 0xCC, 0x93, 0xCC, 0x81,
+	0xCE, 0x06, 0xCF, 0x85, 0xCC, 0x93, 0xCD, 0x82,
+	0xCE, 0x06, 0xCF, 0x85, 0xCC, 0x94, 0xCC, 0x80,
+	0xCE, 0x06, 0xCF, 0x85, 0xCC, 0x94, 0xCC, 0x81,
+	0xCE, 0x06, 0xCF, 0x85, 0xCC, 0x94, 0xCD, 0x82,
+	0xCE, 0x06, 0xCF, 0x89, 0xCC, 0x80, 0xCD, 0x85,
+	0xDE, 0x06, 0xCF, 0x89, 0xCC, 0x81, 0xCD, 0x85,
+	// Bytes 4000 - 403f
+	0xDE, 0x06, 0xCF, 0x89, 0xCC, 0x93, 0xCD, 0x85,
+	0xDE, 0x06, 0xCF, 0x89, 0xCC, 0x94, 0xCD, 0x85,
+	0xDE, 0x06, 0xCF, 0x89, 0xCD, 0x82, 0xCD, 0x85,
+	0xDE, 0x06, 0xE0, 0xA4, 0xA8, 0xE0, 0xA4, 0xBC,
+	0x0D, 0x06, 0xE0, 0xA4, 0xB0, 0xE0, 0xA4, 0xBC,
+	0x0D, 0x06, 0xE0, 0xA4, 0xB3, 0xE0, 0xA4, 0xBC,
+	0x0D, 0x06, 0xE0, 0xB1, 0x86, 0xE0, 0xB1, 0x96,
+	0x89, 0x06, 0xE0, 0xB7, 0x99, 0xE0, 0xB7, 0x8A,
+	// Bytes 4040 - 407f
+	0x15, 0x06, 0xE3, 0x81, 0x86, 0xE3, 0x82, 0x99,
+	0x11, 0x06, 0xE3, 0x81, 0x8B, 0xE3, 0x82, 0x99,
+	0x11, 0x06, 0xE3, 0x81, 0x8D, 0xE3, 0x82, 0x99,
+	0x11, 0x06, 0xE3, 0x81, 0x8F, 0xE3, 0x82, 0x99,
+	0x11, 0x06, 0xE3, 0x81, 0x91, 0xE3, 0x82, 0x99,
+	0x11, 0x06, 0xE3, 0x81, 0x93, 0xE3, 0x82, 0x99,
+	0x11, 0x06, 0xE3, 0x81, 0x95, 0xE3, 0x82, 0x99,
+	0x11, 0x06, 0xE3, 0x81, 0x97, 0xE3, 0x82, 0x99,
+	// Bytes 4080 - 40bf
+	0x11, 0x06, 0xE3, 0x81, 0x99, 0xE3, 0x82, 0x99,
+	0x11, 0x06, 0xE3, 0x81, 0x9B, 0xE3, 0x82, 0x99,
+	0x11, 0x06, 0xE3, 0x81, 0x9D, 0xE3, 0x82, 0x99,
+	0x11, 0x06, 0xE3, 0x81, 0x9F, 0xE3, 0x82, 0x99,
+	0x11, 0x06, 0xE3, 0x81, 0xA1, 0xE3, 0x82, 0x99,
+	0x11, 0x06, 0xE3, 0x81, 0xA4, 0xE3, 0x82, 0x99,
+	0x11, 0x06, 0xE3, 0x81, 0xA6, 0xE3, 0x82, 0x99,
+	0x11, 0x06, 0xE3, 0x81, 0xA8, 0xE3, 0x82, 0x99,
+	// Bytes 40c0 - 40ff
+	0x11, 0x06, 0xE3, 0x81, 0xAF, 0xE3, 0x82, 0x99,
+	0x11, 0x06, 0xE3, 0x81, 0xAF, 0xE3, 0x82, 0x9A,
+	0x11, 0x06, 0xE3, 0x81, 0xB2, 0xE3, 0x82, 0x99,
+	0x11, 0x06, 0xE3, 0x81, 0xB2, 0xE3, 0x82, 0x9A,
+	0x11, 0x06, 0xE3, 0x81, 0xB5, 0xE3, 0x82, 0x99,
+	0x11, 0x06, 0xE3, 0x81, 0xB5, 0xE3, 0x82, 0x9A,
+	0x11, 0x06, 0xE3, 0x81, 0xB8, 0xE3, 0x82, 0x99,
+	0x11, 0x06, 0xE3, 0x81, 0xB8, 0xE3, 0x82, 0x9A,
+	// Bytes 4100 - 413f
+	0x11, 0x06, 0xE3, 0x81, 0xBB, 0xE3, 0x82, 0x99,
+	0x11, 0x06, 0xE3, 0x81, 0xBB, 0xE3, 0x82, 0x9A,
+	0x11, 0x06, 0xE3, 0x82, 0x9D, 0xE3, 0x82, 0x99,
+	0x11, 0x06, 0xE3, 0x82, 0xA6, 0xE3, 0x82, 0x99,
+	0x11, 0x06, 0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99,
+	0x11, 0x06, 0xE3, 0x82, 0xAD, 0xE3, 0x82, 0x99,
+	0x11, 0x06, 0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99,
+	0x11, 0x06, 0xE3, 0x82, 0xB1, 0xE3, 0x82, 0x99,
+	// Bytes 4140 - 417f
+	0x11, 0x06, 0xE3, 0x82, 0xB3, 0xE3, 0x82, 0x99,
+	0x11, 0x06, 0xE3, 0x82, 0xB5, 0xE3, 0x82, 0x99,
+	0x11, 0x06, 0xE3, 0x82, 0xB7, 0xE3, 0x82, 0x99,
+	0x11, 0x06, 0xE3, 0x82, 0xB9, 0xE3, 0x82, 0x99,
+	0x11, 0x06, 0xE3, 0x82, 0xBB, 0xE3, 0x82, 0x99,
+	0x11, 0x06, 0xE3, 0x82, 0xBD, 0xE3, 0x82, 0x99,
+	0x11, 0x06, 0xE3, 0x82, 0xBF, 0xE3, 0x82, 0x99,
+	0x11, 0x06, 0xE3, 0x83, 0x81, 0xE3, 0x82, 0x99,
+	// Bytes 4180 - 41bf
+	0x11, 0x06, 0xE3, 0x83, 0x84, 0xE3, 0x82, 0x99,
+	0x11, 0x06, 0xE3, 0x83, 0x86, 0xE3, 0x82, 0x99,
+	0x11, 0x06, 0xE3, 0x83, 0x88, 0xE3, 0x82, 0x99,
+	0x11, 0x06, 0xE3, 0x83, 0x8F, 0xE3, 0x82, 0x99,
+	0x11, 0x06, 0xE3, 0x83, 0x8F, 0xE3, 0x82, 0x9A,
+	0x11, 0x06, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x99,
+	0x11, 0x06, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x9A,
+	0x11, 0x06, 0xE3, 0x83, 0x95, 0xE3, 0x82, 0x99,
+	// Bytes 41c0 - 41ff
+	0x11, 0x06, 0xE3, 0x83, 0x95, 0xE3, 0x82, 0x9A,
+	0x11, 0x06, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x99,
+	0x11, 0x06, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x9A,
+	0x11, 0x06, 0xE3, 0x83, 0x9B, 0xE3, 0x82, 0x99,
+	0x11, 0x06, 0xE3, 0x83, 0x9B, 0xE3, 0x82, 0x9A,
+	0x11, 0x06, 0xE3, 0x83, 0xAF, 0xE3, 0x82, 0x99,
+	0x11, 0x06, 0xE3, 0x83, 0xB0, 0xE3, 0x82, 0x99,
+	0x11, 0x06, 0xE3, 0x83, 0xB1, 0xE3, 0x82, 0x99,
+	// Bytes 4200 - 423f
+	0x11, 0x06, 0xE3, 0x83, 0xB2, 0xE3, 0x82, 0x99,
+	0x11, 0x06, 0xE3, 0x83, 0xBD, 0xE3, 0x82, 0x99,
+	0x11, 0x08, 0xCE, 0x91, 0xCC, 0x93, 0xCC, 0x80,
+	0xCD, 0x85, 0xDF, 0x08, 0xCE, 0x91, 0xCC, 0x93,
+	0xCC, 0x81, 0xCD, 0x85, 0xDF, 0x08, 0xCE, 0x91,
+	0xCC, 0x93, 0xCD, 0x82, 0xCD, 0x85, 0xDF, 0x08,
+	0xCE, 0x91, 0xCC, 0x94, 0xCC, 0x80, 0xCD, 0x85,
+	0xDF, 0x08, 0xCE, 0x91, 0xCC, 0x94, 0xCC, 0x81,
+	// Bytes 4240 - 427f
+	0xCD, 0x85, 0xDF, 0x08, 0xCE, 0x91, 0xCC, 0x94,
+	0xCD, 0x82, 0xCD, 0x85, 0xDF, 0x08, 0xCE, 0x97,
+	0xCC, 0x93, 0xCC, 0x80, 0xCD, 0x85, 0xDF, 0x08,
+	0xCE, 0x97, 0xCC, 0x93, 0xCC, 0x81, 0xCD, 0x85,
+	0xDF, 0x08, 0xCE, 0x97, 0xCC, 0x93, 0xCD, 0x82,
+	0xCD, 0x85, 0xDF, 0x08, 0xCE, 0x97, 0xCC, 0x94,
+	0xCC, 0x80, 0xCD, 0x85, 0xDF, 0x08, 0xCE, 0x97,
+	0xCC, 0x94, 0xCC, 0x81, 0xCD, 0x85, 0xDF, 0x08,
+	// Bytes 4280 - 42bf
+	0xCE, 0x97, 0xCC, 0x94, 0xCD, 0x82, 0xCD, 0x85,
+	0xDF, 0x08, 0xCE, 0xA9, 0xCC, 0x93, 0xCC, 0x80,
+	0xCD, 0x85, 0xDF, 0x08, 0xCE, 0xA9, 0xCC, 0x93,
+	0xCC, 0x81, 0xCD, 0x85, 0xDF, 0x08, 0xCE, 0xA9,
+	0xCC, 0x93, 0xCD, 0x82, 0xCD, 0x85, 0xDF, 0x08,
+	0xCE, 0xA9, 0xCC, 0x94, 0xCC, 0x80, 0xCD, 0x85,
+	0xDF, 0x08, 0xCE, 0xA9, 0xCC, 0x94, 0xCC, 0x81,
+	0xCD, 0x85, 0xDF, 0x08, 0xCE, 0xA9, 0xCC, 0x94,
+	// Bytes 42c0 - 42ff
+	0xCD, 0x82, 0xCD, 0x85, 0xDF, 0x08, 0xCE, 0xB1,
+	0xCC, 0x93, 0xCC, 0x80, 0xCD, 0x85, 0xDF, 0x08,
+	0xCE, 0xB1, 0xCC, 0x93, 0xCC, 0x81, 0xCD, 0x85,
+	0xDF, 0x08, 0xCE, 0xB1, 0xCC, 0x93, 0xCD, 0x82,
+	0xCD, 0x85, 0xDF, 0x08, 0xCE, 0xB1, 0xCC, 0x94,
+	0xCC, 0x80, 0xCD, 0x85, 0xDF, 0x08, 0xCE, 0xB1,
+	0xCC, 0x94, 0xCC, 0x81, 0xCD, 0x85, 0xDF, 0x08,
+	0xCE, 0xB1, 0xCC, 0x94, 0xCD, 0x82, 0xCD, 0x85,
+	// Bytes 4300 - 433f
+	0xDF, 0x08, 0xCE, 0xB7, 0xCC, 0x93, 0xCC, 0x80,
+	0xCD, 0x85, 0xDF, 0x08, 0xCE, 0xB7, 0xCC, 0x93,
+	0xCC, 0x81, 0xCD, 0x85, 0xDF, 0x08, 0xCE, 0xB7,
+	0xCC, 0x93, 0xCD, 0x82, 0xCD, 0x85, 0xDF, 0x08,
+	0xCE, 0xB7, 0xCC, 0x94, 0xCC, 0x80, 0xCD, 0x85,
+	0xDF, 0x08, 0xCE, 0xB7, 0xCC, 0x94, 0xCC, 0x81,
+	0xCD, 0x85, 0xDF, 0x08, 0xCE, 0xB7, 0xCC, 0x94,
+	0xCD, 0x82, 0xCD, 0x85, 0xDF, 0x08, 0xCF, 0x89,
+	// Bytes 4340 - 437f
+	0xCC, 0x93, 0xCC, 0x80, 0xCD, 0x85, 0xDF, 0x08,
+	0xCF, 0x89, 0xCC, 0x93, 0xCC, 0x81, 0xCD, 0x85,
+	0xDF, 0x08, 0xCF, 0x89, 0xCC, 0x93, 0xCD, 0x82,
+	0xCD, 0x85, 0xDF, 0x08, 0xCF, 0x89, 0xCC, 0x94,
+	0xCC, 0x80, 0xCD, 0x85, 0xDF, 0x08, 0xCF, 0x89,
+	0xCC, 0x94, 0xCC, 0x81, 0xCD, 0x85, 0xDF, 0x08,
+	0xCF, 0x89, 0xCC, 0x94, 0xCD, 0x82, 0xCD, 0x85,
+	0xDF, 0x08, 0xF0, 0x91, 0x82, 0x99, 0xF0, 0x91,
+	// Bytes 4380 - 43bf
+	0x82, 0xBA, 0x0D, 0x08, 0xF0, 0x91, 0x82, 0x9B,
+	0xF0, 0x91, 0x82, 0xBA, 0x0D, 0x08, 0xF0, 0x91,
+	0x82, 0xA5, 0xF0, 0x91, 0x82, 0xBA, 0x0D, 0x42,
+	0xC2, 0xB4, 0x01, 0x43, 0x20, 0xCC, 0x81, 0xCD,
+	0x43, 0x20, 0xCC, 0x83, 0xCD, 0x43, 0x20, 0xCC,
+	0x84, 0xCD, 0x43, 0x20, 0xCC, 0x85, 0xCD, 0x43,
+	0x20, 0xCC, 0x86, 0xCD, 0x43, 0x20, 0xCC, 0x87,
+	0xCD, 0x43, 0x20, 0xCC, 0x88, 0xCD, 0x43, 0x20,
+	// Bytes 43c0 - 43ff
+	0xCC, 0x8A, 0xCD, 0x43, 0x20, 0xCC, 0x8B, 0xCD,
+	0x43, 0x20, 0xCC, 0x93, 0xCD, 0x43, 0x20, 0xCC,
+	0x94, 0xCD, 0x43, 0x20, 0xCC, 0xA7, 0xA9, 0x43,
+	0x20, 0xCC, 0xA8, 0xA9, 0x43, 0x20, 0xCC, 0xB3,
+	0xB9, 0x43, 0x20, 0xCD, 0x82, 0xCD, 0x43, 0x20,
+	0xCD, 0x85, 0xDD, 0x43, 0x20, 0xD9, 0x8B, 0x5D,
+	0x43, 0x20, 0xD9, 0x8C, 0x61, 0x43, 0x20, 0xD9,
+	0x8D, 0x65, 0x43, 0x20, 0xD9, 0x8E, 0x69, 0x43,
+	// Bytes 4400 - 443f
+	0x20, 0xD9, 0x8F, 0x6D, 0x43, 0x20, 0xD9, 0x90,
+	0x71, 0x43, 0x20, 0xD9, 0x91, 0x75, 0x43, 0x20,
+	0xD9, 0x92, 0x79, 0x43, 0x41, 0xCC, 0x8A, 0xCD,
+	0x43, 0x73, 0xCC, 0x87, 0xCD, 0x44, 0x20, 0xE3,
+	0x82, 0x99, 0x11, 0x44, 0x20, 0xE3, 0x82, 0x9A,
+	0x11, 0x44, 0xC2, 0xA8, 0xCC, 0x81, 0xCE, 0x44,
+	0xCE, 0x91, 0xCC, 0x81, 0xCD, 0x44, 0xCE, 0x95,
+	0xCC, 0x81, 0xCD, 0x44, 0xCE, 0x97, 0xCC, 0x81,
+	// Bytes 4440 - 447f
+	0xCD, 0x44, 0xCE, 0x99, 0xCC, 0x81, 0xCD, 0x44,
+	0xCE, 0x9F, 0xCC, 0x81, 0xCD, 0x44, 0xCE, 0xA5,
+	0xCC, 0x81, 0xCD, 0x44, 0xCE, 0xA5, 0xCC, 0x88,
+	0xCD, 0x44, 0xCE, 0xA9, 0xCC, 0x81, 0xCD, 0x44,
+	0xCE, 0xB1, 0xCC, 0x81, 0xCD, 0x44, 0xCE, 0xB5,
+	0xCC, 0x81, 0xCD, 0x44, 0xCE, 0xB7, 0xCC, 0x81,
+	0xCD, 0x44, 0xCE, 0xB9, 0xCC, 0x81, 0xCD, 0x44,
+	0xCE, 0xBF, 0xCC, 0x81, 0xCD, 0x44, 0xCF, 0x85,
+	// Bytes 4480 - 44bf
+	0xCC, 0x81, 0xCD, 0x44, 0xCF, 0x89, 0xCC, 0x81,
+	0xCD, 0x44, 0xD7, 0x90, 0xD6, 0xB7, 0x35, 0x44,
+	0xD7, 0x90, 0xD6, 0xB8, 0x39, 0x44, 0xD7, 0x90,
+	0xD6, 0xBC, 0x45, 0x44, 0xD7, 0x91, 0xD6, 0xBC,
+	0x45, 0x44, 0xD7, 0x91, 0xD6, 0xBF, 0x4D, 0x44,
+	0xD7, 0x92, 0xD6, 0xBC, 0x45, 0x44, 0xD7, 0x93,
+	0xD6, 0xBC, 0x45, 0x44, 0xD7, 0x94, 0xD6, 0xBC,
+	0x45, 0x44, 0xD7, 0x95, 0xD6, 0xB9, 0x3D, 0x44,
+	// Bytes 44c0 - 44ff
+	0xD7, 0x95, 0xD6, 0xBC, 0x45, 0x44, 0xD7, 0x96,
+	0xD6, 0xBC, 0x45, 0x44, 0xD7, 0x98, 0xD6, 0xBC,
+	0x45, 0x44, 0xD7, 0x99, 0xD6, 0xB4, 0x29, 0x44,
+	0xD7, 0x99, 0xD6, 0xBC, 0x45, 0x44, 0xD7, 0x9A,
+	0xD6, 0xBC, 0x45, 0x44, 0xD7, 0x9B, 0xD6, 0xBC,
+	0x45, 0x44, 0xD7, 0x9B, 0xD6, 0xBF, 0x4D, 0x44,
+	0xD7, 0x9C, 0xD6, 0xBC, 0x45, 0x44, 0xD7, 0x9E,
+	0xD6, 0xBC, 0x45, 0x44, 0xD7, 0xA0, 0xD6, 0xBC,
+	// Bytes 4500 - 453f
+	0x45, 0x44, 0xD7, 0xA1, 0xD6, 0xBC, 0x45, 0x44,
+	0xD7, 0xA3, 0xD6, 0xBC, 0x45, 0x44, 0xD7, 0xA4,
+	0xD6, 0xBC, 0x45, 0x44, 0xD7, 0xA4, 0xD6, 0xBF,
+	0x4D, 0x44, 0xD7, 0xA6, 0xD6, 0xBC, 0x45, 0x44,
+	0xD7, 0xA7, 0xD6, 0xBC, 0x45, 0x44, 0xD7, 0xA8,
+	0xD6, 0xBC, 0x45, 0x44, 0xD7, 0xA9, 0xD6, 0xBC,
+	0x45, 0x44, 0xD7, 0xA9, 0xD7, 0x81, 0x51, 0x44,
+	0xD7, 0xA9, 0xD7, 0x82, 0x55, 0x44, 0xD7, 0xAA,
+	// Bytes 4540 - 457f
+	0xD6, 0xBC, 0x45, 0x44, 0xD7, 0xB2, 0xD6, 0xB7,
+	0x35, 0x44, 0xD8, 0xA7, 0xD9, 0x8B, 0x5D, 0x44,
+	0xD8, 0xA7, 0xD9, 0x93, 0xCD, 0x44, 0xD8, 0xA7,
+	0xD9, 0x94, 0xCD, 0x44, 0xD8, 0xA7, 0xD9, 0x95,
+	0xB9, 0x44, 0xD8, 0xB0, 0xD9, 0xB0, 0x7D, 0x44,
+	0xD8, 0xB1, 0xD9, 0xB0, 0x7D, 0x44, 0xD9, 0x80,
+	0xD9, 0x8B, 0x5D, 0x44, 0xD9, 0x80, 0xD9, 0x8E,
+	0x69, 0x44, 0xD9, 0x80, 0xD9, 0x8F, 0x6D, 0x44,
+	// Bytes 4580 - 45bf
+	0xD9, 0x80, 0xD9, 0x90, 0x71, 0x44, 0xD9, 0x80,
+	0xD9, 0x91, 0x75, 0x44, 0xD9, 0x80, 0xD9, 0x92,
+	0x79, 0x44, 0xD9, 0x87, 0xD9, 0xB0, 0x7D, 0x44,
+	0xD9, 0x88, 0xD9, 0x94, 0xCD, 0x44, 0xD9, 0x89,
+	0xD9, 0xB0, 0x7D, 0x44, 0xD9, 0x8A, 0xD9, 0x94,
+	0xCD, 0x44, 0xDB, 0x92, 0xD9, 0x94, 0xCD, 0x44,
+	0xDB, 0x95, 0xD9, 0x94, 0xCD, 0x45, 0x20, 0xCC,
+	0x88, 0xCC, 0x80, 0xCE, 0x45, 0x20, 0xCC, 0x88,
+	// Bytes 45c0 - 45ff
+	0xCC, 0x81, 0xCE, 0x45, 0x20, 0xCC, 0x88, 0xCD,
+	0x82, 0xCE, 0x45, 0x20, 0xCC, 0x93, 0xCC, 0x80,
+	0xCE, 0x45, 0x20, 0xCC, 0x93, 0xCC, 0x81, 0xCE,
+	0x45, 0x20, 0xCC, 0x93, 0xCD, 0x82, 0xCE, 0x45,
+	0x20, 0xCC, 0x94, 0xCC, 0x80, 0xCE, 0x45, 0x20,
+	0xCC, 0x94, 0xCC, 0x81, 0xCE, 0x45, 0x20, 0xCC,
+	0x94, 0xCD, 0x82, 0xCE, 0x45, 0x20, 0xD9, 0x8C,
+	0xD9, 0x91, 0x76, 0x45, 0x20, 0xD9, 0x8D, 0xD9,
+	// Bytes 4600 - 463f
+	0x91, 0x76, 0x45, 0x20, 0xD9, 0x8E, 0xD9, 0x91,
+	0x76, 0x45, 0x20, 0xD9, 0x8F, 0xD9, 0x91, 0x76,
+	0x45, 0x20, 0xD9, 0x90, 0xD9, 0x91, 0x76, 0x45,
+	0x20, 0xD9, 0x91, 0xD9, 0xB0, 0x7E, 0x45, 0xE2,
+	0xAB, 0x9D, 0xCC, 0xB8, 0x05, 0x46, 0xCE, 0xB9,
+	0xCC, 0x88, 0xCC, 0x81, 0xCE, 0x46, 0xCF, 0x85,
+	0xCC, 0x88, 0xCC, 0x81, 0xCE, 0x46, 0xD7, 0xA9,
+	0xD6, 0xBC, 0xD7, 0x81, 0x52, 0x46, 0xD7, 0xA9,
+	// Bytes 4640 - 467f
+	0xD6, 0xBC, 0xD7, 0x82, 0x56, 0x46, 0xD9, 0x80,
+	0xD9, 0x8E, 0xD9, 0x91, 0x76, 0x46, 0xD9, 0x80,
+	0xD9, 0x8F, 0xD9, 0x91, 0x76, 0x46, 0xD9, 0x80,
+	0xD9, 0x90, 0xD9, 0x91, 0x76, 0x46, 0xE0, 0xA4,
+	0x95, 0xE0, 0xA4, 0xBC, 0x0D, 0x46, 0xE0, 0xA4,
+	0x96, 0xE0, 0xA4, 0xBC, 0x0D, 0x46, 0xE0, 0xA4,
+	0x97, 0xE0, 0xA4, 0xBC, 0x0D, 0x46, 0xE0, 0xA4,
+	0x9C, 0xE0, 0xA4, 0xBC, 0x0D, 0x46, 0xE0, 0xA4,
+	// Bytes 4680 - 46bf
+	0xA1, 0xE0, 0xA4, 0xBC, 0x0D, 0x46, 0xE0, 0xA4,
+	0xA2, 0xE0, 0xA4, 0xBC, 0x0D, 0x46, 0xE0, 0xA4,
+	0xAB, 0xE0, 0xA4, 0xBC, 0x0D, 0x46, 0xE0, 0xA4,
+	0xAF, 0xE0, 0xA4, 0xBC, 0x0D, 0x46, 0xE0, 0xA6,
+	0xA1, 0xE0, 0xA6, 0xBC, 0x0D, 0x46, 0xE0, 0xA6,
+	0xA2, 0xE0, 0xA6, 0xBC, 0x0D, 0x46, 0xE0, 0xA6,
+	0xAF, 0xE0, 0xA6, 0xBC, 0x0D, 0x46, 0xE0, 0xA8,
+	0x96, 0xE0, 0xA8, 0xBC, 0x0D, 0x46, 0xE0, 0xA8,
+	// Bytes 46c0 - 46ff
+	0x97, 0xE0, 0xA8, 0xBC, 0x0D, 0x46, 0xE0, 0xA8,
+	0x9C, 0xE0, 0xA8, 0xBC, 0x0D, 0x46, 0xE0, 0xA8,
+	0xAB, 0xE0, 0xA8, 0xBC, 0x0D, 0x46, 0xE0, 0xA8,
+	0xB2, 0xE0, 0xA8, 0xBC, 0x0D, 0x46, 0xE0, 0xA8,
+	0xB8, 0xE0, 0xA8, 0xBC, 0x0D, 0x46, 0xE0, 0xAC,
+	0xA1, 0xE0, 0xAC, 0xBC, 0x0D, 0x46, 0xE0, 0xAC,
+	0xA2, 0xE0, 0xAC, 0xBC, 0x0D, 0x46, 0xE0, 0xBE,
+	0xB2, 0xE0, 0xBE, 0x80, 0xA1, 0x46, 0xE0, 0xBE,
+	// Bytes 4700 - 473f
+	0xB3, 0xE0, 0xBE, 0x80, 0xA1, 0x46, 0xE3, 0x83,
+	0x86, 0xE3, 0x82, 0x99, 0x11, 0x48, 0xF0, 0x9D,
+	0x85, 0x97, 0xF0, 0x9D, 0x85, 0xA5, 0xB1, 0x48,
+	0xF0, 0x9D, 0x85, 0x98, 0xF0, 0x9D, 0x85, 0xA5,
+	0xB1, 0x48, 0xF0, 0x9D, 0x86, 0xB9, 0xF0, 0x9D,
+	0x85, 0xA5, 0xB1, 0x48, 0xF0, 0x9D, 0x86, 0xBA,
+	0xF0, 0x9D, 0x85, 0xA5, 0xB1, 0x49, 0xE0, 0xBE,
+	0xB2, 0xE0, 0xBD, 0xB1, 0xE0, 0xBE, 0x80, 0xA2,
+	// Bytes 4740 - 477f
+	0x49, 0xE0, 0xBE, 0xB3, 0xE0, 0xBD, 0xB1, 0xE0,
+	0xBE, 0x80, 0xA2, 0x4C, 0xF0, 0x9D, 0x85, 0x98,
+	0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xAE,
+	0xB2, 0x4C, 0xF0, 0x9D, 0x85, 0x98, 0xF0, 0x9D,
+	0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xAF, 0xB2, 0x4C,
+	0xF0, 0x9D, 0x85, 0x98, 0xF0, 0x9D, 0x85, 0xA5,
+	0xF0, 0x9D, 0x85, 0xB0, 0xB2, 0x4C, 0xF0, 0x9D,
+	0x85, 0x98, 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D,
+	// Bytes 4780 - 47bf
+	0x85, 0xB1, 0xB2, 0x4C, 0xF0, 0x9D, 0x85, 0x98,
+	0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xB2,
+	0xB2, 0x4C, 0xF0, 0x9D, 0x86, 0xB9, 0xF0, 0x9D,
+	0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xAE, 0xB2, 0x4C,
+	0xF0, 0x9D, 0x86, 0xB9, 0xF0, 0x9D, 0x85, 0xA5,
+	0xF0, 0x9D, 0x85, 0xAF, 0xB2, 0x4C, 0xF0, 0x9D,
+	0x86, 0xBA, 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D,
+	0x85, 0xAE, 0xB2, 0x4C, 0xF0, 0x9D, 0x86, 0xBA,
+	// Bytes 47c0 - 47ff
+	0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xAF,
+	0xB2, 0x83, 0x41, 0xCC, 0x82, 0xCD, 0x83, 0x41,
+	0xCC, 0x86, 0xCD, 0x83, 0x41, 0xCC, 0x87, 0xCD,
+	0x83, 0x41, 0xCC, 0x88, 0xCD, 0x83, 0x41, 0xCC,
+	0x8A, 0xCD, 0x83, 0x41, 0xCC, 0xA3, 0xB9, 0x83,
+	0x43, 0xCC, 0xA7, 0xA9, 0x83, 0x45, 0xCC, 0x82,
+	0xCD, 0x83, 0x45, 0xCC, 0x84, 0xCD, 0x83, 0x45,
+	0xCC, 0xA3, 0xB9, 0x83, 0x45, 0xCC, 0xA7, 0xA9,
+	// Bytes 4800 - 483f
+	0x83, 0x49, 0xCC, 0x88, 0xCD, 0x83, 0x4C, 0xCC,
+	0xA3, 0xB9, 0x83, 0x4F, 0xCC, 0x82, 0xCD, 0x83,
+	0x4F, 0xCC, 0x83, 0xCD, 0x83, 0x4F, 0xCC, 0x84,
+	0xCD, 0x83, 0x4F, 0xCC, 0x87, 0xCD, 0x83, 0x4F,
+	0xCC, 0x88, 0xCD, 0x83, 0x4F, 0xCC, 0x9B, 0xB1,
+	0x83, 0x4F, 0xCC, 0xA3, 0xB9, 0x83, 0x4F, 0xCC,
+	0xA8, 0xA9, 0x83, 0x52, 0xCC, 0xA3, 0xB9, 0x83,
+	0x53, 0xCC, 0x81, 0xCD, 0x83, 0x53, 0xCC, 0x8C,
+	// Bytes 4840 - 487f
+	0xCD, 0x83, 0x53, 0xCC, 0xA3, 0xB9, 0x83, 0x55,
+	0xCC, 0x83, 0xCD, 0x83, 0x55, 0xCC, 0x84, 0xCD,
+	0x83, 0x55, 0xCC, 0x88, 0xCD, 0x83, 0x55, 0xCC,
+	0x9B, 0xB1, 0x83, 0x61, 0xCC, 0x82, 0xCD, 0x83,
+	0x61, 0xCC, 0x86, 0xCD, 0x83, 0x61, 0xCC, 0x87,
+	0xCD, 0x83, 0x61, 0xCC, 0x88, 0xCD, 0x83, 0x61,
+	0xCC, 0x8A, 0xCD, 0x83, 0x61, 0xCC, 0xA3, 0xB9,
+	0x83, 0x63, 0xCC, 0xA7, 0xA9, 0x83, 0x65, 0xCC,
+	// Bytes 4880 - 48bf
+	0x82, 0xCD, 0x83, 0x65, 0xCC, 0x84, 0xCD, 0x83,
+	0x65, 0xCC, 0xA3, 0xB9, 0x83, 0x65, 0xCC, 0xA7,
+	0xA9, 0x83, 0x69, 0xCC, 0x88, 0xCD, 0x83, 0x6C,
+	0xCC, 0xA3, 0xB9, 0x83, 0x6F, 0xCC, 0x82, 0xCD,
+	0x83, 0x6F, 0xCC, 0x83, 0xCD, 0x83, 0x6F, 0xCC,
+	0x84, 0xCD, 0x83, 0x6F, 0xCC, 0x87, 0xCD, 0x83,
+	0x6F, 0xCC, 0x88, 0xCD, 0x83, 0x6F, 0xCC, 0x9B,
+	0xB1, 0x83, 0x6F, 0xCC, 0xA3, 0xB9, 0x83, 0x6F,
+	// Bytes 48c0 - 48ff
+	0xCC, 0xA8, 0xA9, 0x83, 0x72, 0xCC, 0xA3, 0xB9,
+	0x83, 0x73, 0xCC, 0x81, 0xCD, 0x83, 0x73, 0xCC,
+	0x8C, 0xCD, 0x83, 0x73, 0xCC, 0xA3, 0xB9, 0x83,
+	0x75, 0xCC, 0x83, 0xCD, 0x83, 0x75, 0xCC, 0x84,
+	0xCD, 0x83, 0x75, 0xCC, 0x88, 0xCD, 0x83, 0x75,
+	0xCC, 0x9B, 0xB1, 0x84, 0xCE, 0x91, 0xCC, 0x93,
+	0xCD, 0x84, 0xCE, 0x91, 0xCC, 0x94, 0xCD, 0x84,
+	0xCE, 0x95, 0xCC, 0x93, 0xCD, 0x84, 0xCE, 0x95,
+	// Bytes 4900 - 493f
+	0xCC, 0x94, 0xCD, 0x84, 0xCE, 0x97, 0xCC, 0x93,
+	0xCD, 0x84, 0xCE, 0x97, 0xCC, 0x94, 0xCD, 0x84,
+	0xCE, 0x99, 0xCC, 0x93, 0xCD, 0x84, 0xCE, 0x99,
+	0xCC, 0x94, 0xCD, 0x84, 0xCE, 0x9F, 0xCC, 0x93,
+	0xCD, 0x84, 0xCE, 0x9F, 0xCC, 0x94, 0xCD, 0x84,
+	0xCE, 0xA5, 0xCC, 0x94, 0xCD, 0x84, 0xCE, 0xA9,
+	0xCC, 0x93, 0xCD, 0x84, 0xCE, 0xA9, 0xCC, 0x94,
+	0xCD, 0x84, 0xCE, 0xB1, 0xCC, 0x80, 0xCD, 0x84,
+	// Bytes 4940 - 497f
+	0xCE, 0xB1, 0xCC, 0x81, 0xCD, 0x84, 0xCE, 0xB1,
+	0xCC, 0x93, 0xCD, 0x84, 0xCE, 0xB1, 0xCC, 0x94,
+	0xCD, 0x84, 0xCE, 0xB1, 0xCD, 0x82, 0xCD, 0x84,
+	0xCE, 0xB5, 0xCC, 0x93, 0xCD, 0x84, 0xCE, 0xB5,
+	0xCC, 0x94, 0xCD, 0x84, 0xCE, 0xB7, 0xCC, 0x80,
+	0xCD, 0x84, 0xCE, 0xB7, 0xCC, 0x81, 0xCD, 0x84,
+	0xCE, 0xB7, 0xCC, 0x93, 0xCD, 0x84, 0xCE, 0xB7,
+	0xCC, 0x94, 0xCD, 0x84, 0xCE, 0xB7, 0xCD, 0x82,
+	// Bytes 4980 - 49bf
+	0xCD, 0x84, 0xCE, 0xB9, 0xCC, 0x88, 0xCD, 0x84,
+	0xCE, 0xB9, 0xCC, 0x93, 0xCD, 0x84, 0xCE, 0xB9,
+	0xCC, 0x94, 0xCD, 0x84, 0xCE, 0xBF, 0xCC, 0x93,
+	0xCD, 0x84, 0xCE, 0xBF, 0xCC, 0x94, 0xCD, 0x84,
+	0xCF, 0x85, 0xCC, 0x88, 0xCD, 0x84, 0xCF, 0x85,
+	0xCC, 0x93, 0xCD, 0x84, 0xCF, 0x85, 0xCC, 0x94,
+	0xCD, 0x84, 0xCF, 0x89, 0xCC, 0x80, 0xCD, 0x84,
+	0xCF, 0x89, 0xCC, 0x81, 0xCD, 0x84, 0xCF, 0x89,
+	// Bytes 49c0 - 49ff
+	0xCC, 0x93, 0xCD, 0x84, 0xCF, 0x89, 0xCC, 0x94,
+	0xCD, 0x84, 0xCF, 0x89, 0xCD, 0x82, 0xCD, 0x86,
+	0xCE, 0x91, 0xCC, 0x93, 0xCC, 0x80, 0xCE, 0x86,
+	0xCE, 0x91, 0xCC, 0x93, 0xCC, 0x81, 0xCE, 0x86,
+	0xCE, 0x91, 0xCC, 0x93, 0xCD, 0x82, 0xCE, 0x86,
+	0xCE, 0x91, 0xCC, 0x94, 0xCC, 0x80, 0xCE, 0x86,
+	0xCE, 0x91, 0xCC, 0x94, 0xCC, 0x81, 0xCE, 0x86,
+	0xCE, 0x91, 0xCC, 0x94, 0xCD, 0x82, 0xCE, 0x86,
+	// Bytes 4a00 - 4a3f
+	0xCE, 0x97, 0xCC, 0x93, 0xCC, 0x80, 0xCE, 0x86,
+	0xCE, 0x97, 0xCC, 0x93, 0xCC, 0x81, 0xCE, 0x86,
+	0xCE, 0x97, 0xCC, 0x93, 0xCD, 0x82, 0xCE, 0x86,
+	0xCE, 0x97, 0xCC, 0x94, 0xCC, 0x80, 0xCE, 0x86,
+	0xCE, 0x97, 0xCC, 0x94, 0xCC, 0x81, 0xCE, 0x86,
+	0xCE, 0x97, 0xCC, 0x94, 0xCD, 0x82, 0xCE, 0x86,
+	0xCE, 0xA9, 0xCC, 0x93, 0xCC, 0x80, 0xCE, 0x86,
+	0xCE, 0xA9, 0xCC, 0x93, 0xCC, 0x81, 0xCE, 0x86,
+	// Bytes 4a40 - 4a7f
+	0xCE, 0xA9, 0xCC, 0x93, 0xCD, 0x82, 0xCE, 0x86,
+	0xCE, 0xA9, 0xCC, 0x94, 0xCC, 0x80, 0xCE, 0x86,
+	0xCE, 0xA9, 0xCC, 0x94, 0xCC, 0x81, 0xCE, 0x86,
+	0xCE, 0xA9, 0xCC, 0x94, 0xCD, 0x82, 0xCE, 0x86,
+	0xCE, 0xB1, 0xCC, 0x93, 0xCC, 0x80, 0xCE, 0x86,
+	0xCE, 0xB1, 0xCC, 0x93, 0xCC, 0x81, 0xCE, 0x86,
+	0xCE, 0xB1, 0xCC, 0x93, 0xCD, 0x82, 0xCE, 0x86,
+	0xCE, 0xB1, 0xCC, 0x94, 0xCC, 0x80, 0xCE, 0x86,
+	// Bytes 4a80 - 4abf
+	0xCE, 0xB1, 0xCC, 0x94, 0xCC, 0x81, 0xCE, 0x86,
+	0xCE, 0xB1, 0xCC, 0x94, 0xCD, 0x82, 0xCE, 0x86,
+	0xCE, 0xB7, 0xCC, 0x93, 0xCC, 0x80, 0xCE, 0x86,
+	0xCE, 0xB7, 0xCC, 0x93, 0xCC, 0x81, 0xCE, 0x86,
+	0xCE, 0xB7, 0xCC, 0x93, 0xCD, 0x82, 0xCE, 0x86,
+	0xCE, 0xB7, 0xCC, 0x94, 0xCC, 0x80, 0xCE, 0x86,
+	0xCE, 0xB7, 0xCC, 0x94, 0xCC, 0x81, 0xCE, 0x86,
+	0xCE, 0xB7, 0xCC, 0x94, 0xCD, 0x82, 0xCE, 0x86,
+	// Bytes 4ac0 - 4aff
+	0xCF, 0x89, 0xCC, 0x93, 0xCC, 0x80, 0xCE, 0x86,
+	0xCF, 0x89, 0xCC, 0x93, 0xCC, 0x81, 0xCE, 0x86,
+	0xCF, 0x89, 0xCC, 0x93, 0xCD, 0x82, 0xCE, 0x86,
+	0xCF, 0x89, 0xCC, 0x94, 0xCC, 0x80, 0xCE, 0x86,
+	0xCF, 0x89, 0xCC, 0x94, 0xCC, 0x81, 0xCE, 0x86,
+	0xCF, 0x89, 0xCC, 0x94, 0xCD, 0x82, 0xCE, 0x42,
+	0xCC, 0x80, 0xCD, 0x33, 0x42, 0xCC, 0x81, 0xCD,
+	0x33, 0x42, 0xCC, 0x93, 0xCD, 0x33, 0x43, 0xE1,
+	// Bytes 4b00 - 4b3f
+	0x85, 0xA1, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xA2,
+	0x01, 0x00, 0x43, 0xE1, 0x85, 0xA3, 0x01, 0x00,
+	0x43, 0xE1, 0x85, 0xA4, 0x01, 0x00, 0x43, 0xE1,
+	0x85, 0xA5, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xA6,
+	0x01, 0x00, 0x43, 0xE1, 0x85, 0xA7, 0x01, 0x00,
+	0x43, 0xE1, 0x85, 0xA8, 0x01, 0x00, 0x43, 0xE1,
+	0x85, 0xA9, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xAA,
+	0x01, 0x00, 0x43, 0xE1, 0x85, 0xAB, 0x01, 0x00,
+	// Bytes 4b40 - 4b7f
+	0x43, 0xE1, 0x85, 0xAC, 0x01, 0x00, 0x43, 0xE1,
+	0x85, 0xAD, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xAE,
+	0x01, 0x00, 0x43, 0xE1, 0x85, 0xAF, 0x01, 0x00,
+	0x43, 0xE1, 0x85, 0xB0, 0x01, 0x00, 0x43, 0xE1,
+	0x85, 0xB1, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xB2,
+	0x01, 0x00, 0x43, 0xE1, 0x85, 0xB3, 0x01, 0x00,
+	0x43, 0xE1, 0x85, 0xB4, 0x01, 0x00, 0x43, 0xE1,
+	0x85, 0xB5, 0x01, 0x00, 0x43, 0xE1, 0x86, 0xAA,
+	// Bytes 4b80 - 4bbf
+	0x01, 0x00, 0x43, 0xE1, 0x86, 0xAC, 0x01, 0x00,
+	0x43, 0xE1, 0x86, 0xAD, 0x01, 0x00, 0x43, 0xE1,
+	0x86, 0xB0, 0x01, 0x00, 0x43, 0xE1, 0x86, 0xB1,
+	0x01, 0x00, 0x43, 0xE1, 0x86, 0xB2, 0x01, 0x00,
+	0x43, 0xE1, 0x86, 0xB3, 0x01, 0x00, 0x43, 0xE1,
+	0x86, 0xB4, 0x01, 0x00, 0x43, 0xE1, 0x86, 0xB5,
+	0x01, 0x00, 0x44, 0xCC, 0x88, 0xCC, 0x81, 0xCE,
+	0x33, 0x43, 0xE3, 0x82, 0x99, 0x11, 0x04, 0x43,
+	// Bytes 4bc0 - 4bff
+	0xE3, 0x82, 0x9A, 0x11, 0x04, 0x46, 0xE0, 0xBD,
+	0xB1, 0xE0, 0xBD, 0xB2, 0xA2, 0x27, 0x46, 0xE0,
+	0xBD, 0xB1, 0xE0, 0xBD, 0xB4, 0xA6, 0x27, 0x46,
+	0xE0, 0xBD, 0xB1, 0xE0, 0xBE, 0x80, 0xA2, 0x27,
+	0x00, 0x01,
+}
+
+// lookup returns the trie value for the first UTF-8 encoding in s and
+// the width in bytes of this encoding. The size will be 0 if s does not
+// hold enough bytes to complete the encoding. len(s) must be greater than 0.
+func (t *nfcTrie) lookup(s []byte) (v uint16, sz int) {
+	c0 := s[0]
+	switch {
+	case c0 < 0x80: // is ASCII
+		return nfcValues[c0], 1
+	case c0 < 0xC2:
+		return 0, 1 // Illegal UTF-8: not a starter, not ASCII.
+	case c0 < 0xE0: // 2-byte UTF-8
+		if len(s) < 2 {
+			return 0, 0
+		}
+		i := nfcIndex[c0]
+		c1 := s[1]
+		if c1 < 0x80 || 0xC0 <= c1 {
+			return 0, 1 // Illegal UTF-8: not a continuation byte.
+		}
+		return t.lookupValue(uint32(i), c1), 2
+	case c0 < 0xF0: // 3-byte UTF-8
+		if len(s) < 3 {
+			return 0, 0
+		}
+		i := nfcIndex[c0]
+		c1 := s[1]
+		if c1 < 0x80 || 0xC0 <= c1 {
+			return 0, 1 // Illegal UTF-8: not a continuation byte.
+		}
+		o := uint32(i)<<6 + uint32(c1)
+		i = nfcIndex[o]
+		c2 := s[2]
+		if c2 < 0x80 || 0xC0 <= c2 {
+			return 0, 2 // Illegal UTF-8: not a continuation byte.
+		}
+		return t.lookupValue(uint32(i), c2), 3
+	case c0 < 0xF8: // 4-byte UTF-8
+		if len(s) < 4 {
+			return 0, 0
+		}
+		i := nfcIndex[c0]
+		c1 := s[1]
+		if c1 < 0x80 || 0xC0 <= c1 {
+			return 0, 1 // Illegal UTF-8: not a continuation byte.
+		}
+		o := uint32(i)<<6 + uint32(c1)
+		i = nfcIndex[o]
+		c2 := s[2]
+		if c2 < 0x80 || 0xC0 <= c2 {
+			return 0, 2 // Illegal UTF-8: not a continuation byte.
+		}
+		o = uint32(i)<<6 + uint32(c2)
+		i = nfcIndex[o]
+		c3 := s[3]
+		if c3 < 0x80 || 0xC0 <= c3 {
+			return 0, 3 // Illegal UTF-8: not a continuation byte.
+		}
+		return t.lookupValue(uint32(i), c3), 4
+	}
+	// Illegal rune
+	return 0, 1
+}
+
+// lookupUnsafe returns the trie value for the first UTF-8 encoding in s.
+// s must start with a full and valid UTF-8 encoded rune.
+func (t *nfcTrie) lookupUnsafe(s []byte) uint16 {
+	c0 := s[0]
+	if c0 < 0x80 { // is ASCII
+		return nfcValues[c0]
+	}
+	i := nfcIndex[c0]
+	if c0 < 0xE0 { // 2-byte UTF-8
+		return t.lookupValue(uint32(i), s[1])
+	}
+	i = nfcIndex[uint32(i)<<6+uint32(s[1])]
+	if c0 < 0xF0 { // 3-byte UTF-8
+		return t.lookupValue(uint32(i), s[2])
+	}
+	i = nfcIndex[uint32(i)<<6+uint32(s[2])]
+	if c0 < 0xF8 { // 4-byte UTF-8
+		return t.lookupValue(uint32(i), s[3])
+	}
+	return 0
+}
+
+// lookupString returns the trie value for the first UTF-8 encoding in s and
+// the width in bytes of this encoding. The size will be 0 if s does not
+// hold enough bytes to complete the encoding. len(s) must be greater than 0.
+func (t *nfcTrie) lookupString(s string) (v uint16, sz int) {
+	c0 := s[0]
+	switch {
+	case c0 < 0x80: // is ASCII
+		return nfcValues[c0], 1
+	case c0 < 0xC2:
+		return 0, 1 // Illegal UTF-8: not a starter, not ASCII.
+	case c0 < 0xE0: // 2-byte UTF-8
+		if len(s) < 2 {
+			return 0, 0
+		}
+		i := nfcIndex[c0]
+		c1 := s[1]
+		if c1 < 0x80 || 0xC0 <= c1 {
+			return 0, 1 // Illegal UTF-8: not a continuation byte.
+		}
+		return t.lookupValue(uint32(i), c1), 2
+	case c0 < 0xF0: // 3-byte UTF-8
+		if len(s) < 3 {
+			return 0, 0
+		}
+		i := nfcIndex[c0]
+		c1 := s[1]
+		if c1 < 0x80 || 0xC0 <= c1 {
+			return 0, 1 // Illegal UTF-8: not a continuation byte.
+		}
+		o := uint32(i)<<6 + uint32(c1)
+		i = nfcIndex[o]
+		c2 := s[2]
+		if c2 < 0x80 || 0xC0 <= c2 {
+			return 0, 2 // Illegal UTF-8: not a continuation byte.
+		}
+		return t.lookupValue(uint32(i), c2), 3
+	case c0 < 0xF8: // 4-byte UTF-8
+		if len(s) < 4 {
+			return 0, 0
+		}
+		i := nfcIndex[c0]
+		c1 := s[1]
+		if c1 < 0x80 || 0xC0 <= c1 {
+			return 0, 1 // Illegal UTF-8: not a continuation byte.
+		}
+		o := uint32(i)<<6 + uint32(c1)
+		i = nfcIndex[o]
+		c2 := s[2]
+		if c2 < 0x80 || 0xC0 <= c2 {
+			return 0, 2 // Illegal UTF-8: not a continuation byte.
+		}
+		o = uint32(i)<<6 + uint32(c2)
+		i = nfcIndex[o]
+		c3 := s[3]
+		if c3 < 0x80 || 0xC0 <= c3 {
+			return 0, 3 // Illegal UTF-8: not a continuation byte.
+		}
+		return t.lookupValue(uint32(i), c3), 4
+	}
+	// Illegal rune
+	return 0, 1
+}
+
+// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s.
+// s must start with a full and valid UTF-8 encoded rune.
+func (t *nfcTrie) lookupStringUnsafe(s string) uint16 {
+	c0 := s[0]
+	if c0 < 0x80 { // is ASCII
+		return nfcValues[c0]
+	}
+	i := nfcIndex[c0]
+	if c0 < 0xE0 { // 2-byte UTF-8
+		return t.lookupValue(uint32(i), s[1])
+	}
+	i = nfcIndex[uint32(i)<<6+uint32(s[1])]
+	if c0 < 0xF0 { // 3-byte UTF-8
+		return t.lookupValue(uint32(i), s[2])
+	}
+	i = nfcIndex[uint32(i)<<6+uint32(s[2])]
+	if c0 < 0xF8 { // 4-byte UTF-8
+		return t.lookupValue(uint32(i), s[3])
+	}
+	return 0
+}
+
+// nfcTrie. Total size: 10798 bytes (10.54 KiB). Checksum: b5981cc85e3bd14.
+type nfcTrie struct{}
+
+func newNfcTrie(i int) *nfcTrie {
+	return &nfcTrie{}
+}
+
+// lookupValue determines the type of block n and looks up the value for b.
+func (t *nfcTrie) lookupValue(n uint32, b byte) uint16 {
+	switch {
+	case n < 46:
+		return uint16(nfcValues[n<<6+uint32(b)])
+	default:
+		n -= 46
+		return uint16(nfcSparse.lookup(n, b))
+	}
+}
+
+// nfcValues: 48 blocks, 3072 entries, 6144 bytes
+// The third block is the zero block.
+var nfcValues = [3072]uint16{
+	// Block 0x0, offset 0x0
+	0x3c: 0xa000, 0x3d: 0xa000, 0x3e: 0xa000,
+	// Block 0x1, offset 0x40
+	0x41: 0xa000, 0x42: 0xa000, 0x43: 0xa000, 0x44: 0xa000, 0x45: 0xa000,
+	0x46: 0xa000, 0x47: 0xa000, 0x48: 0xa000, 0x49: 0xa000, 0x4a: 0xa000, 0x4b: 0xa000,
+	0x4c: 0xa000, 0x4d: 0xa000, 0x4e: 0xa000, 0x4f: 0xa000, 0x50: 0xa000,
+	0x52: 0xa000, 0x53: 0xa000, 0x54: 0xa000, 0x55: 0xa000, 0x56: 0xa000, 0x57: 0xa000,
+	0x58: 0xa000, 0x59: 0xa000, 0x5a: 0xa000,
+	0x61: 0xa000, 0x62: 0xa000, 0x63: 0xa000,
+	0x64: 0xa000, 0x65: 0xa000, 0x66: 0xa000, 0x67: 0xa000, 0x68: 0xa000, 0x69: 0xa000,
+	0x6a: 0xa000, 0x6b: 0xa000, 0x6c: 0xa000, 0x6d: 0xa000, 0x6e: 0xa000, 0x6f: 0xa000,
+	0x70: 0xa000, 0x72: 0xa000, 0x73: 0xa000, 0x74: 0xa000, 0x75: 0xa000,
+	0x76: 0xa000, 0x77: 0xa000, 0x78: 0xa000, 0x79: 0xa000, 0x7a: 0xa000,
+	// Block 0x2, offset 0x80
+	// Block 0x3, offset 0xc0
+	0xc0: 0x30b0, 0xc1: 0x30b5, 0xc2: 0x47c9, 0xc3: 0x30ba, 0xc4: 0x47d8, 0xc5: 0x47dd,
+	0xc6: 0xa000, 0xc7: 0x47e7, 0xc8: 0x3123, 0xc9: 0x3128, 0xca: 0x47ec, 0xcb: 0x313c,
+	0xcc: 0x31af, 0xcd: 0x31b4, 0xce: 0x31b9, 0xcf: 0x4800, 0xd1: 0x3245,
+	0xd2: 0x3268, 0xd3: 0x326d, 0xd4: 0x480a, 0xd5: 0x480f, 0xd6: 0x481e,
+	0xd8: 0xa000, 0xd9: 0x32f4, 0xda: 0x32f9, 0xdb: 0x32fe, 0xdc: 0x4850, 0xdd: 0x3376,
+	0xe0: 0x33bc, 0xe1: 0x33c1, 0xe2: 0x485a, 0xe3: 0x33c6,
+	0xe4: 0x4869, 0xe5: 0x486e, 0xe6: 0xa000, 0xe7: 0x4878, 0xe8: 0x342f, 0xe9: 0x3434,
+	0xea: 0x487d, 0xeb: 0x3448, 0xec: 0x34c0, 0xed: 0x34c5, 0xee: 0x34ca, 0xef: 0x4891,
+	0xf1: 0x3556, 0xf2: 0x3579, 0xf3: 0x357e, 0xf4: 0x489b, 0xf5: 0x48a0,
+	0xf6: 0x48af, 0xf8: 0xa000, 0xf9: 0x360a, 0xfa: 0x360f, 0xfb: 0x3614,
+	0xfc: 0x48e1, 0xfd: 0x3691, 0xff: 0x36aa,
+	// Block 0x4, offset 0x100
+	0x100: 0x30bf, 0x101: 0x33cb, 0x102: 0x47ce, 0x103: 0x485f, 0x104: 0x30dd, 0x105: 0x33e9,
+	0x106: 0x30f1, 0x107: 0x33fd, 0x108: 0x30f6, 0x109: 0x3402, 0x10a: 0x30fb, 0x10b: 0x3407,
+	0x10c: 0x3100, 0x10d: 0x340c, 0x10e: 0x310a, 0x10f: 0x3416,
+	0x112: 0x47f1, 0x113: 0x4882, 0x114: 0x3132, 0x115: 0x343e, 0x116: 0x3137, 0x117: 0x3443,
+	0x118: 0x3155, 0x119: 0x3461, 0x11a: 0x3146, 0x11b: 0x3452, 0x11c: 0x316e, 0x11d: 0x347a,
+	0x11e: 0x3178, 0x11f: 0x3484, 0x120: 0x317d, 0x121: 0x3489, 0x122: 0x3187, 0x123: 0x3493,
+	0x124: 0x318c, 0x125: 0x3498, 0x128: 0x31be, 0x129: 0x34cf,
+	0x12a: 0x31c3, 0x12b: 0x34d4, 0x12c: 0x31c8, 0x12d: 0x34d9, 0x12e: 0x31eb, 0x12f: 0x34f7,
+	0x130: 0x31cd, 0x134: 0x31f5, 0x135: 0x3501,
+	0x136: 0x3209, 0x137: 0x351a, 0x139: 0x3213, 0x13a: 0x3524, 0x13b: 0x321d,
+	0x13c: 0x352e, 0x13d: 0x3218, 0x13e: 0x3529,
+	// Block 0x5, offset 0x140
+	0x143: 0x3240, 0x144: 0x3551, 0x145: 0x3259,
+	0x146: 0x356a, 0x147: 0x324f, 0x148: 0x3560,
+	0x14c: 0x4814, 0x14d: 0x48a5, 0x14e: 0x3272, 0x14f: 0x3583, 0x150: 0x327c, 0x151: 0x358d,
+	0x154: 0x329a, 0x155: 0x35ab, 0x156: 0x32b3, 0x157: 0x35c4,
+	0x158: 0x32a4, 0x159: 0x35b5, 0x15a: 0x4837, 0x15b: 0x48c8, 0x15c: 0x32bd, 0x15d: 0x35ce,
+	0x15e: 0x32cc, 0x15f: 0x35dd, 0x160: 0x483c, 0x161: 0x48cd, 0x162: 0x32e5, 0x163: 0x35fb,
+	0x164: 0x32d6, 0x165: 0x35ec, 0x168: 0x4846, 0x169: 0x48d7,
+	0x16a: 0x484b, 0x16b: 0x48dc, 0x16c: 0x3303, 0x16d: 0x3619, 0x16e: 0x330d, 0x16f: 0x3623,
+	0x170: 0x3312, 0x171: 0x3628, 0x172: 0x3330, 0x173: 0x3646, 0x174: 0x3353, 0x175: 0x3669,
+	0x176: 0x337b, 0x177: 0x3696, 0x178: 0x338f, 0x179: 0x339e, 0x17a: 0x36be, 0x17b: 0x33a8,
+	0x17c: 0x36c8, 0x17d: 0x33ad, 0x17e: 0x36cd, 0x17f: 0xa000,
+	// Block 0x6, offset 0x180
+	0x184: 0x8100, 0x185: 0x8100,
+	0x186: 0x8100,
+	0x18d: 0x30c9, 0x18e: 0x33d5, 0x18f: 0x31d7, 0x190: 0x34e3, 0x191: 0x3281,
+	0x192: 0x3592, 0x193: 0x3317, 0x194: 0x362d, 0x195: 0x3b10, 0x196: 0x3c9f, 0x197: 0x3b09,
+	0x198: 0x3c98, 0x199: 0x3b17, 0x19a: 0x3ca6, 0x19b: 0x3b02, 0x19c: 0x3c91,
+	0x19e: 0x39f1, 0x19f: 0x3b80, 0x1a0: 0x39ea, 0x1a1: 0x3b79, 0x1a2: 0x36f4, 0x1a3: 0x3706,
+	0x1a6: 0x3182, 0x1a7: 0x348e, 0x1a8: 0x31ff, 0x1a9: 0x3510,
+	0x1aa: 0x482d, 0x1ab: 0x48be, 0x1ac: 0x3ad1, 0x1ad: 0x3c60, 0x1ae: 0x3718, 0x1af: 0x371e,
+	0x1b0: 0x3506, 0x1b4: 0x3169, 0x1b5: 0x3475,
+	0x1b8: 0x323b, 0x1b9: 0x354c, 0x1ba: 0x39f8, 0x1bb: 0x3b87,
+	0x1bc: 0x36ee, 0x1bd: 0x3700, 0x1be: 0x36fa, 0x1bf: 0x370c,
+	// Block 0x7, offset 0x1c0
+	0x1c0: 0x30ce, 0x1c1: 0x33da, 0x1c2: 0x30d3, 0x1c3: 0x33df, 0x1c4: 0x314b, 0x1c5: 0x3457,
+	0x1c6: 0x3150, 0x1c7: 0x345c, 0x1c8: 0x31dc, 0x1c9: 0x34e8, 0x1ca: 0x31e1, 0x1cb: 0x34ed,
+	0x1cc: 0x3286, 0x1cd: 0x3597, 0x1ce: 0x328b, 0x1cf: 0x359c, 0x1d0: 0x32a9, 0x1d1: 0x35ba,
+	0x1d2: 0x32ae, 0x1d3: 0x35bf, 0x1d4: 0x331c, 0x1d5: 0x3632, 0x1d6: 0x3321, 0x1d7: 0x3637,
+	0x1d8: 0x32c7, 0x1d9: 0x35d8, 0x1da: 0x32e0, 0x1db: 0x35f6,
+	0x1de: 0x319b, 0x1df: 0x34a7,
+	0x1e6: 0x47d3, 0x1e7: 0x4864, 0x1e8: 0x47fb, 0x1e9: 0x488c,
+	0x1ea: 0x3aa0, 0x1eb: 0x3c2f, 0x1ec: 0x3a7d, 0x1ed: 0x3c0c, 0x1ee: 0x4819, 0x1ef: 0x48aa,
+	0x1f0: 0x3a99, 0x1f1: 0x3c28, 0x1f2: 0x3385, 0x1f3: 0x36a0,
+	// Block 0x8, offset 0x200
+	0x200: 0x9933, 0x201: 0x9933, 0x202: 0x9933, 0x203: 0x9933, 0x204: 0x9933, 0x205: 0x8133,
+	0x206: 0x9933, 0x207: 0x9933, 0x208: 0x9933, 0x209: 0x9933, 0x20a: 0x9933, 0x20b: 0x9933,
+	0x20c: 0x9933, 0x20d: 0x8133, 0x20e: 0x8133, 0x20f: 0x9933, 0x210: 0x8133, 0x211: 0x9933,
+	0x212: 0x8133, 0x213: 0x9933, 0x214: 0x9933, 0x215: 0x8134, 0x216: 0x812e, 0x217: 0x812e,
+	0x218: 0x812e, 0x219: 0x812e, 0x21a: 0x8134, 0x21b: 0x992c, 0x21c: 0x812e, 0x21d: 0x812e,
+	0x21e: 0x812e, 0x21f: 0x812e, 0x220: 0x812e, 0x221: 0x812a, 0x222: 0x812a, 0x223: 0x992e,
+	0x224: 0x992e, 0x225: 0x992e, 0x226: 0x992e, 0x227: 0x992a, 0x228: 0x992a, 0x229: 0x812e,
+	0x22a: 0x812e, 0x22b: 0x812e, 0x22c: 0x812e, 0x22d: 0x992e, 0x22e: 0x992e, 0x22f: 0x812e,
+	0x230: 0x992e, 0x231: 0x992e, 0x232: 0x812e, 0x233: 0x812e, 0x234: 0x8101, 0x235: 0x8101,
+	0x236: 0x8101, 0x237: 0x8101, 0x238: 0x9901, 0x239: 0x812e, 0x23a: 0x812e, 0x23b: 0x812e,
+	0x23c: 0x812e, 0x23d: 0x8133, 0x23e: 0x8133, 0x23f: 0x8133,
+	// Block 0x9, offset 0x240
+	0x240: 0x4aef, 0x241: 0x4af4, 0x242: 0x9933, 0x243: 0x4af9, 0x244: 0x4bb2, 0x245: 0x9937,
+	0x246: 0x8133, 0x247: 0x812e, 0x248: 0x812e, 0x249: 0x812e, 0x24a: 0x8133, 0x24b: 0x8133,
+	0x24c: 0x8133, 0x24d: 0x812e, 0x24e: 0x812e, 0x250: 0x8133, 0x251: 0x8133,
+	0x252: 0x8133, 0x253: 0x812e, 0x254: 0x812e, 0x255: 0x812e, 0x256: 0x812e, 0x257: 0x8133,
+	0x258: 0x8134, 0x259: 0x812e, 0x25a: 0x812e, 0x25b: 0x8133, 0x25c: 0x8135, 0x25d: 0x8136,
+	0x25e: 0x8136, 0x25f: 0x8135, 0x260: 0x8136, 0x261: 0x8136, 0x262: 0x8135, 0x263: 0x8133,
+	0x264: 0x8133, 0x265: 0x8133, 0x266: 0x8133, 0x267: 0x8133, 0x268: 0x8133, 0x269: 0x8133,
+	0x26a: 0x8133, 0x26b: 0x8133, 0x26c: 0x8133, 0x26d: 0x8133, 0x26e: 0x8133, 0x26f: 0x8133,
+	0x274: 0x01ee,
+	0x27a: 0x8100,
+	0x27e: 0x0037,
+	// Block 0xa, offset 0x280
+	0x284: 0x8100, 0x285: 0x36e2,
+	0x286: 0x372a, 0x287: 0x00ce, 0x288: 0x3748, 0x289: 0x3754, 0x28a: 0x3766,
+	0x28c: 0x3784, 0x28e: 0x3796, 0x28f: 0x37b4, 0x290: 0x3f49, 0x291: 0xa000,
+	0x295: 0xa000, 0x297: 0xa000,
+	0x299: 0xa000,
+	0x29f: 0xa000, 0x2a1: 0xa000,
+	0x2a5: 0xa000, 0x2a9: 0xa000,
+	0x2aa: 0x3778, 0x2ab: 0x37a8, 0x2ac: 0x493f, 0x2ad: 0x37d8, 0x2ae: 0x4969, 0x2af: 0x37ea,
+	0x2b0: 0x3fb1, 0x2b1: 0xa000, 0x2b5: 0xa000,
+	0x2b7: 0xa000, 0x2b9: 0xa000,
+	0x2bf: 0xa000,
+	// Block 0xb, offset 0x2c0
+	0x2c0: 0x3862, 0x2c1: 0x386e, 0x2c3: 0x385c,
+	0x2c6: 0xa000, 0x2c7: 0x384a,
+	0x2cc: 0x389e, 0x2cd: 0x3886, 0x2ce: 0x38b0, 0x2d0: 0xa000,
+	0x2d3: 0xa000, 0x2d5: 0xa000, 0x2d6: 0xa000, 0x2d7: 0xa000,
+	0x2d8: 0xa000, 0x2d9: 0x3892, 0x2da: 0xa000,
+	0x2de: 0xa000, 0x2e3: 0xa000,
+	0x2e7: 0xa000,
+	0x2eb: 0xa000, 0x2ed: 0xa000,
+	0x2f0: 0xa000, 0x2f3: 0xa000, 0x2f5: 0xa000,
+	0x2f6: 0xa000, 0x2f7: 0xa000, 0x2f8: 0xa000, 0x2f9: 0x3916, 0x2fa: 0xa000,
+	0x2fe: 0xa000,
+	// Block 0xc, offset 0x300
+	0x301: 0x3874, 0x302: 0x38f8,
+	0x310: 0x3850, 0x311: 0x38d4,
+	0x312: 0x3856, 0x313: 0x38da, 0x316: 0x3868, 0x317: 0x38ec,
+	0x318: 0xa000, 0x319: 0xa000, 0x31a: 0x396a, 0x31b: 0x3970, 0x31c: 0x387a, 0x31d: 0x38fe,
+	0x31e: 0x3880, 0x31f: 0x3904, 0x322: 0x388c, 0x323: 0x3910,
+	0x324: 0x3898, 0x325: 0x391c, 0x326: 0x38a4, 0x327: 0x3928, 0x328: 0xa000, 0x329: 0xa000,
+	0x32a: 0x3976, 0x32b: 0x397c, 0x32c: 0x38ce, 0x32d: 0x3952, 0x32e: 0x38aa, 0x32f: 0x392e,
+	0x330: 0x38b6, 0x331: 0x393a, 0x332: 0x38bc, 0x333: 0x3940, 0x334: 0x38c2, 0x335: 0x3946,
+	0x338: 0x38c8, 0x339: 0x394c,
+	// Block 0xd, offset 0x340
+	0x351: 0x812e,
+	0x352: 0x8133, 0x353: 0x8133, 0x354: 0x8133, 0x355: 0x8133, 0x356: 0x812e, 0x357: 0x8133,
+	0x358: 0x8133, 0x359: 0x8133, 0x35a: 0x812f, 0x35b: 0x812e, 0x35c: 0x8133, 0x35d: 0x8133,
+	0x35e: 0x8133, 0x35f: 0x8133, 0x360: 0x8133, 0x361: 0x8133, 0x362: 0x812e, 0x363: 0x812e,
+	0x364: 0x812e, 0x365: 0x812e, 0x366: 0x812e, 0x367: 0x812e, 0x368: 0x8133, 0x369: 0x8133,
+	0x36a: 0x812e, 0x36b: 0x8133, 0x36c: 0x8133, 0x36d: 0x812f, 0x36e: 0x8132, 0x36f: 0x8133,
+	0x370: 0x8106, 0x371: 0x8107, 0x372: 0x8108, 0x373: 0x8109, 0x374: 0x810a, 0x375: 0x810b,
+	0x376: 0x810c, 0x377: 0x810d, 0x378: 0x810e, 0x379: 0x810f, 0x37a: 0x810f, 0x37b: 0x8110,
+	0x37c: 0x8111, 0x37d: 0x8112, 0x37f: 0x8113,
+	// Block 0xe, offset 0x380
+	0x388: 0xa000, 0x38a: 0xa000, 0x38b: 0x8117,
+	0x38c: 0x8118, 0x38d: 0x8119, 0x38e: 0x811a, 0x38f: 0x811b, 0x390: 0x811c, 0x391: 0x811d,
+	0x392: 0x811e, 0x393: 0x9933, 0x394: 0x9933, 0x395: 0x992e, 0x396: 0x812e, 0x397: 0x8133,
+	0x398: 0x8133, 0x399: 0x8133, 0x39a: 0x8133, 0x39b: 0x8133, 0x39c: 0x812e, 0x39d: 0x8133,
+	0x39e: 0x8133, 0x39f: 0x812e,
+	0x3b0: 0x811f,
+	// Block 0xf, offset 0x3c0
+	0x3ca: 0x8133, 0x3cb: 0x8133,
+	0x3cc: 0x8133, 0x3cd: 0x8133, 0x3ce: 0x8133, 0x3cf: 0x812e, 0x3d0: 0x812e, 0x3d1: 0x812e,
+	0x3d2: 0x812e, 0x3d3: 0x812e, 0x3d4: 0x8133, 0x3d5: 0x8133, 0x3d6: 0x8133, 0x3d7: 0x8133,
+	0x3d8: 0x8133, 0x3d9: 0x8133, 0x3da: 0x8133, 0x3db: 0x8133, 0x3dc: 0x8133, 0x3dd: 0x8133,
+	0x3de: 0x8133, 0x3df: 0x8133, 0x3e0: 0x8133, 0x3e1: 0x8133, 0x3e3: 0x812e,
+	0x3e4: 0x8133, 0x3e5: 0x8133, 0x3e6: 0x812e, 0x3e7: 0x8133, 0x3e8: 0x8133, 0x3e9: 0x812e,
+	0x3ea: 0x8133, 0x3eb: 0x8133, 0x3ec: 0x8133, 0x3ed: 0x812e, 0x3ee: 0x812e, 0x3ef: 0x812e,
+	0x3f0: 0x8117, 0x3f1: 0x8118, 0x3f2: 0x8119, 0x3f3: 0x8133, 0x3f4: 0x8133, 0x3f5: 0x8133,
+	0x3f6: 0x812e, 0x3f7: 0x8133, 0x3f8: 0x8133, 0x3f9: 0x812e, 0x3fa: 0x812e, 0x3fb: 0x8133,
+	0x3fc: 0x8133, 0x3fd: 0x8133, 0x3fe: 0x8133, 0x3ff: 0x8133,
+	// Block 0x10, offset 0x400
+	0x405: 0xa000,
+	0x406: 0x2e5d, 0x407: 0xa000, 0x408: 0x2e65, 0x409: 0xa000, 0x40a: 0x2e6d, 0x40b: 0xa000,
+	0x40c: 0x2e75, 0x40d: 0xa000, 0x40e: 0x2e7d, 0x411: 0xa000,
+	0x412: 0x2e85,
+	0x434: 0x8103, 0x435: 0x9900,
+	0x43a: 0xa000, 0x43b: 0x2e8d,
+	0x43c: 0xa000, 0x43d: 0x2e95, 0x43e: 0xa000, 0x43f: 0xa000,
+	// Block 0x11, offset 0x440
+	0x440: 0x8133, 0x441: 0x8133, 0x442: 0x812e, 0x443: 0x8133, 0x444: 0x8133, 0x445: 0x8133,
+	0x446: 0x8133, 0x447: 0x8133, 0x448: 0x8133, 0x449: 0x8133, 0x44a: 0x812e, 0x44b: 0x8133,
+	0x44c: 0x8133, 0x44d: 0x8136, 0x44e: 0x812b, 0x44f: 0x812e, 0x450: 0x812a, 0x451: 0x8133,
+	0x452: 0x8133, 0x453: 0x8133, 0x454: 0x8133, 0x455: 0x8133, 0x456: 0x8133, 0x457: 0x8133,
+	0x458: 0x8133, 0x459: 0x8133, 0x45a: 0x8133, 0x45b: 0x8133, 0x45c: 0x8133, 0x45d: 0x8133,
+	0x45e: 0x8133, 0x45f: 0x8133, 0x460: 0x8133, 0x461: 0x8133, 0x462: 0x8133, 0x463: 0x8133,
+	0x464: 0x8133, 0x465: 0x8133, 0x466: 0x8133, 0x467: 0x8133, 0x468: 0x8133, 0x469: 0x8133,
+	0x46a: 0x8133, 0x46b: 0x8133, 0x46c: 0x8133, 0x46d: 0x8133, 0x46e: 0x8133, 0x46f: 0x8133,
+	0x470: 0x8133, 0x471: 0x8133, 0x472: 0x8133, 0x473: 0x8133, 0x474: 0x8133, 0x475: 0x8133,
+	0x476: 0x8134, 0x477: 0x8132, 0x478: 0x8132, 0x479: 0x812e, 0x47a: 0x812d, 0x47b: 0x8133,
+	0x47c: 0x8135, 0x47d: 0x812e, 0x47e: 0x8133, 0x47f: 0x812e,
+	// Block 0x12, offset 0x480
+	0x480: 0x30d8, 0x481: 0x33e4, 0x482: 0x30e2, 0x483: 0x33ee, 0x484: 0x30e7, 0x485: 0x33f3,
+	0x486: 0x30ec, 0x487: 0x33f8, 0x488: 0x3a0d, 0x489: 0x3b9c, 0x48a: 0x3105, 0x48b: 0x3411,
+	0x48c: 0x310f, 0x48d: 0x341b, 0x48e: 0x311e, 0x48f: 0x342a, 0x490: 0x3114, 0x491: 0x3420,
+	0x492: 0x3119, 0x493: 0x3425, 0x494: 0x3a30, 0x495: 0x3bbf, 0x496: 0x3a37, 0x497: 0x3bc6,
+	0x498: 0x315a, 0x499: 0x3466, 0x49a: 0x315f, 0x49b: 0x346b, 0x49c: 0x3a45, 0x49d: 0x3bd4,
+	0x49e: 0x3164, 0x49f: 0x3470, 0x4a0: 0x3173, 0x4a1: 0x347f, 0x4a2: 0x3191, 0x4a3: 0x349d,
+	0x4a4: 0x31a0, 0x4a5: 0x34ac, 0x4a6: 0x3196, 0x4a7: 0x34a2, 0x4a8: 0x31a5, 0x4a9: 0x34b1,
+	0x4aa: 0x31aa, 0x4ab: 0x34b6, 0x4ac: 0x31f0, 0x4ad: 0x34fc, 0x4ae: 0x3a4c, 0x4af: 0x3bdb,
+	0x4b0: 0x31fa, 0x4b1: 0x350b, 0x4b2: 0x3204, 0x4b3: 0x3515, 0x4b4: 0x320e, 0x4b5: 0x351f,
+	0x4b6: 0x4805, 0x4b7: 0x4896, 0x4b8: 0x3a53, 0x4b9: 0x3be2, 0x4ba: 0x3227, 0x4bb: 0x3538,
+	0x4bc: 0x3222, 0x4bd: 0x3533, 0x4be: 0x322c, 0x4bf: 0x353d,
+	// Block 0x13, offset 0x4c0
+	0x4c0: 0x3231, 0x4c1: 0x3542, 0x4c2: 0x3236, 0x4c3: 0x3547, 0x4c4: 0x324a, 0x4c5: 0x355b,
+	0x4c6: 0x3254, 0x4c7: 0x3565, 0x4c8: 0x3263, 0x4c9: 0x3574, 0x4ca: 0x325e, 0x4cb: 0x356f,
+	0x4cc: 0x3a76, 0x4cd: 0x3c05, 0x4ce: 0x3a84, 0x4cf: 0x3c13, 0x4d0: 0x3a8b, 0x4d1: 0x3c1a,
+	0x4d2: 0x3a92, 0x4d3: 0x3c21, 0x4d4: 0x3290, 0x4d5: 0x35a1, 0x4d6: 0x3295, 0x4d7: 0x35a6,
+	0x4d8: 0x329f, 0x4d9: 0x35b0, 0x4da: 0x4832, 0x4db: 0x48c3, 0x4dc: 0x3ad8, 0x4dd: 0x3c67,
+	0x4de: 0x32b8, 0x4df: 0x35c9, 0x4e0: 0x32c2, 0x4e1: 0x35d3, 0x4e2: 0x4841, 0x4e3: 0x48d2,
+	0x4e4: 0x3adf, 0x4e5: 0x3c6e, 0x4e6: 0x3ae6, 0x4e7: 0x3c75, 0x4e8: 0x3aed, 0x4e9: 0x3c7c,
+	0x4ea: 0x32d1, 0x4eb: 0x35e2, 0x4ec: 0x32db, 0x4ed: 0x35f1, 0x4ee: 0x32ef, 0x4ef: 0x3605,
+	0x4f0: 0x32ea, 0x4f1: 0x3600, 0x4f2: 0x332b, 0x4f3: 0x3641, 0x4f4: 0x333a, 0x4f5: 0x3650,
+	0x4f6: 0x3335, 0x4f7: 0x364b, 0x4f8: 0x3af4, 0x4f9: 0x3c83, 0x4fa: 0x3afb, 0x4fb: 0x3c8a,
+	0x4fc: 0x333f, 0x4fd: 0x3655, 0x4fe: 0x3344, 0x4ff: 0x365a,
+	// Block 0x14, offset 0x500
+	0x500: 0x3349, 0x501: 0x365f, 0x502: 0x334e, 0x503: 0x3664, 0x504: 0x335d, 0x505: 0x3673,
+	0x506: 0x3358, 0x507: 0x366e, 0x508: 0x3362, 0x509: 0x367d, 0x50a: 0x3367, 0x50b: 0x3682,
+	0x50c: 0x336c, 0x50d: 0x3687, 0x50e: 0x338a, 0x50f: 0x36a5, 0x510: 0x33a3, 0x511: 0x36c3,
+	0x512: 0x33b2, 0x513: 0x36d2, 0x514: 0x33b7, 0x515: 0x36d7, 0x516: 0x34bb, 0x517: 0x35e7,
+	0x518: 0x3678, 0x519: 0x36b4, 0x51b: 0x3712,
+	0x520: 0x47e2, 0x521: 0x4873, 0x522: 0x30c4, 0x523: 0x33d0,
+	0x524: 0x39b9, 0x525: 0x3b48, 0x526: 0x39b2, 0x527: 0x3b41, 0x528: 0x39c7, 0x529: 0x3b56,
+	0x52a: 0x39c0, 0x52b: 0x3b4f, 0x52c: 0x39ff, 0x52d: 0x3b8e, 0x52e: 0x39d5, 0x52f: 0x3b64,
+	0x530: 0x39ce, 0x531: 0x3b5d, 0x532: 0x39e3, 0x533: 0x3b72, 0x534: 0x39dc, 0x535: 0x3b6b,
+	0x536: 0x3a06, 0x537: 0x3b95, 0x538: 0x47f6, 0x539: 0x4887, 0x53a: 0x3141, 0x53b: 0x344d,
+	0x53c: 0x312d, 0x53d: 0x3439, 0x53e: 0x3a1b, 0x53f: 0x3baa,
+	// Block 0x15, offset 0x540
+	0x540: 0x3a14, 0x541: 0x3ba3, 0x542: 0x3a29, 0x543: 0x3bb8, 0x544: 0x3a22, 0x545: 0x3bb1,
+	0x546: 0x3a3e, 0x547: 0x3bcd, 0x548: 0x31d2, 0x549: 0x34de, 0x54a: 0x31e6, 0x54b: 0x34f2,
+	0x54c: 0x4828, 0x54d: 0x48b9, 0x54e: 0x3277, 0x54f: 0x3588, 0x550: 0x3a61, 0x551: 0x3bf0,
+	0x552: 0x3a5a, 0x553: 0x3be9, 0x554: 0x3a6f, 0x555: 0x3bfe, 0x556: 0x3a68, 0x557: 0x3bf7,
+	0x558: 0x3aca, 0x559: 0x3c59, 0x55a: 0x3aae, 0x55b: 0x3c3d, 0x55c: 0x3aa7, 0x55d: 0x3c36,
+	0x55e: 0x3abc, 0x55f: 0x3c4b, 0x560: 0x3ab5, 0x561: 0x3c44, 0x562: 0x3ac3, 0x563: 0x3c52,
+	0x564: 0x3326, 0x565: 0x363c, 0x566: 0x3308, 0x567: 0x361e, 0x568: 0x3b25, 0x569: 0x3cb4,
+	0x56a: 0x3b1e, 0x56b: 0x3cad, 0x56c: 0x3b33, 0x56d: 0x3cc2, 0x56e: 0x3b2c, 0x56f: 0x3cbb,
+	0x570: 0x3b3a, 0x571: 0x3cc9, 0x572: 0x3371, 0x573: 0x368c, 0x574: 0x3399, 0x575: 0x36b9,
+	0x576: 0x3394, 0x577: 0x36af, 0x578: 0x3380, 0x579: 0x369b,
+	// Block 0x16, offset 0x580
+	0x580: 0x4945, 0x581: 0x494b, 0x582: 0x4a5f, 0x583: 0x4a77, 0x584: 0x4a67, 0x585: 0x4a7f,
+	0x586: 0x4a6f, 0x587: 0x4a87, 0x588: 0x48eb, 0x589: 0x48f1, 0x58a: 0x49cf, 0x58b: 0x49e7,
+	0x58c: 0x49d7, 0x58d: 0x49ef, 0x58e: 0x49df, 0x58f: 0x49f7, 0x590: 0x4957, 0x591: 0x495d,
+	0x592: 0x3ef9, 0x593: 0x3f09, 0x594: 0x3f01, 0x595: 0x3f11,
+	0x598: 0x48f7, 0x599: 0x48fd, 0x59a: 0x3e29, 0x59b: 0x3e39, 0x59c: 0x3e31, 0x59d: 0x3e41,
+	0x5a0: 0x496f, 0x5a1: 0x4975, 0x5a2: 0x4a8f, 0x5a3: 0x4aa7,
+	0x5a4: 0x4a97, 0x5a5: 0x4aaf, 0x5a6: 0x4a9f, 0x5a7: 0x4ab7, 0x5a8: 0x4903, 0x5a9: 0x4909,
+	0x5aa: 0x49ff, 0x5ab: 0x4a17, 0x5ac: 0x4a07, 0x5ad: 0x4a1f, 0x5ae: 0x4a0f, 0x5af: 0x4a27,
+	0x5b0: 0x4987, 0x5b1: 0x498d, 0x5b2: 0x3f59, 0x5b3: 0x3f71, 0x5b4: 0x3f61, 0x5b5: 0x3f79,
+	0x5b6: 0x3f69, 0x5b7: 0x3f81, 0x5b8: 0x490f, 0x5b9: 0x4915, 0x5ba: 0x3e59, 0x5bb: 0x3e71,
+	0x5bc: 0x3e61, 0x5bd: 0x3e79, 0x5be: 0x3e69, 0x5bf: 0x3e81,
+	// Block 0x17, offset 0x5c0
+	0x5c0: 0x4993, 0x5c1: 0x4999, 0x5c2: 0x3f89, 0x5c3: 0x3f99, 0x5c4: 0x3f91, 0x5c5: 0x3fa1,
+	0x5c8: 0x491b, 0x5c9: 0x4921, 0x5ca: 0x3e89, 0x5cb: 0x3e99,
+	0x5cc: 0x3e91, 0x5cd: 0x3ea1, 0x5d0: 0x49a5, 0x5d1: 0x49ab,
+	0x5d2: 0x3fc1, 0x5d3: 0x3fd9, 0x5d4: 0x3fc9, 0x5d5: 0x3fe1, 0x5d6: 0x3fd1, 0x5d7: 0x3fe9,
+	0x5d9: 0x4927, 0x5db: 0x3ea9, 0x5dd: 0x3eb1,
+	0x5df: 0x3eb9, 0x5e0: 0x49bd, 0x5e1: 0x49c3, 0x5e2: 0x4abf, 0x5e3: 0x4ad7,
+	0x5e4: 0x4ac7, 0x5e5: 0x4adf, 0x5e6: 0x4acf, 0x5e7: 0x4ae7, 0x5e8: 0x492d, 0x5e9: 0x4933,
+	0x5ea: 0x4a2f, 0x5eb: 0x4a47, 0x5ec: 0x4a37, 0x5ed: 0x4a4f, 0x5ee: 0x4a3f, 0x5ef: 0x4a57,
+	0x5f0: 0x4939, 0x5f1: 0x445f, 0x5f2: 0x37d2, 0x5f3: 0x4465, 0x5f4: 0x4963, 0x5f5: 0x446b,
+	0x5f6: 0x37e4, 0x5f7: 0x4471, 0x5f8: 0x3802, 0x5f9: 0x4477, 0x5fa: 0x381a, 0x5fb: 0x447d,
+	0x5fc: 0x49b1, 0x5fd: 0x4483,
+	// Block 0x18, offset 0x600
+	0x600: 0x3ee1, 0x601: 0x3ee9, 0x602: 0x42c5, 0x603: 0x42e3, 0x604: 0x42cf, 0x605: 0x42ed,
+	0x606: 0x42d9, 0x607: 0x42f7, 0x608: 0x3e19, 0x609: 0x3e21, 0x60a: 0x4211, 0x60b: 0x422f,
+	0x60c: 0x421b, 0x60d: 0x4239, 0x60e: 0x4225, 0x60f: 0x4243, 0x610: 0x3f29, 0x611: 0x3f31,
+	0x612: 0x4301, 0x613: 0x431f, 0x614: 0x430b, 0x615: 0x4329, 0x616: 0x4315, 0x617: 0x4333,
+	0x618: 0x3e49, 0x619: 0x3e51, 0x61a: 0x424d, 0x61b: 0x426b, 0x61c: 0x4257, 0x61d: 0x4275,
+	0x61e: 0x4261, 0x61f: 0x427f, 0x620: 0x4001, 0x621: 0x4009, 0x622: 0x433d, 0x623: 0x435b,
+	0x624: 0x4347, 0x625: 0x4365, 0x626: 0x4351, 0x627: 0x436f, 0x628: 0x3ec1, 0x629: 0x3ec9,
+	0x62a: 0x4289, 0x62b: 0x42a7, 0x62c: 0x4293, 0x62d: 0x42b1, 0x62e: 0x429d, 0x62f: 0x42bb,
+	0x630: 0x37c6, 0x631: 0x37c0, 0x632: 0x3ed1, 0x633: 0x37cc, 0x634: 0x3ed9,
+	0x636: 0x4951, 0x637: 0x3ef1, 0x638: 0x3736, 0x639: 0x3730, 0x63a: 0x3724, 0x63b: 0x442f,
+	0x63c: 0x373c, 0x63d: 0x8100, 0x63e: 0x0257, 0x63f: 0xa100,
+	// Block 0x19, offset 0x640
+	0x640: 0x8100, 0x641: 0x36e8, 0x642: 0x3f19, 0x643: 0x37de, 0x644: 0x3f21,
+	0x646: 0x497b, 0x647: 0x3f39, 0x648: 0x3742, 0x649: 0x4435, 0x64a: 0x374e, 0x64b: 0x443b,
+	0x64c: 0x375a, 0x64d: 0x3cd0, 0x64e: 0x3cd7, 0x64f: 0x3cde, 0x650: 0x37f6, 0x651: 0x37f0,
+	0x652: 0x3f41, 0x653: 0x4625, 0x656: 0x37fc, 0x657: 0x3f51,
+	0x658: 0x3772, 0x659: 0x376c, 0x65a: 0x3760, 0x65b: 0x4441, 0x65d: 0x3ce5,
+	0x65e: 0x3cec, 0x65f: 0x3cf3, 0x660: 0x382c, 0x661: 0x3826, 0x662: 0x3fa9, 0x663: 0x462d,
+	0x664: 0x380e, 0x665: 0x3814, 0x666: 0x3832, 0x667: 0x3fb9, 0x668: 0x37a2, 0x669: 0x379c,
+	0x66a: 0x3790, 0x66b: 0x444d, 0x66c: 0x378a, 0x66d: 0x36dc, 0x66e: 0x4429, 0x66f: 0x0081,
+	0x672: 0x3ff1, 0x673: 0x3838, 0x674: 0x3ff9,
+	0x676: 0x49c9, 0x677: 0x4011, 0x678: 0x377e, 0x679: 0x4447, 0x67a: 0x37ae, 0x67b: 0x4459,
+	0x67c: 0x37ba, 0x67d: 0x4397, 0x67e: 0xa100,
+	// Block 0x1a, offset 0x680
+	0x681: 0x3d47, 0x683: 0xa000, 0x684: 0x3d4e, 0x685: 0xa000,
+	0x687: 0x3d55, 0x688: 0xa000, 0x689: 0x3d5c,
+	0x68d: 0xa000,
+	0x6a0: 0x30a6, 0x6a1: 0xa000, 0x6a2: 0x3d6a,
+	0x6a4: 0xa000, 0x6a5: 0xa000,
+	0x6ad: 0x3d63, 0x6ae: 0x30a1, 0x6af: 0x30ab,
+	0x6b0: 0x3d71, 0x6b1: 0x3d78, 0x6b2: 0xa000, 0x6b3: 0xa000, 0x6b4: 0x3d7f, 0x6b5: 0x3d86,
+	0x6b6: 0xa000, 0x6b7: 0xa000, 0x6b8: 0x3d8d, 0x6b9: 0x3d94, 0x6ba: 0xa000, 0x6bb: 0xa000,
+	0x6bc: 0xa000, 0x6bd: 0xa000,
+	// Block 0x1b, offset 0x6c0
+	0x6c0: 0x3d9b, 0x6c1: 0x3da2, 0x6c2: 0xa000, 0x6c3: 0xa000, 0x6c4: 0x3db7, 0x6c5: 0x3dbe,
+	0x6c6: 0xa000, 0x6c7: 0xa000, 0x6c8: 0x3dc5, 0x6c9: 0x3dcc,
+	0x6d1: 0xa000,
+	0x6d2: 0xa000,
+	0x6e2: 0xa000,
+	0x6e8: 0xa000, 0x6e9: 0xa000,
+	0x6eb: 0xa000, 0x6ec: 0x3de1, 0x6ed: 0x3de8, 0x6ee: 0x3def, 0x6ef: 0x3df6,
+	0x6f2: 0xa000, 0x6f3: 0xa000, 0x6f4: 0xa000, 0x6f5: 0xa000,
+	// Block 0x1c, offset 0x700
+	0x706: 0xa000, 0x70b: 0xa000,
+	0x70c: 0x4049, 0x70d: 0xa000, 0x70e: 0x4051, 0x70f: 0xa000, 0x710: 0x4059, 0x711: 0xa000,
+	0x712: 0x4061, 0x713: 0xa000, 0x714: 0x4069, 0x715: 0xa000, 0x716: 0x4071, 0x717: 0xa000,
+	0x718: 0x4079, 0x719: 0xa000, 0x71a: 0x4081, 0x71b: 0xa000, 0x71c: 0x4089, 0x71d: 0xa000,
+	0x71e: 0x4091, 0x71f: 0xa000, 0x720: 0x4099, 0x721: 0xa000, 0x722: 0x40a1,
+	0x724: 0xa000, 0x725: 0x40a9, 0x726: 0xa000, 0x727: 0x40b1, 0x728: 0xa000, 0x729: 0x40b9,
+	0x72f: 0xa000,
+	0x730: 0x40c1, 0x731: 0x40c9, 0x732: 0xa000, 0x733: 0x40d1, 0x734: 0x40d9, 0x735: 0xa000,
+	0x736: 0x40e1, 0x737: 0x40e9, 0x738: 0xa000, 0x739: 0x40f1, 0x73a: 0x40f9, 0x73b: 0xa000,
+	0x73c: 0x4101, 0x73d: 0x4109,
+	// Block 0x1d, offset 0x740
+	0x754: 0x4041,
+	0x759: 0x9904, 0x75a: 0x9904, 0x75b: 0x8100, 0x75c: 0x8100, 0x75d: 0xa000,
+	0x75e: 0x4111,
+	0x766: 0xa000,
+	0x76b: 0xa000, 0x76c: 0x4121, 0x76d: 0xa000, 0x76e: 0x4129, 0x76f: 0xa000,
+	0x770: 0x4131, 0x771: 0xa000, 0x772: 0x4139, 0x773: 0xa000, 0x774: 0x4141, 0x775: 0xa000,
+	0x776: 0x4149, 0x777: 0xa000, 0x778: 0x4151, 0x779: 0xa000, 0x77a: 0x4159, 0x77b: 0xa000,
+	0x77c: 0x4161, 0x77d: 0xa000, 0x77e: 0x4169, 0x77f: 0xa000,
+	// Block 0x1e, offset 0x780
+	0x780: 0x4171, 0x781: 0xa000, 0x782: 0x4179, 0x784: 0xa000, 0x785: 0x4181,
+	0x786: 0xa000, 0x787: 0x4189, 0x788: 0xa000, 0x789: 0x4191,
+	0x78f: 0xa000, 0x790: 0x4199, 0x791: 0x41a1,
+	0x792: 0xa000, 0x793: 0x41a9, 0x794: 0x41b1, 0x795: 0xa000, 0x796: 0x41b9, 0x797: 0x41c1,
+	0x798: 0xa000, 0x799: 0x41c9, 0x79a: 0x41d1, 0x79b: 0xa000, 0x79c: 0x41d9, 0x79d: 0x41e1,
+	0x7af: 0xa000,
+	0x7b0: 0xa000, 0x7b1: 0xa000, 0x7b2: 0xa000, 0x7b4: 0x4119,
+	0x7b7: 0x41e9, 0x7b8: 0x41f1, 0x7b9: 0x41f9, 0x7ba: 0x4201,
+	0x7bd: 0xa000, 0x7be: 0x4209,
+	// Block 0x1f, offset 0x7c0
+	0x7c0: 0x1472, 0x7c1: 0x0df6, 0x7c2: 0x14ce, 0x7c3: 0x149a, 0x7c4: 0x0f52, 0x7c5: 0x07e6,
+	0x7c6: 0x09da, 0x7c7: 0x1726, 0x7c8: 0x1726, 0x7c9: 0x0b06, 0x7ca: 0x155a, 0x7cb: 0x0a3e,
+	0x7cc: 0x0b02, 0x7cd: 0x0cea, 0x7ce: 0x10ca, 0x7cf: 0x125a, 0x7d0: 0x1392, 0x7d1: 0x13ce,
+	0x7d2: 0x1402, 0x7d3: 0x1516, 0x7d4: 0x0e6e, 0x7d5: 0x0efa, 0x7d6: 0x0fa6, 0x7d7: 0x103e,
+	0x7d8: 0x135a, 0x7d9: 0x1542, 0x7da: 0x166e, 0x7db: 0x080a, 0x7dc: 0x09ae, 0x7dd: 0x0e82,
+	0x7de: 0x0fca, 0x7df: 0x138e, 0x7e0: 0x16be, 0x7e1: 0x0bae, 0x7e2: 0x0f72, 0x7e3: 0x137e,
+	0x7e4: 0x1412, 0x7e5: 0x0d1e, 0x7e6: 0x12b6, 0x7e7: 0x13da, 0x7e8: 0x0c1a, 0x7e9: 0x0e0a,
+	0x7ea: 0x0f12, 0x7eb: 0x1016, 0x7ec: 0x1522, 0x7ed: 0x084a, 0x7ee: 0x08e2, 0x7ef: 0x094e,
+	0x7f0: 0x0d86, 0x7f1: 0x0e7a, 0x7f2: 0x0fc6, 0x7f3: 0x10ea, 0x7f4: 0x1272, 0x7f5: 0x1386,
+	0x7f6: 0x139e, 0x7f7: 0x14c2, 0x7f8: 0x15ea, 0x7f9: 0x169e, 0x7fa: 0x16ba, 0x7fb: 0x1126,
+	0x7fc: 0x1166, 0x7fd: 0x121e, 0x7fe: 0x133e, 0x7ff: 0x1576,
+	// Block 0x20, offset 0x800
+	0x800: 0x16c6, 0x801: 0x1446, 0x802: 0x0ac2, 0x803: 0x0c36, 0x804: 0x11d6, 0x805: 0x1296,
+	0x806: 0x0ffa, 0x807: 0x112e, 0x808: 0x1492, 0x809: 0x15e2, 0x80a: 0x0abe, 0x80b: 0x0b8a,
+	0x80c: 0x0e72, 0x80d: 0x0f26, 0x80e: 0x0f5a, 0x80f: 0x120e, 0x810: 0x1236, 0x811: 0x15a2,
+	0x812: 0x094a, 0x813: 0x12a2, 0x814: 0x08ee, 0x815: 0x08ea, 0x816: 0x1192, 0x817: 0x1222,
+	0x818: 0x1356, 0x819: 0x15aa, 0x81a: 0x1462, 0x81b: 0x0d22, 0x81c: 0x0e6e, 0x81d: 0x1452,
+	0x81e: 0x07f2, 0x81f: 0x0b5e, 0x820: 0x0c8e, 0x821: 0x102a, 0x822: 0x10aa, 0x823: 0x096e,
+	0x824: 0x1136, 0x825: 0x085a, 0x826: 0x0c72, 0x827: 0x07d2, 0x828: 0x0ee6, 0x829: 0x0d9e,
+	0x82a: 0x120a, 0x82b: 0x09c2, 0x82c: 0x0aae, 0x82d: 0x10f6, 0x82e: 0x135e, 0x82f: 0x1436,
+	0x830: 0x0eb2, 0x831: 0x14f2, 0x832: 0x0ede, 0x833: 0x0d32, 0x834: 0x1316, 0x835: 0x0d52,
+	0x836: 0x10a6, 0x837: 0x0826, 0x838: 0x08a2, 0x839: 0x08e6, 0x83a: 0x0e4e, 0x83b: 0x11f6,
+	0x83c: 0x12ee, 0x83d: 0x1442, 0x83e: 0x1556, 0x83f: 0x0956,
+	// Block 0x21, offset 0x840
+	0x840: 0x0a0a, 0x841: 0x0b12, 0x842: 0x0c2a, 0x843: 0x0dba, 0x844: 0x0f76, 0x845: 0x113a,
+	0x846: 0x1592, 0x847: 0x1676, 0x848: 0x16ca, 0x849: 0x16e2, 0x84a: 0x0932, 0x84b: 0x0dee,
+	0x84c: 0x0e9e, 0x84d: 0x14e6, 0x84e: 0x0bf6, 0x84f: 0x0cd2, 0x850: 0x0cee, 0x851: 0x0d7e,
+	0x852: 0x0f66, 0x853: 0x0fb2, 0x854: 0x1062, 0x855: 0x1186, 0x856: 0x122a, 0x857: 0x128e,
+	0x858: 0x14d6, 0x859: 0x1366, 0x85a: 0x14fe, 0x85b: 0x157a, 0x85c: 0x090a, 0x85d: 0x0936,
+	0x85e: 0x0a1e, 0x85f: 0x0fa2, 0x860: 0x13ee, 0x861: 0x1436, 0x862: 0x0c16, 0x863: 0x0c86,
+	0x864: 0x0d4a, 0x865: 0x0eaa, 0x866: 0x11d2, 0x867: 0x101e, 0x868: 0x0836, 0x869: 0x0a7a,
+	0x86a: 0x0b5e, 0x86b: 0x0bc2, 0x86c: 0x0c92, 0x86d: 0x103a, 0x86e: 0x1056, 0x86f: 0x1266,
+	0x870: 0x1286, 0x871: 0x155e, 0x872: 0x15de, 0x873: 0x15ee, 0x874: 0x162a, 0x875: 0x084e,
+	0x876: 0x117a, 0x877: 0x154a, 0x878: 0x15c6, 0x879: 0x0caa, 0x87a: 0x0812, 0x87b: 0x0872,
+	0x87c: 0x0b62, 0x87d: 0x0b82, 0x87e: 0x0daa, 0x87f: 0x0e6e,
+	// Block 0x22, offset 0x880
+	0x880: 0x0fbe, 0x881: 0x10c6, 0x882: 0x1372, 0x883: 0x1512, 0x884: 0x171e, 0x885: 0x0dde,
+	0x886: 0x159e, 0x887: 0x092e, 0x888: 0x0e2a, 0x889: 0x0e36, 0x88a: 0x0f0a, 0x88b: 0x0f42,
+	0x88c: 0x1046, 0x88d: 0x10a2, 0x88e: 0x1122, 0x88f: 0x1206, 0x890: 0x1636, 0x891: 0x08aa,
+	0x892: 0x0cfe, 0x893: 0x15ae, 0x894: 0x0862, 0x895: 0x0ba6, 0x896: 0x0f2a, 0x897: 0x14da,
+	0x898: 0x0c62, 0x899: 0x0cb2, 0x89a: 0x0e3e, 0x89b: 0x102a, 0x89c: 0x15b6, 0x89d: 0x0912,
+	0x89e: 0x09fa, 0x89f: 0x0b92, 0x8a0: 0x0dce, 0x8a1: 0x0e1a, 0x8a2: 0x0e5a, 0x8a3: 0x0eee,
+	0x8a4: 0x1042, 0x8a5: 0x10b6, 0x8a6: 0x1252, 0x8a7: 0x13f2, 0x8a8: 0x13fe, 0x8a9: 0x1552,
+	0x8aa: 0x15d2, 0x8ab: 0x097e, 0x8ac: 0x0f46, 0x8ad: 0x09fe, 0x8ae: 0x0fc2, 0x8af: 0x1066,
+	0x8b0: 0x1382, 0x8b1: 0x15ba, 0x8b2: 0x16a6, 0x8b3: 0x16ce, 0x8b4: 0x0e32, 0x8b5: 0x0f22,
+	0x8b6: 0x12be, 0x8b7: 0x11b2, 0x8b8: 0x11be, 0x8b9: 0x11e2, 0x8ba: 0x1012, 0x8bb: 0x0f9a,
+	0x8bc: 0x145e, 0x8bd: 0x082e, 0x8be: 0x1326, 0x8bf: 0x0916,
+	// Block 0x23, offset 0x8c0
+	0x8c0: 0x0906, 0x8c1: 0x0c06, 0x8c2: 0x0d26, 0x8c3: 0x11ee, 0x8c4: 0x0b4e, 0x8c5: 0x0efe,
+	0x8c6: 0x0dea, 0x8c7: 0x14e2, 0x8c8: 0x13e2, 0x8c9: 0x15a6, 0x8ca: 0x141e, 0x8cb: 0x0c22,
+	0x8cc: 0x0882, 0x8cd: 0x0a56, 0x8d0: 0x0aaa,
+	0x8d2: 0x0dda, 0x8d5: 0x08f2, 0x8d6: 0x101a, 0x8d7: 0x10de,
+	0x8d8: 0x1142, 0x8d9: 0x115e, 0x8da: 0x1162, 0x8db: 0x1176, 0x8dc: 0x15f6, 0x8dd: 0x11e6,
+	0x8de: 0x126a, 0x8e0: 0x138a, 0x8e2: 0x144e,
+	0x8e5: 0x1502, 0x8e6: 0x152e,
+	0x8ea: 0x164a, 0x8eb: 0x164e, 0x8ec: 0x1652, 0x8ed: 0x16b6, 0x8ee: 0x1526, 0x8ef: 0x15c2,
+	0x8f0: 0x0852, 0x8f1: 0x0876, 0x8f2: 0x088a, 0x8f3: 0x0946, 0x8f4: 0x0952, 0x8f5: 0x0992,
+	0x8f6: 0x0a46, 0x8f7: 0x0a62, 0x8f8: 0x0a6a, 0x8f9: 0x0aa6, 0x8fa: 0x0ab2, 0x8fb: 0x0b8e,
+	0x8fc: 0x0b96, 0x8fd: 0x0c9e, 0x8fe: 0x0cc6, 0x8ff: 0x0cce,
+	// Block 0x24, offset 0x900
+	0x900: 0x0ce6, 0x901: 0x0d92, 0x902: 0x0dc2, 0x903: 0x0de2, 0x904: 0x0e52, 0x905: 0x0f16,
+	0x906: 0x0f32, 0x907: 0x0f62, 0x908: 0x0fb6, 0x909: 0x0fd6, 0x90a: 0x104a, 0x90b: 0x112a,
+	0x90c: 0x1146, 0x90d: 0x114e, 0x90e: 0x114a, 0x90f: 0x1152, 0x910: 0x1156, 0x911: 0x115a,
+	0x912: 0x116e, 0x913: 0x1172, 0x914: 0x1196, 0x915: 0x11aa, 0x916: 0x11c6, 0x917: 0x122a,
+	0x918: 0x1232, 0x919: 0x123a, 0x91a: 0x124e, 0x91b: 0x1276, 0x91c: 0x12c6, 0x91d: 0x12fa,
+	0x91e: 0x12fa, 0x91f: 0x1362, 0x920: 0x140a, 0x921: 0x1422, 0x922: 0x1456, 0x923: 0x145a,
+	0x924: 0x149e, 0x925: 0x14a2, 0x926: 0x14fa, 0x927: 0x1502, 0x928: 0x15d6, 0x929: 0x161a,
+	0x92a: 0x1632, 0x92b: 0x0c96, 0x92c: 0x184b, 0x92d: 0x12de,
+	0x930: 0x07da, 0x931: 0x08de, 0x932: 0x089e, 0x933: 0x0846, 0x934: 0x0886, 0x935: 0x08b2,
+	0x936: 0x0942, 0x937: 0x095e, 0x938: 0x0a46, 0x939: 0x0a32, 0x93a: 0x0a42, 0x93b: 0x0a5e,
+	0x93c: 0x0aaa, 0x93d: 0x0aba, 0x93e: 0x0afe, 0x93f: 0x0b0a,
+	// Block 0x25, offset 0x940
+	0x940: 0x0b26, 0x941: 0x0b36, 0x942: 0x0c1e, 0x943: 0x0c26, 0x944: 0x0c56, 0x945: 0x0c76,
+	0x946: 0x0ca6, 0x947: 0x0cbe, 0x948: 0x0cae, 0x949: 0x0cce, 0x94a: 0x0cc2, 0x94b: 0x0ce6,
+	0x94c: 0x0d02, 0x94d: 0x0d5a, 0x94e: 0x0d66, 0x94f: 0x0d6e, 0x950: 0x0d96, 0x951: 0x0dda,
+	0x952: 0x0e0a, 0x953: 0x0e0e, 0x954: 0x0e22, 0x955: 0x0ea2, 0x956: 0x0eb2, 0x957: 0x0f0a,
+	0x958: 0x0f56, 0x959: 0x0f4e, 0x95a: 0x0f62, 0x95b: 0x0f7e, 0x95c: 0x0fb6, 0x95d: 0x110e,
+	0x95e: 0x0fda, 0x95f: 0x100e, 0x960: 0x101a, 0x961: 0x105a, 0x962: 0x1076, 0x963: 0x109a,
+	0x964: 0x10be, 0x965: 0x10c2, 0x966: 0x10de, 0x967: 0x10e2, 0x968: 0x10f2, 0x969: 0x1106,
+	0x96a: 0x1102, 0x96b: 0x1132, 0x96c: 0x11ae, 0x96d: 0x11c6, 0x96e: 0x11de, 0x96f: 0x1216,
+	0x970: 0x122a, 0x971: 0x1246, 0x972: 0x1276, 0x973: 0x132a, 0x974: 0x1352, 0x975: 0x13c6,
+	0x976: 0x140e, 0x977: 0x141a, 0x978: 0x1422, 0x979: 0x143a, 0x97a: 0x144e, 0x97b: 0x143e,
+	0x97c: 0x1456, 0x97d: 0x1452, 0x97e: 0x144a, 0x97f: 0x145a,
+	// Block 0x26, offset 0x980
+	0x980: 0x1466, 0x981: 0x14a2, 0x982: 0x14de, 0x983: 0x150e, 0x984: 0x1546, 0x985: 0x1566,
+	0x986: 0x15b2, 0x987: 0x15d6, 0x988: 0x15f6, 0x989: 0x160a, 0x98a: 0x161a, 0x98b: 0x1626,
+	0x98c: 0x1632, 0x98d: 0x1686, 0x98e: 0x1726, 0x98f: 0x17e2, 0x990: 0x17dd, 0x991: 0x180f,
+	0x992: 0x0702, 0x993: 0x072a, 0x994: 0x072e, 0x995: 0x1891, 0x996: 0x18be, 0x997: 0x1936,
+	0x998: 0x1712, 0x999: 0x1722,
+	// Block 0x27, offset 0x9c0
+	0x9c0: 0x07f6, 0x9c1: 0x07ee, 0x9c2: 0x07fe, 0x9c3: 0x1774, 0x9c4: 0x0842, 0x9c5: 0x0852,
+	0x9c6: 0x0856, 0x9c7: 0x085e, 0x9c8: 0x0866, 0x9c9: 0x086a, 0x9ca: 0x0876, 0x9cb: 0x086e,
+	0x9cc: 0x06ae, 0x9cd: 0x1788, 0x9ce: 0x088a, 0x9cf: 0x088e, 0x9d0: 0x0892, 0x9d1: 0x08ae,
+	0x9d2: 0x1779, 0x9d3: 0x06b2, 0x9d4: 0x089a, 0x9d5: 0x08ba, 0x9d6: 0x1783, 0x9d7: 0x08ca,
+	0x9d8: 0x08d2, 0x9d9: 0x0832, 0x9da: 0x08da, 0x9db: 0x08de, 0x9dc: 0x195e, 0x9dd: 0x08fa,
+	0x9de: 0x0902, 0x9df: 0x06ba, 0x9e0: 0x091a, 0x9e1: 0x091e, 0x9e2: 0x0926, 0x9e3: 0x092a,
+	0x9e4: 0x06be, 0x9e5: 0x0942, 0x9e6: 0x0946, 0x9e7: 0x0952, 0x9e8: 0x095e, 0x9e9: 0x0962,
+	0x9ea: 0x0966, 0x9eb: 0x096e, 0x9ec: 0x098e, 0x9ed: 0x0992, 0x9ee: 0x099a, 0x9ef: 0x09aa,
+	0x9f0: 0x09b2, 0x9f1: 0x09b6, 0x9f2: 0x09b6, 0x9f3: 0x09b6, 0x9f4: 0x1797, 0x9f5: 0x0f8e,
+	0x9f6: 0x09ca, 0x9f7: 0x09d2, 0x9f8: 0x179c, 0x9f9: 0x09de, 0x9fa: 0x09e6, 0x9fb: 0x09ee,
+	0x9fc: 0x0a16, 0x9fd: 0x0a02, 0x9fe: 0x0a0e, 0x9ff: 0x0a12,
+	// Block 0x28, offset 0xa00
+	0xa00: 0x0a1a, 0xa01: 0x0a22, 0xa02: 0x0a26, 0xa03: 0x0a2e, 0xa04: 0x0a36, 0xa05: 0x0a3a,
+	0xa06: 0x0a3a, 0xa07: 0x0a42, 0xa08: 0x0a4a, 0xa09: 0x0a4e, 0xa0a: 0x0a5a, 0xa0b: 0x0a7e,
+	0xa0c: 0x0a62, 0xa0d: 0x0a82, 0xa0e: 0x0a66, 0xa0f: 0x0a6e, 0xa10: 0x0906, 0xa11: 0x0aca,
+	0xa12: 0x0a92, 0xa13: 0x0a96, 0xa14: 0x0a9a, 0xa15: 0x0a8e, 0xa16: 0x0aa2, 0xa17: 0x0a9e,
+	0xa18: 0x0ab6, 0xa19: 0x17a1, 0xa1a: 0x0ad2, 0xa1b: 0x0ad6, 0xa1c: 0x0ade, 0xa1d: 0x0aea,
+	0xa1e: 0x0af2, 0xa1f: 0x0b0e, 0xa20: 0x17a6, 0xa21: 0x17ab, 0xa22: 0x0b1a, 0xa23: 0x0b1e,
+	0xa24: 0x0b22, 0xa25: 0x0b16, 0xa26: 0x0b2a, 0xa27: 0x06c2, 0xa28: 0x06c6, 0xa29: 0x0b32,
+	0xa2a: 0x0b3a, 0xa2b: 0x0b3a, 0xa2c: 0x17b0, 0xa2d: 0x0b56, 0xa2e: 0x0b5a, 0xa2f: 0x0b5e,
+	0xa30: 0x0b66, 0xa31: 0x17b5, 0xa32: 0x0b6e, 0xa33: 0x0b72, 0xa34: 0x0c4a, 0xa35: 0x0b7a,
+	0xa36: 0x06ca, 0xa37: 0x0b86, 0xa38: 0x0b96, 0xa39: 0x0ba2, 0xa3a: 0x0b9e, 0xa3b: 0x17bf,
+	0xa3c: 0x0baa, 0xa3d: 0x17c4, 0xa3e: 0x0bb6, 0xa3f: 0x0bb2,
+	// Block 0x29, offset 0xa40
+	0xa40: 0x0bba, 0xa41: 0x0bca, 0xa42: 0x0bce, 0xa43: 0x06ce, 0xa44: 0x0bde, 0xa45: 0x0be6,
+	0xa46: 0x0bea, 0xa47: 0x0bee, 0xa48: 0x06d2, 0xa49: 0x17c9, 0xa4a: 0x06d6, 0xa4b: 0x0c0a,
+	0xa4c: 0x0c0e, 0xa4d: 0x0c12, 0xa4e: 0x0c1a, 0xa4f: 0x1990, 0xa50: 0x0c32, 0xa51: 0x17d3,
+	0xa52: 0x17d3, 0xa53: 0x12d2, 0xa54: 0x0c42, 0xa55: 0x0c42, 0xa56: 0x06da, 0xa57: 0x17f6,
+	0xa58: 0x18c8, 0xa59: 0x0c52, 0xa5a: 0x0c5a, 0xa5b: 0x06de, 0xa5c: 0x0c6e, 0xa5d: 0x0c7e,
+	0xa5e: 0x0c82, 0xa5f: 0x0c8a, 0xa60: 0x0c9a, 0xa61: 0x06e6, 0xa62: 0x06e2, 0xa63: 0x0c9e,
+	0xa64: 0x17d8, 0xa65: 0x0ca2, 0xa66: 0x0cb6, 0xa67: 0x0cba, 0xa68: 0x0cbe, 0xa69: 0x0cba,
+	0xa6a: 0x0cca, 0xa6b: 0x0cce, 0xa6c: 0x0cde, 0xa6d: 0x0cd6, 0xa6e: 0x0cda, 0xa6f: 0x0ce2,
+	0xa70: 0x0ce6, 0xa71: 0x0cea, 0xa72: 0x0cf6, 0xa73: 0x0cfa, 0xa74: 0x0d12, 0xa75: 0x0d1a,
+	0xa76: 0x0d2a, 0xa77: 0x0d3e, 0xa78: 0x17e7, 0xa79: 0x0d3a, 0xa7a: 0x0d2e, 0xa7b: 0x0d46,
+	0xa7c: 0x0d4e, 0xa7d: 0x0d62, 0xa7e: 0x17ec, 0xa7f: 0x0d6a,
+	// Block 0x2a, offset 0xa80
+	0xa80: 0x0d5e, 0xa81: 0x0d56, 0xa82: 0x06ea, 0xa83: 0x0d72, 0xa84: 0x0d7a, 0xa85: 0x0d82,
+	0xa86: 0x0d76, 0xa87: 0x06ee, 0xa88: 0x0d92, 0xa89: 0x0d9a, 0xa8a: 0x17f1, 0xa8b: 0x0dc6,
+	0xa8c: 0x0dfa, 0xa8d: 0x0dd6, 0xa8e: 0x06fa, 0xa8f: 0x0de2, 0xa90: 0x06f6, 0xa91: 0x06f2,
+	0xa92: 0x08be, 0xa93: 0x08c2, 0xa94: 0x0dfe, 0xa95: 0x0de6, 0xa96: 0x12a6, 0xa97: 0x075e,
+	0xa98: 0x0e0a, 0xa99: 0x0e0e, 0xa9a: 0x0e12, 0xa9b: 0x0e26, 0xa9c: 0x0e1e, 0xa9d: 0x180a,
+	0xa9e: 0x06fe, 0xa9f: 0x0e3a, 0xaa0: 0x0e2e, 0xaa1: 0x0e4a, 0xaa2: 0x0e52, 0xaa3: 0x1814,
+	0xaa4: 0x0e56, 0xaa5: 0x0e42, 0xaa6: 0x0e5e, 0xaa7: 0x0702, 0xaa8: 0x0e62, 0xaa9: 0x0e66,
+	0xaaa: 0x0e6a, 0xaab: 0x0e76, 0xaac: 0x1819, 0xaad: 0x0e7e, 0xaae: 0x0706, 0xaaf: 0x0e8a,
+	0xab0: 0x181e, 0xab1: 0x0e8e, 0xab2: 0x070a, 0xab3: 0x0e9a, 0xab4: 0x0ea6, 0xab5: 0x0eb2,
+	0xab6: 0x0eb6, 0xab7: 0x1823, 0xab8: 0x17ba, 0xab9: 0x1828, 0xaba: 0x0ed6, 0xabb: 0x182d,
+	0xabc: 0x0ee2, 0xabd: 0x0eea, 0xabe: 0x0eda, 0xabf: 0x0ef6,
+	// Block 0x2b, offset 0xac0
+	0xac0: 0x0f06, 0xac1: 0x0f16, 0xac2: 0x0f0a, 0xac3: 0x0f0e, 0xac4: 0x0f1a, 0xac5: 0x0f1e,
+	0xac6: 0x1832, 0xac7: 0x0f02, 0xac8: 0x0f36, 0xac9: 0x0f3a, 0xaca: 0x070e, 0xacb: 0x0f4e,
+	0xacc: 0x0f4a, 0xacd: 0x1837, 0xace: 0x0f2e, 0xacf: 0x0f6a, 0xad0: 0x183c, 0xad1: 0x1841,
+	0xad2: 0x0f6e, 0xad3: 0x0f82, 0xad4: 0x0f7e, 0xad5: 0x0f7a, 0xad6: 0x0712, 0xad7: 0x0f86,
+	0xad8: 0x0f96, 0xad9: 0x0f92, 0xada: 0x0f9e, 0xadb: 0x177e, 0xadc: 0x0fae, 0xadd: 0x1846,
+	0xade: 0x0fba, 0xadf: 0x1850, 0xae0: 0x0fce, 0xae1: 0x0fda, 0xae2: 0x0fee, 0xae3: 0x1855,
+	0xae4: 0x1002, 0xae5: 0x1006, 0xae6: 0x185a, 0xae7: 0x185f, 0xae8: 0x1022, 0xae9: 0x1032,
+	0xaea: 0x0716, 0xaeb: 0x1036, 0xaec: 0x071a, 0xaed: 0x071a, 0xaee: 0x104e, 0xaef: 0x1052,
+	0xaf0: 0x105a, 0xaf1: 0x105e, 0xaf2: 0x106a, 0xaf3: 0x071e, 0xaf4: 0x1082, 0xaf5: 0x1864,
+	0xaf6: 0x109e, 0xaf7: 0x1869, 0xaf8: 0x10aa, 0xaf9: 0x17ce, 0xafa: 0x10ba, 0xafb: 0x186e,
+	0xafc: 0x1873, 0xafd: 0x1878, 0xafe: 0x0722, 0xaff: 0x0726,
+	// Block 0x2c, offset 0xb00
+	0xb00: 0x10f2, 0xb01: 0x1882, 0xb02: 0x187d, 0xb03: 0x1887, 0xb04: 0x188c, 0xb05: 0x10fa,
+	0xb06: 0x10fe, 0xb07: 0x10fe, 0xb08: 0x1106, 0xb09: 0x072e, 0xb0a: 0x110a, 0xb0b: 0x0732,
+	0xb0c: 0x0736, 0xb0d: 0x1896, 0xb0e: 0x111e, 0xb0f: 0x1126, 0xb10: 0x1132, 0xb11: 0x073a,
+	0xb12: 0x189b, 0xb13: 0x1156, 0xb14: 0x18a0, 0xb15: 0x18a5, 0xb16: 0x1176, 0xb17: 0x118e,
+	0xb18: 0x073e, 0xb19: 0x1196, 0xb1a: 0x119a, 0xb1b: 0x119e, 0xb1c: 0x18aa, 0xb1d: 0x18af,
+	0xb1e: 0x18af, 0xb1f: 0x11b6, 0xb20: 0x0742, 0xb21: 0x18b4, 0xb22: 0x11ca, 0xb23: 0x11ce,
+	0xb24: 0x0746, 0xb25: 0x18b9, 0xb26: 0x11ea, 0xb27: 0x074a, 0xb28: 0x11fa, 0xb29: 0x11f2,
+	0xb2a: 0x1202, 0xb2b: 0x18c3, 0xb2c: 0x121a, 0xb2d: 0x074e, 0xb2e: 0x1226, 0xb2f: 0x122e,
+	0xb30: 0x123e, 0xb31: 0x0752, 0xb32: 0x18cd, 0xb33: 0x18d2, 0xb34: 0x0756, 0xb35: 0x18d7,
+	0xb36: 0x1256, 0xb37: 0x18dc, 0xb38: 0x1262, 0xb39: 0x126e, 0xb3a: 0x1276, 0xb3b: 0x18e1,
+	0xb3c: 0x18e6, 0xb3d: 0x128a, 0xb3e: 0x18eb, 0xb3f: 0x1292,
+	// Block 0x2d, offset 0xb40
+	0xb40: 0x17fb, 0xb41: 0x075a, 0xb42: 0x12aa, 0xb43: 0x12ae, 0xb44: 0x0762, 0xb45: 0x12b2,
+	0xb46: 0x0b2e, 0xb47: 0x18f0, 0xb48: 0x18f5, 0xb49: 0x1800, 0xb4a: 0x1805, 0xb4b: 0x12d2,
+	0xb4c: 0x12d6, 0xb4d: 0x14ee, 0xb4e: 0x0766, 0xb4f: 0x1302, 0xb50: 0x12fe, 0xb51: 0x1306,
+	0xb52: 0x093a, 0xb53: 0x130a, 0xb54: 0x130e, 0xb55: 0x1312, 0xb56: 0x131a, 0xb57: 0x18fa,
+	0xb58: 0x1316, 0xb59: 0x131e, 0xb5a: 0x1332, 0xb5b: 0x1336, 0xb5c: 0x1322, 0xb5d: 0x133a,
+	0xb5e: 0x134e, 0xb5f: 0x1362, 0xb60: 0x132e, 0xb61: 0x1342, 0xb62: 0x1346, 0xb63: 0x134a,
+	0xb64: 0x18ff, 0xb65: 0x1909, 0xb66: 0x1904, 0xb67: 0x076a, 0xb68: 0x136a, 0xb69: 0x136e,
+	0xb6a: 0x1376, 0xb6b: 0x191d, 0xb6c: 0x137a, 0xb6d: 0x190e, 0xb6e: 0x076e, 0xb6f: 0x0772,
+	0xb70: 0x1913, 0xb71: 0x1918, 0xb72: 0x0776, 0xb73: 0x139a, 0xb74: 0x139e, 0xb75: 0x13a2,
+	0xb76: 0x13a6, 0xb77: 0x13b2, 0xb78: 0x13ae, 0xb79: 0x13ba, 0xb7a: 0x13b6, 0xb7b: 0x13c6,
+	0xb7c: 0x13be, 0xb7d: 0x13c2, 0xb7e: 0x13ca, 0xb7f: 0x077a,
+	// Block 0x2e, offset 0xb80
+	0xb80: 0x13d2, 0xb81: 0x13d6, 0xb82: 0x077e, 0xb83: 0x13e6, 0xb84: 0x13ea, 0xb85: 0x1922,
+	0xb86: 0x13f6, 0xb87: 0x13fa, 0xb88: 0x0782, 0xb89: 0x1406, 0xb8a: 0x06b6, 0xb8b: 0x1927,
+	0xb8c: 0x192c, 0xb8d: 0x0786, 0xb8e: 0x078a, 0xb8f: 0x1432, 0xb90: 0x144a, 0xb91: 0x1466,
+	0xb92: 0x1476, 0xb93: 0x1931, 0xb94: 0x148a, 0xb95: 0x148e, 0xb96: 0x14a6, 0xb97: 0x14b2,
+	0xb98: 0x193b, 0xb99: 0x178d, 0xb9a: 0x14be, 0xb9b: 0x14ba, 0xb9c: 0x14c6, 0xb9d: 0x1792,
+	0xb9e: 0x14d2, 0xb9f: 0x14de, 0xba0: 0x1940, 0xba1: 0x1945, 0xba2: 0x151e, 0xba3: 0x152a,
+	0xba4: 0x1532, 0xba5: 0x194a, 0xba6: 0x1536, 0xba7: 0x1562, 0xba8: 0x156e, 0xba9: 0x1572,
+	0xbaa: 0x156a, 0xbab: 0x157e, 0xbac: 0x1582, 0xbad: 0x194f, 0xbae: 0x158e, 0xbaf: 0x078e,
+	0xbb0: 0x1596, 0xbb1: 0x1954, 0xbb2: 0x0792, 0xbb3: 0x15ce, 0xbb4: 0x0bbe, 0xbb5: 0x15e6,
+	0xbb6: 0x1959, 0xbb7: 0x1963, 0xbb8: 0x0796, 0xbb9: 0x079a, 0xbba: 0x160e, 0xbbb: 0x1968,
+	0xbbc: 0x079e, 0xbbd: 0x196d, 0xbbe: 0x1626, 0xbbf: 0x1626,
+	// Block 0x2f, offset 0xbc0
+	0xbc0: 0x162e, 0xbc1: 0x1972, 0xbc2: 0x1646, 0xbc3: 0x07a2, 0xbc4: 0x1656, 0xbc5: 0x1662,
+	0xbc6: 0x166a, 0xbc7: 0x1672, 0xbc8: 0x07a6, 0xbc9: 0x1977, 0xbca: 0x1686, 0xbcb: 0x16a2,
+	0xbcc: 0x16ae, 0xbcd: 0x07aa, 0xbce: 0x07ae, 0xbcf: 0x16b2, 0xbd0: 0x197c, 0xbd1: 0x07b2,
+	0xbd2: 0x1981, 0xbd3: 0x1986, 0xbd4: 0x198b, 0xbd5: 0x16d6, 0xbd6: 0x07b6, 0xbd7: 0x16ea,
+	0xbd8: 0x16f2, 0xbd9: 0x16f6, 0xbda: 0x16fe, 0xbdb: 0x1706, 0xbdc: 0x170e, 0xbdd: 0x1995,
+}
+
+// nfcIndex: 22 blocks, 1408 entries, 1408 bytes
+// Block 0 is the zero block.
+var nfcIndex = [1408]uint8{
+	// Block 0x0, offset 0x0
+	// Block 0x1, offset 0x40
+	// Block 0x2, offset 0x80
+	// Block 0x3, offset 0xc0
+	0xc2: 0x2e, 0xc3: 0x01, 0xc4: 0x02, 0xc5: 0x03, 0xc6: 0x2f, 0xc7: 0x04,
+	0xc8: 0x05, 0xca: 0x30, 0xcb: 0x31, 0xcc: 0x06, 0xcd: 0x07, 0xce: 0x08, 0xcf: 0x32,
+	0xd0: 0x09, 0xd1: 0x33, 0xd2: 0x34, 0xd3: 0x0a, 0xd6: 0x0b, 0xd7: 0x35,
+	0xd8: 0x36, 0xd9: 0x0c, 0xdb: 0x37, 0xdc: 0x38, 0xdd: 0x39, 0xdf: 0x3a,
+	0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05,
+	0xea: 0x06, 0xeb: 0x07, 0xec: 0x08, 0xed: 0x09, 0xef: 0x0a,
+	0xf0: 0x13,
+	// Block 0x4, offset 0x100
+	0x120: 0x3b, 0x121: 0x3c, 0x122: 0x3d, 0x123: 0x0d, 0x124: 0x3e, 0x125: 0x3f, 0x126: 0x40, 0x127: 0x41,
+	0x128: 0x42, 0x129: 0x43, 0x12a: 0x44, 0x12b: 0x45, 0x12c: 0x40, 0x12d: 0x46, 0x12e: 0x47, 0x12f: 0x48,
+	0x130: 0x44, 0x131: 0x49, 0x132: 0x4a, 0x133: 0x4b, 0x134: 0x4c, 0x135: 0x4d, 0x137: 0x4e,
+	0x138: 0x4f, 0x139: 0x50, 0x13a: 0x51, 0x13b: 0x52, 0x13c: 0x53, 0x13d: 0x54, 0x13e: 0x55, 0x13f: 0x56,
+	// Block 0x5, offset 0x140
+	0x140: 0x57, 0x142: 0x58, 0x144: 0x59, 0x145: 0x5a, 0x146: 0x5b, 0x147: 0x5c,
+	0x14d: 0x5d,
+	0x15c: 0x5e, 0x15f: 0x5f,
+	0x162: 0x60, 0x164: 0x61,
+	0x168: 0x62, 0x169: 0x63, 0x16a: 0x64, 0x16b: 0x65, 0x16c: 0x0e, 0x16d: 0x66, 0x16e: 0x67, 0x16f: 0x68,
+	0x170: 0x69, 0x173: 0x6a, 0x177: 0x0f,
+	0x178: 0x10, 0x179: 0x11, 0x17a: 0x12, 0x17b: 0x13, 0x17c: 0x14, 0x17d: 0x15, 0x17e: 0x16, 0x17f: 0x17,
+	// Block 0x6, offset 0x180
+	0x180: 0x6b, 0x183: 0x6c, 0x184: 0x6d, 0x186: 0x6e, 0x187: 0x6f,
+	0x188: 0x70, 0x189: 0x18, 0x18a: 0x19, 0x18b: 0x71, 0x18c: 0x72,
+	0x1ab: 0x73,
+	0x1b3: 0x74, 0x1b5: 0x75, 0x1b7: 0x76,
+	// Block 0x7, offset 0x1c0
+	0x1c0: 0x77, 0x1c1: 0x1a, 0x1c2: 0x1b, 0x1c3: 0x1c, 0x1c4: 0x78, 0x1c5: 0x79,
+	0x1c9: 0x7a, 0x1cc: 0x7b, 0x1cd: 0x7c,
+	// Block 0x8, offset 0x200
+	0x219: 0x7d, 0x21a: 0x7e, 0x21b: 0x7f,
+	0x220: 0x80, 0x223: 0x81, 0x224: 0x82, 0x225: 0x83, 0x226: 0x84, 0x227: 0x85,
+	0x22a: 0x86, 0x22b: 0x87, 0x22f: 0x88,
+	0x230: 0x89, 0x231: 0x8a, 0x232: 0x8b, 0x233: 0x8c, 0x234: 0x8d, 0x235: 0x8e, 0x236: 0x8f, 0x237: 0x89,
+	0x238: 0x8a, 0x239: 0x8b, 0x23a: 0x8c, 0x23b: 0x8d, 0x23c: 0x8e, 0x23d: 0x8f, 0x23e: 0x89, 0x23f: 0x8a,
+	// Block 0x9, offset 0x240
+	0x240: 0x8b, 0x241: 0x8c, 0x242: 0x8d, 0x243: 0x8e, 0x244: 0x8f, 0x245: 0x89, 0x246: 0x8a, 0x247: 0x8b,
+	0x248: 0x8c, 0x249: 0x8d, 0x24a: 0x8e, 0x24b: 0x8f, 0x24c: 0x89, 0x24d: 0x8a, 0x24e: 0x8b, 0x24f: 0x8c,
+	0x250: 0x8d, 0x251: 0x8e, 0x252: 0x8f, 0x253: 0x89, 0x254: 0x8a, 0x255: 0x8b, 0x256: 0x8c, 0x257: 0x8d,
+	0x258: 0x8e, 0x259: 0x8f, 0x25a: 0x89, 0x25b: 0x8a, 0x25c: 0x8b, 0x25d: 0x8c, 0x25e: 0x8d, 0x25f: 0x8e,
+	0x260: 0x8f, 0x261: 0x89, 0x262: 0x8a, 0x263: 0x8b, 0x264: 0x8c, 0x265: 0x8d, 0x266: 0x8e, 0x267: 0x8f,
+	0x268: 0x89, 0x269: 0x8a, 0x26a: 0x8b, 0x26b: 0x8c, 0x26c: 0x8d, 0x26d: 0x8e, 0x26e: 0x8f, 0x26f: 0x89,
+	0x270: 0x8a, 0x271: 0x8b, 0x272: 0x8c, 0x273: 0x8d, 0x274: 0x8e, 0x275: 0x8f, 0x276: 0x89, 0x277: 0x8a,
+	0x278: 0x8b, 0x279: 0x8c, 0x27a: 0x8d, 0x27b: 0x8e, 0x27c: 0x8f, 0x27d: 0x89, 0x27e: 0x8a, 0x27f: 0x8b,
+	// Block 0xa, offset 0x280
+	0x280: 0x8c, 0x281: 0x8d, 0x282: 0x8e, 0x283: 0x8f, 0x284: 0x89, 0x285: 0x8a, 0x286: 0x8b, 0x287: 0x8c,
+	0x288: 0x8d, 0x289: 0x8e, 0x28a: 0x8f, 0x28b: 0x89, 0x28c: 0x8a, 0x28d: 0x8b, 0x28e: 0x8c, 0x28f: 0x8d,
+	0x290: 0x8e, 0x291: 0x8f, 0x292: 0x89, 0x293: 0x8a, 0x294: 0x8b, 0x295: 0x8c, 0x296: 0x8d, 0x297: 0x8e,
+	0x298: 0x8f, 0x299: 0x89, 0x29a: 0x8a, 0x29b: 0x8b, 0x29c: 0x8c, 0x29d: 0x8d, 0x29e: 0x8e, 0x29f: 0x8f,
+	0x2a0: 0x89, 0x2a1: 0x8a, 0x2a2: 0x8b, 0x2a3: 0x8c, 0x2a4: 0x8d, 0x2a5: 0x8e, 0x2a6: 0x8f, 0x2a7: 0x89,
+	0x2a8: 0x8a, 0x2a9: 0x8b, 0x2aa: 0x8c, 0x2ab: 0x8d, 0x2ac: 0x8e, 0x2ad: 0x8f, 0x2ae: 0x89, 0x2af: 0x8a,
+	0x2b0: 0x8b, 0x2b1: 0x8c, 0x2b2: 0x8d, 0x2b3: 0x8e, 0x2b4: 0x8f, 0x2b5: 0x89, 0x2b6: 0x8a, 0x2b7: 0x8b,
+	0x2b8: 0x8c, 0x2b9: 0x8d, 0x2ba: 0x8e, 0x2bb: 0x8f, 0x2bc: 0x89, 0x2bd: 0x8a, 0x2be: 0x8b, 0x2bf: 0x8c,
+	// Block 0xb, offset 0x2c0
+	0x2c0: 0x8d, 0x2c1: 0x8e, 0x2c2: 0x8f, 0x2c3: 0x89, 0x2c4: 0x8a, 0x2c5: 0x8b, 0x2c6: 0x8c, 0x2c7: 0x8d,
+	0x2c8: 0x8e, 0x2c9: 0x8f, 0x2ca: 0x89, 0x2cb: 0x8a, 0x2cc: 0x8b, 0x2cd: 0x8c, 0x2ce: 0x8d, 0x2cf: 0x8e,
+	0x2d0: 0x8f, 0x2d1: 0x89, 0x2d2: 0x8a, 0x2d3: 0x8b, 0x2d4: 0x8c, 0x2d5: 0x8d, 0x2d6: 0x8e, 0x2d7: 0x8f,
+	0x2d8: 0x89, 0x2d9: 0x8a, 0x2da: 0x8b, 0x2db: 0x8c, 0x2dc: 0x8d, 0x2dd: 0x8e, 0x2de: 0x90,
+	// Block 0xc, offset 0x300
+	0x324: 0x1d, 0x325: 0x1e, 0x326: 0x1f, 0x327: 0x20,
+	0x328: 0x21, 0x329: 0x22, 0x32a: 0x23, 0x32b: 0x24, 0x32c: 0x91, 0x32d: 0x92, 0x32e: 0x93,
+	0x331: 0x94, 0x332: 0x95, 0x333: 0x96, 0x334: 0x97,
+	0x338: 0x98, 0x339: 0x99, 0x33a: 0x9a, 0x33b: 0x9b, 0x33e: 0x9c, 0x33f: 0x9d,
+	// Block 0xd, offset 0x340
+	0x347: 0x9e,
+	0x34b: 0x9f, 0x34d: 0xa0,
+	0x368: 0xa1, 0x36b: 0xa2,
+	0x374: 0xa3,
+	0x37a: 0xa4, 0x37b: 0xa5, 0x37d: 0xa6, 0x37e: 0xa7,
+	// Block 0xe, offset 0x380
+	0x381: 0xa8, 0x382: 0xa9, 0x384: 0xaa, 0x385: 0x84, 0x387: 0xab,
+	0x388: 0xac, 0x38b: 0xad, 0x38c: 0xae, 0x38d: 0xaf,
+	0x391: 0xb0, 0x392: 0xb1, 0x393: 0xb2, 0x396: 0xb3, 0x397: 0xb4,
+	0x398: 0x75, 0x39a: 0xb5, 0x39c: 0xb6,
+	0x3a0: 0xb7, 0x3a4: 0xb8, 0x3a5: 0xb9, 0x3a7: 0xba,
+	0x3a8: 0xbb, 0x3a9: 0xbc, 0x3aa: 0xbd,
+	0x3b0: 0x75, 0x3b5: 0xbe, 0x3b6: 0xbf,
+	0x3bd: 0xc0,
+	// Block 0xf, offset 0x3c0
+	0x3eb: 0xc1, 0x3ec: 0xc2,
+	0x3ff: 0xc3,
+	// Block 0x10, offset 0x400
+	0x432: 0xc4,
+	// Block 0x11, offset 0x440
+	0x445: 0xc5, 0x446: 0xc6, 0x447: 0xc7,
+	0x449: 0xc8,
+	// Block 0x12, offset 0x480
+	0x480: 0xc9, 0x482: 0xca, 0x484: 0xc2,
+	0x48a: 0xcb, 0x48b: 0xcc,
+	0x493: 0xcd,
+	0x4a3: 0xce, 0x4a5: 0xcf,
+	// Block 0x13, offset 0x4c0
+	0x4c8: 0xd0,
+	// Block 0x14, offset 0x500
+	0x520: 0x25, 0x521: 0x26, 0x522: 0x27, 0x523: 0x28, 0x524: 0x29, 0x525: 0x2a, 0x526: 0x2b, 0x527: 0x2c,
+	0x528: 0x2d,
+	// Block 0x15, offset 0x540
+	0x550: 0x0b, 0x551: 0x0c, 0x556: 0x0d,
+	0x55b: 0x0e, 0x55d: 0x0f, 0x55e: 0x10, 0x55f: 0x11,
+	0x56f: 0x12,
+}
+
+// nfcSparseOffset: 163 entries, 326 bytes
+var nfcSparseOffset = []uint16{0x0, 0x5, 0x9, 0xb, 0xd, 0x18, 0x28, 0x2a, 0x2f, 0x3a, 0x49, 0x56, 0x5e, 0x63, 0x68, 0x6a, 0x6e, 0x76, 0x7d, 0x80, 0x88, 0x8c, 0x90, 0x92, 0x94, 0x9d, 0xa1, 0xa8, 0xad, 0xb0, 0xba, 0xbd, 0xc4, 0xcc, 0xcf, 0xd1, 0xd4, 0xd6, 0xdb, 0xec, 0xf8, 0xfa, 0x100, 0x102, 0x104, 0x106, 0x108, 0x10a, 0x10c, 0x10f, 0x112, 0x114, 0x117, 0x11a, 0x11e, 0x124, 0x12b, 0x134, 0x136, 0x139, 0x13b, 0x146, 0x14a, 0x158, 0x15b, 0x161, 0x167, 0x172, 0x176, 0x178, 0x17a, 0x17c, 0x17e, 0x180, 0x186, 0x18a, 0x18c, 0x18e, 0x196, 0x19a, 0x19d, 0x19f, 0x1a1, 0x1a4, 0x1a7, 0x1a9, 0x1ab, 0x1ad, 0x1af, 0x1b5, 0x1b8, 0x1ba, 0x1c1, 0x1c7, 0x1cd, 0x1d5, 0x1db, 0x1e1, 0x1e7, 0x1eb, 0x1f9, 0x202, 0x205, 0x208, 0x20a, 0x20d, 0x20f, 0x213, 0x218, 0x21a, 0x21c, 0x221, 0x227, 0x229, 0x22b, 0x22d, 0x233, 0x236, 0x238, 0x23a, 0x23c, 0x242, 0x246, 0x24a, 0x252, 0x259, 0x25c, 0x25f, 0x261, 0x264, 0x26c, 0x270, 0x277, 0x27a, 0x280, 0x282, 0x285, 0x287, 0x28a, 0x28f, 0x291, 0x293, 0x295, 0x297, 0x299, 0x29c, 0x29e, 0x2a0, 0x2a2, 0x2a4, 0x2a6, 0x2a8, 0x2b5, 0x2bf, 0x2c1, 0x2c3, 0x2c9, 0x2cb, 0x2cd, 0x2cf, 0x2d3, 0x2d5, 0x2d8}
+
+// nfcSparseValues: 730 entries, 2920 bytes
+var nfcSparseValues = [730]valueRange{
+	// Block 0x0, offset 0x0
+	{value: 0x0000, lo: 0x04},
+	{value: 0xa100, lo: 0xa8, hi: 0xa8},
+	{value: 0x8100, lo: 0xaf, hi: 0xaf},
+	{value: 0x8100, lo: 0xb4, hi: 0xb4},
+	{value: 0x8100, lo: 0xb8, hi: 0xb8},
+	// Block 0x1, offset 0x5
+	{value: 0x0091, lo: 0x03},
+	{value: 0x4823, lo: 0xa0, hi: 0xa1},
+	{value: 0x4855, lo: 0xaf, hi: 0xb0},
+	{value: 0xa000, lo: 0xb7, hi: 0xb7},
+	// Block 0x2, offset 0x9
+	{value: 0x0000, lo: 0x01},
+	{value: 0xa000, lo: 0x92, hi: 0x92},
+	// Block 0x3, offset 0xb
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8100, lo: 0x98, hi: 0x9d},
+	// Block 0x4, offset 0xd
+	{value: 0x0006, lo: 0x0a},
+	{value: 0xa000, lo: 0x81, hi: 0x81},
+	{value: 0xa000, lo: 0x85, hi: 0x85},
+	{value: 0xa000, lo: 0x89, hi: 0x89},
+	{value: 0x4981, lo: 0x8a, hi: 0x8a},
+	{value: 0x499f, lo: 0x8b, hi: 0x8b},
+	{value: 0x3808, lo: 0x8c, hi: 0x8c},
+	{value: 0x3820, lo: 0x8d, hi: 0x8d},
+	{value: 0x49b7, lo: 0x8e, hi: 0x8e},
+	{value: 0xa000, lo: 0x92, hi: 0x92},
+	{value: 0x383e, lo: 0x93, hi: 0x94},
+	// Block 0x5, offset 0x18
+	{value: 0x0000, lo: 0x0f},
+	{value: 0xa000, lo: 0x83, hi: 0x83},
+	{value: 0xa000, lo: 0x87, hi: 0x87},
+	{value: 0xa000, lo: 0x8b, hi: 0x8b},
+	{value: 0xa000, lo: 0x8d, hi: 0x8d},
+	{value: 0x38e6, lo: 0x90, hi: 0x90},
+	{value: 0x38f2, lo: 0x91, hi: 0x91},
+	{value: 0x38e0, lo: 0x93, hi: 0x93},
+	{value: 0xa000, lo: 0x96, hi: 0x96},
+	{value: 0x3958, lo: 0x97, hi: 0x97},
+	{value: 0x3922, lo: 0x9c, hi: 0x9c},
+	{value: 0x390a, lo: 0x9d, hi: 0x9d},
+	{value: 0x3934, lo: 0x9e, hi: 0x9e},
+	{value: 0xa000, lo: 0xb4, hi: 0xb5},
+	{value: 0x395e, lo: 0xb6, hi: 0xb6},
+	{value: 0x3964, lo: 0xb7, hi: 0xb7},
+	// Block 0x6, offset 0x28
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8133, lo: 0x83, hi: 0x87},
+	// Block 0x7, offset 0x2a
+	{value: 0x0001, lo: 0x04},
+	{value: 0x8114, lo: 0x81, hi: 0x82},
+	{value: 0x8133, lo: 0x84, hi: 0x84},
+	{value: 0x812e, lo: 0x85, hi: 0x85},
+	{value: 0x810e, lo: 0x87, hi: 0x87},
+	// Block 0x8, offset 0x2f
+	{value: 0x0000, lo: 0x0a},
+	{value: 0x8133, lo: 0x90, hi: 0x97},
+	{value: 0x811a, lo: 0x98, hi: 0x98},
+	{value: 0x811b, lo: 0x99, hi: 0x99},
+	{value: 0x811c, lo: 0x9a, hi: 0x9a},
+	{value: 0x3982, lo: 0xa2, hi: 0xa2},
+	{value: 0x3988, lo: 0xa3, hi: 0xa3},
+	{value: 0x3994, lo: 0xa4, hi: 0xa4},
+	{value: 0x398e, lo: 0xa5, hi: 0xa5},
+	{value: 0x399a, lo: 0xa6, hi: 0xa6},
+	{value: 0xa000, lo: 0xa7, hi: 0xa7},
+	// Block 0x9, offset 0x3a
+	{value: 0x0000, lo: 0x0e},
+	{value: 0x39ac, lo: 0x80, hi: 0x80},
+	{value: 0xa000, lo: 0x81, hi: 0x81},
+	{value: 0x39a0, lo: 0x82, hi: 0x82},
+	{value: 0xa000, lo: 0x92, hi: 0x92},
+	{value: 0x39a6, lo: 0x93, hi: 0x93},
+	{value: 0xa000, lo: 0x95, hi: 0x95},
+	{value: 0x8133, lo: 0x96, hi: 0x9c},
+	{value: 0x8133, lo: 0x9f, hi: 0xa2},
+	{value: 0x812e, lo: 0xa3, hi: 0xa3},
+	{value: 0x8133, lo: 0xa4, hi: 0xa4},
+	{value: 0x8133, lo: 0xa7, hi: 0xa8},
+	{value: 0x812e, lo: 0xaa, hi: 0xaa},
+	{value: 0x8133, lo: 0xab, hi: 0xac},
+	{value: 0x812e, lo: 0xad, hi: 0xad},
+	// Block 0xa, offset 0x49
+	{value: 0x0000, lo: 0x0c},
+	{value: 0x8120, lo: 0x91, hi: 0x91},
+	{value: 0x8133, lo: 0xb0, hi: 0xb0},
+	{value: 0x812e, lo: 0xb1, hi: 0xb1},
+	{value: 0x8133, lo: 0xb2, hi: 0xb3},
+	{value: 0x812e, lo: 0xb4, hi: 0xb4},
+	{value: 0x8133, lo: 0xb5, hi: 0xb6},
+	{value: 0x812e, lo: 0xb7, hi: 0xb9},
+	{value: 0x8133, lo: 0xba, hi: 0xba},
+	{value: 0x812e, lo: 0xbb, hi: 0xbc},
+	{value: 0x8133, lo: 0xbd, hi: 0xbd},
+	{value: 0x812e, lo: 0xbe, hi: 0xbe},
+	{value: 0x8133, lo: 0xbf, hi: 0xbf},
+	// Block 0xb, offset 0x56
+	{value: 0x0005, lo: 0x07},
+	{value: 0x8133, lo: 0x80, hi: 0x80},
+	{value: 0x8133, lo: 0x81, hi: 0x81},
+	{value: 0x812e, lo: 0x82, hi: 0x83},
+	{value: 0x812e, lo: 0x84, hi: 0x85},
+	{value: 0x812e, lo: 0x86, hi: 0x87},
+	{value: 0x812e, lo: 0x88, hi: 0x89},
+	{value: 0x8133, lo: 0x8a, hi: 0x8a},
+	// Block 0xc, offset 0x5e
+	{value: 0x0000, lo: 0x04},
+	{value: 0x8133, lo: 0xab, hi: 0xb1},
+	{value: 0x812e, lo: 0xb2, hi: 0xb2},
+	{value: 0x8133, lo: 0xb3, hi: 0xb3},
+	{value: 0x812e, lo: 0xbd, hi: 0xbd},
+	// Block 0xd, offset 0x63
+	{value: 0x0000, lo: 0x04},
+	{value: 0x8133, lo: 0x96, hi: 0x99},
+	{value: 0x8133, lo: 0x9b, hi: 0xa3},
+	{value: 0x8133, lo: 0xa5, hi: 0xa7},
+	{value: 0x8133, lo: 0xa9, hi: 0xad},
+	// Block 0xe, offset 0x68
+	{value: 0x0000, lo: 0x01},
+	{value: 0x812e, lo: 0x99, hi: 0x9b},
+	// Block 0xf, offset 0x6a
+	{value: 0x0000, lo: 0x03},
+	{value: 0x8133, lo: 0x98, hi: 0x98},
+	{value: 0x812e, lo: 0x99, hi: 0x9b},
+	{value: 0x8133, lo: 0x9c, hi: 0x9f},
+	// Block 0x10, offset 0x6e
+	{value: 0x0000, lo: 0x07},
+	{value: 0xa000, lo: 0xa8, hi: 0xa8},
+	{value: 0x4019, lo: 0xa9, hi: 0xa9},
+	{value: 0xa000, lo: 0xb0, hi: 0xb0},
+	{value: 0x4021, lo: 0xb1, hi: 0xb1},
+	{value: 0xa000, lo: 0xb3, hi: 0xb3},
+	{value: 0x4029, lo: 0xb4, hi: 0xb4},
+	{value: 0x9903, lo: 0xbc, hi: 0xbc},
+	// Block 0x11, offset 0x76
+	{value: 0x0008, lo: 0x06},
+	{value: 0x8105, lo: 0x8d, hi: 0x8d},
+	{value: 0x8133, lo: 0x91, hi: 0x91},
+	{value: 0x812e, lo: 0x92, hi: 0x92},
+	{value: 0x8133, lo: 0x93, hi: 0x93},
+	{value: 0x8133, lo: 0x94, hi: 0x94},
+	{value: 0x465d, lo: 0x98, hi: 0x9f},
+	// Block 0x12, offset 0x7d
+	{value: 0x0000, lo: 0x02},
+	{value: 0x8103, lo: 0xbc, hi: 0xbc},
+	{value: 0x9900, lo: 0xbe, hi: 0xbe},
+	// Block 0x13, offset 0x80
+	{value: 0x0008, lo: 0x07},
+	{value: 0xa000, lo: 0x87, hi: 0x87},
+	{value: 0x2dd5, lo: 0x8b, hi: 0x8c},
+	{value: 0x8105, lo: 0x8d, hi: 0x8d},
+	{value: 0x9900, lo: 0x97, hi: 0x97},
+	{value: 0x469d, lo: 0x9c, hi: 0x9d},
+	{value: 0x46ad, lo: 0x9f, hi: 0x9f},
+	{value: 0x8133, lo: 0xbe, hi: 0xbe},
+	// Block 0x14, offset 0x88
+	{value: 0x0000, lo: 0x03},
+	{value: 0x46d5, lo: 0xb3, hi: 0xb3},
+	{value: 0x46dd, lo: 0xb6, hi: 0xb6},
+	{value: 0x8103, lo: 0xbc, hi: 0xbc},
+	// Block 0x15, offset 0x8c
+	{value: 0x0008, lo: 0x03},
+	{value: 0x8105, lo: 0x8d, hi: 0x8d},
+	{value: 0x46b5, lo: 0x99, hi: 0x9b},
+	{value: 0x46cd, lo: 0x9e, hi: 0x9e},
+	// Block 0x16, offset 0x90
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8103, lo: 0xbc, hi: 0xbc},
+	// Block 0x17, offset 0x92
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8105, lo: 0x8d, hi: 0x8d},
+	// Block 0x18, offset 0x94
+	{value: 0x0000, lo: 0x08},
+	{value: 0xa000, lo: 0x87, hi: 0x87},
+	{value: 0x2ded, lo: 0x88, hi: 0x88},
+	{value: 0x2de5, lo: 0x8b, hi: 0x8b},
+	{value: 0x2df5, lo: 0x8c, hi: 0x8c},
+	{value: 0x8105, lo: 0x8d, hi: 0x8d},
+	{value: 0x9900, lo: 0x96, hi: 0x97},
+	{value: 0x46e5, lo: 0x9c, hi: 0x9c},
+	{value: 0x46ed, lo: 0x9d, hi: 0x9d},
+	// Block 0x19, offset 0x9d
+	{value: 0x0000, lo: 0x03},
+	{value: 0xa000, lo: 0x92, hi: 0x92},
+	{value: 0x2dfd, lo: 0x94, hi: 0x94},
+	{value: 0x9900, lo: 0xbe, hi: 0xbe},
+	// Block 0x1a, offset 0xa1
+	{value: 0x0000, lo: 0x06},
+	{value: 0xa000, lo: 0x86, hi: 0x87},
+	{value: 0x2e05, lo: 0x8a, hi: 0x8a},
+	{value: 0x2e15, lo: 0x8b, hi: 0x8b},
+	{value: 0x2e0d, lo: 0x8c, hi: 0x8c},
+	{value: 0x8105, lo: 0x8d, hi: 0x8d},
+	{value: 0x9900, lo: 0x97, hi: 0x97},
+	// Block 0x1b, offset 0xa8
+	{value: 0x1801, lo: 0x04},
+	{value: 0xa000, lo: 0x86, hi: 0x86},
+	{value: 0x4031, lo: 0x88, hi: 0x88},
+	{value: 0x8105, lo: 0x8d, hi: 0x8d},
+	{value: 0x8121, lo: 0x95, hi: 0x96},
+	// Block 0x1c, offset 0xad
+	{value: 0x0000, lo: 0x02},
+	{value: 0x8103, lo: 0xbc, hi: 0xbc},
+	{value: 0xa000, lo: 0xbf, hi: 0xbf},
+	// Block 0x1d, offset 0xb0
+	{value: 0x0000, lo: 0x09},
+	{value: 0x2e1d, lo: 0x80, hi: 0x80},
+	{value: 0x9900, lo: 0x82, hi: 0x82},
+	{value: 0xa000, lo: 0x86, hi: 0x86},
+	{value: 0x2e25, lo: 0x87, hi: 0x87},
+	{value: 0x2e2d, lo: 0x88, hi: 0x88},
+	{value: 0x3091, lo: 0x8a, hi: 0x8a},
+	{value: 0x2f19, lo: 0x8b, hi: 0x8b},
+	{value: 0x8105, lo: 0x8d, hi: 0x8d},
+	{value: 0x9900, lo: 0x95, hi: 0x96},
+	// Block 0x1e, offset 0xba
+	{value: 0x0000, lo: 0x02},
+	{value: 0x8105, lo: 0xbb, hi: 0xbc},
+	{value: 0x9900, lo: 0xbe, hi: 0xbe},
+	// Block 0x1f, offset 0xbd
+	{value: 0x0000, lo: 0x06},
+	{value: 0xa000, lo: 0x86, hi: 0x87},
+	{value: 0x2e35, lo: 0x8a, hi: 0x8a},
+	{value: 0x2e45, lo: 0x8b, hi: 0x8b},
+	{value: 0x2e3d, lo: 0x8c, hi: 0x8c},
+	{value: 0x8105, lo: 0x8d, hi: 0x8d},
+	{value: 0x9900, lo: 0x97, hi: 0x97},
+	// Block 0x20, offset 0xc4
+	{value: 0x6ab3, lo: 0x07},
+	{value: 0x9905, lo: 0x8a, hi: 0x8a},
+	{value: 0x9900, lo: 0x8f, hi: 0x8f},
+	{value: 0xa000, lo: 0x99, hi: 0x99},
+	{value: 0x4039, lo: 0x9a, hi: 0x9a},
+	{value: 0x3099, lo: 0x9c, hi: 0x9c},
+	{value: 0x2f24, lo: 0x9d, hi: 0x9d},
+	{value: 0x2e4d, lo: 0x9e, hi: 0x9f},
+	// Block 0x21, offset 0xcc
+	{value: 0x0000, lo: 0x02},
+	{value: 0x8123, lo: 0xb8, hi: 0xb9},
+	{value: 0x8105, lo: 0xba, hi: 0xba},
+	// Block 0x22, offset 0xcf
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8124, lo: 0x88, hi: 0x8b},
+	// Block 0x23, offset 0xd1
+	{value: 0x0000, lo: 0x02},
+	{value: 0x8125, lo: 0xb8, hi: 0xb9},
+	{value: 0x8105, lo: 0xba, hi: 0xba},
+	// Block 0x24, offset 0xd4
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8126, lo: 0x88, hi: 0x8b},
+	// Block 0x25, offset 0xd6
+	{value: 0x0000, lo: 0x04},
+	{value: 0x812e, lo: 0x98, hi: 0x99},
+	{value: 0x812e, lo: 0xb5, hi: 0xb5},
+	{value: 0x812e, lo: 0xb7, hi: 0xb7},
+	{value: 0x812c, lo: 0xb9, hi: 0xb9},
+	// Block 0x26, offset 0xdb
+	{value: 0x0000, lo: 0x10},
+	{value: 0x2774, lo: 0x83, hi: 0x83},
+	{value: 0x277b, lo: 0x8d, hi: 0x8d},
+	{value: 0x2782, lo: 0x92, hi: 0x92},
+	{value: 0x2789, lo: 0x97, hi: 0x97},
+	{value: 0x2790, lo: 0x9c, hi: 0x9c},
+	{value: 0x276d, lo: 0xa9, hi: 0xa9},
+	{value: 0x8127, lo: 0xb1, hi: 0xb1},
+	{value: 0x8128, lo: 0xb2, hi: 0xb2},
+	{value: 0x4bc5, lo: 0xb3, hi: 0xb3},
+	{value: 0x8129, lo: 0xb4, hi: 0xb4},
+	{value: 0x4bce, lo: 0xb5, hi: 0xb5},
+	{value: 0x46f5, lo: 0xb6, hi: 0xb6},
+	{value: 0x8200, lo: 0xb7, hi: 0xb7},
+	{value: 0x46fd, lo: 0xb8, hi: 0xb8},
+	{value: 0x8200, lo: 0xb9, hi: 0xb9},
+	{value: 0x8128, lo: 0xba, hi: 0xbd},
+	// Block 0x27, offset 0xec
+	{value: 0x0000, lo: 0x0b},
+	{value: 0x8128, lo: 0x80, hi: 0x80},
+	{value: 0x4bd7, lo: 0x81, hi: 0x81},
+	{value: 0x8133, lo: 0x82, hi: 0x83},
+	{value: 0x8105, lo: 0x84, hi: 0x84},
+	{value: 0x8133, lo: 0x86, hi: 0x87},
+	{value: 0x279e, lo: 0x93, hi: 0x93},
+	{value: 0x27a5, lo: 0x9d, hi: 0x9d},
+	{value: 0x27ac, lo: 0xa2, hi: 0xa2},
+	{value: 0x27b3, lo: 0xa7, hi: 0xa7},
+	{value: 0x27ba, lo: 0xac, hi: 0xac},
+	{value: 0x2797, lo: 0xb9, hi: 0xb9},
+	// Block 0x28, offset 0xf8
+	{value: 0x0000, lo: 0x01},
+	{value: 0x812e, lo: 0x86, hi: 0x86},
+	// Block 0x29, offset 0xfa
+	{value: 0x0000, lo: 0x05},
+	{value: 0xa000, lo: 0xa5, hi: 0xa5},
+	{value: 0x2e55, lo: 0xa6, hi: 0xa6},
+	{value: 0x9900, lo: 0xae, hi: 0xae},
+	{value: 0x8103, lo: 0xb7, hi: 0xb7},
+	{value: 0x8105, lo: 0xb9, hi: 0xba},
+	// Block 0x2a, offset 0x100
+	{value: 0x0000, lo: 0x01},
+	{value: 0x812e, lo: 0x8d, hi: 0x8d},
+	// Block 0x2b, offset 0x102
+	{value: 0x0000, lo: 0x01},
+	{value: 0xa000, lo: 0x80, hi: 0x92},
+	// Block 0x2c, offset 0x104
+	{value: 0x0000, lo: 0x01},
+	{value: 0xb900, lo: 0xa1, hi: 0xb5},
+	// Block 0x2d, offset 0x106
+	{value: 0x0000, lo: 0x01},
+	{value: 0x9900, lo: 0xa8, hi: 0xbf},
+	// Block 0x2e, offset 0x108
+	{value: 0x0000, lo: 0x01},
+	{value: 0x9900, lo: 0x80, hi: 0x82},
+	// Block 0x2f, offset 0x10a
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8133, lo: 0x9d, hi: 0x9f},
+	// Block 0x30, offset 0x10c
+	{value: 0x0000, lo: 0x02},
+	{value: 0x8105, lo: 0x94, hi: 0x95},
+	{value: 0x8105, lo: 0xb4, hi: 0xb4},
+	// Block 0x31, offset 0x10f
+	{value: 0x0000, lo: 0x02},
+	{value: 0x8105, lo: 0x92, hi: 0x92},
+	{value: 0x8133, lo: 0x9d, hi: 0x9d},
+	// Block 0x32, offset 0x112
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8132, lo: 0xa9, hi: 0xa9},
+	// Block 0x33, offset 0x114
+	{value: 0x0004, lo: 0x02},
+	{value: 0x812f, lo: 0xb9, hi: 0xba},
+	{value: 0x812e, lo: 0xbb, hi: 0xbb},
+	// Block 0x34, offset 0x117
+	{value: 0x0000, lo: 0x02},
+	{value: 0x8133, lo: 0x97, hi: 0x97},
+	{value: 0x812e, lo: 0x98, hi: 0x98},
+	// Block 0x35, offset 0x11a
+	{value: 0x0000, lo: 0x03},
+	{value: 0x8105, lo: 0xa0, hi: 0xa0},
+	{value: 0x8133, lo: 0xb5, hi: 0xbc},
+	{value: 0x812e, lo: 0xbf, hi: 0xbf},
+	// Block 0x36, offset 0x11e
+	{value: 0x0000, lo: 0x05},
+	{value: 0x8133, lo: 0xb0, hi: 0xb4},
+	{value: 0x812e, lo: 0xb5, hi: 0xba},
+	{value: 0x8133, lo: 0xbb, hi: 0xbc},
+	{value: 0x812e, lo: 0xbd, hi: 0xbd},
+	{value: 0x812e, lo: 0xbf, hi: 0xbf},
+	// Block 0x37, offset 0x124
+	{value: 0x0000, lo: 0x06},
+	{value: 0x812e, lo: 0x80, hi: 0x80},
+	{value: 0x8133, lo: 0x81, hi: 0x82},
+	{value: 0x812e, lo: 0x83, hi: 0x84},
+	{value: 0x8133, lo: 0x85, hi: 0x89},
+	{value: 0x812e, lo: 0x8a, hi: 0x8a},
+	{value: 0x8133, lo: 0x8b, hi: 0x8e},
+	// Block 0x38, offset 0x12b
+	{value: 0x0000, lo: 0x08},
+	{value: 0x2e9d, lo: 0x80, hi: 0x80},
+	{value: 0x2ea5, lo: 0x81, hi: 0x81},
+	{value: 0xa000, lo: 0x82, hi: 0x82},
+	{value: 0x2ead, lo: 0x83, hi: 0x83},
+	{value: 0x8105, lo: 0x84, hi: 0x84},
+	{value: 0x8133, lo: 0xab, hi: 0xab},
+	{value: 0x812e, lo: 0xac, hi: 0xac},
+	{value: 0x8133, lo: 0xad, hi: 0xb3},
+	// Block 0x39, offset 0x134
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8105, lo: 0xaa, hi: 0xab},
+	// Block 0x3a, offset 0x136
+	{value: 0x0000, lo: 0x02},
+	{value: 0x8103, lo: 0xa6, hi: 0xa6},
+	{value: 0x8105, lo: 0xb2, hi: 0xb3},
+	// Block 0x3b, offset 0x139
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8103, lo: 0xb7, hi: 0xb7},
+	// Block 0x3c, offset 0x13b
+	{value: 0x0000, lo: 0x0a},
+	{value: 0x8133, lo: 0x90, hi: 0x92},
+	{value: 0x8101, lo: 0x94, hi: 0x94},
+	{value: 0x812e, lo: 0x95, hi: 0x99},
+	{value: 0x8133, lo: 0x9a, hi: 0x9b},
+	{value: 0x812e, lo: 0x9c, hi: 0x9f},
+	{value: 0x8133, lo: 0xa0, hi: 0xa0},
+	{value: 0x8101, lo: 0xa2, hi: 0xa8},
+	{value: 0x812e, lo: 0xad, hi: 0xad},
+	{value: 0x8133, lo: 0xb4, hi: 0xb4},
+	{value: 0x8133, lo: 0xb8, hi: 0xb9},
+	// Block 0x3d, offset 0x146
+	{value: 0x0004, lo: 0x03},
+	{value: 0x052a, lo: 0x80, hi: 0x81},
+	{value: 0x8100, lo: 0x97, hi: 0x97},
+	{value: 0x8100, lo: 0xbe, hi: 0xbe},
+	// Block 0x3e, offset 0x14a
+	{value: 0x0000, lo: 0x0d},
+	{value: 0x8133, lo: 0x90, hi: 0x91},
+	{value: 0x8101, lo: 0x92, hi: 0x93},
+	{value: 0x8133, lo: 0x94, hi: 0x97},
+	{value: 0x8101, lo: 0x98, hi: 0x9a},
+	{value: 0x8133, lo: 0x9b, hi: 0x9c},
+	{value: 0x8133, lo: 0xa1, hi: 0xa1},
+	{value: 0x8101, lo: 0xa5, hi: 0xa6},
+	{value: 0x8133, lo: 0xa7, hi: 0xa7},
+	{value: 0x812e, lo: 0xa8, hi: 0xa8},
+	{value: 0x8133, lo: 0xa9, hi: 0xa9},
+	{value: 0x8101, lo: 0xaa, hi: 0xab},
+	{value: 0x812e, lo: 0xac, hi: 0xaf},
+	{value: 0x8133, lo: 0xb0, hi: 0xb0},
+	// Block 0x3f, offset 0x158
+	{value: 0x43bc, lo: 0x02},
+	{value: 0x023c, lo: 0xa6, hi: 0xa6},
+	{value: 0x0057, lo: 0xaa, hi: 0xab},
+	// Block 0x40, offset 0x15b
+	{value: 0x0007, lo: 0x05},
+	{value: 0xa000, lo: 0x90, hi: 0x90},
+	{value: 0xa000, lo: 0x92, hi: 0x92},
+	{value: 0xa000, lo: 0x94, hi: 0x94},
+	{value: 0x3cfa, lo: 0x9a, hi: 0x9b},
+	{value: 0x3d08, lo: 0xae, hi: 0xae},
+	// Block 0x41, offset 0x161
+	{value: 0x000e, lo: 0x05},
+	{value: 0x3d0f, lo: 0x8d, hi: 0x8e},
+	{value: 0x3d16, lo: 0x8f, hi: 0x8f},
+	{value: 0xa000, lo: 0x90, hi: 0x90},
+	{value: 0xa000, lo: 0x92, hi: 0x92},
+	{value: 0xa000, lo: 0x94, hi: 0x94},
+	// Block 0x42, offset 0x167
+	{value: 0x62c7, lo: 0x0a},
+	{value: 0xa000, lo: 0x83, hi: 0x83},
+	{value: 0x3d24, lo: 0x84, hi: 0x84},
+	{value: 0xa000, lo: 0x88, hi: 0x88},
+	{value: 0x3d2b, lo: 0x89, hi: 0x89},
+	{value: 0xa000, lo: 0x8b, hi: 0x8b},
+	{value: 0x3d32, lo: 0x8c, hi: 0x8c},
+	{value: 0xa000, lo: 0xa3, hi: 0xa3},
+	{value: 0x3d39, lo: 0xa4, hi: 0xa5},
+	{value: 0x3d40, lo: 0xa6, hi: 0xa6},
+	{value: 0xa000, lo: 0xbc, hi: 0xbc},
+	// Block 0x43, offset 0x172
+	{value: 0x0007, lo: 0x03},
+	{value: 0x3da9, lo: 0xa0, hi: 0xa1},
+	{value: 0x3dd3, lo: 0xa2, hi: 0xa3},
+	{value: 0x3dfd, lo: 0xaa, hi: 0xad},
+	// Block 0x44, offset 0x176
+	{value: 0x0004, lo: 0x01},
+	{value: 0x0586, lo: 0xa9, hi: 0xaa},
+	// Block 0x45, offset 0x178
+	{value: 0x0000, lo: 0x01},
+	{value: 0x461e, lo: 0x9c, hi: 0x9c},
+	// Block 0x46, offset 0x17a
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8133, lo: 0xaf, hi: 0xb1},
+	// Block 0x47, offset 0x17c
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8105, lo: 0xbf, hi: 0xbf},
+	// Block 0x48, offset 0x17e
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8133, lo: 0xa0, hi: 0xbf},
+	// Block 0x49, offset 0x180
+	{value: 0x0000, lo: 0x05},
+	{value: 0x812d, lo: 0xaa, hi: 0xaa},
+	{value: 0x8132, lo: 0xab, hi: 0xab},
+	{value: 0x8134, lo: 0xac, hi: 0xac},
+	{value: 0x812f, lo: 0xad, hi: 0xad},
+	{value: 0x8130, lo: 0xae, hi: 0xaf},
+	// Block 0x4a, offset 0x186
+	{value: 0x0000, lo: 0x03},
+	{value: 0x4be0, lo: 0xb3, hi: 0xb3},
+	{value: 0x4be0, lo: 0xb5, hi: 0xb6},
+	{value: 0x4be0, lo: 0xba, hi: 0xbf},
+	// Block 0x4b, offset 0x18a
+	{value: 0x0000, lo: 0x01},
+	{value: 0x4be0, lo: 0x8f, hi: 0xa3},
+	// Block 0x4c, offset 0x18c
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8100, lo: 0xae, hi: 0xbe},
+	// Block 0x4d, offset 0x18e
+	{value: 0x0000, lo: 0x07},
+	{value: 0x8100, lo: 0x84, hi: 0x84},
+	{value: 0x8100, lo: 0x87, hi: 0x87},
+	{value: 0x8100, lo: 0x90, hi: 0x90},
+	{value: 0x8100, lo: 0x9e, hi: 0x9e},
+	{value: 0x8100, lo: 0xa1, hi: 0xa1},
+	{value: 0x8100, lo: 0xb2, hi: 0xb2},
+	{value: 0x8100, lo: 0xbb, hi: 0xbb},
+	// Block 0x4e, offset 0x196
+	{value: 0x0000, lo: 0x03},
+	{value: 0x8100, lo: 0x80, hi: 0x80},
+	{value: 0x8100, lo: 0x8b, hi: 0x8b},
+	{value: 0x8100, lo: 0x8e, hi: 0x8e},
+	// Block 0x4f, offset 0x19a
+	{value: 0x0000, lo: 0x02},
+	{value: 0x8133, lo: 0xaf, hi: 0xaf},
+	{value: 0x8133, lo: 0xb4, hi: 0xbd},
+	// Block 0x50, offset 0x19d
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8133, lo: 0x9e, hi: 0x9f},
+	// Block 0x51, offset 0x19f
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8133, lo: 0xb0, hi: 0xb1},
+	// Block 0x52, offset 0x1a1
+	{value: 0x0000, lo: 0x02},
+	{value: 0x8105, lo: 0x86, hi: 0x86},
+	{value: 0x8105, lo: 0xac, hi: 0xac},
+	// Block 0x53, offset 0x1a4
+	{value: 0x0000, lo: 0x02},
+	{value: 0x8105, lo: 0x84, hi: 0x84},
+	{value: 0x8133, lo: 0xa0, hi: 0xb1},
+	// Block 0x54, offset 0x1a7
+	{value: 0x0000, lo: 0x01},
+	{value: 0x812e, lo: 0xab, hi: 0xad},
+	// Block 0x55, offset 0x1a9
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8105, lo: 0x93, hi: 0x93},
+	// Block 0x56, offset 0x1ab
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8103, lo: 0xb3, hi: 0xb3},
+	// Block 0x57, offset 0x1ad
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8105, lo: 0x80, hi: 0x80},
+	// Block 0x58, offset 0x1af
+	{value: 0x0000, lo: 0x05},
+	{value: 0x8133, lo: 0xb0, hi: 0xb0},
+	{value: 0x8133, lo: 0xb2, hi: 0xb3},
+	{value: 0x812e, lo: 0xb4, hi: 0xb4},
+	{value: 0x8133, lo: 0xb7, hi: 0xb8},
+	{value: 0x8133, lo: 0xbe, hi: 0xbf},
+	// Block 0x59, offset 0x1b5
+	{value: 0x0000, lo: 0x02},
+	{value: 0x8133, lo: 0x81, hi: 0x81},
+	{value: 0x8105, lo: 0xb6, hi: 0xb6},
+	// Block 0x5a, offset 0x1b8
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8105, lo: 0xad, hi: 0xad},
+	// Block 0x5b, offset 0x1ba
+	{value: 0x0000, lo: 0x06},
+	{value: 0xe500, lo: 0x80, hi: 0x80},
+	{value: 0xc600, lo: 0x81, hi: 0x9b},
+	{value: 0xe500, lo: 0x9c, hi: 0x9c},
+	{value: 0xc600, lo: 0x9d, hi: 0xb7},
+	{value: 0xe500, lo: 0xb8, hi: 0xb8},
+	{value: 0xc600, lo: 0xb9, hi: 0xbf},
+	// Block 0x5c, offset 0x1c1
+	{value: 0x0000, lo: 0x05},
+	{value: 0xc600, lo: 0x80, hi: 0x93},
+	{value: 0xe500, lo: 0x94, hi: 0x94},
+	{value: 0xc600, lo: 0x95, hi: 0xaf},
+	{value: 0xe500, lo: 0xb0, hi: 0xb0},
+	{value: 0xc600, lo: 0xb1, hi: 0xbf},
+	// Block 0x5d, offset 0x1c7
+	{value: 0x0000, lo: 0x05},
+	{value: 0xc600, lo: 0x80, hi: 0x8b},
+	{value: 0xe500, lo: 0x8c, hi: 0x8c},
+	{value: 0xc600, lo: 0x8d, hi: 0xa7},
+	{value: 0xe500, lo: 0xa8, hi: 0xa8},
+	{value: 0xc600, lo: 0xa9, hi: 0xbf},
+	// Block 0x5e, offset 0x1cd
+	{value: 0x0000, lo: 0x07},
+	{value: 0xc600, lo: 0x80, hi: 0x83},
+	{value: 0xe500, lo: 0x84, hi: 0x84},
+	{value: 0xc600, lo: 0x85, hi: 0x9f},
+	{value: 0xe500, lo: 0xa0, hi: 0xa0},
+	{value: 0xc600, lo: 0xa1, hi: 0xbb},
+	{value: 0xe500, lo: 0xbc, hi: 0xbc},
+	{value: 0xc600, lo: 0xbd, hi: 0xbf},
+	// Block 0x5f, offset 0x1d5
+	{value: 0x0000, lo: 0x05},
+	{value: 0xc600, lo: 0x80, hi: 0x97},
+	{value: 0xe500, lo: 0x98, hi: 0x98},
+	{value: 0xc600, lo: 0x99, hi: 0xb3},
+	{value: 0xe500, lo: 0xb4, hi: 0xb4},
+	{value: 0xc600, lo: 0xb5, hi: 0xbf},
+	// Block 0x60, offset 0x1db
+	{value: 0x0000, lo: 0x05},
+	{value: 0xc600, lo: 0x80, hi: 0x8f},
+	{value: 0xe500, lo: 0x90, hi: 0x90},
+	{value: 0xc600, lo: 0x91, hi: 0xab},
+	{value: 0xe500, lo: 0xac, hi: 0xac},
+	{value: 0xc600, lo: 0xad, hi: 0xbf},
+	// Block 0x61, offset 0x1e1
+	{value: 0x0000, lo: 0x05},
+	{value: 0xc600, lo: 0x80, hi: 0x87},
+	{value: 0xe500, lo: 0x88, hi: 0x88},
+	{value: 0xc600, lo: 0x89, hi: 0xa3},
+	{value: 0xe500, lo: 0xa4, hi: 0xa4},
+	{value: 0xc600, lo: 0xa5, hi: 0xbf},
+	// Block 0x62, offset 0x1e7
+	{value: 0x0000, lo: 0x03},
+	{value: 0xc600, lo: 0x80, hi: 0x87},
+	{value: 0xe500, lo: 0x88, hi: 0x88},
+	{value: 0xc600, lo: 0x89, hi: 0xa3},
+	// Block 0x63, offset 0x1eb
+	{value: 0x0006, lo: 0x0d},
+	{value: 0x44d1, lo: 0x9d, hi: 0x9d},
+	{value: 0x8116, lo: 0x9e, hi: 0x9e},
+	{value: 0x4543, lo: 0x9f, hi: 0x9f},
+	{value: 0x4531, lo: 0xaa, hi: 0xab},
+	{value: 0x4635, lo: 0xac, hi: 0xac},
+	{value: 0x463d, lo: 0xad, hi: 0xad},
+	{value: 0x4489, lo: 0xae, hi: 0xb1},
+	{value: 0x44a7, lo: 0xb2, hi: 0xb4},
+	{value: 0x44bf, lo: 0xb5, hi: 0xb6},
+	{value: 0x44cb, lo: 0xb8, hi: 0xb8},
+	{value: 0x44d7, lo: 0xb9, hi: 0xbb},
+	{value: 0x44ef, lo: 0xbc, hi: 0xbc},
+	{value: 0x44f5, lo: 0xbe, hi: 0xbe},
+	// Block 0x64, offset 0x1f9
+	{value: 0x0006, lo: 0x08},
+	{value: 0x44fb, lo: 0x80, hi: 0x81},
+	{value: 0x4507, lo: 0x83, hi: 0x84},
+	{value: 0x4519, lo: 0x86, hi: 0x89},
+	{value: 0x453d, lo: 0x8a, hi: 0x8a},
+	{value: 0x44b9, lo: 0x8b, hi: 0x8b},
+	{value: 0x44a1, lo: 0x8c, hi: 0x8c},
+	{value: 0x44e9, lo: 0x8d, hi: 0x8d},
+	{value: 0x4513, lo: 0x8e, hi: 0x8e},
+	// Block 0x65, offset 0x202
+	{value: 0x0000, lo: 0x02},
+	{value: 0x8100, lo: 0xa4, hi: 0xa5},
+	{value: 0x8100, lo: 0xb0, hi: 0xb1},
+	// Block 0x66, offset 0x205
+	{value: 0x0000, lo: 0x02},
+	{value: 0x8100, lo: 0x9b, hi: 0x9d},
+	{value: 0x8200, lo: 0x9e, hi: 0xa3},
+	// Block 0x67, offset 0x208
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8100, lo: 0x90, hi: 0x90},
+	// Block 0x68, offset 0x20a
+	{value: 0x0000, lo: 0x02},
+	{value: 0x8100, lo: 0x99, hi: 0x99},
+	{value: 0x8200, lo: 0xb2, hi: 0xb4},
+	// Block 0x69, offset 0x20d
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8100, lo: 0xbc, hi: 0xbd},
+	// Block 0x6a, offset 0x20f
+	{value: 0x0000, lo: 0x03},
+	{value: 0x8133, lo: 0xa0, hi: 0xa6},
+	{value: 0x812e, lo: 0xa7, hi: 0xad},
+	{value: 0x8133, lo: 0xae, hi: 0xaf},
+	// Block 0x6b, offset 0x213
+	{value: 0x0000, lo: 0x04},
+	{value: 0x8100, lo: 0x89, hi: 0x8c},
+	{value: 0x8100, lo: 0xb0, hi: 0xb2},
+	{value: 0x8100, lo: 0xb4, hi: 0xb4},
+	{value: 0x8100, lo: 0xb6, hi: 0xbf},
+	// Block 0x6c, offset 0x218
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8100, lo: 0x81, hi: 0x8c},
+	// Block 0x6d, offset 0x21a
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8100, lo: 0xb5, hi: 0xba},
+	// Block 0x6e, offset 0x21c
+	{value: 0x0000, lo: 0x04},
+	{value: 0x4be0, lo: 0x9e, hi: 0x9f},
+	{value: 0x4be0, lo: 0xa3, hi: 0xa3},
+	{value: 0x4be0, lo: 0xa5, hi: 0xa6},
+	{value: 0x4be0, lo: 0xaa, hi: 0xaf},
+	// Block 0x6f, offset 0x221
+	{value: 0x0000, lo: 0x05},
+	{value: 0x4be0, lo: 0x82, hi: 0x87},
+	{value: 0x4be0, lo: 0x8a, hi: 0x8f},
+	{value: 0x4be0, lo: 0x92, hi: 0x97},
+	{value: 0x4be0, lo: 0x9a, hi: 0x9c},
+	{value: 0x8100, lo: 0xa3, hi: 0xa3},
+	// Block 0x70, offset 0x227
+	{value: 0x0000, lo: 0x01},
+	{value: 0x812e, lo: 0xbd, hi: 0xbd},
+	// Block 0x71, offset 0x229
+	{value: 0x0000, lo: 0x01},
+	{value: 0x812e, lo: 0xa0, hi: 0xa0},
+	// Block 0x72, offset 0x22b
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8133, lo: 0xb6, hi: 0xba},
+	// Block 0x73, offset 0x22d
+	{value: 0x002d, lo: 0x05},
+	{value: 0x812e, lo: 0x8d, hi: 0x8d},
+	{value: 0x8133, lo: 0x8f, hi: 0x8f},
+	{value: 0x8133, lo: 0xb8, hi: 0xb8},
+	{value: 0x8101, lo: 0xb9, hi: 0xba},
+	{value: 0x8105, lo: 0xbf, hi: 0xbf},
+	// Block 0x74, offset 0x233
+	{value: 0x0000, lo: 0x02},
+	{value: 0x8133, lo: 0xa5, hi: 0xa5},
+	{value: 0x812e, lo: 0xa6, hi: 0xa6},
+	// Block 0x75, offset 0x236
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8133, lo: 0xa4, hi: 0xa7},
+	// Block 0x76, offset 0x238
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8133, lo: 0xab, hi: 0xac},
+	// Block 0x77, offset 0x23a
+	{value: 0x0000, lo: 0x01},
+	{value: 0x812e, lo: 0xbd, hi: 0xbf},
+	// Block 0x78, offset 0x23c
+	{value: 0x0000, lo: 0x05},
+	{value: 0x812e, lo: 0x86, hi: 0x87},
+	{value: 0x8133, lo: 0x88, hi: 0x8a},
+	{value: 0x812e, lo: 0x8b, hi: 0x8b},
+	{value: 0x8133, lo: 0x8c, hi: 0x8c},
+	{value: 0x812e, lo: 0x8d, hi: 0x90},
+	// Block 0x79, offset 0x242
+	{value: 0x0005, lo: 0x03},
+	{value: 0x8133, lo: 0x82, hi: 0x82},
+	{value: 0x812e, lo: 0x83, hi: 0x84},
+	{value: 0x812e, lo: 0x85, hi: 0x85},
+	// Block 0x7a, offset 0x246
+	{value: 0x0000, lo: 0x03},
+	{value: 0x8105, lo: 0x86, hi: 0x86},
+	{value: 0x8105, lo: 0xb0, hi: 0xb0},
+	{value: 0x8105, lo: 0xbf, hi: 0xbf},
+	// Block 0x7b, offset 0x24a
+	{value: 0x17fe, lo: 0x07},
+	{value: 0xa000, lo: 0x99, hi: 0x99},
+	{value: 0x4379, lo: 0x9a, hi: 0x9a},
+	{value: 0xa000, lo: 0x9b, hi: 0x9b},
+	{value: 0x4383, lo: 0x9c, hi: 0x9c},
+	{value: 0xa000, lo: 0xa5, hi: 0xa5},
+	{value: 0x438d, lo: 0xab, hi: 0xab},
+	{value: 0x8105, lo: 0xb9, hi: 0xba},
+	// Block 0x7c, offset 0x252
+	{value: 0x0000, lo: 0x06},
+	{value: 0x8133, lo: 0x80, hi: 0x82},
+	{value: 0x9900, lo: 0xa7, hi: 0xa7},
+	{value: 0x2eb5, lo: 0xae, hi: 0xae},
+	{value: 0x2ebf, lo: 0xaf, hi: 0xaf},
+	{value: 0xa000, lo: 0xb1, hi: 0xb2},
+	{value: 0x8105, lo: 0xb3, hi: 0xb4},
+	// Block 0x7d, offset 0x259
+	{value: 0x0000, lo: 0x02},
+	{value: 0x8105, lo: 0x80, hi: 0x80},
+	{value: 0x8103, lo: 0x8a, hi: 0x8a},
+	// Block 0x7e, offset 0x25c
+	{value: 0x0000, lo: 0x02},
+	{value: 0x8105, lo: 0xb5, hi: 0xb5},
+	{value: 0x8103, lo: 0xb6, hi: 0xb6},
+	// Block 0x7f, offset 0x25f
+	{value: 0x0002, lo: 0x01},
+	{value: 0x8103, lo: 0xa9, hi: 0xaa},
+	// Block 0x80, offset 0x261
+	{value: 0x0000, lo: 0x02},
+	{value: 0x8103, lo: 0xbb, hi: 0xbc},
+	{value: 0x9900, lo: 0xbe, hi: 0xbe},
+	// Block 0x81, offset 0x264
+	{value: 0x0000, lo: 0x07},
+	{value: 0xa000, lo: 0x87, hi: 0x87},
+	{value: 0x2ec9, lo: 0x8b, hi: 0x8b},
+	{value: 0x2ed3, lo: 0x8c, hi: 0x8c},
+	{value: 0x8105, lo: 0x8d, hi: 0x8d},
+	{value: 0x9900, lo: 0x97, hi: 0x97},
+	{value: 0x8133, lo: 0xa6, hi: 0xac},
+	{value: 0x8133, lo: 0xb0, hi: 0xb4},
+	// Block 0x82, offset 0x26c
+	{value: 0x0000, lo: 0x03},
+	{value: 0x8105, lo: 0x82, hi: 0x82},
+	{value: 0x8103, lo: 0x86, hi: 0x86},
+	{value: 0x8133, lo: 0x9e, hi: 0x9e},
+	// Block 0x83, offset 0x270
+	{value: 0x6a23, lo: 0x06},
+	{value: 0x9900, lo: 0xb0, hi: 0xb0},
+	{value: 0xa000, lo: 0xb9, hi: 0xb9},
+	{value: 0x9900, lo: 0xba, hi: 0xba},
+	{value: 0x2ee7, lo: 0xbb, hi: 0xbb},
+	{value: 0x2edd, lo: 0xbc, hi: 0xbd},
+	{value: 0x2ef1, lo: 0xbe, hi: 0xbe},
+	// Block 0x84, offset 0x277
+	{value: 0x0000, lo: 0x02},
+	{value: 0x8105, lo: 0x82, hi: 0x82},
+	{value: 0x8103, lo: 0x83, hi: 0x83},
+	// Block 0x85, offset 0x27a
+	{value: 0x0000, lo: 0x05},
+	{value: 0x9900, lo: 0xaf, hi: 0xaf},
+	{value: 0xa000, lo: 0xb8, hi: 0xb9},
+	{value: 0x2efb, lo: 0xba, hi: 0xba},
+	{value: 0x2f05, lo: 0xbb, hi: 0xbb},
+	{value: 0x8105, lo: 0xbf, hi: 0xbf},
+	// Block 0x86, offset 0x280
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8103, lo: 0x80, hi: 0x80},
+	// Block 0x87, offset 0x282
+	{value: 0x0000, lo: 0x02},
+	{value: 0x8105, lo: 0xb6, hi: 0xb6},
+	{value: 0x8103, lo: 0xb7, hi: 0xb7},
+	// Block 0x88, offset 0x285
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8105, lo: 0xab, hi: 0xab},
+	// Block 0x89, offset 0x287
+	{value: 0x0000, lo: 0x02},
+	{value: 0x8105, lo: 0xb9, hi: 0xb9},
+	{value: 0x8103, lo: 0xba, hi: 0xba},
+	// Block 0x8a, offset 0x28a
+	{value: 0x0000, lo: 0x04},
+	{value: 0x9900, lo: 0xb0, hi: 0xb0},
+	{value: 0xa000, lo: 0xb5, hi: 0xb5},
+	{value: 0x2f0f, lo: 0xb8, hi: 0xb8},
+	{value: 0x8105, lo: 0xbd, hi: 0xbe},
+	// Block 0x8b, offset 0x28f
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8103, lo: 0x83, hi: 0x83},
+	// Block 0x8c, offset 0x291
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8105, lo: 0xa0, hi: 0xa0},
+	// Block 0x8d, offset 0x293
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8105, lo: 0xb4, hi: 0xb4},
+	// Block 0x8e, offset 0x295
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8105, lo: 0x87, hi: 0x87},
+	// Block 0x8f, offset 0x297
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8105, lo: 0x99, hi: 0x99},
+	// Block 0x90, offset 0x299
+	{value: 0x0000, lo: 0x02},
+	{value: 0x8103, lo: 0x82, hi: 0x82},
+	{value: 0x8105, lo: 0x84, hi: 0x85},
+	// Block 0x91, offset 0x29c
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8105, lo: 0x97, hi: 0x97},
+	// Block 0x92, offset 0x29e
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8105, lo: 0x81, hi: 0x82},
+	// Block 0x93, offset 0x2a0
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8101, lo: 0xb0, hi: 0xb4},
+	// Block 0x94, offset 0x2a2
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8133, lo: 0xb0, hi: 0xb6},
+	// Block 0x95, offset 0x2a4
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8102, lo: 0xb0, hi: 0xb1},
+	// Block 0x96, offset 0x2a6
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8101, lo: 0x9e, hi: 0x9e},
+	// Block 0x97, offset 0x2a8
+	{value: 0x0000, lo: 0x0c},
+	{value: 0x470d, lo: 0x9e, hi: 0x9e},
+	{value: 0x4717, lo: 0x9f, hi: 0x9f},
+	{value: 0x474b, lo: 0xa0, hi: 0xa0},
+	{value: 0x4759, lo: 0xa1, hi: 0xa1},
+	{value: 0x4767, lo: 0xa2, hi: 0xa2},
+	{value: 0x4775, lo: 0xa3, hi: 0xa3},
+	{value: 0x4783, lo: 0xa4, hi: 0xa4},
+	{value: 0x812c, lo: 0xa5, hi: 0xa6},
+	{value: 0x8101, lo: 0xa7, hi: 0xa9},
+	{value: 0x8131, lo: 0xad, hi: 0xad},
+	{value: 0x812c, lo: 0xae, hi: 0xb2},
+	{value: 0x812e, lo: 0xbb, hi: 0xbf},
+	// Block 0x98, offset 0x2b5
+	{value: 0x0000, lo: 0x09},
+	{value: 0x812e, lo: 0x80, hi: 0x82},
+	{value: 0x8133, lo: 0x85, hi: 0x89},
+	{value: 0x812e, lo: 0x8a, hi: 0x8b},
+	{value: 0x8133, lo: 0xaa, hi: 0xad},
+	{value: 0x4721, lo: 0xbb, hi: 0xbb},
+	{value: 0x472b, lo: 0xbc, hi: 0xbc},
+	{value: 0x4791, lo: 0xbd, hi: 0xbd},
+	{value: 0x47ad, lo: 0xbe, hi: 0xbe},
+	{value: 0x479f, lo: 0xbf, hi: 0xbf},
+	// Block 0x99, offset 0x2bf
+	{value: 0x0000, lo: 0x01},
+	{value: 0x47bb, lo: 0x80, hi: 0x80},
+	// Block 0x9a, offset 0x2c1
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8133, lo: 0x82, hi: 0x84},
+	// Block 0x9b, offset 0x2c3
+	{value: 0x0000, lo: 0x05},
+	{value: 0x8133, lo: 0x80, hi: 0x86},
+	{value: 0x8133, lo: 0x88, hi: 0x98},
+	{value: 0x8133, lo: 0x9b, hi: 0xa1},
+	{value: 0x8133, lo: 0xa3, hi: 0xa4},
+	{value: 0x8133, lo: 0xa6, hi: 0xaa},
+	// Block 0x9c, offset 0x2c9
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8133, lo: 0x8f, hi: 0x8f},
+	// Block 0x9d, offset 0x2cb
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8133, lo: 0xae, hi: 0xae},
+	// Block 0x9e, offset 0x2cd
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8133, lo: 0xac, hi: 0xaf},
+	// Block 0x9f, offset 0x2cf
+	{value: 0x0000, lo: 0x03},
+	{value: 0x8134, lo: 0xac, hi: 0xad},
+	{value: 0x812e, lo: 0xae, hi: 0xae},
+	{value: 0x8133, lo: 0xaf, hi: 0xaf},
+	// Block 0xa0, offset 0x2d3
+	{value: 0x0000, lo: 0x01},
+	{value: 0x812e, lo: 0x90, hi: 0x96},
+	// Block 0xa1, offset 0x2d5
+	{value: 0x0000, lo: 0x02},
+	{value: 0x8133, lo: 0x84, hi: 0x89},
+	{value: 0x8103, lo: 0x8a, hi: 0x8a},
+	// Block 0xa2, offset 0x2d8
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8100, lo: 0x93, hi: 0x93},
+}
+
+// lookup returns the trie value for the first UTF-8 encoding in s and
+// the width in bytes of this encoding. The size will be 0 if s does not
+// hold enough bytes to complete the encoding. len(s) must be greater than 0.
+func (t *nfkcTrie) lookup(s []byte) (v uint16, sz int) {
+	c0 := s[0]
+	switch {
+	case c0 < 0x80: // is ASCII
+		return nfkcValues[c0], 1
+	case c0 < 0xC2:
+		return 0, 1 // Illegal UTF-8: not a starter, not ASCII.
+	case c0 < 0xE0: // 2-byte UTF-8
+		if len(s) < 2 {
+			return 0, 0
+		}
+		i := nfkcIndex[c0]
+		c1 := s[1]
+		if c1 < 0x80 || 0xC0 <= c1 {
+			return 0, 1 // Illegal UTF-8: not a continuation byte.
+		}
+		return t.lookupValue(uint32(i), c1), 2
+	case c0 < 0xF0: // 3-byte UTF-8
+		if len(s) < 3 {
+			return 0, 0
+		}
+		i := nfkcIndex[c0]
+		c1 := s[1]
+		if c1 < 0x80 || 0xC0 <= c1 {
+			return 0, 1 // Illegal UTF-8: not a continuation byte.
+		}
+		o := uint32(i)<<6 + uint32(c1)
+		i = nfkcIndex[o]
+		c2 := s[2]
+		if c2 < 0x80 || 0xC0 <= c2 {
+			return 0, 2 // Illegal UTF-8: not a continuation byte.
+		}
+		return t.lookupValue(uint32(i), c2), 3
+	case c0 < 0xF8: // 4-byte UTF-8
+		if len(s) < 4 {
+			return 0, 0
+		}
+		i := nfkcIndex[c0]
+		c1 := s[1]
+		if c1 < 0x80 || 0xC0 <= c1 {
+			return 0, 1 // Illegal UTF-8: not a continuation byte.
+		}
+		o := uint32(i)<<6 + uint32(c1)
+		i = nfkcIndex[o]
+		c2 := s[2]
+		if c2 < 0x80 || 0xC0 <= c2 {
+			return 0, 2 // Illegal UTF-8: not a continuation byte.
+		}
+		o = uint32(i)<<6 + uint32(c2)
+		i = nfkcIndex[o]
+		c3 := s[3]
+		if c3 < 0x80 || 0xC0 <= c3 {
+			return 0, 3 // Illegal UTF-8: not a continuation byte.
+		}
+		return t.lookupValue(uint32(i), c3), 4
+	}
+	// Illegal rune
+	return 0, 1
+}
+
+// lookupUnsafe returns the trie value for the first UTF-8 encoding in s.
+// s must start with a full and valid UTF-8 encoded rune.
+func (t *nfkcTrie) lookupUnsafe(s []byte) uint16 {
+	c0 := s[0]
+	if c0 < 0x80 { // is ASCII
+		return nfkcValues[c0]
+	}
+	i := nfkcIndex[c0]
+	if c0 < 0xE0 { // 2-byte UTF-8
+		return t.lookupValue(uint32(i), s[1])
+	}
+	i = nfkcIndex[uint32(i)<<6+uint32(s[1])]
+	if c0 < 0xF0 { // 3-byte UTF-8
+		return t.lookupValue(uint32(i), s[2])
+	}
+	i = nfkcIndex[uint32(i)<<6+uint32(s[2])]
+	if c0 < 0xF8 { // 4-byte UTF-8
+		return t.lookupValue(uint32(i), s[3])
+	}
+	return 0
+}
+
+// lookupString returns the trie value for the first UTF-8 encoding in s and
+// the width in bytes of this encoding. The size will be 0 if s does not
+// hold enough bytes to complete the encoding. len(s) must be greater than 0.
+func (t *nfkcTrie) lookupString(s string) (v uint16, sz int) {
+	c0 := s[0]
+	switch {
+	case c0 < 0x80: // is ASCII
+		return nfkcValues[c0], 1
+	case c0 < 0xC2:
+		return 0, 1 // Illegal UTF-8: not a starter, not ASCII.
+	case c0 < 0xE0: // 2-byte UTF-8
+		if len(s) < 2 {
+			return 0, 0
+		}
+		i := nfkcIndex[c0]
+		c1 := s[1]
+		if c1 < 0x80 || 0xC0 <= c1 {
+			return 0, 1 // Illegal UTF-8: not a continuation byte.
+		}
+		return t.lookupValue(uint32(i), c1), 2
+	case c0 < 0xF0: // 3-byte UTF-8
+		if len(s) < 3 {
+			return 0, 0
+		}
+		i := nfkcIndex[c0]
+		c1 := s[1]
+		if c1 < 0x80 || 0xC0 <= c1 {
+			return 0, 1 // Illegal UTF-8: not a continuation byte.
+		}
+		o := uint32(i)<<6 + uint32(c1)
+		i = nfkcIndex[o]
+		c2 := s[2]
+		if c2 < 0x80 || 0xC0 <= c2 {
+			return 0, 2 // Illegal UTF-8: not a continuation byte.
+		}
+		return t.lookupValue(uint32(i), c2), 3
+	case c0 < 0xF8: // 4-byte UTF-8
+		if len(s) < 4 {
+			return 0, 0
+		}
+		i := nfkcIndex[c0]
+		c1 := s[1]
+		if c1 < 0x80 || 0xC0 <= c1 {
+			return 0, 1 // Illegal UTF-8: not a continuation byte.
+		}
+		o := uint32(i)<<6 + uint32(c1)
+		i = nfkcIndex[o]
+		c2 := s[2]
+		if c2 < 0x80 || 0xC0 <= c2 {
+			return 0, 2 // Illegal UTF-8: not a continuation byte.
+		}
+		o = uint32(i)<<6 + uint32(c2)
+		i = nfkcIndex[o]
+		c3 := s[3]
+		if c3 < 0x80 || 0xC0 <= c3 {
+			return 0, 3 // Illegal UTF-8: not a continuation byte.
+		}
+		return t.lookupValue(uint32(i), c3), 4
+	}
+	// Illegal rune
+	return 0, 1
+}
+
+// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s.
+// s must start with a full and valid UTF-8 encoded rune.
+func (t *nfkcTrie) lookupStringUnsafe(s string) uint16 {
+	c0 := s[0]
+	if c0 < 0x80 { // is ASCII
+		return nfkcValues[c0]
+	}
+	i := nfkcIndex[c0]
+	if c0 < 0xE0 { // 2-byte UTF-8
+		return t.lookupValue(uint32(i), s[1])
+	}
+	i = nfkcIndex[uint32(i)<<6+uint32(s[1])]
+	if c0 < 0xF0 { // 3-byte UTF-8
+		return t.lookupValue(uint32(i), s[2])
+	}
+	i = nfkcIndex[uint32(i)<<6+uint32(s[2])]
+	if c0 < 0xF8 { // 4-byte UTF-8
+		return t.lookupValue(uint32(i), s[3])
+	}
+	return 0
+}
+
+// nfkcTrie. Total size: 19260 bytes (18.81 KiB). Checksum: 1a0bbc4c8c24da49.
+type nfkcTrie struct{}
+
+func newNfkcTrie(i int) *nfkcTrie {
+	return &nfkcTrie{}
+}
+
+// lookupValue determines the type of block n and looks up the value for b.
+func (t *nfkcTrie) lookupValue(n uint32, b byte) uint16 {
+	switch {
+	case n < 95:
+		return uint16(nfkcValues[n<<6+uint32(b)])
+	default:
+		n -= 95
+		return uint16(nfkcSparse.lookup(n, b))
+	}
+}
+
+// nfkcValues: 97 blocks, 6208 entries, 12416 bytes
+// The third block is the zero block.
+var nfkcValues = [6208]uint16{
+	// Block 0x0, offset 0x0
+	0x3c: 0xa000, 0x3d: 0xa000, 0x3e: 0xa000,
+	// Block 0x1, offset 0x40
+	0x41: 0xa000, 0x42: 0xa000, 0x43: 0xa000, 0x44: 0xa000, 0x45: 0xa000,
+	0x46: 0xa000, 0x47: 0xa000, 0x48: 0xa000, 0x49: 0xa000, 0x4a: 0xa000, 0x4b: 0xa000,
+	0x4c: 0xa000, 0x4d: 0xa000, 0x4e: 0xa000, 0x4f: 0xa000, 0x50: 0xa000,
+	0x52: 0xa000, 0x53: 0xa000, 0x54: 0xa000, 0x55: 0xa000, 0x56: 0xa000, 0x57: 0xa000,
+	0x58: 0xa000, 0x59: 0xa000, 0x5a: 0xa000,
+	0x61: 0xa000, 0x62: 0xa000, 0x63: 0xa000,
+	0x64: 0xa000, 0x65: 0xa000, 0x66: 0xa000, 0x67: 0xa000, 0x68: 0xa000, 0x69: 0xa000,
+	0x6a: 0xa000, 0x6b: 0xa000, 0x6c: 0xa000, 0x6d: 0xa000, 0x6e: 0xa000, 0x6f: 0xa000,
+	0x70: 0xa000, 0x72: 0xa000, 0x73: 0xa000, 0x74: 0xa000, 0x75: 0xa000,
+	0x76: 0xa000, 0x77: 0xa000, 0x78: 0xa000, 0x79: 0xa000, 0x7a: 0xa000,
+	// Block 0x2, offset 0x80
+	// Block 0x3, offset 0xc0
+	0xc0: 0x30b0, 0xc1: 0x30b5, 0xc2: 0x47c9, 0xc3: 0x30ba, 0xc4: 0x47d8, 0xc5: 0x47dd,
+	0xc6: 0xa000, 0xc7: 0x47e7, 0xc8: 0x3123, 0xc9: 0x3128, 0xca: 0x47ec, 0xcb: 0x313c,
+	0xcc: 0x31af, 0xcd: 0x31b4, 0xce: 0x31b9, 0xcf: 0x4800, 0xd1: 0x3245,
+	0xd2: 0x3268, 0xd3: 0x326d, 0xd4: 0x480a, 0xd5: 0x480f, 0xd6: 0x481e,
+	0xd8: 0xa000, 0xd9: 0x32f4, 0xda: 0x32f9, 0xdb: 0x32fe, 0xdc: 0x4850, 0xdd: 0x3376,
+	0xe0: 0x33bc, 0xe1: 0x33c1, 0xe2: 0x485a, 0xe3: 0x33c6,
+	0xe4: 0x4869, 0xe5: 0x486e, 0xe6: 0xa000, 0xe7: 0x4878, 0xe8: 0x342f, 0xe9: 0x3434,
+	0xea: 0x487d, 0xeb: 0x3448, 0xec: 0x34c0, 0xed: 0x34c5, 0xee: 0x34ca, 0xef: 0x4891,
+	0xf1: 0x3556, 0xf2: 0x3579, 0xf3: 0x357e, 0xf4: 0x489b, 0xf5: 0x48a0,
+	0xf6: 0x48af, 0xf8: 0xa000, 0xf9: 0x360a, 0xfa: 0x360f, 0xfb: 0x3614,
+	0xfc: 0x48e1, 0xfd: 0x3691, 0xff: 0x36aa,
+	// Block 0x4, offset 0x100
+	0x100: 0x30bf, 0x101: 0x33cb, 0x102: 0x47ce, 0x103: 0x485f, 0x104: 0x30dd, 0x105: 0x33e9,
+	0x106: 0x30f1, 0x107: 0x33fd, 0x108: 0x30f6, 0x109: 0x3402, 0x10a: 0x30fb, 0x10b: 0x3407,
+	0x10c: 0x3100, 0x10d: 0x340c, 0x10e: 0x310a, 0x10f: 0x3416,
+	0x112: 0x47f1, 0x113: 0x4882, 0x114: 0x3132, 0x115: 0x343e, 0x116: 0x3137, 0x117: 0x3443,
+	0x118: 0x3155, 0x119: 0x3461, 0x11a: 0x3146, 0x11b: 0x3452, 0x11c: 0x316e, 0x11d: 0x347a,
+	0x11e: 0x3178, 0x11f: 0x3484, 0x120: 0x317d, 0x121: 0x3489, 0x122: 0x3187, 0x123: 0x3493,
+	0x124: 0x318c, 0x125: 0x3498, 0x128: 0x31be, 0x129: 0x34cf,
+	0x12a: 0x31c3, 0x12b: 0x34d4, 0x12c: 0x31c8, 0x12d: 0x34d9, 0x12e: 0x31eb, 0x12f: 0x34f7,
+	0x130: 0x31cd, 0x132: 0x1a8a, 0x133: 0x1b17, 0x134: 0x31f5, 0x135: 0x3501,
+	0x136: 0x3209, 0x137: 0x351a, 0x139: 0x3213, 0x13a: 0x3524, 0x13b: 0x321d,
+	0x13c: 0x352e, 0x13d: 0x3218, 0x13e: 0x3529, 0x13f: 0x1cdc,
+	// Block 0x5, offset 0x140
+	0x140: 0x1d64, 0x143: 0x3240, 0x144: 0x3551, 0x145: 0x3259,
+	0x146: 0x356a, 0x147: 0x324f, 0x148: 0x3560, 0x149: 0x1d8c,
+	0x14c: 0x4814, 0x14d: 0x48a5, 0x14e: 0x3272, 0x14f: 0x3583, 0x150: 0x327c, 0x151: 0x358d,
+	0x154: 0x329a, 0x155: 0x35ab, 0x156: 0x32b3, 0x157: 0x35c4,
+	0x158: 0x32a4, 0x159: 0x35b5, 0x15a: 0x4837, 0x15b: 0x48c8, 0x15c: 0x32bd, 0x15d: 0x35ce,
+	0x15e: 0x32cc, 0x15f: 0x35dd, 0x160: 0x483c, 0x161: 0x48cd, 0x162: 0x32e5, 0x163: 0x35fb,
+	0x164: 0x32d6, 0x165: 0x35ec, 0x168: 0x4846, 0x169: 0x48d7,
+	0x16a: 0x484b, 0x16b: 0x48dc, 0x16c: 0x3303, 0x16d: 0x3619, 0x16e: 0x330d, 0x16f: 0x3623,
+	0x170: 0x3312, 0x171: 0x3628, 0x172: 0x3330, 0x173: 0x3646, 0x174: 0x3353, 0x175: 0x3669,
+	0x176: 0x337b, 0x177: 0x3696, 0x178: 0x338f, 0x179: 0x339e, 0x17a: 0x36be, 0x17b: 0x33a8,
+	0x17c: 0x36c8, 0x17d: 0x33ad, 0x17e: 0x36cd, 0x17f: 0x00a7,
+	// Block 0x6, offset 0x180
+	0x184: 0x2f2f, 0x185: 0x2f35,
+	0x186: 0x2f3b, 0x187: 0x1a9f, 0x188: 0x1aa2, 0x189: 0x1b38, 0x18a: 0x1ab7, 0x18b: 0x1aba,
+	0x18c: 0x1b6e, 0x18d: 0x30c9, 0x18e: 0x33d5, 0x18f: 0x31d7, 0x190: 0x34e3, 0x191: 0x3281,
+	0x192: 0x3592, 0x193: 0x3317, 0x194: 0x362d, 0x195: 0x3b10, 0x196: 0x3c9f, 0x197: 0x3b09,
+	0x198: 0x3c98, 0x199: 0x3b17, 0x19a: 0x3ca6, 0x19b: 0x3b02, 0x19c: 0x3c91,
+	0x19e: 0x39f1, 0x19f: 0x3b80, 0x1a0: 0x39ea, 0x1a1: 0x3b79, 0x1a2: 0x36f4, 0x1a3: 0x3706,
+	0x1a6: 0x3182, 0x1a7: 0x348e, 0x1a8: 0x31ff, 0x1a9: 0x3510,
+	0x1aa: 0x482d, 0x1ab: 0x48be, 0x1ac: 0x3ad1, 0x1ad: 0x3c60, 0x1ae: 0x3718, 0x1af: 0x371e,
+	0x1b0: 0x3506, 0x1b1: 0x1a6f, 0x1b2: 0x1a72, 0x1b3: 0x1aff, 0x1b4: 0x3169, 0x1b5: 0x3475,
+	0x1b8: 0x323b, 0x1b9: 0x354c, 0x1ba: 0x39f8, 0x1bb: 0x3b87,
+	0x1bc: 0x36ee, 0x1bd: 0x3700, 0x1be: 0x36fa, 0x1bf: 0x370c,
+	// Block 0x7, offset 0x1c0
+	0x1c0: 0x30ce, 0x1c1: 0x33da, 0x1c2: 0x30d3, 0x1c3: 0x33df, 0x1c4: 0x314b, 0x1c5: 0x3457,
+	0x1c6: 0x3150, 0x1c7: 0x345c, 0x1c8: 0x31dc, 0x1c9: 0x34e8, 0x1ca: 0x31e1, 0x1cb: 0x34ed,
+	0x1cc: 0x3286, 0x1cd: 0x3597, 0x1ce: 0x328b, 0x1cf: 0x359c, 0x1d0: 0x32a9, 0x1d1: 0x35ba,
+	0x1d2: 0x32ae, 0x1d3: 0x35bf, 0x1d4: 0x331c, 0x1d5: 0x3632, 0x1d6: 0x3321, 0x1d7: 0x3637,
+	0x1d8: 0x32c7, 0x1d9: 0x35d8, 0x1da: 0x32e0, 0x1db: 0x35f6,
+	0x1de: 0x319b, 0x1df: 0x34a7,
+	0x1e6: 0x47d3, 0x1e7: 0x4864, 0x1e8: 0x47fb, 0x1e9: 0x488c,
+	0x1ea: 0x3aa0, 0x1eb: 0x3c2f, 0x1ec: 0x3a7d, 0x1ed: 0x3c0c, 0x1ee: 0x4819, 0x1ef: 0x48aa,
+	0x1f0: 0x3a99, 0x1f1: 0x3c28, 0x1f2: 0x3385, 0x1f3: 0x36a0,
+	// Block 0x8, offset 0x200
+	0x200: 0x9933, 0x201: 0x9933, 0x202: 0x9933, 0x203: 0x9933, 0x204: 0x9933, 0x205: 0x8133,
+	0x206: 0x9933, 0x207: 0x9933, 0x208: 0x9933, 0x209: 0x9933, 0x20a: 0x9933, 0x20b: 0x9933,
+	0x20c: 0x9933, 0x20d: 0x8133, 0x20e: 0x8133, 0x20f: 0x9933, 0x210: 0x8133, 0x211: 0x9933,
+	0x212: 0x8133, 0x213: 0x9933, 0x214: 0x9933, 0x215: 0x8134, 0x216: 0x812e, 0x217: 0x812e,
+	0x218: 0x812e, 0x219: 0x812e, 0x21a: 0x8134, 0x21b: 0x992c, 0x21c: 0x812e, 0x21d: 0x812e,
+	0x21e: 0x812e, 0x21f: 0x812e, 0x220: 0x812e, 0x221: 0x812a, 0x222: 0x812a, 0x223: 0x992e,
+	0x224: 0x992e, 0x225: 0x992e, 0x226: 0x992e, 0x227: 0x992a, 0x228: 0x992a, 0x229: 0x812e,
+	0x22a: 0x812e, 0x22b: 0x812e, 0x22c: 0x812e, 0x22d: 0x992e, 0x22e: 0x992e, 0x22f: 0x812e,
+	0x230: 0x992e, 0x231: 0x992e, 0x232: 0x812e, 0x233: 0x812e, 0x234: 0x8101, 0x235: 0x8101,
+	0x236: 0x8101, 0x237: 0x8101, 0x238: 0x9901, 0x239: 0x812e, 0x23a: 0x812e, 0x23b: 0x812e,
+	0x23c: 0x812e, 0x23d: 0x8133, 0x23e: 0x8133, 0x23f: 0x8133,
+	// Block 0x9, offset 0x240
+	0x240: 0x4aef, 0x241: 0x4af4, 0x242: 0x9933, 0x243: 0x4af9, 0x244: 0x4bb2, 0x245: 0x9937,
+	0x246: 0x8133, 0x247: 0x812e, 0x248: 0x812e, 0x249: 0x812e, 0x24a: 0x8133, 0x24b: 0x8133,
+	0x24c: 0x8133, 0x24d: 0x812e, 0x24e: 0x812e, 0x250: 0x8133, 0x251: 0x8133,
+	0x252: 0x8133, 0x253: 0x812e, 0x254: 0x812e, 0x255: 0x812e, 0x256: 0x812e, 0x257: 0x8133,
+	0x258: 0x8134, 0x259: 0x812e, 0x25a: 0x812e, 0x25b: 0x8133, 0x25c: 0x8135, 0x25d: 0x8136,
+	0x25e: 0x8136, 0x25f: 0x8135, 0x260: 0x8136, 0x261: 0x8136, 0x262: 0x8135, 0x263: 0x8133,
+	0x264: 0x8133, 0x265: 0x8133, 0x266: 0x8133, 0x267: 0x8133, 0x268: 0x8133, 0x269: 0x8133,
+	0x26a: 0x8133, 0x26b: 0x8133, 0x26c: 0x8133, 0x26d: 0x8133, 0x26e: 0x8133, 0x26f: 0x8133,
+	0x274: 0x01ee,
+	0x27a: 0x43e6,
+	0x27e: 0x0037,
+	// Block 0xa, offset 0x280
+	0x284: 0x439b, 0x285: 0x45bc,
+	0x286: 0x372a, 0x287: 0x00ce, 0x288: 0x3748, 0x289: 0x3754, 0x28a: 0x3766,
+	0x28c: 0x3784, 0x28e: 0x3796, 0x28f: 0x37b4, 0x290: 0x3f49, 0x291: 0xa000,
+	0x295: 0xa000, 0x297: 0xa000,
+	0x299: 0xa000,
+	0x29f: 0xa000, 0x2a1: 0xa000,
+	0x2a5: 0xa000, 0x2a9: 0xa000,
+	0x2aa: 0x3778, 0x2ab: 0x37a8, 0x2ac: 0x493f, 0x2ad: 0x37d8, 0x2ae: 0x4969, 0x2af: 0x37ea,
+	0x2b0: 0x3fb1, 0x2b1: 0xa000, 0x2b5: 0xa000,
+	0x2b7: 0xa000, 0x2b9: 0xa000,
+	0x2bf: 0xa000,
+	// Block 0xb, offset 0x2c0
+	0x2c1: 0xa000, 0x2c5: 0xa000,
+	0x2c9: 0xa000, 0x2ca: 0x4981, 0x2cb: 0x499f,
+	0x2cc: 0x3808, 0x2cd: 0x3820, 0x2ce: 0x49b7, 0x2d0: 0x0242, 0x2d1: 0x0254,
+	0x2d2: 0x0230, 0x2d3: 0x444d, 0x2d4: 0x4453, 0x2d5: 0x027e, 0x2d6: 0x026c,
+	0x2f0: 0x025a, 0x2f1: 0x026f, 0x2f2: 0x0272, 0x2f4: 0x020c, 0x2f5: 0x024b,
+	0x2f9: 0x022a,
+	// Block 0xc, offset 0x300
+	0x300: 0x3862, 0x301: 0x386e, 0x303: 0x385c,
+	0x306: 0xa000, 0x307: 0x384a,
+	0x30c: 0x389e, 0x30d: 0x3886, 0x30e: 0x38b0, 0x310: 0xa000,
+	0x313: 0xa000, 0x315: 0xa000, 0x316: 0xa000, 0x317: 0xa000,
+	0x318: 0xa000, 0x319: 0x3892, 0x31a: 0xa000,
+	0x31e: 0xa000, 0x323: 0xa000,
+	0x327: 0xa000,
+	0x32b: 0xa000, 0x32d: 0xa000,
+	0x330: 0xa000, 0x333: 0xa000, 0x335: 0xa000,
+	0x336: 0xa000, 0x337: 0xa000, 0x338: 0xa000, 0x339: 0x3916, 0x33a: 0xa000,
+	0x33e: 0xa000,
+	// Block 0xd, offset 0x340
+	0x341: 0x3874, 0x342: 0x38f8,
+	0x350: 0x3850, 0x351: 0x38d4,
+	0x352: 0x3856, 0x353: 0x38da, 0x356: 0x3868, 0x357: 0x38ec,
+	0x358: 0xa000, 0x359: 0xa000, 0x35a: 0x396a, 0x35b: 0x3970, 0x35c: 0x387a, 0x35d: 0x38fe,
+	0x35e: 0x3880, 0x35f: 0x3904, 0x362: 0x388c, 0x363: 0x3910,
+	0x364: 0x3898, 0x365: 0x391c, 0x366: 0x38a4, 0x367: 0x3928, 0x368: 0xa000, 0x369: 0xa000,
+	0x36a: 0x3976, 0x36b: 0x397c, 0x36c: 0x38ce, 0x36d: 0x3952, 0x36e: 0x38aa, 0x36f: 0x392e,
+	0x370: 0x38b6, 0x371: 0x393a, 0x372: 0x38bc, 0x373: 0x3940, 0x374: 0x38c2, 0x375: 0x3946,
+	0x378: 0x38c8, 0x379: 0x394c,
+	// Block 0xe, offset 0x380
+	0x387: 0x1e91,
+	0x391: 0x812e,
+	0x392: 0x8133, 0x393: 0x8133, 0x394: 0x8133, 0x395: 0x8133, 0x396: 0x812e, 0x397: 0x8133,
+	0x398: 0x8133, 0x399: 0x8133, 0x39a: 0x812f, 0x39b: 0x812e, 0x39c: 0x8133, 0x39d: 0x8133,
+	0x39e: 0x8133, 0x39f: 0x8133, 0x3a0: 0x8133, 0x3a1: 0x8133, 0x3a2: 0x812e, 0x3a3: 0x812e,
+	0x3a4: 0x812e, 0x3a5: 0x812e, 0x3a6: 0x812e, 0x3a7: 0x812e, 0x3a8: 0x8133, 0x3a9: 0x8133,
+	0x3aa: 0x812e, 0x3ab: 0x8133, 0x3ac: 0x8133, 0x3ad: 0x812f, 0x3ae: 0x8132, 0x3af: 0x8133,
+	0x3b0: 0x8106, 0x3b1: 0x8107, 0x3b2: 0x8108, 0x3b3: 0x8109, 0x3b4: 0x810a, 0x3b5: 0x810b,
+	0x3b6: 0x810c, 0x3b7: 0x810d, 0x3b8: 0x810e, 0x3b9: 0x810f, 0x3ba: 0x810f, 0x3bb: 0x8110,
+	0x3bc: 0x8111, 0x3bd: 0x8112, 0x3bf: 0x8113,
+	// Block 0xf, offset 0x3c0
+	0x3c8: 0xa000, 0x3ca: 0xa000, 0x3cb: 0x8117,
+	0x3cc: 0x8118, 0x3cd: 0x8119, 0x3ce: 0x811a, 0x3cf: 0x811b, 0x3d0: 0x811c, 0x3d1: 0x811d,
+	0x3d2: 0x811e, 0x3d3: 0x9933, 0x3d4: 0x9933, 0x3d5: 0x992e, 0x3d6: 0x812e, 0x3d7: 0x8133,
+	0x3d8: 0x8133, 0x3d9: 0x8133, 0x3da: 0x8133, 0x3db: 0x8133, 0x3dc: 0x812e, 0x3dd: 0x8133,
+	0x3de: 0x8133, 0x3df: 0x812e,
+	0x3f0: 0x811f, 0x3f5: 0x1eb4,
+	0x3f6: 0x2143, 0x3f7: 0x217f, 0x3f8: 0x217a,
+	// Block 0x10, offset 0x400
+	0x40a: 0x8133, 0x40b: 0x8133,
+	0x40c: 0x8133, 0x40d: 0x8133, 0x40e: 0x8133, 0x40f: 0x812e, 0x410: 0x812e, 0x411: 0x812e,
+	0x412: 0x812e, 0x413: 0x812e, 0x414: 0x8133, 0x415: 0x8133, 0x416: 0x8133, 0x417: 0x8133,
+	0x418: 0x8133, 0x419: 0x8133, 0x41a: 0x8133, 0x41b: 0x8133, 0x41c: 0x8133, 0x41d: 0x8133,
+	0x41e: 0x8133, 0x41f: 0x8133, 0x420: 0x8133, 0x421: 0x8133, 0x423: 0x812e,
+	0x424: 0x8133, 0x425: 0x8133, 0x426: 0x812e, 0x427: 0x8133, 0x428: 0x8133, 0x429: 0x812e,
+	0x42a: 0x8133, 0x42b: 0x8133, 0x42c: 0x8133, 0x42d: 0x812e, 0x42e: 0x812e, 0x42f: 0x812e,
+	0x430: 0x8117, 0x431: 0x8118, 0x432: 0x8119, 0x433: 0x8133, 0x434: 0x8133, 0x435: 0x8133,
+	0x436: 0x812e, 0x437: 0x8133, 0x438: 0x8133, 0x439: 0x812e, 0x43a: 0x812e, 0x43b: 0x8133,
+	0x43c: 0x8133, 0x43d: 0x8133, 0x43e: 0x8133, 0x43f: 0x8133,
+	// Block 0x11, offset 0x440
+	0x445: 0xa000,
+	0x446: 0x2e5d, 0x447: 0xa000, 0x448: 0x2e65, 0x449: 0xa000, 0x44a: 0x2e6d, 0x44b: 0xa000,
+	0x44c: 0x2e75, 0x44d: 0xa000, 0x44e: 0x2e7d, 0x451: 0xa000,
+	0x452: 0x2e85,
+	0x474: 0x8103, 0x475: 0x9900,
+	0x47a: 0xa000, 0x47b: 0x2e8d,
+	0x47c: 0xa000, 0x47d: 0x2e95, 0x47e: 0xa000, 0x47f: 0xa000,
+	// Block 0x12, offset 0x480
+	0x480: 0x0069, 0x481: 0x006b, 0x482: 0x006f, 0x483: 0x0083, 0x484: 0x0104, 0x485: 0x0107,
+	0x486: 0x0506, 0x487: 0x0085, 0x488: 0x0089, 0x489: 0x008b, 0x48a: 0x011f, 0x48b: 0x0122,
+	0x48c: 0x0125, 0x48d: 0x008f, 0x48f: 0x0097, 0x490: 0x009b, 0x491: 0x00e6,
+	0x492: 0x009f, 0x493: 0x0110, 0x494: 0x050a, 0x495: 0x050e, 0x496: 0x00a1, 0x497: 0x00a9,
+	0x498: 0x00ab, 0x499: 0x0516, 0x49a: 0x015b, 0x49b: 0x00ad, 0x49c: 0x051a, 0x49d: 0x0242,
+	0x49e: 0x0245, 0x49f: 0x0248, 0x4a0: 0x027e, 0x4a1: 0x0281, 0x4a2: 0x0093, 0x4a3: 0x00a5,
+	0x4a4: 0x00ab, 0x4a5: 0x00ad, 0x4a6: 0x0242, 0x4a7: 0x0245, 0x4a8: 0x026f, 0x4a9: 0x027e,
+	0x4aa: 0x0281,
+	0x4b8: 0x02b4,
+	// Block 0x13, offset 0x4c0
+	0x4db: 0x010a, 0x4dc: 0x0087, 0x4dd: 0x0113,
+	0x4de: 0x00d7, 0x4df: 0x0125, 0x4e0: 0x008d, 0x4e1: 0x012b, 0x4e2: 0x0131, 0x4e3: 0x013d,
+	0x4e4: 0x0146, 0x4e5: 0x0149, 0x4e6: 0x014c, 0x4e7: 0x051e, 0x4e8: 0x01c7, 0x4e9: 0x0155,
+	0x4ea: 0x0522, 0x4eb: 0x01ca, 0x4ec: 0x0161, 0x4ed: 0x015e, 0x4ee: 0x0164, 0x4ef: 0x0167,
+	0x4f0: 0x016a, 0x4f1: 0x016d, 0x4f2: 0x0176, 0x4f3: 0x018e, 0x4f4: 0x0191, 0x4f5: 0x00f2,
+	0x4f6: 0x019a, 0x4f7: 0x019d, 0x4f8: 0x0512, 0x4f9: 0x01a0, 0x4fa: 0x01a3, 0x4fb: 0x00b5,
+	0x4fc: 0x01af, 0x4fd: 0x01b2, 0x4fe: 0x01b5, 0x4ff: 0x0254,
+	// Block 0x14, offset 0x500
+	0x500: 0x8133, 0x501: 0x8133, 0x502: 0x812e, 0x503: 0x8133, 0x504: 0x8133, 0x505: 0x8133,
+	0x506: 0x8133, 0x507: 0x8133, 0x508: 0x8133, 0x509: 0x8133, 0x50a: 0x812e, 0x50b: 0x8133,
+	0x50c: 0x8133, 0x50d: 0x8136, 0x50e: 0x812b, 0x50f: 0x812e, 0x510: 0x812a, 0x511: 0x8133,
+	0x512: 0x8133, 0x513: 0x8133, 0x514: 0x8133, 0x515: 0x8133, 0x516: 0x8133, 0x517: 0x8133,
+	0x518: 0x8133, 0x519: 0x8133, 0x51a: 0x8133, 0x51b: 0x8133, 0x51c: 0x8133, 0x51d: 0x8133,
+	0x51e: 0x8133, 0x51f: 0x8133, 0x520: 0x8133, 0x521: 0x8133, 0x522: 0x8133, 0x523: 0x8133,
+	0x524: 0x8133, 0x525: 0x8133, 0x526: 0x8133, 0x527: 0x8133, 0x528: 0x8133, 0x529: 0x8133,
+	0x52a: 0x8133, 0x52b: 0x8133, 0x52c: 0x8133, 0x52d: 0x8133, 0x52e: 0x8133, 0x52f: 0x8133,
+	0x530: 0x8133, 0x531: 0x8133, 0x532: 0x8133, 0x533: 0x8133, 0x534: 0x8133, 0x535: 0x8133,
+	0x536: 0x8134, 0x537: 0x8132, 0x538: 0x8132, 0x539: 0x812e, 0x53a: 0x812d, 0x53b: 0x8133,
+	0x53c: 0x8135, 0x53d: 0x812e, 0x53e: 0x8133, 0x53f: 0x812e,
+	// Block 0x15, offset 0x540
+	0x540: 0x30d8, 0x541: 0x33e4, 0x542: 0x30e2, 0x543: 0x33ee, 0x544: 0x30e7, 0x545: 0x33f3,
+	0x546: 0x30ec, 0x547: 0x33f8, 0x548: 0x3a0d, 0x549: 0x3b9c, 0x54a: 0x3105, 0x54b: 0x3411,
+	0x54c: 0x310f, 0x54d: 0x341b, 0x54e: 0x311e, 0x54f: 0x342a, 0x550: 0x3114, 0x551: 0x3420,
+	0x552: 0x3119, 0x553: 0x3425, 0x554: 0x3a30, 0x555: 0x3bbf, 0x556: 0x3a37, 0x557: 0x3bc6,
+	0x558: 0x315a, 0x559: 0x3466, 0x55a: 0x315f, 0x55b: 0x346b, 0x55c: 0x3a45, 0x55d: 0x3bd4,
+	0x55e: 0x3164, 0x55f: 0x3470, 0x560: 0x3173, 0x561: 0x347f, 0x562: 0x3191, 0x563: 0x349d,
+	0x564: 0x31a0, 0x565: 0x34ac, 0x566: 0x3196, 0x567: 0x34a2, 0x568: 0x31a5, 0x569: 0x34b1,
+	0x56a: 0x31aa, 0x56b: 0x34b6, 0x56c: 0x31f0, 0x56d: 0x34fc, 0x56e: 0x3a4c, 0x56f: 0x3bdb,
+	0x570: 0x31fa, 0x571: 0x350b, 0x572: 0x3204, 0x573: 0x3515, 0x574: 0x320e, 0x575: 0x351f,
+	0x576: 0x4805, 0x577: 0x4896, 0x578: 0x3a53, 0x579: 0x3be2, 0x57a: 0x3227, 0x57b: 0x3538,
+	0x57c: 0x3222, 0x57d: 0x3533, 0x57e: 0x322c, 0x57f: 0x353d,
+	// Block 0x16, offset 0x580
+	0x580: 0x3231, 0x581: 0x3542, 0x582: 0x3236, 0x583: 0x3547, 0x584: 0x324a, 0x585: 0x355b,
+	0x586: 0x3254, 0x587: 0x3565, 0x588: 0x3263, 0x589: 0x3574, 0x58a: 0x325e, 0x58b: 0x356f,
+	0x58c: 0x3a76, 0x58d: 0x3c05, 0x58e: 0x3a84, 0x58f: 0x3c13, 0x590: 0x3a8b, 0x591: 0x3c1a,
+	0x592: 0x3a92, 0x593: 0x3c21, 0x594: 0x3290, 0x595: 0x35a1, 0x596: 0x3295, 0x597: 0x35a6,
+	0x598: 0x329f, 0x599: 0x35b0, 0x59a: 0x4832, 0x59b: 0x48c3, 0x59c: 0x3ad8, 0x59d: 0x3c67,
+	0x59e: 0x32b8, 0x59f: 0x35c9, 0x5a0: 0x32c2, 0x5a1: 0x35d3, 0x5a2: 0x4841, 0x5a3: 0x48d2,
+	0x5a4: 0x3adf, 0x5a5: 0x3c6e, 0x5a6: 0x3ae6, 0x5a7: 0x3c75, 0x5a8: 0x3aed, 0x5a9: 0x3c7c,
+	0x5aa: 0x32d1, 0x5ab: 0x35e2, 0x5ac: 0x32db, 0x5ad: 0x35f1, 0x5ae: 0x32ef, 0x5af: 0x3605,
+	0x5b0: 0x32ea, 0x5b1: 0x3600, 0x5b2: 0x332b, 0x5b3: 0x3641, 0x5b4: 0x333a, 0x5b5: 0x3650,
+	0x5b6: 0x3335, 0x5b7: 0x364b, 0x5b8: 0x3af4, 0x5b9: 0x3c83, 0x5ba: 0x3afb, 0x5bb: 0x3c8a,
+	0x5bc: 0x333f, 0x5bd: 0x3655, 0x5be: 0x3344, 0x5bf: 0x365a,
+	// Block 0x17, offset 0x5c0
+	0x5c0: 0x3349, 0x5c1: 0x365f, 0x5c2: 0x334e, 0x5c3: 0x3664, 0x5c4: 0x335d, 0x5c5: 0x3673,
+	0x5c6: 0x3358, 0x5c7: 0x366e, 0x5c8: 0x3362, 0x5c9: 0x367d, 0x5ca: 0x3367, 0x5cb: 0x3682,
+	0x5cc: 0x336c, 0x5cd: 0x3687, 0x5ce: 0x338a, 0x5cf: 0x36a5, 0x5d0: 0x33a3, 0x5d1: 0x36c3,
+	0x5d2: 0x33b2, 0x5d3: 0x36d2, 0x5d4: 0x33b7, 0x5d5: 0x36d7, 0x5d6: 0x34bb, 0x5d7: 0x35e7,
+	0x5d8: 0x3678, 0x5d9: 0x36b4, 0x5da: 0x1d10, 0x5db: 0x4418,
+	0x5e0: 0x47e2, 0x5e1: 0x4873, 0x5e2: 0x30c4, 0x5e3: 0x33d0,
+	0x5e4: 0x39b9, 0x5e5: 0x3b48, 0x5e6: 0x39b2, 0x5e7: 0x3b41, 0x5e8: 0x39c7, 0x5e9: 0x3b56,
+	0x5ea: 0x39c0, 0x5eb: 0x3b4f, 0x5ec: 0x39ff, 0x5ed: 0x3b8e, 0x5ee: 0x39d5, 0x5ef: 0x3b64,
+	0x5f0: 0x39ce, 0x5f1: 0x3b5d, 0x5f2: 0x39e3, 0x5f3: 0x3b72, 0x5f4: 0x39dc, 0x5f5: 0x3b6b,
+	0x5f6: 0x3a06, 0x5f7: 0x3b95, 0x5f8: 0x47f6, 0x5f9: 0x4887, 0x5fa: 0x3141, 0x5fb: 0x344d,
+	0x5fc: 0x312d, 0x5fd: 0x3439, 0x5fe: 0x3a1b, 0x5ff: 0x3baa,
+	// Block 0x18, offset 0x600
+	0x600: 0x3a14, 0x601: 0x3ba3, 0x602: 0x3a29, 0x603: 0x3bb8, 0x604: 0x3a22, 0x605: 0x3bb1,
+	0x606: 0x3a3e, 0x607: 0x3bcd, 0x608: 0x31d2, 0x609: 0x34de, 0x60a: 0x31e6, 0x60b: 0x34f2,
+	0x60c: 0x4828, 0x60d: 0x48b9, 0x60e: 0x3277, 0x60f: 0x3588, 0x610: 0x3a61, 0x611: 0x3bf0,
+	0x612: 0x3a5a, 0x613: 0x3be9, 0x614: 0x3a6f, 0x615: 0x3bfe, 0x616: 0x3a68, 0x617: 0x3bf7,
+	0x618: 0x3aca, 0x619: 0x3c59, 0x61a: 0x3aae, 0x61b: 0x3c3d, 0x61c: 0x3aa7, 0x61d: 0x3c36,
+	0x61e: 0x3abc, 0x61f: 0x3c4b, 0x620: 0x3ab5, 0x621: 0x3c44, 0x622: 0x3ac3, 0x623: 0x3c52,
+	0x624: 0x3326, 0x625: 0x363c, 0x626: 0x3308, 0x627: 0x361e, 0x628: 0x3b25, 0x629: 0x3cb4,
+	0x62a: 0x3b1e, 0x62b: 0x3cad, 0x62c: 0x3b33, 0x62d: 0x3cc2, 0x62e: 0x3b2c, 0x62f: 0x3cbb,
+	0x630: 0x3b3a, 0x631: 0x3cc9, 0x632: 0x3371, 0x633: 0x368c, 0x634: 0x3399, 0x635: 0x36b9,
+	0x636: 0x3394, 0x637: 0x36af, 0x638: 0x3380, 0x639: 0x369b,
+	// Block 0x19, offset 0x640
+	0x640: 0x4945, 0x641: 0x494b, 0x642: 0x4a5f, 0x643: 0x4a77, 0x644: 0x4a67, 0x645: 0x4a7f,
+	0x646: 0x4a6f, 0x647: 0x4a87, 0x648: 0x48eb, 0x649: 0x48f1, 0x64a: 0x49cf, 0x64b: 0x49e7,
+	0x64c: 0x49d7, 0x64d: 0x49ef, 0x64e: 0x49df, 0x64f: 0x49f7, 0x650: 0x4957, 0x651: 0x495d,
+	0x652: 0x3ef9, 0x653: 0x3f09, 0x654: 0x3f01, 0x655: 0x3f11,
+	0x658: 0x48f7, 0x659: 0x48fd, 0x65a: 0x3e29, 0x65b: 0x3e39, 0x65c: 0x3e31, 0x65d: 0x3e41,
+	0x660: 0x496f, 0x661: 0x4975, 0x662: 0x4a8f, 0x663: 0x4aa7,
+	0x664: 0x4a97, 0x665: 0x4aaf, 0x666: 0x4a9f, 0x667: 0x4ab7, 0x668: 0x4903, 0x669: 0x4909,
+	0x66a: 0x49ff, 0x66b: 0x4a17, 0x66c: 0x4a07, 0x66d: 0x4a1f, 0x66e: 0x4a0f, 0x66f: 0x4a27,
+	0x670: 0x4987, 0x671: 0x498d, 0x672: 0x3f59, 0x673: 0x3f71, 0x674: 0x3f61, 0x675: 0x3f79,
+	0x676: 0x3f69, 0x677: 0x3f81, 0x678: 0x490f, 0x679: 0x4915, 0x67a: 0x3e59, 0x67b: 0x3e71,
+	0x67c: 0x3e61, 0x67d: 0x3e79, 0x67e: 0x3e69, 0x67f: 0x3e81,
+	// Block 0x1a, offset 0x680
+	0x680: 0x4993, 0x681: 0x4999, 0x682: 0x3f89, 0x683: 0x3f99, 0x684: 0x3f91, 0x685: 0x3fa1,
+	0x688: 0x491b, 0x689: 0x4921, 0x68a: 0x3e89, 0x68b: 0x3e99,
+	0x68c: 0x3e91, 0x68d: 0x3ea1, 0x690: 0x49a5, 0x691: 0x49ab,
+	0x692: 0x3fc1, 0x693: 0x3fd9, 0x694: 0x3fc9, 0x695: 0x3fe1, 0x696: 0x3fd1, 0x697: 0x3fe9,
+	0x699: 0x4927, 0x69b: 0x3ea9, 0x69d: 0x3eb1,
+	0x69f: 0x3eb9, 0x6a0: 0x49bd, 0x6a1: 0x49c3, 0x6a2: 0x4abf, 0x6a3: 0x4ad7,
+	0x6a4: 0x4ac7, 0x6a5: 0x4adf, 0x6a6: 0x4acf, 0x6a7: 0x4ae7, 0x6a8: 0x492d, 0x6a9: 0x4933,
+	0x6aa: 0x4a2f, 0x6ab: 0x4a47, 0x6ac: 0x4a37, 0x6ad: 0x4a4f, 0x6ae: 0x4a3f, 0x6af: 0x4a57,
+	0x6b0: 0x4939, 0x6b1: 0x445f, 0x6b2: 0x37d2, 0x6b3: 0x4465, 0x6b4: 0x4963, 0x6b5: 0x446b,
+	0x6b6: 0x37e4, 0x6b7: 0x4471, 0x6b8: 0x3802, 0x6b9: 0x4477, 0x6ba: 0x381a, 0x6bb: 0x447d,
+	0x6bc: 0x49b1, 0x6bd: 0x4483,
+	// Block 0x1b, offset 0x6c0
+	0x6c0: 0x3ee1, 0x6c1: 0x3ee9, 0x6c2: 0x42c5, 0x6c3: 0x42e3, 0x6c4: 0x42cf, 0x6c5: 0x42ed,
+	0x6c6: 0x42d9, 0x6c7: 0x42f7, 0x6c8: 0x3e19, 0x6c9: 0x3e21, 0x6ca: 0x4211, 0x6cb: 0x422f,
+	0x6cc: 0x421b, 0x6cd: 0x4239, 0x6ce: 0x4225, 0x6cf: 0x4243, 0x6d0: 0x3f29, 0x6d1: 0x3f31,
+	0x6d2: 0x4301, 0x6d3: 0x431f, 0x6d4: 0x430b, 0x6d5: 0x4329, 0x6d6: 0x4315, 0x6d7: 0x4333,
+	0x6d8: 0x3e49, 0x6d9: 0x3e51, 0x6da: 0x424d, 0x6db: 0x426b, 0x6dc: 0x4257, 0x6dd: 0x4275,
+	0x6de: 0x4261, 0x6df: 0x427f, 0x6e0: 0x4001, 0x6e1: 0x4009, 0x6e2: 0x433d, 0x6e3: 0x435b,
+	0x6e4: 0x4347, 0x6e5: 0x4365, 0x6e6: 0x4351, 0x6e7: 0x436f, 0x6e8: 0x3ec1, 0x6e9: 0x3ec9,
+	0x6ea: 0x4289, 0x6eb: 0x42a7, 0x6ec: 0x4293, 0x6ed: 0x42b1, 0x6ee: 0x429d, 0x6ef: 0x42bb,
+	0x6f0: 0x37c6, 0x6f1: 0x37c0, 0x6f2: 0x3ed1, 0x6f3: 0x37cc, 0x6f4: 0x3ed9,
+	0x6f6: 0x4951, 0x6f7: 0x3ef1, 0x6f8: 0x3736, 0x6f9: 0x3730, 0x6fa: 0x3724, 0x6fb: 0x442f,
+	0x6fc: 0x373c, 0x6fd: 0x43c8, 0x6fe: 0x0257, 0x6ff: 0x43c8,
+	// Block 0x1c, offset 0x700
+	0x700: 0x43e1, 0x701: 0x45c3, 0x702: 0x3f19, 0x703: 0x37de, 0x704: 0x3f21,
+	0x706: 0x497b, 0x707: 0x3f39, 0x708: 0x3742, 0x709: 0x4435, 0x70a: 0x374e, 0x70b: 0x443b,
+	0x70c: 0x375a, 0x70d: 0x45ca, 0x70e: 0x45d1, 0x70f: 0x45d8, 0x710: 0x37f6, 0x711: 0x37f0,
+	0x712: 0x3f41, 0x713: 0x4625, 0x716: 0x37fc, 0x717: 0x3f51,
+	0x718: 0x3772, 0x719: 0x376c, 0x71a: 0x3760, 0x71b: 0x4441, 0x71d: 0x45df,
+	0x71e: 0x45e6, 0x71f: 0x45ed, 0x720: 0x382c, 0x721: 0x3826, 0x722: 0x3fa9, 0x723: 0x462d,
+	0x724: 0x380e, 0x725: 0x3814, 0x726: 0x3832, 0x727: 0x3fb9, 0x728: 0x37a2, 0x729: 0x379c,
+	0x72a: 0x3790, 0x72b: 0x444d, 0x72c: 0x378a, 0x72d: 0x45b5, 0x72e: 0x45bc, 0x72f: 0x0081,
+	0x732: 0x3ff1, 0x733: 0x3838, 0x734: 0x3ff9,
+	0x736: 0x49c9, 0x737: 0x4011, 0x738: 0x377e, 0x739: 0x4447, 0x73a: 0x37ae, 0x73b: 0x4459,
+	0x73c: 0x37ba, 0x73d: 0x439b, 0x73e: 0x43cd,
+	// Block 0x1d, offset 0x740
+	0x740: 0x1d08, 0x741: 0x1d0c, 0x742: 0x0047, 0x743: 0x1d84, 0x745: 0x1d18,
+	0x746: 0x1d1c, 0x747: 0x00ef, 0x749: 0x1d88, 0x74a: 0x008f, 0x74b: 0x0051,
+	0x74c: 0x0051, 0x74d: 0x0051, 0x74e: 0x0091, 0x74f: 0x00e0, 0x750: 0x0053, 0x751: 0x0053,
+	0x752: 0x0059, 0x753: 0x0099, 0x755: 0x005d, 0x756: 0x1abd,
+	0x759: 0x0061, 0x75a: 0x0063, 0x75b: 0x0065, 0x75c: 0x0065, 0x75d: 0x0065,
+	0x760: 0x1acf, 0x761: 0x1cf8, 0x762: 0x1ad8,
+	0x764: 0x0075, 0x766: 0x023c, 0x768: 0x0075,
+	0x76a: 0x0057, 0x76b: 0x4413, 0x76c: 0x0045, 0x76d: 0x0047, 0x76f: 0x008b,
+	0x770: 0x004b, 0x771: 0x004d, 0x773: 0x005b, 0x774: 0x009f, 0x775: 0x0308,
+	0x776: 0x030b, 0x777: 0x030e, 0x778: 0x0311, 0x779: 0x0093, 0x77b: 0x1cc8,
+	0x77c: 0x026c, 0x77d: 0x0245, 0x77e: 0x01fd, 0x77f: 0x0224,
+	// Block 0x1e, offset 0x780
+	0x780: 0x055a, 0x785: 0x0049,
+	0x786: 0x0089, 0x787: 0x008b, 0x788: 0x0093, 0x789: 0x0095,
+	0x790: 0x235e, 0x791: 0x236a,
+	0x792: 0x241e, 0x793: 0x2346, 0x794: 0x23ca, 0x795: 0x2352, 0x796: 0x23d0, 0x797: 0x23e8,
+	0x798: 0x23f4, 0x799: 0x2358, 0x79a: 0x23fa, 0x79b: 0x2364, 0x79c: 0x23ee, 0x79d: 0x2400,
+	0x79e: 0x2406, 0x79f: 0x1dec, 0x7a0: 0x0053, 0x7a1: 0x1a87, 0x7a2: 0x1cd4, 0x7a3: 0x1a90,
+	0x7a4: 0x006d, 0x7a5: 0x1adb, 0x7a6: 0x1d00, 0x7a7: 0x1e78, 0x7a8: 0x1a93, 0x7a9: 0x0071,
+	0x7aa: 0x1ae7, 0x7ab: 0x1d04, 0x7ac: 0x0059, 0x7ad: 0x0047, 0x7ae: 0x0049, 0x7af: 0x005b,
+	0x7b0: 0x0093, 0x7b1: 0x1b14, 0x7b2: 0x1d48, 0x7b3: 0x1b1d, 0x7b4: 0x00ad, 0x7b5: 0x1b92,
+	0x7b6: 0x1d7c, 0x7b7: 0x1e8c, 0x7b8: 0x1b20, 0x7b9: 0x00b1, 0x7ba: 0x1b95, 0x7bb: 0x1d80,
+	0x7bc: 0x0099, 0x7bd: 0x0087, 0x7be: 0x0089, 0x7bf: 0x009b,
+	// Block 0x1f, offset 0x7c0
+	0x7c1: 0x3d47, 0x7c3: 0xa000, 0x7c4: 0x3d4e, 0x7c5: 0xa000,
+	0x7c7: 0x3d55, 0x7c8: 0xa000, 0x7c9: 0x3d5c,
+	0x7cd: 0xa000,
+	0x7e0: 0x30a6, 0x7e1: 0xa000, 0x7e2: 0x3d6a,
+	0x7e4: 0xa000, 0x7e5: 0xa000,
+	0x7ed: 0x3d63, 0x7ee: 0x30a1, 0x7ef: 0x30ab,
+	0x7f0: 0x3d71, 0x7f1: 0x3d78, 0x7f2: 0xa000, 0x7f3: 0xa000, 0x7f4: 0x3d7f, 0x7f5: 0x3d86,
+	0x7f6: 0xa000, 0x7f7: 0xa000, 0x7f8: 0x3d8d, 0x7f9: 0x3d94, 0x7fa: 0xa000, 0x7fb: 0xa000,
+	0x7fc: 0xa000, 0x7fd: 0xa000,
+	// Block 0x20, offset 0x800
+	0x800: 0x3d9b, 0x801: 0x3da2, 0x802: 0xa000, 0x803: 0xa000, 0x804: 0x3db7, 0x805: 0x3dbe,
+	0x806: 0xa000, 0x807: 0xa000, 0x808: 0x3dc5, 0x809: 0x3dcc,
+	0x811: 0xa000,
+	0x812: 0xa000,
+	0x822: 0xa000,
+	0x828: 0xa000, 0x829: 0xa000,
+	0x82b: 0xa000, 0x82c: 0x3de1, 0x82d: 0x3de8, 0x82e: 0x3def, 0x82f: 0x3df6,
+	0x832: 0xa000, 0x833: 0xa000, 0x834: 0xa000, 0x835: 0xa000,
+	// Block 0x21, offset 0x840
+	0x860: 0x0023, 0x861: 0x0025, 0x862: 0x0027, 0x863: 0x0029,
+	0x864: 0x002b, 0x865: 0x002d, 0x866: 0x002f, 0x867: 0x0031, 0x868: 0x0033, 0x869: 0x19af,
+	0x86a: 0x19b2, 0x86b: 0x19b5, 0x86c: 0x19b8, 0x86d: 0x19bb, 0x86e: 0x19be, 0x86f: 0x19c1,
+	0x870: 0x19c4, 0x871: 0x19c7, 0x872: 0x19ca, 0x873: 0x19d3, 0x874: 0x1b98, 0x875: 0x1b9c,
+	0x876: 0x1ba0, 0x877: 0x1ba4, 0x878: 0x1ba8, 0x879: 0x1bac, 0x87a: 0x1bb0, 0x87b: 0x1bb4,
+	0x87c: 0x1bb8, 0x87d: 0x1db0, 0x87e: 0x1db5, 0x87f: 0x1dba,
+	// Block 0x22, offset 0x880
+	0x880: 0x1dbf, 0x881: 0x1dc4, 0x882: 0x1dc9, 0x883: 0x1dce, 0x884: 0x1dd3, 0x885: 0x1dd8,
+	0x886: 0x1ddd, 0x887: 0x1de2, 0x888: 0x19ac, 0x889: 0x19d0, 0x88a: 0x19f4, 0x88b: 0x1a18,
+	0x88c: 0x1a3c, 0x88d: 0x1a45, 0x88e: 0x1a4b, 0x88f: 0x1a51, 0x890: 0x1a57, 0x891: 0x1c90,
+	0x892: 0x1c94, 0x893: 0x1c98, 0x894: 0x1c9c, 0x895: 0x1ca0, 0x896: 0x1ca4, 0x897: 0x1ca8,
+	0x898: 0x1cac, 0x899: 0x1cb0, 0x89a: 0x1cb4, 0x89b: 0x1cb8, 0x89c: 0x1c24, 0x89d: 0x1c28,
+	0x89e: 0x1c2c, 0x89f: 0x1c30, 0x8a0: 0x1c34, 0x8a1: 0x1c38, 0x8a2: 0x1c3c, 0x8a3: 0x1c40,
+	0x8a4: 0x1c44, 0x8a5: 0x1c48, 0x8a6: 0x1c4c, 0x8a7: 0x1c50, 0x8a8: 0x1c54, 0x8a9: 0x1c58,
+	0x8aa: 0x1c5c, 0x8ab: 0x1c60, 0x8ac: 0x1c64, 0x8ad: 0x1c68, 0x8ae: 0x1c6c, 0x8af: 0x1c70,
+	0x8b0: 0x1c74, 0x8b1: 0x1c78, 0x8b2: 0x1c7c, 0x8b3: 0x1c80, 0x8b4: 0x1c84, 0x8b5: 0x1c88,
+	0x8b6: 0x0043, 0x8b7: 0x0045, 0x8b8: 0x0047, 0x8b9: 0x0049, 0x8ba: 0x004b, 0x8bb: 0x004d,
+	0x8bc: 0x004f, 0x8bd: 0x0051, 0x8be: 0x0053, 0x8bf: 0x0055,
+	// Block 0x23, offset 0x8c0
+	0x8c0: 0x07ba, 0x8c1: 0x07de, 0x8c2: 0x07ea, 0x8c3: 0x07fa, 0x8c4: 0x0802, 0x8c5: 0x080e,
+	0x8c6: 0x0816, 0x8c7: 0x081e, 0x8c8: 0x082a, 0x8c9: 0x087e, 0x8ca: 0x0896, 0x8cb: 0x08a6,
+	0x8cc: 0x08b6, 0x8cd: 0x08c6, 0x8ce: 0x08d6, 0x8cf: 0x08f6, 0x8d0: 0x08fa, 0x8d1: 0x08fe,
+	0x8d2: 0x0932, 0x8d3: 0x095a, 0x8d4: 0x096a, 0x8d5: 0x0972, 0x8d6: 0x0976, 0x8d7: 0x0982,
+	0x8d8: 0x099e, 0x8d9: 0x09a2, 0x8da: 0x09ba, 0x8db: 0x09be, 0x8dc: 0x09c6, 0x8dd: 0x09d6,
+	0x8de: 0x0a72, 0x8df: 0x0a86, 0x8e0: 0x0ac6, 0x8e1: 0x0ada, 0x8e2: 0x0ae2, 0x8e3: 0x0ae6,
+	0x8e4: 0x0af6, 0x8e5: 0x0b12, 0x8e6: 0x0b3e, 0x8e7: 0x0b4a, 0x8e8: 0x0b6a, 0x8e9: 0x0b76,
+	0x8ea: 0x0b7a, 0x8eb: 0x0b7e, 0x8ec: 0x0b96, 0x8ed: 0x0b9a, 0x8ee: 0x0bc6, 0x8ef: 0x0bd2,
+	0x8f0: 0x0bda, 0x8f1: 0x0be2, 0x8f2: 0x0bf2, 0x8f3: 0x0bfa, 0x8f4: 0x0c02, 0x8f5: 0x0c2e,
+	0x8f6: 0x0c32, 0x8f7: 0x0c3a, 0x8f8: 0x0c3e, 0x8f9: 0x0c46, 0x8fa: 0x0c4e, 0x8fb: 0x0c5e,
+	0x8fc: 0x0c7a, 0x8fd: 0x0cf2, 0x8fe: 0x0d06, 0x8ff: 0x0d0a,
+	// Block 0x24, offset 0x900
+	0x900: 0x0d8a, 0x901: 0x0d8e, 0x902: 0x0da2, 0x903: 0x0da6, 0x904: 0x0dae, 0x905: 0x0db6,
+	0x906: 0x0dbe, 0x907: 0x0dca, 0x908: 0x0df2, 0x909: 0x0e02, 0x90a: 0x0e16, 0x90b: 0x0e86,
+	0x90c: 0x0e92, 0x90d: 0x0ea2, 0x90e: 0x0eae, 0x90f: 0x0eba, 0x910: 0x0ec2, 0x911: 0x0ec6,
+	0x912: 0x0eca, 0x913: 0x0ece, 0x914: 0x0ed2, 0x915: 0x0f8a, 0x916: 0x0fd2, 0x917: 0x0fde,
+	0x918: 0x0fe2, 0x919: 0x0fe6, 0x91a: 0x0fea, 0x91b: 0x0ff2, 0x91c: 0x0ff6, 0x91d: 0x100a,
+	0x91e: 0x1026, 0x91f: 0x102e, 0x920: 0x106e, 0x921: 0x1072, 0x922: 0x107a, 0x923: 0x107e,
+	0x924: 0x1086, 0x925: 0x108a, 0x926: 0x10ae, 0x927: 0x10b2, 0x928: 0x10ce, 0x929: 0x10d2,
+	0x92a: 0x10d6, 0x92b: 0x10da, 0x92c: 0x10ee, 0x92d: 0x1112, 0x92e: 0x1116, 0x92f: 0x111a,
+	0x930: 0x113e, 0x931: 0x117e, 0x932: 0x1182, 0x933: 0x11a2, 0x934: 0x11b2, 0x935: 0x11ba,
+	0x936: 0x11da, 0x937: 0x11fe, 0x938: 0x1242, 0x939: 0x124a, 0x93a: 0x125e, 0x93b: 0x126a,
+	0x93c: 0x1272, 0x93d: 0x127a, 0x93e: 0x127e, 0x93f: 0x1282,
+	// Block 0x25, offset 0x940
+	0x940: 0x129a, 0x941: 0x129e, 0x942: 0x12ba, 0x943: 0x12c2, 0x944: 0x12ca, 0x945: 0x12ce,
+	0x946: 0x12da, 0x947: 0x12e2, 0x948: 0x12e6, 0x949: 0x12ea, 0x94a: 0x12f2, 0x94b: 0x12f6,
+	0x94c: 0x1396, 0x94d: 0x13aa, 0x94e: 0x13de, 0x94f: 0x13e2, 0x950: 0x13ea, 0x951: 0x1416,
+	0x952: 0x141e, 0x953: 0x1426, 0x954: 0x142e, 0x955: 0x146a, 0x956: 0x146e, 0x957: 0x1476,
+	0x958: 0x147a, 0x959: 0x147e, 0x95a: 0x14aa, 0x95b: 0x14ae, 0x95c: 0x14b6, 0x95d: 0x14ca,
+	0x95e: 0x14ce, 0x95f: 0x14ea, 0x960: 0x14f2, 0x961: 0x14f6, 0x962: 0x151a, 0x963: 0x153a,
+	0x964: 0x154e, 0x965: 0x1552, 0x966: 0x155a, 0x967: 0x1586, 0x968: 0x158a, 0x969: 0x159a,
+	0x96a: 0x15be, 0x96b: 0x15ca, 0x96c: 0x15da, 0x96d: 0x15f2, 0x96e: 0x15fa, 0x96f: 0x15fe,
+	0x970: 0x1602, 0x971: 0x1606, 0x972: 0x1612, 0x973: 0x1616, 0x974: 0x161e, 0x975: 0x163a,
+	0x976: 0x163e, 0x977: 0x1642, 0x978: 0x165a, 0x979: 0x165e, 0x97a: 0x1666, 0x97b: 0x167a,
+	0x97c: 0x167e, 0x97d: 0x1682, 0x97e: 0x168a, 0x97f: 0x168e,
+	// Block 0x26, offset 0x980
+	0x986: 0xa000, 0x98b: 0xa000,
+	0x98c: 0x4049, 0x98d: 0xa000, 0x98e: 0x4051, 0x98f: 0xa000, 0x990: 0x4059, 0x991: 0xa000,
+	0x992: 0x4061, 0x993: 0xa000, 0x994: 0x4069, 0x995: 0xa000, 0x996: 0x4071, 0x997: 0xa000,
+	0x998: 0x4079, 0x999: 0xa000, 0x99a: 0x4081, 0x99b: 0xa000, 0x99c: 0x4089, 0x99d: 0xa000,
+	0x99e: 0x4091, 0x99f: 0xa000, 0x9a0: 0x4099, 0x9a1: 0xa000, 0x9a2: 0x40a1,
+	0x9a4: 0xa000, 0x9a5: 0x40a9, 0x9a6: 0xa000, 0x9a7: 0x40b1, 0x9a8: 0xa000, 0x9a9: 0x40b9,
+	0x9af: 0xa000,
+	0x9b0: 0x40c1, 0x9b1: 0x40c9, 0x9b2: 0xa000, 0x9b3: 0x40d1, 0x9b4: 0x40d9, 0x9b5: 0xa000,
+	0x9b6: 0x40e1, 0x9b7: 0x40e9, 0x9b8: 0xa000, 0x9b9: 0x40f1, 0x9ba: 0x40f9, 0x9bb: 0xa000,
+	0x9bc: 0x4101, 0x9bd: 0x4109,
+	// Block 0x27, offset 0x9c0
+	0x9d4: 0x4041,
+	0x9d9: 0x9904, 0x9da: 0x9904, 0x9db: 0x441d, 0x9dc: 0x4423, 0x9dd: 0xa000,
+	0x9de: 0x4111, 0x9df: 0x27e4,
+	0x9e6: 0xa000,
+	0x9eb: 0xa000, 0x9ec: 0x4121, 0x9ed: 0xa000, 0x9ee: 0x4129, 0x9ef: 0xa000,
+	0x9f0: 0x4131, 0x9f1: 0xa000, 0x9f2: 0x4139, 0x9f3: 0xa000, 0x9f4: 0x4141, 0x9f5: 0xa000,
+	0x9f6: 0x4149, 0x9f7: 0xa000, 0x9f8: 0x4151, 0x9f9: 0xa000, 0x9fa: 0x4159, 0x9fb: 0xa000,
+	0x9fc: 0x4161, 0x9fd: 0xa000, 0x9fe: 0x4169, 0x9ff: 0xa000,
+	// Block 0x28, offset 0xa00
+	0xa00: 0x4171, 0xa01: 0xa000, 0xa02: 0x4179, 0xa04: 0xa000, 0xa05: 0x4181,
+	0xa06: 0xa000, 0xa07: 0x4189, 0xa08: 0xa000, 0xa09: 0x4191,
+	0xa0f: 0xa000, 0xa10: 0x4199, 0xa11: 0x41a1,
+	0xa12: 0xa000, 0xa13: 0x41a9, 0xa14: 0x41b1, 0xa15: 0xa000, 0xa16: 0x41b9, 0xa17: 0x41c1,
+	0xa18: 0xa000, 0xa19: 0x41c9, 0xa1a: 0x41d1, 0xa1b: 0xa000, 0xa1c: 0x41d9, 0xa1d: 0x41e1,
+	0xa2f: 0xa000,
+	0xa30: 0xa000, 0xa31: 0xa000, 0xa32: 0xa000, 0xa34: 0x4119,
+	0xa37: 0x41e9, 0xa38: 0x41f1, 0xa39: 0x41f9, 0xa3a: 0x4201,
+	0xa3d: 0xa000, 0xa3e: 0x4209, 0xa3f: 0x27f9,
+	// Block 0x29, offset 0xa40
+	0xa40: 0x045a, 0xa41: 0x041e, 0xa42: 0x0422, 0xa43: 0x0426, 0xa44: 0x046e, 0xa45: 0x042a,
+	0xa46: 0x042e, 0xa47: 0x0432, 0xa48: 0x0436, 0xa49: 0x043a, 0xa4a: 0x043e, 0xa4b: 0x0442,
+	0xa4c: 0x0446, 0xa4d: 0x044a, 0xa4e: 0x044e, 0xa4f: 0x4afe, 0xa50: 0x4b04, 0xa51: 0x4b0a,
+	0xa52: 0x4b10, 0xa53: 0x4b16, 0xa54: 0x4b1c, 0xa55: 0x4b22, 0xa56: 0x4b28, 0xa57: 0x4b2e,
+	0xa58: 0x4b34, 0xa59: 0x4b3a, 0xa5a: 0x4b40, 0xa5b: 0x4b46, 0xa5c: 0x4b4c, 0xa5d: 0x4b52,
+	0xa5e: 0x4b58, 0xa5f: 0x4b5e, 0xa60: 0x4b64, 0xa61: 0x4b6a, 0xa62: 0x4b70, 0xa63: 0x4b76,
+	0xa64: 0x04b6, 0xa65: 0x0452, 0xa66: 0x0456, 0xa67: 0x04da, 0xa68: 0x04de, 0xa69: 0x04e2,
+	0xa6a: 0x04e6, 0xa6b: 0x04ea, 0xa6c: 0x04ee, 0xa6d: 0x04f2, 0xa6e: 0x045e, 0xa6f: 0x04f6,
+	0xa70: 0x04fa, 0xa71: 0x0462, 0xa72: 0x0466, 0xa73: 0x046a, 0xa74: 0x0472, 0xa75: 0x0476,
+	0xa76: 0x047a, 0xa77: 0x047e, 0xa78: 0x0482, 0xa79: 0x0486, 0xa7a: 0x048a, 0xa7b: 0x048e,
+	0xa7c: 0x0492, 0xa7d: 0x0496, 0xa7e: 0x049a, 0xa7f: 0x049e,
+	// Block 0x2a, offset 0xa80
+	0xa80: 0x04a2, 0xa81: 0x04a6, 0xa82: 0x04fe, 0xa83: 0x0502, 0xa84: 0x04aa, 0xa85: 0x04ae,
+	0xa86: 0x04b2, 0xa87: 0x04ba, 0xa88: 0x04be, 0xa89: 0x04c2, 0xa8a: 0x04c6, 0xa8b: 0x04ca,
+	0xa8c: 0x04ce, 0xa8d: 0x04d2, 0xa8e: 0x04d6,
+	0xa92: 0x07ba, 0xa93: 0x0816, 0xa94: 0x07c6, 0xa95: 0x0a76, 0xa96: 0x07ca, 0xa97: 0x07e2,
+	0xa98: 0x07ce, 0xa99: 0x108e, 0xa9a: 0x0802, 0xa9b: 0x07d6, 0xa9c: 0x07be, 0xa9d: 0x0afa,
+	0xa9e: 0x0a8a, 0xa9f: 0x082a,
+	// Block 0x2b, offset 0xac0
+	0xac0: 0x2184, 0xac1: 0x218a, 0xac2: 0x2190, 0xac3: 0x2196, 0xac4: 0x219c, 0xac5: 0x21a2,
+	0xac6: 0x21a8, 0xac7: 0x21ae, 0xac8: 0x21b4, 0xac9: 0x21ba, 0xaca: 0x21c0, 0xacb: 0x21c6,
+	0xacc: 0x21cc, 0xacd: 0x21d2, 0xace: 0x285d, 0xacf: 0x2866, 0xad0: 0x286f, 0xad1: 0x2878,
+	0xad2: 0x2881, 0xad3: 0x288a, 0xad4: 0x2893, 0xad5: 0x289c, 0xad6: 0x28a5, 0xad7: 0x28b7,
+	0xad8: 0x28c0, 0xad9: 0x28c9, 0xada: 0x28d2, 0xadb: 0x28db, 0xadc: 0x28ae, 0xadd: 0x2ce3,
+	0xade: 0x2c24, 0xae0: 0x21d8, 0xae1: 0x21f0, 0xae2: 0x21e4, 0xae3: 0x2238,
+	0xae4: 0x21f6, 0xae5: 0x2214, 0xae6: 0x21de, 0xae7: 0x220e, 0xae8: 0x21ea, 0xae9: 0x2220,
+	0xaea: 0x2250, 0xaeb: 0x226e, 0xaec: 0x2268, 0xaed: 0x225c, 0xaee: 0x22aa, 0xaef: 0x223e,
+	0xaf0: 0x224a, 0xaf1: 0x2262, 0xaf2: 0x2256, 0xaf3: 0x2280, 0xaf4: 0x222c, 0xaf5: 0x2274,
+	0xaf6: 0x229e, 0xaf7: 0x2286, 0xaf8: 0x221a, 0xaf9: 0x21fc, 0xafa: 0x2232, 0xafb: 0x2244,
+	0xafc: 0x227a, 0xafd: 0x2202, 0xafe: 0x22a4, 0xaff: 0x2226,
+	// Block 0x2c, offset 0xb00
+	0xb00: 0x228c, 0xb01: 0x2208, 0xb02: 0x2292, 0xb03: 0x2298, 0xb04: 0x0a2a, 0xb05: 0x0bfe,
+	0xb06: 0x0da2, 0xb07: 0x11c2,
+	0xb10: 0x1cf4, 0xb11: 0x19d6,
+	0xb12: 0x19d9, 0xb13: 0x19dc, 0xb14: 0x19df, 0xb15: 0x19e2, 0xb16: 0x19e5, 0xb17: 0x19e8,
+	0xb18: 0x19eb, 0xb19: 0x19ee, 0xb1a: 0x19f7, 0xb1b: 0x19fa, 0xb1c: 0x19fd, 0xb1d: 0x1a00,
+	0xb1e: 0x1a03, 0xb1f: 0x1a06, 0xb20: 0x0406, 0xb21: 0x040e, 0xb22: 0x0412, 0xb23: 0x041a,
+	0xb24: 0x041e, 0xb25: 0x0422, 0xb26: 0x042a, 0xb27: 0x0432, 0xb28: 0x0436, 0xb29: 0x043e,
+	0xb2a: 0x0442, 0xb2b: 0x0446, 0xb2c: 0x044a, 0xb2d: 0x044e, 0xb2e: 0x2f59, 0xb2f: 0x2f61,
+	0xb30: 0x2f69, 0xb31: 0x2f71, 0xb32: 0x2f79, 0xb33: 0x2f81, 0xb34: 0x2f89, 0xb35: 0x2f91,
+	0xb36: 0x2fa1, 0xb37: 0x2fa9, 0xb38: 0x2fb1, 0xb39: 0x2fb9, 0xb3a: 0x2fc1, 0xb3b: 0x2fc9,
+	0xb3c: 0x3014, 0xb3d: 0x2fdc, 0xb3e: 0x2f99,
+	// Block 0x2d, offset 0xb40
+	0xb40: 0x07ba, 0xb41: 0x0816, 0xb42: 0x07c6, 0xb43: 0x0a76, 0xb44: 0x081a, 0xb45: 0x08aa,
+	0xb46: 0x07c2, 0xb47: 0x08a6, 0xb48: 0x0806, 0xb49: 0x0982, 0xb4a: 0x0e02, 0xb4b: 0x0f8a,
+	0xb4c: 0x0ed2, 0xb4d: 0x0e16, 0xb4e: 0x155a, 0xb4f: 0x0a86, 0xb50: 0x0dca, 0xb51: 0x0e46,
+	0xb52: 0x0e06, 0xb53: 0x1146, 0xb54: 0x09f6, 0xb55: 0x0ffe, 0xb56: 0x1482, 0xb57: 0x115a,
+	0xb58: 0x093e, 0xb59: 0x118a, 0xb5a: 0x1096, 0xb5b: 0x0b12, 0xb5c: 0x150a, 0xb5d: 0x087a,
+	0xb5e: 0x09a6, 0xb5f: 0x0ef2, 0xb60: 0x1622, 0xb61: 0x083e, 0xb62: 0x08ce, 0xb63: 0x0e96,
+	0xb64: 0x07ca, 0xb65: 0x07e2, 0xb66: 0x07ce, 0xb67: 0x0bd6, 0xb68: 0x09ea, 0xb69: 0x097a,
+	0xb6a: 0x0b52, 0xb6b: 0x0b46, 0xb6c: 0x10e6, 0xb6d: 0x083a, 0xb6e: 0x1496, 0xb6f: 0x0996,
+	0xb70: 0x0aee, 0xb71: 0x1a09, 0xb72: 0x1a0c, 0xb73: 0x1a0f, 0xb74: 0x1a12, 0xb75: 0x1a1b,
+	0xb76: 0x1a1e, 0xb77: 0x1a21, 0xb78: 0x1a24, 0xb79: 0x1a27, 0xb7a: 0x1a2a, 0xb7b: 0x1a2d,
+	0xb7c: 0x1a30, 0xb7d: 0x1a33, 0xb7e: 0x1a36, 0xb7f: 0x1a3f,
+	// Block 0x2e, offset 0xb80
+	0xb80: 0x1df6, 0xb81: 0x1e05, 0xb82: 0x1e14, 0xb83: 0x1e23, 0xb84: 0x1e32, 0xb85: 0x1e41,
+	0xb86: 0x1e50, 0xb87: 0x1e5f, 0xb88: 0x1e6e, 0xb89: 0x22bc, 0xb8a: 0x22ce, 0xb8b: 0x22e0,
+	0xb8c: 0x1a81, 0xb8d: 0x1d34, 0xb8e: 0x1b02, 0xb8f: 0x1cd8, 0xb90: 0x05c6, 0xb91: 0x05ce,
+	0xb92: 0x05d6, 0xb93: 0x05de, 0xb94: 0x05e6, 0xb95: 0x05ea, 0xb96: 0x05ee, 0xb97: 0x05f2,
+	0xb98: 0x05f6, 0xb99: 0x05fa, 0xb9a: 0x05fe, 0xb9b: 0x0602, 0xb9c: 0x0606, 0xb9d: 0x060a,
+	0xb9e: 0x060e, 0xb9f: 0x0612, 0xba0: 0x0616, 0xba1: 0x061e, 0xba2: 0x0622, 0xba3: 0x0626,
+	0xba4: 0x062a, 0xba5: 0x062e, 0xba6: 0x0632, 0xba7: 0x0636, 0xba8: 0x063a, 0xba9: 0x063e,
+	0xbaa: 0x0642, 0xbab: 0x0646, 0xbac: 0x064a, 0xbad: 0x064e, 0xbae: 0x0652, 0xbaf: 0x0656,
+	0xbb0: 0x065a, 0xbb1: 0x065e, 0xbb2: 0x0662, 0xbb3: 0x066a, 0xbb4: 0x0672, 0xbb5: 0x067a,
+	0xbb6: 0x067e, 0xbb7: 0x0682, 0xbb8: 0x0686, 0xbb9: 0x068a, 0xbba: 0x068e, 0xbbb: 0x0692,
+	0xbbc: 0x0696, 0xbbd: 0x069a, 0xbbe: 0x069e, 0xbbf: 0x282a,
+	// Block 0x2f, offset 0xbc0
+	0xbc0: 0x2c43, 0xbc1: 0x2adf, 0xbc2: 0x2c53, 0xbc3: 0x29b7, 0xbc4: 0x3025, 0xbc5: 0x29c1,
+	0xbc6: 0x29cb, 0xbc7: 0x3069, 0xbc8: 0x2aec, 0xbc9: 0x29d5, 0xbca: 0x29df, 0xbcb: 0x29e9,
+	0xbcc: 0x2b13, 0xbcd: 0x2b20, 0xbce: 0x2af9, 0xbcf: 0x2b06, 0xbd0: 0x2fea, 0xbd1: 0x2b2d,
+	0xbd2: 0x2b3a, 0xbd3: 0x2cf5, 0xbd4: 0x27eb, 0xbd5: 0x2d08, 0xbd6: 0x2d1b, 0xbd7: 0x2c63,
+	0xbd8: 0x2b47, 0xbd9: 0x2d2e, 0xbda: 0x2d41, 0xbdb: 0x2b54, 0xbdc: 0x29f3, 0xbdd: 0x29fd,
+	0xbde: 0x2ff8, 0xbdf: 0x2b61, 0xbe0: 0x2c73, 0xbe1: 0x3036, 0xbe2: 0x2a07, 0xbe3: 0x2a11,
+	0xbe4: 0x2b6e, 0xbe5: 0x2a1b, 0xbe6: 0x2a25, 0xbe7: 0x2800, 0xbe8: 0x2807, 0xbe9: 0x2a2f,
+	0xbea: 0x2a39, 0xbeb: 0x2d54, 0xbec: 0x2b7b, 0xbed: 0x2c83, 0xbee: 0x2d67, 0xbef: 0x2b88,
+	0xbf0: 0x2a4d, 0xbf1: 0x2a43, 0xbf2: 0x307d, 0xbf3: 0x2b95, 0xbf4: 0x2d7a, 0xbf5: 0x2a57,
+	0xbf6: 0x2c93, 0xbf7: 0x2a61, 0xbf8: 0x2baf, 0xbf9: 0x2a6b, 0xbfa: 0x2bbc, 0xbfb: 0x3047,
+	0xbfc: 0x2ba2, 0xbfd: 0x2ca3, 0xbfe: 0x2bc9, 0xbff: 0x280e,
+	// Block 0x30, offset 0xc00
+	0xc00: 0x3058, 0xc01: 0x2a75, 0xc02: 0x2a7f, 0xc03: 0x2bd6, 0xc04: 0x2a89, 0xc05: 0x2a93,
+	0xc06: 0x2a9d, 0xc07: 0x2cb3, 0xc08: 0x2be3, 0xc09: 0x2815, 0xc0a: 0x2d8d, 0xc0b: 0x2fd1,
+	0xc0c: 0x2cc3, 0xc0d: 0x2bf0, 0xc0e: 0x3006, 0xc0f: 0x2aa7, 0xc10: 0x2ab1, 0xc11: 0x2bfd,
+	0xc12: 0x281c, 0xc13: 0x2c0a, 0xc14: 0x2cd3, 0xc15: 0x2823, 0xc16: 0x2da0, 0xc17: 0x2abb,
+	0xc18: 0x1de7, 0xc19: 0x1dfb, 0xc1a: 0x1e0a, 0xc1b: 0x1e19, 0xc1c: 0x1e28, 0xc1d: 0x1e37,
+	0xc1e: 0x1e46, 0xc1f: 0x1e55, 0xc20: 0x1e64, 0xc21: 0x1e73, 0xc22: 0x22c2, 0xc23: 0x22d4,
+	0xc24: 0x22e6, 0xc25: 0x22f2, 0xc26: 0x22fe, 0xc27: 0x230a, 0xc28: 0x2316, 0xc29: 0x2322,
+	0xc2a: 0x232e, 0xc2b: 0x233a, 0xc2c: 0x2376, 0xc2d: 0x2382, 0xc2e: 0x238e, 0xc2f: 0x239a,
+	0xc30: 0x23a6, 0xc31: 0x1d44, 0xc32: 0x1af6, 0xc33: 0x1a63, 0xc34: 0x1d14, 0xc35: 0x1b77,
+	0xc36: 0x1b86, 0xc37: 0x1afc, 0xc38: 0x1d2c, 0xc39: 0x1d30, 0xc3a: 0x1a8d, 0xc3b: 0x2838,
+	0xc3c: 0x2846, 0xc3d: 0x2831, 0xc3e: 0x283f, 0xc3f: 0x2c17,
+	// Block 0x31, offset 0xc40
+	0xc40: 0x1b7a, 0xc41: 0x1b62, 0xc42: 0x1d90, 0xc43: 0x1b4a, 0xc44: 0x1b23, 0xc45: 0x1a96,
+	0xc46: 0x1aa5, 0xc47: 0x1a75, 0xc48: 0x1d20, 0xc49: 0x1e82, 0xc4a: 0x1b7d, 0xc4b: 0x1b65,
+	0xc4c: 0x1d94, 0xc4d: 0x1da0, 0xc4e: 0x1b56, 0xc4f: 0x1b2c, 0xc50: 0x1a84, 0xc51: 0x1d4c,
+	0xc52: 0x1ce0, 0xc53: 0x1ccc, 0xc54: 0x1cfc, 0xc55: 0x1da4, 0xc56: 0x1b59, 0xc57: 0x1af9,
+	0xc58: 0x1b2f, 0xc59: 0x1b0e, 0xc5a: 0x1b71, 0xc5b: 0x1da8, 0xc5c: 0x1b5c, 0xc5d: 0x1af0,
+	0xc5e: 0x1b32, 0xc5f: 0x1d6c, 0xc60: 0x1d24, 0xc61: 0x1b44, 0xc62: 0x1d54, 0xc63: 0x1d70,
+	0xc64: 0x1d28, 0xc65: 0x1b47, 0xc66: 0x1d58, 0xc67: 0x2418, 0xc68: 0x242c, 0xc69: 0x1ac6,
+	0xc6a: 0x1d50, 0xc6b: 0x1ce4, 0xc6c: 0x1cd0, 0xc6d: 0x1d78, 0xc6e: 0x284d, 0xc6f: 0x28e4,
+	0xc70: 0x1b89, 0xc71: 0x1b74, 0xc72: 0x1dac, 0xc73: 0x1b5f, 0xc74: 0x1b80, 0xc75: 0x1b68,
+	0xc76: 0x1d98, 0xc77: 0x1b4d, 0xc78: 0x1b26, 0xc79: 0x1ab1, 0xc7a: 0x1b83, 0xc7b: 0x1b6b,
+	0xc7c: 0x1d9c, 0xc7d: 0x1b50, 0xc7e: 0x1b29, 0xc7f: 0x1ab4,
+	// Block 0x32, offset 0xc80
+	0xc80: 0x1d5c, 0xc81: 0x1ce8, 0xc82: 0x1e7d, 0xc83: 0x1a66, 0xc84: 0x1aea, 0xc85: 0x1aed,
+	0xc86: 0x2425, 0xc87: 0x1cc4, 0xc88: 0x1af3, 0xc89: 0x1a78, 0xc8a: 0x1b11, 0xc8b: 0x1a7b,
+	0xc8c: 0x1b1a, 0xc8d: 0x1a99, 0xc8e: 0x1a9c, 0xc8f: 0x1b35, 0xc90: 0x1b3b, 0xc91: 0x1b3e,
+	0xc92: 0x1d60, 0xc93: 0x1b41, 0xc94: 0x1b53, 0xc95: 0x1d68, 0xc96: 0x1d74, 0xc97: 0x1ac0,
+	0xc98: 0x1e87, 0xc99: 0x1cec, 0xc9a: 0x1ac3, 0xc9b: 0x1b8c, 0xc9c: 0x1ad5, 0xc9d: 0x1ae4,
+	0xc9e: 0x2412, 0xc9f: 0x240c, 0xca0: 0x1df1, 0xca1: 0x1e00, 0xca2: 0x1e0f, 0xca3: 0x1e1e,
+	0xca4: 0x1e2d, 0xca5: 0x1e3c, 0xca6: 0x1e4b, 0xca7: 0x1e5a, 0xca8: 0x1e69, 0xca9: 0x22b6,
+	0xcaa: 0x22c8, 0xcab: 0x22da, 0xcac: 0x22ec, 0xcad: 0x22f8, 0xcae: 0x2304, 0xcaf: 0x2310,
+	0xcb0: 0x231c, 0xcb1: 0x2328, 0xcb2: 0x2334, 0xcb3: 0x2370, 0xcb4: 0x237c, 0xcb5: 0x2388,
+	0xcb6: 0x2394, 0xcb7: 0x23a0, 0xcb8: 0x23ac, 0xcb9: 0x23b2, 0xcba: 0x23b8, 0xcbb: 0x23be,
+	0xcbc: 0x23c4, 0xcbd: 0x23d6, 0xcbe: 0x23dc, 0xcbf: 0x1d40,
+	// Block 0x33, offset 0xcc0
+	0xcc0: 0x1472, 0xcc1: 0x0df6, 0xcc2: 0x14ce, 0xcc3: 0x149a, 0xcc4: 0x0f52, 0xcc5: 0x07e6,
+	0xcc6: 0x09da, 0xcc7: 0x1726, 0xcc8: 0x1726, 0xcc9: 0x0b06, 0xcca: 0x155a, 0xccb: 0x0a3e,
+	0xccc: 0x0b02, 0xccd: 0x0cea, 0xcce: 0x10ca, 0xccf: 0x125a, 0xcd0: 0x1392, 0xcd1: 0x13ce,
+	0xcd2: 0x1402, 0xcd3: 0x1516, 0xcd4: 0x0e6e, 0xcd5: 0x0efa, 0xcd6: 0x0fa6, 0xcd7: 0x103e,
+	0xcd8: 0x135a, 0xcd9: 0x1542, 0xcda: 0x166e, 0xcdb: 0x080a, 0xcdc: 0x09ae, 0xcdd: 0x0e82,
+	0xcde: 0x0fca, 0xcdf: 0x138e, 0xce0: 0x16be, 0xce1: 0x0bae, 0xce2: 0x0f72, 0xce3: 0x137e,
+	0xce4: 0x1412, 0xce5: 0x0d1e, 0xce6: 0x12b6, 0xce7: 0x13da, 0xce8: 0x0c1a, 0xce9: 0x0e0a,
+	0xcea: 0x0f12, 0xceb: 0x1016, 0xcec: 0x1522, 0xced: 0x084a, 0xcee: 0x08e2, 0xcef: 0x094e,
+	0xcf0: 0x0d86, 0xcf1: 0x0e7a, 0xcf2: 0x0fc6, 0xcf3: 0x10ea, 0xcf4: 0x1272, 0xcf5: 0x1386,
+	0xcf6: 0x139e, 0xcf7: 0x14c2, 0xcf8: 0x15ea, 0xcf9: 0x169e, 0xcfa: 0x16ba, 0xcfb: 0x1126,
+	0xcfc: 0x1166, 0xcfd: 0x121e, 0xcfe: 0x133e, 0xcff: 0x1576,
+	// Block 0x34, offset 0xd00
+	0xd00: 0x16c6, 0xd01: 0x1446, 0xd02: 0x0ac2, 0xd03: 0x0c36, 0xd04: 0x11d6, 0xd05: 0x1296,
+	0xd06: 0x0ffa, 0xd07: 0x112e, 0xd08: 0x1492, 0xd09: 0x15e2, 0xd0a: 0x0abe, 0xd0b: 0x0b8a,
+	0xd0c: 0x0e72, 0xd0d: 0x0f26, 0xd0e: 0x0f5a, 0xd0f: 0x120e, 0xd10: 0x1236, 0xd11: 0x15a2,
+	0xd12: 0x094a, 0xd13: 0x12a2, 0xd14: 0x08ee, 0xd15: 0x08ea, 0xd16: 0x1192, 0xd17: 0x1222,
+	0xd18: 0x1356, 0xd19: 0x15aa, 0xd1a: 0x1462, 0xd1b: 0x0d22, 0xd1c: 0x0e6e, 0xd1d: 0x1452,
+	0xd1e: 0x07f2, 0xd1f: 0x0b5e, 0xd20: 0x0c8e, 0xd21: 0x102a, 0xd22: 0x10aa, 0xd23: 0x096e,
+	0xd24: 0x1136, 0xd25: 0x085a, 0xd26: 0x0c72, 0xd27: 0x07d2, 0xd28: 0x0ee6, 0xd29: 0x0d9e,
+	0xd2a: 0x120a, 0xd2b: 0x09c2, 0xd2c: 0x0aae, 0xd2d: 0x10f6, 0xd2e: 0x135e, 0xd2f: 0x1436,
+	0xd30: 0x0eb2, 0xd31: 0x14f2, 0xd32: 0x0ede, 0xd33: 0x0d32, 0xd34: 0x1316, 0xd35: 0x0d52,
+	0xd36: 0x10a6, 0xd37: 0x0826, 0xd38: 0x08a2, 0xd39: 0x08e6, 0xd3a: 0x0e4e, 0xd3b: 0x11f6,
+	0xd3c: 0x12ee, 0xd3d: 0x1442, 0xd3e: 0x1556, 0xd3f: 0x0956,
+	// Block 0x35, offset 0xd40
+	0xd40: 0x0a0a, 0xd41: 0x0b12, 0xd42: 0x0c2a, 0xd43: 0x0dba, 0xd44: 0x0f76, 0xd45: 0x113a,
+	0xd46: 0x1592, 0xd47: 0x1676, 0xd48: 0x16ca, 0xd49: 0x16e2, 0xd4a: 0x0932, 0xd4b: 0x0dee,
+	0xd4c: 0x0e9e, 0xd4d: 0x14e6, 0xd4e: 0x0bf6, 0xd4f: 0x0cd2, 0xd50: 0x0cee, 0xd51: 0x0d7e,
+	0xd52: 0x0f66, 0xd53: 0x0fb2, 0xd54: 0x1062, 0xd55: 0x1186, 0xd56: 0x122a, 0xd57: 0x128e,
+	0xd58: 0x14d6, 0xd59: 0x1366, 0xd5a: 0x14fe, 0xd5b: 0x157a, 0xd5c: 0x090a, 0xd5d: 0x0936,
+	0xd5e: 0x0a1e, 0xd5f: 0x0fa2, 0xd60: 0x13ee, 0xd61: 0x1436, 0xd62: 0x0c16, 0xd63: 0x0c86,
+	0xd64: 0x0d4a, 0xd65: 0x0eaa, 0xd66: 0x11d2, 0xd67: 0x101e, 0xd68: 0x0836, 0xd69: 0x0a7a,
+	0xd6a: 0x0b5e, 0xd6b: 0x0bc2, 0xd6c: 0x0c92, 0xd6d: 0x103a, 0xd6e: 0x1056, 0xd6f: 0x1266,
+	0xd70: 0x1286, 0xd71: 0x155e, 0xd72: 0x15de, 0xd73: 0x15ee, 0xd74: 0x162a, 0xd75: 0x084e,
+	0xd76: 0x117a, 0xd77: 0x154a, 0xd78: 0x15c6, 0xd79: 0x0caa, 0xd7a: 0x0812, 0xd7b: 0x0872,
+	0xd7c: 0x0b62, 0xd7d: 0x0b82, 0xd7e: 0x0daa, 0xd7f: 0x0e6e,
+	// Block 0x36, offset 0xd80
+	0xd80: 0x0fbe, 0xd81: 0x10c6, 0xd82: 0x1372, 0xd83: 0x1512, 0xd84: 0x171e, 0xd85: 0x0dde,
+	0xd86: 0x159e, 0xd87: 0x092e, 0xd88: 0x0e2a, 0xd89: 0x0e36, 0xd8a: 0x0f0a, 0xd8b: 0x0f42,
+	0xd8c: 0x1046, 0xd8d: 0x10a2, 0xd8e: 0x1122, 0xd8f: 0x1206, 0xd90: 0x1636, 0xd91: 0x08aa,
+	0xd92: 0x0cfe, 0xd93: 0x15ae, 0xd94: 0x0862, 0xd95: 0x0ba6, 0xd96: 0x0f2a, 0xd97: 0x14da,
+	0xd98: 0x0c62, 0xd99: 0x0cb2, 0xd9a: 0x0e3e, 0xd9b: 0x102a, 0xd9c: 0x15b6, 0xd9d: 0x0912,
+	0xd9e: 0x09fa, 0xd9f: 0x0b92, 0xda0: 0x0dce, 0xda1: 0x0e1a, 0xda2: 0x0e5a, 0xda3: 0x0eee,
+	0xda4: 0x1042, 0xda5: 0x10b6, 0xda6: 0x1252, 0xda7: 0x13f2, 0xda8: 0x13fe, 0xda9: 0x1552,
+	0xdaa: 0x15d2, 0xdab: 0x097e, 0xdac: 0x0f46, 0xdad: 0x09fe, 0xdae: 0x0fc2, 0xdaf: 0x1066,
+	0xdb0: 0x1382, 0xdb1: 0x15ba, 0xdb2: 0x16a6, 0xdb3: 0x16ce, 0xdb4: 0x0e32, 0xdb5: 0x0f22,
+	0xdb6: 0x12be, 0xdb7: 0x11b2, 0xdb8: 0x11be, 0xdb9: 0x11e2, 0xdba: 0x1012, 0xdbb: 0x0f9a,
+	0xdbc: 0x145e, 0xdbd: 0x082e, 0xdbe: 0x1326, 0xdbf: 0x0916,
+	// Block 0x37, offset 0xdc0
+	0xdc0: 0x0906, 0xdc1: 0x0c06, 0xdc2: 0x0d26, 0xdc3: 0x11ee, 0xdc4: 0x0b4e, 0xdc5: 0x0efe,
+	0xdc6: 0x0dea, 0xdc7: 0x14e2, 0xdc8: 0x13e2, 0xdc9: 0x15a6, 0xdca: 0x141e, 0xdcb: 0x0c22,
+	0xdcc: 0x0882, 0xdcd: 0x0a56, 0xdd0: 0x0aaa,
+	0xdd2: 0x0dda, 0xdd5: 0x08f2, 0xdd6: 0x101a, 0xdd7: 0x10de,
+	0xdd8: 0x1142, 0xdd9: 0x115e, 0xdda: 0x1162, 0xddb: 0x1176, 0xddc: 0x15f6, 0xddd: 0x11e6,
+	0xdde: 0x126a, 0xde0: 0x138a, 0xde2: 0x144e,
+	0xde5: 0x1502, 0xde6: 0x152e,
+	0xdea: 0x164a, 0xdeb: 0x164e, 0xdec: 0x1652, 0xded: 0x16b6, 0xdee: 0x1526, 0xdef: 0x15c2,
+	0xdf0: 0x0852, 0xdf1: 0x0876, 0xdf2: 0x088a, 0xdf3: 0x0946, 0xdf4: 0x0952, 0xdf5: 0x0992,
+	0xdf6: 0x0a46, 0xdf7: 0x0a62, 0xdf8: 0x0a6a, 0xdf9: 0x0aa6, 0xdfa: 0x0ab2, 0xdfb: 0x0b8e,
+	0xdfc: 0x0b96, 0xdfd: 0x0c9e, 0xdfe: 0x0cc6, 0xdff: 0x0cce,
+	// Block 0x38, offset 0xe00
+	0xe00: 0x0ce6, 0xe01: 0x0d92, 0xe02: 0x0dc2, 0xe03: 0x0de2, 0xe04: 0x0e52, 0xe05: 0x0f16,
+	0xe06: 0x0f32, 0xe07: 0x0f62, 0xe08: 0x0fb6, 0xe09: 0x0fd6, 0xe0a: 0x104a, 0xe0b: 0x112a,
+	0xe0c: 0x1146, 0xe0d: 0x114e, 0xe0e: 0x114a, 0xe0f: 0x1152, 0xe10: 0x1156, 0xe11: 0x115a,
+	0xe12: 0x116e, 0xe13: 0x1172, 0xe14: 0x1196, 0xe15: 0x11aa, 0xe16: 0x11c6, 0xe17: 0x122a,
+	0xe18: 0x1232, 0xe19: 0x123a, 0xe1a: 0x124e, 0xe1b: 0x1276, 0xe1c: 0x12c6, 0xe1d: 0x12fa,
+	0xe1e: 0x12fa, 0xe1f: 0x1362, 0xe20: 0x140a, 0xe21: 0x1422, 0xe22: 0x1456, 0xe23: 0x145a,
+	0xe24: 0x149e, 0xe25: 0x14a2, 0xe26: 0x14fa, 0xe27: 0x1502, 0xe28: 0x15d6, 0xe29: 0x161a,
+	0xe2a: 0x1632, 0xe2b: 0x0c96, 0xe2c: 0x184b, 0xe2d: 0x12de,
+	0xe30: 0x07da, 0xe31: 0x08de, 0xe32: 0x089e, 0xe33: 0x0846, 0xe34: 0x0886, 0xe35: 0x08b2,
+	0xe36: 0x0942, 0xe37: 0x095e, 0xe38: 0x0a46, 0xe39: 0x0a32, 0xe3a: 0x0a42, 0xe3b: 0x0a5e,
+	0xe3c: 0x0aaa, 0xe3d: 0x0aba, 0xe3e: 0x0afe, 0xe3f: 0x0b0a,
+	// Block 0x39, offset 0xe40
+	0xe40: 0x0b26, 0xe41: 0x0b36, 0xe42: 0x0c1e, 0xe43: 0x0c26, 0xe44: 0x0c56, 0xe45: 0x0c76,
+	0xe46: 0x0ca6, 0xe47: 0x0cbe, 0xe48: 0x0cae, 0xe49: 0x0cce, 0xe4a: 0x0cc2, 0xe4b: 0x0ce6,
+	0xe4c: 0x0d02, 0xe4d: 0x0d5a, 0xe4e: 0x0d66, 0xe4f: 0x0d6e, 0xe50: 0x0d96, 0xe51: 0x0dda,
+	0xe52: 0x0e0a, 0xe53: 0x0e0e, 0xe54: 0x0e22, 0xe55: 0x0ea2, 0xe56: 0x0eb2, 0xe57: 0x0f0a,
+	0xe58: 0x0f56, 0xe59: 0x0f4e, 0xe5a: 0x0f62, 0xe5b: 0x0f7e, 0xe5c: 0x0fb6, 0xe5d: 0x110e,
+	0xe5e: 0x0fda, 0xe5f: 0x100e, 0xe60: 0x101a, 0xe61: 0x105a, 0xe62: 0x1076, 0xe63: 0x109a,
+	0xe64: 0x10be, 0xe65: 0x10c2, 0xe66: 0x10de, 0xe67: 0x10e2, 0xe68: 0x10f2, 0xe69: 0x1106,
+	0xe6a: 0x1102, 0xe6b: 0x1132, 0xe6c: 0x11ae, 0xe6d: 0x11c6, 0xe6e: 0x11de, 0xe6f: 0x1216,
+	0xe70: 0x122a, 0xe71: 0x1246, 0xe72: 0x1276, 0xe73: 0x132a, 0xe74: 0x1352, 0xe75: 0x13c6,
+	0xe76: 0x140e, 0xe77: 0x141a, 0xe78: 0x1422, 0xe79: 0x143a, 0xe7a: 0x144e, 0xe7b: 0x143e,
+	0xe7c: 0x1456, 0xe7d: 0x1452, 0xe7e: 0x144a, 0xe7f: 0x145a,
+	// Block 0x3a, offset 0xe80
+	0xe80: 0x1466, 0xe81: 0x14a2, 0xe82: 0x14de, 0xe83: 0x150e, 0xe84: 0x1546, 0xe85: 0x1566,
+	0xe86: 0x15b2, 0xe87: 0x15d6, 0xe88: 0x15f6, 0xe89: 0x160a, 0xe8a: 0x161a, 0xe8b: 0x1626,
+	0xe8c: 0x1632, 0xe8d: 0x1686, 0xe8e: 0x1726, 0xe8f: 0x17e2, 0xe90: 0x17dd, 0xe91: 0x180f,
+	0xe92: 0x0702, 0xe93: 0x072a, 0xe94: 0x072e, 0xe95: 0x1891, 0xe96: 0x18be, 0xe97: 0x1936,
+	0xe98: 0x1712, 0xe99: 0x1722,
+	// Block 0x3b, offset 0xec0
+	0xec0: 0x1b05, 0xec1: 0x1b08, 0xec2: 0x1b0b, 0xec3: 0x1d38, 0xec4: 0x1d3c, 0xec5: 0x1b8f,
+	0xec6: 0x1b8f,
+	0xed3: 0x1ea5, 0xed4: 0x1e96, 0xed5: 0x1e9b, 0xed6: 0x1eaa, 0xed7: 0x1ea0,
+	0xedd: 0x44d1,
+	0xede: 0x8116, 0xedf: 0x4543, 0xee0: 0x0320, 0xee1: 0x0308, 0xee2: 0x0311, 0xee3: 0x0314,
+	0xee4: 0x0317, 0xee5: 0x031a, 0xee6: 0x031d, 0xee7: 0x0323, 0xee8: 0x0326, 0xee9: 0x0017,
+	0xeea: 0x4531, 0xeeb: 0x4537, 0xeec: 0x4635, 0xeed: 0x463d, 0xeee: 0x4489, 0xeef: 0x448f,
+	0xef0: 0x4495, 0xef1: 0x449b, 0xef2: 0x44a7, 0xef3: 0x44ad, 0xef4: 0x44b3, 0xef5: 0x44bf,
+	0xef6: 0x44c5, 0xef8: 0x44cb, 0xef9: 0x44d7, 0xefa: 0x44dd, 0xefb: 0x44e3,
+	0xefc: 0x44ef, 0xefe: 0x44f5,
+	// Block 0x3c, offset 0xf00
+	0xf00: 0x44fb, 0xf01: 0x4501, 0xf03: 0x4507, 0xf04: 0x450d,
+	0xf06: 0x4519, 0xf07: 0x451f, 0xf08: 0x4525, 0xf09: 0x452b, 0xf0a: 0x453d, 0xf0b: 0x44b9,
+	0xf0c: 0x44a1, 0xf0d: 0x44e9, 0xf0e: 0x4513, 0xf0f: 0x1eaf, 0xf10: 0x038c, 0xf11: 0x038c,
+	0xf12: 0x0395, 0xf13: 0x0395, 0xf14: 0x0395, 0xf15: 0x0395, 0xf16: 0x0398, 0xf17: 0x0398,
+	0xf18: 0x0398, 0xf19: 0x0398, 0xf1a: 0x039e, 0xf1b: 0x039e, 0xf1c: 0x039e, 0xf1d: 0x039e,
+	0xf1e: 0x0392, 0xf1f: 0x0392, 0xf20: 0x0392, 0xf21: 0x0392, 0xf22: 0x039b, 0xf23: 0x039b,
+	0xf24: 0x039b, 0xf25: 0x039b, 0xf26: 0x038f, 0xf27: 0x038f, 0xf28: 0x038f, 0xf29: 0x038f,
+	0xf2a: 0x03c2, 0xf2b: 0x03c2, 0xf2c: 0x03c2, 0xf2d: 0x03c2, 0xf2e: 0x03c5, 0xf2f: 0x03c5,
+	0xf30: 0x03c5, 0xf31: 0x03c5, 0xf32: 0x03a4, 0xf33: 0x03a4, 0xf34: 0x03a4, 0xf35: 0x03a4,
+	0xf36: 0x03a1, 0xf37: 0x03a1, 0xf38: 0x03a1, 0xf39: 0x03a1, 0xf3a: 0x03a7, 0xf3b: 0x03a7,
+	0xf3c: 0x03a7, 0xf3d: 0x03a7, 0xf3e: 0x03aa, 0xf3f: 0x03aa,
+	// Block 0x3d, offset 0xf40
+	0xf40: 0x03aa, 0xf41: 0x03aa, 0xf42: 0x03b3, 0xf43: 0x03b3, 0xf44: 0x03b0, 0xf45: 0x03b0,
+	0xf46: 0x03b6, 0xf47: 0x03b6, 0xf48: 0x03ad, 0xf49: 0x03ad, 0xf4a: 0x03bc, 0xf4b: 0x03bc,
+	0xf4c: 0x03b9, 0xf4d: 0x03b9, 0xf4e: 0x03c8, 0xf4f: 0x03c8, 0xf50: 0x03c8, 0xf51: 0x03c8,
+	0xf52: 0x03ce, 0xf53: 0x03ce, 0xf54: 0x03ce, 0xf55: 0x03ce, 0xf56: 0x03d4, 0xf57: 0x03d4,
+	0xf58: 0x03d4, 0xf59: 0x03d4, 0xf5a: 0x03d1, 0xf5b: 0x03d1, 0xf5c: 0x03d1, 0xf5d: 0x03d1,
+	0xf5e: 0x03d7, 0xf5f: 0x03d7, 0xf60: 0x03da, 0xf61: 0x03da, 0xf62: 0x03da, 0xf63: 0x03da,
+	0xf64: 0x45af, 0xf65: 0x45af, 0xf66: 0x03e0, 0xf67: 0x03e0, 0xf68: 0x03e0, 0xf69: 0x03e0,
+	0xf6a: 0x03dd, 0xf6b: 0x03dd, 0xf6c: 0x03dd, 0xf6d: 0x03dd, 0xf6e: 0x03fb, 0xf6f: 0x03fb,
+	0xf70: 0x45a9, 0xf71: 0x45a9,
+	// Block 0x3e, offset 0xf80
+	0xf93: 0x03cb, 0xf94: 0x03cb, 0xf95: 0x03cb, 0xf96: 0x03cb, 0xf97: 0x03e9,
+	0xf98: 0x03e9, 0xf99: 0x03e6, 0xf9a: 0x03e6, 0xf9b: 0x03ec, 0xf9c: 0x03ec, 0xf9d: 0x217f,
+	0xf9e: 0x03f2, 0xf9f: 0x03f2, 0xfa0: 0x03e3, 0xfa1: 0x03e3, 0xfa2: 0x03ef, 0xfa3: 0x03ef,
+	0xfa4: 0x03f8, 0xfa5: 0x03f8, 0xfa6: 0x03f8, 0xfa7: 0x03f8, 0xfa8: 0x0380, 0xfa9: 0x0380,
+	0xfaa: 0x26da, 0xfab: 0x26da, 0xfac: 0x274a, 0xfad: 0x274a, 0xfae: 0x2719, 0xfaf: 0x2719,
+	0xfb0: 0x2735, 0xfb1: 0x2735, 0xfb2: 0x272e, 0xfb3: 0x272e, 0xfb4: 0x273c, 0xfb5: 0x273c,
+	0xfb6: 0x2743, 0xfb7: 0x2743, 0xfb8: 0x2743, 0xfb9: 0x2720, 0xfba: 0x2720, 0xfbb: 0x2720,
+	0xfbc: 0x03f5, 0xfbd: 0x03f5, 0xfbe: 0x03f5, 0xfbf: 0x03f5,
+	// Block 0x3f, offset 0xfc0
+	0xfc0: 0x26e1, 0xfc1: 0x26e8, 0xfc2: 0x2704, 0xfc3: 0x2720, 0xfc4: 0x2727, 0xfc5: 0x1eb9,
+	0xfc6: 0x1ebe, 0xfc7: 0x1ec3, 0xfc8: 0x1ed2, 0xfc9: 0x1ee1, 0xfca: 0x1ee6, 0xfcb: 0x1eeb,
+	0xfcc: 0x1ef0, 0xfcd: 0x1ef5, 0xfce: 0x1f04, 0xfcf: 0x1f13, 0xfd0: 0x1f18, 0xfd1: 0x1f1d,
+	0xfd2: 0x1f2c, 0xfd3: 0x1f3b, 0xfd4: 0x1f40, 0xfd5: 0x1f45, 0xfd6: 0x1f4a, 0xfd7: 0x1f59,
+	0xfd8: 0x1f5e, 0xfd9: 0x1f6d, 0xfda: 0x1f72, 0xfdb: 0x1f77, 0xfdc: 0x1f86, 0xfdd: 0x1f8b,
+	0xfde: 0x1f90, 0xfdf: 0x1f9a, 0xfe0: 0x1fd6, 0xfe1: 0x1fe5, 0xfe2: 0x1ff4, 0xfe3: 0x1ff9,
+	0xfe4: 0x1ffe, 0xfe5: 0x2008, 0xfe6: 0x2017, 0xfe7: 0x201c, 0xfe8: 0x202b, 0xfe9: 0x2030,
+	0xfea: 0x2035, 0xfeb: 0x2044, 0xfec: 0x2049, 0xfed: 0x2058, 0xfee: 0x205d, 0xfef: 0x2062,
+	0xff0: 0x2067, 0xff1: 0x206c, 0xff2: 0x2071, 0xff3: 0x2076, 0xff4: 0x207b, 0xff5: 0x2080,
+	0xff6: 0x2085, 0xff7: 0x208a, 0xff8: 0x208f, 0xff9: 0x2094, 0xffa: 0x2099, 0xffb: 0x209e,
+	0xffc: 0x20a3, 0xffd: 0x20a8, 0xffe: 0x20ad, 0xfff: 0x20b7,
+	// Block 0x40, offset 0x1000
+	0x1000: 0x20bc, 0x1001: 0x20c1, 0x1002: 0x20c6, 0x1003: 0x20d0, 0x1004: 0x20d5, 0x1005: 0x20df,
+	0x1006: 0x20e4, 0x1007: 0x20e9, 0x1008: 0x20ee, 0x1009: 0x20f3, 0x100a: 0x20f8, 0x100b: 0x20fd,
+	0x100c: 0x2102, 0x100d: 0x2107, 0x100e: 0x2116, 0x100f: 0x2125, 0x1010: 0x212a, 0x1011: 0x212f,
+	0x1012: 0x2134, 0x1013: 0x2139, 0x1014: 0x213e, 0x1015: 0x2148, 0x1016: 0x214d, 0x1017: 0x2152,
+	0x1018: 0x2161, 0x1019: 0x2170, 0x101a: 0x2175, 0x101b: 0x4561, 0x101c: 0x4567, 0x101d: 0x459d,
+	0x101e: 0x45f4, 0x101f: 0x45fb, 0x1020: 0x4602, 0x1021: 0x4609, 0x1022: 0x4610, 0x1023: 0x4617,
+	0x1024: 0x26f6, 0x1025: 0x26fd, 0x1026: 0x2704, 0x1027: 0x270b, 0x1028: 0x2720, 0x1029: 0x2727,
+	0x102a: 0x1ec8, 0x102b: 0x1ecd, 0x102c: 0x1ed2, 0x102d: 0x1ed7, 0x102e: 0x1ee1, 0x102f: 0x1ee6,
+	0x1030: 0x1efa, 0x1031: 0x1eff, 0x1032: 0x1f04, 0x1033: 0x1f09, 0x1034: 0x1f13, 0x1035: 0x1f18,
+	0x1036: 0x1f22, 0x1037: 0x1f27, 0x1038: 0x1f2c, 0x1039: 0x1f31, 0x103a: 0x1f3b, 0x103b: 0x1f40,
+	0x103c: 0x206c, 0x103d: 0x2071, 0x103e: 0x2080, 0x103f: 0x2085,
+	// Block 0x41, offset 0x1040
+	0x1040: 0x208a, 0x1041: 0x209e, 0x1042: 0x20a3, 0x1043: 0x20a8, 0x1044: 0x20ad, 0x1045: 0x20c6,
+	0x1046: 0x20d0, 0x1047: 0x20d5, 0x1048: 0x20da, 0x1049: 0x20ee, 0x104a: 0x210c, 0x104b: 0x2111,
+	0x104c: 0x2116, 0x104d: 0x211b, 0x104e: 0x2125, 0x104f: 0x212a, 0x1050: 0x459d, 0x1051: 0x2157,
+	0x1052: 0x215c, 0x1053: 0x2161, 0x1054: 0x2166, 0x1055: 0x2170, 0x1056: 0x2175, 0x1057: 0x26e1,
+	0x1058: 0x26e8, 0x1059: 0x26ef, 0x105a: 0x2704, 0x105b: 0x2712, 0x105c: 0x1eb9, 0x105d: 0x1ebe,
+	0x105e: 0x1ec3, 0x105f: 0x1ed2, 0x1060: 0x1edc, 0x1061: 0x1eeb, 0x1062: 0x1ef0, 0x1063: 0x1ef5,
+	0x1064: 0x1f04, 0x1065: 0x1f0e, 0x1066: 0x1f2c, 0x1067: 0x1f45, 0x1068: 0x1f4a, 0x1069: 0x1f59,
+	0x106a: 0x1f5e, 0x106b: 0x1f6d, 0x106c: 0x1f77, 0x106d: 0x1f86, 0x106e: 0x1f8b, 0x106f: 0x1f90,
+	0x1070: 0x1f9a, 0x1071: 0x1fd6, 0x1072: 0x1fdb, 0x1073: 0x1fe5, 0x1074: 0x1ff4, 0x1075: 0x1ff9,
+	0x1076: 0x1ffe, 0x1077: 0x2008, 0x1078: 0x2017, 0x1079: 0x202b, 0x107a: 0x2030, 0x107b: 0x2035,
+	0x107c: 0x2044, 0x107d: 0x2049, 0x107e: 0x2058, 0x107f: 0x205d,
+	// Block 0x42, offset 0x1080
+	0x1080: 0x2062, 0x1081: 0x2067, 0x1082: 0x2076, 0x1083: 0x207b, 0x1084: 0x208f, 0x1085: 0x2094,
+	0x1086: 0x2099, 0x1087: 0x209e, 0x1088: 0x20a3, 0x1089: 0x20b7, 0x108a: 0x20bc, 0x108b: 0x20c1,
+	0x108c: 0x20c6, 0x108d: 0x20cb, 0x108e: 0x20df, 0x108f: 0x20e4, 0x1090: 0x20e9, 0x1091: 0x20ee,
+	0x1092: 0x20fd, 0x1093: 0x2102, 0x1094: 0x2107, 0x1095: 0x2116, 0x1096: 0x2120, 0x1097: 0x212f,
+	0x1098: 0x2134, 0x1099: 0x4591, 0x109a: 0x2148, 0x109b: 0x214d, 0x109c: 0x2152, 0x109d: 0x2161,
+	0x109e: 0x216b, 0x109f: 0x2704, 0x10a0: 0x2712, 0x10a1: 0x1ed2, 0x10a2: 0x1edc, 0x10a3: 0x1f04,
+	0x10a4: 0x1f0e, 0x10a5: 0x1f2c, 0x10a6: 0x1f36, 0x10a7: 0x1f9a, 0x10a8: 0x1f9f, 0x10a9: 0x1fc2,
+	0x10aa: 0x1fc7, 0x10ab: 0x209e, 0x10ac: 0x20a3, 0x10ad: 0x20c6, 0x10ae: 0x2116, 0x10af: 0x2120,
+	0x10b0: 0x2161, 0x10b1: 0x216b, 0x10b2: 0x4645, 0x10b3: 0x464d, 0x10b4: 0x4655, 0x10b5: 0x2021,
+	0x10b6: 0x2026, 0x10b7: 0x203a, 0x10b8: 0x203f, 0x10b9: 0x204e, 0x10ba: 0x2053, 0x10bb: 0x1fa4,
+	0x10bc: 0x1fa9, 0x10bd: 0x1fcc, 0x10be: 0x1fd1, 0x10bf: 0x1f63,
+	// Block 0x43, offset 0x10c0
+	0x10c0: 0x1f68, 0x10c1: 0x1f4f, 0x10c2: 0x1f54, 0x10c3: 0x1f7c, 0x10c4: 0x1f81, 0x10c5: 0x1fea,
+	0x10c6: 0x1fef, 0x10c7: 0x200d, 0x10c8: 0x2012, 0x10c9: 0x1fae, 0x10ca: 0x1fb3, 0x10cb: 0x1fb8,
+	0x10cc: 0x1fc2, 0x10cd: 0x1fbd, 0x10ce: 0x1f95, 0x10cf: 0x1fe0, 0x10d0: 0x2003, 0x10d1: 0x2021,
+	0x10d2: 0x2026, 0x10d3: 0x203a, 0x10d4: 0x203f, 0x10d5: 0x204e, 0x10d6: 0x2053, 0x10d7: 0x1fa4,
+	0x10d8: 0x1fa9, 0x10d9: 0x1fcc, 0x10da: 0x1fd1, 0x10db: 0x1f63, 0x10dc: 0x1f68, 0x10dd: 0x1f4f,
+	0x10de: 0x1f54, 0x10df: 0x1f7c, 0x10e0: 0x1f81, 0x10e1: 0x1fea, 0x10e2: 0x1fef, 0x10e3: 0x200d,
+	0x10e4: 0x2012, 0x10e5: 0x1fae, 0x10e6: 0x1fb3, 0x10e7: 0x1fb8, 0x10e8: 0x1fc2, 0x10e9: 0x1fbd,
+	0x10ea: 0x1f95, 0x10eb: 0x1fe0, 0x10ec: 0x2003, 0x10ed: 0x1fae, 0x10ee: 0x1fb3, 0x10ef: 0x1fb8,
+	0x10f0: 0x1fc2, 0x10f1: 0x1f9f, 0x10f2: 0x1fc7, 0x10f3: 0x201c, 0x10f4: 0x1f86, 0x10f5: 0x1f8b,
+	0x10f6: 0x1f90, 0x10f7: 0x1fae, 0x10f8: 0x1fb3, 0x10f9: 0x1fb8, 0x10fa: 0x201c, 0x10fb: 0x202b,
+	0x10fc: 0x4549, 0x10fd: 0x4549,
+	// Block 0x44, offset 0x1100
+	0x1110: 0x2441, 0x1111: 0x2456,
+	0x1112: 0x2456, 0x1113: 0x245d, 0x1114: 0x2464, 0x1115: 0x2479, 0x1116: 0x2480, 0x1117: 0x2487,
+	0x1118: 0x24aa, 0x1119: 0x24aa, 0x111a: 0x24cd, 0x111b: 0x24c6, 0x111c: 0x24e2, 0x111d: 0x24d4,
+	0x111e: 0x24db, 0x111f: 0x24fe, 0x1120: 0x24fe, 0x1121: 0x24f7, 0x1122: 0x2505, 0x1123: 0x2505,
+	0x1124: 0x252f, 0x1125: 0x252f, 0x1126: 0x254b, 0x1127: 0x2513, 0x1128: 0x2513, 0x1129: 0x250c,
+	0x112a: 0x2521, 0x112b: 0x2521, 0x112c: 0x2528, 0x112d: 0x2528, 0x112e: 0x2552, 0x112f: 0x2560,
+	0x1130: 0x2560, 0x1131: 0x2567, 0x1132: 0x2567, 0x1133: 0x256e, 0x1134: 0x2575, 0x1135: 0x257c,
+	0x1136: 0x2583, 0x1137: 0x2583, 0x1138: 0x258a, 0x1139: 0x2598, 0x113a: 0x25a6, 0x113b: 0x259f,
+	0x113c: 0x25ad, 0x113d: 0x25ad, 0x113e: 0x25c2, 0x113f: 0x25c9,
+	// Block 0x45, offset 0x1140
+	0x1140: 0x25fa, 0x1141: 0x2608, 0x1142: 0x2601, 0x1143: 0x25e5, 0x1144: 0x25e5, 0x1145: 0x260f,
+	0x1146: 0x260f, 0x1147: 0x2616, 0x1148: 0x2616, 0x1149: 0x2640, 0x114a: 0x2647, 0x114b: 0x264e,
+	0x114c: 0x2624, 0x114d: 0x2632, 0x114e: 0x2655, 0x114f: 0x265c,
+	0x1152: 0x262b, 0x1153: 0x26b0, 0x1154: 0x26b7, 0x1155: 0x268d, 0x1156: 0x2694, 0x1157: 0x2678,
+	0x1158: 0x2678, 0x1159: 0x267f, 0x115a: 0x26a9, 0x115b: 0x26a2, 0x115c: 0x26cc, 0x115d: 0x26cc,
+	0x115e: 0x243a, 0x115f: 0x244f, 0x1160: 0x2448, 0x1161: 0x2472, 0x1162: 0x246b, 0x1163: 0x2495,
+	0x1164: 0x248e, 0x1165: 0x24b8, 0x1166: 0x249c, 0x1167: 0x24b1, 0x1168: 0x24e9, 0x1169: 0x2536,
+	0x116a: 0x251a, 0x116b: 0x2559, 0x116c: 0x25f3, 0x116d: 0x261d, 0x116e: 0x26c5, 0x116f: 0x26be,
+	0x1170: 0x26d3, 0x1171: 0x266a, 0x1172: 0x25d0, 0x1173: 0x269b, 0x1174: 0x25c2, 0x1175: 0x25fa,
+	0x1176: 0x2591, 0x1177: 0x25de, 0x1178: 0x2671, 0x1179: 0x2663, 0x117a: 0x25ec, 0x117b: 0x25d7,
+	0x117c: 0x25ec, 0x117d: 0x2671, 0x117e: 0x24a3, 0x117f: 0x24bf,
+	// Block 0x46, offset 0x1180
+	0x1180: 0x2639, 0x1181: 0x25b4, 0x1182: 0x2433, 0x1183: 0x25d7, 0x1184: 0x257c, 0x1185: 0x254b,
+	0x1186: 0x24f0, 0x1187: 0x2686,
+	0x11b0: 0x2544, 0x11b1: 0x25bb, 0x11b2: 0x28f6, 0x11b3: 0x28ed, 0x11b4: 0x2923, 0x11b5: 0x2911,
+	0x11b6: 0x28ff, 0x11b7: 0x291a, 0x11b8: 0x292c, 0x11b9: 0x253d, 0x11ba: 0x2db3, 0x11bb: 0x2c33,
+	0x11bc: 0x2908,
+	// Block 0x47, offset 0x11c0
+	0x11d0: 0x0019, 0x11d1: 0x057e,
+	0x11d2: 0x0582, 0x11d3: 0x0035, 0x11d4: 0x0037, 0x11d5: 0x0003, 0x11d6: 0x003f, 0x11d7: 0x05ba,
+	0x11d8: 0x05be, 0x11d9: 0x1c8c,
+	0x11e0: 0x8133, 0x11e1: 0x8133, 0x11e2: 0x8133, 0x11e3: 0x8133,
+	0x11e4: 0x8133, 0x11e5: 0x8133, 0x11e6: 0x8133, 0x11e7: 0x812e, 0x11e8: 0x812e, 0x11e9: 0x812e,
+	0x11ea: 0x812e, 0x11eb: 0x812e, 0x11ec: 0x812e, 0x11ed: 0x812e, 0x11ee: 0x8133, 0x11ef: 0x8133,
+	0x11f0: 0x19a0, 0x11f1: 0x053a, 0x11f2: 0x0536, 0x11f3: 0x007f, 0x11f4: 0x007f, 0x11f5: 0x0011,
+	0x11f6: 0x0013, 0x11f7: 0x00b7, 0x11f8: 0x00bb, 0x11f9: 0x05b2, 0x11fa: 0x05b6, 0x11fb: 0x05a6,
+	0x11fc: 0x05aa, 0x11fd: 0x058e, 0x11fe: 0x0592, 0x11ff: 0x0586,
+	// Block 0x48, offset 0x1200
+	0x1200: 0x058a, 0x1201: 0x0596, 0x1202: 0x059a, 0x1203: 0x059e, 0x1204: 0x05a2,
+	0x1207: 0x0077, 0x1208: 0x007b, 0x1209: 0x43aa, 0x120a: 0x43aa, 0x120b: 0x43aa,
+	0x120c: 0x43aa, 0x120d: 0x007f, 0x120e: 0x007f, 0x120f: 0x007f, 0x1210: 0x0019, 0x1211: 0x057e,
+	0x1212: 0x001d, 0x1214: 0x0037, 0x1215: 0x0035, 0x1216: 0x003f, 0x1217: 0x0003,
+	0x1218: 0x053a, 0x1219: 0x0011, 0x121a: 0x0013, 0x121b: 0x00b7, 0x121c: 0x00bb, 0x121d: 0x05b2,
+	0x121e: 0x05b6, 0x121f: 0x0007, 0x1220: 0x000d, 0x1221: 0x0015, 0x1222: 0x0017, 0x1223: 0x001b,
+	0x1224: 0x0039, 0x1225: 0x003d, 0x1226: 0x003b, 0x1228: 0x0079, 0x1229: 0x0009,
+	0x122a: 0x000b, 0x122b: 0x0041,
+	0x1230: 0x43eb, 0x1231: 0x456d, 0x1232: 0x43f0, 0x1234: 0x43f5,
+	0x1236: 0x43fa, 0x1237: 0x4573, 0x1238: 0x43ff, 0x1239: 0x4579, 0x123a: 0x4404, 0x123b: 0x457f,
+	0x123c: 0x4409, 0x123d: 0x4585, 0x123e: 0x440e, 0x123f: 0x458b,
+	// Block 0x49, offset 0x1240
+	0x1240: 0x0329, 0x1241: 0x454f, 0x1242: 0x454f, 0x1243: 0x4555, 0x1244: 0x4555, 0x1245: 0x4597,
+	0x1246: 0x4597, 0x1247: 0x455b, 0x1248: 0x455b, 0x1249: 0x45a3, 0x124a: 0x45a3, 0x124b: 0x45a3,
+	0x124c: 0x45a3, 0x124d: 0x032c, 0x124e: 0x032c, 0x124f: 0x032f, 0x1250: 0x032f, 0x1251: 0x032f,
+	0x1252: 0x032f, 0x1253: 0x0332, 0x1254: 0x0332, 0x1255: 0x0335, 0x1256: 0x0335, 0x1257: 0x0335,
+	0x1258: 0x0335, 0x1259: 0x0338, 0x125a: 0x0338, 0x125b: 0x0338, 0x125c: 0x0338, 0x125d: 0x033b,
+	0x125e: 0x033b, 0x125f: 0x033b, 0x1260: 0x033b, 0x1261: 0x033e, 0x1262: 0x033e, 0x1263: 0x033e,
+	0x1264: 0x033e, 0x1265: 0x0341, 0x1266: 0x0341, 0x1267: 0x0341, 0x1268: 0x0341, 0x1269: 0x0344,
+	0x126a: 0x0344, 0x126b: 0x0347, 0x126c: 0x0347, 0x126d: 0x034a, 0x126e: 0x034a, 0x126f: 0x034d,
+	0x1270: 0x034d, 0x1271: 0x0350, 0x1272: 0x0350, 0x1273: 0x0350, 0x1274: 0x0350, 0x1275: 0x0353,
+	0x1276: 0x0353, 0x1277: 0x0353, 0x1278: 0x0353, 0x1279: 0x0356, 0x127a: 0x0356, 0x127b: 0x0356,
+	0x127c: 0x0356, 0x127d: 0x0359, 0x127e: 0x0359, 0x127f: 0x0359,
+	// Block 0x4a, offset 0x1280
+	0x1280: 0x0359, 0x1281: 0x035c, 0x1282: 0x035c, 0x1283: 0x035c, 0x1284: 0x035c, 0x1285: 0x035f,
+	0x1286: 0x035f, 0x1287: 0x035f, 0x1288: 0x035f, 0x1289: 0x0362, 0x128a: 0x0362, 0x128b: 0x0362,
+	0x128c: 0x0362, 0x128d: 0x0365, 0x128e: 0x0365, 0x128f: 0x0365, 0x1290: 0x0365, 0x1291: 0x0368,
+	0x1292: 0x0368, 0x1293: 0x0368, 0x1294: 0x0368, 0x1295: 0x036b, 0x1296: 0x036b, 0x1297: 0x036b,
+	0x1298: 0x036b, 0x1299: 0x036e, 0x129a: 0x036e, 0x129b: 0x036e, 0x129c: 0x036e, 0x129d: 0x0371,
+	0x129e: 0x0371, 0x129f: 0x0371, 0x12a0: 0x0371, 0x12a1: 0x0374, 0x12a2: 0x0374, 0x12a3: 0x0374,
+	0x12a4: 0x0374, 0x12a5: 0x0377, 0x12a6: 0x0377, 0x12a7: 0x0377, 0x12a8: 0x0377, 0x12a9: 0x037a,
+	0x12aa: 0x037a, 0x12ab: 0x037a, 0x12ac: 0x037a, 0x12ad: 0x037d, 0x12ae: 0x037d, 0x12af: 0x0380,
+	0x12b0: 0x0380, 0x12b1: 0x0383, 0x12b2: 0x0383, 0x12b3: 0x0383, 0x12b4: 0x0383, 0x12b5: 0x2f41,
+	0x12b6: 0x2f41, 0x12b7: 0x2f49, 0x12b8: 0x2f49, 0x12b9: 0x2f51, 0x12ba: 0x2f51, 0x12bb: 0x20b2,
+	0x12bc: 0x20b2,
+	// Block 0x4b, offset 0x12c0
+	0x12c0: 0x0081, 0x12c1: 0x0083, 0x12c2: 0x0085, 0x12c3: 0x0087, 0x12c4: 0x0089, 0x12c5: 0x008b,
+	0x12c6: 0x008d, 0x12c7: 0x008f, 0x12c8: 0x0091, 0x12c9: 0x0093, 0x12ca: 0x0095, 0x12cb: 0x0097,
+	0x12cc: 0x0099, 0x12cd: 0x009b, 0x12ce: 0x009d, 0x12cf: 0x009f, 0x12d0: 0x00a1, 0x12d1: 0x00a3,
+	0x12d2: 0x00a5, 0x12d3: 0x00a7, 0x12d4: 0x00a9, 0x12d5: 0x00ab, 0x12d6: 0x00ad, 0x12d7: 0x00af,
+	0x12d8: 0x00b1, 0x12d9: 0x00b3, 0x12da: 0x00b5, 0x12db: 0x00b7, 0x12dc: 0x00b9, 0x12dd: 0x00bb,
+	0x12de: 0x00bd, 0x12df: 0x056e, 0x12e0: 0x0572, 0x12e1: 0x0582, 0x12e2: 0x0596, 0x12e3: 0x059a,
+	0x12e4: 0x057e, 0x12e5: 0x06a6, 0x12e6: 0x069e, 0x12e7: 0x05c2, 0x12e8: 0x05ca, 0x12e9: 0x05d2,
+	0x12ea: 0x05da, 0x12eb: 0x05e2, 0x12ec: 0x0666, 0x12ed: 0x066e, 0x12ee: 0x0676, 0x12ef: 0x061a,
+	0x12f0: 0x06aa, 0x12f1: 0x05c6, 0x12f2: 0x05ce, 0x12f3: 0x05d6, 0x12f4: 0x05de, 0x12f5: 0x05e6,
+	0x12f6: 0x05ea, 0x12f7: 0x05ee, 0x12f8: 0x05f2, 0x12f9: 0x05f6, 0x12fa: 0x05fa, 0x12fb: 0x05fe,
+	0x12fc: 0x0602, 0x12fd: 0x0606, 0x12fe: 0x060a, 0x12ff: 0x060e,
+	// Block 0x4c, offset 0x1300
+	0x1300: 0x0612, 0x1301: 0x0616, 0x1302: 0x061e, 0x1303: 0x0622, 0x1304: 0x0626, 0x1305: 0x062a,
+	0x1306: 0x062e, 0x1307: 0x0632, 0x1308: 0x0636, 0x1309: 0x063a, 0x130a: 0x063e, 0x130b: 0x0642,
+	0x130c: 0x0646, 0x130d: 0x064a, 0x130e: 0x064e, 0x130f: 0x0652, 0x1310: 0x0656, 0x1311: 0x065a,
+	0x1312: 0x065e, 0x1313: 0x0662, 0x1314: 0x066a, 0x1315: 0x0672, 0x1316: 0x067a, 0x1317: 0x067e,
+	0x1318: 0x0682, 0x1319: 0x0686, 0x131a: 0x068a, 0x131b: 0x068e, 0x131c: 0x0692, 0x131d: 0x06a2,
+	0x131e: 0x4bb9, 0x131f: 0x4bbf, 0x1320: 0x04b6, 0x1321: 0x0406, 0x1322: 0x040a, 0x1323: 0x4b7c,
+	0x1324: 0x040e, 0x1325: 0x4b82, 0x1326: 0x4b88, 0x1327: 0x0412, 0x1328: 0x0416, 0x1329: 0x041a,
+	0x132a: 0x4b8e, 0x132b: 0x4b94, 0x132c: 0x4b9a, 0x132d: 0x4ba0, 0x132e: 0x4ba6, 0x132f: 0x4bac,
+	0x1330: 0x045a, 0x1331: 0x041e, 0x1332: 0x0422, 0x1333: 0x0426, 0x1334: 0x046e, 0x1335: 0x042a,
+	0x1336: 0x042e, 0x1337: 0x0432, 0x1338: 0x0436, 0x1339: 0x043a, 0x133a: 0x043e, 0x133b: 0x0442,
+	0x133c: 0x0446, 0x133d: 0x044a, 0x133e: 0x044e,
+	// Block 0x4d, offset 0x1340
+	0x1342: 0x4afe, 0x1343: 0x4b04, 0x1344: 0x4b0a, 0x1345: 0x4b10,
+	0x1346: 0x4b16, 0x1347: 0x4b1c, 0x134a: 0x4b22, 0x134b: 0x4b28,
+	0x134c: 0x4b2e, 0x134d: 0x4b34, 0x134e: 0x4b3a, 0x134f: 0x4b40,
+	0x1352: 0x4b46, 0x1353: 0x4b4c, 0x1354: 0x4b52, 0x1355: 0x4b58, 0x1356: 0x4b5e, 0x1357: 0x4b64,
+	0x135a: 0x4b6a, 0x135b: 0x4b70, 0x135c: 0x4b76,
+	0x1360: 0x00bf, 0x1361: 0x00c2, 0x1362: 0x00cb, 0x1363: 0x43a5,
+	0x1364: 0x00c8, 0x1365: 0x00c5, 0x1366: 0x053e, 0x1368: 0x0562, 0x1369: 0x0542,
+	0x136a: 0x0546, 0x136b: 0x054a, 0x136c: 0x054e, 0x136d: 0x0566, 0x136e: 0x056a,
+	// Block 0x4e, offset 0x1380
+	0x1381: 0x01f1, 0x1382: 0x01f4, 0x1383: 0x00d4, 0x1384: 0x01be, 0x1385: 0x010d,
+	0x1387: 0x01d3, 0x1388: 0x174e, 0x1389: 0x01d9, 0x138a: 0x01d6, 0x138b: 0x0116,
+	0x138c: 0x0119, 0x138d: 0x0526, 0x138e: 0x011c, 0x138f: 0x0128, 0x1390: 0x01e5, 0x1391: 0x013a,
+	0x1392: 0x0134, 0x1393: 0x012e, 0x1394: 0x01c1, 0x1395: 0x00e0, 0x1396: 0x01c4, 0x1397: 0x0143,
+	0x1398: 0x0194, 0x1399: 0x01e8, 0x139a: 0x01eb, 0x139b: 0x0152, 0x139c: 0x1756, 0x139d: 0x1742,
+	0x139e: 0x0158, 0x139f: 0x175b, 0x13a0: 0x01a9, 0x13a1: 0x1760, 0x13a2: 0x00da, 0x13a3: 0x0170,
+	0x13a4: 0x0173, 0x13a5: 0x00a3, 0x13a6: 0x017c, 0x13a7: 0x1765, 0x13a8: 0x0182, 0x13a9: 0x0185,
+	0x13aa: 0x0188, 0x13ab: 0x01e2, 0x13ac: 0x01dc, 0x13ad: 0x1752, 0x13ae: 0x01df, 0x13af: 0x0197,
+	0x13b0: 0x0576, 0x13b2: 0x01ac, 0x13b3: 0x01cd, 0x13b4: 0x01d0, 0x13b5: 0x01bb,
+	0x13b6: 0x00f5, 0x13b7: 0x00f8, 0x13b8: 0x00fb, 0x13b9: 0x176a, 0x13ba: 0x176f,
+	// Block 0x4f, offset 0x13c0
+	0x13c0: 0x0063, 0x13c1: 0x0065, 0x13c2: 0x0067, 0x13c3: 0x0069, 0x13c4: 0x006b, 0x13c5: 0x006d,
+	0x13c6: 0x006f, 0x13c7: 0x0071, 0x13c8: 0x0073, 0x13c9: 0x0075, 0x13ca: 0x0083, 0x13cb: 0x0085,
+	0x13cc: 0x0087, 0x13cd: 0x0089, 0x13ce: 0x008b, 0x13cf: 0x008d, 0x13d0: 0x008f, 0x13d1: 0x0091,
+	0x13d2: 0x0093, 0x13d3: 0x0095, 0x13d4: 0x0097, 0x13d5: 0x0099, 0x13d6: 0x009b, 0x13d7: 0x009d,
+	0x13d8: 0x009f, 0x13d9: 0x00a1, 0x13da: 0x00a3, 0x13db: 0x00a5, 0x13dc: 0x00a7, 0x13dd: 0x00a9,
+	0x13de: 0x00ab, 0x13df: 0x00ad, 0x13e0: 0x00af, 0x13e1: 0x00b1, 0x13e2: 0x00b3, 0x13e3: 0x00b5,
+	0x13e4: 0x00e3, 0x13e5: 0x0101, 0x13e8: 0x01f7, 0x13e9: 0x01fa,
+	0x13ea: 0x01fd, 0x13eb: 0x0200, 0x13ec: 0x0203, 0x13ed: 0x0206, 0x13ee: 0x0209, 0x13ef: 0x020c,
+	0x13f0: 0x020f, 0x13f1: 0x0212, 0x13f2: 0x0215, 0x13f3: 0x0218, 0x13f4: 0x021b, 0x13f5: 0x021e,
+	0x13f6: 0x0221, 0x13f7: 0x0224, 0x13f8: 0x0227, 0x13f9: 0x020c, 0x13fa: 0x022a, 0x13fb: 0x022d,
+	0x13fc: 0x0230, 0x13fd: 0x0233, 0x13fe: 0x0236, 0x13ff: 0x0239,
+	// Block 0x50, offset 0x1400
+	0x1400: 0x0281, 0x1401: 0x0284, 0x1402: 0x0287, 0x1403: 0x0552, 0x1404: 0x024b, 0x1405: 0x0254,
+	0x1406: 0x025a, 0x1407: 0x027e, 0x1408: 0x026f, 0x1409: 0x026c, 0x140a: 0x028a, 0x140b: 0x028d,
+	0x140e: 0x0021, 0x140f: 0x0023, 0x1410: 0x0025, 0x1411: 0x0027,
+	0x1412: 0x0029, 0x1413: 0x002b, 0x1414: 0x002d, 0x1415: 0x002f, 0x1416: 0x0031, 0x1417: 0x0033,
+	0x1418: 0x0021, 0x1419: 0x0023, 0x141a: 0x0025, 0x141b: 0x0027, 0x141c: 0x0029, 0x141d: 0x002b,
+	0x141e: 0x002d, 0x141f: 0x002f, 0x1420: 0x0031, 0x1421: 0x0033, 0x1422: 0x0021, 0x1423: 0x0023,
+	0x1424: 0x0025, 0x1425: 0x0027, 0x1426: 0x0029, 0x1427: 0x002b, 0x1428: 0x002d, 0x1429: 0x002f,
+	0x142a: 0x0031, 0x142b: 0x0033, 0x142c: 0x0021, 0x142d: 0x0023, 0x142e: 0x0025, 0x142f: 0x0027,
+	0x1430: 0x0029, 0x1431: 0x002b, 0x1432: 0x002d, 0x1433: 0x002f, 0x1434: 0x0031, 0x1435: 0x0033,
+	0x1436: 0x0021, 0x1437: 0x0023, 0x1438: 0x0025, 0x1439: 0x0027, 0x143a: 0x0029, 0x143b: 0x002b,
+	0x143c: 0x002d, 0x143d: 0x002f, 0x143e: 0x0031, 0x143f: 0x0033,
+	// Block 0x51, offset 0x1440
+	0x1440: 0x8133, 0x1441: 0x8133, 0x1442: 0x8133, 0x1443: 0x8133, 0x1444: 0x8133, 0x1445: 0x8133,
+	0x1446: 0x8133, 0x1448: 0x8133, 0x1449: 0x8133, 0x144a: 0x8133, 0x144b: 0x8133,
+	0x144c: 0x8133, 0x144d: 0x8133, 0x144e: 0x8133, 0x144f: 0x8133, 0x1450: 0x8133, 0x1451: 0x8133,
+	0x1452: 0x8133, 0x1453: 0x8133, 0x1454: 0x8133, 0x1455: 0x8133, 0x1456: 0x8133, 0x1457: 0x8133,
+	0x1458: 0x8133, 0x145b: 0x8133, 0x145c: 0x8133, 0x145d: 0x8133,
+	0x145e: 0x8133, 0x145f: 0x8133, 0x1460: 0x8133, 0x1461: 0x8133, 0x1463: 0x8133,
+	0x1464: 0x8133, 0x1466: 0x8133, 0x1467: 0x8133, 0x1468: 0x8133, 0x1469: 0x8133,
+	0x146a: 0x8133,
+	0x1470: 0x0290, 0x1471: 0x0293, 0x1472: 0x0296, 0x1473: 0x0299, 0x1474: 0x029c, 0x1475: 0x029f,
+	0x1476: 0x02a2, 0x1477: 0x02a5, 0x1478: 0x02a8, 0x1479: 0x02ab, 0x147a: 0x02ae, 0x147b: 0x02b1,
+	0x147c: 0x02b7, 0x147d: 0x02ba, 0x147e: 0x02bd, 0x147f: 0x02c0,
+	// Block 0x52, offset 0x1480
+	0x1480: 0x02c3, 0x1481: 0x02c6, 0x1482: 0x02c9, 0x1483: 0x02cc, 0x1484: 0x02cf, 0x1485: 0x02d2,
+	0x1486: 0x02d5, 0x1487: 0x02db, 0x1488: 0x02e1, 0x1489: 0x02e4, 0x148a: 0x1736, 0x148b: 0x0302,
+	0x148c: 0x02ea, 0x148d: 0x02ed, 0x148e: 0x0305, 0x148f: 0x02f9, 0x1490: 0x02ff, 0x1491: 0x0290,
+	0x1492: 0x0293, 0x1493: 0x0296, 0x1494: 0x0299, 0x1495: 0x029c, 0x1496: 0x029f, 0x1497: 0x02a2,
+	0x1498: 0x02a5, 0x1499: 0x02a8, 0x149a: 0x02ab, 0x149b: 0x02ae, 0x149c: 0x02b7, 0x149d: 0x02ba,
+	0x149e: 0x02c0, 0x149f: 0x02c6, 0x14a0: 0x02c9, 0x14a1: 0x02cc, 0x14a2: 0x02cf, 0x14a3: 0x02d2,
+	0x14a4: 0x02d5, 0x14a5: 0x02d8, 0x14a6: 0x02db, 0x14a7: 0x02f3, 0x14a8: 0x02ea, 0x14a9: 0x02e7,
+	0x14aa: 0x02f0, 0x14ab: 0x02f6, 0x14ac: 0x1732, 0x14ad: 0x02fc,
+	// Block 0x53, offset 0x14c0
+	0x14c0: 0x032c, 0x14c1: 0x032f, 0x14c2: 0x033b, 0x14c3: 0x0344, 0x14c5: 0x037d,
+	0x14c6: 0x034d, 0x14c7: 0x033e, 0x14c8: 0x035c, 0x14c9: 0x0383, 0x14ca: 0x036e, 0x14cb: 0x0371,
+	0x14cc: 0x0374, 0x14cd: 0x0377, 0x14ce: 0x0350, 0x14cf: 0x0362, 0x14d0: 0x0368, 0x14d1: 0x0356,
+	0x14d2: 0x036b, 0x14d3: 0x034a, 0x14d4: 0x0353, 0x14d5: 0x0335, 0x14d6: 0x0338, 0x14d7: 0x0341,
+	0x14d8: 0x0347, 0x14d9: 0x0359, 0x14da: 0x035f, 0x14db: 0x0365, 0x14dc: 0x0386, 0x14dd: 0x03d7,
+	0x14de: 0x03bf, 0x14df: 0x0389, 0x14e1: 0x032f, 0x14e2: 0x033b,
+	0x14e4: 0x037a, 0x14e7: 0x033e, 0x14e9: 0x0383,
+	0x14ea: 0x036e, 0x14eb: 0x0371, 0x14ec: 0x0374, 0x14ed: 0x0377, 0x14ee: 0x0350, 0x14ef: 0x0362,
+	0x14f0: 0x0368, 0x14f1: 0x0356, 0x14f2: 0x036b, 0x14f4: 0x0353, 0x14f5: 0x0335,
+	0x14f6: 0x0338, 0x14f7: 0x0341, 0x14f9: 0x0359, 0x14fb: 0x0365,
+	// Block 0x54, offset 0x1500
+	0x1502: 0x033b,
+	0x1507: 0x033e, 0x1509: 0x0383, 0x150b: 0x0371,
+	0x150d: 0x0377, 0x150e: 0x0350, 0x150f: 0x0362, 0x1511: 0x0356,
+	0x1512: 0x036b, 0x1514: 0x0353, 0x1517: 0x0341,
+	0x1519: 0x0359, 0x151b: 0x0365, 0x151d: 0x03d7,
+	0x151f: 0x0389, 0x1521: 0x032f, 0x1522: 0x033b,
+	0x1524: 0x037a, 0x1527: 0x033e, 0x1528: 0x035c, 0x1529: 0x0383,
+	0x152a: 0x036e, 0x152c: 0x0374, 0x152d: 0x0377, 0x152e: 0x0350, 0x152f: 0x0362,
+	0x1530: 0x0368, 0x1531: 0x0356, 0x1532: 0x036b, 0x1534: 0x0353, 0x1535: 0x0335,
+	0x1536: 0x0338, 0x1537: 0x0341, 0x1539: 0x0359, 0x153a: 0x035f, 0x153b: 0x0365,
+	0x153c: 0x0386, 0x153e: 0x03bf,
+	// Block 0x55, offset 0x1540
+	0x1540: 0x032c, 0x1541: 0x032f, 0x1542: 0x033b, 0x1543: 0x0344, 0x1544: 0x037a, 0x1545: 0x037d,
+	0x1546: 0x034d, 0x1547: 0x033e, 0x1548: 0x035c, 0x1549: 0x0383, 0x154b: 0x0371,
+	0x154c: 0x0374, 0x154d: 0x0377, 0x154e: 0x0350, 0x154f: 0x0362, 0x1550: 0x0368, 0x1551: 0x0356,
+	0x1552: 0x036b, 0x1553: 0x034a, 0x1554: 0x0353, 0x1555: 0x0335, 0x1556: 0x0338, 0x1557: 0x0341,
+	0x1558: 0x0347, 0x1559: 0x0359, 0x155a: 0x035f, 0x155b: 0x0365,
+	0x1561: 0x032f, 0x1562: 0x033b, 0x1563: 0x0344,
+	0x1565: 0x037d, 0x1566: 0x034d, 0x1567: 0x033e, 0x1568: 0x035c, 0x1569: 0x0383,
+	0x156b: 0x0371, 0x156c: 0x0374, 0x156d: 0x0377, 0x156e: 0x0350, 0x156f: 0x0362,
+	0x1570: 0x0368, 0x1571: 0x0356, 0x1572: 0x036b, 0x1573: 0x034a, 0x1574: 0x0353, 0x1575: 0x0335,
+	0x1576: 0x0338, 0x1577: 0x0341, 0x1578: 0x0347, 0x1579: 0x0359, 0x157a: 0x035f, 0x157b: 0x0365,
+	// Block 0x56, offset 0x1580
+	0x1580: 0x19a6, 0x1581: 0x19a3, 0x1582: 0x19a9, 0x1583: 0x19cd, 0x1584: 0x19f1, 0x1585: 0x1a15,
+	0x1586: 0x1a39, 0x1587: 0x1a42, 0x1588: 0x1a48, 0x1589: 0x1a4e, 0x158a: 0x1a54,
+	0x1590: 0x1bbc, 0x1591: 0x1bc0,
+	0x1592: 0x1bc4, 0x1593: 0x1bc8, 0x1594: 0x1bcc, 0x1595: 0x1bd0, 0x1596: 0x1bd4, 0x1597: 0x1bd8,
+	0x1598: 0x1bdc, 0x1599: 0x1be0, 0x159a: 0x1be4, 0x159b: 0x1be8, 0x159c: 0x1bec, 0x159d: 0x1bf0,
+	0x159e: 0x1bf4, 0x159f: 0x1bf8, 0x15a0: 0x1bfc, 0x15a1: 0x1c00, 0x15a2: 0x1c04, 0x15a3: 0x1c08,
+	0x15a4: 0x1c0c, 0x15a5: 0x1c10, 0x15a6: 0x1c14, 0x15a7: 0x1c18, 0x15a8: 0x1c1c, 0x15a9: 0x1c20,
+	0x15aa: 0x2855, 0x15ab: 0x0047, 0x15ac: 0x0065, 0x15ad: 0x1a69, 0x15ae: 0x1ae1,
+	0x15b0: 0x0043, 0x15b1: 0x0045, 0x15b2: 0x0047, 0x15b3: 0x0049, 0x15b4: 0x004b, 0x15b5: 0x004d,
+	0x15b6: 0x004f, 0x15b7: 0x0051, 0x15b8: 0x0053, 0x15b9: 0x0055, 0x15ba: 0x0057, 0x15bb: 0x0059,
+	0x15bc: 0x005b, 0x15bd: 0x005d, 0x15be: 0x005f, 0x15bf: 0x0061,
+	// Block 0x57, offset 0x15c0
+	0x15c0: 0x27dd, 0x15c1: 0x27f2, 0x15c2: 0x05fe,
+	0x15d0: 0x0d0a, 0x15d1: 0x0b42,
+	0x15d2: 0x09ce, 0x15d3: 0x4705, 0x15d4: 0x0816, 0x15d5: 0x0aea, 0x15d6: 0x142a, 0x15d7: 0x0afa,
+	0x15d8: 0x0822, 0x15d9: 0x0dd2, 0x15da: 0x0faa, 0x15db: 0x0daa, 0x15dc: 0x0922, 0x15dd: 0x0c66,
+	0x15de: 0x08ba, 0x15df: 0x0db2, 0x15e0: 0x090e, 0x15e1: 0x1212, 0x15e2: 0x107e, 0x15e3: 0x1486,
+	0x15e4: 0x0ace, 0x15e5: 0x0a06, 0x15e6: 0x0f5e, 0x15e7: 0x0d16, 0x15e8: 0x0d42, 0x15e9: 0x07ba,
+	0x15ea: 0x07c6, 0x15eb: 0x1506, 0x15ec: 0x0bd6, 0x15ed: 0x07e2, 0x15ee: 0x09ea, 0x15ef: 0x0d36,
+	0x15f0: 0x14ae, 0x15f1: 0x0d0e, 0x15f2: 0x116a, 0x15f3: 0x11a6, 0x15f4: 0x09f2, 0x15f5: 0x0f3e,
+	0x15f6: 0x0e06, 0x15f7: 0x0e02, 0x15f8: 0x1092, 0x15f9: 0x0926, 0x15fa: 0x0a52, 0x15fb: 0x153e,
+	// Block 0x58, offset 0x1600
+	0x1600: 0x07f6, 0x1601: 0x07ee, 0x1602: 0x07fe, 0x1603: 0x1774, 0x1604: 0x0842, 0x1605: 0x0852,
+	0x1606: 0x0856, 0x1607: 0x085e, 0x1608: 0x0866, 0x1609: 0x086a, 0x160a: 0x0876, 0x160b: 0x086e,
+	0x160c: 0x06ae, 0x160d: 0x1788, 0x160e: 0x088a, 0x160f: 0x088e, 0x1610: 0x0892, 0x1611: 0x08ae,
+	0x1612: 0x1779, 0x1613: 0x06b2, 0x1614: 0x089a, 0x1615: 0x08ba, 0x1616: 0x1783, 0x1617: 0x08ca,
+	0x1618: 0x08d2, 0x1619: 0x0832, 0x161a: 0x08da, 0x161b: 0x08de, 0x161c: 0x195e, 0x161d: 0x08fa,
+	0x161e: 0x0902, 0x161f: 0x06ba, 0x1620: 0x091a, 0x1621: 0x091e, 0x1622: 0x0926, 0x1623: 0x092a,
+	0x1624: 0x06be, 0x1625: 0x0942, 0x1626: 0x0946, 0x1627: 0x0952, 0x1628: 0x095e, 0x1629: 0x0962,
+	0x162a: 0x0966, 0x162b: 0x096e, 0x162c: 0x098e, 0x162d: 0x0992, 0x162e: 0x099a, 0x162f: 0x09aa,
+	0x1630: 0x09b2, 0x1631: 0x09b6, 0x1632: 0x09b6, 0x1633: 0x09b6, 0x1634: 0x1797, 0x1635: 0x0f8e,
+	0x1636: 0x09ca, 0x1637: 0x09d2, 0x1638: 0x179c, 0x1639: 0x09de, 0x163a: 0x09e6, 0x163b: 0x09ee,
+	0x163c: 0x0a16, 0x163d: 0x0a02, 0x163e: 0x0a0e, 0x163f: 0x0a12,
+	// Block 0x59, offset 0x1640
+	0x1640: 0x0a1a, 0x1641: 0x0a22, 0x1642: 0x0a26, 0x1643: 0x0a2e, 0x1644: 0x0a36, 0x1645: 0x0a3a,
+	0x1646: 0x0a3a, 0x1647: 0x0a42, 0x1648: 0x0a4a, 0x1649: 0x0a4e, 0x164a: 0x0a5a, 0x164b: 0x0a7e,
+	0x164c: 0x0a62, 0x164d: 0x0a82, 0x164e: 0x0a66, 0x164f: 0x0a6e, 0x1650: 0x0906, 0x1651: 0x0aca,
+	0x1652: 0x0a92, 0x1653: 0x0a96, 0x1654: 0x0a9a, 0x1655: 0x0a8e, 0x1656: 0x0aa2, 0x1657: 0x0a9e,
+	0x1658: 0x0ab6, 0x1659: 0x17a1, 0x165a: 0x0ad2, 0x165b: 0x0ad6, 0x165c: 0x0ade, 0x165d: 0x0aea,
+	0x165e: 0x0af2, 0x165f: 0x0b0e, 0x1660: 0x17a6, 0x1661: 0x17ab, 0x1662: 0x0b1a, 0x1663: 0x0b1e,
+	0x1664: 0x0b22, 0x1665: 0x0b16, 0x1666: 0x0b2a, 0x1667: 0x06c2, 0x1668: 0x06c6, 0x1669: 0x0b32,
+	0x166a: 0x0b3a, 0x166b: 0x0b3a, 0x166c: 0x17b0, 0x166d: 0x0b56, 0x166e: 0x0b5a, 0x166f: 0x0b5e,
+	0x1670: 0x0b66, 0x1671: 0x17b5, 0x1672: 0x0b6e, 0x1673: 0x0b72, 0x1674: 0x0c4a, 0x1675: 0x0b7a,
+	0x1676: 0x06ca, 0x1677: 0x0b86, 0x1678: 0x0b96, 0x1679: 0x0ba2, 0x167a: 0x0b9e, 0x167b: 0x17bf,
+	0x167c: 0x0baa, 0x167d: 0x17c4, 0x167e: 0x0bb6, 0x167f: 0x0bb2,
+	// Block 0x5a, offset 0x1680
+	0x1680: 0x0bba, 0x1681: 0x0bca, 0x1682: 0x0bce, 0x1683: 0x06ce, 0x1684: 0x0bde, 0x1685: 0x0be6,
+	0x1686: 0x0bea, 0x1687: 0x0bee, 0x1688: 0x06d2, 0x1689: 0x17c9, 0x168a: 0x06d6, 0x168b: 0x0c0a,
+	0x168c: 0x0c0e, 0x168d: 0x0c12, 0x168e: 0x0c1a, 0x168f: 0x1990, 0x1690: 0x0c32, 0x1691: 0x17d3,
+	0x1692: 0x17d3, 0x1693: 0x12d2, 0x1694: 0x0c42, 0x1695: 0x0c42, 0x1696: 0x06da, 0x1697: 0x17f6,
+	0x1698: 0x18c8, 0x1699: 0x0c52, 0x169a: 0x0c5a, 0x169b: 0x06de, 0x169c: 0x0c6e, 0x169d: 0x0c7e,
+	0x169e: 0x0c82, 0x169f: 0x0c8a, 0x16a0: 0x0c9a, 0x16a1: 0x06e6, 0x16a2: 0x06e2, 0x16a3: 0x0c9e,
+	0x16a4: 0x17d8, 0x16a5: 0x0ca2, 0x16a6: 0x0cb6, 0x16a7: 0x0cba, 0x16a8: 0x0cbe, 0x16a9: 0x0cba,
+	0x16aa: 0x0cca, 0x16ab: 0x0cce, 0x16ac: 0x0cde, 0x16ad: 0x0cd6, 0x16ae: 0x0cda, 0x16af: 0x0ce2,
+	0x16b0: 0x0ce6, 0x16b1: 0x0cea, 0x16b2: 0x0cf6, 0x16b3: 0x0cfa, 0x16b4: 0x0d12, 0x16b5: 0x0d1a,
+	0x16b6: 0x0d2a, 0x16b7: 0x0d3e, 0x16b8: 0x17e7, 0x16b9: 0x0d3a, 0x16ba: 0x0d2e, 0x16bb: 0x0d46,
+	0x16bc: 0x0d4e, 0x16bd: 0x0d62, 0x16be: 0x17ec, 0x16bf: 0x0d6a,
+	// Block 0x5b, offset 0x16c0
+	0x16c0: 0x0d5e, 0x16c1: 0x0d56, 0x16c2: 0x06ea, 0x16c3: 0x0d72, 0x16c4: 0x0d7a, 0x16c5: 0x0d82,
+	0x16c6: 0x0d76, 0x16c7: 0x06ee, 0x16c8: 0x0d92, 0x16c9: 0x0d9a, 0x16ca: 0x17f1, 0x16cb: 0x0dc6,
+	0x16cc: 0x0dfa, 0x16cd: 0x0dd6, 0x16ce: 0x06fa, 0x16cf: 0x0de2, 0x16d0: 0x06f6, 0x16d1: 0x06f2,
+	0x16d2: 0x08be, 0x16d3: 0x08c2, 0x16d4: 0x0dfe, 0x16d5: 0x0de6, 0x16d6: 0x12a6, 0x16d7: 0x075e,
+	0x16d8: 0x0e0a, 0x16d9: 0x0e0e, 0x16da: 0x0e12, 0x16db: 0x0e26, 0x16dc: 0x0e1e, 0x16dd: 0x180a,
+	0x16de: 0x06fe, 0x16df: 0x0e3a, 0x16e0: 0x0e2e, 0x16e1: 0x0e4a, 0x16e2: 0x0e52, 0x16e3: 0x1814,
+	0x16e4: 0x0e56, 0x16e5: 0x0e42, 0x16e6: 0x0e5e, 0x16e7: 0x0702, 0x16e8: 0x0e62, 0x16e9: 0x0e66,
+	0x16ea: 0x0e6a, 0x16eb: 0x0e76, 0x16ec: 0x1819, 0x16ed: 0x0e7e, 0x16ee: 0x0706, 0x16ef: 0x0e8a,
+	0x16f0: 0x181e, 0x16f1: 0x0e8e, 0x16f2: 0x070a, 0x16f3: 0x0e9a, 0x16f4: 0x0ea6, 0x16f5: 0x0eb2,
+	0x16f6: 0x0eb6, 0x16f7: 0x1823, 0x16f8: 0x17ba, 0x16f9: 0x1828, 0x16fa: 0x0ed6, 0x16fb: 0x182d,
+	0x16fc: 0x0ee2, 0x16fd: 0x0eea, 0x16fe: 0x0eda, 0x16ff: 0x0ef6,
+	// Block 0x5c, offset 0x1700
+	0x1700: 0x0f06, 0x1701: 0x0f16, 0x1702: 0x0f0a, 0x1703: 0x0f0e, 0x1704: 0x0f1a, 0x1705: 0x0f1e,
+	0x1706: 0x1832, 0x1707: 0x0f02, 0x1708: 0x0f36, 0x1709: 0x0f3a, 0x170a: 0x070e, 0x170b: 0x0f4e,
+	0x170c: 0x0f4a, 0x170d: 0x1837, 0x170e: 0x0f2e, 0x170f: 0x0f6a, 0x1710: 0x183c, 0x1711: 0x1841,
+	0x1712: 0x0f6e, 0x1713: 0x0f82, 0x1714: 0x0f7e, 0x1715: 0x0f7a, 0x1716: 0x0712, 0x1717: 0x0f86,
+	0x1718: 0x0f96, 0x1719: 0x0f92, 0x171a: 0x0f9e, 0x171b: 0x177e, 0x171c: 0x0fae, 0x171d: 0x1846,
+	0x171e: 0x0fba, 0x171f: 0x1850, 0x1720: 0x0fce, 0x1721: 0x0fda, 0x1722: 0x0fee, 0x1723: 0x1855,
+	0x1724: 0x1002, 0x1725: 0x1006, 0x1726: 0x185a, 0x1727: 0x185f, 0x1728: 0x1022, 0x1729: 0x1032,
+	0x172a: 0x0716, 0x172b: 0x1036, 0x172c: 0x071a, 0x172d: 0x071a, 0x172e: 0x104e, 0x172f: 0x1052,
+	0x1730: 0x105a, 0x1731: 0x105e, 0x1732: 0x106a, 0x1733: 0x071e, 0x1734: 0x1082, 0x1735: 0x1864,
+	0x1736: 0x109e, 0x1737: 0x1869, 0x1738: 0x10aa, 0x1739: 0x17ce, 0x173a: 0x10ba, 0x173b: 0x186e,
+	0x173c: 0x1873, 0x173d: 0x1878, 0x173e: 0x0722, 0x173f: 0x0726,
+	// Block 0x5d, offset 0x1740
+	0x1740: 0x10f2, 0x1741: 0x1882, 0x1742: 0x187d, 0x1743: 0x1887, 0x1744: 0x188c, 0x1745: 0x10fa,
+	0x1746: 0x10fe, 0x1747: 0x10fe, 0x1748: 0x1106, 0x1749: 0x072e, 0x174a: 0x110a, 0x174b: 0x0732,
+	0x174c: 0x0736, 0x174d: 0x1896, 0x174e: 0x111e, 0x174f: 0x1126, 0x1750: 0x1132, 0x1751: 0x073a,
+	0x1752: 0x189b, 0x1753: 0x1156, 0x1754: 0x18a0, 0x1755: 0x18a5, 0x1756: 0x1176, 0x1757: 0x118e,
+	0x1758: 0x073e, 0x1759: 0x1196, 0x175a: 0x119a, 0x175b: 0x119e, 0x175c: 0x18aa, 0x175d: 0x18af,
+	0x175e: 0x18af, 0x175f: 0x11b6, 0x1760: 0x0742, 0x1761: 0x18b4, 0x1762: 0x11ca, 0x1763: 0x11ce,
+	0x1764: 0x0746, 0x1765: 0x18b9, 0x1766: 0x11ea, 0x1767: 0x074a, 0x1768: 0x11fa, 0x1769: 0x11f2,
+	0x176a: 0x1202, 0x176b: 0x18c3, 0x176c: 0x121a, 0x176d: 0x074e, 0x176e: 0x1226, 0x176f: 0x122e,
+	0x1770: 0x123e, 0x1771: 0x0752, 0x1772: 0x18cd, 0x1773: 0x18d2, 0x1774: 0x0756, 0x1775: 0x18d7,
+	0x1776: 0x1256, 0x1777: 0x18dc, 0x1778: 0x1262, 0x1779: 0x126e, 0x177a: 0x1276, 0x177b: 0x18e1,
+	0x177c: 0x18e6, 0x177d: 0x128a, 0x177e: 0x18eb, 0x177f: 0x1292,
+	// Block 0x5e, offset 0x1780
+	0x1780: 0x17fb, 0x1781: 0x075a, 0x1782: 0x12aa, 0x1783: 0x12ae, 0x1784: 0x0762, 0x1785: 0x12b2,
+	0x1786: 0x0b2e, 0x1787: 0x18f0, 0x1788: 0x18f5, 0x1789: 0x1800, 0x178a: 0x1805, 0x178b: 0x12d2,
+	0x178c: 0x12d6, 0x178d: 0x14ee, 0x178e: 0x0766, 0x178f: 0x1302, 0x1790: 0x12fe, 0x1791: 0x1306,
+	0x1792: 0x093a, 0x1793: 0x130a, 0x1794: 0x130e, 0x1795: 0x1312, 0x1796: 0x131a, 0x1797: 0x18fa,
+	0x1798: 0x1316, 0x1799: 0x131e, 0x179a: 0x1332, 0x179b: 0x1336, 0x179c: 0x1322, 0x179d: 0x133a,
+	0x179e: 0x134e, 0x179f: 0x1362, 0x17a0: 0x132e, 0x17a1: 0x1342, 0x17a2: 0x1346, 0x17a3: 0x134a,
+	0x17a4: 0x18ff, 0x17a5: 0x1909, 0x17a6: 0x1904, 0x17a7: 0x076a, 0x17a8: 0x136a, 0x17a9: 0x136e,
+	0x17aa: 0x1376, 0x17ab: 0x191d, 0x17ac: 0x137a, 0x17ad: 0x190e, 0x17ae: 0x076e, 0x17af: 0x0772,
+	0x17b0: 0x1913, 0x17b1: 0x1918, 0x17b2: 0x0776, 0x17b3: 0x139a, 0x17b4: 0x139e, 0x17b5: 0x13a2,
+	0x17b6: 0x13a6, 0x17b7: 0x13b2, 0x17b8: 0x13ae, 0x17b9: 0x13ba, 0x17ba: 0x13b6, 0x17bb: 0x13c6,
+	0x17bc: 0x13be, 0x17bd: 0x13c2, 0x17be: 0x13ca, 0x17bf: 0x077a,
+	// Block 0x5f, offset 0x17c0
+	0x17c0: 0x13d2, 0x17c1: 0x13d6, 0x17c2: 0x077e, 0x17c3: 0x13e6, 0x17c4: 0x13ea, 0x17c5: 0x1922,
+	0x17c6: 0x13f6, 0x17c7: 0x13fa, 0x17c8: 0x0782, 0x17c9: 0x1406, 0x17ca: 0x06b6, 0x17cb: 0x1927,
+	0x17cc: 0x192c, 0x17cd: 0x0786, 0x17ce: 0x078a, 0x17cf: 0x1432, 0x17d0: 0x144a, 0x17d1: 0x1466,
+	0x17d2: 0x1476, 0x17d3: 0x1931, 0x17d4: 0x148a, 0x17d5: 0x148e, 0x17d6: 0x14a6, 0x17d7: 0x14b2,
+	0x17d8: 0x193b, 0x17d9: 0x178d, 0x17da: 0x14be, 0x17db: 0x14ba, 0x17dc: 0x14c6, 0x17dd: 0x1792,
+	0x17de: 0x14d2, 0x17df: 0x14de, 0x17e0: 0x1940, 0x17e1: 0x1945, 0x17e2: 0x151e, 0x17e3: 0x152a,
+	0x17e4: 0x1532, 0x17e5: 0x194a, 0x17e6: 0x1536, 0x17e7: 0x1562, 0x17e8: 0x156e, 0x17e9: 0x1572,
+	0x17ea: 0x156a, 0x17eb: 0x157e, 0x17ec: 0x1582, 0x17ed: 0x194f, 0x17ee: 0x158e, 0x17ef: 0x078e,
+	0x17f0: 0x1596, 0x17f1: 0x1954, 0x17f2: 0x0792, 0x17f3: 0x15ce, 0x17f4: 0x0bbe, 0x17f5: 0x15e6,
+	0x17f6: 0x1959, 0x17f7: 0x1963, 0x17f8: 0x0796, 0x17f9: 0x079a, 0x17fa: 0x160e, 0x17fb: 0x1968,
+	0x17fc: 0x079e, 0x17fd: 0x196d, 0x17fe: 0x1626, 0x17ff: 0x1626,
+	// Block 0x60, offset 0x1800
+	0x1800: 0x162e, 0x1801: 0x1972, 0x1802: 0x1646, 0x1803: 0x07a2, 0x1804: 0x1656, 0x1805: 0x1662,
+	0x1806: 0x166a, 0x1807: 0x1672, 0x1808: 0x07a6, 0x1809: 0x1977, 0x180a: 0x1686, 0x180b: 0x16a2,
+	0x180c: 0x16ae, 0x180d: 0x07aa, 0x180e: 0x07ae, 0x180f: 0x16b2, 0x1810: 0x197c, 0x1811: 0x07b2,
+	0x1812: 0x1981, 0x1813: 0x1986, 0x1814: 0x198b, 0x1815: 0x16d6, 0x1816: 0x07b6, 0x1817: 0x16ea,
+	0x1818: 0x16f2, 0x1819: 0x16f6, 0x181a: 0x16fe, 0x181b: 0x1706, 0x181c: 0x170e, 0x181d: 0x1995,
+}
+
+// nfkcIndex: 22 blocks, 1408 entries, 2816 bytes
+// Block 0 is the zero block.
+var nfkcIndex = [1408]uint16{
+	// Block 0x0, offset 0x0
+	// Block 0x1, offset 0x40
+	// Block 0x2, offset 0x80
+	// Block 0x3, offset 0xc0
+	0xc2: 0x5f, 0xc3: 0x01, 0xc4: 0x02, 0xc5: 0x03, 0xc6: 0x60, 0xc7: 0x04,
+	0xc8: 0x05, 0xca: 0x61, 0xcb: 0x62, 0xcc: 0x06, 0xcd: 0x07, 0xce: 0x08, 0xcf: 0x09,
+	0xd0: 0x0a, 0xd1: 0x63, 0xd2: 0x64, 0xd3: 0x0b, 0xd6: 0x0c, 0xd7: 0x65,
+	0xd8: 0x66, 0xd9: 0x0d, 0xdb: 0x67, 0xdc: 0x68, 0xdd: 0x69, 0xdf: 0x6a,
+	0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05,
+	0xea: 0x06, 0xeb: 0x07, 0xec: 0x08, 0xed: 0x09, 0xef: 0x0a,
+	0xf0: 0x13,
+	// Block 0x4, offset 0x100
+	0x120: 0x6b, 0x121: 0x6c, 0x122: 0x6d, 0x123: 0x0e, 0x124: 0x6e, 0x125: 0x6f, 0x126: 0x70, 0x127: 0x71,
+	0x128: 0x72, 0x129: 0x73, 0x12a: 0x74, 0x12b: 0x75, 0x12c: 0x70, 0x12d: 0x76, 0x12e: 0x77, 0x12f: 0x78,
+	0x130: 0x74, 0x131: 0x79, 0x132: 0x7a, 0x133: 0x7b, 0x134: 0x7c, 0x135: 0x7d, 0x137: 0x7e,
+	0x138: 0x7f, 0x139: 0x80, 0x13a: 0x81, 0x13b: 0x82, 0x13c: 0x83, 0x13d: 0x84, 0x13e: 0x85, 0x13f: 0x86,
+	// Block 0x5, offset 0x140
+	0x140: 0x87, 0x142: 0x88, 0x143: 0x89, 0x144: 0x8a, 0x145: 0x8b, 0x146: 0x8c, 0x147: 0x8d,
+	0x14d: 0x8e,
+	0x15c: 0x8f, 0x15f: 0x90,
+	0x162: 0x91, 0x164: 0x92,
+	0x168: 0x93, 0x169: 0x94, 0x16a: 0x95, 0x16b: 0x96, 0x16c: 0x0f, 0x16d: 0x97, 0x16e: 0x98, 0x16f: 0x99,
+	0x170: 0x9a, 0x173: 0x9b, 0x174: 0x9c, 0x175: 0x10, 0x176: 0x11, 0x177: 0x12,
+	0x178: 0x13, 0x179: 0x14, 0x17a: 0x15, 0x17b: 0x16, 0x17c: 0x17, 0x17d: 0x18, 0x17e: 0x19, 0x17f: 0x1a,
+	// Block 0x6, offset 0x180
+	0x180: 0x9d, 0x181: 0x9e, 0x182: 0x9f, 0x183: 0xa0, 0x184: 0x1b, 0x185: 0x1c, 0x186: 0xa1, 0x187: 0xa2,
+	0x188: 0xa3, 0x189: 0x1d, 0x18a: 0x1e, 0x18b: 0xa4, 0x18c: 0xa5,
+	0x191: 0x1f, 0x192: 0x20, 0x193: 0xa6,
+	0x1a8: 0xa7, 0x1a9: 0xa8, 0x1ab: 0xa9,
+	0x1b1: 0xaa, 0x1b3: 0xab, 0x1b5: 0xac, 0x1b7: 0xad,
+	0x1ba: 0xae, 0x1bb: 0xaf, 0x1bc: 0x21, 0x1bd: 0x22, 0x1be: 0x23, 0x1bf: 0xb0,
+	// Block 0x7, offset 0x1c0
+	0x1c0: 0xb1, 0x1c1: 0x24, 0x1c2: 0x25, 0x1c3: 0x26, 0x1c4: 0xb2, 0x1c5: 0x27, 0x1c6: 0x28,
+	0x1c8: 0x29, 0x1c9: 0x2a, 0x1ca: 0x2b, 0x1cb: 0x2c, 0x1cc: 0x2d, 0x1cd: 0x2e, 0x1ce: 0x2f, 0x1cf: 0x30,
+	// Block 0x8, offset 0x200
+	0x219: 0xb3, 0x21a: 0xb4, 0x21b: 0xb5, 0x21d: 0xb6, 0x21f: 0xb7,
+	0x220: 0xb8, 0x223: 0xb9, 0x224: 0xba, 0x225: 0xbb, 0x226: 0xbc, 0x227: 0xbd,
+	0x22a: 0xbe, 0x22b: 0xbf, 0x22d: 0xc0, 0x22f: 0xc1,
+	0x230: 0xc2, 0x231: 0xc3, 0x232: 0xc4, 0x233: 0xc5, 0x234: 0xc6, 0x235: 0xc7, 0x236: 0xc8, 0x237: 0xc2,
+	0x238: 0xc3, 0x239: 0xc4, 0x23a: 0xc5, 0x23b: 0xc6, 0x23c: 0xc7, 0x23d: 0xc8, 0x23e: 0xc2, 0x23f: 0xc3,
+	// Block 0x9, offset 0x240
+	0x240: 0xc4, 0x241: 0xc5, 0x242: 0xc6, 0x243: 0xc7, 0x244: 0xc8, 0x245: 0xc2, 0x246: 0xc3, 0x247: 0xc4,
+	0x248: 0xc5, 0x249: 0xc6, 0x24a: 0xc7, 0x24b: 0xc8, 0x24c: 0xc2, 0x24d: 0xc3, 0x24e: 0xc4, 0x24f: 0xc5,
+	0x250: 0xc6, 0x251: 0xc7, 0x252: 0xc8, 0x253: 0xc2, 0x254: 0xc3, 0x255: 0xc4, 0x256: 0xc5, 0x257: 0xc6,
+	0x258: 0xc7, 0x259: 0xc8, 0x25a: 0xc2, 0x25b: 0xc3, 0x25c: 0xc4, 0x25d: 0xc5, 0x25e: 0xc6, 0x25f: 0xc7,
+	0x260: 0xc8, 0x261: 0xc2, 0x262: 0xc3, 0x263: 0xc4, 0x264: 0xc5, 0x265: 0xc6, 0x266: 0xc7, 0x267: 0xc8,
+	0x268: 0xc2, 0x269: 0xc3, 0x26a: 0xc4, 0x26b: 0xc5, 0x26c: 0xc6, 0x26d: 0xc7, 0x26e: 0xc8, 0x26f: 0xc2,
+	0x270: 0xc3, 0x271: 0xc4, 0x272: 0xc5, 0x273: 0xc6, 0x274: 0xc7, 0x275: 0xc8, 0x276: 0xc2, 0x277: 0xc3,
+	0x278: 0xc4, 0x279: 0xc5, 0x27a: 0xc6, 0x27b: 0xc7, 0x27c: 0xc8, 0x27d: 0xc2, 0x27e: 0xc3, 0x27f: 0xc4,
+	// Block 0xa, offset 0x280
+	0x280: 0xc5, 0x281: 0xc6, 0x282: 0xc7, 0x283: 0xc8, 0x284: 0xc2, 0x285: 0xc3, 0x286: 0xc4, 0x287: 0xc5,
+	0x288: 0xc6, 0x289: 0xc7, 0x28a: 0xc8, 0x28b: 0xc2, 0x28c: 0xc3, 0x28d: 0xc4, 0x28e: 0xc5, 0x28f: 0xc6,
+	0x290: 0xc7, 0x291: 0xc8, 0x292: 0xc2, 0x293: 0xc3, 0x294: 0xc4, 0x295: 0xc5, 0x296: 0xc6, 0x297: 0xc7,
+	0x298: 0xc8, 0x299: 0xc2, 0x29a: 0xc3, 0x29b: 0xc4, 0x29c: 0xc5, 0x29d: 0xc6, 0x29e: 0xc7, 0x29f: 0xc8,
+	0x2a0: 0xc2, 0x2a1: 0xc3, 0x2a2: 0xc4, 0x2a3: 0xc5, 0x2a4: 0xc6, 0x2a5: 0xc7, 0x2a6: 0xc8, 0x2a7: 0xc2,
+	0x2a8: 0xc3, 0x2a9: 0xc4, 0x2aa: 0xc5, 0x2ab: 0xc6, 0x2ac: 0xc7, 0x2ad: 0xc8, 0x2ae: 0xc2, 0x2af: 0xc3,
+	0x2b0: 0xc4, 0x2b1: 0xc5, 0x2b2: 0xc6, 0x2b3: 0xc7, 0x2b4: 0xc8, 0x2b5: 0xc2, 0x2b6: 0xc3, 0x2b7: 0xc4,
+	0x2b8: 0xc5, 0x2b9: 0xc6, 0x2ba: 0xc7, 0x2bb: 0xc8, 0x2bc: 0xc2, 0x2bd: 0xc3, 0x2be: 0xc4, 0x2bf: 0xc5,
+	// Block 0xb, offset 0x2c0
+	0x2c0: 0xc6, 0x2c1: 0xc7, 0x2c2: 0xc8, 0x2c3: 0xc2, 0x2c4: 0xc3, 0x2c5: 0xc4, 0x2c6: 0xc5, 0x2c7: 0xc6,
+	0x2c8: 0xc7, 0x2c9: 0xc8, 0x2ca: 0xc2, 0x2cb: 0xc3, 0x2cc: 0xc4, 0x2cd: 0xc5, 0x2ce: 0xc6, 0x2cf: 0xc7,
+	0x2d0: 0xc8, 0x2d1: 0xc2, 0x2d2: 0xc3, 0x2d3: 0xc4, 0x2d4: 0xc5, 0x2d5: 0xc6, 0x2d6: 0xc7, 0x2d7: 0xc8,
+	0x2d8: 0xc2, 0x2d9: 0xc3, 0x2da: 0xc4, 0x2db: 0xc5, 0x2dc: 0xc6, 0x2dd: 0xc7, 0x2de: 0xc9,
+	// Block 0xc, offset 0x300
+	0x324: 0x31, 0x325: 0x32, 0x326: 0x33, 0x327: 0x34,
+	0x328: 0x35, 0x329: 0x36, 0x32a: 0x37, 0x32b: 0x38, 0x32c: 0x39, 0x32d: 0x3a, 0x32e: 0x3b, 0x32f: 0x3c,
+	0x330: 0x3d, 0x331: 0x3e, 0x332: 0x3f, 0x333: 0x40, 0x334: 0x41, 0x335: 0x42, 0x336: 0x43, 0x337: 0x44,
+	0x338: 0x45, 0x339: 0x46, 0x33a: 0x47, 0x33b: 0x48, 0x33c: 0xca, 0x33d: 0x49, 0x33e: 0x4a, 0x33f: 0x4b,
+	// Block 0xd, offset 0x340
+	0x347: 0xcb,
+	0x34b: 0xcc, 0x34d: 0xcd,
+	0x35e: 0x4c,
+	0x368: 0xce, 0x36b: 0xcf,
+	0x374: 0xd0,
+	0x37a: 0xd1, 0x37b: 0xd2, 0x37d: 0xd3, 0x37e: 0xd4,
+	// Block 0xe, offset 0x380
+	0x381: 0xd5, 0x382: 0xd6, 0x384: 0xd7, 0x385: 0xbc, 0x387: 0xd8,
+	0x388: 0xd9, 0x38b: 0xda, 0x38c: 0xdb, 0x38d: 0xdc,
+	0x391: 0xdd, 0x392: 0xde, 0x393: 0xdf, 0x396: 0xe0, 0x397: 0xe1,
+	0x398: 0xe2, 0x39a: 0xe3, 0x39c: 0xe4,
+	0x3a0: 0xe5, 0x3a4: 0xe6, 0x3a5: 0xe7, 0x3a7: 0xe8,
+	0x3a8: 0xe9, 0x3a9: 0xea, 0x3aa: 0xeb,
+	0x3b0: 0xe2, 0x3b5: 0xec, 0x3b6: 0xed,
+	0x3bd: 0xee,
+	// Block 0xf, offset 0x3c0
+	0x3eb: 0xef, 0x3ec: 0xf0,
+	0x3ff: 0xf1,
+	// Block 0x10, offset 0x400
+	0x432: 0xf2,
+	// Block 0x11, offset 0x440
+	0x445: 0xf3, 0x446: 0xf4, 0x447: 0xf5,
+	0x449: 0xf6,
+	0x450: 0xf7, 0x451: 0xf8, 0x452: 0xf9, 0x453: 0xfa, 0x454: 0xfb, 0x455: 0xfc, 0x456: 0xfd, 0x457: 0xfe,
+	0x458: 0xff, 0x459: 0x100, 0x45a: 0x4d, 0x45b: 0x101, 0x45c: 0x102, 0x45d: 0x103, 0x45e: 0x104, 0x45f: 0x4e,
+	// Block 0x12, offset 0x480
+	0x480: 0x4f, 0x481: 0x50, 0x482: 0x105, 0x484: 0xf0,
+	0x48a: 0x106, 0x48b: 0x107,
+	0x493: 0x108,
+	0x4a3: 0x109, 0x4a5: 0x10a,
+	0x4b8: 0x51, 0x4b9: 0x52, 0x4ba: 0x53,
+	// Block 0x13, offset 0x4c0
+	0x4c4: 0x54, 0x4c5: 0x10b, 0x4c6: 0x10c,
+	0x4c8: 0x55, 0x4c9: 0x10d,
+	0x4ef: 0x10e,
+	// Block 0x14, offset 0x500
+	0x520: 0x56, 0x521: 0x57, 0x522: 0x58, 0x523: 0x59, 0x524: 0x5a, 0x525: 0x5b, 0x526: 0x5c, 0x527: 0x5d,
+	0x528: 0x5e,
+	// Block 0x15, offset 0x540
+	0x550: 0x0b, 0x551: 0x0c, 0x556: 0x0d,
+	0x55b: 0x0e, 0x55d: 0x0f, 0x55e: 0x10, 0x55f: 0x11,
+	0x56f: 0x12,
+}
+
+// nfkcSparseOffset: 176 entries, 352 bytes
+var nfkcSparseOffset = []uint16{0x0, 0xe, 0x12, 0x1c, 0x26, 0x36, 0x38, 0x3d, 0x48, 0x57, 0x64, 0x6c, 0x71, 0x76, 0x78, 0x7c, 0x84, 0x8b, 0x8e, 0x96, 0x9a, 0x9e, 0xa0, 0xa2, 0xab, 0xaf, 0xb6, 0xbb, 0xbe, 0xc8, 0xcb, 0xd2, 0xda, 0xde, 0xe0, 0xe4, 0xe8, 0xee, 0xff, 0x10b, 0x10d, 0x113, 0x115, 0x117, 0x119, 0x11b, 0x11d, 0x11f, 0x121, 0x124, 0x127, 0x129, 0x12c, 0x12f, 0x133, 0x139, 0x140, 0x149, 0x14b, 0x14e, 0x150, 0x15b, 0x166, 0x174, 0x182, 0x192, 0x1a0, 0x1a7, 0x1ad, 0x1bc, 0x1c0, 0x1c2, 0x1c6, 0x1c8, 0x1cb, 0x1cd, 0x1d0, 0x1d2, 0x1d5, 0x1d7, 0x1d9, 0x1db, 0x1e7, 0x1f1, 0x1fb, 0x1fe, 0x202, 0x204, 0x206, 0x20b, 0x20e, 0x211, 0x213, 0x215, 0x217, 0x219, 0x21f, 0x222, 0x227, 0x229, 0x230, 0x236, 0x23c, 0x244, 0x24a, 0x250, 0x256, 0x25a, 0x25c, 0x25e, 0x260, 0x262, 0x268, 0x26b, 0x26d, 0x26f, 0x271, 0x277, 0x27b, 0x27f, 0x287, 0x28e, 0x291, 0x294, 0x296, 0x299, 0x2a1, 0x2a5, 0x2ac, 0x2af, 0x2b5, 0x2b7, 0x2b9, 0x2bc, 0x2be, 0x2c1, 0x2c6, 0x2c8, 0x2ca, 0x2cc, 0x2ce, 0x2d0, 0x2d3, 0x2d5, 0x2d7, 0x2d9, 0x2db, 0x2dd, 0x2df, 0x2ec, 0x2f6, 0x2f8, 0x2fa, 0x2fe, 0x303, 0x30f, 0x314, 0x31d, 0x323, 0x328, 0x32c, 0x331, 0x335, 0x345, 0x353, 0x361, 0x36f, 0x371, 0x373, 0x375, 0x379, 0x37b, 0x37e, 0x389, 0x38b, 0x395}
+
+// nfkcSparseValues: 919 entries, 3676 bytes
+var nfkcSparseValues = [919]valueRange{
+	// Block 0x0, offset 0x0
+	{value: 0x0002, lo: 0x0d},
+	{value: 0x0001, lo: 0xa0, hi: 0xa0},
+	{value: 0x43b9, lo: 0xa8, hi: 0xa8},
+	{value: 0x0083, lo: 0xaa, hi: 0xaa},
+	{value: 0x43a5, lo: 0xaf, hi: 0xaf},
+	{value: 0x0025, lo: 0xb2, hi: 0xb3},
+	{value: 0x439b, lo: 0xb4, hi: 0xb4},
+	{value: 0x0260, lo: 0xb5, hi: 0xb5},
+	{value: 0x43d2, lo: 0xb8, hi: 0xb8},
+	{value: 0x0023, lo: 0xb9, hi: 0xb9},
+	{value: 0x009f, lo: 0xba, hi: 0xba},
+	{value: 0x234c, lo: 0xbc, hi: 0xbc},
+	{value: 0x2340, lo: 0xbd, hi: 0xbd},
+	{value: 0x23e2, lo: 0xbe, hi: 0xbe},
+	// Block 0x1, offset 0xe
+	{value: 0x0091, lo: 0x03},
+	{value: 0x4823, lo: 0xa0, hi: 0xa1},
+	{value: 0x4855, lo: 0xaf, hi: 0xb0},
+	{value: 0xa000, lo: 0xb7, hi: 0xb7},
+	// Block 0x2, offset 0x12
+	{value: 0x0004, lo: 0x09},
+	{value: 0xa000, lo: 0x92, hi: 0x92},
+	{value: 0x0091, lo: 0xb0, hi: 0xb0},
+	{value: 0x0140, lo: 0xb1, hi: 0xb1},
+	{value: 0x0095, lo: 0xb2, hi: 0xb2},
+	{value: 0x00a5, lo: 0xb3, hi: 0xb3},
+	{value: 0x0179, lo: 0xb4, hi: 0xb4},
+	{value: 0x017f, lo: 0xb5, hi: 0xb5},
+	{value: 0x018b, lo: 0xb6, hi: 0xb6},
+	{value: 0x00af, lo: 0xb7, hi: 0xb8},
+	// Block 0x3, offset 0x1c
+	{value: 0x000a, lo: 0x09},
+	{value: 0x43af, lo: 0x98, hi: 0x98},
+	{value: 0x43b4, lo: 0x99, hi: 0x9a},
+	{value: 0x43d7, lo: 0x9b, hi: 0x9b},
+	{value: 0x43a0, lo: 0x9c, hi: 0x9c},
+	{value: 0x43c3, lo: 0x9d, hi: 0x9d},
+	{value: 0x0137, lo: 0xa0, hi: 0xa0},
+	{value: 0x0099, lo: 0xa1, hi: 0xa1},
+	{value: 0x00a7, lo: 0xa2, hi: 0xa3},
+	{value: 0x01b8, lo: 0xa4, hi: 0xa4},
+	// Block 0x4, offset 0x26
+	{value: 0x0000, lo: 0x0f},
+	{value: 0xa000, lo: 0x83, hi: 0x83},
+	{value: 0xa000, lo: 0x87, hi: 0x87},
+	{value: 0xa000, lo: 0x8b, hi: 0x8b},
+	{value: 0xa000, lo: 0x8d, hi: 0x8d},
+	{value: 0x38e6, lo: 0x90, hi: 0x90},
+	{value: 0x38f2, lo: 0x91, hi: 0x91},
+	{value: 0x38e0, lo: 0x93, hi: 0x93},
+	{value: 0xa000, lo: 0x96, hi: 0x96},
+	{value: 0x3958, lo: 0x97, hi: 0x97},
+	{value: 0x3922, lo: 0x9c, hi: 0x9c},
+	{value: 0x390a, lo: 0x9d, hi: 0x9d},
+	{value: 0x3934, lo: 0x9e, hi: 0x9e},
+	{value: 0xa000, lo: 0xb4, hi: 0xb5},
+	{value: 0x395e, lo: 0xb6, hi: 0xb6},
+	{value: 0x3964, lo: 0xb7, hi: 0xb7},
+	// Block 0x5, offset 0x36
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8133, lo: 0x83, hi: 0x87},
+	// Block 0x6, offset 0x38
+	{value: 0x0001, lo: 0x04},
+	{value: 0x8114, lo: 0x81, hi: 0x82},
+	{value: 0x8133, lo: 0x84, hi: 0x84},
+	{value: 0x812e, lo: 0x85, hi: 0x85},
+	{value: 0x810e, lo: 0x87, hi: 0x87},
+	// Block 0x7, offset 0x3d
+	{value: 0x0000, lo: 0x0a},
+	{value: 0x8133, lo: 0x90, hi: 0x97},
+	{value: 0x811a, lo: 0x98, hi: 0x98},
+	{value: 0x811b, lo: 0x99, hi: 0x99},
+	{value: 0x811c, lo: 0x9a, hi: 0x9a},
+	{value: 0x3982, lo: 0xa2, hi: 0xa2},
+	{value: 0x3988, lo: 0xa3, hi: 0xa3},
+	{value: 0x3994, lo: 0xa4, hi: 0xa4},
+	{value: 0x398e, lo: 0xa5, hi: 0xa5},
+	{value: 0x399a, lo: 0xa6, hi: 0xa6},
+	{value: 0xa000, lo: 0xa7, hi: 0xa7},
+	// Block 0x8, offset 0x48
+	{value: 0x0000, lo: 0x0e},
+	{value: 0x39ac, lo: 0x80, hi: 0x80},
+	{value: 0xa000, lo: 0x81, hi: 0x81},
+	{value: 0x39a0, lo: 0x82, hi: 0x82},
+	{value: 0xa000, lo: 0x92, hi: 0x92},
+	{value: 0x39a6, lo: 0x93, hi: 0x93},
+	{value: 0xa000, lo: 0x95, hi: 0x95},
+	{value: 0x8133, lo: 0x96, hi: 0x9c},
+	{value: 0x8133, lo: 0x9f, hi: 0xa2},
+	{value: 0x812e, lo: 0xa3, hi: 0xa3},
+	{value: 0x8133, lo: 0xa4, hi: 0xa4},
+	{value: 0x8133, lo: 0xa7, hi: 0xa8},
+	{value: 0x812e, lo: 0xaa, hi: 0xaa},
+	{value: 0x8133, lo: 0xab, hi: 0xac},
+	{value: 0x812e, lo: 0xad, hi: 0xad},
+	// Block 0x9, offset 0x57
+	{value: 0x0000, lo: 0x0c},
+	{value: 0x8120, lo: 0x91, hi: 0x91},
+	{value: 0x8133, lo: 0xb0, hi: 0xb0},
+	{value: 0x812e, lo: 0xb1, hi: 0xb1},
+	{value: 0x8133, lo: 0xb2, hi: 0xb3},
+	{value: 0x812e, lo: 0xb4, hi: 0xb4},
+	{value: 0x8133, lo: 0xb5, hi: 0xb6},
+	{value: 0x812e, lo: 0xb7, hi: 0xb9},
+	{value: 0x8133, lo: 0xba, hi: 0xba},
+	{value: 0x812e, lo: 0xbb, hi: 0xbc},
+	{value: 0x8133, lo: 0xbd, hi: 0xbd},
+	{value: 0x812e, lo: 0xbe, hi: 0xbe},
+	{value: 0x8133, lo: 0xbf, hi: 0xbf},
+	// Block 0xa, offset 0x64
+	{value: 0x0005, lo: 0x07},
+	{value: 0x8133, lo: 0x80, hi: 0x80},
+	{value: 0x8133, lo: 0x81, hi: 0x81},
+	{value: 0x812e, lo: 0x82, hi: 0x83},
+	{value: 0x812e, lo: 0x84, hi: 0x85},
+	{value: 0x812e, lo: 0x86, hi: 0x87},
+	{value: 0x812e, lo: 0x88, hi: 0x89},
+	{value: 0x8133, lo: 0x8a, hi: 0x8a},
+	// Block 0xb, offset 0x6c
+	{value: 0x0000, lo: 0x04},
+	{value: 0x8133, lo: 0xab, hi: 0xb1},
+	{value: 0x812e, lo: 0xb2, hi: 0xb2},
+	{value: 0x8133, lo: 0xb3, hi: 0xb3},
+	{value: 0x812e, lo: 0xbd, hi: 0xbd},
+	// Block 0xc, offset 0x71
+	{value: 0x0000, lo: 0x04},
+	{value: 0x8133, lo: 0x96, hi: 0x99},
+	{value: 0x8133, lo: 0x9b, hi: 0xa3},
+	{value: 0x8133, lo: 0xa5, hi: 0xa7},
+	{value: 0x8133, lo: 0xa9, hi: 0xad},
+	// Block 0xd, offset 0x76
+	{value: 0x0000, lo: 0x01},
+	{value: 0x812e, lo: 0x99, hi: 0x9b},
+	// Block 0xe, offset 0x78
+	{value: 0x0000, lo: 0x03},
+	{value: 0x8133, lo: 0x98, hi: 0x98},
+	{value: 0x812e, lo: 0x99, hi: 0x9b},
+	{value: 0x8133, lo: 0x9c, hi: 0x9f},
+	// Block 0xf, offset 0x7c
+	{value: 0x0000, lo: 0x07},
+	{value: 0xa000, lo: 0xa8, hi: 0xa8},
+	{value: 0x4019, lo: 0xa9, hi: 0xa9},
+	{value: 0xa000, lo: 0xb0, hi: 0xb0},
+	{value: 0x4021, lo: 0xb1, hi: 0xb1},
+	{value: 0xa000, lo: 0xb3, hi: 0xb3},
+	{value: 0x4029, lo: 0xb4, hi: 0xb4},
+	{value: 0x9903, lo: 0xbc, hi: 0xbc},
+	// Block 0x10, offset 0x84
+	{value: 0x0008, lo: 0x06},
+	{value: 0x8105, lo: 0x8d, hi: 0x8d},
+	{value: 0x8133, lo: 0x91, hi: 0x91},
+	{value: 0x812e, lo: 0x92, hi: 0x92},
+	{value: 0x8133, lo: 0x93, hi: 0x93},
+	{value: 0x8133, lo: 0x94, hi: 0x94},
+	{value: 0x465d, lo: 0x98, hi: 0x9f},
+	// Block 0x11, offset 0x8b
+	{value: 0x0000, lo: 0x02},
+	{value: 0x8103, lo: 0xbc, hi: 0xbc},
+	{value: 0x9900, lo: 0xbe, hi: 0xbe},
+	// Block 0x12, offset 0x8e
+	{value: 0x0008, lo: 0x07},
+	{value: 0xa000, lo: 0x87, hi: 0x87},
+	{value: 0x2dd5, lo: 0x8b, hi: 0x8c},
+	{value: 0x8105, lo: 0x8d, hi: 0x8d},
+	{value: 0x9900, lo: 0x97, hi: 0x97},
+	{value: 0x469d, lo: 0x9c, hi: 0x9d},
+	{value: 0x46ad, lo: 0x9f, hi: 0x9f},
+	{value: 0x8133, lo: 0xbe, hi: 0xbe},
+	// Block 0x13, offset 0x96
+	{value: 0x0000, lo: 0x03},
+	{value: 0x46d5, lo: 0xb3, hi: 0xb3},
+	{value: 0x46dd, lo: 0xb6, hi: 0xb6},
+	{value: 0x8103, lo: 0xbc, hi: 0xbc},
+	// Block 0x14, offset 0x9a
+	{value: 0x0008, lo: 0x03},
+	{value: 0x8105, lo: 0x8d, hi: 0x8d},
+	{value: 0x46b5, lo: 0x99, hi: 0x9b},
+	{value: 0x46cd, lo: 0x9e, hi: 0x9e},
+	// Block 0x15, offset 0x9e
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8103, lo: 0xbc, hi: 0xbc},
+	// Block 0x16, offset 0xa0
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8105, lo: 0x8d, hi: 0x8d},
+	// Block 0x17, offset 0xa2
+	{value: 0x0000, lo: 0x08},
+	{value: 0xa000, lo: 0x87, hi: 0x87},
+	{value: 0x2ded, lo: 0x88, hi: 0x88},
+	{value: 0x2de5, lo: 0x8b, hi: 0x8b},
+	{value: 0x2df5, lo: 0x8c, hi: 0x8c},
+	{value: 0x8105, lo: 0x8d, hi: 0x8d},
+	{value: 0x9900, lo: 0x96, hi: 0x97},
+	{value: 0x46e5, lo: 0x9c, hi: 0x9c},
+	{value: 0x46ed, lo: 0x9d, hi: 0x9d},
+	// Block 0x18, offset 0xab
+	{value: 0x0000, lo: 0x03},
+	{value: 0xa000, lo: 0x92, hi: 0x92},
+	{value: 0x2dfd, lo: 0x94, hi: 0x94},
+	{value: 0x9900, lo: 0xbe, hi: 0xbe},
+	// Block 0x19, offset 0xaf
+	{value: 0x0000, lo: 0x06},
+	{value: 0xa000, lo: 0x86, hi: 0x87},
+	{value: 0x2e05, lo: 0x8a, hi: 0x8a},
+	{value: 0x2e15, lo: 0x8b, hi: 0x8b},
+	{value: 0x2e0d, lo: 0x8c, hi: 0x8c},
+	{value: 0x8105, lo: 0x8d, hi: 0x8d},
+	{value: 0x9900, lo: 0x97, hi: 0x97},
+	// Block 0x1a, offset 0xb6
+	{value: 0x1801, lo: 0x04},
+	{value: 0xa000, lo: 0x86, hi: 0x86},
+	{value: 0x4031, lo: 0x88, hi: 0x88},
+	{value: 0x8105, lo: 0x8d, hi: 0x8d},
+	{value: 0x8121, lo: 0x95, hi: 0x96},
+	// Block 0x1b, offset 0xbb
+	{value: 0x0000, lo: 0x02},
+	{value: 0x8103, lo: 0xbc, hi: 0xbc},
+	{value: 0xa000, lo: 0xbf, hi: 0xbf},
+	// Block 0x1c, offset 0xbe
+	{value: 0x0000, lo: 0x09},
+	{value: 0x2e1d, lo: 0x80, hi: 0x80},
+	{value: 0x9900, lo: 0x82, hi: 0x82},
+	{value: 0xa000, lo: 0x86, hi: 0x86},
+	{value: 0x2e25, lo: 0x87, hi: 0x87},
+	{value: 0x2e2d, lo: 0x88, hi: 0x88},
+	{value: 0x3091, lo: 0x8a, hi: 0x8a},
+	{value: 0x2f19, lo: 0x8b, hi: 0x8b},
+	{value: 0x8105, lo: 0x8d, hi: 0x8d},
+	{value: 0x9900, lo: 0x95, hi: 0x96},
+	// Block 0x1d, offset 0xc8
+	{value: 0x0000, lo: 0x02},
+	{value: 0x8105, lo: 0xbb, hi: 0xbc},
+	{value: 0x9900, lo: 0xbe, hi: 0xbe},
+	// Block 0x1e, offset 0xcb
+	{value: 0x0000, lo: 0x06},
+	{value: 0xa000, lo: 0x86, hi: 0x87},
+	{value: 0x2e35, lo: 0x8a, hi: 0x8a},
+	{value: 0x2e45, lo: 0x8b, hi: 0x8b},
+	{value: 0x2e3d, lo: 0x8c, hi: 0x8c},
+	{value: 0x8105, lo: 0x8d, hi: 0x8d},
+	{value: 0x9900, lo: 0x97, hi: 0x97},
+	// Block 0x1f, offset 0xd2
+	{value: 0x6ab3, lo: 0x07},
+	{value: 0x9905, lo: 0x8a, hi: 0x8a},
+	{value: 0x9900, lo: 0x8f, hi: 0x8f},
+	{value: 0xa000, lo: 0x99, hi: 0x99},
+	{value: 0x4039, lo: 0x9a, hi: 0x9a},
+	{value: 0x3099, lo: 0x9c, hi: 0x9c},
+	{value: 0x2f24, lo: 0x9d, hi: 0x9d},
+	{value: 0x2e4d, lo: 0x9e, hi: 0x9f},
+	// Block 0x20, offset 0xda
+	{value: 0x0000, lo: 0x03},
+	{value: 0x2751, lo: 0xb3, hi: 0xb3},
+	{value: 0x8123, lo: 0xb8, hi: 0xb9},
+	{value: 0x8105, lo: 0xba, hi: 0xba},
+	// Block 0x21, offset 0xde
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8124, lo: 0x88, hi: 0x8b},
+	// Block 0x22, offset 0xe0
+	{value: 0x0000, lo: 0x03},
+	{value: 0x2766, lo: 0xb3, hi: 0xb3},
+	{value: 0x8125, lo: 0xb8, hi: 0xb9},
+	{value: 0x8105, lo: 0xba, hi: 0xba},
+	// Block 0x23, offset 0xe4
+	{value: 0x0000, lo: 0x03},
+	{value: 0x8126, lo: 0x88, hi: 0x8b},
+	{value: 0x2758, lo: 0x9c, hi: 0x9c},
+	{value: 0x275f, lo: 0x9d, hi: 0x9d},
+	// Block 0x24, offset 0xe8
+	{value: 0x0000, lo: 0x05},
+	{value: 0x03fe, lo: 0x8c, hi: 0x8c},
+	{value: 0x812e, lo: 0x98, hi: 0x99},
+	{value: 0x812e, lo: 0xb5, hi: 0xb5},
+	{value: 0x812e, lo: 0xb7, hi: 0xb7},
+	{value: 0x812c, lo: 0xb9, hi: 0xb9},
+	// Block 0x25, offset 0xee
+	{value: 0x0000, lo: 0x10},
+	{value: 0x2774, lo: 0x83, hi: 0x83},
+	{value: 0x277b, lo: 0x8d, hi: 0x8d},
+	{value: 0x2782, lo: 0x92, hi: 0x92},
+	{value: 0x2789, lo: 0x97, hi: 0x97},
+	{value: 0x2790, lo: 0x9c, hi: 0x9c},
+	{value: 0x276d, lo: 0xa9, hi: 0xa9},
+	{value: 0x8127, lo: 0xb1, hi: 0xb1},
+	{value: 0x8128, lo: 0xb2, hi: 0xb2},
+	{value: 0x4bc5, lo: 0xb3, hi: 0xb3},
+	{value: 0x8129, lo: 0xb4, hi: 0xb4},
+	{value: 0x4bce, lo: 0xb5, hi: 0xb5},
+	{value: 0x46f5, lo: 0xb6, hi: 0xb6},
+	{value: 0x4735, lo: 0xb7, hi: 0xb7},
+	{value: 0x46fd, lo: 0xb8, hi: 0xb8},
+	{value: 0x4740, lo: 0xb9, hi: 0xb9},
+	{value: 0x8128, lo: 0xba, hi: 0xbd},
+	// Block 0x26, offset 0xff
+	{value: 0x0000, lo: 0x0b},
+	{value: 0x8128, lo: 0x80, hi: 0x80},
+	{value: 0x4bd7, lo: 0x81, hi: 0x81},
+	{value: 0x8133, lo: 0x82, hi: 0x83},
+	{value: 0x8105, lo: 0x84, hi: 0x84},
+	{value: 0x8133, lo: 0x86, hi: 0x87},
+	{value: 0x279e, lo: 0x93, hi: 0x93},
+	{value: 0x27a5, lo: 0x9d, hi: 0x9d},
+	{value: 0x27ac, lo: 0xa2, hi: 0xa2},
+	{value: 0x27b3, lo: 0xa7, hi: 0xa7},
+	{value: 0x27ba, lo: 0xac, hi: 0xac},
+	{value: 0x2797, lo: 0xb9, hi: 0xb9},
+	// Block 0x27, offset 0x10b
+	{value: 0x0000, lo: 0x01},
+	{value: 0x812e, lo: 0x86, hi: 0x86},
+	// Block 0x28, offset 0x10d
+	{value: 0x0000, lo: 0x05},
+	{value: 0xa000, lo: 0xa5, hi: 0xa5},
+	{value: 0x2e55, lo: 0xa6, hi: 0xa6},
+	{value: 0x9900, lo: 0xae, hi: 0xae},
+	{value: 0x8103, lo: 0xb7, hi: 0xb7},
+	{value: 0x8105, lo: 0xb9, hi: 0xba},
+	// Block 0x29, offset 0x113
+	{value: 0x0000, lo: 0x01},
+	{value: 0x812e, lo: 0x8d, hi: 0x8d},
+	// Block 0x2a, offset 0x115
+	{value: 0x0000, lo: 0x01},
+	{value: 0x0402, lo: 0xbc, hi: 0xbc},
+	// Block 0x2b, offset 0x117
+	{value: 0x0000, lo: 0x01},
+	{value: 0xa000, lo: 0x80, hi: 0x92},
+	// Block 0x2c, offset 0x119
+	{value: 0x0000, lo: 0x01},
+	{value: 0xb900, lo: 0xa1, hi: 0xb5},
+	// Block 0x2d, offset 0x11b
+	{value: 0x0000, lo: 0x01},
+	{value: 0x9900, lo: 0xa8, hi: 0xbf},
+	// Block 0x2e, offset 0x11d
+	{value: 0x0000, lo: 0x01},
+	{value: 0x9900, lo: 0x80, hi: 0x82},
+	// Block 0x2f, offset 0x11f
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8133, lo: 0x9d, hi: 0x9f},
+	// Block 0x30, offset 0x121
+	{value: 0x0000, lo: 0x02},
+	{value: 0x8105, lo: 0x94, hi: 0x95},
+	{value: 0x8105, lo: 0xb4, hi: 0xb4},
+	// Block 0x31, offset 0x124
+	{value: 0x0000, lo: 0x02},
+	{value: 0x8105, lo: 0x92, hi: 0x92},
+	{value: 0x8133, lo: 0x9d, hi: 0x9d},
+	// Block 0x32, offset 0x127
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8132, lo: 0xa9, hi: 0xa9},
+	// Block 0x33, offset 0x129
+	{value: 0x0004, lo: 0x02},
+	{value: 0x812f, lo: 0xb9, hi: 0xba},
+	{value: 0x812e, lo: 0xbb, hi: 0xbb},
+	// Block 0x34, offset 0x12c
+	{value: 0x0000, lo: 0x02},
+	{value: 0x8133, lo: 0x97, hi: 0x97},
+	{value: 0x812e, lo: 0x98, hi: 0x98},
+	// Block 0x35, offset 0x12f
+	{value: 0x0000, lo: 0x03},
+	{value: 0x8105, lo: 0xa0, hi: 0xa0},
+	{value: 0x8133, lo: 0xb5, hi: 0xbc},
+	{value: 0x812e, lo: 0xbf, hi: 0xbf},
+	// Block 0x36, offset 0x133
+	{value: 0x0000, lo: 0x05},
+	{value: 0x8133, lo: 0xb0, hi: 0xb4},
+	{value: 0x812e, lo: 0xb5, hi: 0xba},
+	{value: 0x8133, lo: 0xbb, hi: 0xbc},
+	{value: 0x812e, lo: 0xbd, hi: 0xbd},
+	{value: 0x812e, lo: 0xbf, hi: 0xbf},
+	// Block 0x37, offset 0x139
+	{value: 0x0000, lo: 0x06},
+	{value: 0x812e, lo: 0x80, hi: 0x80},
+	{value: 0x8133, lo: 0x81, hi: 0x82},
+	{value: 0x812e, lo: 0x83, hi: 0x84},
+	{value: 0x8133, lo: 0x85, hi: 0x89},
+	{value: 0x812e, lo: 0x8a, hi: 0x8a},
+	{value: 0x8133, lo: 0x8b, hi: 0x8e},
+	// Block 0x38, offset 0x140
+	{value: 0x0000, lo: 0x08},
+	{value: 0x2e9d, lo: 0x80, hi: 0x80},
+	{value: 0x2ea5, lo: 0x81, hi: 0x81},
+	{value: 0xa000, lo: 0x82, hi: 0x82},
+	{value: 0x2ead, lo: 0x83, hi: 0x83},
+	{value: 0x8105, lo: 0x84, hi: 0x84},
+	{value: 0x8133, lo: 0xab, hi: 0xab},
+	{value: 0x812e, lo: 0xac, hi: 0xac},
+	{value: 0x8133, lo: 0xad, hi: 0xb3},
+	// Block 0x39, offset 0x149
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8105, lo: 0xaa, hi: 0xab},
+	// Block 0x3a, offset 0x14b
+	{value: 0x0000, lo: 0x02},
+	{value: 0x8103, lo: 0xa6, hi: 0xa6},
+	{value: 0x8105, lo: 0xb2, hi: 0xb3},
+	// Block 0x3b, offset 0x14e
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8103, lo: 0xb7, hi: 0xb7},
+	// Block 0x3c, offset 0x150
+	{value: 0x0000, lo: 0x0a},
+	{value: 0x8133, lo: 0x90, hi: 0x92},
+	{value: 0x8101, lo: 0x94, hi: 0x94},
+	{value: 0x812e, lo: 0x95, hi: 0x99},
+	{value: 0x8133, lo: 0x9a, hi: 0x9b},
+	{value: 0x812e, lo: 0x9c, hi: 0x9f},
+	{value: 0x8133, lo: 0xa0, hi: 0xa0},
+	{value: 0x8101, lo: 0xa2, hi: 0xa8},
+	{value: 0x812e, lo: 0xad, hi: 0xad},
+	{value: 0x8133, lo: 0xb4, hi: 0xb4},
+	{value: 0x8133, lo: 0xb8, hi: 0xb9},
+	// Block 0x3d, offset 0x15b
+	{value: 0x0002, lo: 0x0a},
+	{value: 0x0043, lo: 0xac, hi: 0xac},
+	{value: 0x00d1, lo: 0xad, hi: 0xad},
+	{value: 0x0045, lo: 0xae, hi: 0xae},
+	{value: 0x0049, lo: 0xb0, hi: 0xb1},
+	{value: 0x00ec, lo: 0xb2, hi: 0xb2},
+	{value: 0x004f, lo: 0xb3, hi: 0xba},
+	{value: 0x005f, lo: 0xbc, hi: 0xbc},
+	{value: 0x00fe, lo: 0xbd, hi: 0xbd},
+	{value: 0x0061, lo: 0xbe, hi: 0xbe},
+	{value: 0x0065, lo: 0xbf, hi: 0xbf},
+	// Block 0x3e, offset 0x166
+	{value: 0x0000, lo: 0x0d},
+	{value: 0x0001, lo: 0x80, hi: 0x8a},
+	{value: 0x0532, lo: 0x91, hi: 0x91},
+	{value: 0x43dc, lo: 0x97, hi: 0x97},
+	{value: 0x001d, lo: 0xa4, hi: 0xa4},
+	{value: 0x19a0, lo: 0xa5, hi: 0xa5},
+	{value: 0x1c8c, lo: 0xa6, hi: 0xa6},
+	{value: 0x0001, lo: 0xaf, hi: 0xaf},
+	{value: 0x27c1, lo: 0xb3, hi: 0xb3},
+	{value: 0x2935, lo: 0xb4, hi: 0xb4},
+	{value: 0x27c8, lo: 0xb6, hi: 0xb6},
+	{value: 0x293f, lo: 0xb7, hi: 0xb7},
+	{value: 0x199a, lo: 0xbc, hi: 0xbc},
+	{value: 0x43aa, lo: 0xbe, hi: 0xbe},
+	// Block 0x3f, offset 0x174
+	{value: 0x0002, lo: 0x0d},
+	{value: 0x1a60, lo: 0x87, hi: 0x87},
+	{value: 0x1a5d, lo: 0x88, hi: 0x88},
+	{value: 0x199d, lo: 0x89, hi: 0x89},
+	{value: 0x2ac5, lo: 0x97, hi: 0x97},
+	{value: 0x0001, lo: 0x9f, hi: 0x9f},
+	{value: 0x0021, lo: 0xb0, hi: 0xb0},
+	{value: 0x0093, lo: 0xb1, hi: 0xb1},
+	{value: 0x0029, lo: 0xb4, hi: 0xb9},
+	{value: 0x0017, lo: 0xba, hi: 0xba},
+	{value: 0x055e, lo: 0xbb, hi: 0xbb},
+	{value: 0x003b, lo: 0xbc, hi: 0xbc},
+	{value: 0x0011, lo: 0xbd, hi: 0xbe},
+	{value: 0x009d, lo: 0xbf, hi: 0xbf},
+	// Block 0x40, offset 0x182
+	{value: 0x0002, lo: 0x0f},
+	{value: 0x0021, lo: 0x80, hi: 0x89},
+	{value: 0x0017, lo: 0x8a, hi: 0x8a},
+	{value: 0x055e, lo: 0x8b, hi: 0x8b},
+	{value: 0x003b, lo: 0x8c, hi: 0x8c},
+	{value: 0x0011, lo: 0x8d, hi: 0x8e},
+	{value: 0x0083, lo: 0x90, hi: 0x90},
+	{value: 0x008b, lo: 0x91, hi: 0x91},
+	{value: 0x009f, lo: 0x92, hi: 0x92},
+	{value: 0x00b1, lo: 0x93, hi: 0x93},
+	{value: 0x011f, lo: 0x94, hi: 0x94},
+	{value: 0x0091, lo: 0x95, hi: 0x95},
+	{value: 0x0097, lo: 0x96, hi: 0x99},
+	{value: 0x00a1, lo: 0x9a, hi: 0x9a},
+	{value: 0x00a7, lo: 0x9b, hi: 0x9c},
+	{value: 0x1ac9, lo: 0xa8, hi: 0xa8},
+	// Block 0x41, offset 0x192
+	{value: 0x0000, lo: 0x0d},
+	{value: 0x8133, lo: 0x90, hi: 0x91},
+	{value: 0x8101, lo: 0x92, hi: 0x93},
+	{value: 0x8133, lo: 0x94, hi: 0x97},
+	{value: 0x8101, lo: 0x98, hi: 0x9a},
+	{value: 0x8133, lo: 0x9b, hi: 0x9c},
+	{value: 0x8133, lo: 0xa1, hi: 0xa1},
+	{value: 0x8101, lo: 0xa5, hi: 0xa6},
+	{value: 0x8133, lo: 0xa7, hi: 0xa7},
+	{value: 0x812e, lo: 0xa8, hi: 0xa8},
+	{value: 0x8133, lo: 0xa9, hi: 0xa9},
+	{value: 0x8101, lo: 0xaa, hi: 0xab},
+	{value: 0x812e, lo: 0xac, hi: 0xaf},
+	{value: 0x8133, lo: 0xb0, hi: 0xb0},
+	// Block 0x42, offset 0x1a0
+	{value: 0x0007, lo: 0x06},
+	{value: 0x22b0, lo: 0x89, hi: 0x89},
+	{value: 0xa000, lo: 0x90, hi: 0x90},
+	{value: 0xa000, lo: 0x92, hi: 0x92},
+	{value: 0xa000, lo: 0x94, hi: 0x94},
+	{value: 0x3cfa, lo: 0x9a, hi: 0x9b},
+	{value: 0x3d08, lo: 0xae, hi: 0xae},
+	// Block 0x43, offset 0x1a7
+	{value: 0x000e, lo: 0x05},
+	{value: 0x3d0f, lo: 0x8d, hi: 0x8e},
+	{value: 0x3d16, lo: 0x8f, hi: 0x8f},
+	{value: 0xa000, lo: 0x90, hi: 0x90},
+	{value: 0xa000, lo: 0x92, hi: 0x92},
+	{value: 0xa000, lo: 0x94, hi: 0x94},
+	// Block 0x44, offset 0x1ad
+	{value: 0x017a, lo: 0x0e},
+	{value: 0xa000, lo: 0x83, hi: 0x83},
+	{value: 0x3d24, lo: 0x84, hi: 0x84},
+	{value: 0xa000, lo: 0x88, hi: 0x88},
+	{value: 0x3d2b, lo: 0x89, hi: 0x89},
+	{value: 0xa000, lo: 0x8b, hi: 0x8b},
+	{value: 0x3d32, lo: 0x8c, hi: 0x8c},
+	{value: 0xa000, lo: 0xa3, hi: 0xa3},
+	{value: 0x3d39, lo: 0xa4, hi: 0xa4},
+	{value: 0xa000, lo: 0xa5, hi: 0xa5},
+	{value: 0x3d40, lo: 0xa6, hi: 0xa6},
+	{value: 0x27cf, lo: 0xac, hi: 0xad},
+	{value: 0x27d6, lo: 0xaf, hi: 0xaf},
+	{value: 0x2953, lo: 0xb0, hi: 0xb0},
+	{value: 0xa000, lo: 0xbc, hi: 0xbc},
+	// Block 0x45, offset 0x1bc
+	{value: 0x0007, lo: 0x03},
+	{value: 0x3da9, lo: 0xa0, hi: 0xa1},
+	{value: 0x3dd3, lo: 0xa2, hi: 0xa3},
+	{value: 0x3dfd, lo: 0xaa, hi: 0xad},
+	// Block 0x46, offset 0x1c0
+	{value: 0x0004, lo: 0x01},
+	{value: 0x0586, lo: 0xa9, hi: 0xaa},
+	// Block 0x47, offset 0x1c2
+	{value: 0x0002, lo: 0x03},
+	{value: 0x0057, lo: 0x80, hi: 0x8f},
+	{value: 0x0083, lo: 0x90, hi: 0xa9},
+	{value: 0x0021, lo: 0xaa, hi: 0xaa},
+	// Block 0x48, offset 0x1c6
+	{value: 0x0000, lo: 0x01},
+	{value: 0x2ad2, lo: 0x8c, hi: 0x8c},
+	// Block 0x49, offset 0x1c8
+	{value: 0x0266, lo: 0x02},
+	{value: 0x1cbc, lo: 0xb4, hi: 0xb4},
+	{value: 0x1a5a, lo: 0xb5, hi: 0xb6},
+	// Block 0x4a, offset 0x1cb
+	{value: 0x0000, lo: 0x01},
+	{value: 0x461e, lo: 0x9c, hi: 0x9c},
+	// Block 0x4b, offset 0x1cd
+	{value: 0x0000, lo: 0x02},
+	{value: 0x0095, lo: 0xbc, hi: 0xbc},
+	{value: 0x006d, lo: 0xbd, hi: 0xbd},
+	// Block 0x4c, offset 0x1d0
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8133, lo: 0xaf, hi: 0xb1},
+	// Block 0x4d, offset 0x1d2
+	{value: 0x0000, lo: 0x02},
+	{value: 0x057a, lo: 0xaf, hi: 0xaf},
+	{value: 0x8105, lo: 0xbf, hi: 0xbf},
+	// Block 0x4e, offset 0x1d5
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8133, lo: 0xa0, hi: 0xbf},
+	// Block 0x4f, offset 0x1d7
+	{value: 0x0000, lo: 0x01},
+	{value: 0x0ebe, lo: 0x9f, hi: 0x9f},
+	// Block 0x50, offset 0x1d9
+	{value: 0x0000, lo: 0x01},
+	{value: 0x172a, lo: 0xb3, hi: 0xb3},
+	// Block 0x51, offset 0x1db
+	{value: 0x0004, lo: 0x0b},
+	{value: 0x1692, lo: 0x80, hi: 0x82},
+	{value: 0x16aa, lo: 0x83, hi: 0x83},
+	{value: 0x16c2, lo: 0x84, hi: 0x85},
+	{value: 0x16d2, lo: 0x86, hi: 0x89},
+	{value: 0x16e6, lo: 0x8a, hi: 0x8c},
+	{value: 0x16fa, lo: 0x8d, hi: 0x8d},
+	{value: 0x1702, lo: 0x8e, hi: 0x8e},
+	{value: 0x170a, lo: 0x8f, hi: 0x90},
+	{value: 0x1716, lo: 0x91, hi: 0x93},
+	{value: 0x1726, lo: 0x94, hi: 0x94},
+	{value: 0x172e, lo: 0x95, hi: 0x95},
+	// Block 0x52, offset 0x1e7
+	{value: 0x0004, lo: 0x09},
+	{value: 0x0001, lo: 0x80, hi: 0x80},
+	{value: 0x812d, lo: 0xaa, hi: 0xaa},
+	{value: 0x8132, lo: 0xab, hi: 0xab},
+	{value: 0x8134, lo: 0xac, hi: 0xac},
+	{value: 0x812f, lo: 0xad, hi: 0xad},
+	{value: 0x8130, lo: 0xae, hi: 0xae},
+	{value: 0x8130, lo: 0xaf, hi: 0xaf},
+	{value: 0x05ae, lo: 0xb6, hi: 0xb6},
+	{value: 0x0982, lo: 0xb8, hi: 0xba},
+	// Block 0x53, offset 0x1f1
+	{value: 0x0006, lo: 0x09},
+	{value: 0x0406, lo: 0xb1, hi: 0xb1},
+	{value: 0x040a, lo: 0xb2, hi: 0xb2},
+	{value: 0x4b7c, lo: 0xb3, hi: 0xb3},
+	{value: 0x040e, lo: 0xb4, hi: 0xb4},
+	{value: 0x4b82, lo: 0xb5, hi: 0xb6},
+	{value: 0x0412, lo: 0xb7, hi: 0xb7},
+	{value: 0x0416, lo: 0xb8, hi: 0xb8},
+	{value: 0x041a, lo: 0xb9, hi: 0xb9},
+	{value: 0x4b8e, lo: 0xba, hi: 0xbf},
+	// Block 0x54, offset 0x1fb
+	{value: 0x0000, lo: 0x02},
+	{value: 0x8133, lo: 0xaf, hi: 0xaf},
+	{value: 0x8133, lo: 0xb4, hi: 0xbd},
+	// Block 0x55, offset 0x1fe
+	{value: 0x0000, lo: 0x03},
+	{value: 0x02d8, lo: 0x9c, hi: 0x9c},
+	{value: 0x02de, lo: 0x9d, hi: 0x9d},
+	{value: 0x8133, lo: 0x9e, hi: 0x9f},
+	// Block 0x56, offset 0x202
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8133, lo: 0xb0, hi: 0xb1},
+	// Block 0x57, offset 0x204
+	{value: 0x0000, lo: 0x01},
+	{value: 0x173e, lo: 0xb0, hi: 0xb0},
+	// Block 0x58, offset 0x206
+	{value: 0x0006, lo: 0x04},
+	{value: 0x0047, lo: 0xb2, hi: 0xb3},
+	{value: 0x0063, lo: 0xb4, hi: 0xb4},
+	{value: 0x00dd, lo: 0xb8, hi: 0xb8},
+	{value: 0x00e9, lo: 0xb9, hi: 0xb9},
+	// Block 0x59, offset 0x20b
+	{value: 0x0000, lo: 0x02},
+	{value: 0x8105, lo: 0x86, hi: 0x86},
+	{value: 0x8105, lo: 0xac, hi: 0xac},
+	// Block 0x5a, offset 0x20e
+	{value: 0x0000, lo: 0x02},
+	{value: 0x8105, lo: 0x84, hi: 0x84},
+	{value: 0x8133, lo: 0xa0, hi: 0xb1},
+	// Block 0x5b, offset 0x211
+	{value: 0x0000, lo: 0x01},
+	{value: 0x812e, lo: 0xab, hi: 0xad},
+	// Block 0x5c, offset 0x213
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8105, lo: 0x93, hi: 0x93},
+	// Block 0x5d, offset 0x215
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8103, lo: 0xb3, hi: 0xb3},
+	// Block 0x5e, offset 0x217
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8105, lo: 0x80, hi: 0x80},
+	// Block 0x5f, offset 0x219
+	{value: 0x0000, lo: 0x05},
+	{value: 0x8133, lo: 0xb0, hi: 0xb0},
+	{value: 0x8133, lo: 0xb2, hi: 0xb3},
+	{value: 0x812e, lo: 0xb4, hi: 0xb4},
+	{value: 0x8133, lo: 0xb7, hi: 0xb8},
+	{value: 0x8133, lo: 0xbe, hi: 0xbf},
+	// Block 0x60, offset 0x21f
+	{value: 0x0000, lo: 0x02},
+	{value: 0x8133, lo: 0x81, hi: 0x81},
+	{value: 0x8105, lo: 0xb6, hi: 0xb6},
+	// Block 0x61, offset 0x222
+	{value: 0x000c, lo: 0x04},
+	{value: 0x173a, lo: 0x9c, hi: 0x9d},
+	{value: 0x014f, lo: 0x9e, hi: 0x9e},
+	{value: 0x174a, lo: 0x9f, hi: 0x9f},
+	{value: 0x01a6, lo: 0xa9, hi: 0xa9},
+	// Block 0x62, offset 0x227
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8105, lo: 0xad, hi: 0xad},
+	// Block 0x63, offset 0x229
+	{value: 0x0000, lo: 0x06},
+	{value: 0xe500, lo: 0x80, hi: 0x80},
+	{value: 0xc600, lo: 0x81, hi: 0x9b},
+	{value: 0xe500, lo: 0x9c, hi: 0x9c},
+	{value: 0xc600, lo: 0x9d, hi: 0xb7},
+	{value: 0xe500, lo: 0xb8, hi: 0xb8},
+	{value: 0xc600, lo: 0xb9, hi: 0xbf},
+	// Block 0x64, offset 0x230
+	{value: 0x0000, lo: 0x05},
+	{value: 0xc600, lo: 0x80, hi: 0x93},
+	{value: 0xe500, lo: 0x94, hi: 0x94},
+	{value: 0xc600, lo: 0x95, hi: 0xaf},
+	{value: 0xe500, lo: 0xb0, hi: 0xb0},
+	{value: 0xc600, lo: 0xb1, hi: 0xbf},
+	// Block 0x65, offset 0x236
+	{value: 0x0000, lo: 0x05},
+	{value: 0xc600, lo: 0x80, hi: 0x8b},
+	{value: 0xe500, lo: 0x8c, hi: 0x8c},
+	{value: 0xc600, lo: 0x8d, hi: 0xa7},
+	{value: 0xe500, lo: 0xa8, hi: 0xa8},
+	{value: 0xc600, lo: 0xa9, hi: 0xbf},
+	// Block 0x66, offset 0x23c
+	{value: 0x0000, lo: 0x07},
+	{value: 0xc600, lo: 0x80, hi: 0x83},
+	{value: 0xe500, lo: 0x84, hi: 0x84},
+	{value: 0xc600, lo: 0x85, hi: 0x9f},
+	{value: 0xe500, lo: 0xa0, hi: 0xa0},
+	{value: 0xc600, lo: 0xa1, hi: 0xbb},
+	{value: 0xe500, lo: 0xbc, hi: 0xbc},
+	{value: 0xc600, lo: 0xbd, hi: 0xbf},
+	// Block 0x67, offset 0x244
+	{value: 0x0000, lo: 0x05},
+	{value: 0xc600, lo: 0x80, hi: 0x97},
+	{value: 0xe500, lo: 0x98, hi: 0x98},
+	{value: 0xc600, lo: 0x99, hi: 0xb3},
+	{value: 0xe500, lo: 0xb4, hi: 0xb4},
+	{value: 0xc600, lo: 0xb5, hi: 0xbf},
+	// Block 0x68, offset 0x24a
+	{value: 0x0000, lo: 0x05},
+	{value: 0xc600, lo: 0x80, hi: 0x8f},
+	{value: 0xe500, lo: 0x90, hi: 0x90},
+	{value: 0xc600, lo: 0x91, hi: 0xab},
+	{value: 0xe500, lo: 0xac, hi: 0xac},
+	{value: 0xc600, lo: 0xad, hi: 0xbf},
+	// Block 0x69, offset 0x250
+	{value: 0x0000, lo: 0x05},
+	{value: 0xc600, lo: 0x80, hi: 0x87},
+	{value: 0xe500, lo: 0x88, hi: 0x88},
+	{value: 0xc600, lo: 0x89, hi: 0xa3},
+	{value: 0xe500, lo: 0xa4, hi: 0xa4},
+	{value: 0xc600, lo: 0xa5, hi: 0xbf},
+	// Block 0x6a, offset 0x256
+	{value: 0x0000, lo: 0x03},
+	{value: 0xc600, lo: 0x80, hi: 0x87},
+	{value: 0xe500, lo: 0x88, hi: 0x88},
+	{value: 0xc600, lo: 0x89, hi: 0xa3},
+	// Block 0x6b, offset 0x25a
+	{value: 0x0002, lo: 0x01},
+	{value: 0x0003, lo: 0x81, hi: 0xbf},
+	// Block 0x6c, offset 0x25c
+	{value: 0x0000, lo: 0x01},
+	{value: 0x812e, lo: 0xbd, hi: 0xbd},
+	// Block 0x6d, offset 0x25e
+	{value: 0x0000, lo: 0x01},
+	{value: 0x812e, lo: 0xa0, hi: 0xa0},
+	// Block 0x6e, offset 0x260
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8133, lo: 0xb6, hi: 0xba},
+	// Block 0x6f, offset 0x262
+	{value: 0x002d, lo: 0x05},
+	{value: 0x812e, lo: 0x8d, hi: 0x8d},
+	{value: 0x8133, lo: 0x8f, hi: 0x8f},
+	{value: 0x8133, lo: 0xb8, hi: 0xb8},
+	{value: 0x8101, lo: 0xb9, hi: 0xba},
+	{value: 0x8105, lo: 0xbf, hi: 0xbf},
+	// Block 0x70, offset 0x268
+	{value: 0x0000, lo: 0x02},
+	{value: 0x8133, lo: 0xa5, hi: 0xa5},
+	{value: 0x812e, lo: 0xa6, hi: 0xa6},
+	// Block 0x71, offset 0x26b
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8133, lo: 0xa4, hi: 0xa7},
+	// Block 0x72, offset 0x26d
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8133, lo: 0xab, hi: 0xac},
+	// Block 0x73, offset 0x26f
+	{value: 0x0000, lo: 0x01},
+	{value: 0x812e, lo: 0xbd, hi: 0xbf},
+	// Block 0x74, offset 0x271
+	{value: 0x0000, lo: 0x05},
+	{value: 0x812e, lo: 0x86, hi: 0x87},
+	{value: 0x8133, lo: 0x88, hi: 0x8a},
+	{value: 0x812e, lo: 0x8b, hi: 0x8b},
+	{value: 0x8133, lo: 0x8c, hi: 0x8c},
+	{value: 0x812e, lo: 0x8d, hi: 0x90},
+	// Block 0x75, offset 0x277
+	{value: 0x0005, lo: 0x03},
+	{value: 0x8133, lo: 0x82, hi: 0x82},
+	{value: 0x812e, lo: 0x83, hi: 0x84},
+	{value: 0x812e, lo: 0x85, hi: 0x85},
+	// Block 0x76, offset 0x27b
+	{value: 0x0000, lo: 0x03},
+	{value: 0x8105, lo: 0x86, hi: 0x86},
+	{value: 0x8105, lo: 0xb0, hi: 0xb0},
+	{value: 0x8105, lo: 0xbf, hi: 0xbf},
+	// Block 0x77, offset 0x27f
+	{value: 0x17fe, lo: 0x07},
+	{value: 0xa000, lo: 0x99, hi: 0x99},
+	{value: 0x4379, lo: 0x9a, hi: 0x9a},
+	{value: 0xa000, lo: 0x9b, hi: 0x9b},
+	{value: 0x4383, lo: 0x9c, hi: 0x9c},
+	{value: 0xa000, lo: 0xa5, hi: 0xa5},
+	{value: 0x438d, lo: 0xab, hi: 0xab},
+	{value: 0x8105, lo: 0xb9, hi: 0xba},
+	// Block 0x78, offset 0x287
+	{value: 0x0000, lo: 0x06},
+	{value: 0x8133, lo: 0x80, hi: 0x82},
+	{value: 0x9900, lo: 0xa7, hi: 0xa7},
+	{value: 0x2eb5, lo: 0xae, hi: 0xae},
+	{value: 0x2ebf, lo: 0xaf, hi: 0xaf},
+	{value: 0xa000, lo: 0xb1, hi: 0xb2},
+	{value: 0x8105, lo: 0xb3, hi: 0xb4},
+	// Block 0x79, offset 0x28e
+	{value: 0x0000, lo: 0x02},
+	{value: 0x8105, lo: 0x80, hi: 0x80},
+	{value: 0x8103, lo: 0x8a, hi: 0x8a},
+	// Block 0x7a, offset 0x291
+	{value: 0x0000, lo: 0x02},
+	{value: 0x8105, lo: 0xb5, hi: 0xb5},
+	{value: 0x8103, lo: 0xb6, hi: 0xb6},
+	// Block 0x7b, offset 0x294
+	{value: 0x0002, lo: 0x01},
+	{value: 0x8103, lo: 0xa9, hi: 0xaa},
+	// Block 0x7c, offset 0x296
+	{value: 0x0000, lo: 0x02},
+	{value: 0x8103, lo: 0xbb, hi: 0xbc},
+	{value: 0x9900, lo: 0xbe, hi: 0xbe},
+	// Block 0x7d, offset 0x299
+	{value: 0x0000, lo: 0x07},
+	{value: 0xa000, lo: 0x87, hi: 0x87},
+	{value: 0x2ec9, lo: 0x8b, hi: 0x8b},
+	{value: 0x2ed3, lo: 0x8c, hi: 0x8c},
+	{value: 0x8105, lo: 0x8d, hi: 0x8d},
+	{value: 0x9900, lo: 0x97, hi: 0x97},
+	{value: 0x8133, lo: 0xa6, hi: 0xac},
+	{value: 0x8133, lo: 0xb0, hi: 0xb4},
+	// Block 0x7e, offset 0x2a1
+	{value: 0x0000, lo: 0x03},
+	{value: 0x8105, lo: 0x82, hi: 0x82},
+	{value: 0x8103, lo: 0x86, hi: 0x86},
+	{value: 0x8133, lo: 0x9e, hi: 0x9e},
+	// Block 0x7f, offset 0x2a5
+	{value: 0x6a23, lo: 0x06},
+	{value: 0x9900, lo: 0xb0, hi: 0xb0},
+	{value: 0xa000, lo: 0xb9, hi: 0xb9},
+	{value: 0x9900, lo: 0xba, hi: 0xba},
+	{value: 0x2ee7, lo: 0xbb, hi: 0xbb},
+	{value: 0x2edd, lo: 0xbc, hi: 0xbd},
+	{value: 0x2ef1, lo: 0xbe, hi: 0xbe},
+	// Block 0x80, offset 0x2ac
+	{value: 0x0000, lo: 0x02},
+	{value: 0x8105, lo: 0x82, hi: 0x82},
+	{value: 0x8103, lo: 0x83, hi: 0x83},
+	// Block 0x81, offset 0x2af
+	{value: 0x0000, lo: 0x05},
+	{value: 0x9900, lo: 0xaf, hi: 0xaf},
+	{value: 0xa000, lo: 0xb8, hi: 0xb9},
+	{value: 0x2efb, lo: 0xba, hi: 0xba},
+	{value: 0x2f05, lo: 0xbb, hi: 0xbb},
+	{value: 0x8105, lo: 0xbf, hi: 0xbf},
+	// Block 0x82, offset 0x2b5
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8103, lo: 0x80, hi: 0x80},
+	// Block 0x83, offset 0x2b7
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8105, lo: 0xbf, hi: 0xbf},
+	// Block 0x84, offset 0x2b9
+	{value: 0x0000, lo: 0x02},
+	{value: 0x8105, lo: 0xb6, hi: 0xb6},
+	{value: 0x8103, lo: 0xb7, hi: 0xb7},
+	// Block 0x85, offset 0x2bc
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8105, lo: 0xab, hi: 0xab},
+	// Block 0x86, offset 0x2be
+	{value: 0x0000, lo: 0x02},
+	{value: 0x8105, lo: 0xb9, hi: 0xb9},
+	{value: 0x8103, lo: 0xba, hi: 0xba},
+	// Block 0x87, offset 0x2c1
+	{value: 0x0000, lo: 0x04},
+	{value: 0x9900, lo: 0xb0, hi: 0xb0},
+	{value: 0xa000, lo: 0xb5, hi: 0xb5},
+	{value: 0x2f0f, lo: 0xb8, hi: 0xb8},
+	{value: 0x8105, lo: 0xbd, hi: 0xbe},
+	// Block 0x88, offset 0x2c6
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8103, lo: 0x83, hi: 0x83},
+	// Block 0x89, offset 0x2c8
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8105, lo: 0xa0, hi: 0xa0},
+	// Block 0x8a, offset 0x2ca
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8105, lo: 0xb4, hi: 0xb4},
+	// Block 0x8b, offset 0x2cc
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8105, lo: 0x87, hi: 0x87},
+	// Block 0x8c, offset 0x2ce
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8105, lo: 0x99, hi: 0x99},
+	// Block 0x8d, offset 0x2d0
+	{value: 0x0000, lo: 0x02},
+	{value: 0x8103, lo: 0x82, hi: 0x82},
+	{value: 0x8105, lo: 0x84, hi: 0x85},
+	// Block 0x8e, offset 0x2d3
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8105, lo: 0x97, hi: 0x97},
+	// Block 0x8f, offset 0x2d5
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8105, lo: 0x81, hi: 0x82},
+	// Block 0x90, offset 0x2d7
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8101, lo: 0xb0, hi: 0xb4},
+	// Block 0x91, offset 0x2d9
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8133, lo: 0xb0, hi: 0xb6},
+	// Block 0x92, offset 0x2db
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8102, lo: 0xb0, hi: 0xb1},
+	// Block 0x93, offset 0x2dd
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8101, lo: 0x9e, hi: 0x9e},
+	// Block 0x94, offset 0x2df
+	{value: 0x0000, lo: 0x0c},
+	{value: 0x470d, lo: 0x9e, hi: 0x9e},
+	{value: 0x4717, lo: 0x9f, hi: 0x9f},
+	{value: 0x474b, lo: 0xa0, hi: 0xa0},
+	{value: 0x4759, lo: 0xa1, hi: 0xa1},
+	{value: 0x4767, lo: 0xa2, hi: 0xa2},
+	{value: 0x4775, lo: 0xa3, hi: 0xa3},
+	{value: 0x4783, lo: 0xa4, hi: 0xa4},
+	{value: 0x812c, lo: 0xa5, hi: 0xa6},
+	{value: 0x8101, lo: 0xa7, hi: 0xa9},
+	{value: 0x8131, lo: 0xad, hi: 0xad},
+	{value: 0x812c, lo: 0xae, hi: 0xb2},
+	{value: 0x812e, lo: 0xbb, hi: 0xbf},
+	// Block 0x95, offset 0x2ec
+	{value: 0x0000, lo: 0x09},
+	{value: 0x812e, lo: 0x80, hi: 0x82},
+	{value: 0x8133, lo: 0x85, hi: 0x89},
+	{value: 0x812e, lo: 0x8a, hi: 0x8b},
+	{value: 0x8133, lo: 0xaa, hi: 0xad},
+	{value: 0x4721, lo: 0xbb, hi: 0xbb},
+	{value: 0x472b, lo: 0xbc, hi: 0xbc},
+	{value: 0x4791, lo: 0xbd, hi: 0xbd},
+	{value: 0x47ad, lo: 0xbe, hi: 0xbe},
+	{value: 0x479f, lo: 0xbf, hi: 0xbf},
+	// Block 0x96, offset 0x2f6
+	{value: 0x0000, lo: 0x01},
+	{value: 0x47bb, lo: 0x80, hi: 0x80},
+	// Block 0x97, offset 0x2f8
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8133, lo: 0x82, hi: 0x84},
+	// Block 0x98, offset 0x2fa
+	{value: 0x0002, lo: 0x03},
+	{value: 0x0043, lo: 0x80, hi: 0x99},
+	{value: 0x0083, lo: 0x9a, hi: 0xb3},
+	{value: 0x0043, lo: 0xb4, hi: 0xbf},
+	// Block 0x99, offset 0x2fe
+	{value: 0x0002, lo: 0x04},
+	{value: 0x005b, lo: 0x80, hi: 0x8d},
+	{value: 0x0083, lo: 0x8e, hi: 0x94},
+	{value: 0x0093, lo: 0x96, hi: 0xa7},
+	{value: 0x0043, lo: 0xa8, hi: 0xbf},
+	// Block 0x9a, offset 0x303
+	{value: 0x0002, lo: 0x0b},
+	{value: 0x0073, lo: 0x80, hi: 0x81},
+	{value: 0x0083, lo: 0x82, hi: 0x9b},
+	{value: 0x0043, lo: 0x9c, hi: 0x9c},
+	{value: 0x0047, lo: 0x9e, hi: 0x9f},
+	{value: 0x004f, lo: 0xa2, hi: 0xa2},
+	{value: 0x0055, lo: 0xa5, hi: 0xa6},
+	{value: 0x005d, lo: 0xa9, hi: 0xac},
+	{value: 0x0067, lo: 0xae, hi: 0xb5},
+	{value: 0x0083, lo: 0xb6, hi: 0xb9},
+	{value: 0x008d, lo: 0xbb, hi: 0xbb},
+	{value: 0x0091, lo: 0xbd, hi: 0xbf},
+	// Block 0x9b, offset 0x30f
+	{value: 0x0002, lo: 0x04},
+	{value: 0x0097, lo: 0x80, hi: 0x83},
+	{value: 0x00a1, lo: 0x85, hi: 0x8f},
+	{value: 0x0043, lo: 0x90, hi: 0xa9},
+	{value: 0x0083, lo: 0xaa, hi: 0xbf},
+	// Block 0x9c, offset 0x314
+	{value: 0x0002, lo: 0x08},
+	{value: 0x00af, lo: 0x80, hi: 0x83},
+	{value: 0x0043, lo: 0x84, hi: 0x85},
+	{value: 0x0049, lo: 0x87, hi: 0x8a},
+	{value: 0x0055, lo: 0x8d, hi: 0x94},
+	{value: 0x0067, lo: 0x96, hi: 0x9c},
+	{value: 0x0083, lo: 0x9e, hi: 0xb7},
+	{value: 0x0043, lo: 0xb8, hi: 0xb9},
+	{value: 0x0049, lo: 0xbb, hi: 0xbe},
+	// Block 0x9d, offset 0x31d
+	{value: 0x0002, lo: 0x05},
+	{value: 0x0053, lo: 0x80, hi: 0x84},
+	{value: 0x005f, lo: 0x86, hi: 0x86},
+	{value: 0x0067, lo: 0x8a, hi: 0x90},
+	{value: 0x0083, lo: 0x92, hi: 0xab},
+	{value: 0x0043, lo: 0xac, hi: 0xbf},
+	// Block 0x9e, offset 0x323
+	{value: 0x0002, lo: 0x04},
+	{value: 0x006b, lo: 0x80, hi: 0x85},
+	{value: 0x0083, lo: 0x86, hi: 0x9f},
+	{value: 0x0043, lo: 0xa0, hi: 0xb9},
+	{value: 0x0083, lo: 0xba, hi: 0xbf},
+	// Block 0x9f, offset 0x328
+	{value: 0x0002, lo: 0x03},
+	{value: 0x008f, lo: 0x80, hi: 0x93},
+	{value: 0x0043, lo: 0x94, hi: 0xad},
+	{value: 0x0083, lo: 0xae, hi: 0xbf},
+	// Block 0xa0, offset 0x32c
+	{value: 0x0002, lo: 0x04},
+	{value: 0x00a7, lo: 0x80, hi: 0x87},
+	{value: 0x0043, lo: 0x88, hi: 0xa1},
+	{value: 0x0083, lo: 0xa2, hi: 0xbb},
+	{value: 0x0043, lo: 0xbc, hi: 0xbf},
+	// Block 0xa1, offset 0x331
+	{value: 0x0002, lo: 0x03},
+	{value: 0x004b, lo: 0x80, hi: 0x95},
+	{value: 0x0083, lo: 0x96, hi: 0xaf},
+	{value: 0x0043, lo: 0xb0, hi: 0xbf},
+	// Block 0xa2, offset 0x335
+	{value: 0x0003, lo: 0x0f},
+	{value: 0x023c, lo: 0x80, hi: 0x80},
+	{value: 0x0556, lo: 0x81, hi: 0x81},
+	{value: 0x023f, lo: 0x82, hi: 0x9a},
+	{value: 0x0552, lo: 0x9b, hi: 0x9b},
+	{value: 0x024b, lo: 0x9c, hi: 0x9c},
+	{value: 0x0254, lo: 0x9d, hi: 0x9d},
+	{value: 0x025a, lo: 0x9e, hi: 0x9e},
+	{value: 0x027e, lo: 0x9f, hi: 0x9f},
+	{value: 0x026f, lo: 0xa0, hi: 0xa0},
+	{value: 0x026c, lo: 0xa1, hi: 0xa1},
+	{value: 0x01f7, lo: 0xa2, hi: 0xb2},
+	{value: 0x020c, lo: 0xb3, hi: 0xb3},
+	{value: 0x022a, lo: 0xb4, hi: 0xba},
+	{value: 0x0556, lo: 0xbb, hi: 0xbb},
+	{value: 0x023f, lo: 0xbc, hi: 0xbf},
+	// Block 0xa3, offset 0x345
+	{value: 0x0003, lo: 0x0d},
+	{value: 0x024b, lo: 0x80, hi: 0x94},
+	{value: 0x0552, lo: 0x95, hi: 0x95},
+	{value: 0x024b, lo: 0x96, hi: 0x96},
+	{value: 0x0254, lo: 0x97, hi: 0x97},
+	{value: 0x025a, lo: 0x98, hi: 0x98},
+	{value: 0x027e, lo: 0x99, hi: 0x99},
+	{value: 0x026f, lo: 0x9a, hi: 0x9a},
+	{value: 0x026c, lo: 0x9b, hi: 0x9b},
+	{value: 0x01f7, lo: 0x9c, hi: 0xac},
+	{value: 0x020c, lo: 0xad, hi: 0xad},
+	{value: 0x022a, lo: 0xae, hi: 0xb4},
+	{value: 0x0556, lo: 0xb5, hi: 0xb5},
+	{value: 0x023f, lo: 0xb6, hi: 0xbf},
+	// Block 0xa4, offset 0x353
+	{value: 0x0003, lo: 0x0d},
+	{value: 0x025d, lo: 0x80, hi: 0x8e},
+	{value: 0x0552, lo: 0x8f, hi: 0x8f},
+	{value: 0x024b, lo: 0x90, hi: 0x90},
+	{value: 0x0254, lo: 0x91, hi: 0x91},
+	{value: 0x025a, lo: 0x92, hi: 0x92},
+	{value: 0x027e, lo: 0x93, hi: 0x93},
+	{value: 0x026f, lo: 0x94, hi: 0x94},
+	{value: 0x026c, lo: 0x95, hi: 0x95},
+	{value: 0x01f7, lo: 0x96, hi: 0xa6},
+	{value: 0x020c, lo: 0xa7, hi: 0xa7},
+	{value: 0x022a, lo: 0xa8, hi: 0xae},
+	{value: 0x0556, lo: 0xaf, hi: 0xaf},
+	{value: 0x023f, lo: 0xb0, hi: 0xbf},
+	// Block 0xa5, offset 0x361
+	{value: 0x0003, lo: 0x0d},
+	{value: 0x026f, lo: 0x80, hi: 0x88},
+	{value: 0x0552, lo: 0x89, hi: 0x89},
+	{value: 0x024b, lo: 0x8a, hi: 0x8a},
+	{value: 0x0254, lo: 0x8b, hi: 0x8b},
+	{value: 0x025a, lo: 0x8c, hi: 0x8c},
+	{value: 0x027e, lo: 0x8d, hi: 0x8d},
+	{value: 0x026f, lo: 0x8e, hi: 0x8e},
+	{value: 0x026c, lo: 0x8f, hi: 0x8f},
+	{value: 0x01f7, lo: 0x90, hi: 0xa0},
+	{value: 0x020c, lo: 0xa1, hi: 0xa1},
+	{value: 0x022a, lo: 0xa2, hi: 0xa8},
+	{value: 0x0556, lo: 0xa9, hi: 0xa9},
+	{value: 0x023f, lo: 0xaa, hi: 0xbf},
+	// Block 0xa6, offset 0x36f
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8133, lo: 0x8f, hi: 0x8f},
+	// Block 0xa7, offset 0x371
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8133, lo: 0xae, hi: 0xae},
+	// Block 0xa8, offset 0x373
+	{value: 0x0000, lo: 0x01},
+	{value: 0x8133, lo: 0xac, hi: 0xaf},
+	// Block 0xa9, offset 0x375
+	{value: 0x0000, lo: 0x03},
+	{value: 0x8134, lo: 0xac, hi: 0xad},
+	{value: 0x812e, lo: 0xae, hi: 0xae},
+	{value: 0x8133, lo: 0xaf, hi: 0xaf},
+	// Block 0xaa, offset 0x379
+	{value: 0x0000, lo: 0x01},
+	{value: 0x812e, lo: 0x90, hi: 0x96},
+	// Block 0xab, offset 0x37b
+	{value: 0x0000, lo: 0x02},
+	{value: 0x8133, lo: 0x84, hi: 0x89},
+	{value: 0x8103, lo: 0x8a, hi: 0x8a},
+	// Block 0xac, offset 0x37e
+	{value: 0x0002, lo: 0x0a},
+	{value: 0x0063, lo: 0x80, hi: 0x89},
+	{value: 0x1a7e, lo: 0x8a, hi: 0x8a},
+	{value: 0x1ab1, lo: 0x8b, hi: 0x8b},
+	{value: 0x1acc, lo: 0x8c, hi: 0x8c},
+	{value: 0x1ad2, lo: 0x8d, hi: 0x8d},
+	{value: 0x1cf0, lo: 0x8e, hi: 0x8e},
+	{value: 0x1ade, lo: 0x8f, hi: 0x8f},
+	{value: 0x1aa8, lo: 0xaa, hi: 0xaa},
+	{value: 0x1aab, lo: 0xab, hi: 0xab},
+	{value: 0x1aae, lo: 0xac, hi: 0xac},
+	// Block 0xad, offset 0x389
+	{value: 0x0000, lo: 0x01},
+	{value: 0x1a6c, lo: 0x90, hi: 0x90},
+	// Block 0xae, offset 0x38b
+	{value: 0x0028, lo: 0x09},
+	{value: 0x2999, lo: 0x80, hi: 0x80},
+	{value: 0x295d, lo: 0x81, hi: 0x81},
+	{value: 0x2967, lo: 0x82, hi: 0x82},
+	{value: 0x297b, lo: 0x83, hi: 0x84},
+	{value: 0x2985, lo: 0x85, hi: 0x86},
+	{value: 0x2971, lo: 0x87, hi: 0x87},
+	{value: 0x298f, lo: 0x88, hi: 0x88},
+	{value: 0x0c6a, lo: 0x90, hi: 0x90},
+	{value: 0x09e2, lo: 0x91, hi: 0x91},
+	// Block 0xaf, offset 0x395
+	{value: 0x0002, lo: 0x01},
+	{value: 0x0021, lo: 0xb0, hi: 0xb9},
+}
+
+// recompMap: 7528 bytes (entries only)
+var recompMap map[uint32]rune
+var recompMapOnce sync.Once
+
+const recompMapPacked = "" +
+	"\x00A\x03\x00\x00\x00\x00\xc0" + // 0x00410300: 0x000000C0
+	"\x00A\x03\x01\x00\x00\x00\xc1" + // 0x00410301: 0x000000C1
+	"\x00A\x03\x02\x00\x00\x00\xc2" + // 0x00410302: 0x000000C2
+	"\x00A\x03\x03\x00\x00\x00\xc3" + // 0x00410303: 0x000000C3
+	"\x00A\x03\b\x00\x00\x00\xc4" + // 0x00410308: 0x000000C4
+	"\x00A\x03\n\x00\x00\x00\xc5" + // 0x0041030A: 0x000000C5
+	"\x00C\x03'\x00\x00\x00\xc7" + // 0x00430327: 0x000000C7
+	"\x00E\x03\x00\x00\x00\x00\xc8" + // 0x00450300: 0x000000C8
+	"\x00E\x03\x01\x00\x00\x00\xc9" + // 0x00450301: 0x000000C9
+	"\x00E\x03\x02\x00\x00\x00\xca" + // 0x00450302: 0x000000CA
+	"\x00E\x03\b\x00\x00\x00\xcb" + // 0x00450308: 0x000000CB
+	"\x00I\x03\x00\x00\x00\x00\xcc" + // 0x00490300: 0x000000CC
+	"\x00I\x03\x01\x00\x00\x00\xcd" + // 0x00490301: 0x000000CD
+	"\x00I\x03\x02\x00\x00\x00\xce" + // 0x00490302: 0x000000CE
+	"\x00I\x03\b\x00\x00\x00\xcf" + // 0x00490308: 0x000000CF
+	"\x00N\x03\x03\x00\x00\x00\xd1" + // 0x004E0303: 0x000000D1
+	"\x00O\x03\x00\x00\x00\x00\xd2" + // 0x004F0300: 0x000000D2
+	"\x00O\x03\x01\x00\x00\x00\xd3" + // 0x004F0301: 0x000000D3
+	"\x00O\x03\x02\x00\x00\x00\xd4" + // 0x004F0302: 0x000000D4
+	"\x00O\x03\x03\x00\x00\x00\xd5" + // 0x004F0303: 0x000000D5
+	"\x00O\x03\b\x00\x00\x00\xd6" + // 0x004F0308: 0x000000D6
+	"\x00U\x03\x00\x00\x00\x00\xd9" + // 0x00550300: 0x000000D9
+	"\x00U\x03\x01\x00\x00\x00\xda" + // 0x00550301: 0x000000DA
+	"\x00U\x03\x02\x00\x00\x00\xdb" + // 0x00550302: 0x000000DB
+	"\x00U\x03\b\x00\x00\x00\xdc" + // 0x00550308: 0x000000DC
+	"\x00Y\x03\x01\x00\x00\x00\xdd" + // 0x00590301: 0x000000DD
+	"\x00a\x03\x00\x00\x00\x00\xe0" + // 0x00610300: 0x000000E0
+	"\x00a\x03\x01\x00\x00\x00\xe1" + // 0x00610301: 0x000000E1
+	"\x00a\x03\x02\x00\x00\x00\xe2" + // 0x00610302: 0x000000E2
+	"\x00a\x03\x03\x00\x00\x00\xe3" + // 0x00610303: 0x000000E3
+	"\x00a\x03\b\x00\x00\x00\xe4" + // 0x00610308: 0x000000E4
+	"\x00a\x03\n\x00\x00\x00\xe5" + // 0x0061030A: 0x000000E5
+	"\x00c\x03'\x00\x00\x00\xe7" + // 0x00630327: 0x000000E7
+	"\x00e\x03\x00\x00\x00\x00\xe8" + // 0x00650300: 0x000000E8
+	"\x00e\x03\x01\x00\x00\x00\xe9" + // 0x00650301: 0x000000E9
+	"\x00e\x03\x02\x00\x00\x00\xea" + // 0x00650302: 0x000000EA
+	"\x00e\x03\b\x00\x00\x00\xeb" + // 0x00650308: 0x000000EB
+	"\x00i\x03\x00\x00\x00\x00\xec" + // 0x00690300: 0x000000EC
+	"\x00i\x03\x01\x00\x00\x00\xed" + // 0x00690301: 0x000000ED
+	"\x00i\x03\x02\x00\x00\x00\xee" + // 0x00690302: 0x000000EE
+	"\x00i\x03\b\x00\x00\x00\xef" + // 0x00690308: 0x000000EF
+	"\x00n\x03\x03\x00\x00\x00\xf1" + // 0x006E0303: 0x000000F1
+	"\x00o\x03\x00\x00\x00\x00\xf2" + // 0x006F0300: 0x000000F2
+	"\x00o\x03\x01\x00\x00\x00\xf3" + // 0x006F0301: 0x000000F3
+	"\x00o\x03\x02\x00\x00\x00\xf4" + // 0x006F0302: 0x000000F4
+	"\x00o\x03\x03\x00\x00\x00\xf5" + // 0x006F0303: 0x000000F5
+	"\x00o\x03\b\x00\x00\x00\xf6" + // 0x006F0308: 0x000000F6
+	"\x00u\x03\x00\x00\x00\x00\xf9" + // 0x00750300: 0x000000F9
+	"\x00u\x03\x01\x00\x00\x00\xfa" + // 0x00750301: 0x000000FA
+	"\x00u\x03\x02\x00\x00\x00\xfb" + // 0x00750302: 0x000000FB
+	"\x00u\x03\b\x00\x00\x00\xfc" + // 0x00750308: 0x000000FC
+	"\x00y\x03\x01\x00\x00\x00\xfd" + // 0x00790301: 0x000000FD
+	"\x00y\x03\b\x00\x00\x00\xff" + // 0x00790308: 0x000000FF
+	"\x00A\x03\x04\x00\x00\x01\x00" + // 0x00410304: 0x00000100
+	"\x00a\x03\x04\x00\x00\x01\x01" + // 0x00610304: 0x00000101
+	"\x00A\x03\x06\x00\x00\x01\x02" + // 0x00410306: 0x00000102
+	"\x00a\x03\x06\x00\x00\x01\x03" + // 0x00610306: 0x00000103
+	"\x00A\x03(\x00\x00\x01\x04" + // 0x00410328: 0x00000104
+	"\x00a\x03(\x00\x00\x01\x05" + // 0x00610328: 0x00000105
+	"\x00C\x03\x01\x00\x00\x01\x06" + // 0x00430301: 0x00000106
+	"\x00c\x03\x01\x00\x00\x01\a" + // 0x00630301: 0x00000107
+	"\x00C\x03\x02\x00\x00\x01\b" + // 0x00430302: 0x00000108
+	"\x00c\x03\x02\x00\x00\x01\t" + // 0x00630302: 0x00000109
+	"\x00C\x03\a\x00\x00\x01\n" + // 0x00430307: 0x0000010A
+	"\x00c\x03\a\x00\x00\x01\v" + // 0x00630307: 0x0000010B
+	"\x00C\x03\f\x00\x00\x01\f" + // 0x0043030C: 0x0000010C
+	"\x00c\x03\f\x00\x00\x01\r" + // 0x0063030C: 0x0000010D
+	"\x00D\x03\f\x00\x00\x01\x0e" + // 0x0044030C: 0x0000010E
+	"\x00d\x03\f\x00\x00\x01\x0f" + // 0x0064030C: 0x0000010F
+	"\x00E\x03\x04\x00\x00\x01\x12" + // 0x00450304: 0x00000112
+	"\x00e\x03\x04\x00\x00\x01\x13" + // 0x00650304: 0x00000113
+	"\x00E\x03\x06\x00\x00\x01\x14" + // 0x00450306: 0x00000114
+	"\x00e\x03\x06\x00\x00\x01\x15" + // 0x00650306: 0x00000115
+	"\x00E\x03\a\x00\x00\x01\x16" + // 0x00450307: 0x00000116
+	"\x00e\x03\a\x00\x00\x01\x17" + // 0x00650307: 0x00000117
+	"\x00E\x03(\x00\x00\x01\x18" + // 0x00450328: 0x00000118
+	"\x00e\x03(\x00\x00\x01\x19" + // 0x00650328: 0x00000119
+	"\x00E\x03\f\x00\x00\x01\x1a" + // 0x0045030C: 0x0000011A
+	"\x00e\x03\f\x00\x00\x01\x1b" + // 0x0065030C: 0x0000011B
+	"\x00G\x03\x02\x00\x00\x01\x1c" + // 0x00470302: 0x0000011C
+	"\x00g\x03\x02\x00\x00\x01\x1d" + // 0x00670302: 0x0000011D
+	"\x00G\x03\x06\x00\x00\x01\x1e" + // 0x00470306: 0x0000011E
+	"\x00g\x03\x06\x00\x00\x01\x1f" + // 0x00670306: 0x0000011F
+	"\x00G\x03\a\x00\x00\x01 " + // 0x00470307: 0x00000120
+	"\x00g\x03\a\x00\x00\x01!" + // 0x00670307: 0x00000121
+	"\x00G\x03'\x00\x00\x01\"" + // 0x00470327: 0x00000122
+	"\x00g\x03'\x00\x00\x01#" + // 0x00670327: 0x00000123
+	"\x00H\x03\x02\x00\x00\x01$" + // 0x00480302: 0x00000124
+	"\x00h\x03\x02\x00\x00\x01%" + // 0x00680302: 0x00000125
+	"\x00I\x03\x03\x00\x00\x01(" + // 0x00490303: 0x00000128
+	"\x00i\x03\x03\x00\x00\x01)" + // 0x00690303: 0x00000129
+	"\x00I\x03\x04\x00\x00\x01*" + // 0x00490304: 0x0000012A
+	"\x00i\x03\x04\x00\x00\x01+" + // 0x00690304: 0x0000012B
+	"\x00I\x03\x06\x00\x00\x01," + // 0x00490306: 0x0000012C
+	"\x00i\x03\x06\x00\x00\x01-" + // 0x00690306: 0x0000012D
+	"\x00I\x03(\x00\x00\x01." + // 0x00490328: 0x0000012E
+	"\x00i\x03(\x00\x00\x01/" + // 0x00690328: 0x0000012F
+	"\x00I\x03\a\x00\x00\x010" + // 0x00490307: 0x00000130
+	"\x00J\x03\x02\x00\x00\x014" + // 0x004A0302: 0x00000134
+	"\x00j\x03\x02\x00\x00\x015" + // 0x006A0302: 0x00000135
+	"\x00K\x03'\x00\x00\x016" + // 0x004B0327: 0x00000136
+	"\x00k\x03'\x00\x00\x017" + // 0x006B0327: 0x00000137
+	"\x00L\x03\x01\x00\x00\x019" + // 0x004C0301: 0x00000139
+	"\x00l\x03\x01\x00\x00\x01:" + // 0x006C0301: 0x0000013A
+	"\x00L\x03'\x00\x00\x01;" + // 0x004C0327: 0x0000013B
+	"\x00l\x03'\x00\x00\x01<" + // 0x006C0327: 0x0000013C
+	"\x00L\x03\f\x00\x00\x01=" + // 0x004C030C: 0x0000013D
+	"\x00l\x03\f\x00\x00\x01>" + // 0x006C030C: 0x0000013E
+	"\x00N\x03\x01\x00\x00\x01C" + // 0x004E0301: 0x00000143
+	"\x00n\x03\x01\x00\x00\x01D" + // 0x006E0301: 0x00000144
+	"\x00N\x03'\x00\x00\x01E" + // 0x004E0327: 0x00000145
+	"\x00n\x03'\x00\x00\x01F" + // 0x006E0327: 0x00000146
+	"\x00N\x03\f\x00\x00\x01G" + // 0x004E030C: 0x00000147
+	"\x00n\x03\f\x00\x00\x01H" + // 0x006E030C: 0x00000148
+	"\x00O\x03\x04\x00\x00\x01L" + // 0x004F0304: 0x0000014C
+	"\x00o\x03\x04\x00\x00\x01M" + // 0x006F0304: 0x0000014D
+	"\x00O\x03\x06\x00\x00\x01N" + // 0x004F0306: 0x0000014E
+	"\x00o\x03\x06\x00\x00\x01O" + // 0x006F0306: 0x0000014F
+	"\x00O\x03\v\x00\x00\x01P" + // 0x004F030B: 0x00000150
+	"\x00o\x03\v\x00\x00\x01Q" + // 0x006F030B: 0x00000151
+	"\x00R\x03\x01\x00\x00\x01T" + // 0x00520301: 0x00000154
+	"\x00r\x03\x01\x00\x00\x01U" + // 0x00720301: 0x00000155
+	"\x00R\x03'\x00\x00\x01V" + // 0x00520327: 0x00000156
+	"\x00r\x03'\x00\x00\x01W" + // 0x00720327: 0x00000157
+	"\x00R\x03\f\x00\x00\x01X" + // 0x0052030C: 0x00000158
+	"\x00r\x03\f\x00\x00\x01Y" + // 0x0072030C: 0x00000159
+	"\x00S\x03\x01\x00\x00\x01Z" + // 0x00530301: 0x0000015A
+	"\x00s\x03\x01\x00\x00\x01[" + // 0x00730301: 0x0000015B
+	"\x00S\x03\x02\x00\x00\x01\\" + // 0x00530302: 0x0000015C
+	"\x00s\x03\x02\x00\x00\x01]" + // 0x00730302: 0x0000015D
+	"\x00S\x03'\x00\x00\x01^" + // 0x00530327: 0x0000015E
+	"\x00s\x03'\x00\x00\x01_" + // 0x00730327: 0x0000015F
+	"\x00S\x03\f\x00\x00\x01`" + // 0x0053030C: 0x00000160
+	"\x00s\x03\f\x00\x00\x01a" + // 0x0073030C: 0x00000161
+	"\x00T\x03'\x00\x00\x01b" + // 0x00540327: 0x00000162
+	"\x00t\x03'\x00\x00\x01c" + // 0x00740327: 0x00000163
+	"\x00T\x03\f\x00\x00\x01d" + // 0x0054030C: 0x00000164
+	"\x00t\x03\f\x00\x00\x01e" + // 0x0074030C: 0x00000165
+	"\x00U\x03\x03\x00\x00\x01h" + // 0x00550303: 0x00000168
+	"\x00u\x03\x03\x00\x00\x01i" + // 0x00750303: 0x00000169
+	"\x00U\x03\x04\x00\x00\x01j" + // 0x00550304: 0x0000016A
+	"\x00u\x03\x04\x00\x00\x01k" + // 0x00750304: 0x0000016B
+	"\x00U\x03\x06\x00\x00\x01l" + // 0x00550306: 0x0000016C
+	"\x00u\x03\x06\x00\x00\x01m" + // 0x00750306: 0x0000016D
+	"\x00U\x03\n\x00\x00\x01n" + // 0x0055030A: 0x0000016E
+	"\x00u\x03\n\x00\x00\x01o" + // 0x0075030A: 0x0000016F
+	"\x00U\x03\v\x00\x00\x01p" + // 0x0055030B: 0x00000170
+	"\x00u\x03\v\x00\x00\x01q" + // 0x0075030B: 0x00000171
+	"\x00U\x03(\x00\x00\x01r" + // 0x00550328: 0x00000172
+	"\x00u\x03(\x00\x00\x01s" + // 0x00750328: 0x00000173
+	"\x00W\x03\x02\x00\x00\x01t" + // 0x00570302: 0x00000174
+	"\x00w\x03\x02\x00\x00\x01u" + // 0x00770302: 0x00000175
+	"\x00Y\x03\x02\x00\x00\x01v" + // 0x00590302: 0x00000176
+	"\x00y\x03\x02\x00\x00\x01w" + // 0x00790302: 0x00000177
+	"\x00Y\x03\b\x00\x00\x01x" + // 0x00590308: 0x00000178
+	"\x00Z\x03\x01\x00\x00\x01y" + // 0x005A0301: 0x00000179
+	"\x00z\x03\x01\x00\x00\x01z" + // 0x007A0301: 0x0000017A
+	"\x00Z\x03\a\x00\x00\x01{" + // 0x005A0307: 0x0000017B
+	"\x00z\x03\a\x00\x00\x01|" + // 0x007A0307: 0x0000017C
+	"\x00Z\x03\f\x00\x00\x01}" + // 0x005A030C: 0x0000017D
+	"\x00z\x03\f\x00\x00\x01~" + // 0x007A030C: 0x0000017E
+	"\x00O\x03\x1b\x00\x00\x01\xa0" + // 0x004F031B: 0x000001A0
+	"\x00o\x03\x1b\x00\x00\x01\xa1" + // 0x006F031B: 0x000001A1
+	"\x00U\x03\x1b\x00\x00\x01\xaf" + // 0x0055031B: 0x000001AF
+	"\x00u\x03\x1b\x00\x00\x01\xb0" + // 0x0075031B: 0x000001B0
+	"\x00A\x03\f\x00\x00\x01\xcd" + // 0x0041030C: 0x000001CD
+	"\x00a\x03\f\x00\x00\x01\xce" + // 0x0061030C: 0x000001CE
+	"\x00I\x03\f\x00\x00\x01\xcf" + // 0x0049030C: 0x000001CF
+	"\x00i\x03\f\x00\x00\x01\xd0" + // 0x0069030C: 0x000001D0
+	"\x00O\x03\f\x00\x00\x01\xd1" + // 0x004F030C: 0x000001D1
+	"\x00o\x03\f\x00\x00\x01\xd2" + // 0x006F030C: 0x000001D2
+	"\x00U\x03\f\x00\x00\x01\xd3" + // 0x0055030C: 0x000001D3
+	"\x00u\x03\f\x00\x00\x01\xd4" + // 0x0075030C: 0x000001D4
+	"\x00\xdc\x03\x04\x00\x00\x01\xd5" + // 0x00DC0304: 0x000001D5
+	"\x00\xfc\x03\x04\x00\x00\x01\xd6" + // 0x00FC0304: 0x000001D6
+	"\x00\xdc\x03\x01\x00\x00\x01\xd7" + // 0x00DC0301: 0x000001D7
+	"\x00\xfc\x03\x01\x00\x00\x01\xd8" + // 0x00FC0301: 0x000001D8
+	"\x00\xdc\x03\f\x00\x00\x01\xd9" + // 0x00DC030C: 0x000001D9
+	"\x00\xfc\x03\f\x00\x00\x01\xda" + // 0x00FC030C: 0x000001DA
+	"\x00\xdc\x03\x00\x00\x00\x01\xdb" + // 0x00DC0300: 0x000001DB
+	"\x00\xfc\x03\x00\x00\x00\x01\xdc" + // 0x00FC0300: 0x000001DC
+	"\x00\xc4\x03\x04\x00\x00\x01\xde" + // 0x00C40304: 0x000001DE
+	"\x00\xe4\x03\x04\x00\x00\x01\xdf" + // 0x00E40304: 0x000001DF
+	"\x02&\x03\x04\x00\x00\x01\xe0" + // 0x02260304: 0x000001E0
+	"\x02'\x03\x04\x00\x00\x01\xe1" + // 0x02270304: 0x000001E1
+	"\x00\xc6\x03\x04\x00\x00\x01\xe2" + // 0x00C60304: 0x000001E2
+	"\x00\xe6\x03\x04\x00\x00\x01\xe3" + // 0x00E60304: 0x000001E3
+	"\x00G\x03\f\x00\x00\x01\xe6" + // 0x0047030C: 0x000001E6
+	"\x00g\x03\f\x00\x00\x01\xe7" + // 0x0067030C: 0x000001E7
+	"\x00K\x03\f\x00\x00\x01\xe8" + // 0x004B030C: 0x000001E8
+	"\x00k\x03\f\x00\x00\x01\xe9" + // 0x006B030C: 0x000001E9
+	"\x00O\x03(\x00\x00\x01\xea" + // 0x004F0328: 0x000001EA
+	"\x00o\x03(\x00\x00\x01\xeb" + // 0x006F0328: 0x000001EB
+	"\x01\xea\x03\x04\x00\x00\x01\xec" + // 0x01EA0304: 0x000001EC
+	"\x01\xeb\x03\x04\x00\x00\x01\xed" + // 0x01EB0304: 0x000001ED
+	"\x01\xb7\x03\f\x00\x00\x01\xee" + // 0x01B7030C: 0x000001EE
+	"\x02\x92\x03\f\x00\x00\x01\xef" + // 0x0292030C: 0x000001EF
+	"\x00j\x03\f\x00\x00\x01\xf0" + // 0x006A030C: 0x000001F0
+	"\x00G\x03\x01\x00\x00\x01\xf4" + // 0x00470301: 0x000001F4
+	"\x00g\x03\x01\x00\x00\x01\xf5" + // 0x00670301: 0x000001F5
+	"\x00N\x03\x00\x00\x00\x01\xf8" + // 0x004E0300: 0x000001F8
+	"\x00n\x03\x00\x00\x00\x01\xf9" + // 0x006E0300: 0x000001F9
+	"\x00\xc5\x03\x01\x00\x00\x01\xfa" + // 0x00C50301: 0x000001FA
+	"\x00\xe5\x03\x01\x00\x00\x01\xfb" + // 0x00E50301: 0x000001FB
+	"\x00\xc6\x03\x01\x00\x00\x01\xfc" + // 0x00C60301: 0x000001FC
+	"\x00\xe6\x03\x01\x00\x00\x01\xfd" + // 0x00E60301: 0x000001FD
+	"\x00\xd8\x03\x01\x00\x00\x01\xfe" + // 0x00D80301: 0x000001FE
+	"\x00\xf8\x03\x01\x00\x00\x01\xff" + // 0x00F80301: 0x000001FF
+	"\x00A\x03\x0f\x00\x00\x02\x00" + // 0x0041030F: 0x00000200
+	"\x00a\x03\x0f\x00\x00\x02\x01" + // 0x0061030F: 0x00000201
+	"\x00A\x03\x11\x00\x00\x02\x02" + // 0x00410311: 0x00000202
+	"\x00a\x03\x11\x00\x00\x02\x03" + // 0x00610311: 0x00000203
+	"\x00E\x03\x0f\x00\x00\x02\x04" + // 0x0045030F: 0x00000204
+	"\x00e\x03\x0f\x00\x00\x02\x05" + // 0x0065030F: 0x00000205
+	"\x00E\x03\x11\x00\x00\x02\x06" + // 0x00450311: 0x00000206
+	"\x00e\x03\x11\x00\x00\x02\a" + // 0x00650311: 0x00000207
+	"\x00I\x03\x0f\x00\x00\x02\b" + // 0x0049030F: 0x00000208
+	"\x00i\x03\x0f\x00\x00\x02\t" + // 0x0069030F: 0x00000209
+	"\x00I\x03\x11\x00\x00\x02\n" + // 0x00490311: 0x0000020A
+	"\x00i\x03\x11\x00\x00\x02\v" + // 0x00690311: 0x0000020B
+	"\x00O\x03\x0f\x00\x00\x02\f" + // 0x004F030F: 0x0000020C
+	"\x00o\x03\x0f\x00\x00\x02\r" + // 0x006F030F: 0x0000020D
+	"\x00O\x03\x11\x00\x00\x02\x0e" + // 0x004F0311: 0x0000020E
+	"\x00o\x03\x11\x00\x00\x02\x0f" + // 0x006F0311: 0x0000020F
+	"\x00R\x03\x0f\x00\x00\x02\x10" + // 0x0052030F: 0x00000210
+	"\x00r\x03\x0f\x00\x00\x02\x11" + // 0x0072030F: 0x00000211
+	"\x00R\x03\x11\x00\x00\x02\x12" + // 0x00520311: 0x00000212
+	"\x00r\x03\x11\x00\x00\x02\x13" + // 0x00720311: 0x00000213
+	"\x00U\x03\x0f\x00\x00\x02\x14" + // 0x0055030F: 0x00000214
+	"\x00u\x03\x0f\x00\x00\x02\x15" + // 0x0075030F: 0x00000215
+	"\x00U\x03\x11\x00\x00\x02\x16" + // 0x00550311: 0x00000216
+	"\x00u\x03\x11\x00\x00\x02\x17" + // 0x00750311: 0x00000217
+	"\x00S\x03&\x00\x00\x02\x18" + // 0x00530326: 0x00000218
+	"\x00s\x03&\x00\x00\x02\x19" + // 0x00730326: 0x00000219
+	"\x00T\x03&\x00\x00\x02\x1a" + // 0x00540326: 0x0000021A
+	"\x00t\x03&\x00\x00\x02\x1b" + // 0x00740326: 0x0000021B
+	"\x00H\x03\f\x00\x00\x02\x1e" + // 0x0048030C: 0x0000021E
+	"\x00h\x03\f\x00\x00\x02\x1f" + // 0x0068030C: 0x0000021F
+	"\x00A\x03\a\x00\x00\x02&" + // 0x00410307: 0x00000226
+	"\x00a\x03\a\x00\x00\x02'" + // 0x00610307: 0x00000227
+	"\x00E\x03'\x00\x00\x02(" + // 0x00450327: 0x00000228
+	"\x00e\x03'\x00\x00\x02)" + // 0x00650327: 0x00000229
+	"\x00\xd6\x03\x04\x00\x00\x02*" + // 0x00D60304: 0x0000022A
+	"\x00\xf6\x03\x04\x00\x00\x02+" + // 0x00F60304: 0x0000022B
+	"\x00\xd5\x03\x04\x00\x00\x02," + // 0x00D50304: 0x0000022C
+	"\x00\xf5\x03\x04\x00\x00\x02-" + // 0x00F50304: 0x0000022D
+	"\x00O\x03\a\x00\x00\x02." + // 0x004F0307: 0x0000022E
+	"\x00o\x03\a\x00\x00\x02/" + // 0x006F0307: 0x0000022F
+	"\x02.\x03\x04\x00\x00\x020" + // 0x022E0304: 0x00000230
+	"\x02/\x03\x04\x00\x00\x021" + // 0x022F0304: 0x00000231
+	"\x00Y\x03\x04\x00\x00\x022" + // 0x00590304: 0x00000232
+	"\x00y\x03\x04\x00\x00\x023" + // 0x00790304: 0x00000233
+	"\x00\xa8\x03\x01\x00\x00\x03\x85" + // 0x00A80301: 0x00000385
+	"\x03\x91\x03\x01\x00\x00\x03\x86" + // 0x03910301: 0x00000386
+	"\x03\x95\x03\x01\x00\x00\x03\x88" + // 0x03950301: 0x00000388
+	"\x03\x97\x03\x01\x00\x00\x03\x89" + // 0x03970301: 0x00000389
+	"\x03\x99\x03\x01\x00\x00\x03\x8a" + // 0x03990301: 0x0000038A
+	"\x03\x9f\x03\x01\x00\x00\x03\x8c" + // 0x039F0301: 0x0000038C
+	"\x03\xa5\x03\x01\x00\x00\x03\x8e" + // 0x03A50301: 0x0000038E
+	"\x03\xa9\x03\x01\x00\x00\x03\x8f" + // 0x03A90301: 0x0000038F
+	"\x03\xca\x03\x01\x00\x00\x03\x90" + // 0x03CA0301: 0x00000390
+	"\x03\x99\x03\b\x00\x00\x03\xaa" + // 0x03990308: 0x000003AA
+	"\x03\xa5\x03\b\x00\x00\x03\xab" + // 0x03A50308: 0x000003AB
+	"\x03\xb1\x03\x01\x00\x00\x03\xac" + // 0x03B10301: 0x000003AC
+	"\x03\xb5\x03\x01\x00\x00\x03\xad" + // 0x03B50301: 0x000003AD
+	"\x03\xb7\x03\x01\x00\x00\x03\xae" + // 0x03B70301: 0x000003AE
+	"\x03\xb9\x03\x01\x00\x00\x03\xaf" + // 0x03B90301: 0x000003AF
+	"\x03\xcb\x03\x01\x00\x00\x03\xb0" + // 0x03CB0301: 0x000003B0
+	"\x03\xb9\x03\b\x00\x00\x03\xca" + // 0x03B90308: 0x000003CA
+	"\x03\xc5\x03\b\x00\x00\x03\xcb" + // 0x03C50308: 0x000003CB
+	"\x03\xbf\x03\x01\x00\x00\x03\xcc" + // 0x03BF0301: 0x000003CC
+	"\x03\xc5\x03\x01\x00\x00\x03\xcd" + // 0x03C50301: 0x000003CD
+	"\x03\xc9\x03\x01\x00\x00\x03\xce" + // 0x03C90301: 0x000003CE
+	"\x03\xd2\x03\x01\x00\x00\x03\xd3" + // 0x03D20301: 0x000003D3
+	"\x03\xd2\x03\b\x00\x00\x03\xd4" + // 0x03D20308: 0x000003D4
+	"\x04\x15\x03\x00\x00\x00\x04\x00" + // 0x04150300: 0x00000400
+	"\x04\x15\x03\b\x00\x00\x04\x01" + // 0x04150308: 0x00000401
+	"\x04\x13\x03\x01\x00\x00\x04\x03" + // 0x04130301: 0x00000403
+	"\x04\x06\x03\b\x00\x00\x04\a" + // 0x04060308: 0x00000407
+	"\x04\x1a\x03\x01\x00\x00\x04\f" + // 0x041A0301: 0x0000040C
+	"\x04\x18\x03\x00\x00\x00\x04\r" + // 0x04180300: 0x0000040D
+	"\x04#\x03\x06\x00\x00\x04\x0e" + // 0x04230306: 0x0000040E
+	"\x04\x18\x03\x06\x00\x00\x04\x19" + // 0x04180306: 0x00000419
+	"\x048\x03\x06\x00\x00\x049" + // 0x04380306: 0x00000439
+	"\x045\x03\x00\x00\x00\x04P" + // 0x04350300: 0x00000450
+	"\x045\x03\b\x00\x00\x04Q" + // 0x04350308: 0x00000451
+	"\x043\x03\x01\x00\x00\x04S" + // 0x04330301: 0x00000453
+	"\x04V\x03\b\x00\x00\x04W" + // 0x04560308: 0x00000457
+	"\x04:\x03\x01\x00\x00\x04\\" + // 0x043A0301: 0x0000045C
+	"\x048\x03\x00\x00\x00\x04]" + // 0x04380300: 0x0000045D
+	"\x04C\x03\x06\x00\x00\x04^" + // 0x04430306: 0x0000045E
+	"\x04t\x03\x0f\x00\x00\x04v" + // 0x0474030F: 0x00000476
+	"\x04u\x03\x0f\x00\x00\x04w" + // 0x0475030F: 0x00000477
+	"\x04\x16\x03\x06\x00\x00\x04\xc1" + // 0x04160306: 0x000004C1
+	"\x046\x03\x06\x00\x00\x04\xc2" + // 0x04360306: 0x000004C2
+	"\x04\x10\x03\x06\x00\x00\x04\xd0" + // 0x04100306: 0x000004D0
+	"\x040\x03\x06\x00\x00\x04\xd1" + // 0x04300306: 0x000004D1
+	"\x04\x10\x03\b\x00\x00\x04\xd2" + // 0x04100308: 0x000004D2
+	"\x040\x03\b\x00\x00\x04\xd3" + // 0x04300308: 0x000004D3
+	"\x04\x15\x03\x06\x00\x00\x04\xd6" + // 0x04150306: 0x000004D6
+	"\x045\x03\x06\x00\x00\x04\xd7" + // 0x04350306: 0x000004D7
+	"\x04\xd8\x03\b\x00\x00\x04\xda" + // 0x04D80308: 0x000004DA
+	"\x04\xd9\x03\b\x00\x00\x04\xdb" + // 0x04D90308: 0x000004DB
+	"\x04\x16\x03\b\x00\x00\x04\xdc" + // 0x04160308: 0x000004DC
+	"\x046\x03\b\x00\x00\x04\xdd" + // 0x04360308: 0x000004DD
+	"\x04\x17\x03\b\x00\x00\x04\xde" + // 0x04170308: 0x000004DE
+	"\x047\x03\b\x00\x00\x04\xdf" + // 0x04370308: 0x000004DF
+	"\x04\x18\x03\x04\x00\x00\x04\xe2" + // 0x04180304: 0x000004E2
+	"\x048\x03\x04\x00\x00\x04\xe3" + // 0x04380304: 0x000004E3
+	"\x04\x18\x03\b\x00\x00\x04\xe4" + // 0x04180308: 0x000004E4
+	"\x048\x03\b\x00\x00\x04\xe5" + // 0x04380308: 0x000004E5
+	"\x04\x1e\x03\b\x00\x00\x04\xe6" + // 0x041E0308: 0x000004E6
+	"\x04>\x03\b\x00\x00\x04\xe7" + // 0x043E0308: 0x000004E7
+	"\x04\xe8\x03\b\x00\x00\x04\xea" + // 0x04E80308: 0x000004EA
+	"\x04\xe9\x03\b\x00\x00\x04\xeb" + // 0x04E90308: 0x000004EB
+	"\x04-\x03\b\x00\x00\x04\xec" + // 0x042D0308: 0x000004EC
+	"\x04M\x03\b\x00\x00\x04\xed" + // 0x044D0308: 0x000004ED
+	"\x04#\x03\x04\x00\x00\x04\xee" + // 0x04230304: 0x000004EE
+	"\x04C\x03\x04\x00\x00\x04\xef" + // 0x04430304: 0x000004EF
+	"\x04#\x03\b\x00\x00\x04\xf0" + // 0x04230308: 0x000004F0
+	"\x04C\x03\b\x00\x00\x04\xf1" + // 0x04430308: 0x000004F1
+	"\x04#\x03\v\x00\x00\x04\xf2" + // 0x0423030B: 0x000004F2
+	"\x04C\x03\v\x00\x00\x04\xf3" + // 0x0443030B: 0x000004F3
+	"\x04'\x03\b\x00\x00\x04\xf4" + // 0x04270308: 0x000004F4
+	"\x04G\x03\b\x00\x00\x04\xf5" + // 0x04470308: 0x000004F5
+	"\x04+\x03\b\x00\x00\x04\xf8" + // 0x042B0308: 0x000004F8
+	"\x04K\x03\b\x00\x00\x04\xf9" + // 0x044B0308: 0x000004F9
+	"\x06'\x06S\x00\x00\x06\"" + // 0x06270653: 0x00000622
+	"\x06'\x06T\x00\x00\x06#" + // 0x06270654: 0x00000623
+	"\x06H\x06T\x00\x00\x06$" + // 0x06480654: 0x00000624
+	"\x06'\x06U\x00\x00\x06%" + // 0x06270655: 0x00000625
+	"\x06J\x06T\x00\x00\x06&" + // 0x064A0654: 0x00000626
+	"\x06\xd5\x06T\x00\x00\x06\xc0" + // 0x06D50654: 0x000006C0
+	"\x06\xc1\x06T\x00\x00\x06\xc2" + // 0x06C10654: 0x000006C2
+	"\x06\xd2\x06T\x00\x00\x06\xd3" + // 0x06D20654: 0x000006D3
+	"\t(\t<\x00\x00\t)" + // 0x0928093C: 0x00000929
+	"\t0\t<\x00\x00\t1" + // 0x0930093C: 0x00000931
+	"\t3\t<\x00\x00\t4" + // 0x0933093C: 0x00000934
+	"\t\xc7\t\xbe\x00\x00\t\xcb" + // 0x09C709BE: 0x000009CB
+	"\t\xc7\t\xd7\x00\x00\t\xcc" + // 0x09C709D7: 0x000009CC
+	"\vG\vV\x00\x00\vH" + // 0x0B470B56: 0x00000B48
+	"\vG\v>\x00\x00\vK" + // 0x0B470B3E: 0x00000B4B
+	"\vG\vW\x00\x00\vL" + // 0x0B470B57: 0x00000B4C
+	"\v\x92\v\xd7\x00\x00\v\x94" + // 0x0B920BD7: 0x00000B94
+	"\v\xc6\v\xbe\x00\x00\v\xca" + // 0x0BC60BBE: 0x00000BCA
+	"\v\xc7\v\xbe\x00\x00\v\xcb" + // 0x0BC70BBE: 0x00000BCB
+	"\v\xc6\v\xd7\x00\x00\v\xcc" + // 0x0BC60BD7: 0x00000BCC
+	"\fF\fV\x00\x00\fH" + // 0x0C460C56: 0x00000C48
+	"\f\xbf\f\xd5\x00\x00\f\xc0" + // 0x0CBF0CD5: 0x00000CC0
+	"\f\xc6\f\xd5\x00\x00\f\xc7" + // 0x0CC60CD5: 0x00000CC7
+	"\f\xc6\f\xd6\x00\x00\f\xc8" + // 0x0CC60CD6: 0x00000CC8
+	"\f\xc6\f\xc2\x00\x00\f\xca" + // 0x0CC60CC2: 0x00000CCA
+	"\f\xca\f\xd5\x00\x00\f\xcb" + // 0x0CCA0CD5: 0x00000CCB
+	"\rF\r>\x00\x00\rJ" + // 0x0D460D3E: 0x00000D4A
+	"\rG\r>\x00\x00\rK" + // 0x0D470D3E: 0x00000D4B
+	"\rF\rW\x00\x00\rL" + // 0x0D460D57: 0x00000D4C
+	"\r\xd9\r\xca\x00\x00\r\xda" + // 0x0DD90DCA: 0x00000DDA
+	"\r\xd9\r\xcf\x00\x00\r\xdc" + // 0x0DD90DCF: 0x00000DDC
+	"\r\xdc\r\xca\x00\x00\r\xdd" + // 0x0DDC0DCA: 0x00000DDD
+	"\r\xd9\r\xdf\x00\x00\r\xde" + // 0x0DD90DDF: 0x00000DDE
+	"\x10%\x10.\x00\x00\x10&" + // 0x1025102E: 0x00001026
+	"\x1b\x05\x1b5\x00\x00\x1b\x06" + // 0x1B051B35: 0x00001B06
+	"\x1b\a\x1b5\x00\x00\x1b\b" + // 0x1B071B35: 0x00001B08
+	"\x1b\t\x1b5\x00\x00\x1b\n" + // 0x1B091B35: 0x00001B0A
+	"\x1b\v\x1b5\x00\x00\x1b\f" + // 0x1B0B1B35: 0x00001B0C
+	"\x1b\r\x1b5\x00\x00\x1b\x0e" + // 0x1B0D1B35: 0x00001B0E
+	"\x1b\x11\x1b5\x00\x00\x1b\x12" + // 0x1B111B35: 0x00001B12
+	"\x1b:\x1b5\x00\x00\x1b;" + // 0x1B3A1B35: 0x00001B3B
+	"\x1b<\x1b5\x00\x00\x1b=" + // 0x1B3C1B35: 0x00001B3D
+	"\x1b>\x1b5\x00\x00\x1b@" + // 0x1B3E1B35: 0x00001B40
+	"\x1b?\x1b5\x00\x00\x1bA" + // 0x1B3F1B35: 0x00001B41
+	"\x1bB\x1b5\x00\x00\x1bC" + // 0x1B421B35: 0x00001B43
+	"\x00A\x03%\x00\x00\x1e\x00" + // 0x00410325: 0x00001E00
+	"\x00a\x03%\x00\x00\x1e\x01" + // 0x00610325: 0x00001E01
+	"\x00B\x03\a\x00\x00\x1e\x02" + // 0x00420307: 0x00001E02
+	"\x00b\x03\a\x00\x00\x1e\x03" + // 0x00620307: 0x00001E03
+	"\x00B\x03#\x00\x00\x1e\x04" + // 0x00420323: 0x00001E04
+	"\x00b\x03#\x00\x00\x1e\x05" + // 0x00620323: 0x00001E05
+	"\x00B\x031\x00\x00\x1e\x06" + // 0x00420331: 0x00001E06
+	"\x00b\x031\x00\x00\x1e\a" + // 0x00620331: 0x00001E07
+	"\x00\xc7\x03\x01\x00\x00\x1e\b" + // 0x00C70301: 0x00001E08
+	"\x00\xe7\x03\x01\x00\x00\x1e\t" + // 0x00E70301: 0x00001E09
+	"\x00D\x03\a\x00\x00\x1e\n" + // 0x00440307: 0x00001E0A
+	"\x00d\x03\a\x00\x00\x1e\v" + // 0x00640307: 0x00001E0B
+	"\x00D\x03#\x00\x00\x1e\f" + // 0x00440323: 0x00001E0C
+	"\x00d\x03#\x00\x00\x1e\r" + // 0x00640323: 0x00001E0D
+	"\x00D\x031\x00\x00\x1e\x0e" + // 0x00440331: 0x00001E0E
+	"\x00d\x031\x00\x00\x1e\x0f" + // 0x00640331: 0x00001E0F
+	"\x00D\x03'\x00\x00\x1e\x10" + // 0x00440327: 0x00001E10
+	"\x00d\x03'\x00\x00\x1e\x11" + // 0x00640327: 0x00001E11
+	"\x00D\x03-\x00\x00\x1e\x12" + // 0x0044032D: 0x00001E12
+	"\x00d\x03-\x00\x00\x1e\x13" + // 0x0064032D: 0x00001E13
+	"\x01\x12\x03\x00\x00\x00\x1e\x14" + // 0x01120300: 0x00001E14
+	"\x01\x13\x03\x00\x00\x00\x1e\x15" + // 0x01130300: 0x00001E15
+	"\x01\x12\x03\x01\x00\x00\x1e\x16" + // 0x01120301: 0x00001E16
+	"\x01\x13\x03\x01\x00\x00\x1e\x17" + // 0x01130301: 0x00001E17
+	"\x00E\x03-\x00\x00\x1e\x18" + // 0x0045032D: 0x00001E18
+	"\x00e\x03-\x00\x00\x1e\x19" + // 0x0065032D: 0x00001E19
+	"\x00E\x030\x00\x00\x1e\x1a" + // 0x00450330: 0x00001E1A
+	"\x00e\x030\x00\x00\x1e\x1b" + // 0x00650330: 0x00001E1B
+	"\x02(\x03\x06\x00\x00\x1e\x1c" + // 0x02280306: 0x00001E1C
+	"\x02)\x03\x06\x00\x00\x1e\x1d" + // 0x02290306: 0x00001E1D
+	"\x00F\x03\a\x00\x00\x1e\x1e" + // 0x00460307: 0x00001E1E
+	"\x00f\x03\a\x00\x00\x1e\x1f" + // 0x00660307: 0x00001E1F
+	"\x00G\x03\x04\x00\x00\x1e " + // 0x00470304: 0x00001E20
+	"\x00g\x03\x04\x00\x00\x1e!" + // 0x00670304: 0x00001E21
+	"\x00H\x03\a\x00\x00\x1e\"" + // 0x00480307: 0x00001E22
+	"\x00h\x03\a\x00\x00\x1e#" + // 0x00680307: 0x00001E23
+	"\x00H\x03#\x00\x00\x1e$" + // 0x00480323: 0x00001E24
+	"\x00h\x03#\x00\x00\x1e%" + // 0x00680323: 0x00001E25
+	"\x00H\x03\b\x00\x00\x1e&" + // 0x00480308: 0x00001E26
+	"\x00h\x03\b\x00\x00\x1e'" + // 0x00680308: 0x00001E27
+	"\x00H\x03'\x00\x00\x1e(" + // 0x00480327: 0x00001E28
+	"\x00h\x03'\x00\x00\x1e)" + // 0x00680327: 0x00001E29
+	"\x00H\x03.\x00\x00\x1e*" + // 0x0048032E: 0x00001E2A
+	"\x00h\x03.\x00\x00\x1e+" + // 0x0068032E: 0x00001E2B
+	"\x00I\x030\x00\x00\x1e," + // 0x00490330: 0x00001E2C
+	"\x00i\x030\x00\x00\x1e-" + // 0x00690330: 0x00001E2D
+	"\x00\xcf\x03\x01\x00\x00\x1e." + // 0x00CF0301: 0x00001E2E
+	"\x00\xef\x03\x01\x00\x00\x1e/" + // 0x00EF0301: 0x00001E2F
+	"\x00K\x03\x01\x00\x00\x1e0" + // 0x004B0301: 0x00001E30
+	"\x00k\x03\x01\x00\x00\x1e1" + // 0x006B0301: 0x00001E31
+	"\x00K\x03#\x00\x00\x1e2" + // 0x004B0323: 0x00001E32
+	"\x00k\x03#\x00\x00\x1e3" + // 0x006B0323: 0x00001E33
+	"\x00K\x031\x00\x00\x1e4" + // 0x004B0331: 0x00001E34
+	"\x00k\x031\x00\x00\x1e5" + // 0x006B0331: 0x00001E35
+	"\x00L\x03#\x00\x00\x1e6" + // 0x004C0323: 0x00001E36
+	"\x00l\x03#\x00\x00\x1e7" + // 0x006C0323: 0x00001E37
+	"\x1e6\x03\x04\x00\x00\x1e8" + // 0x1E360304: 0x00001E38
+	"\x1e7\x03\x04\x00\x00\x1e9" + // 0x1E370304: 0x00001E39
+	"\x00L\x031\x00\x00\x1e:" + // 0x004C0331: 0x00001E3A
+	"\x00l\x031\x00\x00\x1e;" + // 0x006C0331: 0x00001E3B
+	"\x00L\x03-\x00\x00\x1e<" + // 0x004C032D: 0x00001E3C
+	"\x00l\x03-\x00\x00\x1e=" + // 0x006C032D: 0x00001E3D
+	"\x00M\x03\x01\x00\x00\x1e>" + // 0x004D0301: 0x00001E3E
+	"\x00m\x03\x01\x00\x00\x1e?" + // 0x006D0301: 0x00001E3F
+	"\x00M\x03\a\x00\x00\x1e@" + // 0x004D0307: 0x00001E40
+	"\x00m\x03\a\x00\x00\x1eA" + // 0x006D0307: 0x00001E41
+	"\x00M\x03#\x00\x00\x1eB" + // 0x004D0323: 0x00001E42
+	"\x00m\x03#\x00\x00\x1eC" + // 0x006D0323: 0x00001E43
+	"\x00N\x03\a\x00\x00\x1eD" + // 0x004E0307: 0x00001E44
+	"\x00n\x03\a\x00\x00\x1eE" + // 0x006E0307: 0x00001E45
+	"\x00N\x03#\x00\x00\x1eF" + // 0x004E0323: 0x00001E46
+	"\x00n\x03#\x00\x00\x1eG" + // 0x006E0323: 0x00001E47
+	"\x00N\x031\x00\x00\x1eH" + // 0x004E0331: 0x00001E48
+	"\x00n\x031\x00\x00\x1eI" + // 0x006E0331: 0x00001E49
+	"\x00N\x03-\x00\x00\x1eJ" + // 0x004E032D: 0x00001E4A
+	"\x00n\x03-\x00\x00\x1eK" + // 0x006E032D: 0x00001E4B
+	"\x00\xd5\x03\x01\x00\x00\x1eL" + // 0x00D50301: 0x00001E4C
+	"\x00\xf5\x03\x01\x00\x00\x1eM" + // 0x00F50301: 0x00001E4D
+	"\x00\xd5\x03\b\x00\x00\x1eN" + // 0x00D50308: 0x00001E4E
+	"\x00\xf5\x03\b\x00\x00\x1eO" + // 0x00F50308: 0x00001E4F
+	"\x01L\x03\x00\x00\x00\x1eP" + // 0x014C0300: 0x00001E50
+	"\x01M\x03\x00\x00\x00\x1eQ" + // 0x014D0300: 0x00001E51
+	"\x01L\x03\x01\x00\x00\x1eR" + // 0x014C0301: 0x00001E52
+	"\x01M\x03\x01\x00\x00\x1eS" + // 0x014D0301: 0x00001E53
+	"\x00P\x03\x01\x00\x00\x1eT" + // 0x00500301: 0x00001E54
+	"\x00p\x03\x01\x00\x00\x1eU" + // 0x00700301: 0x00001E55
+	"\x00P\x03\a\x00\x00\x1eV" + // 0x00500307: 0x00001E56
+	"\x00p\x03\a\x00\x00\x1eW" + // 0x00700307: 0x00001E57
+	"\x00R\x03\a\x00\x00\x1eX" + // 0x00520307: 0x00001E58
+	"\x00r\x03\a\x00\x00\x1eY" + // 0x00720307: 0x00001E59
+	"\x00R\x03#\x00\x00\x1eZ" + // 0x00520323: 0x00001E5A
+	"\x00r\x03#\x00\x00\x1e[" + // 0x00720323: 0x00001E5B
+	"\x1eZ\x03\x04\x00\x00\x1e\\" + // 0x1E5A0304: 0x00001E5C
+	"\x1e[\x03\x04\x00\x00\x1e]" + // 0x1E5B0304: 0x00001E5D
+	"\x00R\x031\x00\x00\x1e^" + // 0x00520331: 0x00001E5E
+	"\x00r\x031\x00\x00\x1e_" + // 0x00720331: 0x00001E5F
+	"\x00S\x03\a\x00\x00\x1e`" + // 0x00530307: 0x00001E60
+	"\x00s\x03\a\x00\x00\x1ea" + // 0x00730307: 0x00001E61
+	"\x00S\x03#\x00\x00\x1eb" + // 0x00530323: 0x00001E62
+	"\x00s\x03#\x00\x00\x1ec" + // 0x00730323: 0x00001E63
+	"\x01Z\x03\a\x00\x00\x1ed" + // 0x015A0307: 0x00001E64
+	"\x01[\x03\a\x00\x00\x1ee" + // 0x015B0307: 0x00001E65
+	"\x01`\x03\a\x00\x00\x1ef" + // 0x01600307: 0x00001E66
+	"\x01a\x03\a\x00\x00\x1eg" + // 0x01610307: 0x00001E67
+	"\x1eb\x03\a\x00\x00\x1eh" + // 0x1E620307: 0x00001E68
+	"\x1ec\x03\a\x00\x00\x1ei" + // 0x1E630307: 0x00001E69
+	"\x00T\x03\a\x00\x00\x1ej" + // 0x00540307: 0x00001E6A
+	"\x00t\x03\a\x00\x00\x1ek" + // 0x00740307: 0x00001E6B
+	"\x00T\x03#\x00\x00\x1el" + // 0x00540323: 0x00001E6C
+	"\x00t\x03#\x00\x00\x1em" + // 0x00740323: 0x00001E6D
+	"\x00T\x031\x00\x00\x1en" + // 0x00540331: 0x00001E6E
+	"\x00t\x031\x00\x00\x1eo" + // 0x00740331: 0x00001E6F
+	"\x00T\x03-\x00\x00\x1ep" + // 0x0054032D: 0x00001E70
+	"\x00t\x03-\x00\x00\x1eq" + // 0x0074032D: 0x00001E71
+	"\x00U\x03$\x00\x00\x1er" + // 0x00550324: 0x00001E72
+	"\x00u\x03$\x00\x00\x1es" + // 0x00750324: 0x00001E73
+	"\x00U\x030\x00\x00\x1et" + // 0x00550330: 0x00001E74
+	"\x00u\x030\x00\x00\x1eu" + // 0x00750330: 0x00001E75
+	"\x00U\x03-\x00\x00\x1ev" + // 0x0055032D: 0x00001E76
+	"\x00u\x03-\x00\x00\x1ew" + // 0x0075032D: 0x00001E77
+	"\x01h\x03\x01\x00\x00\x1ex" + // 0x01680301: 0x00001E78
+	"\x01i\x03\x01\x00\x00\x1ey" + // 0x01690301: 0x00001E79
+	"\x01j\x03\b\x00\x00\x1ez" + // 0x016A0308: 0x00001E7A
+	"\x01k\x03\b\x00\x00\x1e{" + // 0x016B0308: 0x00001E7B
+	"\x00V\x03\x03\x00\x00\x1e|" + // 0x00560303: 0x00001E7C
+	"\x00v\x03\x03\x00\x00\x1e}" + // 0x00760303: 0x00001E7D
+	"\x00V\x03#\x00\x00\x1e~" + // 0x00560323: 0x00001E7E
+	"\x00v\x03#\x00\x00\x1e\x7f" + // 0x00760323: 0x00001E7F
+	"\x00W\x03\x00\x00\x00\x1e\x80" + // 0x00570300: 0x00001E80
+	"\x00w\x03\x00\x00\x00\x1e\x81" + // 0x00770300: 0x00001E81
+	"\x00W\x03\x01\x00\x00\x1e\x82" + // 0x00570301: 0x00001E82
+	"\x00w\x03\x01\x00\x00\x1e\x83" + // 0x00770301: 0x00001E83
+	"\x00W\x03\b\x00\x00\x1e\x84" + // 0x00570308: 0x00001E84
+	"\x00w\x03\b\x00\x00\x1e\x85" + // 0x00770308: 0x00001E85
+	"\x00W\x03\a\x00\x00\x1e\x86" + // 0x00570307: 0x00001E86
+	"\x00w\x03\a\x00\x00\x1e\x87" + // 0x00770307: 0x00001E87
+	"\x00W\x03#\x00\x00\x1e\x88" + // 0x00570323: 0x00001E88
+	"\x00w\x03#\x00\x00\x1e\x89" + // 0x00770323: 0x00001E89
+	"\x00X\x03\a\x00\x00\x1e\x8a" + // 0x00580307: 0x00001E8A
+	"\x00x\x03\a\x00\x00\x1e\x8b" + // 0x00780307: 0x00001E8B
+	"\x00X\x03\b\x00\x00\x1e\x8c" + // 0x00580308: 0x00001E8C
+	"\x00x\x03\b\x00\x00\x1e\x8d" + // 0x00780308: 0x00001E8D
+	"\x00Y\x03\a\x00\x00\x1e\x8e" + // 0x00590307: 0x00001E8E
+	"\x00y\x03\a\x00\x00\x1e\x8f" + // 0x00790307: 0x00001E8F
+	"\x00Z\x03\x02\x00\x00\x1e\x90" + // 0x005A0302: 0x00001E90
+	"\x00z\x03\x02\x00\x00\x1e\x91" + // 0x007A0302: 0x00001E91
+	"\x00Z\x03#\x00\x00\x1e\x92" + // 0x005A0323: 0x00001E92
+	"\x00z\x03#\x00\x00\x1e\x93" + // 0x007A0323: 0x00001E93
+	"\x00Z\x031\x00\x00\x1e\x94" + // 0x005A0331: 0x00001E94
+	"\x00z\x031\x00\x00\x1e\x95" + // 0x007A0331: 0x00001E95
+	"\x00h\x031\x00\x00\x1e\x96" + // 0x00680331: 0x00001E96
+	"\x00t\x03\b\x00\x00\x1e\x97" + // 0x00740308: 0x00001E97
+	"\x00w\x03\n\x00\x00\x1e\x98" + // 0x0077030A: 0x00001E98
+	"\x00y\x03\n\x00\x00\x1e\x99" + // 0x0079030A: 0x00001E99
+	"\x01\x7f\x03\a\x00\x00\x1e\x9b" + // 0x017F0307: 0x00001E9B
+	"\x00A\x03#\x00\x00\x1e\xa0" + // 0x00410323: 0x00001EA0
+	"\x00a\x03#\x00\x00\x1e\xa1" + // 0x00610323: 0x00001EA1
+	"\x00A\x03\t\x00\x00\x1e\xa2" + // 0x00410309: 0x00001EA2
+	"\x00a\x03\t\x00\x00\x1e\xa3" + // 0x00610309: 0x00001EA3
+	"\x00\xc2\x03\x01\x00\x00\x1e\xa4" + // 0x00C20301: 0x00001EA4
+	"\x00\xe2\x03\x01\x00\x00\x1e\xa5" + // 0x00E20301: 0x00001EA5
+	"\x00\xc2\x03\x00\x00\x00\x1e\xa6" + // 0x00C20300: 0x00001EA6
+	"\x00\xe2\x03\x00\x00\x00\x1e\xa7" + // 0x00E20300: 0x00001EA7
+	"\x00\xc2\x03\t\x00\x00\x1e\xa8" + // 0x00C20309: 0x00001EA8
+	"\x00\xe2\x03\t\x00\x00\x1e\xa9" + // 0x00E20309: 0x00001EA9
+	"\x00\xc2\x03\x03\x00\x00\x1e\xaa" + // 0x00C20303: 0x00001EAA
+	"\x00\xe2\x03\x03\x00\x00\x1e\xab" + // 0x00E20303: 0x00001EAB
+	"\x1e\xa0\x03\x02\x00\x00\x1e\xac" + // 0x1EA00302: 0x00001EAC
+	"\x1e\xa1\x03\x02\x00\x00\x1e\xad" + // 0x1EA10302: 0x00001EAD
+	"\x01\x02\x03\x01\x00\x00\x1e\xae" + // 0x01020301: 0x00001EAE
+	"\x01\x03\x03\x01\x00\x00\x1e\xaf" + // 0x01030301: 0x00001EAF
+	"\x01\x02\x03\x00\x00\x00\x1e\xb0" + // 0x01020300: 0x00001EB0
+	"\x01\x03\x03\x00\x00\x00\x1e\xb1" + // 0x01030300: 0x00001EB1
+	"\x01\x02\x03\t\x00\x00\x1e\xb2" + // 0x01020309: 0x00001EB2
+	"\x01\x03\x03\t\x00\x00\x1e\xb3" + // 0x01030309: 0x00001EB3
+	"\x01\x02\x03\x03\x00\x00\x1e\xb4" + // 0x01020303: 0x00001EB4
+	"\x01\x03\x03\x03\x00\x00\x1e\xb5" + // 0x01030303: 0x00001EB5
+	"\x1e\xa0\x03\x06\x00\x00\x1e\xb6" + // 0x1EA00306: 0x00001EB6
+	"\x1e\xa1\x03\x06\x00\x00\x1e\xb7" + // 0x1EA10306: 0x00001EB7
+	"\x00E\x03#\x00\x00\x1e\xb8" + // 0x00450323: 0x00001EB8
+	"\x00e\x03#\x00\x00\x1e\xb9" + // 0x00650323: 0x00001EB9
+	"\x00E\x03\t\x00\x00\x1e\xba" + // 0x00450309: 0x00001EBA
+	"\x00e\x03\t\x00\x00\x1e\xbb" + // 0x00650309: 0x00001EBB
+	"\x00E\x03\x03\x00\x00\x1e\xbc" + // 0x00450303: 0x00001EBC
+	"\x00e\x03\x03\x00\x00\x1e\xbd" + // 0x00650303: 0x00001EBD
+	"\x00\xca\x03\x01\x00\x00\x1e\xbe" + // 0x00CA0301: 0x00001EBE
+	"\x00\xea\x03\x01\x00\x00\x1e\xbf" + // 0x00EA0301: 0x00001EBF
+	"\x00\xca\x03\x00\x00\x00\x1e\xc0" + // 0x00CA0300: 0x00001EC0
+	"\x00\xea\x03\x00\x00\x00\x1e\xc1" + // 0x00EA0300: 0x00001EC1
+	"\x00\xca\x03\t\x00\x00\x1e\xc2" + // 0x00CA0309: 0x00001EC2
+	"\x00\xea\x03\t\x00\x00\x1e\xc3" + // 0x00EA0309: 0x00001EC3
+	"\x00\xca\x03\x03\x00\x00\x1e\xc4" + // 0x00CA0303: 0x00001EC4
+	"\x00\xea\x03\x03\x00\x00\x1e\xc5" + // 0x00EA0303: 0x00001EC5
+	"\x1e\xb8\x03\x02\x00\x00\x1e\xc6" + // 0x1EB80302: 0x00001EC6
+	"\x1e\xb9\x03\x02\x00\x00\x1e\xc7" + // 0x1EB90302: 0x00001EC7
+	"\x00I\x03\t\x00\x00\x1e\xc8" + // 0x00490309: 0x00001EC8
+	"\x00i\x03\t\x00\x00\x1e\xc9" + // 0x00690309: 0x00001EC9
+	"\x00I\x03#\x00\x00\x1e\xca" + // 0x00490323: 0x00001ECA
+	"\x00i\x03#\x00\x00\x1e\xcb" + // 0x00690323: 0x00001ECB
+	"\x00O\x03#\x00\x00\x1e\xcc" + // 0x004F0323: 0x00001ECC
+	"\x00o\x03#\x00\x00\x1e\xcd" + // 0x006F0323: 0x00001ECD
+	"\x00O\x03\t\x00\x00\x1e\xce" + // 0x004F0309: 0x00001ECE
+	"\x00o\x03\t\x00\x00\x1e\xcf" + // 0x006F0309: 0x00001ECF
+	"\x00\xd4\x03\x01\x00\x00\x1e\xd0" + // 0x00D40301: 0x00001ED0
+	"\x00\xf4\x03\x01\x00\x00\x1e\xd1" + // 0x00F40301: 0x00001ED1
+	"\x00\xd4\x03\x00\x00\x00\x1e\xd2" + // 0x00D40300: 0x00001ED2
+	"\x00\xf4\x03\x00\x00\x00\x1e\xd3" + // 0x00F40300: 0x00001ED3
+	"\x00\xd4\x03\t\x00\x00\x1e\xd4" + // 0x00D40309: 0x00001ED4
+	"\x00\xf4\x03\t\x00\x00\x1e\xd5" + // 0x00F40309: 0x00001ED5
+	"\x00\xd4\x03\x03\x00\x00\x1e\xd6" + // 0x00D40303: 0x00001ED6
+	"\x00\xf4\x03\x03\x00\x00\x1e\xd7" + // 0x00F40303: 0x00001ED7
+	"\x1e\xcc\x03\x02\x00\x00\x1e\xd8" + // 0x1ECC0302: 0x00001ED8
+	"\x1e\xcd\x03\x02\x00\x00\x1e\xd9" + // 0x1ECD0302: 0x00001ED9
+	"\x01\xa0\x03\x01\x00\x00\x1e\xda" + // 0x01A00301: 0x00001EDA
+	"\x01\xa1\x03\x01\x00\x00\x1e\xdb" + // 0x01A10301: 0x00001EDB
+	"\x01\xa0\x03\x00\x00\x00\x1e\xdc" + // 0x01A00300: 0x00001EDC
+	"\x01\xa1\x03\x00\x00\x00\x1e\xdd" + // 0x01A10300: 0x00001EDD
+	"\x01\xa0\x03\t\x00\x00\x1e\xde" + // 0x01A00309: 0x00001EDE
+	"\x01\xa1\x03\t\x00\x00\x1e\xdf" + // 0x01A10309: 0x00001EDF
+	"\x01\xa0\x03\x03\x00\x00\x1e\xe0" + // 0x01A00303: 0x00001EE0
+	"\x01\xa1\x03\x03\x00\x00\x1e\xe1" + // 0x01A10303: 0x00001EE1
+	"\x01\xa0\x03#\x00\x00\x1e\xe2" + // 0x01A00323: 0x00001EE2
+	"\x01\xa1\x03#\x00\x00\x1e\xe3" + // 0x01A10323: 0x00001EE3
+	"\x00U\x03#\x00\x00\x1e\xe4" + // 0x00550323: 0x00001EE4
+	"\x00u\x03#\x00\x00\x1e\xe5" + // 0x00750323: 0x00001EE5
+	"\x00U\x03\t\x00\x00\x1e\xe6" + // 0x00550309: 0x00001EE6
+	"\x00u\x03\t\x00\x00\x1e\xe7" + // 0x00750309: 0x00001EE7
+	"\x01\xaf\x03\x01\x00\x00\x1e\xe8" + // 0x01AF0301: 0x00001EE8
+	"\x01\xb0\x03\x01\x00\x00\x1e\xe9" + // 0x01B00301: 0x00001EE9
+	"\x01\xaf\x03\x00\x00\x00\x1e\xea" + // 0x01AF0300: 0x00001EEA
+	"\x01\xb0\x03\x00\x00\x00\x1e\xeb" + // 0x01B00300: 0x00001EEB
+	"\x01\xaf\x03\t\x00\x00\x1e\xec" + // 0x01AF0309: 0x00001EEC
+	"\x01\xb0\x03\t\x00\x00\x1e\xed" + // 0x01B00309: 0x00001EED
+	"\x01\xaf\x03\x03\x00\x00\x1e\xee" + // 0x01AF0303: 0x00001EEE
+	"\x01\xb0\x03\x03\x00\x00\x1e\xef" + // 0x01B00303: 0x00001EEF
+	"\x01\xaf\x03#\x00\x00\x1e\xf0" + // 0x01AF0323: 0x00001EF0
+	"\x01\xb0\x03#\x00\x00\x1e\xf1" + // 0x01B00323: 0x00001EF1
+	"\x00Y\x03\x00\x00\x00\x1e\xf2" + // 0x00590300: 0x00001EF2
+	"\x00y\x03\x00\x00\x00\x1e\xf3" + // 0x00790300: 0x00001EF3
+	"\x00Y\x03#\x00\x00\x1e\xf4" + // 0x00590323: 0x00001EF4
+	"\x00y\x03#\x00\x00\x1e\xf5" + // 0x00790323: 0x00001EF5
+	"\x00Y\x03\t\x00\x00\x1e\xf6" + // 0x00590309: 0x00001EF6
+	"\x00y\x03\t\x00\x00\x1e\xf7" + // 0x00790309: 0x00001EF7
+	"\x00Y\x03\x03\x00\x00\x1e\xf8" + // 0x00590303: 0x00001EF8
+	"\x00y\x03\x03\x00\x00\x1e\xf9" + // 0x00790303: 0x00001EF9
+	"\x03\xb1\x03\x13\x00\x00\x1f\x00" + // 0x03B10313: 0x00001F00
+	"\x03\xb1\x03\x14\x00\x00\x1f\x01" + // 0x03B10314: 0x00001F01
+	"\x1f\x00\x03\x00\x00\x00\x1f\x02" + // 0x1F000300: 0x00001F02
+	"\x1f\x01\x03\x00\x00\x00\x1f\x03" + // 0x1F010300: 0x00001F03
+	"\x1f\x00\x03\x01\x00\x00\x1f\x04" + // 0x1F000301: 0x00001F04
+	"\x1f\x01\x03\x01\x00\x00\x1f\x05" + // 0x1F010301: 0x00001F05
+	"\x1f\x00\x03B\x00\x00\x1f\x06" + // 0x1F000342: 0x00001F06
+	"\x1f\x01\x03B\x00\x00\x1f\a" + // 0x1F010342: 0x00001F07
+	"\x03\x91\x03\x13\x00\x00\x1f\b" + // 0x03910313: 0x00001F08
+	"\x03\x91\x03\x14\x00\x00\x1f\t" + // 0x03910314: 0x00001F09
+	"\x1f\b\x03\x00\x00\x00\x1f\n" + // 0x1F080300: 0x00001F0A
+	"\x1f\t\x03\x00\x00\x00\x1f\v" + // 0x1F090300: 0x00001F0B
+	"\x1f\b\x03\x01\x00\x00\x1f\f" + // 0x1F080301: 0x00001F0C
+	"\x1f\t\x03\x01\x00\x00\x1f\r" + // 0x1F090301: 0x00001F0D
+	"\x1f\b\x03B\x00\x00\x1f\x0e" + // 0x1F080342: 0x00001F0E
+	"\x1f\t\x03B\x00\x00\x1f\x0f" + // 0x1F090342: 0x00001F0F
+	"\x03\xb5\x03\x13\x00\x00\x1f\x10" + // 0x03B50313: 0x00001F10
+	"\x03\xb5\x03\x14\x00\x00\x1f\x11" + // 0x03B50314: 0x00001F11
+	"\x1f\x10\x03\x00\x00\x00\x1f\x12" + // 0x1F100300: 0x00001F12
+	"\x1f\x11\x03\x00\x00\x00\x1f\x13" + // 0x1F110300: 0x00001F13
+	"\x1f\x10\x03\x01\x00\x00\x1f\x14" + // 0x1F100301: 0x00001F14
+	"\x1f\x11\x03\x01\x00\x00\x1f\x15" + // 0x1F110301: 0x00001F15
+	"\x03\x95\x03\x13\x00\x00\x1f\x18" + // 0x03950313: 0x00001F18
+	"\x03\x95\x03\x14\x00\x00\x1f\x19" + // 0x03950314: 0x00001F19
+	"\x1f\x18\x03\x00\x00\x00\x1f\x1a" + // 0x1F180300: 0x00001F1A
+	"\x1f\x19\x03\x00\x00\x00\x1f\x1b" + // 0x1F190300: 0x00001F1B
+	"\x1f\x18\x03\x01\x00\x00\x1f\x1c" + // 0x1F180301: 0x00001F1C
+	"\x1f\x19\x03\x01\x00\x00\x1f\x1d" + // 0x1F190301: 0x00001F1D
+	"\x03\xb7\x03\x13\x00\x00\x1f " + // 0x03B70313: 0x00001F20
+	"\x03\xb7\x03\x14\x00\x00\x1f!" + // 0x03B70314: 0x00001F21
+	"\x1f \x03\x00\x00\x00\x1f\"" + // 0x1F200300: 0x00001F22
+	"\x1f!\x03\x00\x00\x00\x1f#" + // 0x1F210300: 0x00001F23
+	"\x1f \x03\x01\x00\x00\x1f$" + // 0x1F200301: 0x00001F24
+	"\x1f!\x03\x01\x00\x00\x1f%" + // 0x1F210301: 0x00001F25
+	"\x1f \x03B\x00\x00\x1f&" + // 0x1F200342: 0x00001F26
+	"\x1f!\x03B\x00\x00\x1f'" + // 0x1F210342: 0x00001F27
+	"\x03\x97\x03\x13\x00\x00\x1f(" + // 0x03970313: 0x00001F28
+	"\x03\x97\x03\x14\x00\x00\x1f)" + // 0x03970314: 0x00001F29
+	"\x1f(\x03\x00\x00\x00\x1f*" + // 0x1F280300: 0x00001F2A
+	"\x1f)\x03\x00\x00\x00\x1f+" + // 0x1F290300: 0x00001F2B
+	"\x1f(\x03\x01\x00\x00\x1f," + // 0x1F280301: 0x00001F2C
+	"\x1f)\x03\x01\x00\x00\x1f-" + // 0x1F290301: 0x00001F2D
+	"\x1f(\x03B\x00\x00\x1f." + // 0x1F280342: 0x00001F2E
+	"\x1f)\x03B\x00\x00\x1f/" + // 0x1F290342: 0x00001F2F
+	"\x03\xb9\x03\x13\x00\x00\x1f0" + // 0x03B90313: 0x00001F30
+	"\x03\xb9\x03\x14\x00\x00\x1f1" + // 0x03B90314: 0x00001F31
+	"\x1f0\x03\x00\x00\x00\x1f2" + // 0x1F300300: 0x00001F32
+	"\x1f1\x03\x00\x00\x00\x1f3" + // 0x1F310300: 0x00001F33
+	"\x1f0\x03\x01\x00\x00\x1f4" + // 0x1F300301: 0x00001F34
+	"\x1f1\x03\x01\x00\x00\x1f5" + // 0x1F310301: 0x00001F35
+	"\x1f0\x03B\x00\x00\x1f6" + // 0x1F300342: 0x00001F36
+	"\x1f1\x03B\x00\x00\x1f7" + // 0x1F310342: 0x00001F37
+	"\x03\x99\x03\x13\x00\x00\x1f8" + // 0x03990313: 0x00001F38
+	"\x03\x99\x03\x14\x00\x00\x1f9" + // 0x03990314: 0x00001F39
+	"\x1f8\x03\x00\x00\x00\x1f:" + // 0x1F380300: 0x00001F3A
+	"\x1f9\x03\x00\x00\x00\x1f;" + // 0x1F390300: 0x00001F3B
+	"\x1f8\x03\x01\x00\x00\x1f<" + // 0x1F380301: 0x00001F3C
+	"\x1f9\x03\x01\x00\x00\x1f=" + // 0x1F390301: 0x00001F3D
+	"\x1f8\x03B\x00\x00\x1f>" + // 0x1F380342: 0x00001F3E
+	"\x1f9\x03B\x00\x00\x1f?" + // 0x1F390342: 0x00001F3F
+	"\x03\xbf\x03\x13\x00\x00\x1f@" + // 0x03BF0313: 0x00001F40
+	"\x03\xbf\x03\x14\x00\x00\x1fA" + // 0x03BF0314: 0x00001F41
+	"\x1f@\x03\x00\x00\x00\x1fB" + // 0x1F400300: 0x00001F42
+	"\x1fA\x03\x00\x00\x00\x1fC" + // 0x1F410300: 0x00001F43
+	"\x1f@\x03\x01\x00\x00\x1fD" + // 0x1F400301: 0x00001F44
+	"\x1fA\x03\x01\x00\x00\x1fE" + // 0x1F410301: 0x00001F45
+	"\x03\x9f\x03\x13\x00\x00\x1fH" + // 0x039F0313: 0x00001F48
+	"\x03\x9f\x03\x14\x00\x00\x1fI" + // 0x039F0314: 0x00001F49
+	"\x1fH\x03\x00\x00\x00\x1fJ" + // 0x1F480300: 0x00001F4A
+	"\x1fI\x03\x00\x00\x00\x1fK" + // 0x1F490300: 0x00001F4B
+	"\x1fH\x03\x01\x00\x00\x1fL" + // 0x1F480301: 0x00001F4C
+	"\x1fI\x03\x01\x00\x00\x1fM" + // 0x1F490301: 0x00001F4D
+	"\x03\xc5\x03\x13\x00\x00\x1fP" + // 0x03C50313: 0x00001F50
+	"\x03\xc5\x03\x14\x00\x00\x1fQ" + // 0x03C50314: 0x00001F51
+	"\x1fP\x03\x00\x00\x00\x1fR" + // 0x1F500300: 0x00001F52
+	"\x1fQ\x03\x00\x00\x00\x1fS" + // 0x1F510300: 0x00001F53
+	"\x1fP\x03\x01\x00\x00\x1fT" + // 0x1F500301: 0x00001F54
+	"\x1fQ\x03\x01\x00\x00\x1fU" + // 0x1F510301: 0x00001F55
+	"\x1fP\x03B\x00\x00\x1fV" + // 0x1F500342: 0x00001F56
+	"\x1fQ\x03B\x00\x00\x1fW" + // 0x1F510342: 0x00001F57
+	"\x03\xa5\x03\x14\x00\x00\x1fY" + // 0x03A50314: 0x00001F59
+	"\x1fY\x03\x00\x00\x00\x1f[" + // 0x1F590300: 0x00001F5B
+	"\x1fY\x03\x01\x00\x00\x1f]" + // 0x1F590301: 0x00001F5D
+	"\x1fY\x03B\x00\x00\x1f_" + // 0x1F590342: 0x00001F5F
+	"\x03\xc9\x03\x13\x00\x00\x1f`" + // 0x03C90313: 0x00001F60
+	"\x03\xc9\x03\x14\x00\x00\x1fa" + // 0x03C90314: 0x00001F61
+	"\x1f`\x03\x00\x00\x00\x1fb" + // 0x1F600300: 0x00001F62
+	"\x1fa\x03\x00\x00\x00\x1fc" + // 0x1F610300: 0x00001F63
+	"\x1f`\x03\x01\x00\x00\x1fd" + // 0x1F600301: 0x00001F64
+	"\x1fa\x03\x01\x00\x00\x1fe" + // 0x1F610301: 0x00001F65
+	"\x1f`\x03B\x00\x00\x1ff" + // 0x1F600342: 0x00001F66
+	"\x1fa\x03B\x00\x00\x1fg" + // 0x1F610342: 0x00001F67
+	"\x03\xa9\x03\x13\x00\x00\x1fh" + // 0x03A90313: 0x00001F68
+	"\x03\xa9\x03\x14\x00\x00\x1fi" + // 0x03A90314: 0x00001F69
+	"\x1fh\x03\x00\x00\x00\x1fj" + // 0x1F680300: 0x00001F6A
+	"\x1fi\x03\x00\x00\x00\x1fk" + // 0x1F690300: 0x00001F6B
+	"\x1fh\x03\x01\x00\x00\x1fl" + // 0x1F680301: 0x00001F6C
+	"\x1fi\x03\x01\x00\x00\x1fm" + // 0x1F690301: 0x00001F6D
+	"\x1fh\x03B\x00\x00\x1fn" + // 0x1F680342: 0x00001F6E
+	"\x1fi\x03B\x00\x00\x1fo" + // 0x1F690342: 0x00001F6F
+	"\x03\xb1\x03\x00\x00\x00\x1fp" + // 0x03B10300: 0x00001F70
+	"\x03\xb5\x03\x00\x00\x00\x1fr" + // 0x03B50300: 0x00001F72
+	"\x03\xb7\x03\x00\x00\x00\x1ft" + // 0x03B70300: 0x00001F74
+	"\x03\xb9\x03\x00\x00\x00\x1fv" + // 0x03B90300: 0x00001F76
+	"\x03\xbf\x03\x00\x00\x00\x1fx" + // 0x03BF0300: 0x00001F78
+	"\x03\xc5\x03\x00\x00\x00\x1fz" + // 0x03C50300: 0x00001F7A
+	"\x03\xc9\x03\x00\x00\x00\x1f|" + // 0x03C90300: 0x00001F7C
+	"\x1f\x00\x03E\x00\x00\x1f\x80" + // 0x1F000345: 0x00001F80
+	"\x1f\x01\x03E\x00\x00\x1f\x81" + // 0x1F010345: 0x00001F81
+	"\x1f\x02\x03E\x00\x00\x1f\x82" + // 0x1F020345: 0x00001F82
+	"\x1f\x03\x03E\x00\x00\x1f\x83" + // 0x1F030345: 0x00001F83
+	"\x1f\x04\x03E\x00\x00\x1f\x84" + // 0x1F040345: 0x00001F84
+	"\x1f\x05\x03E\x00\x00\x1f\x85" + // 0x1F050345: 0x00001F85
+	"\x1f\x06\x03E\x00\x00\x1f\x86" + // 0x1F060345: 0x00001F86
+	"\x1f\a\x03E\x00\x00\x1f\x87" + // 0x1F070345: 0x00001F87
+	"\x1f\b\x03E\x00\x00\x1f\x88" + // 0x1F080345: 0x00001F88
+	"\x1f\t\x03E\x00\x00\x1f\x89" + // 0x1F090345: 0x00001F89
+	"\x1f\n\x03E\x00\x00\x1f\x8a" + // 0x1F0A0345: 0x00001F8A
+	"\x1f\v\x03E\x00\x00\x1f\x8b" + // 0x1F0B0345: 0x00001F8B
+	"\x1f\f\x03E\x00\x00\x1f\x8c" + // 0x1F0C0345: 0x00001F8C
+	"\x1f\r\x03E\x00\x00\x1f\x8d" + // 0x1F0D0345: 0x00001F8D
+	"\x1f\x0e\x03E\x00\x00\x1f\x8e" + // 0x1F0E0345: 0x00001F8E
+	"\x1f\x0f\x03E\x00\x00\x1f\x8f" + // 0x1F0F0345: 0x00001F8F
+	"\x1f \x03E\x00\x00\x1f\x90" + // 0x1F200345: 0x00001F90
+	"\x1f!\x03E\x00\x00\x1f\x91" + // 0x1F210345: 0x00001F91
+	"\x1f\"\x03E\x00\x00\x1f\x92" + // 0x1F220345: 0x00001F92
+	"\x1f#\x03E\x00\x00\x1f\x93" + // 0x1F230345: 0x00001F93
+	"\x1f$\x03E\x00\x00\x1f\x94" + // 0x1F240345: 0x00001F94
+	"\x1f%\x03E\x00\x00\x1f\x95" + // 0x1F250345: 0x00001F95
+	"\x1f&\x03E\x00\x00\x1f\x96" + // 0x1F260345: 0x00001F96
+	"\x1f'\x03E\x00\x00\x1f\x97" + // 0x1F270345: 0x00001F97
+	"\x1f(\x03E\x00\x00\x1f\x98" + // 0x1F280345: 0x00001F98
+	"\x1f)\x03E\x00\x00\x1f\x99" + // 0x1F290345: 0x00001F99
+	"\x1f*\x03E\x00\x00\x1f\x9a" + // 0x1F2A0345: 0x00001F9A
+	"\x1f+\x03E\x00\x00\x1f\x9b" + // 0x1F2B0345: 0x00001F9B
+	"\x1f,\x03E\x00\x00\x1f\x9c" + // 0x1F2C0345: 0x00001F9C
+	"\x1f-\x03E\x00\x00\x1f\x9d" + // 0x1F2D0345: 0x00001F9D
+	"\x1f.\x03E\x00\x00\x1f\x9e" + // 0x1F2E0345: 0x00001F9E
+	"\x1f/\x03E\x00\x00\x1f\x9f" + // 0x1F2F0345: 0x00001F9F
+	"\x1f`\x03E\x00\x00\x1f\xa0" + // 0x1F600345: 0x00001FA0
+	"\x1fa\x03E\x00\x00\x1f\xa1" + // 0x1F610345: 0x00001FA1
+	"\x1fb\x03E\x00\x00\x1f\xa2" + // 0x1F620345: 0x00001FA2
+	"\x1fc\x03E\x00\x00\x1f\xa3" + // 0x1F630345: 0x00001FA3
+	"\x1fd\x03E\x00\x00\x1f\xa4" + // 0x1F640345: 0x00001FA4
+	"\x1fe\x03E\x00\x00\x1f\xa5" + // 0x1F650345: 0x00001FA5
+	"\x1ff\x03E\x00\x00\x1f\xa6" + // 0x1F660345: 0x00001FA6
+	"\x1fg\x03E\x00\x00\x1f\xa7" + // 0x1F670345: 0x00001FA7
+	"\x1fh\x03E\x00\x00\x1f\xa8" + // 0x1F680345: 0x00001FA8
+	"\x1fi\x03E\x00\x00\x1f\xa9" + // 0x1F690345: 0x00001FA9
+	"\x1fj\x03E\x00\x00\x1f\xaa" + // 0x1F6A0345: 0x00001FAA
+	"\x1fk\x03E\x00\x00\x1f\xab" + // 0x1F6B0345: 0x00001FAB
+	"\x1fl\x03E\x00\x00\x1f\xac" + // 0x1F6C0345: 0x00001FAC
+	"\x1fm\x03E\x00\x00\x1f\xad" + // 0x1F6D0345: 0x00001FAD
+	"\x1fn\x03E\x00\x00\x1f\xae" + // 0x1F6E0345: 0x00001FAE
+	"\x1fo\x03E\x00\x00\x1f\xaf" + // 0x1F6F0345: 0x00001FAF
+	"\x03\xb1\x03\x06\x00\x00\x1f\xb0" + // 0x03B10306: 0x00001FB0
+	"\x03\xb1\x03\x04\x00\x00\x1f\xb1" + // 0x03B10304: 0x00001FB1
+	"\x1fp\x03E\x00\x00\x1f\xb2" + // 0x1F700345: 0x00001FB2
+	"\x03\xb1\x03E\x00\x00\x1f\xb3" + // 0x03B10345: 0x00001FB3
+	"\x03\xac\x03E\x00\x00\x1f\xb4" + // 0x03AC0345: 0x00001FB4
+	"\x03\xb1\x03B\x00\x00\x1f\xb6" + // 0x03B10342: 0x00001FB6
+	"\x1f\xb6\x03E\x00\x00\x1f\xb7" + // 0x1FB60345: 0x00001FB7
+	"\x03\x91\x03\x06\x00\x00\x1f\xb8" + // 0x03910306: 0x00001FB8
+	"\x03\x91\x03\x04\x00\x00\x1f\xb9" + // 0x03910304: 0x00001FB9
+	"\x03\x91\x03\x00\x00\x00\x1f\xba" + // 0x03910300: 0x00001FBA
+	"\x03\x91\x03E\x00\x00\x1f\xbc" + // 0x03910345: 0x00001FBC
+	"\x00\xa8\x03B\x00\x00\x1f\xc1" + // 0x00A80342: 0x00001FC1
+	"\x1ft\x03E\x00\x00\x1f\xc2" + // 0x1F740345: 0x00001FC2
+	"\x03\xb7\x03E\x00\x00\x1f\xc3" + // 0x03B70345: 0x00001FC3
+	"\x03\xae\x03E\x00\x00\x1f\xc4" + // 0x03AE0345: 0x00001FC4
+	"\x03\xb7\x03B\x00\x00\x1f\xc6" + // 0x03B70342: 0x00001FC6
+	"\x1f\xc6\x03E\x00\x00\x1f\xc7" + // 0x1FC60345: 0x00001FC7
+	"\x03\x95\x03\x00\x00\x00\x1f\xc8" + // 0x03950300: 0x00001FC8
+	"\x03\x97\x03\x00\x00\x00\x1f\xca" + // 0x03970300: 0x00001FCA
+	"\x03\x97\x03E\x00\x00\x1f\xcc" + // 0x03970345: 0x00001FCC
+	"\x1f\xbf\x03\x00\x00\x00\x1f\xcd" + // 0x1FBF0300: 0x00001FCD
+	"\x1f\xbf\x03\x01\x00\x00\x1f\xce" + // 0x1FBF0301: 0x00001FCE
+	"\x1f\xbf\x03B\x00\x00\x1f\xcf" + // 0x1FBF0342: 0x00001FCF
+	"\x03\xb9\x03\x06\x00\x00\x1f\xd0" + // 0x03B90306: 0x00001FD0
+	"\x03\xb9\x03\x04\x00\x00\x1f\xd1" + // 0x03B90304: 0x00001FD1
+	"\x03\xca\x03\x00\x00\x00\x1f\xd2" + // 0x03CA0300: 0x00001FD2
+	"\x03\xb9\x03B\x00\x00\x1f\xd6" + // 0x03B90342: 0x00001FD6
+	"\x03\xca\x03B\x00\x00\x1f\xd7" + // 0x03CA0342: 0x00001FD7
+	"\x03\x99\x03\x06\x00\x00\x1f\xd8" + // 0x03990306: 0x00001FD8
+	"\x03\x99\x03\x04\x00\x00\x1f\xd9" + // 0x03990304: 0x00001FD9
+	"\x03\x99\x03\x00\x00\x00\x1f\xda" + // 0x03990300: 0x00001FDA
+	"\x1f\xfe\x03\x00\x00\x00\x1f\xdd" + // 0x1FFE0300: 0x00001FDD
+	"\x1f\xfe\x03\x01\x00\x00\x1f\xde" + // 0x1FFE0301: 0x00001FDE
+	"\x1f\xfe\x03B\x00\x00\x1f\xdf" + // 0x1FFE0342: 0x00001FDF
+	"\x03\xc5\x03\x06\x00\x00\x1f\xe0" + // 0x03C50306: 0x00001FE0
+	"\x03\xc5\x03\x04\x00\x00\x1f\xe1" + // 0x03C50304: 0x00001FE1
+	"\x03\xcb\x03\x00\x00\x00\x1f\xe2" + // 0x03CB0300: 0x00001FE2
+	"\x03\xc1\x03\x13\x00\x00\x1f\xe4" + // 0x03C10313: 0x00001FE4
+	"\x03\xc1\x03\x14\x00\x00\x1f\xe5" + // 0x03C10314: 0x00001FE5
+	"\x03\xc5\x03B\x00\x00\x1f\xe6" + // 0x03C50342: 0x00001FE6
+	"\x03\xcb\x03B\x00\x00\x1f\xe7" + // 0x03CB0342: 0x00001FE7
+	"\x03\xa5\x03\x06\x00\x00\x1f\xe8" + // 0x03A50306: 0x00001FE8
+	"\x03\xa5\x03\x04\x00\x00\x1f\xe9" + // 0x03A50304: 0x00001FE9
+	"\x03\xa5\x03\x00\x00\x00\x1f\xea" + // 0x03A50300: 0x00001FEA
+	"\x03\xa1\x03\x14\x00\x00\x1f\xec" + // 0x03A10314: 0x00001FEC
+	"\x00\xa8\x03\x00\x00\x00\x1f\xed" + // 0x00A80300: 0x00001FED
+	"\x1f|\x03E\x00\x00\x1f\xf2" + // 0x1F7C0345: 0x00001FF2
+	"\x03\xc9\x03E\x00\x00\x1f\xf3" + // 0x03C90345: 0x00001FF3
+	"\x03\xce\x03E\x00\x00\x1f\xf4" + // 0x03CE0345: 0x00001FF4
+	"\x03\xc9\x03B\x00\x00\x1f\xf6" + // 0x03C90342: 0x00001FF6
+	"\x1f\xf6\x03E\x00\x00\x1f\xf7" + // 0x1FF60345: 0x00001FF7
+	"\x03\x9f\x03\x00\x00\x00\x1f\xf8" + // 0x039F0300: 0x00001FF8
+	"\x03\xa9\x03\x00\x00\x00\x1f\xfa" + // 0x03A90300: 0x00001FFA
+	"\x03\xa9\x03E\x00\x00\x1f\xfc" + // 0x03A90345: 0x00001FFC
+	"!\x90\x038\x00\x00!\x9a" + // 0x21900338: 0x0000219A
+	"!\x92\x038\x00\x00!\x9b" + // 0x21920338: 0x0000219B
+	"!\x94\x038\x00\x00!\xae" + // 0x21940338: 0x000021AE
+	"!\xd0\x038\x00\x00!\xcd" + // 0x21D00338: 0x000021CD
+	"!\xd4\x038\x00\x00!\xce" + // 0x21D40338: 0x000021CE
+	"!\xd2\x038\x00\x00!\xcf" + // 0x21D20338: 0x000021CF
+	"\"\x03\x038\x00\x00\"\x04" + // 0x22030338: 0x00002204
+	"\"\b\x038\x00\x00\"\t" + // 0x22080338: 0x00002209
+	"\"\v\x038\x00\x00\"\f" + // 0x220B0338: 0x0000220C
+	"\"#\x038\x00\x00\"$" + // 0x22230338: 0x00002224
+	"\"%\x038\x00\x00\"&" + // 0x22250338: 0x00002226
+	"\"<\x038\x00\x00\"A" + // 0x223C0338: 0x00002241
+	"\"C\x038\x00\x00\"D" + // 0x22430338: 0x00002244
+	"\"E\x038\x00\x00\"G" + // 0x22450338: 0x00002247
+	"\"H\x038\x00\x00\"I" + // 0x22480338: 0x00002249
+	"\x00=\x038\x00\x00\"`" + // 0x003D0338: 0x00002260
+	"\"a\x038\x00\x00\"b" + // 0x22610338: 0x00002262
+	"\"M\x038\x00\x00\"m" + // 0x224D0338: 0x0000226D
+	"\x00<\x038\x00\x00\"n" + // 0x003C0338: 0x0000226E
+	"\x00>\x038\x00\x00\"o" + // 0x003E0338: 0x0000226F
+	"\"d\x038\x00\x00\"p" + // 0x22640338: 0x00002270
+	"\"e\x038\x00\x00\"q" + // 0x22650338: 0x00002271
+	"\"r\x038\x00\x00\"t" + // 0x22720338: 0x00002274
+	"\"s\x038\x00\x00\"u" + // 0x22730338: 0x00002275
+	"\"v\x038\x00\x00\"x" + // 0x22760338: 0x00002278
+	"\"w\x038\x00\x00\"y" + // 0x22770338: 0x00002279
+	"\"z\x038\x00\x00\"\x80" + // 0x227A0338: 0x00002280
+	"\"{\x038\x00\x00\"\x81" + // 0x227B0338: 0x00002281
+	"\"\x82\x038\x00\x00\"\x84" + // 0x22820338: 0x00002284
+	"\"\x83\x038\x00\x00\"\x85" + // 0x22830338: 0x00002285
+	"\"\x86\x038\x00\x00\"\x88" + // 0x22860338: 0x00002288
+	"\"\x87\x038\x00\x00\"\x89" + // 0x22870338: 0x00002289
+	"\"\xa2\x038\x00\x00\"\xac" + // 0x22A20338: 0x000022AC
+	"\"\xa8\x038\x00\x00\"\xad" + // 0x22A80338: 0x000022AD
+	"\"\xa9\x038\x00\x00\"\xae" + // 0x22A90338: 0x000022AE
+	"\"\xab\x038\x00\x00\"\xaf" + // 0x22AB0338: 0x000022AF
+	"\"|\x038\x00\x00\"\xe0" + // 0x227C0338: 0x000022E0
+	"\"}\x038\x00\x00\"\xe1" + // 0x227D0338: 0x000022E1
+	"\"\x91\x038\x00\x00\"\xe2" + // 0x22910338: 0x000022E2
+	"\"\x92\x038\x00\x00\"\xe3" + // 0x22920338: 0x000022E3
+	"\"\xb2\x038\x00\x00\"\xea" + // 0x22B20338: 0x000022EA
+	"\"\xb3\x038\x00\x00\"\xeb" + // 0x22B30338: 0x000022EB
+	"\"\xb4\x038\x00\x00\"\xec" + // 0x22B40338: 0x000022EC
+	"\"\xb5\x038\x00\x00\"\xed" + // 0x22B50338: 0x000022ED
+	"0K0\x99\x00\x000L" + // 0x304B3099: 0x0000304C
+	"0M0\x99\x00\x000N" + // 0x304D3099: 0x0000304E
+	"0O0\x99\x00\x000P" + // 0x304F3099: 0x00003050
+	"0Q0\x99\x00\x000R" + // 0x30513099: 0x00003052
+	"0S0\x99\x00\x000T" + // 0x30533099: 0x00003054
+	"0U0\x99\x00\x000V" + // 0x30553099: 0x00003056
+	"0W0\x99\x00\x000X" + // 0x30573099: 0x00003058
+	"0Y0\x99\x00\x000Z" + // 0x30593099: 0x0000305A
+	"0[0\x99\x00\x000\\" + // 0x305B3099: 0x0000305C
+	"0]0\x99\x00\x000^" + // 0x305D3099: 0x0000305E
+	"0_0\x99\x00\x000`" + // 0x305F3099: 0x00003060
+	"0a0\x99\x00\x000b" + // 0x30613099: 0x00003062
+	"0d0\x99\x00\x000e" + // 0x30643099: 0x00003065
+	"0f0\x99\x00\x000g" + // 0x30663099: 0x00003067
+	"0h0\x99\x00\x000i" + // 0x30683099: 0x00003069
+	"0o0\x99\x00\x000p" + // 0x306F3099: 0x00003070
+	"0o0\x9a\x00\x000q" + // 0x306F309A: 0x00003071
+	"0r0\x99\x00\x000s" + // 0x30723099: 0x00003073
+	"0r0\x9a\x00\x000t" + // 0x3072309A: 0x00003074
+	"0u0\x99\x00\x000v" + // 0x30753099: 0x00003076
+	"0u0\x9a\x00\x000w" + // 0x3075309A: 0x00003077
+	"0x0\x99\x00\x000y" + // 0x30783099: 0x00003079
+	"0x0\x9a\x00\x000z" + // 0x3078309A: 0x0000307A
+	"0{0\x99\x00\x000|" + // 0x307B3099: 0x0000307C
+	"0{0\x9a\x00\x000}" + // 0x307B309A: 0x0000307D
+	"0F0\x99\x00\x000\x94" + // 0x30463099: 0x00003094
+	"0\x9d0\x99\x00\x000\x9e" + // 0x309D3099: 0x0000309E
+	"0\xab0\x99\x00\x000\xac" + // 0x30AB3099: 0x000030AC
+	"0\xad0\x99\x00\x000\xae" + // 0x30AD3099: 0x000030AE
+	"0\xaf0\x99\x00\x000\xb0" + // 0x30AF3099: 0x000030B0
+	"0\xb10\x99\x00\x000\xb2" + // 0x30B13099: 0x000030B2
+	"0\xb30\x99\x00\x000\xb4" + // 0x30B33099: 0x000030B4
+	"0\xb50\x99\x00\x000\xb6" + // 0x30B53099: 0x000030B6
+	"0\xb70\x99\x00\x000\xb8" + // 0x30B73099: 0x000030B8
+	"0\xb90\x99\x00\x000\xba" + // 0x30B93099: 0x000030BA
+	"0\xbb0\x99\x00\x000\xbc" + // 0x30BB3099: 0x000030BC
+	"0\xbd0\x99\x00\x000\xbe" + // 0x30BD3099: 0x000030BE
+	"0\xbf0\x99\x00\x000\xc0" + // 0x30BF3099: 0x000030C0
+	"0\xc10\x99\x00\x000\xc2" + // 0x30C13099: 0x000030C2
+	"0\xc40\x99\x00\x000\xc5" + // 0x30C43099: 0x000030C5
+	"0\xc60\x99\x00\x000\xc7" + // 0x30C63099: 0x000030C7
+	"0\xc80\x99\x00\x000\xc9" + // 0x30C83099: 0x000030C9
+	"0\xcf0\x99\x00\x000\xd0" + // 0x30CF3099: 0x000030D0
+	"0\xcf0\x9a\x00\x000\xd1" + // 0x30CF309A: 0x000030D1
+	"0\xd20\x99\x00\x000\xd3" + // 0x30D23099: 0x000030D3
+	"0\xd20\x9a\x00\x000\xd4" + // 0x30D2309A: 0x000030D4
+	"0\xd50\x99\x00\x000\xd6" + // 0x30D53099: 0x000030D6
+	"0\xd50\x9a\x00\x000\xd7" + // 0x30D5309A: 0x000030D7
+	"0\xd80\x99\x00\x000\xd9" + // 0x30D83099: 0x000030D9
+	"0\xd80\x9a\x00\x000\xda" + // 0x30D8309A: 0x000030DA
+	"0\xdb0\x99\x00\x000\xdc" + // 0x30DB3099: 0x000030DC
+	"0\xdb0\x9a\x00\x000\xdd" + // 0x30DB309A: 0x000030DD
+	"0\xa60\x99\x00\x000\xf4" + // 0x30A63099: 0x000030F4
+	"0\xef0\x99\x00\x000\xf7" + // 0x30EF3099: 0x000030F7
+	"0\xf00\x99\x00\x000\xf8" + // 0x30F03099: 0x000030F8
+	"0\xf10\x99\x00\x000\xf9" + // 0x30F13099: 0x000030F9
+	"0\xf20\x99\x00\x000\xfa" + // 0x30F23099: 0x000030FA
+	"0\xfd0\x99\x00\x000\xfe" + // 0x30FD3099: 0x000030FE
+	"\x10\x99\x10\xba\x00\x01\x10\x9a" + // 0x109910BA: 0x0001109A
+	"\x10\x9b\x10\xba\x00\x01\x10\x9c" + // 0x109B10BA: 0x0001109C
+	"\x10\xa5\x10\xba\x00\x01\x10\xab" + // 0x10A510BA: 0x000110AB
+	"\x111\x11'\x00\x01\x11." + // 0x11311127: 0x0001112E
+	"\x112\x11'\x00\x01\x11/" + // 0x11321127: 0x0001112F
+	"\x13G\x13>\x00\x01\x13K" + // 0x1347133E: 0x0001134B
+	"\x13G\x13W\x00\x01\x13L" + // 0x13471357: 0x0001134C
+	"\x14\xb9\x14\xba\x00\x01\x14\xbb" + // 0x14B914BA: 0x000114BB
+	"\x14\xb9\x14\xb0\x00\x01\x14\xbc" + // 0x14B914B0: 0x000114BC
+	"\x14\xb9\x14\xbd\x00\x01\x14\xbe" + // 0x14B914BD: 0x000114BE
+	"\x15\xb8\x15\xaf\x00\x01\x15\xba" + // 0x15B815AF: 0x000115BA
+	"\x15\xb9\x15\xaf\x00\x01\x15\xbb" + // 0x15B915AF: 0x000115BB
+	"\x195\x190\x00\x01\x198" + // 0x19351930: 0x00011938
+	""
+	// Total size of tables: 56KB (57068 bytes)
diff --git a/src/vendor/modules.txt b/src/vendor/modules.txt
index 89a7c86..4de656b0 100644
--- a/src/vendor/modules.txt
+++ b/src/vendor/modules.txt
@@ -1,4 +1,4 @@
-# golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a
+# golang.org/x/crypto v0.11.1-0.20230711161743-2e82bdd1719d
 ## explicit; go 1.17
 golang.org/x/crypto/chacha20
 golang.org/x/crypto/chacha20poly1305
@@ -7,7 +7,7 @@
 golang.org/x/crypto/hkdf
 golang.org/x/crypto/internal/alias
 golang.org/x/crypto/internal/poly1305
-# golang.org/x/net v0.4.1-0.20230214201333-88ed8ca3307d
+# golang.org/x/net v0.12.1-0.20231027154334-5ca955b1789c
 ## explicit; go 1.17
 golang.org/x/net/dns/dnsmessage
 golang.org/x/net/http/httpguts
@@ -17,10 +17,10 @@
 golang.org/x/net/lif
 golang.org/x/net/nettest
 golang.org/x/net/route
-# golang.org/x/sys v0.3.0
+# golang.org/x/sys v0.10.0
 ## explicit; go 1.17
 golang.org/x/sys/cpu
-# golang.org/x/text v0.5.0
+# golang.org/x/text v0.11.0
 ## explicit; go 1.17
 golang.org/x/text/secure/bidirule
 golang.org/x/text/transform
diff --git a/test/README.md b/test/README.md
index 432d36b..1d37f2d 100644
--- a/test/README.md
+++ b/test/README.md
@@ -4,11 +4,11 @@
 
 To run just these tests, execute:
 
-    ../bin/go run run.go
+	../bin/go test cmd/internal/testdir
 
 To run just tests from specified files in this directory, execute:
 
-    ../bin/go run run.go -- file1.go file2.go ...
+	../bin/go test cmd/internal/testdir -run='Test/(file1.go|file2.go|...)'
 
 Standard library tests should be written as regular Go tests in the appropriate package.
 
diff --git a/test/arenas/smoke.go b/test/arenas/smoke.go
new file mode 100644
index 0000000..56dad53
--- /dev/null
+++ b/test/arenas/smoke.go
@@ -0,0 +1,65 @@
+// build -goexperiment arenas
+
+// Copyright 2023 The Go Authors. 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 (
+	"arena"
+	"log"
+	"reflect"
+)
+
+func main() {
+	a := arena.NewArena()
+	defer a.Free()
+
+	const iValue = 10
+
+	i := arena.New[int](a)
+	*i = iValue
+
+	if *i != iValue {
+		// This test doesn't reasonably expect this to fail. It's more likely
+		// that *i crashes for some reason. Still, why not check it.
+		log.Fatalf("bad i value: got %d, want %d", *i, iValue)
+	}
+
+	const wantLen = 125
+	const wantCap = 1912
+
+	sl := arena.MakeSlice[*int](a, wantLen, wantCap)
+	if len(sl) != wantLen {
+		log.Fatalf("bad arena slice length: got %d, want %d", len(sl), wantLen)
+	}
+	if cap(sl) != wantCap {
+		log.Fatalf("bad arena slice capacity: got %d, want %d", cap(sl), wantCap)
+	}
+	sl = sl[:cap(sl)]
+	for j := range sl {
+		sl[j] = i
+	}
+	for j := range sl {
+		if *sl[j] != iValue {
+			// This test doesn't reasonably expect this to fail. It's more likely
+			// that sl[j] crashes for some reason. Still, why not check it.
+			log.Fatalf("bad sl[j] value: got %d, want %d", *sl[j], iValue)
+		}
+	}
+
+	t := reflect.TypeOf(int(0))
+	v := reflect.ArenaNew(a, t)
+	if want := reflect.PointerTo(t); v.Type() != want {
+		log.Fatalf("unexpected type for arena-allocated value: got %s, want %s", v.Type(), want)
+	}
+	i2 := v.Interface().(*int)
+	*i2 = iValue
+
+	if *i2 != iValue {
+		// This test doesn't reasonably expect this to fail. It's more likely
+		// that *i crashes for some reason. Still, why not check it.
+		log.Fatalf("bad i2 value: got %d, want %d", *i2, iValue)
+	}
+}
diff --git a/test/bench/garbage/Makefile b/test/bench/garbage/Makefile
deleted file mode 100644
index c10ef0a..0000000
--- a/test/bench/garbage/Makefile
+++ /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.
-
-ALL=\
-	parser\
-	peano\
-	tree\
-	tree2\
-
-all: $(ALL)
-
-%: %.go
-	go build $*.go stats.go
-
-%.bench: %
-	time ./$*
-
-bench: $(addsuffix .bench, $(ALL))
-
-clean:
-	rm -f $(ALL)
-
diff --git a/test/bench/garbage/parser.go b/test/bench/garbage/parser.go
deleted file mode 100644
index 817afa9..0000000
--- a/test/bench/garbage/parser.go
+++ /dev/null
@@ -1,280 +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.
-
-// Garbage collection benchmark: parse Go packages repeatedly.
-
-package main
-
-import (
-	"flag"
-	"fmt"
-	"go/ast"
-	"go/parser"
-	"go/token"
-	"log"
-	"net/http"
-	_ "net/http/pprof"
-	"os"
-	"path"
-	"runtime"
-	"strings"
-	"time"
-)
-
-var serve = flag.String("serve", "", "serve http on this address at end")
-
-func isGoFile(dir os.FileInfo) bool {
-	return !dir.IsDir() &&
-		!strings.HasPrefix(dir.Name(), ".") && // ignore .files
-		path.Ext(dir.Name()) == ".go"
-}
-
-func isPkgFile(dir os.FileInfo) bool {
-	return isGoFile(dir) &&
-		!strings.HasSuffix(dir.Name(), "_test.go") // ignore test files
-}
-
-func pkgName(filename string) string {
-	file, err := parser.ParseFile(token.NewFileSet(), filename, nil, parser.PackageClauseOnly)
-	if err != nil || file == nil {
-		return ""
-	}
-	return file.Name.Name
-}
-
-func parseDir(dirpath string) map[string]*ast.Package {
-	// the package name is the directory name within its parent
-	// (use dirname instead of path because dirname is clean; i.e. has no trailing '/')
-	_, pkgname := path.Split(dirpath)
-
-	// filter function to select the desired .go files
-	filter := func(d os.FileInfo) bool {
-		if isPkgFile(d) {
-			// Some directories contain main packages: Only accept
-			// files that belong to the expected package so that
-			// parser.ParsePackage doesn't return "multiple packages
-			// found" errors.
-			// Additionally, accept the special package name
-			// fakePkgName if we are looking at cmd documentation.
-			name := pkgName(dirpath + "/" + d.Name())
-			return name == pkgname
-		}
-		return false
-	}
-
-	// get package AST
-	pkgs, err := parser.ParseDir(token.NewFileSet(), dirpath, filter, parser.ParseComments)
-	if err != nil {
-		println("parse", dirpath, err.Error())
-		panic("fail")
-	}
-	return pkgs
-}
-
-func main() {
-	st := new(runtime.MemStats)
-	packages = append(packages, packages...)
-	packages = append(packages, packages...)
-	n := flag.Int("n", 4, "iterations")
-	p := flag.Int("p", len(packages), "# of packages to keep in memory")
-	flag.BoolVar(&st.DebugGC, "d", st.DebugGC, "print GC debugging info (pause times)")
-	flag.Parse()
-
-	var lastParsed []map[string]*ast.Package
-	var t0 time.Time
-	var numGC uint32
-	var pauseTotalNs uint64
-	pkgroot := runtime.GOROOT() + "/src/"
-	for pass := 0; pass < 2; pass++ {
-		// Once the heap is grown to full size, reset counters.
-		// This hides the start-up pauses, which are much smaller
-		// than the normal pauses and would otherwise make
-		// the average look much better than it actually is.
-		runtime.ReadMemStats(st)
-		numGC = st.NumGC
-		pauseTotalNs = st.PauseTotalNs
-		t0 = time.Now()
-
-		for i := 0; i < *n; i++ {
-			parsed := make([]map[string]*ast.Package, *p)
-			for j := range parsed {
-				parsed[j] = parseDir(pkgroot + packages[j%len(packages)])
-			}
-			if i+1 == *n && *serve != "" {
-				lastParsed = parsed
-			}
-		}
-		runtime.GC()
-		runtime.GC()
-	}
-	t1 := time.Now()
-
-	runtime.ReadMemStats(st)
-	st.NumGC -= numGC
-	st.PauseTotalNs -= pauseTotalNs
-	fmt.Printf("Alloc=%d/%d Heap=%d Mallocs=%d PauseTime=%.3f/%d = %.3f\n",
-		st.Alloc, st.TotalAlloc,
-		st.Sys,
-		st.Mallocs, float64(st.PauseTotalNs)/1e9,
-		st.NumGC, float64(st.PauseTotalNs)/1e9/float64(st.NumGC))
-
-	/*
-		fmt.Printf("%10s %10s %10s\n", "size", "#alloc", "#free")
-		for _, s := range st.BySize {
-			fmt.Printf("%10d %10d %10d\n", s.Size, s.Mallocs, s.Frees)
-		}
-	*/
-	// Standard gotest benchmark output, collected by build dashboard.
-	gcstats("BenchmarkParser", *n, t1.Sub(t0))
-
-	if *serve != "" {
-		log.Fatal(http.ListenAndServe(*serve, nil))
-		println(lastParsed)
-	}
-}
-
-// find . -type d -not -path "./exp" -not -path "./exp/*" -printf "\t\"%p\",\n" | sort | sed "s/\.\///" | grep -v testdata
-var packages = []string{
-	"archive",
-	"archive/tar",
-	"archive/zip",
-	"bufio",
-	"builtin",
-	"bytes",
-	"compress",
-	"compress/bzip2",
-	"compress/flate",
-	"compress/gzip",
-	"compress/lzw",
-	"compress/zlib",
-	"container",
-	"container/heap",
-	"container/list",
-	"container/ring",
-	"crypto",
-	"crypto/aes",
-	"crypto/cipher",
-	"crypto/des",
-	"crypto/dsa",
-	"crypto/ecdsa",
-	"crypto/elliptic",
-	"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",
-	"database/sql",
-	"database/sql/driver",
-	"debug",
-	"debug/dwarf",
-	"debug/elf",
-	"debug/gosym",
-	"debug/macho",
-	"debug/pe",
-	"encoding",
-	"encoding/ascii85",
-	"encoding/asn1",
-	"encoding/base32",
-	"encoding/base64",
-	"encoding/binary",
-	"encoding/csv",
-	"encoding/gob",
-	"encoding/hex",
-	"encoding/json",
-	"encoding/pem",
-	"encoding/xml",
-	"errors",
-	"expvar",
-	"flag",
-	"fmt",
-	"go",
-	"go/ast",
-	"go/build",
-	"go/doc",
-	"go/format",
-	"go/parser",
-	"go/printer",
-	"go/scanner",
-	"go/token",
-	"hash",
-	"hash/adler32",
-	"hash/crc32",
-	"hash/crc64",
-	"hash/fnv",
-	"html",
-	"html/template",
-	"image",
-	"image/color",
-	"image/draw",
-	"image/gif",
-	"image/jpeg",
-	"image/png",
-	"index",
-	"index/suffixarray",
-	"io",
-	"io/ioutil",
-	"log",
-	"log/syslog",
-	"math",
-	"math/big",
-	"math/cmplx",
-	"math/rand",
-	"mime",
-	"mime/multipart",
-	"net",
-	"net/http",
-	"net/http/cgi",
-	"net/http/cookiejar",
-	"net/http/fcgi",
-	"net/http/httptest",
-	"net/http/httputil",
-	"net/http/pprof",
-	"net/mail",
-	"net/rpc",
-	"net/rpc/jsonrpc",
-	"net/smtp",
-	"net/textproto",
-	"net/url",
-	"os",
-	"os/exec",
-	"os/signal",
-	"os/user",
-	"path",
-	"path/filepath",
-	"reflect",
-	"regexp",
-	"regexp/syntax",
-	"runtime",
-	"runtime/cgo",
-	"runtime/debug",
-	"runtime/pprof",
-	"runtime/race",
-	"sort",
-	"strconv",
-	"strings",
-	"sync",
-	"sync/atomic",
-	"syscall",
-	"testing",
-	"testing/iotest",
-	"testing/quick",
-	"text",
-	"text/scanner",
-	"text/tabwriter",
-	"text/template",
-	"text/template/parse",
-	"time",
-	"unicode",
-	"unicode/utf16",
-	"unicode/utf8",
-	"unsafe",
-}
diff --git a/test/bench/garbage/peano.go b/test/bench/garbage/peano.go
deleted file mode 100644
index 6c7e523..0000000
--- a/test/bench/garbage/peano.go
+++ /dev/null
@@ -1,121 +0,0 @@
-// run
-
-// Copyright 2009 The Go Authors. 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"
-	"time"
-)
-
-type Number struct {
-	next *Number
-}
-
-// -------------------------------------
-// Peano primitives
-
-func zero() *Number { return nil }
-
-func is_zero(x *Number) bool { return x == nil }
-
-func add1(x *Number) *Number {
-	e := new(Number)
-	e.next = x
-	return e
-}
-
-func sub1(x *Number) *Number { return x.next }
-
-func add(x, y *Number) *Number {
-	if is_zero(y) {
-		return x
-	}
-
-	return add(add1(x), sub1(y))
-}
-
-func mul(x, y *Number) *Number {
-	if is_zero(x) || is_zero(y) {
-		return zero()
-	}
-
-	return add(mul(x, sub1(y)), x)
-}
-
-func fact(n *Number) *Number {
-	if is_zero(n) {
-		return add1(zero())
-	}
-
-	return mul(fact(sub1(n)), n)
-}
-
-// -------------------------------------
-// Helpers to generate/count Peano integers
-
-func gen(n int) *Number {
-	if n > 0 {
-		return add1(gen(n - 1))
-	}
-
-	return zero()
-}
-
-func count(x *Number) int {
-	if is_zero(x) {
-		return 0
-	}
-
-	return count(sub1(x)) + 1
-}
-
-func check(x *Number, expected int) {
-	var c = count(x)
-	if c != expected {
-		panic(fmt.Sprintf("error: found %d; expected %d", c, expected))
-	}
-}
-
-// -------------------------------------
-// Test basic functionality
-
-func verify() {
-	check(zero(), 0)
-	check(add1(zero()), 1)
-	check(gen(10), 10)
-
-	check(add(gen(3), zero()), 3)
-	check(add(zero(), gen(4)), 4)
-	check(add(gen(3), gen(4)), 7)
-
-	check(mul(zero(), zero()), 0)
-	check(mul(gen(3), zero()), 0)
-	check(mul(zero(), gen(4)), 0)
-	check(mul(gen(3), add1(zero())), 3)
-	check(mul(add1(zero()), gen(4)), 4)
-	check(mul(gen(3), gen(4)), 12)
-
-	check(fact(zero()), 1)
-	check(fact(add1(zero())), 1)
-	check(fact(gen(5)), 120)
-}
-
-// -------------------------------------
-// Factorial
-
-func main() {
-	t0 := time.Now()
-	verify()
-	for i := 0; i <= 9; i++ {
-		print(i, "! = ", count(fact(gen(i))), "\n")
-	}
-	runtime.GC()
-	t1 := time.Now()
-
-	gcstats("BenchmarkPeano", 1, t1.Sub(t0))
-}
diff --git a/test/bench/garbage/stats.go b/test/bench/garbage/stats.go
deleted file mode 100644
index 937e00f..0000000
--- a/test/bench/garbage/stats.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 main
-
-import (
-	"fmt"
-	"runtime"
-	"sort"
-	"time"
-)
-
-func gcstats(name string, n int, t time.Duration) {
-	st := new(runtime.MemStats)
-	runtime.ReadMemStats(st)
-	nprocs := runtime.GOMAXPROCS(-1)
-	cpus := ""
-	if nprocs != 1 {
-		cpus = fmt.Sprintf("-%d", nprocs)
-	}
-	fmt.Printf("garbage.%sMem%s Alloc=%d/%d Heap=%d NextGC=%d Mallocs=%d\n", name, cpus, st.Alloc, st.TotalAlloc, st.Sys, st.NextGC, st.Mallocs)
-	fmt.Printf("garbage.%s%s %d %d ns/op\n", name, cpus, n, t.Nanoseconds()/int64(n))
-	fmt.Printf("garbage.%sLastPause%s 1 %d ns/op\n", name, cpus, st.PauseNs[(st.NumGC-1)%uint32(len(st.PauseNs))])
-	fmt.Printf("garbage.%sPause%s %d %d ns/op\n", name, cpus, st.NumGC, int64(st.PauseTotalNs)/int64(st.NumGC))
-	nn := int(st.NumGC)
-	if nn >= len(st.PauseNs) {
-		nn = len(st.PauseNs)
-	}
-	t1, t2, t3, t4, t5 := tukey5(st.PauseNs[0:nn])
-	fmt.Printf("garbage.%sPause5%s: %d %d %d %d %d\n", name, cpus, t1, t2, t3, t4, t5)
-
-	//	fmt.Printf("garbage.%sScan: %v\n", name, st.ScanDist)
-}
-
-type T []uint64
-
-func (t T) Len() int           { return len(t) }
-func (t T) Swap(i, j int)      { t[i], t[j] = t[j], t[i] }
-func (t T) Less(i, j int) bool { return t[i] < t[j] }
-
-func tukey5(raw []uint64) (lo, q1, q2, q3, hi uint64) {
-	x := make(T, len(raw))
-	copy(x, raw)
-	sort.Sort(T(x))
-	lo = x[0]
-	q1 = x[len(x)/4]
-	q2 = x[len(x)/2]
-	q3 = x[len(x)*3/4]
-	hi = x[len(x)-1]
-	return
-}
diff --git a/test/bench/garbage/tree.go b/test/bench/garbage/tree.go
deleted file mode 100644
index 524cfeb..0000000
--- a/test/bench/garbage/tree.go
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
-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 "The Computer Language Benchmarks Game" nor the
-    name of "The Computer Language Shootout Benchmarks" 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.
-*/
-
-/* The Computer Language Benchmarks Game
- * https://benchmarksgame-team.pages.debian.net/benchmarksgame/
- *
- * contributed by The Go Authors.
- * based on C program by Kevin Carson
- */
-
-package main
-
-import (
-	"flag"
-	"fmt"
-	"time"
-)
-
-var n = flag.Int("n", 16, "depth")
-
-type Node struct {
-	item        int
-	left, right *Node
-}
-
-func bottomUpTree(item, depth int) *Node {
-	if depth <= 0 {
-		return &Node{item: item}
-	}
-	return &Node{item, bottomUpTree(2*item-1, depth-1), bottomUpTree(2*item, depth-1)}
-}
-
-func (n *Node) itemCheck() int {
-	if n.left == nil {
-		return n.item
-	}
-	return n.item + n.left.itemCheck() - n.right.itemCheck()
-}
-
-const minDepth = 4
-
-func main() {
-	flag.Parse()
-
-	t0 := time.Now()
-
-	maxDepth := *n
-	if minDepth+2 > *n {
-		maxDepth = minDepth + 2
-	}
-	stretchDepth := maxDepth + 1
-
-	check := bottomUpTree(0, stretchDepth).itemCheck()
-	fmt.Printf("stretch tree of depth %d\t check: %d\n", stretchDepth, check)
-
-	longLivedTree := bottomUpTree(0, maxDepth)
-
-	for depth := minDepth; depth <= maxDepth; depth += 2 {
-		iterations := 1 << uint(maxDepth-depth+minDepth)
-		check = 0
-
-		for i := 1; i <= iterations; i++ {
-			check += bottomUpTree(i, depth).itemCheck()
-			check += bottomUpTree(-i, depth).itemCheck()
-		}
-		fmt.Printf("%d\t trees of depth %d\t check: %d\n", iterations*2, depth, check)
-	}
-	fmt.Printf("long lived tree of depth %d\t check: %d\n", maxDepth, longLivedTree.itemCheck())
-
-	t1 := time.Now()
-
-	// Standard gotest benchmark output, collected by build dashboard.
-	gcstats("BenchmarkTree", *n, t1.Sub(t0))
-}
diff --git a/test/bench/garbage/tree2.go b/test/bench/garbage/tree2.go
deleted file mode 100644
index a70a106..0000000
--- a/test/bench/garbage/tree2.go
+++ /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.
-
-package main
-
-import (
-	"flag"
-	"fmt"
-	"log"
-	"os"
-	"runtime"
-	"runtime/pprof"
-	"time"
-	"unsafe"
-)
-
-const BranchingFactor = 4
-
-type Object struct {
-	child [BranchingFactor]*Object
-}
-
-var (
-	cpus       = flag.Int("cpus", 1, "number of cpus to use")
-	heapsize   = flag.Int64("heapsize", 100*1024*1024, "size of the heap in bytes")
-	cpuprofile = flag.String("cpuprofile", "", "write cpu profile to file")
-
-	lastPauseNs uint64 = 0
-	lastFree    uint64 = 0
-	heap        *Object
-	calls       [20]int
-	numobjects  int64
-	memstats    runtime.MemStats
-)
-
-func buildHeap() {
-	objsize := int64(unsafe.Sizeof(Object{}))
-	heap, _ = buildTree(float64(objsize), float64(*heapsize), 0)
-	fmt.Printf("*** built heap: %.0f MB; (%d objects * %d bytes)\n",
-		float64(*heapsize)/1048576, numobjects, objsize)
-}
-
-func buildTree(objsize, size float64, depth int) (*Object, float64) {
-	calls[depth]++
-	x := &Object{}
-	numobjects++
-	subtreeSize := (size - objsize) / BranchingFactor
-	alloc := objsize
-	for i := 0; i < BranchingFactor && alloc < size; i++ {
-		c, n := buildTree(objsize, subtreeSize, depth+1)
-		x.child[i] = c
-		alloc += n
-	}
-	return x, alloc
-}
-
-func gc() {
-	runtime.GC()
-	runtime.ReadMemStats(&memstats)
-	pause := memstats.PauseTotalNs
-	inuse := memstats.Alloc
-	free := memstats.TotalAlloc - inuse
-	fmt.Printf("gc pause: %8.3f ms; collect: %8.0f MB; heapsize: %8.0f MB\n",
-		float64(pause-lastPauseNs)/1e6,
-		float64(free-lastFree)/1048576,
-		float64(inuse)/1048576)
-	lastPauseNs = pause
-	lastFree = free
-}
-
-func main() {
-	flag.Parse()
-	buildHeap()
-	runtime.GOMAXPROCS(*cpus)
-	runtime.ReadMemStats(&memstats)
-	lastPauseNs = memstats.PauseTotalNs
-	lastFree = memstats.TotalAlloc - memstats.Alloc
-	if *cpuprofile != "" {
-		f, err := os.Create(*cpuprofile)
-		if err != nil {
-			log.Fatal(err)
-		}
-		pprof.StartCPUProfile(f)
-		defer pprof.StopCPUProfile()
-	}
-	const N = 10
-	var t0 time.Time
-	for i := 0; i < N; i++ {
-		t0 = time.Now()
-		gc()
-	}
-	// Standard gotest benchmark output, collected by build dashboard.
-	gcstats("BenchmarkTree2", N, time.Now().Sub(t0))
-}
diff --git a/test/bench/go1/binarytree_test.go b/test/bench/go1/binarytree_test.go
deleted file mode 100644
index e5e49d5..0000000
--- a/test/bench/go1/binarytree_test.go
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright 2011 The Go 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 benchmark, taken from the shootout, tests garbage collector
-// performance by generating and discarding large binary trees.
-
-package go1
-
-import "testing"
-
-type binaryNode struct {
-	item        int
-	left, right *binaryNode
-}
-
-func bottomUpTree(item, depth int) *binaryNode {
-	if depth <= 0 {
-		return &binaryNode{item: item}
-	}
-	return &binaryNode{item, bottomUpTree(2*item-1, depth-1), bottomUpTree(2*item, depth-1)}
-}
-
-func (n *binaryNode) itemCheck() int {
-	if n.left == nil {
-		return n.item
-	}
-	return n.item + n.left.itemCheck() - n.right.itemCheck()
-}
-
-const minDepth = 4
-
-func binarytree(n int) {
-	maxDepth := n
-	if minDepth+2 > n {
-		maxDepth = minDepth + 2
-	}
-	stretchDepth := maxDepth + 1
-
-	check := bottomUpTree(0, stretchDepth).itemCheck()
-	//fmt.Printf("stretch tree of depth %d\t check: %d\n", stretchDepth, check)
-
-	longLivedTree := bottomUpTree(0, maxDepth)
-
-	for depth := minDepth; depth <= maxDepth; depth += 2 {
-		iterations := 1 << uint(maxDepth-depth+minDepth)
-		check = 0
-
-		for i := 1; i <= iterations; i++ {
-			check += bottomUpTree(i, depth).itemCheck()
-			check += bottomUpTree(-i, depth).itemCheck()
-		}
-		//fmt.Printf("%d\t trees of depth %d\t check: %d\n", iterations*2, depth, check)
-	}
-	longLivedTree.itemCheck()
-	//fmt.Printf("long lived tree of depth %d\t check: %d\n", maxDepth, longLivedTree.itemCheck())
-}
-
-func BenchmarkBinaryTree17(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		binarytree(17)
-	}
-}
diff --git a/test/bench/go1/fannkuch_test.go b/test/bench/go1/fannkuch_test.go
deleted file mode 100644
index 0cf6115..0000000
--- a/test/bench/go1/fannkuch_test.go
+++ /dev/null
@@ -1,84 +0,0 @@
-// Copyright 2011 The Go 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 benchmark, taken from the shootout, tests array indexing
-// and array bounds elimination performance.
-
-package go1
-
-import "testing"
-
-func fannkuch(n int) int {
-	if n < 1 {
-		return 0
-	}
-
-	n1 := n - 1
-	perm := make([]int, n)
-	perm1 := make([]int, n)
-	count := make([]int, n)
-
-	for i := 0; i < n; i++ {
-		perm1[i] = i // initial (trivial) permutation
-	}
-
-	r := n
-	didpr := 0
-	flipsMax := 0
-	for {
-		if didpr < 30 {
-			didpr++
-		}
-		for ; r != 1; r-- {
-			count[r-1] = r
-		}
-
-		if perm1[0] != 0 && perm1[n1] != n1 {
-			flips := 0
-			for i := 1; i < n; i++ { // perm = perm1
-				perm[i] = perm1[i]
-			}
-			k := perm1[0] // cache perm[0] in k
-			for {         // k!=0 ==> k>0
-				for i, j := 1, k-1; i < j; i, j = i+1, j-1 {
-					perm[i], perm[j] = perm[j], perm[i]
-				}
-				flips++
-				// Now exchange k (caching perm[0]) and perm[k]... with care!
-				j := perm[k]
-				perm[k] = k
-				k = j
-				if k == 0 {
-					break
-				}
-			}
-			if flipsMax < flips {
-				flipsMax = flips
-			}
-		}
-
-		for ; r < n; r++ {
-			// rotate down perm[0..r] by one
-			perm0 := perm1[0]
-			for i := 0; i < r; i++ {
-				perm1[i] = perm1[i+1]
-			}
-			perm1[r] = perm0
-			count[r]--
-			if count[r] > 0 {
-				break
-			}
-		}
-		if r == n {
-			return flipsMax
-		}
-	}
-	return 0
-}
-
-func BenchmarkFannkuch11(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		fannkuch(11)
-	}
-}
diff --git a/test/bench/go1/fasta_test.go b/test/bench/go1/fasta_test.go
deleted file mode 100644
index f8bfbf4..0000000
--- a/test/bench/go1/fasta_test.go
+++ /dev/null
@@ -1,177 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package go1
-
-import "runtime"
-
-// Not a benchmark; input for revcomp.
-
-func makefasta() []byte {
-	var n int = 25e6
-	if runtime.GOARCH == "arm" || runtime.GOARCH == "mips" || runtime.GOARCH == "mips64" {
-		// TODO(dfc) remove this limitation after precise gc.
-		// A value of 25e6 consumes 465mb of heap on 32bit
-		// platforms, which is too much for some systems.
-		// A value of 25e5 produces a memory layout that
-		// confuses the gc on 32bit platforms. So 25e4 it is.
-		n = 25e4
-	}
-	return fasta(n)
-}
-
-func fasta(n int) []byte {
-	out := make(fastaBuffer, 0, 11*n)
-
-	iub := []fastaAcid{
-		{prob: 0.27, sym: 'a'},
-		{prob: 0.12, sym: 'c'},
-		{prob: 0.12, sym: 'g'},
-		{prob: 0.27, sym: 't'},
-		{prob: 0.02, sym: 'B'},
-		{prob: 0.02, sym: 'D'},
-		{prob: 0.02, sym: 'H'},
-		{prob: 0.02, sym: 'K'},
-		{prob: 0.02, sym: 'M'},
-		{prob: 0.02, sym: 'N'},
-		{prob: 0.02, sym: 'R'},
-		{prob: 0.02, sym: 'S'},
-		{prob: 0.02, sym: 'V'},
-		{prob: 0.02, sym: 'W'},
-		{prob: 0.02, sym: 'Y'},
-	}
-
-	homosapiens := []fastaAcid{
-		{prob: 0.3029549426680, sym: 'a'},
-		{prob: 0.1979883004921, sym: 'c'},
-		{prob: 0.1975473066391, sym: 'g'},
-		{prob: 0.3015094502008, sym: 't'},
-	}
-
-	alu := []byte(
-		"GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGG" +
-			"GAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGA" +
-			"CCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAAT" +
-			"ACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCA" +
-			"GCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGG" +
-			"AGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCC" +
-			"AGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAA")
-
-	out.WriteString(">ONE Homo sapiens alu\n")
-	fastaRepeat(&out, alu, 2*n)
-	out.WriteString(">TWO IUB ambiguity codes\n")
-	fastaRandom(&out, iub, 3*n)
-	out.WriteString(">THREE Homo sapiens frequency\n")
-	fastaRandom(&out, homosapiens, 5*n)
-	return out
-}
-
-type fastaBuffer []byte
-
-func (b *fastaBuffer) Flush() {
-	panic("flush")
-}
-
-func (b *fastaBuffer) WriteString(s string) {
-	p := b.NextWrite(len(s))
-	copy(p, s)
-}
-
-func (b *fastaBuffer) NextWrite(n int) []byte {
-	p := *b
-	if len(p)+n > cap(p) {
-		b.Flush()
-		p = *b
-	}
-	out := p[len(p) : len(p)+n]
-	*b = p[:len(p)+n]
-	return out
-}
-
-const fastaLine = 60
-
-func fastaRepeat(out *fastaBuffer, alu []byte, n int) {
-	buf := append(alu, alu...)
-	off := 0
-	for n > 0 {
-		m := n
-		if m > fastaLine {
-			m = fastaLine
-		}
-		buf1 := out.NextWrite(m + 1)
-		copy(buf1, buf[off:])
-		buf1[m] = '\n'
-		if off += m; off >= len(alu) {
-			off -= len(alu)
-		}
-		n -= m
-	}
-}
-
-const (
-	fastaLookupSize          = 4096
-	fastaLookupScale float64 = fastaLookupSize - 1
-)
-
-var fastaRand uint32 = 42
-
-type fastaAcid struct {
-	sym   byte
-	prob  float64
-	cprob float64
-	next  *fastaAcid
-}
-
-func fastaComputeLookup(acid []fastaAcid) *[fastaLookupSize]*fastaAcid {
-	var lookup [fastaLookupSize]*fastaAcid
-	var p float64
-	for i := range acid {
-		p += acid[i].prob
-		acid[i].cprob = p * fastaLookupScale
-		if i > 0 {
-			acid[i-1].next = &acid[i]
-		}
-	}
-	acid[len(acid)-1].cprob = 1.0 * fastaLookupScale
-
-	j := 0
-	for i := range lookup {
-		for acid[j].cprob < float64(i) {
-			j++
-		}
-		lookup[i] = &acid[j]
-	}
-
-	return &lookup
-}
-
-func fastaRandom(out *fastaBuffer, acid []fastaAcid, n int) {
-	const (
-		IM = 139968
-		IA = 3877
-		IC = 29573
-	)
-	lookup := fastaComputeLookup(acid)
-	for n > 0 {
-		m := n
-		if m > fastaLine {
-			m = fastaLine
-		}
-		buf := out.NextWrite(m + 1)
-		f := fastaLookupScale / IM
-		myrand := fastaRand
-		for i := 0; i < m; i++ {
-			myrand = (myrand*IA + IC) % IM
-			r := float64(int(myrand)) * f
-			a := lookup[int(r)]
-			for a.cprob < r {
-				a = a.next
-			}
-			buf[i] = a.sym
-		}
-		fastaRand = myrand
-		buf[m] = '\n'
-		n -= m
-	}
-}
diff --git a/test/bench/go1/fmt_test.go b/test/bench/go1/fmt_test.go
deleted file mode 100644
index d3c6956..0000000
--- a/test/bench/go1/fmt_test.go
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package go1
-
-// benchmark based on fmt/fmt_test.go
-
-import (
-	"bytes"
-	"fmt"
-	"testing"
-)
-
-func BenchmarkFmtFprintfEmpty(b *testing.B) {
-	var buf bytes.Buffer
-	for i := 0; i < b.N; i++ {
-		fmt.Fprintf(&buf, "")
-	}
-}
-
-func BenchmarkFmtFprintfString(b *testing.B) {
-	var buf bytes.Buffer
-	for i := 0; i < b.N; i++ {
-		buf.Reset()
-		fmt.Fprintf(&buf, "%s", "hello")
-	}
-}
-
-func BenchmarkFmtFprintfInt(b *testing.B) {
-	var buf bytes.Buffer
-	for i := 0; i < b.N; i++ {
-		buf.Reset()
-		fmt.Fprintf(&buf, "%d", 5)
-	}
-}
-
-func BenchmarkFmtFprintfIntInt(b *testing.B) {
-	var buf bytes.Buffer
-	for i := 0; i < b.N; i++ {
-		buf.Reset()
-		fmt.Fprintf(&buf, "%d %d", 5, 6)
-	}
-}
-
-func BenchmarkFmtFprintfPrefixedInt(b *testing.B) {
-	var buf bytes.Buffer
-	for i := 0; i < b.N; i++ {
-		buf.Reset()
-		fmt.Fprintf(&buf, "This is some meaningless prefix text that needs to be scanned %d", 6)
-	}
-}
-
-func BenchmarkFmtFprintfFloat(b *testing.B) {
-	var buf bytes.Buffer
-	for i := 0; i < b.N; i++ {
-		buf.Reset()
-		fmt.Fprintf(&buf, "%g", 5.23184)
-	}
-}
-
-func BenchmarkFmtManyArgs(b *testing.B) {
-	var buf bytes.Buffer
-	for i := 0; i < b.N; i++ {
-		buf.Reset()
-		fmt.Fprintf(&buf, "%2d/%2d/%2d %d:%d:%d %s %s\n", 3, 4, 5, 11, 12, 13, "hello", "world")
-	}
-}
diff --git a/test/bench/go1/go.mod b/test/bench/go1/go.mod
deleted file mode 100644
index 41f75c4..0000000
--- a/test/bench/go1/go.mod
+++ /dev/null
@@ -1,3 +0,0 @@
-module test/bench/go1
-
-go 1.12
diff --git a/test/bench/go1/gob_test.go b/test/bench/go1/gob_test.go
deleted file mode 100644
index 9fc1677..0000000
--- a/test/bench/go1/gob_test.go
+++ /dev/null
@@ -1,95 +0,0 @@
-// Copyright 2011 The Go 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 benchmark tests gob encoding and decoding performance.
-
-package go1
-
-import (
-	"bytes"
-	"encoding/gob"
-	"encoding/json"
-	"io"
-	"log"
-	"reflect"
-	"testing"
-)
-
-func makeGob(jsondata *JSONResponse) (data *JSONResponse, b []byte) {
-	data = gobResponse(jsondata)
-
-	var buf bytes.Buffer
-	if err := gob.NewEncoder(&buf).Encode(data); err != nil {
-		panic(err)
-	}
-	b = buf.Bytes()
-
-	var r JSONResponse
-	if err := gob.NewDecoder(bytes.NewBuffer(b)).Decode(&r); err != nil {
-		panic(err)
-	}
-	if !reflect.DeepEqual(data, &r) {
-		log.Printf("%v\n%v", jsondata, r)
-		b, _ := json.Marshal(&jsondata)
-		br, _ := json.Marshal(&r)
-		log.Printf("%s\n%s\n", b, br)
-		panic("gob: encode+decode lost data")
-	}
-
-	return
-}
-
-// gob turns [] into null, so make a copy of the data structure like that
-func gobResponse(r *JSONResponse) *JSONResponse {
-	return &JSONResponse{gobNode(r.Tree), r.Username}
-}
-
-func gobNode(n *JSONNode) *JSONNode {
-	n1 := new(JSONNode)
-	*n1 = *n
-	if len(n1.Kids) == 0 {
-		n1.Kids = nil
-	} else {
-		for i, k := range n1.Kids {
-			n1.Kids[i] = gobNode(k)
-		}
-	}
-	return n1
-}
-
-func gobdec(b []byte) {
-	var r JSONResponse
-	if err := gob.NewDecoder(bytes.NewBuffer(b)).Decode(&r); err != nil {
-		panic(err)
-	}
-	_ = r
-}
-
-func gobenc(data *JSONResponse) {
-	if err := gob.NewEncoder(io.Discard).Encode(data); err != nil {
-		panic(err)
-	}
-}
-
-func BenchmarkGobDecode(b *testing.B) {
-	jsonbytes := makeJsonBytes()
-	jsondata := makeJsonData(jsonbytes)
-	_, bytes := makeGob(jsondata)
-	b.ResetTimer()
-	b.SetBytes(int64(len(bytes)))
-	for i := 0; i < b.N; i++ {
-		gobdec(bytes)
-	}
-}
-
-func BenchmarkGobEncode(b *testing.B) {
-	jsonbytes := makeJsonBytes()
-	jsondata := makeJsonData(jsonbytes)
-	data, bytes := makeGob(jsondata)
-	b.ResetTimer()
-	b.SetBytes(int64(len(bytes)))
-	for i := 0; i < b.N; i++ {
-		gobenc(data)
-	}
-}
diff --git a/test/bench/go1/gzip_test.go b/test/bench/go1/gzip_test.go
deleted file mode 100644
index e73665b..0000000
--- a/test/bench/go1/gzip_test.go
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright 2011 The Go 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 benchmark tests gzip and gunzip performance.
-
-package go1
-
-import (
-	"bytes"
-	gz "compress/gzip"
-	"io"
-	"testing"
-)
-
-func makeGunzip(jsonbytes []byte) []byte {
-	return bytes.Repeat(jsonbytes, 10)
-}
-
-func makeGzip(jsongunz []byte) []byte {
-	var buf bytes.Buffer
-	c := gz.NewWriter(&buf)
-	c.Write(jsongunz)
-	c.Close()
-	return buf.Bytes()
-}
-
-func gzip(jsongunz []byte) {
-	c := gz.NewWriter(io.Discard)
-	if _, err := c.Write(jsongunz); err != nil {
-		panic(err)
-	}
-	if err := c.Close(); err != nil {
-		panic(err)
-	}
-}
-
-func gunzip(jsongz []byte) {
-	r, err := gz.NewReader(bytes.NewBuffer(jsongz))
-	if err != nil {
-		panic(err)
-	}
-	if _, err := io.Copy(io.Discard, r); err != nil {
-		panic(err)
-	}
-	r.Close()
-}
-
-func BenchmarkGzip(b *testing.B) {
-	jsonbytes := makeJsonBytes()
-	jsongunz := makeGunzip(jsonbytes)
-	b.ResetTimer()
-	b.SetBytes(int64(len(jsongunz)))
-	for i := 0; i < b.N; i++ {
-		gzip(jsongunz)
-	}
-}
-
-func BenchmarkGunzip(b *testing.B) {
-	jsonbytes := makeJsonBytes()
-	jsongunz := makeGunzip(jsonbytes)
-	jsongz := makeGzip(jsongunz)
-	b.ResetTimer()
-	b.SetBytes(int64(len(jsongunz)))
-	for i := 0; i < b.N; i++ {
-		gunzip(jsongz)
-	}
-}
diff --git a/test/bench/go1/http_test.go b/test/bench/go1/http_test.go
deleted file mode 100644
index 08583d6..0000000
--- a/test/bench/go1/http_test.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 go1
-
-import (
-	"bytes"
-	"io"
-	"net/http"
-	"net/http/httptest"
-	"testing"
-)
-
-// BenchmarkHTTPClientServer benchmarks both the HTTP client and the HTTP server,
-// on small requests.
-func BenchmarkHTTPClientServer(b *testing.B) {
-	msg := []byte("Hello world.\n")
-	ts := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
-		rw.Write(msg)
-	}))
-	defer ts.Close()
-
-	tr := &http.Transport{}
-	defer tr.CloseIdleConnections()
-	cl := &http.Client{
-		Transport: tr,
-	}
-
-	b.ResetTimer()
-
-	for i := 0; i < b.N; i++ {
-		res, err := cl.Get(ts.URL)
-		if err != nil {
-			b.Fatal("Get:", err)
-		}
-		all, err := io.ReadAll(res.Body)
-		if err != nil {
-			b.Fatal("ReadAll:", err)
-		}
-		if !bytes.Equal(all, msg) {
-			b.Fatalf("Got body %q; want %q", all, msg)
-		}
-	}
-}
diff --git a/test/bench/go1/json_test.go b/test/bench/go1/json_test.go
deleted file mode 100644
index 963127b..0000000
--- a/test/bench/go1/json_test.go
+++ /dev/null
@@ -1,86 +0,0 @@
-// Copyright 2011 The Go 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 benchmark tests JSON encoding and decoding performance.
-
-package go1
-
-import (
-	"bytes"
-	"compress/bzip2"
-	"encoding/base64"
-	"encoding/json"
-	"io"
-	"testing"
-)
-
-func makeJsonBytes() []byte {
-	var r io.Reader
-	r = bytes.NewReader(bytes.Replace(jsonbz2_base64, []byte{'\n'}, nil, -1))
-	r = base64.NewDecoder(base64.StdEncoding, r)
-	r = bzip2.NewReader(r)
-	b, err := io.ReadAll(r)
-	if err != nil {
-		panic(err)
-	}
-	return b
-}
-
-func makeJsonData(jsonbytes []byte) *JSONResponse {
-	var v JSONResponse
-	if err := json.Unmarshal(jsonbytes, &v); err != nil {
-		panic(err)
-	}
-	return &v
-}
-
-type JSONResponse struct {
-	Tree     *JSONNode `json:"tree"`
-	Username string    `json:"username"`
-}
-
-type JSONNode struct {
-	Name     string      `json:"name"`
-	Kids     []*JSONNode `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"`
-}
-
-func jsondec(bytes []byte) {
-	var r JSONResponse
-	if err := json.Unmarshal(bytes, &r); err != nil {
-		panic(err)
-	}
-	_ = r
-}
-
-func jsonenc(data *JSONResponse) {
-	buf, err := json.Marshal(data)
-	if err != nil {
-		panic(err)
-	}
-	_ = buf
-}
-
-func BenchmarkJSONEncode(b *testing.B) {
-	jsonbytes := makeJsonBytes()
-	jsondata := makeJsonData(jsonbytes)
-	b.ResetTimer()
-	b.SetBytes(int64(len(jsonbytes)))
-	for i := 0; i < b.N; i++ {
-		jsonenc(jsondata)
-	}
-}
-
-func BenchmarkJSONDecode(b *testing.B) {
-	jsonbytes := makeJsonBytes()
-	b.ResetTimer()
-	b.SetBytes(int64(len(jsonbytes)))
-	for i := 0; i < b.N; i++ {
-		jsondec(jsonbytes)
-	}
-}
diff --git a/test/bench/go1/jsondata_test.go b/test/bench/go1/jsondata_test.go
deleted file mode 100644
index 281b6ca..0000000
--- a/test/bench/go1/jsondata_test.go
+++ /dev/null
@@ -1,1819 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Input for JSON and other benchmarks.
-// This was generated by starting with a 2MB JSON file with actual data
-// about open source revision history, then compressing with bzip2 -9,
-// then encoding to base64 with openssl enc -e -base64.
-// The result is 125kB of source instead of 2MB.
-// We compile the data into the binary so that the benchmark is
-// a stand-alone binary that can be copied easily from machine to
-// machine.  json_test.go decodes this during init.
-
-package go1
-
-var jsonbz2_base64 = []byte(`
-QlpoOTFBWSZTWZ0H0LkG0bxfgFH8UAf/8D////q////6YSvJveAAAAAH3ddt7gAN
-FrKppN9gw0gA++fGB9xKkUpX0YWTENCgqzUW1tlsyMB2w9nnvNSigNyS+3cui5zA
-AAAAAAAAAI4kILu6ytuWTLBbaPXfc+A+PQEgNAG1ZMBYWnWwPoFrGjoBnYMumlUF
-UKA7NVBQgut30zzu8eM2tsoapJ7u41djLsxZarplSoJouxrdfHrHPSiqAGgkAD6D
-QfT0ABu7gG1qDtdVHVXp7vWuBoBk2wEOjKChQ5bvbh3riupXZycASbaiQEECRKib
-ZFJFtqWjR7bsGoaa1lIFPRoKVQKoJFyqbWr5OB1Aie2pobm1EJKqVBU1EE2lCg6a
-AUBV9hqL00q9btQ0J9hqu2zavWVdjI6aAusU22tNa+8m70GjRqarKRWtUDW2yFBI
-1kBrrqrxeX3AyB9AD0wAAAeZ6weqV1rVu8UVICgAAABeDn2cAAd9gAACI+7DvjHo
-j73u8X2dDXT2x6adeFOTNe7BvavozFezkV1xXtJzu8H0983QAHr5aPT42iem53fX
-23IDr7YejQNtVVZr24gGgB0VQffPXH18g9DoaDW8vt729h9bt72XsKth0ANxgodG
-iRxvYclAAAAAnpqRtgGvcbo9ABpy6aPQADRZ3aACjyox4NawKCqNdA6offa1WtPc
-fdjQUPvauprcLoPe2oaplp2w7cnOHdlF27xvPY1QU67vc8goBRttLYKaHXkPAAAA
-AAdyFFaYCVClAVSlCqVSilFUKEgoNT0CAQCBAk00g1T0jQNNPSbKADQxAJEBESIg
-Seomk9EB6mjQ0NNGgAAAAkEgkiGk0CR6U9CNNNNNPQRo0ANAaAAk9UpEQmoNNRqe
-U02o00AAADQABoACJEAlKamUCjZT9UGnqAAG1AGgAAAFRJCAQCBA0SYjTKbQmqea
-p6YU2o09Q9TT00nAlwPEuSelCeXl28B3IYIQHEwXUMSCvlAYS5LkrZn+XhHHAXZz
-FTJHAzrKZzYWC0pthA9SCmbkyVzoHbSUjhnAfBrYpwWYIB7GRjOjDQqokMbJENSO
-SBCN0WhaRhQWpVuoOLN0NPRed7eO5eW2lv5L+X/jf7EpJkEUNMJKZREogmkjMgZJ
-BiEEEliRIUKAoiaSEoDQZJBhKEZEQySQCAIIFNIMwCiSYRSYzKMkSSlI0xZMZKko
-RKlRtkmWJIrNNIBEJEYiJBhGMMkWYxRqUsmjKJMmCFJMaSmiyDSaEJtBIJpANKMN
-JEkpGQAYjLNETGUBRAlBKURgsC0wzKZhRmhiYIQZIsZCIIMiiNmFCCiSZNjI0khE
-AYSEUkjTMSZskZKRQWJoRNBI2IojZmMhTIkQEgyREEMoomDSiYxAZMECFCSKIkGg
-kIDIw2MNAlgyA0SmKWSSyIaRCSDDIkZmNGghgyAEoERokkWTA0xZBEQhmUSBGmaQ
-aQBFmRJMokwxIyRSWbAkbCUFlAhgUISJIRkySYhAxoUARCSaIJMkyiZJNBMyGRIh
-Y0komKImgMDI/038qLf/av/bWSNVEtmFRx/2aaDVmKkY0NkIRDGJEWoEGLf9g9MV
-UJWGSu0pWVpSOdWDVjQJGRSChGBGDGhNNMYYwjEsaFISGPT3TbFXk873Xq8vPa9b
-0dcco0UEPXIl/+em0IMHNYJaXBEsiKQh/7QwsC9gAauDvWtMEBWhGBIBAerIYlBU
-SzPasze15BfAyGrr284QNjGNEmaUphiMxEMwCZjAYRpMiZBMpEMkkQzIwTDu5zru
-Xd1xdQ6A6E7m7d03OLnXOxd3HBu50dl0JOhxS4HdHczuO647uuLu6650O67t3Duu
-3DucukzRKIMhsUjSQQxDIzQJgxohEkYTYkZsAxSDGCJJERhpEAygoZRESSEjMpFE
-0UpJlBkIYwoyQ7/2f9H/Py8roY3wEn8nr7+72ybZtybdqY06yp1tjGVmsmJvG48y
-89EXnvy9F6OvX0vpBSIEiSRAmgSASYSkCGBkyc5J63pgiRBNsJW2xjGmmNsf9v7R
-z1rueFmZcfXzw/zTGRYxsYm2NjbbfXD64GtivKx5t9eubzmsMTbf9rTfKRsYx7YR
-jHWL7OoAJpsFBJgyAEzSJiLHxfJKWQgSlJjGduRqRxDIoETG4wj+VgUjnMt5PXnm
-vEQwO7ojzu7lxu7uasg9T00zjrtcaG2RKIwyHx2vUcbjd0OXXvfNafFE3u3t7bu9
-TpJ1t6SKh9vi13hQUX4d307pPHt553zxxHMGb4KrbbvJGTCcNs3WmOyG2fg5vsuZ
-jMi+lacpNcvr0XeKDnafDcIvhyL7927rr7/Pzfj7qLVW5dFKIg8+fKpuxf+vfhB+
-73vWXz3qCPPfw32Mn4c/9mtONctW/fc1sYad9JYn/D1DlDPoyyc7D5bSi3ncMPNH
-bWmvm42eODHImqooiuXwn95XZlmKYKGK7KdA6lrgzZpEiUccypzKofPy4kbjq6Nh
-o/ou++j5g2i5alDG/G3Cb0yaOY3lH7wd83fLG1uQ0nDG18UHnnOOsy+Y4u2Nv5Hl
-jTCKmSJYyBhnB1Lbbafjgaat8zzctvDjPPy7e5IdyZHPSTxq/zkHjinrI5v0/nmG
-Pp+JUz4odkc9b4/cze19oRNOjG2wb+PkWtt4RRjbBsfupHPO3Mmgc18az57U+TM7
-gQsH90UPHJCZN4WsaY383qkbxxO20pI23JHbCr3ssnqkVFJG/lN5x6yQydwiaSA6
-rcgBoSxEDRKIuS1slJsq1MtS6koA5+jFGb17XFu0owrTZZSqsjrkmLVo2tSN44ac
-fvD3aWfOerth5lG/Jlkfp6bqUbOZs2FpVptDIwCuWVgqIgkgJMtDBFi+2FpRDhEI
-JAKJtPXloMoKGWpU0YvH9h2nx/hxra8/8UoaoWbia9EeoTlN7Bd5PNdcCDKemn+L
-cY2qMUXGibc0a33/wjqMN0s8PmTeeup76JA7aKr1nMbhIkn1aX4m5rTPH4aOBlTQ
-I35HXHwtJ9z1XuF9EQDwDnCS3S9W358a/E4pTeTSVvyKGWTK/n4Xp7V4dB64Ua3Q
-BIaDtzTsXpXV1k9E54ousxG/XtEhuaGmyCefTL/r3478anc78deNRjg9uchGVxVD
-Fq6cMZqIdp0ihq0xoIf1zldyBS011SFzq08qfSxV8u0cT70dZgp8ebjk800pU8m2
-s1kKdj+zvmBEEU+P0+FlzrhOf/ifG2tOsmrlp7B88bbCY9u1VFK7YavjSQ7xtE94
-3aiJb59/et60wn2vrgeV/jeNd+O/Wt/fp6dNf7iJA5QICcGyiKgpFEFQiCjEGEQC
-LBIioACSIqiCxSCqIxJIw1GQ0Ua1Vam2qYsmg1rVTbQlmjVbWbaGLbU1kWtlqWrN
-LVNNaaQICZqIhD/QiASyQCUEBKiRKRAJSUiASySKRAJSD/zAgJUghMIgEojKiCf+
-CIBP9wICfq+/889/0uxkuba/pJdybzbJvEsZ/CpEx89uGn3OONVtyYDHCGIxNyIx
-JsYgJYbH+I5RK73DuMZminldjp3e8QpDJju1QToo7pQFEpABpEV4CLQo2QicBAbo
-SEINjsMsDt9BO4nJzGstqAmgEJwhRyggJYoMJE0sJoa0zOdEgXdwiQssy4L3pzbM
-CwOaLEYFDBQKzaJCjFh2yhQOHbgLVMHXFUf7jhKTXPWsNDuEPXRHfJuLlKqls5Tx
-pCC1IgIHnTm5PeWkwwjobODcCdTCa0YoDvMlcZwvmQTkg8KC06oALrhzZqrQmQq6
-E28rdrSUxBeLkBshIKRh04g4LDdsmTCpNKSszbu9lHOoAwkmTDrOKCmSqExdOsOV
-D1XsAQpFVMukLCcGYGVFpAp4Bg0VnXFFjjdC8avBE6BepA3q6bOgot8LtHTiIlkb
-ARVEcldJoYt4Pimls9rpBzDNzeMwOdNAdSkWo4CrsTZ065yPaODXMCkcZCarR0LU
-voX1R3nDEsLtlyklMo3qrYHIguO1Ci7xRXFwJZjfTrtZfAyzUKhgJcLOIzeTvWjG
-zDE27OYME6dM3Z2kVeKcV1I4jKga0x3vCKlcUmkjRE1Zzsmxsq7L3zOnQ8wzeGDZ
-pQO0uN0NpZhcQSuVETbLL2zvKTzqjtBhwIXGaksi8rYKx2Wi6C1J3Ulb1dwqkjat
-FU6mO1F5Ii+bGnOMaOlc5EKekFDaQ9tjCU1yqcE66xRVh1ndLcBt7ThNI8LbowKP
-Md0AHRNhdYOJksYIQETYuK3ytX1UEkFHZLCghijoBdFzCgKJmlJSADdF5CnsMoIp
-pMjeqUgBrXACCcshXWsqyAgenB7IMoT6ZghKl5ljwkJTUVQuhTp3YIWgQCl8eBO7
-FTzwWGBEw8BDaLuSqMmM0wWE6QVsFIpRwmCRA128BCKpdaVunHbkyuScBsqeFjLJ
-qAw0WUUIhMN3S5Keua7Wynjnew31G8jecPcVIYxGw3trGziGoCdTHKPOEpO5732V
-4lnVA4VvKsc+R4OHHQz2JkHFdwSzeiDBUGBiQAJcznd7Z0oCmMykE5KjZuKCyKhd
-5nTSBBtu1sj6s2JCiZBgpYdOIM4luy6evBlYUYldUQQZKOoAiZL4d7fe003l07CD
-omKNzZgXiveIrzXjCZel4BcyY752rec3eRoT6jAGZAGEc3kkZQhLcVNCq+qVFSim
-BuCKZeQr5FF85WTJZzIXXwto0cB2CpntlWr0xWTfLt1yrDg8503VJAdH0uqes4bJ
-d5wsYFakMZlVS7lsEko6gj0LqyENh3rvG7qYJiQ9xoY33UthsUwRtEF6HUjtHWGA
-1q5N1HNgiI7rFa5QiEzuCDZ03KzKswfM7185zaRUkRyiUUssQSPAwlc6CAaa2KwB
-CwsOVTUrpamy4uS+mkF2pVMrpWpG7eYkYjcqSMY+pyDKhDILMmR5HGGc5ml4LJEa
-A2sxQOlwRDZ0WyiDjMTFnLRKRw6sK02ph9cZnMe8fZrmsJ0710vNY0uY4QFbSrzd
-WY7FvR2oW0ZI0zyUKMETaoJFAUTUyWuaSjAQt4DbxyqAYcj2ysQneAWKMQAWMoBB
-hIT0HPY5ne8L49gqYBFQhCXlCmzuzQImhRcjCApqiwAmbWJbzsY5reBB1xT5l5T1
-ybWy6V0tnJKrLM5WHNy+RpkM2cyZ5hebCcdg7aCc7IdY80lCFwSGCAXNmQXb2QRQ
-x7k3NRDGXELYQ1gsQhhUDum3ZE72ughHRdRDe5Te6qw1u1LB7lbNrJow7QT1uAV3
-LMgyxdGjCMORl8Gn2BQuwIUzm8BtHWJnZGBtieoICDTvKJbIMisQ2U1BCZoZlhQX
-ygQBW0jtgQdslCYNcrXVNnBA+zLTmqmqYeS9YapA12zNGgCPsUFmdoio3ByWaNXs
-7NrZuGMrSZWRJA0vOHdOWzMw8kjKrskdtyHLanDtiyJzpWVgjo+aaaAkqTKWLcdw
-xANHQyoZ1XdCK2biAxFgjnDMsxEk4wrWTKgmoae5DQbpESptb1u3Dbpe6qOAZBKa
-UBJKBZeiCwEJ0WgjFAInS4JGF6SCWBfA6F3ud3YtJTVontzKvsRDk5lipuE0+KVI
-KnHbGmhhDdShYAZ20BJi8hNs22nd3MxNWKTyqlNVdr1vFs1kiRRBRoZYJt1SAw2W
-IVY7gXmtBFNaclgFQFjwnNh/g2AZt0p2YbFHgZ1ZkUHIuCAEMTDITBEMBgx4Ecgg
-OwyuETQ7GUQsGRFZENlWXORDAZBg5I2Qg0CU0NEcuCVhf8E4pyCmHivNaJAP8Dg6
-HMU/BCCcRX/CAZi3FTsR+gqagg7gfXVQF3AFS45ig+iMnICOKROLlQG9QyjKyxqt
-rL7DL2NWEoOARpsJENtjCQigyaiVbD8RcRpvD0dJYxh4KmINWGAOAshCD2ihhCBU
-w7Rz2iEeFpgIN0kKqUcbsJC1I9OQR1ARqIJlDBA9OIaiEhhK4RqJxpaG4HNX26+L
-L2uVbzYr6uxSpDYDItapRNSDSPMC40zShplaragEHVTTzmCYzRWDaG4boqxNVpQe
-/U/8feVF+H1z3Iy2hnvDyeOt5n1QI23zarZHe9m7tUTEm75vIImeGztcNqf8/DK0
-7AS3hyuujbWlvld0RqQIdaW8VAyyAqKpJUEU5BBqICLiixEH2fZwoinThP1ruaww
-Wxs79RpIWIc1I6VkHrWTkb36HKsT8aCEdYQp8dyc8nHc5Tn1GZ9DqfXs+w6jU5vi
-5KOwjHVB4s9RJbGxesXpEnueovCTuXRSXfPMqMjxq9le4We74avJg7nrh8fkY4r3
-uTybuqrI5WCNRuBiLUVuMAR02HDRwNFmhVQC0wOxtAjoECQdIAuc+ZfaLo6O0IVM
-EV4FEtlx4W2FCCd0Phvqkylm+T5VSzgZCqK7UNZc+X11LEfD369NnPNn684h236W
-bTiIcgobiiYguzQoGj4YxXj++cs4Tz0qdHkwXXYuqOxh4RlKlgXcTb+ZT58LL54/
-X5UkWd6UwSUtKWg8ezAgn3LlVGy99KvHea5jdcQUuTpOwzdqe2VOu9t12gz7+79S
-tp9hZGnb9KZ0+UWVGOfa8PL8MePzZ2jpXPc6c8Sz56UZnuR7VyqryWOdve7uxH+f
-7i9zTaJuakt23DIbPPKW3WvwvI5hyr5WOMzSpMgcRs3ZkcLrNrzmzOP/kkQSPs/c
-fx/623+62xX7H7t/15ZmW2yT/C26fxC/1B/Nm/4vHf4Y/W83vZdxnDDNatLLf4zJ
-2SOOSTXtmh6bgfkM/aUg/9rYz+ROs5f0f7Np83tXE0ON27ynOf4eduzHucnkr/bP
-/xPo+Tm1N30cm7RXZ2cox/U5Js3cZ8ctGrXWkfP6/AuC4YHo+wmtGj+jDpRjOnhC
-Rui6MS/oi+aX3Nt6cccYzh37RNxmjpw854P83H24dWtaabtnmK/F6q09XRzP6HOT
-UEd6oETQUHmXUt2toYLMjFiMiAgDhaE2Dii0fPTcNGH7p5jf0kPg3fXkttKDMGej
-3IKP2KJOlt/R+CT7PcY3AZxsoa+WREFD5vk4TdXR6uRq+MzKxSvDrq2ak+c2275m
-d5ettnJp+4/Y+HV6qxudXLdedt6uSdTKGaMJP6jNbZZww68/M8PzplDqYusu8ZQB
-AFQUJ8y9CB2DjMriYXiyEoiFRoNAmCWWSMuP4EvGSYUfk7ut8CD78n+j+iqqihWU
-fmZb8RVjX9LiIokXhgfqc+hjbZR8xHTSG2NvltyeEkBoz+i+EBqwZMS3bqJsEaIa
-GhUYwpTgGQIwCHFSPHf9PH5soVQwNtyu3LdB4H7h7qHvPtJPgw2vhhBmwPscrZ9i
-B0ofZ8/K22LZTR+R6NBmMbWj+o8N5NK4btPxmPo3Yvl53M08zTwps2Ux8n29W7or
-ecnOTH4LDyKfk9eenmurrptb6EDAylMSyCFoPt68A+P2W2rxpvgRO7eOTE06p78T
-pM095szdT5dJNkqV9yvdk2KjRq7ZNv2M/zD1uISNH5LRt2dPbXxwgg+aSTdJarr4
-+t4IO5+isaqdYSfl2IOJ0ntA756tsBY3I66SOBHlU+0+8bWUbHdtxa1P2y83z5Pv
-NqJ29h6ymz5tztPN04yw5+OsUx767u+t4Wb68vvztvPsCb27OnbrgHffegij8Dbt
-R+cpqFnrpoO2jCj+dtrCBfwtFtxfNrZd9ZcQzVPa9qbeq8duMYmVfF+2cTONb3u2
-m+N7LwZwK24TMUPA/s1xS2PJ211vg1JfBUXQLO2tMacGtLJmttPE59YWnForCNrr
-vbv4+/xy7+NG7BfXbnqKVTuo0DMuFW6c/DBvb4i5+crr56qLSmCHWi131w0DRNem
-G8J8mWF6/BavOE5YJruAqh/e19oRd79a8j2xXHhVteYnEW9a1AvE2WHFHnr7Wf43
-p9q/GjSGtZb51XBDR5fZe/afXwzt1jTi0aTqd5pQ9xPS9+tflc68V3+R30RS3anM
-Z7/OYoK83au2vY962u/PmnmvWmcymeWxxPne1H49bc+va/KVHaqJxTgrqcN7zDZ2
-TweudXvavlknvqpsg6zC6+IavvB2enbrx754TjNRir97rpG62S7VPnth+nn9KvmF
-thTinXkTrfbYcr54eVPbFQRF11vTW9+CcB+4r3XRpMtsKWHnhn3dFDF7PYpQoLeU
-zh639UyDF5ouhQerfW+FKROlO2lJwm+UDcwvkjwQ51nx2aQ+iINt/lkDDTrmb2vr
-xryHii648Xu/tF6QHbUcIFxgYRp4+V7eaLG64b2su+ONNxKEDlYjMR1Fuhvauj8z
-eus/aeYa2iB/Va1tuuH2zjOvxxxonwsbYInfrnTPNs504yedSRkJR0jeaBvNr5mG
-nFr5TFHNub0FVE3034E+q7tfF5n54uuT4o+28bYpzjhtI6mfB4jbVMEd31VAR4vi
-GN8Tu4umaeq9qLGLNUsvpQu/8faJd34UW2pXhjvaq0NFmKDNZ7UjVrNM4aXvd5pS
-g7LW/5p7955Vtvf6tsMfFl9rs3VvkKnfvemaXnFPGd4je+Y3iU3nXv37xz8/Ot5b
-nc6a2J+dPSXnLYpvqfBk7ZifA8RiUeNNauSKONwZWKpMDsKhPt+f5X25+dAjco/6
-X52E/Ys3128FfCeI+sV1Ngs+8/j7+sqrWwKe/0ydfK2xlW+++7Sx8Nr09NQEOaq5
-Z21TVe+3euawND9LPk1eaTWOD2M1bXSfq32fH5WrqCSRodPHmm85a3Gq8/ldR8zn
-NtO6s/E5oRyyZ1pX09q7BTxk/n5j1O8Yr8nSj+qezJTO/bzuIo9vLwYbxnRYVVut
-OL7dQJYPFNnRyNDLjWmONtQBd1AxDZA39o0QEps8eiBrSOQO+M2yN/b3A0Mr9bVG
-5A42A3LcI0uBvqcxzal1tziFTfaXakSnUaaNpTxpS+3avWO1hvyyUtPUe+uu45yi
-4aeNNM2GnS0nrucvjF/OGhoOnW1aB+Lxnmzq3GyztaXeuQpomp1FUXt7Rffavj8e
-Jxqux8eyex3ftOU4rXxtxMYwPRqwXX3Rcbx8dn9s3YtPa1XrnZx3dqikI3E1b3fP
-b83aGWPme0CcoGvA1o2PWLs1K+ceH4fTFuVHzrGWGpHci+dabeFi0V6m3aE68H73
-Zw10nviGOyJI6DzqzFDysrN7Vt3elS/jFreqKx+UpRu/mfHbO2Jz7663zp9WvTov
-vvvi14Hr7KrTbRduDN4R+UTmqrtsy2L5ZVHyb3Y6t0R06bVXuuJsOJpv5TdGqPBn
-vjuRp2u8z2WyNdKcny5v9uOfk2vv7aaeetW8z7wtz15nB6WenehxSnftgbkj3tWd
-Mah+7rRbrONx6m49l1arhpoQIQzabRKaTwFVPoKPOmlsaT9tWeFUp8/XrDuFrtXT
-1Ap74Ub+kFY8KMkmQ4I7OOw17bYmTediZ0ZtqXZakoO7cey6d0rpPrCrpmfgHM/b
-a7hjUcJ7c3OM2GCCHLLJ9KNHOb1c199tbZc8EKX0o9vETvYazOKX1tnTN9u/0fij
-7WpVRTrmmb7c73x2zlpOsWq3PBNjMryyVim+k6qIHV8cZzrm1NNNtGG3WiU222+q
-WvilXLVPDTtuujYqnq92HkjtPrnhn8wfFVRtPKbMlam+ja2nZNWzVGx40FOJoI1m
-jzX8RMGuvpd/eu+lF81TFb00pDIz9nRKTd6RSnvt2s+s7+qqt/jhaRHwyffKQ/z0
-/tG3K+dUXivrmu3jC03fjSsNvPfd9sob+3xr8iPBlBljpK63v6fnbHtxKpDNFNx4
-fWXi+m1XLycVHAWwI7iooCKfX4XX8vjqgNOk/E9udJqie7fMu3gr4Snj7XtqUiPX
-k/dmGsfHvAp85erxqS/xs1bwlgkOcUNz9VxavzsJ6RvKmczE3Qfa3x8N7dfP19fV
-5zBafd0+t4Gv1r9dSf3T6+afWJ0nyP0YagjzqAokAsvA5HMvICycScGRH5DZSUA+
-4yHCgQfxOdfUK0SiI3A5uCNvta9mxHytvJydnbe2vh3ekY7Rp0aKfJeTkcPDZ8Nm
-PB3NTaen67W1s5nLDjLOzJpdra8zzbuJp5Pt6W7cnZU5vM2/Y6dMPz9e5Tcsdwed
-g3dJ1jb2DdpxJIz0Z0kNPqBsn92/s4FF+N/glGnYgij0wPhQuH0EH5P7jwhh/JyC
-zw+Z3IMdOXTp3K3ZOHCvyezHJs5atrTSjQcMZLMtxWHd4dXKNgxw4aZq3nzb+1vu
-cjpvN/b6mqqpFQxWMPRn6H4LFK8ID7PD0s4SMs9KL0KMPT9CxUqLPxoSUfQf0KPy
-Lhh9D1vz6H9jW/B0emjPs4eCR1R8HP7MbkZSDnGyW2fQzpoFHCz0g/k0/c8XzYzM
-Xg5v2dmmnecnavJvG6+L5VVNPmrir5NP/86vZ5HJ8Nnbq3mj04tjyV4Y9nm2eh0f
-qafNu7Pns6K05Gnm+zfa1ps3fD43tuO76Gt3pHDu2Z4fN0c3eclcM5W46KqvgrfL
-ZZ8Ozk5zj2t+GJ1OZux01LfBLof2MVLIb+iTTw/Qko8MWFEI2oiP1WGGjYyKLrbb
-fh6PuDD7yk3srttD0dPqECggsURwgcKHFYVt9Z+a1C4nm6Upa9L3uLtW7mx0YcK4
-Kx0dfZa/Ltw8n9hXZ89reu1qDcLLcHUQNwHtoWoGtuURwwrIGERCPzCr0EbZJDNy
-QYwp37N0hT9ZQ2foLh0PmQ4bKfLwekfRti0fBA/YfU4d3PrbbDZ6xtdCy8gjwLiJ
-ERJhI2+1B1WIF0FdF1DCwjKkl0UI4z0M6fVMf6venWbllsbtgcPvILqxNlq6efK2
-Sq6vRw6K51ebu01V9Z5ui4IUOJjUBhQUeqIhoDPBJAf0TLYPoToLip4WdGkzxt/Z
-762yzA4Qhhh4oHIv3KIDT5KmZlTKwtaWOeREM8623/B6elo8Q1JxiWAgQncQECgM
-LAiWAQRUxWNHd3dxdjkaybr2VslNjq7NlVT2j4cJ2ejho/Rk05YtfCzu1xat+Hdu
-91cvNxDspIbRFIVURFCyHQYewlUKLjAgdUHOqqFXQdDAGooOZKIyENwSUKq4sEFR
-yNRMUadp0PLpEZlE3GfqYaDKGQcHDf7nD8kmHDRh4fwWWYffjxw24caYWfk0mkeN
-D4SFGhHiVFbu2EkgtHFezxIqaWnaEdzJFsqSNEFKpZXphid250aNmnZo7ZMVlx7m
-zFVXDo03KvK3TTdqZZZ0j34LqeGyvh6K8ns4bdrequzHYrNt5jMmO7tq3Hk9GTU6
-GMOGnzTTgbO08zq5PJjdy74zObhx6M8nJu5Vc+Lbm9uVj1ezk3q17t3D0exwYMKB
-pTOURDWRGaXREECYuJhxzxhETUu8mXv9Vjp48d1lC0/f0WGgxkH1HjiPyUUeFBGO
-am8bm7o07t3Vu5lah4OzS3020qqBK4ICgQPb8h8fj69n+3hleET5+1Kk1maNSlav
-R9c8+++/Pnenwej1erxtb6HV2SCSSdrJHVYHikZUg1ZVkDtUEypDVQZTN8kDSwll
-keMwS78akNOMiJQQc3dihLlKj+oCG7aEM7oG4kZW1NVLsxIVjJxmQMVBiUTaWsgY
-DYxiQYyPuBXhdUKWrZb79D15ra7uMfLW1eW8dXOaiNhdxQslkuUzMFKgagC1Ehom
-iOOZC4AyO5qNxXMVogEhIpqSNRe4grNtR7emHctEhpNtsXLSm9xOTBmOSDYeNILY
-2DG2ibk3hUFnKtvTMXYBFsiI1xxoHjiBJg0ZhC2Vig602I1PKTNWvbUbYm/JAG0U
-aUsNNFafJHs1SpG5rY8UsGwe7VRhp+PJFmpjr15ahtvTFpqhuKWCg24WKj7kpybZ
-c6V5CsG96jMayx1GWUOgDVCIZKqhixI3lLuejpuwX0E8/UR6+vsvzdYqEqnmqYPr
-ynyiMGXW2W+XV42wNasYmujHR/B20ne7B8uftj52a23ykGf0r2Fya3xEEDcibiTQ
-0lZLgyC2ePfZkNiK8bqa+t/uN5kVHlxN3dckC7FJia9ve/Uugg2wm6UBkqXOGuys
-qBJmITKhYQIImk5o5EECZQKpHrRxXGOTi2LXQmqWh6LhdyTi01SqSQ3VOEDXmHyx
-eGS7oe6mzQZ5CDD00rOtqeKJjKBw+ee+cWoiUVDVLJ/FhK0iGh1VeKiES0TeYm9Y
-aEWwQmDQoQiRwvF1pOMzCkqwS5CmptDqzik403jShJgqi2UaBbWZmCIlgrKzuoHE
-I80UvVUMTR9bJIWy6iiIAxXukg2P4TDx8uds7uzmTTj2cu9+82j892bLO1fYjuV1
-nOX+0ET1+9s/q59/SSQJI/0pffnnpk32yWNNLZIyLEInER1S3+6lv+L1te04VnqI
-JI1eRIDos0ygqI/u84V/ySnvUfr5/o6avXhuP26/+dG413/yfDY/hOza/3m6353D
-FQf4gPLyckmNf0/Z+79v75+CaSQkY8In6aqSH03WX6Z0X9VQB/vFWq6C5csRuvBZ
-nX9ytV12MkIm7FR+DLJ9H6IBOuiLogQGQ/eRgyJJAx+aYLFFoFE+nXZEmdeEk51K
-K8zR4ejlk1Rjyd9OlGOU1IHRC4Twt1lj8fuDSl+toyn7KlPBdN9GfhbdlfyOpi2j
-7n1z3jf4hxzT5xvpenii/OQ9atPRJOV8YpWSsyBkCMSKpoqNVJ4qi6kbGS0oTp5U
-Ze+1/H5LYmU6Uu362dTHpJsyInEO5DvTRhC0noXDbUrY0aAqh/N252CZJLYxRLww
-eDIgJvhTpSsrEJ4SVDvd9S6BwlgfShNMd9KmGrWk3I52ZEqkIKJiiDZgpwVrTuGm
-0Uo/ZLXM3bFdFTPSQCOxHSpDGrWnDhd5Y05Lm5qtLILG02ERoixRXRkaboZjM9Fm
-XShtFC7OcoJwLVrbJ2vpmlco5wxxJm17X2pWtUowXbS88ViaVfl1mbDdKMZhHFFV
-CHEiCc2ed3C08Xm0T2nd6Uv1K0yITQlBsslUGWxQP4OXJVEfYPWUXA+kdcuh/+HP
-wWUH7diyuFPB1lyF6ZrDIprJE4SEZ7msK+k6P1h5hh3qskj4roZNzZTZjCbg2ePa
-UWtQoyUuGzm+j26e5Sjd6d8bPnh8J/3oPU17aMyljAcLyiBhr8j7ZOg/Q3IF/0Ta
-f6XwNY0RdbAzegLT47336Ne7qtUughSk2m77D7Kk/viknCAADCufnfnmfRa+PuZ8
-GbDsi+jRFrzw3ixPHSw07DIXufXiw4eHq9LyQfWZnFx+S0TQXRM1QT6QbNSZJj8m
-7UMbjp4V/ZPnp3lbJ4dvxkSfH+zJaG1+r41D+t7jCD0giVFEsaiSGe8yzuQcIPsg
-7JTIOFnT68Mlm/XtHO4/DVboellFEFwpf9tkkmQRHs6yXoRCkuKPxU4Z4SueGdIi
-CB3cE9RKuhrCdlwcyTChsiIXrJwrTvs9M61zkDIsOaTPnYckuRlvrVGxZx0zpzzt
-8L7s4WtdLbRACW2FaHvN2uU7i5n0qt00Kgy9iK7Jba3/3pNiLNMrM1XhIIBPZHET
-RypdGC5pZhk1rtje4i3zM6TWPeYQEE2ICad2RgNnBwoZOXY1T9NwigxKQAH9P9Hz
-7gx+I7Cg/gWYSkB3Ml8YRVoO+7qZcd04606nOv7+wkB9/5D9dwJKJD9w/pOUxtmf
-p+39YZxm/5BaSsnQxtYbRsXraiFwqdRNWIdK5L46DjXUSMMKSKJGX16puhl1MLFs
-NjnoaUBMXnCJ+Kus2EV8F1F0KGG54HeshTQt8laFCKcUvV0VSQaPOy1KydMvj2Ez
-AewDB4P7DzDchscafa/a6vq62dZRm3G2jIrBxhr3MevBrYhskfQQhIEa0BTQhzBU
-xFWQUuAIPIiFQc+2IfQGI/BwLEPA90bT/w9O6Hlgj+ABZZYIk4UKMgIv5BFETg9o
-QqCd/YV/CKsIEgWiK+Iqgr+QaKBHSWPIIpYAYOlqJTAzWgXcJAWQkSQfBkVzkTkt
-EBuCK4412dduYOlRLbTkd6BOG9mJ3lkOMIivftOjRKpUQ1n8N8AXRv85sESi9I3B
-wqNAL+SbEH87kA4Q0iLxfAXQzIiiJA+Dio0PfHBFET4KwoGEuhuF0X0+Od6iPDZB
-vqe2ZbNmwwwQNnblG4ZREfEADnQldENc+vyD2hPFPDVaTmO6ErcB2CSrJHawjBeT
-Lu1HHXecOXpfFifajXzf803to/li3IQraCMnXE7aNaF+UhNCJJ6bST1yCMSEkvrk
-EZsiJnq9YnIRyfoE3qs1+5g4qCjgAB/d3LXII3r+NecgG/A/EBhNc2cEhOijxJO0
-FJewHGBzK1YnNiLkAPBkUztU2GMpL0j31B6VEaAuiEtObw0ViA2Qo2CQrPgdgapv
-FCGKU5zwAX48rSmSGfCh0sBAp5Vw+mHYBmgyfBvQ2gE9Qiw2eCK950Urem/KrOD7
-tAApA2iLxtGRmFUGVZgNFMIQi7APICVtlUdVP5fqGLX9TEJBSYcWuJiEgyD+whr8
-Qt4j0BCvhFy3AUJAHpE2ATCfY/XP0YM68EHwJaHTWChL8gPdCT9IoJW04ShPtj4h
-rXUO1N+9eNBzh958PwJ3onum3eftLwTIIDagDw+o2Baej5qT77qlol7lfPlQODAr
-7Qiue8ErGKQIVtOQ+yuebQ9jz0QHR0XSF1f1oB0wm+nhBsV5Dgxx5TjC7ifRJgWQ
-JQKDKZ5QcF8aA+2FRB9siyFbQEtXEFsiyD1KeYp4vn1kdk65sBN3fx5t3nO/Y59A
-R189AT77u6pOAXgcINOFPg0rAnT4ODvDpDvB+Q6AjhNjrJ2a9VBRzOAGZ6eDgd4b
-NoM0UeBxPD5FreuGt6Dwo9RFdb8nAiAa2R1p49xif5Sm4cGGg5x+6ZreF2MUxiIK
-+gryR/PfnDI6Q9Gn57KlMJ5766E3pkiWtHqD0EedIKlAC3QaBfbl/j82SCLdu7yW
-v6Hmk/T9Y/qXglgiQ/aIREU3sfkhFsOhToBSbFaUQBrYeBo78wWrCIiT9D1wcVo4
-GjuBz3joxqZU7bQDFwmjB5e74MBLoK0PA4QkclbwijNF7qEEoFkFRROi0IZfN0sI
-zwihRtDz4T7ibJnxZdmKq4qOeIUAbh8KmERXb9nKQ+5QdzgDPcJjvxw6bZ3TBIWY
-SSeN4U3EZkhKxct8oIiTDi7lqOt3Kvi/tFCQEsImhN98ZBnWjLEBK6dw+FxgB1I+
-dDUAkMR8mm+NWReOPvBhDZjk4boMpjxoBGF5Lqkt7tL3kyTUNCK+PoZx3oUqB7h4
-5wEXO/lduTg4NfIqAh8ZfJSAcG/jGkuHA8qr7Ro13OwIJLia9u+yBZ0dicUAxwCA
-kEDreMjHsNGLghIQjFyrYc98oQaGSKediKrHfuebY7DkhSaKvv+X/oH7Ij+oKSLw
-2kgfoPv0+vpfWeMjRqQk6L7QtAATi0oNZJzgYxP1w4HgU8+oYPhFESAjAyvt302e
-CDaAWgGAh7Xub6oUY6dMeNnQh4yl+Nm1AA19panR4CYHnOGiidVdfdsdGvhv6Zx0
-jjJBqQawcqukBR4Ux34pXobqCIL3lHdgOad5nLqYjUZgE4QvtAltbhvPRFES+goc
-QfyAkiF/e4WiKYNUIFjKWJZA5fwJczRRibFGT6zCHofhgW8eydxvZ1UFHu97Toow
-8FguNJpiKoCc0GQAn4ceHt3K0i1feYVcihrJaNBCZJgh3FO6ENqkEW9eLD7vi6wf
-fT7OU2J7Zn4VPfXdnohaADg6HCzQSKlLKttUpsb9HGGYyM1kdbG3LRyKBaAlAEQi
-6K3SwEpXNuY3BAQX+wSMOhQK6JuJ9BbiQxBRmAuim0FUeeYULAUKioFQBh8aR3Mo
-71V1gxByA7oX2gGDQe8klFNQQNSjx5kWPD8XwbJrOHhrmPG1eVz2hyCeCzw70QRm
-PBaXfmHpq4d6Cj30CwL4FmzRhVE1Z3PXGd4oUT3RT2fXIk3Tn6hAxuw6R4ZKzAfB
-E2O4JIhAk0YDAlY3e4AHkEgAr74ycQwAnQW7rtlcpF6JZA7VNu66JrCcgjUCEFCE
-RpghIiGj2TWA7EMd0aiCjpcIQOLL43hkAKrIRD57bdINOGQ01LwiQc32iwDYCMaA
-kHwImA5vu3GtiupPVup02YPe4G+iICJJzomO2gryY5W3M5zx7DfU8YCDsEXiG6zV
-+xuOJIG8KOYoQjJHHsGD13J0uAvNmGVfCbv+KJrzyu7cZk07DszWZjii34Z5Oq4J
-YoGxovONSVdyqdDaiI5o1E9gZEO+MOknbKrd3vCGjWOSCrnI7Ux2qgrF1ozkJ12i
-qiB+Qq2iQl6eKyIKevnnG4vy6vIfKJt1EpCX9n+P6PQpAeBRKJQ1sOYCWlkXAgV6
-zM7YJl8sa21D2vb7geeO2SpmkzN+KTwlzt0iohA2AcDPLw1FWDBUJvFW9ggVk6Dx
-nW8ShTWwRlT1sHHJyMsXFDhNL6q7kI6WJJzpELbUQNVIhmsRVy0ajWqqiK9NrXLa
-rEhagikVJEOvbHSFh2axoim1j1bJkioWVpJnTIwotJdInhXvflf6SU/PPQX0bTPh
-CdsP29ywEL0SWUfTCD7EJL6ETkKMZq+XfvOV9/V1w3yP6vw8Bs00Num+z8M7mbcc
-Nyaf49zDIxUaQ2EvqlaeEBsxpWMXnJV3xw2Tk85CvjXKxcvj69eMUfMr8bW8bRbU
-onKyW5YZYTLbI2sO+23t750Nk8klcxbgYLeIcQe/QCQJFkWj+oMfqaThzaIrMI2P
-7OfFp/TvReP9gGjSGXxEeEVFAmDkEvv9VUZSkBPbMF8w/60D9GpeH1QCFw55QkLu
-z9IAXDqKnNMEC9ziBCmelf4wfDqr8bOBhgIc0RJII4qPuV5Nz9AAJ6ARU+oPi6hT
-+q8gwvYgoidW+M0fbI8rtLFtXO8iTUFlJvXeyFxmJtnkC7zuiaT8nGztzQSqBLOU
-ovW3gp+vzfBxm7PhlVblQM2bd+/Rh4dPRBvEDSXngueiAwyDAY7g52aB58+eG+XC
-rEW8lGS1QUeWOAT3cakjvwRHNevLrWRGxOBmTNeUHz5BNT4o+AkxZAgM8CgQuYt7
-U5ikqOco13h+zN5A3dAfUbWApJdeQtkMkEkG1iAUlofiG95daxu0Xul4UwF56lZ8
-3m8LyQBioWOMnxAZw8H19FHnTZSfCQ8UKukI6IKbgi2EROEVBFDkVQRmNCWiK5gK
-gjqIqofRAygkWCEQQOEBE3AUBUywFE+iCoPxHKo4qQYSR0uWSDgsC3LBC2FUgIbA
-gEIgr0IFBFEV2beEGgOV2VCEkasTeUI35YWoqjQQJBJsaVFsgnIIYIegAZiYinAC
-KCHIB8L9aSU2jqpgHDRm0jioEdaHayC8iYiN6RSgqyRLYbpYJZUhzsQdYEVBA3EU
-HoIwQQ3BFaiKBRPagNKp4YAbiYCICDIIOliTxeOOGnL2EcaOMNDMGJjKNGgchDj/
-BKwYSZqRlgLQR7nzcAWpLACURHNK7oqAsUjajiiYMTUESEVX6ICF+TFgwSIL3tKF
-+9aliQFdBBB/IK0AryCL37njuaj74l8yZNHN1lSjgfcTgmPsJRZVGcrSr8IEjldQ
-KtmKapHX0QlsIki0IuSRcABgN0Gs+4HbDqPIFBxJiVh3OSukGiQvd5nogLDQRteh
-2MyW2SI9oRhikH4T0jXdxNxJF2Xnskl3AVffHjA67x2y8y73Yo5mAE1DhsMmXJEc
-XQigaZcogCwOAJSmvkK59/AZt5r6CHoKYtZF6XRWBxO/0HFiG/lmwBS0IXvAvwXw
-uNK56cJCuiEUIhAnVsVC0oQ/LDomFtpZXfIu324pRnto5FdNUA7OBqemCvdxU76w
-rnterFGPG+6Q45tXnD6WRacT+nbNIk1JCPpi9vz6KPo0aWTYVCFR78pPNQgpwlQo
-7nZl96ldo0qhd6oAriD7PYX3YjYi6+KtyURx0Dh5o389ggNbU0B+KOiBJNO/YO34
-6a7wfKK5PBjVqgozX5yrvYe4b+g/eQESyAJYADkx6QeCQZ6hHDToVxoz61c19ymI
-QUB4ySSEGSTHhMs0Tr7Of7v5ZHrYzWRqmxy/D2PVnfrHr7nmk6vMiLt6Pfbbft76
-NqFfrnncwD0EdL8qWqmCRcAGdrsAgwQV6XyemW3csQRzF17hRM8sNaA5u41TovvJ
-lL6Jmj0Qdj3rXVUPYlIJEIbMcN6Qo+y6+Gy6V0pk2Gw6o2eXyfFnBOzAXCDYADzR
-CSnRaQYZ+hwQZ0h7sXXIQK0DQwbFchiJ7Akq/buuqEJT+FvwSPhCs1JX34emWkc1
-+0JlH7mgV6fdrze3n1BaU/HP0Ip6Az60FlmH0F+FDieRNSpsh3JnZieg899kMapx
-A2AgedvbfYhjt7fwdfgTf5O/lUCeRAZEpJHwvsvi+d3wMBEna+Z6+GGGgCoek/BW
-dQo/JYryYiLihedIULrmV2fAYIU15yOAfqwHuI8EwYI7aM8kO0X6aYygiiUvGaA5
-AqKrb3bLK3Bu/ws6awNQMldRV/OihvSGeGuLuQ5zhdKQyvBbunGHiqbSVBLCBBR3
-sJmkCunDAXHHd4eQxhEGRYdBzZu7UXXMiBb3M0jRVaMN1xw04qyJ8G6DCyAXnHwZ
-RDcJFX32jyXoosS3eitAOfuZFfqdLyQBCCB3aIfY2OMhjfbVA5gUvI4NI0ulOm0b
-1FDfrFHR10hZU+ODKMCViSStxuklLxyrOzBrvpkTD7nncH/YWN/xZ/cWB4MEWMjo
-uNq+pDjINyCJIMft7GzDNPmQMmfKO8C3BCupq3ah8aC+3PLydaANlYxbybhnNhxC
-RTyS5wfe8lJ5C60b3pGVdQBEF12XTIjMtk1B3sJLjW843JTV6tmmB3szzW8PCNWR
-3yd28o27CnITe6LTd1rriEPv+r+W/Lr2jtO7uzN3c4O+Tfc02jcUkrJR8QctADA0
-gXSiA676RwOkRHURdCHLXIqelq5LOSTVlo0mrcKsbgjhEjApzpaorkBLDgWikaMD
-WBmkEQLF3ZzJGd55Vbo6iJbSXTzOm0HEagBiaN6SrGSjgMe8kJ1BRvIDKb2rTVuv
-UjayCQnFgki2WkEJGRQCMRewEqK/x1GDBcgGSKNrCGtI59lyNKkdOrQ0UCJT/tYC
-QsXuKTErgmB/L7qWQAgjObGxtYRpoNAhObSe0Yb86I/8koc5eNsi+mHWzWtVmg20
-+QHoAlFmGJHkyHlQ13uGhptHj5jDJQi8LDIbkOBvKk72hX8sJ7ueW16GHGq4y9iI
-j3yMYtSIbDhrWwlmqZXVJRCqouUAUhKKoGCwqjpq43WTfM2qub+jk2T4GKHeyOVj
-tYdlk++2vs+/+x5NvlJOLPYmGRLWSHhDrPt8vLxjo69Xl+W2ESbJz6o+epO91qFW
-HfEcnfU/36UAcqgbZ7xi7DdKjmP6OdAd8+vBt/QtBnxhQ5Y55yjps21VoCjTyYLL
-1CSAQTQgB7K2FHCvBzdvNMXNbRQpcZKHabwUfuGc374PhwMYpCQXoDnJZi+6wEgi
-AiX71dMRdTfvYRIwt14Tk5HPrJ9sRIYwCUOkZlDd4TvtfPdgHxB1w21pzT08CJyh
-7Xc8oYd9ZaSpdBvqDRYUDhA4KO7b0HDw6Hwa7XttFLJvwUIDpRXAcDIRWHS+aUSz
-xocp5qowJUFyIVcKHx7WHevE5XHZxO+4peTzkklyu0YuiXbLEIJQUcsg9pabkI/h
-od3gISwZ4fwv1Xzc/OeFHgwtN7OIIX02fD0/FYKloiIWHTB7PYJwBsz1ERDlrZJE
-YDEhYassKO0HhjnoW2l4pHuKoFBPAi0IHcnEsMNIUlBMw4wqCkAz69wRdbCpCqYV
-IiZOnuCR9k4a5ZjWNKYUSxiFzpNQQUVwU0iIm9GbESmCr3RFQr1Uigjc4jisu4pJ
-puPoO5yOeZt1LgztDDSQtUkU+DXS9idDpAhOhoTBeU7AAikkj6CLUxCIImIIc+BM
-GVzqBtTlqMISI1Sc4AgyKiD4gcWAivyJqEowpHETkhIOIUiJAsq4g6inSDsxKRWg
-Yt+3owIGgQI7FgKRip6JhDOMYUVRT0TqgKJELhtSrt5BLVIqtKhEQLggZJ4QhiQR
-Gq0Cqrhtk6wQnTdrZdiQdLJbBMJNwoI5yOuHOpAbHCioJ0J6YhibSGY1HllCJmB4
-jcrMaFD0ewXkW4ejjFIZTGKo4JHcpSBBPtd0Qxs1vmR1w4jyA/Q8IHSlHwHq+Ee/
-WKYiGSG4HC6NiRUCLF32CGopcnwE7g8WC7D27ysTrEzHoRC9BQyGYAhkqhOQBwpF
-wUlY3keYQrRXorRFPA+GhTj5pDpAE7BLgAlbrkDpk7XdBkMCe7aC56ythMcLyB5M
-qB1IiizVK6jgSzmXFAgGIgqwIgA6EtEewNxEDMEKsvoUzTnlKA5iDnmtY0XrFdi7
-oO1avSIz4+XbDYhpYNbXls12lualldWW6Rmvp3XiSn4tr7H2DBIdge2UHx5TmHNI
-B0iD6NlFC9gO0A7Si+DLWvYUsE7DYKO6BRETeHLcg6SAFuaZ2hO+UAetihqZiOFA
-GI9nCa1gvgaJXoNNThLNEDOVQpTOKJxUxb7ouRUN5KMOSuV3bdQuokVEdMKFDQPm
-AmkMhmx1/f2bHBC8ijYJk50C6E0XqgwMJ6K9wOKaAATyGEoaSjjPogj2CyAOQRZk
-JxFQViYRM0i+Ei8gAZiihW1WUkg7JgoKGBijbIMenRopoooFjRhdB5EbkD0B3K05
-69Q6zqcbkOM1FpwnoGyJMqYsuqUojv8cZ1sKM4tO5+rCm9ZZJCE6fbttA7APREM1
-9CSIPRp816UCN9JJBPsHGQVvYZdivqFy+EDnwVAwp4cGED2KJDVUXA7yrAlwDiMK
-5xTOPCYrIplcSlucCUpqSpZoxggu32wzjnF2FlIidoAllPOFbJzD2SICWniGwEiA
-3QNDcV1ngXIKepNW41sRWLhvPSg1vwFIhjFd0VnVLBR9WMhksUIIoiX6b6aI6gwm
-eWGTazqFhRbYz6BwdaC+k9L6lESGVK0KgKYufORB0fYYzTnBemj4BH2gEaHaaIrv
-fxwDWvTnqdY6WgKUpgSoZrcEXkiQwPFhy9jFIQUORTJpUAFrhENwKQV1OLa5FQdh
-FEEkFVhFQCQVCRUlRhtibMFYg7DmjWQ0vBThVntDVh0KBEg8z0VFZ1dnlwvOxCyV
-yFg6KORRzKtb9eVaU6PsPpQ6vqCxMQymmlu1MoOofNGJrbSJqCnCG0ZkU3SmgEqj
-ljqxILxoC0NXXqMYPKZsTNGgseiQX1Um+tDnWCzEFM5KYaQwiK2hebBFtFvWbIKl
-A0gySQIKEVUFY1qkKQisEBDEYcpVOMqLjVHCwFV4coAKcGYVaniPIi0IDFCEO6py
-iK3Sb5QtwUTkeVRqSZvgtiPRiC9YmOGphARNmQ6kLF5Mm9RN5UknKirNlCkLBMDw
-LZGwouEWmYel0VvPJk0f9vqDgB1OMRmKZKIzWahOGd6NWRFAnCIXEL6B0Uc2fl5P
-sIeQC1FobsyuXXTiCpCs4yTW8WkdGVi02BNTSDmtnKPWeq9Y4twF4gEpDgiKRGKA
-rATvQoMREzE7FMRAK9ixd+aTuQoIDMYQZSoQTcKEAaDgwLsSRHUTmeBlwAjqJW12
-haMGnPdB7Rko8t7UYLQRAzDoHldEqn4zfIlR+ahTFDj40bkEs7N9ubb1r5Pkz4P7
-KmacMbzsQ60kjr28eWZT5fOlM3PVqKOMRxDR3mUfp54ZLqzcSJorg+9hoxMGzVzk
-E32DW2JtbU2qrPLpN5Xpxamjzu8wb1lW8jakUx6dIsLnCxQwpEzLzYbSCTWTEZrw
-p0sG2G5EvMnZyhFFF5tTkG1AZohFJveaYcvskKd5SozIJ5nClUEHKNtLZSLNdA29
-uDYo7sXxjC44bazLkkiHu8qrYzJnnJ2oQ08SqTZVlzXJN05fOLkVt9y4SAdhsUds
-ETItUioA4xSCJRd2ihTicgxYcOnBhN2OXCLbNOTBhkqTgh2g0U4XAdMYmaJDRnHR
-R4Lu3sBvFYojVUFkFCHnDpF0yh0wkgezuLUwW6maOnVNAne9DRbH+AAHETar2+Ft
-41Wuaum2jm5bd3WKQkCQUMg9FB/ynAQTMVeIB8oh6CKP0EAQxoFOUgEEvm7+N6n5
-WSrmuWdsdiR+nu8pv3szvUcbeXbM8Y2rYHrC4l+zyLjDfmIMYVsENPkK9m6v+lyT
-5D1f3aEZuONmS117lX6NWkjPZo21sYFwu55fns3WZHrU9bIXYmXLdyesJJhtZsyP
-8XuYeY2qPLzk8i2eMXprLlTUee8pZwCQX5F0LaW8MCu2YWI+FoVCAHBD2BOl9jQc
-oGoiISmkexUTRuFCkqlW4ITOGyomsKYHBjZrY5wncn7k8ejM3ET0XYlJU8VglCrh
-D1mEVbUgnLS6ENcMUAAwOwooznxlE7lPuAKOBPjKFlnYC6ADqLSrEfFWgZgi07lQ
-JqzHsmsUg1ZBbG7lW9a5qOWxHURNRDgomOIhVc+e4RuBqAVWjExp9ZXgMJ2l+KEV
-vOwwHQfplT6irimoKktr1mTvMn1AI6Nj8IOjnF6dHXSm3bQx3SNAEqFigcKwa6F/
-BubLQ9vcq85KsS6AydGpaE6qtgkARpz1BKuNSoGBOgBQ5A1kBa73YHOdtULNUiHq
-pDygDESZngsBXWfdQdUGGBnhtbsFzJEXO68eFC4N2M3gCnwhLjo2sgkKuQ/2GLWH
-g0I67776B8O/3enHovnD5QgD5SX19KJhml4fQjZ7+0Q5JZrA6YidgWYyY4jl8xSV
-sK0myHtg0AKidGTG7nAv1K6y5UVikEpJJeVcrzdb0hpFKVRzLlSn17KMaMkjCTLM
-QQ0FPTr0SQkXhEVoyWhvoQ9yPsIB3yDPeHXPwPw9rkIoDOGz49jxbEtALl682Rhs
-0JwxZeyKgGTMoB+YAhZz8Qa9iOMdcWRB55QGYQwryLwiXDkQLgYR9ATDOHVU8lId
-eOvOCO8PhtQKPJPaSS5gH9u2h8QPjqFhzWX1iUDkBGGRdQFORGvidcljOQQDzVBl
-TGG2UR07istKQkPDezFCw0PURkJVk1fFtUDEY3CtDUhqIFYmbk+TNC9bRLgC1B2Q
-hmoGNNdEXHTlVNGEVIJL1zKJJcvOiDo0nuITwMO7aogoMQulp1Uzxq+a5SU07uZm
-vE1CJnZZ70OyN16aWcbe7CfhB0W5dv9C6SR3sHAFMHzkGZVhljT9BtpAZFGb0IBh
-iANn4yVtUWWNjZlODZOyQgvvs4J4XQtR3HQo1zIKaCGoA3MHDeDBQRyGSIusq+Iu
-UOnPeNgBZsMVdUK/MA7M74eXN+cCMybrgKkJpI2AViGsH9t9NE2mTXEAH2u1lnrn
-3EhxUTGqz2uqtiqAhUVEQ7IFAI05ncwTfKHWxRzwOqtWiKznM7zWPbVzw4j5iIaD
-SHW84UBRM2Z3vmt3R7bnF9KAsRXK5MOIWdxy1IhO4yIpyYRjiTl6klPndDcCERED
-fIAlT9GeQO/FHYQ4IvbAcQGRxYyPYeZewWBoEX3dzOxpl0F2A6Xk4RptVObwVYvR
-JgUdJSoUBw0WAB93YAWGu4uiaiu2D0oQ6CQqYz2svjWxM5GLngT4hPu9PIny6IsR
-ZwrtKctQEYHDXdoRqg5oQ2uSsX4bCJ3NGGNxFpY9K9jfyTMPt60P9tHlUE941bvY
-0CWQSCsNUdyq41StOyY05v6ryYNfhWLruNAJjmG6yfUmfUshkQw5BAYqlskE4XZZ
-0rCcTJIRvQcxBsbodFNqdCpMhmSYhrWBxkg7XIf371jehCbUwexm4dGgVDsU5gmy
-ARYrMvjRHnRAjrEi0GYc5Y6OiwRdCNAUhDcJxjcBNIBhrUp2G6ndXbO7n1V1kivl
-8XxGjFDj0HsLjFztVYhL2gQARiRjzTgeTHDnuVV3Z6EWdEVx3o6ECjQ5rCJk6KO7
-JyyngW7FaBI8Q0m90Hkz6/HSOXw7wPcGEkM3MXsytQGxEqIOeR5s569+9oW4M1qt
-CS6KKEewSrVVQ9Z2x1nmgZsV5A2G0sh3RXUp64xy5NrrMXvw/jH9rrG9Vbajixah
-aXPO4PyEx5aentlmgg3UzPNcyQmn8jm7WpaxrIJeGcWmiyb2JVHMgUcgNYWQZ8qR
-l9nHMTRw3MikGYWca2t3QhhaYddzCOLk1SxmG3vec1U7jhzaLKrbNpl7cveuJ4GT
-VKmHNOGIKDJJCa1hZpVTd9ddzdqXynyK3LQF/1fvHvFwDEEAgG7s21nIU4+UAFqO
-BOzZXxvafGAJlsTLa0vUiRYNbsqb6jMCVwky24SylLvbtzhy4U047dzRIGiqxGqI
-kIjQID2qNEqudsyoALL7RxclL04W5tQJ5QDpK7RHXccMSIKzBREj6ROmSpdaVrt4
-adqfw1EQX0QzEHsCa660tktLxhOLIkn2OyUnq6l1++dxH9/n3L2c8+25+V4ffTlL
-WbIZ6mIoWFkymTGcEwjhh9wUdmPPecx/I04eIAX8Pfv3s8Jw7Rz+F57P356BfL1E
-2R485lDJBs/Jx45HbNb+1znkLrlQVg2n3Z3ePSJuR7bhMxd8mt5Ml7Cna2v47Av2
-ShobDchLus/dr8YRijOCfI/aoS1CEk62/SwaX0d+zqSS4TLcKBNHf3WDoO6NgvqD
-AcAR82hL32rdu4FRZaPc4BSzInYiK90PsiBLMdwBZzGeZDD4g5u3gUBylQUbarAR
-BUBIVnQqbgplEWh9veEZod7p4BlUkk5VEijGEoh0dAiX2FHNFOZcC5CaW4XLEDTI
-SgogmLJAKIqAY78+xmDgxem8eRwYA+e+7Gs7BLa59uFG8ZoVeVgy9USRkUkhykQ2
-gdhQBuNLAzEGQWz6uWiSqgkgPFhL1X2+0eYLcIcj3iZyxIJ5vmkDHss1UAY9Kwmu
-cUvi7vEKuyu0GwhCTA/yoyJyKgfHT7x1mgrpxkN4KkOQXU5C2Mg4GpNJatXYSKiD
-qMyBxJCb3pESGxB3ecBzpYGNW/OquelOkMMQhLMNvp2CszyQXClDLJFNasPABkrG
-Mqh3NC4P2iBrGm2BOkclnvhVhaRISz3tcWC4e3pxcma792AaxCl7oESlxfjoIKJ7
-a2FiDuAweHtnbwXS5c7GQzEPRFNwEFkCQFcwLhdUKEAz2x8RGVU4dMOHfKVIFIhm
-2iWtGuVMhENpjLWFciSZlotHBr+3aNL0JXa8XgqPAEd6EVpKnkMUG11O6XJWr5Yd
-e1Z9xlu5eR7mJ0wHvDupi0w9qHg0QgciAVh2IX6IXeOlrntOQTFZdBawzrREld3j
-PlFqXVGJkUYTNlohLiPDOszjjML0boQtWicWm1LQfEJgpwVZEwVAf1rpwKDiWeW2
-T44FofGx9X7FflnTv57B7RWfe+Ko/xh7BrfbW16MdhYNV5PvlOkBqBZnJhkCwWXb
-ALoENInGVVyEpJHrMH1FM5yhFxZi6xvmHQaSOdy8vvLlDQ0cip0Q10A0glmjphjg
-AtXhh5sC2DuE7wOi1ogHvNgoaKThOzB1lxriiGCeshTQvqL89HPQ+io6J1Omxss5
-Zv6kfi67wFWe2dNZFCyzJZwresuVNd9sV2RTnE5N7GjnjtGhDOLCGejhEM4VqEAY
-I4iKBkRFL4BZuzJlfc28UAYvBA0puE6ZecsRdO8V2w3M1t4YGKaBMQ9gzlCEQ22W
-BSqbwKaRdjkQHC4ixmWzxGIaJQxyRAxHr6FlXRHCtOM7Ur2KSG17m5xIKQuaUIjp
-KPU4oul3DGBPUe9XNE5SjJ7usYsvJroDQcDTaLFrKnCLS1aqHqo1vSGEySRhymq1
-0Ub2JdLjui5Cg0OgAyFwRzuTtrLIETnek84awMtCp9ESClI6GC70L6VcHG5I5VRM
-DxkDYaht0wnKaDRTpUruQQOhrJt5eU9zwnDZsQC8XLboLBCToaxiPIoixht299g1
-eAN4RdbBM3PFsKrg6ERTws9wPEE53AHu9HnSjwnUOBSNrBA70oCmilLYPe+DGDgh
-6AG94FT/EZfpoKj3EISVg8QpAngqM8vmA3SBJCvRSw6yhCJNdyVUolCjZPDeXsG9
-6bxkCEDL4kgQb0NHSghSvjbgTCRImOgQX9g5YQnK1JnCHQir06levMFKVYkHy0hY
-Iko0oj33Fl52C2vKsBIXYs0AwtC0BAVsqkEI2A51DCQ4czmzpfPFmm+b8ANnSoK6
-NuBO5JsE9wB54ZFkSd6awB68gOzx6BZkU0W41kPJp0tdlQoNWMl5ouXnVwAAOBQV
-QtmwACYSMN8JJSXDEpDDXCxMzIoc1vtUCyI83wsQowQmOdEQeu+6wUTUVTUZ6V0G
-BjiUxQLwwVYDEAdoXZoZo9PK2kLxhW04FenMCowg8QhwJC6ISvJoZdAMI4RxmXl9
-WGpq1m5QDogASIegEgDIpUXcDP6wOlBb2oB2J7FIYiZ3rGZXNIJf2atRcQbYVDkx
-Cz1D0GsdMvIO8NzFYSwtpbyZ1nGAWozaQYNERCAeNIRK/KCxiAvTnMSeKBcSoITt
-OIamG40xIsICd7QGYq7g5yMZSfYIBjSC8cIthVOmEmzl5cjRRQSFEKnIqSKUG2y0
-d4pDaUQkJ5CMiAKrdvrMLFEIFbQrfWW0hD7GB2FrFcwCpSROwIDjxYYPX3mjKzEA
-oiIESUYpR3ygcvabgvYb5JsUBDar6xA08yYdnJ3dmc8KkH6un9F+sESctLBFkQGm
-Ta0bPig+sM/K4rcNlicUhXGvkeO2yqSZ5oKmK7mzQnIIpTd6txohrPWxC+w7O7Xd
-9LQtO6uqZLhzsHZpRcxYOi1CFignFLhwDuxorIb1rsUMRBHkUkH9+wAqL2aiyPoA
-lLwUclJO0yK/pNNLRBkAgxgRJDowL+MDbn7aFmDs3Zum7TMmpl6eNnnKXjW+cIZL
-KTUDBhEK8ciqkQeV7o9nO+RdjYhyConjMQRTBWmeLu3GkKYbSDZ+NFythpRclB0u
-+MM9hIPy379/P5JvRp9K7Hh8rACxIThkR9bC/mjT79r7kMrZfL3DsQq9dPzd80jy
-omUQ0MGQccce3Fj7MWzP6VNxLUm/pBuxmmyioIE45y9suzCqg25nIpkvY49evNI1
-vdkD9EHHY32D6/Wt95wXiY14QGHv6Tupr4QlovqZsUxN/gppAOiLCJKKRQoB3Tq7
-wOD2KVRzt/RlCRyIOQHSOSr3uh4krxkmwT/BsrQ79YvUxmCBsaLPe3BE9rd44cRs
-EtHttA6UiBxgHNHMBs2t3WoqicOUCJ/pdOhWwXx0xzvjx3O0KVN84or1DOx3VbmY
-XBKjiLHHQ6cosigwdb8KKicNL3O90EPY3XkwoBs5FPf48Tw4m8Z4osEyHXmsb2fA
-Ok4HFRdQRcU7OGXaHlQhmiCfcEzj2hQNDNA6MRu4t68O2Z1CjKZpojvIZ6gSyZPH
-rL9rdnsgo9LEDXNXd1XbuepmStaOYiD4/r5zmElX0N6F0Tz3VCoRv4sIsFhYUIgI
-numbH4pN2G+IcL7ABCaNu1mNj6QkUIMAhtoR0MMPiEUwHvdwMF50hG8QYCTnhfkt
-UMX5FQVzDOdATVLQbTBOoetSGcCjNrjgN51GgITFdoNWnL64lJHbNklnJKcjAsED
-6LlEuu3zlPY6SEcibIy1pLUAd0IHMRZuIwhRlzAXsU1wRK4F5NYIkTsbgaGKAOrk
-3mDdrs9oHE5vbz3eO7IwqJxcJxDru7DPr5kZnfTpXLnLVEx7eQEex5Vc10EW/bNS
-/UN3fOWkQhgOwHG8e4Yi8HiGe47HhLNWwnMlMsrBHoa5VyAyXB8ny2xOvMcOHDgH
-b3EqkrzSChHUyZmLI+6hu7wISKUqFFKTFWDllLromzIiucDwBOQQ1kp6KGChwrGN
-IdiidKkg6IolNojcrO0BeJ7r7kxA8TUb1OsJ0DwXlDQCiVkWTKjwgEQoLqhDMXRo
-Qo9pGorE3XPYHlVcm/Fl0ZUNWuXAbPgxVowsObJtykwDZmd3Rs9kF7ovtgP9gQ+4
-ImoCUYDVbTqWeNIfHhQ3fcGSykKPKGvzG0gw0ZETg97odgi+CtWJvpYu2qwoTAIs
-E9R6CGlAcEl9tTTwETIhk6KNV2KAPhQLimtCFryG/Hiw3nYgO3u3TfEJHQuFVBHi
-QGsiLqgzs4bdm1MO8CUwBqvDVp0jQlTrbg64FHW97NcVIgioHQCAjzim4h2byc6c
-ANEWA7Wm3xWoYIRbEHeZqnzzDMAxmjmtCjoyJRko4E6qJSoabUiR5UHY4rwkhjGi
-57nGCJQGyYa6EIE1ZkbQuFKKxvM0KGlAUTD2PCxzTTr3sa2oAwP2Ie5M1JRb4eh8
-NazCTDn7w1nJjXI8EDCKsUADgQVYSIv0oS9b+UA6gPIs1SOiIhCIbAeri0sZgp2q
-Cjt1qVoBinB93WUFd3i+GNTr0BMoqCtDIo66aNKIkZtiCtBFYTxRAkbRGHW4E2Qa
-wGELRMBSlDORfaNHjJo8HetTIRdgB0R/fXAbO2dWJb6DfUEsipYiw5A0GnF8Ezhv
-GlTxeCaEA4SjJdyifLMm9GUIqQiABhBNrSrnBJZwcLnsUPG8AVmRARIaJRIAl2Aq
-vN8GsE1zgnAAG4OQm/dxkQHKoewTW3RsFeU7RIFDvSeKq6tmLIwK8gvYW2oipkRT
-wRjRc2uNOhMZYE5yw8o4PRldld0CRW1Do6zyeWGLAfbpCqPTGDSqcoJXE1eKBT20
-VES/Gir1g0EQCpg7m5ZtoK5GATGOZsXKcwCUdiYw78huOate6CDObwFxCKBgXHBB
-V6vNFaO1koc5AG7nTRtcl9SatzUT+2esG3qOOQchoqjI0MZiYEGiTyVZp67hPaez
-0Y0m6xKBzy6R5ZAO9vJiMqshjhrIky5HVSaeZ5qEyNVLWOJtWG+4jGMGDZuXubu+
-1BVxAySGWyePnaGc7uXgXUFUo7J3BHWdzfN0ndx97DRHhMuD3FIbtcmDu9FIUiHM
-wvJzV1rl7V3DAElvIjuzuAN5aVFegjAg8oRCh3gtOg4EUlSNQ+g+YCsNL0DFoWiB
-8GhSYOOE2b5zZHnFEUAwcmIWCMHBxMSoJhWMWrtE4EJmAmGLhxoTvSHCijrgpjFw
-YaJ00WnSJr+RmC5jFqtEbUiI3kQFaXgg7vKLYF/fBgwaV+EnRk9XQKQPOgkBdnA8
-kKDUtNQ28kWcA2LCiCujWK5nSsg+u2au4siUCIIuFgTFpAqiDAnZW7L63Tx5sg/t
-IR5eMo5HINaaOXDMrHyG8ytg+NvLtlHBkBo9kRnrKYt8/qyVqWjj5VEqVy3GpUqV
-hixKBqJGzkfhHgoFl/X1yrlEscB5vLEAKPAYyGQRirBKEZm6RZfA9cJGIMRHO5ca
-CEW/DnIynaC2XohJQkB3yhFrMFq3qxHJ4+QOtEUb2wG1dJBDDTr2sZrvJ4RcRMbT
-qH2Jdooaxt0NjDiScucKju2YzYaBBzvUkkz7Rs5QxX2gwjkdYD4UtQubOAigAFmX
-wNXZ4di59KNNkgtapzDO5Ze1RNDg3lGlzmLiBgSsl48e7xxrPEEVA8DigDOnCoWC
-NyRTfSavpnxLQ91Rqpqq7DJKoyD2FuCLkgrmASASJuqhEdivR0jzeV9CZNSuy7ox
-U34bo3ZBM43NBAmhDigDK71FQEKZjWNaenQQjAhUwtFmR3diUG9KvqSEILrtcrnK
-JYMYsRyZAMUMhxGC3SmHeUddC8aQDaajNAGHbXfMJnKQ3Io5u809jIeOAiCmGwEc
-SGxFf2Mh3Ck7Q8NmAQs8MQPGwLfoDFgfOCTl3U4o3sLxM3kkQktElpUOIQi8KGes
-JJoQV1lFdBdVKBU8i65cXjg3ziOG1RVyGUA5EA1Bz2PdlZvXiVd3sCFzpi7ZkuuA
-okzCH5e60sadzfeQCtFe9t3jHrFGwPRHJzHlWiIzEmgstR6IY+MDjh98XwynDQJ9
-BcV2odeecqlvFnFC/t9u3NHjnIqGa7bYikVnM+yf5vO/or7fvUJSIr379aG/2n64
-/p2BO0/o9sxrOt3vIpd9x5yvc+etFPveVHuePsUB3DIaidl4CxRx010k46whEN0I
-g9O0ug506JYDlFzQbuZEuMBAWvO6IBV8LQl756E4B76UHCsGLzEOHBSd+XvXk9WI
-YMbfg56ndwHELY0vRDPXRQ99d6bL5OdJIUUzbJDqWMfi11tQANmXKblIsgFamLRx
-GwxzOeJQdSQi75cWKugYgDTZ3sYwfDRyoBTFJzhNZdKia3kOBcotQFEQCbS2nCSC
-TtEiEuncq5ywL4jCuAjum3CYQzZnvAElVp2RRCOSGjCgOCgk5JdEY3YqtbGzSJKS
-UdKYzo16eoPENGLo0phETPJZ6OIkAK9m+kPCOQTXKwGmFeO3Qo9mYJjmt47wpZ4n
-OUCpkBXxs5+EADfPu0KwMIEgyIE6Rn15vJ9n2j32MTvEFNRG+O5FKG2lrAqyh+Tf
-Rzh4eWFJaDwsQTEaSEdaoYgZ1LlWfjUAeC8q2dWnJ0LQ8IrFg6vYcrdprGOfYLx4
-1uAB00NBrexzAOhxEV0hJgfdnNpAR2yetGXXTyUK7POeMFSwUcyK0k54TYZ3BFZc
-82vsHiaF0rspFEpTTqjrGMohOJwo131kTcrGNoxl7VJWqRTYNtAAJC7V+xyyGxzg
-D6IYN9WtIiQNBELyUK0RY7CBDsyDhV4eNdSOX7wMOkXgGQkRysCNmAEPpdYUaOma
-XGtvRVaKBTpnHMGXsHRzNvcHtrkV4qMS3LQYC7AFDRgeIQXw4+CQaigKJZLolFEe
-ynETG9VkDEWb3PCLQWZvtb1uyQ9OCb2ljqdYeYVQUVrlhSmZCCLoCzeq3qihdKlC
-FCVu9GdtanaDaeoee8Gh0XfV746AG0mFR3grOkNaEV4oAxcwugi+5mLavDgNyeab
-aPNUAdaRx6GueEE8UgBraaEPEBA90Hd0IoiYKzzLeyC+QP86S24oNGgPN7VEZLkc
-3KKB9yaO3suM7dsqIyXBAyaPJIVawzuyNy8Uis1TN6MwDW+Sc8Jp63uyww2NEo+W
-pXWbpGdzmc2qkqcY5CJNMqipmJnZ7lPXMBYk5A0CO8LEGgRCLCyFEGqDni6GFwh4
-ISrK96I0lzDiiuVYcpktYea5V0fSBQQ4HLSCYxVJEIpIEG1ivgPWGQ9zRCT5pzks
-lUdNyhMqyFLVbXZ+dbaAL5MolnGQ0f2Y0lbErTW9N9zvnf1PL7QhIQj5Qqg9+9Ze
-cP2k9FIfAnPPeCQEemCDu+PpovnNLGt2xn12fm+7k++eYUe5zI3I85qKYoJjmjnl
-nmGtQxhZ8OrjWLs29chu705lyXsj00pO0r01isVaNX6Hs8cRtAzPRBUpl8Xo2aUU
-RMFSH1bMAjgAzlpfCL5AHePjDzgQW5sEzApAHGDajlxaEJMRENKpBhNAm92ON0Jo
-cKOslyv1CmpWvaQTDp2e7sgwMWOxFETVedrRILOecthi4+kHbXO7UCGYShLGHMPL
-BFyJnklnbddyTMMgm68FBsVzHACN16/QBHAADr0hyZ57ivEsZjdscOB4MukOoq75
-3Sm6oznxvBWSoYDs0mM85hVF3AUJAQhIC+IAnAQ0nYeBojTtDDu9fb2ZgfOvvEtI
-Ir4U3SSAbviqYgJSp4BnTGwbatDG9A3mGF9hEO+hcZwvmsmKw4IUUYSm04b969eJ
-yhd9UFNe3iSa87znSZ8uMCA9unXVOthwgCtrI694ULz3RAeRPJ0dGGH4cQq8+E1k
-N2XKOIV8b7t0k3pInQ2SYhUaCSxLkRMIbumyj4sTVz8/OCjnFqV6iuYCrEQETZhg
-aTaO1M91eVU+0dN5lIKE0hY+6ZhdH8xPatSu9IGjiSBRxdlYhnVgx3DM3OmAAPUh
-oivOGZEA50UKDKlBGKmuKZHM7ZnaIrey9kZzbWmTBux5hLriaXv3sCjh3RSQN2Km
-seQirWUXffY2PUwR4ix73JkV2Xnrhe5wc7ATvBMNCGsQ9s1jt3XLtQAW0gIAsK7i
-GYMN4XZoBFGRARR6qCjNIi9RgC+TuutUGw5urUrW9IBs3WmZh5j0JAQtReBHKKCw
-Ao1BYPjdMlMyTuA3z3s5HrzxCD7DNUpI9NKK1QCbU3u6DYiKaA7sOUSYFvgSL2GV
-56raInCNge3z1vokDQ4oBA7DVZChDpWQ6HOcrY+5Qi5tmkDUUFPEQNwVKiIBqChg
-igm4JIiXEAJEBKiKBIihiUjIdguH3TxtEV8CLnCZZJXuZrns5yGzNcQqb5nRD8Kf
-Ejj1uLimHfFsXzlUZzvk7zxYPeGzkRdgYzYoe7Nc34mq1NfS0+Tpc572vBToIi+h
-NC8Ksk0wShGEgp3jOt0s2159erxfPx1eTb02DQXSuDB5AkTVTpTmMjNgcOdrKEzr
-tc4aYgDJqgdKhmhE3HZulPmAHB7632oFlcTlmCvKgosDR7ft7TOgZfTYJwR7AXuW
-/S8+gIFeKNjkv3u7oLzAyBFiIY4bJOh4OuYdqgOIWvESJAdRUwkRH0TBzeSHfdN6
-Bz4E9oSSCWPhUXvDkFmbZ2uSLokHIEKenMqeTFXgg3poKBEk9zF2SbQhJap4uGJJ
-FC6V1rXoCFhRw7YcnMjkezOEULe98ME6Ds0IYzERWbF33DHNcyL7qBnaeKKU8Wx9
-AYMaYwHMmO44OFPK1nebx24PdpQEPFOIOCGGRgnfbPFFecB7CSMybA7NNoCJdWkq
-A6uxgQHTSlzjN02jfYhsKEJKfK3grm8IX6/ZCr04RBTyJ2sbuCdybNeEICJ26MbJ
-jeDS6wgqPaR9ormfdmFDLWdBF0bbY2212EiKqJfXchQkdNNXrLktUifqXfCq84+8
-Z6VhYN5i5hktLGeDvDyUvWWAs27y4SHHMOtg0Rag4RHHJZJzJpVzqEypuBMu2xKI
-MQEgIgDMNB440aFxBiGgVIhdjaNkyK8RRKsepNlmwLGE3pI5dmBEqgxMdV0KaHO8
-HhyQ2xG2KGDGNoGzBt7biE+kQ6Bod7WXByC2xtI4zTaLsEoGd3XlmZdylWF1alnb
-M69mJMgnkxqru4Oogy+Ri7zgqVzMxct3GGZgXGSdkzJjhyAuE2PZ723DJwTyMnjh
-l3tHY5VDpUieCoJmSC8uhRWOsIvHrs3IcXRWXW5dAv7/778fUJpA9gUVtiDse9fX
-eLqjFjg9tC9YHmeTlFWicKAUpOimCqgEtGlSNGcpe3u66YHC5aNSJLww2kUhcBCo
-sQJBzkAYmK7l1EZTiK2JEzDnWILQWZzI5NHO5yHsQScKeLA3Y1UxANcWcBcAXTZC
-nG3WEshvETCEE/bPauJ2LcYYpkGUUtAj4AMoK/tv6dyS4In1VQtIbiS0kHqwagwE
-s2PM5itnuLiqWW680Rhkknpn2RxZA/NquFxL9qJ+MWTj/aqbZM1Eg28nmVVm5HKs
-lPLjlU2yZl+lLy2b+bKSNUYSElldBP7yb+gMMPeIR9GJowRgkgRoYVdqHQlwIDLQ
-aiI6H1XmnDYFAee304yulhRgMIl8rODvjPsYDh4FRB4lS0XTd85zYMBdO9uA1XQj
-EQiIrzFbmDjy+83gvNdxScSEU2bnSmgAjjhZ0eHKQtVyg3vI5fSCEKUQLGWCcN64
-SoBE1gka0aWw7IlYUoJeMdqQ5ytWEITjsqzKm8ZQESwE6E2CN4IIUSEnUYdM0vGl
-bHppfLXOIXBTSfWIgFSl6IChy+B0e4/JZIPYtHBc8xqqNyEaYZAWKNvfjpvJ6pXN
-iRCGxlbePrTJreU3HXYA2d8CBSRKa51BpHeF0vGi5yH3vMvA8hjcyHuijgTurUuj
-QcspGgZqbDJsCwLljxYqwh0UedgzggA1oQPI1qSzDKyyTLBusjazKdKbN8Mpiiht
-tahHCFFJFECD5lOaLBoYNnSA5Vo0uVRGun3s3jbMCD8MAOHpiyBtrvGjhr1I4Kam
-hC90hDDgrxsCgbMgmSDrjyPJSVi0W46roi+Blde3oaM85BCOMlkvxXOBKzLEV9tx
-jdKcCx5V102vHRvAEBovGic6QBeiErtETJWKgpIgxvYmMdZt+YQ8c1CsakICg2WZ
-YJ1wKg5NIYcsHI7TKYIG9UiK5Dh3nMiYQyjsFTApEA2cmsjhUIqrYHeoS28gi1UT
-O+eZXGRAHUG1Gwk33qXWInhbyo5dSTqBDuQtgRSK2UpGW9OB04oooTkj1I1XpEzE
-sEzSF8gCdoVyiYDkYCLfSn0SyX2hCQQsiaxSyGKpCEVn+T+7ACroi7X8aJopBWVZ
-ZWHIQaTx4SNUeLDFSxevebd+cHKoaR+Uldj4hZiyxAxiEJPs55pQEVzsqkE5E3EK
-C8Zrl12Z6ZyL3XJIIiYtC1Axc5KDSj612cHXeoDiFrcpuKKB6LCLGCsgEWAcjIYi
-7hqF7Haj4908uyiAKrcawQQ5bsgLte4FvgR3kPuHtlEgneUBi6RqG4DiDmJiBIgS
-VKzW6RQTsDZDRB7vFB/Npbn3thjxnOfz03l8o4iPr5vcTXayIrevu4elRUVaMYKB
-TVWh4hpU3OBfMUdpqaMvN5RfQRHEA5SRsCqgNvSaSWAjxg2Sce8tmpLwQTzaEJKY
-a7vw4DMq4BBwDCYqTySZ5Y4qUEBqrTyjRBdDSeJIR3x93G24dW0Fsfb52b53LqcB
-LxkrVu+jOgAOVeWKSAPYajZnWDo8DQrwVXMRLreCHM8HdKQ7MnILkIj3MoONh0TW
-CXGY8bOCBgAXDflHcvJbxkD4icpcbMiA0ObDPeZMm9qh4TsxeYSrNdsERNogpnNA
-iWcLBMk3AFNaaFs84CFDeDFXxodhl7a9MyVyMFFD0AIGiNGCvoSCLqpw0errcmtJ
-ZMaVMLAkEC6A0HNHB9bcXzSDliqUfebISAiIRkyhvuGM41wC0GZ9e14N0k1dvH2j
-IIzL0HDgOgo2Teq2QOrLViXLanCQRVQkcYimjkTcFagkgFwMQzjIhkESKoRYDARO
-OUM3MEMWezt6GgSuFhS2HQXOveJgcUGzsH1FZhnVaE8D1kRDjrF+riAwE0VbuVvu
-Wx0Vo0Ivo3snYbRflxgcfJwR3m0ICx85dsSDvT3cZ29Q4CWGBQLggyCKEiARitqr
-sNm0fTrW3Krxa102dakYpVhqwhVCrC2SGOlkRk1UlqBaSVYVJYN7ERi1FAbW+G3z
-51re5VjVbm5W5UlbmrUmM9t/6/T6vv9Po7vhq+xJDxqrZJCSN4A9ebXxyczXxmoN
-33VoVPS3BLDLLHbi5spPNZK0uCZvZgZzc23MBvtLdad1ruTZJGVJwaelJw113fR8
-rnExqR0PrSFjAyjjVUETBCGwkwwK3s287kNjE+yu0Hbm242i5VRLlk0STTSgxaFK
-RQ77zTcyWsiGy8yIrLiHHJjtG1A2Yw3W9UlzdFd2HcNCqkQgyani4Bu3NroVFnYL
-2HzDRFdvTmig2HcOnFxATrA0TnGma3YZz0ymbsQAYJGBFbqwZSEku3x21FBfCArF
-0wi6MyRrQQhzxXZCortLApgcocDruDxkuASSjkkCRHHVa1oVlDu7SymYTanF4+3W
-eROwxPvSBh9NNJ8ik1JAnwJivP2b/k6eXnnoQc+e3REtcmUhKCgg9oIgj3cO94cZ
-1/yZZPYXmLsEVzL9wyayYqdoLf7u7cMaiHlnOXVcjK1tFvlVLZVUn6CtS/Dc2MGy
-jQgfhC2Kdjr3P4oF82DpTA7dJI8fmoIQcC1skeRzKgLQfdKJKWsxDeDRAOkVD1Uj
-6REe5pkkFtcBVDyBmsYcJiDPKL4QYIAKg3pFBYsEheQysfqhKb7Z5Wjm10jpNiZp
-B5IyQBQMUV05k5WF025JblIlxOjYPTSQS14ht99a4g4RAIMEXBQ9VYdUOnAHboCb
-AM8xBqUidwUIqCaNuDndlLcheCQRzyDZsza6jpcC8J5t93uI52DOCUmxyBWG6xjU
-DfvcQN2R3loD2RQpUCyjb0Nnj8jM44gOI4HkYOhJNFBUaBwiiugHBtgmVWWcPJ2v
-AGlYg8pB1knDeEQyYzoFW+nZieSuAOXHdpQnYHIIvsnV62gW62oGOQSq0ZHQmkz6
-ve09eR6+As6PaDEAPBAjCRxHiizSKSWE3lI8fDOCDmGnmVpNbi8eUVoBcnjVYXJH
-Wy5Y+Ig8gsiDUDTA6xDbTXjDHGKyNg20+8AoKRpUzjVgeIneyymHNIhlOlRveBNb
-AyNu+YZy5q7JQKKSSPDgYkgOZ54N9vTDVhqc6UhuwvCADsV5z0KRpEITXj4+mgml
-oIZg4a71Zlm7m0gkdp4U3zAnK2iHrqjsxi8S8sDdGDo9ucdGhjq81Jfa1MiJSKcB
-A701FV6aw8Hp7V9EURNiZNADwG3dhrhp2xsMQdoNaPWpg17FE8O8dR1VHRzpUzs4
-oW8uITBTDYPLynlwZDIItG+CIpXe2AKuCI7Qs1rnC94AEyGbMuhIPF1HgmbONCmS
-5k7bSMjXhXQp1OCjmkAGTvLOmI0HOAt3YzBQRFgqFp2bepbOC2EIwJLOpBSCVEHI
-kdNxHOkAQs0VIpgJl4XMHMjEgid0t3FO8MJhYYXY8sERIghdxq3vQKeC72BkdCeG
-xRxAiGkDGK5LYsCK3AWW+AM5VQaWqrkJ3NiK8HR0Oyaird7M0013PrNY4oA67ZPe
-zuDTrV0oZMsRpR7ZipzQ1jzg4Ut53oN2DS2qHRF3Qms17VFoJ5zQGLHnTQ1WhcBQ
-uEUTQhQjEQUHI85hT5R2UYC3twsue/zOINAzYK9Mg24cwzR4rXfuB43f5g0wg+ma
-n54RRErdutOia0EPZPBoCriZ3WIjYiAiY9ycBy8PvV0fdNCtr1kSkUTFpWjZQ33A
-Gh0a7ep6g4nkWoASDIDjZq/BgHfve9jgEEhzWCeQR7Hli6A20uwCorkhnm7lK6hw
-1GyiXCVzPlIK80MpCjwRAoagLZOVxmZA+eBSGhCIL9tBXabrpw47c5zKNaAKO4sL
-7KvUaVGgeYA4XSjsTXG+b3fBFtoGLhoKvIHohI5zzHSwDMUyPCJ8Zjolsa6FJ1An
-5EizYQKcpor6HHhk6GdulzXbHMekayul6RlzuOIXQHGhtCOsOrdgh5yBUI4QD6cJ
-CNmU1QYJoXJADgxaZvbMMEEkHSPshs7OGaJOF613Nd0CBj2PIi+PXV5W90bvAECz
-SV7CKiJiGUeZErQbfUGQNmjhny5vomzEBFviHjwiiJ0o1E52tFzGaXbdCZ4hwwYE
-QPQQkQZFRB5oqVQlVfs5E1NSQq6LJmIhqJUJBkSTmKRwxxBG4hmGYgYhOlbgcIM3
-Qhnd3c1BbjEYvIhbZzEQRGBE2cgI5W4RhHpgCsRsjcdWFMN0olQDA5nd4AckRPbG
-2+i25y8WqkxW8Wupq+jB2ymQckBbjqGGJ2AtMuBuG4BrSNp5MsuWwgXbcCXcIAxo
-J5BTSW05do8jzcwVXNZNxgxuimapGRGRMeE3YqpoRFQVEB1gVMQgYxo7G7bmRDES
-u71hcZac1QBCRIHe0LZAbAbHxDwuLIhFlGQ311uRlODv9YkCQRH+Eh/r6Q/7bT83
-9x/Fr+4/N+xjJ/ef+if6dubx/+uT/af5yl/qO7x5v6rVWuWZlZjM5eZ/VustitjY
-3HC0dHExsx/qOenTOnMdJLi6X+gqTDD7MX/BpCpmFwf/C6fg79fommh7CkD5icKI
-rVSTX/Uh8fGFGKs+lPgrQH+bz8pu235HwdPyPCs0aP60bPSYwmirZ/oP34xfQ1wP
-pnDAX5KPS23/G6nZ/TKCJiCNS5oIRTN0GCKEmhG9kYgIrr/UH+fx/tEuBL+6UPJP
-b3bTrJphJ0Vu8PmOnIeyvm4J8dKtpVV7Nxk1Ldm7r2f9z6VbD/lVr/jIa0/ZP2/6
-fsPJ4euM7/l/w/Hbe2qPmk4Gye8+XFXSsxt8HE/hOObeMcPpNPb7slXdTm6OZ/v/
-5dVzU58rFtJ4e3yv9l6buQsjiD1R2Np9hTyeTt6+038W47SRy6PY06E+P3JOgWaQ
-hHAkkR/Xh/2ncXif2afyf4Svf5NvY3/UP3JXCqfaxkZRL/J3CPDzFxNGAzKcQTnd
-cHPayzzbvLxDd1UnVvMbTw9BywcPDfsc2zm/nyMfDmf932T7p87KrxgyeFftQ+tf
-Cfh7HZyeE2aj8Ld3bXw43xb83/u3I6WSftIeD/xbZE/8bwT5H1OjB9vDc2fr8Q+u
-397X9Gf+PSdnVOzpP8PP+c7z52c3SP5Gtkn9kn/w7H1cp+5o+HrPZPv7uTykTn4t
-qMW5ktlnN5X7r3/GJDMMmGVMJN7siu/yfnqffmvSXMu6ft6bOJlTaKqp/L3k/g2n
-c/7fv5SH4e7wSNdHTnGSe7brKd9m2+rfs+75c1sWpbaXqOkkpTo6LvZVDoKaaPJd
-rf6/wabfy//P+Ses/dNe1Wv4P05eaf0Xg/vluP7Okm/5eu4+LJMnvJ6vyfdiuNK0
-Wbn2ZOW7k/O5dVV1S0twqcn6SMKzp/2y3c5D8U7EssiWcxtqybtlfi2p2J1xcn7G
-nI/NwcrP+tfj8/scv7QZ8v3tjkfXsw7Hk28PhyNkcPY3e7To4dLZXs52SnOcp+0v
-BzIaa0rMZV/r4j+X7dHd5OqeK/l2Ng6ZCf3R4MsiMaozClqv621/Cfwfp/G2c4GO
-dLV9XSfLMq1YzWaxrDFXxLOJ3YfCa+Wpzeb8XWTm+JzP+IICf93/kNaqLaNrWSqi
-ttajRqjbapmqtpS2qxVk1bUlWpNqLRWpZqtJNKo1U0ttRsy20zVJqrG2wBY1sVoL
-FUWJs1ikLFTK0am2RVFYUrYNFpNtTCoNYjWpaFbG0TKLTDY1RrJSWwCVU1K0mkrG
-yUpUbZDVikMW0bZkYotZMmZGLRsY0KIViLGjRsUWxtRUzFiTQaisJEzIaWTNYIjU
-RhTZsyUWxsUUlY2oyRsm1G1k1MhLM2Q2gWRRMpDGE0zA0ktFBaZGyBETCCMgSEaj
-EWjaJKU2NqZFooxiokSIyMMUIWEaiMhQoIiiqQmIYEkRhFpEhYqSGCLFCKEMEEGT
-9mvzf2fuM6SFZC4Qd9fugRia8BBCIvlh/UPmUoYBieRgSMiPA/zM5kG80OwWXxVB
-kDKCgX+vVRm/7UQIDInnOZ/vuDq/4D8+p51Kq1Jw/kWTzvI4d9a7SyLfWstuvCsR
-8vO+Ve9WpNJv7s7+fuL8JV+dboUuDPzER7chJZ58smGb6bfHJ+/wytuIdr6d7a47
-bq+tvU9ubKTxSujpWpbkOGArKSYHFiSSfHgG2RPcG5lSlkRGbrdlTVFVeA1pC41W
-V8XE0QYWbMrorO7DWTBoBRpgyaqKdSFItuzQ+QpmRRpSUkgkAkgVhutQk5vCYVVC
-2pCBtTYcnZA1HRmQ5KEKUJCjE441UykKrp04rW12EaksMjEqCmiOKKAiIoVAjHHG
-4Oy2vMLFphr2skmltbAj2yHto+/C1qRSHQI0oYJy4xPAK0hBhkBkzKGIDKfqR5fu
-9Rb6jriPwFfrT57/BORRUS2uxaWe/23vw/VDRJUNDKbcoql9hR1STaoUKFJAhAE0
-AZZLjCTR5qxIgYLhyUQktqwQ0LakMUoDZaYvf1dL7/UTZGZSt/h0bF8bOrkShINm
-UC5JVQoULQdWFmExZOwxx6b/nrJEIzcATXe9RX4uAjQuZbT7+8dvCcTe970nE51j
-cmac2WktrRIBr8KKqmFiShChQWsTPnID4M0CSyZe7rltE0/bIvrM+YcPthAH85JJ
-219mY5mjPQZhiZDYZA1DzBlAjUcjXvLL8BABMGVQh/A/vPwUfqX/5kl6UGGJn8FC
-P2GG+QceVRTNvxzts75paBK7NzM7TzVVUzlIqqif8NJKRImR08cg2cHrQWxKYcNh
-OjnHzz+YPyaL9PWNrPR37fFaHr23fpcy+YYGWlsuQf4q7bXFjzjZ66t5DEnZsqLU
-ixYlKiy0ibZsjalZamaizKs1laSpmk2ratltZbWSta0bazUrFJs0ttalazaQUhKg
-lSUAqyQoWSKtotVYtSmoyW220arUsoo1tpLaNtMsmtaaYsVTbS2UtJgram22rCkS
-qQSxISyQS0FSSyM1KaS2laa0lhNFGhYWigRULZFiyykqoCxFBKRFSItCrIUWLKak
-ppY2WbY2tps1pm2ymqbabbLNiZojaZkrFMKZrKzaWVptZtppijZNM2SzKmmxsRab
-LZs2K1NVqWqEzMlJtmqVRjVNZWllSVLM0LNNZpalZokSlltLasJRUqopUpZIElIE
-lkqrYjVi0aSNqWmLKpslJtFRBbSbbMy1KoplRspaNlNUrNUaaak2mpVFTZVGxk2a
-GTSWmzaCpKbNJW2WqWqKMmNk1GkKUtk2ysrLNs2WwyrMqKpqZmmmKxtmqayKZlUk
-qNltKlRSm2StUtbLWxTNUqlspo1ZtltNKRIqGm0tlRtNmmalNGZYybMozNNKkxpI
-2i2ULJqUrGyyxJslNGpZmtNSsrNWZY222yttmrVNTbWZZMms2lllbKstpmrNMUmp
-KqUtptKyaplKbRSbJbLNplZtqM1KKbabU1ZSUAmUaxpZjUkhUmyZmxbRSltNsrMq
-qVbNtslSptEzVrMqaazNpmkqZsxExpJSk1itlWqay1KppYopMUkkkmbLNlMymsxS
-0TKlNjKbA1TLLLU0lTWalTNMilKmys2ZY2mqViUVKSyksmapVNqSJRqxZSyylMlS
-yLFSWRUliWKLJPR487tzxPbvpf6y887/zT6h9UmfSx2PLPXLE2t67TNb+d8616jt
-tPkeNmjOnd2bULjnN/5x19I3dES+7KaAHB8sg9OaIHogcFmowcPkd56v4UKiqJhg
-oAU9AHxYiJSboAuO2tYkauzYowUsXVGVlc0nYOpihEKtGCELstXcQR40ZwxcKms+
-7pFjCoGnlWDFSsNDI2M37zbDfLv3avdlnZZ+BC52UzTjZKLth+XpejoaOcVlvLIp
-Bt0bICZGx12W3MemDI+BEABpXP87P4rJiq/on3ucmKl3H2qkVoDOXeBVIHThRlRW
-oIeneSsFb5P81QBgJOLBARAX3nH8/r/f8w3ilqIGYIs2ETpWjUrVBz3ap+abPKWH
-pLM3ltPx/+N/Wbt1NbzHN6yn49NkVXLjHsi0YsxWYxt0mpP5liJ0D/BK861JPxVJ
-KrrKd1DEsjkf2fd+E1sqc+0G02nKaZP3/wWYV/JKhVSKU/9f2kP+Es6z7k/gUksW
-JYe1an/921pBsrUdXyfSH+6h3N4k/jE5ItS1VTkajSXnZgf5UtgpKk2jaxZibyd4
-83LeR6x6+RPw/T0lWWVLOy4k54wllqVWtTTUvHd5G6VXZwcLVpZCyOySqT/VUqI2
-a3OjB+BJ/c5vJ17xaYezrA2WTu8JipWJ34en5WSThOGGFkqslgxWw1Riyit2TjUk
-4m2SJs+3WFSYNQcR9lN+j4j1noP93VyHCfI7cNMSZzH2ZNRThulseIk/yU5KdXt9
-v7zmbk+gjtO690cSQSoFfmmeBxfI+vqGsirzNH5C+xTw2WGGHE0X+u176U0uLoPT
-OEn+qsbDvaA4s+lX8EqpJzPrH0sloeXR1c9OiqmXer0zgSe5ZrT6ScTDZPxHCbPN
-0R5uo6u07SaTyP+1LS2qfontI4sTqU/nOnq3gQE3PlZlmWZRJYUsqyJ2P6PJ+L5/
-D8Jssqnh8+u+2ca0nxwRAJ32knCcvhmYySY8DlHwPRZOyxVSqrmc5yn+vVN35FkO
-yvNZM/ORPMmjIkxNtLVRf1qQ3ksieqJL38h25PbeROj0cV6GFHWIPN2qxXorv7Oc
-ifauTZXzYwjFM+LPNWr/a58p5xuD9uXn6b8HdXj7TiR9vZIw7HVkmGI8569eqqvk
-P0vhi5cxU9euWvzV52lG6lLCSmYWK8coeiN0jxImMiT1bT9FffylTz7SRs5vwq1O
-E1BPxdk4PSI/RJu9WoSzsTH6v0nJ8nrzi+ITko3SqSvxOJ2nukqKkpNLHec/hfS3
-JEnzWJ39PoktklpWMyyPh/0Tc9E9Kdo5IemeY1NR+smI8T/dPNYrc5nXv9t9sHUa
-mQsqCq1PemmmTVTeR5UqqSopSlKWFOYaL87JVmxycMd8wy5fM2Yw/RXl8vbb5SVb
-u3zORyjjG3DhlMKM111l6sSk+BAMLpSjqdn8I5U+moXwXX5p0Z+Ev8Zh48/wLRnq
-sVOvKupu7tEKFfaNwYH8/Ci1xHTYAbREOEoEoBMbtSSnI7QnHvPpNvIrSaUlVwno
-cA2T6JPxOc9Hjj805OqKqKTKMtvz7PuSa/Ze7Y4TXj0keaMVJIBO6TUtNbu22/rK
-Ik20pV+zX62sR+LTYvA/nP8S/x/z/y/t/m/n/s/ozh/TTT0zNN8l832eeZrP1ft7
-l855ZP0+7P2fht+Mct5xlvGpyPw3YySSq45XU1bSyrab5ycrjjicbfT6o/FPun2h
-kqLVQZw1OrdGyq/AmFG8iUYmGjHDOy2YstLLBnKVZJvoZpv/dskjgWfX0jmmn+XT
-9EpEKhcAUlB/eYz+SbNu4qNSSEC7hItGyfhotsOAf9SwdHA8hOJqR/DyaGA0EVqI
-SKD6AWMbIK+iFwiWZNpCAwgFlSy1TRu/m2NnOmMXFK6UuExRVkRZMoar/6uXRP9P
-7ZP87LZwYx0FWaYU5vlVTqmnh1eev7szJOiq4leaII1cL9t51vM2+LzXlfVqKWyp
-WvCVPQwScjU2St+kOba054lwkpIqTJm2mrtWuoYNioqjXh9ZCcg4fauRyifOQnf6
-SGRSfxqdVrKlWU2qUzZplGsprUmLRsRajVG1FqI0mwhqNsVY0VqNYxgASIkzAhPb
-KKjCrJLVvcYYOJOH+vt9D6MOVhCbzFWO4yRsEfXvzBp0P+0m6q/l61TUNMPwDbP4
-A4ZborpXA29kUhELXpos8r3drnud3G50Si5VJtefj+9ZVvVRlXCz1Xg6KThMk4mm
-/BxViVUbKrUw0nSUxVm8OjGchs/DpN495AGe5+K5OvXzvbUNNMVStZlSc5ucwd3W
-l4u1dm3WlJobdG41bAbKyodIBU0lRgRgW0aw1kwVrIutSyFWNio1Fc3UKqqpRju5
-Aadp5fl5udRTjI1JPdwpAh5+pEn8lE/gwPC4SP7yQ/wfmhzK6WLcLLBfzaejXg5N
-ROtJbDGTLY1NWSMQ3kPP8tNlbsFLO0khJHEnOD8iIBLHY5E5Vaioqq6mHOzViRnO
-TJDV5noj3lYCpbB/UKCPiSPRFBjGEsHZXWOmMUqqoqjVmVmoGFKNXF5UqRqditja
-VqjRtTTJJCSNK2SIBLIlcoL93JoaGmSYppju7taVJZUVshVKnwaD0EH7hMmp/h+o
-Pbiejj/LCXLxi+sY57t+Gq/cILqWSklksgVasVYdKi3aLGlcq4fh/b/0JI17/hz9
-I5p2kpb6oqMezcw1GWkqUylkKqYsxkpUqrKj6ahmlf3ytR/QMwpaUHB8iNiv9K/z
-0K6HAP93CkfDPEO0tLILS0pZtCxDEo+smm6SnpFqPN8mB8k84m6eFkLPr2/b9vvq
-30sMxTJbKbV41vETNRjrYhAm0Kmypb2ozMJGlqo0oyt7s1+ZqRGE5GDhx9HdIoQm
-hH5pdOT8GMwPVn9cd2LOKocJYqpE2fJibmxMRhVjdipjJLKxv8lUwhE3F+9vM/Z+
-96zDku8juRY8ZkygVpQhCSGE5vWjeiSSO8ZFx43qYwI0q4xeFMojCEBoYwhDwpBe
-iHCkNkSihsIJhUNuES4aChQwWFNLDYrSqqVumBhK0xiN2qw02aBvWoQRkbNJJAkj
-HBk/f0jBi0Qj3trasZSWJAABGGhpyETY2mx2GGObpTObWrb351Vt6QURN7vvOMuZ
-MryvV8esvd69S9JGxrTRiEw0k5hoCqjCFy3INRaqNJwakaGEikSrNSYRWTRj019T
-4CORqY4ubfHfS36+r2c6tibQpT7uqxK5TMRXftJ83l0OEKb1aVXy8jZKtwphii1E
-32XPN122+997zbb3qg2rFWEspycmx5fi63iHJ04NMLBsItv9IBqEOmT9g+SGvcbp
-+/hdEfGRojRGhaIFKIYxkBlxKkgcNtjbaQ3UpIqYgYoKWc8GtGtpwV4rXQ74tWyW
-WrSqxFk4NRFSeaScu5yP8VExZEm6XE4chWxqNGXXVJkYnR2cdHk8WdGYy2vCmNjq
-ybrMN1FOOcToskqqI6hQJYpkEaNCNn6FTLldFQjIRVoB+utwbXmdbmWEDBprGCfA
-JCZRpKqRYfq2e+7Cq5cNSfueE8nT0BAAmYe3/Q5/hbbwssFCXp+OE9EkGFrg00fG
-yXabHiy3EqpTo/Z9bfo+ZtPrQAuNWcI9+eSwSa/nYd7oXFadmUYi1ukq/ac5AAQE
-7du1t6q7K4YbOHkbtuq8NNGMZw/VibN2MKnJyZJzVzbk8nnizzY8nI5Pu2KrwXrL
-dm6nQ57aXMY8TsVyIDC5bX0WfDw+jTpp6QuEj7W1TMvq8Zyu9vdXFD+nVQXfaj5R
-BRz2fkfnvWnhDIyYKVitWiZZUs64DB3WmYY2xUAXs0Cakm2Wq5otBR1e9IE4xR6I
-UQ1xETvEmN8IlSLEh0Um6u2FSoE1m8LDpW1Hm4TFaGovlKmdEOVumVxam7bCipxu
-T6y5i4+SRHYrzydyzSvjm0vMKixJqmXoTSKKjLRTRkxS7yrSDPFa3nQXLkJi0PGz
-Ue3b6kGdih7KjMMNAjQzQTDB/OKQ8KFuO0yGQmIsJJJLKKGQAQmMosKAsZY1R0kL
-PhQaaKZWN45u7TtPs7uvVu7uqsd2mxpMjs4adWm7k2YxhWGOTRjkw3YppSco2dSD
-nDT6F8LNCzhHRwSHThhZCw/JCkWC0Z4GlllmHQk0JGWItJaemBYmSUfC/CzGtdOZ
-glpafCCzTTeNljGYrTsbK77srM0abuHRsdXENonRVgs/PvuqzvZPJURUwfRVTFTL
-HP5c+u4dT7LGDtNFEMwhcRariKthqTD1vPM95zBVA62rlBLfaioIouD1obsxmY4/
-SLbB1fe/WE5wvNs4XW/dM+pCuTReSLHk06DGF0WkGUHXGlrLY4aDxn3fHt8HuzrJ
-2+aMDPlI78q6bHxj5uF2TCFwbZMGRZ9YDJhIWy5Kgdxy7a9+tDiflePrabvyHDj9
-YiBjKMXYZIRdTNJHAOT6taIRRhwL6k4WH8MdqdOHDZ5XET0kKmF2Bk/gCivPTwLD
-D6OnV3Btj6vA6NAoRYdIDZ/GwT5X5/HRth0F6JgMp8aAo/b8aP0dVD3bWzoGD9jA
-IdGjWJpqFEIwOEjh+nBfY8Pv9ThAfIA+v1W1zDh98+IKpRNs2Kmxah79W223bEUj
-8FgfYebzbUyGl4S8AJvIixBOhDSmA2GYKhWeUS6ADRDvpmoClc1nZxo2BcF8lMAq
-GbIksqALJKpZprIel0G/UM0/NROWO2EHdl8baxjfvVc1Dz9VKlRqHhPwoX/hRooL
-hYtcLETvFJPN1IgE2b15FDZI8kftKHm25vocSMiWe502fv/5wLI7POSTnpHiVNkn
-KN0f5ylSllDaC8/EnNMn8bMOXdHDBEkioNT/Kpjl5T/FSNstpVTGKjCyZJilljk0
-WCJtTbKttU1vQ16RREbZJVRVnrJY8VbpfQ4jCfGExUvOtzOch1jTc+c6fhbzdJ+T
-ZjocHhp7tOTg0hqFHEdpzHf3mFU3tGUGnq9aOgRXwlMPc4oqofnnzkevPke8ocXV
-cWn5KA/wBIoOBRh4tKPhq0owg6MZB0JF0/BAeEjICzw6dNpJCSLZwqAGV7MVmZlz
-FW3GuSbWrY1tbz6cEBX5/031t5Xq26tD0eeTKPanZz5maen48Hmfm+rh8R/tsevt
-95vOVW8muQ0/dwn6qkVSPxsTydUx6UtRVtlfoqMjse8kMZUj0SSye7/KVZXR81mz
-STUJXk04fITUm7Y+EeH1SIBLCfsshViYpJybG/429HOeflhiyJoizZZJqnHAaUfl
-IkvOJH3SKlVJFWbJPqT6ux9pskzdwrJy6NBxBPGkSiqK9nE/6yaHtOaOIlPR5ned
-BwjqrLOVGfdvOzy8zy6OTpB8JJ5O35aTvUnmpOHOTST7q5Tt4SqsKqrKU8ZMLO59
-VefKuttZmLKmGsVuzxJ4xtmOsbzj7jrHOnDaObg2tvZVLY2bG06W4xJ2PRXowWn6
-Q2qskgjIGgwGL/Z/7+qho/gPTXh36jmR1w9demMo4Y8k1PnrL5bLq5qtlHMrhcTx
-qkjHMqVQDGMFtMg0tkKYtmljaZTJIMj9NFIipt2BtNmmpK5MDFVUUwrJvjElbUrM
-i23kbNn7H7hCiP4ZebpITlFV4hhqmRLE7Z94lSPPmM6+HR5PY6k0ntVq21Nlhixw
-sJ52ZHpNNQajs6c9vfpv6ZntOE9LGPhh91dhtbjq2MjZvtil0zo6r+jL2H8eLj18
-yGzWRNcm9I5GokcOjGnDG7SaaFYxVOitW1Wmzf9NOstsnBXsVhrLaczNWymFZQmR
-BAR4hXFLIMn8tE0KNiGlQnWdm5TOjQdS2GXGiCBhAiR3+IuNtczrWRxLegSYOFQ8
-aNwQ5pS1bOmZvMuM2Titbss3zVUdd41y8iQI3cC+BYszD3iyYZAxufkk+P8nXHL9
-uAF6kyiw54eRvOBZOAlO2Jkks3WNzvOHZTF8wXjOnz157FNv8IdeqWn4QqxyMzjd
-ovNzuHBnGNqB8UypLJspmo/PZrnERR2PqVzauvfqDryP7Z+vQD7IISU+56T4JDTE
-q+pP9KlpI+PV4dT1ixJrec504hI0p0ainusxoch3Rf1aTnA9yf8ixfufD/nGTaR+
-r9Yxn56qBqi9vX5hPpZKpLI37GNPZmMfbbfbh2nCcj2D8Z5XfTA5tD/UrkhsSybh
-P3xy2n8vXr3+fHF+jbhrfffrgpMdwyKsEIABftZxWHn6eRPx3H4XyvkzMnSq9ves
-52gWBe8WN0R5UW63ukJQWFQ4oKhAJyCJnQEqDppQlchLgECaszI1WAe5g4MUFyh0
-anCQg4mSNdSo2xtqgYJ+eC6eYyu+bd9QOSufIb1aqsFPuqFWSpbKUpWlKojFKpSj
-ujZZcdbOTOI0xFWRNkIpGoH4pGFJpP3gr/zxFkAWoqElVYP4Gt/X38U271ZrEysV
-o23KuyJZatOZ0Kp4TXVYhqbvrZeRB/cPmRH1kRtuErUZW4UhQwwgBj0NR/V3kMY7
-EobIBcOQukBiqbEGpMmJiq+WZWm2LXZ6qn6+3RY7yG3Jww0zZ0a0T9xZo9U2SMjs
-PDENqfk7N482T5PLSV+d2a1f1eexrCMfZXsuIkyj/nLJDF6pYr8eHJ6TBVV87tmm
-a7bz+ky6PN897u1CATUrOcfrYT7WLUnZUkfzoytVKsFSxI3TkSuWTSN9Jpp5QZrw
-J9vP1+nTbT6eldk/oc3RMOhp4yJZ4IUQxBgmiHJjtlz2GvOHReN9+iGp4Jktksd2
-Fk4SV2/JatrxIFOH9wap6FtHEfVGhB1sDwiGOwtcvTAgVkF6fh/XVVVUQaOqOQog
-5PKIzrA2mJiXdzzLWRbIZCyUxgbN2zVNiK1HWZJuqUsH34W6Tk5MbyVmv9jI2aSL
-I2VKRQpzmQyE8pC1C1EUiox5RWwS9UwZLy63VpJNJfEm63WubJNNHJJO5+RurZhi
-qlWMUlah+7hqpN26aksmYnEl+2jDzy2sWVaxhxo0sy3GKzqg4dVFnqiH/Afo6ZOB
-w6/25A/kKKi+ipEIiyL9rIz61tdfOz5b9tOLlSqe0SxNVPNTFk/XTHSxksktjnfv
-TFaebEYVxUzjImU3vFMtuuFx2WDCnNvkJhZJpZDkrlXW3eZtcuKZcvAedJhwsO8s
-JvKWfGcuMmSVOdMuPtO5iTO25qE9ntOJ7c8nKZfwxh1UZJbaturhTFgc4VklKumu
-lWXlu5AcQCTBIkaKGFUrEV2UU/n8/HpxHWKqpiLFVxDTtu0ZLFI6kEKTsGEUPGDF
-OyKFmi9fCJPgqu54sCIJ6uD6eDlOsdVOSppKzATwfi2t4CPHgfLsRZAITsgfqQ3S
-VryjsJs6HWRGyuXSEjvQFceInojgi66B/Jn9YGev5OSROQPgpDM311czh5pv7QH1
-mjYdG88T0Y6lKoky/ahYfzsf2FLP37iw0iHVc4G1T+qGtRbbYqpbLVXmWjUYsWtd
-3blc3NcosbFotRq1lJaLZLMX+yeAaVGqxZhXrnN4O7p233eKV527HTl3dF67ngUT
-DIWkYklBhCDIYMo0DsbYvZpkT5KZKN0lGEqTdkzEsUySxKGyAtr23/mYGEIYA2ic
-NDzgWF6BTisD+sxSj0YjKCGUBhaU0dbAuSAVMAWdJKS0UVTIyJw03tpPFQtSP5Zb
-pmLpJw4T+ko4c5H5d37d2YZYsw/VekqVFiu6LIkAnOUupHbpVuhXVTePKxVB0bps
-xhwtW3SVTpJP4oliflH2jl+CLI6HIdidSOtEWxPwTYaOFsTDdMOO9lshLUSxbIu5
-uldYJIE/CVEfQGnw3KR8rEXXfhMiZYN1TKw6ox209eLH1yz6Qd55slpUwKmJGhpV
-YEWZi/Z/B+/mfovmdoZ+b+KH47xRdEr1MjJ+9ZGEk8zDzXfoia3VNrVu2HqivcwY
-3Cn7tM3ujFGxSqYs/dy22jfJLV3mNSTmx6I9vwKifsrmelJXD6zmOk4e/y1x5u6N
-kaNqieX17yTTwyGtH46H4Fak1c3Kk5z/ZZaK7PU4mLKJZX6ySfl593p1JU4nVzP4
-uonn80Sf8PxBATaSfrZLZLbUFOifY8b/OQOkPKRJYuHzE80n8kWiVZVKKsiPyj7f
-1czhH4I6GHur5ngfJsPHxaVDwbH4JEAnRdt8Mbc25sbc26WpK369rsq2Jk7ybJJ7
-nc7O76eHpxPLzn7OkGqH8mmR+h6xJVRVTckP3rP/RST+xYn6JzHM8ErZP8IJf7oK
-am6yrFq3COr+Gv1fkE1ZskzBUlfkrr8b8hzk8yxE2fNMfNrmi187J8z+Bmx2Wzuo
-upumHT834f0K/hL3SkSzQ2U85TkrZYbKMVKVsprfbMMsmUWyWP1W3DVjWss1MNMa
-H1WP6OTaGllrnZoiAS6ssfNp5sy3o6d+z1Phfsunc9WPbpmXPm3eqbeJ3nCllcoS
-R9y0sQeiKPWxdMHSL5yAm6DOmnZx9/de80IwLgMAwP8AgoIErJWSGzBhMaRbyCyG
-/KI3YnIr+zatN5zJm9iJx5FlEPllZszjniMMODP1NDhIdNGSUoDpyr2MFiNFAp7m
-dhmsM3rn7xcKDPsQKdNOmEcqRWE10Vn0f5jdKeQdD+sX9BD/gPSY95PtG5r5T0HY
-ruV86045uEMRVSihTsyZa8MesmkTJVlLKqkjBRhG+JG9NNZ4h9alqTnNfxllQNGA
-0GINwKMDY0ZDqh5V+GFsqw2G6lfuxMZjyPPPVzVO+/y341ul3m+NvxltY2IqNsRY
-1tTEiANRtZmKiypqJVJKtpSltTk/sPm7/O/dRNKm7YOQYxq6uWOcR7KE3fYnBOUc
-rZ8tbxGpQnw+T1h+E9UnrJ+6E4e77/fdEqziI7b4QxqWvgPVY2JuUihvCTzqWzax
-J8k0/ueZNn2cHv/723l7vkvl321HbIYegUM+f6eVz7iFR6+P17uMwF+AHuHwfOrG
-7J7tnlJLoqxiJZp7OkanzOMm8/JPR9k3N9px0iV2kiN/2MZWOp+Dmehw93hD9FiR
-9EvPnH5sfKX5VzOWREnZyUU+va6YuauVpl1jSzGGKqpqKIOVA2BEIIMpS3xoVbiJ
-DZ+4+ep9reEaqbrqJ9X9jOrrvJSr+/C3LCqZIomMTTGl5droWwvUnqT7fVasJ7Q3
-Vdshbp9jH8pBJ6bD2U+Cd/hZbX9ay6kU8KxTu8ttbZlm1Zpptjy1hjMVabYxkKUR
-gyjKMrbFpVVpilVWFxd4lsXb8MOW7fVipDJxhwVyRmzTVLLxkzco2dz5NnmsjnxG
-SQ0xLOUGItVGqYkjaPOd1ixXJ8pvAbHrxPhNAgJ168Kvepi5THZi1Orm5ld4ad8r
-162e8Lnx2rLKuWUXYSACKn+0Q+UPkiWkUT/jy4+mbc//nw1tlzru26a16nw/ipmj
-oukAwgMmggdSKdGbGU/Iprgvjn77Ct2WhTTOcy5KZMORZMZRWwQ6QquGZW1JTVlg
-QmM8osKKGDGMJIGMIBsiwhShSkqxMPy+3NPLDrbgVBbDqzyCBgWZKJrEQiRzR54q
-wia4gUepCJo2SzrcVXl3bH+sTOvr0qFHlmMYpGEQaiFZjEgQmdarIu7T2kdmRlAF
-SkKsnConJTZVYwmzOAdnDjWUlQbpLqEmzOttyWq429ehDBlMRRpyaUji5o2uW/LZ
-8wQgAFSMYB0Wdnuk9X8nH0naSH9JI+g9o2Gzu5nUVw9VrujeRN048OjNoP8LOjhS
-uG/rTtFPk8g307qhpyc48W4wop6dLpbpG62VarE1XE8iOyVK9ztXvOYw0JoSwJZJ
-Ftfft+V8JibSreNomUqaifeYC3fJ5fCnZQIMR8DDQUIxtbZGzGjKKNDyRspoqZqZ
-ossZ6UUDMFZKUgwYwsMaaYqaYrCr66wtypjY2abpVSX/mXeSNkaJPqgQhw2mmMjH
-EHymdzJLzYsvmuuvVbsqy6m7aYqyZnGoerqj3UePiyIVZIoqKthYOZ6vGFsYpWJz
-5ns4SY/yi4BSSyktv0dXbf1b1fl9fp9+36YjGvdRRMDFkx6Pp9wzFt1H2f0Y5CMb
-VjGyUszErxN3k9ks0S1Zk8IeitT1VrI3R37ye53Th502X+9254a+co8o7nMnWdCi
-wosHYmvktSVSyC6P4FSTb4evj8e+aNQ/gr3by2tmlU3bI5CjjaesCuuOTInFMxR6
-BGGiWW1NjQqsYxKUlU0qtak2QF9FdGkKOPTjiqoqd6H0PuA+KaOAwX65yfbt0Uu2
-t+9+OvxwswtdK+Z6T46z9ur6JavYqrVySsYUxinbay2mTZRVK1bWMy8Hm/TRaetZ
-W+L6HJ1GI7KbTEnokj3nzVNViyloqqryY4aU20msYtW5mTfBtWDH/fMFA6MUxGMR
-NFAuSNrZk1GrtLMg2RpFCqVUaUsYRZMiN2Nim9bnyPI1L5d7amo7nk142ZMm73SJ
-/eoPU902bpY5T5yQ6ffJkrLbKvs844reynK6fNsroOIGSOqTdhDZO0IlkpYiq6Oz
-Fkc0U/fPTYvU9bxWXZeLi5F902sZZU2ysGSmlVu0qcXTGyX5KS21VKrYw87pVnOc
-iN204sTwOM8R5cJLXpE8sT3gdCaTqejSJPFnanubqkqvQ5+EkEjrFki/syRPSKqx
-ixHNf1x69+Xp6t6l5LGF8d0xI7umlRgxkIYgsKQGahBGMdwkbbIclCjg2oW00iZA
-hDSVAoDGhqhIDTC4UGjDNVSwINaWT7/c+6B936RGV91beaH+tFpClUqVar6a57xS
-1YsdOxwxj98iTq3teHw5yT2NnV6Ms+s+NR8b24bKw/NWKKqqZhiqnM8QftpfQb+C
-Vs3lZLSSASqcfM7yVxGYledbnrN50XJBATYaCsBtFYJlZR2SKwb21+jqRiNFI0Sa
-rSjgiATZnWelW7O0mbziCfju7ylzo7WSqylsYp0JpjJU0qaMlJUUVhGilWTZudCx
-M+kc+l5uTSG84qLYv2ZJMli2qrILI2Tqln4cMqNhAj4gogAncslWOiwaV+BwnPnE
-jdp7E6UlqPtYJYV9Tg3WI95FkO6beZO8nlbeyYVc7od2tLylZPKLTp1I35t2iLsk
-ipSBQqtbUX19H2kWD8z2PyVPmh9rLUcrDSKQsTJIfukqY7Hl5DzdPLdUqq1+LJp5
-emzvHWPLN9YtWeh+2WzylkbFNlTCyVWKZpKyQ4YwqnWq3kKzCwje4lWdzTuDbTZx
-x4bJ8tzHGu7m3prWSakaVZncMwY02dcu7kznctvM5MknBXCmwVtKfU0xWphkowpi
-VsxiVW7I2rWqtRhwpcXDoaZN1MN6tYlKrh3GpWUlJLvXd43OuslSWQ0fVcxqeL+B
-Xv1rpQyBqdm7e1Ra8loulyubVzbXOGoNVpN1/mjcbxaAiUP6xnhT7z2IJaTCQVgt
-DpQcGFJgWSBTA5batqKV5l3ruu7XC3NyZRFeT486vWm68lRqMyRNpSzSpsi1KyzL
-GmTS2azSVMZqtq2bay1a0raVmmyq2yqikIVCwBSIqSpJJKsVBYgSKsBLSopRkS2t
-tKmrVKmA1rSpZU2JTWWSGtUtmsrMWKVLLVRCkSkEqQS0GpKlKZllNtK0WFGTNpZY
-2lmmZKZLbWbabW0ttZTSTFMklmzbbTaajUNZaVNKzWaipYqKmU2mMk2lilaVplhZ
-MykpmlSwamzZsrUtUJCNs2xE2zWbLJpmmmlSyzaYzNqWpssspZTaqtm1VbJlmm01
-kzUtDKks1LIK020pKUpNRlKTSlmUprKzRSmk1NTZZJrNhJIZMlSpNJDMktbNVDEs
-mpKFKVJtllm0ps2WzabGsbM2aQtmsJaMkNaVJmssNbZtbMprNYqWVKlaTUapJmGz
-RClCZhpmEmZpEympqWZmWbRs0SaY0lNTU2lqbLNtts1tsrNtKqSWmGWWW0tZrNiG
-Uy2ylLU2jJWUySmlNmpspWFKJrTVkE1lJmakWTZmUtpS0rKyqpVsilmsNrWWbLMq
-aVLFlNmazabZtNppoZJEkxlJIlplYbNUMaaVKhIUylmxaWkEslm2WoAZmYGmm02k
-mZ9vNcym/zYZ1m/E+UySfg39LUVVWb+0CAnu+IVnzkTYexs7ufDm0VjDZ7mmLPDC
-jvRkCK4NH4KYIPfTEsxAJVJTCY4MNNqKqTgrJkmjRkVkyN9MMuNskxW0mmjTSlSs
-RiUzxDKZmvWVXm9Y8a6VLqbbWXtSMLsZGTNoSqYkyYjI2VEskoLRRUbRRsbWkqSt
-Sau0WgopMsq6V0SZehQ82kyxbJsqq2k6xbaqqpy8chxElkKVybMPBqa1jIGLJqNa
-WSNnw5w5rJRVJ8pXQahwWUzyp0wnz/U0hIEiEYfzEVFZGtr8GqLFqNUUa0pVZVFV
-lLVsEy7VF1qILVeGEk2aS+WJki7F2pqD7InRyG/WjNbxTzY7E029eTdr/1ZJlhzx
-xZEk7TYxZI2Vk4yI8WLZEUcfOpyzjm2I50sicpFjzHRZKelYLMxipnrpolbK2wP3
-Gj5QrZ3mE7dW70dJN3aTWPvGzFnLOYscQkecNk/KdSbVattW/g8tatRJ9BbaVmTU
-cNkbE5NiRgCjqJjBFYYMQEpXT39BIxlLWwvLhFGpGWUqKViqxkcZkznhqQLSNrGQ
-hBUdGYxN2kbWNpAzdTVXSs46S3TNK5yd26mxXO7tXNdm0m6bRbSTJvK6rpKW2TFt
-vPLvJbNaSixoxKyEmNk0kWK0SdjZs2NohYnAsejhFowruXCQlUVFqVGpE0UGZIZE
-c3lktTo03a6N+EiflSdFScJJ0xKRxN5+ZDlCLZB9FWySZUtkhL9OWNS5Kx7HmGk3
-Zm+vn/kuSquatyCwYtGGhIxpQKVBh9sws7qnJ2thu+NtlbJbljpdXFmFp6I0cN3V
-hW7RqTNacWNJ80k/pbIVr82CR/iVzKp1fJPyjz7u0PGnOl53LbDvYakR0ZJD8qm5
-9mWLpEWRzhu+1n9OUKT1kn8VOh3p4lv5ZjCqf3P82pWjKmxUzVvxpOH8eDZPhDwf
-ii4JZZPcJ67Ts94+JJ8JN6n2RXJ/iPpDEN5uehqR3Yxju2bXbGDrRv6T0R5vdxJO
-R2mD+4dUjVjZFQf6RFZJ8rFskqu7VMy3EjDuzE2K5wH1nnG971lZjE1GMMpMLzVo
-tmMJoN2gv8yApnCpgihcVoiUFH+c9nnbz+momOTD2WTT5sRko0skZYttki1bLSVY
-mmMY0wqhWnGhdSllSSW9z4amEW8VfPq+6qyaeu2jZNvXtEl6ptryvUoxwqtXN1Fm
-Yqyc7Jqlsb2TXkulki/galjcAwqxIxJEkIZjxWvohjDLbjDg3VHCdKtlCUmTvHq1
-g1bKsb1nufaqpD0uQWNon9Cdrrb3LTMlSbUTSbK0ohajIvgjH+99Bt8p3n6qleSV
-ZE6o9h2eHZRzpwc3OYmK009E9R328jxMbJvFH6StQnM1NNmLDBWdD/DwdQc+bD7v
-Uoz8D4pQaY3jgmo4UpCiqrGzZpNbC5h/TXGpNqn1Vaok4ZPk4KphiwyWJy5ZHRwf
-oiZC34h6SrVlWif7FRHs1+Nuh+L5Hs6k7WWyNKyald2mpMaNp8+jr5z3H5HpDpU/
-yqPXPAk91O6UFo2PK2u5jy7lWy35Kw+iPIqfOySOpNDJ1k4nqsilXhkeZbW8c56z
-Rx1kbkR1nBpJ1VUPWotkR0rdsQsexSuL+5pk+Mk2l/i7Oi6XGwkvE5JyD6Ifc0l8
-iIBO6c0DixXt8Wk0H6+6WxFliWWWhO5P1UUsfx/o/JZJ9iprtPkmjEsfWdqnbtat
-q24OckqqqnQw+6k7EfBZHMentbUafUcOiqVVVYFUlFKKqejEY6Y+lfo+ubdLJdCu
-RFXLgVQwrGW3GIYJWGCYwwtWWlUskYxZ+emKaZHyQfWMWTUkP9FV7wTx+WRVUrZI
-0/KPlYWlUqaINRpIxmMlMfoeftr+7+JP2H69M/jD8xaKRKgSrdibLHI0VxjbdHGN
-jQd0aMDA0QIQWEpTRDGZrq3R00OH8GFjuAD9iwhU2MP6wiGD+jp0Ymd06Ksv5piO
-Uq1rMkwZkiw2SmZIUHD5pP5P1qcNmkgD9vum0hi+X4S/PJ3/mfi9rbspyye2Fk1Y
-tSqo+5O33q0nAeTHbg7lc2zBxS2K2xjL/dLmkWZGHQNxp9NkyrGxuvp9akHp3+A3
-ROSdXUb1air5yyvdI8km6PrIgEskaR1ceOmv5q4dpNp4dofKup3NzUTxsvxlZbZ/
-V7KshwsVcSqwxapT6487uYnOE9IdPT5DshyR8GTg8yZIxO7D2Xoe8wbPD2vkrki1
-J6oe6xXDYppjTbDezUkdjZXVjE75bVWXRUdldu05D4OvVbD8SxVZLZ009nJEkSTN
-7Y8kpPWH5pUvT49iIMA9AfIDJEZQpYI0oY5HlZOHxMMSe9WuihVMpamSnEH4RE9Z
-aWlkKsWrVSPdFT2zJGJOHBVlVUrpTJRywuMlV0T9myzARkClqiJX70kgpcYzsakR
-kiRXw/k/H9sfrouz/j/oVDN7/u1hxCRIRZULOfq+KvHsxm1M2jkhY7WeUc1j/ARD
-X9g55b0y0OAkCC5cP+IWkuBkJyInN3reK6uz5oJ3cmh5kk5SOROSWbV3cz6GtQbZ
-KFKWuNFtiyrDpfLMzGSYWFVpVVZYebEEsBqBXBsjMbarG2x/fZQ+jLYbHHqNwzdK
-EarMZjYxuuOPbI9sySN6HDIRKMbSRBlKUoJjSMbaV15eryvBqvJXDYi8l107GrKu
-rrePql/G999PfuvQQNubc1orFGJnz9/3e/n38NvhXHdrlX0hVyULe2vF4tSELMby
-nXaVdIyzVzptzbpG0kYyrYmUstRUilMV6qhiUaXUqU2t22sqVUgIrrtLQ1QdExSK
-lSKNIKNDYBCEhONtcvec081daISsVrnNwhsmVFh9UnkeSpU/Ucu0cHJG1Tws6MbG
-5/FVq2qhSlIpMbqkdPrfnJsRP5LJP3kl8j+YotqNDkj+2rYWxbJPER5OzzamSJYm
-ofxdXtOqPt84dU9J+/4gPBe8BUHiJMP6uXrNpwqwttVSaxGF+jEifCpFfxSkr9mc
-32c3S3Szbd2ZoiFIb5ZGYtnEkdJ+Try/CPL9Mi5mMdh+Ug/lZFsslk+ZJ6Es33Tm
-ZHKzR+qo+jHqk0bPR7vVXJrn+XaeaslpRZLB6fWTy0fm4NJO9fzVkjpKW2+cmMea
-KKivw3yNm0nsxo0qY/JPx9o926TeJg2Itr4mV3UibG6zyzGVVRZRZzUmJYrYjeJP
-tG57vdmClZ7rv1y8228aKmVl6+qvZfKRcLOG6ldOqd/Vu6vnzdTvHSaWdJCUkjhk
-kn7Gk+eiZHzRJjshqSwqyDyZ80X6SPqx722PQanWebyOhb9n7djstjZ4dY2OQxL8
-hdS7hgfQ+5CDkj7o7K4g5yNpyOpPqRywlpQRSDKSubGQjFYyaHIAwiqRam0sMSLC
-sJviL0yJ2OkeKEslhZYLLIdXuqTrJIqKaZP1acJCcH4eh1+kfB93b1WTnIpa+SDt
-JnSUSfEhNliaKTnK6bk2NUtOpwxwxVUbNmx5x8lIqppySP7fkeJPkfA/GZNlaB85
-U/xOGz7nG7VxLbFvOJRc267dY5TS32y82q967Sok5Aw3FStphVLMYoq5nJ05S7XG
-3bTWXLtislaIjwcKpUlVZ5bNl3MjhW/1ibOUVX6bGO9ltr3qNM4ZOuTmdlJHaTrd
-opbJmZI0WRqsr4Q/tfrZ3oi2RVBaIqi1MzEkmVJ0pnG2r43k6qGCL9Kkpczv4SeP
-sFeTIEBc3DtAZcH6XxGW7Yaw+DznoSqyrouIMcMHbjD/FBny/X179rvtjikQCcgQ
-E4HS222zVI+KD/aP1IS0pJSBYzn2USdPSTTu868arlGQodZ/tyxVyU5RrlBdEqjR
-+4KCHQDi6aQjlScf+T5kjee1Xoxo/SOOyTCd1xDlX+YN/MVvtOj2tXZXckMqqZHZ
-EKEQlkdnL7Jdydlgmev89uU78j5cSJ/l8dkmE7rhzD8qadHMH4jZj3nDGPdwajh7
-sMdnVu5ujXXl+T1/u4LOHgw0+z8FGBY2M89iIokYQvh0gpDsMgXC5N6MMVWqIDKF
-k7Bhi7LCa12ZnoYVi5gcGP9X5TyVn5jjpmK38e0H0yNy9sy6krJx2NyXEkufYjPY
-35HJdzHaIWeWpGch1C2GpaeIIyAyJiVK/Gotmvs6vH4XixysdNfO67ZuafPse3Xt
-czmeH1mHV6i2qvNHrsuyeFJj1OGjd4Zq4YLjGTExlUsVV/xcbG0nNuxlxTLllUUB
-hE0vYrX0AxuvoyLWYktLUDBX8H5cYsLkOfeXyz9A4QbZ7J00FTnG94VNve5NkYen
-LptnR61av5SHOPZVdEI2fk5/k3VxOX5PckzZv1ec8TchyRzOOqs5zOUkm0wWPJVW
-TC1sxMVVTWOfpWxnsx/JmyBRsFWNsiIqoVUFReZrK80s5jqpOqvOS43zEuyOx1cp
-0Y8OhOW7ME8lk6LCeFLjEsFSqpSyelXJhXAcdpsp0Y6/OqpWhUMVm2xjyTgU6nrw
-6yszFUttktLZVtnXi3kuDRtDz/sJ5OxXV22LVZKMYxihA2Q/Dq/NjZ+535t7PF0a
-3E6sM0t90PBzJHT5SRrz+MtSHquWXGSMc07ChTvJ7sjSm49U8JK0NlKrXIMbnnPC
-0qUqjU5Jxyt7ynN5e/kM7y2YxjGrVeTE5xqbVT8LiY6bpo+ZdRG82/fr1m22xZSB
-38PxIyNMShQiH6G9hXLOZK6w3N5+X72HFAxu5NSfRpW6afRXqo8VJGH9x5ObPuVJ
-QLAiFlH6/u/FbMJ3EnnDq7T0En449m8JHNPxcyzXSV7BCP9JENSIjTahAiKfMpQX
-fhvwg6xjTyfA09UakjGjZSMkcm0k69uDQkz5aTWCW2iz7hlcSciTjD3IoFZBYmNt
-odoFMMIkDWQjASGk0NA76DcIySAGLYwAZPQkVbS9raOCXx0N4NPJAcpTE24YEIYy
-g7CfLWmi2E1TDcjdkTMXE0qKsqvYI1Rc1zUWKjBt3dZMYLSc1V8teNrSwW867u67
-u3XWz3uiTDJ7uup6aktGEa9d1hTNubvV2q883d3IoqVnZHRyRZT547K2nlbs57pm
-7cLQoYwF2iZPBBH+5LQ7dYkkhI6u5sNK9nPxux2bnayrYrkTq+u7erJbBUNziMaP
-rppVcY3SxyySyySfFXkjZSuA61FVMKi5jFHB+UxNKWOqcRzfOSQki42nkQs97JyK
-5amm58SFk3LVSU0uj7SQfqwEfho1r92H6uG22K2lVz+Uf5sqP0dLN/GejmK0sxrP
-xz1m2/05yx4ONjCbJH9A+8QkhIqoJKiRIQWkkRKAK20HGfR9lFGh2vmzMyyCig/w
-mlAinByNccszHu826vNs08OjdXU3GzSpwG2/sZ6SHoyTSVw0slcGjSBnq4UMw08I
-tvw4uHqDA/w6OSCRnyIh/MH46rxmTFxdHacVc+uD3HvflqHvL7RI7e5edJqb4ZU4
-09uYztwe+W/IpAaOoyLcwQVPk3k69Fffn6zXZ3kION0cYOXDuS+3vzTOm/K7Mq6H
-OlZUd7Pxxdl9t69NorsK6eU6442+am88vu73UsgRoV5Z211tTDr33RPyM6/XfL5U
-EDhtlOMGIOhqVFDMLDExeDQGHON0fZdtpnTpZ6cD6JBkGJpUx0Y0WuppUjCvDGzH
-Jsmjd0VyNNnRZ1Y1MNHaMbOGzcp3VttssZwsk0gsTGWj6gLXG8FJpoGGjp6NmZZI
-mQYvcYoaIEFW2vkM2ui4SWaSMLtv6RnW2Q1A4FIHgMRpRK4eNjfwZ5oqGaaSMo5b
-dknhw4SbOELPGyXLyqGoGSSqSomY1HBBVkQqys9MCWL1YjTEvrT/lW/HvnSpG2HG
-W0YwPtoufZQEsPWkFdi4q6Bs3tkoppX5Eiaqo5JX1UtH2/gzrxnmXNzE5gfF8iGh
-wMagId9OeGfjPxGKTtKHVVJ7vT6eMIaVB+wH3n3+jxV4Svh6l0hS2vo/Hxp46W8T
-mStcsHMrio8lNypolKYqrT5AyFDChtZGHuINKBspBGKg7kJt6Bo8fNBswFHISJJt
-PcLdHk1+NWshZCgqnMZITrDX2VnDFGhCe+9um2kaWy3BLFDrBte5ISqMa3whRNX2
-hdsSnCgdmnJiwaaFmqxgEhoSkmS4W5nnc2pOkjMCi0Pn4WGjUumeTCfLJJ1jYrHx
-jaFRrCj5qXWxkTinm7fk9Hu2JvELPk8MMVKpWKtKq1iVVKKUxXlx31G9Tw/vO6Mb
-E80lYmSJp0FRrDJyLJ51U9ZI6GiLTUsTlnZqBqxHcOldSSip2iosJI2Ehx0kHxDZ
-/AZNzYUGDTXrMplachkVuS1tsiYIYyt2mzZDErJJWTTEalrQplZC7YM+li2SUoxV
-VZY0yZkycNIiDcCJMaGNe5kXBpN+8HIUgoKqYnY1JISR6tshCE6JhknVjg6cMhWn
-JNlbSdppsotV9zG202HYjiEnmTz+E7xXhSrLv5ZtdazVbW2hjEYNKDGEBkJ9/vy+
-vnrFURs1YvpvLuyE245w0VLL1kr7cOg/Ba/Qf0QM8JPxZLLOStL5KZ+faXr7LE9j
-17oH4+OiR8orIu4h/RAagtxGICYpOWtBCN8eXMu7rl485VKQmKi+aU6rwbyfLXpr
-161+qbettfqWN0pL88tJbgpKWur4a8ki2arIszGhZJVK03h6o84nieE+RSDA2EJn
-ygppzrRHjjDHHjQ3oAGNIa0QIJjBiGd8s3glSnsMZSEY1I4BqCBOrFtgXZ7YoGff
-5SOeYkWToVOR6a7/Dmyl7pPebOTUlLEYebR5Ikzr5O+azEJXRy731dGOXtcW5mTx
-HG7GnHVxIbSbnuyUslYdMltVhpO7tytjo3Cx2IyGZDKmmWOxCaYRisSq0VhSVpit
-JWkrS3VY0DcaigxKkRFVBNRkkg1UhOMurldw8knJjznZobpJOCnNMtmM9JI/gses
-Dl0es/T0c4b+aSO5yy8it57PtER7yQ49svq6K2KoqVhjFUqmm02P9rP+enbyTaJy
-k7zyB5VdEyRHyqE2jlT/N+4jPJHNVfOPajFtvo+bRIhxDIiAREIBEBHmAseJvCKp
-aWSr3OREAnaST8LJp9TClbcGN022eOxs0mObY5x+f0+u0ck5RKKUopJrgB87bebv
-yv5u7W3q/fvzQ+JGypskPUreRLIrmybatMsX0a/RksaxtIKIX8sn739qsebzOZiG
-by7s3vdaJR6Dj2macG0WSRT7SDN9KC4xmGSRgRYwaf7MbwGIOPrP6Rb8N/DY1I1H
-JIkrMaQbxJHdIbifDkh15l2d27BHRHVPKch+6RBzeUnBMtctc4pKUyuu2upJrlrq
-667pW6+1t+6Vk20JkkpYV59A5unxbofu3vn21Ey/s+HYx9zasPu1JNm5an1x85Hp
-GG1LFk0RAJ1kfSK+E9UPntJMsjrKWnc/YuFg5pe8Oyx5qIpZEbwKh7e7yTBhymws
-JtGzb8PDzkfvPfLZJ5yR/o9pH2H9KqdtVVX7VbbWI2Nmr22lllliKehVTXVI09Cd
-Z/Ou/e1aKs8lfvPiSD3/Bks8PeYcuVmGgTKW2WyVY/isZRxJN2T4vyfP0vRyfZZK
-rbaZNZsTidKX8ofEcnunxzNEJWu9xbuQ3w1er3T4Y3g7/gteJ4WVbTtmn85O7lJ/
-VEnkTJ9atqsYYYeujDUxIwoxR56sknNj7SbuGneRs8nq4fJO2cpuiWKioslVKlRS
-pJZ/ULtdlKi0b+Z81+yixKtJIPDdvJ+LvDu0SyY/h7/w/FiNs+mias1cSpOznIPK
-yrHt1CY942YTzH+yrZIoqhOEiZIT845d3T6Pps/6Ofl4bEm9vIZB/UJBbEtgRgyB
-QrgTP96/o80lj8FrpZ3WuiX6brraSSqxRuxjTFUbWarrGGKMDbBcSioFSqf3ZLaC
-XBlKqfB9CZLWcmutdlVXXxEzqHZVo2a5uZjrbE5X5CvSKi2WpbDaOR0OqaV2Vjxq
-myEND13YGGgTBqRBqAkgipVktsk1bJm28lu2ll5dkUpklpVLKkqjThs7SaJqeWRG
-VasWSxZLZu4aIgE5GtmzUkyWRexTG+WO1qi40I7X+GXLi6g1d5IU5Kydn5ZoeE4k
-iNK7HJJHZ32hk/RzVTRzKwrOelrcXxZCb6V8ambb6i+3z7g8vV7o2qRK3bNfx+d9
-az5ZypWyvNOJkq2zTDGW3I2kxsrRVg0qaU6NmxvJVssZPf5Ch3jJZiNskkJC5thW
-jziKca5yYTlK0RAJy2l5f1mHrY2Dc6OkI2TTTy2TGVsRATPxGssjZRlnpIg3iSRi
-xI5OR2SOZJPl5/ncvR8vln1Y/uaaeTGFSl5VO11Z1vnvja5W9Kw09ahkgtDDYyAY
-Qw/WRKMp5aFVusKrZpjSKdZ3v58tazxmJb6NXQlD2AabBtG1MLD6P6xKQChW0XsB
-77Y5z/JBkkMXpKgXiWquYcP3Pv6+I4oBI7HediIrxI/Ei95EsFOQPxkk78pP8rbI
-tJ+v+lu6eiHk6+Kqz+L5PSR4npITj7fgsgl+q1VWGLPweJJjUnC/Grtc/J2G01ZT
-LW5ObQ+bnkr8xJ/5P/vSSP+C1jG1YK0Y1sao1qoiqxtFbG1bFRtUa1sVo1trGrG1
-RZKNo0UFSilTNtRtGjYIEClGbbBQhUJBpCDY1o0bFbGCxY1MoNG2zTaLUEKzFBMN
-tUbFY2iqKIjEUlZKixqNsW0UY22i2g0agirFbYrFtJiNJbSao1sWMUUUUbWNslpL
-WNjajFopFMhJGxRRttjbBtYNtoo0YrRqAKKLUkmqi2sSVY2oNFaNotsVoyQVaNGo
-o2ooqxaNUUbFQoYQ1o1WLUG2xVgybYtGtFRgmVk1iqZFQlJrG1sbWTajRaLFaTUU
-VRtSW0bVFWxasFWIsVosatiqii1GLaNaNGpINqg2jVoihmxFti2DGqiqNFrFslti
-qMZJm2sYTbGLaiKiNYrRRGsbWLbQWoi0WNGo21irG2RMpRo1GK2Koo1ii1i22C1i
-1RqA2o2jbRRjWi1jatG0lUBWzNUWo2xpRTRVG1G1Ftii2pLWTahQqKi1otitJqNU
-lGjJNKqI0Rq2i2yaxjbRqMUVYjQaKwVRtFjWiCyFiKsRbUWiosmsaiqjY22iqLQb
-X5/99f4p/uUf0tf5/9K/qseg/3/8O3Ejr31kY1gc5A1pvXCxCkNiwvOQZYLITeUx
-5CNobGwqJ5o3bWtQ2oqajkZRrRj1prYW5TG2RkzhxibIud1zezbDrRBn8s2xsbHZ
-Ilaaujw873Rttris4cJCx42DgiHZM67LEm5mczQU0zdbGxtvENm4RY8axrs0rvvB
-2Lmhu9ZH1rnXlfnhQMwstTWMgZ24VXZJdzdKmphdlKOvHF5Ypc1co3WpPG5UchDH
-HthGXu6jHcIFa8oQrWt53ErY2jQyDFGQGaaj15BbvaLTDPKU2xY9Mj2zrW2Hba2J
-jEwZb1mshmPWcZdXPGGDOQ4hqWsZbxqyLQ6ysx+Pu9UmOHJEyavWvHjbPPnsX1XI
-iq+W3w8Tu+Ry16Js2+QVNGKUjZLWwXGBxtiE2hFTSXGBGkBjMu6xtIYNFQM1yBbp
-9u0ksTStorHkolJ3E5XN5tOFjhjhwmVcOxEtLHxyyr7N9lk1DJaN0qwpiCBpBAPG
-3V0ccPvd0Avs82rSKmAnj7RQAdYSdYbzJjI4URnJfO3TT4xQ26ahpseRDUtS+MKb
-aVjQ9wg3lnedmecmuQV2y44ptKaHyuZcF1u1JXKJlu6pRPSTudsbp5qixXfWcnpx
-PboouIu6q3vjI6ci2PuVosvF0bH3kaaLyFWNsiaLGxxWqGnvHH4d8MyQpjfcyGZA
-6+PHVbTd22SxshNhjBvMiBiocsG2M5zFRj1yyQh5C7vZX53zDy85X19hw6XAhSc4
-4HRB2w2Jzqalk90qqeRM9JrLjIlc2+tvhMyT2eUuq4MdumMqyCenJRHTk1OZudfS
-+VfKOcyA5HHezeQrJxq2piOM5vIJjY0fYvMt9eOLt3WsvDtG97S85zOs8DAjs7dX
-vmFFxB5l4hvFFWKjG6TIUmyWmMme3cQzNyatha2CUx7UUluGUDYW7GzYGPvUZVUN
-2QruGNDbQ2NtNsoEDGs5S4Sw7tuXObFDTJmQpdzuUSm7gDGi7IElwyNbNWUW5apw
-r1xMC2oS5tUYZA2cHGiAzve7XardJ2IuYysvZR0Ku5Ck+2RL65bzSHlFlxDxNMK5
-TWUzcfeFomjrOXGkuCogWNpZb5Tmyes2YdxqRBmU6GoIV0TPJNojDDaqLiTC92lI
-44VORRdd7f/n2zez072fHsVc0lJBrBTJO0dTCCHBnnJ7l4TDb0xvuQrWjqhowcNm
-KETZaeWn2MKO9JNMjipkZF31GWlSxcYpJydb5hSnINMGPuEOnRLL4UV1hvIPGKBl
-ZvS4ydl0W3uRzvMAxgqY2gIYc5EjKevtHG5vkRZfTi704pm64VOlm9mnddnhX1d8
-i11nlLfO43hvIUvkhnaDTed1UYzb4SQy8iOZJY0OXGtwdkbrl6UMLqQoOxj6wqcm
-67PRzUcwOOdgLJgvlpWuyLe1MNGlSR9cdZItEm9xaWRy5l21raQcOMenbGPjUtId
-5L5rfXWQr2NbGd5BXI6+tVcA2rcJgTsa6HJhyR9JZrTaSuTN7tG94c7fN54bJ5gK
-AteSmybgHEB3lSGHTGcmecrPGjWNw+WA2uNR0erioM73usN6veTkgxmQtzC+7W1C
-52SQlmXcODt80oUQQutphmedzHoa0Pb5uGiUik1kXE7ZGybH16ydOZNOpe5Sgesh
-jsIhgWSTnObvd7JYyX1O5WwQQTtFWii2tYujUsWbw0ezmrTNw5aVPbIMBpLsctzL
-3e82boiMG5yOnOmm8fMsldyWw025uHyFFYaQ8uhZTsWKiNp8JA35OM6ztkc5IRzb
-yi5eshOO7RfQUENxDrF3qvnKutTq2OI2Axlgzi73va5to5kVtHbQ7Y32Dd1k3HCj
-LIPSN73VuOclVLYXpmseBJzbNvLSDWByI7kReScm2jiac6ztXZGkbaiCAyO2QzIX
-Td7J06xss3ieAXL4jMoKMHsszhnY2tu+PYncmERURzYjb7rVmXU5FSXuzzzvke8r
-flq8UMwGzmKayKZkWIVa8gdUzJzlgqDkEC5XJt6MpysuebzMk5crS96OkqQR3Dkz
-ElgmcLoCwfLTbkIR3GXy81m+S4PlrND69sIGpuN6O4g2ktmwgkuHKu9wyznIiYqH
-xh287t87BEPFkERt85JvWK2OrjtJEX2u3Obs84debd0rw7zdeXMFzOZDJ3NvLmvO
-W98l52eec8Ovx3URCkNEx+BY1uglDVhy3y0UPJcKyiDZjGbewQ+bM3Edm6FJOvzz
-azuclkGaGMcYNlfJEmxcZb4M0d5vObBOO3PN5hD0onSZ5O7GGzFbRbOZzlE2Rhka
-wphx0zrlixjRccimW65Ok1uZQ8tkA7rSLGbUGzJIZew32hAFkPnNVhE9MqWiOw47
-zozjty6kNk1N83UI0ZAZmzwzHu5NUqQyQow0vktdqtUDtNuQOWVDBrlBzZMzs4tf
-bbgLjvOVlw1POknTok9nX1y1i108eGb3lqIbyXdFm5ZQ1N1rdRtQsbwYcJmHBeXW
-2qMDeacg55NcqOxlx5mVneeFYjRYeJ0ckbFCkO9HPGh6Uz0YirAec3cAaT2SN9TI
-dhI4eu6xRjeuwlnHtcd9I6I7mnNQujxohaKtvuAQd6d17CIoMjnTcYTJ0gzDnLog
-y87zLa4RIWrjb3QJV4OaRG3hmhxMjBaozkkzdTcUbRtJzGncsju30dDubirvs7xZ
-JuXdqYd7zsWQFdt5eUcWbvOEb3hdO1zObnI7UeWd7m7t8zw5eWdMmpq9lvkl1O2s
-33XNPfK3sTSyZwcbL7OVx6ZFd7y47nYjGcfOl5WUbFK6jGO85fdlu+Oj//MUFZJl
-NZf1tARwa8BV+AQDgQB3/wP+ffir////pgsXwAAAAAAAAAAAADkAFvAB9CgCqKvh
-wIIRClJBQGt931KcB7ue29fOM4xl8OCCgCOsAD4gAMCCqAgigO4wANPNs0ABQWrw
-W94D7vhh57CBAWsPbK21bY1p2NSlc29vnvroj5VJCRUilcbPtq+nc7762bq+rYxo
-GIRFFTW+199fPB8oqqVSlUqJfA6522q9YIUQr2e0dTolBEUApKpKdxdyiq9PcxXp
-pT7XA1zw2DoUqJQtbhzOqiUFUEnrTwsJplFOzKlPLNubxmlvLabHh70vPbs9VSlU
-C2aInZnWUtKa6kV06iV7xWDfctwDvZfbVSHSMzex1T1Xu3dbtgdcgV00eRqTtivM
-xlkDWp3c5VXc0tLhitmrNiVChF12zldtJ3W27okKoCs8t8djvZ9jdAPWi0r3HoNJ
-bs1XKl3dVs7jAPbHmZ03gFeUl02d2aYcR6bmqg6173G4GXhqegQBAgTQSUPUEGEP
-UZGTAA1PCCSJVT9owqPVMeqfiQAIxGJkYAEmkSIQjRRphCT1GTygAPU9TTTEACT1
-SkiFPIj1MSaNAAAAAAAApSICIoiTMqepgUaeyoaaAaMgBiBUSIIIgRoEJkmqaek2
-po0BkZAPU+d9mfOtn2399/UaZITRTREBAJMILEUSZiSKkYAEmGm0IokQKAYlDGAS
-ykCCmWJBQBpkaKQLBIiZhJpSzJEhDTRCEkUETEKMxQRSIxiaGQREwxpZEg0KYgAa
-EkAGJGE0ilIIhQZFLKTCMSQMkBYoRIUkFIkmkQMZhGYyJkQwIUUkTQwJslEQk0IA
-pAEEkJCIRQLAGUhJM0NCzNDKbFlk0QYEaSCihZRNABJhCZRFKJFkxIKRmDJEZZSi
-mhJRNkEjGUIIIGFMpgaQMaSRjJEYTCYoGlEQpmzGZLISlRlCGEIIyYMaZKkpiCNI
-jIURTTTGkmkaGUWKRNiEM1ERkZEjIyMxIQJRjBkKTBJiUyzM0BhkLMYkJEwQBQGh
-pGWTRjKIE0SYCUjDSIhmGkyEZlMZjCAYYkpimEBMZlEghCUskyWQyUZiGYJlEmSz
-MmKRiQMLMxTTBlJoiJphJImIigzIpSYzFIo2MUASSpKIRJiaBiFAGGmgIUlEgSMm
-BGIZqYzQIwIpIljMJIKSZE0FmAxg2IjIaNLAaEhIsCyTEgyGYokNMEzTMUiNiMNg
-jRMMYSSQQhMghBgAGCEoEY0SkZlCiRhRQSiZEQgKMGQFIkkGIySy0CZQEqIshpMx
-jGSUUKGSQogUJJAMg0YhCooUJTKEgJoUopZCiYLEUsIkGESLIajJokJjEQJgDSli
-QhGIaADEBsWJJAYmkoDQjIJNCNGUEwGZIEkqYjAsbMbGjBAZkgkBKRjQGUQQTKZg
-ymhiQIhECNhhmMyEMgjBMYCJTZBEhSMpk0zGlEyZSjGFFRQpIykkjFCoJoxhpIQS
-JoRZIZMRmiLJEMwSJgibCaJghRAEyggkQySTISQBSIJJMyjWKAQSQKQYKLDSDRFg
-gaYDJhkRBqJiSBkSyBmQJhFNBESMWJkmpEwkjEQxQomI0wJiRijNKCQQNNhaYhlk
-whhLKEYJKExEESAzLCSURhIAQIJEpiQklAmZ/txdd3XdcOzl3Oc4ca53bsdc53c7
-k7runOugoiVLVlto221GpSpUtitttttEqtCirbVttrWLW0VsraQEkhMxSAMkmAyS
-CjDSRDJCCJBly6RMJSkkEJIMhCAo0wEkgYIkQzrd2YCBRMZSmJTCjKhmJIEiTDJM
-0SUsIxIEkkRTRMyEhJCSBIBsKBMmAohgwmJIkkCQaYkkCGSJkxCMCTruhzdNjaVq
-NGI1qqn/H/D+f92/9N7/nf+x/T/BM7+j/3Df5s4H91tC/+oosD+/gYNHpnVNy5J2
-alEaZU/66SB3/PXf/7//et/nu+/f9KKr9VSKdhIptIjKzARQZZiqimGUFLMlVWMj
-MSUU2oif8IKKYIhlVIpkBgFFMIYCimSU/8VUimSiVoFFMUof/mCin/KqkU/1/2/7
-ipn+uSn/P/jZ/qZLjiqHKWmltwNK6udN0mKLpTbnFbHSxf6h/6WePKShwUl1VbdK
-GyqU5ooa/vt32BeA5cSpdlPaWguWZVUxZht422i4WJpNsWzjjnNrttYxBLESWBXA
-to5UMFuThmsrEMqjbDpYOmG3M9440VM3kpxzZ0ZLjiqHSXODDEyJisUWWKaaZVEW
-drHTWsbg1ZFVRmRGCMFFhITKNXhUhsLAnAXFVTa2xYZviazvp7z20VOkudsVqq3j
-OeGtvWOVhDnvvuoOynI6VhVKbaPHLclddm+VRwsd9tpyhwG6KG0tNMuNM0w1YZC1
-SUMAuLhnLQOupddA65UOXPDKoZRXMpLJUsrlyDY2utozHDrg6uimKZS0WgtDKos4
-KnPMppbMLnNIaySc5TMHGbaxTuqd6qpHacO527Xh33/xUTIdWeKTmjbsg0PYKnmC
-1lVSd88uqKGOW10E52BMkmKtkyldBFsScY1nFJZktZQvRzSd5S0O9PG43nhMOVRs
-OXHDbwU5iQ1kkWZEeZGOqNqS6xHOJZZIhTExGkq6rcObBbGrBOaqc8OmmJTzI751
-Vi7Tx0LbY0JUgoOEmzhjjnptxIKus546uBtXLO4JkyYP+eAcAAHOD6fr9j9V+RH2
-S/L/QXTV3dz8SL/T8qH5noZQLPqGwlvR6dhx2TVtfs9W4cn6VF1Rfst5hq6EbM2q
-dokF7YlT+AevC278qkbLKawmh4pJzRaPv9leNe26uHhSuwBuLK+a3xCu7uCt8ICc
-hqAubTDuymwW6zBsaun77TDCZizuwBP7lwSttmpSykZaG/3IVw50MThjdLpDuH0k
-DTDN0e2mvqqKkAmVy9EDwysGysaREKB2NormNHUwj0vgO6IiGsJpEuyQETJyWsUL
-zZWvlFrieCawpUQgzlKTRwiZJXKyzbD3ulpxiGZ3uqqknBCteytK6wxraGufXo4j
-6Ql84X68MHo9PTm7GxF43W97OVuPemu2nSInel9rnXmRB4ZmN2FaIWPHWBY1gskI
-XduCgbTFmxaE5YSihkBIUBZk43EhJxOAqFTkTEgZg/58BOXSVo8zbqfJfApfLFzo
-w/f/d25jXyxD+I/OeU0dcx/x/aRkaa7TXU9oVlOfGYMm7+LW4ifNnrp1XifHFxMu
-5IbmiCprTZzImVSR0Qa8znKbkRuKQuyr1cokqPHOIDMit4yc4kkbdortTU60qgIp
-BnSrVsKMeuZ4NPFFXo3ratpwLFLGtrbRUbc6dxjlHMt30iALUHtqu5g6R2+W8fwX
-w/9tjnDISkwpFIFITGooZI4IpEG2wm2m2Gk22+NttNFNpstJJJJL4r7Fo9BaHfpy
-dVdT9v6/JXtG67C17waENSlYvNK2F2WomFGFDQgRHIUKMGMIWE4Qp1LPYVOJ3ajX
-ij0R2SiUikUutMpXscLDown53VRa5NdNBc3ojNNaETWjiHFD0SSCCSSSCDKT2PSI
-aiwTiy0mbTO6iKbZNVIZ/GZuWsmDvZ2jyAcoTPVEi8HyYNj0fsH+BpVN61a8JAiY
-SJvPsFnwgTI1HXbhbNF1FnpCTeho7rSi2EUjT83q/Cmc4nETmio0AIuw3CbLSbKx
-plU6HxSnZ2X76jMxwG6zEfg/GT47sv4GvUeZiImjSpzqWhp1koVUQmYgZfQYMrIw
-zgqXzPClmVSyPgXckhxZXzdVcKyu4Qi0aa7hpB4IJs6THDITGdymCiiMCFZjbbD1
-Zs2RDWNrUlQ/P8x6SH7v7Pz/8fq/1tn9U3lWuTf1JnUUMBZ0zXwlfGtzjVdDGdNw
-/Wb/TcYvZhOV0yvddt9942XK1inv3hKPY1yG22ftVJYGIHecMa1WHrVRdWNFu82a
-cxAgPKsqap3SvCX1k9lfXPem9N6bX0uaUbPfM+K4StqpjulMkJsnYV74vTdMY1Ed
-oFSIZ4/h6sOvXBROO5iA46Ydg4cPQkTnMmYnMTmTOZL0JQOVaKsWLsGxYqhdCCQM
-UGxBBBEJ7+U3578j0euaooSZ6QPtSOwWKBXnFoZlecqTfq1/RtQ4OItiMpbHqNXS
-LBpu9xQ9UiKIOt8lmoPPrrV81xoI5KWxvXhM3vY8pR7qqK4YLstYwxOVYstg0KRO
-i1fLX6rgTrxlmqlbrkE9LEGeIed9k26rGnWed6Nh06p11O87aBEwmLoD3HcEEAkE
-GRBBBBBEkFZVQUUkTHdrccRvm2/fthj1pS2KWAbKGFox0dOmXvOlr51nWKGJum43
-BBBIJBq/KsYn0ippp9W01W5ZRjbTSfDNkM7isVOp5Wk82WrJNLTsbRZZzsMYDiQS
-QQGRB573Pe988yZmZmaB0HgHcz7ZHJKFgkEgyIkiSS9eHnk2SvPDryK1aqqqmtW4
-PSycD/w8sflE+v8v83/dyIplqpb1llszKa0Kl8tWXbMGzMy8XWnF0X937o/wO4fq
-0+r7tk9qe2FJ6z3CkozLYqzEKiqUFDKGP7kqsHaWq1aDYcCQokp/eU+vt7uZp4fD
-vw29FcKUSuratW2rX7I00/UcnqCIfPyP4ftqCVUyNaqZi2P7Lo2/nvtw1Ntxu2Ov
-M1cLOMOjTdl/Jw/jqwjhrHX7ljvTS0Ng9YWklWliFUpZUiCjOKclNiKmjWdFMjuo
-dSAo96JmslmGgyCeUmmjEtITqi4DqWXTg4318osVuX2Vfa63aYJNvvZpHIUVXXbr
-pPMYqxKrXRvoXCGuFnXhSb4SVZtAm6ojtvuIBkdOcqdgEZ6lcZZFN1kPKhJJhRBr
-WEQyIWkl1hnFU3uys63k4eJJlSIMlKqoErDI6G4EEUnpZfaOrlixLp9DvOUpB4Ta
-n2/ZW/q+fvPhH07t9H4MT16XESiARMKUE/rVVU3KNwDooJ7dlAzgnD7EhScMIYxZ
-/mOidHDestpVUIAEgC0t7/m9fLzzvPVb1fK+s+Y+f0Pon6xzJ9vzOD8R9GeLf1T5
-3aq222kVRIqwftW1VyfHRO+89MPe5zaktbKQr49+/jZmajwxNu3Zk7fVWkSWG+K2
-a1xZlKFOw5BlJpDTgyzEORiGVhmzt4tctufPV1DsnIxdsV3SbUdlXBrTgwnt41HJ
-0263X9faPss1y+iNSMUfp/X6ff7/6/TW98cccp1bYjhzq/3uXPJj5bT8/7W+nhNo
-/69v1+jGyfY/aaf9UV6T6SQPl1Bq30rH6H4yV69J/bdqqKoSHon4AEpmUtPAez+t
-92Y5lOj2CJ7CYdkZxf0D3R/XfsuFMS/C43Nv5T9sfMZV4L/G9pvd03/3mq9yzlm2
-xVJVkOV0LvETLzsJRx4cqu6dXdXXuPQcCHb7ePRk7He904sDcwdra7Nt9q7VFY9l
-7jUQJW14xnuJPn7/TMw/3fPn4+Pj6o/Cx3cXKtqlrD9PRbmYZme3mP9E/y7G36I/
-LH+Z9Pht8Afun7v7tJGbXiaeU0eH+Gn5fst6/K+NqmUrWijbu3DZSH3hD6nZ+o9S
-qiIxVVjIQnk5/AzMrhcclKH4STg5bfDDGO33aTpJ0rlQeHwTE4GVRAlhOxMpdgNv
-3ajAlCIVM6Qe6uKg9yOwUV9eRvl2dAWQKng+meXZoWhDqzCyCFDwHzqlW653rPFy
-aXH00S9/SI7ZIaPaDOu/U2err6Wt0/RGxFCJ/FfXywJ+Z0NuUscckrzN2LlS+4To
-ymv403aBj+06Tl0T6Xne5mhKZXrsbvOuKiXR7e6HiOm9CknWsik7Lmvsvrn08oTa
-aD3VS6R5uebW2codGHht9KN5dWRYyrvSKCuOIvhyuzboi48y0eX0b1ZEk7XR2mzQ
-lIxgob6yp54pmGTlmwZ30l56vdry8vuvXD4hdHdkDKTAhgiUo5KUmzxNmilIqOOR
-j4IT356J9N4UeHHbOSSOyBPJ7lSGRJEjG2PX7P+mxdE4E9kZhSbrNHt+LR6oxuXC
-xtS3UxPlEzA5XpdlqQj4iqskZZ3pmdTpI2hJsTma3b8RF/EoYxU2m5oFB5TT0rss
-2w8zlr3Bw9jYwgtNtPCzmmpqJwmZzfsew9o+/u+NCiXjuaEvhdu9cDRPzPZbreMo
-pkxCrlWTi29L4pZEMIlfLbK+xSL0Zqy7IjaLss0ZGYsGcMGrgagM+zilXFMbIldU
-QarxUPisyxhSqeew68PlX96+Vn81ovsttNN7r2tOwJnj1OGZ6GmypFEL/OURjEXj
-xamLJXj4pVTillprNqvk5OqCY8vVrvLm3qoKGDgxzLgEkqry6tOg257kmNzyTdlj
-Q8tAmWAyU3697unetmwupGywUXVcTN9MqL1479u2I2tsRZbvyj68/LNRM01plhvS
-bN5NcjrrccL8Htyj+BCrHefe9PVPN5zrUH+1Pb6rXdo22uWWd/EfwZZbUr34gOaZ
-1MdLqLC9RP7u6RSO3a3RxXP8X0wBLkn9FRxLMv9CJEbYsiOpgpUSoa5GSlIQU0ym
-1JJSRLorCY+OqjQVlihaqBciZcOS7lgmERMS0iZQTN2xVFERDdrxbKJtzCzbbXC5
-bTm3j1zMs1uqI3AHShpYzQRbTYKYrZRILVpDLWCCHKKFK04Pz6l9+B8QwVBx3HZ3
-pHj9L3wPqk8LV2RT9q1kZcelVkMztswvhMxRjp826SggOKFASfzLUZH+Trbl452C
-rv71T9Wht51YV3hXG4QPJdqV3uZz13mwrzVZnjVLbVn+YVe62EzchMqtzShLkKPE
-dMnTiMTvOqRJbzVhxDI1dd1rQhiTqmcLOhwiEgTPFVyLB/BYxVVJ0qTbe0X+E2NJ
-5FQil9Im2yK4hAhROqTbaIFD7Kzyqk3ny25Hm6dGXKvdrsl+j9LTNJyMbczUREDG
-XgVzlti/gxxcK9lmrQmuXy00nPZ1ZnYMCOztzV44ehTr4++n1Tt21RvA1/+natOd
-+etlwD45o3FOGbqiF43Vsp2VA9kWCP6ERX78Jds3aZdJHuSiVaYad/n73gTnNOq8
-bUvQV1ck9/tFEv8o/X7P+1ZhaugDmvV+7UkaQ/vHB7fX5WVgRokFFMNzV0S7rpL5
-fPt5HpdvXdsa8XNCJ3dO64RjAXp5PJc5siQE7p10k7q5MlxQkHbwYYb37js+uXMr
-XQD53nebkY+JEQ3Kr6j5LcbHtxRKez7rjvN74ZI/binYF32Tatmu8Be6TXLsrqtU
-SyjpPtDkefbc/yap8EMZR59eNbE1KJt1yzjkr8IrBj8d5+WZHW1FCToyAsXOUEXr
-Wtq1r5tZb+GoluBz2+U8FT3va2RkKc6WR3ZeNn4iq1okKrUThD2MqptNGqiTJ4M2
-f9u45+/nwFAQyTz4I8lDKWkdQxJJEruEVFU6mHlMh/SyVffytduOEYY+qcVewuWR
-7sCx2jKWaQSEq05Vh2otTsmLP8nxVuGAJlL6CQ0fXzP22Mn0O/dc+RzxqdnXq/N3
-KIZUKGEwHCFgyKwJcqXSyY9+KkWLMIVwWZW84+AK/Bz5wnaLI44LmU90x/EkyBYo
-YS1EJA9jWfE+/5tRUV1ipCoof2zsjgKQ8vpHUIwQU4hNNSOW4tYulfaqfz6P4wYH
-GDM4DID3+NqN1ONUA/PfuPMRXS88tk7zKq/wt5RmaVy9WAxsjPw3pHVUomq01Y27
-q1V1m7Yd2KfWl+O5Zq7729d9zZ0l0p3fEcrJ5YgfbvWje7O3f3xZrowIWRkq4O+T
-FRyxJpiWo4lFPH3WrGdl4cvrRgQWOs7e+Rm7Fg5SGPs7K8wII3++tGhUMYuglST7
-5KtdoyntNOHVVlYkvFyJtG6k2rcPNYnRazDvM0jtv9e0GxHtPw9lbsVHo999iMnW
-ySQyREBBJkSLp6BsnvG/p9faVUKlPzdQ/ZVIRVFqLwVZA3bCzzChJo/VG3vBX5SF
-rWK1RZmzbONI5WDQJSoSvFrWQPYWLVWpk4wJi851alamk1f8QZvBepyqUITCUW1M
-PO3E+bYpbGJWorqrG+spHFPy6ovW+piPxPDpvMK9cLBMXT02D897907tO7q6Tqpw
-mu19VLVj5w68m9aLxrh5pRd60Z1Y7OPlnWyT67h8VWsGO4nUUKiC8Pu5yxhCT898
-xuvPfY+fhoRK5T5qvf5+ore9q8fDLTyk2u/mia2vXGhbTXwjpwro94vOKUYpdrNK
-/ilIKJN59XedxQPPGvYqUmlTpq88kgneW7DHmiG23HMo7Zsh04+H7xMdo7xOJJtY
-eizcYZdt7XbKVK6OL4vQLe/M+3jq86SgU5889oFKfPVuxF3wlFrkIun9efjz79d+
-wYeN/C+u3m1rd0jFGq9X89KmLLXN2C5Po/veZd64ndf3MKIxsceKwWTeL7MD3i1L
-FVj6xz2pzr8QKCFNCFKpIp+xTH6JnyBsNsPitQloYgqd1l5g4jhq6cPDUvHlmwrI
-oOhRQkOJcJfIaDs0KhNWaJJhi4g5WXdYcDKbkpiy7o20IRRpRFyOFooQ42GI3+Su
-oMuUwozR5RSK47UcIoQsIwhhRiAXHRoVM/c+S9/l9R47JC+j+m/Feaff6jz8TUQc
-fBu36cbfXyrsgqiUIyVfLNwCKvgnlBRwKKm+brfbFcOClV8LfTPJElZDw+Yw7n3R
-/39I96pWacn74akmCfZk9N7Hnbmfnm+G9N9IIVf233Vjv2K+dmOqXTgm/cpSxjx5
-NoTM+aO9xtTisCE1pRXSdT2doOxqKdUb7MQGth/hkgx+xCAlvCV3TRG0Ce6IyQW7
-O5ROkRaOiwj2YN2coi/fFuizw675bLOfJnWg2VO7rRIEXexnFH3XUPPfxRcRGzXs
-xpAtbS7eu63smcY2W+6RTU1psvDNdHE51pxd+N1FlWJbYbvu4qRoHx0s6pEIRV8N
-xbCsclUVRe1t0Tr9/qt689+zMRbOMBXqvBVD8KyFEO9HimPzqLzwaL5e+3ZBPN5Y
-7c/Kfp4kQCKdTjmOa/v154+n3TBe7/D3+v6r+/voinkqWoitVotACCo664ufF4Po
-3J6cfruz8fcQTLL13Kd1yNXLle7zzhNiNjuuwY3dvT6en4e/3/ffT7fX3eKmQXX0
-/wDQj59+yNfHDLb2ngE11HTs1D00z1Rmnx+dfhwbhbzuLp0qd0QHMBspKuzzC3ON
-dfyL9+3rQfBoYPjz4zsDVN+WG7vLnXx9Tr2sSvtE8MUa1li7Bpqrgl9mbKWWkUrS
-xt51NbR1yPPlQlNbX2vpMO6OipAZVCnOzMdCcdMd8ANNA3fU9nxFkfotXt+qp9oP
-k+AQUQa8iUvJUoSVIGwuzKjMpmM+3+Z0JJ9oAjV234RfrNBxtZMos3vCkrhlcmZX
-JZqK1aqYUg1pqK4fwfD1WX0eSASEKQ/xP5j5X1rQTbnv3OI8ip3bm/IdSENUwIVV
-CBlkpUlnZ2REw9p9/blysnsiOzjy+3xKhFfg6Y9VKDt267q3dT8u8J9NhYJotAkH
-UBPU1WdVV2dPq97X2saP9b/I78+d+hJa9dsO8Dq7uuiXBGuVPDdiDl5sgMgCCkTR
-ucudbu90qcSryhxzaniH091sPgD3KHqWgJEDwpMCgIuFF5DDtnI77sGMf+eGrB8U
-CUkTW1qLEWR7RSwstGmUIlsNwAQgEqgykQQLO1knr6u1ttq21Hb6I+XSd9/RPL0/
-pE9I8J/gr8OkY248frxb8ffHG2a4zitLxY9lPyn2k/bD85+59xlp+/KfS6jzTDGV
-KlCSXUKDuGBA2GxzjS7K6hA7uoAgSlLYS2qL/6jhPn+y2y2u3o2Tt0/s8v7+lrl/
-tPT9O/Fvbfdk0V+HtoX6P4/h5fh/Zzr65P+z5dyH9HPb4K1fuqT5PuQMhcP2210T
-TD6Tx8InpqHwj333mVmPK+Lfw/Zy/VOHTmPh/Y4e230Y6cunLw2flSdvb90NP4n7
-P7x+yfRP3enyjwH7P7Pb7p+s+0w6WTLFVJtJ7fRw+3jh93hw0r/PVq20NKhwUT+m
-nppNp/lXTSUy24lK/p9p+x+7bhT5Y/39es1H9J9h/LTt/Ha6djhODEY0qtFflRyn
-0FY5fsE/Dp0+HL/Lb9lnh6YcP0Ym32Y/Rwp+H3k/Kf3z7vTy8I+K+yj22wqny+Ps
-dv3/tbwj0m1dOmO2g8Kfo4emjSqXi3tw+KtNzhy7Y8PwY/U/sn9o/l8PSD+utZcW
-37Ph7krkPur4qw0fu31nGszW2itKPy7n5Y+v8W+vzZf2Onp4K8qjB+bb8v8tOH1H
-B8o/l+O9+G0tG1pa21taN/eU7knnyMCjBUlf4T4Nvg4a8W9DpG34af0dOXz/L8Bt
-/Lo8d/GXPh9HDFcPhj+ngr92if2dHMPk+xw0x+XptPtbdPTbXxbFcOvGltuZktu3
-B29JpHD9/l+75T24fcjp/93tG58fLFy/Nc1mOE2PTw+O7a/KsP1dPKz1Ielp65m3
-Lly5mZmOW2qiqrJOg0SUOpO/Ym4AUdn91ovgujOz4FB0MBZWJO4mPoNtb+7266rf
-z9zM1txqittGlEv4/jbbCTioBO/q3CKi49u7fnvTo05uxVVX8Y0CiogUNx5JLet3
-YPFu7NOEC+62c7AwsFCz2reusG9vMFWax1VlAwU1dUyIEhit6aC7Du7M7VdNstC1
-lXlm7XRkSLM0jajTZqNBA9IW4mqEa7U3XwsODHDZVYjuyTqypLVdoZbqcyjdlRjo
-dkyjWpGBmkajVWlJ1DzMPPfJIIJJJJPAQDIGiiFDI221bW79r+Dx4685zOUWtrbb
-fyOzogfCvL38Olr2TVKbaW0vvu6QF5fnnbMxw4f2Y/dynRyqptyw2Smnj++v21rW
-uHL/Sh6afEfd+rg7tq21/aO38mnw4SfDyY9KYm/9rcSPu/X7Jy8DtpVNp/s39X6P
-xVjyn28Mf2culqrID0/Z9WNK9+LbXseXB+yp9IezTttsnsw0m2J9HPXrTWa1mZcr
-Y5Fj9fX8f16/rtx/W/7ccT29K9P8fS2fRp+r4CerERJEebBr/HVX8Y2yv6ZK4N87
-Oc3/UFSf54kQJDPt4hEQISiNsJ19vv6d5ePOXnLnKlVRMqnKJRN8HOc4eHnBzoIH
-MpAZ5mOq2Kzf1XTznObSPHfYLFdt2e53f+MGA8zED54z4hfEg7rRJfbXkeq33bpR
-ebgJAwUvLQPVZKKFSSDRYI4wwgQCBcqqHmqrcrro/+ISKcn/1pVyxUc+791ve+Gi
-7f91U5/UtURLrEFwxif/K7mLJLLBmTJklllMbAuMlEryqfWitYksSyFR0c9WGSW2
-NMjKZLbGmSTzVb7Jbba9lttvnPje29ykZaxopllRLYrTpUlc4iY8qqyI5d705MZv
-u1ZllGstGZYT7z6Z6plQwqduumGQywMcHwrK86pav3RTHhW18XfjLFYyWbjorjna
-TttpVOBUpg27Ou7MrMMyszLdHBzymitUJ4Tz0dVMpiyXRJDbskep0BN7JGO8mdHV
-Pd1TStUzfsg4eXuWE9PVt2juEFWDZr24eiXW5DE7KjZzEOuNZG7I2ocWRlLYLVvF
-GIucZOLIbpOKjLLUtRat4sjIGnHJoJtX59aGaxoZtSn3kjr/BfvvEueqYoavHjKx
-lfTkQc9PwqlPyjh+1Tjaztea0tZo/XVFD512U2EDj9tVTpSLeu7zGstZacdMaS3H
-LvcS+9fHUcNsArlVO3L8To+YZW3QdvX46+4ZlyqnDs2vzrkqcOL7lnnrnu8/OY54
-O1Vp+VBoMO5sxa7ODUmwnEJvqyTdRq22yZN7KutPTVelXigrJvTW7bYeEeJUxwNk
-NlWq21IcSHn3w6MTx68cHTacUEfeN4zPFzT3uFY7X3XTNafe0tNeKqbVU8s+c5mt
-7E7erU+HTx2Su+OmvhpwPmcIeHwW7qx29oNMLvh0fHz44pNODegO6ZMEIgYczrCT
-WdKk8MDFGSiuOOdBzS1zZzVoqio5kOTtbKzi7aNMZgoHKdbV9Dlq7N0h523x9+6i
-49cdHhy5L3Kdee8uTrlo5JI8MkRs0xx3Jy2Vtbxbho8Fzs+RYy555fVjxRvjk17q
-u+TeMhUNSCJxOGSaXOJIampROLhmaO2zc6CyY2kbd7PgiY9Mkmm76s3Tx7yp8fnf
-E1+NlrW6nhoz1fPXb3ymeTtuRGa89uIgybYSRnch0uU2n5K6nymfCrxsnUc7yc9N
-gY+UCpqeMhw3YTjNExOOB6OpwmBt07D27E2yOkgo92SedsjGFb5T4cKHWuV2M8cF
-8zMy4FsuJXHLaRIdimuHBprXH3TZTtjDi8eLZ0dKHf427eFdKGF72HenvID6MMOn
-bCLWNsgpUEoZZG/vyoPxPnHd+D3Y+H3rpjqclZUisODjFbL69xIOG+QclTpogxxw
-qNO9m2ni+V9vD2uz1tpoxtt5t1PjrlVPhy7WwKnZHuC3ruTKRLY2yUlqGlKqWkiW
-y9iHnhPZO0rN94N2brW8hut0yR51BrPKXs7JGxb5AnRiZTl2Xq1hpiXy8iczq1p0
-4OUvW9g8WPrtcenxbXL58ic8LgbnL1I0m4MeNSM4zVJrWW9uI3DW3tqHzluUwxR9
-+s0Vc0hpweORY4VOtNXbALUCyXLqNFcCR7xxw8jTkStO873DPfY017vHfEhE5xAu
-lh+U9Pt+W9++O/u05zeb4c7pzjRaWurtlU91y/Pj38bnSo+8PfvF8I5SNJ62aL20
-QZtJUXrrTO3rYPXw+NeuFWmevi1C41Gt1m2DMqHmySGsXd4XEMFkBpCUlZSTWAUm
-a5gWmZLEQcLCwtjR0rZplkWrZuMqsNpWrMyvBJ5/Gff5lT3FTnKql0x9H4PU/DTX
-OxAXime7qULq7DqoaFW7tVaVWymOAghDdEltpIwwyIooHivfPjSHoqKy0NCBIRpB
-IGQK8fXhPBpMTMhc4OCJWMuxlIYammJ2sgEEXEs8oDopthFpLOUlVTJVAqKGFoiu
-fFmCKtsq1oM33uOW59vV16cDSvt7p7+u80IySXnVy5lF3Mz5ZLDu9ZrDzoUPrekc
-9Ie3XnPlekWLviZo7sWzm9WT4r4vmvd4+Mn1zI9eadvv8/FYv0fllb9OdHfmF98c
-xiihhSVRBRSemqq32pgz4bzMD6OjNYamHHHp0WsLbYyKxZ3mLD52kY91zW6fPB9d
-GObcd2fPPjX0d4du7bA4tvfmSzb6t9NouC2GU+LHHGJNXK4s3xiY6MfbxT4Z83cZ
-UuZDLGk0mY/Z/iHrRxSY3S1SG9mvzS+bvxc44Th6JqNHLLC4ZR+p+NfpU+sMTeHg
-a67ZI7LO0gsjRa278NqHpyOH+PRsdMcqF5x65vjp0KeJjqR4dknzo+Zsle+oZmSN
-f8ttztuTWnh+4V2fpXP02u7ttibExiUsNhbdfPzh1+rQ09U+enFtXS5qQkjjxMd8
-MkkY56cYwqZcb6vi222vU9cyYersXMh7cOOI2Y7Viz6BNspac/J9fjp3RQw/gqpU
-1kIPpx1mbn6DEJI5wLjKElOj3z3XAvFr+HD+fSn8rhs166dJp1CBw82PeVw26dIv
-7MUi/KQbLXXHt4nPh0fSOYs35zI1WtZGrbfqaOvlNp6VywnitCl7G/RjngwTGOXw
-v3ThnnFFDb8PHJ2lL1vMzxiXS7Hci9P169PULTtp8MorSZB25VNA4Pw6X609+3Vz
-WTVcyRy2dbt8H177mEWSRvh8M+vSerjnx/SZfuZ0beIXSUuzna/Om+czLbbbVfTz
-54naAdd+pE26qa+jh4iOkG3g+U1FmjxmGX6Gj40+jLEntyrIn7/D+T8fy1+Pjjup
-Bc3CtbNuXO2tRdulIu21ItGsL9ccDt6aEtrxfwXjqcDx58HqqhesQkkFR5Hw5s+Y
-95rjxZ49Zxzzzs55zny5Y/Trf42ninShp2tC5MykPXPDq/HSuOcy/Hrg+uXOZjhw
-qpi7evQ+G3aueLbIW2pPLBOXPB2k0qeWcvH8dPX3537NGVVjFVhhjKxliVkqkjay
-ptqZq2S1WktJVZNtVJa0VtCm2mzbZsiNNZVVSy2ti1tS2Sq3md9hy4638z5PHNMz
-Ix3IfMkD8jgU/hevg0z6O9vrhfx2u0pdXi4ooddn1WwLTt3u0dtfx13/DwegMQYQ
-wdp85zgwAfA3hJq69eh7Lu7zLGHl5V6eivCu1elHunTwnjRy61p714uThUcOOcz8
-O1cqxabWOunLt5Rw9iSJHt3F3y3WWZdtujHhx50iRPHtKachw2vnz8eK369x98Ov
-hw2vztQt4JRlnK9QFCycOHEpchMB0Ym5SeIlIUMnPFcafA3klDSwWSTX9VVFP3k/
-KQ0+nzF4rj5wtvArh604+dqCN3Qjz0VcqypVmrlXVlSVcqyiSeckRld1JlJlRlJB
-zmlk1LS0RqoTfWN3vzzprfXjY+ZUWT9c+ednqsvvSSJCkAXphQSFpCgXIwRJFQeP
-HfxpU2Op7pg4ZhX80D8P0HcE+tvtafe0PslS2h6bEUphB+Trt9zcMySlFfrXx8s6
-aKGUneDdfjQ99/yYfX7l9meCDI/bvJDJAQgdu6SzNW3eZlBQykZoKrwo37d0TaW2
-0DnfHOPJfg278PvnXg+re/l0U+vfj83QmJIyIhDN53JH5Px9XhPr2/DXcY+NzGJO
-6t1p8J77+GH2+xfbwXyN7S7ySU8e36ZcY2cmX9ZqJVTbyyJ9LNd2Hy9pFJjOJx48
-YJh9fxDDVU7nuPtjdzVxq4025elJxy5kTGLIXu3JDla90qnLmi/u/hOXSqnQu+mf
-lpHZt8sRqH7saHSSEQXU251XwY4dOFRt18lS6cUnTgWreu+m18JO/RkmYWb9Oofm
-aH1PPXk244ZeFEhws+fI7cknaR6D4fDdfBuITwr5+BweumnDtjA5GjvZpuOHS0si
-Djw9vK9vVXw3M4takTts7RicqcARg31RQ03CvXwCPOWh+DxPrrPL04oI3S1HWXPL
-V28NsefHEu5KGKEqe8NJPYLCCHQMJCQ7PR5y21rbPLh6zyKm7rpxn60/GG3l6l0b
-Mqm2VCL8CsOWG2Qe5VVUemVS2xUlz8FNVTjEzB3gTsxNJ2NL8fkcfOEhUaCuYPW1
-wuNRLHrVBHPnUBbfGqqnLbx2unVlEqcfFU674T6+c8eHON8cbcPxnVY79dPSQXrj
-j02ctOXInljHDTacJEg5ZB5GNDvHrWNOquSOU5GHgGIrXB8Q3PTh49XFuZnMke3D
-Pi349tnTc2x78ZbabfvzMff1Q00qpoqlPdKqaqUObw73hT5rm2u3Djb92qrt3QRw
-acoV3xS8qpNypaaM8CBy9599F75+N8/OM7xre29w+OXpOnjtyeGSEgrypPNCAvLz
-gjvv0nE4N8L06x27SNPjUeRJEjXk3zlzOGsVtiMq9O5Hkcp2VPh8K+XJ7XZx9Zvt
-531nPHGb550jpsrvKpnZ7X182tPp4nB2m23Dj50a+PuHwWvHvJzCvWfD1elNOsfN
-SEgw75bTbwkkc52410eGuLbzmZkZvvVmtPrz195lSMXTdO+GvWa25VN0UMpetNG+
-NwU07IY+Tmk5PCX1drtxw6VwlEnsyq9FxYhCRtIhPTOT09a7ZutZpiLA6pDtYY3V
-5igfFU4zU4brTy7ejat64Qejh0SJHTSTZ3u3h212EB3mgeekTleTDmSOOVnfrh6P
-Y8ntJJ7Pr2KTqnMOYbga2JznETGW1bGqmrY4zLwt8niQD18xElWURb94FyqjnAZ3
-z6YJ1iOcC2nMPuqLNVQhSiLLqoyCroXV+YwVxq9cddcOZJtS0iqScZGJbLQOBQXO
-HE9q+9mbo5znrM8crxzyCVKhGIK9qoKpR4L0FF29epznKxmhKoosQGVDU2h3Ay47
-SFIJE+nw88FX5l03vzu+JfbrzePF0kBSZvDVsr5KaIWZmJzqUoIpQrMhASe/z86c
-6HyL3ZqezLvn2w0+aVZ7vTMRFUZPLRe7Rk+Uox4XrFfp8/Xz18+/jybiRw7VvURT
-5MeVT3Td4+Ma5xHFTVt3xxqcror7cx5cZbWPo78+Fcp3j1jCSRIxTy4+XByxM192
-To8aO6enDlp8Tpwnp5LwvE56l2zffqYlRPPQ4gQywiSLYYacvPXtw/DHocyrt2j0
-e/enNm57m0qsB8YrRH1Lrhwgi85HTIViqnpHjX5odbWnqdJNpywNzy5F55CTpz3b
-Offvji3GWujD788zPCvnTt/r5SH4mbMvVznmrtcufVxUd3tFD8H+XCVA9+aArHR5
-t2MPNpfFspyylwe0mEjs5oJOvfjxfnnNXNbdJPJ5YcaYgXzEbNNe/DNpS95PXWbX
-Lj5me++lriwkeI4ck6bca2nHauuzfPTyrxRXIm23TPacNjajfNUa97T754q3c0rP
-IE5Nere/DaZzyBPTHL667M6YMUiwUw84c4W+5rlfVR6zxCzaeKly9x9x6DhaooPI
-1CNpPHVtq129Z3bpzpOM14nhw8c8mvgVGdYiu3n1jtni6FPTxEt8uOLVAnqxzGvU
-4XXlc09EDkrS68VHEuLovfh0kKjn16nx2624KnuSnHXYVkIprh8uKrXkxp5Z3aqc
-aeE59GkSJ0a8drt6aX+06Y9W1WYqdPi+di9Pw6evm8zGnrTzvvv+GSuG79/XDiov
-H0qepaxPYPTbhXBj1xR4w6Tg6NcOybV4+Om+3X41ItLvfGlU341TWO2R7tSuZO+O
-3asyajzIENvnh5J4Xw8OuDlfBN8GUCx4420ZVU52z250coXTppy6fELl7Rjpy+nP
-x28cG3ng7sNCRkisEe3Ltzt62dtbszTgXpLw27ePvRw+vlFcKR0ekbTaMSHDJB5e
-nZ8vLbTt78dG25fCwkJ//etW1scxPdFsVVsi0tFqS177RsuXJMklSkhrEjSwORa5
-3WlxTnZfjFJJ8qqYtJkGIYaQX+CRXd/3dKH8uAJ8Y9cu+OcSSPAL6Gs336Z468Zz
-vNxQRIyXt3dm7s0SAwKIJ5wEk8AwcCHFznBwg8o1kzNO72t3vAPY+sfngZ9dFb0o
-+X4H6XmWneYezTTiKIZ4CUUD4QEQCdPGmwTwkyTaXmJ2d+i8PAPAvDjERepd2Z2U
-tFeZqfopOh7VAjAeQ8BPpenxxACAkEQhEExObQ9XlR+e37Iw1mN+ICD34z4TEzKK
-dyQ5oUQnsRgHH1l1ker09IZ4KIqyrFUOLmqZbKLYUGaGAgOcGgdbwVvRho1lbYNU
-cdPj1zU4ogY7l1TxfNNPT+zP92ta1Xu6TpY6QeISM9/hrny59kjOErh+Ht2BPj57
-6L5BzgoCDQAx6HNqd9+Dyvbt27Lq3osAuFDt/Zv5zu78vxMXPz5rDDqp1z+Pi2nh
-zxuQkFAnqvWm2HD09db9dvJvpZ775mY/Nd5n5du34vVU6F+N+jTb5SesToqJfaen
-DXwdO+bu81I8knny2dLk+lPtFD493Hx70x8+ZnD/LrkygIFr4AcZGrTDQcMwVWSB
-UIKC4cStoBZZEzt+9tptwYhbUixKXVLSo3XvhOmipnoTQ+XBJCdfHJ8r47yZmPlN
-tp88W+HnzreZnj2dX2cPfT3zCQm3ifI8tvCeDfBNnl0nnzDynndrPNObjUhIM70k
-+Phvzu5niebfbE8NY1HHuJBzqbt41px6TjT2wnuOfnskTlZwenlVTqj+HnLFtEu3
-oQOnRi96VHqH1D1c+g/IZ9nQp1cZlfv1606UPjEUVw/C6dh+Pz4Dro+bIdOl2OTP
-vLTZ5+7/XSX29Bv0PSCdHY28GJ5eY3ddXvTet3d8H187Yn31vrt8fNKu1D4+cOuX
-InT13p65ql8fJv74217Pm/vXbqk3NtnkqrqnTkK7wpfdhA+r975xmcNIp7Twznji
-evTlp74w9peduGxXiNdczaymNYnPSSSSFdH57db5cA+GzcQeEkOBjPVentzlrtHQ
-fBtWJ18UIb3yjguww+BUcg8J5eHbljZU09Ja1euOjrmjp59ooZ2hzKN2Qay4mLA1
-pTOLMipVkiB0k7w4rISoDm5vGxYTTI8ymFxmtm+OGuNY5ZPbcqyxJP8qLkqcrsuN
-XvVCjgr1Q3zy6o5T0ZznGJlVeY1Td52qu2m5V2aq1GXbu10ddY3rOrpy0u3G0gaI
-oCqoGaZwMADnKp1up7vrdzvSOe91CCUrW9pWJcngyfSVtIngw8zxCUFzpAJs+tb5
-Zsn1j4Dp7628zYe6Rgm2wa9FYc1vkPNMB5NQ8Ic3l160dXv1c6zek8W9yRs1O1TS
-z1rN1EhwklOMD2NGX6ryTXTqgq+B6Y+TGD0AgzsO3XvudNp0bcBy7fASeOUcunRo
-167Ew2GNnFZG/O7eEsenI5SHrvvWZ2addPjD+TtfXdODuwvq5huPLaODCtE0ntOn
-L4e8t7dJ5M07bNC1FSRtpsdzzppPfI7dxw1640x8bjJekxsa5Y8VNtjEcBtCWwcl
-ZTbCJcD8HrfbHN5KHTo4Fp819fe92ONY4erddMSl2w76PG6tcHtZwrlPXKVGjFac
-1j+rOTbp5jOXJwuP10ofsoU9Td33dv3n1t2cqdfj9Pvyqk2efPmZ48XTl0KlODvM
-5h0nx+MfdEOnxtt86WaVU/eucz4+eu3ZVKY+v3r850xVTdadrjormihyN/evHXTl
-OFR1cY65NTCcRp8FenYLLIlUW8sJOnpScPWt7tZIJtsSOmHB33atvt8eF2+HHiQg
-NCRxrt5ejjpt8Lh0U4HvntHLtejv64WuYovx4cvjudsIfUUV5bOXl6xXKF8KXjpP
-vQ+fOmXao1fF8OImWnu/i1atr4deV54zS60z0kRUkUeKm8HijJ0r4pFq7Fh+ZW0p
-aNBfXr10NlfrR0278/Td06Kxn1/HSm+H8Kqdssebvr9V00fgPx9owrAzk/h42KL1
-67fvfB4VPiUIfGBcH0P4etPoVyKa5fXxT68OOsAuVItPWj1w165dPPO3Prp1euH7
-9fds6coXoqU5gR9Lj1cVXDfOfUFnHKJcn73553ve94fphI76boE5x5eZtBy+Ht3z
-2NsO2PGCnbwrDt+Pq4KodNhA28Ozw9e3Tlac0vVRrljGXXjK74Z2eHlKbXHRrpJ2
-M2gxJI5S8WzbWJB5fOzzK0ngIDK6THQVqb+66e221x72x9UW+rxDexdJ8d+/O9Zr
-M1mXw8jyxjie+j29RJENvabZofCnhWL1wD3ljj4BcQ54OO0GkHSQe/IN7t4HfjuD
-tPHLp3KlkOazq8sUy9Y3tjOLJlCzMmaWi4d78Kd+VQ0sVjFFisKSwqlNNSpaCyMY
-JhUqbN41WLJEmRFsshFLI70wpzxVDVJQOGVDMCz+Yz50FeeCnxee+p0OKhjnr5nP
-et8cb4wgYO5ud9c665eXro2ZltpaqQ2VAWc7xIg8F9WbmVmuss1wH46NPSq6o+75
-r6ndGvN2auHmEkDx6GEenCEQjUVKH6S7o7nqeTy/VH1TrvmVfi24LBBw8xYwSNpE
-8sJnV1c5fbaj7DwBMORMfPLNZvLOcobrd4s2vvkgcp4VXw0SckHZ8PbX4yw2pF80
-01SGzT3e1kxTTTd04UOGN4uYNHi8W+3ItR+t5UkOHvho7WGOo9fXnnm5jU28kkcn
-h8ar34DKQz8PS+0UNLpvX12vxVVT4FixZRLGVTCKg7d6NpMKY20fHFHbPHAd9cW8
-W3B6uvHn1lut71682+3b0eekCcIhIfPBfemlNvtyBHAV/OuTYkcsZ7vxb3PCthAc
-J5Tp8ErwsxlI0n3rzjvR4rr5meB17QHbhSBLIyHa1ZzsIKrDw6gTDhlwJiwFxV7C
-TiTvjH4uOQLhBYpFs7g9iZz1eObpyecFTp09Ydve/h67KmyAMb5631VNtmzEgiaH
-voEEA9jOcHBB6Y5jttTflN4ntsbyJB2kkiqnekzu324+Oz6u+mggPLyZ359BJ5B0
-H75vv+O98cccbcv12976z0kU9dPnSF745HyYQ33cpPXoOXLOhUp0DfHblUbbed8u
-lr64ejy5Ydw69Z2I9N+ed8a3ve9zh58tTm3kTpI2VpN8Mb84XPTbiYlSnHxsVKd7
-5NOQ9jvhPHro9jznCFWeydPNaNzME08nR6LWss1Ouel7em2Jvht075zNukuFDuk1
-adIWgfePGTgVKdrr4ziPTO8PPDtjuAh51atsnp486Ws04OcX3GrzMsVSx9Po989d
-4u9uULJywb+G3r10Y9F054GPrm4+L04ZJJkqxvxw8zVtr078cZmaVPNF8eWOnzjt
-m+Dzp6MOXKqbXT5aKmzzblVTg1w8Fy8+g7bfFrpVSnXPW1fHbb1XDGGpmJERNfAa
-YbUdLIY1MzGDJvWaVJua1NSM8i0YiLdVbblrW5bVtO8YJSMqFKEhgmDmWUhjLJDM
-DKMoiZY0CluHGm7ksuQolpmExItaAGFEt1JhFAmUBNrbKCiJTAyJZtArEMXRREHC
-ZTHBRGRExxlmSkstEbmFe7IABXoWWFGHTOoGks2lkVQKlwsertIkulaYxU1YkYar
-IugRakIpIA20qUYZmFcabhmNazfPjwNMIdbaUG3czeq/mv+/sp9452V9fRjeX3nA
-+uetKRd6dGlzfHRVjgAwXV1frY5IFJFDJHyc4IKXOHll1l7lpW8epW5ML2nMCWfF
-zdoNoJaHyyw0D1bEtW98yTVcnh6l4fNM870OjJT1pY+N9aOlHSOoPVAjvfOy6XY2
-YjllLzgBwOAG54zy9JMd5d5Q8hgek7RpQ8GnkrxxqqbKdNcHfWnS55Ncmdbrjhq8
-o7ZUGlvWBfCumh2vHI1+9s962fXxMfAcquYF86TrDOPl1vW8b/pXKecTuBeH0U+L
-2fGp45XJw718Z9c+sP5PnLvB4ymlt2KlHLXaTto+Lz741xvN7za4jqJInjts1qe5
-S8qL8mlDH49Q5+dZrXjzpsqcd5m9LldKpvtv4EDZ8DPrN/Putb32490+paWvg7pO
-vrlKWmnnI72+pedYn31Y0duGm3a9uBOGOHp0h1SV29OedcZxres3mbt32npptw7E
-xetpdUUOnblLt5m2eaqlyh4KfAeqHL66aztyzHfh69Zol/TfR5kRkieuPNq2+3lo
-JODHljhPalUp+OsY+bVGsXp3+KNK9OtuXLOAJqZoZPU24tuyRwnGurXKohrzvvvN
-a1ts2nXKnipqQDwxOu8bJI6ZfCCZCNw6XfbiBozK29Oz5zmLqvm1x9cipT7Klty8
-pOF329uON9fPvbr1pzeMpPe+Hr3sIHq4+uc3mZ3PLvZO09OHTzESDs426htwdn3f
-VRW3ZttTnnnM+rHbw7G+GlU7XPMqrzx1qcbOsdvGePMYn1vf33e97bkXTF7M1573
-x3nTpy0frx3VKHxzqqHTh4ED3htxzp0rR7w7XpnFbjBaMsMAti2WdMGWWphmA3IG
-ILJKMBLTKBQMAVWSsjIorJMWW8bZqzbphIxqPLNyrUqhpj+j5VOekvjvVUYBwAAa
-KM8rSbnby5mMvMGZKspWru7uiVau7t3V3cu7uqaSIWAE8B4eAc8bruXXY8ta9Ryl
-s10jpy+y++675d2EUSCjzzqZO093qYXV3T5vii7tdBPVdZIj3ygmbS4u+tw9U5gd
-efWVrXZ6tawSHPWTXMsxnk4iq+i56tphw8+ToZ4O5ATgW0MkEcLw296lNsfrDk50
-J1jPLRV90fWN0hz8XrpcPBenvXi8edeZs4mllq+utW458+TOnpnKJE+E9OPI7Lq6
-OG1pjRt3w5fVc9jp+Ncu5Uh7FTth7vi3HHbwktHIvTl5d+3CHhU0LhwySh1NMXTX
-faqcvPWZmV6OkmSyxFrWcJrWi1kksrvvgqr6xW9zj1ymeq4dcNajmbSDkR2mTlry
-5AnE7fgk9Tk978Fs2pXhPvjltkl3AXoF93yfjrr84+98655556eaKe/TcvX8+tDp
-+Pi1RQ8fdUu2pvFdMbdPAQGNN8ivU7S9Ryc166k8yJc5IdVFdb88+uu+/zeZveuG
-j1wuL35UllCnrTCt7IYcNxThFFbQtqjNZgXr60baY2hffWp4+ubvM/NIWzW5Uj1D
-p8eU+ZTg3naukLoZzl+a1n3vGta8samSFp7nvlKVuVxKevXTjTg2duJ3SfNK066b
-lwcPF5xw2+0cZJzrx68c3veNZrGOHXbTSSRwPSDE242fCWz4vTsVKYqOF4bx775p
-0xeOddrOpVXqcPaqqOW22WtV88c4xmZY7dL6ei956V67bbVtWu+nzM5fLQ6pS9sJ
-RXrzSp0cNSpHqF1oswXg7xoeipTO2OO3gSMFkwqyWwWmzzmd5mSrkIb9W0R4V052
-4SQ8m/L07yCFN+NEinDh32PHfHDzfDTYp2pF9vXXneZ84x6vcPRzRtDb1rS9KNoj
-G3tt8trVSm4nKzy3R6xxhOMVR5krVhMyjGXOrVEkqjaow3ghlCSpZNWBcVaxL3Fc
-Y9ZJpkrnJzlzh3m8wze+XP8uV2KlNuHovYPm99afPmu8VUqUJ47l3jmZl5eHCqbb
-HO7xlEBFcBA5Jb3t32Zl9tPvd2smGycKE9uyfDQQPDS8Ltb4qBF9a8qnudmpDwX4
-+wdtdWPrzp5ZJ51IafAcnZAsPkypcqpRFBAcxIYWs3vTR50fEtvnqdcUo/dUXwei
-bTydGiJ4PFIOWjex8NM77ddunuIT3rfm5Wc23BHly1Kmmj152czh1j2qUpWYqJEq
-vL10rcCedpLOreZEjlnPpzu3bt2Pe9pIbbhG5VdskX49R4c9PrbZr3tVMdOn17de
-nw+aNedrTuVI+Pjo67O359n1jijiSSJ9jstJAwAWh6D6ObOekTEOeh3nAr2g7ynr
-8xXTOMYFcwj5xiIpx8cwczh8LfyjzhSPBt74x6zvdzHlySLo8nCSRsk0eS6TRbxm
-Z3wnmxmnHMkNhygxjtJKwkU83mOviqqNjty5d4e44KmUaw855t7i6cPI8nbp5Sqj
-jbpFk2djdy3yk88pG+mJSHbOXfhw58IK24kkSC+DzcXXnNW612O4HXcPOwd+O0Fl
-8PvuZjsCx5376uzwIG+WIPHLtDGueXTEg7dMzfR0JnnGHYm9idAqLLCyKsqxZVXx
-lbdLKpppSUky2SmfGld42pFyh9d+861rCugePr6r6xOggdtdPr4hx457uTlQ/lju
-vcrnltjnbtqu9rUk6cL7e+9cX1mt71d5mJrs2PD2zySR16d72kTx67dPB2rKOy76
-78XpyWhUp8dXq0t/AX04768zWa18ejz5cuUnls27TZy4O2rxRtxcg11S6cfNoYO+
-+madlcs6drb67VY8K3zSk4YqtLvupO/Da6JNXUsg3mJLapKtWFixTMIxiMYqYxW1
-DMkpmVKMqXrbSzMt9/sqIqP+t/93+I/0n5Sn7T+QT8zf0X7f+TD+B4CttqUP4hlE
-RRRTARIfupD+YUw/Q0KfxO/YVFVv5cOFw/8J24f+hMf6Mf+DF/3MXL//P7Nv+9/D
-R8PD7NE/L5Y0/73/Q5TalV9v/fbLbfTY6Wd/hbKsn7vhvhcttfh9p/Rx9F7ThpoO
-zo/of+imn7jnrLbavsef4r/UcA+RPuf3Q+f9UqkU/8ap/+MFIjMqlZkqslsVZsrV
-JUlRZLa2yy2qaRaWWqRTKzaZooGCAwg+x/nV+FYg+fi2+gz8s/Z89W73ufUfZfMZ
-rG5jSeX2+tXiLy5tM25ZFqjVUHVXHVO7t3Rjfk7WWV5Xd3zfCC7d74/Bsvzb8BBp
-uu3U3zvXOnzxjyszB3F1Lpzy88Auvjt8OJfX88hg8tvPa23zrze8IBCEkACBACSe
-svoy46IiKqqiKiKrmbpczNUAkJJCTVerLbqur773rXpy1c6c7tea+Z7XygAnXQEQ
-RJmCo+i1VHsgGMnt6oTG4h52C6u8SvLrMP/waB4Bwc2A8sBaDwhBB/o7aeobMefe
-uPi73vZt7rVet2rb0T0fQ/9rykNCbO/hd3LcnNv0nxbJpOOM9dbX3aauDKzP4RVk
-8gGChiP3tin+2Ko0zGvv8rm997r3xV1pt67QJwiEFqEG2tbkdFH93DBwDjIPBfPi
-1V5aFeIAHWiKoxX7fYcN7XsJzs2YByCqCB9JkFUVQVTA6PRvzz5effmf8/OC9PMp
-C+ZtzACFV1K3GMDvG5p00Ri2rRwdRGfGJGZluZmRrhVWSvlPXhbVm0jUeerZfHWX
-OyPb4dvG7fq7d2YuV64ePXrvx6mb41zvjnrfDiqrwFcQ9VbJCMKmIWYsyFKsKZAp
-mGYZYsykKYZSrJYGZBVZVDChZKsAxJMKFRiFQZVKxBZKLJJhJTbbapSlmzRec3cV
-XShD4BDzmq1wkRIYPpUFVy20DjqcYA1wAOHwq+O9r3vWre0sCbAG9xdKyeSrfivb
-QO34ZArRrbCmGhJ6LPbla+t+POc5nw7qzbdSzdq7p0eJSUbVXZtq6NOrQouWy7TR
-Es2HZNRu1Stu7Ysi26gMq7VS751zzvXPF5506HQJCRi6HLltz9uN8Xm7zDLmXMwz
-p7a33LluY0zKuVZCe1T/O/Vl8LrrrqrrpOIUG2dJip/z1f+mv/K98HqwOlWunXPV
-64nVSTpZbdoyVil8PHTcq/c4iSP+Kkth+WA/sxSm2JD/tMfEf8rSNT+n1kfxMmZY
-y5UmMVMVJ8ZbwcyYSf/ThUxkMMoOz+R2qaP6HTarlv9RaiqxhI8PDkHT+8nW3ZOm
-t1jbpR/acHDtXbA6Tww1EzKi2KTySO7N2ZTCkq7jYh702RpxAodJwef/IaXmsXK/
-lMbLbeD/FpyuGQfEv6LSrGVZhmSxSSgoikttRbLU9uW0NrwxmKrwfsj9zZ07ekki
-Ej2irVcqtMxjTEjVXdf6P9p/KOcsyr/syrMkfUEhI+3yT4fG7atVVren4qxU6V/T
-taOFf5Mj/xYPqwPYq8bLlYHT7x9X86t2frOsP+5UnmbJUjANvKTCvZwkj4T2/Xbt
-J9f3uJLlxpGGJJwQ+9LUNxUfu/pLKj7vl9RwfBGH822fqJ8ukk8mkR2V7eCdNCih
-4rqR/FLZ4nb6xyNCn1IfeRyyRO0OnsT1CDQ+jZX2q4iaXcThcJadGG5K+NMY2w4X
-V16pdJLb4bb6ykpDJjVVSiyDx2/Ppatf7fHfqTzbxrUmrdbU+rGg1FD5mI/V8tSf
-V8o1D9E2nlH/Sfrsr/yHD/OP4SeoUU/V+sYwlSp/5mPQ/3D64aVkKRGlSewWP9VC
-GFgUGZCQwsROn6CqH9BPpvLYlK20kmjUqRVZgh9aaGzdo/4oxbVDFP9/xGOTxP+x
-g6H8uhV0ykMME8OXjcocLSqeqxYyhl2P6/5Hp5nNLf8IonRUqUNjY/DbO5llxWJF
-SKUSsy3EiYhPJ+cGHd98MzE64M+DAkD4YiKRisRkTDMpmR+sxk9icopWw4WnC1/0
-5aVMf79WMpaf9tje5Pm9MTeot7xUVJUoSR1ibG8TG+mE9pDBpFKsllWe3HKtI8x6
-SfEmFttpJpEsCWDSlS/NdtwJ44ls8MVRi1bmLU08xzI4bQf8lyf3o/X58cfuZXke
-jA9K/Wkv/oCpOX8AoptO3imxpWsWZVKaPlFYOn5ekY1bMWGWYopWjCWGKaLTIGkP
-wFSZp1BRTc+o1ds/D/mY0uThaKlVSilOHlj2XFcG5JxLZUjayIhAAACEhJTX703r
-bKxG0kYoRihhijZMYwxZWGEbWSBqVDlZMpZTZStskllbfWleql5taVJKGgnkxRrC
-VSqptInylG2SrIwx+wwoppFCiU2sGh/NQbbQhTFWSmMltqpy9NIxK+lX6Y+UYTIb
-ZDzMDN6G/c8HjdYsVEVWSZxbtU0dN3q1u3bFRfC4kqOpVSPLo0pZSIiQOFnZ0d4q
-sQkz4Qqa1DlekfEJApicdLA4a9OMxhyvFegkCmuM2yHU5NScI25iY4U24jHLltts
-7StNCk4frJzwu0Y6VjDDFk5RppNKqlRASOcpVq3MyVYiVt25mTCT+oTRDRPR2CKq
-KWrVqlUrlqaNSrjDopxKbp6upXldb1PU9s4hJGJA1VbLTiRJ7eok2sM+UHLbthMQ
-UFfLLbZVqqyVK+p1Equ3tpthzYl7KWLEMTEq4Ll3YoV5stLbid+m7alklmvcxMyY
-aGFGVGL1wYwx7R6xjFy7cn0pouDotHyZkzo/hptTZOkPyO1emWMxhjZLl04IdDYK
-mkh1kK4y2TMxcjHDmvtbZMWE+zDHXCnuD8yQLIjg4UlcKxjHr9gopzYxfuda1rEs
-eHCK6OCQ6xT4Pju3n5/X9kkiEj6cN+/vl+uaZ5gYN/g5JlAUHSDiUhoOAhwMFMVB
-c3DDHMN3DFulS0xrgWmW4W5cMuZhWta1rW21tbbRzrJVtBe+ulvYM/s8dPjcuY66
-qqqisgnSPat2gVwbVEysKVgXdk1QJsk8RJCBD2v8tenlrnM3edFeqa8Zu7mq1raU
-mEZP6xTGt6zMkdvq9uZwdp7PTR2nSvKidMcnTDZCbRQfLpsjVtrN222z1LI9jbbS
-Yde7dtk6DgycBMmW9OTcaTFMfB8NtuYiTvVscobNGKRo6Wb4zDniY3e2mSmsjJQJ
-4EQ2vqQkRVGM8qYh3v0q2rPteqmFz2k1KQNMUOrLk2hBsGYs7NRoFGZ5rKHrKVFW
-Up3oJ4GS+bM2pvedTh2+z59qcemFaIM+lnMKY/XLM2leOJtTiZEVfbeon1+vwZOB
-hQgviaCMyAjYhRqyLmywXa6sJtAjY0ekbBVdHErI5ucHJgQ4jsRIimS+VhHvLz2P
-o9PoKp4fLy9uDHljDyKyG7cVtjlTlwPJ2wD56Xk02ttipijbGTs6TRK6R26babRK
-3K25I5U6OTolR0fLt24J9HaeVeHM4svhpuNNlYp5eDRNLKaWrGQiqmZbs0Tlo8Bp
-tppto4ThGn0cT6OnAeX+R8K25e3KOzaUpVttKUnlUhZWFTasOmERzfpmb6O47lt3
-Whna6EmiB7nAKT0eA/sERTa2uhyCini85zJ/DpU/B/+m3fJ/wH9Y9AkiPcclOX2Y
-n/g2elK/4y2ikYKwUzMZcuJVFe362bbaGluwykCmE8ysyzLFrmryuvj1Xz/S9/AA
-AF15cn4TbNPgsRs7cOFV/dG3g0p+7T5dL60/tdkgpyzk/3v8imkP80cFiv6KUxX9
-LGz9Vfy9n0NI+HBMGjFPGRfU20/oK/wT+7+V6CiR4ktktkvJP6O5j9KtpUGP1T4k
-kf+7GZWMJ/d/NKP8Ksq/q7hRyh+q/vOT/iN1f/NGJt/f9yWf5H9z+wKWITjGZjP2
-GmInSyTkRo2qVStSThT8HxX8MximI2dIqo04dIbQvxbWO2MVGkVTxHSI0R/h0eev
-LpWSyT2p9GP8P1y2m2c1q8325VIvE485eDI9AlOHKGBw4JhDiv5HUmnSO00Q40Je
-rcSSy5GXLGVUp2n0eDpFE6T4Y/r+er5YqJai+n4MphhmLSwD8QKQoGSRJ/o+6YvW
-aSVmfLS2qpnMM9WmHTRzMJxy0qHVaVETOYZ1ScEwOJ9g0NPAmjGk0rStNtsbQ5MG
-2BivKYNI9Fvbiqv8b+qqdv6PL9GI+O0lco7fpI4cEi8XLlw2kn5YnpWFTwgTabky
-liH7Ax+fy+323r5BIEhez17ddXMxVVQFUOdlCkEiQJigNAR9MV9a+Xx16vk7dzgH
-lDoGcCQ74xnfnz3rzzvXO4dlaYNK5NOUkh4fqSweoaJidvSK2eXFtkPPEfCh9Gkm
-XRyk9PzmZVzMqjDGleXlHlJE5ZMZSrZt/Vu5MHK/2HZNP2ivmSPQ/6qw/Hu3mR+n
-CmQgJH8fUlH/NlVMZjKHCWNsfyX3+p/53h/1MZA1UFrEx/2ManCu/BiYs5NIwfyV
-9hsjSn/V9nhY5PhjI7Ullm1JVllLfJtZNrGVSVH0hBWtW0eniUKWCpQplb1tteSG
-W0qTK02llaKdJIwk+rhGI29xHeDU7WszdtKrDKsoRP1Geg1MyhiYmBApJgHZ+sFf
-yDkcXDK/ydg+VJSP5sSdLVsKtSHjkwmzZhbIuvbvTXnHN1BiMYylZk7k/LKCYDYH
-X13JBDq8YZURZWoixpkaIyJuN7+dTwztXv57+nThHDDHBkYhVKpPSK0UGMMYTbsK
-VqDzx4I8qh0+G90AAla9VKVWaW0s7IZmGGCsGJhhSnC6DSPacu07EkRI5jWcLUjw
-/d2+p5LbfLw/ft4tspaVjDMYWjCpQqLBUhDSjgT+k9T8hNA7KVTkkn2GnDBRs4gq
-HgJXCnB8vaJ5e0/l/WLbZbFLFUpVRJECIT7iSv69sHJkTAi1mJkzExpMsxUqaYaU
-miWTRpNtI5UcttEXFPVdQaiwV/wNOFTaFSaL45y+41lrMYcvR0CijhslcNI/0x5X
-Yo0kXy7cq/RMSNtOU8qn+U1IPp+mXMmZbhJ0PZ5BISOpVSySG3jR/pLeKmXKxwbv
-w08D+N6WzGTJkSeyhTax4Km0mkp+2qVI0rFU2n8SvhDnkx7T+ba3mQuaiT5PhZj/
-BPIPTKvh1If7V05H+Z/nVSKcn+SK/2dX9F/Uvj+tYktW6Y9SJs9U8H2+uGZNORKn
-w6+2/Cqtq2vpfTblsuXEmsGzllqypVLFYDCVIQ9J3NuEfwGnxGlfyMeYjQf6WRG+
-x+JPz9kl/QyP6sMY0xZf5xV/I/U5f+p6o7h0sRjp934eHA9K9T3ZcSNLGkno0CQk
-YVp8JT0vFuFfq7kInwp9TyTE+k95/GX6qj9zhqP1y390T8OTsAJxZv0pBjS09ndu
-/queeVeI9GunPNTJtIrybqni5552x0a9g4GMHRBAAhHYgg4OGOTGIx0md24x2cp1
-ws56tnBhyqW7W22GlI2+w+z4NJHpLENNvsSMmLVcLMVj9GSBNLTXNtfwxi4U4bKw
-MhtuWyY+2mWYp5ttKqpA6paj8vKRxEawvhY0NIfgfiH9z+yajt60n97P+eZ9rS0x
-W0+VV/0sP8sevxzxZkupTbH8sPl/D6tcrSqnhp05PlHCOok2cFqHB+kTvuQ+xWMY
-xjkg4SNqTWUt19K/fat9iuFW5XN8JyNMVvGVP7r82PqvjL7jtfwP8yYr+QqSfsJ/
-jvt2zClUVYzM/e1n9tRN7Zd5buwMVVKqRKoVR2YxVWrU0/hHBU0sekk5eWPDSfeZ
-dQOaqRT0r4rFtLHeZaEkiKs8vN+vcjw/CGRlxRVkq1SPDFexPt0FOvhPFuY6Tbab
-lve6MycQ4l0tzYO2m5eZhoWcZUOk7NTTLtwdLblt25Jy6YaTDpixoPYKKYtMSx4V
-/I+Nn+ZdTDBNJM+LfQOkttkfVOk7faSBw+y2ei5ZhaxgYP9nmnNi2FstI8cfri5j
-4bHPFumZbbbybHMpMg5WROgw+Q29S8lhiiGULhSjSdtjNpsyIlsyhYqxbcJrYw+o
-k8CH6HRjSvDSMVFQqqko0xiIclqrGrAw0hpi/ouV/i2foVy/oK1INsn/LKzEnZt0
-0/TfY/WWsZMkwqJFKpVKpSGE5kJD5cnT5T6BPRj2k+rIH3fSdvy2kEdD9W0T4tsh
-+40PbR+xRPpJN8azaR9OJJrfGcJHGHBw2OTGMmHPduPz+ryTH3/TGTMY0bTThPa/
-xbhjyxUTFkr8JJwYmivf1xmZJq2ySlSoJPBIfK/rASBSF+cM/nZk213bMmBX5laT
-Tg0VqrbakxFiRzCeLg1rQx4xf2Vq/pUjo01d0k/Vy7frMy3JIUqSKj8lG44ZP1xk
-y5bcTEsHL9YMZLGF+0n1bjZ+MHj6OXau8pg6GVof9Cv/Y9BbWvn632UMYJoMElJr
-W1JQhbfu5MliIQxxyxlFWYJJSo/lsdkj/9Utg244/f72xHsUqlRVMGPuJWipOBhj
-qEkxqGNgop68j+4/mhRTtlWMEwwuUKKdDCxGGldP8X8NFUz85NW01rD7NpifMq2W
-o7dpQsUxivU9S0/zYuHDin8gytmwSEj4WYqVwrKqFn2kfvYWyx06X1X93T+Vj5iv
-X+C0fH6nAMNqMKFVXg8nuEYKKk2Rtat7V7zXsSJCUSSRT1tPuvGtNOFnGGB1Pnt/
-MW1VDT4EQ56UUWLFFBZqjHB69cXANNLJbE0k2zdlNHR0OU056txtowmLOO1WSsa6
-mpA1B7TlxdF+0uvItZVay3b0whrGdccXinUpEidgaTHSdubVUqqtqqabViKw14Em
-JmDeVXXLyvKySljtLGMq1t/wTEMgWhujLDJRJgxkJlQy5UMlB40srBFeLlq7bpq9
-ptq0rbSxohSrCmSRMyzLLLMSFMMqVksswFVkqTKplkqwklGCsCyqplQsWLGMZZmT
-JwN3COMLWLVtt2fFUij5Hs/SR03sfZ5nglZWZjJSqn822RTBpyxvWHlVKjTbGVtS
-KqskrbRpKaRWKlUqSk4VwY4cYMNTGkW1bk5Mk2jbg0RUmojT0wxxKQVYhbbLZbFB
-oqok2slvxSlrqul/g7aXHwxix/68Toof7qkpOaD4wC2yq1EwXZiapV6/hsyJvBiy
-EnDHppUrseSqqll+rGDc5R6WrvWH+G9by3kboLdJKq9H7sVW0OfMc6vWl01qZLMZ
-GXXa6QEItcit7KxXTeedbF5N5WV5LJkt1ZLKLEMplYlj+iTA1EdNMJwtIUTETRhJ
-/Shi7iTFIxhiMSWYFgxhilFclagZLPw+zk+h+o0bMSmKxOFfTOrm2TbWXbWV6uG2
-zX+jEamLH9lX+6Yr/YLxH1w5c28qRqX++P6v9czJ/Bpq0wP7uyQ7eB+Vf7n/N/A4
-I+n6Oyqaf8ybStl8Wgvg5aMWKcsqRmLCpH+JHY7+o/ZUcf8bQ0syoa0yWdpVOGka
-ZNpjvIUVJ+ZH6qhX3fZFanSyHdkYpGWGxtjGKcNMNKwlSpDgp8KdD2cj9bMv9zY2
-4SHDkmkf2xkDCf6LKQfCpoFaOJ9BoH5TDi2/9rCRhPqSKlR9EcmpFLro0rH4U5fo
-dOMs3lzLMZaKYNommiU6RuIh0nD/kT7lH58Cz8XLMuKhGo2V06T/Rhf9p9apP5P0
-/xq2rWqv1erT/PLMqx/K0O2Dg/csyqf8VH92myX+Z8BRTxbZHaYmgsP/J9QmCR+7
-y/0+qv0fCnyiPJSHCaH4SEiYfT7Hsxa06QsXGmMqTClIxIpRFUn8jGqv7oxG3iH0
-WUiCZpN8b6/n1+1fkq7ffeV5XQXGJARn3MyZKRCosJhcTJSYUEP9MYaSlQxKRSo4
-T/usWhVI0Ps/HwzGMyRhR1q2WLastVljMZmYxjw3K6VX+qMduROGGFymqf4nekcJ
-jClisYLIPl8mk0rZwHtB+viyyk+VPL1HuRApl/cZMDw+MZfZt7Tx7LCpLZS/LK6S
-W2SkqS0scvTSTnLcGk28PRKVpMSUr4PizlmNNE8YGrZq/51JSfi7Ts2T+5Tuf5cL
-UaX6LUnQaR5PlE+ZyTiUqVaOZTHx9XDIqqOjpwldJmO7TbfS5VtUwninQ/6Jhf1N
-p/3sSnS7Y/q9Btj4/60tF5xmT9MwRXPy8PM4fiKUOh/FVVREYiiQhAhEa3qu3nv2
-d7+q9S8O8rb0Bs06WlE0arExG4ZViJk4YG2Gl1NmRsyoMpaZV7PclFEkhkSN7T1+
-jx5uV62pGsk5ajBRIogIzWpucxals3vLLZmGWmKYUqcpZRpGE2OC4rasjHDE4E3a
-VkxkzLZJSckySoFD8JNDSmOGxNtM2uJgwFUYSjFFUqlFGExq2zQorAowoxy2rlV/
-wdJPWk8RjHBV2lsFjhYX+gysyZkxh0f3RhVg/4UcJ6TuScH1VPy29yH5DloLCqpU
-qInySSwxRKrl+50K0qqo24TykjydiqiUngn5KlPjr2zMmZmZlXDMt/QmnwPDD7q8
-JHcLH4WjVHYxiwsKx8JjVH90Yz02rRwptHkY4fT6Ksmn8HZHweLk7kPRGKpyh/eq
-bPRt8Jw9H0f9riJN29Ik05PjeYzM7a+qenD4QbH4OfJwfZMB9ytJtyhXEiMJiVNH
-cUPwV4H6o7H3fBXSflFn+Sn3kdp9U/HhSqjtSP/YlJJT9D1KWFG1D7Gn2HR9iD60
-4ZhiiTUjaPujNmxMUhRQMUxVYpiKFSJkVJXJrRuOpD+nmZJ/LmR07HlWk3VZMyK/
-m/D6vP7Ztqy2BISPUCQkdu9bzXnqeuj9E79X9hjUSttuMzBuJcLcpmDmXFzLmW0a
-Nra22stGjRo3xd71/j7CrbuqNuCV+Pn7RiTiM9JJIEgAeHxJdEfM80MFtPnBMxsr
-AgcxJUHBQgNneHDhd46b0pvHTJccMlKYUIk+5RcOXp7Ryfl0Nnc0n5iTGzpiTkxo
-FCf/H09mHBodkFJS2Z2cs427TqZEjg2XKgms0uWP9EwnyRTKCH4BWvY2oHETm/gw
-zIiIJE4SQGl2Ck88xdoqynSIaAsnIZAHItqcqEkc5usa5371h9/ghm6wvaD++Ev8
-O9O1aUzFPwkL4FbXvIfOvp571rp7GmKUGlYdK/70n+m237Stjy2V0w2w6YfZFPh9
-Hg06PAx0ppwTTGGySp/LydK8/p8z7d2Zmabu+zmXHZJtVDh9axBEEQczHKc39VaV
-T4x8bLS/TE/iYRwjwdM0rY+rUH8HTgw/pHI4Jporpt5nzbKmLJH82WyJNK5mnJ4D
-eABtlKSyi0srSV+jHaGkaf0oL5Xqr49f2cO3KPHdVlOlxT2Lbotv5H7Pq5pfnuZz
-/dmMfvq7Hqnxosaf5U5j9bbH6/WKPbcO7bK+EPh5IfmR4cj2lOqW0RIh+qOFlpQ4
-QPJP14ba1ay0a5WMszhMV5f9J609T6PlI9nB/Z+ltJpZfELlyFYfUpiTUrTJy1Ra
-mlkyy1arGFKjH1SmRptiNFKlHlOxTypVNuJAVJ4ErlpVbYWdnGukOx25SUDvhmkJ
-SKvuGWZYZZExglQqFSfb9gSRHe26lLJVfZjBJ/oiPHr3rq/pJEQkegQkCw6m6pxf
-vmXePsQvn9xLQI6KSRQIAG3bEGfh7NUKcK53UPq8OHUkcacJyvTMdOk6aVZtbeXD
-JrDQwQRBjBWHXQ31cy5mBlRZ6IYlcEmEU04Y4cGEw43ZacPubU5VthDlicPuw5tq
-27YxgrGOOrbLbUDHk2YqK5Y+iuHLp5DT4+JNH2/Z8HtbEa9pifS5hRZbRbRJLmJk
-tJK4MBO+IfGu7xq/hYNWnTpGnT2zPJAB7pIdsgDnjwae+mHsZcy3KXSR8U8MMHx3
-67L6cwtaVLbW0oONWeD2UwAhlkYAd9PyGVl2b951gXi5PVcb8QkPLMTq0gBWTz4K
-b75X2bmGXKOkz4+PNebXzvhX0lvnW92FLBBb7Y5NtIVito4Viq+U3q3G5KxpPY05
-fL8uNtqqVHwkaYHg7TTw5Y28GPVWo6bO3c2dGOmk5G3CG38p48S6HjlsNF2N5UG3
-rhMMNpgtTb7iCOst5UUraeXaRgqdGFNmIlmjFNDbT2JT0+HDbb6fWUsvKq43XF85
-mSaaDRzytq8wj6ofRCj5SpbawpLGJ941qyZFjLKFSaYxiaJLLaQhJJAkhvLrtqoC
-ttttq21FiQaI9vwrDxA5e0qy21HycDgaRwSPs8Q8LbbbaEEqJAA+29r5V87e9va2
-19Eb4CSiIivrXz3xYwYxlsMdqma+mXMuMrKWCsMVUFYvUsRaVppRgxw1JXOMb3mL
-yozTBtdtNjDDApBMAoSHCRowphkwjDBucNtDaRKMMYKomhyNY0ck0nxv7WzTGIgK
-aWfqbVi/VMlGxYTH9BkkfLWrfruDbbbdSUqaY2JUcG9pYR+O0/p+5jB/JZUMKxWI
-qpUVIKVEVQxZMcum5tZISSZskAD4W+H59LNJklKlfGlrqabJQptdXKqVKsqlUqOA
-aRSiVP6PeBAlSQJCTLBC22236NPq6ejHcSd2rZE7YfVPKyfUT4b7fr8WyefXfb6N
-MyWzwG2mEp4bur6pan33d8BXGubpOl5ed4jcsltUaNEoRiM8GkA0MS2li5l+V2vw
-4XIm74fHps8HR/jS/q+HQ8pSv0K84J8+flIn1SJ6+UsU+C0c9Aop1HStKsYGMDKx
-VVbVX8PI4Q6YTdhxS2Nirbpbf9Rt6er8OQx00quK/pxvKLQgCMAPno3LmmAsuG5c
-3ARCCJ9nkfLTE07UWQ+xE4dfZtP3VPs7YjtMjphyP+UhGz0R9z8FYVLWVdq/Htqr
-8qLbe2t9wr6vumCB9f/1f4sdo/2GBgKKf9A+qrofyy5yaOmGMYh/zf7gpXixGz8L
-+5/xfK/0YL8tv7GR+gqTsvxJ9Ht9VkkLIxYsKqMPDNH2Sv8q0SrVcBPlIf3fwNJ/
-tUtJJygp7lJ+qPdeOJP8PnGm0/cbR/Cu1iq/DodIqyKlElfh9ROO50qsVPQ/KWck
-mmleZE/KwjD935YnpOIH6pJJkrJ2Ojg/KkmBVi22RUNKkxWowxU7iMnlaqlgNpJ8
-pj7iYnkVUWTvh03PCvJ5UwWAO+/U+8rwtQ/m/pYcu7dSLkkqlUIKb4AdxPxWQX6d
-K8cR/srlNn5QkJHSlU6YlWNKsqyjRa1ZMrLLMYBj6NRJ0TlhNqV6ntwbHC0tcGIM
-SikWx6q/J86IAjICaXDPuClJRcO8kmItQriaGCUlFzXDGSLiFQTqmfrNOzl03Ole
-IMWrYKKbCrtOGYDoM00bf+1W6hV/xyoRH9H1kIxEKqEqwhOh0fbf3XzNt1ZIaQ/Z
-Tcp8CVPCpx/rV4xb9LJRO2FfAhRPU75RFAhEnDwrLCvgVkHFpWj6sNJo0rweXtOp
-yT+x5Tl0wTwqLD3pVXSJ+5+RtPl5TqEhVD+w7piTk2lwGKf1bfq5W39Vr75V8q/9
-/wWTBGo2g0WqS2itFWqKtY1WosWrRVYrUaxWiqxasa220FtqxFVbQaNUaotGxFsb
-axtbSaLbG2tYrRrVGoitRVEa2iitFFbRqi2xWxVtitrFaqNrRbGrVFWsVtrFqoBZ
-kqzAMyJmCrMpSsxarGraooi2o1WxaqxYkirFkFgSQP+X9/8v5ZP6G0/tc4bk13k3
-JrvDkTm8Quc3Qw/xo2mMqVokQel047gDu6KK9vXSItvS8kwSVIXbC5SCkWVJiFZg
-hUtoVKxalLbdMKjlWErKlStSeOmTUeNgu7o2dzriub3bxvGBNRCbu64Y4kT37cPB
-IVhFJFkUhs5l65OBc/xyiJn9pvMTp04GA55Yats2p3krH/20yE1IIqJ4GE72HU7u
-YYM8Ubq87w0emUBOg4KzHejc5vnlBVjwWj2JDp78uxUmIZjGSSXv2+C+Vk2buCu5
-waLzxxtCqTeYuYkzGRiwWkxWMbuiWxbDiVZW3Hey4sc9aW7DLDfXXvBO8UcMOrE6
-ZHKIJJkSMuZM51ZhDeUpVpMillJZpvURzSaUu8TxmWyQ4sN1HLGJuVCyo1rGYzbr
-G6nipyrXO7Z7vS43pcWFeb5bU4saY8yVux4640jFLmIWjVTaVtUu6xHFmprC7jGK
-0oY3kblGmTI1k3ubEQo4klMaSc87iGrnc67p0dLLSaMM8WbgykoqxHuhUIiSVgcN
-s4ReusZ2W9pwcOl7l6OFfAh11ZNRZnWh576MW2q1bFKxVnLe+3xhp5sO/llybe2u
-6vZwQiJ63JuaKKNCGBLFFoua715rvMY1dJZyLBbrOZ5XV5qeIKQWC7JDCltJRnjc
-MWVKILJ3QpiLVSjwUMweGw6NEzJrF1i1Fr4tLGZjFiWmbSyagjBTJHzlDjD4ecQ6
-82snBkEBIfIt4B0kgWTyUekmpzCiQ5yh1wM4G8SeOG+NNwKdjDrIdZ3nnxc5azJS
-gWIWMigBFTrbdrcC3d1FulyStyYtcJGJReZlFmTVNTS4yPGPG6m4mU4UpUnHfhrr
-wWZWNdRvxxpo63XA16Gk8d9EE0Xhw0MmKiDFJNWV25mGqnfPHiSZDmy0tLVotC9m
-E3s7B8efHiO2NasFiqCyLUrMVTLjOkidBUijvl11NMuFdid4Pnq556pj0CZeWiKi
-RE4EFhe7nIB0MWSoVFVEKlEgdTKChKRIxmMBSnnMiG9dA90RI90p4oXnQyoVOzwO
-XmFFm7kU1EJfOeLl7pwCnXR2AkONIgVXEixG8HO3zk2uUXZ4KDRPGOMQcFigu6MB
-AynwUr5tMSp4Zm3S97lkYwrKbmYdS7N0thbaW8cMcuPGm2iNlkxeVSsrDdwwNvjm
-OMsQWV0bYCzEe/EuduWNOYe4t4neTnLWQ7yaysyt7Nq5jW3w84tro7rFbxrm3ROc
-yItTKia31oMVVVzMmKibuKkZYOb3Z3UnBYN1JxUtiasqwcnVw0qRd45sTvWJOrIZ
-cp3W8pbyud6rMm8TWW/KOlHvrjW2vNJMEmW6wk8+aSBDqHZe3wLGK4+WYxQYao+a
-FMLu3Zia4DJiYsHLW8vWVSaquNQVVUQ7dSGGWs7cgmMXdseVDzwzwgEvmRsCB5fB
-QVQXq0Zj5wJrB6UFaTgUTjAXmHe6AjIdsFIpFIYZ5zPJpMFN97axjrOebjescSIe
-OlxIjJYuYzMCWWMVihKxiTtW+9a1edTMrhldTnO8F0E1nhOr4yVONeDjTro3vk4e
-VFXbfM/6MUFZJlNZZ+RMiADvEl+AAvwQB3/wP//fyr////pgQg94DwHe94+e89AU
-H2NBDuwvr6eX3b72JJyiefd58+Vd8GQIqkiC6wJSbBm5uQAAAKq7u5JKoSaaqQKQ
-l21VBRUlVJEKkqkqklKlVSiCooVFg+BcYAA+7T5I+gBL4hzdzp5AMgOtGq4ADa13
-bYpbuB97AXvu0OR1329gffKPus6EiQIGhBMJE8hNE02U9Q0NDQGhp+qYgkgCIklT
-0IaaZADQAAAAAAaeiIiUn6JqJgaI2hNGAA0Bk9QAmgk9VJJEyZJ6npNlNNBoZoTC
-NDaTRkD1BiBEiAiKRKekw0mIBpo0aMTQZMjI00YIkiARpomQhkE1EfqnqNA02oAA
-Bo53OJuRwkNrkuMUJOhNQiCKMocWFChEEQrUGVTGgg0sMW2bqgkJBgahUxttdb03
-1poJEQAhSSeqS4RwucrgpgGDRopQUVIkNExkDQSGATIZGCmTCKIkUjZJZESZSaMx
-BmaRQQFlNGJKRIQihnBz6Pqb1dXa7ucrjgmcuCGgbYNpgK8AKEFIr8o4gKQFwMGj
-vveHmstx7CuEmmgYnRQhB3iu/mzlcrWdLQASIoDpmY0D1WpCxNppg6VoTStS8btY
-ssBpPUaC7k8vu+aXzwycRqJj4XNyCaEL8W6PxaWpQ2NtCG2kMTE6TpoDCHUaLpoa
-W1Dm0upHlZaDritXaTgmhQQNtsojjagMpMIthjtQ0xZUttPCv+T0I+nD/mkZQ8ZD
-zjB4ZdHI+/AJQaEvDFvWEt9eecKhyJv73XRVYff5934ryHcPuxRvk/OTX8AQBAXI
-YIooDEBEg2yTSZqtrWliJNFtWstQg22mzaljNU2WpmzNipNtVbdVtq9Gq1bKqplA
-FijAQQWAEEEFi/vVAFgAq0IILEWRBPH+qAgv4VAEvYexHwNTvPzKQKnq9pQt7ith
-SFQE3KoT92BcQS5rF1INoi0BQOEBIieUUBAgVIw0feYQlJIxilA5IyloT2iIDEdI
-qoG946hlU0gdFhujgx6GOFTZJSSpDwQuVTcllZOqH4ZyZC0BlmkC4cCwsYRI2uGk
-ouXauJiysgW2UY5iFJOlmzOCGH4iZGZYXJxDLdJ5I+okgLjdFcGyxGcTuXzC2QNL
-MmgZDlHJwpxaWwzw0jjTdXZYSK7Qr5tMVE1KLGpqexpkXBFICAcNsKQUZzMFIgVm
-knN2YKiGSuBbRzatIQgm+KaQZAS8uDHTnWrudlkM5iRrvStxKFwKKVWkrxS0Gc5b
-46jB4beDQDNZhiAYwuRpE1mlIxJctXj6hyy5cxgiVA40kzeEpxsaUJjkvd5gjFhh
-XMuSAhJw0YIxgxczl8mAJ0klHCWrkkchWY7a9j4Nu7SQ0sThJQxDvI40wEU4mYE8
-5vWPNKDdBTZq8WAka53apCRSSNpCqgUBIEqkKIRCCLDdFlqlxAohLqDOd5oy51ju
-LwUEYBLpqiqzTi6CEFgheJY6jhnYUa1qiwwzdN4qAkZJTTMxtG2YbaURoLQYUs8E
-LNMt81O4S4MhIrqC8Y2RJqiBikskgX1Ls0fwJ4OCaGBlINkgmKE6hXECwCkyUOuw
-dQqIBJJNGXYw2m6AgaYHhuJJJCxy4jkmrBKJZbYWNXa3ElQyVBKsZAmKeWFLmqL/
-aqWV6VDzrw/jTfYq6/bw8pT5+4NHZ5DpJIDo3mpeN6SJGMka7izeeoko43C2Epfp
-g4TpoXY3puxOTFNpHLlJkTMJ/cig8exbJ4wXM1wqI/cnSPX4zRN3hNeGDNBlDPCc
-RjKdSlEXMcLYVo5zrESzdhn5oQgF7Vy7d/xXre3+0a929Re2659oOIpGmnWprpit
-uWOpOh/bvzdU3UXeNVH5d/XiT9umGfzpTP5/9FU8nQ2l+WGPykDtzW8+x9V9eEZL
-xXZrntkuw70ekWyrvMhHrucZm9KfynpN9pZTE+0MTHTPffeZ6Ne/Z488WceGj41e
-xPJ4/IOaZmtZu7us13BA3KgkZGgZhXkEnmKKSCdMrtunVFC2hCzVzNmb4pa9MrfR
-5L368R+A5cTbzcuFIBItqqa9ZJWrv440HQdtONRRNMqQLRvCoXjJsHsNjp3oqjTU
-nuUk+tSSqY06SBeONJjOPZlitBWP2Y/a4myrWhja8Y48ITl3w70cPAUvOLu3N73x
-oNCWxRXKJMZBOcsIiYNsbb6IqgA1MYWCyzFLX46tyDIsrZmBdV11KBpmbcG2jSmW
-klZqbJwQmXHcfS+kqBbvzhoFYwQVevOaUWDtMkiQ4OL3wfiGhdLDJF2oWKWCGRKi
-hQlR9vBWB8QPr7h+/XlnwgBkZ6IHoruquvYHPb3d2c9Vu1qFs4DoTfPOZy5eaTfG
-EbeW2TVkZWcjbLyy5fXm3YKb4ufb/wb81JfR8qaTCaWBkN5OAgOisFhTR2+eXXkc
-3pGtx5da9R7O60uzr4vD1ctQeFni4kxCBF61C2yR4amYWm6emxGhMsrBSNygglLJ
-ju41nhlzS1oTvHIJ3iKAtp6aslyLp2Xz4u2mDjOOFZxL3c45xPx8u1djCMsttzHL
-vlwW7OA48Dxvhzz0vTvl3lSnfgXC1bTvQOQPN9u0GMqUZDiUu+0SqNTncw4JrOJd
-C5ae2h229JhHJcsamPYtGY2nqSYKK7ZkCWcOaeo6wnA5uE6UmOicOKSlx01thtO2
-U5RWOvTw6+Fysmd8Kd83F6zpjTvnstmbnM78jhR6FmzlfenLa9NuMaGgsxrWUpGv
-xczOq5bXKtNQPDHEHk5QkHLA7Ei3HDC6vuGTk25mxRUpKKkrlGpasCNz44/k+3tD
-wDe5wjgdDHrPy8gsg2W5zWGfiMkjEJmgQcnm7BcPMOgmPy6pIvZOyXeDh5m5rpxh
-u2O72A7GexroWfc4Pg/Hs7+FoQ8r9jIQtaxoXODg+TR8z0PRzeAOoeeRuMi7hdOS
-81h4GqNyguIRmNhQKnFMJWaZLQzV+urXgFRWKiY8ZIxJo6GynpoUkgAnNj57hPkk
-CiIEgKoYhUZF/EFX75QYsoLiXAfylQHsFzFbiMlVTCoUCVRu0SOlVOuaqN2WvP1c
-77nObXJxriiMINSQogBTFkqqmEoC2VXvQXneIkUdJiMdJihT4fO2rWLdy1y9kXJW
-wjNZBRy2pfGS/8Lwdy9Cmq8fh9iYjz/X4mvTlzXpX65f5J38LH6DNGfi2efIIvIZ
-10n5NE1kN59vlWXnOfKiq7ER8fWpiWWAkhS+t+LrfbL2atTnX7FlB6UvlXavrdWX
-HX4WKTvtWbyZlXdbue7pYypbJ5UnERU0llbaJ5ZvPfC98s8bTLO12ZXNItLa866P
-2611pp3tR1vrwgjnvvzhWTmUw9oSQv1dZnBnZnRGfK8QzR5ObplZCCc5ujfT9R6v
-JL1s8iD5lDfnIokmLJsX6RI1PafLCcKs/Tg4AkOMBDBIQit/raxnAKMUBAZBr9yq
-s1/QXIbVpWgIAgmEILgYvh0yWOUmv3jAUfKBfkdBqK0fOeYVyHCSZHQ6VMFk2HIr
-sD0RNdD7WUaPgRyIZcjoUkiB+YRfCWIeIcpVQPm6Q1BfgQaJofhQUEMgZOGDeJA9
-IPcCCRV4AUgAYPdw6IdQASI4FnXKQHmcg2w6ALxIMpE3ZaAxxeCoTJ0HTJEbxQOz
-vOl4O5xZ05zeiMkPQD3Jg7lQsvJS7KCkLTfpQmQlEPQs76EiGVGr9s8U7Q7yKUh6
-XQJAgcEPOW6rmfKxk0kYB6NnWeroUq8BmBHowHKGqH4gESifAlozD0+eQ0j4kT02
-LZ4WaPDW2w+IYtHZeImTcCWCRQLWBxyHfijRhjIpsF6jmAN08BB4SheIvMCQv3O9
-IBxhPz0SkvgHt3FCKbZGAMBDgJArIhI9BSIY8gc5jHmj+E+p9S/UAPryP36WOYnx
-34Ii7m5qkMm9mPRFNHfnTkYoj0GQr4OOeHrNeCzAYlhhc5B9Dx8dhsYr6Q8qgkWn
-ZzILYoTDz4BIKReoEWCYEF+GtaVpIuJ9O+zUiaxtJE68pepgbqZg0bMuPgcmlPnY
-g6RPUYjuCge0Uj8+CFpsWlfLghvvAgHOAUAaHOuBCwTEJ1iNdj0An37bTZlzLF7r
-i8nzHeJWS8Y6zJjrLCcqH4JHhRMidIZSkw8EIub4C6LDowDzJO0NYq0kILgV0Xug
-kCCZveXnig8iigRgdCLAPCpCoaA8AMX+M94icjIEiHwoKCEQhEX3HtmPnzHMo4T8
-NPcs2WZJYUlDwPX7E5AKIDuKSJ5wxZlKKsPwLwU8KDrAPQyZ+Jla9ISK/IHBC8hL
-AJi8KMiPQXfpqpK+sINQSQJGgioXVwYxvvIhV0sJEIsZpIely4rWA1B7CQPyZJLQ
-OahcYOxhvMPiDui49WezMfDbrdT686aJ+EQ2kJErap94yg2ISh+eqqB0QQPpBERM
-BBR+wkAAH2CA+KJEV+wAFcxBkBfIpkCZ2gULsgCIciHoB1hJQ9gIEguUgoVulKgg
-ntUcGAJr0oJHR6UMgdYB4JHEEfADtXgvEGyLL8+ama2oQMkPuYKfH8tziwAEEz7M
-qXYXsAoQHsjwQYik4/RunvQcfeEFs6nFYUjPo+WPguYCD9BY7j7j/PYGCWLpEvWu
-7/IZokD080Zk5wSD1AVqPRbsHEFBSr0sXtjlDoV5UI6IgNFeEvHffv4n0LiGvfQ5
-KFaH4Gqpz0Mxh9UDG/SNxy6H6DRQBcV+sBle8GiGx3QAXgqTMlrqSTAkr2SSQEFV
-9QEYOxHymNgdkGXw8Y+fRsHrgXw0GR09kMpCq5MlDiZDzgGOLxJuHDgRqQOet5Kp
-ezggkS1jSF0MO0JZ2yqQKSLF7UIgkEZK5OM/HYXOHJeOW9vBr8HHbkuWPxox6fms
-GumVzMqBnqecSQsuBDogwNRVQM9eBnKY0b2gZRHesEG2rOE4hkmdWB6V5y1KgqA1
-BGhikPMUQmrL7akye+mkvllmGuOkpMekkiTCSRACmrhLIlulAF9N5rthlpQ/XQkp
-01zssYOxeeIYRSTWbG2KBe2SOKBXQ5DU55aOtIvBbCk+zYig+CBkc6wH3bQOiaPv
-iscLEZjILNSSmX9OdgQXgna+HtgT0K4DwhmvgWOYSV0NSQuh8OHmg/ExtAoX4Pob
-q+dVHoXJ7hVNiGlVA2bGEGEH1bRIRBDhCQDs2oQtWIbppQHsVDJEQ2qoEALIiIJh
-iA5Ibr489zs18KLdIk2wVcpFRBx6+tiaCCj5EMxEzMCxQyTxJ8gAo5ZcS4gmZqKG
-0IlJiAbs+AEAgERPIieEQN50HzB2KnFiLFTJR7Q0qNQ4QXyCtKqBvJY82LSiEDtD
-SMDyDTVAlMx1KR0pMIRUiJ7YF7xSGDGU8MEIMgEjhWgojVGuXwHA5gtwUckHgZqo
-ezI2FDLsfUAQ3ZjoWaTPcjarhqjpVVrhZIQ6SsgnCohVS0itMJYhS0GK7o0K+ky5
-Y7gH3tCGO3xVQLLkMHlUMsfgQTLECRQxOLscliplNO4omhGOIJICZNgKF+kPDnyh
-3ErwNoatDOLWiFE0bhwyOBJEYDfGHjaG8xFtMBoWYA6HNgFycuim5Q7p2qoGrMrZ
-iV9I6DYoCVwCNjaBmh9VIACEQL8wi1kyAWKD09rwynBSL7BDbiUwABZHykpFUzkw
-tIaZSwCn04GkNoQOlasfSOXAYa64AHCJyMVG81eg8guTY5JtM+Empxh2Tu34PTsv
-KYzszJQ7oZY4pJ7Ci6JrOjEozq8F0gbgliwihrt8mJA2tda3aqkAfanxBmq2ZHU5
-0MvBycGZje43sNn5CYiGYNwJBIRNj/EqmR34YYffKj41OKr74Ihj1OnAC82B5rJS
-xuPCk5SnOICrQbAWFCMDZEMllsNkyUZkhMzrWJAiQm+4YC0K62MK0mlrmIc8DWIE
-FjI4sXzhL8vpkYEZwSigrGArDcBGj0gGFAr4FqGFQ1SOjTvH0TulJ1XWHAIDBQFU
-2BL7SBXa+99dSAvxCgIPnOIVhPMmTqqgYRFDUUEsUuxDfjmwMpaAek0+O9i+KyRp
-AG8DGE3qEdlsT9H5BPmUugch5YLMiAwTAkdnj7Y3zvRe4V3q41uohGNQNXT1Czcw
-ZOHoCYis+EOsTzziYOV5ZAwqoHrl2ATKFHnpRssDzmLdSlJDg7CCwocglqhuE+Eo
-jpsHOFogASPtXBwKZ802h3flM1s1tZA8sM4cPDnAT6uS6umbSt9nww6rDoI6wdYP
-ABwCkD4MpyWUDjtRIBzdU79HbBiX3vcZZGYTeQOlZsLH/hj78oFxFCAR3XQLAaGA
-dDiPltBD5eyxp0sa6DUCQ9yB3omnTqYzNOQ7dGkZocqlwqH9pIRCGyUGWBqQyCxy
-ehq7n/X63fbu3lvZivHbt2xc3MNMke2l6Uc4OiBRsMViTMcmSUZzTiouB0cMzMDc
-MhAn5DyXqlkdoH6TOX/ia/RnX2fHg6KQTF18xSwHCgLERnIs7MqnDBCuu5uA3wgA
-RixX8J05hR8PDApxlQIJmGtpRVjPTQ4WhDIBRyoZ5o1kdEjBho15A6uhLHeFCwXL
-+9soCWWtfZsFJSQSLh/i4cADpq1VAz4GFTiJjhUbKosgl7B751ekmAW8qEBkjrpJ
-Tsj2D0AkIBD0X4qoEMX0AA0zQzao5o5TTzd5LNDKrnPfRfO1p44OgI4xIzjnvqR2
-Kz5Gwg+DJUL4dAjsyge+pYSePvEmKovgUXXilLjBfO4fT3oTYGwHVC0J2gKaO2qo
-GfZ3ymu7AqTWofKKHc998pr01xD2hKFgCFCO1eIWDjYeGgvGgWPaFTjzJlNzf2GX
-XyGuBywpbCI9aM6UO+tOtaQSqpWu2BesY5kXgwTFHTUPCg+y8oeXVwQ7yjsYrMak
-XS4XXDAJlUBAhUGk7oKAYdKTLFPcGom1CBxTjSRRsoYbfcOs9iE2BKVx8w4aN9z7
-7xds1BTpEnKyEY4TEIk3XeTS9hcaRANIX4k22qCDj84dwRJjo5YkxitJJAO9xXTk
-OFA/MS7JYZDxNviHhoYrl0bDxFvhTQwSQimhAnQFiYoaaHrMgkYrCOGBtDa5Bmne
-OFKwdG8DmOpCyvhqGYNRcB69KAlJSFA5hCUHKDE4GFcRwyRmEbfPPpveJJIDaQgw
-rWJ/P78yCMO9svE7GZpvnPSWaCtoEgL2jLabbxBVKIsbSY3YtJJ+NjNh8b8AilDw
-UPusGoZAu82EYImSRSk5GnwVIKWpSvFeBQnOAdAMuTV9DgEQgQgvrro7JHSHZZfM
-JCKmTtQFOCceAYcT265PCAg2SE+XhMkKlPgHB9+HTOoLI8s4BJuk9F7wqDCjRw6y
-D8yVeukRZ7qrFZYrAMMmhmgFDKEdZztkqFY4HuEkfuhz9pTsXzFtqqB5Tv5gsZ8h
-mh8x8wAfZSHNyDX0vZDTySL94fOjqfD0KHsVflvrWX5ow8Q0QhFVMbcpmX80Ezgf
-HYjMuA8wLy42E7Sz3rziuCIB2DsghxkkRy0Bzp6FVAA8MKcFvSjqknlxdHAT0wDn
-07kBQcd9oLK7tKmnZYnZZrh6DrhvciJ0ss6vdzXdwMQKJMWT7tXSHPByoD9hWNqM
-OwE85ypXmQLQwbXSkJWY6qxCwo6HFcFLCAk6bCVHFyYQc5H6Ezm+mNHD03wkk6j7
-m480R07W+QkhCKSnJVvGUvBBlRzDZDeeaNvGwHd0PT2wTy2HnkWtuMhkklgK66LZ
-BC6hKMJnOxOpo4YaB5V7rgiiWQXGCiJrYk4Y59qslhcA8/XJNJQLb+5tUzHJCBgj
-Qx3GrzzHn6xmZ9A0PtV9dbezpCHExoEDwlrH8dllA4YEY1mhsA0dIPPsj4Mi73vz
-nrsvJLs5YqABDfroHBg+ShQ0IgOs44NI4F8CIIsVXHQ6z3KS4MOhdxigYOImz2UG
-gJAuBhpsgLrldXnhNQ4jLCUyTxyhrIrwuyYrqo6MJzQ2Wl3AdDzKOb3Cydryz5Do
-pHBHMKBNdAOAdXJhYMgMb2s9Fp70MSClw9KpTbdzhHAuMGAtobHQJ2SURvgbbhyt
-BecsuXl+2jKigzt7goBTjmpC8RowanZdxJOhWjwhwrm99FSiJ2OgLLnm8pnjT1Fc
-CXCc0JaZijcmjpDACeVTrZneXxGRA+184I985kcHQIQIEFMgWfO635rg0SZSO/at
-HtcUKa3TZ8OJoImYsgRoKAhiZKIBUsG7yTOFlDFncMU9EG4CMLUKMxbiCaMDYdhs
-JSKdyLFJCQmviCCLgGuUz81ptojXx2oe4d2iHnAkVSdhzcfH2K2UnIQ9u0F30MHB
-OBY0UHMYYjgCQTAWMbwXTZQXaOgnfjckJ+BO475Zyfo8/R0NlEMBq8c94sZJiNrn
-yJ8OoMIDQPjt9uJK8Rk5aFDYbJfWSynwRhgIbQoB0+IsZPFGy4yADzZLYokaBywD
-CRmTeH5tmhDzPmA2rD32gaqneqHMNqA3FgsMePDM9KB69ebN4HOAhc26eoGFI1QJ
-m898wsO5qZxBxcWUgvtw5Q8AMEOOJJ8HEEk6B45ZyIoFaB5KW8FLb/M4KYSZIP/T
-y/DoMk5Ami3wPAH8EyWhTaUsFlQ+g6AEFdgHlJWNLpOCvdk3q+hWdqbTJWRS1dey
-wOAQwQUmsxpFozUQbFTRcPzhmHw0BxsEHFHdI2kUHjDkRPSGAp3SUo8BEdPPPTw4
-44KbQ4SZsIKdYe3WCo1EtM7zKTu1VAoZ7hPFDfU88SlCY2aHVSnVAOBA5wzuGlcH
-Rs8STcvGCu0xIzUFjkwcvlheRAzgRbJkzf/N0YjQwJYrJ16VzC1gueMTW4Rt5rYT
-IRNwYQYtHOtSD6ShBHOQzP37jm+TT/gvnq0DgyDuezyZv7FGKF8j4kpFLwakHPsy
-LSDphCyxQLl7xgnr+Pl8wbTsF8dx04kwB75wFRLdNRIBmhw2pH3UCbB9EgE9z5eI
-BPN3vYxzTZ4nEgVR4qoGQtM+BuGwlgV1WoHG4EaoNASMhGBgXYFRVYIXlASg6LSg
-GqeHmiyAsDilBBOqQsS4Og5rap1miKqAdUA6AdYTWmgTRQWeULDLBzlSEcEEDJbB
-4nTaBTC2glnEXi2haNhLoJcdgCNAkhcqbCc44gFrBrre1RE7eydRrtb9wdNITgOo
-j4QWulZiLl9z7V6DbnFmgcimAjOFhQs7UI75C551aKdXmUEHKSvEOCldH1YzE3wo
-E42BxwHl9Xk7YSa0g1vV9CriIWOztgqD6DgKN3AvOkS3ODdnTdtll+abk1SRIIGv
-fALBUOBR7ZFBZ4BUpBnSQ4hFHFEZ473Y3P+zY7O60Rs1LaWqHHIcwa8txlB4jJJE
-w5YZFHWAZUEtKyoIGdMwDYlA+A9mFgSZbOw4M6OOSmPkMl1OYzvpRASmvvXmUjTp
-8joGG1lR1cQpEEugzJBUyZnlygzInkeR9IZ+wHyATZQgPmd1ZmIUecB8pAzd6P0t
-AUK45zvDzCusNxdKPDohseJeeAI6ZvadwEcFQCRCgsXNcDfG6wqIm732cGQgwkIA
-SKEgydIjIZQ4a2thurU6wysrTQQglytZnEFtKoQOjdqfOmiDah274ym7EDxm9s9L
-CegGgMopkIt4LQ1Xtb9yBS7B2LUpK7hUpgHQVCXmwmbMOQqGHhGVvfpgEjVDoew6
-qNbwaB5vajnexW8pSBC73poOsSDMENqjGDoVUvvCS9M4jdfRrEmuQYwM5KDSHMK3
-B64lqG9DhQ0JoNQHlDlAPccRKnfODi2TDOoYNSZAcBzrUAVglyHGRUI0bMziEWOU
-JYnAOUMt6Rku3X2Za5l+nJIHiJXNq4xzccGdzaqu4qJJiDRBAN2TBKurol+bv9SB
-CSAX8+8Hl/r7sZnxy9PYe6Z7cvs98YtZ/SwPrgMD9OXynBh/XzxwXwdWFeXp/iVD
-kMgNriWpJDP1n5azCg6/xxxEvwpxkfhIP9s+2nQ/fn4vF9+jJ+ngfdWL4CPb5czf
-UQwvVtZEuz7Om9iWrwP/ePX0KAP0+V9inRoSgybccCP6dPd+K+f24YnQ9YpYUGst
-TKKFMYQdT2HL0fr+fbVW3qvv1NLVbRWSUrVJUxgSVjWktRaoqKNrFWmUUVMjUUmp
-li0zKazDabQ0YKDYxZMGg1BpRpYUwpQCMhoC8nsJe4+Dy3Xr8S8ifkOz/vaP7ETx
-FiYoqdkOeLbBtH+bHadmz2QGsccbGX7OU2D+LhZDxGPjMsOyV+DZO9PSeDPkEcZO
-SS8UzBJ+ecnUZhlZ9ZyM/ad22YYrjBcAz/3V2B8/JiuT7ED9kw+rGGSGmqTbJiMm
-LSysmTaS0aks2bSzWlZtg1EpSSYlNkqItCalNFstNttqaprSmpS0pqU1LNFgKpZV
-srWWrM0lJM1bEW0qbEmiLVtRGZUbSprWbNaLUqaks021KtbS2RlllbMsywtspLGj
-SaVEzMYk2NmzWptlrJWmSoRZSsptlZZLRGTaNKm2LJmmyUmSWRk0WpqlUZJJiWlp
-tkjGjUy01TaUkrKzSlLTMzAbNg2KlpJMl63e7/d+ENF1fgGLHuf56NGdqOvg7hSN
-iHHED5NKzQnm2yaAQJTIxieFJM3ij3X3qh5AHBhk2riuNRvBd1dJNK/o55W5e1NX
-ks/nngBUDz7INtUfFdK0JrgNgbjAdgkJGRczQCngL6Zh4BT2UW6xEWOCC4FzQuaj
-OxoBErUsV1z6K8cAICwJGRj6fB5iCC6h8QhiZB9qLr5NFyCenPzIPnc0WwotMInx
-4sAoHfMU5HgU6hhRBkppj/FgHNLt0ubr4APQXPI06DXqSSyDZid8zuPuLwXKN4cj
-jq/w8zETQQQXn+w0DiEJEiKh7fzQ5LMfgQXmXrdtA+sBzTIigGxVCwsOYhmJycnC
-CGplhE8/sdAhQXcsIRJFJISEJE8flHQO6cgR0ZCoE/TcCd+BBP7orIml5zlZgw9K
-QKKpGkiwgESxpnXK9pYwUAa89ij5sPoUYZjQ0lyAcxQc/xtRzIOJISJHL7Ny0JDw
-BwZa4MDUFR8D5CCCwzTyVsZejnQapAVGYICC5dDXtXOsmZXMO7mFWN7P56mEGIAc
-JHHBsharUAUcAp9UrviBIAxJ08i+RBO3Ah2QAgiK4kThwo8sDCf0aftxqENQKMTv
-TZBCNMVoDJwdi4fVhYNQyMy4KjH6SlEAvexZaMCmxViqK0e1JpDA33Zg0xuGQl9E
-hiQvQ2FHNA6XqGDe6CB3obIHAhBD+L/2H7JweCnNu3h8F/bQAgQghowH1UAW3ICg
-LRMWh9MD3nL6B5zvW/rtbABAW7j9J/ubhTjE1Dh6fjPlrh4F1mHx9l6oKaKdL9MC
-Czogscg9WEHR1P1lXLtPyv2av6+Uc38L73W4ynzSHQzT7n4a9fw9G0pHvHQQT3Ww
-CpsYtnkcGJdhEoMqdwTQQQWf8H7l+Sm0erEmuPTqAC3f/RC5LqgrQdfyPN+J3eTy
-V4GlQVzdO0KeqEArm/KUORmgILgIYcAUkDE9WuptiUObqmYfnmExHY8cNvsWx4o2
-QtFrwFybGSaII/YzOu4hsM00VwmYOAJQ3KQY+rag56UiZKVHIpnxryUn41uF8d2K
-fszLbyzAkMTuQc1BJQQHPuhBBej0s+yiFTpnRcrVGp26/SPoGgGLAjmBAhpnAPYi
-hGHgg8hN+hAh0NObgHp2R/M6Jo+S9Uw80pUFedRU1bYFRVog6sTPEHADwMAG0oUe
-ZTzCfk4pmd1M7BJIMNGsaaugBm+bdBpLDSNwIBiBVKx5dQgre1pCrhP2FD5vX9bb
-a28/PP14155vN5a8GIiRRgLCSaKIJMBu9u1u/IdZNWhKp6tcoZGbueNNIlSQLYOV
-guF/I1QEFvm6liJuQ/g648tjVjId/WMg6iEQnkcuhltYdGxoELryIDySIMiK9wD4
-MbBiPihigLkeo0OhARBcol9jMSNhf2ITsgILYNseps5hodZnnUYfDxJFi4UQzXNx
-EsQsWIsPUhf4XvqFHwQ+WPfTBIHct1LIZYv2+juqALF8D9dhxOkM18bdDBT3QEFx
-IIWRNxv+UV8R+J/0R2XJbrEIOYHU+pkgRzsDEdIZEebTO4gQJeqofJbdkqra4esL
-roGjHL6Gsy4rZI+PElgZlHIH1++YJmDEhF6psaR1U3IWVmpF3VwE9oiTMpi8Nzz+
-aHRDUDwW+WIdt3zPNOewJzPCB9E6jmCYHFX8LoITudMz7/N1SyV8kTcL0XLh4A7N
-JzfBgyjFkYbKgC8xPTQ2NEVHr3NX3I8oB8QLJn4JCrIRrrR5SSiELOBCqIlECSOq
-AgtNF/5UYIUAbvmgBgPL1xIT9UkTRqqrX53ixpCNGKHEwP1PwJh+ma3ptrBwODbq
-SORcDEiR6PVwOxokOUEsjBbkzcaucQzU4IBkiIQDSXJdCotjbIzzDs8lfNscXA3I
-EjvBoCBmX1Xq+IE6m5+HREB7xUkefMhRTIUUVEoGUY2sxAvjsdB3GZnYoMTuuOZk
-0IILqZh+sKgLQ1ULBUF4SYf1u+nDkki7SjNoBQWIGv3PuY3TIDM1QtuJ3SNep/DE
-5GEdQMHhYWdISJCEh+RRD7S+bd8OK+sbha0qU3NES7e5JJCEsxa4lA5ucJdrboo7
-v42uXj7XKXZXimppWTWQJDU2Uks0imZSWU2bLZWUpEzCgmWQzZKmlstNa2pqlKaa
-aU0pppMDbLLVlqzSSa2lTEtKzZJmtWpNSkylFpqsptkZrNNSzS1S2bNoqllIpMmS
-lmYDKLKzVm1LKVNkglKVKmyy0EstNixZmkjEiWms2xGFpVEWVNNKkSaWUpmMKLNQ
-l1leHUD7BQQf0nxooh+rfDYdYFRbCkgUOlBI6EukdLgodLEh6iosAIZUDGcFIBnT
-5PfxeXIybIEK3a2JhwXN4a5XZyCUN1QHKuKm53cudZGkYw+CUhgAg4jiFUxQcoWX
-ZiDnC1kcAxisjx4FhBuB1RLpkW/L1JdQMQyPlqBhAGDxWuoWKaLLctSBSGSu4x/U
-+UGMFxxCH7+CQBDUTBsMAfQX99QooSAcCZEiD6vqNtZoMtphkjx94b82mEcdDU6C
-GIfhpBNHRGdiSEhKQ5wXmRP0FuHscjHIQQXE+/JA9QIe5u/rPZ7iGp3RjqDlESQZ
-JCQm/LYfclj52MSyQjrCotj6Nhs9YNtpjG0eYiFHs4e+RkLZGv6lQVs25H8UcydI
-dBwSSJWZ2GkMV5JBvs3IEHqRvh5VCbiosL1RQbNSevAFkgodQSGXyDwMAKI48pbY
-nKYY5o3AkxfgcNu/2TS8/z4OpVwpwYLoslFDS0dpbVLklyLktcy0qrt1rkkVDQKa
-U5mIfn7qbHUwB+pUzzDYgdOwHNMsQqIeAQgWJ7CdQLne/Uch/L74GbnkIeSHVY7B
-6HzdzDBZDLh9FDDd7l51/E5mJCBgdFYeAu3YglszcA0yVJwA+V7zU+xXQdNIJq0w
-kfMItgm3gj2uGRgGUX4BpO2ZVeDftfXE9vP1ve16wzwEEF4VAF3VrV67Ndd89m7O
-GA6EokveXN9MfaQsQ3ZZKcK50mcwJlSsZTgk98c5KYw84IzEZbkvNTsNqzPLKyHo
-Px0sFlfMO5q7Gy/RLjgGa3WwaF0oI5J5CEBrzAuFdT9Mc82Cdw1XLYdAocXnucxw
-MDq4Gb5ImDg/Y1aNUuciSSLGs30w7o64wiPJkCOJGESEZEDZGBLmOHlrwGGQG1zj
-MtuCoxq7RpQlgtQ/YQ5xHKBJJHiia0FHVsRLGQe6Aj+2KgIUQACACiJEFxCraZaP
-BqeGpHqJ2lIlZ0RymyqrLMZVKEz6wYDwNnVwEvXcGMYxgkEpwJK03QsQ0IAGhJqy
-CBkmqpjC2e6t4I+Zf0JUTC8cgiBBIMOpm5aNIYWCqlcG2GZjNkLK8i6B/LSEtoDR
-RIJtyOGwPFu5CEb0Y2d1QVrHSAerk2mlwOR0esAyQ5waYkWyRMAgkNlX1WA43hGO
-YdDY3OWXJQzDIuXC51atcCh9k/jjTxk4r31uGHUMNV7DyEEFu9aoidiNHFzHFW3k
-pl23DYUqswRQLrmUK++C6OIeCEEGO4Oxqcy5rvYfEQIEszhUi+UBMa/NHV+bZCGB
-BmDsfjN+oGAKjwgfAOjBz3eAT0JSBhgZHiXA7HejAOj31UJ0cC5soXLOxcOBUy41
-LJM6Q8Jwpx4F2KjgcPvn3BRaXEe2Z4vPu2/yeP+aH5JvaiC4fKQAcndicHNDcD9b
-ShgrZAQXSGTpCSlPzKD5gwnhsz+p8ujoewiFBY3pKLSeXXMDRxzJq44NJzlzG7rV
-oWrj1/nLbhdUFc+SIUCENGZwNenyhKIbAqfWTOCRY+YUj3gzmpUR68AgUjUPy+0G
-2hIxUaJCNpMRpoFYjY0WIzNmFoMaNFtEYklpFixGtGxg0UUVJoKiwYNaTRqTKQRU
-G1Bo221i1VFhYBqNjRFIKqgpJIRS7/L9Xk8v315svJO9OR4u/ONn5FGPE3fMqdtS
-xkZBu7kta5NbuU8MxyZMYMgmsNmMhnKfGmtyIG2LzBpqWYIbdmCYi0lYLJxwCFFa
-zJE6zEudHD27ZzbOeSgpk/HnkQbT7twqaaJXNvUzMuUt1hyhU7ceZcph42+VTlXU
-cZ9UZZJyYojLjaeJHfJU1UZUEmBfLumu8yW5skuyE9uh2BmVxJZi6KxaXBNwSolw
-BqBcQLj3ucNZIYZLYtirLu3brW6UYgZgZJiDIGiwpsgg7g1AITkgM6FHITxDDnGt
-4SDHzZbL5s8fec5PCq5DOzDRdWS+0h5Y2INZak1D29cpVyb2aVrV3Wlt7rQhLa3e
-m3ZwPNcXywE2Qesk1XN24HvZ2Xa6nlm8Pf/xdyRThQkO1NjuAA==`)
diff --git a/test/bench/go1/mandel_test.go b/test/bench/go1/mandel_test.go
deleted file mode 100644
index dd543b2..0000000
--- a/test/bench/go1/mandel_test.go
+++ /dev/null
@@ -1,41 +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 benchmark, taken from the shootuot, tests floating point performance.
-
-package go1
-
-import "testing"
-
-func mandelbrot(n int) int {
-	const Iter = 50
-	const Zero float64 = 0
-	const Limit = 2.0
-	ok := 0
-	for y := 0; y < n; y++ {
-		for x := 0; x < n; x++ {
-			Zr, Zi, Tr, Ti := Zero, Zero, Zero, Zero
-			Cr := (2*float64(x)/float64(n) - 1.5)
-			Ci := (2*float64(y)/float64(n) - 1.0)
-
-			for i := 0; i < Iter && (Tr+Ti <= Limit*Limit); i++ {
-				Zi = 2*Zr*Zi + Ci
-				Zr = Tr - Ti + Cr
-				Tr = Zr * Zr
-				Ti = Zi * Zi
-			}
-
-			if Tr+Ti <= Limit*Limit {
-				ok++
-			}
-		}
-	}
-	return ok
-}
-
-func BenchmarkMandelbrot200(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		mandelbrot(200)
-	}
-}
diff --git a/test/bench/go1/parser_test.go b/test/bench/go1/parser_test.go
deleted file mode 100644
index 8b7baa3..0000000
--- a/test/bench/go1/parser_test.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.
-
-package go1
-
-// go parser benchmark based on go/parser/performance_test.go
-
-import (
-	"compress/bzip2"
-	"encoding/base64"
-	"go/parser"
-	"go/token"
-	"io"
-	"strings"
-	"testing"
-)
-
-var (
-	parserbytes = makeParserBytes()
-)
-
-func makeParserBytes() []byte {
-	var r io.Reader
-	r = strings.NewReader(parserbz2_base64)
-	r = base64.NewDecoder(base64.StdEncoding, r)
-	r = bzip2.NewReader(r)
-	b, err := io.ReadAll(r)
-	if err != nil {
-		panic(err)
-	}
-	return b
-}
-
-func BenchmarkGoParse(b *testing.B) {
-	b.SetBytes(int64(len(parserbytes)))
-	for i := 0; i < b.N; i++ {
-		if _, err := parser.ParseFile(token.NewFileSet(), "", parserbytes, parser.ParseComments); err != nil {
-			b.Fatalf("benchmark failed due to parse error: %s", err)
-		}
-	}
-}
diff --git a/test/bench/go1/parserdata_test.go b/test/bench/go1/parserdata_test.go
deleted file mode 100644
index 8255d18..0000000
--- a/test/bench/go1/parserdata_test.go
+++ /dev/null
@@ -1,245 +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.
-
-// Input for parser benchmark.
-// This was generated by starting with the contents of
-// src/pkg/go/parser/parser.go at rev 9b455eb64690, then
-// compressing with bzip2 -9, then encoding to base64.
-// We compile the data into the binary so that the benchmark is
-// a stand-alone binary that can be copied easily from machine to
-// machine. parser_test.go decodes this during init.
-
-package go1
-
-var parserbz2_base64 = "QlpoOTFBWSZTWd3QmOEAIYdfgHwwf//6P7/v/+/////+YEhcAAAB7hwvVWWaZT1X0dt999296z5B" +
-	"3mcQqlBVVVB7hnASWJoFGq9jlHvZHRbdfIB0Hz6fW+jrz4dueD73be6c33tG7la1O9d154ntzzk7" +
-	"jnU+O50zayubCulvgBm7rou5jleOe730dzX2sUbWj1u215X2PBXY17GB3Y3NznVW7ubOuu5a5wHc" +
-	"d9h69Xtatru8+D21uj7bM3lBKdRzPul3bt3GUtvN7z1PfCU0QIAmppkxQYg0Ap5NQZTxR6myJp6m" +
-	"T1D1NMgYSmgQggmiajIZKep5R6mh6jyh6RoA0BoGmg9RoCTSREEEAnqnpqbKp+alNk0ajR+qeiNB" +
-	"k9TanpMhtQDQBJ6pSkSTyPVPU/VP1PShkepoaGTTDSBoaAAyANDQMIkRE0lPTaZBTyYlRp/ok1Pa" +
-	"Rkm09Gk1PaptQAaDR6gPUESRAmQQ0Cnqm9NNBNMlPyj0iPQyQaBp6gAaaB8HrtSFgsiaNsTLSbZS" +
-	"paVaq+DW1qDTQ1FEYixSRiwlmJFRJrBmbIYoNEYoylREClbZLFikJKNRBFApgUQ1GShKjaSyRCCG" +
-	"UixqTabS2lLZiEgaKDZLMoxFY1o2LULILGDEJsWwMhbMzWlpbZm0bCaSS0NlmDGZIiRWIoxorEiG" +
-	"IxTJIyIGU22xsKzSqlMUUmjYE0bTGWaalWxLIlMQqECLEliKYskmLSSjKTKRYGRZmUZpARUKYttm" +
-	"ajIMrKGY0UUglEiWbM0tJsbGyzIk2myi0ZVYlsNRhGlFhJVKmwxloaVklNFBtDIZTQkyhowI0Qxp" +
-	"JTJsyVRUijUs1e9rpIS0kNLGYkko0WswwxrCAwJFBiLERYpFI14/l8d//VUo/f2Ofl/4/PMmROiP" +
-	"+X86qHV/m2eKhwgQcW/w+YWCErVRZu5/WnEVaZnt7Tfo5OP8TQ/6bme17VqPoaBMhDbuEqkuzjiW" +
-	"z4vygpH+2bkcU5nBikvEzgwxXZ804V1e1KpfovBAJKnhrcaHdoN4aEJHqHLUlmyGcSUjUdCvTYRP" +
-	"65aIz4POFpBLH+m+1Lbs7kPa+GjGbi6lF6kRnzeuKKJqJcsR2+EnuemMS9kr4tXWry3r+bgQMkhI" +
-	"ZkgILVvncoXREIltDqJkTlIBmQtrNEYdUFfdE6C6Uevosypd0519H9t17FtHW8FHImhH595l8V5y" +
-	"Dy7pYjFXqJ5ud+fYaJuGUNoK/3zpKZs3XTCeRxe50nakx0WoD9OZ5fgiko2ifKT2JRWE470vIn9q" +
-	"YqZeDApYKszMZ8Mp+S+W5s96YNXPi2dlO/D+1qHRSrLkH4VE7L5oPiWGXTwos+dnwniXQoVKJu+K" +
-	"Y9bmXzt/02qIskOq0b5TG05twenXqbgV7hVAkTElgmqsqORvcte/dakNMsd39HphWvVaeJ3rcihv" +
-	"cJ044ShoPW1kUxBbyYXSVcHhwcPSlRcSVjjMnnOumoi8tmS0XNbV8t7YwYi/pxq8j4IDzF6Gjjac" +
-	"8IstxcUEu4RJ7FipOLfio4rt9s7lfyvvwluT97uTcrpUBmf+k4nmsClh3fSIXpUhCQj0vMkt3PMf" +
-	"iudzHKBAPMXLy7ghISaEuIIZU7ueq2srC6YYkS+GIpVA78WOscuCQLNvB3uP5O/z7mxPA5zkIjIv" +
-	"KdUOFSCIx8N/Dub3Ur4WwQSti9vd16B9/Bzk1g28aiXYmRHTrN0J4cW8xmekkkaIMQXypKnBPZeW" +
-	"OTnpXqdzrz3NXv88RyB3SuMMy9e+YJ0LfvtfRletL4X4fU0YyG2EurWAFBlGvZ9Lzc161b0vZR3B" +
-	"lL54b52XxrzvXeyu0qCh3+Nv1LgzQhtksL1Oay/Q6uVSRCofJ3ZjFUiG7BtUBQ3ZQrIHZJxdYAou" +
-	"EFtGQkRJCQq1JlE0w7e/NTTmJ5ifsE62XbIaTAca2fb4+p0d8L19KX8vFwTin/n8OvB6c+3w6PlS" +
-	"2goNsUIjAKysBZEGKrGSj9cuNPj5nrOYVHPsxLdGaeVHWXgKPR3anI5fKwnR8SM4fFetyzwPhxw0" +
-	"0lGM5Y02qqy7YY3+xFTHU9QtR7daZLEhpvsY3iDlipq2XAQehwfn9cm34kA9P19rUJ+RB7funX6O" +
-	"rB5/xJ4dxpknnVZFXSwLq0tDC4Oze4TN2dOHZ+HL8OJ6n/L8WuPeXeMpMQqItn4ZQfO+L6Ptnu6u" +
-	"udDLKkBnS6yOVFVGKAsixPT+D24mcn109jn27PhPK6x803RI7pvAz3Q/nYYY74mSvWccNSVVSvyz" +
-	"c5IPV1UejZKjmnB3wuXPfG8LTTGrMkIz6mh9EbgSSBOQqmfzXu/57PRZlKcl6buNSiCdgf939gq+" +
-	"zhn356ZdFGoGUfVHCdBp4HXcfZpWfVbdNxh1rxI/RvAK/e4fAR+AkS75mGZTvK5T2ob4g+HlN+LU" +
-	"ednbpvXKTzu+BgxnhWG7i9otZECZps3pIIspDTLQ0P+o0Ryw/UOpt+F7zIKwg3cxA7UQX8rxDUxI" +
-	"Ub/+uw6Qh0xwieVzEaeQKh8s5uI1o+buyWpo8kZVwjBN8JdsHV4lj5tdUIiOuIqskenyFpkcNGgK" +
-	"cV1ohgEbXdcF1bm2LHZwKinccZZqRh4EXGbbqNuTSUTM06DGbwI3IfZcrrVlRlyGvUPnKeM2tG+p" +
-	"U5Nk1fWcKXovwi7Bpm85156nFylux70tJGHWaxNqGt02UGzMM04bJc6GHl57m9PfjBeQ+vlgtDBA" +
-	"KJkoKJEjXjnqvAmY6RkaCUoeo1mVlVA+uUmbbBqU8dYZIxiwRH3Pxc3bOD9uB5Jlka6An6c9B9km" +
-	"OnDL+FHQTYNwgH8mavZz0iOu+Ut8/J5ZwyoIamzhyxBs8262E1X8Xfhle9iE4rVPPFLG0iTioWAU" +
-	"d3xVBGn0oRJqbxtUaxhpdln5NtolGMj59U8pg0/RSY4z7US2Ms+4/ppi54Z8T9x34FrNnEaNTupy" +
-	"0wwbD4jnv7F8vm1WllYykpcbxM8YVxcrK1o0GGUBvVUGqDpjwLUr17oxmaKusyyrqV4yu76rlNga" +
-	"TtCAVGwYMvm+SLMenn6P375gmvYRlpqskpNDxFJcfbkZ8bux2QkkYKLPJlJSlbCOPNDfSULNSdHM" +
-	"12MvGjz5tYTNEbhq9fk6J0QCf04np5cuTvdC7SzdPmMDWTDxiD5exXpVi41UM6eV+926tnWjqo1q" +
-	"KZvLp3rjuvrmxbB648TaJlIjEgjUx2qKW6HRaInEGHsXUxFRTPPAsGXwgtoi1905O44+FkV9ctb8" +
-	"7pZtlllncqNGbJqP2LVNqa9WBOlqMdkm1w8mO+Ln3BLUvtWWl/CjfABpSq7mjGtMdPHs3a9OeOVw" +
-	"FHvW2fQeG243Jl69jvgx4jbSeVZ39VcNZNO5EiPRfOTlBHsZXX27TyO0b+abrFZ3Bwdx+c+uRVo/" +
-	"TEFzLJ4uXS1FoXdJblwzfjW0rcGlZ5Jqs3Gb4iESyfmdVpU6i2DtBPBtsn+nlb95Y0pWMDBM3ZBZ" +
-	"pyIEncddO3bafpssEObXLaLNvraGuJMzgiNF3+t2uZC633wwUji1sLoiU6X4kuZkEjKHnqmi1zXF" +
-	"+dM6MTtO9N5yDve47yIt/CkoVoTbWfc9E1Gs8e19PLxPS0i18ldi6xjw2bsWfjR9Dp21w5ImY6xr" +
-	"3J+BF35JgmZMT8PbEXlDThrTfEMkkrCcD1u+XbyIkkjGCc6Vc2Vr5X53XPuwfOuM31yem0tXg9uZ" +
-	"1kj2P4Hx03wa13qdX0xDFNlPCYxkY+xVhq2lCzma5tkZ/FD3755LyZbdshsWTGsbInzJ39+zd/Ly" +
-	"PMkJ079dteGN01Roys7oKtfDIa/N26YWY4Poq35WHTCM1DF7S5me2r5ahhiLl0ch545YQ+r57a4+" +
-	"Ls9VjY5Pswwk2x9S45uMQ770ssfjbRB1U2hF/DV8nak751LqONvJs28E0JmDcmEwIr4sB1uClx2b" +
-	"PpWuRnAWq7oEmSBKbowbbW2lGqi1nh35psMxUZ4d+FxK4uHVZNA7vU5qm0rUs1IoT9jPLkrzJ83e" +
-	"t1ZM+BwItwHrFPb5jtL228eV0ZUpLZphfFKj2DCkzbKiv1ODiobghZh44PzyoxgKV5SnP3VUGTRN" +
-	"h9Nr5MyMQvBNTHpiwN1N4241qJaQRhUVtKiMhjJjCNoYkMErArCTYOiM3SF88PVh9B9XSdDzTkqF" +
-	"hbUSnyoH1EwYMUaOhcqJmWVqsWHxhPCckWK3GaoqMmowMyzTBWal1P5eL2sVtZ+drjsx40brxVOg" +
-	"xhzdgFm5kg3UcZubj4zvW6QQgvvcd3x612pOT21AWT5bhwppdXYsSL7GRd0DB39io1hcZp98dpdP" +
-	"I7tjczPaDZBPL3EuO1nUrIw7csHF06ZNzmmUd+3TFNPvpr63hVjYTlSF4RbMRaymDlUJwWzYoxO+" +
-	"Ig6OY5Pjo2li+/s0+z4u+7OhBI5khOnopHj9a8efW8cp+r7kZeu8s3bbvYS+DWbWy1roJ0p1AeY2" +
-	"X+fziwq7PTod5KluzFOwS5vjjtukunB1xtG3rkji+868nZBbnTAgkLNN9Ezlg98Zlxha5827EPn0" +
-	"5OW6tutYMa9O+U5TiKz0ggzo3G2J1u6vrY40j3UfBNuDg2ONsRwUmNyZMREtEUZK8Ifne0GcxmXx" +
-	"L3F7fRIQk3RU2t4jbit2VdddKuMkXMTSERChLhN68Hj0bbJ7JYxZ8evJ8+Y5Lg119jsTYSQ6dxXs" +
-	"VKvg4DSyNLKMC2MsbYLARKFWKlCw5wzKlkQYWgttGacw160+Qze+GHCZbC2hGlGVjaX3h5YYzj3f" +
-	"DFYvzyl4YkBZrrrZtfQbVtkyqYQ+rtBBDGBnuPOcHrLOPXfllLstfKRrywI0ctF5F0qltBsNN9Rh" +
-	"msY8es8xjHtcrxnobZe4k3Nuc51d2e2RHRpNSdoNbT25KkUrQtDy69Wxwnnyc1tdraRFtHagZVH9" +
-	"q2swXNQyLCahLQC4szGKaGZKqLSiD3FjPm/7PL5ZHq/XmHmEJ77utU9tZ2zp/ODPCfhI7MvpP+fy" +
-	"16rtvaad6gz2zk1d2YaqMavtFjzK6opMh34RTf/flWMJ0d7tOtpgM0vJ8dPn/rfB5LrZc+fPfnI5" +
-	"rc/tsb5rm3jyV0qOxk6ObY8ZOaTIvk1eLm6lLtZNvtx1laKDXauwgE+92StvSXJZab2zM2l3uYmi" +
-	"IVzSVvVOIE4TEEKad3HGSKygKpCaSo7ct+/dUzPu1tE3+lX/Z7WAD7kwJdnl+r5V6jq7Plwv+rjb" +
-	"GTGL+z9mNjB3cVT+p/DcR60xRs/IsnzfdPSZMlJLJOVkTvp0jO+LfL4X27EcdvPDw3v6OjWSz+TJ" +
-	"Z5l8HIoiquZXPPLqmEUOm39RGa3IwsOfguiZmZqIF2DsDpJJiTapSFYKFGDTr79fD/h/Z/kw1/A/" +
-	"zxQAZAP48GZxmZj/BHm7jPl4tco2zu/RSCM1VNCZI5cwWyltz3GeHlL+w1PK7o8fDTfJUfwq7AqK" +
-	"ElR/1UhrVBdYNUW0LBlGoIo+JbBiaGwNIKCvd/VrVuIOVY+HGZJzZzhRE6ckuA8ticpZOPpOuuXa" +
-	"KImu3UyMxO1amcSxC8mbshm5/lIYjo5kHcND4/kn8sbsRwh++dFinScFgHcTjpweH3aAkjJ7NZJh" +
-	"ddL2dOl6oL1jLNaYM1MgGs52V9cDhBLMwwtZ5YpSzsDNuTpQts24pU5iwhxqgIHKpU1yJCBXnBEJ" +
-	"mSqlV5u7exQh/p1mcnW7JmCri2y1MbKmcokR2TAXipUQkC6CwwQ12Gjnm44X1tVZUp3wlIdJOO5m" +
-	"wrczzu+aFaUilZUS7dnOxbWfWcQeSZ0hL7XHvhkbDzwo37Y5ckj7LmXmHin4QLlw9Ec5/JGyztRG" +
-	"X77Pgow2DsQ6pFw8CK6PUTSTZrWK6ms1J4xnhI0q8I+Ssvmmx/P/r7qE2bRAJB9mf25A5z30NtnL" +
-	"6Pmqft54xt9X3KrN/NSEF1a4R938Ou1vHaOqTRyvO2h+ZZqd1LGaryhzy460Fwfoi7DtiepNdA+V" +
-	"zXPjwfHd+wQOyGMkj0raTGF7VnkvOqpmpZThtUdNn0VJPsKqbdOUAo16juWVKpvxIwUefdTGVI2W" +
-	"xt5rY2t2viki9JK9xd3SJIkOhySAxWJLCGZb4LrTCT3qPu7MoTJE10zkYWgeyawo1blLhbkKGHiZ" +
-	"SLONHph0Zmnz1cYA3RqHbyrB/NqTf4rxWClAjux9sybomMloiRMm9QlnP6Jj5HvtjsYF7il7l0jX" +
-	"MtL9sUMBEpx91hbl+/jW3jqZXfdEZMIOccK6re+rHGqfbGxjYnnDOe8T4OziLqEn8cDo8U3uZNI9" +
-	"+rZY/1+m9aZrGv2EaunZM0m5cU7X1POp5guRbRg2tot/g+/jYyTAipiYd30IhHmjxz8Zc2rQjdcb" +
-	"5CZdXH3fH4T9H42O/j68ZVXgty63afB3lwUIheY9TdWksCKNItEw8L7kwgGaLvc85h6mRaQPm7YI" +
-	"mYnovikrbjd2eGmWNRN588bS0s7T3WjL59IZlW4eJhSFGPW6EDovZLjfDVL74o92s5lyAyQ4INyq" +
-	"gVzWv/j4aw+H6buyxIjRdfRDyZb+NHWrsD23UhRwlyzY42awYWc6lfzag5F55eStTf9rRhuzVROE" +
-	"jAmYZ2bWlICbSehLazA+NNsC7SnKNbXXUMrObZXU0bFu+phdvVja6/DNCQkzS4XqDWlrDytvLVIO" +
-	"fd2Xj0O24X1z453ylFk/j9ve4lz+B8utfOXokeilpTm1L/zvXc5+pNcY/uLmvZPpsezuc4Z+g7I8" +
-	"lVPy/Et9eH+Y3vZIZe+aB/CTMODCDJOMeDdsmKt29WEjDc9AfZ4u1pPukz03zhZ+vzRdmsXjjreU" +
-	"wgzctKJSRVDe5xLLIZmbgWLsFfHqm+F1I9+nyKo9edkYW3R9Ipo983Z02KIfdeHBkMHHn8DW4nz1" +
-	"+5mgdApk5IURBIgEE7boPGAFYAPquEaBic/Rwmnq20EA1FiEVQjBjJBIBfYUfkDwGbkAZUUtZlor" +
-	"CGHFFIkqUrRhxgMJB68bJedguTa7L1cmjNiwpEjFYmlAFEANGhRu+FBdJgUlb+itYpLhS9e+sqou" +
-	"8GwAGRQBD6gRE4/rD9x71IXGomMpBwzAxWCKQqUBQqNKgqXLiV3bppW8JdCriy8WRjlL/y1ldMRN" +
-	"K2pRQFbRHHIpqmjKgqoiL/dcyukplgqt/fhMTEmmVy2jHGg399Na2lx0mApifu28Z7LB3WyX7mAd" +
-	"D99Hq/Cj0hGInwCg7T8PY/TDUMet3DA3yc4aFiKkE/pSz+ovbPD+L8fxI+cfp22n9HmdfqF67pXR" +
-	"+uPpkTj7JuUM554R0uKFZo0uwL/244GOE/tg+zWdJ3fbGmaQg1dnHTLH4+KPnFDj9Vq1ZNL/eozL" +
-	"Oipce/ukJE/6vGGCvqFnbZvqQ34x9B/Cr02eF0o6TvQP8Djg+slju2sLO0IOiOv32aRo+4034LLE" +
-	"svPHM1XAdlzu7umNN0T+MWQPqHjxOSv6tjrUsed7MxDZ6lscn38Yw1ZDHN27SuxtezttN+ryiaRO" +
-	"XO4cZxK4nG9Sxll+s7P2/WoC06HgAniO1M0rO00euOEpcOtyWHtwG/d+iPxcl+LSkORcLIsRkQRY" +
-	"xZkpLTK1Uf7q5MMuiLCRIiIxg39+YMUrdMoqnzK8S9SZNNjS6vRlVG0vLrmmBkmElFkgUhqSZUoy" +
-	"UmokxRtubunYNSN3r7eVeSuxCvS8sVJUbTZpialZgpN5eSOUARUHSKXmk/EfaD1QAkB/R97g+n6D" +
-	"26vxDEMzIsfuDQBwA+SQf6mQD7t/2mqYNm7/n+41MP0TCXIP/o8z8QRjGRgqxFWaMY9g2K3/ibbn" +
-	"CVQUGLt/a2uMYK9wdkaT/RV/f+lsNgbDUGDIrtjJIGxuLmjHdRBiSlIeBRA55x/gJCZKPkGhb5gI" +
-	"JJWoXgE/xQxRGsG8zgwNRkv6s1qmrMuJy7kvcz9XJcvrH/OQ/BrAHAYpIjVX6fsgUoh9SE5Nnd3g" +
-	"zZ5U311/Jt21rX2reXWLDTZ/Plt2iTpC7o2wIXi1ZXpMuC6o8jl5NNK1ufiCI4QYZ8zRkXIHc+o2" +
-	"dz09LIeRrw6SiggEnXNekIZCX/GNh80mkAv64zdnUUYI0HBAe+mYJ+Nr1mrcgsto/JjUU7aG0HJw" +
-	"+mYzx3Gbozde2ufknoISciz5pzjP/aWwB0x5a9CZA/D50hrXtw0a0Z74AjpLgzVltLPpLeL6iG0q" +
-	"eT0iGQ45tex4C64YGHHmL7H5CevzIRfV6WbHr9aOqNxCD9C+CUGRTi4P7HgYpJAYcQYpUDlYDyTZ" +
-	"uEAOmsMCvAloH931YhIqh4pM4neZHlDC7ge0QXGq3/NLHebo/hoKeLx0j4W6vYfxgmqONk1Z7due" +
-	"evpJXmdZdgqUfrP4SJAw0cwobQOPhxgmZKfQ6vLuWksVK01CgzfuOkOo9dB+BxE22TtpuR0dZtWx" +
-	"5D1mSnijyQwYG81v3lFp1zqdJyCT3oUR+eWUtlMov3JgIyU0IgUjij0OEElhAMjJ+KcAgKEwiian" +
-	"dEBke53FPGUpTUCivh9BPQ6TeB4ItgkHv95D5ja/YbE5Kcso/Ah83Gd1SfgrmWZa+wPapwe4uj0T" +
-	"jpLP0z5aD7gqh2N4eknQHYyEYxifBLfE73Xh6/iQvh0EgZswbko0hjTQy+okSCPz/dRWAhP5wpqw" +
-	"140Z3KDUno9Mj1DVf4gJcEhAuAxueaRvE3g3ECbMUAsVZTVzNPYDHEzgiCIDpOcyoJLlCUYWcet4" +
-	"7ePfQZgnwEPNsoYMlyTqz+j5vpktwW0r+fzEMVLJS375MNcESaVLotl3VcK3PHTjsVVFJ3ImDNmM" +
-	"xZAMde2fScG8uc8ZcMpgfnzNJbcHJ2tm5zhDJDGicfN9dMfMjVUO1RR+3bf0eOIquh8+LnG2HusW" +
-	"sWYE+LoxjDBuDur0G2LibFPEDPZ4d2LsHxCzY+kya2SyDctcxxMbhDQmjhzXanEHsHH8Xxb+M/5d" +
-	"lqVPIKkHerSdSSUu9nMGRBMD0tkxGAww5uHB3dbnIY8H4jKEJt549/JdtanPlOc7z8dWrmousQIS" +
-	"QPL3dohW47oSBtCNlmbWOTkS4SZCy3G4kR8IhnaNmh5eqaUO9Tu3ljXXoe56jpfcnek/iH+H1vTx" +
-	"ToHonOg8Gwcx7QnNg24NQkJjgF94VHeqSTLUDqap8BMXW7Rgihk0fA15wQ+fmff999UT+MVilpVv" +
-	"9/P9iHQYfglcQJx1eTrPcf1s/YP0/8f1/u/caT99S5oXWNyhVBcMwDsM/jFSrOPBDwI70ki97A8P" +
-	"h7POfVftueN7/4bc3zV3EfGmj4EVKYLiCEiDYLHGYX9qm0SEAiRIEDuA8Z+YiYA/PUEkFF+MAKiR" +
-	"P2QpOQQdhjIkDIH1yFmsx7DTsealkpikVJonTCoxIp16sK8zzCRJJCfB+vkaptsMEMjbzVE6/9CC" +
-	"XslEEkDiZnPqb7xvvLWb6EBuGSpbCWJbOzPPIekhGTrDqCgCRGXg7wE/WCI+xZbbCVCIkySVhDU6" +
-	"iSHwoqKSnM9om4Z+VKwjShuINg52K8xiMgTwcy+gB5aaaOlIdh6ltZRzk3GM2E1j3QVv0JgtFBEi" +
-	"B9KFkiEEIztjqiVuhtcVgDgDMCQEiQclOBoAb8j0kNzmZqMgqIQiZyBxTqm6JIyIan6NinYhxYSG" +
-	"JyxBA7ymhR8re9Z0wbHbWDFwvUz+H2n2RjBgBMwyhQIayPV9Z14rzyRErRFjaGPLy67W6iyXl3Bi" +
-	"baZCCO67rXs83l5nOutKxBdZDJhhgR1o0apYxhmB4jBgRjEkIT4M9v1zp/I+fbCK8HnO575lkn/x" +
-	"DEhI1lUimGCeYmY5MEkeC/y8HN0fCoDIwZ9/3pzHcanVKpKQPfBNYgf8IpQ06r+VWJIT5W9+InZH" +
-	"GBcbENwEEToXgsIRM0+tLJYkbNix6sWTPLym4icYJ6NsCHrhCHEKRg49maIIwxhSFlsVLRgmJqBb" +
-	"AumFgMpAs0VWMksRvTYghmJ9oesSkwRgrCKDMOdW2onug6Y0rN142vIQBbkKICtRkQq6UsiWaIXf" +
-	"c4N2bAwue2bqKYCGpIiOjrJ9ILIqidEw1MsBF6lIgwsIUJQClSjJAxAJoD8OKwGYB+kzQbYCMTnC" +
-	"nptKOOJa5ZHsK0mYAYNjHHrhFUh+gdf22ft4lhwoht/4iB7pvf74yUstSpWW2BpaTEzMUNDT3+Xx" +
-	"tPZn5va3v7uWsyKsGANWqXAuyIX15bBzAkZcp8ThuDWjZkp7muszHKImsbggb0fmTRp3aoY0BZww" +
-	"qBtlHwvDMYcNnFUOcLBBiqRETh5a8C65MWUeQ3hMEGJA4axRgXCw3LeXMtTZrYS7gOPxqwk/9yho" +
-	"kEN2xaGzpqw0Sx7DP2Rx5OAjGC2nhkCp8eZ7Pcl6KjB7Y1OtCDUXvxr/fIo5Y61MRMo4QBdOORqc" +
-	"H7TSFEUZGRhWkgiiS2Vg2yEsAtkkoqEBBMU6tPGHlxJyOznTetzfbDkQQst0/e/824wA3uKb+eks" +
-	"8KhidRlsSMJBJEDAGfzk7/5Zwkpr3THH5M4PBEx5n17Ub0qggdJM6LfZGplTeD7d7M4RbsaW+zIh" +
-	"bbHrVtBWQYhgTBtzG8s+zmYYfbLM0FtOXg3zdMTnLhLwVII2G07inYX08zDn46f98SfttMDc7tdq" +
-	"tR1vJxHXPFvm56Di3fbb7CB5oO2a2Qkju78J+mXaTrL884tikdO2h9ScaToWOhUMzwO0W+zHSZ3r" +
-	"gy5mzHTPHYxsYRs8BGEQ+z4iyuKoWDUuxuuUwlwHdjD1w7IqRDSnYXEtsIFvacd43TY41gWmzczS" +
-	"imfZnvZw6hxrbbgziJaIZmveTeQXOoZsrON81oli52q8qR91ydprp136HHBswDP06BnoTlbpY3Bp" +
-	"hxKurWoC0sheZ0mG1NnXPK+WlJUMluUhjBkEb5UN5eLeEtxZkYYDTjx3XXn15raUWGBjKdQ2iYzq" +
-	"u80wb8DmFyWsdxFmhLGIyYgd3WU0Pd8HW9zvOpFDiJdh5QzUuMvN1MXW8Xc3O0TnOCSjDNYZY0OO" +
-	"1l7JZqnMMugzQwuoDOzTRBiDjHcGRGNUQQ2DOnKqECwRXKd7FCkOgWFiBxOkpCHZANAzRcxiCQYb" +
-	"TJBF6CLIoRQDtP4fLn9Peg4WBtZDpZ5UAwYLAEQURCfyfn6S47noxNAXMzYSQFhCCyECABAmB0Kz" +
-	"sw98wXf6rwgt4pBiQBukIhpoDiPT1PZtXMNxjvUQ4/qymZQ5rMw2BooMJn8SQkzvzpPgv1xtKu2M" +
-	"bMMfIRhYQNysAjqwTTY7i2ZqmOtw3gIc0oq6OqHWU39P0my8MNYbESokIP1kAOhFL2GQCw5GcPsj" +
-	"5BJdoBvGEeRzM8J2Jyx6nk5l6oJCrEGKvhCHMTXB1hYG1fP3a1n2ZA7vGrcbs+3KApFTBlZS2mMh" +
-	"JDECQxtcC34jSXUwOnsNeEHhiI8GWOiMInnEM6+bYdZ4z4ezEWCLEioyDEjAFmk+g8b2NRvRdMbj" +
-	"ZSNjM2KKmb6Ha6hS2zWlBqPh9L2eW2vVXy+veMsGVCKUsUCSoPWmmGMsjWUJLl8YlplnIPSBobnz" +
-	"ppHclkdYC2eWr5gqG0KcDtgoe2Bm1EVjFJ0rBCCqWhOGR00mSNBFDeJuA8I+jSGykN9il6Shmj1k" +
-	"D88BYgyLCe6lM1XjJDIY5DwVNmny26pmRqq5hxN0770E37hPulwMJkrjLS3TImIOLamTjAFEyWKm" +
-	"xQFKMhxOvYsr5MAgQ3/OJ4QOYm5WQP0hXg5AA5xQYME7fFCoBIJEOPM32CAfqQ2oO5cPfF8JERhB" +
-	"SU0J+SCWAXFy9RupRaY/bh9QdwQP3sZJHx6EPIQ+J8mOUvp8vfAfZP4sJgRGLbKMUgxAKRkKrCEi" +
-	"viWV+jrJIglYLIRqj0ko6QxcWWHtEoXyCSQbiZMgAicn6GG+0YcTCSFz0sVIOk4Sfnequ1CyymVQ" +
-	"LQ3mt2q9FRkJa3zVEkFgJjEzOjuygElBVCB2m2ZUnPzGrmfRqfDs8KSCiCMVjGD5EPW8dBEnA/dZ" +
-	"26RHQB3mI9AGQ0dG8Yez3OW9Uo2lBBthKkbYWuYUzxyEODR/OB+Mw09HWNPsDiBdsvpDYtitRVJQ" +
-	"bURSAxT1TiElh9RIO5SqWwOMh79GtpJXuRhkfidxAn0IIP0sULRYwRhbbbZVw8w3Dx69lZ8oQtn+" +
-	"wP+h0JOY/eeT4y/Y+mynVjc5IYJQb0t3QkHIPqgQ4JxJmb5W/6+t16TV6Q+by3Xlmv0stEbJZYrP" +
-	"3Vpoa9J+LBhGBGAPEoVOegvTxtQgwZRI2goEUkkG2VKwlJ0nh0HWKmRzfwpOI/YkTF/JwVzgiceK" +
-	"QIjIE8TnxOv173TUwNt4te2B1fU15wGEE6oPpez8o+JryMT3HvDXaF3ii9ywJEDh29LbRHw35sTZ" +
-	"HTbm0Dz3w6O+XOshot1XKs5Lyq9XgmgGRMLOl2h0wOL4dK8nS97r4YhKE+/uuOPkGz7ENQzrDqaK" +
-	"eCCxggisgKqJQkgGoosJGYdV6vjqW6etE4h8zj2jpuIA8yMkgoSDUix+cZAYrLAfWAwz41REqpH0" +
-	"nyD7fFGk2pLUWmZq0jVTaV87gpTimFoMk6CG0MKU9N2JZqGZMCzUFNQKXCFie2Bk6NFkN2iahqd0" +
-	"TUL0PoBd0Z290I/cUoEZ4MYRRbKLTp6ZNhloaSFsqo0paokUEGQjIQIiRYC/pNEC6IqiF8Dkeyqn" +
-	"JJo/j+AEzeusxpCBHZbt3Z3nEOiGpTDhSLd02YNlpvN3JN2biuIUTWVJkqlpZm2SadzIymtOoIwm" +
-	"9Cm4MSGFJl3fXvWwqG8TZUw4NAZGMJrJOfufKAya+i0Gw7zE2PDQVPZippYfkBJIblusI7LkQF4w" +
-	"TieqM1Q391XtVi1ECRGwuacU3RoM+hiBIFBRIZW/vXKsjEOMVmhRmGZaE7y9THsnwzG4vjKAkhGc" +
-	"wJ1qQdFgniU0EqNFctIja5vRKLqjOiKgxZIk7lAoBg22zgmZRQssDPaAyL90EObLBA6eghCMQhdt" +
-	"CL5/ses39Q/Kjqia4HvV7wOFvEaShymnHiMeJQ0SYBGE8aFnxalICkMPOw0qOUl3Nwgckkj8w0L4" +
-	"9fVrVNZNOPnwdJycD9FNJ9886azUp5tqGY+EAYeKTfvgnWyMDoYgZGLDNSmJnCqaAMIBkGdDc8rR" +
-	"RIpCpUktoRdFzBodMKjG1K865pNFr0q+DTbT9cKuI6noLmhbcIUQFHS5v377BVJTsRM38/k7bjVQ" +
-	"/QsGFAWOwy4omnhwaQ4dir9UBWLBQtxIJqOc0kd+1gLNFJRamnepDQhCb0D22mGERkybwyhxbkvG" +
-	"DfXrYw0hu4GOIYTDa3IR130b1DVq4FlBjTdyZZILa5cMBJorNMsfJKzYbIZibbkDp9eD+qcSCJ+Z" +
-	"Aw6J6JiTwaKiMsCRrPJo/VKomqUUaNX77+KQwCQBk8d+WuyGzDeB+XezzxcuJGLIhkMpMD6P173X" +
-	"LtobHIhvI8zl/jzAYzfP15Vtfno0bRSr3OiMZIyCc76lEhkyY6kJdFFExO7MSLFNET9zDMoTSfEm" +
-	"FECcF1Y5N4ToR0aUA3GSzFkiICKKM2wagnNB58ypLSPqzEaq0TxVGQloCZoMHKnM4RsYCB3sjADF" +
-	"0ulOqQx3OhD3kXkllMGDo+iI0e2gNQihIWnefq7k8HyQBTwO6HqOTDBbhLDMeBmE3d2ry1uaxUlV" +
-	"9WZLWNc18Mua2SNpqTx2umteedVqW9zIWW4rAboajE0SBhAcQLS6xZdoLE5myiDDRCnAer5IeqVC" +
-	"p4fZ8tnsnIL0sMgb0WgFSV2D9yOEDOg9ScQ8SeBT9Fu13qH0Ia/TilDH0r7/kCRPayBFqjiF41Pn" +
-	"B+IRYJBzdlB68ANn839DLohhGQB64qMgHpYhQyLpQVEYEQUCwmtEiprwfikV8whevoRXFAgbsEuM" +
-	"IAGJosjS1IzJmtC2QVIJ85D3MhplhRsD2JLlKgZlCBGRTx7OIFoaJDWV1p6ZY2MA3mTkVuTCLvkY" +
-	"B9GQuA5JGEEkAIzNyD7XtQedjp3G16IAZoIFHukAm/wpuNsrbW9+RESIe+yorMlloVIl62QMxK0l" +
-	"JIsGBZaSASHuIqUkoOtNsqdiQ01oDA3qvbA9AFEWBFXviyRgWqSxkWs2irRtSWyo4XBSwbCYjsF0" +
-	"JyEDqA876sc4VAoO4NNd5wAlkHoPthseqcSMzdXvnnuMNy9LCQ76CTonH2SJtAO7mFUwWlkEafWW" +
-	"UJgaipGBIwwcBTZozNJTWvxlhY6P1jTHN1r7qs+a63NG80pJo1FGpCgpWmW9G07U7LmClLJRMtIH" +
-	"+XRZByw0WARSKtIlpEEa++lAsGIXNYJSOdY0GZbMFERKblrWECLFCWULJbSgFSpXyNoOytD3YL90" +
-	"xYSQhlD1QLJLQI0He9BzCEnVUSqicw+8My4R9hISYkJGYIxj8ruAhMajQwXdcJGBSBFRYiEzLDQs" +
-	"CajBMxmCr9tr+pNttLXxe3r5N7djRszWjJLEZs1mapMmmTJTQTNpSqUZsNU0JRlqNljWTbV+p7df" +
-	"Lo0rUkVjdV+CKMDKORHjOxLhIwk9G21jFEYFD4XjWjw8wvyPogFPIeTDwiBloHASYHMk8xALgXwl" +
-	"ATRqLTEQYWQsVkWQUKaMBwo7AQKQfAF3fSVyBBLobqUc9N30Yhd9lPGGxI9LQNomLwZp5ZZsMZkl" +
-	"oF2Byvel2w26lwkZCYQKHFs8KDgeFO2+29nFIKMOG7yWYijLbKDKNtLaksQtZVRtZBGNkVAxCiCA" +
-	"Y0LYLJWyyolpYoiIlGrAkS1LLY5k3YQxlKvO3TdNkNSU2Rdd21cyEIcUog9BsnPOQYJDHgyjFjMY" +
-	"rbgvBfJuwtEhGMMokttuSiYYRmQzSrobTNZGFRBRJ0D9I/mJERaCCLCgGiqRrIBlFPnSl5lPE51v" +
-	"mPyjjESFnwAxWlkO96k1MjkQjxldSypErtlBcLC2xJa5YIMOc9hTxTkPSHujC48AnAicrbndNoPO" +
-	"N74pxoN1p5k0VDQyShtPkmhEPSBIBwWmSBAhFI4ntAwUbinCB4hQIFQWEEWCWrvE3qfzQrTTT7si" +
-	"6zQ8MvTyensgBuMEix6adydCOBCBUjFYG+R5YCfYgcfe3KBA528A6ViECYJgPJNB3nSTyDyPKUoB" +
-	"/mQIKxFDYbNYIYrQNbnFO2rWmvkt5vFGebcxXGlIkCiBwVLS2QolREpXmBd2Q8XDpAVtaSkE0BTO" +
-	"nujaCkO9awitnCKKcMnFFHh6fqiPxztdZntuRCeDzyIgwh826nhMzIM2TOwEXW01STLWw5saZe6L" +
-	"ZJoHfoIya3HY79edGjjYfToLT9W+yIpw8X2hhlKhzNjppSbn3t5mBXnyGl+qT7uQbI5+TV6rtb5z" +
-	"y+41+l5LWFxPpRlQGUYQndmJEQkgvWI4R/1s40rG2dyJDQtbruUVR5sPluFVcb5o5DQrT35OfHg6" +
-	"nXsdDhJ4Nkg6D223DHsUoizm1yj4XOdaoIMlVhMBJZJmCIHqgC0gfgz7LGB9HflZG54HCcBh4375" +
-	"6X1dGN+X5axnNu8vqiV7DyNFDXakMyESZcSBwet+6o/TaDQ2yz52GvPcN8lqBxN23CHsR/XQBTJC" +
-	"lBxVhYJyjcQgQvEU1rk+6HSk9vKX+aSBPeAzRGEsBBisD2+XwrWjbRJaEliHqYvlo00yzvSnv9dM" +
-	"IE4khSVKE0W3I2lkgwSAHIhNIEKQQELu+sjBqOm7Ur2wecZHEVHbQYRG+frxWHNZz8VZk4Em5sHZ" +
-	"45CsKUcCifEbXdlIxssZqYYyRUVA+UgcJuAeJwptCkVnJypDkksFFCXJaUuMU2A9AwjZg0nU3GQF" +
-	"qrx3zaKJS3bl733s0xg0apuNuDStMwxlcQVMQQKVQSCZvRLTcU76R4xLMmc45p69aBkD9poNHIAd" +
-	"IFnQkWRDo32AsplDEwLMsMJsGweqY8JPrmunefNpeK8/dLFIqiYhNYz0QzOmhJGEB4LqASPQy9S8" +
-	"obyytQSt66RgQTZZrWZKxiBqQEicBaQPIO6uPfxPFVgzwxzWUbAkltjaNVbTLUj8W+oEtzaWw8tn" +
-	"JhMw+KeonmDEPs9ppd82wYnDsFIVXJTYejCLMRdxe17QzSmWWQ5F4rbErEQhMxuQb6n4lrW+BF4V" +
-	"MbVfZ4moMOjGHVTmNx+DkrbHWs9JZwe2dbvDNDJnT1xJDMtVDIDNVn28eMDhnCKVCs4SsDGI3JRC" +
-	"4FRQycOmGmzVtDCswMNYHQutmo1uWyqAiLp4YmEIKcdLMpQRYzDRcy/Gryi4zHhmO2DrMlwtiFxs" +
-	"y2URYJEW2gl9WQpkJcLLPWevecJ17XXby7blWRRB4c6cgYhEYsM8wsNyABYwJtUgZTpNybGcdonJ" +
-	"jJYb3nicBcbBxDZzEMgiSIY4IkvGEhqJZLjBsFwzJlyJGR+DaLlt2SkuN17TCLhcW8YTBMwUziQJ" +
-	"n52sYOp21W0RM8UC+fKzk0bnoqBHWMxnAW7wCKc/x7rcjpmWhpRANpXlDKoBjEXS35bNSwzddkdA" +
-	"OajcSPD5WSQxnM63z99hzqciJVGxghWs2lipUVyOSjj0zMZ8aVDnmx9pb2tWoKtfFa3u2xrTKS1N" +
-	"7OFeumgtBKKaR+2UJzieUMYBjAIR0WTWmbctjckr7N3VPOru7XMVNk3dt2WIqK02ZudmLFCQkCqp" +
-	"qCyBjGVEdTfF1r7+h+B4O7cou29BYbMh0BFODClliYY5AfJs4+D71Yp7UjPhZjgi333MsPyptUte" +
-	"pFqLJSVa3K525vVziUCCba1HiWF6EI0alvjIt9W7XktfUWvmlum4Kk1aPtoT6dBkB9UaFZ5QZbHG" +
-	"W9Hx/keXtc/nnahU1Y7RoJIXYWFhEDWKe07iby+65oodgnCkf5NWkMTu19eoiz4tB2FkEbAkZFkC" +
-	"QJE2Av9uxj+i4HbYr0Tvi1I5100j8WCciL7h7fGgQTpfTgkJBFPsDsIMZBj5Wy+oD9j+QeOzkqpU" +
-	"q/oD+P02H4E8UHwsrFH7aSsGVsBMw62mEXoSkQ84lgDk6QPTQSKJ6IDuMet75Q5MuoXGTnYascmB" +
-	"kZYOrLA4yQwFTEheZ+Y+BIKiIshoD3MOAx7LfBLUJvRj7KCQhCEoyU2M7LULDIge6lGgjgY1GgVP" +
-	"1KiERIjIAqighIyEC+Xs59Werg1dzsxTVbdmPUHCsMCzELDJzLSojrMVCiDFw8Wmp7p8Vfz5LJrI" +
-	"SQcTIJk0em8ShhFjDJtzeGIl0lZ35N7yVChV+qBCJAjIDCMsy22FjGaitTTZRNUXvy4bk3m7YZ2P" +
-	"WRoBNMYUgOEQMeLhWFF1FeiKoHKwXDHI4GF4EzoogSYlFYVPFwyzgyUiM/HtTQzSwY3/935P/pVS" +
-	"I5ztPxjuSv4UbQOH7cbKdMD1cq9uVWjVUZovZM7cZLxSrw2eWrDGsDgVWAPhYSdXl3xfH0oaTwfb" +
-	"21zqsFhC8NIHdIQSGZveMwM7oSy4ZzP7nD3WnjXGmq73mP93ldP8PvgOpMwbfV1RvR+V/DOnF9rK" +
-	"v9hdyRThQkN3QmOE"
diff --git a/test/bench/go1/regexp_test.go b/test/bench/go1/regexp_test.go
deleted file mode 100644
index dd1034f..0000000
--- a/test/bench/go1/regexp_test.go
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package go1
-
-import (
-	"math/rand"
-	"regexp"
-	"testing"
-)
-
-// benchmark based on regexp/exec_test.go
-
-var regexpText []byte
-
-func makeRegexpText(n int) []byte {
-	rand.Seed(0) // For reproducibility.
-	if len(regexpText) >= n {
-		return regexpText[:n]
-	}
-	regexpText = make([]byte, n)
-	for i := range regexpText {
-		if rand.Intn(30) == 0 {
-			regexpText[i] = '\n'
-		} else {
-			regexpText[i] = byte(rand.Intn(0x7E+1-0x20) + 0x20)
-		}
-	}
-	return regexpText
-}
-
-func benchmark(b *testing.B, re string, n int) {
-	r := regexp.MustCompile(re)
-	t := makeRegexpText(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$"
-)
-
-func BenchmarkRegexpMatchEasy0_32(b *testing.B)  { benchmark(b, easy0, 32<<0) }
-func BenchmarkRegexpMatchEasy0_1K(b *testing.B)  { benchmark(b, easy0, 1<<10) }
-func BenchmarkRegexpMatchEasy1_32(b *testing.B)  { benchmark(b, easy1, 32<<0) }
-func BenchmarkRegexpMatchEasy1_1K(b *testing.B)  { benchmark(b, easy1, 1<<10) }
-func BenchmarkRegexpMatchMedium_32(b *testing.B) { benchmark(b, medium, 32<<0) }
-func BenchmarkRegexpMatchMedium_1K(b *testing.B) { benchmark(b, medium, 1<<10) }
-func BenchmarkRegexpMatchHard_32(b *testing.B)   { benchmark(b, hard, 32<<0) }
-func BenchmarkRegexpMatchHard_1K(b *testing.B)   { benchmark(b, hard, 1<<10) }
diff --git a/test/bench/go1/revcomp_test.go b/test/bench/go1/revcomp_test.go
deleted file mode 100644
index f3bcf0f..0000000
--- a/test/bench/go1/revcomp_test.go
+++ /dev/null
@@ -1,87 +0,0 @@
-// Copyright 2011 The Go 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 benchmark, taken from the shootout, tests array indexing
-// and array bounds elimination performance.
-
-package go1
-
-import (
-	"bufio"
-	"bytes"
-	"io"
-	"testing"
-)
-
-var revCompTable = [256]uint8{
-	'A': 'T', 'a': 'T',
-	'C': 'G', 'c': 'G',
-	'G': 'C', 'g': 'C',
-	'T': 'A', 't': 'A',
-	'U': 'A', 'u': 'A',
-	'M': 'K', 'm': 'K',
-	'R': 'Y', 'r': 'Y',
-	'W': 'W', 'w': 'W',
-	'S': 'S', 's': 'S',
-	'Y': 'R', 'y': 'R',
-	'K': 'M', 'k': 'M',
-	'V': 'B', 'v': 'B',
-	'H': 'D', 'h': 'D',
-	'D': 'H', 'd': 'H',
-	'B': 'V', 'b': 'V',
-	'N': 'N', 'n': 'N',
-}
-
-func revcomp(data []byte) {
-	in := bufio.NewReader(bytes.NewBuffer(data))
-	out := io.Discard
-	buf := make([]byte, 1024*1024)
-	line, err := in.ReadSlice('\n')
-	for err == nil {
-		out.Write(line)
-
-		// Accumulate reversed complement in buf[w:]
-		nchar := 0
-		w := len(buf)
-		for {
-			line, err = in.ReadSlice('\n')
-			if err != nil || line[0] == '>' {
-				break
-			}
-			line = line[0 : len(line)-1]
-			nchar += len(line)
-			if len(line)+nchar/60+128 >= w {
-				nbuf := make([]byte, len(buf)*5)
-				copy(nbuf[len(nbuf)-len(buf):], buf)
-				w += len(nbuf) - len(buf)
-				buf = nbuf
-			}
-
-			// This loop is the bottleneck.
-			for _, c := range line {
-				w--
-				buf[w] = revCompTable[c]
-			}
-		}
-
-		// Copy down to beginning of buffer, inserting newlines.
-		// The loop left room for the newlines and 128 bytes of padding.
-		i := 0
-		for j := w; j < len(buf); j += 60 {
-			n := copy(buf[i:i+60], buf[j:])
-			buf[i+n] = '\n'
-			i += n + 1
-		}
-		out.Write(buf[0:i])
-	}
-}
-
-func BenchmarkRevcomp(b *testing.B) {
-	bytes := makefasta()
-	b.ResetTimer()
-	b.SetBytes(int64(len(bytes)))
-	for i := 0; i < b.N; i++ {
-		revcomp(bytes)
-	}
-}
diff --git a/test/bench/go1/template_test.go b/test/bench/go1/template_test.go
deleted file mode 100644
index 86d96a9..0000000
--- a/test/bench/go1/template_test.go
+++ /dev/null
@@ -1,81 +0,0 @@
-// Copyright 2011 The Go 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 benchmark tests text/template throughput,
-// converting a large data structure with a simple template.
-
-package go1
-
-import (
-	"bytes"
-	"io"
-	"strings"
-	"testing"
-	"text/template"
-)
-
-// After removing \t and \n this generates identical output to
-// json.Marshal, making it easy to test for correctness.
-const tmplText = `
-{
-	"tree":{{template "node" .Tree}},
-	"username":"{{.Username}}"
-}
-{{define "node"}}
-{
-	"name":"{{.Name}}",
-	"kids":[
-	{{range $i, $k := .Kids}}
-		{{if $i}}
-			,
-		{{end}}
-		{{template "node" $k}}
-	{{end}}
-	],
-	"cl_weight":{{.CLWeight}},
-	"touches":{{.Touches}},
-	"min_t":{{.MinT}},
-	"max_t":{{.MaxT}},
-	"mean_t":{{.MeanT}}
-}
-{{end}}
-`
-
-func stripTabNL(r rune) rune {
-	if r == '\t' || r == '\n' {
-		return -1
-	}
-	return r
-}
-
-func makeTemplate(jsonbytes []byte, jsondata *JSONResponse) *template.Template {
-	tmpl := template.Must(template.New("main").Parse(strings.Map(stripTabNL, tmplText)))
-
-	var buf bytes.Buffer
-	if err := tmpl.Execute(&buf, &jsondata); err != nil {
-		panic(err)
-	}
-	if !bytes.Equal(buf.Bytes(), jsonbytes) {
-		println(buf.Len(), len(jsonbytes))
-		panic("wrong output")
-	}
-	return tmpl
-}
-
-func tmplexec(tmpl *template.Template, jsondata *JSONResponse) {
-	if err := tmpl.Execute(io.Discard, jsondata); err != nil {
-		panic(err)
-	}
-}
-
-func BenchmarkTemplate(b *testing.B) {
-	jsonbytes := makeJsonBytes()
-	jsondata := makeJsonData(jsonbytes)
-	tmpl := makeTemplate(jsonbytes, jsondata)
-	b.ResetTimer()
-	b.SetBytes(int64(len(jsonbytes)))
-	for i := 0; i < b.N; i++ {
-		tmplexec(tmpl, jsondata)
-	}
-}
diff --git a/test/bench/go1/time_test.go b/test/bench/go1/time_test.go
deleted file mode 100644
index 4687de3..0000000
--- a/test/bench/go1/time_test.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.
-
-package go1
-
-// benchmark based on time/time_test.go
-
-import (
-	"testing"
-	"time"
-)
-
-func BenchmarkTimeParse(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		time.Parse(time.ANSIC, "Mon Jan  2 15:04:05 2006")
-	}
-}
-
-func BenchmarkTimeFormat(b *testing.B) {
-	t := time.Unix(1265346057, 0)
-	for i := 0; i < b.N; i++ {
-		t.Format("Mon Jan  2 15:04:05 2006")
-	}
-}
diff --git a/test/clear.go b/test/clear.go
new file mode 100644
index 0000000..60ee4ec
--- /dev/null
+++ b/test/clear.go
@@ -0,0 +1,47 @@
+// run
+
+// Copyright 2022 The Go Authors. 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 "math"
+
+func checkClearSlice() {
+	s := []int{1, 2, 3}
+	clear(s)
+	for i := range s {
+		if s[i] != 0 {
+			panic("clear not zeroing slice elem")
+		}
+	}
+
+	clear([]int{})
+}
+
+func checkClearMap() {
+	m1 := make(map[int]int)
+	m1[0] = 0
+	m1[1] = 1
+	clear(m1)
+	if len(m1) != 0 {
+		panic("m1 is not cleared")
+	}
+
+	// map contains NaN keys is also cleared.
+	m2 := make(map[float64]int)
+	m2[math.NaN()] = 1
+	m2[math.NaN()] = 1
+	clear(m2)
+	if len(m2) != 0 {
+		panic("m2 is not cleared")
+	}
+
+	clear(map[int]int{})
+}
+
+func main() {
+	checkClearSlice()
+	checkClearMap()
+}
diff --git a/test/closure2.go b/test/closure2.go
index 812d41f..081d2e2 100644
--- a/test/closure2.go
+++ b/test/closure2.go
@@ -73,7 +73,8 @@
 
 	{
 		var g func() int
-		for i := range [2]int{} {
+		var i int
+		for i = range [2]int{} {
 			if i == 0 {
 				g = func() int {
 					return i // test that we capture by ref here, i is mutated on every interaction
diff --git a/test/closure3.dir/main.go b/test/closure3.dir/main.go
index 4d02a4d..07629bf 100644
--- a/test/closure3.dir/main.go
+++ b/test/closure3.dir/main.go
@@ -188,17 +188,17 @@
 	{
 		x := 42
 		if z := func(y int) int { // ERROR "can inline main.func22"
-			return func() int { // ERROR "can inline main.func22.1" "can inline main.func30"
+			return func() int { // ERROR "can inline main.func22.1" "can inline main.main.func22.func30"
 				return x + y
 			}() // ERROR "inlining call to main.func22.1"
-		}(1); z != 43 { // ERROR "inlining call to main.func22" "inlining call to main.func30"
+		}(1); z != 43 { // ERROR "inlining call to main.func22" "inlining call to main.main.func22.func30"
 			ppanic("z != 43")
 		}
 		if z := func(y int) int { // ERROR "func literal does not escape" "can inline main.func23"
-			return func() int { // ERROR "can inline main.func23.1" "can inline main.func31"
+			return func() int { // ERROR "can inline main.func23.1" "can inline main.main.func23.func31"
 				return x + y
 			}() // ERROR "inlining call to main.func23.1"
-		}; z(1) != 43 { // ERROR "inlining call to main.func23" "inlining call to main.func31"
+		}; z(1) != 43 { // ERROR "inlining call to main.func23" "inlining call to main.main.func23.func31"
 			ppanic("z(1) != 43")
 		}
 	}
@@ -206,10 +206,10 @@
 	{
 		a := 1
 		func() { // ERROR "can inline main.func24"
-			func() { // ERROR "can inline main.func24" "can inline main.func32"
+			func() { // ERROR "can inline main.func24" "can inline main.main.func24.func32"
 				a = 2
 			}() // ERROR "inlining call to main.func24"
-		}() // ERROR "inlining call to main.func24" "inlining call to main.func32"
+		}() // ERROR "inlining call to main.func24" "inlining call to main.main.func24.func32"
 		if a != 2 {
 			ppanic("a != 2")
 		}
@@ -232,15 +232,15 @@
 
 	{
 		c := 3
-		func() { // ERROR "func literal does not escape"
+		func() { // ERROR "can inline main.func26"
 			c = 4
-			func() { // ERROR "func literal does not escape"
+			func() {
 				if c != 4 {
 					ppanic("c != 4")
 				}
 				recover() // prevent inlining
 			}()
-		}()
+		}() // ERROR "inlining call to main.func26" "func literal does not escape"
 		if c != 4 {
 			ppanic("c != 4")
 		}
@@ -248,33 +248,37 @@
 
 	{
 		a := 2
-		if r := func(x int) int { // ERROR "func literal does not escape"
+		// This has an unfortunate exponential growth, where as we visit each
+		// function, we inline the inner closure, and that constructs a new
+		// function for any closures inside the inner function, and then we
+		// revisit those. E.g., func34 and func36 are constructed by the inliner.
+		if r := func(x int) int { // ERROR "can inline main.func27"
 			b := 3
-			return func(y int) int { // ERROR "can inline main.func27.1"
+			return func(y int) int { // ERROR "can inline main.func27.1" "can inline main.main.func27.func34"
 				c := 5
-				return func(z int) int { // ERROR "can inline main.func27.1.1" "can inline main.func27.(func)?2"
+				return func(z int) int { // ERROR "can inline main.func27.1.1" "can inline main.main.func27.func34.1" "can inline main.func27.main.func27.1.func2" "can inline main.main.func27.main.main.func27.func34.func36"
 					return a*x + b*y + c*z
 				}(10) // ERROR "inlining call to main.func27.1.1"
-			}(100) // ERROR "inlining call to main.func27.1" "inlining call to main.func27.(func)?2"
-		}(1000); r != 2350 {
+			}(100) // ERROR "inlining call to main.func27.1" "inlining call to main.func27.main.func27.1.func2"
+		}(1000); r != 2350 { // ERROR "inlining call to main.func27" "inlining call to main.main.func27.func34" "inlining call to main.main.func27.main.main.func27.func34.func36"
 			ppanic("r != 2350")
 		}
 	}
 
 	{
 		a := 2
-		if r := func(x int) int { // ERROR "func literal does not escape"
+		if r := func(x int) int { // ERROR "can inline main.func28"
 			b := 3
-			return func(y int) int { // ERROR "can inline main.func28.1"
+			return func(y int) int { // ERROR "can inline main.func28.1" "can inline main.main.func28.func35"
 				c := 5
-				func(z int) { // ERROR "can inline main.func28.1.1" "can inline main.func28.(func)?2"
+				func(z int) { // ERROR "can inline main.func28.1.1" "can inline main.func28.main.func28.1.func2" "can inline main.main.func28.func35.1" "can inline main.main.func28.main.main.func28.func35.func37"
 					a = a * x
 					b = b * y
 					c = c * z
 				}(10) // ERROR "inlining call to main.func28.1.1"
 				return a + c
-			}(100) + b // ERROR "inlining call to main.func28.1" "inlining call to main.func28.(func)?2"
-		}(1000); r != 2350 {
+			}(100) + b // ERROR "inlining call to main.func28.1" "inlining call to main.func28.main.func28.1.func2"
+		}(1000); r != 2350 { // ERROR "inlining call to main.func28" "inlining call to main.main.func28.func35" "inlining call to main.main.func28.main.main.func28.func35.func37"
 			ppanic("r != 2350")
 		}
 		if a != 2000 {
diff --git a/test/codegen/README b/test/codegen/README
index b803fe5..5a46842 100644
--- a/test/codegen/README
+++ b/test/codegen/README
@@ -11,23 +11,22 @@
 The test harness compiles Go code inside files in this directory and
 matches the generated assembly (the output of `go tool compile -S`)
 against a set of regexps to be specified in comments that follow a
-special syntax (described below). The test driver is implemented as a
-step of the top-level test/run.go suite, called "asmcheck".
+special syntax (described below). The test driver is implemented as
+an action within the GOROOT/test test suite, called "asmcheck".
 
 The codegen harness is part of the all.bash test suite, but for
 performance reasons only the codegen tests for the host machine's
 GOARCH are enabled by default, and only on GOOS=linux.
 
 To perform comprehensive tests for all the supported architectures
-(even on a non-Linux system), one can run the following command
+(even on a non-Linux system), one can run the following command:
 
-  $ ../bin/go run run.go -all_codegen -v codegen
+  $ ../../bin/go test cmd/internal/testdir -run='Test/codegen' -all_codegen -v
 
-in the top-level test directory. This is recommended after any change
-that affect the compiler's code.
+This is recommended after any change that affect the compiler's code.
 
 The test harness compiles the tests with the same go toolchain that is
-used to run run.go. After writing tests for a newly added codegen
+used to run the test. After writing tests for a newly added codegen
 transformation, it can be useful to first run the test harness with a
 toolchain from a released Go version (and verify that the new tests
 fail), and then re-runnig the tests using the devel toolchain.
diff --git a/test/codegen/arithmetic.go b/test/codegen/arithmetic.go
index 327be24..f381b34 100644
--- a/test/codegen/arithmetic.go
+++ b/test/codegen/arithmetic.go
@@ -43,75 +43,81 @@
 }
 
 func SubFromConst(a int) int {
-	// ppc64le: `SUBC\tR[0-9]+,\s[$]40,\sR`
-	// ppc64: `SUBC\tR[0-9]+,\s[$]40,\sR`
+	// ppc64x: `SUBC\tR[0-9]+,\s[$]40,\sR`
 	b := 40 - a
 	return b
 }
 
 func SubFromConstNeg(a int) int {
-	// ppc64le: `ADD\t[$]40,\sR[0-9]+,\sR`
-	// ppc64: `ADD\t[$]40,\sR[0-9]+,\sR`
+	// ppc64x: `ADD\t[$]40,\sR[0-9]+,\sR`
 	c := 40 - (-a)
 	return c
 }
 
 func SubSubFromConst(a int) int {
-	// ppc64le: `ADD\t[$]20,\sR[0-9]+,\sR`
-	// ppc64: `ADD\t[$]20,\sR[0-9]+,\sR`
+	// ppc64x: `ADD\t[$]20,\sR[0-9]+,\sR`
 	c := 40 - (20 - a)
 	return c
 }
 
 func AddSubFromConst(a int) int {
-	// ppc64le: `SUBC\tR[0-9]+,\s[$]60,\sR`
-	// ppc64: `SUBC\tR[0-9]+,\s[$]60,\sR`
+	// ppc64x: `SUBC\tR[0-9]+,\s[$]60,\sR`
 	c := 40 + (20 - a)
 	return c
 }
 
 func NegSubFromConst(a int) int {
-	// ppc64le: `ADD\t[$]-20,\sR[0-9]+,\sR`
-	// ppc64: `ADD\t[$]-20,\sR[0-9]+,\sR`
+	// ppc64x: `ADD\t[$]-20,\sR[0-9]+,\sR`
 	c := -(20 - a)
 	return c
 }
 
 func NegAddFromConstNeg(a int) int {
-	// ppc64le: `SUBC\tR[0-9]+,\s[$]40,\sR`
-	// ppc64: `SUBC\tR[0-9]+,\s[$]40,\sR`
+	// ppc64x: `SUBC\tR[0-9]+,\s[$]40,\sR`
 	c := -(-40 + a)
 	return c
 }
 
 func SubSubNegSimplify(a, b int) int {
 	// amd64:"NEGQ"
-	// ppc64:"NEG"
-	// ppc64le:"NEG"
+	// ppc64x:"NEG"
 	r := (a - b) - a
 	return r
 }
 
 func SubAddSimplify(a, b int) int {
 	// amd64:-"SUBQ",-"ADDQ"
-	// ppc64:-"SUB",-"ADD"
-	// ppc64le:-"SUB",-"ADD"
+	// ppc64x:-"SUB",-"ADD"
 	r := a + (b - a)
 	return r
 }
 
+func SubAddSimplify2(a, b, c int) (int, int, int, int, int, int) {
+	// amd64:-"ADDQ"
+	r := (a + b) - (a + c)
+	// amd64:-"ADDQ"
+	r1 := (a + b) - (c + a)
+	// amd64:-"ADDQ"
+	r2 := (b + a) - (a + c)
+	// amd64:-"ADDQ"
+	r3 := (b + a) - (c + a)
+	// amd64:-"SUBQ"
+	r4 := (a - c) + (c + b)
+	// amd64:-"SUBQ"
+	r5 := (a - c) + (b + c)
+	return r, r1, r2, r3, r4, r5
+}
+
 func SubAddNegSimplify(a, b int) int {
 	// amd64:"NEGQ",-"ADDQ",-"SUBQ"
-	// ppc64:"NEG",-"ADD",-"SUB"
-	// ppc64le:"NEG",-"ADD",-"SUB"
+	// ppc64x:"NEG",-"ADD",-"SUB"
 	r := a - (b + a)
 	return r
 }
 
 func AddAddSubSimplify(a, b, c int) int {
 	// amd64:-"SUBQ"
-	// ppc64:-"SUB"
-	// ppc64le:-"SUB"
+	// ppc64x:-"SUB"
 	r := a + (b + (c - a))
 	return r
 }
@@ -125,16 +131,14 @@
 	// 386:"SHLL\t[$]5",-"IMULL"
 	// arm:"SLL\t[$]5",-"MUL"
 	// arm64:"LSL\t[$]5",-"MUL"
-	// ppc64:"SLD\t[$]5",-"MUL"
-	// ppc64le:"SLD\t[$]5",-"MUL"
+	// ppc64x:"SLD\t[$]5",-"MUL"
 	a := n1 * 32
 
 	// amd64:"SHLQ\t[$]6",-"IMULQ"
 	// 386:"SHLL\t[$]6",-"IMULL"
 	// arm:"SLL\t[$]6",-"MUL"
 	// arm64:`NEG\sR[0-9]+<<6,\sR[0-9]+`,-`LSL`,-`MUL`
-	// ppc64:"SLD\t[$]6","NEG\\sR[0-9]+,\\sR[0-9]+",-"MUL"
-	// ppc64le:"SLD\t[$]6","NEG\\sR[0-9]+,\\sR[0-9]+",-"MUL"
+	// ppc64x:"SLD\t[$]6","NEG\\sR[0-9]+,\\sR[0-9]+",-"MUL"
 	b := -64 * n2
 
 	return a, b
@@ -167,40 +171,36 @@
 func MergeMuls1(n int) int {
 	// amd64:"IMUL3Q\t[$]46"
 	// 386:"IMUL3L\t[$]46"
-	// ppc64le:"MULLD\t[$]46"
-	// ppc64:"MULLD\t[$]46"
+	// ppc64x:"MULLD\t[$]46"
 	return 15*n + 31*n // 46n
 }
 
 func MergeMuls2(n int) int {
 	// amd64:"IMUL3Q\t[$]23","(ADDQ\t[$]29)|(LEAQ\t29)"
 	// 386:"IMUL3L\t[$]23","ADDL\t[$]29"
-	// ppc64le/power9:"MADDLD",-"MULLD\t[$]23",-"ADD\t[$]29"
-	// ppc64le/power8:"MULLD\t[$]23","ADD\t[$]29"
+	// ppc64x/power9:"MADDLD",-"MULLD\t[$]23",-"ADD\t[$]29"
+	// ppc64x/power8:"MULLD\t[$]23","ADD\t[$]29"
 	return 5*n + 7*(n+1) + 11*(n+2) // 23n + 29
 }
 
 func MergeMuls3(a, n int) int {
 	// amd64:"ADDQ\t[$]19",-"IMULQ\t[$]19"
 	// 386:"ADDL\t[$]19",-"IMULL\t[$]19"
-	// ppc64:"ADD\t[$]19",-"MULLD\t[$]19"
-	// ppc64le:"ADD\t[$]19",-"MULLD\t[$]19"
+	// ppc64x:"ADD\t[$]19",-"MULLD\t[$]19"
 	return a*n + 19*n // (a+19)n
 }
 
 func MergeMuls4(n int) int {
 	// amd64:"IMUL3Q\t[$]14"
 	// 386:"IMUL3L\t[$]14"
-	// ppc64:"MULLD\t[$]14"
-	// ppc64le:"MULLD\t[$]14"
+	// ppc64x:"MULLD\t[$]14"
 	return 23*n - 9*n // 14n
 }
 
 func MergeMuls5(a, n int) int {
 	// amd64:"ADDQ\t[$]-19",-"IMULQ\t[$]19"
 	// 386:"ADDL\t[$]-19",-"IMULL\t[$]19"
-	// ppc64:"ADD\t[$]-19",-"MULLD\t[$]19"
-	// ppc64le:"ADD\t[$]-19",-"MULLD\t[$]19"
+	// ppc64x:"ADD\t[$]-19",-"MULLD\t[$]19"
 	return a*n - 19*n // (a-19)n
 }
 
@@ -219,16 +219,14 @@
 	// amd64:"SHRQ\t[$]5",-"DIVQ"
 	// arm:"SRL\t[$]5",-".*udiv"
 	// arm64:"LSR\t[$]5",-"UDIV"
-	// ppc64:"SRD"
-	// ppc64le:"SRD"
+	// ppc64x:"SRD"
 	a := n1 / 32 // unsigned
 
 	// amd64:"SARQ\t[$]6",-"IDIVQ"
 	// 386:"SARL\t[$]6",-"IDIVL"
 	// arm:"SRA\t[$]6",-".*udiv"
 	// arm64:"ASR\t[$]6",-"SDIV"
-	// ppc64:"SRAD"
-	// ppc64le:"SRAD"
+	// ppc64x:"SRAD"
 	b := n2 / 64 // signed
 
 	return a, b
@@ -262,16 +260,14 @@
 	// amd64:"ANDL\t[$]31",-"DIVQ"
 	// arm:"AND\t[$]31",-".*udiv"
 	// arm64:"AND\t[$]31",-"UDIV"
-	// ppc64:"ANDCC\t[$]31"
-	// ppc64le:"ANDCC\t[$]31"
+	// ppc64x:"ANDCC\t[$]31"
 	a := n1 % 32 // unsigned
 
 	// 386:"SHRL",-"IDIVL"
 	// amd64:"SHRQ",-"IDIVQ"
 	// arm:"SRA",-".*udiv"
 	// arm64:"ASR",-"REM"
-	// ppc64:"SRAD"
-	// ppc64le:"SRAD"
+	// ppc64x:"SRAD"
 	b := n2 % 64 // signed
 
 	return a, b
@@ -283,16 +279,14 @@
 	// amd64:"TESTQ\t[$]63",-"DIVQ",-"SHRQ"
 	// arm:"AND\t[$]63",-".*udiv",-"SRA"
 	// arm64:"TST\t[$]63",-"UDIV",-"ASR",-"AND"
-	// ppc64:"ANDCC\t[$]63",-"SRAD"
-	// ppc64le:"ANDCC\t[$]63",-"SRAD"
+	// ppc64x:"ANDCC\t[$]63",-"SRAD"
 	a := n1%64 == 0 // signed divisible
 
 	// 386:"TESTL\t[$]63",-"DIVL",-"SHRL"
 	// amd64:"TESTQ\t[$]63",-"DIVQ",-"SHRQ"
 	// arm:"AND\t[$]63",-".*udiv",-"SRA"
 	// arm64:"TST\t[$]63",-"UDIV",-"ASR",-"AND"
-	// ppc64:"ANDCC\t[$]63",-"SRAD"
-	// ppc64le:"ANDCC\t[$]63",-"SRAD"
+	// ppc64x:"ANDCC\t[$]63",-"SRAD"
 	b := n2%64 != 0 // signed indivisible
 
 	return a, b
@@ -316,44 +310,42 @@
 }
 
 // Check that divisibility checks x%c==0 are converted to MULs and rotates
-func Divisible(n1 uint, n2 int) (bool, bool, bool, bool) {
+func DivisibleU(n uint) (bool, bool) {
 	// amd64:"MOVQ\t[$]-6148914691236517205","IMULQ","ROLQ\t[$]63",-"DIVQ"
 	// 386:"IMUL3L\t[$]-1431655765","ROLL\t[$]31",-"DIVQ"
 	// arm64:"MOVD\t[$]-6148914691236517205","MOVD\t[$]3074457345618258602","MUL","ROR",-"DIV"
 	// arm:"MUL","CMP\t[$]715827882",-".*udiv"
-	// ppc64:"MULLD","ROTL\t[$]63"
-	// ppc64le:"MULLD","ROTL\t[$]63"
-	evenU := n1%6 == 0
+	// ppc64x:"MULLD","ROTL\t[$]63"
+	even := n%6 == 0
 
 	// amd64:"MOVQ\t[$]-8737931403336103397","IMULQ",-"ROLQ",-"DIVQ"
 	// 386:"IMUL3L\t[$]678152731",-"ROLL",-"DIVQ"
 	// arm64:"MOVD\t[$]-8737931403336103397","MUL",-"ROR",-"DIV"
 	// arm:"MUL","CMP\t[$]226050910",-".*udiv"
-	// ppc64:"MULLD",-"ROTL"
-	// ppc64le:"MULLD",-"ROTL"
-	oddU := n1%19 == 0
+	// ppc64x:"MULLD",-"ROTL"
+	odd := n%19 == 0
 
+	return even, odd
+}
+
+func Divisible(n int) (bool, bool) {
 	// amd64:"IMULQ","ADD","ROLQ\t[$]63",-"DIVQ"
 	// 386:"IMUL3L\t[$]-1431655765","ADDL\t[$]715827882","ROLL\t[$]31",-"DIVQ"
-	// arm64:"MUL","ADD\tR","ROR",-"DIV"
+	// arm64:"MOVD\t[$]-6148914691236517205","MOVD\t[$]3074457345618258602","MUL","ADD\tR","ROR",-"DIV"
 	// arm:"MUL","ADD\t[$]715827882",-".*udiv"
-	// ppc64/power8:"MULLD","ADD","ROTL\t[$]63"
-	// ppc64le/power8:"MULLD","ADD","ROTL\t[$]63"
-	// ppc64/power9:"MADDLD","ROTL\t[$]63"
-	// ppc64le/power9:"MADDLD","ROTL\t[$]63"
-	evenS := n2%6 == 0
+	// ppc64x/power8:"MULLD","ADD","ROTL\t[$]63"
+	// ppc64x/power9:"MADDLD","ROTL\t[$]63"
+	even := n%6 == 0
 
 	// amd64:"IMULQ","ADD",-"ROLQ",-"DIVQ"
 	// 386:"IMUL3L\t[$]678152731","ADDL\t[$]113025455",-"ROLL",-"DIVQ"
 	// arm64:"MUL","MOVD\t[$]485440633518672410","ADD",-"ROR",-"DIV"
 	// arm:"MUL","ADD\t[$]113025455",-".*udiv"
-	// ppc64/power8:"MULLD","ADD",-"ROTL"
-	// ppc64/power9:"MADDLD",-"ROTL"
-	// ppc64le/power8:"MULLD","ADD",-"ROTL"
-	// ppc64le/power9:"MADDLD",-"ROTL"
-	oddS := n2%19 == 0
+	// ppc64x/power8:"MULLD","ADD",-"ROTL"
+	// ppc64x/power9:"MADDLD",-"ROTL"
+	odd := n%19 == 0
 
-	return evenU, oddU, evenS, oddS
+	return even, odd
 }
 
 // Check that fix-up code is not generated for divisions where it has been proven that
@@ -453,8 +445,7 @@
 	// amd64:"SHRQ\t[$]10"
 	// arm64:"LSR\t[$]10",-"SDIV"
 	// arm:"SRL\t[$]10",-".*udiv"
-	// ppc64:"SRD"\t[$]10"
-	// ppc64le:"SRD"\t[$]10"
+	// ppc64x:"SRD"\t[$]10"
 	return len(a) / 1024
 }
 
@@ -463,8 +454,7 @@
 	// amd64:"SHRQ\t[$]11"
 	// arm64:"LSR\t[$]11",-"SDIV"
 	// arm:"SRL\t[$]11",-".*udiv"
-	// ppc64:"SRD\t[$]11"
-	// ppc64le:"SRD\t[$]11"
+	// ppc64x:"SRD\t[$]11"
 	return len(s) / (4097 >> 1)
 }
 
@@ -474,8 +464,7 @@
 	// arm64:"AND\t[$]1023",-"SDIV"
 	// arm/6:"AND",-".*udiv"
 	// arm/7:"BFC",-".*udiv",-"AND"
-	// ppc64:"ANDCC\t[$]1023"
-	// ppc64le:"ANDCC\t[$]1023"
+	// ppc64x:"ANDCC\t[$]1023"
 	return len(a) % 1024
 }
 
@@ -485,8 +474,7 @@
 	// arm64:"AND\t[$]2047",-"SDIV"
 	// arm/6:"AND",-".*udiv"
 	// arm/7:"BFC",-".*udiv",-"AND"
-	// ppc64:"ANDCC\t[$]2047"
-	// ppc64le:"ANDCC\t[$]2047"
+	// ppc64x:"ANDCC\t[$]2047"
 	return len(s) % (4097 >> 1)
 }
 
@@ -495,8 +483,7 @@
 	// amd64:"SHRQ\t[$]12"
 	// arm64:"LSR\t[$]12",-"SDIV"
 	// arm:"SRL\t[$]12",-".*udiv"
-	// ppc64:"SRD\t[$]12"
-	// ppc64le:"SRD\t[$]12"
+	// ppc64x:"SRD\t[$]12"
 	return cap(a) / ((1 << 11) + 2048)
 }
 
@@ -506,8 +493,7 @@
 	// arm64:"AND\t[$]4095",-"SDIV"
 	// arm/6:"AND",-".*udiv"
 	// arm/7:"BFC",-".*udiv",-"AND"
-	// ppc64:"ANDCC\t[$]4095"
-	// ppc64le:"ANDCC\t[$]4095"
+	// ppc64x:"ANDCC\t[$]4095"
 	return cap(a) % ((1 << 11) + 2048)
 }
 
@@ -525,8 +511,7 @@
 	r1 := c*79 + a
 	// arm:`ADD`,-`MULA`,-`MUL\s`
 	// arm64:`ADD`,-`MADD`,-`MULW`
-	// ppc64:`ADD`,-`MULLD`
-	// ppc64le:`ADD`,-`MULLD`
+	// ppc64x:`ADD`,-`MULLD`
 	r2 := b*64 + c
 	return r0, r1, r2
 }
@@ -542,8 +527,7 @@
 	r1 := a - c*79
 	// arm/7:`SUB`,-`MULS`,-`MUL\s`
 	// arm64:`SUB`,-`MSUBW`,-`MULW`
-	// ppc64:`SUB`,-`MULLD`
-	// ppc64le:`SUB`,-`MULLD`
+	// ppc64x:`SUB`,-`MULLD`
 	r2 := c - b*64
 	return r0, r1, r2
 }
@@ -572,20 +556,16 @@
 // "(z + C) -x -> C + (z - x)" can optimize the following cases.
 func constantFold1(i0, j0, i1, j1, i2, j2, i3, j3 int) (int, int, int, int) {
 	// arm64:"SUB","ADD\t[$]2"
-	// ppc64:"SUB","ADD\t[$]2"
-	// ppc64le:"SUB","ADD\t[$]2"
+	// ppc64x:"SUB","ADD\t[$]2"
 	r0 := (i0 + 3) - (j0 + 1)
 	// arm64:"SUB","SUB\t[$]4"
-	// ppc64:"SUB","ADD\t[$]-4"
-	// ppc64le:"SUB","ADD\t[$]-4"
+	// ppc64x:"SUB","ADD\t[$]-4"
 	r1 := (i1 - 3) - (j1 + 1)
 	// arm64:"SUB","ADD\t[$]4"
-	// ppc64:"SUB","ADD\t[$]4"
-	// ppc64le:"SUB","ADD\t[$]4"
+	// ppc64x:"SUB","ADD\t[$]4"
 	r2 := (i2 + 3) - (j2 - 1)
 	// arm64:"SUB","SUB\t[$]2"
-	// ppc64:"SUB","ADD\t[$]-2"
-	// ppc64le:"SUB","ADD\t[$]-2"
+	// ppc64x:"SUB","ADD\t[$]-2"
 	r3 := (i3 - 3) - (j3 - 1)
 	return r0, r1, r2, r3
 }
@@ -594,20 +574,17 @@
 // "(C - z) - x -> C - (z + x)" can optimize the following cases.
 func constantFold2(i0, j0, i1, j1 int) (int, int) {
 	// arm64:"ADD","MOVD\t[$]2","SUB"
-	// ppc64le: `SUBC\tR[0-9]+,\s[$]2,\sR`
-	// ppc64: `SUBC\tR[0-9]+,\s[$]2,\sR`
+	// ppc64x: `SUBC\tR[0-9]+,\s[$]2,\sR`
 	r0 := (3 - i0) - (j0 + 1)
 	// arm64:"ADD","MOVD\t[$]4","SUB"
-	// ppc64le: `SUBC\tR[0-9]+,\s[$]4,\sR`
-	// ppc64: `SUBC\tR[0-9]+,\s[$]4,\sR`
+	// ppc64x: `SUBC\tR[0-9]+,\s[$]4,\sR`
 	r1 := (3 - i1) - (j1 - 1)
 	return r0, r1
 }
 
 func constantFold3(i, j int) int {
 	// arm64: "MOVD\t[$]30","MUL",-"ADD",-"LSL"
-	// ppc64:"MULLD\t[$]30","MULLD"
-	// ppc64le:"MULLD\t[$]30","MULLD"
+	// ppc64x:"MULLD\t[$]30","MULLD"
 	r := (5 * i) * (6 * j)
 	return r
 }
diff --git a/test/codegen/bits.go b/test/codegen/bits.go
index 4f70627..018f5b9 100644
--- a/test/codegen/bits.go
+++ b/test/codegen/bits.go
@@ -374,3 +374,23 @@
 	// arm64: "MOVD\t[$]19088744",-"ADD\t[$]19088744"
 	return a + 0x1234568
 }
+
+// Verify sign-extended values are not zero-extended under a bit mask (#61297)
+func signextendAndMask8to64(a int8) (s, z uint64) {
+	// ppc64x: "MOVB", "ANDCC\t[$]1015,"
+	s = uint64(a) & 0x3F7
+	// ppc64x: -"MOVB", "ANDCC\t[$]247,"
+	z = uint64(uint8(a)) & 0x3F7
+	return
+
+}
+
+// Verify zero-extended values are not sign-extended under a bit mask (#61297)
+func zeroextendAndMask8to64(a int8, b int16) (x, y uint64) {
+	// ppc64x: -"MOVB\t", -"ANDCC", "MOVBZ"
+	x = uint64(a) & 0xFF
+	// ppc64x: -"MOVH\t", -"ANDCC", "MOVHZ"
+	y = uint64(b) & 0xFFFF
+	return
+
+}
diff --git a/test/codegen/bmi.go b/test/codegen/bmi.go
index 3b125a1..aa61b03 100644
--- a/test/codegen/bmi.go
+++ b/test/codegen/bmi.go
@@ -46,6 +46,110 @@
 	return x & (x - 1)
 }
 
+func isPowerOfTwo64(x int64) bool {
+	// amd64/v3:"BLSRQ",-"TESTQ",-"CALL"
+	return blsr64(x) == 0
+}
+
+func isPowerOfTwo32(x int32) bool {
+	// amd64/v3:"BLSRL",-"TESTL",-"CALL"
+	return blsr32(x) == 0
+}
+
+func isPowerOfTwoSelect64(x, a, b int64) int64 {
+	var r int64
+	// amd64/v3:"BLSRQ",-"TESTQ",-"CALL"
+	if isPowerOfTwo64(x) {
+		r = a
+	} else {
+		r = b
+	}
+	// amd64/v3:"CMOVQEQ",-"TESTQ",-"CALL"
+	return r * 2 // force return blocks joining
+}
+
+func isPowerOfTwoSelect32(x, a, b int32) int32 {
+	var r int32
+	// amd64/v3:"BLSRL",-"TESTL",-"CALL"
+	if isPowerOfTwo32(x) {
+		r = a
+	} else {
+		r = b
+	}
+	// amd64/v3:"CMOVLEQ",-"TESTL",-"CALL"
+	return r * 2 // force return blocks joining
+}
+
+func isPowerOfTwoBranch64(x int64, a func(bool), b func(string)) {
+	// amd64/v3:"BLSRQ",-"TESTQ",-"CALL"
+	if isPowerOfTwo64(x) {
+		a(true)
+	} else {
+		b("false")
+	}
+}
+
+func isPowerOfTwoBranch32(x int32, a func(bool), b func(string)) {
+	// amd64/v3:"BLSRL",-"TESTL",-"CALL"
+	if isPowerOfTwo32(x) {
+		a(true)
+	} else {
+		b("false")
+	}
+}
+
+func isNotPowerOfTwo64(x int64) bool {
+	// amd64/v3:"BLSRQ",-"TESTQ",-"CALL"
+	return blsr64(x) != 0
+}
+
+func isNotPowerOfTwo32(x int32) bool {
+	// amd64/v3:"BLSRL",-"TESTL",-"CALL"
+	return blsr32(x) != 0
+}
+
+func isNotPowerOfTwoSelect64(x, a, b int64) int64 {
+	var r int64
+	// amd64/v3:"BLSRQ",-"TESTQ",-"CALL"
+	if isNotPowerOfTwo64(x) {
+		r = a
+	} else {
+		r = b
+	}
+	// amd64/v3:"CMOVQNE",-"TESTQ",-"CALL"
+	return r * 2 // force return blocks joining
+}
+
+func isNotPowerOfTwoSelect32(x, a, b int32) int32 {
+	var r int32
+	// amd64/v3:"BLSRL",-"TESTL",-"CALL"
+	if isNotPowerOfTwo32(x) {
+		r = a
+	} else {
+		r = b
+	}
+	// amd64/v3:"CMOVLNE",-"TESTL",-"CALL"
+	return r * 2 // force return blocks joining
+}
+
+func isNotPowerOfTwoBranch64(x int64, a func(bool), b func(string)) {
+	// amd64/v3:"BLSRQ",-"TESTQ",-"CALL"
+	if isNotPowerOfTwo64(x) {
+		a(true)
+	} else {
+		b("false")
+	}
+}
+
+func isNotPowerOfTwoBranch32(x int32, a func(bool), b func(string)) {
+	// amd64/v3:"BLSRL",-"TESTL",-"CALL"
+	if isNotPowerOfTwo32(x) {
+		a(true)
+	} else {
+		b("false")
+	}
+}
+
 func sarx64(x, y int64) int64 {
 	// amd64/v3:"SARXQ"
 	return x >> y
diff --git a/test/codegen/bool.go b/test/codegen/bool.go
index d921b55..faf7033 100644
--- a/test/codegen/bool.go
+++ b/test/codegen/bool.go
@@ -10,64 +10,204 @@
 
 func convertNeq0B(x uint8, c bool) bool {
 	// amd64:"ANDL\t[$]1",-"SETNE"
-	// ppc64:"ANDCC",-"CMPW",-"ISEL"
-	// ppc64le:"ANDCC",-"CMPW",-"ISEL"
-	// ppc64le/power9:"ANDCC",-"CMPW",-"ISEL"
+	// ppc64x:"ANDCC",-"CMPW",-"ISEL"
 	b := x&1 != 0
 	return c && b
 }
 
 func convertNeq0W(x uint16, c bool) bool {
 	// amd64:"ANDL\t[$]1",-"SETNE"
-	// ppc64:"ANDCC",-"CMPW",-"ISEL"
-	// ppc64le:"ANDCC",-"CMPW",-"ISEL"
-	// ppc64le/power9:"ANDCC",-CMPW",-"ISEL"
+	// ppc64x:"ANDCC",-"CMPW",-"ISEL"
 	b := x&1 != 0
 	return c && b
 }
 
 func convertNeq0L(x uint32, c bool) bool {
 	// amd64:"ANDL\t[$]1",-"SETB"
-	// ppc64:"ANDCC",-"CMPW",-"ISEL"
-	// ppc64le:"ANDCC",-"CMPW",-"ISEL"
-	// ppc64le/power9:"ANDCC",-"CMPW",-"ISEL"
+	// ppc64x:"ANDCC",-"CMPW",-"ISEL"
 	b := x&1 != 0
 	return c && b
 }
 
 func convertNeq0Q(x uint64, c bool) bool {
 	// amd64:"ANDL\t[$]1",-"SETB"
-	// ppc64:"ANDCC",-"CMP",-"ISEL"
-	// ppc64le:"ANDCC",-"CMP",-"ISEL"
-	// ppc64le/power9:"ANDCC",-"CMP",-"ISEL"
+	// ppc64x:"ANDCC",-"CMP",-"ISEL"
 	b := x&1 != 0
 	return c && b
 }
 
 func convertNeqBool32(x uint32) bool {
-        // ppc64:"ANDCC",-"CMPW",-"ISEL"
-        // ppc64le:"ANDCC",-"CMPW",-"ISEL"
-        // ppc64le/power9:"ANDCC",-"CMPW",-"ISEL"
-        return x&1 != 0
+	// ppc64x:"ANDCC",-"CMPW",-"ISEL"
+	return x&1 != 0
 }
 
 func convertEqBool32(x uint32) bool {
-        // ppc64:"ANDCC",-"CMPW","XOR",-"ISEL"
-        // ppc64le:"ANDCC",-"CMPW","XOR",-"ISEL"
-        // ppc64le/power9:"ANDCC","XOR",-"CMPW",-"ISEL"
-        return x&1 == 0
+	// ppc64x:"ANDCC",-"CMPW","XOR",-"ISEL"
+	return x&1 == 0
 }
 
 func convertNeqBool64(x uint64) bool {
-        // ppc64:"ANDCC",-"CMP",-"ISEL"
-        // ppc64le:"ANDCC",-"CMP",-"ISEL"
-        // ppc64le/power9:"ANDCC",-"CMP",-"ISEL"
-        return x&1 != 0
+	// ppc64x:"ANDCC",-"CMP",-"ISEL"
+	return x&1 != 0
 }
 
 func convertEqBool64(x uint64) bool {
-        // ppc64:"ANDCC","XOR",-"CMP",-"ISEL"
-        // ppc64le:"ANDCC","XOR",-"CMP",-"ISEL"
-        // ppc64le/power9:"ANDCC","XOR",-"CMP",-"ISEL"
-        return x&1 == 0
+	// ppc64x:"ANDCC","XOR",-"CMP",-"ISEL"
+	return x&1 == 0
+}
+
+func TestSetEq64(x uint64, y uint64) bool {
+	// ppc64x/power10:"SETBC\tCR0EQ",-"ISEL"
+	// ppc64x/power9:"CMP","ISEL",-"SETBC\tCR0EQ"
+	// ppc64x/power8:"CMP","ISEL",-"SETBC\tCR0EQ"
+	b := x == y
+	return b
+}
+func TestSetNeq64(x uint64, y uint64) bool {
+	// ppc64x/power10:"SETBCR\tCR0EQ",-"ISEL"
+	// ppc64x/power9:"CMP","ISEL",-"SETBCR\tCR0EQ"
+	// ppc64x/power8:"CMP","ISEL",-"SETBCR\tCR0EQ"
+	b := x != y
+	return b
+}
+func TestSetLt64(x uint64, y uint64) bool {
+	// ppc64x/power10:"SETBC\tCR0GT",-"ISEL"
+	// ppc64x/power9:"CMP","ISEL",-"SETBC\tCR0GT"
+	// ppc64x/power8:"CMP","ISEL",-"SETBC\tCR0GT"
+	b := x < y
+	return b
+}
+func TestSetLe64(x uint64, y uint64) bool {
+	// ppc64x/power10:"SETBCR\tCR0LT",-"ISEL"
+	// ppc64x/power9:"CMP","ISEL",-"SETBCR\tCR0LT"
+	// ppc64x/power8:"CMP","ISEL",-"SETBCR\tCR0LT"
+	b := x <= y
+	return b
+}
+func TestSetGt64(x uint64, y uint64) bool {
+	// ppc64x/power10:"SETBC\tCR0LT",-"ISEL"
+	// ppc64x/power9:"CMP","ISEL",-"SETBC\tCR0LT"
+	// ppc64x/power8:"CMP","ISEL",-"SETBC\tCR0LT"
+	b := x > y
+	return b
+}
+func TestSetGe64(x uint64, y uint64) bool {
+	// ppc64x/power10:"SETBCR\tCR0GT",-"ISEL"
+	// ppc64x/power9:"CMP","ISEL",-"SETBCR\tCR0GT"
+	// ppc64x/power8:"CMP","ISEL",-"SETBCR\tCR0GT"
+	b := x >= y
+	return b
+}
+func TestSetLtFp64(x float64, y float64) bool {
+	// ppc64x/power10:"SETBC\tCR0LT",-"ISEL"
+	// ppc64x/power9:"FCMP","ISEL",-"SETBC\tCR0LT"
+	// ppc64x/power8:"FCMP","ISEL",-"SETBC\tCR0LT"
+	b := x < y
+	return b
+}
+func TestSetLeFp64(x float64, y float64) bool {
+	// ppc64x/power10:"SETBC\tCR0LT","SETBC\tCR0EQ","OR",-"ISEL",-"ISEL"
+	// ppc64x/power9:"ISEL","ISEL",-"SETBC\tCR0LT",-"SETBC\tCR0EQ","OR"
+	// ppc64x/power8:"ISEL","ISEL",-"SETBC\tCR0LT",-"SETBC\tCR0EQ","OR"
+	b := x <= y
+	return b
+}
+func TestSetGtFp64(x float64, y float64) bool {
+	// ppc64x/power10:"SETBC\tCR0LT",-"ISEL"
+	// ppc64x/power9:"FCMP","ISEL",-"SETBC\tCR0LT"
+	// ppc64x/power8:"FCMP","ISEL",-"SETBC\tCR0LT"
+	b := x > y
+	return b
+}
+func TestSetGeFp64(x float64, y float64) bool {
+	// ppc64x/power10:"SETBC\tCR0LT","SETBC\tCR0EQ","OR",-"ISEL",-"ISEL"
+	// ppc64x/power9:"ISEL","ISEL",-"SETBC\tCR0LT",-"SETBC\tCR0EQ","OR"
+	// ppc64x/power8:"ISEL","ISEL",-"SETBC\tCR0LT",-"SETBC\tCR0EQ","OR"
+	b := x >= y
+	return b
+}
+func TestSetInvEq64(x uint64, y uint64) bool {
+	// ppc64x/power10:"SETBCR\tCR0EQ",-"ISEL"
+	// ppc64x/power9:"CMP","ISEL",-"SETBCR\tCR0EQ"
+	// ppc64x/power8:"CMP","ISEL",-"SETBCR\tCR0EQ"
+	b := !(x == y)
+	return b
+}
+func TestSetInvNeq64(x uint64, y uint64) bool {
+	// ppc64x/power10:"SETBC\tCR0EQ",-"ISEL"
+	// ppc64x/power9:"CMP","ISEL",-"SETBC\tCR0EQ"
+	// ppc64x/power8:"CMP","ISEL",-"SETBC\tCR0EQ"
+	b := !(x != y)
+	return b
+}
+func TestSetInvLt64(x uint64, y uint64) bool {
+	// ppc64x/power10:"SETBCR\tCR0GT",-"ISEL"
+	// ppc64x/power9:"CMP","ISEL",-"SETBCR\tCR0GT"
+	// ppc64x/power8:"CMP","ISEL",-"SETBCR\tCR0GT"
+	b := !(x < y)
+	return b
+}
+func TestSetInvLe64(x uint64, y uint64) bool {
+	// ppc64x/power10:"SETBC\tCR0LT",-"ISEL"
+	// ppc64x/power9:"CMP","ISEL",-"SETBC\tCR0LT"
+	// ppc64x/power8:"CMP","ISEL",-"SETBC\tCR0LT"
+	b := !(x <= y)
+	return b
+}
+func TestSetInvGt64(x uint64, y uint64) bool {
+	// ppc64x/power10:"SETBCR\tCR0LT",-"ISEL"
+	// ppc64x/power9:"CMP","ISEL",-"SETBCR\tCR0LT"
+	// ppc64x/power8:"CMP","ISEL",-"SETBCR\tCR0LT"
+	b := !(x > y)
+	return b
+}
+func TestSetInvGe64(x uint64, y uint64) bool {
+	// ppc64x/power10:"SETBC\tCR0GT",-"ISEL"
+	// ppc64x/power9:"CMP","ISEL",-"SETBC\tCR0GT"
+	// ppc64x/power8:"CMP","ISEL",-"SETBC\tCR0GT"
+	b := !(x >= y)
+	return b
+}
+
+func TestSetInvEqFp64(x float64, y float64) bool {
+	// ppc64x/power10:"SETBCR\tCR0EQ",-"ISEL"
+	// ppc64x/power9:"FCMP","ISEL",-"SETBCR\tCR0EQ"
+	// ppc64x/power8:"FCMP","ISEL",-"SETBCR\tCR0EQ"
+	b := !(x == y)
+	return b
+}
+func TestSetInvNeqFp64(x float64, y float64) bool {
+	// ppc64x/power10:"SETBC\tCR0EQ",-"ISEL"
+	// ppc64x/power9:"FCMP","ISEL",-"SETBC\tCR0EQ"
+	// ppc64x/power8:"FCMP","ISEL",-"SETBC\tCR0EQ"
+	b := !(x != y)
+	return b
+}
+func TestSetInvLtFp64(x float64, y float64) bool {
+	// ppc64x/power10:"SETBCR\tCR0LT",-"ISEL"
+	// ppc64x/power9:"FCMP","ISEL",-"SETBCR\tCR0LT"
+	// ppc64x/power8:"FCMP","ISEL",-"SETBCR\tCR0LT"
+	b := !(x < y)
+	return b
+}
+func TestSetInvLeFp64(x float64, y float64) bool {
+	// ppc64x/power10:"SETBC\tCR0LT",-"ISEL"
+	// ppc64x/power9:"FCMP","ISEL",-"SETBC\tCR0LT"
+	// ppc64x/power8:"FCMP","ISEL",-"SETBC\tCR0LT"
+	b := !(x <= y)
+	return b
+}
+func TestSetInvGtFp64(x float64, y float64) bool {
+	// ppc64x/power10:"SETBCR\tCR0LT",-"ISEL"
+	// ppc64x/power9:"FCMP","ISEL",-"SETBCR\tCR0LT"
+	// ppc64x/power8:"FCMP","ISEL",-"SETBCR\tCR0LT"
+	b := !(x > y)
+	return b
+}
+func TestSetInvGeFp64(x float64, y float64) bool {
+	// ppc64x/power10:"SETBC\tCR0LT",-"ISEL"
+	// ppc64x/power9:"FCMP","ISEL",-"SETBC\tCR0LT"
+	// ppc64x/power8:"FCMP","ISEL",-"SETBC\tCR0LT"
+	b := !(x >= y)
+	return b
 }
diff --git a/test/codegen/compare_and_branch.go b/test/codegen/compare_and_branch.go
index f751506..b3feef0 100644
--- a/test/codegen/compare_and_branch.go
+++ b/test/codegen/compare_and_branch.go
@@ -204,3 +204,39 @@
 		dummy()
 	}
 }
+
+// Signed 64-bit comparison with 1/-1 to comparison with 0.
+func si64x0(x chan int64) {
+	// riscv64:"BGTZ"
+	for <-x >= 1 {
+		dummy()
+	}
+
+	// riscv64:"BLEZ"
+	for <-x < 1 {
+		dummy()
+	}
+
+	// riscv64:"BLTZ"
+	for <-x <= -1 {
+		dummy()
+	}
+
+	// riscv64:"BGEZ"
+	for <-x > -1 {
+		dummy()
+	}
+}
+
+// Unsigned 64-bit comparison with 1 to comparison with 0.
+func ui64x0(x chan uint64) {
+	// riscv64:"BNEZ"
+	for <-x >= 1 {
+		dummy()
+	}
+
+	// riscv64:"BEQZ"
+	for <-x < 1 {
+		dummy()
+	}
+}
diff --git a/test/codegen/comparisons.go b/test/codegen/comparisons.go
index 5a54a96..071b68f 100644
--- a/test/codegen/comparisons.go
+++ b/test/codegen/comparisons.go
@@ -36,8 +36,7 @@
 func CompareString3(s string) bool {
 	// amd64:`CMPQ\t\(.*\), [A-Z]`
 	// arm64:-`CMPW\t`
-	// ppc64:-`CMPW\t`
-	// ppc64le:-`CMPW\t`
+	// ppc64x:-`CMPW\t`
 	// s390x:-`CMPW\t`
 	return s == "xxxxxxxx"
 }
@@ -235,6 +234,8 @@
 	c7 := e&(f<<3) < 0
 	// arm64:`CMN\sR[0-9]+<<3,\sR[0-9]+`
 	c8 := e+(f<<3) < 0
+	// arm64:`TST\sR[0-9],\sR[0-9]+`
+	c9 := e&(-19) < 0
 	if c0 {
 		return 1
 	} else if c1 {
@@ -253,6 +254,8 @@
 		return 9
 	} else if c8 {
 		return 10
+	} else if c9 {
+		return 11
 	} else if deOptC0 {
 		return b + d
 	} else if deOptC1 {
@@ -264,35 +267,30 @@
 
 func CmpLogicalToZero(a, b, c uint32, d, e uint64) uint64 {
 
-	// ppc64:"ANDCC",-"CMPW"
-	// ppc64le:"ANDCC",-"CMPW"
+	// ppc64x:"ANDCC",-"CMPW"
 	// wasm:"I64Eqz",-"I32Eqz",-"I64ExtendI32U",-"I32WrapI64"
 	if a&63 == 0 {
 		return 1
 	}
 
-	// ppc64:"ANDCC",-"CMP"
-	// ppc64le:"ANDCC",-"CMP"
+	// ppc64x:"ANDCC",-"CMP"
 	// wasm:"I64Eqz",-"I32Eqz",-"I64ExtendI32U",-"I32WrapI64"
 	if d&255 == 0 {
 		return 1
 	}
 
-	// ppc64:"ANDCC",-"CMP"
-	// ppc64le:"ANDCC",-"CMP"
+	// ppc64x:"ANDCC",-"CMP"
 	// wasm:"I64Eqz",-"I32Eqz",-"I64ExtendI32U",-"I32WrapI64"
 	if d&e == 0 {
 		return 1
 	}
-	// ppc64:"ORCC",-"CMP"
-	// ppc64le:"ORCC",-"CMP"
+	// ppc64x:"ORCC",-"CMP"
 	// wasm:"I64Eqz",-"I32Eqz",-"I64ExtendI32U",-"I32WrapI64"
 	if d|e == 0 {
 		return 1
 	}
 
-	// ppc64:"XORCC",-"CMP"
-	// ppc64le:"XORCC",-"CMP"
+	// ppc64x:"XORCC",-"CMP"
 	// wasm:"I64Eqz","I32Eqz",-"I64ExtendI32U",-"I32WrapI64"
 	if e^d == 0 {
 		return 1
@@ -458,6 +456,7 @@
 	}
 	return 0
 }
+
 func UintLtZero(a uint8, b uint16, c uint32, d uint64) int {
 	// amd64: -`(TESTB|TESTW|TESTL|TESTQ|JCC|JCS)`
 	// arm64: -`(CMPW|CMP|BHS|BLO)`
@@ -595,8 +594,7 @@
 	b := string("Z")
 	// amd64:-".*memequal"
 	// arm64:-".*memequal"
-	// ppc64:-".*memequal"
-	// ppc64le:-".*memequal"
+	// ppc64x:-".*memequal"
 	return a == b
 }
 
@@ -604,8 +602,7 @@
 	b := string("Z")
 	// amd64:-".*memequal"
 	// arm64:-".*memequal"
-	// ppc64:-".*memequal"
-	// ppc64le:-".*memequal"
+	// ppc64x:-".*memequal"
 	return a[:1] == b
 }
 
@@ -614,8 +611,7 @@
 	b := string("ZZ")
 	// amd64:-".*memequal"
 	// arm64:-".*memequal"
-	// ppc64:-".*memequal"
-	// ppc64le:-".*memequal"
+	// ppc64x:-".*memequal"
 	return a == b
 }
 
@@ -623,8 +619,7 @@
 	b := string("ZZ")
 	// amd64:-".*memequal"
 	// arm64:-".*memequal"
-	// ppc64:-".*memequal"
-	// ppc64le:-".*memequal"
+	// ppc64x:-".*memequal"
 	return a[:2] == b
 }
 
@@ -633,8 +628,7 @@
 	b := string("ZZZZ")
 	// amd64:-".*memequal"
 	// arm64:-".*memequal"
-	// ppc64:-".*memequal"
-	// ppc64le:-".*memequal"
+	// ppc64x:-".*memequal"
 	return a == b
 }
 
@@ -642,8 +636,7 @@
 	b := string("ZZZZ")
 	// amd64:-".*memequal"
 	// arm64:-".*memequal"
-	// ppc64:-".*memequal"
-	// ppc64le:-".*memequal"
+	// ppc64x:-".*memequal"
 	return a[:4] == b
 }
 
@@ -652,8 +645,7 @@
 	b := string("ZZZZZZZZ")
 	// amd64:-".*memequal"
 	// arm64:-".*memequal"
-	// ppc64:-".*memequal"
-	// ppc64le:-".*memequal"
+	// ppc64x:-".*memequal"
 	return a == b
 }
 
@@ -661,8 +653,7 @@
 	b := string("ZZZZZZZZ")
 	// amd64:-".*memequal"
 	// arm64:-".*memequal"
-	// ppc64:-".*memequal"
-	// ppc64le:-".*memequal"
+	// ppc64x:-".*memequal"
 	return a[:8] == b
 }
 
@@ -714,3 +705,86 @@
 	}
 	return c1 + c2 + c3 + c4 + c5 + c6 + c7 + c8 + c9 + c10 + c11
 }
+
+func cmpToCmnLessThan(a, b, c, d int) int {
+	var c1, c2, c3, c4 int
+	// arm64:`CMN`,`CSET\tMI`,-`CMP`
+	if a+1 < 0 {
+		c1 = 1
+	}
+	// arm64:`CMN`,`CSET\tMI`,-`CMP`
+	if a+b < 0 {
+		c2 = 1
+	}
+	// arm64:`CMN`,`CSET\tMI`,-`CMP`
+	if a*b+c < 0 {
+		c3 = 1
+	}
+	// arm64:`CMP`,`CSET\tMI`,-`CMN`
+	if a-b*c < 0 {
+		c4 = 1
+	}
+	return c1 + c2 + c3 + c4
+}
+
+func cmpToCmnGreaterThanEqual(a, b, c, d int) int {
+	var c1, c2, c3, c4 int
+	// arm64:`CMN`,`CSET\tPL`,-`CMP`
+	if a+1 >= 0 {
+		c1 = 1
+	}
+	// arm64:`CMN`,`CSET\tPL`,-`CMP`
+	if a+b >= 0 {
+		c2 = 1
+	}
+	// arm64:`CMN`,`CSET\tPL`,-`CMP`
+	if a*b+c >= 0 {
+		c3 = 1
+	}
+	// arm64:`CMP`,`CSET\tPL`,-`CMN`
+	if a-b*c >= 0 {
+		c4 = 1
+	}
+	return c1 + c2 + c3 + c4
+}
+
+func cmp1(val string) bool {
+	var z string
+	// amd64:-".*memequal"
+	return z == val
+}
+
+func cmp2(val string) bool {
+	var z string
+	// amd64:-".*memequal"
+	return val == z
+}
+
+func cmp3(val string) bool {
+	z := "food"
+	// amd64:-".*memequal"
+	return z == val
+}
+
+func cmp4(val string) bool {
+	z := "food"
+	// amd64:-".*memequal"
+	return val == z
+}
+
+func cmp5[T comparable](val T) bool {
+	var z T
+	// amd64:-".*memequal"
+	return z == val
+}
+
+func cmp6[T comparable](val T) bool {
+	var z T
+	// amd64:-".*memequal"
+	return val == z
+}
+
+func cmp7() {
+	cmp5[string]("") // force instantiation
+	cmp6[string]("") // force instantiation
+}
diff --git a/test/codegen/condmove.go b/test/codegen/condmove.go
index 7b0f32e..6c08116 100644
--- a/test/codegen/condmove.go
+++ b/test/codegen/condmove.go
@@ -13,8 +13,7 @@
 	}
 	// amd64:"CMOVQLT"
 	// arm64:"CSEL\tLT"
-	// ppc64:"ISEL\t[$]0"
-	// ppc64le:"ISEL\t[$]0"
+	// ppc64x:"ISEL\t[$]0"
 	// wasm:"Select"
 	return x
 }
@@ -25,8 +24,7 @@
 	}
 	// amd64:"CMOVQNE"
 	// arm64:"CSEL\tNE"
-	// ppc64:"ISEL\t[$]2"
-	// ppc64le:"ISEL\t[$]2"
+	// ppc64x:"ISEL\t[$]2"
 	// wasm:"Select"
 	return x
 }
@@ -37,8 +35,7 @@
 	}
 	// amd64:"CMOVQ(HI|CS)"
 	// arm64:"CSNEG\tLS"
-	// ppc64:"ISEL\t[$]1"
-	// ppc64le:"ISEL\t[$]1"
+	// ppc64x:"ISEL\t[$]1"
 	// wasm:"Select"
 	return x
 }
@@ -49,8 +46,7 @@
 	}
 	// amd64:"CMOVL(HI|CS)"
 	// arm64:"CSNEG\t(LS|HS)"
-	// ppc64:"ISEL\t[$]1"
-	// ppc64le:"ISEL\t[$]1"
+	// ppc64x:"ISEL\t[$]1"
 	// wasm:"Select"
 	return x
 }
@@ -61,8 +57,7 @@
 	}
 	// amd64:"CMOVW(HI|CS)"
 	// arm64:"CSNEG\t(LS|HS)"
-	// ppc64:"ISEL\t[$]0"
-	// ppc64le:"ISEL\t[$]0"
+	// ppc64x:"ISEL\t[$]0"
 	// wasm:"Select"
 	return x
 }
@@ -76,8 +71,7 @@
 	}
 	// amd64:"CMOVQNE","CMOVQPC"
 	// arm64:"CSEL\tEQ"
-	// ppc64:"ISEL\t[$]2"
-	// ppc64le:"ISEL\t[$]2"
+	// ppc64x:"ISEL\t[$]2"
 	// wasm:"Select"
 	return a
 }
@@ -89,8 +83,7 @@
 	}
 	// amd64:"CMOVQNE","CMOVQPS"
 	// arm64:"CSEL\tNE"
-	// ppc64:"ISEL\t[$]2"
-	// ppc64le:"ISEL\t[$]2"
+	// ppc64x:"ISEL\t[$]2"
 	// wasm:"Select"
 	return a
 }
@@ -117,8 +110,7 @@
 		}
 		// amd64:"CMOVQHI"
 		// arm64:"CSEL\tMI"
-		// ppc64:"ISEL\t[$]0"
-		// ppc64le:"ISEL\t[$]0"
+		// ppc64x:"ISEL\t[$]0"
 		// wasm:"Select"
 		r = r - ldexp(y, rexp-yexp)
 	}
@@ -133,8 +125,7 @@
 	}
 	// amd64:"CMOVQNE"
 	// arm64:"CSEL\tNE"
-	// ppc64:"ISEL\t[$]2"
-	// ppc64le:"ISEL\t[$]2"
+	// ppc64x:"ISEL\t[$]2"
 	// wasm:"Select"
 	return y
 }
@@ -146,13 +137,12 @@
 	}
 	// amd64:"CMOVQEQ"
 	// arm64:"CSEL\tEQ"
-	// ppc64:"ISEL\t[$]2"
-	// ppc64le:"ISEL\t[$]2"
+	// ppc64x:"ISEL\t[$]2"
 	// wasm:"Select"
 	return a
 }
 
-// Floating point CMOVs are not supported by amd64/arm64/ppc64/ppc64le
+// Floating point CMOVs are not supported by amd64/arm64/ppc64x
 func cmovfloatmove(x, y int) float64 {
 	a := 1.0
 	if x <= y {
@@ -160,8 +150,7 @@
 	}
 	// amd64:-"CMOV"
 	// arm64:-"CSEL"
-	// ppc64:-"ISEL"
-	// ppc64le:-"ISEL"
+	// ppc64x:-"ISEL"
 	// wasm:-"Select"
 	return a
 }
@@ -450,8 +439,7 @@
 	if a == b {
 		x = a
 	}
-	// ppc64:"ISEL\t[$]2, R[0-9]+, R0, R[0-9]+"
-	// ppc64le:"ISEL\t[$]2, R[0-9]+, R0, R[0-9]+"
+	// ppc64x:"ISEL\t[$]2, R[0-9]+, R0, R[0-9]+"
 	return x
 }
 
@@ -460,7 +448,6 @@
 	if a == b {
 		x = 0
 	}
-	// ppc64:"ISEL\t[$]2, R0, R[0-9]+, R[0-9]+"
-	// ppc64le:"ISEL\t[$]2, R0, R[0-9]+, R[0-9]+"
+	// ppc64x:"ISEL\t[$]2, R0, R[0-9]+, R[0-9]+"
 	return x
 }
diff --git a/test/codegen/copy.go b/test/codegen/copy.go
index 9b3bf75..4c4c857 100644
--- a/test/codegen/copy.go
+++ b/test/codegen/copy.go
@@ -16,8 +16,7 @@
 	// amd64:-".*memmove"
 	// arm:-".*memmove"
 	// arm64:-".*memmove"
-	// ppc64:-".*memmove"
-	// ppc64le:-".*memmove"
+	// ppc64x:-".*memmove"
 	copy(x[1:], x[:])
 }
 
@@ -26,16 +25,14 @@
 	// 386:-".*memmove"
 	// amd64:-".*memmove"
 	// arm64:-".*memmove"
-	// ppc64:-".*memmove"
-	// ppc64le:-".*memmove"
+	// ppc64x:-".*memmove"
 	copy(x[1:], x[:])
 }
 
 func movesmall16() {
 	x := [...]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}
 	// amd64:-".*memmove"
-	// ppc64:".*memmove"
-	// ppc64le:".*memmove"
+	// ppc64x:".*memmove"
 	copy(x[1:], x[:])
 }
 
@@ -45,20 +42,18 @@
 
 func moveDisjointStack32() {
 	var s [32]byte
-	// ppc64:-".*memmove"
-	// ppc64le:-".*memmove"
-	// ppc64le/power8:"LXVD2X",-"ADD",-"BC"
-	// ppc64le/power9:"LXV",-"LXVD2X",-"ADD",-"BC"
+	// ppc64x:-".*memmove"
+	// ppc64x/power8:"LXVD2X",-"ADD",-"BC"
+	// ppc64x/power9:"LXV",-"LXVD2X",-"ADD",-"BC"
 	copy(s[:], x[:32])
 	runtime.KeepAlive(&s)
 }
 
 func moveDisjointStack64() {
 	var s [96]byte
-	// ppc64:-".*memmove"
-	// ppc64le:-".*memmove"
-	// ppc64le/power8:"LXVD2X","ADD","BC"
-	// ppc64le/power9:"LXV",-"LXVD2X",-"ADD",-"BC"
+	// ppc64x:-".*memmove"
+	// ppc64x/power8:"LXVD2X","ADD","BC"
+	// ppc64x/power9:"LXV",-"LXVD2X",-"ADD",-"BC"
 	copy(s[:], x[:96])
 	runtime.KeepAlive(&s)
 }
@@ -67,10 +62,9 @@
 	var s [256]byte
 	// s390x:-".*memmove"
 	// amd64:-".*memmove"
-	// ppc64:-".*memmove"
-	// ppc64le:-".*memmove"
-	// ppc64le/power8:"LXVD2X"
-	// ppc64le/power9:"LXV",-"LXVD2X"
+	// ppc64x:-".*memmove"
+	// ppc64x/power8:"LXVD2X"
+	// ppc64x/power9:"LXV",-"LXVD2X"
 	copy(s[:], x[:])
 	runtime.KeepAlive(&s)
 }
@@ -79,10 +73,9 @@
 	var s [256]byte
 	// s390x:-".*memmove"
 	// amd64:-".*memmove"
-	// ppc64:-".*memmove"
-	// ppc64le:-".*memmove"
-	// ppc64le/power8:"LXVD2X"
-	// ppc64le/power9:"LXV",-"LXVD2X"
+	// ppc64x:-".*memmove"
+	// ppc64x/power8:"LXVD2X"
+	// ppc64x/power9:"LXV",-"LXVD2X"
 	copy(s[:], b[:])
 	runtime.KeepAlive(&s)
 }
@@ -90,10 +83,9 @@
 func moveDisjointNoOverlap(a *[256]byte) {
 	// s390x:-".*memmove"
 	// amd64:-".*memmove"
-	// ppc64:-".*memmove"
-	// ppc64le:-".*memmove"
-	// ppc64le/power8:"LXVD2X"
-	// ppc64le/power9:"LXV",-"LXVD2X"
+	// ppc64x:-".*memmove"
+	// ppc64x/power8:"LXVD2X"
+	// ppc64x/power9:"LXV",-"LXVD2X"
 	copy(a[:], a[128:])
 }
 
@@ -103,8 +95,7 @@
 	_ = b[1]
 	// amd64:-".*memmove"
 	// arm64:-".*memmove"
-	// ppc64:-".*memmove"
-	// ppc64le:-".*memmove"
+	// ppc64x:-".*memmove"
 	copy(b, x[:])
 }
 
@@ -112,8 +103,7 @@
 	_ = b[2]
 	// amd64:-".*memmove"
 	// arm64:-".*memmove"
-	// ppc64:-".*memmove"
-	// ppc64le:-".*memmove"
+	// ppc64x:-".*memmove"
 	copy(b, x[:])
 }
 
@@ -121,8 +111,7 @@
 	_ = b[4]
 	// amd64:-".*memmove"
 	// arm64:-".*memmove"
-	// ppc64:-".*memmove"
-	// ppc64le:-".*memmove"
+	// ppc64x:-".*memmove"
 	copy(b, x[:])
 }
 
@@ -130,8 +119,7 @@
 	_ = b[8]
 	// amd64:-".*memmove"
 	// arm64:-".*memmove"
-	// ppc64:-".*memmove"
-	// ppc64le:-".*memmove"
+	// ppc64x:-".*memmove"
 	copy(b, x[:])
 }
 
@@ -145,24 +133,21 @@
 
 func ptrEqual() {
 	// amd64:-"JEQ",-"JNE"
-	// ppc64:-"BEQ",-"BNE"
-	// ppc64le:-"BEQ",-"BNE"
+	// ppc64x:-"BEQ",-"BNE"
 	// s390x:-"BEQ",-"BNE"
 	copy(x[:], x[:])
 }
 
 func ptrOneOffset() {
 	// amd64:-"JEQ",-"JNE"
-	// ppc64:-"BEQ",-"BNE"
-	// ppc64le:-"BEQ",-"BNE"
+	// ppc64x:-"BEQ",-"BNE"
 	// s390x:-"BEQ",-"BNE"
 	copy(x[1:], x[:])
 }
 
 func ptrBothOffset() {
 	// amd64:-"JEQ",-"JNE"
-	// ppc64:-"BEQ",-"BNE"
-	// ppc64le:-"BEQ",-"BNE"
+	// ppc64x:-"BEQ",-"BNE"
 	// s390x:-"BEQ",-"BNE"
 	copy(x[1:], x[2:])
 }
diff --git a/test/codegen/floats.go b/test/codegen/floats.go
index 397cbb8..9cb62e0 100644
--- a/test/codegen/floats.go
+++ b/test/codegen/floats.go
@@ -19,8 +19,8 @@
 	// amd64:"ADDSD",-"MULSD"
 	// arm/7:"ADDD",-"MULD"
 	// arm64:"FADDD",-"FMULD"
-	// ppc64:"FADD",-"FMUL"
-	// ppc64le:"FADD",-"FMUL"
+	// ppc64x:"FADD",-"FMUL"
+	// riscv64:"FADDD",-"FMULD"
 	return f * 2.0
 }
 
@@ -29,24 +29,24 @@
 	// amd64:"MULSD",-"DIVSD"
 	// arm/7:"MULD",-"DIVD"
 	// arm64:"FMULD",-"FDIVD"
-	// ppc64:"FMUL",-"FDIV"
-	// ppc64le:"FMUL",-"FDIV"
+	// ppc64x:"FMUL",-"FDIV"
+	// riscv64:"FMULD",-"FDIVD"
 	x := f1 / 16.0
 
 	// 386/sse2:"MULSD",-"DIVSD"
 	// amd64:"MULSD",-"DIVSD"
 	// arm/7:"MULD",-"DIVD"
 	// arm64:"FMULD",-"FDIVD"
-	// ppc64:"FMUL",-"FDIVD"
-	// ppc64le:"FMUL",-"FDIVD"
+	// ppc64x:"FMUL",-"FDIVD"
+	// riscv64:"FMULD",-"FDIVD"
 	y := f2 / 0.125
 
 	// 386/sse2:"ADDSD",-"DIVSD",-"MULSD"
 	// amd64:"ADDSD",-"DIVSD",-"MULSD"
 	// arm/7:"ADDD",-"MULD",-"DIVD"
 	// arm64:"FADDD",-"FMULD",-"FDIVD"
-	// ppc64:"FADD",-"FMUL",-"FDIV"
-	// ppc64le:"FADD",-"FMUL",-"FDIV"
+	// ppc64x:"FADD",-"FMUL",-"FDIV"
+	// riscv64:"FADDD",-"FMULD",-"FDIVD"
 	z := f3 / 0.5
 
 	return x, y, z
@@ -68,16 +68,14 @@
 
 func FusedAdd32(x, y, z float32) float32 {
 	// s390x:"FMADDS\t"
-	// ppc64:"FMADDS\t"
-	// ppc64le:"FMADDS\t"
+	// ppc64x:"FMADDS\t"
 	// arm64:"FMADDS"
 	return x*y + z
 }
 
 func FusedSub32_a(x, y, z float32) float32 {
 	// s390x:"FMSUBS\t"
-	// ppc64:"FMSUBS\t"
-	// ppc64le:"FMSUBS\t"
+	// ppc64x:"FMSUBS\t"
 	return x*y - z
 }
 
@@ -88,16 +86,14 @@
 
 func FusedAdd64(x, y, z float64) float64 {
 	// s390x:"FMADD\t"
-	// ppc64:"FMADD\t"
-	// ppc64le:"FMADD\t"
+	// ppc64x:"FMADD\t"
 	// arm64:"FMADDD"
 	return x*y + z
 }
 
 func FusedSub64_a(x, y, z float64) float64 {
 	// s390x:"FMSUB\t"
-	// ppc64:"FMSUB\t"
-	// ppc64le:"FMSUB\t"
+	// ppc64x:"FMSUB\t"
 	return x*y - z
 }
 
diff --git a/test/codegen/issue42610.go b/test/codegen/issue42610.go
index c7eeddc..41d0e90 100644
--- a/test/codegen/issue42610.go
+++ b/test/codegen/issue42610.go
@@ -14,8 +14,7 @@
                 i = uint32(p) * (uint32(p) & (i & 1))
                 return 1
         }
-        // ppc64le: -"RLWNIM"
-        // ppc64: -"RLWNIM"
+        // ppc64x: -"RLWNIM"
         a[0] = g(8) >> 1
 }
 
@@ -24,7 +23,6 @@
 		i = uint(p) * (uint(p) & (i & 1))
 		return 1
 	}
-	// ppc64le: -"RLDIC"
-	// ppc64: -"RLDIC"
+	// ppc64x: -"RLDIC"
 	a[0] = g(8) >> 1
 }
diff --git a/test/codegen/issue52635.go b/test/codegen/issue52635.go
index 0e4d169..9b08cad 100644
--- a/test/codegen/issue52635.go
+++ b/test/codegen/issue52635.go
@@ -5,6 +5,7 @@
 // license that can be found in the LICENSE file.
 
 // Test that optimized range memclr works with pointers to arrays.
+// The clears get inlined, see https://github.com/golang/go/issues/56997
 
 package codegen
 
@@ -14,22 +15,26 @@
 }
 
 func (t *T) f() {
-	// amd64:".*runtime.memclrNoHeapPointers"
+	// amd64:-".*runtime.memclrNoHeapPointers"
+	// amd64:"DUFFZERO"
 	for i := range t.a {
 		t.a[i] = 0
 	}
 
-	// amd64:".*runtime.memclrNoHeapPointers"
+	// amd64:-".*runtime.memclrNoHeapPointers"
+	// amd64:"DUFFZERO"
 	for i := range *t.a {
 		t.a[i] = 0
 	}
 
-	// amd64:".*runtime.memclrNoHeapPointers"
+	// amd64:-".*runtime.memclrNoHeapPointers"
+	// amd64:"DUFFZERO"
 	for i := range t.a {
 		(*t.a)[i] = 0
 	}
 
-	// amd64:".*runtime.memclrNoHeapPointers"
+	// amd64:-".*runtime.memclrNoHeapPointers"
+	// amd64:"DUFFZERO"
 	for i := range *t.a {
 		(*t.a)[i] = 0
 	}
diff --git a/test/codegen/issue58166.go b/test/codegen/issue58166.go
new file mode 100644
index 0000000..8be5aac
--- /dev/null
+++ b/test/codegen/issue58166.go
@@ -0,0 +1,23 @@
+// asmcheck
+
+// Copyright 2023 The Go Authors. 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
+
+func dgemmSerialNotNot(m, n, k int, a []float64, lda int, b []float64, ldb int, c []float64, ldc int, alpha float64) {
+	for i := 0; i < m; i++ {
+		ctmp := c[i*ldc : i*ldc+n]
+		for l, v := range a[i*lda : i*lda+k] {
+			tmp := alpha * v
+			if tmp != 0 {
+				x := b[l*ldb : l*ldb+n]
+				// amd64:"INCQ"
+				for i, v := range x {
+					ctmp[i] += tmp * v
+				}
+			}
+		}
+	}
+}
diff --git a/test/codegen/issue60324.go b/test/codegen/issue60324.go
new file mode 100644
index 0000000..d106e7e
--- /dev/null
+++ b/test/codegen/issue60324.go
@@ -0,0 +1,36 @@
+// asmcheck
+
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package codegen
+
+func main() {
+	// amd64:"LEAQ\tcommand-line-arguments\\.main\\.f\\.g\\.h\\.func3"
+	f(1)()
+
+	// amd64:"LEAQ\tcommand-line-arguments\\.main\\.g\\.h\\.func2"
+	g(2)()
+
+	// amd64:"LEAQ\tcommand-line-arguments\\.main\\.h\\.func1"
+	h(3)()
+
+	// amd64:"LEAQ\tcommand-line-arguments\\.main\\.f\\.g\\.h\\.func4"
+	f(4)()
+}
+
+func f(x int) func() {
+	// amd64:"LEAQ\tcommand-line-arguments\\.f\\.g\\.h\\.func1"
+	return g(x)
+}
+
+func g(x int) func() {
+	// amd64:"LEAQ\tcommand-line-arguments\\.g\\.h\\.func1"
+	return h(x)
+}
+
+func h(x int) func() {
+	// amd64:"LEAQ\tcommand-line-arguments\\.h\\.func1"
+	return func() { recover() }
+}
diff --git a/test/codegen/issue60673.go b/test/codegen/issue60673.go
new file mode 100644
index 0000000..2df031a
--- /dev/null
+++ b/test/codegen/issue60673.go
@@ -0,0 +1,18 @@
+// asmcheck
+
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package codegen
+
+//go:noinline
+func f(x int32) {
+}
+
+func g(p *int32) {
+	// argument marshaling code should live at line 17, not line 15.
+	x := *p
+	// 386: `MOVL\s[A-Z]+,\s\(SP\)`
+	f(x)
+}
diff --git a/test/codegen/logic.go b/test/codegen/logic.go
index 50ce5f0..ac33f91 100644
--- a/test/codegen/logic.go
+++ b/test/codegen/logic.go
@@ -6,16 +6,12 @@
 
 package codegen
 
-var gx, gy int
-
 // Test to make sure that (CMPQ (ANDQ x y) [0]) does not get rewritten to
 // (TESTQ x y) if the ANDQ has other uses. If that rewrite happens, then one
 // of the args of the ANDQ needs to be saved so it can be used as the arg to TESTQ.
 func andWithUse(x, y int) int {
-	// Load x,y into registers, so those MOVQ will not appear at the z := x&y line.
-	gx, gy = x, y
-	// amd64:-"MOVQ"
 	z := x & y
+	// amd64:`TESTQ\s(AX, AX|BX, BX|CX, CX|DX, DX|SI, SI|DI, DI|R8, R8|R9, R9|R10, R10|R11, R11|R12, R12|R13, R13|R15, R15)`
 	if z == 0 {
 		return 77
 	}
@@ -25,8 +21,21 @@
 
 // Verify (OR x (NOT y)) rewrites to (ORN x y) where supported
 func ornot(x, y int) int {
-	// ppc64:"ORN"
-	// ppc64le:"ORN"
+	// ppc64x:"ORN"
 	z := x | ^y
 	return z
 }
+
+// Verify that (OR (NOT x) (NOT y)) rewrites to (NOT (AND x y))
+func orDemorgans(x, y int) int {
+	// amd64:"AND",-"OR"
+	z := ^x | ^y
+	return z
+}
+
+// Verify that (AND (NOT x) (NOT y)) rewrites to (NOT (OR x y))
+func andDemorgans(x, y int) int {
+	// amd64:"OR",-"AND"
+	z := ^x & ^y
+	return z
+}
diff --git a/test/codegen/maps.go b/test/codegen/maps.go
index ea3a70d..2550579 100644
--- a/test/codegen/maps.go
+++ b/test/codegen/maps.go
@@ -124,31 +124,78 @@
 }
 
 func MapLiteralSizing(x int) (map[int]int, map[int]int) {
-	// amd64:"MOVL\t[$]10,"
+	// This is tested for internal/abi/maps.go:MapBucketCountBits={3,4,5}
+	// amd64:"MOVL\t[$]33,"
 	m := map[int]int{
-		0: 0,
-		1: 1,
-		2: 2,
-		3: 3,
-		4: 4,
-		5: 5,
-		6: 6,
-		7: 7,
-		8: 8,
-		9: 9,
+		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,
+		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: 32,
+		32: 32,
 	}
-	// amd64:"MOVL\t[$]10,"
+	// amd64:"MOVL\t[$]33,"
 	n := map[int]int{
-		0: x,
-		1: x,
-		2: x,
-		3: x,
-		4: x,
-		5: x,
-		6: x,
-		7: x,
-		8: x,
-		9: x,
+		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,
+		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: 32,
+		32: 32,
 	}
 	return m, n
 }
diff --git a/test/codegen/math.go b/test/codegen/math.go
index 7c76d26..331ebbe 100644
--- a/test/codegen/math.go
+++ b/test/codegen/math.go
@@ -15,8 +15,7 @@
 	// amd64:"ROUNDSD\t[$]2"
 	// s390x:"FIDBR\t[$]6"
 	// arm64:"FRINTPD"
-	// ppc64:"FRIP"
-	// ppc64le:"FRIP"
+	// ppc64x:"FRIP"
 	// wasm:"F64Ceil"
 	sink64[0] = math.Ceil(x)
 
@@ -24,23 +23,20 @@
 	// amd64:"ROUNDSD\t[$]1"
 	// s390x:"FIDBR\t[$]7"
 	// arm64:"FRINTMD"
-	// ppc64:"FRIM"
-	// ppc64le:"FRIM"
+	// ppc64x:"FRIM"
 	// wasm:"F64Floor"
 	sink64[1] = math.Floor(x)
 
 	// s390x:"FIDBR\t[$]1"
 	// arm64:"FRINTAD"
-	// ppc64:"FRIN"
-	// ppc64le:"FRIN"
+	// ppc64x:"FRIN"
 	sink64[2] = math.Round(x)
 
 	// amd64/v2:-".*x86HasSSE41" amd64/v3:-".*x86HasSSE41"
 	// amd64:"ROUNDSD\t[$]3"
 	// s390x:"FIDBR\t[$]5"
 	// arm64:"FRINTZD"
-	// ppc64:"FRIZ"
-	// ppc64le:"FRIZ"
+	// ppc64x:"FRIZ"
 	// wasm:"F64Trunc"
 	sink64[3] = math.Trunc(x)
 
@@ -60,8 +56,8 @@
 	// mips/hardfloat:"SQRTD" mips/softfloat:-"SQRTD"
 	// mips64/hardfloat:"SQRTD" mips64/softfloat:-"SQRTD"
 	// wasm:"F64Sqrt"
-	// ppc64le:"FSQRT"
-	// ppc64:"FSQRT"
+	// ppc64x:"FSQRT"
+	// riscv64: "FSQRTD"
 	return math.Sqrt(x)
 }
 
@@ -73,8 +69,8 @@
 	// mips/hardfloat:"SQRTF" mips/softfloat:-"SQRTF"
 	// mips64/hardfloat:"SQRTF" mips64/softfloat:-"SQRTF"
 	// wasm:"F32Sqrt"
-	// ppc64le:"FSQRTS"
-	// ppc64:"FSQRTS"
+	// ppc64x:"FSQRTS"
+	// riscv64: "FSQRTS"
 	return float32(math.Sqrt(float64(x)))
 }
 
@@ -83,17 +79,17 @@
 	// amd64:"BTRQ\t[$]63"
 	// arm64:"FABSD\t"
 	// s390x:"LPDFR\t",-"MOVD\t"     (no integer load/store)
-	// ppc64:"FABS\t"
-	// ppc64le:"FABS\t"
+	// ppc64x:"FABS\t"
 	// riscv64:"FABSD\t"
 	// wasm:"F64Abs"
 	// arm/6:"ABSD\t"
+	// mips64/hardfloat:"ABSD\t"
+	// mips/hardfloat:"ABSD\t"
 	sink64[0] = math.Abs(x)
 
 	// amd64:"BTRQ\t[$]63","PXOR"    (TODO: this should be BTSQ)
 	// s390x:"LNDFR\t",-"MOVD\t"     (no integer load/store)
-	// ppc64:"FNABS\t"
-	// ppc64le:"FNABS\t"
+	// ppc64x:"FNABS\t"
 	sink64[1] = -math.Abs(y)
 }
 
@@ -107,16 +103,14 @@
 func copysign(a, b, c float64) {
 	// amd64:"BTRQ\t[$]63","ANDQ","ORQ"
 	// s390x:"CPSDR",-"MOVD"         (no integer load/store)
-	// ppc64:"FCPSGN"
-	// ppc64le:"FCPSGN"
+	// ppc64x:"FCPSGN"
 	// riscv64:"FSGNJD"
 	// wasm:"F64Copysign"
 	sink64[0] = math.Copysign(a, b)
 
 	// amd64:"BTSQ\t[$]63"
 	// s390x:"LNDFR\t",-"MOVD\t"     (no integer load/store)
-	// ppc64:"FCPSGN"
-	// ppc64le:"FCPSGN"
+	// ppc64x:"FCPSGN"
 	// riscv64:"FSGNJD"
 	// arm64:"ORR", -"AND"
 	sink64[1] = math.Copysign(c, -1)
@@ -128,8 +122,7 @@
 
 	// amd64:"ANDQ","ORQ"
 	// s390x:"CPSDR\t",-"MOVD\t"     (no integer load/store)
-	// ppc64:"FCPSGN"
-	// ppc64le:"FCPSGN"
+	// ppc64x:"FCPSGN"
 	// riscv64:"FSGNJD"
 	sink64[3] = math.Copysign(-1, c)
 }
@@ -140,8 +133,7 @@
 	// arm/6:"FMULAD"
 	// arm64:"FMADDD"
 	// s390x:"FMADD"
-	// ppc64:"FMADD"
-	// ppc64le:"FMADD"
+	// ppc64x:"FMADD"
 	// riscv64:"FMADDD"
 	return math.FMA(x, y, z)
 }
@@ -151,41 +143,43 @@
 	return math.FMA(x, y, -z)
 }
 
-func fnma(x, y, z float64) float64 {
-	// riscv64:"FNMADDD"
+func fnms(x, y, z float64) float64 {
+	// riscv64:"FNMSUBD",-"FNMADDD"
 	return math.FMA(-x, y, z)
 }
 
-func fnms(x, y, z float64) float64 {
-	// riscv64:"FNMSUBD"
+func fnma(x, y, z float64) float64 {
+	// riscv64:"FNMADDD",-"FNMSUBD"
 	return math.FMA(x, -y, -z)
 }
 
 func fromFloat64(f64 float64) uint64 {
 	// amd64:"MOVQ\tX.*, [^X].*"
 	// arm64:"FMOVD\tF.*, R.*"
-	// ppc64:"MFVSRD"
-	// ppc64le:"MFVSRD"
+	// ppc64x:"MFVSRD"
+	// mips64/hardfloat:"MOVV\tF.*, R.*"
 	return math.Float64bits(f64+1) + 1
 }
 
 func fromFloat32(f32 float32) uint32 {
 	// amd64:"MOVL\tX.*, [^X].*"
 	// arm64:"FMOVS\tF.*, R.*"
+	// mips64/hardfloat:"MOVW\tF.*, R.*"
 	return math.Float32bits(f32+1) + 1
 }
 
 func toFloat64(u64 uint64) float64 {
 	// amd64:"MOVQ\t[^X].*, X.*"
 	// arm64:"FMOVD\tR.*, F.*"
-	// ppc64:"MTVSRD"
-	// ppc64le:"MTVSRD"
+	// ppc64x:"MTVSRD"
+	// mips64/hardfloat:"MOVV\tR.*, F.*"
 	return math.Float64frombits(u64+1) + 1
 }
 
 func toFloat32(u32 uint32) float32 {
 	// amd64:"MOVL\t[^X].*, X.*"
 	// arm64:"FMOVS\tR.*, F.*"
+	// mips64/hardfloat:"MOVW\tR.*, F.*"
 	return math.Float32frombits(u32+1) + 1
 }
 
@@ -210,8 +204,7 @@
 func constantConvert32(x float32) float32 {
 	// amd64:"MOVSS\t[$]f32.3f800000\\(SB\\)"
 	// s390x:"FMOVS\t[$]f32.3f800000\\(SB\\)"
-	// ppc64:"FMOVS\t[$]f32.3f800000\\(SB\\)"
-	// ppc64le:"FMOVS\t[$]f32.3f800000\\(SB\\)"
+	// ppc64x:"FMOVS\t[$]f32.3f800000\\(SB\\)"
 	// arm64:"FMOVS\t[$]\\(1.0\\)"
 	if x > math.Float32frombits(0x3f800000) {
 		return -x
@@ -222,8 +215,7 @@
 func constantConvertInt32(x uint32) uint32 {
 	// amd64:-"MOVSS"
 	// s390x:-"FMOVS"
-	// ppc64:-"FMOVS"
-	// ppc64le:-"FMOVS"
+	// ppc64x:-"FMOVS"
 	// arm64:-"FMOVS"
 	if x > math.Float32bits(1) {
 		return -x
diff --git a/test/codegen/mathbits.go b/test/codegen/mathbits.go
index b506a37..8c971cf 100644
--- a/test/codegen/mathbits.go
+++ b/test/codegen/mathbits.go
@@ -19,8 +19,7 @@
 	// arm:"CLZ" arm64:"CLZ"
 	// mips:"CLZ"
 	// wasm:"I64Clz"
-	// ppc64le:"CNTLZD"
-	// ppc64:"CNTLZD"
+	// ppc64x:"CNTLZD"
 	return bits.LeadingZeros(n)
 }
 
@@ -31,8 +30,7 @@
 	// arm:"CLZ" arm64:"CLZ"
 	// mips:"CLZ"
 	// wasm:"I64Clz"
-	// ppc64le:"CNTLZD"
-	// ppc64:"CNTLZD"
+	// ppc64x:"CNTLZD"
 	return bits.LeadingZeros64(n)
 }
 
@@ -43,8 +41,7 @@
 	// arm:"CLZ" arm64:"CLZW"
 	// mips:"CLZ"
 	// wasm:"I64Clz"
-	// ppc64le:"CNTLZW"
-	// ppc64:"CNTLZW"
+	// ppc64x:"CNTLZW"
 	return bits.LeadingZeros32(n)
 }
 
@@ -55,8 +52,7 @@
 	// arm:"CLZ" arm64:"CLZ"
 	// mips:"CLZ"
 	// wasm:"I64Clz"
-	// ppc64le:"CNTLZD"
-	// ppc64:"CNTLZD"
+	// ppc64x:"CNTLZD"
 	return bits.LeadingZeros16(n)
 }
 
@@ -67,8 +63,7 @@
 	// arm:"CLZ" arm64:"CLZ"
 	// mips:"CLZ"
 	// wasm:"I64Clz"
-	// ppc64le:"CNTLZD"
-	// ppc64:"CNTLZD"
+	// ppc64x:"CNTLZD"
 	return bits.LeadingZeros8(n)
 }
 
@@ -83,8 +78,7 @@
 	// arm:"CLZ" arm64:"CLZ"
 	// mips:"CLZ"
 	// wasm:"I64Clz"
-	// ppc64le:"SUBC","CNTLZD"
-	// ppc64:"SUBC","CNTLZD"
+	// ppc64x:"SUBC","CNTLZD"
 	return bits.Len(n)
 }
 
@@ -95,14 +89,12 @@
 	// arm:"CLZ" arm64:"CLZ"
 	// mips:"CLZ"
 	// wasm:"I64Clz"
-	// ppc64le:"SUBC","CNTLZD"
-	// ppc64:"SUBC","CNTLZD"
+	// ppc64x:"SUBC","CNTLZD"
 	return bits.Len64(n)
 }
 
 func SubFromLen64(n uint64) int {
-	// ppc64le:"CNTLZD",-"SUBC"
-	// ppc64:"CNTLZD",-"SUBC"
+	// ppc64x:"CNTLZD",-"SUBC"
 	return 64 - bits.Len64(n)
 }
 
@@ -113,8 +105,7 @@
 	// arm:"CLZ" arm64:"CLZ"
 	// mips:"CLZ"
 	// wasm:"I64Clz"
-	// ppc64: "CNTLZW"
-	// ppc64le: "CNTLZW"
+	// ppc64x: "CNTLZW"
 	return bits.Len32(n)
 }
 
@@ -125,8 +116,7 @@
 	// arm:"CLZ" arm64:"CLZ"
 	// mips:"CLZ"
 	// wasm:"I64Clz"
-	// ppc64le:"SUBC","CNTLZD"
-	// ppc64:"SUBC","CNTLZD"
+	// ppc64x:"SUBC","CNTLZD"
 	return bits.Len16(n)
 }
 
@@ -137,8 +127,7 @@
 	// arm:"CLZ" arm64:"CLZ"
 	// mips:"CLZ"
 	// wasm:"I64Clz"
-	// ppc64le:"SUBC","CNTLZD"
-	// ppc64:"SUBC","CNTLZD"
+	// ppc64x:"SUBC","CNTLZD"
 	return bits.Len8(n)
 }
 
@@ -152,8 +141,7 @@
 	// amd64:"POPCNTQ"
 	// arm64:"VCNT","VUADDLV"
 	// s390x:"POPCNT"
-	// ppc64:"POPCNTD"
-	// ppc64le:"POPCNTD"
+	// ppc64x:"POPCNTD"
 	// wasm:"I64Popcnt"
 	return bits.OnesCount(n)
 }
@@ -163,8 +151,7 @@
 	// amd64:"POPCNTQ"
 	// arm64:"VCNT","VUADDLV"
 	// s390x:"POPCNT"
-	// ppc64:"POPCNTD"
-	// ppc64le:"POPCNTD"
+	// ppc64x:"POPCNTD"
 	// wasm:"I64Popcnt"
 	return bits.OnesCount64(n)
 }
@@ -174,8 +161,7 @@
 	// amd64:"POPCNTL"
 	// arm64:"VCNT","VUADDLV"
 	// s390x:"POPCNT"
-	// ppc64:"POPCNTW"
-	// ppc64le:"POPCNTW"
+	// ppc64x:"POPCNTW"
 	// wasm:"I64Popcnt"
 	return bits.OnesCount32(n)
 }
@@ -185,16 +171,14 @@
 	// amd64:"POPCNTL"
 	// arm64:"VCNT","VUADDLV"
 	// s390x:"POPCNT"
-	// ppc64:"POPCNTW"
-	// ppc64le:"POPCNTW"
+	// ppc64x:"POPCNTW"
 	// wasm:"I64Popcnt"
 	return bits.OnesCount16(n)
 }
 
 func OnesCount8(n uint8) int {
 	// s390x:"POPCNT"
-	// ppc64:"POPCNTB"
-	// ppc64le:"POPCNTB"
+	// ppc64x:"POPCNTB"
 	// wasm:"I64Popcnt"
 	return bits.OnesCount8(n)
 }
@@ -205,6 +189,7 @@
 
 func ReverseBytes(n uint) uint {
 	// amd64:"BSWAPQ"
+	// 386:"BSWAPL"
 	// s390x:"MOVDBR"
 	// arm64:"REV"
 	return bits.ReverseBytes(n)
@@ -212,15 +197,19 @@
 
 func ReverseBytes64(n uint64) uint64 {
 	// amd64:"BSWAPQ"
+	// 386:"BSWAPL"
 	// s390x:"MOVDBR"
 	// arm64:"REV"
+	// ppc64x/power10: "BRD"
 	return bits.ReverseBytes64(n)
 }
 
 func ReverseBytes32(n uint32) uint32 {
 	// amd64:"BSWAPL"
+	// 386:"BSWAPL"
 	// s390x:"MOVWBR"
 	// arm64:"REVW"
+	// ppc64x/power10: "BRW"
 	return bits.ReverseBytes32(n)
 }
 
@@ -230,6 +219,7 @@
 	// arm/5:"SLL","SRL","ORR"
 	// arm/6:"REV16"
 	// arm/7:"REV16"
+	// ppc64x/power10: "BRH"
 	return bits.ReverseBytes16(n)
 }
 
@@ -240,8 +230,7 @@
 func RotateLeft64(n uint64) uint64 {
 	// amd64:"ROLQ"
 	// arm64:"ROR"
-	// ppc64:"ROTL"
-	// ppc64le:"ROTL"
+	// ppc64x:"ROTL"
 	// s390x:"RISBGZ\t[$]0, [$]63, [$]37, "
 	// wasm:"I64Rotl"
 	return bits.RotateLeft64(n, 37)
@@ -251,8 +240,7 @@
 	// amd64:"ROLL" 386:"ROLL"
 	// arm:`MOVW\tR[0-9]+@>23`
 	// arm64:"RORW"
-	// ppc64:"ROTLW"
-	// ppc64le:"ROTLW"
+	// ppc64x:"ROTLW"
 	// s390x:"RLL"
 	// wasm:"I32Rotl"
 	return bits.RotateLeft32(n, 9)
@@ -273,8 +261,7 @@
 func RotateLeftVariable(n uint, m int) uint {
 	// amd64:"ROLQ"
 	// arm64:"ROR"
-	// ppc64:"ROTL"
-	// ppc64le:"ROTL"
+	// ppc64x:"ROTL"
 	// s390x:"RLLG"
 	// wasm:"I64Rotl"
 	return bits.RotateLeft(n, m)
@@ -283,8 +270,7 @@
 func RotateLeftVariable64(n uint64, m int) uint64 {
 	// amd64:"ROLQ"
 	// arm64:"ROR"
-	// ppc64:"ROTL"
-	// ppc64le:"ROTL"
+	// ppc64x:"ROTL"
 	// s390x:"RLLG"
 	// wasm:"I64Rotl"
 	return bits.RotateLeft64(n, m)
@@ -294,8 +280,7 @@
 	// arm:`MOVW\tR[0-9]+@>R[0-9]+`
 	// amd64:"ROLL"
 	// arm64:"RORW"
-	// ppc64:"ROTLW"
-	// ppc64le:"ROTLW"
+	// ppc64x:"ROTLW"
 	// s390x:"RLL"
 	// wasm:"I32Rotl"
 	return bits.RotateLeft32(n, m)
@@ -308,13 +293,12 @@
 func TrailingZeros(n uint) int {
 	// amd64/v1,amd64/v2:"BSFQ","MOVL\t\\$64","CMOVQEQ"
 	// amd64/v3:"TZCNTQ"
+	// 386:"BSFL"
 	// arm:"CLZ"
 	// arm64:"RBIT","CLZ"
 	// s390x:"FLOGR"
-	// ppc64/power8:"ANDN","POPCNTD"
-	// ppc64le/power8:"ANDN","POPCNTD"
-	// ppc64/power9: "CNTTZD"
-	// ppc64le/power9: "CNTTZD"
+	// ppc64x/power8:"ANDN","POPCNTD"
+	// ppc64x/power9: "CNTTZD"
 	// wasm:"I64Ctz"
 	return bits.TrailingZeros(n)
 }
@@ -322,32 +306,30 @@
 func TrailingZeros64(n uint64) int {
 	// amd64/v1,amd64/v2:"BSFQ","MOVL\t\\$64","CMOVQEQ"
 	// amd64/v3:"TZCNTQ"
+	// 386:"BSFL"
 	// arm64:"RBIT","CLZ"
 	// s390x:"FLOGR"
-	// ppc64/power8:"ANDN","POPCNTD"
-	// ppc64le/power8:"ANDN","POPCNTD"
-	// ppc64/power9: "CNTTZD"
-	// ppc64le/power9: "CNTTZD"
+	// ppc64x/power8:"ANDN","POPCNTD"
+	// ppc64x/power9: "CNTTZD"
 	// wasm:"I64Ctz"
 	return bits.TrailingZeros64(n)
 }
 
 func TrailingZeros64Subtract(n uint64) int {
-	// ppc64le/power8:"NEG","SUBC","ANDN","POPCNTD"
-	// ppc64le/power9:"SUBC","CNTTZD"
+	// ppc64x/power8:"NEG","SUBC","ANDN","POPCNTD"
+	// ppc64x/power9:"SUBC","CNTTZD"
 	return bits.TrailingZeros64(1 - n)
 }
 
 func TrailingZeros32(n uint32) int {
 	// amd64/v1,amd64/v2:"BTSQ\\t\\$32","BSFQ"
 	// amd64/v3:"TZCNTL"
+	// 386:"BSFL"
 	// arm:"CLZ"
 	// arm64:"RBITW","CLZW"
 	// s390x:"FLOGR","MOVWZ"
-	// ppc64/power8:"ANDN","POPCNTW"
-	// ppc64le/power8:"ANDN","POPCNTW"
-	// ppc64/power9: "CNTTZW"
-	// ppc64le/power9: "CNTTZW"
+	// ppc64x/power8:"ANDN","POPCNTW"
+	// ppc64x/power9: "CNTTZW"
 	// wasm:"I64Ctz"
 	return bits.TrailingZeros32(n)
 }
@@ -358,16 +340,15 @@
 	// arm:"ORR\t\\$65536","CLZ",-"MOVHU\tR"
 	// arm64:"ORR\t\\$65536","RBITW","CLZW",-"MOVHU\tR",-"RBIT\t",-"CLZ\t"
 	// s390x:"FLOGR","OR\t\\$65536"
-	// ppc64/power8:"POPCNTD","OR\\t\\$65536"
-	// ppc64le/power8:"POPCNTD","OR\\t\\$65536"
-	// ppc64/power9:"CNTTZD","OR\\t\\$65536"
-	// ppc64le/power9:"CNTTZD","OR\\t\\$65536"
+	// ppc64x/power8:"POPCNTD","OR\\t\\$65536"
+	// ppc64x/power9:"CNTTZD","OR\\t\\$65536"
 	// wasm:"I64Ctz"
 	return bits.TrailingZeros16(n)
 }
 
 func TrailingZeros8(n uint8) int {
 	// amd64:"BSFL","BTSL\\t\\$8"
+	// 386:"BSFL"
 	// arm:"ORR\t\\$256","CLZ",-"MOVBU\tR"
 	// arm64:"ORR\t\\$256","RBITW","CLZW",-"MOVBU\tR",-"RBIT\t",-"CLZ\t"
 	// s390x:"FLOGR","OR\t\\$256"
@@ -441,8 +422,7 @@
 func Add(x, y, ci uint) (r, co uint) {
 	// arm64:"ADDS","ADCS","ADC",-"ADD\t",-"CMP"
 	// amd64:"NEGL","ADCQ","SBBQ","NEGQ"
-	// ppc64: "ADDC", "ADDE", "ADDZE"
-	// ppc64le: "ADDC", "ADDE", "ADDZE"
+	// ppc64x: "ADDC", "ADDE", "ADDZE"
 	// s390x:"ADDE","ADDC\t[$]-1,"
 	// riscv64: "ADD","SLTU"
 	return bits.Add(x, y, ci)
@@ -452,8 +432,7 @@
 	// arm64:"ADDS","ADCS","ADC",-"ADD\t",-"CMP"
 	// amd64:"NEGL","ADCQ","SBBQ","NEGQ"
 	// loong64: "ADDV", "SGTU"
-	// ppc64: "ADDC", "ADDE", "ADDZE"
-	// ppc64le: "ADDC", "ADDE", "ADDZE"
+	// ppc64x: "ADDC", "ADDE", "ADDZE"
 	// s390x:"ADDE","ADDC\t[$]-1,"
 	// riscv64: "ADD","SLTU"
 	return bits.Add(x, 7, ci)
@@ -463,8 +442,7 @@
 	// arm64:"ADDS","ADC",-"ADCS",-"ADD\t",-"CMP"
 	// amd64:"ADDQ","SBBQ","NEGQ",-"NEGL",-"ADCQ"
 	// loong64: "ADDV", "SGTU"
-	// ppc64: "ADDC", -"ADDE", "ADDZE"
-	// ppc64le: "ADDC", -"ADDE", "ADDZE"
+	// ppc64x: "ADDC", -"ADDE", "ADDZE"
 	// s390x:"ADDC",-"ADDC\t[$]-1,"
 	// riscv64: "ADD","SLTU"
 	return bits.Add(x, y, 0)
@@ -474,8 +452,7 @@
 	// arm64:"ADDS","ADCS",-"ADD\t",-"CMP"
 	// amd64:"NEGL","ADCQ",-"SBBQ",-"NEGQ"
 	// loong64: "ADDV", -"SGTU"
-	// ppc64: "ADDC", "ADDE", -"ADDZE"
-	// ppc64le: "ADDC", "ADDE", -"ADDZE"
+	// ppc64x: "ADDC", "ADDE", -"ADDZE"
 	// s390x:"ADDE","ADDC\t[$]-1,"
 	// riscv64: "ADD",-"SLTU"
 	r, _ := bits.Add(x, y, ci)
@@ -496,8 +473,7 @@
 	// arm64:"ADDS","ADCS","ADC",-"ADD\t",-"CMP"
 	// amd64:"NEGL","ADCQ","SBBQ","NEGQ"
 	// loong64: "ADDV", "SGTU"
-	// ppc64: "ADDC", "ADDE", "ADDZE"
-	// ppc64le: "ADDC", "ADDE", "ADDZE"
+	// ppc64x: "ADDC", "ADDE", "ADDZE"
 	// s390x:"ADDE","ADDC\t[$]-1,"
 	// riscv64: "ADD","SLTU"
 	return bits.Add64(x, y, ci)
@@ -507,8 +483,7 @@
 	// arm64:"ADDS","ADCS","ADC",-"ADD\t",-"CMP"
 	// amd64:"NEGL","ADCQ","SBBQ","NEGQ"
 	// loong64: "ADDV", "SGTU"
-	// ppc64: "ADDC", "ADDE", "ADDZE"
-	// ppc64le: "ADDC", "ADDE", "ADDZE"
+	// ppc64x: "ADDC", "ADDE", "ADDZE"
 	// s390x:"ADDE","ADDC\t[$]-1,"
 	// riscv64: "ADD","SLTU"
 	return bits.Add64(x, 7, ci)
@@ -518,8 +493,7 @@
 	// arm64:"ADDS","ADC",-"ADCS",-"ADD\t",-"CMP"
 	// amd64:"ADDQ","SBBQ","NEGQ",-"NEGL",-"ADCQ"
 	// loong64: "ADDV", "SGTU"
-	// ppc64: "ADDC", -"ADDE", "ADDZE"
-	// ppc64le: "ADDC", -"ADDE", "ADDZE"
+	// ppc64x: "ADDC", -"ADDE", "ADDZE"
 	// s390x:"ADDC",-"ADDC\t[$]-1,"
 	// riscv64: "ADD","SLTU"
 	return bits.Add64(x, y, 0)
@@ -529,8 +503,7 @@
 	// arm64:"ADDS","ADCS",-"ADD\t",-"CMP"
 	// amd64:"NEGL","ADCQ",-"SBBQ",-"NEGQ"
 	// loong64: "ADDV", -"SGTU"
-	// ppc64: "ADDC", "ADDE", -"ADDZE"
-	// ppc64le: "ADDC", "ADDE", -"ADDZE"
+	// ppc64x: "ADDC", "ADDE", -"ADDZE"
 	// s390x:"ADDE","ADDC\t[$]-1,"
 	// riscv64: "ADD",-"SLTU"
 	r, _ := bits.Add64(x, y, ci)
@@ -541,19 +514,16 @@
 	r[0], c = bits.Add64(p[0], q[0], c)
 	// arm64:"ADCS",-"ADD\t",-"CMP"
 	// amd64:"ADCQ",-"NEGL",-"SBBQ",-"NEGQ"
-	// ppc64: -"ADDC", "ADDE", -"ADDZE"
-	// ppc64le: -"ADDC", "ADDE", -"ADDZE"
+	// ppc64x: -"ADDC", "ADDE", -"ADDZE"
 	// s390x:"ADDE",-"ADDC\t[$]-1,"
 	r[1], c = bits.Add64(p[1], q[1], c)
 	r[2], c = bits.Add64(p[2], q[2], c)
 }
 
 func Add64MSaveC(p, q, r, c *[2]uint64) {
-	// ppc64: "ADDC\tR", "ADDZE"
-	// ppc64le: "ADDC\tR", "ADDZE"
+	// ppc64x: "ADDC\tR", "ADDZE"
 	r[0], c[0] = bits.Add64(p[0], q[0], 0)
-	// ppc64: "ADDC\t[$]-1", "ADDE", "ADDZE"
-	// ppc64le: "ADDC\t[$]-1", "ADDE", "ADDZE"
+	// ppc64x: "ADDC\t[$]-1", "ADDE", "ADDZE"
 	r[1], c[1] = bits.Add64(p[1], q[1], c[0])
 }
 
@@ -636,18 +606,14 @@
 	b1, b2 := b[0], b[1]
 	c1, c2 := c[0], c[1]
 
-	// ppc64: "ADDC\tR\\d+,", -"ADDE", -"MOVD\tXER"
-	// ppc64le: "ADDC\tR\\d+,", -"ADDE", -"MOVD\tXER"
+	// ppc64x: "ADDC\tR\\d+,", -"ADDE", -"MOVD\tXER"
 	d1, cx = bits.Add64(a1, b1, 0)
-	// ppc64: "ADDE", -"ADDC", -"MOVD\t.*, XER"
-	// ppc64le: "ADDE", -"ADDC", -"MOVD\t.*, XER"
+	// ppc64x: "ADDE", -"ADDC", -"MOVD\t.*, XER"
 	d2, _ = bits.Add64(a2, b2, cx)
 
-	// ppc64: "ADDC\tR\\d+,", -"ADDE", -"MOVD\tXER"
-	// ppc64le: "ADDC\tR\\d+,", -"ADDE", -"MOVD\tXER"
+	// ppc64x: "ADDC\tR\\d+,", -"ADDE", -"MOVD\tXER"
 	d1, cx = bits.Add64(c1, d1, 0)
-	// ppc64: "ADDE", -"ADDC", -"MOVD\t.*, XER"
-	// ppc64le: "ADDE", -"ADDC", -"MOVD\t.*, XER"
+	// ppc64x: "ADDE", -"ADDC", -"MOVD\t.*, XER"
 	d2, _ = bits.Add64(c2, d2, cx)
 	d[0] = d1
 	d[1] = d2
@@ -661,8 +627,7 @@
 	// amd64:"NEGL","SBBQ","NEGQ"
 	// arm64:"NEGS","SBCS","NGC","NEG",-"ADD",-"SUB",-"CMP"
 	// loong64:"SUBV","SGTU"
-	// ppc64:"SUBC", "SUBE", "SUBZE", "NEG"
-	// ppc64le:"SUBC", "SUBE", "SUBZE", "NEG"
+	// ppc64x:"SUBC", "SUBE", "SUBZE", "NEG"
 	// s390x:"SUBE"
 	// riscv64: "SUB","SLTU"
 	return bits.Sub(x, y, ci)
@@ -672,8 +637,7 @@
 	// amd64:"NEGL","SBBQ","NEGQ"
 	// arm64:"NEGS","SBCS","NGC","NEG",-"ADD",-"SUB",-"CMP"
 	// loong64:"SUBV","SGTU"
-	// ppc64:"SUBC", "SUBE", "SUBZE", "NEG"
-	// ppc64le:"SUBC", "SUBE", "SUBZE", "NEG"
+	// ppc64x:"SUBC", "SUBE", "SUBZE", "NEG"
 	// s390x:"SUBE"
 	// riscv64: "SUB","SLTU"
 	return bits.Sub(x, 7, ci)
@@ -683,8 +647,7 @@
 	// amd64:"SUBQ","SBBQ","NEGQ",-"NEGL"
 	// arm64:"SUBS","NGC","NEG",-"SBCS",-"ADD",-"SUB\t",-"CMP"
 	// loong64:"SUBV","SGTU"
-	// ppc64:"SUBC", -"SUBE", "SUBZE", "NEG"
-	// ppc64le:"SUBC", -"SUBE", "SUBZE", "NEG"
+	// ppc64x:"SUBC", -"SUBE", "SUBZE", "NEG"
 	// s390x:"SUBC"
 	// riscv64: "SUB","SLTU"
 	return bits.Sub(x, y, 0)
@@ -694,8 +657,7 @@
 	// amd64:"NEGL","SBBQ",-"NEGQ"
 	// arm64:"NEGS","SBCS",-"NGC",-"NEG\t",-"ADD",-"SUB",-"CMP"
 	// loong64:"SUBV",-"SGTU"
-	// ppc64:"SUBC", "SUBE", -"SUBZE", -"NEG"
-	// ppc64le:"SUBC", "SUBE", -"SUBZE", -"NEG"
+	// ppc64x:"SUBC", "SUBE", -"SUBZE", -"NEG"
 	// s390x:"SUBE"
 	// riscv64: "SUB",-"SLTU"
 	r, _ := bits.Sub(x, y, ci)
@@ -706,8 +668,7 @@
 	r[0], c = bits.Sub(p[0], q[0], c)
 	// amd64:"SBBQ",-"NEGL",-"NEGQ"
 	// arm64:"SBCS",-"NEGS",-"NGC",-"NEG",-"ADD",-"SUB",-"CMP"
-	// ppc64:-"SUBC", "SUBE", -"SUBZE", -"NEG"
-	// ppc64le:-"SUBC", "SUBE", -"SUBZE", -"NEG"
+	// ppc64x:-"SUBC", "SUBE", -"SUBZE", -"NEG"
 	// s390x:"SUBE"
 	r[1], c = bits.Sub(p[1], q[1], c)
 	r[2], c = bits.Sub(p[2], q[2], c)
@@ -717,8 +678,7 @@
 	// amd64:"NEGL","SBBQ","NEGQ"
 	// arm64:"NEGS","SBCS","NGC","NEG",-"ADD",-"SUB",-"CMP"
 	// loong64:"SUBV","SGTU"
-	// ppc64:"SUBC", "SUBE", "SUBZE", "NEG"
-	// ppc64le:"SUBC", "SUBE", "SUBZE", "NEG"
+	// ppc64x:"SUBC", "SUBE", "SUBZE", "NEG"
 	// s390x:"SUBE"
 	// riscv64: "SUB","SLTU"
 	return bits.Sub64(x, y, ci)
@@ -728,8 +688,7 @@
 	// amd64:"NEGL","SBBQ","NEGQ"
 	// arm64:"NEGS","SBCS","NGC","NEG",-"ADD",-"SUB",-"CMP"
 	// loong64:"SUBV","SGTU"
-	// ppc64:"SUBC", "SUBE", "SUBZE", "NEG"
-	// ppc64le:"SUBC", "SUBE", "SUBZE", "NEG"
+	// ppc64x:"SUBC", "SUBE", "SUBZE", "NEG"
 	// s390x:"SUBE"
 	// riscv64: "SUB","SLTU"
 	return bits.Sub64(x, 7, ci)
@@ -739,8 +698,7 @@
 	// amd64:"SUBQ","SBBQ","NEGQ",-"NEGL"
 	// arm64:"SUBS","NGC","NEG",-"SBCS",-"ADD",-"SUB\t",-"CMP"
 	// loong64:"SUBV","SGTU"
-	// ppc64:"SUBC", -"SUBE", "SUBZE", "NEG"
-	// ppc64le:"SUBC", -"SUBE", "SUBZE", "NEG"
+	// ppc64x:"SUBC", -"SUBE", "SUBZE", "NEG"
 	// s390x:"SUBC"
 	// riscv64: "SUB","SLTU"
 	return bits.Sub64(x, y, 0)
@@ -750,8 +708,7 @@
 	// amd64:"NEGL","SBBQ",-"NEGQ"
 	// arm64:"NEGS","SBCS",-"NGC",-"NEG\t",-"ADD",-"SUB",-"CMP"
 	// loong64:"SUBV",-"SGTU"
-	// ppc64:"SUBC", "SUBE", -"SUBZE", -"NEG"
-	// ppc64le:"SUBC", "SUBE", -"SUBZE", -"NEG"
+	// ppc64x:"SUBC", "SUBE", -"SUBZE", -"NEG"
 	// s390x:"SUBE"
 	// riscv64: "SUB",-"SLTU"
 	r, _ := bits.Sub64(x, y, ci)
@@ -768,11 +725,9 @@
 }
 
 func Sub64MSaveC(p, q, r, c *[2]uint64) {
-	// ppc64:"SUBC\tR\\d+, R\\d+,", "SUBZE", "NEG"
-	// ppc64le:"SUBC\tR\\d+, R\\d+,", "SUBZE", "NEG"
+	// ppc64x:"SUBC\tR\\d+, R\\d+,", "SUBZE", "NEG"
 	r[0], c[0] = bits.Sub64(p[0], q[0], 0)
-	// ppc64:"SUBC\tR\\d+, [$]0,", "SUBE", "SUBZE", "NEG"
-	// ppc64le:"SUBC\tR\\d+, [$]0,", "SUBE", "SUBZE", "NEG"
+	// ppc64x:"SUBC\tR\\d+, [$]0,", "SUBE", "SUBZE", "NEG"
 	r[1], c[1] = bits.Sub64(p[1], q[1], c[0])
 }
 
@@ -846,8 +801,7 @@
 func Mul(x, y uint) (hi, lo uint) {
 	// amd64:"MULQ"
 	// arm64:"UMULH","MUL"
-	// ppc64:"MULHDU","MULLD"
-	// ppc64le:"MULHDU","MULLD"
+	// ppc64x:"MULHDU","MULLD"
 	// s390x:"MLGR"
 	// mips64: "MULVU"
 	return bits.Mul(x, y)
@@ -856,8 +810,7 @@
 func Mul64(x, y uint64) (hi, lo uint64) {
 	// amd64:"MULQ"
 	// arm64:"UMULH","MUL"
-	// ppc64:"MULHDU","MULLD"
-	// ppc64le:"MULHDU","MULLD"
+	// ppc64x:"MULHDU","MULLD"
 	// s390x:"MLGR"
 	// mips64: "MULVU"
 	// riscv64:"MULHU","MUL"
diff --git a/test/codegen/memcombine.go b/test/codegen/memcombine.go
index 8143b6b..0d1c390 100644
--- a/test/codegen/memcombine.go
+++ b/test/codegen/memcombine.go
@@ -20,6 +20,7 @@
 	// s390x:`MOVDBR\s\(.*\),`
 	// arm64:`MOVD\s\(R[0-9]+\),`,-`MOV[BHW]`
 	// ppc64le:`MOVD\s`,-`MOV[BHW]Z`
+	// ppc64:`MOVDBR\s`,-`MOV[BHW]Z`
 	return binary.LittleEndian.Uint64(b)
 }
 
@@ -28,6 +29,7 @@
 	// s390x:`MOVDBR\s\(.*\)\(.*\*1\),`
 	// arm64:`MOVD\s\(R[0-9]+\)\(R[0-9]+\),`,-`MOV[BHW]`
 	// ppc64le:`MOVD\s`,-`MOV[BHW]Z\s`
+	// ppc64:`MOVDBR\s`,-`MOV[BHW]Z\s`
 	return binary.LittleEndian.Uint64(b[idx:])
 }
 
@@ -37,6 +39,7 @@
 	// s390x:`MOVWBR\s\(.*\),`
 	// arm64:`MOVWU\s\(R[0-9]+\),`,-`MOV[BH]`
 	// ppc64le:`MOVWZ\s`,-`MOV[BH]Z\s`
+	// ppc64:`MOVWBR\s`,-`MOV[BH]Z\s`
 	return binary.LittleEndian.Uint32(b)
 }
 
@@ -46,6 +49,7 @@
 	// s390x:`MOVWBR\s\(.*\)\(.*\*1\),`
 	// arm64:`MOVWU\s\(R[0-9]+\)\(R[0-9]+\),`,-`MOV[BH]`
 	// ppc64le:`MOVWZ\s`,-`MOV[BH]Z\s`
+	// ppc64:`MOVWBR\s`,-`MOV[BH]Z\s'
 	return binary.LittleEndian.Uint32(b[idx:])
 }
 
@@ -54,12 +58,14 @@
 	// ppc64le:`MOVHZ\s`,-`MOVBZ`
 	// arm64:`MOVHU\s\(R[0-9]+\),`,-`MOVB`
 	// s390x:`MOVHBR\s\(.*\),`
+	// ppc64:`MOVHBR\s`,-`MOVBZ`
 	return binary.LittleEndian.Uint16(b)
 }
 
 func load_le16_idx(b []byte, idx int) uint16 {
 	// amd64:`MOVWLZX\s\(.*\),`,-`MOVB`,-`OR`
 	// ppc64le:`MOVHZ\s`,-`MOVBZ`
+	// ppc64:`MOVHBR\s`,-`MOVBZ`
 	// arm64:`MOVHU\s\(R[0-9]+\)\(R[0-9]+\),`,-`MOVB`
 	// s390x:`MOVHBR\s\(.*\)\(.*\*1\),`
 	return binary.LittleEndian.Uint16(b[idx:])
@@ -71,6 +77,7 @@
 	// s390x:`MOVD\s\(.*\),`
 	// arm64:`REV`,`MOVD\s\(R[0-9]+\),`,-`MOV[BHW]`,-`REVW`,-`REV16W`
 	// ppc64le:`MOVDBR`,-`MOV[BHW]Z`
+	// ppc64:`MOVD`,-`MOV[BHW]Z`
 	return binary.BigEndian.Uint64(b)
 }
 
@@ -80,6 +87,7 @@
 	// s390x:`MOVD\s\(.*\)\(.*\*1\),`
 	// arm64:`REV`,`MOVD\s\(R[0-9]+\)\(R[0-9]+\),`,-`MOV[WHB]`,-`REVW`,-`REV16W`
 	// ppc64le:`MOVDBR`,-`MOV[BHW]Z`
+	// ppc64:`MOVD`,-`MOV[BHW]Z`
 	return binary.BigEndian.Uint64(b[idx:])
 }
 
@@ -89,6 +97,7 @@
 	// s390x:`MOVWZ\s\(.*\),`
 	// arm64:`REVW`,`MOVWU\s\(R[0-9]+\),`,-`MOV[BH]`,-`REV16W`
 	// ppc64le:`MOVWBR`,-`MOV[BH]Z`
+	// ppc64:`MOVWZ`,-MOV[BH]Z`
 	return binary.BigEndian.Uint32(b)
 }
 
@@ -98,13 +107,15 @@
 	// s390x:`MOVWZ\s\(.*\)\(.*\*1\),`
 	// arm64:`REVW`,`MOVWU\s\(R[0-9]+\)\(R[0-9]+\),`,-`MOV[HB]`,-`REV16W`
 	// ppc64le:`MOVWBR`,-`MOV[BH]Z`
+	// ppc64:`MOVWZ`,-MOV[BH]Z`
 	return binary.BigEndian.Uint32(b[idx:])
 }
 
 func load_be16(b []byte) uint16 {
 	// amd64:`ROLW\s\$8`,-`MOVB`,-`OR`
 	// arm64:`REV16W`,`MOVHU\s\(R[0-9]+\),`,-`MOVB`
-	// ppc64le:`MOVHBR`
+	// ppc64le:`MOVHBR`,-`MOVBZ`
+	// ppc64:`MOVHZ`,-`MOVBZ`
 	// s390x:`MOVHZ\s\(.*\),`,-`OR`,-`ORW`,-`SLD`,-`SLW`
 	return binary.BigEndian.Uint16(b)
 }
@@ -112,7 +123,8 @@
 func load_be16_idx(b []byte, idx int) uint16 {
 	// amd64:`ROLW\s\$8`,-`MOVB`,-`OR`
 	// arm64:`REV16W`,`MOVHU\s\(R[0-9]+\)\(R[0-9]+\),`,-`MOVB`
-	// ppc64le:`MOVHBR`
+	// ppc64le:`MOVHBR`,-`MOVBZ`
+	// ppc64:`MOVHZ`,-`MOVBZ`
 	// s390x:`MOVHZ\s\(.*\)\(.*\*1\),`,-`OR`,-`ORW`,-`SLD`,-`SLW`
 	return binary.BigEndian.Uint16(b[idx:])
 }
@@ -122,6 +134,7 @@
 	// 386:`MOVWLZX\s\([A-Z]+\)`,-`MOVB`,-`OR`
 	// amd64:`MOVWLZX\s\([A-Z]+\)`,-`MOVB`,-`OR`
 	// ppc64le:`MOVHZ\t\(R[0-9]+\)`,-`MOVBZ`
+	// ppc64:`MOVHBR`,-`MOVBZ`
 	return uint16(s[0]) | uint16(s[1])<<8
 }
 
@@ -129,7 +142,8 @@
 	// arm64:`MOVHU\t\(R[0-9]+\)`,-`ORR`,-`MOVB`
 	// 386:`MOVWLZX\s\([A-Z]+\)`,-`MOVB`,-`OR`
 	// amd64:`MOVWLZX\s\([A-Z]+\)`,-`MOVB`,-`OR`
-	// ppc64le:`MOVHZ\t\(R[0-9]+\)`,-`MOVDZ`
+	// ppc64le:`MOVHZ\t\(R[0-9]+\)`,-`MOVBZ`
+	// ppc64:`MOVHBR`,-`MOVBZ`
 	return uint16(s[1])<<8 | uint16(s[0])
 }
 
@@ -138,11 +152,14 @@
 	// 386:`MOVL\s\([A-Z]+\)`,-`MOV[BW]`,-`OR`
 	// amd64:`MOVL\s\([A-Z]+\)`,-`MOV[BW]`,-`OR`
 	// ppc64le:`MOVWZ\t\(R[0-9]+\)`,-`MOV[BH]Z`
+	// ppc64:`MOVWBR`,-MOV[BH]Z`
 	return uint32(s[0]) | uint32(s[1])<<8 | uint32(s[2])<<16 | uint32(s[3])<<24
 }
 
 func load_le_byte4_uint32_inv(s []byte) uint32 {
 	// arm64:`MOVWU\t\(R[0-9]+\)`,-`ORR`,-`MOV[BH]`
+	// ppc64le:`MOVWZ`,-`MOV[BH]Z`
+	// ppc64:`MOVWBR`,-`MOV[BH]Z`
 	return uint32(s[3])<<24 | uint32(s[2])<<16 | uint32(s[1])<<8 | uint32(s[0])
 }
 
@@ -150,11 +167,14 @@
 	// arm64:`MOVD\t\(R[0-9]+\)`,-`ORR`,-`MOV[BHW]`
 	// amd64:`MOVQ\s\([A-Z]+\),\s[A-Z]+`,-`MOV[BWL]\t[^$]`,-`OR`
 	// ppc64le:`MOVD\t\(R[0-9]+\)`,-`MOV[BHW]Z`
+	// ppc64:`MOVDBR`,-`MOVW[WHB]Z`
 	return uint64(s[0]) | uint64(s[1])<<8 | uint64(s[2])<<16 | uint64(s[3])<<24 | uint64(s[4])<<32 | uint64(s[5])<<40 | uint64(s[6])<<48 | uint64(s[7])<<56
 }
 
 func load_le_byte8_uint64_inv(s []byte) uint64 {
 	// arm64:`MOVD\t\(R[0-9]+\)`,-`ORR`,-`MOV[BHW]`
+	// ppc64le:`MOVD`,-`MOV[WHB]Z`
+	// ppc64:`MOVDBR`,-`MOV[WHB]Z`
 	return uint64(s[7])<<56 | uint64(s[6])<<48 | uint64(s[5])<<40 | uint64(s[4])<<32 | uint64(s[3])<<24 | uint64(s[2])<<16 | uint64(s[1])<<8 | uint64(s[0])
 }
 
@@ -162,6 +182,7 @@
 	// arm64:`MOVHU\t\(R[0-9]+\)`,`REV16W`,-`ORR`,-`MOVB`
 	// amd64:`MOVWLZX\s\([A-Z]+\)`,`ROLW`,-`MOVB`,-`OR`
 	// ppc64le:`MOVHBR\t\(R[0-9]+\)`,-`MOVBZ`
+	// ppc64:`MOVHZ`,-`MOVBZ`
 	return uint16(s[0])<<8 | uint16(s[1])
 }
 
@@ -169,11 +190,14 @@
 	// arm64:`MOVHU\t\(R[0-9]+\)`,`REV16W`,-`ORR`,-`MOVB`
 	// amd64:`MOVWLZX\s\([A-Z]+\)`,`ROLW`,-`MOVB`,-`OR`
 	// ppc64le:`MOVHBR\t\(R[0-9]+\)`,-`MOVBZ`
+	// ppc64:`MOVHZ`,-`MOVBZ`
 	return uint16(s[1]) | uint16(s[0])<<8
 }
 
 func load_be_byte4_uint32(s []byte) uint32 {
 	// arm64:`MOVWU\t\(R[0-9]+\)`,`REVW`,-`ORR`,-`REV16W`,-`MOV[BH]`
+	// ppc64le:`MOVWBR`,-`MOV[HB]Z`
+	// ppc64:`MOVWZ`,-`MOV[HB]Z`
 	return uint32(s[0])<<24 | uint32(s[1])<<16 | uint32(s[2])<<8 | uint32(s[3])
 }
 
@@ -181,12 +205,15 @@
 	// arm64:`MOVWU\t\(R[0-9]+\)`,`REVW`,-`ORR`,-`REV16W`,-`MOV[BH]`
 	// amd64/v1,amd64/v2:`MOVL\s\([A-Z]+\)`,`BSWAPL`,-`MOV[BW]`,-`OR`
 	// amd64/v3: `MOVBEL`
+	// ppc64le:`MOVWBR`,-`MOV[HB]Z`
+	// ppc64:`MOVWZ`,-`MOV[HB]Z`
 	return uint32(s[3]) | uint32(s[2])<<8 | uint32(s[1])<<16 | uint32(s[0])<<24
 }
 
 func load_be_byte8_uint64(s []byte) uint64 {
 	// arm64:`MOVD\t\(R[0-9]+\)`,`REV`,-`ORR`,-`REVW`,-`REV16W`,-`MOV[BHW]`
 	// ppc64le:`MOVDBR\t\(R[0-9]+\)`,-`MOV[BHW]Z`
+	// ppc64:`MOVD`,-`MOV[WHB]Z`
 	return uint64(s[0])<<56 | uint64(s[1])<<48 | uint64(s[2])<<40 | uint64(s[3])<<32 | uint64(s[4])<<24 | uint64(s[5])<<16 | uint64(s[6])<<8 | uint64(s[7])
 }
 
@@ -195,6 +222,7 @@
 	// amd64/v1,amd64/v2:`MOVQ\s\([A-Z]+\),\s[A-Z]+`,`BSWAPQ`,-`MOV[BWL]\t[^$]`,-`OR`
 	// amd64/v3: `MOVBEQ`
 	// ppc64le:`MOVDBR\t\(R[0-9]+\)`,-`MOV[BHW]Z`
+	// ppc64:`MOVD`,-`MOV[BHW]Z`
 	return uint64(s[7]) | uint64(s[6])<<8 | uint64(s[5])<<16 | uint64(s[4])<<24 | uint64(s[3])<<32 | uint64(s[2])<<40 | uint64(s[1])<<48 | uint64(s[0])<<56
 }
 
@@ -202,6 +230,8 @@
 	// arm64:`MOVHU\s\(R[0-9]+\)\(R[0-9]+\)`,-`ORR`,-`MOVB`
 	// 386:`MOVWLZX\s\([A-Z]+\)\([A-Z]+`,-`ORL`,-`MOVB`
 	// amd64:`MOVWLZX\s\([A-Z]+\)\([A-Z]+`,-`MOVB`,-`OR`
+	// ppc64le:`MOVHZ`,-`MOVBZ`
+	// ppc64:`MOVHBR`,-`MOVBZ`
 	return uint16(s[idx]) | uint16(s[idx+1])<<8
 }
 
@@ -209,6 +239,8 @@
 	// arm64:`MOVHU\s\(R[0-9]+\)\(R[0-9]+\)`,-`ORR`,-`MOVB`
 	// 386:`MOVWLZX\s\([A-Z]+\)\([A-Z]+`,-`ORL`,-`MOVB`
 	// amd64:`MOVWLZX\s\([A-Z]+\)\([A-Z]+`,-`MOVB`,-`OR`
+	// ppc64le:`MOVHZ`,-`MOVBZ`
+	// ppc64:`MOVHBR`,-`MOVBZ`
 	return uint16(s[idx+1])<<8 | uint16(s[idx])
 }
 
@@ -306,6 +338,32 @@
 	return uint64(s[idx<<3])<<56 | uint64(s[(idx<<3)+1])<<48 | uint64(s[(idx<<3)+2])<<40 | uint64(s[(idx<<3)+3])<<32 | uint64(s[(idx<<3)+4])<<24 | uint64(s[(idx<<3)+5])<<16 | uint64(s[(idx<<3)+6])<<8 | uint64(s[(idx<<3)+7])
 }
 
+// Some tougher cases for the memcombine pass.
+
+func reassoc_load_uint32(b []byte) uint32 {
+	// amd64:`MOVL\s\([A-Z]+\)`,-`MOV[BW]`,-`OR`
+	return (uint32(b[0]) | uint32(b[1])<<8) | (uint32(b[2])<<16 | uint32(b[3])<<24)
+}
+
+func extrashift_load_uint32(b []byte) uint32 {
+	// amd64:`MOVL\s\([A-Z]+\)`,`SHLL\s[$]2`,-`MOV[BW]`,-`OR`
+	return uint32(b[0])<<2 | uint32(b[1])<<10 | uint32(b[2])<<18 | uint32(b[3])<<26
+
+}
+
+func outoforder_load_uint32(b []byte) uint32 {
+	// amd64:`MOVL\s\([A-Z]+\)`,-`MOV[BW]`,-`OR`
+	return uint32(b[0]) | uint32(b[2])<<16 | uint32(b[1])<<8 | uint32(b[3])<<24
+}
+
+func extraOr_load_uint32(b []byte, x, y uint32) uint32 {
+	// amd64:`ORL\s\([A-Z]+\)`,-`MOV[BW]`
+	return x | binary.LittleEndian.Uint32(b) | y
+	// TODO: Note that
+	//   x | uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 | y
+	// doesn't work because it associates in a way that memcombine can't detect it.
+}
+
 // Check load combining across function calls.
 
 func fcall_byte(a [2]byte) [2]byte {
@@ -357,6 +415,7 @@
 	// amd64:`MOVQ\s.*\(.*\)$`,-`SHR.`
 	// arm64:`MOVD`,-`MOV[WBH]`
 	// ppc64le:`MOVD\s`,-`MOV[BHW]\s`
+	// ppc64:`MOVDBR`,-MOVB\s`
 	// s390x:`MOVDBR\s.*\(.*\)$`
 	binary.LittleEndian.PutUint64(b, x)
 }
@@ -365,6 +424,7 @@
 	// amd64:`MOVQ\s.*\(.*\)\(.*\*1\)$`,-`SHR.`
 	// arm64:`MOVD\sR[0-9]+,\s\(R[0-9]+\)\(R[0-9]+\)`,-`MOV[BHW]`
 	// ppc64le:`MOVD\s`,-`MOV[BHW]\s`
+	// ppc64:`MOVDBR`,-`MOVBZ`
 	// s390x:`MOVDBR\s.*\(.*\)\(.*\*1\)$`
 	binary.LittleEndian.PutUint64(b[idx:], x)
 }
@@ -386,7 +446,8 @@
 	_ = b[8]
 	// amd64:-`MOV[BWL]`
 	// arm64:-`MOV[BWH]`
-	// ppc64le:-`MOV[BWH]`
+	// ppc64le:`MOVD\s`,-`MOV[BWH]Z`
+	// ppc64:`MOVDBR`
 	// s390x:-`MOVB`,-`MOV[WH]BR`
 	binary.LittleEndian.PutUint64(b, binary.LittleEndian.Uint64(x[:]))
 }
@@ -395,6 +456,7 @@
 	// amd64:`MOVL\s`
 	// arm64:`MOVW`,-`MOV[BH]`
 	// ppc64le:`MOVW\s`
+	// ppc64:`MOVWBR`
 	// s390x:`MOVWBR\s.*\(.*\)$`
 	binary.LittleEndian.PutUint32(b, x)
 }
@@ -403,12 +465,14 @@
 	// amd64:`MOVL\s`
 	// arm64:`MOVW\sR[0-9]+,\s\(R[0-9]+\)\(R[0-9]+\)`,-`MOV[BH]`
 	// ppc64le:`MOVW\s`
+	// ppc64:`MOVWBR`
 	// s390x:`MOVWBR\s.*\(.*\)\(.*\*1\)$`
 	binary.LittleEndian.PutUint32(b[idx:], x)
 }
 
 func store_le32_idx_const(b []byte, idx int) {
 	// amd64:`MOVL\s\$123, \(.*\)\(.*\*1\)$`
+	// ppc64x:`MOVW\s`,-MOV[HB]`
 	binary.LittleEndian.PutUint32(b[idx:], 123)
 }
 
@@ -416,6 +480,7 @@
 	// amd64:`MOVW\s`
 	// arm64:`MOVH`,-`MOVB`
 	// ppc64le:`MOVH\s`
+	// ppc64:`MOVHBR`
 	// s390x:`MOVHBR\s.*\(.*\)$`
 	binary.LittleEndian.PutUint16(b, x)
 }
@@ -424,12 +489,14 @@
 	// amd64:`MOVW\s`
 	// arm64:`MOVH\sR[0-9]+,\s\(R[0-9]+\)\(R[0-9]+\)`,-`MOVB`
 	// ppc64le:`MOVH\s`
+	// ppc64:`MOVHBR\s`
 	// s390x:`MOVHBR\s.*\(.*\)\(.*\*1\)$`
 	binary.LittleEndian.PutUint16(b[idx:], x)
 }
 
 func store_le16_idx_const(b []byte, idx int) {
 	// amd64:`MOVW\s\$123, \(.*\)\(.*\*1\)$`
+	// ppc64x:`MOVH\s`
 	binary.LittleEndian.PutUint16(b[idx:], 123)
 }
 
@@ -438,6 +505,7 @@
 	// amd64/v3: `MOVBEQ`
 	// arm64:`MOVD`,`REV`,-`MOV[WBH]`,-`REVW`,-`REV16W`
 	// ppc64le:`MOVDBR`
+	// ppc64:`MOVD\s`
 	// s390x:`MOVD\s.*\(.*\)$`,-`SRW\s`,-`SRD\s`
 	binary.BigEndian.PutUint64(b, x)
 }
@@ -447,6 +515,7 @@
 	// amd64/v3:`MOVBEQ\t[A-Z]+[0-9]*, \([A-Z]+[0-9]*\)\([A-Z]+[0-9]*\*1\)`
 	// arm64:`REV`,`MOVD\sR[0-9]+,\s\(R[0-9]+\)\(R[0-9]+\)`,-`MOV[BHW]`,-`REV16W`,-`REVW`
 	// ppc64le:`MOVDBR`
+	// ppc64:`MOVD\s`
 	// s390x:`MOVD\s.*\(.*\)\(.*\*1\)$`,-`SRW\s`,-`SRD\s`
 	binary.BigEndian.PutUint64(b[idx:], x)
 }
@@ -456,6 +525,7 @@
 	// amd64/v3:`MOVBEL`
 	// arm64:`MOVW`,`REVW`,-`MOV[BH]`,-`REV16W`
 	// ppc64le:`MOVWBR`
+	// ppc64:`MOVW\s`
 	// s390x:`MOVW\s.*\(.*\)$`,-`SRW\s`,-`SRD\s`
 	binary.BigEndian.PutUint32(b, x)
 }
@@ -477,6 +547,7 @@
 	// amd64/v3:`MOVBEL\t[A-Z]+[0-9]*, \([A-Z]+[0-9]*\)\([A-Z]+[0-9]*\*1\)`
 	// arm64:`REVW`,`MOVW\sR[0-9]+,\s\(R[0-9]+\)\(R[0-9]+\)`,-`MOV[BH]`,-`REV16W`
 	// ppc64le:`MOVWBR`
+	// ppc64:`MOVW\s`
 	// s390x:`MOVW\s.*\(.*\)\(.*\*1\)$`,-`SRW\s`,-`SRD\s`
 	binary.BigEndian.PutUint32(b[idx:], x)
 }
@@ -486,6 +557,7 @@
 	// amd64/v3:`MOVBEW`,-`ROLW`
 	// arm64:`MOVH`,`REV16W`,-`MOVB`
 	// ppc64le:`MOVHBR`
+	// ppc64:`MOVH\s`
 	// s390x:`MOVH\s.*\(.*\)$`,-`SRW\s`,-`SRD\s`
 	binary.BigEndian.PutUint16(b, x)
 }
@@ -495,6 +567,7 @@
 	// amd64/v3:`MOVBEW\t[A-Z]+[0-9]*, \([A-Z]+[0-9]*\)\([A-Z]+[0-9]*\*1\)`
 	// arm64:`MOVH\sR[0-9]+,\s\(R[0-9]+\)\(R[0-9]+\)`,`REV16W`,-`MOVB`
 	// ppc64le:`MOVHBR`
+	// ppc64:`MOVH\s`
 	// s390x:`MOVH\s.*\(.*\)\(.*\*1\)$`,-`SRW\s`,-`SRD\s`
 	binary.BigEndian.PutUint16(b[idx:], x)
 }
@@ -504,6 +577,8 @@
 	// arm64:`MOVH\sR[0-9]+,\s1\(R[0-9]+\)`,-`MOVB`
 	// 386:`MOVW\s[A-Z]+,\s1\([A-Z]+\)`,-`MOVB`
 	// amd64:`MOVW\s[A-Z]+,\s1\([A-Z]+\)`,-`MOVB`
+	// ppc64le:`MOVH\s`,-`MOVB`
+	// ppc64:`MOVHBR`,-`MOVB`
 	b[1], b[2] = byte(val), byte(val>>8)
 }
 
@@ -511,6 +586,8 @@
 	_ = b[2]
 	// 386:`MOVW\s[A-Z]+,\s1\([A-Z]+\)`,-`MOVB`
 	// amd64:`MOVW\s[A-Z]+,\s1\([A-Z]+\)`,-`MOVB`
+	// ppc64le:`MOVH\s`,-`MOVB`
+	// ppc64:`MOVHBR`,-`MOVB`
 	b[2], b[1] = byte(val>>8), byte(val)
 }
 
@@ -519,6 +596,8 @@
 	// arm64:`MOVW\sR[0-9]+,\s1\(R[0-9]+\)`,-`MOVB`,-`MOVH`
 	// 386:`MOVL\s[A-Z]+,\s1\([A-Z]+\)`,-`MOVB`,-`MOVW`
 	// amd64:`MOVL\s[A-Z]+,\s1\([A-Z]+\)`,-`MOVB`,-`MOVW`
+	// ppc64le:`MOVW\s`
+	// ppc64:`MOVWBR\s`
 	b[1], b[2], b[3], b[4] = byte(val), byte(val>>8), byte(val>>16), byte(val>>24)
 }
 
@@ -526,6 +605,8 @@
 	_ = b[8]
 	// arm64:`MOVD\sR[0-9]+,\s1\(R[0-9]+\)`,-`MOVB`,-`MOVH`,-`MOVW`
 	// amd64:`MOVQ\s[A-Z]+,\s1\([A-Z]+\)`,-`MOVB`,-`MOVW`,-`MOVL`
+	// ppc64le:`MOVD\s`,-`MOVW`
+	// ppc64:`MOVDBR\s`
 	b[1], b[2], b[3], b[4], b[5], b[6], b[7], b[8] = byte(val), byte(val>>8), byte(val>>16), byte(val>>24), byte(val>>32), byte(val>>40), byte(val>>48), byte(val>>56)
 }
 
@@ -534,6 +615,8 @@
 	// arm64:`REV16W`,`MOVH\sR[0-9]+,\s1\(R[0-9]+\)`,-`MOVB`
 	// amd64/v1,amd64/v2:`MOVW\s[A-Z]+,\s1\([A-Z]+\)`,-`MOVB`
 	// amd64/v3: `MOVBEW`
+	// ppc64le:`MOVHBR`
+	// ppc64:`MOVH\s`
 	b[1], b[2] = byte(val>>8), byte(val)
 }
 
@@ -542,6 +625,8 @@
 	// arm64:`REVW`,`MOVW\sR[0-9]+,\s1\(R[0-9]+\)`,-`MOVB`,-`MOVH`,-`REV16W`
 	// amd64/v1,amd64/v2:`MOVL\s[A-Z]+,\s1\([A-Z]+\)`,-`MOVB`,-`MOVW`
 	// amd64/v3:`MOVBEL\s[A-Z]+,\s1\([A-Z]+\)`
+	// ppc64le:`MOVWBR`
+	// ppc64:`MOVW\s`
 	b[1], b[2], b[3], b[4] = byte(val>>24), byte(val>>16), byte(val>>8), byte(val)
 }
 
@@ -550,6 +635,8 @@
 	// arm64:`REV`,`MOVD\sR[0-9]+,\s1\(R[0-9]+\)`,-`MOVB`,-`MOVH`,-`MOVW`,-`REV16W`,-`REVW`
 	// amd64/v1,amd64/v2:`MOVQ\s[A-Z]+,\s1\([A-Z]+\)`,-`MOVB`,-`MOVW`,-`MOVL`
 	// amd64/v3:`MOVBEQ\s[A-Z]+,\s1\([A-Z]+\)`, -`MOVBEL`
+	// ppc64le:`MOVDBR`
+	// ppc64:`MOVD`
 	b[1], b[2], b[3], b[4], b[5], b[6], b[7], b[8] = byte(val>>56), byte(val>>48), byte(val>>40), byte(val>>32), byte(val>>24), byte(val>>16), byte(val>>8), byte(val)
 }
 
@@ -557,54 +644,72 @@
 	_, _ = b[idx+0], b[idx+1]
 	// arm64:`MOVH\sR[0-9]+,\s\(R[0-9]+\)\(R[0-9]+\)`,-`MOVB`
 	// 386:`MOVW\s[A-Z]+,\s\([A-Z]+\)\([A-Z]+`,-`MOVB`
+	// ppc64le:`MOVH\s`
+	// ppc64:`MOVHBR`
 	b[idx+1], b[idx+0] = byte(val>>8), byte(val)
 }
 
 func store_le_byte_2_idx_inv(b []byte, idx int, val uint16) {
 	_, _ = b[idx+0], b[idx+1]
 	// 386:`MOVW\s[A-Z]+,\s\([A-Z]+\)\([A-Z]+`,-`MOVB`
+	// ppc64le:`MOVH\s`
+	// ppc64:`MOVHBR`
 	b[idx+0], b[idx+1] = byte(val), byte(val>>8)
 }
 
 func store_le_byte_4_idx(b []byte, idx int, val uint32) {
 	_, _, _, _ = b[idx+0], b[idx+1], b[idx+2], b[idx+3]
 	// arm64:`MOVW\sR[0-9]+,\s\(R[0-9]+\)\(R[0-9]+\)`,-`MOVB`,-`MOVH`
+	// ppc64le:`MOVW\s`
+	// ppc64:`MOVWBR`
 	b[idx+3], b[idx+2], b[idx+1], b[idx+0] = byte(val>>24), byte(val>>16), byte(val>>8), byte(val)
 }
 
 func store_be_byte_2_idx(b []byte, idx int, val uint16) {
 	_, _ = b[idx+0], b[idx+1]
 	// arm64:`REV16W`,`MOVH\sR[0-9]+,\s\(R[0-9]+\)\(R[0-9]+\)`,-`MOVB`
+	// ppc64le:`MOVHBR`
+	// ppc64:`MOVH\s`
 	b[idx+0], b[idx+1] = byte(val>>8), byte(val)
 }
 
 func store_be_byte_4_idx(b []byte, idx int, val uint32) {
 	_, _, _, _ = b[idx+0], b[idx+1], b[idx+2], b[idx+3]
 	// arm64:`REVW`,`MOVW\sR[0-9]+,\s\(R[0-9]+\)\(R[0-9]+\)`,-`MOVB`,-`MOVH`,-`REV16W`
+	// ppc64le:`MOVWBR`
+	// ppc64:`MOVW\s`
 	b[idx+0], b[idx+1], b[idx+2], b[idx+3] = byte(val>>24), byte(val>>16), byte(val>>8), byte(val)
 }
 
 func store_be_byte_2_idx2(b []byte, idx int, val uint16) {
 	_, _ = b[(idx<<1)+0], b[(idx<<1)+1]
 	// arm64:`REV16W`,`MOVH\sR[0-9]+,\s\(R[0-9]+\)\(R[0-9]+<<1\)`,-`MOVB`
+	// ppc64le:`MOVHBR`
+	// ppc64:`MOVH\s`
 	b[(idx<<1)+0], b[(idx<<1)+1] = byte(val>>8), byte(val)
 }
 
 func store_le_byte_2_idx2(b []byte, idx int, val uint16) {
 	_, _ = b[(idx<<1)+0], b[(idx<<1)+1]
 	// arm64:`MOVH\sR[0-9]+,\s\(R[0-9]+\)\(R[0-9]+<<1\)`,-`MOVB`
+	// ppc64le:`MOVH\s`
+	// ppc64:`MOVHBR`
 	b[(idx<<1)+1], b[(idx<<1)+0] = byte(val>>8), byte(val)
 }
 
 func store_be_byte_4_idx4(b []byte, idx int, val uint32) {
 	_, _, _, _ = b[(idx<<2)+0], b[(idx<<2)+1], b[(idx<<2)+2], b[(idx<<2)+3]
 	// arm64:`REVW`,`MOVW\sR[0-9]+,\s\(R[0-9]+\)\(R[0-9]+<<2\)`,-`MOVB`,-`MOVH`,-`REV16W`
+	// ppc64le:`MOVWBR`
+	// ppc64:`MOVW\s`
 	b[(idx<<2)+0], b[(idx<<2)+1], b[(idx<<2)+2], b[(idx<<2)+3] = byte(val>>24), byte(val>>16), byte(val>>8), byte(val)
 }
 
 func store_le_byte_4_idx4_inv(b []byte, idx int, val uint32) {
 	_, _, _, _ = b[(idx<<2)+0], b[(idx<<2)+1], b[(idx<<2)+2], b[(idx<<2)+3]
 	// arm64:`MOVW\sR[0-9]+,\s\(R[0-9]+\)\(R[0-9]+<<2\)`,-`MOVB`,-`MOVH`
+	// ppc64le:`MOVW\s`
+	// ppc64:`MOVWBR`
 	b[(idx<<2)+3], b[(idx<<2)+2], b[(idx<<2)+1], b[(idx<<2)+0] = byte(val>>24), byte(val>>16), byte(val>>8), byte(val)
 }
 
@@ -620,10 +725,12 @@
 	// arm64:"MOVH\tZR",-"MOVB"
 	// amd64:`MOVW\s[$]0,\s\([A-Z]+\)`
 	// 386:`MOVW\s[$]0,\s\([A-Z]+\)`
+	// ppc64x:`MOVH\s`
 	b1[0], b1[1] = 0, 0
 	// arm64:"MOVH\tZR",-"MOVB"
 	// 386:`MOVW\s[$]0,\s\([A-Z]+\)`
 	// amd64:`MOVW\s[$]0,\s\([A-Z]+\)`
+	// ppc64x:`MOVH`
 	b2[1], b2[0] = 0, 0
 }
 
@@ -632,8 +739,10 @@
 	// arm64:"MOVW\tZR",-"MOVB",-"MOVH"
 	// amd64:`MOVL\s[$]0,\s\([A-Z]+\)`
 	// 386:`MOVL\s[$]0,\s\([A-Z]+\)`
+	// ppc64x:`MOVW\s`
 	b1[0], b1[1], b1[2], b1[3] = 0, 0, 0, 0
 	// arm64:"MOVW\tZR",-"MOVB",-"MOVH"
+	// ppc64x:`MOVW\s`
 	b2[2], b2[3], b2[1], b2[0] = 0, 0, 0, 0
 }
 
@@ -662,12 +771,14 @@
 func zero_byte_2_idx(b []byte, idx int) {
 	_, _ = b[idx+0], b[idx+1]
 	// arm64:`MOVH\sZR,\s\(R[0-9]+\)\(R[0-9]+\)`,-`MOVB`
+	// ppc64x:`MOVH\s`
 	b[idx+0], b[idx+1] = 0, 0
 }
 
 func zero_byte_2_idx2(b []byte, idx int) {
 	_, _ = b[(idx<<1)+0], b[(idx<<1)+1]
 	// arm64:`MOVH\sZR,\s\(R[0-9]+\)\(R[0-9]+<<1\)`,-`MOVB`
+	// ppc64x:`MOVH\s`
 	b[(idx<<1)+0], b[(idx<<1)+1] = 0, 0
 }
 
@@ -676,10 +787,12 @@
 	// arm64:"MOVW\tZR",-"MOVB",-"MOVH"
 	// amd64:`MOVL\s[$]0,\s\([A-Z]+\)`
 	// 386:`MOVL\s[$]0,\s\([A-Z]+\)`
+	// ppc64x:`MOVW\s`
 	h1[0], h1[1] = 0, 0
 	// arm64:"MOVW\tZR",-"MOVB",-"MOVH"
 	// amd64:`MOVL\s[$]0,\s\([A-Z]+\)`
 	// 386:`MOVL\s[$]0,\s\([A-Z]+\)`
+	// ppc64x:`MOVW`
 	h2[1], h2[0] = 0, 0
 }
 
@@ -687,8 +800,10 @@
 	_, _ = h1[3], h2[3]
 	// arm64:"MOVD\tZR",-"MOVB",-"MOVH",-"MOVW"
 	// amd64:`MOVQ\s[$]0,\s\([A-Z]+\)`
+	// ppc64x:`MOVD\s`
 	h1[0], h1[1], h1[2], h1[3] = 0, 0, 0, 0
 	// arm64:"MOVD\tZR",-"MOVB",-"MOVH",-"MOVW"
+	// ppc64x:`MOVD\s`
 	h2[2], h2[3], h2[1], h2[0] = 0, 0, 0, 0
 }
 
@@ -702,9 +817,11 @@
 	_, _ = w1[1], w2[1]
 	// arm64:"MOVD\tZR",-"MOVB",-"MOVH",-"MOVW"
 	// amd64:`MOVQ\s[$]0,\s\([A-Z]+\)`
+	// ppc64x:`MOVD\s`
 	w1[0], w1[1] = 0, 0
 	// arm64:"MOVD\tZR",-"MOVB",-"MOVH",-"MOVW"
 	// amd64:`MOVQ\s[$]0,\s\([A-Z]+\)`
+	// ppc64x:`MOVD\s`
 	w2[1], w2[0] = 0, 0
 }
 
diff --git a/test/codegen/memops_bigoffset.go b/test/codegen/memops_bigoffset.go
new file mode 100644
index 0000000..d34531d7
--- /dev/null
+++ b/test/codegen/memops_bigoffset.go
@@ -0,0 +1,71 @@
+// asmcheck
+
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package codegen
+
+type big1 struct {
+	w [1<<30 - 1]uint32
+}
+type big2 struct {
+	d [1<<29 - 1]uint64
+}
+
+func loadLargeOffset(sw *big1, sd *big2) (uint32, uint64) {
+
+	// ppc64x:`MOVWZ\s+[0-9]+\(R[0-9]+\)`,-`ADD`
+	a3 := sw.w[1<<10]
+	// ppc64le/power10:`MOVWZ\s+[0-9]+\(R[0-9]+\),\sR[0-9]+`,-`ADD`
+	// ppc64x/power9:`ADD`,`MOVWZ\s+\(R[0-9]+\),\sR[0-9]+`
+	// ppc64x/power8:`ADD`,`MOVWZ\s+\(R[0-9]+\),\sR[0-9]+`
+	b3 := sw.w[1<<16]
+	// ppc64le/power10:`MOVWZ\s+[0-9]+\(R[0-9]+\),\sR[0-9]+`,-`ADD`
+	// ppc64x/power9:`ADD`,`MOVWZ\s+\(R[0-9]+\),\sR[0-9]+`
+	// ppc64x/power8:`ADD`,`MOVWZ\s+\(R[0-9]+\),\sR[0-9]+`
+	c3 := sw.w[1<<28]
+	// ppc64x:`MOVWZ\s+\(R[0-9]+\)\(R[0-9]+\),\sR[0-9]+`
+	d3 := sw.w[1<<29]
+	// ppc64x:`MOVD\s+[0-9]+\(R[0-9]+\)`,-`ADD`
+	a4 := sd.d[1<<10]
+	// ppc64le/power10:`MOVD\s+[0-9]+\(R[0-9]+\)`,-`ADD`
+	// ppc64x/power9:`ADD`,`MOVD\s+\(R[0-9]+\),\sR[0-9]+`
+	// ppc64x/power8:`ADD`,`MOVD\s+\(R[0-9]+\),\sR[0-9]+`
+	b4 := sd.d[1<<16]
+	// ppc64le/power10`:`MOVD\s+[0-9]+\(R[0-9]+\)`,-`ADD`
+	// ppc64x/power9:`ADD`,`MOVD\s+\(R[0-9]+\),\sR[0-9]+`
+	// ppc64x/power8:`ADD`,`MOVD\s+\(R[0-9]+\),\sR[0-9]+`
+	c4 := sd.d[1<<27]
+	// ppc64x:`MOVD\s+\(R[0-9]+\)\(R[0-9]+\),\sR[0-9]+`
+	d4 := sd.d[1<<28]
+
+	return a3 + b3 + c3 + d3, a4 + b4 + c4 + d4
+}
+
+func storeLargeOffset(sw *big1, sd *big2) {
+	// ppc64x:`MOVW\s+R[0-9]+,\s[0-9]+\(R[0-9]+\)`,-`ADD`
+	sw.w[1<<10] = uint32(10)
+	// ppc64le/power10:`MOVW\s+R[0-9]+,\s[0-9]+\(R[0-9]+\)`,-`ADD`
+	// ppc64x/power9:`MOVW\s+R[0-9]+\,\s\(R[0-9]+\)`,`ADD`
+	// ppc64x/power8:`MOVW\s+R[0-9]+\,\s\(R[0-9]+\)`,`ADD`
+	sw.w[1<<16] = uint32(20)
+	// ppc64le/power10:`MOVW\s+R[0-9]+,\s[0-9]+\(R[0-9]+\)`,-`ADD`
+	// ppc64x/power9:`MOVW\s+R[0-9]+,\s\(R[0-9]+\)`,`ADD`
+	// ppc64x/power8:`MOVW\s+R[0-9]+,\s\(R[0-9]+\)`,`ADD`
+	sw.w[1<<28] = uint32(30)
+	// ppc64x:`MOVW\s+R[0-9]+,\s\(R[0-9]+\)`
+	sw.w[1<<29] = uint32(40)
+	// ppc64x:`MOVD\s+R[0-9]+,\s[0-9]+\(R[0-9]+\)`,-`ADD`
+	sd.d[1<<10] = uint64(40)
+	// ppc64le/power10:`MOVD\s+R[0-9]+,\s[0-9]+\(R[0-9]+\)`,-`ADD`
+	// ppc64x/power9:`MOVD\s+R[0-9]+,\s\(R[0-9]+\)`,`ADD`
+	// ppc64x/power8:`MOVD\s+R[0-9]+,\s\(R[0-9]+\)`,`ADD`
+	sd.d[1<<16] = uint64(50)
+	// ppc64le/power10`:`MOVD\s+R[0-9]+,\s[0-9]+\(R[0-9]+\)`,-`ADD`
+	// ppc64x/power9:`MOVD\s+R[0-9]+,\s\(R[0-9]+\)`,`ADD`
+	// ppc64x/power8:`MOVD\s+R[0-9]+,\s\(R[0-9]+\)`,`ADD`
+	sd.d[1<<27] = uint64(60)
+	// ppc64x:`MOVD\s+R[0-9]+,\s\(R[0-9]+\)`
+	sd.d[1<<28] = uint64(70)
+}
diff --git a/test/codegen/noextend.go b/test/codegen/noextend.go
index d8e2917..e4081e3 100644
--- a/test/codegen/noextend.go
+++ b/test/codegen/noextend.go
@@ -24,125 +24,101 @@
 func set16(x8 int8, u8 *uint8, y8 int8, z8 uint8) {
 	// Truncate not needed, load does sign/zero extend
 
-	// ppc64:-"MOVBZ\tR\\d+,\\sR\\d+"
-	// ppc64le:-"MOVBZ\tR\\d+,\\sR\\d+"
+	// ppc64x:-"MOVBZ\tR\\d+,\\sR\\d+"
 	val16[0] = uint16(*u8)
 
 	// AND not needed due to size
-	// ppc64:-"ANDCC"
-	// ppc64le:-"ANDCC"
+	// ppc64x:-"ANDCC"
 	sval16[1] = 255 & int16(x8+y8)
 
-	// ppc64:-"ANDCC"
-	// ppc64le:-"ANDCC"
+	// ppc64x:-"ANDCC"
 	val16[1] = 255 & uint16(*u8+z8)
 
 }
 func shiftidx(u8 *uint8, x16 *int16, u16 *uint16) {
 
-	// ppc64:-"MOVBZ\tR\\d+,\\sR\\d+"
-	// ppc64le:-"MOVBZ\tR\\d+,\\sR\\d+"
+	// ppc64x:-"MOVBZ\tR\\d+,\\sR\\d+"
 	val16[0] = uint16(sval16[*u8>>2])
 
-	// ppc64:-"MOVH\tR\\d+,\\sR\\d+"
-	// ppc64le:-"MOVH\tR\\d+,\\sR\\d+"
+	// ppc64x:-"MOVH\tR\\d+,\\sR\\d+"
 	sval16[1] = int16(val16[*x16>>1])
 
-	// ppc64:-"MOVHZ\tR\\d+,\\sR\\d+"
-	// ppc64le:-"MOVHZ\tR\\d+,\\sR\\d+"
+	// ppc64x:-"MOVHZ\tR\\d+,\\sR\\d+"
 	val16[1] = uint16(sval16[*u16>>2])
 
 }
 
 func setnox(x8 int8, u8 *uint8, y8 *int8, z8 *uint8, x16 *int16, u16 *uint16, x32 *int32, u32 *uint32) {
 
-	// ppc64:-"MOVBZ\tR\\d+,\\sR\\d+"
-	// ppc64le:-"MOVBZ\tR\\d+,\\sR\\d+"
+	// ppc64x:-"MOVBZ\tR\\d+,\\sR\\d+"
 	val16[0] = uint16(*u8)
 
 	// AND not needed due to size
-	// ppc64:-"ANDCC"
-	// ppc64le:-"ANDCC"
+	// ppc64x:-"ANDCC"
 	sval16[1] = 255 & int16(x8+*y8)
 
-	// ppc64:-"ANDCC"
-	// ppc64le:-"ANDCC"
+	// ppc64x:-"ANDCC"
 	val16[1] = 255 & uint16(*u8+*z8)
 
-	// ppc64:-"MOVH\tR\\d+,\\sR\\d+"
-	// ppc64le:-"MOVH\tR\\d+,\\sR\\d+"
+	// ppc64x:-"MOVH\tR\\d+,\\sR\\d+"
 	sval32[1] = int32(*x16)
 
-	//ppc64:-"MOVBZ\tR\\d+,\\sR\\d+"
-	//ppc64le:-"MOVBZ\tR\\d+,\\sR\\d+"
+	// ppc64x:-"MOVBZ\tR\\d+,\\sR\\d+"
 	val32[0] = uint32(*u8)
 
-	// ppc64:-"MOVHZ\tR\\d+,\\sR\\d+"
-	// ppc64le:-"MOVHZ\tR\\d+,\\sR\\d+"
+	// ppc64x:-"MOVHZ\tR\\d+,\\sR\\d+"
 	val32[1] = uint32(*u16)
 
-	// ppc64:-"MOVH\tR\\d+,\\sR\\d+"
-	// ppc64le:-"MOVH\tR\\d+,\\sR\\d+"
+	// ppc64x:-"MOVH\tR\\d+,\\sR\\d+"
 	sval64[1] = int64(*x16)
 
-	// ppc64:-"MOVW\tR\\d+,\\sR\\d+"
-	// ppc64le:-"MOVW\tR\\d+,\\sR\\d+"
+	// ppc64x:-"MOVW\tR\\d+,\\sR\\d+"
 	sval64[2] = int64(*x32)
 
-	//ppc64:-"MOVBZ\tR\\d+,\\sR\\d+"
-	//ppc64le:-"MOVBZ\tR\\d+,\\sR\\d+"
+	// ppc64x:-"MOVBZ\tR\\d+,\\sR\\d+"
 	val64[0] = uint64(*u8)
 
-	// ppc64:-"MOVHZ\tR\\d+,\\sR\\d+"
-	// ppc64le:-"MOVHZ\tR\\d+,\\sR\\d+"
+	// ppc64x:-"MOVHZ\tR\\d+,\\sR\\d+"
 	val64[1] = uint64(*u16)
 
-	// ppc64:-"MOVWZ\tR\\d+,\\sR\\d+"
-	// ppc64le:-"MOVWZ\tR\\d+,\\sR\\d+"
+	// ppc64x:-"MOVWZ\tR\\d+,\\sR\\d+"
 	val64[2] = uint64(*u32)
 }
 
 func cmp16(u8 *uint8, x32 *int32, u32 *uint32, x64 *int64, u64 *uint64) bool {
 
-	// ppc64:-"MOVBZ\tR\\d+,\\sR\\d+"
-	// ppc64le:-"MOVBZ\tR\\d+,\\sR\\d+"
+	// ppc64x:-"MOVBZ\tR\\d+,\\sR\\d+"
 	if uint16(*u8) == val16[0] {
 		return true
 	}
 
-	// ppc64:-"MOVHZ\tR\\d+,\\sR\\d+"
-	// ppc64le:-"MOVHZ\tR\\d+,\\sR\\d+"
+	// ppc64x:-"MOVHZ\tR\\d+,\\sR\\d+"
 	if uint16(*u32>>16) == val16[0] {
 		return true
 	}
 
-	// ppc64:-"MOVHZ\tR\\d+,\\sR\\d+"
-	// ppc64le:-"MOVHZ\tR\\d+,\\sR\\d+"
+	// ppc64x:-"MOVHZ\tR\\d+,\\sR\\d+"
 	if uint16(*u64>>48) == val16[0] {
 		return true
 	}
 
 	// Verify the truncates are using the correct sign.
-	// ppc64:-"MOVHZ\tR\\d+,\\sR\\d+"
-	// ppc64le:-"MOVHZ\tR\\d+,\\sR\\d+"
+	// ppc64x:-"MOVHZ\tR\\d+,\\sR\\d+"
 	if int16(*x32) == sval16[0] {
 		return true
 	}
 
-	// ppc64:-"MOVH\tR\\d+,\\sR\\d+"
-	// ppc64le:-"MOVH\tR\\d+,\\sR\\d+"
+	// ppc64x:-"MOVH\tR\\d+,\\sR\\d+"
 	if uint16(*u32) == val16[0] {
 		return true
 	}
 
-	// ppc64:-"MOVHZ\tR\\d+,\\sR\\d+"
-	// ppc64le:-"MOVHZ\tR\\d+,\\sR\\d+"
+	// ppc64x:-"MOVHZ\tR\\d+,\\sR\\d+"
 	if int16(*x64) == sval16[0] {
 		return true
 	}
 
-	// ppc64:-"MOVH\tR\\d+,\\sR\\d+"
-	// ppc64le:-"MOVH\tR\\d+,\\sR\\d+"
+	// ppc64x:-"MOVH\tR\\d+,\\sR\\d+"
 	if uint16(*u64) == val16[0] {
 		return true
 	}
@@ -152,33 +128,28 @@
 
 func cmp32(u8 *uint8, x16 *int16, u16 *uint16, x64 *int64, u64 *uint64) bool {
 
-	// ppc64:-"MOVBZ\tR\\d+,\\sR\\d+"
-	// ppc64le:-"MOVBZ\tR\\d+,\\sR\\d+"
+	// ppc64x:-"MOVBZ\tR\\d+,\\sR\\d+"
 	if uint32(*u8) == val32[0] {
 		return true
 	}
 
-	// ppc64:-"MOVH\tR\\d+,\\sR\\d+"
-	// ppc64le:-"MOVH\tR\\d+,\\sR\\d+"
+	// ppc64x:-"MOVH\tR\\d+,\\sR\\d+"
 	if int32(*x16) == sval32[0] {
 		return true
 	}
 
-	// ppc64:-"MOVHZ\tR\\d+,\\sR\\d+"
-	// ppc64le:-"MOVHZ\tR\\d+,\\sR\\d+"
+	// ppc64x:-"MOVHZ\tR\\d+,\\sR\\d+"
 	if uint32(*u16) == val32[0] {
 		return true
 	}
 
 	// Verify the truncates are using the correct sign.
-	// ppc64:-"MOVWZ\tR\\d+,\\sR\\d+"
-	// ppc64le:-"MOVWZ\tR\\d+,\\sR\\d+"
+	// ppc64x:-"MOVWZ\tR\\d+,\\sR\\d+"
 	if int32(*x64) == sval32[0] {
 		return true
 	}
 
-	// ppc64:-"MOVW\tR\\d+,\\sR\\d+"
-	// ppc64le:-"MOVW\tR\\d+,\\sR\\d+"
+	// ppc64x:-"MOVW\tR\\d+,\\sR\\d+"
 	if uint32(*u64) == val32[0] {
 		return true
 	}
@@ -188,32 +159,27 @@
 
 func cmp64(u8 *uint8, x16 *int16, u16 *uint16, x32 *int32, u32 *uint32) bool {
 
-	// ppc64:-"MOVBZ\tR\\d+,\\sR\\d+"
-	// ppc64le:-"MOVBZ\tR\\d+,\\sR\\d+"
+	// ppc64x:-"MOVBZ\tR\\d+,\\sR\\d+"
 	if uint64(*u8) == val64[0] {
 		return true
 	}
 
-	// ppc64:-"MOVH\tR\\d+,\\sR\\d+"
-	// ppc64le:-"MOVH\tR\\d+,\\sR\\d+"
+	// ppc64x:-"MOVH\tR\\d+,\\sR\\d+"
 	if int64(*x16) == sval64[0] {
 		return true
 	}
 
-	// ppc64:-"MOVHZ\tR\\d+,\\sR\\d+"
-	// ppc64le:-"MOVHZ\tR\\d+,\\sR\\d+"
+	// ppc64x:-"MOVHZ\tR\\d+,\\sR\\d+"
 	if uint64(*u16) == val64[0] {
 		return true
 	}
 
-	// ppc64:-"MOVW\tR\\d+,\\sR\\d+"
-	// ppc64le:-"MOVW\tR\\d+,\\sR\\d+"
+	// ppc64x:-"MOVW\tR\\d+,\\sR\\d+"
 	if int64(*x32) == sval64[0] {
 		return true
 	}
 
-	// ppc64:-"MOVWZ\tR\\d+,\\sR\\d+"
-	// ppc64le:-"MOVWZ\tR\\d+,\\sR\\d+"
+	// ppc64x:-"MOVWZ\tR\\d+,\\sR\\d+"
 	if uint64(*u32) == val64[0] {
 		return true
 	}
diff --git a/test/codegen/rotate.go b/test/codegen/rotate.go
index b22288f..5495f86 100644
--- a/test/codegen/rotate.go
+++ b/test/codegen/rotate.go
@@ -16,32 +16,28 @@
 	var a uint64
 
 	// amd64:"ROLQ\t[$]7"
-	// ppc64:"ROTL\t[$]7"
-	// ppc64le:"ROTL\t[$]7"
+	// ppc64x:"ROTL\t[$]7"
 	// loong64: "ROTRV\t[$]57"
 	a += x<<7 | x>>57
 
 	// amd64:"ROLQ\t[$]8"
 	// arm64:"ROR\t[$]56"
 	// s390x:"RISBGZ\t[$]0, [$]63, [$]8, "
-	// ppc64:"ROTL\t[$]8"
-	// ppc64le:"ROTL\t[$]8"
+	// ppc64x:"ROTL\t[$]8"
 	// loong64: "ROTRV\t[$]56"
 	a += x<<8 + x>>56
 
 	// amd64:"ROLQ\t[$]9"
 	// arm64:"ROR\t[$]55"
 	// s390x:"RISBGZ\t[$]0, [$]63, [$]9, "
-	// ppc64:"ROTL\t[$]9"
-	// ppc64le:"ROTL\t[$]9"
+	// ppc64x:"ROTL\t[$]9"
 	// loong64: "ROTRV\t[$]55"
 	a += x<<9 ^ x>>55
 
 	// amd64:"ROLQ\t[$]10"
 	// arm64:"ROR\t[$]54"
 	// s390x:"RISBGZ\t[$]0, [$]63, [$]10, "
-	// ppc64:"ROTL\t[$]10"
-	// ppc64le:"ROTL\t[$]10"
+	// ppc64x:"ROTL\t[$]10"
 	// arm64:"ROR\t[$]54"
 	// s390x:"RISBGZ\t[$]0, [$]63, [$]10, "
 	// loong64: "ROTRV\t[$]54"
@@ -55,8 +51,7 @@
 
 	// amd64:"ROLL\t[$]7"
 	// arm:"MOVW\tR\\d+@>25"
-	// ppc64:"ROTLW\t[$]7"
-	// ppc64le:"ROTLW\t[$]7"
+	// ppc64x:"ROTLW\t[$]7"
 	// loong64: "ROTR\t[$]25"
 	a += x<<7 | x>>25
 
@@ -64,8 +59,7 @@
 	// arm:"MOVW\tR\\d+@>24"
 	// arm64:"RORW\t[$]24"
 	// s390x:"RLL\t[$]8"
-	// ppc64:"ROTLW\t[$]8"
-	// ppc64le:"ROTLW\t[$]8"
+	// ppc64x:"ROTLW\t[$]8"
 	// loong64: "ROTR\t[$]24"
 	a += x<<8 + x>>24
 
@@ -73,8 +67,7 @@
 	// arm:"MOVW\tR\\d+@>23"
 	// arm64:"RORW\t[$]23"
 	// s390x:"RLL\t[$]9"
-	// ppc64:"ROTLW\t[$]9"
-	// ppc64le:"ROTLW\t[$]9"
+	// ppc64x:"ROTLW\t[$]9"
 	// loong64: "ROTR\t[$]23"
 	a += x<<9 ^ x>>23
 
@@ -82,8 +75,7 @@
 	// arm:"MOVW\tR\\d+@>22"
 	// arm64:"RORW\t[$]22"
 	// s390x:"RLL\t[$]10"
-	// ppc64:"ROTLW\t[$]10"
-	// ppc64le:"ROTLW\t[$]10"
+	// ppc64x:"ROTLW\t[$]10"
 	// arm64:"RORW\t[$]22"
 	// s390x:"RLL\t[$]10"
 	// loong64: "ROTR\t[$]22"
@@ -133,15 +125,13 @@
 
 	// amd64:"ROLQ",-"AND"
 	// arm64:"ROR","NEG",-"AND"
-	// ppc64:"ROTL",-"NEG",-"AND"
-	// ppc64le:"ROTL",-"NEG",-"AND"
+	// ppc64x:"ROTL",-"NEG",-"AND"
 	// loong64: "ROTRV", -"AND"
 	a += x<<z | x>>(64-z)
 
 	// amd64:"RORQ",-"AND"
 	// arm64:"ROR",-"NEG",-"AND"
-	// ppc64:"ROTL","NEG",-"AND"
-	// ppc64le:"ROTL","NEG",-"AND"
+	// ppc64x:"ROTL","NEG",-"AND"
 	// loong64: "ROTRV", -"AND"
 	a += x>>z | x<<(64-z)
 
@@ -155,15 +145,13 @@
 
 	// amd64:"ROLL",-"AND"
 	// arm64:"ROR","NEG",-"AND"
-	// ppc64:"ROTLW",-"NEG",-"AND"
-	// ppc64le:"ROTLW",-"NEG",-"AND"
+	// ppc64x:"ROTLW",-"NEG",-"AND"
 	// loong64: "ROTR", -"AND"
 	a += x<<z | x>>(32-z)
 
 	// amd64:"RORL",-"AND"
 	// arm64:"ROR",-"NEG",-"AND"
-	// ppc64:"ROTLW","NEG",-"AND"
-	// ppc64le:"ROTLW","NEG",-"AND"
+	// ppc64x:"ROTLW","NEG",-"AND"
 	// loong64: "ROTR", -"AND"
 	a += x>>z | x<<(32-z)
 
@@ -219,38 +207,30 @@
 func checkMaskedRotate32(a []uint32, r int) {
 	i := 0
 
-	// ppc64le: "RLWNM\t[$]16, R[0-9]+, [$]8, [$]15, R[0-9]+"
-	// ppc64: "RLWNM\t[$]16, R[0-9]+, [$]8, [$]15, R[0-9]+"
+	// ppc64x: "RLWNM\t[$]16, R[0-9]+, [$]8, [$]15, R[0-9]+"
 	a[i] = bits.RotateLeft32(a[i], 16) & 0xFF0000
 	i++
-	// ppc64le: "RLWNM\t[$]16, R[0-9]+, [$]8, [$]15, R[0-9]+"
-	// ppc64: "RLWNM\t[$]16, R[0-9]+, [$]8, [$]15, R[0-9]+"
+	// ppc64x: "RLWNM\t[$]16, R[0-9]+, [$]8, [$]15, R[0-9]+"
 	a[i] = bits.RotateLeft32(a[i]&0xFF, 16)
 	i++
-	// ppc64le: "RLWNM\t[$]4, R[0-9]+, [$]20, [$]27, R[0-9]+"
-	// ppc64: "RLWNM\t[$]4, R[0-9]+, [$]20, [$]27, R[0-9]+"
+	// ppc64x: "RLWNM\t[$]4, R[0-9]+, [$]20, [$]27, R[0-9]+"
 	a[i] = bits.RotateLeft32(a[i], 4) & 0xFF0
 	i++
-	// ppc64le: "RLWNM\t[$]16, R[0-9]+, [$]24, [$]31, R[0-9]+"
-	// ppc64: "RLWNM\t[$]16, R[0-9]+, [$]24, [$]31, R[0-9]+"
+	// ppc64x: "RLWNM\t[$]16, R[0-9]+, [$]24, [$]31, R[0-9]+"
 	a[i] = bits.RotateLeft32(a[i]&0xFF0000, 16)
 	i++
 
-	// ppc64le: "RLWNM\tR[0-9]+, R[0-9]+, [$]8, [$]15, R[0-9]+"
-	// ppc64: "RLWNM\tR[0-9]+, R[0-9]+, [$]8, [$]15, R[0-9]+"
+	// ppc64x: "RLWNM\tR[0-9]+, R[0-9]+, [$]8, [$]15, R[0-9]+"
 	a[i] = bits.RotateLeft32(a[i], r) & 0xFF0000
 	i++
-	// ppc64le: "RLWNM\tR[0-9]+, R[0-9]+, [$]16, [$]23, R[0-9]+"
-	// ppc64: "RLWNM\tR[0-9]+, R[0-9]+, [$]16, [$]23, R[0-9]+"
+	// ppc64x: "RLWNM\tR[0-9]+, R[0-9]+, [$]16, [$]23, R[0-9]+"
 	a[i] = bits.RotateLeft32(a[i], r) & 0xFF00
 	i++
 
-	// ppc64le: "RLWNM\tR[0-9]+, R[0-9]+, [$]20, [$]11, R[0-9]+"
-	// ppc64: "RLWNM\tR[0-9]+, R[0-9]+, [$]20, [$]11, R[0-9]+"
+	// ppc64x: "RLWNM\tR[0-9]+, R[0-9]+, [$]20, [$]11, R[0-9]+"
 	a[i] = bits.RotateLeft32(a[i], r) & 0xFFF00FFF
 	i++
-	// ppc64le: "RLWNM\t[$]4, R[0-9]+, [$]20, [$]11, R[0-9]+"
-	// ppc64: "RLWNM\t[$]4, R[0-9]+, [$]20, [$]11, R[0-9]+"
+	// ppc64x: "RLWNM\t[$]4, R[0-9]+, [$]20, [$]11, R[0-9]+"
 	a[i] = bits.RotateLeft32(a[i], 4) & 0xFFF00FFF
 	i++
 }
diff --git a/test/codegen/shift.go b/test/codegen/shift.go
index 4a9f5d4..d34ff9b 100644
--- a/test/codegen/shift.go
+++ b/test/codegen/shift.go
@@ -11,64 +11,55 @@
 // ------------------ //
 
 func lshConst64x64(v int64) int64 {
-	// ppc64:"SLD"
-	// ppc64le:"SLD"
+	// ppc64x:"SLD"
 	// riscv64:"SLLI",-"AND",-"SLTIU"
 	return v << uint64(33)
 }
 
 func rshConst64Ux64(v uint64) uint64 {
-	// ppc64:"SRD"
-	// ppc64le:"SRD"
+	// ppc64x:"SRD"
 	// riscv64:"SRLI",-"AND",-"SLTIU"
 	return v >> uint64(33)
 }
 
 func rshConst64x64(v int64) int64 {
-	// ppc64:"SRAD"
-	// ppc64le:"SRAD"
+	// ppc64x:"SRAD"
 	// riscv64:"SRAI",-"OR",-"SLTIU"
 	return v >> uint64(33)
 }
 
 func lshConst32x64(v int32) int32 {
-	// ppc64:"SLW"
-	// ppc64le:"SLW"
+	// ppc64x:"SLW"
 	// riscv64:"SLLI",-"AND",-"SLTIU", -"MOVW"
 	return v << uint64(29)
 }
 
 func rshConst32Ux64(v uint32) uint32 {
-	// ppc64:"SRW"
-	// ppc64le:"SRW"
+	// ppc64x:"SRW"
 	// riscv64:"SRLI",-"AND",-"SLTIU", -"MOVW"
 	return v >> uint64(29)
 }
 
 func rshConst32x64(v int32) int32 {
-	// ppc64:"SRAW"
-	// ppc64le:"SRAW"
+	// ppc64x:"SRAW"
 	// riscv64:"SRAI",-"OR",-"SLTIU", -"MOVW"
 	return v >> uint64(29)
 }
 
 func lshConst64x32(v int64) int64 {
-	// ppc64:"SLD"
-	// ppc64le:"SLD"
+	// ppc64x:"SLD"
 	// riscv64:"SLLI",-"AND",-"SLTIU"
 	return v << uint32(33)
 }
 
 func rshConst64Ux32(v uint64) uint64 {
-	// ppc64:"SRD"
-	// ppc64le:"SRD"
+	// ppc64x:"SRD"
 	// riscv64:"SRLI",-"AND",-"SLTIU"
 	return v >> uint32(33)
 }
 
 func rshConst64x32(v int64) int64 {
-	// ppc64:"SRAD"
-	// ppc64le:"SRAD"
+	// ppc64x:"SRAD"
 	// riscv64:"SRAI",-"OR",-"SLTIU"
 	return v >> uint32(33)
 }
@@ -79,8 +70,7 @@
 
 func lshMask64x64(v int64, s uint64) int64 {
 	// arm64:"LSL",-"AND"
-	// ppc64:"ANDCC",-"ORN",-"ISEL"
-	// ppc64le:"ANDCC",-"ORN",-"ISEL"
+	// ppc64x:"ANDCC",-"ORN",-"ISEL"
 	// riscv64:"SLL",-"AND\t",-"SLTIU"
 	// s390x:-"RISBGZ",-"AND",-"LOCGR"
 	return v << (s & 63)
@@ -88,8 +78,7 @@
 
 func rshMask64Ux64(v uint64, s uint64) uint64 {
 	// arm64:"LSR",-"AND",-"CSEL"
-	// ppc64:"ANDCC",-"ORN",-"ISEL"
-	// ppc64le:"ANDCC",-"ORN",-"ISEL"
+	// ppc64x:"ANDCC",-"ORN",-"ISEL"
 	// riscv64:"SRL",-"AND\t",-"SLTIU"
 	// s390x:-"RISBGZ",-"AND",-"LOCGR"
 	return v >> (s & 63)
@@ -97,8 +86,7 @@
 
 func rshMask64x64(v int64, s uint64) int64 {
 	// arm64:"ASR",-"AND",-"CSEL"
-	// ppc64:"ANDCC",-"ORN",-"ISEL"
-	// ppc64le:"ANDCC",-ORN",-"ISEL"
+	// ppc64x:"ANDCC",-"ORN",-"ISEL"
 	// riscv64:"SRA",-"OR",-"SLTIU"
 	// s390x:-"RISBGZ",-"AND",-"LOCGR"
 	return v >> (s & 63)
@@ -106,8 +94,7 @@
 
 func lshMask32x64(v int32, s uint64) int32 {
 	// arm64:"LSL",-"AND"
-	// ppc64:"ISEL",-"ORN"
-	// ppc64le:"ISEL",-"ORN"
+	// ppc64x:"ISEL",-"ORN"
 	// riscv64:"SLL",-"AND\t",-"SLTIU"
 	// s390x:-"RISBGZ",-"AND",-"LOCGR"
 	return v << (s & 63)
@@ -115,8 +102,7 @@
 
 func rshMask32Ux64(v uint32, s uint64) uint32 {
 	// arm64:"LSR",-"AND"
-	// ppc64:"ISEL",-"ORN"
-	// ppc64le:"ISEL",-"ORN"
+	// ppc64x:"ISEL",-"ORN"
 	// riscv64:"SRL",-"AND\t",-"SLTIU"
 	// s390x:-"RISBGZ",-"AND",-"LOCGR"
 	return v >> (s & 63)
@@ -124,8 +110,7 @@
 
 func rshMask32x64(v int32, s uint64) int32 {
 	// arm64:"ASR",-"AND"
-	// ppc64:"ISEL",-"ORN"
-	// ppc64le:"ISEL",-"ORN"
+	// ppc64x:"ISEL",-"ORN"
 	// riscv64:"SRA",-"OR",-"SLTIU"
 	// s390x:-"RISBGZ",-"AND",-"LOCGR"
 	return v >> (s & 63)
@@ -133,8 +118,7 @@
 
 func lshMask64x32(v int64, s uint32) int64 {
 	// arm64:"LSL",-"AND"
-	// ppc64:"ANDCC",-"ORN"
-	// ppc64le:"ANDCC",-"ORN"
+	// ppc64x:"ANDCC",-"ORN"
 	// riscv64:"SLL",-"AND\t",-"SLTIU"
 	// s390x:-"RISBGZ",-"AND",-"LOCGR"
 	return v << (s & 63)
@@ -142,8 +126,7 @@
 
 func rshMask64Ux32(v uint64, s uint32) uint64 {
 	// arm64:"LSR",-"AND",-"CSEL"
-	// ppc64:"ANDCC",-"ORN"
-	// ppc64le:"ANDCC",-"ORN"
+	// ppc64x:"ANDCC",-"ORN"
 	// riscv64:"SRL",-"AND\t",-"SLTIU"
 	// s390x:-"RISBGZ",-"AND",-"LOCGR"
 	return v >> (s & 63)
@@ -151,32 +134,28 @@
 
 func rshMask64x32(v int64, s uint32) int64 {
 	// arm64:"ASR",-"AND",-"CSEL"
-	// ppc64:"ANDCC",-"ORN",-"ISEL"
-	// ppc64le:"ANDCC",-"ORN",-"ISEL"
+	// ppc64x:"ANDCC",-"ORN",-"ISEL"
 	// riscv64:"SRA",-"OR",-"SLTIU"
 	// s390x:-"RISBGZ",-"AND",-"LOCGR"
 	return v >> (s & 63)
 }
 
 func lshMask64x32Ext(v int64, s int32) int64 {
-	// ppc64:"ANDCC",-"ORN",-"ISEL"
-	// ppc64le:"ANDCC",-"ORN",-"ISEL"
+	// ppc64x:"ANDCC",-"ORN",-"ISEL"
 	// riscv64:"SLL",-"AND\t",-"SLTIU"
 	// s390x:-"RISBGZ",-"AND",-"LOCGR"
 	return v << uint(s&63)
 }
 
 func rshMask64Ux32Ext(v uint64, s int32) uint64 {
-	// ppc64:"ANDCC",-"ORN",-"ISEL"
-	// ppc64le:"ANDCC",-"ORN",-"ISEL"
+	// ppc64x:"ANDCC",-"ORN",-"ISEL"
 	// riscv64:"SRL",-"AND\t",-"SLTIU"
 	// s390x:-"RISBGZ",-"AND",-"LOCGR"
 	return v >> uint(s&63)
 }
 
 func rshMask64x32Ext(v int64, s int32) int64 {
-	// ppc64:"ANDCC",-"ORN",-"ISEL"
-	// ppc64le:"ANDCC",-"ORN",-"ISEL"
+	// ppc64x:"ANDCC",-"ORN",-"ISEL"
 	// riscv64:"SRA",-"OR",-"SLTIU"
 	// s390x:-"RISBGZ",-"AND",-"LOCGR"
 	return v >> uint(s&63)
@@ -329,84 +308,67 @@
 
 func checkUnneededTrunc(tab *[100000]uint32, d uint64, v uint32, h uint16, b byte) (uint32, uint64) {
 
-	// ppc64le:-".*RLWINM",-".*RLDICR",".*CLRLSLDI"
-	// ppc64:-".*RLWINM",-".*RLDICR",".*CLRLSLDI"
+	// ppc64x:-".*RLWINM",-".*RLDICR",".*CLRLSLDI"
 	f := tab[byte(v)^b]
-	// ppc64le:-".*RLWINM",-".*RLDICR",".*CLRLSLDI"
-	// ppc64:-".*RLWINM",-".*RLDICR",".*CLRLSLDI"
+	// ppc64x:-".*RLWINM",-".*RLDICR",".*CLRLSLDI"
 	f += tab[byte(v)&b]
-	// ppc64le:-".*RLWINM",-".*RLDICR",".*CLRLSLDI"
-	// ppc64:-".*RLWINM",-".*RLDICR",".*CLRLSLDI"
+	// ppc64x:-".*RLWINM",-".*RLDICR",".*CLRLSLDI"
 	f += tab[byte(v)|b]
-	// ppc64le:-".*RLWINM",-".*RLDICR",".*CLRLSLDI"
-	// ppc64:-".*RLWINM",-".*RLDICR",".*CLRLSLDI"
+	// ppc64x:-".*RLWINM",-".*RLDICR",".*CLRLSLDI"
 	f += tab[uint16(v)&h]
-	// ppc64le:-".*RLWINM",-".*RLDICR",".*CLRLSLDI"
-	// ppc64:-".*RLWINM",-".*RLDICR",".*CLRLSLDI"
+	// ppc64x:-".*RLWINM",-".*RLDICR",".*CLRLSLDI"
 	f += tab[uint16(v)^h]
-	// ppc64le:-".*RLWINM",-".*RLDICR",".*CLRLSLDI"
-	// ppc64:-".*RLWINM",-".*RLDICR",".*CLRLSLDI"
+	// ppc64x:-".*RLWINM",-".*RLDICR",".*CLRLSLDI"
 	f += tab[uint16(v)|h]
-	// ppc64le:-".*AND",-"RLDICR",".*CLRLSLDI"
-	// ppc64:-".*AND",-"RLDICR",".*CLRLSLDI"
+	// ppc64x:-".*AND",-"RLDICR",".*CLRLSLDI"
 	f += tab[v&0xff]
-	// ppc64le:-".*AND",".*CLRLSLWI"
-	// ppc64:-".*AND",".*CLRLSLWI"
+	// ppc64x:-".*AND",".*CLRLSLWI"
 	f += 2 * uint32(uint16(d))
-	// ppc64le:-".*AND",-"RLDICR",".*CLRLSLDI"
-	// ppc64:-".*AND",-"RLDICR",".*CLRLSLDI"
+	// ppc64x:-".*AND",-"RLDICR",".*CLRLSLDI"
 	g := 2 * uint64(uint32(d))
 	return f, g
 }
 
 func checkCombinedShifts(v8 uint8, v16 uint16, v32 uint32, x32 int32, v64 uint64) (uint8, uint16, uint32, uint64, int64) {
 
-	// ppc64le:-"AND","CLRLSLWI"
-	// ppc64:-"AND","CLRLSLWI"
+	// ppc64x:-"AND","CLRLSLWI"
 	f := (v8 & 0xF) << 2
-	// ppc64le:"CLRLSLWI"
-	// ppc64:"CLRLSLWI"
+	// ppc64x:"CLRLSLWI"
 	f += byte(v16) << 3
-	// ppc64le:-"AND","CLRLSLWI"
-	// ppc64:-"AND","CLRLSLWI"
+	// ppc64x:-"AND","CLRLSLWI"
 	g := (v16 & 0xFF) << 3
-	// ppc64le:-"AND","CLRLSLWI"
-	// ppc64:-"AND","CLRLSLWI"
+	// ppc64x:-"AND","CLRLSLWI"
 	h := (v32 & 0xFFFFF) << 2
-	// ppc64le:"CLRLSLDI"
-	// ppc64:"CLRLSLDI"
+	// ppc64x:"CLRLSLDI"
 	i := (v64 & 0xFFFFFFFF) << 5
-	// ppc64le:-"CLRLSLDI"
-	// ppc64:-"CLRLSLDI"
+	// ppc64x:-"CLRLSLDI"
 	i += (v64 & 0xFFFFFFF) << 38
-	// ppc64le/power9:-"CLRLSLDI"
-	// ppc64/power9:-"CLRLSLDI"
+	// ppc64x/power9:-"CLRLSLDI"
 	i += (v64 & 0xFFFF00) << 10
-	// ppc64le/power9:-"SLD","EXTSWSLI"
-	// ppc64/power9:-"SLD","EXTSWSLI"
+	// ppc64x/power9:-"SLD","EXTSWSLI"
 	j := int64(x32+32) * 8
 	return f, g, h, i, j
 }
 
 func checkWidenAfterShift(v int64, u uint64) (int64, uint64) {
 
-	// ppc64le:-".*MOVW"
+	// ppc64x:-".*MOVW"
 	f := int32(v >> 32)
-	// ppc64le:".*MOVW"
+	// ppc64x:".*MOVW"
 	f += int32(v >> 31)
-	// ppc64le:-".*MOVH"
+	// ppc64x:-".*MOVH"
 	g := int16(v >> 48)
-	// ppc64le:".*MOVH"
+	// ppc64x:".*MOVH"
 	g += int16(v >> 30)
-	// ppc64le:-".*MOVH"
+	// ppc64x:-".*MOVH"
 	g += int16(f >> 16)
-	// ppc64le:-".*MOVB"
+	// ppc64x:-".*MOVB"
 	h := int8(v >> 56)
-	// ppc64le:".*MOVB"
+	// ppc64x:".*MOVB"
 	h += int8(v >> 28)
-	// ppc64le:-".*MOVB"
+	// ppc64x:-".*MOVB"
 	h += int8(f >> 24)
-	// ppc64le:".*MOVB"
+	// ppc64x:".*MOVB"
 	h += int8(f >> 16)
 	return int64(h), uint64(g)
 }
@@ -414,52 +376,40 @@
 func checkShiftAndMask32(v []uint32) {
 	i := 0
 
-	// ppc64le: "RLWNM\t[$]24, R[0-9]+, [$]12, [$]19, R[0-9]+"
-	// ppc64: "RLWNM\t[$]24, R[0-9]+, [$]12, [$]19, R[0-9]+"
+	// ppc64x: "RLWNM\t[$]24, R[0-9]+, [$]12, [$]19, R[0-9]+"
 	v[i] = (v[i] & 0xFF00000) >> 8
 	i++
-	// ppc64le: "RLWNM\t[$]26, R[0-9]+, [$]22, [$]29, R[0-9]+"
-	// ppc64: "RLWNM\t[$]26, R[0-9]+, [$]22, [$]29, R[0-9]+"
+	// ppc64x: "RLWNM\t[$]26, R[0-9]+, [$]22, [$]29, R[0-9]+"
 	v[i] = (v[i] & 0xFF00) >> 6
 	i++
-	// ppc64le: "MOVW\tR0"
-	// ppc64: "MOVW\tR0"
+	// ppc64x: "MOVW\tR0"
 	v[i] = (v[i] & 0xFF) >> 8
 	i++
-	// ppc64le: "MOVW\tR0"
-	// ppc64: "MOVW\tR0"
+	// ppc64x: "MOVW\tR0"
 	v[i] = (v[i] & 0xF000000) >> 28
 	i++
-	// ppc64le: "RLWNM\t[$]26, R[0-9]+, [$]24, [$]31, R[0-9]+"
-	// ppc64: "RLWNM\t[$]26, R[0-9]+, [$]24, [$]31, R[0-9]+"
+	// ppc64x: "RLWNM\t[$]26, R[0-9]+, [$]24, [$]31, R[0-9]+"
 	v[i] = (v[i] >> 6) & 0xFF
 	i++
-	// ppc64le: "RLWNM\t[$]26, R[0-9]+, [$]12, [$]19, R[0-9]+"
-	// ppc64: "RLWNM\t[$]26, R[0-9]+, [$]12, [$]19, R[0-9]+"
+	// ppc64x: "RLWNM\t[$]26, R[0-9]+, [$]12, [$]19, R[0-9]+"
 	v[i] = (v[i] >> 6) & 0xFF000
 	i++
-	// ppc64le: "MOVW\tR0"
-	// ppc64: "MOVW\tR0"
+	// ppc64x: "MOVW\tR0"
 	v[i] = (v[i] >> 20) & 0xFF000
 	i++
-	// ppc64le: "MOVW\tR0"
-	// ppc64: "MOVW\tR0"
+	// ppc64x: "MOVW\tR0"
 	v[i] = (v[i] >> 24) & 0xFF00
 	i++
 }
 
 func checkMergedShifts32(a [256]uint32, b [256]uint64, u uint32, v uint32) {
-	// ppc64le: -"CLRLSLDI", "RLWNM\t[$]10, R[0-9]+, [$]22, [$]29, R[0-9]+"
-	// ppc64: -"CLRLSLDI", "RLWNM\t[$]10, R[0-9]+, [$]22, [$]29, R[0-9]+"
+	// ppc64x: -"CLRLSLDI", "RLWNM\t[$]10, R[0-9]+, [$]22, [$]29, R[0-9]+"
 	a[0] = a[uint8(v>>24)]
-	// ppc64le: -"CLRLSLDI", "RLWNM\t[$]11, R[0-9]+, [$]21, [$]28, R[0-9]+"
-	// ppc64: -"CLRLSLDI", "RLWNM\t[$]11, R[0-9]+, [$]21, [$]28, R[0-9]+"
+	// ppc64x: -"CLRLSLDI", "RLWNM\t[$]11, R[0-9]+, [$]21, [$]28, R[0-9]+"
 	b[0] = b[uint8(v>>24)]
-	// ppc64le: -"CLRLSLDI", "RLWNM\t[$]15, R[0-9]+, [$]21, [$]28, R[0-9]+"
-	// ppc64: -"CLRLSLDI", "RLWNM\t[$]15, R[0-9]+, [$]21, [$]28, R[0-9]+"
+	// ppc64x: -"CLRLSLDI", "RLWNM\t[$]15, R[0-9]+, [$]21, [$]28, R[0-9]+"
 	b[1] = b[(v>>20)&0xFF]
-	// ppc64le: -"SLD", "RLWNM\t[$]10, R[0-9]+, [$]22, [$]28, R[0-9]+"
-	// ppc64: -"SLD", "RLWNM\t[$]10, R[0-9]+, [$]22, [$]28, R[0-9]+"
+	// ppc64x: -"SLD", "RLWNM\t[$]10, R[0-9]+, [$]22, [$]28, R[0-9]+"
 	b[2] = b[v>>25]
 }
 
diff --git a/test/codegen/slices.go b/test/codegen/slices.go
index fa4142d..a38fe77 100644
--- a/test/codegen/slices.go
+++ b/test/codegen/slices.go
@@ -16,11 +16,11 @@
 // ------------------ //
 
 // Issue #5373 optimize memset idiom
+// Some of the clears get inlined, see #56997
 
 func SliceClear(s []int) []int {
 	// amd64:`.*memclrNoHeapPointers`
-	// ppc64le:`.*memclrNoHeapPointers`
-	// ppc64:`.*memclrNoHeapPointers`
+	// ppc64x:`.*memclrNoHeapPointers`
 	for i := range s {
 		s[i] = 0
 	}
@@ -29,8 +29,7 @@
 
 func SliceClearPointers(s []*int) []*int {
 	// amd64:`.*memclrHasPointers`
-	// ppc64le:`.*memclrHasPointers`
-	// ppc64:`.*memclrHasPointers`
+	// ppc64x:`.*memclrHasPointers`
 	for i := range s {
 		s[i] = nil
 	}
@@ -44,74 +43,70 @@
 // Issue #21266 - avoid makeslice in append(x, make([]T, y)...)
 
 func SliceExtensionConst(s []int) []int {
-	// amd64:`.*runtime\.memclrNoHeapPointers`
+	// amd64:-`.*runtime\.memclrNoHeapPointers`
 	// amd64:-`.*runtime\.makeslice`
 	// amd64:-`.*runtime\.panicmakeslicelen`
-	// ppc64le:`.*runtime\.memclrNoHeapPointers`
-	// ppc64le:-`.*runtime\.makeslice`
-	// ppc64le:-`.*runtime\.panicmakeslicelen`
-	// ppc64:`.*runtime\.memclrNoHeapPointers`
-	// ppc64:-`.*runtime\.makeslice`
-	// ppc64:-`.*runtime\.panicmakeslicelen`
+	// amd64:"MOVUPS\tX15"
+	// ppc64x:-`.*runtime\.memclrNoHeapPointers`
+	// ppc64x:-`.*runtime\.makeslice`
+	// ppc64x:-`.*runtime\.panicmakeslicelen`
 	return append(s, make([]int, 1<<2)...)
 }
 
 func SliceExtensionConstInt64(s []int) []int {
-	// amd64:`.*runtime\.memclrNoHeapPointers`
+	// amd64:-`.*runtime\.memclrNoHeapPointers`
 	// amd64:-`.*runtime\.makeslice`
 	// amd64:-`.*runtime\.panicmakeslicelen`
-	// ppc64le:`.*runtime\.memclrNoHeapPointers`
-	// ppc64le:-`.*runtime\.makeslice`
-	// ppc64le:-`.*runtime\.panicmakeslicelen`
-	// ppc64:`.*runtime\.memclrNoHeapPointers`
-	// ppc64:-`.*runtime\.makeslice`
-	// ppc64:-`.*runtime\.panicmakeslicelen`
+	// amd64:"MOVUPS\tX15"
+	// ppc64x:-`.*runtime\.memclrNoHeapPointers`
+	// ppc64x:-`.*runtime\.makeslice`
+	// ppc64x:-`.*runtime\.panicmakeslicelen`
 	return append(s, make([]int, int64(1<<2))...)
 }
 
 func SliceExtensionConstUint64(s []int) []int {
-	// amd64:`.*runtime\.memclrNoHeapPointers`
+	// amd64:-`.*runtime\.memclrNoHeapPointers`
 	// amd64:-`.*runtime\.makeslice`
 	// amd64:-`.*runtime\.panicmakeslicelen`
-	// ppc64le:`.*runtime\.memclrNoHeapPointers`
-	// ppc64le:-`.*runtime\.makeslice`
-	// ppc64le:-`.*runtime\.panicmakeslicelen`
-	// ppc64:`.*runtime\.memclrNoHeapPointers`
-	// ppc64:-`.*runtime\.makeslice`
-	// ppc64:-`.*runtime\.panicmakeslicelen`
+	// amd64:"MOVUPS\tX15"
+	// ppc64x:-`.*runtime\.memclrNoHeapPointers`
+	// ppc64x:-`.*runtime\.makeslice`
+	// ppc64x:-`.*runtime\.panicmakeslicelen`
 	return append(s, make([]int, uint64(1<<2))...)
 }
 
 func SliceExtensionConstUint(s []int) []int {
-	// amd64:`.*runtime\.memclrNoHeapPointers`
+	// amd64:-`.*runtime\.memclrNoHeapPointers`
 	// amd64:-`.*runtime\.makeslice`
 	// amd64:-`.*runtime\.panicmakeslicelen`
-	// ppc64le:`.*runtime\.memclrNoHeapPointers`
-	// ppc64le:-`.*runtime\.makeslice`
-	// ppc64le:-`.*runtime\.panicmakeslicelen`
-	// ppc64:`.*runtime\.memclrNoHeapPointers`
-	// ppc64:-`.*runtime\.makeslice`
-	// ppc64:-`.*runtime\.panicmakeslicelen`
+	// amd64:"MOVUPS\tX15"
+	// ppc64x:-`.*runtime\.memclrNoHeapPointers`
+	// ppc64x:-`.*runtime\.makeslice`
+	// ppc64x:-`.*runtime\.panicmakeslicelen`
 	return append(s, make([]int, uint(1<<2))...)
 }
 
+// On ppc64x continue to use memclrNoHeapPointers
+// for sizes >= 512.
+func SliceExtensionConst512(s []int) []int {
+	// amd64:-`.*runtime\.memclrNoHeapPointers`
+	// ppc64x:`.*runtime\.memclrNoHeapPointers`
+	return append(s, make([]int, 1<<9)...)
+}
+
 func SliceExtensionPointer(s []*int, l int) []*int {
 	// amd64:`.*runtime\.memclrHasPointers`
 	// amd64:-`.*runtime\.makeslice`
-	// ppc64le:`.*runtime\.memclrHasPointers`
-	// ppc64le:-`.*runtime\.makeslice`
-	// ppc64:`.*runtime\.memclrHasPointers`
-	// ppc64:-`.*runtime\.makeslice`
+	// ppc64x:`.*runtime\.memclrHasPointers`
+	// ppc64x:-`.*runtime\.makeslice`
 	return append(s, make([]*int, l)...)
 }
 
 func SliceExtensionVar(s []byte, l int) []byte {
 	// amd64:`.*runtime\.memclrNoHeapPointers`
 	// amd64:-`.*runtime\.makeslice`
-	// ppc64le:`.*runtime\.memclrNoHeapPointers`
-	// ppc64le:-`.*runtime\.makeslice`
-	// ppc64:`.*runtime\.memclrNoHeapPointers`
-	// ppc64:-`.*runtime\.makeslice`
+	// ppc64x:`.*runtime\.memclrNoHeapPointers`
+	// ppc64x:-`.*runtime\.makeslice`
 	return append(s, make([]byte, l)...)
 }
 
@@ -152,12 +147,9 @@
 	// amd64:`.*runtime\.mallocgc`
 	// amd64:`.*runtime\.memmove`
 	// amd64:-`.*runtime\.makeslice`
-	// ppc64le:`.*runtime\.mallocgc`
-	// ppc64le:`.*runtime\.memmove`
-	// ppc64le:-`.*runtime\.makeslice`
-	// ppc64:`.*runtime\.mallocgc`
-	// ppc64:`.*runtime\.memmove`
-	// ppc64:-`.*runtime\.makeslice`
+	// ppc64x:`.*runtime\.mallocgc`
+	// ppc64x:`.*runtime\.memmove`
+	// ppc64x:-`.*runtime\.makeslice`
 	a := make([]int, len(s))
 	copy(a, s)
 	return a
@@ -167,12 +159,9 @@
 	// amd64:`.*runtime\.makeslicecopy`
 	// amd64:-`.*runtime\.makeslice\(`
 	// amd64:-`.*runtime\.typedslicecopy
-	// ppc64le:`.*runtime\.makeslicecopy`
-	// ppc64le:-`.*runtime\.makeslice\(`
-	// ppc64le:-`.*runtime\.typedslicecopy
-	// ppc64:`.*runtime\.makeslicecopy`
-	// ppc64:-`.*runtime\.makeslice\(`
-	// ppc64:-`.*runtime\.typedslicecopy
+	// ppc64x:`.*runtime\.makeslicecopy`
+	// ppc64x:-`.*runtime\.makeslice\(`
+	// ppc64x:-`.*runtime\.typedslicecopy
 	a := make([]*int, len(s))
 	copy(a, s)
 	return a
@@ -337,6 +326,12 @@
 	return a
 }
 
+func SliceMakeEmptyPointerToZerobase() []int {
+	// amd64:`LEAQ.+runtime\.zerobase`
+	// amd64:-`.*runtime\.makeslice`
+	return make([]int, 0)
+}
+
 // ---------------------- //
 //   Nil check of &s[0]   //
 // ---------------------- //
@@ -406,16 +401,14 @@
 func SliceWithConstCompare(a []int, b int) []int {
 	var c []int = []int{1, 2, 3, 4, 5}
 	if b+len(a) < len(c) {
-		// ppc64le:-"NEG"
-		// ppc64:-"NEG"
+		// ppc64x:-"NEG"
 		return c[b:]
 	}
 	return a
 }
 
 func SliceWithSubtractBound(a []int, b int) []int {
-	// ppc64le:"SUBC",-"NEG"
-	// ppc64:"SUBC",-"NEG"
+	// ppc64x:"SUBC",-"NEG"
 	return a[(3 - b):]
 }
 
diff --git a/test/codegen/stack.go b/test/codegen/stack.go
index f28b4a3..eebbbf1 100644
--- a/test/codegen/stack.go
+++ b/test/codegen/stack.go
@@ -18,8 +18,7 @@
 // arm:"TEXT\t.*, [$]-4-"
 // arm64:"TEXT\t.*, [$]0-"
 // mips:"TEXT\t.*, [$]-4-"
-// ppc64:"TEXT\t.*, [$]0-"
-// ppc64le:"TEXT\t.*, [$]0-"
+// ppc64x:"TEXT\t.*, [$]0-"
 // s390x:"TEXT\t.*, [$]0-"
 func StackStore() int {
 	var x int
@@ -38,8 +37,7 @@
 // arm:"TEXT\t.*, [$]0-" (spills return address)
 // arm64:"TEXT\t.*, [$]0-"
 // mips:"TEXT\t.*, [$]-4-"
-// ppc64:"TEXT\t.*, [$]0-"
-// ppc64le:"TEXT\t.*, [$]0-"
+// ppc64x:"TEXT\t.*, [$]0-"
 // s390x:"TEXT\t.*, [$]0-"
 func ZeroLargeStruct(x *T) {
 	t := T{}
@@ -53,8 +51,7 @@
 // amd64:"TEXT\t.*, [$]0-"
 // arm:"TEXT\t.*, [$]0-" (spills return address)
 // arm64:"TEXT\t.*, [$]0-"
-// ppc64:"TEXT\t.*, [$]0-"
-// ppc64le:"TEXT\t.*, [$]0-"
+// ppc64x:"TEXT\t.*, [$]0-"
 // s390x:"TEXT\t.*, [$]0-"
 // Note: that 386 currently has to spill a register.
 func KeepWanted(t *T) {
@@ -68,8 +65,7 @@
 // - arm & mips fail due to softfloat calls
 // amd64:"TEXT\t.*, [$]0-"
 // arm64:"TEXT\t.*, [$]0-"
-// ppc64:"TEXT\t.*, [$]0-"
-// ppc64le:"TEXT\t.*, [$]0-"
+// ppc64x:"TEXT\t.*, [$]0-"
 // s390x:"TEXT\t.*, [$]0-"
 func ArrayAdd64(a, b [4]float64) [4]float64 {
 	return [4]float64{a[0] + b[0], a[1] + b[1], a[2] + b[2], a[3] + b[3]}
@@ -82,8 +78,7 @@
 // arm:"TEXT\t.*, [$]0-" (spills return address)
 // arm64:"TEXT\t.*, [$]0-"
 // mips:"TEXT\t.*, [$]-4-"
-// ppc64:"TEXT\t.*, [$]0-"
-// ppc64le:"TEXT\t.*, [$]0-"
+// ppc64x:"TEXT\t.*, [$]0-"
 // s390x:"TEXT\t.*, [$]0-"
 func ArrayInit(i, j int) [4]int {
 	return [4]int{i, 0, j, 0}
diff --git a/test/codegen/strings.go b/test/codegen/strings.go
index a2c2fc0..94512f5 100644
--- a/test/codegen/strings.go
+++ b/test/codegen/strings.go
@@ -14,6 +14,11 @@
 	return len([]rune(s))
 }
 
+func CountBytes(s []byte) int {
+	// amd64:-`.*runtime.slicebytetostring`
+	return len(string(s))
+}
+
 func ToByteSlice() []byte { // Issue #24698
 	// amd64:`LEAQ\ttype:\[3\]uint8`
 	// amd64:`CALL\truntime\.newobject`
diff --git a/test/codegen/structs.go b/test/codegen/structs.go
index c4bcb55..fc49a69 100644
--- a/test/codegen/structs.go
+++ b/test/codegen/structs.go
@@ -1,5 +1,8 @@
 // asmcheck
 
+//go:build !goexperiment.cgocheck2
+// +build !goexperiment.cgocheck2
+
 // Copyright 2018 The Go Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
diff --git a/test/const7.go b/test/const7.go
index 8b252a2..a229fcc 100644
--- a/test/const7.go
+++ b/test/const7.go
@@ -59,7 +59,7 @@
 }
 
 func main() {
-	if runtime.GOOS == "js" || runtime.Compiler != "gc" {
+	if runtime.GOOS == "js" || runtime.GOOS == "wasip1" || runtime.Compiler != "gc" {
 		return
 	}
 
diff --git a/test/env.go b/test/env.go
index 9723746..1590f1e 100644
--- a/test/env.go
+++ b/test/env.go
@@ -4,8 +4,8 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// Test that the Go environment variables are present and accessible through
-// package os and package runtime.
+// Test that environment variables are accessible through
+// package os.
 
 package main
 
@@ -15,9 +15,12 @@
 )
 
 func main() {
-	ga := os.Getenv("GOARCH")
-	if ga != runtime.GOARCH {
-		print("$GOARCH=", ga, "!= runtime.GOARCH=", runtime.GOARCH, "\n")
+	ga := os.Getenv("PATH")
+	if runtime.GOOS == "plan9" {
+		ga = os.Getenv("path")
+	}
+	if ga == "" {
+		print("PATH is empty\n")
 		os.Exit(1)
 	}
 	xxx := os.Getenv("DOES_NOT_EXIST")
diff --git a/test/escape.go b/test/escape.go
index 252a1e5..e6103f7 100644
--- a/test/escape.go
+++ b/test/escape.go
@@ -126,7 +126,8 @@
 	var p [2]*int
 	a[0] = x
 	a[1] = y
-	for k, v := range a {
+	var k, v int
+	for k, v = range a {
 		p[k] = &v
 	}
 	return p[0], p[1]
@@ -136,7 +137,8 @@
 func for_escapes2(x int, y int) (*int, *int) {
 	var p [2]*int
 	n := 0
-	for i := x; n < 2; i = y {
+	i := x
+	for ; n < 2; i = y {
 		p[n] = &i
 		n++
 	}
diff --git a/test/escape4.go b/test/escape4.go
index e381248..710eb75 100644
--- a/test/escape4.go
+++ b/test/escape4.go
@@ -38,11 +38,7 @@
 func f3() { panic(1) } // ERROR "can inline f3" "1 escapes to heap"
 func f4() { recover() }
 
-// TODO(cuonglm): remove f5, f6 //go:noinline and update the error message
-//                once GOEXPERIMENT=nounified is gone.
-
-//go:noinline
-func f5() *byte {
+func f5() *byte { // ERROR "can inline f5"
 	type T struct {
 		x [1]byte
 	}
@@ -50,8 +46,7 @@
 	return &t.x[0]
 }
 
-//go:noinline
-func f6() *byte {
+func f6() *byte { // ERROR "can inline f6"
 	type T struct {
 		x struct {
 			y byte
diff --git a/test/escape_iface.go b/test/escape_iface.go
index 9862281..d822cca 100644
--- a/test/escape_iface.go
+++ b/test/escape_iface.go
@@ -234,6 +234,16 @@
 		*(&v) = x.(int)
 		*(&v), *(&ok) = y.(int)
 	}
+	{ // #13805, #15796
+		i := 0
+		j := 0
+		var ok bool
+		var x interface{} = i // ERROR "i does not escape"
+		var y interface{} = j // ERROR "j does not escape"
+
+		sink = x.(int)         // ERROR "x.\(int\) escapes to heap"
+		sink, *(&ok) = y.(int) // ERROR "autotmp_.* escapes to heap"
+	}
 	{
 		i := 0 // ERROR "moved to heap: i"
 		j := 0 // ERROR "moved to heap: j"
diff --git a/test/escape_iface_nounified.go b/test/escape_iface_nounified.go
deleted file mode 100644
index 1d267bc..0000000
--- a/test/escape_iface_nounified.go
+++ /dev/null
@@ -1,25 +0,0 @@
-// errorcheck -0 -m -l
-//go:build !goexperiment.unified
-// +build !goexperiment.unified
-
-// 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 escape
-
-var sink interface{}
-
-func dotTypeEscape2() { // #13805, #15796
-	{
-		i := 0
-		j := 0
-		var ok bool
-		var x interface{} = i // ERROR "i does not escape"
-		var y interface{} = j // ERROR "j does not escape"
-
-		sink = x.(int) // ERROR "x.\(int\) escapes to heap"
-		// BAD: should be "y.\(int\) escapes to heap" too
-		sink, *(&ok) = y.(int)
-	}
-}
diff --git a/test/escape_iface_unified.go b/test/escape_iface_unified.go
deleted file mode 100644
index 80222da..0000000
--- a/test/escape_iface_unified.go
+++ /dev/null
@@ -1,24 +0,0 @@
-// errorcheck -0 -m -l
-//go:build goexperiment.unified
-// +build goexperiment.unified
-
-// 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 escape
-
-var sink interface{}
-
-func dotTypeEscape2() { // #13805, #15796
-	{
-		i := 0
-		j := 0
-		var ok bool
-		var x interface{} = i // ERROR "i does not escape"
-		var y interface{} = j // ERROR "j does not escape"
-
-		sink = x.(int)         // ERROR "x.\(int\) escapes to heap"
-		sink, *(&ok) = y.(int) // ERROR "autotmp_.* escapes to heap"
-	}
-}
diff --git a/test/escape_reflect.go b/test/escape_reflect.go
new file mode 100644
index 0000000..b2d674a
--- /dev/null
+++ b/test/escape_reflect.go
@@ -0,0 +1,462 @@
+// errorcheck -0 -m -l
+
+// Copyright 2022 The Go 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 escape analysis for reflect Value operations.
+
+package escape
+
+import (
+	"reflect"
+	"unsafe"
+)
+
+var sink interface{}
+
+func typ(x int) any {
+	v := reflect.ValueOf(x) // ERROR "x does not escape"
+	return v.Type()
+}
+
+func kind(x int) reflect.Kind {
+	v := reflect.ValueOf(x) // ERROR "x does not escape"
+	return v.Kind()
+}
+
+func int1(x int) int {
+	v := reflect.ValueOf(x) // ERROR "x does not escape"
+	return int(v.Int())
+}
+
+func ptr(x *int) *int { // ERROR "leaking param: x to result ~r0 level=0"
+	v := reflect.ValueOf(x)
+	return (*int)(v.UnsafePointer())
+}
+
+func bytes1(x []byte) byte { // ERROR "x does not escape"
+	v := reflect.ValueOf(x) // ERROR "x does not escape"
+	return v.Bytes()[0]
+}
+
+// Unfortunate: should only escape content. x (the interface storage) should not escape.
+func bytes2(x []byte) []byte { // ERROR "leaking param: x$"
+	v := reflect.ValueOf(x) // ERROR "x escapes to heap"
+	return v.Bytes()
+}
+
+func string1(x string) string { // ERROR "leaking param: x to result ~r0 level=0"
+	v := reflect.ValueOf(x) // ERROR "x does not escape"
+	return v.String()
+}
+
+func string2(x int) string {
+	v := reflect.ValueOf(x) // ERROR "x does not escape"
+	return v.String()
+}
+
+// Unfortunate: should only escape to result.
+func interface1(x any) any { // ERROR "leaking param: x$"
+	v := reflect.ValueOf(x)
+	return v.Interface()
+}
+
+func interface2(x int) any {
+	v := reflect.ValueOf(x) // ERROR "x escapes to heap"
+	return v.Interface()
+}
+
+// Unfortunate: should not escape.
+func interface3(x int) int {
+	v := reflect.ValueOf(x) // ERROR "x escapes to heap"
+	return v.Interface().(int)
+}
+
+// Unfortunate: should only escape to result.
+func interface4(x *int) any { // ERROR "leaking param: x$"
+	v := reflect.ValueOf(x)
+	return v.Interface()
+}
+
+func addr(x *int) reflect.Value { // ERROR "leaking param: x to result ~r0 level=0"
+	v := reflect.ValueOf(x).Elem()
+	return v.Addr()
+}
+
+// functions returning pointer as uintptr have to escape.
+func uintptr1(x *int) uintptr { // ERROR "leaking param: x$"
+	v := reflect.ValueOf(x)
+	return v.Pointer()
+}
+
+func unsafeaddr(x *int) uintptr { // ERROR "leaking param: x$"
+	v := reflect.ValueOf(x).Elem()
+	return v.UnsafeAddr()
+}
+
+func ifacedata(x any) [2]uintptr { // ERROR "moved to heap: x"
+	v := reflect.ValueOf(&x).Elem()
+	return v.InterfaceData()
+}
+
+func can(x int) bool {
+	v := reflect.ValueOf(x) // ERROR "x does not escape"
+	return v.CanAddr() || v.CanInt() || v.CanSet() || v.CanInterface()
+}
+
+func is(x int) bool {
+	v := reflect.ValueOf(x) // ERROR "x does not escape"
+	return v.IsValid() || v.IsNil() || v.IsZero()
+}
+
+func is2(x [2]int) bool {
+	v := reflect.ValueOf(x) // ERROR "x does not escape"
+	return v.IsValid() || v.IsNil() || v.IsZero()
+}
+
+func is3(x struct { a, b int }) bool {
+	v := reflect.ValueOf(x) // ERROR "x does not escape"
+	return v.IsValid() || v.IsNil() || v.IsZero()
+}
+
+func overflow(x int) bool {
+	v := reflect.ValueOf(x) // ERROR "x does not escape"
+	return v.OverflowInt(1 << 62)
+}
+
+func len1(x []int) int { // ERROR "x does not escape"
+	v := reflect.ValueOf(x) // ERROR "x does not escape"
+	return v.Len()
+}
+
+func len2(x [3]int) int {
+	v := reflect.ValueOf(x) // ERROR "x does not escape"
+	return v.Len()
+}
+
+func len3(x string) int { // ERROR "x does not escape"
+	v := reflect.ValueOf(x) // ERROR "x does not escape"
+	return v.Len()
+}
+
+func len4(x map[int]int) int { // ERROR "x does not escape"
+	v := reflect.ValueOf(x)
+	return v.Len()
+}
+
+func len5(x chan int) int { // ERROR "x does not escape"
+	v := reflect.ValueOf(x)
+	return v.Len()
+}
+
+func cap1(x []int) int { // ERROR "x does not escape"
+	v := reflect.ValueOf(x) // ERROR "x does not escape"
+	return v.Cap()
+}
+
+func cap2(x [3]int) int {
+	v := reflect.ValueOf(x) // ERROR "x does not escape"
+	return v.Cap()
+}
+
+func cap3(x chan int) int { // ERROR "x does not escape"
+	v := reflect.ValueOf(x)
+	return v.Cap()
+}
+
+func setlen(x *[]int, n int) { // ERROR "x does not escape"
+	v := reflect.ValueOf(x).Elem()
+	v.SetLen(n)
+}
+
+func setcap(x *[]int, n int) { // ERROR "x does not escape"
+	v := reflect.ValueOf(x).Elem()
+	v.SetCap(n)
+}
+
+// Unfortunate: x doesn't need to escape to heap, just to result.
+func slice1(x []byte) []byte { // ERROR "leaking param: x$"
+	v := reflect.ValueOf(x) // ERROR "x escapes to heap"
+	return v.Slice(1, 2).Bytes()
+}
+
+// Unfortunate: x doesn't need to escape to heap, just to result.
+func slice2(x string) string { // ERROR "leaking param: x$"
+	v := reflect.ValueOf(x) // ERROR "x escapes to heap"
+	return v.Slice(1, 2).String()
+}
+
+func slice3(x [10]byte) []byte {
+	v := reflect.ValueOf(x) // ERROR "x escapes to heap"
+	return v.Slice(1, 2).Bytes()
+}
+
+func elem1(x *int) int { // ERROR "x does not escape"
+	v := reflect.ValueOf(x)
+	return int(v.Elem().Int())
+}
+
+func elem2(x *string) string { // ERROR "leaking param: x to result ~r0 level=1"
+	v := reflect.ValueOf(x)
+	return string(v.Elem().String())
+}
+
+type S struct {
+	A int
+	B *int
+	C string
+}
+
+func (S) M() {}
+
+func field1(x S) int { // ERROR "x does not escape"
+	v := reflect.ValueOf(x) // ERROR "x does not escape"
+	return int(v.Field(0).Int())
+}
+
+func field2(x S) string { // ERROR "leaking param: x to result ~r0 level=0"
+	v := reflect.ValueOf(x) // ERROR "x does not escape"
+	return v.Field(2).String()
+}
+
+func numfield(x S) int { // ERROR "x does not escape"
+	v := reflect.ValueOf(x) // ERROR "x does not escape"
+	return v.NumField()
+}
+
+func index1(x []int) int { // ERROR "x does not escape"
+	v := reflect.ValueOf(x) // ERROR "x does not escape"
+	return int(v.Index(0).Int())
+}
+
+// Unfortunate: should only leak content (level=1)
+func index2(x []string) string { // ERROR "leaking param: x to result ~r0 level=0"
+	v := reflect.ValueOf(x) // ERROR "x does not escape"
+	return v.Index(0).String()
+}
+
+func index3(x [3]int) int {
+	v := reflect.ValueOf(x) // ERROR "x does not escape"
+	return int(v.Index(0).Int())
+}
+
+func index4(x [3]string) string { // ERROR "leaking param: x to result ~r0 level=0"
+	v := reflect.ValueOf(x) // ERROR "x does not escape"
+	return v.Index(0).String()
+}
+
+func index5(x string) byte { // ERROR "x does not escape"
+	v := reflect.ValueOf(x) // ERROR "x does not escape"
+	return byte(v.Index(0).Uint())
+}
+
+// Unfortunate: x (the interface storage) doesn't need to escape as the function takes a scalar arg.
+func call1(f func(int), x int) { // ERROR "leaking param: f$"
+	fv := reflect.ValueOf(f)
+	v := reflect.ValueOf(x)     // ERROR "x escapes to heap"
+	fv.Call([]reflect.Value{v}) // ERROR "\[\]reflect\.Value{\.\.\.} does not escape"
+}
+
+func call2(f func(*int), x *int) { // ERROR "leaking param: f$" "leaking param: x$"
+	fv := reflect.ValueOf(f)
+	v := reflect.ValueOf(x)
+	fv.Call([]reflect.Value{v}) // ERROR "\[\]reflect.Value{\.\.\.} does not escape"
+}
+
+func method(x S) reflect.Value { // ERROR "leaking param: x$"
+	v := reflect.ValueOf(x) // ERROR "x escapes to heap"
+	return v.Method(0)
+}
+
+func nummethod(x S) int { // ERROR "x does not escape"
+	v := reflect.ValueOf(x) // ERROR "x does not escape"
+	return v.NumMethod()
+}
+
+// Unfortunate: k doesn't need to escape.
+func mapindex(m map[string]string, k string) string { // ERROR "m does not escape" "leaking param: k$"
+	mv := reflect.ValueOf(m)
+	kv := reflect.ValueOf(k) // ERROR "k escapes to heap"
+	return mv.MapIndex(kv).String()
+}
+
+func mapkeys(m map[string]string) []reflect.Value { // ERROR "m does not escape"
+	mv := reflect.ValueOf(m)
+	return mv.MapKeys()
+}
+
+func mapiter1(m map[string]string) *reflect.MapIter { // ERROR "leaking param: m$"
+	mv := reflect.ValueOf(m)
+	return mv.MapRange()
+}
+
+func mapiter2(m map[string]string) string { // ERROR "leaking param: m$"
+	mv := reflect.ValueOf(m)
+	it := mv.MapRange()
+	if it.Next() {
+		return it.Key().String()
+	}
+	return ""
+}
+
+func mapiter3(m map[string]string, it *reflect.MapIter) { // ERROR "leaking param: m$" "it does not escape"
+	mv := reflect.ValueOf(m)
+	it.Reset(mv)
+}
+
+func recv1(ch chan string) string { // ERROR "ch does not escape"
+	v := reflect.ValueOf(ch)
+	r, _ := v.Recv()
+	return r.String()
+}
+
+func recv2(ch chan string) string { // ERROR "ch does not escape"
+	v := reflect.ValueOf(ch)
+	r, _ := v.TryRecv()
+	return r.String()
+}
+
+// Unfortunate: x (the interface storage) doesn't need to escape.
+func send1(ch chan string, x string) { // ERROR "ch does not escape" "leaking param: x$"
+	vc := reflect.ValueOf(ch)
+	vx := reflect.ValueOf(x) // ERROR "x escapes to heap"
+	vc.Send(vx)
+}
+
+// Unfortunate: x (the interface storage) doesn't need to escape.
+func send2(ch chan string, x string) bool { // ERROR "ch does not escape" "leaking param: x$"
+	vc := reflect.ValueOf(ch)
+	vx := reflect.ValueOf(x) // ERROR "x escapes to heap"
+	return vc.TrySend(vx)
+}
+
+func close1(ch chan string) { // ERROR "ch does not escape"
+	v := reflect.ValueOf(ch)
+	v.Close()
+}
+
+func select1(ch chan string) string { // ERROR "leaking param: ch$"
+	v := reflect.ValueOf(ch)
+	cas := reflect.SelectCase{Dir: reflect.SelectRecv, Chan: v}
+	_, r, _ := reflect.Select([]reflect.SelectCase{cas}) // ERROR "\[\]reflect.SelectCase{...} does not escape"
+	return r.String()
+}
+
+// Unfortunate: x (the interface storage) doesn't need to escape.
+func select2(ch chan string, x string) { // ERROR "leaking param: ch$" "leaking param: x$"
+	vc := reflect.ValueOf(ch)
+	vx := reflect.ValueOf(x) // ERROR "x escapes to heap"
+	cas := reflect.SelectCase{Dir: reflect.SelectSend, Chan: vc, Send: vx}
+	reflect.Select([]reflect.SelectCase{cas}) // ERROR "\[\]reflect.SelectCase{...} does not escape"
+}
+
+var (
+	intTyp    = reflect.TypeOf(int(0))     // ERROR "int\(0\) does not escape"
+	uintTyp   = reflect.TypeOf(uint(0))    // ERROR "uint\(0\) does not escape"
+	stringTyp = reflect.TypeOf(string("")) // ERROR "string\(.*\) does not escape"
+	bytesTyp  = reflect.TypeOf([]byte{})   // ERROR "\[\]byte{} does not escape"
+)
+
+// Unfortunate: should not escape.
+func convert1(x int) uint {
+	v := reflect.ValueOf(x) // ERROR "x escapes to heap"
+	return uint(v.Convert(uintTyp).Uint())
+}
+
+// Unfortunate: should only escape content to result.
+func convert2(x []byte) string { // ERROR "leaking param: x$"
+	v := reflect.ValueOf(x) // ERROR "x escapes to heap"
+	return v.Convert(stringTyp).String()
+}
+
+// Unfortunate: v doesn't need to leak, x (the interface storage) doesn't need to escape.
+func set1(v reflect.Value, x int) { // ERROR "leaking param: v$"
+	vx := reflect.ValueOf(x) // ERROR "x escapes to heap"
+	v.Set(vx)
+}
+
+// Unfortunate: a can be stack allocated, x (the interface storage) doesn't need to escape.
+func set2(x int) int64 {
+	var a int // ERROR "moved to heap: a"
+	v := reflect.ValueOf(&a).Elem()
+	vx := reflect.ValueOf(x) // ERROR "x escapes to heap"
+	v.Set(vx)
+	return v.Int()
+}
+
+func set3(v reflect.Value, x int) { // ERROR "v does not escape"
+	v.SetInt(int64(x))
+}
+
+func set4(x int) int {
+	var a int
+	v := reflect.ValueOf(&a).Elem() // a should not escape, no error printed
+	v.SetInt(int64(x))
+	return int(v.Int())
+}
+
+func set5(v reflect.Value, x string) { // ERROR "v does not escape" "leaking param: x$"
+	v.SetString(x)
+}
+
+func set6(v reflect.Value, x []byte) { // ERROR "v does not escape" "leaking param: x$"
+	v.SetBytes(x)
+}
+
+func set7(v reflect.Value, x unsafe.Pointer) { // ERROR "v does not escape" "leaking param: x$"
+	v.SetPointer(x)
+}
+
+func setmapindex(m map[string]string, k, e string) { // ERROR "m does not escape" "leaking param: k$" "leaking param: e$"
+	mv := reflect.ValueOf(m)
+	kv := reflect.ValueOf(k) // ERROR "k escapes to heap"
+	ev := reflect.ValueOf(e) // ERROR "e escapes to heap"
+	mv.SetMapIndex(kv, ev)
+}
+
+// Unfortunate: k doesn't need to escape.
+func mapdelete(m map[string]string, k string) { // ERROR "m does not escape" "leaking param: k$"
+	mv := reflect.ValueOf(m)
+	kv := reflect.ValueOf(k) // ERROR "k escapes to heap"
+	mv.SetMapIndex(kv, reflect.Value{})
+}
+
+// Unfortunate: v doesn't need to leak.
+func setiterkey1(v reflect.Value, it *reflect.MapIter) { // ERROR "leaking param: v$" "it does not escape"
+	v.SetIterKey(it)
+}
+
+// Unfortunate: v doesn't need to leak.
+func setiterkey2(v reflect.Value, m map[string]string) { // ERROR "leaking param: v$" "leaking param: m$"
+	it := reflect.ValueOf(m).MapRange()
+	v.SetIterKey(it)
+}
+
+// Unfortunate: v doesn't need to leak.
+func setitervalue1(v reflect.Value, it *reflect.MapIter) { // ERROR "leaking param: v$" "it does not escape"
+	v.SetIterValue(it)
+}
+
+// Unfortunate: v doesn't need to leak.
+func setitervalue2(v reflect.Value, m map[string]string) { // ERROR "leaking param: v$" "leaking param: m$"
+	it := reflect.ValueOf(m).MapRange()
+	v.SetIterValue(it)
+}
+
+// Unfortunate: s doesn't need escape, only leak to result.
+// And x (interface storage) doesn't need to escape.
+func append1(s []int, x int) []int { // ERROR "leaking param: s$"
+	sv := reflect.ValueOf(s)     // ERROR "s escapes to heap"
+	xv := reflect.ValueOf(x)     // ERROR "x escapes to heap"
+	rv := reflect.Append(sv, xv) // ERROR "... argument does not escape"
+	return rv.Interface().([]int)
+}
+
+// Unfortunate: s doesn't need escape, only leak to result.
+func append2(s, x []int) []int { // ERROR "leaking param: s$" "x does not escape"
+	sv := reflect.ValueOf(s) // ERROR "s escapes to heap"
+	xv := reflect.ValueOf(x) // ERROR "x does not escape"
+	rv := reflect.AppendSlice(sv, xv)
+	return rv.Interface().([]int)
+}
diff --git a/test/fixedbugs/bug037.go b/test/fixedbugs/bug037.go
index f17fb3f..ed95cac 100644
--- a/test/fixedbugs/bug037.go
+++ b/test/fixedbugs/bug037.go
@@ -8,4 +8,5 @@
 
 func main() {
 	s := vlong(0);  // ERROR "undef"
+	_ = s
 }
diff --git a/test/fixedbugs/bug062.go b/test/fixedbugs/bug062.go
index 1008f1a..ef9ed5c 100644
--- a/test/fixedbugs/bug062.go
+++ b/test/fixedbugs/bug062.go
@@ -7,5 +7,5 @@
 package main
 
 func main() {
-	var s string = nil // ERROR "illegal|invalid|incompatible|cannot"
+	var _ string = nil // ERROR "illegal|invalid|incompatible|cannot"
 }
diff --git a/test/fixedbugs/bug072.go b/test/fixedbugs/bug072.go
index 05ad93d..1c0c4ee 100644
--- a/test/fixedbugs/bug072.go
+++ b/test/fixedbugs/bug072.go
@@ -8,4 +8,5 @@
 
 func main() {
 	s := string(bug);  // ERROR "undef"
+	_ = s
 }
diff --git a/test/fixedbugs/bug091.go b/test/fixedbugs/bug091.go
index dbb1287..0e239e0 100644
--- a/test/fixedbugs/bug091.go
+++ b/test/fixedbugs/bug091.go
@@ -18,6 +18,7 @@
 
 func f3() {
 	i := c // ERROR "undef"
+	_ = i
 }
 
 func main() {
diff --git a/test/fixedbugs/bug103.go b/test/fixedbugs/bug103.go
index 1cb710e..743a3c4 100644
--- a/test/fixedbugs/bug103.go
+++ b/test/fixedbugs/bug103.go
@@ -10,5 +10,6 @@
 
 func main() {
 	x := f();  // ERROR "mismatch|as value|no type"
+	_ = x
 }
 
diff --git a/test/fixedbugs/bug107.go b/test/fixedbugs/bug107.go
index dcd8e9d..e4b9eb1 100644
--- a/test/fixedbugs/bug107.go
+++ b/test/fixedbugs/bug107.go
@@ -11,5 +11,6 @@
 	 // In the next line "os" should refer to the result variable, not
 	 // to the package.
 	 v := os.Open("", 0, 0);	// ERROR "undefined"
+	 _ = v
 	 return 0
 }
diff --git a/test/fixedbugs/bug122.go b/test/fixedbugs/bug122.go
index 5640cf2..0d9dcd1 100644
--- a/test/fixedbugs/bug122.go
+++ b/test/fixedbugs/bug122.go
@@ -9,4 +9,5 @@
 func main() {
 	// should allow at most 2 sizes
 	a := make([]int, 10, 20, 30, 40); // ERROR "too many|expects 2 or 3 arguments; found 5"
+	_ = a
 }
diff --git a/test/fixedbugs/bug131.go b/test/fixedbugs/bug131.go
index de606da..511928f 100644
--- a/test/fixedbugs/bug131.go
+++ b/test/fixedbugs/bug131.go
@@ -8,5 +8,5 @@
 
 func main() {
 	const a uint64 = 10
-	var b int64 = a // ERROR "convert|cannot|incompatible"
+	var _ int64 = a // ERROR "convert|cannot|incompatible"
 }
diff --git a/test/fixedbugs/bug175.go b/test/fixedbugs/bug175.go
index caf3168..f19025a 100644
--- a/test/fixedbugs/bug175.go
+++ b/test/fixedbugs/bug175.go
@@ -10,4 +10,5 @@
 
 func main() {
 	x, y := f(), 2 // ERROR "multi|2-valued"
+	_, _ = x, y
 }
diff --git a/test/fixedbugs/bug255.go b/test/fixedbugs/bug255.go
index 184ff2d..4f6470f 100644
--- a/test/fixedbugs/bug255.go
+++ b/test/fixedbugs/bug255.go
@@ -13,7 +13,7 @@
 var e [nil]int   // ERROR "use of untyped nil|invalid array (bound|length)|not numeric|must be constant"
 // var f [e]int  // ok with Go 1.17 because an error was reported for e; leads to an error for Go 1.18
 var f [ee]int      // ERROR "undefined|undeclared"
-var g [1 << 65]int // ERROR "array bound is too large|overflows|must be integer"
+var g [1 << 65]int // ERROR "array bound is too large|overflows|invalid array length"
 var h [len(a)]int  // ok
 
 func ff() string
diff --git a/test/fixedbugs/bug289.go b/test/fixedbugs/bug289.go
index 7e8346e..868029a 100644
--- a/test/fixedbugs/bug289.go
+++ b/test/fixedbugs/bug289.go
@@ -10,11 +10,13 @@
 
 func f1() {
 	a, b := f() // ERROR "assignment mismatch|does not match|cannot initialize"
+	_, _ = a, b
 }
 
 func f2() {
 	var a, b int
 	a, b = f() // ERROR "assignment mismatch|does not match|cannot assign"
+	_, _ = a, b
 }
 
 func f() int {
diff --git a/test/fixedbugs/bug369.go b/test/fixedbugs/bug369.go
index 65dd9ad..47258fe 100644
--- a/test/fixedbugs/bug369.go
+++ b/test/fixedbugs/bug369.go
@@ -1,4 +1,4 @@
-// +build !nacl,!js,gc
+// +build !nacl,!js,!wasip1,gc
 // run
 
 // Copyright 2011 The Go Authors. All rights reserved.
diff --git a/test/fixedbugs/bug516.go b/test/fixedbugs/bug516.go
new file mode 100644
index 0000000..e52eb21
--- /dev/null
+++ b/test/fixedbugs/bug516.go
@@ -0,0 +1,13 @@
+// compile
+
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Caused a gofrontend crash.
+
+package p
+
+func F(b []byte, i int) {
+	*(*[1]byte)(b[i*2:]) = [1]byte{}
+}
diff --git a/test/fixedbugs/issue11771.go b/test/fixedbugs/issue11771.go
index e5bed18..657e1b0 100644
--- a/test/fixedbugs/issue11771.go
+++ b/test/fixedbugs/issue11771.go
@@ -1,4 +1,4 @@
-// +build !nacl,!js,gc
+// +build !nacl,!js,!wasip1,gc
 // run
 
 // Copyright 2015 The Go Authors. All rights reserved.
diff --git a/test/fixedbugs/issue13799.go b/test/fixedbugs/issue13799.go
index c8ecfc5..7ab4040 100644
--- a/test/fixedbugs/issue13799.go
+++ b/test/fixedbugs/issue13799.go
@@ -45,8 +45,9 @@
 	// Heap -> stack pointer eventually causes badness when stack reallocation
 	// occurs.
 
-	var fn func()               // ERROR "moved to heap: fn$"
-	for i := 0; i < maxI; i++ { // ERROR "moved to heap: i$"
+	var fn func() // ERROR "moved to heap: fn$"
+	i := 0        // ERROR "moved to heap: i$"
+	for ; i < maxI; i++ {
 		// var fn func() // this makes it work, because fn stays off heap
 		j := 0        // ERROR "moved to heap: j$"
 		fn = func() { // ERROR "func literal escapes to heap$"
diff --git a/test/fixedbugs/issue14636.go b/test/fixedbugs/issue14636.go
index 06fd193..770fb4a 100644
--- a/test/fixedbugs/issue14636.go
+++ b/test/fixedbugs/issue14636.go
@@ -1,4 +1,4 @@
-// +build !nacl,!js,!android,gc
+// +build !nacl,!js,!wasip1,!android,gc
 // run
 
 // Copyright 2016 The Go Authors. All rights reserved.
diff --git a/test/fixedbugs/issue15747.go b/test/fixedbugs/issue15747.go
index c7ef96d..7825958 100644
--- a/test/fixedbugs/issue15747.go
+++ b/test/fixedbugs/issue15747.go
@@ -1,5 +1,8 @@
 // errorcheck -0 -live
 
+//go:build !goexperiment.cgocheck2
+// +build !goexperiment.cgocheck2
+
 // Copyright 2016 The Go Authors.  All rights reserved.
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
diff --git a/test/fixedbugs/issue16037_run.go b/test/fixedbugs/issue16037_run.go
index 68104a9..610fd2d 100644
--- a/test/fixedbugs/issue16037_run.go
+++ b/test/fixedbugs/issue16037_run.go
@@ -1,4 +1,4 @@
-// +build !nacl,!js,!android,!gccgo
+// +build !nacl,!js,!wasip1,!android,!gccgo
 // run
 
 // Copyright 2016 The Go Authors. All rights reserved.
diff --git a/test/fixedbugs/issue19182.go b/test/fixedbugs/issue19182.go
index e1f3ffb..f5e44e9 100644
--- a/test/fixedbugs/issue19182.go
+++ b/test/fixedbugs/issue19182.go
@@ -1,5 +1,5 @@
 // run
-// +build !js
+// +build !js,!wasip1
 
 // Copyright 2017 The Go Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style
diff --git a/test/fixedbugs/issue19658.go b/test/fixedbugs/issue19658.go
index bab409c..1e13573 100644
--- a/test/fixedbugs/issue19658.go
+++ b/test/fixedbugs/issue19658.go
@@ -1,5 +1,5 @@
-// +build !nacl,!js,!gccgo
 // run
+//go:build !nacl && !js && !wasip1 && !gccgo
 
 // Copyright 2017 The Go Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style
@@ -46,7 +46,8 @@
 		Type   string
 		Input  string
 		Expect string
-	}{{"", "nil", "panic: nil"},
+	}{
+		{"", "nil", "panic: panic called with nil argument"},
 		{"errors.New", `"test"`, "panic: test"},
 		{"S", "S{}", "panic: s-stringer"},
 		{"byte", "8", "panic: 8"},
diff --git a/test/fixedbugs/issue20250.go b/test/fixedbugs/issue20250.go
index 7c6e796..c739b6f 100644
--- a/test/fixedbugs/issue20250.go
+++ b/test/fixedbugs/issue20250.go
@@ -1,5 +1,8 @@
 // errorcheck -0 -live -l
 
+//go:build !goexperiment.cgocheck2
+// +build !goexperiment.cgocheck2
+
 // Copyright 2017 The Go Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
@@ -14,12 +17,10 @@
 	s [2]string
 }
 
-func f(a T) { // ERROR "live at entry to f: a"
+func f(a T) { // ERROR "live at entry to f: a$"
 	var e interface{} // ERROR "stack object e interface \{\}$"
-	// TODO(go.dev/issue/54402): Investigate why "live at entry to
-	// f.func1" is sensitive to regabi.
-	func() { // ERROR "live at entry to f.func1: (a &e|&e a)"
-		e = a.s // ERROR "live at call to convT: &e" "stack object a T$"
+	func() {          // ERROR "live at entry to f.func1: &e a$"
+		e = a.s // ERROR "live at call to convT: &e$" "stack object a T$"
 	}()
 	// Before the fix, both a and e were live at the previous line.
 	_ = e
diff --git a/test/fixedbugs/issue21317.go b/test/fixedbugs/issue21317.go
index 81379dc..75d871c 100644
--- a/test/fixedbugs/issue21317.go
+++ b/test/fixedbugs/issue21317.go
@@ -1,4 +1,4 @@
-// +build !js,gc
+// +build !js,!wasip1,gc
 // run
 
 // Copyright 2017 The Go Authors. All rights reserved.
diff --git a/test/fixedbugs/issue21576.go b/test/fixedbugs/issue21576.go
index 3f9b1ba..8e1e3ad 100644
--- a/test/fixedbugs/issue21576.go
+++ b/test/fixedbugs/issue21576.go
@@ -1,6 +1,6 @@
 // run
 
-// +build !nacl,!js,!gccgo
+// +build !nacl,!js,!wasip1,!gccgo
 
 // Copyright 2019 The Go Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style
diff --git a/test/fixedbugs/issue22660.go b/test/fixedbugs/issue22660.go
index 7f542c5..150de17 100644
--- a/test/fixedbugs/issue22660.go
+++ b/test/fixedbugs/issue22660.go
@@ -1,4 +1,4 @@
-// +build !js,gc
+// +build !js,!wasip1,gc
 // run
 
 // Copyright 2017 The Go Authors. All rights reserved.
diff --git a/test/fixedbugs/issue22662b.go b/test/fixedbugs/issue22662b.go
index df4f284..c7a1e05 100644
--- a/test/fixedbugs/issue22662b.go
+++ b/test/fixedbugs/issue22662b.go
@@ -1,4 +1,4 @@
-// +build !js,gc
+// +build !js,!wasip1,gc
 // run
 
 // Copyright 2018 The Go Authors. All rights reserved.
diff --git a/test/fixedbugs/issue26411.go b/test/fixedbugs/issue26411.go
index eb17960..3ae9e03 100644
--- a/test/fixedbugs/issue26411.go
+++ b/test/fixedbugs/issue26411.go
@@ -1,4 +1,4 @@
-// +build !nacl,!js
+// +build !nacl,!js,!wasip1
 // run
 
 // Copyright 2018 The Go Authors. All rights reserved.
diff --git a/test/fixedbugs/issue30085.go b/test/fixedbugs/issue30085.go
index 512355a..f8595ab 100644
--- a/test/fixedbugs/issue30085.go
+++ b/test/fixedbugs/issue30085.go
@@ -9,5 +9,5 @@
 func main() {
 	var c, d = 1, 2, 3 // ERROR "assignment mismatch: 2 variables but 3 values|wrong number of initializations|extra init expr"
 	var e, f, g = 1, 2 // ERROR "assignment mismatch: 3 variables but 2 values|wrong number of initializations|missing init expr"
-	_, _, _, _ = c, d, e, f
+	_, _, _, _, _ = c, d, e, f, g
 }
diff --git a/test/fixedbugs/issue30087.go b/test/fixedbugs/issue30087.go
index 3e4b032..c55c47b 100644
--- a/test/fixedbugs/issue30087.go
+++ b/test/fixedbugs/issue30087.go
@@ -11,5 +11,5 @@
 	_ = 1, 2        // ERROR "assignment mismatch: 1 variable but 2 values|number of variables does not match|cannot assign"
 	c, d := 1       // ERROR "assignment mismatch: 2 variables but 1 value|wrong number of initializations|cannot initialize"
 	e, f := 1, 2, 3 // ERROR "assignment mismatch: 2 variables but 3 values|wrong number of initializations|cannot initialize"
-	_, _, _, _ = c, d, e, f
+	_, _, _, _, _, _ = a, b, c, d, e, f
 }
diff --git a/test/fixedbugs/issue31636.out b/test/fixedbugs/issue31636.out
index e274b2b..de98044 100644
--- a/test/fixedbugs/issue31636.out
+++ b/test/fixedbugs/issue31636.out
@@ -1,3 +1,3 @@
-c
-b
 a
+b
+c
diff --git a/test/fixedbugs/issue33275_run.go b/test/fixedbugs/issue33275_run.go
index ed03dcc..f2818b0 100644
--- a/test/fixedbugs/issue33275_run.go
+++ b/test/fixedbugs/issue33275_run.go
@@ -1,4 +1,4 @@
-// +build !nacl,!js,!gccgo
+// +build !nacl,!js,!wasip1,!gccgo
 // run
 
 // Copyright 2019 The Go Authors. All rights reserved.
diff --git a/test/fixedbugs/issue33555.go b/test/fixedbugs/issue33555.go
index c1fcd2a..e7fe41e 100644
--- a/test/fixedbugs/issue33555.go
+++ b/test/fixedbugs/issue33555.go
@@ -1,4 +1,4 @@
-// +build !nacl,!js,!gccgo
+// +build !nacl,!js,!wasip1,!gccgo
 // run
 
 // Copyright 2019 The Go Authors. All rights reserved.
diff --git a/test/fixedbugs/issue36437.go b/test/fixedbugs/issue36437.go
index c7a11d2..c16e7ef 100644
--- a/test/fixedbugs/issue36437.go
+++ b/test/fixedbugs/issue36437.go
@@ -1,6 +1,6 @@
 // run
 
-// +build !nacl,!js,gc
+// +build !nacl,!js,!wasip1,gc
 
 // Copyright 2020 The Go Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style
diff --git a/test/fixedbugs/issue46234.go b/test/fixedbugs/issue46234.go
index ed1c05c..ae28019 100644
--- a/test/fixedbugs/issue46234.go
+++ b/test/fixedbugs/issue46234.go
@@ -1,7 +1,7 @@
 // buildrun -t 45
 
-//go:build !js
-// +build !js
+//go:build !js && !wasip1
+// +build !js,!wasip1
 
 // Copyright 2021 The Go Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style
diff --git a/test/fixedbugs/issue46903.go b/test/fixedbugs/issue46903.go
index 28cb43d..3a0b604 100644
--- a/test/fixedbugs/issue46903.go
+++ b/test/fixedbugs/issue46903.go
@@ -1,8 +1,5 @@
 // run
-//go:build goexperiment.unified && cgo
-
-// TODO(mdempsky): Enable test unconditionally. This test should pass
-// for non-unified mode too.
+//go:build cgo
 
 // Copyright 2021 The Go Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style
diff --git a/test/fixedbugs/issue48471.go b/test/fixedbugs/issue48471.go
index 062cb5a..75875c4 100644
--- a/test/fixedbugs/issue48471.go
+++ b/test/fixedbugs/issue48471.go
@@ -52,5 +52,5 @@
 
 	var t *T4
 	t = i // ERROR "cannot use i \(variable of type I\) as \*T4 value in assignment: need type assertion"
-	_ = i
+	_ = t
 }
diff --git a/test/fixedbugs/issue48558.go b/test/fixedbugs/issue48558.go
index 9ab56d9..590fd9b 100644
--- a/test/fixedbugs/issue48558.go
+++ b/test/fixedbugs/issue48558.go
@@ -41,6 +41,10 @@
 	a1 := f3()         // ERROR "assignment mismatch: 1 variable but f3 returns 3 values"
 	a2, b2 := f1()     // ERROR "assignment mismatch: 2 variables but f1 returns 1 value"
 	a3, b3, c3 := f2() // ERROR "assignment mismatch: 3 variables but f2 returns 2 values"
+
+	_ = a1
+	_, _ = a2, b2
+	_, _, _ = a3, b3, c3
 }
 
 type T struct{}
@@ -66,6 +70,10 @@
 	a1 := x.f3()         // ERROR "assignment mismatch: 1 variable but .\.f3 returns 3 values"
 	a2, b2 := x.f1()     // ERROR "assignment mismatch: 2 variables but .\.f1 returns 1 value"
 	a3, b3, c3 := x.f2() // ERROR "assignment mismatch: 3 variables but .\.f2 returns 2 values"
+
+	_ = a1
+	_, _ = a2, b2
+	_, _, _ = a3, b3, c3
 }
 
 // some one-off cases
diff --git a/test/fixedbugs/issue49814.go b/test/fixedbugs/issue49814.go
index 9b9695d..067ce42 100644
--- a/test/fixedbugs/issue49814.go
+++ b/test/fixedbugs/issue49814.go
@@ -7,8 +7,8 @@
 package main
 
 // "must be integer" error is for 32-bit architectures
-type V [1 << 50]byte // ERROR "larger than address space|must be integer"
+type V [1 << 50]byte // ERROR "larger than address space|invalid array length"
 
-var X [1 << 50]byte // ERROR "larger than address space|must be integer"
+var X [1 << 50]byte // ERROR "larger than address space|invalid array length"
 
 func main() {}
diff --git a/test/fixedbugs/issue52127.go b/test/fixedbugs/issue52127.go
index 7738c3f..68abe3f 100644
--- a/test/fixedbugs/issue52127.go
+++ b/test/fixedbugs/issue52127.go
@@ -1,6 +1,6 @@
 // run
-//go:build !js
-// +build !js
+//go:build !js && !wasip1
+// +build !js,!wasip1
 
 // Copyright 2022 The Go Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style
diff --git a/test/fixedbugs/issue53309.go b/test/fixedbugs/issue53309.go
index 2b752fe..4ad88d4 100644
--- a/test/fixedbugs/issue53309.go
+++ b/test/fixedbugs/issue53309.go
@@ -38,5 +38,5 @@
 
 func main() {
 	tr := &taskResult{&taskDefinition{}}
-	use(Value[string](tr))
+	use[string](Value[string](tr))
 }
diff --git a/test/fixedbugs/issue53439.go b/test/fixedbugs/issue53439.go
index dc444b8..f366a44 100644
--- a/test/fixedbugs/issue53439.go
+++ b/test/fixedbugs/issue53439.go
@@ -1,5 +1,4 @@
 // compile
-//go:build goexperiment.unified
 
 // Copyright 2022 The Go Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style
diff --git a/test/fixedbugs/issue54159.go b/test/fixedbugs/issue54159.go
new file mode 100644
index 0000000..8ef0e68
--- /dev/null
+++ b/test/fixedbugs/issue54159.go
@@ -0,0 +1,22 @@
+// errorcheck -0 -m=2
+
+// Copyright 2023 The Go Authors. 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
+
+func run() { // ERROR "cannot inline run: recursive"
+	f := func() { // ERROR "can inline run.func1 with cost .* as:.*" "func literal does not escape"
+		g() // ERROR "inlining call to g"
+	}
+	f() // ERROR "inlining call to run.func1" "inlining call to g"
+	run()
+}
+
+func g() { // ERROR "can inline g with cost .* as:.*"
+}
+
+func main() { // ERROR "can inline main with cost .* as:.*"
+	run()
+}
diff --git a/test/fixedbugs/issue55242.go b/test/fixedbugs/issue55242.go
new file mode 100644
index 0000000..4b29eb8
--- /dev/null
+++ b/test/fixedbugs/issue55242.go
@@ -0,0 +1,18 @@
+// compile
+
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Issue 55242: gofrontend crash calling function that returns
+// trailing empty struct.
+
+package p
+
+func F1() (int, struct{}) {
+	return 0, struct{}{}
+}
+
+func F2() {
+	F1()
+}
diff --git a/test/fixedbugs/issue5609.go b/test/fixedbugs/issue5609.go
index a39d3fb..43ad185 100644
--- a/test/fixedbugs/issue5609.go
+++ b/test/fixedbugs/issue5609.go
@@ -10,4 +10,4 @@
 
 const Large uint64 = 18446744073709551615
 
-var foo [Large]uint64 // ERROR "array bound is too large|array bound overflows|array length.*must be integer"
+var foo [Large]uint64 // ERROR "array bound is too large|array bound overflows|invalid array length"
diff --git a/test/fixedbugs/issue56778.go b/test/fixedbugs/issue56778.go
index 3c27501..8bb5c3e 100644
--- a/test/fixedbugs/issue56778.go
+++ b/test/fixedbugs/issue56778.go
@@ -1,4 +1,4 @@
-// compiledir -d=inlstaticinit=1
+// compiledir
 
 // Copyright 2022 The Go Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style
diff --git a/test/fixedbugs/issue57955.go b/test/fixedbugs/issue57955.go
new file mode 100644
index 0000000..bee28c6e
--- /dev/null
+++ b/test/fixedbugs/issue57955.go
@@ -0,0 +1,43 @@
+// compile
+
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Issue 57955: ARM assembler fails to handle certain cases.
+
+package main
+
+func main() {
+	Decode[int16](nil)
+	Decode[uint16](nil)
+	Decode[float64](nil)
+}
+
+func DecodeInt16(b []byte) (int16, int) {
+	return 0, 0
+}
+
+func DecodeUint16(b []byte) (uint16, int) {
+	return 0, 0
+}
+
+func DecodeFloat64(b []byte) (float64, int) {
+	return 0, 0
+}
+
+func Decode[T any](b []byte) (T, int) {
+	switch any(*new(T)).(type) {
+	case int16:
+		v, n := DecodeInt16(b)
+		return any(v).(T), n
+	case uint16:
+		v, n := DecodeUint16(b)
+		return any(v).(T), n
+	case float64:
+		v, n := DecodeFloat64(b)
+		return any(v).(T), n
+	default:
+		panic("")
+	}
+}
diff --git a/test/fixedbugs/issue58161.go b/test/fixedbugs/issue58161.go
new file mode 100644
index 0000000..33113f6
--- /dev/null
+++ b/test/fixedbugs/issue58161.go
@@ -0,0 +1,15 @@
+// compile -d=ssa/check/seed=1
+
+// Copyright 2023 The Go Authors. 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
+
+func F[G int]() int {
+	return len(make([]int, copy([]G{}, []G{})))
+}
+
+func main() {
+	F[int]()
+}
diff --git a/test/fixedbugs/issue58300.go b/test/fixedbugs/issue58300.go
new file mode 100644
index 0000000..fff3d21
--- /dev/null
+++ b/test/fixedbugs/issue58300.go
@@ -0,0 +1,29 @@
+// run
+
+// Copyright 2023 The Go Authors. 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"
+)
+
+func f(n int) int {
+	return n % 2
+}
+
+func g(n int) int {
+	return f(n)
+}
+
+func name(fn any) (res string) {
+	return runtime.FuncForPC(uintptr(reflect.ValueOf(fn).Pointer())).Name()
+}
+
+func main() {
+	println(name(f))
+	println(name(g))
+}
diff --git a/test/fixedbugs/issue58300.out b/test/fixedbugs/issue58300.out
new file mode 100644
index 0000000..f347287
--- /dev/null
+++ b/test/fixedbugs/issue58300.out
@@ -0,0 +1,2 @@
+main.f
+main.g
diff --git a/test/fixedbugs/issue58300b.go b/test/fixedbugs/issue58300b.go
new file mode 100644
index 0000000..5192b3f
--- /dev/null
+++ b/test/fixedbugs/issue58300b.go
@@ -0,0 +1,35 @@
+// run
+
+// Copyright 2023 The Go Authors. 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"
+)
+
+type T struct {
+	a, b int
+}
+
+func f(t *T) int {
+	if t != nil {
+		return t.b
+	}
+	return 0
+}
+
+func g(t *T) int {
+	return f(t) + 5
+}
+
+func main() {
+	x(f)
+	x(g)
+}
+func x(v any) {
+	println(runtime.FuncForPC(reflect.ValueOf(v).Pointer()).Name())
+}
diff --git a/test/fixedbugs/issue58300b.out b/test/fixedbugs/issue58300b.out
new file mode 100644
index 0000000..f347287
--- /dev/null
+++ b/test/fixedbugs/issue58300b.out
@@ -0,0 +1,2 @@
+main.f
+main.g
diff --git a/test/fixedbugs/issue58339.dir/a.go b/test/fixedbugs/issue58339.dir/a.go
new file mode 100644
index 0000000..22cbe0c
--- /dev/null
+++ b/test/fixedbugs/issue58339.dir/a.go
@@ -0,0 +1,17 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package a
+
+func Assert(msgAndArgs ...any) {
+}
+
+func Run() int {
+	Assert("%v")
+	return 0
+}
+
+func Run2() int {
+	return Run()
+}
diff --git a/test/fixedbugs/issue58339.dir/b.go b/test/fixedbugs/issue58339.dir/b.go
new file mode 100644
index 0000000..1736ec7
--- /dev/null
+++ b/test/fixedbugs/issue58339.dir/b.go
@@ -0,0 +1,9 @@
+// Copyright 2023 The Go Authors. 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"
+
+var A = a.Run2()
diff --git a/test/fixedbugs/issue58339.go b/test/fixedbugs/issue58339.go
new file mode 100644
index 0000000..5c4c5c0
--- /dev/null
+++ b/test/fixedbugs/issue58339.go
@@ -0,0 +1,7 @@
+// compiledir
+
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package ignored
diff --git a/test/fixedbugs/issue58345.go b/test/fixedbugs/issue58345.go
new file mode 100644
index 0000000..ede8ffd
--- /dev/null
+++ b/test/fixedbugs/issue58345.go
@@ -0,0 +1,15 @@
+// compile
+
+// Copyright 2023 The Go Authors. 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 I1 interface {
+	int | any
+}
+
+type I2 interface {
+	int | any
+}
diff --git a/test/fixedbugs/issue58439.go b/test/fixedbugs/issue58439.go
new file mode 100644
index 0000000..ad3650f
--- /dev/null
+++ b/test/fixedbugs/issue58439.go
@@ -0,0 +1,14 @@
+// compile
+
+// Copyright 2023 The Go Authors. 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
+
+var x = f(-1)
+var y = f(64)
+
+func f(x int) int {
+	return 1 << x
+}
diff --git a/test/fixedbugs/issue58572.go b/test/fixedbugs/issue58572.go
new file mode 100644
index 0000000..7461d59
--- /dev/null
+++ b/test/fixedbugs/issue58572.go
@@ -0,0 +1,29 @@
+// compile
+
+// Copyright 2023 The Go Authors. 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
+
+func New() resource {
+	return &Client{}
+}
+
+type resource interface {
+	table()
+}
+
+type Client struct {
+	m map[Key1]int
+}
+
+func (c *Client) table() {}
+
+type Key1 struct {
+	K Key2
+}
+
+type Key2 struct {
+	f [2]any
+}
diff --git a/test/fixedbugs/issue58671.go b/test/fixedbugs/issue58671.go
new file mode 100644
index 0000000..ae8f7a3
--- /dev/null
+++ b/test/fixedbugs/issue58671.go
@@ -0,0 +1,19 @@
+// run
+
+// Copyright 2023 The Go Authors. 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
+
+func g[P any](...P) P { var zero P; return zero }
+
+var (
+	_ int        = g(1, 2)
+	_ rune       = g(1, 'a')
+	_ float64    = g(1, 'a', 2.3)
+	_ float64    = g('a', 2.3)
+	_ complex128 = g(2.3, 'a', 1i)
+)
+
+func main() {}
diff --git a/test/fixedbugs/issue58826.go b/test/fixedbugs/issue58826.go
new file mode 100644
index 0000000..de92002
--- /dev/null
+++ b/test/fixedbugs/issue58826.go
@@ -0,0 +1,23 @@
+// compile -dynlink
+
+//go:build 386 || amd64 || arm || arm64 || ppc64le || s390x
+// (platforms that support -dynlink flag)
+
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Issue 58826: assembler cannot handle global access with large
+// offset in -dynlink mode on ARM64.
+
+package p
+
+var x [2197]uint8
+
+func F() {
+	for _, i := range x {
+		G(i)
+	}
+}
+
+func G(uint8)
diff --git a/test/fixedbugs/issue59169.go b/test/fixedbugs/issue59169.go
new file mode 100644
index 0000000..61e2a95
--- /dev/null
+++ b/test/fixedbugs/issue59169.go
@@ -0,0 +1,13 @@
+// compile
+
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Issue 59169: caused gofrontend crash.
+
+package p
+
+func F(p *[]byte) {
+	*(*[1]byte)(*p) = *(*[1]byte)((*p)[1:])
+}
diff --git a/test/fixedbugs/issue59174.go b/test/fixedbugs/issue59174.go
new file mode 100644
index 0000000..33a19a4
--- /dev/null
+++ b/test/fixedbugs/issue59174.go
@@ -0,0 +1,12 @@
+// compile
+
+// Copyright 2023 The Go Authors. 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
+
+func p() {
+	s := make([]int, copy([]byte{' '}, "")-1)
+	_ = append([]int{}, make([]int, len(s))...)
+}
diff --git a/test/fixedbugs/issue59190.go b/test/fixedbugs/issue59190.go
new file mode 100644
index 0000000..48273ea
--- /dev/null
+++ b/test/fixedbugs/issue59190.go
@@ -0,0 +1,39 @@
+// errorcheck
+
+// Copyright 2023 The Go Authors. 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"
+
+type E [1 << 30]complex128
+
+var a [1 << 30]E
+var _ = unsafe.Sizeof(a) // ERROR "too large"
+
+var s struct {
+	_ [1 << 30]E
+	x int
+}
+var _ = unsafe.Offsetof(s.x) // ERROR "too large"
+
+// Test case from issue (modified so it also triggers on 32-bit platforms).
+
+type A [1]int
+type S struct {
+	x A
+	y [1 << 30]A
+	z [1 << 30]struct{}
+}
+type T [1 << 30][1 << 30]S
+
+func _() {
+	var a A
+	var s S
+	var t T
+	_ = unsafe.Sizeof(a)
+	_ = unsafe.Sizeof(s)
+	_ = unsafe.Sizeof(t) // ERROR "too large"
+}
diff --git a/test/fixedbugs/issue59293.go b/test/fixedbugs/issue59293.go
new file mode 100644
index 0000000..1f05fe9
--- /dev/null
+++ b/test/fixedbugs/issue59293.go
@@ -0,0 +1,28 @@
+// run
+
+// Copyright 2023 The Go Authors. 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 "unsafe"
+
+//go:noinline
+func f(x []byte) bool {
+	return unsafe.SliceData(x) != nil
+}
+
+//go:noinline
+func g(x string) bool {
+	return unsafe.StringData(x) != nil
+}
+
+func main() {
+	if f(nil) {
+		panic("bad f")
+	}
+	if g("") {
+		panic("bad g")
+	}
+}
diff --git a/test/fixedbugs/issue59334.go b/test/fixedbugs/issue59334.go
new file mode 100644
index 0000000..06c12cf
--- /dev/null
+++ b/test/fixedbugs/issue59334.go
@@ -0,0 +1,18 @@
+// run -tags=purego -gcflags=all=-d=checkptr
+
+// Copyright 2023 The Go Authors. 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 "crypto/subtle"
+
+func main() {
+	dst := make([]byte, 5)
+	src := make([]byte, 5)
+	for _, n := range []int{1024, 2048} { // just to make the size non-constant
+		b := make([]byte, n)
+		subtle.XORBytes(dst, src, b[n-5:])
+	}
+}
diff --git a/test/fixedbugs/issue59338.go b/test/fixedbugs/issue59338.go
new file mode 100644
index 0000000..8ba3fd2
--- /dev/null
+++ b/test/fixedbugs/issue59338.go
@@ -0,0 +1,37 @@
+// run
+
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Smoke test for reverse type inference.
+// The type checker has more expansive tests.
+
+package main
+
+func main() {
+	var f1 func(int) int
+	f1 = g1
+	if f1(1) != g1(1) {
+		panic(1)
+	}
+
+	var f2 func(int) string = g2
+	if f2(2) != "" {
+		panic(2)
+	}
+
+	if g3(g1, 3) != g1(3) {
+		panic(3)
+	}
+
+	if g4(g2, 4) != "" {
+		panic(4)
+	}
+}
+
+func g1[P any](x P) P    { return x }
+func g2[P, Q any](x P) Q { var q Q; return q }
+
+func g3(f1 func(int) int, x int) int       { return f1(x) }
+func g4(f2 func(int) string, x int) string { return f2(x) }
diff --git a/test/fixedbugs/issue59367.go b/test/fixedbugs/issue59367.go
new file mode 100644
index 0000000..32a79e1
--- /dev/null
+++ b/test/fixedbugs/issue59367.go
@@ -0,0 +1,80 @@
+// run
+
+// Copyright 2023 The Go Authors. 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
+
+func main() {
+	var b [8]byte
+	one := uint8(1)
+	f16(&one, b[:2])
+	if b[1] != 1 {
+		println("2-byte value lost")
+	}
+	f32(&one, b[:4])
+	if b[3] != 1 {
+		println("4-byte value lost")
+	}
+	f64(&one, b[:8])
+	if b[7] != 1 {
+		println("8-byte value lost")
+	}
+}
+
+//go:noinline
+func f16(p *uint8, b []byte) {
+	_ = b[1]            // bounds check
+	x := *p             // load a byte
+	y := uint16(x)      // zero extend to 16 bits
+	b[0] = byte(y >> 8) // compute ROLW
+	b[1] = byte(y)
+	nop()               // spill/restore ROLW
+	b[0] = byte(y >> 8) // use ROLW
+	b[1] = byte(y)
+}
+
+//go:noinline
+func f32(p *uint8, b []byte) {
+	_ = b[3]             // bounds check
+	x := *p              // load a byte
+	y := uint32(x)       // zero extend to 32 bits
+	b[0] = byte(y >> 24) // compute ROLL
+	b[1] = byte(y >> 16)
+	b[2] = byte(y >> 8)
+	b[3] = byte(y)
+	nop()                // spill/restore ROLL
+	b[0] = byte(y >> 24) // use ROLL
+	b[1] = byte(y >> 16)
+	b[2] = byte(y >> 8)
+	b[3] = byte(y)
+}
+
+//go:noinline
+func f64(p *uint8, b []byte) {
+	_ = b[7]             // bounds check
+	x := *p              // load a byte
+	y := uint64(x)       // zero extend to 64 bits
+	b[0] = byte(y >> 56) // compute ROLQ
+	b[1] = byte(y >> 48)
+	b[2] = byte(y >> 40)
+	b[3] = byte(y >> 32)
+	b[4] = byte(y >> 24)
+	b[5] = byte(y >> 16)
+	b[6] = byte(y >> 8)
+	b[7] = byte(y)
+	nop()                // spill/restore ROLQ
+	b[0] = byte(y >> 56) // use ROLQ
+	b[1] = byte(y >> 48)
+	b[2] = byte(y >> 40)
+	b[3] = byte(y >> 32)
+	b[4] = byte(y >> 24)
+	b[5] = byte(y >> 16)
+	b[6] = byte(y >> 8)
+	b[7] = byte(y)
+}
+
+//go:noinline
+func nop() {
+}
diff --git a/test/fixedbugs/issue59378.go b/test/fixedbugs/issue59378.go
new file mode 100644
index 0000000..8ff198e
--- /dev/null
+++ b/test/fixedbugs/issue59378.go
@@ -0,0 +1,26 @@
+// compile
+
+// Copyright 2023 The Go Authors. 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
+
+func f() {
+	F([]int{}, func(*int) bool { return true })
+}
+
+func F[S []E, E any](a S, fn func(*E) bool) {
+	for _, v := range a {
+		G(a, func(e E) bool { return fn(&v) })
+	}
+}
+
+func G[E any](s []E, f func(E) bool) int {
+	for i, v := range s {
+		if f(v) {
+			return i
+		}
+	}
+	return -1
+}
diff --git a/test/fixedbugs/issue59404.go b/test/fixedbugs/issue59404.go
new file mode 100644
index 0000000..0f391e6
--- /dev/null
+++ b/test/fixedbugs/issue59404.go
@@ -0,0 +1,61 @@
+// build -gcflags=-l=4
+
+// Copyright 2023 The Go Authors. 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 Interface interface {
+	MonitoredResource() (resType string, labels map[string]string)
+	Done()
+}
+
+func Autodetect() Interface {
+	return func() Interface {
+		Do(func() {
+			var ad, gd Interface
+
+			go func() {
+				defer gd.Done()
+				ad = aad()
+			}()
+			go func() {
+				defer ad.Done()
+				gd = aad()
+				defer func() { recover() }()
+			}()
+
+			autoDetected = ad
+			if gd != nil {
+				autoDetected = gd
+			}
+		})
+		return autoDetected
+	}()
+}
+
+var autoDetected Interface
+var G int
+
+type If int
+
+func (x If) MonitoredResource() (resType string, labels map[string]string) {
+	return "", nil
+}
+
+//go:noinline
+func (x If) Done() {
+	G++
+}
+
+//go:noinline
+func Do(fn func()) {
+	fn()
+}
+
+//go:noinline
+func aad() Interface {
+	var x If
+	return x
+}
diff --git a/test/fixedbugs/issue59404part2.go b/test/fixedbugs/issue59404part2.go
new file mode 100644
index 0000000..37fa029
--- /dev/null
+++ b/test/fixedbugs/issue59404part2.go
@@ -0,0 +1,24 @@
+// run
+
+// Copyright 2023 The Go Authors. 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 G func(int) int
+
+//go:noinline
+func callclo(q, r int) int {
+	p := func(z int) int {
+		G = func(int) int { return 1 }
+		return z + 1
+	}
+	res := p(q) ^ p(r) // These calls to "p" will be inlined
+	G = p
+	return res
+}
+
+func main() {
+	callclo(1, 2)
+}
diff --git a/test/fixedbugs/issue59411.go b/test/fixedbugs/issue59411.go
new file mode 100644
index 0000000..fc35c98
--- /dev/null
+++ b/test/fixedbugs/issue59411.go
@@ -0,0 +1,77 @@
+// run
+
+// Copyright 2023 The Go Authors. 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 (
+	"math"
+	"reflect"
+)
+
+func main() {
+	for i := 0; i < 100; i++ {
+		f()
+		g()
+	}
+}
+
+func f() {
+	// Allocate map.
+	m := map[float64]int{}
+	// Fill to just before a growth trigger.
+	const N = 13 << 4 // 6.5 * 2 * 2^k
+	for i := 0; i < N; i++ {
+		m[math.NaN()] = i
+	}
+	// Trigger growth.
+	m[math.NaN()] = N
+
+	// Iterate through map.
+	i := 0
+	for range m {
+		if i == 6 {
+			// Partway through iteration, clear the map.
+			clear(m)
+		} else if i > 6 {
+			// If we advance to the next iteration, that's a bug.
+			panic("BAD")
+		}
+		i++
+	}
+	if len(m) != 0 {
+		panic("clear did not empty the map")
+	}
+}
+
+func g() {
+	// Allocate map.
+	m := map[float64]int{}
+	// Fill to just before a growth trigger.
+	const N = 13 << 4 // 6.5 * 2 * 2^k
+	for i := 0; i < N; i++ {
+		m[math.NaN()] = i
+	}
+	// Trigger growth.
+	m[math.NaN()] = N
+
+	// Iterate through map.
+	i := 0
+	v := reflect.ValueOf(m)
+	iter := v.MapRange()
+	for iter.Next() {
+		if i == 6 {
+			// Partway through iteration, clear the map.
+			v.Clear()
+		} else if i > 6 {
+			// If we advance to the next iteration, that's a bug.
+			panic("BAD")
+		}
+		i++
+	}
+	if v.Len() != 0 {
+		panic("clear did not empty the map")
+	}
+}
diff --git a/test/fixedbugs/issue59572.go b/test/fixedbugs/issue59572.go
new file mode 100644
index 0000000..a16817a
--- /dev/null
+++ b/test/fixedbugs/issue59572.go
@@ -0,0 +1,30 @@
+// run
+
+// Copyright 2023 The Go Authors. 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
+
+func foo() {
+	println("foo")
+}
+
+func main() {
+	fn := foo
+	for _, fn = range list {
+		fn()
+	}
+}
+
+var list = []func(){
+	func() {
+		println("1")
+	},
+	func() {
+		println("2")
+	},
+	func() {
+		println("3")
+	},
+}
diff --git a/test/fixedbugs/issue59572.out b/test/fixedbugs/issue59572.out
new file mode 100644
index 0000000..01e79c3
--- /dev/null
+++ b/test/fixedbugs/issue59572.out
@@ -0,0 +1,3 @@
+1
+2
+3
diff --git a/test/fixedbugs/issue59638.go b/test/fixedbugs/issue59638.go
new file mode 100644
index 0000000..bba6265
--- /dev/null
+++ b/test/fixedbugs/issue59638.go
@@ -0,0 +1,65 @@
+// build -gcflags=-l=4
+
+// Copyright 2023 The Go Authors. 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 Interface interface {
+	MonitoredResource() (resType string, labels map[string]string)
+	Done()
+}
+
+func Autodetect(x int) Interface {
+	return func() Interface {
+		func() Interface {
+			x++
+			Do(func() {
+				var ad, gd Interface
+
+				go func() {
+					defer gd.Done()
+					ad = aad()
+				}()
+				go func() {
+					defer ad.Done()
+					gd = aad()
+					defer func() { recover() }()
+				}()
+
+				autoDetected = ad
+				if gd != nil {
+					autoDetected = gd
+				}
+			})
+			return autoDetected
+		}()
+		return nil
+	}()
+}
+
+var autoDetected Interface
+var G int
+
+type If int
+
+func (x If) MonitoredResource() (resType string, labels map[string]string) {
+	return "", nil
+}
+
+//go:noinline
+func (x If) Done() {
+	G++
+}
+
+//go:noinline
+func Do(fn func()) {
+	fn()
+}
+
+//go:noinline
+func aad() Interface {
+	var x If
+	return x
+}
diff --git a/test/fixedbugs/issue59680.go b/test/fixedbugs/issue59680.go
new file mode 100644
index 0000000..d21f61f
--- /dev/null
+++ b/test/fixedbugs/issue59680.go
@@ -0,0 +1,100 @@
+// run
+
+// Copyright 2023 The Go Authors. 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 (
+	"sync"
+	"time"
+)
+
+type B struct {
+	pid int
+	f   func() (uint64, error)
+	wg  sync.WaitGroup
+	v   uint64
+}
+
+func newB(pid int) *B {
+	return &B{
+		pid: pid,
+	}
+}
+
+//go:noinline
+func Sq(i int) uint64 {
+	S++
+	return uint64(i * i)
+}
+
+type RO func(*B)
+
+var ROSL = []RO{
+	Bad(),
+}
+
+func Bad() RO {
+	return func(b *B) {
+		b.f = func() (uint64, error) {
+			return Sq(b.pid), nil
+		}
+	}
+}
+
+func (b *B) startit() chan<- struct{} {
+	stop := make(chan struct{})
+	b.wg.Add(1)
+	go func() {
+		defer b.wg.Done()
+		var v uint64
+		for {
+			select {
+			case <-stop:
+				b.v = v
+				return
+			case <-time.After(1 * time.Millisecond):
+				r, err := b.f()
+				if err != nil {
+					panic("bad")
+				}
+				v = r
+			}
+		}
+	}()
+	return stop
+}
+
+var S, G int
+
+//go:noinline
+func rec(x int) int {
+	if x == 0 {
+		return 9
+	}
+	return rec(x-1) + 1
+}
+
+//go:noinline
+func recur(x int) {
+	for i := 0; i < x; i++ {
+		G = rec(i)
+	}
+}
+
+func main() {
+	b := newB(17)
+	for _, opt := range ROSL {
+		opt(b)
+	}
+	stop := b.startit()
+
+	// see if we can get some stack growth/moving
+	recur(10101)
+
+	if stop != nil {
+		stop <- struct{}{}
+	}
+}
diff --git a/test/fixedbugs/issue59709.dir/aconfig.go b/test/fixedbugs/issue59709.dir/aconfig.go
new file mode 100644
index 0000000..01b3cf4
--- /dev/null
+++ b/test/fixedbugs/issue59709.dir/aconfig.go
@@ -0,0 +1,10 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package aconfig
+
+type Config struct {
+	name string
+	blah int
+}
diff --git a/test/fixedbugs/issue59709.dir/bresource.go b/test/fixedbugs/issue59709.dir/bresource.go
new file mode 100644
index 0000000..9fae099
--- /dev/null
+++ b/test/fixedbugs/issue59709.dir/bresource.go
@@ -0,0 +1,27 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package bresource
+
+type Resource[T any] struct {
+	name        string
+	initializer Initializer[T]
+	cfg         ResConfig
+	value       T
+}
+
+func Should[T any](r *Resource[T], e error) bool {
+	return r.cfg.ShouldRetry(e)
+}
+
+type ResConfig struct {
+	ShouldRetry func(error) bool
+	TearDown    func()
+}
+
+type Initializer[T any] func(*int) (T, error)
+
+func New[T any](name string, f Initializer[T], cfg ResConfig) *Resource[T] {
+	return &Resource[T]{name: name, initializer: f, cfg: cfg}
+}
diff --git a/test/fixedbugs/issue59709.dir/cmem.go b/test/fixedbugs/issue59709.dir/cmem.go
new file mode 100644
index 0000000..43c4fe9
--- /dev/null
+++ b/test/fixedbugs/issue59709.dir/cmem.go
@@ -0,0 +1,37 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package cmem
+
+import (
+	"./aconfig"
+	"./bresource"
+)
+
+type MemT *int
+
+var G int
+
+type memResource struct {
+	x *int
+}
+
+func (m *memResource) initialize(*int) (res *int, err error) {
+	return nil, nil
+}
+
+func (m *memResource) teardown() {
+}
+
+func NewResource(cfg *aconfig.Config) *bresource.Resource[*int] {
+	res := &memResource{
+		x: &G,
+	}
+
+	return bresource.New("Mem", res.initialize, bresource.ResConfig{
+		// We always would want to retry the Memcache initialization.
+		ShouldRetry: func(error) bool { return true },
+		TearDown:    res.teardown,
+	})
+}
diff --git a/test/fixedbugs/issue59709.dir/dcache.go b/test/fixedbugs/issue59709.dir/dcache.go
new file mode 100644
index 0000000..ea63219
--- /dev/null
+++ b/test/fixedbugs/issue59709.dir/dcache.go
@@ -0,0 +1,39 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package dcache
+
+import (
+	"./aconfig"
+	"./bresource"
+	"./cmem"
+)
+
+type Module struct {
+	cfg  *aconfig.Config
+	err  error
+	last any
+}
+
+//go:noinline
+func TD() {
+}
+
+func (m *Module) Configure(x string) error {
+	if m.err != nil {
+		return m.err
+	}
+	res := cmem.NewResource(m.cfg)
+	m.last = res
+
+	return nil
+}
+
+func (m *Module) Blurb(x string, e error) bool {
+	res, ok := m.last.(*bresource.Resource[*int])
+	if !ok {
+		panic("bad")
+	}
+	return bresource.Should(res, e)
+}
diff --git a/test/fixedbugs/issue59709.dir/main.go b/test/fixedbugs/issue59709.dir/main.go
new file mode 100644
index 0000000..c699a01
--- /dev/null
+++ b/test/fixedbugs/issue59709.dir/main.go
@@ -0,0 +1,17 @@
+// Copyright 2023 The Go Authors. 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 (
+	"./dcache"
+)
+
+func main() {
+	var m dcache.Module
+	m.Configure("x")
+	m.Configure("y")
+	var e error
+	m.Blurb("x", e)
+}
diff --git a/test/fixedbugs/issue59709.go b/test/fixedbugs/issue59709.go
new file mode 100644
index 0000000..8fe8d87
--- /dev/null
+++ b/test/fixedbugs/issue59709.go
@@ -0,0 +1,7 @@
+// rundir
+
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package ignored
diff --git a/test/fixedbugs/issue60582.go b/test/fixedbugs/issue60582.go
new file mode 100644
index 0000000..f698918
--- /dev/null
+++ b/test/fixedbugs/issue60582.go
@@ -0,0 +1,15 @@
+// build
+
+// Copyright 2023 The Go Authors. 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"
+
+func main() {
+	a, b := 5, 7
+	fmt.Println(min(a, b))
+	fmt.Println(max(a, b))
+}
diff --git a/test/fixedbugs/issue60601.go b/test/fixedbugs/issue60601.go
new file mode 100644
index 0000000..5308989
--- /dev/null
+++ b/test/fixedbugs/issue60601.go
@@ -0,0 +1,50 @@
+// run
+
+// Copyright 2023 The Go Authors. 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 (
+	"strings"
+	"unsafe"
+)
+
+func shift[T any]() int64 {
+	return 1 << unsafe.Sizeof(*new(T))
+}
+
+func div[T any]() uintptr {
+	return 1 / unsafe.Sizeof(*new(T))
+}
+
+func add[T any]() int64 {
+	return 1<<63 - 1 + int64(unsafe.Sizeof(*new(T)))
+}
+
+func main() {
+	shift[[62]byte]()
+	shift[[63]byte]()
+	shift[[64]byte]()
+	shift[[100]byte]()
+	shift[[1e6]byte]()
+
+	add[[1]byte]()
+	shouldPanic("divide by zero", func() { div[[0]byte]() })
+}
+
+func shouldPanic(str string, f func()) {
+	defer func() {
+		err := recover()
+		if err == nil {
+			panic("did not panic")
+		}
+		s := err.(error).Error()
+		if !strings.Contains(s, str) {
+			panic("got panic " + s + ", want " + str)
+		}
+	}()
+
+	f()
+}
diff --git a/test/fixedbugs/issue60945.dir/a.go b/test/fixedbugs/issue60945.dir/a.go
new file mode 100644
index 0000000..663a0cf
--- /dev/null
+++ b/test/fixedbugs/issue60945.dir/a.go
@@ -0,0 +1,22 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package a
+
+type S struct{}
+
+func callClosure(closure func()) {
+	closure()
+}
+
+func (s *S) M() {
+	callClosure(func() {
+		defer f(s.m) // prevent closures to be inlined.
+	})
+}
+
+func (s *S) m() {}
+
+//go:noinline
+func f(a ...any) {}
diff --git a/test/fixedbugs/issue60945.dir/b.go b/test/fixedbugs/issue60945.dir/b.go
new file mode 100644
index 0000000..e60d9dc
--- /dev/null
+++ b/test/fixedbugs/issue60945.dir/b.go
@@ -0,0 +1,9 @@
+// Copyright 2023 The Go Authors. 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"
+
+var _ = (&a.S{}).M
diff --git a/test/fixedbugs/issue60945.go b/test/fixedbugs/issue60945.go
new file mode 100644
index 0000000..5c4c5c0
--- /dev/null
+++ b/test/fixedbugs/issue60945.go
@@ -0,0 +1,7 @@
+// compiledir
+
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package ignored
diff --git a/test/fixedbugs/issue60982.go b/test/fixedbugs/issue60982.go
new file mode 100644
index 0000000..4e5fc34
--- /dev/null
+++ b/test/fixedbugs/issue60982.go
@@ -0,0 +1,2023 @@
+// compile
+
+// Copyright 2023 The Go Authors. 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
+
+func f(x int, b bool) int {
+	if x >= 1000 {
+		if b { // from #61041
+			var a struct{ f int64 }
+			_ = max(0, a.f)
+		}
+
+		return max(x, 2000)
+	}
+	// generate 1000 basic blocks to put this function
+	// well into the "large function" phi generation algorithm.
+	switch x {
+	case 0:
+		return 0
+	case 1:
+		return 1
+	case 2:
+		return 2
+	case 3:
+		return 3
+	case 4:
+		return 4
+	case 5:
+		return 5
+	case 6:
+		return 6
+	case 7:
+		return 7
+	case 8:
+		return 8
+	case 9:
+		return 9
+	case 10:
+		return 10
+	case 11:
+		return 11
+	case 12:
+		return 12
+	case 13:
+		return 13
+	case 14:
+		return 14
+	case 15:
+		return 15
+	case 16:
+		return 16
+	case 17:
+		return 17
+	case 18:
+		return 18
+	case 19:
+		return 19
+	case 20:
+		return 20
+	case 21:
+		return 21
+	case 22:
+		return 22
+	case 23:
+		return 23
+	case 24:
+		return 24
+	case 25:
+		return 25
+	case 26:
+		return 26
+	case 27:
+		return 27
+	case 28:
+		return 28
+	case 29:
+		return 29
+	case 30:
+		return 30
+	case 31:
+		return 31
+	case 32:
+		return 32
+	case 33:
+		return 33
+	case 34:
+		return 34
+	case 35:
+		return 35
+	case 36:
+		return 36
+	case 37:
+		return 37
+	case 38:
+		return 38
+	case 39:
+		return 39
+	case 40:
+		return 40
+	case 41:
+		return 41
+	case 42:
+		return 42
+	case 43:
+		return 43
+	case 44:
+		return 44
+	case 45:
+		return 45
+	case 46:
+		return 46
+	case 47:
+		return 47
+	case 48:
+		return 48
+	case 49:
+		return 49
+	case 50:
+		return 50
+	case 51:
+		return 51
+	case 52:
+		return 52
+	case 53:
+		return 53
+	case 54:
+		return 54
+	case 55:
+		return 55
+	case 56:
+		return 56
+	case 57:
+		return 57
+	case 58:
+		return 58
+	case 59:
+		return 59
+	case 60:
+		return 60
+	case 61:
+		return 61
+	case 62:
+		return 62
+	case 63:
+		return 63
+	case 64:
+		return 64
+	case 65:
+		return 65
+	case 66:
+		return 66
+	case 67:
+		return 67
+	case 68:
+		return 68
+	case 69:
+		return 69
+	case 70:
+		return 70
+	case 71:
+		return 71
+	case 72:
+		return 72
+	case 73:
+		return 73
+	case 74:
+		return 74
+	case 75:
+		return 75
+	case 76:
+		return 76
+	case 77:
+		return 77
+	case 78:
+		return 78
+	case 79:
+		return 79
+	case 80:
+		return 80
+	case 81:
+		return 81
+	case 82:
+		return 82
+	case 83:
+		return 83
+	case 84:
+		return 84
+	case 85:
+		return 85
+	case 86:
+		return 86
+	case 87:
+		return 87
+	case 88:
+		return 88
+	case 89:
+		return 89
+	case 90:
+		return 90
+	case 91:
+		return 91
+	case 92:
+		return 92
+	case 93:
+		return 93
+	case 94:
+		return 94
+	case 95:
+		return 95
+	case 96:
+		return 96
+	case 97:
+		return 97
+	case 98:
+		return 98
+	case 99:
+		return 99
+	case 100:
+		return 100
+	case 101:
+		return 101
+	case 102:
+		return 102
+	case 103:
+		return 103
+	case 104:
+		return 104
+	case 105:
+		return 105
+	case 106:
+		return 106
+	case 107:
+		return 107
+	case 108:
+		return 108
+	case 109:
+		return 109
+	case 110:
+		return 110
+	case 111:
+		return 111
+	case 112:
+		return 112
+	case 113:
+		return 113
+	case 114:
+		return 114
+	case 115:
+		return 115
+	case 116:
+		return 116
+	case 117:
+		return 117
+	case 118:
+		return 118
+	case 119:
+		return 119
+	case 120:
+		return 120
+	case 121:
+		return 121
+	case 122:
+		return 122
+	case 123:
+		return 123
+	case 124:
+		return 124
+	case 125:
+		return 125
+	case 126:
+		return 126
+	case 127:
+		return 127
+	case 128:
+		return 128
+	case 129:
+		return 129
+	case 130:
+		return 130
+	case 131:
+		return 131
+	case 132:
+		return 132
+	case 133:
+		return 133
+	case 134:
+		return 134
+	case 135:
+		return 135
+	case 136:
+		return 136
+	case 137:
+		return 137
+	case 138:
+		return 138
+	case 139:
+		return 139
+	case 140:
+		return 140
+	case 141:
+		return 141
+	case 142:
+		return 142
+	case 143:
+		return 143
+	case 144:
+		return 144
+	case 145:
+		return 145
+	case 146:
+		return 146
+	case 147:
+		return 147
+	case 148:
+		return 148
+	case 149:
+		return 149
+	case 150:
+		return 150
+	case 151:
+		return 151
+	case 152:
+		return 152
+	case 153:
+		return 153
+	case 154:
+		return 154
+	case 155:
+		return 155
+	case 156:
+		return 156
+	case 157:
+		return 157
+	case 158:
+		return 158
+	case 159:
+		return 159
+	case 160:
+		return 160
+	case 161:
+		return 161
+	case 162:
+		return 162
+	case 163:
+		return 163
+	case 164:
+		return 164
+	case 165:
+		return 165
+	case 166:
+		return 166
+	case 167:
+		return 167
+	case 168:
+		return 168
+	case 169:
+		return 169
+	case 170:
+		return 170
+	case 171:
+		return 171
+	case 172:
+		return 172
+	case 173:
+		return 173
+	case 174:
+		return 174
+	case 175:
+		return 175
+	case 176:
+		return 176
+	case 177:
+		return 177
+	case 178:
+		return 178
+	case 179:
+		return 179
+	case 180:
+		return 180
+	case 181:
+		return 181
+	case 182:
+		return 182
+	case 183:
+		return 183
+	case 184:
+		return 184
+	case 185:
+		return 185
+	case 186:
+		return 186
+	case 187:
+		return 187
+	case 188:
+		return 188
+	case 189:
+		return 189
+	case 190:
+		return 190
+	case 191:
+		return 191
+	case 192:
+		return 192
+	case 193:
+		return 193
+	case 194:
+		return 194
+	case 195:
+		return 195
+	case 196:
+		return 196
+	case 197:
+		return 197
+	case 198:
+		return 198
+	case 199:
+		return 199
+	case 200:
+		return 200
+	case 201:
+		return 201
+	case 202:
+		return 202
+	case 203:
+		return 203
+	case 204:
+		return 204
+	case 205:
+		return 205
+	case 206:
+		return 206
+	case 207:
+		return 207
+	case 208:
+		return 208
+	case 209:
+		return 209
+	case 210:
+		return 210
+	case 211:
+		return 211
+	case 212:
+		return 212
+	case 213:
+		return 213
+	case 214:
+		return 214
+	case 215:
+		return 215
+	case 216:
+		return 216
+	case 217:
+		return 217
+	case 218:
+		return 218
+	case 219:
+		return 219
+	case 220:
+		return 220
+	case 221:
+		return 221
+	case 222:
+		return 222
+	case 223:
+		return 223
+	case 224:
+		return 224
+	case 225:
+		return 225
+	case 226:
+		return 226
+	case 227:
+		return 227
+	case 228:
+		return 228
+	case 229:
+		return 229
+	case 230:
+		return 230
+	case 231:
+		return 231
+	case 232:
+		return 232
+	case 233:
+		return 233
+	case 234:
+		return 234
+	case 235:
+		return 235
+	case 236:
+		return 236
+	case 237:
+		return 237
+	case 238:
+		return 238
+	case 239:
+		return 239
+	case 240:
+		return 240
+	case 241:
+		return 241
+	case 242:
+		return 242
+	case 243:
+		return 243
+	case 244:
+		return 244
+	case 245:
+		return 245
+	case 246:
+		return 246
+	case 247:
+		return 247
+	case 248:
+		return 248
+	case 249:
+		return 249
+	case 250:
+		return 250
+	case 251:
+		return 251
+	case 252:
+		return 252
+	case 253:
+		return 253
+	case 254:
+		return 254
+	case 255:
+		return 255
+	case 256:
+		return 256
+	case 257:
+		return 257
+	case 258:
+		return 258
+	case 259:
+		return 259
+	case 260:
+		return 260
+	case 261:
+		return 261
+	case 262:
+		return 262
+	case 263:
+		return 263
+	case 264:
+		return 264
+	case 265:
+		return 265
+	case 266:
+		return 266
+	case 267:
+		return 267
+	case 268:
+		return 268
+	case 269:
+		return 269
+	case 270:
+		return 270
+	case 271:
+		return 271
+	case 272:
+		return 272
+	case 273:
+		return 273
+	case 274:
+		return 274
+	case 275:
+		return 275
+	case 276:
+		return 276
+	case 277:
+		return 277
+	case 278:
+		return 278
+	case 279:
+		return 279
+	case 280:
+		return 280
+	case 281:
+		return 281
+	case 282:
+		return 282
+	case 283:
+		return 283
+	case 284:
+		return 284
+	case 285:
+		return 285
+	case 286:
+		return 286
+	case 287:
+		return 287
+	case 288:
+		return 288
+	case 289:
+		return 289
+	case 290:
+		return 290
+	case 291:
+		return 291
+	case 292:
+		return 292
+	case 293:
+		return 293
+	case 294:
+		return 294
+	case 295:
+		return 295
+	case 296:
+		return 296
+	case 297:
+		return 297
+	case 298:
+		return 298
+	case 299:
+		return 299
+	case 300:
+		return 300
+	case 301:
+		return 301
+	case 302:
+		return 302
+	case 303:
+		return 303
+	case 304:
+		return 304
+	case 305:
+		return 305
+	case 306:
+		return 306
+	case 307:
+		return 307
+	case 308:
+		return 308
+	case 309:
+		return 309
+	case 310:
+		return 310
+	case 311:
+		return 311
+	case 312:
+		return 312
+	case 313:
+		return 313
+	case 314:
+		return 314
+	case 315:
+		return 315
+	case 316:
+		return 316
+	case 317:
+		return 317
+	case 318:
+		return 318
+	case 319:
+		return 319
+	case 320:
+		return 320
+	case 321:
+		return 321
+	case 322:
+		return 322
+	case 323:
+		return 323
+	case 324:
+		return 324
+	case 325:
+		return 325
+	case 326:
+		return 326
+	case 327:
+		return 327
+	case 328:
+		return 328
+	case 329:
+		return 329
+	case 330:
+		return 330
+	case 331:
+		return 331
+	case 332:
+		return 332
+	case 333:
+		return 333
+	case 334:
+		return 334
+	case 335:
+		return 335
+	case 336:
+		return 336
+	case 337:
+		return 337
+	case 338:
+		return 338
+	case 339:
+		return 339
+	case 340:
+		return 340
+	case 341:
+		return 341
+	case 342:
+		return 342
+	case 343:
+		return 343
+	case 344:
+		return 344
+	case 345:
+		return 345
+	case 346:
+		return 346
+	case 347:
+		return 347
+	case 348:
+		return 348
+	case 349:
+		return 349
+	case 350:
+		return 350
+	case 351:
+		return 351
+	case 352:
+		return 352
+	case 353:
+		return 353
+	case 354:
+		return 354
+	case 355:
+		return 355
+	case 356:
+		return 356
+	case 357:
+		return 357
+	case 358:
+		return 358
+	case 359:
+		return 359
+	case 360:
+		return 360
+	case 361:
+		return 361
+	case 362:
+		return 362
+	case 363:
+		return 363
+	case 364:
+		return 364
+	case 365:
+		return 365
+	case 366:
+		return 366
+	case 367:
+		return 367
+	case 368:
+		return 368
+	case 369:
+		return 369
+	case 370:
+		return 370
+	case 371:
+		return 371
+	case 372:
+		return 372
+	case 373:
+		return 373
+	case 374:
+		return 374
+	case 375:
+		return 375
+	case 376:
+		return 376
+	case 377:
+		return 377
+	case 378:
+		return 378
+	case 379:
+		return 379
+	case 380:
+		return 380
+	case 381:
+		return 381
+	case 382:
+		return 382
+	case 383:
+		return 383
+	case 384:
+		return 384
+	case 385:
+		return 385
+	case 386:
+		return 386
+	case 387:
+		return 387
+	case 388:
+		return 388
+	case 389:
+		return 389
+	case 390:
+		return 390
+	case 391:
+		return 391
+	case 392:
+		return 392
+	case 393:
+		return 393
+	case 394:
+		return 394
+	case 395:
+		return 395
+	case 396:
+		return 396
+	case 397:
+		return 397
+	case 398:
+		return 398
+	case 399:
+		return 399
+	case 400:
+		return 400
+	case 401:
+		return 401
+	case 402:
+		return 402
+	case 403:
+		return 403
+	case 404:
+		return 404
+	case 405:
+		return 405
+	case 406:
+		return 406
+	case 407:
+		return 407
+	case 408:
+		return 408
+	case 409:
+		return 409
+	case 410:
+		return 410
+	case 411:
+		return 411
+	case 412:
+		return 412
+	case 413:
+		return 413
+	case 414:
+		return 414
+	case 415:
+		return 415
+	case 416:
+		return 416
+	case 417:
+		return 417
+	case 418:
+		return 418
+	case 419:
+		return 419
+	case 420:
+		return 420
+	case 421:
+		return 421
+	case 422:
+		return 422
+	case 423:
+		return 423
+	case 424:
+		return 424
+	case 425:
+		return 425
+	case 426:
+		return 426
+	case 427:
+		return 427
+	case 428:
+		return 428
+	case 429:
+		return 429
+	case 430:
+		return 430
+	case 431:
+		return 431
+	case 432:
+		return 432
+	case 433:
+		return 433
+	case 434:
+		return 434
+	case 435:
+		return 435
+	case 436:
+		return 436
+	case 437:
+		return 437
+	case 438:
+		return 438
+	case 439:
+		return 439
+	case 440:
+		return 440
+	case 441:
+		return 441
+	case 442:
+		return 442
+	case 443:
+		return 443
+	case 444:
+		return 444
+	case 445:
+		return 445
+	case 446:
+		return 446
+	case 447:
+		return 447
+	case 448:
+		return 448
+	case 449:
+		return 449
+	case 450:
+		return 450
+	case 451:
+		return 451
+	case 452:
+		return 452
+	case 453:
+		return 453
+	case 454:
+		return 454
+	case 455:
+		return 455
+	case 456:
+		return 456
+	case 457:
+		return 457
+	case 458:
+		return 458
+	case 459:
+		return 459
+	case 460:
+		return 460
+	case 461:
+		return 461
+	case 462:
+		return 462
+	case 463:
+		return 463
+	case 464:
+		return 464
+	case 465:
+		return 465
+	case 466:
+		return 466
+	case 467:
+		return 467
+	case 468:
+		return 468
+	case 469:
+		return 469
+	case 470:
+		return 470
+	case 471:
+		return 471
+	case 472:
+		return 472
+	case 473:
+		return 473
+	case 474:
+		return 474
+	case 475:
+		return 475
+	case 476:
+		return 476
+	case 477:
+		return 477
+	case 478:
+		return 478
+	case 479:
+		return 479
+	case 480:
+		return 480
+	case 481:
+		return 481
+	case 482:
+		return 482
+	case 483:
+		return 483
+	case 484:
+		return 484
+	case 485:
+		return 485
+	case 486:
+		return 486
+	case 487:
+		return 487
+	case 488:
+		return 488
+	case 489:
+		return 489
+	case 490:
+		return 490
+	case 491:
+		return 491
+	case 492:
+		return 492
+	case 493:
+		return 493
+	case 494:
+		return 494
+	case 495:
+		return 495
+	case 496:
+		return 496
+	case 497:
+		return 497
+	case 498:
+		return 498
+	case 499:
+		return 499
+	case 500:
+		return 500
+	case 501:
+		return 501
+	case 502:
+		return 502
+	case 503:
+		return 503
+	case 504:
+		return 504
+	case 505:
+		return 505
+	case 506:
+		return 506
+	case 507:
+		return 507
+	case 508:
+		return 508
+	case 509:
+		return 509
+	case 510:
+		return 510
+	case 511:
+		return 511
+	case 512:
+		return 512
+	case 513:
+		return 513
+	case 514:
+		return 514
+	case 515:
+		return 515
+	case 516:
+		return 516
+	case 517:
+		return 517
+	case 518:
+		return 518
+	case 519:
+		return 519
+	case 520:
+		return 520
+	case 521:
+		return 521
+	case 522:
+		return 522
+	case 523:
+		return 523
+	case 524:
+		return 524
+	case 525:
+		return 525
+	case 526:
+		return 526
+	case 527:
+		return 527
+	case 528:
+		return 528
+	case 529:
+		return 529
+	case 530:
+		return 530
+	case 531:
+		return 531
+	case 532:
+		return 532
+	case 533:
+		return 533
+	case 534:
+		return 534
+	case 535:
+		return 535
+	case 536:
+		return 536
+	case 537:
+		return 537
+	case 538:
+		return 538
+	case 539:
+		return 539
+	case 540:
+		return 540
+	case 541:
+		return 541
+	case 542:
+		return 542
+	case 543:
+		return 543
+	case 544:
+		return 544
+	case 545:
+		return 545
+	case 546:
+		return 546
+	case 547:
+		return 547
+	case 548:
+		return 548
+	case 549:
+		return 549
+	case 550:
+		return 550
+	case 551:
+		return 551
+	case 552:
+		return 552
+	case 553:
+		return 553
+	case 554:
+		return 554
+	case 555:
+		return 555
+	case 556:
+		return 556
+	case 557:
+		return 557
+	case 558:
+		return 558
+	case 559:
+		return 559
+	case 560:
+		return 560
+	case 561:
+		return 561
+	case 562:
+		return 562
+	case 563:
+		return 563
+	case 564:
+		return 564
+	case 565:
+		return 565
+	case 566:
+		return 566
+	case 567:
+		return 567
+	case 568:
+		return 568
+	case 569:
+		return 569
+	case 570:
+		return 570
+	case 571:
+		return 571
+	case 572:
+		return 572
+	case 573:
+		return 573
+	case 574:
+		return 574
+	case 575:
+		return 575
+	case 576:
+		return 576
+	case 577:
+		return 577
+	case 578:
+		return 578
+	case 579:
+		return 579
+	case 580:
+		return 580
+	case 581:
+		return 581
+	case 582:
+		return 582
+	case 583:
+		return 583
+	case 584:
+		return 584
+	case 585:
+		return 585
+	case 586:
+		return 586
+	case 587:
+		return 587
+	case 588:
+		return 588
+	case 589:
+		return 589
+	case 590:
+		return 590
+	case 591:
+		return 591
+	case 592:
+		return 592
+	case 593:
+		return 593
+	case 594:
+		return 594
+	case 595:
+		return 595
+	case 596:
+		return 596
+	case 597:
+		return 597
+	case 598:
+		return 598
+	case 599:
+		return 599
+	case 600:
+		return 600
+	case 601:
+		return 601
+	case 602:
+		return 602
+	case 603:
+		return 603
+	case 604:
+		return 604
+	case 605:
+		return 605
+	case 606:
+		return 606
+	case 607:
+		return 607
+	case 608:
+		return 608
+	case 609:
+		return 609
+	case 610:
+		return 610
+	case 611:
+		return 611
+	case 612:
+		return 612
+	case 613:
+		return 613
+	case 614:
+		return 614
+	case 615:
+		return 615
+	case 616:
+		return 616
+	case 617:
+		return 617
+	case 618:
+		return 618
+	case 619:
+		return 619
+	case 620:
+		return 620
+	case 621:
+		return 621
+	case 622:
+		return 622
+	case 623:
+		return 623
+	case 624:
+		return 624
+	case 625:
+		return 625
+	case 626:
+		return 626
+	case 627:
+		return 627
+	case 628:
+		return 628
+	case 629:
+		return 629
+	case 630:
+		return 630
+	case 631:
+		return 631
+	case 632:
+		return 632
+	case 633:
+		return 633
+	case 634:
+		return 634
+	case 635:
+		return 635
+	case 636:
+		return 636
+	case 637:
+		return 637
+	case 638:
+		return 638
+	case 639:
+		return 639
+	case 640:
+		return 640
+	case 641:
+		return 641
+	case 642:
+		return 642
+	case 643:
+		return 643
+	case 644:
+		return 644
+	case 645:
+		return 645
+	case 646:
+		return 646
+	case 647:
+		return 647
+	case 648:
+		return 648
+	case 649:
+		return 649
+	case 650:
+		return 650
+	case 651:
+		return 651
+	case 652:
+		return 652
+	case 653:
+		return 653
+	case 654:
+		return 654
+	case 655:
+		return 655
+	case 656:
+		return 656
+	case 657:
+		return 657
+	case 658:
+		return 658
+	case 659:
+		return 659
+	case 660:
+		return 660
+	case 661:
+		return 661
+	case 662:
+		return 662
+	case 663:
+		return 663
+	case 664:
+		return 664
+	case 665:
+		return 665
+	case 666:
+		return 666
+	case 667:
+		return 667
+	case 668:
+		return 668
+	case 669:
+		return 669
+	case 670:
+		return 670
+	case 671:
+		return 671
+	case 672:
+		return 672
+	case 673:
+		return 673
+	case 674:
+		return 674
+	case 675:
+		return 675
+	case 676:
+		return 676
+	case 677:
+		return 677
+	case 678:
+		return 678
+	case 679:
+		return 679
+	case 680:
+		return 680
+	case 681:
+		return 681
+	case 682:
+		return 682
+	case 683:
+		return 683
+	case 684:
+		return 684
+	case 685:
+		return 685
+	case 686:
+		return 686
+	case 687:
+		return 687
+	case 688:
+		return 688
+	case 689:
+		return 689
+	case 690:
+		return 690
+	case 691:
+		return 691
+	case 692:
+		return 692
+	case 693:
+		return 693
+	case 694:
+		return 694
+	case 695:
+		return 695
+	case 696:
+		return 696
+	case 697:
+		return 697
+	case 698:
+		return 698
+	case 699:
+		return 699
+	case 700:
+		return 700
+	case 701:
+		return 701
+	case 702:
+		return 702
+	case 703:
+		return 703
+	case 704:
+		return 704
+	case 705:
+		return 705
+	case 706:
+		return 706
+	case 707:
+		return 707
+	case 708:
+		return 708
+	case 709:
+		return 709
+	case 710:
+		return 710
+	case 711:
+		return 711
+	case 712:
+		return 712
+	case 713:
+		return 713
+	case 714:
+		return 714
+	case 715:
+		return 715
+	case 716:
+		return 716
+	case 717:
+		return 717
+	case 718:
+		return 718
+	case 719:
+		return 719
+	case 720:
+		return 720
+	case 721:
+		return 721
+	case 722:
+		return 722
+	case 723:
+		return 723
+	case 724:
+		return 724
+	case 725:
+		return 725
+	case 726:
+		return 726
+	case 727:
+		return 727
+	case 728:
+		return 728
+	case 729:
+		return 729
+	case 730:
+		return 730
+	case 731:
+		return 731
+	case 732:
+		return 732
+	case 733:
+		return 733
+	case 734:
+		return 734
+	case 735:
+		return 735
+	case 736:
+		return 736
+	case 737:
+		return 737
+	case 738:
+		return 738
+	case 739:
+		return 739
+	case 740:
+		return 740
+	case 741:
+		return 741
+	case 742:
+		return 742
+	case 743:
+		return 743
+	case 744:
+		return 744
+	case 745:
+		return 745
+	case 746:
+		return 746
+	case 747:
+		return 747
+	case 748:
+		return 748
+	case 749:
+		return 749
+	case 750:
+		return 750
+	case 751:
+		return 751
+	case 752:
+		return 752
+	case 753:
+		return 753
+	case 754:
+		return 754
+	case 755:
+		return 755
+	case 756:
+		return 756
+	case 757:
+		return 757
+	case 758:
+		return 758
+	case 759:
+		return 759
+	case 760:
+		return 760
+	case 761:
+		return 761
+	case 762:
+		return 762
+	case 763:
+		return 763
+	case 764:
+		return 764
+	case 765:
+		return 765
+	case 766:
+		return 766
+	case 767:
+		return 767
+	case 768:
+		return 768
+	case 769:
+		return 769
+	case 770:
+		return 770
+	case 771:
+		return 771
+	case 772:
+		return 772
+	case 773:
+		return 773
+	case 774:
+		return 774
+	case 775:
+		return 775
+	case 776:
+		return 776
+	case 777:
+		return 777
+	case 778:
+		return 778
+	case 779:
+		return 779
+	case 780:
+		return 780
+	case 781:
+		return 781
+	case 782:
+		return 782
+	case 783:
+		return 783
+	case 784:
+		return 784
+	case 785:
+		return 785
+	case 786:
+		return 786
+	case 787:
+		return 787
+	case 788:
+		return 788
+	case 789:
+		return 789
+	case 790:
+		return 790
+	case 791:
+		return 791
+	case 792:
+		return 792
+	case 793:
+		return 793
+	case 794:
+		return 794
+	case 795:
+		return 795
+	case 796:
+		return 796
+	case 797:
+		return 797
+	case 798:
+		return 798
+	case 799:
+		return 799
+	case 800:
+		return 800
+	case 801:
+		return 801
+	case 802:
+		return 802
+	case 803:
+		return 803
+	case 804:
+		return 804
+	case 805:
+		return 805
+	case 806:
+		return 806
+	case 807:
+		return 807
+	case 808:
+		return 808
+	case 809:
+		return 809
+	case 810:
+		return 810
+	case 811:
+		return 811
+	case 812:
+		return 812
+	case 813:
+		return 813
+	case 814:
+		return 814
+	case 815:
+		return 815
+	case 816:
+		return 816
+	case 817:
+		return 817
+	case 818:
+		return 818
+	case 819:
+		return 819
+	case 820:
+		return 820
+	case 821:
+		return 821
+	case 822:
+		return 822
+	case 823:
+		return 823
+	case 824:
+		return 824
+	case 825:
+		return 825
+	case 826:
+		return 826
+	case 827:
+		return 827
+	case 828:
+		return 828
+	case 829:
+		return 829
+	case 830:
+		return 830
+	case 831:
+		return 831
+	case 832:
+		return 832
+	case 833:
+		return 833
+	case 834:
+		return 834
+	case 835:
+		return 835
+	case 836:
+		return 836
+	case 837:
+		return 837
+	case 838:
+		return 838
+	case 839:
+		return 839
+	case 840:
+		return 840
+	case 841:
+		return 841
+	case 842:
+		return 842
+	case 843:
+		return 843
+	case 844:
+		return 844
+	case 845:
+		return 845
+	case 846:
+		return 846
+	case 847:
+		return 847
+	case 848:
+		return 848
+	case 849:
+		return 849
+	case 850:
+		return 850
+	case 851:
+		return 851
+	case 852:
+		return 852
+	case 853:
+		return 853
+	case 854:
+		return 854
+	case 855:
+		return 855
+	case 856:
+		return 856
+	case 857:
+		return 857
+	case 858:
+		return 858
+	case 859:
+		return 859
+	case 860:
+		return 860
+	case 861:
+		return 861
+	case 862:
+		return 862
+	case 863:
+		return 863
+	case 864:
+		return 864
+	case 865:
+		return 865
+	case 866:
+		return 866
+	case 867:
+		return 867
+	case 868:
+		return 868
+	case 869:
+		return 869
+	case 870:
+		return 870
+	case 871:
+		return 871
+	case 872:
+		return 872
+	case 873:
+		return 873
+	case 874:
+		return 874
+	case 875:
+		return 875
+	case 876:
+		return 876
+	case 877:
+		return 877
+	case 878:
+		return 878
+	case 879:
+		return 879
+	case 880:
+		return 880
+	case 881:
+		return 881
+	case 882:
+		return 882
+	case 883:
+		return 883
+	case 884:
+		return 884
+	case 885:
+		return 885
+	case 886:
+		return 886
+	case 887:
+		return 887
+	case 888:
+		return 888
+	case 889:
+		return 889
+	case 890:
+		return 890
+	case 891:
+		return 891
+	case 892:
+		return 892
+	case 893:
+		return 893
+	case 894:
+		return 894
+	case 895:
+		return 895
+	case 896:
+		return 896
+	case 897:
+		return 897
+	case 898:
+		return 898
+	case 899:
+		return 899
+	case 900:
+		return 900
+	case 901:
+		return 901
+	case 902:
+		return 902
+	case 903:
+		return 903
+	case 904:
+		return 904
+	case 905:
+		return 905
+	case 906:
+		return 906
+	case 907:
+		return 907
+	case 908:
+		return 908
+	case 909:
+		return 909
+	case 910:
+		return 910
+	case 911:
+		return 911
+	case 912:
+		return 912
+	case 913:
+		return 913
+	case 914:
+		return 914
+	case 915:
+		return 915
+	case 916:
+		return 916
+	case 917:
+		return 917
+	case 918:
+		return 918
+	case 919:
+		return 919
+	case 920:
+		return 920
+	case 921:
+		return 921
+	case 922:
+		return 922
+	case 923:
+		return 923
+	case 924:
+		return 924
+	case 925:
+		return 925
+	case 926:
+		return 926
+	case 927:
+		return 927
+	case 928:
+		return 928
+	case 929:
+		return 929
+	case 930:
+		return 930
+	case 931:
+		return 931
+	case 932:
+		return 932
+	case 933:
+		return 933
+	case 934:
+		return 934
+	case 935:
+		return 935
+	case 936:
+		return 936
+	case 937:
+		return 937
+	case 938:
+		return 938
+	case 939:
+		return 939
+	case 940:
+		return 940
+	case 941:
+		return 941
+	case 942:
+		return 942
+	case 943:
+		return 943
+	case 944:
+		return 944
+	case 945:
+		return 945
+	case 946:
+		return 946
+	case 947:
+		return 947
+	case 948:
+		return 948
+	case 949:
+		return 949
+	case 950:
+		return 950
+	case 951:
+		return 951
+	case 952:
+		return 952
+	case 953:
+		return 953
+	case 954:
+		return 954
+	case 955:
+		return 955
+	case 956:
+		return 956
+	case 957:
+		return 957
+	case 958:
+		return 958
+	case 959:
+		return 959
+	case 960:
+		return 960
+	case 961:
+		return 961
+	case 962:
+		return 962
+	case 963:
+		return 963
+	case 964:
+		return 964
+	case 965:
+		return 965
+	case 966:
+		return 966
+	case 967:
+		return 967
+	case 968:
+		return 968
+	case 969:
+		return 969
+	case 970:
+		return 970
+	case 971:
+		return 971
+	case 972:
+		return 972
+	case 973:
+		return 973
+	case 974:
+		return 974
+	case 975:
+		return 975
+	case 976:
+		return 976
+	case 977:
+		return 977
+	case 978:
+		return 978
+	case 979:
+		return 979
+	case 980:
+		return 980
+	case 981:
+		return 981
+	case 982:
+		return 982
+	case 983:
+		return 983
+	case 984:
+		return 984
+	case 985:
+		return 985
+	case 986:
+		return 986
+	case 987:
+		return 987
+	case 988:
+		return 988
+	case 989:
+		return 989
+	case 990:
+		return 990
+	case 991:
+		return 991
+	case 992:
+		return 992
+	case 993:
+		return 993
+	case 994:
+		return 994
+	case 995:
+		return 995
+	case 996:
+		return 996
+	case 997:
+		return 997
+	case 998:
+		return 998
+	case 999:
+		return 999
+	}
+	return 0
+}
diff --git a/test/fixedbugs/issue60990.go b/test/fixedbugs/issue60990.go
new file mode 100644
index 0000000..ce94fa7
--- /dev/null
+++ b/test/fixedbugs/issue60990.go
@@ -0,0 +1,31 @@
+// compile
+
+// Copyright 2023 The Go Authors. 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 T struct{ _, _ []int }
+
+func F[_ int]() {
+	var f0, f1 float64
+	var b bool
+	_ = func(T, float64) bool {
+		b = deepEqual(0, 1)
+		return func() bool {
+			f1 = min(f0, 0)
+			return b
+		}()
+	}(T{nil, nil}, min(0, f1))
+	f0 = min(0, 1)
+}
+
+//go:noinline
+func deepEqual(x, y any) bool {
+	return x == y
+}
+
+func init() {
+	F[int]()
+}
diff --git a/test/fixedbugs/issue60991.go b/test/fixedbugs/issue60991.go
new file mode 100644
index 0000000..e1d51e4
--- /dev/null
+++ b/test/fixedbugs/issue60991.go
@@ -0,0 +1,13 @@
+// build
+
+// Copyright 2023 The Go Authors. 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 "math"
+
+func f() {
+	_ = min(0.1, 0.2, math.Sqrt(1))
+}
diff --git a/test/fixedbugs/issue61127.go b/test/fixedbugs/issue61127.go
new file mode 100644
index 0000000..c8ee5c5
--- /dev/null
+++ b/test/fixedbugs/issue61127.go
@@ -0,0 +1,13 @@
+// compile
+
+// Copyright 2023 The Go Authors. 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 V = []struct{}{}
+
+func main() {
+	clear(V)
+}
diff --git a/test/fixedbugs/issue61187.go b/test/fixedbugs/issue61187.go
new file mode 100644
index 0000000..5e17628
--- /dev/null
+++ b/test/fixedbugs/issue61187.go
@@ -0,0 +1,22 @@
+// compile
+
+// Copyright 2023 The Go Authors. 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"
+	"reflect"
+	"unsafe"
+)
+
+var slice = []byte{'H', 'e', 'l', 'l', 'o', ','}
+
+func main() {
+	ptr := uintptr(unsafe.Pointer(&slice)) + 100
+	header := (*reflect.SliceHeader)(unsafe.Pointer(ptr))
+	header.Data += 1
+	fmt.Printf("%d %d\n", cap(slice), header.Cap)
+}
diff --git a/test/fixedbugs/issue61778.go b/test/fixedbugs/issue61778.go
new file mode 100644
index 0000000..5055c9e
--- /dev/null
+++ b/test/fixedbugs/issue61778.go
@@ -0,0 +1,13 @@
+// compile
+
+// Copyright 2023 The Go Authors. 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
+
+func f(s []byte) {
+	switch "" {
+	case string(append(s, 'a')):
+	}
+}
diff --git a/test/fixedbugs/issue61908.go b/test/fixedbugs/issue61908.go
new file mode 100644
index 0000000..f5d3bce
--- /dev/null
+++ b/test/fixedbugs/issue61908.go
@@ -0,0 +1,16 @@
+// compile
+
+// Copyright 2023 The Go Authors. 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
+
+func f(p []byte) int {
+	switch "" < string(p) {
+	case true:
+		return 0
+	default:
+		return 1
+	}
+}
diff --git a/test/fixedbugs/issue61992.go b/test/fixedbugs/issue61992.go
new file mode 100644
index 0000000..d60605b
--- /dev/null
+++ b/test/fixedbugs/issue61992.go
@@ -0,0 +1,26 @@
+// compile
+
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Issue 61992, inconsistent 'mem' juggling in expandCalls
+
+package p
+
+type S1 struct {
+	a, b, c []int
+	i       int
+}
+
+type S2 struct {
+	a, b []int
+	m    map[int]int
+}
+
+func F(i int, f func(S1, S2, int) int) int {
+	return f(
+		S1{},
+		S2{m: map[int]int{}},
+		1<<i)
+}
diff --git a/test/fixedbugs/issue62203.go b/test/fixedbugs/issue62203.go
new file mode 100644
index 0000000..8c93d78
--- /dev/null
+++ b/test/fixedbugs/issue62203.go
@@ -0,0 +1,32 @@
+// run
+
+// Copyright 2023 The Go Authors. 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"
+	"maps"
+)
+
+func main() {
+	m := map[string]struct{}{}
+
+	// Fill m up to the max for 4 buckets = 48 entries.
+	for i := 0; i < 48; i++ {
+		m[fmt.Sprintf("%d", i)] = struct{}{}
+	}
+
+	// Add a 49th entry, to start a grow to 8 buckets.
+	m["foo"] = struct{}{}
+
+	// Remove that 49th entry. m is still growing to 8 buckets,
+	// but a clone of m will only have 4 buckets because it
+	// only needs to fit 48 entries.
+	delete(m, "foo")
+
+	// Clone an 8-bucket map to a 4-bucket map.
+	_ = maps.Clone(m)
+}
diff --git a/test/fixedbugs/issue62469.go b/test/fixedbugs/issue62469.go
new file mode 100644
index 0000000..d850ccb
--- /dev/null
+++ b/test/fixedbugs/issue62469.go
@@ -0,0 +1,15 @@
+// compile
+
+// Copyright 2023 The Go Authors. 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
+
+func sign(p1, p2, p3 point) bool {
+	return (p1.x-p3.x)*(p2.y-p3.y)-(p2.x-p3.x)*(p1.y-p3.y) < 0
+}
+
+type point struct {
+	x, y int
+}
diff --git a/test/fixedbugs/issue62498.dir/a.go b/test/fixedbugs/issue62498.dir/a.go
new file mode 100644
index 0000000..68f9747
--- /dev/null
+++ b/test/fixedbugs/issue62498.dir/a.go
@@ -0,0 +1,13 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package a
+
+func One(L any) {
+	func() {
+		defer F(L)
+	}()
+}
+
+func F(any) {}
diff --git a/test/fixedbugs/issue62498.dir/main.go b/test/fixedbugs/issue62498.dir/main.go
new file mode 100644
index 0000000..e55a24f
--- /dev/null
+++ b/test/fixedbugs/issue62498.dir/main.go
@@ -0,0 +1,18 @@
+// Copyright 2023 The Go Authors. 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 "./a"
+
+func main() {
+	a.One(nil)
+	Two(nil)
+}
+
+func Two(L any) {
+	func() {
+		defer a.F(L)
+	}()
+}
diff --git a/test/fixedbugs/issue62498.go b/test/fixedbugs/issue62498.go
new file mode 100644
index 0000000..8fe8d87
--- /dev/null
+++ b/test/fixedbugs/issue62498.go
@@ -0,0 +1,7 @@
+// rundir
+
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package ignored
diff --git a/test/fixedbugs/issue8606.go b/test/fixedbugs/issue8606.go
index 8c85069..6bac02a 100644
--- a/test/fixedbugs/issue8606.go
+++ b/test/fixedbugs/issue8606.go
@@ -30,7 +30,17 @@
 		s string
 		j interface{}
 	}
+	type S3 struct {
+		f any
+		i int
+	}
+	type S4 struct {
+		a [1000]byte
+		b any
+	}
 	b := []byte{1}
+	s1 := S3{func() {}, 0}
+	s2 := S3{func() {}, 1}
 
 	for _, test := range []struct {
 		panic bool
@@ -64,6 +74,9 @@
 		{false, T3{s: "foo", j: b}, T3{s: "bar", j: b}},
 		{true, T3{i: b, s: "fooz"}, T3{i: b, s: "bar"}},
 		{false, T3{s: "fooz", j: b}, T3{s: "bar", j: b}},
+		{true, A{s1, s2}, A{s2, s1}},
+		{true, s1, s2},
+		{false, S4{[1000]byte{0}, func() {}}, S4{[1000]byte{1}, func() {}}},
 	} {
 		f := func() {
 			defer func() {
diff --git a/test/fixedbugs/issue9083.go b/test/fixedbugs/issue9083.go
index ea53e7a..26d4d0f 100644
--- a/test/fixedbugs/issue9083.go
+++ b/test/fixedbugs/issue9083.go
@@ -13,6 +13,7 @@
 
 func main() {
 	var x int
+	_ = x
 	x = make(map[int]int)       // ERROR "cannot use make\(map\[int\]int\)|incompatible"
 	x = make(map[int]int, 0)    // ERROR "cannot use make\(map\[int\]int, 0\)|incompatible"
 	x = make(map[int]int, zero) // ERROR "cannot use make\(map\[int\]int, zero\)|incompatible"
diff --git a/test/fixedbugs/issue9355.go b/test/fixedbugs/issue9355.go
index 1c3999c..2670f15 100644
--- a/test/fixedbugs/issue9355.go
+++ b/test/fixedbugs/issue9355.go
@@ -1,4 +1,4 @@
-// +build !js,gc
+// +build !js,!wasip1,gc
 // run
 
 // Copyright 2014 The Go Authors. All rights reserved.
diff --git a/test/fixedbugs/issue9862_run.go b/test/fixedbugs/issue9862_run.go
index c956c7f..edf8dfa 100644
--- a/test/fixedbugs/issue9862_run.go
+++ b/test/fixedbugs/issue9862_run.go
@@ -1,4 +1,4 @@
-// +build !nacl,!js,gc
+// +build !nacl,!js,!wasip1,gc
 // run
 
 // Copyright 2015 The Go Authors. All rights reserved.
diff --git a/test/for.go b/test/for.go
index 8a50090..cfb7f6d 100644
--- a/test/for.go
+++ b/test/for.go
@@ -44,15 +44,33 @@
 	for sum < 100 {
 		sum = sum + 9
 	}
-	assertequal(sum, 99 + 9, "only one")
+	assertequal(sum, 99+9, "only one")
 
 	sum = 0
 	for i := 0; i <= 10; i++ {
-		if i % 2 == 0 {
+		if i%2 == 0 {
 			continue
 		}
 		sum = sum + i
 	}
 	assertequal(sum, 1+3+5+7+9, "continue")
 
+	i = 0
+	for i = range [5]struct{}{} {
+	}
+	assertequal(i, 4, " incorrect index value after range loop")
+
+	i = 0
+	var a1 [5]struct{}
+	for i = range a1 {
+		a1[i] = struct{}{}
+	}
+	assertequal(i, 4, " incorrect index value after array with zero size elem range clear")
+
+	i = 0
+	var a2 [5]int
+	for i = range a2 {
+		a2[i] = 0
+	}
+	assertequal(i, 4, " incorrect index value after array range clear")
 }
diff --git a/test/inline.go b/test/inline.go
index 1aa8fcc..3a9cd5c 100644
--- a/test/inline.go
+++ b/test/inline.go
@@ -1,4 +1,4 @@
-// errorcheckwithauto -0 -m -d=inlfuncswithclosures=1 -d=inlstaticinit=1
+// errorcheckwithauto -0 -m -d=inlfuncswithclosures=1
 
 // Copyright 2015 The Go Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style
@@ -110,6 +110,18 @@
 	return foo()                       // ERROR "inlining call to q.func1"
 }
 
+func r(z int) int {
+	foo := func(x int) int { // ERROR "can inline r.func1" "func literal does not escape"
+		return x + z
+	}
+	bar := func(x int) int { // ERROR "func literal does not escape" "can inline r.func2"
+		return x + func(y int) int { // ERROR "can inline r.func2.1" "can inline r.r.func2.func3"
+			return 2*y + x*z
+		}(x) // ERROR "inlining call to r.func2.1"
+	}
+	return foo(42) + bar(42) // ERROR "inlining call to r.func1" "inlining call to r.func2" "inlining call to r.r.func2.func3"
+}
+
 func s0(x int) int { // ERROR "can inline s0"
 	foo := func() { // ERROR "can inline s0.func1" "func literal does not escape"
 		x = x + 1
@@ -195,6 +207,20 @@
 		return "oh nose!"
 	}
 }
+func switchConst4() { // ERROR "can inline switchConst4"
+	const intSize = 32 << (^uint(0) >> 63)
+	want := func() string { // ERROR "can inline switchConst4.func1"
+		switch intSize {
+		case 32:
+			return "32"
+		case 64:
+			return "64"
+		default:
+			panic("unreachable")
+		}
+	}() // ERROR "inlining call to switchConst4.func1"
+	_ = want
+}
 
 func inlineRangeIntoMe(data []int) { // ERROR "can inline inlineRangeIntoMe" "data does not escape"
 	rangeFunc(data, 12) // ERROR "inlining call to rangeFunc"
@@ -246,13 +272,13 @@
 	if x < 0 {
 		return
 	}
-	gg(x - 1)
+	gg(x - 1) // ERROR "inlining call to gg" "inlining call to hh"
 }
 func gg(x int) { // ERROR "can inline gg"
-	hh(x - 1)
+	hh(x - 1) // ERROR "inlining call to hh" "inlining call to ff"
 }
 func hh(x int) { // ERROR "can inline hh"
-	ff(x - 1) // ERROR "inlining call to ff"  // ERROR "inlining call to gg"
+	ff(x - 1) // ERROR "inlining call to ff" "inlining call to gg"
 }
 
 // Issue #14768 - make sure we can inline for loops.
diff --git a/test/inline_big.go b/test/inline_big.go
index 8367275..7dd1abd 100644
--- a/test/inline_big.go
+++ b/test/inline_big.go
@@ -20,7 +20,7 @@
 	return a[0] + a[1] + a[2] + a[3] + a[4] + a[5] + a[6] + a[7]
 }
 
-func f(a []int) int { // ERROR "cannot inline f:.*" "a does not escape"
+func f(a []int) int { // ERROR "cannot inline f:.*" "a does not escape" "function f considered 'big'"
 	// Add lots of nodes to f's body. We need >5000.
 	// See cmd/compile/internal/gc/inl.go:inlineBigFunction*
 	a[0] = 0
diff --git a/test/inline_nounified.go b/test/inline_nounified.go
deleted file mode 100644
index 7a9fc10..0000000
--- a/test/inline_nounified.go
+++ /dev/null
@@ -1,21 +0,0 @@
-// errorcheckwithauto -0 -m -d=inlfuncswithclosures=1
-//go:build !goexperiment.unified
-// +build !goexperiment.unified
-
-// Copyright 2022 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package foo
-
-func r(z int) int {
-	foo := func(x int) int { // ERROR "can inline r.func1" "func literal does not escape"
-		return x + z
-	}
-	bar := func(x int) int { // ERROR "func literal does not escape" "can inline r.func2"
-		return x + func(y int) int { // ERROR "can inline r.func2.1" "can inline r.func3"
-			return 2*y + x*z
-		}(x) // ERROR "inlining call to r.func2.1"
-	}
-	return foo(42) + bar(42) // ERROR "inlining call to r.func1" "inlining call to r.func2" "inlining call to r.func3"
-}
diff --git a/test/inline_sync.go b/test/inline_sync.go
index 5533c7b..69e2a0e 100644
--- a/test/inline_sync.go
+++ b/test/inline_sync.go
@@ -42,12 +42,12 @@
 
 var rwmutex *sync.RWMutex
 
-func small8() {
+func small8() { // ERROR "can inline small8"
 	// the RUnlock fast path should be inlined
 	rwmutex.RUnlock() // ERROR "inlining call to sync\.\(\*RWMutex\)\.RUnlock" "inlining call to atomic\.\(\*Int32\)\.Add"
 }
 
-func small9() {
+func small9() { // ERROR "can inline small9"
 	// the RLock fast path should be inlined
 	rwmutex.RLock() // ERROR "inlining call to sync\.\(\*RWMutex\)\.RLock" "inlining call to atomic\.\(\*Int32\)\.Add"
 }
diff --git a/test/inline_unified.go b/test/inline_unified.go
deleted file mode 100644
index 5dc43ab..0000000
--- a/test/inline_unified.go
+++ /dev/null
@@ -1,21 +0,0 @@
-// errorcheckwithauto -0 -m -d=inlfuncswithclosures=1
-//go:build goexperiment.unified
-// +build goexperiment.unified
-
-// Copyright 2022 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package foo
-
-func r(z int) int {
-	foo := func(x int) int { // ERROR "can inline r.func1" "func literal does not escape"
-		return x + z
-	}
-	bar := func(x int) int { // ERROR "func literal does not escape" "can inline r.func2"
-		return x + func(y int) int { // ERROR "can inline r.func2.1" "can inline r.func3"
-			return 2*y + x*z
-		}(x) // ERROR "inlining call to r.func2.1"
-	}
-	return foo(42) + bar(42) // ERROR "inlining call to r.func1" "inlining call to r.func2" "inlining call to r.func3"
-}
diff --git a/test/interface/pointer.go b/test/interface/pointer.go
index a71b3f4..c9651d2 100644
--- a/test/interface/pointer.go
+++ b/test/interface/pointer.go
@@ -31,7 +31,7 @@
 
 func main() {
 	print("call addinst\n")
-	var x Inst = AddInst(new(Start)) // ERROR "pointer to interface|incompatible type"
+	var _ Inst = AddInst(new(Start)) // ERROR "pointer to interface|incompatible type"
 	print("return from  addinst\n")
-	var y *Inst = new(Start) // ERROR "pointer to interface|incompatible type"
+	var _ *Inst = new(Start) // ERROR "pointer to interface|incompatible type"
 }
diff --git a/test/linkmain_run.go b/test/linkmain_run.go
index f4f6c43..f2ab681 100644
--- a/test/linkmain_run.go
+++ b/test/linkmain_run.go
@@ -1,4 +1,4 @@
-// +build !nacl,!js
+// +build !nacl,!js,!wasip1
 // run
 
 // Copyright 2014 The Go Authors. All rights reserved.
diff --git a/test/linkobj.go b/test/linkobj.go
index 35ff63b..fcf3f88 100644
--- a/test/linkobj.go
+++ b/test/linkobj.go
@@ -1,4 +1,4 @@
-// +build !nacl,!js,gc
+// +build !nacl,!js,gc,!wasip1
 // run
 
 // Copyright 2016 The Go Authors. All rights reserved.
diff --git a/test/linkx_run.go b/test/linkx_run.go
index ccfc3a9..b7b1ea8 100644
--- a/test/linkx_run.go
+++ b/test/linkx_run.go
@@ -1,4 +1,4 @@
-// +build !nacl,!js,gc
+// +build !nacl,!js,!wasip1,gc
 // run
 
 // Copyright 2014 The Go Authors. All rights reserved.
diff --git a/test/live.go b/test/live.go
index 6f3b86a..0e015db 100644
--- a/test/live.go
+++ b/test/live.go
@@ -698,9 +698,9 @@
 	defer func() {
 		recover()
 	}()
-	printint(0) // ERROR "live at call to printint: q r .autotmp_[0-9]+$"
+	printint(0) // ERROR "live at call to printint: .autotmp_[0-9]+ q r$"
 	r = q
-	return // ERROR "live at call to f41.func1: r .autotmp_[0-9]+$"
+	return // ERROR "live at call to f41.func1: .autotmp_[0-9]+ r$"
 }
 
 func f42() {
diff --git a/test/live_regabi.go b/test/live_regabi.go
index 027d476..bae319d 100644
--- a/test/live_regabi.go
+++ b/test/live_regabi.go
@@ -11,6 +11,8 @@
 
 package main
 
+import "runtime"
+
 func printnl()
 
 //go:noescape
@@ -693,7 +695,7 @@
 	defer func() {
 		recover()
 	}()
-	printint(0) // ERROR "live at call to printint: q .autotmp_[0-9]+ r$"
+	printint(0) // ERROR "live at call to printint: .autotmp_[0-9]+ q r$"
 	r = q
 	return // ERROR "live at call to f41.func1: .autotmp_[0-9]+ r$"
 }
@@ -718,3 +720,23 @@
 	ret.s[0] = f()
 	return ret
 }
+
+func f45(a, b, c, d, e, f, g, h, i, j, k, l *byte) { // ERROR "live at entry to f45: a b c d e f g h i j k l"
+	f46(a, b, c, d, e, f, g, h, i, j, k, l) // ERROR "live at call to f46: a b c d e f g h i j k l"
+	runtime.KeepAlive(a)
+	runtime.KeepAlive(b)
+	runtime.KeepAlive(c)
+	runtime.KeepAlive(d)
+	runtime.KeepAlive(e)
+	runtime.KeepAlive(f)
+	runtime.KeepAlive(g)
+	runtime.KeepAlive(h)
+	runtime.KeepAlive(i)
+	runtime.KeepAlive(j)
+	runtime.KeepAlive(k)
+	runtime.KeepAlive(l)
+}
+
+//go:noinline
+func f46(a, b, c, d, e, f, g, h, i, j, k, l *byte) {
+}
diff --git a/test/live_uintptrkeepalive.go b/test/live_uintptrkeepalive.go
index e39e31f..566734e 100644
--- a/test/live_uintptrkeepalive.go
+++ b/test/live_uintptrkeepalive.go
@@ -1,6 +1,6 @@
 // errorcheck -0 -m -live -std
 
-// +build !windows,!js
+// +build !windows,!js,!wasip1
 
 // Copyright 2015 The Go Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style
diff --git a/test/loopbce.go b/test/loopbce.go
index db830da..fcf0d8d 100644
--- a/test/loopbce.go
+++ b/test/loopbce.go
@@ -63,6 +63,30 @@
 	return x
 }
 
+func f5_int32(a [10]int) int {
+	x := 0
+	for i := int32(-10); i < int32(len(a)); i += 2 { // ERROR "Induction variable: limits \[-10,8\], increment 2$"
+		x += a[i]
+	}
+	return x
+}
+
+func f5_int16(a [10]int) int {
+	x := 0
+	for i := int16(-10); i < int16(len(a)); i += 2 { // ERROR "Induction variable: limits \[-10,8\], increment 2$"
+		x += a[i]
+	}
+	return x
+}
+
+func f5_int8(a [10]int) int {
+	x := 0
+	for i := int8(-10); i < int8(len(a)); i += 2 { // ERROR "Induction variable: limits \[-10,8\], increment 2$"
+		x += a[i]
+	}
+	return x
+}
+
 func f6(a []int) {
 	for i := range a { // ERROR "Induction variable: limits \[0,\?\), increment 1$"
 		b := a[0:i] // ERROR "(\([0-9]+\) )?Proved IsSliceInBounds$"
diff --git a/test/nilptr3.go b/test/nilptr3.go
index 3345cfa..5f08a5b 100644
--- a/test/nilptr3.go
+++ b/test/nilptr3.go
@@ -241,3 +241,17 @@
 	y := x[:] // ERROR "removed nil check"
 	return y
 }
+
+// See issue 42673.
+func f10(p **int) int {
+	return * // ERROR "removed nil check"
+	/* */
+	*p // ERROR "removed nil check"
+}
+
+func f11(x []byte) {
+	p := (*[0]byte)(x)
+	_ = *p // ERROR "generated nil check"
+	q := (*[4]byte)(x)
+	_ = *q // ERROR "removed nil check"
+}
diff --git a/test/noinit.go b/test/noinit.go
index 505467c..84aeeaf 100644
--- a/test/noinit.go
+++ b/test/noinit.go
@@ -1,4 +1,4 @@
-// run -gcflags=-d=inlstaticinit=1
+// run
 //go:build !gcflags_noopt
 
 // Copyright 2010 The Go Authors. All rights reserved.
@@ -328,9 +328,8 @@
 // Actual test: check for init funcs in runtime data structures.
 
 type initTask struct {
-	state uintptr
-	ndeps uintptr
-	nfns  uintptr
+	state uint32
+	nfns  uint32
 }
 
 //go:linkname main_inittask main..inittask
diff --git a/test/nosplit.go b/test/nosplit.go
index 218eb73..2b1bb54 100644
--- a/test/nosplit.go
+++ b/test/nosplit.go
@@ -1,4 +1,4 @@
-// +build !nacl,!js,!aix,!gcflags_noopt,gc
+// +build !nacl,!js,!aix,!wasip1,!gcflags_noopt,gc
 // run
 
 // Copyright 2014 The Go Authors. All rights reserved.
@@ -342,22 +342,15 @@
 				nosplit := m[3]
 				body := m[4]
 
-				// The limit was originally 128 but is now 800 (928-128).
+				// The limit was originally 128 but is now 800.
 				// Instead of rewriting the test cases above, adjust
 				// the first nosplit frame to use up the extra bytes.
 				// This isn't exactly right because we could have
 				// nosplit -> split -> nosplit, but it's good enough.
 				if !adjusted && nosplit != "" {
+					const stackNosplitBase = 800 // internal/abi.StackNosplitBase
 					adjusted = true
-					size += (928 - 128) - 128
-					// Noopt builds have a larger stackguard.
-					// See ../src/cmd/dist/buildruntime.go:stackGuardMultiplier
-					// This increase is included in objabi.StackGuard
-					for _, s := range strings.Split(os.Getenv("GO_GCFLAGS"), " ") {
-						if s == "-N" {
-							size += 928
-						}
-					}
+					size += stackNosplitBase - 128
 				}
 
 				if nosplit != "" {
diff --git a/test/prove.go b/test/prove.go
index c91fb26..91d1f55 100644
--- a/test/prove.go
+++ b/test/prove.go
@@ -820,7 +820,7 @@
 // Induction variable in unrolled loop.
 func unrollDownExcl1(a []int) int {
 	var i, x int
-	for i = len(a) - 1; i >= 1; i -= 2 { // ERROR "Induction variable: limits \[1,\?\], increment 2$"
+	for i = len(a) - 1; i >= 1; i -= 2 { // ERROR "Induction variable: limits \(0,\?\], increment 2$"
 		x += a[i]   // ERROR "Proved IsInBounds$"
 		x += a[i-1] // ERROR "Proved IsInBounds$"
 	}
@@ -1038,6 +1038,25 @@
 	return n / int32(16) // ERROR "Proved Rsh32x64 shifts to zero"
 }
 
+// Bounds check elimination
+
+func sliceBCE1(p []string, h uint) string {
+	if len(p) == 0 {
+		return ""
+	}
+
+	i := h & uint(len(p)-1)
+	return p[i] // ERROR "Proved IsInBounds$"
+}
+
+func sliceBCE2(p []string, h int) string {
+	if len(p) == 0 {
+		return ""
+	}
+	i := h & (len(p) - 1)
+	return p[i] // ERROR "Proved IsInBounds$"
+}
+
 func and(p []byte) ([]byte, []byte) { // issue #52563
 	const blocksize = 16
 	fullBlocks := len(p) &^ (blocksize - 1)
@@ -1046,6 +1065,45 @@
 	return blk, rem
 }
 
+func rshu(x, y uint) int {
+	z := x >> y
+	if z <= x { // ERROR "Proved Leq64U$"
+		return 1
+	}
+	return 0
+}
+
+func divu(x, y uint) int {
+	z := x / y
+	if z <= x { // ERROR "Proved Leq64U$"
+		return 1
+	}
+	return 0
+}
+
+func modu1(x, y uint) int {
+	z := x % y
+	if z < y { // ERROR "Proved Less64U$"
+		return 1
+	}
+	return 0
+}
+
+func modu2(x, y uint) int {
+	z := x % y
+	if z <= x { // ERROR "Proved Leq64U$"
+		return 1
+	}
+	return 0
+}
+
+func issue57077(s []int) (left, right []int) {
+	middle := len(s) / 2
+	left = s[:middle] // ERROR "Proved IsSliceInBounds$"
+	right = s[middle:] // ERROR "Proved IsSliceInBounds$"
+	return
+}
+
 func issue51622(b []byte) int {
 	if len(b) >= 3 && b[len(b)-3] == '#' { // ERROR "Proved IsInBounds$"
 		return len(b)
@@ -1053,6 +1111,11 @@
 	return 0
 }
 
+func issue45928(x int) {
+	combinedFrac := x / (x | (1 << 31)) // ERROR "Proved Neq64$"
+	useInt(combinedFrac)
+}
+
 //go:noinline
 func useInt(a int) {
 }
diff --git a/test/rename1.go b/test/rename1.go
index 058db44..56824e9 100644
--- a/test/rename1.go
+++ b/test/rename1.go
@@ -15,7 +15,7 @@
 	const (
 		a = 1 + iota // ERROR "invalid operation|incompatible types|cannot convert"
 	)
-
+	_, _ = n, y
 }
 
 const (
diff --git a/test/run.go b/test/run.go
deleted file mode 100644
index 999aa4a..0000000
--- a/test/run.go
+++ /dev/null
@@ -1,2139 +0,0 @@
-// skip
-
-// 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.
-
-// Run runs tests in the test directory.
-package main
-
-import (
-	"bytes"
-	"encoding/json"
-	"errors"
-	"flag"
-	"fmt"
-	"go/build"
-	"go/build/constraint"
-	"hash/fnv"
-	"io"
-	"io/fs"
-	"io/ioutil"
-	"log"
-	"os"
-	"os/exec"
-	"path"
-	"path/filepath"
-	"regexp"
-	"runtime"
-	"sort"
-	"strconv"
-	"strings"
-	"sync"
-	"time"
-	"unicode"
-)
-
-var (
-	verbose        = flag.Bool("v", false, "verbose. if set, parallelism is set to 1.")
-	keep           = flag.Bool("k", false, "keep. keep temporary directory.")
-	numParallel    = flag.Int("n", runtime.NumCPU(), "number of parallel tests to run")
-	summary        = flag.Bool("summary", false, "show summary of results")
-	allCodegen     = flag.Bool("all_codegen", defaultAllCodeGen(), "run all goos/goarch for codegen")
-	showSkips      = flag.Bool("show_skips", false, "show skipped tests")
-	runSkips       = flag.Bool("run_skips", false, "run skipped tests (ignore skip and build tags)")
-	linkshared     = flag.Bool("linkshared", false, "")
-	updateErrors   = flag.Bool("update_errors", false, "update error messages in test file based on compiler output")
-	runoutputLimit = flag.Int("l", defaultRunOutputLimit(), "number of parallel runoutput tests to run")
-	force          = flag.Bool("f", false, "ignore expected-failure test lists")
-
-	shard  = flag.Int("shard", 0, "shard index to run. Only applicable if -shards is non-zero.")
-	shards = flag.Int("shards", 0, "number of shards. If 0, all tests are run. This is used by the continuous build.")
-)
-
-type envVars struct {
-	GOOS         string
-	GOARCH       string
-	GOEXPERIMENT string
-	CGO_ENABLED  string
-}
-
-var env = func() (res envVars) {
-	cmd := exec.Command(goTool(), "env", "-json")
-	stdout, err := cmd.StdoutPipe()
-	if err != nil {
-		log.Fatal("StdoutPipe:", err)
-	}
-	if err := cmd.Start(); err != nil {
-		log.Fatal("Start:", err)
-	}
-	if err := json.NewDecoder(stdout).Decode(&res); err != nil {
-		log.Fatal("Decode:", err)
-	}
-	if err := cmd.Wait(); err != nil {
-		log.Fatal("Wait:", err)
-	}
-	return
-}()
-
-var unifiedEnabled = func() bool {
-	for _, tag := range build.Default.ToolTags {
-		if tag == "goexperiment.unified" {
-			return true
-		}
-	}
-	return false
-}()
-
-// defaultAllCodeGen returns the default value of the -all_codegen
-// flag. By default, we prefer to be fast (returning false), except on
-// the linux-amd64 builder that's already very fast, so we get more
-// test coverage on trybots. See https://golang.org/issue/34297.
-func defaultAllCodeGen() bool {
-	return os.Getenv("GO_BUILDER_NAME") == "linux-amd64"
-}
-
-var (
-	goos          = env.GOOS
-	goarch        = env.GOARCH
-	cgoEnabled, _ = strconv.ParseBool(env.CGO_ENABLED)
-
-	// dirs are the directories to look for *.go files in.
-	// TODO(bradfitz): just use all directories?
-	dirs = []string{".", "ken", "chan", "interface", "syntax", "dwarf", "fixedbugs", "codegen", "runtime", "abi", "typeparam", "typeparam/mdempsky"}
-
-	// ratec controls the max number of tests running at a time.
-	ratec chan bool
-
-	// toRun is the channel of tests to run.
-	// It is nil until the first test is started.
-	toRun chan *test
-
-	// rungatec controls the max number of runoutput tests
-	// executed in parallel as they can each consume a lot of memory.
-	rungatec chan bool
-)
-
-// maxTests is an upper bound on the total number of tests.
-// It is used as a channel buffer size to make sure sends don't block.
-const maxTests = 5000
-
-func main() {
-	flag.Parse()
-
-	findExecCmd()
-
-	// Disable parallelism if printing or if using a simulator.
-	if *verbose || len(findExecCmd()) > 0 {
-		*numParallel = 1
-		*runoutputLimit = 1
-	}
-
-	ratec = make(chan bool, *numParallel)
-	rungatec = make(chan bool, *runoutputLimit)
-
-	var tests []*test
-	if flag.NArg() > 0 {
-		for _, arg := range flag.Args() {
-			if arg == "-" || arg == "--" {
-				// Permit running:
-				// $ go run run.go - env.go
-				// $ go run run.go -- env.go
-				// $ go run run.go - ./fixedbugs
-				// $ go run run.go -- ./fixedbugs
-				continue
-			}
-			if fi, err := os.Stat(arg); err == nil && fi.IsDir() {
-				for _, baseGoFile := range goFiles(arg) {
-					tests = append(tests, startTest(arg, baseGoFile))
-				}
-			} else if strings.HasSuffix(arg, ".go") {
-				dir, file := filepath.Split(arg)
-				tests = append(tests, startTest(dir, file))
-			} else {
-				log.Fatalf("can't yet deal with non-directory and non-go file %q", arg)
-			}
-		}
-	} else {
-		for _, dir := range dirs {
-			for _, baseGoFile := range goFiles(dir) {
-				tests = append(tests, startTest(dir, baseGoFile))
-			}
-		}
-	}
-
-	failed := false
-	resCount := map[string]int{}
-	for _, test := range tests {
-		<-test.donec
-		status := "ok  "
-		errStr := ""
-		if e, isSkip := test.err.(skipError); isSkip {
-			test.err = nil
-			errStr = "unexpected skip for " + path.Join(test.dir, test.gofile) + ": " + string(e)
-			status = "FAIL"
-		}
-		if test.err != nil {
-			errStr = test.err.Error()
-			if test.expectFail {
-				errStr += " (expected)"
-			} else {
-				status = "FAIL"
-			}
-		} else if test.expectFail {
-			status = "FAIL"
-			errStr = "unexpected success"
-		}
-		if status == "FAIL" {
-			failed = true
-		}
-		resCount[status]++
-		dt := fmt.Sprintf("%.3fs", test.dt.Seconds())
-		if status == "FAIL" {
-			fmt.Printf("# go run run.go -- %s\n%s\nFAIL\t%s\t%s\n",
-				path.Join(test.dir, test.gofile),
-				errStr, test.goFileName(), dt)
-			continue
-		}
-		if !*verbose {
-			continue
-		}
-		fmt.Printf("%s\t%s\t%s\n", status, test.goFileName(), dt)
-	}
-
-	if *summary {
-		for k, v := range resCount {
-			fmt.Printf("%5d %s\n", v, k)
-		}
-	}
-
-	if failed {
-		os.Exit(1)
-	}
-}
-
-// goTool reports the path of the go tool to use to run the tests.
-// If possible, use the same Go used to run run.go, otherwise
-// fallback to the go version found in the PATH.
-func goTool() string {
-	var exeSuffix string
-	if runtime.GOOS == "windows" {
-		exeSuffix = ".exe"
-	}
-	path := filepath.Join(runtime.GOROOT(), "bin", "go"+exeSuffix)
-	if _, err := os.Stat(path); err == nil {
-		return path
-	}
-	// Just run "go" from PATH
-	return "go"
-}
-
-func shardMatch(name string) bool {
-	if *shards == 0 {
-		return true
-	}
-	h := fnv.New32()
-	io.WriteString(h, name)
-	return int(h.Sum32()%uint32(*shards)) == *shard
-}
-
-func goFiles(dir string) []string {
-	f, err := os.Open(dir)
-	if err != nil {
-		log.Fatal(err)
-	}
-	dirnames, err := f.Readdirnames(-1)
-	f.Close()
-	if err != nil {
-		log.Fatal(err)
-	}
-	names := []string{}
-	for _, name := range dirnames {
-		if !strings.HasPrefix(name, ".") && strings.HasSuffix(name, ".go") && shardMatch(name) {
-			names = append(names, name)
-		}
-	}
-	sort.Strings(names)
-	return names
-}
-
-type runCmd func(...string) ([]byte, error)
-
-func compileFile(runcmd runCmd, longname string, flags []string) (out []byte, err error) {
-	cmd := []string{goTool(), "tool", "compile", "-e", "-p=p", "-importcfg=" + stdlibImportcfgFile()}
-	cmd = append(cmd, flags...)
-	if *linkshared {
-		cmd = append(cmd, "-dynlink", "-installsuffix=dynlink")
-	}
-	cmd = append(cmd, longname)
-	return runcmd(cmd...)
-}
-
-func compileInDir(runcmd runCmd, dir string, flags []string, importcfg string, pkgname string, names ...string) (out []byte, err error) {
-	if importcfg == "" {
-		importcfg = stdlibImportcfgFile()
-	}
-	cmd := []string{goTool(), "tool", "compile", "-e", "-D", "test", "-importcfg=" + importcfg}
-	if pkgname == "main" {
-		cmd = append(cmd, "-p=main")
-	} else {
-		pkgname = path.Join("test", strings.TrimSuffix(names[0], ".go"))
-		cmd = append(cmd, "-o", pkgname+".a", "-p", pkgname)
-	}
-	cmd = append(cmd, flags...)
-	if *linkshared {
-		cmd = append(cmd, "-dynlink", "-installsuffix=dynlink")
-	}
-	for _, name := range names {
-		cmd = append(cmd, filepath.Join(dir, name))
-	}
-	return runcmd(cmd...)
-}
-
-var stdlibImportcfgString string
-var stdlibImportcfgFilename string
-var cfgonce sync.Once
-var fileonce sync.Once
-
-func stdlibImportcfg() string {
-	cfgonce.Do(func() {
-		output, err := exec.Command(goTool(), "list", "-export", "-f", "{{if .Export}}packagefile {{.ImportPath}}={{.Export}}{{end}}", "std").Output()
-		if err != nil {
-			log.Fatal(err)
-		}
-		stdlibImportcfgString = string(output)
-	})
-	return stdlibImportcfgString
-}
-
-func stdlibImportcfgFile() string {
-	fileonce.Do(func() {
-		tmpdir, err := os.MkdirTemp("", "importcfg")
-		if err != nil {
-			log.Fatal(err)
-		}
-		filename := filepath.Join(tmpdir, "importcfg")
-		os.WriteFile(filename, []byte(stdlibImportcfg()), 0644)
-		stdlibImportcfgFilename = filename
-	})
-	return stdlibImportcfgFilename
-}
-
-func linkFile(runcmd runCmd, goname string, importcfg string, ldflags []string) (err error) {
-	if importcfg == "" {
-		importcfg = stdlibImportcfgFile()
-	}
-	pfile := strings.Replace(goname, ".go", ".o", -1)
-	cmd := []string{goTool(), "tool", "link", "-w", "-o", "a.exe", "-importcfg=" + importcfg}
-	if *linkshared {
-		cmd = append(cmd, "-linkshared", "-installsuffix=dynlink")
-	}
-	if ldflags != nil {
-		cmd = append(cmd, ldflags...)
-	}
-	cmd = append(cmd, pfile)
-	_, err = runcmd(cmd...)
-	return
-}
-
-// skipError describes why a test was skipped.
-type skipError string
-
-func (s skipError) Error() string { return string(s) }
-
-// test holds the state of a test.
-type test struct {
-	dir, gofile string
-	donec       chan bool // closed when done
-	dt          time.Duration
-
-	src string
-
-	tempDir string
-	err     error
-
-	// expectFail indicates whether the (overall) test recipe is
-	// expected to fail under the current test configuration (e.g.,
-	// GOEXPERIMENT=unified).
-	expectFail bool
-}
-
-// initExpectFail initializes t.expectFail based on the build+test
-// configuration.
-func (t *test) initExpectFail() {
-	if *force {
-		return
-	}
-
-	failureSets := []map[string]bool{types2Failures}
-
-	// Note: gccgo supports more 32-bit architectures than this, but
-	// hopefully the 32-bit failures are fixed before this matters.
-	switch goarch {
-	case "386", "arm", "mips", "mipsle":
-		failureSets = append(failureSets, types2Failures32Bit)
-	}
-
-	if !unifiedEnabled {
-		failureSets = append(failureSets, go118Failures)
-	}
-
-	filename := strings.Replace(t.goFileName(), "\\", "/", -1) // goFileName() uses \ on Windows
-
-	for _, set := range failureSets {
-		if set[filename] {
-			t.expectFail = true
-			return
-		}
-	}
-}
-
-func startTest(dir, gofile string) *test {
-	t := &test{
-		dir:    dir,
-		gofile: gofile,
-		donec:  make(chan bool, 1),
-	}
-	if toRun == nil {
-		toRun = make(chan *test, maxTests)
-		go runTests()
-	}
-	select {
-	case toRun <- t:
-	default:
-		panic("toRun buffer size (maxTests) is too small")
-	}
-	return t
-}
-
-// runTests runs tests in parallel, but respecting the order they
-// were enqueued on the toRun channel.
-func runTests() {
-	for {
-		ratec <- true
-		t := <-toRun
-		go func() {
-			t.run()
-			<-ratec
-		}()
-	}
-}
-
-var cwd, _ = os.Getwd()
-
-func (t *test) goFileName() string {
-	return filepath.Join(t.dir, t.gofile)
-}
-
-func (t *test) goDirName() string {
-	return filepath.Join(t.dir, strings.Replace(t.gofile, ".go", ".dir", -1))
-}
-
-func goDirFiles(longdir string) (filter []os.FileInfo, err error) {
-	files, dirErr := ioutil.ReadDir(longdir)
-	if dirErr != nil {
-		return nil, dirErr
-	}
-	for _, gofile := range files {
-		if filepath.Ext(gofile.Name()) == ".go" {
-			filter = append(filter, gofile)
-		}
-	}
-	return
-}
-
-var packageRE = regexp.MustCompile(`(?m)^package ([\p{Lu}\p{Ll}\w]+)`)
-
-func getPackageNameFromSource(fn string) (string, error) {
-	data, err := ioutil.ReadFile(fn)
-	if err != nil {
-		return "", err
-	}
-	pkgname := packageRE.FindStringSubmatch(string(data))
-	if pkgname == nil {
-		return "", fmt.Errorf("cannot find package name in %s", fn)
-	}
-	return pkgname[1], nil
-}
-
-type goDirPkg struct {
-	name  string
-	files []string
-}
-
-// If singlefilepkgs is set, each file is considered a separate package
-// even if the package names are the same.
-func goDirPackages(longdir string, singlefilepkgs bool) ([]*goDirPkg, error) {
-	files, err := goDirFiles(longdir)
-	if err != nil {
-		return nil, err
-	}
-	var pkgs []*goDirPkg
-	m := make(map[string]*goDirPkg)
-	for _, file := range files {
-		name := file.Name()
-		pkgname, err := getPackageNameFromSource(filepath.Join(longdir, name))
-		if err != nil {
-			log.Fatal(err)
-		}
-		p, ok := m[pkgname]
-		if singlefilepkgs || !ok {
-			p = &goDirPkg{name: pkgname}
-			pkgs = append(pkgs, p)
-			m[pkgname] = p
-		}
-		p.files = append(p.files, name)
-	}
-	return pkgs, nil
-}
-
-type context struct {
-	GOOS       string
-	GOARCH     string
-	cgoEnabled bool
-	noOptEnv   bool
-}
-
-// shouldTest looks for build tags in a source file and returns
-// whether the file should be used according to the tags.
-func shouldTest(src string, goos, goarch string) (ok bool, whyNot string) {
-	if *runSkips {
-		return true, ""
-	}
-	for _, line := range strings.Split(src, "\n") {
-		if strings.HasPrefix(line, "package ") {
-			break
-		}
-
-		if expr, err := constraint.Parse(line); err == nil {
-			gcFlags := os.Getenv("GO_GCFLAGS")
-			ctxt := &context{
-				GOOS:       goos,
-				GOARCH:     goarch,
-				cgoEnabled: cgoEnabled,
-				noOptEnv:   strings.Contains(gcFlags, "-N") || strings.Contains(gcFlags, "-l"),
-			}
-
-			if !expr.Eval(ctxt.match) {
-				return false, line
-			}
-		}
-	}
-	return true, ""
-}
-
-func (ctxt *context) match(name string) bool {
-	if name == "" {
-		return false
-	}
-
-	// 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
-		}
-	}
-
-	if strings.HasPrefix(name, "goexperiment.") {
-		for _, tag := range build.Default.ToolTags {
-			if tag == name {
-				return true
-			}
-		}
-		return false
-	}
-
-	if name == "cgo" && ctxt.cgoEnabled {
-		return true
-	}
-
-	if name == ctxt.GOOS || name == ctxt.GOARCH || name == "gc" {
-		return true
-	}
-
-	if ctxt.noOptEnv && name == "gcflags_noopt" {
-		return true
-	}
-
-	if name == "test_run" {
-		return true
-	}
-
-	return false
-}
-
-func init() {
-	checkShouldTest()
-}
-
-// goGcflags returns the -gcflags argument to use with go build / go run.
-// This must match the flags used for building the standard library,
-// or else the commands will rebuild any needed packages (like runtime)
-// over and over.
-func (t *test) goGcflags() string {
-	return "-gcflags=all=" + os.Getenv("GO_GCFLAGS")
-}
-
-func (t *test) goGcflagsIsEmpty() bool {
-	return "" == os.Getenv("GO_GCFLAGS")
-}
-
-var errTimeout = errors.New("command exceeded time limit")
-
-// run runs a test.
-func (t *test) run() {
-	start := time.Now()
-	defer func() {
-		t.dt = time.Since(start)
-		close(t.donec)
-	}()
-
-	srcBytes, err := ioutil.ReadFile(t.goFileName())
-	if err != nil {
-		t.err = err
-		return
-	}
-	t.src = string(srcBytes)
-	if t.src[0] == '\n' {
-		t.err = skipError("starts with newline")
-		return
-	}
-
-	// Execution recipe stops at first blank line.
-	action, _, ok := strings.Cut(t.src, "\n\n")
-	if !ok {
-		t.err = fmt.Errorf("double newline ending execution recipe not found in %s", t.goFileName())
-		return
-	}
-	if firstLine, rest, ok := strings.Cut(action, "\n"); ok && strings.Contains(firstLine, "+build") {
-		// skip first line
-		action = rest
-	}
-	action = strings.TrimPrefix(action, "//")
-
-	// Check for build constraints only up to the actual code.
-	header, _, ok := strings.Cut(t.src, "\npackage")
-	if !ok {
-		header = action // some files are intentionally malformed
-	}
-	if ok, why := shouldTest(header, goos, goarch); !ok {
-		if *showSkips {
-			fmt.Printf("%-20s %-20s: %s\n", "skip", t.goFileName(), why)
-		}
-		return
-	}
-
-	var args, flags, runenv []string
-	var tim int
-	wantError := false
-	wantAuto := false
-	singlefilepkgs := false
-	f, err := splitQuoted(action)
-	if err != nil {
-		t.err = fmt.Errorf("invalid test recipe: %v", err)
-		return
-	}
-	if len(f) > 0 {
-		action = f[0]
-		args = f[1:]
-	}
-
-	// TODO: Clean up/simplify this switch statement.
-	switch action {
-	case "compile", "compiledir", "build", "builddir", "buildrundir", "run", "buildrun", "runoutput", "rundir", "runindir", "asmcheck":
-		// nothing to do
-	case "errorcheckandrundir":
-		wantError = false // should be no error if also will run
-	case "errorcheckwithauto":
-		action = "errorcheck"
-		wantAuto = true
-		wantError = true
-	case "errorcheck", "errorcheckdir", "errorcheckoutput":
-		wantError = true
-	case "skip":
-		if *runSkips {
-			break
-		}
-		return
-	default:
-		t.err = skipError("skipped; unknown pattern: " + action)
-		return
-	}
-
-	goexp := env.GOEXPERIMENT
-
-	// collect flags
-	for len(args) > 0 && strings.HasPrefix(args[0], "-") {
-		switch args[0] {
-		case "-1":
-			wantError = true
-		case "-0":
-			wantError = false
-		case "-s":
-			singlefilepkgs = true
-		case "-t": // timeout in seconds
-			args = args[1:]
-			var err error
-			tim, err = strconv.Atoi(args[0])
-			if err != nil {
-				t.err = fmt.Errorf("need number of seconds for -t timeout, got %s instead", args[0])
-			}
-			if s := os.Getenv("GO_TEST_TIMEOUT_SCALE"); s != "" {
-				timeoutScale, err := strconv.Atoi(s)
-				if err != nil {
-					log.Fatalf("failed to parse $GO_TEST_TIMEOUT_SCALE = %q as integer: %v", s, err)
-				}
-				tim *= timeoutScale
-			}
-		case "-goexperiment": // set GOEXPERIMENT environment
-			args = args[1:]
-			if goexp != "" {
-				goexp += ","
-			}
-			goexp += args[0]
-			runenv = append(runenv, "GOEXPERIMENT="+goexp)
-
-		default:
-			flags = append(flags, args[0])
-		}
-		args = args[1:]
-	}
-	if action == "errorcheck" {
-		found := false
-		for i, f := range flags {
-			if strings.HasPrefix(f, "-d=") {
-				flags[i] = f + ",ssa/check/on"
-				found = true
-				break
-			}
-		}
-		if !found {
-			flags = append(flags, "-d=ssa/check/on")
-		}
-	}
-
-	t.initExpectFail()
-	t.makeTempDir()
-	if !*keep {
-		defer os.RemoveAll(t.tempDir)
-	}
-
-	err = ioutil.WriteFile(filepath.Join(t.tempDir, t.gofile), srcBytes, 0644)
-	if err != nil {
-		log.Fatal(err)
-	}
-
-	// A few tests (of things like the environment) require these to be set.
-	if os.Getenv("GOOS") == "" {
-		os.Setenv("GOOS", runtime.GOOS)
-	}
-	if os.Getenv("GOARCH") == "" {
-		os.Setenv("GOARCH", runtime.GOARCH)
-	}
-
-	var (
-		runInDir        = t.tempDir
-		tempDirIsGOPATH = false
-	)
-	runcmd := func(args ...string) ([]byte, error) {
-		cmd := exec.Command(args[0], args[1:]...)
-		var buf bytes.Buffer
-		cmd.Stdout = &buf
-		cmd.Stderr = &buf
-		cmd.Env = append(os.Environ(), "GOENV=off", "GOFLAGS=")
-		if runInDir != "" {
-			cmd.Dir = runInDir
-			// Set PWD to match Dir to speed up os.Getwd in the child process.
-			cmd.Env = append(cmd.Env, "PWD="+cmd.Dir)
-		}
-		if tempDirIsGOPATH {
-			cmd.Env = append(cmd.Env, "GOPATH="+t.tempDir)
-		}
-		cmd.Env = append(cmd.Env, "STDLIB_IMPORTCFG="+stdlibImportcfgFile())
-		// Put the bin directory of the GOROOT that built this program
-		// first in the path. This ensures that tests that use the "go"
-		// tool use the same one that built this program. This ensures
-		// that if you do "../bin/go run run.go" in this directory, all
-		// the tests that start subprocesses that "go tool compile" or
-		// whatever, use ../bin/go as their go tool, not whatever happens
-		// to be first in the user's path.
-		path := os.Getenv("PATH")
-		newdir := filepath.Join(runtime.GOROOT(), "bin")
-		if path != "" {
-			path = newdir + string(filepath.ListSeparator) + path
-		} else {
-			path = newdir
-		}
-		cmd.Env = append(cmd.Env, "PATH="+path)
-
-		cmd.Env = append(cmd.Env, runenv...)
-
-		var err error
-
-		if tim != 0 {
-			err = cmd.Start()
-			// This command-timeout code adapted from cmd/go/test.go
-			// Note: the Go command uses a more sophisticated timeout
-			// strategy, first sending SIGQUIT (if appropriate for the
-			// OS in question) to try to trigger a stack trace, then
-			// finally much later SIGKILL. If timeouts prove to be a
-			// common problem here, it would be worth porting over
-			// that code as well. See https://do.dev/issue/50973
-			// for more discussion.
-			if err == nil {
-				tick := time.NewTimer(time.Duration(tim) * time.Second)
-				done := make(chan error)
-				go func() {
-					done <- cmd.Wait()
-				}()
-				select {
-				case err = <-done:
-					// ok
-				case <-tick.C:
-					cmd.Process.Signal(os.Interrupt)
-					time.Sleep(1 * time.Second)
-					cmd.Process.Kill()
-					<-done
-					err = errTimeout
-				}
-				tick.Stop()
-			}
-		} else {
-			err = cmd.Run()
-		}
-		if err != nil && err != errTimeout {
-			err = fmt.Errorf("%s\n%s", err, buf.Bytes())
-		}
-		return buf.Bytes(), err
-	}
-
-	importcfg := func(dir string, pkgs []*goDirPkg) string {
-		cfg := stdlibImportcfg()
-		for _, pkg := range pkgs {
-			pkgpath := path.Join("test", strings.TrimSuffix(pkg.files[0], ".go"))
-			cfg += "\npackagefile " + pkgpath + "=" + filepath.Join(t.tempDir, pkgpath+".a")
-		}
-		filename := filepath.Join(t.tempDir, "importcfg")
-		os.WriteFile(filename, []byte(cfg), 0644)
-		return filename
-	}
-
-	long := filepath.Join(cwd, t.goFileName())
-	switch action {
-	default:
-		t.err = fmt.Errorf("unimplemented action %q", action)
-
-	case "asmcheck":
-		// Compile Go file and match the generated assembly
-		// against a set of regexps in comments.
-		ops := t.wantedAsmOpcodes(long)
-		self := runtime.GOOS + "/" + runtime.GOARCH
-		for _, env := range ops.Envs() {
-			// Only run checks relevant to the current GOOS/GOARCH,
-			// to avoid triggering a cross-compile of the runtime.
-			if string(env) != self && !strings.HasPrefix(string(env), self+"/") && !*allCodegen {
-				continue
-			}
-			// -S=2 forces outermost line numbers when disassembling inlined code.
-			cmdline := []string{"build", "-gcflags", "-S=2"}
-
-			// Append flags, but don't override -gcflags=-S=2; add to it instead.
-			for i := 0; i < len(flags); i++ {
-				flag := flags[i]
-				switch {
-				case strings.HasPrefix(flag, "-gcflags="):
-					cmdline[2] += " " + strings.TrimPrefix(flag, "-gcflags=")
-				case strings.HasPrefix(flag, "--gcflags="):
-					cmdline[2] += " " + strings.TrimPrefix(flag, "--gcflags=")
-				case flag == "-gcflags", flag == "--gcflags":
-					i++
-					if i < len(flags) {
-						cmdline[2] += " " + flags[i]
-					}
-				default:
-					cmdline = append(cmdline, flag)
-				}
-			}
-
-			cmdline = append(cmdline, long)
-			cmd := exec.Command(goTool(), cmdline...)
-			cmd.Env = append(os.Environ(), env.Environ()...)
-			if len(flags) > 0 && flags[0] == "-race" {
-				cmd.Env = append(cmd.Env, "CGO_ENABLED=1")
-			}
-
-			var buf bytes.Buffer
-			cmd.Stdout, cmd.Stderr = &buf, &buf
-			if err := cmd.Run(); err != nil {
-				fmt.Println(env, "\n", cmd.Stderr)
-				t.err = err
-				return
-			}
-
-			t.err = t.asmCheck(buf.String(), long, env, ops[env])
-			if t.err != nil {
-				return
-			}
-		}
-		return
-
-	case "errorcheck":
-		// Compile Go file.
-		// Fail if wantError is true and compilation was successful and vice versa.
-		// Match errors produced by gc against errors in comments.
-		// TODO(gri) remove need for -C (disable printing of columns in error messages)
-		cmdline := []string{goTool(), "tool", "compile", "-p=p", "-d=panic", "-C", "-e", "-importcfg=" + stdlibImportcfgFile(), "-o", "a.o"}
-		// No need to add -dynlink even if linkshared if we're just checking for errors...
-		cmdline = append(cmdline, flags...)
-		cmdline = append(cmdline, long)
-		out, err := runcmd(cmdline...)
-		if wantError {
-			if err == nil {
-				t.err = fmt.Errorf("compilation succeeded unexpectedly\n%s", out)
-				return
-			}
-			if err == errTimeout {
-				t.err = fmt.Errorf("compilation timed out")
-				return
-			}
-		} else {
-			if err != nil {
-				t.err = err
-				return
-			}
-		}
-		if *updateErrors {
-			t.updateErrors(string(out), long)
-		}
-		t.err = t.errorCheck(string(out), wantAuto, long, t.gofile)
-
-	case "compile":
-		// Compile Go file.
-		_, t.err = compileFile(runcmd, long, flags)
-
-	case "compiledir":
-		// Compile all files in the directory as packages in lexicographic order.
-		longdir := filepath.Join(cwd, t.goDirName())
-		pkgs, err := goDirPackages(longdir, singlefilepkgs)
-		if err != nil {
-			t.err = err
-			return
-		}
-		importcfgfile := importcfg(longdir, pkgs)
-
-		for _, pkg := range pkgs {
-			_, t.err = compileInDir(runcmd, longdir, flags, importcfgfile, pkg.name, pkg.files...)
-			if t.err != nil {
-				return
-			}
-		}
-
-	case "errorcheckdir", "errorcheckandrundir":
-		flags = append(flags, "-d=panic")
-		// Compile and errorCheck all files in the directory as packages in lexicographic order.
-		// If errorcheckdir and wantError, compilation of the last package must fail.
-		// If errorcheckandrundir and wantError, compilation of the package prior the last must fail.
-		longdir := filepath.Join(cwd, t.goDirName())
-		pkgs, err := goDirPackages(longdir, singlefilepkgs)
-		if err != nil {
-			t.err = err
-			return
-		}
-		errPkg := len(pkgs) - 1
-		if wantError && action == "errorcheckandrundir" {
-			// The last pkg should compiled successfully and will be run in next case.
-			// Preceding pkg must return an error from compileInDir.
-			errPkg--
-		}
-		importcfgfile := importcfg(longdir, pkgs)
-		for i, pkg := range pkgs {
-			out, err := compileInDir(runcmd, longdir, flags, importcfgfile, pkg.name, pkg.files...)
-			if i == errPkg {
-				if wantError && err == nil {
-					t.err = fmt.Errorf("compilation succeeded unexpectedly\n%s", out)
-					return
-				} else if !wantError && err != nil {
-					t.err = err
-					return
-				}
-			} else if err != nil {
-				t.err = err
-				return
-			}
-			var fullshort []string
-			for _, name := range pkg.files {
-				fullshort = append(fullshort, filepath.Join(longdir, name), name)
-			}
-			t.err = t.errorCheck(string(out), wantAuto, fullshort...)
-			if t.err != nil {
-				break
-			}
-		}
-		if action == "errorcheckdir" {
-			return
-		}
-		fallthrough
-
-	case "rundir":
-		// Compile all files in the directory as packages in lexicographic order.
-		// In case of errorcheckandrundir, ignore failed compilation of the package before the last.
-		// Link as if the last file is the main package, run it.
-		// Verify the expected output.
-		longdir := filepath.Join(cwd, t.goDirName())
-		pkgs, err := goDirPackages(longdir, singlefilepkgs)
-		if err != nil {
-			t.err = err
-			return
-		}
-		// Split flags into gcflags and ldflags
-		ldflags := []string{}
-		for i, fl := range flags {
-			if fl == "-ldflags" {
-				ldflags = flags[i+1:]
-				flags = flags[0:i]
-				break
-			}
-		}
-
-		importcfgfile := importcfg(longdir, pkgs)
-
-		for i, pkg := range pkgs {
-			_, err := compileInDir(runcmd, longdir, flags, importcfgfile, pkg.name, pkg.files...)
-			// Allow this package compilation fail based on conditions below;
-			// its errors were checked in previous case.
-			if err != nil && !(wantError && action == "errorcheckandrundir" && i == len(pkgs)-2) {
-				t.err = err
-				return
-			}
-
-			if i == len(pkgs)-1 {
-				err = linkFile(runcmd, pkg.files[0], importcfgfile, ldflags)
-				if err != nil {
-					t.err = err
-					return
-				}
-				var cmd []string
-				cmd = append(cmd, findExecCmd()...)
-				cmd = append(cmd, filepath.Join(t.tempDir, "a.exe"))
-				cmd = append(cmd, args...)
-				out, err := runcmd(cmd...)
-				if err != nil {
-					t.err = err
-					return
-				}
-				t.checkExpectedOutput(out)
-			}
-		}
-
-	case "runindir":
-		// Make a shallow copy of t.goDirName() in its own module and GOPATH, and
-		// run "go run ." in it. The module path (and hence import path prefix) of
-		// the copy is equal to the basename of the source directory.
-		//
-		// It's used when test a requires a full 'go build' in order to compile
-		// the sources, such as when importing multiple packages (issue29612.dir)
-		// or compiling a package containing assembly files (see issue15609.dir),
-		// but still needs to be run to verify the expected output.
-		tempDirIsGOPATH = true
-		srcDir := t.goDirName()
-		modName := filepath.Base(srcDir)
-		gopathSrcDir := filepath.Join(t.tempDir, "src", modName)
-		runInDir = gopathSrcDir
-
-		if err := overlayDir(gopathSrcDir, srcDir); err != nil {
-			t.err = err
-			return
-		}
-
-		modFile := fmt.Sprintf("module %s\ngo 1.14\n", modName)
-		if err := ioutil.WriteFile(filepath.Join(gopathSrcDir, "go.mod"), []byte(modFile), 0666); err != nil {
-			t.err = err
-			return
-		}
-
-		cmd := []string{goTool(), "run", t.goGcflags()}
-		if *linkshared {
-			cmd = append(cmd, "-linkshared")
-		}
-		cmd = append(cmd, flags...)
-		cmd = append(cmd, ".")
-		out, err := runcmd(cmd...)
-		if err != nil {
-			t.err = err
-			return
-		}
-		t.checkExpectedOutput(out)
-
-	case "build":
-		// Build Go file.
-		cmd := []string{goTool(), "build", t.goGcflags()}
-		cmd = append(cmd, flags...)
-		cmd = append(cmd, "-o", "a.exe", long)
-		_, err := runcmd(cmd...)
-		if err != nil {
-			t.err = err
-		}
-
-	case "builddir", "buildrundir":
-		// Build an executable from all the .go and .s files in a subdirectory.
-		// Run it and verify its output in the buildrundir case.
-		longdir := filepath.Join(cwd, t.goDirName())
-		files, dirErr := ioutil.ReadDir(longdir)
-		if dirErr != nil {
-			t.err = dirErr
-			break
-		}
-		var gos []string
-		var asms []string
-		for _, file := range files {
-			switch filepath.Ext(file.Name()) {
-			case ".go":
-				gos = append(gos, filepath.Join(longdir, file.Name()))
-			case ".s":
-				asms = append(asms, filepath.Join(longdir, file.Name()))
-			}
-
-		}
-		if len(asms) > 0 {
-			emptyHdrFile := filepath.Join(t.tempDir, "go_asm.h")
-			if err := ioutil.WriteFile(emptyHdrFile, nil, 0666); err != nil {
-				t.err = fmt.Errorf("write empty go_asm.h: %s", err)
-				return
-			}
-			cmd := []string{goTool(), "tool", "asm", "-p=main", "-gensymabis", "-o", "symabis"}
-			cmd = append(cmd, asms...)
-			_, err = runcmd(cmd...)
-			if err != nil {
-				t.err = err
-				break
-			}
-		}
-		var objs []string
-		cmd := []string{goTool(), "tool", "compile", "-p=main", "-e", "-D", ".", "-importcfg=" + stdlibImportcfgFile(), "-o", "go.o"}
-		if len(asms) > 0 {
-			cmd = append(cmd, "-asmhdr", "go_asm.h", "-symabis", "symabis")
-		}
-		cmd = append(cmd, gos...)
-		_, err := runcmd(cmd...)
-		if err != nil {
-			t.err = err
-			break
-		}
-		objs = append(objs, "go.o")
-		if len(asms) > 0 {
-			cmd = []string{goTool(), "tool", "asm", "-p=main", "-e", "-I", ".", "-o", "asm.o"}
-			cmd = append(cmd, asms...)
-			_, err = runcmd(cmd...)
-			if err != nil {
-				t.err = err
-				break
-			}
-			objs = append(objs, "asm.o")
-		}
-		cmd = []string{goTool(), "tool", "pack", "c", "all.a"}
-		cmd = append(cmd, objs...)
-		_, err = runcmd(cmd...)
-		if err != nil {
-			t.err = err
-			break
-		}
-		cmd = []string{goTool(), "tool", "link", "-importcfg=" + stdlibImportcfgFile(), "-o", "a.exe", "all.a"}
-		_, err = runcmd(cmd...)
-		if err != nil {
-			t.err = err
-			break
-		}
-		if action == "buildrundir" {
-			cmd = append(findExecCmd(), filepath.Join(t.tempDir, "a.exe"))
-			out, err := runcmd(cmd...)
-			if err != nil {
-				t.err = err
-				break
-			}
-			t.checkExpectedOutput(out)
-		}
-
-	case "buildrun":
-		// Build an executable from Go file, then run it, verify its output.
-		// Useful for timeout tests where failure mode is infinite loop.
-		// TODO: not supported on NaCl
-		cmd := []string{goTool(), "build", t.goGcflags(), "-o", "a.exe"}
-		if *linkshared {
-			cmd = append(cmd, "-linkshared")
-		}
-		longdirgofile := filepath.Join(filepath.Join(cwd, t.dir), t.gofile)
-		cmd = append(cmd, flags...)
-		cmd = append(cmd, longdirgofile)
-		_, err := runcmd(cmd...)
-		if err != nil {
-			t.err = err
-			return
-		}
-		cmd = []string{"./a.exe"}
-		out, err := runcmd(append(cmd, args...)...)
-		if err != nil {
-			t.err = err
-			return
-		}
-
-		t.checkExpectedOutput(out)
-
-	case "run":
-		// Run Go file if no special go command flags are provided;
-		// otherwise build an executable and run it.
-		// Verify the output.
-		runInDir = ""
-		var out []byte
-		var err error
-		if len(flags)+len(args) == 0 && t.goGcflagsIsEmpty() && !*linkshared && goarch == runtime.GOARCH && goos == runtime.GOOS && goexp == env.GOEXPERIMENT {
-			// If we're not using special go command flags,
-			// skip all the go command machinery.
-			// This avoids any time the go command would
-			// spend checking whether, for example, the installed
-			// package runtime is up to date.
-			// Because we run lots of trivial test programs,
-			// the time adds up.
-			pkg := filepath.Join(t.tempDir, "pkg.a")
-			if _, err := runcmd(goTool(), "tool", "compile", "-p=main", "-importcfg="+stdlibImportcfgFile(), "-o", pkg, t.goFileName()); err != nil {
-				t.err = err
-				return
-			}
-			exe := filepath.Join(t.tempDir, "test.exe")
-			cmd := []string{goTool(), "tool", "link", "-s", "-w", "-importcfg=" + stdlibImportcfgFile()}
-			cmd = append(cmd, "-o", exe, pkg)
-			if _, err := runcmd(cmd...); err != nil {
-				t.err = err
-				return
-			}
-			out, err = runcmd(append([]string{exe}, args...)...)
-		} else {
-			cmd := []string{goTool(), "run", t.goGcflags()}
-			if *linkshared {
-				cmd = append(cmd, "-linkshared")
-			}
-			cmd = append(cmd, flags...)
-			cmd = append(cmd, t.goFileName())
-			out, err = runcmd(append(cmd, args...)...)
-		}
-		if err != nil {
-			t.err = err
-			return
-		}
-		t.checkExpectedOutput(out)
-
-	case "runoutput":
-		// Run Go file and write its output into temporary Go file.
-		// Run generated Go file and verify its output.
-		rungatec <- true
-		defer func() {
-			<-rungatec
-		}()
-		runInDir = ""
-		cmd := []string{goTool(), "run", t.goGcflags()}
-		if *linkshared {
-			cmd = append(cmd, "-linkshared")
-		}
-		cmd = append(cmd, t.goFileName())
-		out, err := runcmd(append(cmd, args...)...)
-		if err != nil {
-			t.err = err
-			return
-		}
-		tfile := filepath.Join(t.tempDir, "tmp__.go")
-		if err := ioutil.WriteFile(tfile, out, 0666); err != nil {
-			t.err = fmt.Errorf("write tempfile:%s", err)
-			return
-		}
-		cmd = []string{goTool(), "run", t.goGcflags()}
-		if *linkshared {
-			cmd = append(cmd, "-linkshared")
-		}
-		cmd = append(cmd, tfile)
-		out, err = runcmd(cmd...)
-		if err != nil {
-			t.err = err
-			return
-		}
-		t.checkExpectedOutput(out)
-
-	case "errorcheckoutput":
-		// Run Go file and write its output into temporary Go file.
-		// Compile and errorCheck generated Go file.
-		runInDir = ""
-		cmd := []string{goTool(), "run", t.goGcflags()}
-		if *linkshared {
-			cmd = append(cmd, "-linkshared")
-		}
-		cmd = append(cmd, t.goFileName())
-		out, err := runcmd(append(cmd, args...)...)
-		if err != nil {
-			t.err = err
-			return
-		}
-		tfile := filepath.Join(t.tempDir, "tmp__.go")
-		err = ioutil.WriteFile(tfile, out, 0666)
-		if err != nil {
-			t.err = fmt.Errorf("write tempfile:%s", err)
-			return
-		}
-		cmdline := []string{goTool(), "tool", "compile", "-importcfg=" + stdlibImportcfgFile(), "-p=p", "-d=panic", "-e", "-o", "a.o"}
-		cmdline = append(cmdline, flags...)
-		cmdline = append(cmdline, tfile)
-		out, err = runcmd(cmdline...)
-		if wantError {
-			if err == nil {
-				t.err = fmt.Errorf("compilation succeeded unexpectedly\n%s", out)
-				return
-			}
-		} else {
-			if err != nil {
-				t.err = err
-				return
-			}
-		}
-		t.err = t.errorCheck(string(out), false, tfile, "tmp__.go")
-		return
-	}
-}
-
-var execCmd []string
-
-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
-}
-
-func (t *test) String() string {
-	return filepath.Join(t.dir, t.gofile)
-}
-
-func (t *test) makeTempDir() {
-	var err error
-	t.tempDir, err = ioutil.TempDir("", "")
-	if err != nil {
-		log.Fatal(err)
-	}
-	if *keep {
-		log.Printf("Temporary directory is %s", t.tempDir)
-	}
-	err = os.Mkdir(filepath.Join(t.tempDir, "test"), 0o755)
-	if err != nil {
-		log.Fatal(err)
-	}
-}
-
-// checkExpectedOutput compares the output from compiling and/or running with the contents
-// of the corresponding reference output file, if any (replace ".go" with ".out").
-// If they don't match, fail with an informative message.
-func (t *test) checkExpectedOutput(gotBytes []byte) {
-	got := string(gotBytes)
-	filename := filepath.Join(t.dir, t.gofile)
-	filename = filename[:len(filename)-len(".go")]
-	filename += ".out"
-	b, err := ioutil.ReadFile(filename)
-	// File is allowed to be missing (err != nil) in which case output should be empty.
-	got = strings.Replace(got, "\r\n", "\n", -1)
-	if got != string(b) {
-		if err == nil {
-			t.err = fmt.Errorf("output does not match expected in %s. Instead saw\n%s", filename, got)
-		} else {
-			t.err = fmt.Errorf("output should be empty when (optional) expected-output file %s is not present. Instead saw\n%s", filename, got)
-		}
-	}
-}
-
-func splitOutput(out string, wantAuto bool) []string {
-	// gc error messages continue onto additional lines with leading tabs.
-	// Split the output at the beginning of each line that doesn't begin with a tab.
-	// <autogenerated> lines are impossible to match so those are filtered out.
-	var res []string
-	for _, line := range strings.Split(out, "\n") {
-		if strings.HasSuffix(line, "\r") { // remove '\r', output by compiler on windows
-			line = line[:len(line)-1]
-		}
-		if strings.HasPrefix(line, "\t") {
-			res[len(res)-1] += "\n" + line
-		} else if strings.HasPrefix(line, "go tool") || strings.HasPrefix(line, "#") || !wantAuto && strings.HasPrefix(line, "<autogenerated>") {
-			continue
-		} else if strings.TrimSpace(line) != "" {
-			res = append(res, line)
-		}
-	}
-	return res
-}
-
-// errorCheck matches errors in outStr against comments in source files.
-// For each line of the source files which should generate an error,
-// there should be a comment of the form // ERROR "regexp".
-// If outStr has an error for a line which has no such comment,
-// this function will report an error.
-// Likewise if outStr does not have an error for a line which has a comment,
-// or if the error message does not match the <regexp>.
-// The <regexp> syntax is Perl but it's best to stick to egrep.
-//
-// Sources files are supplied as fullshort slice.
-// It consists of pairs: full path to source file and its base name.
-func (t *test) errorCheck(outStr string, wantAuto bool, fullshort ...string) (err error) {
-	defer func() {
-		if *verbose && err != nil {
-			log.Printf("%s gc output:\n%s", t, outStr)
-		}
-	}()
-	var errs []error
-	out := splitOutput(outStr, wantAuto)
-
-	// Cut directory name.
-	for i := range out {
-		for j := 0; j < len(fullshort); j += 2 {
-			full, short := fullshort[j], fullshort[j+1]
-			out[i] = strings.Replace(out[i], full, short, -1)
-		}
-	}
-
-	var want []wantedError
-	for j := 0; j < len(fullshort); j += 2 {
-		full, short := fullshort[j], fullshort[j+1]
-		want = append(want, t.wantedErrors(full, short)...)
-	}
-
-	for _, we := range want {
-		var errmsgs []string
-		if we.auto {
-			errmsgs, out = partitionStrings("<autogenerated>", out)
-		} else {
-			errmsgs, out = partitionStrings(we.prefix, out)
-		}
-		if len(errmsgs) == 0 {
-			errs = append(errs, fmt.Errorf("%s:%d: missing error %q", we.file, we.lineNum, we.reStr))
-			continue
-		}
-		matched := false
-		n := len(out)
-		for _, errmsg := range errmsgs {
-			// Assume errmsg says "file:line: foo".
-			// Cut leading "file:line: " to avoid accidental matching of file name instead of message.
-			text := errmsg
-			if _, suffix, ok := strings.Cut(text, " "); ok {
-				text = suffix
-			}
-			if we.re.MatchString(text) {
-				matched = true
-			} else {
-				out = append(out, errmsg)
-			}
-		}
-		if !matched {
-			errs = append(errs, fmt.Errorf("%s:%d: no match for %#q in:\n\t%s", we.file, we.lineNum, we.reStr, strings.Join(out[n:], "\n\t")))
-			continue
-		}
-	}
-
-	if len(out) > 0 {
-		errs = append(errs, fmt.Errorf("Unmatched Errors:"))
-		for _, errLine := range out {
-			errs = append(errs, fmt.Errorf("%s", errLine))
-		}
-	}
-
-	if len(errs) == 0 {
-		return nil
-	}
-	if len(errs) == 1 {
-		return errs[0]
-	}
-	var buf bytes.Buffer
-	fmt.Fprintf(&buf, "\n")
-	for _, err := range errs {
-		fmt.Fprintf(&buf, "%s\n", err.Error())
-	}
-	return errors.New(buf.String())
-}
-
-func (t *test) updateErrors(out, file string) {
-	base := path.Base(file)
-	// Read in source file.
-	src, err := ioutil.ReadFile(file)
-	if err != nil {
-		fmt.Fprintln(os.Stderr, err)
-		return
-	}
-	lines := strings.Split(string(src), "\n")
-	// Remove old errors.
-	for i := range lines {
-		lines[i], _, _ = strings.Cut(lines[i], " // ERROR ")
-	}
-	// Parse new errors.
-	errors := make(map[int]map[string]bool)
-	tmpRe := regexp.MustCompile(`autotmp_\d+`)
-	for _, errStr := range splitOutput(out, false) {
-		errFile, rest, ok := strings.Cut(errStr, ":")
-		if !ok || errFile != file {
-			continue
-		}
-		lineStr, msg, ok := strings.Cut(rest, ":")
-		if !ok {
-			continue
-		}
-		line, err := strconv.Atoi(lineStr)
-		line--
-		if err != nil || line < 0 || line >= len(lines) {
-			continue
-		}
-		msg = strings.Replace(msg, file, base, -1) // normalize file mentions in error itself
-		msg = strings.TrimLeft(msg, " \t")
-		for _, r := range []string{`\`, `*`, `+`, `?`, `[`, `]`, `(`, `)`} {
-			msg = strings.Replace(msg, r, `\`+r, -1)
-		}
-		msg = strings.Replace(msg, `"`, `.`, -1)
-		msg = tmpRe.ReplaceAllLiteralString(msg, `autotmp_[0-9]+`)
-		if errors[line] == nil {
-			errors[line] = make(map[string]bool)
-		}
-		errors[line][msg] = true
-	}
-	// Add new errors.
-	for line, errs := range errors {
-		var sorted []string
-		for e := range errs {
-			sorted = append(sorted, e)
-		}
-		sort.Strings(sorted)
-		lines[line] += " // ERROR"
-		for _, e := range sorted {
-			lines[line] += fmt.Sprintf(` "%s$"`, e)
-		}
-	}
-	// Write new file.
-	err = ioutil.WriteFile(file, []byte(strings.Join(lines, "\n")), 0640)
-	if err != nil {
-		fmt.Fprintln(os.Stderr, err)
-		return
-	}
-	// Polish.
-	exec.Command(goTool(), "fmt", file).CombinedOutput()
-}
-
-// matchPrefix reports whether s is of the form ^(.*/)?prefix(:|[),
-// That is, it needs the file name prefix followed by a : or a [,
-// and possibly preceded by a directory name.
-func matchPrefix(s, prefix string) bool {
-	i := strings.Index(s, ":")
-	if i < 0 {
-		return false
-	}
-	j := strings.LastIndex(s[:i], "/")
-	s = s[j+1:]
-	if len(s) <= len(prefix) || s[:len(prefix)] != prefix {
-		return false
-	}
-	switch s[len(prefix)] {
-	case '[', ':':
-		return true
-	}
-	return false
-}
-
-func partitionStrings(prefix string, strs []string) (matched, unmatched []string) {
-	for _, s := range strs {
-		if matchPrefix(s, prefix) {
-			matched = append(matched, s)
-		} else {
-			unmatched = append(unmatched, s)
-		}
-	}
-	return
-}
-
-type wantedError struct {
-	reStr   string
-	re      *regexp.Regexp
-	lineNum int
-	auto    bool // match <autogenerated> line
-	file    string
-	prefix  string
-}
-
-var (
-	errRx       = regexp.MustCompile(`// (?:GC_)?ERROR (.*)`)
-	errAutoRx   = regexp.MustCompile(`// (?:GC_)?ERRORAUTO (.*)`)
-	errQuotesRx = regexp.MustCompile(`"([^"]*)"`)
-	lineRx      = regexp.MustCompile(`LINE(([+-])(\d+))?`)
-)
-
-func (t *test) wantedErrors(file, short string) (errs []wantedError) {
-	cache := make(map[string]*regexp.Regexp)
-
-	src, _ := ioutil.ReadFile(file)
-	for i, line := range strings.Split(string(src), "\n") {
-		lineNum := i + 1
-		if strings.Contains(line, "////") {
-			// double comment disables ERROR
-			continue
-		}
-		var auto bool
-		m := errAutoRx.FindStringSubmatch(line)
-		if m != nil {
-			auto = true
-		} else {
-			m = errRx.FindStringSubmatch(line)
-		}
-		if m == nil {
-			continue
-		}
-		all := m[1]
-		mm := errQuotesRx.FindAllStringSubmatch(all, -1)
-		if mm == nil {
-			log.Fatalf("%s:%d: invalid errchk line: %s", t.goFileName(), lineNum, line)
-		}
-		for _, m := range mm {
-			rx := lineRx.ReplaceAllStringFunc(m[1], func(m string) string {
-				n := lineNum
-				if strings.HasPrefix(m, "LINE+") {
-					delta, _ := strconv.Atoi(m[5:])
-					n += delta
-				} else if strings.HasPrefix(m, "LINE-") {
-					delta, _ := strconv.Atoi(m[5:])
-					n -= delta
-				}
-				return fmt.Sprintf("%s:%d", short, n)
-			})
-			re := cache[rx]
-			if re == nil {
-				var err error
-				re, err = regexp.Compile(rx)
-				if err != nil {
-					log.Fatalf("%s:%d: invalid regexp \"%s\" in ERROR line: %v", t.goFileName(), lineNum, rx, err)
-				}
-				cache[rx] = re
-			}
-			prefix := fmt.Sprintf("%s:%d", short, lineNum)
-			errs = append(errs, wantedError{
-				reStr:   rx,
-				re:      re,
-				prefix:  prefix,
-				auto:    auto,
-				lineNum: lineNum,
-				file:    short,
-			})
-		}
-	}
-
-	return
-}
-
-const (
-	// Regexp to match a single opcode check: optionally begin with "-" (to indicate
-	// a negative check), followed by a string literal enclosed in "" or ``. For "",
-	// backslashes must be handled.
-	reMatchCheck = `-?(?:\x60[^\x60]*\x60|"(?:[^"\\]|\\.)*")`
-)
-
-var (
-	// Regexp to split a line in code and comment, trimming spaces
-	rxAsmComment = regexp.MustCompile(`^\s*(.*?)\s*(?://\s*(.+)\s*)?$`)
-
-	// Regexp to extract an architecture check: architecture name (or triplet),
-	// followed by semi-colon, followed by a comma-separated list of opcode checks.
-	// Extraneous spaces are ignored.
-	rxAsmPlatform = regexp.MustCompile(`(\w+)(/\w+)?(/\w*)?\s*:\s*(` + reMatchCheck + `(?:\s*,\s*` + reMatchCheck + `)*)`)
-
-	// Regexp to extract a single opcoded check
-	rxAsmCheck = regexp.MustCompile(reMatchCheck)
-
-	// List of all architecture variants. Key is the GOARCH architecture,
-	// value[0] is the variant-changing environment variable, and values[1:]
-	// are the supported variants.
-	archVariants = map[string][]string{
-		"386":     {"GO386", "sse2", "softfloat"},
-		"amd64":   {"GOAMD64", "v1", "v2", "v3", "v4"},
-		"arm":     {"GOARM", "5", "6", "7"},
-		"arm64":   {},
-		"loong64": {},
-		"mips":    {"GOMIPS", "hardfloat", "softfloat"},
-		"mips64":  {"GOMIPS64", "hardfloat", "softfloat"},
-		"ppc64":   {"GOPPC64", "power8", "power9"},
-		"ppc64le": {"GOPPC64", "power8", "power9"},
-		"s390x":   {},
-		"wasm":    {},
-		"riscv64": {},
-	}
-)
-
-// wantedAsmOpcode is a single asmcheck check
-type wantedAsmOpcode struct {
-	fileline string         // original source file/line (eg: "/path/foo.go:45")
-	line     int            // original source line
-	opcode   *regexp.Regexp // opcode check to be performed on assembly output
-	negative bool           // true if the check is supposed to fail rather than pass
-	found    bool           // true if the opcode check matched at least one in the output
-}
-
-// A build environment triplet separated by slashes (eg: linux/386/sse2).
-// The third field can be empty if the arch does not support variants (eg: "plan9/amd64/")
-type buildEnv string
-
-// Environ returns the environment it represents in cmd.Environ() "key=val" format
-// For instance, "linux/386/sse2".Environ() returns {"GOOS=linux", "GOARCH=386", "GO386=sse2"}
-func (b buildEnv) Environ() []string {
-	fields := strings.Split(string(b), "/")
-	if len(fields) != 3 {
-		panic("invalid buildEnv string: " + string(b))
-	}
-	env := []string{"GOOS=" + fields[0], "GOARCH=" + fields[1]}
-	if fields[2] != "" {
-		env = append(env, archVariants[fields[1]][0]+"="+fields[2])
-	}
-	return env
-}
-
-// asmChecks represents all the asmcheck checks present in a test file
-// The outer map key is the build triplet in which the checks must be performed.
-// The inner map key represent the source file line ("filename.go:1234") at which the
-// checks must be performed.
-type asmChecks map[buildEnv]map[string][]wantedAsmOpcode
-
-// Envs returns all the buildEnv in which at least one check is present
-func (a asmChecks) Envs() []buildEnv {
-	var envs []buildEnv
-	for e := range a {
-		envs = append(envs, e)
-	}
-	sort.Slice(envs, func(i, j int) bool {
-		return string(envs[i]) < string(envs[j])
-	})
-	return envs
-}
-
-func (t *test) wantedAsmOpcodes(fn string) asmChecks {
-	ops := make(asmChecks)
-
-	comment := ""
-	src, _ := ioutil.ReadFile(fn)
-	for i, line := range strings.Split(string(src), "\n") {
-		matches := rxAsmComment.FindStringSubmatch(line)
-		code, cmt := matches[1], matches[2]
-
-		// Keep comments pending in the comment variable until
-		// we find a line that contains some code.
-		comment += " " + cmt
-		if code == "" {
-			continue
-		}
-
-		// Parse and extract any architecture check from comments,
-		// made by one architecture name and multiple checks.
-		lnum := fn + ":" + strconv.Itoa(i+1)
-		for _, ac := range rxAsmPlatform.FindAllStringSubmatch(comment, -1) {
-			archspec, allchecks := ac[1:4], ac[4]
-
-			var arch, subarch, os string
-			switch {
-			case archspec[2] != "": // 3 components: "linux/386/sse2"
-				os, arch, subarch = archspec[0], archspec[1][1:], archspec[2][1:]
-			case archspec[1] != "": // 2 components: "386/sse2"
-				os, arch, subarch = "linux", archspec[0], archspec[1][1:]
-			default: // 1 component: "386"
-				os, arch, subarch = "linux", archspec[0], ""
-				if arch == "wasm" {
-					os = "js"
-				}
-			}
-
-			if _, ok := archVariants[arch]; !ok {
-				log.Fatalf("%s:%d: unsupported architecture: %v", t.goFileName(), i+1, arch)
-			}
-
-			// Create the build environments corresponding the above specifiers
-			envs := make([]buildEnv, 0, 4)
-			if subarch != "" {
-				envs = append(envs, buildEnv(os+"/"+arch+"/"+subarch))
-			} else {
-				subarchs := archVariants[arch]
-				if len(subarchs) == 0 {
-					envs = append(envs, buildEnv(os+"/"+arch+"/"))
-				} else {
-					for _, sa := range archVariants[arch][1:] {
-						envs = append(envs, buildEnv(os+"/"+arch+"/"+sa))
-					}
-				}
-			}
-
-			for _, m := range rxAsmCheck.FindAllString(allchecks, -1) {
-				negative := false
-				if m[0] == '-' {
-					negative = true
-					m = m[1:]
-				}
-
-				rxsrc, err := strconv.Unquote(m)
-				if err != nil {
-					log.Fatalf("%s:%d: error unquoting string: %v", t.goFileName(), i+1, err)
-				}
-
-				// Compile the checks as regular expressions. Notice that we
-				// consider checks as matching from the beginning of the actual
-				// assembler source (that is, what is left on each line of the
-				// compile -S output after we strip file/line info) to avoid
-				// trivial bugs such as "ADD" matching "FADD". This
-				// doesn't remove genericity: it's still possible to write
-				// something like "F?ADD", but we make common cases simpler
-				// to get right.
-				oprx, err := regexp.Compile("^" + rxsrc)
-				if err != nil {
-					log.Fatalf("%s:%d: %v", t.goFileName(), i+1, err)
-				}
-
-				for _, env := range envs {
-					if ops[env] == nil {
-						ops[env] = make(map[string][]wantedAsmOpcode)
-					}
-					ops[env][lnum] = append(ops[env][lnum], wantedAsmOpcode{
-						negative: negative,
-						fileline: lnum,
-						line:     i + 1,
-						opcode:   oprx,
-					})
-				}
-			}
-		}
-		comment = ""
-	}
-
-	return ops
-}
-
-func (t *test) asmCheck(outStr string, fn string, env buildEnv, fullops map[string][]wantedAsmOpcode) (err error) {
-	// The assembly output contains the concatenated dump of multiple functions.
-	// the first line of each function begins at column 0, while the rest is
-	// indented by a tabulation. These data structures help us index the
-	// output by function.
-	functionMarkers := make([]int, 1)
-	lineFuncMap := make(map[string]int)
-
-	lines := strings.Split(outStr, "\n")
-	rxLine := regexp.MustCompile(fmt.Sprintf(`\((%s:\d+)\)\s+(.*)`, regexp.QuoteMeta(fn)))
-
-	for nl, line := range lines {
-		// Check if this line begins a function
-		if len(line) > 0 && line[0] != '\t' {
-			functionMarkers = append(functionMarkers, nl)
-		}
-
-		// Search if this line contains a assembly opcode (which is prefixed by the
-		// original source file/line in parenthesis)
-		matches := rxLine.FindStringSubmatch(line)
-		if len(matches) == 0 {
-			continue
-		}
-		srcFileLine, asm := matches[1], matches[2]
-
-		// Associate the original file/line information to the current
-		// function in the output; it will be useful to dump it in case
-		// of error.
-		lineFuncMap[srcFileLine] = len(functionMarkers) - 1
-
-		// If there are opcode checks associated to this source file/line,
-		// run the checks.
-		if ops, found := fullops[srcFileLine]; found {
-			for i := range ops {
-				if !ops[i].found && ops[i].opcode.FindString(asm) != "" {
-					ops[i].found = true
-				}
-			}
-		}
-	}
-	functionMarkers = append(functionMarkers, len(lines))
-
-	var failed []wantedAsmOpcode
-	for _, ops := range fullops {
-		for _, o := range ops {
-			// There's a failure if a negative match was found,
-			// or a positive match was not found.
-			if o.negative == o.found {
-				failed = append(failed, o)
-			}
-		}
-	}
-	if len(failed) == 0 {
-		return
-	}
-
-	// At least one asmcheck failed; report them
-	sort.Slice(failed, func(i, j int) bool {
-		return failed[i].line < failed[j].line
-	})
-
-	lastFunction := -1
-	var errbuf bytes.Buffer
-	fmt.Fprintln(&errbuf)
-	for _, o := range failed {
-		// Dump the function in which this opcode check was supposed to
-		// pass but failed.
-		funcIdx := lineFuncMap[o.fileline]
-		if funcIdx != 0 && funcIdx != lastFunction {
-			funcLines := lines[functionMarkers[funcIdx]:functionMarkers[funcIdx+1]]
-			log.Println(strings.Join(funcLines, "\n"))
-			lastFunction = funcIdx // avoid printing same function twice
-		}
-
-		if o.negative {
-			fmt.Fprintf(&errbuf, "%s:%d: %s: wrong opcode found: %q\n", t.goFileName(), o.line, env, o.opcode.String())
-		} else {
-			fmt.Fprintf(&errbuf, "%s:%d: %s: opcode not found: %q\n", t.goFileName(), o.line, env, o.opcode.String())
-		}
-	}
-	err = errors.New(errbuf.String())
-	return
-}
-
-// defaultRunOutputLimit returns the number of runoutput tests that
-// can be executed in parallel.
-func defaultRunOutputLimit() int {
-	const maxArmCPU = 2
-
-	cpu := runtime.NumCPU()
-	if runtime.GOARCH == "arm" && cpu > maxArmCPU {
-		cpu = maxArmCPU
-	}
-	return cpu
-}
-
-// checkShouldTest runs sanity checks on the shouldTest function.
-func checkShouldTest() {
-	assert := func(ok bool, _ string) {
-		if !ok {
-			panic("fail")
-		}
-	}
-	assertNot := func(ok bool, _ string) { assert(!ok, "") }
-
-	// Simple tests.
-	assert(shouldTest("// +build linux", "linux", "arm"))
-	assert(shouldTest("// +build !windows", "linux", "arm"))
-	assertNot(shouldTest("// +build !windows", "windows", "amd64"))
-
-	// A file with no build tags will always be tested.
-	assert(shouldTest("// This is a test.", "os", "arch"))
-
-	// Build tags separated by a space are OR-ed together.
-	assertNot(shouldTest("// +build arm 386", "linux", "amd64"))
-
-	// Build tags separated by a comma are AND-ed together.
-	assertNot(shouldTest("// +build !windows,!plan9", "windows", "amd64"))
-	assertNot(shouldTest("// +build !windows,!plan9", "plan9", "386"))
-
-	// Build tags on multiple lines are AND-ed together.
-	assert(shouldTest("// +build !windows\n// +build amd64", "linux", "amd64"))
-	assertNot(shouldTest("// +build !windows\n// +build amd64", "windows", "amd64"))
-
-	// Test that (!a OR !b) matches anything.
-	assert(shouldTest("// +build !windows !plan9", "windows", "amd64"))
-}
-
-// overlayDir makes a minimal-overhead copy of srcRoot in which new files may be added.
-func overlayDir(dstRoot, srcRoot string) error {
-	dstRoot = filepath.Clean(dstRoot)
-	if err := os.MkdirAll(dstRoot, 0777); err != nil {
-		return err
-	}
-
-	srcRoot, err := filepath.Abs(srcRoot)
-	if err != nil {
-		return err
-	}
-
-	return filepath.WalkDir(srcRoot, func(srcPath string, d fs.DirEntry, err error) error {
-		if err != nil || srcPath == srcRoot {
-			return err
-		}
-
-		suffix := strings.TrimPrefix(srcPath, srcRoot)
-		for len(suffix) > 0 && suffix[0] == filepath.Separator {
-			suffix = suffix[1:]
-		}
-		dstPath := filepath.Join(dstRoot, suffix)
-
-		var info fs.FileInfo
-		if d.Type()&os.ModeSymlink != 0 {
-			info, err = os.Stat(srcPath)
-		} else {
-			info, err = d.Info()
-		}
-		if err != nil {
-			return err
-		}
-		perm := info.Mode() & os.ModePerm
-
-		// Always copy directories (don't symlink them).
-		// If we add a file in the overlay, we don't want to add it in the original.
-		if info.IsDir() {
-			return os.MkdirAll(dstPath, perm|0200)
-		}
-
-		// If the OS supports symlinks, use them instead of copying bytes.
-		if err := os.Symlink(srcPath, dstPath); err == nil {
-			return nil
-		}
-
-		// Otherwise, copy the bytes.
-		src, err := os.Open(srcPath)
-		if err != nil {
-			return err
-		}
-		defer src.Close()
-
-		dst, err := os.OpenFile(dstPath, os.O_WRONLY|os.O_CREATE|os.O_EXCL, perm)
-		if err != nil {
-			return err
-		}
-
-		_, err = io.Copy(dst, src)
-		if closeErr := dst.Close(); err == nil {
-			err = closeErr
-		}
-		return err
-	})
-}
-
-// The following sets of files are excluded from testing depending on configuration.
-// The types2Failures(32Bit) files pass with the 1.17 compiler but don't pass with
-// the 1.18 compiler using the new types2 type checker, or pass with sub-optimal
-// error(s).
-
-// List of files that the compiler cannot errorcheck with the new typechecker (types2).
-var types2Failures = setOf(
-	"shift1.go",               // types2 reports two new errors which are probably not right
-	"fixedbugs/issue10700.go", // types2 should give hint about ptr to interface
-	"fixedbugs/issue18331.go", // missing error about misuse of //go:noescape (irgen needs code from noder)
-	"fixedbugs/issue18419.go", // types2 reports no field or method member, but should say unexported
-	"fixedbugs/issue20233.go", // types2 reports two instead of one error (preference: 1.17 compiler)
-	"fixedbugs/issue20245.go", // types2 reports two instead of one error (preference: 1.17 compiler)
-	"fixedbugs/issue31053.go", // types2 reports "unknown field" instead of "cannot refer to unexported field"
-	"fixedbugs/notinheap.go",  // types2 doesn't report errors about conversions that are invalid due to //go:notinheap
-)
-
-var types2Failures32Bit = setOf(
-	"printbig.go",             // large untyped int passed to print (32-bit)
-	"fixedbugs/bug114.go",     // large untyped int passed to println (32-bit)
-	"fixedbugs/issue23305.go", // large untyped int passed to println (32-bit)
-)
-
-var go118Failures = setOf(
-	"fixedbugs/issue54343.go",  // 1.18 compiler assigns receiver parameter to global variable
-	"fixedbugs/issue56280.go",  // 1.18 compiler doesn't support inlining generic functions
-	"typeparam/nested.go",      // 1.18 compiler doesn't support function-local types with generics
-	"typeparam/issue47631.go",  // 1.18 can not handle local type declarations
-	"typeparam/issue51521.go",  // 1.18 compiler produces bad panic message and link error
-	"typeparam/issue54456.go",  // 1.18 compiler fails to distinguish local generic types
-	"typeparam/issue54497.go",  // 1.18 compiler is more conservative about inlining due to repeated issues
-	"typeparam/issue55101.go",  // 1.18 compiler ICEs writing export data
-	"typeparam/mdempsky/16.go", // 1.18 compiler uses interface shape type in failed type assertions
-	"typeparam/mdempsky/17.go", // 1.18 compiler mishandles implicit conversions from range loops
-	"typeparam/mdempsky/18.go", // 1.18 compiler mishandles implicit conversions in select statements
-	"typeparam/mdempsky/20.go", // 1.18 compiler crashes on method expressions promoted to derived types
-)
-
-// In all of these cases, the 1.17 compiler reports reasonable errors, but either the
-// 1.17 or 1.18 compiler report extra errors, so we can't match correctly on both. We
-// now set the patterns to match correctly on all the 1.18 errors.
-// This list remains here just as a reference and for comparison - these files all pass.
-var _ = setOf(
-	"import1.go",      // types2 reports extra errors
-	"initializerr.go", // types2 reports extra error
-	"typecheck.go",    // types2 reports extra error at function call
-
-	"fixedbugs/bug176.go", // types2 reports all errors (pref: types2)
-	"fixedbugs/bug195.go", // types2 reports slight different errors, and an extra error
-	"fixedbugs/bug412.go", // types2 produces a follow-on error
-
-	"fixedbugs/issue11614.go", // types2 reports an extra error
-	"fixedbugs/issue17038.go", // types2 doesn't report a follow-on error (pref: types2)
-	"fixedbugs/issue23732.go", // types2 reports different (but ok) line numbers
-	"fixedbugs/issue4510.go",  // types2 reports different (but ok) line numbers
-	"fixedbugs/issue7525b.go", // types2 reports init cycle error on different line - ok otherwise
-	"fixedbugs/issue7525c.go", // types2 reports init cycle error on different line - ok otherwise
-	"fixedbugs/issue7525d.go", // types2 reports init cycle error on different line - ok otherwise
-	"fixedbugs/issue7525e.go", // types2 reports init cycle error on different line - ok otherwise
-	"fixedbugs/issue7525.go",  // types2 reports init cycle error on different line - ok otherwise
-)
-
-func setOf(keys ...string) map[string]bool {
-	m := make(map[string]bool, len(keys))
-	for _, key := range keys {
-		m[key] = true
-	}
-	return m
-}
-
-// 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"`}
-//
-// [copied from src/go/build/build.go]
-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
-}
diff --git a/test/sigchld.go b/test/sigchld.go
index 3b49606..fc6cf91 100644
--- a/test/sigchld.go
+++ b/test/sigchld.go
@@ -1,4 +1,4 @@
-// +build !plan9,!windows
+// +build !plan9,!windows,!wasip1
 // run
 
 // Copyright 2009 The Go Authors. All rights reserved.
diff --git a/test/tighten.go b/test/tighten.go
new file mode 100644
index 0000000..92ed249
--- /dev/null
+++ b/test/tighten.go
@@ -0,0 +1,22 @@
+// errorcheck -0 -d=ssa/tighten/debug=1
+
+//go:build arm64
+
+// Copyright 2023 The Go Authors. 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 (
+	e  any
+	ts uint16
+)
+
+func moveValuesWithMemoryArg(len int) {
+	for n := 0; n < len; n++ {
+		// Load of e.data is lowed as a MOVDload op, which has a memory
+		// argument. It's moved near where it's used.
+		_ = e != ts // ERROR "MOVDload is moved$" "MOVDaddr is moved$"
+	}
+}
diff --git a/test/typeparam/devirtualize1.go b/test/typeparam/devirtualize1.go
new file mode 100644
index 0000000..fb26225
--- /dev/null
+++ b/test/typeparam/devirtualize1.go
@@ -0,0 +1,22 @@
+// run
+
+// Copyright 2023 The Go Authors. 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 S struct {
+	x int
+}
+
+func (t *S) M1() {
+}
+
+func F[T any](x T) any {
+	return x
+}
+
+func main() {
+	F(&S{}).(interface{ M1() }).M1()
+}
diff --git a/test/typeparam/devirtualize2.go b/test/typeparam/devirtualize2.go
new file mode 100644
index 0000000..ca6dc8f
--- /dev/null
+++ b/test/typeparam/devirtualize2.go
@@ -0,0 +1,28 @@
+// run
+
+// Copyright 2023 The Go Authors. 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 S struct {
+	x int
+}
+
+func (t *S) M1() {
+}
+func (t *S) M2() {
+}
+
+type I interface {
+	M1()
+}
+
+func F[T I](x T) I {
+	return x
+}
+
+func main() {
+	F(&S{}).(interface{ M2() }).M2()
+}
diff --git a/test/typeparam/issue52124.go b/test/typeparam/issue52124.go
index 07cba47..802d103 100644
--- a/test/typeparam/issue52124.go
+++ b/test/typeparam/issue52124.go
@@ -7,11 +7,15 @@
 package p
 
 type Any any
+type IntOrBool interface{ int | bool }
 
-type I interface{ Any | int }
+type I interface{ Any | IntOrBool }
 
 var (
 	X I = 42
 	Y I = "xxx"
 	Z I = true
 )
+
+type A interface{ *B | int }
+type B interface{ A | any }
diff --git a/test/typeparam/issue53087.go b/test/typeparam/issue53087.go
new file mode 100644
index 0000000..5e19c59
--- /dev/null
+++ b/test/typeparam/issue53087.go
@@ -0,0 +1,56 @@
+// run
+
+// Copyright 2022 The Go Authors. 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"
+
+type I interface {
+	M()
+}
+
+type S struct {
+	str string
+}
+
+func (s *S) M() {}
+
+var _ I = &S{}
+
+type CloningMap[K comparable, V any] struct {
+	inner map[K]V
+}
+
+func (cm CloningMap[K, V]) With(key K, value V) CloningMap[K, V] {
+	result := CloneBad(cm.inner)
+	result[key] = value
+	return CloningMap[K, V]{result}
+}
+
+func CloneBad[M ~map[K]V, K comparable, V any](m M) M {
+	r := make(M, len(m))
+	for k, v := range m {
+		r[k] = v
+	}
+	return r
+}
+
+func main() {
+	s1 := &S{"one"}
+	s2 := &S{"two"}
+
+	m := CloningMap[string, I]{inner: make(map[string]I)}
+	m = m.With("a", s1)
+	m = m.With("b", s2)
+
+	it, found := m.inner["a"]
+	if !found {
+		panic("a not found")
+	}
+	if _, ok := it.(*S); !ok {
+		panic(fmt.Sprintf("got %T want *main.S", it))
+	}
+}
diff --git a/test/typeparam/issue53762.go b/test/typeparam/issue53762.go
index 4d95988..e6d7f0f 100644
--- a/test/typeparam/issue53762.go
+++ b/test/typeparam/issue53762.go
@@ -14,5 +14,5 @@
 }
 
 func main() {
-	use(Value[int](1))
+	use[int](Value[int](1))
 }
diff --git a/test/zerosize.go b/test/zerosize.go
new file mode 100644
index 0000000..53a29f7
--- /dev/null
+++ b/test/zerosize.go
@@ -0,0 +1,33 @@
+// run
+
+// Copyright 2023 The Go 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 zero-sized variables get same address as
+// runtime.zerobase.
+
+package main
+
+var x, y [0]int
+var p, q = new([0]int), new([0]int) // should get &runtime.zerobase
+
+func main() {
+	if &x != &y {
+		// Failing for now. x and y are at same address, but compiler optimizes &x==&y to false. Skip.
+		// print("&x=", &x, " &y=", &y, " &x==&y = ", &x==&y, "\n")
+		// panic("FAIL")
+	}
+	if p != q {
+		print("p=", p, " q=", q, " p==q = ", p==q, "\n")
+		panic("FAIL")
+	}
+	if &x != p {
+		print("&x=", &x, " p=", p, " &x==p = ", &x==p, "\n")
+		panic("FAIL")
+	}
+	if &y != p {
+		print("&y=", &y, " p=", p, " &y==p = ", &y==p, "\n")
+		panic("FAIL")
+	}
+}